ZGlmZiAtLWdpdCBhLy5tYWlsbWFwIGIvLm1haWxtYXAKaW5kZXggMGQ5NzFjZi4uNjI4NzAwNCAxMDA2NDQKLS0tIGEvLm1haWxtYXAKKysrIGIvLm1haWxtYXAKQEAgLTEwMCw2ICsxMDAsNyBAQAogUmFsZiBCYWVjaGxlIDxyYWxmQGxpbnV4LW1pcHMub3JnPgogUmFsZiBXaWxkZW5odWVzIDxSYWxmLldpbGRlbmh1ZXNAZ214LmRlPgogUsOpbWkgRGVuaXMtQ291cm1vbnQgPHJkZW5pc0BzaW1waGFsZW1waW4uY29tPgorUmljYXJkbyBSaWJhbGRhIERlbGdhZG8gPHJpY2FyZG8ucmliYWxkYUBnbWFpbC5jb20+CiBSdWRvbGYgTWFyZWsgPFIuTWFyZWtAc2guY3Z1dC5jej4KIFJ1aSBTYXJhaXZhIDxybXBzQGpvZWwuaXN0LnV0bC5wdD4KIFNhY2hpbiBQIFNhbnQgPHNzYW50QGluLmlibS5jb20+CmRpZmYgLS1naXQgYS9DUkVESVRTIGIvQ1JFRElUUwppbmRleCA5NjkzNWRmLi4yZWY1ZGNlIDEwMDY0NAotLS0gYS9DUkVESVRTCisrKyBiL0NSRURJVFMKQEAgLTE4Nyw2ICsxODcsMTAgQEAKIEU6IGJhbGFzdWJAY2lzLm9oaW8tc3RhdGUuZWR1CiBEOiBXcm90ZSBTWVMgViBJUEMgKHBhcnQgb2Ygc3RhbmRhcmQga2VybmVsIHNpbmNlIDAuOTkuMTApCiAKK046IENocmlzIEJhbGwKK0U6IGNocmlzQHByaW50Zi5uZXQKK0Q6IEZvcm1lciBtYWludGFpbmVyIG9mIHRoZSBNTUMvU0QvU0RJTyBzdWJzeXN0ZW0uCisKIE46IERhcmlvIEJhbGxhYmlvCiBFOiBiYWxsYWJpb19kYXJpb0BlbWMuY29tCiBFOiBkYXJpby5iYWxsYWJpb0B0aXNjYWxpbmV0Lml0CkBAIC01MDQsNiArNTA4LDEwIEBACiBXOiBodHRwOi8vcGF1bGJyaXN0b3cubmV0L2xpbnV4L2lkZWZsb3BweS5odG1sCiBEOiBNYWludGFpbmVyIG9mIElERS9BVEFQSSBmbG9wcHkgZHJpdmVyCiAKK046IFN0ZWZhbm8gQnJpdmlvCitFOiBzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQKK0Q6IEJyb2FkY29tIEI0MyBkcml2ZXIKKwogTjogRG9taW5payBCcm9kb3dza2kKIEU6IGxpbnV4QGJyb2RvLmRlCiBXOiBodHRwOi8vd3d3LmJyb2RvLmRlLwpAQCAtMzAwNCw2ICszMDEyLDE5IEBACiBEOiBHZW5lcmljIFo4NTMwIGRyaXZlciwgQVguMjUgREFNQSBzbGF2ZSBpbXBsZW1lbnRhdGlvbgogRDogU2V2ZXJhbCBBWC4yNSBoYWNrcwogCitOOiBSaWNhcmRvIFJpYmFsZGEgRGVsZ2FkbworRTogcmljYXJkby5yaWJhbGRhQGdtYWlsLmNvbQorVzogaHR0cDovL3JpYmFsZGEuY29tCitEOiBQTFggVVNCMzM4eCBkcml2ZXIKK0Q6IFBDQTk2MzQgZHJpdmVyCitEOiBPcHRpb24gR1RNNjcxV0ZTCitEOiBGaW50ZWsgRjgxMjE2QQorRDogVmFyaW91cyBrZXJuZWwgaGFja3MKK1M6IFF0ZWNobm9sb2d5IEEvUworUzogVmFsYnkgTGFuZ2dhZGUgMTQyCitTOiAyNTAwIFZhbGJ5CitTOiBEZW5tYXJrCisKIE46IEZyYW5jb2lzLVJlbmUgUmlkZWF1CiBFOiBmYXJlQHR1bmVzLm9yZwogVzogaHR0cDovL3d3dy50dW5lcy5vcmcvfmZhcmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL29ic29sZXRlL3N5c2ZzLWJsb2NrLXpyYW0gYi9Eb2N1bWVudGF0aW9uL0FCSS9vYnNvbGV0ZS9zeXNmcy1ibG9jay16cmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMGVhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS9vYnNvbGV0ZS9zeXNmcy1ibG9jay16cmFtCkBAIC0wLDAgKzEsMTE5IEBACitXaGF0OgkJL3N5cy9ibG9jay96cmFtPGlkPi9udW1fcmVhZHMKK0RhdGU6CQlBdWd1c3QgMjAxNQorQ29udGFjdDoJU2VyZ2V5IFNlbm96aGF0c2t5IDxzZXJnZXkuc2Vub3poYXRza3lAZ21haWwuY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBudW1fcmVhZHMgZmlsZSBpcyByZWFkLW9ubHkgYW5kIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mCisJCXJlYWRzIChmYWlsZWQgb3Igc3VjY2Vzc2Z1bCkgZG9uZSBvbiB0aGlzIGRldmljZS4KKwkJTm93IGFjY2Vzc2libGUgdmlhIHpyYW08aWQ+L3N0YXQgbm9kZS4KKworV2hhdDoJCS9zeXMvYmxvY2svenJhbTxpZD4vbnVtX3dyaXRlcworRGF0ZToJCUF1Z3VzdCAyMDE1CitDb250YWN0OglTZXJnZXkgU2Vub3poYXRza3kgPHNlcmdleS5zZW5vemhhdHNreUBnbWFpbC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIG51bV93cml0ZXMgZmlsZSBpcyByZWFkLW9ubHkgYW5kIHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mCisJCXdyaXRlcyAoZmFpbGVkIG9yIHN1Y2Nlc3NmdWwpIGRvbmUgb24gdGhpcyBkZXZpY2UuCisJCU5vdyBhY2Nlc3NpYmxlIHZpYSB6cmFtPGlkPi9zdGF0IG5vZGUuCisKK1doYXQ6CQkvc3lzL2Jsb2NrL3pyYW08aWQ+L2ludmFsaWRfaW8KK0RhdGU6CQlBdWd1c3QgMjAxNQorQ29udGFjdDoJU2VyZ2V5IFNlbm96aGF0c2t5IDxzZXJnZXkuc2Vub3poYXRza3lAZ21haWwuY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBpbnZhbGlkX2lvIGZpbGUgaXMgcmVhZC1vbmx5IGFuZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgorCQlub24tcGFnZS1zaXplLWFsaWduZWQgSS9PIHJlcXVlc3RzIGlzc3VlZCB0byB0aGlzIGRldmljZS4KKwkJTm93IGFjY2Vzc2libGUgdmlhIHpyYW08aWQ+L2lvX3N0YXQgbm9kZS4KKworV2hhdDoJCS9zeXMvYmxvY2svenJhbTxpZD4vZmFpbGVkX3JlYWRzCitEYXRlOgkJQXVndXN0IDIwMTUKK0NvbnRhY3Q6CVNlcmdleSBTZW5vemhhdHNreSA8c2VyZ2V5LnNlbm96aGF0c2t5QGdtYWlsLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgZmFpbGVkX3JlYWRzIGZpbGUgaXMgcmVhZC1vbmx5IGFuZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgorCQlmYWlsZWQgcmVhZHMgaGFwcGVuZWQgb24gdGhpcyBkZXZpY2UuCisJCU5vdyBhY2Nlc3NpYmxlIHZpYSB6cmFtPGlkPi9pb19zdGF0IG5vZGUuCisKK1doYXQ6CQkvc3lzL2Jsb2NrL3pyYW08aWQ+L2ZhaWxlZF93cml0ZXMKK0RhdGU6CQlBdWd1c3QgMjAxNQorQ29udGFjdDoJU2VyZ2V5IFNlbm96aGF0c2t5IDxzZXJnZXkuc2Vub3poYXRza3lAZ21haWwuY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBmYWlsZWRfd3JpdGVzIGZpbGUgaXMgcmVhZC1vbmx5IGFuZCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZgorCQlmYWlsZWQgd3JpdGVzIGhhcHBlbmVkIG9uIHRoaXMgZGV2aWNlLgorCQlOb3cgYWNjZXNzaWJsZSB2aWEgenJhbTxpZD4vaW9fc3RhdCBub2RlLgorCitXaGF0OgkJL3N5cy9ibG9jay96cmFtPGlkPi9ub3RpZnlfZnJlZQorRGF0ZToJCUF1Z3VzdCAyMDE1CitDb250YWN0OglTZXJnZXkgU2Vub3poYXRza3kgPHNlcmdleS5zZW5vemhhdHNreUBnbWFpbC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIG5vdGlmeV9mcmVlIGZpbGUgaXMgcmVhZC1vbmx5LiBEZXBlbmRpbmcgb24gZGV2aWNlIHVzYWdlCisJCXNjZW5hcmlvIGl0IG1heSBhY2NvdW50IGEpIHRoZSBudW1iZXIgb2YgcGFnZXMgZnJlZWQgYmVjYXVzZQorCQlvZiBzd2FwIHNsb3QgZnJlZSBub3RpZmljYXRpb25zIG9yIGIpIHRoZSBudW1iZXIgb2YgcGFnZXMgZnJlZWQKKwkJYmVjYXVzZSBvZiBSRVFfRElTQ0FSRCByZXF1ZXN0cyBzZW50IGJ5IGJpby4gVGhlIGZvcm1lciBvbmVzCisJCWFyZSBzZW50IHRvIGEgc3dhcCBibG9jayBkZXZpY2Ugd2hlbiBhIHN3YXAgc2xvdCBpcyBmcmVlZCwgd2hpY2gKKwkJaW1wbGllcyB0aGF0IHRoaXMgZGlzayBpcyBiZWluZyB1c2VkIGFzIGEgc3dhcCBkaXNrLiBUaGUgbGF0dGVyCisJCW9uZXMgYXJlIHNlbnQgYnkgZmlsZXN5c3RlbSBtb3VudGVkIHdpdGggZGlzY2FyZCBvcHRpb24sCisJCXdoZW5ldmVyIHNvbWUgZGF0YSBibG9ja3MgYXJlIGdldHRpbmcgZGlzY2FyZGVkLgorCQlOb3cgYWNjZXNzaWJsZSB2aWEgenJhbTxpZD4vaW9fc3RhdCBub2RlLgorCitXaGF0OgkJL3N5cy9ibG9jay96cmFtPGlkPi96ZXJvX3BhZ2VzCitEYXRlOgkJQXVndXN0IDIwMTUKK0NvbnRhY3Q6CVNlcmdleSBTZW5vemhhdHNreSA8c2VyZ2V5LnNlbm96aGF0c2t5QGdtYWlsLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgemVyb19wYWdlcyBmaWxlIGlzIHJlYWQtb25seSBhbmQgc3BlY2lmaWVzIG51bWJlciBvZiB6ZXJvCisJCWZpbGxlZCBwYWdlcyB3cml0dGVuIHRvIHRoaXMgZGlzay4gTm8gbWVtb3J5IGlzIGFsbG9jYXRlZCBmb3IKKwkJc3VjaCBwYWdlcy4KKwkJTm93IGFjY2Vzc2libGUgdmlhIHpyYW08aWQ+L21tX3N0YXQgbm9kZS4KKworV2hhdDoJCS9zeXMvYmxvY2svenJhbTxpZD4vb3JpZ19kYXRhX3NpemUKK0RhdGU6CQlBdWd1c3QgMjAxNQorQ29udGFjdDoJU2VyZ2V5IFNlbm96aGF0c2t5IDxzZXJnZXkuc2Vub3poYXRza3lAZ21haWwuY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBvcmlnX2RhdGFfc2l6ZSBmaWxlIGlzIHJlYWQtb25seSBhbmQgc3BlY2lmaWVzIHVuY29tcHJlc3NlZAorCQlzaXplIG9mIGRhdGEgc3RvcmVkIGluIHRoaXMgZGlzay4gVGhpcyBleGNsdWRlcyB6ZXJvLWZpbGxlZAorCQlwYWdlcyAoemVyb19wYWdlcykgc2luY2Ugbm8gbWVtb3J5IGlzIGFsbG9jYXRlZCBmb3IgdGhlbS4KKwkJVW5pdDogYnl0ZXMKKwkJTm93IGFjY2Vzc2libGUgdmlhIHpyYW08aWQ+L21tX3N0YXQgbm9kZS4KKworV2hhdDoJCS9zeXMvYmxvY2svenJhbTxpZD4vY29tcHJfZGF0YV9zaXplCitEYXRlOgkJQXVndXN0IDIwMTUKK0NvbnRhY3Q6CVNlcmdleSBTZW5vemhhdHNreSA8c2VyZ2V5LnNlbm96aGF0c2t5QGdtYWlsLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgY29tcHJfZGF0YV9zaXplIGZpbGUgaXMgcmVhZC1vbmx5IGFuZCBzcGVjaWZpZXMgY29tcHJlc3NlZAorCQlzaXplIG9mIGRhdGEgc3RvcmVkIGluIHRoaXMgZGlzay4gU28sIGNvbXByZXNzaW9uIHJhdGlvIGNhbiBiZQorCQljYWxjdWxhdGVkIHVzaW5nIG9yaWdfZGF0YV9zaXplIGFuZCB0aGlzIHN0YXRpc3RpYy4KKwkJVW5pdDogYnl0ZXMKKwkJTm93IGFjY2Vzc2libGUgdmlhIHpyYW08aWQ+L21tX3N0YXQgbm9kZS4KKworV2hhdDoJCS9zeXMvYmxvY2svenJhbTxpZD4vbWVtX3VzZWRfdG90YWwKK0RhdGU6CQlBdWd1c3QgMjAxNQorQ29udGFjdDoJU2VyZ2V5IFNlbm96aGF0c2t5IDxzZXJnZXkuc2Vub3poYXRza3lAZ21haWwuY29tPgorRGVzY3JpcHRpb246CisJCVRoZSBtZW1fdXNlZF90b3RhbCBmaWxlIGlzIHJlYWQtb25seSBhbmQgc3BlY2lmaWVzIHRoZSBhbW91bnQKKwkJb2YgbWVtb3J5LCBpbmNsdWRpbmcgYWxsb2NhdG9yIGZyYWdtZW50YXRpb24gYW5kIG1ldGFkYXRhCisJCW92ZXJoZWFkLCBhbGxvY2F0ZWQgZm9yIHRoaXMgZGlzay4gU28sIGFsbG9jYXRvciBzcGFjZQorCQllZmZpY2llbmN5IGNhbiBiZSBjYWxjdWxhdGVkIHVzaW5nIGNvbXByX2RhdGFfc2l6ZSBhbmQgdGhpcworCQlzdGF0aXN0aWMuCisJCVVuaXQ6IGJ5dGVzCisJCU5vdyBhY2Nlc3NpYmxlIHZpYSB6cmFtPGlkPi9tbV9zdGF0IG5vZGUuCisKK1doYXQ6CQkvc3lzL2Jsb2NrL3pyYW08aWQ+L21lbV91c2VkX21heAorRGF0ZToJCUF1Z3VzdCAyMDE1CitDb250YWN0OglTZXJnZXkgU2Vub3poYXRza3kgPHNlcmdleS5zZW5vemhhdHNreUBnbWFpbC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIG1lbV91c2VkX21heCBmaWxlIGlzIHJlYWQvd3JpdGUgYW5kIHNwZWNpZmllcyB0aGUgYW1vdW50CisJCW9mIG1heGltdW0gbWVtb3J5IHpyYW0gaGF2ZSBjb25zdW1lZCB0byBzdG9yZSBjb21wcmVzc2VkIGRhdGEuCisJCUZvciByZXNldHRpbmcgdGhlIHZhbHVlLCB5b3Ugc2hvdWxkIHdyaXRlICIwIi4gT3RoZXJ3aXNlLAorCQl5b3UgY291bGQgc2VlIC1FSU5WQUwuCisJCVVuaXQ6IGJ5dGVzCisJCURvd25ncmFkZWQgdG8gd3JpdGUtb25seSBub2RlOiBzbyBpdCdzIHBvc3NpYmxlIHRvIHNldCBuZXcKKwkJdmFsdWUgb25seTsgaXRzIGN1cnJlbnQgdmFsdWUgaXMgc3RvcmVkIGluIHpyYW08aWQ+L21tX3N0YXQKKwkJbm9kZS4KKworV2hhdDoJCS9zeXMvYmxvY2svenJhbTxpZD4vbWVtX2xpbWl0CitEYXRlOgkJQXVndXN0IDIwMTUKK0NvbnRhY3Q6CVNlcmdleSBTZW5vemhhdHNreSA8c2VyZ2V5LnNlbm96aGF0c2t5QGdtYWlsLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgbWVtX2xpbWl0IGZpbGUgaXMgcmVhZC93cml0ZSBhbmQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtCisJCWFtb3VudCBvZiBtZW1vcnkgWlJBTSBjYW4gdXNlIHRvIHN0b3JlIHRoZSBjb21wcmVzc2VkIGRhdGEuCisJCVRoZSBsaW1pdCBjb3VsZCBiZSBjaGFuZ2VkIGluIHJ1biB0aW1lIGFuZCAiMCIgbWVhbnMgZGlzYWJsZQorCQl0aGUgbGltaXQuICBObyBsaW1pdCBpcyB0aGUgaW5pdGlhbCBzdGF0ZS4gIFVuaXQ6IGJ5dGVzCisJCURvd25ncmFkZWQgdG8gd3JpdGUtb25seSBub2RlOiBzbyBpdCdzIHBvc3NpYmxlIHRvIHNldCBuZXcKKwkJdmFsdWUgb25seTsgaXRzIGN1cnJlbnQgdmFsdWUgaXMgc3RvcmVkIGluIHpyYW08aWQ+L21tX3N0YXQKKwkJbm9kZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3N0YWJsZS9zeXNmcy1kZXZpY2VzIGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmNzhiODhkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvc3RhYmxlL3N5c2ZzLWRldmljZXMKQEAgLTAsMCArMSwxMCBAQAorIyBOb3RlOiBUaGlzIGRvY3VtZW50cyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgb2YgYW55IGRldmljZSBiZXlvbmQgd2hhdAorIyBpcyBkb2N1bWVudGVkIGluIERvY3VtZW50YXRpb24vc3lzZnMtcnVsZXMudHh0CisKK1doYXQ6CQkvc3lzL2RldmljZXMvKi9vZl9wYXRoCitEYXRlOgkJRmVicnVhcnkgMjAxNQorQ29udGFjdDoJRGV2aWNlIFRyZWUgbWFpbGluZyBsaXN0IDxkZXZpY2V0cmVlQHZnZXIua2VybmVsLm9yZz4KK0Rlc2NyaXB0aW9uOgorCQlBbnkgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBhIGRldmljZS10cmVlIG5vZGUgd2lsbCBoYXZlCisJCWFuIG9mX3BhdGggc3ltbGluayBwb2ludGluZyB0byB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UKKwkJbm9kZSBpbiAvc3lzL2Zpcm13YXJlL2RldmljZXRyZWUvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtcHJpbnRlciBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvY29uZmlnZnMtdXNiLWdhZGdldC1wcmludGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMDcxNGUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL2NvbmZpZ2ZzLXVzYi1nYWRnZXQtcHJpbnRlcgpAQCAtMCwwICsxLDkgQEAKK1doYXQ6CQkvY29uZmlnL3VzYi1nYWRnZXQvZ2FkZ2V0L2Z1bmN0aW9ucy9wcmludGVyLm5hbWUKK0RhdGU6CQlBcHIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC4xCitEZXNjcmlwdGlvbjoKKwkJVGhlIGF0dHJpYnV0ZXM6CisKKwkJcG5wX3N0cmluZwktIERhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBob3N0IGluIHBucCBzdHJpbmcKKwkJcV9sZW4JCS0gTnVtYmVyIG9mIHJlcXVlc3RzIHBlciBlbmRwb2ludAorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJsb2NrLXpyYW0gYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJsb2NrLXpyYW0KaW5kZXggYTYxNDhlYS4uMmU2OWU4MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1ibG9jay16cmFtCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYmxvY2stenJhbQpAQCAtMTQxLDMgKzE0MSwyOCBAQAogCQlhbW91bnQgb2YgbWVtb3J5IFpSQU0gY2FuIHVzZSB0byBzdG9yZSB0aGUgY29tcHJlc3NlZCBkYXRhLiAgVGhlCiAJCWxpbWl0IGNvdWxkIGJlIGNoYW5nZWQgaW4gcnVuIHRpbWUgYW5kICIwIiBtZWFucyBkaXNhYmxlIHRoZQogCQlsaW1pdC4gIE5vIGxpbWl0IGlzIHRoZSBpbml0aWFsIHN0YXRlLiAgVW5pdDogYnl0ZXMKKworV2hhdDoJCS9zeXMvYmxvY2svenJhbTxpZD4vY29tcGFjdAorRGF0ZToJCUF1Z3VzdCAyMDE1CitDb250YWN0OglNaW5jaGFuIEtpbSA8bWluY2hhbkBrZXJuZWwub3JnPgorRGVzY3JpcHRpb246CisJCVRoZSBjb21wYWN0IGZpbGUgaXMgd3JpdGUtb25seSBhbmQgdHJpZ2dlciBjb21wYWN0aW9uIGZvcgorCQlhbGxvY2F0b3IgenJtIHVzZXMuIFRoZSBhbGxvY2F0b3IgbW92ZXMgc29tZSBvYmplY3RzIHNvIHRoYXQKKwkJaXQgY291bGQgZnJlZSBmcmFnbWVudCBzcGFjZS4KKworV2hhdDoJCS9zeXMvYmxvY2svenJhbTxpZD4vaW9fc3RhdAorRGF0ZToJCUF1Z3VzdCAyMDE1CitDb250YWN0OglTZXJnZXkgU2Vub3poYXRza3kgPHNlcmdleS5zZW5vemhhdHNreUBnbWFpbC5jb20+CitEZXNjcmlwdGlvbjoKKwkJVGhlIGlvX3N0YXQgZmlsZSBpcyByZWFkLW9ubHkgYW5kIGFjY3VtdWxhdGVzIGRldmljZSdzIEkvTworCQlzdGF0aXN0aWNzIG5vdCBhY2NvdW50ZWQgYnkgYmxvY2sgbGF5ZXIuIEZvciBleGFtcGxlLAorCQlmYWlsZWRfcmVhZHMsIGZhaWxlZF93cml0ZXMsIGV0Yy4gRmlsZSBmb3JtYXQgaXMgc2ltaWxhciB0bworCQlibG9jayBsYXllciBzdGF0aXN0aWNzIGZpbGUgZm9ybWF0LgorCitXaGF0OgkJL3N5cy9ibG9jay96cmFtPGlkPi9tbV9zdGF0CitEYXRlOgkJQXVndXN0IDIwMTUKK0NvbnRhY3Q6CVNlcmdleSBTZW5vemhhdHNreSA8c2VyZ2V5LnNlbm96aGF0c2t5QGdtYWlsLmNvbT4KK0Rlc2NyaXB0aW9uOgorCQlUaGUgbW1fc3RhdCBmaWxlIGlzIHJlYWQtb25seSBhbmQgcmVwcmVzZW50cyBkZXZpY2UncyBtbQorCQlzdGF0aXN0aWNzIChvcmlnX2RhdGFfc2l6ZSwgY29tcHJfZGF0YV9zaXplLCBldGMuKSBpbiBhIGZvcm1hdAorCQlzaW1pbGFyIHRvIGJsb2NrIGxheWVyIHN0YXRpc3RpY3MgZmlsZSBmb3JtYXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1paW8gYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1paW8KaW5kZXggOWE3MGMzMS4uM2JlZmNiMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtaWlvCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLWlpbwpAQCAtMjUzLDYgKzI1Myw4IEBACiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fcHJlc3N1cmVZX29mZnNldAogV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3ByZXNzdXJlX29mZnNldAogV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2h1bWlkaXR5cmVsYXRpdmVfb2Zmc2V0CitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fbWFnbl9vZmZzZXQKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9yb3Rfb2Zmc2V0CiBLZXJuZWxWZXJzaW9uOgkyLjYuMzUKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgpAQCAtMjk2LDYgKzI5OCw3IEBACiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fcHJlc3N1cmVfc2NhbGUKIFdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9odW1pZGl0eXJlbGF0aXZlX3NjYWxlCiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fdmVsb2NpdHlfc3FydCh4XjIreV4yK3peMilfc2NhbGUKK1doYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9pbGx1bWluYW5jZV9zY2FsZQogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTMzNiw2ICszMzksNyBAQAogd2hhdAkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fcHJveGltaXR5MF9jYWxpYnNjYWxlCiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fcHJlc3N1cmVZX2NhbGlic2NhbGUKIFdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9wcmVzc3VyZV9jYWxpYnNjYWxlCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5faWxsdW1pbmFuY2VfY2FsaWJzY2FsZQogS2VybmVsVmVyc2lvbjoJMi42LjM1CiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKQEAgLTM0Nyw3ICszNTEsNyBAQAogV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2VuZXJneV9jYWxpYmdlbmRlcgogV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2Rpc3RhbmNlX2NhbGliZ2VuZGVyCiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fdmVsb2NpdHlfY2FsaWJnZW5kZXIKLUtlcm5lbFZlcnNpb246CTMuMjAKK0tlcm5lbFZlcnNpb246CTQuMAogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCUdlbmRlciBvZiB0aGUgdXNlciAoZS5nLjogbWFsZSwgZmVtYWxlKSB1c2VkIGJ5IHNvbWUgcGVkb21ldGVycwpAQCAtMzU4LDcgKzM2Miw3IEBACiBXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvaW5fZW5lcmd5X2NhbGliZ2VuZGVyX2F2YWlsYWJsZQogV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX2Rpc3RhbmNlX2NhbGliZ2VuZGVyX2F2YWlsYWJsZQogV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2luX3ZlbG9jaXR5X2NhbGliZ2VuZGVyX2F2YWlsYWJsZQotS2VybmVsVmVyc2lvbjoJMy4yMAorS2VybmVsVmVyc2lvbjoJNC4wCiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJTGlzdHMgYWxsIGF2YWlsYWJsZSBnZW5kZXIgdmFsdWVzIChlLmcuOiBtYWxlLCBmZW1hbGUpLgpAQCAtMzc1LDcgKzM3OSw3IEBACiAJCXR5cGUuCiAKIFdoYXQ6CQkvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9pbl9lbmVyZ3lfY2FsaWJ3ZWlnaHQKLUtlcm5lbFZlcnNpb246CTMuMjAKK0tlcm5lbFZlcnNpb246CTQuMAogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCVdlaWdodCBvZiB0aGUgdXNlciAoaW4ga2cpLiBJdCBpcyBuZWVkZWQgYnkgc29tZSBwZWRvbWV0ZXJzCkBAIC02MTIsNiArNjE2LDggQEAKIAkJYSBnaXZlbiBldmVudCB0eXBlIGlzIGVuYWJsZWQgYSBmdXR1cmUgcG9pbnQgKGFuZCBub3QgdGhvc2UgZm9yCiAJCXdoYXRldmVyIGV2ZW50IHdhcyBwcmV2aW91c2x5IGVuYWJsZWQpLgogCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3RocmVzaF9yaXNpbmdfdmFsdWUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfdGhyZXNoX2ZhbGxpbmdfdmFsdWUKIFdoYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeF9yYXdfdGhyZXNoX3Jpc2luZ192YWx1ZQogV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF94X3Jhd190aHJlc2hfZmFsbGluZ192YWx1ZQogV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF95X3Jhd190aHJlc2hfcmlzaW5nX3ZhbHVlCkBAIC02NjEsNiArNjY3LDI0IEBACiAJCXZhbHVlIGlzIGluIHJhdyBkZXZpY2UgdW5pdHMgb3IgaW4gcHJvY2Vzc2VkIHVuaXRzIChhcyBfcmF3CiAJCWFuZCBfaW5wdXQgZG8gb24gc3lzZnMgZGlyZWN0IGNoYW5uZWwgcmVhZCBhdHRyaWJ1dGVzKS4KIAorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF9zY2FsZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF9wZWFrX3NjYWxlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FuZ2x2ZWxfc2NhbGUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fbWFnbl9zY2FsZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9yb3RfZnJvbV9ub3J0aF9tYWduZXRpY19zY2FsZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9yb3RfZnJvbV9ub3J0aF90cnVlX3NjYWxlCitXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX3ZvbHRhZ2Vfc2NhbGUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdm9sdGFnZV9zdXBwbHlfc2NhbGUKK1doYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fdGVtcF9zY2FsZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9pbGx1bWluYW5jZV9zY2FsZQorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9wcm94aW1pdHlfc2NhbGUKK0tlcm5lbFZlcnNpb246CTMuMjEKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorICAgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgY29udmVyc2lvbiBmYWN0b3IgZnJvbSB0aGUgc3RhbmRhcmQgdW5pdHMKKyAgICAgICAgICAgICAgICB0byBkZXZpY2Ugc3BlY2lmaWMgdW5pdHMgdXNlZCB0byBzZXQgdGhlIGV2ZW50IHRyaWdnZXIKKyAgICAgICAgICAgICAgICB0aHJlc2hvbGQuCisKIFdoYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeF90aHJlc2hfcmlzaW5nX2h5c3RlcmVzaXMKIFdoYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeF90aHJlc2hfZmFsbGluZ19oeXN0ZXJlc2lzCiBXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3hfdGhyZXNoX2VpdGhlcl9oeXN0ZXJlc2lzCkBAIC03NzYsNyArODAwLDcgQEAKIAogV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF94X3RocmVzaF9yaXNpbmdfcGVyaW9kCiBXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3hfdGhyZXNoX2ZhbGxpbmdfcGVyaW9kCi1oYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeF9yb2NfcmlzaW5nX3BlcmlvZAorV2hhdDoJCS9zeXMvLi4uL2V2ZW50cy9pbl9hY2NlbF94X3JvY19yaXNpbmdfcGVyaW9kCiBXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3hfcm9jX2ZhbGxpbmdfcGVyaW9kCiBXaGF0OgkJL3N5cy8uLi4vZXZlbnRzL2luX2FjY2VsX3lfdGhyZXNoX3Jpc2luZ19wZXJpb2QKIFdoYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fYWNjZWxfeV90aHJlc2hfZmFsbGluZ19wZXJpb2QKQEAgLTkyMyw3ICs5NDcsNyBAQAogCQl0aGlzIHR5cGUuCiAKIFdoYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fc3RlcHNfY2hhbmdlX2VuCi1LZXJuZWxWZXJzaW9uOgkzLjIwCitLZXJuZWxWZXJzaW9uOgk0LjAKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlFdmVudCBnZW5lcmF0ZWQgd2hlbiBjaGFubmVsIHBhc3NlcyBhIHRocmVzaG9sZCBvbiB0aGUgYWJzb2x1dGUKQEAgLTkzMiw3ICs5NTYsNyBAQAogCQlpbl9zdGVwc19jaGFuZ2VfdmFsdWUuCiAKIFdoYXQ6CQkvc3lzLy4uLi9ldmVudHMvaW5fc3RlcHNfY2hhbmdlX3ZhbHVlCi1LZXJuZWxWZXJzaW9uOgkzLjIwCitLZXJuZWxWZXJzaW9uOgk0LjAKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgogCQlTcGVjaWZpZXMgdGhlIHZhbHVlIG9mIGNoYW5nZSB0aHJlc2hvbGQgdGhhdCB0aGUKQEAgLTk5Nyw2ICsxMDIxLDcgQEAKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9zY2FuX2VsZW1lbnRzL2luX3ByZXNzdXJlWV9lbgogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL3NjYW5fZWxlbWVudHMvaW5fcHJlc3N1cmVfZW4KIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9zY2FuX2VsZW1lbnRzL2luX3JvdF9xdWF0ZXJuaW9uX2VuCitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvc2Nhbl9lbGVtZW50cy9pbl9wcm94aW1pdHlfZW4KIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0xMDEzLDYgKzEwMzgsNyBAQAogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL3NjYW5fZWxlbWVudHMvaW5fcHJlc3N1cmVZX3R5cGUKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9zY2FuX2VsZW1lbnRzL2luX3ByZXNzdXJlX3R5cGUKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9zY2FuX2VsZW1lbnRzL2luX3JvdF9xdWF0ZXJuaW9uX3R5cGUKK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9zY2FuX2VsZW1lbnRzL2luX3Byb3hpbWl0eV90eXBlCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzcKIENvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKIERlc2NyaXB0aW9uOgpAQCAtMTA2NCw2ICsxMDkwLDcgQEAKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9zY2FuX2VsZW1lbnRzL2luX3ByZXNzdXJlWV9pbmRleAogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL3NjYW5fZWxlbWVudHMvaW5fcHJlc3N1cmVfaW5kZXgKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9zY2FuX2VsZW1lbnRzL2luX3JvdF9xdWF0ZXJuaW9uX2luZGV4CitXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvc2Nhbl9lbGVtZW50cy9pbl9wcm94aW1pdHlfaW5kZXgKIEtlcm5lbFZlcnNpb246CTIuNi4zNwogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0xMTA0LDcgKzExMzEsNyBAQAogCiBXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvaW5fZW5lcmd5X2lucHV0CiBXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvaW5fZW5lcmd5X3JhdwotS2VybmVsVmVyc2lvbjoJMy4yMAorS2VybmVsVmVyc2lvbjoJNC4wCiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCB0byByZWFkIHRoZSBlbmVyZ3kgdmFsdWUgcmVwb3J0ZWQgYnkgdGhlCkBAIC0xMTEzLDcgKzExNDAsNyBAQAogCiBXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvaW5fZGlzdGFuY2VfaW5wdXQKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl9kaXN0YW5jZV9yYXcKLUtlcm5lbFZlcnNpb246CTMuMjAKK0tlcm5lbFZlcnNpb246CTQuMAogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCVRoaXMgYXR0cmlidXRlIGlzIHVzZWQgdG8gcmVhZCB0aGUgZGlzdGFuY2UgY292ZXJlZCBieSB0aGUgdXNlcgpAQCAtMTE0Myw5ICsxMTcwLDEzIEBACiAJCXZhbHVlcyBzaG91bGQgYmVoYXZlIGluIHRoZSBzYW1lIHdheSBhcyBhIGRpc3RhbmNlLCBpLmUuIGxvd2VyCiAJCXZhbHVlcyBpbmRpY2F0ZSBzb21ldGhpbmcgaXMgY2xvc2VyIHRvIHRoZSBzZW5zb3IuCiAKK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl9pbGx1bWluYW5jZV9pbnB1dAorV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX2lsbHVtaW5hbmNlX3JhdwogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX2lsbHVtaW5hbmNlWV9pbnB1dAogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX2lsbHVtaW5hbmNlWV9yYXcKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl9pbGx1bWluYW5jZVlfbWVhbl9yYXcKK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl9pbGx1bWluYW5jZV9pcl9yYXcKK1doYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl9pbGx1bWluYW5jZV9jbGVhcl9yYXcKIEtlcm5lbFZlcnNpb246CTMuNAogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CkBAIC0xMTc0LDcgKzEyMDUsNyBAQAogCQlzZWNvbmRzLgogCiBXaGF0OgkJL3N5cy8uLi4vaWlvOmRldmljZVgvaW5fdmVsb2NpdHlfc3FydCh4XjIreV4yK3peMilfaW50ZWdyYXRpb25fdGltZQotS2VybmVsVmVyc2lvbjoJMy4yMAorS2VybmVsVmVyc2lvbjoJNC4wCiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJTnVtYmVyIG9mIHNlY29uZHMgaW4gd2hpY2ggdG8gY29tcHV0ZSBzcGVlZC4KQEAgLTEyMzYsNyArMTI2Nyw3IEBACiAJCVVuaXRzIGFmdGVyIGFwcGxpY2F0aW9uIG9mIHNjYWxlIGFyZSBtL3MuCiAKIFdoYXQ6CQkvc3lzLy4uLi9paW86ZGV2aWNlWC9pbl9zdGVwc19kZWJvdW5jZV9jb3VudAotS2VybmVsVmVyc2lvbjoJMy4yMAorS2VybmVsVmVyc2lvbjoJNC4wCiBDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCiBEZXNjcmlwdGlvbjoKIAkJU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc3RlcHMgdGhhdCBtdXN0IG9jY3VyIHdpdGhpbgpAQCAtMTI0NCw4ICsxMjc1LDkyIEBACiAJCWNvbnN1bWVyIGlzIG1ha2luZyBzdGVwcy4KIAogV2hhdDoJCS9zeXMvLi4uL2lpbzpkZXZpY2VYL2luX3N0ZXBzX2RlYm91bmNlX3RpbWUKLUtlcm5lbFZlcnNpb246CTMuMjAKK0tlcm5lbFZlcnNpb246CTQuMAogQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZwogRGVzY3JpcHRpb246CiAJCVNwZWNpZmllcyBudW1iZXIgb2Ygc2Vjb25kcyBpbiB3aGljaCB3ZSBjb21wdXRlIHRoZSBzdGVwcwogCQl0aGF0IG9jY3VyIGluIG9yZGVyIHRvIGRlY2lkZSBpZiB0aGUgY29uc3VtZXIgaXMgbWFraW5nIHN0ZXBzLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvYnVmZmVyL3dhdGVybWFyaworS2VybmVsVmVyc2lvbjoJNC4yCitDb250YWN0OglsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJQSBzaW5nbGUgcG9zaXRpdmUgaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzY2FuCisJCWVsZW1lbnRzIHRvIHdhaXQgZm9yLgorCQlQb2xsIHdpbGwgYmxvY2sgdW50aWwgdGhlIHdhdGVybWFyayBpcyByZWFjaGVkLgorCQlCbG9ja2luZyByZWFkIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWluaW11bSBiZXR3ZWVuIHRoZSByZXF1ZXN0ZWQKKwkJcmVhZCBhbW91bnQgb3IgdGhlIGxvdyB3YXRlciBtYXJrIGlzIGF2YWlsYWJsZS4KKwkJTm9uLWJsb2NraW5nIHJlYWQgd2lsbCByZXRyaWV2ZSB0aGUgYXZhaWxhYmxlIHNhbXBsZXMgZnJvbSB0aGUKKwkJYnVmZmVyIGV2ZW4gaWYgdGhlcmUgYXJlIGxlc3Mgc2FtcGxlcyB0aGVuIHdhdGVybWFyayBsZXZlbC4gVGhpcworCQlhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGJsb2NrIG9uIHBvbGwgd2l0aCBhIHRpbWVvdXQgYW5kIHJlYWQKKwkJdGhlIGF2YWlsYWJsZSBzYW1wbGVzIGFmdGVyIHRoZSB0aW1lb3V0IGV4cGlyZXMgYW5kIHRodXMgaGF2ZSBhCisJCW1heGltdW0gZGVsYXkgZ3VhcmFudGVlLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvYnVmZmVyL2h3Zmlmb19lbmFibGVkCitLZXJuZWxWZXJzaW9uOiA0LjIKK0NvbnRhY3Q6CWxpbnV4LWlpb0B2Z2VyLmtlcm5lbC5vcmcKK0Rlc2NyaXB0aW9uOgorCQlBIHJlYWQtb25seSBib29sZWFuIHZhbHVlIHRoYXQgaW5kaWNhdGVzIGlmIHRoZSBoYXJkd2FyZSBmaWZvIGlzCisJCWN1cnJlbnRseSBlbmFibGVkIG9yIGRpc2FibGVkLiBJZiB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgYQorCQloYXJkd2FyZSBmaWZvIHRoaXMgZW50cnkgaXMgbm90IHByZXNlbnQuCisJCVRoZSBoYXJkd2FyZSBmaWZvIGlzIGVuYWJsZWQgd2hlbiB0aGUgYnVmZmVyIGlzIGVuYWJsZWQgaWYgdGhlCisJCWN1cnJlbnQgaGFyZHdhcmUgZmlmbyB3YXRlcm1hcmsgbGV2ZWwgaXMgc2V0IGFuZCBvdGhlciBjdXJyZW50CisJCWRldmljZSBzZXR0aW5ncyBhbGxvd3MgaXQgKGUuZy4gaWYgYSB0cmlnZ2VyIGlzIHNldCB0aGF0IHNhbXBsZXMKKwkJZGF0YSBkaWZmZXJlbnRseSB0aGF0IHRoZSBoYXJkd2FyZSBmaWZvIGRvZXMgdGhlbiBoYXJkd2FyZSBmaWZvCisJCXdpbGwgbm90IGVuYWJsZWQpLgorCQlJZiB0aGUgaGFyZHdhcmUgZmlmbyBpcyBlbmFibGVkIGFuZCB0aGUgbGV2ZWwgb2YgdGhlIGhhcmR3YXJlCisJCWZpZm8gcmVhY2hlcyB0aGUgaGFyZHdhcmUgZmlmbyB3YXRlcm1hcmsgbGV2ZWwgdGhlIGRldmljZSB3aWxsCisJCWZsdXNoIGl0cyBoYXJkd2FyZSBmaWZvIHRvIHRoZSBkZXZpY2UgYnVmZmVyLiBEb2luZyBhIG5vbgorCQlibG9ja2luZyByZWFkIG9uIHRoZSBkZXZpY2Ugd2hlbiBubyBzYW1wbGVzIGFyZSBwcmVzZW50IGluIHRoZQorCQlkZXZpY2UgYnVmZmVyIHdpbGwgYWxzbyBmb3JjZSBhIGZsdXNoLgorCQlXaGVuIHRoZSBoYXJkd2FyZSBmaWZvIGlzIGVuYWJsZWQgdGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgYQorCQl0cmlnZ2VyIHRvIHVzZSBidWZmZXIgbW9kZSBzaW5jZSB0aGUgd2F0ZXJtYXJrIHNldHRpbmdzCisJCWd1YXJhbnRlZXMgdGhhdCB0aGUgaGFyZHdhcmUgZmlmbyBpcyBmbHVzaGVkIHRvIHRoZSBkZXZpY2UKKwkJYnVmZmVyLgorCitXaGF0OgkJL3N5cy9idXMvaWlvL2RldmljZXMvaWlvOmRldmljZVgvYnVmZmVyL2h3Zmlmb193YXRlcm1hcmsKK0tlcm5lbFZlcnNpb246IDQuMgorQ29udGFjdDoJbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCVJlYWQtb25seSBlbnRyeSB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIGludGVnZXIgc3BlY2lmeWluZyB0aGUKKwkJY3VycmVudCB3YXRlcm1hcmsgbGV2ZWwgZm9yIHRoZSBoYXJkd2FyZSBmaWZvLiBJZiB0aGUgZGV2aWNlCisJCWRvZXMgbm90IGhhdmUgYSBoYXJkd2FyZSBmaWZvIHRoaXMgZW50cnkgaXMgbm90IHByZXNlbnQuCisJCVRoZSB3YXRlcm1hcmsgbGV2ZWwgZm9yIHRoZSBoYXJkd2FyZSBmaWZvIGlzIHNldCBieSB0aGUgZHJpdmVyCisJCWJhc2VkIG9uIHRoZSB2YWx1ZSBzZXQgYnkgdGhlIHVzZXIgaW4gYnVmZmVyL3dhdGVybWFyayBidXQKKwkJdGFraW5nIGludG8gYWNjb3VudCBoYXJkd2FyZSBsaW1pdGF0aW9ucyAoZS5nLiBtb3N0IGhhcmR3YXJlCisJCWJ1ZmZlcnMgYXJlIGxpbWl0ZWQgdG8gMzItNjQgc2FtcGxlcywgc29tZSBoYXJkd2FyZSBidWZmZXJzCisJCXdhdGVybWFya3MgYXJlIGZpeGVkIG9yIGhhdmUgbWluaW11bSBsZXZlbHMpLiAgQSB2YWx1ZSBvZiAwCisJCW1lYW5zIHRoYXQgdGhlIGhhcmR3YXJlIHdhdGVybWFyayBpcyB1bnNldC4KKworV2hhdDoJCS9zeXMvYnVzL2lpby9kZXZpY2VzL2lpbzpkZXZpY2VYL2J1ZmZlci9od2ZpZm9fd2F0ZXJtYXJrX21pbgorS2VybmVsVmVyc2lvbjogNC4yCitDb250YWN0OiAgICAgICBsaW51eC1paW9Admdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJQSBzaW5nbGUgcG9zaXRpdmUgaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBtaW5pbXVtIHdhdGVybWFyayBsZXZlbAorCQlmb3IgdGhlIGhhcmR3YXJlIGZpZm8gb2YgdGhpcyBkZXZpY2UuIElmIHRoZSBkZXZpY2UgZG9lcyBub3QKKwkJaGF2ZSBhIGhhcmR3YXJlIGZpZm8gdGhpcyBlbnRyeSBpcyBub3QgcHJlc2VudC4KKwkJSWYgdGhlIHVzZXIgc2V0cyBidWZmZXIvd2F0ZXJtYXJrIHRvIGEgdmFsdWUgbGVzcyB0aGFuIHRoaXMgb25lLAorCQl0aGVuIHRoZSBoYXJkd2FyZSB3YXRlcm1hcmsgd2lsbCByZW1haW4gdW5zZXQuCisKK1doYXQ6CSAgICAgICAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9idWZmZXIvaHdmaWZvX3dhdGVybWFya19tYXgKK0tlcm5lbFZlcnNpb246IDQuMgorQ29udGFjdDogICAgICAgbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUEgc2luZ2xlIHBvc2l0aXZlIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbWF4aW11bSB3YXRlcm1hcmsgbGV2ZWwKKwkJZm9yIHRoZSBoYXJkd2FyZSBmaWZvIG9mIHRoaXMgZGV2aWNlLiBJZiB0aGUgZGV2aWNlIGRvZXMgbm90CisJCWhhdmUgYSBoYXJkd2FyZSBmaWZvIHRoaXMgZW50cnkgaXMgbm90IHByZXNlbnQuCisJCUlmIHRoZSB1c2VyIHNldHMgYnVmZmVyL3dhdGVybWFyayB0byBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGlzCisJCW9uZSwgdGhlbiB0aGUgaGFyZHdhcmUgd2F0ZXJtYXJrIHdpbGwgYmUgY2FwcGVkIGF0IHRoaXMgdmFsdWUuCisKK1doYXQ6CSAgICAgICAvc3lzL2J1cy9paW8vZGV2aWNlcy9paW86ZGV2aWNlWC9idWZmZXIvaHdmaWZvX3dhdGVybWFya19hdmFpbGFibGUKK0tlcm5lbFZlcnNpb246IDQuMgorQ29udGFjdDogICAgICAgbGludXgtaWlvQHZnZXIua2VybmVsLm9yZworRGVzY3JpcHRpb246CisJCUEgbGlzdCBvZiBwb3NpdGl2ZSBpbnRlZ2VycyBzcGVjaWZ5aW5nIHRoZSBhdmFpbGFibGUgd2F0ZXJtYXJrCisJCWxldmVscyBmb3IgdGhlIGhhcmR3YXJlIGZpZm8uIFRoaXMgZW50cnkgaXMgb3B0aW9uYWwgYW5kIGlmIGl0CisJCWlzIG5vdCBwcmVzZW50IGl0IG1lYW5zIHRoYXQgYWxsIHRoZSB2YWx1ZXMgYmV0d2VlbgorCQlod2ZpZm9fd2F0ZXJtYXJrX21pbiBhbmQgaHdmaWZvX3dhdGVybWFya19tYXggYXJlIHN1cHBvcnRlZC4KKwkJSWYgdGhlIHVzZXIgc2V0cyBidWZmZXIvd2F0ZXJtYXJrIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuCisJCWh3Zmlmb193YXRlcm1ha19taW4gYnV0IG5vdCBlcXVhbCB0byBhbnkgb2YgdGhlIHZhbHVlcyBpbiB0aGlzCisJCWxpc3QsIHRoZSBkcml2ZXIgd2lsbCBjaG9zZSBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IgdGhlCisJCWhhcmR3YXJlIGZpZm8gd2F0ZXJtYXJrIGxldmVsLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1sZWQtZmxhc2ggYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZC1mbGFzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjBhMDI3MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbGVkLWZsYXNoCkBAIC0wLDAgKzEsODAgQEAKK1doYXQ6CQkvc3lzL2NsYXNzL2xlZHMvPGxlZD4vZmxhc2hfYnJpZ2h0bmVzcworRGF0ZToJCU1hcmNoIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuMAorQ29udGFjdDoJSmFjZWsgQW5hc3pld3NraSA8ai5hbmFzemV3c2tpQHNhbXN1bmcuY29tPgorRGVzY3JpcHRpb246CXJlYWQvd3JpdGUKKwkJU2V0IHRoZSBicmlnaHRuZXNzIG9mIHRoaXMgTEVEIGluIHRoZSBmbGFzaCBzdHJvYmUgbW9kZSwgaW4KKwkJbWljcm9hbXBlcmVzLiBUaGUgZmlsZSBpcyBjcmVhdGVkIG9ubHkgZm9yIHRoZSBmbGFzaCBMRUQgZGV2aWNlcworCQl0aGF0IHN1cHBvcnQgc2V0dGluZyBmbGFzaCBicmlnaHRuZXNzLgorCisJCVRoZSB2YWx1ZSBpcyBiZXR3ZWVuIDAgYW5kCisJCS9zeXMvY2xhc3MvbGVkcy88bGVkPi9tYXhfZmxhc2hfYnJpZ2h0bmVzcy4KKworV2hhdDoJCS9zeXMvY2xhc3MvbGVkcy88bGVkPi9tYXhfZmxhc2hfYnJpZ2h0bmVzcworRGF0ZToJCU1hcmNoIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuMAorQ29udGFjdDoJSmFjZWsgQW5hc3pld3NraSA8ai5hbmFzemV3c2tpQHNhbXN1bmcuY29tPgorRGVzY3JpcHRpb246CXJlYWQgb25seQorCQlNYXhpbXVtIGJyaWdodG5lc3MgbGV2ZWwgZm9yIHRoaXMgTEVEIGluIHRoZSBmbGFzaCBzdHJvYmUgbW9kZSwKKwkJaW4gbWljcm9hbXBlcmVzLgorCitXaGF0OgkJL3N5cy9jbGFzcy9sZWRzLzxsZWQ+L2ZsYXNoX3RpbWVvdXQKK0RhdGU6CQlNYXJjaCAyMDE1CitLZXJuZWxWZXJzaW9uOgk0LjAKK0NvbnRhY3Q6CUphY2VrIEFuYXN6ZXdza2kgPGouYW5hc3pld3NraUBzYW1zdW5nLmNvbT4KK0Rlc2NyaXB0aW9uOglyZWFkL3dyaXRlCisJCUhhcmR3YXJlIHRpbWVvdXQgZm9yIGZsYXNoLCBpbiBtaWNyb3NlY29uZHMuIFRoZSBmbGFzaCBzdHJvYmUKKwkJaXMgc3RvcHBlZCBhZnRlciB0aGlzIHBlcmlvZCBvZiB0aW1lIGhhcyBwYXNzZWQgZnJvbSB0aGUgc3RhcnQKKwkJb2YgdGhlIHN0cm9iZS4gVGhlIGZpbGUgaXMgY3JlYXRlZCBvbmx5IGZvciB0aGUgZmxhc2ggTEVECisJCWRldmljZXMgdGhhdCBzdXBwb3J0IHNldHRpbmcgZmxhc2ggdGltZW91dC4KKworV2hhdDoJCS9zeXMvY2xhc3MvbGVkcy88bGVkPi9tYXhfZmxhc2hfdGltZW91dAorRGF0ZToJCU1hcmNoIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuMAorQ29udGFjdDoJSmFjZWsgQW5hc3pld3NraSA8ai5hbmFzemV3c2tpQHNhbXN1bmcuY29tPgorRGVzY3JpcHRpb246CXJlYWQgb25seQorCQlNYXhpbXVtIGZsYXNoIHRpbWVvdXQgZm9yIHRoaXMgTEVELCBpbiBtaWNyb3NlY29uZHMuCisKK1doYXQ6CQkvc3lzL2NsYXNzL2xlZHMvPGxlZD4vZmxhc2hfc3Ryb2JlCitEYXRlOgkJTWFyY2ggMjAxNQorS2VybmVsVmVyc2lvbjoJNC4wCitDb250YWN0OglKYWNlayBBbmFzemV3c2tpIDxqLmFuYXN6ZXdza2lAc2Ftc3VuZy5jb20+CitEZXNjcmlwdGlvbjoJcmVhZC93cml0ZQorCQlGbGFzaCBzdHJvYmUgc3RhdGUuIFdoZW4gd3JpdHRlbiB3aXRoIDEgaXQgdHJpZ2dlcnMgZmxhc2ggc3Ryb2JlCisJCWFuZCB3aGVuIHdyaXR0ZW4gd2l0aCAwIGl0IHR1cm5zIHRoZSBmbGFzaCBvZmYuCisKKwkJT24gcmVhZCAxIG1lYW5zIHRoYXQgZmxhc2ggaXMgY3VycmVudGx5IHN0cm9iaW5nIGFuZCAwIG1lYW5zCisJCXRoYXQgZmxhc2ggaXMgb2ZmLgorCitXaGF0OgkJL3N5cy9jbGFzcy9sZWRzLzxsZWQ+L2ZsYXNoX2ZhdWx0CitEYXRlOgkJTWFyY2ggMjAxNQorS2VybmVsVmVyc2lvbjoJNC4wCitDb250YWN0OglKYWNlayBBbmFzemV3c2tpIDxqLmFuYXN6ZXdza2lAc2Ftc3VuZy5jb20+CitEZXNjcmlwdGlvbjoJcmVhZCBvbmx5CisJCVNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIGZsYXNoIGZhdWx0cyB0aGF0IG1heSBoYXZlIG9jY3VycmVkLgorCQlGbGFzaCBmYXVsdHMgYXJlIHJlLXJlYWQgYWZ0ZXIgc3Ryb2JpbmcgdGhlIGZsYXNoLiBQb3NzaWJsZQorCQlmbGFzaCBmYXVsdHM6CisKKwkJKiBsZWQtb3Zlci12b2x0YWdlIC0gZmxhc2ggY29udHJvbGxlciB2b2x0YWdlIHRvIHRoZSBmbGFzaCBMRUQKKwkJCWhhcyBleGNlZWRlZCB0aGUgbGltaXQgc3BlY2lmaWMgdG8gdGhlIGZsYXNoIGNvbnRyb2xsZXIKKwkJKiBmbGFzaC10aW1lb3V0LWV4Y2VlZGVkIC0gdGhlIGZsYXNoIHN0cm9iZSB3YXMgc3RpbGwgb24gd2hlbgorCQkJdGhlIHRpbWVvdXQgc2V0IGJ5IHRoZSB1c2VyIGhhcyBleHBpcmVkOyBub3QgYWxsIGZsYXNoCisJCQljb250cm9sbGVycyBtYXkgc2V0IHRoaXMgaW4gYWxsIHN1Y2ggY29uZGl0aW9ucworCQkqIGNvbnRyb2xsZXItb3Zlci10ZW1wZXJhdHVyZSAtIHRoZSBmbGFzaCBjb250cm9sbGVyIGhhcworCQkJb3ZlcmhlYXRlZAorCQkqIGNvbnRyb2xsZXItc2hvcnQtY2lyY3VpdCAtIHRoZSBzaG9ydCBjaXJjdWl0IHByb3RlY3Rpb24KKwkJCW9mIHRoZSBmbGFzaCBjb250cm9sbGVyIGhhcyBiZWVuIHRyaWdnZXJlZAorCQkqIGxlZC1wb3dlci1zdXBwbHktb3Zlci1jdXJyZW50IC0gY3VycmVudCBpbiB0aGUgTEVEIHBvd2VyCisJCQlzdXBwbHkgaGFzIGV4Y2VlZGVkIHRoZSBsaW1pdCBzcGVjaWZpYyB0byB0aGUgZmxhc2gKKwkJCWNvbnRyb2xsZXIKKwkJKiBpbmRpY2F0b3ItbGVkLWZhdWx0IC0gdGhlIGZsYXNoIGNvbnRyb2xsZXIgaGFzIGRldGVjdGVkCisJCQlhIHNob3J0IG9yIG9wZW4gY2lyY3VpdCBjb25kaXRpb24gb24gdGhlIGluZGljYXRvciBMRUQKKwkJKiBsZWQtdW5kZXItdm9sdGFnZSAtIGZsYXNoIGNvbnRyb2xsZXIgdm9sdGFnZSB0byB0aGUgZmxhc2gKKwkJCUxFRCBoYXMgYmVlbiBiZWxvdyB0aGUgbWluaW11bSBsaW1pdCBzcGVjaWZpYyB0bworCQkJdGhlIGZsYXNoCisJCSogY29udHJvbGxlci11bmRlci12b2x0YWdlIC0gdGhlIGlucHV0IHZvbHRhZ2Ugb2YgdGhlIGZsYXNoCisJCQljb250cm9sbGVyIGlzIGJlbG93IHRoZSBsaW1pdCB1bmRlciB3aGljaCBzdHJvYmluZyB0aGUKKwkJCWZsYXNoIGF0IGZ1bGwgY3VycmVudCB3aWxsIG5vdCBiZSBwb3NzaWJsZTsKKwkJCXRoZSBjb25kaXRpb24gcGVyc2lzdHMgdW50aWwgdGhpcyBmbGFnIGlzIG5vIGxvbmdlciBzZXQKKwkJKiBsZWQtb3Zlci10ZW1wZXJhdHVyZSAtIHRoZSB0ZW1wZXJhdHVyZSBvZiB0aGUgTEVEIGhhcyBleGNlZWRlZAorCQkJaXRzIGFsbG93ZWQgdXBwZXIgbGltaXQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbmV0IGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1uZXQKaW5kZXggYmViOGVjNC4uNWVjZmQ3MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1uZXQKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1uZXQKQEAgLTE4OCw2ICsxODgsMTQgQEAKIAkJSW5kaWNhdGVzIHRoZSBpbnRlcmZhY2UgdW5pcXVlIHBoeXNpY2FsIHBvcnQgaWRlbnRpZmllciB3aXRoaW4KIAkJdGhlIE5JQywgYXMgYSBzdHJpbmcuCiAKK1doYXQ6CQkvc3lzL2NsYXNzL25ldC88aWZhY2U+L3BoeXNfcG9ydF9uYW1lCitEYXRlOgkJTWFyY2ggMjAxNQorS2VybmVsVmVyc2lvbjoJNC4wCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJSW5kaWNhdGVzIHRoZSBpbnRlcmZhY2UgcGh5c2ljYWwgcG9ydCBuYW1lIHdpdGhpbiB0aGUgTklDLAorCQlhcyBhIHN0cmluZy4KKwogV2hhdDoJCS9zeXMvY2xhc3MvbmV0LzxpZmFjZT4vc3BlZWQKIERhdGU6CQlPY3RvYmVyIDIwMDkKIEtlcm5lbFZlcnNpb246CTIuNi4zMwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1uZXQtcXVldWVzIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1jbGFzcy1uZXQtcXVldWVzCmluZGV4IDVlOWFlYjkuLjBjMGRmOTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtY2xhc3MtbmV0LXF1ZXVlcworKysgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLW5ldC1xdWV1ZXMKQEAgLTI0LDYgKzI0LDE0IEBACiAJCUluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHRyYW5zbWl0IHRpbWVvdXQgZXZlbnRzIHNlZW4gYnkgdGhpcwogCQluZXR3b3JrIGludGVyZmFjZSB0cmFuc21pdCBxdWV1ZS4KIAorV2hhdDoJCS9zeXMvY2xhc3MvPGlmYWNlPi9xdWV1ZXMvdHgtPHF1ZXVlPi90eF9tYXhyYXRlCitEYXRlOgkJTWFyY2ggMjAxNQorS2VybmVsVmVyc2lvbjoJNC4xCitDb250YWN0OgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitEZXNjcmlwdGlvbjoKKwkJQSBNYnBzIG1heC1yYXRlIHNldCBmb3IgdGhlIHF1ZXVlLCBhIHZhbHVlIG9mIHplcm8gbWVhbnMgZGlzYWJsZWQsCisJCWRlZmF1bHQgaXMgZGlzYWJsZWQuCisKIFdoYXQ6CQkvc3lzL2NsYXNzLzxpZmFjZT4vcXVldWVzL3R4LTxxdWV1ZT4veHBzX2NwdXMKIERhdGU6CQlOb3ZlbWJlciAyMDEwCiBLZXJuZWxWZXJzaW9uOgkyLjYuMzgKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZCBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZAppbmRleCBiNjQ5MGUxLi40ODk0MmNhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkCkBAIC04LDMgKzgsMTMgQEAKIAkJcmVwb3J0IGRlc2NyaXB0b3IuCiAJCVRoaXMgZmlsZSBjYW5ub3QgYmUgd3JpdHRlbi4KIFVzZXJzOgkJSElEQVBJIGxpYnJhcnkgKGh0dHA6Ly93d3cuc2lnbmFsMTEudXMvb3NzL2hpZGFwaSkKKworV2hhdDoJCUZvciBVU0IgZGV2aWNlcwk6IC9zeXMvYnVzL3VzYi9kZXZpY2VzLzxidXNudW0+LTxkZXZudW0+Ojxjb25maWcgbnVtPi48aW50ZXJmYWNlIG51bT4vPGhpZC1idXM+Ojx2ZW5kb3ItaWQ+Ojxwcm9kdWN0LWlkPi48bnVtPi9jb3VudHJ5CisJCUZvciBCVCBkZXZpY2VzCTogL3N5cy9jbGFzcy9ibHVldG9vdGgvaGNpPGFkZHI+LzxoaWQtYnVzPjo8dmVuZG9yLWlkPjo8cHJvZHVjdC1pZD4uPG51bT4vY291bnRyeQorCQlTeW1saW5rCQk6IC9zeXMvY2xhc3MvaGlkcmF3L2hpZHJhdzxudW0+L2RldmljZS9jb3VudHJ5CitEYXRlOgkJRmVicnVhcnkgMjAxNQorS2VybmVsVmVyc2lvbjoJMy4xOQorQ29udGFjdDoJT2xpdmllciBHYXkgPG9nYXlAbG9naXRlY2guY29tPgorRGVzY3JpcHRpb246CVdoZW4gcmVhZCwgdGhpcyBmaWxlIHJldHVybnMgdGhlIGhleCBpbnRlZ2VyIHZhbHVlIGluIEFTQ0lJCisJCW9mIHRoZSBkZXZpY2UncyBISUQgY291bnRyeSBjb2RlIChlLmcuIDIxIGZvciBVUykuCisJCVRoaXMgZmlsZSBjYW5ub3QgYmUgd3JpdHRlbi4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1sb2dpdGVjaC1sZzRmZiBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZHJpdmVyLWhpZC1sb2dpdGVjaC1sZzRmZgppbmRleCAxNjdkOTAzLi5iM2Y2YTJhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWRyaXZlci1oaWQtbG9naXRlY2gtbGc0ZmYKKysrIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kcml2ZXItaGlkLWxvZ2l0ZWNoLWxnNGZmCkBAIC01LDMgKzUsNDggQEAKIERlc2NyaXB0aW9uOglEaXNwbGF5IG1pbmltdW0sIG1heGltdW0gYW5kIGN1cnJlbnQgcmFuZ2Ugb2YgdGhlIHN0ZWVyaW5nCiAJCXdoZWVsLiBXcml0aW5nIGEgdmFsdWUgd2l0aGluIG1pbiBhbmQgbWF4IGJvdW5kYXJpZXMgc2V0cyB0aGUKIAkJcmFuZ2Ugb2YgdGhlIHdoZWVsLgorCitXaGF0OgkJL3N5cy9idXMvaGlkL2RyaXZlcnMvbG9naXRlY2gvPGRldj4vYWx0ZXJuYXRlX21vZGVzCitEYXRlOgkJRmViIDIwMTUKK0tlcm5lbFZlcnNpb246CTQuMQorQ29udGFjdDoJTWljaGFsIE1hbMO9IDxtYWRjYXR4c3RlckBnbWFpbC5jb20+CitEZXNjcmlwdGlvbjoJRGlzcGxheXMgYSBzZXQgb2YgYWx0ZXJuYXRlIG1vZGVzIHN1cHBvcnRlZCBieSBhIHdoZWVsLiBFYWNoCisJCW1vZGUgaXMgbGlzdGVkIGFzIGZvbGxvd3M6CisJCSAgVGFnOiBNb2RlIE5hbWUKKwkJQ3VycmVudGx5IGFjdGl2ZSBtb2RlIGlzIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrLiBMaXN0IGFsc28KKwkJY29udGFpbnMgYW4gYWJzdHJhY3QgaXRlbSAibmF0aXZlIiB3aGljaCBhbHdheXMgZGVub3RlcyB0aGUKKwkJbmF0aXZlIG1vZGUgb2YgdGhlIHdoZWVsLiBFY2hvaW5nIHRoZSBtb2RlIHRhZyBzd2l0Y2hlcyB0aGUKKwkJd2hlZWwgaW50byB0aGUgY29ycmVzcG9uZGluZyBtb2RlLiBEZXBlbmRpbmcgb24gdGhlIGV4YWN0IG1vZGVsCisJCW9mIHRoZSB3aGVlbCBub3QgYWxsIGxpc3RlZCBtb2RlcyBtaWdodCBhbHdheXMgYmUgc2VsZWN0YWJsZS4KKwkJSWYgYSB3aGVlbCBjYW5ub3QgYmUgc3dpdGNoZWQgaW50byB0aGUgZGVzaXJlZCBtb2RlLCAtRUlOVkFMCisJCWlzIHJldHVybmVkIGFjY29tcGFuaWVkIHdpdGggYW4gZXhwbGFuYXRvcnkgbWVzc2FnZSBpbiB0aGUKKwkJa2VybmVsIGxvZy4KKwkJVGhpcyBlbnRyeSBpcyBub3QgY3JlYXRlZCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgb25seSBvbmUgbW9kZS4KKworCQlDdXJyZW50bHkgc3VwcG9ydGVkIG1vZGUgc3dpdGNoZXM6CisJCURyaXZpbmcgRm9yY2UgUHJvOgorCQkgIERGLUVYIC0tPiBERlAKKworCQlHMjU6CisJCSAgREYtRVggLS0+IERGUCAtLT4gRzI1CisKKwkJRzI3OgorCQkgIERGLUVYIDwqPiBERlAgPC0+IEcyNSA8LT4gRzI3CisJCSAgREYtRVggPCotLS0tLS0tLT4gRzI1IDwtPiBHMjcKKwkJICBERi1FWCA8Ki0tLS0tLS0tLS0tLS0tLS0+IEcyNworCisJCURGR1Q6CisJCSAgREYtRVggPCo+IERGUCA8LT4gREZHVAorCQkgIERGLUVYIDwqLS0tLS0tLS0+IERGR1QKKworCQkqIGhpZF9sb2dpdGVjaCBtb2R1bGUgbXVzdCBiZSBsb2FkZWQgd2l0aCBsZzRmZl9ub19hdXRvc3dpdGNoPTEKKwkJICBwYXJhbWV0ZXIgc2V0IGluIG9yZGVyIGZvciB0aGUgc3dpdGNoIHRvIERGLUVYIG1vZGUgdG8gd29yay4KKworV2hhdDoJCS9zeXMvYnVzL2hpZC9kcml2ZXJzL2xvZ2l0ZWNoLzxkZXY+L3JlYWxfaWQKK0RhdGU6CQlGZWIgMjAxNQorS2VybmVsVmVyc2lvbjoJNC4xCitDb250YWN0OglNaWNoYWwgTWFsw70gPG1hZGNhdHhzdGVyQGdtYWlsLmNvbT4KK0Rlc2NyaXB0aW9uOglEaXNwbGF5cyB0aGUgcmVhbCBtb2RlbCBvZiB0aGUgd2hlZWwgcmVnYXJkbGVzcyBvZiBhbnkKKwkJYWx0ZXJuYXRlIG1vZGUgdGhlIHdoZWVsIG1pZ2h0IGJlIHN3aXRjaGVkIHRvLgorCQlJdCBpcyBhIHJlYWQtb25seSB2YWx1ZS4KKwkJVGhpcyBlbnRyeSBpcyBub3QgY3JlYXRlZCBmb3IgZGV2aWNlcyB0aGF0IGhhdmUgb25seSBvbmUgbW9kZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9jcnlwdG8tQVBJLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svY3J5cHRvLUFQSS50bXBsCmluZGV4IDA0YThjMjQuLmVmYzhkOTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9jcnlwdG8tQVBJLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2NyeXB0by1BUEkudG1wbApAQCAtNTA5LDYgKzUwOSwyNzAgQEAKICAgICAgc2VsZWN0IGl0IGR1ZSB0byB0aGUgdXNlZCB0eXBlIGFuZCBtYXNrIGZpZWxkLgogICAgIDwvcGFyYT4KICAgIDwvc2VjdDE+CisKKyAgIDxzZWN0MT48dGl0bGU+SW50ZXJuYWwgU3RydWN0dXJlIG9mIEtlcm5lbCBDcnlwdG8gQVBJPC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICBUaGUga2VybmVsIGNyeXB0byBBUEkgaGFzIGFuIGludGVybmFsIHN0cnVjdHVyZSB3aGVyZSBhIGNpcGhlcgorICAgICBpbXBsZW1lbnRhdGlvbiBtYXkgdXNlIG1hbnkgbGF5ZXJzIGFuZCBpbmRpcmVjdGlvbnMuIFRoaXMgc2VjdGlvbgorICAgICBzaGFsbCBoZWxwIHRvIGNsYXJpZnkgaG93IHRoZSBrZXJuZWwgY3J5cHRvIEFQSSB1c2VzCisgICAgIHZhcmlvdXMgY29tcG9uZW50cyB0byBpbXBsZW1lbnQgdGhlIGNvbXBsZXRlIGNpcGhlci4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgVGhlIGZvbGxvd2luZyBzdWJzZWN0aW9ucyBleHBsYWluIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgYmFzZWQKKyAgICAgb24gZXhpc3RpbmcgY2lwaGVyIGltcGxlbWVudGF0aW9ucy4gVGhlIGZpcnN0IHNlY3Rpb24gYWRkcmVzc2VzCisgICAgIHRoZSBtb3N0IGNvbXBsZXggc2NlbmFyaW8gd2hlcmUgYWxsIG90aGVyIHNjZW5hcmlvcyBmb3JtIGEgbG9naWNhbAorICAgICBzdWJzZXQuCisgICAgPC9wYXJhPgorCisgICAgPHNlY3QyPjx0aXRsZT5HZW5lcmljIEFFQUQgQ2lwaGVyIFN0cnVjdHVyZTwvdGl0bGU+CisKKyAgICAgPHBhcmE+CisgICAgICBUaGUgZm9sbG93aW5nIEFTQ0lJIGFydCBkZWNvbXBvc2VzIHRoZSBrZXJuZWwgY3J5cHRvIEFQSSBsYXllcnMKKyAgICAgIHdoZW4gdXNpbmcgdGhlIEFFQUQgY2lwaGVyIHdpdGggdGhlIGF1dG9tYXRlZCBJViBnZW5lcmF0aW9uLiBUaGUKKyAgICAgIHNob3duIGV4YW1wbGUgaXMgdXNlZCBieSB0aGUgSVBTRUMgbGF5ZXIuCisgICAgIDwvcGFyYT4KKworICAgICA8cGFyYT4KKyAgICAgIEZvciBvdGhlciB1c2UgY2FzZXMgb2YgQUVBRCBjaXBoZXJzLCB0aGUgQVNDSUkgYXJ0IGFwcGxpZXMgYXMKKyAgICAgIHdlbGwsIGJ1dCB0aGUgY2FsbGVyIG1heSBub3QgdXNlIHRoZSBHSVZDSVBIRVIgaW50ZXJmYWNlLiBJbgorICAgICAgdGhpcyBjYXNlLCB0aGUgY2FsbGVyIG11c3QgZ2VuZXJhdGUgdGhlIElWLgorICAgICA8L3BhcmE+CisKKyAgICAgPHBhcmE+CisgICAgICBUaGUgZGVwaWN0ZWQgZXhhbXBsZSBkZWNvbXBvc2VzIHRoZSBBRUFEIGNpcGhlciBvZiBHQ00oQUVTKSBiYXNlZAorICAgICAgb24gdGhlIGdlbmVyaWMgQyBpbXBsZW1lbnRhdGlvbnMgKGdjbS5jLCBhZXMtZ2VuZXJpYy5jLCBjdHIuYywKKyAgICAgIGdoYXNoLWdlbmVyaWMuYywgc2VxaXYuYykuIFRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIHNlcnZlcyBhcyBhbgorICAgICAgZXhhbXBsZSBzaG93aW5nIHRoZSBjb21wbGV0ZSBsb2dpYyBvZiB0aGUga2VybmVsIGNyeXB0byBBUEkuCisgICAgIDwvcGFyYT4KKworICAgICA8cGFyYT4KKyAgICAgIEl0IGlzIHBvc3NpYmxlIHRoYXQgc29tZSBzdHJlYW1saW5lZCBjaXBoZXIgaW1wbGVtZW50YXRpb25zIChsaWtlCisgICAgICBBRVMtTkkpIHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIG1lcmdpbmcgYXNwZWN0cyB3aGljaCBpbiB0aGUgdmlldworICAgICAgb2YgdGhlIGtlcm5lbCBjcnlwdG8gQVBJIGNhbm5vdCBiZSBkZWNvbXBvc2VkIGludG8gbGF5ZXJzIGFueSBtb3JlLgorICAgICAgSW4gY2FzZSBvZiB0aGUgQUVTLU5JIGltcGxlbWVudGF0aW9uLCB0aGUgQ1RSIG1vZGUsIHRoZSBHSEFTSAorICAgICAgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBBRVMgY2lwaGVyIGFyZSBhbGwgbWVyZ2VkIGludG8gb25lIGNpcGhlcgorICAgICAgaW1wbGVtZW50YXRpb24gcmVnaXN0ZXJlZCB3aXRoIHRoZSBrZXJuZWwgY3J5cHRvIEFQSS4gSW4gdGhpcyBjYXNlLAorICAgICAgdGhlIGNvbmNlcHQgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgQVNDSUkgYXJ0IGFwcGxpZXMgdG9vLiBIb3dldmVyLAorICAgICAgdGhlIGRlY29tcG9zaXRpb24gb2YgR0NNIGludG8gdGhlIGluZGl2aWR1YWwgc3ViLWNvbXBvbmVudHMKKyAgICAgIGJ5IHRoZSBrZXJuZWwgY3J5cHRvIEFQSSBpcyBub3QgZG9uZSBhbnkgbW9yZS4KKyAgICAgPC9wYXJhPgorCisgICAgIDxwYXJhPgorICAgICAgRWFjaCBibG9jayBpbiB0aGUgZm9sbG93aW5nIEFTQ0lJIGFydCBpcyBhbiBpbmRlcGVuZGVudCBjaXBoZXIKKyAgICAgIGluc3RhbmNlIG9idGFpbmVkIGZyb20gdGhlIGtlcm5lbCBjcnlwdG8gQVBJLiBFYWNoIGJsb2NrCisgICAgICBpcyBhY2Nlc3NlZCBieSB0aGUgY2FsbGVyIG9yIGJ5IG90aGVyIGJsb2NrcyB1c2luZyB0aGUgQVBJIGZ1bmN0aW9ucworICAgICAgZGVmaW5lZCBieSB0aGUga2VybmVsIGNyeXB0byBBUEkgZm9yIHRoZSBjaXBoZXIgaW1wbGVtZW50YXRpb24gdHlwZS4KKyAgICAgPC9wYXJhPgorCisgICAgIDxwYXJhPgorICAgICAgVGhlIGJsb2NrcyBiZWxvdyBpbmRpY2F0ZSB0aGUgY2lwaGVyIHR5cGUgYXMgd2VsbCBhcyB0aGUgc3BlY2lmaWMKKyAgICAgIGxvZ2ljIGltcGxlbWVudGVkIGluIHRoZSBjaXBoZXIuCisgICAgIDwvcGFyYT4KKworICAgICA8cGFyYT4KKyAgICAgIFRoZSBBU0NJSSBhcnQgcGljdHVyZSBhbHNvIGluZGljYXRlcyB0aGUgY2FsbCBzdHJ1Y3R1cmUsIGkuZS4gd2hvCisgICAgICBjYWxscyB3aGljaCBjb21wb25lbnQuIFRoZSBhcnJvd3MgcG9pbnQgdG8gdGhlIGludm9rZWQgYmxvY2sKKyAgICAgIHdoZXJlIHRoZSBjYWxsZXIgdXNlcyB0aGUgQVBJIGFwcGxpY2FibGUgdG8gdGhlIGNpcGhlciB0eXBlCisgICAgICBzcGVjaWZpZWQgZm9yIHRoZSBibG9jay4KKyAgICAgPC9wYXJhPgorCisgICAgIDxwcm9ncmFtbGlzdGluZz4KKzwhW0NEQVRBWwora2VybmVsIGNyeXB0byBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICBJUFNFQyBMYXllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAgICAgICAgICB8ICAgICAgICAgICAgKDEpCit8IGdpdmNpcGhlciB8IDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgZXNwX291dHB1dAorfCAgKHNlcWl2KSAgfCAtLS0rCisrLS0tLS0tLS0tLS0rICAgIHwKKyAgICAgICAgICAgICAgICAgfCAoMikKKystLS0tLS0tLS0tLSsgICAgfAorfCAgICAgICAgICAgfCA8LS0rICAgICAgICAgICAgICAgICgyKQorfCAgIGFlYWQgICAgfCA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIGVzcF9pbnB1dAorfCAgIChnY20pICAgfCAtLS0tLS0tLS0tLS0rCisrLS0tLS0tLS0tLS0rICAgICAgICAgICAgIHwKKyAgICAgIHwgKDMpICAgICAgICAgICAgICAgfCAoNSkKKyAgICAgIHYgICAgICAgICAgICAgICAgICAgdgorKy0tLS0tLS0tLS0tKyAgICAgICArLS0tLS0tLS0tLS0rCit8ICAgICAgICAgICB8ICAgICAgIHwgICAgICAgICAgIHwKK3wgYWJsa2NpcGhlcnwgICAgICAgfCAgIGFoYXNoICAgfAorfCAgIChjdHIpICAgfCAtLS0rICB8ICAoZ2hhc2gpICB8CisrLS0tLS0tLS0tLS0rICAgIHwgICstLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICAgfAorKy0tLS0tLS0tLS0tKyAgICB8ICg0KQorfCAgICAgICAgICAgfCA8LS0rCit8ICAgY2lwaGVyICB8Cit8ICAgKGFlcykgICB8CisrLS0tLS0tLS0tLS0rCitdXT4KKyAgICAgPC9wcm9ncmFtbGlzdGluZz4KKworICAgICA8cGFyYT4KKyAgICAgIFRoZSBmb2xsb3dpbmcgY2FsbCBzZXF1ZW5jZSBpcyBhcHBsaWNhYmxlIHdoZW4gdGhlIElQU0VDIGxheWVyCisgICAgICB0cmlnZ2VycyBhbiBlbmNyeXB0aW9uIG9wZXJhdGlvbiB3aXRoIHRoZSBlc3Bfb3V0cHV0IGZ1bmN0aW9uLiBEdXJpbmcKKyAgICAgIGNvbmZpZ3VyYXRpb24sIHRoZSBhZG1pbmlzdHJhdG9yIHNldCB1cCB0aGUgdXNlIG9mIHJmYzQxMDYoZ2NtKGFlcykpIGFzCisgICAgICB0aGUgY2lwaGVyIGZvciBFU1AuIFRoZSBmb2xsb3dpbmcgY2FsbCBzZXF1ZW5jZSBpcyBub3cgZGVwaWN0ZWQgaW4gdGhlCisgICAgICBBU0NJSSBhcnQgYWJvdmU6CisgICAgIDwvcGFyYT4KKworICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIGVzcF9vdXRwdXQoKSBpbnZva2VzIGNyeXB0b19hZWFkX2dpdmVuY3J5cHQoKSB0byB0cmlnZ2VyIGFuIGVuY3J5cHRpb24KKyAgICAgICAgb3BlcmF0aW9uIG9mIHRoZSBHSVZDSVBIRVIgaW1wbGVtZW50YXRpb24uCisgICAgICAgPC9wYXJhPgorCisgICAgICAgPHBhcmE+CisgICAgICAgIEluIGNhc2Ugb2YgR0NNLCB0aGUgU0VRSVYgaW1wbGVtZW50YXRpb24gaXMgcmVnaXN0ZXJlZCBhcyBHSVZDSVBIRVIKKyAgICAgICAgaW4gY3J5cHRvX3JmYzQxMDZfYWxsb2MoKS4KKyAgICAgICA8L3BhcmE+CisKKyAgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIFNFUUlWIHBlcmZvcm1zIGl0cyBvcGVyYXRpb24gdG8gZ2VuZXJhdGUgYW4gSVYgd2hlcmUgdGhlIGNvcmUKKyAgICAgICAgZnVuY3Rpb24gaXMgc2VxaXZfZ2VuaXYoKS4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIE5vdywgU0VRSVYgdXNlcyB0aGUgQUVBRCBBUEkgZnVuY3Rpb24gY2FsbHMgdG8gaW52b2tlIHRoZSBhc3NvY2lhdGVkCisgICAgICAgIEFFQUQgY2lwaGVyLiBJbiBvdXIgY2FzZSwgZHVyaW5nIHRoZSBpbnN0YW50aWF0aW9uIG9mIFNFUUlWLCB0aGUKKyAgICAgICAgY2lwaGVyIGhhbmRsZSBmb3IgR0NNIGlzIHByb3ZpZGVkIHRvIFNFUUlWLiBUaGlzIG1lYW5zIHRoYXQgU0VRSVYKKyAgICAgICAgaW52b2tlcyBBRUFEIGNpcGhlciBvcGVyYXRpb25zIHdpdGggdGhlIEdDTSBjaXBoZXIgaGFuZGxlLgorICAgICAgIDwvcGFyYT4KKworICAgICAgIDxwYXJhPgorICAgICAgICBEdXJpbmcgaW5zdGFudGlhdGlvbiBvZiB0aGUgR0NNIGhhbmRsZSwgdGhlIENUUihBRVMpIGFuZCBHSEFTSAorICAgICAgICBjaXBoZXJzIGFyZSBpbnN0YW50aWF0ZWQuIFRoZSBjaXBoZXIgaGFuZGxlcyBmb3IgQ1RSKEFFUykgYW5kIEdIQVNICisgICAgICAgIGFyZSByZXRhaW5lZCBmb3IgbGF0ZXIgdXNlLgorICAgICAgIDwvcGFyYT4KKworICAgICAgIDxwYXJhPgorICAgICAgICBUaGUgR0NNIGltcGxlbWVudGF0aW9uIGlzIHJlc3BvbnNpYmxlIHRvIGludm9rZSB0aGUgQ1RSIG1vZGUgQUVTIGFuZAorICAgICAgICB0aGUgR0hBU0ggY2lwaGVyIGluIHRoZSByaWdodCBtYW5uZXIgdG8gaW1wbGVtZW50IHRoZSBHQ00KKyAgICAgICAgc3BlY2lmaWNhdGlvbi4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBHQ00gQUVBRCBjaXBoZXIgdHlwZSBpbXBsZW1lbnRhdGlvbiBub3cgaW52b2tlcyB0aGUgQUJMS0NJUEhFUiBBUEkKKyAgICAgICAgd2l0aCB0aGUgaW5zdGFudGlhdGVkIENUUihBRVMpIGNpcGhlciBoYW5kbGUuCisgICAgICAgPC9wYXJhPgorCisgICAgICAgPHBhcmE+CisJRHVyaW5nIGluc3RhbnRpYXRpb24gb2YgdGhlIENUUihBRVMpIGNpcGhlciwgdGhlIENJUEhFUiB0eXBlCisJaW1wbGVtZW50YXRpb24gb2YgQUVTIGlzIGluc3RhbnRpYXRlZC4gVGhlIGNpcGhlciBoYW5kbGUgZm9yIEFFUyBpcworCXJldGFpbmVkLgorICAgICAgIDwvcGFyYT4KKworICAgICAgIDxwYXJhPgorICAgICAgICBUaGF0IG1lYW5zIHRoYXQgdGhlIEFCTEtDSVBIRVIgaW1wbGVtZW50YXRpb24gb2YgQ1RSKEFFUykgb25seQorICAgICAgICBpbXBsZW1lbnRzIHRoZSBDVFIgYmxvY2sgY2hhaW5pbmcgbW9kZS4gQWZ0ZXIgcGVyZm9ybWluZyB0aGUgYmxvY2sKKyAgICAgICAgY2hhaW5pbmcgb3BlcmF0aW9uLCB0aGUgQ0lQSEVSIGltcGxlbWVudGF0aW9uIG9mIEFFUyBpcyBpbnZva2VkLgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIEFCTEtDSVBIRVIgb2YgQ1RSKEFFUykgbm93IGludm9rZXMgdGhlIENJUEhFUiBBUEkgd2l0aCB0aGUgQUVTCisgICAgICAgIGNpcGhlciBoYW5kbGUgdG8gZW5jcnlwdCBvbmUgYmxvY2suCisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKworICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBUaGUgR0NNIEFFQUQgaW1wbGVtZW50YXRpb24gYWxzbyBpbnZva2VzIHRoZSBHSEFTSCBjaXBoZXIKKyAgICAgICAgaW1wbGVtZW50YXRpb24gdmlhIHRoZSBBSEFTSCBBUEkuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC9vcmRlcmVkbGlzdD4KKworICAgICA8cGFyYT4KKyAgICAgIFdoZW4gdGhlIElQU0VDIGxheWVyIHRyaWdnZXJzIHRoZSBlc3BfaW5wdXQoKSBmdW5jdGlvbiwgdGhlIHNhbWUgY2FsbAorICAgICAgc2VxdWVuY2UgaXMgZm9sbG93ZWQgd2l0aCB0aGUgb25seSBkaWZmZXJlbmNlIHRoYXQgdGhlIG9wZXJhdGlvbiBzdGFydHMKKyAgICAgIHdpdGggc3RlcCAoMikuCisgICAgIDwvcGFyYT4KKyAgICA8L3NlY3QyPgorCisgICAgPHNlY3QyPjx0aXRsZT5HZW5lcmljIEJsb2NrIENpcGhlciBTdHJ1Y3R1cmU8L3RpdGxlPgorICAgICA8cGFyYT4KKyAgICAgIEdlbmVyaWMgYmxvY2sgY2lwaGVycyBmb2xsb3cgdGhlIHNhbWUgY29uY2VwdCBhcyBkZXBpY3RlZCB3aXRoIHRoZSBBU0NJSQorICAgICAgYXJ0IHBpY3R1cmUgYWJvdmUuCisgICAgIDwvcGFyYT4KKworICAgICA8cGFyYT4KKyAgICAgIEZvciBleGFtcGxlLCBDQkMoQUVTKSBpcyBpbXBsZW1lbnRlZCB3aXRoIGNiYy5jLCBhbmQgYWVzLWdlbmVyaWMuYy4gVGhlCisgICAgICBBU0NJSSBhcnQgcGljdHVyZSBhYm92ZSBhcHBsaWVzIGFzIHdlbGwgd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IG9ubHkKKyAgICAgIHN0ZXAgKDQpIGlzIHVzZWQgYW5kIHRoZSBBQkxLQ0lQSEVSIGJsb2NrIGNoYWluaW5nIG1vZGUgaXMgQ0JDLgorICAgICA8L3BhcmE+CisgICAgPC9zZWN0Mj4KKworICAgIDxzZWN0Mj48dGl0bGU+R2VuZXJpYyBLZXllZCBNZXNzYWdlIERpZ2VzdCBTdHJ1Y3R1cmU8L3RpdGxlPgorICAgICA8cGFyYT4KKyAgICAgIEtleWVkIG1lc3NhZ2UgZGlnZXN0IGltcGxlbWVudGF0aW9ucyBhZ2FpbiBmb2xsb3cgdGhlIHNhbWUgY29uY2VwdCBhcworICAgICAgZGVwaWN0ZWQgaW4gdGhlIEFTQ0lJIGFydCBwaWN0dXJlIGFib3ZlLgorICAgICA8L3BhcmE+CisKKyAgICAgPHBhcmE+CisgICAgICBGb3IgZXhhbXBsZSwgSE1BQyhTSEEyNTYpIGlzIGltcGxlbWVudGVkIHdpdGggaG1hYy5jIGFuZAorICAgICAgc2hhMjU2X2dlbmVyaWMuYy4gVGhlIGZvbGxvd2luZyBBU0NJSSBhcnQgaWxsdXN0cmF0ZXMgdGhlCisgICAgICBpbXBsZW1lbnRhdGlvbjoKKyAgICAgPC9wYXJhPgorCisgICAgIDxwcm9ncmFtbGlzdGluZz4KKzwhW0NEQVRBWwora2VybmVsIGNyeXB0byBBUEkgICAgICAgICAgICB8ICAgICAgIENhbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisrLS0tLS0tLS0tLS0rICAgICAgICAgKDEpICAgIHwKK3wgICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLSAgc29tZV9mdW5jdGlvbgorfCAgIGFoYXNoICAgfAorfCAgIChobWFjKSAgfCAtLS0rCisrLS0tLS0tLS0tLS0rICAgIHwKKyAgICAgICAgICAgICAgICAgfCAoMikKKystLS0tLS0tLS0tLSsgICAgfAorfCAgICAgICAgICAgfCA8LS0rCit8ICAgc2hhc2ggICB8Cit8ICAoc2hhMjU2KSB8CisrLS0tLS0tLS0tLS0rCitdXT4KKyAgICAgPC9wcm9ncmFtbGlzdGluZz4KKworICAgICA8cGFyYT4KKyAgICAgIFRoZSBmb2xsb3dpbmcgY2FsbCBzZXF1ZW5jZSBpcyBhcHBsaWNhYmxlIHdoZW4gYSBjYWxsZXIgdHJpZ2dlcnMKKyAgICAgIGFuIEhNQUMgb3BlcmF0aW9uOgorICAgICA8L3BhcmE+CisKKyAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBUaGUgQUhBU0ggQVBJIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCBieSB0aGUgY2FsbGVyLiBUaGUgSE1BQworICAgICAgICBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBpdHMgb3BlcmF0aW9uIGFzIG5lZWRlZC4KKyAgICAgICA8L3BhcmE+CisKKyAgICAgICA8cGFyYT4KKyAgICAgICAgRHVyaW5nIGluaXRpYWxpemF0aW9uIG9mIHRoZSBITUFDIGNpcGhlciwgdGhlIFNIQVNIIGNpcGhlciB0eXBlIG9mCisgICAgICAgIFNIQTI1NiBpcyBpbnN0YW50aWF0ZWQuIFRoZSBjaXBoZXIgaGFuZGxlIGZvciB0aGUgU0hBMjU2IGluc3RhbmNlIGlzCisgICAgICAgIHJldGFpbmVkLgorICAgICAgIDwvcGFyYT4KKworICAgICAgIDxwYXJhPgorICAgICAgICBBdCBvbmUgdGltZSwgdGhlIEhNQUMgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgYSBTSEEyNTYgb3BlcmF0aW9uCisgICAgICAgIHdoZXJlIHRoZSBTSEEyNTYgY2lwaGVyIGhhbmRsZSBpcyB1c2VkLgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIEhNQUMgaW5zdGFuY2Ugbm93IGludm9rZXMgdGhlIFNIQVNIIEFQSSB3aXRoIHRoZSBTSEEyNTYKKyAgICAgICAgY2lwaGVyIGhhbmRsZSB0byBjYWxjdWxhdGUgdGhlIG1lc3NhZ2UgZGlnZXN0LgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgPC9zZWN0Mj4KKyAgIDwvc2VjdDE+CiAgIDwvY2hhcHRlcj4KIAogICA8Y2hhcHRlciBpZD0iRGV2ZWxvcG1lbnQiPjx0aXRsZT5EZXZlbG9waW5nIENpcGhlciBBbGdvcml0aG1zPC90aXRsZT4KQEAgLTgwOCw2ICsxMDcyLDYwMiBAQAogICAgPC9zZWN0MT4KICAgPC9jaGFwdGVyPgogCisgIDxjaGFwdGVyIGlkPSJVc2VyIj48dGl0bGU+VXNlciBTcGFjZSBJbnRlcmZhY2U8L3RpdGxlPgorICAgPHNlY3QxPjx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgorICAgIDxwYXJhPgorICAgICBUaGUgY29uY2VwdHMgb2YgdGhlIGtlcm5lbCBjcnlwdG8gQVBJIHZpc2libGUgdG8ga2VybmVsIHNwYWNlIGlzIGZ1bGx5CisgICAgIGFwcGxpY2FibGUgdG8gdGhlIHVzZXIgc3BhY2UgaW50ZXJmYWNlIGFzIHdlbGwuIFRoZXJlZm9yZSwgdGhlIGtlcm5lbAorICAgICBjcnlwdG8gQVBJIGhpZ2ggbGV2ZWwgZGlzY3Vzc2lvbiBmb3IgdGhlIGluLWtlcm5lbCB1c2UgY2FzZXMgYXBwbGllcworICAgICBoZXJlIGFzIHdlbGwuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgIFRoZSBtYWpvciBkaWZmZXJlbmNlLCBob3dldmVyLCBpcyB0aGF0IHVzZXIgc3BhY2UgY2FuIG9ubHkgYWN0IGFzIGEKKyAgICAgY29uc3VtZXIgYW5kIG5ldmVyIGFzIGEgcHJvdmlkZXIgb2YgYSB0cmFuc2Zvcm1hdGlvbiBvciBjaXBoZXIgYWxnb3JpdGhtLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBUaGUgZm9sbG93aW5nIGNvdmVycyB0aGUgdXNlciBzcGFjZSBpbnRlcmZhY2UgZXhwb3J0ZWQgYnkgdGhlIGtlcm5lbAorICAgICBjcnlwdG8gQVBJLiBBIHdvcmtpbmcgZXhhbXBsZSBvZiB0aGlzIGRlc2NyaXB0aW9uIGlzIGxpYmtjYXBpIHRoYXQKKyAgICAgY2FuIGJlIG9idGFpbmVkIGZyb20gWzFdLiBUaGF0IGxpYnJhcnkgY2FuIGJlIHVzZWQgYnkgdXNlciBzcGFjZQorICAgICBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlIGNyeXB0b2dyYXBoaWMgc2VydmljZXMgZnJvbSB0aGUga2VybmVsLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBTb21lIGRldGFpbHMgb2YgdGhlIGluLWtlcm5lbCBrZXJuZWwgY3J5cHRvIEFQSSBhc3BlY3RzIGRvIG5vdAorICAgICBhcHBseSB0byB1c2VyIHNwYWNlLCBob3dldmVyLiBUaGlzIGluY2x1ZGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAgc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9ucy4gVGhlIHVzZXIgc3BhY2UgQVBJIGNhbGwKKyAgICAgaXMgZnVsbHkgc3luY2hyb25vdXMuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgIFsxXSBodHRwOi8vd3d3LmNocm9ub3guZGUvbGlia2NhcGkuaHRtbAorICAgIDwvcGFyYT4KKworICAgPC9zZWN0MT4KKworICAgPHNlY3QxPjx0aXRsZT5Vc2VyIFNwYWNlIEFQSSBHZW5lcmFsIFJlbWFya3M8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICBUaGUga2VybmVsIGNyeXB0byBBUEkgaXMgYWNjZXNzaWJsZSBmcm9tIHVzZXIgc3BhY2UuIEN1cnJlbnRseSwKKyAgICAgdGhlIGZvbGxvd2luZyBjaXBoZXJzIGFyZSBhY2Nlc3NpYmxlOgorICAgIDwvcGFyYT4KKworICAgIDxpdGVtaXplZGxpc3Q+CisgICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPk1lc3NhZ2UgZGlnZXN0IGluY2x1ZGluZyBrZXllZCBtZXNzYWdlIGRpZ2VzdCAoSE1BQywgQ01BQyk8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+U3ltbWV0cmljIGNpcGhlcnM8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+QUVBRCBjaXBoZXJzPC9wYXJhPgorICAgICA8L2xpc3RpdGVtPgorCisgICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPlJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yczwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgIDxwYXJhPgorICAgICBUaGUgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIHZpYSBzb2NrZXQgdHlwZSB1c2luZyB0aGUgdHlwZSBBRl9BTEcuCisgICAgIEluIGFkZGl0aW9uLCB0aGUgc2V0c29ja29wdCBvcHRpb24gdHlwZSBpcyBTT0xfQUxHLiBJbiBjYXNlIHRoZQorICAgICB1c2VyIHNwYWNlIGhlYWRlciBmaWxlcyBkbyBub3QgZXhwb3J0IHRoZXNlIGZsYWdzIHlldCwgdXNlIHRoZQorICAgICBmb2xsb3dpbmcgbWFjcm9zOgorICAgIDwvcGFyYT4KKworICAgIDxwcm9ncmFtbGlzdGluZz4KKyNpZm5kZWYgQUZfQUxHCisjZGVmaW5lIEFGX0FMRyAzOAorI2VuZGlmCisjaWZuZGVmIFNPTF9BTEcKKyNkZWZpbmUgU09MX0FMRyAyNzkKKyNlbmRpZgorICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICA8cGFyYT4KKyAgICAgQSBjaXBoZXIgaXMgYWNjZXNzZWQgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIGRvbmUgZm9yIHRoZSBpbi1rZXJuZWwKKyAgICAgQVBJIGNhbGxzLiBUaGlzIGluY2x1ZGVzIHRoZSBnZW5lcmljIHZzLiB1bmlxdWUgbmFtaW5nIHNjaGVtYSBmb3IKKyAgICAgY2lwaGVycyBhcyB3ZWxsIGFzIHRoZSBlbmZvcmNlbWVudCBvZiBwcmlvcml0aWVzIGZvciBnZW5lcmljIG5hbWVzLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBUbyBpbnRlcmFjdCB3aXRoIHRoZSBrZXJuZWwgY3J5cHRvIEFQSSwgYSBzb2NrZXQgbXVzdCBiZQorICAgICBjcmVhdGVkIGJ5IHRoZSB1c2VyIHNwYWNlIGFwcGxpY2F0aW9uLiBVc2VyIHNwYWNlIGludm9rZXMgdGhlIGNpcGhlcgorICAgICBvcGVyYXRpb24gd2l0aCB0aGUgc2VuZCgpL3dyaXRlKCkgc3lzdGVtIGNhbGwgZmFtaWx5LiBUaGUgcmVzdWx0IG9mIHRoZQorICAgICBjaXBoZXIgb3BlcmF0aW9uIGlzIG9idGFpbmVkIHdpdGggdGhlIHJlYWQoKS9yZWN2KCkgc3lzdGVtIGNhbGwgZmFtaWx5LgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBUaGUgZm9sbG93aW5nIEFQSSBjYWxscyBhc3N1bWUgdGhhdCB0aGUgc29ja2V0IGRlc2NyaXB0b3IKKyAgICAgaXMgYWxyZWFkeSBvcGVuZWQgYnkgdGhlIHVzZXIgc3BhY2UgYXBwbGljYXRpb24gYW5kIGRpc2N1c3NlcyBvbmx5CisgICAgIHRoZSBrZXJuZWwgY3J5cHRvIEFQSSBzcGVjaWZpYyBpbnZvY2F0aW9ucy4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgVG8gaW5pdGlhbGl6ZSB0aGUgc29ja2V0IGludGVyZmFjZSwgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBoYXMgdG8KKyAgICAgYmUgcGVyZm9ybWVkIGJ5IHRoZSBjb25zdW1lcjoKKyAgICA8L3BhcmE+CisKKyAgICA8b3JkZXJlZGxpc3Q+CisgICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgIENyZWF0ZSBhIHNvY2tldCBvZiB0eXBlIEFGX0FMRyB3aXRoIHRoZSBzdHJ1Y3Qgc29ja2FkZHJfYWxnCisgICAgICAgcGFyYW1ldGVyIHNwZWNpZmllZCBiZWxvdyBmb3IgdGhlIGRpZmZlcmVudCBjaXBoZXIgdHlwZXMuCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgSW52b2tlIGJpbmQgd2l0aCB0aGUgc29ja2V0IGRlc2NyaXB0b3IKKyAgICAgIDwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKworICAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT4KKyAgICAgICBJbnZva2UgYWNjZXB0IHdpdGggdGhlIHNvY2tldCBkZXNjcmlwdG9yLiBUaGUgYWNjZXB0IHN5c3RlbSBjYWxsCisgICAgICAgcmV0dXJucyBhIG5ldyBmaWxlIGRlc2NyaXB0b3IgdGhhdCBpcyB0byBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGgKKyAgICAgICB0aGUgcGFydGljdWxhciBjaXBoZXIgaW5zdGFuY2UuIFdoZW4gaW52b2tpbmcgc2VuZC93cml0ZSBvciByZWN2L3JlYWQKKyAgICAgICBzeXN0ZW0gY2FsbHMgdG8gc2VuZCBkYXRhIHRvIHRoZSBrZXJuZWwgb3Igb2J0YWluIGRhdGEgZnJvbSB0aGUKKyAgICAgICBrZXJuZWwsIHRoZSBmaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYWNjZXB0IG11c3QgYmUgdXNlZC4KKyAgICAgIDwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICA8L29yZGVyZWRsaXN0PgorICAgPC9zZWN0MT4KKworICAgPHNlY3QxPjx0aXRsZT5Jbi1wbGFjZSBDaXBoZXIgb3BlcmF0aW9uPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgSnVzdCBsaWtlIHRoZSBpbi1rZXJuZWwgb3BlcmF0aW9uIG9mIHRoZSBrZXJuZWwgY3J5cHRvIEFQSSwgdGhlIHVzZXIKKyAgICAgc3BhY2UgaW50ZXJmYWNlIGFsbG93cyB0aGUgY2lwaGVyIG9wZXJhdGlvbiBpbi1wbGFjZS4gVGhhdCBtZWFucyB0aGF0CisgICAgIHRoZSBpbnB1dCBidWZmZXIgdXNlZCBmb3IgdGhlIHNlbmQvd3JpdGUgc3lzdGVtIGNhbGwgYW5kIHRoZSBvdXRwdXQKKyAgICAgYnVmZmVyIHVzZWQgYnkgdGhlIHJlYWQvcmVjdiBzeXN0ZW0gY2FsbCBtYXkgYmUgb25lIGFuZCB0aGUgc2FtZS4KKyAgICAgVGhpcyBpcyBvZiBwYXJ0aWN1bGFyIGludGVyZXN0IGZvciBzeW1tZXRyaWMgY2lwaGVyIG9wZXJhdGlvbnMgd2hlcmUgYQorICAgICBjb3B5aW5nIG9mIHRoZSBvdXRwdXQgZGF0YSB0byBpdHMgZmluYWwgZGVzdGluYXRpb24gY2FuIGJlIGF2b2lkZWQuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgIElmIGEgY29uc3VtZXIgb24gdGhlIG90aGVyIGhhbmQgd2FudHMgdG8gbWFpbnRhaW4gdGhlIHBsYWludGV4dCBhbmQKKyAgICAgdGhlIGNpcGhlcnRleHQgaW4gZGlmZmVyZW50IG1lbW9yeSBsb2NhdGlvbnMsIGFsbCBhIGNvbnN1bWVyIG5lZWRzCisgICAgIHRvIGRvIGlzIHRvIHByb3ZpZGUgZGlmZmVyZW50IG1lbW9yeSBwb2ludGVycyBmb3IgdGhlIGVuY3J5cHRpb24gYW5kCisgICAgIGRlY3J5cHRpb24gb3BlcmF0aW9uLgorICAgIDwvcGFyYT4KKyAgIDwvc2VjdDE+CisKKyAgIDxzZWN0MT48dGl0bGU+TWVzc2FnZSBEaWdlc3QgQVBJPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgVGhlIG1lc3NhZ2UgZGlnZXN0IHR5cGUgdG8gYmUgdXNlZCBmb3IgdGhlIGNpcGhlciBvcGVyYXRpb24gaXMKKyAgICAgc2VsZWN0ZWQgd2hlbiBpbnZva2luZyB0aGUgYmluZCBzeXNjYWxsLiBiaW5kIHJlcXVpcmVzIHRoZSBjYWxsZXIKKyAgICAgdG8gcHJvdmlkZSBhIGZpbGxlZCBzdHJ1Y3Qgc29ja2FkZHIgZGF0YSBzdHJ1Y3R1cmUuIFRoaXMgZGF0YQorICAgICBzdHJ1Y3R1cmUgbXVzdCBiZSBmaWxsZWQgYXMgZm9sbG93czoKKyAgICA8L3BhcmE+CisKKyAgICA8cHJvZ3JhbWxpc3Rpbmc+CitzdHJ1Y3Qgc29ja2FkZHJfYWxnIHNhID0geworCS5zYWxnX2ZhbWlseSA9IEFGX0FMRywKKwkuc2FsZ190eXBlID0gImhhc2giLCAvKiB0aGlzIHNlbGVjdHMgdGhlIGhhc2ggbG9naWMgaW4gdGhlIGtlcm5lbCAqLworCS5zYWxnX25hbWUgPSAic2hhMSIgLyogdGhpcyBpcyB0aGUgY2lwaGVyIG5hbWUgKi8KK307CisgICAgPC9wcm9ncmFtbGlzdGluZz4KKworICAgIDxwYXJhPgorICAgICBUaGUgc2FsZ190eXBlIHZhbHVlICJoYXNoIiBhcHBsaWVzIHRvIG1lc3NhZ2UgZGlnZXN0cyBhbmQga2V5ZWQKKyAgICAgbWVzc2FnZSBkaWdlc3RzLiBUaG91Z2gsIGEga2V5ZWQgbWVzc2FnZSBkaWdlc3QgaXMgcmVmZXJlbmNlZCBieQorICAgICB0aGUgYXBwcm9wcmlhdGUgc2FsZ19uYW1lLiBQbGVhc2Ugc2VlIGJlbG93IGZvciB0aGUgc2V0c29ja29wdAorICAgICBpbnRlcmZhY2UgdGhhdCBleHBsYWlucyBob3cgdGhlIGtleSBjYW4gYmUgc2V0IGZvciBhIGtleWVkIG1lc3NhZ2UKKyAgICAgZGlnZXN0LgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBVc2luZyB0aGUgc2VuZCgpIHN5c3RlbSBjYWxsLCB0aGUgYXBwbGljYXRpb24gcHJvdmlkZXMgdGhlIGRhdGEgdGhhdAorICAgICBzaG91bGQgYmUgcHJvY2Vzc2VkIHdpdGggdGhlIG1lc3NhZ2UgZGlnZXN0LiBUaGUgc2VuZCBzeXN0ZW0gY2FsbAorICAgICBhbGxvd3MgdGhlIGZvbGxvd2luZyBmbGFncyB0byBiZSBzcGVjaWZpZWQ6CisgICAgPC9wYXJhPgorCisgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgTVNHX01PUkU6IElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBzZW5kIHN5c3RlbSBjYWxsIGFjdHMgbGlrZSBhCisgICAgICAgbWVzc2FnZSBkaWdlc3QgdXBkYXRlIGZ1bmN0aW9uIHdoZXJlIHRoZSBmaW5hbCBoYXNoIGlzIG5vdAorICAgICAgIHlldCBjYWxjdWxhdGVkLiBJZiB0aGUgZmxhZyBpcyBub3Qgc2V0LCB0aGUgc2VuZCBzeXN0ZW0gY2FsbAorICAgICAgIGNhbGN1bGF0ZXMgdGhlIGZpbmFsIG1lc3NhZ2UgZGlnZXN0IGltbWVkaWF0ZWx5LgorICAgICAgPC9wYXJhPgorICAgICA8L2xpc3RpdGVtPgorICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgPHBhcmE+CisgICAgIFdpdGggdGhlIHJlY3YoKSBzeXN0ZW0gY2FsbCwgdGhlIGFwcGxpY2F0aW9uIGNhbiByZWFkIHRoZSBtZXNzYWdlCisgICAgIGRpZ2VzdCBmcm9tIHRoZSBrZXJuZWwgY3J5cHRvIEFQSS4gSWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwgZm9yIHRoZQorICAgICBtZXNzYWdlIGRpZ2VzdCwgdGhlIGZsYWcgTVNHX1RSVU5DIGlzIHNldCBieSB0aGUga2VybmVsLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBJbiBvcmRlciB0byBzZXQgYSBtZXNzYWdlIGRpZ2VzdCBrZXksIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIG11c3QgdXNlCisgICAgIHRoZSBzZXRzb2Nrb3B0KCkgb3B0aW9uIG9mIEFMR19TRVRfS0VZLiBJZiB0aGUga2V5IGlzIG5vdCBzZXQgdGhlIEhNQUMKKyAgICAgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCB3aXRob3V0IHRoZSBpbml0aWFsIEhNQUMgc3RhdGUgY2hhbmdlIGNhdXNlZCBieQorICAgICB0aGUga2V5LgorICAgIDwvcGFyYT4KKyAgIDwvc2VjdDE+CisKKyAgIDxzZWN0MT48dGl0bGU+U3ltbWV0cmljIENpcGhlciBBUEk8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICBUaGUgb3BlcmF0aW9uIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgbWVzc2FnZSBkaWdlc3QgZGlzY3Vzc2lvbi4KKyAgICAgRHVyaW5nIGluaXRpYWxpemF0aW9uLCB0aGUgc3RydWN0IHNvY2thZGRyIGRhdGEgc3RydWN0dXJlIG11c3QgYmUKKyAgICAgZmlsbGVkIGFzIGZvbGxvd3M6CisgICAgPC9wYXJhPgorCisgICAgPHByb2dyYW1saXN0aW5nPgorc3RydWN0IHNvY2thZGRyX2FsZyBzYSA9IHsKKwkuc2FsZ19mYW1pbHkgPSBBRl9BTEcsCisJLnNhbGdfdHlwZSA9ICJza2NpcGhlciIsIC8qIHRoaXMgc2VsZWN0cyB0aGUgc3ltbWV0cmljIGNpcGhlciAqLworCS5zYWxnX25hbWUgPSAiY2JjKGFlcykiIC8qIHRoaXMgaXMgdGhlIGNpcGhlciBuYW1lICovCit9OworICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICA8cGFyYT4KKyAgICAgQmVmb3JlIGRhdGEgY2FuIGJlIHNlbnQgdG8gdGhlIGtlcm5lbCB1c2luZyB0aGUgd3JpdGUvc2VuZCBzeXN0ZW0KKyAgICAgY2FsbCBmYW1pbHksIHRoZSBjb25zdW1lciBtdXN0IHNldCB0aGUga2V5LiBUaGUga2V5IHNldHRpbmcgaXMKKyAgICAgZGVzY3JpYmVkIHdpdGggdGhlIHNldHNvY2tvcHQgaW52b2NhdGlvbiBiZWxvdy4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgVXNpbmcgdGhlIHNlbmRtc2coKSBzeXN0ZW0gY2FsbCwgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzIHRoZSBkYXRhIHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBmb3IgZW5jcnlwdGlvbiBvciBkZWNyeXB0aW9uLiBJbiBhZGRpdGlvbiwgdGhlIElWIGlzCisgICAgIHNwZWNpZmllZCB3aXRoIHRoZSBkYXRhIHN0cnVjdHVyZSBwcm92aWRlZCBieSB0aGUgc2VuZG1zZygpIHN5c3RlbSBjYWxsLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBUaGUgc2VuZG1zZyBzeXN0ZW0gY2FsbCBwYXJhbWV0ZXIgb2Ygc3RydWN0IG1zZ2hkciBpcyBlbWJlZGRlZCBpbnRvIHRoZQorICAgICBzdHJ1Y3QgY21zZ2hkciBkYXRhIHN0cnVjdHVyZS4gU2VlIHJlY3YoMikgYW5kIGNtc2coMykgZm9yIG1vcmUKKyAgICAgaW5mb3JtYXRpb24gb24gaG93IHRoZSBjbXNnaGRyIGRhdGEgc3RydWN0dXJlIGlzIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUKKyAgICAgc2VuZC9yZWN2IHN5c3RlbSBjYWxsIGZhbWlseS4gVGhhdCBjbXNnaGRyIGRhdGEgc3RydWN0dXJlIGhvbGRzIHRoZQorICAgICBmb2xsb3dpbmcgaW5mb3JtYXRpb24gc3BlY2lmaWVkIHdpdGggYSBzZXBhcmF0ZSBoZWFkZXIgaW5zdGFuY2VzOgorICAgIDwvcGFyYT4KKworICAgIDxpdGVtaXplZGxpc3Q+CisgICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgIHNwZWNpZmljYXRpb24gb2YgdGhlIGNpcGhlciBvcGVyYXRpb24gdHlwZSB3aXRoIG9uZSBvZiB0aGVzZSBmbGFnczoKKyAgICAgIDwvcGFyYT4KKyAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgPGxpc3RpdGVtPgorICAgICAgICA8cGFyYT5BTEdfT1BfRU5DUllQVCAtIGVuY3J5cHRpb24gb2YgZGF0YTwvcGFyYT4KKyAgICAgICA8L2xpc3RpdGVtPgorICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgPHBhcmE+QUxHX09QX0RFQ1JZUFQgLSBkZWNyeXB0aW9uIG9mIGRhdGE8L3BhcmE+CisgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICA8L2xpc3RpdGVtPgorCisgICAgIDxsaXN0aXRlbT4KKyAgICAgIDxwYXJhPgorICAgICAgIHNwZWNpZmljYXRpb24gb2YgdGhlIElWIGluZm9ybWF0aW9uIG1hcmtlZCB3aXRoIHRoZSBmbGFnIEFMR19TRVRfSVYKKyAgICAgIDwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgIDxwYXJhPgorICAgICBUaGUgc2VuZCBzeXN0ZW0gY2FsbCBmYW1pbHkgYWxsb3dzIHRoZSBmb2xsb3dpbmcgZmxhZyB0byBiZSBzcGVjaWZpZWQ6CisgICAgPC9wYXJhPgorCisgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgTVNHX01PUkU6IElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBzZW5kIHN5c3RlbSBjYWxsIGFjdHMgbGlrZSBhCisgICAgICAgY2lwaGVyIHVwZGF0ZSBmdW5jdGlvbiB3aGVyZSBtb3JlIGlucHV0IGRhdGEgaXMgZXhwZWN0ZWQKKyAgICAgICB3aXRoIGEgc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9mIHRoZSBzZW5kIHN5c3RlbSBjYWxsLgorICAgICAgPC9wYXJhPgorICAgICA8L2xpc3RpdGVtPgorICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgPHBhcmE+CisgICAgIE5vdGU6IFRoZSBrZXJuZWwgcmVwb3J0cyAtRUlOVkFMIGZvciBhbnkgdW5leHBlY3RlZCBkYXRhLiBUaGUgY2FsbGVyCisgICAgIG11c3QgbWFrZSBzdXJlIHRoYXQgYWxsIGRhdGEgbWF0Y2hlcyB0aGUgY29uc3RyYWludHMgZ2l2ZW4gaW4KKyAgICAgL3Byb2MvY3J5cHRvIGZvciB0aGUgc2VsZWN0ZWQgY2lwaGVyLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBXaXRoIHRoZSByZWN2KCkgc3lzdGVtIGNhbGwsIHRoZSBhcHBsaWNhdGlvbiBjYW4gcmVhZCB0aGUgcmVzdWx0IG9mCisgICAgIHRoZSBjaXBoZXIgb3BlcmF0aW9uIGZyb20gdGhlIGtlcm5lbCBjcnlwdG8gQVBJLiBUaGUgb3V0cHV0IGJ1ZmZlcgorICAgICBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRvIGhvbGQgYWxsIGJsb2NrcyBvZiB0aGUgZW5jcnlwdGVkIG9yCisgICAgIGRlY3J5cHRlZCBkYXRhLiBJZiB0aGUgb3V0cHV0IGRhdGEgc2l6ZSBpcyBzbWFsbGVyLCBvbmx5IGFzIG1hbnkKKyAgICAgYmxvY2tzIGFyZSByZXR1cm5lZCB0aGF0IGZpdCBpbnRvIHRoYXQgb3V0cHV0IGJ1ZmZlciBzaXplLgorICAgIDwvcGFyYT4KKyAgIDwvc2VjdDE+CisKKyAgIDxzZWN0MT48dGl0bGU+QUVBRCBDaXBoZXIgQVBJPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgVGhlIG9wZXJhdGlvbiBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIHN5bW1ldHJpYyBjaXBoZXIgZGlzY3Vzc2lvbi4KKyAgICAgRHVyaW5nIGluaXRpYWxpemF0aW9uLCB0aGUgc3RydWN0IHNvY2thZGRyIGRhdGEgc3RydWN0dXJlIG11c3QgYmUKKyAgICAgZmlsbGVkIGFzIGZvbGxvd3M6CisgICAgPC9wYXJhPgorCisgICAgPHByb2dyYW1saXN0aW5nPgorc3RydWN0IHNvY2thZGRyX2FsZyBzYSA9IHsKKwkuc2FsZ19mYW1pbHkgPSBBRl9BTEcsCisJLnNhbGdfdHlwZSA9ICJhZWFkIiwgLyogdGhpcyBzZWxlY3RzIHRoZSBzeW1tZXRyaWMgY2lwaGVyICovCisJLnNhbGdfbmFtZSA9ICJnY20oYWVzKSIgLyogdGhpcyBpcyB0aGUgY2lwaGVyIG5hbWUgKi8KK307CisgICAgPC9wcm9ncmFtbGlzdGluZz4KKworICAgIDxwYXJhPgorICAgICBCZWZvcmUgZGF0YSBjYW4gYmUgc2VudCB0byB0aGUga2VybmVsIHVzaW5nIHRoZSB3cml0ZS9zZW5kIHN5c3RlbQorICAgICBjYWxsIGZhbWlseSwgdGhlIGNvbnN1bWVyIG11c3Qgc2V0IHRoZSBrZXkuIFRoZSBrZXkgc2V0dGluZyBpcworICAgICBkZXNjcmliZWQgd2l0aCB0aGUgc2V0c29ja29wdCBpbnZvY2F0aW9uIGJlbG93LgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBJbiBhZGRpdGlvbiwgYmVmb3JlIGRhdGEgY2FuIGJlIHNlbnQgdG8gdGhlIGtlcm5lbCB1c2luZyB0aGUKKyAgICAgd3JpdGUvc2VuZCBzeXN0ZW0gY2FsbCBmYW1pbHksIHRoZSBjb25zdW1lciBtdXN0IHNldCB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgdGFnIHNpemUuIFRvIHNldCB0aGUgYXV0aGVudGljYXRpb24gdGFnIHNpemUsIHRoZSBjYWxsZXIgbXVzdCB1c2UgdGhlCisgICAgIHNldHNvY2tvcHQgaW52b2NhdGlvbiBkZXNjcmliZWQgYmVsb3cuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgIFVzaW5nIHRoZSBzZW5kbXNnKCkgc3lzdGVtIGNhbGwsIHRoZSBhcHBsaWNhdGlvbiBwcm92aWRlcyB0aGUgZGF0YSB0aGF0IHNob3VsZCBiZSBwcm9jZXNzZWQgZm9yIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbi4gSW4gYWRkaXRpb24sIHRoZSBJViBpcworICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgZGF0YSBzdHJ1Y3R1cmUgcHJvdmlkZWQgYnkgdGhlIHNlbmRtc2coKSBzeXN0ZW0gY2FsbC4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgVGhlIHNlbmRtc2cgc3lzdGVtIGNhbGwgcGFyYW1ldGVyIG9mIHN0cnVjdCBtc2doZHIgaXMgZW1iZWRkZWQgaW50byB0aGUKKyAgICAgc3RydWN0IGNtc2doZHIgZGF0YSBzdHJ1Y3R1cmUuIFNlZSByZWN2KDIpIGFuZCBjbXNnKDMpIGZvciBtb3JlCisgICAgIGluZm9ybWF0aW9uIG9uIGhvdyB0aGUgY21zZ2hkciBkYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvZ2V0aGVyIHdpdGggdGhlCisgICAgIHNlbmQvcmVjdiBzeXN0ZW0gY2FsbCBmYW1pbHkuIFRoYXQgY21zZ2hkciBkYXRhIHN0cnVjdHVyZSBob2xkcyB0aGUKKyAgICAgZm9sbG93aW5nIGluZm9ybWF0aW9uIHNwZWNpZmllZCB3aXRoIGEgc2VwYXJhdGUgaGVhZGVyIGluc3RhbmNlczoKKyAgICA8L3BhcmE+CisKKyAgICA8aXRlbWl6ZWRsaXN0PgorICAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT4KKyAgICAgICBzcGVjaWZpY2F0aW9uIG9mIHRoZSBjaXBoZXIgb3BlcmF0aW9uIHR5cGUgd2l0aCBvbmUgb2YgdGhlc2UgZmxhZ3M6CisgICAgICA8L3BhcmE+CisgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgPHBhcmE+QUxHX09QX0VOQ1JZUFQgLSBlbmNyeXB0aW9uIG9mIGRhdGE8L3BhcmE+CisgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgIDxwYXJhPkFMR19PUF9ERUNSWVBUIC0gZGVjcnlwdGlvbiBvZiBkYXRhPC9wYXJhPgorICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgPC9saXN0aXRlbT4KKworICAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT4KKyAgICAgICBzcGVjaWZpY2F0aW9uIG9mIHRoZSBJViBpbmZvcm1hdGlvbiBtYXJrZWQgd2l0aCB0aGUgZmxhZyBBTEdfU0VUX0lWCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgc3BlY2lmaWNhdGlvbiBvZiB0aGUgYXNzb2NpYXRlZCBhdXRoZW50aWNhdGlvbiBkYXRhIChBQUQpIHdpdGggdGhlCisgICAgICAgZmxhZyBBTEdfU0VUX0FFQURfQVNTT0NMRU4uIFRoZSBBQUQgaXMgc2VudCB0byB0aGUga2VybmVsIHRvZ2V0aGVyCisgICAgICAgd2l0aCB0aGUgcGxhaW50ZXh0IC8gY2lwaGVydGV4dC4gU2VlIGJlbG93IGZvciB0aGUgbWVtb3J5IHN0cnVjdHVyZS4KKyAgICAgIDwvcGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgIDxwYXJhPgorICAgICBUaGUgc2VuZCBzeXN0ZW0gY2FsbCBmYW1pbHkgYWxsb3dzIHRoZSBmb2xsb3dpbmcgZmxhZyB0byBiZSBzcGVjaWZpZWQ6CisgICAgPC9wYXJhPgorCisgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgTVNHX01PUkU6IElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBzZW5kIHN5c3RlbSBjYWxsIGFjdHMgbGlrZSBhCisgICAgICAgY2lwaGVyIHVwZGF0ZSBmdW5jdGlvbiB3aGVyZSBtb3JlIGlucHV0IGRhdGEgaXMgZXhwZWN0ZWQKKyAgICAgICB3aXRoIGEgc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9mIHRoZSBzZW5kIHN5c3RlbSBjYWxsLgorICAgICAgPC9wYXJhPgorICAgICA8L2xpc3RpdGVtPgorICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgPHBhcmE+CisgICAgIE5vdGU6IFRoZSBrZXJuZWwgcmVwb3J0cyAtRUlOVkFMIGZvciBhbnkgdW5leHBlY3RlZCBkYXRhLiBUaGUgY2FsbGVyCisgICAgIG11c3QgbWFrZSBzdXJlIHRoYXQgYWxsIGRhdGEgbWF0Y2hlcyB0aGUgY29uc3RyYWludHMgZ2l2ZW4gaW4KKyAgICAgL3Byb2MvY3J5cHRvIGZvciB0aGUgc2VsZWN0ZWQgY2lwaGVyLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBXaXRoIHRoZSByZWN2KCkgc3lzdGVtIGNhbGwsIHRoZSBhcHBsaWNhdGlvbiBjYW4gcmVhZCB0aGUgcmVzdWx0IG9mCisgICAgIHRoZSBjaXBoZXIgb3BlcmF0aW9uIGZyb20gdGhlIGtlcm5lbCBjcnlwdG8gQVBJLiBUaGUgb3V0cHV0IGJ1ZmZlcgorICAgICBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIGRlZmluZWQgd2l0aCB0aGUgbWVtb3J5IHN0cnVjdHVyZSBiZWxvdy4KKyAgICAgSWYgdGhlIG91dHB1dCBkYXRhIHNpemUgaXMgc21hbGxlciwgdGhlIGNpcGhlciBvcGVyYXRpb24gaXMgbm90IHBlcmZvcm1lZC4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgVGhlIGF1dGhlbnRpY2F0ZWQgZGVjcnlwdGlvbiBvcGVyYXRpb24gbWF5IGluZGljYXRlIGFuIGludGVncml0eSBlcnJvci4KKyAgICAgU3VjaCBicmVhY2ggaW4gaW50ZWdyaXR5IGlzIG1hcmtlZCB3aXRoIHRoZSAtRUJBRE1TRyBlcnJvciBjb2RlLgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0Mj48dGl0bGU+QUVBRCBNZW1vcnkgU3RydWN0dXJlPC90aXRsZT4KKyAgICAgPHBhcmE+CisgICAgICBUaGUgQUVBRCBjaXBoZXIgb3BlcmF0ZXMgd2l0aCB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uIHRoYXQKKyAgICAgIGlzIGNvbW11bmljYXRlZCBiZXR3ZWVuIHVzZXIgYW5kIGtlcm5lbCBzcGFjZSBhcyBvbmUgZGF0YSBzdHJlYW06CisgICAgIDwvcGFyYT4KKworICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPnBsYWludGV4dCBvciBjaXBoZXJ0ZXh0PC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKworICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPmFzc29jaWF0ZWQgYXV0aGVudGljYXRpb24gZGF0YSAoQUFEKTwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFyYT5hdXRoZW50aWNhdGlvbiB0YWc8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICA8cGFyYT4KKyAgICAgIFRoZSBzaXplcyBvZiB0aGUgQUFEIGFuZCB0aGUgYXV0aGVudGljYXRpb24gdGFnIGFyZSBwcm92aWRlZCB3aXRoCisgICAgICB0aGUgc2VuZG1zZyBhbmQgc2V0c29ja29wdCBjYWxscyAoc2VlIHRoZXJlKS4gQXMgdGhlIGtlcm5lbCBrbm93cworICAgICAgdGhlIHNpemUgb2YgdGhlIGVudGlyZSBkYXRhIHN0cmVhbSwgdGhlIGtlcm5lbCBpcyBub3cgYWJsZSB0bworICAgICAgY2FsY3VsYXRlIHRoZSByaWdodCBvZmZzZXRzIG9mIHRoZSBkYXRhIGNvbXBvbmVudHMgaW4gdGhlIGRhdGEKKyAgICAgIHN0cmVhbS4KKyAgICAgPC9wYXJhPgorCisgICAgIDxwYXJhPgorICAgICAgVGhlIHVzZXIgc3BhY2UgY2FsbGVyIG11c3QgYXJyYW5nZSB0aGUgYWZvcmVtZW50aW9uZWQgaW5mb3JtYXRpb24KKyAgICAgIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgICAgIDwvcGFyYT4KKworICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBBRUFEIGVuY3J5cHRpb24gaW5wdXQ6IEFBRCB8fCBwbGFpbnRleHQKKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorCisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIEFFQUQgZGVjcnlwdGlvbiBpbnB1dDogQUFEIHx8IGNpcGhlcnRleHQgfHwgYXV0aGVudGljYXRpb24gdGFnCisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgPHBhcmE+CisgICAgICBUaGUgb3V0cHV0IGJ1ZmZlciB0aGUgdXNlciBzcGFjZSBjYWxsZXIgcHJvdmlkZXMgbXVzdCBiZSBhdCBsZWFzdCBhcworICAgICAgbGFyZ2UgdG8gaG9sZCB0aGUgZm9sbG93aW5nIGRhdGE6CisgICAgIDwvcGFyYT4KKworICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBBRUFEIGVuY3J5cHRpb24gb3V0cHV0OiBjaXBoZXJ0ZXh0IHx8IGF1dGhlbnRpY2F0aW9uIHRhZworICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgQUVBRCBkZWNyeXB0aW9uIG91dHB1dDogcGxhaW50ZXh0CisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgPC9zZWN0Mj4KKyAgIDwvc2VjdDE+CisKKyAgIDxzZWN0MT48dGl0bGU+UmFuZG9tIE51bWJlciBHZW5lcmF0b3IgQVBJPC90aXRsZT4KKyAgICA8cGFyYT4KKyAgICAgQWdhaW4sIHRoZSBvcGVyYXRpb24gaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBvdGhlciBBUElzLgorICAgICBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIHRoZSBzdHJ1Y3Qgc29ja2FkZHIgZGF0YSBzdHJ1Y3R1cmUgbXVzdCBiZQorICAgICBmaWxsZWQgYXMgZm9sbG93czoKKyAgICA8L3BhcmE+CisKKyAgICA8cHJvZ3JhbWxpc3Rpbmc+CitzdHJ1Y3Qgc29ja2FkZHJfYWxnIHNhID0geworCS5zYWxnX2ZhbWlseSA9IEFGX0FMRywKKwkuc2FsZ190eXBlID0gInJuZyIsIC8qIHRoaXMgc2VsZWN0cyB0aGUgc3ltbWV0cmljIGNpcGhlciAqLworCS5zYWxnX25hbWUgPSAiZHJiZ19ub3ByX3NoYTI1NiIgLyogdGhpcyBpcyB0aGUgY2lwaGVyIG5hbWUgKi8KK307CisgICAgPC9wcm9ncmFtbGlzdGluZz4KKworICAgIDxwYXJhPgorICAgICBEZXBlbmRpbmcgb24gdGhlIFJORyB0eXBlLCB0aGUgUk5HIG11c3QgYmUgc2VlZGVkLiBUaGUgc2VlZCBpcyBwcm92aWRlZAorICAgICB1c2luZyB0aGUgc2V0c29ja29wdCBpbnRlcmZhY2UgdG8gc2V0IHRoZSBrZXkuIEZvciBleGFtcGxlLCB0aGUKKyAgICAgYW5zaV9jcHJuZyByZXF1aXJlcyBhIHNlZWQuIFRoZSBEUkJHcyBkbyBub3QgcmVxdWlyZSBhIHNlZWQsIGJ1dAorICAgICBtYXkgYmUgc2VlZGVkLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBVc2luZyB0aGUgcmVhZCgpL3JlY3Ztc2coKSBzeXN0ZW0gY2FsbHMsIHJhbmRvbSBudW1iZXJzIGNhbiBiZSBvYnRhaW5lZC4KKyAgICAgVGhlIGtlcm5lbCBnZW5lcmF0ZXMgYXQgbW9zdCAxMjggYnl0ZXMgaW4gb25lIGNhbGwuIElmIHVzZXIgc3BhY2UKKyAgICAgcmVxdWlyZXMgbW9yZSBkYXRhLCBtdWx0aXBsZSBjYWxscyB0byByZWFkKCkvcmVjdm1zZygpIG11c3QgYmUgbWFkZS4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgV0FSTklORzogVGhlIHVzZXIgc3BhY2UgY2FsbGVyIG1heSBpbnZva2UgdGhlIGluaXRpYWxseSBtZW50aW9uZWQKKyAgICAgYWNjZXB0IHN5c3RlbSBjYWxsIG11bHRpcGxlIHRpbWVzLiBJbiB0aGlzIGNhc2UsIHRoZSByZXR1cm5lZCBmaWxlCisgICAgIGRlc2NyaXB0b3JzIGhhdmUgdGhlIHNhbWUgc3RhdGUuCisgICAgPC9wYXJhPgorCisgICA8L3NlY3QxPgorCisgICA8c2VjdDE+PHRpdGxlPlplcm8tQ29weSBJbnRlcmZhY2U8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICBJbiBhZGRpdGlvbiB0byB0aGUgc2VuZC93cml0ZS9yZWFkL3JlY3Ygc3lzdGVtIGNhbGwgZmFtaWx0eSwgdGhlIEFGX0FMRworICAgICBpbnRlcmZhY2UgY2FuIGJlIGFjY2Vzc2VkIHdpdGggdGhlIHplcm8tY29weSBpbnRlcmZhY2Ugb2Ygc3BsaWNlL3Ztc3BsaWNlLgorICAgICBBcyB0aGUgbmFtZSBpbmRpY2F0ZXMsIHRoZSBrZXJuZWwgdHJpZXMgdG8gYXZvaWQgYSBjb3B5IG9wZXJhdGlvbiBpbnRvCisgICAgIGtlcm5lbCBzcGFjZS4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgVGhlIHplcm8tY29weSBvcGVyYXRpb24gcmVxdWlyZXMgZGF0YSB0byBiZSBhbGlnbmVkIGF0IHRoZSBwYWdlIGJvdW5kYXJ5LgorICAgICBOb24tYWxpZ25lZCBkYXRhIGNhbiBiZSB1c2VkIGFzIHdlbGwsIGJ1dCBtYXkgcmVxdWlyZSBtb3JlIG9wZXJhdGlvbnMgb2YKKyAgICAgdGhlIGtlcm5lbCB3aGljaCB3b3VsZCBkZWZlYXQgdGhlIHNwZWVkIGdhaW5zIG9idGFpbmVkIGZyb20gdGhlIHplcm8tY29weQorICAgICBpbnRlcmZhY2UuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgIFRoZSBzeXN0ZW0taW50ZXJlbnQgbGltaXQgZm9yIHRoZSBzaXplIG9mIG9uZSB6ZXJvLWNvcHkgb3BlcmF0aW9uIGlzCisgICAgIDE2IHBhZ2VzLiBJZiBtb3JlIGRhdGEgaXMgdG8gYmUgc2VudCB0byBBRl9BTEcsIHVzZXIgc3BhY2UgbXVzdCBzbGljZQorICAgICB0aGUgaW5wdXQgaW50byBzZWdtZW50cyB3aXRoIGEgbWF4aW11bSBzaXplIG9mIDE2IHBhZ2VzLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBaZXJvLWNvcHkgY2FuIGJlIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvZGUgZXhhbXBsZSAoYSBjb21wbGV0ZSB3b3JraW5nCisgICAgIGV4YW1wbGUgaXMgcHJvdmlkZWQgd2l0aCBsaWJrY2FwaSk6CisgICAgPC9wYXJhPgorCisgICAgPHByb2dyYW1saXN0aW5nPgoraW50IHBpcGVzWzJdOworCitwaXBlKHBpcGVzKTsKKy8qIGlucHV0IGRhdGEgaW4gaW92ICovCit2bXNwbGljZShwaXBlc1sxXSwgaW92LCBpb3ZsZW4sIFNQTElDRV9GX0dJRlQpOworLyogb3BmZCBpcyB0aGUgZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGZyb20gYWNjZXB0KCkgc3lzdGVtIGNhbGwgKi8KK3NwbGljZShwaXBlc1swXSwgTlVMTCwgb3BmZCwgTlVMTCwgcmV0LCAwKTsKK3JlYWQob3BmZCwgb3V0LCBvdXRsZW4pOworICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgIDwvc2VjdDE+CisKKyAgIDxzZWN0MT48dGl0bGU+U2V0c29ja29wdCBJbnRlcmZhY2U8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICBJbiBhZGRpdGlvbiB0byB0aGUgcmVhZC9yZWN2IGFuZCBzZW5kL3dyaXRlIHN5c3RlbSBjYWxsIGhhbmRsaW5nCisgICAgIHRvIHNlbmQgYW5kIHJldHJpZXZlIGRhdGEgc3ViamVjdCB0byB0aGUgY2lwaGVyIG9wZXJhdGlvbiwgYSBjb25zdW1lcgorICAgICBhbHNvIG5lZWRzIHRvIHNldCB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNpcGhlciBvcGVyYXRpb24uCisgICAgIFRoaXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpcyBzZXQgdXNpbmcgdGhlIHNldHNvY2tvcHQgc3lzdGVtIGNhbGwKKyAgICAgdGhhdCBtdXN0IGJlIGludm9rZWQgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBvcGVuIGNpcGhlcgorICAgICAoaS5lLiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IHRoZSBhY2NlcHQgc3lzdGVtIGNhbGwpLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBFYWNoIHNldHNvY2tvcHQgaW52b2NhdGlvbiBtdXN0IHVzZSB0aGUgbGV2ZWwgU09MX0FMRy4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgVGhlIHNldHNvY2tvcHQgaW50ZXJmYWNlIGFsbG93cyBzZXR0aW5nIHRoZSBmb2xsb3dpbmcgZGF0YSB1c2luZworICAgICB0aGUgbWVudGlvbmVkIG9wdG5hbWU6CisgICAgPC9wYXJhPgorCisgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgQUxHX1NFVF9LRVkgLS0gU2V0dGluZyB0aGUga2V5LiBLZXkgc2V0dGluZyBpcyBhcHBsaWNhYmxlIHRvOgorICAgICAgPC9wYXJhPgorICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgIDxwYXJhPnRoZSBza2NpcGhlciBjaXBoZXIgdHlwZSAoc3ltbWV0cmljIGNpcGhlcnMpPC9wYXJhPgorICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgPGxpc3RpdGVtPgorICAgICAgICA8cGFyYT50aGUgaGFzaCBjaXBoZXIgdHlwZSAoa2V5ZWQgbWVzc2FnZSBkaWdlc3RzKTwvcGFyYT4KKyAgICAgICA8L2xpc3RpdGVtPgorICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgPHBhcmE+dGhlIEFFQUQgY2lwaGVyIHR5cGU8L3BhcmE+CisgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgIDxwYXJhPnRoZSBSTkcgY2lwaGVyIHR5cGUgdG8gcHJvdmlkZSB0aGUgc2VlZDwvcGFyYT4KKyAgICAgICA8L2xpc3RpdGVtPgorICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgPGxpc3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgQUxHX1NFVF9BRUFEX0FVVEhTSVpFIC0tIFNldHRpbmcgdGhlIGF1dGhlbnRpY2F0aW9uIHRhZyBzaXplCisgICAgICAgZm9yIEFFQUQgY2lwaGVycy4gRm9yIGEgZW5jcnlwdGlvbiBvcGVyYXRpb24sIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAgIHRhZyBvZiB0aGUgZ2l2ZW4gc2l6ZSB3aWxsIGJlIGdlbmVyYXRlZC4gRm9yIGEgZGVjcnlwdGlvbiBvcGVyYXRpb24sCisgICAgICAgdGhlIHByb3ZpZGVkIGNpcGhlcnRleHQgaXMgYXNzdW1lZCB0byBjb250YWluIGFuIGF1dGhlbnRpY2F0aW9uIHRhZworICAgICAgIG9mIHRoZSBnaXZlbiBzaXplIChzZWUgc2VjdGlvbiBhYm91dCBBRUFEIG1lbW9yeSBsYXlvdXQgYmVsb3cpLgorICAgICAgPC9wYXJhPgorICAgICA8L2xpc3RpdGVtPgorICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICA8L3NlY3QxPgorCisgICA8c2VjdDE+PHRpdGxlPlVzZXIgc3BhY2UgQVBJIGV4YW1wbGU8L3RpdGxlPgorICAgIDxwYXJhPgorICAgICBQbGVhc2Ugc2VlIFsxXSBmb3IgbGlia2NhcGkgd2hpY2ggcHJvdmlkZXMgYW4gZWFzeS10by11c2Ugd3JhcHBlcgorICAgICBhcm91bmQgdGhlIGFmb3JlbWVudGlvbmVkIE5ldGxpbmsga2VybmVsIGludGVyZmFjZS4gWzFdIGFsc28gY29udGFpbnMKKyAgICAgYSB0ZXN0IGFwcGxpY2F0aW9uIHRoYXQgaW52b2tlcyBhbGwgbGlia2NhcGkgQVBJIGNhbGxzLgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICBbMV0gaHR0cDovL3d3dy5jaHJvbm94LmRlL2xpYmtjYXBpLmh0bWwKKyAgICA8L3BhcmE+CisKKyAgIDwvc2VjdDE+CisKKyAgPC9jaGFwdGVyPgorCiAgIDxjaGFwdGVyIGlkPSJBUEkiPjx0aXRsZT5Qcm9ncmFtbWluZyBJbnRlcmZhY2U8L3RpdGxlPgogICAgPHNlY3QxPjx0aXRsZT5CbG9jayBDaXBoZXIgQ29udGV4dCBEYXRhIFN0cnVjdHVyZXM8L3RpdGxlPgogIVBpbmNsdWRlL2xpbnV4L2NyeXB0by5oIEJsb2NrIENpcGhlciBDb250ZXh0IERhdGEgU3RydWN0dXJlcwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dCBiL0RvY3VtZW50YXRpb24vUENJL3BjaS50eHQKaW5kZXggOTUxODAwNi4uMTIzODgxZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9QQ0kvcGNpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1BDSS9wY2kudHh0CkBAIC01NjQsMTQgKzU2NCwxNCBAQAogOC4gVmVuZG9yIGFuZCBkZXZpY2UgaWRlbnRpZmljYXRpb25zCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KIAotT25lIGlzIG5vdCByZXF1aXJlZCB0byBhZGQgbmV3IGRldmljZSBpZHMgdG8gaW5jbHVkZS9saW51eC9wY2lfaWRzLmguCi1QbGVhc2UgYWRkIFBDSV9WRU5ET1JfSURfeHh4IGZvciB2ZW5kb3JzIGFuZCBhIGhleCBjb25zdGFudCBmb3IgZGV2aWNlIGlkcy4KK0RvIG5vdCBhZGQgbmV3IGRldmljZSBvciB2ZW5kb3IgSURzIHRvIGluY2x1ZGUvbGludXgvcGNpX2lkcy5oIHVubGVzcyB0aGV5CithcmUgc2hhcmVkIGFjcm9zcyBtdWx0aXBsZSBkcml2ZXJzLiAgWW91IGNhbiBhZGQgcHJpdmF0ZSBkZWZpbml0aW9ucyBpbgoreW91ciBkcml2ZXIgaWYgdGhleSdyZSBoZWxwZnVsLCBvciBqdXN0IHVzZSBwbGFpbiBoZXggY29uc3RhbnRzLgogCi1QQ0lfVkVORE9SX0lEX3h4eCBjb25zdGFudHMgYXJlIHJlLXVzZWQuIFRoZSBkZXZpY2UgaWRzIGFyZSBhcmJpdHJhcnkKLWhleCBudW1iZXJzICh2ZW5kb3IgY29udHJvbGxlZCkgYW5kIG5vcm1hbGx5IHVzZWQgb25seSBpbiBhIHNpbmdsZQotbG9jYXRpb24sIHRoZSBwY2lfZGV2aWNlX2lkIHRhYmxlLgorVGhlIGRldmljZSBJRHMgYXJlIGFyYml0cmFyeSBoZXggbnVtYmVycyAodmVuZG9yIGNvbnRyb2xsZWQpIGFuZCBub3JtYWxseSB1c2VkCitvbmx5IGluIGEgc2luZ2xlIGxvY2F0aW9uLCB0aGUgcGNpX2RldmljZV9pZCB0YWJsZS4KIAotUGxlYXNlIERPIHN1Ym1pdCBuZXcgdmVuZG9yL2RldmljZSBpZHMgdG8gcGNpaWRzLnNvdXJjZWZvcmdlLm5ldCBwcm9qZWN0LgorUGxlYXNlIERPIHN1Ym1pdCBuZXcgdmVuZG9yL2RldmljZSBJRHMgdG8gaHR0cDovL3BjaWlkcy5zb3VyY2Vmb3JnZS5uZXQvLgogCiAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hY3BpL2FwZWkvZWluai50eHQgYi9Eb2N1bWVudGF0aW9uL2FjcGkvYXBlaS9laW5qLnR4dAppbmRleCBmNTE4NjFiLi5lNTUwYzhiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjcGkvYXBlaS9laW5qLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2FjcGkvYXBlaS9laW5qLnR4dApAQCAtMSwxMjkgKzEsMTc3IEBACiAJCQlBUEVJIEVycm9yIElOSmVjdGlvbgogCQkJfn5+fn5+fn5+fn5+fn5+fn5+fn4KIAotRUlOSiBwcm92aWRlcyBhIGhhcmR3YXJlIGVycm9yIGluamVjdGlvbiBtZWNoYW5pc20KLUl0IGlzIHZlcnkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3Rpbmcgb2Ygb3RoZXIgQVBFSSBhbmQgUkFTIGZlYXR1cmVzLgorRUlOSiBwcm92aWRlcyBhIGhhcmR3YXJlIGVycm9yIGluamVjdGlvbiBtZWNoYW5pc20uIEl0IGlzIHZlcnkgdXNlZnVsCitmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nIEFQRUkgYW5kIFJBUyBmZWF0dXJlcyBpbiBnZW5lcmFsLgogCi1UbyB1c2UgRUlOSiwgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgYXJlIGVuYWJsZWQgaW4geW91ciBrZXJuZWwKK1lvdSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgeW91ciBCSU9TIHN1cHBvcnRzIEVJTkogZmlyc3QuIEZvciB0aGF0LCBsb29rCitmb3IgZWFybHkgYm9vdCBtZXNzYWdlcyBzaW1pbGFyIHRvIHRoaXMgb25lOgorCitBQ1BJOiBFSU5KIDB4MDAwMDAwMDA3MzcwQTAwMCAwMDAxNTAgKHYwMSBJTlRFTCAgICAgICAgICAgMDAwMDAwMDEgSU5UTCAwMDAwMDAwMSkKKword2hpY2ggc2hvd3MgdGhhdCB0aGUgQklPUyBpcyBleHBvc2luZyBhbiBFSU5KIHRhYmxlIC0gaXQgaXMgdGhlCittZWNoYW5pc20gdGhyb3VnaCB3aGljaCB0aGUgaW5qZWN0aW9uIGlzIGRvbmUuCisKK0FsdGVybmF0aXZlbHksIGxvb2sgaW4gL3N5cy9maXJtd2FyZS9hY3BpL3RhYmxlcyBmb3IgYW4gIkVJTkoiIGZpbGUsCit3aGljaCBpcyBhIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2FtZSB0aGluZy4KKworSXQgZG9lc24ndCBuZWNlc3NhcmlseSBtZWFuIHRoYXQgRUlOSiBpcyBub3Qgc3VwcG9ydGVkIGlmIHRob3NlIGFib3ZlCitkb24ndCBleGlzdDogYmVmb3JlIHlvdSBnaXZlIHVwLCBnbyBpbnRvIEJJT1Mgc2V0dXAgdG8gc2VlIGlmIHRoZSBCSU9TCitoYXMgYW4gb3B0aW9uIHRvIGVuYWJsZSBlcnJvciBpbmplY3Rpb24uIExvb2sgZm9yIHNvbWV0aGluZyBjYWxsZWQgV0hFQQorb3Igc2ltaWxhci4gT2Z0ZW4sIHlvdSBuZWVkIHRvIGVuYWJsZSBhbiBBQ1BJNSBzdXBwb3J0IG9wdGlvbiBwcmlvciwgaW4KK29yZGVyIHRvIHNlZSB0aGUgQVBFSSxFSU5KLC4uLiBmdW5jdGlvbmFsaXR5IHN1cHBvcnRlZCBhbmQgZXhwb3NlZCBieQordGhlIEJJT1MgbWVudS4KKworVG8gdXNlIEVJTkosIG1ha2Ugc3VyZSB0aGUgZm9sbG93aW5nIGFyZSBvcHRpb25zIGVuYWJsZWQgaW4geW91ciBrZXJuZWwKIGNvbmZpZ3VyYXRpb246CiAKIENPTkZJR19ERUJVR19GUwogQ09ORklHX0FDUElfQVBFSQogQ09ORklHX0FDUElfQVBFSV9FSU5KCiAKLVRoZSB1c2VyIGludGVyZmFjZSBvZiBFSU5KIGlzIGRlYnVnIGZpbGUgc3lzdGVtLCB1bmRlciB0aGUKLWRpcmVjdG9yeSBhcGVpL2VpbmouIFRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIHByb3ZpZGVkLgorVGhlIEVJTkogdXNlciBpbnRlcmZhY2UgaXMgaW4gPGRlYnVnZnMgbW91bnQgcG9pbnQ+L2FwZWkvZWluai4KKworVGhlIGZvbGxvd2luZyBmaWxlcyBiZWxvbmcgdG8gaXQ6CiAKIC0gYXZhaWxhYmxlX2Vycm9yX3R5cGUKLSAgUmVhZGluZyB0aGlzIGZpbGUgcmV0dXJucyB0aGUgZXJyb3IgaW5qZWN0aW9uIGNhcGFiaWxpdHkgb2YgdGhlCi0gIHBsYXRmb3JtLCB0aGF0IGlzLCB3aGljaCBlcnJvciB0eXBlcyBhcmUgc3VwcG9ydGVkLiBUaGUgZXJyb3IgdHlwZQotICBkZWZpbml0aW9uIGlzIGFzIGZvbGxvdywgdGhlIGxlZnQgZmllbGQgaXMgdGhlIGVycm9yIHR5cGUgdmFsdWUsIHRoZQotICByaWdodCBmaWVsZCBpcyBlcnJvciBkZXNjcmlwdGlvbi4KIAotICAgIDB4MDAwMDAwMDEJUHJvY2Vzc29yIENvcnJlY3RhYmxlCi0gICAgMHgwMDAwMDAwMglQcm9jZXNzb3IgVW5jb3JyZWN0YWJsZSBub24tZmF0YWwKLSAgICAweDAwMDAwMDA0CVByb2Nlc3NvciBVbmNvcnJlY3RhYmxlIGZhdGFsCi0gICAgMHgwMDAwMDAwOCAgTWVtb3J5IENvcnJlY3RhYmxlCi0gICAgMHgwMDAwMDAxMCAgTWVtb3J5IFVuY29ycmVjdGFibGUgbm9uLWZhdGFsCi0gICAgMHgwMDAwMDAyMCAgTWVtb3J5IFVuY29ycmVjdGFibGUgZmF0YWwKLSAgICAweDAwMDAwMDQwCVBDSSBFeHByZXNzIENvcnJlY3RhYmxlCi0gICAgMHgwMDAwMDA4MAlQQ0kgRXhwcmVzcyBVbmNvcnJlY3RhYmxlIGZhdGFsCi0gICAgMHgwMDAwMDEwMAlQQ0kgRXhwcmVzcyBVbmNvcnJlY3RhYmxlIG5vbi1mYXRhbAotICAgIDB4MDAwMDAyMDAJUGxhdGZvcm0gQ29ycmVjdGFibGUKLSAgICAweDAwMDAwNDAwCVBsYXRmb3JtIFVuY29ycmVjdGFibGUgbm9uLWZhdGFsCi0gICAgMHgwMDAwMDgwMAlQbGF0Zm9ybSBVbmNvcnJlY3RhYmxlIGZhdGFsCisgIFRoaXMgZmlsZSBzaG93cyB3aGljaCBlcnJvciB0eXBlcyBhcmUgc3VwcG9ydGVkOgogCi0gIFRoZSBmb3JtYXQgb2YgZmlsZSBjb250ZW50cyBhcmUgYXMgYWJvdmUsIGV4Y2VwdCB0aGVyZSBhcmUgb25seSB0aGUKLSAgYXZhaWxhYmxlIGVycm9yIHR5cGUgbGluZXMuCisgIEVycm9yIFR5cGUgVmFsdWUJRXJyb3IgRGVzY3JpcHRpb24KKyAgPT09PT09PT09PT09PT09PQk9PT09PT09PT09PT09PT09PQorICAweDAwMDAwMDAxCQlQcm9jZXNzb3IgQ29ycmVjdGFibGUKKyAgMHgwMDAwMDAwMgkJUHJvY2Vzc29yIFVuY29ycmVjdGFibGUgbm9uLWZhdGFsCisgIDB4MDAwMDAwMDQJCVByb2Nlc3NvciBVbmNvcnJlY3RhYmxlIGZhdGFsCisgIDB4MDAwMDAwMDgJCU1lbW9yeSBDb3JyZWN0YWJsZQorICAweDAwMDAwMDEwCQlNZW1vcnkgVW5jb3JyZWN0YWJsZSBub24tZmF0YWwKKyAgMHgwMDAwMDAyMAkJTWVtb3J5IFVuY29ycmVjdGFibGUgZmF0YWwKKyAgMHgwMDAwMDA0MAkJUENJIEV4cHJlc3MgQ29ycmVjdGFibGUKKyAgMHgwMDAwMDA4MAkJUENJIEV4cHJlc3MgVW5jb3JyZWN0YWJsZSBmYXRhbAorICAweDAwMDAwMTAwCQlQQ0kgRXhwcmVzcyBVbmNvcnJlY3RhYmxlIG5vbi1mYXRhbAorICAweDAwMDAwMjAwCQlQbGF0Zm9ybSBDb3JyZWN0YWJsZQorICAweDAwMDAwNDAwCQlQbGF0Zm9ybSBVbmNvcnJlY3RhYmxlIG5vbi1mYXRhbAorICAweDAwMDAwODAwCQlQbGF0Zm9ybSBVbmNvcnJlY3RhYmxlIGZhdGFsCisKKyAgVGhlIGZvcm1hdCBvZiB0aGUgZmlsZSBjb250ZW50cyBhcmUgYXMgYWJvdmUsIGV4Y2VwdCBwcmVzZW50IGFyZSBvbmx5CisgIHRoZSBhdmFpbGFibGUgZXJyb3IgdHlwZXMuCiAKIC0gZXJyb3JfdHlwZQotICBUaGlzIGZpbGUgaXMgdXNlZCB0byBzZXQgdGhlIGVycm9yIHR5cGUgdmFsdWUuIFRoZSBlcnJvciB0eXBlIHZhbHVlCi0gIGlzIGRlZmluZWQgaW4gImF2YWlsYWJsZV9lcnJvcl90eXBlIiBkZXNjcmlwdGlvbi4KKworICBTZXQgdGhlIHZhbHVlIG9mIHRoZSBlcnJvciB0eXBlIGJlaW5nIGluamVjdGVkLiBQb3NzaWJsZSBlcnJvciB0eXBlcworICBhcmUgZGVmaW5lZCBpbiB0aGUgZmlsZSBhdmFpbGFibGVfZXJyb3JfdHlwZSBhYm92ZS4KIAogLSBlcnJvcl9pbmplY3QKLSAgV3JpdGUgYW55IGludGVnZXIgdG8gdGhpcyBmaWxlIHRvIHRyaWdnZXIgdGhlIGVycm9yCi0gIGluamVjdGlvbi4gQmVmb3JlIHRoaXMsIHBsZWFzZSBzcGVjaWZ5IGFsbCBuZWNlc3NhcnkgZXJyb3IKLSAgcGFyYW1ldGVycy4KKworICBXcml0ZSBhbnkgaW50ZWdlciB0byB0aGlzIGZpbGUgdG8gdHJpZ2dlciB0aGUgZXJyb3IgaW5qZWN0aW9uLiBNYWtlCisgIHN1cmUgeW91IGhhdmUgc3BlY2lmaWVkIGFsbCBuZWNlc3NhcnkgZXJyb3IgcGFyYW1ldGVycywgaS5lLiB0aGlzCisgIHdyaXRlIHNob3VsZCBiZSB0aGUgbGFzdCBzdGVwIHdoZW4gaW5qZWN0aW5nIGVycm9ycy4KIAogLSBmbGFncwotICBQcmVzZW50IGZvciBrZXJuZWwgdmVyc2lvbiAzLjEzIGFuZCBhYm92ZS4gVXNlZCB0byBzcGVjaWZ5IHdoaWNoCi0gIG9mIHBhcmFtezEuLjR9IGFyZSB2YWxpZCBhbmQgc2hvdWxkIGJlIHVzZWQgYnkgQklPUyBkdXJpbmcgaW5qZWN0aW9uLgotICBWYWx1ZSBpcyBhIGJpdG1hc2sgYXMgc3BlY2lmaWVkIGluIEFDUEk1LjAgc3BlYyBmb3IgdGhlCisKKyAgUHJlc2VudCBmb3Iga2VybmVsIHZlcnNpb25zIDMuMTMgYW5kIGFib3ZlLiBVc2VkIHRvIHNwZWNpZnkgd2hpY2gKKyAgb2YgcGFyYW17MS4uNH0gYXJlIHZhbGlkIGFuZCBzaG91bGQgYmUgdXNlZCBieSB0aGUgZmlybXdhcmUgZHVyaW5nCisgIGluamVjdGlvbi4gVmFsdWUgaXMgYSBiaXRtYXNrIGFzIHNwZWNpZmllZCBpbiBBQ1BJNS4wIHNwZWMgZm9yIHRoZQogICBTRVRfRVJST1JfVFlQRV9XSVRIX0FERFJFU1MgZGF0YSBzdHJ1Y3R1cmU6Ci0JQml0IDAgLSBQcm9jZXNzb3IgQVBJQyBmaWVsZCB2YWxpZCAoc2VlIHBhcmFtMyBiZWxvdykKLQlCaXQgMSAtIE1lbW9yeSBhZGRyZXNzIGFuZCBtYXNrIHZhbGlkIChwYXJhbTEgYW5kIHBhcmFtMikKLQlCaXQgMiAtIFBDSWUgKHNlZyxidXMsZGV2LGZuKSB2YWxpZCAocGFyYW00IGJlbG93KQotICBJZiBzZXQgdG8gemVybywgbGVnYWN5IGJlaGF2aW91ciBpcyB1c2VkIHdoZXJlIHRoZSB0eXBlIG9mIGluamVjdGlvbgotICBzcGVjaWZpZXMganVzdCBvbmUgYml0IHNldCwgYW5kIHBhcmFtMSBpcyBtdWx0aXBsZXhlZC4KKworCUJpdCAwIC0gUHJvY2Vzc29yIEFQSUMgZmllbGQgdmFsaWQgKHNlZSBwYXJhbTMgYmVsb3cpLgorCUJpdCAxIC0gTWVtb3J5IGFkZHJlc3MgYW5kIG1hc2sgdmFsaWQgKHBhcmFtMSBhbmQgcGFyYW0yKS4KKwlCaXQgMiAtIFBDSWUgKHNlZyxidXMsZGV2LGZuKSB2YWxpZCAoc2VlIHBhcmFtNCBiZWxvdykuCisKKyAgSWYgc2V0IHRvIHplcm8sIGxlZ2FjeSBiZWhhdmlvciBpcyBtaW1pY2tlZCB3aGVyZSB0aGUgdHlwZSBvZgorICBpbmplY3Rpb24gc3BlY2lmaWVzIGp1c3Qgb25lIGJpdCBzZXQsIGFuZCBwYXJhbTEgaXMgbXVsdGlwbGV4ZWQuCiAKIC0gcGFyYW0xCi0gIFRoaXMgZmlsZSBpcyB1c2VkIHRvIHNldCB0aGUgZmlyc3QgZXJyb3IgcGFyYW1ldGVyIHZhbHVlLiBFZmZlY3Qgb2YKLSAgcGFyYW1ldGVyIGRlcGVuZHMgb24gZXJyb3JfdHlwZSBzcGVjaWZpZWQuIEZvciBleGFtcGxlLCBpZiBlcnJvcgotICB0eXBlIGlzIG1lbW9yeSByZWxhdGVkIHR5cGUsIHRoZSBwYXJhbTEgc2hvdWxkIGJlIGEgdmFsaWQgcGh5c2ljYWwKLSAgbWVtb3J5IGFkZHJlc3MuIFtVbmxlc3MgImZsYWciIGlzIHNldCAtIHNlZSBhYm92ZV0KKworICBUaGlzIGZpbGUgaXMgdXNlZCB0byBzZXQgdGhlIGZpcnN0IGVycm9yIHBhcmFtZXRlciB2YWx1ZS4gSXRzIGVmZmVjdAorICBkZXBlbmRzIG9uIHRoZSBlcnJvciB0eXBlIHNwZWNpZmllZCBpbiBlcnJvcl90eXBlLiBGb3IgZXhhbXBsZSwgaWYKKyAgZXJyb3IgdHlwZSBpcyBtZW1vcnkgcmVsYXRlZCB0eXBlLCB0aGUgcGFyYW0xIHNob3VsZCBiZSBhIHZhbGlkCisgIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzLiBbVW5sZXNzICJmbGFnIiBpcyBzZXQgLSBzZWUgYWJvdmVdCiAKIC0gcGFyYW0yCi0gIFRoaXMgZmlsZSBpcyB1c2VkIHRvIHNldCB0aGUgc2Vjb25kIGVycm9yIHBhcmFtZXRlciB2YWx1ZS4gRWZmZWN0IG9mCi0gIHBhcmFtZXRlciBkZXBlbmRzIG9uIGVycm9yX3R5cGUgc3BlY2lmaWVkLiBGb3IgZXhhbXBsZSwgaWYgZXJyb3IKLSAgdHlwZSBpcyBtZW1vcnkgcmVsYXRlZCB0eXBlLCB0aGUgcGFyYW0yIHNob3VsZCBiZSBhIHBoeXNpY2FsIG1lbW9yeQotICBhZGRyZXNzIG1hc2suIExpbnV4IHJlcXVpcmVzIHBhZ2Ugb3IgbmFycm93ZXIgZ3JhbnVsYXJpdHksIHNheSwKLSAgMHhmZmZmZmZmZmZmZmZmMDAwLgorCisgIFNhbWUgdXNlIGFzIHBhcmFtMSBhYm92ZS4gRm9yIGV4YW1wbGUsIGlmIGVycm9yIHR5cGUgaXMgb2YgbWVtb3J5CisgIHJlbGF0ZWQgdHlwZSwgdGhlbiBwYXJhbTIgc2hvdWxkIGJlIGEgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MgbWFzay4KKyAgTGludXggcmVxdWlyZXMgcGFnZSBvciBuYXJyb3dlciBncmFudWxhcml0eSwgc2F5LCAweGZmZmZmZmZmZmZmZmYwMDAuCiAKIC0gcGFyYW0zCi0gIFVzZWQgd2hlbiB0aGUgMHgxIGJpdCBpcyBzZXQgaW4gImZsYWciIHRvIHNwZWNpZnkgdGhlIEFQSUMgaWQKKworICBVc2VkIHdoZW4gdGhlIDB4MSBiaXQgaXMgc2V0IGluICJmbGFncyIgdG8gc3BlY2lmeSB0aGUgQVBJQyBpZAogCiAtIHBhcmFtNAotICBVc2VkIHdoZW4gdGhlIDB4NCBiaXQgaXMgc2V0IGluICJmbGFnIiB0byBzcGVjaWZ5IHRhcmdldCBQQ0llIGRldmljZQorICBVc2VkIHdoZW4gdGhlIDB4NCBiaXQgaXMgc2V0IGluICJmbGFncyIgdG8gc3BlY2lmeSB0YXJnZXQgUENJZSBkZXZpY2UKIAogLSBub3RyaWdnZXIKLSAgVGhlIEVJTkogbWVjaGFuaXNtIGlzIGEgdHdvIHN0ZXAgcHJvY2Vzcy4gRmlyc3QgaW5qZWN0IHRoZSBlcnJvciwgdGhlbgotICBwZXJmb3JtIHNvbWUgYWN0aW9ucyB0byB0cmlnZ2VyIGl0LiBTZXR0aW5nICJub3RyaWdnZXIiIHRvIDEgc2tpcHMgdGhlCi0gIHRyaWdnZXIgcGhhc2UsIHdoaWNoICptYXkqIGFsbG93IHRoZSB1c2VyIHRvIGNhdXNlIHRoZSBlcnJvciBpbiBzb21lIG90aGVyCi0gIGNvbnRleHQgYnkgYSBzaW1wbGUgYWNjZXNzIHRvIHRoZSBjcHUsIG1lbW9yeSBsb2NhdGlvbiwgb3IgZGV2aWNlIHRoYXQgaXMKLSAgdGhlIHRhcmdldCBvZiB0aGUgZXJyb3IgaW5qZWN0aW9uLiBXaGV0aGVyIHRoaXMgYWN0dWFsbHkgd29ya3MgZGVwZW5kcwotICBvbiB3aGF0IG9wZXJhdGlvbnMgdGhlIEJJT1MgYWN0dWFsbHkgaW5jbHVkZXMgaW4gdGhlIHRyaWdnZXIgcGhhc2UuCiAKLUJJT1MgdmVyc2lvbnMgYmFzZWQgaW4gdGhlIEFDUEkgNC4wIHNwZWNpZmljYXRpb24gaGF2ZSBsaW1pdGVkIG9wdGlvbnMKLXRvIGNvbnRyb2wgd2hlcmUgdGhlIGVycm9ycyBhcmUgaW5qZWN0ZWQuICBZb3VyIEJJT1MgbWF5IHN1cHBvcnQgYW4KLWV4dGVuc2lvbiAoZW5hYmxlZCB3aXRoIHRoZSBwYXJhbV9leHRlbnNpb249MSBtb2R1bGUgcGFyYW1ldGVyLCBvcgotYm9vdCBjb21tYW5kIGxpbmUgZWluai5wYXJhbV9leHRlbnNpb249MSkuIFRoaXMgYWxsb3dzIHRoZSBhZGRyZXNzCi1hbmQgbWFzayBmb3IgbWVtb3J5IGluamVjdGlvbnMgdG8gYmUgc3BlY2lmaWVkIGJ5IHRoZSBwYXJhbTEgYW5kCi1wYXJhbTIgZmlsZXMgaW4gYXBlaS9laW5qLgorICBUaGUgZXJyb3IgaW5qZWN0aW9uIG1lY2hhbmlzbSBpcyBhIHR3by1zdGVwIHByb2Nlc3MuIEZpcnN0IGluamVjdCB0aGUKKyAgZXJyb3IsIHRoZW4gcGVyZm9ybSBzb21lIGFjdGlvbnMgdG8gdHJpZ2dlciBpdC4gU2V0dGluZyAibm90cmlnZ2VyIgorICB0byAxIHNraXBzIHRoZSB0cmlnZ2VyIHBoYXNlLCB3aGljaCAqbWF5KiBhbGxvdyB0aGUgdXNlciB0byBjYXVzZSB0aGUKKyAgZXJyb3IgaW4gc29tZSBvdGhlciBjb250ZXh0IGJ5IGEgc2ltcGxlIGFjY2VzcyB0byB0aGUgQ1BVLCBtZW1vcnkKKyAgbG9jYXRpb24sIG9yIGRldmljZSB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgdGhlIGVycm9yIGluamVjdGlvbi4gV2hldGhlcgorICB0aGlzIGFjdHVhbGx5IHdvcmtzIGRlcGVuZHMgb24gd2hhdCBvcGVyYXRpb25zIHRoZSBCSU9TIGFjdHVhbGx5CisgIGluY2x1ZGVzIGluIHRoZSB0cmlnZ2VyIHBoYXNlLgogCi1CSU9TIHZlcnNpb25zIHVzaW5nIHRoZSBBQ1BJIDUuMCBzcGVjaWZpY2F0aW9uIGhhdmUgbW9yZSBjb250cm9sIG92ZXIKLXRoZSB0YXJnZXQgb2YgdGhlIGluamVjdGlvbi4gRm9yIHByb2Nlc3NvciByZWxhdGVkIGVycm9ycyAodHlwZSAweDEsCi0weDIgYW5kIDB4NCkgdGhlIEFQSUNJRCBvZiB0aGUgdGFyZ2V0IHNob3VsZCBiZSBwcm92aWRlZCB1c2luZyB0aGUKLXBhcmFtMSBmaWxlIGluIGFwZWkvZWluai4gRm9yIG1lbW9yeSBlcnJvcnMgKHR5cGUgMHg4LCAweDEwIGFuZCAweDIwKQotdGhlIGFkZHJlc3MgaXMgc2V0IHVzaW5nIHBhcmFtMSB3aXRoIGEgbWFzayBpbiBwYXJhbTIgKDB4MCBpcyBlcXVpdmFsZW50Ci10byBhbGwgb25lcykuIEZvciBQQ0kgZXhwcmVzcyBlcnJvcnMgKHR5cGUgMHg0MCwgMHg4MCBhbmQgMHgxMDApIHRoZQotc2VnbWVudCwgYnVzLCBkZXZpY2UgYW5kIGZ1bmN0aW9uIGFyZSBzcGVjaWZpZWQgdXNpbmcgcGFyYW0xOgorQklPUyB2ZXJzaW9ucyBiYXNlZCBvbiB0aGUgQUNQSSA0LjAgc3BlY2lmaWNhdGlvbiBoYXZlIGxpbWl0ZWQgb3B0aW9ucworaW4gY29udHJvbGxpbmcgd2hlcmUgdGhlIGVycm9ycyBhcmUgaW5qZWN0ZWQuIFlvdXIgQklPUyBtYXkgc3VwcG9ydCBhbgorZXh0ZW5zaW9uIChlbmFibGVkIHdpdGggdGhlIHBhcmFtX2V4dGVuc2lvbj0xIG1vZHVsZSBwYXJhbWV0ZXIsIG9yIGJvb3QKK2NvbW1hbmQgbGluZSBlaW5qLnBhcmFtX2V4dGVuc2lvbj0xKS4gVGhpcyBhbGxvd3MgdGhlIGFkZHJlc3MgYW5kIG1hc2sKK2ZvciBtZW1vcnkgaW5qZWN0aW9ucyB0byBiZSBzcGVjaWZpZWQgYnkgdGhlIHBhcmFtMSBhbmQgcGFyYW0yIGZpbGVzIGluCithcGVpL2VpbmouCisKK0JJT1MgdmVyc2lvbnMgYmFzZWQgb24gdGhlIEFDUEkgNS4wIHNwZWNpZmljYXRpb24gaGF2ZSBtb3JlIGNvbnRyb2wgb3ZlcgordGhlIHRhcmdldCBvZiB0aGUgaW5qZWN0aW9uLiBGb3IgcHJvY2Vzc29yLXJlbGF0ZWQgZXJyb3JzICh0eXBlIDB4MSwgMHgyCithbmQgMHg0KSwgeW91IGNhbiBzZXQgZmxhZ3MgdG8gMHgzIChwYXJhbTMgZm9yIGJpdCAwLCBhbmQgcGFyYW0xIGFuZAorcGFyYW0yIGZvciBiaXQgMSkgc28gdGhhdCB5b3UgaGF2ZSBtb3JlIGluZm9ybWF0aW9uIGFkZGVkIHRvIHRoZSBlcnJvcgorc2lnbmF0dXJlIGJlaW5nIGluamVjdGVkLiBUaGUgYWN0dWFsIGRhdGEgcGFzc2VkIGlzIHRoaXM6CisKKwltZW1vcnlfYWRkcmVzcyA9IHBhcmFtMTsKKwltZW1vcnlfYWRkcmVzc19yYW5nZSA9IHBhcmFtMjsKKwlhcGljaWQgPSBwYXJhbTM7CisJcGNpZV9zYmRmID0gcGFyYW00OworCitGb3IgbWVtb3J5IGVycm9ycyAodHlwZSAweDgsIDB4MTAgYW5kIDB4MjApIHRoZSBhZGRyZXNzIGlzIHNldCB1c2luZworcGFyYW0xIHdpdGggYSBtYXNrIGluIHBhcmFtMiAoMHgwIGlzIGVxdWl2YWxlbnQgdG8gYWxsIG9uZXMpLiBGb3IgUENJCitleHByZXNzIGVycm9ycyAodHlwZSAweDQwLCAweDgwIGFuZCAweDEwMCkgdGhlIHNlZ21lbnQsIGJ1cywgZGV2aWNlIGFuZAorZnVuY3Rpb24gYXJlIHNwZWNpZmllZCB1c2luZyBwYXJhbTE6CiAKICAgICAgICAgIDMxICAgICAyNCAyMyAgICAxNiAxNSAgICAxMSAxMCAgICAgIDggIDcgICAgICAgIDAKIAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAl8IHNlZ21lbnQgfCAgIGJ1cyAgfCBkZXZpY2UgfCBmdW5jdGlvbiB8IHJlc2VydmVkIHwKIAkrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAotQW4gQUNQSSA1LjAgQklPUyBtYXkgYWxzbyBhbGxvdyB2ZW5kb3Igc3BlY2lmaWMgZXJyb3JzIHRvIGJlIGluamVjdGVkLgorQW55d2F5LCB5b3UgZ2V0IHRoZSBpZGVhLCBpZiB0aGVyZSdzIGRvdWJ0IGp1c3QgdGFrZSBhIGxvb2sgYXQgdGhlIGNvZGUKK2luIGRyaXZlcnMvYWNwaS9hcGVpL2VpbmouYy4KKworQW4gQUNQSSA1LjAgQklPUyBtYXkgYWxzbyBhbGxvdyB2ZW5kb3Itc3BlY2lmaWMgZXJyb3JzIHRvIGJlIGluamVjdGVkLgogSW4gdGhpcyBjYXNlIGEgZmlsZSBuYW1lZCB2ZW5kb3Igd2lsbCBjb250YWluIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uCiBmcm9tIHRoZSBCSU9TIHRoYXQgaG9wZWZ1bGx5IHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gd2lzaGluZyB0byB1c2UKLXRoZSB2ZW5kb3Igc3BlY2lmaWMgZXh0ZW5zaW9uIHRvIHRlbGwgdGhhdCB0aGV5IGFyZSBydW5uaW5nIG9uIGEgQklPUwordGhlIHZlbmRvci1zcGVjaWZpYyBleHRlbnNpb24gdG8gdGVsbCB0aGF0IHRoZXkgYXJlIHJ1bm5pbmcgb24gYSBCSU9TCiB0aGF0IHN1cHBvcnRzIGl0LiBBbGwgdmVuZG9yIGV4dGVuc2lvbnMgaGF2ZSB0aGUgMHg4MDAwMDAwMCBiaXQgc2V0IGluCiBlcnJvcl90eXBlLiBBIGZpbGUgdmVuZG9yX2ZsYWdzIGNvbnRyb2xzIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBwYXJhbTEKIGFuZCBwYXJhbTIgKDEgPSBQUk9DRVNTT1IsIDIgPSBNRU1PUlksIDQgPSBQQ0kpLiBTZWUgeW91ciBCSU9TIHZlbmRvcgogZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyAoYW5kIGV4cGVjdCBjaGFuZ2VzIHRvIHRoaXMgQVBJIGlmIHZlbmRvcnMKIGNyZWF0aXZpdHkgaW4gdXNpbmcgdGhpcyBmZWF0dXJlIGV4cGFuZHMgYmV5b25kIG91ciBleHBlY3RhdGlvbnMpLgogCi1FeGFtcGxlOgorCitBbiBlcnJvciBpbmplY3Rpb24gZXhhbXBsZToKKwogIyBjZCAvc3lzL2tlcm5lbC9kZWJ1Zy9hcGVpL2VpbmoKICMgY2F0IGF2YWlsYWJsZV9lcnJvcl90eXBlCQkjIFNlZSB3aGljaCBlcnJvcnMgY2FuIGJlIGluamVjdGVkCiAweDAwMDAwMDAyCVByb2Nlc3NvciBVbmNvcnJlY3RhYmxlIG5vbi1mYXRhbAogMHgwMDAwMDAwOAlNZW1vcnkgQ29ycmVjdGFibGUKIDB4MDAwMDAwMTAJTWVtb3J5IFVuY29ycmVjdGFibGUgbm9uLWZhdGFsCiAjIGVjaG8gMHgxMjM0NTAwMCA+IHBhcmFtMQkJIyBTZXQgbWVtb3J5IGFkZHJlc3MgZm9yIGluamVjdGlvbgotIyBlY2hvIDB4ZmZmZmZmZmZmZmZmZjAwMCA+IHBhcmFtMgkjIE1hc2sgLSBhbnl3aGVyZSBpbiB0aGlzIHBhZ2UKKyMgZWNobyAkKCgtMSA8PCAxMikpID4gcGFyYW0yCQkjIE1hc2sgMHhmZmZmZmZmZmZmZmZmMDAwIC0gYW55d2hlcmUgaW4gdGhpcyBwYWdlCiAjIGVjaG8gMHg4ID4gZXJyb3JfdHlwZQkJCSMgQ2hvb3NlIGNvcnJlY3RhYmxlIG1lbW9yeSBlcnJvcgogIyBlY2hvIDEgPiBlcnJvcl9pbmplY3QJCQkjIEluamVjdCBub3cKIAorWW91IHNob3VsZCBzZWUgc29tZXRoaW5nIGxpa2UgdGhpcyBpbiBkbWVzZzoKKworWzIyNzE1LjgzMDgwMV0gRURBQyBzYnJpZGdlIE1DMzogSEFORExJTkcgTUNFIE1FTU9SWSBFUlJPUgorWzIyNzE1LjgzNDc1OV0gRURBQyBzYnJpZGdlIE1DMzogQ1BVIDA6IE1hY2hpbmUgQ2hlY2sgRXZlbnQ6IDAgQmFuayA3OiA4YzAwMDA0MDAwMDEwMDkwCitbMjI3MTUuODM0NzU5XSBFREFDIHNicmlkZ2UgTUMzOiBUU0MgMAorWzIyNzE1LjgzNDc1OV0gRURBQyBzYnJpZGdlIE1DMzogQUREUiAxMjM0NTAwMCBFREFDIHNicmlkZ2UgTUMzOiBNSVNDIDE0NDc4MGM4NgorWzIyNzE1LjgzNDc1OV0gRURBQyBzYnJpZGdlIE1DMzogUFJPQ0VTU09SIDA6MzA2ZTcgVElNRSAxNDIyNTUzNDA0IFNPQ0tFVCAwIEFQSUMgMAorWzIyNzE2LjYxNjE3M10gRURBQyBNQzM6IDEgQ0UgbWVtb3J5IHJlYWQgZXJyb3Igb24gQ1BVX1NyY0lEIzBfQ2hhbm5lbCMwX0RJTU0jMCAoY2hhbm5lbDowIHNsb3Q6MCBwYWdlOjB4MTIzNDUgb2Zmc2V0OjB4MCBncmFpbjozMiBzeW5kcm9tZToweDAgLSAgYXJlYTpEUkFNIGVycl9jb2RlOjAwMDE6MDA5MCBzb2NrZXQ6MCBjaGFubmVsX21hc2s6MSByYW5rOjApCiAKIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEVJTkosIHBsZWFzZSByZWZlciB0byBBQ1BJIHNwZWNpZmljYXRpb24KIHZlcnNpb24gNC4wLCBzZWN0aW9uIDE3LjUgYW5kIEFDUEkgNS4wLCBzZWN0aW9uIDE4LjYuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2FjcGkvZW51bWVyYXRpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9hY3BpL2VudW1lcmF0aW9uLnR4dAppbmRleCA5YjEyMWE1Li43NTA0MDFmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2FjcGkvZW51bWVyYXRpb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vYWNwaS9lbnVtZXJhdGlvbi50eHQKQEAgLTI1NCw4ICsyNTQsMTMgQEAKIH5+fn5+fn5+fn5+fgogQUNQSSA1IGludHJvZHVjZWQgdHdvIG5ldyByZXNvdXJjZXMgdG8gZGVzY3JpYmUgR1BJTyBjb25uZWN0aW9uczogR3Bpb0lvCiBhbmQgR3Bpb0ludC4gVGhlc2UgcmVzb3VyY2VzIGFyZSB1c2VkIGJlIHVzZWQgdG8gcGFzcyBHUElPIG51bWJlcnMgdXNlZCBieQotdGhlIGRldmljZSB0byB0aGUgZHJpdmVyLiBGb3IgZXhhbXBsZToKK3RoZSBkZXZpY2UgdG8gdGhlIGRyaXZlci4gQUNQSSA1LjEgZXh0ZW5kZWQgdGhpcyB3aXRoIF9EU0QgKERldmljZQorU3BlY2lmaWMgRGF0YSkgd2hpY2ggbWFkZSBpdCBwb3NzaWJsZSB0byBuYW1lIHRoZSBHUElPcyBhbW9uZyBvdGhlciB0aGluZ3MuCiAKK0ZvciBleGFtcGxlOgorCitEZXZpY2UgKERFVikKK3sKIAlNZXRob2QgKF9DUlMsIDAsIE5vdFNlcmlhbGl6ZWQpCiAJewogCQlOYW1lIChTQlVGLCBSZXNvdXJjZVRlbXBsYXRlKCkKQEAgLTI4NSw2ICsyOTAsMTggQEAKIAkJUmV0dXJuIChTQlVGKQogCX0KIAorCS8vIEFDUEkgNS4xIF9EU0QgdXNlZCBmb3IgbmFtaW5nIHRoZSBHUElPcworCU5hbWUgKF9EU0QsIFBhY2thZ2UgKCkKKwl7CisJCVRvVVVJRCgiZGFmZmQ4MTQtNmViYS00ZDhjLThhOTEtYmM5YmJmNGFhMzAxIiksCisJCVBhY2thZ2UgKCkKKwkJeworCQkJUGFja2FnZSAoKSB7InBvd2VyLWdwaW9zIiwgUGFja2FnZSgpIHteREVWLCAwLCAwLCAwIH19LAorCQkJUGFja2FnZSAoKSB7ImlycS1ncGlvcyIsIFBhY2thZ2UoKSB7XkRFViwgMSwgMCwgMCB9fSwKKwkJfQorCX0pCisJLi4uCisKIFRoZXNlIEdQSU8gbnVtYmVycyBhcmUgY29udHJvbGxlciByZWxhdGl2ZSBhbmQgcGF0aCAiXFxfU0IuUENJMC5HUEkwIgogc3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBjb250cm9sbGVyLiBJbiBvcmRlciB0byB1c2UgdGhlc2UgR1BJT3MgaW4gTGludXgKIHdlIG5lZWQgdG8gdHJhbnNsYXRlIHRoZW0gdG8gdGhlIGNvcnJlc3BvbmRpbmcgTGludXggR1BJTyBkZXNjcmlwdG9ycy4KQEAgLTMwMCwxMSArMzE3LDExIEBACiAKIAlzdHJ1Y3QgZ3Bpb19kZXNjICppcnFfZGVzYywgKnBvd2VyX2Rlc2M7CiAKLQlpcnFfZGVzYyA9IGdwaW9kX2dldF9pbmRleChkZXYsIE5VTEwsIDEpOworCWlycV9kZXNjID0gZ3Bpb2RfZ2V0KGRldiwgImlycSIpOwogCWlmIChJU19FUlIoaXJxX2Rlc2MpKQogCQkvKiBoYW5kbGUgZXJyb3IgKi8KIAotCXBvd2VyX2Rlc2MgPSBncGlvZF9nZXRfaW5kZXgoZGV2LCBOVUxMLCAwKTsKKwlwb3dlcl9kZXNjID0gZ3Bpb2RfZ2V0KGRldiwgInBvd2VyIik7CiAJaWYgKElTX0VSUihwb3dlcl9kZXNjKSkKIAkJLyogaGFuZGxlIGVycm9yICovCiAKQEAgLTMxMyw2ICszMzAsOSBAQAogVGhlcmUgYXJlIGFsc28gZGV2bV8qIHZlcnNpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyB3aGljaCByZWxlYXNlIHRoZQogZGVzY3JpcHRvcnMgb25jZSB0aGUgZGV2aWNlIGlzIHJlbGVhc2VkLgogCitTZWUgRG9jdW1lbnRhdGlvbi9hY3BpL2dwaW8tcHJvcGVydGllcy50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCitfRFNEIGJpbmRpbmcgcmVsYXRlZCB0byBHUElPcy4KKwogTUZEIGRldmljZXMKIH5+fn5+fn5+fn5+CiBUaGUgTUZEIGRldmljZXMgcmVnaXN0ZXIgdGhlaXIgY2hpbGRyZW4gYXMgcGxhdGZvcm0gZGV2aWNlcy4gRm9yIHRoZSBjaGlsZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9hdG9taWNfb3BzLnR4dCBiL0RvY3VtZW50YXRpb24vYXRvbWljX29wcy50eHQKaW5kZXggMTgzZTQxYi4uZGFiNmRhMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hdG9taWNfb3BzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2F0b21pY19vcHMudHh0CkBAIC0yMDEsMTEgKzIwMSwxMSBAQAogYXRvbWljX3QgYW5kIHJldHVybiB0aGUgbmV3IGNvdW50ZXIgdmFsdWUgYWZ0ZXIgdGhlIG9wZXJhdGlvbiBpcwogcGVyZm9ybWVkLgogCi1Vbmxpa2UgdGhlIGFib3ZlIHJvdXRpbmVzLCBpdCBpcyByZXF1aXJlZCB0aGF0IGV4cGxpY2l0IG1lbW9yeQotYmFycmllcnMgYXJlIHBlcmZvcm1lZCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBvcGVyYXRpb24uICBJdCBtdXN0IGJlCi1kb25lIHN1Y2ggdGhhdCBhbGwgbWVtb3J5IG9wZXJhdGlvbnMgYmVmb3JlIGFuZCBhZnRlciB0aGUgYXRvbWljCi1vcGVyYXRpb24gY2FsbHMgYXJlIHN0cm9uZ2x5IG9yZGVyZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBhdG9taWMKLW9wZXJhdGlvbiBpdHNlbGYuCitVbmxpa2UgdGhlIGFib3ZlIHJvdXRpbmVzLCBpdCBpcyByZXF1aXJlZCB0aGF0IHRoZXNlIHByaW1pdGl2ZXMKK2luY2x1ZGUgZXhwbGljaXQgbWVtb3J5IGJhcnJpZXJzIHRoYXQgYXJlIHBlcmZvcm1lZCBiZWZvcmUgYW5kIGFmdGVyCit0aGUgb3BlcmF0aW9uLiAgSXQgbXVzdCBiZSBkb25lIHN1Y2ggdGhhdCBhbGwgbWVtb3J5IG9wZXJhdGlvbnMgYmVmb3JlCithbmQgYWZ0ZXIgdGhlIGF0b21pYyBvcGVyYXRpb24gY2FsbHMgYXJlIHN0cm9uZ2x5IG9yZGVyZWQgd2l0aCByZXNwZWN0Cit0byB0aGUgYXRvbWljIG9wZXJhdGlvbiBpdHNlbGYuCiAKIEZvciBleGFtcGxlLCBpdCBzaG91bGQgYmVoYXZlIGFzIGlmIGEgc21wX21iKCkgY2FsbCBleGlzdGVkIGJvdGgKIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGF0b21pYyBvcGVyYXRpb24uCkBAIC0yMzMsMjEgKzIzMywyMSBAQAogZ2l2ZW4gYXRvbWljIGNvdW50ZXIuICBUaGV5IHJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZQogcmVzdWx0aW5nIGNvdW50ZXIgdmFsdWUgd2FzIHplcm8gb3Igbm90LgogCi1JdCByZXF1aXJlcyBleHBsaWNpdCBtZW1vcnkgYmFycmllciBzZW1hbnRpY3MgYXJvdW5kIHRoZSBvcGVyYXRpb24gYXMKLWFib3ZlLgorQWdhaW4sIHRoZXNlIHByaW1pdGl2ZXMgcHJvdmlkZSBleHBsaWNpdCBtZW1vcnkgYmFycmllciBzZW1hbnRpY3MgYXJvdW5kCit0aGUgYXRvbWljIG9wZXJhdGlvbi4KIAogCWludCBhdG9taWNfc3ViX2FuZF90ZXN0KGludCBpLCBhdG9taWNfdCAqdik7CiAKIFRoaXMgaXMgaWRlbnRpY2FsIHRvIGF0b21pY19kZWNfYW5kX3Rlc3QoKSBleGNlcHQgdGhhdCBhbiBleHBsaWNpdAotZGVjcmVtZW50IGlzIGdpdmVuIGluc3RlYWQgb2YgdGhlIGltcGxpY2l0ICIxIi4gIEl0IHJlcXVpcmVzIGV4cGxpY2l0Ci1tZW1vcnkgYmFycmllciBzZW1hbnRpY3MgYXJvdW5kIHRoZSBvcGVyYXRpb24uCitkZWNyZW1lbnQgaXMgZ2l2ZW4gaW5zdGVhZCBvZiB0aGUgaW1wbGljaXQgIjEiLiAgVGhpcyBwcmltaXRpdmUgbXVzdAorcHJvdmlkZSBleHBsaWNpdCBtZW1vcnkgYmFycmllciBzZW1hbnRpY3MgYXJvdW5kIHRoZSBvcGVyYXRpb24uCiAKIAlpbnQgYXRvbWljX2FkZF9uZWdhdGl2ZShpbnQgaSwgYXRvbWljX3QgKnYpOwogCi1UaGUgZ2l2ZW4gaW5jcmVtZW50IGlzIGFkZGVkIHRvIHRoZSBnaXZlbiBhdG9taWMgY291bnRlciB2YWx1ZS4gIEEKLWJvb2xlYW4gaXMgcmV0dXJuIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSByZXN1bHRpbmcgY291bnRlciB2YWx1ZQotaXMgbmVnYXRpdmUuICBJdCByZXF1aXJlcyBleHBsaWNpdCBtZW1vcnkgYmFycmllciBzZW1hbnRpY3MgYXJvdW5kIHRoZQotb3BlcmF0aW9uLgorVGhlIGdpdmVuIGluY3JlbWVudCBpcyBhZGRlZCB0byB0aGUgZ2l2ZW4gYXRvbWljIGNvdW50ZXIgdmFsdWUuICBBIGJvb2xlYW4KK2lzIHJldHVybiB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcmVzdWx0aW5nIGNvdW50ZXIgdmFsdWUgaXMgbmVnYXRpdmUuCitUaGlzIHByaW1pdGl2ZSBtdXN0IHByb3ZpZGUgZXhwbGljaXQgbWVtb3J5IGJhcnJpZXIgc2VtYW50aWNzIGFyb3VuZAordGhlIG9wZXJhdGlvbi4KIAogVGhlbjoKIApAQCAtMjU3LDcgKzI1Nyw3IEBACiB0aGUgZ2l2ZW4gbmV3IHZhbHVlLiAgSXQgcmV0dXJucyB0aGUgb2xkIHZhbHVlIHRoYXQgdGhlIGF0b21pYyB2YXJpYWJsZSB2IGhhZAoganVzdCBiZWZvcmUgdGhlIG9wZXJhdGlvbi4KIAotYXRvbWljX3hjaGcgcmVxdWlyZXMgZXhwbGljaXQgbWVtb3J5IGJhcnJpZXJzIGFyb3VuZCB0aGUgb3BlcmF0aW9uLgorYXRvbWljX3hjaGcgbXVzdCBwcm92aWRlIGV4cGxpY2l0IG1lbW9yeSBiYXJyaWVycyBhcm91bmQgdGhlIG9wZXJhdGlvbi4KIAogCWludCBhdG9taWNfY21weGNoZyhhdG9taWNfdCAqdiwgaW50IG9sZCwgaW50IG5ldyk7CiAKQEAgLTI2Niw3ICsyNjYsNyBAQAogYXRvbWljX2NtcHhjaGcgd2lsbCBvbmx5IHNhdGlzZnkgaXRzIGF0b21pY2l0eSBzZW1hbnRpY3MgYXMgbG9uZyBhcyBhbGwKIG90aGVyIGFjY2Vzc2VzIG9mICp2IGFyZSBwZXJmb3JtZWQgdGhyb3VnaCBhdG9taWNfeHh4IG9wZXJhdGlvbnMuCiAKLWF0b21pY19jbXB4Y2hnIHJlcXVpcmVzIGV4cGxpY2l0IG1lbW9yeSBiYXJyaWVycyBhcm91bmQgdGhlIG9wZXJhdGlvbi4KK2F0b21pY19jbXB4Y2hnIG11c3QgcHJvdmlkZSBleHBsaWNpdCBtZW1vcnkgYmFycmllcnMgYXJvdW5kIHRoZSBvcGVyYXRpb24uCiAKIFRoZSBzZW1hbnRpY3MgZm9yIGF0b21pY19jbXB4Y2hnIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBkZWZpbmVkIGZvciAnY2FzJwogYmVsb3cuCkBAIC0yNzksOCArMjc5LDggQEAKIHJldHVybnMgbm9uIHplcm8uIElmIHYgaXMgZXF1YWwgdG8gdSB0aGVuIGl0IHJldHVybnMgemVyby4gVGhpcyBpcyBkb25lIGFzCiBhbiBhdG9taWMgb3BlcmF0aW9uLgogCi1hdG9taWNfYWRkX3VubGVzcyByZXF1aXJlcyBleHBsaWNpdCBtZW1vcnkgYmFycmllcnMgYXJvdW5kIHRoZSBvcGVyYXRpb24KLXVubGVzcyBpdCBmYWlscyAocmV0dXJucyAwKS4KK2F0b21pY19hZGRfdW5sZXNzIG11c3QgcHJvdmlkZSBleHBsaWNpdCBtZW1vcnkgYmFycmllcnMgYXJvdW5kIHRoZQorb3BlcmF0aW9uIHVubGVzcyBpdCBmYWlscyAocmV0dXJucyAwKS4KIAogYXRvbWljX2luY19ub3RfemVybywgZXF1aXZhbGVudCB0byBhdG9taWNfYWRkX3VubGVzcyh2LCAxLCAwKQogCkBAIC00NjAsOSArNDYwLDkgQEAKIGxpa2UgdGhpcyBvY2N1ciBhcyB3ZWxsLgogCiBUaGVzZSByb3V0aW5lcywgbGlrZSB0aGUgYXRvbWljX3QgY291bnRlciBvcGVyYXRpb25zIHJldHVybmluZyB2YWx1ZXMsCi1yZXF1aXJlIGV4cGxpY2l0IG1lbW9yeSBiYXJyaWVyIHNlbWFudGljcyBhcm91bmQgdGhlaXIgZXhlY3V0aW9uLiAgQWxsCi1tZW1vcnkgb3BlcmF0aW9ucyBiZWZvcmUgdGhlIGF0b21pYyBiaXQgb3BlcmF0aW9uIGNhbGwgbXVzdCBiZSBtYWRlCi12aXNpYmxlIGdsb2JhbGx5IGJlZm9yZSB0aGUgYXRvbWljIGJpdCBvcGVyYXRpb24gaXMgbWFkZSB2aXNpYmxlLgorbXVzdCBwcm92aWRlIGV4cGxpY2l0IG1lbW9yeSBiYXJyaWVyIHNlbWFudGljcyBhcm91bmQgdGhlaXIgZXhlY3V0aW9uLgorQWxsIG1lbW9yeSBvcGVyYXRpb25zIGJlZm9yZSB0aGUgYXRvbWljIGJpdCBvcGVyYXRpb24gY2FsbCBtdXN0IGJlCittYWRlIHZpc2libGUgZ2xvYmFsbHkgYmVmb3JlIHRoZSBhdG9taWMgYml0IG9wZXJhdGlvbiBpcyBtYWRlIHZpc2libGUuCiBMaWtld2lzZSwgdGhlIGF0b21pYyBiaXQgb3BlcmF0aW9uIG11c3QgYmUgdmlzaWJsZSBnbG9iYWxseSBiZWZvcmUgYW55CiBzdWJzZXF1ZW50IG1lbW9yeSBvcGVyYXRpb24gaXMgbWFkZSB2aXNpYmxlLiAgRm9yIGV4YW1wbGU6CiAKQEAgLTUzNiw4ICs1MzYsOSBAQAogVGhlc2Ugbm9uLWF0b21pYyB2YXJpYW50cyBhbHNvIGRvIG5vdCByZXF1aXJlIGFueSBzcGVjaWFsIG1lbW9yeQogYmFycmllciBzZW1hbnRpY3MuCiAKLVRoZSByb3V0aW5lcyB4Y2hnKCkgYW5kIGNtcHhjaGcoKSBuZWVkIHRoZSBzYW1lIGV4YWN0IG1lbW9yeSBiYXJyaWVycwotYXMgdGhlIGF0b21pYyBhbmQgYml0IG9wZXJhdGlvbnMgcmV0dXJuaW5nIHZhbHVlcy4KK1RoZSByb3V0aW5lcyB4Y2hnKCkgYW5kIGNtcHhjaGcoKSBtdXN0IHByb3ZpZGUgdGhlIHNhbWUgZXhhY3QKK21lbW9yeS1iYXJyaWVyIHNlbWFudGljcyBhcyB0aGUgYXRvbWljIGFuZCBiaXQgb3BlcmF0aW9ucyByZXR1cm5pbmcKK3ZhbHVlcy4KIAogU3BpbmxvY2tzIGFuZCByd2xvY2tzIGhhdmUgbWVtb3J5IGJhcnJpZXIgZXhwZWN0YXRpb25zIGFzIHdlbGwuCiBUaGUgcnVsZSB0byBmb2xsb3cgaXMgc2ltcGxlOgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi96cmFtLnR4dCBiL0RvY3VtZW50YXRpb24vYmxvY2tkZXYvenJhbS50eHQKaW5kZXggN2ZjZjljNi4uNDhhMTgzZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9ibG9ja2Rldi96cmFtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2Jsb2NrZGV2L3pyYW0udHh0CkBAIC05OCwyMCArOTgsNzkgQEAKIAltb3VudCAvZGV2L3pyYW0xIC90bXAKIAogNykgU3RhdHM6Ci0JUGVyLWRldmljZSBzdGF0aXN0aWNzIGFyZSBleHBvcnRlZCBhcyB2YXJpb3VzIG5vZGVzIHVuZGVyCi0JL3N5cy9ibG9jay96cmFtPGlkPi8KLQkJZGlza3NpemUKLQkJbnVtX3JlYWRzCi0JCW51bV93cml0ZXMKLQkJZmFpbGVkX3JlYWRzCi0JCWZhaWxlZF93cml0ZXMKLQkJaW52YWxpZF9pbwotCQlub3RpZnlfZnJlZQotCQl6ZXJvX3BhZ2VzCi0JCW9yaWdfZGF0YV9zaXplCi0JCWNvbXByX2RhdGFfc2l6ZQotCQltZW1fdXNlZF90b3RhbAotCQltZW1fdXNlZF9tYXgKK1Blci1kZXZpY2Ugc3RhdGlzdGljcyBhcmUgZXhwb3J0ZWQgYXMgdmFyaW91cyBub2RlcyB1bmRlciAvc3lzL2Jsb2NrL3pyYW08aWQ+LworCitBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGV4cG9ydGVkIGRldmljZSBhdHRyaXRidXRlcy4gRm9yIG1vcmUgZGV0YWlscyBwbGVhc2UKK3JlYWQgRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1ibG9jay16cmFtLgorCitOYW1lICAgICAgICAgICAgYWNjZXNzICAgICAgICAgICAgZGVzY3JpcHRpb24KKy0tLS0gICAgICAgICAgICAtLS0tLS0gICAgICAgICAgICAtLS0tLS0tLS0tLQorZGlza3NpemUgICAgICAgICAgUlcgICAgc2hvdyBhbmQgc2V0IHRoZSBkZXZpY2UncyBkaXNrIHNpemUKK2luaXRzdGF0ZSAgICAgICAgIFJPICAgIHNob3dzIHRoZSBpbml0aWFsaXphdGlvbiBzdGF0ZSBvZiB0aGUgZGV2aWNlCityZXNldCAgICAgICAgICAgICBXTyAgICB0cmlnZ2VyIGRldmljZSByZXNldAorbnVtX3JlYWRzICAgICAgICAgUk8gICAgdGhlIG51bWJlciBvZiByZWFkcworZmFpbGVkX3JlYWRzICAgICAgUk8gICAgdGhlIG51bWJlciBvZiBmYWlsZWQgcmVhZHMKK251bV93cml0ZSAgICAgICAgIFJPICAgIHRoZSBudW1iZXIgb2Ygd3JpdGVzCitmYWlsZWRfd3JpdGVzICAgICBSTyAgICB0aGUgbnVtYmVyIG9mIGZhaWxlZCB3cml0ZXMKK2ludmFsaWRfaW8gICAgICAgIFJPICAgIHRoZSBudW1iZXIgb2Ygbm9uLXBhZ2Utc2l6ZS1hbGlnbmVkIEkvTyByZXF1ZXN0cworbWF4X2NvbXBfc3RyZWFtcyAgUlcgICAgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBjb25jdXJyZW50IGNvbXByZXNzIG9wZXJhdGlvbnMKK2NvbXBfYWxnb3JpdGhtICAgIFJXICAgIHNob3cgYW5kIGNoYW5nZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtCitub3RpZnlfZnJlZSAgICAgICBSTyAgICB0aGUgbnVtYmVyIG9mIG5vdGlmaWNhdGlvbnMgdG8gZnJlZSBwYWdlcyAoZWl0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICBzbG90IGZyZWUgbm90aWZpY2F0aW9ucyBvciBSRVFfRElTQ0FSRCByZXF1ZXN0cykKK3plcm9fcGFnZXMgICAgICAgIFJPICAgIHRoZSBudW1iZXIgb2YgemVybyBmaWxsZWQgcGFnZXMgd3JpdHRlbiB0byB0aGlzIGRpc2sKK29yaWdfZGF0YV9zaXplICAgIFJPICAgIHVuY29tcHJlc3NlZCBzaXplIG9mIGRhdGEgc3RvcmVkIGluIHRoaXMgZGlzaworY29tcHJfZGF0YV9zaXplICAgUk8gICAgY29tcHJlc3NlZCBzaXplIG9mIGRhdGEgc3RvcmVkIGluIHRoaXMgZGlzaworbWVtX3VzZWRfdG90YWwgICAgUk8gICAgdGhlIGFtb3VudCBvZiBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGlzIGRpc2sKK21lbV91c2VkX21heCAgICAgIFJXICAgIHRoZSBtYXhpbXVtIGFtb3VudCBtZW1vcnkgenJhbSBoYXZlIGNvbnN1bWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZSBjb21wcmVzc2VkIGRhdGEKK21lbV9saW1pdCAgICAgICAgIFJXICAgIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgWlJBTSBjYW4gdXNlIHRvIHN0b3JlCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tcHJlc3NlZCBkYXRhCitudW1fbWlncmF0ZWQgICAgICBSTyAgICB0aGUgbnVtYmVyIG9mIG9iamVjdHMgbWlncmF0ZWQgbWlncmF0ZWQgYnkgY29tcGFjdGlvbgorCisKK1dBUk5JTkcKKz09PT09PT0KK3Blci1zdGF0IHN5c2ZzIGF0dHJpYnV0ZXMgYXJlIGNvbnNpZGVyZWQgdG8gYmUgZGVwcmVjYXRlZC4KK1RoZSBiYXNpYyBzdHJhdGVneSBpczoKKy0tIHRoZSBleGlzdGluZyBSVyBub2RlcyB3aWxsIGJlIGRvd25ncmFkZWQgdG8gV08gbm9kZXMgKGluIGxpbnV4IDQuMTEpCistLSBkZXByZWNhdGVkIFJPIHN5c2ZzIG5vZGVzIHdpbGwgZXZlbnR1YWxseSBiZSByZW1vdmVkIChpbiBsaW51eCA0LjExKQorCitUaGUgbGlzdCBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZXMgY2FuIGJlIGZvdW5kIGhlcmU6CitEb2N1bWVudGF0aW9uL0FCSS9vYnNvbGV0ZS9zeXNmcy1ibG9jay16cmFtCisKK0Jhc2ljYWxseSwgZXZlcnkgYXR0cmlidXRlIHRoYXQgaGFzIGl0cyBvd24gcmVhZCBhY2Nlc3NpYmxlIHN5c2ZzIG5vZGUKKyhlLmcuIG51bV9yZWFkcykgKkFORCogaXMgYWNjZXNzaWJsZSB2aWEgb25lIG9mIHRoZSBzdGF0IGZpbGVzICh6cmFtPGlkPi9zdGF0CitvciB6cmFtPGlkPi9pb19zdGF0IG9yIHpyYW08aWQ+L21tX3N0YXQpIGlzIGNvbnNpZGVyZWQgdG8gYmUgZGVwcmVjYXRlZC4KKworVXNlciBzcGFjZSBpcyBhZHZpc2VkIHRvIHVzZSB0aGUgZm9sbG93aW5nIGZpbGVzIHRvIHJlYWQgdGhlIGRldmljZSBzdGF0aXN0aWNzLgorCitGaWxlIC9zeXMvYmxvY2svenJhbTxpZD4vc3RhdAorCitSZXByZXNlbnRzIGJsb2NrIGxheWVyIHN0YXRpc3RpY3MuIFJlYWQgRG9jdW1lbnRhdGlvbi9ibG9jay9zdGF0LnR4dCBmb3IKK2RldGFpbHMuCisKK0ZpbGUgL3N5cy9ibG9jay96cmFtPGlkPi9pb19zdGF0CisKK1RoZSBzdGF0IGZpbGUgcmVwcmVzZW50cyBkZXZpY2UncyBJL08gc3RhdGlzdGljcyBub3QgYWNjb3VudGVkIGJ5IGJsb2NrCitsYXllciBhbmQsIHRodXMsIG5vdCBhdmFpbGFibGUgaW4genJhbTxpZD4vc3RhdCBmaWxlLiBJdCBjb25zaXN0cyBvZiBhCitzaW5nbGUgbGluZSBvZiB0ZXh0IGFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIHN0YXRzIHNlcGFyYXRlZCBieQord2hpdGVzcGFjZToKKwlmYWlsZWRfcmVhZHMKKwlmYWlsZWRfd3JpdGVzCisJaW52YWxpZF9pbworCW5vdGlmeV9mcmVlCisKK0ZpbGUgL3N5cy9ibG9jay96cmFtPGlkPi9tbV9zdGF0CisKK1RoZSBzdGF0IGZpbGUgcmVwcmVzZW50cyBkZXZpY2UncyBtbSBzdGF0aXN0aWNzLiBJdCBjb25zaXN0cyBvZiBhIHNpbmdsZQorbGluZSBvZiB0ZXh0IGFuZCBjb250YWlucyB0aGUgZm9sbG93aW5nIHN0YXRzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlOgorCW9yaWdfZGF0YV9zaXplCisJY29tcHJfZGF0YV9zaXplCisJbWVtX3VzZWRfdG90YWwKKwltZW1fbGltaXQKKwltZW1fdXNlZF9tYXgKKwl6ZXJvX3BhZ2VzCisJbnVtX21pZ3JhdGVkCiAKIDgpIERlYWN0aXZhdGU6CiAJc3dhcG9mZiAvZGV2L3pyYW0wCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1c2V0cy50eHQgYi9Eb2N1bWVudGF0aW9uL2Nncm91cHMvY3B1c2V0cy50eHQKaW5kZXggZjIyMzVhMS4uZmRmN2RmZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL2NwdXNldHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9jcHVzZXRzLnR4dApAQCAtMzkyLDggKzM5MiwxMCBAQAogdGhhbiBvbmUgYmlnIG9uZSwgYnV0IGRvaW5nIHNvIG1lYW5zIHRoYXQgb3ZlcmxvYWRzIGluIG9uZSBvZiB0aGUKIHR3byBkb21haW5zIHdvbid0IGJlIGxvYWQgYmFsYW5jZWQgdG8gdGhlIG90aGVyIG9uZS4KIAotQnkgZGVmYXVsdCwgdGhlcmUgaXMgb25lIHNjaGVkIGRvbWFpbiBjb3ZlcmluZyBhbGwgQ1BVcywgZXhjZXB0IHRob3NlCi1tYXJrZWQgaXNvbGF0ZWQgdXNpbmcgdGhlIGtlcm5lbCBib290IHRpbWUgImlzb2xjcHVzPSIgYXJndW1lbnQuCitCeSBkZWZhdWx0LCB0aGVyZSBpcyBvbmUgc2NoZWQgZG9tYWluIGNvdmVyaW5nIGFsbCBDUFVzLCBpbmNsdWRpbmcgdGhvc2UKK21hcmtlZCBpc29sYXRlZCB1c2luZyB0aGUga2VybmVsIGJvb3QgdGltZSAiaXNvbGNwdXM9IiBhcmd1bWVudC4gSG93ZXZlciwKK3RoZSBpc29sYXRlZCBDUFVzIHdpbGwgbm90IHBhcnRpY2lwYXRlIGluIGxvYWQgYmFsYW5jaW5nLCBhbmQgd2lsbCBub3QKK2hhdmUgdGFza3MgcnVubmluZyBvbiB0aGVtIHVubGVzcyBleHBsaWNpdGx5IGFzc2lnbmVkLgogCiBUaGlzIGRlZmF1bHQgbG9hZCBiYWxhbmNpbmcgYWNyb3NzIGFsbCBDUFVzIGlzIG5vdCB3ZWxsIHN1aXRlZCBmb3IKIHRoZSBmb2xsb3dpbmcgdHdvIHNpdHVhdGlvbnM6CkBAIC00NjUsNiArNDY3LDEwIEBACiBjb25zdHJhaW5lZCB0byBzb21lIHN1YnNldCBvZiB0aGUgQ1BVcyBhbGxvd2VkIHRvIHRoZW0sIGZvciBsYWNrIG9mCiBsb2FkIGJhbGFuY2luZyB0byB0aGUgb3RoZXIgQ1BVcy4KIAorQ1BVcyBpbiAiY3B1c2V0Lmlzb2xjcHVzIiB3ZXJlIGV4Y2x1ZGVkIGZyb20gbG9hZCBiYWxhbmNpbmcgYnkgdGhlCitpc29sY3B1cz0ga2VybmVsIGJvb3Qgb3B0aW9uLCBhbmQgd2lsbCBuZXZlciBiZSBsb2FkIGJhbGFuY2VkIHJlZ2FyZGxlc3MKK29mIHRoZSB2YWx1ZSBvZiAiY3B1c2V0LnNjaGVkX2xvYWRfYmFsYW5jZSIgaW4gYW55IGNwdXNldC4KKwogMS43LjEgc2NoZWRfbG9hZF9iYWxhbmNlIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9jbWEvZGVidWdmcy50eHQgYi9Eb2N1bWVudGF0aW9uL2NtYS9kZWJ1Z2ZzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2VmMjBhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jbWEvZGVidWdmcy50eHQKQEAgLTAsMCArMSwyMSBAQAorVGhlIENNQSBkZWJ1Z2ZzIGludGVyZmFjZSBpcyB1c2VmdWwgdG8gcmV0cmlldmUgYmFzaWMgaW5mb3JtYXRpb24gb3V0IG9mIHRoZQorZGlmZmVyZW50IENNQSBhcmVhcyBhbmQgdG8gdGVzdCBhbGxvY2F0aW9uL3JlbGVhc2UgaW4gZWFjaCBvZiB0aGUgYXJlYXMuCisKK0VhY2ggQ01BIHpvbmUgcmVwcmVzZW50cyBhIGRpcmVjdG9yeSB1bmRlciA8ZGVidWdmcz4vY21hLywgaW5kZXhlZCBieSB0aGUKK2tlcm5lbCdzIENNQSBpbmRleC4gU28gdGhlIGZpcnN0IENNQSB6b25lIHdvdWxkIGJlOgorCisJPGRlYnVnZnM+L2NtYS9jbWEtMAorCitUaGUgc3RydWN0dXJlIG9mIHRoZSBmaWxlcyBjcmVhdGVkIHVuZGVyIHRoYXQgZGlyZWN0b3J5IGlzIGFzIGZvbGxvd3M6CisKKyAtIFtST10gYmFzZV9wZm46IFRoZSBiYXNlIFBGTiAoUGFnZSBGcmFtZSBOdW1iZXIpIG9mIHRoZSB6b25lLgorIC0gW1JPXSBjb3VudDogQW1vdW50IG9mIG1lbW9yeSBpbiB0aGUgQ01BIGFyZWEuCisgLSBbUk9dIG9yZGVyX3Blcl9iaXQ6IE9yZGVyIG9mIHBhZ2VzIHJlcHJlc2VudGVkIGJ5IG9uZSBiaXQuCisgLSBbUk9dIGJpdG1hcDogVGhlIGJpdG1hcCBvZiBwYWdlIHN0YXRlcyBpbiB0aGUgem9uZS4KKyAtIFtXT10gYWxsb2M6IEFsbG9jYXRlIE4gcGFnZXMgZnJvbSB0aGF0IENNQSBhcmVhLiBGb3IgZXhhbXBsZToKKworCWVjaG8gNSA+IDxkZWJ1Z2ZzPi9jbWEvY21hLTIvYWxsb2MKKword291bGQgdHJ5IHRvIGFsbG9jYXRlIDUgcGFnZXMgZnJvbSB0aGUgY21hLTIgYXJlYS4KKworIC0gW1dPXSBmcmVlOiBGcmVlIE4gcGFnZXMgZnJvbSB0aGF0IENNQSBhcmVhLCBzaW1pbGFyIHRvIHRoZSBhYm92ZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vY3J5cHRvL2NyeXB0by1BUEktdXNlcnNwYWNlLnR4dCBiL0RvY3VtZW50YXRpb24vY3J5cHRvL2NyeXB0by1BUEktdXNlcnNwYWNlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2MTljZC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL2NyeXB0by9jcnlwdG8tQVBJLXVzZXJzcGFjZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotSW50cm9kdWN0aW9uCi09PT09PT09PT09PT0KLQotVGhlIGNvbmNlcHRzIG9mIHRoZSBrZXJuZWwgY3J5cHRvIEFQSSB2aXNpYmxlIHRvIGtlcm5lbCBzcGFjZSBpcyBmdWxseQotYXBwbGljYWJsZSB0byB0aGUgdXNlciBzcGFjZSBpbnRlcmZhY2UgYXMgd2VsbC4gVGhlcmVmb3JlLCB0aGUga2VybmVsIGNyeXB0byBBUEkKLWhpZ2ggbGV2ZWwgZGlzY3Vzc2lvbiBmb3IgdGhlIGluLWtlcm5lbCB1c2UgY2FzZXMgYXBwbGllcyBoZXJlIGFzIHdlbGwuCi0KLVRoZSBtYWpvciBkaWZmZXJlbmNlLCBob3dldmVyLCBpcyB0aGF0IHVzZXIgc3BhY2UgY2FuIG9ubHkgYWN0IGFzIGEgY29uc3VtZXIKLWFuZCBuZXZlciBhcyBhIHByb3ZpZGVyIG9mIGEgdHJhbnNmb3JtYXRpb24gb3IgY2lwaGVyIGFsZ29yaXRobS4KLQotVGhlIGZvbGxvd2luZyBjb3ZlcnMgdGhlIHVzZXIgc3BhY2UgaW50ZXJmYWNlIGV4cG9ydGVkIGJ5IHRoZSBrZXJuZWwgY3J5cHRvCi1BUEkuIEEgd29ya2luZyBleGFtcGxlIG9mIHRoaXMgZGVzY3JpcHRpb24gaXMgbGlia2NhcGkgdGhhdCBjYW4gYmUgb2J0YWluZWQgZnJvbQotWzFdLiBUaGF0IGxpYnJhcnkgY2FuIGJlIHVzZWQgYnkgdXNlciBzcGFjZSBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlCi1jcnlwdG9ncmFwaGljIHNlcnZpY2VzIGZyb20gdGhlIGtlcm5lbC4KLQotU29tZSBkZXRhaWxzIG9mIHRoZSBpbi1rZXJuZWwga2VybmVsIGNyeXB0byBBUEkgYXNwZWN0cyBkbyBub3QKLWFwcGx5IHRvIHVzZXIgc3BhY2UsIGhvd2V2ZXIuIFRoaXMgaW5jbHVkZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzeW5jaHJvbm91cwotYW5kIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9ucy4gVGhlIHVzZXIgc3BhY2UgQVBJIGNhbGwgaXMgZnVsbHkgc3luY2hyb25vdXMuCi1JbiBhZGRpdGlvbiwgb25seSBhIHN1YnNldCBvZiBhbGwgY2lwaGVyIHR5cGVzIGFyZSBhdmFpbGFibGUgYXMgZG9jdW1lbnRlZAotYmVsb3cuCi0KLQotVXNlciBzcGFjZSBBUEkgZ2VuZXJhbCByZW1hcmtzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlIGtlcm5lbCBjcnlwdG8gQVBJIGlzIGFjY2Vzc2libGUgZnJvbSB1c2VyIHNwYWNlLiBDdXJyZW50bHksIHRoZSBmb2xsb3dpbmcKLWNpcGhlcnMgYXJlIGFjY2Vzc2libGU6Ci0KLQkqIE1lc3NhZ2UgZGlnZXN0IGluY2x1ZGluZyBrZXllZCBtZXNzYWdlIGRpZ2VzdCAoSE1BQywgQ01BQykKLQotCSogU3ltbWV0cmljIGNpcGhlcnMKLQotTm90ZSwgQUVBRCBjaXBoZXJzIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCB2aWEgdGhlIHN5bW1ldHJpYyBjaXBoZXIKLWludGVyZmFjZS4KLQotVGhlIGludGVyZmFjZSBpcyBwcm92aWRlZCB2aWEgTmV0bGluayB1c2luZyB0aGUgdHlwZSBBRl9BTEcuIEluIGFkZGl0aW9uLCB0aGUKLXNldHNvY2tvcHQgb3B0aW9uIHR5cGUgaXMgU09MX0FMRy4gSW4gY2FzZSB0aGUgdXNlciBzcGFjZSBoZWFkZXIgZmlsZXMgZG8gbm90Ci1leHBvcnQgdGhlc2UgZmxhZ3MgeWV0LCB1c2UgdGhlIGZvbGxvd2luZyBtYWNyb3M6Ci0KLSNpZm5kZWYgQUZfQUxHCi0jZGVmaW5lIEFGX0FMRyAzOAotI2VuZGlmCi0jaWZuZGVmIFNPTF9BTEcKLSNkZWZpbmUgU09MX0FMRyAyNzkKLSNlbmRpZgotCi1BIGNpcGhlciBpcyBhY2Nlc3NlZCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgZG9uZSBmb3IgdGhlIGluLWtlcm5lbCBBUEkgY2FsbHMuCi1UaGlzIGluY2x1ZGVzIHRoZSBnZW5lcmljIHZzLiB1bmlxdWUgbmFtaW5nIHNjaGVtYSBmb3IgY2lwaGVycyBhcyB3ZWxsIGFzIHRoZQotZW5mb3JjZW1lbnQgb2YgcHJpb3JpdGllcyBmb3IgZ2VuZXJpYyBuYW1lcy4KLQotVG8gaW50ZXJhY3Qgd2l0aCB0aGUga2VybmVsIGNyeXB0byBBUEksIGEgTmV0bGluayBzb2NrZXQgbXVzdCBiZSBjcmVhdGVkIGJ5Ci10aGUgdXNlciBzcGFjZSBhcHBsaWNhdGlvbi4gVXNlciBzcGFjZSBpbnZva2VzIHRoZSBjaXBoZXIgb3BlcmF0aW9uIHdpdGggdGhlCi1zZW5kL3dyaXRlIHN5c3RlbSBjYWxsIGZhbWlseS4gVGhlIHJlc3VsdCBvZiB0aGUgY2lwaGVyIG9wZXJhdGlvbiBpcyBvYnRhaW5lZAotd2l0aCB0aGUgcmVhZC9yZWN2IHN5c3RlbSBjYWxsIGZhbWlseS4KLQotVGhlIGZvbGxvd2luZyBBUEkgY2FsbHMgYXNzdW1lIHRoYXQgdGhlIE5ldGxpbmsgc29ja2V0IGRlc2NyaXB0b3IgaXMgYWxyZWFkeQotb3BlbmVkIGJ5IHRoZSB1c2VyIHNwYWNlIGFwcGxpY2F0aW9uIGFuZCBkaXNjdXNzZXMgb25seSB0aGUga2VybmVsIGNyeXB0byBBUEkKLXNwZWNpZmljIGludm9jYXRpb25zLgotCi1UbyBpbml0aWFsaXplIGEgTmV0bGluayBpbnRlcmZhY2UsIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgaGFzIHRvIGJlIHBlcmZvcm1lZAotYnkgdGhlIGNvbnN1bWVyOgotCi0JMS4gQ3JlYXRlIGEgc29ja2V0IG9mIHR5cGUgQUZfQUxHIHdpdGggdGhlIHN0cnVjdCBzb2NrYWRkcl9hbGcgcGFyYW1ldGVyCi0JICAgc3BlY2lmaWVkIGJlbG93IGZvciB0aGUgZGlmZmVyZW50IGNpcGhlciB0eXBlcy4KLQotCTIuIEludm9rZSBiaW5kIHdpdGggdGhlIHNvY2tldCBkZXNjcmlwdG9yCi0KLQkzLiBJbnZva2UgYWNjZXB0IHdpdGggdGhlIHNvY2tldCBkZXNjcmlwdG9yLiBUaGUgYWNjZXB0IHN5c3RlbSBjYWxsCi0JICAgcmV0dXJucyBhIG5ldyBmaWxlIGRlc2NyaXB0b3IgdGhhdCBpcyB0byBiZSB1c2VkIHRvIGludGVyYWN0IHdpdGgKLQkgICB0aGUgcGFydGljdWxhciBjaXBoZXIgaW5zdGFuY2UuIFdoZW4gaW52b2tpbmcgc2VuZC93cml0ZSBvciByZWN2L3JlYWQKLQkgICBzeXN0ZW0gY2FsbHMgdG8gc2VuZCBkYXRhIHRvIHRoZSBrZXJuZWwgb3Igb2J0YWluIGRhdGEgZnJvbSB0aGUKLQkgICBrZXJuZWwsIHRoZSBmaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYWNjZXB0IG11c3QgYmUgdXNlZC4KLQotSW4tcGxhY2UgY2lwaGVyIG9wZXJhdGlvbgotPT09PT09PT09PT09PT09PT09PT09PT09PQotCi1KdXN0IGxpa2UgdGhlIGluLWtlcm5lbCBvcGVyYXRpb24gb2YgdGhlIGtlcm5lbCBjcnlwdG8gQVBJLCB0aGUgdXNlciBzcGFjZQotaW50ZXJmYWNlIGFsbG93cyB0aGUgY2lwaGVyIG9wZXJhdGlvbiBpbi1wbGFjZS4gVGhhdCBtZWFucyB0aGF0IHRoZSBpbnB1dCBidWZmZXIKLXVzZWQgZm9yIHRoZSBzZW5kL3dyaXRlIHN5c3RlbSBjYWxsIGFuZCB0aGUgb3V0cHV0IGJ1ZmZlciB1c2VkIGJ5IHRoZSByZWFkL3JlY3YKLXN5c3RlbSBjYWxsIG1heSBiZSBvbmUgYW5kIHRoZSBzYW1lLiBUaGlzIGlzIG9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgZm9yCi1zeW1tZXRyaWMgY2lwaGVyIG9wZXJhdGlvbnMgd2hlcmUgYSBjb3B5aW5nIG9mIHRoZSBvdXRwdXQgZGF0YSB0byBpdHMgZmluYWwKLWRlc3RpbmF0aW9uIGNhbiBiZSBhdm9pZGVkLgotCi1JZiBhIGNvbnN1bWVyIG9uIHRoZSBvdGhlciBoYW5kIHdhbnRzIHRvIG1haW50YWluIHRoZSBwbGFpbnRleHQgYW5kIHRoZQotY2lwaGVydGV4dCBpbiBkaWZmZXJlbnQgbWVtb3J5IGxvY2F0aW9ucywgYWxsIGEgY29uc3VtZXIgbmVlZHMgdG8gZG8gaXMgdG8KLXByb3ZpZGUgZGlmZmVyZW50IG1lbW9yeSBwb2ludGVycyBmb3IgdGhlIGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gb3BlcmF0aW9uLgotCi1NZXNzYWdlIGRpZ2VzdCBBUEkKLT09PT09PT09PT09PT09PT09PQotCi1UaGUgbWVzc2FnZSBkaWdlc3QgdHlwZSB0byBiZSB1c2VkIGZvciB0aGUgY2lwaGVyIG9wZXJhdGlvbiBpcyBzZWxlY3RlZCB3aGVuCi1pbnZva2luZyB0aGUgYmluZCBzeXNjYWxsLiBiaW5kIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gcHJvdmlkZSBhIGZpbGxlZAotc3RydWN0IHNvY2thZGRyIGRhdGEgc3RydWN0dXJlLiBUaGlzIGRhdGEgc3RydWN0dXJlIG11c3QgYmUgZmlsbGVkIGFzIGZvbGxvd3M6Ci0KLXN0cnVjdCBzb2NrYWRkcl9hbGcgc2EgPSB7Ci0JLnNhbGdfZmFtaWx5ID0gQUZfQUxHLAotCS5zYWxnX3R5cGUgPSAiaGFzaCIsIC8qIHRoaXMgc2VsZWN0cyB0aGUgaGFzaCBsb2dpYyBpbiB0aGUga2VybmVsICovCi0JLnNhbGdfbmFtZSA9ICJzaGExIiAvKiB0aGlzIGlzIHRoZSBjaXBoZXIgbmFtZSAqLwotfTsKLQotVGhlIHNhbGdfdHlwZSB2YWx1ZSAiaGFzaCIgYXBwbGllcyB0byBtZXNzYWdlIGRpZ2VzdHMgYW5kIGtleWVkIG1lc3NhZ2UgZGlnZXN0cy4KLVRob3VnaCwgYSBrZXllZCBtZXNzYWdlIGRpZ2VzdCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBhcHByb3ByaWF0ZSBzYWxnX25hbWUuCi1QbGVhc2Ugc2VlIGJlbG93IGZvciB0aGUgc2V0c29ja29wdCBpbnRlcmZhY2UgdGhhdCBleHBsYWlucyBob3cgdGhlIGtleSBjYW4gYmUKLXNldCBmb3IgYSBrZXllZCBtZXNzYWdlIGRpZ2VzdC4KLQotVXNpbmcgdGhlIHNlbmQoKSBzeXN0ZW0gY2FsbCwgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzIHRoZSBkYXRhIHRoYXQgc2hvdWxkIGJlCi1wcm9jZXNzZWQgd2l0aCB0aGUgbWVzc2FnZSBkaWdlc3QuIFRoZSBzZW5kIHN5c3RlbSBjYWxsIGFsbG93cyB0aGUgZm9sbG93aW5nCi1mbGFncyB0byBiZSBzcGVjaWZpZWQ6Ci0KLQkqIE1TR19NT1JFOiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgc2VuZCBzeXN0ZW0gY2FsbCBhY3RzIGxpa2UgYQotCQkgICAgbWVzc2FnZSBkaWdlc3QgdXBkYXRlIGZ1bmN0aW9uIHdoZXJlIHRoZSBmaW5hbCBoYXNoIGlzIG5vdAotCQkgICAgeWV0IGNhbGN1bGF0ZWQuIElmIHRoZSBmbGFnIGlzIG5vdCBzZXQsIHRoZSBzZW5kIHN5c3RlbSBjYWxsCi0JCSAgICBjYWxjdWxhdGVzIHRoZSBmaW5hbCBtZXNzYWdlIGRpZ2VzdCBpbW1lZGlhdGVseS4KLQotV2l0aCB0aGUgcmVjdigpIHN5c3RlbSBjYWxsLCB0aGUgYXBwbGljYXRpb24gY2FuIHJlYWQgdGhlIG1lc3NhZ2UgZGlnZXN0IGZyb20KLXRoZSBrZXJuZWwgY3J5cHRvIEFQSS4gSWYgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwgZm9yIHRoZSBtZXNzYWdlIGRpZ2VzdCwgdGhlCi1mbGFnIE1TR19UUlVOQyBpcyBzZXQgYnkgdGhlIGtlcm5lbC4KLQotSW4gb3JkZXIgdG8gc2V0IGEgbWVzc2FnZSBkaWdlc3Qga2V5LCB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiBtdXN0IHVzZSB0aGUKLXNldHNvY2tvcHQoKSBvcHRpb24gb2YgQUxHX1NFVF9LRVkuIElmIHRoZSBrZXkgaXMgbm90IHNldCB0aGUgSE1BQyBvcGVyYXRpb24gaXMKLXBlcmZvcm1lZCB3aXRob3V0IHRoZSBpbml0aWFsIEhNQUMgc3RhdGUgY2hhbmdlIGNhdXNlZCBieSB0aGUga2V5LgotCi0KLVN5bW1ldHJpYyBjaXBoZXIgQVBJCi09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgb3BlcmF0aW9uIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgbWVzc2FnZSBkaWdlc3QgZGlzY3Vzc2lvbi4gRHVyaW5nCi1pbml0aWFsaXphdGlvbiwgdGhlIHN0cnVjdCBzb2NrYWRkciBkYXRhIHN0cnVjdHVyZSBtdXN0IGJlIGZpbGxlZCBhcyBmb2xsb3dzOgotCi1zdHJ1Y3Qgc29ja2FkZHJfYWxnIHNhID0gewotCS5zYWxnX2ZhbWlseSA9IEFGX0FMRywKLQkuc2FsZ190eXBlID0gInNrY2lwaGVyIiwgLyogdGhpcyBzZWxlY3RzIHRoZSBzeW1tZXRyaWMgY2lwaGVyICovCi0JLnNhbGdfbmFtZSA9ICJjYmMoYWVzKSIgLyogdGhpcyBpcyB0aGUgY2lwaGVyIG5hbWUgKi8KLX07Ci0KLUJlZm9yZSBkYXRhIGNhbiBiZSBzZW50IHRvIHRoZSBrZXJuZWwgdXNpbmcgdGhlIHdyaXRlL3NlbmQgc3lzdGVtIGNhbGwgZmFtaWx5LAotdGhlIGNvbnN1bWVyIG11c3Qgc2V0IHRoZSBrZXkuIFRoZSBrZXkgc2V0dGluZyBpcyBkZXNjcmliZWQgd2l0aCB0aGUgc2V0c29ja29wdAotaW52b2NhdGlvbiBiZWxvdy4KLQotVXNpbmcgdGhlIHNlbmRtc2coKSBzeXN0ZW0gY2FsbCwgdGhlIGFwcGxpY2F0aW9uIHByb3ZpZGVzIHRoZSBkYXRhIHRoYXQgc2hvdWxkCi1iZSBwcm9jZXNzZWQgZm9yIGVuY3J5cHRpb24gb3IgZGVjcnlwdGlvbi4gSW4gYWRkaXRpb24sIHRoZSBJViBpcyBzcGVjaWZpZWQKLXdpdGggdGhlIGRhdGEgc3RydWN0dXJlIHByb3ZpZGVkIGJ5IHRoZSBzZW5kbXNnKCkgc3lzdGVtIGNhbGwuCi0KLVRoZSBzZW5kbXNnIHN5c3RlbSBjYWxsIHBhcmFtZXRlciBvZiBzdHJ1Y3QgbXNnaGRyIGlzIGVtYmVkZGVkIGludG8gdGhlCi1zdHJ1Y3QgY21zZ2hkciBkYXRhIHN0cnVjdHVyZS4gU2VlIHJlY3YoMikgYW5kIGNtc2coMykgZm9yIG1vcmUgaW5mb3JtYXRpb24KLW9uIGhvdyB0aGUgY21zZ2hkciBkYXRhIHN0cnVjdHVyZSBpcyB1c2VkIHRvZ2V0aGVyIHdpdGggdGhlIHNlbmQvcmVjdiBzeXN0ZW0KLWNhbGwgZmFtaWx5LiBUaGF0IGNtc2doZHIgZGF0YSBzdHJ1Y3R1cmUgaG9sZHMgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbgotc3BlY2lmaWVkIHdpdGggYSBzZXBhcmF0ZSBoZWFkZXIgaW5zdGFuY2VzOgotCi0JKiBzcGVjaWZpY2F0aW9uIG9mIHRoZSBjaXBoZXIgb3BlcmF0aW9uIHR5cGUgd2l0aCBvbmUgb2YgdGhlc2UgZmxhZ3M6Ci0JCUFMR19PUF9FTkNSWVBUIC0gZW5jcnlwdGlvbiBvZiBkYXRhCi0JCUFMR19PUF9ERUNSWVBUIC0gZGVjcnlwdGlvbiBvZiBkYXRhCi0KLQkqIHNwZWNpZmljYXRpb24gb2YgdGhlIElWIGluZm9ybWF0aW9uIG1hcmtlZCB3aXRoIHRoZSBmbGFnIEFMR19TRVRfSVYKLQotVGhlIHNlbmQgc3lzdGVtIGNhbGwgZmFtaWx5IGFsbG93cyB0aGUgZm9sbG93aW5nIGZsYWcgdG8gYmUgc3BlY2lmaWVkOgotCi0JKiBNU0dfTU9SRTogSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlIHNlbmQgc3lzdGVtIGNhbGwgYWN0cyBsaWtlIGEKLQkJICAgIGNpcGhlciB1cGRhdGUgZnVuY3Rpb24gd2hlcmUgbW9yZSBpbnB1dCBkYXRhIGlzIGV4cGVjdGVkCi0JCSAgICB3aXRoIGEgc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9mIHRoZSBzZW5kIHN5c3RlbSBjYWxsLgotCi1Ob3RlOiBUaGUga2VybmVsIHJlcG9ydHMgLUVJTlZBTCBmb3IgYW55IHVuZXhwZWN0ZWQgZGF0YS4gVGhlIGNhbGxlciBtdXN0Ci1tYWtlIHN1cmUgdGhhdCBhbGwgZGF0YSBtYXRjaGVzIHRoZSBjb25zdHJhaW50cyBnaXZlbiBpbiAvcHJvYy9jcnlwdG8gZm9yIHRoZQotc2VsZWN0ZWQgY2lwaGVyLgotCi1XaXRoIHRoZSByZWN2KCkgc3lzdGVtIGNhbGwsIHRoZSBhcHBsaWNhdGlvbiBjYW4gcmVhZCB0aGUgcmVzdWx0IG9mIHRoZQotY2lwaGVyIG9wZXJhdGlvbiBmcm9tIHRoZSBrZXJuZWwgY3J5cHRvIEFQSS4gVGhlIG91dHB1dCBidWZmZXIgbXVzdCBiZSBhdCBsZWFzdAotYXMgbGFyZ2UgYXMgdG8gaG9sZCBhbGwgYmxvY2tzIG9mIHRoZSBlbmNyeXB0ZWQgb3IgZGVjcnlwdGVkIGRhdGEuIElmIHRoZSBvdXRwdXQKLWRhdGEgc2l6ZSBpcyBzbWFsbGVyLCBvbmx5IGFzIG1hbnkgYmxvY2tzIGFyZSByZXR1cm5lZCB0aGF0IGZpdCBpbnRvIHRoYXQKLW91dHB1dCBidWZmZXIgc2l6ZS4KLQotU2V0c29ja29wdCBpbnRlcmZhY2UKLT09PT09PT09PT09PT09PT09PT09Ci0KLUluIGFkZGl0aW9uIHRvIHRoZSByZWFkL3JlY3YgYW5kIHNlbmQvd3JpdGUgc3lzdGVtIGNhbGwgaGFuZGxpbmcgdG8gc2VuZCBhbmQKLXJldHJpZXZlIGRhdGEgc3ViamVjdCB0byB0aGUgY2lwaGVyIG9wZXJhdGlvbiwgYSBjb25zdW1lciBhbHNvIG5lZWRzIHRvIHNldAotdGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBjaXBoZXIgb3BlcmF0aW9uLiBUaGlzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLWlzIHNldCB1c2luZyB0aGUgc2V0c29ja29wdCBzeXN0ZW0gY2FsbCB0aGF0IG11c3QgYmUgaW52b2tlZCB3aXRoIHRoZSBmaWxlCi1kZXNjcmlwdG9yIG9mIHRoZSBvcGVuIGNpcGhlciAoaS5lLiB0aGUgZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IHRoZQotYWNjZXB0IHN5c3RlbSBjYWxsKS4KLQotRWFjaCBzZXRzb2Nrb3B0IGludm9jYXRpb24gbXVzdCB1c2UgdGhlIGxldmVsIFNPTF9BTEcuCi0KLVRoZSBzZXRzb2Nrb3B0IGludGVyZmFjZSBhbGxvd3Mgc2V0dGluZyB0aGUgZm9sbG93aW5nIGRhdGEgdXNpbmcgdGhlIG1lbnRpb25lZAotb3B0bmFtZToKLQotCSogQUxHX1NFVF9LRVkgLS0gU2V0dGluZyB0aGUga2V5LiBLZXkgc2V0dGluZyBpcyBhcHBsaWNhYmxlIHRvOgotCi0JCS0gdGhlIHNrY2lwaGVyIGNpcGhlciB0eXBlIChzeW1tZXRyaWMgY2lwaGVycykKLQotCQktIHRoZSBoYXNoIGNpcGhlciB0eXBlIChrZXllZCBtZXNzYWdlIGRpZ2VzdHMpCi0KLVVzZXIgc3BhY2UgQVBJIGV4YW1wbGUKLT09PT09PT09PT09PT09PT09PT09PT0KLQotUGxlYXNlIHNlZSBbMV0gZm9yIGxpYmtjYXBpIHdoaWNoIHByb3ZpZGVzIGFuIGVhc3ktdG8tdXNlIHdyYXBwZXIgYXJvdW5kIHRoZQotYWZvcmVtZW50aW9uZWQgTmV0bGluayBrZXJuZWwgaW50ZXJmYWNlLiBbMV0gYWxzbyBjb250YWlucyBhIHRlc3QgYXBwbGljYXRpb24KLXRoYXQgaW52b2tlcyBhbGwgbGlia2NhcGkgQVBJIGNhbGxzLgotCi1bMV0gaHR0cDovL3d3dy5jaHJvbm94LmRlL2xpYmtjYXBpLmh0bWwKLQotQXV0aG9yCi09PT09PT0KLQotU3RlcGhhbiBNdWVsbGVyIDxzbXVlbGxlckBjaHJvbm94LmRlPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9mcmVlc2NhbGUvZnNsLHZmNjEwLW1zY20tY3B1Y2ZnLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vZnJlZXNjYWxlL2ZzbCx2ZjYxMC1tc2NtLWNwdWNmZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhYTNjNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vZnJlZXNjYWxlL2ZzbCx2ZjYxMC1tc2NtLWNwdWNmZy50eHQKQEAgLTAsMCArMSwxNCBAQAorRnJlZXNjYWxlIFZ5YnJpZCBNaXNjZWxsYW5lb3VzIFN5c3RlbSBDb250cm9sIC0gQ1BVIENvbmZpZ3VyYXRpb24KKworVGhlIE1TQ00gSVAgY29udGFpbnMgbXVsdGlwbGUgc3ViIG1vZHVsZXMsIHRoaXMgYmluZGluZyBkZXNjcmliZXMgdGhlIGZpcnN0CitibG9jayBvZiByZWdpc3RlcnMgd2hpY2ggY29udGFpbnMgQ1BVIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6CSJmc2wsdmY2MTAtbXNjbS1jcHVjZmciLCAic3lzY29uIgorLSByZWc6CQl0aGUgcmVnaXN0ZXIgcmFuZ2Ugb2YgdGhlIE1TQ00gQ1BVIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisKK0V4YW1wbGU6CisJbXNjbV9jcHVjZmc6IGNwdWNmZ0A0MDAwMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHZmNjEwLW1zY20tY3B1Y2ZnIiwgInN5c2NvbiI7CisJCXJlZyA9IDwweDQwMDAxMDAwIDB4ODAwPjsKKwl9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2ZyZWVzY2FsZS9mc2wsdmY2MTAtbXNjbS1pci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2ZyZWVzY2FsZS9mc2wsdmY2MTAtbXNjbS1pci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5ODA4YjJhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9mcmVlc2NhbGUvZnNsLHZmNjEwLW1zY20taXIudHh0CkBAIC0wLDAgKzEsMzMgQEAKK0ZyZWVzY2FsZSBWeWJyaWQgTWlzY2VsbGFuZW91cyBTeXN0ZW0gQ29udHJvbCAtIEludGVycnVwdCBSb3V0ZXIKKworVGhlIE1TQ00gSVAgY29udGFpbnMgbXVsdGlwbGUgc3ViIG1vZHVsZXMsIHRoaXMgYmluZGluZyBkZXNjcmliZXMgdGhlIHNlY29uZAorYmxvY2sgb2YgcmVnaXN0ZXJzIHdoaWNoIGNvbnRyb2wgdGhlIGludGVycnVwdCByb3V0ZXIuIFRoZSBpbnRlcnJ1cHQgcm91dGVyCithbGxvd3MgdG8gY29uZmlndXJlIHRoZSByZWNpcGllbnQgb2YgZWFjaCBwZXJpcGhlcmFsIGludGVycnVwdC4gRnVydGhlcm1vcmUKK2l0IGNvbnRyb2xzIHRoZSBkaXJlY3RlZCBwcm9jZXNzb3IgaW50ZXJydXB0cy4gVGhlIG1vZHVsZSBpcyBhdmFpbGFibGUgaW4gYWxsCitWeWJyaWQgU29DJ3MgYnV0IGlzIG9ubHkgcmVhbGx5IHVzZWZ1bCBpbiBkdWFsIGNvcmUgY29uZmlndXJhdGlvbnMgKFZGNnh4Cit3aGljaCBjb21lcyB3aXRoIGEgQ29ydGV4LUE1L0NvcnRleC1NNCBjb21iaW5hdGlvbikuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6CQkiZnNsLHZmNjEwLW1zY20taXIiCistIHJlZzoJCQl0aGUgcmVnaXN0ZXIgcmFuZ2Ugb2YgdGhlIE1TQ00gSW50ZXJydXB0IFJvdXRlcgorLSBmc2wsY3B1Y2ZnOgkJVGhlIGhhbmRsZSB0byB0aGUgTVNDTSBDUFUgY29uZmlndXJhdGlvbiBub2RlLCByZXF1aXJlZAorCQkJdG8gZ2V0IHRoZSBjdXJyZW50IENQVSBJRAorLSBpbnRlcnJ1cHQtY29udHJvbGxlcjoJSWRlbnRpZmllcyB0aGUgbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlcgorLSAjaW50ZXJydXB0LWNlbGxzOglUd28gY2VsbHMsIGludGVycnVwdCBudW1iZXIgYW5kIGNlbGxzLgorCQkJVGhlIGhhcmR3YXJlIGludGVycnVwdCBudW1iZXIgYWNjb3JkaW5nIHRvIGludGVycnVwdAorCQkJYXNzaWdubWVudCBvZiB0aGUgaW50ZXJydXB0IHJvdXRlciBpcyByZXF1aXJlZC4KKwkJCUZsYWdzIGdldCBwYXNzZWQgb25seSB3aGVuIHVzaW5nIEdJQyBhcyBwYXJlbnQuIEZsYWdzCisJCQllbmNvZGluZyBhcyBkb2N1bWVudGVkIGJ5IHRoZSBHSUMgYmluZGluZ3MuCistIGludGVycnVwdC1wYXJlbnQ6CVNob3VsZCBiZSB0aGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyIG9mCisJCQl0aGUgQ1BVIHRoZSBkZXZpY2UgdHJlZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9uLiBUaGlzCisJCQlpcyBlaXRoZXIgdGhlIG5vZGUgb2YgdGhlIEdJQyBvciBOVklDIGNvbnRyb2xsZXIuCisKK0V4YW1wbGU6CisJbXNjbV9pcjogaW50ZXJydXB0LWNvbnRyb2xsZXJANDAwMDE4MDAgeworCQljb21wYXRpYmxlID0gImZzbCx2ZjYxMC1tc2NtLWlyIjsKKwkJcmVnID0gPDB4NDAwMDE4MDAgMHg0MDA+OworCQlmc2wsY3B1Y2ZnID0gPCZtc2NtX2NwdWNmZz47CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpbnRjPjsKKwl9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2dpYy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2dpYy50eHQKaW5kZXggYzk3NDg0Yi4uMWUwZDIxMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9naWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vZ2ljLnR4dApAQCAtNTYsMTEgKzU2LDYgQEAKICAgcmVnaW9ucywgdXNlZCB3aGVuIHRoZSBHSUMgZG9lc24ndCBoYXZlIGJhbmtlZCByZWdpc3RlcnMuIFRoZSBvZmZzZXQgaXMKICAgY3B1LW9mZnNldCAqIGNwdS1uci4KIAotLSBhcm0scm91dGFibGUtaXJxcyA6IFRvdGFsIG51bWJlciBvZiBnaWMgaXJxIGlucHV0cyB3aGljaCBhcmUgbm90IGRpcmVjdGx5Ci0JCSAgY29ubmVjdGVkIGZyb20gdGhlIHBlcmlwaGVyYWxzLCBidXQgYXJlIHJvdXRlZCBkeW5hbWljYWxseQotCQkgIGJ5IGEgY3Jvc3NiYXIvbXVsdGlwbGV4ZXIgcHJlY2VkaW5nIHRoZSBHSUMuIFRoZSBHSUMgaXJxCi0JCSAgaW5wdXQgbGluZSBpcyBhc3NpZ25lZCBkeW5hbWljYWxseSB3aGVuIHRoZSBjb3JyZXNwb25kaW5nCi0JCSAgcGVyaXBoZXJhbCdzIGNyb3NzYmFyIGxpbmUgaXMgbWFwcGVkLgogRXhhbXBsZToKIAogCWludGM6IGludGVycnVwdC1jb250cm9sbGVyQGZmZjExMDAwIHsKQEAgLTY4LDcgKzYzLDYgQEAKIAkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCWludGVycnVwdC1jb250cm9sbGVyOwotCQlhcm0scm91dGFibGUtaXJxcyA9IDwxNjA+OwogCQlyZWcgPSA8MHhmZmYxMTAwMCAweDEwMDA+LAogCQkgICAgICA8MHhmZmYxMDEwMCAweDEwMD47CiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9jcm9zc2Jhci50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL29tYXAvY3Jvc3NiYXIudHh0CmluZGV4IDQxMzlkYjMuLmE5YjI4ZDcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vb21hcC9jcm9zc2Jhci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9vbWFwL2Nyb3NzYmFyLnR4dApAQCAtOSw3ICs5LDkgQEAKIFJlcXVpcmVkIHByb3BlcnRpZXM6CiAtIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgInRpLGlycS1jcm9zc2JhciIKIC0gcmVnOiBCYXNlIGFkZHJlc3MgYW5kIHRoZSBzaXplIG9mIHRoZSBjcm9zc2JhciByZWdpc3RlcnMuCi0tIHRpLG1heC1pcnFzOiBUb3RhbCBudW1iZXIgb2YgaXJxcyBhdmFpbGFibGUgYXQgdGhlIGludGVycnVwdCBjb250cm9sbGVyLgorLSBpbnRlcnJ1cHQtY29udHJvbGxlcjogaW5kaWNhdGVzIHRoYXQgdGhpcyBibG9jayBpcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlci4KKy0gaW50ZXJydXB0LXBhcmVudDogdGhlIGludGVycnVwdCBjb250cm9sbGVyIHRoaXMgYmxvY2sgaXMgY29ubmVjdGVkIHRvLgorLSB0aSxtYXgtaXJxczogVG90YWwgbnVtYmVyIG9mIGlycXMgYXZhaWxhYmxlIGF0IHRoZSBwYXJlbnQgaW50ZXJydXB0IGNvbnRyb2xsZXIuCiAtIHRpLG1heC1jcm9zc2Jhci1zb3VyY2VzOiBNYXhpbXVtIG51bWJlciBvZiBjcm9zc2JhciBzb3VyY2VzIHRoYXQgY2FuIGJlIHJvdXRlZC4KIC0gdGkscmVnLXNpemU6IFNpemUgb2YgYSBpbmRpdmlkdWFsIHJlZ2lzdGVyIGluIGJ5dGVzLiBFdmVyeSBpbmRpdmlkdWFsCiAJICAgIHJlZ2lzdGVyIGlzIGFzc3VtZWQgdG8gYmUgb2Ygc2FtZSBzaXplLiBWYWxpZCBzaXplcyBhcmUgMSwgMiwgNC4KQEAgLTI3LDEzICsyOSwxMyBAQAogICB3aGVuIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciBpcnEgaXMgdW51c2VkICh3aGVuIG5vdCBwcm92aWRlZCwgZGVmYXVsdCBpcyAwKQogCiBFeGFtcGxlczoKLQkJY3Jvc3NiYXJfbXB1OiBANGEwMjAwMDAgeworCQljcm9zc2Jhcl9tcHU6IGNyb3NzYmFyQDRhMDAyYTQ4IHsKIAkJCWNvbXBhdGlibGUgPSAidGksaXJxLWNyb3NzYmFyIjsKIAkJCXJlZyA9IDwweDRhMDAyYTQ4IDB4MTMwPjsKIAkJCXRpLG1heC1pcnFzID0gPDE2MD47CiAJCQl0aSxtYXgtY3Jvc3NiYXItc291cmNlcyA9IDw0MDA+OwogCQkJdGkscmVnLXNpemUgPSA8Mj47Ci0JCQl0aSxpcnFzLXJlc2VydmVkID0gPDAgMSAyIDMgNSA2IDEzMSAxMzIgMTM5IDE0MD47CisJCQl0aSxpcnFzLXJlc2VydmVkID0gPDAgMSAyIDMgNSA2IDEzMSAxMzI+OwogCQkJdGksaXJxcy1za2lwID0gPDEwIDEzMyAxMzkgMTQwPjsKIAkJfTsKIApAQCAtNDQsMTAgKzQ2LDYgQEAKIAogQW4gaW50ZXJydXB0IGNvbnN1bWVyIG9uIGFuIFNvQyB1c2luZyBjcm9zc2JhciB3aWxsIHVzZToKIAlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgcmVxdWVzdF9udW1iZXIgaW50ZXJydXB0X2xldmVsPgotV2hlbiB0aGUgcmVxdWVzdCBudW1iZXIgaXMgYmV0d2VlbiAwIHRvIHRoYXQgZGVzY3JpYmVkIGJ5Ci0idGksbWF4LWNyb3NzYmFyLXNvdXJjZXMiLCBpdCBpcyBhc3N1bWVkIHRvIGJlIGEgY3Jvc3NiYXIgbWFwcGluZy4gSWYgdGhlCi1yZXF1ZXN0X251bWJlciBpcyBncmVhdGVyIHRoYW4gInRpLG1heC1jcm9zc2Jhci1zb3VyY2VzIiwgdGhlbiBpdCBpcyBtYXBwZWQgYXMgYQotcXVpcmt5IGhhcmR3YXJlIG1hcHBpbmcgZGlyZWN0IHRvIEdJQy4KIAogRXhhbXBsZToKIAlkZXZpY2VfeEAweDRhMDIzMDAwIHsKQEAgLTU1LDkgKzUzLDMgQEAKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDggSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCS4uLgogCX07Ci0KLQlkZXZpY2VfeUAweDRhMDMzMDAwIHsKLQkJLyogRGlyZWN0IG1hcHBlZCBHSUMgU1BJIDEgdXNlZCAqLwotCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgRElSRUNUX0lSUSgxKSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKLQkJLi4uCi0JfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vcG11LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vcG11LnR4dAppbmRleCA3NWVmOTFkLi42ZTU0YTlkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3BtdS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS9wbXUudHh0CkBAIC0xOCw2ICsxOCw4IEBACiAJImFybSxhcm0xMW1wY29yZS1wbXUiCiAJImFybSxhcm0xMTc2LXBtdSIKIAkiYXJtLGFybTExMzYtcG11IgorCSJxY29tLHNjb3JwaW9uLXBtdSIKKwkicWNvbSxzY29ycGlvbi1tcC1wbXUiCiAJInFjb20sa3JhaXQtcG11IgogLSBpbnRlcnJ1cHRzIDogMSBjb21iaW5lZCBpbnRlcnJ1cHQgb3IgMSBwZXIgY29yZS4gSWYgdGhlIGludGVycnVwdCBpcyBhIHBlci1jcHUKICAgICAgICAgICAgICAgIGludGVycnVwdCAoUFBJKSB0aGVuIDEgaW50ZXJydXB0IHNob3VsZCBiZSBzcGVjaWZpZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3NhbXN1bmcvcG11LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vc2Ftc3VuZy9wbXUudHh0CmluZGV4IDY3YjIxMTMuLjJkNjM1NmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vc2Ftc3VuZy9wbXUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vc2Ftc3VuZy9wbXUudHh0CkBAIC0yOSwxMCArMjksMjcgQEAKICAtIGNsb2NrcyA6IGxpc3Qgb2YgcGhhbmRsZXMgYW5kIHNwZWNpZmllcnMgdG8gYWxsIGlucHV0IGNsb2NrcyBsaXN0ZWQgaW4KIAkJY2xvY2stbmFtZXMgcHJvcGVydHkuCiAKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKK1NvbWUgUE1VcyBhcmUgY2FwYWJsZSBvZiBiZWhhdmluZyBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlciAobW9zdGx5Cit0byB3YWtlIHVwIGEgc3VzcGVuZGVkIFBNVSkuIEluIHdoaWNoIGNhc2UsIHRoZXkgY2FuIGhhdmUgdGhlCitmb2xsb3dpbmcgcHJvcGVydGllczoKKworLSBpbnRlcnJ1cHQtY29udHJvbGxlcjogaW5kaWNhdGUgdGhhdCBzYWlkIFBNVSBpcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlcgorCistICNpbnRlcnJ1cHQtY2VsbHM6IG11c3QgYmUgaWRlbnRpY2FsIHRvIHRoZSB0aGF0IG9mIHRoZSBwYXJlbnQgaW50ZXJydXB0CisgIGNvbnRyb2xsZXIuCisKKy0gaW50ZXJydXB0LXBhcmVudDogYSBwaGFuZGxlIGluZGljYXRpbmcgd2hpY2ggaW50ZXJydXB0IGNvbnRyb2xsZXIKKyAgdGhpcyBQTVUgc2lnbmFscyBpbnRlcnJ1cHRzIHRvLgorCiBFeGFtcGxlIDoKIHBtdV9zeXN0ZW1fY29udHJvbGxlcjogc3lzdGVtLWNvbnRyb2xsZXJAMTAwNDAwMDAgewogCWNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1MjUwLXBtdSIsICJzeXNjb24iOwogCXJlZyA9IDwweDEwMDQwMDAwIDB4NTAwMD47CisJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCSNjbG9jay1jZWxscyA9IDwxPjsKIAljbG9jay1uYW1lcyA9ICJjbGtvdXQwIiwgImNsa291dDEiLCAiY2xrb3V0MiIsICJjbGtvdXQzIiwKIAkJCSJjbGtvdXQ0IiwgImNsa291dDgiLCAiY2xrb3V0OSI7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3RlZ3JhL252aWRpYSx0ZWdyYTIwLWFoYi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL3RlZ3JhL252aWRpYSx0ZWdyYTIwLWFoYi50eHQKaW5kZXggMDY3Yzk3OS4uOWE0Mjk1YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2FybS90ZWdyYS9udmlkaWEsdGVncmEyMC1haGIudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vdGVncmEvbnZpZGlhLHRlZ3JhMjAtYWhiLnR4dApAQCAtNSw5ICs1LDEyIEBACiAgIFRlZ3JhMzAsIG11c3QgY29udGFpbiAibnZpZGlhLHRlZ3JhMzAtYWhiIi4gIE90aGVyd2lzZSwgbXVzdCBjb250YWluCiAgICcibnZpZGlhLDxjaGlwPi1haGIiLCAibnZpZGlhLHRlZ3JhMzAtYWhiIicgd2hlcmUgPGNoaXA+IGlzIHRlZ3JhMTI0LAogICB0ZWdyYTEzMiwgb3IgdGVncmEyMTAuCi0tIHJlZyA6IFNob3VsZCBjb250YWluIDEgcmVnaXN0ZXIgcmFuZ2VzKGFkZHJlc3MgYW5kIGxlbmd0aCkKKy0gcmVnIDogU2hvdWxkIGNvbnRhaW4gMSByZWdpc3RlciByYW5nZXMoYWRkcmVzcyBhbmQgbGVuZ3RoKS4gIEZvcgorICBUZWdyYTIwLCBUZWdyYTMwLCBhbmQgVGVncmExMTQgY2hpcHMsIHRoZSB2YWx1ZSBtdXN0IGJlIDwweDYwMDBjMDA0CisgIDB4MTBjPi4gIEZvciBUZWdyYTEyNCwgVGVncmExMzIgYW5kIFRlZ3JhMjEwIGNoaXBzLCB0aGUgdmFsdWUgc2hvdWxkCisgIGJlIGJlIDwweDYwMDBjMDAwIDB4MTUwPi4KIAotRXhhbXBsZToKK0V4YW1wbGUgKGZvciBhIFRlZ3JhMjAgY2hpcCk6CiAJYWhiOiBhaGJANjAwMGMwMDQgewogCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWFoYiI7CiAJCXJlZyA9IDwweDYwMDBjMDA0IDB4MTBjPjsgLyogQUhCIEFyYml0cmF0aW9uICsgR2l6bW8gQ29udHJvbGxlciAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2F0YS9haGNpLXN0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hdGEvYWhjaS1zdC50eHQKaW5kZXggMDU3NGE3Ny4uZTFkMDFkZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2F0YS9haGNpLXN0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXRhL2FoY2ktc3QudHh0CkBAIC0zLDI5ICszLDQ4IEBACiBUaGlzIGJpbmRpbmcgZGVzY3JpYmVzIGEgU0FUQSBkZXZpY2UuCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0gLSBjb21wYXRpYmxlCSAgIDogTXVzdCBiZSAic3Qsc3RpLWFoY2kiCisgLSBjb21wYXRpYmxlCSAgIDogTXVzdCBiZSAic3QsYWhjaSIKICAtIHJlZwkJICAgOiBQaHlzaWNhbCBiYXNlIGFkZHJlc3NlcyBhbmQgbGVuZ3RoIG9mIHJlZ2lzdGVyIHNldHMKICAtIGludGVycnVwdHMJICAgOiBJbnRlcnJ1cHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBTQVRBIGRldmljZQogIC0gaW50ZXJydXB0LW5hbWVzIDogICBBc3NvY2lhdGVkIG5hbWUgbXVzdCBiZTsgImhvc3RjIgotIC0gcmVzZXRzCSAgIDogVGhlIHBvd2VyLWRvd24gYW5kIHNvZnQtcmVzZXQgbGluZXMgb2YgU0FUQSBJUAotIC0gcmVzZXQtbmFtZXMJICAgOiAgIEFzc29jaWF0ZWQgbmFtZXMgbXVzdCBiZTsgInB3ci1kd24iIGFuZCAic3ctcnN0IgogIC0gY2xvY2tzCSAgIDogVGhlIHBoYW5kbGUgZm9yIHRoZSBjbG9jawogIC0gY2xvY2stbmFtZXMJICAgOiAgIEFzc29jaWF0ZWQgbmFtZSBtdXN0IGJlOyAiYWhjaV9jbGsiCi0gLSBwaHlzCQkgICA6IFRoZSBwaGFuZGxlIGZvciB0aGUgUEhZIGRldmljZQorIC0gcGh5cwkJICAgOiBUaGUgcGhhbmRsZSBmb3IgdGhlIFBIWSBwb3J0CiAgLSBwaHktbmFtZXMJICAgOiAgIEFzc29jaWF0ZWQgbmFtZSBtdXN0IGJlOyAiYWhjaV9waHkiCiAKK09wdGlvbmFsIHByb3BlcnRpZXM6CisgLSByZXNldHMJICAgOiBUaGUgcG93ZXItZG93biwgc29mdC1yZXNldCBhbmQgcG93ZXItcmVzZXQgbGluZXMgb2YgU0FUQSBJUAorIC0gcmVzZXQtbmFtZXMJICAgOiAgIEFzc29jaWF0ZWQgbmFtZXMgbXVzdCBiZTsgInB3ci1kd24iLCAic3ctcnN0IiBhbmQgInB3ci1yc3QiCisKIEV4YW1wbGU6CiAKKwkvKiBFeGFtcGxlIGZvciBzdGloNDE2ICovCiAJc2F0YTA6IHNhdGFAZmUzODAwMDAgewotCQljb21wYXRpYmxlICAgICAgPSAic3Qsc3RpLWFoY2kiOwotCQlyZWcgICAgICAgICAgICAgPSA8MHhmZTM4MDAwMCAweDEwMDA+OwotCQlpbnRlcnJ1cHRzICAgICAgPSA8R0lDX1NQSSAxNTcgSVJRX1RZUEVfTk9ORT47Ci0JCWludGVycnVwdC1uYW1lcyA9ICJob3N0YyI7Ci0JCXBoeXMJICAgICAgICA9IDwmbWlwaHkzNjV4X3BoeSBNSVBIWV9QT1JUXzAgTUlQSFlfVFlQRV9TQVRBPjsKLQkJcGh5LW5hbWVzICAgICAgID0gImFoY2lfcGh5IjsKLQkJcmVzZXRzCSAgICAgICAgPSA8JnBvd2VyZG93biBTVElINDE2X1NBVEEwX1BPV0VSRE9XTj4sCisJCWNvbXBhdGlibGUJPSAic3QsYWhjaSI7CisJCXJlZwkJPSA8MHhmZTM4MDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzCT0gPEdJQ19TUEkgMTU3IElSUV9UWVBFX05PTkU+OworCQlpbnRlcnJ1cHQtbmFtZXMJPSAiaG9zdGMiOworCQlwaHlzCQk9IDwmcGh5X3BvcnQwIFBIWV9UWVBFX1NBVEE+OworCQlwaHktbmFtZXMJPSAiYWhjaV9waHkiOworCQlyZXNldHMJCT0gPCZwb3dlcmRvd24gU1RJSDQxNl9TQVRBMF9QT1dFUkRPV04+LAogCQkJCSAgPCZzb2Z0cmVzZXQgU1RJSDQxNl9TQVRBMF9TT0ZUUkVTRVQ+OwotCQlyZXNldC1uYW1lcyAgICAgPSAicHdyLWR3biIsICJzdy1yc3QiOwotCQljbG9ja3MJICAgICAgICA9IDwmY2xrX3NfYTBfbHMgQ0xLX0lDTl9SRUc+OwotCQljbG9jay1uYW1lcyAgICAgPSAiYWhjaV9jbGsiOworCQlyZXNldC1uYW1lcwk9ICJwd3ItZHduIiwgInN3LXJzdCI7CisJCWNsb2NrcwkJPSA8JmNsa19zX2EwX2xzIENMS19JQ05fUkVHPjsKKwkJY2xvY2stbmFtZXMJPSAiYWhjaV9jbGsiOworCX07CisKKwkvKiBFeGFtcGxlIGZvciBzdGloNDA3IGZhbWlseSBzaWxpY29uICovCisJc2F0YTA6IHNhdGFAOWIyMDAwMCB7CisJCWNvbXBhdGlibGUJPSAic3QsYWhjaSI7CisJCXJlZwkJPSA8MHg5YjIwMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMJPSA8R0lDX1NQSSAxNTkgSVJRX1RZUEVfTk9ORT47CisJCWludGVycnVwdC1uYW1lcwk9ICJob3N0YyI7CisJCXBoeXMJCT0gPCZwaHlfcG9ydDAgUEhZX1RZUEVfU0FUQT47CisJCXBoeS1uYW1lcwk9ICJhaGNpX3BoeSI7CisJCXJlc2V0cwkJPSA8JnBvd2VyZG93biBTVElINDA3X1NBVEEwX1BPV0VSRE9XTj4sCisJCQkJICA8JnNvZnRyZXNldCBTVElINDA3X1NBVEEwX1NPRlRSRVNFVD4sCisJCQkJICA8JnNvZnRyZXNldCBTVElINDA3X1NBVEEwX1BXUl9TT0ZUUkVTRVQ+OworCQlyZXNldC1uYW1lcwk9ICJwd3ItZHduIiwgInN3LXJzdCIsICJwd3ItcnN0IjsKKwkJY2xvY2tzCQk9IDwmY2xrX3NfYzBfZmxleGdlbiBDTEtfSUNOX1JFRz47CisJCWNsb2NrLW5hbWVzCT0gImFoY2lfY2xrIjsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2NyeXB0by9pbWctaGFzaC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY3J5cHRvL2ltZy1oYXNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWEzZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2NyeXB0by9pbWctaGFzaC50eHQKQEAgLTAsMCArMSwyNyBAQAorSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzIGhhcmR3YXJlIGhhc2ggYWNjZWxlcmF0b3IKKworVGhlIGhhc2ggYWNjZWxlcmF0b3IgcHJvdmlkZXMgaGFyZHdhcmUgaGFzaGluZyBhY2NlbGVyYXRpb24gZm9yCitTSEExLCBTSEEyMjQsIFNIQTI1NiBhbmQgTUQ1IGhhc2hlcworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUgOiAiaW1nLGhhc2gtYWNjZWxlcmF0b3IiCistIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBtb2R1bGUsIGFuZCB0aGUgRE1BIHBvcnQKKy0gaW50ZXJydXB0cyA6IFRoZSBkZXNpZ25hdGVkIElSUSBsaW5lIGZvciB0aGUgaGFzaGluZyBtb2R1bGUuCistIGRtYXMgOiBETUEgc3BlY2lmaWVyIGFzIHBlciBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2RtYS50eHQKKy0gZG1hLW5hbWVzIDogU2hvdWxkIGJlICJ0eCIKKy0gY2xvY2tzIDogQ2xvY2sgc3BlY2lmaWVycworLSBjbG9jay1uYW1lcyA6ICJzeXMiIFVzZWQgdG8gY2xvY2sgdGhlIGhhc2ggYmxvY2sgcmVnaXN0ZXJzCisJCSJoYXNoIiBVc2VkIHRvIGNsb2NrIGRhdGEgdGhyb3VnaCB0aGUgYWNjZWxlcmF0b3IKKworRXhhbXBsZToKKworCWhhc2g6IGhhc2hAMTgxNDk2MDAgeworCWNvbXBhdGlibGUgPSAiaW1nLGhhc2gtYWNjZWxlcmF0b3IiOworCQlyZWcgPSA8MHgxODE0OTYwMCAweDEwMD4sIDwweDE4MTAxMTAwIDB4ND47CisJCWludGVycnVwdHMgPSA8R0lDX1NIQVJFRCA1OSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJZG1hcyA9IDwmZG1hIDggMHhmZmZmZmZmZiAwPjsKKwkJZG1hLW5hbWVzID0gInR4IjsKKwkJY2xvY2tzID0gPCZjcl9wZXJpcGggU1lTX0NMS19IQVNIPiwgPCZjbGtfcGVyaXBoIFBFUklQSF9DTEtfUk9NPjsKKwkJY2xvY2stbmFtZXMgPSAic3lzIiwgImhhc2giOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLWZhbi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLWZhbi50eHQKaW5kZXggMmRkNDU3YS4uNDM5YTc0MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpby1mYW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW8tZmFuLnR4dApAQCAtMiwxNSArMiwyMCBAQAogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgogLSBjb21wYXRpYmxlIDogImdwaW8tZmFuIgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgogLSBncGlvczogU3BlY2lmaWVzIHRoZSBwaW5zIHRoYXQgbWFwIHRvIGJpdHMgaW4gdGhlIGNvbnRyb2wgdmFsdWUsCiAgIG9yZGVyZWQgTVNCLS0+TFNCLgogLSBncGlvLWZhbixzcGVlZC1tYXA6IEEgbWFwcGluZyBvZiBwb3NzaWJsZSBmYW4gUlBNIHNwZWVkcyBhbmQgdGhlCiAgIGNvbnRyb2wgdmFsdWUgdGhhdCBzaG91bGQgYmUgc2V0IHRvIGFjaGlldmUgdGhlbS4gVGhpcyBhcnJheQogICBtdXN0IGhhdmUgdGhlIFJQTSB2YWx1ZXMgaW4gYXNjZW5kaW5nIG9yZGVyLgotCi1PcHRpb25hbCBwcm9wZXJ0aWVzOgogLSBhbGFybS1ncGlvczogVGhpcyBwaW4gZ29pbmcgYWN0aXZlIGluZGljYXRlcyBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aAogICB0aGUgZmFuLCBhbmQgYSB1ZGV2IGV2ZW50IHdpbGwgYmUgZmlyZWQuCistIGNvb2xpbmctY2VsbHM6IElmIHVzZWQgYXMgYSBjb29saW5nIGRldmljZSwgbXVzdCBiZSA8Mj4KKyAgQWxzbyBzZWU6IERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFsL3RoZXJtYWwudHh0CisgIG1pbiBhbmQgbWF4IHN0YXRlcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBzcGVlZC1tYXAgb2YgdGhlIGZhbi4KKworTm90ZTogQXQgbGVhc3Qgb25lIHRoZSAiZ3Bpb3MiIG9yICJhbGFybS1ncGlvcyIgcHJvcGVydGllcyBtdXN0IGJlIHNldC4KIAogRXhhbXBsZXM6CiAKQEAgLTIzLDMgKzI4LDEzIEBACiAJCQkJICAgICAgNjAwMCAyPjsKIAkJYWxhcm0tZ3Bpb3MgPSA8JmdwaW8xIDE1IDE+OwogCX07CisJZ3Bpb19mYW5fY29vbDogZ3Bpb19mYW4geworCQljb21wYXRpYmxlID0gImdwaW8tZmFuIjsKKwkJZ3Bpb3MgPSA8JmdwaW8yIDE0IDEKKwkJCSAmZ3BpbzIgMTMgMT47CisJCWdwaW8tZmFuLHNwZWVkLW1hcCA9CTwwICAgIDA+LAorCQkJCQk8MzAwMCAxPiwKKwkJCQkJPDYwMDAgMj47CisJCWFsYXJtLWdwaW9zID0gPCZncGlvMiAxNSAxPjsKKwkJI2Nvb2xpbmctY2VsbHMgPSA8Mj47IC8qIG1pbiBmb2xsb3dlZCBieSBtYXggKi8KKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2h3cm5nL2JyY20saXByb2Mtcm5nMjAwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od3JuZy9icmNtLGlwcm9jLXJuZzIwMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1YTQ1NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9od3JuZy9icmNtLGlwcm9jLXJuZzIwMC50eHQKQEAgLTAsMCArMSwxMiBAQAorSFdSTkcgc3VwcG9ydCBmb3IgdGhlIGlwcm9jLXJuZzIwMCBkcml2ZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6ICJicmNtLGlwcm9jLXJuZzIwMCIKKy0gcmVnIDogYmFzZSBhZGRyZXNzIGFuZCBzaXplIG9mIGNvbnRyb2wgcmVnaXN0ZXIgYmxvY2sKKworRXhhbXBsZToKKworcm5nIHsKKyAgICAgICAgY29tcGF0aWJsZSA9ICJicmNtLGlwcm9jLXJuZzIwMCI7CisgICAgICAgIHJlZyA9IDwweDE4MDMyMDAwIDB4Mjg+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLWRhdmluY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtZGF2aW5jaS50eHQKaW5kZXggMmRjOTM1Yi4uYTRlMWNiYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtZGF2aW5jaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtZGF2aW5jaS50eHQKQEAgLTEwLDYgKzEwLDkgQEAKIFJlY29tbWVuZGVkIHByb3BlcnRpZXMgOgogLSBpbnRlcnJ1cHRzIDogc3RhbmRhcmQgaW50ZXJydXB0IHByb3BlcnR5LgogLSBjbG9jay1mcmVxdWVuY3kgOiBkZXNpcmVkIEkyQyBidXMgY2xvY2sgZnJlcXVlbmN5IGluIEh6LgorLSB0aSxoYXMtcGZ1bmM6IGJvb2xlYW47IGlmIGRlZmluZWQsIGl0IGluZGljYXRlcyB0aGF0IFNvQyBzdXBwb3J0cyBQRlVOQworCXJlZ2lzdGVycy4gUEZVTkMgcmVnaXN0ZXJzIGFsbG93IHRvIHN3aXRjaCBJMkMgcGlucyB0byBmdW5jdGlvbiBhcworCUdQSU9zLCBzbyB0aGV5IGNhbiBieSB0b2dnbGVkIG1hbnVhbGx5LgogCiBFeGFtcGxlIChlbmJ3X2NtYyBib2FyZCk6CiAJaTJjQDFjMjIwMDAgewpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMtZGlnaWNvbG9yLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLWRpZ2ljb2xvci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3YTA5OAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLWRpZ2ljb2xvci50eHQKQEAgLTAsMCArMSwyNSBAQAorQ29uZXhhbnQgRGlnaWNvbG9yIEkyQyBjb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlOiBtdXN0IGJlICJjbnh0LGN4OTI3NTUtaTJjIgorIC0gcmVnOiBwaHlzaWNhbCBhZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIGRldmljZSByZWdpc3RlcnMKKyAtIGludGVycnVwdHM6IGEgc2luZ2xlIGludGVycnVwdCBzcGVjaWZpZXIKKyAtIGNsb2NrczogY2xvY2sgZm9yIHRoZSBkZXZpY2UKKyAtICNhZGRyZXNzLWNlbGxzOiBzaG91bGQgYmUgPDE+CisgLSAjc2l6ZS1jZWxsczogc2hvdWxkIGJlIDwwPgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBjbG9jay1mcmVxdWVuY3k6IHRoZSBkZXNpcmVkIEkyQyBidXMgY2xvY2sgZnJlcXVlbmN5IGluIEh6OyBpbgorICBhYnNlbmNlIG9mIHRoaXMgcHJvcGVydHkgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdXNlZCAoMTAwIGtIeikuCisKK0V4YW1wbGU6CisKKwlpMmM6IGkyY0BmMDAwMDEyMCB7CisJCWNvbXBhdGlibGUgPSAiY254dCxjeDkyNzU1LWkyYyI7CisJCXJlZyA9IDwweGYwMDAwMTIwIDB4MTA+OworCQlpbnRlcnJ1cHRzID0gPDI4PjsKKwkJY2xvY2tzID0gPCZtYWluX2Nsaz47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMDAwMDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLWp6NDc4MC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2kyYy1qejQ3ODAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMWU0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2kyYy1qejQ3ODAudHh0CkBAIC0wLDAgKzEsMzUgQEAKKyogSW5nZW5pYyBKWjQ3ODAgSTJDIEJ1cyBjb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IHNob3VsZCBiZSAiaW5nZW5pYyxqejQ3ODAtaTJjIgorLSByZWc6IFNob3VsZCBjb250YWluIHRoZSBhZGRyZXNzICYgc2l6ZSBvZiB0aGUgSTJDIGNvbnRyb2xsZXIgcmVnaXN0ZXJzLgorLSBpbnRlcnJ1cHRzOiBTaG91bGQgc3BlY2lmeSB0aGUgaW50ZXJydXB0IHByb3ZpZGVkIGJ5IHBhcmVudC4KKy0gY2xvY2tzOiBTaG91bGQgY29udGFpbiBhIHNpbmdsZSBjbG9jayBzcGVjaWZpZXIgZm9yIHRoZSBKWjQ3ODAgSTJDIGNsb2NrLgorLSBjbG9jay1mcmVxdWVuY3k6IGRlc2lyZWQgSTJDIGJ1cyBjbG9jayBmcmVxdWVuY3kgaW4gSHouCisKK1JlY29tbWVuZGVkIHByb3BlcnRpZXM6CistIHBpbmN0cmwtbmFtZXM6IHNob3VsZCBiZSAiZGVmYXVsdCI7CistIHBpbmN0cmwtMDogcGhhbmRsZSB0byBwaW5jdHJsIGZ1bmN0aW9uCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGludGVycnVwdC1wYXJlbnQ6IFNob3VsZCBiZSB0aGUgcGhhbmRsZSBvZiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgdGhhdAorICBkZWxpdmVycyBpbnRlcnJ1cHRzIHRvIHRoZSBJMkMgYmxvY2suCisKK0V4YW1wbGUKKworLyB7CisJaTJjNDogaTJjNEAweDEwMDU0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJpbmdlbmljLGp6NDc4MC1pMmMiOworCQlyZWcgPSA8MHgxMDA1NDAwMCAweDEwMDA+OworCisJCWludGVycnVwdC1wYXJlbnQgPSA8JmludGM+OworCQlpbnRlcnJ1cHRzID0gPDU2PjsKKworCQljbG9ja3MgPSA8JmNndSBKWjQ3ODBfQ0xLX1NNQjQ+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MTAwMDAwPjsKKwkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKKwkJcGluY3RybC0wID0gPCZwaW5zX2kyYzRfZGF0YT47CisKKwl9OworfTsKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy9pMmMteGxwOXh4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLXhscDl4eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxOGVmNQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvaTJjLXhscDl4eC50eHQKQEAgLTAsMCArMSwyMiBAQAorRGV2aWNlIHRyZWUgY29uZmlndXJhdGlvbiBmb3IgdGhlIEkyQyBjb250cm9sbGVyIG9uIHRoZSBYTFA5eHgvNXh4IFNvQworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlICAgICAgOiBzaG91bGQgYmUgIm5ldGxvZ2ljLHhscDk4MC1pMmMiCistIHJlZyAgICAgICAgICAgICA6IGJ1cyBhZGRyZXNzIHN0YXJ0IGFuZCBhZGRyZXNzIHJhbmdlIHNpemUgb2YgZGV2aWNlCistIGludGVycnVwdHMgICAgICA6IGludGVycnVwdCBudW1iZXIKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gY2xvY2stZnJlcXVlbmN5IDogZnJlcXVlbmN5IG9mIGJ1cyBjbG9jayBpbiBIegorICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byAxMDAgS0h6IHdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCBzcGVjaWZpZWQKKworRXhhbXBsZToKKworaTJjMDogaTJjQDExMzEwMCB7CisJY29tcGF0aWJsZSA9ICJuZXRsb2dpYyx4bHA5ODAtaTJjIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwwPjsKKwlyZWcgPSA8MCAweDExMzEwMCAweDEwMD47CisJY2xvY2stZnJlcXVlbmN5ID0gPDQwMDAwMD47CisJaW50ZXJydXB0cyA9IDwzMD47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmcGljPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL3RyaXZpYWwtZGV2aWNlcy50eHQKaW5kZXggYWFhODMyNS4uMDAzYmQ3NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2kyYy90cml2aWFsLWRldmljZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvdHJpdmlhbC1kZXZpY2VzLnR4dApAQCAtODksNiArODksNyBAQAogcmljb2gscnY1YzM4N2EJCUkyQyBidXMgU0VSSUFMIElOVEVSRkFDRSBSRUFMLVRJTUUgQ0xPQ0sgSUMKIHNhbXN1bmcsMjRhZDB4ZDEJUzUyNEFEMFhGMSAoMTI4Sy8yNTZLLWJpdCBTZXJpYWwgRUVQUk9NIGZvciBMb3cgUG93ZXIpCiBzaWksczM1MzkwYQkJMi13aXJlIENNT1MgcmVhbC10aW1lIGNsb2NrCitza3l3b3Jrcyxza3k4MTQ1MglTa3l3b3JrcyBTS1k4MTQ1MjogU2l4LUNoYW5uZWwgV2hpdGUgTEVEIERyaXZlciB3aXRoIFRvdWNoIFBhbmVsIEJpYXMgU3VwcGx5CiBzdC1taWNybywyNGMyNTYJCWkyYyBzZXJpYWwgZWVwcm9tICAoMjRjeHgpCiBzdG0sbTQxdDAwCQlTZXJpYWwgQWNjZXNzIFRJTUVLRUVQRVIKIHN0bSxtNDF0NjIJCVNlcmlhbCByZWFsLXRpbWUgY2xvY2sgKFJUQykgd2l0aCBhbGFybQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvZGE5MTUwLWdwYWRjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL2RhOTE1MC1ncGFkYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3MjI4ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL2RhOTE1MC1ncGFkYy50eHQKQEAgLTAsMCArMSwxNiBAQAorRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MTUwIElJTyBHUEFEQyBiaW5kaW5ncworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAiZGxnLGRhOTE1MC1ncGFkYyIgZm9yIERBOTE1MCBJSU8gR1BBREMKKy0gI2lvLWNoYW5uZWwtY2VsbHM6IFNob3VsZCBiZSBzZXQgdG8gPDE+CisgIChTZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9paW8tYmluZGluZ3MudHh0IGZvciBmdXJ0aGVyIGluZm8pCisKK0ZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIEdQQURDIGNoYW5uZWxzLCBzZWUgZGV2aWNlIGRhdGFzaGVldC4KKworCitFeGFtcGxlOgorCisJZ3BhZGM6IGRhOTE1MC1ncGFkYyB7CisJCWNvbXBhdGlibGUgPSAiZGxnLGRhOTE1MC1ncGFkYyI7CisJCSNpby1jaGFubmVsLWNlbGxzID0gPDE+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9tY3AzMjB4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL21jcDMyMHgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NTE4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9tY3AzMjB4LnR4dApAQCAtMCwwICsxLDMwIEBACisqIE1pY3JvY2hpcCBBbmFsb2cgdG8gRGlnaXRhbCBDb252ZXJ0ZXIgKEFEQykKKworVGhlIG5vZGUgZm9yIHRoaXMgZHJpdmVyIG11c3QgYmUgYSBjaGlsZCBub2RlIG9mIGEgU1BJIGNvbnRyb2xsZXIsIGhlbmNlCithbGwgbWFuZGF0b3J5IHByb3BlcnRpZXMgZGVzY3JpYmVkIGluCisKKyAgICAgICAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktYnVzLnR4dAorCittdXN0IGJlIHNwZWNpZmllZC4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKwktIGNvbXBhdGlibGU6ICAJTXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgZGVwZW5kaW5nIG9uIHRoZQorCQkJbW9kZWw6CisJCQkJIm1jcDMwMDEiCisJCQkJIm1jcDMwMDIiCisJCQkJIm1jcDMwMDQiCisJCQkJIm1jcDMwMDgiCisJCQkJIm1jcDMyMDEiCisJCQkJIm1jcDMyMDIiCisJCQkJIm1jcDMyMDQiCisJCQkJIm1jcDMyMDgiCisKKworRXhhbXBsZXM6CitzcGlfY29udHJvbGxlciB7CisJbWNwM3gweEAwIHsKKwkJY29tcGF0aWJsZSA9ICJtY3AzMDAyIjsKKwkJcmVnID0gPDA+OworCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDwxMDAwMDAwPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL21jcDM0MjIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvbWNwMzQyMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMzMTM5YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vYWRjL21jcDM0MjIudHh0CkBAIC0wLDAgKzEsMTcgQEAKKyogTWljcm9jaGlwIG1jcDM0MjIvMy80LzYvNy84IGNoaXAgZmFtaWx5IChBREMpCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisgLSBjb21wYXRpYmxlOiBTaG91bGQgYmUKKwkibWljcm9jaGlwLG1jcDM0MjIiIG9yCisJIm1pY3JvY2hpcCxtY3AzNDIzIiBvcgorCSJtaWNyb2NoaXAsbWNwMzQyNCIgb3IKKwkibWljcm9jaGlwLG1jcDM0MjYiIG9yCisJIm1pY3JvY2hpcCxtY3AzNDI3IiBvcgorCSJtaWNyb2NoaXAsbWNwMzQyOCIKKyAtIHJlZzogSTJDIGFkZHJlc3MgZm9yIHRoZSBkZXZpY2UKKworRXhhbXBsZToKK2FkY0AwIHsKKwljb21wYXRpYmxlID0gIm1pY3JvY2hpcCxtY3AzNDI0IjsKKwlyZWcgPSA8MHg2OD47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTI4czA1Mi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy90aS1hZGMxMjhzMDUyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmNhN2RlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9hZGMvdGktYWRjMTI4czA1Mi50eHQKQEAgLTAsMCArMSwxOCBAQAorKiBUZXhhcyBJbnN0cnVtZW50cycgQURDMTI4UzA1MiBBREMgY2hpcAorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJ0aSxhZGMxMjhzMDUyIgorIC0gcmVnOiBzcGkgY2hpcCBzZWxlY3QgbnVtYmVyIGZvciB0aGUgZGV2aWNlCisgLSB2cmVmLXN1cHBseTogVGhlIHJlZ3VsYXRvciBzdXBwbHkgZm9yIEFEQyByZWZlcmVuY2Ugdm9sdGFnZQorCitSZWNvbW1lbmRlZCBwcm9wZXJ0aWVzOgorIC0gc3BpLW1heC1mcmVxdWVuY3k6IERlZmluaXRpb24gYXMgcGVyCisJCURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKKworRXhhbXBsZToKK2FkY0AwIHsKKwljb21wYXRpYmxlID0gInRpLGFkYzEyOHMwNTIiOworCXJlZyA9IDwwPjsKKwl2cmVmLXN1cHBseSA9IDwmdmRkX3N1cHBseT47CisJc3BpLW1heC1mcmVxdWVuY3kgPSA8MTAwMDAwMD47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9zdC1zZW5zb3JzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9paW8vc3Qtc2Vuc29ycy50eHQKaW5kZXggYTdhMGExNS4uZDJhYWNhOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9zdC1zZW5zb3JzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL3N0LXNlbnNvcnMudHh0CkBAIC0yMyw2ICsyMyw3IEBACiBWYWxpZCBjb21wYXRpYmxlIHN0cmluZ3M6CiAKIEFjY2VsZXJvbWV0ZXJzOgorLSBzdCxsaXMzbHYwMmRsLWFjY2VsCiAtIHN0LGxzbTMwM2RsaC1hY2NlbAogLSBzdCxsc20zMDNkbGhjLWFjY2VsCiAtIHN0LGxpczNkaC1hY2NlbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L2JyY20sYmNtLWtleXBhZC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvYnJjbSxiY20ta2V5cGFkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzdmNTBiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L2JyY20sYmNtLWtleXBhZC50eHQKQEAgLTAsMCArMSwxMDggQEAKKyogQnJvYWRjb20gS2V5cGFkIENvbnRyb2xsZXIgZGV2aWNlIHRyZWUgYmluZGluZ3MKKworQnJvYWRjb20gS2V5cGFkIGNvbnRyb2xsZXIgaXMgdXNlZCB0byBpbnRlcmZhY2UgYSBTb0Mgd2l0aCBhIG1hdHJpeC10eXBlCitrZXlwYWQgZGV2aWNlLiBUaGUga2V5cGFkIGNvbnRyb2xsZXIgc3VwcG9ydHMgbXVsdGlwbGUgcm93IGFuZCBjb2x1bW4gbGluZXMuCitBIGtleSBjYW4gYmUgcGxhY2VkIGF0IGVhY2ggaW50ZXJzZWN0aW9uIG9mIGEgdW5pcXVlIHJvdyBhbmQgYSB1bmlxdWUgY29sdW1uLgorVGhlIGtleXBhZCBjb250cm9sbGVyIGNhbiBzZW5zZSBhIGtleS1wcmVzcyBhbmQga2V5LXJlbGVhc2UgYW5kIHJlcG9ydCB0aGUKK2V2ZW50IHVzaW5nIGEgaW50ZXJydXB0IHRvIHRoZSBjcHUuCisKK1RoaXMgYmluZGluZyBpcyBiYXNlZCBvbiB0aGUgbWF0cml4LWtleW1hcCBiaW5kaW5nIHdpdGggdGhlIGZvbGxvd2luZworY2hhbmdlczoKKwora2V5cGFkLG51bS1yb3dzIGFuZCBrZXlwYWQsbnVtLWNvbHVtbnMgYXJlIHJlcXVpcmVkLgorCitSZXF1aXJlZCBTb0MgU3BlY2lmaWMgUHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogc2hvdWxkIGJlICJicmNtLGJjbS1rZXlwYWQiCisKKy0gcmVnOiBwaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbnRyb2xsZXIgYW5kIGxlbmd0aCBvZiBtZW1vcnkgbWFwcGVkCisgIHJlZ2lvbi4KKworLSBpbnRlcnJ1cHRzOiBUaGUgaW50ZXJydXB0IG51bWJlciB0byB0aGUgY3B1LgorCitCb2FyZCBTcGVjaWZpYyBQcm9wZXJ0aWVzOgorLSBrZXlwYWQsbnVtLXJvd3M6IE51bWJlciBvZiByb3cgbGluZXMgY29ubmVjdGVkIHRvIHRoZSBrZXlwYWQKKyAgY29udHJvbGxlci4KKworLSBrZXlwYWQsbnVtLWNvbHVtbnM6IE51bWJlciBvZiBjb2x1bW4gbGluZXMgY29ubmVjdGVkIHRvIHRoZQorICBrZXlwYWQgY29udHJvbGxlci4KKworLSBjb2wtZGVib3VuY2UtZmlsdGVyLXBlcmlvZDogVGhlIGRlYm91bmNlIHBlcmlvZCBmb3IgdGhlIENvbHVtbiBmaWx0ZXIuCisKKwlLRVlQQURfREVCT1VOQ0VfMV9tcwk9CTAKKwlLRVlQQURfREVCT1VOQ0VfMl9tcwk9CTEKKwlLRVlQQURfREVCT1VOQ0VfNF9tcwk9CTIKKwlLRVlQQURfREVCT1VOQ0VfOF9tcwk9CTMKKwlLRVlQQURfREVCT1VOQ0VfMTZfbXMJPQk0CisJS0VZUEFEX0RFQk9VTkNFXzMyX21zCT0JNQorCUtFWVBBRF9ERUJPVU5DRV82NF9tcwk9CTYKKwlLRVlQQURfREVCT1VOQ0VfMTI4X21zCT0JNworCistIHN0YXR1cy1kZWJvdW5jZS1maWx0ZXItcGVyaW9kOiBUaGUgZGVib3VuY2UgcGVyaW9kIGZvciB0aGUgU3RhdHVzIGZpbHRlci4KKworCUtFWVBBRF9ERUJPVU5DRV8xX21zCT0JMAorCUtFWVBBRF9ERUJPVU5DRV8yX21zCT0JMQorCUtFWVBBRF9ERUJPVU5DRV80X21zCT0JMgorCUtFWVBBRF9ERUJPVU5DRV84X21zCT0JMworCUtFWVBBRF9ERUJPVU5DRV8xNl9tcwk9CTQKKwlLRVlQQURfREVCT1VOQ0VfMzJfbXMJPQk1CisJS0VZUEFEX0RFQk9VTkNFXzY0X21zCT0JNgorCUtFWVBBRF9ERUJPVU5DRV8xMjhfbXMJPQk3CisKKy0gcm93LW91dHB1dC1lbmFibGVkOiBBbiBvcHRpb25hbCBwcm9wZXJ0eSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJvdyBvcgorICBjb2x1bW4gaXMgYmVpbmcgdXNlZCBhcyBvdXRwdXQuIElmIHNwZWNpZmllZCB0aGUgcm93IGlzIGJlaW5nIHVzZWQKKyAgYXMgdGhlIG91dHB1dC4gRWxzZSBkZWZhdWx0cyB0byBjb2x1bW4uCisKKy0gcHVsbC11cC1lbmFibGVkOiBBbiBvcHRpb25hbCBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoZSBLZXlwYWQgc2NhbiBtb2RlLgorICBJZiBzcGVjaWZpZWQgaW1wbGllcyB0aGUga2V5cGFkIHNjYW4gcHVsbC11cCBoYXMgYmVlbiBlbmFibGVkLgorCistIGF1dG9yZXBlYXQ6IEJvb2xlYW4sIEVuYWJsZSBhdXRvIHJlcGVhdCBmZWF0dXJlIG9mIExpbnV4IGlucHV0CisJICBzdWJzeXN0ZW0gKG9wdGlvbmFsKS4KKworLSBsaW51eCxrZXltYXA6IFRoZSBrZXltYXAgZm9yIGtleXMgYXMgZGVzY3JpYmVkIGluIHRoZSBiaW5kaW5nIGRvY3VtZW50CisgIGRldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvbWF0cml4LWtleW1hcC50eHQuCisKK0V4YW1wbGU6CisjaW5jbHVkZSAiZHQtYmluZGluZ3MvaW5wdXQvaW5wdXQuaCIKKworLyB7CisJa2V5cGFkOiBrZXlwYWRAMTgwYWMwMDAgeworCQkvKiBSZXF1aXJlZCBTb0Mgc3BlY2lmaWMgcHJvcGVydGllcyAqLworCQljb21wYXRpYmxlID0gImJyY20sYmNtLWtleXBhZCI7CisKKwkJLyogUmVxdWlyZWQgQm9hcmQgc3BlY2lmaWMgcHJvcGVydGllcyAqLworCQlrZXlwYWQsbnVtLXJvd3MgPSA8NT47CisJCWtleXBhZCxudW0tY29sdW1ucyA9IDw1PjsKKwkJc3RhdHVzID0gIm9rYXkiOworCisJCWxpbnV4LGtleW1hcCA9IDxNQVRSSVhfS0VZKDB4MDAsIDB4MDIsIEtFWV9GKSAvKiBrZXlfZm9yd2FyZCAqLworCQlNQVRSSVhfS0VZKDB4MDAsIDB4MDMsIEtFWV9IT01FKSAvKiBrZXlfaG9tZSAqLworCQlNQVRSSVhfS0VZKDB4MDAsIDB4MDQsIEtFWV9NKSAvKiBrZXlfbWVzc2FnZSAqLworCQlNQVRSSVhfS0VZKDB4MDEsIDB4MDAsIEtFWV9BKSAvKiBrZXlfY29udGFjdHMgKi8KKwkJTUFUUklYX0tFWSgweDAxLCAweDAxLCBLRVlfMSkgLyoga2V5XzEgKi8KKwkJTUFUUklYX0tFWSgweDAxLCAweDAyLCBLRVlfMikgLyoga2V5XzIgKi8KKwkJTUFUUklYX0tFWSgweDAxLCAweDAzLCBLRVlfMykgLyoga2V5XzMgKi8KKwkJTUFUUklYX0tFWSgweDAxLCAweDA0LCBLRVlfUykgLyoga2V5X3NwZWFrZXIgKi8KKwkJTUFUUklYX0tFWSgweDAyLCAweDAwLCBLRVlfUCkgLyoga2V5X3Bob25lICovCisJCU1BVFJJWF9LRVkoMHgwMiwgMHgwMSwgS0VZXzQpIC8qIGtleV80ICovCisJCU1BVFJJWF9LRVkoMHgwMiwgMHgwMiwgS0VZXzUpIC8qIGtleV81ICovCisJCU1BVFJJWF9LRVkoMHgwMiwgMHgwMywgS0VZXzYpIC8qIGtleV82ICovCisJCU1BVFJJWF9LRVkoMHgwMiwgMHgwNCwgS0VZX1ZPTFVNRVVQKSAvKiBrZXlfdm9sX3VwICovCisJCU1BVFJJWF9LRVkoMHgwMywgMHgwMCwgS0VZX0MpIC8qIGtleV9jYWxsX2xvZyAqLworCQlNQVRSSVhfS0VZKDB4MDMsIDB4MDEsIEtFWV83KSAvKiBrZXlfNyAqLworCQlNQVRSSVhfS0VZKDB4MDMsIDB4MDIsIEtFWV84KSAvKiBrZXlfOCAqLworCQlNQVRSSVhfS0VZKDB4MDMsIDB4MDMsIEtFWV85KSAvKiBrZXlfOSAqLworCQlNQVRSSVhfS0VZKDB4MDMsIDB4MDQsIEtFWV9WT0xVTUVET1dOKSAvKiBrZXlfdm9sX2Rvd24gKi8KKwkJTUFUUklYX0tFWSgweDA0LCAweDAwLCBLRVlfSCkgLyoga2V5X2hlYWRzZXQgKi8KKwkJTUFUUklYX0tFWSgweDA0LCAweDAxLCBLRVlfS1BBU1RFUklTSykgLyoga2V5XyogKi8KKwkJTUFUUklYX0tFWSgweDA0LCAweDAyLCBLRVlfMCkgLyoga2V5XzAgKi8KKwkJTUFUUklYX0tFWSgweDA0LCAweDAzLCBLRVlfR1JBVkUpIC8qIGtleV8jICovCisJCU1BVFJJWF9LRVkoMHgwNCwgMHgwNCwgS0VZX01VVEUpIC8qIGtleV9tdXRlICovCisJCT47CisKKwkJLyogT3B0aW9uYWwgYm9hcmQgc3BlY2lmaWMgcHJvcGVydGllcyAqLworCQljb2wtZGVib3VuY2UtZmlsdGVyLXBlcmlvZCA9IDw1PjsKKwkJcm93LW91dHB1dC1lbmFibGVkOworCQlwdWxsLXVwLWVuYWJsZWQ7CisKKwl9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC9xY29tLHBtODk0MS1wd3JrZXkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3Fjb20scG04OTQxLXB3cmtleS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiZjU1ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC9xY29tLHBtODk0MS1wd3JrZXkudHh0CkBAIC0wLDAgKzEsNDMgQEAKK1F1YWxjb21tIFBNODk0MSBQTUlDIFBvd2VyIEtleQorCitQUk9QRVJUSUVTCisKKy0gY29tcGF0aWJsZToKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IG11c3QgYmUgb25lIG9mOgorCQkgICAgInFjb20scG04OTQxLXB3cmtleSIKKworLSByZWc6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBiYXNlIGFkZHJlc3Mgb2YgcmVnaXN0ZXJzIGZvciBibG9jaworCistIGludGVycnVwdHM6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBrZXkgY2hhbmdlIGludGVycnVwdDsgVGhlIGZvcm1hdCBvZiB0aGUgc3BlY2lmaWVyIGlzCisJCSAgICBkZWZpbmVkIGJ5IHRoZSBiaW5kaW5nIGRvY3VtZW50IGRlc2NyaWJpbmcgdGhlIG5vZGUncworCQkgICAgaW50ZXJydXB0IHBhcmVudC4KKworLSBkZWJvdW5jZToKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8dTMyPgorCURlZmluaXRpb246IHRpbWUgaW4gbWljcm9zZWNvbmRzIHRoYXQga2V5IG11c3QgYmUgcHJlc3NlZCBvciByZWxlYXNlZAorCQkgICAgZm9yIHN0YXRlIGNoYW5nZSBpbnRlcnJ1cHQgdG8gdHJpZ2dlci4KKworLSBiaWFzLXB1bGwtdXA6CisJVXNhZ2U6IG9wdGlvbmFsCisJVmFsdWUgdHlwZTogPGVtcHR5PgorCURlZmluaXRpb246IHByZXNlbmNlIG9mIHRoaXMgcHJvcGVydHkgaW5kaWNhdGVzIHRoYXQgdGhlIEtQRFBXUl9OIHBpbgorCQkgICAgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgZm9yIHB1bGwgdXAuCisKK0VYQU1QTEUKKworCXB3cmtleUA4MDAgeworCQljb21wYXRpYmxlID0gInFjb20scG04OTQxLXB3cmtleSI7CisJCXJlZyA9IDwweDgwMD47CisJCWludGVycnVwdHMgPSA8MHgwIDB4OCAwIElSUV9UWVBFX0VER0VfQk9USD47CisJCWRlYm91bmNlID0gPDE1NjI1PjsKKwkJYmlhcy1wdWxsLXVwOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vYnJjbSxpcHJvYy10b3VjaHNjcmVlbi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vYnJjbSxpcHJvYy10b3VjaHNjcmVlbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlMzM4MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9icmNtLGlwcm9jLXRvdWNoc2NyZWVuLnR4dApAQCAtMCwwICsxLDc2IEBACisqIEJyb2FkY29tJ3MgSVBST0MgVG91Y2hzY3JlZW4gQ29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBtdXN0IGJlICJicmNtLGlwcm9jLXRvdWNoc2NyZWVuIgorLSByZWc6IHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgY29udHJvbGxlciBhbmQgbGVuZ3RoIG9mIG1lbW9yeSBtYXBwZWQKKyAgcmVnaW9uLgorLSBjbG9ja3M6ICBUaGUgY2xvY2sgcHJvdmlkZWQgYnkgdGhlIFNPQyB0byBkcml2ZXIgdGhlIHRzYworLSBjbG9jay1uYW1lOiAgbmFtZSBmb3IgdGhlIGNsb2NrCistIGludGVycnVwdHM6IFRoZSB0b3VjaHNjcmVlbiBjb250cm9sbGVyJ3MgaW50ZXJydXB0CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHNjYW5uaW5nX3BlcmlvZDogVGltZSBiZXR3ZWVuIHNjYW5zLiBFYWNoIHN0ZXAgaXMgMTAyNCB1cy4gIFZhbGlkIDEtMjU2LgorLSBkZWJvdW5jZV90aW1lb3V0OiBFYWNoIHN0ZXAgaXMgNTEyIHVzLiAgVmFsaWQgMC0yNTUKKy0gc2V0dGxpbmdfdGltZW91dDogVGhlIHNldHRsaW5nIGR1cmF0aW9uIChpbiBtcykgaXMgdGhlIGFtb3VudCBvZiB0aW1lCisgICAgICAgICAgICAgICAgICAgIHRoZSB0c2Mgd2FpdHMgdG8gYWxsb3cgdGhlIHZvbHRhZ2UgdG8gc2V0dGxlIGFmdGVyCisgICAgICAgICAgICAgICAgICAgIHR1cm5pbmcgb24gdGhlIGRyaXZlcnMgaW4gZGV0ZWN0aW9uIG1vZGUuCisgICAgICAgICAgICAgICAgICAgIFZhbGlkIHZhbHVlczogMC0xMQorICAgICAgICAgICAgICAgICAgICAwID0gIDAuMDA4IG1zCisgICAgICAgICAgICAgICAgICAgIDEgPSAgMC4wMSBtcworICAgICAgICAgICAgICAgICAgICAyID0gIDAuMDIgbXMKKyAgICAgICAgICAgICAgICAgICAgMyA9ICAwLjA0IG1zCisgICAgICAgICAgICAgICAgICAgIDQgPSAgMC4wOCBtcworICAgICAgICAgICAgICAgICAgICA1ID0gIDAuMTYgbXMKKyAgICAgICAgICAgICAgICAgICAgNiA9ICAwLjMyIG1zCisgICAgICAgICAgICAgICAgICAgIDcgPSAgMC42NCBtcworICAgICAgICAgICAgICAgICAgICA4ID0gIDEuMjggbXMKKyAgICAgICAgICAgICAgICAgICAgOSA9ICAyLjU2IG1zCisgICAgICAgICAgICAgICAgICAgMTAgPSAgNS4xMiBtcworICAgICAgICAgICAgICAgICAgIDExID0gMTAuMjQgbXMKKy0gdG91Y2hfdGltZW91dDogVGhlIGNvbnRpbnVvdXMgbnVtYmVyIG9mIHNjYW4gcGVyaW9kcyBpbiB3aGljaCB0b3VjaCBpcworICAgICAgICAgICAgICAgIG5vdCBkZXRlY3RlZCBiZWZvcmUgdGhlIGNvbnRyb2xsZXIgcmV0dXJucyB0byBpZGxlIHN0YXRlLgorICAgICAgICAgICAgICAgIFZhbGlkIHZhbHVlcyAwLTI1NS4KKy0gYXZlcmFnZV9kYXRhOiBOdW1iZXIgb2YgZGF0YSBzYW1wbGVzIHdoaWNoIGFyZSBhdmVyYWdlZCBiZWZvcmUgYSBmaW5hbAorICAgICAgICAgICAgICAgIGRhdGEgcG9pbnQgaXMgcGxhY2VkIGludG8gdGhlIEZJRk8KKyAgICAgICAgICAgICAgICBWYWxpZCB2YWx1ZXMgMC03CisgICAgICAgICAgICAgICAgMCA9ICAgMSBzYW1wbGUKKyAgICAgICAgICAgICAgICAxID0gICAyIHNhbXBsZXMKKyAgICAgICAgICAgICAgICAyID0gICA0IHNhbXBsZXMKKyAgICAgICAgICAgICAgICAzID0gICA4IHNhbXBsZXMKKyAgICAgICAgICAgICAgICA0ID0gIDE2IHNhbXBsZXMKKyAgICAgICAgICAgICAgICA1ID0gIDMyIHNhbXBsZXMKKyAgICAgICAgICAgICAgICA2ID0gIDY0IHNhbXBsZXMKKyAgICAgICAgICAgICAgICA3ID0gMTI4IHNhbXBsZXMKKy0gZmlmb190aHJlc2hvbGQ6IEludGVycnVwdCBpcyBnZW5lcmF0ZWQgd2hlbmV2ZXIgdGhlIG51bWJlciBvZiBmaWZvCisgICAgICAgICAgICAgICAgZW50cmllcyBleGNlZWRzIHRoaXMgdmFsdWUKKyAgICAgICAgICAgICAgICBWYWxpZCB2YWx1ZXMgMC0zMQorLSB0b3VjaHNjcmVlbi1zaXplLXg6IGhvcml6b250YWwgcmVzb2x1dGlvbiBvZiB0b3VjaHNjcmVlbiAoaW4gcGl4ZWxzKQorLSB0b3VjaHNjcmVlbi1zaXplLXk6IHZlcnRpY2FsIHJlc29sdXRpb24gb2YgdG91Y2hzY3JlZW4gKGluIHBpeGVscykKKy0gdG91Y2hzY3JlZW4tZnV6ei14OiBob3Jpem9udGFsIG5vaXNlIHZhbHVlIG9mIHRoZSBhYnNvbHV0ZSBpbnB1dAorICAgICAgICAgICAgICAgICAgICAgIGRldmljZSAoaW4gcGl4ZWxzKQorLSB0b3VjaHNjcmVlbi1mdXp6LXk6IHZlcnRpY2FsIG5vaXNlIHZhbHVlIG9mIHRoZSBhYnNvbHV0ZSBpbnB1dAorICAgICAgICAgICAgICAgICAgICAgIGRldmljZSAoaW4gcGl4ZWxzKQorLSB0b3VjaHNjcmVlbi1pbnZlcnRlZC14OiBYIGF4aXMgaXMgaW52ZXJ0ZWQgKGJvb2xlYW4pCistIHRvdWNoc2NyZWVuLWludmVydGVkLXk6IFkgYXhpcyBpcyBpbnZlcnRlZCAoYm9vbGVhbikKKworRXhhbXBsZToKKworCXRvdWNoc2NyZWVuOiB0c2NAMHgxODBBNjAwMCB7CisJCWNvbXBhdGlibGUgPSAiYnJjbSxpcHJvYy10b3VjaHNjcmVlbiI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4MTgwQTYwMDAgMHg0MD47CisJCWNsb2NrcyA9IDwmYWRjX2Nsaz47CisJCWNsb2NrLW5hbWVzID0gInRzY19jbGsiOworCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTY0IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCisJCXNjYW5uaW5nX3BlcmlvZCA9IDw1PjsKKwkJZGVib3VuY2VfdGltZW91dCA9IDw0MD47CisJCXNldHRsaW5nX3RpbWVvdXQgPSA8Nz47CisJCXRvdWNoX3RpbWVvdXQgPSA8MTA+OworCQlhdmVyYWdlX2RhdGEgPSA8NT47CisJCWZpZm9fdGhyZXNob2xkID0gPDE+OworCQkvKiBUb3VjaHNjcmVlbiBpcyByb3RhdGVkIDE4MCBkZWdyZWVzLiAqLworCQl0b3VjaHNjcmVlbi1pbnZlcnRlZC14OworCQl0b3VjaHNjcmVlbi1pbnZlcnRlZC15OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vY2hpcG9uZV9pY244MzE4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9jaGlwb25lX2ljbjgzMTgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMWY4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vY2hpcG9uZV9pY244MzE4LnR4dApAQCAtMCwwICsxLDQ2IEBACisqIENoaXBPbmUgaWNuODMxOCBJMkMgdG91Y2hzY3JlZW4gY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorIC0gY29tcGF0aWJsZQkJICA6ICJjaGlwb25lLGljbjgzMTgiCisgLSByZWcJCQkgIDogSTJDIHNsYXZlIGFkZHJlc3Mgb2YgdGhlIGNoaXAgKDB4NDApCisgLSBpbnRlcnJ1cHQtcGFyZW50CSAgOiBhIHBoYW5kbGUgcG9pbnRpbmcgdG8gdGhlIGludGVycnVwdCBjb250cm9sbGVyCisJCQkgICAgc2VydmluZyB0aGUgaW50ZXJydXB0IGZvciB0aGlzIGNoaXAKKyAtIGludGVycnVwdHMJCSAgOiBpbnRlcnJ1cHQgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIGljbjgzMTggaW50ZXJydXB0CisgLSB3YWtlLWdwaW9zCQkgIDogR1BJTyBzcGVjaWZpY2F0aW9uIGZvciB0aGUgV0FLRSBpbnB1dAorIC0gdG91Y2hzY3JlZW4tc2l6ZS14CSAgOiBob3Jpem9udGFsIHJlc29sdXRpb24gb2YgdG91Y2hzY3JlZW4gKGluIHBpeGVscykKKyAtIHRvdWNoc2NyZWVuLXNpemUteQkgIDogdmVydGljYWwgcmVzb2x1dGlvbiBvZiB0b3VjaHNjcmVlbiAoaW4gcGl4ZWxzKQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorIC0gcGluY3RybC1uYW1lcwkgIDogc2hvdWxkIGJlICJkZWZhdWx0IgorIC0gcGluY3RybC0wOgkJICA6IGEgcGhhbmRsZSBwb2ludGluZyB0byB0aGUgcGluIHNldHRpbmdzIGZvciB0aGUKKwkJCSAgICBjb250cm9sIGdwaW9zCisgLSB0b3VjaHNjcmVlbi1mdXp6LXgJICA6IGhvcml6b250YWwgbm9pc2UgdmFsdWUgb2YgdGhlIGFic29sdXRlIGlucHV0CisJCQkgICAgZGV2aWNlIChpbiBwaXhlbHMpCisgLSB0b3VjaHNjcmVlbi1mdXp6LXkJICA6IHZlcnRpY2FsIG5vaXNlIHZhbHVlIG9mIHRoZSBhYnNvbHV0ZSBpbnB1dAorCQkJICAgIGRldmljZSAoaW4gcGl4ZWxzKQorIC0gdG91Y2hzY3JlZW4taW52ZXJ0ZWQteCA6IFggYXhpcyBpcyBpbnZlcnRlZCAoYm9vbGVhbikKKyAtIHRvdWNoc2NyZWVuLWludmVydGVkLXkgOiBZIGF4aXMgaXMgaW52ZXJ0ZWQgKGJvb2xlYW4pCisgLSB0b3VjaHNjcmVlbi1zd2FwcGVkLXgteQkgIDogWCBhbmQgWSBheGlzIGFyZSBzd2FwcGVkIChib29sZWFuKQorCQkJICAgIFN3YXBwaW5nIGlzIGRvbmUgYWZ0ZXIgaW52ZXJ0aW5nIHRoZSBheGlzCisKK0V4YW1wbGU6CisKK2kyY0AwMDAwMDAwMCB7CisJLyogLi4uICovCisKKwljaGlwb25lX2ljbjgzMThANDAgeworCQljb21wYXRpYmxlID0gImNoaXBvbmUsaWNuODMxOCI7CisJCXJlZyA9IDwweDQwPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmcGlvPjsKKwkJaW50ZXJydXB0cyA9IDw5IElSUV9UWVBFX0VER0VfRkFMTElORz47IC8qIEVJTlQ5IChQRzkpICovCisJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJCXBpbmN0cmwtMCA9IDwmdHNfd2FrZV9waW5fcDY2PjsKKwkJd2FrZS1ncGlvcyA9IDwmcGlvIDEgMyBHUElPX0FDVElWRV9ISUdIPjsgLyogUEIzICovCisJCXRvdWNoc2NyZWVuLXNpemUteCA9IDw4MDA+OworCQl0b3VjaHNjcmVlbi1zaXplLXkgPSA8NDgwPjsKKwkJdG91Y2hzY3JlZW4taW52ZXJ0ZWQteDsKKwkJdG91Y2hzY3JlZW4tc3dhcHBlZC14LXk7CisJfTsKKworCS8qIC4uLiAqLworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9nb29kaXgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RvdWNoc2NyZWVuL2dvb2RpeC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhOThlZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9nb29kaXgudHh0CkBAIC0wLDAgKzEsMjkgQEAKK0RldmljZSB0cmVlIGJpbmRpbmdzIGZvciBHb29kaXggR1Q5eHggc2VyaWVzIHRvdWNoc2NyZWVuIGNvbnRyb2xsZXIKKworUmVxdWlyZWQgcHJvcGVydGllczoKKworIC0gY29tcGF0aWJsZQkJOiBTaG91bGQgYmUgImdvb2RpeCxndDkxMSIKKwkJCQkgb3IgImdvb2RpeCxndDkxMTAiCisJCQkJIG9yICJnb29kaXgsZ3Q5MTIiCisJCQkJIG9yICJnb29kaXgsZ3Q5MjciCisJCQkJIG9yICJnb29kaXgsZ3Q5MjcxIgorCQkJCSBvciAiZ29vZGl4LGd0OTI4IgorCQkJCSBvciAiZ29vZGl4LGd0OTY3IgorIC0gcmVnCQkJOiBJMkMgYWRkcmVzcyBvZiB0aGUgY2hpcC4gU2hvdWxkIGJlIDB4NWQgb3IgMHgxNAorIC0gaW50ZXJydXB0LXBhcmVudAk6IEludGVycnVwdCBjb250cm9sbGVyIHRvIHdoaWNoIHRoZSBjaGlwIGlzIGNvbm5lY3RlZAorIC0gaW50ZXJydXB0cwkJOiBJbnRlcnJ1cHQgdG8gd2hpY2ggdGhlIGNoaXAgaXMgY29ubmVjdGVkCisKK0V4YW1wbGU6CisKKwlpMmNAMDAwMDAwMDAgeworCQkvKiAuLi4gKi8KKworCQlndDkyOEA1ZCB7CisJCQljb21wYXRpYmxlID0gImdvb2RpeCxndDkyOCI7CisJCQlyZWcgPSA8MHg1ZD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZncGlvPjsKKwkJCWludGVycnVwdHMgPSA8MCAwPjsKKwkJfTsKKworCQkvKiAuLi4gKi8KKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RvdWNoc2NyZWVuL3N1bjRpLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi9zdW40aS50eHQKaW5kZXggNDMzMzMyZC4uODlhYmVjZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RvdWNoc2NyZWVuL3N1bjRpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vc3VuNGkudHh0CkBAIC0yLDE0ICsyLDI3IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotIC0gY29tcGF0aWJsZTogImFsbHdpbm5lcixzdW40aS1hMTAtdHMiIG9yICJhbGx3aW5uZXIsc3VuNmktYTMxLXRzIgorIC0gY29tcGF0aWJsZTogImFsbHdpbm5lcixzdW40aS1hMTAtdHMiLCAiYWxsd2lubmVyLHN1bjVpLWExMy10cyIgb3IKKyAgICJhbGx3aW5uZXIsc3VuNmktYTMxLXRzIgogIC0gcmVnOiBtbWlvIGFkZHJlc3MgcmFuZ2Ugb2YgdGhlIGNoaXAKICAtIGludGVycnVwdHM6IGludGVycnVwdCB0byB3aGljaCB0aGUgY2hpcCBpcyBjb25uZWN0ZWQKICAtICN0aGVybWFsLXNlbnNvci1jZWxsczogc2hhbGwgYmUgMAogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgotIC0gYWxsd2lubmVyLHRzLWF0dGFjaGVkOiBib29sZWFuIGluZGljYXRpbmcgdGhhdCBhbiBhY3R1YWwgdG91Y2hzY3JlZW4gaXMKLQkJCSAgYXR0YWNoZWQgdG8gdGhlIGNvbnRyb2xsZXIKKyAtIGFsbHdpbm5lcix0cy1hdHRhY2hlZAkgOiBib29sZWFuIGluZGljYXRpbmcgdGhhdCBhbiBhY3R1YWwgdG91Y2hzY3JlZW4KKwkJCQkgICBpcyBhdHRhY2hlZCB0byB0aGUgY29udHJvbGxlcgorIC0gYWxsd2lubmVyLHRwLXNlbnNpdGl2ZS1hZGp1c3QgOiBpbnRlZ2VyICg0IGJpdHMpCisJCQkJICAgYWRqdXN0IHNlbnNpdGl2aXR5IG9mIHBlbiBkb3duIGRldGVjdGlvbgorCQkJCSAgIGJldHdlZW4gMCAobGVhc3Qgc2Vuc2l0aXZlKSBhbmQgMTUKKwkJCQkgICAoZGVmYXVsdHMgdG8gMTUpCisgLSBhbGx3aW5uZXIsZmlsdGVyLXR5cGUJIDogaW50ZWdlciAoMiBiaXRzKQorCQkJCSAgIHNlbGVjdCBtZWRpYW4gYW5kIGF2ZXJhZ2luZyBmaWx0ZXIKKwkJCQkgICBzYW1wbGVzIHVzZWQgZm9yIG1lZGlhbiAvIGF2ZXJhZ2luZyBmaWx0ZXIKKwkJCQkgICAwOiA0LzIKKwkJCQkgICAxOiA1LzMKKwkJCQkgICAyOiA4LzQKKwkJCQkgICAzOiAxNi84CisJCQkJICAgKGRlZmF1bHRzIHRvIDEpCiAKIEV4YW1wbGU6CiAKQEAgLTE5LDQgKzMyLDcgQEAKIAkJaW50ZXJydXB0cyA9IDwyOT47CiAJCWFsbHdpbm5lcix0cy1hdHRhY2hlZDsKIAkJI3RoZXJtYWwtc2Vuc29yLWNlbGxzID0gPDA+OworCQkvKiBzZW5zaXRpdmUvbm9pc3kgdG91Y2ggcGFuZWwgKi8KKwkJYWxsd2lubmVyLHRwLXNlbnNpdGl2ZS1hZGp1c3QgPSA8MD47CisJCWFsbHdpbm5lcixmaWx0ZXItdHlwZSA9IDwzPjsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RvdWNoc2NyZWVuL3N4ODY1NC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vc3g4NjU0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWFhNmIzCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RvdWNoc2NyZWVuL3N4ODY1NC50eHQKQEAgLTAsMCArMSwxNiBAQAorKiBTZW10ZWNoIFNYODY1NCBJMkMgVG91Y2hzY3JlZW4gQ29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBtdXN0IGJlICJzZW10ZWNoLHN4ODY1NCIKKy0gcmVnOiBpMmMgc2xhdmUgYWRkcmVzcworLSBpbnRlcnJ1cHQtcGFyZW50OiB0aGUgcGhhbmRsZSBmb3IgdGhlIGludGVycnVwdCBjb250cm9sbGVyCistIGludGVycnVwdHM6IHRvdWNoIGNvbnRyb2xsZXIgaW50ZXJydXB0CisKK0V4YW1wbGU6CisKKwlzeDg2NTRANDggeworCQljb21wYXRpYmxlID0gInNlbXRlY2gsc3g4NjU0IjsKKwkJcmVnID0gPDB4NDg+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZncGlvNj47CisJCWludGVycnVwdHMgPSA8MyBJUlFfVFlQRV9FREdFX0ZBTExJTkc+OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vdG91Y2hzY3JlZW4udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L3RvdWNoc2NyZWVuL3RvdWNoc2NyZWVuLnR4dAppbmRleCBkOGUwNjE2Li5hYzIzY2FmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vdG91Y2hzY3JlZW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnB1dC90b3VjaHNjcmVlbi90b3VjaHNjcmVlbi50eHQKQEAgLTE2LDYgKzE2LDggQEAKIAkJCQkgIGNvbnRyb2xsZXIpCiAgLSB0b3VjaHNjcmVlbi1pbnZlcnRlZC14CTogWCBheGlzIGlzIGludmVydGVkIChib29sZWFuKQogIC0gdG91Y2hzY3JlZW4taW52ZXJ0ZWQteQk6IFkgYXhpcyBpcyBpbnZlcnRlZCAoYm9vbGVhbikKKyAtIHRvdWNoc2NyZWVuLXN3YXBwZWQteC15CTogWCBhbmQgWSBheGlzIGFyZSBzd2FwcGVkIChib29sZWFuKQorCQkJCSAgU3dhcHBpbmcgaXMgZG9uZSBhZnRlciBpbnZlcnRpbmcgdGhlIGF4aXMKIAogRGVwcmVjYXRlZCBwcm9wZXJ0aWVzIGZvciBUb3VjaHNjcmVlbnM6CiAgLSB4LXNpemUJCQk6IGRlcHJlY2F0ZWQgbmFtZSBmb3IgdG91Y2hzY3JlZW4tc2l6ZS14CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvbnZpZGlhLHRlZ3JhLWljdGxyLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9udmlkaWEsdGVncmEtaWN0bHIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOTlmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvbnZpZGlhLHRlZ3JhLWljdGxyLnR4dApAQCAtMCwwICsxLDQzIEBACitOVklESUEgTGVnYWN5IEludGVycnVwdCBDb250cm9sbGVyCisKK0FsbCBUZWdyYSBTb0NzIGNvbnRhaW4gYSBsZWdhY3kgaW50ZXJydXB0IGNvbnRyb2xsZXIgdGhhdCByb3V0ZXMKK2ludGVycnVwdHMgdG8gdGhlIEdJQywgYW5kIGFsc28gc2VydmVzIGFzIGEgd2FrZXVwIHNvdXJjZS4gSXQgaXMgYWxzbworcmVmZXJyZWQgdG8gYXMgImljdGxyIiwgaGVuY2UgdGhlIG5hbWUgb2YgdGhlIGJpbmRpbmcuCisKK1RoZSBIVyBibG9jayBleHBvc2VzIGEgbnVtYmVyIG9mIGludGVycnVwdCBjb250cm9sbGVycywgZWFjaAoraW1wbGVtZW50aW5nIGEgc2V0IG9mIDMyIGludGVycnVwdHMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZTogIm52aWRpYSx0ZWdyYTxjaGlwPi1pY3RsciIuIFRoZSBMSUMgb24KKyAgc3Vic2VxdWVudCBTb0NzIHJlbWFpbmVkIGJhY2t3YXJkcy1jb21wYXRpYmxlIHdpdGggVGVncmEzMCwgc28gb24KKyAgVGVncmEgZ2VuZXJhdGlvbnMgbGF0ZXIgdGhhbiBUZWdyYTMwIHRoZSBjb21wYXRpYmxlIHZhbHVlIHNob3VsZAorICBpbmNsdWRlICJudmlkaWEsdGVncmEzMC1pY3RsciIuCQorLSByZWcgOiBTcGVjaWZpZXMgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSByZWdpc3RlcnMuCisgIEVhY2ggY29udHJvbGxlciBtdXN0IGJlIGRlc2NyaWJlZCBzZXBhcmF0ZWx5IChUZWdyYTIwIGhhcyA0IG9mIHRoZW0sCisgIHdoZXJlYXMgVGVncmEzMCBhbmQgbGF0ZXIgaGF2ZSA1IiAgCistIGludGVycnVwdC1jb250cm9sbGVyIDogSWRlbnRpZmllcyB0aGUgbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlci4KKy0gI2ludGVycnVwdC1jZWxscyA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNlbGxzIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgaW50ZXJydXB0IHNvdXJjZS4gVGhlIHZhbHVlIG11c3QgYmUgMy4KKy0gaW50ZXJydXB0LXBhcmVudCA6IGEgcGhhbmRsZSB0byB0aGUgR0lDIHRoZXNlIGludGVycnVwdHMgYXJlIHJvdXRlZAorICB0by4KKworTm90ZXM6CisKKy0gQmVjYXVzZSB0aGlzIEhXIHVsdGltYXRlbHkgcm91dGVzIGludGVycnVwdHMgdG8gdGhlIEdJQywgdGhlCisgIGludGVycnVwdCBzcGVjaWZpZXIgbXVzdCBiZSB0aGF0IG9mIHRoZSBHSUMuCistIE9ubHkgU1BJcyBjYW4gdXNlIHRoZSBpY3RsciBhcyBhbiBpbnRlcnJ1cHQgcGFyZW50LiBTR0lzIGFuZCBQUElzCisgIGFyZSBleHBsaWNpdGx5IGZvcmJpZGRlbi4KKworRXhhbXBsZToKKworCWljdGxyOiBpbnRlcnJ1cHQtY29udHJvbGxlckA2MDAwNDAwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtaWN0bHIiLCAibnZpZGlhLHRlZ3JhLWljdGxyIjsKKwkJcmVnID0gPDB4NjAwMDQwMDAgNjQ+LAorCQkgICAgICA8MHg2MDAwNDEwMCA2ND4sCisJCSAgICAgIDwweDYwMDA0MjAwIDY0PiwKKwkJICAgICAgPDB4NjAwMDQzMDAgNjQ+OworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9yZW5lc2FzLGlycWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3JlbmVzYXMsaXJxYy50eHQKaW5kZXggMWE4OGU2Mi4uNjM2MzNiZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3JlbmVzYXMsaXJxYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3JlbmVzYXMsaXJxYy50eHQKQEAgLTQsNyArNCw3IEBACiAKIC0gY29tcGF0aWJsZTogaGFzIHRvIGJlICJyZW5lc2FzLGlycWMtPHNvY3R5cGU+IiwgInJlbmVzYXMsaXJxYyIgYXMgZmFsbGJhY2suCiAgIEV4YW1wbGVzIHdpdGggc29jdHlwZXMgYXJlOgotICAgIC0gInJlbmVzYXMsaXJxYy1yOGE3M2E0IiAoUi1Nb2JpbGUgQVA2KQorICAgIC0gInJlbmVzYXMsaXJxYy1yOGE3M2E0IiAoUi1Nb2JpbGUgQVBFNikKICAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc5MCIgKFItQ2FyIEgyKQogICAgIC0gInJlbmVzYXMsaXJxYy1yOGE3NzkxIiAoUi1DYXIgTTItVykKICAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc5MiIgKFItQ2FyIFYySCkKQEAgLTEyLDYgKzEyLDcgQEAKICAgICAtICJyZW5lc2FzLGlycWMtcjhhNzc5NCIgKFItQ2FyIEUyKQogLSAjaW50ZXJydXB0LWNlbGxzOiBoYXMgdG8gYmUgPDI+OiBhbiBpbnRlcnJ1cHQgaW5kZXggYW5kIGZsYWdzLCBhcyBkZWZpbmVkIGluCiAgIGludGVycnVwdHMudHh0IGluIHRoaXMgZGlyZWN0b3J5CistIGNsb2NrczogTXVzdCBjb250YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbmFsIGNsb2NrLgogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogCkBAIC0yOSw0ICszMCw1IEBACiAJCQkgICAgIDwwIDEgSVJRX1RZUEVfTEVWRUxfSElHSD4sCiAJCQkgICAgIDwwIDIgSVJRX1RZUEVfTEVWRUxfSElHSD4sCiAJCQkgICAgIDwwIDMgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWNsb2NrcyA9IDwmbXN0cDRfY2xrcyBSOEE3NzkwX0NMS19JUlFDPjsKIAl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3N0LHN0aS1pcnEtc3lzY2ZnLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9zdCxzdGktaXJxLXN5c2NmZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VkNjAxNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9zdCxzdGktaXJxLXN5c2NmZy50eHQKQEAgLTAsMCArMSwzNSBAQAorU1RNaWNyb2VsZWN0cm9uaWNzIFNUaSBTeXN0ZW0gQ29uZmlndXJhdGlvbiBDb250cm9sbGVkIElSUXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09uIFNUaSBiYXNlZCBzeXN0ZW1zOyBFeHRlcm5hbCwgQ1RJIChDb3JlIFNpZ2h0KSwgUE1VIChQZXJmb3JtYW5jZSBNYW5hZ2VtZW50KSwKK2FuZCBQTDMxMCBMMiBDYWNoZSBJUlFzIGFyZSBjb250cm9sbGVkIHVzaW5nIFN5c3RlbSBDb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KK1RoaXMgZHJpdmVyIGlzIHVzZWQgdG8gdW5tYXNrIHRoZW0gcHJpb3IgdG8gdXNlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCTogU2hvdWxkIGJlIHNldCB0byBvbmUgb2Y6CisJCQkic3Qsc3RpaDQxNS1pcnEtc3lzY2ZnIgorCQkJInN0LHN0aWg0MTYtaXJxLXN5c2NmZyIKKwkJCSJzdCxzdGloNDA3LWlycS1zeXNjZmciCisJCQkic3Qsc3RpZDEyNy1pcnEtc3lzY2ZnIgorLSBzdCxzeXNjZmcJOiBQaGFuZGxlIHRvIENvcnRleC1BOSBJUlEgc3lzdGVtIGNvbmZpZyByZWdpc3RlcnMKKy0gc3QsaXJxLWRldmljZQk6IEFycmF5IG9mIElSUXMgdG8gZW5hYmxlIC0gc2hvdWxkIGJlIDIgaW4gbGVuZ3RoCistIHN0LGZpcS1kZXZpY2UJOiBBcnJheSBvZiBGSVFzIHRvIGVuYWJsZSAtIHNob3VsZCBiZSAyIGluIGxlbmd0aAorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBzdCxpbnZlcnQtZXh0CTogRXh0ZXJuYWwgSVJRcyBjYW4gYmUgaW52ZXJ0ZWQgYXQgd2lsbC4gIFRoaXMgcHJvcGVydHkgaW52ZXJ0cworCQkgIHRoZXNlIElSUXMgdXNpbmcgYml0d2lzZSBsb2dpYy4gIEEgbnVtYmVyIG9mIGRlZmluZXMgaGF2ZSBiZWVuCisJCSAgcHJvdmlkZWQgZm9yIGNvbnZlbmllbmNlOgorCQkJU1RfSVJRX1NZU0NGR19FWFRfMV9JTlYKKwkJCVNUX0lSUV9TWVNDRkdfRVhUXzJfSU5WCisJCQlTVF9JUlFfU1lTQ0ZHX0VYVF8zX0lOVgorRXhhbXBsZToKKworaXJxLXN5c2NmZyB7CisJY29tcGF0aWJsZSAgICA9ICJzdCxzdGloNDE2LWlycS1zeXNjZmciOworCXN0LHN5c2NmZyAgICAgPSA8JnN5c2NmZ19jcHU+OworCXN0LGlycS1kZXZpY2UgPSA8U1RfSVJRX1NZU0NGR19QTVVfMD4sCisJCQk8U1RfSVJRX1NZU0NGR19QTVVfMT47CisJc3QsZmlxLWRldmljZSA9IDxTVF9JUlFfU1lTQ0ZHX0RJU0FCTEVEPiwKKwkJCTxTVF9JUlFfU1lTQ0ZHX0RJU0FCTEVEPjsKKwlzdCxpbnZlcnQtZXh0ID0gPChTVF9JUlFfU1lTQ0ZHX0VYVF8xX0lOViB8IFNUX0lSUV9TWVNDRkdfRVhUXzNfSU5WKT47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL3RpLG9tYXA0LXd1Z2VuLW1wdSBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci90aSxvbWFwNC13dWdlbi1tcHUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlZmZhMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci90aSxvbWFwNC13dWdlbi1tcHUKQEAgLTAsMCArMSwzMyBAQAorVEkgT01BUDQgV2FrZS11cCBHZW5lcmF0b3IKKworQWxsIFRJIE9NQVA0LzUgKGFuZCB0aGVpciBkZXJpdmF0aXZlcykgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIgdGhhdAorcm91dGVzIGludGVycnVwdHMgdG8gdGhlIEdJQywgYW5kIGFsc28gc2VydmVzIGFzIGEgd2FrZXVwIHNvdXJjZS4gSXQKK2lzIGFsc28gcmVmZXJyZWQgdG8gYXMgIldVR0VOLU1QVSIsIGhlbmNlIHRoZSBuYW1lIG9mIHRoZSBiaW5kaW5nLgorCitSZWd1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGUgOiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCAidGksb21hcDQtd3VnZW4tbXB1IiBvcgorICAidGksb21hcDUtd3VnZW4tbXB1IgorLSByZWcgOiBTcGVjaWZpZXMgYmFzZSBwaHlzaWNhbCBhZGRyZXNzIGFuZCBzaXplIG9mIHRoZSByZWdpc3RlcnMuCistIGludGVycnVwdC1jb250cm9sbGVyIDogSWRlbnRpZmllcyB0aGUgbm9kZSBhcyBhbiBpbnRlcnJ1cHQgY29udHJvbGxlci4KKy0gI2ludGVycnVwdC1jZWxscyA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNlbGxzIG5lZWRlZCB0byBlbmNvZGUgYW4KKyAgaW50ZXJydXB0IHNvdXJjZS4gVGhlIHZhbHVlIG11c3QgYmUgMy4KKy0gaW50ZXJydXB0LXBhcmVudCA6IGEgcGhhbmRsZSB0byB0aGUgR0lDIHRoZXNlIGludGVycnVwdHMgYXJlIHJvdXRlZAorICB0by4KKworTm90ZXM6CisKKy0gQmVjYXVzZSB0aGlzIEhXIHVsdGltYXRlbHkgcm91dGVzIGludGVycnVwdHMgdG8gdGhlIEdJQywgdGhlCisgIGludGVycnVwdCBzcGVjaWZpZXIgbXVzdCBiZSB0aGF0IG9mIHRoZSBHSUMuCistIE9ubHkgU1BJcyBjYW4gdXNlIHRoZSBXVUdFTiBhcyBhbiBpbnRlcnJ1cHQgcGFyZW50LiBTR0lzIGFuZCBQUElzCisgIGFyZSBleHBsaWNpdGx5IGZvcmJpZGVuLgorCitFeGFtcGxlOgorCisgICAgICAgd2FrZXVwZ2VuOiBpbnRlcnJ1cHQtY29udHJvbGxlckA0ODI4MTAwMCB7CisgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gInRpLG9tYXA1LXd1Z2VuLW1wdSIsICJ0aSxvbWFwNC13dWdlbi1tcHUiOworICAgICAgICAgICAgICAgaW50ZXJydXB0LWNvbnRyb2xsZXI7CisgICAgICAgICAgICAgICAjaW50ZXJydXB0LWNlbGxzID0gPDM+OworICAgICAgICAgICAgICAgcmVnID0gPDB4NDgyODEwMDAgMHgxMDAwPjsKKyAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisgICAgICAgfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CmluZGV4IDM0ODExYzUuLjc0N2M1MzggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2NvbW1vbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dApAQCAtMTQsOCArMTQsMTAgQEAKIC0gbGVkLXNvdXJjZXMgOiBMaXN0IG9mIGRldmljZSBjdXJyZW50IG91dHB1dHMgdGhlIExFRCBpcyBjb25uZWN0ZWQgdG8uIFRoZQogCQlvdXRwdXRzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSBudW1iZXJzIHRoYXQgbXVzdCBiZSBkZWZpbmVkCiAJCWluIHRoZSBMRUQgZGV2aWNlIGJpbmRpbmcgZG9jdW1lbnRhdGlvbi4KLS0gbGFiZWwgOiBUaGUgbGFiZWwgZm9yIHRoaXMgTEVELiAgSWYgb21pdHRlZCwgdGhlIGxhYmVsIGlzCi0gIHRha2VuIGZyb20gdGhlIG5vZGUgbmFtZSAoZXhjbHVkaW5nIHRoZSB1bml0IGFkZHJlc3MpLgorLSBsYWJlbCA6IFRoZSBsYWJlbCBmb3IgdGhpcyBMRUQuIElmIG9taXR0ZWQsIHRoZSBsYWJlbCBpcyB0YWtlbiBmcm9tIHRoZSBub2RlCisJICBuYW1lIChleGNsdWRpbmcgdGhlIHVuaXQgYWRkcmVzcykuIEl0IGhhcyB0byB1bmlxdWVseSBpZGVudGlmeQorCSAgYSBkZXZpY2UsIGkuZS4gbm8gb3RoZXIgTEVEIGNsYXNzIGRldmljZSBjYW4gYmUgYXNzaWduZWQgdGhlIHNhbWUKKwkgIGxhYmVsLgogCiAtIGxpbnV4LGRlZmF1bHQtdHJpZ2dlciA6ICBUaGlzIHBhcmFtZXRlciwgaWYgcHJlc2VudCwgaXMgYQogICAgIHN0cmluZyBkZWZpbmluZyB0aGUgdHJpZ2dlciBhc3NpZ25lZCB0byB0aGUgTEVELiAgQ3VycmVudCB0cmlnZ2VycyBhcmU6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWdwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1ncGlvLnR4dAppbmRleCBmNzcxNDhmLi5mZWExZWJmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9sZWRzLWdwaW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtZ3Bpby50eHQKQEAgLTI2LDE2ICsyNiwxOCBAQAogCiBFeGFtcGxlczoKIAorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2dwaW8vZ3Bpby5oPgorCiBsZWRzIHsKIAljb21wYXRpYmxlID0gImdwaW8tbGVkcyI7CiAJaGRkIHsKIAkJbGFiZWwgPSAiSURFIEFjdGl2aXR5IjsKLQkJZ3Bpb3MgPSA8Jm1jdV9waW8gMCAxPjsgLyogQWN0aXZlIGxvdyAqLworCQlncGlvcyA9IDwmbWN1X3BpbyAwIEdQSU9fQUNUSVZFX0xPVz47CiAJCWxpbnV4LGRlZmF1bHQtdHJpZ2dlciA9ICJpZGUtZGlzayI7CiAJfTsKIAogCWZhdWx0IHsKLQkJZ3Bpb3MgPSA8Jm1jdV9waW8gMSAwPjsKKwkJZ3Bpb3MgPSA8Jm1jdV9waW8gMSBHUElPX0FDVElWRV9ISUdIPjsKIAkJLyogS2VlcCBMRUQgb24gaWYgQklPUyBkZXRlY3RlZCBoYXJkd2FyZSBmYXVsdCAqLwogCQlkZWZhdWx0LXN0YXRlID0gImtlZXAiOwogCX07CkBAIC00NCwxMSArNDYsMTEgQEAKIHJ1bi1jb250cm9sIHsKIAljb21wYXRpYmxlID0gImdwaW8tbGVkcyI7CiAJcmVkIHsKLQkJZ3Bpb3MgPSA8Jm1wYzg1NzIgNiAwPjsKKwkJZ3Bpb3MgPSA8Jm1wYzg1NzIgNiBHUElPX0FDVElWRV9ISUdIPjsKIAkJZGVmYXVsdC1zdGF0ZSA9ICJvZmYiOwogCX07CiAJZ3JlZW4gewotCQlncGlvcyA9IDwmbXBjODU3MiA3IDA+OworCQlncGlvcyA9IDwmbXBjODU3MiA3IEdQSU9fQUNUSVZFX0hJR0g+OwogCQlkZWZhdWx0LXN0YXRlID0gIm9uIjsKIAl9OwogfTsKQEAgLTU3LDcgKzU5LDcgQEAKIAljb21wYXRpYmxlID0gImdwaW8tbGVkcyI7CiAKIAljaGFyZ2VyLWxlZCB7Ci0JCWdwaW9zID0gPCZncGlvMSAyIDA+OworCQlncGlvcyA9IDwmZ3BpbzEgMiBHUElPX0FDVElWRV9ISUdIPjsKIAkJbGludXgsZGVmYXVsdC10cmlnZ2VyID0gIm1heDg5MDMtY2hhcmdlci1jaGFyZ2luZyI7CiAJCXJldGFpbi1zdGF0ZS1zdXNwZW5kZWQ7CiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtcG04OTQxLXdsZWQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvbGVkcy1wbTg5NDEtd2xlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1YTk2NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9sZWRzL2xlZHMtcG04OTQxLXdsZWQudHh0CkBAIC0wLDAgKzEsNDMgQEAKK0JpbmRpbmcgZm9yIFF1YWxjb21tIFBNODk0MSBXTEVEIGRyaXZlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBzaG91bGQgYmUgInFjb20scG04OTQxLXdsZWQiCistIHJlZzogc2xhdmUgYWRkcmVzcworCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBsYWJlbDogVGhlIGxhYmVsIGZvciB0aGlzIGxlZAorICBTZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAorLSBsaW51eCxkZWZhdWx0LXRyaWdnZXI6IERlZmF1bHQgdHJpZ2dlciBhc3NpZ25lZCB0byB0aGUgTEVECisgIFNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbGVkcy9jb21tb24udHh0CistIHFjb20sY3Mtb3V0OiBib29sOyBlbmFibGUgY3VycmVudCBzaW5rIG91dHB1dAorLSBxY29tLGNhYmM6IGJvb2w7IGVuYWJsZSBjb250ZW50IGFkYXB0aXZlIGJhY2tsaWdodCBjb250cm9sCistIHFjb20sZXh0LWdlbjogYm9vbDsgdXNlIGV4dGVybmFsbHkgZ2VuZXJhdGVkIG1vZHVsYXRvciBzaWduYWwgdG8gZGltCistIHFjb20sY3VycmVudC1saW1pdDogbUE7IHBlci1zdHJpbmcgY3VycmVudCBsaW1pdDsgdmFsdWUgZnJvbSAwIHRvIDI1CisJZGVmYXVsdDogMjBtQQorLSBxY29tLGN1cnJlbnQtYm9vc3QtbGltaXQ6IG1BOyBib29zdCBjdXJyZW50IGxpbWl0OyBvbmUgb2Y6CisJMTA1LCAzODUsIDUyNSwgODA1LCA5ODAsIDEyNjAsIDE0MDAsIDE2ODAKKwlkZWZhdWx0OiA4MDVtQQorLSBxY29tLHN3aXRjaGluZy1mcmVxOiBrSHo7IHN3aXRjaGluZyBmcmVxdWVuY3k7IG9uZSBvZjoKKwk2MDAsIDY0MCwgNjg1LCA3MzgsIDgwMCwgODcyLCA5NjAsIDEwNjYsIDEyMDAsIDEzNzEsCisJMTYwMCwgMTkyMCwgMjQwMCwgMzIwMCwgNDgwMCwgOTYwMCwKKwlkZWZhdWx0OiAxNjAwa0h6CistIHFjb20sb3ZwOiBWOyBPdmVyLXZvbHRhZ2UgcHJvdGVjdGlvbiBsaW1pdDsgb25lIG9mOgorCTI3LCAyOSwgMzIsIDM1CisJZGVmYXVsdDogMjlWCistIHFjb20sbnVtLXN0cmluZ3M6ICM7IG51bWJlciBvZiBsZWQgc3RyaW5ncyBhdHRhY2hlZDsgdmFsdWUgZnJvbSAxIHRvIDMKKwlkZWZhdWx0OiAyCisKK0V4YW1wbGU6CisKK3BtODk0MS13bGVkQGQ4MDAgeworCWNvbXBhdGlibGUgPSAicWNvbSxwbTg5NDEtd2xlZCI7CisJcmVnID0gPDB4ZDgwMD47CisJbGFiZWwgPSAiYmFja2xpZ2h0IjsKKworCXFjb20sY3Mtb3V0OworCXFjb20sY3VycmVudC1saW1pdCA9IDwyMD47CisJcWNvbSxjdXJyZW50LWJvb3N0LWxpbWl0ID0gPDgwNT47CisJcWNvbSxzd2l0Y2hpbmctZnJlcSA9IDwxNjAwPjsKKwlxY29tLG92cCA9IDwyOT47CisJcWNvbSxudW0tc3RyaW5ncyA9IDwyPjsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL2FyaXpvbmEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9hcml6b25hLnR4dAppbmRleCA3YmQxMjczLi43NjY1YWE5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL2FyaXpvbmEudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvYXJpem9uYS50eHQKQEAgLTgsNiArOCw3IEBACiAgIC0gY29tcGF0aWJsZSA6IE9uZSBvZiB0aGUgZm9sbG93aW5nIGNoaXAtc3BlY2lmaWMgc3RyaW5nczoKICAgICAgICAgIndsZix3bTUxMDIiCiAgICAgICAgICJ3bGYsd201MTEwIgorICAgICAgICAid2xmLHdtODI4MCIKICAgICAgICAgIndsZix3bTg5OTciCiAgIC0gcmVnIDogSTJDIHNsYXZlIGFkZHJlc3Mgd2hlbiBjb25uZWN0ZWQgdXNpbmcgSTJDLCBjaGlwIHNlbGVjdCBudW1iZXIgd2hlbgogICAgIHVzaW5nIFNQSS4KQEAgLTI2LDIxICsyNywyNyBAQAogICAtICNncGlvLWNlbGxzIDogTXVzdCBiZSAyLiBUaGUgZmlyc3QgY2VsbCBpcyB0aGUgcGluIG51bWJlciBhbmQgdGhlCiAgICAgc2Vjb25kIGNlbGwgaXMgdXNlZCB0byBzcGVjaWZ5IG9wdGlvbmFsIHBhcmFtZXRlcnMgKGN1cnJlbnRseSB1bnVzZWQpLgogCi0gIC0gQVZERC1zdXBwbHksIERCVkREMS1zdXBwbHksIERCVkREMi1zdXBwbHksIERCVkREMy1zdXBwbHkgKHdtNTEwMiwgd201MTEwKSwKLSAgICBDUFZERC1zdXBwbHksIFNQS1ZEREwtc3VwcGx5ICh3bTUxMDIsIHdtNTExMCksIFNQS1ZERFItc3VwcGx5ICh3bTUxMDIsCi0gICAgd201MTEwKSwgU1BLVkRELXN1cHBseSAod204OTk3KSA6IFBvd2VyIHN1cHBsaWVzIGZvciB0aGUgZGV2aWNlLCBhcyBjb3ZlcmVkCi0gICAgaW4gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0CisgIC0gQVZERC1zdXBwbHksIERCVkREMS1zdXBwbHksIENQVkRELXN1cHBseSA6IFBvd2VyIHN1cHBsaWVzIGZvciB0aGUgZGV2aWNlLAorICAgIGFzIGNvdmVyZWQgaW4gRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9yZWd1bGF0b3IudHh0CisKKyAgLSBEQlZERDItc3VwcGx5LCBEQlZERDMtc3VwcGx5IDogQWRkaXRpb25hbCBkYXRhYnVzIHBvd2VyIHN1cHBsaWVzICh3bTUxMDIsCisgICAgd201MTEwLCB3bTgyODApCisKKyAgLSBTUEtWRERMLXN1cHBseSwgU1BLVkREUi1zdXBwbHkgOiBTcGVha2VyIGRyaXZlciBwb3dlciBzdXBwbGllcyAod201MTAyLAorICAgIHdtNTExMCwgd204MjgwKQorCisgIC0gU1BLVkRELXN1cHBseSA6IFNwZWFrZXIgZHJpdmVyIHBvd2VyIHN1cHBseSAod204OTk3KQogCiBPcHRpb25hbCBwcm9wZXJ0aWVzOgogCiAgIC0gd2xmLHJlc2V0IDogR1BJTyBzcGVjaWZpZXIgZm9yIHRoZSBHUElPIGNvbnRyb2xsaW5nIC9SRVNFVAogICAtIHdsZixsZG9lbmEgOiBHUElPIHNwZWNpZmllciBmb3IgdGhlIEdQSU8gY29udHJvbGxpbmcgTERPRU5BCiAKLSAgLSB3bGYsZ3Bpby1kZWZhdWx0cyA6IEEgbGlzdCBvZiBHUElPIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgdmFsdWVzLiBJZgotICAgIGFic2VudCwgbm8gY29uZmlndXJhdGlvbiBvZiB0aGVzZSByZWdpc3RlcnMgaXMgcGVyZm9ybWVkLiBJZiBhbnkKLSAgICBlbnRyeSBoYXMgYSB2YWx1ZSB0aGF0IGlzIG91dCBvZiByYW5nZSBmb3IgYSAxNiBiaXQgcmVnaXN0ZXIgdGhlbgotICAgIHRoZSBjaGlwIGRlZmF1bHQgd2lsbCBiZSB1c2VkLiAgSWYgcHJlc2VudCBleGFjdGx5IGZpdmUgdmFsdWVzIG11c3QKLSAgICBiZSBzcGVjaWZpZWQuCisgIC0gd2xmLGdwaW8tZGVmYXVsdHMgOiBBIGxpc3Qgb2YgR1BJTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHZhbHVlcy4gRGVmaW5lcworICAgIGZvciB0aGUgYXBwcm9wcmlhdGUgdmFsdWVzIGNhbiBmb3VuZCBpbiA8ZHQtYmluZGluZ3MvbWZkL2FyaXpvbmEudHh0Pi4gSWYKKyAgICBhYnNlbnQsIG5vIGNvbmZpZ3VyYXRpb24gb2YgdGhlc2UgcmVnaXN0ZXJzIGlzIHBlcmZvcm1lZC4gSWYgYW55IGVudHJ5IGhhcworICAgIGEgdmFsdWUgdGhhdCBpcyBvdXQgb2YgcmFuZ2UgZm9yIGEgMTYgYml0IHJlZ2lzdGVyIHRoZW4gdGhlIGNoaXAgZGVmYXVsdAorICAgIHdpbGwgYmUgdXNlZC4gSWYgcHJlc2VudCBleGFjdGx5IGZpdmUgdmFsdWVzIG11c3QgYmUgc3BlY2lmaWVkLgogCiAgIC0gd2xmLGlubW9kZSA6IEEgbGlzdCBvZiBJTm5fTU9ERSByZWdpc3RlciB2YWx1ZXMsIHdoZXJlIG4gaXMgdGhlIG51bWJlcgogICAgIG9mIGlucHV0IHNpZ25hbHMuIFZhbGlkIHZhbHVlcyBhcmUgMCAoRGlmZmVyZW50aWFsKSwgMSAoU2luZ2xlLWVuZGVkKSBhbmQKQEAgLTQ5LDYgKzU2LDEyIEBACiAgICAgaW5wdXQgc2luZ2Fscy4gSWYgdmFsdWVzIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGlucHV0IHNpZ25hbHMsIGVsZW1lbnRzCiAgICAgdGhhdCBoYXMgbm90IGJlZW4gc3BlY2lmZWQgYXJlIHNldCB0byAwIGJ5IGRlZmF1bHQuCiAKKyAgLSB3bGYsZG1pYy1yZWYgOiBETUlDIHJlZmVyZW5jZSB2b2x0YWdlIHNvdXJjZSBmb3IgZWFjaCBpbnB1dCwgY2FuIGJlCisgICAgc2VsZWN0ZWQgZnJvbSBlaXRoZXIgTUlDVkREIG9yIG9uZSBvZiB0aGUgTUlDQklBUydzLCBkZWZpbmVzCisgICAgKEFSSVpPTkFfRE1JQ194eHh4KSBhcmUgcHJvdmlkZWQgaW4gPGR0LWJpbmRpbmdzL21mZC9hcml6b25hLnR4dD4uIElmCisgICAgcHJlc2VudCwgdGhlIG51bWJlciBvZiB2YWx1ZXMgc2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUKKyAgICBudW1iZXIgb2YgaW5wdXRzLCB1bnNwZWNpZmllZCBpbnB1dHMgd2lsbCB1c2UgdGhlIGNoaXAgZGVmYXVsdC4KKwogICAtIERDVkRELXN1cHBseSwgTUlDVkRELXN1cHBseSA6IFBvd2VyIHN1cHBsaWVzLCBvbmx5IG5lZWQgdG8gYmUgc3BlY2lmaWVkIGlmCiAgICAgdGhleSBhcmUgYmVpbmcgZXh0ZXJuYWxseSBzdXBwbGllZC4gQXMgY292ZXJlZCBpbgogICAgIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dApAQCAtNzMsMTAgKzg2LDEwIEBACiAJI2dwaW8tY2VsbHMgPSA8Mj47CiAKIAl3bGYsZ3Bpby1kZWZhdWx0cyA9IDwKLQkJMHgwMDAwMDAwMCAvKiBBSUYxVFhMUkNMSyAqLwotCQkweGZmZmZmZmZmCi0JCTB4ZmZmZmZmZmYKLQkJMHhmZmZmZmZmZgotCQkweGZmZmZmZmZmCisJCUFSSVpPTkFfR1BfRk5fVFhMUkNMSworCQlBUklaT05BX0dQX0RFRkFVTFQKKwkJQVJJWk9OQV9HUF9ERUZBVUxUCisJCUFSSVpPTkFfR1BfREVGQVVMVAorCQlBUklaT05BX0dQX0RFRkFVTFQKIAk+OwogfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvYXhwMjB4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvYXhwMjB4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODY4NWYyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9heHAyMHgudHh0CkBAIC0wLDAgKzEsOTYgQEAKK0FYUDIwMi9BWFAyMDkgZGV2aWNlIHRyZWUgYmluZGluZ3MKKworVGhlIGF4cDIweCBmYW1pbHkgY3VycmVudCBtZW1iZXJzIDoKK2F4cDIwMiAoWC1Qb3dlcnMpCitheHAyMDkgKFgtUG93ZXJzKQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAieC1wb3dlcnMsYXhwMjAyIiBvciAieC1wb3dlcnMsYXhwMjA5IgorLSByZWc6IFRoZSBJMkMgc2xhdmUgYWRkcmVzcyBmb3IgdGhlIEFYUCBjaGlwCistIGludGVycnVwdC1wYXJlbnQ6IFRoZSBwYXJlbnQgaW50ZXJydXB0IGNvbnRyb2xsZXIKKy0gaW50ZXJydXB0czogU29DIE5NSSAvIEdQSU8gaW50ZXJydXB0IGNvbm5lY3RlZCB0byB0aGUgUE1JQydzIElSUSBwaW4KKy0gaW50ZXJydXB0LWNvbnRyb2xsZXI6IGF4cDIweCBoYXMgaXRzIG93biBpbnRlcm5hbCBJUlFzCistICNpbnRlcnJ1cHQtY2VsbHM6IFNob3VsZCBiZSBzZXQgdG8gMQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSB4LXBvd2VycyxkY2RjLWZyZXE6IGRlZmluZXMgdGhlIHdvcmsgZnJlcXVlbmN5IG9mIERDLURDIGluIEtIegorCQkgICAgICAocmFuZ2U6IDc1MC0xODc1KS4gRGVmYXVsdDogMS41TUh6CistIDxpbnB1dD4tc3VwcGx5OiBhIHBoYW5kbGUgdG8gdGhlIHJlZ3VsYXRvciBzdXBwbHkgbm9kZS4gTWF5IGJlIG9taXR0ZWQgaWYKKwkJICBpbnB1dHMgYXJlIHVucmVndWxhdGVkLCBzdWNoIGFzIHVzaW5nIHRoZSBJUFNPVVQgb3V0cHV0CisJCSAgZnJvbSB0aGUgUE1JQy4KKworLSByZWd1bGF0b3JzOiBBIG5vZGUgdGhhdCBob3VzZXMgYSBzdWItbm9kZSBmb3IgZWFjaCByZWd1bGF0b3IuIFJlZ3VsYXRvcnMKKwkgICAgICBub3QgdXNlZCBidXQgcHJlZmVycmVkIHRvIGJlIG1hbmFnZWQgYnkgdGhlIE9TIHNob3VsZCBiZQorCSAgICAgIGxpc3RlZCBhcyB3ZWxsLgorCSAgICAgIFNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVndWxhdG9yL3JlZ3VsYXRvci50eHQKKwkgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBzdGFuZGFyZCByZWd1bGF0b3IgYmluZGluZ3MuCisKK09wdGlvbmFsIHByb3BlcnRpZXMgZm9yIERDREMgcmVndWxhdG9yczoKKy0geC1wb3dlcnMsZGNkYy13b3JrbW9kZTogMSBmb3IgUFdNIG1vZGUsIDAgZm9yIEFVVE8gKFBXTS9QRk0pIG1vZGUKKwkJCSAgRGVmYXVsdDogQ3VycmVudCBoYXJkd2FyZSBzZXR0aW5nCisJCQkgIFRoZSBEQ0RDIHJlZ3VsYXRvcnMgd29yayBpbiBhIG1peGVkIFBXTS9QRk0gbW9kZSwKKwkJCSAgdXNpbmcgUEZNIHVuZGVyIGxpZ2h0IGxvYWRzIGFuZCBzd2l0Y2hpbmcgdG8gUFdNCisJCQkgIGZvciBoZWF2aWVyIGxvYWRzLiBGb3JjaW5nIFBXTSBtb2RlIHRyYWRlcyBlZmZpY2llbmN5CisJCQkgIHVuZGVyIGxpZ2h0IGxvYWRzIGZvciBsb3dlciBvdXRwdXQgbm9pc2UuIFRoaXMKKwkJCSAgcHJvYmFibHkgbWFrZXMgc2Vuc2UgZm9yIEhpRmkgYXVkaW8gcmVsYXRlZAorCQkJICBhcHBsaWNhdGlvbnMgdGhhdCBhcmVuJ3QgYmF0dGVyeSBjb25zdHJhaW5lZC4KKworCitBWFAyMDIvQVhQMjA5IHJlZ3VsYXRvcnMsIHR5cGUsIGFuZCBjb3JyZXNwb25kaW5nIGlucHV0IHN1cHBseSBuYW1lczoKKworUmVndWxhdG9yCSAgVHlwZQkJICBTdXBwbHkgTmFtZQkJICBOb3RlcworLS0tLS0tLS0tCSAgLS0tLQkJICAtLS0tLS0tLS0tLQkJICAtLS0tLQorRENEQzIJCTogREMtREMgYnVjawk6IHZpbjItc3VwcGx5CitEQ0RDMwkJOiBEQy1EQwlidWNrCTogdmluMy1zdXBwbHkKK0xETzEJCTogTERPCQk6IGFjaW4tc3VwcGx5CQk6IGFsd2F5cyBvbgorTERPMgkJOiBMRE8JCTogbGRvMjRpbi1zdXBwbHkJOiBzaGFyZWQgc3VwcGx5CitMRE8zCQk6IExETwkJOiBsZG8zaW4tc3VwcGx5CitMRE80CQk6IExETwkJOiBsZG8yNGluLXN1cHBseQk6IHNoYXJlZCBzdXBwbHkKK0xETzUJCTogTERPCQk6IGxkbzVpbi1zdXBwbHkKKworRXhhbXBsZToKKworYXhwMjA5OiBwbWljQDM0IHsKKwljb21wYXRpYmxlID0gIngtcG93ZXJzLGF4cDIwOSI7CisJcmVnID0gPDB4MzQ+OworCWludGVycnVwdC1wYXJlbnQgPSA8Jm5taV9pbnRjPjsKKwlpbnRlcnJ1cHRzID0gPDAgSVJRX1RZUEVfTEVWRUxfTE9XPjsKKwlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCisJcmVndWxhdG9ycyB7CisJCXgtcG93ZXJzLGRjZGMtZnJlcSA9IDwxNTAwPjsKKworCQl2ZGRfY3B1OiBkY2RjMiB7CisJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTAwMDAwMD47CisJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxNDUwMDAwPjsKKwkJCXJlZ3VsYXRvci1uYW1lID0gInZkZC1jcHUiOworCQl9OworCisJCXZkZF9pbnRfZGxsOiBkY2RjMyB7CisJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MTAwMDAwMD47CisJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwxNDAwMDAwPjsKKwkJCXJlZ3VsYXRvci1uYW1lID0gInZkZC1pbnQtZGxsIjsKKwkJfTsKKworCQl2ZGRfcnRjOiBsZG8xIHsKKwkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxMjAwMDAwPjsKKwkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE0MDAwMDA+OworCQkJcmVndWxhdG9yLW5hbWUgPSAidmRkLXJ0YyI7CisJCX07CisKKwkJYXZjYzogbGRvMiB7CisJCQlyZWd1bGF0b3ItYWx3YXlzLW9uOworCQkJcmVndWxhdG9yLW1pbi1taWNyb3ZvbHQgPSA8MjcwMDAwMD47CisJCQlyZWd1bGF0b3ItbWF4LW1pY3Jvdm9sdCA9IDwzMzAwMDAwPjsKKwkJCXJlZ3VsYXRvci1uYW1lID0gImF2Y2MiOworCQl9OworCisJCWxkbzMgeworCQkJLyogdW51c2VkIGJ1dCBwcmVmZXJyZWQgdG8gYmUgbWFuYWdlZCBieSBPUyAqLworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9kYTkxNTAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9kYTkxNTAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNTg4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL2RhOTE1MC50eHQKQEAgLTAsMCArMSw0MyBAQAorRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MTUwIENvbWJpbmVkIENoYXJnZXIvRnVlbC1HYXVnZSBNRkQgYmluZGluZ3MKKworREE5MTUwIGNvbnNpc3RzIG9mIGEgZ3JvdXAgb2Ygc3ViLWRldmljZXM6CisKK0RldmljZQkJCSBEZXNjcmlwdGlvbgorLS0tLS0tCQkJIC0tLS0tLS0tLS0tCitkYTkxNTAtZ3BhZGMJCTogR2VuZXJhbCBQdXJwb3NlIEFEQworZGE5MTUwLWNoYXJnZXIJCTogQmF0dGVyeSBDaGFyZ2VyCisKKz09PT09PQorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJkbGcsZGE5MTUwIgorLSByZWc6IFNwZWNpZmllcyB0aGUgSTJDIHNsYXZlIGFkZHJlc3MKKy0gaW50ZXJydXB0LXBhcmVudDogU3BlY2lmaWVzIHRoZSBwaGFuZGxlIG9mIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciB0byB3aGljaAorICB0aGUgSVJRcyBmcm9tIGRhOTE1MCBhcmUgZGVsaXZlcmVkIHRvLgorLSBpbnRlcnJ1cHRzOiBJUlEgbGluZSBpbmZvIGZvciBkYTkxNTAgY2hpcC4KKy0gaW50ZXJydXB0LWNvbnRyb2xsZXI6IGRhOTE1MCBoYXMgaW50ZXJuYWwgSVJRcyAob3duIElSUSBkb21haW4pLgorICAoU2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9pbnRlcnJ1cHRzLnR4dCBmb3IKKyAgIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRpbmcgdG8gaW50ZXJydXB0IHByb3BlcnRpZXMpCisKK1N1Yi1kZXZpY2VzOgorLSBkYTkxNTAtZ3BhZGM6IFNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaWlvL2FkYy9kYTkxNTAtZ3BhZGMudHh0CistIGRhOTE1MC1jaGFyZ2VyOiBTZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2RhOTE1MC1jaGFyZ2VyLnR4dAorCisKK0V4YW1wbGU6CisKKwljaGFyZ2VyX2ZnOiBkYTkxNTBANTggeworCQljb21wYXRpYmxlID0gImRsZyxkYTkxNTAiOworCQlyZWcgPSA8MHg1OD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW82PjsKKwkJaW50ZXJydXB0cyA9IDwxMSBJUlFfVFlQRV9MRVZFTF9MT1c+OworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKworCQlncGFkYzogZGE5MTUwLWdwYWRjIHsKKwkJCS4uLgorCQl9OworCisJCWRhOTE1MC1jaGFyZ2VyIHsKKwkJCS4uLgorCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL210NjM5Ny50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL210NjM5Ny50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwNDNlNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvbXQ2Mzk3LnR4dApAQCAtMCwwICsxLDcwIEBACitNZWRpYVRlayBNVDYzOTcgTXVsdGlmdW5jdGlvbiBEZXZpY2UgRHJpdmVyCisKK01UNjM5NyBpcyBhIG11bHRpZnVuY3Rpb24gZGV2aWNlIHdpdGggdGhlIGZvbGxvd2luZyBzdWIgbW9kdWxlczoKKy0gUmVndWxhdG9yCistIFJUQworLSBBdWRpbyBjb2RlYworLSBHUElPCistIENsb2NrCisKK0l0IGlzIGludGVyZmFjZWQgdG8gaG9zdCBjb250cm9sbGVyIHVzaW5nIFNQSSBpbnRlcmZhY2UgYnkgYSBwcm9wcmlldGFyeSBoYXJkd2FyZQorY2FsbGVkIFBNSUMgd3JhcHBlciBvciBwd3JhcC4gTVQ2Mzk3IE1GRCBpcyBhIGNoaWxkIGRldmljZSBvZiBwd3JhcC4KK1NlZSB0aGUgZm9sbG93aW5nIGZvciBwd2FycCBub2RlIGRlZmluaXRpb25zOgorRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvYy9wd3JhcC50eHQKKworVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIGJpbmRpbmcgZm9yIE1GRCBkZXZpY2UgYW5kIGl0cyBzdWIgbW9kdWxlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorY29tcGF0aWJsZTogIm1lZGlhdGVrLG10NjM5NyIKKworT3B0aW9uYWwgc3Vibm9kZXM6CisKKy0gcnRjCisJUmVxdWlyZWQgcHJvcGVydGllczoKKwkJLSBjb21wYXRpYmxlOiAibWVkaWF0ZWssbXQ2Mzk3LXJ0YyIKKy0gcmVndWxhdG9ycworCVJlcXVpcmVkIHByb3BlcnRpZXM6CisJCS0gY29tcGF0aWJsZTogIm1lZGlhdGVrLG10NjM5Ny1yZWd1bGF0b3IiCisJc2VlIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvbXQ2Mzk3LXJlZ3VsYXRvci50eHQKKy0gY29kZWMKKwlSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCQktIGNvbXBhdGlibGU6ICJtZWRpYXRlayxtdDYzOTctY29kZWMiCistIGNsaworCVJlcXVpcmVkIHByb3BlcnRpZXM6CisJCS0gY29tcGF0aWJsZTogIm1lZGlhdGVrLG10NjM5Ny1jbGsiCisKK0V4YW1wbGU6CisJcHdyYXA6IHB3cmFwQDEwMDBmMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgxMzUtcHdyYXAiOworCisJCS4uLgorCisJCXBtaWMgeworCQkJY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDYzOTciOworCisJCQljb2RlYzogbXQ2Mzk3Y29kZWMgeworCQkJCWNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ2Mzk3LWNvZGVjIjsKKwkJCX07CisKKwkJCXJlZ3VsYXRvcnMgeworCQkJCWNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ2Mzk3LXJlZ3VsYXRvciI7CisKKwkJCQltdDYzOTdfdnBjYTE1X3JlZzogYnVja192cGNhMTUgeworCQkJCQlyZWd1bGF0b3ItY29tcGF0aWJsZSA9ICJidWNrX3ZwY2ExNSI7CisJCQkJCXJlZ3VsYXRvci1uYW1lID0gInZwY2ExNSI7CisJCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDg1MDAwMD47CisJCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE0MDAwMDA+OworCQkJCQlyZWd1bGF0b3ItcmFtcC1kZWxheSA9IDwxMjUwMD47CisJCQkJCXJlZ3VsYXRvci1hbHdheXMtb247CisJCQkJfTsKKworCQkJCW10NjM5N192Z3A0X3JlZzogbGRvX3ZncDQgeworCQkJCQlyZWd1bGF0b3ItY29tcGF0aWJsZSA9ICJsZG9fdmdwNCI7CisJCQkJCXJlZ3VsYXRvci1uYW1lID0gInZncDQiOworCQkJCQlyZWd1bGF0b3ItbWluLW1pY3Jvdm9sdCA9IDwxMjAwMDAwPjsKKwkJCQkJcmVndWxhdG9yLW1heC1taWNyb3ZvbHQgPSA8MzMwMDAwMD47CisJCQkJCXJlZ3VsYXRvci1lbmFibGUtcmFtcC1kZWxheSA9IDwyMTg+OworCQkJCX07CisJCQl9OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3Fjb20sc3BtaS1wbWljLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvcWNvbSxzcG1pLXBtaWMudHh0CmluZGV4IDcxODJiODguLjZhYzA2YzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvcWNvbSxzcG1pLXBtaWMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tZmQvcWNvbSxzcG1pLXBtaWMudHh0CkBAIC0xNSwxMCArMTUsMjEgQEAKIAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZTogICAgICBTaG91bGQgY29udGFpbiBvbmUgb2Y6Ci0gICAgICAgICAgICAgICAgICAgICAicWNvbSxwbTg5NDEiCi0gICAgICAgICAgICAgICAgICAgICAicWNvbSxwbTg4NDEiCi0gICAgICAgICAgICAgICAgICAgICAicWNvbSxwbWE4MDg0IgotICAgICAgICAgICAgICAgICAgICAgb3IgZ2VuZXJhbGl6ZWQgInFjb20sc3BtaS1wbWljIi4KKyAgICAgICAgICAgICAgICAgICAicWNvbSxwbTg5NDEiLAorICAgICAgICAgICAgICAgICAgICJxY29tLHBtODg0MSIsCisgICAgICAgICAgICAgICAgICAgInFjb20scG1hODA4NCIsCisgICAgICAgICAgICAgICAgICAgInFjb20scG04MDE5IiwKKyAgICAgICAgICAgICAgICAgICAicWNvbSxwbTgyMjYiLAorICAgICAgICAgICAgICAgICAgICJxY29tLHBtODExMCIsCisgICAgICAgICAgICAgICAgICAgInFjb20scG1hODA4NCIsCisgICAgICAgICAgICAgICAgICAgInFjb20scG1pODk2MiIsCisgICAgICAgICAgICAgICAgICAgInFjb20scG1kOTYzNSIsCisgICAgICAgICAgICAgICAgICAgInFjb20scG04OTk0IiwKKyAgICAgICAgICAgICAgICAgICAicWNvbSxwbWk4OTk0IiwKKyAgICAgICAgICAgICAgICAgICAicWNvbSxwbTg5MTYiLAorICAgICAgICAgICAgICAgICAgICJxY29tLHBtODAwNCIsCisgICAgICAgICAgICAgICAgICAgInFjb20scG04OTA5IiwKKyAgICAgICAgICAgICAgICAgICBvciBnZW5lcmFsaXplZCAicWNvbSxzcG1pLXBtaWMiLgogLSByZWc6ICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgU1BNSSBVU0lEIHNsYXZlIGFkZHJlc3MgZm9yIHRoaXMgZGV2aWNlLgogICAgICAgICAgICAgICAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZToKICAgICAgICAgICAgICAgICAgICBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BtaS9zcG1pLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9xY29tLXJwbS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3Fjb20tcnBtLnR4dAppbmRleCA4NWUzMTk4Li41ZTk3YTk1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3Fjb20tcnBtLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3Fjb20tcnBtLnR4dApAQCAtMTIsNiArMTIsNyBAQAogCQkgICAgInFjb20scnBtLWFwcTgwNjQiCiAJCSAgICAicWNvbSxycG0tbXNtODY2MCIKIAkJICAgICJxY29tLHJwbS1tc204OTYwIgorCQkgICAgInFjb20scnBtLWlwcTgwNjQiCiAKIC0gcmVnOgogCVVzYWdlOiByZXF1aXJlZApAQCAtMzEsMTYgKzMyLDYgQEAKIAlWYWx1ZSB0eXBlOiA8c3RyaW5nLWFycmF5PgogCURlZmluaXRpb246IG11c3QgYmUgdGhlIHRocmVlIHN0cmluZ3MgImFjayIsICJlcnIiIGFuZCAid2FrZXVwIiwgaW4gb3JkZXIKIAotLSAjYWRkcmVzcy1jZWxsczoKLQlVc2FnZTogcmVxdWlyZWQKLQlWYWx1ZSB0eXBlOiA8dTMyPgotCURlZmluaXRpb246IG11c3QgYmUgMQotCi0tICNzaXplLWNlbGxzOgotCVVzYWdlOiByZXF1aXJlZAotCVZhbHVlIHR5cGU6IDx1MzI+Ci0JRGVmaW5pdGlvbjogbXVzdCBiZSAwCi0KIC0gcWNvbSxpcGM6CiAJVXNhZ2U6IHJlcXVpcmVkCiAJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KQEAgLTUyLDYgKzQzLDE4OCBAQAogCQkgICAgLSB1MzIgcmVwcmVzZW50aW5nIHRoZSBpcGMgYml0IHdpdGhpbiB0aGUgcmVnaXN0ZXIKIAogCis9IFNVQk5PREVTCisKK1RoZSBSUE0gZXhwb3NlcyByZXNvdXJjZXMgdG8gaXRzIHN1Ym5vZGVzLiBUaGUgYmVsb3cgYmluZGluZ3Mgc3BlY2lmeSB0aGUgc2V0CitvZiB2YWxpZCBzdWJub2RlcyB0aGF0IGNhbiBvcGVyYXRlIG9uIHRoZXNlIHJlc291cmNlcy4KKworPT0gUmVndWxhdG9ycworCitSZWd1bGF0b3Igbm9kZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlaXIgY29tcGF0aWJsZToKKworLSBjb21wYXRpYmxlOgorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxzdHJpbmc+CisJRGVmaW5pdGlvbjogbXVzdCBiZSBvbmUgb2Y6CisJCSAgICAicWNvbSxycG0tcG04MDU4LXJlZ3VsYXRvcnMiCisJCSAgICAicWNvbSxycG0tcG04OTAxLXJlZ3VsYXRvcnMiCisJCSAgICAicWNvbSxycG0tcG04OTIxLXJlZ3VsYXRvcnMiCisKKy0gdmRkX2wwX2wxX2x2cy1zdXBwbHk6CistIHZkZF9sMl9sMTFfbDEyLXN1cHBseToKKy0gdmRkX2wzX2w0X2w1LXN1cHBseToKKy0gdmRkX2w2X2w3LXN1cHBseToKKy0gdmRkX2w4LXN1cHBseToKKy0gdmRkX2w5LXN1cHBseToKKy0gdmRkX2wxMC1zdXBwbHk6CistIHZkZF9sMTNfbDE2LXN1cHBseToKKy0gdmRkX2wxNF9sMTUtc3VwcGx5OgorLSB2ZGRfbDE3X2wxOC1zdXBwbHk6CistIHZkZF9sMTlfbDIwLXN1cHBseToKKy0gdmRkX2wyMS1zdXBwbHk6CistIHZkZF9sMjItc3VwcGx5OgorLSB2ZGRfbDIzX2wyNF9sMjUtc3VwcGx5OgorLSB2ZGRfbmNwLXN1cHBseToKKy0gdmRkX3MwLXN1cHBseToKKy0gdmRkX3MxLXN1cHBseToKKy0gdmRkX3MyLXN1cHBseToKKy0gdmRkX3MzLXN1cHBseToKKy0gdmRkX3M0LXN1cHBseToKKwlVc2FnZTogb3B0aW9uYWwgKHBtODA1OCBvbmx5KQorCVZhbHVlIHR5cGU6IDxwaGFuZGxlPgorCURlZmluaXRpb246IHJlZmVyZW5jZSB0byByZWd1bGF0b3Igc3VwcGx5aW5nIHRoZSBpbnB1dCBwaW4sIGFzCisJCSAgICBkZXNjcmliZWQgaW4gdGhlIGRhdGEgc2hlZXQKKworLSBsdnMwX2luLXN1cHBseToKKy0gbHZzMV9pbi1zdXBwbHk6CistIGx2czJfaW4tc3VwcGx5OgorLSBsdnMzX2luLXN1cHBseToKKy0gbXZzX2luLXN1cHBseToKKy0gdmRkX2wwLXN1cHBseToKKy0gdmRkX2wxLXN1cHBseToKKy0gdmRkX2wyLXN1cHBseToKKy0gdmRkX2wzLXN1cHBseToKKy0gdmRkX2w0LXN1cHBseToKKy0gdmRkX2w1LXN1cHBseToKKy0gdmRkX2w2LXN1cHBseToKKy0gdmRkX3MwLXN1cHBseToKKy0gdmRkX3MxLXN1cHBseToKKy0gdmRkX3MyLXN1cHBseToKKy0gdmRkX3MzLXN1cHBseToKKy0gdmRkX3M0LXN1cHBseToKKwlVc2FnZTogb3B0aW9uYWwgKHBtODkwMSBvbmx5KQorCVZhbHVlIHR5cGU6IDxwaGFuZGxlPgorCURlZmluaXRpb246IHJlZmVyZW5jZSB0byByZWd1bGF0b3Igc3VwcGx5aW5nIHRoZSBpbnB1dCBwaW4sIGFzCisJCSAgICBkZXNjcmliZWQgaW4gdGhlIGRhdGEgc2hlZXQKKworLSB2ZGRfbDFfbDJfbDEyX2wxOC1zdXBwbHk6CistIHZkZF9sM19sMTVfbDE3LXN1cHBseToKKy0gdmRkX2w0X2wxNC1zdXBwbHk6CistIHZkZF9sNV9sOF9sMTYtc3VwcGx5OgorLSB2ZGRfbDZfbDctc3VwcGx5OgorLSB2ZGRfbDlfbDExLXN1cHBseToKKy0gdmRkX2wxMF9sMjItc3VwcGx5OgorLSB2ZGRfbDIxX2wyM19sMjktc3VwcGx5OgorLSB2ZGRfbDI0LXN1cHBseToKKy0gdmRkX2wyNS1zdXBwbHk6CistIHZkZF9sMjYtc3VwcGx5OgorLSB2ZGRfbDI3LXN1cHBseToKKy0gdmRkX2wyOC1zdXBwbHk6CistIHZkZF9uY3Atc3VwcGx5OgorLSB2ZGRfczEtc3VwcGx5OgorLSB2ZGRfczItc3VwcGx5OgorLSB2ZGRfczQtc3VwcGx5OgorLSB2ZGRfczUtc3VwcGx5OgorLSB2ZGRfczYtc3VwcGx5OgorLSB2ZGRfczctc3VwcGx5OgorLSB2ZGRfczgtc3VwcGx5OgorLSB2aW5fNXZzLXN1cHBseToKKy0gdmluX2x2czFfM182LXN1cHBseToKKy0gdmluX2x2czItc3VwcGx5OgorLSB2aW5fbHZzNF81Xzctc3VwcGx5OgorCVVzYWdlOiBvcHRpb25hbCAocG04OTIxIG9ubHkpCisJVmFsdWUgdHlwZTogPHBoYW5kbGU+CisJRGVmaW5pdGlvbjogcmVmZXJlbmNlIHRvIHJlZ3VsYXRvciBzdXBwbHlpbmcgdGhlIGlucHV0IHBpbiwgYXMKKwkJICAgIGRlc2NyaWJlZCBpbiB0aGUgZGF0YSBzaGVldAorCitUaGUgcmVndWxhdG9yIG5vZGUgaG91c2VzIHN1Yi1ub2RlcyBmb3IgZWFjaCByZWd1bGF0b3Igd2l0aGluIHRoZSBkZXZpY2UuIEVhY2gKK3N1Yi1ub2RlIGlzIGlkZW50aWZpZWQgdXNpbmcgdGhlIG5vZGUncyBuYW1lLCB3aXRoIHZhbGlkIHZhbHVlcyBsaXN0ZWQgZm9yIGVhY2gKK29mIHRoZSBwbWljcyBiZWxvdy4KKworcG04MDU4OgorCWwwLCBsMSwgbDIsIGwzLCBsNCwgbDUsIGw2LCBsNywgbDgsIGw5LCBsMTAsIGwxMSwgbDEyLCBsMTMsIGwxNCwgbDE1LAorCWwxNiwgbDE3LCBsMTgsIGwxOSwgbDIwLCBsMjEsIGwyMiwgbDIzLCBsMjQsIGwyNSwgczAsIHMxLCBzMiwgczMsIHM0LAorCWx2czAsIGx2czEsIG5jcAorCitwbTg5MDE6CisJbDAsIGwxLCBsMiwgbDMsIGw0LCBsNSwgbDYsIHMwLCBzMSwgczIsIHMzLCBzNCwgbHZzMCwgbHZzMSwgbHZzMiwgbHZzMywKKwltdnMKKworcG04OTIxOgorCXMxLCBzMiwgczMsIHM0LCBzNywgczgsIGwxLCBsMiwgbDMsIGw0LCBsNSwgbDYsIGw3LCBsOCwgbDksIGwxMCwgbDExLAorCWwxMiwgbDE0LCBsMTUsIGwxNiwgbDE3LCBsMTgsIGwyMSwgbDIyLCBsMjMsIGwyNCwgbDI1LCBsMjYsIGwyNywgbDI4LAorCWwyOSwgbHZzMSwgbHZzMiwgbHZzMywgbHZzNCwgbHZzNSwgbHZzNiwgbHZzNywgdXNiLXN3aXRjaCwgaGRtaS1zd2l0Y2gsCisJbmNwCisKK1RoZSBjb250ZW50IG9mIGVhY2ggc3ViLW5vZGUgaXMgZGVmaW5lZCBieSB0aGUgc3RhbmRhcmQgYmluZGluZyBmb3IgcmVndWxhdG9ycyAtCitzZWUgcmVndWxhdG9yLnR4dCAtIHdpdGggYWRkaXRpb25hbCBjdXN0b20gcHJvcGVydGllcyBkZXNjcmliZWQgYmVsb3c6CisKKz09PSBTd2l0Y2gtbW9kZSBQb3dlciBTdXBwbHkgcmVndWxhdG9yIGN1c3RvbSBwcm9wZXJ0aWVzCisKKy0gYmlhcy1wdWxsLWRvd246CisJVXNhZ2U6IG9wdGlvbmFsCisJVmFsdWUgdHlwZTogPGVtcHR5PgorCURlZmluaXRpb246IGVuYWJsZSBwdWxsIGRvd24gb2YgdGhlIHJlZ3VsYXRvciB3aGVuIGluYWN0aXZlCisKKy0gcWNvbSxzd2l0Y2gtbW9kZS1mcmVxdWVuY3k6CisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHUzMj4KKwlEZWZpbml0aW9uOiBGcmVxdWVuY3kgKEh6KSBvZiB0aGUgc3dpdGNoLW1vZGUgcG93ZXIgc3VwcGx5OworCQkgICAgbXVzdCBiZSBvbmUgb2Y6CisJCSAgICAxOTIwMDAwMCwgOTYwMDAwMCwgNjQwMDAwMCwgNDgwMDAwMCwgMzg0MDAwMCwgMzIwMDAwMCwKKwkJICAgIDI3NDAwMDAsIDI0MDAwMDAsIDIxMzAwMDAsIDE5MjAwMDAsIDE3NTAwMDAsIDE2MDAwMDAsCisJCSAgICAxNDgwMDAwLCAxMzcwMDAwLCAxMjgwMDAwLCAxMjAwMDAwCisKKy0gcWNvbSxmb3JjZS1tb2RlOgorCVVzYWdlOiBvcHRpb25hbCAoZGVmYXVsdCBpZiBubyBvdGhlciBxY29tLGZvcmNlLW1vZGUgaXMgc3BlY2lmaWVkKQorCVZhbHVlIHR5cGU6IDx1MzI+CisJRGVmaW50aW9uOiBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVndWxhdG9yIHNob3VsZCBiZSBmb3JjZWQgdG8gYQorCQkgICBwYXJ0aWN1bGFyIG1vZGUsIHZhbGlkIHZhbHVlcyBhcmU6CisJCSAgIFFDT01fUlBNX0ZPUkNFX01PREVfTk9ORSAtIGRvIG5vdCBmb3JjZSBhbnkgbW9kZQorCQkgICBRQ09NX1JQTV9GT1JDRV9NT0RFX0xQTSAtIGZvcmNlIGludG8gbG93IHBvd2VyIG1vZGUKKwkJICAgUUNPTV9SUE1fRk9SQ0VfTU9ERV9IUE0gLSBmb3JjZSBpbnRvIGhpZ2ggcG93ZXIgbW9kZQorCQkgICBRQ09NX1JQTV9GT1JDRV9NT0RFX0FVVE8gLSBhbGxvdyByZWd1bGF0b3IgdG8gYXV0b21hdGljYWxseQorCQkJCQkgICAgICBzZWxlY3QgaXRzIG93biBtb2RlIGJhc2VkIG9uCisJCQkJCSAgICAgIHJlYWx0aW1lIGN1cnJlbnQgZHJhdywgb25seSBmb3I6CisJCQkJCSAgICAgIHBtODkyMSBzbXBzIGFuZCBmdHNtcHMKKworLSBxY29tLHBvd2VyLW1vZGUtaHlzdGVyZXRpYzoKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8ZW1wdHk+CisJRGVmaW5pdGlvbjogc2VsZWN0IHRoYXQgdGhlIHBvd2VyIHN1cHBseSBzaG91bGQgb3BlcmF0ZSBpbiBoeXN0ZXJldGljCisJCSAgICBtb2RlLCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHB3bSBtb2RlCisKKz09PSBMb3ctZHJvcG91dCByZWd1bGF0b3IgY3VzdG9tIHByb3BlcnRpZXMKKworLSBiaWFzLXB1bGwtZG93bjoKKwlVc2FnZTogb3B0aW9uYWwKKwlWYWx1ZSB0eXBlOiA8ZW1wdHk+CisJRGVmaW5pdGlvbjogZW5hYmxlIHB1bGwgZG93biBvZiB0aGUgcmVndWxhdG9yIHdoZW4gaW5hY3RpdmUKKworLSBxY29tLGZvcmNlLW1vZGU6CisJVXNhZ2U6IG9wdGlvbmFsCisJVmFsdWUgdHlwZTogPHUzMj4KKwlEZWZpbnRpb246IGluZGljYXRlcyB0aGF0IHRoZSByZWd1bGF0b3Igc2hvdWxkIG5vdCBiZSBmb3JjZWQgdG8gYW55CisJCSAgIHBhcnRpY3VsYXIgbW9kZSwgdmFsaWQgdmFsdWVzIGFyZToKKwkJICAgUUNPTV9SUE1fRk9SQ0VfTU9ERV9OT05FIC0gZG8gbm90IGZvcmNlIGFueSBtb2RlCisJCSAgIFFDT01fUlBNX0ZPUkNFX01PREVfTFBNIC0gZm9yY2UgaW50byBsb3cgcG93ZXIgbW9kZQorCQkgICBRQ09NX1JQTV9GT1JDRV9NT0RFX0hQTSAtIGZvcmNlIGludG8gaGlnaCBwb3dlciBtb2RlCisJCSAgIFFDT01fUlBNX0ZPUkNFX01PREVfQllQQVNTIC0gc2V0IHJlZ3VsYXRvciB0byB1c2UgYnlwYXNzCisJCQkJCQltb2RlLCBpLmUuICB0byBhY3QgYXMgYSBzd2l0Y2gKKwkJCQkJCWFuZCBub3QgcmVndWxhdGUsIG9ubHkgZm9yOgorCQkJCQkJcG04OTIxIHBsZG8sIG5sZG8gYW5kIG5sZG8xMjAwCisKKz09PSBOZWdhdGl2ZSBDaGFyZ2UgUHVtcCBjdXN0b20gcHJvcGVydGllcworCistIHFjb20sc3dpdGNoLW1vZGUtZnJlcXVlbmN5OgorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDx1MzI+CisJRGVmaW5pdGlvbjogRnJlcXVlbmN5IChIeikgb2YgdGhlIHN3aXRoIG1vZGUgcG93ZXIgc3VwcGx5OworCQkgICAgbXVzdCBiZSBvbmUgb2Y6CisJCSAgICAxOTIwMDAwMCwgOTYwMDAwMCwgNjQwMDAwMCwgNDgwMDAwMCwgMzg0MDAwMCwgMzIwMDAwMCwKKwkJICAgIDI3NDAwMDAsIDI0MDAwMDAsIDIxMzAwMDAsIDE5MjAwMDAsIDE3NTAwMDAsIDE2MDAwMDAsCisJCSAgICAxNDgwMDAwLCAxMzcwMDAwLCAxMjgwMDAwLCAxMjAwMDAwCisKID0gRVhBTVBMRQogCiAJI2luY2x1ZGUgPGR0LWJpbmRpbmdzL21mZC9xY29tLXJwbS5oPgpAQCAtNjQsNyArMjM3LDI4IEBACiAJCWludGVycnVwdHMgPSA8MCAxOSAwPiwgPDAgMjEgMD4sIDwwIDIyIDA+OwogCQlpbnRlcnJ1cHQtbmFtZXMgPSAiYWNrIiwgImVyciIsICJ3YWtldXAiOwogCi0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJcmVndWxhdG9ycyB7CisJCQljb21wYXRpYmxlID0gInFjb20scnBtLXBtODkyMS1yZWd1bGF0b3JzIjsKKwkJCXZkZF9sMV9sMl9sMTJfbDE4LXN1cHBseSA9IDwmcG04OTIxX3M0PjsKKworCQkJczEgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDEyMjUwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDEyMjUwMDA+OworCisJCQkJYmlhcy1wdWxsLWRvd247CisKKwkJCQlxY29tLHN3aXRjaC1tb2RlLWZyZXF1ZW5jeSA9IDwzMjAwMDAwPjsKKwkJCX07CisKKwkJCXBtODkyMV9zNDogczQgeworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDE4MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDE4MDAwMDA+OworCisJCQkJcWNvbSxzd2l0Y2gtbW9kZS1mcmVxdWVuY3kgPSA8MTYwMDAwMD47CisJCQkJYmlhcy1wdWxsLWRvd247CisKKwkJCQlxY29tLGZvcmNlLW1vZGUgPSA8UUNPTV9SUE1fRk9SQ0VfTU9ERV9BVVRPPjsKKwkJCX07CisJCX07CiAJfTsKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9za3k4MTQ1Mi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbWZkL3NreTgxNDUyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTE4MTc5Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21mZC9za3k4MTQ1Mi50eHQKQEAgLTAsMCArMSwzNSBAQAorU0tZODE0NTIgYmluZGluZ3MKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZQk6IE11c3QgYmUgInNreXdvcmtzLHNreTgxNDUyIgorLSByZWcJCTogSTJDIHNsYXZlIGFkZHJlc3MKKworUmVxdWlyZWQgY2hpbGQgbm9kZXM6CistIGJhY2tsaWdodAk6IGNvbnRhaW5lciBub2RlIGZvciBiYWNrbGlnaHQgZm9sbG93aW5nIHRoZSBiaW5kaW5nCisJCWluIHZpZGVvL2JhY2tsaWdodC9za3k4MTQ1Mi1iYWNrbGlnaHQudHh0CistIHJlZ3VsYXRvcgk6IGNvbnRhaW5lciBub2RlIGZvciByZWd1bGF0b3JzIGZvbGxvd2luZyB0aGUgYmluZGluZworCQlpbiByZWd1bGF0b3Ivc2t5ODE0NTItcmVndWxhdG9yLnR4dAorCitFeGFtcGxlOgorCisJc2t5ODE0NTJAMmMgeworCQljb21wYXRpYmxlID0gInNreXdvcmtzLHNreTgxNDUyIjsKKwkJcmVnID0gPDB4MmM+OworCisJCWJhY2tsaWdodCB7CisJCQljb21wYXRpYmxlID0gInNreXdvcmtzLHNreTgxNDUyLWJhY2tsaWdodCI7CisJCQluYW1lID0gInB3bS1iYWNrbGlnaHQiOworCQkJbGVkLXNvdXJjZXMgPSA8MCAxIDIgMyA2PjsKKwkJCXNreXdvcmtzLGlnbm9yZS1wd207CisJCQlza3l3b3JrcyxwaGFzZS1zaGlmdDsKKwkJCXNreXdvcmtzLGN1cnJlbnQtbGltaXQgPSA8MjMwMD47CisJCX07CisKKwkJcmVndWxhdG9yIHsKKwkJCWxvdXQgeworCQkJCXJlZ3VsYXRvci1uYW1lID0gInNreTgxNDUyLWxvdXQiOworCQkJCXJlZ3VsYXRvci1taW4tbWljcm92b2x0ID0gPDQ1MDAwMDA+OworCQkJCXJlZ3VsYXRvci1tYXgtbWljcm92b2x0ID0gPDgwMDAwMDA+OworCQkJfTsKKwkJfTsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9icmNtLHNkaGNpLWlwcm9jLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYnJjbSxzZGhjaS1pcHJvYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJjYzljYwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvYnJjbSxzZGhjaS1pcHJvYy50eHQKQEAgLTAsMCArMSwyMyBAQAorQnJvYWRjb20gSVBST0MgU0RIQ0kgY29udHJvbGxlcgorCitUaGlzIGZpbGUgZG9jdW1lbnRzIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIGNvcmUgcHJvcGVydGllcyBkZXNjcmliZWQKK2J5IG1tYy50eHQgYW5kIHRoZSBwcm9wZXJ0aWVzIHRoYXQgcmVwcmVzZW50IHRoZSBJUFJPQyBTREhDSSBjb250cm9sbGVyLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJicmNtLHNkaGNpLWlwcm9jLWN5Z251cyIuCistIGNsb2NrcyA6IFRoZSBjbG9jayBmZWVkaW5nIHRoZSBTREhDSSBjb250cm9sbGVyLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorICAtIHNkaGNpLGF1dG8tY21kMTI6IHNwZWNpZmllcyB0aGF0IGNvbnRyb2xsZXIgc2hvdWxkIHVzZSBhdXRvIENNRDEyLgorCitFeGFtcGxlOgorCitzZGhjaTA6IHNkaGNpQDB4MTgwNDEwMDAgeworCWNvbXBhdGlibGUgPSAiYnJjbSxzZGhjaS1pcHJvYy1jeWdudXMiOworCXJlZyA9IDwweDE4MDQxMDAwIDB4MTAwPjsKKwlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTA4IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCWNsb2NrcyA9IDwmbGNwbGwwX2Nsa3MgQkNNX0NZR05VU19MQ1BMTDBfU0RJT19DTEs+OworCWJ1cy13aWR0aCA9IDw0PjsKKwlzZGhjaSxhdXRvLWNtZDEyOworCW5vLTEtOC12OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvZXh5bm9zLWR3LW1zaGMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9leHlub3MtZHctbXNoYy50eHQKaW5kZXggZWU0ZmMwNS4uYWFkOTg0NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9leHlub3MtZHctbXNoYy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9leHlub3MtZHctbXNoYy50eHQKQEAgLTM2LDYgKzM2LDggQEAKICAgaW4gdHJhbnNtaXQgbW9kZSBhbmQgQ0lVIGNsb2NrIHBoYXNlIHNoaWZ0IHZhbHVlIGluIHJlY2VpdmUgbW9kZSBmb3IgZG91YmxlCiAgIGRhdGEgcmF0ZSBtb2RlIG9wZXJhdGlvbi4gUmVmZXIgbm90ZXMgYmVsb3cgZm9yIHRoZSBvcmRlciBvZiB0aGUgY2VsbHMgYW5kIHRoZQogICB2YWxpZCB2YWx1ZXMuCisqIHNhbXN1bmcsZHctbXNoYy1oczQwMC10aW1pbmc6IFNwZWNpZmllcyB0aGUgdmFsdWUgb2YgQ0lVIFRYIGFuZCBSWCBjbG9jayBwaGFzZQorICBzaGlmdCB2YWx1ZSBmb3IgaHM0MDAgbW9kZSBvcGVyYXRpb24uCiAKICAgTm90ZXMgZm9yIHRoZSBzZHItdGltaW5nIGFuZCBkZHItdGltaW5nIHZhbHVlczoKIApAQCAtNTAsNiArNTIsOSBAQAogICAgICAgLSBpZiBDSVUgY2xvY2sgZGl2aWRlciB2YWx1ZSBpcyAwICh0aGF0IGlzIGRpdmlkZSBieSAxKSwgYm90aCB0eCBhbmQgcngKICAgICAgICAgcGhhc2Ugc2hpZnQgY2xvY2tzIHNob3VsZCBiZSAwLgogCisqIHNhbXN1bmcscmVhZC1zdHJvYmUtZGVsYXk6IFJDTEsgKERhdGEgc3Ryb2JlKSBkZWxheSB0byBjb250cm9sIEhTNDAwIG1vZGUKKyAgKExhdGVuY3kgdmFsdWUgZm9yIGRlbGF5IGxpbmUgaW4gUmVhZCBwYXRoKQorCiBSZXF1aXJlZCBwcm9wZXJ0aWVzIGZvciBhIHNsb3QgKERlcHJlY2F0ZWQgLSBSZWNvbW1lbmQgdG8gdXNlIG9uZSBzbG90IHBlciBob3N0KToKIAogKiBncGlvczogc3BlY2lmaWVzIGEgbGlzdCBvZiBncGlvcyB1c2VkIGZvciBjb21tYW5kLCBjbG9jayBhbmQgZGF0YSBidXMuIFRoZQpAQCAtODIsNSArODcsNyBAQAogCQlzYW1zdW5nLGR3LW1zaGMtY2l1LWRpdiA9IDwzPjsKIAkJc2Ftc3VuZyxkdy1tc2hjLXNkci10aW1pbmcgPSA8MiAzPjsKIAkJc2Ftc3VuZyxkdy1tc2hjLWRkci10aW1pbmcgPSA8MSAyPjsKKwkJc2Ftc3VuZyxkdy1tc2hjLWhzNDAwLXRpbWluZyA9IDwwIDI+OworCQlzYW1zdW5nLHJlYWQtc3Ryb2JlLWRlbGF5ID0gPDkwPjsKIAkJYnVzLXdpZHRoID0gPDg+OwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2ZzbC1pbXgtZXNkaGMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9mc2wtaW14LWVzZGhjLnR4dAppbmRleCA5MDQ2YmEwNi4uNDE1YzU1NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9mc2wtaW14LWVzZGhjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL2ZzbC1pbXgtZXNkaGMudHh0CkBAIC0xNyw2ICsxNywxMCBAQAogICB0byBzZWxlY3QgYSBwcm9wZXIgZGF0YSBzYW1wbGluZyB3aW5kb3cgaW4gY2FzZSB0aGUgY2xvY2sgcXVhbGl0eSBpcyBub3QgZ29vZAogICBkdWUgdG8gc2lnbmFsIHBhdGggaXMgdG9vIGxvbmcgb24gdGhlIGJvYXJkLiBQbGVhc2UgcmVmZXIgdG8gZVNESEMvdVNESEMKICAgY2hhcHRlciwgRExMIChEZWxheSBMaW5lKSBzZWN0aW9uIGluIFJNIGZvciBkZXRhaWxzLgorLSB2b2x0YWdlLXJhbmdlcyA6IFNwZWNpZnkgdGhlIHZvbHRhZ2UgcmFuZ2UgaW4gY2FzZSB0aGVyZSBhcmUgc29mdHdhcmUKKyAgdHJhbnNwYXJlbnQgbGV2ZWwgc2hpZnRlcnMgb24gdGhlIG91dHB1dHMgb2YgdGhlIGNvbnRyb2xsZXIuIFR3byBjZWxscyBhcmUKKyAgcmVxdWlyZWQsIGZpcnN0IGNlbGwgc3BlY2lmaWVzIG1pbmltdW0gc2xvdCB2b2x0YWdlIChtViksIHNlY29uZCBjZWxsCisgIHNwZWNpZmllcyBtYXhpbXVtIHNsb3Qgdm9sdGFnZSAobVYpLiBTZXZlcmFsIHJhbmdlcyBjb3VsZCBiZSBzcGVjaWZpZWQuCiAKIEV4YW1wbGVzOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL21tYy1jYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLWNhcmQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MGZjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL21tYy1jYXJkLnR4dApAQCAtMCwwICsxLDMxIEBACittbWMtY2FyZCAvIGVNTUMgYmluZGluZ3MKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGRvY3VtZW50cyBkZXNjcmliZXMgdGhlIGRldmljZXRyZWUgYmluZGluZ3MgZm9yIGEgbW1jLWhvc3QgY29udHJvbGxlcgorY2hpbGQgbm9kZSBkZXNjcmliaW5nIGEgbW1jLWNhcmQgLyBhbiBlTU1DLCBzZWUgIlVzZSBvZiBGdW5jdGlvbiBzdWJub2RlcyIKK2luIG1tYy50eHQKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy1jb21wYXRpYmxlIDogTXVzdCBiZSAibW1jLWNhcmQiCistcmVnICAgICAgICA6IE11c3QgYmUgPDA+CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistYnJva2VuLWhwaSA6IFVzZSB0aGlzIHRvIGluZGljYXRlIHRoYXQgdGhlIG1tYy1jYXJkIGhhcyBhIGJyb2tlbiBocGkKKyAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24sIGFuZCB0aGF0IGhwaSBzaG91bGQgbm90IGJlIHVzZWQKKworRXhhbXBsZToKKworJm1tYzIgeworCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CisJcGluY3RybC0wID0gPCZtbWMyX3BpbnNfYT47CisJdm1tYy1zdXBwbHkgPSA8JnJlZ192Y2MzdjM+OworCWJ1cy13aWR0aCA9IDw4PjsKKwlub24tcmVtb3ZhYmxlOworCXN0YXR1cyA9ICJva2F5IjsKKworCW1tY2NhcmQ6IG1tY2NhcmRAMCB7CisJCXJlZyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJtbWMtY2FyZCI7CisJCWJyb2tlbi1ocGk7CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbW1jL3NkaGNpLXN0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc2RoY2ktc3QudHh0CmluZGV4IDc1MjdkYjQuLjE4ZDk1MGQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc2RoY2ktc3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvc2RoY2ktc3QudHh0CkBAIC01LDIwICs1LDYyIEBACiB1c2VkIGJ5IHRoZSBzZGhjaS1zdCBkcml2ZXIuCiAKIFJlcXVpcmVkIHByb3BlcnRpZXM6Ci0tIGNvbXBhdGlibGUgOiAgTXVzdCBiZSAic3Qsc2RoY2kiCi0tIGNsb2NrLW5hbWVzIDogU2hvdWxkIGJlICJtbWMiCi0gICAgICAgICAgICAgICAgU2VlOiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVzb3VyY2UtbmFtZXMudHh0Ci0tIGNsb2NrcyA6ICAgICAgUGhhbmRsZSBvZiB0aGUgY2xvY2sgdXNlZCBieSB0aGUgc2RoY2kgY29udHJvbGVyCi0gICAgICAgICAgICAgICAgU2VlOiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CistIGNvbXBhdGlibGU6CQlNdXN0IGJlICJzdCxzZGhjaSIgYW5kIGl0IGNhbiBiZSBjb21wYXRpYmxlIHRvICJzdCxzZGhjaS1zdGloNDA3IgorCQkJdG8gc2V0IHRoZSBpbnRlcm5hbCBnbHVlIGxvZ2ljIHVzZWQgZm9yIGNvbmZpZ3VyaW5nIHRoZSBNTUMKKwkJCXN1YnN5c3RlbSAobW1jc3MpIGluc2lkZSB0aGUgRmxhc2hTUyAoYXZhaWxhYmxlIGluIFNUaUg0MDcgU29DCisJCQlmYW1pbHkpLgorCistIGNsb2NrLW5hbWVzOgkJU2hvdWxkIGJlICJtbWMiLgorCQkJU2VlOiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVzb3VyY2UtbmFtZXMudHh0CistIGNsb2NrczoJCVBoYW5kbGUgdG8gdGhlIGNsb2NrLgorCQkJU2VlOiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0CisKKy0gaW50ZXJydXB0czoJCU9uZSBtbWMgaW50ZXJydXB0IHNob3VsZCBiZSBkZXNjcmliZWQgaGVyZS4KKy0gaW50ZXJydXB0LW5hbWVzOglTaG91bGQgYmUgIm1tY2lycSIuCisKKy0gcGluY3RybC1uYW1lczoJQSBwaW5jdHJsIHN0YXRlIG5hbWVzICJkZWZhdWx0IiBtdXN0IGJlIGRlZmluZWQuCistIHBpbmN0cmwtMDoJCVBoYW5kbGUgcmVmZXJlbmNpbmcgcGluIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHNkL2VtbWMgY29udHJvbGxlci4KKwkJCVNlZTogRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcGluY3RybC1iaW5kaW5nLnR4dAorCistIHJlZzoJCQlUaGlzIG11c3QgcHJvdmlkZSB0aGUgaG9zdCBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyBhbmQgaXQgY2FuIGFsc28KKwkJCWNvbnRhaW4gdGhlIEZsYXNoU1MgVG9wIHJlZ2lzdGVyIGZvciBUWC9SWCBkZWxheSB1c2VkIGJ5IHRoZSBkcml2ZXIKKwkJCXRvIGNvbmZpZ3VyZSBETEwgaW5zaWRlIHRoZSBmbGFzaFNTLCBpZiBzbyByZWctbmFtZXMgbXVzdCBhbHNvIGJlCisJCQlzcGVjaWZpZWQuCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6Ci0tIG5vbi1yZW1vdmFibGU6IG5vbi1yZW1vdmFibGUgc2xvdAotICAgICAgICAgICAgICAgICBTZWU6IERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLnR4dAotLSBidXMtd2lkdGg6IE51bWJlciBvZiBkYXRhIGxpbmVzCi0gICAgICAgICAgICAgICAgIFNlZTogRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMudHh0CistIHJlZy1uYW1lczoJCVNob3VsZCBiZSAibW1jIiBhbmQgInRvcC1tbWMtZGVsYXkiLiAidG9wLW1tYy1kZWxheSIgaXMgb3B0aW9uYWwKKwkJCWZvciBlTU1DIG9uIHN0aWg0MDcgZmFtaWx5IHNpbGljb24gdG8gY29uZmlndXJlIERMTCBpbnNpZGUgRmxhc2hTUy4KKworLSBub24tcmVtb3ZhYmxlOglOb24tcmVtb3ZhYmxlIHNsb3QuIEFsc28gdXNlZCBmb3IgY29uZmlndXJpbmcgbW1jc3MgaW4gU1RpSDQwNyBTb0MKKwkJCWZhbWlseS4KKwkJCVNlZTogIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLnR4dC4KKworLSBidXMtd2lkdGg6CQlOdW1iZXIgb2YgZGF0YSBsaW5lcy4KKwkJCVNlZTogIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLnR4dC4KKworLSBtYXgtZnJlcXVlbmN5OiAJQ2FuIGJlIDIwME1IeiwgMTAwTXogb3IgNTBNSHogKGRlZmF1bHQpIGFuZCB1c2VkIGZvcgorCQkJY29uZmlndXJpbmcgdGhlIENDT05GSUczIGluIHRoZSBtbWNzcy4KKwkJCVNlZTogIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLnR4dC4KKworLSByZXNldHM6CQlQaGFuZGxlIGFuZCByZXNldCBzcGVjaWZpZXIgcGFpciB0byBzb2Z0cmVzZXQgbGluZSBvZiBIQyBJUC4KKwkJCVNlZTogRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Jlc2V0L3Jlc2V0LnR4dAorCistIHZxbW1jLXN1cHBseToJCVBoYW5kbGUgdG8gdGhlIHJlZ3VsYXRvciBkdCBub2RlLCBtZW50aW9uZWQgYXMgdGhlIHZjYy92ZGQKKwkJCXN1cHBseSBpbiBlTU1DL1NEIHNwZWNzLgorCistIHNkLXVocy0tc2RyNTA6CVRvIGVuYWJsZSB0aGUgU0RSNTAgaW4gdGhlIG1tY3NzLgorCQkJU2VlOiAgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9tbWMudHh0LgorCistIHNkLXVocy1zZHIxMDQ6CVRvIGVuYWJsZSB0aGUgU0RSMTA0IGluIHRoZSBtbWNzcy4KKwkJCVNlZTogIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLnR4dC4KKworLSBzZC11aHMtZGRyNTA6CQlUbyBlbmFibGUgdGhlIEREUjUwIGluIHRoZSBtbWNzcy4KKwkJCVNlZTogIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvbW1jLnR4dC4KIAogRXhhbXBsZToKIAorLyogRXhhbXBsZSBzdGloNDE2ZSBlTU1DIGNvbmZpZ3VyYXRpb24gKi8KKwogbW1jMDogc2RoY2lAZmU4MWUwMDAgewogCWNvbXBhdGlibGUJPSAic3Qsc2RoY2kiOwogCXN0YXR1cwkJPSAiZGlzYWJsZWQiOwpAQCAtMjksNSArNzEsNDMgQEAKIAlwaW5jdHJsLTAJPSA8JnBpbmN0cmxfbW1jMD47CiAJY2xvY2stbmFtZXMJPSAibW1jIjsKIAljbG9ja3MJCT0gPCZjbGtfc19hMV9scyAxPjsKLQlidXMtd2lkdGggICAgICAgPSA8OD4KKwlidXMtd2lkdGgJPSA8OD4KKworLyogRXhhbXBsZSBTRCBzdGloNDA3IGZhbWlseSBjb25maWd1cmF0aW9uICovCisKK21tYzE6IHNkaGNpQDA5MDgwMDAwIHsKKwljb21wYXRpYmxlCT0gInN0LHNkaGNpLXN0aWg0MDciLCAic3Qsc2RoY2kiOworCXN0YXR1cwkJPSAiZGlzYWJsZWQiOworCXJlZwkJPSA8MHgwOTA4MDAwMCAweDdmZj47CisJcmVnLW5hbWVzCT0gIm1tYyI7CisJaW50ZXJydXB0cwk9IDxHSUNfU1BJIDkwIElSUV9UWVBFX05PTkU+OworCWludGVycnVwdC1uYW1lcwk9ICJtbWNpcnEiOworCXBpbmN0cmwtbmFtZXMJPSAiZGVmYXVsdCI7CisJcGluY3RybC0wCT0gPCZwaW5jdHJsX3NkMT47CisJY2xvY2stbmFtZXMJPSAibW1jIjsKKwljbG9ja3MJCT0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19NTUNfMT47CisJcmVzZXRzCQk9IDwmc29mdHJlc2V0IFNUSUg0MDdfTU1DMV9TT0ZUUkVTRVQ+OworCWJ1cy13aWR0aAk9IDw0PjsKK307CisKKy8qIEV4YW1wbGUgZU1NQyBzdGloNDA3IGZhbWlseSBjb25maWd1cmF0aW9uICovCisKK21tYzA6IHNkaGNpQDA5MDYwMDAwIHsKKwljb21wYXRpYmxlCT0gInN0LHNkaGNpLXN0aWg0MDciLCAic3Qsc2RoY2kiOworCXN0YXR1cwkJPSAiZGlzYWJsZWQiOworCXJlZwkJPSA8MHgwOTA2MDAwMCAweDdmZj4sIDwweDkwNjEwMDggMHgyMD47CisJcmVnLW5hbWVzCT0gIm1tYyIsICJ0b3AtbW1jLWRlbGF5IjsKKwlpbnRlcnJ1cHRzCT0gPEdJQ19TUEkgOTIgSVJRX1RZUEVfTk9ORT47CisJaW50ZXJydXB0LW5hbWVzCT0gIm1tY2lycSI7CisJcGluY3RybC1uYW1lcwk9ICJkZWZhdWx0IjsKKwlwaW5jdHJsLTAJPSA8JnBpbmN0cmxfbW1jMD47CisJY2xvY2stbmFtZXMJPSAibW1jIjsKKwljbG9ja3MJCT0gPCZjbGtfc19jMF9mbGV4Z2VuIENMS19NTUNfMD47CisJdnFtbWMtc3VwcGx5CT0gPCZ2bW1jX3JlZz47CisJbWF4LWZyZXF1ZW5jeQk9IDwyMDAwMDAwMDA+OworCWJ1cy13aWR0aAk9IDw4PjsKKwlub24tcmVtb3ZhYmxlOworCXNkLXVocy1zZHI1MDsKKwlzZC11aHMtc2RyMTA0OworCXNkLXVocy1kZHI1MDsKIH07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2FwbS14Z2VuZS1lbmV0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYXBtLXhnZW5lLWVuZXQudHh0CmluZGV4IDYxNTE5OTkuLmY1NWFhMjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYXBtLXhnZW5lLWVuZXQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvYXBtLXhnZW5lLWVuZXQudHh0CkBAIC0xNCw3ICsxNCwxMSBAQAogICAtICJlbmV0X2NzciI6IEV0aGVybmV0IGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlciBhZGRyZXNzIHNwYWNlCiAgIC0gInJpbmdfY3NyIjogRGVzY3JpcHRvciByaW5nIGNvbnRyb2wgYW5kIHN0YXR1cyByZWdpc3RlciBhZGRyZXNzIHNwYWNlCiAgIC0gInJpbmdfY21kIjogRGVzY3JpcHRvciByaW5nIGNvbW1hbmQgcmVnaXN0ZXIgYWRkcmVzcyBzcGFjZQotLSBpbnRlcnJ1cHRzOiBFdGhlcm5ldCBtYWluIGludGVycnVwdAorLSBpbnRlcnJ1cHRzOiBUd28gaW50ZXJydXB0IHNwZWNpZmllcnMgY2FuIGJlIHNwZWNpZmllZC4KKyAgLSBGaXJzdCBpcyB0aGUgUnggaW50ZXJydXB0LiAgVGhpcyBpcnEgaXMgbWFuZGF0b3J5LgorICAtIFNlY29uZCBpcyB0aGUgVHggY29tcGxldGlvbiBpbnRlcnJ1cHQuCisgICAgVGhpcyBpcyBzdXBwb3J0ZWQgb25seSBvbiBTR01JSSBiYXNlZCAxR2JFIGFuZCAxMEdiRSBpbnRlcmZhY2VzLgorLSBwb3J0LWlkOiBQb3J0IG51bWJlciAoMCBvciAxKQogLSBjbG9ja3M6IFJlZmVyZW5jZSB0byB0aGUgY2xvY2sgZW50cnkuCiAtIGxvY2FsLW1hYy1hZGRyZXNzOiBNQUMgYWRkcmVzcyBhc3NpZ25lZCB0byB0aGlzIGRldmljZQogLSBwaHktY29ubmVjdGlvbi10eXBlOiBJbnRlcmZhY2UgdHlwZSBiZXR3ZWVuIGV0aGVybmV0IGRldmljZSBhbmQgUEhZIGRldmljZQpAQCAtNDksNiArNTMsNyBAQAogCQkgICAgICA8MHgwIDBYMTAwMDAwMDAgMHgwIDBYMjAwPjsKIAkJcmVnLW5hbWVzID0gImVuZXRfY3NyIiwgInJpbmdfY3NyIiwgInJpbmdfY21kIjsKIAkJaW50ZXJydXB0cyA9IDwweDAgMHgzYyAweDQ+OworCQlwb3J0LWlkID0gPDA+OwogCQljbG9ja3MgPSA8Jm1lbmV0Y2xrIDA+OwogCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFswMCAwMSA3MyAwMCAwMCAwMV07CiAJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWkiOwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9kc2EvZHNhLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZHNhL2RzYS50eHQKaW5kZXggZTEyNDg0Ny4uZjBiNGNkNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9kc2EvZHNhLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2RzYS9kc2EudHh0CkBAIC0xOSw3ICsxOSw5IEBACiAoRFNBX01BWF9TV0lUQ0hFUykuCiBFYWNoIG9mIHRoZXNlIHN3aXRjaCBjaGlsZCBub2RlcyBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHJlcXVpcmVkIHByb3BlcnRpZXM6CiAKLS0gcmVnCQkJOiBEZXNjcmliZXMgdGhlIHN3aXRjaCBhZGRyZXNzIG9uIHRoZSBNSUkgYnVzCistIHJlZwkJCTogQ29udGFpbnMgdHdvIGZpZWxkcy4gVGhlIGZpcnN0IG9uZSBkZXNjcmliZXMgdGhlCisJCQkgIGFkZHJlc3Mgb24gdGhlIE1JSSBidXMuIFRoZSBzZWNvbmQgaXMgdGhlIHN3aXRjaAorCQkJICBudW1iZXIgdGhhdCBtdXN0IGJlIHVuaXF1ZSBpbiBjYXNjYWRlZCBjb25maWd1cmF0aW9ucwogLSAjYWRkcmVzcy1jZWxscwk6IE11c3QgYmUgMQogLSAjc2l6ZS1jZWxscwkJOiBNdXN0IGJlIDAKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9pZWVlODAyMTU0L2F0ODZyZjIzMC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2llZWU4MDIxNTQvYXQ4NnJmMjMwLnR4dAppbmRleCBkM2JiZGRlZC4uMTY4ZjFiZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9pZWVlODAyMTU0L2F0ODZyZjIzMC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9pZWVlODAyMTU0L2F0ODZyZjIzMC50eHQKQEAgLTYsMTEgKzYsMTQgQEAKICAgLSBzcGktbWF4LWZyZXF1ZW5jeToJbWF4aW1hbCBidXMgc3BlZWQsIHNob3VsZCBiZSBzZXQgdG8gNzUwMDAwMCBkZXBlbmRzCiAJCQlzeW5jIG9yIGFzeW5jIG9wZXJhdGlvbiBtb2RlCiAgIC0gcmVnOgkJdGhlIGNoaXBzZWxlY3QgaW5kZXgKLSAgLSBpbnRlcnJ1cHRzOgkJdGhlIGludGVycnVwdCBnZW5lcmF0ZWQgYnkgdGhlIGRldmljZQorICAtIGludGVycnVwdHM6CQl0aGUgaW50ZXJydXB0IGdlbmVyYXRlZCBieSB0aGUgZGV2aWNlLiBOb24gaGlnaC1sZXZlbAorCQkJY2FuIG9jY3VyIGRlYWRsb2NrcyB3aGlsZSBoYW5kbGluZyBpc3IuCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAgIC0gcmVzZXQtZ3BpbzoJCUdQSU8gc3BlYyBmb3IgdGhlIHJzdG4gcGluCiAgIC0gc2xlZXAtZ3BpbzoJCUdQSU8gc3BlYyBmb3IgdGhlIHNscF90ciBwaW4KKyAgLSB4dGFsLXRyaW06CQl1OCB2YWx1ZSBmb3IgZmluZSB0dW5pbmcgdGhlIGludGVybmFsIGNhcGFjaXRhbmNlCisJCQlhcnJheXMgb2YgeHRhbCBwaW5zOiAwID0gKzAgcEYsIDB4ZiA9ICs0LjUgcEYKIAogRXhhbXBsZToKIApAQCAtMTgsNiArMjEsNyBAQAogCQljb21wYXRpYmxlID0gImF0bWVsLGF0ODZyZjIzMSI7CiAJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDc1MDAwMDA+OwogCQlyZWcgPSA8MD47Ci0JCWludGVycnVwdHMgPSA8MTkgMT47CisJCWludGVycnVwdHMgPSA8MTkgND47CiAJCWludGVycnVwdC1wYXJlbnQgPSA8JmdwaW8zPjsKKwkJeHRhbC10cmltID0gL2JpdHMvIDggPDB4MDY+OwogCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2llZWU4MDIxNTQvY2MyNTIwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvaWVlZTgwMjE1NC9jYzI1MjAudHh0CmluZGV4IDAwNzE4ODMuLmZiNmQ0OWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvaWVlZTgwMjE1NC9jYzI1MjAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvaWVlZTgwMjE1NC9jYzI1MjAudHh0CkBAIC0xMywxMSArMTMsMTUgQEAKIAktIGNjYS1ncGlvOgkJR1BJTyBzcGVjIGZvciB0aGUgQ0NBIHBpbgogCS0gdnJlZy1ncGlvOgkJR1BJTyBzcGVjIGZvciB0aGUgVlJFRyBwaW4KIAktIHJlc2V0LWdwaW86CQlHUElPIHNwZWMgZm9yIHRoZSBSRVNFVCBwaW4KK09wdGlvbmFsIHByb3BlcnRpZXM6CisJLSBhbXBsaWZpZWQ6CQlpbmNsdWRlIGlmIHRoZSBDQzI1MjAgaXMgY29ubmVjdGVkIHRvIGEgQ0MyNTkxIGFtcGxpZmllcgorCiBFeGFtcGxlOgogCWNjMjUyMEAwIHsKIAkJY29tcGF0aWJsZSA9ICJ0aSxjYzI1MjAiOwogCQlyZWcgPSA8MD47CiAJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQwMDAwMDA+OworCQlhbXBsaWZpZWQ7CiAJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJCXBpbmN0cmwtMCA9IDwmY2MyNTIwX2NhcGVfcGlucz47CiAJCWZpZm8tZ3BpbyA9IDwmZ3BpbzEgMTggMD47CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2tleXN0b25lLW5ldGNwLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQva2V5c3RvbmUtbmV0Y3AudHh0CmluZGV4IGY5YzA3NzEuLmQwZTZmYTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQva2V5c3RvbmUtbmV0Y3AudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQva2V5c3RvbmUtbmV0Y3AudHh0CkBAIC00OSw2ICs0OSw3IEBACiAtIGNvbXBhdGlibGU6CVNob3VsZCBiZSAidGksbmV0Y3AtMS4wIgogLSBjbG9ja3M6CXBoYW5kbGUgdG8gdGhlIHJlZmVyZW5jZSBjbG9ja3MgZm9yIHRoZSBzdWJzeXN0ZW0uCiAtIGRtYS1pZDoJTmF2aWdhdG9yIHBhY2tldCBkbWEgaW5zdGFuY2UgaWQuCistIHJhbmdlczoJYWRkcmVzcyByYW5nZSBvZiBOZXRDUCAoaW5jbHVkZXMsIEV0aGVybmV0IFNTLCBQQSBhbmQgU0EpCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIHJlZzoJCXJlZ2lzdGVyIGxvY2F0aW9uIGFuZCB0aGUgc2l6ZSBmb3IgdGhlIGZvbGxvd2luZyByZWdpc3RlcgpAQCAtNjQsMTAgKzY1LDMwIEBACiAxR2IvMTBHYiAoZ2JlL3hnYmUpIGV0aGVybmV0IHN3aXRjaCBzdWItbW9kdWxlIHNwZWNpZmljYXRpb25zLgogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gbGFiZWw6CU11c3QgYmUgIm5ldGNwLWdiZSIgZm9yIDFHYiAmICJuZXRjcC14Z2JlIiBmb3IgMTBHYi4KKy0gY29tcGF0aWJsZToJTXVzdCBiZSBvbmUgb2YgYmVsb3c6LQorCQkidGksbmV0Y3AtZ2JlIiBmb3IgMUdiRSBvbiBOZXRDUCAxLjQKKwkJInRpLG5ldGNwLWdiZS01IiBmb3IgMUdiRSBOIE5ldENQIDEuNSAoTj01KQorCQkidGksbmV0Y3AtZ2JlLTkiIGZvciAxR2JFIE4gTmV0Q1AgMS41IChOPTkpCisJCSJ0aSxuZXRjcC1nYmUtMiIgZm9yIDFHYkUgTiBOZXRDUCAxLjUgKE49MikKKwkJInRpLG5ldGNwLXhnYmUiIGZvciAxMCBHYkUKKwogLSByZWc6CQlyZWdpc3RlciBsb2NhdGlvbiBhbmQgdGhlIHNpemUgZm9yIHRoZSBmb2xsb3dpbmcgcmVnaXN0ZXIKIAkJcmVnaW9ucyBpbiB0aGUgc3BlY2lmaWVkIG9yZGVyLgotCQktIHN1YnN5c3RlbSByZWdpc3RlcnMKLQkJLSBzZXJkZXMgcmVnaXN0ZXJzCisJCS0gc3dpdGNoIHN1YnN5c3RlbSByZWdpc3RlcnMKKwkJLSBzZ21paSBwb3J0My80IG1vZHVsZSByZWdpc3RlcnMgKG9ubHkgZm9yIE5ldENQIDEuNCkKKwkJLSBzd2l0Y2ggbW9kdWxlIHJlZ2lzdGVycworCQktIHNlcmRlcyByZWdpc3RlcnMgKG9ubHkgZm9yIDEwRykKKworCQlOZXRDUCAxLjQgZXRoc3MsIGhlcmUgaXMgdGhlIG9yZGVyCisJCQlpbmRleCAjMCAtIHN3aXRjaCBzdWJzeXN0ZW0gcmVnaXN0ZXJzCisJCQlpbmRleCAjMSAtIHNnbWlpIHBvcnQzLzQgbW9kdWxlIHJlZ2lzdGVycworCQkJaW5kZXggIzIgLSBzd2l0Y2ggbW9kdWxlIHJlZ2lzdGVycworCisJCU5ldENQIDEuNSBldGhzcyA5IHBvcnQsIDUgcG9ydCBhbmQgMiBwb3J0CisJCQlpbmRleCAjMCAtIHN3aXRjaCBzdWJzeXN0ZW0gcmVnaXN0ZXJzCisJCQlpbmRleCAjMSAtIHN3aXRjaCBtb2R1bGUgcmVnaXN0ZXJzCisJCQlpbmRleCAjMiAtIHNlcmRlcyByZWdpc3RlcnMKKwogLSB0eC1jaGFubmVsOgl0aGUgbmF2aWdhdG9yIHBhY2tldCBkbWEgY2hhbm5lbCBuYW1lIGZvciB0eC4KIC0gdHgtcXVldWU6CXRoZSBuYXZpZ2F0b3IgcXVldWUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHggZG1hIGNoYW5uZWwuCiAtIGludGVyZmFjZXM6CXNwZWNpZmljYXRpb24gZm9yIGVhY2ggb2YgdGhlIHN3aXRjaCBwb3J0IHRvIGJlIHJlZ2lzdGVyZWQgYXMgYQpAQCAtMTIwLDE0ICsxNDEsMTMgQEAKIAogRXhhbXBsZSBiaW5kaW5nOgogCi1uZXRjcDogbmV0Y3BAMjA5MDAwMCB7CituZXRjcDogbmV0Y3BAMjAwMDAwMCB7CiAJcmVnID0gPDB4MjYyMDExMCAweDg+OwogCXJlZy1uYW1lcyA9ICJlZnVzZSI7CiAJY29tcGF0aWJsZSA9ICJ0aSxuZXRjcC0xLjAiOwogCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCSNzaXplLWNlbGxzID0gPDE+OwotCXJhbmdlczsKLQorCXJhbmdlcyAgPSA8MCAweDIwMDAwMDAgMHhmZmZmZj47CiAJY2xvY2tzID0gPCZwYXBsbGNsaz4sIDwmY2xrY3BnbWFjPiwgPCZjaGlwY2xrMTI+OwogCWRtYS1jb2hlcmVudDsKIAkvKiBiaWctZW5kaWFuOyAqLwpAQCAtMTM3LDkgKzE1Nyw5IEBACiAJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkjc2l6ZS1jZWxscyA9IDwxPjsKIAkJcmFuZ2VzOwotCQlnYmVAMHgyMDkwMDAwIHsKKwkJZ2JlQDkwMDAwIHsKIAkJCWxhYmVsID0gIm5ldGNwLWdiZSI7Ci0JCQlyZWcgPSA8MHgyMDkwMDAwIDB4ZjAwPjsKKwkJCXJlZyA9IDwweDkwMDAwIDB4MzAwPiwgPDB4OTA0MDAgMHg0MDA+LCA8MHg5MDgwMCAweDcwMD47CiAJCQkvKiBlbmFibGUtYWxlOyAqLwogCQkJdHgtcXVldWUgPSA8NjQ4PjsKIAkJCXR4LWNoYW5uZWwgPSA8OD47CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21hY2IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9tYWNiLnR4dAppbmRleCBhYWE2OTY0Li5iYTE5ZDY3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L21hY2IudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbWFjYi50eHQKQEAgLTIsMTAgKzIsMTMgQEAKIAogUmVxdWlyZWQgcHJvcGVydGllczoKIC0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJjZG5zLFs8Y2hpcD4tXXttYWNifGdlbX0iCi0gIFVzZSAiY2RucyxhdDkxc2FtOTI2MC1tYWNiIiBBdG1lbCBhdDkxc2FtOTI2MCBhbmQgYXQ5MXNhbTkyNjMgU29Dcy4KKyAgVXNlICJjZG5zLGF0OTFzYW05MjYwLW1hY2IiIGZvciBBdG1lbCBhdDkxc2FtOSBTb0NzIG9yIHRoZSAxMC8xMDBNYml0IElQCisgIGF2YWlsYWJsZSBvbiBzYW1hNWQzIFNvQ3MuCiAgIFVzZSAiY2RucyxhdDMyYXA3MDAwLW1hY2IiIGZvciBvdGhlciAxMC8xMDAgdXNhZ2Ugb3IgdXNlIHRoZSBnZW5lcmljIGZvcm06ICJjZG5zLG1hY2IiLgogICBVc2UgImNkbnMscGMzMDItZ2VtIiBmb3IgUGljb2NoaXAgcGljb1hjZWxsIHBjMzAyIGFuZCBsYXRlciBkZXZpY2VzIGJhc2VkIG9uCiAgIHRoZSBDYWRlbmNlIEdFTSwgb3IgdGhlIGdlbmVyaWMgZm9ybTogImNkbnMsZ2VtIi4KKyAgVXNlICJjZG5zLHNhbWE1ZDMtZ2VtIiBmb3IgdGhlIEdpZ2FiaXQgSVAgYXZhaWxhYmxlIG9uIEF0bWVsIHNhbWE1ZDMgU29Dcy4KKyAgVXNlICJjZG5zLHNhbWE1ZDQtZ2VtIiBmb3IgdGhlIEdpZ2FiaXQgSVAgYXZhaWxhYmxlIG9uIEF0bWVsIHNhbWE1ZDQgU29Dcy4KIC0gcmVnOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgdGhlIHJlZ2lzdGVyIHNldCBmb3IgdGhlIGRldmljZQogLSBpbnRlcnJ1cHRzOiBTaG91bGQgY29udGFpbiBtYWNiIGludGVycnVwdAogLSBwaHktbW9kZTogU2VlIGV0aGVybmV0LnR4dCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbmZjL254cC1uY2kudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9uZmMvbnhwLW5jaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2Y2Q5YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvbmZjL254cC1uY2kudHh0CkBAIC0wLDAgKzEsMzUgQEAKKyogTlhQIFNlbWljb25kdWN0b3JzIE5YUCBOQ0kgTkZDIENvbnRyb2xsZXJzCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6IFNob3VsZCBiZSAibnhwLG54cC1uY2ktaTJjIi4KKy0gY2xvY2stZnJlcXVlbmN5OiBJwrJDIHdvcmsgZnJlcXVlbmN5LgorLSByZWc6IGFkZHJlc3Mgb24gdGhlIGJ1cworLSBpbnRlcnJ1cHQtcGFyZW50OiBwaGFuZGxlIGZvciB0aGUgaW50ZXJydXB0IGdwaW8gY29udHJvbGxlcgorLSBpbnRlcnJ1cHRzOiBHUElPIGludGVycnVwdCB0byB3aGljaCB0aGUgY2hpcCBpcyBjb25uZWN0ZWQKKy0gZW5hYmxlLWdwaW9zOiBPdXRwdXQgR1BJTyBwaW4gdXNlZCBmb3IgZW5hYmxpbmcvZGlzYWJsaW5nIHRoZSBjaGlwCistIGZpcm13YXJlLWdwaW9zOiBPdXRwdXQgR1BJTyBwaW4gdXNlZCB0byBlbnRlciBmaXJtd2FyZSBkb3dubG9hZCBtb2RlCisKK09wdGlvbmFsIFNvQyBTcGVjaWZpYyBQcm9wZXJ0aWVzOgorLSBwaW5jdHJsLW5hbWVzOiBDb250YWlucyBvbmx5IG9uZSB2YWx1ZSAtICJkZWZhdWx0Ii4KKy0gcGludGN0cmwtMDogU3BlY2lmaWVzIHRoZSBwaW4gY29udHJvbCBncm91cHMgdXNlZCBmb3IgdGhpcyBjb250cm9sbGVyLgorCitFeGFtcGxlIChmb3IgQVJNLWJhc2VkIEJlYWdsZUJvbmUgd2l0aCBOUEMxMDAgTkZDIGNvbnRyb2xsZXIgb24gSTJDMik6CisKKyZpMmMyIHsKKworCXN0YXR1cyA9ICJva2F5IjsKKworCW5wYzEwMDogbnBjMTAwQDI5IHsKKworCQljb21wYXRpYmxlID0gIm54cCxueHAtbmNpLWkyYyI7CisKKwkJcmVnID0gPDB4Mjk+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MTAwMDAwPjsKKworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZncGlvMT47CisJCWludGVycnVwdHMgPSA8MjkgR1BJT19BQ1RJVkVfSElHSD47CisKKwkJZW5hYmxlLWdwaW9zID0gPCZncGlvMCAzMCBHUElPX0FDVElWRV9ISUdIPjsKKwkJZmlybXdhcmUtZ3Bpb3MgPSA8JmdwaW8wIDMxIEdQSU9fQUNUSVZFX0hJR0g+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zdG1tYWMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9zdG1tYWMudHh0CmluZGV4IDhjYTY1Y2UuLjI5YWNhODUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc3RtbWFjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3N0bW1hYy50eHQKQEAgLTM1LDEwICszNSwxMSBAQAogLSByZXNldC1uYW1lczogU2hvdWxkIGNvbnRhaW4gdGhlIHJlc2V0IHNpZ25hbCBuYW1lICJzdG1tYWNldGgiLCBpZiBhCiAJcmVzZXQgcGhhbmRsZSBpcyBnaXZlbgogLSBtYXgtZnJhbWUtc2l6ZTogU2VlIGV0aGVybmV0LnR4dCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeQotLSBjbG9ja3M6IElmIHByZXNlbnQsIHRoZSBmaXJzdCBjbG9jayBzaG91bGQgYmUgdGhlIEdNQUMgbWFpbiBjbG9jaywKLSAgZnVydGhlciBjbG9ja3MgbWF5IGJlIHNwZWNpZmllZCBpbiBkZXJpdmVkIGJpbmRpbmdzLgorLSBjbG9ja3M6IElmIHByZXNlbnQsIHRoZSBmaXJzdCBjbG9jayBzaG91bGQgYmUgdGhlIEdNQUMgbWFpbiBjbG9jayBhbmQKKyAgdGhlIHNlY29uZCBjbG9jayBzaG91bGQgYmUgcGVyaXBoZXJhbCdzIHJlZ2lzdGVyIGludGVyZmFjZSBjbG9jay4gRnVydGhlcgorICBjbG9ja3MgbWF5IGJlIHNwZWNpZmllZCBpbiBkZXJpdmVkIGJpbmRpbmdzLgogLSBjbG9jay1uYW1lczogT25lIG5hbWUgZm9yIGVhY2ggZW50cnkgaW4gdGhlIGNsb2NrcyBwcm9wZXJ0eSwgdGhlCi0gIGZpcnN0IG9uZSBzaG91bGQgYmUgInN0bW1hY2V0aCIuCisgIGZpcnN0IG9uZSBzaG91bGQgYmUgInN0bW1hY2V0aCIgYW5kIHRoZSBzZWNvbmQgb25lIHNob3VsZCBiZSAicGNsayIuCiAtIGNsa19wdHBfcmVmOiB0aGlzIGlzIHRoZSBQVFAgcmVmZXJlbmNlIGNsb2NrOyBpbiBjYXNlIG9mIHRoZSBQVFAgaXMKICAgYXZhaWxhYmxlIHRoaXMgY2xvY2sgaXMgdXNlZCBmb3IgcHJvZ3JhbW1pbmcgdGhlIFRpbWVzdGFtcCBBZGRlbmQgUmVnaXN0ZXIuCiAgIElmIG5vdCBwYXNzZWQgdGhlbiB0aGUgc3lzdGVtIGNsb2NrIHdpbGwgYmUgdXNlZCBhbmQgdGhpcyBpcyBmaW5lIG9uIHNvbWUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvYnJjbSxpcHJvYy1wY2llLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wY2kvYnJjbSxpcHJvYy1wY2llLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2NlNTBlCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BjaS9icmNtLGlwcm9jLXBjaWUudHh0CkBAIC0wLDAgKzEsNjMgQEAKKyogQnJvYWRjb20gaVByb2MgUENJZSBjb250cm9sbGVyIHdpdGggdGhlIHBsYXRmb3JtIGJ1cyBpbnRlcmZhY2UKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogTXVzdCBiZSAiYnJjbSxpcHJvYy1wY2llIgorLSByZWc6IGJhc2UgYWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSBQQ0llIGNvbnRyb2xsZXIgSS9PIHJlZ2lzdGVyIHNwYWNlCistICNpbnRlcnJ1cHQtY2VsbHM6IHNldCB0byA8MT4KKy0gaW50ZXJydXB0LW1hcC1tYXNrIGFuZCBpbnRlcnJ1cHQtbWFwLCBzdGFuZGFyZCBQQ0kgcHJvcGVydGllcyB0byBkZWZpbmUgdGhlCisgIG1hcHBpbmcgb2YgdGhlIFBDSWUgaW50ZXJmYWNlIHRvIGludGVycnVwdCBudW1iZXJzCistIGxpbnV4LHBjaS1kb21haW46IFBDSSBkb21haW4gSUQuIFNob3VsZCBiZSB1bmlxdWUgZm9yIGVhY2ggaG9zdCBjb250cm9sbGVyCistIGJ1cy1yYW5nZTogUENJIGJ1cyBudW1iZXJzIGNvdmVyZWQKKy0gI2FkZHJlc3MtY2VsbHM6IHNldCB0byA8Mz4KKy0gI3NpemUtY2VsbHM6IHNldCB0byA8Mj4KKy0gZGV2aWNlX3R5cGU6IHNldCB0byAicGNpIgorLSByYW5nZXM6IHJhbmdlcyBmb3IgdGhlIFBDSSBtZW1vcnkgYW5kIEkvTyByZWdpb25zCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIHBoeXM6IHBoYW5kbGUgb2YgdGhlIFBDSWUgUEhZIGRldmljZQorLSBwaHktbmFtZXM6IG11c3QgYmUgInBjaWUtcGh5IgorCitFeGFtcGxlOgorCXBjaWUwOiBwY2llQDE4MDEyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJicmNtLGlwcm9jLXBjaWUiOworCQlyZWcgPSA8MHgxODAxMjAwMCAweDEwMDA+OworCisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwwIDAgMCAwPjsKKwkJaW50ZXJydXB0LW1hcCA9IDwwIDAgMCAwICZnaWMgR0lDX1NQSSAxMDAgSVJRX1RZUEVfTk9ORT47CisKKwkJbGludXgscGNpLWRvbWFpbiA9IDwwPjsKKworCQlidXMtcmFuZ2UgPSA8MHgwMCAweGZmPjsKKworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCXJhbmdlcyA9IDwweDgxMDAwMDAwIDAgMAkgIDB4MjgwMDAwMDAgMCAweDAwMDEwMDAwCisJCQkgIDB4ODIwMDAwMDAgMCAweDIwMDAwMDAwIDB4MjAwMDAwMDAgMCAweDA0MDAwMDAwPjsKKworCQlwaHlzID0gPCZwaHkgMCA1PjsKKwkJcGh5LW5hbWVzID0gInBjaWUtcGh5IjsKKwl9OworCisJcGNpZTE6IHBjaWVAMTgwMTMwMDAgeworCQljb21wYXRpYmxlID0gImJyY20saXByb2MtcGNpZSI7CisJCXJlZyA9IDwweDE4MDEzMDAwIDB4MTAwMD47CisKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDAgMCAwIDA+OworCQlpbnRlcnJ1cHQtbWFwID0gPDAgMCAwIDAgJmdpYyBHSUNfU1BJIDEwNiBJUlFfVFlQRV9OT05FPjsKKworCQlsaW51eCxwY2ktZG9tYWluID0gPDE+OworCisJCWJ1cy1yYW5nZSA9IDwweDAwIDB4ZmY+OworCisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJcmFuZ2VzID0gPDB4ODEwMDAwMDAgMCAwCSAgMHg0ODAwMDAwMCAwIDB4MDAwMTAwMDAKKwkJCSAgMHg4MjAwMDAwMCAwIDB4NDAwMDAwMDAgMHg0MDAwMDAwMCAwIDB4MDQwMDAwMDA+OworCisJCXBoeXMgPSA8JnBoeSAxIDY+OworCQlwaHktbmFtZXMgPSAicGNpZS1waHkiOworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L2RtODE2eC1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9kbTgxNngtcGh5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmUzZDExCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9kbTgxNngtcGh5LnR4dApAQCAtMCwwICsxLDI0IEBACitEZXZpY2UgdHJlZSBiaW5kaW5nIGRvY3VtZW50YXRpb24gZm9yIGFtODE2eCBVU0IgUEhZCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBzaG91bGQgYmUgInRpLGRtODE2eC11c2ItcGh5IgorLSByZWcgOiBvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgUEhZIHJlZ2lzdGVyIHNldC4KKy0gcmVnLW5hbWVzIDogbmFtZSBmb3IgdGhlIHBoeSByZWdpc3RlcnMKKy0gY2xvY2tzIDogcGhhbmRsZSB0byB0aGUgY2xvY2sKKy0gY2xvY2stbmFtZXMgOiBuYW1lIG9mIHRoZSBjbG9jaworLSBzeXNjb246IHBoYW5kbGUgZm9yIHRoZSBzeXNjb24gbm9kZSB0byBhY2Nlc3MgbWlzYyByZWdpc3RlcnMKKy0gI3BoeS1jZWxscyA6IGZyb20gdGhlIGdlbmVyaWMgUEhZIGJpbmRpbmdzLCBtdXN0IGJlIDEKKy0gc3lzY29uOiBwaGFuZGxlIGZvciB0aGUgc3lzY29uIG5vZGUgdG8gYWNjZXNzIG1pc2MgcmVnaXN0ZXJzCisKK0V4YW1wbGU6CisKK3VzYl9waHkwOiB1c2ItcGh5QDIwIHsKKwljb21wYXRpYmxlID0gInRpLGRtODE2OC11c2ItcGh5IjsKKwlyZWcgPSA8MHgyMCAweDg+OworCXJlZy1uYW1lcyA9ICJwaHkiOworCWNsb2NrcyA9IDwmbWFpbl9mYXBsbCA2PjsKKwljbG9jay1uYW1lcyA9ICJyZWZjbGsiOworCSNwaHktY2VsbHMgPSA8MD47CisJc3lzY29uID0gPCZzY21fY29uZj47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9waHktbWlwaHkzNjV4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvcGh5LW1pcGh5MzY1eC50eHQKaW5kZXggOTgwMmQ1ZC4uODc3MjkwMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9waHktbWlwaHkzNjV4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3BoeS1taXBoeTM2NXgudHh0CkBAIC0yMCw4ICsyMCw4IEBACiBSZXF1aXJlZCBwcm9wZXJ0aWVzIChwb3J0IChjaGlsZCkgbm9kZSk6CiAtICNwaHktY2VsbHMgCTogU2hvdWxkIGJlIDEgKFNlZSBzZWNvbmQgZXhhbXBsZSkKIAkJICBDZWxsIGFmdGVyIHBvcnQgcGhhbmRsZSBpcyBkZXZpY2UgdHlwZSBmcm9tOgotCQkJLSBNSVBIWV9UWVBFX1NBVEEKLQkJCS0gTUlQSFlfVFlQRV9QQ0kKKwkJCS0gUEhZX1RZUEVfU0FUQQorCQkJLSBQSFlfVFlQRV9QQ0kKIC0gcmVnICAgICAgICAJOiBBZGRyZXNzIGFuZCBsZW5ndGggb2YgcmVnaXN0ZXIgc2V0cyBmb3IgZWFjaCBkZXZpY2UgaW4KIAkJICAicmVnLW5hbWVzIgogLSByZWctbmFtZXMgICAgIDogVGhlIG5hbWVzIG9mIHRoZSByZWdpc3RlciBhZGRyZXNzZXMgY29ycmVzcG9uZGluZyB0byB0aGUKQEAgLTY4LDEwICs2OCwxMCBAQAogCiBFeGFtcGxlOgogCi0jaW5jbHVkZSA8ZHQtYmluZGluZ3MvcGh5L3BoeS1taXBoeTM2NXguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9waHkvcGh5Lmg+CiAKIAlzYXRhMDogc2F0YUBmZTM4MDAwMCB7CiAJCS4uLgotCQlwaHlzCSAgPSA8JnBoeV9wb3J0MCBNSVBIWV9UWVBFX1NBVEE+OworCQlwaHlzCSAgPSA8JnBoeV9wb3J0MCBQSFlfVFlQRV9TQVRBPjsKIAkJLi4uCiAJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waHkvc2Ftc3VuZy1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zYW1zdW5nLXBoeS50eHQKaW5kZXggOTFlMzhjZi4uNjBjNmYyYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zYW1zdW5nLXBoeS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zYW1zdW5nLXBoeS50eHQKQEAgLTEyOCw2ICsxMjgsNyBAQAogLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlIHNldCB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyBzdXBwb3J0ZWQgdmFsdWVzOgogCS0gInNhbXN1bmcsZXh5bm9zNTI1MC11c2JkcmQtcGh5IiAtIGZvciBleHlub3M1MjUwIFNvQywKIAktICJzYW1zdW5nLGV4eW5vczU0MjAtdXNiZHJkLXBoeSIgLSBmb3IgZXh5bm9zNTQyMCBTb0MuCisJLSAic2Ftc3VuZyxleHlub3M1NDMzLXVzYmRyZC1waHkiIC0gZm9yIGV4eW5vczU0MzMgU29DLgogCS0gInNhbXN1bmcsZXh5bm9zNy11c2JkcmQtcGh5IiAtIGZvciBleHlub3M3IFNvQy4KIC0gcmVnIDogUmVnaXN0ZXIgb2Zmc2V0IGFuZCBsZW5ndGggb2YgVVNCIERSRCBQSFkgcmVnaXN0ZXIgc2V0OwogLSBjbG9ja3M6IENsb2NrIElEcyBhcnJheSBhcyByZXF1aXJlZCBieSB0aGUgY29udHJvbGxlcgpAQCAtMTM5LDcgKzE0MCw3IEBACiAJICAgICAgIFBIWSBvcGVyYXRpb25zLCBhc3NvY2lhdGVkIGJ5IHBoeSBuYW1lLiBJdCBpcyB1c2VkIHRvCiAJICAgICAgIGRldGVybWluZSBiaXQgdmFsdWVzIGZvciBjbG9jayBzZXR0aW5ncyByZWdpc3Rlci4KIAkgICAgICAgRm9yIEV4eW5vczU0MjAgdGhpcyBpcyBnaXZlbiBhcyAnc2Nsa191c2JwaHkzMCcgaW4gQ01VLgotCS0gb3B0aW9uYWwgY2xvY2tzOiBFeHlub3M3IFNvQyBoYXMgbm93IGZvbGxvd2luZyBhZGRpdGlvbmFsCisJLSBvcHRpb25hbCBjbG9ja3M6IEV4eW5vczU0MzMgJiBFeHlub3M3IFNvQyBoYXMgbm93IGZvbGxvd2luZyBhZGRpdGlvbmFsCiAJCQkgICBnYXRlIGNsb2NrcyBhdmFpbGFibGU6CiAJCQkgICAtIHBoeV9waXBlOiBmb3IgUElQRTMgcGh5CiAJCQkgICAtIHBoeV91dG1pOiBmb3IgVVRNSSsgcGh5CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGh5L3N1bjlpLXVzYi1waHkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zdW45aS11c2ItcGh5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2NhODVjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BoeS9zdW45aS11c2ItcGh5LnR4dApAQCAtMCwwICsxLDM4IEBACitBbGx3aW5uZXIgc3VuOWkgVVNCIFBIWQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSBvbmUgb2YKKyAgKiBhbGx3aW5uZXIsc3VuOWktYTgwLXVzYi1waHkKKy0gcmVnIDogYSBsaXN0IG9mIG9mZnNldCArIGxlbmd0aCBwYWlycworLSAjcGh5LWNlbGxzIDogZnJvbSB0aGUgZ2VuZXJpYyBwaHkgYmluZGluZ3MsIG11c3QgYmUgMAorLSBwaHlfdHlwZSA6ICJoc2ljIiBmb3IgSFNJQyB1c2FnZTsKKwkgICAgIG90aGVyIHZhbHVlcyBvciBhYnNlbmNlIG9mIHRoaXMgcHJvcGVydHkgaW5kaWNhdGVzIG5vcm1hbCBVU0IKKy0gY2xvY2tzIDogcGhhbmRsZSArIGNsb2NrIHNwZWNpZmllciBmb3IgdGhlIHBoeSBjbG9ja3MKKy0gY2xvY2stbmFtZXMgOiBkZXBlbmRpbmcgb24gdGhlICJwaHlfdHlwZSIgcHJvcGVydHksCisgICogInBoeSIgZm9yIG5vcm1hbCBVU0IKKyAgKiAiaHNpY180ODBNIiwgImhzaWNfMTJNIiBmb3IgSFNJQworLSByZXNldHMgOiBhIGxpc3Qgb2YgcGhhbmRsZSArIHJlc2V0IHNwZWNpZmllciBwYWlycworLSByZXNldC1uYW1lcyA6IGRlcGVuZGluZyBvbiB0aGUgInBoeV90eXBlIiBwcm9wZXJ0eSwKKyAgKiAicGh5IiBmb3Igbm9ybWFsIFVTQgorICAqICJoc2ljIiBmb3IgSFNJQworCitPcHRpb25hbCBQcm9wZXJ0aWVzOgorLSBwaHktc3VwcGx5IDogZnJvbSB0aGUgZ2VuZXJpYyBwaHkgYmluZGluZ3MsIGEgcGhhbmRsZSB0byBhIHJlZ3VsYXRvciB0aGF0CisJICAgICAgIHByb3ZpZGVzIHBvd2VyIHRvIFZCVVMuCisKK0l0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3QgYWxsIGNsb2NrcyBhbmQgcmVzZXRzIGF2YWlsYWJsZS4KK1RoZSBkcml2ZXIgd2lsbCBvbmx5IHVzZSB0aG9zZSBtYXRjaGluZyB0aGUgcGh5X3R5cGUuCisKK0V4YW1wbGU6CisJdXNicGh5MTogcGh5QDAwYTAxODAwIHsKKwkJY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuOWktYTgwLXVzYi1waHkiOworCQlyZWcgPSA8MHgwMGEwMTgwMCAweDQ+OworCQljbG9ja3MgPSA8JnVzYl9waHlfY2xrIDI+LCA8JnVzYl9waHlfY2xrIDEwPiwKKwkJICAgICAgIDwmdXNiX3BoeV9jbGsgMz47CisJCWNsb2NrLW5hbWVzID0gImhzaWNfNDgwTSIsICJoc2ljXzEyTSIsICJwaHkiOworCQlyZXNldHMgPSA8JnVzYl9waHlfY2xrIDE4PiwgPCZ1c2JfcGh5X2NsayAxOT47CisJCXJlc2V0LW5hbWVzID0gImhzaWMiLCAicGh5IjsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJI3BoeS1jZWxscyA9IDwwPjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvYnJjbSxjeWdudXMtZ3Bpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9icmNtLGN5Z251cy1ncGlvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTQwY2E1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvYnJjbSxjeWdudXMtZ3Bpby50eHQKQEAgLTAsMCArMSw5OCBAQAorQnJvYWRjb20gQ3lnbnVzIEdQSU8vUElOQ09ORiBDb250cm9sbGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZToKKyAgICBNdXN0IGJlICJicmNtLGN5Z251cy1jY20tZ3BpbyIsICJicmNtLGN5Z251cy1hc2l1LWdwaW8iLCBvcgorICAgICJicmNtLGN5Z251cy1jcm11LWdwaW8iCisKKy0gcmVnOgorICAgIERlZmluZSB0aGUgYmFzZSBhbmQgcmFuZ2Ugb2YgdGhlIEkvTyBhZGRyZXNzIHNwYWNlIHRoYXQgY29udGFpbnMgdGhlIEN5Z251cworR1BJTy9QSU5DT05GIGNvbnRyb2xsZXIgcmVnaXN0ZXJzCisKKy0gI2dwaW8tY2VsbHM6CisgICAgTXVzdCBiZSB0d28uIFRoZSBmaXJzdCBjZWxsIGlzIHRoZSBHUElPIHBpbiBudW1iZXIgKHdpdGhpbiB0aGUKK2NvbnRyb2xsZXIncyBwaW4gc3BhY2UpIGFuZCB0aGUgc2Vjb25kIGNlbGwgaXMgdXNlZCBmb3IgdGhlIGZvbGxvd2luZzoKKyAgICBiaXRbMF06IHBvbGFyaXR5ICgwIGZvciBhY3RpdmUgaGlnaCBhbmQgMSBmb3IgYWN0aXZlIGxvdykKKworLSBncGlvLWNvbnRyb2xsZXI6CisgICAgU3BlY2lmaWVzIHRoYXQgdGhlIG5vZGUgaXMgYSBHUElPIGNvbnRyb2xsZXIKKworT3B0aW9uYWwgcHJvcGVydGllczoKKworLSBpbnRlcnJ1cHRzOgorICAgIEludGVycnVwdCBJRAorCistIGludGVycnVwdC1jb250cm9sbGVyOgorICAgIFNwZWNpZmllcyB0aGF0IHRoZSBub2RlIGlzIGFuIGludGVycnVwdCBjb250cm9sbGVyCisKKy0gcGlubXV4OgorICAgIFNwZWNpZmllcyB0aGUgcGhhbmRsZSB0byB0aGUgSU9NVVggZGV2aWNlLCB3aGVyZSBwaW5zIGNhbiBiZSBpbmRpdmlkdWFsbHkKK211eGVkIHRvIEdQSU8KKworU3VwcG9ydGVkIGdlbmVyaWMgUElOQ09ORiBwcm9wZXJ0aWVzIGluIGNoaWxkIG5vZGVzOgorCistIHBpbnM6CisgICAgVGhlIGxpc3Qgb2YgcGlucyAod2l0aGluIHRoZSBjb250cm9sbGVyJ3Mgb3duIHBpbiBzcGFjZSkgdGhhdCBwcm9wZXJ0aWVzCitpbiB0aGUgbm9kZSBhcHBseSB0by4gUGluIG5hbWVzIGFyZSAiZ3Bpby08cGluPiIKKworLSBiaWFzLWRpc2FibGU6CisgICAgRGlzYWJsZSBwaW4gYmlhcworCistIGJpYXMtcHVsbC11cDoKKyAgICBFbmFibGUgaW50ZXJuYWwgcHVsbCB1cCByZXNpc3RvcgorCistIGJpYXMtcHVsbC1kb3duOgorICAgIEVuYWJsZSBpbnRlcm5hbCBwdWxsIGRvd24gcmVzaXN0b3IKKworLSBkcml2ZS1zdHJlbmd0aDoKKyAgICBWYWxpZCBkcml2ZSBzdHJlbmd0aCB2YWx1ZXMgaW5jbHVkZSAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiAobUEpCisKK0V4YW1wbGU6CisJZ3Bpb19jY206IGdwaW9AMTgwMGEwMDAgeworCQljb21wYXRpYmxlID0gImJyY20sY3lnbnVzLWNjbS1ncGlvIjsKKwkJcmVnID0gPDB4MTgwMGEwMDAgMHg1MD4sCisJCSAgICAgIDwweDAzMDFkMTY0IDB4MjA+OworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJZ3Bpby1jb250cm9sbGVyOworCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgODQgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWludGVycnVwdC1jb250cm9sbGVyOworCisJCXRvdWNoX3BpbnM6IHRvdWNoX3BpbnMgeworCQkJcHdyOiBwd3IgeworCQkJCXBpbnMgPSAiZ3Bpby0wIjsKKwkJCQlkcml2ZS1zdHJlbmd0aCA9IDwxNj47CisJCQl9OworCisJCQlldmVudDogZXZlbnQgeworCQkJCXBpbnMgPSAiZ3Bpby0xIjsKKwkJCQliaWFzLXB1bGwtdXA7CisJCQl9OworCQl9OworCX07CisKKwlncGlvX2FzaXU6IGdwaW9AMTgwYTUwMDAgeworCQljb21wYXRpYmxlID0gImJyY20sY3lnbnVzLWFzaXUtZ3BpbyI7CisJCXJlZyA9IDwweDE4MGE1MDAwIDB4NjY4PjsKKwkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCWdwaW8tY29udHJvbGxlcjsKKwkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDE3NCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJfTsKKworCS8qCisJICogVG91Y2hzY3JlZW4gdGhhdCB1c2VzIHRoZSBDQ00gR1BJTyAwIGFuZCAxCisJICovCisJdHNjIHsKKwkJLi4uCisJCS4uLgorCQlncGlvLXB3ciA9IDwmZ3Bpb19jY20gMCAwPjsKKwkJZ3Bpby1ldmVudCA9IDwmZ3Bpb19jY20gMSAwPjsKKwl9OworCisJLyogQmx1ZXRvb3RoIHRoYXQgdXNlcyB0aGUgQVNJVSBHUElPIDUsIHdpdGggcG9sYXJpdHkgaW52ZXJ0ZWQgKi8KKwlibHVldG9vdGggeworCQkuLi4KKwkJLi4uCisJCWJjbSxyZmtpbGwtYmFuay1zZWwgPSA8JmdwaW9fYXNpdSA1IDE+CisJfQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvYnJjbSxjeWdudXMtcGlubXV4LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL2JyY20sY3lnbnVzLXBpbm11eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwMGQ1YwotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL2JyY20sY3lnbnVzLXBpbm11eC50eHQKQEAgLTAsMCArMSwxMzIgQEAKK0Jyb2FkY29tIEN5Z251cyBJT01VWCBDb250cm9sbGVyCisKK1RoZSBDeWdudXMgSU9NVVggY29udHJvbGxlciBzdXBwb3J0cyBncm91cCBiYXNlZCBtdXggY29uZmlndXJhdGlvbi4gSW4KK2FkZGl0aW9uLCBjZXJ0YWluIHBpbnMgY2FuIGJlIG11eGVkIHRvIEdQSU8gZnVuY3Rpb24gaW5kaXZpZHVhbGx5LgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCistIGNvbXBhdGlibGU6CisgICAgTXVzdCBiZSAiYnJjbSxjeWdudXMtcGlubXV4IgorCistIHJlZzoKKyAgICBEZWZpbmUgdGhlIGJhc2UgYW5kIHJhbmdlIG9mIHRoZSBJL08gYWRkcmVzcyBzcGFjZSB0aGF0IGNvbnRhaW5zIHRoZSBDeWdudXMKK0lPTVVYIHJlZ2lzdGVycworCitQcm9wZXJ0aWVzIGluIHN1Ym5vZGVzOgorCistIGZ1bmN0aW9uOgorICAgIFRoZSBtdXggZnVuY3Rpb24gdG8gc2VsZWN0CisKKy0gZ3JvdXBzOgorICAgIFRoZSBsaXN0IG9mIGdyb3VwcyB0byBzZWxlY3Qgd2l0aCBhIGdpdmVuIGZ1bmN0aW9uCisKK0ZvciBtb3JlIGRldGFpbHMsIHJlZmVyIHRvCitEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLWJpbmRpbmdzLnR4dAorCitGb3IgZXhhbXBsZToKKworCXBpbm11eDogcGlubXV4QDB4MDMwMWQwYzggeworCQljb21wYXRpYmxlID0gImJyY20sY3lnbnVzLXBpbm11eCI7CisJCXJlZyA9IDwweDAzMDFkMGM4IDB4MWIwPjsKKworCQlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCQlwaW5jdHJsLTAgPSA8JmkyczBfZGVmYXVsdD47CisKKwkJaTJzMF9kZWZhdWx0OiBpMnMwX2RlZmF1bHQgeworCQkJbXV4IHsKKwkJCQlmdW5jdGlvbiA9ICJpMnMwIjsKKwkJCQlncm91cHMgPSAiaTJzMF8wX2dycCIsICJpMnMwXzFfZ3JwIjsKKwkJCX07CisJCX07CisJfTsKKworTGlzdCBvZiBzdXBwb3J0ZWQgZnVuY3Rpb25zIGFuZCBncm91cHMgaW4gQ3lnbnVzOgorCisiaTJzMCI6ICJpMnMwXzBfZ3JwIiwgImkyczBfMV9ncnAiCisKKyJpMnMxIjogImkyczFfMF9ncnAiLCAiaTJzMV8xX2dycCIKKworImkyczIiOiAiaTJzMl8wX2dycCIsICJpMnMyXzFfZ3JwIiwgImkyczJfMl9ncnAiLCAiaTJzMl8zX2dycCIsICJpMnMyXzRfZ3JwIgorCisic3BkaWYiOiAic3BkaWZfZ3JwIgorCisicHdtMCI6ICJwd20wX2dycCIKKworInB3bTEiOiAicHdtMV9ncnAiCisKKyJwd20yIjogInB3bTJfZ3JwIgorCisicHdtMyI6ICJwd20zX2dycCIKKworInB3bTQiOiAicHdtNF9ncnAiCisKKyJwd201IjogInB3bTVfZ3JwIgorCisia2V5IjogImtleTBfZ3JwIiwgImtleTFfZ3JwIiwgImtleTJfZ3JwIiwgImtleTNfZ3JwIiwgImtleTRfZ3JwIiwgImtleTVfZ3JwIiwKKyJrZXk2X2dycCIsICJrZXk3X2dycCIsICJrZXk4X2dycCIsICJrZXk5X2dycCIsICJrZXkxMF9ncnAiLCAia2V5MTFfZ3JwIiwKKyJrZXkxMl9ncnAiLCAia2V5MTNfZ3JwIiwgImtleTE0X2dycCIsICJrZXkxNV9ncnAiCisKKyJhdWRpb19kdGUiOiAiYXVkaW9fZHRlMF9ncnAiLCAiYXVkaW9fZHRlMV9ncnAiLCAiYXVkaW9fZHRlMl9ncnAiLCAiYXVkaW9fZHRlM19ncnAiCisKKyJzbWFydF9jYXJkMCI6ICJzbWFydF9jYXJkMF9ncnAiLCAic21hcnRfY2FyZDBfZmNiX2dycCIKKworInNtYXJ0X2NhcmQxIjogInNtYXJ0X2NhcmQxX2dycCIsICJzbWFydF9jYXJkMV9mY2JfZ3JwIgorCisic3BpMCI6ICJzcGkwX2dycCIKKworInNwaTEiOiAic3BpMV9ncnAiCisKKyJzcGkyIjogInNwaTJfZ3JwIgorCisic3BpMyI6ICJzcGkzX2dycCIKKworInNwaTQiOiAic3BpNF8wX2dycCIsICJzcGk0XzFfZ3JwIgorCisic3BpNSI6ICJzcGk1X2dycCIKKworInN3X2xlZDAiOiAic3dfbGVkMF8wX2dycCIsICJzd19sZWQwXzFfZ3JwIgorCisic3dfbGVkMSI6ICJzd19sZWQxX2dycCIKKworInN3X2xlZDIiOiAic3dfbGVkMl8wX2dycCIsICJzd19sZWQyXzFfZ3JwIgorCisiZDF3IjogImQxd19ncnAiCisKKyJsY2QiOiAibGNkX2dycCIKKworInNyYW0iOiAic3JhbV8wX2dycCIsICJzcmFtXzFfZ3JwIgorCisidWFydDAiOiAidWFydDBfZ3JwIgorCisidWFydDEiOiAidWFydDFfZ3JwIiwgInVhcnQxX2R0ZV9ncnAiCisKKyJ1YXJ0MiI6ICJ1YXJ0Ml9ncnAiCisKKyJ1YXJ0MyI6ICJ1YXJ0M19ncnAiCisKKyJ1YXJ0NCI6ICJ1YXJ0NF9ncnAiCisKKyJxc3BpIjogInFzcGlfMF9ncnAiLCAicXNwaV8xX2dycCIKKworIm5hbmQiOiAibmFuZF9ncnAiCisKKyJzZGlvMCI6ICJzZGlvMF9ncnAiLCAic2RpbzBfY2RfZ3JwIiwgInNkaW8wX21tY19ncnAiCisKKyJzZGlvMSI6ICJzZGlvMV9kYXRhXzBfZ3JwIiwgInNkaW8xX2RhdGFfMV9ncnAiLCAic2RpbzFfY2RfZ3JwIiwKKyJzZGlvMV9sZWRfZ3JwIiwgInNkaW8xX21tY19ncnAiCisKKyJjYW4wIjogImNhbjBfZ3JwIgorCisiY2FuMSI6ICJjYW4xX2dycCIKKworImNhbSI6ICJjYW1fbGVkX2dycCIsICJjYW1fMF9ncnAiLCAiY2FtXzFfZ3JwIgorCisiYnNjMSI6ICJic2MxX2dycCIKKworInBjaWVfY2xrcmVxIjogInBjaWVfY2xrcmVxX2dycCIKKworInVzYjBfb2MiOiAidXNiMF9vY19ncnAiCisKKyJ1c2IxX29jIjogInVzYjFfb2NfZ3JwIgorCisidXNiMl9vYyI6ICJ1c2IyX29jX2dycCIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLTM5eC1waW5jdHJsLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL21hcnZlbGwsYXJtYWRhLTM5eC1waW5jdHJsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjFhOWRjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWFydmVsbCxhcm1hZGEtMzl4LXBpbmN0cmwudHh0CkBAIC0wLDAgKzEsNzggQEAKKyogTWFydmVsbCBBcm1hZGEgMzl4IFNvQyBwaW5jdHJsIGRyaXZlciBmb3IgbXBwCisKK1BsZWFzZSByZWZlciB0byBtYXJ2ZWxsLG12ZWJ1LXBpbmN0cmwudHh0IGluIHRoaXMgZGlyZWN0b3J5IGZvciBjb21tb24gYmluZGluZworcGFydCBhbmQgdXNhZ2UuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGU6ICJtYXJ2ZWxsLDg4ZjY5MjAtcGluY3RybCIsICJtYXJ2ZWxsLDg4ZjY5MjgtcGluY3RybCIKKyAgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpYyB2YXJpYW50IG9mIHRoZSBTb0MgYmVpbmcgdXNlZC4KKy0gcmVnOiByZWdpc3RlciBzcGVjaWZpZXIgb2YgTVBQIHJlZ2lzdGVycworCitBdmFpbGFibGUgbXBwIHBpbnMvZ3JvdXBzIGFuZCBmdW5jdGlvbnM6CitOb3RlOiBicmFja2V0cyAoeCkgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtcHAgbmFtZSBmb3IgbWFydmVsbCxmdW5jdGlvbiBhbmQgZ2l2ZW4KK29ubHkgZm9yIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gaW4gdGhpcyBkb2N1bWVudC4KKworbmFtZSAgICBwaW5zICAgIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK21wcDAJMAlncGlvLCB1YTAocnhkKQorbXBwMQkxCWdwaW8sIHVhMCh0eGQpCittcHAyCTIJZ3BpbywgaTJjMChzY2spCittcHAzCTMJZ3BpbywgaTJjMChzZGEpCittcHA0CTQJZ3BpbywgdWExKHR4ZCksIHVhMChydHMpLCBzbWkobWRjKQorbXBwNQk1CWdwaW8sIHVhMShyeGQpLCB1YTAoY3RzKSwgc21pKG1kaW8pCittcHA2CTYJZ3BpbywgZGV2KGNzMyksIHhzbWkobWRpbykKK21wcDcJNwlncGlvLCBkZXYoYWQ5KSwgeHNtaShtZGMpCittcHA4CTgJZ3BpbywgZGV2KGFkMTApLCBwdHAodHJpZykKK21wcDkJOQlncGlvLCBkZXYoYWQxMSksIHB0cChjbGspCittcHAxMAkxMAlncGlvLCBkZXYoYWQxMiksIHB0cChldmVudCkKK21wcDExCTExCWdwaW8sIGRldihhZDEzKSwgbGVkKGNsaykKK21wcDEyCTEyCWdwaW8sIHBjaWUwKHJzdG91dCksIGRldihhZDE0KSwgbGVkKHN0YikKK21wcDEzCTEzCWdwaW8sIGRldihhZDE1KSwgbGVkKGRhdGEpCittcHAxNAkxNAlncGlvLCBtKHZ0dCksIGRldih3ZW4xKSwgdWExKHR4ZCkKK21wcDE1CTE1CWdwaW8sIHBjaWUwKHJzdG91dCksIHNwaTAobW9zaSksIGkyYzEoc2NrKQorbXBwMTYJMTYJZ3BpbywgbShkZWNjKSwgc3BpMChtaXNvKSwgaTJjMShzZGEpCittcHAxNwkxNwlncGlvLCB1YTEocnhkKSwgc3BpMChzY2spLCBzbWkobWRpbykKK21wcDE4CTE4CWdwaW8sIHVhMSh0eGQpLCBzcGkwKGNzMCksIGkyYzIoc2NrKQorbXBwMTkJMTkJZ3Bpbywgc2F0YTEocHJlc2VudCkgWzFdLCB1YTAoY3RzKSwgdWExKHJ4ZCksIGkyYzIoc2RhKQorbXBwMjAJMjAJZ3Bpbywgc2F0YTAocHJlc2VudCkgWzFdLCB1YTAocnRzKSwgdWExKHR4ZCksIHNtaShtZGMpCittcHAyMQkyMQlncGlvLCBzcGkwKGNzMSksIHNhdGEwKHByZXNlbnQpIFsxXSwgc2QoY21kKSwgZGV2KGJvb3RjcyksIGdlKHJ4ZDApCittcHAyMgkyMglncGlvLCBzcGkwKG1vc2kpLCBkZXYoYWQwKQorbXBwMjMJMjMJZ3Bpbywgc3BpMChzY2spLCBkZXYoYWQyKQorbXBwMjQJMjQJZ3Bpbywgc3BpMChtaXNvKSwgdWEwKGN0cyksIHVhMShyeGQpLCBzZChkNCksIGRldihyZWFkeW4pCittcHAyNQkyNQlncGlvLCBzcGkwKGNzMCksIHVhMChydHMpLCB1YTEodHhkKSwgc2QoZDUpLCBkZXYoY3MwKQorbXBwMjYJMjYJZ3Bpbywgc3BpMChjczIpLCBpMmMxKHNjayksIHNkKGQ2KSwgZGV2KGNzMSkKK21wcDI3CTI3CWdwaW8sIHNwaTAoY3MzKSwgaTJjMShzZGEpLCBzZChkNyksIGRldihjczIpLCBnZSh0eGNsa291dCkKK21wcDI4CTI4CWdwaW8sIHNkKGNsayksIGRldihhZDUpLCBnZSh0eGQwKQorbXBwMjkJMjkJZ3BpbywgZGV2KGFsZTApLCBnZSh0eGQxKQorbXBwMzAJMzAJZ3BpbywgZGV2KG9lbiksIGdlKHR4ZDIpCittcHAzMQkzMQlncGlvLCBkZXYoYWxlMSksIGdlKHR4ZDMpCittcHAzMgkzMglncGlvLCBkZXYod2VuMCksIGdlKHR4Y3RsKQorbXBwMzMJMzMJZ3BpbywgbShkZWNjKSwgZGV2KGFkMykKK21wcDM0CTM0CWdwaW8sIGRldihhZDEpCittcHAzNQkzNQlncGlvLCByZWYoY2xrKSwgZGV2KGExKQorbXBwMzYJMzYJZ3BpbywgZGV2KGEwKQorbXBwMzcJMzcJZ3Bpbywgc2QoZDMpLCBkZXYoYWQ4KSwgZ2UocnhjbGspCittcHAzOAkzOAlncGlvLCByZWYoY2xrKSwgc2QoZDApLCBkZXYoYWQ0KSwgZ2UocnhkMSkKK21wcDM5CTM5CWdwaW8sIGkyYzEoc2NrKSwgdWEwKGN0cyksIHNkKGQxKSwgZGV2KGEyKSwgZ2UocnhkMikKK21wcDQwCTQwCWdwaW8sIGkyYzEoc2RhKSwgdWEwKHJ0cyksIHNkKGQyKSwgZGV2KGFkNiksIGdlKHJ4ZDMpCittcHA0MQk0MQlncGlvLCB1YTEocnhkKSwgdWEwKGN0cyksIHNwaTEoY3MzKSwgZGV2KGJ1cnN0biksIG5kKHJibjApLCBnZShyeGN0bCkKK21wcDQyCTQyCWdwaW8sIHVhMSh0eGQpLCB1YTAocnRzKSwgZGV2KGFkNykKK21wcDQzCTQzCWdwaW8sIHBjaWUwKGNsa3JlcSksIG0odnR0KSwgbShkZWNjKSwgc3BpMShjczIpLCBkZXYoY2xrb3V0KSwgbmQocmJuMSkKK21wcDQ0CTQ0CWdwaW8sIHNhdGEwKHByZXNlbnQpIFsxXSwgc2F0YTEocHJlc2VudCkgWzFdLCBsZWQoY2xrKQorbXBwNDUJNDUJZ3BpbywgcmVmKGNsayksIHBjaWUwKHJzdG91dCksIHVhMShyeGQpCittcHA0Ngk0NglncGlvLCByZWYoY2xrKSwgcGNpZTAocnN0b3V0KSwgdWExKHR4ZCksIGxlZChzdGIpCittcHA0Nwk0NwlncGlvLCBzYXRhMChwcmVzZW50KSBbMV0sIHNhdGExKHByZXNlbnQpIFsxXSwgbGVkKGRhdGEpCittcHA0OAk0OAlncGlvLCBzYXRhMChwcmVzZW50KSBbMV0sIG0odnR0KSwgdGRtKHBjbGspIFsxXSwgYXVkaW8obWNsaykgWzFdLCBzZChkNCksIHBjaWUwKGNsa3JlcSksIHVhMSh0eGQpCittcHA0OQk0OQlncGlvLCB0ZG0oZnN5bmMpIFsxXSwgYXVkaW8obHJjbGspIFsxXSwgc2QoZDUpLCB1YTIocnhkKQorbXBwNTAJNTAJZ3BpbywgcGNpZTAocnN0b3V0KSwgdGRtKGRyeCkgWzFdLCBhdWRpbyhleHRjbGspIFsxXSwgc2QoY21kKSwgdWEyKHJ4ZCkKK21wcDUxCTUxCWdwaW8sIHRkbShkdHgpIFsxXSwgYXVkaW8oc2RvKSBbMV0sIG0oZGVjYyksIHVhMih0eGQpCittcHA1Mgk1MglncGlvLCBwY2llMChyc3RvdXQpLCB0ZG0oaW50bikgWzFdLCBhdWRpbyhzZGkpIFsxXSwgc2QoZDYpLCBpMmMzKHNjaykKK21wcDUzCTUzCWdwaW8sIHNhdGExKHByZXNlbnQpIFsxXSwgc2F0YTAocHJlc2VudCkgWzFdLCB0ZG0ocnN0bikgWzFdLCBhdWRpbyhiY2xrKSBbMV0sIHNkKGQ3KSwgaTJjMyhzZGEpCittcHA1NAk1NAlncGlvLCBzYXRhMChwcmVzZW50KSBbMV0sIHNhdGExKHByZXNlbnQpIFsxXSwgcGNpZTAocnN0b3V0KSwgc2QoZDMpLCB1YTModHhkKQorbXBwNTUJNTUJZ3BpbywgdWExKGN0cyksIHNwaTEoY3MxKSwgc2QoZDApLCB1YTEocnhkKSwgdWEzKHJ4ZCkKK21wcDU2CTU2CWdwaW8sIHVhMShydHMpLCBtKGRlY2MpLCBzcGkxKG1vc2kpLCB1YTEodHhkKQorbXBwNTcJNTcJZ3Bpbywgc3BpMShzY2spLCBzZChjbGspLCB1YTEodHhkKQorbXBwNTgJNTgJZ3BpbywgaTJjMShzY2spLCBwY2llMihjbGtyZXEpLCBzcGkxKG1pc28pLCBzZChkMSksIHVhMShyeGQpCittcHA1OQk1OQlncGlvLCBwY2llMChyc3RvdXQpLCBpMmMxKHNkYSksIHNwaTEoY3MwKSwgc2QoZDIpCisKK1sxXTogb25seSBhdmFpbGFibGUgb24gODhGNjkyOApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbWVzb24scGluY3RybC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tZXNvbixwaW5jdHJsLnR4dAppbmRleCAxN2U3MjQwLi4zZjZhNTI0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tZXNvbixwaW5jdHJsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9tZXNvbixwaW5jdHJsLnR4dApAQCAtMSw3ICsxLDcgQEAKID09IEFtbG9naWMgTWVzb24gcGlubXV4IGNvbnRyb2xsZXIgPT0KIAogUmVxdWlyZWQgcHJvcGVydGllcyBmb3IgdGhlIHJvb3Qgbm9kZToKLSAtIGNvbXBhdGlibGU6ICJhbWxvZ2ljLG1lc29uOC1waW5jdHJsIgorIC0gY29tcGF0aWJsZTogImFtbG9naWMsbWVzb244LXBpbmN0cmwiIG9yICJhbWxvZ2ljLG1lc29uOGItcGluY3RybCIKICAtIHJlZzogYWRkcmVzcyBhbmQgc2l6ZSBvZiByZWdpc3RlcnMgY29udHJvbGxpbmcgaXJxIGZ1bmN0aW9uYWxpdHkKIAogPT09IEdQSU8gc3ViLW5vZGVzID09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbnZpZGlhLHRlZ3JhMjEwLXBpbm11eC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9udmlkaWEsdGVncmEyMTAtcGlubXV4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjJkODJkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvbnZpZGlhLHRlZ3JhMjEwLXBpbm11eC50eHQKQEAgLTAsMCArMSwxNjYgQEAKK05WSURJQSBUZWdyYTIxMCBwaW5tdXggY29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiAibnZpZGlhLHRlZ3JhMjEwLXBpbm11eCIKKy0gcmVnOiBTaG91bGQgY29udGFpbiBhIGxpc3Qgb2YgYmFzZSBhZGRyZXNzIGFuZCBzaXplIHBhaXJzIGZvcjoKKyAgLSBmaXJzdCBlbnRyeTogVGhlIEFQQl9NSVNDX0dQXypfUEFEQ1RSTCByZWdpc3RlcnMgKHBhZCBjb250cm9sKQorICAtIHNlY29uZCBlbnRyeTogVGhlIFBJTk1VWF9BVVhfKiByZWdpc3RlcnMgKHBpbm11eCkKKworUGxlYXNlIHJlZmVyIHRvIHBpbmN0cmwtYmluZGluZ3MudHh0IGluIHRoaXMgZGlyZWN0b3J5IGZvciBkZXRhaWxzIG9mIHRoZQorY29tbW9uIHBpbmN0cmwgYmluZGluZ3MgdXNlZCBieSBjbGllbnQgZGV2aWNlcywgaW5jbHVkaW5nIHRoZSBtZWFuaW5nIG9mIHRoZQorcGhyYXNlICJwaW4gY29uZmlndXJhdGlvbiBub2RlIi4KKworVGVncmEncyBwaW4gY29uZmlndXJhdGlvbiBub2RlcyBhY3QgYXMgYSBjb250YWluZXIgZm9yIGFuIGFyYml0cmFyeSBudW1iZXIgb2YKK3N1Ym5vZGVzLiBFYWNoIG9mIHRoZXNlIHN1Ym5vZGVzIHJlcHJlc2VudHMgc29tZSBkZXNpcmVkIGNvbmZpZ3VyYXRpb24gZm9yIGEKK3BpbiwgYSBncm91cCwgb3IgYSBsaXN0IG9mIHBpbnMgb3IgZ3JvdXBzLiBUaGlzIGNvbmZpZ3VyYXRpb24gY2FuIGluY2x1ZGUgdGhlCittdXggZnVuY3Rpb24gdG8gc2VsZWN0IG9uIHRob3NlIHBpbihzKS9ncm91cChzKSwgYW5kIHZhcmlvdXMgcGluIGNvbmZpZ3VyYXRpb24KK3BhcmFtZXRlcnMsIHN1Y2ggYXMgcHVsbC11cCwgdHJpc3RhdGUsIGRyaXZlIHN0cmVuZ3RoLCBldGMuCisKK1RoZSBuYW1lIG9mIGVhY2ggc3Vibm9kZSBpcyBub3QgaW1wb3J0YW50OyBhbGwgc3Vibm9kZXMgc2hvdWxkIGJlIGVudW1lcmF0ZWQKK2FuZCBwcm9jZXNzZWQgcHVyZWx5IGJhc2VkIG9uIHRoZWlyIGNvbnRlbnQuCisKK0VhY2ggc3Vibm9kZSBvbmx5IGFmZmVjdHMgdGhvc2UgcGFyYW1ldGVycyB0aGF0IGFyZSBleHBsaWNpdGx5IGxpc3RlZC4gSW4KK290aGVyIHdvcmRzLCBhIHN1Ym5vZGUgdGhhdCBsaXN0cyBhIG11eCBmdW5jdGlvbiBidXQgbm8gcGluIGNvbmZpZ3VyYXRpb24KK3BhcmFtZXRlcnMgaW1wbGllcyBubyBpbmZvcm1hdGlvbiBhYm91dCBhbnkgcGluIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KK1NpbWlsYXJseSwgYSBwaW4gc3Vibm9kZSB0aGF0IGRlc2NyaWJlcyBhIHB1bGx1cCBwYXJhbWV0ZXIgaW1wbGllcyBubworaW5mb3JtYXRpb24gYWJvdXQgZS5nLiB0aGUgbXV4IGZ1bmN0aW9uIG9yIHRyaXN0YXRlIHBhcmFtZXRlci4gRm9yIHRoaXMKK3JlYXNvbiwgZXZlbiBzZWVtaW5nbHkgYm9vbGVhbiB2YWx1ZXMgYXJlIGFjdHVhbGx5IHRyaXN0YXRlcyBpbiB0aGlzIGJpbmRpbmc6Cit1bnNwZWNpZmllZCwgb2ZmLCBvciBvbi4gVW5zcGVjaWZpZWQgaXMgcmVwcmVzZW50ZWQgYXMgYW4gYWJzZW50IHByb3BlcnR5LAorYW5kIG9mZi9vbiBhcmUgcmVwcmVzZW50ZWQgYXMgaW50ZWdlciB2YWx1ZXMgMCBhbmQgMS4KKworU2VlIHRoZSBUUk0gdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnRpZXMgYW5kIHZhbHVlcyBhcHBseSB0byBlYWNoIHBpbi9ncm91cC4KK01hY3JvIHZhbHVlcyBmb3IgcHJvcGVydHkgdmFsdWVzIGFyZSBkZWZpbmVkIGluCitpbmNsdWRlL2R0LWJpbmRpbmcvcGluY3RybC9waW5jdHJsLXRlZ3JhLmguCisKK1JlcXVpcmVkIHN1Ym5vZGUtcHJvcGVydGllczoKKy0gbnZpZGlhLHBpbnMgOiBBbiBhcnJheSBvZiBzdHJpbmdzLiBFYWNoIHN0cmluZyBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBpbiBvcgorICAgIGdyb3VwLiBWYWxpZCB2YWx1ZXMgZm9yIHRoZXNlIG5hbWVzIGFyZSBsaXN0ZWQgYmVsb3cuCisKK09wdGlvbmFsIHN1Ym5vZGUtcHJvcGVydGllczoKKy0gbnZpZGlhLGZ1bmN0aW9uOiBBIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiB0byBtdXggdG8gdGhlCisgICAgcGluIG9yIGdyb3VwLgorLSBudmlkaWEscHVsbDogSW50ZWdlciwgcmVwcmVzZW50aW5nIHRoZSBwdWxsLWRvd24vdXAgdG8gYXBwbHkgdG8gdGhlIHBpbi4KKyAgICAwOiBub25lLCAxOiBkb3duLCAyOiB1cC4KKy0gbnZpZGlhLHRyaXN0YXRlOiBJbnRlZ2VyLgorICAgIDA6IGRyaXZlLCAxOiB0cmlzdGF0ZS4KKy0gbnZpZGlhLGVuYWJsZS1pbnB1dDogSW50ZWdlci4gRW5hYmxlIHRoZSBwaW4ncyBpbnB1dCBwYXRoLgorICAgIGVuYWJsZSA6VEVHUkFfUElOX0VOQUJMRTAgYW5kCisgICAgZGlzYWJsZSBvciBvdXRwdXQgb25seTogVEVHUkFfUElOX0RJU0FCTEUuCistIG52aWRpYSxvcGVuLWRyYWluOiBJbnRlZ2VyLgorICAgIGVuYWJsZTogVEVHUkFfUElOX0VOQUJMRS4KKyAgICBkaXNhYmxlOiBURUdSQV9QSU5fRElTQUJMRS4KKy0gbnZpZGlhLGxvY2s6IEludGVnZXIuIExvY2sgdGhlIHBpbiBjb25maWd1cmF0aW9uIGFnYWluc3QgZnVydGhlciBjaGFuZ2VzCisgICAgdW50aWwgcmVzZXQuCisgICAgZW5hYmxlOiBURUdSQV9QSU5fRU5BQkxFLgorICAgIGRpc2FibGU6IFRFR1JBX1BJTl9ESVNBQkxFLgorLSBudmlkaWEsaW8taHY6IEludGVnZXIuIFNlbGVjdCBoaWdoLXZvbHRhZ2UgcmVjZWl2ZXJzLgorICAgIG5vcm1hbDogVEVHUkFfUElOX0RJU0FCTEUKKyAgICBoaWdoOiBURUdSQV9QSU5fRU5BQkxFCistIG52aWRpYSxoaWdoLXNwZWVkLW1vZGU6IEludGVnZXIuIEVuYWJsZSBoaWdoIHNwZWVkIG1vZGUgdGhlIHBpbnMuCisgICAgbm9ybWFsOiBURUdSQV9QSU5fRElTQUJMRQorICAgIGhpZ2g6IFRFR1JBX1BJTl9FTkFCTEUKKy0gbnZpZGlhLHNjaG1pdHQ6IEludGVnZXIuIEVuYWJsZXMgU2NobWl0dCBUcmlnZ2VyIG9uIHRoZSBpbnB1dC4KKyAgICBub3JtYWw6IFRFR1JBX1BJTl9ESVNBQkxFCisgICAgaGlnaDogVEVHUkFfUElOX0VOQUJMRQorLSBudmlkaWEsZHJpdmUtdHlwZTogSW50ZWdlci4gVmFsaWQgcmFuZ2UgMC4uLjMuCistIG52aWRpYSxwdWxsLWRvd24tc3RyZW5ndGg6IEludGVnZXIuIENvbnRyb2xzIGRyaXZlIHN0cmVuZ3RoLiAwIGlzIHdlYWtlc3QuCisgICAgVGhlIHJhbmdlIG9mIHZhbGlkIHZhbHVlcyBkZXBlbmRzIG9uIHRoZSBwaW5ncm91cC4gU2VlICJDQUxfRFJWRE4iIGluIHRoZQorICAgIFRlZ3JhIFRSTS4KKy0gbnZpZGlhLHB1bGwtdXAtc3RyZW5ndGg6IEludGVnZXIuIENvbnRyb2xzIGRyaXZlIHN0cmVuZ3RoLiAwIGlzIHdlYWtlc3QuCisgICAgVGhlIHJhbmdlIG9mIHZhbGlkIHZhbHVlcyBkZXBlbmRzIG9uIHRoZSBwaW5ncm91cC4gU2VlICJDQUxfRFJWVVAiIGluIHRoZQorICAgIFRlZ3JhIFRSTS4KKy0gbnZpZGlhLHNsZXctcmF0ZS1yaXNpbmc6IEludGVnZXIuIENvbnRyb2xzIHJpc2luZyBzaWduYWwgc2xldyByYXRlLiAwIGlzCisgICAgZmFzdGVzdC4gVGhlIHJhbmdlIG9mIHZhbGlkIHZhbHVlcyBkZXBlbmRzIG9uIHRoZSBwaW5ncm91cC4gU2VlCisgICAgIkRSVkROX1NMV1IiIGluIHRoZSBUZWdyYSBUUk0uCistIG52aWRpYSxzbGV3LXJhdGUtZmFsbGluZzogSW50ZWdlci4gQ29udHJvbHMgZmFsbGluZyBzaWduYWwgc2xldyByYXRlLiAwIGlzCisgICAgZmFzdGVzdC4gVGhlIHJhbmdlIG9mIHZhbGlkIHZhbHVlcyBkZXBlbmRzIG9uIHRoZSBwaW5ncm91cC4gU2VlCisgICAgIkRSVlVQX1NMV0YiIGluIHRoZSBUZWdyYSBUUk0uCisKK1ZhbGlkIHZhbHVlcyBmb3IgcGluIGFuZCBncm91cCBuYW1lcyAobnZpZGlhLHBpbikgYXJlOgorCisgIE11eCBncm91cHM6CisKKyAgICBUaGVzZSBjb3JyZXNwb25kIHRvIFRlZ3JhIFBJTk1VWF9BVVhfKiAocGlubXV4KSByZWdpc3RlcnMuIEFueSBwcm9wZXJ0eQorICAgIHRoYXQgZXhpc3RzIGluIHRob3NlIHJlZ2lzdGVycyBtYXkgYmUgc2V0IGZvciB0aGUgZm9sbG93aW5nIHBpbiBuYW1lcy4KKworICAgIEluIFRlZ3JhMjEwLCBtYW55IHBpbnMgYWxzbyBoYXZlIGEgZGVkaWNhdGVkIEFQQl9NSVNDX0dQXypfUEFEQ1RSTAorICAgIHJlZ2lzdGVyLiBXaGVyZSB0aGF0IGlzIHRydWUsIGFuZCBwcm9wZXJ0eSB0aGF0IGV4aXN0cyBpbiB0aGF0IHJlZ2lzdGVyCisgICAgbWF5IGFsc28gYmUgc2V0IG9uIHRoZSBmb2xsb3dpbmcgcGluIG5hbWVzLgorCisgICAgYWxzX3Byb3hfaW50X3B4MywgYXBfcmVhZHlfcHY1LCBhcF93YWtlX2J0X3BoMywgYXBfd2FrZV9uZmNfcGg3LAorICAgIGF1ZF9tY2xrX3BiYjAsIGJhdHRfYmNsLCBidF9yc3RfcGg0LCBidF93YWtlX2FwX3BoNSwgYnV0dG9uX2hvbWVfcHkxLAorICAgIGJ1dHRvbl9wb3dlcl9vbl9weDUsIGJ1dHRvbl9zbGlkZV9zd19weTAsIGJ1dHRvbl92b2xfZG93bl9weDcsCisgICAgYnV0dG9uX3ZvbF91cF9weDYsIGNhbTFfbWNsa19wczAsIGNhbTFfcHdkbl9wczcsIGNhbTFfc3Ryb2JlX3B0MSwKKyAgICBjYW0yX21jbGtfcHMxLCBjYW0yX3B3ZG5fcHQwLCBjYW1fYWZfZW5fcHM1LCBjYW1fZmxhc2hfZW5fcHM2LAorICAgIGNhbV9pMmNfc2NsX3BzMiwgY2FtX2kyY19zZGFfcHMzLCBjYW1fcnN0X3BzNGNhbV9yc3RfcHM0LCBjbGtfMzJrX2luLAorICAgIGNsa18zMmtfb3V0X3B5NSwgY2xrX3JlcSwgY29yZV9wd3JfcmVxLCBjcHVfcHdyX3JlcSwgZGFwMV9kaW5fcGIxLAorICAgIGRhcDFfZG91dF9wYjIsIGRhcDFfZnNfcGIwLCBkYXAxX3NjbGtfcGIzLCBkYXAyX2Rpbl9wYWEyLCBkYXAyX2RvdXRfcGFhMywKKyAgICBkYXAyX2ZzX3BhYTAsIGRhcDJfc2Nsa19wYWExLCBkYXA0X2Rpbl9wajUsIGRhcDRfZG91dF9wajYsIGRhcDRfZnNfcGo0LAorICAgIGRhcDRfc2Nsa19wajcsIGRtaWMxX2Nsa19wZTAsIGRtaWMxX2RhdF9wZTEsIGRtaWMyX2Nsa19wZTIsIGRtaWMyX2RhdF9wZTMsCisgICAgZG1pYzNfY2xrX3BlNCwgZG1pYzNfZGF0X3BlNSwgZHBfaHBkMF9wY2M2LCBkdmZzX2Nsa19wYmIyLCBkdmZzX3B3bV9wYmIxLAorICAgIGdlbjFfaTJjX3NjbF9wajEsIGdlbjFfaTJjX3NkYV9wajAsIGdlbjJfaTJjX3NjbF9wajIsIGdlbjJfaTJjX3NkYV9wajMsCisgICAgZ2VuM19pMmNfc2NsX3BmMCwgZ2VuM19pMmNfc2RhX3BmMSwgZ3Bpb194MV9hdWRfcGJiMywgZ3Bpb194M19hdWRfcGJiNCwKKyAgICBncHNfZW5fcGkyLCBncHNfcnN0X3BpMywgaGRtaV9jZWNfcGNjMCwgaGRtaV9pbnRfZHBfaHBkX3BjYzEsIGp0YWdfcnRjaywKKyAgICBsY2RfYmxfZW5fcHYxLCBsY2RfYmxfcHdtX3B2MCwgbGNkX2dwaW8xX3B2MywgbGNkX2dwaW8yX3B2NCwgbGNkX3JzdF9wdjIsCisgICAgbGNkX3RlX3B5MiwgbW9kZW1fd2FrZV9hcF9weDAsIG1vdGlvbl9pbnRfcHgyLCBuZmNfZW5fcGkwLCBuZmNfaW50X3BpMSwKKyAgICBwYTYsIHBjYzcsIHBlNiwgcGU3LCBwZXhfbDBfY2xrcmVxX25fcGExLCBwZXhfbDBfcnN0X25fcGEwLAorICAgIHBleF9sMV9jbGtyZXFfbl9wYTQsIHBleF9sMV9yc3Rfbl9wYTMsIHBleF93YWtlX25fcGEyLCBwaDYsIHBrMCwgcGsxLCBwazIsCisgICAgcGszLCBwazQsIHBrNSwgcGs2LCBwazcsIHBsMCwgcGwxLCBwd3JfaTJjX3NjbF9weTMsIHB3cl9pMmNfc2RhX3B5NCwKKyAgICBwd3JfaW50X24sIHB6MCwgcHoxLCBwejIsIHB6MywgcHo0LCBwejUsIHFzcGlfY3Nfbl9wZWUxLCBxc3BpX2lvMF9wZWUyLAorICAgIHFzcGlfaW8xX3BlZTMsIHFzcGlfaW8yX3BlZTQsIHFzcGlfaW8zX3BlZTUsIHFzcGlfc2NrX3BlZTAsCisgICAgc2F0YV9sZWRfYWN0aXZlX3BhNSwgc2RtbWMxX2Nsa19wbTAsIHNkbW1jMV9jbWRfcG0xLCBzZG1tYzFfZGF0MF9wbTUsCisgICAgc2RtbWMxX2RhdDFfcG00LCBzZG1tYzFfZGF0Ml9wbTMsIHNkbW1jMV9kYXQzX3BtMiwgc2RtbWMzX2Nsa19wcDAsCisgICAgc2RtbWMzX2NtZF9wcDEsIHNkbW1jM19kYXQwX3BwNSwgc2RtbWMzX2RhdDFfcHA0LCBzZG1tYzNfZGF0Ml9wcDMsCisgICAgc2RtbWMzX2RhdDNfcHAyLCBzaHV0ZG93biwgc3BkaWZfaW5fcGNjMywgc3BkaWZfb3V0X3BjYzIsIHNwaTFfY3MwX3BjMywKKyAgICBzcGkxX2NzMV9wYzQsIHNwaTFfbWlzb19wYzEsIHNwaTFfbW9zaV9wYzAsIHNwaTFfc2NrX3BjMiwgc3BpMl9jczBfcGI3LAorICAgIHNwaTJfY3MxX3BkZDAsIHNwaTJfbWlzb19wYjUsIHNwaTJfbW9zaV9wYjQsIHNwaTJfc2NrX3BiNiwgc3BpNF9jczBfcGM2LAorICAgIHNwaTRfbWlzb19wZDAsIHNwaTRfbW9zaV9wYzcsIHNwaTRfc2NrX3BjNSwgdGVtcF9hbGVydF9weDQsIHRvdWNoX2Nsa19wdjcsCisgICAgdG91Y2hfaW50X3B4MSwgdG91Y2hfcnN0X3B2NiwgdWFydDFfY3RzX3B1MywgdWFydDFfcnRzX3B1MiwgdWFydDFfcnhfcHUxLAorICAgIHVhcnQxX3R4X3B1MCwgdWFydDJfY3RzX3BnMywgdWFydDJfcnRzX3BnMiwgdWFydDJfcnhfcGcxLCB1YXJ0Ml90eF9wZzAsCisgICAgdWFydDNfY3RzX3BkNCwgdWFydDNfcnRzX3BkMywgdWFydDNfcnhfcGQyLCB1YXJ0M190eF9wZDEsIHVhcnQ0X2N0c19waTcsCisgICAgdWFydDRfcnRzX3BpNiwgdWFydDRfcnhfcGk1LCB1YXJ0NF90eF9waTQsIHVzYl92YnVzX2VuMF9wY2M0LAorICAgIHVzYl92YnVzX2VuMV9wY2M1LCB3aWZpX2VuX3BoMCwgd2lmaV9yc3RfcGgxLCB3aWZpX3dha2VfYXBfcGgyCisKKyAgRHJpdmUgZ3JvdXBzOgorCisgICAgVGhlc2UgY29ycmVzcG9uZCB0byB0aGUgVGVncmEgQVBCX01JU0NfR1BfKl9QQURDVFJMIChwYWQgY29udHJvbCkKKyAgICByZWdpc3RlcnMuIE5vdGUgdGhhdCB3aGVyZSBvbmUgb2YgdGhlc2UgcmVnaXN0ZXJzIGNvbnRyb2xzIGEgc2luZ2xlIHBpbgorICAgIGZvciB3aGljaCBhIFBJTk1VWF9BVVhfKiBleGlzdHMsIHNlZSB0aGUgbGlzdCBhYm92ZSBmb3IgdGhlIHBpbiBuYW1lIHRvCisgICAgdXNlIHdoZW4gY29uZmlndXJpbmcgdGhlIHBpbm11eC4KKworICAgIHBhNiwgcGNjNywgcGU2LCBwZTcsIHBoNiwgcGswLCBwazEsIHBrMiwgcGszLCBwazQsIHBrNSwgcGs2LCBwazcsIHBsMCwgcGwxLAorICAgIHB6MCwgcHoxLCBwejIsIHB6MywgcHo0LCBwejUsIHNkbW1jMSwgc2RtbWMyLCBzZG1tYzMsIHNkbW1jNAorCitWYWxpZCB2YWx1ZXMgZm9yIG52aWRpYSxmdW5jdGlvbnMgYXJlOgorCisgICAgYXVkLCBiY2wsIGJsaW5rLCBjY2xhLCBjZWMsIGNsZHZmcywgY2xrLCBjb3JlLCBjcHUsIGRpc3BsYXlhLCBkaXNwbGF5YiwKKyAgICBkbWljMSwgZG1pYzIsIGRtaWMzLCBkcCwgZHR2LCBleHRwZXJpcGgzLCBpMmMxLCBpMmMyLCBpMmMzLCBpMmNwbXUsIGkyY3ZpLAorICAgIGkyczEsIGkyczIsIGkyczMsIGkyczRhLCBpMnM0YiwgaTJzNWEsIGkyczViLCBpcWMwLCBpcWMxLCBqdGFnLCBwZSwgcGUwLAorICAgIHBlMSwgcG1pLCBwd20wLCBwd20xLCBwd20yLCBwd20zLCBxc3BpLCByc3ZkMCwgcnN2ZDEsIHJzdmQyLCByc3ZkMywgc2F0YSwKKyAgICBzZG1tYzEsIHNkbW1jMywgc2h1dGRvd24sIHNvYywgc29yMCwgc29yMSwgc3BkaWYsIHNwaTEsIHNwaTIsIHNwaTMsIHNwaTQsCisgICAgc3lzLCB0b3VjaCwgdWFydCwgdWFydGEsIHVhcnRiLCB1YXJ0YywgdWFydGQsIHVzYiwgdmdwMSwgdmdwMiwgdmdwMywgdmdwNCwKKyAgICB2Z3A1LCB2Z3A2LCB2aW1jbGssIHZpbWNsazIKKworRXhhbXBsZToKKworCXBpbm11eDogcGlubXV4QDcwMDAwODAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMTAtcGlubXV4IjsKKwkJcmVnID0gPDB4MCAweDcwMDAwOGQ0IDB4MCAweDJhOD4sIC8qIFBhZCBjb250cm9sIHJlZ2lzdGVycyAqLworCQkgICAgICA8MHgwIDB4NzAwMDMwMDAgMHgwIDB4MTAwMD47IC8qIE11eCByZWdpc3RlcnMgKi8KKworCQlwaW5jdHJsLW5hbWVzID0gImJvb3QiOworCQlwaW5jdHJsLTAgPSA8JnN0YXRlX2Jvb3Q+OworCisJCXN0YXRlX2Jvb3Q6IHBpbm11eCB7CisJCQlnZW4xX2kyY19zY2xfcGoxIHsKKwkJCQludmlkaWEscGlucyA9ICJnZW4xX2kyY19zY2xfcGoxIiwKKwkJCQludmlkaWEsZnVuY3Rpb24gPSAiaTJjMSI7CisJCQkJbnZpZGlhLHB1bGwgPSA8VEVHUkFfUElOX1BVTExfTk9ORT47CisJCQkJbnZpZGlhLHRyaXN0YXRlID0gPFRFR1JBX1BJTl9ESVNBQkxFPjsKKwkJCQludmlkaWEsZW5hYmxlLWlucHV0ID0gPFRFR1JBX1BJTl9FTkFCTEU+OworCQkJCW52aWRpYSxvcGVuLWRyYWluID0gPFRFR1JBX1BJTl9FTkFCTEU+OworCQkJCW52aWRpYSxpby1odiA9IDxURUdSQV9QSU5fRU5BQkxFPjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLWJpbmRpbmdzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtYmluZGluZ3MudHh0CmluZGV4IDQ3ZDg0YjYuLmI3M2M5NmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtYmluZGluZ3MudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtYmluZGluZ3MudHh0CkBAIC0zOCw3ICszOCw3IEBACiBhc3NpZ25lZCBhIG5hbWUuIFdoZW4gbmFtZXMgYXJlIHVzZWQsIGFub3RoZXIgcHJvcGVydHkgZXhpc3RzIHRvIG1hcCBmcm9tCiB0aG9zZSBuYW1lcyB0byB0aGUgaW50ZWdlciBJRHMuCiAKLUVhY2ggY2xpZW50IGRldmljZSdzIG93biBiaW5kaW5nIGRldGVybWluZXMgdGhlIHNldCBvZiBzdGF0ZXMgdGhlIG11c3QgYmUKK0VhY2ggY2xpZW50IGRldmljZSdzIG93biBiaW5kaW5nIGRldGVybWluZXMgdGhlIHNldCBvZiBzdGF0ZXMgdGhhdCBtdXN0IGJlCiBkZWZpbmVkIGluIGl0cyBkZXZpY2UgdHJlZSBub2RlLCBhbmQgd2hldGhlciB0byBkZWZpbmUgdGhlIHNldCBvZiBzdGF0ZQogSURzIHRoYXQgbXVzdCBiZSBwcm92aWRlZCwgb3Igd2hldGhlciB0byBkZWZpbmUgdGhlIHNldCBvZiBzdGF0ZSBuYW1lcyB0aGF0CiBtdXN0IGJlIHByb3ZpZGVkLgpAQCAtMTMzLDE2ICsxMzMsMjcgQEAKIAogZnVuY3Rpb24JCS0gdGhlIG11eCBmdW5jdGlvbiB0byBzZWxlY3QKIGdyb3VwcwkJCS0gdGhlIGxpc3Qgb2YgZ3JvdXBzIHRvIHNlbGVjdCB3aXRoIHRoaXMgZnVuY3Rpb24KKwkJCSAgKGVpdGhlciB0aGlzIG9yICJwaW5zIiBtdXN0IGJlIHNwZWNpZmllZCkKK3BpbnMJCQktIHRoZSBsaXN0IG9mIHBpbnMgdG8gc2VsZWN0IHdpdGggdGhpcyBmdW5jdGlvbiAoZWl0aGVyCisJCQkgIHRoaXMgb3IgImdyb3VwcyIgbXVzdCBiZSBzcGVjaWZpZWQpCiAKIEV4YW1wbGU6CiAKIHN0YXRlXzBfbm9kZV9hIHsKLQlmdW5jdGlvbiA9ICJ1YXJ0MCI7Ci0JZ3JvdXBzID0gInUwcnh0eCIsICJ1MHJ0c2N0cyI7CisJdWFydDAgeworCQlmdW5jdGlvbiA9ICJ1YXJ0MCI7CisJCWdyb3VwcyA9ICJ1MHJ4dHgiLCAidTBydHNjdHMiOworCX07CiB9Owogc3RhdGVfMV9ub2RlX2EgewotCWZ1bmN0aW9uID0gInNwaTAiOwotCWdyb3VwcyA9ICJzcGkwcGlucyI7CisJc3BpMCB7CisJCWZ1bmN0aW9uID0gInNwaTAiOworCQlncm91cHMgPSAic3BpMHBpbnMiOworCX07Cit9Oworc3RhdGVfMl9ub2RlX2EgeworCWZ1bmN0aW9uID0gImkyYzAiOworCXBpbnMgPSAibWZpbzI5IiwgIm1maW8zMCI7CiB9OwogCiA9PSBHZW5lcmljIHBpbiBjb25maWd1cmF0aW9uIG5vZGUgY29udGVudCA9PQpAQCAtMTg4LDE2ICsxOTksMjIgQEAKIEZvciBleGFtcGxlOgogCiBzdGF0ZV8wX25vZGVfYSB7Ci0JcGlucyA9ICJHUElPMF9BSjUiLCAiR1BJTzJfQUg0IjsgLyogQ1RTK1JYRCAqLwotCWJpYXMtcHVsbC11cDsKKwljdHNfcnhkIHsKKwkJcGlucyA9ICJHUElPMF9BSjUiLCAiR1BJTzJfQUg0IjsgLyogQ1RTK1JYRCAqLworCQliaWFzLXB1bGwtdXA7CisJfTsKIH07CiBzdGF0ZV8xX25vZGVfYSB7Ci0JcGlucyA9ICJHUElPMV9BSjMiLCAiR1BJTzNfQUgzIjsgLyogUlRTK1RYRCAqLwotCW91dHB1dC1oaWdoOworCXJ0c190eGQgeworCQlwaW5zID0gIkdQSU8xX0FKMyIsICJHUElPM19BSDMiOyAvKiBSVFMrVFhEICovCisJCW91dHB1dC1oaWdoOworCX07CiB9Owogc3RhdGVfMl9ub2RlX2EgewotCWdyb3VwID0gImZvby1ncm91cCI7Ci0JYmlhcy1wdWxsLXVwOworCWZvbyB7CisJCWdyb3VwID0gImZvby1ncm91cCI7CisJCWJpYXMtcHVsbC11cDsKKwl9OwogfTsKIAogU29tZSBvZiB0aGUgZ2VuZXJpYyBwcm9wZXJ0aWVzIHRha2UgYXJndW1lbnRzLiBGb3IgdGhvc2UgdGhhdCBkbywgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLW10NjV4eC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9waW5jdHJsLW10NjV4eC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2OGEwZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3BpbmN0cmwtbXQ2NXh4LnR4dApAQCAtMCwwICsxLDE0NSBAQAorKiBNZWRpYXRlayBNVDY1WFggUGluIENvbnRyb2xsZXIKKworVGhlIE1lZGlhdGVrJ3MgUGluIGNvbnRyb2xsZXIgaXMgdXNlZCB0byBjb250cm9sIFNvQyBwaW5zLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiB2YWx1ZSBzaG91bGQgYmUgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcuCisgICAgKGEpICJtZWRpYXRlayxtdDgxMzUtcGluY3RybCIsIGNvbXBhdGlibGUgd2l0aCBtdDgxMzUgcGluY3RybC4KKy0gbWVkaWF0ZWsscGN0bC1yZWdtYXA6IFNob3VsZCBiZSBhIHBoYW5kbGUgb2YgdGhlIHN5c2NmZyBub2RlLgorLSBwaW5zLWFyZS1udW1iZXJlZDogU3BlY2lmeSB0aGUgc3Vibm9kZXMgYXJlIHVzaW5nIG51bWJlcmVkIHBpbm11eCB0bworICBzcGVjaWZ5IHBpbnMuCistIGdwaW8tY29udHJvbGxlciA6IE1hcmtzIHRoZSBkZXZpY2Ugbm9kZSBhcyBhIGdwaW8gY29udHJvbGxlci4KKy0gI2dwaW8tY2VsbHM6IG51bWJlciBvZiBjZWxscyBpbiBHUElPIHNwZWNpZmllci4gU2luY2UgdGhlIGdlbmVyaWMgR1BJTworICBiaW5kaW5nIGlzIHVzZWQsIHRoZSBhbW91bnQgb2YgY2VsbHMgbXVzdCBiZSBzcGVjaWZpZWQgYXMgMi4gU2VlIHRoZSBiZWxvdworICBtZW50aW9uZWQgZ3BpbyBiaW5kaW5nIHJlcHJlc2VudGF0aW9uIGZvciBkZXNjcmlwdGlvbiBvZiBwYXJ0aWN1bGFyIGNlbGxzLgorCisJRWc6IDwmcGlvIDYgMD4KKwk8W3BoYW5kbGUgb2YgdGhlIGdwaW8gY29udHJvbGxlciBub2RlXQorCVtsaW5lIG51bWJlciB3aXRoaW4gdGhlIGdwaW8gY29udHJvbGxlcl0KKwlbZmxhZ3NdPgorCisJVmFsdWVzIGZvciBncGlvIHNwZWNpZmllcjoKKwktIExpbmUgbnVtYmVyOiBpcyBhIHZhbHVlIGJldHdlZW4gMCB0byAyMDIuCisJLSBGbGFnczogIGJpdCBmaWVsZCBvZiBmbGFncywgYXMgZGVmaW5lZCBpbiA8ZHQtYmluZGluZ3MvZ3Bpby9ncGlvLmg+LgorICAgICAgICAgICAgT25seSB0aGUgZm9sbG93aW5nIGZsYWdzIGFyZSBzdXBwb3J0ZWQ6CisgICAgICAgICAgICAwIC0gR1BJT19BQ1RJVkVfSElHSAorICAgICAgICAgICAgMSAtIEdQSU9fQUNUSVZFX0xPVworLSByZWc6IHBoeXNpY2FsbCBhZGRyZXNzIGJhc2UgZm9yIEVJTlQgcmVnaXN0ZXJzCistIGludGVycnVwdC1jb250cm9sbGVyOiBNYXJrcyB0aGUgZGV2aWNlIG5vZGUgYXMgYW4gaW50ZXJydXB0IGNvbnRyb2xsZXIKKy0gI2ludGVycnVwdC1jZWxsczogU2hvdWxkIGJlIHR3by4KKy0gaW50ZXJydXB0cyA6IFRoZSBpbnRlcnJ1cHQgb3V0cHV0cyBmcm9tIHRoZSBjb250cm9sbGVyLgorCitQbGVhc2UgcmVmZXIgdG8gcGluY3RybC1iaW5kaW5ncy50eHQgaW4gdGhpcyBkaXJlY3RvcnkgZm9yIGRldGFpbHMgb2YgdGhlCitjb21tb24gcGluY3RybCBiaW5kaW5ncyB1c2VkIGJ5IGNsaWVudCBkZXZpY2VzLgorCitTdWJub2RlIGZvcm1hdAorQSBwaW5jdHJsIG5vZGUgc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3Qgb25lIHN1Ym5vZGVzIHJlcHJlc2VudGluZyB0aGUKK3BpbmN0cmwgZ3JvdXBzIGF2YWlsYWJsZSBvbiB0aGUgbWFjaGluZS4gRWFjaCBzdWJub2RlIHdpbGwgbGlzdCB0aGUKK3BpbnMgaXQgbmVlZHMsIGFuZCBob3cgdGhleSBzaG91bGQgYmUgY29uZmlndXJlZCwgd2l0aCByZWdhcmQgdG8gbXV4ZXIKK2NvbmZpZ3VyYXRpb24sIHB1bGx1cHMsIGRyaXZlIHN0cmVuZ3RoLCBpbnB1dCBlbmFibGUvZGlzYWJsZSBhbmQgaW5wdXQgc2NobWl0dC4KKworICAgIG5vZGUgeworCXBpbm11eCA9IDxQSU5fTlVNQkVSX1BJTk1VWD47CisJR0VORVJJQ19QSU5DT05GSUc7CisgICAgfTsKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gcGlubXV4OiBpbnRlZ2VyIGFycmF5LCByZXByZXNlbnRzIGdwaW8gcGluIG51bWJlciBhbmQgbXV4IHNldHRpbmcuCisgICAgU3VwcG9ydGVkIHBpbiBudW1iZXIgYW5kIG11eCB2YXJpZXMgZm9yIGRpZmZlcmVudCBTb0NzLCBhbmQgYXJlIGRlZmluZWQKKyAgICBhcyBtYWNyb3MgaW4gYm9vdC9kdHMvPHNvYz4tcGluZnVuYy5oIGRpcmVjdGx5LgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBHRU5FUklDX1BJTkNPTkZJRzogaXMgdGhlIGdlbmVyaWMgcGluY29uZmlnIG9wdGlvbnMgdG8gdXNlLCBiaWFzLWRpc2FibGUsCisgICAgYmlhcy1wdWxsLWRvd24sIGJpYXMtcHVsbC11cCwgaW5wdXQtZW5hYmxlLCBpbnB1dC1kaXNhYmxlLCBvdXRwdXQtbG93LCBvdXRwdXQtaGlnaCwKKyAgICBpbnB1dC1zY2htaXR0LWVuYWJsZSwgaW5wdXQtc2NobWl0dC1kaXNhYmxlIGFuZCBkcml2ZS1zdHJlbmd0aCBhcmUgdmFsaWQuCisKKyAgICBTb21lIHNwZWNpYWwgcGlucyBoYXZlIGV4dHJhIHB1bGwgdXAgc3RyZW5ndGgsIHRoZXJlIGFyZSBSMCBhbmQgUjEgcHVsbC11cAorICAgIHJlc2lzdG9ycyBhdmFpbGFibGUsIGJ1dCBmb3IgdXNlciwgaXQncyBvbmx5IG5lZWQgdG8gc2V0IFIxUjAgYXMgMDAsIDAxLCAxMCBvciAxMS4KKyAgICBTbyB3aGVuIGNvbmZpZyBiaWFzLXB1bGwtdXAsIGl0IHN1cHBvcnQgYXJndW1lbnRzIGZvciB0aG9zZSBzcGVjaWFsIHBpbnMuCisgICAgU29tZSBtYWNyb3MgaGF2ZSBiZWVuIGRlZmluZWQgZm9yIHRoaXMgdXNhZ2UsIHN1Y2ggYXMgTVRLX1BVUERfU0VUX1IxUjBfMDAuCisgICAgU2VlIGR0LWJpbmRpbmdzL3BpbmN0cmwvbXQ2NXh4LmguCisKKyAgICBXaGVuIGNvbmZpZyBkcml2ZS1zdHJlbmd0aCwgaXQgY2FuIHN1cHBvcnQgc29tZSBhcmd1bWVudHMsIHN1Y2ggYXMKKyAgICBNVEtfRFJJVkVfNG1BLCBNVEtfRFJJVkVfNm1BLCBldGMuIFNlZSBkdC1iaW5kaW5ncy9waW5jdHJsL210NjV4eC5oLgorCitFeGFtcGxlczoKKworI2luY2x1ZGUgIm10ODEzNS1waW5mdW5jLmgiCisKKy4uLgoreworCXN5c2NmZ19wY3RsX2E6IHN5c2NmZ19wY3RsX2FAMTAwMDUwMDAgeworCQljb21wYXRpYmxlID0gIm1lZGlhdGVrLG10ODEzNS1wY3RsLWEtc3lzY2ZnIiwgInN5c2NvbiI7CisJCXJlZyA9IDwwIDB4MTAwMDUwMDAgMCAweDEwMDA+OworCX07CisKKwlzeXNjZmdfcGN0bF9iOiBzeXNjZmdfcGN0bF9iQDEwMjBDMDIwIHsKKwkJY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgxMzUtcGN0bC1iLXN5c2NmZyIsICJzeXNjb24iOworCQlyZWcgPSA8MCAweDEwMjBDMDIwIDAgMHgxMDAwPjsKKwl9OworCisJcGluY3RybEAwMWMyMDgwMCB7CisJCWNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTM1LXBpbmN0cmwiOworCQlyZWcgPSA8MCAweDEwMDBCMDAwIDAgMHgxMDAwPjsKKwkJbWVkaWF0ZWsscGN0bC1yZWdtYXAgPSA8JnN5c2NmZ19wY3RsX2EgJnN5c2NmZ19wY3RsX2I+OworCQlwaW5zLWFyZS1udW1iZXJlZDsKKwkJZ3Bpby1jb250cm9sbGVyOworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxMTYgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJPEdJQ19TUEkgMTE3IElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJCTxHSUNfU1BJIDExOCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKworCQlpMmMwX3BpbnNfYTogaTJjMEAwIHsKKwkJCXBpbnMxIHsKKwkJCQlwaW5tdXggPSA8TVQ4MTM1X1BJTl8xMDBfU0RBMF9fRlVOQ19TREEwPiwKKwkJCQkJIDxNVDgxMzVfUElOXzEwMV9TQ0wwX19GVU5DX1NDTDA+OworCQkJCWJpYXMtZGlzYWJsZTsKKwkJCX07CisJCX07CisKKwkJaTJjMV9waW5zX2E6IGkyYzFAMCB7CisJCQlwaW5zIHsKKwkJCQlwaW5tdXggPSA8TVQ4MTM1X1BJTl8xOTVfU0RBMV9fRlVOQ19TREExPiwKKwkJCQkJIDxNVDgxMzVfUElOXzE5Nl9TQ0wxX19GVU5DX1NDTDE+OworCQkJCWJpYXMtcHVsbC11cCA9IDw1NT47CisJCQl9OworCQl9OworCisJCWkyYzJfcGluc19hOiBpMmMyQDAgeworCQkJcGluczEgeworCQkJCXBpbm11eCA9IDxNVDgxMzVfUElOXzE5M19TREEyX19GVU5DX1NEQTI+OworCQkJCWJpYXMtcHVsbC1kb3duOworCQkJfTsKKworCQkJcGluczIgeworCQkJCXBpbm11eCA9IDxNVDgxMzVfUElOXzQ5X1dBVENIRE9HX19GVU5DX0dQSU80OT47CisJCQkJYmlhcy1wdWxsLXVwOworCQkJfTsKKwkJfTsKKworCQlpMmMzX3BpbnNfYTogaTJjM0AwIHsKKwkJCXBpbnMxIHsKKwkJCQlwaW5tdXggPSA8TVQ4MTM1X1BJTl80MF9EQUNfQ0xLX19GVU5DX0dQSU80MD4sCisJCQkJCSA8TVQ4MTM1X1BJTl80MV9EQUNfV1NfX0ZVTkNfR1BJTzQxPjsKKwkJCQliaWFzLXB1bGwtdXAgPSA8NTU+OworCQkJfTsKKworCQkJcGluczIgeworCQkJCXBpbm11eCA9IDxNVDgxMzVfUElOXzM1X1NDTDNfX0ZVTkNfU0NMMz4sCisJCQkJCSA8TVQ4MTM1X1BJTl8zNl9TREEzX19GVU5DX1NEQTM+OworCQkJCW91dHB1dC1sb3c7CisJCQkJYmlhcy1wdWxsLXVwID0gPDU1PjsKKwkJCX07CisKKwkJCXBpbnMzIHsKKwkJCQlwaW5tdXggPSA8TVQ4MTM1X1BJTl81N19KVENLX19GVU5DX0dQSU81Nz4sCisJCQkJCSA8TVQ4MTM1X1BJTl82MF9KVERJX19GVU5DX0pUREk+OworCQkJCWRyaXZlLXN0cmVuZ3RoID0gPDMyPjsKKwkJCX07CisJCX07CisKKwkJLi4uCisJfQorfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1ncGlvLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1ncGlvLnR4dAppbmRleCA3ZWQwODA0Li4xYWU2M2MwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLHBtaWMtZ3Bpby50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLWdwaW8udHh0CkBAIC0xMCw2ICsxMCw3IEBACiAJCSAgICAicWNvbSxwbTgwMTgtZ3BpbyIKIAkJICAgICJxY29tLHBtODAzOC1ncGlvIgogCQkgICAgInFjb20scG04MDU4LWdwaW8iCisJCSAgICAicWNvbSxwbTg5MTYtZ3BpbyIKIAkJICAgICJxY29tLHBtODkxNy1ncGlvIgogCQkgICAgInFjb20scG04OTIxLWdwaW8iCiAJCSAgICAicWNvbSxwbTg5NDEtZ3BpbyIKQEAgLTc0LDYgKzc1LDcgQEAKIAkJICAgIGdwaW8xLWdwaW82IGZvciBwbTgwMTgKIAkJICAgIGdwaW8xLWdwaW8xMiBmb3IgcG04MDM4CiAJCSAgICBncGlvMS1ncGlvNDAgZm9yIHBtODA1OAorCQkgICAgZ3BpbzEtZ3BpbzQgZm9yIHBtODkxNgogCQkgICAgZ3BpbzEtZ3BpbzM4IGZvciBwbTg5MTcKIAkJICAgIGdwaW8xLWdwaW80NCBmb3IgcG04OTIxCiAJCSAgICBncGlvMS1ncGlvMzYgZm9yIHBtODk0MQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLW1wcC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLHBtaWMtbXBwLnR4dAppbmRleCA4NTQ3NzRiLi5lZDE5OTkxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLHBtaWMtbXBwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcGluY3RybC9xY29tLHBtaWMtbXBwLnR4dApAQCAtOCw2ICs4LDcgQEAKIAlWYWx1ZSB0eXBlOiA8c3RyaW5nPgogCURlZmluaXRpb246IFNob3VsZCBjb250YWluIG9uZSBvZjoKIAkJICAgICJxY29tLHBtODg0MS1tcHAiLAorCQkgICAgInFjb20scG04OTE2LW1wcCIsCiAJCSAgICAicWNvbSxwbTg5NDEtbXBwIiwKIAkJICAgICJxY29tLHBtYTgwODQtbXBwIiwKIApAQCAtNjcsNiArNjgsNyBAQAogCURlZmluaXRpb246IExpc3Qgb2YgTVBQIHBpbnMgYWZmZWN0ZWQgYnkgdGhlIHByb3BlcnRpZXMgc3BlY2lmaWVkIGluCiAJCSAgICB0aGlzIHN1Ym5vZGUuICBWYWxpZCBwaW5zIGFyZToKIAkJICAgIG1wcDEtbXBwNCBmb3IgcG04ODQxCisJCSAgICBtcHAxLW1wcDQgZm9yIHBtODkxNgogCQkgICAgbXBwMS1tcHA4IGZvciBwbTg5NDEKIAkJICAgIG1wcDEtbXBwNCBmb3IgcG1hODA4NAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvZGE5MTUwLWNoYXJnZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2RhOTE1MC1jaGFyZ2VyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzkwNjY2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL2RhOTE1MC1jaGFyZ2VyLnR4dApAQCAtMCwwICsxLDI2IEBACitEaWFsb2cgU2VtaWNvbmR1Y3RvciBEQTkxNTAgQ2hhcmdlciBQb3dlciBTdXBwbHkgYmluZGluZ3MKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogImRsZyxkYTkxNTAtY2hhcmdlciIgZm9yIERBOTE1MCBDaGFyZ2VyIFBvd2VyIFN1cHBseQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBpby1jaGFubmVsczogTGlzdCBvZiBwaGFuZGxlIGFuZCBJSU8gc3BlY2lmaWVyIHBhaXJzCistIGlvLWNoYW5uZWwtbmFtZXM6IExpc3Qgb2YgY2hhbm5lbCBuYW1lcyB1c2VkIGJ5IGNoYXJnZXIKKyAgICAgIFsiQ0hBTl9JQlVTIiwgIkNIQU5fVkJVUyIsICJDSEFOX1RKVU5DIiwgIkNIQU5fVkJBVCJdCisgIChTZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lpby9paW8tYmluZGluZ3MudHh0IGZvciBmdXJ0aGVyIGluZm8pCisKKworRXhhbXBsZToKKworCWRhOTE1MC1jaGFyZ2VyIHsKKwkJY29tcGF0aWJsZSA9ICJkbGcsZGE5MTUwLWNoYXJnZXIiOworCisJCWlvLWNoYW5uZWxzID0gPCZncGFkYyAwPiwKKwkJCSAgICAgIDwmZ3BhZGMgMj4sCisJCQkgICAgICA8JmdwYWRjIDg+LAorCQkJICAgICAgPCZncGFkYyA1PjsKKwkJaW8tY2hhbm5lbC1uYW1lcyA9ICJDSEFOX0lCVVMiLAorCQkJCSAgICJDSEFOX1ZCVVMiLAorCQkJCSAgICJDSEFOX1RKVU5DIiwKKwkJCQkgICAiQ0hBTl9WQkFUIjsKKwl9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Jlc2V0L3N5c2Nvbi1wb3dlcm9mZi50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXIvcmVzZXQvc3lzY29uLXBvd2Vyb2ZmLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTI1NDZmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Jlc2V0L3N5c2Nvbi1wb3dlcm9mZi50eHQKQEAgLTAsMCArMSwyMyBAQAorR2VuZXJpYyBTWVNDT04gbWFwcGVkIHJlZ2lzdGVyIHBvd2Vyb2ZmIGRyaXZlcgorCitUaGlzIGlzIGEgZ2VuZXJpYyBwb3dlcm9mZiBkcml2ZXIgdXNpbmcgc3lzY29uIHRvIG1hcCB0aGUgcG93ZXJvZmYgcmVnaXN0ZXIuCitUaGUgcG93ZXJvZmYgaXMgZ2VuZXJhbGx5IHBlcmZvcm1lZCB3aXRoIGEgd3JpdGUgdG8gdGhlIHBvd2Vyb2ZmIHJlZ2lzdGVyCitkZWZpbmVkIGJ5IHRoZSByZWdpc3RlciBtYXAgcG9pbnRlZCBieSBzeXNjb24gcmVmZXJlbmNlIHBsdXMgdGhlIG9mZnNldAord2l0aCB0aGUgbWFzayBkZWZpbmVkIGluIHRoZSBwb3dlcm9mZiBub2RlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlOiBzaG91bGQgY29udGFpbiAic3lzY29uLXBvd2Vyb2ZmIgorLSByZWdtYXA6IHRoaXMgaXMgcGhhbmRsZSB0byB0aGUgcmVnaXN0ZXIgbWFwIG5vZGUKKy0gb2Zmc2V0OiBvZmZzZXQgaW4gdGhlIHJlZ2lzdGVyIG1hcCBmb3IgdGhlIHBvd2Vyb2ZmIHJlZ2lzdGVyIChpbiBieXRlcykKKy0gbWFzazogdGhlIHBvd2Vyb2ZmIHZhbHVlIHdyaXR0ZW4gdG8gdGhlIHBvd2Vyb2ZmIHJlZ2lzdGVyICgzMiBiaXQgYWNjZXNzKQorCitEZWZhdWx0IHdpbGwgYmUgbGl0dGxlIGVuZGlhbiBtb2RlLCAzMiBiaXQgYWNjZXNzIG9ubHkuCisKK0V4YW1wbGVzOgorCisJcG93ZXJvZmYgeworCSAgIGNvbXBhdGlibGUgPSAic3lzY29uLXBvd2Vyb2ZmIjsKKwkgICByZWdtYXAgPSA8JnJlZ21hcG5vZGU+OworCSAgIG9mZnNldCA9IDwweDA+OworCSAgIG1hc2sgPSA8MHg3YT47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvYWN0ODg2NS1yZWd1bGF0b3IudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9hY3Q4ODY1LXJlZ3VsYXRvci50eHQKaW5kZXggZGFkNjM1OC4uZTkxNDg1ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9hY3Q4ODY1LXJlZ3VsYXRvci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3JlZ3VsYXRvci9hY3Q4ODY1LXJlZ3VsYXRvci50eHQKQEAgLTIsMTMgKzIsMzUgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZTogImFjdGl2ZS1zZW1pLGFjdDg4NDYiIG9yICJhY3RpdmUtc2VtaSxhY3Q4ODY1IgorLSBjb21wYXRpYmxlOiAiYWN0aXZlLXNlbWksYWN0ODg0NiIgb3IgImFjdGl2ZS1zZW1pLGFjdDg4NjUiIG9yICJhY3RpdmUtc2VtaSxhY3Q4NjAwIgogLSByZWc6IEkyQyBzbGF2ZSBhZGRyZXNzCiAKIE9wdGlvbmFsIHByb3BlcnRpZXM6CiAtIHN5c3RlbS1wb3dlci1jb250cm9sbGVyOiBUZWxsaW5nIHdoZXRoZXIgb3Igbm90IHRoaXMgcG1pYyBpcyBjb250cm9sbGluZwogICB0aGUgc3lzdGVtIHBvd2VyLiBTZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3Bvd2VyL3Bvd2VyLWNvbnRyb2xsZXIudHh0IC4KIAorT3B0aW9uYWwgaW5wdXQgc3VwcGx5IHByb3BlcnRpZXM6CistIGZvciBhY3Q4NjAwOgorICAtIHZwMS1zdXBwbHk6IFRoZSBpbnB1dCBzdXBwbHkgZm9yIERDRENfUkVHMQorICAtIHZwMi1zdXBwbHk6IFRoZSBpbnB1dCBzdXBwbHkgZm9yIERDRENfUkVHMgorICAtIHZwMy1zdXBwbHk6IFRoZSBpbnB1dCBzdXBwbHkgZm9yIERDRENfUkVHMworICAtIGlubC1zdXBwbHk6IFRoZSBpbnB1dCBzdXBwbHkgZm9yIExET19SRUc1LCBMRE9fUkVHNiwgTERPX1JFRzcgYW5kIExET19SRUc4CisgIFNVRENEQ19SRUc0LCBMRE9fUkVHOSBhbmQgTERPX1JFRzEwIGRvIG5vdCBoYXZlIHNlcGFyYXRlIHN1cHBsaWVzLgorLSBmb3IgYWN0ODg0NjoKKyAgLSB2cDEtc3VwcGx5OiBUaGUgaW5wdXQgc3VwcGx5IGZvciBSRUcxCisgIC0gdnAyLXN1cHBseTogVGhlIGlucHV0IHN1cHBseSBmb3IgUkVHMgorICAtIHZwMy1zdXBwbHk6IFRoZSBpbnB1dCBzdXBwbHkgZm9yIFJFRzMKKyAgLSB2cDQtc3VwcGx5OiBUaGUgaW5wdXQgc3VwcGx5IGZvciBSRUc0CisgIC0gaW5sMS1zdXBwbHk6IFRoZSBpbnB1dCBzdXBwbHkgZm9yIFJFRzUsIFJFRzYgYW5kIFJFRzcKKyAgLSBpbmwyLXN1cHBseTogVGhlIGlucHV0IHN1cHBseSBmb3IgUkVHOCBhbmQgTERPX1JFRzkKKyAgLSBpbmwzLXN1cHBseTogVGhlIGlucHV0IHN1cHBseSBmb3IgUkVHMTAsIFJFRzExIGFuZCBSRUcxMgorLSBmb3IgYWN0ODg2NToKKyAgLSB2cDEtc3VwcGx5OiBUaGUgaW5wdXQgc3VwcGx5IGZvciBEQ0RDX1JFRzEKKyAgLSB2cDItc3VwcGx5OiBUaGUgaW5wdXQgc3VwcGx5IGZvciBEQ0RDX1JFRzIKKyAgLSB2cDMtc3VwcGx5OiBUaGUgaW5wdXQgc3VwcGx5IGZvciBEQ0RDX1JFRzMKKyAgLSBpbmw0NS1zdXBwbHk6IFRoZSBpbnB1dCBzdXBwbHkgZm9yIExET19SRUcxIGFuZCBMRE9fUkVHMgorICAtIGlubDY3LXN1cHBseTogVGhlIGlucHV0IHN1cHBseSBmb3IgTERPX1JFRzMgYW5kIExET19SRUc0CisKIEFueSBzdGFuZGFyZCByZWd1bGF0b3IgcHJvcGVydGllcyBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHNpbmdsZSByZWd1bGF0b3IuCiAKIFRoZSB2YWxpZCBuYW1lcyBmb3IgcmVndWxhdG9ycyBhcmU6CkBAIC0xNiw2ICszOCw5IEBACiAJUkVHMSwgUkVHMiwgUkVHMywgUkVHNCwgUkVHNSwgUkVHNiwgUkVHNywgUkVHOCwgUkVHOSwgUkVHMTAsIFJFRzExLCBSRUcxMgogCS0gZm9yIGFjdDg4NjU6CiAJRENEQ19SRUcxLCBEQ0RDX1JFRzIsIERDRENfUkVHMywgTERPX1JFRzEsIExET19SRUcyLCBMRE9fUkVHMywgTERPX1JFRzQuCisJLSBmb3IgYWN0ODYwMDoKKwlEQ0RDX1JFRzEsIERDRENfUkVHMiwgRENEQ19SRUczLCBTVURDRENfUkVHNCwgTERPX1JFRzUsIExET19SRUc2LCBMRE9fUkVHNywKKwlMRE9fUkVHOCwgTERPX1JFRzksIExET19SRUcxMCwKIAogRXhhbXBsZToKIC0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VjdXJpdHkvdHBtL3N0MzN6cDI0LXNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc2VjdXJpdHkvdHBtL3N0MzN6cDI0LXNwaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU4YjAxNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zZWN1cml0eS90cG0vc3QzM3pwMjQtc3BpLnR4dApAQCAtMCwwICsxLDM0IEBACisqIFNUTWljcm9lbGVjdHJvbmljcyBTQVMuIFNUMzNaUDI0IFRQTSBTb0MKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZTogU2hvdWxkIGJlICJzdCxzdDMzenAyNC1zcGkiLgorLSBzcGktbWF4LWZyZXF1ZW5jeTogTWF4aW11bSBTUEkgZnJlcXVlbmN5ICg8PSAxMDAwMDAwMCkuCisKK09wdGlvbmFsIFNUMzNaUDI0IFByb3BlcnRpZXM6CistIGludGVycnVwdC1wYXJlbnQ6IHBoYW5kbGUgZm9yIHRoZSBpbnRlcnJ1cHQgZ3BpbyBjb250cm9sbGVyCistIGludGVycnVwdHM6IEdQSU8gaW50ZXJydXB0IHRvIHdoaWNoIHRoZSBjaGlwIGlzIGNvbm5lY3RlZAorLSBscGNwZC1ncGlvczogT3V0cHV0IEdQSU8gcGluIHVzZWQgZm9yIFNUMzNaUDI0IHBvd2VyIG1hbmFnZW1lbnQgRDEvRDIgc3RhdGUuCitJZiBzZXQsIHBvd2VyIG11c3QgYmUgcHJlc2VudCB3aGVuIHRoZSBwbGF0Zm9ybSBpcyBnb2luZyBpbnRvIHNsZWVwL2hpYmVybmF0ZSBtb2RlLgorCitPcHRpb25hbCBTb0MgU3BlY2lmaWMgUHJvcGVydGllczoKKy0gcGluY3RybC1uYW1lczogQ29udGFpbnMgb25seSBvbmUgdmFsdWUgLSAiZGVmYXVsdCIuCistIHBpbnRjdHJsLTA6IFNwZWNpZmllcyB0aGUgcGluIGNvbnRyb2wgZ3JvdXBzIHVzZWQgZm9yIHRoaXMgY29udHJvbGxlci4KKworRXhhbXBsZSAoZm9yIEFSTS1iYXNlZCBCZWFnbGVCb2FyZCB4TSB3aXRoIFNUMzNaUDI0IG9uIFNQSTQpOgorCismbWNzcGk0IHsKKworICAgICAgICBzdGF0dXMgPSAib2theSI7CisKKyAgICAgICAgc3QzM3pwMjRAMCB7CisKKyAgICAgICAgICAgICAgICBjb21wYXRpYmxlID0gInN0LHN0MzN6cDI0LXNwaSI7CisKKyAgICAgICAgICAgICAgICBzcGktbWF4LWZyZXF1ZW5jeSA9IDwxMDAwMDAwMD47CisKKyAgICAgICAgICAgICAgICBpbnRlcnJ1cHQtcGFyZW50ID0gPCZncGlvNT47CisgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDw3IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCisgICAgICAgICAgICAgICAgbHBjcGQtZ3Bpb3MgPSA8JmdwaW81IDE1IEdQSU9fQUNUSVZFX0hJR0g+OworICAgICAgICB9OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9pbmdlbmljLGp6NDc0MC1pMnMudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2luZ2VuaWMsano0NzQwLWkycy50eHQKaW5kZXggYjQxNDMzMy4uYjYyM2Q1MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2luZ2VuaWMsano0NzQwLWkycy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL2luZ2VuaWMsano0NzQwLWkycy50eHQKQEAgLTEsNyArMSw3IEBACiBJbmdlbmljIEpaNDc0MCBJMlMgY29udHJvbGxlcgogCiBSZXF1aXJlZCBwcm9wZXJ0aWVzOgotLSBjb21wYXRpYmxlIDogImluZ2VuaWMsano0NzQwLWkycyIKKy0gY29tcGF0aWJsZSA6ICJpbmdlbmljLGp6NDc0MC1pMnMiIG9yICJpbmdlbmljLGp6NDc4MC1pMnMiCiAtIHJlZyA6IEkyUyByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAogLSBjbG9ja3MgOiBBSUMgYW5kIEkyUyBQTEwgY2xvY2sgc3BlY2lmaWVycy4KIC0gY2xvY2stbmFtZXM6ICJhaWMiIGFuZCAiaTJzIgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL21heDk4OTI1LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9tYXg5ODkyNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdiZTYzZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9tYXg5ODkyNS50eHQKQEAgLTAsMCArMSwyMiBAQAorbWF4OTg5MjUgYXVkaW8gQ09ERUMKKworVGhpcyBkZXZpY2Ugc3VwcG9ydHMgSTJDLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorCisgIC0gY29tcGF0aWJsZSA6ICJtYXhpbSxtYXg5ODkyNSIKKworICAtIHZtb24tc2xvdC1ubyA6IHNsb3QgbnVtYmVyIHVzZWQgdG8gc2VuZCB2b2x0YWdlIGluZm9ybWF0aW9uCisKKyAgLSBpbW9uLXNsb3Qtbm8gOiBzbG90IG51bWJlciB1c2VkIHRvIHNlbmQgY3VycmVudCBpbmZvcm1hdGlvbgorCisgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQworCitFeGFtcGxlOgorCitjb2RlYzogbWF4OTg5MjVAMWEgeworCWNvbXBhdGlibGUgPSAibWF4aW0sbWF4OTg5MjUiOworCXZtb24tc2xvdC1ubyA9IDwwPjsKKwlpbW9uLXNsb3Qtbm8gPSA8Mj47CisJcmVnID0gPDB4MWE+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9udmlkaWEsdGVncmEtYXVkaW8tbWF4OTgwOTAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL252aWRpYSx0ZWdyYS1hdWRpby1tYXg5ODA5MC50eHQKaW5kZXggYzk0OWFiYy4uYzM0OTViZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL252aWRpYSx0ZWdyYS1hdWRpby1tYXg5ODA5MC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL252aWRpYSx0ZWdyYS1hdWRpby1tYXg5ODA5MC50eHQKQEAgLTE4LDYgKzE4LDcgQEAKICAgKiBIZWFkcGhvbmVzCiAgICogU3BlYWtlcnMKICAgKiBNaWMgSmFjaworICAqIEludCBNaWMKIAogLSBudmlkaWEsaTJzLWNvbnRyb2xsZXIgOiBUaGUgcGhhbmRsZSBvZiB0aGUgVGVncmEgSTJTIGNvbnRyb2xsZXIgdGhhdCdzCiAgIGNvbm5lY3RlZCB0byB0aGUgQ09ERUMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc291bmQvcWNvbSxscGFzcy1jcHUudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3Fjb20sbHBhc3MtY3B1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDA3MzJkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3Fjb20sbHBhc3MtY3B1LnR4dApAQCAtMCwwICsxLDQzIEBACisqIFF1YWxjb21tIFRlY2hub2xvZ2llcyBMUEFTUyBDUFUgREFJCisKK1RoaXMgbm9kZSBtb2RlbHMgdGhlIFF1YWxjb21tIFRlY2hub2xvZ2llcyBMb3ctUG93ZXIgQXVkaW8gU3ViU3lzdGVtIChMUEFTUykuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZQkJOiAicWNvbSxscGFzcy1jcHUiCistIGNsb2NrcwkJOiBNdXN0IGNvbnRhaW4gYW4gZW50cnkgZm9yIGVhY2ggZW50cnkgaW4gY2xvY2stbmFtZXMuCistIGNsb2NrLW5hbWVzCQk6IEEgbGlzdCB3aGljaCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgorCQkJCSogImFoYml4LWNsayIKKwkJCQkqICJtaTJzLW9zci1jbGsiCisJCQkJKiAibWkycy1iaXQtY2xrIgorLSBpbnRlcnJ1cHRzCQk6IE11c3QgY29udGFpbiBhbiBlbnRyeSBmb3IgZWFjaCBlbnRyeSBpbgorCQkJICBpbnRlcnJ1cHQtbmFtZXMuCistIGludGVycnVwdC1uYW1lcwk6IEEgbGlzdCB3aGljaCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBlbnRyaWVzOgorCQkJCSogImxwYXNzLWlycS1scGFpZiIKKy0gcGluY3RybC1OCQk6IE9uZSBwcm9wZXJ0eSBtdXN0IGV4aXN0IGZvciBlYWNoIGVudHJ5IGluCisJCQkgIHBpbmN0cmwtbmFtZXMuICBTZWUgLi4vcGluY3RybC9waW5jdHJsLWJpbmRpbmdzLnR4dAorCQkJICBmb3IgZGV0YWlscyBvZiB0aGUgcHJvcGVydHkgdmFsdWVzLgorLSBwaW5jdHJsLW5hbWVzCQk6IE11c3QgY29udGFpbiBhICJkZWZhdWx0IiBlbnRyeS4KKy0gcmVnCQkJOiBNdXN0IGNvbnRhaW4gYW4gYWRkcmVzcyBmb3IgZWFjaCBlbnRyeSBpbiByZWctbmFtZXMuCistIHJlZy1uYW1lcwkJOiBBIGxpc3Qgd2hpY2ggbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgZW50cmllczoKKwkJCQkqICJscGFzcy1scGFpZiIKKworT3B0aW9uYWwgcHJvcGVydGllczoKKworLSBxY29tLGFkc3AJCTogUGhhbmRsZSBmb3IgdGhlIGF1ZGlvIERTUCBub2RlCisKK0V4YW1wbGU6CisKK2xwYXNzQDI4MTAwMDAwIHsKKwljb21wYXRpYmxlID0gInFjb20sbHBhc3MtY3B1IjsKKwljbG9ja3MgPSA8JmxjYyBBSEJJWF9DTEs+LCA8JmxjYyBNSTJTX09TUl9DTEs+LCA8JmxjYyBNSTJTX0JJVF9DTEs+OworCWNsb2NrLW5hbWVzID0gImFoYml4LWNsayIsICJtaTJzLW9zci1jbGsiLCAibWkycy1iaXQtY2xrIjsKKwlpbnRlcnJ1cHRzID0gPDAgODUgMT47CisJaW50ZXJydXB0LW5hbWVzID0gImxwYXNzLWlycS1scGFpZiI7CisJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IiwgImlkbGUiOworCXBpbmN0cmwtMCA9IDwmbWkyc19kZWZhdWx0PjsKKwlwaW5jdHJsLTEgPSA8Jm1pMnNfaWRsZT47CisJcmVnID0gPDB4MjgxMDAwMDAgMHgxMDAwMD47CisJcmVnLW5hbWVzID0gImxwYXNzLWxwYWlmIjsKKwlxY29tLGFkc3AgPSA8JmFkc3A+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yZW5lc2FzLHJzbmQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JlbmVzYXMscnNuZC50eHQKaW5kZXggMmRkNjkwYi4uZjMxNmNlMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JlbmVzYXMscnNuZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JlbmVzYXMscnNuZC50eHQKQEAgLTI5LDkgKzI5LDE3IEBACiAtIHNoYXJlZC1waW4JCQk6IGlmIHNoYXJlZCBjbG9jayBwaW4KIC0gcGlvLXRyYW5zZmVyCQkJOiB1c2UgUElPIHRyYW5zZmVyIG1vZGUKIC0gbm8tYnVzaWYJCQk6IEJVU0lGIGlzIG5vdCB1c3NlZCB3aGVuIFttZW0gLT4gU1NJXSB2aWEgRE1BIGNhc2UKKy0gZG1hCQkJCTogU2hvdWxkIGNvbnRhaW4gQXVkaW8gRE1BQyBlbnRyeQorLSBkbWEtbmFtZXMJCQk6IFNTSSAgY2FzZSAicngiICAoPXBsYXliYWNrKSwgInR4IiAgKD1jYXB0dXJlKQorCQkJCSAgU1NJVSBjYXNlICJyeHUiICg9cGxheWJhY2spLCAidHh1IiAoPWNhcHR1cmUpCiAKIFNSQyBzdWJub2RlIHByb3BlcnRpZXM6Ci1ubyBwcm9wZXJ0aWVzIGF0IHRoaXMgcG9pbnQKKy0gZG1hCQkJCTogU2hvdWxkIGNvbnRhaW4gQXVkaW8gRE1BQyBlbnRyeQorLSBkbWEtbmFtZXMJCQk6ICJyeCIgKD1wbGF5YmFjayksICJ0eCIgKD1jYXB0dXJlKQorCitEVkMgc3Vibm9kZSBwcm9wZXJ0aWVzOgorLSBkbWEJCQkJOiBTaG91bGQgY29udGFpbiBBdWRpbyBETUFDIGVudHJ5CistIGRtYS1uYW1lcwkJCTogInR4IiAoPXBsYXliYWNrL2NhcHR1cmUpCiAKIERBSSBzdWJub2RlIHByb3BlcnRpZXM6CiAtIHBsYXliYWNrCQkJOiBsaXN0IG9mIHBsYXliYWNrIG1vZHVsZXMKQEAgLTQ1LDU2ICs1MywxNDUgQEAKIAlyZWcgPQk8MCAweGVjNTAwMDAwIDAgMHgxMDAwPiwgLyogU0NVICovCiAJCTwwIDB4ZWM1YTAwMDAgMCAweDEwMD4sICAvKiBBREcgKi8KIAkJPDAgMHhlYzU0MDAwMCAwIDB4MTAwMD4sIC8qIFNTSVUgKi8KLQkJPDAgMHhlYzU0MTAwMCAwIDB4MTI4MD47IC8qIFNTSSAqLworCQk8MCAweGVjNTQxMDAwIDAgMHgxMjgwPiwgLyogU1NJICovCisJCTwwIDB4ZWM3NDAwMDAgMCAweDIwMD47ICAvKiBBdWRpbyBETUFDIHBlcmkgcGVyaSovCisJcmVnLW5hbWVzID0gInNjdSIsICJhZGciLCAic3NpdSIsICJzc2kiLCAiYXVkbWFwcCI7CisKKwljbG9ja3MgPSA8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NTSV9BTEw+LAorCQk8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NTSTk+LCA8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NTSTg+LAorCQk8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NTSTc+LCA8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NTSTY+LAorCQk8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NTSTU+LCA8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NTSTQ+LAorCQk8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NTSTM+LCA8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NTSTI+LAorCQk8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NTSTE+LCA8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NTSTA+LAorCQk8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NDVV9TUkM5PiwgPCZtc3RwMTBfY2xrcyBSOEE3NzkwX0NMS19TQ1VfU1JDOD4sCisJCTwmbXN0cDEwX2Nsa3MgUjhBNzc5MF9DTEtfU0NVX1NSQzc+LCA8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NDVV9TUkM2PiwKKwkJPCZtc3RwMTBfY2xrcyBSOEE3NzkwX0NMS19TQ1VfU1JDNT4sIDwmbXN0cDEwX2Nsa3MgUjhBNzc5MF9DTEtfU0NVX1NSQzQ+LAorCQk8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NDVV9TUkMzPiwgPCZtc3RwMTBfY2xrcyBSOEE3NzkwX0NMS19TQ1VfU1JDMj4sCisJCTwmbXN0cDEwX2Nsa3MgUjhBNzc5MF9DTEtfU0NVX1NSQzE+LCA8Jm1zdHAxMF9jbGtzIFI4QTc3OTBfQ0xLX1NDVV9TUkMwPiwKKwkJPCZtc3RwMTBfY2xrcyBSOEE3NzkwX0NMS19TQ1VfRFZDMD4sIDwmbXN0cDEwX2Nsa3MgUjhBNzc5MF9DTEtfU0NVX0RWQzE+LAorCQk8JmF1ZGlvX2Nsa19hPiwgPCZhdWRpb19jbGtfYj4sIDwmYXVkaW9fY2xrX2M+LCA8Jm0yX2Nsaz47CisJY2xvY2stbmFtZXMgPSAic3NpLWFsbCIsCisJCQkic3NpLjkiLCAic3NpLjgiLCAic3NpLjciLCAic3NpLjYiLCAic3NpLjUiLAorCQkJInNzaS40IiwgInNzaS4zIiwgInNzaS4yIiwgInNzaS4xIiwgInNzaS4wIiwKKwkJCSJzcmMuOSIsICJzcmMuOCIsICJzcmMuNyIsICJzcmMuNiIsICJzcmMuNSIsCisJCQkic3JjLjQiLCAic3JjLjMiLCAic3JjLjIiLCAic3JjLjEiLCAic3JjLjAiLAorCQkJImR2Yy4wIiwgImR2Yy4xIiwKKwkJCSJjbGtfYSIsICJjbGtfYiIsICJjbGtfYyIsICJjbGtfaSI7CiAKIAlyY2FyX3NvdW5kLGR2YyB7Ci0JCWR2YzA6IGR2Y0AwIHsgfTsKLQkJZHZjMTogZHZjQDEgeyB9OworCQlkdmMwOiBkdmNAMCB7CisJCQlkbWFzID0gPCZhdWRtYTAgMHhiYz47CisJCQlkbWEtbmFtZXMgPSAidHgiOworCQl9OworCQlkdmMxOiBkdmNAMSB7CisJCQlkbWFzID0gPCZhdWRtYTAgMHhiZT47CisJCQlkbWEtbmFtZXMgPSAidHgiOworCQl9OwogCX07CiAKIAlyY2FyX3NvdW5kLHNyYyB7Ci0JCXNyYzA6IHNyY0AwIHsgfTsKLQkJc3JjMTogc3JjQDEgeyB9OwotCQlzcmMyOiBzcmNAMiB7IH07Ci0JCXNyYzM6IHNyY0AzIHsgfTsKLQkJc3JjNDogc3JjQDQgeyB9OwotCQlzcmM1OiBzcmNANSB7IH07Ci0JCXNyYzY6IHNyY0A2IHsgfTsKLQkJc3JjNzogc3JjQDcgeyB9OwotCQlzcmM4OiBzcmNAOCB7IH07Ci0JCXNyYzk6IHNyY0A5IHsgfTsKKwkJc3JjMDogc3JjQDAgeworCQkJaW50ZXJydXB0cyA9IDwwIDM1MiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWRtYXMgPSA8JmF1ZG1hMCAweDg1PiwgPCZhdWRtYTEgMHg5YT47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOworCQl9OworCQlzcmMxOiBzcmNAMSB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzUzIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJZG1hcyA9IDwmYXVkbWEwIDB4ODc+LCA8JmF1ZG1hMSAweDljPjsKKwkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CisJCX07CisJCXNyYzI6IHNyY0AyIHsKKwkJCWludGVycnVwdHMgPSA8MCAzNTQgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHg4OT4sIDwmYXVkbWExIDB4OWU+OworCQkJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKKwkJfTsKKwkJc3JjMzogc3JjQDMgeworCQkJaW50ZXJydXB0cyA9IDwwIDM1NSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWRtYXMgPSA8JmF1ZG1hMCAweDhiPiwgPCZhdWRtYTEgMHhhMD47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOworCQl9OworCQlzcmM0OiBzcmNANCB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzU2IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJZG1hcyA9IDwmYXVkbWEwIDB4OGQ+LCA8JmF1ZG1hMSAweGIwPjsKKwkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CisJCX07CisJCXNyYzU6IHNyY0A1IHsKKwkJCWludGVycnVwdHMgPSA8MCAzNTcgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHg4Zj4sIDwmYXVkbWExIDB4YjI+OworCQkJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKKwkJfTsKKwkJc3JjNjogc3JjQDYgeworCQkJaW50ZXJydXB0cyA9IDwwIDM1OCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWRtYXMgPSA8JmF1ZG1hMCAweDkxPiwgPCZhdWRtYTEgMHhiND47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOworCQl9OworCQlzcmM3OiBzcmNANyB7CisJCQlpbnRlcnJ1cHRzID0gPDAgMzU5IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJZG1hcyA9IDwmYXVkbWEwIDB4OTM+LCA8JmF1ZG1hMSAweGI2PjsKKwkJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CisJCX07CisJCXNyYzg6IHNyY0A4IHsKKwkJCWludGVycnVwdHMgPSA8MCAzNjAgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHg5NT4sIDwmYXVkbWExIDB4Yjg+OworCQkJZG1hLW5hbWVzID0gInJ4IiwgInR4IjsKKwkJfTsKKwkJc3JjOTogc3JjQDkgeworCQkJaW50ZXJydXB0cyA9IDwwIDM2MSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWRtYXMgPSA8JmF1ZG1hMCAweDk3PiwgPCZhdWRtYTEgMHhiYT47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiOworCQl9OwogCX07CiAKIAlyY2FyX3NvdW5kLHNzaSB7CiAJCXNzaTA6IHNzaUAwIHsKIAkJCWludGVycnVwdHMgPSA8MCAzNzAgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHgwMT4sIDwmYXVkbWExIDB4MDI+LCA8JmF1ZG1hMCAweDE1PiwgPCZhdWRtYTEgMHgxNj47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiLCAicnh1IiwgInR4dSI7CiAJCX07CiAJCXNzaTE6IHNzaUAxIHsKIAkJCWludGVycnVwdHMgPSA8MCAzNzEgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHgwMz4sIDwmYXVkbWExIDB4MDQ+LCA8JmF1ZG1hMCAweDQ5PiwgPCZhdWRtYTEgMHg0YT47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiLCAicnh1IiwgInR4dSI7CiAJCX07CiAJCXNzaTI6IHNzaUAyIHsKIAkJCWludGVycnVwdHMgPSA8MCAzNzIgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHgwNT4sIDwmYXVkbWExIDB4MDY+LCA8JmF1ZG1hMCAweDYzPiwgPCZhdWRtYTEgMHg2ND47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiLCAicnh1IiwgInR4dSI7CiAJCX07CiAJCXNzaTM6IHNzaUAzIHsKIAkJCWludGVycnVwdHMgPSA8MCAzNzMgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHgwNz4sIDwmYXVkbWExIDB4MDg+LCA8JmF1ZG1hMCAweDZmPiwgPCZhdWRtYTEgMHg3MD47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiLCAicnh1IiwgInR4dSI7CiAJCX07CiAJCXNzaTQ6IHNzaUA0IHsKIAkJCWludGVycnVwdHMgPSA8MCAzNzQgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHgwOT4sIDwmYXVkbWExIDB4MGE+LCA8JmF1ZG1hMCAweDcxPiwgPCZhdWRtYTEgMHg3Mj47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiLCAicnh1IiwgInR4dSI7CiAJCX07CiAJCXNzaTU6IHNzaUA1IHsKIAkJCWludGVycnVwdHMgPSA8MCAzNzUgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHgwYj4sIDwmYXVkbWExIDB4MGM+LCA8JmF1ZG1hMCAweDczPiwgPCZhdWRtYTEgMHg3ND47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiLCAicnh1IiwgInR4dSI7CiAJCX07CiAJCXNzaTY6IHNzaUA2IHsKIAkJCWludGVycnVwdHMgPSA8MCAzNzYgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHgwZD4sIDwmYXVkbWExIDB4MGU+LCA8JmF1ZG1hMCAweDc1PiwgPCZhdWRtYTEgMHg3Nj47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiLCAicnh1IiwgInR4dSI7CiAJCX07CiAJCXNzaTc6IHNzaUA3IHsKIAkJCWludGVycnVwdHMgPSA8MCAzNzcgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHgwZj4sIDwmYXVkbWExIDB4MTA+LCA8JmF1ZG1hMCAweDc5PiwgPCZhdWRtYTEgMHg3YT47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiLCAicnh1IiwgInR4dSI7CiAJCX07CiAJCXNzaTg6IHNzaUA4IHsKIAkJCWludGVycnVwdHMgPSA8MCAzNzggSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHgxMT4sIDwmYXVkbWExIDB4MTI+LCA8JmF1ZG1hMCAweDdiPiwgPCZhdWRtYTEgMHg3Yz47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiLCAicnh1IiwgInR4dSI7CiAJCX07CiAJCXNzaTk6IHNzaUA5IHsKIAkJCWludGVycnVwdHMgPSA8MCAzNzkgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlkbWFzID0gPCZhdWRtYTAgMHgxMz4sIDwmYXVkbWExIDB4MTQ+LCA8JmF1ZG1hMCAweDdkPiwgPCZhdWRtYTEgMHg3ZT47CisJCQlkbWEtbmFtZXMgPSAicngiLCAidHgiLCAicnh1IiwgInR4dSI7CiAJCX07CiAJfTsKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3JlbmVzYXMscnNyYy1jYXJkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yZW5lc2FzLHJzcmMtY2FyZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY0MTU1MAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9yZW5lc2FzLHJzcmMtY2FyZC50eHQKQEAgLTAsMCArMSw2NyBAQAorUmVuZXNhcyBTYW1wbGluZyBSYXRlIENvbnZlcnQgU291bmQgQ2FyZDoKKworUmVuZXNhcyBTYW1wbGluZyBSYXRlIENvbnZlcnQgU291bmQgQ2FyZCBzcGVjaWZpZXMgYXVkaW8gREFJIGNvbm5lY3Rpb25zIG9mIFNvQyA8LT4gY29kZWMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZQkJCQk6ICJyZW5lc2FzLHJzcmMtY2FyZCw8Ym9hcmQ+IgorCQkJCQkgIEV4YW1wbGVzIHdpdGggc29jdHlwZXMgYXJlOgorCQkJCQkgICAgLSAicmVuZXNhcyxyc3JjLWNhcmQsbGFnZXIiCisJCQkJCSAgICAtICJyZW5lc2FzLHJzcmMtY2FyZCxrb2Vsc2NoIgorT3B0aW9uYWwgcHJvcGVydGllczoKKworLSBjYXJkX25hbWUJCQkJOiBVc2VyIHNwZWNpZmllZCBhdWRpbyBzb3VuZCBjYXJkIG5hbWUsIG9uZSBzdHJpbmcKKwkJCQkJICBwcm9wZXJ0eS4KKy0gY3B1CQkJCQk6IENQVSAgIHN1Yi1ub2RlCistIGNvZGVjCQkJCQk6IENPREVDIHN1Yi1ub2RlCisKK09wdGlvbmFsIHN1Ym5vZGUgcHJvcGVydGllczoKKworLSBmb3JtYXQJCQkJOiBDUFUvQ09ERUMgY29tbW9uIGF1ZGlvIGZvcm1hdC4KKwkJCQkJICAiaTJzIiwgInJpZ2h0X2oiLCAibGVmdF9qIiAsICJkc3BfYSIKKwkJCQkJICAiZHNwX2IiLCAiYWM5NyIsICJwZG0iLCAibXNiIiwgImxzYiIKKy0gZnJhbWUtbWFzdGVyCQkJCTogSW5kaWNhdGVzIGRhaS1saW5rIGZyYW1lIG1hc3Rlci4KKwkJCQkJICBwaGFuZGxlIHRvIGEgY3B1IG9yIGNvZGVjIHN1Ym5vZGUuCistIGJpdGNsb2NrLW1hc3RlcgkJCTogSW5kaWNhdGVzIGRhaS1saW5rIGJpdCBjbG9jayBtYXN0ZXIuCisJCQkJCSAgcGhhbmRsZSB0byBhIGNwdSBvciBjb2RlYyBzdWJub2RlLgorLSBiaXRjbG9jay1pbnZlcnNpb24JCQk6IGJvb2wgcHJvcGVydHkuIEFkZCB0aGlzIGlmIHRoZQorCQkJCQkgIGRhaS1saW5rIHVzZXMgYml0IGNsb2NrIGludmVyc2lvbi4KKy0gZnJhbWUtaW52ZXJzaW9uCQkJOiBib29sIHByb3BlcnR5LiBBZGQgdGhpcyBpZiB0aGUKKwkJCQkJICBkYWktbGluayB1c2VzIGZyYW1lIGNsb2NrIGludmVyc2lvbi4KKy0gY29udmVydC1yYXRlCQkJCTogcGxhdGZvcm0gc3BlY2lmaWVkIHNhbXBsaW5nIHJhdGUgY29udmVydAorCitSZXF1aXJlZCBDUFUvQ09ERUMgc3Vibm9kZXMgcHJvcGVydGllczoKKworLSBzb3VuZC1kYWkJCQkJOiBwaGFuZGxlIGFuZCBwb3J0IG9mIENQVS9DT0RFQworCitPcHRpb25hbCBDUFUvQ09ERUMgc3Vibm9kZXMgcHJvcGVydGllczoKKworLSBjbG9ja3MgLyBzeXN0ZW0tY2xvY2stZnJlcXVlbmN5CTogc3BlY2lmeSBzdWJub2RlJ3MgY2xvY2sgaWYgbmVlZGVkLgorCQkJCQkgIGl0IGNhbiBiZSBzcGVjaWZpZWQgdmlhICJjbG9ja3MiIGlmIHN5c3RlbSBoYXMKKwkJCQkJICBjbG9jayBub2RlICg9IGNvbW1vbiBjbG9jayksIG9yICJzeXN0ZW0tY2xvY2stZnJlcXVlbmN5IgorCQkJCQkgIChpZiBzeXN0ZW0gZG9lbnMndCBzdXBwb3J0IGNvbW1vbiBjbG9jaykKKwkJCQkJICBJZiBhIGNsb2NrIGlzIHNwZWNpZmllZCwgaXQgaXMKKwkJCQkJICBlbmFibGVkIHdpdGggY2xrX3ByZXBhcmVfZW5hYmxlKCkKKwkJCQkJICBpbiBkYWkgc3RhcnR1cCgpIGFuZCBkaXNhYmxlZCB3aXRoCisJCQkJCSAgY2xrX2Rpc2FibGVfdW5wcmVwYXJlKCkgaW4gZGFpCisJCQkJCSAgc2h1dGRvd24oKS4KKworRXhhbXBsZQorCitzb3VuZCB7CisJY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJzcmMtY2FyZCxsYWdlciI7CisKKwljYXJkLW5hbWUgPSAicnNuZC1hazQ2NDMiOworCWZvcm1hdCA9ICJsZWZ0X2oiOworCWJpdGNsb2NrLW1hc3RlciA9IDwmc25kY29kZWM+OworCWZyYW1lLW1hc3RlciA9IDwmc25kY29kZWM+OworCisJc25kY3B1OiBjcHUgeworCQlzb3VuZC1kYWkgPSA8JnJjYXJfc291bmQ+OworCX07CisKKwlzbmRjb2RlYzogY29kZWMgeworCQlzb3VuZC1kYWkgPSA8JmFrNDY0Mz47CisJCXN5c3RlbS1jbG9jay1mcmVxdWVuY3kgPSA8MTEyODk2MDA+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3N0b3JtLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zdG9ybS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyYTRjMQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC9zdG9ybS50eHQKQEAgLTAsMCArMSwyMyBAQAorKiBTb3VuZCBjb21wbGV4IGZvciBTdG9ybSBib2FyZHMKKworTW9kZWxzIGEgc291bmRjYXJkIGZvciBTdG9ybSBib2FyZHMgd2l0aCB0aGUgUXVhbGNvbW0gVGVjaG5vbG9naWVzIElQUTgwNnggU09DCitjb25uZWN0ZWQgdG8gYSBNQVg5ODM1N0EgREFDIHZpYSBJMlMuCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CisKKy0gY29tcGF0aWJsZQk6ICJnb29nbGUsc3Rvcm0tYXVkaW8iCistIGNwdQkJOiBQaGFuZGxlIG9mIHRoZSBDUFUgREFJCistIGNvZGVjCQk6IFBoYW5kbGUgb2YgdGhlIGNvZGVjIERBSQorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCistIHFjb20sbW9kZWwJOiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhpcyBzb3VuZCBjYXJkLgorCitFeGFtcGxlOgorCitzb3VuZCB7CisJY29tcGF0aWJsZSA9ICJnb29nbGUsc3Rvcm0tYXVkaW8iOworCXFjb20sbW9kZWwgPSAiaXBxODA2eC1zdG9ybSI7CisJY3B1ID0gPCZscGFzc19jcHU+OworCWNvZGVjID0gPCZtYXg5ODM1N2E+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zb3VuZC93bTg4MDQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODgwNC50eHQKaW5kZXggNGQzYTU2Zi4uNmZkMTI0YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODgwNC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NvdW5kL3dtODgwNC50eHQKQEAgLTEwLDYgKzEwLDEzIEBACiAgIC0gcmVnIDogdGhlIEkyQyBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgZm9yIEkyQywgdGhlIGNoaXAgc2VsZWN0CiAgICAgICAgICAgbnVtYmVyIGZvciBTUEkuCiAKKyAgLSBQVkRELXN1cHBseSwgRFZERC1zdXBwbHkgOiBQb3dlciBzdXBwbGllcyBmb3IgdGhlIGRldmljZSwgYXMgY292ZXJlZAorICAgIGluIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9yZWd1bGF0b3IvcmVndWxhdG9yLnR4dAorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorCisgIC0gd2xmLHJlc2V0LWdwaW86IEEgR1BJTyBzcGVjaWZpZXIgZm9yIHRoZSBHUElPIGNvbnRyb2xsaW5nIHRoZSByZXNldCBwaW4KKwogRXhhbXBsZToKIAogY29kZWM6IHdtODgwNEAxYSB7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL2ZzbC1pbXgtY3NwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL2ZzbC1pbXgtY3NwaS50eHQKaW5kZXggYWFkNTI3Yi4uNTIzMzQxYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9mc2wtaW14LWNzcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvZnNsLWlteC1jc3BpLnR4dApAQCAtMiwxMSArMiwyMSBAQAogICAoQ1NQSS9lQ1NQSSkgZm9yIGkuTVgKIAogUmVxdWlyZWQgcHJvcGVydGllczoKLS0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiZnNsLDxzb2M+LWNzcGkiIG9yICJmc2wsPHNvYz4tZWNzcGkiCistIGNvbXBhdGlibGUgOgorICAtICJmc2wsaW14MS1jc3BpIiBmb3IgU1BJIGNvbXBhdGlibGUgd2l0aCB0aGUgb25lIGludGVncmF0ZWQgb24gaS5NWDEKKyAgLSAiZnNsLGlteDIxLWNzcGkiIGZvciBTUEkgY29tcGF0aWJsZSB3aXRoIHRoZSBvbmUgaW50ZWdyYXRlZCBvbiBpLk1YMjEKKyAgLSAiZnNsLGlteDI3LWNzcGkiIGZvciBTUEkgY29tcGF0aWJsZSB3aXRoIHRoZSBvbmUgaW50ZWdyYXRlZCBvbiBpLk1YMjcKKyAgLSAiZnNsLGlteDMxLWNzcGkiIGZvciBTUEkgY29tcGF0aWJsZSB3aXRoIHRoZSBvbmUgaW50ZWdyYXRlZCBvbiBpLk1YMzEKKyAgLSAiZnNsLGlteDM1LWNzcGkiIGZvciBTUEkgY29tcGF0aWJsZSB3aXRoIHRoZSBvbmUgaW50ZWdyYXRlZCBvbiBpLk1YMzUKKyAgLSAiZnNsLGlteDUxLWVjc3BpIiBmb3IgU1BJIGNvbXBhdGlibGUgd2l0aCB0aGUgb25lIGludGVncmF0ZWQgb24gaS5NWDUxCiAtIHJlZyA6IE9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKIC0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIENTUEkvZUNTUEkgaW50ZXJydXB0CiAtIGZzbCxzcGktbnVtLWNoaXBzZWxlY3RzIDogQ29udGFpbnMgdGhlIG51bWJlciBvZiB0aGUgY2hpcHNlbGVjdAogLSBjcy1ncGlvcyA6IFNwZWNpZmllcyB0aGUgZ3BpbyBwaW5zIHRvIGJlIHVzZWQgZm9yIGNoaXBzZWxlY3RzLgorLSBjbG9ja3MgOiBDbG9jayBzcGVjaWZpZXJzIGZvciBib3RoIGlwZyBhbmQgcGVyIGNsb2Nrcy4KKy0gY2xvY2stbmFtZXMgOiBDbG9jayBuYW1lcyBzaG91bGQgaW5jbHVkZSBib3RoICJpcGciIGFuZCAicGVyIgorU2VlIHRoZSBjbG9jayBjb25zdW1lciBiaW5kaW5nLAorCURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9jbG9jay1iaW5kaW5ncy50eHQKIC0gZG1hczogRE1BIHNwZWNpZmllcnMgZm9yIHR4IGFuZCByeCBkbWEuIFNlZSB0aGUgRE1BIGNsaWVudCBiaW5kaW5nLAogCQlEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2RtYS50eHQKIC0gZG1hLW5hbWVzOiBETUEgcmVxdWVzdCBuYW1lcyBzaG91bGQgaW5jbHVkZSAidHgiIGFuZCAicngiIGlmIHByZXNlbnQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3Fjb20sc3BpLXF1cC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3Fjb20sc3BpLXF1cC50eHQKaW5kZXggZTJjODhkZi4uNWMwOTA3NyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9xY29tLHNwaS1xdXAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvcWNvbSxzcGktcXVwLnR4dApAQCAtMzMsNiArMzMsMTEgQEAKIAkJbm9kZXMuICBJZiB1bnNwZWNpZmllZCwgYSBzaW5nbGUgU1BJIGRldmljZSB3aXRob3V0IGEgY2hpcAogCQlzZWxlY3QgY2FuIGJlIHVzZWQuCiAKKy0gZG1hczogICAgICAgICBUd28gRE1BIGNoYW5uZWwgc3BlY2lmaWVycyBmb2xsb3dpbmcgdGhlIGNvbnZlbnRpb24gb3V0bGluZWQKKyAgICAgICAgICAgICAgICBpbiBiaW5kaW5ncy9kbWEvZG1hLnR4dAorLSBkbWEtbmFtZXM6ICAgIE5hbWVzIGZvciB0aGUgZG1hIGNoYW5uZWxzLCBpZiBwcmVzZW50LiBUaGVyZSBtdXN0IGJlIGF0CisgICAgICAgICAgICAgICAgbGVhc3Qgb25lIGNoYW5uZWwgbmFtZWQgInR4IiBmb3IgdHJhbnNtaXQgYW5kIG5hbWVkICJyeCIgZm9yCisgICAgICAgICAgICAgICAgcmVjZWl2ZS4KIAogU1BJIHNsYXZlIG5vZGVzIG11c3QgYmUgY2hpbGRyZW4gb2YgdGhlIFNQSSBtYXN0ZXIgbm9kZSBhbmQgY2FuIGNvbnRhaW4KIHByb3BlcnRpZXMgZGVzY3JpYmVkIGluIERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWJ1cy50eHQKQEAgLTUxLDYgKzU2LDkgQEAKIAkJY2xvY2tzID0gPCZnY2MgR0NDX0JMU1AyX1FVUDJfU1BJX0FQUFNfQ0xLPiwgPCZnY2MgR0NDX0JMU1AyX0FIQl9DTEs+OwogCQljbG9jay1uYW1lcyA9ICJjb3JlIiwgImlmYWNlIjsKIAorCQlkbWFzID0gPCZibHNwMV9iYW0gMTM+LCA8JmJsc3AxX2JhbSAxMj47CisJCWRtYS1uYW1lcyA9ICJyeCIsICJ0eCI7CisKIAkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAkJcGluY3RybC0wID0gPCZzcGk4X2RlZmF1bHQ+OwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1mc2wtZHNwaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1mc2wtZHNwaS50eHQKaW5kZXggY2JiZTE2ZS4uNzBhZjc4YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktZnNsLWRzcGkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWZzbC1kc3BpLnR4dApAQCAtMTYsNiArMTYsMTIgQEAKICAgaW4gYmlnIGVuZGlhbiBtb2RlLCBvdGhlcndpc2UgaW4gbmF0aXZlIG1vZGUoc2FtZSB3aXRoIENQVSksIGZvciBtb3JlCiAgIGRldGFpbCBwbGVhc2Ugc2VlOiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcmVnbWFwL3JlZ21hcC50eHQuCiAKK09wdGlvbmFsIFNQSSBzbGF2ZSBub2RlIHByb3BlcnRpZXM6CistIGZzbCxzcGktY3Mtc2NrLWRlbGF5OiBhIGRlbGF5IGluIG5hbm9zZWNvbmRzIGJldHdlZW4gYWN0aXZhdGluZyBjaGlwCisgIHNlbGVjdCBhbmQgdGhlIHN0YXJ0IG9mIGNsb2NrIHNpZ25hbCwgYXQgdGhlIHN0YXJ0IG9mIGEgdHJhbnNmZXIuCistIGZzbCxzcGktc2NrLWNzLWRlbGF5OiBhIGRlbGF5IGluIG5hbm9zZWNvbmRzIGJldHdlZW4gc3RvcHBpbmcgdGhlIGNsb2NrCisgIHNpZ25hbCBhbmQgZGVhY3RpdmF0aW5nIGNoaXAgc2VsZWN0LCBhdCB0aGUgZW5kIG9mIGEgdHJhbnNmZXIuCisKIEV4YW1wbGU6CiAKIGRzcGkwQDQwMDJjMDAwIHsKQEAgLTQzLDYgKzQ5LDggQEAKIAkJcmVnID0gPDA+OwogCQlsaW51eCxtb2RhbGlhcyA9ICJtMjVwODAiOwogCQltb2RhbCA9ICJhdDI2ZGYwODFhIjsKKwkJZnNsLHNwaS1jcy1zY2stZGVsYXkgPSA8MTAwPjsKKwkJZnNsLHNwaS1zY2stY3MtZGVsYXkgPSA8NTA+OwogCX07CiB9OwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1pbWctc3BmaS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1pbWctc3BmaS50eHQKaW5kZXggYzdkZDUwZi4uZTAyZmJmMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktaW1nLXNwZmkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLWltZy1zcGZpLnR4dApAQCAtMTQsNiArMTQsNyBAQAogLSBkbWEtbmFtZXM6IE11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGVudHJpZXM6CiAgIC0gcngKICAgLSB0eAorLSBjcy1ncGlvczogTXVzdCBzcGVjaWZ5IHRoZSBHUElPcyB1c2VkIGZvciBjaGlwc2VsZWN0IGxpbmVzLgogLSAjYWRkcmVzcy1jZWxsczogTXVzdCBiZSAxLgogLSAjc2l6ZS1jZWxsczogTXVzdCBiZSAwLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1yb2NrY2hpcC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvc3BpL3NwaS1yb2NrY2hpcC50eHQKaW5kZXggNDY3ZGVjNC4uMGM0OTFiZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3NwaS9zcGktcm9ja2NoaXAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9zcGkvc3BpLXJvY2tjaGlwLnR4dApAQCAtMjQsNiArMjQsOSBAQAogLSBkbWFzOiBETUEgc3BlY2lmaWVycyBmb3IgdHggYW5kIHJ4IGRtYS4gU2VlIHRoZSBETUEgY2xpZW50IGJpbmRpbmcsCiAJCURvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kbWEvZG1hLnR4dAogLSBkbWEtbmFtZXM6IERNQSByZXF1ZXN0IG5hbWVzIHNob3VsZCBpbmNsdWRlICJ0eCIgYW5kICJyeCIgaWYgcHJlc2VudC4KKy0gcngtc2FtcGxlLWRlbGF5LW5zOiBuYW5vc2Vjb25kcyB0byBkZWxheSBhZnRlciB0aGUgU0NMSyBlZGdlIGJlZm9yZSBzYW1wbGluZworCQlSeCBkYXRhIChtYXkgbmVlZCB0byBiZSBmaW5lIHR1bmVkIGZvciBoaWdoIGNhcGFjaXRhbmNlIGxpbmVzKS4KKwkJTm8gZGVsYXkgKDApIGJ5IGRlZmF1bHQuCiAKIAogRXhhbXBsZToKQEAgLTMzLDYgKzM2LDcgQEAKIAkJcmVnID0gPDB4ZmYxMTAwMDAgMHgxMDAwPjsKIAkJZG1hcyA9IDwmcGRtYTEgMTE+LCA8JnBkbWExIDEyPjsKIAkJZG1hLW5hbWVzID0gInR4IiwgInJ4IjsKKwkJcngtc2FtcGxlLWRlbGF5LW5zID0gPDEwPjsKIAkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCSNzaXplLWNlbGxzID0gPDA+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNDQgSVJRX1RZUEVfTEVWRUxfSElHSD47CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC9yY2FyLXRoZXJtYWwudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3RoZXJtYWwvcmNhci10aGVybWFsLnR4dAppbmRleCA0MzQwNGIxLi4zMzJlNjI1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdGhlcm1hbC9yY2FyLXRoZXJtYWwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90aGVybWFsL3JjYXItdGhlcm1hbC50eHQKQEAgLTQsNyArNCw3IEBACiAtIGNvbXBhdGlibGUJCTogInJlbmVzYXMsdGhlcm1hbC08c29jdHlwZT4iLCAicmVuZXNhcyxyY2FyLXRoZXJtYWwiCiAJCQkgIGFzIGZhbGxiYWNrLgogCQkJICBFeGFtcGxlcyB3aXRoIHNvY3R5cGVzIGFyZToKLQkJCSAgICAtICJyZW5lc2FzLHRoZXJtYWwtcjhhNzNhNCIgKFItTW9iaWxlIEFQNikKKwkJCSAgICAtICJyZW5lc2FzLHRoZXJtYWwtcjhhNzNhNCIgKFItTW9iaWxlIEFQRTYpCiAJCQkgICAgLSAicmVuZXNhcyx0aGVybWFsLXI4YTc3NzkiIChSLUNhciBIMSkKIAkJCSAgICAtICJyZW5lc2FzLHRoZXJtYWwtcjhhNzc5MCIgKFItQ2FyIEgyKQogCQkJICAgIC0gInJlbmVzYXMsdGhlcm1hbC1yOGE3NzkxIiAoUi1DYXIgTTItVykKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL2R3YzMudHh0CmluZGV4IGNkN2YwNDUuLjVjYzM2NDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvZHdjMy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9kd2MzLnR4dApAQCAtMTQsNiArMTQsNyBAQAogIC0gcGh5czogZnJvbSB0aGUgKkdlbmVyaWMgUEhZKiBiaW5kaW5ncwogIC0gcGh5LW5hbWVzOiBmcm9tIHRoZSAqR2VuZXJpYyBQSFkqIGJpbmRpbmdzCiAgLSB0eC1maWZvLXJlc2l6ZTogZGV0ZXJtaW5lcyBpZiB0aGUgRklGTyAqaGFzKiB0byBiZSByZWFsbG9jYXRlZC4KKyAtIHNucHMsdXNiM19scG1fY2FwYWJsZTogZGV0ZXJtaW5lcyBpZiBwbGF0Zm9ybSBpcyBVU0IzIExQTSBjYXBhYmxlCiAgLSBzbnBzLGRpc2FibGVfc2NyYW1ibGVfcXVpcms6IHRydWUgd2hlbiBTVyBzaG91bGQgZGlzYWJsZSBkYXRhIHNjcmFtYmxpbmcuCiAJT25seSByZWFsbHkgdXNlZnVsIGZvciBGUEdBIGJ1aWxkcy4KICAtIHNucHMsaGFzLWxwbS1lcnJhdHVtOiB0cnVlIHdoZW4gRFdDMyB3YXMgY29uZmlndXJlZCB3aXRoIExQTSBFcnJhdHVtIGVuYWJsZWQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvcmVuZXNhc191c2Jocy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdXNiL3JlbmVzYXNfdXNiaHMudHh0CmluZGV4IDYxYjA0NWIuLmRjMmExOGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvcmVuZXNhc191c2Jocy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi9yZW5lc2FzX3VzYmhzLnR4dApAQCAtMTUsNyArMTUsMTAgQEAKICAgLSBwaHlzOiBwaGFuZGxlICsgcGh5IHNwZWNpZmllciBwYWlyCiAgIC0gcGh5LW5hbWVzOiBtdXN0IGJlICJ1c2IiCiAgIC0gZG1hczogTXVzdCBjb250YWluIGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIERNQSBzcGVjaWZpZXJzLgotICAtIGRtYS1uYW1lcyA6IE11c3QgY29udGFpbiBhIGxpc3Qgb2YgRE1BIG5hbWVzLCAidHgiIG9yICJyeCIuCisgIC0gZG1hLW5hbWVzIDogTXVzdCBjb250YWluIGEgbGlzdCBvZiBETUEgbmFtZXM6CisgICAtIHR4MCAuLi4gdHg8bj4KKyAgIC0gcngwIC4uLiByeDxuPgorICAgIC0gVGhpcyA8bj4gbWVhbnMgRG5GSUZPIGluIFVTQkhTIG1vZHVsZS4KIAogRXhhbXBsZToKIAl1c2JoczogdXNiQGU2NTkwMDAwIHsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy91c2IvdXNibWlzYy1pbXgudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2JtaXNjLWlteC50eHQKaW5kZXggYzEwMWE0Yi4uMzUzOWQ0ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2JtaXNjLWlteC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3VzYi91c2JtaXNjLWlteC50eHQKQEAgLTUsNiArNSw3IEBACiAtIGNvbXBhdGlibGU6IFNob3VsZCBiZSBvbmUgb2YgYmVsb3c6CiAJImZzbCxpbXg2cS11c2JtaXNjIiBmb3IgaW14NnEKIAkiZnNsLHZmNjEwLXVzYm1pc2MiIGZvciBWeWJyaWQgdmY2MTAKKwkiZnNsLGlteDZzeC11c2JtaXNjIiBmb3IgaW14NnN4CiAtIHJlZzogU2hvdWxkIGNvbnRhaW4gcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKIAogRXhhbXBsZXM6CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdmVuZG9yLXByZWZpeGVzLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92ZW5kb3ItcHJlZml4ZXMudHh0CmluZGV4IGZhZTI2ZDAuLmIxM2FhNTUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92ZW5kb3ItcHJlZml4ZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92ZW5kb3ItcHJlZml4ZXMudHh0CkBAIC0zNyw2ICszNyw3IEBACiBjYXZpdW0JQ2F2aXVtLCBJbmMuCiBjZG5zCUNhZGVuY2UgRGVzaWduIFN5c3RlbXMgSW5jLgogY2hpcGlkZWEJQ2hpcGlkZWEsIEluYworY2hpcG9uZQkJQ2hpcE9uZQogY2hpcHNwYXJrCUNoaXBTUEFSSwogY2hycAlDb21tb24gSGFyZHdhcmUgUmVmZXJlbmNlIFBsYXRmb3JtCiBjaHVuZ2h3YQlDaHVuZ2h3YSBQaWN0dXJlIFR1YmVzIEx0ZC4KQEAgLTc4LDYgKzc5LDcgQEAKIGdpYW50cGx1cwlHaWFudHBsdXMgVGVjaG5vbG9neSBDby4sIEx0ZC4KIGdsb2JhbHNjYWxlCUdsb2JhbHNjYWxlIFRlY2hub2xvZ2llcywgSW5jLgogZ210CUdsb2JhbCBNaXhlZC1tb2RlIFRlY2hub2xvZ3ksIEluYy4KK2dvb2RpeAlTaGVuemhlbiBIdWlkaW5nIFRlY2hub2xvZ3kgQ28uLCBMdGQuCiBnb29nbGUJR29vZ2xlLCBJbmMuCiBndW1zdGl4CUd1bXN0aXgsIEluYy4KIGd3CUdhdGV3b3JrcyBDb3Jwb3JhdGlvbgpAQCAtMTI1LDYgKzEyNyw3IEBACiBuYXRpb25hbAlOYXRpb25hbCBTZW1pY29uZHVjdG9yCiBuZW9ub2RlCQlOZW9ub2RlIEluYy4KIG5ldGdlYXIJTkVUR0VBUgorbmV0bG9naWMJQnJvYWRjb20gQ29ycG9yYXRpb24gKGZvcm1lcmx5IE5ldExvZ2ljIE1pY3Jvc3lzdGVtcykKIG5ld2hhdmVuCU5ld2hhdmVuIERpc3BsYXkgSW50ZXJuYXRpb25hbAogbmludGVuZG8JTmludGVuZG8KIG5va2lhCU5va2lhCkBAIC0xNjcsNiArMTcwLDcgQEAKIHNpbGVyZ3kJU2lsZXJneSBDb3JwLgogc2lyZglTaVJGIFRlY2hub2xvZ3ksIEluYy4KIHNpdHJvbml4CVNpdHJvbml4IFRlY2hub2xvZ3kgQ29ycG9yYXRpb24KK3NreXdvcmtzCVNreXdvcmtzIFNvbHV0aW9ucywgSW5jLgogc21zYwlTdGFuZGFyZCBNaWNyb3N5c3RlbXMgQ29ycG9yYXRpb24KIHNucHMJU3lub3BzeXMsIEluYy4KIHNvbGlkcnVuCVNvbGlkUnVuCkBAIC0xOTQsNiArMTk4LDcgQEAKIHdpbmJvbmQgV2luYm9uZCBFbGVjdHJvbmljcyBjb3JwLgogd2xmCVdvbGZzb24gTWljcm9lbGVjdHJvbmljcwogd20JV29uZGVybWVkaWEgVGVjaG5vbG9naWVzLCBJbmMuCit4LXBvd2VycwlYLVBvd2VycwogeGVzCUV4dHJlbWUgRW5naW5lZXJpbmcgU29sdXRpb25zIChYLUVTKQogeGlsbHlidXMJWGlsbHlidXMgTHRkLgogeGxueAlYaWxpbngKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92aWRlby9iYWNrbGlnaHQvc2t5ODE0NTItYmFja2xpZ2h0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy92aWRlby9iYWNrbGlnaHQvc2t5ODE0NTItYmFja2xpZ2h0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmYyOTQwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3ZpZGVvL2JhY2tsaWdodC9za3k4MTQ1Mi1iYWNrbGlnaHQudHh0CkBAIC0wLDAgKzEsMjkgQEAKK1NLWTgxNDUyLWJhY2tsaWdodCBiaW5kaW5ncworCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlCQk6IE11c3QgYmUgInNreXdvcmtzLHNreTgxNDUyLWJhY2tsaWdodCIKKworT3B0aW9uYWwgcHJvcGVydGllczoKKy0gbmFtZQkJCTogTmFtZSBvZiBiYWNrbGlnaHQgZGV2aWNlLiBEZWZhdWx0IGlzICdsY2QtYmFja2xpZ2h0Jy4KKy0gZ3Bpb3MJCQk6IEdQSU8gdG8gdXNlIHRvIEVOIHBpbi4KKwkJCVNlZSBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvLnR4dAorLSBsZWQtc291cmNlcwkJOiBMaXN0IG9mIGVuYWJsZWQgY2hhbm5lbHMgZnJvbSAwIHRvIDUuCisJCQlTZWUgRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2xlZHMvY29tbW9uLnR4dAorLSBza3l3b3JrcyxpZ25vcmUtcHdtCTogSWdub3JlIGJvdGggUFdNIGlucHV0CistIHNreXdvcmtzLGRwd20tbW9kZQk6IEVuYWJsZSBEUFdNIGRpbW1pbmcgbW9kZSwgb3RoZXJ3aXNlIEFuYWxvZyBkaW1taW5nLgorLSBza3l3b3JrcyxwaGFzZS1zaGlmdAk6IEVuYWJsZSBwaGFzZSBzaGlmdCBtb2RlCistIHNreXdvcmtzLHNob3J0LWRldGVjdGlvbi10aHJlc2hvbGQtdm9sdAorCQkJOiBJdCBzaG91bGQgYmUgb25lIG9mIDQsIDUsIDYgYW5kIDdWLgorLSBza3l3b3JrcyxjdXJyZW50LWxpbWl0LW1BCisJCQk6IEl0IHNob3VsZCBiZSAyMzAwbUEgb3IgMjc1MG1BLgorCitFeGFtcGxlOgorCisJYmFja2xpZ2h0IHsKKwkJY29tcGF0aWJsZSA9ICJza3l3b3Jrcyxza3k4MTQ1Mi1iYWNrbGlnaHQiOworCQluYW1lID0gInB3bS1iYWNrbGlnaHQiOworCQlsZWQtc291cmNlcyA9IDwwIDEgMiA1PjsKKwkJc2t5d29ya3MsaWdub3JlLXB3bTsKKwkJc2t5d29ya3MscGhhc2Utc2hpZnQ7CisJCXNreXdvcmtzLGN1cnJlbnQtbGltaXQtbUEgPSA8MjMwMD47CisJfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldnJlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2RyaXZlci1tb2RlbC9kZXZyZXMudHh0CmluZGV4IDZkMWU4ZWUuLmUxZTJiYmQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZHJpdmVyLW1vZGVsL2RldnJlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kcml2ZXItbW9kZWwvZGV2cmVzLnR4dApAQCAtMjg5LDYgKzI4OSwxMCBAQAogICBkZXZtX3JlcXVlc3RfaXJxKCkKICAgZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgpCiAKK0xFRAorICBkZXZtX2xlZF9jbGFzc2Rldl9yZWdpc3RlcigpCisgIGRldm1fbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoKQorCiBNRElPCiAgIGRldm1fbWRpb2J1c19hbGxvYygpCiAgIGRldm1fbWRpb2J1c19hbGxvY19zaXplKCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvTG9ja2luZwppbmRleCBmOTE5MjZmLi43YzNmMTg3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL0xvY2tpbmcKKysrIGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9Mb2NraW5nCkBAIC00MjksOCArNDI5LDYgQEAKIAlsb2ZmX3QgKCpsbHNlZWspIChzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CiAJc3NpemVfdCAoKnJlYWQpIChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKIAlzc2l6ZV90ICgqd3JpdGUpIChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKLQlzc2l6ZV90ICgqYWlvX3JlYWQpIChzdHJ1Y3Qga2lvY2IgKiwgY29uc3Qgc3RydWN0IGlvdmVjICosIHVuc2lnbmVkIGxvbmcsIGxvZmZfdCk7Ci0Jc3NpemVfdCAoKmFpb193cml0ZSkgKHN0cnVjdCBraW9jYiAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90KTsKIAlzc2l6ZV90ICgqcmVhZF9pdGVyKSAoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKIAlzc2l6ZV90ICgqd3JpdGVfaXRlcikgKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW92X2l0ZXIgKik7CiAJaW50ICgqaXRlcmF0ZSkgKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkaXJfY29udGV4dCAqKTsKQEAgLTUyNSw2ICs1MjMsNyBAQAogCXZvaWQgKCpjbG9zZSkoc3RydWN0IHZtX2FyZWFfc3RydWN0Kik7CiAJaW50ICgqZmF1bHQpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCosIHN0cnVjdCB2bV9mYXVsdCAqKTsKIAlpbnQgKCpwYWdlX21rd3JpdGUpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCBzdHJ1Y3Qgdm1fZmF1bHQgKik7CisJaW50ICgqcGZuX21rd3JpdGUpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCBzdHJ1Y3Qgdm1fZmF1bHQgKik7CiAJaW50ICgqYWNjZXNzKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwgdW5zaWduZWQgbG9uZywgdm9pZCosIGludCwgaW50KTsKIAogbG9ja2luZyBydWxlczoKQEAgLTUzNCw2ICs1MzMsNyBAQAogZmF1bHQ6CQl5ZXMJCWNhbiByZXR1cm4gd2l0aCBwYWdlIGxvY2tlZAogbWFwX3BhZ2VzOgl5ZXMKIHBhZ2VfbWt3cml0ZToJeWVzCQljYW4gcmV0dXJuIHdpdGggcGFnZSBsb2NrZWQKK3Bmbl9ta3dyaXRlOgl5ZXMKIGFjY2VzczoJCXllcwogCiAJLT5mYXVsdCgpIGlzIGNhbGxlZCB3aGVuIGEgcHJldmlvdXNseSBub3QgcHJlc2VudCBwdGUgaXMgYWJvdXQKQEAgLTU2MCw2ICs1NjAsMTIgQEAKIGxpa2UgdGhlIC0+ZmF1bHQoKSBoYW5kbGVyLCBidXQgc2ltcGx5IHJldHVybiB3aXRoIFZNX0ZBVUxUX05PUEFHRSwgd2hpY2gKIHdpbGwgY2F1c2UgdGhlIFZNIHRvIHJldHJ5IHRoZSBmYXVsdC4KIAorCS0+cGZuX21rd3JpdGUoKSBpcyB0aGUgc2FtZSBhcyBwYWdlX21rd3JpdGUgYnV0IHdoZW4gdGhlIHB0ZSBpcworVk1fUEZOTUFQIG9yIFZNX01JWEVETUFQIHdpdGggYSBwYWdlLWxlc3MgZW50cnkuIEV4cGVjdGVkIHJldHVybiBpcworVk1fRkFVTFRfTk9QQUdFLiBPciBvbmUgb2YgdGhlIFZNX0ZBVUxUX0VSUk9SIHR5cGVzLiBUaGUgZGVmYXVsdCBiZWhhdmlvcgorYWZ0ZXIgdGhpcyBjYWxsIGlzIHRvIG1ha2UgdGhlIHB0ZSByZWFkLXdyaXRlLCB1bmxlc3MgcGZuX21rd3JpdGUgcmV0dXJucworYW4gZXJyb3IuCisKIAktPmFjY2VzcygpIGlzIGNhbGxlZCB3aGVuIGdldF91c2VyX3BhZ2VzKCkgZmFpbHMgaW4KIGFjY2Vzc19wcm9jZXNzX3ZtKCksIHR5cGljYWxseSB1c2VkIHRvIGRlYnVnIGEgcHJvY2VzcyB0aHJvdWdoCiAvcHJvYy9waWQvbWVtIG9yIHB0cmFjZS4gIFRoaXMgZnVuY3Rpb24gaXMgbmVlZGVkIG9ubHkgZm9yCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3BvcnRpbmcgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3BvcnRpbmcKaW5kZXggZmEyZGIwOC4uZTY5Mjc0ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9wb3J0aW5nCisrKyBiL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcG9ydGluZwpAQCAtNDcxLDMgKzQ3MSwxNSBAQAogW21hbmRhdG9yeV0KIAlmX2RlbnRyeSBpcyBnb25lOyB1c2UgZl9wYXRoLmRlbnRyeSwgb3IsIGJldHRlciB5ZXQsIHNlZSBpZiB5b3UgY2FuIGF2b2lkCiAJaXQgZW50aXJlbHkuCistLQorW21hbmRhdG9yeV0KKwluZXZlciBjYWxsIC0+cmVhZCgpIGFuZCAtPndyaXRlKCkgZGlyZWN0bHk7IHVzZSBfX3Zmc197cmVhZCx3cml0ZX0gb3IKKwl3cmFwcGVyczsgaW5zdGVhZCBvZiBjaGVja2luZyBmb3IgLT53cml0ZSBvciAtPnJlYWQgYmVpbmcgTlVMTCwgbG9vayBmb3IKKwlGTU9ERV9DQU5fe1dSSVRFLFJFQUR9IGluIGZpbGUtPmZfbW9kZS4KKy0tCitbbWFuZGF0b3J5XQorCWRvIF9ub3RfIHVzZSBuZXdfc3luY197cmVhZCx3cml0ZX0gZm9yIC0+cmVhZC8tPndyaXRlOyBsZWF2ZSBpdCBOVUxMCisJaW5zdGVhZC4KKy0tCitbbWFuZGF0b3J5XQorCS0+YWlvX3JlYWQvLT5haW9fd3JpdGUgYXJlIGdvbmUuICBVc2UgLT5yZWFkX2l0ZXIvLT53cml0ZV9pdGVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0IGIvRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy92ZnMudHh0CmluZGV4IDk2NmIyMjguLjIwN2NkY2EgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvdmZzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0ZW1zL3Zmcy50eHQKQEAgLTgwNCw4ICs4MDQsNiBAQAogCWxvZmZfdCAoKmxsc2VlaykgKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKIAlzc2l6ZV90ICgqcmVhZCkgKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogCXNzaXplX3QgKCp3cml0ZSkgKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwotCXNzaXplX3QgKCphaW9fcmVhZCkgKHN0cnVjdCBraW9jYiAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90KTsKLQlzc2l6ZV90ICgqYWlvX3dyaXRlKSAoc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCBsb25nLCBsb2ZmX3QpOwogCXNzaXplX3QgKCpyZWFkX2l0ZXIpIChzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IGlvdl9pdGVyICopOwogCXNzaXplX3QgKCp3cml0ZV9pdGVyKSAoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKIAlpbnQgKCppdGVyYXRlKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRpcl9jb250ZXh0ICopOwpAQCAtODM4LDE0ICs4MzYsMTAgQEAKIAogICByZWFkOiBjYWxsZWQgYnkgcmVhZCgyKSBhbmQgcmVsYXRlZCBzeXN0ZW0gY2FsbHMKIAotICBhaW9fcmVhZDogdmVjdG9yZWQsIHBvc3NpYmx5IGFzeW5jaHJvbm91cyByZWFkCi0KICAgcmVhZF9pdGVyOiBwb3NzaWJseSBhc3luY2hyb25vdXMgcmVhZCB3aXRoIGlvdl9pdGVyIGFzIGRlc3RpbmF0aW9uCiAKICAgd3JpdGU6IGNhbGxlZCBieSB3cml0ZSgyKSBhbmQgcmVsYXRlZCBzeXN0ZW0gY2FsbHMKIAotICBhaW9fd3JpdGU6IHZlY3RvcmVkLCBwb3NzaWJseSBhc3luY2hyb25vdXMgd3JpdGUKLQogICB3cml0ZV9pdGVyOiBwb3NzaWJseSBhc3luY2hyb25vdXMgd3JpdGUgd2l0aCBpb3ZfaXRlciBhcyBzb3VyY2UKIAogICBpdGVyYXRlOiBjYWxsZWQgd2hlbiB0aGUgVkZTIG5lZWRzIHRvIHJlYWQgdGhlIGRpcmVjdG9yeSBjb250ZW50cwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9oaWQvaGlkLXNlbnNvci50eHQgYi9Eb2N1bWVudGF0aW9uL2hpZC9oaWQtc2Vuc29yLnR4dAppbmRleCA5NDhiMDk4Li5iMjg3NzUyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2hpZC9oaWQtc2Vuc29yLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2hpZC9oaWQtc2Vuc29yLnR4dApAQCAtMTM4LDMgKzEzOCw4NyBAQAogdGhlIHVzYWdlIGlkIG9mIFggYXhpcy4gSElEIHNlbnNvcnMgY2FuIHByb3ZpZGUgZXZlbnRzLCBzbyB0aGlzIGlzIG5vdCBuZWNlc3NhcnkKIHRvIHBvbGwgZm9yIGFueSBmaWVsZC4gSWYgdGhlcmUgaXMgc29tZSBuZXcgc2FtcGxlLCB0aGUgY29yZSBkcml2ZXIgd2lsbCBjYWxsCiByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3MgdGhlIHNhbXBsZS4KKworCistLS0tLS0tLS0tCisKK0hJRCBDdXN0b20gYW5kIGdlbmVyaWMgU2Vuc29ycworCitISUQgU2Vuc29yIHNwZWNpZmljYXRpb24gZGVmaW5lcyB0d28gc3BlY2lhbCBzZW5zb3IgdXNhZ2UgdHlwZXMuIFNpbmNlIHRoZXkKK2Rvbid0IHJlcHJlc2VudCBhIHN0YW5kYXJkIHNlbnNvciwgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRlZmluZSB1c2luZyBMaW51eCBJSU8KK3R5cGUgaW50ZXJmYWNlcy4KK1RoZSBwdXJwb3NlIG9mIHRoZXNlIHNlbnNvcnMgaXMgdG8gZXh0ZW5kIHRoZSBmdW5jdGlvbmFsaXR5IG9yIHByb3ZpZGUgYQord2F5IHRvIG9iZnVzY2F0ZSB0aGUgZGF0YSBiZWluZyBjb21tdW5pY2F0ZWQgYnkgYSBzZW5zb3IuIFdpdGhvdXQga25vd2luZyB0aGUKK21hcHBpbmcgYmV0d2VlbiB0aGUgZGF0YSBhbmQgaXRzIGVuY2Fwc3VsYXRlZCBmb3JtLCBpdCBpcyBkaWZmaWN1bHQgZm9yCithbiBhcHBsaWNhdGlvbi9kcml2ZXIgdG8gZGV0ZXJtaW5lIHdoYXQgZGF0YSBpcyBiZWluZyBjb21tdW5pY2F0ZWQgYnkgdGhlIHNlbnNvci4KK1RoaXMgYWxsb3dzIHNvbWUgZGlmZmVyZW50aWF0aW5nIHVzZSBjYXNlcywgd2hlcmUgdmVuZG9yIGNhbiBwcm92aWRlIGFwcGxpY2F0aW9ucy4KK1NvbWUgY29tbW9uIHVzZSBjYXNlcyBhcmUgZGVidWcgb3RoZXIgc2Vuc29ycyBvciB0byBwcm92aWRlIHNvbWUgZXZlbnRzIGxpa2UKK2tleWJvYXJkIGF0dGFjaGVkL2RldGFjaGVkIG9yIGxpZCBvcGVuL2Nsb3NlLgorCitUbyBhbGxvdyBhcHBsaWNhdGlvbiB0byB1dGlsaXplIHRoZXNlIHNlbnNvcnMsIGhlcmUgdGhleSBhcmUgZXhwb3J0ZWQgdXNlcyBzeXNmcworYXR0cmlidXRlIGdyb3VwcywgYXR0cmlidXRlcyBhbmQgbWlzYyBkZXZpY2UgaW50ZXJmYWNlLgorCitBbiBleGFtcGxlIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gb24gc3lzZnM6Cisvc3lzL2RldmljZXMvcGNpMDAwMDowMC9JTlQzM0MyOjAwL2kyYy0wL2kyYy1JTlQzM0QxOjAwLzAwMTg6ODA4NjowOUZBLjAwMDEvSElELVNFTlNPUi0yMDAwZTEuNi5hdXRvJCB0cmVlIC1SCisuCis/Pz8/Pz8/Pz8gZW5hYmxlX3NlbnNvcgorPz8/Pz8/Pz8/IGZlYXR1cmUtMC0yMDAzMTYKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGZlYXR1cmUtMC0yMDAzMTYtbWF4aW11bQorPz8/Pz8/PyA/Pz8/Pz8/Pz8gZmVhdHVyZS0wLTIwMDMxNi1taW5pbXVtCis/Pz8/Pz8/ID8/Pz8/Pz8/PyBmZWF0dXJlLTAtMjAwMzE2LW5hbWUKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGZlYXR1cmUtMC0yMDAzMTYtc2l6ZQorPz8/Pz8/PyA/Pz8/Pz8/Pz8gZmVhdHVyZS0wLTIwMDMxNi11bml0LWV4cG8KKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGZlYXR1cmUtMC0yMDAzMTYtdW5pdHMKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGZlYXR1cmUtMC0yMDAzMTYtdmFsdWUKKz8/Pz8/Pz8/PyBmZWF0dXJlLTEtMjAwMjAxCis/Pz8/Pz8/ID8/Pz8/Pz8/PyBmZWF0dXJlLTEtMjAwMjAxLW1heGltdW0KKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGZlYXR1cmUtMS0yMDAyMDEtbWluaW11bQorPz8/Pz8/PyA/Pz8/Pz8/Pz8gZmVhdHVyZS0xLTIwMDIwMS1uYW1lCis/Pz8/Pz8/ID8/Pz8/Pz8/PyBmZWF0dXJlLTEtMjAwMjAxLXNpemUKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGZlYXR1cmUtMS0yMDAyMDEtdW5pdC1leHBvCis/Pz8/Pz8/ID8/Pz8/Pz8/PyBmZWF0dXJlLTEtMjAwMjAxLXVuaXRzCis/Pz8/Pz8/ID8/Pz8/Pz8/PyBmZWF0dXJlLTEtMjAwMjAxLXZhbHVlCis/Pz8/Pz8/Pz8gaW5wdXQtMC0yMDAyMDEKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTAtMjAwMjAxLW1heGltdW0KKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTAtMjAwMjAxLW1pbmltdW0KKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTAtMjAwMjAxLW5hbWUKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTAtMjAwMjAxLXNpemUKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTAtMjAwMjAxLXVuaXQtZXhwbworPz8/Pz8/PyA/Pz8/Pz8/Pz8gaW5wdXQtMC0yMDAyMDEtdW5pdHMKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTAtMjAwMjAxLXZhbHVlCis/Pz8/Pz8/Pz8gaW5wdXQtMS0yMDAyMDIKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTEtMjAwMjAyLW1heGltdW0KKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTEtMjAwMjAyLW1pbmltdW0KKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTEtMjAwMjAyLW5hbWUKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTEtMjAwMjAyLXNpemUKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTEtMjAwMjAyLXVuaXQtZXhwbworPz8/Pz8/PyA/Pz8/Pz8/Pz8gaW5wdXQtMS0yMDAyMDItdW5pdHMKKz8/Pz8/Pz8gPz8/Pz8/Pz8/IGlucHV0LTEtMjAwMjAyLXZhbHVlCisKK0hlcmUgdGhlcmUgaXMgYSBjdXN0b20gc2Vuc29ycyB3aXRoIGZvdXIgZmllbGRzLCB0d28gZmVhdHVyZSBhbmQgdHdvIGlucHV0cy4KK0VhY2ggZmllbGQgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZXQgb2YgYXR0cmlidXRlcy4gQWxsIGZpZWxkcyBleGNlcHQgdGhlICJ2YWx1ZSIKK2FyZSByZWFkIG9ubHkuIFRoZSB2YWx1ZSBmaWVsZCBpcyBhIFJXIGZpZWxkLgorRXhhbXBsZQorL3N5cy9idXMvcGxhdGZvcm0vZGV2aWNlcy9ISUQtU0VOU09SLTIwMDBlMS42LmF1dG8vZmVhdHVyZS0wLTIwMDMxNiQgZ3JlcCAtciAuICoKK2ZlYXR1cmUtMC0yMDAzMTYtbWF4aW11bTo2CitmZWF0dXJlLTAtMjAwMzE2LW1pbmltdW06MAorZmVhdHVyZS0wLTIwMDMxNi1uYW1lOnByb3BlcnR5LXJlcG9ydGluZy1zdGF0ZQorZmVhdHVyZS0wLTIwMDMxNi1zaXplOjEKK2ZlYXR1cmUtMC0yMDAzMTYtdW5pdC1leHBvOjAKK2ZlYXR1cmUtMC0yMDAzMTYtdW5pdHM6MjUKK2ZlYXR1cmUtMC0yMDAzMTYtdmFsdWU6MQorCitIb3cgdG8gZW5hYmxlIHN1Y2ggc2Vuc29yPworQnkgZGVmYXVsdCBzZW5zb3IgY2FuIGJlIHBvd2VyIGdhdGVkLiBUbyBlbmFibGUgc3lzZnMgYXR0cmlidXRlICJlbmFibGUiIGNhbiBiZQordXNlZC4KKyQgZWNobyAxID4gZW5hYmxlX3NlbnNvcgorCitPbmNlIGVuYWJsZWQgYW5kIHBvd2VyZWQgb24sIHNlbnNvciBjYW4gcmVwb3J0IHZhbHVlIHVzaW5nIEhJRCByZXBvcnRzLgorVGhlc2UgcmVwb3J0cyBhcmUgcHVzaGVkIHVzaW5nIG1pc2MgZGV2aWNlIGludGVyZmFjZSBpbiBhIEZJRk8gb3JkZXIuCisvZGV2JCB0cmVlIHwgZ3JlcCBISUQtU0VOU09SLTIwMDBlMS42LmF1dG8KKz8/Pz8/Pz8gPz8/Pz8/Pz8/IDEwOjUzIC0+IC4uL0hJRC1TRU5TT1ItMjAwMGUxLjYuYXV0bworPz8/Pz8/Pz8/IEhJRC1TRU5TT1ItMjAwMGUxLjYuYXV0bworCitFYWNoIHJlcG9ydHMgY2FuIGJlIG9mIHZhcmlhYmxlIGxlbmd0aCBwcmVjZWRlZCBieSBhIGhlYWRlci4gVGhpcyBoZWFkZXIKK2NvbnNpc3Qgb2YgYSAzMiBiaXQgdXNhZ2UgaWQsIDY0IGJpdCB0aW1lIHN0YW1wIGFuZCAzMiBiaXQgbGVuZ3RoIGZpZWxkIG9mIHJhdworZGF0YS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NyBiL0RvY3VtZW50YXRpb24vaHdtb24vaXQ4NwppbmRleCBmZTgwZTlhLi5lODcyOTQ4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2l0ODcKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9pdDg3CkBAIC02LDYgKzYsMTAgQEAKICAgICBQcmVmaXg6ICdpdDg2MDMnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZSAoOCBJL08gcG9ydHMpCiAgICAgRGF0YXNoZWV0OiBOb3QgcHVibGljbHkgYXZhaWxhYmxlCisgICogSVQ4NjIwRQorICAgIFByZWZpeDogJ2l0ODYyMCcKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlICg4IEkvTyBwb3J0cykKKyAgICBEYXRhc2hlZXQ6IE5vdCBwdWJsaWNseSBhdmFpbGFibGUKICAgKiBJVDg3MDVGCiAgICAgUHJlZml4OiAnaXQ4NycKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlICg4IEkvTyBwb3J0cykKQEAgLTQyLDYgKzQ2LDEwIEBACiAgICAgUHJlZml4OiAnaXQ4NzcyJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UgKDggSS9PIHBvcnRzKQogICAgIERhdGFzaGVldDogTm90IHB1YmxpY2x5IGF2YWlsYWJsZQorICAqIElUODc4MUYKKyAgICBQcmVmaXg6ICdpdDg3ODEnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZSAoOCBJL08gcG9ydHMpCisgICAgRGF0YXNoZWV0OiBOb3QgcHVibGljbHkgYXZhaWxhYmxlCiAgICogSVQ4NzgyRgogICAgIFByZWZpeDogJ2l0ODc4MicKICAgICBBZGRyZXNzZXMgc2Nhbm5lZDogZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlICg4IEkvTyBwb3J0cykKQEAgLTUwLDYgKzU4LDE0IEBACiAgICAgUHJlZml4OiAnaXQ4NzgzJwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UgKDggSS9PIHBvcnRzKQogICAgIERhdGFzaGVldDogTm90IHB1YmxpY2x5IGF2YWlsYWJsZQorICAqIElUODc4NkUKKyAgICBQcmVmaXg6ICdpdDg3ODYnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IGZyb20gU3VwZXIgSS9PIGNvbmZpZyBzcGFjZSAoOCBJL08gcG9ydHMpCisgICAgRGF0YXNoZWV0OiBOb3QgcHVibGljbHkgYXZhaWxhYmxlCisgICogSVQ4NzkwRQorICAgIFByZWZpeDogJ2l0ODc5MCcKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogZnJvbSBTdXBlciBJL08gY29uZmlnIHNwYWNlICg4IEkvTyBwb3J0cykKKyAgICBEYXRhc2hlZXQ6IE5vdCBwdWJsaWNseSBhdmFpbGFibGUKICAgKiBTaVM5NTAgICBbY2xvbmUgb2YgSVQ4NzA1Rl0KICAgICBQcmVmaXg6ICdpdDg3JwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiBmcm9tIFN1cGVyIEkvTyBjb25maWcgc3BhY2UgKDggSS9PIHBvcnRzKQpAQCAtOTQsOSArMTEwLDEwIEBACiBEZXNjcmlwdGlvbgogLS0tLS0tLS0tLS0KIAotVGhpcyBkcml2ZXIgaW1wbGVtZW50cyBzdXBwb3J0IGZvciB0aGUgSVQ4NjAzRSwgSVQ4NjIzRSwgSVQ4NzA1RiwgSVQ4NzEyRiwKLUlUODcxNkYsIElUODcxOEYsIElUODcyMEYsIElUODcyMUYsIElUODcyNkYsIElUODcyOEYsIElUODc1OEUsIElUODc3MUUsCi1JVDg3NzJFLCBJVDg3ODJGLCBJVDg3ODNFL0YsIGFuZCBTaVM5NTAgY2hpcHMuCitUaGlzIGRyaXZlciBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIHRoZSBJVDg2MDNFLCBJVDg2MjBFLCBJVDg2MjNFLCBJVDg3MDVGLAorSVQ4NzEyRiwgSVQ4NzE2RiwgSVQ4NzE4RiwgSVQ4NzIwRiwgSVQ4NzIxRiwgSVQ4NzI2RiwgSVQ4NzI4RiwgSVQ4NzU4RSwKK0lUODc3MUUsIElUODc3MkUsIElUODc4MUYsIElUODc4MkYsIElUODc4M0UvRiwgSVQ4Nzg2RSwgSVQ4NzkwRSwgYW5kIFNpUzk1MAorY2hpcHMuCiAKIFRoZXNlIGNoaXBzIGFyZSAnU3VwZXIgSS9PIGNoaXBzJywgc3VwcG9ydGluZyBmbG9wcHkgZGlza3MsIGluZnJhcmVkIHBvcnRzLAogam95c3RpY2tzIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzIHN0dWZmLiBGb3IgaGFyZHdhcmUgbW9uaXRvcmluZywgdGhleQpAQCAtMTIwLDExICsxMzcsMTEgQEAKIGhhdmUgc3VwcG9ydCBmb3IgMiBhZGRpdGlvbmFsIGZhbnMuIFRoZSBhZGRpdGlvbmFsIGZhbnMgYXJlIHN1cHBvcnRlZCBieSB0aGUKIGRyaXZlci4KIAotVGhlIElUODcxNkYsIElUODcxOEYsIElUODcyMEYsIElUODcyMUYvSVQ4NzU4RSwgSVQ4NzgyRiwgSVQ4NzgzRS9GLCBhbmQgbGF0ZQotSVQ4NzEyRiBhbmQgSVQ4NzA1RiBhbHNvIGhhdmUgb3B0aW9uYWwgMTYtYml0IHRhY2hvbWV0ZXIgY291bnRlcnMgZm9yIGZhbnMgMSB0bwotMy4gVGhpcyBpcyBiZXR0ZXIgKG5vIG1vcmUgZmFuIGNsb2NrIGRpdmlkZXIgbWVzcykgYnV0IG5vdCBjb21wYXRpYmxlIHdpdGggdGhlCi1vbGRlciBjaGlwcyBhbmQgcmV2aXNpb25zLiBUaGUgMTYtYml0IHRhY2hvbWV0ZXIgbW9kZSBpcyBlbmFibGVkIGJ5IHRoZSBkcml2ZXIKLXdoZW4gb25lIG9mIHRoZSBhYm92ZSBjaGlwcyBpcyBkZXRlY3RlZC4KK1RoZSBJVDg3MTZGLCBJVDg3MThGLCBJVDg3MjBGLCBJVDg3MjFGL0lUODc1OEUsIElUODc4MUYsIElUODc4MkYsIElUODc4M0UvRiwKK2FuZCBsYXRlIElUODcxMkYgYW5kIElUODcwNUYgYWxzbyBoYXZlIG9wdGlvbmFsIDE2LWJpdCB0YWNob21ldGVyIGNvdW50ZXJzCitmb3IgZmFucyAxIHRvIDMuIFRoaXMgaXMgYmV0dGVyIChubyBtb3JlIGZhbiBjbG9jayBkaXZpZGVyIG1lc3MpIGJ1dCBub3QKK2NvbXBhdGlibGUgd2l0aCB0aGUgb2xkZXIgY2hpcHMgYW5kIHJldmlzaW9ucy4gVGhlIDE2LWJpdCB0YWNob21ldGVyIG1vZGUKK2lzIGVuYWJsZWQgYnkgdGhlIGRyaXZlciB3aGVuIG9uZSBvZiB0aGUgYWJvdmUgY2hpcHMgaXMgZGV0ZWN0ZWQuCiAKIFRoZSBJVDg3MjZGIGlzIGp1c3QgYml0IGVuaGFuY2VkIElUODcxNkYgd2l0aCBhZGRpdGlvbmFsIGhhcmR3YXJlCiBmb3IgQU1EIHBvd2VyIHNlcXVlbmNpbmcuIFRoZXJlZm9yZSB0aGUgY2hpcCB3aWxsIGFwcGVhciBhcyBJVDg3MTZGCkBAIC0xMzQsOCArMTUxLDEzIEBACiB1bnRpbCBhIGRhdGFzaGVldCBiZWNvbWVzIGF2YWlsYWJsZSAoaG9wZWZ1bGx5LikKIAogVGhlIElUODYwM0UvSVQ4NjIzRSBpcyBhIGN1c3RvbSBkZXNpZ24sIGhhcmR3YXJlIG1vbml0b3JpbmcgcGFydCBpcyBzaW1pbGFyIHRvCi1JVDg3MjhGLiBJdCBvbmx5IHN1cHBvcnRzIDE2LWJpdCBmYW4gbW9kZSwgdGhlIGZ1bGwgc3BlZWQgbW9kZSBvZiB0aGUKLWZhbiBpcyBub3Qgc3VwcG9ydGVkICh2YWx1ZSAwIG9mIHB3bVhfZW5hYmxlKS4KK0lUODcyOEYuIEl0IG9ubHkgc3VwcG9ydHMgMyBmYW5zLCAxNi1iaXQgZmFuIG1vZGUsIGFuZCB0aGUgZnVsbCBzcGVlZCBtb2RlCitvZiB0aGUgZmFuIGlzIG5vdCBzdXBwb3J0ZWQgKHZhbHVlIDAgb2YgcHdtWF9lbmFibGUpLgorCitUaGUgSVQ4NjIwRSBpcyBhbm90aGVyIGN1c3RvbSBkZXNpZ24sIGhhcmR3YXJlIG1vbml0b3JpbmcgcGFydCBpcyBzaW1pbGFyIHRvCitJVDg3MjhGLiBJdCBvbmx5IHN1cHBvcnRzIDE2LWJpdCBmYW4gbW9kZS4KKworVGhlIElUODc5MEUgc3VwcG9ydHMgdXAgdG8gMyBmYW5zLiAxNi1iaXQgZmFuIG1vZGUgaXMgYWx3YXlzIGVuYWJsZWQuCiAKIFRlbXBlcmF0dXJlcyBhcmUgbWVhc3VyZWQgaW4gZGVncmVlcyBDZWxzaXVzLiBBbiBhbGFybSBpcyB0cmlnZ2VyZWQgb25jZQogd2hlbiB0aGUgT3ZlcnRlbXBlcmF0dXJlIFNodXRkb3duIGxpbWl0IGlzIGNyb3NzZWQuCkBAIC0xNTYsMTAgKzE3OCwxMCBAQAogMC4wMTYgdm9sdCAoZXhjZXB0IElUODYwM0UsIElUODcyMUYvSVQ4NzU4RSBhbmQgSVQ4NzI4RjogMC4wMTIgdm9sdC4pIFRoZQogYmF0dGVyeSB2b2x0YWdlIGluOCBkb2VzIG5vdCBoYXZlIGxpbWl0IHJlZ2lzdGVycy4KIAotT24gdGhlIElUODYwM0UsIElUODcyMUYvSVQ4NzU4RSwgSVQ4NzgyRiwgYW5kIElUODc4M0UvRiwgc29tZSB2b2x0YWdlIGlucHV0cwotYXJlIGludGVybmFsIGFuZCBzY2FsZWQgaW5zaWRlIHRoZSBjaGlwOgorT24gdGhlIElUODYwM0UsIElUODcyMUYvSVQ4NzU4RSwgSVQ4NzgxRiwgSVQ4NzgyRiwgYW5kIElUODc4M0UvRiwgc29tZQordm9sdGFnZSBpbnB1dHMgYXJlIGludGVybmFsIGFuZCBzY2FsZWQgaW5zaWRlIHRoZSBjaGlwOgogKiBpbjMgKG9wdGlvbmFsKQotKiBpbjcgKG9wdGlvbmFsIGZvciBJVDg3ODJGIGFuZCBJVDg3ODNFL0YpCisqIGluNyAob3B0aW9uYWwgZm9yIElUODc4MUYsIElUODc4MkYsIGFuZCBJVDg3ODNFL0YpCiAqIGluOCAoYWx3YXlzKQogKiBpbjkgKHJlbGV2YW50IGZvciBJVDg2MDNFIG9ubHkpCiBUaGUgZHJpdmVyIGhhbmRsZXMgdGhpcyB0cmFuc3BhcmVudGx5IHNvIHVzZXItc3BhY2UgZG9lc24ndCBoYXZlIHRvIGNhcmUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2pjNDIgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2pjNDIKaW5kZXggZjM4OTNmNy4uZjdmMTgzMGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vamM0MgorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2pjNDIKQEAgLTExLDEyICsxMSwxMCBAQAogCWh0dHA6Ly93d3cuYXRtZWwuY29tL0ltYWdlcy9kb2M4NzExLnBkZgogCWh0dHA6Ly93d3cuYXRtZWwuY29tL0ltYWdlcy9BdG1lbC04ODUyLVNFRVBST00tQVQzMFRTRTAwMkEtRGF0YXNoZWV0LnBkZgogCWh0dHA6Ly93d3cuYXRtZWwuY29tL0ltYWdlcy9BdG1lbC04ODY4LURUUy1BVDMwVFNFMDA0QS1EYXRhc2hlZXQucGRmCi0gICogSURUIFRTRTIwMDJCMywgVFNFMjAwMkdCMiwgVFMzMDAwQjMsIFRTMzAwMEdCMgorICAqIElEVCBUU0UyMDAyQjMsIFRTRTIwMDJHQjIsIFRTRTIwMDRHQjIsIFRTMzAwMEIzLCBUUzMwMDBHQjAsIFRTMzAwMEdCMiwKKwlUUzMwMDFHQjIKICAgICBEYXRhc2hlZXRzOgotCWh0dHA6Ly93d3cuaWR0LmNvbS9zaXRlcy9kZWZhdWx0L2ZpbGVzL2RvY3VtZW50cy9JRFRfVFNFMjAwMkIzQ19EU1RfMjAxMDA1MTJfMTIwMzAzMTUyMDU2LnBkZgotCWh0dHA6Ly93d3cuaWR0LmNvbS9zaXRlcy9kZWZhdWx0L2ZpbGVzL2RvY3VtZW50cy9JRFRfVFNFMjAwMkdCMkExX0RTVF8yMDExMTEwN18xMjAzMDMxNDU5MTQucGRmCi0JaHR0cDovL3d3dy5pZHQuY29tL3NpdGVzL2RlZmF1bHQvZmlsZXMvZG9jdW1lbnRzL0lEVF9UUzMwMDBCM0FfRFNUXzIwMTAxMTI5XzEyMDMwMzE1MjAxMy5wZGYKLQlodHRwOi8vd3d3LmlkdC5jb20vc2l0ZXMvZGVmYXVsdC9maWxlcy9kb2N1bWVudHMvSURUX1RTMzAwMEdCMkExX0RTVF8yMDExMTEwNF8xMjAzMDMxNTEwMTIucGRmCisJQXZhaWxhYmxlIGZyb20gSURUIHdlYiBzaXRlCiAgICogTWF4aW0gTUFYNjYwNAogICAgIERhdGFzaGVldHM6CiAJaHR0cDovL2RhdGFzaGVldHMubWF4aW0taWMuY29tL2VuL2RzL01BWDY2MDQucGRmCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL25jdDc5MDQgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL25jdDc5MDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0ZjExMgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbmN0NzkwNApAQCAtMCwwICsxLDYwIEBACitLZXJuZWwgZHJpdmVyIG5jdDc5MDQKKz09PT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwOgorICAqIE51dm90b24gTkNUNzkwNEQKKyAgICBQcmVmaXg6IG5jdDc5MDQKKyAgICBBZGRyZXNzZXM6IEkyQyAweDJkLCAweDJlCisgICAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgTnV2b3RvbiB3ZWJzaXRlCisJaHR0cDovL3d3dy5udXZvdG9uLmNvbS8KKworQXV0aG9yOiBWYWRpbSBWLiBWbGFzb3YgPHZ2bGFzb3ZAZGV2LnJ0c29mdC5ydT4KKworCitEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0KKworVGhlIE5DVDc5MDREIGlzIGEgaGFyZHdhcmUgbW9uaXRvciBzdXBwb3J0aW5nIHVwIHRvIDIwIHZvbHRhZ2Ugc2Vuc29ycywKK2ludGVybmFsIHRlbXBlcmF0dXJlIHNlbnNvciwgSW50ZWwgUEVDSSBhbmQgQU1EIFNCLVRTSSBDUFUgdGVtcGVyYXR1cmUKK2ludGVyZmFjZSwgdXAgdG8gMTIgZmFuIHRhY2hvbWV0ZXIgaW5wdXRzLCB1cCB0byA0IGZhbiBjb250cm9sIGNoYW5uZWxzCit3aXRoIFNtYXJ0RmFuLgorCisKK1N5c2ZzIGVudHJpZXMKKy0tLS0tLS0tLS0tLS0KKworQ3VycmVudGx5LCB0aGUgZHJpdmVyIHN1cHBvcnRzIG9ubHkgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKKworaW5bMS0yMF1faW5wdXQJCUlucHV0IHZvbHRhZ2UgbWVhc3VyZW1lbnRzIChtVikKKworZmFuWzEtMTJdX2lucHV0CQlGYW4gdGFjaG9tZXRlciBtZWFzdXJlbWVudHMgKHJwbSkKKwordGVtcDFfaW5wdXQJCUxvY2FsIHRlbXBlcmF0dXJlICgxLzEwMDAgZGVncmVlLAorCQkJMC4xMjUgZGVncmVlIHJlc29sdXRpb24pCisKK3RlbXBbMi05XV9pbnB1dAkJQ1BVIHRlbXBlcmF0dXJlcyAoMS8xMDAwIGRlZ3JlZSwKKwkJCTAuMTI1IGRlZ3JlZSByZXNvbHV0aW9uKQorCitmYW5bMS00XV9tb2RlCQlSL1csIDAvMSBmb3IgbWFudWFsIG9yIFNtYXJ0RmFuIG1vZGUKKwkJCVNldHRpbmcgU21hcnRGYW4gbW9kZSBpcyBzdXBwb3J0ZWQgb25seSBpZiBpdCBoYXMgYmVlbgorCQkJcHJldmlvdXNseSBjb25maWd1cmVkIGJ5IEJJT1MgKG9yIGNvbmZpZ3VyYXRpb24gRUVQUk9NKQorCitmYW5bMS00XV9wd20JCVIvTyBpbiBTbWFydEZhbiBtb2RlLCBSL1cgaW4gbWFudWFsIGNvbnRyb2wgbW9kZQorCitUaGUgZHJpdmVyIGNoZWNrcyBzZW5zb3IgY29udHJvbCByZWdpc3RlcnMgYW5kIGRvZXMgbm90IGV4cG9ydCB0aGUgc2Vuc29ycwordGhhdCBhcmUgbm90IGVuYWJsZWQuIEFueXdheSwgYSBzZW5zb3IgdGhhdCBpcyBlbmFibGVkIG1heSBhY3R1YWxseSBiZSBub3QKK2Nvbm5lY3RlZCBhbmQgdGh1cyBwcm92aWRlIHplcm8gcmVhZGluZ3MuCisKKworTGltaXRhdGlvbnMKKy0tLS0tLS0tLS0tCisKK1RoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gY3VycmVudCB2ZXJzaW9uOgorCisgLSBTbWFydEZhbiBjb250cm9sCisgLSBXYXRjaGRvZworIC0gR1BJTworIC0gZXh0ZXJuYWwgdGVtcGVyYXR1cmUgc2Vuc29ycworIC0gU01JCisgLSBtaW4vbWF4IHZhbHVlcworIC0gbWFueSBvdGhlci4uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9pMmMvc2xhdmUtZWVwcm9tLWJhY2tlbmQgYi9Eb2N1bWVudGF0aW9uL2kyYy9zbGF2ZS1lZXByb20tYmFja2VuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQ0NGVmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9pMmMvc2xhdmUtZWVwcm9tLWJhY2tlbmQKQEAgLTAsMCArMSwxNCBAQAorTGludXggSTJDIHNsYXZlIGVlcHJvbSBiYWNrZW5kCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYnkgV29sZnJhbSBTYW5nIDx3c2FAc2FuZy1lbmdpbmVlcmluZy5jb20+IGluIDIwMTQtMTUKKworVGhpcyBpcyBhIHByb29mLW9mLWNvbmNlcHQgYmFja2VuZCB3aGljaCBhY3RzIGxpa2UgYW4gRUVQUk9NIG9uIHRoZSBjb25uZWN0ZWQKK0kyQyBidXMuIFRoZSBtZW1vcnkgY29udGVudHMgY2FuIGJlIG1vZGlmaWVkIGZyb20gdXNlcnNwYWNlIHZpYSB0aGlzIGZpbGUKK2xvY2F0ZWQgaW4gc3lzZnM6CisKKwkvc3lzL2J1cy9pMmMvZGV2aWNlcy88ZGV2aWNlLWRpcmVjb3J5Pi9zbGF2ZS1lZXByb20KKworQXMgb2YgMjAxNSwgTGludXggZG9lc24ndCBzdXBwb3J0IHBvbGwgb24gYmluYXJ5IHN5c2ZzIGZpbGVzLCBzbyB0aGVyZSBpcyBubworbm90ZmljYXRpb24gd2hlbiBhbm90aGVyIG1hc3RlciBjaGFuZ2VkIHRoZSBjb250ZW50LgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9zbGF2ZS1pbnRlcmZhY2UgYi9Eb2N1bWVudGF0aW9uL2kyYy9zbGF2ZS1pbnRlcmZhY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5YmI1ZAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaTJjL3NsYXZlLWludGVyZmFjZQpAQCAtMCwwICsxLDE3OSBAQAorTGludXggSTJDIHNsYXZlIGludGVyZmFjZSBkZXNjcmlwdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitieSBXb2xmcmFtIFNhbmcgPHdzYUBzYW5nLWVuZ2luZWVyaW5nLmNvbT4gaW4gMjAxNC0xNQorCitMaW51eCBjYW4gYWxzbyBiZSBhbiBJMkMgc2xhdmUgaW4gY2FzZSBJMkMgY29udHJvbGxlcnMgaGF2ZSBzbGF2ZSBzdXBwb3J0LgorQmVzaWRlcyB0aGlzIEhXIHJlcXVpcmVtZW50LCBvbmUgYWxzbyBuZWVkcyBhIHNvZnR3YXJlIGJhY2tlbmQgcHJvdmlkaW5nIHRoZQorYWN0dWFsIGZ1bmN0aW9uYWxpdHkuIEFuIGV4YW1wbGUgZm9yIHRoaXMgaXMgdGhlIHNsYXZlLWVlcHJvbSBkcml2ZXIsIHdoaWNoCithY3RzIGFzIGEgZHVhbCBtZW1vcnkgZHJpdmVyLiBXaGlsZSBhbm90aGVyIEkyQyBtYXN0ZXIgb24gdGhlIGJ1cyBjYW4gYWNjZXNzIGl0CitsaWtlIGEgcmVndWxhciBFRVBST00sIHRoZSBMaW51eCBJMkMgc2xhdmUgY2FuIGFjY2VzcyB0aGUgY29udGVudCB2aWEgc3lzZnMgYW5kCityZXRyaWV2ZS9wcm92aWRlIGluZm9ybWF0aW9uIGFzIG5lZWRlZC4gVGhlIHNvZnR3YXJlIGJhY2tlbmQgZHJpdmVyIGFuZCB0aGUgSTJDCitidXMgZHJpdmVyIGNvbW11bmljYXRlIHZpYSBldmVudHMuIEhlcmUgaXMgYSBzbWFsbCBncmFwaCB2aXN1YWxpemluZyB0aGUgZGF0YQorZmxvdyBhbmQgdGhlIG1lYW5zIGJ5IHdoaWNoIGRhdGEgaXMgdHJhbnNwb3J0ZWQuIFRoZSBkb3R0ZWQgbGluZSBtYXJrcyBvbmx5IG9uZQorZXhhbXBsZS4gVGhlIGJhY2tlbmQgY291bGQgYWxzbyB1c2UgZS5nLiBhIGNoYXJhY3RlciBkZXZpY2UsIGJlIGluLWtlcm5lbAorb25seSwgb3Igc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50OgorCisKKyAgICAgICAgICAgICAgZS5nLiBzeXNmcyAgICAgICAgSTJDIHNsYXZlIGV2ZW50cyAgICAgICAgSS9PIHJlZ2lzdGVycworICArLS0tLS0tLS0tLS0rICAgdiAgICArLS0tLS0tLS0tKyAgICAgdiAgICAgKy0tLS0tLS0tKyAgdiAgKy0tLS0tLS0tLS0tLSsKKyAgfCBVc2Vyc3BhY2UgKy4uLi4uLi4uKyBCYWNrZW5kICstLS0tLS0tLS0tLSsgRHJpdmVyICstLS0tLSsgQ29udHJvbGxlciB8CisgICstLS0tLS0tLS0tLSsgICAgICAgICstLS0tLS0tLS0rICAgICAgICAgICArLS0tLS0tLS0rICAgICArLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgfAorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tICBJMkMKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLSAgQnVzCisKK05vdGU6IFRlY2huaWNhbGx5LCB0aGVyZSBpcyBhbHNvIHRoZSBJMkMgY29yZSBiZXR3ZWVuIHRoZSBiYWNrZW5kIGFuZCB0aGUKK2RyaXZlci4gSG93ZXZlciwgYXQgdGhpcyB0aW1lIG9mIHdyaXRpbmcsIHRoZSBsYXllciBpcyB0cmFuc3BhcmVudC4KKworCitVc2VyIG1hbnVhbAorPT09PT09PT09PT0KKworSTJDIHNsYXZlIGJhY2tlbmRzIGJlaGF2ZSBsaWtlIHN0YW5kYXJkIEkyQyBjbGllbnRzLiBTbywgeW91IGNhbiBpbnN0YW50aWF0ZQordGhlbSBsaWtlIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnQgJ2luc3RhbnRpYXRpbmctZGV2aWNlcycuIEEgcXVpY2sgZXhhbXBsZQorZm9yIGluc3RhbnRpYXRpbmcgdGhlIHNsYXZlLWVlcHJvbSBkcml2ZXIgZnJvbSB1c2Vyc3BhY2U6CisKKyAgIyBlY2hvIDAtMDA2NCA+IC9zeXMvYnVzL2kyYy9kcml2ZXJzL2kyYy1zbGF2ZS1lZXByb20vYmluZAorCitFYWNoIGJhY2tlbmQgc2hvdWxkIGNvbWUgd2l0aCBzZXBhcmF0ZSBkb2N1bWVudGF0aW9uIHRvIGRlc2NyaWJlIGl0cyBzcGVjaWZpYworYmVoYXZpb3VyIGFuZCBzZXR1cC4KKworCitEZXZlbG9wZXIgbWFudWFsCis9PT09PT09PT09PT09PT09CisKK0kyQyBzbGF2ZSBldmVudHMKKy0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGJ1cyBkcml2ZXIgc2VuZHMgYW4gZXZlbnQgdG8gdGhlIGJhY2tlbmQgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKKworCXJldCA9IGkyY19zbGF2ZV9ldmVudChjbGllbnQsIGV2ZW50LCAmdmFsKQorCisnY2xpZW50JyBkZXNjcmliZXMgdGhlIGkyYyBzbGF2ZSBkZXZpY2UuICdldmVudCcgaXMgb25lIG9mIHRoZSBzcGVjaWFsIGV2ZW50Cit0eXBlcyBkZXNjcmliZWQgaGVyZWFmdGVyLiAndmFsJyBob2xkcyBhbiB1OCB2YWx1ZSBmb3IgdGhlIGRhdGEgYnl0ZSB0byBiZQorcmVhZC93cml0dGVuIGFuZCBpcyB0aHVzIGJpZGlyZWN0aW9uYWwuIFRoZSBwb2ludGVyIHRvIHZhbCBtdXN0IGFsd2F5cyBiZQorcHJvdmlkZWQgZXZlbiBpZiB2YWwgaXMgbm90IHVzZWQgZm9yIGFuIGV2ZW50LCBpLmUuIGRvbid0IHVzZSBOVUxMIGhlcmUuICdyZXQnCitpcyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIGJhY2tlbmQuIE1hbmRhdG9yeSBldmVudHMgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUKK2J1cyBkcml2ZXJzIGFuZCBtdXN0IGJlIGNoZWNrZWQgZm9yIGJ5IGJhY2tlbmQgZHJpdmVycy4KKworRXZlbnQgdHlwZXM6CisKKyogSTJDX1NMQVZFX1dSSVRFX1JFUVVFU1RFRCAobWFuZGF0b3J5KQorCisndmFsJzogdW51c2VkCisncmV0JzogYWx3YXlzIDAKKworQW5vdGhlciBJMkMgbWFzdGVyIHdhbnRzIHRvIHdyaXRlIGRhdGEgdG8gdXMuIFRoaXMgZXZlbnQgc2hvdWxkIGJlIHNlbnQgb25jZQorb3VyIG93biBhZGRyZXNzIGFuZCB0aGUgd3JpdGUgYml0IHdhcyBkZXRlY3RlZC4gVGhlIGRhdGEgZGlkIG5vdCBhcnJpdmUgeWV0LCBzbwordGhlcmUgaXMgbm90aGluZyB0byBwcm9jZXNzIG9yIHJldHVybi4gV2FrZXVwIG9yIGluaXRpYWxpemF0aW9uIHByb2JhYmx5IG5lZWRzCit0byBiZSBkb25lLCB0aG91Z2guCisKKyogSTJDX1NMQVZFX1JFQURfUkVRVUVTVEVEIChtYW5kYXRvcnkpCisKKyd2YWwnOiBiYWNrZW5kIHJldHVybnMgZmlyc3QgYnl0ZSB0byBiZSBzZW50CisncmV0JzogYWx3YXlzIDAKKworQW5vdGhlciBJMkMgbWFzdGVyIHdhbnRzIHRvIHJlYWQgZGF0YSBmcm9tIHVzLiBUaGlzIGV2ZW50IHNob3VsZCBiZSBzZW50IG9uY2UKK291ciBvd24gYWRkcmVzcyBhbmQgdGhlIHJlYWQgYml0IHdhcyBkZXRlY3RlZC4gQWZ0ZXIgcmV0dXJuaW5nLCB0aGUgYnVzIGRyaXZlcgorc2hvdWxkIHRyYW5zbWl0IHRoZSBmaXJzdCBieXRlLgorCisqIEkyQ19TTEFWRV9XUklURV9SRUNFSVZFRCAobWFuZGF0b3J5KQorCisndmFsJzogYnVzIGRyaXZlciBkZWxpdmVycyByZWNlaXZlZCBieXRlCisncmV0JzogMCBpZiB0aGUgYnl0ZSBzaG91bGQgYmUgYWNrZWQsIHNvbWUgZXJybm8gaWYgdGhlIGJ5dGUgc2hvdWxkIGJlIG5hY2tlZAorCitBbm90aGVyIEkyQyBtYXN0ZXIgaGFzIHNlbnQgYSBieXRlIHRvIHVzIHdoaWNoIG5lZWRzIHRvIGJlIHNldCBpbiAndmFsJy4gSWYgJ3JldCcKK2lzIHplcm8sIHRoZSBidXMgZHJpdmVyIHNob3VsZCBhY2sgdGhpcyBieXRlLiBJZiAncmV0JyBpcyBhbiBlcnJubywgdGhlbiB0aGUgYnl0ZQorc2hvdWxkIGJlIG5hY2tlZC4KKworKiBJMkNfU0xBVkVfUkVBRF9QUk9DRVNTRUQgKG1hbmRhdG9yeSkKKworJ3ZhbCc6IGJhY2tlbmQgcmV0dXJucyBuZXh0IGJ5dGUgdG8gYmUgc2VudAorJ3JldCc6IGFsd2F5cyAwCisKK1RoZSBidXMgZHJpdmVyIHJlcXVlc3RzIHRoZSBuZXh0IGJ5dGUgdG8gYmUgc2VudCB0byBhbm90aGVyIEkyQyBtYXN0ZXIgaW4KKyd2YWwnLiBJbXBvcnRhbnQ6IFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBwcmV2aW91cyBieXRlIGhhcyBiZWVuIGFja2VkLCBpdAorb25seSBtZWFucyB0aGF0IHRoZSBwcmV2aW91cyBieXRlIGlzIHNoaWZ0ZWQgb3V0IHRvIHRoZSBidXMhIFRvIGVuc3VyZSBzZWFtbGVzcwordHJhbnNtaXNzaW9uLCBtb3N0IGhhcmR3YXJlIHJlcXVlc3RzIHRoZSBuZXh0IGJ5dGUgd2hlbiB0aGUgcHJldmlvdXMgb25lIGlzCitzdGlsbCBzaGlmdGVkIG91dC4gSWYgdGhlIG1hc3RlciBzZW5kcyBOQUNLIGFuZCBzdG9wcyByZWFkaW5nIGFmdGVyIHRoZSBieXRlCitjdXJyZW50bHkgc2hpZnRlZCBvdXQsIHRoaXMgYnl0ZSByZXF1ZXN0ZWQgaGVyZSBpcyBuZXZlciB1c2VkLiBJdCB2ZXJ5IGxpa2VseQorbmVlZHMgdG8gYmUgc2VudCBhZ2FpbiBvbiB0aGUgbmV4dCBJMkNfU0xBVkVfUkVBRF9SRVFVRVNULCBkZXBlbmRpbmcgYSBiaXQgb24KK3lvdXIgYmFja2VuZCwgdGhvdWdoLgorCisqIEkyQ19TTEFWRV9TVE9QIChtYW5kYXRvcnkpCisKKyd2YWwnOiB1bnVzZWQKKydyZXQnOiBhbHdheXMgMAorCitBIHN0b3AgY29uZGl0aW9uIHdhcyByZWNlaXZlZC4gVGhpcyBjYW4gaGFwcGVuIGFueXRpbWUgYW5kIHRoZSBiYWNrZW5kIHNob3VsZAorcmVzZXQgaXRzIHN0YXRlIG1hY2hpbmUgZm9yIEkyQyB0cmFuc2ZlcnMgdG8gYmUgYWJsZSB0byByZWNlaXZlIG5ldyByZXF1ZXN0cy4KKworCitTb2Z0d2FyZSBiYWNrZW5kcworLS0tLS0tLS0tLS0tLS0tLS0KKworSWYgeW91IHdhbnQgdG8gd3JpdGUgYSBzb2Z0d2FyZSBiYWNrZW5kOgorCisqIHVzZSBhIHN0YW5kYXJkIGkyY19kcml2ZXIgYW5kIGl0cyBtYXRjaGluZyBtZWNoYW5pc21zCisqIHdyaXRlIHRoZSBzbGF2ZV9jYWxsYmFjayB3aGljaCBoYW5kbGVzIHRoZSBhYm92ZSBzbGF2ZSBldmVudHMKKyAgKGJlc3QgdXNpbmcgYSBzdGF0ZSBtYWNoaW5lKQorKiByZWdpc3RlciB0aGlzIGNhbGxiYWNrIHZpYSBpMmNfc2xhdmVfcmVnaXN0ZXIoKQorCitDaGVjayB0aGUgaTJjLXNsYXZlLWVlcHJvbSBkcml2ZXIgYXMgYW4gZXhhbXBsZS4KKworCitCdXMgZHJpdmVyIHN1cHBvcnQKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3Ugd2FudCB0byBhZGQgc2xhdmUgc3VwcG9ydCB0byB0aGUgYnVzIGRyaXZlcjoKKworKiBpbXBsZW1lbnQgY2FsbHMgdG8gcmVnaXN0ZXIvdW5yZWdpc3RlciB0aGUgc2xhdmUgYW5kIGFkZCB0aG9zZSB0byB0aGUKKyAgc3RydWN0IGkyY19hbGdvcml0aG0uIFdoZW4gcmVnaXN0ZXJpbmcsIHlvdSBwcm9iYWJseSBuZWVkIHRvIHNldCB0aGUgaTJjCisgIHNsYXZlIGFkZHJlc3MgYW5kIGVuYWJsZSBzbGF2ZSBzcGVjaWZpYyBpbnRlcnJ1cHRzLiBJZiB5b3UgdXNlIHJ1bnRpbWUgcG0sIHlvdQorICBzaG91bGQgdXNlIHBtX3J1bnRpbWVfZm9yYmlkKCkgYmVjYXVzZSB5b3VyIGRldmljZSB1c3VhbGx5IG5lZWRzIHRvIGJlIHBvd2VyZWQKKyAgb24gYWx3YXlzIHRvIGJlIGFibGUgdG8gZGV0ZWN0IGl0cyBzbGF2ZSBhZGRyZXNzLiBXaGVuIHVucmVnaXN0ZXJpbmcsIGRvIHRoZQorICBpbnZlcnNlIG9mIHRoZSBhYm92ZS4KKworKiBDYXRjaCB0aGUgc2xhdmUgaW50ZXJydXB0cyBhbmQgc2VuZCBhcHByb3ByaWF0ZSBpMmNfc2xhdmVfZXZlbnRzIHRvIHRoZSBiYWNrZW5kLgorCitDaGVjayB0aGUgaTJjLXJjYXIgZHJpdmVyIGFzIGFuIGV4YW1wbGUuCisKKworQWJvdXQgQUNLL05BQ0sKKy0tLS0tLS0tLS0tLS0tCisKK0l0IGlzIGdvb2QgYmVoYXZpb3VyIHRvIGFsd2F5cyBBQ0sgdGhlIGFkZHJlc3MgcGhhc2UsIHNvIHRoZSBtYXN0ZXIga25vd3MgaWYgYQorZGV2aWNlIGlzIGJhc2ljYWxseSBwcmVzZW50IG9yIGlmIGl0IG15c3RlcmlvdXNseSBkaXNhcHBlYXJlZC4gVXNpbmcgTkFDSyB0bworc3RhdGUgYmVpbmcgYnVzeSBpcyB0cm91Ymxlc29tZS4gU01CdXMgZGVtYW5kcyB0byBhbHdheXMgQUNLIHRoZSBhZGRyZXNzIHBoYXNlLAord2hpbGUgdGhlIEkyQyBzcGVjaWZpY2F0aW9uIGlzIG1vcmUgbG9vc2Ugb24gdGhhdC4gTW9zdCBJMkMgY29udHJvbGxlcnMgYWxzbworYXV0b21hdGljYWxseSBBQ0sgd2hlbiBkZXRlY3RpbmcgdGhlaXIgc2xhdmUgYWRkcmVzc2VzLCBzbyB0aGVyZSBpcyBubyBvcHRpb24KK3RvIE5BQ0sgdGhlbS4gRm9yIHRob3NlIHJlYXNvbnMsIHRoaXMgQVBJIGRvZXMgbm90IHN1cHBvcnQgTkFDSyBpbiB0aGUgYWRkcmVzcworcGhhc2UuCisKK0N1cnJlbnRseSwgdGhlcmUgaXMgbm8gc2xhdmUgZXZlbnQgdG8gcmVwb3J0IGlmIHRoZSBtYXN0ZXIgZGlkIEFDSyBvciBOQUNLIGEKK2J5dGUgd2hlbiBpdCByZWFkcyBmcm9tIHVzLiBXZSBjb3VsZCBtYWtlIHRoaXMgYW4gb3B0aW9uYWwgZXZlbnQgaWYgdGhlIG5lZWQKK2FyaXNlcy4gSG93ZXZlciwgY2FzZXMgc2hvdWxkIGJlIGV4dHJlbWVseSByYXJlIGJlY2F1c2UgdGhlIG1hc3RlciBpcyBleHBlY3RlZAordG8gc2VuZCBTVE9QIGFmdGVyIHRoYXQgYW5kIHdlIGhhdmUgYW4gZXZlbnQgZm9yIHRoYXQuIEFsc28sIGtlZXAgaW4gbWluZCBub3QKK2FsbCBJMkMgY29udHJvbGxlcnMgaGF2ZSB0aGUgcG9zc2liaWxpdHkgdG8gcmVwb3J0IHRoYXQgZXZlbnQuCisKKworQWJvdXQgYnVmZmVycworLS0tLS0tLS0tLS0tLQorCitEdXJpbmcgZGV2ZWxvcG1lbnQgb2YgdGhpcyBBUEksIHRoZSBxdWVzdGlvbiBvZiB1c2luZyBidWZmZXJzIGluc3RlYWQgb2YganVzdAorYnl0ZXMgY2FtZSB1cC4gU3VjaCBhbiBleHRlbnNpb24gbWlnaHQgYmUgcG9zc2libGUsIHVzZWZ1bG5lc3MgaXMgdW5jbGVhciBhdAordGhpcyB0aW1lIG9mIHdyaXRpbmcuIFNvbWUgcG9pbnRzIHRvIGtlZXAgaW4gbWluZCB3aGVuIHVzaW5nIGJ1ZmZlcnM6CisKKyogQnVmZmVycyBzaG91bGQgYmUgb3B0LWluIGFuZCBzbGF2ZSBkcml2ZXJzIHdpbGwgYWx3YXlzIGhhdmUgdG8gc3VwcG9ydAorICBieXRlLWJhc2VkIHRyYW5zYWN0aW9ucyBhcyB0aGUgdWx0aW1hdGUgZmFsbGJhY2sgYmVjYXVzZSB0aGlzIGlzIGhvdyB0aGUKKyAgbWFqb3JpdHkgb2YgSFcgd29ya3MuCisKKyogRm9yIGJhY2tlbmRzIHNpbXVsYXRpbmcgaGFyZHdhcmUgcmVnaXN0ZXJzLCBidWZmZXJzIGFyZSBub3QgaGVscGZ1bCBiZWNhdXNlCisgIG9uIHdyaXRlcyBhbiBhY3Rpb24gc2hvdWxkIGJlIGltbWVkaWF0ZWx5IHRyaWdnZXJlZC4gRm9yIHJlYWRzLCB0aGUgZGF0YSBpbgorICB0aGUgYnVmZmVyIG1pZ2h0IGdldCBzdGFsZS4KKworKiBBIG1hc3RlciBjYW4gc2VuZCBTVE9QIGF0IGFueSB0aW1lLiBGb3IgcGFydGlhbGx5IHRyYW5zZmVycmVkIGJ1ZmZlcnMsIHRoaXMKKyAgbWVhbnMgYWRkaXRpb25hbCBjb2RlIHRvIGhhbmRsZSB0aGlzIGV4Y2VwdGlvbi4gU3VjaCBjb2RlIHRlbmRzIHRvIGJlCisgIGVycm9yLXByb25lLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9zdW1tYXJ5IGIvRG9jdW1lbnRhdGlvbi9pMmMvc3VtbWFyeQppbmRleCAxM2FiMDc2Li44MDk1NDFhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2kyYy9zdW1tYXJ5CisrKyBiL0RvY3VtZW50YXRpb24vaTJjL3N1bW1hcnkKQEAgLTQxLDcgKzQxLDMgQEAKIAogRm9yIGEgZ2l2ZW4gY29uZmlndXJhdGlvbiwgeW91IHdpbGwgbmVlZCBhIGRyaXZlciBmb3IgeW91ciBJMkMgYnVzLCBhbmQKIGRyaXZlcnMgZm9yIHlvdXIgSTJDIGRldmljZXMgKHVzdWFsbHkgb25lIGRyaXZlciBmb3IgZWFjaCBkZXZpY2UpLgotCi1BdCB0aGlzIHRpbWUsIExpbnV4IG9ubHkgb3BlcmF0ZXMgSTJDIChvciBTTUJ1cykgaW4gbWFzdGVyIG1vZGU7IHlvdSBjYW4ndAotdXNlIHRoZXNlIEFQSXMgdG8gbWFrZSBhIExpbnV4IHN5c3RlbSBiZWhhdmUgYXMgYSBzbGF2ZS9kZXZpY2UsIGVpdGhlciB0bwotc3BlYWsgYSBjdXN0b20gcHJvdG9jb2wgb3IgdG8gZW11bGF0ZSBzb21lIG90aGVyIGRldmljZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW5wdXQvYWxwcy50eHQgYi9Eb2N1bWVudGF0aW9uL2lucHV0L2FscHMudHh0CmluZGV4IGE2M2U1ZTAuLjkyYWU3MzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5wdXQvYWxwcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pbnB1dC9hbHBzLnR4dApAQCAtMTE0LDYgKzExNCw5IEBACiAgYnl0ZSA0OiAgMCAgIHk2ICAgeTUgICB5NCAgIHkzICAgeTIgICB5MSAgIHkwCiAgYnl0ZSA1OiAgMCAgIHo2ICAgejUgICB6NCAgIHozICAgejIgICB6MSAgIHowCiAKK1Byb3RvY29sIFZlcnNpb24gMiBEdWFsUG9pbnQgZGV2aWNlcyBzZW5kIHN0YW5kYXJkIFBTLzIgbW91c2UgcGFja2V0cyBmb3IKK3RoZSBEdWFsUG9pbnQgU3RpY2suCisKIER1YWxwb2ludCBkZXZpY2UgLS0gaW50ZXJsZWF2ZWQgcGFja2V0IGZvcm1hdAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTEyNyw2ICsxMzAsMTEgQEAKICBieXRlIDc6ICAgIDAgICB5NiAgIHk1ICAgeTQgICB5MyAgIHkyICAgeTEgICB5MAogIGJ5dGUgODogICAgMCAgIHo2ICAgejUgICB6NCAgIHozICAgejIgICB6MSAgIHowCiAKK0RldmljZXMgd2hpY2ggdXNlIHRoZSBpbnRlcmxlYXZpbmcgZm9ybWF0IG5vcm1hbGx5IHNlbmQgc3RhbmRhcmQgUFMvMiBtb3VzZQorcGFja2V0cyBmb3IgdGhlIER1YWxQb2ludCBTdGljayArIEFMUFMgQWJzb2x1dGUgTW9kZSBwYWNrZXRzIGZvciB0aGUKK3RvdWNocGFkLCBzd2l0Y2hpbmcgdG8gdGhlIGludGVybGVhdmVkIHBhY2tldCBmb3JtYXQgd2hlbiBib3RoIHRoZSBzdGljayBhbmQKK3RoZSB0b3VjaHBhZCBhcmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lLgorCiBBTFBTIEFic29sdXRlIE1vZGUgLSBQcm90b2NvbCBWZXJzaW9uIDMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lucHV0L2V2ZW50LWNvZGVzLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQvZXZlbnQtY29kZXMudHh0CmluZGV4IGM1ODdhOTYuLjk2NzA1NjEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5wdXQvZXZlbnQtY29kZXMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQvZXZlbnQtY29kZXMudHh0CkBAIC0yOTQsNiArMjk0LDEyIEBACiBUaGUga2VybmVsIGRvZXMgbm90IHByb3ZpZGUgYnV0dG9uIGVtdWxhdGlvbiBmb3Igc3VjaCBkZXZpY2VzIGJ1dCB0cmVhdHMKIHRoZW0gYXMgYW55IG90aGVyIElOUFVUX1BST1BfQlVUVE9OUEFEIGRldmljZS4KIAorSU5QVVRfUFJPUF9BQ0NFTEVST01FVEVSCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitEaXJlY3Rpb25hbCBheGVzIG9uIHRoaXMgZGV2aWNlIChhYnNvbHV0ZSBhbmQvb3IgcmVsYXRpdmUgeCwgeSwgeikgcmVwcmVzZW50CithY2NlbGVyb21ldGVyIGRhdGEuIEFsbCBvdGhlciBheGVzIHJldGFpbiB0aGVpciBtZWFuaW5nLiBBIGRldmljZSBtdXN0IG5vdCBtaXgKK3JlZ3VsYXIgZGlyZWN0aW9uYWwgYXhlcyBhbmQgYWNjZWxlcm9tZXRlciBheGVzIG9uIHRoZSBzYW1lIGV2ZW50IG5vZGUuCisKIEd1aWRlbGluZXM6CiA9PT09PT09PT09CiBUaGUgZ3VpZGVsaW5lcyBiZWxvdyBlbnN1cmUgcHJvcGVyIHNpbmdsZS10b3VjaCBhbmQgbXVsdGktZmluZ2VyIGZ1bmN0aW9uYWxpdHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2lucHV0L211bHRpLXRvdWNoLXByb3RvY29sLnR4dCBiL0RvY3VtZW50YXRpb24vaW5wdXQvbXVsdGktdG91Y2gtcHJvdG9jb2wudHh0CmluZGV4IDdiNGY1OWMuLmI4NWQwMDAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaW5wdXQvbXVsdGktdG91Y2gtcHJvdG9jb2wudHh0CisrKyBiL0RvY3VtZW50YXRpb24vaW5wdXQvbXVsdGktdG91Y2gtcHJvdG9jb2wudHh0CkBAIC0zMTIsOSArMzEyLDEyIEBACiAKIFRoZSB0eXBlIG9mIGFwcHJvYWNoaW5nIHRvb2wuIEEgbG90IG9mIGtlcm5lbCBkcml2ZXJzIGNhbm5vdCBkaXN0aW5ndWlzaAogYmV0d2VlbiBkaWZmZXJlbnQgdG9vbCB0eXBlcywgc3VjaCBhcyBhIGZpbmdlciBvciBhIHBlbi4gSW4gc3VjaCBjYXNlcywgdGhlCi1ldmVudCBzaG91bGQgYmUgb21pdHRlZC4gVGhlIHByb3RvY29sIGN1cnJlbnRseSBzdXBwb3J0cyBNVF9UT09MX0ZJTkdFUiBhbmQKLU1UX1RPT0xfUEVOIFsyXS4gRm9yIHR5cGUgQiBkZXZpY2VzLCB0aGlzIGV2ZW50IGlzIGhhbmRsZWQgYnkgaW5wdXQgY29yZTsKLWRyaXZlcnMgc2hvdWxkIGluc3RlYWQgdXNlIGlucHV0X210X3JlcG9ydF9zbG90X3N0YXRlKCkuCitldmVudCBzaG91bGQgYmUgb21pdHRlZC4gVGhlIHByb3RvY29sIGN1cnJlbnRseSBzdXBwb3J0cyBNVF9UT09MX0ZJTkdFUiwKK01UX1RPT0xfUEVOLCBhbmQgTVRfVE9PTF9QQUxNIFsyXS4gRm9yIHR5cGUgQiBkZXZpY2VzLCB0aGlzIGV2ZW50IGlzIGhhbmRsZWQKK2J5IGlucHV0IGNvcmU7IGRyaXZlcnMgc2hvdWxkIGluc3RlYWQgdXNlIGlucHV0X210X3JlcG9ydF9zbG90X3N0YXRlKCkuCitBIGNvbnRhY3QncyBBQlNfTVRfVE9PTF9UWVBFIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIHdoaWxlIHN0aWxsIHRvdWNoaW5nIHRoZQorZGV2aWNlLCBiZWNhdXNlIHRoZSBmaXJtd2FyZSBtYXkgbm90IGJlIGFibGUgdG8gZGV0ZXJtaW5lIHdoaWNoIHRvb2wgaXMgYmVpbmcKK3VzZWQgd2hlbiBpdCBmaXJzdCBhcHBlYXJzLgogCiBBQlNfTVRfQkxPQl9JRAogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IGJmY2IxYTYuLjQ5MWJiZDEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC0xMDM2LDcgKzEwMzYsNyBAQAogCQkJRm9ybWF0OiB7Im9mZiIgfCAib24iIHwgInNraXBbbWJyXSJ9CiAKIAllZmk9CQlbRUZJXQotCQkJRm9ybWF0OiB7ICJvbGRfbWFwIiwgIm5vY2h1bmsiLCAibm9ydW50aW1lIiB9CisJCQlGb3JtYXQ6IHsgIm9sZF9tYXAiLCAibm9jaHVuayIsICJub3J1bnRpbWUiLCAiZGVidWciIH0KIAkJCW9sZF9tYXAgW1g4Ni02NF06IHN3aXRjaCB0byB0aGUgb2xkIGlvcmVtYXAtYmFzZWQgRUZJCiAJCQlydW50aW1lIHNlcnZpY2VzIG1hcHBpbmcuIDMyLWJpdCBzdGlsbCB1c2VzIHRoaXMgb25lIGJ5CiAJCQlkZWZhdWx0LgpAQCAtMTA0NCw2ICsxMDQ0LDcgQEAKIAkJCWJvb3Qgc3R1YiwgYXMgY2h1bmtpbmcgY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggc29tZQogCQkJZmlybXdhcmUgaW1wbGVtZW50YXRpb25zLgogCQkJbm9ydW50aW1lIDogZGlzYWJsZSBFRkkgcnVudGltZSBzZXJ2aWNlcyBzdXBwb3J0CisJCQlkZWJ1ZzogZW5hYmxlIG1pc2MgZGVidWcgb3V0cHV0CiAKIAllZmlfbm9fc3RvcmFnZV9wYXJhbm9pYSBbRUZJOyBYODZdCiAJCQlVc2luZyB0aGlzIHBhcmFtZXRlciB5b3UgY2FuIHVzZSBtb3JlIHRoYW4gNTAlIG9mCkBAIC0xOTg4LDcgKzE5ODksNyBAQAogCQkJc2Vjb25kcy4gIFVzZSB0aGlzIHBhcmFtZXRlciB0byBjaGVjayBhdCBzb21lCiAJCQlvdGhlciByYXRlLiAgMCBkaXNhYmxlcyBwZXJpb2RpYyBjaGVja2luZy4KIAotCW1lbXRlc3Q9CVtLTkwsWDg2XSBFbmFibGUgbWVtdGVzdAorCW1lbXRlc3Q9CVtLTkwsWDg2LEFSTV0gRW5hYmxlIG1lbXRlc3QKIAkJCUZvcm1hdDogPGludGVnZXI+CiAJCQlkZWZhdWx0IDogMCA8ZGlzYWJsZT4KIAkJCVNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1lbXRlc3QgcGFzc2VzIHRvIGJlCkBAIC0yMjM1LDggKzIyMzYsOSBAQAogCiAJbm1pX3dhdGNoZG9nPQlbS05MLEJVR1M9WDg2XSBEZWJ1Z2dpbmcgZmVhdHVyZXMgZm9yIFNNUCBrZXJuZWxzCiAJCQlGb3JtYXQ6IFtwYW5pYyxdW25vcGFuaWMsXVtudW1dCi0JCQlWYWxpZCBudW06IDAKKwkJCVZhbGlkIG51bTogMCBvciAxCiAJCQkwIC0gdHVybiBubWlfd2F0Y2hkb2cgb2ZmCisJCQkxIC0gdHVybiBubWlfd2F0Y2hkb2cgb24KIAkJCVdoZW4gcGFuaWMgaXMgc3BlY2lmaWVkLCBwYW5pYyB3aGVuIGFuIE5NSSB3YXRjaGRvZwogCQkJdGltZW91dCBvY2N1cnMgKG9yICdub3BhbmljJyB0byBvdmVycmlkZSB0aGUgb3Bwb3NpdGUKIAkJCWRlZmF1bHQpLgpAQCAtMjMyMSw2ICsyMzIzLDggQEAKIAkJCXJlZ2lzdGVyIHNhdmUgYW5kIHJlc3RvcmUuIFRoZSBrZXJuZWwgd2lsbCBvbmx5IHNhdmUKIAkJCWxlZ2FjeSBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMgb24gdGFzayBzd2l0Y2guCiAKKwlub2h1Z2Vpb21hcAlbS05MLHg4Nl0gRGlzYWJsZSBrZXJuZWwgaHVnZSBJL08gbWFwcGluZ3MuCisKIAlub3hzYXZlCQlbQlVHUz1YODZdIERpc2FibGVzIHg4NiBleHRlbmRlZCByZWdpc3RlciBzdGF0ZSBzYXZlCiAJCQlhbmQgcmVzdG9yZSB1c2luZyB4c2F2ZS4gVGhlIGtlcm5lbCB3aWxsIGZhbGxiYWNrIHRvCiAJCQllbmFibGluZyBsZWdhY3kgZmxvYXRpbmctcG9pbnQgYW5kIHNzZSBzdGF0ZS4KQEAgLTI0NjMsNyArMjQ2Nyw4IEBACiAKIAlub3VzYgkJW1VTQl0gRGlzYWJsZSB0aGUgVVNCIHN1YnN5c3RlbQogCi0Jbm93YXRjaGRvZwlbS05MXSBEaXNhYmxlIHRoZSBsb2NrdXAgZGV0ZWN0b3IgKE5NSSB3YXRjaGRvZykuCisJbm93YXRjaGRvZwlbS05MXSBEaXNhYmxlIGJvdGggbG9ja3VwIGRldGVjdG9ycywgaS5lLgorICAgICAgICAgICAgICAgICAgICAgICAgc29mdC1sb2NrdXAgYW5kIE5NSSB3YXRjaGRvZyAoaGFyZC1sb2NrdXApLgogCiAJbm93YgkJW0FSTV0KIApAQCAtMjk2OCw2ICsyOTczLDEyIEBACiAJCQlTZXQgbWF4aW11bSBudW1iZXIgb2YgZmluaXNoZWQgUkNVIGNhbGxiYWNrcyB0bwogCQkJcHJvY2VzcyBpbiBvbmUgYmF0Y2guCiAKKwlyY3V0cmVlLmdwX2luaXRfZGVsYXk9CVtLTkxdCisJCQlTZXQgdGhlIG51bWJlciBvZiBqaWZmaWVzIHRvIGRlbGF5IGVhY2ggc3RlcCBvZgorCQkJUkNVIGdyYWNlLXBlcmlvZCBpbml0aWFsaXphdGlvbi4gIFRoaXMgb25seSBoYXMKKwkJCWVmZmVjdCB3aGVuIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUX1NMT1dfSU5JVCBpcworCQkJc2V0LgorCiAJcmN1dHJlZS5yY3VfZmFub3V0X2xlYWY9IFtLTkxdCiAJCQlJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIENQVXMgYXNzaWduZWQgdG8gZWFjaAogCQkJbGVhZiByY3Vfbm9kZSBzdHJ1Y3R1cmUuICBVc2VmdWwgZm9yIHZlcnkgbGFyZ2UKQEAgLTI5OTEsMTEgKzMwMDIsMTUgQEAKIAkJCXZhbHVlIGlzIG9uZSwgYW5kIG1heGltdW0gdmFsdWUgaXMgSFouCiAKIAlyY3V0cmVlLmt0aHJlYWRfcHJpbz0gCSBbS05MLEJPT1RdCi0JCQlTZXQgdGhlIFNDSEVEX0ZJRk8gcHJpb3JpdHkgb2YgdGhlIFJDVQotCQkJcGVyLUNQVSBrdGhyZWFkcyAocmN1Yy9OKS4gVGhpcyB2YWx1ZSBpcyBhbHNvCi0JCQl1c2VkIGZvciB0aGUgcHJpb3JpdHkgb2YgdGhlIFJDVSBib29zdCB0aHJlYWRzCi0JCQkocmN1Yi9OKS4gVmFsaWQgdmFsdWVzIGFyZSAxLTk5IGFuZCB0aGUgZGVmYXVsdAotCQkJaXMgMSAodGhlIGxlYXN0LWZhdm9yZWQgcHJpb3JpdHkpLgorCQkJU2V0IHRoZSBTQ0hFRF9GSUZPIHByaW9yaXR5IG9mIHRoZSBSQ1UgcGVyLUNQVQorCQkJa3RocmVhZHMgKHJjdWMvTikuIFRoaXMgdmFsdWUgaXMgYWxzbyB1c2VkIGZvcgorCQkJdGhlIHByaW9yaXR5IG9mIHRoZSBSQ1UgYm9vc3QgdGhyZWFkcyAocmN1Yi9OKQorCQkJYW5kIGZvciB0aGUgUkNVIGdyYWNlLXBlcmlvZCBrdGhyZWFkcyAocmN1X2JoLAorCQkJcmN1X3ByZWVtcHQsIGFuZCByY3Vfc2NoZWQpLiBJZiBSQ1VfQk9PU1QgaXMKKwkJCXNldCwgdmFsaWQgdmFsdWVzIGFyZSAxLTk5IGFuZCB0aGUgZGVmYXVsdCBpcyAxCisJCQkodGhlIGxlYXN0LWZhdm9yZWQgcHJpb3JpdHkpLiAgT3RoZXJ3aXNlLCB3aGVuCisJCQlSQ1VfQk9PU1QgaXMgbm90IHNldCwgdmFsaWQgdmFsdWVzIGFyZSAwLTk5IGFuZAorCQkJdGhlIGRlZmF1bHQgaXMgemVybyAobm9uLXJlYWx0aW1lIG9wZXJhdGlvbikuCiAKIAlyY3V0cmVlLnJjdV9ub2NiX2xlYWRlcl9zdHJpZGU9IFtLTkxdCiAJCQlTZXQgdGhlIG51bWJlciBvZiBOT0NCIGt0aHJlYWQgZ3JvdXBzLCB3aGljaApAQCAtMzQ2Miw2ICszNDc3LDEzIEBACiAJCQlpbXByb3ZlIHRocm91Z2hwdXQsIGJ1dCB3aWxsIGFsc28gaW5jcmVhc2UgdGhlCiAJCQlhbW91bnQgb2YgbWVtb3J5IHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGNsaWVudC4KIAorCXN1c3BlbmQucG1fdGVzdF9kZWxheT0KKwkJCVtTVVNQRU5EXQorCQkJU2V0cyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gcmVtYWluIGluIGEgc3VzcGVuZCB0ZXN0CisJCQltb2RlIGJlZm9yZSByZXN1bWluZyB0aGUgc3lzdGVtIChzZWUKKwkJCS9zeXMvcG93ZXIvcG1fdGVzdCkuIE9ubHkgYXZhaWxhYmxlIHdoZW4gQ09ORklHX1BNX0RFQlVHCisJCQlpcyBzZXQuIERlZmF1bHQgdmFsdWUgaXMgNS4KKwogCXN3YXBhY2NvdW50PVswfDFdCiAJCQlbS05MXSBFbmFibGUgYWNjb3VudGluZyBvZiBzd2FwIGluIG1lbW9yeSByZXNvdXJjZQogCQkJY29udHJvbGxlciBpZiBubyBwYXJhbWV0ZXIgb3IgMSBpcyBnaXZlbiBvciBkaXNhYmxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wZXItQ1BVLWt0aHJlYWRzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBlci1DUFUta3RocmVhZHMudHh0CmluZGV4IGYzY2QyOTkuLmY0Y2JmZTAgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBlci1DUFUta3RocmVhZHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBlci1DUFUta3RocmVhZHMudHh0CkBAIC0xOTAsMjAgKzE5MCwyNCBAQAogCQlvbiBlYWNoIENQVSwgaW5jbHVkaW5nIGNzX2Ric190aW1lcigpIGFuZCBvZF9kYnNfdGltZXIoKS4KIAkJV0FSTklORzogIFBsZWFzZSBjaGVjayB5b3VyIENQVSBzcGVjaWZpY2F0aW9ucyB0bwogCQltYWtlIHN1cmUgdGhhdCB0aGlzIGlzIHNhZmUgb24geW91ciBwYXJ0aWN1bGFyIHN5c3RlbS4KLQlkLglJdCBpcyBub3QgcG9zc2libGUgdG8gZW50aXJlbHkgZ2V0IHJpZCBvZiBPUyBqaXR0ZXIKLQkJZnJvbSB2bXN0YXRfdXBkYXRlKCkgb24gQ09ORklHX1NNUD15IHN5c3RlbXMsIGJ1dCB5b3UKLQkJY2FuIGRlY3JlYXNlIGl0cyBmcmVxdWVuY3kgYnkgd3JpdGluZyBhIGxhcmdlIHZhbHVlCi0JCXRvIC9wcm9jL3N5cy92bS9zdGF0X2ludGVydmFsLglUaGUgZGVmYXVsdCB2YWx1ZSBpcwotCQlIWiwgZm9yIGFuIGludGVydmFsIG9mIG9uZSBzZWNvbmQuICBPZiBjb3Vyc2UsIGxhcmdlcgotCQl2YWx1ZXMgd2lsbCBtYWtlIHlvdXIgdmlydHVhbC1tZW1vcnkgc3RhdGlzdGljcyB1cGRhdGUKLQkJbW9yZSBzbG93bHkuICBPZiBjb3Vyc2UsIHlvdSBjYW4gYWxzbyBydW4geW91ciB3b3JrbG9hZAotCQlhdCBhIHJlYWwtdGltZSBwcmlvcml0eSwgdGh1cyBwcmVlbXB0aW5nIHZtc3RhdF91cGRhdGUoKSwKKwlkLglBcyBvZiB2My4xOCwgQ2hyaXN0b3BoIExhbWV0ZXIncyBvbi1kZW1hbmQgdm1zdGF0IHdvcmtlcnMKKwkJY29tbWl0IHByZXZlbnRzIE9TIGppdHRlciBkdWUgdG8gdm1zdGF0X3VwZGF0ZSgpIG9uCisJCUNPTkZJR19TTVA9eSBzeXN0ZW1zLiAgQmVmb3JlIHYzLjE4LCBpcyBub3QgcG9zc2libGUKKwkJdG8gZW50aXJlbHkgZ2V0IHJpZCBvZiB0aGUgT1Mgaml0dGVyLCBidXQgeW91IGNhbgorCQlkZWNyZWFzZSBpdHMgZnJlcXVlbmN5IGJ5IHdyaXRpbmcgYSBsYXJnZSB2YWx1ZSB0bworCQkvcHJvYy9zeXMvdm0vc3RhdF9pbnRlcnZhbC4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIEhaLAorCQlmb3IgYW4gaW50ZXJ2YWwgb2Ygb25lIHNlY29uZC4JT2YgY291cnNlLCBsYXJnZXIgdmFsdWVzCisJCXdpbGwgbWFrZSB5b3VyIHZpcnR1YWwtbWVtb3J5IHN0YXRpc3RpY3MgdXBkYXRlIG1vcmUKKwkJc2xvd2x5LiAgT2YgY291cnNlLCB5b3UgY2FuIGFsc28gcnVuIHlvdXIgd29ya2xvYWQgYXQKKwkJYSByZWFsLXRpbWUgcHJpb3JpdHksIHRodXMgcHJlZW1wdGluZyB2bXN0YXRfdXBkYXRlKCksCiAJCWJ1dCBpZiB5b3VyIHdvcmtsb2FkIGlzIENQVS1ib3VuZCwgdGhpcyBpcyBhIGJhZCBpZGVhLgogCQlIb3dldmVyLCB0aGVyZSBpcyBhbiBSRkMgcGF0Y2ggZnJvbSBDaHJpc3RvcGggTGFtZXRlcgogCQkoYmFzZWQgb24gYW4gZWFybGllciBvbmUgZnJvbSBHaWxhZCBCZW4tWW9zc2VmKSB0aGF0CiAJCXJlZHVjZXMgb3IgZXZlbiBlbGltaW5hdGVzIHZtc3RhdCBvdmVyaGVhZCBmb3Igc29tZQogCQl3b3JrbG9hZHMgYXQgaHR0cHM6Ly9sa21sLm9yZy9sa21sLzIwMTMvOS80LzM3OS4KLQllLglJZiBydW5uaW5nIG9uIGhpZ2gtZW5kIHBvd2VycGMgc2VydmVycywgYnVpbGQgd2l0aAorCWUuCUJvb3Qgd2l0aCAiZWxldmF0b3I9bm9vcCIgdG8gYXZvaWQgd29ya3F1ZXVlIHVzZSBieQorCQl0aGUgYmxvY2sgbGF5ZXIuCisJZi4JSWYgcnVubmluZyBvbiBoaWdoLWVuZCBwb3dlcnBjIHNlcnZlcnMsIGJ1aWxkIHdpdGgKIAkJQ09ORklHX1BQQ19SVEFTX0RBRU1PTj1uLiAgVGhpcyBwcmV2ZW50cyB0aGUgUlRBUwogCQlkYWVtb24gZnJvbSBydW5uaW5nIG9uIGVhY2ggQ1BVIGV2ZXJ5IHNlY29uZCBvciBzby4KIAkJKFRoaXMgd2lsbCByZXF1aXJlIGVkaXRpbmcgS2NvbmZpZyBmaWxlcyBhbmQgd2lsbCBkZWZlYXQKQEAgLTIxMSwxMiArMjE1LDEyIEBACiAJCWR1ZSB0byB0aGUgcnRhc19ldmVudF9zY2FuKCkgZnVuY3Rpb24uCiAJCVdBUk5JTkc6ICBQbGVhc2UgY2hlY2sgeW91ciBDUFUgc3BlY2lmaWNhdGlvbnMgdG8KIAkJbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBzYWZlIG9uIHlvdXIgcGFydGljdWxhciBzeXN0ZW0uCi0JZi4JSWYgcnVubmluZyBvbiBDZWxsIFByb2Nlc3NvciwgYnVpbGQgeW91ciBrZXJuZWwgd2l0aAorCWcuCUlmIHJ1bm5pbmcgb24gQ2VsbCBQcm9jZXNzb3IsIGJ1aWxkIHlvdXIga2VybmVsIHdpdGgKIAkJQ0JFX0NQVUZSRVFfU1BVX0dPVkVSTk9SPW4gdG8gYXZvaWQgT1Mgaml0dGVyIGZyb20KIAkJc3B1X2dvdl93b3JrKCkuCiAJCVdBUk5JTkc6ICBQbGVhc2UgY2hlY2sgeW91ciBDUFUgc3BlY2lmaWNhdGlvbnMgdG8KIAkJbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBzYWZlIG9uIHlvdXIgcGFydGljdWxhciBzeXN0ZW0uCi0JZy4JSWYgcnVubmluZyBvbiBQb3dlck1BQywgYnVpbGQgeW91ciBrZXJuZWwgd2l0aAorCWguCUlmIHJ1bm5pbmcgb24gUG93ZXJNQUMsIGJ1aWxkIHlvdXIga2VybmVsIHdpdGgKIAkJQ09ORklHX1BNQUNfUkFDS01FVEVSPW4gdG8gZGlzYWJsZSB0aGUgQ1BVLW1ldGVyLAogCQlhdm9pZGluZyBPUyBqaXR0ZXIgZnJvbSByYWNrbWV0ZXJfZG9fdGltZXIoKS4KIApAQCAtMjU4LDggKzI2MiwxMiBAQAogVG8gcmVkdWNlIGl0cyBPUyBqaXR0ZXIsIGRvIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nOgogMS4JQnVpbGQgd2l0aCBDT05GSUdfTE9DS1VQX0RFVEVDVE9SPW4sIHdoaWNoIHdpbGwgcHJldmVudCB0aGVzZQogCWt0aHJlYWRzIGZyb20gYmVpbmcgY3JlYXRlZCBpbiB0aGUgZmlyc3QgcGxhY2UuCi0yLglFY2hvIGEgemVybyB0byAvcHJvYy9zeXMva2VybmVsL3dhdGNoZG9nIHRvIGRpc2FibGUgdGhlCisyLglCb290IHdpdGggIm5vc29mdGxvY2t1cD0wIiwgd2hpY2ggd2lsbCBhbHNvIHByZXZlbnQgdGhlc2Uga3RocmVhZHMKKwlmcm9tIGJlaW5nIGNyZWF0ZWQuICBPdGhlciByZWxhdGVkIHdhdGNoZG9nIGFuZCBzb2Z0bG9ja3VwIGJvb3QKKwlwYXJhbWV0ZXJzIG1heSBiZSBmb3VuZCBpbiBEb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorCWFuZCBEb2N1bWVudGF0aW9uL3dhdGNoZG9nL3dhdGNoZG9nLXBhcmFtZXRlcnMudHh0LgorMy4JRWNobyBhIHplcm8gdG8gL3Byb2Mvc3lzL2tlcm5lbC93YXRjaGRvZyB0byBkaXNhYmxlIHRoZQogCXdhdGNoZG9nIHRpbWVyLgotMy4JRWNobyBhIGxhcmdlIG51bWJlciBvZiAvcHJvYy9zeXMva2VybmVsL3dhdGNoZG9nX3RocmVzaCBpbgorNC4JRWNobyBhIGxhcmdlIG51bWJlciBvZiAvcHJvYy9zeXMva2VybmVsL3dhdGNoZG9nX3RocmVzaCBpbgogCW9yZGVyIHRvIHJlZHVjZSB0aGUgZnJlcXVlbmN5IG9mIE9TIGppdHRlciBkdWUgdG8gdGhlIHdhdGNoZG9nCiAJdGltZXIgZG93biB0byBhIGxldmVsIHRoYXQgaXMgYWNjZXB0YWJsZSBmb3IgeW91ciB3b3JrbG9hZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbGVkcy9sZWRzLWNsYXNzLWZsYXNoLnR4dCBiL0RvY3VtZW50YXRpb24vbGVkcy9sZWRzLWNsYXNzLWZsYXNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWJiNjczCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHMtY2xhc3MtZmxhc2gudHh0CkBAIC0wLDAgKzEsMjIgQEAKKworRmxhc2ggTEVEIGhhbmRsaW5nIHVuZGVyIExpbnV4Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU29tZSBMRUQgZGV2aWNlcyBwcm92aWRlIHR3byBtb2RlcyAtIHRvcmNoIGFuZCBmbGFzaC4gSW4gdGhlIExFRCBzdWJzeXN0ZW0KK3Rob3NlIG1vZGVzIGFyZSBzdXBwb3J0ZWQgYnkgTEVEIGNsYXNzIChzZWUgRG9jdW1lbnRhdGlvbi9sZWRzL2xlZHMtY2xhc3MudHh0KQorYW5kIExFRCBGbGFzaCBjbGFzcyByZXNwZWN0aXZlbHkuIFRoZSB0b3JjaCBtb2RlIHJlbGF0ZWQgZmVhdHVyZXMgYXJlIGVuYWJsZWQKK2J5IGRlZmF1bHQgYW5kIHRoZSBmbGFzaCBvbmVzIG9ubHkgaWYgYSBkcml2ZXIgZGVjbGFyZXMgaXQgYnkgc2V0dGluZworTEVEX0RFVl9DQVBfRkxBU0ggZmxhZy4KKworSW4gb3JkZXIgdG8gZW5hYmxlIHRoZSBzdXBwb3J0IGZvciBmbGFzaCBMRURzIENPTkZJR19MRURTX0NMQVNTX0ZMQVNIIHN5bWJvbAorbXVzdCBiZSBkZWZpbmVkIGluIHRoZSBrZXJuZWwgY29uZmlnLiBBIExFRCBGbGFzaCBjbGFzcyBkcml2ZXIgbXVzdCBiZQorcmVnaXN0ZXJlZCBpbiB0aGUgTEVEIHN1YnN5c3RlbSB3aXRoIGxlZF9jbGFzc2Rldl9mbGFzaF9yZWdpc3RlciBmdW5jdGlvbi4KKworRm9sbG93aW5nIHN5c2ZzIGF0dHJpYnV0ZXMgYXJlIGV4cG9zZWQgZm9yIGNvbnRyb2xsaW5nIGZsYXNoIExFRCBkZXZpY2VzOgorKHNlZSBEb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWNsYXNzLWxlZC1mbGFzaCkKKwktIGZsYXNoX2JyaWdodG5lc3MKKwktIG1heF9mbGFzaF9icmlnaHRuZXNzCisJLSBmbGFzaF90aW1lb3V0CisJLSBtYXhfZmxhc2hfdGltZW91dAorCS0gZmxhc2hfc3Ryb2JlCisJLSBmbGFzaF9mYXVsdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CmluZGV4IGNhMjM4N2UuLjY5NzRmMWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKQEAgLTU5Miw5ICs1OTIsOSBAQAogQ09OVFJPTCBERVBFTkRFTkNJRVMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUEgY29udHJvbCBkZXBlbmRlbmN5IHJlcXVpcmVzIGEgZnVsbCByZWFkIG1lbW9yeSBiYXJyaWVyLCBub3Qgc2ltcGx5IGEgZGF0YQotZGVwZW5kZW5jeSBiYXJyaWVyIHRvIG1ha2UgaXQgd29yayBjb3JyZWN0bHkuICBDb25zaWRlciB0aGUgZm9sbG93aW5nIGJpdCBvZgotY29kZToKK0EgbG9hZC1sb2FkIGNvbnRyb2wgZGVwZW5kZW5jeSByZXF1aXJlcyBhIGZ1bGwgcmVhZCBtZW1vcnkgYmFycmllciwgbm90CitzaW1wbHkgYSBkYXRhIGRlcGVuZGVuY3kgYmFycmllciB0byBtYWtlIGl0IHdvcmsgY29ycmVjdGx5LiAgQ29uc2lkZXIgdGhlCitmb2xsb3dpbmcgYml0IG9mIGNvZGU6CiAKIAlxID0gQUNDRVNTX09OQ0UoYSk7CiAJaWYgKHEpIHsKQEAgLTYxNSwxNCArNjE1LDE1IEBACiAJfQogCiBIb3dldmVyLCBzdG9yZXMgYXJlIG5vdCBzcGVjdWxhdGVkLiAgVGhpcyBtZWFucyB0aGF0IG9yZGVyaW5nIC1pcy0gcHJvdmlkZWQKLWluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKK2ZvciBsb2FkLXN0b3JlIGNvbnRyb2wgZGVwZW5kZW5jaWVzLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CiAKIAlxID0gQUNDRVNTX09OQ0UoYSk7CiAJaWYgKHEpIHsKIAkJQUNDRVNTX09OQ0UoYikgPSBwOwogCX0KIAotUGxlYXNlIG5vdGUgdGhhdCBBQ0NFU1NfT05DRSgpIGlzIG5vdCBvcHRpb25hbCEgIFdpdGhvdXQgdGhlCitDb250cm9sIGRlcGVuZGVuY2llcyBwYWlyIG5vcm1hbGx5IHdpdGggb3RoZXIgdHlwZXMgb2YgYmFycmllcnMuCitUaGF0IHNhaWQsIHBsZWFzZSBub3RlIHRoYXQgQUNDRVNTX09OQ0UoKSBpcyBub3Qgb3B0aW9uYWwhICBXaXRob3V0IHRoZQogQUNDRVNTX09OQ0UoKSwgbWlnaHQgY29tYmluZSB0aGUgbG9hZCBmcm9tICdhJyB3aXRoIG90aGVyIGxvYWRzIGZyb20KICdhJywgYW5kIHRoZSBzdG9yZSB0byAnYicgd2l0aCBvdGhlciBzdG9yZXMgdG8gJ2InLCB3aXRoIHBvc3NpYmxlIGhpZ2hseQogY291bnRlcmludHVpdGl2ZSBlZmZlY3RzIG9uIG9yZGVyaW5nLgpAQCAtODEzLDYgKzgxNCw4IEBACiAgICAgICBiYXJyaWVyKCkgY2FuIGhlbHAgdG8gcHJlc2VydmUgeW91ciBjb250cm9sIGRlcGVuZGVuY3kuICBQbGVhc2UKICAgICAgIHNlZSB0aGUgQ29tcGlsZXIgQmFycmllciBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgogCisgICgqKSBDb250cm9sIGRlcGVuZGVuY2llcyBwYWlyIG5vcm1hbGx5IHdpdGggb3RoZXIgdHlwZXMgb2YgYmFycmllcnMuCisKICAgKCopIENvbnRyb2wgZGVwZW5kZW5jaWVzIGRvIC1ub3QtIHByb3ZpZGUgdHJhbnNpdGl2aXR5LiAgSWYgeW91CiAgICAgICBuZWVkIHRyYW5zaXRpdml0eSwgdXNlIHNtcF9tYigpLgogCkBAIC04MjMsMTQgKzgyNiwxNCBAQAogV2hlbiBkZWFsaW5nIHdpdGggQ1BVLUNQVSBpbnRlcmFjdGlvbnMsIGNlcnRhaW4gdHlwZXMgb2YgbWVtb3J5IGJhcnJpZXIgc2hvdWxkCiBhbHdheXMgYmUgcGFpcmVkLiAgQSBsYWNrIG9mIGFwcHJvcHJpYXRlIHBhaXJpbmcgaXMgYWxtb3N0IGNlcnRhaW5seSBhbiBlcnJvci4KIAotR2VuZXJhbCBiYXJyaWVycyBwYWlyIHdpdGggZWFjaCBvdGhlciwgdGhvdWdoIHRoZXkgYWxzbyBwYWlyIHdpdGgKLW1vc3Qgb3RoZXIgdHlwZXMgb2YgYmFycmllcnMsIGFsYmVpdCB3aXRob3V0IHRyYW5zaXRpdml0eS4gIEFuIGFjcXVpcmUKLWJhcnJpZXIgcGFpcnMgd2l0aCBhIHJlbGVhc2UgYmFycmllciwgYnV0IGJvdGggbWF5IGFsc28gcGFpciB3aXRoIG90aGVyCi1iYXJyaWVycywgaW5jbHVkaW5nIG9mIGNvdXJzZSBnZW5lcmFsIGJhcnJpZXJzLiAgQSB3cml0ZSBiYXJyaWVyIHBhaXJzCi13aXRoIGEgZGF0YSBkZXBlbmRlbmN5IGJhcnJpZXIsIGFuIGFjcXVpcmUgYmFycmllciwgYSByZWxlYXNlIGJhcnJpZXIsCi1hIHJlYWQgYmFycmllciwgb3IgYSBnZW5lcmFsIGJhcnJpZXIuICBTaW1pbGFybHkgYSByZWFkIGJhcnJpZXIgb3IgYQotZGF0YSBkZXBlbmRlbmN5IGJhcnJpZXIgcGFpcnMgd2l0aCBhIHdyaXRlIGJhcnJpZXIsIGFuIGFjcXVpcmUgYmFycmllciwKLWEgcmVsZWFzZSBiYXJyaWVyLCBvciBhIGdlbmVyYWwgYmFycmllcjoKK0dlbmVyYWwgYmFycmllcnMgcGFpciB3aXRoIGVhY2ggb3RoZXIsIHRob3VnaCB0aGV5IGFsc28gcGFpciB3aXRoIG1vc3QKK290aGVyIHR5cGVzIG9mIGJhcnJpZXJzLCBhbGJlaXQgd2l0aG91dCB0cmFuc2l0aXZpdHkuICBBbiBhY3F1aXJlIGJhcnJpZXIKK3BhaXJzIHdpdGggYSByZWxlYXNlIGJhcnJpZXIsIGJ1dCBib3RoIG1heSBhbHNvIHBhaXIgd2l0aCBvdGhlciBiYXJyaWVycywKK2luY2x1ZGluZyBvZiBjb3Vyc2UgZ2VuZXJhbCBiYXJyaWVycy4gIEEgd3JpdGUgYmFycmllciBwYWlycyB3aXRoIGEgZGF0YQorZGVwZW5kZW5jeSBiYXJyaWVyLCBhIGNvbnRyb2wgZGVwZW5kZW5jeSwgYW4gYWNxdWlyZSBiYXJyaWVyLCBhIHJlbGVhc2UKK2JhcnJpZXIsIGEgcmVhZCBiYXJyaWVyLCBvciBhIGdlbmVyYWwgYmFycmllci4gIFNpbWlsYXJseSBhIHJlYWQgYmFycmllciwKK2NvbnRyb2wgZGVwZW5kZW5jeSwgb3IgYSBkYXRhIGRlcGVuZGVuY3kgYmFycmllciBwYWlycyB3aXRoIGEgd3JpdGUKK2JhcnJpZXIsIGFuIGFjcXVpcmUgYmFycmllciwgYSByZWxlYXNlIGJhcnJpZXIsIG9yIGEgZ2VuZXJhbCBiYXJyaWVyOgogCiAJQ1BVIDEJCSAgICAgIENQVSAyCiAJPT09PT09PT09PT09PT09CSAgICAgID09PT09PT09PT09PT09PQpAQCAtODUwLDYgKzg1MywxOSBAQAogCQkJICAgICAgPGRhdGEgZGVwZW5kZW5jeSBiYXJyaWVyPgogCQkJICAgICAgeSA9ICp4OwogCitPciBldmVuOgorCisJQ1BVIDEJCSAgICAgIENQVSAyCisJPT09PT09PT09PT09PT09CSAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlyMSA9IEFDQ0VTU19PTkNFKHkpOworCTxnZW5lcmFsIGJhcnJpZXI+CisJQUNDRVNTX09OQ0UoeSkgPSAxOyAgIGlmIChyMiA9IEFDQ0VTU19PTkNFKHgpKSB7CisJCQkgICAgICAgICA8aW1wbGljaXQgY29udHJvbCBkZXBlbmRlbmN5PgorCQkJICAgICAgICAgQUNDRVNTX09OQ0UoeSkgPSAxOworCQkJICAgICAgfQorCisJYXNzZXJ0KHIxID09IDAgfHwgcjIgPT0gMCk7CisKIEJhc2ljYWxseSwgdGhlIHJlYWQgYmFycmllciBhbHdheXMgaGFzIHRvIGJlIHRoZXJlLCBldmVuIHRob3VnaCBpdCBjYW4gYmUgb2YKIHRoZSAid2Vha2VyIiB0eXBlLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvY2FuLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYW4udHh0CmluZGV4IDBhMjg1OWEuLjVhYmFkMWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYW4udHh0CkBAIC0yMiw3ICsyMiw4IEBACiAgICAgICA0LjEuMyBSQVcgc29ja2V0IG9wdGlvbiBDQU5fUkFXX0xPT1BCQUNLCiAgICAgICA0LjEuNCBSQVcgc29ja2V0IG9wdGlvbiBDQU5fUkFXX1JFQ1ZfT1dOX01TR1MKICAgICAgIDQuMS41IFJBVyBzb2NrZXQgb3B0aW9uIENBTl9SQVdfRkRfRlJBTUVTCi0gICAgICA0LjEuNiBSQVcgc29ja2V0IHJldHVybmVkIG1lc3NhZ2UgZmxhZ3MKKyAgICAgIDQuMS42IFJBVyBzb2NrZXQgb3B0aW9uIENBTl9SQVdfSk9JTl9GSUxURVJTCisgICAgICA0LjEuNyBSQVcgc29ja2V0IHJldHVybmVkIG1lc3NhZ2UgZmxhZ3MKICAgICA0LjIgQnJvYWRjYXN0IE1hbmFnZXIgcHJvdG9jb2wgc29ja2V0cyAoU09DS19ER1JBTSkKICAgICAgIDQuMi4xIEJyb2FkY2FzdCBNYW5hZ2VyIG9wZXJhdGlvbnMKICAgICAgIDQuMi4yIEJyb2FkY2FzdCBNYW5hZ2VyIG1lc3NhZ2UgZmxhZ3MKQEAgLTYwMSw3ICs2MDIsMjIgQEAKICAgQ0FOIEZEIGZyYW1lcyBieSBjaGVja2luZyBpZiB0aGUgZGV2aWNlIG1heGltdW0gdHJhbnNmZXIgdW5pdCBpcyBDQU5GRF9NVFUuCiAgIFRoZSBDQU4gZGV2aWNlIE1UVSBjYW4gYmUgcmV0cmlldmVkIGUuZy4gd2l0aCBhIFNJT0NHSUZNVFUgaW9jdGwoKSBzeXNjYWxsLgogCi0gIDQuMS42IFJBVyBzb2NrZXQgcmV0dXJuZWQgbWVzc2FnZSBmbGFncworICA0LjEuNiBSQVcgc29ja2V0IG9wdGlvbiBDQU5fUkFXX0pPSU5fRklMVEVSUworCisgIFRoZSBDQU5fUkFXIHNvY2tldCBjYW4gc2V0IG11bHRpcGxlIENBTiBpZGVudGlmaWVyIHNwZWNpZmljIGZpbHRlcnMgdGhhdAorICBsZWFkIHRvIG11bHRpcGxlIGZpbHRlcnMgaW4gdGhlIGFmX2Nhbi5jIGZpbHRlciBwcm9jZXNzaW5nLiBUaGVzZSBmaWx0ZXJzCisgIGFyZSBpbmRlbnBlbmRlbnQgZnJvbSBlYWNoIG90aGVyIHdoaWNoIGxlYWRzIHRvIGxvZ2ljYWwgT1InZWQgZmlsdGVycyB3aGVuCisgIGFwcGxpZWQgKHNlZSA0LjEuMSkuCisKKyAgVGhpcyBzb2NrZXQgb3B0aW9uIGpvaW5lcyB0aGUgZ2l2ZW4gQ0FOIGZpbHRlcnMgaW4gdGhlIHdheSB0aGF0IG9ubHkgQ0FOCisgIGZyYW1lcyBhcmUgcGFzc2VkIHRvIHVzZXIgc3BhY2UgdGhhdCBtYXRjaGVkICphbGwqIGdpdmVuIENBTiBmaWx0ZXJzLiBUaGUKKyAgc2VtYW50aWMgZm9yIHRoZSBhcHBsaWVkIGZpbHRlcnMgaXMgdGhlcmVmb3JlIGNoYW5nZWQgdG8gYSBsb2dpY2FsIEFORC4KKworICBUaGlzIGlzIHVzZWZ1bCBlc3BlY2lhbGx5IHdoZW4gdGhlIGZpbHRlcnNldCBpcyBhIGNvbWJpbmF0aW9uIG9mIGZpbHRlcnMKKyAgd2hlcmUgdGhlIENBTl9JTlZfRklMVEVSIGZsYWcgaXMgc2V0IGluIG9yZGVyIHRvIG5vdGNoIHNpbmdsZSBDQU4gSURzIG9yCisgIENBTiBJRCByYW5nZXMgZnJvbSB0aGUgaW5jb21pbmcgdHJhZmZpYy4KKworICA0LjEuNyBSQVcgc29ja2V0IHJldHVybmVkIG1lc3NhZ2UgZmxhZ3MKIAogICBXaGVuIHVzaW5nIHJlY3Ztc2coKSBjYWxsLCB0aGUgbXNnLT5tc2dfZmxhZ3MgbWF5IGNvbnRhaW4gZm9sbG93aW5nIGZsYWdzOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZmlsdGVyLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9maWx0ZXIudHh0CmluZGV4IDk5MzBlY2ZiLi4xMzU1ODFmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZmlsdGVyLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZmlsdGVyLnR4dApAQCAtMjgwLDcgKzI4MCw4IEBACiAgIHJ4aGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5oYXNoCiAgIGNwdSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKQogICB2bGFuX3RjaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYl92bGFuX3RhZ19nZXQoc2tiKQotICB2bGFuX3ByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikKKyAgdmxhbl9hdmFpbCAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2Jfdmxhbl90YWdfcHJlc2VudChza2IpCisgIHZsYW5fdHBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT52bGFuX3Byb3RvCiAgIHJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJhbmRvbV91MzIoKQogCiBUaGVzZSBleHRlbnNpb25zIGNhbiBhbHNvIGJlIHByZWZpeGVkIHdpdGggJyMnLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lnYi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaWdiLnR4dAppbmRleCA0M2QzNTQ5Li4xNTUzNGZkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaWdiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaWdiLnR4dApAQCAtNDIsMTAgKzQyLDEwIEBACiAgIEp1bWJvIEZyYW1lcwogICAtLS0tLS0tLS0tLS0KICAgSnVtYm8gRnJhbWVzIHN1cHBvcnQgaXMgZW5hYmxlZCBieSBjaGFuZ2luZyB0aGUgTVRVIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4KLSAgdGhlIGRlZmF1bHQgb2YgMTUwMC4gIFVzZSB0aGUgaWZjb25maWcgY29tbWFuZCB0byBpbmNyZWFzZSB0aGUgTVRVIHNpemUuCisgIHRoZSBkZWZhdWx0IG9mIDE1MDAuICBVc2UgdGhlIGlwIGNvbW1hbmQgdG8gaW5jcmVhc2UgdGhlIE1UVSBzaXplLgogICBGb3IgZXhhbXBsZToKIAotICAgICAgIGlmY29uZmlnIGV0aDx4PiBtdHUgOTAwMCB1cAorICAgICAgIGlwIGxpbmsgc2V0IGRldiBldGg8eD4gbXR1IDkwMDAKIAogICBUaGlzIHNldHRpbmcgaXMgbm90IHNhdmVkIGFjcm9zcyByZWJvb3RzLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CmluZGV4IDFiOGM5NjQuLjA3MWZiMTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CkBAIC0zODgsNiArMzg4LDE2IEBACiAJICAxIC0gRGlzYWJsZWQgYnkgZGVmYXVsdCwgZW5hYmxlZCB3aGVuIGFuIElDTVAgYmxhY2sgaG9sZSBkZXRlY3RlZAogCSAgMiAtIEFsd2F5cyBlbmFibGVkLCB1c2UgaW5pdGlhbCBNU1Mgb2YgdGNwX2Jhc2VfbXNzLgogCit0Y3BfcHJvYmVfaW50ZXJ2YWwgLSBJTlRFR0VSCisJQ29udHJvbHMgaG93IG9mdGVuIHRvIHN0YXJ0IFRDUCBQYWNrZXRpemF0aW9uLUxheWVyIFBhdGggTVRVCisJRGlzY292ZXJ5IHJlcHJvYmUuIFRoZSBkZWZhdWx0IGlzIHJlcHJvYmluZyBldmVyeSAxMCBtaW51dGVzIGFzCisJcGVyIFJGQzQ4MjEuCisKK3RjcF9wcm9iZV90aHJlc2hvbGQgLSBJTlRFR0VSCisJQ29udHJvbHMgd2hlbiBUQ1AgUGFja2V0aXphdGlvbi1MYXllciBQYXRoIE1UVSBEaXNjb3ZlcnkgcHJvYmluZworCXdpbGwgc3RvcCBpbiByZXNwZWN0IHRvIHRoZSB3aWR0aCBvZiBzZWFyY2ggcmFuZ2UgaW4gYnl0ZXMuIERlZmF1bHQKKwlpcyA4IGJ5dGVzLgorCiB0Y3Bfbm9fbWV0cmljc19zYXZlIC0gQk9PTEVBTgogCUJ5IGRlZmF1bHQsIFRDUCBzYXZlcyB2YXJpb3VzIGNvbm5lY3Rpb24gbWV0cmljcyBpbiB0aGUgcm91dGUgY2FjaGUKIAl3aGVuIHRoZSBjb25uZWN0aW9uIGNsb3Nlcywgc28gdGhhdCBjb25uZWN0aW9ucyBlc3RhYmxpc2hlZCBpbiB0aGUKQEAgLTExMTYsMTEgKzExMjYsMjMgQEAKIAlncmF0dWl0b3VzIGFycCBmcmFtZSwgdGhlIGFycCB0YWJsZSB3aWxsIGJlIHVwZGF0ZWQgcmVnYXJkbGVzcwogCWlmIHRoaXMgc2V0dGluZyBpcyBvbiBvciBvZmYuCiAKK21jYXN0X3NvbGljaXQgLSBJTlRFR0VSCisJVGhlIG1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBwcm9iZXMgaW4gSU5DT01QTEVURSBzdGF0ZSwKKwl3aGVuIHRoZSBhc3NvY2lhdGVkIGhhcmR3YXJlIGFkZHJlc3MgaXMgdW5rbm93bi4gIERlZmF1bHRzCisJdG8gMy4KKwordWNhc3Rfc29saWNpdCAtIElOVEVHRVIKKwlUaGUgbWF4aW11bSBudW1iZXIgb2YgdW5pY2FzdCBwcm9iZXMgaW4gUFJPQkUgc3RhdGUsIHdoZW4KKwl0aGUgaGFyZHdhcmUgYWRkcmVzcyBpcyBiZWluZyByZWNvbmZpcm1lZC4gIERlZmF1bHRzIHRvIDMuCiAKIGFwcF9zb2xpY2l0IC0gSU5URUdFUgogCVRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9iZXMgdG8gc2VuZCB0byB0aGUgdXNlciBzcGFjZSBBUlAgZGFlbW9uCiAJdmlhIG5ldGxpbmsgYmVmb3JlIGRyb3BwaW5nIGJhY2sgdG8gbXVsdGljYXN0IHByb2JlcyAoc2VlCi0JbWNhc3Rfc29saWNpdCkuICBEZWZhdWx0cyB0byAwLgorCW1jYXN0X3Jlc29saWNpdCkuICBEZWZhdWx0cyB0byAwLgorCittY2FzdF9yZXNvbGljaXQgLSBJTlRFR0VSCisJVGhlIG1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBwcm9iZXMgYWZ0ZXIgdW5pY2FzdCBhbmQKKwlhcHAgcHJvYmVzIGluIFBST0JFIHN0YXRlLiAgRGVmYXVsdHMgdG8gMC4KIAogZGlzYWJsZV9wb2xpY3kgLSBCT09MRUFOCiAJRGlzYWJsZSBJUFNFQyBwb2xpY3kgKFNQRCkgZm9yIHRoaXMgaW50ZXJmYWNlCkBAIC0xMTk4LDYgKzEyMjAsMTcgQEAKIAlGQUxTRTogZGlzYWJsZWQKIAlEZWZhdWx0OiBGQUxTRQogCitpZGdlbl9kZWxheSAtIElOVEVHRVIKKwlDb250cm9scyB0aGUgZGVsYXkgaW4gc2Vjb25kcyBhZnRlciB3aGljaCB0aW1lIHRvIHJldHJ5CisJcHJpdmFjeSBzdGFibGUgYWRkcmVzcyBnZW5lcmF0aW9uIGlmIGEgREFEIGNvbmZsaWN0IGlzCisJZGV0ZWN0ZWQuCisJRGVmYXVsdDogMSAoYXMgc3BlY2lmaWVkIGluIFJGQzcyMTcpCisKK2lkZ2VuX3JldHJpZXMgLSBJTlRFR0VSCisJQ29udHJvbHMgdGhlIG51bWJlciBvZiByZXRyaWVzIHRvIGdlbmVyYXRlIGEgc3RhYmxlIHByaXZhY3kKKwlhZGRyZXNzIGlmIGEgREFEIGNvbmZsaWN0IGlzIGRldGVjdGVkLgorCURlZmF1bHQ6IDMgKGFzIHNwZWNpZmllZCBpbiBSRkM3MjE3KQorCiBtbGRfcXJ2IC0gSU5URUdFUgogCUNvbnRyb2xzIHRoZSBNTEQgcXVlcnkgcm9idXN0bmVzcyB2YXJpYWJsZSAoc2VlIFJGQzM4MTAgOS4xKS4KIAlEZWZhdWx0OiAyIChhcyBzcGVjaWZpZWQgYnkgUkZDMzgxMCA5LjEpCkBAIC0xNTE4LDYgKzE1NTEsMjAgQEAKIAkJMDogZGlzYWJsZWQgKGRlZmF1bHQpCiAJCTE6IGVuYWJsZWQKIAorc3RhYmxlX3NlY3JldCAtIElQdjYgYWRkcmVzcworCVRoaXMgSVB2NiBhZGRyZXNzIHdpbGwgYmUgdXNlZCBhcyBhIHNlY3JldCB0byBnZW5lcmF0ZSBJUHY2CisJYWRkcmVzc2VzIGZvciBsaW5rLWxvY2FsIGFkZHJlc3NlcyBhbmQgYXV0b2NvbmZpZ3VyZWQKKwlvbmVzLiBBbGwgYWRkcmVzc2VzIGdlbmVyYXRlZCBhZnRlciBzZXR0aW5nIHRoaXMgc2VjcmV0IHdpbGwKKwliZSBzdGFibGUgcHJpdmFjeSBvbmVzIGJ5IGRlZmF1bHQuIFRoaXMgY2FuIGJlIGNoYW5nZWQgdmlhIHRoZQorCWFkZHJnZW5tb2RlIGlwLWxpbmsuIGNvbmYvZGVmYXVsdC9zdGFibGVfc2VjcmV0IGlzIHVzZWQgYXMgdGhlCisJc2VjcmV0IGZvciB0aGUgbmFtZXNwYWNlLCB0aGUgaW50ZXJmYWNlIHNwZWNpZmljIG9uZXMgY2FuCisJb3ZlcndyaXRlIHRoYXQuIFdyaXRlcyB0byBjb25mL2FsbC9zdGFibGVfc2VjcmV0IGFyZSByZWZ1c2VkLgorCisJSXQgaXMgcmVjb21tZW5kZWQgdG8gZ2VuZXJhdGUgdGhpcyBzZWNyZXQgZHVyaW5nIGluc3RhbGxhdGlvbgorCW9mIGEgc3lzdGVtIGFuZCBrZWVwIGl0IHN0YWJsZSBhZnRlciB0aGF0LgorCisJQnkgZGVmYXVsdCB0aGUgc3RhYmxlIHNlY3JldCBpcyB1bnNldC4KKwogaWNtcC8qOgogcmF0ZWxpbWl0IC0gSU5URUdFUgogCUxpbWl0IHRoZSBtYXhpbWFsIHJhdGVzIGZvciBzZW5kaW5nIElDTVB2NiBwYWNrZXRzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwdnMtc3lzY3RsLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcHZzLXN5c2N0bC50eHQKaW5kZXggN2EzYzA0Ny4uM2JhNzA5NSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lwdnMtc3lzY3RsLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXB2cy1zeXNjdGwudHh0CkBAIC0yMiw2ICsyMiwyNyBAQAogCUlmIHNldCwgZGlzYWJsZSB0aGUgZGlyZWN0b3IgZnVuY3Rpb24gd2hpbGUgdGhlIHNlcnZlciBpcwogCWluIGJhY2t1cCBtb2RlIHRvIGF2b2lkIHBhY2tldCBsb29wcyBmb3IgRFIvVFVOIG1ldGhvZHMuCiAKK2Nvbm5fcmV1c2VfbW9kZSAtIElOVEVHRVIKKwkxIC0gZGVmYXVsdAorCisJQ29udHJvbHMgaG93IGlwdnMgd2lsbCBkZWFsIHdpdGggY29ubmVjdGlvbnMgdGhhdCBhcmUgZGV0ZWN0ZWQKKwlwb3J0IHJldXNlLiBJdCBpcyBhIGJpdG1hcCwgd2l0aCB0aGUgdmFsdWVzIGJlaW5nOgorCisJMDogZGlzYWJsZSBhbnkgc3BlY2lhbCBoYW5kbGluZyBvbiBwb3J0IHJldXNlLiBUaGUgbmV3CisJY29ubmVjdGlvbiB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUgc2FtZSByZWFsIHNlcnZlciB0aGF0IHdhcworCXNlcnZpY2luZyB0aGUgcHJldmlvdXMgY29ubmVjdGlvbi4gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5CisJZGlzYWJsZSBleHBpcmVfbm9kZXN0X2Nvbm4uCisKKwliaXQgMTogZW5hYmxlIHJlc2NoZWR1bGluZyBvZiBuZXcgY29ubmVjdGlvbnMgd2hlbiBpdCBpcyBzYWZlLgorCVRoYXQgaXMsIHdoZW5ldmVyIGV4cGlyZV9ub2Rlc3RfY29ubiBhbmQgZm9yIFRDUCBzb2NrZXRzLCB3aGVuCisJdGhlIGNvbm5lY3Rpb24gaXMgaW4gVElNRV9XQUlUIHN0YXRlICh3aGljaCBpcyBvbmx5IHBvc3NpYmxlIGlmCisJeW91IHVzZSBOQVQgbW9kZSkuCisKKwliaXQgMjogaXQgaXMgYml0IDEgcGx1cywgZm9yIFRDUCBjb25uZWN0aW9ucywgd2hlbiBjb25uZWN0aW9ucworCWFyZSBpbiBGSU5fV0FJVCBzdGF0ZSwgYXMgdGhpcyBpcyB0aGUgbGFzdCBzdGF0ZSBzZWVuIGJ5IGxvYWQKKwliYWxhbmNlciBpbiBEaXJlY3QgUm91dGluZyBtb2RlLiBUaGlzIGJpdCBoZWxwcyBvbiBhZGRpbmcgbmV3CisJcmVhbCBzZXJ2ZXJzIHRvIGEgdmVyeSBidXN5IGNsdXN0ZXIuCisKIGNvbm50cmFjayAtIEJPT0xFQU4KIAkwIC0gZGlzYWJsZWQgKGRlZmF1bHQpCiAJbm90IDAgLSBlbmFibGVkCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXhnYi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXhnYi50eHQKaW5kZXggMWUwYzA0NS4uOWI0YTEwYTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9peGdiLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXhnYi50eHQKQEAgLTM5LDcgKzM5LDcgQEAKIAogVGhlIGRyaXZlciBpbmZvcm1hdGlvbiBwcmV2aW91c2x5IGRpc3BsYXllZCBpbiB0aGUgL3Byb2MgZmlsZXN5c3RlbSBpcyBub3QKIHN1cHBvcnRlZCBpbiB0aGlzIHJlbGVhc2UuICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSBldGh0b29sICh2ZXJzaW9uIDEuNgotb3IgbGF0ZXIpLCBsc3BjaSwgYW5kIGlmY29uZmlnIHRvIG9idGFpbiB0aGUgc2FtZSBpbmZvcm1hdGlvbi4KK29yIGxhdGVyKSwgbHNwY2ksIGFuZCBpcHJvdXRlMiB0byBvYnRhaW4gdGhlIHNhbWUgaW5mb3JtYXRpb24uCiAKIEluc3RydWN0aW9ucyBvbiB1cGRhdGluZyBldGh0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgc2VjdGlvbiAiQWRkaXRpb25hbAogQ29uZmlndXJhdGlvbnMiIGxhdGVyIGluIHRoaXMgZG9jdW1lbnQuCkBAIC05MCw3ICs5MCw3IEBACiAzLiBBc3NpZ24gYW4gSVAgYWRkcmVzcyB0byB0aGUgaW50ZXJmYWNlIGJ5IGVudGVyaW5nIHRoZSBmb2xsb3dpbmcsIHdoZXJlCiAgICB4IGlzIHRoZSBpbnRlcmZhY2UgbnVtYmVyOgogCi0gICAgIGlmY29uZmlnIGV0aHggPElQX2FkZHJlc3M+CisgICAgIGlwIGFkZHIgYWRkIGV0aHggPElQX2FkZHJlc3M+CiAKIDQuIFZlcmlmeSB0aGF0IHRoZSBpbnRlcmZhY2Ugd29ya3MuIEVudGVyIHRoZSBmb2xsb3dpbmcsIHdoZXJlIDxJUF9hZGRyZXNzPgogICAgaXMgdGhlIElQIGFkZHJlc3MgZm9yIGFub3RoZXIgbWFjaGluZSBvbiB0aGUgc2FtZSBzdWJuZXQgYXMgdGhlIGludGVyZmFjZQpAQCAtMTc3LDcgKzE3Nyw3IEBACiAgICAgICB0dW5pbmcgeW91ciBuZXR3b3JrIHBlcmZvcm1hbmNlLgogCiBUaGUgY2hhbmdlcyBhcmUgbWFkZSBpbiB0aHJlZSBtYWpvciB3YXlzLCBsaXN0ZWQgaW4gb3JkZXIgb2YgZ3JlYXRlc3QgZWZmZWN0OgotLSBVc2UgaWZjb25maWcgdG8gbW9kaWZ5IHRoZSBtdHUgKG1heGltdW0gdHJhbnNtaXNzaW9uIHVuaXQpIGFuZCB0aGUgdHhxdWV1ZWxlbgorLSBVc2UgaXAgbGluayB0byBtb2RpZnkgdGhlIG10dSAobWF4aW11bSB0cmFuc21pc3Npb24gdW5pdCkgYW5kIHRoZSB0eHF1ZXVlbGVuCiAgIHBhcmFtZXRlci4KIC0gVXNlIHN5c2N0bCB0byBtb2RpZnkgL3Byb2MgcGFyYW1ldGVycyAoZXNzZW50aWFsbHkga2VybmVsIHR1bmluZykKIC0gVXNlIHNldHBjaSB0byBtb2RpZnkgdGhlIE1NUkJDIGZpZWxkIGluIFBDSS1YIGNvbmZpZ3VyYXRpb24gc3BhY2UgdG8gaW5jcmVhc2UKQEAgLTIwMiw3ICsyMDIsNyBAQAogIyB0byBjaGFuZ2UgYXMgd2VsbC4KICMgc2V0IHRoZSB0eHF1ZXVlbGVuCiAjIHlvdXIgaXhnYiBhZGFwdGVyIHNob3VsZCBiZSBsb2FkZWQgYXMgZXRoMSBmb3IgdGhpcyB0byB3b3JrLCBjaGFuZ2UgaWYgbmVlZGVkCi1pZmNvbmZpZyBldGgxIG10dSA5MDAwIHR4cXVldWVsZW4gMTAwMCB1cAoraXAgbGkgc2V0IGRldiBldGgxIG10dSA5MDAwIHR4cXVldWVsZW4gMTAwMCB1cAogIyBjYWxsIHRoZSBzeXNjdGwgdXRpbGl0eSB0byBtb2RpZnkgL3Byb2Mvc3lzIGVudHJpZXMKIHN5c2N0bCAtcCAuL3N5c2N0bF9peGdiLmNvbmYKIC0gRU5EIGl4Z2JfcGVyZi5zaApAQCAtMjk3LDEwICsyOTcsMTAgQEAKICAgLS0tLS0tLS0tLS0tCiAgIFRoZSBkcml2ZXIgc3VwcG9ydHMgSnVtYm8gRnJhbWVzIGZvciBhbGwgYWRhcHRlcnMuIEp1bWJvIEZyYW1lcyBzdXBwb3J0IGlzCiAgIGVuYWJsZWQgYnkgY2hhbmdpbmcgdGhlIE1UVSB0byBhIHZhbHVlIGxhcmdlciB0aGFuIHRoZSBkZWZhdWx0IG9mIDE1MDAuCi0gIFRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGUgTVRVIGlzIDE2MTE0LiAgVXNlIHRoZSBpZmNvbmZpZyBjb21tYW5kIHRvCisgIFRoZSBtYXhpbXVtIHZhbHVlIGZvciB0aGUgTVRVIGlzIDE2MTE0LiAgVXNlIHRoZSBpcCBjb21tYW5kIHRvCiAgIGluY3JlYXNlIHRoZSBNVFUgc2l6ZS4gIEZvciBleGFtcGxlOgogCi0gICAgICAgIGlmY29uZmlnIGV0aHggbXR1IDkwMDAgdXAKKyAgICAgICAgaXAgbGkgc2V0IGRldiBldGh4IG10dSA5MDAwCiAKICAgVGhlIG1heGltdW0gTVRVIHNldHRpbmcgZm9yIEp1bWJvIEZyYW1lcyBpcyAxNjExNC4gIFRoaXMgdmFsdWUgY29pbmNpZGVzCiAgIHdpdGggdGhlIG1heGltdW0gSnVtYm8gRnJhbWVzIHNpemUgb2YgMTYxMjguCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXhnYmUudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2l4Z2JlLnR4dAppbmRleCAwYWNlNmU3Li42ZjBjYjU3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXhnYmUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9peGdiZS50eHQKQEAgLTcwLDEwICs3MCwxMCBAQAogODI1OTktYmFzZWQgYWRhcHRlcnMgc3VwcG9ydCBhbGwgcGFzc2l2ZSBhbmQgYWN0aXZlIGxpbWl0aW5nIGRpcmVjdCBhdHRhY2gKIGNhYmxlcyB0aGF0IGNvbXBseSB3aXRoIFNGRi04NDMxIHY0LjEgYW5kIFNGRi04NDcyIHYxMC40IHNwZWNpZmljYXRpb25zLgogCi1MYXNlciB0dXJucyBvZmYgZm9yIFNGUCsgd2hlbiBpZmNvbmZpZyBkb3duCitMYXNlciB0dXJucyBvZmYgZm9yIFNGUCsgd2hlbiBkZXZpY2UgaXMgZG93bgogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotImlmY29uZmlnIGRvd24iIHR1cm5zIG9mZiB0aGUgbGFzZXIgZm9yIDgyNTk5LWJhc2VkIFNGUCsgZmliZXIgYWRhcHRlcnMuCi0iaWZjb25maWcgdXAiIHR1cm5zIG9uIHRoZSBsYXNlci4KKyJpcCBsaW5rIHNldCBkb3duIiB0dXJucyBvZmYgdGhlIGxhc2VyIGZvciA4MjU5OS1iYXNlZCBTRlArIGZpYmVyIGFkYXB0ZXJzLgorImlwIGxpbmsgc2V0IHVwIiB0dXJucyBvbiB0aGUgbGFzZXIuCiAKIAogODI1OTgtQkFTRUQgQURBUFRFUlMKQEAgLTIxMywxMyArMjEzLDEzIEBACiAgIC0tLS0tLS0tLS0tLQogICBUaGUgZHJpdmVyIHN1cHBvcnRzIEp1bWJvIEZyYW1lcyBmb3IgYWxsIGFkYXB0ZXJzLiBKdW1ibyBGcmFtZXMgc3VwcG9ydCBpcwogICBlbmFibGVkIGJ5IGNoYW5naW5nIHRoZSBNVFUgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiB0aGUgZGVmYXVsdCBvZiAxNTAwLgotICBUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIE1UVSBpcyAxNjExMC4gIFVzZSB0aGUgaWZjb25maWcgY29tbWFuZCB0bworICBUaGUgbWF4aW11bSB2YWx1ZSBmb3IgdGhlIE1UVSBpcyAxNjExMC4gIFVzZSB0aGUgaXAgY29tbWFuZCB0bwogICBpbmNyZWFzZSB0aGUgTVRVIHNpemUuICBGb3IgZXhhbXBsZToKIAotICAgICAgICBpZmNvbmZpZyBldGh4IG10dSA5MDAwIHVwCisgICAgICAgIGlwIGxpbmsgc2V0IGRldiBldGh4IG10dSA5MDAwCiAKLSAgVGhlIG1heGltdW0gTVRVIHNldHRpbmcgZm9yIEp1bWJvIEZyYW1lcyBpcyAxNjExMC4gIFRoaXMgdmFsdWUgY29pbmNpZGVzCi0gIHdpdGggdGhlIG1heGltdW0gSnVtYm8gRnJhbWVzIHNpemUgb2YgMTYxMjguCisgIFRoZSBtYXhpbXVtIE1UVSBzZXR0aW5nIGZvciBKdW1ibyBGcmFtZXMgaXMgOTcxMC4gIFRoaXMgdmFsdWUgY29pbmNpZGVzCisgIHdpdGggdGhlIG1heGltdW0gSnVtYm8gRnJhbWVzIHNpemUgb2YgOTcyOC4KIAogICBHZW5lcmljIFJlY2VpdmUgT2ZmbG9hZCwgYWthIEdSTwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL21wbHMtc3lzY3RsLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9tcGxzLXN5c2N0bC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5ZGRmMAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9tcGxzLXN5c2N0bC50eHQKQEAgLTAsMCArMSwyMCBAQAorL3Byb2Mvc3lzL25ldC9tcGxzLyogVmFyaWFibGVzOgorCitwbGF0Zm9ybV9sYWJlbHMgLSBJTlRFR0VSCisJTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHBsYXRmb3JtIGxhYmVsIHRhYmxlLiAgSXQgaXMgbm90CisJcG9zc2libGUgdG8gY29uZmlndXJlIGZvcndhcmRpbmcgZm9yIGxhYmVsIHZhbHVlcyBlcXVhbCB0byBvcgorCWdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHBsYXRmb3JtIGxhYmVscy4KKworCUEgZGVuc2UgdXRsaXppYXRpb24gb2YgdGhlIGVudHJpZXMgaW4gdGhlIHBsYXRmb3JtIGxhYmVsIHRhYmxlCisJaXMgcG9zc2libGUgYW5kIGV4cGVjdGVkIGFhcyB0aGUgcGxhdGZvcm0gbGFiZWxzIGFyZSBsb2NhbGx5CisJYWxsb2NhdGVkLgorCisJSWYgdGhlIG51bWJlciBvZiBwbGF0Zm9ybSBsYWJlbCB0YWJsZSBlbnRyaWVzIGlzIHNldCB0byAwIG5vCisJbGFiZWwgd2lsbCBiZSByZWNvZ25pemVkIGJ5IHRoZSBrZXJuZWwgYW5kIG1wbHMgZm9yd2FyZGluZworCXdpbGwgYmUgZGlzYWJsZWQuCisKKwlSZWR1Y2luZyB0aGlzIHZhbHVlIHdpbGwgcmVtb3ZlIGFsbCBsYWJlbCByb3V0aW5nIGVudHJpZXMgdGhhdAorCW5vIGxvbmdlciBmaXQgaW4gdGhlIHRhYmxlLgorCisJUG9zc2libGUgdmFsdWVzOiAwIC0gMTA0ODU3NQorCURlZmF1bHQ6IDAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wYWNrZXRfbW1hcC50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGFja2V0X21tYXAudHh0CmluZGV4IGE2ZDdjYjkuLmRhYTAxNWEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wYWNrZXRfbW1hcC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BhY2tldF9tbWFwLnR4dApAQCAtNDQwLDkgKzQ0MCwxMCBAQAogKysrIENhcHR1cmUgcHJvY2VzczoKICAgICAgZnJvbSBpbmNsdWRlL2xpbnV4L2lmX3BhY2tldC5oCiAKLSAgICAgI2RlZmluZSBUUF9TVEFUVVNfQ09QWSAgICAgICAgICAyIAotICAgICAjZGVmaW5lIFRQX1NUQVRVU19MT1NJTkcgICAgICAgIDQgCi0gICAgICNkZWZpbmUgVFBfU1RBVFVTX0NTVU1OT1RSRUFEWSAgOCAKKyAgICAgI2RlZmluZSBUUF9TVEFUVVNfQ09QWSAgICAgICAgICAoMSA8PCAxKQorICAgICAjZGVmaW5lIFRQX1NUQVRVU19MT1NJTkcgICAgICAgICgxIDw8IDIpCisgICAgICNkZWZpbmUgVFBfU1RBVFVTX0NTVU1OT1RSRUFEWSAgKDEgPDwgMykKKyAgICAgI2RlZmluZSBUUF9TVEFUVVNfQ1NVTV9WQUxJRCAgICAoMSA8PCA3KQogCiBUUF9TVEFUVVNfQ09QWSAgICAgICAgOiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGZyYW1lIChhbmQgYXNzb2NpYXRlZAogICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSBpbmZvcm1hdGlvbikgaGFzIGJlZW4gdHJ1bmNhdGVkIGJlY2F1c2UgaXQncyAKQEAgLTQ2Niw2ICs0NjcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRpbmcgdGhlIHBhY2tldCB3ZSBzaG91bGQgbm90IHRyeSB0byBjaGVjayB0aGUgCiAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja3N1bS4gCiAKK1RQX1NUQVRVU19DU1VNX1ZBTElEICA6IFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCBhdCBsZWFzdCB0aGUgdHJhbnNwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgY2hlY2tzdW0gb2YgdGhlIHBhY2tldCBoYXMgYmVlbiBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZWQgb24gdGhlIGtlcm5lbCBzaWRlLiBJZiB0aGUgZmxhZyBpcyBub3Qgc2V0CisgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHdlIGFyZSBmcmVlIHRvIGNoZWNrIHRoZSBjaGVja3N1bSBieSBvdXJzZWx2ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIHRoYXQgVFBfU1RBVFVTX0NTVU1OT1RSRUFEWSBpcyBhbHNvIG5vdCBzZXQuCisKIGZvciBjb252ZW5pZW5jZSB0aGVyZSBhcmUgYWxzbyB0aGUgZm9sbG93aW5nIGRlZmluZXM6CiAKICAgICAgI2RlZmluZSBUUF9TVEFUVVNfS0VSTkVMICAgICAgICAwCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGt0Z2VuLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0CmluZGV4IDY5MTVjNmIuLjAzNDRmMWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wa3RnZW4udHh0CkBAIC0zLDEzICszLDExIEBACiAgICAgICAgICAgICAgICAgICBIT1dUTyBmb3IgdGhlIGxpbnV4IHBhY2tldCBnZW5lcmF0b3IgCiAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotRGF0ZTogMDQxMjIxCi0KLUVuYWJsZSBDT05GSUdfTkVUX1BLVEdFTiB0byBjb21waWxlIGFuZCBidWlsZCBwa3RnZW4ubyBlaXRoZXIgaW4ga2VybmVsCi1vciBhcyBtb2R1bGUuIE1vZHVsZSBpcyBwcmVmZXJyZWQuIGluc21vZCBwa3RnZW4gaWYgbmVlZGVkLiBPbmNlIHJ1bm5pbmcKLXBrdGdlbiBjcmVhdGVzIGEgdGhyZWFkIG9uIGVhY2ggQ1BVIHdoZXJlIGVhY2ggdGhyZWFkIGhhcyBhZmZpbml0eSB0byBpdHMgQ1BVLgotTW9uaXRvcmluZyBhbmQgY29udHJvbGxpbmcgaXMgZG9uZSB2aWEgL3Byb2MuIEVhc2llc3QgdG8gc2VsZWN0IGEgc3VpdGFibGUgCi1hIHNhbXBsZSBzY3JpcHQgYW5kIGNvbmZpZ3VyZS4KK0VuYWJsZSBDT05GSUdfTkVUX1BLVEdFTiB0byBjb21waWxlIGFuZCBidWlsZCBwa3RnZW4gZWl0aGVyIGluLWtlcm5lbAorb3IgYXMgYSBtb2R1bGUuICBBIG1vZHVsZSBpcyBwcmVmZXJyZWQ7IG1vZHByb2JlIHBrdGdlbiBpZiBuZWVkZWQuICBPbmNlCitydW5uaW5nLCBwa3RnZW4gY3JlYXRlcyBhIHRocmVhZCBmb3IgZWFjaCBDUFUgd2l0aCBhZmZpbml0eSB0byB0aGF0IENQVS4KK01vbml0b3JpbmcgYW5kIGNvbnRyb2xsaW5nIGlzIGRvbmUgdmlhIC9wcm9jLiAgSXQgaXMgZWFzaWVzdCB0byBzZWxlY3QgYQorc3VpdGFibGUgc2FtcGxlIHNjcmlwdCBhbmQgY29uZmlndXJlIHRoYXQuCiAKIE9uIGEgZHVhbCBDUFU6CiAKQEAgLTI3LDcgKzI1LDcgQEAKIFR1bmluZyBOSUMgZm9yIG1heCBwZXJmb3JtYW5jZQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVRoZSBkZWZhdWx0IE5JQyBzZXR0aW5nIGFyZSAobGlrZWx5KSBub3QgdHVuZWQgZm9yIHBrdGdlbidzIGFydGlmaWNpYWwKK1RoZSBkZWZhdWx0IE5JQyBzZXR0aW5ncyBhcmUgKGxpa2VseSkgbm90IHR1bmVkIGZvciBwa3RnZW4ncyBhcnRpZmljaWFsCiBvdmVybG9hZCB0eXBlIG9mIGJlbmNobWFya2luZywgYXMgdGhpcyBjb3VsZCBodXJ0IHRoZSBub3JtYWwgdXNlLWNhc2UuCiAKIFNwZWNpZmljYWxseSBpbmNyZWFzaW5nIHRoZSBUWCByaW5nIGJ1ZmZlciBpbiB0aGUgTklDOgpAQCAtMzUsMjAgKzMzLDIwIEBACiAKIEEgbGFyZ2VyIFRYIHJpbmcgY2FuIGltcHJvdmUgcGt0Z2VuJ3MgcGVyZm9ybWFuY2UsIHdoaWxlIGl0IGNhbiBodXJ0CiBpbiB0aGUgZ2VuZXJhbCBjYXNlLCAxKSBiZWNhdXNlIHRoZSBUWCByaW5nIGJ1ZmZlciBtaWdodCBnZXQgbGFyZ2VyCi10aGFuIHRoZSBDUFVzIEwxL0wyIGNhY2hlLCAyKSBiZWNhdXNlIGl0IGFsbG93IG1vcmUgcXVldWVpbmcgaW4gdGhlCit0aGFuIHRoZSBDUFUncyBMMS9MMiBjYWNoZSwgMikgYmVjYXVzZSBpdCBhbGxvd3MgbW9yZSBxdWV1ZWluZyBpbiB0aGUKIE5JQyBIVyBsYXllciAod2hpY2ggaXMgYmFkIGZvciBidWZmZXJibG9hdCkuCiAKLU9uZSBzaG91bGQgYmUgY2FyZWZ1bCB0byBjb25jbHVkZSwgdGhhdCBwYWNrZXRzL2Rlc2NyaXB0b3JzIGluIHRoZSBIVworT25lIHNob3VsZCBoZXNpdGF0ZSB0byBjb25jbHVkZSB0aGF0IHBhY2tldHMvZGVzY3JpcHRvcnMgaW4gdGhlIEhXCiBUWCByaW5nIGNhdXNlIGRlbGF5LiAgRHJpdmVycyB1c3VhbGx5IGRlbGF5IGNsZWFuaW5nIHVwIHRoZQotcmluZy1idWZmZXJzIChmb3IgdmFyaW91cyBwZXJmb3JtYW5jZSByZWFzb25zKSwgdGh1cyBwYWNrZXRzIHN0YWxsaW5nCi10aGUgVFggcmluZywgbWlnaHQganVzdCBiZSB3YWl0aW5nIGZvciBjbGVhbnVwLgorcmluZy1idWZmZXJzIGZvciB2YXJpb3VzIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGFuZCBwYWNrZXRzIHN0YWxsaW5nCit0aGUgVFggcmluZyBtaWdodCBqdXN0IGJlIHdhaXRpbmcgZm9yIGNsZWFudXAuCiAKLVRoaXMgY2xlYW51cCBpc3N1ZXMgaXMgc3BlY2lmaWNhbGx5IHRoZSBjYXNlLCBmb3IgdGhlIGRyaXZlciBpeGdiZQotKEludGVsIDgyNTk5IGNoaXApLiAgVGhpcyBkcml2ZXIgKGl4Z2JlKSBjb21iaW5lIFRYK1JYIHJpbmcgY2xlYW51cHMsCitUaGlzIGNsZWFudXAgaXNzdWUgaXMgc3BlY2lmaWNhbGx5IHRoZSBjYXNlIGZvciB0aGUgZHJpdmVyIGl4Z2JlCisoSW50ZWwgODI1OTkgY2hpcCkuICBUaGlzIGRyaXZlciAoaXhnYmUpIGNvbWJpbmVzIFRYK1JYIHJpbmcgY2xlYW51cHMsCiBhbmQgdGhlIGNsZWFudXAgaW50ZXJ2YWwgaXMgYWZmZWN0ZWQgYnkgdGhlIGV0aHRvb2wgLS1jb2FsZXNjZSBzZXR0aW5nCiBvZiBwYXJhbWV0ZXIgInJ4LXVzZWNzIi4KIAotRm9yIGl4Z2JlIHVzZSBlLmcgIjMwIiByZXN1bHRpbmcgaW4gYXBwcm94IDMzSyBpbnRlcnJ1cHRzL3NlYyAoMS8zMCoxMF42KToKK0ZvciBpeGdiZSB1c2UgZS5nLiAiMzAiIHJlc3VsdGluZyBpbiBhcHByb3ggMzNLIGludGVycnVwdHMvc2VjICgxLzMwKjEwXjYpOgogICMgZXRodG9vbCAtQyBldGhYIHJ4LXVzZWNzIDMwCiAKIApAQCAtNjAsMTUgKzU4LDE2IEBACiBTdG9wcGVkOiBldGgxIAogUmVzdWx0OiBPSzogbWF4X2JlZm9yZV9zb2Z0aXJxPTEwMDAwCiAKLU1vc3QgaW1wb3J0YW50IHRoZSBkZXZpY2VzIGFzc2lnbmVkIHRvIHRocmVhZC4gTm90ZSEgQSBkZXZpY2UgY2FuIG9ubHkgYmVsb25nIAotdG8gb25lIHRocmVhZC4KK01vc3QgaW1wb3J0YW50IGFyZSB0aGUgZGV2aWNlcyBhc3NpZ25lZCB0byB0aGUgdGhyZWFkLiAgTm90ZSB0aGF0IGEKK2RldmljZSBjYW4gb25seSBiZWxvbmcgdG8gb25lIHRocmVhZC4KIAogCiBWaWV3aW5nIGRldmljZXMKID09PT09PT09PT09PT09PQogCi1QYXJtIHNlY3Rpb24gaG9sZHMgY29uZmlndXJlZCBpbmZvLiBDdXJyZW50IGhvbGQgcnVubmluZyBzdGF0cy4gCi1SZXN1bHQgaXMgcHJpbnRlZCBhZnRlciBydW4gb3IgYWZ0ZXIgaW50ZXJydXB0aW9uLiBFeGFtcGxlOgorVGhlIFBhcmFtcyBzZWN0aW9uIGhvbGRzIGNvbmZpZ3VyZWQgaW5mb3JtYXRpb24uICBUaGUgQ3VycmVudCBzZWN0aW9uCitob2xkcyBydW5uaW5nIHN0YXRpc3RpY3MuICBUaGUgUmVzdWx0IGlzIHByaW50ZWQgYWZ0ZXIgYSBydW4gb3IgYWZ0ZXIKK2ludGVycnVwdGlvbi4gIEV4YW1wbGU6CiAKIC9wcm9jL25ldC9wa3RnZW4vZXRoMSAgICAgICAKIApAQCAtOTMsNyArOTIsOCBAQAogCiBDb25maWd1cmluZyB0aHJlYWRzIGFuZCBkZXZpY2VzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotVGhpcyBpcyBkb25lIHZpYSB0aGUgL3Byb2MgaW50ZXJmYWNlIGVhc2llc3QgZG9uZSB2aWEgcGdzZXQgaW4gdGhlIHNjcmlwdHMKK1RoaXMgaXMgZG9uZSB2aWEgdGhlIC9wcm9jIGludGVyZmFjZSwgYW5kIG1vc3QgZWFzaWx5IGRvbmUgdmlhIHBnc2V0CithcyBkZWZpbmVkIGluIHRoZSBzYW1wbGUgc2NyaXB0cy4KIAogRXhhbXBsZXM6CiAKQEAgLTE5MiwxMCArMTkyLDExIEBACiAgcGdzZXQgInJhdGUgMzAwTSIgICAgICAgIHNldCByYXRlIHRvIDMwMCBNYi9zCiAgcGdzZXQgInJhdGVwIDEwMDAwMDAiICAgIHNldCByYXRlIHRvIDFNcHBzCiAKLUV4YW1wbGUgc2NyaXB0cwotPT09PT09PT09PT09PT09CitTYW1wbGUgc2NyaXB0cworPT09PT09PT09PT09PT0KIAotQSBjb2xsZWN0aW9uIG9mIHNtYWxsIHR1dG9yaWFsIHNjcmlwdHMgZm9yIHBrdGdlbiBpcyBpbiBleGFtcGxlcyBkaXIuCitBIGNvbGxlY3Rpb24gb2Ygc21hbGwgdHV0b3JpYWwgc2NyaXB0cyBmb3IgcGt0Z2VuIGlzIGluIHRoZQorc2FtcGxlcy9wa3RnZW4gZGlyZWN0b3J5OgogCiBwa3RnZW4uY29uZi0xLTEgICAgICAgICAgICAgICAgICAjIDEgQ1BVIDEgZGV2IAogcGt0Z2VuLmNvbmYtMS0yICAgICAgICAgICAgICAgICAgIyAxIENQVSAyIGRldgpAQCAtMjA2LDI1ICsyMDcsMjYgQEAKIHBrdGdlbi5jb25mLTEtMS1pcDYtcmRvcyAgICAgICAgICMgMSBDUFUgMSBkZXYgaXB2NiAgdy4gcm91dGUgRG9TCiBwa3RnZW4uY29uZi0xLTEtZmxvd3MgICAgICAgICAgICAjIDEgQ1BVIDEgZGV2IG11bHRpcGxlIGZsb3dzLgogCi1SdW4gaW4gc2hlbGw6IC4vcGt0Z2VuLmNvbmYtWC1ZIEl0IGRvZXMgYWxsIHRoZSBzZXR1cCBpbmNsdWRpbmcgc2VuZGluZy4gCitSdW4gaW4gc2hlbGw6IC4vcGt0Z2VuLmNvbmYtWC1ZCitUaGlzIGRvZXMgYWxsIHRoZSBzZXR1cCBpbmNsdWRpbmcgc2VuZGluZy4KIAogCiBJbnRlcnJ1cHQgYWZmaW5pdHkKID09PT09PT09PT09PT09PT09PT0KLU5vdGUgd2hlbiBhZGRpbmcgZGV2aWNlcyB0byBhIHNwZWNpZmljIENQVSB0aGVyZSBnb29kIGlkZWEgdG8gYWxzbyBhc3NpZ24gCi0vcHJvYy9pcnEvWFgvc21wX2FmZmluaXR5IHNvIHRoZSBUWC1pbnRlcnJ1cHRzIGdldHMgYm91bmQgdG8gdGhlIHNhbWUgQ1BVLgotYXMgdGhpcyByZWR1Y2VzIGNhY2hlIGJvdW5jaW5nIHdoZW4gZnJlZWluZyBza2Incy4KK05vdGUgdGhhdCB3aGVuIGFkZGluZyBkZXZpY2VzIHRvIGEgc3BlY2lmaWMgQ1BVIGl0IGlzIGEgZ29vZCBpZGVhIHRvCithbHNvIGFzc2lnbiAvcHJvYy9pcnEvWFgvc21wX2FmZmluaXR5IHNvIHRoYXQgdGhlIFRYIGludGVycnVwdHMgYXJlIGJvdW5kCit0byB0aGUgc2FtZSBDUFUuICBUaGlzIHJlZHVjZXMgY2FjaGUgYm91bmNpbmcgd2hlbiBmcmVlaW5nIHNrYnMuCiAKIEVuYWJsZSBJUHNlYwogPT09PT09PT09PT09Ci1EZWZhdWx0IElQc2VjIHRyYW5zZm9ybWF0aW9uIHdpdGggRVNQIGVuY2Fwc3VsYXRpb24gcGx1cyBUcmFuc3BvcnQgbW9kZQotY291bGQgYmUgZW5hYmxlZCBieSBzaW1wbHkgc2V0dGluZzoKK0RlZmF1bHQgSVBzZWMgdHJhbnNmb3JtYXRpb24gd2l0aCBFU1AgZW5jYXBzdWxhdGlvbiBwbHVzIHRyYW5zcG9ydCBtb2RlCitjYW4gYmUgZW5hYmxlZCBieSBzaW1wbHkgc2V0dGluZzoKIAogcGdzZXQgImZsYWcgSVBTRUMiCiBwZ3NldCAiZmxvd3MgMSIKIAogVG8gYXZvaWQgYnJlYWtpbmcgZXhpc3RpbmcgdGVzdGJlZCBzY3JpcHRzIGZvciB1c2luZyBBSCB0eXBlIGFuZCB0dW5uZWwgbW9kZSwKLXVzZXIgY291bGQgdXNlICJwZ3NldCBzcGkgU1BJX1ZBTFVFIiB0byBzcGVjaWZ5IHdoaWNoIGZvcm1hbCBvZiB0cmFuc2Zvcm1hdGlvbgoreW91IGNhbiB1c2UgInBnc2V0IHNwaSBTUElfVkFMVUUiIHRvIHNwZWNpZnkgd2hpY2ggdHJhbnNmb3JtYXRpb24gbW9kZQogdG8gZW1wbG95LgogCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9yZHMudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3Jkcy50eHQKaW5kZXggYzY3MDc3Yy4uZTFhM2Q1OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3Jkcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3Jkcy50eHQKQEAgLTYyLDExICs2MiwxMCBAQAogPT09PT09PT09PT09PT09PQogCiAgIEFGX1JEUywgUEZfUkRTLCBTT0xfUkRTCi0gICAgICAgIFRoZXNlIGNvbnN0YW50cyBoYXZlbid0IGJlZW4gYXNzaWduZWQgeWV0LCBiZWNhdXNlIFJEUyBpc24ndCBpbgotICAgICAgICBtYWlubGluZSB5ZXQuIEN1cnJlbnRseSwgdGhlIGtlcm5lbCBtb2R1bGUgYXNzaWducyBzb21lIGNvbnN0YW50Ci0gICAgICAgIGFuZCBwdWJsaXNoZXMgaXQgdG8gdXNlciBzcGFjZSB0aHJvdWdoIHR3byBzeXNjdGwgZmlsZXMKLSAgICAgICAgICAgICAgICAvcHJvYy9zeXMvbmV0L3Jkcy9wZl9yZHMKLSAgICAgICAgICAgICAgICAvcHJvYy9zeXMvbmV0L3Jkcy9zb2xfcmRzCisJQUZfUkRTIGFuZCBQRl9SRFMgYXJlIHRoZSBkb21haW4gdHlwZSB0byBiZSB1c2VkIHdpdGggc29ja2V0KDIpCisJdG8gY3JlYXRlIFJEUyBzb2NrZXRzLiBTT0xfUkRTIGlzIHRoZSBzb2NrZXQtbGV2ZWwgdG8gYmUgdXNlZAorCXdpdGggc2V0c29ja29wdCgyKSBhbmQgZ2V0c29ja29wdCgyKSBmb3IgUkRTIHNwZWNpZmljIHNvY2tldAorCW9wdGlvbnMuCiAKICAgZmQgPSBzb2NrZXQoUEZfUkRTLCBTT0NLX1NFUVBBQ0tFVCwgMCk7CiAgICAgICAgIFRoaXMgY3JlYXRlcyBhIG5ldywgdW5ib3VuZCBSRFMgc29ja2V0LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3MyaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3MyaW8udHh0CmluZGV4IGQyYTlmNDMuLjAzNjJhNDIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zMmlvLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvczJpby50eHQKQEAgLTM4LDcgKzM4LDcgQEAKIAogMy4JRmVhdHVyZXMgc3VwcG9ydGVkOgogYS4gSnVtYm8gZnJhbWVzLiBYZnJhbWUgSS9JSSBzdXBwb3J0cyBNVFUgdXAgdG8gOTYwMCBieXRlcywKLW1vZGlmaWFibGUgdXNpbmcgaWZjb25maWcgY29tbWFuZC4KK21vZGlmaWFibGUgdXNpbmcgaXAgY29tbWFuZC4KIAogYi4gT2ZmbG9hZHMuIFN1cHBvcnRzIGNoZWNrc3VtIG9mZmxvYWQoVENQL1VEUC9JUCkgb24gdHJhbnNtaXQKIGFuZCByZWNlaXZlLCBUU08uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc2NhbGluZy50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc2NhbGluZy50eHQKaW5kZXggOTljYTQwZS4uY2JmYWMwOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NjYWxpbmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zY2FsaW5nLnR4dApAQCAtNDIxLDYgKzQyMSwxNSBAQAogd2l0aCB0aGUgQ1BVIHRoYXQgcHJvY2Vzc2VzIHRyYW5zbWl0IGNvbXBsZXRpb25zIGZvciB0aGF0IHF1ZXVlCiAodHJhbnNtaXQgaW50ZXJydXB0cykuCiAKK1BlciBUWCBRdWV1ZSByYXRlIGxpbWl0YXRpb246Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGVzZSBhcmUgcmF0ZS1saW1pdGF0aW9uIG1lY2hhbmlzbXMgaW1wbGVtZW50ZWQgYnkgSFcsIHdoZXJlIGN1cnJlbnRseQorYSBtYXgtcmF0ZSBhdHRyaWJ1dGUgaXMgc3VwcG9ydGVkLCBieSBzZXR0aW5nIGEgTWJwcyB2YWx1ZSB0bworCisvc3lzL2NsYXNzL25ldC88ZGV2Pi9xdWV1ZXMvdHgtPG4+L3R4X21heHJhdGUKKworQSB2YWx1ZSBvZiB6ZXJvIG1lYW5zIGRpc2FibGVkLCBhbmQgdGhpcyBpcyB0aGUgZGVmYXVsdC4KIAogRnVydGhlciBJbmZvcm1hdGlvbgogPT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3Z4Z2UudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3Z4Z2UudHh0CmluZGV4IGJiNzZjNjYuLmFiZmVjMjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy92eGdlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvdnhnZS50eHQKQEAgLTM5LDcgKzM5LDcgQEAKIAogaXYpICBKdW1ibyBmcmFtZXMKICAgICAgICBYMzEwMCBTZXJpZXMgc3VwcG9ydHMgTVRVIHVwIHRvIDk2MDAgYnl0ZXMsIG1vZGlmaWFibGUgdXNpbmcKLSAgICAgICBpZmNvbmZpZyBjb21tYW5kLgorICAgICAgIGlwIGNvbW1hbmQuCiAKIHYpICAgT2ZmbG9hZHMgc3VwcG9ydGVkOiAoRW5hYmxlZCBieSBkZWZhdWx0KQogICAgICAgIENoZWNrc3VtIG9mZmxvYWQgKFRDUC9VRFAvSVApIG9uIHRyYW5zbWl0IGFuZCByZWNlaXZlIHBhdGhzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3BpbmN0cmwudHh0IGIvRG9jdW1lbnRhdGlvbi9waW5jdHJsLnR4dAppbmRleCBiOGYyMTQ3Li5hOWI0NzE2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3BpbmN0cmwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcGluY3RybC50eHQKQEAgLTcyLDcgKzcyLDYgQEAKIAkubmFtZSA9ICJmb28iLAogCS5waW5zID0gZm9vX3BpbnMsCiAJLm5waW5zID0gQVJSQVlfU0laRShmb29fcGlucyksCi0JLm1heHBpbiA9IDYzLAogCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIApAQCAtMTY0LDggKzE2Myw4IEBACiB9CiAKIHN0YXRpYyBpbnQgZm9vX2dldF9ncm91cF9waW5zKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgc2VsZWN0b3IsCi0JCQkgICAgICAgdW5zaWduZWQgKiogY29uc3QgcGlucywKLQkJCSAgICAgICB1bnNpZ25lZCAqIGNvbnN0IG51bV9waW5zKQorCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkICoqcGlucywKKwkJCSAgICAgICB1bnNpZ25lZCAqbnVtX3BpbnMpCiB7CiAJKnBpbnMgPSAodW5zaWduZWQgKikgZm9vX2dyb3Vwc1tzZWxlY3Rvcl0ucGluczsKIAkqbnVtX3BpbnMgPSBmb29fZ3JvdXBzW3NlbGVjdG9yXS5udW1fcGluczsKQEAgLTU3MCw5ICs1NjksOCBAQAogdGhpcyBoYXBwZW5zLgogCiBQaW5tdXggZHJpdmVycyBhcmUgcmVxdWlyZWQgdG8gc3VwcGx5IGEgZmV3IGNhbGxiYWNrIGZ1bmN0aW9ucywgc29tZSBhcmUKLW9wdGlvbmFsLiBVc3VhbGx5IHRoZSBlbmFibGUoKSBhbmQgZGlzYWJsZSgpIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQsCi13cml0aW5nIHZhbHVlcyBpbnRvIHNvbWUgY2VydGFpbiByZWdpc3RlcnMgdG8gYWN0aXZhdGUgYSBjZXJ0YWluIG11eCBzZXR0aW5nCi1mb3IgYSBjZXJ0YWluIHBpbi4KK29wdGlvbmFsLiBVc3VhbGx5IHRoZSBzZXRfbXV4KCkgZnVuY3Rpb24gaXMgaW1wbGVtZW50ZWQsIHdyaXRpbmcgdmFsdWVzIGludG8KK3NvbWUgY2VydGFpbiByZWdpc3RlcnMgdG8gYWN0aXZhdGUgYSBjZXJ0YWluIG11eCBzZXR0aW5nIGZvciBhIGNlcnRhaW4gcGluLgogCiBBIHNpbXBsZSBkcml2ZXIgZm9yIHRoZSBhYm92ZSBleGFtcGxlIHdpbGwgd29yayBieSBzZXR0aW5nIGJpdHMgMCwgMSwgMiwgMyBvciA0CiBpbnRvIHNvbWUgcmVnaXN0ZXIgbmFtZWQgTVVYIHRvIHNlbGVjdCBhIGNlcnRhaW4gZnVuY3Rpb24gd2l0aCBhIGNlcnRhaW4KQEAgLTY4MywxMiArNjgxLDEyIEBACiAJfSwKIH07CiAKLWludCBmb29fZ2V0X2Z1bmN0aW9uc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpCitzdGF0aWMgaW50IGZvb19nZXRfZnVuY3Rpb25zX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldikKIHsKIAlyZXR1cm4gQVJSQVlfU0laRShmb29fZnVuY3Rpb25zKTsKIH0KIAotY29uc3QgY2hhciAqZm9vX2dldF9mbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIHNlbGVjdG9yKQorc3RhdGljIGNvbnN0IGNoYXIgKmZvb19nZXRfZm5hbWUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNpZ25lZCBzZWxlY3RvcikKIHsKIAlyZXR1cm4gZm9vX2Z1bmN0aW9uc1tzZWxlY3Rvcl0ubmFtZTsKIH0KQEAgLTcwMiw3ICs3MDAsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZm9vX3NldF9tdXgoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNpZ25lZCBzZWxlY3RvciwKK3N0YXRpYyBpbnQgZm9vX3NldF9tdXgoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNpZ25lZCBzZWxlY3RvciwKIAkJdW5zaWduZWQgZ3JvdXApCiB7CiAJdTggcmVnYml0ID0gKDEgPDwgc2VsZWN0b3IgKyBncm91cCk7CkBAIC03MTEsNyArNzA5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHBpbm11eF9vcHMgZm9vX3BteG9wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGlubXV4X29wcyBmb29fcG14b3BzID0gewogCS5nZXRfZnVuY3Rpb25zX2NvdW50ID0gZm9vX2dldF9mdW5jdGlvbnNfY291bnQsCiAJLmdldF9mdW5jdGlvbl9uYW1lID0gZm9vX2dldF9mbmFtZSwKIAkuZ2V0X2Z1bmN0aW9uX2dyb3VwcyA9IGZvb19nZXRfZ3JvdXBzLApAQCAtMTI2Niw3ICsxMjY0LDcgQEAKIAogVXN1YWxseSB0aGUgcGluIGNvbnRyb2wgY29yZSBoYW5kbGVkIHRoZSBnZXQvcHV0IHBhaXIgYW5kIGNhbGwgb3V0IHRvIHRoZQogZGV2aWNlIGRyaXZlcnMgYm9va2tlZXBpbmcgb3BlcmF0aW9ucywgbGlrZSBjaGVja2luZyBhdmFpbGFibGUgZnVuY3Rpb25zIGFuZAotdGhlIGFzc29jaWF0ZWQgcGlucywgd2hlcmVhcyB0aGUgZW5hYmxlL2Rpc2FibGUgcGFzcyBvbiB0byB0aGUgcGluIGNvbnRyb2xsZXIKK3RoZSBhc3NvY2lhdGVkIHBpbnMsIHdoZXJlYXMgc2VsZWN0X3N0YXRlIHBhc3Mgb24gdG8gdGhlIHBpbiBjb250cm9sbGVyCiBkcml2ZXIgd2hpY2ggdGFrZXMgY2FyZSBvZiBhY3RpdmF0aW5nIGFuZC9vciBkZWFjdGl2YXRpbmcgdGhlIG11eCBzZXR0aW5nIGJ5CiBxdWlja2x5IHBva2luZyBzb21lIHJlZ2lzdGVycy4KIApAQCAtMTM2Myw4ICsxMzYxLDkgQEAKICJBZHZhbmNlZCBtYXBwaW5nIiBhYm92ZS4gU28gdGhhdCBmb3IgYW4gU1BJIGRldmljZSwgd2UgaGF2ZSB0d28gc3RhdGVzIG5hbWVkCiAicG9zLUEiIGFuZCAicG9zLUIiLgogCi1UaGlzIHNuaXBwZXQgZmlyc3QgbXV4ZXMgdGhlIGZ1bmN0aW9uIGluIHRoZSBwaW5zIGRlZmluZWQgYnkgZ3JvdXAgQSwgZW5hYmxlcwotaXQsIGRpc2FibGVzIGFuZCByZWxlYXNlcyBpdCwgYW5kIG11eGVzIGl0IGluIG9uIHRoZSBwaW5zIGRlZmluZWQgYnkgZ3JvdXAgQjoKK1RoaXMgc25pcHBldCBmaXJzdCBpbml0aWFsaXplcyBhIHN0YXRlIG9iamVjdCBmb3IgYm90aCBncm91cHMgKGluIGZvb19wcm9iZSgpKSwKK3RoZW4gbXV4ZXMgdGhlIGZ1bmN0aW9uIGluIHRoZSBwaW5zIGRlZmluZWQgYnkgZ3JvdXAgQSwgYW5kIGZpbmFsbHkgbXV4ZXMgaXQgaW4KK29uIHRoZSBwaW5zIGRlZmluZWQgYnkgZ3JvdXAgQjoKIAogI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvY29uc3VtZXIuaD4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9iYXNpYy1wbS1kZWJ1Z2dpbmcudHh0CmluZGV4IGVkZWVjZDQuLmI5NjA5OGMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcG93ZXIvYmFzaWMtcG0tZGVidWdnaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Bvd2VyL2Jhc2ljLXBtLWRlYnVnZ2luZy50eHQKQEAgLTc1LDEyICs3NSwxNCBAQAogIyBlY2hvIHBsYXRmb3JtID4gL3N5cy9wb3dlci9kaXNrCiAjIGVjaG8gZGlzayA+IC9zeXMvcG93ZXIvc3RhdGUKIAotVGhlbiwgdGhlIGtlcm5lbCB3aWxsIHRyeSB0byBmcmVlemUgcHJvY2Vzc2VzLCBzdXNwZW5kIGRldmljZXMsIHdhaXQgNSBzZWNvbmRzLAotcmVzdW1lIGRldmljZXMgYW5kIHRoYXcgcHJvY2Vzc2VzLiAgSWYgInBsYXRmb3JtIiBpcyB3cml0dGVuIHRvCitUaGVuLCB0aGUga2VybmVsIHdpbGwgdHJ5IHRvIGZyZWV6ZSBwcm9jZXNzZXMsIHN1c3BlbmQgZGV2aWNlcywgd2FpdCBhIGZldworc2Vjb25kcyAoNSBieSBkZWZhdWx0LCBidXQgY29uZmlndXJhYmxlIGJ5IHRoZSBzdXNwZW5kLnBtX3Rlc3RfZGVsYXkgbW9kdWxlCitwYXJhbWV0ZXIpLCByZXN1bWUgZGV2aWNlcyBhbmQgdGhhdyBwcm9jZXNzZXMuICBJZiAicGxhdGZvcm0iIGlzIHdyaXR0ZW4gdG8KIC9zeXMvcG93ZXIvcG1fdGVzdCAsIHRoZW4gYWZ0ZXIgc3VzcGVuZGluZyBkZXZpY2VzIHRoZSBrZXJuZWwgd2lsbCBhZGRpdGlvbmFsbHkKIGludm9rZSB0aGUgZ2xvYmFsIGNvbnRyb2wgbWV0aG9kcyAoZWcuIEFDUEkgZ2xvYmFsIGNvbnRyb2wgbWV0aG9kcykgdXNlZCB0bwotcHJlcGFyZSB0aGUgcGxhdGZvcm0gZmlybXdhcmUgZm9yIGhpYmVybmF0aW9uLiAgTmV4dCwgaXQgd2lsbCB3YWl0IDUgc2Vjb25kcyBhbmQKLWludm9rZSB0aGUgcGxhdGZvcm0gKGVnLiBBQ1BJKSBnbG9iYWwgbWV0aG9kcyB1c2VkIHRvIGNhbmNlbCBoaWJlcm5hdGlvbiBldGMuCitwcmVwYXJlIHRoZSBwbGF0Zm9ybSBmaXJtd2FyZSBmb3IgaGliZXJuYXRpb24uICBOZXh0LCBpdCB3aWxsIHdhaXQgYQorY29uZmlndXJhYmxlIG51bWJlciBvZiBzZWNvbmRzIGFuZCBpbnZva2UgdGhlIHBsYXRmb3JtIChlZy4gQUNQSSkgZ2xvYmFsCittZXRob2RzIHVzZWQgdG8gY2FuY2VsIGhpYmVybmF0aW9uIGV0Yy4KIAogV3JpdGluZyAibm9uZSIgdG8gL3N5cy9wb3dlci9wbV90ZXN0IGNhdXNlcyB0aGUga2VybmVsIHRvIHN3aXRjaCB0byB0aGUgbm9ybWFsCiBoaWJlcm5hdGlvbi9zdXNwZW5kIG9wZXJhdGlvbnMuICBBbHNvLCB3aGVuIG9wZW4gZm9yIHJlYWRpbmcsIC9zeXMvcG93ZXIvcG1fdGVzdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9wb3dlci9yZWd1bGF0b3IvY29uc3VtZXIudHh0IGIvRG9jdW1lbnRhdGlvbi9wb3dlci9yZWd1bGF0b3IvY29uc3VtZXIudHh0CmluZGV4IDhhZmIyMzZjLi5lNTE1NjRjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Bvd2VyL3JlZ3VsYXRvci9jb25zdW1lci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9wb3dlci9yZWd1bGF0b3IvY29uc3VtZXIudHh0CkBAIC0xMzcsNyArMTM3LDcgQEAKIENvbnN1bWVyIGRyaXZlcnMgY2FuIHJlcXVlc3QgYSBjaGFuZ2UgaW4gdGhlaXIgc3VwcGx5IHJlZ3VsYXRvciBvcGVyYXRpbmcgbW9kZQogYnkgY2FsbGluZyA6LQogCi1pbnQgcmVndWxhdG9yX3NldF9vcHRpbXVtX21vZGUoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLCBpbnQgbG9hZF91QSk7CitpbnQgcmVndWxhdG9yX3NldF9sb2FkKHN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvciwgaW50IGxvYWRfdUEpOwogCiBUaGlzIHdpbGwgY2F1c2UgdGhlIGNvcmUgdG8gcmVjYWxjdWxhdGUgdGhlIHRvdGFsIGxvYWQgb24gdGhlIHJlZ3VsYXRvciAoYmFzZWQKIG9uIGFsbCBpdHMgY29uc3VtZXJzKSBhbmQgY2hhbmdlIG9wZXJhdGluZyBtb2RlIChpZiBuZWNlc3NhcnkgYW5kIHBlcm1pdHRlZCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vcHJpbnRrLWZvcm1hdHMudHh0IGIvRG9jdW1lbnRhdGlvbi9wcmludGstZm9ybWF0cy50eHQKaW5kZXggNWE2MTVjMTQuLmNiNmE1OTYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcHJpbnRrLWZvcm1hdHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vcHJpbnRrLWZvcm1hdHMudHh0CkBAIC04LDYgKzgsMjEgQEAKIAkJdW5zaWduZWQgbG9uZyBsb25nCSVsbHUgb3IgJWxseAogCQlzaXplX3QJCQklenUgb3IgJXp4CiAJCXNzaXplX3QJCQklemQgb3IgJXp4CisJCXMzMgkJCSVkIG9yICV4CisJCXUzMgkJCSV1IG9yICV4CisJCXM2NAkJCSVsbGQgb3IgJWxseAorCQl1NjQJCQklbGx1IG9yICVsbHgKKworSWYgPHR5cGU+IGlzIGRlcGVuZGVudCBvbiBhIGNvbmZpZyBvcHRpb24gZm9yIGl0cyBzaXplIChlLmcuLCBzZWN0b3JfdCwKK2Jsa2NudF90KSBvciBpcyBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZvciBpdHMgc2l6ZSAoZS5nLiwgdGNmbGFnX3QpLCB1c2UgYQorZm9ybWF0IHNwZWNpZmllciBvZiBpdHMgbGFyZ2VzdCBwb3NzaWJsZSB0eXBlIGFuZCBleHBsaWNpdGx5IGNhc3QgdG8gaXQuCitFeGFtcGxlOgorCisJcHJpbnRrKCJ0ZXN0OiBzZWN0b3IgbnVtYmVyL3RvdGFsIGJsb2NrczogJWxsdS8lbGx1XG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXNlY3RvciwgKHVuc2lnbmVkIGxvbmcgbG9uZylibG9ja2NvdW50KTsKKworUmVtaW5kZXI6IHNpemVvZigpIHJlc3VsdCBpcyBvZiB0eXBlIHNpemVfdC4KKwogCiBSYXcgcG9pbnRlciB2YWx1ZSBTSE9VTEQgYmUgcHJpbnRlZCB3aXRoICVwLiBUaGUga2VybmVsIHN1cHBvcnRzCiB0aGUgZm9sbG93aW5nIGV4dGVuZGVkIGZvcm1hdCBzcGVjaWZpZXJzIGZvciBwb2ludGVyIHR5cGVzOgpAQCAtNTQsNiArNjksNyBAQAogCiAJRm9yIHByaW50aW5nIHN0cnVjdCByZXNvdXJjZXMuIFRoZSAnUicgYW5kICdyJyBzcGVjaWZpZXJzIHJlc3VsdCBpbiBhCiAJcHJpbnRlZCByZXNvdXJjZSB3aXRoICgnUicpIG9yIHdpdGhvdXQgKCdyJykgYSBkZWNvZGVkIGZsYWdzIG1lbWJlci4KKwlQYXNzZWQgYnkgcmVmZXJlbmNlLgogCiBQaHlzaWNhbCBhZGRyZXNzZXMgdHlwZXMgcGh5c19hZGRyX3Q6CiAKQEAgLTEzMiw2ICsxNDgsOCBAQAogCXNwZWNpZmllciB0byB1c2UgcmV2ZXJzZWQgYnl0ZSBvcmRlciBzdWl0YWJsZSBmb3IgdmlzdWFsIGludGVycHJldGF0aW9uCiAJb2YgQmx1ZXRvb3RoIGFkZHJlc3NlcyB3aGljaCBhcmUgaW4gdGhlIGxpdHRsZSBlbmRpYW4gb3JkZXIuCiAKKwlQYXNzZWQgYnkgcmVmZXJlbmNlLgorCiBJUHY0IGFkZHJlc3NlczoKIAogCSVwSTQJMS4yLjMuNApAQCAtMTQ2LDYgKzE2NCw4IEBACiAJaG9zdCwgbmV0d29yaywgYmlnIG9yIGxpdHRsZSBlbmRpYW4gb3JkZXIgYWRkcmVzc2VzIHJlc3BlY3RpdmVseS4gV2hlcmUKIAlubyBzcGVjaWZpZXIgaXMgcHJvdmlkZWQgdGhlIGRlZmF1bHQgbmV0d29yay9iaWcgZW5kaWFuIG9yZGVyIGlzIHVzZWQuCiAKKwlQYXNzZWQgYnkgcmVmZXJlbmNlLgorCiBJUHY2IGFkZHJlc3NlczoKIAogCSVwSTYJMDAwMTowMDAyOjAwMDM6MDAwNDowMDA1OjAwMDY6MDAwNzowMDA4CkBAIC0xNjAsNiArMTgwLDggQEAKIAlwcmludCBhIGNvbXByZXNzZWQgSVB2NiBhZGRyZXNzIGFzIGRlc2NyaWJlZCBieQogCWh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU5NTIKIAorCVBhc3NlZCBieSByZWZlcmVuY2UuCisKIElQdjQvSVB2NiBhZGRyZXNzZXMgKGdlbmVyaWMsIHdpdGggcG9ydCwgZmxvd2luZm8sIHNjb3BlKToKIAogCSVwSVMJMS4yLjMuNAkJb3IgMDAwMTowMDAyOjAwMDM6MDAwNDowMDA1OjAwMDY6MDAwNzowMDA4CkBAIC0xODYsNiArMjA4LDggQEAKIAlzcGVjaWZpZXJzIGNhbiBiZSB1c2VkIGFzIHdlbGwgYW5kIGFyZSBpZ25vcmVkIGluIGNhc2Ugb2YgYW4gSVB2NgogCWFkZHJlc3MuCiAKKwlQYXNzZWQgYnkgcmVmZXJlbmNlLgorCiAJRnVydGhlciBleGFtcGxlczoKIAogCSVwSVNmYwkJMS4yLjMuNAkJb3IgWzE6MjozOjQ6NTo2Ojc6OF0vMTIzNDU2Nzg5CkBAIC0yMDcsNiArMjMxLDggQEAKIAlXaGVyZSBubyBhZGRpdGlvbmFsIHNwZWNpZmllcnMgYXJlIHVzZWQgdGhlIGRlZmF1bHQgbGl0dGxlIGVuZGlhbgogCW9yZGVyIHdpdGggbG93ZXIgY2FzZSBoZXggY2hhcmFjdGVycyB3aWxsIGJlIHByaW50ZWQuCiAKKwlQYXNzZWQgYnkgcmVmZXJlbmNlLgorCiBkZW50cnkgbmFtZXM6CiAJJXBkeywyLDMsNH0KIAklcER7LDIsMyw0fQpAQCAtMjE2LDYgKzI0Miw4IEBACiAJZXF1aXZhbGVudCBvZiAlcyBkZW50cnktPmRfbmFtZS5uYW1lIHdlIHVzZWQgdG8gdXNlLCAlcGQ8bj4gcHJpbnRzCiAJbiBsYXN0IGNvbXBvbmVudHMuICAlcEQgZG9lcyB0aGUgc2FtZSB0aGluZyBmb3Igc3RydWN0IGZpbGUuCiAKKwlQYXNzZWQgYnkgcmVmZXJlbmNlLgorCiBzdHJ1Y3QgdmFfZm9ybWF0OgogCiAJJXBWCkBAIC0yMzEsMjMgKzI1OSwyMCBAQAogCURvIG5vdCB1c2UgdGhpcyBmZWF0dXJlIHdpdGhvdXQgc29tZSBtZWNoYW5pc20gdG8gdmVyaWZ5IHRoZQogCWNvcnJlY3RuZXNzIG9mIHRoZSBmb3JtYXQgc3RyaW5nIGFuZCB2YV9saXN0IGFyZ3VtZW50cy4KIAotdTY0IFNIT1VMRCBiZSBwcmludGVkIHdpdGggJWxsdS8lbGx4OgorCVBhc3NlZCBieSByZWZlcmVuY2UuCiAKLQlwcmludGsoIiVsbHUiLCB1NjRfdmFyKTsKK3N0cnVjdCBjbGs6CiAKLXM2NCBTSE9VTEQgYmUgcHJpbnRlZCB3aXRoICVsbGQvJWxseDoKKwklcEMJcGxsMQorCSVwQ24JcGxsMQorCSVwQ3IJMTU2MDAwMDAwMAogCi0JcHJpbnRrKCIlbGxkIiwgczY0X3Zhcik7CisJRm9yIHByaW50aW5nIHN0cnVjdCBjbGsgc3RydWN0dXJlcy4gJyVwQycgYW5kICclcENuJyBwcmludCB0aGUgbmFtZQorCShDb21tb24gQ2xvY2sgRnJhbWV3b3JrKSBvciBhZGRyZXNzIChsZWdhY3kgY2xvY2sgZnJhbWV3b3JrKSBvZiB0aGUKKwlzdHJ1Y3R1cmU7ICclcENyJyBwcmludHMgdGhlIGN1cnJlbnQgY2xvY2sgcmF0ZS4KIAotSWYgPHR5cGU+IGlzIGRlcGVuZGVudCBvbiBhIGNvbmZpZyBvcHRpb24gZm9yIGl0cyBzaXplIChlLmcuLCBzZWN0b3JfdCwKLWJsa2NudF90KSBvciBpcyBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZvciBpdHMgc2l6ZSAoZS5nLiwgdGNmbGFnX3QpLCB1c2UgYQotZm9ybWF0IHNwZWNpZmllciBvZiBpdHMgbGFyZ2VzdCBwb3NzaWJsZSB0eXBlIGFuZCBleHBsaWNpdGx5IGNhc3QgdG8gaXQuCi1FeGFtcGxlOgorCVBhc3NlZCBieSByZWZlcmVuY2UuCiAKLQlwcmludGsoInRlc3Q6IHNlY3RvciBudW1iZXIvdG90YWwgYmxvY2tzOiAlbGx1LyVsbHVcbiIsCi0JCSh1bnNpZ25lZCBsb25nIGxvbmcpc2VjdG9yLCAodW5zaWduZWQgbG9uZyBsb25nKWJsb2NrY291bnQpOwotCi1SZW1pbmRlcjogc2l6ZW9mKCkgcmVzdWx0IGlzIG9mIHR5cGUgc2l6ZV90LgogCiBUaGFuayB5b3UgZm9yIHlvdXIgY29vcGVyYXRpb24gYW5kIGF0dGVudGlvbi4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ydGMudHh0IGIvRG9jdW1lbnRhdGlvbi9ydGMudHh0CmluZGV4IDU5NmI2MGMuLjg0NDZmMWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vcnRjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3J0Yy50eHQKQEAgLTIwNCwyNjYgKzIwNCw0IEBACiAKICAgICAqCVJUQ19QSUVfT04sIFJUQ19QSUVfT0ZGOiBUaGVzZSBhcmUgYWxzbyBlbXVsYXRlZCBieSB0aGUgZ2VuZXJpYyBjb2RlLgogCi1JZiBhbGwgZWxzZSBmYWlscywgY2hlY2sgb3V0IHRoZSBydGMtdGVzdC5jIGRyaXZlciEKLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLSA4PCAtLS0tLS0tLS0tLS0tLS0tIDg8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qCi0gKiAgICAgIFJlYWwgVGltZSBDbG9jayBEcml2ZXIgVGVzdC9FeGFtcGxlIFByb2dyYW0KLSAqCi0gKiAgICAgIENvbXBpbGUgd2l0aDoKLSAqCQkgICAgIGdjYyAtcyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIHJ0Y3Rlc3QuYyAtbyBydGN0ZXN0Ci0gKgotICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIFBhdWwgR29ydG1ha2VyLgotICoKLSAqICAgICAgUmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCi0gKiAgICAgIGluY2x1ZGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCi0gKgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotCi0KLS8qCi0gKiBUaGlzIGV4cGVjdHMgdGhlIG5ldyBSVEMgY2xhc3MgZHJpdmVyIGZyYW1ld29yaywgd29ya2luZyB3aXRoCi0gKiBjbG9ja3MgdGhhdCB3aWxsIG9mdGVuIG5vdCBiZSBjbG9uZXMgb2Ygd2hhdCB0aGUgUEMtQVQgaGFkLgotICogVXNlIHRoZSBjb21tYW5kIGxpbmUgdG8gc3BlY2lmeSBhbm90aGVyIFJUQyBpZiB5b3UgbmVlZCBvbmUuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRfcnRjW10gPSAiL2Rldi9ydGMwIjsKLQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0JaW50IGksIGZkLCByZXR2YWwsIGlycWNvdW50ID0gMDsKLQl1bnNpZ25lZCBsb25nIHRtcCwgZGF0YTsKLQlzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOwotCWNvbnN0IGNoYXIgKnJ0YyA9IGRlZmF1bHRfcnRjOwotCi0Jc3dpdGNoIChhcmdjKSB7Ci0JY2FzZSAyOgotCQlydGMgPSBhcmd2WzFdOwotCQkvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgMToKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZnByaW50ZihzdGRlcnIsICJ1c2FnZTogIHJ0Y3Rlc3QgW3J0Y2Rldl1cbiIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlmZCA9IG9wZW4ocnRjLCBPX1JET05MWSk7Ci0KLQlpZiAoZmQgPT0gIC0xKSB7Ci0JCXBlcnJvcihydGMpOwotCQlleGl0KGVycm5vKTsKLQl9Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIlxuXHRcdFx0UlRDIERyaXZlciBUZXN0IEV4YW1wbGUuXG5cbiIpOwotCi0JLyogVHVybiBvbiB1cGRhdGUgaW50ZXJydXB0cyAob25lIHBlciBzZWNvbmQpICovCi0JcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19VSUVfT04sIDApOwotCWlmIChyZXR2YWwgPT0gLTEpIHsKLQkJaWYgKGVycm5vID09IEVOT1RUWSkgewotCQkJZnByaW50ZihzdGRlcnIsCi0JCQkJIlxuLi4uVXBkYXRlIElSUXMgbm90IHN1cHBvcnRlZC5cbiIpOwotCQkJZ290byB0ZXN0X1JFQUQ7Ci0JCX0KLQkJcGVycm9yKCJSVENfVUlFX09OIGlvY3RsIik7Ci0JCWV4aXQoZXJybm8pOwotCX0KLQotCWZwcmludGYoc3RkZXJyLCAiQ291bnRpbmcgNSB1cGRhdGUgKDEvc2VjKSBpbnRlcnJ1cHRzIGZyb20gcmVhZGluZyAlczoiLAotCQkJcnRjKTsKLQlmZmx1c2goc3RkZXJyKTsKLQlmb3IgKGk9MTsgaTw2OyBpKyspIHsKLQkJLyogVGhpcyByZWFkIHdpbGwgYmxvY2sgKi8KLQkJcmV0dmFsID0gcmVhZChmZCwgJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7Ci0JCWlmIChyZXR2YWwgPT0gLTEpIHsKLQkJCXBlcnJvcigicmVhZCIpOwotCQkJZXhpdChlcnJubyk7Ci0JCX0KLQkJZnByaW50ZihzdGRlcnIsICIgJWQiLGkpOwotCQlmZmx1c2goc3RkZXJyKTsKLQkJaXJxY291bnQrKzsKLQl9Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIlxuQWdhaW4sIGZyb20gdXNpbmcgc2VsZWN0KDIpIG9uIC9kZXYvcnRjOiIpOwotCWZmbHVzaChzdGRlcnIpOwotCWZvciAoaT0xOyBpPDY7IGkrKykgewotCQlzdHJ1Y3QgdGltZXZhbCB0diA9IHs1LCAwfTsgICAgIC8qIDUgc2Vjb25kIHRpbWVvdXQgb24gc2VsZWN0ICovCi0JCWZkX3NldCByZWFkZmRzOwotCi0JCUZEX1pFUk8oJnJlYWRmZHMpOwotCQlGRF9TRVQoZmQsICZyZWFkZmRzKTsKLQkJLyogVGhlIHNlbGVjdCB3aWxsIHdhaXQgdW50aWwgYW4gUlRDIGludGVycnVwdCBoYXBwZW5zLiAqLwotCQlyZXR2YWwgPSBzZWxlY3QoZmQrMSwgJnJlYWRmZHMsIE5VTEwsIE5VTEwsICZ0dik7Ci0JCWlmIChyZXR2YWwgPT0gLTEpIHsKLQkJICAgICAgICBwZXJyb3IoInNlbGVjdCIpOwotCQkgICAgICAgIGV4aXQoZXJybm8pOwotCQl9Ci0JCS8qIFRoaXMgcmVhZCB3b24ndCBibG9jayB1bmxpa2UgdGhlIHNlbGVjdC1sZXNzIGNhc2UgYWJvdmUuICovCi0JCXJldHZhbCA9IHJlYWQoZmQsICZkYXRhLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCQlpZiAocmV0dmFsID09IC0xKSB7Ci0JCSAgICAgICAgcGVycm9yKCJyZWFkIik7Ci0JCSAgICAgICAgZXhpdChlcnJubyk7Ci0JCX0KLQkJZnByaW50ZihzdGRlcnIsICIgJWQiLGkpOwotCQlmZmx1c2goc3RkZXJyKTsKLQkJaXJxY291bnQrKzsKLQl9Ci0KLQkvKiBUdXJuIG9mZiB1cGRhdGUgaW50ZXJydXB0cyAqLwotCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfVUlFX09GRiwgMCk7Ci0JaWYgKHJldHZhbCA9PSAtMSkgewotCQlwZXJyb3IoIlJUQ19VSUVfT0ZGIGlvY3RsIik7Ci0JCWV4aXQoZXJybm8pOwotCX0KLQotdGVzdF9SRUFEOgotCS8qIFJlYWQgdGhlIFJUQyB0aW1lL2RhdGUgKi8KLQlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX1JEX1RJTUUsICZydGNfdG0pOwotCWlmIChyZXR2YWwgPT0gLTEpIHsKLQkJcGVycm9yKCJSVENfUkRfVElNRSBpb2N0bCIpOwotCQlleGl0KGVycm5vKTsKLQl9Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIlxuXG5DdXJyZW50IFJUQyBkYXRlL3RpbWUgaXMgJWQtJWQtJWQsICUwMmQ6JTAyZDolMDJkLlxuIiwKLQkJcnRjX3RtLnRtX21kYXksIHJ0Y190bS50bV9tb24gKyAxLCBydGNfdG0udG1feWVhciArIDE5MDAsCi0JCXJ0Y190bS50bV9ob3VyLCBydGNfdG0udG1fbWluLCBydGNfdG0udG1fc2VjKTsKLQotCS8qIFNldCB0aGUgYWxhcm0gdG8gNSBzZWMgaW4gdGhlIGZ1dHVyZSwgYW5kIGNoZWNrIGZvciByb2xsb3ZlciAqLwotCXJ0Y190bS50bV9zZWMgKz0gNTsKLQlpZiAocnRjX3RtLnRtX3NlYyA+PSA2MCkgewotCQlydGNfdG0udG1fc2VjICU9IDYwOwotCQlydGNfdG0udG1fbWluKys7Ci0JfQotCWlmIChydGNfdG0udG1fbWluID09IDYwKSB7Ci0JCXJ0Y190bS50bV9taW4gPSAwOwotCQlydGNfdG0udG1faG91cisrOwotCX0KLQlpZiAocnRjX3RtLnRtX2hvdXIgPT0gMjQpCi0JCXJ0Y190bS50bV9ob3VyID0gMDsKLQotCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfQUxNX1NFVCwgJnJ0Y190bSk7Ci0JaWYgKHJldHZhbCA9PSAtMSkgewotCQlpZiAoZXJybm8gPT0gRU5PVFRZKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkiXG4uLi5BbGFybSBJUlFzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKLQkJCWdvdG8gdGVzdF9QSUU7Ci0JCX0KLQkJcGVycm9yKCJSVENfQUxNX1NFVCBpb2N0bCIpOwotCQlleGl0KGVycm5vKTsKLQl9Ci0KLQkvKiBSZWFkIHRoZSBjdXJyZW50IGFsYXJtIHNldHRpbmdzICovCi0JcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19BTE1fUkVBRCwgJnJ0Y190bSk7Ci0JaWYgKHJldHZhbCA9PSAtMSkgewotCQlwZXJyb3IoIlJUQ19BTE1fUkVBRCBpb2N0bCIpOwotCQlleGl0KGVycm5vKTsKLQl9Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIkFsYXJtIHRpbWUgbm93IHNldCB0byAlMDJkOiUwMmQ6JTAyZC5cbiIsCi0JCXJ0Y190bS50bV9ob3VyLCBydGNfdG0udG1fbWluLCBydGNfdG0udG1fc2VjKTsKLQotCS8qIEVuYWJsZSBhbGFybSBpbnRlcnJ1cHRzICovCi0JcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19BSUVfT04sIDApOwotCWlmIChyZXR2YWwgPT0gLTEpIHsKLQkJcGVycm9yKCJSVENfQUlFX09OIGlvY3RsIik7Ci0JCWV4aXQoZXJybm8pOwotCX0KLQotCWZwcmludGYoc3RkZXJyLCAiV2FpdGluZyA1IHNlY29uZHMgZm9yIGFsYXJtLi4uIik7Ci0JZmZsdXNoKHN0ZGVycik7Ci0JLyogVGhpcyBibG9ja3MgdW50aWwgdGhlIGFsYXJtIHJpbmcgY2F1c2VzIGFuIGludGVycnVwdCAqLwotCXJldHZhbCA9IHJlYWQoZmQsICZkYXRhLCBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCWlmIChyZXR2YWwgPT0gLTEpIHsKLQkJcGVycm9yKCJyZWFkIik7Ci0JCWV4aXQoZXJybm8pOwotCX0KLQlpcnFjb3VudCsrOwotCWZwcmludGYoc3RkZXJyLCAiIG9rYXkuIEFsYXJtIHJhbmcuXG4iKTsKLQotCS8qIERpc2FibGUgYWxhcm0gaW50ZXJydXB0cyAqLwotCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfQUlFX09GRiwgMCk7Ci0JaWYgKHJldHZhbCA9PSAtMSkgewotCQlwZXJyb3IoIlJUQ19BSUVfT0ZGIGlvY3RsIik7Ci0JCWV4aXQoZXJybm8pOwotCX0KLQotdGVzdF9QSUU6Ci0JLyogUmVhZCBwZXJpb2RpYyBJUlEgcmF0ZSAqLwotCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfSVJRUF9SRUFELCAmdG1wKTsKLQlpZiAocmV0dmFsID09IC0xKSB7Ci0JCS8qIG5vdCBhbGwgUlRDcyBzdXBwb3J0IHBlcmlvZGljIElSUXMgKi8KLQkJaWYgKGVycm5vID09IEVOT1RUWSkgewotCQkJZnByaW50ZihzdGRlcnIsICJcbk5vIHBlcmlvZGljIElSUSBzdXBwb3J0XG4iKTsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCQlwZXJyb3IoIlJUQ19JUlFQX1JFQUQgaW9jdGwiKTsKLQkJZXhpdChlcnJubyk7Ci0JfQotCWZwcmludGYoc3RkZXJyLCAiXG5QZXJpb2RpYyBJUlEgcmF0ZSBpcyAlbGRIei5cbiIsIHRtcCk7Ci0KLQlmcHJpbnRmKHN0ZGVyciwgIkNvdW50aW5nIDIwIGludGVycnVwdHMgYXQ6Iik7Ci0JZmZsdXNoKHN0ZGVycik7Ci0KLQkvKiBUaGUgZnJlcXVlbmNpZXMgMTI4SHosIDI1Nkh6LCAuLi4gODE5Mkh6IGFyZSBvbmx5IGFsbG93ZWQgZm9yIHJvb3QuICovCi0JZm9yICh0bXA9MjsgdG1wPD02NDsgdG1wKj0yKSB7Ci0KLQkJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19JUlFQX1NFVCwgdG1wKTsKLQkJaWYgKHJldHZhbCA9PSAtMSkgewotCQkJLyogbm90IGFsbCBSVENzIGNhbiBjaGFuZ2UgdGhlaXIgcGVyaW9kaWMgSVJRIHJhdGUgKi8KLQkJCWlmIChlcnJubyA9PSBFTk9UVFkpIHsKLQkJCQlmcHJpbnRmKHN0ZGVyciwKLQkJCQkJIlxuLi4uUGVyaW9kaWMgSVJRIHJhdGUgaXMgZml4ZWRcbiIpOwotCQkJCWdvdG8gZG9uZTsKLQkJCX0KLQkJCXBlcnJvcigiUlRDX0lSUVBfU0VUIGlvY3RsIik7Ci0JCQlleGl0KGVycm5vKTsKLQkJfQotCi0JCWZwcmludGYoc3RkZXJyLCAiXG4lbGRIejpcdCIsIHRtcCk7Ci0JCWZmbHVzaChzdGRlcnIpOwotCi0JCS8qIEVuYWJsZSBwZXJpb2RpYyBpbnRlcnJ1cHRzICovCi0JCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfUElFX09OLCAwKTsKLQkJaWYgKHJldHZhbCA9PSAtMSkgewotCQkJcGVycm9yKCJSVENfUElFX09OIGlvY3RsIik7Ci0JCQlleGl0KGVycm5vKTsKLQkJfQotCi0JCWZvciAoaT0xOyBpPDIxOyBpKyspIHsKLQkJCS8qIFRoaXMgYmxvY2tzICovCi0JCQlyZXR2YWwgPSByZWFkKGZkLCAmZGF0YSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKLQkJCWlmIChyZXR2YWwgPT0gLTEpIHsKLQkJCQlwZXJyb3IoInJlYWQiKTsKLQkJCQlleGl0KGVycm5vKTsKLQkJCX0KLQkJCWZwcmludGYoc3RkZXJyLCAiICVkIixpKTsKLQkJCWZmbHVzaChzdGRlcnIpOwotCQkJaXJxY291bnQrKzsKLQkJfQotCi0JCS8qIERpc2FibGUgcGVyaW9kaWMgaW50ZXJydXB0cyAqLwotCQlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX1BJRV9PRkYsIDApOwotCQlpZiAocmV0dmFsID09IC0xKSB7Ci0JCQlwZXJyb3IoIlJUQ19QSUVfT0ZGIGlvY3RsIik7Ci0JCQlleGl0KGVycm5vKTsKLQkJfQotCX0KLQotZG9uZToKLQlmcHJpbnRmKHN0ZGVyciwgIlxuXG5cdFx0XHQgKioqIFRlc3QgY29tcGxldGUgKioqXG4iKTsKLQotCWNsb3NlKGZkKTsKLQotCXJldHVybiAwOwotfQorSWYgYWxsIGVsc2UgZmFpbHMsIGNoZWNrIG91dCB0aGUgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3J0Y3Rlc3QuYyB0ZXN0IQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY3NpL25jcjUzYzh4eC50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvbmNyNTNjOHh4LnR4dAppbmRleCAxZDUwOGRjLi44NTg2ZWZmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3Njc2kvbmNyNTNjOHh4LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3Njc2kvbmNyNTNjOHh4LnR4dApAQCAtNzg2LDcgKzc4Niw2IEBACiAgICAgICAgIGlycW06MSAgICAgc2FtZSBhcyBpbml0aWFsIHNldHRpbmdzIChhc3N1bWVkIEJJT1Mgc2V0dGluZ3MpCiAgICAgICAgIGlycW06MiAgICAgYWx3YXlzIHRvdGVtIHBvbGUKICAgICAgICAgaXJxbToweDEwICBkcml2ZXIgd2lsbCBub3QgdXNlIElSUUZfU0hBUkVEIGZsYWcgd2hlbiByZXF1ZXN0aW5nIGlycQotICAgICAgICBpcnFtOjB4MjAgIGRyaXZlciB3aWxsIG5vdCB1c2UgSVJRRl9ESVNBQkxFRCBmbGFnIHdoZW4gcmVxdWVzdGluZyBpcnEKIAogICAgIChCaXRzIDB4MTAgYW5kIDB4MjAgY2FuIGJlIGNvbWJpbmVkIHdpdGggaGFyZHdhcmUgaXJxIG1vZGUgb3B0aW9uKQogCkBAIC0xMjMxLDMwICsxMjMwLDYgQEAKIG1heSBvbmx5IGJlIG5lZWRlZCB1bmRlciBMaW51eCB3aGVuIGEgc2NhdHRlci9nYXRoZXIgbGlzdCBpcyBub3QgdXNlZCBhbmQgCiB3aGVuIHRoZSBTQ1NJIERBVEEgSU4gcGhhc2UgaXMgcmVlbnRlcmVkIGFmdGVyIGEgcGhhc2UgbWlzbWF0Y2guCiAKLTE0LjUgSVJRIHNoYXJpbmcgcHJvYmxlbXMKLQotV2hlbiBhbiBJUlEgaXMgc2hhcmVkIGJ5IGRldmljZXMgdGhhdCBhcmUgaGFuZGxlZCBieSBkaWZmZXJlbnQgZHJpdmVycywgaXQgCi1tYXkgaGFwcGVuIHRoYXQgb25lIGRyaXZlciBjb21wbGFpbnMgYWJvdXQgdGhlIHJlcXVlc3Qgb2YgdGhlIElSUSBoYXZpbmcgCi1mYWlsZWQuIEluZGVyIExpbnV4LTIuMCwgdGhpcyBtYXkgYmUgZHVlIHRvIG9uZSBkcml2ZXIgaGF2aW5nIHJlcXVlc3RlZCB0aGUgCi1JUlEgdXNpbmcgdGhlIElSUUZfRElTQUJMRUQgZmxhZyBidXQgc29tZSBvdGhlciBoYXZpbmcgcmVxdWVzdGVkIHRoZSBzYW1lIElSUQotd2l0aG91dCB0aGlzIGZsYWcuIFVuZGVyIGJvdGggTGludXgtMi4wIGFuZCBsaW51eC0yLjIsIHRoaXMgbWF5IGJlIGNhdXNlZCBieSAKLW9uZSBkcml2ZXIgbm90IGhhdmluZyByZXF1ZXN0ZWQgdGhlIElSUSB3aXRoIHRoZSBJUlFGX1NIQVJFRCBmbGFnLgotCi1CeSBkZWZhdWx0LCB0aGUgbmNyNTNjOHh4IGFuZCBzeW01M2M4eHggZHJpdmVycyByZXF1ZXN0IElSUXMgd2l0aCBib3RoIHRoZSAKLUlSUUZfRElTQUJMRUQgYW5kIHRoZSBJUlFGX1NIQVJFRCBmbGFnIHVuZGVyIExpbnV4LTIuMCBhbmQgd2l0aCBvbmx5IHRoZSBJUlFGX1NIQVJFRAotZmxhZyB1bmRlciBMaW51eC0yLjIuCi0KLVVuZGVyIExpbnV4LTIuMCwgeW91IGNhbiBkaXNhYmxlIHVzZSBvZiBJUlFGX0RJU0FCTEVEIGZsYWcgZnJvbSB0aGUgYm9vdAotY29tbWFuZCBsaW5lIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uOgotCi0gICAgIG5jcjUzYzh4eD1pcnFtOjB4MjAgICAoZm9yIHRoZSBnZW5lcmljIG5jcjUzYzh4eCBkcml2ZXIpCi0gICAgIHN5bTUzYzh4eD1pcnFtOjB4MjAgICAoZm9yIHRoZSBzeW01M2M4eHggZHJpdmVyKQotCi1JZiB0aGlzIGRvZXMgbm90IGZpeCB0aGUgcHJvYmxlbSwgdGhlbiB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgaG93IGFsbCBvdGhlciAKLWRyaXZlcnMgYXJlIHJlcXVlc3RpbmcgdGhlIElSUSBhbmQgcmVwb3J0IHRoZSBwcm9ibGVtLiBOb3RlIHRoYXQgaWYgYXQgbGVhc3QgCi1hIHNpbmdsZSBkcml2ZXIgZG9lcyBub3QgcmVxdWVzdCB0aGUgSVJRIHdpdGggdGhlIElSUUZfU0hBUkVEIGZsYWcgKHNoYXJlIElSUSksCi10aGVuIHRoZSByZXF1ZXN0IG9mIHRoZSBJUlEgb2J2aW91c2x5IHdpbGwgbm90IHN1Y2NlZWQgZm9yIGFsbCB0aGUgZHJpdmVycy4KLQogMTUuIFNDU0kgcHJvYmxlbSB0cm91Ymxlc2hvb3RpbmcKIAogMTUuMSBQcm9ibGVtIHRyYWNraW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvdG1zY3NpbS50eHQgYi9Eb2N1bWVudGF0aW9uL3Njc2kvdG1zY3NpbS50eHQKaW5kZXggMDgxMDEzMi4uMGUwMzIyYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zY3NpL3Rtc2NzaW0udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS90bXNjc2ltLnR4dApAQCAtMTA3LDEwICsxMDcsNiBAQAogTUh6IFBDSSBidXMgd29ya3MgZm9yIG1lLCB0aG91Z2gsIGJ1dCBJIGRvbid0IHJlY29tbWVuZCB1c2luZyBoaWdoZXIgY2xvY2tzCiB0aGFuIHRoZSAzMy4zMyBNSHogYmVpbmcgaW4gdGhlIFBDSSBzcGVjLgogCi1JZiB5b3Ugd2FudCB0byBzaGFyZSB0aGUgSVJRIHdpdGggYW5vdGhlciBkZXZpY2UgYW5kIHRoZSBkcml2ZXIgcmVmdXNlcyB0bwotZG8gc28sIHlvdSBtaWdodCBzdWNjZWVkIHdpdGggY2hhbmdpbmcgdGhlIERDMzkwX0lSUSB0eXBlIGluIHRtc2NzaW0uYyB0byAKLUlSUUZfU0hBUkVEIHwgSVJRRl9ESVNBQkxFRC4KLQogCiAzLkZlYXR1cmVzCiAtLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NlY3VyaXR5L1NtYWNrLnR4dCBiL0RvY3VtZW50YXRpb24vc2VjdXJpdHkvU21hY2sudHh0CmluZGV4IGI2ZWY3ZTkuLmFiYzgyZjggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2VjdXJpdHkvU21hY2sudHh0CisrKyBiL0RvY3VtZW50YXRpb24vc2VjdXJpdHkvU21hY2sudHh0CkBAIC0zMywxMSArMzMsMTggQEAKIAlnaXQ6Ly9naXRodWIuY29tL3NtYWNrLXRlYW0vc21hY2suZ2l0CiAKIFRoaXMgc2hvdWxkIG1ha2UgYW5kIGluc3RhbGwgb24gbW9zdCBtb2Rlcm4gZGlzdHJpYnV0aW9ucy4KLVRoZXJlIGFyZSB0aHJlZSBjb21tYW5kcyBpbmNsdWRlZCBpbiBzbWFja3V0aWw6CitUaGVyZSBhcmUgZml2ZSBjb21tYW5kcyBpbmNsdWRlZCBpbiBzbWFja3V0aWw6CiAKLXNtYWNrbG9hZCAgLSBwcm9wZXJseSBmb3JtYXRzIGRhdGEgZm9yIHdyaXRpbmcgdG8gL3NtYWNrL2xvYWQKLXNtYWNrY2lwc28gLSBwcm9wZXJseSBmb3JtYXRzIGRhdGEgZm9yIHdyaXRpbmcgdG8gL3NtYWNrL2NpcHNvCiBjaHNtYWNrICAgIC0gZGlzcGxheSBvciBzZXQgU21hY2sgZXh0ZW5kZWQgYXR0cmlidXRlIHZhbHVlcworc21hY2tjdGwgICAtIGxvYWQgdGhlIFNtYWNrIGFjY2VzcyBydWxlcworc21hY2thY2Nlc3MgLSByZXBvcnQgaWYgYSBwcm9jZXNzIHdpdGggb25lIGxhYmVsIGhhcyBhY2Nlc3MKKyAgICAgICAgICAgICAgdG8gYW4gb2JqZWN0IHdpdGggYW5vdGhlcgorCitUaGVzZSB0d28gY29tbWFuZHMgYXJlIG9ic29sZXRlIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZgordGhlIHNtYWNrZnMvbG9hZDIgYW5kIHNtYWNrZnMvY2lwc28yIGludGVyZmFjZXMuCisKK3NtYWNrbG9hZCAgLSBwcm9wZXJseSBmb3JtYXRzIGRhdGEgZm9yIHdyaXRpbmcgdG8gc21hY2tmcy9sb2FkCitzbWFja2NpcHNvIC0gcHJvcGVybHkgZm9ybWF0cyBkYXRhIGZvciB3cml0aW5nIHRvIHNtYWNrZnMvY2lwc28KIAogSW4ga2VlcGluZyB3aXRoIHRoZSBpbnRlbnQgb2YgU21hY2ssIGNvbmZpZ3VyYXRpb24gZGF0YSBpcwogbWluaW1hbCBhbmQgbm90IHN0cmljdGx5IHJlcXVpcmVkLiBUaGUgbW9zdCBpbXBvcnRhbnQKQEAgLTQ3LDkgKzU0LDkgQEAKIAogQWRkIHRoaXMgbGluZSB0byAvZXRjL2ZzdGFiOgogCi0gICAgc21hY2tmcyAvc21hY2sgc21hY2tmcyBzbWFja2ZzZGVmPSogMCAwCisgICAgc21hY2tmcyAvc3lzL2ZzL3NtYWNrZnMgc21hY2tmcyBkZWZhdWx0cyAwIDAKIAotYW5kIGNyZWF0ZSB0aGUgL3NtYWNrIGRpcmVjdG9yeSBmb3IgbW91bnRpbmcuCitUaGUgL3N5cy9mcy9zbWFja2ZzIGRpcmVjdG9yeSBpcyBjcmVhdGVkIGJ5IHRoZSBrZXJuZWwuCiAKIFNtYWNrIHVzZXMgZXh0ZW5kZWQgYXR0cmlidXRlcyAoeGF0dHJzKSB0byBzdG9yZSBsYWJlbHMgb24gZmlsZXN5c3RlbQogb2JqZWN0cy4gVGhlIGF0dHJpYnV0ZXMgYXJlIHN0b3JlZCBpbiB0aGUgZXh0ZW5kZWQgYXR0cmlidXRlIHNlY3VyaXR5CkBAIC05MiwxMyArOTksMTMgQEAKICAgICAjIGF0dHIgLVMgLXMgU01BQ0s2NCAtViAidmFsdWUiIHBhdGgKICAgICAjIGNoc21hY2sgLWEgdmFsdWUgcGF0aAogCi1BIHByb2Nlc3MgY2FuIHNlZSB0aGUgc21hY2sgbGFiZWwgaXQgaXMgcnVubmluZyB3aXRoIGJ5CitBIHByb2Nlc3MgY2FuIHNlZSB0aGUgU21hY2sgbGFiZWwgaXQgaXMgcnVubmluZyB3aXRoIGJ5CiByZWFkaW5nIC9wcm9jL3NlbGYvYXR0ci9jdXJyZW50LiBBIHByb2Nlc3Mgd2l0aCBDQVBfTUFDX0FETUlOCi1jYW4gc2V0IHRoZSBwcm9jZXNzIHNtYWNrIGJ5IHdyaXRpbmcgdGhlcmUuCitjYW4gc2V0IHRoZSBwcm9jZXNzIFNtYWNrIGJ5IHdyaXRpbmcgdGhlcmUuCiAKIE1vc3QgU21hY2sgY29uZmlndXJhdGlvbiBpcyBhY2NvbXBsaXNoZWQgYnkgd3JpdGluZyB0byBmaWxlcwotaW4gdGhlIHNtYWNrZnMgZmlsZXN5c3RlbS4gVGhpcyBwc2V1ZG8tZmlsZXN5c3RlbSBpcyB1c3VhbGx5Ci1tb3VudGVkIG9uIC9zbWFjay4KK2luIHRoZSBzbWFja2ZzIGZpbGVzeXN0ZW0uIFRoaXMgcHNldWRvLWZpbGVzeXN0ZW0gaXMgbW91bnRlZAorb24gL3N5cy9mcy9zbWFja2ZzLgogCiBhY2Nlc3MKIAlUaGlzIGludGVyZmFjZSByZXBvcnRzIHdoZXRoZXIgYSBzdWJqZWN0IHdpdGggdGhlIHNwZWNpZmllZApAQCAtMjA2LDIzICsyMTMsMzAgQEAKIAlmaWxlIG9yIGNsZWFyZWQgYnkgd3JpdGluZyAiLSIgdG8gdGhlIGZpbGUuCiBwdHJhY2UKIAlUaGlzIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBjdXJyZW50IHB0cmFjZSBwb2xpY3kKLQkwIC0gZGVmYXVsdDogdGhpcyBpcyB0aGUgcG9saWN5IHRoYXQgcmVsaWVzIG9uIHNtYWNrIGFjY2VzcyBydWxlcy4KKwkwIC0gZGVmYXVsdDogdGhpcyBpcyB0aGUgcG9saWN5IHRoYXQgcmVsaWVzIG9uIFNtYWNrIGFjY2VzcyBydWxlcy4KIAkgICAgRm9yIHRoZSBQVFJBQ0VfUkVBRCBhIHN1YmplY3QgbmVlZHMgdG8gaGF2ZSBhIHJlYWQgYWNjZXNzIG9uCiAJICAgIG9iamVjdC4gRm9yIHRoZSBQVFJBQ0VfQVRUQUNIIGEgcmVhZC13cml0ZSBhY2Nlc3MgaXMgcmVxdWlyZWQuCiAJMSAtIGV4YWN0OiB0aGlzIGlzIHRoZSBwb2xpY3kgdGhhdCBsaW1pdHMgUFRSQUNFX0FUVEFDSC4gQXR0YWNoIGlzCiAJICAgIG9ubHkgYWxsb3dlZCB3aGVuIHN1YmplY3QncyBhbmQgb2JqZWN0J3MgbGFiZWxzIGFyZSBlcXVhbC4KLQkgICAgUFRSQUNFX1JFQUQgaXMgbm90IGFmZmVjdGVkLiBDYW4gYmUgb3ZlcnJpZGVuIHdpdGggQ0FQX1NZU19QVFJBQ0UuCisJICAgIFBUUkFDRV9SRUFEIGlzIG5vdCBhZmZlY3RlZC4gQ2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBDQVBfU1lTX1BUUkFDRS4KIAkyIC0gZHJhY29uaWFuOiB0aGlzIHBvbGljeSBiZWhhdmVzIGxpa2UgdGhlICdleGFjdCcgYWJvdmUgd2l0aCBhbgotCSAgICBleGNlcHRpb24gdGhhdCBpdCBjYW4ndCBiZSBvdmVycmlkZW4gd2l0aCBDQVBfU1lTX1BUUkFDRS4KKwkgICAgZXhjZXB0aW9uIHRoYXQgaXQgY2FuJ3QgYmUgb3ZlcnJpZGRlbiB3aXRoIENBUF9TWVNfUFRSQUNFLgogcmV2b2tlLXN1YmplY3QKIAlXcml0aW5nIGEgU21hY2sgbGFiZWwgaGVyZSBzZXRzIHRoZSBhY2Nlc3MgdG8gJy0nIGZvciBhbGwgYWNjZXNzCiAJcnVsZXMgd2l0aCB0aGF0IHN1YmplY3QgbGFiZWwuCit1bmNvbmZpbmVkCisJSWYgdGhlIGtlcm5lbCBpcyBjb25maWd1cmVkIHdpdGggQ09ORklHX1NFQ1VSSVRZX1NNQUNLX0JSSU5HVVAKKwlhIHByb2Nlc3Mgd2l0aCBDQVBfTUFDX0FETUlOIGNhbiB3cml0ZSBhIGxhYmVsIGludG8gdGhpcyBpbnRlcmZhY2UuCisJVGhlcmVhZnRlciwgYWNjZXNzZXMgdGhhdCBpbnZvbHZlIHRoYXQgbGFiZWwgd2lsbCBiZSBsb2dnZWQgYW5kCisJdGhlIGFjY2VzcyBwZXJtaXR0ZWQgaWYgaXQgd291bGRuJ3QgYmUgb3RoZXJ3aXNlLiBOb3RlIHRoYXQgdGhpcworCWlzIGRhbmdlcm91cyBhbmQgY2FuIHJ1aW4gdGhlIHByb3BlciBsYWJlbGluZyBvZiB5b3VyIHN5c3RlbS4KKwlJdCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBpbiBwcm9kdWN0aW9uLgogCiBZb3UgY2FuIGFkZCBhY2Nlc3MgcnVsZXMgaW4gL2V0Yy9zbWFjay9hY2Nlc3Nlcy4gVGhleSB0YWtlIHRoZSBmb3JtOgogCiAgICAgc3ViamVjdGxhYmVsIG9iamVjdGxhYmVsIGFjY2VzcwogCi1hY2Nlc3MgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgbGV0dGVycyByd3hhIHdoaWNoIHNwZWNpZnkgdGhlCithY2Nlc3MgaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgbGV0dGVycyByd3hhdGIgd2hpY2ggc3BlY2lmeSB0aGUKIGtpbmQgb2YgYWNjZXNzIHBlcm1pdHRlZCBhIHN1YmplY3Qgd2l0aCBzdWJqZWN0bGFiZWwgb24gYW4KIG9iamVjdCB3aXRoIG9iamVjdGxhYmVsLiBJZiB0aGVyZSBpcyBubyBydWxlIG5vIGFjY2VzcyBpcyBhbGxvd2VkLgogCkBAIC0zMTgsOCArMzMyLDkgQEAKIAogTGFiZWxzCiAKLVNtYWNrIGxhYmVscyBhcmUgQVNDSUkgY2hhcmFjdGVyIHN0cmluZ3MsIG9uZSB0byB0d2VudHktdGhyZWUgY2hhcmFjdGVycyBpbgotbGVuZ3RoLiBTaW5nbGUgY2hhcmFjdGVyIGxhYmVscyB1c2luZyBzcGVjaWFsIGNoYXJhY3RlcnMsIHRoYXQgYmVpbmcgYW55dGhpbmcKK1NtYWNrIGxhYmVscyBhcmUgQVNDSUkgY2hhcmFjdGVyIHN0cmluZ3MuIFRoZXkgY2FuIGJlIHVwIHRvIDI1NSBjaGFyYWN0ZXJzCitsb25nLCBidXQga2VlcGluZyB0aGVtIHRvIHR3ZW50eS10aHJlZSBjaGFyYWN0ZXJzIGlzIHJlY29tbWVuZGVkLgorU2luZ2xlIGNoYXJhY3RlciBsYWJlbHMgdXNpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzLCB0aGF0IGJlaW5nIGFueXRoaW5nCiBvdGhlciB0aGFuIGEgbGV0dGVyIG9yIGRpZ2l0LCBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgU21hY2sgZGV2ZWxvcG1lbnQKIHRlYW0uIFNtYWNrIGxhYmVscyBhcmUgdW5zdHJ1Y3R1cmVkLCBjYXNlIHNlbnNpdGl2ZSwgYW5kIHRoZSBvbmx5IG9wZXJhdGlvbgogZXZlciBwZXJmb3JtZWQgb24gdGhlbSBpcyBjb21wYXJpc29uIGZvciBlcXVhbGl0eS4gU21hY2sgbGFiZWxzIGNhbm5vdApAQCAtMzM1LDEwICszNTAsOSBAQAogCT8gCVByb25vdW5jZWQgImh1aCIsIGEgc2luZ2xlIHF1ZXN0aW9uIG1hcmsgY2hhcmFjdGVyLgogCUAgCVByb25vdW5jZWQgIndlYiIsIGEgc2luZ2xlIGF0IHNpZ24gY2hhcmFjdGVyLgogCi1FdmVyeSB0YXNrIG9uIGEgU21hY2sgc3lzdGVtIGlzIGFzc2lnbmVkIGEgbGFiZWwuIFN5c3RlbSB0YXNrcywgc3VjaCBhcwotaW5pdCg4KSBhbmQgc3lzdGVtcyBkYWVtb25zLCBhcmUgcnVuIHdpdGggdGhlIGZsb29yICgiXyIpIGxhYmVsLiBVc2VyIHRhc2tzCi1hcmUgYXNzaWduZWQgbGFiZWxzIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbiBmb3VuZCBpbiB0aGUKLS9ldGMvc21hY2svdXNlciBjb25maWd1cmF0aW9uIGZpbGUuCitFdmVyeSB0YXNrIG9uIGEgU21hY2sgc3lzdGVtIGlzIGFzc2lnbmVkIGEgbGFiZWwuIFRoZSBTbWFjayBsYWJlbAorb2YgYSBwcm9jZXNzIHdpbGwgdXN1YWxseSBiZSBhc3NpZ25lZCBieSB0aGUgc3lzdGVtIGluaXRpYWxpemF0aW9uCittZWNoYW5pc20uCiAKIEFjY2VzcyBSdWxlcwogCkBAIC0zOTMsNiArNDA3LDcgQEAKIAl3OiBpbmRpY2F0ZXMgdGhhdCB3cml0ZSBhY2Nlc3Mgc2hvdWxkIGJlIGdyYW50ZWQuCiAJeDogaW5kaWNhdGVzIHRoYXQgZXhlY3V0ZSBhY2Nlc3Mgc2hvdWxkIGJlIGdyYW50ZWQuCiAJdDogaW5kaWNhdGVzIHRoYXQgdGhlIHJ1bGUgcmVxdWVzdHMgdHJhbnNtdXRhdGlvbi4KKwliOiBpbmRpY2F0ZXMgdGhhdCB0aGUgcnVsZSBzaG91bGQgYmUgcmVwb3J0ZWQgZm9yIGJyaW5nLXVwLgogCiBVcHBlcmNhc2UgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWNhdGlvbiBsZXR0ZXJzIGFyZSBhbGxvd2VkIGFzIHdlbGwuCiBBY2Nlc3MgbW9kZSBzcGVjaWZpY2F0aW9ucyBjYW4gYmUgaW4gYW55IG9yZGVyLiBFeGFtcGxlcyBvZiBhY2NlcHRhYmxlIHJ1bGVzCkBAIC00MDIsNiArNDE3LDcgQEAKIAlTZWNyZXQgICAgVW5jbGFzcyBSCiAJTWFuYWdlciAgIEdhbWUgICAgeAogCVVzZXIgICAgICBIUiAgICAgIHcKKwlTbmFwICAgICAgQ3JhY2tsZSByd3hhdGIKIAlOZXcgICAgICAgT2xkICAgICByUnJScgogCUNsb3NlZCAgICBPZmYgICAgIC0KIApAQCAtNDEzLDcgKzQyOSw3IEBACiAKIFNwYWNlcyBhcmUgbm90IGFsbG93ZWQgaW4gbGFiZWxzLiBTaW5jZSBhIHN1YmplY3QgYWx3YXlzIGhhcyBhY2Nlc3MgdG8gZmlsZXMKIHdpdGggdGhlIHNhbWUgbGFiZWwgc3BlY2lmeWluZyBhIHJ1bGUgZm9yIHRoYXQgY2FzZSBpcyBwb2ludGxlc3MuIE9ubHkKLXZhbGlkIGxldHRlcnMgKHJ3eGF0UldYQVQpIGFuZCB0aGUgZGFzaCAoJy0nKSBjaGFyYWN0ZXIgYXJlIGFsbG93ZWQgaW4KK3ZhbGlkIGxldHRlcnMgKHJ3eGF0YlJXWEFUQikgYW5kIHRoZSBkYXNoICgnLScpIGNoYXJhY3RlciBhcmUgYWxsb3dlZCBpbgogYWNjZXNzIHNwZWNpZmljYXRpb25zLiBUaGUgZGFzaCBpcyBhIHBsYWNlaG9sZGVyLCBzbyAiYS1yIiBpcyB0aGUgc2FtZQogYXMgImFyIi4gQSBsb25lIGRhc2ggaXMgdXNlZCB0byBzcGVjaWZ5IHRoYXQgbm8gYWNjZXNzIHNob3VsZCBiZSBhbGxvd2VkLgogCkBAIC00NjIsMTYgKzQ3OCwxMSBAQAogU2V0dGluZyBBY2Nlc3MgUnVsZXMKIAogVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSAvZXRjL3NtYWNrL2FjY2Vzc2VzIGNvbnRhaW5zIHRoZSBydWxlcyB0byBiZSBzZXQgYXQKLXN5c3RlbSBzdGFydHVwLiBUaGUgY29udGVudHMgYXJlIHdyaXR0ZW4gdG8gdGhlIHNwZWNpYWwgZmlsZSAvc21hY2svbG9hZC4KLVJ1bGVzIGNhbiBiZSB3cml0dGVuIHRvIC9zbWFjay9sb2FkIGF0IGFueSB0aW1lIGFuZCB0YWtlIGVmZmVjdCBpbW1lZGlhdGVseS4KLUZvciBhbnkgcGFpciBvZiBzdWJqZWN0IGFuZCBvYmplY3QgbGFiZWxzIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSBydWxlLCB3aXRoIHRoZQotbW9zdCByZWNlbnRseSBzcGVjaWZpZWQgb3ZlcnJpZGluZyBhbnkgZWFybGllciBzcGVjaWZpY2F0aW9uLgotCi1UaGUgcHJvZ3JhbSBzbWFja2xvYWQgaXMgcHJvdmlkZWQgdG8gZW5zdXJlIGRhdGEgaXMgZm9ybWF0dGVkCi1wcm9wZXJseSB3aGVuIHdyaXR0ZW4gdG8gL3NtYWNrL2xvYWQuIFRoaXMgcHJvZ3JhbSByZWFkcyBsaW5lcwotb2YgdGhlIGZvcm0KLQotICAgIHN1YmplY3RsYWJlbCBvYmplY3RsYWJlbCBtb2RlLgorc3lzdGVtIHN0YXJ0dXAuIFRoZSBjb250ZW50cyBhcmUgd3JpdHRlbiB0byB0aGUgc3BlY2lhbCBmaWxlCisvc3lzL2ZzL3NtYWNrZnMvbG9hZDIuIFJ1bGVzIGNhbiBiZSBhZGRlZCBhdCBhbnkgdGltZSBhbmQgdGFrZSBlZmZlY3QKK2ltbWVkaWF0ZWx5LiBGb3IgYW55IHBhaXIgb2Ygc3ViamVjdCBhbmQgb2JqZWN0IGxhYmVscyB0aGVyZSBjYW4gYmUgb25seQorb25lIHJ1bGUsIHdpdGggdGhlIG1vc3QgcmVjZW50bHkgc3BlY2lmaWVkIG92ZXJyaWRpbmcgYW55IGVhcmxpZXIKK3NwZWNpZmljYXRpb24uCiAKIFRhc2sgQXR0cmlidXRlCiAKQEAgLTQ4OCw3ICs0OTksMTAgQEAKIAogUHJpdmlsZWdlCiAKLUEgcHJvY2VzcyB3aXRoIENBUF9NQUNfT1ZFUlJJREUgaXMgcHJpdmlsZWdlZC4KK0EgcHJvY2VzcyB3aXRoIENBUF9NQUNfT1ZFUlJJREUgb3IgQ0FQX01BQ19BRE1JTiBpcyBwcml2aWxlZ2VkLgorQ0FQX01BQ19PVkVSUklERSBhbGxvd3MgdGhlIHByb2Nlc3MgYWNjZXNzIHRvIG9iamVjdHMgaXQgd291bGQKK2JlIGRlbmllZCBvdGhlcndpc2UuIENBUF9NQUNfQURNSU4gYWxsb3dzIGEgcHJvY2VzcyB0byBjaGFuZ2UKK1NtYWNrIGRhdGEsIGluY2x1ZGluZyBydWxlcyBhbmQgYXR0cmlidXRlcy4KIAogU21hY2sgTmV0d29ya2luZwogCkBAIC01MTAsMTQgKzUyNCwxNCBAQAogYW1iaWVudCBsYWJlbC4KIAogU21hY2sgcmVxdWlyZXMgY29uZmlndXJhdGlvbiBpbiB0aGUgY2FzZSB3aGVyZSBwYWNrZXRzIGZyb20gYSBzeXN0ZW0gdGhhdCBpcwotbm90IHNtYWNrIHRoYXQgc3BlYWtzIENJUFNPIG1heSBiZSBlbmNvdW50ZXJlZC4gVXN1YWxseSB0aGlzIHdpbGwgYmUgYSBUcnVzdGVkCitub3QgU21hY2sgdGhhdCBzcGVha3MgQ0lQU08gbWF5IGJlIGVuY291bnRlcmVkLiBVc3VhbGx5IHRoaXMgd2lsbCBiZSBhIFRydXN0ZWQKIFNvbGFyaXMgc3lzdGVtLCBidXQgdGhlcmUgYXJlIG90aGVyLCBsZXNzIHdpZGVseSBkZXBsb3llZCBzeXN0ZW1zIG91dCB0aGVyZS4KIENJUFNPIHByb3ZpZGVzIDMgaW1wb3J0YW50IHZhbHVlcywgYSBEb21haW4gT2YgSW50ZXJwcmV0YXRpb24gKERPSSksIGEgbGV2ZWwsCiBhbmQgYSBjYXRlZ29yeSBzZXQgd2l0aCBlYWNoIHBhY2tldC4gVGhlIERPSSBpcyBpbnRlbmRlZCB0byBpZGVudGlmeSBhIGdyb3VwCiBvZiBzeXN0ZW1zIHRoYXQgdXNlIGNvbXBhdGlibGUgbGFiZWxpbmcgc2NoZW1lcywgYW5kIHRoZSBET0kgc3BlY2lmaWVkIG9uIHRoZQotc21hY2sgc3lzdGVtIG11c3QgbWF0Y2ggdGhhdCBvZiB0aGUgcmVtb3RlIHN5c3RlbSBvciBwYWNrZXRzIHdpbGwgYmUKLWRpc2NhcmRlZC4gVGhlIERPSSBpcyAzIGJ5IGRlZmF1bHQuIFRoZSB2YWx1ZSBjYW4gYmUgcmVhZCBmcm9tIC9zbWFjay9kb2kgYW5kCi1jYW4gYmUgY2hhbmdlZCBieSB3cml0aW5nIHRvIC9zbWFjay9kb2kuCitTbWFjayBzeXN0ZW0gbXVzdCBtYXRjaCB0aGF0IG9mIHRoZSByZW1vdGUgc3lzdGVtIG9yIHBhY2tldHMgd2lsbCBiZQorZGlzY2FyZGVkLiBUaGUgRE9JIGlzIDMgYnkgZGVmYXVsdC4gVGhlIHZhbHVlIGNhbiBiZSByZWFkIGZyb20KKy9zeXMvZnMvc21hY2tmcy9kb2kgYW5kIGNhbiBiZSBjaGFuZ2VkIGJ5IHdyaXRpbmcgdG8gL3N5cy9mcy9zbWFja2ZzL2RvaS4KIAogVGhlIGxhYmVsIGFuZCBjYXRlZ29yeSBzZXQgYXJlIG1hcHBlZCB0byBhIFNtYWNrIGxhYmVsIGFzIGRlZmluZWQgaW4KIC9ldGMvc21hY2svY2lwc28uCkBAIC01MzksMTUgKzU1MywxMyBAQAogbWVhbmluZy4KIAogVGhlIG1hcHBpbmcgb2YgU21hY2sgbGFiZWxzIHRvIENJUFNPIHZhbHVlcyBpcyBkZWZpbmVkIGJ5IHdyaXRpbmcgdG8KLS9zbWFjay9jaXBzby4gQWdhaW4sIHRoZSBmb3JtYXQgb2YgZGF0YSB3cml0dGVuIHRvIHRoaXMgc3BlY2lhbCBmaWxlCi1pcyBoaWdobHkgcmVzdHJpY3RpdmUsIHNvIHRoZSBwcm9ncmFtIHNtYWNrY2lwc28gaXMgcHJvdmlkZWQgdG8KLWVuc3VyZSB0aGUgd3JpdGVzIGFyZSBkb25lIHByb3Blcmx5LiBUaGlzIHByb2dyYW0gdGFrZXMgbWFwcGluZ3MKLW9uIHRoZSBzdGFuZGFyZCBpbnB1dCBhbmQgc2VuZHMgdGhlbSB0byAvc21hY2svY2lwc28gcHJvcGVybHkuCisvc3lzL2ZzL3NtYWNrZnMvY2lwc28yLgogCiBJbiBhZGRpdGlvbiB0byBleHBsaWNpdCBtYXBwaW5ncyBTbWFjayBzdXBwb3J0cyBkaXJlY3QgQ0lQU08gbWFwcGluZ3MuIE9uZQogQ0lQU08gbGV2ZWwgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjYXRlZ29yeSBzZXQgcGFzc2VkIGluIHRoZSBwYWNrZXQgaXMKIGluIGZhY3QgYW4gZW5jb2Rpbmcgb2YgdGhlIFNtYWNrIGxhYmVsLiBUaGUgbGV2ZWwgdXNlZCBpcyAyNTAgYnkgZGVmYXVsdC4gVGhlCi12YWx1ZSBjYW4gYmUgcmVhZCBmcm9tIC9zbWFjay9kaXJlY3QgYW5kIGNoYW5nZWQgYnkgd3JpdGluZyB0byAvc21hY2svZGlyZWN0LgordmFsdWUgY2FuIGJlIHJlYWQgZnJvbSAvc3lzL2ZzL3NtYWNrZnMvZGlyZWN0IGFuZCBjaGFuZ2VkIGJ5IHdyaXRpbmcgdG8KKy9zeXMvZnMvc21hY2tmcy9kaXJlY3QuCiAKIFNvY2tldCBBdHRyaWJ1dGVzCiAKQEAgLTU2NSw4ICs1NzcsOCBAQAogU21hY2sgTmV0bGFiZWwgRXhjZXB0aW9ucwogCiBZb3Ugd2lsbCBvZnRlbiBmaW5kIHRoYXQgeW91ciBsYWJlbGVkIGFwcGxpY2F0aW9uIGhhcyB0byB0YWxrIHRvIHRoZSBvdXRzaWRlLAotdW5sYWJlbGVkIHdvcmxkLiBUbyBkbyB0aGlzIHRoZXJlJ3MgYSBzcGVjaWFsIGZpbGUgL3NtYWNrL25ldGxhYmVsIHdoZXJlIHlvdSBjYW4KLWFkZCBzb21lIGV4Y2VwdGlvbnMgaW4gdGhlIGZvcm0gb2YgOgordW5sYWJlbGVkIHdvcmxkLiBUbyBkbyB0aGlzIHRoZXJlJ3MgYSBzcGVjaWFsIGZpbGUgL3N5cy9mcy9zbWFja2ZzL25ldGxhYmVsCit3aGVyZSB5b3UgY2FuIGFkZCBzb21lIGV4Y2VwdGlvbnMgaW4gdGhlIGZvcm0gb2YgOgogQElQMQkgICBMQUJFTDEgb3IKIEBJUDIvTUFTSyAgTEFCRUwyCiAKQEAgLTU3NCwyMiArNTg2LDIyIEBACiB3cml0ZSBhY2Nlc3Mgb24gTEFCRUwxLCBhbmQgYWNjZXNzIHRvIHRoZSBzdWJuZXQgQElQMi9NQVNLIGlmIGl0IGhhcyB3cml0ZQogYWNjZXNzIG9uIExBQkVMMi4KIAotRW50cmllcyBpbiB0aGUgL3NtYWNrL25ldGxhYmVsIGZpbGUgYXJlIG1hdGNoZWQgYnkgbG9uZ2VzdCBtYXNrIGZpcnN0LCBsaWtlIGluCi1jbGFzc2xlc3MgSVB2NCByb3V0aW5nLgorRW50cmllcyBpbiB0aGUgL3N5cy9mcy9zbWFja2ZzL25ldGxhYmVsIGZpbGUgYXJlIG1hdGNoZWQgYnkgbG9uZ2VzdCBtYXNrCitmaXJzdCwgbGlrZSBpbiBjbGFzc2xlc3MgSVB2NCByb3V0aW5nLgogCiBBIHNwZWNpYWwgbGFiZWwgJ0AnIGFuZCBhbiBvcHRpb24gJy1DSVBTTycgY2FuIGJlIHVzZWQgdGhlcmUgOgogQCAgICAgIG1lYW5zIEludGVybmV0LCBhbnkgYXBwbGljYXRpb24gd2l0aCBhbnkgbGFiZWwgaGFzIGFjY2VzcyB0byBpdAogLUNJUFNPIG1lYW5zIHN0YW5kYXJkIENJUFNPIG5ldHdvcmtpbmcKIAogSWYgeW91IGRvbid0IGtub3cgd2hhdCBDSVBTTyBpcyBhbmQgZG9uJ3QgcGxhbiB0byB1c2UgaXQsIHlvdSBjYW4ganVzdCBkbyA6Ci1lY2hvIDEyNy4wLjAuMSAtQ0lQU08gPiAvc21hY2svbmV0bGFiZWwKLWVjaG8gMC4wLjAuMC8wIEAgICAgICA+IC9zbWFjay9uZXRsYWJlbAorZWNobyAxMjcuMC4wLjEgLUNJUFNPID4gL3N5cy9mcy9zbWFja2ZzL25ldGxhYmVsCitlY2hvIDAuMC4wLjAvMCBAICAgICAgPiAvc3lzL2ZzL3NtYWNrZnMvbmV0bGFiZWwKIAogSWYgeW91IHVzZSBDSVBTTyBvbiB5b3VyIDE5Mi4xNjguMC4wLzE2IGxvY2FsIG5ldHdvcmsgYW5kIG5lZWQgYWxzbyB1bmxhYmVsZWQKIEludGVybmV0IGFjY2VzcywgeW91IGNhbiBoYXZlIDoKLWVjaG8gMTI3LjAuMC4xICAgICAgLUNJUFNPID4gL3NtYWNrL25ldGxhYmVsCi1lY2hvIDE5Mi4xNjguMC4wLzE2IC1DSVBTTyA+IC9zbWFjay9uZXRsYWJlbAotZWNobyAwLjAuMC4wLzAgICAgICBAICAgICAgPiAvc21hY2svbmV0bGFiZWwKK2VjaG8gMTI3LjAuMC4xICAgICAgLUNJUFNPID4gL3N5cy9mcy9zbWFja2ZzL25ldGxhYmVsCitlY2hvIDE5Mi4xNjguMC4wLzE2IC1DSVBTTyA+IC9zeXMvZnMvc21hY2tmcy9uZXRsYWJlbAorZWNobyAwLjAuMC4wLzAgICAgICBAICAgICAgPiAvc3lzL2ZzL3NtYWNrZnMvbmV0bGFiZWwKIAogCiBXcml0aW5nIEFwcGxpY2F0aW9ucyBmb3IgU21hY2sKQEAgLTY3Niw3ICs2ODgsNyBAQAogSWYgeW91IHdhbnQgU21hY2sgYXVkaXRpbmcgb2Ygc2VjdXJpdHkgZXZlbnRzLCB5b3UgbmVlZCB0byBzZXQgQ09ORklHX0FVRElUCiBpbiB5b3VyIGtlcm5lbCBjb25maWd1cmF0aW9uLgogQnkgZGVmYXVsdCwgYWxsIGRlbmllZCBldmVudHMgd2lsbCBiZSBhdWRpdGVkLiBZb3UgY2FuIGNoYW5nZSB0aGlzIGJlaGF2aW9yIGJ5Ci13cml0aW5nIGEgc2luZ2xlIGNoYXJhY3RlciB0byB0aGUgL3NtYWNrL2xvZ2dpbmcgZmlsZSA6Cit3cml0aW5nIGEgc2luZ2xlIGNoYXJhY3RlciB0byB0aGUgL3N5cy9mcy9zbWFja2ZzL2xvZ2dpbmcgZmlsZSA6CiAwIDogbm8gbG9nZ2luZwogMSA6IGxvZyBkZW5pZWQgKGRlZmF1bHQpCiAyIDogbG9nIGFjY2VwdGVkCkBAIC02ODYsMyArNjk4LDIwIEBACiB0aGUgc3ViamVjdCwgdGhlIG9iamVjdCwgdGhlIHJpZ2h0cyByZXF1ZXN0ZWQsIHRoZSBhY3Rpb24sIHRoZSBrZXJuZWwgZnVuY3Rpb24KIHRoYXQgdHJpZ2dlcmVkIHRoZSBldmVudCwgcGx1cyBvdGhlciBwYWlycyBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgZXZlbnQKIGF1ZGl0ZWQuCisKK0JyaW5ndXAgTW9kZQorCitCcmluZ3VwIG1vZGUgcHJvdmlkZXMgbG9nZ2luZyBmZWF0dXJlcyB0aGF0IGNhbiBtYWtlIGFwcGxpY2F0aW9uCitjb25maWd1cmF0aW9uIGFuZCBzeXN0ZW0gYnJpbmd1cCBlYXNpZXIuIENvbmZpZ3VyZSB0aGUga2VybmVsIHdpdGgKK0NPTkZJR19TRUNVUklUWV9TTUFDS19CUklOR1VQIHRvIGVuYWJsZSB0aGVzZSBmZWF0dXJlcy4gV2hlbiBicmluZ3VwCittb2RlIGlzIGVuYWJsZWQgYWNjZXNzZXMgdGhhdCBzdWNjZWVkIGR1ZSB0byBydWxlcyBtYXJrZWQgd2l0aCB0aGUgImIiCithY2Nlc3MgbW9kZSB3aWxsIGxvZ2dlZC4gV2hlbiBhIG5ldyBsYWJlbCBpcyBpbnRyb2R1Y2VkIGZvciBwcm9jZXNzZXMKK3J1bGVzIGNhbiBiZSBhZGRlZCBhZ2dyZXNzaXZlbHksIG1hcmtlZCB3aXRoIHRoZSAiYiIuIFRoZSBsb2dnaW5nIGFsbG93cwordHJhY2tpbmcgb2Ygd2hpY2ggcnVsZXMgYWN0dWFsIGdldCB1c2VkIGZvciB0aGF0IGxhYmVsLgorCitBbm90aGVyIGZlYXR1cmUgb2YgYnJpbmd1cCBtb2RlIGlzIHRoZSAidW5jb25maW5lZCIgb3B0aW9uLiBXcml0aW5nCithIGxhYmVsIHRvIC9zeXMvZnMvc21hY2tmcy91bmNvbmZpbmVkIG1ha2VzIHN1YmplY3RzIHdpdGggdGhhdCBsYWJlbAorYWJsZSB0byBhY2Nlc3MgYW55IG9iamVjdCwgYW5kIG9iamVjdHMgd2l0aCB0aGF0IGxhYmVsIGFjY2Vzc2libGUgdG8KK2FsbCBzdWJqZWN0cy4gQW55IGFjY2VzcyB0aGF0IGlzIGdyYW50ZWQgYmVjYXVzZSBhIGxhYmVsIGlzIHVuY29uZmluZWQKK2lzIGxvZ2dlZC4gVGhpcyBmZWF0dXJlIGlzIGRhbmdlcm91cywgYXMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIG1heQorYmUgY3JlYXRlZCBpbiBwbGFjZXMgdGhleSBjb3VsZG4ndCBpZiB0aGUgcG9saWN5IHdlcmUgYmVpbmcgZW5mb3JjZWQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQ29udHJvbE5hbWVzLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9Db250cm9sTmFtZXMudHh0CmluZGV4IDc5YTYxMjcuLjNmYzFjZjUwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQ29udHJvbE5hbWVzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvQ29udHJvbE5hbWVzLnR4dApAQCAtNzEsMTEgKzcxLDExIEBACiAgIEhETUkvRFAJKGVpdGhlciBIRE1JIG9yIERpc3BsYXlQb3J0KQogCiBFeGNlcHRpb25zIChkZXByZWNhdGVkKToKLSAgW0RpZ2l0YWxdIENhcHR1cmUgU291cmNlCi0gIFtEaWdpdGFsXSBDYXB0dXJlIFN3aXRjaAkoYWthIGlucHV0IGdhaW4gc3dpdGNoKQotICBbRGlnaXRhbF0gQ2FwdHVyZSBWb2x1bWUJKGFrYSBpbnB1dCBnYWluIHZvbHVtZSkKLSAgW0RpZ2l0YWxdIFBsYXliYWNrIFN3aXRjaAkoYWthIG91dHB1dCBnYWluIHN3aXRjaCkKLSAgW0RpZ2l0YWxdIFBsYXliYWNrIFZvbHVtZQkoYWthIG91dHB1dCBnYWluIHZvbHVtZSkKKyAgW0FuYWxvZ3VlfERpZ2l0YWxdIENhcHR1cmUgU291cmNlCisgIFtBbmFsb2d1ZXxEaWdpdGFsXSBDYXB0dXJlIFN3aXRjaAkoYWthIGlucHV0IGdhaW4gc3dpdGNoKQorICBbQW5hbG9ndWV8RGlnaXRhbF0gQ2FwdHVyZSBWb2x1bWUJKGFrYSBpbnB1dCBnYWluIHZvbHVtZSkKKyAgW0FuYWxvZ3VlfERpZ2l0YWxdIFBsYXliYWNrIFN3aXRjaAkoYWthIG91dHB1dCBnYWluIHN3aXRjaCkKKyAgW0FuYWxvZ3VlfERpZ2l0YWxdIFBsYXliYWNrIFZvbHVtZQkoYWthIG91dHB1dCBnYWluIHZvbHVtZSkKICAgVG9uZSBDb250cm9sIC0gU3dpdGNoCiAgIFRvbmUgQ29udHJvbCAtIEJhc3MKICAgVG9uZSBDb250cm9sIC0gVHJlYmxlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL0hELUF1ZGlvLnR4dAppbmRleCA0MmEwYTM5Li5lNzE5M2FhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvSEQtQXVkaW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9IRC1BdWRpby50eHQKQEAgLTQ2Niw3ICs0NjYsMTEgQEAKIC0gYWRkX2phY2tfbW9kZXMgKGJvb2wpOiBhZGQgInh4eCBKYWNrIE1vZGUiIGVudW0gY29udHJvbHMgdG8gZWFjaAogICBJL08gamFjayBmb3IgYWxsb3dpbmcgdG8gY2hhbmdlIHRoZSBoZWFkcGhvbmUgYW1wIGFuZCBtaWMgYmlhcyBWUkVGCiAgIGNhcGFiaWxpdGllcwotLSBwb3dlcl9kb3duX3VudXNlZCAoYm9vbCk6IHBvd2VyIGRvd24gdGhlIHVudXNlZCB3aWRnZXRzCistIHBvd2VyX3NhdmVfbm9kZSAoYm9vbCk6IGFkdmFuY2VkIHBvd2VyIG1hbmFnZW1lbnQgZm9yIGVhY2ggd2lkZ2V0LAorICBjb250cm9sbGluZyB0aGUgcG93ZXIgc2F0ZSAoRDAvRDMpIG9mIGVhY2ggd2lkZ2V0IG5vZGUgZGVwZW5kaW5nIG9uCisgIHRoZSBhY3R1YWwgcGluIGFuZCBzdHJlYW0gc3RhdGVzCistIHBvd2VyX2Rvd25fdW51c2VkIChib29sKTogcG93ZXIgZG93biB0aGUgdW51c2VkIHdpZGdldHMsIGEgc3Vic2V0IG9mCisgIHBvd2VyX3NhdmVfbm9kZSwgYW5kIHdpbGwgYmUgZHJvcHBlZCBpbiBmdXR1cmUKIC0gYWRkX2hwX21pYyAoYm9vbCk6IGFkZCB0aGUgaGVhZHBob25lIHRvIGNhcHR1cmUgc291cmNlIGlmIHBvc3NpYmxlCiAtIGhwX21pY19kZXRlY3QgKGJvb2wpOiBlbmFibGUvZGlzYWJsZSB0aGUgaHAvbWljIHNoYXJlZCBpbnB1dCBmb3IgYQogICBzaW5nbGUgYnVpbHQtaW4gbWljIGNhc2U7IGRlZmF1bHQgdHJ1ZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3RpbWVzdGFtcGluZy50eHQgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2EvdGltZXN0YW1waW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE5MWEyCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3RpbWVzdGFtcGluZy50eHQKQEAgLTAsMCArMSwyMDAgQEAKK1RoZSBBTFNBIEFQSSBjYW4gcHJvdmlkZSB0d28gZGlmZmVyZW50IHN5c3RlbSB0aW1lc3RhbXBzOgorCistIFRyaWdnZXJfdHN0YW1wIGlzIHRoZSBzeXN0ZW0gdGltZSBzbmFwc2hvdCB0YWtlbiB3aGVuIHRoZSAudHJpZ2dlcgorY2FsbGJhY2sgaXMgaW52b2tlZC4gVGhpcyBzbmFwc2hvdCBpcyB0YWtlbiBieSB0aGUgQUxTQSBjb3JlIGluIHRoZQorZ2VuZXJhbCBjYXNlLCBidXQgc3BlY2lmaWMgaGFyZHdhcmUgbWF5IGhhdmUgc3luY2hyb25pemF0aW9uCitjYXBhYmlsaXRpZXMgb3IgY29udmVyc2VseSBtYXkgb25seSBiZSBhYmxlIHRvIHByb3ZpZGUgYSBjb3JyZWN0Citlc3RpbWF0ZSB3aXRoIGEgZGVsYXkuIEluIHRoZSBsYXR0ZXIgdHdvIGNhc2VzLCB0aGUgbG93LWxldmVsIGRyaXZlcgoraXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIHRoZSB0cmlnZ2VyX3RzdGFtcCBhdCB0aGUgbW9zdCBhcHByb3ByaWF0ZQorYW5kIHByZWNpc2UgbW9tZW50LiBBcHBsaWNhdGlvbnMgc2hvdWxkIG5vdCByZWx5IHNvbGVseSBvbiB0aGUgZmlyc3QKK3RyaWdnZXJfdHN0YW1wIGJ1dCB1cGRhdGUgdGhlaXIgaW50ZXJuYWwgY2FsY3VsYXRpb25zIGlmIHRoZSBkcml2ZXIKK3Byb3ZpZGVzIGEgcmVmaW5lZCBlc3RpbWF0ZSB3aXRoIGEgZGVsYXkuCisKKy0gdHN0YW1wIGlzIHRoZSBjdXJyZW50IHN5c3RlbSB0aW1lc3RhbXAgdXBkYXRlZCBkdXJpbmcgdGhlIGxhc3QKK2V2ZW50IG9yIGFwcGxpY2F0aW9uIHF1ZXJ5LgorVGhlIGRpZmZlcmVuY2UgKHRzdGFtcCAtIHRyaWdnZXJfdHN0YW1wKSBkZWZpbmVzIHRoZSBlbGFwc2VkIHRpbWUuCisKK1RoZSBBTFNBIEFQSSBwcm92aWRlcyByZXBvcnRzIHR3byBiYXNpYyBwaWVjZXMgb2YgaW5mb3JtYXRpb24sIGF2YWlsCithbmQgZGVsYXksIHdoaWNoIGNvbWJpbmVkIHdpdGggdGhlIHRyaWdnZXIgYW5kIGN1cnJlbnQgc3lzdGVtCit0aW1lc3RhbXBzIGFsbG93IGZvciBhcHBsaWNhdGlvbnMgdG8ga2VlcCB0cmFjayBvZiB0aGUgJ2Z1bGxuZXNzJyBvZgordGhlIHJpbmcgYnVmZmVyIGFuZCB0aGUgYW1vdW50IG9mIHF1ZXVlZCBzYW1wbGVzLgorCitUaGUgdXNlIG9mIHRoZXNlIGRpZmZlcmVudCBwb2ludGVycyBhbmQgdGltZSBpbmZvcm1hdGlvbiBkZXBlbmRzIG9uCit0aGUgYXBwbGljYXRpb24gbmVlZHM6CisKKy0gJ2F2YWlsJyByZXBvcnRzIGhvdyBtdWNoIGNhbiBiZSB3cml0dGVuIGluIHRoZSByaW5nIGJ1ZmZlcgorLSAnZGVsYXknIHJlcG9ydHMgdGhlIHRpbWUgaXQgd2lsbCB0YWtlIHRvIGhlYXIgYSBuZXcgc2FtcGxlIGFmdGVyIGFsbAorcXVldWVkIHNhbXBsZXMgaGF2ZSBiZWVuIHBsYXllZCBvdXQuCisKK1doZW4gdGltZXN0YW1wcyBhcmUgZW5hYmxlZCwgdGhlIGF2YWlsL2RlbGF5IGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkCithbG9uZyB3aXRoIGEgc25hcHNob3Qgb2Ygc3lzdGVtIHRpbWUuIEFwcGxpY2F0aW9ucyBjYW4gc2VsZWN0IGZyb20KK0NMT0NLX1JFQUxUSU1FIChOVFAgY29ycmVjdGlvbnMgaW5jbHVkaW5nIGdvaW5nIGJhY2t3YXJkcyksCitDTE9DS19NT05PVE9OSUMgKE5UUCBjb3JyZWN0aW9ucyBidXQgbmV2ZXIgZ29pbmcgYmFja3dhcmRzKSwKK0NMT0NLX01PTk9USUNfUkFXICh3aXRob3V0IE5UUCBjb3JyZWN0aW9ucykgYW5kIGNoYW5nZSB0aGUgbW9kZQorZHluYW1pY2FsbHkgd2l0aCBzd19wYXJhbXMKKworCitUaGUgQUxTQSBBUEkgYWxzbyBwcm92aWRlIGFuIGF1ZGlvX3RzdGFtcCB3aGljaCByZWZsZWN0cyB0aGUgcGFzc2FnZQorb2YgdGltZSBhcyBtZWFzdXJlZCBieSBkaWZmZXJlbnQgY29tcG9uZW50cyBvZiBhdWRpbyBoYXJkd2FyZS4gIEluCithc2NpaS1hcnQsIHRoaXMgY291bGQgYmUgcmVwcmVzZW50ZWQgYXMgZm9sbG93cyAoZm9yIHRoZSBwbGF5YmFjaworY2FzZSk6CisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+IHRpbWUKKyAgXiAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgXiAgICAgICAgICAgXgorICB8ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8CisgYW5hbG9nICAgICAgICAgbGluayAgICAgICAgICAgIGRtYSAgICAgICAgICAgICAgYXBwICAgICAgIEZ1bGxCdWZmZXIKKyB0aW1lICAgICAgICAgICB0aW1lICAgICAgICAgICB0aW1lICAgICAgICAgICAgICB0aW1lICAgICAgICB0aW1lCisgIHwgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwKKyAgfDwgY29kZWMgZGVsYXkgPnw8LS1odyBkZWxheS0tPnw8cXVldWVkIHNhbXBsZXM+fDwtLS1hdmFpbC0+fAorICB8PC0tLS0tLS0tLS0tLS0tLS0tIGRlbGF5LS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58ICAgICAgICAgICB8CisJCQkgICAgICAgICB8PC0tLS1yaW5nIGJ1ZmZlciBsZW5ndGgtLS0tPnwKKworVGhlIGFuYWxvZyB0aW1lIGlzIHRha2VuIGF0IHRoZSBsYXN0IHN0YWdlIG9mIHRoZSBwbGF5YmFjaywgYXMgY2xvc2UKK2FzIHBvc3NpYmxlIHRvIHRoZSBhY3R1YWwgdHJhbnNkdWNlcgorCitUaGUgbGluayB0aW1lIGlzIHRha2VuIGF0IHRoZSBvdXRwdXQgb2YgdGhlIFNPQy9jaGlwc2V0IGFzIHRoZSBzYW1wbGVzCithcmUgcHVzaGVkIG9uIGEgbGluay4gVGhlIGxpbmsgdGltZSBjYW4gYmUgZGlyZWN0bHkgbWVhc3VyZWQgaWYKK3N1cHBvcnRlZCBpbiBoYXJkd2FyZSBieSBzYW1wbGUgY291bnRlcnMgb3Igd2FsbGNsb2NrcyAoZS5nLiB3aXRoCitIREF1ZGlvIDI0TUh6IG9yIFBUUCBjbG9jayBmb3IgbmV0d29ya2VkIHNvbHV0aW9ucykgb3IgaW5kaXJlY3RseQorZXN0aW1hdGVkIChlLmcuIHdpdGggdGhlIGZyYW1lIGNvdW50ZXIgaW4gVVNCKS4KKworVGhlIERNQSB0aW1lIGlzIG1lYXN1cmVkIHVzaW5nIGNvdW50ZXJzIC0gdHlwaWNhbGx5IHRoZSBsZWFzdCByZWxpYWJsZQorb2YgYWxsIG1lYXN1cmVtZW50cyBkdWUgdG8gdGhlIGJ1cnN0eSBuYXR1cmVkIG9mIERNQSB0cmFuc2ZlcnMuCisKK1RoZSBhcHAgdGltZSBjb3JyZXNwb25kcyB0byB0aGUgdGltZSB0cmFja2VkIGJ5IGFuIGFwcGxpY2F0aW9uIGFmdGVyCit3cml0aW5nIGluIHRoZSByaW5nIGJ1ZmZlci4KKworVGhlIGFwcGxpY2F0aW9uIGNhbiBxdWVyeSB3aGF0IHRoZSBoYXJkd2FyZSBzdXBwb3J0cywgZGVmaW5lIHdoaWNoCithdWRpbyB0aW1lIGl0IHdhbnRzIHJlcG9ydGVkIGJ5IHNlbGVjdGluZyB0aGUgcmVsZXZhbnQgc2V0dGluZ3MgaW4KK2F1ZGlvX3RzdGFtcF9jb25maWcgZmllbGRzLCBnZXQgYW4gZXN0aW1hdGUgb2YgdGhlIHRpbWVzdGFtcAorYWNjdXJhY3kuIEl0IGNhbiBhbHNvIHJlcXVlc3QgdGhlIGRlbGF5LXRvLWFuYWxvZyBiZSBpbmNsdWRlZCBpbiB0aGUKK21lYXN1cmVtZW50LiBEaXJlY3QgYWNjZXNzIHRvIHRoZSBsaW5rIHRpbWUgaXMgdmVyeSBpbnRlcmVzdGluZyBvbgorcGxhdGZvcm1zIHRoYXQgcHJvdmlkZSBhbiBlbWJlZGRlZCBEU1A7IG1lYXN1cmluZyBkaXJlY3RseSB0aGUgbGluawordGltZSB3aXRoIGRlZGljYXRlZCBoYXJkd2FyZSwgcG9zc2libHkgc3luY2hyb25pemVkIHdpdGggc3lzdGVtIHRpbWUsCityZW1vdmVzIHRoZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgaW50ZXJuYWwgRFNQIHByb2Nlc3NpbmcgdGltZXMgYW5kCitsYXRlbmN5LgorCitJbiBjYXNlIHRoZSBhcHBsaWNhdGlvbiByZXF1ZXN0cyBhbiBhdWRpbyB0c3RhbXAgdGhhdCBpcyBub3Qgc3VwcG9ydGVkCitpbiBoYXJkd2FyZS9sb3ctbGV2ZWwgZHJpdmVyLCB0aGUgdHlwZSBpcyBvdmVycmlkZGVuIGFzIERFRkFVTFQgYW5kIHRoZQordGltZXN0YW1wIHdpbGwgcmVwb3J0IHRoZSBETUEgdGltZSBiYXNlZCBvbiB0aGUgaHdfcG9pbnRlciB2YWx1ZS4KKworRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggcHJldmlvdXMgaW1wbGVtZW50YXRpb25zIHRoYXQgZGlkIG5vdAorcHJvdmlkZSB0aW1lc3RhbXAgc2VsZWN0aW9uLCB3aXRoIGEgemVyby12YWx1ZWQgQ09NUEFUIHRpbWVzdGFtcCB0eXBlCit0aGUgcmVzdWx0cyB3aWxsIGRlZmF1bHQgdG8gdGhlIEhEQXVkaW8gd2FsbCBjbG9jayBmb3IgcGxheWJhY2sKK3N0cmVhbXMgYW5kIHRvIHRoZSBETUEgdGltZSAoaHdfcHRyKSBpbiBhbGwgb3RoZXIgY2FzZXMuCisKK1RoZSBhdWRpbyB0aW1lc3RhbXAgYWNjdXJhY3kgY2FuIGJlIHJldHVybmVkIHRvIHVzZXItc3BhY2UsIHNvIHRoYXQKK2FwcHJvcHJpYXRlIGRlY2lzaW9ucyBhcmUgbWFkZToKKworLSBmb3IgZG1hIHRpbWUgKGRlZmF1bHQpLCB0aGUgZ3JhbnVsYXJpdHkgb2YgdGhlIHRyYW5zZmVycyBjYW4gYmUKKyAgaW5mZXJyZWQgZnJvbSB0aGUgc3RlcHMgYmV0d2VlbiB1cGRhdGVzIGFuZCBpbiB0dXJuIHByb3ZpZGUKKyAgaW5mb3JtYXRpb24gb24gaG93IG11Y2ggdGhlIGFwcGxpY2F0aW9uIHBvaW50ZXIgY2FuIGJlIHJld291bmQKKyAgc2FmZWx5LgorCistIHRoZSBsaW5rIHRpbWUgY2FuIGJlIHVzZWQgdG8gdHJhY2sgbG9uZy10ZXJtIGRyaWZ0cyBiZXR3ZWVuIGF1ZGlvCisgIGFuZCBzeXN0ZW0gdGltZSB1c2luZyB0aGUgKHRzdGFtcC10cmlnZ2VyX3RzdGFtcCkvYXVkaW9fdHN0YW1wCisgIHJhdGlvLCB0aGUgcHJlY2lzaW9uIGhlbHBzIGRlZmluZSBob3cgbXVjaCBzbW9vdGhpbmcvbG93LXBhc3MKKyAgZmlsdGVyaW5nIGlzIHJlcXVpcmVkLiBUaGUgbGluayB0aW1lIGNhbiBiZSBlaXRoZXIgcmVzZXQgb24gc3RhcnR1cAorICBvciByZXBvcnRlZCBhcyBpcyAodGhlIGxhdHRlciBiZWluZyB1c2VmdWwgdG8gY29tcGFyZSBwcm9ncmVzcyBvZgorICBkaWZmZXJlbnQgc3RyZWFtcyAtIGJ1dCBtYXkgcmVxdWlyZSB0aGUgd2FsbGNsb2NrIHRvIGJlIGFsd2F5cworICBydW5uaW5nIGFuZCBub3Qgd3JhcC1hcm91bmQgZHVyaW5nIGlkbGUgcGVyaW9kcykuIElmIHN1cHBvcnRlZCBpbgorICBoYXJkd2FyZSwgdGhlIGFic29sdXRlIGxpbmsgdGltZSBjb3VsZCBhbHNvIGJlIHVzZWQgdG8gZGVmaW5lIGEKKyAgcHJlY2lzZSBzdGFydCB0aW1lIChwYXRjaGVzIFdJUCkKKworLSBpbmNsdWRpbmcgdGhlIGRlbGF5IGluIHRoZSBhdWRpbyB0aW1lc3RhbXAgbWF5CisgIGNvdW50ZXItaW50dWl0aXZlbHkgbm90IGluY3JlYXNlIHRoZSBwcmVjaXNpb24gb2YgdGltZXN0YW1wcywgZS5nLiBpZiBhCisgIGNvZGVjIGluY2x1ZGVzIHZhcmlhYmxlLWxhdGVuY3kgRFNQIHByb2Nlc3Npbmcgb3IgYSBjaGFpbiBvZgorICBoYXJkd2FyZSBjb21wb25lbnRzIHRoZSBkZWxheSBpcyB0eXBpY2FsbHkgbm90IGtub3duIHdpdGggcHJlY2lzaW9uLgorCitUaGUgYWNjdXJhY3kgaXMgcmVwb3J0ZWQgaW4gbmFub3NlY29uZCB1bml0cyAodXNpbmcgYW4gdW5zaWduZWQgMzItYml0Cit3b3JkKSwgd2hpY2ggZ2l2ZXMgYSBtYXggcHJlY2lzaW9uIG9mIDQuMjlzLCBtb3JlIHRoYW4gZW5vdWdoIGZvcgorYXVkaW8gYXBwbGljYXRpb25zLi4uCisKK0R1ZSB0byB0aGUgdmFyaWVkIG5hdHVyZSBvZiB0aW1lc3RhbXBpbmcgbmVlZHMsIGV2ZW4gZm9yIGEgc2luZ2xlCithcHBsaWNhdGlvbiwgdGhlIGF1ZGlvX3RzdGFtcF9jb25maWcgY2FuIGJlIGNoYW5nZWQgZHluYW1pY2FsbHkuIEluCit0aGUgU1RBVFVTIGlvY3RsLCB0aGUgcGFyYW1ldGVycyBhcmUgcmVhZC1vbmx5IGFuZCBkbyBub3QgYWxsb3cgZm9yCithbnkgYXBwbGljYXRpb24gc2VsZWN0aW9uLiBUbyB3b3JrIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24gd2l0aG91dAoraW1wYWN0aW5nIGxlZ2FjeSBhcHBsaWNhdGlvbnMsIGEgbmV3IFNUQVRVU19FWFQgaW9jdGwgaXMgaW50cm9kdWNlZAord2l0aCByZWFkL3dyaXRlIHBhcmFtZXRlcnMuIEFMU0EtbGliIHdpbGwgYmUgbW9kaWZpZWQgdG8gbWFrZSB1c2Ugb2YKK1NUQVRVU19FWFQgYW5kIGVmZmVjdGl2ZWx5IGRlcHJlY2F0ZSBTVEFUVVMuCisKK1RoZSBBTFNBIEFQSSBvbmx5IGFsbG93cyBmb3IgYSBzaW5nbGUgYXVkaW8gdGltZXN0YW1wIHRvIGJlIHJlcG9ydGVkCithdCBhIHRpbWUuIFRoaXMgaXMgYSBjb25zY2lvdXMgZGVzaWduIGRlY2lzaW9uLCByZWFkaW5nIHRoZSBhdWRpbwordGltZXN0YW1wcyBmcm9tIGhhcmR3YXJlIHJlZ2lzdGVycyBvciBmcm9tIElQQyB0YWtlcyB0aW1lLCB0aGUgbW9yZQordGltZXN0YW1wcyBhcmUgcmVhZCB0aGUgbW9yZSBpbXByZWNpc2UgdGhlIGNvbWJpbmVkIG1lYXN1cmVtZW50cworYXJlLiBUbyBhdm9pZCBhbnkgaW50ZXJwcmV0YXRpb24gaXNzdWVzLCBhIHNpbmdsZSAoc3lzdGVtLCBhdWRpbykKK3RpbWVzdGFtcCBpcyByZXBvcnRlZC4gQXBwbGljYXRpb25zIHRoYXQgbmVlZCBkaWZmZXJlbnQgdGltZXN0YW1wcword2lsbCBiZSByZXF1aXJlZCB0byBpc3N1ZSBtdWx0aXBsZSBxdWVyaWVzIGFuZCBwZXJmb3JtIGFuCitpbnRlcnBvbGF0aW9uIG9mIHRoZSByZXN1bHRzCisKK0luIHNvbWUgaGFyZHdhcmUtc3BlY2lmaWMgY29uZmlndXJhdGlvbiwgdGhlIHN5c3RlbSB0aW1lc3RhbXAgaXMKK2xhdGNoZWQgYnkgYSBsb3ctbGV2ZWwgYXVkaW8gc3Vic3l0ZW0sIGFuZCB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQKK2JhY2sgdG8gdGhlIGRyaXZlci4gRHVlIHRvIHBvdGVudGlhbCBkZWxheXMgaW4gdGhlIGNvbW11bmljYXRpb24gd2l0aAordGhlIGhhcmR3YXJlLCB0aGVyZSBpcyBhIHJpc2sgb2YgbWlzYWxpZ25tZW50IHdpdGggdGhlIGF2YWlsIGFuZCBkZWxheQoraW5mb3JtYXRpb24uIFRvIG1ha2Ugc3VyZSBhcHBsaWNhdGlvbnMgYXJlIG5vdCBjb25mdXNlZCwgYQorZHJpdmVyX3RpbWVzdGFtcCBmaWVsZCBpcyBhZGRlZCBpbiB0aGUgc25kX3BjbV9zdGF0dXMgc3RydWN0dXJlOyB0aGlzCit0aW1lc3RhbXAgc2hvd3Mgd2hlbiB0aGUgaW5mb3JtYXRpb24gaXMgcHV0IHRvZ2V0aGVyIGJ5IHRoZSBkcml2ZXIKK2JlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgU1RBVFVTIGFuZCBTVEFUVVNfRVhUIGlvY3RsLiBpbiBtb3N0IGNhc2VzCit0aGlzIGRyaXZlcl90aW1lc3RhbXAgd2lsbCBiZSBpZGVudGljYWwgdG8gdGhlIHJlZ3VsYXIgc3lzdGVtIHRzdGFtcC4KKworRXhhbXBsZXMgb2YgdHlwZXN0YW1waW5nIHdpdGggSERhdWRpbzoKKworMS4gRE1BIHRpbWVzdGFtcCwgbm8gY29tcGVuc2F0aW9uIGZvciBETUErYW5hbG9nIGRlbGF5CiskIC4vYXVkaW9fdGltZSAgLXAgLS10c190eXBlPTEKK3BsYXliYWNrOiBzeXN0aW1lOiAzNDExMjEzMzggbnNlYywgYXVkaW8gdGltZSAzNDIwMDAwMDAgbnNlYywgCXN5c3RpbWUgZGVsdGEgLTg3ODY2MgorcGxheWJhY2s6IHN5c3RpbWU6IDQyNjIzNjY2MyBuc2VjLCBhdWRpbyB0aW1lIDQyNzE4NzUwMCBuc2VjLCAJc3lzdGltZSBkZWx0YSAtOTUwODM3CitwbGF5YmFjazogc3lzdGltZTogNTk3MDgwNTgwIG5zZWMsIGF1ZGlvIHRpbWUgNTk4MDAwMDAwIG5zZWMsIAlzeXN0aW1lIGRlbHRhIC05MTk0MjAKK3BsYXliYWNrOiBzeXN0aW1lOiA2ODIwNTk3ODIgbnNlYywgYXVkaW8gdGltZSA2ODMwMjA4MzMgbnNlYywgCXN5c3RpbWUgZGVsdGEgLTk2MTA1MQorcGxheWJhY2s6IHN5c3RpbWU6IDg1Mjg5NjQxNSBuc2VjLCBhdWRpbyB0aW1lIDg1Mzg1NDE2NiBuc2VjLCAJc3lzdGltZSBkZWx0YSAtOTU3NzUxCitwbGF5YmFjazogc3lzdGltZTogOTM3OTAzMzQ0IG5zZWMsIGF1ZGlvIHRpbWUgOTM4ODU0MTY2IG5zZWMsIAlzeXN0aW1lIGRlbHRhIC05NTA4MjIKKworMi4gRE1BIHRpbWVzdGFtcCwgY29tcGVuc2F0aW9uIGZvciBETUErYW5hbG9nIGRlbGF5CiskIC4vYXVkaW9fdGltZSAgLXAgLS10c190eXBlPTEgLWQKK3BsYXliYWNrOiBzeXN0aW1lOiAzNDEwNTMzNDcgbnNlYywgYXVkaW8gdGltZSAzNDEwNjI1MDAgbnNlYywgCXN5c3RpbWUgZGVsdGEgLTkxNTMKK3BsYXliYWNrOiBzeXN0aW1lOiA0MjYwNzI0NDcgbnNlYywgYXVkaW8gdGltZSA0MjYwNjI1MDAgbnNlYywgCXN5c3RpbWUgZGVsdGEgOTk0NworcGxheWJhY2s6IHN5c3RpbWU6IDU5Njg5OTUxOCBuc2VjLCBhdWRpbyB0aW1lIDU5Njg5NTgzMyBuc2VjLCAJc3lzdGltZSBkZWx0YSAzNjg1CitwbGF5YmFjazogc3lzdGltZTogNjgxOTE1MzE3IG5zZWMsIGF1ZGlvIHRpbWUgNjgxOTE2NjY2IG5zZWMsIAlzeXN0aW1lIGRlbHRhIC0xMzQ5CitwbGF5YmFjazogc3lzdGltZTogODUyNzQxMzA2IG5zZWMsIGF1ZGlvIHRpbWUgODUyNzUwMDAwIG5zZWMsIAlzeXN0aW1lIGRlbHRhIC04Njk0CisKKzMuIGxpbmsgdGltZXN0YW1wLCBjb21wZW5zYXRpb24gZm9yIERNQSthbmFsb2cgZGVsYXkKKyQgLi9hdWRpb190aW1lICAtcCAtLXRzX3R5cGU9MiAtZAorcGxheWJhY2s6IHN5c3RpbWU6IDM0MTA2MDAwNCBuc2VjLCBhdWRpbyB0aW1lIDM0MTA2Mjc5MSBuc2VjLCAJc3lzdGltZSBkZWx0YSAtMjc4NworcGxheWJhY2s6IHN5c3RpbWU6IDQyNjI0MjA3NCBuc2VjLCBhdWRpbyB0aW1lIDQyNjI0NDg3NSBuc2VjLCAJc3lzdGltZSBkZWx0YSAtMjgwMQorcGxheWJhY2s6IHN5c3RpbWU6IDU5NzA4MDk5MiBuc2VjLCBhdWRpbyB0aW1lIDU5NzA4NDU4MyBuc2VjLCAJc3lzdGltZSBkZWx0YSAtMzU5MQorcGxheWJhY2s6IHN5c3RpbWU6IDY4MjA4NDUxMiBuc2VjLCBhdWRpbyB0aW1lIDY4MjA4ODI5MSBuc2VjLCAJc3lzdGltZSBkZWx0YSAtMzc3OQorcGxheWJhY2s6IHN5c3RpbWU6IDg1MjkzNjIyOSBuc2VjLCBhdWRpbyB0aW1lIDg1Mjk0MDkxNiBuc2VjLCAJc3lzdGltZSBkZWx0YSAtNDY4NworcGxheWJhY2s6IHN5c3RpbWU6IDkzODEwNzU2MiBuc2VjLCBhdWRpbyB0aW1lIDkzODExMjcwOCBuc2VjLCAJc3lzdGltZSBkZWx0YSAtNTE0NgorCitFeGFtcGxlIDEgc2hvd3MgdGhhdCB0aGUgdGltZXN0YW1wIGF0IHRoZSBETUEgbGV2ZWwgaXMgY2xvc2UgdG8gMW1zCithaGVhZCBvZiB0aGUgYWN0dWFsIHBsYXliYWNrIHRpbWUgKGFzIGEgc2lkZSB0aW1lIHRoaXMgc29ydCBvZgorbWVhc3VyZW1lbnQgY2FuIGhlbHAgZGVmaW5lIHJld2luZCBzYWZlZ3VhcmRzKS4gQ29tcGVuc2F0aW5nIGZvciB0aGUKK0RNQS1saW5rIGRlbGF5IGluIGV4YW1wbGUgMiBoZWxwcyByZW1vdmUgdGhlIGhhcmR3YXJlIGJ1ZmZlcmluZyBhYnV0Cit0aGUgaW5mb3JtYXRpb24gaXMgc3RpbGwgdmVyeSBqaXR0ZXJ5LCB3aXRoIHVwIHRvIG9uZSBzYW1wbGUgb2YKK2Vycm9yLiBJbiBleGFtcGxlIDMgd2hlcmUgdGhlIHRpbWVzdGFtcHMgYXJlIG1lYXN1cmVkIHdpdGggdGhlIGxpbmsKK3dhbGxjbG9jaywgdGhlIHRpbWVzdGFtcHMgc2hvdyBhIG1vbm90b25pYyBiZWhhdmlvciBhbmQgYSBsb3dlcgorZGlzcGVyc2lvbi4KKworRXhhbXBsZSAzIGFuZCA0IGFyZSB3aXRoIFVTQiBhdWRpbyBjbGFzcy4gRXhhbXBsZSAzIHNob3dzIGEgaGlnaAorb2Zmc2V0IGJldHdlZW4gYXVkaW8gdGltZSBhbmQgc3lzdGVtIHRpbWUgZHVlIHRvIGJ1ZmZlcmluZy4gRXhhbXBsZSA0CitzaG93cyBob3cgY29tcGVuc2F0aW5nIGZvciB0aGUgZGVsYXkgZXhwb3NlcyBhIDFtcyBhY2N1cmFjeSAoZHVlIHRvCit0aGUgdXNlIG9mIHRoZSBmcmFtZSBjb3VudGVyIGJ5IHRoZSBkcml2ZXIpCisKK0V4YW1wbGUgMzogRE1BIHRpbWVzdGFtcCwgbm8gY29tcGVuc2F0aW9uIGZvciBkZWxheSwgZGVsdGEgb2YgfjVtcworJCAuL2F1ZGlvX3RpbWUgLXAgLURodzoxIC10MQorcGxheWJhY2s6IHN5c3RpbWU6IDEyMDE3NDAxOSBuc2VjLCBhdWRpbyB0aW1lIDEyNTAwMDAwMCBuc2VjLCAJc3lzdGltZSBkZWx0YSAtNDgyNTk4MQorcGxheWJhY2s6IHN5c3RpbWU6IDI0NTA0MTEzNiBuc2VjLCBhdWRpbyB0aW1lIDI1MDAwMDAwMCBuc2VjLCAJc3lzdGltZSBkZWx0YSAtNDk1ODg2NAorcGxheWJhY2s6IHN5c3RpbWU6IDM3MDEwNjA4OCBuc2VjLCBhdWRpbyB0aW1lIDM3NTAwMDAwMCBuc2VjLCAJc3lzdGltZSBkZWx0YSAtNDg5MzkxMgorcGxheWJhY2s6IHN5c3RpbWU6IDQ5NTA0MDA2NSBuc2VjLCBhdWRpbyB0aW1lIDUwMDAwMDAwMCBuc2VjLCAJc3lzdGltZSBkZWx0YSAtNDk1OTkzNQorcGxheWJhY2s6IHN5c3RpbWU6IDYyMDAzODE3OSBuc2VjLCBhdWRpbyB0aW1lIDYyNTAwMDAwMCBuc2VjLCAJc3lzdGltZSBkZWx0YSAtNDk2MTgyMQorcGxheWJhY2s6IHN5c3RpbWU6IDc0NTA4Nzc0MSBuc2VjLCBhdWRpbyB0aW1lIDc1MDAwMDAwMCBuc2VjLCAJc3lzdGltZSBkZWx0YSAtNDkxMjI1OQorcGxheWJhY2s6IHN5c3RpbWU6IDg3MDAzNzMzNiBuc2VjLCBhdWRpbyB0aW1lIDg3NTAwMDAwMCBuc2VjLCAJc3lzdGltZSBkZWx0YSAtNDk2MjY2NAorCitFeGFtcGxlIDQ6IERNQSB0aW1lc3RhbXAsIGNvbXBlbnNhdGlvbiBmb3IgZGVsYXksIGRlbGF5IG9mIH4xbXMKKyQgLi9hdWRpb190aW1lIC1wIC1EaHc6MSAtdDEgLWQKK3BsYXliYWNrOiBzeXN0aW1lOiAxMjAxOTA1MjAgbnNlYywgYXVkaW8gdGltZSAxMjAwMDAwMDAgbnNlYywgCXN5c3RpbWUgZGVsdGEgMTkwNTIwCitwbGF5YmFjazogc3lzdGltZTogMjQ1MDM2NzQwIG5zZWMsIGF1ZGlvIHRpbWUgMjQ0MDAwMDAwIG5zZWMsIAlzeXN0aW1lIGRlbHRhIDEwMzY3NDAKK3BsYXliYWNrOiBzeXN0aW1lOiAzNzAwMzQwODEgbnNlYywgYXVkaW8gdGltZSAzNjkwMDAwMDAgbnNlYywgCXN5c3RpbWUgZGVsdGEgMTAzNDA4MQorcGxheWJhY2s6IHN5c3RpbWU6IDQ5NTE1OTkwNyBuc2VjLCBhdWRpbyB0aW1lIDQ5NDAwMDAwMCBuc2VjLCAJc3lzdGltZSBkZWx0YSAxMTU5OTA3CitwbGF5YmFjazogc3lzdGltZTogNjIwMDk4ODI0IG5zZWMsIGF1ZGlvIHRpbWUgNjE5MDAwMDAwIG5zZWMsIAlzeXN0aW1lIGRlbHRhIDEwOTg4MjQKK3BsYXliYWNrOiBzeXN0aW1lOiA3NDUwMzE4NDcgbnNlYywgYXVkaW8gdGltZSA3NDQwMDAwMDAgbnNlYywgCXN5c3RpbWUgZGVsdGEgMTAzMTg0NwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zcGkvc3BpLXN1bW1hcnkgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktc3VtbWFyeQppbmRleCBkMjk3MzRiLi5kMTgyNGIzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3NwaS9zcGktc3VtbWFyeQorKysgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGktc3VtbWFyeQpAQCAtMzQyLDEyICszNDIsMTEgQEAKIAkJLmRyaXZlciA9IHsKIAkJCS5uYW1lCQk9ICJDSElQIiwKIAkJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkJCS5wbQkJPSAmQ0hJUF9wbV9vcHMsCiAJCX0sCiAKIAkJLnByb2JlCQk9IENISVBfcHJvYmUsCiAJCS5yZW1vdmUJCT0gQ0hJUF9yZW1vdmUsCi0JCS5zdXNwZW5kCT0gQ0hJUF9zdXNwZW5kLAotCQkucmVzdW1lCQk9IENISVBfcmVzdW1lLAogCX07CiAKIFRoZSBkcml2ZXIgY29yZSB3aWxsIGF1dG9tYXRpY2FsbHkgYXR0ZW1wdCB0byBiaW5kIHRoaXMgZHJpdmVyIHRvIGFueSBTUEkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldl90ZXN0LmMgYi9Eb2N1bWVudGF0aW9uL3NwaS9zcGlkZXZfdGVzdC5jCmluZGV4IDNhMmY5ZDUuLjk0ZjU3NGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3BpL3NwaWRldl90ZXN0LmMKKysrIGIvRG9jdW1lbnRhdGlvbi9zcGkvc3BpZGV2X3Rlc3QuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KQEAgLTM0LDI0ICszNSw3OSBAQAogc3RhdGljIHVpbnQ4X3QgYml0cyA9IDg7CiBzdGF0aWMgdWludDMyX3Qgc3BlZWQgPSA1MDAwMDA7CiBzdGF0aWMgdWludDE2X3QgZGVsYXk7CitzdGF0aWMgaW50IHZlcmJvc2U7CiAKLXN0YXRpYyB2b2lkIHRyYW5zZmVyKGludCBmZCkKK3VpbnQ4X3QgZGVmYXVsdF90eFtdID0geworCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwKKwkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweEYwLCAweDBELAorfTsKKwordWludDhfdCBkZWZhdWx0X3J4W0FSUkFZX1NJWkUoZGVmYXVsdF90eCldID0gezAsIH07CitjaGFyICppbnB1dF90eDsKKworc3RhdGljIHZvaWQgaGV4X2R1bXAoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbGVuZ3RoLCBzaXplX3QgbGluZV9zaXplLCBjaGFyICpwcmVmaXgpCit7CisJaW50IGkgPSAwOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHJlc3MgPSBzcmM7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbGluZSA9IGFkZHJlc3M7CisJdW5zaWduZWQgY2hhciBjOworCisJcHJpbnRmKCIlcyB8ICIsIHByZWZpeCk7CisJd2hpbGUgKGxlbmd0aC0tID4gMCkgeworCQlwcmludGYoIiUwMlggIiwgKmFkZHJlc3MrKyk7CisJCWlmICghKCsraSAlIGxpbmVfc2l6ZSkgfHwgKGxlbmd0aCA9PSAwICYmIGkgJSBsaW5lX3NpemUpKSB7CisJCQlpZiAobGVuZ3RoID09IDApIHsKKwkJCQl3aGlsZSAoaSsrICUgbGluZV9zaXplKQorCQkJCQlwcmludGYoIl9fICIpOworCQkJfQorCQkJcHJpbnRmKCIgfCAiKTsgIC8qIHJpZ2h0IGNsb3NlICovCisJCQl3aGlsZSAobGluZSA8IGFkZHJlc3MpIHsKKwkJCQljID0gKmxpbmUrKzsKKwkJCQlwcmludGYoIiVjIiwgKGMgPCAzMyB8fCBjID09IDI1NSkgPyAweDJFIDogYyk7CisJCQl9CisJCQlwcmludGYoIlxuIik7CisJCQlpZiAobGVuZ3RoID4gMCkKKwkJCQlwcmludGYoIiVzIHwgIiwgcHJlZml4KTsKKwkJfQorCX0KK30KKworLyoKKyAqICBVbmVzY2FwZSAtIHByb2Nlc3MgaGV4YWRlY2ltYWwgZXNjYXBlIGNoYXJhY3RlcgorICogICAgICBjb252ZXJ0cyBzaGVsbCBpbnB1dCAiXHgyMyIgLT4gMHgyMworICovCitpbnQgdW5lc3BjYXBlKGNoYXIgKl9kc3QsIGNoYXIgKl9zcmMsIHNpemVfdCBsZW4pCit7CisJaW50IHJldCA9IDA7CisJY2hhciAqc3JjID0gX3NyYzsKKwljaGFyICpkc3QgPSBfZHN0OworCXVuc2lnbmVkIGludCBjaDsKKworCXdoaWxlICgqc3JjKSB7CisJCWlmICgqc3JjID09ICdcXCcgJiYgKihzcmMrMSkgPT0gJ3gnKSB7CisJCQlzc2NhbmYoc3JjICsgMiwgIiUyeCIsICZjaCk7CisJCQlzcmMgKz0gNDsKKwkJCSpkc3QrKyA9ICh1bnNpZ25lZCBjaGFyKWNoOworCQl9IGVsc2UgeworCQkJKmRzdCsrID0gKnNyYysrOworCQl9CisJCXJldCsrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0cmFuc2ZlcihpbnQgZmQsIHVpbnQ4X3QgY29uc3QgKnR4LCB1aW50OF90IGNvbnN0ICpyeCwgc2l6ZV90IGxlbikKIHsKIAlpbnQgcmV0OwotCXVpbnQ4X3QgdHhbXSA9IHsKLQkJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKLQkJMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5NSwKLQkJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKLQkJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKLQkJMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKLQkJMHhERSwgMHhBRCwgMHhCRSwgMHhFRiwgMHhCQSwgMHhBRCwKLQkJMHhGMCwgMHgwRCwKLQl9OwotCXVpbnQ4X3QgcnhbQVJSQVlfU0laRSh0eCldID0gezAsIH07CisKIAlzdHJ1Y3Qgc3BpX2lvY190cmFuc2ZlciB0ciA9IHsKIAkJLnR4X2J1ZiA9ICh1bnNpZ25lZCBsb25nKXR4LAogCQkucnhfYnVmID0gKHVuc2lnbmVkIGxvbmcpcngsCi0JCS5sZW4gPSBBUlJBWV9TSVpFKHR4KSwKKwkJLmxlbiA9IGxlbiwKIAkJLmRlbGF5X3VzZWNzID0gZGVsYXksCiAJCS5zcGVlZF9oeiA9IHNwZWVkLAogCQkuYml0c19wZXJfd29yZCA9IGJpdHMsCkBAIC03NiwxMiArMTMyLDkgQEAKIAlpZiAocmV0IDwgMSkKIAkJcGFib3J0KCJjYW4ndCBzZW5kIHNwaSBtZXNzYWdlIik7CiAKLQlmb3IgKHJldCA9IDA7IHJldCA8IEFSUkFZX1NJWkUodHgpOyByZXQrKykgewotCQlpZiAoIShyZXQgJSA2KSkKLQkJCXB1dHMoIiIpOwotCQlwcmludGYoIiUuMlggIiwgcnhbcmV0XSk7Ci0JfQotCXB1dHMoIiIpOworCWlmICh2ZXJib3NlKQorCQloZXhfZHVtcCh0eCwgbGVuLCAzMiwgIlRYIik7CisJaGV4X2R1bXAocngsIGxlbiwgMzIsICJSWCIpOwogfQogCiBzdGF0aWMgdm9pZCBwcmludF91c2FnZShjb25zdCBjaGFyICpwcm9nKQpAQCAtOTcsNiArMTUwLDggQEAKIAkgICAgICIgIC1MIC0tbHNiICAgICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IGZpcnN0XG4iCiAJICAgICAiICAtQyAtLWNzLWhpZ2ggIGNoaXAgc2VsZWN0IGFjdGl2ZSBoaWdoXG4iCiAJICAgICAiICAtMyAtLTN3aXJlICAgIFNJL1NPIHNpZ25hbHMgc2hhcmVkXG4iCisJICAgICAiICAtdiAtLXZlcmJvc2UgIFZlcmJvc2UgKHNob3cgdHggYnVmZmVyKVxuIgorCSAgICAgIiAgLXAgICAgICAgICAgICBTZW5kIGRhdGEgKGUuZy4gXCIxMjM0XFx4ZGVcXHhhZFwiKVxuIgogCSAgICAgIiAgLU4gLS1uby1jcyAgICBubyBjaGlwIHNlbGVjdFxuIgogCSAgICAgIiAgLVIgLS1yZWFkeSAgICBzbGF2ZSBwdWxscyBsb3cgdG8gcGF1c2VcbiIKIAkgICAgICIgIC0yIC0tZHVhbCAgICAgZHVhbCB0cmFuc2ZlclxuIgpAQCAtMTIxLDEyICsxNzYsMTMgQEAKIAkJCXsgIm5vLWNzIiwgICAwLCAwLCAnTicgfSwKIAkJCXsgInJlYWR5IiwgICAwLCAwLCAnUicgfSwKIAkJCXsgImR1YWwiLCAgICAwLCAwLCAnMicgfSwKKwkJCXsgInZlcmJvc2UiLCAwLCAwLCAndicgfSwKIAkJCXsgInF1YWQiLCAgICAwLCAwLCAnNCcgfSwKIAkJCXsgTlVMTCwgMCwgMCwgMCB9LAogCQl9OwogCQlpbnQgYzsKIAotCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIkQ6czpkOmI6bEhPTEMzTlIyNCIsIGxvcHRzLCBOVUxMKTsKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJEOnM6ZDpiOmxIT0xDM05SMjRwOnYiLCBsb3B0cywgTlVMTCk7CiAKIAkJaWYgKGMgPT0gLTEpCiAJCQlicmVhazsKQEAgLTE2NSw5ICsyMjEsMTUgQEAKIAkJY2FzZSAnTic6CiAJCQltb2RlIHw9IFNQSV9OT19DUzsKIAkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCXZlcmJvc2UgPSAxOworCQkJYnJlYWs7CiAJCWNhc2UgJ1InOgogCQkJbW9kZSB8PSBTUElfUkVBRFk7CiAJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlpbnB1dF90eCA9IG9wdGFyZzsKKwkJCWJyZWFrOwogCQljYXNlICcyJzoKIAkJCW1vZGUgfD0gU1BJX1RYX0RVQUw7CiAJCQlicmVhazsKQEAgLTE5MSw2ICsyNTMsOSBAQAogewogCWludCByZXQgPSAwOwogCWludCBmZDsKKwl1aW50OF90ICp0eDsKKwl1aW50OF90ICpyeDsKKwlpbnQgc2l6ZTsKIAogCXBhcnNlX29wdHMoYXJnYywgYXJndik7CiAKQEAgLTIzNSw3ICszMDAsMTcgQEAKIAlwcmludGYoImJpdHMgcGVyIHdvcmQ6ICVkXG4iLCBiaXRzKTsKIAlwcmludGYoIm1heCBzcGVlZDogJWQgSHogKCVkIEtIeilcbiIsIHNwZWVkLCBzcGVlZC8xMDAwKTsKIAotCXRyYW5zZmVyKGZkKTsKKwlpZiAoaW5wdXRfdHgpIHsKKwkJc2l6ZSA9IHN0cmxlbihpbnB1dF90eCsxKTsKKwkJdHggPSBtYWxsb2Moc2l6ZSk7CisJCXJ4ID0gbWFsbG9jKHNpemUpOworCQlzaXplID0gdW5lc3BjYXBlKChjaGFyICopdHgsIGlucHV0X3R4LCBzaXplKTsKKwkJdHJhbnNmZXIoZmQsIHR4LCByeCwgc2l6ZSk7CisJCWZyZWUocngpOworCQlmcmVlKHR4KTsKKwl9IGVsc2UgeworCQl0cmFuc2ZlcihmZCwgZGVmYXVsdF90eCwgZGVmYXVsdF9yeCwgc2l6ZW9mKGRlZmF1bHRfdHgpKTsKKwl9CiAKIAljbG9zZShmZCk7CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQgYi9Eb2N1bWVudGF0aW9uL3N0YWJsZV9rZXJuZWxfcnVsZXMudHh0CmluZGV4IDAyZjgzMzEuLjU4ZDBhYzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3RhYmxlX2tlcm5lbF9ydWxlcy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zdGFibGVfa2VybmVsX3J1bGVzLnR4dApAQCAtODEsNiArODEsMTYgQEAKICAgICAgZ2l0IGNoZXJyeS1waWNrIGZkMjEwNzMKICAgICAgZ2l0IGNoZXJyeS1waWNrIDx0aGlzIGNvbW1pdD4KIAorQWxzbywgc29tZSBwYXRjaGVzIG1heSBoYXZlIGtlcm5lbCB2ZXJzaW9uIHByZXJlcXVpc2l0ZXMuICBUaGlzIGNhbiBiZQorc3BlY2lmaWVkIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0IGluIHRoZSBzaWduLW9mZiBhcmVhOgorCisgICAgIENjOiAgPHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmc+ICMgMy4zLngtCisKKyAgIFRoZSB0YWcgaGFzIHRoZSBtZWFuaW5nIG9mOgorICAgICBnaXQgY2hlcnJ5LXBpY2sgPHRoaXMgY29tbWl0PgorCisgICBGb3IgZWFjaCAiLXN0YWJsZSIgdHJlZSBzdGFydGluZyB3aXRoIHRoZSBzcGVjaWZpZWQgdmVyc2lvbi4KKwogRm9sbG93aW5nIHRoZSBzdWJtaXNzaW9uOgogCiAgLSBUaGUgc2VuZGVyIHdpbGwgcmVjZWl2ZSBhbiBBQ0sgd2hlbiB0aGUgcGF0Y2ggaGFzIGJlZW4gYWNjZXB0ZWQgaW50byB0aGUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQgYi9Eb2N1bWVudGF0aW9uL3N5c2N0bC9rZXJuZWwudHh0CmluZGV4IDgzYWIyNTYuLjk5ZDdlYjMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc3lzY3RsL2tlcm5lbC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwva2VybmVsLnR4dApAQCAtNzcsMTIgKzc3LDE0IEBACiAtIHNobW1heCAgICAgICAgICAgICAgICAgICAgICBbIHN5c3YgaXBjIF0KIC0gc2htbW5pCiAtIHNvZnRsb2NrdXBfYWxsX2NwdV9iYWNrdHJhY2UKKy0gc29mdF93YXRjaGRvZwogLSBzdG9wLWEgICAgICAgICAgICAgICAgICAgICAgWyBTUEFSQyBvbmx5IF0KIC0gc3lzcnEgICAgICAgICAgICAgICAgICAgICAgID09PiBEb2N1bWVudGF0aW9uL3N5c3JxLnR4dAogLSBzeXNjdGxfd3JpdGVzX3N0cmljdAogLSB0YWludGVkCiAtIHRocmVhZHMtbWF4CiAtIHVua25vd25fbm1pX3BhbmljCistIHdhdGNoZG9nCiAtIHdhdGNoZG9nX3RocmVzaAogLSB2ZXJzaW9uCiAKQEAgLTQxNywxNiArNDE5LDIzIEBACiAKIG5taV93YXRjaGRvZzoKIAotRW5hYmxlcy9EaXNhYmxlcyB0aGUgTk1JIHdhdGNoZG9nIG9uIHg4NiBzeXN0ZW1zLiBXaGVuIHRoZSB2YWx1ZSBpcwotbm9uLXplcm8gdGhlIE5NSSB3YXRjaGRvZyBpcyBlbmFibGVkIGFuZCB3aWxsIGNvbnRpbnVvdXNseSB0ZXN0IGFsbAotb25saW5lIGNwdXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZXkgYXJlIHN0aWxsIGZ1bmN0aW9uaW5nCi1wcm9wZXJseS4gQ3VycmVudGx5LCBwYXNzaW5nICJubWlfd2F0Y2hkb2c9IiBwYXJhbWV0ZXIgYXQgYm9vdCB0aW1lIGlzCi1yZXF1aXJlZCBmb3IgdGhpcyBmdW5jdGlvbiB0byB3b3JrLgorVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgTk1JIHdhdGNoZG9nCisoaS5lLiB0aGUgaGFyZCBsb2NrdXAgZGV0ZWN0b3IpIG9uIHg4NiBzeXN0ZW1zLgogCi1JZiBMQVBJQyBOTUkgd2F0Y2hkb2cgbWV0aG9kIGlzIGluIHVzZSAobm1pX3dhdGNoZG9nPTIga2VybmVsCi1wYXJhbWV0ZXIpLCB0aGUgTk1JIHdhdGNoZG9nIHNoYXJlcyByZWdpc3RlcnMgd2l0aCBvcHJvZmlsZS4gQnkKLWRpc2FibGluZyB0aGUgTk1JIHdhdGNoZG9nLCBvcHJvZmlsZSBtYXkgaGF2ZSBtb3JlIHJlZ2lzdGVycyB0bwotdXRpbGl6ZS4KKyAgIDAgLSBkaXNhYmxlIHRoZSBoYXJkIGxvY2t1cCBkZXRlY3RvcgorICAgMSAtIGVuYWJsZSB0aGUgaGFyZCBsb2NrdXAgZGV0ZWN0b3IKKworVGhlIGhhcmQgbG9ja3VwIGRldGVjdG9yIG1vbml0b3JzIGVhY2ggQ1BVIGZvciBpdHMgYWJpbGl0eSB0byByZXNwb25kIHRvCit0aW1lciBpbnRlcnJ1cHRzLiBUaGUgbWVjaGFuaXNtIHV0aWxpemVzIENQVSBwZXJmb3JtYW5jZSBjb3VudGVyIHJlZ2lzdGVycwordGhhdCBhcmUgcHJvZ3JhbW1lZCB0byBnZW5lcmF0ZSBOb24tTWFza2FibGUgSW50ZXJydXB0cyAoTk1JcykgcGVyaW9kaWNhbGx5Cit3aGlsZSBhIENQVSBpcyBidXN5LiBIZW5jZSwgdGhlIGFsdGVybmF0aXZlIG5hbWUgJ05NSSB3YXRjaGRvZycuCisKK1RoZSBOTUkgd2F0Y2hkb2cgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBpZiB0aGUga2VybmVsIGlzIHJ1bm5pbmcgYXMgYSBndWVzdAoraW4gYSBLVk0gdmlydHVhbCBtYWNoaW5lLiBUaGlzIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYWRkaW5nCisKKyAgIG5taV93YXRjaGRvZz0xCisKK3RvIHRoZSBndWVzdCBrZXJuZWwgY29tbWFuZCBsaW5lIChzZWUgRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQpLgogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC04MTYsNiArODI1LDIyIEBACiAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKK3NvZnRfd2F0Y2hkb2cKKworVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgc29mdCBsb2NrdXAgZGV0ZWN0b3IuCisKKyAgIDAgLSBkaXNhYmxlIHRoZSBzb2Z0IGxvY2t1cCBkZXRlY3RvcgorICAgMSAtIGVuYWJsZSB0aGUgc29mdCBsb2NrdXAgZGV0ZWN0b3IKKworVGhlIHNvZnQgbG9ja3VwIGRldGVjdG9yIG1vbml0b3JzIENQVXMgZm9yIHRocmVhZHMgdGhhdCBhcmUgaG9nZ2luZyB0aGUgQ1BVcword2l0aG91dCByZXNjaGVkdWxpbmcgdm9sdW50YXJpbHksIGFuZCB0aHVzIHByZXZlbnQgdGhlICd3YXRjaGRvZy9OJyB0aHJlYWRzCitmcm9tIHJ1bm5pbmcuIFRoZSBtZWNoYW5pc20gZGVwZW5kcyBvbiB0aGUgQ1BVcyBhYmlsaXR5IHRvIHJlc3BvbmQgdG8gdGltZXIKK2ludGVycnVwdHMgd2hpY2ggYXJlIG5lZWRlZCBmb3IgdGhlICd3YXRjaGRvZy9OJyB0aHJlYWRzIHRvIGJlIHdva2VuIHVwIGJ5Cit0aGUgd2F0Y2hkb2cgdGltZXIgZnVuY3Rpb24sIG90aGVyd2lzZSB0aGUgTk1JIHdhdGNoZG9nIC0gaWYgZW5hYmxlZCAtIGNhbgorZGV0ZWN0IGEgaGFyZCBsb2NrdXAgY29uZGl0aW9uLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCiB0YWludGVkOgogCiBOb24temVybyBpZiB0aGUga2VybmVsIGhhcyBiZWVuIHRhaW50ZWQuICBOdW1lcmljIHZhbHVlcywgd2hpY2gKQEAgLTg1OCw2ICs4ODMsMjUgQEAKIAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAord2F0Y2hkb2c6CisKK1RoaXMgcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgb3IgZW5hYmxlIHRoZSBzb2Z0IGxvY2t1cCBkZXRlY3RvcgorX2FuZF8gdGhlIE5NSSB3YXRjaGRvZyAoaS5lLiB0aGUgaGFyZCBsb2NrdXAgZGV0ZWN0b3IpIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgIDAgLSBkaXNhYmxlIGJvdGggbG9ja3VwIGRldGVjdG9ycworICAgMSAtIGVuYWJsZSBib3RoIGxvY2t1cCBkZXRlY3RvcnMKKworVGhlIHNvZnQgbG9ja3VwIGRldGVjdG9yIGFuZCB0aGUgTk1JIHdhdGNoZG9nIGNhbiBhbHNvIGJlIGRpc2FibGVkIG9yCitlbmFibGVkIGluZGl2aWR1YWxseSwgdXNpbmcgdGhlIHNvZnRfd2F0Y2hkb2cgYW5kIG5taV93YXRjaGRvZyBwYXJhbWV0ZXJzLgorSWYgdGhlIHdhdGNoZG9nIHBhcmFtZXRlciBpcyByZWFkLCBmb3IgZXhhbXBsZSBieSBleGVjdXRpbmcKKworICAgY2F0IC9wcm9jL3N5cy9rZXJuZWwvd2F0Y2hkb2cKKwordGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgKDAgb3IgMSkgc2hvd3MgdGhlIGxvZ2ljYWwgT1Igb2Ygc29mdF93YXRjaGRvZworYW5kIG5taV93YXRjaGRvZy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwogd2F0Y2hkb2dfdGhyZXNoOgogCiBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlIGZyZXF1ZW5jeSBvZiBocnRpbWVyIGFuZCBOTUkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dCBiL0RvY3VtZW50YXRpb24vc3lzY3RsL3ZtLnR4dAppbmRleCA5MDJiNDU3Li45ODMyZWM1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3N5c2N0bC92bS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0CkBAIC0yMSw2ICsyMSw3IEBACiAtIGFkbWluX3Jlc2VydmVfa2J5dGVzCiAtIGJsb2NrX2R1bXAKIC0gY29tcGFjdF9tZW1vcnkKKy0gY29tcGFjdF91bmV2aWN0YWJsZV9hbGxvd2VkCiAtIGRpcnR5X2JhY2tncm91bmRfYnl0ZXMKIC0gZGlydHlfYmFja2dyb3VuZF9yYXRpbwogLSBkaXJ0eV9ieXRlcwpAQCAtMTA2LDYgKzEwNywxNiBAQAogCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCitjb21wYWN0X3VuZXZpY3RhYmxlX2FsbG93ZWQKKworQXZhaWxhYmxlIG9ubHkgd2hlbiBDT05GSUdfQ09NUEFDVElPTiBpcyBzZXQuIFdoZW4gc2V0IHRvIDEsIGNvbXBhY3Rpb24gaXMKK2FsbG93ZWQgdG8gZXhhbWluZSB0aGUgdW5ldmljdGFibGUgbHJ1IChtbG9ja2VkIHBhZ2VzKSBmb3IgcGFnZXMgdG8gY29tcGFjdC4KK1RoaXMgc2hvdWxkIGJlIHVzZWQgb24gc3lzdGVtcyB3aGVyZSBzdGFsbHMgZm9yIG1pbm9yIHBhZ2UgZmF1bHRzIGFyZSBhbgorYWNjZXB0YWJsZSB0cmFkZSBmb3IgbGFyZ2UgY29udGlndW91cyBmcmVlIG1lbW9yeS4gIFNldCB0byAwIHRvIHByZXZlbnQKK2NvbXBhY3Rpb24gZnJvbSBtb3ZpbmcgcGFnZXMgdGhhdCBhcmUgdW5ldmljdGFibGUuICBEZWZhdWx0IHZhbHVlIGlzIDEuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKIGRpcnR5X2JhY2tncm91bmRfYnl0ZXMKIAogQ29udGFpbnMgdGhlIGFtb3VudCBvZiBkaXJ0eSBtZW1vcnkgYXQgd2hpY2ggdGhlIGJhY2tncm91bmQga2VybmVsCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RpbWVycy9OT19IWi50eHQgYi9Eb2N1bWVudGF0aW9uL3RpbWVycy9OT19IWi50eHQKaW5kZXggY2NhMTIyZi4uNmVhZjU3NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90aW1lcnMvTk9fSFoudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdGltZXJzL05PX0haLnR4dApAQCAtMTU4LDEzICsxNTgsOSBAQAogCXRvIHRoZSBuZWVkIHRvIGluZm9ybSBrZXJuZWwgc3Vic3lzdGVtcyAoc3VjaCBhcyBSQ1UpIGFib3V0CiAJdGhlIGNoYW5nZSBpbiBtb2RlLgogCi0zLglQT1NJWCBDUFUgdGltZXJzIG9uIGFkYXB0aXZlLXRpY2sgQ1BVcyBtYXkgbWlzcyB0aGVpciBkZWFkbGluZXMKLQkocGVyaGFwcyBpbmRlZmluaXRlbHkpIGJlY2F1c2UgdGhleSBjdXJyZW50bHkgcmVseSBvbgotCXNjaGVkdWxpbmctdGljayBpbnRlcnJ1cHRzLiAgVGhpcyB3aWxsIGxpa2VseSBiZSBmaXhlZCBpbgotCW9uZSBvZiB0d28gd2F5czogKDEpIFByZXZlbnQgQ1BVcyB3aXRoIFBPU0lYIENQVSB0aW1lcnMgZnJvbQotCWVudGVyaW5nIGFkYXB0aXZlLXRpY2sgbW9kZSwgb3IgKDIpIFVzZSBocnRpbWVycyBvciBvdGhlcgotCWFkYXB0aXZlLXRpY2tzLWltbXVuZSBtZWNoYW5pc20gdG8gY2F1c2UgdGhlIFBPU0lYIENQVSB0aW1lciB0bwotCWZpcmUgcHJvcGVybHkuCiszLglQT1NJWCBDUFUgdGltZXJzIHByZXZlbnQgQ1BVcyBmcm9tIGVudGVyaW5nIGFkYXB0aXZlLXRpY2sgbW9kZS4KKwlSZWFsLXRpbWUgYXBwbGljYXRpb25zIG5lZWRpbmcgdG8gdGFrZSBhY3Rpb25zIGJhc2VkIG9uIENQVSB0aW1lCisJY29uc3VtcHRpb24gbmVlZCB0byB1c2Ugb3RoZXIgbWVhbnMgb2YgZG9pbmcgc28uCiAKIDQuCUlmIHRoZXJlIGFyZSBtb3JlIHBlcmYgZXZlbnRzIHBlbmRpbmcgdGhhbiB0aGUgaGFyZHdhcmUgY2FuCiAJYWNjb21tb2RhdGUsIHRoZXkgYXJlIG5vcm1hbGx5IHJvdW5kLXJvYmluZWQgc28gYXMgdG8gY29sbGVjdApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvY2hpcGlkZWEudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvY2hpcGlkZWEudHh0CmluZGV4IDk5NWM4YmMuLjNmODQ4YzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL2NoaXBpZGVhLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9jaGlwaWRlYS50eHQKQEAgLTY5LDMgKzY5LDI0IEBACiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAiT24tVGhlLUdvIGFuZCBFbWJlZGRlZCBIb3N0IFN1cHBsZW1lbnQgdG8gdGhlIFVTQiBSZXZpc2lvbiAyLjAgU3BlY2lmaWNhdGlvbgogSnVseSAyNywgMjAxMiBSZXZpc2lvbiAyLjAgdmVyc2lvbiAxLjFhIgorCisyLiBIb3cgdG8gZW5hYmxlIFVTQiBhcyBzeXN0ZW0gd2FrZXVwIHNvdXJjZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0JlbG93IGlzIHRoZSBleGFtcGxlIGZvciBob3cgdG8gZW5hYmxlIFVTQiBhcyBzeXN0ZW0gd2FrZXVwIHNvdXJjZQorYXQgaW14NiBwbGF0Zm9ybS4KKworMi4xIEVuYWJsZSBjb3JlJ3Mgd2FrZXVwCitlY2hvIGVuYWJsZWQgPiAvc3lzL2J1cy9wbGF0Zm9ybS9kZXZpY2VzL2NpX2hkcmMuMC9wb3dlci93YWtldXAKKzIuMiBFbmFibGUgZ2x1ZSBsYXllcidzIHdha2V1cAorZWNobyBlbmFibGVkID4gL3N5cy9idXMvcGxhdGZvcm0vZGV2aWNlcy8yMTg0MDAwLnVzYi9wb3dlci93YWtldXAKKzIuMyBFbmFibGUgUEhZJ3Mgd2FrZXVwIChvcHRpb25hbCkKK2VjaG8gZW5hYmxlZCA+IC9zeXMvYnVzL3BsYXRmb3JtL2RldmljZXMvMjBjOTAwMC51c2JwaHkvcG93ZXIvd2FrZXVwCisyLjQgRW5hYmxlIHJvb3RodWIncyB3YWtldXAKK2VjaG8gZW5hYmxlZCA+IC9zeXMvYnVzL3VzYi9kZXZpY2VzL3VzYjEvcG93ZXIvd2FrZXVwCisyLjUgRW5hYmxlIHJlbGF0ZWQgZGV2aWNlJ3Mgd2FrZXVwCitlY2hvIGVuYWJsZWQgPiAvc3lzL2J1cy91c2IvZGV2aWNlcy8xLTEvcG93ZXIvd2FrZXVwCisKK0lmIHRoZSBzeXN0ZW0gaGFzIG9ubHkgb25lIHVzYiBwb3J0LCBhbmQgeW91IHdhbnQgdXNiIHdha2V1cCBhdCB0aGlzIHBvcnQsIHlvdQorY2FuIHVzZSBiZWxvdyBzY3JpcHQgdG8gZW5hYmxlIHVzYiB3YWtldXAuCitmb3IgaSBpbiAkKGZpbmQgL3N5cyAtbmFtZSB3YWtldXAgfCBncmVwIHVzYik7ZG8gZWNobyBlbmFibGVkID4gJGk7ZG9uZTsKKwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi91c2IvZ2FkZ2V0LXRlc3RpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi91c2IvZ2FkZ2V0LXRlc3RpbmcudHh0CmluZGV4IDA3NmFjN2IuLmY0NWIyYmYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL2dhZGdldC10ZXN0aW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3VzYi9nYWRnZXQtdGVzdGluZy50eHQKQEAgLTE5LDYgKzE5LDcgQEAKIDE2LiBVQUMxIGZ1bmN0aW9uCiAxNy4gVUFDMiBmdW5jdGlvbgogMTguIFVWQyBmdW5jdGlvbgorMTkuIFBSSU5URVIgZnVuY3Rpb24KIAogCiAxLiBBQ00gZnVuY3Rpb24KQEAgLTcyNiwzICs3MjcsNDkgQEAKIGh0dHA6Ly93d3cuc3Bpbmljcy5uZXQvbGlzdHMvbGludXgtdXNiL21zZzk5MjIwLmh0bWwKIAogaG9zdDogbHV2Y3ZpZXcgLWYgeXV2CisKKzE5LiBQUklOVEVSIGZ1bmN0aW9uCis9PT09PT09PT09PT09PT09PT09PQorCitUaGUgZnVuY3Rpb24gaXMgcHJvdmlkZWQgYnkgdXNiX2ZfcHJpbnRlci5rbyBtb2R1bGUuCisKK0Z1bmN0aW9uLXNwZWNpZmljIGNvbmZpZ2ZzIGludGVyZmFjZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmdW5jdGlvbiBuYW1lIHRvIHVzZSB3aGVuIGNyZWF0aW5nIHRoZSBmdW5jdGlvbiBkaXJlY3RvcnkgaXMgInByaW50ZXIiLgorVGhlIHByaW50ZXIgZnVuY3Rpb24gcHJvdmlkZXMgdGhlc2UgYXR0cmlidXRlcyBpbiBpdHMgZnVuY3Rpb24gZGlyZWN0b3J5OgorCisJcG5wX3N0cmluZwktIERhdGEgdG8gYmUgcGFzc2VkIHRvIHRoZSBob3N0IGluIHBucCBzdHJpbmcKKwlxX2xlbgkJLSBOdW1iZXIgb2YgcmVxdWVzdHMgcGVyIGVuZHBvaW50CisKK1Rlc3RpbmcgdGhlIFBSSU5URVIgZnVuY3Rpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIG1vc3QgYmFzaWMgdGVzdGluZzoKKworZGV2aWNlOiBydW4gdGhlIGdhZGdldAorIyBscyAtbCAvZGV2aWNlcy92aXJ0dWFsL3VzYl9wcmludGVyX2dhZGdldC8KKworc2hvdWxkIHNob3cgZ19wcmludGVyPG51bWJlcj4uCisKK0lmIHVkZXYgaXMgYWN0aXZlLCB0aGVuIC9kZXYvZ19wcmludGVyPG51bWJlcj4gc2hvdWxkIGFwcGVhciBhdXRvbWF0aWNhbGx5LgorCitob3N0OgorCitJZiB1ZGV2IGlzIGFjdGl2ZSwgdGhlbiBlLmcuIC9kZXYvdXNiL2xwMCBzaG91bGQgYXBwZWFyLgorCitob3N0LT5kZXZpY2UgdHJhbnNtaXNzaW9uOgorCitkZXZpY2U6CisjIGNhdCAvZGV2L2dfcHJpbnRlcjxudW1iZXI+Citob3N0OgorIyBjYXQgPiAvZGV2L3VzYi9scDAKKworZGV2aWNlLT5ob3N0IHRyYW5zbWlzc2lvbjoKKworIyBjYXQgPiAvZGV2L2dfcHJpbnRlcjxudW1iZXI+Citob3N0OgorIyBjYXQgL2Rldi91c2IvbHAwCisKK01vcmUgYWR2YW5jZWQgdGVzdGluZyBjYW4gYmUgZG9uZSB3aXRoIHRoZSBwcm5fZXhhbXBsZQorZGVzY3JpYmVkIGluIERvY3VtZW50YXRpb24vdXNiL2dhZGdldC1wcmludGVyLnR4dC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dAppbmRleCBiMTEyZWZjLi5iYzlmNmZlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2FwaS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9hcGkudHh0CkBAIC05OTcsNyArOTk3LDcgQEAKIDQuMzggS1ZNX0dFVF9NUF9TVEFURQogCiBDYXBhYmlsaXR5OiBLVk1fQ0FQX01QX1NUQVRFCi1BcmNoaXRlY3R1cmVzOiB4ODYsIHMzOTAKK0FyY2hpdGVjdHVyZXM6IHg4NiwgczM5MCwgYXJtLCBhcm02NAogVHlwZTogdmNwdSBpb2N0bAogUGFyYW1ldGVyczogc3RydWN0IGt2bV9tcF9zdGF0ZSAob3V0KQogUmV0dXJuczogMCBvbiBzdWNjZXNzOyAtMSBvbiBlcnJvcgpAQCAtMTAxMSw3ICsxMDExLDcgQEAKIAogUG9zc2libGUgdmFsdWVzIGFyZToKIAotIC0gS1ZNX01QX1NUQVRFX1JVTk5BQkxFOiAgICAgICAgdGhlIHZjcHUgaXMgY3VycmVudGx5IHJ1bm5pbmcgW3g4Nl0KKyAtIEtWTV9NUF9TVEFURV9SVU5OQUJMRTogICAgICAgIHRoZSB2Y3B1IGlzIGN1cnJlbnRseSBydW5uaW5nIFt4ODYsYXJtL2FybTY0XQogIC0gS1ZNX01QX1NUQVRFX1VOSU5JVElBTElaRUQ6ICAgdGhlIHZjcHUgaXMgYW4gYXBwbGljYXRpb24gcHJvY2Vzc29yIChBUCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGhhcyBub3QgeWV0IHJlY2VpdmVkIGFuIElOSVQgc2lnbmFsIFt4ODZdCiAgLSBLVk1fTVBfU1RBVEVfSU5JVF9SRUNFSVZFRDogICB0aGUgdmNwdSBoYXMgcmVjZWl2ZWQgYW4gSU5JVCBzaWduYWwsIGFuZCBpcwpAQCAtMTAyMCw3ICsxMDIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHdhaXRpbmcgZm9yIGFuIGludGVycnVwdCBbeDg2XQogIC0gS1ZNX01QX1NUQVRFX1NJUElfUkVDRUlWRUQ6ICAgdGhlIHZjcHUgaGFzIGp1c3QgcmVjZWl2ZWQgYSBTSVBJICh2ZWN0b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc2libGUgdmlhIEtWTV9HRVRfVkNQVV9FVkVOVFMpIFt4ODZdCi0gLSBLVk1fTVBfU1RBVEVfU1RPUFBFRDogICAgICAgICB0aGUgdmNwdSBpcyBzdG9wcGVkIFtzMzkwXQorIC0gS1ZNX01QX1NUQVRFX1NUT1BQRUQ6ICAgICAgICAgdGhlIHZjcHUgaXMgc3RvcHBlZCBbczM5MCxhcm0vYXJtNjRdCiAgLSBLVk1fTVBfU1RBVEVfQ0hFQ0tfU1RPUDogICAgICB0aGUgdmNwdSBpcyBpbiBhIHNwZWNpYWwgZXJyb3Igc3RhdGUgW3MzOTBdCiAgLSBLVk1fTVBfU1RBVEVfT1BFUkFUSU5HOiAgICAgICB0aGUgdmNwdSBpcyBvcGVyYXRpbmcgKHJ1bm5pbmcgb3IgaGFsdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3MzOTBdCkBAIC0xMDMxLDExICsxMDMxLDE1IEBACiBpbi1rZXJuZWwgaXJxY2hpcCwgdGhlIG11bHRpcHJvY2Vzc2luZyBzdGF0ZSBtdXN0IGJlIG1haW50YWluZWQgYnkgdXNlcnNwYWNlIG9uCiB0aGVzZSBhcmNoaXRlY3R1cmVzLgogCitGb3IgYXJtL2FybTY0OgorCitUaGUgb25seSBzdGF0ZXMgdGhhdCBhcmUgdmFsaWQgYXJlIEtWTV9NUF9TVEFURV9TVE9QUEVEIGFuZAorS1ZNX01QX1NUQVRFX1JVTk5BQkxFIHdoaWNoIHJlZmxlY3QgaWYgdGhlIHZjcHUgaXMgcGF1c2VkIG9yIG5vdC4KIAogNC4zOSBLVk1fU0VUX01QX1NUQVRFCiAKIENhcGFiaWxpdHk6IEtWTV9DQVBfTVBfU1RBVEUKLUFyY2hpdGVjdHVyZXM6IHg4NiwgczM5MAorQXJjaGl0ZWN0dXJlczogeDg2LCBzMzkwLCBhcm0sIGFybTY0CiBUeXBlOiB2Y3B1IGlvY3RsCiBQYXJhbWV0ZXJzOiBzdHJ1Y3Qga3ZtX21wX3N0YXRlIChpbikKIFJldHVybnM6IDAgb24gc3VjY2VzczsgLTEgb24gZXJyb3IKQEAgLTEwNDcsNiArMTA1MSwxMCBAQAogaW4ta2VybmVsIGlycWNoaXAsIHRoZSBtdWx0aXByb2Nlc3Npbmcgc3RhdGUgbXVzdCBiZSBtYWludGFpbmVkIGJ5IHVzZXJzcGFjZSBvbgogdGhlc2UgYXJjaGl0ZWN0dXJlcy4KIAorRm9yIGFybS9hcm02NDoKKworVGhlIG9ubHkgc3RhdGVzIHRoYXQgYXJlIHZhbGlkIGFyZSBLVk1fTVBfU1RBVEVfU1RPUFBFRCBhbmQKK0tWTV9NUF9TVEFURV9SVU5OQUJMRSB3aGljaCByZWZsZWN0IGlmIHRoZSB2Y3B1IHNob3VsZCBiZSBwYXVzZWQgb3Igbm90LgogCiA0LjQwIEtWTV9TRVRfSURFTlRJVFlfTUFQX0FERFIKIApAQCAtMTk2NywxNSArMTk3NSwyNSBAQAogICBNSVBTICB8IEtWTV9SRUdfTUlQU19DUDBfU1RBVFVTICAgICAgIHwgMzIKICAgTUlQUyAgfCBLVk1fUkVHX01JUFNfQ1AwX0NBVVNFICAgICAgICB8IDMyCiAgIE1JUFMgIHwgS1ZNX1JFR19NSVBTX0NQMF9FUEMgICAgICAgICAgfCA2NAorICBNSVBTICB8IEtWTV9SRUdfTUlQU19DUDBfUFJJRCAgICAgICAgIHwgMzIKICAgTUlQUyAgfCBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRyAgICAgICB8IDMyCiAgIE1JUFMgIHwgS1ZNX1JFR19NSVBTX0NQMF9DT05GSUcxICAgICAgfCAzMgogICBNSVBTICB8IEtWTV9SRUdfTUlQU19DUDBfQ09ORklHMiAgICAgIHwgMzIKICAgTUlQUyAgfCBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzMgICAgICB8IDMyCisgIE1JUFMgIHwgS1ZNX1JFR19NSVBTX0NQMF9DT05GSUc0ICAgICAgfCAzMgorICBNSVBTICB8IEtWTV9SRUdfTUlQU19DUDBfQ09ORklHNSAgICAgIHwgMzIKICAgTUlQUyAgfCBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzcgICAgICB8IDMyCiAgIE1JUFMgIHwgS1ZNX1JFR19NSVBTX0NQMF9FUlJPUkVQQyAgICAgfCA2NAogICBNSVBTICB8IEtWTV9SRUdfTUlQU19DT1VOVF9DVEwgICAgICAgIHwgNjQKICAgTUlQUyAgfCBLVk1fUkVHX01JUFNfQ09VTlRfUkVTVU1FICAgICB8IDY0CiAgIE1JUFMgIHwgS1ZNX1JFR19NSVBTX0NPVU5UX0haICAgICAgICAgfCA2NAorICBNSVBTICB8IEtWTV9SRUdfTUlQU19GUFJfMzIoMC4uMzEpICAgIHwgMzIKKyAgTUlQUyAgfCBLVk1fUkVHX01JUFNfRlBSXzY0KDAuLjMxKSAgICB8IDY0CisgIE1JUFMgIHwgS1ZNX1JFR19NSVBTX1ZFQ18xMjgoMC4uMzEpICAgfCAxMjgKKyAgTUlQUyAgfCBLVk1fUkVHX01JUFNfRkNSX0lSICAgICAgICAgICB8IDMyCisgIE1JUFMgIHwgS1ZNX1JFR19NSVBTX0ZDUl9DU1IgICAgICAgICAgfCAzMgorICBNSVBTICB8IEtWTV9SRUdfTUlQU19NU0FfSVIgICAgICAgICAgIHwgMzIKKyAgTUlQUyAgfCBLVk1fUkVHX01JUFNfTVNBX0NTUiAgICAgICAgICB8IDMyCiAKIEFSTSByZWdpc3RlcnMgYXJlIG1hcHBlZCB1c2luZyB0aGUgbG93ZXIgMzIgYml0cy4gIFRoZSB1cHBlciAxNiBvZiB0aGF0CiBpcyB0aGUgcmVnaXN0ZXIgZ3JvdXAgdHlwZSwgb3IgY29wcm9jZXNzb3IgbnVtYmVyOgpAQCAtMjAyOSw2ICsyMDQ3LDI1IEBACiBNSVBTIEtWTSBjb250cm9sIHJlZ2lzdGVycyAoc2VlIGFib3ZlKSBoYXZlIHRoZSBmb2xsb3dpbmcgaWQgYml0IHBhdHRlcm5zOgogICAweDcwMzAgMDAwMCAwMDAyIDxyZWc6MTY+CiAKK01JUFMgRlBVIHJlZ2lzdGVycyAoc2VlIEtWTV9SRUdfTUlQU19GUFJfezMyLDY0fSgpIGFib3ZlKSBoYXZlIHRoZSBmb2xsb3dpbmcKK2lkIGJpdCBwYXR0ZXJucyBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIHJlZ2lzdGVyIGJlaW5nIGFjY2Vzc2VkLiBUaGV5IGFyZQorYWx3YXlzIGFjY2Vzc2VkIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBndWVzdCBGUFUgbW9kZSAoU3RhdHVzLkZSIGFuZAorQ29uZmlnNS5GUkUpLCBpLmUuIGFzIHRoZSBndWVzdCB3b3VsZCBzZWUgdGhlbSwgYW5kIHRoZXkgYmVjb21lIHVucHJlZGljdGFibGUKK2lmIHRoZSBndWVzdCBGUFUgbW9kZSBpcyBjaGFuZ2VkLiBNSVBTIFNJTUQgQXJjaGl0ZWN0dXJlIChNU0EpIHZlY3RvcgorcmVnaXN0ZXJzIChzZWUgS1ZNX1JFR19NSVBTX1ZFQ18xMjgoKSBhYm92ZSkgaGF2ZSBzaW1pbGFyIHBhdHRlcm5zIGFzIHRoZXkKK292ZXJsYXAgdGhlIEZQVSByZWdpc3RlcnM6CisgIDB4NzAyMCAwMDAwIDAwMDMgMDAgPDA6Mz4gPHJlZzo1PiAoMzItYml0IEZQVSByZWdpc3RlcnMpCisgIDB4NzAzMCAwMDAwIDAwMDMgMDAgPDA6Mz4gPHJlZzo1PiAoNjQtYml0IEZQVSByZWdpc3RlcnMpCisgIDB4NzA0MCAwMDAwIDAwMDMgMDAgPDA6Mz4gPHJlZzo1PiAoMTI4LWJpdCBNU0EgdmVjdG9yIHJlZ2lzdGVycykKKworTUlQUyBGUFUgY29udHJvbCByZWdpc3RlcnMgKHNlZSBLVk1fUkVHX01JUFNfRkNSX3tJUixDU1J9IGFib3ZlKSBoYXZlIHRoZQorZm9sbG93aW5nIGlkIGJpdCBwYXR0ZXJuczoKKyAgMHg3MDIwIDAwMDAgMDAwMyAwMSA8MDozPiA8cmVnOjU+CisKK01JUFMgTVNBIGNvbnRyb2wgcmVnaXN0ZXJzIChzZWUgS1ZNX1JFR19NSVBTX01TQV97SVIsQ1NSfSBhYm92ZSkgaGF2ZSB0aGUKK2ZvbGxvd2luZyBpZCBiaXQgcGF0dGVybnM6CisgIDB4NzAyMCAwMDAwIDAwMDMgMDIgPDA6Mz4gPHJlZzo1PgorCiAKIDQuNjkgS1ZNX0dFVF9PTkVfUkVHCiAKQEAgLTIyMzQsNyArMjI3MSw3IEBACiA0Ljc1IEtWTV9JUlFGRAogCiBDYXBhYmlsaXR5OiBLVk1fQ0FQX0lSUUZECi1BcmNoaXRlY3R1cmVzOiB4ODYgczM5MAorQXJjaGl0ZWN0dXJlczogeDg2IHMzOTAgYXJtIGFybTY0CiBUeXBlOiB2bSBpb2N0bAogUGFyYW1ldGVyczogc3RydWN0IGt2bV9pcnFmZCAoaW4pCiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCkBAIC0yMjYwLDYgKzIyOTcsMTAgQEAKIGlycWZkLiAgVGhlIEtWTV9JUlFGRF9GTEFHX1JFU0FNUExFIGlzIG9ubHkgbmVjZXNzYXJ5IG9uIGFzc2lnbm1lbnQKIGFuZCBuZWVkIG5vdCBiZSBzcGVjaWZpZWQgd2l0aCBLVk1fSVJRRkRfRkxBR19ERUFTU0lHTi4KIAorT24gQVJNL0FSTTY0LCB0aGUgZ3NpIGZpZWxkIGluIHRoZSBrdm1faXJxZmQgc3RydWN0IHNwZWNpZmllcyB0aGUgU2hhcmVkCitQZXJpcGhlcmFsIEludGVycnVwdCAoU1BJKSBpbmRleCwgc3VjaCB0aGF0IHRoZSBHSUMgaW50ZXJydXB0IElEIGlzCitnaXZlbiBieSBnc2kgKyAzMi4KKwogNC43NiBLVk1fUFBDX0FMTE9DQVRFX0hUQUIKIAogQ2FwYWJpbGl0eTogS1ZNX0NBUF9QUENfQUxMT0NfSFRBQgpAQCAtMjcxNiw2ICsyNzU3LDIyNyBAQAogICAgZWF4LCBlYngsIGVjeCwgZWR4OiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmb3IKICAgICAgICAgIHRoaXMgZnVuY3Rpb24vaW5kZXggY29tYmluYXRpb24KIAorNC44OSBLVk1fUzM5MF9NRU1fT1AKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9TMzkwX01FTV9PUAorQXJjaGl0ZWN0dXJlczogczM5MAorVHlwZTogdmNwdSBpb2N0bAorUGFyYW1ldGVyczogc3RydWN0IGt2bV9zMzkwX21lbV9vcCAoaW4pCitSZXR1cm5zOiA9IDAgb24gc3VjY2VzcywKKyAgICAgICAgIDwgMCBvbiBnZW5lcmljIGVycm9yIChlLmcuIC1FRkFVTFQgb3IgLUVOT01FTSksCisgICAgICAgICA+IDAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIHdhbGtpbmcgdGhlIHBhZ2UgdGFibGVzCisKK1JlYWQgb3Igd3JpdGUgZGF0YSBmcm9tL3RvIHRoZSBsb2dpY2FsICh2aXJ0dWFsKSBtZW1vcnkgb2YgYSBWUENVLgorCitQYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgdmlhIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCitzdHJ1Y3Qga3ZtX3MzOTBfbWVtX29wIHsKKwlfX3U2NCBnYWRkcjsJCS8qIHRoZSBndWVzdCBhZGRyZXNzICovCisJX191NjQgZmxhZ3M7CQkvKiBmbGFncyAqLworCV9fdTMyIHNpemU7CQkvKiBhbW91bnQgb2YgYnl0ZXMgKi8KKwlfX3UzMiBvcDsJCS8qIHR5cGUgb2Ygb3BlcmF0aW9uICovCisJX191NjQgYnVmOwkJLyogYnVmZmVyIGluIHVzZXJzcGFjZSAqLworCV9fdTggYXI7CQkvKiB0aGUgYWNjZXNzIHJlZ2lzdGVyIG51bWJlciAqLworCV9fdTggcmVzZXJ2ZWRbMzFdOwkvKiBzaG91bGQgYmUgc2V0IHRvIDAgKi8KK307CisKK1RoZSB0eXBlIG9mIG9wZXJhdGlvbiBpcyBzcGVjaWZpZWQgaW4gdGhlICJvcCIgZmllbGQuIEl0IGlzIGVpdGhlcgorS1ZNX1MzOTBfTUVNT1BfTE9HSUNBTF9SRUFEIGZvciByZWFkaW5nIGZyb20gbG9naWNhbCBtZW1vcnkgc3BhY2Ugb3IKK0tWTV9TMzkwX01FTU9QX0xPR0lDQUxfV1JJVEUgZm9yIHdyaXRpbmcgdG8gbG9naWNhbCBtZW1vcnkgc3BhY2UuIFRoZQorS1ZNX1MzOTBfTUVNT1BfRl9DSEVDS19PTkxZIGZsYWcgY2FuIGJlIHNldCBpbiB0aGUgImZsYWdzIiBmaWVsZCB0byBjaGVjaword2hldGhlciB0aGUgY29ycmVzcG9uZGluZyBtZW1vcnkgYWNjZXNzIHdvdWxkIGNyZWF0ZSBhbiBhY2Nlc3MgZXhjZXB0aW9uCisod2l0aG91dCB0b3VjaGluZyB0aGUgZGF0YSBpbiB0aGUgbWVtb3J5IGF0IHRoZSBkZXN0aW5hdGlvbikuIEluIGNhc2UgYW4KK2FjY2VzcyBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgd2Fsa2luZyB0aGUgTU1VIHRhYmxlcyBvZiB0aGUgZ3Vlc3QsIHRoZQoraW9jdGwgcmV0dXJucyBhIHBvc2l0aXZlIGVycm9yIG51bWJlciB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBleGNlcHRpb24uCitUaGlzIGV4Y2VwdGlvbiBpcyBhbHNvIHJhaXNlZCBkaXJlY3RseSBhdCB0aGUgY29ycmVzcG9uZGluZyBWQ1BVIGlmIHRoZQorZmxhZyBLVk1fUzM5MF9NRU1PUF9GX0lOSkVDVF9FWENFUFRJT04gaXMgc2V0IGluIHRoZSAiZmxhZ3MiIGZpZWxkLgorCitUaGUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IHJlZ2lvbiBoYXMgdG8gYmUgc3BlY2lmaWVkIGluIHRoZSAiZ2FkZHIiCitmaWVsZCwgYW5kIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbiBpbiB0aGUgInNpemUiIGZpZWxkLiAiYnVmIiBpcyB0aGUgYnVmZmVyCitzdXBwbGllZCBieSB0aGUgdXNlcnNwYWNlIGFwcGxpY2F0aW9uIHdoZXJlIHRoZSByZWFkIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4KK3RvIGZvciBLVk1fUzM5MF9NRU1PUF9MT0dJQ0FMX1JFQUQsIG9yIHdoZXJlIHRoZSBkYXRhIHRoYXQgc2hvdWxkIGJlIHdyaXR0ZW4KK2lzIHN0b3JlZCBmb3IgYSBLVk1fUzM5MF9NRU1PUF9MT0dJQ0FMX1dSSVRFLiAiYnVmIiBpcyB1bnVzZWQgYW5kIGNhbiBiZSBOVUxMCit3aGVuIEtWTV9TMzkwX01FTU9QX0ZfQ0hFQ0tfT05MWSBpcyBzcGVjaWZpZWQuICJhciIgZGVzaWduYXRlcyB0aGUgYWNjZXNzCityZWdpc3RlciBudW1iZXIgdG8gYmUgdXNlZC4KKworVGhlICJyZXNlcnZlZCIgZmllbGQgaXMgbWVhbnQgZm9yIGZ1dHVyZSBleHRlbnNpb25zLiBJdCBpcyBub3QgdXNlZCBieQorS1ZNIHdpdGggdGhlIGN1cnJlbnRseSBkZWZpbmVkIHNldCBvZiBmbGFncy4KKworNC45MCBLVk1fUzM5MF9HRVRfU0tFWVMKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9TMzkwX1NLRVlTCitBcmNoaXRlY3R1cmVzOiBzMzkwCitUeXBlOiB2bSBpb2N0bAorUGFyYW1ldGVyczogc3RydWN0IGt2bV9zMzkwX3NrZXlzCitSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIEtWTV9TMzkwX0dFVF9LRVlTX05PTkUgaWYgZ3Vlc3QgaXMgbm90IHVzaW5nIHN0b3JhZ2UKKyAgICAgICAgIGtleXMsIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yCisKK1RoaXMgaW9jdGwgaXMgdXNlZCB0byBnZXQgZ3Vlc3Qgc3RvcmFnZSBrZXkgdmFsdWVzIG9uIHRoZSBzMzkwCithcmNoaXRlY3R1cmUuIFRoZSBpb2N0bCB0YWtlcyBwYXJhbWV0ZXJzIHZpYSB0aGUga3ZtX3MzOTBfc2tleXMgc3RydWN0LgorCitzdHJ1Y3Qga3ZtX3MzOTBfc2tleXMgeworCV9fdTY0IHN0YXJ0X2dmbjsKKwlfX3U2NCBjb3VudDsKKwlfX3U2NCBza2V5ZGF0YV9hZGRyOworCV9fdTMyIGZsYWdzOworCV9fdTMyIHJlc2VydmVkWzldOworfTsKKworVGhlIHN0YXJ0X2dmbiBmaWVsZCBpcyB0aGUgbnVtYmVyIG9mIHRoZSBmaXJzdCBndWVzdCBmcmFtZSB3aG9zZSBzdG9yYWdlIGtleXMKK3lvdSB3YW50IHRvIGdldC4KKworVGhlIGNvdW50IGZpZWxkIGlzIHRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgZnJhbWVzIChzdGFydGluZyBmcm9tIHN0YXJ0X2dmbikKK3dob3NlIHN0b3JhZ2Uga2V5cyB0byBnZXQuIFRoZSBjb3VudCBmaWVsZCBtdXN0IGJlIGF0IGxlYXN0IDEgYW5kIHRoZSBtYXhpbXVtCithbGxvd2VkIHZhbHVlIGlzIGRlZmluZWQgYXMgS1ZNX1MzOTBfU0tFWVNfQUxMT0NfTUFYLiBWYWx1ZXMgb3V0c2lkZSB0aGlzIHJhbmdlCit3aWxsIGNhdXNlIHRoZSBpb2N0bCB0byByZXR1cm4gLUVJTlZBTC4KKworVGhlIHNrZXlkYXRhX2FkZHIgZmllbGQgaXMgdGhlIGFkZHJlc3MgdG8gYSBidWZmZXIgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgY291bnQKK2J5dGVzLiBUaGlzIGJ1ZmZlciB3aWxsIGJlIGZpbGxlZCB3aXRoIHN0b3JhZ2Uga2V5IGRhdGEgYnkgdGhlIGlvY3RsLgorCis0LjkxIEtWTV9TMzkwX1NFVF9TS0VZUworCitDYXBhYmlsaXR5OiBLVk1fQ0FQX1MzOTBfU0tFWVMKK0FyY2hpdGVjdHVyZXM6IHMzOTAKK1R5cGU6IHZtIGlvY3RsCitQYXJhbWV0ZXJzOiBzdHJ1Y3Qga3ZtX3MzOTBfc2tleXMKK1JldHVybnM6IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IKKworVGhpcyBpb2N0bCBpcyB1c2VkIHRvIHNldCBndWVzdCBzdG9yYWdlIGtleSB2YWx1ZXMgb24gdGhlIHMzOTAKK2FyY2hpdGVjdHVyZS4gVGhlIGlvY3RsIHRha2VzIHBhcmFtZXRlcnMgdmlhIHRoZSBrdm1fczM5MF9za2V5cyBzdHJ1Y3QuCitTZWUgc2VjdGlvbiBvbiBLVk1fUzM5MF9HRVRfU0tFWVMgZm9yIHN0cnVjdCBkZWZpbml0aW9uLgorCitUaGUgc3RhcnRfZ2ZuIGZpZWxkIGlzIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IGd1ZXN0IGZyYW1lIHdob3NlIHN0b3JhZ2Uga2V5cworeW91IHdhbnQgdG8gc2V0LgorCitUaGUgY291bnQgZmllbGQgaXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBmcmFtZXMgKHN0YXJ0aW5nIGZyb20gc3RhcnRfZ2ZuKQord2hvc2Ugc3RvcmFnZSBrZXlzIHRvIGdldC4gVGhlIGNvdW50IGZpZWxkIG11c3QgYmUgYXQgbGVhc3QgMSBhbmQgdGhlIG1heGltdW0KK2FsbG93ZWQgdmFsdWUgaXMgZGVmaW5lZCBhcyBLVk1fUzM5MF9TS0VZU19BTExPQ19NQVguIFZhbHVlcyBvdXRzaWRlIHRoaXMgcmFuZ2UKK3dpbGwgY2F1c2UgdGhlIGlvY3RsIHRvIHJldHVybiAtRUlOVkFMLgorCitUaGUgc2tleWRhdGFfYWRkciBmaWVsZCBpcyB0aGUgYWRkcmVzcyB0byBhIGJ1ZmZlciBjb250YWluaW5nIGNvdW50IGJ5dGVzIG9mCitzdG9yYWdlIGtleXMuIEVhY2ggYnl0ZSBpbiB0aGUgYnVmZmVyIHdpbGwgYmUgc2V0IGFzIHRoZSBzdG9yYWdlIGtleSBmb3IgYQorc2luZ2xlIGZyYW1lIHN0YXJ0aW5nIGF0IHN0YXJ0X2dmbiBmb3IgY291bnQgZnJhbWVzLgorCitOb3RlOiBJZiBhbnkgYXJjaGl0ZWN0dXJhbGx5IGludmFsaWQga2V5IHZhbHVlIGlzIGZvdW5kIGluIHRoZSBnaXZlbiBkYXRhIHRoZW4KK3RoZSBpb2N0bCB3aWxsIHJldHVybiAtRUlOVkFMLgorCis0LjkyIEtWTV9TMzkwX0lSUQorCitDYXBhYmlsaXR5OiBLVk1fQ0FQX1MzOTBfSU5KRUNUX0lSUQorQXJjaGl0ZWN0dXJlczogczM5MAorVHlwZTogdmNwdSBpb2N0bAorUGFyYW1ldGVyczogc3RydWN0IGt2bV9zMzkwX2lycSAoaW4pCitSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCitFcnJvcnM6CisgIEVJTlZBTDogaW50ZXJydXB0IHR5cGUgaXMgaW52YWxpZAorICAgICAgICAgIHR5cGUgaXMgS1ZNX1MzOTBfU0lHUF9TVE9QIGFuZCBmbGFnIHBhcmFtZXRlciBpcyBpbnZhbGlkIHZhbHVlCisgICAgICAgICAgdHlwZSBpcyBLVk1fUzM5MF9JTlRfRVhURVJOQUxfQ0FMTCBhbmQgY29kZSBpcyBiaWdnZXIKKyAgICAgICAgICAgIHRoYW4gdGhlIG1heGltdW0gb2YgVkNQVXMKKyAgRUJVU1k6ICB0eXBlIGlzIEtWTV9TMzkwX1NJR1BfU0VUX1BSRUZJWCBhbmQgdmNwdSBpcyBub3Qgc3RvcHBlZAorICAgICAgICAgIHR5cGUgaXMgS1ZNX1MzOTBfU0lHUF9TVE9QIGFuZCBhIHN0b3AgaXJxIGlzIGFscmVhZHkgcGVuZGluZworICAgICAgICAgIHR5cGUgaXMgS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEwgYW5kIGFuIGV4dGVybmFsIGNhbGwgaW50ZXJydXB0CisgICAgICAgICAgICBpcyBhbHJlYWR5IHBlbmRpbmcKKworQWxsb3dzIHRvIGluamVjdCBhbiBpbnRlcnJ1cHQgdG8gdGhlIGd1ZXN0LgorCitVc2luZyBzdHJ1Y3Qga3ZtX3MzOTBfaXJxIGFzIGEgcGFyYW1ldGVyIGFsbG93cwordG8gaW5qZWN0IGFkZGl0aW9uYWwgcGF5bG9hZCB3aGljaCBpcyBub3QKK3Bvc3NpYmxlIHZpYSBLVk1fUzM5MF9JTlRFUlJVUFQuCisKK0ludGVycnVwdCBwYXJhbWV0ZXJzIGFyZSBwYXNzZWQgdmlhIGt2bV9zMzkwX2lycToKKworc3RydWN0IGt2bV9zMzkwX2lycSB7CisJX191NjQgdHlwZTsKKwl1bmlvbiB7CisJCXN0cnVjdCBrdm1fczM5MF9pb19pbmZvIGlvOworCQlzdHJ1Y3Qga3ZtX3MzOTBfZXh0X2luZm8gZXh0OworCQlzdHJ1Y3Qga3ZtX3MzOTBfcGdtX2luZm8gcGdtOworCQlzdHJ1Y3Qga3ZtX3MzOTBfZW1lcmdfaW5mbyBlbWVyZzsKKwkJc3RydWN0IGt2bV9zMzkwX2V4dGNhbGxfaW5mbyBleHRjYWxsOworCQlzdHJ1Y3Qga3ZtX3MzOTBfcHJlZml4X2luZm8gcHJlZml4OworCQlzdHJ1Y3Qga3ZtX3MzOTBfc3RvcF9pbmZvIHN0b3A7CisJCXN0cnVjdCBrdm1fczM5MF9tY2hrX2luZm8gbWNoazsKKwkJY2hhciByZXNlcnZlZFs2NF07CisJfSB1OworfTsKKwordHlwZSBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKK0tWTV9TMzkwX1NJR1BfU1RPUCAtIHNpZ3Agc3RvcDsgcGFyYW1ldGVyIGluIC5zdG9wCitLVk1fUzM5MF9QUk9HUkFNX0lOVCAtIHByb2dyYW0gY2hlY2s7IHBhcmFtZXRlcnMgaW4gLnBnbQorS1ZNX1MzOTBfU0lHUF9TRVRfUFJFRklYIC0gc2lncCBzZXQgcHJlZml4OyBwYXJhbWV0ZXJzIGluIC5wcmVmaXgKK0tWTV9TMzkwX1JFU1RBUlQgLSByZXN0YXJ0OyBubyBwYXJhbWV0ZXJzCitLVk1fUzM5MF9JTlRfQ0xPQ0tfQ09NUCAtIGNsb2NrIGNvbXBhcmF0b3IgaW50ZXJydXB0OyBubyBwYXJhbWV0ZXJzCitLVk1fUzM5MF9JTlRfQ1BVX1RJTUVSIC0gQ1BVIHRpbWVyIGludGVycnVwdDsgbm8gcGFyYW1ldGVycworS1ZNX1MzOTBfSU5UX0VNRVJHRU5DWSAtIHNpZ3AgZW1lcmdlbmN5OyBwYXJhbWV0ZXJzIGluIC5lbWVyZworS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEwgLSBzaWdwIGV4dGVybmFsIGNhbGw7IHBhcmFtZXRlcnMgaW4gLmV4dGNhbGwKK0tWTV9TMzkwX01DSEsgLSBtYWNoaW5lIGNoZWNrIGludGVycnVwdDsgcGFyYW1ldGVycyBpbiAubWNoaworCisKK05vdGUgdGhhdCB0aGUgdmNwdSBpb2N0bCBpcyBhc3luY2hyb25vdXMgdG8gdmNwdSBleGVjdXRpb24uCisKKzQuOTQgS1ZNX1MzOTBfR0VUX0lSUV9TVEFURQorCitDYXBhYmlsaXR5OiBLVk1fQ0FQX1MzOTBfSVJRX1NUQVRFCitBcmNoaXRlY3R1cmVzOiBzMzkwCitUeXBlOiB2Y3B1IGlvY3RsCitQYXJhbWV0ZXJzOiBzdHJ1Y3Qga3ZtX3MzOTBfaXJxX3N0YXRlIChvdXQpCitSZXR1cm5zOiA+PSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGludG8gYnVmZmVyLAorICAgICAgICAgLUVJTlZBTCBpZiBidWZmZXIgc2l6ZSBpcyAwLAorICAgICAgICAgLUVOT0JVRlMgaWYgYnVmZmVyIHNpemUgaXMgdG9vIHNtYWxsIHRvIGZpdCBhbGwgcGVuZGluZyBpbnRlcnJ1cHRzLAorICAgICAgICAgLUVGQVVMVCBpZiB0aGUgYnVmZmVyIGFkZHJlc3Mgd2FzIGludmFsaWQKKworVGhpcyBpb2N0bCBhbGxvd3MgdXNlcnNwYWNlIHRvIHJldHJpZXZlIHRoZSBjb21wbGV0ZSBzdGF0ZSBvZiBhbGwgY3VycmVudGx5CitwZW5kaW5nIGludGVycnVwdHMgaW4gYSBzaW5nbGUgYnVmZmVyLiBVc2UgY2FzZXMgaW5jbHVkZSBtaWdyYXRpb24KK2FuZCBpbnRyb3NwZWN0aW9uLiBUaGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBjb250YWlucyB0aGUgYWRkcmVzcyBvZiBhCit1c2Vyc3BhY2UgYnVmZmVyIGFuZCBpdHMgbGVuZ3RoOgorCitzdHJ1Y3Qga3ZtX3MzOTBfaXJxX3N0YXRlIHsKKwlfX3U2NCBidWY7CisJX191MzIgZmxhZ3M7CisJX191MzIgbGVuOworCV9fdTMyIHJlc2VydmVkWzRdOworfTsKKworVXNlcnNwYWNlIHBhc3NlcyBpbiB0aGUgYWJvdmUgc3RydWN0IGFuZCBmb3IgZWFjaCBwZW5kaW5nIGludGVycnVwdCBhCitzdHJ1Y3Qga3ZtX3MzOTBfaXJxIGlzIGNvcGllZCB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLgorCitJZiAtRU5PQlVGUyBpcyByZXR1cm5lZCB0aGUgYnVmZmVyIHByb3ZpZGVkIHdhcyB0b28gc21hbGwgYW5kIHVzZXJzcGFjZQorbWF5IHJldHJ5IHdpdGggYSBiaWdnZXIgYnVmZmVyLgorCis0Ljk1IEtWTV9TMzkwX1NFVF9JUlFfU1RBVEUKKworQ2FwYWJpbGl0eTogS1ZNX0NBUF9TMzkwX0lSUV9TVEFURQorQXJjaGl0ZWN0dXJlczogczM5MAorVHlwZTogdmNwdSBpb2N0bAorUGFyYW1ldGVyczogc3RydWN0IGt2bV9zMzkwX2lycV9zdGF0ZSAoaW4pCitSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MsCisgICAgICAgICAtRUZBVUxUIGlmIHRoZSBidWZmZXIgYWRkcmVzcyB3YXMgaW52YWxpZCwKKyAgICAgICAgIC1FSU5WQUwgZm9yIGFuIGludmFsaWQgYnVmZmVyIGxlbmd0aCAoc2VlIGJlbG93KSwKKyAgICAgICAgIC1FQlVTWSBpZiB0aGVyZSB3ZXJlIGFscmVhZHkgaW50ZXJydXB0cyBwZW5kaW5nLAorICAgICAgICAgZXJyb3JzIG9jY3VycmluZyB3aGVuIGFjdHVhbGx5IGluamVjdGluZyB0aGUKKyAgICAgICAgICBpbnRlcnJ1cHQuIFNlZSBLVk1fUzM5MF9JUlEuCisKK1RoaXMgaW9jdGwgYWxsb3dzIHVzZXJzcGFjZSB0byBzZXQgdGhlIGNvbXBsZXRlIHN0YXRlIG9mIGFsbCBjcHUtbG9jYWwKK2ludGVycnVwdHMgY3VycmVudGx5IHBlbmRpbmcgZm9yIHRoZSB2Y3B1LiBJdCBpcyBpbnRlbmRlZCBmb3IgcmVzdG9yaW5nCitpbnRlcnJ1cHQgc3RhdGUgYWZ0ZXIgYSBtaWdyYXRpb24uIFRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgYSB1c2Vyc3BhY2UgYnVmZmVyCitjb250YWluaW5nIGEgc3RydWN0IGt2bV9zMzkwX2lycV9zdGF0ZToKKworc3RydWN0IGt2bV9zMzkwX2lycV9zdGF0ZSB7CisJX191NjQgYnVmOworCV9fdTMyIGxlbjsKKwlfX3UzMiBwYWQ7Cit9OworCitUaGUgdXNlcnNwYWNlIG1lbW9yeSByZWZlcmVuY2VkIGJ5IGJ1ZiBjb250YWlucyBhIHN0cnVjdCBrdm1fczM5MF9pcnEKK2ZvciBlYWNoIGludGVycnVwdCB0byBiZSBpbmplY3RlZCBpbnRvIHRoZSBndWVzdC4KK0lmIG9uZSBvZiB0aGUgaW50ZXJydXB0cyBjb3VsZCBub3QgYmUgaW5qZWN0ZWQgZm9yIHNvbWUgcmVhc29uIHRoZQoraW9jdGwgYWJvcnRzLgorCitsZW4gbXVzdCBiZSBhIG11bHRpcGxlIG9mIHNpemVvZihzdHJ1Y3Qga3ZtX3MzOTBfaXJxKS4gSXQgbXVzdCBiZSA+IDAKK2FuZCBpdCBtdXN0IG5vdCBleGNlZWQgKG1heF92Y3B1cyArIDMyKSAqIHNpemVvZihzdHJ1Y3Qga3ZtX3MzOTBfaXJxKSwKK3doaWNoIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJseSBwZW5kaW5nIGNwdS1sb2NhbCBpbnRlcnJ1cHRzLgorCiA1LiBUaGUga3ZtX3J1biBzdHJ1Y3R1cmUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMTg5LDYgKzM0NTEsMzEgQEAKIFRoaXMgY2FwYWJpbGl0eSBlbmFibGVzIHRoZSBpbi1rZXJuZWwgaXJxY2hpcCBmb3IgczM5MC4gUGxlYXNlIHJlZmVyIHRvCiAiNC4yNCBLVk1fQ1JFQVRFX0lSUUNISVAiIGZvciBkZXRhaWxzLgogCis2LjkgS1ZNX0NBUF9NSVBTX0ZQVQorCitBcmNoaXRlY3R1cmVzOiBtaXBzCitUYXJnZXQ6IHZjcHUKK1BhcmFtZXRlcnM6IGFyZ3NbMF0gaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKHNob3VsZCBiZSAwKS4KKworVGhpcyBjYXBhYmlsaXR5IGFsbG93cyB0aGUgdXNlIG9mIHRoZSBob3N0IEZsb2F0aW5nIFBvaW50IFVuaXQgYnkgdGhlIGd1ZXN0LiBJdAorYWxsb3dzIHRoZSBDb25maWcxLkZQIGJpdCB0byBiZSBzZXQgdG8gZW5hYmxlIHRoZSBGUFUgaW4gdGhlIGd1ZXN0LiBPbmNlIHRoaXMgaXMKK2RvbmUgdGhlIEtWTV9SRUdfTUlQU19GUFJfKiBhbmQgS1ZNX1JFR19NSVBTX0ZDUl8qIHJlZ2lzdGVycyBjYW4gYmUgYWNjZXNzZWQKKyhkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgZ3Vlc3QgRlBVIHJlZ2lzdGVyIG1vZGUpLCBhbmQgdGhlIFN0YXR1cy5GUiwKK0NvbmZpZzUuRlJFIGJpdHMgYXJlIGFjY2Vzc2libGUgdmlhIHRoZSBLVk0gQVBJIGFuZCBhbHNvIGZyb20gdGhlIGd1ZXN0LAorZGVwZW5kaW5nIG9uIHRoZW0gYmVpbmcgc3VwcG9ydGVkIGJ5IHRoZSBGUFUuCisKKzYuMTAgS1ZNX0NBUF9NSVBTX01TQQorCitBcmNoaXRlY3R1cmVzOiBtaXBzCitUYXJnZXQ6IHZjcHUKK1BhcmFtZXRlcnM6IGFyZ3NbMF0gaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKHNob3VsZCBiZSAwKS4KKworVGhpcyBjYXBhYmlsaXR5IGFsbG93cyB0aGUgdXNlIG9mIHRoZSBNSVBTIFNJTUQgQXJjaGl0ZWN0dXJlIChNU0EpIGJ5IHRoZSBndWVzdC4KK0l0IGFsbG93cyB0aGUgQ29uZmlnMy5NU0FQIGJpdCB0byBiZSBzZXQgdG8gZW5hYmxlIHRoZSB1c2Ugb2YgTVNBIGJ5IHRoZSBndWVzdC4KK09uY2UgdGhpcyBpcyBkb25lIHRoZSBLVk1fUkVHX01JUFNfVkVDXyogYW5kIEtWTV9SRUdfTUlQU19NU0FfKiByZWdpc3RlcnMgY2FuIGJlCithY2Nlc3NlZCwgYW5kIHRoZSBDb25maWc1Lk1TQUVuIGJpdCBpcyBhY2Nlc3NpYmxlIHZpYSB0aGUgS1ZNIEFQSSBhbmQgYWxzbyBmcm9tCit0aGUgZ3Vlc3QuCisKIDcuIENhcGFiaWxpdGllcyB0aGF0IGNhbiBiZSBlbmFibGVkIG9uIFZNcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTMyNDgsMyArMzUzNSw0MSBAQAogT25seSBwcml2aWxlZ2VkIG9wZXJhdGlvbiBleGNlcHRpb25zIHdpbGwgYmUgY2hlY2tlZCBmb3IgaW4gdGhlIGtlcm5lbCAob3IgZXZlbgogaW4gdGhlIGhhcmR3YXJlIHByaW9yIHRvIGludGVyY2VwdGlvbikuIElmIHRoaXMgY2FwYWJpbGl0eSBpcyBub3QgZW5hYmxlZCwgdGhlCiBvbGQgd2F5IG9mIGhhbmRsaW5nIFNJR1Agb3JkZXJzIGlzIHVzZWQgKHBhcnRpYWxseSBpbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UpLgorCis3LjMgS1ZNX0NBUF9TMzkwX1ZFQ1RPUl9SRUdJU1RFUlMKKworQXJjaGl0ZWN0dXJlczogczM5MAorUGFyYW1ldGVyczogbm9uZQorUmV0dXJuczogMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvcgorCitBbGxvd3MgdXNlIG9mIHRoZSB2ZWN0b3IgcmVnaXN0ZXJzIGludHJvZHVjZWQgd2l0aCB6MTMgcHJvY2Vzc29yLCBhbmQKK3Byb3ZpZGVzIGZvciB0aGUgc3luY2hyb25pemF0aW9uIGJldHdlZW4gaG9zdCBhbmQgdXNlciBzcGFjZS4gIFdpbGwKK3JldHVybiAtRUlOVkFMIGlmIHRoZSBtYWNoaW5lIGRvZXMgbm90IHN1cHBvcnQgdmVjdG9ycy4KKworNy40IEtWTV9DQVBfUzM5MF9VU0VSX1NUU0kKKworQXJjaGl0ZWN0dXJlczogczM5MAorUGFyYW1ldGVyczogbm9uZQorCitUaGlzIGNhcGFiaWxpdHkgYWxsb3dzIHBvc3QtaGFuZGxlcnMgZm9yIHRoZSBTVFNJIGluc3RydWN0aW9uLiBBZnRlcgoraW5pdGlhbCBoYW5kbGluZyBpbiB0aGUga2VybmVsLCBLVk0gZXhpdHMgdG8gdXNlciBzcGFjZSB3aXRoCitLVk1fRVhJVF9TMzkwX1NUU0kgdG8gYWxsb3cgdXNlciBzcGFjZSB0byBpbnNlcnQgZnVydGhlciBkYXRhLgorCitCZWZvcmUgZXhpdGluZyB0byB1c2Vyc3BhY2UsIGt2bSBoYW5kbGVycyBzaG91bGQgZmlsbCBpbiBzMzkwX3N0c2kgZmllbGQgb2YKK3ZjcHUtPnJ1bjoKK3N0cnVjdCB7CisJX191NjQgYWRkcjsKKwlfX3U4IGFyOworCV9fdTggcmVzZXJ2ZWQ7CisJX191OCBmYzsKKwlfX3U4IHNlbDE7CisJX191MTYgc2VsMjsKK30gczM5MF9zdHNpOworCitAYWRkciAtIGd1ZXN0IGFkZHJlc3Mgb2YgU1RTSSBTWVNJQgorQGZjICAgLSBmdW5jdGlvbiBjb2RlCitAc2VsMSAtIHNlbGVjdG9yIDEKK0BzZWwyIC0gc2VsZWN0b3IgMgorQGFyICAgLSBhY2Nlc3MgcmVnaXN0ZXIgbnVtYmVyCisKK0tWTSBoYW5kbGVycyBzaG91bGQgZXhpdCB0byB1c2Vyc3BhY2Ugd2l0aCByYyA9IC1FUkVNT1RFLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9kZXZpY2VzL3MzOTBfZmxpYy50eHQgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2RldmljZXMvczM5MF9mbGljLnR4dAppbmRleCA0Y2VlZjUzLi5kMWFkOWQ1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2RldmljZXMvczM5MF9mbGljLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2RldmljZXMvczM5MF9mbGljLnR4dApAQCAtMjcsNiArMjcsOSBAQAogICAgIENvcGllcyBhbGwgZmxvYXRpbmcgaW50ZXJydXB0cyBpbnRvIGEgYnVmZmVyIHByb3ZpZGVkIGJ5IHVzZXJzcGFjZS4KICAgICBXaGVuIHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsIGl0IHJldHVybnMgLUVOT01FTSwgd2hpY2ggaXMgdGhlIGluZGljYXRpb24KICAgICBmb3IgdXNlcnNwYWNlIHRvIHRyeSBhZ2FpbiB3aXRoIGEgYmlnZ2VyIGJ1ZmZlci4KKyAgICAtRU5PQlVGUyBpcyByZXR1cm5lZCB3aGVuIHRoZSBhbGxvY2F0aW9uIG9mIGEga2VybmVsc3BhY2UgYnVmZmVyIGhhcworICAgIGZhaWxlZC4KKyAgICAtRUZBVUxUIGlzIHJldHVybmVkIHdoZW4gY29weWluZyBkYXRhIHRvIHVzZXJzcGFjZSBmYWlsZWQuCiAgICAgQWxsIGludGVycnVwdHMgcmVtYWluIHBlbmRpbmcsIGkuZS4gYXJlIG5vdCBkZWxldGVkIGZyb20gdGhlIGxpc3Qgb2YKICAgICBjdXJyZW50bHkgcGVuZGluZyBpbnRlcnJ1cHRzLgogICAgIGF0dHItPmFkZHIgY29udGFpbnMgdGhlIHVzZXJzcGFjZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgaW50byB3aGljaCBhbGwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdm0vY2xlYW5jYWNoZS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL2NsZWFuY2FjaGUudHh0CmluZGV4IDAxZDc2MjguLmU0YjQ5ZGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0vY2xlYW5jYWNoZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92bS9jbGVhbmNhY2hlLnR4dApAQCAtMjgsOSArMjgsNyBAQAogQSBjbGVhbmNhY2hlICJiYWNrZW5kIiB0aGF0IHByb3ZpZGVzIHRyYW5zY2VuZGVudCBtZW1vcnkgcmVnaXN0ZXJzIGl0c2VsZgogdG8gdGhlIGtlcm5lbCdzIGNsZWFuY2FjaGUgImZyb250ZW5kIiBieSBjYWxsaW5nIGNsZWFuY2FjaGVfcmVnaXN0ZXJfb3BzLAogcGFzc2luZyBhIHBvaW50ZXIgdG8gYSBjbGVhbmNhY2hlX29wcyBzdHJ1Y3R1cmUgd2l0aCBmdW5jcyBzZXQgYXBwcm9wcmlhdGVseS4KLU5vdGUgdGhhdCBjbGVhbmNhY2hlX3JlZ2lzdGVyX29wcyByZXR1cm5zIHRoZSBwcmV2aW91cyBzZXR0aW5ncyBzbyB0aGF0Ci1jaGFpbmluZyBjYW4gYmUgcGVyZm9ybWVkIGlmIGRlc2lyZWQuIFRoZSBmdW5jdGlvbnMgcHJvdmlkZWQgbXVzdCBjb25mb3JtIHRvCi1jZXJ0YWluIHNlbWFudGljcyBhcyBmb2xsb3dzOgorVGhlIGZ1bmN0aW9ucyBwcm92aWRlZCBtdXN0IGNvbmZvcm0gdG8gY2VydGFpbiBzZW1hbnRpY3MgYXMgZm9sbG93czoKIAogTW9zdCBpbXBvcnRhbnQsIGNsZWFuY2FjaGUgaXMgImVwaGVtZXJhbCIuICBQYWdlcyB3aGljaCBhcmUgY29waWVkIGludG8KIGNsZWFuY2FjaGUgaGF2ZSBhbiBpbmRlZmluaXRlIGxpZmV0aW1lIHdoaWNoIGlzIGNvbXBsZXRlbHkgdW5rbm93YWJsZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS9odWdldGxicGFnZS50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dAppbmRleCBmMmQzYTEwLi4wMzA5NzdmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2h1Z2V0bGJwYWdlLnR4dApAQCAtMjY3LDIxICsyNjcsMzQgQEAKIHR5cGUgaHVnZXRsYmZzOgogCiAgIG1vdW50IC10IGh1Z2V0bGJmcyBcCi0JLW8gdWlkPTx2YWx1ZT4sZ2lkPTx2YWx1ZT4sbW9kZT08dmFsdWU+LHNpemU9PHZhbHVlPixucl9pbm9kZXM9PHZhbHVlPiBcCi0Jbm9uZSAvbW50L2h1Z2UKKwktbyB1aWQ9PHZhbHVlPixnaWQ9PHZhbHVlPixtb2RlPTx2YWx1ZT4scGFnZXNpemU9PHZhbHVlPixzaXplPTx2YWx1ZT4sXAorCW1pbl9zaXplPTx2YWx1ZT4sbnJfaW5vZGVzPTx2YWx1ZT4gbm9uZSAvbW50L2h1Z2UKIAogVGhpcyBjb21tYW5kIG1vdW50cyBhIChwc2V1ZG8pIGZpbGVzeXN0ZW0gb2YgdHlwZSBodWdldGxiZnMgb24gdGhlIGRpcmVjdG9yeQogL21udC9odWdlLiAgQW55IGZpbGVzIGNyZWF0ZWQgb24gL21udC9odWdlIHVzZXMgaHVnZSBwYWdlcy4gIFRoZSB1aWQgYW5kIGdpZAogb3B0aW9ucyBzZXRzIHRoZSBvd25lciBhbmQgZ3JvdXAgb2YgdGhlIHJvb3Qgb2YgdGhlIGZpbGUgc3lzdGVtLiAgQnkgZGVmYXVsdAogdGhlIHVpZCBhbmQgZ2lkIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MgYXJlIHRha2VuLiAgVGhlIG1vZGUgb3B0aW9uIHNldHMgdGhlCiBtb2RlIG9mIHJvb3Qgb2YgZmlsZSBzeXN0ZW0gdG8gdmFsdWUgJiAwMTc3Ny4gIFRoaXMgdmFsdWUgaXMgZ2l2ZW4gaW4gb2N0YWwuCi1CeSBkZWZhdWx0IHRoZSB2YWx1ZSAwNzU1IGlzIHBpY2tlZC4gVGhlIHNpemUgb3B0aW9uIHNldHMgdGhlIG1heGltdW0gdmFsdWUgb2YKLW1lbW9yeSAoaHVnZSBwYWdlcykgYWxsb3dlZCBmb3IgdGhhdCBmaWxlc3lzdGVtICgvbW50L2h1Z2UpLiBUaGUgc2l6ZSBpcwotcm91bmRlZCBkb3duIHRvIEhQQUdFX1NJWkUuICBUaGUgb3B0aW9uIG5yX2lub2RlcyBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZgotaW5vZGVzIHRoYXQgL21udC9odWdlIGNhbiB1c2UuICBJZiB0aGUgc2l6ZSBvciBucl9pbm9kZXMgb3B0aW9uIGlzIG5vdAotcHJvdmlkZWQgb24gY29tbWFuZCBsaW5lIHRoZW4gbm8gbGltaXRzIGFyZSBzZXQuICBGb3Igc2l6ZSBhbmQgbnJfaW5vZGVzCi1vcHRpb25zLCB5b3UgY2FuIHVzZSBbR3xnXS9bTXxtXS9bS3xrXSB0byByZXByZXNlbnQgZ2lnYS9tZWdhL2tpbG8uIEZvcgotZXhhbXBsZSwgc2l6ZT0ySyBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBzaXplPTIwNDguCitCeSBkZWZhdWx0IHRoZSB2YWx1ZSAwNzU1IGlzIHBpY2tlZC4gSWYgdGhlIHBhbHRmb3JtIHN1cHBvcnRzIG11bHRpcGxlIGh1Z2UKK3BhZ2Ugc2l6ZXMsIHRoZSBwYWdlc2l6ZSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgaHVnZSBwYWdlIHNpemUgYW5kCithc3NvY2lhdGVkIHBvb2wuICBwYWdlc2l6ZSBpcyBzcGVjaWZpZWQgaW4gYnl0ZXMuICBJZiBwYWdlc2l6ZSBpcyBub3Qgc3BlY2lmaWVkCit0aGUgcGFsdGZvcm0ncyBkZWZhdWx0IGh1Z2UgcGFnZSBzaXplIGFuZCBhc3NvY2lhdGVkIHBvb2wgd2lsbCBiZSB1c2VkLiBUaGUKK3NpemUgb3B0aW9uIHNldHMgdGhlIG1heGltdW0gdmFsdWUgb2YgbWVtb3J5IChodWdlIHBhZ2VzKSBhbGxvd2VkIGZvciB0aGF0CitmaWxlc3lzdGVtICgvbW50L2h1Z2UpLiAgVGhlIHNpemUgb3B0aW9uIGNhbiBiZSBzcGVjaWZpZWQgaW4gYnl0ZXMsIG9yIGFzIGEKK3BlcmNlbnRhZ2Ugb2YgdGhlIHNwZWNpZmllZCBodWdlIHBhZ2UgcG9vbCAobnJfaHVnZXBhZ2VzKS4gIFRoZSBzaXplIGlzCityb3VuZGVkIGRvd24gdG8gSFBBR0VfU0laRSBib3VuZGFyeS4gIFRoZSBtaW5fc2l6ZSBvcHRpb24gc2V0cyB0aGUgbWluaW11bQordmFsdWUgb2YgbWVtb3J5IChodWdlIHBhZ2VzKSBhbGxvd2VkIGZvciB0aGUgZmlsZXN5c3RlbS4gIG1pbl9zaXplIGNhbiBiZQorc3BlY2lmaWVkIGluIHRoZSBzYW1lIHdheSBhcyBzaXplLCBlaXRoZXIgYnl0ZXMgb3IgYSBwZXJjZW50YWdlIG9mIHRoZQoraHVnZSBwYWdlIHBvb2wuICBBdCBtb3VudCB0aW1lLCB0aGUgbnVtYmVyIG9mIGh1Z2UgcGFnZXMgc3BlY2lmaWVkIGJ5CittaW5fc2l6ZSBhcmUgcmVzZXJ2ZWQgZm9yIHVzZSBieSB0aGUgZmlsZXN5c3RlbS4gIElmIHRoZXJlIGFyZSBub3QgZW5vdWdoCitmcmVlIGh1Z2UgcGFnZXMgYXZhaWxhYmxlLCB0aGUgbW91bnQgd2lsbCBmYWlsLiAgQXMgaHVnZSBwYWdlcyBhcmUgYWxsb2NhdGVkCit0byB0aGUgZmlsZXN5c3RlbSBhbmQgZnJlZWQsIHRoZSByZXNlcnZlIGNvdW50IGlzIGFkanVzdGVkIHNvIHRoYXQgdGhlIHN1bQorb2YgYWxsb2NhdGVkIGFuZCByZXNlcnZlZCBodWdlIHBhZ2VzIGlzIGFsd2F5cyBhdCBsZWFzdCBtaW5fc2l6ZS4gIFRoZSBvcHRpb24KK25yX2lub2RlcyBzZXRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbm9kZXMgdGhhdCAvbW50L2h1Z2UgY2FuIHVzZS4gIElmIHRoZQorc2l6ZSwgbWluX3NpemUgb3IgbnJfaW5vZGVzIG9wdGlvbiBpcyBub3QgcHJvdmlkZWQgb24gY29tbWFuZCBsaW5lIHRoZW4KK25vIGxpbWl0cyBhcmUgc2V0LiAgRm9yIHBhZ2VzaXplLCBzaXplLCBtaW5fc2l6ZSBhbmQgbnJfaW5vZGVzIG9wdGlvbnMsIHlvdQorY2FuIHVzZSBbR3xnXS9bTXxtXS9bS3xrXSB0byByZXByZXNlbnQgZ2lnYS9tZWdhL2tpbG8uIEZvciBleGFtcGxlLCBzaXplPTJLCitoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBzaXplPTIwNDguCiAKIFdoaWxlIHJlYWQgc3lzdGVtIGNhbGxzIGFyZSBzdXBwb3J0ZWQgb24gZmlsZXMgdGhhdCByZXNpZGUgb24gaHVnZXRsYgogZmlsZSBzeXN0ZW1zLCB3cml0ZSBzeXN0ZW0gY2FsbHMgYXJlIG5vdC4KQEAgLTI4OSwxNSArMzAyLDIzIEBACiBSZWd1bGFyIGNob3duLCBjaGdycCwgYW5kIGNobW9kIGNvbW1hbmRzICh3aXRoIHJpZ2h0IHBlcm1pc3Npb25zKSBjb3VsZCBiZQogdXNlZCB0byBjaGFuZ2UgdGhlIGZpbGUgYXR0cmlidXRlcyBvbiBodWdldGxiZnMuCiAKLUFsc28sIGl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgbm8gc3VjaCBtb3VudCBjb21tYW5kIGlzIHJlcXVpcmVkIGlmIHRoZQorQWxzbywgaXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBubyBzdWNoIG1vdW50IGNvbW1hbmQgaXMgcmVxdWlyZWQgaWYKIGFwcGxpY2F0aW9ucyBhcmUgZ29pbmcgdG8gdXNlIG9ubHkgc2htYXQvc2htZ2V0IHN5c3RlbSBjYWxscyBvciBtbWFwIHdpdGgKLU1BUF9IVUdFVExCLiAgVXNlcnMgd2hvIHdpc2ggdG8gdXNlIGh1Z2V0bGIgcGFnZSB2aWEgc2hhcmVkIG1lbW9yeSBzZWdtZW50Ci1zaG91bGQgYmUgYSBtZW1iZXIgb2YgYSBzdXBwbGVtZW50YXJ5IGdyb3VwIGFuZCBzeXN0ZW0gYWRtaW4gbmVlZHMgdG8KLWNvbmZpZ3VyZSB0aGF0IGdpZCBpbnRvIC9wcm9jL3N5cy92bS9odWdldGxiX3NobV9ncm91cC4gIEl0IGlzIHBvc3NpYmxlIGZvcgotc2FtZSBvciBkaWZmZXJlbnQgYXBwbGljYXRpb25zIHRvIHVzZSBhbnkgY29tYmluYXRpb24gb2YgbW1hcHMgYW5kIHNobSoKLWNhbGxzLCB0aG91Z2ggdGhlIG1vdW50IG9mIGZpbGVzeXN0ZW0gd2lsbCBiZSByZXF1aXJlZCBmb3IgdXNpbmcgbW1hcCBjYWxscwotd2l0aG91dCBNQVBfSFVHRVRMQi4gIEZvciBhbiBleGFtcGxlIG9mIGhvdyB0byB1c2UgbW1hcCB3aXRoIE1BUF9IVUdFVExCIHNlZQotbWFwX2h1Z2V0bGIuYy4KK01BUF9IVUdFVExCLiAgRm9yIGFuIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBtbWFwIHdpdGggTUFQX0hVR0VUTEIgc2VlIG1hcF9odWdldGxiCitiZWxvdy4KKworVXNlcnMgd2hvIHdpc2ggdG8gdXNlIGh1Z2V0bGIgbWVtb3J5IHZpYSBzaGFyZWQgbWVtb3J5IHNlZ21lbnQgc2hvdWxkIGJlIGEKK21lbWJlciBvZiBhIHN1cHBsZW1lbnRhcnkgZ3JvdXAgYW5kIHN5c3RlbSBhZG1pbiBuZWVkcyB0byBjb25maWd1cmUgdGhhdCBnaWQKK2ludG8gL3Byb2Mvc3lzL3ZtL2h1Z2V0bGJfc2htX2dyb3VwLiAgSXQgaXMgcG9zc2libGUgZm9yIHNhbWUgb3IgZGlmZmVyZW50CithcHBsaWNhdGlvbnMgdG8gdXNlIGFueSBjb21iaW5hdGlvbiBvZiBtbWFwcyBhbmQgc2htKiBjYWxscywgdGhvdWdoIHRoZSBtb3VudCBvZgorZmlsZXN5c3RlbSB3aWxsIGJlIHJlcXVpcmVkIGZvciB1c2luZyBtbWFwIGNhbGxzIHdpdGhvdXQgTUFQX0hVR0VUTEIuCisKK1N5c2NhbGxzIHRoYXQgb3BlcmF0ZSBvbiBtZW1vcnkgYmFja2VkIGJ5IGh1Z2V0bGIgcGFnZXMgb25seSBoYXZlIHRoZWlyIGxlbmd0aHMKK2FsaWduZWQgdG8gdGhlIG5hdGl2ZSBwYWdlIHNpemUgb2YgdGhlIHByb2Nlc3NvcjsgdGhleSB3aWxsIG5vcm1hbGx5IGZhaWwgd2l0aAorZXJybm8gc2V0IHRvIEVJTlZBTCBvciBleGNsdWRlIGh1Z2V0bGIgcGFnZXMgdGhhdCBleHRlbmQgYmV5b25kIHRoZSBsZW5ndGggaWYKK25vdCBodWdlcGFnZSBhbGlnbmVkLiAgRm9yIGV4YW1wbGUsIG11bm1hcCgyKSB3aWxsIGZhaWwgaWYgbWVtb3J5IGlzIGJhY2tlZCBieQorYSBodWdldGxiIHBhZ2UgYW5kIHRoZSBsZW5ndGggaXMgc21hbGxlciB0aGFuIHRoZSBodWdlcGFnZSBzaXplLgorCiAKIEV4YW1wbGVzCiA9PT09PT09PQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS91bmV2aWN0YWJsZS1scnUudHh0IGIvRG9jdW1lbnRhdGlvbi92bS91bmV2aWN0YWJsZS1scnUudHh0CmluZGV4IDc0NGY4MmYuLjNiZTBiZmMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdm0vdW5ldmljdGFibGUtbHJ1LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZtL3VuZXZpY3RhYmxlLWxydS50eHQKQEAgLTIyLDYgKzIyLDcgQEAKICAgICAgLSBGaWx0ZXJpbmcgc3BlY2lhbCB2bWFzLgogICAgICAtIG11bmxvY2soKS9tdW5sb2NrYWxsKCkgc3lzdGVtIGNhbGwgaGFuZGxpbmcuCiAgICAgIC0gTWlncmF0aW5nIG1sb2NrZWQgcGFnZXMuCisgICAgIC0gQ29tcGFjdGluZyBtbG9ja2VkIHBhZ2VzLgogICAgICAtIG1tYXAoTUFQX0xPQ0tFRCkgc3lzdGVtIGNhbGwgaGFuZGxpbmcuCiAgICAgIC0gbXVubWFwKCkvZXhpdCgpL2V4ZWMoKSBzeXN0ZW0gY2FsbCBoYW5kbGluZy4KICAgICAgLSB0cnlfdG9fdW5tYXAoKS4KQEAgLTMxNyw3ICszMTgsNyBAQAogYmVsb3csIG1sb2NrX2ZpeHVwKCkgd2lsbCBhdHRlbXB0IHRvIG1lcmdlIHRoZSBWTUEgd2l0aCBpdHMgbmVpZ2hib3JzIG9yIHNwbGl0CiBvZmYgYSBzdWJzZXQgb2YgdGhlIFZNQSBpZiB0aGUgcmFuZ2UgZG9lcyBub3QgY292ZXIgdGhlIGVudGlyZSBWTUEuICBPbmNlIHRoZQogVk1BIGhhcyBiZWVuIG1lcmdlZCBvciBzcGxpdCBvciBuZWl0aGVyLCBtbG9ja19maXh1cCgpIHdpbGwgY2FsbAotX19tbG9ja192bWFfcGFnZXNfcmFuZ2UoKSB0byBmYXVsdCBpbiB0aGUgcGFnZXMgdmlhIGdldF91c2VyX3BhZ2VzKCkgYW5kIHRvCitwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSgpIHRvIGZhdWx0IGluIHRoZSBwYWdlcyB2aWEgZ2V0X3VzZXJfcGFnZXMoKSBhbmQgdG8KIG1hcmsgdGhlIHBhZ2VzIGFzIG1sb2NrZWQgdmlhIG1sb2NrX3ZtYV9wYWdlKCkuCiAKIE5vdGUgdGhhdCB0aGUgVk1BIGJlaW5nIG1sb2NrZWQgbWlnaHQgYmUgbWFwcGVkIHdpdGggUFJPVF9OT05FLiAgSW4gdGhpcyBjYXNlLApAQCAtMzI3LDcgKzMyOCw3IEBACiAKIEFsc28gbm90ZSB0aGF0IGEgcGFnZSByZXR1cm5lZCBieSBnZXRfdXNlcl9wYWdlcygpIGNvdWxkIGJlIHRydW5jYXRlZCBvcgogbWlncmF0ZWQgb3V0IGZyb20gdW5kZXIgdXMsIHdoaWxlIHdlJ3JlIHRyeWluZyB0byBtbG9jayBpdC4gIFRvIGRldGVjdCB0aGlzLAotX19tbG9ja192bWFfcGFnZXNfcmFuZ2UoKSBjaGVja3MgcGFnZV9tYXBwaW5nKCkgYWZ0ZXIgYWNxdWlyaW5nIHRoZSBwYWdlIGxvY2suCitwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSgpIGNoZWNrcyBwYWdlX21hcHBpbmcoKSBhZnRlciBhY3F1aXJpbmcgdGhlIHBhZ2UgbG9jay4KIElmIHRoZSBwYWdlIGlzIHN0aWxsIGFzc29jaWF0ZWQgd2l0aCBpdHMgbWFwcGluZywgd2UnbGwgZ28gYWhlYWQgYW5kIGNhbGwKIG1sb2NrX3ZtYV9wYWdlKCkuICBJZiB0aGUgbWFwcGluZyBpcyBnb25lLCB3ZSBqdXN0IHVubG9jayB0aGUgcGFnZSBhbmQgbW92ZSBvbi4KIEluIHRoZSB3b3JzdCBjYXNlLCB0aGlzIHdpbGwgcmVzdWx0IGluIGEgcGFnZSBtYXBwZWQgaW4gYSBWTV9MT0NLRUQgVk1BCkBAIC0zOTIsNyArMzkzLDcgQEAKIAogSWYgdGhlIFZNQSBpcyBWTV9MT0NLRUQsIG1sb2NrX2ZpeHVwKCkgYWdhaW4gYXR0ZW1wdHMgdG8gbWVyZ2Ugb3Igc3BsaXQgb2ZmIHRoZQogc3BlY2lmaWVkIHJhbmdlLiAgVGhlIHJhbmdlIGlzIHRoZW4gbXVubG9ja2VkIHZpYSB0aGUgZnVuY3Rpb24KLV9fbWxvY2tfdm1hX3BhZ2VzX3JhbmdlKCkgLSB0aGUgc2FtZSBmdW5jdGlvbiB1c2VkIHRvIG1sb2NrIGEgVk1BIHJhbmdlIC0KK3BvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKCkgLSB0aGUgc2FtZSBmdW5jdGlvbiB1c2VkIHRvIG1sb2NrIGEgVk1BIHJhbmdlIC0KIHBhc3NpbmcgYSBmbGFnIHRvIGluZGljYXRlIHRoYXQgbXVubG9jaygpIGlzIGJlaW5nIHBlcmZvcm1lZC4KIAogQmVjYXVzZSB0aGUgVk1BIGFjY2VzcyBwcm90ZWN0aW9ucyBjb3VsZCBoYXZlIGJlZW4gY2hhbmdlZCB0byBQUk9UX05PTkUgYWZ0ZXIKQEAgLTQwMiw3ICs0MDMsNyBAQAogZmV0Y2hpbmcgdGhlIHBhZ2VzIC0gYWxsIG9mIHdoaWNoIHNob3VsZCBiZSByZXNpZGVudCBhcyBhIHJlc3VsdCBvZiBwcmV2aW91cwogbWxvY2tpbmcuCiAKLUZvciBtdW5sb2NrKCksIF9fbWxvY2tfdm1hX3BhZ2VzX3JhbmdlKCkgdW5sb2NrcyBpbmRpdmlkdWFsIHBhZ2VzIGJ5IGNhbGxpbmcKK0ZvciBtdW5sb2NrKCksIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKCkgdW5sb2NrcyBpbmRpdmlkdWFsIHBhZ2VzIGJ5IGNhbGxpbmcKIG11bmxvY2tfdm1hX3BhZ2UoKS4gIG11bmxvY2tfdm1hX3BhZ2UoKSB1bmNvbmRpdGlvbmFsbHkgY2xlYXJzIHRoZSBQR19tbG9ja2VkCiBmbGFnIHVzaW5nIFRlc3RDbGVhclBhZ2VNbG9ja2VkKCkuICBBcyB3aXRoIG1sb2NrX3ZtYV9wYWdlKCksCiBtdW5sb2NrX3ZtYV9wYWdlKCkgdXNlIHRoZSBUZXN0KlBhZ2VNbG9ja2VkKCkgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlCkBAIC00NTAsNiArNDUxLDE3IEBACiBwdXRiYWNrX2xydV9wYWdlKCkgZnVuY3Rpb24gdG8gYWRkIG1pZ3JhdGVkIHBhZ2VzIGJhY2sgdG8gdGhlIExSVS4KIAogCitDT01QQUNUSU5HIE1MT0NLRUQgUEFHRVMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgdW5ldmljdGFibGUgTFJVIGNhbiBiZSBzY2FubmVkIGZvciBjb21wYWN0YWJsZSByZWdpb25zIGFuZCB0aGUgZGVmYXVsdAorYmVoYXZpb3IgaXMgdG8gZG8gc28uICAvcHJvYy9zeXMvdm0vY29tcGFjdF91bmV2aWN0YWJsZV9hbGxvd2VkIGNvbnRyb2xzCit0aGlzIGJlaGF2aW9yIChzZWUgRG9jdW1lbnRhdGlvbi9zeXNjdGwvdm0udHh0KS4gIE9uY2Ugc2Nhbm5pbmcgb2YgdGhlCit1bmV2aWN0YWJsZSBMUlUgaXMgZW5hYmxlZCwgdGhlIHdvcmsgb2YgY29tcGFjdGlvbiBpcyBtb3N0bHkgaGFuZGxlZCBieQordGhlIHBhZ2UgbWlncmF0aW9uIGNvZGUgYW5kIHRoZSBzYW1lIHdvcmsgZmxvdyBhcyBkZXNjcmliZWQgaW4gTUlHUkFUSU5HCitNTE9DS0VEIFBBR0VTIHdpbGwgYXBwbHkuCisKKwogbW1hcChNQVBfTE9DS0VEKSBTWVNURU0gQ0FMTCBIQU5ETElORwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00NjMsMjEgKzQ3NSwxMSBAQAogCiBUbyBtbG9jayBhIHJhbmdlIG9mIG1lbW9yeSB1bmRlciB0aGUgdW5ldmljdGFibGUvbWxvY2sgaW5mcmFzdHJ1Y3R1cmUsIHRoZQogbW1hcCgpIGhhbmRsZXIgYW5kIHRhc2sgYWRkcmVzcyBzcGFjZSBleHBhbnNpb24gZnVuY3Rpb25zIGNhbGwKLW1sb2NrX3ZtYV9wYWdlc19yYW5nZSgpIHNwZWNpZnlpbmcgdGhlIHZtYSBhbmQgdGhlIGFkZHJlc3MgcmFuZ2UgdG8gbWxvY2suCi1tbG9ja192bWFfcGFnZXNfcmFuZ2UoKSBmaWx0ZXJzIFZNQXMgbGlrZSBtbG9ja19maXh1cCgpLCBhcyBkZXNjcmliZWQgYWJvdmUgaW4KLSJGaWx0ZXJpbmcgU3BlY2lhbCBWTUFzIi4gIEl0IHdpbGwgY2xlYXIgdGhlIFZNX0xPQ0tFRCBmbGFnLCB3aGljaCB3aWxsIGhhdmUKLWFscmVhZHkgYmVlbiBzZXQgYnkgdGhlIGNhbGxlciwgaW4gZmlsdGVyZWQgVk1Bcy4gIFRodXMgdGhlc2UgVk1BJ3MgbmVlZCBub3QgYmUKLXZpc2l0ZWQgZm9yIG11bmxvY2sgd2hlbiB0aGUgcmVnaW9uIGlzIHVubWFwcGVkLgorcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UoKSBzcGVjaWZ5aW5nIHRoZSB2bWEgYW5kIHRoZSBhZGRyZXNzIHJhbmdlIHRvIG1sb2NrLgogCi1Gb3IgIm5vcm1hbCIgVk1BcywgbWxvY2tfdm1hX3BhZ2VzX3JhbmdlKCkgY2FsbHMgX19tbG9ja192bWFfcGFnZXNfcmFuZ2UoKSB0bwotZmF1bHQvYWxsb2NhdGUgdGhlIHBhZ2VzIGFuZCBtbG9jayB0aGVtLiAgQWdhaW4sIGxpa2UgbWxvY2tfZml4dXAoKSwKLW1sb2NrX3ZtYV9wYWdlc19yYW5nZSgpIGRvd25ncmFkZXMgdGhlIG1tYXAgc2VtYXBob3JlIHRvIHJlYWQgbW9kZSBiZWZvcmUKLWF0dGVtcHRpbmcgdG8gZmF1bHQvYWxsb2NhdGUgYW5kIG1sb2NrIHRoZSBwYWdlcyBhbmQgInVwZ3JhZGVzIiB0aGUgc2VtYXBob3JlCi1iYWNrIHRvIHdyaXRlIG1vZGUgYmVmb3JlIHJldHVybmluZy4KLQotVGhlIGNhbGxlcnMgb2YgbWxvY2tfdm1hX3BhZ2VzX3JhbmdlKCkgd2lsbCBoYXZlIGFscmVhZHkgYWRkZWQgdGhlIG1lbW9yeSByYW5nZQorVGhlIGNhbGxlcnMgb2YgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UoKSB3aWxsIGhhdmUgYWxyZWFkeSBhZGRlZCB0aGUgbWVtb3J5IHJhbmdlCiB0byBiZSBtbG9ja2VkIHRvIHRoZSB0YXNrJ3MgImxvY2tlZF92bSIuICBUbyBhY2NvdW50IGZvciBmaWx0ZXJlZCBWTUFzLAotbWxvY2tfdm1hX3BhZ2VzX3JhbmdlKCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZ2VzIE5PVCBtbG9ja2VkLiAgQWxsIG9mIHRoZQorcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFnZXMgTk9UIG1sb2NrZWQuICBBbGwgb2YgdGhlCiBjYWxsZXJzIHRoZW4gc3VidHJhY3QgYSBub24tbmVnYXRpdmUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIHRhc2sncyBsb2NrZWRfdm0uICBBCiBuZWdhdGl2ZSByZXR1cm4gdmFsdWUgcmVwcmVzZW50IGFuIGVycm9yIC0gZm9yIGV4YW1wbGUsIGZyb20gZ2V0X3VzZXJfcGFnZXMoKQogYXR0ZW1wdGluZyB0byBmYXVsdCBpbiBhIFZNQSB3aXRoIFBST1RfTk9ORSBhY2Nlc3MuICBJbiB0aGlzIGNhc2UsIHdlIGxlYXZlIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92bS96c21hbGxvYy50eHQgYi9Eb2N1bWVudGF0aW9uL3ZtL3pzbWFsbG9jLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGVkNjNjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92bS96c21hbGxvYy50eHQKQEAgLTAsMCArMSw3MCBAQAorenNtYWxsb2MKKy0tLS0tLS0tCisKK1RoaXMgYWxsb2NhdG9yIGlzIGRlc2lnbmVkIGZvciB1c2Ugd2l0aCB6cmFtLiBUaHVzLCB0aGUgYWxsb2NhdG9yIGlzCitzdXBwb3NlZCB0byB3b3JrIHdlbGwgdW5kZXIgbG93IG1lbW9yeSBjb25kaXRpb25zLiBJbiBwYXJ0aWN1bGFyLCBpdAorbmV2ZXIgYXR0ZW1wdHMgaGlnaGVyIG9yZGVyIHBhZ2UgYWxsb2NhdGlvbiB3aGljaCBpcyB2ZXJ5IGxpa2VseSB0bworZmFpbCB1bmRlciBtZW1vcnkgcHJlc3N1cmUuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBqdXN0IHVzZSBzaW5nbGUKKygwLW9yZGVyKSBwYWdlcywgaXQgd291bGQgc3VmZmVyIGZyb20gdmVyeSBoaWdoIGZyYWdtZW50YXRpb24gLS0KK2FueSBvYmplY3Qgb2Ygc2l6ZSBQQUdFX1NJWkUvMiBvciBsYXJnZXIgd291bGQgb2NjdXB5IGFuIGVudGlyZSBwYWdlLgorVGhpcyB3YXMgb25lIG9mIHRoZSBtYWpvciBpc3N1ZXMgd2l0aCBpdHMgcHJlZGVjZXNzb3IgKHh2bWFsbG9jKS4KKworVG8gb3ZlcmNvbWUgdGhlc2UgaXNzdWVzLCB6c21hbGxvYyBhbGxvY2F0ZXMgYSBidW5jaCBvZiAwLW9yZGVyIHBhZ2VzCithbmQgbGlua3MgdGhlbSB0b2dldGhlciB1c2luZyB2YXJpb3VzICdzdHJ1Y3QgcGFnZScgZmllbGRzLiBUaGVzZSBsaW5rZWQKK3BhZ2VzIGFjdCBhcyBhIHNpbmdsZSBoaWdoZXItb3JkZXIgcGFnZSBpLmUuIGFuIG9iamVjdCBjYW4gc3BhbiAwLW9yZGVyCitwYWdlIGJvdW5kYXJpZXMuIFRoZSBjb2RlIHJlZmVycyB0byB0aGVzZSBsaW5rZWQgcGFnZXMgYXMgYSBzaW5nbGUgZW50aXR5CitjYWxsZWQgenNwYWdlLgorCitGb3Igc2ltcGxpY2l0eSwgenNtYWxsb2MgY2FuIG9ubHkgYWxsb2NhdGUgb2JqZWN0cyBvZiBzaXplIHVwIHRvIFBBR0VfU0laRQorc2luY2UgdGhpcyBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50cyBvZiBhbGwgaXRzIGN1cnJlbnQgdXNlcnMgKGluIHRoZQord29yc3QgY2FzZSwgcGFnZSBpcyBpbmNvbXByZXNzaWJsZSBhbmQgaXMgdGh1cyBzdG9yZWQgImFzLWlzIiBpLmUuIGluCit1bmNvbXByZXNzZWQgZm9ybSkuIEZvciBhbGxvY2F0aW9uIHJlcXVlc3RzIGxhcmdlciB0aGFuIHRoaXMgc2l6ZSwgZmFpbHVyZQoraXMgcmV0dXJuZWQgKHNlZSB6c19tYWxsb2MpLgorCitBZGRpdGlvbmFsbHksIHpzX21hbGxvYygpIGRvZXMgbm90IHJldHVybiBhIGRlcmVmZXJlbmNlYWJsZSBwb2ludGVyLgorSW5zdGVhZCwgaXQgcmV0dXJucyBhbiBvcGFxdWUgaGFuZGxlICh1bnNpZ25lZCBsb25nKSB3aGljaCBlbmNvZGVzIGFjdHVhbAorbG9jYXRpb24gb2YgdGhlIGFsbG9jYXRlZCBvYmplY3QuIFRoZSByZWFzb24gZm9yIHRoaXMgaW5kaXJlY3Rpb24gaXMgdGhhdAorenNtYWxsb2MgZG9lcyBub3Qga2VlcCB6c3BhZ2VzIHBlcm1hbmVudGx5IG1hcHBlZCBzaW5jZSB0aGF0IHdvdWxkIGNhdXNlCitpc3N1ZXMgb24gMzItYml0IHN5c3RlbXMgd2hlcmUgdGhlIFZBIHJlZ2lvbiBmb3Iga2VybmVsIHNwYWNlIG1hcHBpbmdzCitpcyB2ZXJ5IHNtYWxsLiBTbywgYmVmb3JlIHVzaW5nIHRoZSBhbGxvY2F0aW5nIG1lbW9yeSwgdGhlIG9iamVjdCBoYXMgdG8KK2JlIG1hcHBlZCB1c2luZyB6c19tYXBfb2JqZWN0KCkgdG8gZ2V0IGEgdXNhYmxlIHBvaW50ZXIgYW5kIHN1YnNlcXVlbnRseQordW5tYXBwZWQgdXNpbmcgenNfdW5tYXBfb2JqZWN0KCkuCisKK3N0YXQKKy0tLS0KKworV2l0aCBDT05GSUdfWlNNQUxMT0NfU1RBVCwgd2UgY291bGQgc2VlIHpzbWFsbG9jIGludGVybmFsIGluZm9ybWF0aW9uIHZpYQorL3N5cy9rZXJuZWwvZGVidWcvenNtYWxsb2MvPHVzZXIgbmFtZT4uIEhlcmUgaXMgYSBzYW1wbGUgb2Ygc3RhdCBvdXRwdXQ6CisKKyMgY2F0IC9zeXMva2VybmVsL2RlYnVnL3pzbWFsbG9jL3pyYW0wL2NsYXNzZXMKKworIGNsYXNzICBzaXplIGFsbW9zdF9mdWxsIGFsbW9zdF9lbXB0eSBvYmpfYWxsb2NhdGVkICAgb2JqX3VzZWQgcGFnZXNfdXNlZCBwYWdlc19wZXJfenNwYWdlCisgICAgLi4KKyAgICAuLgorICAgICA5ICAgMTc2ICAgICAgICAgICAwICAgICAgICAgICAgMSAgICAgICAgICAgMTg2ICAgICAgICAxMjkgICAgICAgICAgOCAgICAgICAgICAgICAgICA0CisgICAgMTAgICAxOTIgICAgICAgICAgIDEgICAgICAgICAgICAwICAgICAgICAgIDI4ODAgICAgICAgMjg3MiAgICAgICAgMTM1ICAgICAgICAgICAgICAgIDMKKyAgICAxMSAgIDIwOCAgICAgICAgICAgMCAgICAgICAgICAgIDEgICAgICAgICAgIDgxOSAgICAgICAgNzk1ICAgICAgICAgNDIgICAgICAgICAgICAgICAgMgorICAgIDEyICAgMjI0ICAgICAgICAgICAwICAgICAgICAgICAgMSAgICAgICAgICAgMjE5ICAgICAgICAxNTkgICAgICAgICAxMiAgICAgICAgICAgICAgICA0CisgICAgLi4KKyAgICAuLgorCisKK2NsYXNzOiBpbmRleAorc2l6ZTogb2JqZWN0IHNpemUgenNwYWdlIHN0b3JlcworYWxtb3N0X2VtcHR5OiB0aGUgbnVtYmVyIG9mIFpTX0FMTU9TVF9FTVBUWSB6c3BhZ2VzKHNlZSBiZWxvdykKK2FsbW9zdF9mdWxsOiB0aGUgbnVtYmVyIG9mIFpTX0FMTU9TVF9GVUxMIHpzcGFnZXMoc2VlIGJlbG93KQorb2JqX2FsbG9jYXRlZDogdGhlIG51bWJlciBvZiBvYmplY3RzIGFsbG9jYXRlZAorb2JqX3VzZWQ6IHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBhbGxvY2F0ZWQgdG8gdGhlIHVzZXIKK3BhZ2VzX3VzZWQ6IHRoZSBudW1iZXIgb2YgcGFnZXMgYWxsb2NhdGVkIGZvciB0aGUgY2xhc3MKK3BhZ2VzX3Blcl96c3BhZ2U6IHRoZSBudW1iZXIgb2YgMC1vcmRlciBwYWdlcyB0byBtYWtlIGEgenNwYWdlCisKK1dlIGFzc2lnbiBhIHpzcGFnZSB0byBaU19BTE1PU1RfRU1QVFkgZnVsbG5lc3MgZ3JvdXAgd2hlbjoKKyAgICAgIG4gPD0gTiAvIGYsIHdoZXJlCituID0gbnVtYmVyIG9mIGFsbG9jYXRlZCBvYmplY3RzCitOID0gdG90YWwgbnVtYmVyIG9mIG9iamVjdHMgenNwYWdlIGNhbiBzdG9yZQorZiA9IGZ1bGxuZXNzX3RocmVzaG9sZF9mcmFjKGllLCA0IGF0IHRoZSBtb21lbnQpCisKK1NpbWlsYXJseSwgd2UgYXNzaWduIHpzcGFnZSB0bzoKKyAgICAgIFpTX0FMTU9TVF9GVUxMICB3aGVuIG4gPiBOIC8gZgorICAgICAgWlNfRU1QVFkgICAgICAgIHdoZW4gbiA9PSAwCisgICAgICBaU19GVUxMICAgICAgICAgd2hlbiBuID09IE4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24veDg2L2Jvb3QudHh0IGIvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQKaW5kZXggYTc1ZTNhZC4uODhiODU4OSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi94ODYvYm9vdC50eHQKQEAgLTQwNiw2ICs0MDYsMTIgQEAKIAktIElmIDAsIHRoZSBwcm90ZWN0ZWQtbW9kZSBjb2RlIGlzIGxvYWRlZCBhdCAweDEwMDAwLgogCS0gSWYgMSwgdGhlIHByb3RlY3RlZC1tb2RlIGNvZGUgaXMgbG9hZGVkIGF0IDB4MTAwMDAwLgogCisgIEJpdCAxIChrZXJuZWwgaW50ZXJuYWwpOiBBTFNSX0ZMQUcKKwktIFVzZWQgaW50ZXJuYWxseSBieSB0aGUgY29tcHJlc3NlZCBrZXJuZWwgdG8gY29tbXVuaWNhdGUKKwkgIEtBU0xSIHN0YXR1cyB0byBrZXJuZWwgcHJvcGVyLgorCSAgSWYgMSwgS0FTTFIgZW5hYmxlZC4KKwkgIElmIDAsIEtBU0xSIGRpc2FibGVkLgorCiAgIEJpdCA1ICh3cml0ZSk6IFFVSUVUX0ZMQUcKIAktIElmIDAsIHByaW50IGVhcmx5IG1lc3NhZ2VzLgogCS0gSWYgMSwgc3VwcHJlc3MgZWFybHkgbWVzc2FnZXMuCmRpZmYgLS1naXQgYS9LYnVpbGQgYi9LYnVpbGQKaW5kZXggYWI4ZGVkOS4uNmYwZDgyYSAxMDA2NDQKLS0tIGEvS2J1aWxkCisrKyBiL0tidWlsZApAQCAtMTMsOCArMTMsOSBAQAogCXM6LT46OjsgcDt9IgogZW5kZWYKIAotcXVpZXRfY21kX29mZnNldHMgPSBHRU4gICAgICRACi1kZWZpbmUgY21kX29mZnNldHMKKyMgVXNlIGZpbGVjaGsgdG8gYXZvaWQgcmVidWlsZHMgd2hlbiBhIGhlYWRlciBjaGFuZ2VzLCBidXQgdGhlIHJlc3VsdGluZyBmaWxlCisjIGRvZXMgbm90CitkZWZpbmUgZmlsZWNoa19vZmZzZXRzCiAJKHNldCAtZTsgXAogCSBlY2hvICIjaWZuZGVmICQyIjsgXAogCSBlY2hvICIjZGVmaW5lICQyIjsgXApAQCAtMjQsOSArMjUsOSBAQAogCSBlY2hvICIgKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBLYnVpbGQiOyBcCiAJIGVjaG8gIiAqLyI7IFwKIAkgZWNobyAiIjsgXAotCSBzZWQgLW5lICQoc2VkLXkpICQ8OyBcCisJIHNlZCAtbmUgJChzZWQteSk7IFwKIAkgZWNobyAiIjsgXAotCSBlY2hvICIjZW5kaWYiICkgPiAkQAorCSBlY2hvICIjZW5kaWYiICkKIGVuZGVmCiAKICMjIyMjCkBAIC0zNSwxNiArMzYsMTUgQEAKIGJvdW5kcy1maWxlIDo9IGluY2x1ZGUvZ2VuZXJhdGVkL2JvdW5kcy5oCiAKIGFsd2F5cyAgOj0gJChib3VuZHMtZmlsZSkKLXRhcmdldHMgOj0gJChib3VuZHMtZmlsZSkga2VybmVsL2JvdW5kcy5zCit0YXJnZXRzIDo9IGtlcm5lbC9ib3VuZHMucwogCiAjIFdlIHVzZSBpbnRlcm5hbCBrYnVpbGQgcnVsZXMgdG8gYXZvaWQgdGhlICJpcyB1cCB0byBkYXRlIiBtZXNzYWdlIGZyb20gbWFrZQoga2VybmVsL2JvdW5kcy5zOiBrZXJuZWwvYm91bmRzLmMgRk9SQ0UKIAkkKFEpbWtkaXIgLXAgJChkaXIgJEApCiAJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNjX3NfYykKIAotJChvYmopLyQoYm91bmRzLWZpbGUpOiBrZXJuZWwvYm91bmRzLnMgS2J1aWxkCi0JJChRKW1rZGlyIC1wICQoZGlyICRAKQotCSQoY2FsbCBjbWQsb2Zmc2V0cyxfX0xJTlVYX0JPVU5EU19IX18pCiskKG9iaikvJChib3VuZHMtZmlsZSk6IGtlcm5lbC9ib3VuZHMucyBGT1JDRQorCSQoY2FsbCBmaWxlY2hrLG9mZnNldHMsX19MSU5VWF9CT1VORFNfSF9fKQogCiAjIyMjIwogIyAyKSBHZW5lcmF0ZSBhc20tb2Zmc2V0cy5oCkBAIC01Myw3ICs1Myw2IEBACiBvZmZzZXRzLWZpbGUgOj0gaW5jbHVkZS9nZW5lcmF0ZWQvYXNtLW9mZnNldHMuaAogCiBhbHdheXMgICs9ICQob2Zmc2V0cy1maWxlKQotdGFyZ2V0cyArPSAkKG9mZnNldHMtZmlsZSkKIHRhcmdldHMgKz0gYXJjaC8kKFNSQ0FSQ0gpL2tlcm5lbC9hc20tb2Zmc2V0cy5zCiAKICMgV2UgdXNlIGludGVybmFsIGtidWlsZCBydWxlcyB0byBhdm9pZCB0aGUgImlzIHVwIHRvIGRhdGUiIG1lc3NhZ2UgZnJvbSBtYWtlCkBAIC02Miw4ICs2MSw4IEBACiAJJChRKW1rZGlyIC1wICQoZGlyICRAKQogCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19zX2MpCiAKLSQob2JqKS8kKG9mZnNldHMtZmlsZSk6IGFyY2gvJChTUkNBUkNIKS9rZXJuZWwvYXNtLW9mZnNldHMucyBLYnVpbGQKLQkkKGNhbGwgY21kLG9mZnNldHMsX19BU01fT0ZGU0VUU19IX18pCiskKG9iaikvJChvZmZzZXRzLWZpbGUpOiBhcmNoLyQoU1JDQVJDSCkva2VybmVsL2FzbS1vZmZzZXRzLnMgRk9SQ0UKKwkkKGNhbGwgZmlsZWNoayxvZmZzZXRzLF9fQVNNX09GRlNFVFNfSF9fKQogCiAjIyMjIwogIyAzKSBDaGVjayBmb3IgbWlzc2luZyBzeXN0ZW0gY2FsbHMKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggMGUxYWJlOC4uNTZhNDMyZCAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTYyNSwyMCArNjI1LDE5IEBACiBGOglpbmNsdWRlL2xpbnV4L2FtZC1pb21tdS5oCiAKIEFNRCBLRkQKLU06ICAgICAgT2RlZCBHYWJiYXkgPG9kZWQuZ2FiYmF5QGFtZC5jb20+Ci1MOiAgICAgIGRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKLVQ6ICAgICAgZ2l0IGdpdDovL3Blb3BsZS5mcmVlZGVza3RvcC5vcmcvfmdhYmJheW8vbGludXguZ2l0Ci1TOiAgICAgIFN1cHBvcnRlZAotRjogICAgICBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGtmZC8KK006CU9kZWQgR2FiYmF5IDxvZGVkLmdhYmJheUBhbWQuY29tPgorTDoJZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZworVDoJZ2l0IGdpdDovL3Blb3BsZS5mcmVlZGVza3RvcC5vcmcvfmdhYmJheW8vbGludXguZ2l0CitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvZ3B1L2RybS9hbWQvYW1ka2ZkLwogRjoJZHJpdmVycy9ncHUvZHJtL2FtZC9pbmNsdWRlL2Npa19zdHJ1Y3RzLmgKIEY6CWRyaXZlcnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9rZ2Rfa2ZkX2ludGVyZmFjZS5oCi1GOiAgICAgIGRyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2tmZC5jCi1GOiAgICAgIGRyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2tmZC5oCi1GOiAgICAgIGluY2x1ZGUvdWFwaS9saW51eC9rZmRfaW9jdGwuaAorRjoJZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa2ZkLmMKK0Y6CWRyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2tmZC5oCitGOglpbmNsdWRlL3VhcGkvbGludXgva2ZkX2lvY3RsLmgKIAogQU1EIE1JQ1JPQ09ERSBVUERBVEUgU1VQUE9SVAotTToJQW5kcmVhcyBIZXJybWFubiA8aGVycm1hbm4uZGVyLnVzZXJAZ29vZ2xlbWFpbC5jb20+Ci1MOglhbWQ2NC1taWNyb2NvZGVAYW1kNjQub3JnCitNOglCb3Jpc2xhdiBQZXRrb3YgPGJwQGFsaWVuOC5kZT4KIFM6CU1haW50YWluZWQKIEY6CWFyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZCoKIApAQCAtNzI1LDcgKzcyNCw3IEBACiAKIEFORFJPSUQgRFJJVkVSUwogTToJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4KLU06CUFydmUgSGr4bm5lduVnIDxhcnZlQGFuZHJvaWQuY29tPgorTToJQXJ2ZSBIasO4bm5ldsOlZyA8YXJ2ZUBhbmRyb2lkLmNvbT4KIE06CVJpbGV5IEFuZHJld3MgPHJpYW5kcmV3c0BhbmRyb2lkLmNvbT4KIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9ncmVna2gvc3RhZ2luZy5naXQKIEw6CWRldmVsQGRyaXZlcmRldi5vc3Vvc2wub3JnCkBAIC0xMTg2LDcgKzExODUsNyBAQAogTDoJbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFM6CU1haW50YWluZWQKIEY6CWFyY2gvYXJtL21hY2gtbXZlYnUvCi1GOglkcml2ZXJzL3J0Yy9hcm1hZGEzOHgtcnRjCitGOglkcml2ZXJzL3J0Yy9ydGMtYXJtYWRhMzh4LmMKIAogQVJNL01hcnZlbGwgQmVybGluIFNvQyBzdXBwb3J0CiBNOglTZWJhc3RpYW4gSGVzc2VsYmFydGggPHNlYmFzdGlhbi5oZXNzZWxiYXJ0aEBnbWFpbC5jb20+CkBAIC0xMzYyLDYgKzEzNjEsNyBAQAogRjoJZHJpdmVycy8qLypyb2NrY2hpcCoKIEY6CWRyaXZlcnMvKi8qLypyb2NrY2hpcCoKIEY6CXNvdW5kL3NvYy9yb2NrY2hpcC8KK046CXJvY2tjaGlwCiAKIEFSTS9TQU1TVU5HIEVYWU5PUyBBUk0gQVJDSElURUNUVVJFUwogTToJS3VramluIEtpbSA8a2dlbmVAa2VybmVsLm9yZz4KQEAgLTE0NjgsNiArMTQ2OCw4IEBACiBGOglkcml2ZXJzL2kyYy9idXNzZXMvaTJjLXN0LmMKIEY6CWRyaXZlcnMvbWVkaWEvcmMvc3RfcmMuYwogRjoJZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zdC5jCitGOglkcml2ZXJzL3BoeS9waHktbWlwaHkyOGxwLmMKK0Y6CWRyaXZlcnMvcGh5L3BoeS1taXBoeTM2NXguYwogRjoJZHJpdmVycy9waHkvcGh5LXN0aWg0MDctdXNiLmMKIEY6CWRyaXZlcnMvcGh5L3BoeS1zdGloNDF4LXVzYi5jCiBGOglkcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdC5jCkBAIC0xNjc1LDggKzE2NzcsOCBAQAogRjoJaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2F0MjQuaAogCiBBVEEgT1ZFUiBFVEhFUk5FVCAoQU9FKSBEUklWRVIKLU06CSJFZCBMLiBDYXNoaW4iIDxlY2FzaGluQGNvcmFpZC5jb20+Ci1XOglodHRwOi8vc3VwcG9ydC5jb3JhaWQuY29tL3N1cHBvcnQvbGludXgKK006CSJFZCBMLiBDYXNoaW4iIDxlZC5jYXNoaW5AYWNtLm9yZz4KK1c6CWh0dHA6Ly93d3cub3BlbmFvZS5vcmcvCiBTOglTdXBwb3J0ZWQKIEY6CURvY3VtZW50YXRpb24vYW9lLwogRjoJZHJpdmVycy9ibG9jay9hb2UvCkBAIC0xNzQxLDcgKzE3NDMsNyBAQAogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy8KIAogQVRNCi1NOglDaGFzIFdpbGxpYW1zIDxjaGFzQGNtZi5ucmwubmF2eS5taWw+CitNOglDaGFzIFdpbGxpYW1zIDwzY2hhczNAZ21haWwuY29tPgogTDoJbGludXgtYXRtLWdlbmVyYWxAbGlzdHMuc291cmNlZm9yZ2UubmV0IChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFc6CWh0dHA6Ly9saW51eC1hdG0uc291cmNlZm9yZ2UubmV0CkBAIC0xNzYyLDcgKzE3NjQsNyBAQAogRjoJZHJpdmVycy90dHkvc2VyaWFsL2F0bWVsX3NlcmlhbC5jCiAKIEFUTUVMIEF1ZGlvIEFMU0EgZHJpdmVyCi1NOglCbyBTaGVuIDx2b2ljZS5zaGVuQGF0bWVsLmNvbT4KK006CU5pY29sYXMgRmVycmUgPG5pY29sYXMuZmVycmVAYXRtZWwuY29tPgogTDoJYWxzYS1kZXZlbEBhbHNhLXByb2plY3Qub3JnIChtb2RlcmF0ZWQgZm9yIG5vbi1zdWJzY3JpYmVycykKIFM6CVN1cHBvcnRlZAogRjoJc291bmQvc29jL2F0bWVsCkBAIC0xOTEzLDE2ICsxOTE1LDE0IEBACiBGOglkcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWF6dGVjaCoKIAogQjQzIFdJUkVMRVNTIERSSVZFUgotTToJU3RlZmFubyBCcml2aW8gPHN0ZWZhbm8uYnJpdmlvQHBvbGltaS5pdD4KIEw6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogTDoJYjQzLWRldkBsaXN0cy5pbmZyYWRlYWQub3JnCiBXOglodHRwOi8vd2lyZWxlc3Mua2VybmVsLm9yZy9lbi91c2Vycy9Ecml2ZXJzL2I0MwotUzoJTWFpbnRhaW5lZAorUzoJT2RkIEZpeGVzCiBGOglkcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvCiAKIEI0M0xFR0FDWSBXSVJFTEVTUyBEUklWRVIKIE06CUxhcnJ5IEZpbmdlciA8TGFycnkuRmluZ2VyQGx3ZmluZ2VyLm5ldD4KLU06CVN0ZWZhbm8gQnJpdmlvIDxzdGVmYW5vLmJyaXZpb0Bwb2xpbWkuaXQ+CiBMOglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcKIEw6CWI0My1kZXZAbGlzdHMuaW5mcmFkZWFkLm9yZwogVzoJaHR0cDovL3dpcmVsZXNzLmtlcm5lbC5vcmcvZW4vdXNlcnMvRHJpdmVycy9iNDMKQEAgLTE5NjUsMTAgKzE5NjUsMTAgQEAKIEY6CWZzL2JlZnMvCiAKIEJFQ0tIT0ZGIENYNTAyMCBFVEhFUkNBVCBNQVNURVIgRFJJVkVSCi1NOiBEYXJpdXN6IE1hcmNpbmtpZXdpY3ogPHJla3Npb0BuZXd0ZXJtLnBsPgotTDogbmV0ZGV2QHZnZXIua2VybmVsLm9yZwotUzogTWFpbnRhaW5lZAotRjogZHJpdmVycy9uZXQvZXRoZXJuZXQvZWNfYmhmLmMKK006CURhcml1c3ogTWFyY2lua2lld2ljeiA8cmVrc2lvQG5ld3Rlcm0ucGw+CitMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9lY19iaGYuYwogCiBCRlMgRklMRSBTWVNURU0KIE06CSJUaWdyYW4gQS4gQWl2YXppYW4iIDx0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWs+CkBAIC0yNTE4LDExICsyNTE4LDE4IEBACiAKIENISVBJREVBIFVTQiBISUdIIFNQRUVEIERVQUwgUk9MRSBDT05UUk9MTEVSCiBNOglQZXRlciBDaGVuIDxQZXRlci5DaGVuQGZyZWVzY2FsZS5jb20+Ci1UOglnaXQgZ2l0Oi8vZ2l0aHViLmNvbS9oenBldGVyY2hlbi9saW51eC11c2IuZ2l0CitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3BldGVyLmNoZW4vdXNiLmdpdAogTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZwogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy91c2IvY2hpcGlkZWEvCiAKK0NISVBPTkUgSUNOODMxOCBJMkMgVE9VQ0hTQ1JFRU4gRFJJVkVSCitNOglIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorTDoJbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3JnCitTOglNYWludGFpbmVkCitGOglEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvdG91Y2hzY3JlZW4vY2hpcG9uZV9pY244MzE4LnR4dAorRjoJZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jaGlwb25lX2ljbjgzMTguYworCiBDSFJPTUUgSEFSRFdBUkUgUExBVEZPUk0gU1VQUE9SVAogTToJT2xvZiBKb2hhbnNzb24gPG9sb2ZAbGl4b20ubmV0PgogUzoJTWFpbnRhaW5lZApAQCAtMjgxNiw2ICsyODIzLDcgQEAKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvaGVyYmVydC9jcnlwdG8tMi42LmdpdAogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi9jcnlwdG8vCitGOglEb2N1bWVudGF0aW9uL0RvY0Jvb2svY3J5cHRvLUFQSS50bXBsCiBGOglhcmNoLyovY3J5cHRvLwogRjoJY3J5cHRvLwogRjoJZHJpdmVycy9jcnlwdG8vCkBAIC0yODg2LDExICsyODk0LDExIEBACiBGOglkcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzLwogCiBDWEdCMyBJU0NTSSBEUklWRVIgKENYR0IzSSkKLU06ICAgICAgS2FyZW4gWGllIDxreGllQGNoZWxzaW8uY29tPgotTDogICAgICBsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwotVzogICAgICBodHRwOi8vd3d3LmNoZWxzaW8uY29tCi1TOiAgICAgIFN1cHBvcnRlZAotRjogICAgICBkcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjNpCitNOglLYXJlbiBYaWUgPGt4aWVAY2hlbHNpby5jb20+CitMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL3d3dy5jaGVsc2lvLmNvbQorUzoJU3VwcG9ydGVkCitGOglkcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjNpCiAKIENYR0IzIElXQVJQIFJOSUMgRFJJVkVSIChJV19DWEdCMykKIE06CVN0ZXZlIFdpc2UgPHN3aXNlQGNoZWxzaW8uY29tPgpAQCAtMjkwNywxMSArMjkxNSwxMSBAQAogRjoJZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC8KIAogQ1hHQjQgSVNDU0kgRFJJVkVSIChDWEdCNEkpCi1NOiAgICAgIEthcmVuIFhpZSA8a3hpZUBjaGVsc2lvLmNvbT4KLUw6ICAgICAgbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKLVc6ICAgICAgaHR0cDovL3d3dy5jaGVsc2lvLmNvbQotUzogICAgICBTdXBwb3J0ZWQKLUY6ICAgICAgZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aQorTToJS2FyZW4gWGllIDxreGllQGNoZWxzaW8uY29tPgorTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKK1c6CWh0dHA6Ly93d3cuY2hlbHNpby5jb20KK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aQogCiBDWEdCNCBJV0FSUCBSTklDIERSSVZFUiAoSVdfQ1hHQjQpCiBNOglTdGV2ZSBXaXNlIDxzd2lzZUBjaGVsc2lvLmNvbT4KQEAgLTMxMzcsMTIgKzMxNDUsMTUgQEAKIEY6CURvY3VtZW50YXRpb24vaHdtb24vZGE5MD8/CiBGOglkcml2ZXJzL2dwaW8vZ3Bpby1kYTkwPz8uYwogRjoJZHJpdmVycy9od21vbi9kYTkwPz8taHdtb24uYworRjoJZHJpdmVycy9paW8vYWRjL2RhOTE/Py0qLmMKIEY6CWRyaXZlcnMvaW5wdXQvbWlzYy9kYTkwPz9fb25rZXkuYwogRjoJZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9kYTkwNTJfdHNpLmMKIEY6CWRyaXZlcnMvbGVkcy9sZWRzLWRhOTA/Py5jCiBGOglkcml2ZXJzL21mZC9kYTkwM3guYwogRjoJZHJpdmVycy9tZmQvZGE5MD8/LSouYworRjoJZHJpdmVycy9tZmQvZGE5MT8/LSouYwogRjoJZHJpdmVycy9wb3dlci9kYTkwNTItYmF0dGVyeS5jCitGOglkcml2ZXJzL3Bvd2VyL2RhOTE/Py0qLmMKIEY6CWRyaXZlcnMvcmVndWxhdG9yL2RhOTAzeC5jCiBGOglkcml2ZXJzL3JlZ3VsYXRvci9kYTk/Pz8tcmVndWxhdG9yLltjaF0KIEY6CWRyaXZlcnMvcnRjL3J0Yy1kYTkwPz8uYwpAQCAtMzE1Miw2ICszMTYzLDcgQEAKIEY6CWluY2x1ZGUvbGludXgvbWZkL2RhOTA1Mi8KIEY6CWluY2x1ZGUvbGludXgvbWZkL2RhOTA1NS8KIEY6CWluY2x1ZGUvbGludXgvbWZkL2RhOTA2My8KK0Y6CWluY2x1ZGUvbGludXgvbWZkL2RhOTE1MC8KIEY6CWluY2x1ZGUvc291bmQvZGFbNzldKi5oCiBGOglzb3VuZC9zb2MvY29kZWNzL2RhWzc5XSouW2NoXQogCkBAIC0zMjUyLDYgKzMyNjQsMTMgQEAKIEY6CURvY3VtZW50YXRpb24vaHdtb24vZG1lMTczNwogRjoJZHJpdmVycy9od21vbi9kbWUxNzM3LmMKIAorRE1JL1NNQklPUyBTVVBQT1JUCitNOglKZWFuIERlbHZhcmUgPGpkZWx2YXJlQHN1c2UuZGU+CitTOglNYWludGFpbmVkCitGOglkcml2ZXJzL2Zpcm13YXJlL2RtaS1pZC5jCitGOglkcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKK0Y6CWluY2x1ZGUvbGludXgvZG1pLmgKKwogRE9DS0lORyBTVEFUSU9OIERSSVZFUgogTToJU2hhb2h1YSBMaSA8c2hhb2h1YS5saUBpbnRlbC5jb20+CiBMOglsaW51eC1hY3BpQHZnZXIua2VybmVsLm9yZwpAQCAtNDE1Niw2ICs0MTc1LDEyIEBACiBGOglzb3VuZC9zb2MvZnNsL2lteCoKIEY6CXNvdW5kL3NvYy9mc2wvbXBjODYxMF9ocGNkLmMKIAorRlJFRVNDQUxFIFFPUklRIE1BTkFHRU1FTlQgQ09NUExFWCBEUklWRVIKK006CUouIEdlcm1hbiBSaXZlcmEgPEdlcm1hbi5SaXZlcmFAZnJlZXNjYWxlLmNvbT4KK0w6CWxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvc3RhZ2luZy9mc2wtbWMvCisKIEZSRUVWWEZTIEZJTEVTWVNURU0KIE06CUNocmlzdG9waCBIZWxsd2lnIDxoY2hAaW5mcmFkZWFkLm9yZz4KIFc6CWZ0cDovL2Z0cC5vcGVubGludXgub3JnL3B1Yi9wZW9wbGUvaGNoL3Z4ZnMKQEAgLTQzMDUsNiArNDMzMCwxNSBAQAogRjoJZHJpdmVycy9waHkvCiBGOglpbmNsdWRlL2xpbnV4L3BoeS8KIAorR0VORVJJQyBQTSBET01BSU5TCitNOgkiUmFmYWVsIEouIFd5c29ja2kiIDxyandAcmp3eXNvY2tpLm5ldD4KK006CUtldmluIEhpbG1hbiA8a2hpbG1hbkBrZXJuZWwub3JnPgorTToJVWxmIEhhbnNzb24gPHVsZi5oYW5zc29uQGxpbmFyby5vcmc+CitMOglsaW51eC1wbUB2Z2VyLmtlcm5lbC5vcmcKK1M6CVN1cHBvcnRlZAorRjoJZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbiouYworRjoJaW5jbHVkZS9saW51eC9wbV9kb21haW4uaAorCiBHRU5FUklDIFVJTyBEUklWRVIgRk9SIFBDSSBERVZJQ0VTCiBNOgkiTWljaGFlbCBTLiBUc2lya2luIiA8bXN0QHJlZGhhdC5jb20+CiBMOglrdm1Admdlci5rZXJuZWwub3JnCkBAIC00MzE4LDEwICs0MzUyLDEwIEBACiAKIEdGUzIgRklMRSBTWVNURU0KIE06CVN0ZXZlbiBXaGl0ZWhvdXNlIDxzd2hpdGVob0ByZWRoYXQuY29tPgorTToJQm9iIFBldGVyc29uIDxycGV0ZXJzb0ByZWRoYXQuY29tPgogTDoJY2x1c3Rlci1kZXZlbEByZWRoYXQuY29tCiBXOglodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2NsdXN0ZXIvCi1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3N0ZXZlL2dmczItMy4wLWZpeGVzLmdpdAotVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9zdGV2ZS9nZnMyLTMuMC1ubXcuZ2l0CitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2dmczIvbGludXgtZ2ZzMi5naXQKIFM6CVN1cHBvcnRlZAogRjoJRG9jdW1lbnRhdGlvbi9maWxlc3lzdGVtcy9nZnMyKi50eHQKIEY6CWZzL2dmczIvCkBAIC00OTQxLDYgKzQ5NzUsNyBAQAogRjoJZHJpdmVycy9paW8vCiBGOglkcml2ZXJzL3N0YWdpbmcvaWlvLwogRjoJaW5jbHVkZS9saW51eC9paW8vCitGOgl0b29scy9paW8vCiAKIElLQU5PUy9BREkgRUFHTEUgQURTTCBVU0IgRFJJVkVSCiBNOglNYXR0aGlldSBDYXN0ZXQgPGNhc3RldC5tYXR0aGlldUBmcmVlLmZyPgpAQCAtNTA4Nyw3ICs1MTIyLDcgQEAKIEY6CWRyaXZlcnMvcGxhdGZvcm0veDg2L2ludGVsX21lbmxvdy5jCiAKIElOVEVMIElBMzIgTUlDUk9DT0RFIFVQREFURSBTVVBQT1JUCi1NOglUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51az4KK006CUJvcmlzbGF2IFBldGtvdiA8YnBAYWxpZW44LmRlPgogUzoJTWFpbnRhaW5lZAogRjoJYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvY29yZSoKIEY6CWFyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2ludGVsKgpAQCAtNTEyOCwyMiArNTE2MywyMSBAQAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9peHA0eHgtcm5nLmMKIAotSU5URUwgRVRIRVJORVQgRFJJVkVSUyAoZTEwMC9lMTAwMC9lMTAwMGUvZm0xMGsvaWdiL2lnYnZmL2l4Z2IvaXhnYmUvaXhnYmV2Zi9pNDBlL2k0MGV2ZikKK0lOVEVMIEVUSEVSTkVUIERSSVZFUlMKIE06CUplZmYgS2lyc2hlciA8amVmZnJleS50LmtpcnNoZXJAaW50ZWwuY29tPgotTToJSmVzc2UgQnJhbmRlYnVyZyA8amVzc2UuYnJhbmRlYnVyZ0BpbnRlbC5jb20+Ci1NOglCcnVjZSBBbGxhbiA8YnJ1Y2Uudy5hbGxhbkBpbnRlbC5jb20+Ci1NOglDYXJvbHluIFd5Ym9ybnkgPGNhcm9seW4ud3lib3JueUBpbnRlbC5jb20+Ci1NOglEb24gU2tpZG1vcmUgPGRvbmFsZC5jLnNraWRtb3JlQGludGVsLmNvbT4KLU06CUdyZWcgUm9zZSA8Z3JlZ29yeS52LnJvc2VAaW50ZWwuY29tPgotTToJTWF0dGhldyBWaWNrIDxtYXR0aGV3LnZpY2tAaW50ZWwuY29tPgotTToJSm9obiBSb25jaWFrIDxqb2huLnJvbmNpYWtAaW50ZWwuY29tPgotTToJTWl0Y2ggV2lsbGlhbXMgPG1pdGNoLmEud2lsbGlhbXNAaW50ZWwuY29tPgotTToJTGludXggTklDUyA8bGludXgubmljc0BpbnRlbC5jb20+Ci1MOgllMTAwMC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKK1I6CUplc3NlIEJyYW5kZWJ1cmcgPGplc3NlLmJyYW5kZWJ1cmdAaW50ZWwuY29tPgorUjoJU2hhbm5vbiBOZWxzb24gPHNoYW5ub24ubmVsc29uQGludGVsLmNvbT4KK1I6CUNhcm9seW4gV3lib3JueSA8Y2Fyb2x5bi53eWJvcm55QGludGVsLmNvbT4KK1I6CURvbiBTa2lkbW9yZSA8ZG9uYWxkLmMuc2tpZG1vcmVAaW50ZWwuY29tPgorUjoJTWF0dGhldyBWaWNrIDxtYXR0aGV3LnZpY2tAaW50ZWwuY29tPgorUjoJSm9obiBSb25jaWFrIDxqb2huLnJvbmNpYWtAaW50ZWwuY29tPgorUjoJTWl0Y2ggV2lsbGlhbXMgPG1pdGNoLmEud2lsbGlhbXNAaW50ZWwuY29tPgorTDoJaW50ZWwtd2lyZWQtbGFuQGxpc3RzLm9zdW9zbC5vcmcKIFc6CWh0dHA6Ly93d3cuaW50ZWwuY29tL3N1cHBvcnQvZmVlZGJhY2suaHRtCiBXOglodHRwOi8vZTEwMDAuc291cmNlZm9yZ2UubmV0LwotVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qa2lyc2hlci9uZXQuZ2l0Ci1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2praXJzaGVyL25ldC1uZXh0LmdpdAorUToJaHR0cDovL3BhdGNod29yay5vemxhYnMub3JnL3Byb2plY3QvaW50ZWwtd2lyZWQtbGFuL2xpc3QvCitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2praXJzaGVyL25ldC1xdWV1ZS5naXQKK1Q6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvamtpcnNoZXIvbmV4dC1xdWV1ZS5naXQKIFM6CVN1cHBvcnRlZAogRjoJRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2UxMDAudHh0CiBGOglEb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvZTEwMDAudHh0CkBAIC01MTg3LDcgKzUyMjEsNyBAQAogSU5URUwgV0lSRUxFU1MgV0lNQVggQ09OTkVDVElPTiAyNDAwCiBNOglJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgogTToJbGludXgtd2ltYXhAaW50ZWwuY29tCi1MOiAgICAgd2ltYXhAbGludXh3aW1heC5vcmcgKHN1YnNjcmliZXJzLW9ubHkpCitMOgl3aW1heEBsaW51eHdpbWF4Lm9yZyAoc3Vic2NyaWJlcnMtb25seSkKIFM6CVN1cHBvcnRlZAogVzoJaHR0cDovL2xpbnV4d2ltYXgub3JnCiBGOglEb2N1bWVudGF0aW9uL3dpbWF4L1JFQURNRS5pMjQwMG0KQEAgLTUyNjUsNiArNTI5OSwxMyBAQAogRjoJaW5jbHVkZS9saW51eC9pcG1pKgogRjoJaW5jbHVkZS91YXBpL2xpbnV4L2lwbWkqCiAKK1FDT00gQVVESU8gKEFTb0MpIERSSVZFUlMKK006CVBhdHJpY2sgTGFpIDxwbGFpQGNvZGVhdXJvcmEub3JnPgorTToJQmFuYWppdCBHb3N3YW1pIDxiZ29zd2FtaUBjb2RlYXVyb3JhLm9yZz4KK0w6CWFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitTOglTdXBwb3J0ZWQKK0Y6CXNvdW5kL3NvYy9xY29tLworCiBJUFMgU0NTSSBSQUlEIERSSVZFUgogTToJQWRhcHRlYyBPRU0gUmFpZCBTb2x1dGlvbnMgPGFhY3JhaWRAYWRhcHRlYy5jb20+CiBMOglsaW51eC1zY3NpQHZnZXIua2VybmVsLm9yZwpAQCAtNTU4NSw2ICs1NjI2LDggQEAKIEY6CURvY3VtZW50YXRpb24vKi9rdm0qLnR4dAogRjoJRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS8KIEY6CWFyY2gvKi9rdm0vCitGOglhcmNoL3g4Ni9rZXJuZWwva3ZtLmMKK0Y6CWFyY2gveDg2L2tlcm5lbC9rdm1jbG9jay5jCiBGOglhcmNoLyovaW5jbHVkZS9hc20va3ZtKgogRjoJaW5jbHVkZS9saW51eC9rdm0qCiBGOglpbmNsdWRlL3VhcGkvbGludXgva3ZtKgpAQCAtNTg4MSw3ICs1OTI0LDcgQEAKIEY6CWFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNTJ4eC8KIAogTElOVVggRk9SIFBPV0VSUEMgRU1CRURERUQgUFBDNFhYCi1NOiAgQWxpc3RhaXIgUG9wcGxlIDxhbGlzdGFpckBwb3BwbGUuaWQuYXU+CitNOglBbGlzdGFpciBQb3BwbGUgPGFsaXN0YWlyQHBvcHBsZS5pZC5hdT4KIE06CU1hdHQgUG9ydGVyIDxtcG9ydGVyQGtlcm5lbC5jcmFzaGluZy5vcmc+CiBXOglodHRwOi8vd3d3LnBlbmd1aW5wcGMub3JnLwogTDoJbGludXhwcGMtZGV2QGxpc3RzLm96bGFicy5vcmcKQEAgLTYzMTYsNiArNjM1OSw3IEBACiAKIE1FTExBTk9YIEVUSEVSTkVUIERSSVZFUiAobWx4NF9lbikKIE06CUFtaXIgVmFkYWkgPGFtaXJ2QG1lbGxhbm94LmNvbT4KK006CUlkbyBTaGFtYXkgPGlkb3NAbWVsbGFub3guY29tPgogTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwogUzoJU3VwcG9ydGVkCiBXOglodHRwOi8vd3d3Lm1lbGxhbm94LmNvbQpAQCAtNjM1Myw3ICs2Mzk3LDcgQEAKIEY6CWRyaXZlcnMvd2F0Y2hkb2cvbWVuYTIxX3dkdC5jCiAKIE1FTiBDSEFNRUxFT04gQlVTIChtY2IpCi1NOiAgCUpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4KK006CUpvaGFubmVzIFRodW1zaGlybiA8am9oYW5uZXMudGh1bXNoaXJuQG1lbi5kZT4KIFM6CVN1cHBvcnRlZAogRjoJZHJpdmVycy9tY2IvCiBGOglpbmNsdWRlL2xpbnV4L21jYi5oCkBAIC02NTU4LDEwICs2NjAyLDggQEAKIEY6CWluY2x1ZGUvbGludXgvbWZkLwogCiBNVUxUSU1FRElBIENBUkQgKE1NQyksIFNFQ1VSRSBESUdJVEFMIChTRCkgQU5EIFNESU8gU1VCU1lTVEVNCi1NOglDaHJpcyBCYWxsIDxjaHJpc0BwcmludGYubmV0PgogTToJVWxmIEhhbnNzb24gPHVsZi5oYW5zc29uQGxpbmFyby5vcmc+CiBMOglsaW51eC1tbWNAdmdlci5rZXJuZWwub3JnCi1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2NqYi9tbWMuZ2l0CiBUOglnaXQgZ2l0Oi8vZ2l0LmxpbmFyby5vcmcvcGVvcGxlL3VsZi5oYW5zc29uL21tYy5naXQKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvbW1jLwpAQCAtNjkzNyw2ICs2OTc5LDEzIEBACiBGOglkcml2ZXJzL2Jsb2NrL252bWUqCiBGOglpbmNsdWRlL2xpbnV4L252bWUuaAogCitOWFAtTkNJIE5GQyBEUklWRVIKK006CUNsw6ltZW50IFBlcnJvY2hhdWQgPGNsZW1lbnQucGVycm9jaGF1ZEBlZmZpbm5vdi5jb20+CitSOglDaGFybGVzIEdvcmFuZCA8Y2hhcmxlcy5nb3JhbmRAZWZmaW5ub3YuY29tPgorTDoJbGludXgtbmZjQGxpc3RzLjAxLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvbmZjL254cC1uY2kKKwogTlhQIFREQTk5OFggRFJNIERSSVZFUgogTToJUnVzc2VsbCBLaW5nIDxybWsra2VybmVsQGFybS5saW51eC5vcmcudWs+CiBTOglTdXBwb3J0ZWQKQEAgLTc5MDQsMTAgKzc5NTMsMTAgQEAKIFM6CU1haW50YWluZWQKIAogUUFUIERSSVZFUgotTTogICAgICBUYWRldXN6IFN0cnVrIDx0YWRldXN6LnN0cnVrQGludGVsLmNvbT4KLUw6ICAgICAgcWF0LWxpbnV4QGludGVsLmNvbQotUzogICAgICBTdXBwb3J0ZWQKLUY6ICAgICAgZHJpdmVycy9jcnlwdG8vcWF0LworTToJVGFkZXVzeiBTdHJ1ayA8dGFkZXVzei5zdHJ1a0BpbnRlbC5jb20+CitMOglxYXQtbGludXhAaW50ZWwuY29tCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvY3J5cHRvL3FhdC8KIAogUUlCIERSSVZFUgogTToJTWlrZSBNYXJjaW5pc3p5biA8aW5maW5pcGF0aEBpbnRlbC5jb20+CkBAIC04MzQ1LDcgKzgzOTQsNiBAQAogCiBTMzkwIE5FVFdPUksgRFJJVkVSUwogTToJVXJzdWxhIEJyYXVuIDx1cnN1bGEuYnJhdW5AZGUuaWJtLmNvbT4KLU06CUZyYW5rIEJsYXNjaGthIDxibGFzY2hrYUBsaW51eC52bmV0LmlibS5jb20+CiBNOglsaW51eDM5MEBkZS5pYm0uY29tCiBMOglsaW51eC1zMzkwQHZnZXIua2VybmVsLm9yZwogVzoJaHR0cDovL3d3dy5pYm0uY29tL2RldmVsb3BlcndvcmtzL2xpbnV4L2xpbnV4MzkwLwpAQCAtODU1Myw2ICs4NjAxLDcgQEAKIEY6CWtlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKIEY6CWtlcm5lbC90aW1lL3RpbWUqLmMKIEY6CWtlcm5lbC90aW1lL250cC5jCitGOgl0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvCiAKIFNDMTIwMCBXRFQgRFJJVkVSCiBNOglad2FuZSBNd2Fpa2FtYm8gPHp3YW5lbUBnbWFpbC5jb20+CkBAIC04NjYxLDEwICs4NzEwLDggQEAKIEY6CWRyaXZlcnMvbW1jL2hvc3Qvc2RyaWNvaF9jcy5jCiAKIFNFQ1VSRSBESUdJVEFMIEhPU1QgQ09OVFJPTExFUiBJTlRFUkZBQ0UgKFNESENJKSBEUklWRVIKLU06CUNocmlzIEJhbGwgPGNocmlzQHByaW50Zi5uZXQ+CiBMOglsaW51eC1tbWNAdmdlci5rZXJuZWwub3JnCi1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2NqYi9tbWMuZ2l0Ci1TOglNYWludGFpbmVkCitTOglPcnBoYW4KIEY6CWRyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuKgogRjoJZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5bY2hdCiAKQEAgLTg2ODAsMTggKzg3MjcsMTIgQEAKIEs6CVxic2VjdXJlX2NvbXB1dGluZwogSzoJXGJUSUZfU0VDQ09NUFxiCiAKLVNFQ1VSRSBESUdJVEFMIEhPU1QgQ09OVFJPTExFUiBJTlRFUkZBQ0UsIE9QRU4gRklSTVdBUkUgQklORElOR1MgKFNESENJLU9GKQotTToJQW50b24gVm9yb250c292IDxhbnRvbkBlbm9tc2cub3JnPgotTDoJbGludXhwcGMtZGV2QGxpc3RzLm96bGFicy5vcmcKLUw6CWxpbnV4LW1tY0B2Z2VyLmtlcm5lbC5vcmcKLVM6CU1haW50YWluZWQKLUY6CWRyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uW2NoXQotCiBTRUNVUkUgRElHSVRBTCBIT1NUIENPTlRST0xMRVIgSU5URVJGQUNFIChTREhDSSkgU0FNU1VORyBEUklWRVIKIE06CUJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4KK006CUphZWhvb24gQ2h1bmcgPGpoODAuY2h1bmdAc2Ftc3VuZy5jb20+CiBMOglsaW51eC1tbWNAdmdlci5rZXJuZWwub3JnCiBTOglNYWludGFpbmVkCi1GOglkcml2ZXJzL21tYy9ob3N0L3NkaGNpLXMzYy5jCitGOglkcml2ZXJzL21tYy9ob3N0L3NkaGNpLXMzYyoKIAogU0VDVVJFIERJR0lUQUwgSE9TVCBDT05UUk9MTEVSIElOVEVSRkFDRSAoU0RIQ0kpIFNUIFNQRUFSIERSSVZFUgogTToJVmlyZXNoIEt1bWFyIDx2aXJlc2gubGludXhAZ21haWwuY29tPgpAQCAtOTM1OCw2ICs5Mzk5LDE0IEBACiBTOglNYWludGFpbmVkCiBGOglkcml2ZXJzL3N0YWdpbmcvc203eHhmYi8KIAorU1RBR0lORyAtIFNJTElDT04gTU9USU9OIFNNNzUwIEZSQU1FIEJVRkZFUiBEUklWRVIKK006CVN1ZGlwIE11a2hlcmplZSA8c3VkaXBtLm11a2hlcmplZUBnbWFpbC5jb20+CitNOglUZWRkeSBXYW5nIDx0ZWRkeS53YW5nQHNpbGljb25tb3Rpb24uY29tPgorTToJU3VkaXAgTXVraGVyamVlIDxzdWRpcEB2ZWN0b3JpbmRpYS5vcmc+CitMOglsaW51eC1mYmRldkB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvc3RhZ2luZy9zbTc1MGZiLworCiBTVEFHSU5HIC0gU0xJQ09TUwogTToJTGlvciBEb3RhbiA8bGlvZG90QGdtYWlsLmNvbT4KIE06CUNocmlzdG9waGVyIEhhcnJlciA8Y2hhcnJlckBhbGFjcml0ZWNoLmNvbT4KQEAgLTk4MjAsNyArOTg2OSw3IEBACiAKIFRJUEMgTkVUV09SSyBMQVlFUgogTToJSm9uIE1hbG95IDxqb24ubWFsb3lAZXJpY3Nzb24uY29tPgotTToJQWxsYW4gU3RlcGhlbnMgPGFsbGFuLnN0ZXBoZW5zQHdpbmRyaXZlci5jb20+CitNOglZaW5nIFh1ZSA8eWluZy54dWVAd2luZHJpdmVyLmNvbT4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcgKGNvcmUga2VybmVsIGNvZGUpCiBMOgl0aXBjLWRpc2N1c3Npb25AbGlzdHMuc291cmNlZm9yZ2UubmV0ICh1c2VyIGFwcHMsIGdlbmVyYWwgZGlzY3Vzc2lvbikKIFc6CWh0dHA6Ly90aXBjLnNvdXJjZWZvcmdlLm5ldC8KQEAgLTk5MjQsNiArOTk3Myw3IEBACiBUUE0gREVWSUNFIERSSVZFUgogTToJUGV0ZXIgSHVld2UgPHBldGVyaHVld2VAZ214LmRlPgogTToJTWFyY2VsIFNlbGhvcnN0IDx0cG1kZEBzZWxob3JzdC5uZXQ+CitSOglKYXNvbiBHdW50aG9ycGUgPGpndW50aG9ycGVAb2JzaWRpYW5yZXNlYXJjaC5jb20+CiBXOglodHRwOi8vdHBtZGQuc291cmNlZm9yZ2UubmV0CiBMOgl0cG1kZC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogUToJZ2l0IGdpdDovL2dpdGh1Yi5jb20vUGV0ZXJIdWV3ZS9saW51eC10cG1kZC5naXQKQEAgLTEwMDc3LDExICsxMDEyNywxMSBAQAogRjoJaW5jbHVkZS91YXBpL2xpbnV4L2Nkcm9tLmgKIAogVU5JU1lTIFMtUEFSIERSSVZFUlMKLU06ICAgICBCZW5qYW1pbiBSb21lciA8YmVuamFtaW4ucm9tZXJAdW5pc3lzLmNvbT4KLU06ICAgICBEYXZpZCBLZXJzaG5lciA8ZGF2aWQua2Vyc2huZXJAdW5pc3lzLmNvbT4KLUw6ICAgICBzcGFybWFpbnRhaW5lckB1bmlzeXMuY29tIChVbmlzeXMgaW50ZXJuYWwpCi1TOiAgICAgU3VwcG9ydGVkCi1GOiAgICAgZHJpdmVycy9zdGFnaW5nL3VuaXN5cy8KK006CUJlbmphbWluIFJvbWVyIDxiZW5qYW1pbi5yb21lckB1bmlzeXMuY29tPgorTToJRGF2aWQgS2Vyc2huZXIgPGRhdmlkLmtlcnNobmVyQHVuaXN5cy5jb20+CitMOglzcGFybWFpbnRhaW5lckB1bmlzeXMuY29tIChVbmlzeXMgaW50ZXJuYWwpCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvCiAKIFVOSVZFUlNBTCBGTEFTSCBTVE9SQUdFIEhPU1QgQ09OVFJPTExFUiBEUklWRVIKIE06CVZpbmF5YWsgSG9saWthdHRpIDx2aW5ob2xpa2F0dGlAZ21haWwuY29tPgpAQCAtMTAxMjksNiArMTAxNzksMTIgQEAKIEY6CWRyaXZlcnMvbmV0L3VzYi9jZGNfKi5jCiBGOglpbmNsdWRlL3VhcGkvbGludXgvdXNiL2NkYy5oCiAKK1VTQiBDSEFPU0tFWSBEUklWRVIKK006CUtlaXRoIFBhY2thcmQgPGtlaXRocEBrZWl0aHAuY29tPgorTDoJbGludXgtdXNiQHZnZXIua2VybmVsLm9yZworUzoJTWFpbnRhaW5lZAorRjoJZHJpdmVycy91c2IvbWlzYy9jaGFvc2tleS5jCisKIFVTQiBDWVBSRVNTIEM2N1gwMCBEUklWRVIKIE06CVBldGVyIEtvcnNnYWFyZCA8amFjbWV0QHN1bnNpdGUuZGs+CiBMOglsaW51eC11c2JAdmdlci5rZXJuZWwub3JnCkBAIC0xMDIwNyw2ICsxMDI2MywxMyBAQAogRjoJRG9jdW1lbnRhdGlvbi91c2Ivb2hjaS50eHQKIEY6CWRyaXZlcnMvdXNiL2hvc3Qvb2hjaSoKIAorVVNCIE9URyBGU00gKEZpbml0ZSBTdGF0ZSBNYWNoaW5lKQorTToJUGV0ZXIgQ2hlbiA8UGV0ZXIuQ2hlbkBmcmVlc2NhbGUuY29tPgorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9wZXRlci5jaGVuL3VzYi5naXQKK0w6CWxpbnV4LXVzYkB2Z2VyLmtlcm5lbC5vcmcKK1M6CU1haW50YWluZWQKK0Y6CWRyaXZlcnMvdXNiL2NvbW1vbi91c2Itb3RnLWZzbS5jCisKIFVTQiBPVkVSIElQIERSSVZFUgogTToJVmFsZW50aW5hIE1hbmVhIDx2YWxlbnRpbmEubWFuZWEubUBnbWFpbC5jb20+CiBNOglTaHVhaCBLaGFuIDxzaHVhaC5raEBzYW1zdW5nLmNvbT4KQEAgLTEwNjI1LDcgKzEwNjg4LDcgQEAKIFdJTUFYIFNUQUNLCiBNOglJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPgogTToJbGludXgtd2ltYXhAaW50ZWwuY29tCi1MOiAgICAgd2ltYXhAbGludXh3aW1heC5vcmcgKHN1YnNjcmliZXJzLW9ubHkpCitMOgl3aW1heEBsaW51eHdpbWF4Lm9yZyAoc3Vic2NyaWJlcnMtb25seSkKIFM6CVN1cHBvcnRlZAogVzoJaHR0cDovL2xpbnV4d2ltYXgub3JnCiBGOglEb2N1bWVudGF0aW9uL3dpbWF4L1JFQURNRS53aW1heApAQCAtMTA5MTYsNiArMTA5NzksNyBAQAogUzoJTWFpbnRhaW5lZAogRjoJbW0venNtYWxsb2MuYwogRjoJaW5jbHVkZS9saW51eC96c21hbGxvYy5oCitGOglEb2N1bWVudGF0aW9uL3ZtL3pzbWFsbG9jLnR4dAogCiBaU1dBUCBDT01QUkVTU0VEIFNXQVAgQ0FDSElORwogTToJU2V0aCBKZW5uaW5ncyA8c2plbm5pbmdzQHZhcmlhbnR3ZWIubmV0PgpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQppbmRleCBlNzM0OTY1Li42Y2M1YjI0IDEwMDY0NAotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtlZmlsZQpAQCAtMSw3ICsxLDcgQEAKIFZFUlNJT04gPSA0CiBQQVRDSExFVkVMID0gMAogU1VCTEVWRUwgPSAwCi1FWFRSQVZFUlNJT04gPSAtcmM0CitFWFRSQVZFUlNJT04gPQogTkFNRSA9IEh1cnIgZHVyciBJJ21hIHNoZWVwCiAKICMgKkRPQ1VNRU5UQVRJT04qCkBAIC0xMCw5ICsxMCwxMCBAQAogIyBDb21tZW50cyBpbiB0aGlzIGZpbGUgYXJlIHRhcmdldGVkIG9ubHkgdG8gdGhlIGRldmVsb3BlciwgZG8gbm90CiAjIGV4cGVjdCB0byBsZWFybiBob3cgdG8gYnVpbGQgdGhlIGtlcm5lbCByZWFkaW5nIHRoaXMgZmlsZS4KIAotIyBEbyBub3QgdXNlIG1ha2UncyBidWlsdC1pbiBydWxlcyBhbmQgdmFyaWFibGVzCi0jICh0aGlzIGluY3JlYXNlcyBwZXJmb3JtYW5jZSBhbmQgYXZvaWRzIGhhcmQtdG8tZGVidWcgYmVoYXZpb3VyKTsKLU1BS0VGTEFHUyArPSAtclIKKyMgbyBEbyBub3QgdXNlIG1ha2UncyBidWlsdC1pbiBydWxlcyBhbmQgdmFyaWFibGVzCisjICAgKHRoaXMgaW5jcmVhc2VzIHBlcmZvcm1hbmNlIGFuZCBhdm9pZHMgaGFyZC10by1kZWJ1ZyBiZWhhdmlvdXIpOworIyBvIExvb2sgZm9yIG1ha2UgaW5jbHVkZSBmaWxlcyByZWxhdGl2ZSB0byByb290IG9mIGtlcm5lbCBzcmMKK01BS0VGTEFHUyArPSAtclIgLS1pbmNsdWRlLWRpcj0kKENVUkRJUikKIAogIyBBdm9pZCBmdW5ueSBjaGFyYWN0ZXIgc2V0IGRlcGVuZGVuY2llcwogdW5leHBvcnQgTENfQUxMCkBAIC0zNDQsMTIgKzM0NSw5IEBACiBleHBvcnQgQ09NUElMRVIKIGVuZGlmCiAKLSMgTG9vayBmb3IgbWFrZSBpbmNsdWRlIGZpbGVzIHJlbGF0aXZlIHRvIHJvb3Qgb2Yga2VybmVsIHNyYwotTUFLRUZMQUdTICs9IC0taW5jbHVkZS1kaXI9JChzcmN0cmVlKQotCiAjIFdlIG5lZWQgc29tZSBnZW5lcmljIGRlZmluaXRpb25zIChkbyBub3QgdHJ5IHRvIHJlbWFrZSB0aGUgZmlsZSkuCi0kKHNyY3RyZWUpL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGU6IDsKLWluY2x1ZGUgJChzcmN0cmVlKS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCitzY3JpcHRzL0tidWlsZC5pbmNsdWRlOiA7CitpbmNsdWRlIHNjcmlwdHMvS2J1aWxkLmluY2x1ZGUKIAogIyBNYWtlIHZhcmlhYmxlcyAoQ0MsIGV0Yy4uLikKIEFTCQk9ICQoQ1JPU1NfQ09NUElMRSlhcwpAQCAtNTMzLDcgKzUzMSw3IEBACiAjIFJlYWQgYXJjaCBzcGVjaWZpYyBNYWtlZmlsZSB0byBzZXQgS0JVSUxEX0RFRkNPTkZJRyBhcyBuZWVkZWQuCiAjIEtCVUlMRF9ERUZDT05GSUcgbWF5IHBvaW50IG91dCBhbiBhbHRlcm5hdGl2ZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KICMgdXNlZCBmb3IgJ21ha2UgZGVmY29uZmlnJwotaW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gvJChTUkNBUkNIKS9NYWtlZmlsZQoraW5jbHVkZSBhcmNoLyQoU1JDQVJDSCkvTWFrZWZpbGUKIGV4cG9ydCBLQlVJTERfREVGQ09ORklHIEtCVUlMRF9LQ09ORklHCiAKIGNvbmZpZzogc2NyaXB0c19iYXNpYyBvdXRwdXRtYWtlZmlsZSBGT1JDRQpAQCAtNjA5LDcgKzYwNyw3IEBACiAjIERlZmF1bHRzIHRvIHZtbGludXgsIGJ1dCB0aGUgYXJjaCBtYWtlZmlsZSB1c3VhbGx5IGFkZHMgZnVydGhlciB0YXJnZXRzCiBhbGw6IHZtbGludXgKIAotaW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gvJChTUkNBUkNIKS9NYWtlZmlsZQoraW5jbHVkZSBhcmNoLyQoU1JDQVJDSCkvTWFrZWZpbGUKIAogS0JVSUxEX0NGTEFHUwkrPSAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tZGVsZXRlLW51bGwtcG9pbnRlci1jaGVja3MsKQogCkBAIC03NzksMTAgKzc3NywxMSBAQAogIyBjaGVjayBmb3IgJ2FzbSBnb3RvJwogaWZlcSAoJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL2djYy1nb3RvLnNoICQoQ0MpKSwgeSkKIAlLQlVJTERfQ0ZMQUdTICs9IC1EQ0NfSEFWRV9BU01fR09UTworCUtCVUlMRF9BRkxBR1MgKz0gLURDQ19IQVZFX0FTTV9HT1RPCiBlbmRpZgogCi1pbmNsdWRlICQoc3JjdHJlZSkvc2NyaXB0cy9NYWtlZmlsZS5rYXNhbgotaW5jbHVkZSAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUuZXh0cmF3YXJuCitpbmNsdWRlIHNjcmlwdHMvTWFrZWZpbGUua2FzYW4KK2luY2x1ZGUgc2NyaXB0cy9NYWtlZmlsZS5leHRyYXdhcm4KIAogIyBBZGQgdXNlciBzdXBwbGllZCBDUFBGTEFHUywgQUZMQUdTIGFuZCBDRkxBR1MgYXMgdGhlIGxhc3QgYXNzaWdubWVudHMKIEtCVUlMRF9DUFBGTEFHUyArPSAkKEtDUFBGTEFHUykKQEAgLTEwMjYsMTIgKzEwMjUsNiBAQAogCSQoc3JjdHJlZSkvc2NyaXB0cy9oZWFkZXJkZXAucGwgLUkkKHNyY3RyZWUpL2luY2x1ZGUKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUEhPTlkgKz0gZGVwZW5kIGRlcAotZGVwZW5kIGRlcDoKLQlAZWNobyAnKioqIFdhcm5pbmc6IG1ha2UgJEAgaXMgdW5uZWNlc3Nhcnkgbm93LicKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgRmlybXdhcmUgaW5zdGFsbAogSU5TVEFMTF9GV19QQVRIPSQoSU5TVEFMTF9NT0RfUEFUSCkvbGliL2Zpcm13YXJlCiBleHBvcnQgSU5TVEFMTF9GV19QQVRICmRpZmYgLS1naXQgYS9hcmNoL0tjb25maWcgYi9hcmNoL0tjb25maWcKaW5kZXggMGNjNjA1ZC4uYTY1ZWFmYiAxMDA2NDQKLS0tIGEvYXJjaC9LY29uZmlnCisrKyBiL2FyY2gvS2NvbmZpZwpAQCAtNDQ2LDYgKzQ0Niw5IEBACiBjb25maWcgSEFWRV9BUkNIX1RSQU5TUEFSRU5UX0hVR0VQQUdFCiAJYm9vbAogCitjb25maWcgSEFWRV9BUkNIX0hVR0VfVk1BUAorCWJvb2wKKwogY29uZmlnIEhBVkVfQVJDSF9TT0ZUX0RJUlRZCiAJYm9vbAogCkBAIC00ODQsNiArNDg3LDE4IEBACiAJICBUaGlzIHNwYXJlcyBhIHN0YWNrIHN3aXRjaCBhbmQgaW1wcm92ZXMgY2FjaGUgdXNhZ2Ugb24gc29mdGlycQogCSAgcHJvY2Vzc2luZy4KIAorY29uZmlnIFBHVEFCTEVfTEVWRUxTCisJaW50CisJZGVmYXVsdCAyCisKK2NvbmZpZyBBUkNIX0hBU19FTEZfUkFORE9NSVpFCisJYm9vbAorCWhlbHAKKwkgIEFuIGFyY2hpdGVjdHVyZSBzdXBwb3J0cyBjaG9vc2luZyByYW5kb21pemVkIGxvY2F0aW9ucyBmb3IKKwkgIHN0YWNrLCBtbWFwLCBicmssIGFuZCBFVF9EWU4uIERlZmluZWQgZnVuY3Rpb25zOgorCSAgLSBhcmNoX21tYXBfcm5kKCkKKwkgIC0gYXJjaF9yYW5kb21pemVfYnJrKCkKKwogIwogIyBBQkkgaGFsbCBvZiBzaGFtZQogIwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9LY29uZmlnIGIvYXJjaC9hbHBoYS9LY29uZmlnCmluZGV4IGI3ZmY5YTMuLmJmOWU5ZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvS2NvbmZpZworKysgYi9hcmNoL2FscGhhL0tjb25maWcKQEAgLTc2LDYgKzc2LDEwIEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgUEdUQUJMRV9MRVZFTFMKKwlpbnQKKwlkZWZhdWx0IDMKKwogc291cmNlICJpbml0L0tjb25maWciCiBzb3VyY2UgImtlcm5lbC9LY29uZmlnLmZyZWV6ZXIiCiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCBkNWI5OGFiLi4zMmU5MjBhIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xOCw3ICsxOCw2IEBACiAJdW5zaWduZWQgaW50CQlmbGFnczsJCS8qIGxvdyBsZXZlbCBmbGFncyAqLwogCXVuc2lnbmVkIGludAkJaWVlZV9zdGF0ZTsJLyogc2VlIGZwdS5oICovCiAKLQlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJbW1fc2VnbWVudF90CQlhZGRyX2xpbWl0OwkvKiB0aHJlYWQgYWRkcmVzcyBzcGFjZSAqLwogCXVuc2lnbmVkCQljcHU7CQkvKiBjdXJyZW50IENQVSAqLwogCWludAkJCXByZWVtcHRfY291bnQ7IC8qIDAgPT4gcHJlZW1wdGFibGUsIDwwID0+IEJVRyAqLwpAQCAtMzUsNyArMzQsNiBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCiB7CQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJXAotCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAlcCiAJLmFkZHJfbGltaXQJPSBLRVJORUxfRFMsCQlcCiAJLnByZWVtcHRfY291bnQJPSBJTklUX1BSRUVNUFRfQ09VTlQsCVwKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3BjaS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMKaW5kZXggOThhMTUyNS4uODJmNzM4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcGNpLmMKQEAgLTMzOCw2ICszMzgsOCBAQAogCiAJCWJ1cyA9IHBjaV9zY2FuX3Jvb3RfYnVzKE5VTEwsIG5leHRfYnVzbm8sIGFscGhhX212LnBjaV9vcHMsCiAJCQkJCWhvc2UsICZyZXNvdXJjZXMpOworCQlpZiAoIWJ1cykKKwkJCWNvbnRpbnVlOwogCQlob3NlLT5idXMgPSBidXM7CiAJCWhvc2UtPm5lZWRfZG9tYWluX2luZm8gPSBuZWVkX2RvbWFpbl9pbmZvOwogCQluZXh0X2J1c25vID0gYnVzLT5idXNuX3Jlcy5lbmQgKyAxOwpAQCAtMzUzLDYgKzM1NSwxMSBAQAogCiAJcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpOwogCXBjaV9maXh1cF9pcnFzKGFscGhhX212LnBjaV9zd2l6emxlLCBhbHBoYV9tdi5wY2lfbWFwX2lycSk7CisJZm9yIChob3NlID0gaG9zZV9oZWFkOyBob3NlOyBob3NlID0gaG9zZS0+bmV4dCkgeworCQlidXMgPSBob3NlLT5idXM7CisJCWlmIChidXMpCisJCQlwY2lfYnVzX2FkZF9kZXZpY2VzKGJ1cyk7CisJfQogfQogCiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3J0Yy5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvcnRjLmMKaW5kZXggYzhkMjg0ZC4uZjUzNWEzZiAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvcnRjLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvcnRjLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1hbHBoYV9ydGNfc2V0X21tc3Moc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIG5vd3RpbWUpCithbHBoYV9ydGNfc2V0X21tc3Moc3RydWN0IGRldmljZSAqZGV2LCB0aW1lNjRfdCBub3d0aW1lKQogewogCWludCByZXR2YWwgPSAwOwogCWludCByZWFsX3NlY29uZHMsIHJlYWxfbWludXRlcywgY21vc19taW51dGVzOwpAQCAtMjExLDcgKzIxMSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgYWxwaGFfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lID0gYWxwaGFfcnRjX3JlYWRfdGltZSwKIAkuc2V0X3RpbWUgPSBhbHBoYV9ydGNfc2V0X3RpbWUsCi0JLnNldF9tbXNzID0gYWxwaGFfcnRjX3NldF9tbXNzLAorCS5zZXRfbW1zczY0ID0gYWxwaGFfcnRjX3NldF9tbXNzLAogCS5pb2N0bCA9IGFscGhhX3J0Y19pb2N0bCwKIH07CiAKQEAgLTI3Niw3ICsyNzYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1yZW1vdGVfc2V0X21tc3Moc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIG5vdykKK3JlbW90ZV9zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHRpbWU2NF90IG5vdykKIHsKIAl1bmlvbiByZW1vdGVfZGF0YSB4OwogCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgIT0gYm9vdF9jcHVpZCkgewpAQCAtMjkwLDcgKzI5MCw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgcmVtb3RlX3J0Y19vcHMgPSB7CiAJLnJlYWRfdGltZSA9IHJlbW90ZV9yZWFkX3RpbWUsCiAJLnNldF90aW1lID0gcmVtb3RlX3NldF90aW1lLAotCS5zZXRfbW1zcyA9IHJlbW90ZV9zZXRfbW1zcywKKwkuc2V0X21tc3M2NCA9IHJlbW90ZV9zZXRfbW1zcywKIAkuaW9jdGwgPSBhbHBoYV9ydGNfaW9jdGwsCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbmF1dGlsdXMuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19uYXV0aWx1cy5jCmluZGV4IDgzN2MwZmEuLjcwMDY4NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19uYXV0aWx1cy5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19uYXV0aWx1cy5jCkBAIC0yMDcsNiArMjA3LDkgQEAKIAogCS8qIFNjYW4gb3VyIHNpbmdsZSBob3NlLiAgKi8KIAlidXMgPSBwY2lfc2Nhbl9idXMoMCwgYWxwaGFfbXYucGNpX29wcywgaG9zZSk7CisJaWYgKCFidXMpCisJCXJldHVybjsKKwogCWhvc2UtPmJ1cyA9IGJ1czsKIAlwY2liaW9zX2NsYWltX29uZV9idXMoYnVzKTsKIApAQCAtMjUzLDYgKzI1Niw3IEBACiAJICAgZm9yIHRoZSByb290IGJ1cywgc28ganVzdCBjbGVhciBpdC4gKi8KIAlidXMtPnNlbGYgPSBOVUxMOwogCXBjaV9maXh1cF9pcnFzKGFscGhhX212LnBjaV9zd2l6emxlLCBhbHBoYV9tdi5wY2lfbWFwX2lycSk7CisJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvYXJjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggMTE2M2ExOC4uYWNhMGQ1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2FyYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC00Myw3ICs0Myw2IEBACiAJaW50IHByZWVtcHRfY291bnQ7CQkvKiAwID0+IHByZWVtcHRhYmxlLCA8MCA9PiBCVUcgKi8KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KIAltbV9zZWdtZW50X3QgYWRkcl9saW1pdDsJLyogdGhyZWFkIGFkZHJlc3Mgc3BhY2UgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4gKmV4ZWNfZG9tYWluOy8qIGV4ZWN1dGlvbiBkb21haW4gKi8KIAlfX3UzMiBjcHU7CQkJLyogY3VycmVudCBDUFUgKi8KIAl1bnNpZ25lZCBsb25nIHRocl9wdHI7CQkvKiBUTFMgcHRyICovCiB9OwpAQCAtNTYsNyArNTUsNiBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCiB7CQkJCQkJXAogCS50YXNrICAgICAgID0gJnRzaywJCQlcCi0JLmV4ZWNfZG9tYWluICAgID0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKIAkuZmxhZ3MgICAgICA9IDAsCQkJXAogCS5jcHUgICAgICAgID0gMCwJCQlcCiAJLnByZWVtcHRfY291bnQgID0gSU5JVF9QUkVFTVBUX0NPVU5ULAlcCmRpZmYgLS1naXQgYS9hcmNoL2FyYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hcmMva2VybmVsL3Byb2Nlc3MuYwppbmRleCA5OGMwMGEyLi5mNDZlZmQxIDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE1NSw4ICsxNTUsNiBAQAogICovCiB2b2lkIHN0YXJ0X3RocmVhZChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHVuc2lnbmVkIGxvbmcgcGMsIHVuc2lnbmVkIGxvbmcgdXNwKQogewotCXNldF9mcyhVU0VSX0RTKTsgLyogdXNlciBzcGFjZSAqLwotCiAJcmVncy0+c3AgPSB1c3A7CiAJcmVncy0+cmV0ID0gcGM7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJjL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvYXJjL2tlcm5lbC9zaWduYWwuYwppbmRleCAxMTQyMzRlLi4yMjUxZmI0IDEwMDY0NAotLS0gYS9hcmNoL2FyYy9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9hcmMva2VybmVsL3NpZ25hbC5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJICAgICAgIHNpZ3NldF90ICpzZXQpCiB7CiAJaW50IGVycjsKLQllcnIgPSBfX2NvcHlfdG9fdXNlcigmKHNmLT51Yy51Y19tY29udGV4dC5yZWdzKSwgcmVncywKKwllcnIgPSBfX2NvcHlfdG9fdXNlcigmKHNmLT51Yy51Y19tY29udGV4dC5yZWdzLnNjcmF0Y2gpLCByZWdzLAogCQkJICAgICBzaXplb2Yoc2YtPnVjLnVjX21jb250ZXh0LnJlZ3Muc2NyYXRjaCkpOwogCWVyciB8PSBfX2NvcHlfdG9fdXNlcigmc2YtPnVjLnVjX3NpZ21hc2ssIHNldCwgc2l6ZW9mKHNpZ3NldF90KSk7CiAKQEAgLTgzLDcgKzgzLDcgQEAKIAlpZiAoIWVycikKIAkJc2V0X2N1cnJlbnRfYmxvY2tlZCgmc2V0KTsKIAotCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKHJlZ3MsICYoc2YtPnVjLnVjX21jb250ZXh0LnJlZ3MpLAorCWVyciB8PSBfX2NvcHlfZnJvbV91c2VyKHJlZ3MsICYoc2YtPnVjLnVjX21jb250ZXh0LnJlZ3Muc2NyYXRjaCksCiAJCQkJc2l6ZW9mKHNmLT51Yy51Y19tY29udGV4dC5yZWdzLnNjcmF0Y2gpKTsKIAogCXJldHVybiBlcnI7CkBAIC0xMzEsNiArMTMxLDE1IEBACiAJLyogRG9uJ3QgcmVzdGFydCBmcm9tIHNpZ3JldHVybiAqLwogCXN5c2NhbGxfd29udF9yZXN0YXJ0KHJlZ3MpOwogCisJLyoKKwkgKiBFbnN1cmUgdGhhdCBzaWdyZXR1cm4gYWx3YXlzIHJldHVybnMgdG8gdXNlciBtb2RlIChpbiBjYXNlIHRoZQorCSAqIHJlZ3Mgc2F2ZWQgb24gdXNlciBzdGFjayBnb3QgZnVkZ2VkIGJldHdlZW4gc2F2ZSBhbmQgc2lncmV0dXJuKQorCSAqIE90aGVyd2lzZSBpdCBpcyBlYXN5IHRvIHBhbmljIHRoZSBrZXJuZWwgd2l0aCBhIGN1c3RvbQorCSAqIHNpZ25hbCBoYW5kbGVyIGFuZC9vciByZXN0b3JlciB3aGljaCBjbG9iYmVyZXMgdGhlIHN0YXR1czMyL3JldAorCSAqIHRvIHJldHVybiB0byBhIGJvZ3VzIGxvY2F0aW9uIGluIGtlcm5lbCBtb2RlLgorCSAqLworCXJlZ3MtPnN0YXR1czMyIHw9IFNUQVRVU19VX01BU0s7CisKIAlyZXR1cm4gcmVncy0+cjA7CiAKIGJhZGZyYW1lOgpAQCAtMTYyLDE4ICsxNzEsNiBAQAogCXJldHVybiBmcmFtZTsKIH0KIAotLyoKLSAqIHRyYW5zbGF0ZSB0aGUgc2lnbmFsCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG1hcF9zaWcoaW50IHNpZykKLXsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKLQlpZiAodGhyZWFkLT5leGVjX2RvbWFpbiAmJiB0aHJlYWQtPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwCi0JICAgICYmIHNpZyA8IDMyKQotCQlzaWcgPSB0aHJlYWQtPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ107Ci0JcmV0dXJuIHNpZzsKLX0KLQogc3RhdGljIGludAogc2V0dXBfcnRfZnJhbWUoc3RydWN0IGtzaWduYWwgKmtzaWcsIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtMjIyLDE1ICsyMTksMTggQEAKIAkJcmV0dXJuIGVycjsKIAogCS8qICMxIGFyZyB0byB0aGUgdXNlciBTaWduYWwgaGFuZGxlciAqLwotCXJlZ3MtPnIwID0gbWFwX3NpZyhrc2lnLT5zaWcpOworCXJlZ3MtPnIwID0ga3NpZy0+c2lnOwogCiAJLyogc2V0dXAgUEMgb2YgdXNlciBzcGFjZSBzaWduYWwgaGFuZGxlciAqLwogCXJlZ3MtPnJldCA9ICh1bnNpZ25lZCBsb25nKWtzaWctPmthLnNhLnNhX2hhbmRsZXI7CiAKIAkvKgogCSAqIGhhbmRsZXIgcmV0dXJucyB1c2luZyBzaWdyZXR1cm4gc3R1YiBwcm92aWRlZCBhbHJlYWR5IGJ5IHVzZXJwc2FjZQorCSAqIElmIG5vdCwgbnVrZSB0aGUgcHJvY2VzcyByaWdodCBhd2F5CiAJICovCi0JQlVHX09OKCEoa3NpZy0+a2Euc2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikpOworCWlmKCEoa3NpZy0+a2Euc2Euc2FfZmxhZ3MgJiBTQV9SRVNUT1JFUikpCisJCXJldHVybiAxOworCiAJcmVncy0+YmxpbmsgPSAodW5zaWduZWQgbG9uZylrc2lnLT5rYS5zYS5zYV9yZXN0b3JlcjsKIAogCS8qIFVzZXIgU3RhY2sgZm9yIHNpZ25hbCBoYW5kbGVyIHdpbGwgYmUgYWJvdmUgdGhlIGZyYW1lIGp1c3QgY2FydmVkICovCkBAIC0yOTYsMTIgKzI5NiwxMiBAQAogaGFuZGxlX3NpZ25hbChzdHJ1Y3Qga3NpZ25hbCAqa3NpZywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJc2lnc2V0X3QgKm9sZHNldCA9IHNpZ21hc2tfdG9fc2F2ZSgpOwotCWludCByZXQ7CisJaW50IGZhaWxlZDsKIAogCS8qIFNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KLQlyZXQgPSBzZXR1cF9ydF9mcmFtZShrc2lnLCBvbGRzZXQsIHJlZ3MpOworCWZhaWxlZCA9IHNldHVwX3J0X2ZyYW1lKGtzaWcsIG9sZHNldCwgcmVncyk7CiAKLQlzaWduYWxfc2V0dXBfZG9uZShyZXQsIGtzaWcsIDApOworCXNpZ25hbF9zZXR1cF9kb25lKGZhaWxlZCwga3NpZywgMCk7CiB9CiAKIHZvaWQgZG9fc2lnbmFsKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcmMva2VybmVsL3Vud2luZC5jIGIvYXJjaC9hcmMva2VybmVsL3Vud2luZC5jCmluZGV4IGU1NTBiMTEuLjkzYzZlYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJjL2tlcm5lbC91bndpbmQuYworKysgYi9hcmNoL2FyYy9rZXJuZWwvdW53aW5kLmMKQEAgLTg0MSw3ICs4NDEsNyBAQAogCQkJCWJyZWFrOwogCQkJY2FzZSBEV19DRkFfR05VX3dpbmRvd19zYXZlOgogCQkJZGVmYXVsdDoKLQkJCQl1bndfZGVidWcoIlVOS05PVyBPUENPREUgMHgleFxuIiwgb3Bjb2RlKTsKKwkJCQl1bndfZGVidWcoIlVOS05PV04gT1BDT0RFIDB4JXhcbiIsIG9wY29kZSk7CiAJCQkJcmVzdWx0ID0gMDsKIAkJCQlicmVhazsKIAkJCX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IDlmMWYwOWEuLjM5MmU3YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtMSw4ICsxLDggQEAKIGNvbmZpZyBBUk0KIAlib29sCiAJZGVmYXVsdCB5Ci0Jc2VsZWN0IEFSQ0hfQklORk1UX0VMRl9SQU5ET01JWkVfUElFCiAJc2VsZWN0IEFSQ0hfSEFTX0FUT01JQzY0X0RFQ19JRl9QT1NJVElWRQorCXNlbGVjdCBBUkNIX0hBU19FTEZfUkFORE9NSVpFCiAJc2VsZWN0IEFSQ0hfSEFTX1RJQ0tfQlJPQURDQVNUIGlmIEdFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCiAJc2VsZWN0IEFSQ0hfSEFWRV9DVVNUT01fR1BJT19ICiAJc2VsZWN0IEFSQ0hfSEFTX0dDT1ZfUFJPRklMRV9BTEwKQEAgLTIxLDYgKzIxLDcgQEAKIAlzZWxlY3QgR0VORVJJQ19JRExFX1BPTExfU0VUVVAKIAlzZWxlY3QgR0VORVJJQ19JUlFfUFJPQkUKIAlzZWxlY3QgR0VORVJJQ19JUlFfU0hPVworCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XX0xFVkVMCiAJc2VsZWN0IEdFTkVSSUNfUENJX0lPTUFQCiAJc2VsZWN0IEdFTkVSSUNfU0NIRURfQ0xPQ0sKIAlzZWxlY3QgR0VORVJJQ19TTVBfSURMRV9USFJFQUQKQEAgLTI4Niw2ICsyODcsMTEgQEAKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBCVUcKIAorY29uZmlnIFBHVEFCTEVfTEVWRUxTCisJaW50CisJZGVmYXVsdCAzIGlmIEFSTV9MUEFFCisJZGVmYXVsdCAyCisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiBzb3VyY2UgImtlcm5lbC9LY29uZmlnLmZyZWV6ZXIiCkBAIC02MTksNiArNjI1LDcgQEAKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCXNlbGVjdCBHUElPX1BYQQogCXNlbGVjdCBIQVZFX0lERQorCXNlbGVjdCBJUlFfRE9NQUlOCiAJc2VsZWN0IE1VTFRJX0lSUV9IQU5ETEVSCiAJc2VsZWN0IFBMQVRfUFhBCiAJc2VsZWN0IFNQQVJTRV9JUlEKQEAgLTEwNTcsNyArMTA2NCw3IEBACiAJZGVwZW5kcyBvbiBDUFVfVjcKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSB3b3JrYXJvdW5kIGZvciB0aGUgNDMwOTczIENvcnRleC1BOAotCSAgKHIxcDAuLnIxcDIpIGVycmF0dW0uIElmIGEgY29kZSBzZXF1ZW5jZSBjb250YWluaW5nIGFuIEFSTS9UaHVtYgorCSAgcjFwKiBlcnJhdHVtLiBJZiBhIGNvZGUgc2VxdWVuY2UgY29udGFpbmluZyBhbiBBUk0vVGh1bWIKIAkgIGludGVyd29ya2luZyBicmFuY2ggaXMgcmVwbGFjZWQgd2l0aCBhbm90aGVyIGNvZGUgc2VxdWVuY2UgYXQgdGhlCiAJICBzYW1lIHZpcnR1YWwgYWRkcmVzcywgd2hldGhlciBkdWUgdG8gc2VsZi1tb2RpZnlpbmcgY29kZSBvciB2aXJ0dWFsCiAJICB0byBwaHlzaWNhbCBhZGRyZXNzIHJlLW1hcHBpbmcsIENvcnRleC1BOCBkb2VzIG5vdCByZWNvdmVyIGZyb20gdGhlCkBAIC0xMTI2LDYgKzExMzMsNyBAQAogY29uZmlnIEFSTV9FUlJBVEFfNjQzNzE5CiAJYm9vbCAiQVJNIGVycmF0YTogTG9VSVMgYml0IGZpZWxkIGluIENMSURSIHJlZ2lzdGVyIGlzIGluY29ycmVjdCIKIAlkZXBlbmRzIG9uIENQVV9WNyAmJiBTTVAKKwlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSB3b3JrYXJvdW5kIGZvciB0aGUgNjQzNzE5IENvcnRleC1BOSAocHJpb3IgdG8KIAkgIHIxcDApIGVycmF0dW0uIE9uIGFmZmVjdGVkIGNvcmVzIHRoZSBMb1VJUyBiaXQgZmllbGQgb2YgdGhlIENMSURSCkBAIC0xMzQzLDcgKzEzNTEsNyBAQAogCSAgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KIAogY29uZmlnIFNNUF9PTl9VUAotCWJvb2wgIkFsbG93IGJvb3RpbmcgU01QIGtlcm5lbCBvbiB1bmlwcm9jZXNzb3Igc3lzdGVtcyAoRVhQRVJJTUVOVEFMKSIKKwlib29sICJBbGxvdyBib290aW5nIFNNUCBrZXJuZWwgb24gdW5pcHJvY2Vzc29yIHN5c3RlbXMiCiAJZGVwZW5kcyBvbiBTTVAgJiYgIVhJUF9LRVJORUwgJiYgTU1VCiAJZGVmYXVsdCB5CiAJaGVscApAQCAtMjEyNSwxNiArMjEzMyw2IEBACiAKIHNvdXJjZSAiZnMvS2NvbmZpZy5iaW5mbXQiCiAKLWNvbmZpZyBBUlRIVVIKLQl0cmlzdGF0ZSAiUklTQyBPUyBwZXJzb25hbGl0eSIKLQlkZXBlbmRzIG9uICFBRUFCSQotCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSB0aGUga2VybmVsIGNvZGUgbmVjZXNzYXJ5IGlmIHlvdSB3YW50IHRvIHJ1bgotCSAgQWNvcm4gUklTQyBPUy9BcnRodXIgYmluYXJpZXMgdW5kZXIgTGludXguIFRoaXMgY29kZSBpcyBzdGlsbCB2ZXJ5Ci0JICBleHBlcmltZW50YWw7IGlmIHRoaXMgc291bmRzIGZyaWdodGVuaW5nLCBzYXkgTiBhbmQgc2xlZXAgaW4gcGVhY2UuCi0JICBZb3UgY2FuIGFsc28gc2F5IE0gaGVyZSB0byBjb21waWxlIHRoaXMgc3VwcG9ydCBhcyBhIG1vZHVsZSAod2hpY2gKLQkgIHdpbGwgYmUgY2FsbGVkIGFydGh1cikuCi0KIGVuZG1lbnUKIAogbWVudSAiUG93ZXIgbWFuYWdlbWVudCBvcHRpb25zIgpAQCAtMjE2Nyw2ICsyMTY1LDkgQEAKIHNvdXJjZSAic2VjdXJpdHkvS2NvbmZpZyIKIAogc291cmNlICJjcnlwdG8vS2NvbmZpZyIKK2lmIENSWVBUTworc291cmNlICJhcmNoL2FybS9jcnlwdG8vS2NvbmZpZyIKK2VuZGlmCiAKIHNvdXJjZSAibGliL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL01ha2VmaWxlIGIvYXJjaC9hcm0vTWFrZWZpbGUKaW5kZXggZWI3YmI1MS4uNTU3NWQ5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDcgQEAKICMgRW5zdXJlIGxpbmtlciBmbGFncyBhcmUgY29ycmVjdAogTERGTEFHUwkJOj0KIAotTERGTEFHU192bWxpbnV4CTo9LXAgLS1uby11bmRlZmluZWQgLVgKK0xERkxBR1Nfdm1saW51eAk6PS1wIC0tbm8tdW5kZWZpbmVkIC1YIC0tcGljLXZlbmVlcgogaWZlcSAoJChDT05GSUdfQ1BVX0VORElBTl9CRTgpLHkpCiBMREZMQUdTX3ZtbGludXgJKz0gLS1iZTgKIExERkxBR1NfTU9EVUxFCSs9IC0tYmU4CkBAIC0yNjQsNiArMjY0LDcgQEAKIGNvcmUtJChDT05GSUdfVkZQKQkJKz0gYXJjaC9hcm0vdmZwLwogY29yZS0kKENPTkZJR19YRU4pCQkrPSBhcmNoL2FybS94ZW4vCiBjb3JlLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgCSs9IGFyY2gvYXJtL2t2bS8KK2NvcmUtJChDT05GSUdfVkRTTykJCSs9IGFyY2gvYXJtL3Zkc28vCiAKICMgSWYgd2UgaGF2ZSBhIG1hY2hpbmUtc3BlY2lmaWMgZGlyZWN0b3J5LCB0aGVuIGluY2x1ZGUgaXQgaW4gdGhlIGJ1aWxkLgogY29yZS15CQkJCSs9IGFyY2gvYXJtL2tlcm5lbC8gYXJjaC9hcm0vbW0vIGFyY2gvYXJtL2NvbW1vbi8KQEAgLTMyMSw2ICszMjIsMTIgQEAKIGR0YnNfaW5zdGFsbDoKIAkkKFEpJChNQUtFKSAkKGR0Ymluc3QpPSQoYm9vdCkvZHRzCiAKK1BIT05ZICs9IHZkc29faW5zdGFsbAordmRzb19pbnN0YWxsOgoraWZlcSAoJChDT05GSUdfVkRTTykseSkKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT1hcmNoL2FybS92ZHNvICRACitlbmRpZgorCiAjIFdlIHVzZSBNUlBST1BFUl9GSUxFUyBhbmQgQ0xFQU5fRklMRVMgbm93CiBhcmNoY2xlYW46CiAJJChRKSQoTUFLRSkgJChjbGVhbik9JChib290KQpAQCAtMzQ1LDQgKzM1Miw1IEBACiAgIGVjaG8gICcgICAgICAgICAgICAgICAgICBJbnN0YWxsIHVzaW5nICh5b3VyKSB+L2Jpbi8kKElOU1RBTExLRVJORUwpIG9yJwogICBlY2hvICAnICAgICAgICAgICAgICAgICAgKGRpc3RyaWJ1dGlvbikgL3NiaW4vJChJTlNUQUxMS0VSTkVMKSBvcicKICAgZWNobyAgJyAgICAgICAgICAgICAgICAgIGluc3RhbGwgdG8gJCQoSU5TVEFMTF9QQVRIKSBhbmQgcnVuIGxpbG8nCisgIGVjaG8gICcgIHZkc29faW5zdGFsbCAgLSBJbnN0YWxsIHVuc3RyaXBwZWQgdmRzby5zbyB0byAkJChJTlNUQUxMX01PRF9QQVRIKS92ZHNvJwogZW5kZWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL2FybS9ib290L01ha2VmaWxlCmluZGV4IGVjMmY4MDYuLjllY2E3YWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vYm9vdC9NYWtlZmlsZQpAQCAtMTIsNyArMTIsNyBAQAogIwogCiBpZm5lcSAoJChNQUNISU5FKSwpCi1pbmNsdWRlICQoc3JjdHJlZSkvJChNQUNISU5FKS9NYWtlZmlsZS5ib290CitpbmNsdWRlICQoTUFDSElORSkvTWFrZWZpbGUuYm9vdAogZW5kaWYKIAogIyBOb3RlOiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgbXVzdCBhbHdheXMgYmUgdHJ1ZToKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMgYi9hcmNoL2FybS9ib290L2NvbXByZXNzZWQvaGVhZC5TCmluZGV4IGM0MWE3OTMuLjJjNDViNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKKysrIGIvYXJjaC9hcm0vYm9vdC9jb21wcmVzc2VkL2hlYWQuUwpAQCAtMTAsOCArMTAsMTEgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisjaW5jbHVkZSA8YXNtL3Y3bS5oPgogCi0JLmFyY2gJYXJtdjctYQorIEFSX0NMQVNTKAkuYXJjaAlhcm12Ny1hCSkKKyBNX0NMQVNTKAkuYXJjaAlhcm12Ny1tCSkKKwogLyoKICAqIERlYnVnZ2luZyBzdHVmZgogICoKQEAgLTExNCw3ICsxMTcsMTIgQEAKICAqIHNvcnQgb3V0IGRpZmZlcmVudCBjYWxsaW5nIGNvbnZlbnRpb25zCiAgKi8KIAkJLmFsaWduCi0JCS5hcm0JCQkJQCBBbHdheXMgZW50ZXIgaW4gQVJNIHN0YXRlCisJCS8qCisJCSAqIEFsd2F5cyBlbnRlciBpbiBBUk0gc3RhdGUgZm9yIENQVXMgdGhhdCBzdXBwb3J0IHRoZSBBUk0gSVNBLgorCQkgKiBBcyBvZiB0b2RheSAoMjAxNCkgdGhhdCdzIGV4YWN0bHkgdGhlIG1lbWJlcnMgb2YgdGhlIEEgYW5kIFIKKwkJICogY2xhc3Nlcy4KKwkJICovCisgQVJfQ0xBU1MoCS5hcm0JKQogc3RhcnQ6CiAJCS50eXBlCXN0YXJ0LCNmdW5jdGlvbgogCQkucmVwdAk3CkBAIC0xMzIsMTQgKzE0MCwxNSBAQAogCiAgVEhVTUIoCQkudGh1bWIJCQkpCiAxOgotIEFSTV9CRTgoCXNldGVuZAliZSApCQkJQCBnbyBCRTggaWYgY29tcGlsZWQgZm9yIEJFOAotCQltcnMJcjksIGNwc3IKKyBBUk1fQkU4KAlzZXRlbmQJYmUJCSkJQCBnbyBCRTggaWYgY29tcGlsZWQgZm9yIEJFOAorIEFSX0NMQVNTKAltcnMJcjksIGNwc3IJKQogI2lmZGVmIENPTkZJR19BUk1fVklSVF9FWFQKIAkJYmwJX19oeXBfc3R1Yl9pbnN0YWxsCUAgZ2V0IGludG8gU1ZDIG1vZGUsIHJldmVyc2libHkKICNlbmRpZgogCQltb3YJcjcsIHIxCQkJQCBzYXZlIGFyY2hpdGVjdHVyZSBJRAogCQltb3YJcjgsIHIyCQkJQCBzYXZlIGF0YWdzIHBvaW50ZXIKIAorI2lmbmRlZiBDT05GSUdfQ1BVX1Y3TQogCQkvKgogCQkgKiBCb290aW5nIGZyb20gQW5nZWwgLSBuZWVkIHRvIGVudGVyIFNWQyBtb2RlIGFuZCBkaXNhYmxlCiAJCSAqIEZJUXMvSVJRcyAobnVtZXJpYyBkZWZpbml0aW9ucyBmcm9tIGFuZ2VsIGFybS5oIHNvdXJjZSkuCkBAIC0xNTUsNiArMTY0LDcgQEAKIAkJc2FmZV9zdmNtb2RlX21hc2thbGwgcjAKIAkJbXNyCXNwc3JfY3hzZiwgcjkJCUAgU2F2ZSB0aGUgQ1BVIGJvb3QgbW9kZSBpbgogCQkJCQkJQCBTUFNSCisjZW5kaWYKIAkJLyoKIAkJICogTm90ZSB0aGF0IHNvbWUgY2FjaGUgZmx1c2hpbmcgYW5kIG90aGVyIHN0dWZmIG1heQogCQkgKiBiZSBuZWVkZWQgaGVyZSAtIGlzIHRoZXJlIGFuIEFuZ2VsIFNXSSBjYWxsIGZvciB0aGlzPwpAQCAtMTY4LDkgKzE3OCwyNiBAQAogCQkudGV4dAogCiAjaWZkZWYgQ09ORklHX0FVVE9fWlJFTEFERFIKLQkJQCBkZXRlcm1pbmUgZmluYWwga2VybmVsIGltYWdlIGFkZHJlc3MKKwkJLyoKKwkJICogRmluZCB0aGUgc3RhcnQgb2YgcGh5c2ljYWwgbWVtb3J5LiAgQXMgd2UgYXJlIGV4ZWN1dGluZworCQkgKiB3aXRob3V0IHRoZSBNTVUgb24sIHdlIGFyZSBpbiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBzcGFjZS4KKwkJICogV2UganVzdCBuZWVkIHRvIGdldCByaWQgb2YgYW55IG9mZnNldCBieSBhbGlnbmluZyB0aGUKKwkJICogYWRkcmVzcy4KKwkJICoKKwkJICogVGhpcyBhbGlnbm1lbnQgaXMgYSBiYWxhbmNlIGJldHdlZW4gdGhlIHJlcXVpcmVtZW50cyBvZgorCQkgKiBkaWZmZXJlbnQgcGxhdGZvcm1zIC0gd2UgaGF2ZSBjaG9zZW4gMTI4TUIgdG8gYWxsb3cKKwkJICogcGxhdGZvcm1zIHdoaWNoIGFsaWduIHRoZSBzdGFydCBvZiB0aGVpciBwaHlzaWNhbCBtZW1vcnkKKwkJICogdG8gMTI4TUIgdG8gdXNlIHRoaXMgZmVhdHVyZSwgd2hpbGUgYWxsb3dpbmcgdGhlIHpJbWFnZQorCQkgKiB0byBiZSBwbGFjZWQgd2l0aGluIHRoZSBmaXJzdCAxMjhNQiBvZiBtZW1vcnkgb24gb3RoZXIKKwkJICogcGxhdGZvcm1zLiAgSW5jcmVhc2luZyB0aGUgYWxpZ25tZW50IG1lYW5zIHdlIHBsYWNlCisJCSAqIHN0cmljdGVyIGFsaWdubWVudCByZXF1aXJlbWVudHMgb24gdGhlIHN0YXJ0IG9mIHBoeXNpY2FsCisJCSAqIG1lbW9yeSwgYnV0IHJlbGF4aW5nIGl0IG1lYW5zIHRoYXQgd2UgYnJlYWsgcGVvcGxlIHdobworCQkgKiBhcmUgYWxyZWFkeSBwbGFjaW5nIHRoZWlyIHpJbWFnZSBpbiAoZWcpIHRoZSB0b3AgNjRNQgorCQkgKiBvZiB0aGlzIHJhbmdlLgorCQkgKi8KIAkJbW92CXI0LCBwYwogCQlhbmQJcjQsIHI0LCAjMHhmODAwMDAwMAorCQkvKiBEZXRlcm1pbmUgZmluYWwga2VybmVsIGltYWdlIGFkZHJlc3MuICovCiAJCWFkZAlyNCwgcjQsICNURVhUX09GRlNFVAogI2Vsc2UKIAkJbGRyCXI0LCA9enJlbGFkZHIKQEAgLTgxMCw2ICs4MzcsMTYgQEAKIGNhbGxfY2FjaGVfZm46CWFkcglyMTIsIHByb2NfdHlwZXMKICNpZmRlZiBDT05GSUdfQ1BVX0NQMTUKIAkJbXJjCXAxNSwgMCwgcjksIGMwLCBjMAlAIGdldCBwcm9jZXNzb3IgSUQKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9WN00pCisJCS8qCisJCSAqIE9uIHY3LU0gdGhlIHByb2Nlc3NvciBpZCBpcyBsb2NhdGVkIGluIHRoZSBWN01fU0NCX0NQVUlECisJCSAqIHJlZ2lzdGVyLCBidXQgYXMgY2FjaGUgaGFuZGxpbmcgaXMgSU1QTEVNRU5UQVRJT04gREVGSU5FRCBvbgorCQkgKiB2Ny1NIChpZiBleGlzdGFudCBhdCBhbGwpIHdlIGp1c3QgcmV0dXJuIGVhcmx5IGhlcmUuCisJCSAqIElmIFY3TV9TQ0JfQ1BVSUQgd2VyZSB1c2VkIHRoZSBjcHUgSUQgZnVuY3Rpb25zIChpLmUuCisJCSAqIF9fYXJtdjdfbW11X2NhY2hlX3tvbixvZmYsZmx1c2h9KSB3b3VsZCBiZSBzZWxlY3RlZCB3aGljaAorCQkgKiB1c2UgY3AxNSByZWdpc3RlcnMgdGhhdCBhcmUgbm90IGltcGxlbWVudGVkIG9uIHY3LU0uCisJCSAqLworCQlieAlscgogI2Vsc2UKIAkJbGRyCXI5LCA9Q09ORklHX1BST0NFU1NPUl9JRAogI2VuZGlmCkBAIC0xMzEwLDggKzEzNDcsOSBAQAogCiBfX2VudGVyX2tlcm5lbDoKIAkJbW92CXIwLCAjMAkJCUAgbXVzdCBiZSAwCi0gQVJNKAkJbW92CXBjLCByNAkpCQlAIGNhbGwga2VybmVsCi0gVEhVTUIoCQlieAlyNAkpCQlAIGVudHJ5IHBvaW50IGlzIGFsd2F5cyBBUk0KKyBBUk0oCQltb3YJcGMsIHI0CQkpCUAgY2FsbCBrZXJuZWwKKyBNX0NMQVNTKAlhZGQJcjQsIHI0LCAjMQkpCUAgZW50ZXIgaW4gVGh1bWIgbW9kZSBmb3IgTSBjbGFzcworIFRIVU1CKAkJYngJcjQJCSkJQCBlbnRyeSBwb2ludCBpcyBhbHdheXMgQVJNIGZvciBBL1IgY2xhc3NlcwogCiByZWxvY19jb2RlX2VuZDoKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYW00MzcyLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9hbTQzNzIuZHRzaQppbmRleCAxOTQzZmMzLi44YTA5OWJjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYW00MzcyLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW00MzcyLmR0c2kKQEAgLTE1LDcgKzE1LDcgQEAKIAogLyB7CiAJY29tcGF0aWJsZSA9ICJ0aSxhbTQzNzIiLCAidGksYW00MyI7Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ3YWtldXBnZW4+OwogCiAKIAlhbGlhc2VzIHsKQEAgLTQ4LDYgKzQ4LDE1IEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CiAJCXJlZyA9IDwweDQ4MjQxMDAwIDB4MTAwMD4sCiAJCSAgICAgIDwweDQ4MjQwMTAwIDB4MDEwMD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJfTsKKworCXdha2V1cGdlbjogaW50ZXJydXB0LWNvbnRyb2xsZXJANDgyODEwMDAgeworCQljb21wYXRpYmxlID0gInRpLG9tYXA0LXd1Z2VuLW1wdSI7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQlyZWcgPSA8MHg0ODI4MTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCX07CiAKIAlsMi1jYWNoZS1jb250cm9sbGVyQDQ4MjQyMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FtNDM3eC1ncC1ldm0uZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW00Mzd4LWdwLWV2bS5kdHMKaW5kZXggZjg0ZDk3MS4uMjY5NTZjYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvYW00Mzd4LWdwLWV2bS5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW00Mzd4LWdwLWV2bS5kdHMKQEAgLTM1Miw3ICszNTIsNiBAQAogCQlyZWcgPSA8MHgyND47CiAJCWNvbXBhdGlibGUgPSAidGksdHBzNjUyMTgiOwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNyBJUlFfVFlQRV9OT05FPjsgLyogTk1JbiAqLwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYW00Mzd4LXNrLWV2bS5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9hbTQzN3gtc2stZXZtLmR0cwppbmRleCA4MzJkMjQzLi44YWUyOWM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9hbTQzN3gtc2stZXZtLmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9hbTQzN3gtc2stZXZtLmR0cwpAQCAtMzkyLDcgKzM5Miw2IEBACiAJdHBzQDI0IHsKIAkJY29tcGF0aWJsZSA9ICJ0aSx0cHM2NTIxOCI7CiAJCXJlZyA9IDwweDI0PjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDcgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYW00M3gtZXBvcy1ldm0uZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW00M3gtZXBvcy1ldm0uZHRzCmluZGV4IDI1N2MwOTkuLjFkNzEwOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FtNDN4LWVwb3MtZXZtLmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9hbTQzeC1lcG9zLWV2bS5kdHMKQEAgLTM2OSw3ICszNjksNiBAQAogCQlyZWcgPSA8MHgyND47CiAJCWNvbXBhdGlibGUgPSAidGksdHBzNjUyMTgiOwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNyBJUlFfVFlQRV9OT05FPjsgLyogTk1JbiAqLwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvYW01N3h4LWJlYWdsZS14MTUuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvYW01N3h4LWJlYWdsZS14MTUuZHRzCmluZGV4IDY0NjNmOWUuLmJkNDhkYmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2FtNTd4eC1iZWFnbGUteDE1LmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9hbTU3eHgtYmVhZ2xlLXgxNS5kdHMKQEAgLTQ1NCw3ICs0NTQsNiBAQAogCW1jcF9ydGM6IHJ0Y0A2ZiB7CiAJCWNvbXBhdGlibGUgPSAibWljcm9jaGlwLG1jcDc5NDF4IjsKIAkJcmVnID0gPDB4NmY+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMiBJUlFfVFlQRV9MRVZFTF9MT1c+OyAgLyogSVJRX1NZU18xTiAqLwogCiAJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CkBAIC00NzcsNyArNDc2LDcgQEAKIAogJnVhcnQzIHsKIAlzdGF0dXMgPSAib2theSI7Ci0JaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmZ2ljIEdJQ19TUEkgNjkgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmY3Jvc3NiYXJfbXB1IEdJQ19TUEkgNjkgSVJRX1RZUEVfTEVWRUxfSElHSD4sCiAJCQkgICAgICA8JmRyYTdfcG14X2NvcmUgMHgyNDg+OwogCiAJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05MjYwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOTI2MC5kdHNpCmluZGV4IGU3ZjBhNGEuLjYyZDI1YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05MjYwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTkyNjAuZHRzaQpAQCAtODQyLDcgKzg0Miw3IEBACiAJCQl9OwogCiAJCQltYWNiMDogZXRoZXJuZXRAZmZmYzQwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiY2RucyxhdDMyYXA3MDAwLW1hY2IiLCAiY2RucyxtYWNiIjsKKwkJCQljb21wYXRpYmxlID0gImNkbnMsYXQ5MXNhbTkyNjAtbWFjYiIsICJjZG5zLG1hY2IiOwogCQkJCXJlZyA9IDwweGZmZmM0MDAwIDB4MTAwPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDIxIElSUV9UWVBFX0xFVkVMX0hJR0ggMz47CiAJCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05MjYzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOTI2My5kdHNpCmluZGV4IGZjZTMwMWMuLmU0ZjYxYTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05MjYzLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTkyNjMuZHRzaQpAQCAtODQ1LDcgKzg0NSw3IEBACiAJCQl9OwogCiAJCQltYWNiMDogZXRoZXJuZXRAZmZmYmMwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiY2RucyxhdDMyYXA3MDAwLW1hY2IiLCAiY2RucyxtYWNiIjsKKwkJCQljb21wYXRpYmxlID0gImNkbnMsYXQ5MXNhbTkyNjAtbWFjYiIsICJjZG5zLG1hY2IiOwogCQkJCXJlZyA9IDwweGZmZmJjMDAwIDB4MTAwPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDIxIElSUV9UWVBFX0xFVkVMX0hJR0ggMz47CiAJCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05ZzQ1LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOWc0NS5kdHNpCmluZGV4IDQ4OGFmNjMuLjhlYzA1YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05ZzQ1LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTlnNDUuZHRzaQpAQCAtOTU2LDcgKzk1Niw3IEBACiAJCQl9OwogCiAJCQltYWNiMDogZXRoZXJuZXRAZmZmYmMwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiY2RucyxhdDMyYXA3MDAwLW1hY2IiLCAiY2RucyxtYWNiIjsKKwkJCQljb21wYXRpYmxlID0gImNkbnMsYXQ5MXNhbTkyNjAtbWFjYiIsICJjZG5zLG1hY2IiOwogCQkJCXJlZyA9IDwweGZmZmJjMDAwIDB4MTAwPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDI1IElSUV9UWVBFX0xFVkVMX0hJR0ggMz47CiAJCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05eDVfbWFjYjAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05eDVfbWFjYjAuZHRzaQppbmRleCA1N2U4OWQxLi43M2Q3ZTMwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOXg1X21hY2IwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTl4NV9tYWNiMC5kdHNpCkBAIC01Myw3ICs1Myw3IEBACiAJCQl9OwogCiAJCQltYWNiMDogZXRoZXJuZXRAZjgwMmMwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiY2RucyxhdDMyYXA3MDAwLW1hY2IiLCAiY2RucyxtYWNiIjsKKwkJCQljb21wYXRpYmxlID0gImNkbnMsYXQ5MXNhbTkyNjAtbWFjYiIsICJjZG5zLG1hY2IiOwogCQkJCXJlZyA9IDwweGY4MDJjMDAwIDB4MTAwPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDI0IElSUV9UWVBFX0xFVkVMX0hJR0ggMz47CiAJCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05eDVfbWFjYjEuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2F0OTFzYW05eDVfbWFjYjEuZHRzaQppbmRleCA2NjM2NzZjLi5kODE5ODBjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9hdDkxc2FtOXg1X21hY2IxLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvYXQ5MXNhbTl4NV9tYWNiMS5kdHNpCkBAIC00MSw3ICs0MSw3IEBACiAJCQl9OwogCiAJCQltYWNiMTogZXRoZXJuZXRAZjgwMzAwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiY2RucyxhdDMyYXA3MDAwLW1hY2IiLCAiY2RucyxtYWNiIjsKKwkJCQljb21wYXRpYmxlID0gImNkbnMsYXQ5MXNhbTkyNjAtbWFjYiIsICJjZG5zLG1hY2IiOwogCQkJCXJlZyA9IDwweGY4MDMwMDAwIDB4MTAwPjsKIAkJCQlpbnRlcnJ1cHRzID0gPDI3IElSUV9UWVBFX0xFVkVMX0hJR0ggMz47CiAJCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2RtODE2OC1ldm0uZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvZG04MTY4LWV2bS5kdHMKaW5kZXggZDNhMjljMS4uYWZlNjc4ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvZG04MTY4LWV2bS5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvZG04MTY4LWV2bS5kdHMKQEAgLTM2LDYgKzM2LDIwIEBACiAJCT47CiAJfTsKIAorCW1tY19waW5zOiBwaW5tdXhfbW1jX3BpbnMgeworCQlwaW5jdHJsLXNpbmdsZSxwaW5zID0gPAorCQkJRE04MTZYX0lPUEFEKDB4MGE3MCwgTVVYX01PREUwKQkJCS8qIFNEX1BPVyAqLworCQkJRE04MTZYX0lPUEFEKDB4MGE3NCwgTVVYX01PREUwKQkJCS8qIFNEX0NMSyAqLworCQkJRE04MTZYX0lPUEFEKDB4MGE3OCwgTVVYX01PREUwKQkJCS8qIFNEX0NNRCAqLworCQkJRE04MTZYX0lPUEFEKDB4MGE3QywgTVVYX01PREUwKQkJCS8qIFNEX0RBVDAgKi8KKwkJCURNODE2WF9JT1BBRCgweDBhODAsIE1VWF9NT0RFMCkJCQkvKiBTRF9EQVQxICovCisJCQlETTgxNlhfSU9QQUQoMHgwYTg0LCBNVVhfTU9ERTApCQkJLyogU0RfREFUMiAqLworCQkJRE04MTZYX0lPUEFEKDB4MGE4OCwgTVVYX01PREUwKQkJCS8qIFNEX0RBVDIgKi8KKwkJCURNODE2WF9JT1BBRCgweDBhOGMsIE1VWF9NT0RFMikJCQkvKiBHUDFbN10gKi8KKwkJCURNODE2WF9JT1BBRCgweDBhOTAsIE1VWF9NT0RFMikJCQkvKiBHUDFbOF0gKi8KKwkJPjsKKwl9OworCiAJdXNiMF9waW5zOiBwaW5tdXhfdXNiMF9waW5zIHsKIAkJcGluY3RybC1zaW5nbGUscGlucyA9IDwKIAkJCURNODE2WF9JT1BBRCgweDBkMDAsIE1VWF9NT0RFMCkJCQkvKiBVU0IwX0RSVlZCVVMgKi8KQEAgLTEzNyw3ICsxNTEsMTIgQEAKIH07CiAKICZtbWMxIHsKKwlwaW5jdHJsLW5hbWVzID0gImRlZmF1bHQiOworCXBpbmN0cmwtMCA9IDwmbW1jX3BpbnM+OwogCXZtbWMtc3VwcGx5ID0gPCZ2bW1jc2RfZml4ZWQ+OworCWJ1cy13aWR0aCA9IDw0PjsKKwljZC1ncGlvcyA9IDwmZ3BpbzIgNyBHUElPX0FDVElWRV9MT1c+OworCXdwLWdwaW9zID0gPCZncGlvMiA4IEdQSU9fQUNUSVZFX0xPVz47CiB9OwogCiAvKiBBdCBsZWFzdCBkbTgxNjgtZXZtIHJldiBjIHdvbid0IHN1cHBvcnQgbXVsdGlwb2ludCwgbGF0ZXIgbWF5ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9kbTgxNnguZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL2RtODE2eC5kdHNpCmluZGV4IDNjOTdiNWYuLmYzNTcxNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2RtODE2eC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2RtODE2eC5kdHNpCkBAIC0xNTAsMTcgKzE1MCwyNyBAQAogCQl9OwogCiAJCWdwaW8xOiBncGlvQDQ4MDMyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAidGksb21hcDMtZ3BpbyI7CisJCQljb21wYXRpYmxlID0gInRpLG9tYXA0LWdwaW8iOwogCQkJdGksaHdtb2RzID0gImdwaW8xIjsKKwkJCXRpLGdwaW8tYWx3YXlzLW9uOwogCQkJcmVnID0gPDB4NDgwMzIwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8OTc+OworCQkJaW50ZXJydXB0cyA9IDw5Nj47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKIAkJfTsKIAogCQlncGlvMjogZ3Bpb0A0ODA0YzAwMCB7Ci0JCQljb21wYXRpYmxlID0gInRpLG9tYXAzLWdwaW8iOworCQkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC1ncGlvIjsKIAkJCXRpLGh3bW9kcyA9ICJncGlvMiI7CisJCQl0aSxncGlvLWFsd2F5cy1vbjsKIAkJCXJlZyA9IDwweDQ4MDRjMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDk5PjsKKwkJCWludGVycnVwdHMgPSA8OTg+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAJCX07CiAKIAkJZ3BtYzogZ3BtY0A1MDAwMDAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9kcmE3LWV2bS5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9kcmE3LWV2bS5kdHMKaW5kZXggNzU2M2Q3Yy4uYjFiZDA2YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvZHJhNy1ldm0uZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2RyYTctZXZtLmR0cwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAJc3RhdHVzID0gIm9rYXkiOwogCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CiAJcGluY3RybC0wID0gPCZ1YXJ0MV9waW5zPjsKLQlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZnaWMgR0lDX1NQSSA2NyBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKKwlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZjcm9zc2Jhcl9tcHUgR0lDX1NQSSA2NyBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKIAkJCSAgICAgIDwmZHJhN19wbXhfY29yZSAweDNlMD47CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9kcmE3LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9kcmE3LmR0c2kKaW5kZXggMTI3NjA4ZC4uYTBhZmNlNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvZHJhNy5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2RyYTcuZHRzaQpAQCAtMTMsMTQgKzEzLDEzIEBACiAjaW5jbHVkZSAic2tlbGV0b24uZHRzaSIKIAogI2RlZmluZSBNQVhfU09VUkNFUyA0MDAKLSNkZWZpbmUgRElSRUNUX0lSUShpcnEpIChNQVhfU09VUkNFUyArIGlycSkKIAogLyB7CiAJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJI3NpemUtY2VsbHMgPSA8MT47CiAKIAljb21wYXRpYmxlID0gInRpLGRyYTd4eCI7Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZjcm9zc2Jhcl9tcHU+OwogCiAJYWxpYXNlcyB7CiAJCWkyYzAgPSAmaTJjMTsKQEAgLTUwLDE4ICs0OSwyNyBAQAogCQkJICAgICA8R0lDX1BQSSAxNCAoR0lDX0NQVV9NQVNLX1NJTVBMRSgyKSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+LAogCQkJICAgICA8R0lDX1BQSSAxMSAoR0lDX0NQVV9NQVNLX1NJTVBMRSgyKSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+LAogCQkJICAgICA8R0lDX1BQSSAxMCAoR0lDX0NQVV9NQVNLX1NJTVBMRSgyKSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCX07CiAKIAlnaWM6IGludGVycnVwdC1jb250cm9sbGVyQDQ4MjExMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWExNS1naWMiOwogCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKLQkJYXJtLHJvdXRhYmxlLWlycXMgPSA8MTkyPjsKIAkJcmVnID0gPDB4NDgyMTEwMDAgMHgxMDAwPiwKIAkJICAgICAgPDB4NDgyMTIwMDAgMHgxMDAwPiwKIAkJICAgICAgPDB4NDgyMTQwMDAgMHgyMDAwPiwKIAkJICAgICAgPDB4NDgyMTYwMDAgMHgyMDAwPjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfUFBJIDkgKEdJQ19DUFVfTUFTS19TSU1QTEUoMikgfCBJUlFfVFlQRV9MRVZFTF9ISUdIKT47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJfTsKKworCXdha2V1cGdlbjogaW50ZXJydXB0LWNvbnRyb2xsZXJANDgyODEwMDAgeworCQljb21wYXRpYmxlID0gInRpLG9tYXA1LXd1Z2VuLW1wdSIsICJ0aSxvbWFwNC13dWdlbi1tcHUiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJcmVnID0gPDB4NDgyODEwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAl9OwogCiAJLyoKQEAgLTkxLDggKzk5LDggQEAKIAkJdGksaHdtb2RzID0gImwzX21haW5fMSIsICJsM19tYWluXzIiOwogCQlyZWcgPSA8MHg0NDAwMDAwMCAweDEwMDAwMDA+LAogCQkgICAgICA8MHg0NTAwMDAwMCAweDEwMDA+OwotCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNCBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKLQkJCSAgICAgPEdJQ19TUEkgRElSRUNUX0lSUSgxMCkgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmNyb3NzYmFyX21wdSBHSUNfU1BJIDQgSVJRX1RZUEVfTEVWRUxfSElHSD4sCisJCQkJICAgICAgPCZ3YWtldXBnZW4gR0lDX1NQSSAxMCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAogCQlwcm06IHBybUA0YWUwNjAwMCB7CiAJCQljb21wYXRpYmxlID0gInRpLGRyYTctcHJtIjsKQEAgLTM0NCw3ICszNTIsNyBAQAogCQl1YXJ0MTogc2VyaWFsQDQ4MDZhMDAwIHsKIAkJCWNvbXBhdGlibGUgPSAidGksb21hcDQtdWFydCI7CiAJCQlyZWcgPSA8MHg0ODA2YTAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZnaWMgR0lDX1NQSSA2NyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmNyb3NzYmFyX21wdSBHSUNfU1BJIDY3IElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQkJdGksaHdtb2RzID0gInVhcnQxIjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0ODAwMDAwMD47CiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwpAQCAtMzU1LDcgKzM2Myw3IEBACiAJCXVhcnQyOiBzZXJpYWxANDgwNmMwMDAgewogCQkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC11YXJ0IjsKIAkJCXJlZyA9IDwweDQ4MDZjMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmdpYyBHSUNfU1BJIDY4IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDY4IElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQkJdGksaHdtb2RzID0gInVhcnQyIjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0ODAwMDAwMD47CiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwpAQCAtMzY2LDcgKzM3NCw3IEBACiAJCXVhcnQzOiBzZXJpYWxANDgwMjAwMDAgewogCQkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC11YXJ0IjsKIAkJCXJlZyA9IDwweDQ4MDIwMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmdpYyBHSUNfU1BJIDY5IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDY5IElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQkJdGksaHdtb2RzID0gInVhcnQzIjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0ODAwMDAwMD47CiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwpAQCAtMzc3LDcgKzM4NSw3IEBACiAJCXVhcnQ0OiBzZXJpYWxANDgwNmUwMDAgewogCQkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC11YXJ0IjsKIAkJCXJlZyA9IDwweDQ4MDZlMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmdpYyBHSUNfU1BJIDY1IElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDY1IElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQkJdGksaHdtb2RzID0gInVhcnQ0IjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0ODAwMDAwMD47CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAiZGlzYWJsZWQiOwpAQCAtMzg4LDcgKzM5Niw3IEBACiAJCXVhcnQ1OiBzZXJpYWxANDgwNjYwMDAgewogCQkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC11YXJ0IjsKIAkJCXJlZyA9IDwweDQ4MDY2MDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmdpYyBHSUNfU1BJIDEwMCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxMDAgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCQl0aSxod21vZHMgPSAidWFydDUiOwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDQ4MDAwMDAwPjsKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CkBAIC0zOTksNyArNDA3LDcgQEAKIAkJdWFydDY6IHNlcmlhbEA0ODA2ODAwMCB7CiAJCQljb21wYXRpYmxlID0gInRpLG9tYXA0LXVhcnQiOwogCQkJcmVnID0gPDB4NDgwNjgwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmZ2ljIEdJQ19TUEkgMTAxIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDEwMSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJCXRpLGh3bW9kcyA9ICJ1YXJ0NiI7CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8NDgwMDAwMDA+OwogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKQEAgLTQxMCw3ICs0MTgsNyBAQAogCQl1YXJ0Nzogc2VyaWFsQDQ4NDIwMDAwIHsKIAkJCWNvbXBhdGlibGUgPSAidGksb21hcDQtdWFydCI7CiAJCQlyZWcgPSA8MHg0ODQyMDAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZnaWMgR0lDX1NQSSAyMTggSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMjE4IElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQkJdGksaHdtb2RzID0gInVhcnQ3IjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0ODAwMDAwMD47CiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwpAQCAtNDE5LDcgKzQyNyw3IEBACiAJCXVhcnQ4OiBzZXJpYWxANDg0MjIwMDAgewogCQkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC11YXJ0IjsKIAkJCXJlZyA9IDwweDQ4NDIyMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmdpYyBHSUNfU1BJIDIxOSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWludGVycnVwdHMgPSA8R0lDX1NQSSAyMTkgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCQl0aSxod21vZHMgPSAidWFydDgiOwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDQ4MDAwMDAwPjsKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CkBAIC00MjgsNyArNDM2LDcgQEAKIAkJdWFydDk6IHNlcmlhbEA0ODQyNDAwMCB7CiAJCQljb21wYXRpYmxlID0gInRpLG9tYXA0LXVhcnQiOwogCQkJcmVnID0gPDB4NDg0MjQwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmZ2ljIEdJQ19TUEkgMjIwIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDIyMCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJCXRpLGh3bW9kcyA9ICJ1YXJ0OSI7CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8NDgwMDAwMDA+OwogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKQEAgLTQzNyw3ICs0NDUsNyBAQAogCQl1YXJ0MTA6IHNlcmlhbEA0YWUyYjAwMCB7CiAJCQljb21wYXRpYmxlID0gInRpLG9tYXA0LXVhcnQiOwogCQkJcmVnID0gPDB4NGFlMmIwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmZ2ljIEdJQ19TUEkgMjIxIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDIyMSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJCXRpLGh3bW9kcyA9ICJ1YXJ0MTAiOwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDQ4MDAwMDAwPjsKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CkBAIC0xMTExLDcgKzExMTksNiBAQAogCQkJCQkgICAgICAid2t1cGNsayIsICJyZWZjbGsiLAogCQkJCQkgICAgICAiZGl2LWNsayIsICJwaHktZGl2IjsKIAkJCQkjcGh5LWNlbGxzID0gPDA+OwotCQkJCXRpLGh3bW9kcyA9ICJwY2llMS1waHkiOwogCQkJfTsKIAogCQkJcGNpZTJfcGh5OiBwY2llcGh5QDRhMDk1MDAwIHsKQEAgLTExMzAsNyArMTEzNyw2IEBACiAJCQkJCSAgICAgICJ3a3VwY2xrIiwgInJlZmNsayIsCiAJCQkJCSAgICAgICJkaXYtY2xrIiwgInBoeS1kaXYiOwogCQkJCSNwaHktY2VsbHMgPSA8MD47Ci0JCQkJdGksaHdtb2RzID0gInBjaWUyLXBoeSI7CiAJCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJCX07CiAJCX07CkBAIC0xMzM3LDkgKzEzNDMsMTIgQEAKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJY3Jvc3NiYXJfbXB1OiBjcm9zc2JhckA0YTAyMDAwMCB7CisJCWNyb3NzYmFyX21wdTogY3Jvc3NiYXJANGEwMDJhNDggewogCQkJY29tcGF0aWJsZSA9ICJ0aSxpcnEtY3Jvc3NiYXIiOwogCQkJcmVnID0gPDB4NGEwMDJhNDggMHgxMzA+OworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ3YWtldXBnZW4+OworCQkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKIAkJCXRpLG1heC1pcnFzID0gPDE2MD47CiAJCQl0aSxtYXgtY3Jvc3NiYXItc291cmNlcyA9IDxNQVhfU09VUkNFUz47CiAJCQl0aSxyZWctc2l6ZSA9IDwyPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2RyYTcyLWV2bS5kdHMgYi9hcmNoL2FybS9ib290L2R0cy9kcmE3Mi1ldm0uZHRzCmluZGV4IDQwZWQ1MzkuLmRhZjI4MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2RyYTcyLWV2bS5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvZHJhNzItZXZtLmR0cwpAQCAtMTU4LDcgKzE1OCw2IEBACiAJCXBpbmN0cmwtMCA9IDwmdHBzNjU5MTdfcGluc19kZWZhdWx0PjsKIAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMiBJUlFfVFlQRV9OT05FPjsgIC8qIElSUV9TWVNfMU4gKi8KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2RyYTcyeC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvZHJhNzJ4LmR0c2kKaW5kZXggZTVhM2QyMy4uZjdmYjBkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvZHJhNzJ4LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvZHJhNzJ4LmR0c2kKQEAgLTI1LDYgKzI1LDcgQEAKIAogCXBtdSB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hMTUtcG11IjsKLQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIERJUkVDVF9JUlEoMTMxKSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmd2FrZXVwZ2VuPjsKKwkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDEzMSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL2RyYTc0eC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvZHJhNzR4LmR0c2kKaW5kZXggMTAxNzNmYS4uMDBlZWVkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvZHJhNzR4LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvZHJhNzR4LmR0c2kKQEAgLTQxLDggKzQxLDkgQEAKIAogCXBtdSB7CiAJCWNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hMTUtcG11IjsKLQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIERJUkVDVF9JUlEoMTMxKSBJUlFfVFlQRV9MRVZFTF9ISUdIPiwKLQkJCSAgICAgPEdJQ19TUEkgRElSRUNUX0lSUSgxMzIpIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ3YWtldXBnZW4+OworCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTMxIElSUV9UWVBFX0xFVkVMX0hJR0g+LAorCQkJICAgICA8R0lDX1NQSSAxMzIgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJfTsKIAogCW9jcCB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9leHlub3MzMjUwLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9leHlub3MzMjUwLmR0c2kKaW5kZXggYWM2YjBhZS4uMTRhYjUxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvZXh5bm9zMzI1MC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL2V4eW5vczMyNTAuZHRzaQpAQCAtMTMxLDYgKzEzMSw5IEBACiAJCXBtdV9zeXN0ZW1fY29udHJvbGxlcjogc3lzdGVtLWNvbnRyb2xsZXJAMTAwMjAwMDAgewogCQkJY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczMyNTAtcG11IiwgInN5c2NvbiI7CiAJCQlyZWcgPSA8MHgxMDAyMDAwMCAweDQwMDA+OworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJfTsKIAogCQltaXBpX3BoeTogdmlkZW8tcGh5QDEwMDIwNzEwIHsKQEAgLTE4NSw2ICsxODgsNyBAQAogCQkJY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczMyNTAtcnRjIjsKIAkJCXJlZyA9IDwweDEwMDcwMDAwIDB4MTAwPjsKIAkJCWludGVycnVwdHMgPSA8MCA3MyAwPiwgPDAgNzQgMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZwbXVfc3lzdGVtX2NvbnRyb2xsZXI+OwogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvZXh5bm9zNC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvZXh5bm9zNC5kdHNpCmluZGV4IDc3ZWE1NDcuLmUyMGNkYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2V4eW5vczQuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9leHlub3M0LmR0c2kKQEAgLTE1NCw2ICsxNTQsOSBAQAogCXBtdV9zeXN0ZW1fY29udHJvbGxlcjogc3lzdGVtLWNvbnRyb2xsZXJAMTAwMjAwMDAgewogCQljb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNDIxMC1wbXUiLCAic3lzY29uIjsKIAkJcmVnID0gPDB4MTAwMjAwMDAgMHg0MDAwPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CiAJfTsKIAogCWRzaV8wOiBkc2lAMTFDODAwMDAgewpAQCAtMjY2LDYgKzI2OSw3IEBACiAJcnRjQDEwMDcwMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMzYzY0MTAtcnRjIjsKIAkJcmVnID0gPDB4MTAwNzAwMDAgMHgxMDA+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZwbXVfc3lzdGVtX2NvbnRyb2xsZXI+OwogCQlpbnRlcnJ1cHRzID0gPDAgNDQgMD4sIDwwIDQ1IDA+OwogCQljbG9ja3MgPSA8JmNsb2NrIENMS19SVEM+OwogCQljbG9jay1uYW1lcyA9ICJydGMiOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvZXh5bm9zNTI1MC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvZXh5bm9zNTI1MC5kdHNpCmluZGV4IGFkYmRlMWEuLjc3ZjY1NmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2V4eW5vczUyNTAuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9leHlub3M1MjUwLmR0c2kKQEAgLTIwNSw2ICsyMDUsOSBAQAogCQljbG9jay1uYW1lcyA9ICJjbGtvdXQxNiI7CiAJCWNsb2NrcyA9IDwmY2xvY2sgQ0xLX0ZJTl9QTEw+OwogCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCX07CiAKIAlzeXNyZWdfc3lzdGVtX2NvbnRyb2xsZXI6IHN5c2NvbkAxMDA1MDAwMCB7CkBAIC0yNDEsNiArMjQ0LDcgQEAKIAlydGM6IHJ0Y0AxMDFFMDAwMCB7CiAJCWNsb2NrcyA9IDwmY2xvY2sgQ0xLX1JUQz47CiAJCWNsb2NrLW5hbWVzID0gInJ0YyI7CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnBtdV9zeXN0ZW1fY29udHJvbGxlcj47CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvZXh5bm9zNTQyMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvZXh5bm9zNTQyMC5kdHNpCmluZGV4IGMwZTk4Y2YuLmIzZDJkNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL2V4eW5vczU0MjAuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9leHlub3M1NDIwLmR0c2kKQEAgLTMyNyw2ICszMjcsNyBAQAogCXJ0YzogcnRjQDEwMUUwMDAwIHsKIAkJY2xvY2tzID0gPCZjbG9jayBDTEtfUlRDPjsKIAkJY2xvY2stbmFtZXMgPSAicnRjIjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmcG11X3N5c3RlbV9jb250cm9sbGVyPjsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwogCkBAIC03NzAsNiArNzcxLDkgQEAKIAkJY2xvY2stbmFtZXMgPSAiY2xrb3V0MTYiOwogCQljbG9ja3MgPSA8JmNsb2NrIENMS19GSU5fUExMPjsKIAkJI2Nsb2NrLWNlbGxzID0gPDE+OworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAl9OwogCiAJc3lzcmVnX3N5c3RlbV9jb250cm9sbGVyOiBzeXNjb25AMTAwNTAwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXAzLmR0c2kKaW5kZXggZjRmNzhjNC4uM2ZkYzg0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDMuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwMy5kdHNpCkBAIC05Miw2ICs5Miw4IEBACiAJCQl0aSxod21vZHMgPSAiYWVzIjsKIAkJCXJlZyA9IDwweDQ4MGM1MDAwIDB4NTA+OwogCQkJaW50ZXJydXB0cyA9IDwwPjsKKwkJCWRtYXMgPSA8JnNkbWEgNjUgJnNkbWEgNjY+OworCQkJZG1hLW5hbWVzID0gInR4IiwgInJ4IjsKIAkJfTsKIAogCQlwcm06IHBybUA0ODMwNjAwMCB7CkBAIC01NTAsNiArNTUyLDggQEAKIAkJCXRpLGh3bW9kcyA9ICJzaGFtIjsKIAkJCXJlZyA9IDwweDQ4MGMzMDAwIDB4NjQ+OwogCQkJaW50ZXJydXB0cyA9IDw0OT47CisJCQlkbWFzID0gPCZzZG1hIDY5PjsKKwkJCWRtYS1uYW1lcyA9ICJyeCI7CiAJCX07CiAKIAkJc21hcnRyZWZsZXhfY29yZTogc21hcnRyZWZsZXhANDgwY2IwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQtZHVvdmVyby5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQtZHVvdmVyby5kdHNpCmluZGV4IGU4NjBjY2QuLmYyYTk0ZmEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA0LWR1b3Zlcm8uZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNC1kdW92ZXJvLmR0c2kKQEAgLTE3MywxNCArMTczLDEyIEBACiAJdHdsOiB0d2xANDggewogCQlyZWcgPSA8MHg0OD47CiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSA3IElSUV9UWVBFX0xFVkVMX0hJR0g+OwkJLyogSVJRX1NZU18xTiBjYXNjYWRlZCB0byBnaWMgKi8KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAl9OwogCiAJdHdsNjA0MDogdHdsQDRiIHsKIAkJY29tcGF0aWJsZSA9ICJ0aSx0d2w2MDQwIjsKIAkJcmVnID0gPDB4NGI+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTE5IElSUV9UWVBFX0xFVkVMX0hJR0g+OwkJLyogSVJRX1NZU18yTiBjYXNjYWRlZCB0byBnaWMgKi8KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJdGksYXVkcHdyb24tZ3BpbyA9IDwmZ3BpbzYgMCBHUElPX0FDVElWRV9ISUdIPjsJCS8qIGdwaW9fMTYwICovCiAKIAkJdmlvLXN1cHBseSA9IDwmdjF2OD47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9vbWFwNC1wYW5kYS1jb21tb24uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA0LXBhbmRhLWNvbW1vbi5kdHNpCmluZGV4IDE1MDUxMzUuLjdjMTVmYjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA0LXBhbmRhLWNvbW1vbi5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA0LXBhbmRhLWNvbW1vbi5kdHNpCkBAIC0zNzIsNyArMzcyLDYgQEAKIAkJcmVnID0gPDB4NDg+OwogCQkvKiBJUlEjID0gNyAqLwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsgLyogSVJRX1NZU18xTiBjYXNjYWRlZCB0byBnaWMgKi8KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAl9OwogCiAJdHdsNjA0MDogdHdsQDRiIHsKQEAgLTM4NCw3ICszODMsNiBAQAogCiAJCS8qIElSUSMgPSAxMTkgKi8KIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDExOSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsgLyogSVJRX1NZU18yTiBjYXNjYWRlZCB0byBnaWMgKi8KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJdGksYXVkcHdyb24tZ3BpbyA9IDwmZ3BpbzQgMzEgR1BJT19BQ1RJVkVfSElHSD47ICAvKiBncGlvIGxpbmUgMTI3ICovCiAKIAkJdmlvLXN1cHBseSA9IDwmdjF2OD47CkBAIC00NzksMTcgKzQ3NywxNyBAQAogfTsKIAogJnVhcnQyIHsKLQlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZnaWMgR0lDX1NQSSA3MyBJUlFfVFlQRV9MRVZFTF9ISUdICisJaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmd2FrZXVwZ2VuIEdJQ19TUEkgNzMgSVJRX1RZUEVfTEVWRUxfSElHSAogCQkJICAgICAgICZvbWFwNF9wbXhfY29yZSBPTUFQNF9VQVJUMl9SWD47CiB9OwogCiAmdWFydDMgewotCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmdpYyBHSUNfU1BJIDc0IElSUV9UWVBFX0xFVkVMX0hJR0gKKwlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZ3YWtldXBnZW4gR0lDX1NQSSA3NCBJUlFfVFlQRV9MRVZFTF9ISUdICiAJCQkgICAgICAgJm9tYXA0X3BteF9jb3JlIE9NQVA0X1VBUlQzX1JYPjsKIH07CiAKICZ1YXJ0NCB7Ci0JaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmZ2ljIEdJQ19TUEkgNzAgSVJRX1RZUEVfTEVWRUxfSElHSAorCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8Jndha2V1cGdlbiBHSUNfU1BJIDcwIElSUV9UWVBFX0xFVkVMX0hJR0gKIAkJCSAgICAgICAmb21hcDRfcG14X2NvcmUgT01BUDRfVUFSVDRfUlg+OwogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQtc2RwLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA0LXNkcC5kdHMKaW5kZXggM2UxZGE0My4uOGFjYThkYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQtc2RwLmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNC1zZHAuZHRzCkBAIC0zNjMsNyArMzYzLDYgQEAKIAkJcmVnID0gPDB4NDg+OwogCQkvKiBTUEkgPSAwLCBJUlEjID0gNywgNCA9IGFjdGl2ZSBoaWdoIGxldmVsLXNlbnNpdGl2ZSAqLwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsgLyogSVJRX1NZU18xTiBjYXNjYWRlZCB0byBnaWMgKi8KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAl9OwogCiAJdHdsNjA0MDogdHdsQDRiIHsKQEAgLTM3NSw3ICszNzQsNiBAQAogCiAJCS8qIFNQSSA9IDAsIElSUSMgPSAxMTksIDQgPSBhY3RpdmUgaGlnaCBsZXZlbC1zZW5zaXRpdmUgKi8KIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDExOSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsgLyogSVJRX1NZU18yTiBjYXNjYWRlZCB0byBnaWMgKi8KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJdGksYXVkcHdyb24tZ3BpbyA9IDwmZ3BpbzQgMzEgMD47ICAvKiBncGlvIGxpbmUgMTI3ICovCiAKIAkJdmlvLXN1cHBseSA9IDwmdjF2OD47CkBAIC01NzAsMjEgKzU2OCwyMSBAQAogfTsKIAogJnVhcnQyIHsKLQlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZnaWMgR0lDX1NQSSA3MyBJUlFfVFlQRV9MRVZFTF9ISUdICisJaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmd2FrZXVwZ2VuIEdJQ19TUEkgNzMgSVJRX1RZUEVfTEVWRUxfSElHSAogCQkJICAgICAgICZvbWFwNF9wbXhfY29yZSBPTUFQNF9VQVJUMl9SWD47CiAJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAlwaW5jdHJsLTAgPSA8JnVhcnQyX3BpbnM+OwogfTsKIAogJnVhcnQzIHsKLQlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZnaWMgR0lDX1NQSSA3NCBJUlFfVFlQRV9MRVZFTF9ISUdICisJaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmd2FrZXVwZ2VuIEdJQ19TUEkgNzQgSVJRX1RZUEVfTEVWRUxfSElHSAogCQkJICAgICAgICZvbWFwNF9wbXhfY29yZSBPTUFQNF9VQVJUM19SWD47CiAJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAlwaW5jdHJsLTAgPSA8JnVhcnQzX3BpbnM+OwogfTsKIAogJnVhcnQ0IHsKLQlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZnaWMgR0lDX1NQSSA3MCBJUlFfVFlQRV9MRVZFTF9ISUdICisJaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmd2FrZXVwZ2VuIEdJQ19TUEkgNzAgSVJRX1RZUEVfTEVWRUxfSElHSAogCQkJICAgICAgICZvbWFwNF9wbXhfY29yZSBPTUFQNF9VQVJUNF9SWD47CiAJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKIAlwaW5jdHJsLTAgPSA8JnVhcnQ0X3BpbnM+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQtdmFyLXNvbS1vbTQ0LmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNC12YXItc29tLW9tNDQuZHRzaQppbmRleCAwNjI3MDFlLi5hNGYxYmEyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9vbWFwNC12YXItc29tLW9tNDQuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNC12YXItc29tLW9tNDQuZHRzaQpAQCAtMTg1LDcgKzE4NSw2IEBACiAJCXJlZyA9IDwweDQ4PjsKIAkJLyogU1BJID0gMCwgSVJRIyA9IDcsIDQgPSBhY3RpdmUgaGlnaCBsZXZlbC1zZW5zaXRpdmUgKi8KIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDcgSVJRX1RZUEVfTEVWRUxfSElHSD47IC8qIElSUV9TWVNfMU4gY2FzY2FkZWQgdG8gZ2ljICovCi0JCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CiAJfTsKIAogCXR3bDYwNDA6IHR3bEA0YiB7CkBAIC0xOTcsNyArMTk2LDYgQEAKIAogCQkvKiBTUEkgPSAwLCBJUlEjID0gMTE5LCA0ID0gYWN0aXZlIGhpZ2ggbGV2ZWwtc2Vuc2l0aXZlICovCiAJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxMTkgSVJRX1RZUEVfTEVWRUxfSElHSD47IC8qIElSUV9TWVNfMk4gY2FzY2FkZWQgdG8gZ2ljICovCi0JCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CiAJCXRpLGF1ZHB3cm9uLWdwaW8gPSA8JmdwaW82IDIyIDA+OyAvKiBncGlvIDE4MiAqLwogCiAJCXZpby1zdXBwbHkgPSA8JnYxdjg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA0LmR0c2kKaW5kZXggODc0MDFkOS4uZjIwOTFkMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDQuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNC5kdHNpCkBAIC0xNCw3ICsxNCw3IEBACiAKIC8gewogCWNvbXBhdGlibGUgPSAidGksb21hcDQ0MzAiLCAidGksb21hcDQiOwotCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmd2FrZXVwZ2VuPjsKIAogCWFsaWFzZXMgewogCQlpMmMwID0gJmkyYzE7CkBAIC01Niw2ICs1Niw3IEBACiAJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CiAJCXJlZyA9IDwweDQ4MjQxMDAwIDB4MTAwMD4sCiAJCSAgICAgIDwweDQ4MjQwMTAwIDB4MDEwMD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CiAJfTsKIAogCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDQ4MjQyMDAwIHsKQEAgLTcwLDYgKzcxLDE1IEBACiAJCWNsb2NrcyA9IDwmbXB1X3BlcmlwaGNsaz47CiAJCXJlZyA9IDwweDQ4MjQwNjAwIDB4MjA+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19QUEkgMTMgKEdJQ19DUFVfTUFTS19SQVcoMykgfCBJUlFfVFlQRV9MRVZFTF9ISUdIKT47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJfTsKKworCXdha2V1cGdlbjogaW50ZXJydXB0LWNvbnRyb2xsZXJANDgyODEwMDAgeworCQljb21wYXRpYmxlID0gInRpLG9tYXA0LXd1Z2VuLW1wdSI7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQlyZWcgPSA8MHg0ODI4MTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCX07CiAKIAkvKgpAQCAtMzE5LDcgKzMyOSw3IEBACiAJCXVhcnQyOiBzZXJpYWxANDgwNmMwMDAgewogCQkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC11YXJ0IjsKIAkJCXJlZyA9IDwweDQ4MDZjMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmdpYyBHSUNfU1BJIDczIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDczIElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQkJdGksaHdtb2RzID0gInVhcnQyIjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0ODAwMDAwMD47CiAJCX07CkBAIC0zMjcsNyArMzM3LDcgQEAKIAkJdWFydDM6IHNlcmlhbEA0ODAyMDAwMCB7CiAJCQljb21wYXRpYmxlID0gInRpLG9tYXA0LXVhcnQiOwogCQkJcmVnID0gPDB4NDgwMjAwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmZ2ljIEdJQ19TUEkgNzQgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNzQgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCQl0aSxod21vZHMgPSAidWFydDMiOwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDQ4MDAwMDAwPjsKIAkJfTsKQEAgLTMzNSw3ICszNDUsNyBAQAogCQl1YXJ0NDogc2VyaWFsQDQ4MDZlMDAwIHsKIAkJCWNvbXBhdGlibGUgPSAidGksb21hcDQtdWFydCI7CiAJCQlyZWcgPSA8MHg0ODA2ZTAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZnaWMgR0lDX1NQSSA3MCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWludGVycnVwdHMgPSA8R0lDX1NQSSA3MCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJCXRpLGh3bW9kcyA9ICJ1YXJ0NCI7CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8NDgwMDAwMDA+OwogCQl9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDUtY20tdDU0LmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA1LWNtLXQ1NC5kdHMKaW5kZXggYjU0YjI3MS4uNjFhZDJlYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDUtY20tdDU0LmR0cworKysgYi9hcmNoL2FybS9ib290L2R0cy9vbWFwNS1jbS10NTQuZHRzCkBAIC00MTIsNyArNDEyLDYgQEAKIAlwYWxtYXM6IHBhbG1hc0A0OCB7CiAJCWNvbXBhdGlibGUgPSAidGkscGFsbWFzIjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDcgSVJRX1RZUEVfTk9ORT47IC8qIElSUV9TWVNfMU4gKi8KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAkJcmVnID0gPDB4NDg+OwogCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA1LXVldm0uZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDUtdWV2bS5kdHMKaW5kZXggMTU5NzIwZC4uNzQ3NzdhNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDUtdWV2bS5kdHMKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDUtdWV2bS5kdHMKQEAgLTMxMSw3ICszMTEsNiBAQAogCXBhbG1hczogcGFsbWFzQDQ4IHsKIAkJY29tcGF0aWJsZSA9ICJ0aSxwYWxtYXMiOwogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNyBJUlFfVFlQRV9OT05FPjsgLyogSVJRX1NZU18xTiAqLwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCQlyZWcgPSA8MHg0OD47CiAJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwpAQCAtNTIxLDcgKzUyMCw2IEBACiAJCXBpbmN0cmwtMCA9IDwmdHdsNjA0MF9waW5zPjsKIAogCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTE5IElSUV9UWVBFX05PTkU+OyAvKiBJUlFfU1lTXzJOIGNhc2NhZGVkIHRvIGdpYyAqLwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCQl0aSxhdWRwd3Jvbi1ncGlvID0gPCZncGlvNSAxMyAwPjsgIC8qIGdwaW8gbGluZSAxNDEgKi8KIAogCQl2aW8tc3VwcGx5ID0gPCZzbXBzN19yZWc+OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDUuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA1LmR0c2kKaW5kZXggNGE0ODViNi4uNzdiNWY3MGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL29tYXA1LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvb21hcDUuZHRzaQpAQCAtMTgsNyArMTgsNyBAQAogCSNzaXplLWNlbGxzID0gPDE+OwogCiAJY29tcGF0aWJsZSA9ICJ0aSxvbWFwNSI7Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ3YWtldXBnZW4+OwogCiAJYWxpYXNlcyB7CiAJCWkyYzAgPSAmaTJjMTsKQEAgLTc5LDYgKzc5LDcgQEAKIAkJCSAgICAgPEdJQ19QUEkgMTQgKEdJQ19DUFVfTUFTS19SQVcoMykgfCBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKIAkJCSAgICAgPEdJQ19QUEkgMTEgKEdJQ19DUFVfTUFTS19SQVcoMykgfCBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKIAkJCSAgICAgPEdJQ19QUEkgMTAgKEdJQ19DUFVfTUFTS19SQVcoMykgfCBJUlFfVFlQRV9MRVZFTF9MT1cpPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAl9OwogCiAJcG11IHsKQEAgLTk1LDYgKzk2LDE1IEBACiAJCSAgICAgIDwweDQ4MjEyMDAwIDB4MTAwMD4sCiAJCSAgICAgIDwweDQ4MjE0MDAwIDB4MjAwMD4sCiAJCSAgICAgIDwweDQ4MjE2MDAwIDB4MjAwMD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJfTsKKworCXdha2V1cGdlbjogaW50ZXJydXB0LWNvbnRyb2xsZXJANDgyODEwMDAgeworCQljb21wYXRpYmxlID0gInRpLG9tYXA1LXd1Z2VuLW1wdSIsICJ0aSxvbWFwNC13dWdlbi1tcHUiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJcmVnID0gPDB4NDgyODEwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKIAl9OwogCiAJLyoKQEAgLTQ1OCw3ICs0NjgsNyBAQAogCQl1YXJ0MTogc2VyaWFsQDQ4MDZhMDAwIHsKIAkJCWNvbXBhdGlibGUgPSAidGksb21hcDQtdWFydCI7CiAJCQlyZWcgPSA8MHg0ODA2YTAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZnaWMgR0lDX1NQSSA3MiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWludGVycnVwdHMgPSA8R0lDX1NQSSA3MiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJCXRpLGh3bW9kcyA9ICJ1YXJ0MSI7CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8NDgwMDAwMDA+OwogCQl9OwpAQCAtNDY2LDcgKzQ3Niw3IEBACiAJCXVhcnQyOiBzZXJpYWxANDgwNmMwMDAgewogCQkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC11YXJ0IjsKIAkJCXJlZyA9IDwweDQ4MDZjMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmdpYyBHSUNfU1BJIDczIElSUV9UWVBFX0xFVkVMX0hJR0g+OworCQkJaW50ZXJydXB0cyA9IDxHSUNfU1BJIDczIElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQkJdGksaHdtb2RzID0gInVhcnQyIjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0ODAwMDAwMD47CiAJCX07CkBAIC00NzQsNyArNDg0LDcgQEAKIAkJdWFydDM6IHNlcmlhbEA0ODAyMDAwMCB7CiAJCQljb21wYXRpYmxlID0gInRpLG9tYXA0LXVhcnQiOwogCQkJcmVnID0gPDB4NDgwMjAwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cy1leHRlbmRlZCA9IDwmZ2ljIEdJQ19TUEkgNzQgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgNzQgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCQl0aSxod21vZHMgPSAidWFydDMiOwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDQ4MDAwMDAwPjsKIAkJfTsKQEAgLTQ4Miw3ICs0OTIsNyBAQAogCQl1YXJ0NDogc2VyaWFsQDQ4MDZlMDAwIHsKIAkJCWNvbXBhdGlibGUgPSAidGksb21hcDQtdWFydCI7CiAJCQlyZWcgPSA8MHg0ODA2ZTAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZnaWMgR0lDX1NQSSA3MCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWludGVycnVwdHMgPSA8R0lDX1NQSSA3MCBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJCXRpLGh3bW9kcyA9ICJ1YXJ0NCI7CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8NDgwMDAwMDA+OwogCQl9OwpAQCAtNDkwLDcgKzUwMCw3IEBACiAJCXVhcnQ1OiBzZXJpYWxANDgwNjYwMDAgewogCQkJY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC11YXJ0IjsKIAkJCXJlZyA9IDwweDQ4MDY2MDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMtZXh0ZW5kZWQgPSA8JmdpYyBHSUNfU1BJIDEwNSBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKKwkJCWludGVycnVwdHMgPSA8R0lDX1NQSSAxMDUgSVJRX1RZUEVfTEVWRUxfSElHSD47CiAJCQl0aSxod21vZHMgPSAidWFydDUiOwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDQ4MDAwMDAwPjsKIAkJfTsKQEAgLTQ5OCw3ICs1MDgsNyBAQAogCQl1YXJ0Njogc2VyaWFsQDQ4MDY4MDAwIHsKIAkJCWNvbXBhdGlibGUgPSAidGksb21hcDQtdWFydCI7CiAJCQlyZWcgPSA8MHg0ODA2ODAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzLWV4dGVuZGVkID0gPCZnaWMgR0lDX1NQSSAxMDYgSVJRX1RZUEVfTEVWRUxfSElHSD47CisJCQlpbnRlcnJ1cHRzID0gPEdJQ19TUEkgMTA2IElSUV9UWVBFX0xFVkVMX0hJR0g+OwogCQkJdGksaHdtb2RzID0gInVhcnQ2IjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0ODAwMDAwMD47CiAJCX07CkBAIC04ODMsMTQgKzg5MywxMiBAQAogCQkJdXNiaHNvaGNpOiBvaGNpQDRhMDY0ODAwIHsKIAkJCQljb21wYXRpYmxlID0gInRpLG9oY2ktb21hcDMiOwogCQkJCXJlZyA9IDwweDRhMDY0ODAwIDB4NDAwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCQkJCWludGVycnVwdHMgPSA8R0lDX1NQSSA3NiBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJCX07CiAKIAkJCXVzYmhzZWhjaTogZWhjaUA0YTA2NGMwMCB7CiAJCQkJY29tcGF0aWJsZSA9ICJ0aSxlaGNpLW9tYXAiOwogCQkJCXJlZyA9IDwweDRhMDY0YzAwIDB4NDAwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCQkJCWludGVycnVwdHMgPSA8R0lDX1NQSSA3NyBJUlFfVFlQRV9MRVZFTF9ISUdIPjsKIAkJCX07CiAJCX07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9yazMyODguZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzI4OC5kdHNpCmluZGV4IGQ3NzFmNjguLmVjY2M3OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzI4OC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3JrMzI4OC5kdHNpCkBAIC00MTEsNiArNDExLDcgQEAKIAkJCSJtYWNfY2xrX3J4IiwgIm1hY19jbGtfdHgiLAogCQkJImNsa19tYWNfcmVmIiwgImNsa19tYWNfcmVmb3V0IiwKIAkJCSJhY2xrX21hYyIsICJwY2xrX21hYyI7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIAogCXVzYl9ob3N0MF9laGNpOiB1c2JAZmY1MDAwMDAgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc2FtYTVkM19lbWFjLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zYW1hNWQzX2VtYWMuZHRzaQppbmRleCBmZTJhZjkyLi5iNDU0NGNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zYW1hNWQzX2VtYWMuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zYW1hNWQzX2VtYWMuZHRzaQpAQCAtNDEsNyArNDEsNyBAQAogCQkJfTsKIAogCQkJbWFjYjE6IGV0aGVybmV0QGY4MDJjMDAwIHsKLQkJCQljb21wYXRpYmxlID0gImNkbnMsYXQzMmFwNzAwMC1tYWNiIiwgImNkbnMsbWFjYiI7CisJCQkJY29tcGF0aWJsZSA9ICJjZG5zLGF0OTFzYW05MjYwLW1hY2IiLCAiY2RucyxtYWNiIjsKIAkJCQlyZWcgPSA8MHhmODAyYzAwMCAweDEwMD47CiAJCQkJaW50ZXJydXB0cyA9IDwzNSBJUlFfVFlQRV9MRVZFTF9ISUdIIDM+OwogCQkJCXBpbmN0cmwtbmFtZXMgPSAiZGVmYXVsdCI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zb2NmcGdhLmR0c2kKaW5kZXggOWQ4NzYwOS4uZDkxNzZlNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc29jZnBnYS5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3NvY2ZwZ2EuZHRzaQpAQCAtNjYwLDcgKzY2MCw3IEBACiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCSNzaXplLWNlbGxzID0gPDA+OwogCQkJcmVnID0gPDB4ZmZmMDEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MCAxNTYgND47CisJCQlpbnRlcnJ1cHRzID0gPDAgMTU1IDQ+OwogCQkJbnVtLWNzID0gPDQ+OwogCQkJY2xvY2tzID0gPCZzcGlfbV9jbGs+OwogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N0aWg0MTYuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N0aWg0MTYuZHRzaQppbmRleCBlYTI4ZWJhLi5lZWI3YWZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zdGloNDE2LmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3RpaDQxNi5kdHNpCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSAic3RpaDQxNi1jbG9jay5kdHNpIgogI2luY2x1ZGUgInN0aWg0MTYtcGluY3RybC5kdHNpIgogCi0jaW5jbHVkZSA8ZHQtYmluZGluZ3MvcGh5L3BoeS1taXBoeTM2NXguaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9waHkvcGh5Lmg+CiAjaW5jbHVkZSA8ZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvYXJtLWdpYy5oPgogI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3Jlc2V0LWNvbnRyb2xsZXIvc3RpaDQxNi1yZXNldHMuaD4KIC8gewpAQCAtMzA2LDcgKzMwNiw3IEBACiAJCQlyZWcgICAgICAgICAgICAgPSA8MHhmZTM4MDAwMCAweDEwMDA+OwogCQkJaW50ZXJydXB0cyAgICAgID0gPEdJQ19TUEkgMTU3IElSUV9UWVBFX05PTkU+OwogCQkJaW50ZXJydXB0LW5hbWVzID0gImhvc3RjIjsKLQkJCXBoeXMJICAgICAgICA9IDwmcGh5X3BvcnQwIE1JUEhZX1RZUEVfU0FUQT47CisJCQlwaHlzCSAgICAgICAgPSA8JnBoeV9wb3J0MCBQSFlfVFlQRV9TQVRBPjsKIAkJCXBoeS1uYW1lcyAgICAgICA9ICJzYXRhLXBoeSI7CiAJCQlyZXNldHMJICAgICAgICA9IDwmcG93ZXJkb3duIFNUSUg0MTZfU0FUQTBfUE9XRVJET1dOPiwKIAkJCQkJICA8JnNvZnRyZXNldCBTVElINDE2X1NBVEEwX1NPRlRSRVNFVD47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW40aS1hMTAtb2xpbnV4aW5vLWxpbWUuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNGktYTEwLW9saW51eGluby1saW1lLmR0cwppbmRleCBhYjc4OTFjLi43NTc0MmY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zdW40aS1hMTAtb2xpbnV4aW5vLWxpbWUuZHRzCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjRpLWExMC1vbGludXhpbm8tbGltZS5kdHMKQEAgLTU2LDYgKzU2LDIyIEBACiAJbW9kZWwgPSAiT2xpbWV4IEExMC1PTGludVhpbm8tTElNRSI7CiAJY29tcGF0aWJsZSA9ICJvbGltZXgsYTEwLW9saW51eGluby1saW1lIiwgImFsbHdpbm5lcixzdW40aS1hMTAiOwogCisJY3B1cyB7CisJCWNwdTA6IGNwdUAwIHsKKwkJCS8qCisJCQkgKiBUaGUgQTEwLUxpbWUgaXMga25vd24gdG8gYmUgdW5zdGFibGUKKwkJCSAqIHdoZW4gcnVubmluZyBhdCAxMDA4IE1IegorCQkJICovCisJCQlvcGVyYXRpbmctcG9pbnRzID0gPAorCQkJCS8qIGtIeiAgICB1ViAqLworCQkJCTkxMjAwMCAgMTM1MDAwMAorCQkJCTg2NDAwMCAgMTMwMDAwMAorCQkJCTYyNDAwMCAgMTI1MDAwMAorCQkJCT47CisJCQljb29saW5nLW1heC1sZXZlbCA9IDwyPjsKKwkJfTsKKwl9OworCiAJc29jQDAxYzAwMDAwIHsKIAkJZW1hYzogZXRoZXJuZXRAMDFjMGIwMDAgewogCQkJcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjRpLWExMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNGktYTEwLmR0c2kKaW5kZXggNWMyOTI1OC4uZWViYjc4NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNGktYTEwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNGktYTEwLmR0c2kKQEAgLTc1LDcgKzc1LDYgQEAKIAkJCWNsb2NrLWxhdGVuY3kgPSA8MjQ0MTQ0PjsgLyogOCAzMmsgcGVyaW9kcyAqLwogCQkJb3BlcmF0aW5nLXBvaW50cyA9IDwKIAkJCQkvKiBrSHogICAgdVYgKi8KLQkJCQkxMDU2MDAwIDE1MDAwMDAKIAkJCQkxMDA4MDAwIDE0MDAwMDAKIAkJCQk5MTIwMDAgIDEzNTAwMDAKIAkJCQk4NjQwMDAgIDEzMDAwMDAKQEAgLTgzLDcgKzgyLDcgQEAKIAkJCQk+OwogCQkJI2Nvb2xpbmctY2VsbHMgPSA8Mj47CiAJCQljb29saW5nLW1pbi1sZXZlbCA9IDwwPjsKLQkJCWNvb2xpbmctbWF4LWxldmVsID0gPDQ+OworCQkJY29vbGluZy1tYXgtbGV2ZWwgPSA8Mz47CiAJCX07CiAJfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc3VuNWktYTEzLmR0c2kgYi9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQppbmRleCBmODgxOGYxLi44ODNjYjQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy9zdW41aS1hMTMuZHRzaQpAQCAtNDcsNyArNDcsNiBAQAogCQkJY2xvY2stbGF0ZW5jeSA9IDwyNDQxNDQ+OyAvKiA4IDMyayBwZXJpb2RzICovCiAJCQlvcGVyYXRpbmctcG9pbnRzID0gPAogCQkJCS8qIGtIeiAgICB1ViAqLwotCQkJCTExMDQwMDAJMTUwMDAwMAogCQkJCTEwMDgwMDAgMTQwMDAwMAogCQkJCTkxMjAwMCAgMTM1MDAwMAogCQkJCTg2NDAwMCAgMTMwMDAwMApAQCAtNTcsNyArNTYsNyBAQAogCQkJCT47CiAJCQkjY29vbGluZy1jZWxscyA9IDwyPjsKIAkJCWNvb2xpbmctbWluLWxldmVsID0gPDA+OwotCQkJY29vbGluZy1tYXgtbGV2ZWwgPSA8Nj47CisJCQljb29saW5nLW1heC1sZXZlbCA9IDw1PjsKIAkJfTsKIAl9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy9zdW43aS1hMjAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpCmluZGV4IDNhODUzMGIuLmZkZDE4MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3N1bjdpLWEyMC5kdHNpCkBAIC0xMDUsNyArMTA1LDYgQEAKIAkJCWNsb2NrLWxhdGVuY3kgPSA8MjQ0MTQ0PjsgLyogOCAzMmsgcGVyaW9kcyAqLwogCQkJb3BlcmF0aW5nLXBvaW50cyA9IDwKIAkJCQkvKiBrSHogICAgdVYgKi8KLQkJCQkxMDA4MDAwIDE0NTAwMDAKIAkJCQk5NjAwMDAgIDE0MDAwMDAKIAkJCQk5MTIwMDAgIDE0MDAwMDAKIAkJCQk4NjQwMDAgIDEzMDAwMDAKQEAgLTExNiw3ICsxMTUsNyBAQAogCQkJCT47CiAJCQkjY29vbGluZy1jZWxscyA9IDwyPjsKIAkJCWNvb2xpbmctbWluLWxldmVsID0gPDA+OwotCQkJY29vbGluZy1tYXgtbGV2ZWwgPSA8Nz47CisJCQljb29saW5nLW1heC1sZXZlbCA9IDw2PjsKIAkJfTsKIAogCQljcHVAMSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYTExNC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMTQuZHRzaQppbmRleCA0Mjk2YjUzLi5mNThhM2Q5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYTExNC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMTE0LmR0c2kKQEAgLTgsNyArOCw3IEBACiAKIC8gewogCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTE0IjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmxpYz47CiAKIAlob3N0MXhANTAwMDAwMDAgewogCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTExNC1ob3N0MXgiLCAic2ltcGxlLWJ1cyI7CkBAIC0xMzQsNiArMTM0LDE5IEBACiAJCSAgICAgIDwweDUwMDQ2MDAwIDB4MjAwMD47CiAJCWludGVycnVwdHMgPSA8R0lDX1BQSSA5CiAJCQkoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0xFVkVMX0hJR0gpPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmZ2ljPjsKKwl9OworCisJbGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA2MDAwNDAwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTE0LWljdGxyIiwgIm52aWRpYSx0ZWdyYTMwLWljdGxyIjsKKwkJcmVnID0gPDB4NjAwMDQwMDAgMHgxMDA+LAorCQkgICAgICA8MHg2MDAwNDEwMCAweDUwPiwKKwkJICAgICAgPDB4NjAwMDQyMDAgMHg1MD4sCisJCSAgICAgIDwweDYwMDA0MzAwIDB4NTA+LAorCQkgICAgICA8MHg2MDAwNDQwMCAweDUwPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CiAJfTsKIAogCXRpbWVyQDYwMDA1MDAwIHsKQEAgLTc2Niw1ICs3NzksNiBAQAogCQkJCShHSUNfQ1BVX01BU0tfU0lNUExFKDQpIHwgSVJRX1RZUEVfTEVWRUxfTE9XKT4sCiAJCQk8R0lDX1BQSSAxMAogCQkJCShHSUNfQ1BVX01BU0tfU0lNUExFKDQpIHwgSVJRX1RZUEVfTEVWRUxfTE9XKT47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYTEyNC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmExMjQuZHRzaQppbmRleCA0YmUwNmM2Li5kYjg1Njk1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYTEyNC5kdHNpCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMTI0LmR0c2kKQEAgLTEwLDcgKzEwLDcgQEAKIAogLyB7CiAJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmExMjQiOwotCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbGljPjsKIAkjYWRkcmVzcy1jZWxscyA9IDwyPjsKIAkjc2l6ZS1jZWxscyA9IDwyPjsKIApAQCAtMTczLDYgKzE3Myw3IEBACiAJCSAgICAgIDwweDAgMHg1MDA0NjAwMCAweDAgMHgyMDAwPjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfUFBJIDkKIAkJCShHSUNfQ1BVX01BU0tfU0lNUExFKDQpIHwgSVJRX1RZUEVfTEVWRUxfSElHSCk+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCX07CiAKIAlncHVAMCw1NzAwMDAwMCB7CkBAIC0xOTAsNiArMTkxLDE4IEBACiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKIAorCWxpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJANjAwMDQwMDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTEyNC1pY3RsciIsICJudmlkaWEsdGVncmEzMC1pY3RsciI7CisJCXJlZyA9IDwweDAgMHg2MDAwNDAwMCAweDAgMHgxMDA+LAorCQkgICAgICA8MHgwIDB4NjAwMDQxMDAgMHgwIDB4MTAwPiwKKwkJICAgICAgPDB4MCAweDYwMDA0MjAwIDB4MCAweDEwMD4sCisJCSAgICAgIDwweDAgMHg2MDAwNDMwMCAweDAgMHgxMDA+LAorCQkgICAgICA8MHgwIDB4NjAwMDQ0MDAgMHgwIDB4MTAwPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmdpYz47CisJfTsKKwogCXRpbWVyQDAsNjAwMDUwMDAgewogCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTEyNC10aW1lciIsICJudmlkaWEsdGVncmEyMC10aW1lciI7CiAJCXJlZyA9IDwweDAgMHg2MDAwNTAwMCAweDAgMHg0MDA+OwpAQCAtOTU1LDUgKzk2OCw2IEBACiAJCQkJKEdJQ19DUFVfTUFTS19TSU1QTEUoNCkgfCBJUlFfVFlQRV9MRVZFTF9MT1cpPiwKIAkJCSAgICAgPEdJQ19QUEkgMTAKIAkJCQkoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0xFVkVMX0xPVyk+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZnaWM+OwogCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEyMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEyMC5kdHNpCmluZGV4IGU1NTI3ZjcuLmFkZjZiMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMjAuZHRzaQorKysgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYTIwLmR0c2kKQEAgLTcsNyArNyw3IEBACiAKIC8gewogCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAiOwotCWludGVycnVwdC1wYXJlbnQgPSA8JmludGM+OworCWludGVycnVwdC1wYXJlbnQgPSA8JmxpYz47CiAKIAlob3N0MXhANTAwMDAwMDAgewogCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWhvc3QxeCIsICJzaW1wbGUtYnVzIjsKQEAgLTE0Miw2ICsxNDIsNyBAQAogCiAJdGltZXJANTAwNDA2MDAgewogCQljb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTktdHdkLXRpbWVyIjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47CiAJCXJlZyA9IDwweDUwMDQwNjAwIDB4MjA+OwogCQlpbnRlcnJ1cHRzID0gPEdJQ19QUEkgMTMKIAkJCShHSUNfQ1BVX01BU0tfU0lNUExFKDIpIHwgSVJRX1RZUEVfTEVWRUxfSElHSCk+OwpAQCAtMTU0LDYgKzE1NSw3IEBACiAJCSAgICAgICAweDUwMDQwMTAwIDB4MDEwMD47CiAJCWludGVycnVwdC1jb250cm9sbGVyOwogCQkjaW50ZXJydXB0LWNlbGxzID0gPDM+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpbnRjPjsKIAl9OwogCiAJY2FjaGUtY29udHJvbGxlckA1MDA0MzAwMCB7CkBAIC0xNjUsNiArMTY3LDE3IEBACiAJCWNhY2hlLWxldmVsID0gPDI+OwogCX07CiAKKwlsaWM6IGludGVycnVwdC1jb250cm9sbGVyQDYwMDA0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1pY3RsciI7CisJCXJlZyA9IDwweDYwMDA0MDAwIDB4MTAwPiwKKwkJICAgICAgPDB4NjAwMDQxMDAgMHg1MD4sCisJCSAgICAgIDwweDYwMDA0MjAwIDB4NTA+LAorCQkgICAgICA8MHg2MDAwNDMwMCAweDUwPjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mz47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JmludGM+OworCX07CisKIAl0aW1lckA2MDAwNTAwMCB7CiAJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtdGltZXIiOwogCQlyZWcgPSA8MHg2MDAwNTAwMCAweDYwPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMzAuZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhMzAuZHRzaQppbmRleCBkYjQ4MTBkLi42MGUyMDVhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L2R0cy90ZWdyYTMwLmR0c2kKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEzMC5kdHNpCkBAIC04LDcgKzgsNyBAQAogCiAvIHsKIAljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTMwIjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpbnRjPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZsaWM+OwogCiAJcGNpZS1jb250cm9sbGVyQDAwMDAzMDAwIHsKIAkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEzMC1wY2llIjsKQEAgLTIyOCw2ICsyMjgsNyBAQAogCXRpbWVyQDUwMDQwNjAwIHsKIAkJY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWE5LXR3ZC10aW1lciI7CiAJCXJlZyA9IDwweDUwMDQwNjAwIDB4MjA+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpbnRjPjsKIAkJaW50ZXJydXB0cyA9IDxHSUNfUFBJIDEzCiAJCQkoR0lDX0NQVV9NQVNLX1NJTVBMRSg0KSB8IElSUV9UWVBFX0xFVkVMX0hJR0gpPjsKIAkJY2xvY2tzID0gPCZ0ZWdyYV9jYXIgVEVHUkEzMF9DTEtfVFdEPjsKQEAgLTIzOSw2ICsyNDAsNyBAQAogCQkgICAgICAgMHg1MDA0MDEwMCAweDAxMDA+OwogCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKIAkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47CiAJfTsKIAogCWNhY2hlLWNvbnRyb2xsZXJANTAwNDMwMDAgewpAQCAtMjUwLDYgKzI1MiwxOCBAQAogCQljYWNoZS1sZXZlbCA9IDwyPjsKIAl9OwogCisJbGljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA2MDAwNDAwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtaWN0bHIiOworCQlyZWcgPSA8MHg2MDAwNDAwMCAweDEwMD4sCisJCSAgICAgIDwweDYwMDA0MTAwIDB4NTA+LAorCQkgICAgICA8MHg2MDAwNDIwMCAweDUwPiwKKwkJICAgICAgPDB4NjAwMDQzMDAgMHg1MD4sCisJCSAgICAgIDwweDYwMDA0NDAwIDB4NTA+OworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwzPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47CisJfTsKKwogCXRpbWVyQDYwMDA1MDAwIHsKIAkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEzMC10aW1lciIsICJudmlkaWEsdGVncmEyMC10aW1lciI7CiAJCXJlZyA9IDwweDYwMDA1MDAwIDB4NDAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbW1vbi9iTF9zd2l0Y2hlci5jIGIvYXJjaC9hcm0vY29tbW9uL2JMX3N3aXRjaGVyLmMKaW5kZXggNmVhZGRjNC4uMzdkYzBmZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2JMX3N3aXRjaGVyLmMKKysrIGIvYXJjaC9hcm0vY29tbW9uL2JMX3N3aXRjaGVyLmMKQEAgLTE1MSw4ICsxNTEsNiBAQAogCXVuc2lnbmVkIGludCBtcGlkciwgdGhpc19jcHUsIHRoYXRfY3B1OwogCXVuc2lnbmVkIGludCBvYl9tcGlkciwgb2JfY3B1LCBvYl9jbHVzdGVyLCBpYl9tcGlkciwgaWJfY3B1LCBpYl9jbHVzdGVyOwogCXN0cnVjdCBjb21wbGV0aW9uIGluYm91bmRfYWxpdmU7Ci0Jc3RydWN0IHRpY2tfZGV2aWNlICp0ZGV2OwotCWVudW0gY2xvY2tfZXZlbnRfbW9kZSB0ZGV2X21vZGU7CiAJbG9uZyB2b2xhdGlsZSAqaGFuZHNoYWtlX3B0cjsKIAlpbnQgaXBpX25yLCByZXQ7CiAKQEAgLTIxOSwxMyArMjE3LDcgQEAKIAkvKiByZWRpcmVjdCBHSUMncyBTR0lzIHRvIG91ciBjb3VudGVycGFydCAqLwogCWdpY19taWdyYXRlX3RhcmdldChiTF9naWNfaWRbaWJfY3B1XVtpYl9jbHVzdGVyXSk7CiAKLQl0ZGV2ID0gdGlja19nZXRfZGV2aWNlKHRoaXNfY3B1KTsKLQlpZiAodGRldiAmJiAhY3B1bWFza19lcXVhbCh0ZGV2LT5ldnRkZXYtPmNwdW1hc2ssIGNwdW1hc2tfb2YodGhpc19jcHUpKSkKLQkJdGRldiA9IE5VTEw7Ci0JaWYgKHRkZXYpIHsKLQkJdGRldl9tb2RlID0gdGRldi0+ZXZ0ZGV2LT5tb2RlOwotCQljbG9ja2V2ZW50c19zZXRfbW9kZSh0ZGV2LT5ldnRkZXYsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKLQl9CisJdGlja19zdXNwZW5kX2xvY2FsKCk7CiAKIAlyZXQgPSBjcHVfcG1fZW50ZXIoKTsKIApAQCAtMjUxLDExICsyNDMsNyBAQAogCiAJcmV0ID0gY3B1X3BtX2V4aXQoKTsKIAotCWlmICh0ZGV2KSB7Ci0JCWNsb2NrZXZlbnRzX3NldF9tb2RlKHRkZXYtPmV2dGRldiwgdGRldl9tb2RlKTsKLQkJY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudCh0ZGV2LT5ldnRkZXYsCi0JCQkJCSAgdGRldi0+ZXZ0ZGV2LT5uZXh0X2V2ZW50LCAxKTsKLQl9CisJdGlja19yZXN1bWVfbG9jYWwoKTsKIAogCXRyYWNlX2NwdV9taWdyYXRlX2ZpbmlzaChrdGltZV9nZXRfcmVhbF9ucygpLCBpYl9tcGlkcik7CiAJbG9jYWxfZmlxX2VuYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9iYWRnZTRfZGVmY29uZmlnIGIvYXJjaC9hcm0vY29uZmlncy9iYWRnZTRfZGVmY29uZmlnCmluZGV4IDA0OTRjOGYuLmQ1OTAwOTggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NvbmZpZ3MvYmFkZ2U0X2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL2JhZGdlNF9kZWZjb25maWcKQEAgLTEyLDcgKzEyLDYgQEAKIENPTkZJR19GUEVfTldGUEU9eQogQ09ORklHX0JJTkZNVF9BT1VUPW0KIENPTkZJR19CSU5GTVRfTUlTQz1tCi1DT05GSUdfQVJUSFVSPW0KIENPTkZJR19ORVQ9eQogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfVU5JWD15CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcnlwdG8vS2NvbmZpZyBiL2FyY2gvYXJtL2NyeXB0by9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYTIyMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcnlwdG8vS2NvbmZpZwpAQCAtMCwwICsxLDEzMCBAQAorCittZW51Y29uZmlnIEFSTV9DUllQVE8KKwlib29sICJBUk0gQWNjZWxlcmF0ZWQgQ3J5cHRvZ3JhcGhpYyBBbGdvcml0aG1zIgorCWRlcGVuZHMgb24gQVJNCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBjaG9vc2UgZnJvbSBhIHNlbGVjdGlvbiBvZiBjcnlwdG9ncmFwaGljIGFsZ29yaXRobXMKKwkgIGltcGxlbWVudGVkIHVzaW5nIEFSTSBzcGVjaWZpYyBDUFUgZmVhdHVyZXMgb3IgaW5zdHJ1Y3Rpb25zLgorCitpZiBBUk1fQ1JZUFRPCisKK2NvbmZpZyBDUllQVE9fU0hBMV9BUk0KKwl0cmlzdGF0ZSAiU0hBMSBkaWdlc3QgYWxnb3JpdGhtIChBUk0tYXNtKSIKKwlzZWxlY3QgQ1JZUFRPX1NIQTEKKwlzZWxlY3QgQ1JZUFRPX0hBU0gKKwloZWxwCisJICBTSEEtMSBzZWN1cmUgaGFzaCBzdGFuZGFyZCAoRklQUyAxODAtMS9ERklQUyAxODAtMikgaW1wbGVtZW50ZWQKKwkgIHVzaW5nIG9wdGltaXplZCBBUk0gYXNzZW1ibGVyLgorCitjb25maWcgQ1JZUFRPX1NIQTFfQVJNX05FT04KKwl0cmlzdGF0ZSAiU0hBMSBkaWdlc3QgYWxnb3JpdGhtIChBUk0gTkVPTikiCisJZGVwZW5kcyBvbiBLRVJORUxfTU9ERV9ORU9OCisJc2VsZWN0IENSWVBUT19TSEExX0FSTQorCXNlbGVjdCBDUllQVE9fU0hBMQorCXNlbGVjdCBDUllQVE9fSEFTSAorCWhlbHAKKwkgIFNIQS0xIHNlY3VyZSBoYXNoIHN0YW5kYXJkIChGSVBTIDE4MC0xL0RGSVBTIDE4MC0yKSBpbXBsZW1lbnRlZAorCSAgdXNpbmcgb3B0aW1pemVkIEFSTSBORU9OIGFzc2VtYmx5LCB3aGVuIE5FT04gaW5zdHJ1Y3Rpb25zIGFyZQorCSAgYXZhaWxhYmxlLgorCitjb25maWcgQ1JZUFRPX1NIQTFfQVJNX0NFCisJdHJpc3RhdGUgIlNIQTEgZGlnZXN0IGFsZ29yaXRobSAoQVJNIHY4IENyeXB0byBFeHRlbnNpb25zKSIKKwlkZXBlbmRzIG9uIEtFUk5FTF9NT0RFX05FT04KKwlzZWxlY3QgQ1JZUFRPX1NIQTFfQVJNCisJc2VsZWN0IENSWVBUT19IQVNICisJaGVscAorCSAgU0hBLTEgc2VjdXJlIGhhc2ggc3RhbmRhcmQgKEZJUFMgMTgwLTEvREZJUFMgMTgwLTIpIGltcGxlbWVudGVkCisJICB1c2luZyBzcGVjaWFsIEFSTXY4IENyeXB0byBFeHRlbnNpb25zLgorCitjb25maWcgQ1JZUFRPX1NIQTJfQVJNX0NFCisJdHJpc3RhdGUgIlNIQS0yMjQvMjU2IGRpZ2VzdCBhbGdvcml0aG0gKEFSTSB2OCBDcnlwdG8gRXh0ZW5zaW9ucykiCisJZGVwZW5kcyBvbiBLRVJORUxfTU9ERV9ORU9OCisJc2VsZWN0IENSWVBUT19TSEEyNTZfQVJNCisJc2VsZWN0IENSWVBUT19IQVNICisJaGVscAorCSAgU0hBLTI1NiBzZWN1cmUgaGFzaCBzdGFuZGFyZCAoREZJUFMgMTgwLTIpIGltcGxlbWVudGVkCisJICB1c2luZyBzcGVjaWFsIEFSTXY4IENyeXB0byBFeHRlbnNpb25zLgorCitjb25maWcgQ1JZUFRPX1NIQTI1Nl9BUk0KKwl0cmlzdGF0ZSAiU0hBLTIyNC8yNTYgZGlnZXN0IGFsZ29yaXRobSAoQVJNLWFzbSBhbmQgTkVPTikiCisJc2VsZWN0IENSWVBUT19IQVNICisJZGVwZW5kcyBvbiAhQ1BVX1Y3TQorCWhlbHAKKwkgIFNIQS0yNTYgc2VjdXJlIGhhc2ggc3RhbmRhcmQgKERGSVBTIDE4MC0yKSBpbXBsZW1lbnRlZAorCSAgdXNpbmcgb3B0aW1pemVkIEFSTSBhc3NlbWJsZXIgYW5kIE5FT04sIHdoZW4gYXZhaWxhYmxlLgorCitjb25maWcgQ1JZUFRPX1NIQTUxMl9BUk1fTkVPTgorCXRyaXN0YXRlICJTSEEzODQgYW5kIFNIQTUxMiBkaWdlc3QgYWxnb3JpdGhtIChBUk0gTkVPTikiCisJZGVwZW5kcyBvbiBLRVJORUxfTU9ERV9ORU9OCisJc2VsZWN0IENSWVBUT19TSEE1MTIKKwlzZWxlY3QgQ1JZUFRPX0hBU0gKKwloZWxwCisJICBTSEEtNTEyIHNlY3VyZSBoYXNoIHN0YW5kYXJkIChERklQUyAxODAtMikgaW1wbGVtZW50ZWQKKwkgIHVzaW5nIEFSTSBORU9OIGluc3RydWN0aW9ucywgd2hlbiBhdmFpbGFibGUuCisKKwkgIFRoaXMgdmVyc2lvbiBvZiBTSEEgaW1wbGVtZW50cyBhIDUxMiBiaXQgaGFzaCB3aXRoIDI1NiBiaXRzIG9mCisJICBzZWN1cml0eSBhZ2FpbnN0IGNvbGxpc2lvbiBhdHRhY2tzLgorCisJICBUaGlzIGNvZGUgYWxzbyBpbmNsdWRlcyBTSEEtMzg0LCBhIDM4NCBiaXQgaGFzaCB3aXRoIDE5MiBiaXRzCisJICBvZiBzZWN1cml0eSBhZ2FpbnN0IGNvbGxpc2lvbiBhdHRhY2tzLgorCitjb25maWcgQ1JZUFRPX0FFU19BUk0KKwl0cmlzdGF0ZSAiQUVTIGNpcGhlciBhbGdvcml0aG1zIChBUk0tYXNtKSIKKwlkZXBlbmRzIG9uIEFSTQorCXNlbGVjdCBDUllQVE9fQUxHQVBJCisJc2VsZWN0IENSWVBUT19BRVMKKwloZWxwCisJICBVc2Ugb3B0aW1pemVkIEFFUyBhc3NlbWJsZXIgcm91dGluZXMgZm9yIEFSTSBwbGF0Zm9ybXMuCisKKwkgIEFFUyBjaXBoZXIgYWxnb3JpdGhtcyAoRklQUy0xOTcpLiBBRVMgdXNlcyB0aGUgUmlqbmRhZWwKKwkgIGFsZ29yaXRobS4KKworCSAgUmlqbmRhZWwgYXBwZWFycyB0byBiZSBjb25zaXN0ZW50bHkgYSB2ZXJ5IGdvb2QgcGVyZm9ybWVyIGluCisJICBib3RoIGhhcmR3YXJlIGFuZCBzb2Z0d2FyZSBhY3Jvc3MgYSB3aWRlIHJhbmdlIG9mIGNvbXB1dGluZworCSAgZW52aXJvbm1lbnRzIHJlZ2FyZGxlc3Mgb2YgaXRzIHVzZSBpbiBmZWVkYmFjayBvciBub24tZmVlZGJhY2sKKwkgIG1vZGVzLiBJdHMga2V5IHNldHVwIHRpbWUgaXMgZXhjZWxsZW50LCBhbmQgaXRzIGtleSBhZ2lsaXR5IGlzCisJICBnb29kLiBSaWpuZGFlbCdzIHZlcnkgbG93IG1lbW9yeSByZXF1aXJlbWVudHMgbWFrZSBpdCB2ZXJ5IHdlbGwKKwkgIHN1aXRlZCBmb3IgcmVzdHJpY3RlZC1zcGFjZSBlbnZpcm9ubWVudHMsIGluIHdoaWNoIGl0IGFsc28KKwkgIGRlbW9uc3RyYXRlcyBleGNlbGxlbnQgcGVyZm9ybWFuY2UuIFJpam5kYWVsJ3Mgb3BlcmF0aW9ucyBhcmUKKwkgIGFtb25nIHRoZSBlYXNpZXN0IHRvIGRlZmVuZCBhZ2FpbnN0IHBvd2VyIGFuZCB0aW1pbmcgYXR0YWNrcy4KKworCSAgVGhlIEFFUyBzcGVjaWZpZXMgdGhyZWUga2V5IHNpemVzOiAxMjgsIDE5MiBhbmQgMjU2IGJpdHMKKworCSAgU2VlIDxodHRwOi8vY3NyYy5uaXN0Lmdvdi9lbmNyeXB0aW9uL2Flcy8+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitjb25maWcgQ1JZUFRPX0FFU19BUk1fQlMKKwl0cmlzdGF0ZSAiQml0IHNsaWNlZCBBRVMgdXNpbmcgTkVPTiBpbnN0cnVjdGlvbnMiCisJZGVwZW5kcyBvbiBLRVJORUxfTU9ERV9ORU9OCisJc2VsZWN0IENSWVBUT19BTEdBUEkKKwlzZWxlY3QgQ1JZUFRPX0FFU19BUk0KKwlzZWxlY3QgQ1JZUFRPX0FCTEtfSEVMUEVSCisJaGVscAorCSAgVXNlIGEgZmFzdGVyIGFuZCBtb3JlIHNlY3VyZSBORU9OIGJhc2VkIGltcGxlbWVudGF0aW9uIG9mIEFFUyBpbiBDQkMsCisJICBDVFIgYW5kIFhUUyBtb2RlcworCisJICBCaXQgc2xpY2VkIEFFUyBnaXZlcyBhcm91bmQgNDUlIHNwZWVkdXAgb24gQ29ydGV4LUExNSBmb3IgQ1RSIG1vZGUKKwkgIGFuZCBmb3IgWFRTIG1vZGUgZW5jcnlwdGlvbiwgQ0JDIGFuZCBYVFMgbW9kZSBkZWNyeXB0aW9uIHNwZWVkdXAgaXMKKwkgIGFyb3VuZCAyNSUuIChDQkMgZW5jcnlwdGlvbiBzcGVlZCBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyBkcml2ZXIuKQorCSAgVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZWx5IG9uIGFueSBsb29rdXAgdGFibGVzIHNvIGl0IGlzCisJICBiZWxpZXZlZCB0byBiZSBpbnZ1bG5lcmFibGUgdG8gY2FjaGUgdGltaW5nIGF0dGFja3MuCisKK2NvbmZpZyBDUllQVE9fQUVTX0FSTV9DRQorCXRyaXN0YXRlICJBY2NlbGVyYXRlZCBBRVMgdXNpbmcgQVJNdjggQ3J5cHRvIEV4dGVuc2lvbnMiCisJZGVwZW5kcyBvbiBLRVJORUxfTU9ERV9ORU9OCisJc2VsZWN0IENSWVBUT19BTEdBUEkKKwlzZWxlY3QgQ1JZUFRPX0FCTEtfSEVMUEVSCisJaGVscAorCSAgVXNlIGFuIGltcGxlbWVudGF0aW9uIG9mIEFFUyBpbiBDQkMsIENUUiBhbmQgWFRTIG1vZGVzIHRoYXQgdXNlcworCSAgQVJNdjggQ3J5cHRvIEV4dGVuc2lvbnMKKworY29uZmlnIENSWVBUT19HSEFTSF9BUk1fQ0UKKwl0cmlzdGF0ZSAiUE1VTEwtYWNjZWxlcmF0ZWQgR0hBU0ggdXNpbmcgQVJNdjggQ3J5cHRvIEV4dGVuc2lvbnMiCisJZGVwZW5kcyBvbiBLRVJORUxfTU9ERV9ORU9OCisJc2VsZWN0IENSWVBUT19IQVNICisJc2VsZWN0IENSWVBUT19DUllQVEQKKwloZWxwCisJICBVc2UgYW4gaW1wbGVtZW50YXRpb24gb2YgR0hBU0ggKHVzZWQgYnkgdGhlIEdDTSBBRUFEIGNoYWluaW5nIG1vZGUpCisJICB0aGF0IHVzZXMgdGhlIDY0eDY0IHRvIDEyOCBiaXQgcG9seW5vbWlhbCBtdWx0aXBsaWNhdGlvbiAodm11bGwucDY0KQorCSAgdGhhdCBpcyBwYXJ0IG9mIHRoZSBBUk12OCBDcnlwdG8gRXh0ZW5zaW9ucworCitlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3J5cHRvL01ha2VmaWxlIGIvYXJjaC9hcm0vY3J5cHRvL01ha2VmaWxlCmluZGV4IGI0OGZhMzQuLjZlYTgyODIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NyeXB0by9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9jcnlwdG8vTWFrZWZpbGUKQEAgLTYsMTMgKzYsMzUgQEAKIG9iai0kKENPTkZJR19DUllQVE9fQUVTX0FSTV9CUykgKz0gYWVzLWFybS1icy5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1NIQTFfQVJNKSArPSBzaGExLWFybS5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1NIQTFfQVJNX05FT04pICs9IHNoYTEtYXJtLW5lb24ubworb2JqLSQoQ09ORklHX0NSWVBUT19TSEEyNTZfQVJNKSArPSBzaGEyNTYtYXJtLm8KIG9iai0kKENPTkZJR19DUllQVE9fU0hBNTEyX0FSTV9ORU9OKSArPSBzaGE1MTItYXJtLW5lb24ubwogCitjZS1vYmotJChDT05GSUdfQ1JZUFRPX0FFU19BUk1fQ0UpICs9IGFlcy1hcm0tY2UubworY2Utb2JqLSQoQ09ORklHX0NSWVBUT19TSEExX0FSTV9DRSkgKz0gc2hhMS1hcm0tY2UubworY2Utb2JqLSQoQ09ORklHX0NSWVBUT19TSEEyX0FSTV9DRSkgKz0gc2hhMi1hcm0tY2UubworY2Utb2JqLSQoQ09ORklHX0NSWVBUT19HSEFTSF9BUk1fQ0UpICs9IGdoYXNoLWFybS1jZS5vCisKK2lmbmVxICgkKGNlLW9iai15KSQoY2Utb2JqLW0pLCkKK2lmZXEgKCQoY2FsbCBhcy1pbnN0ciwuZnB1IGNyeXB0by1uZW9uLWZwLWFybXY4LHksbikseSkKK29iai15ICs9ICQoY2Utb2JqLXkpCitvYmotbSArPSAkKGNlLW9iai1tKQorZWxzZQorJCh3YXJuaW5nIFRoZXNlIEFSTXY4IENyeXB0byBFeHRlbnNpb25zIG1vZHVsZXMgbmVlZCBiaW51dGlscyAyLjIzIG9yIGhpZ2hlcikKKyQod2FybmluZyAkKGNlLW9iai15KSAkKGNlLW9iai1tKSkKK2VuZGlmCitlbmRpZgorCiBhZXMtYXJtLXkJOj0gYWVzLWFybXY0Lm8gYWVzX2dsdWUubwogYWVzLWFybS1icy15CTo9IGFlc2JzLWNvcmUubyBhZXNicy1nbHVlLm8KIHNoYTEtYXJtLXkJOj0gc2hhMS1hcm12NC1sYXJnZS5vIHNoYTFfZ2x1ZS5vCiBzaGExLWFybS1uZW9uLXkJOj0gc2hhMS1hcm12Ny1uZW9uLm8gc2hhMV9uZW9uX2dsdWUubworc2hhMjU2LWFybS1uZW9uLSQoQ09ORklHX0tFUk5FTF9NT0RFX05FT04pIDo9IHNoYTI1Nl9uZW9uX2dsdWUubworc2hhMjU2LWFybS15CTo9IHNoYTI1Ni1jb3JlLm8gc2hhMjU2X2dsdWUubyAkKHNoYTI1Ni1hcm0tbmVvbi15KQogc2hhNTEyLWFybS1uZW9uLXkgOj0gc2hhNTEyLWFybXY3LW5lb24ubyBzaGE1MTJfbmVvbl9nbHVlLm8KK3NoYTEtYXJtLWNlLXkJOj0gc2hhMS1jZS1jb3JlLm8gc2hhMS1jZS1nbHVlLm8KK3NoYTItYXJtLWNlLXkJOj0gc2hhMi1jZS1jb3JlLm8gc2hhMi1jZS1nbHVlLm8KK2Flcy1hcm0tY2UteQk6PSBhZXMtY2UtY29yZS5vIGFlcy1jZS1nbHVlLm8KK2doYXNoLWFybS1jZS15CTo9IGdoYXNoLWNlLWNvcmUubyBnaGFzaC1jZS1nbHVlLm8KIAogcXVpZXRfY21kX3BlcmwgPSBQRVJMICAgICRACiAgICAgICBjbWRfcGVybCA9ICQoUEVSTCkgJCg8KSA+ICQoQCkKQEAgLTIwLDQgKzQyLDcgQEAKICQoc3JjKS9hZXNicy1jb3JlLlNfc2hpcHBlZDogJChzcmMpL2JzYWVzLWFybXY3LnBsCiAJJChjYWxsIGNtZCxwZXJsKQogCi0uUFJFQ0lPVVM6ICQob2JqKS9hZXNicy1jb3JlLlMKKyQoc3JjKS9zaGEyNTYtY29yZS5TX3NoaXBwZWQ6ICQoc3JjKS9zaGEyNTYtYXJtdjQucGwKKwkkKGNhbGwgY21kLHBlcmwpCisKKy5QUkVDSU9VUzogJChvYmopL2Flc2JzLWNvcmUuUyAkKG9iaikvc2hhMjU2LWNvcmUuUwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3J5cHRvL2Flcy1jZS1jb3JlLlMgYi9hcmNoL2FybS9jcnlwdG8vYWVzLWNlLWNvcmUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2ZhNDY4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3J5cHRvL2Flcy1jZS1jb3JlLlMKQEAgLTAsMCArMSw1MTggQEAKKy8qCisgKiBhZXMtY2UtY29yZS5TIC0gQUVTIGluIENCQy9DVFIvWFRTIG1vZGUgdXNpbmcgQVJNdjggQ3J5cHRvIEV4dGVuc2lvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgTGluYXJvIEx0ZCA8YXJkLmJpZXNoZXV2ZWxAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorCisJLnRleHQKKwkuZnB1CQljcnlwdG8tbmVvbi1mcC1hcm12OAorCS5hbGlnbgkJMworCisJLm1hY3JvCQllbmNfcm91bmQsIHN0YXRlLCBrZXkKKwlhZXNlLjgJCVxzdGF0ZSwgXGtleQorCWFlc21jLjgJCVxzdGF0ZSwgXHN0YXRlCisJLmVuZG0KKworCS5tYWNybwkJZGVjX3JvdW5kLCBzdGF0ZSwga2V5CisJYWVzZC44CQlcc3RhdGUsIFxrZXkKKwlhZXNpbWMuOAlcc3RhdGUsIFxzdGF0ZQorCS5lbmRtCisKKwkubWFjcm8JCWVuY19kcm91bmQsIGtleTEsIGtleTIKKwllbmNfcm91bmQJcTAsIFxrZXkxCisJZW5jX3JvdW5kCXEwLCBca2V5MgorCS5lbmRtCisKKwkubWFjcm8JCWRlY19kcm91bmQsIGtleTEsIGtleTIKKwlkZWNfcm91bmQJcTAsIFxrZXkxCisJZGVjX3JvdW5kCXEwLCBca2V5MgorCS5lbmRtCisKKwkubWFjcm8JCWVuY19mcm91bmQsIGtleTEsIGtleTIsIGtleTMKKwllbmNfcm91bmQJcTAsIFxrZXkxCisJYWVzZS44CQlxMCwgXGtleTIKKwl2ZW9yCQlxMCwgcTAsIFxrZXkzCisJLmVuZG0KKworCS5tYWNybwkJZGVjX2Zyb3VuZCwga2V5MSwga2V5Miwga2V5MworCWRlY19yb3VuZAlxMCwgXGtleTEKKwlhZXNkLjgJCXEwLCBca2V5MgorCXZlb3IJCXEwLCBxMCwgXGtleTMKKwkuZW5kbQorCisJLm1hY3JvCQllbmNfZHJvdW5kXzN4LCBrZXkxLCBrZXkyCisJZW5jX3JvdW5kCXEwLCBca2V5MQorCWVuY19yb3VuZAlxMSwgXGtleTEKKwllbmNfcm91bmQJcTIsIFxrZXkxCisJZW5jX3JvdW5kCXEwLCBca2V5MgorCWVuY19yb3VuZAlxMSwgXGtleTIKKwllbmNfcm91bmQJcTIsIFxrZXkyCisJLmVuZG0KKworCS5tYWNybwkJZGVjX2Ryb3VuZF8zeCwga2V5MSwga2V5MgorCWRlY19yb3VuZAlxMCwgXGtleTEKKwlkZWNfcm91bmQJcTEsIFxrZXkxCisJZGVjX3JvdW5kCXEyLCBca2V5MQorCWRlY19yb3VuZAlxMCwgXGtleTIKKwlkZWNfcm91bmQJcTEsIFxrZXkyCisJZGVjX3JvdW5kCXEyLCBca2V5MgorCS5lbmRtCisKKwkubWFjcm8JCWVuY19mcm91bmRfM3gsIGtleTEsIGtleTIsIGtleTMKKwllbmNfcm91bmQJcTAsIFxrZXkxCisJZW5jX3JvdW5kCXExLCBca2V5MQorCWVuY19yb3VuZAlxMiwgXGtleTEKKwlhZXNlLjgJCXEwLCBca2V5MgorCWFlc2UuOAkJcTEsIFxrZXkyCisJYWVzZS44CQlxMiwgXGtleTIKKwl2ZW9yCQlxMCwgcTAsIFxrZXkzCisJdmVvcgkJcTEsIHExLCBca2V5MworCXZlb3IJCXEyLCBxMiwgXGtleTMKKwkuZW5kbQorCisJLm1hY3JvCQlkZWNfZnJvdW5kXzN4LCBrZXkxLCBrZXkyLCBrZXkzCisJZGVjX3JvdW5kCXEwLCBca2V5MQorCWRlY19yb3VuZAlxMSwgXGtleTEKKwlkZWNfcm91bmQJcTIsIFxrZXkxCisJYWVzZC44CQlxMCwgXGtleTIKKwlhZXNkLjgJCXExLCBca2V5MgorCWFlc2QuOAkJcTIsIFxrZXkyCisJdmVvcgkJcTAsIHEwLCBca2V5MworCXZlb3IJCXExLCBxMSwgXGtleTMKKwl2ZW9yCQlxMiwgcTIsIFxrZXkzCisJLmVuZG0KKworCS5tYWNybwkJZG9fYmxvY2ssIGRyb3VuZCwgZnJvdW5kCisJY21wCQlyMywgIzEyCQkJQCB3aGljaCBrZXkgc2l6ZT8KKwl2bGQxLjgJCXtxMTAtcTExfSwgW2lwXSEKKwlcZHJvdW5kCQlxOCwgcTkKKwl2bGQxLjgJCXtxMTItcTEzfSwgW2lwXSEKKwlcZHJvdW5kCQlxMTAsIHExMQorCXZsZDEuOAkJe3ExMC1xMTF9LCBbaXBdIQorCVxkcm91bmQJCXExMiwgcTEzCisJdmxkMS44CQl7cTEyLXExM30sIFtpcF0hCisJXGRyb3VuZAkJcTEwLCBxMTEKKwlibG8JCTBmCQkJQCBBRVMtMTI4OiAxMCByb3VuZHMKKwl2bGQxLjgJCXtxMTAtcTExfSwgW2lwXSEKKwliZXEJCTFmCQkJQCBBRVMtMTkyOiAxMiByb3VuZHMKKwlcZHJvdW5kCQlxMTIsIHExMworCXZsZDEuOAkJe3ExMi1xMTN9LCBbaXBdCisJXGRyb3VuZAkJcTEwLCBxMTEKKzA6CVxmcm91bmQJCXExMiwgcTEzLCBxMTQKKwlieAkJbHIKKworMToJXGRyb3VuZAkJcTEyLCBxMTMKKwlcZnJvdW5kCQlxMTAsIHExMSwgcTE0CisJYngJCWxyCisJLmVuZG0KKworCS8qCisJICogSW50ZXJuYWwsIG5vbi1BQVBDUyBjb21wbGlhbnQgZnVuY3Rpb25zIHRoYXQgaW1wbGVtZW50IHRoZSBjb3JlIEFFUworCSAqIHRyYW5zZm9ybXMuIFRoZXNlIHNob3VsZCBwcmVzZXJ2ZSBhbGwgcmVnaXN0ZXJzIGV4Y2VwdCBxMCAtIHEyIGFuZCBpcAorCSAqIEFyZ3VtZW50czoKKwkgKiAgIHEwICAgICAgICA6IGZpcnN0IGluL291dHB1dCBibG9jaworCSAqICAgcTEgICAgICAgIDogc2Vjb25kIGluL291dHB1dCBibG9jayAoXzN4IHZlcnNpb24gb25seSkKKwkgKiAgIHEyICAgICAgICA6IHRoaXJkIGluL291dHB1dCBibG9jayAoXzN4IHZlcnNpb24gb25seSkKKwkgKiAgIHE4ICAgICAgICA6IGZpcnN0IHJvdW5kIGtleQorCSAqICAgcTkgICAgICAgIDogc2Vjb3VuZCByb3VuZCBrZXkKKwkgKiAgIGlwICAgICAgICA6IGFkZHJlc3Mgb2YgM3JkIHJvdW5kIGtleQorCSAqICAgcTE0ICAgICAgIDogZmluYWwgcm91bmQga2V5CisJICogICByMyAgICAgICAgOiBudW1iZXIgb2Ygcm91bmRzCisJICovCisJLmFsaWduCQk2CithZXNfZW5jcnlwdDoKKwlhZGQJCWlwLCByMiwgIzMyCQlAIDNyZCByb3VuZCBrZXkKKy5MYWVzX2VuY3J5cHRfdHdlYWs6CisJZG9fYmxvY2sJZW5jX2Ryb3VuZCwgZW5jX2Zyb3VuZAorRU5EUFJPQyhhZXNfZW5jcnlwdCkKKworCS5hbGlnbgkJNgorYWVzX2RlY3J5cHQ6CisJYWRkCQlpcCwgcjIsICMzMgkJQCAzcmQgcm91bmQga2V5CisJZG9fYmxvY2sJZGVjX2Ryb3VuZCwgZGVjX2Zyb3VuZAorRU5EUFJPQyhhZXNfZGVjcnlwdCkKKworCS5hbGlnbgkJNgorYWVzX2VuY3J5cHRfM3g6CisJYWRkCQlpcCwgcjIsICMzMgkJQCAzcmQgcm91bmQga2V5CisJZG9fYmxvY2sJZW5jX2Ryb3VuZF8zeCwgZW5jX2Zyb3VuZF8zeAorRU5EUFJPQyhhZXNfZW5jcnlwdF8zeCkKKworCS5hbGlnbgkJNgorYWVzX2RlY3J5cHRfM3g6CisJYWRkCQlpcCwgcjIsICMzMgkJQCAzcmQgcm91bmQga2V5CisJZG9fYmxvY2sJZGVjX2Ryb3VuZF8zeCwgZGVjX2Zyb3VuZF8zeAorRU5EUFJPQyhhZXNfZGVjcnlwdF8zeCkKKworCS5tYWNybwkJcHJlcGFyZV9rZXksIHJrLCByb3VuZHMKKwlhZGQJCWlwLCBccmssIFxyb3VuZHMsIGxzbCAjNAorCXZsZDEuOAkJe3E4LXE5fSwgW1xya10JCUAgbG9hZCBmaXJzdCAyIHJvdW5kIGtleXMKKwl2bGQxLjgJCXtxMTR9LCBbaXBdCQlAIGxvYWQgbGFzdCByb3VuZCBrZXkKKwkuZW5kbQorCisJLyoKKwkgKiBhZXNfZWNiX2VuY3J5cHQodTggb3V0W10sIHU4IGNvbnN0IGluW10sIHU4IGNvbnN0IHJrW10sIGludCByb3VuZHMsCisJICoJCSAgIGludCBibG9ja3MpCisJICogYWVzX2VjYl9kZWNyeXB0KHU4IG91dFtdLCB1OCBjb25zdCBpbltdLCB1OCBjb25zdCBya1tdLCBpbnQgcm91bmRzLAorCSAqCQkgICBpbnQgYmxvY2tzKQorCSAqLworRU5UUlkoY2VfYWVzX2VjYl9lbmNyeXB0KQorCXB1c2gJCXtyNCwgbHJ9CisJbGRyCQlyNCwgW3NwLCAjOF0KKwlwcmVwYXJlX2tleQlyMiwgcjMKKy5MZWNiZW5jbG9vcDN4OgorCXN1YnMJCXI0LCByNCwgIzMKKwlibWkJCS5MZWNiZW5jMXgKKwl2bGQxLjgJCXtxMC1xMX0sIFtyMSwgOjY0XSEKKwl2bGQxLjgJCXtxMn0sIFtyMSwgOjY0XSEKKwlibAkJYWVzX2VuY3J5cHRfM3gKKwl2c3QxLjgJCXtxMC1xMX0sIFtyMCwgOjY0XSEKKwl2c3QxLjgJCXtxMn0sIFtyMCwgOjY0XSEKKwliCQkuTGVjYmVuY2xvb3AzeAorLkxlY2JlbmMxeDoKKwlhZGRzCQlyNCwgcjQsICMzCisJYmVxCQkuTGVjYmVuY291dAorLkxlY2JlbmNsb29wOgorCXZsZDEuOAkJe3EwfSwgW3IxLCA6NjRdIQorCWJsCQlhZXNfZW5jcnlwdAorCXZzdDEuOAkJe3EwfSwgW3IwLCA6NjRdIQorCXN1YnMJCXI0LCByNCwgIzEKKwlibmUJCS5MZWNiZW5jbG9vcAorLkxlY2JlbmNvdXQ6CisJcG9wCQl7cjQsIHBjfQorRU5EUFJPQyhjZV9hZXNfZWNiX2VuY3J5cHQpCisKK0VOVFJZKGNlX2Flc19lY2JfZGVjcnlwdCkKKwlwdXNoCQl7cjQsIGxyfQorCWxkcgkJcjQsIFtzcCwgIzhdCisJcHJlcGFyZV9rZXkJcjIsIHIzCisuTGVjYmRlY2xvb3AzeDoKKwlzdWJzCQlyNCwgcjQsICMzCisJYm1pCQkuTGVjYmRlYzF4CisJdmxkMS44CQl7cTAtcTF9LCBbcjEsIDo2NF0hCisJdmxkMS44CQl7cTJ9LCBbcjEsIDo2NF0hCisJYmwJCWFlc19kZWNyeXB0XzN4CisJdnN0MS44CQl7cTAtcTF9LCBbcjAsIDo2NF0hCisJdnN0MS44CQl7cTJ9LCBbcjAsIDo2NF0hCisJYgkJLkxlY2JkZWNsb29wM3gKKy5MZWNiZGVjMXg6CisJYWRkcwkJcjQsIHI0LCAjMworCWJlcQkJLkxlY2JkZWNvdXQKKy5MZWNiZGVjbG9vcDoKKwl2bGQxLjgJCXtxMH0sIFtyMSwgOjY0XSEKKwlibAkJYWVzX2RlY3J5cHQKKwl2c3QxLjgJCXtxMH0sIFtyMCwgOjY0XSEKKwlzdWJzCQlyNCwgcjQsICMxCisJYm5lCQkuTGVjYmRlY2xvb3AKKy5MZWNiZGVjb3V0OgorCXBvcAkJe3I0LCBwY30KK0VORFBST0MoY2VfYWVzX2VjYl9kZWNyeXB0KQorCisJLyoKKwkgKiBhZXNfY2JjX2VuY3J5cHQodTggb3V0W10sIHU4IGNvbnN0IGluW10sIHU4IGNvbnN0IHJrW10sIGludCByb3VuZHMsCisJICoJCSAgIGludCBibG9ja3MsIHU4IGl2W10pCisJICogYWVzX2NiY19kZWNyeXB0KHU4IG91dFtdLCB1OCBjb25zdCBpbltdLCB1OCBjb25zdCBya1tdLCBpbnQgcm91bmRzLAorCSAqCQkgICBpbnQgYmxvY2tzLCB1OCBpdltdKQorCSAqLworRU5UUlkoY2VfYWVzX2NiY19lbmNyeXB0KQorCXB1c2gJCXtyNC1yNiwgbHJ9CisJbGRyZAkJcjQsIHI1LCBbc3AsICMxNl0KKwl2bGQxLjgJCXtxMH0sIFtyNV0KKwlwcmVwYXJlX2tleQlyMiwgcjMKKy5MY2JjZW5jbG9vcDoKKwl2bGQxLjgJCXtxMX0sIFtyMSwgOjY0XSEJQCBnZXQgbmV4dCBwdCBibG9jaworCXZlb3IJCXEwLCBxMCwgcTEJCUAgLi5hbmQgeG9yIHdpdGggaXYKKwlibAkJYWVzX2VuY3J5cHQKKwl2c3QxLjgJCXtxMH0sIFtyMCwgOjY0XSEKKwlzdWJzCQlyNCwgcjQsICMxCisJYm5lCQkuTGNiY2VuY2xvb3AKKwl2c3QxLjgJCXtxMH0sIFtyNV0KKwlwb3AJCXtyNC1yNiwgcGN9CitFTkRQUk9DKGNlX2Flc19jYmNfZW5jcnlwdCkKKworRU5UUlkoY2VfYWVzX2NiY19kZWNyeXB0KQorCXB1c2gJCXtyNC1yNiwgbHJ9CisJbGRyZAkJcjQsIHI1LCBbc3AsICMxNl0KKwl2bGQxLjgJCXtxNn0sIFtyNV0JCUAga2VlcCBpdiBpbiBxNgorCXByZXBhcmVfa2V5CXIyLCByMworLkxjYmNkZWNsb29wM3g6CisJc3VicwkJcjQsIHI0LCAjMworCWJtaQkJLkxjYmNkZWMxeAorCXZsZDEuOAkJe3EwLXExfSwgW3IxLCA6NjRdIQorCXZsZDEuOAkJe3EyfSwgW3IxLCA6NjRdIQorCXZtb3YJCXEzLCBxMAorCXZtb3YJCXE0LCBxMQorCXZtb3YJCXE1LCBxMgorCWJsCQlhZXNfZGVjcnlwdF8zeAorCXZlb3IJCXEwLCBxMCwgcTYKKwl2ZW9yCQlxMSwgcTEsIHEzCisJdmVvcgkJcTIsIHEyLCBxNAorCXZtb3YJCXE2LCBxNQorCXZzdDEuOAkJe3EwLXExfSwgW3IwLCA6NjRdIQorCXZzdDEuOAkJe3EyfSwgW3IwLCA6NjRdIQorCWIJCS5MY2JjZGVjbG9vcDN4CisuTGNiY2RlYzF4OgorCWFkZHMJCXI0LCByNCwgIzMKKwliZXEJCS5MY2JjZGVjb3V0CisJdm1vdgkJcTE1LCBxMTQJCUAgcHJlc2VydmUgbGFzdCByb3VuZCBrZXkKKy5MY2JjZGVjbG9vcDoKKwl2bGQxLjgJCXtxMH0sIFtyMSwgOjY0XSEJQCBnZXQgbmV4dCBjdCBibG9jaworCXZlb3IJCXExNCwgcTE1LCBxNgkJQCBjb21iaW5lIHByZXYgY3Qgd2l0aCBsYXN0IGtleQorCXZtb3YJCXE2LCBxMAorCWJsCQlhZXNfZGVjcnlwdAorCXZzdDEuOAkJe3EwfSwgW3IwLCA6NjRdIQorCXN1YnMJCXI0LCByNCwgIzEKKwlibmUJCS5MY2JjZGVjbG9vcAorLkxjYmNkZWNvdXQ6CisJdnN0MS44CQl7cTZ9LCBbcjVdCQlAIGtlZXAgaXYgaW4gcTYKKwlwb3AJCXtyNC1yNiwgcGN9CitFTkRQUk9DKGNlX2Flc19jYmNfZGVjcnlwdCkKKworCS8qCisJICogYWVzX2N0cl9lbmNyeXB0KHU4IG91dFtdLCB1OCBjb25zdCBpbltdLCB1OCBjb25zdCBya1tdLCBpbnQgcm91bmRzLAorCSAqCQkgICBpbnQgYmxvY2tzLCB1OCBjdHJbXSkKKwkgKi8KK0VOVFJZKGNlX2Flc19jdHJfZW5jcnlwdCkKKwlwdXNoCQl7cjQtcjYsIGxyfQorCWxkcmQJCXI0LCByNSwgW3NwLCAjMTZdCisJdmxkMS44CQl7cTZ9LCBbcjVdCQlAIGxvYWQgY3RyCisJcHJlcGFyZV9rZXkJcjIsIHIzCisJdm1vdgkJcjYsIHMyNwkJCUAga2VlcCBzd2FiYmVkIGN0ciBpbiByNgorCXJldgkJcjYsIHI2CisJY21uCQlyNiwgcjQJCQlAIDMyIGJpdCBvdmVyZmxvdz8KKwliY3MJCS5MY3RybG9vcAorLkxjdHJsb29wM3g6CisJc3VicwkJcjQsIHI0LCAjMworCWJtaQkJLkxjdHIxeAorCWFkZAkJcjYsIHI2LCAjMQorCXZtb3YJCXEwLCBxNgorCXZtb3YJCXExLCBxNgorCXJldgkJaXAsIHI2CisJYWRkCQlyNiwgcjYsICMxCisJdm1vdgkJcTIsIHE2CisJdm1vdgkJczcsIGlwCisJcmV2CQlpcCwgcjYKKwlhZGQJCXI2LCByNiwgIzEKKwl2bW92CQlzMTEsIGlwCisJdmxkMS44CQl7cTMtcTR9LCBbcjEsIDo2NF0hCisJdmxkMS44CQl7cTV9LCBbcjEsIDo2NF0hCisJYmwJCWFlc19lbmNyeXB0XzN4CisJdmVvcgkJcTAsIHEwLCBxMworCXZlb3IJCXExLCBxMSwgcTQKKwl2ZW9yCQlxMiwgcTIsIHE1CisJcmV2CQlpcCwgcjYKKwl2c3QxLjgJCXtxMC1xMX0sIFtyMCwgOjY0XSEKKwl2c3QxLjgJCXtxMn0sIFtyMCwgOjY0XSEKKwl2bW92CQlzMjcsIGlwCisJYgkJLkxjdHJsb29wM3gKKy5MY3RyMXg6CisJYWRkcwkJcjQsIHI0LCAjMworCWJlcQkJLkxjdHJvdXQKKy5MY3RybG9vcDoKKwl2bW92CQlxMCwgcTYKKwlibAkJYWVzX2VuY3J5cHQKKwlzdWJzCQlyNCwgcjQsICMxCisJYm1pCQkuTGN0cmhhbGZibG9jawkJQCBibG9ja3MgPCAwIG1lYW5zIDEvMiBibG9jaworCXZsZDEuOAkJe3EzfSwgW3IxLCA6NjRdIQorCXZlb3IJCXEzLCBxMCwgcTMKKwl2c3QxLjgJCXtxM30sIFtyMCwgOjY0XSEKKworCWFkZHMJCXI2LCByNiwgIzEJCUAgaW5jcmVtZW50IEJFIGN0cgorCXJldgkJaXAsIHI2CisJdm1vdgkJczI3LCBpcAorCWJjcwkJLkxjdHJjYXJyeQorCXRlcQkJcjQsICMwCisJYm5lCQkuTGN0cmxvb3AKKy5MY3Ryb3V0OgorCXZzdDEuOAkJe3E2fSwgW3I1XQorCXBvcAkJe3I0LXI2LCBwY30KKworLkxjdHJoYWxmYmxvY2s6CisJdmxkMS44CQl7ZDF9LCBbcjEsIDo2NF0KKwl2ZW9yCQlkMCwgZDAsIGQxCisJdnN0MS44CQl7ZDB9LCBbcjAsIDo2NF0KKwlwb3AJCXtyNC1yNiwgcGN9CisKKy5MY3RyY2Fycnk6CisJLmlycAkJc3JlZywgczI2LCBzMjUsIHMyNAorCXZtb3YJCWlwLCBcc3JlZwkJQCBsb2FkIG5leHQgd29yZCBvZiBjdHIKKwlyZXYJCWlwLCBpcAkJCUAgLi4uIHRvIGhhbmRsZSB0aGUgY2FycnkKKwlhZGRzCQlpcCwgaXAsICMxCisJcmV2CQlpcCwgaXAKKwl2bW92CQlcc3JlZywgaXAKKwliY2MJCTBmCisJLmVuZHIKKzA6CXRlcQkJcjQsICMwCisJYmVxCQkuTGN0cm91dAorCWIJCS5MY3RybG9vcAorRU5EUFJPQyhjZV9hZXNfY3RyX2VuY3J5cHQpCisKKwkvKgorCSAqIGFlc194dHNfZW5jcnlwdCh1OCBvdXRbXSwgdTggY29uc3QgaW5bXSwgdTggY29uc3QgcmsxW10sIGludCByb3VuZHMsCisJICoJCSAgIGludCBibG9ja3MsIHU4IGl2W10sIHU4IGNvbnN0IHJrMltdLCBpbnQgZmlyc3QpCisJICogYWVzX3h0c19kZWNyeXB0KHU4IG91dFtdLCB1OCBjb25zdCBpbltdLCB1OCBjb25zdCByazFbXSwgaW50IHJvdW5kcywKKwkgKgkJICAgaW50IGJsb2NrcywgdTggaXZbXSwgdTggY29uc3QgcmsyW10sIGludCBmaXJzdCkKKwkgKi8KKworCS5tYWNybwkJbmV4dF90d2Vhaywgb3V0LCBpbiwgY29uc3QsIHRtcAorCXZzaHIuczY0CVx0bXAsIFxpbiwgIzYzCisJdmFuZAkJXHRtcCwgXHRtcCwgXGNvbnN0CisJdmFkZC51NjQJXG91dCwgXGluLCBcaW4KKwl2ZXh0LjgJCVx0bXAsIFx0bXAsIFx0bXAsICM4CisJdmVvcgkJXG91dCwgXG91dCwgXHRtcAorCS5lbmRtCisKKwkuYWxpZ24JCTMKKy5MeHRzX211bF94OgorCS5xdWFkCQkxLCAweDg3CisKK2NlX2Flc194dHNfaW5pdDoKKwl2bGRyCQlkMTQsIC5MeHRzX211bF94CisJdmxkcgkJZDE1LCAuTHh0c19tdWxfeCArIDgKKworCWxkcmQJCXI0LCByNSwgW3NwLCAjMTZdCUAgbG9hZCBhcmdzCisJbGRyCQlyNiwgW3NwLCAjMjhdCisJdmxkMS44CQl7cTB9LCBbcjVdCQlAIGxvYWQgaXYKKwl0ZXEJCXI2LCAjMQkJCUAgc3RhcnQgb2YgYSBibG9jaz8KKwlieG5lCQlscgorCisJQCBFbmNyeXB0IHRoZSBJViBpbiBxMCB3aXRoIHRoZSBzZWNvbmQgQUVTIGtleS4gVGhpcyBzaG91bGQgb25seQorCUAgYmUgZG9uZSBhdCB0aGUgc3RhcnQgb2YgYSBibG9jay4KKwlsZHIJCXI2LCBbc3AsICMyNF0JCUAgbG9hZCBBRVMga2V5IDIKKwlwcmVwYXJlX2tleQlyNiwgcjMKKwlhZGQJCWlwLCByNiwgIzMyCQlAIDNyZCByb3VuZCBrZXkgb2Yga2V5IDIKKwliCQkuTGFlc19lbmNyeXB0X3R3ZWFrCUAgdGFpbCBjYWxsCitFTkRQUk9DKGNlX2Flc194dHNfaW5pdCkKKworRU5UUlkoY2VfYWVzX3h0c19lbmNyeXB0KQorCXB1c2gJCXtyNC1yNiwgbHJ9CisKKwlibAkJY2VfYWVzX3h0c19pbml0CQlAIHJ1biBzaGFyZWQgcHJvbG9ndWUKKwlwcmVwYXJlX2tleQlyMiwgcjMKKwl2bW92CQlxMywgcTAKKworCXRlcQkJcjYsICMwCQkJQCBzdGFydCBvZiBhIGJsb2NrPworCWJuZQkJLkx4dHNlbmMzeAorCisuTHh0c2VuY2xvb3AzeDoKKwluZXh0X3R3ZWFrCXEzLCBxMywgcTcsIHE2CisuTHh0c2VuYzN4OgorCXN1YnMJCXI0LCByNCwgIzMKKwlibWkJCS5MeHRzZW5jMXgKKwl2bGQxLjgJCXtxMC1xMX0sIFtyMSwgOjY0XSEJQCBnZXQgMyBwdCBibG9ja3MKKwl2bGQxLjgJCXtxMn0sIFtyMSwgOjY0XSEKKwluZXh0X3R3ZWFrCXE0LCBxMywgcTcsIHE2CisJdmVvcgkJcTAsIHEwLCBxMworCW5leHRfdHdlYWsJcTUsIHE0LCBxNywgcTYKKwl2ZW9yCQlxMSwgcTEsIHE0CisJdmVvcgkJcTIsIHEyLCBxNQorCWJsCQlhZXNfZW5jcnlwdF8zeAorCXZlb3IJCXEwLCBxMCwgcTMKKwl2ZW9yCQlxMSwgcTEsIHE0CisJdmVvcgkJcTIsIHEyLCBxNQorCXZzdDEuOAkJe3EwLXExfSwgW3IwLCA6NjRdIQlAIHdyaXRlIDMgY3QgYmxvY2tzCisJdnN0MS44CQl7cTJ9LCBbcjAsIDo2NF0hCisJdm1vdgkJcTMsIHE1CisJdGVxCQlyNCwgIzAKKwliZXEJCS5MeHRzZW5jb3V0CisJYgkJLkx4dHNlbmNsb29wM3gKKy5MeHRzZW5jMXg6CisJYWRkcwkJcjQsIHI0LCAjMworCWJlcQkJLkx4dHNlbmNvdXQKKy5MeHRzZW5jbG9vcDoKKwl2bGQxLjgJCXtxMH0sIFtyMSwgOjY0XSEKKwl2ZW9yCQlxMCwgcTAsIHEzCisJYmwJCWFlc19lbmNyeXB0CisJdmVvcgkJcTAsIHEwLCBxMworCXZzdDEuOAkJe3EwfSwgW3IwLCA6NjRdIQorCXN1YnMJCXI0LCByNCwgIzEKKwliZXEJCS5MeHRzZW5jb3V0CisJbmV4dF90d2VhawlxMywgcTMsIHE3LCBxNgorCWIJCS5MeHRzZW5jbG9vcAorLkx4dHNlbmNvdXQ6CisJdnN0MS44CQl7cTN9LCBbcjVdCisJcG9wCQl7cjQtcjYsIHBjfQorRU5EUFJPQyhjZV9hZXNfeHRzX2VuY3J5cHQpCisKKworRU5UUlkoY2VfYWVzX3h0c19kZWNyeXB0KQorCXB1c2gJCXtyNC1yNiwgbHJ9CisKKwlibAkJY2VfYWVzX3h0c19pbml0CQlAIHJ1biBzaGFyZWQgcHJvbG9ndWUKKwlwcmVwYXJlX2tleQlyMiwgcjMKKwl2bW92CQlxMywgcTAKKworCXRlcQkJcjYsICMwCQkJQCBzdGFydCBvZiBhIGJsb2NrPworCWJuZQkJLkx4dHNkZWMzeAorCisuTHh0c2RlY2xvb3AzeDoKKwluZXh0X3R3ZWFrCXEzLCBxMywgcTcsIHE2CisuTHh0c2RlYzN4OgorCXN1YnMJCXI0LCByNCwgIzMKKwlibWkJCS5MeHRzZGVjMXgKKwl2bGQxLjgJCXtxMC1xMX0sIFtyMSwgOjY0XSEJQCBnZXQgMyBjdCBibG9ja3MKKwl2bGQxLjgJCXtxMn0sIFtyMSwgOjY0XSEKKwluZXh0X3R3ZWFrCXE0LCBxMywgcTcsIHE2CisJdmVvcgkJcTAsIHEwLCBxMworCW5leHRfdHdlYWsJcTUsIHE0LCBxNywgcTYKKwl2ZW9yCQlxMSwgcTEsIHE0CisJdmVvcgkJcTIsIHEyLCBxNQorCWJsCQlhZXNfZGVjcnlwdF8zeAorCXZlb3IJCXEwLCBxMCwgcTMKKwl2ZW9yCQlxMSwgcTEsIHE0CisJdmVvcgkJcTIsIHEyLCBxNQorCXZzdDEuOAkJe3EwLXExfSwgW3IwLCA6NjRdIQlAIHdyaXRlIDMgcHQgYmxvY2tzCisJdnN0MS44CQl7cTJ9LCBbcjAsIDo2NF0hCisJdm1vdgkJcTMsIHE1CisJdGVxCQlyNCwgIzAKKwliZXEJCS5MeHRzZGVjb3V0CisJYgkJLkx4dHNkZWNsb29wM3gKKy5MeHRzZGVjMXg6CisJYWRkcwkJcjQsIHI0LCAjMworCWJlcQkJLkx4dHNkZWNvdXQKKy5MeHRzZGVjbG9vcDoKKwl2bGQxLjgJCXtxMH0sIFtyMSwgOjY0XSEKKwl2ZW9yCQlxMCwgcTAsIHEzCisJYWRkCQlpcCwgcjIsICMzMgkJQCAzcmQgcm91bmQga2V5CisJYmwJCWFlc19kZWNyeXB0CisJdmVvcgkJcTAsIHEwLCBxMworCXZzdDEuOAkJe3EwfSwgW3IwLCA6NjRdIQorCXN1YnMJCXI0LCByNCwgIzEKKwliZXEJCS5MeHRzZGVjb3V0CisJbmV4dF90d2VhawlxMywgcTMsIHE3LCBxNgorCWIJCS5MeHRzZGVjbG9vcAorLkx4dHNkZWNvdXQ6CisJdnN0MS44CQl7cTN9LCBbcjVdCisJcG9wCQl7cjQtcjYsIHBjfQorRU5EUFJPQyhjZV9hZXNfeHRzX2RlY3J5cHQpCisKKwkvKgorCSAqIHUzMiBjZV9hZXNfc3ViKHUzMiBpbnB1dCkgLSB1c2UgdGhlIGFlc2UgaW5zdHJ1Y3Rpb24gdG8gcGVyZm9ybSB0aGUKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUVTIHNib3ggc3Vic3RpdHV0aW9uIG9uIGVhY2ggYnl0ZSBpbgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5wdXQnCisJICovCitFTlRSWShjZV9hZXNfc3ViKQorCXZkdXAuMzIJCXExLCByMAorCXZlb3IJCXEwLCBxMCwgcTAKKwlhZXNlLjgJCXEwLCBxMQorCXZtb3YJCXIwLCBzMAorCWJ4CQlscgorRU5EUFJPQyhjZV9hZXNfc3ViKQorCisJLyoKKwkgKiB2b2lkIGNlX2Flc19pbnZlcnQodTggKmRzdCwgdTggKnNyYykgLSBwZXJmb3JtIHRoZSBJbnZlcnNlIE1peENvbHVtbnMKKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gb24gcm91bmQga2V5ICpzcmMKKwkgKi8KK0VOVFJZKGNlX2Flc19pbnZlcnQpCisJdmxkMS44CQl7cTB9LCBbcjFdCisJYWVzaW1jLjgJcTAsIHEwCisJdnN0MS44CQl7cTB9LCBbcjBdCisJYngJCWxyCitFTkRQUk9DKGNlX2Flc19pbnZlcnQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcnlwdG8vYWVzLWNlLWdsdWUuYyBiL2FyY2gvYXJtL2NyeXB0by9hZXMtY2UtZ2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDVhNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcnlwdG8vYWVzLWNlLWdsdWUuYwpAQCAtMCwwICsxLDUyNCBAQAorLyoKKyAqIGFlcy1jZS1nbHVlLmMgLSB3cmFwcGVyIGNvZGUgZm9yIEFSTXY4IEFFUworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBMaW5hcm8gTHRkIDxhcmQuYmllc2hldXZlbEBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGFzbS9od2NhcC5oPgorI2luY2x1ZGUgPGFzbS9uZW9uLmg+CisjaW5jbHVkZSA8YXNtL2h3Y2FwLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2Flcy5oPgorI2luY2x1ZGUgPGNyeXB0by9hYmxrX2hlbHBlci5oPgorI2luY2x1ZGUgPGNyeXB0by9hbGdhcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBRVMtRUNCL0NCQy9DVFIvWFRTIHVzaW5nIEFSTXY4IENyeXB0byBFeHRlbnNpb25zIik7CitNT0RVTEVfQVVUSE9SKCJBcmQgQmllc2hldXZlbCA8YXJkLmJpZXNoZXV2ZWxAbGluYXJvLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworLyogZGVmaW5lZCBpbiBhZXMtY2UtY29yZS5TICovCithc21saW5rYWdlIHUzMiBjZV9hZXNfc3ViKHUzMiBpbnB1dCk7Cithc21saW5rYWdlIHZvaWQgY2VfYWVzX2ludmVydCh2b2lkICpkc3QsIHZvaWQgKnNyYyk7CisKK2FzbWxpbmthZ2Ugdm9pZCBjZV9hZXNfZWNiX2VuY3J5cHQodTggb3V0W10sIHU4IGNvbnN0IGluW10sIHU4IGNvbnN0IHJrW10sCisJCQkJICAgaW50IHJvdW5kcywgaW50IGJsb2Nrcyk7Cithc21saW5rYWdlIHZvaWQgY2VfYWVzX2VjYl9kZWNyeXB0KHU4IG91dFtdLCB1OCBjb25zdCBpbltdLCB1OCBjb25zdCBya1tdLAorCQkJCSAgIGludCByb3VuZHMsIGludCBibG9ja3MpOworCithc21saW5rYWdlIHZvaWQgY2VfYWVzX2NiY19lbmNyeXB0KHU4IG91dFtdLCB1OCBjb25zdCBpbltdLCB1OCBjb25zdCBya1tdLAorCQkJCSAgIGludCByb3VuZHMsIGludCBibG9ja3MsIHU4IGl2W10pOworYXNtbGlua2FnZSB2b2lkIGNlX2Flc19jYmNfZGVjcnlwdCh1OCBvdXRbXSwgdTggY29uc3QgaW5bXSwgdTggY29uc3QgcmtbXSwKKwkJCQkgICBpbnQgcm91bmRzLCBpbnQgYmxvY2tzLCB1OCBpdltdKTsKKworYXNtbGlua2FnZSB2b2lkIGNlX2Flc19jdHJfZW5jcnlwdCh1OCBvdXRbXSwgdTggY29uc3QgaW5bXSwgdTggY29uc3QgcmtbXSwKKwkJCQkgICBpbnQgcm91bmRzLCBpbnQgYmxvY2tzLCB1OCBjdHJbXSk7CisKK2FzbWxpbmthZ2Ugdm9pZCBjZV9hZXNfeHRzX2VuY3J5cHQodTggb3V0W10sIHU4IGNvbnN0IGluW10sIHU4IGNvbnN0IHJrMVtdLAorCQkJCSAgIGludCByb3VuZHMsIGludCBibG9ja3MsIHU4IGl2W10sCisJCQkJICAgdTggY29uc3QgcmsyW10sIGludCBmaXJzdCk7Cithc21saW5rYWdlIHZvaWQgY2VfYWVzX3h0c19kZWNyeXB0KHU4IG91dFtdLCB1OCBjb25zdCBpbltdLCB1OCBjb25zdCByazFbXSwKKwkJCQkgICBpbnQgcm91bmRzLCBpbnQgYmxvY2tzLCB1OCBpdltdLAorCQkJCSAgIHU4IGNvbnN0IHJrMltdLCBpbnQgZmlyc3QpOworCitzdHJ1Y3QgYWVzX2Jsb2NrIHsKKwl1OCBiW0FFU19CTE9DS19TSVpFXTsKK307CisKK3N0YXRpYyBpbnQgbnVtX3JvdW5kcyhzdHJ1Y3QgY3J5cHRvX2Flc19jdHggKmN0eCkKK3sKKwkvKgorCSAqICMgb2Ygcm91bmRzIHNwZWNpZmllZCBieSBBRVM6CisJICogMTI4IGJpdCBrZXkJCTEwIHJvdW5kcworCSAqIDE5MiBiaXQga2V5CQkxMiByb3VuZHMKKwkgKiAyNTYgYml0IGtleQkJMTQgcm91bmRzCisJICogPT4gbiBieXRlIGtleQk9PiA2ICsgKG4vNCkgcm91bmRzCisJICovCisJcmV0dXJuIDYgKyBjdHgtPmtleV9sZW5ndGggLyA0OworfQorCitzdGF0aWMgaW50IGNlX2Flc19leHBhbmRrZXkoc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHgsIGNvbnN0IHU4ICppbl9rZXksCisJCQkgICAgdW5zaWduZWQgaW50IGtleV9sZW4pCit7CisJLyoKKwkgKiBUaGUgQUVTIGtleSBzY2hlZHVsZSByb3VuZCBjb25zdGFudHMKKwkgKi8KKwlzdGF0aWMgdTggY29uc3QgcmNvbltdID0geworCQkweDAxLCAweDAyLCAweDA0LCAweDA4LCAweDEwLCAweDIwLCAweDQwLCAweDgwLCAweDFiLCAweDM2LAorCX07CisKKwl1MzIga3dvcmRzID0ga2V5X2xlbiAvIHNpemVvZih1MzIpOworCXN0cnVjdCBhZXNfYmxvY2sgKmtleV9lbmMsICprZXlfZGVjOworCWludCBpLCBqOworCisJaWYgKGtleV9sZW4gIT0gQUVTX0tFWVNJWkVfMTI4ICYmCisJICAgIGtleV9sZW4gIT0gQUVTX0tFWVNJWkVfMTkyICYmCisJICAgIGtleV9sZW4gIT0gQUVTX0tFWVNJWkVfMjU2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbWNweShjdHgtPmtleV9lbmMsIGluX2tleSwga2V5X2xlbik7CisJY3R4LT5rZXlfbGVuZ3RoID0ga2V5X2xlbjsKKworCWtlcm5lbF9uZW9uX2JlZ2luKCk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihyY29uKTsgaSsrKSB7CisJCXUzMiAqcmtpID0gY3R4LT5rZXlfZW5jICsgKGkgKiBrd29yZHMpOworCQl1MzIgKnJrbyA9IHJraSArIGt3b3JkczsKKworCQlya29bMF0gPSByb3IzMihjZV9hZXNfc3ViKHJraVtrd29yZHMgLSAxXSksIDgpOworCQlya29bMF0gPSBya29bMF0gXiBya2lbMF0gXiByY29uW2ldOworCQlya29bMV0gPSBya29bMF0gXiBya2lbMV07CisJCXJrb1syXSA9IHJrb1sxXSBeIHJraVsyXTsKKwkJcmtvWzNdID0gcmtvWzJdIF4gcmtpWzNdOworCisJCWlmIChrZXlfbGVuID09IEFFU19LRVlTSVpFXzE5MikgeworCQkJaWYgKGkgPj0gNykKKwkJCQlicmVhazsKKwkJCXJrb1s0XSA9IHJrb1szXSBeIHJraVs0XTsKKwkJCXJrb1s1XSA9IHJrb1s0XSBeIHJraVs1XTsKKwkJfSBlbHNlIGlmIChrZXlfbGVuID09IEFFU19LRVlTSVpFXzI1NikgeworCQkJaWYgKGkgPj0gNikKKwkJCQlicmVhazsKKwkJCXJrb1s0XSA9IGNlX2Flc19zdWIocmtvWzNdKSBeIHJraVs0XTsKKwkJCXJrb1s1XSA9IHJrb1s0XSBeIHJraVs1XTsKKwkJCXJrb1s2XSA9IHJrb1s1XSBeIHJraVs2XTsKKwkJCXJrb1s3XSA9IHJrb1s2XSBeIHJraVs3XTsKKwkJfQorCX0KKworCS8qCisJICogR2VuZXJhdGUgdGhlIGRlY3J5cHRpb24ga2V5cyBmb3IgdGhlIEVxdWl2YWxlbnQgSW52ZXJzZSBDaXBoZXIuCisJICogVGhpcyBpbnZvbHZlcyByZXZlcnNpbmcgdGhlIG9yZGVyIG9mIHRoZSByb3VuZCBrZXlzLCBhbmQgYXBwbHlpbmcKKwkgKiB0aGUgSW52ZXJzZSBNaXggQ29sdW1ucyB0cmFuc2Zvcm1hdGlvbiBvbiBhbGwgYnV0IHRoZSBmaXJzdCBhbmQKKwkgKiB0aGUgbGFzdCBvbmUuCisJICovCisJa2V5X2VuYyA9IChzdHJ1Y3QgYWVzX2Jsb2NrICopY3R4LT5rZXlfZW5jOworCWtleV9kZWMgPSAoc3RydWN0IGFlc19ibG9jayAqKWN0eC0+a2V5X2RlYzsKKwlqID0gbnVtX3JvdW5kcyhjdHgpOworCisJa2V5X2RlY1swXSA9IGtleV9lbmNbal07CisJZm9yIChpID0gMSwgai0tOyBqID4gMDsgaSsrLCBqLS0pCisJCWNlX2Flc19pbnZlcnQoa2V5X2RlYyArIGksIGtleV9lbmMgKyBqKTsKKwlrZXlfZGVjW2ldID0ga2V5X2VuY1swXTsKKworCWtlcm5lbF9uZW9uX2VuZCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNlX2Flc19zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmluX2tleSwKKwkJCSB1bnNpZ25lZCBpbnQga2V5X2xlbikKK3sKKwlzdHJ1Y3QgY3J5cHRvX2Flc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisJaW50IHJldDsKKworCXJldCA9IGNlX2Flc19leHBhbmRrZXkoY3R4LCBpbl9rZXksIGtleV9sZW4pOworCWlmICghcmV0KQorCQlyZXR1cm4gMDsKKworCXRmbS0+Y3J0X2ZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOworCXJldHVybiAtRUlOVkFMOworfQorCitzdHJ1Y3QgY3J5cHRvX2Flc194dHNfY3R4IHsKKwlzdHJ1Y3QgY3J5cHRvX2Flc19jdHgga2V5MTsKKwlzdHJ1Y3QgY3J5cHRvX2Flc19jdHggX19hbGlnbmVkKDgpIGtleTI7Cit9OworCitzdGF0aWMgaW50IHh0c19zZXRfa2V5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICppbl9rZXksCisJCSAgICAgICB1bnNpZ25lZCBpbnQga2V5X2xlbikKK3sKKwlzdHJ1Y3QgY3J5cHRvX2Flc194dHNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCWludCByZXQ7CisKKwlyZXQgPSBjZV9hZXNfZXhwYW5ka2V5KCZjdHgtPmtleTEsIGluX2tleSwga2V5X2xlbiAvIDIpOworCWlmICghcmV0KQorCQlyZXQgPSBjZV9hZXNfZXhwYW5ka2V5KCZjdHgtPmtleTIsICZpbl9rZXlba2V5X2xlbiAvIDJdLAorCQkJCSAgICAgICBrZXlfbGVuIC8gMik7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJdGZtLT5jcnRfZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZWNiX2VuY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdG9fYWVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzOworCWludCBlcnI7CisKKwlkZXNjLT5mbGFncyAmPSB+Q1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQOworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCWVyciA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgJndhbGspOworCisJa2VybmVsX25lb25fYmVnaW4oKTsKKwl3aGlsZSAoKGJsb2NrcyA9ICh3YWxrLm5ieXRlcyAvIEFFU19CTE9DS19TSVpFKSkpIHsKKwkJY2VfYWVzX2VjYl9lbmNyeXB0KHdhbGsuZHN0LnZpcnQuYWRkciwgd2Fsay5zcmMudmlydC5hZGRyLAorCQkJCSAgICh1OCAqKWN0eC0+a2V5X2VuYywgbnVtX3JvdW5kcyhjdHgpLCBibG9ja3MpOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLAorCQkJCQkgIHdhbGsubmJ5dGVzICUgQUVTX0JMT0NLX1NJWkUpOworCX0KKwlrZXJuZWxfbmVvbl9lbmQoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVjYl9kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgY3J5cHRvX2Flc19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisJdW5zaWduZWQgaW50IGJsb2NrczsKKwlpbnQgZXJyOworCisJZGVzYy0+ZmxhZ3MgJj0gfkNSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKworCWtlcm5lbF9uZW9uX2JlZ2luKCk7CisJd2hpbGUgKChibG9ja3MgPSAod2Fsay5uYnl0ZXMgLyBBRVNfQkxPQ0tfU0laRSkpKSB7CisJCWNlX2Flc19lY2JfZGVjcnlwdCh3YWxrLmRzdC52aXJ0LmFkZHIsIHdhbGsuc3JjLnZpcnQuYWRkciwKKwkJCQkgICAodTggKiljdHgtPmtleV9kZWMsIG51bV9yb3VuZHMoY3R4KSwgYmxvY2tzKTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywKKwkJCQkJICB3YWxrLm5ieXRlcyAlIEFFU19CTE9DS19TSVpFKTsKKwl9CisJa2VybmVsX25lb25fZW5kKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjYmNfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCXVuc2lnbmVkIGludCBibG9ja3M7CisJaW50IGVycjsKKworCWRlc2MtPmZsYWdzICY9IH5DUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisKKwlrZXJuZWxfbmVvbl9iZWdpbigpOworCXdoaWxlICgoYmxvY2tzID0gKHdhbGsubmJ5dGVzIC8gQUVTX0JMT0NLX1NJWkUpKSkgeworCQljZV9hZXNfY2JjX2VuY3J5cHQod2Fsay5kc3QudmlydC5hZGRyLCB3YWxrLnNyYy52aXJ0LmFkZHIsCisJCQkJICAgKHU4ICopY3R4LT5rZXlfZW5jLCBudW1fcm91bmRzKGN0eCksIGJsb2NrcywKKwkJCQkgICB3YWxrLml2KTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywKKwkJCQkJICB3YWxrLm5ieXRlcyAlIEFFU19CTE9DS19TSVpFKTsKKwl9CisJa2VybmVsX25lb25fZW5kKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjYmNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCXVuc2lnbmVkIGludCBibG9ja3M7CisJaW50IGVycjsKKworCWRlc2MtPmZsYWdzICY9IH5DUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisKKwlrZXJuZWxfbmVvbl9iZWdpbigpOworCXdoaWxlICgoYmxvY2tzID0gKHdhbGsubmJ5dGVzIC8gQUVTX0JMT0NLX1NJWkUpKSkgeworCQljZV9hZXNfY2JjX2RlY3J5cHQod2Fsay5kc3QudmlydC5hZGRyLCB3YWxrLnNyYy52aXJ0LmFkZHIsCisJCQkJICAgKHU4ICopY3R4LT5rZXlfZGVjLCBudW1fcm91bmRzKGN0eCksIGJsb2NrcywKKwkJCQkgICB3YWxrLml2KTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywKKwkJCQkJICB3YWxrLm5ieXRlcyAlIEFFU19CTE9DS19TSVpFKTsKKwl9CisJa2VybmVsX25lb25fZW5kKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjdHJfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0b19hZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCWludCBlcnIsIGJsb2NrczsKKworCWRlc2MtPmZsYWdzICY9IH5DUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydF9ibG9jayhkZXNjLCAmd2FsaywgQUVTX0JMT0NLX1NJWkUpOworCisJa2VybmVsX25lb25fYmVnaW4oKTsKKwl3aGlsZSAoKGJsb2NrcyA9ICh3YWxrLm5ieXRlcyAvIEFFU19CTE9DS19TSVpFKSkpIHsKKwkJY2VfYWVzX2N0cl9lbmNyeXB0KHdhbGsuZHN0LnZpcnQuYWRkciwgd2Fsay5zcmMudmlydC5hZGRyLAorCQkJCSAgICh1OCAqKWN0eC0+a2V5X2VuYywgbnVtX3JvdW5kcyhjdHgpLCBibG9ja3MsCisJCQkJICAgd2Fsay5pdik7CisJCW5ieXRlcyAtPSBibG9ja3MgKiBBRVNfQkxPQ0tfU0laRTsKKwkJaWYgKG5ieXRlcyAmJiBuYnl0ZXMgPT0gd2Fsay5uYnl0ZXMgJSBBRVNfQkxPQ0tfU0laRSkKKwkJCWJyZWFrOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLAorCQkJCQkgIHdhbGsubmJ5dGVzICUgQUVTX0JMT0NLX1NJWkUpOworCX0KKwlpZiAobmJ5dGVzKSB7CisJCXU4ICp0ZHN0ID0gd2Fsay5kc3QudmlydC5hZGRyICsgYmxvY2tzICogQUVTX0JMT0NLX1NJWkU7CisJCXU4ICp0c3JjID0gd2Fsay5zcmMudmlydC5hZGRyICsgYmxvY2tzICogQUVTX0JMT0NLX1NJWkU7CisJCXU4IF9fYWxpZ25lZCg4KSB0YWlsW0FFU19CTE9DS19TSVpFXTsKKworCQkvKgorCQkgKiBNaW5pbXVtIGFsaWdubWVudCBpcyA4IGJ5dGVzLCBzbyBpZiBuYnl0ZXMgaXMgPD0gOCwgd2UgbmVlZAorCQkgKiB0byB0ZWxsIGFlc19jdHJfZW5jcnlwdCgpIHRvIG9ubHkgcmVhZCBoYWxmIGEgYmxvY2suCisJCSAqLworCQlibG9ja3MgPSAobmJ5dGVzIDw9IDgpID8gLTEgOiAxOworCisJCWNlX2Flc19jdHJfZW5jcnlwdCh0YWlsLCB0c3JjLCAodTggKiljdHgtPmtleV9lbmMsCisJCQkJICAgbnVtX3JvdW5kcyhjdHgpLCBibG9ja3MsIHdhbGsuaXYpOworCQltZW1jcHkodGRzdCwgdGFpbCwgbmJ5dGVzKTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgMCk7CisJfQorCWtlcm5lbF9uZW9uX2VuZCgpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB4dHNfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IGNyeXB0b19hZXNfeHRzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwlpbnQgZXJyLCBmaXJzdCwgcm91bmRzID0gbnVtX3JvdW5kcygmY3R4LT5rZXkxKTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKwl1bnNpZ25lZCBpbnQgYmxvY2tzOworCisJZGVzYy0+ZmxhZ3MgJj0gfkNSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKworCWtlcm5lbF9uZW9uX2JlZ2luKCk7CisJZm9yIChmaXJzdCA9IDE7IChibG9ja3MgPSAod2Fsay5uYnl0ZXMgLyBBRVNfQkxPQ0tfU0laRSkpOyBmaXJzdCA9IDApIHsKKwkJY2VfYWVzX3h0c19lbmNyeXB0KHdhbGsuZHN0LnZpcnQuYWRkciwgd2Fsay5zcmMudmlydC5hZGRyLAorCQkJCSAgICh1OCAqKWN0eC0+a2V5MS5rZXlfZW5jLCByb3VuZHMsIGJsb2NrcywKKwkJCQkgICB3YWxrLml2LCAodTggKiljdHgtPmtleTIua2V5X2VuYywgZmlyc3QpOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLAorCQkJCQkgIHdhbGsubmJ5dGVzICUgQUVTX0JMT0NLX1NJWkUpOworCX0KKwlrZXJuZWxfbmVvbl9lbmQoKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgeHRzX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBjcnlwdG9fYWVzX3h0c19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CisJaW50IGVyciwgZmlyc3QsIHJvdW5kcyA9IG51bV9yb3VuZHMoJmN0eC0+a2V5MSk7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisJdW5zaWduZWQgaW50IGJsb2NrczsKKworCWRlc2MtPmZsYWdzICY9IH5DUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisKKwlrZXJuZWxfbmVvbl9iZWdpbigpOworCWZvciAoZmlyc3QgPSAxOyAoYmxvY2tzID0gKHdhbGsubmJ5dGVzIC8gQUVTX0JMT0NLX1NJWkUpKTsgZmlyc3QgPSAwKSB7CisJCWNlX2Flc194dHNfZGVjcnlwdCh3YWxrLmRzdC52aXJ0LmFkZHIsIHdhbGsuc3JjLnZpcnQuYWRkciwKKwkJCQkgICAodTggKiljdHgtPmtleTEua2V5X2RlYywgcm91bmRzLCBibG9ja3MsCisJCQkJICAgd2Fsay5pdiwgKHU4ICopY3R4LT5rZXkyLmtleV9lbmMsIGZpcnN0KTsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywKKwkJCQkJICB3YWxrLm5ieXRlcyAlIEFFU19CTE9DS19TSVpFKTsKKwl9CisJa2VybmVsX25lb25fZW5kKCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGNyeXB0b19hbGcgYWVzX2FsZ3NbXSA9IHsgeworCS5jcmFfbmFtZQkJPSAiX19lY2ItYWVzLWNlIiwKKwkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWVjYi1hZXMtY2UiLAorCS5jcmFfcHJpb3JpdHkJCT0gMCwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKKwkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjcnlwdG9fYWVzX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0gNywKKwkuY3JhX3R5cGUJCT0gJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKKwkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkuY3JhX2Jsa2NpcGhlciA9IHsKKwkJLm1pbl9rZXlzaXplCT0gQUVTX01JTl9LRVlfU0laRSwKKwkJLm1heF9rZXlzaXplCT0gQUVTX01BWF9LRVlfU0laRSwKKwkJLml2c2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKKwkJLnNldGtleQkJPSBjZV9hZXNfc2V0a2V5LAorCQkuZW5jcnlwdAk9IGVjYl9lbmNyeXB0LAorCQkuZGVjcnlwdAk9IGVjYl9kZWNyeXB0LAorCX0sCit9LCB7CisJLmNyYV9uYW1lCQk9ICJfX2NiYy1hZXMtY2UiLAorCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY2JjLWFlcy1jZSIsCisJLmNyYV9wcmlvcml0eQkJPSAwLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAorCS5jcmFfYmxvY2tzaXplCQk9IEFFU19CTE9DS19TSVpFLAorCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IGNyeXB0b19hZXNfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPSA3LAorCS5jcmFfdHlwZQkJPSAmY3J5cHRvX2Jsa2NpcGhlcl90eXBlLAorCS5jcmFfbW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCS5jcmFfYmxrY2lwaGVyID0geworCQkubWluX2tleXNpemUJPSBBRVNfTUlOX0tFWV9TSVpFLAorCQkubWF4X2tleXNpemUJPSBBRVNfTUFYX0tFWV9TSVpFLAorCQkuaXZzaXplCQk9IEFFU19CTE9DS19TSVpFLAorCQkuc2V0a2V5CQk9IGNlX2Flc19zZXRrZXksCisJCS5lbmNyeXB0CT0gY2JjX2VuY3J5cHQsCisJCS5kZWNyeXB0CT0gY2JjX2RlY3J5cHQsCisJfSwKK30sIHsKKwkuY3JhX25hbWUJCT0gIl9fY3RyLWFlcy1jZSIsCisJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1jdHItYWVzLWNlIiwKKwkuY3JhX3ByaW9yaXR5CQk9IDAsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCisJLmNyYV9ibG9ja3NpemUJCT0gMSwKKwkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjcnlwdG9fYWVzX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0gNywKKwkuY3JhX3R5cGUJCT0gJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKKwkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkuY3JhX2Jsa2NpcGhlciA9IHsKKwkJLm1pbl9rZXlzaXplCT0gQUVTX01JTl9LRVlfU0laRSwKKwkJLm1heF9rZXlzaXplCT0gQUVTX01BWF9LRVlfU0laRSwKKwkJLml2c2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKKwkJLnNldGtleQkJPSBjZV9hZXNfc2V0a2V5LAorCQkuZW5jcnlwdAk9IGN0cl9lbmNyeXB0LAorCQkuZGVjcnlwdAk9IGN0cl9lbmNyeXB0LAorCX0sCit9LCB7CisJLmNyYV9uYW1lCQk9ICJfX3h0cy1hZXMtY2UiLAorCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXIteHRzLWFlcy1jZSIsCisJLmNyYV9wcmlvcml0eQkJPSAwLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAorCS5jcmFfYmxvY2tzaXplCQk9IEFFU19CTE9DS19TSVpFLAorCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IGNyeXB0b19hZXNfeHRzX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0gNywKKwkuY3JhX3R5cGUJCT0gJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKKwkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkuY3JhX2Jsa2NpcGhlciA9IHsKKwkJLm1pbl9rZXlzaXplCT0gMiAqIEFFU19NSU5fS0VZX1NJWkUsCisJCS5tYXhfa2V5c2l6ZQk9IDIgKiBBRVNfTUFYX0tFWV9TSVpFLAorCQkuaXZzaXplCQk9IEFFU19CTE9DS19TSVpFLAorCQkuc2V0a2V5CQk9IHh0c19zZXRfa2V5LAorCQkuZW5jcnlwdAk9IHh0c19lbmNyeXB0LAorCQkuZGVjcnlwdAk9IHh0c19kZWNyeXB0LAorCX0sCit9LCB7CisJLmNyYV9uYW1lCQk9ICJlY2IoYWVzKSIsCisJLmNyYV9kcml2ZXJfbmFtZQk9ICJlY2ItYWVzLWNlIiwKKwkuY3JhX3ByaW9yaXR5CQk9IDMwMCwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9BQkxLQ0lQSEVSfENSWVBUT19BTEdfQVNZTkMsCisJLmNyYV9ibG9ja3NpemUJCT0gQUVTX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgYXN5bmNfaGVscGVyX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0gNywKKwkuY3JhX3R5cGUJCT0gJmNyeXB0b19hYmxrY2lwaGVyX3R5cGUsCisJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJLmNyYV9pbml0CQk9IGFibGtfaW5pdCwKKwkuY3JhX2V4aXQJCT0gYWJsa19leGl0LAorCS5jcmFfYWJsa2NpcGhlciA9IHsKKwkJLm1pbl9rZXlzaXplCT0gQUVTX01JTl9LRVlfU0laRSwKKwkJLm1heF9rZXlzaXplCT0gQUVTX01BWF9LRVlfU0laRSwKKwkJLml2c2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKKwkJLnNldGtleQkJPSBhYmxrX3NldF9rZXksCisJCS5lbmNyeXB0CT0gYWJsa19lbmNyeXB0LAorCQkuZGVjcnlwdAk9IGFibGtfZGVjcnlwdCwKKwl9Cit9LCB7CisJLmNyYV9uYW1lCQk9ICJjYmMoYWVzKSIsCisJLmNyYV9kcml2ZXJfbmFtZQk9ICJjYmMtYWVzLWNlIiwKKwkuY3JhX3ByaW9yaXR5CQk9IDMwMCwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9BQkxLQ0lQSEVSfENSWVBUT19BTEdfQVNZTkMsCisJLmNyYV9ibG9ja3NpemUJCT0gQUVTX0JMT0NLX1NJWkUsCisJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgYXN5bmNfaGVscGVyX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0gNywKKwkuY3JhX3R5cGUJCT0gJmNyeXB0b19hYmxrY2lwaGVyX3R5cGUsCisJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJLmNyYV9pbml0CQk9IGFibGtfaW5pdCwKKwkuY3JhX2V4aXQJCT0gYWJsa19leGl0LAorCS5jcmFfYWJsa2NpcGhlciA9IHsKKwkJLm1pbl9rZXlzaXplCT0gQUVTX01JTl9LRVlfU0laRSwKKwkJLm1heF9rZXlzaXplCT0gQUVTX01BWF9LRVlfU0laRSwKKwkJLml2c2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKKwkJLnNldGtleQkJPSBhYmxrX3NldF9rZXksCisJCS5lbmNyeXB0CT0gYWJsa19lbmNyeXB0LAorCQkuZGVjcnlwdAk9IGFibGtfZGVjcnlwdCwKKwl9Cit9LCB7CisJLmNyYV9uYW1lCQk9ICJjdHIoYWVzKSIsCisJLmNyYV9kcml2ZXJfbmFtZQk9ICJjdHItYWVzLWNlIiwKKwkuY3JhX3ByaW9yaXR5CQk9IDMwMCwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9BQkxLQ0lQSEVSfENSWVBUT19BTEdfQVNZTkMsCisJLmNyYV9ibG9ja3NpemUJCT0gMSwKKwkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBhc3luY19oZWxwZXJfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPSA3LAorCS5jcmFfdHlwZQkJPSAmY3J5cHRvX2FibGtjaXBoZXJfdHlwZSwKKwkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkuY3JhX2luaXQJCT0gYWJsa19pbml0LAorCS5jcmFfZXhpdAkJPSBhYmxrX2V4aXQsCisJLmNyYV9hYmxrY2lwaGVyID0geworCQkubWluX2tleXNpemUJPSBBRVNfTUlOX0tFWV9TSVpFLAorCQkubWF4X2tleXNpemUJPSBBRVNfTUFYX0tFWV9TSVpFLAorCQkuaXZzaXplCQk9IEFFU19CTE9DS19TSVpFLAorCQkuc2V0a2V5CQk9IGFibGtfc2V0X2tleSwKKwkJLmVuY3J5cHQJPSBhYmxrX2VuY3J5cHQsCisJCS5kZWNyeXB0CT0gYWJsa19kZWNyeXB0LAorCX0KK30sIHsKKwkuY3JhX25hbWUJCT0gInh0cyhhZXMpIiwKKwkuY3JhX2RyaXZlcl9uYW1lCT0gInh0cy1hZXMtY2UiLAorCS5jcmFfcHJpb3JpdHkJCT0gMzAwLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0FCTEtDSVBIRVJ8Q1JZUFRPX0FMR19BU1lOQywKKwkuY3JhX2Jsb2Nrc2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKKwkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBhc3luY19oZWxwZXJfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPSA3LAorCS5jcmFfdHlwZQkJPSAmY3J5cHRvX2FibGtjaXBoZXJfdHlwZSwKKwkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKKwkuY3JhX2luaXQJCT0gYWJsa19pbml0LAorCS5jcmFfZXhpdAkJPSBhYmxrX2V4aXQsCisJLmNyYV9hYmxrY2lwaGVyID0geworCQkubWluX2tleXNpemUJPSAyICogQUVTX01JTl9LRVlfU0laRSwKKwkJLm1heF9rZXlzaXplCT0gMiAqIEFFU19NQVhfS0VZX1NJWkUsCisJCS5pdnNpemUJCT0gQUVTX0JMT0NLX1NJWkUsCisJCS5zZXRrZXkJCT0gYWJsa19zZXRfa2V5LAorCQkuZW5jcnlwdAk9IGFibGtfZW5jcnlwdCwKKwkJLmRlY3J5cHQJPSBhYmxrX2RlY3J5cHQsCisJfQorfSB9OworCitzdGF0aWMgaW50IF9faW5pdCBhZXNfaW5pdCh2b2lkKQoreworCWlmICghKGVsZl9od2NhcDIgJiBIV0NBUDJfQUVTKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGdzKGFlc19hbGdzLCBBUlJBWV9TSVpFKGFlc19hbGdzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZXNfZXhpdCh2b2lkKQoreworCWNyeXB0b191bnJlZ2lzdGVyX2FsZ3MoYWVzX2FsZ3MsIEFSUkFZX1NJWkUoYWVzX2FsZ3MpKTsKK30KKworbW9kdWxlX2luaXQoYWVzX2luaXQpOworbW9kdWxlX2V4aXQoYWVzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3J5cHRvL2Flc2JzLWNvcmUuU19zaGlwcGVkIGIvYXJjaC9hcm0vY3J5cHRvL2Flc2JzLWNvcmUuU19zaGlwcGVkCmluZGV4IDcxZTVmYzcuLjFkMTgwMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NyeXB0by9hZXNicy1jb3JlLlNfc2hpcHBlZAorKysgYi9hcmNoL2FybS9jcnlwdG8vYWVzYnMtY29yZS5TX3NoaXBwZWQKQEAgLTU4LDE0ICs1OCwxOCBAQAogIyBkZWZpbmUgVkZQX0FCSV9GUkFNRQkwCiAjIGRlZmluZSBCU0FFU19BU01fRVhURU5ERURfS0VZCiAjIGRlZmluZSBYVFNfQ0hBSU5fVFdFQUsKLSMgZGVmaW5lIF9fQVJNX0FSQ0hfXwk3CisjIGRlZmluZSBfX0FSTV9BUkNIX18gX19MSU5VWF9BUk1fQVJDSF9fCisjIGRlZmluZSBfX0FSTV9NQVhfQVJDSF9fIDcKICNlbmRpZgogCiAjaWZkZWYgX190aHVtYl9fCiAjIGRlZmluZSBhZHJsIGFkcgogI2VuZGlmCiAKLSNpZiBfX0FSTV9BUkNIX18+PTcKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03CisuYXJjaAlhcm12Ny1hCisuZnB1CW5lb24KKwogLnRleHQKIC5zeW50YXgJdW5pZmllZCAJQCBBUk12Ny1jYXBhYmxlIGFzc2VtYmxlciBpcyBleHBlY3RlZCB0byBoYW5kbGUgdGhpcwogI2lmZGVmIF9fdGh1bWIyX18KQEAgLTc0LDggKzc4LDYgQEAKIC5jb2RlICAgMzIKICNlbmRpZgogCi0uZnB1CW5lb24KLQogLnR5cGUJX2JzYWVzX2RlY3J5cHQ4LCVmdW5jdGlvbgogLmFsaWduCTQKIF9ic2Flc19kZWNyeXB0ODoKQEAgLTIwOTUsOSArMjA5NywxMSBAQAogCXZsZDEuOAl7cTh9LCBbcjBdCQkJQCBpbml0aWFsIHR3ZWFrCiAJYWRyCXIyLCAuTHh0c19tYWdpYwogCisjaWZuZGVmCVhUU19DSEFJTl9UV0VBSwogCXRzdAlyOSwgIzB4ZgkJCUAgaWYgbm90IG11bHRpcGxlIG9mIDE2CiAJaXQJbmUJCQkJQCBUaHVtYjIgdGhpbmcsIHNhbml0eSBjaGVjayBpbiBBUk0KIAlzdWJuZQlyOSwgIzB4MTAJCQlAIHN1YnRyYWN0IGFub3RoZXIgMTYgYnl0ZXMKKyNlbmRpZgogCXN1YnMJcjksICMweDgwCiAKIAlibG8JLkx4dHNfZGVjX3Nob3J0CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcnlwdG8vYWVzYnMtZ2x1ZS5jIGIvYXJjaC9hcm0vY3J5cHRvL2Flc2JzLWdsdWUuYwppbmRleCAxNTQ2OGZiLi42ZDY4NTI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jcnlwdG8vYWVzYnMtZ2x1ZS5jCisrKyBiL2FyY2gvYXJtL2NyeXB0by9hZXNicy1nbHVlLmMKQEAgLTMwMSw3ICszMDEsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19jYmMtYWVzLW5lb25icyIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1jYmMtYWVzLW5lb25icyIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBhZXNic19jYmNfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSA3LApAQCAtMzE5LDcgKzMyMCw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX2N0ci1hZXMtbmVvbmJzIiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWN0ci1hZXMtbmVvbmJzIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IDEsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgYWVzYnNfY3RyX2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gNywKQEAgLTMzNyw3ICszMzksOCBAQAogCS5jcmFfbmFtZQkJPSAiX194dHMtYWVzLW5lb25icyIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci14dHMtYWVzLW5lb25icyIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBhZXNic194dHNfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSA3LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3J5cHRvL2JzYWVzLWFybXY3LnBsIGIvYXJjaC9hcm0vY3J5cHRvL2JzYWVzLWFybXY3LnBsCmluZGV4IGJlMDY4ZGIuLmE0ZDM4NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NyeXB0by9ic2Flcy1hcm12Ny5wbAorKysgYi9hcmNoL2FybS9jcnlwdG8vYnNhZXMtYXJtdjcucGwKQEAgLTcwMSwxNCArNzAxLDE4IEBACiAjIGRlZmluZSBWRlBfQUJJX0ZSQU1FCTAKICMgZGVmaW5lIEJTQUVTX0FTTV9FWFRFTkRFRF9LRVkKICMgZGVmaW5lIFhUU19DSEFJTl9UV0VBSwotIyBkZWZpbmUgX19BUk1fQVJDSF9fCTcKKyMgZGVmaW5lIF9fQVJNX0FSQ0hfXyBfX0xJTlVYX0FSTV9BUkNIX18KKyMgZGVmaW5lIF9fQVJNX01BWF9BUkNIX18gNwogI2VuZGlmCiAKICNpZmRlZiBfX3RodW1iX18KICMgZGVmaW5lIGFkcmwgYWRyCiAjZW5kaWYKIAotI2lmIF9fQVJNX0FSQ0hfXz49NworI2lmIF9fQVJNX01BWF9BUkNIX18+PTcKKy5hcmNoCWFybXY3LWEKKy5mcHUJbmVvbgorCiAudGV4dAogLnN5bnRheAl1bmlmaWVkIAlAIEFSTXY3LWNhcGFibGUgYXNzZW1ibGVyIGlzIGV4cGVjdGVkIHRvIGhhbmRsZSB0aGlzCiAjaWZkZWYgX190aHVtYjJfXwpAQCAtNzE3LDggKzcyMSw2IEBACiAuY29kZSAgIDMyCiAjZW5kaWYKIAotLmZwdQluZW9uCi0KIC50eXBlCV9ic2Flc19kZWNyeXB0OCwlZnVuY3Rpb24KIC5hbGlnbgk0CiBfYnNhZXNfZGVjcnlwdDg6CkBAIC0yMDc2LDkgKzIwNzgsMTEgQEAKIAl2bGQxLjgJe0BYTU1bOF19LCBbcjBdCQkJQCBpbml0aWFsIHR3ZWFrCiAJYWRyCSRtYWdpYywgLkx4dHNfbWFnaWMKIAorI2lmbmRlZglYVFNfQ0hBSU5fVFdFQUsKIAl0c3QJJGxlbiwgIzB4ZgkJCUAgaWYgbm90IG11bHRpcGxlIG9mIDE2CiAJaXQJbmUJCQkJQCBUaHVtYjIgdGhpbmcsIHNhbml0eSBjaGVjayBpbiBBUk0KIAlzdWJuZQkkbGVuLCAjMHgxMAkJCUAgc3VidHJhY3QgYW5vdGhlciAxNiBieXRlcworI2VuZGlmCiAJc3VicwkkbGVuLCAjMHg4MAogCiAJYmxvCS5MeHRzX2RlY19zaG9ydApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3J5cHRvL2doYXNoLWNlLWNvcmUuUyBiL2FyY2gvYXJtL2NyeXB0by9naGFzaC1jZS1jb3JlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhYjhiYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NyeXB0by9naGFzaC1jZS1jb3JlLlMKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIEFjY2VsZXJhdGVkIEdIQVNIIGltcGxlbWVudGF0aW9uIHdpdGggQVJNdjggdm11bGwucDY0IGluc3RydWN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgTGluYXJvIEx0ZC4gPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGFzbS9hc3NlbWJsZXIuaD4KKworCVNIQVNICQkucmVxCXEwCisJU0hBU0gyCQkucmVxCXExCisJVDEJCS5yZXEJcTIKKwlUMgkJLnJlcQlxMworCU1BU0sJCS5yZXEJcTQKKwlYTAkJLnJlcQlxNQorCVhNCQkucmVxCXE2CisJWEgJCS5yZXEJcTcKKwlJTjEJCS5yZXEJcTcKKworCVNIQVNIX0wJCS5yZXEJZDAKKwlTSEFTSF9ICQkucmVxCWQxCisJU0hBU0gyX0wJLnJlcQlkMgorCVQxX0wJCS5yZXEJZDQKKwlNQVNLX0wJCS5yZXEJZDgKKwlYTF9MCQkucmVxCWQxMAorCVhMX0gJCS5yZXEJZDExCisJWE1fTAkJLnJlcQlkMTIKKwlYTV9ICQkucmVxCWQxMworCVhIX0wJCS5yZXEJZDE0CisKKwkudGV4dAorCS5mcHUJCWNyeXB0by1uZW9uLWZwLWFybXY4CisKKwkvKgorCSAqIHZvaWQgcG11bGxfZ2hhc2hfdXBkYXRlKGludCBibG9ja3MsIHU2NCBkZ1tdLCBjb25zdCBjaGFyICpzcmMsCisJICoJCQkgICBzdHJ1Y3QgZ2hhc2hfa2V5IGNvbnN0ICprLCBjb25zdCBjaGFyICpoZWFkKQorCSAqLworRU5UUlkocG11bGxfZ2hhc2hfdXBkYXRlKQorCXZsZDEuNjQJCXtTSEFTSH0sIFtyM10KKwl2bGQxLjY0CQl7WEx9LCBbcjFdCisJdm1vdi5pOAkJTUFTSywgIzB4ZTEKKwl2ZXh0LjgJCVNIQVNIMiwgU0hBU0gsIFNIQVNILCAjOAorCXZzaGwudTY0CU1BU0ssIE1BU0ssICM1NworCXZlb3IJCVNIQVNIMiwgU0hBU0gyLCBTSEFTSAorCisJLyogZG8gdGhlIGhlYWQgYmxvY2sgZmlyc3QsIGlmIHN1cHBsaWVkICovCisJbGRyCQlpcCwgW3NwXQorCXRlcQkJaXAsICMwCisJYmVxCQkwZgorCXZsZDEuNjQJCXtUMX0sIFtpcF0KKwl0ZXEJCXIwLCAjMAorCWIJCTFmCisKKzA6CXZsZDEuNjQJCXtUMX0sIFtyMl0hCisJc3VicwkJcjAsIHIwLCAjMQorCisxOgkvKiBtdWx0aXBseSBYTCBieSBTSEFTSCBpbiBHRigyXjEyOCkgKi8KKyNpZm5kZWYgQ09ORklHX0NQVV9CSUdfRU5ESUFOCisJdnJldjY0LjgJVDEsIFQxCisjZW5kaWYKKwl2ZXh0LjgJCVQyLCBYTCwgWEwsICM4CisJdmV4dC44CQlJTjEsIFQxLCBUMSwgIzgKKwl2ZW9yCQlUMSwgVDEsIFQyCisJdmVvcgkJWEwsIFhMLCBJTjEKKworCXZtdWxsLnA2NAlYSCwgU0hBU0hfSCwgWExfSAkJQCBhMSAqIGIxCisJdmVvcgkJVDEsIFQxLCBYTAorCXZtdWxsLnA2NAlYTCwgU0hBU0hfTCwgWExfTAkJQCBhMCAqIGIwCisJdm11bGwucDY0CVhNLCBTSEFTSDJfTCwgVDFfTAkJQCAoYTEgKyBhMCkoYjEgKyBiMCkKKworCXZleHQuOAkJVDEsIFhMLCBYSCwgIzgKKwl2ZW9yCQlUMiwgWEwsIFhICisJdmVvcgkJWE0sIFhNLCBUMQorCXZlb3IJCVhNLCBYTSwgVDIKKwl2bXVsbC5wNjQJVDIsIFhMX0wsIE1BU0tfTAorCisJdm1vdgkJWEhfTCwgWE1fSAorCXZtb3YJCVhNX0gsIFhMX0wKKworCXZlb3IJCVhMLCBYTSwgVDIKKwl2ZXh0LjgJCVQyLCBYTCwgWEwsICM4CisJdm11bGwucDY0CVhMLCBYTF9MLCBNQVNLX0wKKwl2ZW9yCQlUMiwgVDIsIFhICisJdmVvcgkJWEwsIFhMLCBUMgorCisJYm5lCQkwYgorCisJdnN0MS42NAkJe1hMfSwgW3IxXQorCWJ4CQlscgorRU5EUFJPQyhwbXVsbF9naGFzaF91cGRhdGUpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcnlwdG8vZ2hhc2gtY2UtZ2x1ZS5jIGIvYXJjaC9hcm0vY3J5cHRvL2doYXNoLWNlLWdsdWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2EzOWZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vY3J5cHRvL2doYXNoLWNlLWdsdWUuYwpAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIEFjY2VsZXJhdGVkIEdIQVNIIGltcGxlbWVudGF0aW9uIHdpdGggQVJNdjggdm11bGwucDY0IGluc3RydWN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgTGluYXJvIEx0ZC4gPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8YXNtL2h3Y2FwLmg+CisjaW5jbHVkZSA8YXNtL25lb24uaD4KKyNpbmNsdWRlIDxhc20vc2ltZC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxjcnlwdG8vY3J5cHRkLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vZ2YxMjhtdWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworTU9EVUxFX0RFU0NSSVBUSU9OKCJHSEFTSCBzZWN1cmUgaGFzaCB1c2luZyBBUk12OCBDcnlwdG8gRXh0ZW5zaW9ucyIpOworTU9EVUxFX0FVVEhPUigiQXJkIEJpZXNoZXV2ZWwgPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKKyNkZWZpbmUgR0hBU0hfQkxPQ0tfU0laRQkxNgorI2RlZmluZSBHSEFTSF9ESUdFU1RfU0laRQkxNgorCitzdHJ1Y3QgZ2hhc2hfa2V5IHsKKwl1NjQJYTsKKwl1NjQJYjsKK307CisKK3N0cnVjdCBnaGFzaF9kZXNjX2N0eCB7CisJdTY0IGRpZ2VzdFtHSEFTSF9ESUdFU1RfU0laRS9zaXplb2YodTY0KV07CisJdTggYnVmW0dIQVNIX0JMT0NLX1NJWkVdOworCXUzMiBjb3VudDsKK307CisKK3N0cnVjdCBnaGFzaF9hc3luY19jdHggeworCXN0cnVjdCBjcnlwdGRfYWhhc2ggKmNyeXB0ZF90Zm07Cit9OworCithc21saW5rYWdlIHZvaWQgcG11bGxfZ2hhc2hfdXBkYXRlKGludCBibG9ja3MsIHU2NCBkZ1tdLCBjb25zdCBjaGFyICpzcmMsCisJCQkJICAgc3RydWN0IGdoYXNoX2tleSBjb25zdCAqaywgY29uc3QgY2hhciAqaGVhZCk7CisKK3N0YXRpYyBpbnQgZ2hhc2hfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgZ2hhc2hfZGVzY19jdHggKmN0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJKmN0eCA9IChzdHJ1Y3QgZ2hhc2hfZGVzY19jdHgpe307CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2hhc2hfdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqc3JjLAorCQkJdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZ2hhc2hfZGVzY19jdHggKmN0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCXVuc2lnbmVkIGludCBwYXJ0aWFsID0gY3R4LT5jb3VudCAlIEdIQVNIX0JMT0NLX1NJWkU7CisKKwljdHgtPmNvdW50ICs9IGxlbjsKKworCWlmICgocGFydGlhbCArIGxlbikgPj0gR0hBU0hfQkxPQ0tfU0laRSkgeworCQlzdHJ1Y3QgZ2hhc2hfa2V5ICprZXkgPSBjcnlwdG9fc2hhc2hfY3R4KGRlc2MtPnRmbSk7CisJCWludCBibG9ja3M7CisKKwkJaWYgKHBhcnRpYWwpIHsKKwkJCWludCBwID0gR0hBU0hfQkxPQ0tfU0laRSAtIHBhcnRpYWw7CisKKwkJCW1lbWNweShjdHgtPmJ1ZiArIHBhcnRpYWwsIHNyYywgcCk7CisJCQlzcmMgKz0gcDsKKwkJCWxlbiAtPSBwOworCQl9CisKKwkJYmxvY2tzID0gbGVuIC8gR0hBU0hfQkxPQ0tfU0laRTsKKwkJbGVuICU9IEdIQVNIX0JMT0NLX1NJWkU7CisKKwkJa2VybmVsX25lb25fYmVnaW4oKTsKKwkJcG11bGxfZ2hhc2hfdXBkYXRlKGJsb2NrcywgY3R4LT5kaWdlc3QsIHNyYywga2V5LAorCQkJCSAgIHBhcnRpYWwgPyBjdHgtPmJ1ZiA6IE5VTEwpOworCQlrZXJuZWxfbmVvbl9lbmQoKTsKKwkJc3JjICs9IGJsb2NrcyAqIEdIQVNIX0JMT0NLX1NJWkU7CisJCXBhcnRpYWwgPSAwOworCX0KKwlpZiAobGVuKQorCQltZW1jcHkoY3R4LT5idWYgKyBwYXJ0aWFsLCBzcmMsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2hhc2hfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpkc3QpCit7CisJc3RydWN0IGdoYXNoX2Rlc2NfY3R4ICpjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwl1bnNpZ25lZCBpbnQgcGFydGlhbCA9IGN0eC0+Y291bnQgJSBHSEFTSF9CTE9DS19TSVpFOworCisJaWYgKHBhcnRpYWwpIHsKKwkJc3RydWN0IGdoYXNoX2tleSAqa2V5ID0gY3J5cHRvX3NoYXNoX2N0eChkZXNjLT50Zm0pOworCisJCW1lbXNldChjdHgtPmJ1ZiArIHBhcnRpYWwsIDAsIEdIQVNIX0JMT0NLX1NJWkUgLSBwYXJ0aWFsKTsKKwkJa2VybmVsX25lb25fYmVnaW4oKTsKKwkJcG11bGxfZ2hhc2hfdXBkYXRlKDEsIGN0eC0+ZGlnZXN0LCBjdHgtPmJ1Ziwga2V5LCBOVUxMKTsKKwkJa2VybmVsX25lb25fZW5kKCk7CisJfQorCXB1dF91bmFsaWduZWRfYmU2NChjdHgtPmRpZ2VzdFsxXSwgZHN0KTsKKwlwdXRfdW5hbGlnbmVkX2JlNjQoY3R4LT5kaWdlc3RbMF0sIGRzdCArIDgpOworCisJKmN0eCA9IChzdHJ1Y3QgZ2hhc2hfZGVzY19jdHgpe307CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2hhc2hfc2V0a2V5KHN0cnVjdCBjcnlwdG9fc2hhc2ggKnRmbSwKKwkJCWNvbnN0IHU4ICppbmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKwlzdHJ1Y3QgZ2hhc2hfa2V5ICprZXkgPSBjcnlwdG9fc2hhc2hfY3R4KHRmbSk7CisJdTY0IGEsIGI7CisKKwlpZiAoa2V5bGVuICE9IEdIQVNIX0JMT0NLX1NJWkUpIHsKKwkJY3J5cHRvX3NoYXNoX3NldF9mbGFncyh0Zm0sIENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogcGVyZm9ybSBtdWx0aXBsaWNhdGlvbiBieSAneCcgaW4gR0YoMl4xMjgpICovCisJYiA9IGdldF91bmFsaWduZWRfYmU2NChpbmtleSk7CisJYSA9IGdldF91bmFsaWduZWRfYmU2NChpbmtleSArIDgpOworCisJa2V5LT5hID0gKGEgPDwgMSkgfCAoYiA+PiA2Myk7CisJa2V5LT5iID0gKGIgPDwgMSkgfCAoYSA+PiA2Myk7CisKKwlpZiAoYiA+PiA2MykKKwkJa2V5LT5iIF49IDB4YzIwMDAwMDAwMDAwMDAwMFVMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2hhc2hfYWxnIGdoYXNoX2FsZyA9IHsKKwkuZGlnZXN0c2l6ZQkJPSBHSEFTSF9ESUdFU1RfU0laRSwKKwkuaW5pdAkJCT0gZ2hhc2hfaW5pdCwKKwkudXBkYXRlCQkJPSBnaGFzaF91cGRhdGUsCisJLmZpbmFsCQkJPSBnaGFzaF9maW5hbCwKKwkuc2V0a2V5CQkJPSBnaGFzaF9zZXRrZXksCisJLmRlc2NzaXplCQk9IHNpemVvZihzdHJ1Y3QgZ2hhc2hfZGVzY19jdHgpLAorCS5iYXNlCQkJPSB7CisJCS5jcmFfbmFtZQk9ICJnaGFzaCIsCisJCS5jcmFfZHJpdmVyX25hbWUgPSAiX19kcml2ZXItZ2hhc2gtY2UiLAorCQkuY3JhX3ByaW9yaXR5CT0gMCwKKwkJLmNyYV9mbGFncwk9IENSWVBUT19BTEdfVFlQRV9TSEFTSCB8IENSWVBUT19BTEdfSU5URVJOQUwsCisJCS5jcmFfYmxvY2tzaXplCT0gR0hBU0hfQkxPQ0tfU0laRSwKKwkJLmNyYV9jdHhzaXplCT0gc2l6ZW9mKHN0cnVjdCBnaGFzaF9rZXkpLAorCQkuY3JhX21vZHVsZQk9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IGdoYXNoX2FzeW5jX2luaXQoc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm0gPSBjcnlwdG9fYWhhc2hfcmVxdGZtKHJlcSk7CisJc3RydWN0IGdoYXNoX2FzeW5jX2N0eCAqY3R4ID0gY3J5cHRvX2FoYXNoX2N0eCh0Zm0pOworCXN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpjcnlwdGRfcmVxID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKKwlzdHJ1Y3QgY3J5cHRkX2FoYXNoICpjcnlwdGRfdGZtID0gY3R4LT5jcnlwdGRfdGZtOworCisJaWYgKCFtYXlfdXNlX3NpbWQoKSkgeworCQltZW1jcHkoY3J5cHRkX3JlcSwgcmVxLCBzaXplb2YoKnJlcSkpOworCQlhaGFzaF9yZXF1ZXN0X3NldF90Zm0oY3J5cHRkX3JlcSwgJmNyeXB0ZF90Zm0tPmJhc2UpOworCQlyZXR1cm4gY3J5cHRvX2FoYXNoX2luaXQoY3J5cHRkX3JlcSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MgPSBjcnlwdGRfc2hhc2hfZGVzYyhjcnlwdGRfcmVxKTsKKwkJc3RydWN0IGNyeXB0b19zaGFzaCAqY2hpbGQgPSBjcnlwdGRfYWhhc2hfY2hpbGQoY3J5cHRkX3RmbSk7CisKKwkJZGVzYy0+dGZtID0gY2hpbGQ7CisJCWRlc2MtPmZsYWdzID0gcmVxLT5iYXNlLmZsYWdzOworCQlyZXR1cm4gY3J5cHRvX3NoYXNoX2luaXQoZGVzYyk7CisJfQorfQorCitzdGF0aWMgaW50IGdoYXNoX2FzeW5jX3VwZGF0ZShzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpjcnlwdGRfcmVxID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKKworCWlmICghbWF5X3VzZV9zaW1kKCkpIHsKKwkJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCQlzdHJ1Y3QgZ2hhc2hfYXN5bmNfY3R4ICpjdHggPSBjcnlwdG9fYWhhc2hfY3R4KHRmbSk7CisJCXN0cnVjdCBjcnlwdGRfYWhhc2ggKmNyeXB0ZF90Zm0gPSBjdHgtPmNyeXB0ZF90Zm07CisKKwkJbWVtY3B5KGNyeXB0ZF9yZXEsIHJlcSwgc2l6ZW9mKCpyZXEpKTsKKwkJYWhhc2hfcmVxdWVzdF9zZXRfdGZtKGNyeXB0ZF9yZXEsICZjcnlwdGRfdGZtLT5iYXNlKTsKKwkJcmV0dXJuIGNyeXB0b19haGFzaF91cGRhdGUoY3J5cHRkX3JlcSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MgPSBjcnlwdGRfc2hhc2hfZGVzYyhjcnlwdGRfcmVxKTsKKwkJcmV0dXJuIHNoYXNoX2FoYXNoX3VwZGF0ZShyZXEsIGRlc2MpOworCX0KK30KKworc3RhdGljIGludCBnaGFzaF9hc3luY19maW5hbChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpjcnlwdGRfcmVxID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKKworCWlmICghbWF5X3VzZV9zaW1kKCkpIHsKKwkJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCQlzdHJ1Y3QgZ2hhc2hfYXN5bmNfY3R4ICpjdHggPSBjcnlwdG9fYWhhc2hfY3R4KHRmbSk7CisJCXN0cnVjdCBjcnlwdGRfYWhhc2ggKmNyeXB0ZF90Zm0gPSBjdHgtPmNyeXB0ZF90Zm07CisKKwkJbWVtY3B5KGNyeXB0ZF9yZXEsIHJlcSwgc2l6ZW9mKCpyZXEpKTsKKwkJYWhhc2hfcmVxdWVzdF9zZXRfdGZtKGNyeXB0ZF9yZXEsICZjcnlwdGRfdGZtLT5iYXNlKTsKKwkJcmV0dXJuIGNyeXB0b19haGFzaF9maW5hbChjcnlwdGRfcmVxKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYyA9IGNyeXB0ZF9zaGFzaF9kZXNjKGNyeXB0ZF9yZXEpOworCQlyZXR1cm4gY3J5cHRvX3NoYXNoX2ZpbmFsKGRlc2MsIHJlcS0+cmVzdWx0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2hhc2hfYXN5bmNfZGlnZXN0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBnaGFzaF9hc3luY19jdHggKmN0eCA9IGNyeXB0b19haGFzaF9jdHgodGZtKTsKKwlzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqY3J5cHRkX3JlcSA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0ZF9haGFzaCAqY3J5cHRkX3RmbSA9IGN0eC0+Y3J5cHRkX3RmbTsKKworCWlmICghbWF5X3VzZV9zaW1kKCkpIHsKKwkJbWVtY3B5KGNyeXB0ZF9yZXEsIHJlcSwgc2l6ZW9mKCpyZXEpKTsKKwkJYWhhc2hfcmVxdWVzdF9zZXRfdGZtKGNyeXB0ZF9yZXEsICZjcnlwdGRfdGZtLT5iYXNlKTsKKwkJcmV0dXJuIGNyeXB0b19haGFzaF9kaWdlc3QoY3J5cHRkX3JlcSk7CisJfSBlbHNlIHsKKwkJc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MgPSBjcnlwdGRfc2hhc2hfZGVzYyhjcnlwdGRfcmVxKTsKKwkJc3RydWN0IGNyeXB0b19zaGFzaCAqY2hpbGQgPSBjcnlwdGRfYWhhc2hfY2hpbGQoY3J5cHRkX3RmbSk7CisKKwkJZGVzYy0+dGZtID0gY2hpbGQ7CisJCWRlc2MtPmZsYWdzID0gcmVxLT5iYXNlLmZsYWdzOworCQlyZXR1cm4gc2hhc2hfYWhhc2hfZGlnZXN0KHJlcSwgZGVzYyk7CisJfQorfQorCitzdGF0aWMgaW50IGdoYXNoX2FzeW5jX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm0sIGNvbnN0IHU4ICprZXksCisJCQkgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworCXN0cnVjdCBnaGFzaF9hc3luY19jdHggKmN0eCA9IGNyeXB0b19haGFzaF9jdHgodGZtKTsKKwlzdHJ1Y3QgY3J5cHRvX2FoYXNoICpjaGlsZCA9ICZjdHgtPmNyeXB0ZF90Zm0tPmJhc2U7CisJaW50IGVycjsKKworCWNyeXB0b19haGFzaF9jbGVhcl9mbGFncyhjaGlsZCwgQ1JZUFRPX1RGTV9SRVFfTUFTSyk7CisJY3J5cHRvX2FoYXNoX3NldF9mbGFncyhjaGlsZCwgY3J5cHRvX2FoYXNoX2dldF9mbGFncyh0Zm0pCisJCQkgICAgICAgJiBDUllQVE9fVEZNX1JFUV9NQVNLKTsKKwllcnIgPSBjcnlwdG9fYWhhc2hfc2V0a2V5KGNoaWxkLCBrZXksIGtleWxlbik7CisJY3J5cHRvX2FoYXNoX3NldF9mbGFncyh0Zm0sIGNyeXB0b19haGFzaF9nZXRfZmxhZ3MoY2hpbGQpCisJCQkgICAgICAgJiBDUllQVE9fVEZNX1JFU19NQVNLKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZ2hhc2hfYXN5bmNfaW5pdF90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgY3J5cHRkX2FoYXNoICpjcnlwdGRfdGZtOworCXN0cnVjdCBnaGFzaF9hc3luY19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisKKwljcnlwdGRfdGZtID0gY3J5cHRkX2FsbG9jX2FoYXNoKCJfX2RyaXZlci1naGFzaC1jZSIsCisJCQkJCUNSWVBUT19BTEdfSU5URVJOQUwsCisJCQkJCUNSWVBUT19BTEdfSU5URVJOQUwpOworCWlmIChJU19FUlIoY3J5cHRkX3RmbSkpCisJCXJldHVybiBQVFJfRVJSKGNyeXB0ZF90Zm0pOworCWN0eC0+Y3J5cHRkX3RmbSA9IGNyeXB0ZF90Zm07CisJY3J5cHRvX2FoYXNoX3NldF9yZXFzaXplKF9fY3J5cHRvX2FoYXNoX2Nhc3QodGZtKSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBhaGFzaF9yZXF1ZXN0KSArCisJCQkJIGNyeXB0b19haGFzaF9yZXFzaXplKCZjcnlwdGRfdGZtLT5iYXNlKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2hhc2hfYXN5bmNfZXhpdF90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgZ2hhc2hfYXN5bmNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisJY3J5cHRkX2ZyZWVfYWhhc2goY3R4LT5jcnlwdGRfdGZtKTsKK30KKworc3RhdGljIHN0cnVjdCBhaGFzaF9hbGcgZ2hhc2hfYXN5bmNfYWxnID0geworCS5pbml0CQkJPSBnaGFzaF9hc3luY19pbml0LAorCS51cGRhdGUJCQk9IGdoYXNoX2FzeW5jX3VwZGF0ZSwKKwkuZmluYWwJCQk9IGdoYXNoX2FzeW5jX2ZpbmFsLAorCS5zZXRrZXkJCQk9IGdoYXNoX2FzeW5jX3NldGtleSwKKwkuZGlnZXN0CQkJPSBnaGFzaF9hc3luY19kaWdlc3QsCisJLmhhbGcuZGlnZXN0c2l6ZQk9IEdIQVNIX0RJR0VTVF9TSVpFLAorCS5oYWxnLmJhc2UJCT0geworCQkuY3JhX25hbWUJPSAiZ2hhc2giLAorCQkuY3JhX2RyaXZlcl9uYW1lID0gImdoYXNoLWNlIiwKKwkJLmNyYV9wcmlvcml0eQk9IDMwMCwKKwkJLmNyYV9mbGFncwk9IENSWVBUT19BTEdfVFlQRV9BSEFTSCB8IENSWVBUT19BTEdfQVNZTkMsCisJCS5jcmFfYmxvY2tzaXplCT0gR0hBU0hfQkxPQ0tfU0laRSwKKwkJLmNyYV90eXBlCT0gJmNyeXB0b19haGFzaF90eXBlLAorCQkuY3JhX2N0eHNpemUJPSBzaXplb2Yoc3RydWN0IGdoYXNoX2FzeW5jX2N0eCksCisJCS5jcmFfbW9kdWxlCT0gVEhJU19NT0RVTEUsCisJCS5jcmFfaW5pdAk9IGdoYXNoX2FzeW5jX2luaXRfdGZtLAorCQkuY3JhX2V4aXQJPSBnaGFzaF9hc3luY19leGl0X3RmbSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgZ2hhc2hfY2VfbW9kX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCEoZWxmX2h3Y2FwMiAmIEhXQ0FQMl9QTVVMTCkpCisJCXJldHVybiAtRU5PREVWOworCisJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX3NoYXNoKCZnaGFzaF9hbGcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gY3J5cHRvX3JlZ2lzdGVyX2FoYXNoKCZnaGFzaF9hc3luY19hbGcpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3NoYXNoOworCisJcmV0dXJuIDA7CisKK2Vycl9zaGFzaDoKKwljcnlwdG9fdW5yZWdpc3Rlcl9zaGFzaCgmZ2hhc2hfYWxnKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZ2hhc2hfY2VfbW9kX2V4aXQodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9haGFzaCgmZ2hhc2hfYXN5bmNfYWxnKTsKKwljcnlwdG9fdW5yZWdpc3Rlcl9zaGFzaCgmZ2hhc2hfYWxnKTsKK30KKworbW9kdWxlX2luaXQoZ2hhc2hfY2VfbW9kX2luaXQpOworbW9kdWxlX2V4aXQoZ2hhc2hfY2VfbW9kX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3J5cHRvL3NoYTEtY2UtY29yZS5TIGIvYXJjaC9hcm0vY3J5cHRvL3NoYTEtY2UtY29yZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MjNmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcnlwdG8vc2hhMS1jZS1jb3JlLlMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBzaGExLWNlLWNvcmUuUyAtIFNIQS0xIHNlY3VyZSBoYXNoIHVzaW5nIEFSTXY4IENyeXB0byBFeHRlbnNpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IExpbmFybyBMdGQuCisgKiBBdXRob3I6IEFyZCBCaWVzaGV1dmVsIDxhcmQuYmllc2hldXZlbEBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisKKwkudGV4dAorCS5mcHUJCWNyeXB0by1uZW9uLWZwLWFybXY4CisKKwlrMAkJLnJlcQlxMAorCWsxCQkucmVxCXExCisJazIJCS5yZXEJcTIKKwlrMwkJLnJlcQlxMworCisJdGEwCQkucmVxCXE0CisJdGExCQkucmVxCXE1CisJdGIwCQkucmVxCXE1CisJdGIxCQkucmVxCXE0CisKKwlkZ2EJCS5yZXEJcTYKKwlkZ2IJCS5yZXEJcTcKKwlkZ2JzCQkucmVxCXMyOAorCisJZGcwCQkucmVxCXExMgorCWRnMWEwCQkucmVxCXExMworCWRnMWExCQkucmVxCXExNAorCWRnMWIwCQkucmVxCXExNAorCWRnMWIxCQkucmVxCXExMworCisJLm1hY3JvCQlhZGRfb25seSwgb3AsIGV2LCByYywgczAsIGRnMQorCS5pZm5iCQlcczAKKwl2YWRkLnUzMgl0YlxldiwgcVxzMCwgXHJjCisJLmVuZGlmCisJc2hhMWguMzIJZGcxYlxldiwgZGcwCisJLmlmYgkJXGRnMQorCXNoYTFcb3BcKCkuMzIJZGcwLCBkZzFhXGV2LCB0YVxldgorCS5lbHNlCisJc2hhMVxvcFwoKS4zMglkZzAsIFxkZzEsIHRhXGV2CisJLmVuZGlmCisJLmVuZG0KKworCS5tYWNybwkJYWRkX3VwZGF0ZSwgb3AsIGV2LCByYywgczAsIHMxLCBzMiwgczMsIGRnMQorCXNoYTFzdTAuMzIJcVxzMCwgcVxzMSwgcVxzMgorCWFkZF9vbmx5CVxvcCwgXGV2LCBccmMsIFxzMSwgXGRnMQorCXNoYTFzdTEuMzIJcVxzMCwgcVxzMworCS5lbmRtCisKKwkuYWxpZ24JCTYKKy5Mc2hhMV9yY29uOgorCS53b3JkCQkweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5LCAweDVhODI3OTk5CisJLndvcmQJCTB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEsIDB4NmVkOWViYTEKKwkud29yZAkJMHg4ZjFiYmNkYywgMHg4ZjFiYmNkYywgMHg4ZjFiYmNkYywgMHg4ZjFiYmNkYworCS53b3JkCQkweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2LCAweGNhNjJjMWQ2CisKKwkvKgorCSAqIHZvaWQgc2hhMV9jZV90cmFuc2Zvcm0oc3RydWN0IHNoYTFfc3RhdGUgKnNzdCwgdTggY29uc3QgKnNyYywKKwkgKgkJCSAgaW50IGJsb2Nrcyk7CisJICovCitFTlRSWShzaGExX2NlX3RyYW5zZm9ybSkKKwkvKiBsb2FkIHJvdW5kIGNvbnN0YW50cyAqLworCWFkcgkJaXAsIC5Mc2hhMV9yY29uCisJdmxkMS4zMgkJe2swLWsxfSwgW2lwLCA6MTI4XSEKKwl2bGQxLjMyCQl7azItazN9LCBbaXAsIDoxMjhdCisKKwkvKiBsb2FkIHN0YXRlICovCisJdmxkMS4zMgkJe2RnYX0sIFtyMF0KKwl2bGRyCQlkZ2JzLCBbcjAsICMxNl0KKworCS8qIGxvYWQgaW5wdXQgKi8KKzA6CXZsZDEuMzIJCXtxOC1xOX0sIFtyMV0hCisJdmxkMS4zMgkJe3ExMC1xMTF9LCBbcjFdIQorCXN1YnMJCXIyLCByMiwgIzEKKworI2lmbmRlZiBDT05GSUdfQ1BVX0JJR19FTkRJQU4KKwl2cmV2MzIuOAlxOCwgcTgKKwl2cmV2MzIuOAlxOSwgcTkKKwl2cmV2MzIuOAlxMTAsIHExMAorCXZyZXYzMi44CXExMSwgcTExCisjZW5kaWYKKworCXZhZGQudTMyCXRhMCwgcTgsIGswCisJdm1vdgkJZGcwLCBkZ2EKKworCWFkZF91cGRhdGUJYywgMCwgazAsICA4LCAgOSwgMTAsIDExLCBkZ2IKKwlhZGRfdXBkYXRlCWMsIDEsIGswLCAgOSwgMTAsIDExLCAgOAorCWFkZF91cGRhdGUJYywgMCwgazAsIDEwLCAxMSwgIDgsICA5CisJYWRkX3VwZGF0ZQljLCAxLCBrMCwgMTEsICA4LCAgOSwgMTAKKwlhZGRfdXBkYXRlCWMsIDAsIGsxLCAgOCwgIDksIDEwLCAxMQorCisJYWRkX3VwZGF0ZQlwLCAxLCBrMSwgIDksIDEwLCAxMSwgIDgKKwlhZGRfdXBkYXRlCXAsIDAsIGsxLCAxMCwgMTEsICA4LCAgOQorCWFkZF91cGRhdGUJcCwgMSwgazEsIDExLCAgOCwgIDksIDEwCisJYWRkX3VwZGF0ZQlwLCAwLCBrMSwgIDgsICA5LCAxMCwgMTEKKwlhZGRfdXBkYXRlCXAsIDEsIGsyLCAgOSwgMTAsIDExLCAgOAorCisJYWRkX3VwZGF0ZQltLCAwLCBrMiwgMTAsIDExLCAgOCwgIDkKKwlhZGRfdXBkYXRlCW0sIDEsIGsyLCAxMSwgIDgsICA5LCAxMAorCWFkZF91cGRhdGUJbSwgMCwgazIsICA4LCAgOSwgMTAsIDExCisJYWRkX3VwZGF0ZQltLCAxLCBrMiwgIDksIDEwLCAxMSwgIDgKKwlhZGRfdXBkYXRlCW0sIDAsIGszLCAxMCwgMTEsICA4LCAgOQorCisJYWRkX3VwZGF0ZQlwLCAxLCBrMywgMTEsICA4LCAgOSwgMTAKKwlhZGRfb25seQlwLCAwLCBrMywgIDkKKwlhZGRfb25seQlwLCAxLCBrMywgMTAKKwlhZGRfb25seQlwLCAwLCBrMywgMTEKKwlhZGRfb25seQlwLCAxCisKKwkvKiB1cGRhdGUgc3RhdGUgKi8KKwl2YWRkLnUzMglkZ2EsIGRnYSwgZGcwCisJdmFkZC51MzIJZGdiLCBkZ2IsIGRnMWEwCisJYm5lCQkwYgorCisJLyogc3RvcmUgbmV3IHN0YXRlICovCisJdnN0MS4zMgkJe2RnYX0sIFtyMF0KKwl2c3RyCQlkZ2JzLCBbcjAsICMxNl0KKwlieAkJbHIKK0VORFBST0Moc2hhMV9jZV90cmFuc2Zvcm0pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcnlwdG8vc2hhMS1jZS1nbHVlLmMgYi9hcmNoL2FybS9jcnlwdG8vc2hhMS1jZS1nbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBiYzJmYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NyeXB0by9zaGExLWNlLWdsdWUuYwpAQCAtMCwwICsxLDk2IEBACisvKgorICogc2hhMS1jZS1nbHVlLmMgLSBTSEEtMSBzZWN1cmUgaGFzaCB1c2luZyBBUk12OCBDcnlwdG8gRXh0ZW5zaW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBMaW5hcm8gTHRkIDxhcmQuYmllc2hldXZlbEBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgorI2luY2x1ZGUgPGNyeXB0by9zaGExX2Jhc2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGFzbS9od2NhcC5oPgorI2luY2x1ZGUgPGFzbS9uZW9uLmg+CisjaW5jbHVkZSA8YXNtL3NpbWQuaD4KKworI2luY2x1ZGUgInNoYTEuaCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTSEExIHNlY3VyZSBoYXNoIHVzaW5nIEFSTXY4IENyeXB0byBFeHRlbnNpb25zIik7CitNT0RVTEVfQVVUSE9SKCJBcmQgQmllc2hldXZlbCA8YXJkLmJpZXNoZXV2ZWxAbGluYXJvLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworYXNtbGlua2FnZSB2b2lkIHNoYTFfY2VfdHJhbnNmb3JtKHN0cnVjdCBzaGExX3N0YXRlICpzc3QsIHU4IGNvbnN0ICpzcmMsCisJCQkJICBpbnQgYmxvY2tzKTsKKworc3RhdGljIGludCBzaGExX2NlX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCisJCQkgIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCWlmICghbWF5X3VzZV9zaW1kKCkgfHwKKwkgICAgKHNjdHgtPmNvdW50ICUgU0hBMV9CTE9DS19TSVpFKSArIGxlbiA8IFNIQTFfQkxPQ0tfU0laRSkKKwkJcmV0dXJuIHNoYTFfdXBkYXRlX2FybShkZXNjLCBkYXRhLCBsZW4pOworCisJa2VybmVsX25lb25fYmVnaW4oKTsKKwlzaGExX2Jhc2VfZG9fdXBkYXRlKGRlc2MsIGRhdGEsIGxlbiwgc2hhMV9jZV90cmFuc2Zvcm0pOworCWtlcm5lbF9uZW9uX2VuZCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hhMV9jZV9maW51cChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCisJCQkgdW5zaWduZWQgaW50IGxlbiwgdTggKm91dCkKK3sKKwlpZiAoIW1heV91c2Vfc2ltZCgpKQorCQlyZXR1cm4gc2hhMV9maW51cF9hcm0oZGVzYywgZGF0YSwgbGVuLCBvdXQpOworCisJa2VybmVsX25lb25fYmVnaW4oKTsKKwlpZiAobGVuKQorCQlzaGExX2Jhc2VfZG9fdXBkYXRlKGRlc2MsIGRhdGEsIGxlbiwgc2hhMV9jZV90cmFuc2Zvcm0pOworCXNoYTFfYmFzZV9kb19maW5hbGl6ZShkZXNjLCBzaGExX2NlX3RyYW5zZm9ybSk7CisJa2VybmVsX25lb25fZW5kKCk7CisKKwlyZXR1cm4gc2hhMV9iYXNlX2ZpbmlzaChkZXNjLCBvdXQpOworfQorCitzdGF0aWMgaW50IHNoYTFfY2VfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCit7CisJcmV0dXJuIHNoYTFfY2VfZmludXAoZGVzYywgTlVMTCwgMCwgb3V0KTsKK30KKworc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgYWxnID0geworCS5pbml0CQkJPSBzaGExX2Jhc2VfaW5pdCwKKwkudXBkYXRlCQkJPSBzaGExX2NlX3VwZGF0ZSwKKwkuZmluYWwJCQk9IHNoYTFfY2VfZmluYWwsCisJLmZpbnVwCQkJPSBzaGExX2NlX2ZpbnVwLAorCS5kZXNjc2l6ZQkJPSBzaXplb2Yoc3RydWN0IHNoYTFfc3RhdGUpLAorCS5kaWdlc3RzaXplCQk9IFNIQTFfRElHRVNUX1NJWkUsCisJLmJhc2UJCQk9IHsKKwkJLmNyYV9uYW1lCQk9ICJzaGExIiwKKwkJLmNyYV9kcml2ZXJfbmFtZQk9ICJzaGExLWNlIiwKKwkJLmNyYV9wcmlvcml0eQkJPSAyMDAsCisJCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX1NIQVNILAorCQkuY3JhX2Jsb2Nrc2l6ZQkJPSBTSEExX0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNoYTFfY2VfbW9kX2luaXQodm9pZCkKK3sKKwlpZiAoIShlbGZfaHdjYXAyICYgSFdDQVAyX1NIQTEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gY3J5cHRvX3JlZ2lzdGVyX3NoYXNoKCZhbGcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2hhMV9jZV9tb2RfZmluaSh2b2lkKQoreworCWNyeXB0b191bnJlZ2lzdGVyX3NoYXNoKCZhbGcpOworfQorCittb2R1bGVfaW5pdChzaGExX2NlX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHNoYTFfY2VfbW9kX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3J5cHRvL3NoYTEuaCBiL2FyY2gvYXJtL2NyeXB0by9zaGExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkOGJkMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NyeXB0by9zaGExLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBBU01fQVJNX0NSWVBUT19TSEExX0gKKyNkZWZpbmUgQVNNX0FSTV9DUllQVE9fU0hBMV9ICisKKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisKK2V4dGVybiBpbnQgc2hhMV91cGRhdGVfYXJtKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgIHVuc2lnbmVkIGludCBsZW4pOworCitleHRlcm4gaW50IHNoYTFfZmludXBfYXJtKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgIHVuc2lnbmVkIGludCBsZW4sIHU4ICpvdXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NyeXB0by9zaGExX2dsdWUuYyBiL2FyY2gvYXJtL2NyeXB0by9zaGExX2dsdWUuYwppbmRleCBlMzFiMDQ0Li42ZmM3M2JmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jcnlwdG8vc2hhMV9nbHVlLmMKKysrIGIvYXJjaC9hcm0vY3J5cHRvL3NoYTFfZ2x1ZS5jCkBAIC0yMiwxMjcgKzIyLDQ3IEBACiAjaW5jbHVkZSA8bGludXgvY3J5cHRvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgorI2luY2x1ZGUgPGNyeXB0by9zaGExX2Jhc2UuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaW5jbHVkZSA8YXNtL2NyeXB0by9zaGExLmg+CiAKKyNpbmNsdWRlICJzaGExLmgiCiAKIGFzbWxpbmthZ2Ugdm9pZCBzaGExX2Jsb2NrX2RhdGFfb3JkZXIodTMyICpkaWdlc3QsCiAJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCByb3VuZHMpOwogCi0KLXN0YXRpYyBpbnQgc2hhMV9pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQotewotCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0KLQkqc2N0eCA9IChzdHJ1Y3Qgc2hhMV9zdGF0ZSl7Ci0JCS5zdGF0ZSA9IHsgU0hBMV9IMCwgU0hBMV9IMSwgU0hBMV9IMiwgU0hBMV9IMywgU0hBMV9INCB9LAotCX07Ci0KLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IF9fc2hhMV91cGRhdGUoc3RydWN0IHNoYTFfc3RhdGUgKnNjdHgsIGNvbnN0IHU4ICpkYXRhLAotCQkJIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBwYXJ0aWFsKQotewotCXVuc2lnbmVkIGludCBkb25lID0gMDsKLQotCXNjdHgtPmNvdW50ICs9IGxlbjsKLQotCWlmIChwYXJ0aWFsKSB7Ci0JCWRvbmUgPSBTSEExX0JMT0NLX1NJWkUgLSBwYXJ0aWFsOwotCQltZW1jcHkoc2N0eC0+YnVmZmVyICsgcGFydGlhbCwgZGF0YSwgZG9uZSk7Ci0JCXNoYTFfYmxvY2tfZGF0YV9vcmRlcihzY3R4LT5zdGF0ZSwgc2N0eC0+YnVmZmVyLCAxKTsKLQl9Ci0KLQlpZiAobGVuIC0gZG9uZSA+PSBTSEExX0JMT0NLX1NJWkUpIHsKLQkJY29uc3QgdW5zaWduZWQgaW50IHJvdW5kcyA9IChsZW4gLSBkb25lKSAvIFNIQTFfQkxPQ0tfU0laRTsKLQkJc2hhMV9ibG9ja19kYXRhX29yZGVyKHNjdHgtPnN0YXRlLCBkYXRhICsgZG9uZSwgcm91bmRzKTsKLQkJZG9uZSArPSByb3VuZHMgKiBTSEExX0JMT0NLX1NJWkU7Ci0JfQotCi0JbWVtY3B5KHNjdHgtPmJ1ZmZlciwgZGF0YSArIGRvbmUsIGxlbiAtIGRvbmUpOwotCXJldHVybiAwOwotfQotCi0KIGludCBzaGExX3VwZGF0ZV9hcm0oc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAogCQkgICAgdW5zaWduZWQgaW50IGxlbikKIHsKLQlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCXVuc2lnbmVkIGludCBwYXJ0aWFsID0gc2N0eC0+Y291bnQgJSBTSEExX0JMT0NLX1NJWkU7Ci0JaW50IHJlczsKKwkvKiBtYWtlIHN1cmUgY2FzdGluZyB0byBzaGExX2Jsb2NrX2ZuKCkgaXMgc2FmZSAqLworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3Qgc2hhMV9zdGF0ZSwgc3RhdGUpICE9IDApOwogCi0JLyogSGFuZGxlIHRoZSBmYXN0IGNhc2UgcmlnaHQgaGVyZSAqLwotCWlmIChwYXJ0aWFsICsgbGVuIDwgU0hBMV9CTE9DS19TSVpFKSB7Ci0JCXNjdHgtPmNvdW50ICs9IGxlbjsKLQkJbWVtY3B5KHNjdHgtPmJ1ZmZlciArIHBhcnRpYWwsIGRhdGEsIGxlbik7Ci0JCXJldHVybiAwOwotCX0KLQlyZXMgPSBfX3NoYTFfdXBkYXRlKHNjdHgsIGRhdGEsIGxlbiwgcGFydGlhbCk7Ci0JcmV0dXJuIHJlczsKKwlyZXR1cm4gc2hhMV9iYXNlX2RvX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sCisJCQkJICAgKHNoYTFfYmxvY2tfZm4gKilzaGExX2Jsb2NrX2RhdGFfb3JkZXIpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2hhMV91cGRhdGVfYXJtKTsKIAotCi0vKiBBZGQgcGFkZGluZyBhbmQgcmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdC4gKi8KIHN0YXRpYyBpbnQgc2hhMV9maW5hbChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKIHsKLQlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCXVuc2lnbmVkIGludCBpLCBpbmRleCwgcGFkbGVuOwotCV9fYmUzMiAqZHN0ID0gKF9fYmUzMiAqKW91dDsKLQlfX2JlNjQgYml0czsKLQlzdGF0aWMgY29uc3QgdTggcGFkZGluZ1tTSEExX0JMT0NLX1NJWkVdID0geyAweDgwLCB9OwotCi0JYml0cyA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50IDw8IDMpOwotCi0JLyogUGFkIG91dCB0byA1NiBtb2QgNjQgYW5kIGFwcGVuZCBsZW5ndGggKi8KLQlpbmRleCA9IHNjdHgtPmNvdW50ICUgU0hBMV9CTE9DS19TSVpFOwotCXBhZGxlbiA9IChpbmRleCA8IDU2KSA/ICg1NiAtIGluZGV4KSA6ICgoU0hBMV9CTE9DS19TSVpFKzU2KSAtIGluZGV4KTsKLQkvKiBXZSBuZWVkIHRvIGZpbGwgYSB3aG9sZSBibG9jayBmb3IgX19zaGExX3VwZGF0ZSgpICovCi0JaWYgKHBhZGxlbiA8PSA1NikgewotCQlzY3R4LT5jb3VudCArPSBwYWRsZW47Ci0JCW1lbWNweShzY3R4LT5idWZmZXIgKyBpbmRleCwgcGFkZGluZywgcGFkbGVuKTsKLQl9IGVsc2UgewotCQlfX3NoYTFfdXBkYXRlKHNjdHgsIHBhZGRpbmcsIHBhZGxlbiwgaW5kZXgpOwotCX0KLQlfX3NoYTFfdXBkYXRlKHNjdHgsIChjb25zdCB1OCAqKSZiaXRzLCBzaXplb2YoYml0cyksIDU2KTsKLQotCS8qIFN0b3JlIHN0YXRlIGluIGRpZ2VzdCAqLwotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JCWRzdFtpXSA9IGNwdV90b19iZTMyKHNjdHgtPnN0YXRlW2ldKTsKLQotCS8qIFdpcGUgY29udGV4dCAqLwotCW1lbXNldChzY3R4LCAwLCBzaXplb2YoKnNjdHgpKTsKLQlyZXR1cm4gMDsKKwlzaGExX2Jhc2VfZG9fZmluYWxpemUoZGVzYywgKHNoYTFfYmxvY2tfZm4gKilzaGExX2Jsb2NrX2RhdGFfb3JkZXIpOworCXJldHVybiBzaGExX2Jhc2VfZmluaXNoKGRlc2MsIG91dCk7CiB9CiAKLQotc3RhdGljIGludCBzaGExX2V4cG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdm9pZCAqb3V0KQoraW50IHNoYTFfZmludXBfYXJtKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJICAgdW5zaWduZWQgaW50IGxlbiwgdTggKm91dCkKIHsKLQlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCW1lbWNweShvdXQsIHNjdHgsIHNpemVvZigqc2N0eCkpOwotCXJldHVybiAwOworCXNoYTFfYmFzZV9kb191cGRhdGUoZGVzYywgZGF0YSwgbGVuLAorCQkJICAgIChzaGExX2Jsb2NrX2ZuICopc2hhMV9ibG9ja19kYXRhX29yZGVyKTsKKwlyZXR1cm4gc2hhMV9maW5hbChkZXNjLCBvdXQpOwogfQotCi0KLXN0YXRpYyBpbnQgc2hhMV9pbXBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHZvaWQgKmluKQotewotCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0JbWVtY3B5KHNjdHgsIGluLCBzaXplb2YoKnNjdHgpKTsKLQlyZXR1cm4gMDsKLX0KLQorRVhQT1JUX1NZTUJPTF9HUEwoc2hhMV9maW51cF9hcm0pOwogCiBzdGF0aWMgc3RydWN0IHNoYXNoX2FsZyBhbGcgPSB7CiAJLmRpZ2VzdHNpemUJPQlTSEExX0RJR0VTVF9TSVpFLAotCS5pbml0CQk9CXNoYTFfaW5pdCwKKwkuaW5pdAkJPQlzaGExX2Jhc2VfaW5pdCwKIAkudXBkYXRlCQk9CXNoYTFfdXBkYXRlX2FybSwKIAkuZmluYWwJCT0Jc2hhMV9maW5hbCwKLQkuZXhwb3J0CQk9CXNoYTFfZXhwb3J0LAotCS5pbXBvcnQJCT0Jc2hhMV9pbXBvcnQsCisJLmZpbnVwCQk9CXNoYTFfZmludXBfYXJtLAogCS5kZXNjc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMV9zdGF0ZSksCi0JLnN0YXRlc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMV9zdGF0ZSksCiAJLmJhc2UJCT0JewogCQkuY3JhX25hbWUJPQkic2hhMSIsCiAJCS5jcmFfZHJpdmVyX25hbWU9CSJzaGExLWFzbSIsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcnlwdG8vc2hhMV9uZW9uX2dsdWUuYyBiL2FyY2gvYXJtL2NyeXB0by9zaGExX25lb25fZ2x1ZS5jCmluZGV4IDBiMDA4MzcuLjRlMjJmMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2NyeXB0by9zaGExX25lb25fZ2x1ZS5jCisrKyBiL2FyY2gvYXJtL2NyeXB0by9zaGExX25lb25fZ2x1ZS5jCkBAIC0yNSwxNDcgKzI1LDYwIEBACiAjaW5jbHVkZSA8bGludXgvY3J5cHRvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgotI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhMV9iYXNlLmg+CiAjaW5jbHVkZSA8YXNtL25lb24uaD4KICNpbmNsdWRlIDxhc20vc2ltZC5oPgotI2luY2x1ZGUgPGFzbS9jcnlwdG8vc2hhMS5oPgogCisjaW5jbHVkZSAic2hhMS5oIgogCiBhc21saW5rYWdlIHZvaWQgc2hhMV90cmFuc2Zvcm1fbmVvbih2b2lkICpzdGF0ZV9oLCBjb25zdCBjaGFyICpkYXRhLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgcm91bmRzKTsKIAotCi1zdGF0aWMgaW50IHNoYTFfbmVvbl9pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQotewotCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0KLQkqc2N0eCA9IChzdHJ1Y3Qgc2hhMV9zdGF0ZSl7Ci0JCS5zdGF0ZSA9IHsgU0hBMV9IMCwgU0hBMV9IMSwgU0hBMV9IMiwgU0hBMV9IMywgU0hBMV9INCB9LAotCX07Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX3NoYTFfbmVvbl91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBwYXJ0aWFsKQotewotCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0JdW5zaWduZWQgaW50IGRvbmUgPSAwOwotCi0Jc2N0eC0+Y291bnQgKz0gbGVuOwotCi0JaWYgKHBhcnRpYWwpIHsKLQkJZG9uZSA9IFNIQTFfQkxPQ0tfU0laRSAtIHBhcnRpYWw7Ci0JCW1lbWNweShzY3R4LT5idWZmZXIgKyBwYXJ0aWFsLCBkYXRhLCBkb25lKTsKLQkJc2hhMV90cmFuc2Zvcm1fbmVvbihzY3R4LT5zdGF0ZSwgc2N0eC0+YnVmZmVyLCAxKTsKLQl9Ci0KLQlpZiAobGVuIC0gZG9uZSA+PSBTSEExX0JMT0NLX1NJWkUpIHsKLQkJY29uc3QgdW5zaWduZWQgaW50IHJvdW5kcyA9IChsZW4gLSBkb25lKSAvIFNIQTFfQkxPQ0tfU0laRTsKLQotCQlzaGExX3RyYW5zZm9ybV9uZW9uKHNjdHgtPnN0YXRlLCBkYXRhICsgZG9uZSwgcm91bmRzKTsKLQkJZG9uZSArPSByb3VuZHMgKiBTSEExX0JMT0NLX1NJWkU7Ci0JfQotCi0JbWVtY3B5KHNjdHgtPmJ1ZmZlciwgZGF0YSArIGRvbmUsIGxlbiAtIGRvbmUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgc2hhMV9uZW9uX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCi0JCQkgICAgIHVuc2lnbmVkIGludCBsZW4pCisJCQkgIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQl1bnNpZ25lZCBpbnQgcGFydGlhbCA9IHNjdHgtPmNvdW50ICUgU0hBMV9CTE9DS19TSVpFOwotCWludCByZXM7CiAKLQkvKiBIYW5kbGUgdGhlIGZhc3QgY2FzZSByaWdodCBoZXJlICovCi0JaWYgKHBhcnRpYWwgKyBsZW4gPCBTSEExX0JMT0NLX1NJWkUpIHsKLQkJc2N0eC0+Y291bnQgKz0gbGVuOwotCQltZW1jcHkoc2N0eC0+YnVmZmVyICsgcGFydGlhbCwgZGF0YSwgbGVuKTsKKwlpZiAoIW1heV91c2Vfc2ltZCgpIHx8CisJICAgIChzY3R4LT5jb3VudCAlIFNIQTFfQkxPQ0tfU0laRSkgKyBsZW4gPCBTSEExX0JMT0NLX1NJWkUpCisJCXJldHVybiBzaGExX3VwZGF0ZV9hcm0oZGVzYywgZGF0YSwgbGVuKTsKIAotCQlyZXR1cm4gMDsKLQl9CisJa2VybmVsX25lb25fYmVnaW4oKTsKKwlzaGExX2Jhc2VfZG9fdXBkYXRlKGRlc2MsIGRhdGEsIGxlbiwKKwkJCSAgICAoc2hhMV9ibG9ja19mbiAqKXNoYTFfdHJhbnNmb3JtX25lb24pOworCWtlcm5lbF9uZW9uX2VuZCgpOwogCi0JaWYgKCFtYXlfdXNlX3NpbWQoKSkgewotCQlyZXMgPSBzaGExX3VwZGF0ZV9hcm0oZGVzYywgZGF0YSwgbGVuKTsKLQl9IGVsc2UgewotCQlrZXJuZWxfbmVvbl9iZWdpbigpOwotCQlyZXMgPSBfX3NoYTFfbmVvbl91cGRhdGUoZGVzYywgZGF0YSwgbGVuLCBwYXJ0aWFsKTsKLQkJa2VybmVsX25lb25fZW5kKCk7Ci0JfQotCi0JcmV0dXJuIHJlczsKKwlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzaGExX25lb25fZmludXAoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJICAgdW5zaWduZWQgaW50IGxlbiwgdTggKm91dCkKK3sKKwlpZiAoIW1heV91c2Vfc2ltZCgpKQorCQlyZXR1cm4gc2hhMV9maW51cF9hcm0oZGVzYywgZGF0YSwgbGVuLCBvdXQpOwogCi0vKiBBZGQgcGFkZGluZyBhbmQgcmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdC4gKi8KKwlrZXJuZWxfbmVvbl9iZWdpbigpOworCWlmIChsZW4pCisJCXNoYTFfYmFzZV9kb191cGRhdGUoZGVzYywgZGF0YSwgbGVuLAorCQkJCSAgICAoc2hhMV9ibG9ja19mbiAqKXNoYTFfdHJhbnNmb3JtX25lb24pOworCXNoYTFfYmFzZV9kb19maW5hbGl6ZShkZXNjLCAoc2hhMV9ibG9ja19mbiAqKXNoYTFfdHJhbnNmb3JtX25lb24pOworCWtlcm5lbF9uZW9uX2VuZCgpOworCisJcmV0dXJuIHNoYTFfYmFzZV9maW5pc2goZGVzYywgb3V0KTsKK30KKwogc3RhdGljIGludCBzaGExX25lb25fZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQl1bnNpZ25lZCBpbnQgaSwgaW5kZXgsIHBhZGxlbjsKLQlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXQ7Ci0JX19iZTY0IGJpdHM7Ci0Jc3RhdGljIGNvbnN0IHU4IHBhZGRpbmdbU0hBMV9CTE9DS19TSVpFXSA9IHsgMHg4MCwgfTsKLQotCWJpdHMgPSBjcHVfdG9fYmU2NChzY3R4LT5jb3VudCA8PCAzKTsKLQotCS8qIFBhZCBvdXQgdG8gNTYgbW9kIDY0IGFuZCBhcHBlbmQgbGVuZ3RoICovCi0JaW5kZXggPSBzY3R4LT5jb3VudCAlIFNIQTFfQkxPQ0tfU0laRTsKLQlwYWRsZW4gPSAoaW5kZXggPCA1NikgPyAoNTYgLSBpbmRleCkgOiAoKFNIQTFfQkxPQ0tfU0laRSs1NikgLSBpbmRleCk7Ci0JaWYgKCFtYXlfdXNlX3NpbWQoKSkgewotCQlzaGExX3VwZGF0ZV9hcm0oZGVzYywgcGFkZGluZywgcGFkbGVuKTsKLQkJc2hhMV91cGRhdGVfYXJtKGRlc2MsIChjb25zdCB1OCAqKSZiaXRzLCBzaXplb2YoYml0cykpOwotCX0gZWxzZSB7Ci0JCWtlcm5lbF9uZW9uX2JlZ2luKCk7Ci0JCS8qIFdlIG5lZWQgdG8gZmlsbCBhIHdob2xlIGJsb2NrIGZvciBfX3NoYTFfbmVvbl91cGRhdGUoKSAqLwotCQlpZiAocGFkbGVuIDw9IDU2KSB7Ci0JCQlzY3R4LT5jb3VudCArPSBwYWRsZW47Ci0JCQltZW1jcHkoc2N0eC0+YnVmZmVyICsgaW5kZXgsIHBhZGRpbmcsIHBhZGxlbik7Ci0JCX0gZWxzZSB7Ci0JCQlfX3NoYTFfbmVvbl91cGRhdGUoZGVzYywgcGFkZGluZywgcGFkbGVuLCBpbmRleCk7Ci0JCX0KLQkJX19zaGExX25lb25fdXBkYXRlKGRlc2MsIChjb25zdCB1OCAqKSZiaXRzLCBzaXplb2YoYml0cyksIDU2KTsKLQkJa2VybmVsX25lb25fZW5kKCk7Ci0JfQotCi0JLyogU3RvcmUgc3RhdGUgaW4gZGlnZXN0ICovCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJZHN0W2ldID0gY3B1X3RvX2JlMzIoc2N0eC0+c3RhdGVbaV0pOwotCi0JLyogV2lwZSBjb250ZXh0ICovCi0JbWVtc2V0KHNjdHgsIDAsIHNpemVvZigqc2N0eCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhMV9uZW9uX2V4cG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdm9pZCAqb3V0KQotewotCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0KLQltZW1jcHkob3V0LCBzY3R4LCBzaXplb2YoKnNjdHgpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNoYTFfbmVvbl9pbXBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHZvaWQgKmluKQotewotCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0KLQltZW1jcHkoc2N0eCwgaW4sIHNpemVvZigqc2N0eCkpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHNoYTFfbmVvbl9maW51cChkZXNjLCBOVUxMLCAwLCBvdXQpOwogfQogCiBzdGF0aWMgc3RydWN0IHNoYXNoX2FsZyBhbGcgPSB7CiAJLmRpZ2VzdHNpemUJPQlTSEExX0RJR0VTVF9TSVpFLAotCS5pbml0CQk9CXNoYTFfbmVvbl9pbml0LAorCS5pbml0CQk9CXNoYTFfYmFzZV9pbml0LAogCS51cGRhdGUJCT0Jc2hhMV9uZW9uX3VwZGF0ZSwKIAkuZmluYWwJCT0Jc2hhMV9uZW9uX2ZpbmFsLAotCS5leHBvcnQJCT0Jc2hhMV9uZW9uX2V4cG9ydCwKLQkuaW1wb3J0CQk9CXNoYTFfbmVvbl9pbXBvcnQsCisJLmZpbnVwCQk9CXNoYTFfbmVvbl9maW51cCwKIAkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTFfc3RhdGUpLAotCS5zdGF0ZXNpemUJPQlzaXplb2Yoc3RydWN0IHNoYTFfc3RhdGUpLAogCS5iYXNlCQk9CXsKIAkJLmNyYV9uYW1lCQk9ICJzaGExIiwKIAkJLmNyYV9kcml2ZXJfbmFtZQk9ICJzaGExLW5lb24iLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3J5cHRvL3NoYTItY2UtY29yZS5TIGIvYXJjaC9hcm0vY3J5cHRvL3NoYTItY2UtY29yZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWMxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcnlwdG8vc2hhMi1jZS1jb3JlLlMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBzaGEyLWNlLWNvcmUuUyAtIFNIQS0yMjQvMjU2IHNlY3VyZSBoYXNoIHVzaW5nIEFSTXY4IENyeXB0byBFeHRlbnNpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IExpbmFybyBMdGQuCisgKiBBdXRob3I6IEFyZCBCaWVzaGV1dmVsIDxhcmQuYmllc2hldXZlbEBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+CisKKwkudGV4dAorCS5mcHUJCWNyeXB0by1uZW9uLWZwLWFybXY4CisKKwlrMAkJLnJlcQlxNworCWsxCQkucmVxCXE4CisJcmsJCS5yZXEJcjMKKworCXRhMAkJLnJlcQlxOQorCXRhMQkJLnJlcQlxMTAKKwl0YjAJCS5yZXEJcTEwCisJdGIxCQkucmVxCXE5CisKKwlkZ2EJCS5yZXEJcTExCisJZGdiCQkucmVxCXExMgorCisJZGcwCQkucmVxCXExMworCWRnMQkJLnJlcQlxMTQKKwlkZzIJCS5yZXEJcTE1CisKKwkubWFjcm8JCWFkZF9vbmx5LCBldiwgczAKKwl2bW92CQlkZzIsIGRnMAorCS5pZm5iCQlcczAKKwl2bGQxLjMyCQl7a1xldn0sIFtyaywgOjEyOF0hCisJLmVuZGlmCisJc2hhMjU2aC4zMglkZzAsIGRnMSwgdGJcZXYKKwlzaGEyNTZoMi4zMglkZzEsIGRnMiwgdGJcZXYKKwkuaWZuYgkJXHMwCisJdmFkZC51MzIJdGFcZXYsIHFcczAsIGtcZXYKKwkuZW5kaWYKKwkuZW5kbQorCisJLm1hY3JvCQlhZGRfdXBkYXRlLCBldiwgczAsIHMxLCBzMiwgczMKKwlzaGEyNTZzdTAuMzIJcVxzMCwgcVxzMQorCWFkZF9vbmx5CVxldiwgXHMxCisJc2hhMjU2c3UxLjMyCXFcczAsIHFcczIsIHFcczMKKwkuZW5kbQorCisJLmFsaWduCQk2CisuTHNoYTI1Nl9yY29uOgorCS53b3JkCQkweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1CisJLndvcmQJCTB4Mzk1NmMyNWIsIDB4NTlmMTExZjEsIDB4OTIzZjgyYTQsIDB4YWIxYzVlZDUKKwkud29yZAkJMHhkODA3YWE5OCwgMHgxMjgzNWIwMSwgMHgyNDMxODViZSwgMHg1NTBjN2RjMworCS53b3JkCQkweDcyYmU1ZDc0LCAweDgwZGViMWZlLCAweDliZGMwNmE3LCAweGMxOWJmMTc0CisJLndvcmQJCTB4ZTQ5YjY5YzEsIDB4ZWZiZTQ3ODYsIDB4MGZjMTlkYzYsIDB4MjQwY2ExY2MKKwkud29yZAkJMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYQorCS53b3JkCQkweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3CisJLndvcmQJCTB4YzZlMDBiZjMsIDB4ZDVhNzkxNDcsIDB4MDZjYTYzNTEsIDB4MTQyOTI5NjcKKwkud29yZAkJMHgyN2I3MGE4NSwgMHgyZTFiMjEzOCwgMHg0ZDJjNmRmYywgMHg1MzM4MGQxMworCS53b3JkCQkweDY1MGE3MzU0LCAweDc2NmEwYWJiLCAweDgxYzJjOTJlLCAweDkyNzIyYzg1CisJLndvcmQJCTB4YTJiZmU4YTEsIDB4YTgxYTY2NGIsIDB4YzI0YjhiNzAsIDB4Yzc2YzUxYTMKKwkud29yZAkJMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MAorCS53b3JkCQkweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1CisJLndvcmQJCTB4MzkxYzBjYjMsIDB4NGVkOGFhNGEsIDB4NWI5Y2NhNGYsIDB4NjgyZTZmZjMKKwkud29yZAkJMHg3NDhmODJlZSwgMHg3OGE1NjM2ZiwgMHg4NGM4NzgxNCwgMHg4Y2M3MDIwOAorCS53b3JkCQkweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyCisKKwkvKgorCSAqIHZvaWQgc2hhMl9jZV90cmFuc2Zvcm0oc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc3N0LCB1OCBjb25zdCAqc3JjLAorCQkJCSAgaW50IGJsb2Nrcyk7CisJICovCitFTlRSWShzaGEyX2NlX3RyYW5zZm9ybSkKKwkvKiBsb2FkIHN0YXRlICovCisJdmxkMS4zMgkJe2RnYS1kZ2J9LCBbcjBdCisKKwkvKiBsb2FkIGlucHV0ICovCiswOgl2bGQxLjMyCQl7cTAtcTF9LCBbcjFdIQorCXZsZDEuMzIJCXtxMi1xM30sIFtyMV0hCisJc3VicwkJcjIsIHIyLCAjMQorCisjaWZuZGVmIENPTkZJR19DUFVfQklHX0VORElBTgorCXZyZXYzMi44CXEwLCBxMAorCXZyZXYzMi44CXExLCBxMQorCXZyZXYzMi44CXEyLCBxMgorCXZyZXYzMi44CXEzLCBxMworI2VuZGlmCisKKwkvKiBsb2FkIGZpcnN0IHJvdW5kIGNvbnN0YW50ICovCisJYWRyCQlyaywgLkxzaGEyNTZfcmNvbgorCXZsZDEuMzIJCXtrMH0sIFtyaywgOjEyOF0hCisKKwl2YWRkLnUzMgl0YTAsIHEwLCBrMAorCXZtb3YJCWRnMCwgZGdhCisJdm1vdgkJZGcxLCBkZ2IKKworCWFkZF91cGRhdGUJMSwgMCwgMSwgMiwgMworCWFkZF91cGRhdGUJMCwgMSwgMiwgMywgMAorCWFkZF91cGRhdGUJMSwgMiwgMywgMCwgMQorCWFkZF91cGRhdGUJMCwgMywgMCwgMSwgMgorCWFkZF91cGRhdGUJMSwgMCwgMSwgMiwgMworCWFkZF91cGRhdGUJMCwgMSwgMiwgMywgMAorCWFkZF91cGRhdGUJMSwgMiwgMywgMCwgMQorCWFkZF91cGRhdGUJMCwgMywgMCwgMSwgMgorCWFkZF91cGRhdGUJMSwgMCwgMSwgMiwgMworCWFkZF91cGRhdGUJMCwgMSwgMiwgMywgMAorCWFkZF91cGRhdGUJMSwgMiwgMywgMCwgMQorCWFkZF91cGRhdGUJMCwgMywgMCwgMSwgMgorCisJYWRkX29ubHkJMSwgMQorCWFkZF9vbmx5CTAsIDIKKwlhZGRfb25seQkxLCAzCisJYWRkX29ubHkJMAorCisJLyogdXBkYXRlIHN0YXRlICovCisJdmFkZC51MzIJZGdhLCBkZ2EsIGRnMAorCXZhZGQudTMyCWRnYiwgZGdiLCBkZzEKKwlibmUJCTBiCisKKwkvKiBzdG9yZSBuZXcgc3RhdGUgKi8KKwl2c3QxLjMyCQl7ZGdhLWRnYn0sIFtyMF0KKwlieAkJbHIKK0VORFBST0Moc2hhMl9jZV90cmFuc2Zvcm0pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcnlwdG8vc2hhMi1jZS1nbHVlLmMgYi9hcmNoL2FybS9jcnlwdG8vc2hhMi1jZS1nbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1NWIyZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NyeXB0by9zaGEyLWNlLWdsdWUuYwpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIHNoYTItY2UtZ2x1ZS5jIC0gU0hBLTIyNC9TSEEtMjU2IHVzaW5nIEFSTXY4IENyeXB0byBFeHRlbnNpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IExpbmFybyBMdGQgPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYTI1Nl9iYXNlLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vaHdjYXAuaD4KKyNpbmNsdWRlIDxhc20vc2ltZC5oPgorI2luY2x1ZGUgPGFzbS9uZW9uLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSAic2hhMjU2X2dsdWUuaCIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJTSEEtMjI0L1NIQS0yNTYgc2VjdXJlIGhhc2ggdXNpbmcgQVJNdjggQ3J5cHRvIEV4dGVuc2lvbnMiKTsKK01PRFVMRV9BVVRIT1IoIkFyZCBCaWVzaGV1dmVsIDxhcmQuYmllc2hldXZlbEBsaW5hcm8ub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCithc21saW5rYWdlIHZvaWQgc2hhMl9jZV90cmFuc2Zvcm0oc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc3N0LCB1OCBjb25zdCAqc3JjLAorCQkJCSAgaW50IGJsb2Nrcyk7CisKK3N0YXRpYyBpbnQgc2hhMl9jZV91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJICB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCWlmICghbWF5X3VzZV9zaW1kKCkgfHwKKwkgICAgKHNjdHgtPmNvdW50ICUgU0hBMjU2X0JMT0NLX1NJWkUpICsgbGVuIDwgU0hBMjU2X0JMT0NLX1NJWkUpCisJCXJldHVybiBjcnlwdG9fc2hhMjU2X2FybV91cGRhdGUoZGVzYywgZGF0YSwgbGVuKTsKKworCWtlcm5lbF9uZW9uX2JlZ2luKCk7CisJc2hhMjU2X2Jhc2VfZG9fdXBkYXRlKGRlc2MsIGRhdGEsIGxlbiwKKwkJCSAgICAgIChzaGEyNTZfYmxvY2tfZm4gKilzaGEyX2NlX3RyYW5zZm9ybSk7CisJa2VybmVsX25lb25fZW5kKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaGEyX2NlX2ZpbnVwKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSB1bnNpZ25lZCBpbnQgbGVuLCB1OCAqb3V0KQoreworCWlmICghbWF5X3VzZV9zaW1kKCkpCisJCXJldHVybiBjcnlwdG9fc2hhMjU2X2FybV9maW51cChkZXNjLCBkYXRhLCBsZW4sIG91dCk7CisKKwlrZXJuZWxfbmVvbl9iZWdpbigpOworCWlmIChsZW4pCisJCXNoYTI1Nl9iYXNlX2RvX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sCisJCQkJICAgICAgKHNoYTI1Nl9ibG9ja19mbiAqKXNoYTJfY2VfdHJhbnNmb3JtKTsKKwlzaGEyNTZfYmFzZV9kb19maW5hbGl6ZShkZXNjLCAoc2hhMjU2X2Jsb2NrX2ZuICopc2hhMl9jZV90cmFuc2Zvcm0pOworCWtlcm5lbF9uZW9uX2VuZCgpOworCisJcmV0dXJuIHNoYTI1Nl9iYXNlX2ZpbmlzaChkZXNjLCBvdXQpOworfQorCitzdGF0aWMgaW50IHNoYTJfY2VfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCit7CisJcmV0dXJuIHNoYTJfY2VfZmludXAoZGVzYywgTlVMTCwgMCwgb3V0KTsKK30KKworc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgYWxnc1tdID0geyB7CisJLmluaXQJCQk9IHNoYTIyNF9iYXNlX2luaXQsCisJLnVwZGF0ZQkJCT0gc2hhMl9jZV91cGRhdGUsCisJLmZpbmFsCQkJPSBzaGEyX2NlX2ZpbmFsLAorCS5maW51cAkJCT0gc2hhMl9jZV9maW51cCwKKwkuZGVzY3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBzaGEyNTZfc3RhdGUpLAorCS5kaWdlc3RzaXplCQk9IFNIQTIyNF9ESUdFU1RfU0laRSwKKwkuYmFzZQkJCT0geworCQkuY3JhX25hbWUJCT0gInNoYTIyNCIsCisJCS5jcmFfZHJpdmVyX25hbWUJPSAic2hhMjI0LWNlIiwKKwkJLmNyYV9wcmlvcml0eQkJPSAzMDAsCisJCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX1NIQVNILAorCQkuY3JhX2Jsb2Nrc2l6ZQkJPSBTSEEyNTZfQkxPQ0tfU0laRSwKKwkJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCisJfQorfSwgeworCS5pbml0CQkJPSBzaGEyNTZfYmFzZV9pbml0LAorCS51cGRhdGUJCQk9IHNoYTJfY2VfdXBkYXRlLAorCS5maW5hbAkJCT0gc2hhMl9jZV9maW5hbCwKKwkuZmludXAJCQk9IHNoYTJfY2VfZmludXAsCisJLmRlc2NzaXplCQk9IHNpemVvZihzdHJ1Y3Qgc2hhMjU2X3N0YXRlKSwKKwkuZGlnZXN0c2l6ZQkJPSBTSEEyNTZfRElHRVNUX1NJWkUsCisJLmJhc2UJCQk9IHsKKwkJLmNyYV9uYW1lCQk9ICJzaGEyNTYiLAorCQkuY3JhX2RyaXZlcl9uYW1lCT0gInNoYTI1Ni1jZSIsCisJCS5jcmFfcHJpb3JpdHkJCT0gMzAwLAorCQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9TSEFTSCwKKwkJLmNyYV9ibG9ja3NpemUJCT0gU0hBMjU2X0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCQk9IFRISVNfTU9EVUxFLAorCX0KK30gfTsKKworc3RhdGljIGludCBfX2luaXQgc2hhMl9jZV9tb2RfaW5pdCh2b2lkKQoreworCWlmICghKGVsZl9od2NhcDIgJiBIV0NBUDJfU0hBMikpCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfc2hhc2hlcyhhbGdzLCBBUlJBWV9TSVpFKGFsZ3MpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNoYTJfY2VfbW9kX2Zpbmkodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9zaGFzaGVzKGFsZ3MsIEFSUkFZX1NJWkUoYWxncykpOworfQorCittb2R1bGVfaW5pdChzaGEyX2NlX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHNoYTJfY2VfbW9kX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY3J5cHRvL3NoYTI1Ni1hcm12NC5wbCBiL2FyY2gvYXJtL2NyeXB0by9zaGEyNTYtYXJtdjQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFjMDUzMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NyeXB0by9zaGEyNTYtYXJtdjQucGwKQEAgLTAsMCArMSw3MTYgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKKyMgcHJvamVjdC4gVGhlIG1vZHVsZSBpcywgaG93ZXZlciwgZHVhbCBsaWNlbnNlZCB1bmRlciBPcGVuU1NMIGFuZAorIyBDUllQVE9HQU1TIGxpY2Vuc2VzIGRlcGVuZGluZyBvbiB3aGVyZSB5b3Ugb2J0YWluIGl0LiBGb3IgZnVydGhlcgorIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KKyMKKyMgUGVybWlzc2lvbiB0byB1c2UgdW5kZXIgR1BMIHRlcm1zIGlzIGdyYW50ZWQuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgU0hBMjU2IGJsb2NrIHByb2NlZHVyZSBmb3IgQVJNdjQuIE1heSAyMDA3LgorCisjIFBlcmZvcm1hbmNlIGlzIH4yeCBiZXR0ZXIgdGhhbiBnY2MgMy40IGdlbmVyYXRlZCBjb2RlIGFuZCBpbiAiYWJzby0KKyMgbHV0ZSIgdGVybXMgaXMgfjIyNTAgY3ljbGVzIHBlciA2NC1ieXRlIGJsb2NrIG9yIH4zNSBjeWNsZXMgcGVyCisjIGJ5dGUgW29uIHNpbmdsZS1pc3N1ZSBYc2NhbGUgUFhBMjUwIGNvcmVdLgorCisjIEp1bHkgMjAxMC4KKyMKKyMgUmVzY2hlZHVsaW5nIGZvciBkdWFsLWlzc3VlIHBpcGVsaW5lIHJlc3VsdGVkIGluIDIyJSBpbXByb3ZlbWVudCBvbgorIyBDb3J0ZXggQTggY29yZSBhbmQgfjIwIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUuCisKKyMgRmVicnVhcnkgMjAxMS4KKyMKKyMgUHJvZmlsZXItYXNzaXN0ZWQgYW5kIHBsYXRmb3JtLXNwZWNpZmljIG9wdGltaXphdGlvbiByZXN1bHRlZCBpbiAxNiUKKyMgaW1wcm92ZW1lbnQgb24gQ29ydGV4IEE4IGNvcmUgYW5kIH4xNS40IGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGUuCisKKyMgU2VwdGVtYmVyIDIwMTMuCisjCisjIEFkZCBORU9OIGltcGxlbWVudGF0aW9uLiBPbiBDb3J0ZXggQTggaXQgd2FzIG1lYXN1cmVkIHRvIHByb2Nlc3Mgb25lCisjIGJ5dGUgaW4gMTIuNSBjeWNsZXMgb3IgMjMlIGZhc3RlciB0aGFuIGludGVnZXItb25seSBjb2RlLiBTbmFwZHJhZ29uCisjIFM0IGRvZXMgaXQgaW4gMTIuNSBjeWNsZXMgdG9vLCBidXQgaXQncyA1MCUgZmFzdGVyIHRoYW4gaW50ZWdlci1vbmx5CisjIGNvZGUgKG1lYW5pbmcgdGhhdCBsYXR0ZXIgcGVyZm9ybXMgc3ViLW9wdGltYWxseSwgbm90aGluZyB3YXMgZG9uZQorIyBhYm91dCBpdCkuCisKKyMgTWF5IDIwMTQuCisjCisjIEFkZCBBUk12OCBjb2RlIHBhdGggcGVyZm9ybWluZyBhdCAyLjAgY3BiIG9uIEFwcGxlIEE3LgorCit3aGlsZSAoKCRvdXRwdXQ9c2hpZnQpICYmICgkb3V0cHV0IX4vXlx3W1x3XC1dKlwuXHcrJC8pKSB7fQorb3BlbiBTVERPVVQsIj4kb3V0cHV0IjsKKworJGN0eD0icjAiOwkkdDA9InIwIjsKKyRpbnA9InIxIjsJJHQ0PSJyMSI7CiskbGVuPSJyMiI7CSR0MT0icjIiOworJFQxPSJyMyI7CSR0Mz0icjMiOworJEE9InI0IjsKKyRCPSJyNSI7CiskQz0icjYiOworJEQ9InI3IjsKKyRFPSJyOCI7CiskRj0icjkiOworJEc9InIxMCI7CiskSD0icjExIjsKK0BWPSgkQSwkQiwkQywkRCwkRSwkRiwkRywkSCk7CiskdDI9InIxMiI7CiskS3RibD0icjE0IjsKKworQFNpZ21hMD0oIDIsMTMsMjIpOworQFNpZ21hMT0oIDYsMTEsMjUpOworQHNpZ21hMD0oIDcsMTgsIDMpOworQHNpZ21hMT0oMTcsMTksMTApOworCitzdWIgQk9EWV8wMF8xNSB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUsJGYsJGcsJGgpID0gQF87CisKKyRjb2RlLj08PF9fXyBpZiAoJGk8MTYpOworI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCSR0MSxbJGlucF0sIzQJCQlAICRpCisjIGlmICRpPT0xNQorCXN0cgkkaW5wLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgJHQ0CisjIGVuZGlmCisJZW9yCSR0MCwkZSwkZSxyb3IjYCRTaWdtYTFbMV0tJFNpZ21hMVswXWAKKwlhZGQJJGEsJGEsJHQyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJJHQwLCR0MCwkZSxyb3IjYCRTaWdtYTFbMl0tJFNpZ21hMVswXWAJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldgkkdDEsJHQxCisjIGVuZGlmCisjZWxzZQorCUAgbGRyYgkkdDEsWyRpbnAsIzNdCQkJQCAkaQorCWFkZAkkYSwkYSwkdDIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJJHQyLFskaW5wLCMyXQorCWxkcmIJJHQwLFskaW5wLCMxXQorCW9ycgkkdDEsJHQxLCR0Mixsc2wjOAorCWxkcmIJJHQyLFskaW5wXSwjNAorCW9ycgkkdDEsJHQxLCR0MCxsc2wjMTYKKyMgaWYgJGk9PTE1CisJc3RyCSRpbnAsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciAkdDQKKyMgZW5kaWYKKwllb3IJJHQwLCRlLCRlLHJvciNgJFNpZ21hMVsxXS0kU2lnbWExWzBdYAorCW9ycgkkdDEsJHQxLCR0Mixsc2wjMjQKKwllb3IJJHQwLCR0MCwkZSxyb3IjYCRTaWdtYTFbMl0tJFNpZ21hMVswXWAJQCBTaWdtYTEoZSkKKyNlbmRpZgorX19fCiskY29kZS49PDxfX187CisJbGRyCSR0MixbJEt0YmxdLCM0CQkJQCAqSzI1NisrCisJYWRkCSRoLCRoLCR0MQkJCUAgaCs9WFtpXQorCXN0cgkkdDEsW3NwLCNgJGklMTZgKjRdCisJZW9yCSR0MSwkZiwkZworCWFkZAkkaCwkaCwkdDAscm9yIyRTaWdtYTFbMF0JQCBoKz1TaWdtYTEoZSkKKwlhbmQJJHQxLCR0MSwkZQorCWFkZAkkaCwkaCwkdDIJCQlAIGgrPUsyNTZbaV0KKwllb3IJJHQxLCR0MSwkZwkJCUAgQ2goZSxmLGcpCisJZW9yCSR0MCwkYSwkYSxyb3IjYCRTaWdtYTBbMV0tJFNpZ21hMFswXWAKKwlhZGQJJGgsJGgsJHQxCQkJQCBoKz1DaChlLGYsZykKKyNpZiAkaT09MzEKKwlhbmQJJHQyLCR0MiwjMHhmZgorCWNtcAkkdDIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAkaTwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJJHQxLFskaW5wXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJJHQxLFskaW5wLCMzXQorIyBlbmRpZgorCWVvcgkkdDIsJGEsJGIJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCSR0MSxbc3AsI2AoJGkrMiklMTZgKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJJHQyLCRhLCRiCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCSR0NCxbc3AsI2AoJGkrMTUpJTE2YCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcgkkdDAsJHQwLCRhLHJvciNgJFNpZ21hMFsyXS0kU2lnbWEwWzBdYAlAIFNpZ21hMChhKQorCWFuZAkkdDMsJHQzLCR0MgkJCUAgKGJeYykmPShhXmIpCisJYWRkCSRkLCRkLCRoCQkJQCBkKz1oCisJZW9yCSR0MywkdDMsJGIJCQlAIE1haihhLGIsYykKKwlhZGQJJGgsJGgsJHQwLHJvciMkU2lnbWEwWzBdCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJJGgsJGgsJHQzCQkJQCBoKz1NYWooYSxiLGMpCitfX18KKwkoJHQyLCR0Myk9KCR0MywkdDIpOworfQorCitzdWIgQk9EWV8xNl9YWCB7CitteSAoJGksJGEsJGIsJGMsJGQsJGUsJGYsJGcsJGgpID0gQF87CisKKyRjb2RlLj08PF9fXzsKKwlAIGxkcgkkdDEsW3NwLCNgKCRpKzEpJTE2YCo0XQkJQCAkaQorCUAgbGRyCSR0NCxbc3AsI2AoJGkrMTQpJTE2YCo0XQorCW1vdgkkdDAsJHQxLHJvciMkc2lnbWEwWzBdCisJYWRkCSRhLCRhLCR0MgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CSR0MiwkdDQscm9yIyRzaWdtYTFbMF0KKwllb3IJJHQwLCR0MCwkdDEscm9yIyRzaWdtYTBbMV0KKwllb3IJJHQyLCR0MiwkdDQscm9yIyRzaWdtYTFbMV0KKwllb3IJJHQwLCR0MCwkdDEsbHNyIyRzaWdtYTBbMl0JQCBzaWdtYTAoWFtpKzFdKQorCWxkcgkkdDEsW3NwLCNgKCRpKzApJTE2YCo0XQorCWVvcgkkdDIsJHQyLCR0NCxsc3IjJHNpZ21hMVsyXQlAIHNpZ21hMShYW2krMTRdKQorCWxkcgkkdDQsW3NwLCNgKCRpKzkpJTE2YCo0XQorCisJYWRkCSR0MiwkdDIsJHQwCisJZW9yCSR0MCwkZSwkZSxyb3IjYCRTaWdtYTFbMV0tJFNpZ21hMVswXWAJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJJHQxLCR0MSwkdDIKKwllb3IJJHQwLCR0MCwkZSxyb3IjYCRTaWdtYTFbMl0tJFNpZ21hMVswXWAJQCBTaWdtYTEoZSkKKwlhZGQJJHQxLCR0MSwkdDQJCQlAIFhbaV0KK19fXworCSZCT0RZXzAwXzE1KEBfKTsKK30KKworJGNvZGU9PDxfX187CisjaWZuZGVmIF9fS0VSTkVMX18KKyMgaW5jbHVkZSAiYXJtX2FyY2guaCIKKyNlbHNlCisjIGRlZmluZSBfX0FSTV9BUkNIX18gX19MSU5VWF9BUk1fQVJDSF9fCisjIGRlZmluZSBfX0FSTV9NQVhfQVJDSF9fIDcKKyNlbmRpZgorCisudGV4dAorI2lmIF9fQVJNX0FSQ0hfXzw3CisuY29kZQkzMgorI2Vsc2UKKy5zeW50YXggdW5pZmllZAorIyBpZmRlZiBfX3RodW1iMl9fCisjICBkZWZpbmUgYWRybCBhZHIKKy50aHVtYgorIyBlbHNlCisuY29kZSAgIDMyCisjIGVuZGlmCisjZW5kaWYKKworLnR5cGUJSzI1Niwlb2JqZWN0CisuYWxpZ24JNQorSzI1NjoKKy53b3JkCTB4NDI4YTJmOTgsMHg3MTM3NDQ5MSwweGI1YzBmYmNmLDB4ZTliNWRiYTUKKy53b3JkCTB4Mzk1NmMyNWIsMHg1OWYxMTFmMSwweDkyM2Y4MmE0LDB4YWIxYzVlZDUKKy53b3JkCTB4ZDgwN2FhOTgsMHgxMjgzNWIwMSwweDI0MzE4NWJlLDB4NTUwYzdkYzMKKy53b3JkCTB4NzJiZTVkNzQsMHg4MGRlYjFmZSwweDliZGMwNmE3LDB4YzE5YmYxNzQKKy53b3JkCTB4ZTQ5YjY5YzEsMHhlZmJlNDc4NiwweDBmYzE5ZGM2LDB4MjQwY2ExY2MKKy53b3JkCTB4MmRlOTJjNmYsMHg0YTc0ODRhYSwweDVjYjBhOWRjLDB4NzZmOTg4ZGEKKy53b3JkCTB4OTgzZTUxNTIsMHhhODMxYzY2ZCwweGIwMDMyN2M4LDB4YmY1OTdmYzcKKy53b3JkCTB4YzZlMDBiZjMsMHhkNWE3OTE0NywweDA2Y2E2MzUxLDB4MTQyOTI5NjcKKy53b3JkCTB4MjdiNzBhODUsMHgyZTFiMjEzOCwweDRkMmM2ZGZjLDB4NTMzODBkMTMKKy53b3JkCTB4NjUwYTczNTQsMHg3NjZhMGFiYiwweDgxYzJjOTJlLDB4OTI3MjJjODUKKy53b3JkCTB4YTJiZmU4YTEsMHhhODFhNjY0YiwweGMyNGI4YjcwLDB4Yzc2YzUxYTMKKy53b3JkCTB4ZDE5MmU4MTksMHhkNjk5MDYyNCwweGY0MGUzNTg1LDB4MTA2YWEwNzAKKy53b3JkCTB4MTlhNGMxMTYsMHgxZTM3NmMwOCwweDI3NDg3NzRjLDB4MzRiMGJjYjUKKy53b3JkCTB4MzkxYzBjYjMsMHg0ZWQ4YWE0YSwweDViOWNjYTRmLDB4NjgyZTZmZjMKKy53b3JkCTB4NzQ4ZjgyZWUsMHg3OGE1NjM2ZiwweDg0Yzg3ODE0LDB4OGNjNzAyMDgKKy53b3JkCTB4OTBiZWZmZmEsMHhhNDUwNmNlYiwweGJlZjlhM2Y3LDB4YzY3MTc4ZjIKKy5zaXplCUsyNTYsLi1LMjU2Cisud29yZAkwCQkJCUAgdGVybWluYXRvcgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKy5MT1BFTlNTTF9hcm1jYXA6Cisud29yZAlPUEVOU1NMX2FybWNhcF9QLXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisjZW5kaWYKKy5hbGlnbgk1CisKKy5nbG9iYWwJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKy50eXBlCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyLCVmdW5jdGlvbgorc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXI6CisjaWYgX19BUk1fQVJDSF9fPDcKKwlzdWIJcjMscGMsIzgJCUAgc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKyNlbHNlCisJYWRyCXIzLHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisjZW5kaWYKKyNpZiBfX0FSTV9NQVhfQVJDSF9fPj03ICYmICFkZWZpbmVkKF9fS0VSTkVMX18pCisJbGRyCXIxMiwuTE9QRU5TU0xfYXJtY2FwCisJbGRyCXIxMixbcjMscjEyXQkJQCBPUEVOU1NMX2FybWNhcF9QCisJdHN0CXIxMiwjQVJNVjhfU0hBMjU2CisJYm5lCS5MQVJNdjgKKwl0c3QJcjEyLCNBUk1WN19ORU9OCisJYm5lCS5MTkVPTgorI2VuZGlmCisJYWRkCSRsZW4sJGlucCwkbGVuLGxzbCM2CUAgbGVuIHRvIHBvaW50IGF0IHRoZSBlbmQgb2YgaW5wCisJc3RtZGIJc3AhLHskY3R4LCRpbnAsJGxlbixyNC1yMTEsbHJ9CisJbGRtaWEJJGN0eCx7JEEsJEIsJEMsJEQsJEUsJEYsJEcsJEh9CisJc3ViCSRLdGJsLHIzLCMyNTYrMzIJQCBLMjU2CisJc3ViCXNwLHNwLCMxNio0CQlAIGFsbG9jYShYWzE2XSkKKy5Mb29wOgorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJJHQxLFskaW5wXSwjNAorIyBlbHNlCisJbGRyYgkkdDEsWyRpbnAsIzNdCisjIGVuZGlmCisJZW9yCSR0MywkQiwkQwkJQCBtYWdpYworCWVvcgkkdDIsJHQyLCR0MgorX19fCitmb3IoJGk9MDskaTwxNjskaSsrKQl7ICZCT0RZXzAwXzE1KCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorJGNvZGUuPSIuTHJvdW5kc18xNl94eDpcbiI7Citmb3IgKDskaTwzMjskaSsrKQl7ICZCT0RZXzE2X1hYKCRpLEBWKTsgdW5zaGlmdChAVixwb3AoQFYpKTsgfQorJGNvZGUuPTw8X19fOworI2lmIF9fQVJNX0FSQ0hfXz49NworCWl0ZQllcQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisjZW5kaWYKKwlsZHJlcQkkdDMsW3NwLCMxNio0XQkJQCBwdWxsIGN0eAorCWJuZQkuTHJvdW5kc18xNl94eAorCisJYWRkCSRBLCRBLCR0MgkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHIJJHQwLFskdDMsIzBdCisJbGRyCSR0MSxbJHQzLCM0XQorCWxkcgkkdDIsWyR0MywjOF0KKwlhZGQJJEEsJEEsJHQwCisJbGRyCSR0MCxbJHQzLCMxMl0KKwlhZGQJJEIsJEIsJHQxCisJbGRyCSR0MSxbJHQzLCMxNl0KKwlhZGQJJEMsJEMsJHQyCisJbGRyCSR0MixbJHQzLCMyMF0KKwlhZGQJJEQsJEQsJHQwCisJbGRyCSR0MCxbJHQzLCMyNF0KKwlhZGQJJEUsJEUsJHQxCisJbGRyCSR0MSxbJHQzLCMyOF0KKwlhZGQJJEYsJEYsJHQyCisJbGRyCSRpbnAsW3NwLCMxNyo0XQkJQCBwdWxsIGlucAorCWxkcgkkdDIsW3NwLCMxOCo0XQkJQCBwdWxsIGlucCtsZW4KKwlhZGQJJEcsJEcsJHQwCisJYWRkCSRILCRILCR0MQorCXN0bWlhCSR0Myx7JEEsJEIsJEMsJEQsJEUsJEYsJEcsJEh9CisJY21wCSRpbnAsJHQyCisJc3ViCSRLdGJsLCRLdGJsLCMyNTYJQCByZXdpbmQgS3RibAorCWJuZQkuTG9vcAorCisJYWRkCXNwLHNwLCNgMTYrM2AqNAlAIGRlc3Ryb3kgZnJhbWUKKyNpZiBfX0FSTV9BUkNIX18+PTUKKwlsZG1pYQlzcCEse3I0LXIxMSxwY30KKyNlbHNlCisJbGRtaWEJc3AhLHtyNC1yMTEsbHJ9CisJdHN0CWxyLCMxCisJbW92ZXEJcGMsbHIJCQlAIGJlIGJpbmFyeSBjb21wYXRpYmxlIHdpdGggVjQsIHlldAorCWJ4CWxyCQkJQCBpbnRlcm9wZXJhYmxlIHdpdGggVGh1bWIgSVNBOi0pCisjZW5kaWYKKy5zaXplCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyLC4tc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKK19fXworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBORU9OIHN0dWZmCisjCit7e3sKK215IEBYPW1hcCgicSRfIiwoMC4uMykpOworbXkgKCRUMCwkVDEsJFQyLCRUMywkVDQsJFQ1KT0oInE4IiwicTkiLCJxMTAiLCJxMTEiLCJkMjQiLCJkMjUiKTsKK215ICRYZmVyPSR0NDsKK215ICRqPTA7CisKK3N1YiBEbG8oKSAgIHsgc2hpZnQ9fm18cShbMV0/WzAtOV0pfD8iZCIuKCQxKjIpOiIiOyAgICAgfQorc3ViIERoaSgpICAgeyBzaGlmdD1+bXxxKFsxXT9bMC05XSl8PyJkIi4oJDEqMisxKToiIjsgICB9CisKK3N1YiBBVVRPTE9BRCgpICAgICAgICAgICMgdGh1bmsgW3NpbXBsaWZpZWRdIHg4Ni1zdHlsZSBwZXJsYXNtCit7IG15ICRvcGNvZGUgPSAkQVVUT0xPQUQ7ICRvcGNvZGUgPX4gcy8uKjo6Ly87ICRvcGNvZGUgPX4gcy9fL1wuLzsKKyAgbXkgJGFyZyA9IHBvcDsKKyAgICAkYXJnID0gIiMkYXJnIiBpZiAoJGFyZyoxIGVxICRhcmcpOworICAgICRjb2RlIC49ICJcdCRvcGNvZGVcdCIuam9pbignLCcsQF8sJGFyZykuIlxuIjsKK30KKworc3ViIFh1cGRhdGUoKQoreyB1c2UgaW50ZWdlcjsKKyAgbXkgJGJvZHkgPSBzaGlmdDsKKyAgbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CisgIG15ICgkYSwkYiwkYywkZCwkZSwkZiwkZywkaCk7CisKKwkmdmV4dF84CQkoJFQwLEBYWzBdLEBYWzFdLDQpOwkjIFhbMS4uNF0KKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdmV4dF84CQkoJFQxLEBYWzJdLEBYWzNdLDQpOwkjIFhbOS4uMTJdCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZzaHJfdTMyCSgkVDIsJFQwLCRzaWdtYTBbMF0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2YWRkX2kzMgkoQFhbMF0sQFhbMF0sJFQxKTsJIyBYWzAuLjNdICs9IFhbOS4uMTJdCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZzaHJfdTMyCSgkVDEsJFQwLCRzaWdtYTBbMl0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2c2xpXzMyCSgkVDIsJFQwLDMyLSRzaWdtYTBbMF0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2c2hyX3UzMgkoJFQzLCRUMCwkc2lnbWEwWzFdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdmVvcgkJKCRUMSwkVDEsJFQyKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdnNsaV8zMgkoJFQzLCRUMCwzMi0kc2lnbWEwWzFdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2c2hyX3UzMgkoJFQ0LCZEaGkoQFhbM10pLCRzaWdtYTFbMF0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2ZW9yCQkoJFQxLCRUMSwkVDMpOwkJIyBzaWdtYTAoWFsxLi40XSkKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2c2xpXzMyCSgkVDQsJkRoaShAWFszXSksMzItJHNpZ21hMVswXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmdnNocl91MzIJKCRUNSwmRGhpKEBYWzNdKSwkc2lnbWExWzJdKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdmFkZF9pMzIJKEBYWzBdLEBYWzBdLCRUMSk7CSMgWFswLi4zXSArPSBzaWdtYTAoWFsxLi40XSkKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2ZW9yCQkoJFQ1LCRUNSwkVDQpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnZzaHJfdTMyCSgkVDQsJkRoaShAWFszXSksJHNpZ21hMVsxXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmdnNsaV8zMgkoJFQ0LCZEaGkoQFhbM10pLDMyLSRzaWdtYTFbMV0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnZlb3IJCSgkVDUsJFQ1LCRUNCk7CQkjIHNpZ21hMShYWzE0Li4xNV0pCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZhZGRfaTMyCSgmRGxvKEBYWzBdKSwmRGxvKEBYWzBdKSwkVDUpOyMgWFswLi4xXSArPSBzaWdtYTEoWFsxNC4uMTVdKQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnZzaHJfdTMyCSgkVDQsJkRsbyhAWFswXSksJHNpZ21hMVswXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmdnNsaV8zMgkoJFQ0LCZEbG8oQFhbMF0pLDMyLSRzaWdtYTFbMF0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnZzaHJfdTMyCSgkVDUsJkRsbyhAWFswXSksJHNpZ21hMVsyXSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmdmVvcgkJKCRUNSwkVDUsJFQ0KTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgICZ2c2hyX3UzMgkoJFQ0LCZEbG8oQFhbMF0pLCRzaWdtYTFbMV0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2bGQxXzMyCSgieyRUMH0iLCJbJEt0YmwsOjEyOF0hIik7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJICAmdnNsaV8zMgkoJFQ0LCZEbG8oQFhbMF0pLDMyLSRzaWdtYTFbMV0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSAgJnZlb3IJCSgkVDUsJFQ1LCRUNCk7CQkjIHNpZ21hMShYWzE2Li4xN10pCisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJJnZhZGRfaTMyCSgmRGhpKEBYWzBdKSwmRGhpKEBYWzBdKSwkVDUpOyMgWFsyLi4zXSArPSBzaWdtYTEoWFsxNi4uMTddKQorCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2YWRkX2kzMgkoJFQwLCRUMCxAWFswXSk7CisJIHdoaWxlKCQjaW5zbnM+PTIpIHsgZXZhbChzaGlmdChAaW5zbnMpKTsgfQorCSZ2c3QxXzMyCSgieyRUMH0iLCJbJFhmZXIsOjEyOF0hIik7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisJIGV2YWwoc2hpZnQoQGluc25zKSk7CisKKwlwdXNoKEBYLHNoaWZ0KEBYKSk7CQkjICJyb3RhdGUiIFhbXQorfQorCitzdWIgWHByZWxvYWQoKQoreyB1c2UgaW50ZWdlcjsKKyAgbXkgJGJvZHkgPSBzaGlmdDsKKyAgbXkgQGluc25zID0gKCYkYm9keSwmJGJvZHksJiRib2R5LCYkYm9keSk7CisgIG15ICgkYSwkYiwkYywkZCwkZSwkZiwkZywkaCk7CisKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkgZXZhbChzaGlmdChAaW5zbnMpKTsKKwkmdmxkMV8zMgkoInskVDB9IiwiWyRLdGJsLDoxMjhdISIpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2cmV2MzJfOAkoQFhbMF0sQFhbMF0pOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSBldmFsKHNoaWZ0KEBpbnNucykpOworCSZ2YWRkX2kzMgkoJFQwLCRUMCxAWFswXSk7CisJIGZvcmVhY2ggKEBpbnNucykgeyBldmFsOyB9CSMgcmVtYWluaW5nIGluc3RydWN0aW9ucworCSZ2c3QxXzMyCSgieyRUMH0iLCJbJFhmZXIsOjEyOF0hIik7CisKKwlwdXNoKEBYLHNoaWZ0KEBYKSk7CQkjICJyb3RhdGUiIFhbXQorfQorCitzdWIgYm9keV8wMF8xNSAoKSB7CisJKAorCScoJGEsJGIsJGMsJGQsJGUsJGYsJGcsJGgpPUBWOycuCisJJyZhZGQJKCRoLCRoLCR0MSknLAkJCSMgaCs9WFtpXStLW2ldCisJJyZlb3IJKCR0MSwkZiwkZyknLAorCScmZW9yCSgkdDAsJGUsJGUsInJvciMiLigkU2lnbWExWzFdLSRTaWdtYTFbMF0pKScsCisJJyZhZGQJKCRhLCRhLCR0MiknLAkJCSMgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJJyZhbmQJKCR0MSwkdDEsJGUpJywKKwknJmVvcgkoJHQyLCR0MCwkZSwicm9yIyIuKCRTaWdtYTFbMl0tJFNpZ21hMVswXSkpJywJIyBTaWdtYTEoZSkKKwknJmVvcgkoJHQwLCRhLCRhLCJyb3IjIi4oJFNpZ21hMFsxXS0kU2lnbWEwWzBdKSknLAorCScmZW9yCSgkdDEsJHQxLCRnKScsCQkJIyBDaChlLGYsZykKKwknJmFkZAkoJGgsJGgsJHQyLCJyb3IjJFNpZ21hMVswXSIpJywJIyBoKz1TaWdtYTEoZSkKKwknJmVvcgkoJHQyLCRhLCRiKScsCQkJIyBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJJyZlb3IJKCR0MCwkdDAsJGEsInJvciMiLigkU2lnbWEwWzJdLSRTaWdtYTBbMF0pKScsCSMgU2lnbWEwKGEpCisJJyZhZGQJKCRoLCRoLCR0MSknLAkJCSMgaCs9Q2goZSxmLGcpCisJJyZsZHIJKCR0MSxzcHJpbnRmICJbc3AsIyVkXSIsNCooKCRqKzEpJjE1KSkJaWYgKCgkaiYxNSkhPTE1KTsnLgorCScmbGRyCSgkdDEsIlskS3RibF0iKQkJCQlpZiAoJGo9PTE1KTsnLgorCScmbGRyCSgkdDEsIltzcCwjNjRdIikJCQlpZiAoJGo9PTMxKScsCisJJyZhbmQJKCR0MywkdDMsJHQyKScsCQkJIyAoYl5jKSY9KGFeYikKKwknJmFkZAkoJGQsJGQsJGgpJywJCQkjIGQrPWgKKwknJmFkZAkoJGgsJGgsJHQwLCJyb3IjJFNpZ21hMFswXSIpOycuCSMgaCs9U2lnbWEwKGEpCisJJyZlb3IJKCR0MywkdDMsJGIpJywJCQkjIE1haihhLGIsYykKKwknJGorKzsJdW5zaGlmdChAVixwb3AoQFYpKTsgKCR0MiwkdDMpPSgkdDMsJHQyKTsnCisJKQorfQorCiskY29kZS49PDxfX187CisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworLmFyY2gJYXJtdjctYQorLmZwdQluZW9uCisKKy5nbG9iYWwJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfbmVvbgorLnR5cGUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfbmVvbiwlZnVuY3Rpb24KKy5hbGlnbgk0CitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9uZW9uOgorLkxORU9OOgorCXN0bWRiCXNwISx7cjQtcjEyLGxyfQorCisJc3ViCSRILHNwLCMxNio0KzE2CisJYWRybAkkS3RibCxLMjU2CisJYmljCSRILCRILCMxNQkJQCBhbGlnbiBmb3IgMTI4LWJpdCBzdG9yZXMKKwltb3YJJHQyLHNwCisJbW92CXNwLCRICQkJQCBhbGxvY2EKKwlhZGQJJGxlbiwkaW5wLCRsZW4sbHNsIzYJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKworCXZsZDEuOAkJe0BYWzBdfSxbJGlucF0hCisJdmxkMS44CQl7QFhbMV19LFskaW5wXSEKKwl2bGQxLjgJCXtAWFsyXX0sWyRpbnBdIQorCXZsZDEuOAkJe0BYWzNdfSxbJGlucF0hCisJdmxkMS4zMgkJeyRUMH0sWyRLdGJsLDoxMjhdIQorCXZsZDEuMzIJCXskVDF9LFskS3RibCw6MTI4XSEKKwl2bGQxLjMyCQl7JFQyfSxbJEt0YmwsOjEyOF0hCisJdmxkMS4zMgkJeyRUM30sWyRLdGJsLDoxMjhdIQorCXZyZXYzMi44CUBYWzBdLEBYWzBdCQlAIHllcywgZXZlbiBvbgorCXN0cgkJJGN0eCxbc3AsIzY0XQorCXZyZXYzMi44CUBYWzFdLEBYWzFdCQlAIGJpZy1lbmRpYW4KKwlzdHIJCSRpbnAsW3NwLCM2OF0KKwltb3YJCSRYZmVyLHNwCisJdnJldjMyLjgJQFhbMl0sQFhbMl0KKwlzdHIJCSRsZW4sW3NwLCM3Ml0KKwl2cmV2MzIuOAlAWFszXSxAWFszXQorCXN0cgkJJHQyLFtzcCwjNzZdCQlAIHNhdmUgb3JpZ2luYWwgc3AKKwl2YWRkLmkzMgkkVDAsJFQwLEBYWzBdCisJdmFkZC5pMzIJJFQxLCRUMSxAWFsxXQorCXZzdDEuMzIJCXskVDB9LFskWGZlciw6MTI4XSEKKwl2YWRkLmkzMgkkVDIsJFQyLEBYWzJdCisJdnN0MS4zMgkJeyRUMX0sWyRYZmVyLDoxMjhdIQorCXZhZGQuaTMyCSRUMywkVDMsQFhbM10KKwl2c3QxLjMyCQl7JFQyfSxbJFhmZXIsOjEyOF0hCisJdnN0MS4zMgkJeyRUM30sWyRYZmVyLDoxMjhdIQorCisJbGRtaWEJCSRjdHgseyRBLSRIfQorCXN1YgkJJFhmZXIsJFhmZXIsIzY0CisJbGRyCQkkdDEsW3NwLCMwXQorCWVvcgkJJHQyLCR0MiwkdDIKKwllb3IJCSR0MywkQiwkQworCWIJCS5MXzAwXzQ4CisKKy5hbGlnbgk0CisuTF8wMF80ODoKK19fXworCSZYdXBkYXRlKFwmYm9keV8wMF8xNSk7CisJJlh1cGRhdGUoXCZib2R5XzAwXzE1KTsKKwkmWHVwZGF0ZShcJmJvZHlfMDBfMTUpOworCSZYdXBkYXRlKFwmYm9keV8wMF8xNSk7CiskY29kZS49PDxfX187CisJdGVxCSR0MSwjMAkJCQlAIGNoZWNrIGZvciBLMjU2IHRlcm1pbmF0b3IKKwlsZHIJJHQxLFtzcCwjMF0KKwlzdWIJJFhmZXIsJFhmZXIsIzY0CisJYm5lCS5MXzAwXzQ4CisKKwlsZHIJCSRpbnAsW3NwLCM2OF0KKwlsZHIJCSR0MCxbc3AsIzcyXQorCXN1YgkJJEt0YmwsJEt0YmwsIzI1NglAIHJld2luZCAkS3RibAorCXRlcQkJJGlucCwkdDAKKwlpdAkJZXEKKwlzdWJlcQkJJGlucCwkaW5wLCM2NAkJQCBhdm9pZCBTRUdWCisJdmxkMS44CQl7QFhbMF19LFskaW5wXSEJCUAgbG9hZCBuZXh0IGlucHV0IGJsb2NrCisJdmxkMS44CQl7QFhbMV19LFskaW5wXSEKKwl2bGQxLjgJCXtAWFsyXX0sWyRpbnBdIQorCXZsZDEuOAkJe0BYWzNdfSxbJGlucF0hCisJaXQJCW5lCisJc3RybmUJCSRpbnAsW3NwLCM2OF0KKwltb3YJCSRYZmVyLHNwCitfX18KKwkmWHByZWxvYWQoXCZib2R5XzAwXzE1KTsKKwkmWHByZWxvYWQoXCZib2R5XzAwXzE1KTsKKwkmWHByZWxvYWQoXCZib2R5XzAwXzE1KTsKKwkmWHByZWxvYWQoXCZib2R5XzAwXzE1KTsKKyRjb2RlLj08PF9fXzsKKwlsZHIJJHQwLFskdDEsIzBdCisJYWRkCSRBLCRBLCR0MgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyCSR0MixbJHQxLCM0XQorCWxkcgkkdDMsWyR0MSwjOF0KKwlsZHIJJHQ0LFskdDEsIzEyXQorCWFkZAkkQSwkQSwkdDAJCQlAIGFjY3VtdWxhdGUKKwlsZHIJJHQwLFskdDEsIzE2XQorCWFkZAkkQiwkQiwkdDIKKwlsZHIJJHQyLFskdDEsIzIwXQorCWFkZAkkQywkQywkdDMKKwlsZHIJJHQzLFskdDEsIzI0XQorCWFkZAkkRCwkRCwkdDQKKwlsZHIJJHQ0LFskdDEsIzI4XQorCWFkZAkkRSwkRSwkdDAKKwlzdHIJJEEsWyR0MV0sIzQKKwlhZGQJJEYsJEYsJHQyCisJc3RyCSRCLFskdDFdLCM0CisJYWRkCSRHLCRHLCR0MworCXN0cgkkQyxbJHQxXSwjNAorCWFkZAkkSCwkSCwkdDQKKwlzdHIJJEQsWyR0MV0sIzQKKwlzdG1pYQkkdDEseyRFLSRIfQorCisJaXR0dGUJbmUKKwltb3ZuZQkkWGZlcixzcAorCWxkcm5lCSR0MSxbc3AsIzBdCisJZW9ybmUJJHQyLCR0MiwkdDIKKwlsZHJlcQlzcCxbc3AsIzc2XQkJCUAgcmVzdG9yZSBvcmlnaW5hbCBzcAorCWl0dAluZQorCWVvcm5lCSR0MywkQiwkQworCWJuZQkuTF8wMF80OAorCisJbGRtaWEJc3AhLHtyNC1yMTIscGN9Cisuc2l6ZQlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9uZW9uLC4tc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfbmVvbgorI2VuZGlmCitfX18KK319fQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBUk12OCBzdHVmZgorIwore3t7CitteSAoJEFCQ0QsJEVGR0gsJGFiY2QpPW1hcCgicSRfIiwoMC4uMikpOworbXkgQE1TRz1tYXAoInEkXyIsKDguLjExKSk7CitteSAoJFcwLCRXMSwkQUJDRF9TQVZFLCRFRkdIX1NBVkUpPW1hcCgicSRfIiwoMTIuLjE1KSk7CitteSAkS3RibD0icjMiOworCiskY29kZS49PDxfX187CisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NyAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQorCisjIGlmZGVmIF9fdGh1bWIyX18KKyMgIGRlZmluZSBJTlNUKGEsYixjLGQpCS5ieXRlCWMsZHwweGMsYSxiCisjIGVsc2UKKyMgIGRlZmluZSBJTlNUKGEsYixjLGQpCS5ieXRlCWEsYixjLGQKKyMgZW5kaWYKKworLnR5cGUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfYXJtdjgsJWZ1bmN0aW9uCisuYWxpZ24JNQorc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfYXJtdjg6CisuTEFSTXY4OgorCXZsZDEuMzIJeyRBQkNELCRFRkdIfSxbJGN0eF0KKyMgaWZkZWYgX190aHVtYjJfXworCWFkcgkkS3RibCwuTEFSTXY4CisJc3ViCSRLdGJsLCRLdGJsLCMuTEFSTXY4LUsyNTYKKyMgZWxzZQorCWFkcmwJJEt0YmwsSzI1NgorIyBlbmRpZgorCWFkZAkkbGVuLCRpbnAsJGxlbixsc2wjNglAIGxlbiB0byBwb2ludCBhdCB0aGUgZW5kIG9mIGlucAorCisuTG9vcF92ODoKKwl2bGQxLjgJCXtATVNHWzBdLUBNU0dbMV19LFskaW5wXSEKKwl2bGQxLjgJCXtATVNHWzJdLUBNU0dbM119LFskaW5wXSEKKwl2bGQxLjMyCQl7JFcwfSxbJEt0YmxdIQorCXZyZXYzMi44CUBNU0dbMF0sQE1TR1swXQorCXZyZXYzMi44CUBNU0dbMV0sQE1TR1sxXQorCXZyZXYzMi44CUBNU0dbMl0sQE1TR1syXQorCXZyZXYzMi44CUBNU0dbM10sQE1TR1szXQorCXZtb3YJCSRBQkNEX1NBVkUsJEFCQ0QJQCBvZmZsb2FkCisJdm1vdgkJJEVGR0hfU0FWRSwkRUZHSAorCXRlcQkJJGlucCwkbGVuCitfX18KK2ZvcigkaT0wOyRpPDEyOyRpKyspIHsKKyRjb2RlLj08PF9fXzsKKwl2bGQxLjMyCQl7JFcxfSxbJEt0YmxdIQorCXZhZGQuaTMyCSRXMCwkVzAsQE1TR1swXQorCXNoYTI1NnN1MAlATVNHWzBdLEBNU0dbMV0KKwl2bW92CQkkYWJjZCwkQUJDRAorCXNoYTI1NmgJCSRBQkNELCRFRkdILCRXMAorCXNoYTI1NmgyCSRFRkdILCRhYmNkLCRXMAorCXNoYTI1NnN1MQlATVNHWzBdLEBNU0dbMl0sQE1TR1szXQorX19fCisJKCRXMCwkVzEpPSgkVzEsJFcwKTsJcHVzaChATVNHLHNoaWZ0KEBNU0cpKTsKK30KKyRjb2RlLj08PF9fXzsKKwl2bGQxLjMyCQl7JFcxfSxbJEt0YmxdIQorCXZhZGQuaTMyCSRXMCwkVzAsQE1TR1swXQorCXZtb3YJCSRhYmNkLCRBQkNECisJc2hhMjU2aAkJJEFCQ0QsJEVGR0gsJFcwCisJc2hhMjU2aDIJJEVGR0gsJGFiY2QsJFcwCisKKwl2bGQxLjMyCQl7JFcwfSxbJEt0YmxdIQorCXZhZGQuaTMyCSRXMSwkVzEsQE1TR1sxXQorCXZtb3YJCSRhYmNkLCRBQkNECisJc2hhMjU2aAkJJEFCQ0QsJEVGR0gsJFcxCisJc2hhMjU2aDIJJEVGR0gsJGFiY2QsJFcxCisKKwl2bGQxLjMyCQl7JFcxfSxbJEt0YmxdCisJdmFkZC5pMzIJJFcwLCRXMCxATVNHWzJdCisJc3ViCQkkS3RibCwkS3RibCwjMjU2LTE2CUAgcmV3aW5kCisJdm1vdgkJJGFiY2QsJEFCQ0QKKwlzaGEyNTZoCQkkQUJDRCwkRUZHSCwkVzAKKwlzaGEyNTZoMgkkRUZHSCwkYWJjZCwkVzAKKworCXZhZGQuaTMyCSRXMSwkVzEsQE1TR1szXQorCXZtb3YJCSRhYmNkLCRBQkNECisJc2hhMjU2aAkJJEFCQ0QsJEVGR0gsJFcxCisJc2hhMjU2aDIJJEVGR0gsJGFiY2QsJFcxCisKKwl2YWRkLmkzMgkkQUJDRCwkQUJDRCwkQUJDRF9TQVZFCisJdmFkZC5pMzIJJEVGR0gsJEVGR0gsJEVGR0hfU0FWRQorCWl0CQluZQorCWJuZQkJLkxvb3BfdjgKKworCXZzdDEuMzIJCXskQUJDRCwkRUZHSH0sWyRjdHhdCisKKwlyZXQJCUAgYnggbHIKKy5zaXplCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2FybXY4LC4tc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfYXJtdjgKKyNlbmRpZgorX19fCit9fX0KKyRjb2RlLj08PF9fXzsKKy5hc2NpeiAgIlNIQTI1NiBibG9jayB0cmFuc2Zvcm0gZm9yIEFSTXY0L05FT04vQVJNdjgsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCisuYWxpZ24JMgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKy5jb21tICAgT1BFTlNTTF9hcm1jYXBfUCw0LDQKKyNlbmRpZgorX19fCisKK29wZW4gU0VMRiwkMDsKK3doaWxlKDxTRUxGPikgeworCW5leHQgaWYgKC9eIyEvKTsKKwlsYXN0IGlmICghcy9eIy9ALyBhbmQgIS9eJC8pOworCXByaW50OworfQorY2xvc2UgU0VMRjsKKworeyAgIG15ICAlb3Bjb2RlID0gKAorCSJzaGEyNTZoIgk9PiAweGYzMDAwYzQwLAkic2hhMjU2aDIiCT0+IDB4ZjMxMDBjNDAsCisJInNoYTI1NnN1MCIJPT4gMHhmM2JhMDNjMCwJInNoYTI1NnN1MSIJPT4gMHhmMzIwMGM0MAkpOworCisgICAgc3ViIHVuc2hhMjU2IHsKKwlteSAoJG1uZW1vbmljLCRhcmcpPUBfOworCisJaWYgKCRhcmcgPX4gbS9xKFswLTldKykoPzosXHMqcShbMC05XSspKT8sXHMqcShbMC05XSspL28pIHsKKwkgICAgbXkgJHdvcmQgPSAkb3Bjb2RleyRtbmVtb25pY318KCgkMSY3KTw8MTMpfCgoJDEmOCk8PDE5KQorCQkJCQkgfCgoJDImNyk8PDE3KXwoKCQyJjgpPDw0KQorCQkJCQkgfCgoJDMmNyk8PDEpIHwoKCQzJjgpPDwyKTsKKwkgICAgIyBzaW5jZSBBUk12NyBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyBlbmNvZGVkIGxpdHRsZS1lbmRpYW4uCisJICAgICMgY29ycmVjdCBzb2x1dGlvbiBpcyB0byB1c2UgLmluc3QgZGlyZWN0aXZlLCBidXQgb2xkZXIKKwkgICAgIyBhc3NlbWJsZXJzIGRvbid0IGltcGxlbWVudCBpdDotKAorCSAgICBzcHJpbnRmICJJTlNUKDB4JTAyeCwweCUwMngsMHglMDJ4LDB4JTAyeClcdEAgJXMgJXMiLAorCQkJJHdvcmQmMHhmZiwoJHdvcmQ+PjgpJjB4ZmYsCisJCQkoJHdvcmQ+PjE2KSYweGZmLCgkd29yZD4+MjQpJjB4ZmYsCisJCQkkbW5lbW9uaWMsJGFyZzsKKwl9CisgICAgfQorfQorCitmb3JlYWNoIChzcGxpdCgkLywkY29kZSkpIHsKKworCXMvXGAoW15cYF0qKVxgL2V2YWwgJDEvZ2VvOworCisJcy9cYihzaGEyNTZcdyspXHMrKHEuKikvdW5zaGEyNTYoJDEsJDIpL2dlbzsKKworCXMvXGJyZXRcYi9ieAlsci9nbwkJb3IKKwlzL1xiYnhccytsclxiLy53b3JkXHQweGUxMmZmZjFlL2dvOwkjIG1ha2UgaXQgcG9zc2libGUgdG8gY29tcGlsZSB3aXRoIC1tYXJjaD1hcm12NAorCisJcHJpbnQgJF8sIlxuIjsKK30KKworY2xvc2UgU1RET1VUOyAjIGVuZm9yY2UgZmx1c2gKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NyeXB0by9zaGEyNTYtY29yZS5TX3NoaXBwZWQgYi9hcmNoL2FybS9jcnlwdG8vc2hhMjU2LWNvcmUuU19zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NWExYTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcnlwdG8vc2hhMjU2LWNvcmUuU19zaGlwcGVkCkBAIC0wLDAgKzEsMjgwOCBAQAorCitAID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitAIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorQCBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCitAIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCitAIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorQAorQCBQZXJtaXNzaW9uIHRvIHVzZSB1bmRlciBHUEwgdGVybXMgaXMgZ3JhbnRlZC4KK0AgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQCBTSEEyNTYgYmxvY2sgcHJvY2VkdXJlIGZvciBBUk12NC4gTWF5IDIwMDcuCisKK0AgUGVyZm9ybWFuY2UgaXMgfjJ4IGJldHRlciB0aGFuIGdjYyAzLjQgZ2VuZXJhdGVkIGNvZGUgYW5kIGluICJhYnNvLQorQCBsdXRlIiB0ZXJtcyBpcyB+MjI1MCBjeWNsZXMgcGVyIDY0LWJ5dGUgYmxvY2sgb3IgfjM1IGN5Y2xlcyBwZXIKK0AgYnl0ZSBbb24gc2luZ2xlLWlzc3VlIFhzY2FsZSBQWEEyNTAgY29yZV0uCisKK0AgSnVseSAyMDEwLgorQAorQCBSZXNjaGVkdWxpbmcgZm9yIGR1YWwtaXNzdWUgcGlwZWxpbmUgcmVzdWx0ZWQgaW4gMjIlIGltcHJvdmVtZW50IG9uCitAIENvcnRleCBBOCBjb3JlIGFuZCB+MjAgY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZS4KKworQCBGZWJydWFyeSAyMDExLgorQAorQCBQcm9maWxlci1hc3Npc3RlZCBhbmQgcGxhdGZvcm0tc3BlY2lmaWMgb3B0aW1pemF0aW9uIHJlc3VsdGVkIGluIDE2JQorQCBpbXByb3ZlbWVudCBvbiBDb3J0ZXggQTggY29yZSBhbmQgfjE1LjQgY3ljbGVzIHBlciBwcm9jZXNzZWQgYnl0ZS4KKworQCBTZXB0ZW1iZXIgMjAxMy4KK0AKK0AgQWRkIE5FT04gaW1wbGVtZW50YXRpb24uIE9uIENvcnRleCBBOCBpdCB3YXMgbWVhc3VyZWQgdG8gcHJvY2VzcyBvbmUKK0AgYnl0ZSBpbiAxMi41IGN5Y2xlcyBvciAyMyUgZmFzdGVyIHRoYW4gaW50ZWdlci1vbmx5IGNvZGUuIFNuYXBkcmFnb24KK0AgUzQgZG9lcyBpdCBpbiAxMi41IGN5Y2xlcyB0b28sIGJ1dCBpdCdzIDUwJSBmYXN0ZXIgdGhhbiBpbnRlZ2VyLW9ubHkKK0AgY29kZSAobWVhbmluZyB0aGF0IGxhdHRlciBwZXJmb3JtcyBzdWItb3B0aW1hbGx5LCBub3RoaW5nIHdhcyBkb25lCitAIGFib3V0IGl0KS4KKworQCBNYXkgMjAxNC4KK0AKK0AgQWRkIEFSTXY4IGNvZGUgcGF0aCBwZXJmb3JtaW5nIGF0IDIuMCBjcGIgb24gQXBwbGUgQTcuCisKKyNpZm5kZWYgX19LRVJORUxfXworIyBpbmNsdWRlICJhcm1fYXJjaC5oIgorI2Vsc2UKKyMgZGVmaW5lIF9fQVJNX0FSQ0hfXyBfX0xJTlVYX0FSTV9BUkNIX18KKyMgZGVmaW5lIF9fQVJNX01BWF9BUkNIX18gNworI2VuZGlmCisKKy50ZXh0CisjaWYgX19BUk1fQVJDSF9fPDcKKy5jb2RlCTMyCisjZWxzZQorLnN5bnRheCB1bmlmaWVkCisjIGlmZGVmIF9fdGh1bWIyX18KKyMgIGRlZmluZSBhZHJsIGFkcgorLnRodW1iCisjIGVsc2UKKy5jb2RlICAgMzIKKyMgZW5kaWYKKyNlbmRpZgorCisudHlwZQlLMjU2LCVvYmplY3QKKy5hbGlnbgk1CitLMjU2OgorLndvcmQJMHg0MjhhMmY5OCwweDcxMzc0NDkxLDB4YjVjMGZiY2YsMHhlOWI1ZGJhNQorLndvcmQJMHgzOTU2YzI1YiwweDU5ZjExMWYxLDB4OTIzZjgyYTQsMHhhYjFjNWVkNQorLndvcmQJMHhkODA3YWE5OCwweDEyODM1YjAxLDB4MjQzMTg1YmUsMHg1NTBjN2RjMworLndvcmQJMHg3MmJlNWQ3NCwweDgwZGViMWZlLDB4OWJkYzA2YTcsMHhjMTliZjE3NAorLndvcmQJMHhlNDliNjljMSwweGVmYmU0Nzg2LDB4MGZjMTlkYzYsMHgyNDBjYTFjYworLndvcmQJMHgyZGU5MmM2ZiwweDRhNzQ4NGFhLDB4NWNiMGE5ZGMsMHg3NmY5ODhkYQorLndvcmQJMHg5ODNlNTE1MiwweGE4MzFjNjZkLDB4YjAwMzI3YzgsMHhiZjU5N2ZjNworLndvcmQJMHhjNmUwMGJmMywweGQ1YTc5MTQ3LDB4MDZjYTYzNTEsMHgxNDI5Mjk2NworLndvcmQJMHgyN2I3MGE4NSwweDJlMWIyMTM4LDB4NGQyYzZkZmMsMHg1MzM4MGQxMworLndvcmQJMHg2NTBhNzM1NCwweDc2NmEwYWJiLDB4ODFjMmM5MmUsMHg5MjcyMmM4NQorLndvcmQJMHhhMmJmZThhMSwweGE4MWE2NjRiLDB4YzI0YjhiNzAsMHhjNzZjNTFhMworLndvcmQJMHhkMTkyZTgxOSwweGQ2OTkwNjI0LDB4ZjQwZTM1ODUsMHgxMDZhYTA3MAorLndvcmQJMHgxOWE0YzExNiwweDFlMzc2YzA4LDB4Mjc0ODc3NGMsMHgzNGIwYmNiNQorLndvcmQJMHgzOTFjMGNiMywweDRlZDhhYTRhLDB4NWI5Y2NhNGYsMHg2ODJlNmZmMworLndvcmQJMHg3NDhmODJlZSwweDc4YTU2MzZmLDB4ODRjODc4MTQsMHg4Y2M3MDIwOAorLndvcmQJMHg5MGJlZmZmYSwweGE0NTA2Y2ViLDB4YmVmOWEzZjcsMHhjNjcxNzhmMgorLnNpemUJSzI1NiwuLUsyNTYKKy53b3JkCTAJCQkJQCB0ZXJtaW5hdG9yCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NyAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQorLkxPUEVOU1NMX2FybWNhcDoKKy53b3JkCU9QRU5TU0xfYXJtY2FwX1Atc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKyNlbmRpZgorLmFsaWduCTUKKworLmdsb2JhbAlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorLnR5cGUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIsJWZ1bmN0aW9uCitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcjoKKyNpZiBfX0FSTV9BUkNIX188NworCXN1YglyMyxwYywjOAkJQCBzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcgorI2Vsc2UKKwlhZHIJcjMsc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXIKKyNlbmRpZgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKwlsZHIJcjEyLC5MT1BFTlNTTF9hcm1jYXAKKwlsZHIJcjEyLFtyMyxyMTJdCQlAIE9QRU5TU0xfYXJtY2FwX1AKKwl0c3QJcjEyLCNBUk1WOF9TSEEyNTYKKwlibmUJLkxBUk12OAorCXRzdAlyMTIsI0FSTVY3X05FT04KKwlibmUJLkxORU9OCisjZW5kaWYKKwlhZGQJcjIscjEscjIsbHNsIzYJQCBsZW4gdG8gcG9pbnQgYXQgdGhlIGVuZCBvZiBpbnAKKwlzdG1kYglzcCEse3IwLHIxLHIyLHI0LXIxMSxscn0KKwlsZG1pYQlyMCx7cjQscjUscjYscjcscjgscjkscjEwLHIxMX0KKwlzdWIJcjE0LHIzLCMyNTYrMzIJQCBLMjU2CisJc3ViCXNwLHNwLCMxNio0CQlAIGFsbG9jYShYWzE2XSkKKy5Mb29wOgorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI1LHI2CQlAIG1hZ2ljCisJZW9yCXIxMixyMTIscjEyCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMAorIyBpZiAwPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI4LHI4LHJvciM1CisJYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHI4LHJvciMxOQlAIFNpZ21hMShlKQorIyBpZm5kZWYgX19BUk1FQl9fCisJcmV2CXIyLHIyCisjIGVuZGlmCisjZWxzZQorCUAgbGRyYglyMixbcjEsIzNdCQkJQCAwCisJYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMTIsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMTIsbHNsIzgKKwlsZHJiCXIxMixbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiAwPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI4LHI4LHJvciM1CisJb3JyCXIyLHIyLHIxMixsc2wjMjQKKwllb3IJcjAscjAscjgscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXIxMSxyMTEscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMwKjRdCisJZW9yCXIyLHI5LHIxMAorCWFkZAlyMTEscjExLHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI4CisJYWRkCXIxMSxyMTEscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHIxMAkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI0LHI0LHJvciMxMQorCWFkZAlyMTEscjExLHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAwPT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDA8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI0LHI1CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzIqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjQscjUJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMxNSo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyNCxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjMscjMscjEyCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjcscjcscjExCQkJQCBkKz1oCisJZW9yCXIzLHIzLHI1CQkJQCBNYWooYSxiLGMpCisJYWRkCXIxMSxyMTEscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyMTEscjExLHIzCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMQorIyBpZiAxPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI3LHI3LHJvciM1CisJYWRkCXIxMSxyMTEscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyNyxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMQorCWFkZAlyMTEscjExLHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIzLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjMsbHNsIzgKKwlsZHJiCXIzLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDE9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjcscjcscm9yIzUKKwlvcnIJcjIscjIscjMsbHNsIzI0CisJZW9yCXIwLHIwLHI3LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXIxMCxyMTAscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxKjRdCisJZW9yCXIyLHI4LHI5CisJYWRkCXIxMCxyMTAscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjcKKwlhZGQJcjEwLHIxMCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyOQkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHIxMSxyMTEscm9yIzExCisJYWRkCXIxMCxyMTAscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMTwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyMTEscjQJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMyo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHIxMSxyNAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzAqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjExLHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjYscjYscjEwCQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjQJCQlAIE1haihhLGIsYykKKwlhZGQJcjEwLHIxMCxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXIxMCxyMTAscjEyCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMgorIyBpZiAyPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI2LHI2LHJvciM1CisJYWRkCXIxMCxyMTAscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJcjAscjAscjYscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDIKKwlhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjEyLGxzbCM4CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgMj09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNixyNixyb3IjNQorCW9ycglyMixyMixyMTIsbHNsIzI0CisJZW9yCXIwLHIwLHI2LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOSxyOSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzIqNF0KKwllb3IJcjIscjcscjgKKwlhZGQJcjkscjkscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjYKKwlhZGQJcjkscjkscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI4CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjEwLHIxMCxyb3IjMTEKKwlhZGQJcjkscjkscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDI9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjEwLHIxMQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCM0KjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjEyLHIxMCxyMTEJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMxKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHIxMCxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjMscjMscjEyCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjUscjUscjkJCQlAIGQrPWgKKwllb3IJcjMscjMscjExCQkJQCBNYWooYSxiLGMpCisJYWRkCXI5LHI5LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCAzCisjIGlmIDM9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjUscjUscm9yIzUKKwlhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyNSxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMworCWFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMyxbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIzLGxzbCM4CisJbGRyYglyMyxbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiAzPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI1LHI1LHJvciM1CisJb3JyCXIyLHIyLHIzLGxzbCMyNAorCWVvcglyMCxyMCxyNSxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOCxyOCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzMqNF0KKwllb3IJcjIscjYscjcKKwlhZGQJcjgscjgscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjUKKwlhZGQJcjgscjgscjMJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjcJCQlAIENoKGUsZixnKQorCWVvcglyMCxyOSxyOSxyb3IjMTEKKwlhZGQJcjgscjgscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDM9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMzwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjNSo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI5LHIxMAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzIqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjkscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNCxyNCxyOAkJCUAgZCs9aAorCWVvcglyMTIscjEyLHIxMAkJCUAgTWFqKGEsYixjKQorCWFkZAlyOCxyOCxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI4LHI4LHIxMgkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDQKKyMgaWYgND09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNCxyNCxyb3IjNQorCWFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyNCxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgNAorCWFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjEyLGxzbCM4CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgND09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNCxyNCxyb3IjNQorCW9ycglyMixyMixyMTIsbHNsIzI0CisJZW9yCXIwLHIwLHI0LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNyxyNyxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzQqNF0KKwllb3IJcjIscjUscjYKKwlhZGQJcjcscjcscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjQKKwlhZGQJcjcscjcscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI2CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjgscjgscm9yIzExCisJYWRkCXI3LHI3LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiA0PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDQ8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI4LHI5CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzYqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjgscjkJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMzKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI4LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTEscjExLHI3CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI5CQkJQCBNYWooYSxiLGMpCisJYWRkCXI3LHI3LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCA1CisjIGlmIDU9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjExLHIxMSxyb3IjNQorCWFkZAlyNyxyNyxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHIxMSxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgNQorCWFkZAlyNyxyNyxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMyxbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIzLGxzbCM4CisJbGRyYglyMyxbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiA1PT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHIxMSxyMTEscm9yIzUKKwlvcnIJcjIscjIscjMsbHNsIzI0CisJZW9yCXIwLHIwLHIxMSxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNixyNixyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzUqNF0KKwllb3IJcjIscjQscjUKKwlhZGQJcjYscjYscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjExCisJYWRkCXI2LHI2LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI1CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjcscjcscm9yIzExCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiA1PT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDU8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjcscjgJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjNyo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI3LHI4CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjNCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyNyxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjEyLHIxMixyMwkJCUAgKGJeYykmPShhXmIpCisJYWRkCXIxMCxyMTAscjYJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyOAkJCUAgTWFqKGEsYixjKQorCWFkZAlyNixyNixyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI2LHI2LHIxMgkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDYKKyMgaWYgNj09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyMTAscjEwLHJvciM1CisJYWRkCXI2LHI2LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHIxMCxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgNgorCWFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjEyLGxzbCM4CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgNj09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyMTAscjEwLHJvciM1CisJb3JyCXIyLHIyLHIxMixsc2wjMjQKKwllb3IJcjAscjAscjEwLHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNSxyNSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzYqNF0KKwllb3IJcjIscjExLHI0CisJYWRkCXI1LHI1LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHIxMAorCWFkZAlyNSxyNSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjQJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNixyNixyb3IjMTEKKwlhZGQJcjUscjUscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDY9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgNjwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjYscjcJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjOCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyNixyNwkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzUqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjYscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI5LHI5LHI1CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI3CQkJQCBNYWooYSxiLGMpCisJYWRkCXI1LHI1LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjUscjUscjMJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCA3CisjIGlmIDc9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjkscjkscm9yIzUKKwlhZGQJcjUscjUscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyOSxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgNworCWFkZAlyNSxyNSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMyxbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIzLGxzbCM4CisJbGRyYglyMyxbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiA3PT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI5LHI5LHJvciM1CisJb3JyCXIyLHIyLHIzLGxzbCMyNAorCWVvcglyMCxyMCxyOSxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNCxyNCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzcqNF0KKwllb3IJcjIscjEwLHIxMQorCWFkZAlyNCxyNCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOQorCWFkZAlyNCxyNCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTEJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwlhZGQJcjQscjQscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDc9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgNzwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyNSxyNgkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCM5KjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjUscjYJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCM2KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI1LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjgscjgscjQJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNCxyNCxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDgKKyMgaWYgOD09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyOCxyOCxyb3IjNQorCWFkZAlyNCxyNCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyOCxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgOAorCWFkZAlyNCxyNCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjEyLFtyMSwjMl0KKwlsZHJiCXIwLFtyMSwjMV0KKwlvcnIJcjIscjIscjEyLGxzbCM4CisJbGRyYglyMTIsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgOD09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyOCxyOCxyb3IjNQorCW9ycglyMixyMixyMTIsbHNsIzI0CisJZW9yCXIwLHIwLHI4LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyMTEscjExLHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjOCo0XQorCWVvcglyMixyOSxyMTAKKwlhZGQJcjExLHIxMSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOAorCWFkZAlyMTEscjExLHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTAJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNCxyNCxyb3IjMTEKKwlhZGQJcjExLHIxMSxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgOD09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiA4PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxMCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzcqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjQscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI3LHI3LHIxMQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNQkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTEscjExLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCUAgbGRyCXIyLFtyMV0sIzQJCQlAIDkKKyMgaWYgOT09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNyxyNyxyb3IjNQorCWFkZAlyMTEscjExLHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwllb3IJcjAscjAscjcscm9yIzE5CUAgU2lnbWExKGUpCisjIGlmbmRlZiBfX0FSTUVCX18KKwlyZXYJcjIscjIKKyMgZW5kaWYKKyNlbHNlCisJQCBsZHJiCXIyLFtyMSwjM10JCQlAIDkKKwlhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMyxbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIzLGxzbCM4CisJbGRyYglyMyxbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiA5PT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI3LHI3LHJvciM1CisJb3JyCXIyLHIyLHIzLGxzbCMyNAorCWVvcglyMCxyMCxyNyxyb3IjMTkJQCBTaWdtYTEoZSkKKyNlbmRpZgorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyMTAscjEwLHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjOSo0XQorCWVvcglyMixyOCxyOQorCWFkZAlyMTAscjEwLHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI3CisJYWRkCXIxMCxyMTAscjMJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjkJCQlAIENoKGUsZixnKQorCWVvcglyMCxyMTEscjExLHJvciMxMQorCWFkZAlyMTAscjEwLHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiA5PT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDk8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzExKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjOCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyMTEscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNixyNixyMTAJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNAkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTAscjEwLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCAxMAorIyBpZiAxMD09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNixyNixyb3IjNQorCWFkZAlyMTAscjEwLHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHI2LHJvciMxOQlAIFNpZ21hMShlKQorIyBpZm5kZWYgX19BUk1FQl9fCisJcmV2CXIyLHIyCisjIGVuZGlmCisjZWxzZQorCUAgbGRyYglyMixbcjEsIzNdCQkJQCAxMAorCWFkZAlyMTAscjEwLHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMTIsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMTIsbHNsIzgKKwlsZHJiCXIxMixbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiAxMD09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNixyNixyb3IjNQorCW9ycglyMixyMixyMTIsbHNsIzI0CisJZW9yCXIwLHIwLHI2LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOSxyOSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzEwKjRdCisJZW9yCXIyLHI3LHI4CisJYWRkCXI5LHI5LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI2CisJYWRkCXI5LHI5LHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyOAkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHIxMCxyMTAscm9yIzExCisJYWRkCXI5LHI5LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAxMD09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAxMDwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjEwLHIxMQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxMio0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyMTAscjExCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjOSo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyMTAscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI1LHI1LHI5CQkJQCBkKz1oCisJZW9yCXIzLHIzLHIxMQkJCUAgTWFqKGEsYixjKQorCWFkZAlyOSxyOSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI5LHI5LHIzCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMTEKKyMgaWYgMTE9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjUscjUscm9yIzUKKwlhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyNSxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMTEKKwlhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjMsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMyxsc2wjOAorCWxkcmIJcjMsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgMTE9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjUscjUscm9yIzUKKwlvcnIJcjIscjIscjMsbHNsIzI0CisJZW9yCXIwLHIwLHI1LHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI4LHI4LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTEqNF0KKwllb3IJcjIscjYscjcKKwlhZGQJcjgscjgscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjUKKwlhZGQJcjgscjgscjMJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjcJCQlAIENoKGUsZixnKQorCWVvcglyMCxyOSxyOSxyb3IjMTEKKwlhZGQJcjgscjgscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDExPT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDExPDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI5LHIxMAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxMyo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI5LHIxMAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzEwKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI5LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjQscjQscjgJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyMTAJCQlAIE1haihhLGIsYykKKwlhZGQJcjgscjgscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCAxMgorIyBpZiAxMj09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyNCxyNCxyb3IjNQorCWFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWVvcglyMCxyMCxyNCxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMTIKKwlhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIxMixsc2wjOAorCWxkcmIJcjEyLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDEyPT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHI0LHI0LHJvciM1CisJb3JyCXIyLHIyLHIxMixsc2wjMjQKKwllb3IJcjAscjAscjQscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI3LHI3LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTIqNF0KKwllb3IJcjIscjUscjYKKwlhZGQJcjcscjcscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjQKKwlhZGQJcjcscjcscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI2CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjgscjgscm9yIzExCisJYWRkCXI3LHI3LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAxMj09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAxMjwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjgscjkJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTQqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjgscjkJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMxMSo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyOCxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjMscjMscjEyCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjExLHIxMSxyNwkJCUAgZCs9aAorCWVvcglyMyxyMyxyOQkJCUAgTWFqKGEsYixjKQorCWFkZAlyNyxyNyxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI3LHI3LHIzCQkJQCBoKz1NYWooYSxiLGMpCisjaWYgX19BUk1fQVJDSF9fPj03CisJQCBsZHIJcjIsW3IxXSwjNAkJCUAgMTMKKyMgaWYgMTM9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjExLHIxMSxyb3IjNQorCWFkZAlyNyxyNyxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHIxMSxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMTMKKwlhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcmIJcjMsW3IxLCMyXQorCWxkcmIJcjAsW3IxLCMxXQorCW9ycglyMixyMixyMyxsc2wjOAorCWxkcmIJcjMsW3IxXSwjNAorCW9ycglyMixyMixyMCxsc2wjMTYKKyMgaWYgMTM9PTE1CisJc3RyCXIxLFtzcCwjMTcqNF0JCQlAIG1ha2Ugcm9vbSBmb3IgcjEKKyMgZW5kaWYKKwllb3IJcjAscjExLHIxMSxyb3IjNQorCW9ycglyMixyMixyMyxsc2wjMjQKKwllb3IJcjAscjAscjExLHJvciMxOQlAIFNpZ21hMShlKQorI2VuZGlmCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTMqNF0KKwllb3IJcjIscjQscjUKKwlhZGQJcjYscjYscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjExCisJYWRkCXI2LHI2LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI1CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjcscjcscm9yIzExCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAxMz09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAxMzwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyNyxyOAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxNSo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI3LHI4CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTIqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjcscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTAscjEwLHI2CQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjgJCQlAIE1haihhLGIsYykKKwlhZGQJcjYscjYscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCAxNAorIyBpZiAxND09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyMTAscjEwLHJvciM1CisJYWRkCXI2LHI2LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHIxMCxyb3IjMTkJQCBTaWdtYTEoZSkKKyMgaWZuZGVmIF9fQVJNRUJfXworCXJldglyMixyMgorIyBlbmRpZgorI2Vsc2UKKwlAIGxkcmIJcjIsW3IxLCMzXQkJCUAgMTQKKwlhZGQJcjYscjYscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwlsZHJiCXIxMixbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIxMixsc2wjOAorCWxkcmIJcjEyLFtyMV0sIzQKKwlvcnIJcjIscjIscjAsbHNsIzE2CisjIGlmIDE0PT0xNQorCXN0cglyMSxbc3AsIzE3KjRdCQkJQCBtYWtlIHJvb20gZm9yIHIxCisjIGVuZGlmCisJZW9yCXIwLHIxMCxyMTAscm9yIzUKKwlvcnIJcjIscjIscjEyLGxzbCMyNAorCWVvcglyMCxyMCxyMTAscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI1LHI1LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTQqNF0KKwllb3IJcjIscjExLHI0CisJYWRkCXI1LHI1LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHIxMAorCWFkZAlyNSxyNSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjQJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNixyNixyb3IjMTEKKwlhZGQJcjUscjUscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE0PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE0PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyNixyNwkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMwKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjEyLHI2LHI3CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTMqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjYscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI5LHI5LHI1CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI3CQkJQCBNYWooYSxiLGMpCisJYWRkCXI1LHI1LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjUscjUscjMJCQlAIGgrPU1haihhLGIsYykKKyNpZiBfX0FSTV9BUkNIX18+PTcKKwlAIGxkcglyMixbcjFdLCM0CQkJQCAxNQorIyBpZiAxNT09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyOSxyOSxyb3IjNQorCWFkZAlyNSxyNSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJZW9yCXIwLHIwLHI5LHJvciMxOQlAIFNpZ21hMShlKQorIyBpZm5kZWYgX19BUk1FQl9fCisJcmV2CXIyLHIyCisjIGVuZGlmCisjZWxzZQorCUAgbGRyYglyMixbcjEsIzNdCQkJQCAxNQorCWFkZAlyNSxyNSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyYglyMyxbcjEsIzJdCisJbGRyYglyMCxbcjEsIzFdCisJb3JyCXIyLHIyLHIzLGxzbCM4CisJbGRyYglyMyxbcjFdLCM0CisJb3JyCXIyLHIyLHIwLGxzbCMxNgorIyBpZiAxNT09MTUKKwlzdHIJcjEsW3NwLCMxNyo0XQkJCUAgbWFrZSByb29tIGZvciByMQorIyBlbmRpZgorCWVvcglyMCxyOSxyOSxyb3IjNQorCW9ycglyMixyMixyMyxsc2wjMjQKKwllb3IJcjAscjAscjkscm9yIzE5CUAgU2lnbWExKGUpCisjZW5kaWYKKwlsZHIJcjMsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjQscjQscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxNSo0XQorCWVvcglyMixyMTAscjExCisJYWRkCXI0LHI0LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI5CisJYWRkCXI0LHI0LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHIxMQkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI1LHI1LHJvciMxMQorCWFkZAlyNCxyNCxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMTU9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMTU8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjUscjYJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMSo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI1LHI2CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTQqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjUscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOCxyOCxyNAkJCUAgZCs9aAorCWVvcglyMTIscjEyLHI2CQkJQCBNYWooYSxiLGMpCisJYWRkCXI0LHI0LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjQscjQscjEyCQkJQCBoKz1NYWooYSxiLGMpCisuTHJvdW5kc18xNl94eDoKKwlAIGxkcglyMixbc3AsIzEqNF0JCUAgMTYKKwlAIGxkcglyMSxbc3AsIzE0KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIxMixyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIxMixyMTIscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMwKjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjOSo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjgscjgscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI4LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjExLHIxMSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzAqNF0KKwllb3IJcjIscjkscjEwCisJYWRkCXIxMSxyMTEscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjgKKwlhZGQJcjExLHIxMSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjEwCQkJQCBDaChlLGYsZykKKwllb3IJcjAscjQscjQscm9yIzExCisJYWRkCXIxMSxyMTEscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE2PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE2PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMyKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjEyLHI0LHI1CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTUqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjQscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI3LHI3LHIxMQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNQkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTEscjExLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjMio0XQkJQCAxNworCUAgbGRyCXIxLFtzcCwjMTUqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMxKjRdCisJZW9yCXIzLHIzLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzEwKjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjcscjcscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjcscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXIxMCxyMTAscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxKjRdCisJZW9yCXIyLHI4LHI5CisJYWRkCXIxMCxyMTAscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjcKKwlhZGQJcjEwLHIxMCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyOQkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHIxMSxyMTEscm9yIzExCisJYWRkCXIxMCxyMTAscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE3PT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE3PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHIxMSxyNAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMzKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyMTEscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNixyNixyMTAJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNAkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTAscjEwLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzMqNF0JCUAgMTgKKwlAIGxkcglyMSxbc3AsIzAqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMTIscjEscm9yIzE3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMTIscjEyLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjMio0XQorCWVvcglyMTIscjEyLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzExKjRdCisKKwlhZGQJcjEyLHIxMixyMAorCWVvcglyMCxyNixyNixyb3IjNQlAIGZyb20gQk9EWV8wMF8xNQorCWFkZAlyMixyMixyMTIKKwllb3IJcjAscjAscjYscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOSxyOSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzIqNF0KKwllb3IJcjIscjcscjgKKwlhZGQJcjkscjkscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjYKKwlhZGQJcjkscjkscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI4CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjEwLHIxMCxyb3IjMTEKKwlhZGQJcjkscjkscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDE4PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDE4PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyMTAscjExCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzQqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjEwLHIxMQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzEqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjEwLHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNSxyNSxyOQkJCUAgZCs9aAorCWVvcglyMyxyMyxyMTEJCQlAIE1haihhLGIsYykKKwlhZGQJcjkscjkscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjNCo0XQkJQCAxOQorCUAgbGRyCXIxLFtzcCwjMSo0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMzKjRdCisJZW9yCXIzLHIzLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzEyKjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjUscjUscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjUscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI4LHI4LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMyo0XQorCWVvcglyMixyNixyNworCWFkZAlyOCxyOCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNQorCWFkZAlyOCxyOCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNwkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI5LHI5LHJvciMxMQorCWFkZAlyOCxyOCxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMTk9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMTk8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjkscjEwCQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzUqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMyKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI5LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjQscjQscjgJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyMTAJCQlAIE1haihhLGIsYykKKwlhZGQJcjgscjgscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOCxyOCxyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzUqNF0JCUAgMjAKKwlAIGxkcglyMSxbc3AsIzIqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjEyLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjEyLHIxMixyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzQqNF0KKwllb3IJcjEyLHIxMixyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCMxMyo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjQscjQscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI0LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjcscjcscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCM0KjRdCisJZW9yCXIyLHI1LHI2CisJYWRkCXI3LHI3LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI0CisJYWRkCXI3LHI3LHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNgkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI4LHI4LHJvciMxMQorCWFkZAlyNyxyNyxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjA9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjA8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI4LHI5CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzYqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjgscjkJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMzKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI4LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTEscjExLHI3CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI5CQkJQCBNYWooYSxiLGMpCisJYWRkCXI3LHI3LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzYqNF0JCUAgMjEKKwlAIGxkcglyMSxbc3AsIzMqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMyxyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIzLHIzLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjNSo0XQorCWVvcglyMyxyMyxyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCMxNCo0XQorCisJYWRkCXIzLHIzLHIwCisJZW9yCXIwLHIxMSxyMTEscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjExLHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNixyNixyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzUqNF0KKwllb3IJcjIscjQscjUKKwlhZGQJcjYscjYscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjExCisJYWRkCXI2LHI2LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI1CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjcscjcscm9yIzExCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAyMT09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAyMTwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyNyxyOAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCM3KjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjcscjgJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCM0KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI3LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjEwLHIxMCxyNgkJCUAgZCs9aAorCWVvcglyMTIscjEyLHI4CQkJQCBNYWooYSxiLGMpCisJYWRkCXI2LHI2LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjYscjYscjEyCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCM3KjRdCQlAIDIyCisJQCBsZHIJcjEsW3NwLCM0KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI2LHI2LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIxMixyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIxMixyMTIscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCM2KjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMTUqNF0KKworCWFkZAlyMTIscjEyLHIwCisJZW9yCXIwLHIxMCxyMTAscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHIxMCxyb3IjMTkJQCBTaWdtYTEoZSkKKwlhZGQJcjIscjIscjEJCQlAIFhbaV0KKwlsZHIJcjEyLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI1LHI1LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjNio0XQorCWVvcglyMixyMTEscjQKKwlhZGQJcjUscjUscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjEwCisJYWRkCXI1LHI1LHIxMgkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyNAkJCUAgQ2goZSxmLGcpCisJZW9yCXIwLHI2LHI2LHJvciMxMQorCWFkZAlyNSxyNSxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjI9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjI8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHI2LHI3CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzgqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjYscjcJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCM1KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI2LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOSxyOSxyNQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNwkJCUAgTWFqKGEsYixjKQorCWFkZAlyNSxyNSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCM4KjRdCQlAIDIzCisJQCBsZHIJcjEsW3NwLCM1KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjMscjEscm9yIzE3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMyxyMyxyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzcqNF0KKwllb3IJcjMscjMscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMCo0XQorCisJYWRkCXIzLHIzLHIwCisJZW9yCXIwLHI5LHI5LHJvciM1CUAgZnJvbSBCT0RZXzAwXzE1CisJYWRkCXIyLHIyLHIzCisJZW9yCXIwLHIwLHI5LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNCxyNCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzcqNF0KKwllb3IJcjIscjEwLHIxMQorCWFkZAlyNCxyNCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOQorCWFkZAlyNCxyNCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTEJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwlhZGQJcjQscjQscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDIzPT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDIzPDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI1LHI2CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzkqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyNSxyNgkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzYqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjUscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOCxyOCxyNAkJCUAgZCs9aAorCWVvcglyMTIscjEyLHI2CQkJQCBNYWooYSxiLGMpCisJYWRkCXI0LHI0LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjQscjQscjEyCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCM5KjRdCQlAIDI0CisJQCBsZHIJcjEsW3NwLCM2KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIxMixyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIxMixyMTIscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCM4KjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMSo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjgscjgscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI4LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjExLHIxMSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzgqNF0KKwllb3IJcjIscjkscjEwCisJYWRkCXIxMSxyMTEscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjgKKwlhZGQJcjExLHIxMSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjEwCQkJQCBDaChlLGYsZykKKwllb3IJcjAscjQscjQscm9yIzExCisJYWRkCXIxMSxyMTEscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDI0PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDI0PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxMCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyNCxyNQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzcqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjQscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIzLHIzLHIxMgkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI3LHI3LHIxMQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNQkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTEscjExLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjMTAqNF0JCUAgMjUKKwlAIGxkcglyMSxbc3AsIzcqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjExLHIxMSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCM5KjRdCisJZW9yCXIzLHIzLHIxLGxzciMxMAlAIHNpZ21hMShYW2krMTRdKQorCWxkcglyMSxbc3AsIzIqNF0KKworCWFkZAlyMyxyMyxyMAorCWVvcglyMCxyNyxyNyxyb3IjNQlAIGZyb20gQk9EWV8wMF8xNQorCWFkZAlyMixyMixyMworCWVvcglyMCxyMCxyNyxyb3IjMTkJQCBTaWdtYTEoZSkKKwlhZGQJcjIscjIscjEJCQlAIFhbaV0KKwlsZHIJcjMsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjEwLHIxMCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzkqNF0KKwllb3IJcjIscjgscjkKKwlhZGQJcjEwLHIxMCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNworCWFkZAlyMTAscjEwLHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI5CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjExLHIxMSxyb3IjMTEKKwlhZGQJcjEwLHIxMCxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjU9PTMxCisJYW5kCXIzLHIzLCMweGZmCisJY21wCXIzLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjU8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzExKjRdCQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKwllb3IJcjMscjExLHI0CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjOCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyMTEscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNixyNixyMTAJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNAkJCUAgTWFqKGEsYixjKQorCWFkZAlyMTAscjEwLHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjEwLHIxMCxyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzExKjRdCQlAIDI2CisJQCBsZHIJcjEsW3NwLCM4KjRdCisJbW92CXIwLHIyLHJvciM3CisJYWRkCXIxMCxyMTAscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjEyLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjEyLHIxMixyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzEwKjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjMyo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjYscjYscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI2LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjkscjkscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxMCo0XQorCWVvcglyMixyNyxyOAorCWFkZAlyOSxyOSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNgorCWFkZAlyOSxyOSxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjgJCQlAIENoKGUsZixnKQorCWVvcglyMCxyMTAscjEwLHJvciMxMQorCWFkZAlyOSxyOSxyMgkJCUAgaCs9Q2goZSxmLGcpCisjaWYgMjY9PTMxCisJYW5kCXIxMixyMTIsIzB4ZmYKKwljbXAJcjEyLCMweGYyCQkJQCBkb25lPworI2VuZGlmCisjaWYgMjY8MTUKKyMgaWYgX19BUk1fQVJDSF9fPj03CisJbGRyCXIyLFtyMV0sIzQJCQlAIHByZWZldGNoCisjIGVsc2UKKwlsZHJiCXIyLFtyMSwjM10KKyMgZW5kaWYKKwllb3IJcjEyLHIxMCxyMTEJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTIqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMTIscjEwLHIxMQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzkqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjEwLHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyNSxyNSxyOQkJCUAgZCs9aAorCWVvcglyMyxyMyxyMTEJCQlAIE1haihhLGIsYykKKwlhZGQJcjkscjkscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyOSxyOSxyMwkJCUAgaCs9TWFqKGEsYixjKQorCUAgbGRyCXIyLFtzcCwjMTIqNF0JCUAgMjcKKwlAIGxkcglyMSxbc3AsIzkqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjkscjkscjMJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMyxyMSxyb3IjMTcKKwllb3IJcjAscjAscjIscm9yIzE4CisJZW9yCXIzLHIzLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjMTEqNF0KKwllb3IJcjMscjMscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjNCo0XQorCisJYWRkCXIzLHIzLHIwCisJZW9yCXIwLHI1LHI1LHJvciM1CUAgZnJvbSBCT0RZXzAwXzE1CisJYWRkCXIyLHIyLHIzCisJZW9yCXIwLHIwLHI1LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMyxbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyOCxyOCxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzExKjRdCisJZW9yCXIyLHI2LHI3CisJYWRkCXI4LHI4LHIwLHJvciM2CUAgaCs9U2lnbWExKGUpCisJYW5kCXIyLHIyLHI1CisJYWRkCXI4LHI4LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI3CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjkscjkscm9yIzExCisJYWRkCXI4LHI4LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAyNz09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAyNzwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMTMqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyOSxyMTAJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKwlsZHIJcjEsW3NwLCMxMCo0XQlAIGZyb20gZnV0dXJlIEJPRFlfMTZfeHgKKyNlbmRpZgorCWVvcglyMCxyMCxyOSxyb3IjMjAJQCBTaWdtYTAoYSkKKwlhbmQJcjEyLHIxMixyMwkJCUAgKGJeYykmPShhXmIpCisJYWRkCXI0LHI0LHI4CQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjEwCQkJQCBNYWooYSxiLGMpCisJYWRkCXI4LHI4LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCMxMyo0XQkJQCAyOAorCUAgbGRyCXIxLFtzcCwjMTAqNF0KKwltb3YJcjAscjIscm9yIzcKKwlhZGQJcjgscjgscjEyCQkJQCBoKz1NYWooYSxiLGMpIGZyb20gdGhlIHBhc3QKKwltb3YJcjEyLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjEyLHIxMixyMSxyb3IjMTkKKwllb3IJcjAscjAscjIsbHNyIzMJQCBzaWdtYTAoWFtpKzFdKQorCWxkcglyMixbc3AsIzEyKjRdCisJZW9yCXIxMixyMTIscjEsbHNyIzEwCUAgc2lnbWExKFhbaSsxNF0pCisJbGRyCXIxLFtzcCwjNSo0XQorCisJYWRkCXIxMixyMTIscjAKKwllb3IJcjAscjQscjQscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjEyCisJZW9yCXIwLHIwLHI0LHJvciMxOQlAIFNpZ21hMShlKQorCWFkZAlyMixyMixyMQkJCUAgWFtpXQorCWxkcglyMTIsW3IxNF0sIzQJCQlAICpLMjU2KysKKwlhZGQJcjcscjcscjIJCQlAIGgrPVhbaV0KKwlzdHIJcjIsW3NwLCMxMio0XQorCWVvcglyMixyNSxyNgorCWFkZAlyNyxyNyxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyNAorCWFkZAlyNyxyNyxyMTIJCQlAIGgrPUsyNTZbaV0KKwllb3IJcjIscjIscjYJCQlAIENoKGUsZixnKQorCWVvcglyMCxyOCxyOCxyb3IjMTEKKwlhZGQJcjcscjcscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDI4PT0zMQorCWFuZAlyMTIscjEyLCMweGZmCisJY21wCXIxMiwjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDI4PDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIxMixyOCxyOQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxNCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyOCxyOQkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzExKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI4LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTEscjExLHI3CQkJQCBkKz1oCisJZW9yCXIzLHIzLHI5CQkJQCBNYWooYSxiLGMpCisJYWRkCXI3LHI3LHIwLHJvciMyCUAgaCs9U2lnbWEwKGEpCisJQCBhZGQJcjcscjcscjMJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzE0KjRdCQlAIDI5CisJQCBsZHIJcjEsW3NwLCMxMSo0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyNyxyNyxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMxMyo0XQorCWVvcglyMyxyMyxyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCM2KjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjExLHIxMSxyb3IjNQlAIGZyb20gQk9EWV8wMF8xNQorCWFkZAlyMixyMixyMworCWVvcglyMCxyMCxyMTEscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTMqNF0KKwllb3IJcjIscjQscjUKKwlhZGQJcjYscjYscjAscm9yIzYJQCBoKz1TaWdtYTEoZSkKKwlhbmQJcjIscjIscjExCisJYWRkCXI2LHI2LHIzCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI1CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjcscjcscm9yIzExCisJYWRkCXI2LHI2LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAyOT09MzEKKwlhbmQJcjMscjMsIzB4ZmYKKwljbXAJcjMsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAyOTwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMyxyNyxyOAkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorI2Vsc2UKKwlsZHIJcjIsW3NwLCMxNSo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIzLHI3LHI4CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisJbGRyCXIxLFtzcCwjMTIqNF0JQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisjZW5kaWYKKwllb3IJcjAscjAscjcscm9yIzIwCUAgU2lnbWEwKGEpCisJYW5kCXIxMixyMTIscjMJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyMTAscjEwLHI2CQkJQCBkKz1oCisJZW9yCXIxMixyMTIscjgJCQlAIE1haihhLGIsYykKKwlhZGQJcjYscjYscjAscm9yIzIJQCBoKz1TaWdtYTAoYSkKKwlAIGFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykKKwlAIGxkcglyMixbc3AsIzE1KjRdCQlAIDMwCisJQCBsZHIJcjEsW3NwLCMxMio0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyNixyNixyMTIJCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCW1vdglyMTIscjEscm9yIzE3CisJZW9yCXIwLHIwLHIyLHJvciMxOAorCWVvcglyMTIscjEyLHIxLHJvciMxOQorCWVvcglyMCxyMCxyMixsc3IjMwlAIHNpZ21hMChYW2krMV0pCisJbGRyCXIyLFtzcCwjMTQqNF0KKwllb3IJcjEyLHIxMixyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCM3KjRdCisKKwlhZGQJcjEyLHIxMixyMAorCWVvcglyMCxyMTAscjEwLHJvciM1CUAgZnJvbSBCT0RZXzAwXzE1CisJYWRkCXIyLHIyLHIxMgorCWVvcglyMCxyMCxyMTAscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIxMixbcjE0XSwjNAkJCUAgKksyNTYrKworCWFkZAlyNSxyNSxyMgkJCUAgaCs9WFtpXQorCXN0cglyMixbc3AsIzE0KjRdCisJZW9yCXIyLHIxMSxyNAorCWFkZAlyNSxyNSxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyMTAKKwlhZGQJcjUscjUscjEyCQkJQCBoKz1LMjU2W2ldCisJZW9yCXIyLHIyLHI0CQkJQCBDaChlLGYsZykKKwllb3IJcjAscjYscjYscm9yIzExCisJYWRkCXI1LHI1LHIyCQkJQCBoKz1DaChlLGYsZykKKyNpZiAzMD09MzEKKwlhbmQJcjEyLHIxMiwjMHhmZgorCWNtcAlyMTIsIzB4ZjIJCQlAIGRvbmU/CisjZW5kaWYKKyNpZiAzMDwxNQorIyBpZiBfX0FSTV9BUkNIX18+PTcKKwlsZHIJcjIsW3IxXSwjNAkJCUAgcHJlZmV0Y2gKKyMgZWxzZQorCWxkcmIJcjIsW3IxLCMzXQorIyBlbmRpZgorCWVvcglyMTIscjYscjcJCQlAIGFeYiwgYl5jIGluIG5leHQgcm91bmQKKyNlbHNlCisJbGRyCXIyLFtzcCwjMCo0XQkJQCBmcm9tIGZ1dHVyZSBCT0RZXzE2X3h4CisJZW9yCXIxMixyNixyNwkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzEzKjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI2LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMyxyMyxyMTIJCQlAIChiXmMpJj0oYV5iKQorCWFkZAlyOSxyOSxyNQkJCUAgZCs9aAorCWVvcglyMyxyMyxyNwkJCUAgTWFqKGEsYixjKQorCWFkZAlyNSxyNSxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI1LHI1LHIzCQkJQCBoKz1NYWooYSxiLGMpCisJQCBsZHIJcjIsW3NwLCMwKjRdCQlAIDMxCisJQCBsZHIJcjEsW3NwLCMxMyo0XQorCW1vdglyMCxyMixyb3IjNworCWFkZAlyNSxyNSxyMwkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbW92CXIzLHIxLHJvciMxNworCWVvcglyMCxyMCxyMixyb3IjMTgKKwllb3IJcjMscjMscjEscm9yIzE5CisJZW9yCXIwLHIwLHIyLGxzciMzCUAgc2lnbWEwKFhbaSsxXSkKKwlsZHIJcjIsW3NwLCMxNSo0XQorCWVvcglyMyxyMyxyMSxsc3IjMTAJQCBzaWdtYTEoWFtpKzE0XSkKKwlsZHIJcjEsW3NwLCM4KjRdCisKKwlhZGQJcjMscjMscjAKKwllb3IJcjAscjkscjkscm9yIzUJQCBmcm9tIEJPRFlfMDBfMTUKKwlhZGQJcjIscjIscjMKKwllb3IJcjAscjAscjkscm9yIzE5CUAgU2lnbWExKGUpCisJYWRkCXIyLHIyLHIxCQkJQCBYW2ldCisJbGRyCXIzLFtyMTRdLCM0CQkJQCAqSzI1NisrCisJYWRkCXI0LHI0LHIyCQkJQCBoKz1YW2ldCisJc3RyCXIyLFtzcCwjMTUqNF0KKwllb3IJcjIscjEwLHIxMQorCWFkZAlyNCxyNCxyMCxyb3IjNglAIGgrPVNpZ21hMShlKQorCWFuZAlyMixyMixyOQorCWFkZAlyNCxyNCxyMwkJCUAgaCs9SzI1NltpXQorCWVvcglyMixyMixyMTEJCQlAIENoKGUsZixnKQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwlhZGQJcjQscjQscjIJCQlAIGgrPUNoKGUsZixnKQorI2lmIDMxPT0zMQorCWFuZAlyMyxyMywjMHhmZgorCWNtcAlyMywjMHhmMgkJCUAgZG9uZT8KKyNlbmRpZgorI2lmIDMxPDE1CisjIGlmIF9fQVJNX0FSQ0hfXz49NworCWxkcglyMixbcjFdLCM0CQkJQCBwcmVmZXRjaAorIyBlbHNlCisJbGRyYglyMixbcjEsIzNdCisjIGVuZGlmCisJZW9yCXIzLHI1LHI2CQkJQCBhXmIsIGJeYyBpbiBuZXh0IHJvdW5kCisjZWxzZQorCWxkcglyMixbc3AsIzEqNF0JCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorCWVvcglyMyxyNSxyNgkJCUAgYV5iLCBiXmMgaW4gbmV4dCByb3VuZAorCWxkcglyMSxbc3AsIzE0KjRdCUAgZnJvbSBmdXR1cmUgQk9EWV8xNl94eAorI2VuZGlmCisJZW9yCXIwLHIwLHI1LHJvciMyMAlAIFNpZ21hMChhKQorCWFuZAlyMTIscjEyLHIzCQkJQCAoYl5jKSY9KGFeYikKKwlhZGQJcjgscjgscjQJCQlAIGQrPWgKKwllb3IJcjEyLHIxMixyNgkJCUAgTWFqKGEsYixjKQorCWFkZAlyNCxyNCxyMCxyb3IjMglAIGgrPVNpZ21hMChhKQorCUAgYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKQorI2lmIF9fQVJNX0FSQ0hfXz49NworCWl0ZQllcQkJCUAgVGh1bWIyIHRoaW5nLCBzYW5pdHkgY2hlY2sgaW4gQVJNCisjZW5kaWYKKwlsZHJlcQlyMyxbc3AsIzE2KjRdCQlAIHB1bGwgY3R4CisJYm5lCS5Mcm91bmRzXzE2X3h4CisKKwlhZGQJcjQscjQscjEyCQlAIGgrPU1haihhLGIsYykgZnJvbSB0aGUgcGFzdAorCWxkcglyMCxbcjMsIzBdCisJbGRyCXIyLFtyMywjNF0KKwlsZHIJcjEyLFtyMywjOF0KKwlhZGQJcjQscjQscjAKKwlsZHIJcjAsW3IzLCMxMl0KKwlhZGQJcjUscjUscjIKKwlsZHIJcjIsW3IzLCMxNl0KKwlhZGQJcjYscjYscjEyCisJbGRyCXIxMixbcjMsIzIwXQorCWFkZAlyNyxyNyxyMAorCWxkcglyMCxbcjMsIzI0XQorCWFkZAlyOCxyOCxyMgorCWxkcglyMixbcjMsIzI4XQorCWFkZAlyOSxyOSxyMTIKKwlsZHIJcjEsW3NwLCMxNyo0XQkJQCBwdWxsIGlucAorCWxkcglyMTIsW3NwLCMxOCo0XQkJQCBwdWxsIGlucCtsZW4KKwlhZGQJcjEwLHIxMCxyMAorCWFkZAlyMTEscjExLHIyCisJc3RtaWEJcjMse3I0LHI1LHI2LHI3LHI4LHI5LHIxMCxyMTF9CisJY21wCXIxLHIxMgorCXN1YglyMTQscjE0LCMyNTYJQCByZXdpbmQgS3RibAorCWJuZQkuTG9vcAorCisJYWRkCXNwLHNwLCMxOSo0CUAgZGVzdHJveSBmcmFtZQorI2lmIF9fQVJNX0FSQ0hfXz49NQorCWxkbWlhCXNwISx7cjQtcjExLHBjfQorI2Vsc2UKKwlsZG1pYQlzcCEse3I0LXIxMSxscn0KKwl0c3QJbHIsIzEKKwltb3ZlcQlwYyxscgkJCUAgYmUgYmluYXJ5IGNvbXBhdGlibGUgd2l0aCBWNCwgeWV0CisJLndvcmQJMHhlMTJmZmYxZQkJCUAgaW50ZXJvcGVyYWJsZSB3aXRoIFRodW1iIElTQTotKQorI2VuZGlmCisuc2l6ZQlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlciwuLXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NworLmFyY2gJYXJtdjctYQorLmZwdQluZW9uCisKKy5nbG9iYWwJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfbmVvbgorLnR5cGUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfbmVvbiwlZnVuY3Rpb24KKy5hbGlnbgk0CitzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9uZW9uOgorLkxORU9OOgorCXN0bWRiCXNwISx7cjQtcjEyLGxyfQorCisJc3ViCXIxMSxzcCwjMTYqNCsxNgorCWFkcmwJcjE0LEsyNTYKKwliaWMJcjExLHIxMSwjMTUJCUAgYWxpZ24gZm9yIDEyOC1iaXQgc3RvcmVzCisJbW92CXIxMixzcAorCW1vdglzcCxyMTEJCQlAIGFsbG9jYQorCWFkZAlyMixyMSxyMixsc2wjNglAIGxlbiB0byBwb2ludCBhdCB0aGUgZW5kIG9mIGlucAorCisJdmxkMS44CQl7cTB9LFtyMV0hCisJdmxkMS44CQl7cTF9LFtyMV0hCisJdmxkMS44CQl7cTJ9LFtyMV0hCisJdmxkMS44CQl7cTN9LFtyMV0hCisJdmxkMS4zMgkJe3E4fSxbcjE0LDoxMjhdIQorCXZsZDEuMzIJCXtxOX0sW3IxNCw6MTI4XSEKKwl2bGQxLjMyCQl7cTEwfSxbcjE0LDoxMjhdIQorCXZsZDEuMzIJCXtxMTF9LFtyMTQsOjEyOF0hCisJdnJldjMyLjgJcTAscTAJCUAgeWVzLCBldmVuIG9uCisJc3RyCQlyMCxbc3AsIzY0XQorCXZyZXYzMi44CXExLHExCQlAIGJpZy1lbmRpYW4KKwlzdHIJCXIxLFtzcCwjNjhdCisJbW92CQlyMSxzcAorCXZyZXYzMi44CXEyLHEyCisJc3RyCQlyMixbc3AsIzcyXQorCXZyZXYzMi44CXEzLHEzCisJc3RyCQlyMTIsW3NwLCM3Nl0JCUAgc2F2ZSBvcmlnaW5hbCBzcAorCXZhZGQuaTMyCXE4LHE4LHEwCisJdmFkZC5pMzIJcTkscTkscTEKKwl2c3QxLjMyCQl7cTh9LFtyMSw6MTI4XSEKKwl2YWRkLmkzMglxMTAscTEwLHEyCisJdnN0MS4zMgkJe3E5fSxbcjEsOjEyOF0hCisJdmFkZC5pMzIJcTExLHExMSxxMworCXZzdDEuMzIJCXtxMTB9LFtyMSw6MTI4XSEKKwl2c3QxLjMyCQl7cTExfSxbcjEsOjEyOF0hCisKKwlsZG1pYQkJcjAse3I0LXIxMX0KKwlzdWIJCXIxLHIxLCM2NAorCWxkcgkJcjIsW3NwLCMwXQorCWVvcgkJcjEyLHIxMixyMTIKKwllb3IJCXIzLHI1LHI2CisJYgkJLkxfMDBfNDgKKworLmFsaWduCTQKKy5MXzAwXzQ4OgorCXZleHQuOAlxOCxxMCxxMSwjNAorCWFkZAlyMTEscjExLHIyCisJZW9yCXIyLHI5LHIxMAorCWVvcglyMCxyOCxyOCxyb3IjNQorCXZleHQuOAlxOSxxMixxMywjNAorCWFkZAlyNCxyNCxyMTIKKwlhbmQJcjIscjIscjgKKwllb3IJcjEyLHIwLHI4LHJvciMxOQorCXZzaHIudTMyCXExMCxxOCwjNworCWVvcglyMCxyNCxyNCxyb3IjMTEKKwllb3IJcjIscjIscjEwCisJdmFkZC5pMzIJcTAscTAscTkKKwlhZGQJcjExLHIxMSxyMTIscm9yIzYKKwllb3IJcjEyLHI0LHI1CisJdnNoci51MzIJcTkscTgsIzMKKwllb3IJcjAscjAscjQscm9yIzIwCisJYWRkCXIxMSxyMTEscjIKKwl2c2xpLjMyCXExMCxxOCwjMjUKKwlsZHIJcjIsW3NwLCM0XQorCWFuZAlyMyxyMyxyMTIKKwl2c2hyLnUzMglxMTEscTgsIzE4CisJYWRkCXI3LHI3LHIxMQorCWFkZAlyMTEscjExLHIwLHJvciMyCisJZW9yCXIzLHIzLHI1CisJdmVvcglxOSxxOSxxMTAKKwlhZGQJcjEwLHIxMCxyMgorCXZzbGkuMzIJcTExLHE4LCMxNAorCWVvcglyMixyOCxyOQorCWVvcglyMCxyNyxyNyxyb3IjNQorCXZzaHIudTMyCWQyNCxkNywjMTcKKwlhZGQJcjExLHIxMSxyMworCWFuZAlyMixyMixyNworCXZlb3IJcTkscTkscTExCisJZW9yCXIzLHIwLHI3LHJvciMxOQorCWVvcglyMCxyMTEscjExLHJvciMxMQorCXZzbGkuMzIJZDI0LGQ3LCMxNQorCWVvcglyMixyMixyOQorCWFkZAlyMTAscjEwLHIzLHJvciM2CisJdnNoci51MzIJZDI1LGQ3LCMxMAorCWVvcglyMyxyMTEscjQKKwllb3IJcjAscjAscjExLHJvciMyMAorCXZhZGQuaTMyCXEwLHEwLHE5CisJYWRkCXIxMCxyMTAscjIKKwlsZHIJcjIsW3NwLCM4XQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhbmQJcjEyLHIxMixyMworCWFkZAlyNixyNixyMTAKKwl2c2hyLnUzMglkMjQsZDcsIzE5CisJYWRkCXIxMCxyMTAscjAscm9yIzIKKwllb3IJcjEyLHIxMixyNAorCXZzbGkuMzIJZDI0LGQ3LCMxMworCWFkZAlyOSxyOSxyMgorCWVvcglyMixyNyxyOAorCXZlb3IJZDI1LGQyNSxkMjQKKwllb3IJcjAscjYscjYscm9yIzUKKwlhZGQJcjEwLHIxMCxyMTIKKwl2YWRkLmkzMglkMCxkMCxkMjUKKwlhbmQJcjIscjIscjYKKwllb3IJcjEyLHIwLHI2LHJvciMxOQorCXZzaHIudTMyCWQyNCxkMCwjMTcKKwllb3IJcjAscjEwLHIxMCxyb3IjMTEKKwllb3IJcjIscjIscjgKKwl2c2xpLjMyCWQyNCxkMCwjMTUKKwlhZGQJcjkscjkscjEyLHJvciM2CisJZW9yCXIxMixyMTAscjExCisJdnNoci51MzIJZDI1LGQwLCMxMAorCWVvcglyMCxyMCxyMTAscm9yIzIwCisJYWRkCXI5LHI5LHIyCisJdmVvcglkMjUsZDI1LGQyNAorCWxkcglyMixbc3AsIzEyXQorCWFuZAlyMyxyMyxyMTIKKwl2c2hyLnUzMglkMjQsZDAsIzE5CisJYWRkCXI1LHI1LHI5CisJYWRkCXI5LHI5LHIwLHJvciMyCisJZW9yCXIzLHIzLHIxMQorCXZsZDEuMzIJe3E4fSxbcjE0LDoxMjhdIQorCWFkZAlyOCxyOCxyMgorCXZzbGkuMzIJZDI0LGQwLCMxMworCWVvcglyMixyNixyNworCWVvcglyMCxyNSxyNSxyb3IjNQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhZGQJcjkscjkscjMKKwlhbmQJcjIscjIscjUKKwl2YWRkLmkzMglkMSxkMSxkMjUKKwllb3IJcjMscjAscjUscm9yIzE5CisJZW9yCXIwLHI5LHI5LHJvciMxMQorCXZhZGQuaTMyCXE4LHE4LHEwCisJZW9yCXIyLHIyLHI3CisJYWRkCXI4LHI4LHIzLHJvciM2CisJZW9yCXIzLHI5LHIxMAorCWVvcglyMCxyMCxyOSxyb3IjMjAKKwlhZGQJcjgscjgscjIKKwlsZHIJcjIsW3NwLCMxNl0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyNCxyNCxyOAorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJYWRkCXI4LHI4LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjEwCisJdmV4dC44CXE4LHExLHEyLCM0CisJYWRkCXI3LHI3LHIyCisJZW9yCXIyLHI1LHI2CisJZW9yCXIwLHI0LHI0LHJvciM1CisJdmV4dC44CXE5LHEzLHEwLCM0CisJYWRkCXI4LHI4LHIxMgorCWFuZAlyMixyMixyNAorCWVvcglyMTIscjAscjQscm9yIzE5CisJdnNoci51MzIJcTEwLHE4LCM3CisJZW9yCXIwLHI4LHI4LHJvciMxMQorCWVvcglyMixyMixyNgorCXZhZGQuaTMyCXExLHExLHE5CisJYWRkCXI3LHI3LHIxMixyb3IjNgorCWVvcglyMTIscjgscjkKKwl2c2hyLnUzMglxOSxxOCwjMworCWVvcglyMCxyMCxyOCxyb3IjMjAKKwlhZGQJcjcscjcscjIKKwl2c2xpLjMyCXExMCxxOCwjMjUKKwlsZHIJcjIsW3NwLCMyMF0KKwlhbmQJcjMscjMscjEyCisJdnNoci51MzIJcTExLHE4LCMxOAorCWFkZAlyMTEscjExLHI3CisJYWRkCXI3LHI3LHIwLHJvciMyCisJZW9yCXIzLHIzLHI5CisJdmVvcglxOSxxOSxxMTAKKwlhZGQJcjYscjYscjIKKwl2c2xpLjMyCXExMSxxOCwjMTQKKwllb3IJcjIscjQscjUKKwllb3IJcjAscjExLHIxMSxyb3IjNQorCXZzaHIudTMyCWQyNCxkMSwjMTcKKwlhZGQJcjcscjcscjMKKwlhbmQJcjIscjIscjExCisJdmVvcglxOSxxOSxxMTEKKwllb3IJcjMscjAscjExLHJvciMxOQorCWVvcglyMCxyNyxyNyxyb3IjMTEKKwl2c2xpLjMyCWQyNCxkMSwjMTUKKwllb3IJcjIscjIscjUKKwlhZGQJcjYscjYscjMscm9yIzYKKwl2c2hyLnUzMglkMjUsZDEsIzEwCisJZW9yCXIzLHI3LHI4CisJZW9yCXIwLHIwLHI3LHJvciMyMAorCXZhZGQuaTMyCXExLHExLHE5CisJYWRkCXI2LHI2LHIyCisJbGRyCXIyLFtzcCwjMjRdCisJdmVvcglkMjUsZDI1LGQyNAorCWFuZAlyMTIscjEyLHIzCisJYWRkCXIxMCxyMTAscjYKKwl2c2hyLnUzMglkMjQsZDEsIzE5CisJYWRkCXI2LHI2LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjgKKwl2c2xpLjMyCWQyNCxkMSwjMTMKKwlhZGQJcjUscjUscjIKKwllb3IJcjIscjExLHI0CisJdmVvcglkMjUsZDI1LGQyNAorCWVvcglyMCxyMTAscjEwLHJvciM1CisJYWRkCXI2LHI2LHIxMgorCXZhZGQuaTMyCWQyLGQyLGQyNQorCWFuZAlyMixyMixyMTAKKwllb3IJcjEyLHIwLHIxMCxyb3IjMTkKKwl2c2hyLnUzMglkMjQsZDIsIzE3CisJZW9yCXIwLHI2LHI2LHJvciMxMQorCWVvcglyMixyMixyNAorCXZzbGkuMzIJZDI0LGQyLCMxNQorCWFkZAlyNSxyNSxyMTIscm9yIzYKKwllb3IJcjEyLHI2LHI3CisJdnNoci51MzIJZDI1LGQyLCMxMAorCWVvcglyMCxyMCxyNixyb3IjMjAKKwlhZGQJcjUscjUscjIKKwl2ZW9yCWQyNSxkMjUsZDI0CisJbGRyCXIyLFtzcCwjMjhdCisJYW5kCXIzLHIzLHIxMgorCXZzaHIudTMyCWQyNCxkMiwjMTkKKwlhZGQJcjkscjkscjUKKwlhZGQJcjUscjUscjAscm9yIzIKKwllb3IJcjMscjMscjcKKwl2bGQxLjMyCXtxOH0sW3IxNCw6MTI4XSEKKwlhZGQJcjQscjQscjIKKwl2c2xpLjMyCWQyNCxkMiwjMTMKKwllb3IJcjIscjEwLHIxMQorCWVvcglyMCxyOSxyOSxyb3IjNQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhZGQJcjUscjUscjMKKwlhbmQJcjIscjIscjkKKwl2YWRkLmkzMglkMyxkMyxkMjUKKwllb3IJcjMscjAscjkscm9yIzE5CisJZW9yCXIwLHI1LHI1LHJvciMxMQorCXZhZGQuaTMyCXE4LHE4LHExCisJZW9yCXIyLHIyLHIxMQorCWFkZAlyNCxyNCxyMyxyb3IjNgorCWVvcglyMyxyNSxyNgorCWVvcglyMCxyMCxyNSxyb3IjMjAKKwlhZGQJcjQscjQscjIKKwlsZHIJcjIsW3NwLCMzMl0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyOCxyOCxyNAorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJYWRkCXI0LHI0LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjYKKwl2ZXh0LjgJcTgscTIscTMsIzQKKwlhZGQJcjExLHIxMSxyMgorCWVvcglyMixyOSxyMTAKKwllb3IJcjAscjgscjgscm9yIzUKKwl2ZXh0LjgJcTkscTAscTEsIzQKKwlhZGQJcjQscjQscjEyCisJYW5kCXIyLHIyLHI4CisJZW9yCXIxMixyMCxyOCxyb3IjMTkKKwl2c2hyLnUzMglxMTAscTgsIzcKKwllb3IJcjAscjQscjQscm9yIzExCisJZW9yCXIyLHIyLHIxMAorCXZhZGQuaTMyCXEyLHEyLHE5CisJYWRkCXIxMSxyMTEscjEyLHJvciM2CisJZW9yCXIxMixyNCxyNQorCXZzaHIudTMyCXE5LHE4LCMzCisJZW9yCXIwLHIwLHI0LHJvciMyMAorCWFkZAlyMTEscjExLHIyCisJdnNsaS4zMglxMTAscTgsIzI1CisJbGRyCXIyLFtzcCwjMzZdCisJYW5kCXIzLHIzLHIxMgorCXZzaHIudTMyCXExMSxxOCwjMTgKKwlhZGQJcjcscjcscjExCisJYWRkCXIxMSxyMTEscjAscm9yIzIKKwllb3IJcjMscjMscjUKKwl2ZW9yCXE5LHE5LHExMAorCWFkZAlyMTAscjEwLHIyCisJdnNsaS4zMglxMTEscTgsIzE0CisJZW9yCXIyLHI4LHI5CisJZW9yCXIwLHI3LHI3LHJvciM1CisJdnNoci51MzIJZDI0LGQzLCMxNworCWFkZAlyMTEscjExLHIzCisJYW5kCXIyLHIyLHI3CisJdmVvcglxOSxxOSxxMTEKKwllb3IJcjMscjAscjcscm9yIzE5CisJZW9yCXIwLHIxMSxyMTEscm9yIzExCisJdnNsaS4zMglkMjQsZDMsIzE1CisJZW9yCXIyLHIyLHI5CisJYWRkCXIxMCxyMTAscjMscm9yIzYKKwl2c2hyLnUzMglkMjUsZDMsIzEwCisJZW9yCXIzLHIxMSxyNAorCWVvcglyMCxyMCxyMTEscm9yIzIwCisJdmFkZC5pMzIJcTIscTIscTkKKwlhZGQJcjEwLHIxMCxyMgorCWxkcglyMixbc3AsIzQwXQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhbmQJcjEyLHIxMixyMworCWFkZAlyNixyNixyMTAKKwl2c2hyLnUzMglkMjQsZDMsIzE5CisJYWRkCXIxMCxyMTAscjAscm9yIzIKKwllb3IJcjEyLHIxMixyNAorCXZzbGkuMzIJZDI0LGQzLCMxMworCWFkZAlyOSxyOSxyMgorCWVvcglyMixyNyxyOAorCXZlb3IJZDI1LGQyNSxkMjQKKwllb3IJcjAscjYscjYscm9yIzUKKwlhZGQJcjEwLHIxMCxyMTIKKwl2YWRkLmkzMglkNCxkNCxkMjUKKwlhbmQJcjIscjIscjYKKwllb3IJcjEyLHIwLHI2LHJvciMxOQorCXZzaHIudTMyCWQyNCxkNCwjMTcKKwllb3IJcjAscjEwLHIxMCxyb3IjMTEKKwllb3IJcjIscjIscjgKKwl2c2xpLjMyCWQyNCxkNCwjMTUKKwlhZGQJcjkscjkscjEyLHJvciM2CisJZW9yCXIxMixyMTAscjExCisJdnNoci51MzIJZDI1LGQ0LCMxMAorCWVvcglyMCxyMCxyMTAscm9yIzIwCisJYWRkCXI5LHI5LHIyCisJdmVvcglkMjUsZDI1LGQyNAorCWxkcglyMixbc3AsIzQ0XQorCWFuZAlyMyxyMyxyMTIKKwl2c2hyLnUzMglkMjQsZDQsIzE5CisJYWRkCXI1LHI1LHI5CisJYWRkCXI5LHI5LHIwLHJvciMyCisJZW9yCXIzLHIzLHIxMQorCXZsZDEuMzIJe3E4fSxbcjE0LDoxMjhdIQorCWFkZAlyOCxyOCxyMgorCXZzbGkuMzIJZDI0LGQ0LCMxMworCWVvcglyMixyNixyNworCWVvcglyMCxyNSxyNSxyb3IjNQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhZGQJcjkscjkscjMKKwlhbmQJcjIscjIscjUKKwl2YWRkLmkzMglkNSxkNSxkMjUKKwllb3IJcjMscjAscjUscm9yIzE5CisJZW9yCXIwLHI5LHI5LHJvciMxMQorCXZhZGQuaTMyCXE4LHE4LHEyCisJZW9yCXIyLHIyLHI3CisJYWRkCXI4LHI4LHIzLHJvciM2CisJZW9yCXIzLHI5LHIxMAorCWVvcglyMCxyMCxyOSxyb3IjMjAKKwlhZGQJcjgscjgscjIKKwlsZHIJcjIsW3NwLCM0OF0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyNCxyNCxyOAorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJYWRkCXI4LHI4LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjEwCisJdmV4dC44CXE4LHEzLHEwLCM0CisJYWRkCXI3LHI3LHIyCisJZW9yCXIyLHI1LHI2CisJZW9yCXIwLHI0LHI0LHJvciM1CisJdmV4dC44CXE5LHExLHEyLCM0CisJYWRkCXI4LHI4LHIxMgorCWFuZAlyMixyMixyNAorCWVvcglyMTIscjAscjQscm9yIzE5CisJdnNoci51MzIJcTEwLHE4LCM3CisJZW9yCXIwLHI4LHI4LHJvciMxMQorCWVvcglyMixyMixyNgorCXZhZGQuaTMyCXEzLHEzLHE5CisJYWRkCXI3LHI3LHIxMixyb3IjNgorCWVvcglyMTIscjgscjkKKwl2c2hyLnUzMglxOSxxOCwjMworCWVvcglyMCxyMCxyOCxyb3IjMjAKKwlhZGQJcjcscjcscjIKKwl2c2xpLjMyCXExMCxxOCwjMjUKKwlsZHIJcjIsW3NwLCM1Ml0KKwlhbmQJcjMscjMscjEyCisJdnNoci51MzIJcTExLHE4LCMxOAorCWFkZAlyMTEscjExLHI3CisJYWRkCXI3LHI3LHIwLHJvciMyCisJZW9yCXIzLHIzLHI5CisJdmVvcglxOSxxOSxxMTAKKwlhZGQJcjYscjYscjIKKwl2c2xpLjMyCXExMSxxOCwjMTQKKwllb3IJcjIscjQscjUKKwllb3IJcjAscjExLHIxMSxyb3IjNQorCXZzaHIudTMyCWQyNCxkNSwjMTcKKwlhZGQJcjcscjcscjMKKwlhbmQJcjIscjIscjExCisJdmVvcglxOSxxOSxxMTEKKwllb3IJcjMscjAscjExLHJvciMxOQorCWVvcglyMCxyNyxyNyxyb3IjMTEKKwl2c2xpLjMyCWQyNCxkNSwjMTUKKwllb3IJcjIscjIscjUKKwlhZGQJcjYscjYscjMscm9yIzYKKwl2c2hyLnUzMglkMjUsZDUsIzEwCisJZW9yCXIzLHI3LHI4CisJZW9yCXIwLHIwLHI3LHJvciMyMAorCXZhZGQuaTMyCXEzLHEzLHE5CisJYWRkCXI2LHI2LHIyCisJbGRyCXIyLFtzcCwjNTZdCisJdmVvcglkMjUsZDI1LGQyNAorCWFuZAlyMTIscjEyLHIzCisJYWRkCXIxMCxyMTAscjYKKwl2c2hyLnUzMglkMjQsZDUsIzE5CisJYWRkCXI2LHI2LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjgKKwl2c2xpLjMyCWQyNCxkNSwjMTMKKwlhZGQJcjUscjUscjIKKwllb3IJcjIscjExLHI0CisJdmVvcglkMjUsZDI1LGQyNAorCWVvcglyMCxyMTAscjEwLHJvciM1CisJYWRkCXI2LHI2LHIxMgorCXZhZGQuaTMyCWQ2LGQ2LGQyNQorCWFuZAlyMixyMixyMTAKKwllb3IJcjEyLHIwLHIxMCxyb3IjMTkKKwl2c2hyLnUzMglkMjQsZDYsIzE3CisJZW9yCXIwLHI2LHI2LHJvciMxMQorCWVvcglyMixyMixyNAorCXZzbGkuMzIJZDI0LGQ2LCMxNQorCWFkZAlyNSxyNSxyMTIscm9yIzYKKwllb3IJcjEyLHI2LHI3CisJdnNoci51MzIJZDI1LGQ2LCMxMAorCWVvcglyMCxyMCxyNixyb3IjMjAKKwlhZGQJcjUscjUscjIKKwl2ZW9yCWQyNSxkMjUsZDI0CisJbGRyCXIyLFtzcCwjNjBdCisJYW5kCXIzLHIzLHIxMgorCXZzaHIudTMyCWQyNCxkNiwjMTkKKwlhZGQJcjkscjkscjUKKwlhZGQJcjUscjUscjAscm9yIzIKKwllb3IJcjMscjMscjcKKwl2bGQxLjMyCXtxOH0sW3IxNCw6MTI4XSEKKwlhZGQJcjQscjQscjIKKwl2c2xpLjMyCWQyNCxkNiwjMTMKKwllb3IJcjIscjEwLHIxMQorCWVvcglyMCxyOSxyOSxyb3IjNQorCXZlb3IJZDI1LGQyNSxkMjQKKwlhZGQJcjUscjUscjMKKwlhbmQJcjIscjIscjkKKwl2YWRkLmkzMglkNyxkNyxkMjUKKwllb3IJcjMscjAscjkscm9yIzE5CisJZW9yCXIwLHI1LHI1LHJvciMxMQorCXZhZGQuaTMyCXE4LHE4LHEzCisJZW9yCXIyLHIyLHIxMQorCWFkZAlyNCxyNCxyMyxyb3IjNgorCWVvcglyMyxyNSxyNgorCWVvcglyMCxyMCxyNSxyb3IjMjAKKwlhZGQJcjQscjQscjIKKwlsZHIJcjIsW3IxNF0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyOCxyOCxyNAorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJYWRkCXI0LHI0LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjYKKwl0ZXEJcjIsIzAJCQkJQCBjaGVjayBmb3IgSzI1NiB0ZXJtaW5hdG9yCisJbGRyCXIyLFtzcCwjMF0KKwlzdWIJcjEscjEsIzY0CisJYm5lCS5MXzAwXzQ4CisKKwlsZHIJCXIxLFtzcCwjNjhdCisJbGRyCQlyMCxbc3AsIzcyXQorCXN1YgkJcjE0LHIxNCwjMjU2CUAgcmV3aW5kIHIxNAorCXRlcQkJcjEscjAKKwlpdAkJZXEKKwlzdWJlcQkJcjEscjEsIzY0CQlAIGF2b2lkIFNFR1YKKwl2bGQxLjgJCXtxMH0sW3IxXSEJCUAgbG9hZCBuZXh0IGlucHV0IGJsb2NrCisJdmxkMS44CQl7cTF9LFtyMV0hCisJdmxkMS44CQl7cTJ9LFtyMV0hCisJdmxkMS44CQl7cTN9LFtyMV0hCisJaXQJCW5lCisJc3RybmUJCXIxLFtzcCwjNjhdCisJbW92CQlyMSxzcAorCWFkZAlyMTEscjExLHIyCisJZW9yCXIyLHI5LHIxMAorCWVvcglyMCxyOCxyOCxyb3IjNQorCWFkZAlyNCxyNCxyMTIKKwl2bGQxLjMyCXtxOH0sW3IxNCw6MTI4XSEKKwlhbmQJcjIscjIscjgKKwllb3IJcjEyLHIwLHI4LHJvciMxOQorCWVvcglyMCxyNCxyNCxyb3IjMTEKKwllb3IJcjIscjIscjEwCisJdnJldjMyLjgJcTAscTAKKwlhZGQJcjExLHIxMSxyMTIscm9yIzYKKwllb3IJcjEyLHI0LHI1CisJZW9yCXIwLHIwLHI0LHJvciMyMAorCWFkZAlyMTEscjExLHIyCisJdmFkZC5pMzIJcTgscTgscTAKKwlsZHIJcjIsW3NwLCM0XQorCWFuZAlyMyxyMyxyMTIKKwlhZGQJcjcscjcscjExCisJYWRkCXIxMSxyMTEscjAscm9yIzIKKwllb3IJcjMscjMscjUKKwlhZGQJcjEwLHIxMCxyMgorCWVvcglyMixyOCxyOQorCWVvcglyMCxyNyxyNyxyb3IjNQorCWFkZAlyMTEscjExLHIzCisJYW5kCXIyLHIyLHI3CisJZW9yCXIzLHIwLHI3LHJvciMxOQorCWVvcglyMCxyMTEscjExLHJvciMxMQorCWVvcglyMixyMixyOQorCWFkZAlyMTAscjEwLHIzLHJvciM2CisJZW9yCXIzLHIxMSxyNAorCWVvcglyMCxyMCxyMTEscm9yIzIwCisJYWRkCXIxMCxyMTAscjIKKwlsZHIJcjIsW3NwLCM4XQorCWFuZAlyMTIscjEyLHIzCisJYWRkCXI2LHI2LHIxMAorCWFkZAlyMTAscjEwLHIwLHJvciMyCisJZW9yCXIxMixyMTIscjQKKwlhZGQJcjkscjkscjIKKwllb3IJcjIscjcscjgKKwllb3IJcjAscjYscjYscm9yIzUKKwlhZGQJcjEwLHIxMCxyMTIKKwlhbmQJcjIscjIscjYKKwllb3IJcjEyLHIwLHI2LHJvciMxOQorCWVvcglyMCxyMTAscjEwLHJvciMxMQorCWVvcglyMixyMixyOAorCWFkZAlyOSxyOSxyMTIscm9yIzYKKwllb3IJcjEyLHIxMCxyMTEKKwllb3IJcjAscjAscjEwLHJvciMyMAorCWFkZAlyOSxyOSxyMgorCWxkcglyMixbc3AsIzEyXQorCWFuZAlyMyxyMyxyMTIKKwlhZGQJcjUscjUscjkKKwlhZGQJcjkscjkscjAscm9yIzIKKwllb3IJcjMscjMscjExCisJYWRkCXI4LHI4LHIyCisJZW9yCXIyLHI2LHI3CisJZW9yCXIwLHI1LHI1LHJvciM1CisJYWRkCXI5LHI5LHIzCisJYW5kCXIyLHIyLHI1CisJZW9yCXIzLHIwLHI1LHJvciMxOQorCWVvcglyMCxyOSxyOSxyb3IjMTEKKwllb3IJcjIscjIscjcKKwlhZGQJcjgscjgscjMscm9yIzYKKwllb3IJcjMscjkscjEwCisJZW9yCXIwLHIwLHI5LHJvciMyMAorCWFkZAlyOCxyOCxyMgorCWxkcglyMixbc3AsIzE2XQorCWFuZAlyMTIscjEyLHIzCisJYWRkCXI0LHI0LHI4CisJYWRkCXI4LHI4LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjEwCisJdnN0MS4zMgl7cTh9LFtyMSw6MTI4XSEKKwlhZGQJcjcscjcscjIKKwllb3IJcjIscjUscjYKKwllb3IJcjAscjQscjQscm9yIzUKKwlhZGQJcjgscjgscjEyCisJdmxkMS4zMgl7cTh9LFtyMTQsOjEyOF0hCisJYW5kCXIyLHIyLHI0CisJZW9yCXIxMixyMCxyNCxyb3IjMTkKKwllb3IJcjAscjgscjgscm9yIzExCisJZW9yCXIyLHIyLHI2CisJdnJldjMyLjgJcTEscTEKKwlhZGQJcjcscjcscjEyLHJvciM2CisJZW9yCXIxMixyOCxyOQorCWVvcglyMCxyMCxyOCxyb3IjMjAKKwlhZGQJcjcscjcscjIKKwl2YWRkLmkzMglxOCxxOCxxMQorCWxkcglyMixbc3AsIzIwXQorCWFuZAlyMyxyMyxyMTIKKwlhZGQJcjExLHIxMSxyNworCWFkZAlyNyxyNyxyMCxyb3IjMgorCWVvcglyMyxyMyxyOQorCWFkZAlyNixyNixyMgorCWVvcglyMixyNCxyNQorCWVvcglyMCxyMTEscjExLHJvciM1CisJYWRkCXI3LHI3LHIzCisJYW5kCXIyLHIyLHIxMQorCWVvcglyMyxyMCxyMTEscm9yIzE5CisJZW9yCXIwLHI3LHI3LHJvciMxMQorCWVvcglyMixyMixyNQorCWFkZAlyNixyNixyMyxyb3IjNgorCWVvcglyMyxyNyxyOAorCWVvcglyMCxyMCxyNyxyb3IjMjAKKwlhZGQJcjYscjYscjIKKwlsZHIJcjIsW3NwLCMyNF0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyMTAscjEwLHI2CisJYWRkCXI2LHI2LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjgKKwlhZGQJcjUscjUscjIKKwllb3IJcjIscjExLHI0CisJZW9yCXIwLHIxMCxyMTAscm9yIzUKKwlhZGQJcjYscjYscjEyCisJYW5kCXIyLHIyLHIxMAorCWVvcglyMTIscjAscjEwLHJvciMxOQorCWVvcglyMCxyNixyNixyb3IjMTEKKwllb3IJcjIscjIscjQKKwlhZGQJcjUscjUscjEyLHJvciM2CisJZW9yCXIxMixyNixyNworCWVvcglyMCxyMCxyNixyb3IjMjAKKwlhZGQJcjUscjUscjIKKwlsZHIJcjIsW3NwLCMyOF0KKwlhbmQJcjMscjMscjEyCisJYWRkCXI5LHI5LHI1CisJYWRkCXI1LHI1LHIwLHJvciMyCisJZW9yCXIzLHIzLHI3CisJYWRkCXI0LHI0LHIyCisJZW9yCXIyLHIxMCxyMTEKKwllb3IJcjAscjkscjkscm9yIzUKKwlhZGQJcjUscjUscjMKKwlhbmQJcjIscjIscjkKKwllb3IJcjMscjAscjkscm9yIzE5CisJZW9yCXIwLHI1LHI1LHJvciMxMQorCWVvcglyMixyMixyMTEKKwlhZGQJcjQscjQscjMscm9yIzYKKwllb3IJcjMscjUscjYKKwllb3IJcjAscjAscjUscm9yIzIwCisJYWRkCXI0LHI0LHIyCisJbGRyCXIyLFtzcCwjMzJdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjgscjgscjQKKwlhZGQJcjQscjQscjAscm9yIzIKKwllb3IJcjEyLHIxMixyNgorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJYWRkCXIxMSxyMTEscjIKKwllb3IJcjIscjkscjEwCisJZW9yCXIwLHI4LHI4LHJvciM1CisJYWRkCXI0LHI0LHIxMgorCXZsZDEuMzIJe3E4fSxbcjE0LDoxMjhdIQorCWFuZAlyMixyMixyOAorCWVvcglyMTIscjAscjgscm9yIzE5CisJZW9yCXIwLHI0LHI0LHJvciMxMQorCWVvcglyMixyMixyMTAKKwl2cmV2MzIuOAlxMixxMgorCWFkZAlyMTEscjExLHIxMixyb3IjNgorCWVvcglyMTIscjQscjUKKwllb3IJcjAscjAscjQscm9yIzIwCisJYWRkCXIxMSxyMTEscjIKKwl2YWRkLmkzMglxOCxxOCxxMgorCWxkcglyMixbc3AsIzM2XQorCWFuZAlyMyxyMyxyMTIKKwlhZGQJcjcscjcscjExCisJYWRkCXIxMSxyMTEscjAscm9yIzIKKwllb3IJcjMscjMscjUKKwlhZGQJcjEwLHIxMCxyMgorCWVvcglyMixyOCxyOQorCWVvcglyMCxyNyxyNyxyb3IjNQorCWFkZAlyMTEscjExLHIzCisJYW5kCXIyLHIyLHI3CisJZW9yCXIzLHIwLHI3LHJvciMxOQorCWVvcglyMCxyMTEscjExLHJvciMxMQorCWVvcglyMixyMixyOQorCWFkZAlyMTAscjEwLHIzLHJvciM2CisJZW9yCXIzLHIxMSxyNAorCWVvcglyMCxyMCxyMTEscm9yIzIwCisJYWRkCXIxMCxyMTAscjIKKwlsZHIJcjIsW3NwLCM0MF0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyNixyNixyMTAKKwlhZGQJcjEwLHIxMCxyMCxyb3IjMgorCWVvcglyMTIscjEyLHI0CisJYWRkCXI5LHI5LHIyCisJZW9yCXIyLHI3LHI4CisJZW9yCXIwLHI2LHI2LHJvciM1CisJYWRkCXIxMCxyMTAscjEyCisJYW5kCXIyLHIyLHI2CisJZW9yCXIxMixyMCxyNixyb3IjMTkKKwllb3IJcjAscjEwLHIxMCxyb3IjMTEKKwllb3IJcjIscjIscjgKKwlhZGQJcjkscjkscjEyLHJvciM2CisJZW9yCXIxMixyMTAscjExCisJZW9yCXIwLHIwLHIxMCxyb3IjMjAKKwlhZGQJcjkscjkscjIKKwlsZHIJcjIsW3NwLCM0NF0KKwlhbmQJcjMscjMscjEyCisJYWRkCXI1LHI1LHI5CisJYWRkCXI5LHI5LHIwLHJvciMyCisJZW9yCXIzLHIzLHIxMQorCWFkZAlyOCxyOCxyMgorCWVvcglyMixyNixyNworCWVvcglyMCxyNSxyNSxyb3IjNQorCWFkZAlyOSxyOSxyMworCWFuZAlyMixyMixyNQorCWVvcglyMyxyMCxyNSxyb3IjMTkKKwllb3IJcjAscjkscjkscm9yIzExCisJZW9yCXIyLHIyLHI3CisJYWRkCXI4LHI4LHIzLHJvciM2CisJZW9yCXIzLHI5LHIxMAorCWVvcglyMCxyMCxyOSxyb3IjMjAKKwlhZGQJcjgscjgscjIKKwlsZHIJcjIsW3NwLCM0OF0KKwlhbmQJcjEyLHIxMixyMworCWFkZAlyNCxyNCxyOAorCWFkZAlyOCxyOCxyMCxyb3IjMgorCWVvcglyMTIscjEyLHIxMAorCXZzdDEuMzIJe3E4fSxbcjEsOjEyOF0hCisJYWRkCXI3LHI3LHIyCisJZW9yCXIyLHI1LHI2CisJZW9yCXIwLHI0LHI0LHJvciM1CisJYWRkCXI4LHI4LHIxMgorCXZsZDEuMzIJe3E4fSxbcjE0LDoxMjhdIQorCWFuZAlyMixyMixyNAorCWVvcglyMTIscjAscjQscm9yIzE5CisJZW9yCXIwLHI4LHI4LHJvciMxMQorCWVvcglyMixyMixyNgorCXZyZXYzMi44CXEzLHEzCisJYWRkCXI3LHI3LHIxMixyb3IjNgorCWVvcglyMTIscjgscjkKKwllb3IJcjAscjAscjgscm9yIzIwCisJYWRkCXI3LHI3LHIyCisJdmFkZC5pMzIJcTgscTgscTMKKwlsZHIJcjIsW3NwLCM1Ml0KKwlhbmQJcjMscjMscjEyCisJYWRkCXIxMSxyMTEscjcKKwlhZGQJcjcscjcscjAscm9yIzIKKwllb3IJcjMscjMscjkKKwlhZGQJcjYscjYscjIKKwllb3IJcjIscjQscjUKKwllb3IJcjAscjExLHIxMSxyb3IjNQorCWFkZAlyNyxyNyxyMworCWFuZAlyMixyMixyMTEKKwllb3IJcjMscjAscjExLHJvciMxOQorCWVvcglyMCxyNyxyNyxyb3IjMTEKKwllb3IJcjIscjIscjUKKwlhZGQJcjYscjYscjMscm9yIzYKKwllb3IJcjMscjcscjgKKwllb3IJcjAscjAscjcscm9yIzIwCisJYWRkCXI2LHI2LHIyCisJbGRyCXIyLFtzcCwjNTZdCisJYW5kCXIxMixyMTIscjMKKwlhZGQJcjEwLHIxMCxyNgorCWFkZAlyNixyNixyMCxyb3IjMgorCWVvcglyMTIscjEyLHI4CisJYWRkCXI1LHI1LHIyCisJZW9yCXIyLHIxMSxyNAorCWVvcglyMCxyMTAscjEwLHJvciM1CisJYWRkCXI2LHI2LHIxMgorCWFuZAlyMixyMixyMTAKKwllb3IJcjEyLHIwLHIxMCxyb3IjMTkKKwllb3IJcjAscjYscjYscm9yIzExCisJZW9yCXIyLHIyLHI0CisJYWRkCXI1LHI1LHIxMixyb3IjNgorCWVvcglyMTIscjYscjcKKwllb3IJcjAscjAscjYscm9yIzIwCisJYWRkCXI1LHI1LHIyCisJbGRyCXIyLFtzcCwjNjBdCisJYW5kCXIzLHIzLHIxMgorCWFkZAlyOSxyOSxyNQorCWFkZAlyNSxyNSxyMCxyb3IjMgorCWVvcglyMyxyMyxyNworCWFkZAlyNCxyNCxyMgorCWVvcglyMixyMTAscjExCisJZW9yCXIwLHI5LHI5LHJvciM1CisJYWRkCXI1LHI1LHIzCisJYW5kCXIyLHIyLHI5CisJZW9yCXIzLHIwLHI5LHJvciMxOQorCWVvcglyMCxyNSxyNSxyb3IjMTEKKwllb3IJcjIscjIscjExCisJYWRkCXI0LHI0LHIzLHJvciM2CisJZW9yCXIzLHI1LHI2CisJZW9yCXIwLHIwLHI1LHJvciMyMAorCWFkZAlyNCxyNCxyMgorCWxkcglyMixbc3AsIzY0XQorCWFuZAlyMTIscjEyLHIzCisJYWRkCXI4LHI4LHI0CisJYWRkCXI0LHI0LHIwLHJvciMyCisJZW9yCXIxMixyMTIscjYKKwl2c3QxLjMyCXtxOH0sW3IxLDoxMjhdIQorCWxkcglyMCxbcjIsIzBdCisJYWRkCXI0LHI0LHIxMgkJCUAgaCs9TWFqKGEsYixjKSBmcm9tIHRoZSBwYXN0CisJbGRyCXIxMixbcjIsIzRdCisJbGRyCXIzLFtyMiwjOF0KKwlsZHIJcjEsW3IyLCMxMl0KKwlhZGQJcjQscjQscjAJCQlAIGFjY3VtdWxhdGUKKwlsZHIJcjAsW3IyLCMxNl0KKwlhZGQJcjUscjUscjEyCisJbGRyCXIxMixbcjIsIzIwXQorCWFkZAlyNixyNixyMworCWxkcglyMyxbcjIsIzI0XQorCWFkZAlyNyxyNyxyMQorCWxkcglyMSxbcjIsIzI4XQorCWFkZAlyOCxyOCxyMAorCXN0cglyNCxbcjJdLCM0CisJYWRkCXI5LHI5LHIxMgorCXN0cglyNSxbcjJdLCM0CisJYWRkCXIxMCxyMTAscjMKKwlzdHIJcjYsW3IyXSwjNAorCWFkZAlyMTEscjExLHIxCisJc3RyCXI3LFtyMl0sIzQKKwlzdG1pYQlyMix7cjgtcjExfQorCisJaXR0dGUJbmUKKwltb3ZuZQlyMSxzcAorCWxkcm5lCXIyLFtzcCwjMF0KKwllb3JuZQlyMTIscjEyLHIxMgorCWxkcmVxCXNwLFtzcCwjNzZdCQkJQCByZXN0b3JlIG9yaWdpbmFsIHNwCisJaXR0CW5lCisJZW9ybmUJcjMscjUscjYKKwlibmUJLkxfMDBfNDgKKworCWxkbWlhCXNwISx7cjQtcjEyLHBjfQorLnNpemUJc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfbmVvbiwuLXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX25lb24KKyNlbmRpZgorI2lmIF9fQVJNX01BWF9BUkNIX18+PTcgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKworIyBpZmRlZiBfX3RodW1iMl9fCisjICBkZWZpbmUgSU5TVChhLGIsYyxkKQkuYnl0ZQljLGR8MHhjLGEsYgorIyBlbHNlCisjICBkZWZpbmUgSU5TVChhLGIsYyxkKQkuYnl0ZQlhLGIsYyxkCisjIGVuZGlmCisKKy50eXBlCXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2FybXY4LCVmdW5jdGlvbgorLmFsaWduCTUKK3NoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2FybXY4OgorLkxBUk12ODoKKwl2bGQxLjMyCXtxMCxxMX0sW3IwXQorIyBpZmRlZiBfX3RodW1iMl9fCisJYWRyCXIzLC5MQVJNdjgKKwlzdWIJcjMscjMsIy5MQVJNdjgtSzI1NgorIyBlbHNlCisJYWRybAlyMyxLMjU2CisjIGVuZGlmCisJYWRkCXIyLHIxLHIyLGxzbCM2CUAgbGVuIHRvIHBvaW50IGF0IHRoZSBlbmQgb2YgaW5wCisKKy5Mb29wX3Y4OgorCXZsZDEuOAkJe3E4LXE5fSxbcjFdIQorCXZsZDEuOAkJe3ExMC1xMTF9LFtyMV0hCisJdmxkMS4zMgkJe3ExMn0sW3IzXSEKKwl2cmV2MzIuOAlxOCxxOAorCXZyZXYzMi44CXE5LHE5CisJdnJldjMyLjgJcTEwLHExMAorCXZyZXYzMi44CXExMSxxMTEKKwl2bW92CQlxMTQscTAJQCBvZmZsb2FkCisJdm1vdgkJcTE1LHExCisJdGVxCQlyMSxyMgorCXZsZDEuMzIJCXtxMTN9LFtyM10hCisJdmFkZC5pMzIJcTEyLHExMixxOAorCUlOU1QoMHhlMiwweDAzLDB4ZmEsMHhmMykJQCBzaGEyNTZzdTAgcTgscTkKKwl2bW92CQlxMixxMAorCUlOU1QoMHg2OCwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMgorCUlOU1QoMHg2OCwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTIKKwlJTlNUKDB4ZTYsMHgwYywweDY0LDB4ZjMpCUAgc2hhMjU2c3UxIHE4LHExMCxxMTEKKwl2bGQxLjMyCQl7cTEyfSxbcjNdIQorCXZhZGQuaTMyCXExMyxxMTMscTkKKwlJTlNUKDB4ZTQsMHgyMywweGZhLDB4ZjMpCUAgc2hhMjU2c3UwIHE5LHExMAorCXZtb3YJCXEyLHEwCisJSU5TVCgweDZhLDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEzCisJSU5TVCgweDZhLDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMworCUlOU1QoMHhlMCwweDJjLDB4NjYsMHhmMykJQCBzaGEyNTZzdTEgcTkscTExLHE4CisJdmxkMS4zMgkJe3ExM30sW3IzXSEKKwl2YWRkLmkzMglxMTIscTEyLHExMAorCUlOU1QoMHhlNiwweDQzLDB4ZmEsMHhmMykJQCBzaGEyNTZzdTAgcTEwLHExMQorCXZtb3YJCXEyLHEwCisJSU5TVCgweDY4LDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEyCisJSU5TVCgweDY4LDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMgorCUlOU1QoMHhlMiwweDRjLDB4NjAsMHhmMykJQCBzaGEyNTZzdTEgcTEwLHE4LHE5CisJdmxkMS4zMgkJe3ExMn0sW3IzXSEKKwl2YWRkLmkzMglxMTMscTEzLHExMQorCUlOU1QoMHhlMCwweDYzLDB4ZmEsMHhmMykJQCBzaGEyNTZzdTAgcTExLHE4CisJdm1vdgkJcTIscTAKKwlJTlNUKDB4NmEsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTMKKwlJTlNUKDB4NmEsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEzCisJSU5TVCgweGU0LDB4NmMsMHg2MiwweGYzKQlAIHNoYTI1NnN1MSBxMTEscTkscTEwCisJdmxkMS4zMgkJe3ExM30sW3IzXSEKKwl2YWRkLmkzMglxMTIscTEyLHE4CisJSU5TVCgweGUyLDB4MDMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxOCxxOQorCXZtb3YJCXEyLHEwCisJSU5TVCgweDY4LDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEyCisJSU5TVCgweDY4LDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMgorCUlOU1QoMHhlNiwweDBjLDB4NjQsMHhmMykJQCBzaGEyNTZzdTEgcTgscTEwLHExMQorCXZsZDEuMzIJCXtxMTJ9LFtyM10hCisJdmFkZC5pMzIJcTEzLHExMyxxOQorCUlOU1QoMHhlNCwweDIzLDB4ZmEsMHhmMykJQCBzaGEyNTZzdTAgcTkscTEwCisJdm1vdgkJcTIscTAKKwlJTlNUKDB4NmEsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTMKKwlJTlNUKDB4NmEsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEzCisJSU5TVCgweGUwLDB4MmMsMHg2NiwweGYzKQlAIHNoYTI1NnN1MSBxOSxxMTEscTgKKwl2bGQxLjMyCQl7cTEzfSxbcjNdIQorCXZhZGQuaTMyCXExMixxMTIscTEwCisJSU5TVCgweGU2LDB4NDMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxMTAscTExCisJdm1vdgkJcTIscTAKKwlJTlNUKDB4NjgsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTIKKwlJTlNUKDB4NjgsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEyCisJSU5TVCgweGUyLDB4NGMsMHg2MCwweGYzKQlAIHNoYTI1NnN1MSBxMTAscTgscTkKKwl2bGQxLjMyCQl7cTEyfSxbcjNdIQorCXZhZGQuaTMyCXExMyxxMTMscTExCisJSU5TVCgweGUwLDB4NjMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxMTEscTgKKwl2bW92CQlxMixxMAorCUlOU1QoMHg2YSwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMworCUlOU1QoMHg2YSwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTMKKwlJTlNUKDB4ZTQsMHg2YywweDYyLDB4ZjMpCUAgc2hhMjU2c3UxIHExMSxxOSxxMTAKKwl2bGQxLjMyCQl7cTEzfSxbcjNdIQorCXZhZGQuaTMyCXExMixxMTIscTgKKwlJTlNUKDB4ZTIsMHgwMywweGZhLDB4ZjMpCUAgc2hhMjU2c3UwIHE4LHE5CisJdm1vdgkJcTIscTAKKwlJTlNUKDB4NjgsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTIKKwlJTlNUKDB4NjgsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEyCisJSU5TVCgweGU2LDB4MGMsMHg2NCwweGYzKQlAIHNoYTI1NnN1MSBxOCxxMTAscTExCisJdmxkMS4zMgkJe3ExMn0sW3IzXSEKKwl2YWRkLmkzMglxMTMscTEzLHE5CisJSU5TVCgweGU0LDB4MjMsMHhmYSwweGYzKQlAIHNoYTI1NnN1MCBxOSxxMTAKKwl2bW92CQlxMixxMAorCUlOU1QoMHg2YSwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMworCUlOU1QoMHg2YSwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTMKKwlJTlNUKDB4ZTAsMHgyYywweDY2LDB4ZjMpCUAgc2hhMjU2c3UxIHE5LHExMSxxOAorCXZsZDEuMzIJCXtxMTN9LFtyM10hCisJdmFkZC5pMzIJcTEyLHExMixxMTAKKwlJTlNUKDB4ZTYsMHg0MywweGZhLDB4ZjMpCUAgc2hhMjU2c3UwIHExMCxxMTEKKwl2bW92CQlxMixxMAorCUlOU1QoMHg2OCwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMgorCUlOU1QoMHg2OCwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTIKKwlJTlNUKDB4ZTIsMHg0YywweDYwLDB4ZjMpCUAgc2hhMjU2c3UxIHExMCxxOCxxOQorCXZsZDEuMzIJCXtxMTJ9LFtyM10hCisJdmFkZC5pMzIJcTEzLHExMyxxMTEKKwlJTlNUKDB4ZTAsMHg2MywweGZhLDB4ZjMpCUAgc2hhMjU2c3UwIHExMSxxOAorCXZtb3YJCXEyLHEwCisJSU5TVCgweDZhLDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEzCisJSU5TVCgweDZhLDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMworCUlOU1QoMHhlNCwweDZjLDB4NjIsMHhmMykJQCBzaGEyNTZzdTEgcTExLHE5LHExMAorCXZsZDEuMzIJCXtxMTN9LFtyM10hCisJdmFkZC5pMzIJcTEyLHExMixxOAorCXZtb3YJCXEyLHEwCisJSU5TVCgweDY4LDB4MGMsMHgwMiwweGYzKQlAIHNoYTI1NmggcTAscTEscTEyCisJSU5TVCgweDY4LDB4MmMsMHgxNCwweGYzKQlAIHNoYTI1NmgyIHExLHEyLHExMgorCisJdmxkMS4zMgkJe3ExMn0sW3IzXSEKKwl2YWRkLmkzMglxMTMscTEzLHE5CisJdm1vdgkJcTIscTAKKwlJTlNUKDB4NmEsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTMKKwlJTlNUKDB4NmEsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEzCisKKwl2bGQxLjMyCQl7cTEzfSxbcjNdCisJdmFkZC5pMzIJcTEyLHExMixxMTAKKwlzdWIJCXIzLHIzLCMyNTYtMTYJQCByZXdpbmQKKwl2bW92CQlxMixxMAorCUlOU1QoMHg2OCwweDBjLDB4MDIsMHhmMykJQCBzaGEyNTZoIHEwLHExLHExMgorCUlOU1QoMHg2OCwweDJjLDB4MTQsMHhmMykJQCBzaGEyNTZoMiBxMSxxMixxMTIKKworCXZhZGQuaTMyCXExMyxxMTMscTExCisJdm1vdgkJcTIscTAKKwlJTlNUKDB4NmEsMHgwYywweDAyLDB4ZjMpCUAgc2hhMjU2aCBxMCxxMSxxMTMKKwlJTlNUKDB4NmEsMHgyYywweDE0LDB4ZjMpCUAgc2hhMjU2aDIgcTEscTIscTEzCisKKwl2YWRkLmkzMglxMCxxMCxxMTQKKwl2YWRkLmkzMglxMSxxMSxxMTUKKwlpdAkJbmUKKwlibmUJCS5Mb29wX3Y4CisKKwl2c3QxLjMyCQl7cTAscTF9LFtyMF0KKworCWJ4CWxyCQlAIGJ4IGxyCisuc2l6ZQlzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9hcm12OCwuLXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX2FybXY4CisjZW5kaWYKKy5hc2NpeiAgIlNIQTI1NiBibG9jayB0cmFuc2Zvcm0gZm9yIEFSTXY0L05FT04vQVJNdjgsIENSWVBUT0dBTVMgYnkgPGFwcHJvQG9wZW5zc2wub3JnPiIKKy5hbGlnbgkyCisjaWYgX19BUk1fTUFYX0FSQ0hfXz49NyAmJiAhZGVmaW5lZChfX0tFUk5FTF9fKQorLmNvbW0gICBPUEVOU1NMX2FybWNhcF9QLDQsNAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jcnlwdG8vc2hhMjU2X2dsdWUuYyBiL2FyY2gvYXJtL2NyeXB0by9zaGEyNTZfZ2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NGU4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcnlwdG8vc2hhMjU2X2dsdWUuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIEdsdWUgY29kZSBmb3IgdGhlIFNIQTI1NiBTZWN1cmUgSGFzaCBBbGdvcml0aG0gYXNzZW1ibHkgaW1wbGVtZW50YXRpb24KKyAqIHVzaW5nIG9wdGltaXplZCBBUk0gYXNzZW1ibGVyIGFuZCBORU9OIGluc3RydWN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgqSAyMDE1IEdvb2dsZSBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHNoYTI1Nl9zc3NlM19nbHVlLmM6CisgKiAgIENvcHlyaWdodCAoQykgMjAxMyBJbnRlbCBDb3Jwb3JhdGlvbgorICogICBBdXRob3I6IFRpbSBDaGVuIDx0aW0uYy5jaGVuQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYTI1Nl9iYXNlLmg+CisjaW5jbHVkZSA8YXNtL3NpbWQuaD4KKyNpbmNsdWRlIDxhc20vbmVvbi5oPgorCisjaW5jbHVkZSAic2hhMjU2X2dsdWUuaCIKKworYXNtbGlua2FnZSB2b2lkIHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyKHUzMiAqZGlnZXN0LCBjb25zdCB2b2lkICpkYXRhLAorCQkJCQl1bnNpZ25lZCBpbnQgbnVtX2Jsa3MpOworCitpbnQgY3J5cHRvX3NoYTI1Nl9hcm1fdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwkvKiBtYWtlIHN1cmUgY2FzdGluZyB0byBzaGEyNTZfYmxvY2tfZm4oKSBpcyBzYWZlICovCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBzaGEyNTZfc3RhdGUsIHN0YXRlKSAhPSAwKTsKKworCXJldHVybiBzaGEyNTZfYmFzZV9kb191cGRhdGUoZGVzYywgZGF0YSwgbGVuLAorCQkJCShzaGEyNTZfYmxvY2tfZm4gKilzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcik7Cit9CitFWFBPUlRfU1lNQk9MKGNyeXB0b19zaGEyNTZfYXJtX3VwZGF0ZSk7CisKK3N0YXRpYyBpbnQgc2hhMjU2X2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KQoreworCXNoYTI1Nl9iYXNlX2RvX2ZpbmFsaXplKGRlc2MsCisJCQkJKHNoYTI1Nl9ibG9ja19mbiAqKXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyKTsKKwlyZXR1cm4gc2hhMjU2X2Jhc2VfZmluaXNoKGRlc2MsIG91dCk7Cit9CisKK2ludCBjcnlwdG9fc2hhMjU2X2FybV9maW51cChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCisJCQkgICAgdW5zaWduZWQgaW50IGxlbiwgdTggKm91dCkKK3sKKwlzaGEyNTZfYmFzZV9kb191cGRhdGUoZGVzYywgZGF0YSwgbGVuLAorCQkJICAgICAgKHNoYTI1Nl9ibG9ja19mbiAqKXNoYTI1Nl9ibG9ja19kYXRhX29yZGVyKTsKKwlyZXR1cm4gc2hhMjU2X2ZpbmFsKGRlc2MsIG91dCk7Cit9CitFWFBPUlRfU1lNQk9MKGNyeXB0b19zaGEyNTZfYXJtX2ZpbnVwKTsKKworc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgYWxnc1tdID0geyB7CisJLmRpZ2VzdHNpemUJPQlTSEEyNTZfRElHRVNUX1NJWkUsCisJLmluaXQJCT0Jc2hhMjU2X2Jhc2VfaW5pdCwKKwkudXBkYXRlCQk9CWNyeXB0b19zaGEyNTZfYXJtX3VwZGF0ZSwKKwkuZmluYWwJCT0Jc2hhMjU2X2ZpbmFsLAorCS5maW51cAkJPQljcnlwdG9fc2hhMjU2X2FybV9maW51cCwKKwkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTI1Nl9zdGF0ZSksCisJLmJhc2UJCT0JeworCQkuY3JhX25hbWUJPQkic2hhMjU2IiwKKwkJLmNyYV9kcml2ZXJfbmFtZSA9CSJzaGEyNTYtYXNtIiwKKwkJLmNyYV9wcmlvcml0eQk9CTE1MCwKKwkJLmNyYV9mbGFncwk9CUNSWVBUT19BTEdfVFlQRV9TSEFTSCwKKwkJLmNyYV9ibG9ja3NpemUJPQlTSEEyNTZfQkxPQ0tfU0laRSwKKwkJLmNyYV9tb2R1bGUJPQlUSElTX01PRFVMRSwKKwl9Cit9LCB7CisJLmRpZ2VzdHNpemUJPQlTSEEyMjRfRElHRVNUX1NJWkUsCisJLmluaXQJCT0Jc2hhMjI0X2Jhc2VfaW5pdCwKKwkudXBkYXRlCQk9CWNyeXB0b19zaGEyNTZfYXJtX3VwZGF0ZSwKKwkuZmluYWwJCT0Jc2hhMjU2X2ZpbmFsLAorCS5maW51cAkJPQljcnlwdG9fc2hhMjU2X2FybV9maW51cCwKKwkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTI1Nl9zdGF0ZSksCisJLmJhc2UJCT0JeworCQkuY3JhX25hbWUJPQkic2hhMjI0IiwKKwkJLmNyYV9kcml2ZXJfbmFtZSA9CSJzaGEyMjQtYXNtIiwKKwkJLmNyYV9wcmlvcml0eQk9CTE1MCwKKwkJLmNyYV9mbGFncwk9CUNSWVBUT19BTEdfVFlQRV9TSEFTSCwKKwkJLmNyYV9ibG9ja3NpemUJPQlTSEEyMjRfQkxPQ0tfU0laRSwKKwkJLmNyYV9tb2R1bGUJPQlUSElTX01PRFVMRSwKKwl9Cit9IH07CisKK3N0YXRpYyBpbnQgX19pbml0IHNoYTI1Nl9tb2RfaW5pdCh2b2lkKQoreworCWludCByZXMgPSBjcnlwdG9fcmVnaXN0ZXJfc2hhc2hlcyhhbGdzLCBBUlJBWV9TSVpFKGFsZ3MpKTsKKworCWlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0tFUk5FTF9NT0RFX05FT04pICYmIGNwdV9oYXNfbmVvbigpKSB7CisJCXJlcyA9IGNyeXB0b19yZWdpc3Rlcl9zaGFzaGVzKHNoYTI1Nl9uZW9uX2FsZ3MsCisJCQkJCSAgICAgIEFSUkFZX1NJWkUoc2hhMjU2X25lb25fYWxncykpOworCisJCWlmIChyZXMgPCAwKQorCQkJY3J5cHRvX3VucmVnaXN0ZXJfc2hhc2hlcyhhbGdzLCBBUlJBWV9TSVpFKGFsZ3MpKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2hhMjU2X21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfc2hhc2hlcyhhbGdzLCBBUlJBWV9TSVpFKGFsZ3MpKTsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19LRVJORUxfTU9ERV9ORU9OKSAmJiBjcHVfaGFzX25lb24oKSkKKwkJY3J5cHRvX3VucmVnaXN0ZXJfc2hhc2hlcyhzaGEyNTZfbmVvbl9hbGdzLAorCQkJCQkgIEFSUkFZX1NJWkUoc2hhMjU2X25lb25fYWxncykpOworfQorCittb2R1bGVfaW5pdChzaGEyNTZfbW9kX2luaXQpOworbW9kdWxlX2V4aXQoc2hhMjU2X21vZF9maW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTSEEyNTYgU2VjdXJlIEhhc2ggQWxnb3JpdGhtIChBUk0pLCBpbmNsdWRpbmcgTkVPTiIpOworCitNT0RVTEVfQUxJQVNfQ1JZUFRPKCJzaGEyNTYiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NyeXB0by9zaGEyNTZfZ2x1ZS5oIGIvYXJjaC9hcm0vY3J5cHRvL3NoYTI1Nl9nbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmMGJmNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2NyeXB0by9zaGEyNTZfZ2x1ZS5oCkBAIC0wLDAgKzEsMTQgQEAKKyNpZm5kZWYgX0NSWVBUT19TSEEyNTZfR0xVRV9ICisjZGVmaW5lIF9DUllQVE9fU0hBMjU2X0dMVUVfSAorCisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisKK2V4dGVybiBzdHJ1Y3Qgc2hhc2hfYWxnIHNoYTI1Nl9uZW9uX2FsZ3NbMl07CisKK2ludCBjcnlwdG9fc2hhMjU2X2FybV91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJICAgICB1bnNpZ25lZCBpbnQgbGVuKTsKKworaW50IGNyeXB0b19zaGEyNTZfYXJtX2ZpbnVwKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbGVuLCB1OCAqaGFzaCk7CisKKyNlbmRpZiAvKiBfQ1JZUFRPX1NIQTI1Nl9HTFVFX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NyeXB0by9zaGEyNTZfbmVvbl9nbHVlLmMgYi9hcmNoL2FybS9jcnlwdG8vc2hhMjU2X25lb25fZ2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Y2NkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9jcnlwdG8vc2hhMjU2X25lb25fZ2x1ZS5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogR2x1ZSBjb2RlIGZvciB0aGUgU0hBMjU2IFNlY3VyZSBIYXNoIEFsZ29yaXRobSBhc3NlbWJseSBpbXBsZW1lbnRhdGlvbgorICogdXNpbmcgTkVPTiBpbnN0cnVjdGlvbnMuCisgKgorICogQ29weXJpZ2h0IKkgMjAxNSBHb29nbGUgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBzaGE1MTJfbmVvbl9nbHVlLmM6CisgKiAgIENvcHlyaWdodCCpIDIwMTQgSnVzc2kgS2l2aWxpbm5hIDxqdXNzaS5raXZpbGlubmFAaWtpLmZpPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhMjU2X2Jhc2UuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3NpbWQuaD4KKyNpbmNsdWRlIDxhc20vbmVvbi5oPgorCisjaW5jbHVkZSAic2hhMjU2X2dsdWUuaCIKKworYXNtbGlua2FnZSB2b2lkIHNoYTI1Nl9ibG9ja19kYXRhX29yZGVyX25lb24odTMyICpkaWdlc3QsIGNvbnN0IHZvaWQgKmRhdGEsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG51bV9ibGtzKTsKKworc3RhdGljIGludCBzaGEyNTZfdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCWlmICghbWF5X3VzZV9zaW1kKCkgfHwKKwkgICAgKHNjdHgtPmNvdW50ICUgU0hBMjU2X0JMT0NLX1NJWkUpICsgbGVuIDwgU0hBMjU2X0JMT0NLX1NJWkUpCisJCXJldHVybiBjcnlwdG9fc2hhMjU2X2FybV91cGRhdGUoZGVzYywgZGF0YSwgbGVuKTsKKworCWtlcm5lbF9uZW9uX2JlZ2luKCk7CisJc2hhMjU2X2Jhc2VfZG9fdXBkYXRlKGRlc2MsIGRhdGEsIGxlbiwKKwkJCShzaGEyNTZfYmxvY2tfZm4gKilzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9uZW9uKTsKKwlrZXJuZWxfbmVvbl9lbmQoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNoYTI1Nl9maW51cChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCisJCQl1bnNpZ25lZCBpbnQgbGVuLCB1OCAqb3V0KQoreworCWlmICghbWF5X3VzZV9zaW1kKCkpCisJCXJldHVybiBjcnlwdG9fc2hhMjU2X2FybV9maW51cChkZXNjLCBkYXRhLCBsZW4sIG91dCk7CisKKwlrZXJuZWxfbmVvbl9iZWdpbigpOworCWlmIChsZW4pCisJCXNoYTI1Nl9iYXNlX2RvX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sCisJCQkoc2hhMjU2X2Jsb2NrX2ZuICopc2hhMjU2X2Jsb2NrX2RhdGFfb3JkZXJfbmVvbik7CisJc2hhMjU2X2Jhc2VfZG9fZmluYWxpemUoZGVzYywKKwkJCShzaGEyNTZfYmxvY2tfZm4gKilzaGEyNTZfYmxvY2tfZGF0YV9vcmRlcl9uZW9uKTsKKwlrZXJuZWxfbmVvbl9lbmQoKTsKKworCXJldHVybiBzaGEyNTZfYmFzZV9maW5pc2goZGVzYywgb3V0KTsKK30KKworc3RhdGljIGludCBzaGEyNTZfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCit7CisJcmV0dXJuIHNoYTI1Nl9maW51cChkZXNjLCBOVUxMLCAwLCBvdXQpOworfQorCitzdHJ1Y3Qgc2hhc2hfYWxnIHNoYTI1Nl9uZW9uX2FsZ3NbXSA9IHsgeworCS5kaWdlc3RzaXplCT0JU0hBMjU2X0RJR0VTVF9TSVpFLAorCS5pbml0CQk9CXNoYTI1Nl9iYXNlX2luaXQsCisJLnVwZGF0ZQkJPQlzaGEyNTZfdXBkYXRlLAorCS5maW5hbAkJPQlzaGEyNTZfZmluYWwsCisJLmZpbnVwCQk9CXNoYTI1Nl9maW51cCwKKwkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTI1Nl9zdGF0ZSksCisJLmJhc2UJCT0JeworCQkuY3JhX25hbWUJPQkic2hhMjU2IiwKKwkJLmNyYV9kcml2ZXJfbmFtZSA9CSJzaGEyNTYtbmVvbiIsCisJCS5jcmFfcHJpb3JpdHkJPQkyNTAsCisJCS5jcmFfZmxhZ3MJPQlDUllQVE9fQUxHX1RZUEVfU0hBU0gsCisJCS5jcmFfYmxvY2tzaXplCT0JU0hBMjU2X0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCT0JVEhJU19NT0RVTEUsCisJfQorfSwgeworCS5kaWdlc3RzaXplCT0JU0hBMjI0X0RJR0VTVF9TSVpFLAorCS5pbml0CQk9CXNoYTIyNF9iYXNlX2luaXQsCisJLnVwZGF0ZQkJPQlzaGEyNTZfdXBkYXRlLAorCS5maW5hbAkJPQlzaGEyNTZfZmluYWwsCisJLmZpbnVwCQk9CXNoYTI1Nl9maW51cCwKKwkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTI1Nl9zdGF0ZSksCisJLmJhc2UJCT0JeworCQkuY3JhX25hbWUJPQkic2hhMjI0IiwKKwkJLmNyYV9kcml2ZXJfbmFtZSA9CSJzaGEyMjQtbmVvbiIsCisJCS5jcmFfcHJpb3JpdHkJPQkyNTAsCisJCS5jcmFfZmxhZ3MJPQlDUllQVE9fQUxHX1RZUEVfU0hBU0gsCisJCS5jcmFfYmxvY2tzaXplCT0JU0hBMjI0X0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCT0JVEhJU19NT0RVTEUsCisJfQorfSB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IGZlNzRjMGQuLmViMGY0M2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL0tidWlsZAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTEsNiArMSw1IEBACiAKIAotZ2VuZXJpYy15ICs9IGF1eHZlYy5oCiBnZW5lcmljLXkgKz0gYml0c3BlcmxvbmcuaAogZ2VuZXJpYy15ICs9IGNwdXRpbWUuaAogZ2VuZXJpYy15ICs9IGN1cnJlbnQuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXNzZW1ibGVyLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hc3NlbWJsZXIuaAppbmRleCBmNjdmZDNhLi4xODYyNzBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9hc3NlbWJsZXIuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hc3NlbWJsZXIuaApAQCAtMjM3LDYgKzIzNyw5IEBACiAJLnB1c2hzZWN0aW9uICIuYWx0LnNtcC5pbml0IiwgImEiCQkJO1wKIAkubG9uZwk5OTk4YgkJCQkJCTtcCiA5OTk3OglpbnN0cgkJCQkJCQk7XAorCS5pZiAuIC0gOTk5N2IgPT0gMgkJCQkJO1wKKwkJbm9wCQkJCQkJO1wKKwkuZW5kaWYJCQkJCQkJO1wKIAkuaWYgLiAtIDk5OTdiICE9IDQJCQkJCTtcCiAJCS5lcnJvciAiQUxUX1VQKCkgY29udGVudCBtdXN0IGFzc2VtYmxlIHRvIGV4YWN0bHkgNCBieXRlcyI7XAogCS5lbmRpZgkJCQkJCQk7XApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXV4dmVjLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9hdXh2ZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmQzODhjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vYXV4dmVjLmgKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgPHVhcGkvYXNtL2F1eHZlYy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1aWRsZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1aWRsZS5oCmluZGV4IGFmMzE5YWMuLjBmODQyNDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NwdWlkbGUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcHVpZGxlLmgKQEAgLTEsNiArMSw4IEBACiAjaWZuZGVmIF9fQVNNX0FSTV9DUFVJRExFX0gKICNkZWZpbmUgX19BU01fQVJNX0NQVUlETEVfSAogCisjaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CisKICNpZmRlZiBDT05GSUdfQ1BVX0lETEUKIGV4dGVybiBpbnQgYXJtX2NwdWlkbGVfc2ltcGxlX2VudGVyKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAogCQlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwgaW50IGluZGV4KTsKQEAgLTI1LDQgKzI3LDI1IEBACiAgKi8KICNkZWZpbmUgQVJNX0NQVUlETEVfV0ZJX1NUQVRFIEFSTV9DUFVJRExFX1dGSV9TVEFURV9QV1IoVUlOVF9NQVgpCiAKK3N0cnVjdCBkZXZpY2Vfbm9kZTsKKworc3RydWN0IGNwdWlkbGVfb3BzIHsKKwlpbnQgKCpzdXNwZW5kKShpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGFyZyk7CisJaW50ICgqaW5pdCkoc3RydWN0IGRldmljZV9ub2RlICosIGludCBjcHUpOworfTsKKworc3RydWN0IG9mX2NwdWlkbGVfbWV0aG9kIHsKKwljb25zdCBjaGFyICptZXRob2Q7CisJc3RydWN0IGNwdWlkbGVfb3BzICpvcHM7Cit9OworCisjZGVmaW5lIENQVUlETEVfTUVUSE9EX09GX0RFQ0xBUkUobmFtZSwgX21ldGhvZCwgX29wcykJCQlcCisJc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9jcHVpZGxlX21ldGhvZCBfX2NwdWlkbGVfbWV0aG9kX29mX3RhYmxlXyMjbmFtZSBcCisJX191c2VkIF9fc2VjdGlvbihfX2NwdWlkbGVfbWV0aG9kX29mX3RhYmxlKQkJCVwKKwk9IHsgLm1ldGhvZCA9IF9tZXRob2QsIC5vcHMgPSBfb3BzIH0KKworZXh0ZXJuIGludCBhcm1fY3B1aWRsZV9zdXNwZW5kKGludCBpbmRleCk7CisKK2V4dGVybiBpbnQgYXJtX2NwdWlkbGVfaW5pdChpbnQgY3B1KTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcHV0eXBlLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcHV0eXBlLmgKaW5kZXggODE5Nzc3ZC4uODVlMzc0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3B1dHlwZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2NwdXR5cGUuaApAQCAtMjUzLDQgKzI1MywyMCBAQAogI2Vsc2UKICNkZWZpbmUgY3B1X2lzX3BqNCgpCTAKICNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBfX2F0dHJpYnV0ZV9jb25zdF9fIGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF9maWVsZCh1MzIgZmVhdHVyZXMsCisJCQkJCQkJCSAgaW50IGZpZWxkKQoreworCWludCBmZWF0dXJlID0gKGZlYXR1cmVzID4+IGZpZWxkKSAmIDE1OworCisJLyogZmVhdHVyZSByZWdpc3RlcnMgYXJlIHNpZ25lZCB2YWx1ZXMgKi8KKwlpZiAoZmVhdHVyZSA+IDgpCisJCWZlYXR1cmUgLT0gMTY7CisKKwlyZXR1cm4gZmVhdHVyZTsKK30KKworI2RlZmluZSBjcHVpZF9mZWF0dXJlX2V4dHJhY3QocmVnLCBmaWVsZCkgXAorCWNwdWlkX2ZlYXR1cmVfZXh0cmFjdF9maWVsZChyZWFkX2NwdWlkX2V4dChyZWcpLCBmaWVsZCkKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcnlwdG8vc2hhMS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vY3J5cHRvL3NoYTEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlNmE0MS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9jcnlwdG8vc2hhMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotI2lmbmRlZiBBU01fQVJNX0NSWVBUT19TSEExX0gKLSNkZWZpbmUgQVNNX0FSTV9DUllQVE9fU0hBMV9ICi0KLSNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KLSNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+Ci0KLWV4dGVybiBpbnQgc2hhMV91cGRhdGVfYXJtKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKLQkJCSAgIHVuc2lnbmVkIGludCBsZW4pOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggYWZiOWNhZi4uZDIzMTVmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZWxmLmgKQEAgLTEsNyArMSw5IEBACiAjaWZuZGVmIF9fQVNNQVJNX0VMRl9ICiAjZGVmaW5lIF9fQVNNQVJNX0VMRl9ICiAKKyNpbmNsdWRlIDxhc20vYXV4dmVjLmg+CiAjaW5jbHVkZSA8YXNtL2h3Y2FwLmg+CisjaW5jbHVkZSA8YXNtL3Zkc29fZGF0YXBhZ2UuaD4KIAogLyoKICAqIEVMRiByZWdpc3RlciBkZWZpbml0aW9ucy4uCkBAIC0xMTUsNyArMTE3LDcgQEAKICAgIHRoZSBsb2FkZXIuICBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG91dCBvZiB0aGUgd2F5IG9mIHRoZSBwcm9ncmFtCiAgICB0aGF0IGl0IHdpbGwgImV4ZWMiLCBhbmQgdGhhdCB0aGVyZSBpcyBzdWZmaWNpZW50IHJvb20gZm9yIHRoZSBicmsuICAqLwogCi0jZGVmaW5lIEVMRl9FVF9EWU5fQkFTRQkoMiAqIFRBU0tfU0laRSAvIDMpCisjZGVmaW5lIEVMRl9FVF9EWU5fQkFTRQkoVEFTS19TSVpFIC8gMyAqIDIpCiAKIC8qIFdoZW4gdGhlIHByb2dyYW0gc3RhcnRzLCBhMSBjb250YWlucyBhIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0byBiZSAKICAgIHJlZ2lzdGVyZWQgd2l0aCBhdGV4aXQsIGFzIHBlciB0aGUgU1ZSNCBBQkkuICBBIHZhbHVlIG9mIDAgbWVhbnMgd2UgCkBAIC0xMjUsMTEgKzEyNywxNCBAQAogZXh0ZXJuIHZvaWQgZWxmX3NldF9wZXJzb25hbGl0eShjb25zdCBzdHJ1Y3QgZWxmMzJfaGRyICopOwogI2RlZmluZSBTRVRfUEVSU09OQUxJVFkoZXgpCWVsZl9zZXRfcGVyc29uYWxpdHkoJihleCkpCiAKLXN0cnVjdCBtbV9zdHJ1Y3Q7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwotI2RlZmluZSBhcmNoX3JhbmRvbWl6ZV9icmsgYXJjaF9yYW5kb21pemVfYnJrCi0KICNpZmRlZiBDT05GSUdfTU1VCisjaWZkZWYgQ09ORklHX1ZEU08KKyNkZWZpbmUgQVJDSF9ETElORk8JCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJTkVXX0FVWF9FTlQoQVRfU1lTSU5GT19FSERSLAkJCQlcCisJCSAgICAoZWxmX2FkZHJfdCljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvKTsJXAorfSB3aGlsZSAoMCkKKyNlbmRpZgogI2RlZmluZSBBUkNIX0hBU19TRVRVUF9BRERJVElPTkFMX1BBR0VTIDEKIHN0cnVjdCBsaW51eF9iaW5wcm07CiBpbnQgYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKHN0cnVjdCBsaW51eF9iaW5wcm0gKiwgaW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Z1dGV4LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9mdXRleC5oCmluZGV4IDUzZTY5ZGEuLjRlNzgwNjUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2Z1dGV4LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vZnV0ZXguaApAQCAtMTMsNyArMTMsNyBAQAogCSIJLmFsaWduCTNcbiIJCQkJCVwKIAkiCS5sb25nCTFiLCA0ZiwgMmIsIDRmXG4iCQkJXAogCSIJLnBvcHNlY3Rpb25cbiIJCQkJCVwKLQkiCS5wdXNoc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJXAorCSIJLnB1c2hzZWN0aW9uIC50ZXh0LmZpeHVwLFwiYXhcIlxuIgkJXAogCSIJLmFsaWduCTJcbiIJCQkJCVwKIAkiNDoJbW92CSUwLCAiIGVycl9yZWcgIlxuIgkJCVwKIAkiCWIJM2JcbiIJCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaAppbmRleCA3MGY5YjliLi41ZjMzN2RjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfQVNNX0FSTV9KVU1QX0xBQkVMX0gKICNkZWZpbmUgX0FTTV9BUk1fSlVNUF9MQUJFTF9ICiAKLSNpZmRlZiBfX0tFUk5FTF9fCisjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIApAQCAtMjcsOCArMjcsNiBAQAogCXJldHVybiB0cnVlOwogfQogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiB0eXBlZGVmIHUzMiBqdW1wX2xhYmVsX3Q7CiAKIHN0cnVjdCBqdW1wX2VudHJ5IHsKQEAgLTM3LDQgKzM1LDUgQEAKIAlqdW1wX2xhYmVsX3Qga2V5OwogfTsKIAorI2VuZGlmICAvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2FybS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2FybS5oCmluZGV4IDgxNmRiMGIuLmQ5OTU4MjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9hcm0uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fYXJtLmgKQEAgLTE4NSw2ICsxODUsNyBAQAogI2RlZmluZSBIU1JfQ09ORAkoMHhmVSA8PCBIU1JfQ09ORF9TSElGVCkKIAogI2RlZmluZSBGU0NfRkFVTFQJKDB4MDQpCisjZGVmaW5lIEZTQ19BQ0NFU1MJKDB4MDgpCiAjZGVmaW5lIEZTQ19QRVJNCSgweDBjKQogCiAvKiBIeXAgUHJlZmV0Y2ggRmF1bHQgQWRkcmVzcyBSZWdpc3RlciAoSFBGQVIvSERGQVIpICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCA0MTAwOGNkLi5kNzE2MDdjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKQEAgLTI3LDYgKzI3LDggQEAKICNpbmNsdWRlIDxhc20vZnBzdGF0ZS5oPgogI2luY2x1ZGUgPGt2bS9hcm1fYXJjaF90aW1lci5oPgogCisjZGVmaW5lIF9fS1ZNX0hBVkVfQVJDSF9JTlRDX0lOSVRJQUxJWkVECisKICNpZiBkZWZpbmVkKENPTkZJR19LVk1fQVJNX01BWF9WQ1BVUykKICNkZWZpbmUgS1ZNX01BWF9WQ1BVUyBDT05GSUdfS1ZNX0FSTV9NQVhfVkNQVVMKICNlbHNlCkBAIC0xNjUsMTkgKzE2NywxMCBAQAogCiB1bnNpZ25lZCBsb25nIGt2bV9hcm1fbnVtX3JlZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGludCBrdm1fYXJtX2NvcHlfcmVnX2luZGljZXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgX191c2VyICppbmRpY2VzKTsKK2ludCBrdm1fYWdlX2h2YShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKK2ludCBrdm1fdGVzdF9hZ2VfaHZhKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyBodmEpOwogCiAvKiBXZSBkbyBub3QgaGF2ZSBzaGFkb3cgcGFnZSB0YWJsZXMsIGhlbmNlIHRoZSBlbXB0eSBob29rcyAqLwotc3RhdGljIGlubGluZSBpbnQga3ZtX2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGt2bV90ZXN0X2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSkKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGt2bV9hcmNoX21tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3BhZ2Uoc3RydWN0IGt2bSAqa3ZtLAogCQkJCQkJCSB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fbW1pby5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX21taW8uaAppbmRleCAzZjgzZGIyLi5kOGU5MGM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fbW1pby5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9tbWlvLmgKQEAgLTI4LDI4ICsyOCw2IEBACiAJYm9vbCBzaWduX2V4dGVuZDsKIH07CiAKLS8qCi0gKiBUaGUgaW4ta2VybmVsIE1NSU8gZW11bGF0aW9uIGNvZGUgd2FudHMgdG8gdXNlIGEgY29weSBvZiBydW4tPm1taW8sCi0gKiB3aGljaCBpcyBhbiBhbm9ueW1vdXMgdHlwZS4gVXNlIG91ciBvd24gdHlwZSBpbnN0ZWFkLgotICovCi1zdHJ1Y3Qga3ZtX2V4aXRfbW1pbyB7Ci0JcGh5c19hZGRyX3QJcGh5c19hZGRyOwotCXU4CQlkYXRhWzhdOwotCXUzMgkJbGVuOwotCWJvb2wJCWlzX3dyaXRlOwotCXZvaWQJCSpwcml2YXRlOwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIGt2bV9wcmVwYXJlX21taW8oc3RydWN0IGt2bV9ydW4gKnJ1biwKLQkJCQkgICAgc3RydWN0IGt2bV9leGl0X21taW8gKm1taW8pCi17Ci0JcnVuLT5tbWlvLnBoeXNfYWRkcgk9IG1taW8tPnBoeXNfYWRkcjsKLQlydW4tPm1taW8ubGVuCQk9IG1taW8tPmxlbjsKLQlydW4tPm1taW8uaXNfd3JpdGUJPSBtbWlvLT5pc193cml0ZTsKLQltZW1jcHkocnVuLT5tbWlvLmRhdGEsIG1taW8tPmRhdGEsIG1taW8tPmxlbik7Ci0JcnVuLT5leGl0X3JlYXNvbgk9IEtWTV9FWElUX01NSU87Ci19Ci0KIGludCBrdm1faGFuZGxlX21taW9fcmV0dXJuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1bik7CiBpbnQgaW9fbWVtX2Fib3J0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1biwKIAkJIHBoeXNfYWRkcl90IGZhdWx0X2lwYSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fbW11LmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9rdm1fbW11LmgKaW5kZXggYmYwZmU5OS4uNGNmNDhjMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20va3ZtX21tdS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL2t2bV9tbXUuaApAQCAtMTQ5LDMxICsxNDksMzAgQEAKIAkoX19ib3VuZGFyeSAtIDEgPCAoZW5kKSAtIDEpPyBfX2JvdW5kYXJ5OiAoZW5kKTsJCVwKIH0pCiAKKyNkZWZpbmUga3ZtX3BnZF9pbmRleChhZGRyKQkJCXBnZF9pbmRleChhZGRyKQorCiBzdGF0aWMgaW5saW5lIGJvb2wga3ZtX3BhZ2VfZW1wdHkodm9pZCAqcHRyKQogewogCXN0cnVjdCBwYWdlICpwdHJfcGFnZSA9IHZpcnRfdG9fcGFnZShwdHIpOwogCXJldHVybiBwYWdlX2NvdW50KHB0cl9wYWdlKSA9PSAxOwogfQogCi0KICNkZWZpbmUga3ZtX3B0ZV90YWJsZV9lbXB0eShrdm0sIHB0ZXApIGt2bV9wYWdlX2VtcHR5KHB0ZXApCiAjZGVmaW5lIGt2bV9wbWRfdGFibGVfZW1wdHkoa3ZtLCBwbWRwKSBrdm1fcGFnZV9lbXB0eShwbWRwKQogI2RlZmluZSBrdm1fcHVkX3RhYmxlX2VtcHR5KGt2bSwgcHVkcCkgKDApCiAKICNkZWZpbmUgS1ZNX1BSRUFMTE9DX0xFVkVMCTAKIAotc3RhdGljIGlubGluZSBpbnQga3ZtX3ByZWFsbG9jX2h3cGdkKHN0cnVjdCBrdm0gKmt2bSwgcGdkX3QgKnBnZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGt2bV9mcmVlX2h3cGdkKHN0cnVjdCBrdm0gKmt2bSkgeyB9Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCAqa3ZtX2dldF9od3BnZChzdHJ1Y3Qga3ZtICprdm0pCiB7CiAJcmV0dXJuIGt2bS0+YXJjaC5wZ2Q7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGt2bV9nZXRfaHdwZ2Rfc2l6ZSh2b2lkKQoreworCXJldHVybiBQVFJTX1BFUl9TMl9QR0QgKiBzaXplb2YocGdkX3QpOworfQorCiBzdHJ1Y3Qga3ZtOwogCiAjZGVmaW5lIGt2bV9mbHVzaF9kY2FjaGVfdG9fcG9jKGEsbCkJX19jcHVjX2ZsdXNoX2RjYWNoZV9hcmVhKChhKSwgKGwpKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC90aW1lLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3RpbWUuaAppbmRleCA5MGMxMmUxLi4wZjc5ZTRkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3RpbWUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3RpbWUuaApAQCAtMTIsOCArMTIsNyBAQAogCiBleHRlcm4gdm9pZCB0aW1lcl90aWNrKHZvaWQpOwogCi1zdHJ1Y3QgdGltZXNwZWM7Ci10eXBlZGVmIHZvaWQgKCpjbG9ja19hY2Nlc3NfZm4pKHN0cnVjdCB0aW1lc3BlYyAqKTsKK3R5cGVkZWYgdm9pZCAoKmNsb2NrX2FjY2Vzc19mbikoc3RydWN0IHRpbWVzcGVjNjQgKik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX3BlcnNpc3RlbnRfY2xvY2soY2xvY2tfYWNjZXNzX2ZuIHJlYWRfYm9vdCwKIAkJCQkgICAgIGNsb2NrX2FjY2Vzc19mbiByZWFkX3BlcnNpc3RlbnQpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbXUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21tdS5oCmluZGV4IDY0ZmQxNTEuLmE1YjQ3NDIxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbXUuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tbXUuaApAQCAtMTEsNiArMTEsOSBAQAogI2VuZGlmCiAJdW5zaWduZWQgaW50CXZtYWxsb2Nfc2VxOwogCXVuc2lnbmVkIGxvbmcJc2lncGFnZTsKKyNpZmRlZiBDT05GSUdfVkRTTworCXVuc2lnbmVkIGxvbmcJdmRzbzsKKyNlbmRpZgogfSBtbV9jb250ZXh0X3Q7CiAKICNpZmRlZiBDT05GSUdfQ1BVX0hBU19BU0lECmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wbXUuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BtdS5oCmluZGV4IGIxNTk2YmQuLjY3NWU0YWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BtdS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3BtdS5oCkBAIC05Miw2ICs5Miw3IEBACiBzdHJ1Y3QgYXJtX3BtdSB7CiAJc3RydWN0IHBtdQlwbXU7CiAJY3B1bWFza190CWFjdGl2ZV9pcnFzOworCWludAkJKmlycV9hZmZpbml0eTsKIAljaGFyCQkqbmFtZTsKIAlpcnFyZXR1cm5fdAkoKmhhbmRsZV9pcnEpKGludCBpcnFfbnVtLCB2b2lkICpkZXYpOwogCXZvaWQJCSgqZW5hYmxlKShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc21wX3BsYXQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NtcF9wbGF0LmgKaW5kZXggMGFkN2Q0OS4uOTkzZTUyMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc21wX3BsYXQuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9zbXBfcGxhdC5oCkBAIC0xMDQsNiArMTA0LDcgQEAKIAlyZXR1cm4gMSA8PCBtcGlkcl9oYXNoLmJpdHM7CiB9CiAKK2V4dGVybiBpbnQgcGxhdGZvcm1fY2FuX3NlY29uZGFyeV9ib290KHZvaWQpOwogZXh0ZXJuIGludCBwbGF0Zm9ybV9jYW5fY3B1X2hvdHBsdWcodm9pZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggNzI4MTJhMS4uYmQzMmVkZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0yMyw3ICsyMyw2IEBACiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiBzdHJ1Y3QgdGFza19zdHJ1Y3Q7Ci1zdHJ1Y3QgZXhlY19kb21haW47CiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vZG9tYWluLmg+CkBAIC01Myw3ICs1Miw2IEBACiAJaW50CQkJcHJlZW1wdF9jb3VudDsJLyogMCA9PiBwcmVlbXB0YWJsZSwgPDAgPT4gYnVnICovCiAJbW1fc2VnbWVudF90CQlhZGRyX2xpbWl0OwkvKiBhZGRyZXNzIGxpbWl0ICovCiAJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogbWFpbiB0YXNrIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBleGVjX2RvbWFpbgkqZXhlY19kb21haW47CS8qIGV4ZWN1dGlvbiBkb21haW4gKi8KIAlfX3UzMgkJCWNwdTsJCS8qIGNwdSAqLwogCV9fdTMyCQkJY3B1X2RvbWFpbjsJLyogY3B1IGRvbWFpbiAqLwogCXN0cnVjdCBjcHVfY29udGV4dF9zYXZlCWNwdV9jb250ZXh0OwkvKiBjcHUgY29udGV4dCAqLwpAQCAtNzMsNyArNzEsNiBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQkJCQlcCiB7CQkJCQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJCQkJXAotCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAkJCQlcCiAJLmZsYWdzCQk9IDAsCQkJCQkJXAogCS5wcmVlbXB0X2NvdW50CT0gSU5JVF9QUkVFTVBUX0NPVU5ULAkJCQlcCiAJLmFkZHJfbGltaXQJPSBLRVJORUxfRFMsCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS91YWNjZXNzLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggY2UwNzg2ZS4uNzRiMTdkMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdWFjY2Vzcy5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaApAQCAtMzE1LDcgKzMxNSw3IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCiAJIjE6CSIgVFVTRVIobGRyYikgIgklMSxbJTJdLCMwXG4iCQkJXAogCSIyOlxuIgkJCQkJCQlcCi0JIgkucHVzaHNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCVwKKwkiCS5wdXNoc2VjdGlvbiAudGV4dC5maXh1cCxcImF4XCJcbiIJCVwKIAkiCS5hbGlnbgkyXG4iCQkJCQlcCiAJIjM6CW1vdgklMCwgJTNcbiIJCQkJXAogCSIJbW92CSUxLCAjMFxuIgkJCQlcCkBAIC0zNTEsNyArMzUxLDcgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJCVwKIAkiMToJIiBUVVNFUihsZHIpICIJJTEsWyUyXSwjMFxuIgkJCVwKIAkiMjpcbiIJCQkJCQkJXAotCSIJLnB1c2hzZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCQlcCisJIgkucHVzaHNlY3Rpb24gLnRleHQuZml4dXAsXCJheFwiXG4iCQlcCiAJIgkuYWxpZ24JMlxuIgkJCQkJXAogCSIzOgltb3YJJTAsICUzXG4iCQkJCVwKIAkiCW1vdgklMSwgIzBcbiIJCQkJXApAQCAtMzk3LDcgKzM5Nyw3IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCiAJIjE6CSIgVFVTRVIoc3RyYikgIgklMSxbJTJdLCMwXG4iCQkJXAogCSIyOlxuIgkJCQkJCQlcCi0JIgkucHVzaHNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJCVwKKwkiCS5wdXNoc2VjdGlvbiAudGV4dC5maXh1cCxcImF4XCJcbiIJCVwKIAkiCS5hbGlnbgkyXG4iCQkJCQlcCiAJIjM6CW1vdgklMCwgJTNcbiIJCQkJXAogCSIJYgkyYlxuIgkJCQkJXApAQCAtNDMwLDcgKzQzMCw3IEBACiAJX19hc21fXyBfX3ZvbGF0aWxlX18oCQkJCQlcCiAJIjE6CSIgVFVTRVIoc3RyKSAiCSUxLFslMl0sIzBcbiIJCQlcCiAJIjI6XG4iCQkJCQkJCVwKLQkiCS5wdXNoc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJXAorCSIJLnB1c2hzZWN0aW9uIC50ZXh0LmZpeHVwLFwiYXhcIlxuIgkJXAogCSIJLmFsaWduCTJcbiIJCQkJCVwKIAkiMzoJbW92CSUwLCAlM1xuIgkJCQlcCiAJIgliCTJiXG4iCQkJCQlcCkBAIC00NTgsNyArNDU4LDcgQEAKICBUSFVNQigJIjE6CSIgVFVTRVIoc3RyKSAiCSIgX19yZWdfb3BlcjEgIiwgWyUxXVxuIgkpIFwKICBUSFVNQigJIjI6CSIgVFVTRVIoc3RyKSAiCSIgX19yZWdfb3BlcjAgIiwgWyUxLCAjNF1cbiIJKSBcCiAJIjM6XG4iCQkJCQkJCVwKLQkiCS5wdXNoc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQkJXAorCSIJLnB1c2hzZWN0aW9uIC50ZXh0LmZpeHVwLFwiYXhcIlxuIgkJXAogCSIJLmFsaWduCTJcbiIJCQkJCVwKIAkiNDoJbW92CSUwLCAlM1xuIgkJCQlcCiAJIgliCTNiXG4iCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS91bmlmaWVkLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS91bmlmaWVkLmgKaW5kZXggYjg4YmVhYi4uMjAwZjlhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdW5pZmllZC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3VuaWZpZWQuaApAQCAtMjQsNiArMjQsMTQgQEAKIAkuc3ludGF4IHVuaWZpZWQKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0NQVV9WN00KKyNkZWZpbmUgQVJfQ0xBU1MoeC4uLikKKyNkZWZpbmUgTV9DTEFTUyh4Li4uKQl4CisjZWxzZQorI2RlZmluZSBBUl9DTEFTUyh4Li4uKQl4CisjZGVmaW5lIE1fQ0xBU1MoeC4uLikKKyNlbmRpZgorCiAjaWZkZWYgQ09ORklHX1RIVU1CMl9LRVJORUwKIAogI2lmIF9fR05VQ19fIDwgNApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vdmRzby5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdmRzby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMjk1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS92ZHNvLmgKQEAgLTAsMCArMSwzMiBAQAorI2lmbmRlZiBfX0FTTV9WRFNPX0gKKyNkZWZpbmUgX19BU01fVkRTT19ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisKKyNpZm5kZWYgX19BU1NFTUJMWV9fCisKK3N0cnVjdCBtbV9zdHJ1Y3Q7CisKKyNpZmRlZiBDT05GSUdfVkRTTworCit2b2lkIGFybV9pbnN0YWxsX3Zkc28oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcik7CisKK2V4dGVybiBjaGFyIHZkc29fc3RhcnQsIHZkc29fZW5kOworCitleHRlcm4gdW5zaWduZWQgaW50IHZkc29fdG90YWxfcGFnZXM7CisKKyNlbHNlIC8qIENPTkZJR19WRFNPICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcm1faW5zdGFsbF92ZHNvKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7Cit9CisKKyNkZWZpbmUgdmRzb190b3RhbF9wYWdlcyAwCisKKyNlbmRpZiAvKiBDT05GSUdfVkRTTyAqLworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfX0FTTV9WRFNPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Zkc29fZGF0YXBhZ2UuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Zkc29fZGF0YXBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmUyNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vdmRzb19kYXRhcGFnZS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBBZGFwdGVkIGZyb20gYXJtNjQgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQVJNIExpbWl0ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaWZuZGVmIF9fQVNNX1ZEU09fREFUQVBBR0VfSAorI2RlZmluZSBfX0FTTV9WRFNPX0RBVEFQQUdFX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKy8qIFRyeSB0byBiZSBjYWNoZS1mcmllbmRseSBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaW1wbGVtZW50IHRoZQorICogZ2VuZXJpYyB0aW1lcjogZml0IHRoZSB1bmNvbmRpdGlvbmFsbHkgdXBkYXRlZCBmaWVsZHMgaW4gdGhlIGZpcnN0CisgKiAzMiBieXRlcy4KKyAqLworc3RydWN0IHZkc29fZGF0YSB7CisJdTMyIHNlcV9jb3VudDsJCS8qIHNlcXVlbmNlIGNvdW50IC0gb2RkIGR1cmluZyB1cGRhdGVzICovCisJdTE2IHRrX2lzX2NudHZjdDsJLyogZmFsbCBiYWNrIHRvIHN5c2NhbGwgaWYgZmFsc2UgKi8KKwl1MTYgY3Nfc2hpZnQ7CQkvKiBjbG9ja3NvdXJjZSBzaGlmdCAqLworCXUzMiB4dGltZV9jb2Fyc2Vfc2VjOwkvKiBjb2Fyc2UgdGltZSAqLworCXUzMiB4dGltZV9jb2Fyc2VfbnNlYzsKKworCXUzMiB3dG1fY2xvY2tfc2VjOwkvKiB3YWxsIHRvIG1vbm90b25pYyBvZmZzZXQgKi8KKwl1MzIgd3RtX2Nsb2NrX25zZWM7CisJdTMyIHh0aW1lX2Nsb2NrX3NlYzsJLyogQ0xPQ0tfUkVBTFRJTUUgLSBzZWNvbmRzICovCisJdTMyIGNzX211bHQ7CQkvKiBjbG9ja3NvdXJjZSBtdWx0aXBsaWVyICovCisKKwl1NjQgY3NfY3ljbGVfbGFzdDsJLyogbGFzdCBjeWNsZSB2YWx1ZSAqLworCXU2NCBjc19tYXNrOwkJLyogY2xvY2tzb3VyY2UgbWFzayAqLworCisJdTY0IHh0aW1lX2Nsb2NrX3Nuc2VjOwkvKiBDTE9DS19SRUFMVElNRSBzdWItbnMgYmFzZSAqLworCXUzMiB0el9taW51dGVzd2VzdDsJLyogdGltZXpvbmUgaW5mbyBmb3IgZ2V0dGltZW9mZGF5KDIpICovCisJdTMyIHR6X2RzdHRpbWU7Cit9OworCit1bmlvbiB2ZHNvX2RhdGFfc3RvcmUgeworCXN0cnVjdCB2ZHNvX2RhdGEgZGF0YTsKKwl1OCBwYWdlW1BBR0VfU0laRV07Cit9OworCisjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX19BU01fVkRTT19EQVRBUEFHRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS93b3JkLWF0LWEtdGltZS5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vd29yZC1hdC1hLXRpbWUuaAppbmRleCBhNmQwYTI5Li41ODMxZGNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS93b3JkLWF0LWEtdGltZS5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3dvcmQtYXQtYS10aW1lLmgKQEAgLTcxLDcgKzcxLDcgQEAKIAlhc20oCiAJIjE6CWxkcgklMCwgWyUyXVxuIgogCSIyOlxuIgotCSIJLnB1c2hzZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKKwkiCS5wdXNoc2VjdGlvbiAudGV4dC5maXh1cCxcImF4XCJcbiIKIAkiCS5hbGlnbiAyXG4iCiAJIjM6CWFuZAklMSwgJTIsICMweDNcbiIKIAkiCWJpYwklMiwgJTIsICMweDNcbiIKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvdWFwaS9hc20vS2J1aWxkIGIvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9LYnVpbGQKaW5kZXggNzBhMWM5ZC4uYTFjMDVmOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9LYnVpbGQKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9LYnVpbGQKQEAgLTEsNiArMSw3IEBACiAjIFVBUEkgSGVhZGVyIGV4cG9ydCBsaXN0CiBpbmNsdWRlIGluY2x1ZGUvdWFwaS9hc20tZ2VuZXJpYy9LYnVpbGQuYXNtCiAKK2hlYWRlci15ICs9IGF1eHZlYy5oCiBoZWFkZXIteSArPSBieXRlb3JkZXIuaAogaGVhZGVyLXkgKz0gZmNudGwuaAogaGVhZGVyLXkgKz0gaHdjYXAuaApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9hdXh2ZWMuaCBiL2FyY2gvYXJtL2luY2x1ZGUvdWFwaS9hc20vYXV4dmVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IwMmE3NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvdWFwaS9hc20vYXV4dmVjLmgKQEAgLTAsMCArMSw3IEBACisjaWZuZGVmIF9fQVNNX0FVWFZFQ19ICisjZGVmaW5lIF9fQVNNX0FVWFZFQ19ICisKKy8qIFZEU08gbG9jYXRpb24gKi8KKyNkZWZpbmUgQVRfU1lTSU5GT19FSERSCTMzCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9rdm0uaCBiL2FyY2gvYXJtL2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKaW5kZXggMGRiMjViYy4uMjQ5OTg2NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS91YXBpL2FzbS9rdm0uaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCkBAIC0xOTgsNiArMTk4LDkgQEAKIC8qIEhpZ2hlc3Qgc3VwcG9ydGVkIFNQSSwgZnJvbSBWR0lDX05SX0lSUVMgKi8KICNkZWZpbmUgS1ZNX0FSTV9JUlFfR0lDX01BWAkJMTI3CiAKKy8qIE9uZSBzaW5nbGUgS1ZNIGlycWNoaXAsIGllLiB0aGUgVkdJQyAqLworI2RlZmluZSBLVk1fTlJfSVJRQ0hJUFMgICAgICAgICAgMQorCiAvKiBQU0NJIGludGVyZmFjZSAqLwogI2RlZmluZSBLVk1fUFNDSV9GTl9CQVNFCQkweDk1YzFiYTVlCiAjZGVmaW5lIEtWTV9QU0NJX0ZOKG4pCQkJKEtWTV9QU0NJX0ZOX0JBU0UgKyAobikpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2FybS9rZXJuZWwvTWFrZWZpbGUKaW5kZXggOTAyMzk3ZC4uNzUyNzI1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTYsNyArMTYsNyBAQAogIyBPYmplY3QgZmlsZSBsaXN0cy4KIAogb2JqLXkJCTo9IGVsZi5vIGVudHJ5LWNvbW1vbi5vIGlycS5vIG9wY29kZXMubyBcCi0JCSAgIHByb2Nlc3MubyBwdHJhY2UubyByZXR1cm5fYWRkcmVzcy5vIFwKKwkJICAgcHJvY2Vzcy5vIHB0cmFjZS5vIHJlYm9vdC5vIHJldHVybl9hZGRyZXNzLm8gXAogCQkgICBzZXR1cC5vIHNpZ25hbC5vIHNpZ3JldHVybl9jb2Rlcy5vIFwKIAkJICAgc3RhY2t0cmFjZS5vIHN5c19hcm0ubyB0aW1lLm8gdHJhcHMubwogCkBAIC0zNCw3ICszNCw2IEBACiBvYmotJChDT05GSUdfSVNBX0RNQV9BUEkpCSs9IGRtYS5vCiBvYmotJChDT05GSUdfRklRKQkJKz0gZmlxLm8gZmlxYXNtLm8KIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gYXJta3N5bXMubyBtb2R1bGUubwotb2JqLSQoQ09ORklHX0FSVEhVUikJCSs9IGFydGh1ci5vCiBvYmotJChDT05GSUdfSVNBX0RNQSkJCSs9IGRtYS1pc2Eubwogb2JqLSQoQ09ORklHX1BDSSkJCSs9IGJpb3MzMi5vIGlzYS5vCiBvYmotJChDT05GSUdfQVJNX0NQVV9TVVNQRU5EKQkrPSBzbGVlcC5vIHN1c3BlbmQubwpAQCAtNzUsNiArNzQsNyBAQAogQ0ZMQUdTX3BqNC1jcDAubwkJOj0gLW1hcm0KIEFGTEFHU19pd21teHQubwkJCTo9IC1XYSwtbWNwdT1pd21teHQKIG9iai0kKENPTkZJR19BUk1fQ1BVX1RPUE9MT0dZKSAgKz0gdG9wb2xvZ3kubworb2JqLSQoQ09ORklHX1ZEU08pCQkrPSB2ZHNvLm8KIAogaWZuZXEgKCQoQ09ORklHX0FSQ0hfRUJTQTExMCkseSkKICAgb2JqLXkJCSs9IGlvLm8KQEAgLTg2LDcgKzg2LDcgQEAKIAogb2JqLSQoQ09ORklHX0FSTV9WSVJUX0VYVCkJKz0gaHlwLXN0dWIubwogaWZlcSAoJChDT05GSUdfQVJNX1BTQ0kpLHkpCi1vYmoteQkJCQkrPSBwc2NpLm8KK29iai15CQkJCSs9IHBzY2kubyBwc2NpLWNhbGwubwogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHBzY2lfc21wLm8KIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9hcnRodXIuYyBiL2FyY2gvYXJtL2tlcm5lbC9hcnRodXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIxYzUyOS4uMDAwMDAwMAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYXJ0aHVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvYXJtL2tlcm5lbC9hcnRodXIuYwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEgUGhpbGlwIEJsdW5kZWxsCi0gKgotICogQXJ0aHVyIHBlcnNvbmFsaXR5Ci0gKi8KLQotLyoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BlcnNvbmFsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+Ci0jaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0KLS8qIEFydGh1ciBkb2Vzbid0IGhhdmUgbWFueSBzaWduYWxzLCBhbmQgYSBsb3Qgb2YgdGhvc2UgdGhhdCBpdCBkb2VzCi0gICBoYXZlIGRvbid0IG1hcCBlYXNpbHkgdG8gYW55IExpbnV4IGVxdWl2YWxlbnQuICBOZXZlciBtaW5kLiAgKi8KLQotI2RlZmluZSBBUlRIVVJfU0lHQUJSVAkJMQotI2RlZmluZSBBUlRIVVJfU0lHRlBFCQkyCi0jZGVmaW5lIEFSVEhVUl9TSUdJTEwJCTMKLSNkZWZpbmUgQVJUSFVSX1NJR0lOVAkJNAotI2RlZmluZSBBUlRIVVJfU0lHU0VHVgkJNQotI2RlZmluZSBBUlRIVVJfU0lHVEVSTQkJNgotI2RlZmluZSBBUlRIVVJfU0lHU1RBSwkJNwotI2RlZmluZSBBUlRIVVJfU0lHVVNSMQkJOAotI2RlZmluZSBBUlRIVVJfU0lHVVNSMgkJOQotI2RlZmluZSBBUlRIVVJfU0lHT1NFUlJPUgkxMAotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBhcnRodXJfdG9fbGludXhfc2lnbmFsc1szMl0gPSB7Ci0JMCwJMSwJMiwJMywJNCwJNSwJNiwJNywKLQk4LAk5LAkxMCwJMTEsCTEyLAkxMywJMTQsCTE1LAotCTE2LAkxNywJMTgsCTE5LAkyMCwJMjEsCTIyLAkyMywKLQkyNCwJMjUsCTI2LAkyNywJMjgsCTI5LAkzMCwJMzEKLX07Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxpbnV4X3RvX2FydGh1cl9zaWduYWxzWzMyXSA9IHsKLQkwLAkJLTEsCQlBUlRIVVJfU0lHSU5ULAktMSwKLSAgICAgICAJQVJUSFVSX1NJR0lMTCwJNSwJCUFSVEhVUl9TSUdBQlJULAk3LAotCUFSVEhVUl9TSUdGUEUsCTksCQlBUlRIVVJfU0lHVVNSMSwJQVJUSFVSX1NJR1NFR1YsCQotCUFSVEhVUl9TSUdVU1IyLAkxMywJCTE0LAkJQVJUSFVSX1NJR1RFUk0sCi0JMTYsCQkxNywJCTE4LAkJMTksCi0JMjAsCQkyMSwJCTIyLAkJMjMsCi0JMjQsCQkyNSwJCTI2LAkJMjcsCi0JMjgsCQkyOSwJCTMwLAkJMzEKLX07Ci0KLXN0YXRpYyB2b2lkIGFydGh1cl9sY2FsbDcoaW50IG5yLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwotCWluZm8uc2lfc2lnbm8gPSBTSUdTV0k7Ci0JaW5mby5zaV9lcnJubyA9IG5yOwotCS8qIEJvdW5jZSBpdCB0byB0aGUgZW11bGF0b3IgKi8KLQlzZW5kX3NpZ19pbmZvKFNJR1NXSSwgJmluZm8sIGN1cnJlbnQpOwotfQotCi1zdGF0aWMgc3RydWN0IGV4ZWNfZG9tYWluIGFydGh1cl9leGVjX2RvbWFpbiA9IHsKLQkubmFtZQkJPSAiQXJ0aHVyIiwKLQkuaGFuZGxlcgk9IGFydGh1cl9sY2FsbDcsCi0JLnBlcnNfbG93CT0gUEVSX1JJU0NPUywKLQkucGVyc19oaWdoCT0gUEVSX1JJU0NPUywKLQkuc2lnbmFsX21hcAk9IGFydGh1cl90b19saW51eF9zaWduYWxzLAotCS5zaWduYWxfaW52bWFwCT0gbGludXhfdG9fYXJ0aHVyX3NpZ25hbHMsCi0JLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKLX07Ci0KLS8qCi0gKiBXZSBjb3VsZCBkbyB3aXRoIHNvbWUgbG9ja2luZyB0byBzdG9wIEFydGh1ciBiZWluZyByZW1vdmVkIHdoaWxlCi0gKiBwcm9jZXNzZXMgYXJlIHVzaW5nIGl0LgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGFydGh1cl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHJlZ2lzdGVyX2V4ZWNfZG9tYWluKCZhcnRodXJfZXhlY19kb21haW4pOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXJ0aHVyX2V4aXQodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX2V4ZWNfZG9tYWluKCZhcnRodXJfZXhlY19kb21haW4pOwotfQotCi1tb2R1bGVfaW5pdChhcnRodXJfaW5pdCk7Ci1tb2R1bGVfZXhpdChhcnRodXJfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9hcm0va2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggMmQyZDYwOC4uODcxYjgyNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxhc20vbWVtb3J5Lmg+CiAjaW5jbHVkZSA8YXNtL3Byb2NpbmZvLmg+CiAjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KKyNpbmNsdWRlIDxhc20vdmRzb19kYXRhcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9jYWNoZS1sMngwLmg+CiAjaW5jbHVkZSA8bGludXgva2J1aWxkLmg+CiAKQEAgLTY2LDcgKzY3LDYgQEAKICAgREVGSU5FKFRJX1BSRUVNUFQsCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHByZWVtcHRfY291bnQpKTsKICAgREVGSU5FKFRJX0FERFJfTElNSVQsCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGFkZHJfbGltaXQpKTsKICAgREVGSU5FKFRJX1RBU0ssCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHRhc2spKTsKLSAgREVGSU5FKFRJX0VYRUNfRE9NQUlOLAlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGV4ZWNfZG9tYWluKSk7CiAgIERFRklORShUSV9DUFUsCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGNwdSkpOwogICBERUZJTkUoVElfQ1BVX0RPTUFJTiwJCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgY3B1X2RvbWFpbikpOwogICBERUZJTkUoVElfQ1BVX1NBVkUsCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGNwdV9jb250ZXh0KSk7CkBAIC0xOTAsNyArMTkwLDYgQEAKICAgREVGSU5FKFZDUFVfSHhGQVIsCQlvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guZmF1bHQuaHhmYXIpKTsKICAgREVGSU5FKFZDUFVfSFBGQVIsCQlvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2guZmF1bHQuaHBmYXIpKTsKICAgREVGSU5FKFZDUFVfSFlQX1BDLAkJb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLmZhdWx0Lmh5cF9wYykpOwotI2lmZGVmIENPTkZJR19LVk1fQVJNX1ZHSUMKICAgREVGSU5FKFZDUFVfVkdJQ19DUFUsCQlvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudmdpY19jcHUpKTsKICAgREVGSU5FKFZHSUNfVjJfQ1BVX0hDUiwJb2Zmc2V0b2Yoc3RydWN0IHZnaWNfY3B1LCB2Z2ljX3YyLnZnaWNfaGNyKSk7CiAgIERFRklORShWR0lDX1YyX0NQVV9WTUNSLAlvZmZzZXRvZihzdHJ1Y3QgdmdpY19jcHUsIHZnaWNfdjIudmdpY192bWNyKSk7CkBAIC0yMDAsMTUgKzE5OSwxNiBAQAogICBERUZJTkUoVkdJQ19WMl9DUFVfQVBSLAlvZmZzZXRvZihzdHJ1Y3QgdmdpY19jcHUsIHZnaWNfdjIudmdpY19hcHIpKTsKICAgREVGSU5FKFZHSUNfVjJfQ1BVX0xSLAlvZmZzZXRvZihzdHJ1Y3QgdmdpY19jcHUsIHZnaWNfdjIudmdpY19scikpOwogICBERUZJTkUoVkdJQ19DUFVfTlJfTFIsCW9mZnNldG9mKHN0cnVjdCB2Z2ljX2NwdSwgbnJfbHIpKTsKLSNpZmRlZiBDT05GSUdfS1ZNX0FSTV9USU1FUgogICBERUZJTkUoVkNQVV9USU1FUl9DTlRWX0NUTCwJb2Zmc2V0b2Yoc3RydWN0IGt2bV92Y3B1LCBhcmNoLnRpbWVyX2NwdS5jbnR2X2N0bCkpOwogICBERUZJTkUoVkNQVV9USU1FUl9DTlRWX0NWQUwsCW9mZnNldG9mKHN0cnVjdCBrdm1fdmNwdSwgYXJjaC50aW1lcl9jcHUuY250dl9jdmFsKSk7CiAgIERFRklORShLVk1fVElNRVJfQ05UVk9GRiwJb2Zmc2V0b2Yoc3RydWN0IGt2bSwgYXJjaC50aW1lci5jbnR2b2ZmKSk7CiAgIERFRklORShLVk1fVElNRVJfRU5BQkxFRCwJb2Zmc2V0b2Yoc3RydWN0IGt2bSwgYXJjaC50aW1lci5lbmFibGVkKSk7Ci0jZW5kaWYKICAgREVGSU5FKEtWTV9WR0lDX1ZDVFJMLAlvZmZzZXRvZihzdHJ1Y3Qga3ZtLCBhcmNoLnZnaWMudmN0cmxfYmFzZSkpOwotI2VuZGlmCiAgIERFRklORShLVk1fVlRUQlIsCQlvZmZzZXRvZihzdHJ1Y3Qga3ZtLCBhcmNoLnZ0dGJyKSk7CiAjZW5kaWYKKyAgQkxBTksoKTsKKyNpZmRlZiBDT05GSUdfVkRTTworICBERUZJTkUoVkRTT19EQVRBX1NJWkUsCXNpemVvZih1bmlvbiB2ZHNvX2RhdGFfc3RvcmUpKTsKKyNlbmRpZgogICByZXR1cm4gMDsgCiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMgYi9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKaW5kZXggYWIxOWI3YzAuLmZjYmJiYjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYworKysgYi9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKQEAgLTYxOCwyMSArNjE4LDE1IEBACiBpbnQgcGNpX21tYXBfcGFnZV9yYW5nZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCWVudW0gcGNpX21tYXBfc3RhdGUgbW1hcF9zdGF0ZSwgaW50IHdyaXRlX2NvbWJpbmUpCiB7Ci0Jc3RydWN0IHBjaV9zeXNfZGF0YSAqcm9vdCA9IGRldi0+c3lzZGF0YTsKLQl1bnNpZ25lZCBsb25nIHBoeXM7Ci0KLQlpZiAobW1hcF9zdGF0ZSA9PSBwY2lfbW1hcF9pbykgeworCWlmIChtbWFwX3N0YXRlID09IHBjaV9tbWFwX2lvKQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlwaHlzID0gdm1hLT52bV9wZ29mZiArIChyb290LT5tZW1fb2Zmc2V0ID4+IFBBR0VfU0hJRlQpOwotCX0KIAogCS8qCiAJICogTWFyayB0aGlzIGFzIElPCiAJICovCiAJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKIAotCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCBwaHlzLAorCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3Bnb2ZmLAogCQkJICAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCiAJCQkgICAgIHZtYS0+dm1fcGFnZV9wcm90KSkKIAkJcmV0dXJuIC1FQUdBSU47CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvY3B1aWRsZS5jIGIvYXJjaC9hcm0va2VybmVsL2NwdWlkbGUuYwppbmRleCA4OTU0NWY2Li4zMThkYTMzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvY3B1aWRsZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9jcHVpZGxlLmMKQEAgLTEwLDggKzEwLDI4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGFzbS9jcHVpZGxlLmg+CiAKK2V4dGVybiBzdHJ1Y3Qgb2ZfY3B1aWRsZV9tZXRob2QgX19jcHVpZGxlX21ldGhvZF9vZl90YWJsZVtdOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2NwdWlkbGVfbWV0aG9kIF9fY3B1aWRsZV9tZXRob2Rfb2ZfdGFibGVfc2VudGluZWwKKwlfX3VzZWQgX19zZWN0aW9uKF9fY3B1aWRsZV9tZXRob2Rfb2ZfdGFibGVfZW5kKTsKKworc3RhdGljIHN0cnVjdCBjcHVpZGxlX29wcyBjcHVpZGxlX29wc1tOUl9DUFVTXTsKKworLyoqCisgKiBhcm1fY3B1aWRsZV9zaW1wbGVfZW50ZXIoKSAtIGEgd3JhcHBlciB0byBjcHVfZG9faWRsZSgpCisgKiBAZGV2OiBub3QgdXNlZAorICogQGRydjogbm90IHVzZWQKKyAqIEBpbmRleDogbm90IHVzZWQKKyAqCisgKiBBIHRyaXZpYWwgd3JhcHBlciB0byBhbGxvdyB0aGUgY3B1X2RvX2lkbGUgZnVuY3Rpb24gdG8gYmUgYXNzaWduZWQgYXMgYQorICogY3B1aWRsZSBjYWxsYmFjayBieSBtYXRjaGluZyB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlLgorICoKKyAqIFJldHVybnMgdGhlIGluZGV4IHBhc3NlZCBhcyBwYXJhbWV0ZXIKKyAqLwogaW50IGFybV9jcHVpZGxlX3NpbXBsZV9lbnRlcihzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKIAkJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYsIGludCBpbmRleCkKIHsKQEAgLTE5LDMgKzM5LDExNCBAQAogCiAJcmV0dXJuIGluZGV4OwogfQorCisvKioKKyAqIGFybV9jcHVpZGxlX3N1c3BlbmQoKSAtIGZ1bmN0aW9uIHRvIGVudGVyIGxvdyBwb3dlciBpZGxlIHN0YXRlcworICogQGluZGV4OiBhbiBpbnRlZ2VyIHVzZWQgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGxvdyBsZXZlbCBQTSBjYWxsYmFja3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSB1bmRlcmx5aW5nIGFyY2ggc3BlY2lmaWMgbG93IGxldmVsIFBNIGNvZGUgYXMKKyAqIHJlZ2lzdGVyZWQgYXQgdGhlIGluaXQgdGltZS4KKyAqCisgKiBSZXR1cm5zIC1FT1BOT1RTVVBQIGlmIG5vIHN1c3BlbmQgY2FsbGJhY2sgaXMgZGVmaW5lZCwgdGhlIHJlc3VsdCBvZiB0aGUKKyAqIGNhbGxiYWNrIG90aGVyd2lzZS4KKyAqLworaW50IGFybV9jcHVpZGxlX3N1c3BlbmQoaW50IGluZGV4KQoreworCWludCByZXQgPSAtRU9QTk9UU1VQUDsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJaWYgKGNwdWlkbGVfb3BzW2NwdV0uc3VzcGVuZCkKKwkJcmV0ID0gY3B1aWRsZV9vcHNbY3B1XS5zdXNwZW5kKGNwdSwgaW5kZXgpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBhcm1fY3B1aWRsZV9nZXRfb3BzKCkgLSBmaW5kIGEgcmVnaXN0ZXJlZCBjcHVpZGxlX29wcyBieSBuYW1lCisgKiBAbWV0aG9kOiB0aGUgbWV0aG9kIG5hbWUKKyAqCisgKiBTZWFyY2ggaW4gdGhlIF9fY3B1aWRsZV9tZXRob2Rfb2ZfdGFibGUgYXJyYXkgdGhlIGNwdWlkbGUgb3BzIG1hdGNoaW5nIHRoZQorICogbWV0aG9kIG5hbWUuCisgKgorICogUmV0dXJucyBhIHN0cnVjdCBjcHVpZGxlX29wcyBwb2ludGVyLCBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqLworc3RhdGljIHN0cnVjdCBjcHVpZGxlX29wcyAqX19pbml0IGFybV9jcHVpZGxlX2dldF9vcHMoY29uc3QgY2hhciAqbWV0aG9kKQoreworCXN0cnVjdCBvZl9jcHVpZGxlX21ldGhvZCAqbSA9IF9fY3B1aWRsZV9tZXRob2Rfb2ZfdGFibGU7CisKKwlmb3IgKDsgbS0+bWV0aG9kOyBtKyspCisJCWlmICghc3RyY21wKG0tPm1ldGhvZCwgbWV0aG9kKSkKKwkJCXJldHVybiBtLT5vcHM7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBhcm1fY3B1aWRsZV9yZWFkX29wcygpIC0gSW5pdGlhbGl6ZSB0aGUgY3B1aWRsZSBvcHMgd2l0aCB0aGUgZGV2aWNlIHRyZWUKKyAqIEBkbjogYSBwb2ludGVyIHRvIGEgc3RydWN0IGRldmljZSBub2RlIGNvcnJlc3BvbmRpbmcgdG8gYSBjcHUgbm9kZQorICogQGNwdTogdGhlIGNwdSBpZGVudGlmaWVyCisgKgorICogR2V0IHRoZSBtZXRob2QgbmFtZSBkZWZpbmVkIGluIHRoZSAnZW5hYmxlLW1ldGhvZCcgcHJvcGVydHksIHJldHJpZXZlIHRoZQorICogYXNzb2NpYXRlZCBjcHVpZGxlX29wcyBhbmQgZG8gYSBzdHJ1Y3QgY29weS4gVGhpcyBjb3B5IGlzIG5lZWRlZCBiZWNhdXNlIGFsbAorICogY3B1aWRsZV9vcHMgYXJlIHRhZ2dlZCBfX2luaXRkYXRhIGFuZCB3aWxsIGJlIHVubG9hZGVkIGFmdGVyIHRoZSBpbml0CisgKiBwcm9jZXNzLgorICoKKyAqIFJldHVybiAwIG9uIHN1Y2VzcywgLUVOT0VOVCBpZiBubyAnZW5hYmxlLW1ldGhvZCcgaXMgZGVmaW5lZCwgLUVPUE5PVFNVUFAgaWYKKyAqIG5vIGNwdWlkbGVfb3BzIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSAnZW5hYmxlLW1ldGhvZCcuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGFybV9jcHVpZGxlX3JlYWRfb3BzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sIGludCBjcHUpCit7CisJY29uc3QgY2hhciAqZW5hYmxlX21ldGhvZDsKKwlzdHJ1Y3QgY3B1aWRsZV9vcHMgKm9wczsKKworCWVuYWJsZV9tZXRob2QgPSBvZl9nZXRfcHJvcGVydHkoZG4sICJlbmFibGUtbWV0aG9kIiwgTlVMTCk7CisJaWYgKCFlbmFibGVfbWV0aG9kKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW9wcyA9IGFybV9jcHVpZGxlX2dldF9vcHMoZW5hYmxlX21ldGhvZCk7CisJaWYgKCFvcHMpIHsKKwkJcHJfd2FybigiJXM6IHVuc3VwcG9ydGVkIGVuYWJsZS1tZXRob2QgcHJvcGVydHk6ICVzXG4iLAorCQkJZG4tPmZ1bGxfbmFtZSwgZW5hYmxlX21ldGhvZCk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwljcHVpZGxlX29wc1tjcHVdID0gKm9wczsgLyogc3RydWN0dXJlIGNvcHkgKi8KKworCXByX25vdGljZSgiY3B1aWRsZTogZW5hYmxlLW1ldGhvZCBwcm9wZXJ0eSAnJXMnIgorCQkgICIgZm91bmQgb3BlcmF0aW9uc1xuIiwgZW5hYmxlX21ldGhvZCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBhcm1fY3B1aWRsZV9pbml0KCkgLSBJbml0aWFsaXplIGNwdWlkbGVfb3BzIGZvciBhIHNwZWNpZmljIGNwdQorICogQGNwdTogdGhlIGNwdSB0byBiZSBpbml0aWFsaXplZAorICoKKyAqIEluaXRpYWxpemUgdGhlIGNwdWlkbGUgb3BzIHdpdGggdGhlIGRldmljZSBmb3IgdGhlIGNwdSBhbmQgdGhlbiBjYWxsCisgKiB0aGUgY3B1J3MgaWRsZSBpbml0aWFsaXphdGlvbiBjYWxsYmFjay4gVGhpcyBtYXkgZmFpbCBpZiB0aGUgdW5kZXJseWluZyBIVworICogaXMgbm90IG9wZXJhdGlvbmFsLgorICoKKyAqIFJldHVybnM6CisgKiAgMCBvbiBzdWNjZXNzLAorICogIC1FTk9ERVYgaWYgaXQgZmFpbHMgdG8gZmluZCB0aGUgY3B1IG5vZGUgaW4gdGhlIGRldmljZSB0cmVlLAorICogIC1FT1BOT1RTVVBQIGlmIGl0IGRvZXMgbm90IGZpbmQgYSByZWdpc3RlcmVkIGNwdWlkbGVfb3BzIGZvciB0aGlzIGNwdSwKKyAqICAtRU5PRU5UIGlmIGl0IGZhaWxzIHRvIGZpbmQgYW4gJ2VuYWJsZS1tZXRob2QnIHByb3BlcnR5LAorICogIC1FTlhJTyBpZiB0aGUgSFcgcmVwb3J0cyBhIGZhaWx1cmUgb3IgYSBtaXNjb25maWd1cmF0aW9uLAorICogIC1FTk9NRU0gaWYgdGhlIEhXIHJlcG9ydCBhbiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlIAorICovCitpbnQgX19pbml0IGFybV9jcHVpZGxlX2luaXQoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNwdV9ub2RlID0gb2ZfY3B1X2RldmljZV9ub2RlX2dldChjcHUpOworCWludCByZXQ7CisKKwlpZiAoIWNwdV9ub2RlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGFybV9jcHVpZGxlX3JlYWRfb3BzKGNwdV9ub2RlLCBjcHUpOworCWlmICghcmV0ICYmIGNwdWlkbGVfb3BzW2NwdV0uaW5pdCkKKwkJcmV0ID0gY3B1aWRsZV9vcHNbY3B1XS5pbml0KGNwdV9ub2RlLCBjcHUpOworCisJb2Zfbm9kZV9wdXQoY3B1X25vZGUpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMgYi9hcmNoL2FybS9rZXJuZWwvZW50cnktYXJtdi5TCmluZGV4IDY3MmIyMTkuLjU3MDMwNmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9lbnRyeS1hcm12LlMKKysrIGIvYXJjaC9hcm0va2VybmVsL2VudHJ5LWFybXYuUwpAQCAtNTQ1LDcgKzU0NSw3IEBACiAvKgogICogVGhlIG91dCBvZiBsaW5lIGZpeHVwIGZvciB0aGUgbGRydCBpbnN0cnVjdGlvbnMgYWJvdmUuCiAgKi8KLQkucHVzaHNlY3Rpb24gLmZpeHVwLCAiYXgiCisJLnB1c2hzZWN0aW9uIC50ZXh0LmZpeHVwLCAiYXgiCiAJLmFsaWduCTIKIDQ6CXN0ciAgICAgcjQsIFtzcCwgI1NfUENdCQkJQCByZXRyeSBjdXJyZW50IGluc3RydWN0aW9uCiAJcmV0CXI5CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaGVhZC5TIGIvYXJjaC9hcm0va2VybmVsL2hlYWQuUwppbmRleCAwMTk2MzI3Li4zNjM3OTczIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9oZWFkLlMKQEAgLTEzOCw5ICsxMzgsOSBAQAogCQkJCQkJQCBtbXUgaGFzIGJlZW4gZW5hYmxlZAogCWFkcglsciwgQlNZTSgxZikJCQlAIHJldHVybiAoUElDKSBhZGRyZXNzCiAJbW92CXI4LCByNAkJCQlAIHNldCBUVEJSMSB0byBzd2FwcGVyX3BnX2RpcgotIEFSTSgJYWRkCXBjLCByMTAsICNQUk9DSU5GT19JTklURlVOQwkpCi0gVEhVTUIoCWFkZAlyMTIsIHIxMCwgI1BST0NJTkZPX0lOSVRGVU5DCSkKLSBUSFVNQigJcmV0CXIxMgkJCQkpCisJbGRyCXIxMiwgW3IxMCwgI1BST0NJTkZPX0lOSVRGVU5DXQorCWFkZAlyMTIsIHIxMiwgcjEwCisJcmV0CXIxMgogMToJYglfX2VuYWJsZV9tbXUKIEVORFBST0Moc3RleHQpCiAJLmx0b3JnCkBAIC0zODYsMTAgKzM4NiwxMCBAQAogCWxkcglyOCwgW3I3LCBscl0JCQlAIGdldCBzZWNvbmRhcnlfZGF0YS5zd2FwcGVyX3BnX2RpcgogCWFkcglsciwgQlNZTShfX2VuYWJsZV9tbXUpCQlAIHJldHVybiBhZGRyZXNzCiAJbW92CXIxMywgcjEyCQkJQCBfX3NlY29uZGFyeV9zd2l0Y2hlZCBhZGRyZXNzCi0gQVJNKAlhZGQJcGMsIHIxMCwgI1BST0NJTkZPX0lOSVRGVU5DCSkgQCBpbml0aWFsaXNlIHByb2Nlc3NvcgotCQkJCQkJICBAIChyZXR1cm4gY29udHJvbCByZWcpCi0gVEhVTUIoCWFkZAlyMTIsIHIxMCwgI1BST0NJTkZPX0lOSVRGVU5DCSkKLSBUSFVNQigJcmV0CXIxMgkJCQkpCisJbGRyCXIxMiwgW3IxMCwgI1BST0NJTkZPX0lOSVRGVU5DXQorCWFkZAlyMTIsIHIxMiwgcjEwCQkJQCBpbml0aWFsaXNlIHByb2Nlc3NvcgorCQkJCQkJQCAocmV0dXJuIGNvbnRyb2wgcmVnKQorCXJldAlyMTIKIEVORFBST0Moc2Vjb25kYXJ5X3N0YXJ0dXApCiBFTkRQUk9DKHNlY29uZGFyeV9zdGFydHVwX2FybSkKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2hpYmVybmF0ZS5jIGIvYXJjaC9hcm0va2VybmVsL2hpYmVybmF0ZS5jCmluZGV4IGM0Y2M1MGUuLmE3MTUwMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9oaWJlcm5hdGUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvaGliZXJuYXRlLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgogI2luY2x1ZGUgPGFzbS9tZW1vcnkuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KKyNpbmNsdWRlICJyZWJvb3QuaCIKIAogaW50IHBmbl9pc19ub3NhdmUodW5zaWduZWQgbG9uZyBwZm4pCiB7CkBAIC02MSw3ICs2Miw3IEBACiAKIAlyZXQgPSBzd3N1c3Bfc2F2ZSgpOwogCWlmIChyZXQgPT0gMCkKLQkJc29mdF9yZXN0YXJ0KHZpcnRfdG9fcGh5cyhjcHVfcmVzdW1lKSk7CisJCV9zb2Z0X3Jlc3RhcnQodmlydF90b19waHlzKGNwdV9yZXN1bWUpLCBmYWxzZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtODYsNyArODcsNyBAQAogCWZvciAocGJlID0gcmVzdG9yZV9wYmxpc3Q7IHBiZTsgcGJlID0gcGJlLT5uZXh0KQogCQljb3B5X3BhZ2UocGJlLT5vcmlnX2FkZHJlc3MsIHBiZS0+YWRkcmVzcyk7CiAKLQlzb2Z0X3Jlc3RhcnQodmlydF90b19waHlzKGNwdV9yZXN1bWUpKTsKKwlfc29mdF9yZXN0YXJ0KHZpcnRfdG9fcGh5cyhjcHVfcmVzdW1lKSwgZmFsc2UpOwogfQogCiBzdGF0aWMgdTY0IHJlc3VtZV9zdGFja1tQQUdFX1NJWkUvMi9zaXplb2YodTY0KV0gX19ub3NhdmVkYXRhOwpAQCAtOTksNyArMTAwLDYgQEAKICAqLwogaW50IHN3c3VzcF9hcmNoX3Jlc3VtZSh2b2lkKQogewotCWV4dGVybiB2b2lkIGNhbGxfd2l0aF9zdGFjayh2b2lkICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZywgdm9pZCAqc3ApOwogCWNhbGxfd2l0aF9zdGFjayhhcmNoX3Jlc3RvcmVfaW1hZ2UsIDAsCiAJCXJlc3VtZV9zdGFjayArIEFSUkFZX1NJWkUocmVzdW1lX3N0YWNrKSk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvaHdfYnJlYWtwb2ludC5jIGIvYXJjaC9hcm0va2VybmVsL2h3X2JyZWFrcG9pbnQuYwppbmRleCA3ZmM3MGFlLi5kYzdkMGE5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9od19icmVha3BvaW50LmMKQEAgLTY0OCw3ICs2NDgsNyBAQAogCQkgKiBQZXItY3B1IGJyZWFrcG9pbnRzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IG91ciBzdGVwcGluZwogCQkgKiBtZWNoYW5pc20uCiAJCSAqLwotCQlpZiAoIWJwLT5ody5icF90YXJnZXQpCisJCWlmICghYnAtPmh3LnRhcmdldCkKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCS8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC9hcm0va2VybmVsL21hY2hpbmVfa2V4ZWMuYwppbmRleCBkZTJiMDg1Li44YmYzYjdjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTQ2LDcgKzQ2LDggQEAKIAkgKiBhbmQgaW1wbGVtZW50cyBDUFUgaG90cGx1ZyBmb3IgdGhlIGN1cnJlbnQgSFcuIElmIG5vdCwgd2Ugd29uJ3QgYmUKIAkgKiBhYmxlIHRvIGtleGVjIHJlbGlhYmx5LCBzbyBmYWlsIHRoZSBwcmVwYXJlIG9wZXJhdGlvbi4KIAkgKi8KLQlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDEgJiYgIXBsYXRmb3JtX2Nhbl9jcHVfaG90cGx1ZygpKQorCWlmIChudW1fcG9zc2libGVfY3B1cygpID4gMSAmJiBwbGF0Zm9ybV9jYW5fc2Vjb25kYXJ5X2Jvb3QoKSAmJgorCSAgICAhcGxhdGZvcm1fY2FuX2NwdV9ob3RwbHVnKCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gvYXJtL2tlcm5lbC9tb2R1bGUuYwppbmRleCAyZTExOTYxLi5hZjc5MWY0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL21vZHVsZS5jCkBAIC05OCwxNCArOTgsMTkgQEAKIAkJY2FzZSBSX0FSTV9QQzI0OgogCQljYXNlIFJfQVJNX0NBTEw6CiAJCWNhc2UgUl9BUk1fSlVNUDI0OgorCQkJaWYgKHN5bS0+c3RfdmFsdWUgJiAzKSB7CisJCQkJcHJfZXJyKCIlczogc2VjdGlvbiAldSByZWxvYyAldSBzeW0gJyVzJzogdW5zdXBwb3J0ZWQgaW50ZXJ3b3JraW5nIGNhbGwgKEFSTSAtPiBUaHVtYilcbiIsCisJCQkJICAgICAgIG1vZHVsZS0+bmFtZSwgcmVsaW5kZXgsIGksIHN5bW5hbWUpOworCQkJCXJldHVybiAtRU5PRVhFQzsKKwkJCX0KKwogCQkJb2Zmc2V0ID0gX19tZW1fdG9fb3Bjb2RlX2FybSgqKHUzMiAqKWxvYyk7CiAJCQlvZmZzZXQgPSAob2Zmc2V0ICYgMHgwMGZmZmZmZikgPDwgMjsKIAkJCWlmIChvZmZzZXQgJiAweDAyMDAwMDAwKQogCQkJCW9mZnNldCAtPSAweDA0MDAwMDAwOwogCiAJCQlvZmZzZXQgKz0gc3ltLT5zdF92YWx1ZSAtIGxvYzsKLQkJCWlmIChvZmZzZXQgJiAzIHx8Ci0JCQkgICAgb2Zmc2V0IDw9IChzMzIpMHhmZTAwMDAwMCB8fAorCQkJaWYgKG9mZnNldCA8PSAoczMyKTB4ZmUwMDAwMDAgfHwKIAkJCSAgICBvZmZzZXQgPj0gKHMzMikweDAyMDAwMDAwKSB7CiAJCQkJcHJfZXJyKCIlczogc2VjdGlvbiAldSByZWxvYyAldSBzeW0gJyVzJzogcmVsb2NhdGlvbiAldSBvdXQgb2YgcmFuZ2UgKCUjbHggLT4gJSN4KVxuIiwKIAkJCQkgICAgICAgbW9kdWxlLT5uYW1lLCByZWxpbmRleCwgaSwgc3ltbmFtZSwKQEAgLTE1NSw2ICsxNjAsMjIgQEAKICNpZmRlZiBDT05GSUdfVEhVTUIyX0tFUk5FTAogCQljYXNlIFJfQVJNX1RITV9DQUxMOgogCQljYXNlIFJfQVJNX1RITV9KVU1QMjQ6CisJCQkvKgorCQkJICogRm9yIGZ1bmN0aW9uIHN5bWJvbHMsIG9ubHkgVGh1bWIgYWRkcmVzc2VzIGFyZQorCQkJICogYWxsb3dlZCAobm8gaW50ZXJ3b3JraW5nKS4KKwkJCSAqCisJCQkgKiBGb3Igbm9uLWZ1bmN0aW9uIHN5bWJvbHMsIHRoZSBkZXN0aW5hdGlvbgorCQkJICogaGFzIG5vIHNwZWNpZmljIEFSTS9UaHVtYiBkaXNwb3NpdGlvbiwgc28KKwkJCSAqIHRoZSBicmFuY2ggaXMgcmVzb2x2ZWQgdW5kZXIgdGhlIGFzc3VtcHRpb24KKwkJCSAqIHRoYXQgaW50ZXJ3b3JraW5nIGlzIG5vdCByZXF1aXJlZC4KKwkJCSAqLworCQkJaWYgKEVMRjMyX1NUX1RZUEUoc3ltLT5zdF9pbmZvKSA9PSBTVFRfRlVOQyAmJgorCQkJICAgICEoc3ltLT5zdF92YWx1ZSAmIDEpKSB7CisJCQkJcHJfZXJyKCIlczogc2VjdGlvbiAldSByZWxvYyAldSBzeW0gJyVzJzogdW5zdXBwb3J0ZWQgaW50ZXJ3b3JraW5nIGNhbGwgKFRodW1iIC0+IEFSTSlcbiIsCisJCQkJICAgICAgIG1vZHVsZS0+bmFtZSwgcmVsaW5kZXgsIGksIHN5bW5hbWUpOworCQkJCXJldHVybiAtRU5PRVhFQzsKKwkJCX0KKwogCQkJdXBwZXIgPSBfX21lbV90b19vcGNvZGVfdGh1bWIxNigqKHUxNiAqKWxvYyk7CiAJCQlsb3dlciA9IF9fbWVtX3RvX29wY29kZV90aHVtYjE2KCoodTE2ICopKGxvYyArIDIpKTsKIApAQCAtMTgyLDE4ICsyMDMsNyBAQAogCQkJCW9mZnNldCAtPSAweDAyMDAwMDAwOwogCQkJb2Zmc2V0ICs9IHN5bS0+c3RfdmFsdWUgLSBsb2M7CiAKLQkJCS8qCi0JCQkgKiBGb3IgZnVuY3Rpb24gc3ltYm9scywgb25seSBUaHVtYiBhZGRyZXNzZXMgYXJlCi0JCQkgKiBhbGxvd2VkIChubyBpbnRlcndvcmtpbmcpLgotCQkJICoKLQkJCSAqIEZvciBub24tZnVuY3Rpb24gc3ltYm9scywgdGhlIGRlc3RpbmF0aW9uCi0JCQkgKiBoYXMgbm8gc3BlY2lmaWMgQVJNL1RodW1iIGRpc3Bvc2l0aW9uLCBzbwotCQkJICogdGhlIGJyYW5jaCBpcyByZXNvbHZlZCB1bmRlciB0aGUgYXNzdW1wdGlvbgotCQkJICogdGhhdCBpbnRlcndvcmtpbmcgaXMgbm90IHJlcXVpcmVkLgotCQkJICovCi0JCQlpZiAoKEVMRjMyX1NUX1RZUEUoc3ltLT5zdF9pbmZvKSA9PSBTVFRfRlVOQyAmJgotCQkJCSEob2Zmc2V0ICYgMSkpIHx8Ci0JCQkgICAgb2Zmc2V0IDw9IChzMzIpMHhmZjAwMDAwMCB8fAorCQkJaWYgKG9mZnNldCA8PSAoczMyKTB4ZmYwMDAwMDAgfHwKIAkJCSAgICBvZmZzZXQgPj0gKHMzMikweDAxMDAwMDAwKSB7CiAJCQkJcHJfZXJyKCIlczogc2VjdGlvbiAldSByZWxvYyAldSBzeW0gJyVzJzogcmVsb2NhdGlvbiAldSBvdXQgb2YgcmFuZ2UgKCUjbHggLT4gJSN4KVxuIiwKIAkJCQkgICAgICAgbW9kdWxlLT5uYW1lLCByZWxpbmRleCwgaSwgc3ltbmFtZSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCmluZGV4IDU1N2UxMjguLjRhODZhMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYwpAQCAtMjU5LDIwICsyNTksMjkgQEAKIH0KIAogc3RhdGljIGludAotdmFsaWRhdGVfZXZlbnQoc3RydWN0IHBtdV9od19ldmVudHMgKmh3X2V2ZW50cywKLQkgICAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQordmFsaWRhdGVfZXZlbnQoc3RydWN0IHBtdSAqcG11LCBzdHJ1Y3QgcG11X2h3X2V2ZW50cyAqaHdfZXZlbnRzLAorCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKLQlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11ID0gdG9fYXJtX3BtdShldmVudC0+cG11KTsKKwlzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11OwogCiAJaWYgKGlzX3NvZnR3YXJlX2V2ZW50KGV2ZW50KSkKIAkJcmV0dXJuIDE7CiAKKwkvKgorCSAqIFJlamVjdCBncm91cHMgc3Bhbm5pbmcgbXVsdGlwbGUgSFcgUE1VcyAoZS5nLiBDUFUgKyBDQ0kpLiBUaGUKKwkgKiBjb3JlIHBlcmYgY29kZSB3b24ndCBjaGVjayB0aGF0IHRoZSBwbXUtPmN0eCA9PSBsZWFkZXItPmN0eAorCSAqIHVudGlsIGFmdGVyIHBtdS0+ZXZlbnRfaW5pdChldmVudCkuCisJICovCisJaWYgKGV2ZW50LT5wbXUgIT0gcG11KQorCQlyZXR1cm4gMDsKKwogCWlmIChldmVudC0+c3RhdGUgPCBQRVJGX0VWRU5UX1NUQVRFX09GRikKIAkJcmV0dXJuIDE7CiAKIAlpZiAoZXZlbnQtPnN0YXRlID09IFBFUkZfRVZFTlRfU1RBVEVfT0ZGICYmICFldmVudC0+YXR0ci5lbmFibGVfb25fZXhlYykKIAkJcmV0dXJuIDE7CiAKKwlhcm1wbXUgPSB0b19hcm1fcG11KGV2ZW50LT5wbXUpOwogCXJldHVybiBhcm1wbXUtPmdldF9ldmVudF9pZHgoaHdfZXZlbnRzLCBldmVudCkgPj0gMDsKIH0KIApAQCAtMjg4LDE1ICsyOTcsMTUgQEAKIAkgKi8KIAltZW1zZXQoJmZha2VfcG11LnVzZWRfbWFzaywgMCwgc2l6ZW9mKGZha2VfcG11LnVzZWRfbWFzaykpOwogCi0JaWYgKCF2YWxpZGF0ZV9ldmVudCgmZmFrZV9wbXUsIGxlYWRlcikpCisJaWYgKCF2YWxpZGF0ZV9ldmVudChldmVudC0+cG11LCAmZmFrZV9wbXUsIGxlYWRlcikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzaWJsaW5nLCAmbGVhZGVyLT5zaWJsaW5nX2xpc3QsIGdyb3VwX2VudHJ5KSB7Ci0JCWlmICghdmFsaWRhdGVfZXZlbnQoJmZha2VfcG11LCBzaWJsaW5nKSkKKwkJaWYgKCF2YWxpZGF0ZV9ldmVudChldmVudC0+cG11LCAmZmFrZV9wbXUsIHNpYmxpbmcpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKCF2YWxpZGF0ZV9ldmVudCgmZmFrZV9wbXUsIGV2ZW50KSkKKwlpZiAoIXZhbGlkYXRlX2V2ZW50KGV2ZW50LT5wbXUsICZmYWtlX3BtdSwgZXZlbnQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfY3B1LmMgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF9jcHUuYwppbmRleCA2MWI1M2M0Li45MWM3YmExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF9jcHUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF9jcHUuYwpAQCAtOTIsMTEgKzkyLDE2IEBACiAJCWZyZWVfcGVyY3B1X2lycShpcnEsICZod19ldmVudHMtPnBlcmNwdV9wbXUpOwogCX0gZWxzZSB7CiAJCWZvciAoaSA9IDA7IGkgPCBpcnFzOyArK2kpIHsKLQkJCWlmICghY3B1bWFza190ZXN0X2FuZF9jbGVhcl9jcHUoaSwgJmNwdV9wbXUtPmFjdGl2ZV9pcnFzKSkKKwkJCWludCBjcHUgPSBpOworCisJCQlpZiAoY3B1X3BtdS0+aXJxX2FmZmluaXR5KQorCQkJCWNwdSA9IGNwdV9wbXUtPmlycV9hZmZpbml0eVtpXTsKKworCQkJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX2NsZWFyX2NwdShjcHUsICZjcHVfcG11LT5hY3RpdmVfaXJxcykpCiAJCQkJY29udGludWU7CiAJCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBtdV9kZXZpY2UsIGkpOwogCQkJaWYgKGlycSA+PSAwKQotCQkJCWZyZWVfaXJxKGlycSwgcGVyX2NwdV9wdHIoJmh3X2V2ZW50cy0+cGVyY3B1X3BtdSwgaSkpOworCQkJCWZyZWVfaXJxKGlycSwgcGVyX2NwdV9wdHIoJmh3X2V2ZW50cy0+cGVyY3B1X3BtdSwgY3B1KSk7CiAJCX0KIAl9CiB9CkBAIC0xMjgsMzIgKzEzMywzNyBAQAogCQlvbl9lYWNoX2NwdShjcHVfcG11X2VuYWJsZV9wZXJjcHVfaXJxLCAmaXJxLCAxKTsKIAl9IGVsc2UgewogCQlmb3IgKGkgPSAwOyBpIDwgaXJxczsgKytpKSB7CisJCQlpbnQgY3B1ID0gaTsKKwogCQkJZXJyID0gMDsKIAkJCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocG11X2RldmljZSwgaSk7CiAJCQlpZiAoaXJxIDwgMCkKIAkJCQljb250aW51ZTsKIAorCQkJaWYgKGNwdV9wbXUtPmlycV9hZmZpbml0eSkKKwkJCQljcHUgPSBjcHVfcG11LT5pcnFfYWZmaW5pdHlbaV07CisKIAkJCS8qCiAJCQkgKiBJZiB3ZSBoYXZlIGEgc2luZ2xlIFBNVSBpbnRlcnJ1cHQgdGhhdCB3ZSBjYW4ndCBzaGlmdCwKIAkJCSAqIGFzc3VtZSB0aGF0IHdlJ3JlIHJ1bm5pbmcgb24gYSB1bmlwcm9jZXNzb3IgbWFjaGluZSBhbmQKIAkJCSAqIGNvbnRpbnVlLiBPdGhlcndpc2UsIGNvbnRpbnVlIHdpdGhvdXQgdGhpcyBpbnRlcnJ1cHQuCiAJCQkgKi8KLQkJCWlmIChpcnFfc2V0X2FmZmluaXR5KGlycSwgY3B1bWFza19vZihpKSkgJiYgaXJxcyA+IDEpIHsKKwkJCWlmIChpcnFfc2V0X2FmZmluaXR5KGlycSwgY3B1bWFza19vZihjcHUpKSAmJiBpcnFzID4gMSkgewogCQkJCXByX3dhcm4oInVuYWJsZSB0byBzZXQgaXJxIGFmZmluaXR5IChpcnE9JWQsIGNwdT0ldSlcbiIsCi0JCQkJCWlycSwgaSk7CisJCQkJCWlycSwgY3B1KTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJZXJyID0gcmVxdWVzdF9pcnEoaXJxLCBoYW5kbGVyLAogCQkJCQkgIElSUUZfTk9CQUxBTkNJTkcgfCBJUlFGX05PX1RIUkVBRCwgImFybS1wbXUiLAotCQkJCQkgIHBlcl9jcHVfcHRyKCZod19ldmVudHMtPnBlcmNwdV9wbXUsIGkpKTsKKwkJCQkJICBwZXJfY3B1X3B0cigmaHdfZXZlbnRzLT5wZXJjcHVfcG11LCBjcHUpKTsKIAkJCWlmIChlcnIpIHsKIAkJCQlwcl9lcnIoInVuYWJsZSB0byByZXF1ZXN0IElSUSVkIGZvciBBUk0gUE1VIGNvdW50ZXJzXG4iLAogCQkJCQlpcnEpOwogCQkJCXJldHVybiBlcnI7CiAJCQl9CiAKLQkJCWNwdW1hc2tfc2V0X2NwdShpLCAmY3B1X3BtdS0+YWN0aXZlX2lycXMpOworCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgJmNwdV9wbXUtPmFjdGl2ZV9pcnFzKTsKIAkJfQogCX0KIApAQCAtMjQzLDYgKzI1Myw4IEBACiAJey5jb21wYXRpYmxlID0gImFybSxhcm0xMTc2LXBtdSIsCS5kYXRhID0gYXJtdjZfMTE3Nl9wbXVfaW5pdH0sCiAJey5jb21wYXRpYmxlID0gImFybSxhcm0xMTM2LXBtdSIsCS5kYXRhID0gYXJtdjZfMTEzNl9wbXVfaW5pdH0sCiAJey5jb21wYXRpYmxlID0gInFjb20sa3JhaXQtcG11IiwJLmRhdGEgPSBrcmFpdF9wbXVfaW5pdH0sCisJey5jb21wYXRpYmxlID0gInFjb20sc2NvcnBpb24tcG11IiwJLmRhdGEgPSBzY29ycGlvbl9wbXVfaW5pdH0sCisJey5jb21wYXRpYmxlID0gInFjb20sc2NvcnBpb24tbXAtcG11IiwJLmRhdGEgPSBzY29ycGlvbl9tcF9wbXVfaW5pdH0sCiAJe30sCiB9OwogCkBAIC0yODksNiArMzAxLDQ4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBvZl9wbXVfaXJxX2NmZyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBpOworCWludCAqaXJxcyA9IGtjYWxsb2MocGRldi0+bnVtX3Jlc291cmNlcywgc2l6ZW9mKCppcnFzKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWlycXMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IHBkZXYtPm51bV9yZXNvdXJjZXM7ICsraSkgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOworCQlpbnQgY3B1OworCisJCWRuID0gb2ZfcGFyc2VfcGhhbmRsZShwZGV2LT5kZXYub2Zfbm9kZSwgImludGVycnVwdC1hZmZpbml0eSIsCisJCQkJICAgICAgaSk7CisJCWlmICghZG4pIHsKKwkJCXByX3dhcm4oIkZhaWxlZCB0byBwYXJzZSAlcy9pbnRlcnJ1cHQtYWZmaW5pdHlbJWRdXG4iLAorCQkJCW9mX25vZGVfZnVsbF9uYW1lKGRuKSwgaSk7CisJCQlicmVhazsKKwkJfQorCisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCQlpZiAoYXJjaF9maW5kX25fbWF0Y2hfY3B1X3BoeXNpY2FsX2lkKGRuLCBjcHUsIE5VTEwpKQorCQkJCWJyZWFrOworCisJCW9mX25vZGVfcHV0KGRuKTsKKwkJaWYgKGNwdSA+PSBucl9jcHVfaWRzKSB7CisJCQlwcl93YXJuKCJGYWlsZWQgdG8gZmluZCBsb2dpY2FsIENQVSBmb3IgJXNcbiIsCisJCQkJZG4tPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKworCQlpcnFzW2ldID0gY3B1OworCX0KKworCWlmIChpID09IHBkZXYtPm51bV9yZXNvdXJjZXMpCisJCWNwdV9wbXUtPmlycV9hZmZpbml0eSA9IGlycXM7CisJZWxzZQorCQlrZnJlZShpcnFzKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGNwdV9wbXVfZGV2aWNlX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CkBAIC0zMTMsNyArMzY3LDEwIEBACiAKIAlpZiAobm9kZSAmJiAob2ZfaWQgPSBvZl9tYXRjaF9ub2RlKGNwdV9wbXVfb2ZfZGV2aWNlX2lkcywgcGRldi0+ZGV2Lm9mX25vZGUpKSkgewogCQlpbml0X2ZuID0gb2ZfaWQtPmRhdGE7Ci0JCXJldCA9IGluaXRfZm4ocG11KTsKKworCQlyZXQgPSBvZl9wbXVfaXJxX2NmZyhwZGV2KTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBpbml0X2ZuKHBtdSk7CiAJfSBlbHNlIHsKIAkJcmV0ID0gcHJvYmVfY3VycmVudF9wbXUocG11KTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ny5jIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnRfdjcuYwppbmRleCA4OTkzNzcwLi5mNDIwN2E0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudF92Ny5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50X3Y3LmMKQEAgLTE0MCw2ICsxNDAsMjMgQEAKIAlLUkFJVF9QRVJGQ1RSX0wxX0RUTEJfQUNDRVNTCQkJPSAweDEyMjEwLAogfTsKIAorLyogQVJNdjcgU2NvcnBpb24gc3BlY2lmaWMgZXZlbnQgdHlwZXMgKi8KK2VudW0gc2NvcnBpb25fcGVyZl90eXBlcyB7CisJU0NPUlBJT05fTFBNMF9HUk9VUDAJCQkJPSAweDRjLAorCVNDT1JQSU9OX0xQTTFfR1JPVVAwCQkJCT0gMHg1MCwKKwlTQ09SUElPTl9MUE0yX0dST1VQMAkJCQk9IDB4NTQsCisJU0NPUlBJT05fTDJMUE1fR1JPVVAwCQkJCT0gMHg1OCwKKwlTQ09SUElPTl9WTFBNX0dST1VQMAkJCQk9IDB4NWMsCisKKwlTQ09SUElPTl9JQ0FDSEVfQUNDRVNTCQkJCT0gMHgxMDA1MywKKwlTQ09SUElPTl9JQ0FDSEVfTUlTUwkJCQk9IDB4MTAwNTIsCisKKwlTQ09SUElPTl9EVExCX0FDQ0VTUwkJCQk9IDB4MTIwMTMsCisJU0NPUlBJT05fRFRMQl9NSVNTCQkJCT0gMHgxMjAxMiwKKworCVNDT1JQSU9OX0lUTEJfTUlTUwkJCQk9IDB4MTIwMjEsCit9OworCiAvKgogICogQ29ydGV4LUE4IEhXIGV2ZW50cyBtYXBwaW5nCiAgKgpAQCAtNDgyLDYgKzQ5OSw0OSBAQAogfTsKIAogLyoKKyAqIFNjb3JwaW9uIEhXIGV2ZW50cyBtYXBwaW5nCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzY29ycGlvbl9wZXJmX21hcFtQRVJGX0NPVU5UX0hXX01BWF0gPSB7CisJUEVSRl9NQVBfQUxMX1VOU1VQUE9SVEVELAorCVtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdCSAgICA9IEFSTVY3X1BFUkZDVFJfQ1BVX0NZQ0xFUywKKwlbUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlNdCSAgICA9IEFSTVY3X1BFUkZDVFJfSU5TVFJfRVhFQ1VURUQsCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OU10gPSBBUk1WN19QRVJGQ1RSX1BDX1dSSVRFLAorCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdCSAgICA9IEFSTVY3X1BFUkZDVFJfUENfQlJBTkNIX01JU19QUkVELAorCVtQRVJGX0NPVU5UX0hXX0JVU19DWUNMRVNdCSAgICA9IEFSTVY3X1BFUkZDVFJfQ0xPQ0tfQ1lDTEVTLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNjb3JwaW9uX3BlcmZfY2FjaGVfbWFwW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJCQkgICAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQorCQkJCQkgICAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF0gPSB7CisJUEVSRl9DQUNIRV9NQVBfQUxMX1VOU1VQUE9SVEVELAorCS8qCisJICogVGhlIHBlcmZvcm1hbmNlIGNvdW50ZXJzIGRvbid0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiByZWFkIGFuZCB3cml0ZQorCSAqIGFjY2Vzc2VzL21pc3NlcyBzbyB0aGlzIGlzbid0IHN0cmljdGx5IGNvcnJlY3QsIGJ1dCBpdCdzIHRoZSBiZXN0IHdlCisJICogY2FuIGRvLiBXcml0ZXMgYW5kIHJlYWRzIGdldCBjb21iaW5lZC4KKwkgKi8KKwlbQyhMMUQpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9BQ0NFU1MpXSA9IEFSTVY3X1BFUkZDVFJfTDFfRENBQ0hFX0FDQ0VTUywKKwlbQyhMMUQpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9NSVNTKV0gPSBBUk1WN19QRVJGQ1RSX0wxX0RDQUNIRV9SRUZJTEwsCisJW0MoTDFEKV1bQyhPUF9XUklURSldW0MoUkVTVUxUX0FDQ0VTUyldID0gQVJNVjdfUEVSRkNUUl9MMV9EQ0FDSEVfQUNDRVNTLAorCVtDKEwxRCldW0MoT1BfV1JJVEUpXVtDKFJFU1VMVF9NSVNTKV0gPSBBUk1WN19QRVJGQ1RSX0wxX0RDQUNIRV9SRUZJTEwsCisJW0MoTDFJKV1bQyhPUF9SRUFEKV1bQyhSRVNVTFRfQUNDRVNTKV0gPSBTQ09SUElPTl9JQ0FDSEVfQUNDRVNTLAorCVtDKEwxSSldW0MoT1BfUkVBRCldW0MoUkVTVUxUX01JU1MpXSA9IFNDT1JQSU9OX0lDQUNIRV9NSVNTLAorCS8qCisJICogT25seSBJVExCIG1pc3NlcyBhbmQgRFRMQiByZWZpbGxzIGFyZSBzdXBwb3J0ZWQuICBJZiB1c2VycyB3YW50IHRoZQorCSAqIERUTEIgcmVmaWxscyBtaXNzZXMgYSByYXcgY291bnRlciBtdXN0IGJlIHVzZWQuCisJICovCisJW0MoRFRMQildW0MoT1BfUkVBRCldW0MoUkVTVUxUX0FDQ0VTUyldID0gU0NPUlBJT05fRFRMQl9BQ0NFU1MsCisJW0MoRFRMQildW0MoT1BfUkVBRCldW0MoUkVTVUxUX01JU1MpXSA9IFNDT1JQSU9OX0RUTEJfTUlTUywKKwlbQyhEVExCKV1bQyhPUF9XUklURSldW0MoUkVTVUxUX0FDQ0VTUyldID0gU0NPUlBJT05fRFRMQl9BQ0NFU1MsCisJW0MoRFRMQildW0MoT1BfV1JJVEUpXVtDKFJFU1VMVF9NSVNTKV0gPSBTQ09SUElPTl9EVExCX01JU1MsCisJW0MoSVRMQildW0MoT1BfUkVBRCldW0MoUkVTVUxUX01JU1MpXSA9IFNDT1JQSU9OX0lUTEJfTUlTUywKKwlbQyhJVExCKV1bQyhPUF9XUklURSldW0MoUkVTVUxUX01JU1MpXSA9IFNDT1JQSU9OX0lUTEJfTUlTUywKKwlbQyhCUFUpXVtDKE9QX1JFQUQpXVtDKFJFU1VMVF9BQ0NFU1MpXSA9IEFSTVY3X1BFUkZDVFJfUENfQlJBTkNIX1BSRUQsCisJW0MoQlBVKV1bQyhPUF9SRUFEKV1bQyhSRVNVTFRfTUlTUyldID0gQVJNVjdfUEVSRkNUUl9QQ19CUkFOQ0hfTUlTX1BSRUQsCisJW0MoQlBVKV1bQyhPUF9XUklURSldW0MoUkVTVUxUX0FDQ0VTUyldID0gQVJNVjdfUEVSRkNUUl9QQ19CUkFOQ0hfUFJFRCwKKwlbQyhCUFUpXVtDKE9QX1dSSVRFKV1bQyhSRVNVTFRfTUlTUyldID0gQVJNVjdfUEVSRkNUUl9QQ19CUkFOQ0hfTUlTX1BSRUQsCit9OworCisvKgogICogUGVyZiBFdmVudHMnIGluZGljZXMKICAqLwogI2RlZmluZQlBUk1WN19JRFhfQ1lDTEVfQ09VTlRFUgkwCkBAIC05NzYsNiArMTAzNiwxMiBAQAogCQkJCSZrcmFpdF9wZXJmX2NhY2hlX21hcCwgMHhGRkZGRik7CiB9CiAKK3N0YXRpYyBpbnQgc2NvcnBpb25fbWFwX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlyZXR1cm4gYXJtcG11X21hcF9ldmVudChldmVudCwgJnNjb3JwaW9uX3BlcmZfbWFwLAorCQkJCSZzY29ycGlvbl9wZXJmX2NhY2hlX21hcCwgMHhGRkZGRik7Cit9CisKIHN0YXRpYyB2b2lkIGFybXY3cG11X2luaXQoc3RydWN0IGFybV9wbXUgKmNwdV9wbXUpCiB7CiAJY3B1X3BtdS0+aGFuZGxlX2lycQk9IGFybXY3cG11X2hhbmRsZV9pcnE7CkBAIC0xMTAzLDYgKzExNjksMTIgQEAKICNkZWZpbmUgS1JBSVRfRVZFTlRfTUFTSwkoS1JBSVRfRVZFTlQgfCBWRU5VTV9FVkVOVCkKICNkZWZpbmUgUE1SRVNSbl9FTgkJQklUKDMxKQogCisjZGVmaW5lIEVWRU5UX1JFR0lPTihldmVudCkJKCgoZXZlbnQpID4+IDEyKSAmIDB4ZikJCS8qIFIgKi8KKyNkZWZpbmUgRVZFTlRfR1JPVVAoZXZlbnQpCSgoZXZlbnQpICYgMHhmKQkJCS8qIEcgKi8KKyNkZWZpbmUgRVZFTlRfQ09ERShldmVudCkJKCgoZXZlbnQpID4+IDQpICYgMHhmZikJCS8qIENDICovCisjZGVmaW5lIEVWRU5UX1ZFTlVNKGV2ZW50KQkoISEoZXZlbnQgJiBWRU5VTV9FVkVOVCkpCS8qIE49MiAqLworI2RlZmluZSBFVkVOVF9DUFUoZXZlbnQpCSghIShldmVudCAmIEtSQUlUX0VWRU5UKSkJLyogTj0xICovCisKIHN0YXRpYyB1MzIga3JhaXRfcmVhZF9wbXJlc3JuKGludCBuKQogewogCXUzMiB2YWw7CkBAIC0xMTQxLDE5ICsxMjEzLDE5IEBACiAJfQogfQogCi1zdGF0aWMgdTMyIGtyYWl0X3JlYWRfdnBtcmVzcjAodm9pZCkKK3N0YXRpYyB1MzIgdmVudW1fcmVhZF9wbXJlc3Iodm9pZCkKIHsKIAl1MzIgdmFsOwogCWFzbSB2b2xhdGlsZSgibXJjIHAxMCwgNywgJTAsIGMxMSwgYzAsIDAiIDogIj1yIiAodmFsKSk7CiAJcmV0dXJuIHZhbDsKIH0KIAotc3RhdGljIHZvaWQga3JhaXRfd3JpdGVfdnBtcmVzcjAodTMyIHZhbCkKK3N0YXRpYyB2b2lkIHZlbnVtX3dyaXRlX3BtcmVzcih1MzIgdmFsKQogewogCWFzbSB2b2xhdGlsZSgibWNyIHAxMCwgNywgJTAsIGMxMSwgYzAsIDAiIDogOiAiciIgKHZhbCkpOwogfQogCi1zdGF0aWMgdm9pZCBrcmFpdF9wcmVfdnBtcmVzcjAodTMyICp2ZW51bV9vcmlnX3ZhbCwgdTMyICpmcF9vcmlnX3ZhbCkKK3N0YXRpYyB2b2lkIHZlbnVtX3ByZV9wbXJlc3IodTMyICp2ZW51bV9vcmlnX3ZhbCwgdTMyICpmcF9vcmlnX3ZhbCkKIHsKIAl1MzIgdmVudW1fbmV3X3ZhbDsKIAl1MzIgZnBfbmV3X3ZhbDsKQEAgLTExNzAsNyArMTI0Miw3IEBACiAJZm14cihGUEVYQywgZnBfbmV3X3ZhbCk7CiB9CiAKLXN0YXRpYyB2b2lkIGtyYWl0X3Bvc3RfdnBtcmVzcjAodTMyIHZlbnVtX29yaWdfdmFsLCB1MzIgZnBfb3JpZ192YWwpCitzdGF0aWMgdm9pZCB2ZW51bV9wb3N0X3BtcmVzcih1MzIgdmVudW1fb3JpZ192YWwsIHUzMiBmcF9vcmlnX3ZhbCkKIHsKIAlCVUdfT04ocHJlZW1wdGlibGUoKSk7CiAJLyogUmVzdG9yZSBGUEVYQyAqLwpAQCAtMTE5MywxNiArMTI2NSwxMSBAQAogCXUzMiB2YWw7CiAJdTMyIG1hc2s7CiAJdTMyIHZ2YWwsIGZ2YWw7Ci0JdW5zaWduZWQgaW50IHJlZ2lvbjsKLQl1bnNpZ25lZCBpbnQgZ3JvdXA7Ci0JdW5zaWduZWQgaW50IGNvZGU7CisJdW5zaWduZWQgaW50IHJlZ2lvbiA9IEVWRU5UX1JFR0lPTihjb25maWdfYmFzZSk7CisJdW5zaWduZWQgaW50IGdyb3VwID0gRVZFTlRfR1JPVVAoY29uZmlnX2Jhc2UpOworCXVuc2lnbmVkIGludCBjb2RlID0gRVZFTlRfQ09ERShjb25maWdfYmFzZSk7CiAJdW5zaWduZWQgaW50IGdyb3VwX3NoaWZ0OwotCWJvb2wgdmVudW1fZXZlbnQ7Ci0KLQl2ZW51bV9ldmVudCA9ICEhKGNvbmZpZ19iYXNlICYgVkVOVU1fRVZFTlQpOwotCXJlZ2lvbiA9IChjb25maWdfYmFzZSA+PiAxMikgJiAweGY7Ci0JY29kZSAgID0gKGNvbmZpZ19iYXNlID4+IDQpICYgMHhmZjsKLQlncm91cCAgPSAoY29uZmlnX2Jhc2UgPj4gMCkgICYgMHhmOworCWJvb2wgdmVudW1fZXZlbnQgPSBFVkVOVF9WRU5VTShjb25maWdfYmFzZSk7CiAKIAlncm91cF9zaGlmdCA9IGdyb3VwICogODsKIAltYXNrID0gMHhmZiA8PCBncm91cF9zaGlmdDsKQEAgLTEyMTcsMTYgKzEyODQsMTQgQEAKIAl2YWwgfD0gY29uZmlnX2Jhc2UgJiAoQVJNVjdfRVhDTFVERV9VU0VSIHwgQVJNVjdfRVhDTFVERV9QTDEpOwogCWFybXY3X3BtbmNfd3JpdGVfZXZ0c2VsKGlkeCwgdmFsKTsKIAotCWFzbSB2b2xhdGlsZSgibWNyIHAxNSwgMCwgJTAsIGM5LCBjMTUsIDAiIDogOiAiciIgKDApKTsKLQogCWlmICh2ZW51bV9ldmVudCkgewotCQlrcmFpdF9wcmVfdnBtcmVzcjAoJnZ2YWwsICZmdmFsKTsKLQkJdmFsID0ga3JhaXRfcmVhZF92cG1yZXNyMCgpOworCQl2ZW51bV9wcmVfcG1yZXNyKCZ2dmFsLCAmZnZhbCk7CisJCXZhbCA9IHZlbnVtX3JlYWRfcG1yZXNyKCk7CiAJCXZhbCAmPSB+bWFzazsKIAkJdmFsIHw9IGNvZGUgPDwgZ3JvdXBfc2hpZnQ7CiAJCXZhbCB8PSBQTVJFU1JuX0VOOwotCQlrcmFpdF93cml0ZV92cG1yZXNyMCh2YWwpOwotCQlrcmFpdF9wb3N0X3ZwbXJlc3IwKHZ2YWwsIGZ2YWwpOworCQl2ZW51bV93cml0ZV9wbXJlc3IodmFsKTsKKwkJdmVudW1fcG9zdF9wbXJlc3IodnZhbCwgZnZhbCk7CiAJfSBlbHNlIHsKIAkJdmFsID0ga3JhaXRfcmVhZF9wbXJlc3JuKHJlZ2lvbik7CiAJCXZhbCAmPSB+bWFzazsKQEAgLTEyMzYsNyArMTMwMSw3IEBACiAJfQogfQogCi1zdGF0aWMgdTMyIGtyYWl0X2NsZWFyX3BtcmVzcm5fZ3JvdXAodTMyIHZhbCwgaW50IGdyb3VwKQorc3RhdGljIHUzMiBjbGVhcl9wbXJlc3JuX2dyb3VwKHUzMiB2YWwsIGludCBncm91cCkKIHsKIAl1MzIgbWFzazsKIAlpbnQgZ3JvdXBfc2hpZnQ7CkBAIC0xMjU2LDIzICsxMzIxLDE5IEBACiB7CiAJdTMyIHZhbDsKIAl1MzIgdnZhbCwgZnZhbDsKLQl1bnNpZ25lZCBpbnQgcmVnaW9uOwotCXVuc2lnbmVkIGludCBncm91cDsKLQlib29sIHZlbnVtX2V2ZW50OwotCi0JdmVudW1fZXZlbnQgPSAhIShjb25maWdfYmFzZSAmIFZFTlVNX0VWRU5UKTsKLQlyZWdpb24gPSAoY29uZmlnX2Jhc2UgPj4gMTIpICYgMHhmOwotCWdyb3VwICA9IChjb25maWdfYmFzZSA+PiAwKSAgJiAweGY7CisJdW5zaWduZWQgaW50IHJlZ2lvbiA9IEVWRU5UX1JFR0lPTihjb25maWdfYmFzZSk7CisJdW5zaWduZWQgaW50IGdyb3VwID0gRVZFTlRfR1JPVVAoY29uZmlnX2Jhc2UpOworCWJvb2wgdmVudW1fZXZlbnQgPSBFVkVOVF9WRU5VTShjb25maWdfYmFzZSk7CiAKIAlpZiAodmVudW1fZXZlbnQpIHsKLQkJa3JhaXRfcHJlX3ZwbXJlc3IwKCZ2dmFsLCAmZnZhbCk7Ci0JCXZhbCA9IGtyYWl0X3JlYWRfdnBtcmVzcjAoKTsKLQkJdmFsID0ga3JhaXRfY2xlYXJfcG1yZXNybl9ncm91cCh2YWwsIGdyb3VwKTsKLQkJa3JhaXRfd3JpdGVfdnBtcmVzcjAodmFsKTsKLQkJa3JhaXRfcG9zdF92cG1yZXNyMCh2dmFsLCBmdmFsKTsKKwkJdmVudW1fcHJlX3BtcmVzcigmdnZhbCwgJmZ2YWwpOworCQl2YWwgPSB2ZW51bV9yZWFkX3BtcmVzcigpOworCQl2YWwgPSBjbGVhcl9wbXJlc3JuX2dyb3VwKHZhbCwgZ3JvdXApOworCQl2ZW51bV93cml0ZV9wbXJlc3IodmFsKTsKKwkJdmVudW1fcG9zdF9wbXJlc3IodnZhbCwgZnZhbCk7CiAJfSBlbHNlIHsKIAkJdmFsID0ga3JhaXRfcmVhZF9wbXJlc3JuKHJlZ2lvbik7Ci0JCXZhbCA9IGtyYWl0X2NsZWFyX3BtcmVzcm5fZ3JvdXAodmFsLCBncm91cCk7CisJCXZhbCA9IGNsZWFyX3BtcmVzcm5fZ3JvdXAodmFsLCBncm91cCk7CiAJCWtyYWl0X3dyaXRlX3BtcmVzcm4ocmVnaW9uLCB2YWwpOwogCX0KIH0KQEAgLTEzNDIsNiArMTQwMyw4IEBACiBzdGF0aWMgdm9pZCBrcmFpdF9wbXVfcmVzZXQodm9pZCAqaW5mbykKIHsKIAl1MzIgdnZhbCwgZnZhbDsKKwlzdHJ1Y3QgYXJtX3BtdSAqY3B1X3BtdSA9IGluZm87CisJdTMyIGlkeCwgbmJfY250ID0gY3B1X3BtdS0+bnVtX2V2ZW50czsKIAogCWFybXY3cG11X3Jlc2V0KGluZm8pOwogCkBAIC0xMzUwLDkgKzE0MTMsMTYgQEAKIAlrcmFpdF93cml0ZV9wbXJlc3JuKDEsIDApOwogCWtyYWl0X3dyaXRlX3BtcmVzcm4oMiwgMCk7CiAKLQlrcmFpdF9wcmVfdnBtcmVzcjAoJnZ2YWwsICZmdmFsKTsKLQlrcmFpdF93cml0ZV92cG1yZXNyMCgwKTsKLQlrcmFpdF9wb3N0X3ZwbXJlc3IwKHZ2YWwsIGZ2YWwpOworCXZlbnVtX3ByZV9wbXJlc3IoJnZ2YWwsICZmdmFsKTsKKwl2ZW51bV93cml0ZV9wbXJlc3IoMCk7CisJdmVudW1fcG9zdF9wbXJlc3IodnZhbCwgZnZhbCk7CisKKwkvKiBSZXNldCBQTXhFVk5DVENSIHRvIHNhbmUgZGVmYXVsdCAqLworCWZvciAoaWR4ID0gQVJNVjdfSURYX0NZQ0xFX0NPVU5URVI7IGlkeCA8IG5iX2NudDsgKytpZHgpIHsKKwkJYXJtdjdfcG1uY19zZWxlY3RfY291bnRlcihpZHgpOworCQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzE1LCAwIiA6IDogInIiICgwKSk7CisJfQorCiB9CiAKIHN0YXRpYyBpbnQga3JhaXRfZXZlbnRfdG9fYml0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdW5zaWduZWQgaW50IHJlZ2lvbiwKQEAgLTEzODYsMjYgKzE0NTYsMTggQEAKIHsKIAlpbnQgaWR4OwogCWludCBiaXQgPSAtMTsKLQl1bnNpZ25lZCBpbnQgcHJlZml4OwotCXVuc2lnbmVkIGludCByZWdpb247Ci0JdW5zaWduZWQgaW50IGNvZGU7Ci0JdW5zaWduZWQgaW50IGdyb3VwOwotCWJvb2wga3JhaXRfZXZlbnQ7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisJdW5zaWduZWQgaW50IHJlZ2lvbiA9IEVWRU5UX1JFR0lPTihod2MtPmNvbmZpZ19iYXNlKTsKKwl1bnNpZ25lZCBpbnQgY29kZSA9IEVWRU5UX0NPREUoaHdjLT5jb25maWdfYmFzZSk7CisJdW5zaWduZWQgaW50IGdyb3VwID0gRVZFTlRfR1JPVVAoaHdjLT5jb25maWdfYmFzZSk7CisJYm9vbCB2ZW51bV9ldmVudCA9IEVWRU5UX1ZFTlVNKGh3Yy0+Y29uZmlnX2Jhc2UpOworCWJvb2wga3JhaXRfZXZlbnQgPSBFVkVOVF9DUFUoaHdjLT5jb25maWdfYmFzZSk7CiAKLQlyZWdpb24gPSAoaHdjLT5jb25maWdfYmFzZSA+PiAxMikgJiAweGY7Ci0JY29kZSAgID0gKGh3Yy0+Y29uZmlnX2Jhc2UgPj4gNCkgJiAweGZmOwotCWdyb3VwICA9IChod2MtPmNvbmZpZ19iYXNlID4+IDApICYgMHhmOwotCWtyYWl0X2V2ZW50ID0gISEoaHdjLT5jb25maWdfYmFzZSAmIEtSQUlUX0VWRU5UX01BU0spOwotCi0JaWYgKGtyYWl0X2V2ZW50KSB7CisJaWYgKHZlbnVtX2V2ZW50IHx8IGtyYWl0X2V2ZW50KSB7CiAJCS8qIElnbm9yZSBpbnZhbGlkIGV2ZW50cyAqLwogCQlpZiAoZ3JvdXAgPiAzIHx8IHJlZ2lvbiA+IDIpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJcHJlZml4ID0gaHdjLT5jb25maWdfYmFzZSAmIEtSQUlUX0VWRU5UX01BU0s7Ci0JCWlmIChwcmVmaXggIT0gS1JBSVRfRVZFTlQgJiYgcHJlZml4ICE9IFZFTlVNX0VWRU5UKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmIChwcmVmaXggPT0gVkVOVU1fRVZFTlQgJiYgKGNvZGUgJiAweGUwKSkKKwkJaWYgKHZlbnVtX2V2ZW50ICYmIChjb2RlICYgMHhlMCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQliaXQgPSBrcmFpdF9ldmVudF90b19iaXQoZXZlbnQsIHJlZ2lvbiwgZ3JvdXApOwpAQCAtMTQyNSwxNSArMTQ4NywxMiBAQAogewogCWludCBiaXQ7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7Ci0JdW5zaWduZWQgaW50IHJlZ2lvbjsKLQl1bnNpZ25lZCBpbnQgZ3JvdXA7Ci0JYm9vbCBrcmFpdF9ldmVudDsKKwl1bnNpZ25lZCBpbnQgcmVnaW9uID0gRVZFTlRfUkVHSU9OKGh3Yy0+Y29uZmlnX2Jhc2UpOworCXVuc2lnbmVkIGludCBncm91cCA9IEVWRU5UX0dST1VQKGh3Yy0+Y29uZmlnX2Jhc2UpOworCWJvb2wgdmVudW1fZXZlbnQgPSBFVkVOVF9WRU5VTShod2MtPmNvbmZpZ19iYXNlKTsKKwlib29sIGtyYWl0X2V2ZW50ID0gRVZFTlRfQ1BVKGh3Yy0+Y29uZmlnX2Jhc2UpOwogCi0JcmVnaW9uID0gKGh3Yy0+Y29uZmlnX2Jhc2UgPj4gMTIpICYgMHhmOwotCWdyb3VwICA9IChod2MtPmNvbmZpZ19iYXNlID4+IDApICYgMHhmOwotCWtyYWl0X2V2ZW50ID0gISEoaHdjLT5jb25maWdfYmFzZSAmIEtSQUlUX0VWRU5UX01BU0spOwotCi0JaWYgKGtyYWl0X2V2ZW50KSB7CisJaWYgKHZlbnVtX2V2ZW50IHx8IGtyYWl0X2V2ZW50KSB7CiAJCWJpdCA9IGtyYWl0X2V2ZW50X3RvX2JpdChldmVudCwgcmVnaW9uLCBncm91cCk7CiAJCWNsZWFyX2JpdChiaXQsIGNwdWMtPnVzZWRfbWFzayk7CiAJfQpAQCAtMTQ1OCw2ICsxNTE3LDM0NCBAQAogCWNwdV9wbXUtPmNsZWFyX2V2ZW50X2lkeCA9IGtyYWl0X3BtdV9jbGVhcl9ldmVudF9pZHg7CiAJcmV0dXJuIDA7CiB9CisKKy8qCisgKiBTY29ycGlvbiBMb2NhbCBQZXJmb3JtYW5jZSBNb25pdG9yIFJlZ2lzdGVyIChMUE1uKQorICoKKyAqICAgICAgICAgICAgMzEgICAzMCAgICAgMjQgICAgIDE2ICAgICA4ICAgICAgMAorICogICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgTFBNMCAgICAgIHwgRU4gfCAgQ0MgIHwgIENDICB8ICBDQyAgfCAgQ0MgIHwgICBOID0gMSwgUiA9IDAKKyAqICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogIExQTTEgICAgICB8IEVOIHwgIENDICB8ICBDQyAgfCAgQ0MgIHwgIENDICB8ICAgTiA9IDEsIFIgPSAxCisgKiAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICBMUE0yICAgICAgfCBFTiB8ICBDQyAgfCAgQ0MgIHwgIENDICB8ICBDQyAgfCAgIE4gPSAxLCBSID0gMgorICogICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgKiAgTDJMUE0gICAgIHwgRU4gfCAgQ0MgIHwgIENDICB8ICBDQyAgfCAgQ0MgIHwgICBOID0gMSwgUiA9IDMKKyAqICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogIFZMUE0gICAgICB8IEVOIHwgIENDICB8ICBDQyAgfCAgQ0MgIHwgIENDICB8ICAgTiA9IDIsIFIgPSA/CisgKiAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgICAgICAgICAgICBFTiB8IEc9MyAgfCBHPTIgIHwgRz0xICB8IEc9MAorICoKKyAqCisgKiAgRXZlbnQgRW5jb2Rpbmc6CisgKgorICogICAgICBod2MtPmNvbmZpZ19iYXNlID0gMHhOUkNDRworICoKKyAqICAgICAgTiAgPSBwcmVmaXgsIDEgZm9yIFNjb3JwaW9uIENQVSAoTFBNbi9MMkxQTSksIDIgZm9yIFZlbnVtIFZGUCAoVkxQTSkKKyAqICAgICAgUiAgPSByZWdpb24gcmVnaXN0ZXIKKyAqICAgICAgQ0MgPSBjbGFzcyBvZiBldmVudHMgdGhlIGdyb3VwIEcgaXMgY2hvb3NpbmcgZnJvbQorICogICAgICBHICA9IGdyb3VwIG9yIHBhcnRpY3VsYXIgZXZlbnQKKyAqCisgKiAgRXhhbXBsZTogMHgxMjAyMSBpcyBhIFNjb3JwaW9uIENQVSBldmVudCBpbiBMUE0yJ3MgZ3JvdXAgMSB3aXRoIGNvZGUgMgorICoKKyAqICBBIHJlZ2lvbiAoUikgY29ycmVzcG9uZHMgdG8gYSBwaWVjZSBvZiB0aGUgQ1BVIChleGVjdXRpb24gdW5pdCwgaW5zdHJ1Y3Rpb24KKyAqICB1bml0LCBldGMuKSB3aGlsZSB0aGUgZXZlbnQgY29kZSAoQ0MpIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBjbGFzcyBvZgorICogIGV2ZW50cyAoaW50ZXJydXB0cyBmb3IgZXhhbXBsZSkuIEFuIGV2ZW50IGNvZGUgaXMgYnJva2VuIGRvd24gaW50bworICogIGdyb3VwcyAoRykgdGhhdCBjYW4gYmUgbWFwcGVkIGludG8gdGhlIFBNVSAoaXJxLCBmaXFzLCBhbmQgaXJxK2ZpcXMgZm9yCisgKiAgZXhhbXBsZSkuCisgKi8KKworc3RhdGljIHUzMiBzY29ycGlvbl9yZWFkX3BtcmVzcm4oaW50IG4pCit7CisJdTMyIHZhbDsKKworCXN3aXRjaCAobikgeworCWNhc2UgMDoKKwkJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAwLCAlMCwgYzE1LCBjMCwgMCIgOiAiPXIiICh2YWwpKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlhc20gdm9sYXRpbGUoIm1yYyBwMTUsIDEsICUwLCBjMTUsIGMwLCAwIiA6ICI9ciIgKHZhbCkpOworCQlicmVhazsKKwljYXNlIDI6CisJCWFzbSB2b2xhdGlsZSgibXJjIHAxNSwgMiwgJTAsIGMxNSwgYzAsIDAiIDogIj1yIiAodmFsKSk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJYXNtIHZvbGF0aWxlKCJtcmMgcDE1LCAzLCAlMCwgYzE1LCBjMiwgMCIgOiAiPXIiICh2YWwpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7IC8qIFNob3VsZCBiZSB2YWxpZGF0ZWQgaW4gc2NvcnBpb25fcG11X2dldF9ldmVudF9pZHgoKSAqLworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHNjb3JwaW9uX3dyaXRlX3BtcmVzcm4oaW50IG4sIHUzMiB2YWwpCit7CisJc3dpdGNoIChuKSB7CisJY2FzZSAwOgorCQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjMTUsIGMwLCAwIiA6IDogInIiICh2YWwpKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDEsICUwLCBjMTUsIGMwLCAwIiA6IDogInIiICh2YWwpKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDIsICUwLCBjMTUsIGMwLCAwIiA6IDogInIiICh2YWwpKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDMsICUwLCBjMTUsIGMyLCAwIiA6IDogInIiICh2YWwpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7IC8qIFNob3VsZCBiZSB2YWxpZGF0ZWQgaW4gc2NvcnBpb25fcG11X2dldF9ldmVudF9pZHgoKSAqLworCX0KK30KKworc3RhdGljIHUzMiBzY29ycGlvbl9nZXRfcG1yZXNybl9ldmVudCh1bnNpZ25lZCBpbnQgcmVnaW9uKQoreworCXN0YXRpYyBjb25zdCB1MzIgcG1yZXNybl90YWJsZVtdID0geyBTQ09SUElPTl9MUE0wX0dST1VQMCwKKwkJCQkJICAgICBTQ09SUElPTl9MUE0xX0dST1VQMCwKKwkJCQkJICAgICBTQ09SUElPTl9MUE0yX0dST1VQMCwKKwkJCQkJICAgICBTQ09SUElPTl9MMkxQTV9HUk9VUDAgfTsKKwlyZXR1cm4gcG1yZXNybl90YWJsZVtyZWdpb25dOworfQorCitzdGF0aWMgdm9pZCBzY29ycGlvbl9ldnRfc2V0dXAoaW50IGlkeCwgdTMyIGNvbmZpZ19iYXNlKQoreworCXUzMiB2YWw7CisJdTMyIG1hc2s7CisJdTMyIHZ2YWwsIGZ2YWw7CisJdW5zaWduZWQgaW50IHJlZ2lvbiA9IEVWRU5UX1JFR0lPTihjb25maWdfYmFzZSk7CisJdW5zaWduZWQgaW50IGdyb3VwID0gRVZFTlRfR1JPVVAoY29uZmlnX2Jhc2UpOworCXVuc2lnbmVkIGludCBjb2RlID0gRVZFTlRfQ09ERShjb25maWdfYmFzZSk7CisJdW5zaWduZWQgaW50IGdyb3VwX3NoaWZ0OworCWJvb2wgdmVudW1fZXZlbnQgPSBFVkVOVF9WRU5VTShjb25maWdfYmFzZSk7CisKKwlncm91cF9zaGlmdCA9IGdyb3VwICogODsKKwltYXNrID0gMHhmZiA8PCBncm91cF9zaGlmdDsKKworCS8qIENvbmZpZ3VyZSBldnRzZWwgZm9yIHRoZSByZWdpb24gYW5kIGdyb3VwICovCisJaWYgKHZlbnVtX2V2ZW50KQorCQl2YWwgPSBTQ09SUElPTl9WTFBNX0dST1VQMDsKKwllbHNlCisJCXZhbCA9IHNjb3JwaW9uX2dldF9wbXJlc3JuX2V2ZW50KHJlZ2lvbik7CisJdmFsICs9IGdyb3VwOworCS8qIE1peCBpbiBtb2RlLWV4Y2x1c2lvbiBiaXRzICovCisJdmFsIHw9IGNvbmZpZ19iYXNlICYgKEFSTVY3X0VYQ0xVREVfVVNFUiB8IEFSTVY3X0VYQ0xVREVfUEwxKTsKKwlhcm12N19wbW5jX3dyaXRlX2V2dHNlbChpZHgsIHZhbCk7CisKKwlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzE1LCAwIiA6IDogInIiICgwKSk7CisKKwlpZiAodmVudW1fZXZlbnQpIHsKKwkJdmVudW1fcHJlX3BtcmVzcigmdnZhbCwgJmZ2YWwpOworCQl2YWwgPSB2ZW51bV9yZWFkX3BtcmVzcigpOworCQl2YWwgJj0gfm1hc2s7CisJCXZhbCB8PSBjb2RlIDw8IGdyb3VwX3NoaWZ0OworCQl2YWwgfD0gUE1SRVNSbl9FTjsKKwkJdmVudW1fd3JpdGVfcG1yZXNyKHZhbCk7CisJCXZlbnVtX3Bvc3RfcG1yZXNyKHZ2YWwsIGZ2YWwpOworCX0gZWxzZSB7CisJCXZhbCA9IHNjb3JwaW9uX3JlYWRfcG1yZXNybihyZWdpb24pOworCQl2YWwgJj0gfm1hc2s7CisJCXZhbCB8PSBjb2RlIDw8IGdyb3VwX3NoaWZ0OworCQl2YWwgfD0gUE1SRVNSbl9FTjsKKwkJc2NvcnBpb25fd3JpdGVfcG1yZXNybihyZWdpb24sIHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY29ycGlvbl9jbGVhcnBtdSh1MzIgY29uZmlnX2Jhc2UpCit7CisJdTMyIHZhbDsKKwl1MzIgdnZhbCwgZnZhbDsKKwl1bnNpZ25lZCBpbnQgcmVnaW9uID0gRVZFTlRfUkVHSU9OKGNvbmZpZ19iYXNlKTsKKwl1bnNpZ25lZCBpbnQgZ3JvdXAgPSBFVkVOVF9HUk9VUChjb25maWdfYmFzZSk7CisJYm9vbCB2ZW51bV9ldmVudCA9IEVWRU5UX1ZFTlVNKGNvbmZpZ19iYXNlKTsKKworCWlmICh2ZW51bV9ldmVudCkgeworCQl2ZW51bV9wcmVfcG1yZXNyKCZ2dmFsLCAmZnZhbCk7CisJCXZhbCA9IHZlbnVtX3JlYWRfcG1yZXNyKCk7CisJCXZhbCA9IGNsZWFyX3BtcmVzcm5fZ3JvdXAodmFsLCBncm91cCk7CisJCXZlbnVtX3dyaXRlX3BtcmVzcih2YWwpOworCQl2ZW51bV9wb3N0X3BtcmVzcih2dmFsLCBmdmFsKTsKKwl9IGVsc2UgeworCQl2YWwgPSBzY29ycGlvbl9yZWFkX3BtcmVzcm4ocmVnaW9uKTsKKwkJdmFsID0gY2xlYXJfcG1yZXNybl9ncm91cCh2YWwsIGdyb3VwKTsKKwkJc2NvcnBpb25fd3JpdGVfcG1yZXNybihyZWdpb24sIHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzY29ycGlvbl9wbXVfZGlzYWJsZV9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwlpbnQgaWR4ID0gaHdjLT5pZHg7CisJc3RydWN0IGFybV9wbXUgKmNwdV9wbXUgPSB0b19hcm1fcG11KGV2ZW50LT5wbXUpOworCXN0cnVjdCBwbXVfaHdfZXZlbnRzICpldmVudHMgPSB0aGlzX2NwdV9wdHIoY3B1X3BtdS0+aHdfZXZlbnRzKTsKKworCS8qIERpc2FibGUgY291bnRlciBhbmQgaW50ZXJydXB0ICovCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZldmVudHMtPnBtdV9sb2NrLCBmbGFncyk7CisKKwkvKiBEaXNhYmxlIGNvdW50ZXIgKi8KKwlhcm12N19wbW5jX2Rpc2FibGVfY291bnRlcihpZHgpOworCisJLyoKKwkgKiBDbGVhciBwbXJlc3IgY29kZSAoaWYgZGVzdGluZWQgZm9yIFBNTnggY291bnRlcnMpCisJICovCisJaWYgKGh3Yy0+Y29uZmlnX2Jhc2UgJiBLUkFJVF9FVkVOVF9NQVNLKQorCQlzY29ycGlvbl9jbGVhcnBtdShod2MtPmNvbmZpZ19iYXNlKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0IGZvciB0aGlzIGNvdW50ZXIgKi8KKwlhcm12N19wbW5jX2Rpc2FibGVfaW50ZW5zKGlkeCk7CisKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXZlbnRzLT5wbXVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzY29ycGlvbl9wbXVfZW5hYmxlX2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmZXZlbnQtPmh3OworCWludCBpZHggPSBod2MtPmlkeDsKKwlzdHJ1Y3QgYXJtX3BtdSAqY3B1X3BtdSA9IHRvX2FybV9wbXUoZXZlbnQtPnBtdSk7CisJc3RydWN0IHBtdV9od19ldmVudHMgKmV2ZW50cyA9IHRoaXNfY3B1X3B0cihjcHVfcG11LT5od19ldmVudHMpOworCisJLyoKKwkgKiBFbmFibGUgY291bnRlciBhbmQgaW50ZXJydXB0LCBhbmQgc2V0IHRoZSBjb3VudGVyIHRvIGNvdW50CisJICogdGhlIGV2ZW50IHRoYXQgd2UncmUgaW50ZXJlc3RlZCBpbi4KKwkgKi8KKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKKworCS8qIERpc2FibGUgY291bnRlciAqLworCWFybXY3X3BtbmNfZGlzYWJsZV9jb3VudGVyKGlkeCk7CisKKwkvKgorCSAqIFNldCBldmVudCAoaWYgZGVzdGluZWQgZm9yIFBNTnggY291bnRlcnMpCisJICogV2UgZG9uJ3Qgc2V0IHRoZSBldmVudCBmb3IgdGhlIGN5Y2xlIGNvdW50ZXIgYmVjYXVzZSB3ZQorCSAqIGRvbid0IGhhdmUgdGhlIGFiaWxpdHkgdG8gcGVyZm9ybSBldmVudCBmaWx0ZXJpbmcuCisJICovCisJaWYgKGh3Yy0+Y29uZmlnX2Jhc2UgJiBLUkFJVF9FVkVOVF9NQVNLKQorCQlzY29ycGlvbl9ldnRfc2V0dXAoaWR4LCBod2MtPmNvbmZpZ19iYXNlKTsKKwllbHNlIGlmIChpZHggIT0gQVJNVjdfSURYX0NZQ0xFX0NPVU5URVIpCisJCWFybXY3X3BtbmNfd3JpdGVfZXZ0c2VsKGlkeCwgaHdjLT5jb25maWdfYmFzZSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0IGZvciB0aGlzIGNvdW50ZXIgKi8KKwlhcm12N19wbW5jX2VuYWJsZV9pbnRlbnMoaWR4KTsKKworCS8qIEVuYWJsZSBjb3VudGVyICovCisJYXJtdjdfcG1uY19lbmFibGVfY291bnRlcihpZHgpOworCisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV2ZW50cy0+cG11X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2NvcnBpb25fcG11X3Jlc2V0KHZvaWQgKmluZm8pCit7CisJdTMyIHZ2YWwsIGZ2YWw7CisJc3RydWN0IGFybV9wbXUgKmNwdV9wbXUgPSBpbmZvOworCXUzMiBpZHgsIG5iX2NudCA9IGNwdV9wbXUtPm51bV9ldmVudHM7CisKKwlhcm12N3BtdV9yZXNldChpbmZvKTsKKworCS8qIENsZWFyIGFsbCBwbXJlc3JzICovCisJc2NvcnBpb25fd3JpdGVfcG1yZXNybigwLCAwKTsKKwlzY29ycGlvbl93cml0ZV9wbXJlc3JuKDEsIDApOworCXNjb3JwaW9uX3dyaXRlX3BtcmVzcm4oMiwgMCk7CisJc2NvcnBpb25fd3JpdGVfcG1yZXNybigzLCAwKTsKKworCXZlbnVtX3ByZV9wbXJlc3IoJnZ2YWwsICZmdmFsKTsKKwl2ZW51bV93cml0ZV9wbXJlc3IoMCk7CisJdmVudW1fcG9zdF9wbXJlc3IodnZhbCwgZnZhbCk7CisKKwkvKiBSZXNldCBQTXhFVk5DVENSIHRvIHNhbmUgZGVmYXVsdCAqLworCWZvciAoaWR4ID0gQVJNVjdfSURYX0NZQ0xFX0NPVU5URVI7IGlkeCA8IG5iX2NudDsgKytpZHgpIHsKKwkJYXJtdjdfcG1uY19zZWxlY3RfY291bnRlcihpZHgpOworCQlhc20gdm9sYXRpbGUoIm1jciBwMTUsIDAsICUwLCBjOSwgYzE1LCAwIiA6IDogInIiICgwKSk7CisJfQorfQorCitzdGF0aWMgaW50IHNjb3JwaW9uX2V2ZW50X3RvX2JpdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIHVuc2lnbmVkIGludCByZWdpb24sCisJCQkgICAgICB1bnNpZ25lZCBpbnQgZ3JvdXApCit7CisJaW50IGJpdDsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwlzdHJ1Y3QgYXJtX3BtdSAqY3B1X3BtdSA9IHRvX2FybV9wbXUoZXZlbnQtPnBtdSk7CisKKwlpZiAoaHdjLT5jb25maWdfYmFzZSAmIFZFTlVNX0VWRU5UKQorCQliaXQgPSBTQ09SUElPTl9WTFBNX0dST1VQMDsKKwllbHNlCisJCWJpdCA9IHNjb3JwaW9uX2dldF9wbXJlc3JuX2V2ZW50KHJlZ2lvbik7CisJYml0IC09IHNjb3JwaW9uX2dldF9wbXJlc3JuX2V2ZW50KDApOworCWJpdCArPSBncm91cDsKKwkvKgorCSAqIExvd2VyIGJpdHMgYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGNvdW50ZXJzIChzZWUKKwkgKiBhcm12N3BtdV9nZXRfZXZlbnRfaWR4KCkgZm9yIG1vcmUgaW5mbykKKwkgKi8KKwliaXQgKz0gQVJNVjdfSURYX0NPVU5URVJfTEFTVChjcHVfcG11KSArIDE7CisKKwlyZXR1cm4gYml0OworfQorCisvKgorICogV2UgY2hlY2sgZm9yIGNvbHVtbiBleGNsdXNpb24gY29uc3RyYWludHMgaGVyZS4KKyAqIFR3byBldmVudHMgY2FudCB1c2UgdGhlIHNhbWUgZ3JvdXAgd2l0aGluIGEgcG1yZXNyIHJlZ2lzdGVyLgorICovCitzdGF0aWMgaW50IHNjb3JwaW9uX3BtdV9nZXRfZXZlbnRfaWR4KHN0cnVjdCBwbXVfaHdfZXZlbnRzICpjcHVjLAorCQkJCSAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlpbnQgaWR4OworCWludCBiaXQgPSAtMTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwl1bnNpZ25lZCBpbnQgcmVnaW9uID0gRVZFTlRfUkVHSU9OKGh3Yy0+Y29uZmlnX2Jhc2UpOworCXVuc2lnbmVkIGludCBncm91cCA9IEVWRU5UX0dST1VQKGh3Yy0+Y29uZmlnX2Jhc2UpOworCWJvb2wgdmVudW1fZXZlbnQgPSBFVkVOVF9WRU5VTShod2MtPmNvbmZpZ19iYXNlKTsKKwlib29sIHNjb3JwaW9uX2V2ZW50ID0gRVZFTlRfQ1BVKGh3Yy0+Y29uZmlnX2Jhc2UpOworCisJaWYgKHZlbnVtX2V2ZW50IHx8IHNjb3JwaW9uX2V2ZW50KSB7CisJCS8qIElnbm9yZSBpbnZhbGlkIGV2ZW50cyAqLworCQlpZiAoZ3JvdXAgPiAzIHx8IHJlZ2lvbiA+IDMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQliaXQgPSBzY29ycGlvbl9ldmVudF90b19iaXQoZXZlbnQsIHJlZ2lvbiwgZ3JvdXApOworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChiaXQsIGNwdWMtPnVzZWRfbWFzaykpCisJCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlpZHggPSBhcm12N3BtdV9nZXRfZXZlbnRfaWR4KGNwdWMsIGV2ZW50KTsKKwlpZiAoaWR4IDwgMCAmJiBiaXQgPj0gMCkKKwkJY2xlYXJfYml0KGJpdCwgY3B1Yy0+dXNlZF9tYXNrKTsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIHNjb3JwaW9uX3BtdV9jbGVhcl9ldmVudF9pZHgoc3RydWN0IHBtdV9od19ldmVudHMgKmNwdWMsCisJCQkJICAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCWludCBiaXQ7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisJdW5zaWduZWQgaW50IHJlZ2lvbiA9IEVWRU5UX1JFR0lPTihod2MtPmNvbmZpZ19iYXNlKTsKKwl1bnNpZ25lZCBpbnQgZ3JvdXAgPSBFVkVOVF9HUk9VUChod2MtPmNvbmZpZ19iYXNlKTsKKwlib29sIHZlbnVtX2V2ZW50ID0gRVZFTlRfVkVOVU0oaHdjLT5jb25maWdfYmFzZSk7CisJYm9vbCBzY29ycGlvbl9ldmVudCA9IEVWRU5UX0NQVShod2MtPmNvbmZpZ19iYXNlKTsKKworCWlmICh2ZW51bV9ldmVudCB8fCBzY29ycGlvbl9ldmVudCkgeworCQliaXQgPSBzY29ycGlvbl9ldmVudF90b19iaXQoZXZlbnQsIHJlZ2lvbiwgZ3JvdXApOworCQljbGVhcl9iaXQoYml0LCBjcHVjLT51c2VkX21hc2spOworCX0KK30KKworc3RhdGljIGludCBzY29ycGlvbl9wbXVfaW5pdChzdHJ1Y3QgYXJtX3BtdSAqY3B1X3BtdSkKK3sKKwlhcm12N3BtdV9pbml0KGNwdV9wbXUpOworCWNwdV9wbXUtPm5hbWUJCT0gImFybXY3X3Njb3JwaW9uIjsKKwljcHVfcG11LT5tYXBfZXZlbnQJPSBzY29ycGlvbl9tYXBfZXZlbnQ7CisJY3B1X3BtdS0+bnVtX2V2ZW50cwk9IGFybXY3X3JlYWRfbnVtX3BtbmNfZXZlbnRzKCk7CisJY3B1X3BtdS0+cmVzZXQJCT0gc2NvcnBpb25fcG11X3Jlc2V0OworCWNwdV9wbXUtPmVuYWJsZQkJPSBzY29ycGlvbl9wbXVfZW5hYmxlX2V2ZW50OworCWNwdV9wbXUtPmRpc2FibGUJPSBzY29ycGlvbl9wbXVfZGlzYWJsZV9ldmVudDsKKwljcHVfcG11LT5nZXRfZXZlbnRfaWR4CT0gc2NvcnBpb25fcG11X2dldF9ldmVudF9pZHg7CisJY3B1X3BtdS0+Y2xlYXJfZXZlbnRfaWR4ID0gc2NvcnBpb25fcG11X2NsZWFyX2V2ZW50X2lkeDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY29ycGlvbl9tcF9wbXVfaW5pdChzdHJ1Y3QgYXJtX3BtdSAqY3B1X3BtdSkKK3sKKwlhcm12N3BtdV9pbml0KGNwdV9wbXUpOworCWNwdV9wbXUtPm5hbWUJCT0gImFybXY3X3Njb3JwaW9uX21wIjsKKwljcHVfcG11LT5tYXBfZXZlbnQJPSBzY29ycGlvbl9tYXBfZXZlbnQ7CisJY3B1X3BtdS0+bnVtX2V2ZW50cwk9IGFybXY3X3JlYWRfbnVtX3BtbmNfZXZlbnRzKCk7CisJY3B1X3BtdS0+cmVzZXQJCT0gc2NvcnBpb25fcG11X3Jlc2V0OworCWNwdV9wbXUtPmVuYWJsZQkJPSBzY29ycGlvbl9wbXVfZW5hYmxlX2V2ZW50OworCWNwdV9wbXUtPmRpc2FibGUJPSBzY29ycGlvbl9wbXVfZGlzYWJsZV9ldmVudDsKKwljcHVfcG11LT5nZXRfZXZlbnRfaWR4CT0gc2NvcnBpb25fcG11X2dldF9ldmVudF9pZHg7CisJY3B1X3BtdS0+Y2xlYXJfZXZlbnRfaWR4ID0gc2NvcnBpb25fcG11X2NsZWFyX2V2ZW50X2lkeDsKKwlyZXR1cm4gMDsKK30KICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBhcm12N19hOF9wbXVfaW5pdChzdHJ1Y3QgYXJtX3BtdSAqY3B1X3BtdSkKIHsKQEAgLTE0OTgsNCArMTg5NSwxNCBAQAogewogCXJldHVybiAtRU5PREVWOwogfQorCitzdGF0aWMgaW5saW5lIGludCBzY29ycGlvbl9wbXVfaW5pdChzdHJ1Y3QgYXJtX3BtdSAqY3B1X3BtdSkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2NvcnBpb25fbXBfcG11X2luaXQoc3RydWN0IGFybV9wbXUgKmNwdV9wbXUpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CiAjZW5kaWYJLyogQ09ORklHX0NQVV9WNyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZmRmYTNhNy4uZjE5MmEyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xNywxMiArMTcsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZmNvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KQEAgLTMxLDE2ICsyOCwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h3X2JyZWFrcG9pbnQuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAKLSNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9pZG1hcC5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vdGhyZWFkX25vdGlmeS5oPgogI2luY2x1ZGUgPGFzbS9zdGFja3RyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbV9taXNjLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgogI2luY2x1ZGUgPGFzbS90bHMuaD4KKyNpbmNsdWRlIDxhc20vdmRzby5oPgogCiAjaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCiAjaW5jbHVkZSA8bGludXgvc3RhY2twcm90ZWN0b3IuaD4KQEAgLTU5LDY5ICs1NCw2IEBACiAgICJBUk0iICwgIlRodW1iIiAsICJKYXplbGxlIiwgIlRodW1iRUUiCiB9OwogCi1leHRlcm4gdm9pZCBjYWxsX3dpdGhfc3RhY2sodm9pZCAoKmZuKSh2b2lkICopLCB2b2lkICphcmcsIHZvaWQgKnNwKTsKLXR5cGVkZWYgdm9pZCAoKnBoeXNfcmVzZXRfdCkodW5zaWduZWQgbG9uZyk7Ci0KLS8qCi0gKiBBIHRlbXBvcmFyeSBzdGFjayB0byB1c2UgZm9yIENQVSByZXNldC4gVGhpcyBpcyBzdGF0aWMgc28gdGhhdCB3ZQotICogZG9uJ3QgY2xvYmJlciBpdCB3aXRoIHRoZSBpZGVudGl0eSBtYXBwaW5nLiBXaGVuIHJ1bm5pbmcgd2l0aCB0aGlzCi0gKiBzdGFjaywgYW55IHJlZmVyZW5jZXMgdG8gdGhlIGN1cnJlbnQgdGFzayAqd2lsbCBub3Qgd29yayogc28geW91Ci0gKiBzaG91bGQgcmVhbGx5IGRvIGFzIGxpdHRsZSBhcyBwb3NzaWJsZSBiZWZvcmUganVtcGluZyB0byB5b3VyIHJlc2V0Ci0gKiBjb2RlLgotICovCi1zdGF0aWMgdTY0IHNvZnRfcmVzdGFydF9zdGFja1sxNl07Ci0KLXN0YXRpYyB2b2lkIF9fc29mdF9yZXN0YXJ0KHZvaWQgKmFkZHIpCi17Ci0JcGh5c19yZXNldF90IHBoeXNfcmVzZXQ7Ci0KLQkvKiBUYWtlIG91dCBhIGZsYXQgbWVtb3J5IG1hcHBpbmcuICovCi0Jc2V0dXBfbW1fZm9yX3JlYm9vdCgpOwotCi0JLyogQ2xlYW4gYW5kIGludmFsaWRhdGUgY2FjaGVzICovCi0JZmx1c2hfY2FjaGVfYWxsKCk7Ci0KLQkvKiBUdXJuIG9mZiBjYWNoaW5nICovCi0JY3B1X3Byb2NfZmluKCk7Ci0KLQkvKiBQdXNoIG91dCBhbnkgZnVydGhlciBkaXJ0eSBkYXRhLCBhbmQgZW5zdXJlIGNhY2hlIGlzIGVtcHR5ICovCi0JZmx1c2hfY2FjaGVfYWxsKCk7Ci0KLQkvKiBTd2l0Y2ggdG8gdGhlIGlkZW50aXR5IG1hcHBpbmcuICovCi0JcGh5c19yZXNldCA9IChwaHlzX3Jlc2V0X3QpKHVuc2lnbmVkIGxvbmcpdmlydF90b19waHlzKGNwdV9yZXNldCk7Ci0JcGh5c19yZXNldCgodW5zaWduZWQgbG9uZylhZGRyKTsKLQotCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZS4gKi8KLQlCVUcoKTsKLX0KLQotdm9pZCBzb2Z0X3Jlc3RhcnQodW5zaWduZWQgbG9uZyBhZGRyKQotewotCXU2NCAqc3RhY2sgPSBzb2Z0X3Jlc3RhcnRfc3RhY2sgKyBBUlJBWV9TSVpFKHNvZnRfcmVzdGFydF9zdGFjayk7Ci0KLQkvKiBEaXNhYmxlIGludGVycnVwdHMgZmlyc3QgKi8KLQlyYXdfbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlsb2NhbF9maXFfZGlzYWJsZSgpOwotCi0JLyogRGlzYWJsZSB0aGUgTDIgaWYgd2UncmUgdGhlIGxhc3QgbWFuIHN0YW5kaW5nLiAqLwotCWlmIChudW1fb25saW5lX2NwdXMoKSA9PSAxKQotCQlvdXRlcl9kaXNhYmxlKCk7Ci0KLQkvKiBDaGFuZ2UgdG8gdGhlIG5ldyBzdGFjayBhbmQgY29udGludWUgd2l0aCB0aGUgcmVzZXQuICovCi0JY2FsbF93aXRoX3N0YWNrKF9fc29mdF9yZXN0YXJ0LCAodm9pZCAqKWFkZHIsICh2b2lkICopc3RhY2spOwotCi0JLyogU2hvdWxkIG5ldmVyIGdldCBoZXJlLiAqLwotCUJVRygpOwotfQotCi0vKgotICogRnVuY3Rpb24gcG9pbnRlcnMgdG8gb3B0aW9uYWwgbWFjaGluZSBzcGVjaWZpYyBmdW5jdGlvbnMKLSAqLwotdm9pZCAoKnBtX3Bvd2VyX29mZikodm9pZCk7Ci1FWFBPUlRfU1lNQk9MKHBtX3Bvd2VyX29mZik7Ci0KLXZvaWQgKCphcm1fcG1fcmVzdGFydCkoZW51bSByZWJvb3RfbW9kZSByZWJvb3RfbW9kZSwgY29uc3QgY2hhciAqY21kKTsKLQogLyoKICAqIFRoaXMgaXMgb3VyIGRlZmF1bHQgaWRsZSBoYW5kbGVyLgogICovCkBAIC0xNjYsNzkgKzk4LDYgQEAKIH0KICNlbmRpZgogCi0vKgotICogQ2FsbGVkIGJ5IGtleGVjLCBpbW1lZGlhdGVseSBwcmlvciB0byBtYWNoaW5lX2tleGVjKCkuCi0gKgotICogVGhpcyBtdXN0IGNvbXBsZXRlbHkgZGlzYWJsZSBhbGwgc2Vjb25kYXJ5IENQVXM7IHNpbXBseSBjYXVzaW5nIHRob3NlIENQVXMKLSAqIHRvIGV4ZWN1dGUgZS5nLiBhIFJBTS1iYXNlZCBwaW4gbG9vcCBpcyBub3Qgc3VmZmljaWVudC4gVGhpcyBhbGxvd3MgdGhlCi0gKiBrZXhlYydkIGtlcm5lbCB0byB1c2UgYW55IGFuZCBhbGwgUkFNIGFzIGl0IHNlZXMgZml0LCB3aXRob3V0IGhhdmluZyB0bwotICogYXZvaWQgYW55IGNvZGUgb3IgZGF0YSB1c2VkIGJ5IGFueSBTVyBDUFUgcGluIGxvb3AuIFRoZSBDUFUgaG90cGx1ZwotICogZnVuY3Rpb25hbGl0eSBlbWJvZGllZCBpbiBkaXNhYmxlX25vbmJvb3RfY3B1cygpIHRvIGFjaGlldmUgdGhpcy4KLSAqLwotdm9pZCBtYWNoaW5lX3NodXRkb3duKHZvaWQpCi17Ci0JZGlzYWJsZV9ub25ib290X2NwdXMoKTsKLX0KLQotLyoKLSAqIEhhbHRpbmcgc2ltcGx5IHJlcXVpcmVzIHRoYXQgdGhlIHNlY29uZGFyeSBDUFVzIHN0b3AgcGVyZm9ybWluZyBhbnkKLSAqIGFjdGl2aXR5IChleGVjdXRpbmcgdGFza3MsIGhhbmRsaW5nIGludGVycnVwdHMpLiBzbXBfc2VuZF9zdG9wKCkKLSAqIGFjaGlldmVzIHRoaXMuCi0gKi8KLXZvaWQgbWFjaGluZV9oYWx0KHZvaWQpCi17Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlzbXBfc2VuZF9zdG9wKCk7Ci0KLQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCXdoaWxlICgxKTsKLX0KLQotLyoKLSAqIFBvd2VyLW9mZiBzaW1wbHkgcmVxdWlyZXMgdGhhdCB0aGUgc2Vjb25kYXJ5IENQVXMgc3RvcCBwZXJmb3JtaW5nIGFueQotICogYWN0aXZpdHkgKGV4ZWN1dGluZyB0YXNrcywgaGFuZGxpbmcgaW50ZXJydXB0cykuIHNtcF9zZW5kX3N0b3AoKQotICogYWNoaWV2ZXMgdGhpcy4gV2hlbiB0aGUgc3lzdGVtIHBvd2VyIGlzIHR1cm5lZCBvZmYsIGl0IHdpbGwgdGFrZSBhbGwgQ1BVcwotICogd2l0aCBpdC4KLSAqLwotdm9pZCBtYWNoaW5lX3Bvd2VyX29mZih2b2lkKQotewotCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0Jc21wX3NlbmRfc3RvcCgpOwotCi0JaWYgKHBtX3Bvd2VyX29mZikKLQkJcG1fcG93ZXJfb2ZmKCk7Ci19Ci0KLS8qCi0gKiBSZXN0YXJ0IHJlcXVpcmVzIHRoYXQgdGhlIHNlY29uZGFyeSBDUFVzIHN0b3AgcGVyZm9ybWluZyBhbnkgYWN0aXZpdHkKLSAqIHdoaWxlIHRoZSBwcmltYXJ5IENQVSByZXNldHMgdGhlIHN5c3RlbS4gU3lzdGVtcyB3aXRoIGEgc2luZ2xlIENQVSBjYW4KLSAqIHVzZSBzb2Z0X3Jlc3RhcnQoKSBhcyB0aGVpciBtYWNoaW5lIGRlc2NyaXB0b3IncyAucmVzdGFydCBob29rLCBzaW5jZSB0aGF0Ci0gKiB3aWxsIGNhdXNlIHRoZSBvbmx5IGF2YWlsYWJsZSBDUFUgdG8gcmVzZXQuIFN5c3RlbXMgd2l0aCBtdWx0aXBsZSBDUFVzIG11c3QKLSAqIHByb3ZpZGUgYSBIVyByZXN0YXJ0IGltcGxlbWVudGF0aW9uLCB0byBlbnN1cmUgdGhhdCBhbGwgQ1BVcyByZXNldCBhdCBvbmNlLgotICogVGhpcyBpcyByZXF1aXJlZCBzbyB0aGF0IGFueSBjb2RlIHJ1bm5pbmcgYWZ0ZXIgcmVzZXQgb24gdGhlIHByaW1hcnkgQ1BVCi0gKiBkb2Vzbid0IGhhdmUgdG8gY28tb3JkaW5hdGUgd2l0aCBvdGhlciBDUFVzIHRvIGVuc3VyZSB0aGV5IGFyZW4ndCBzdGlsbAotICogZXhlY3V0aW5nIHByZS1yZXNldCBjb2RlLCBhbmQgdXNpbmcgUkFNIHRoYXQgdGhlIHByaW1hcnkgQ1BVJ3MgY29kZSB3aXNoZXMKLSAqIHRvIHVzZS4gSW1wbGVtZW50aW5nIHN1Y2ggY28tb3JkaW5hdGlvbiB3b3VsZCBiZSBlc3NlbnRpYWxseSBpbXBvc3NpYmxlLgotICovCi12b2lkIG1hY2hpbmVfcmVzdGFydChjaGFyICpjbWQpCi17Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlzbXBfc2VuZF9zdG9wKCk7Ci0KLQlpZiAoYXJtX3BtX3Jlc3RhcnQpCi0JCWFybV9wbV9yZXN0YXJ0KHJlYm9vdF9tb2RlLCBjbWQpOwotCWVsc2UKLQkJZG9fa2VybmVsX3Jlc3RhcnQoY21kKTsKLQotCS8qIEdpdmUgYSBncmFjZSBwZXJpb2QgZm9yIGZhaWx1cmUgdG8gcmVzdGFydCBvZiAxcyAqLwotCW1kZWxheSgxMDAwKTsKLQotCS8qIFdob29wcyAtIHRoZSBwbGF0Zm9ybSB3YXMgdW5hYmxlIHRvIHJlYm9vdC4gVGVsbCB0aGUgdXNlciEgKi8KLQlwcmludGsoIlJlYm9vdCBmYWlsZWQgLS0gU3lzdGVtIGhhbHRlZFxuIik7Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQl3aGlsZSAoMSk7Ci19Ci0KIHZvaWQgX19zaG93X3JlZ3Moc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTQ3NSw3ICszMzQsNyBAQAogfQogCiAvKiBJZiBwb3NzaWJsZSwgcHJvdmlkZSBhIHBsYWNlbWVudCBoaW50IGF0IGEgcmFuZG9tIG9mZnNldCBmcm9tIHRoZQotICogc3RhY2sgZm9yIHRoZSBzaWduYWwgcGFnZS4KKyAqIHN0YWNrIGZvciB0aGUgc2lncGFnZSBhbmQgdmRzbyBwYWdlcy4KICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2lncGFnZV9hZGRyKGNvbnN0IHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCSAgdW5zaWduZWQgaW50IG5wYWdlcykKQEAgLTUxOSw2ICszNzgsNyBAQAogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CisJdW5zaWduZWQgbG9uZyBucGFnZXM7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCXVuc2lnbmVkIGxvbmcgaGludDsKIAlpbnQgcmV0ID0gMDsKQEAgLTUyOCw5ICszODgsMTIgQEAKIAlpZiAoIXNpZ25hbF9wYWdlKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCW5wYWdlcyA9IDE7IC8qIGZvciBzaWdwYWdlICovCisJbnBhZ2VzICs9IHZkc29fdG90YWxfcGFnZXM7CisKIAlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwotCWhpbnQgPSBzaWdwYWdlX2FkZHIobW0sIDEpOwotCWFkZHIgPSBnZXRfdW5tYXBwZWRfYXJlYShOVUxMLCBoaW50LCBQQUdFX1NJWkUsIDAsIDApOworCWhpbnQgPSBzaWdwYWdlX2FkZHIobW0sIG5wYWdlcyk7CisJYWRkciA9IGdldF91bm1hcHBlZF9hcmVhKE5VTEwsIGhpbnQsIG5wYWdlcyA8PCBQQUdFX1NISUZULCAwLCAwKTsKIAlpZiAoSVNfRVJSX1ZBTFVFKGFkZHIpKSB7CiAJCXJldCA9IGFkZHI7CiAJCWdvdG8gdXBfZmFpbDsKQEAgLTU0Nyw2ICs0MTAsMTIgQEAKIAogCW1tLT5jb250ZXh0LnNpZ3BhZ2UgPSBhZGRyOwogCisJLyogVW5saWtlIHRoZSBzaWdwYWdlLCBmYWlsdXJlIHRvIGluc3RhbGwgdGhlIHZkc28gaXMgdW5saWtlbHkKKwkgKiB0byBiZSBmYXRhbCB0byB0aGUgcHJvY2Vzcywgc28gbm8gZXJyb3IgY2hlY2sgbmVlZGVkCisJICogaGVyZS4KKwkgKi8KKwlhcm1faW5zdGFsbF92ZHNvKG1tLCBhZGRyICsgUEFHRV9TSVpFKTsKKwogIHVwX2ZhaWw6CiAJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wc2NpLWNhbGwuUyBiL2FyY2gvYXJtL2tlcm5lbC9wc2NpLWNhbGwuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzhlOWUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL3BzY2ktY2FsbC5TCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEFSTSBMaW1pdGVkCisgKgorICogQXV0aG9yOiBNYXJrIFJ1dGxhbmQgPG1hcmsucnV0bGFuZEBhcm0uY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKyNpbmNsdWRlIDxhc20vb3Bjb2Rlcy1zZWMuaD4KKyNpbmNsdWRlIDxhc20vb3Bjb2Rlcy12aXJ0Lmg+CisKKy8qIGludCBfX2ludm9rZV9wc2NpX2ZuX2h2Yyh1MzIgZnVuY3Rpb25faWQsIHUzMiBhcmcwLCB1MzIgYXJnMSwgdTMyIGFyZzIpICovCitFTlRSWShfX2ludm9rZV9wc2NpX2ZuX2h2YykKKwlfX0hWQygwKQorCWJ4CWxyCitFTkRQUk9DKF9faW52b2tlX3BzY2lfZm5faHZjKQorCisvKiBpbnQgX19pbnZva2VfcHNjaV9mbl9zbWModTMyIGZ1bmN0aW9uX2lkLCB1MzIgYXJnMCwgdTMyIGFyZzEsIHUzMiBhcmcyKSAqLworRU5UUlkoX19pbnZva2VfcHNjaV9mbl9zbWMpCisJX19TTUMoMCkKKwlieAlscgorRU5EUFJPQyhfX2ludm9rZV9wc2NpX2ZuX3NtYykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9wc2NpLmMgYi9hcmNoL2FybS9rZXJuZWwvcHNjaS5jCmluZGV4IGY3Mzg5MWIuLmY5MGZkZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9wc2NpLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3BzY2kuYwpAQCAtMjMsOCArMjMsNiBAQAogCiAjaW5jbHVkZSA8YXNtL2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+Ci0jaW5jbHVkZSA8YXNtL29wY29kZXMtc2VjLmg+Ci0jaW5jbHVkZSA8YXNtL29wY29kZXMtdmlydC5oPgogI2luY2x1ZGUgPGFzbS9wc2NpLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbV9taXNjLmg+CiAKQEAgLTMzLDYgKzMxLDkgQEAKIHN0YXRpYyBpbnQgKCppbnZva2VfcHNjaV9mbikodTMyLCB1MzIsIHUzMiwgdTMyKTsKIHR5cGVkZWYgaW50ICgqcHNjaV9pbml0Y2FsbF90KShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKik7CiAKK2FzbWxpbmthZ2UgaW50IF9faW52b2tlX3BzY2lfZm5faHZjKHUzMiwgdTMyLCB1MzIsIHUzMik7Cithc21saW5rYWdlIGludCBfX2ludm9rZV9wc2NpX2ZuX3NtYyh1MzIsIHUzMiwgdTMyLCB1MzIpOworCiBlbnVtIHBzY2lfZnVuY3Rpb24gewogCVBTQ0lfRk5fQ1BVX1NVU1BFTkQsCiAJUFNDSV9GTl9DUFVfT04sCkBAIC03MSw0MCArNzIsNiBAQAogCQkgJiBQU0NJXzBfMl9QT1dFUl9TVEFURV9BRkZMX01BU0spOwogfQogCi0vKgotICogVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIGFyZSBpbnZva2VkIHZpYSB0aGUgaW52b2tlX3BzY2lfZm4gcG9pbnRlcgotICogYW5kIHdpbGwgbm90IGJlIGlubGluZWQsIGFsbG93aW5nIHVzIHRvIHBpZ2d5YmFjayBvbiB0aGUgQUFQQ1MuCi0gKi8KLXN0YXRpYyBub2lubGluZSBpbnQgX19pbnZva2VfcHNjaV9mbl9odmModTMyIGZ1bmN0aW9uX2lkLCB1MzIgYXJnMCwgdTMyIGFyZzEsCi0JCQkJCSB1MzIgYXJnMikKLXsKLQlhc20gdm9sYXRpbGUoCi0JCQlfX2FzbWVxKCIlMCIsICJyMCIpCi0JCQlfX2FzbWVxKCIlMSIsICJyMSIpCi0JCQlfX2FzbWVxKCIlMiIsICJyMiIpCi0JCQlfX2FzbWVxKCIlMyIsICJyMyIpCi0JCQlfX0hWQygwKQotCQk6ICIrciIgKGZ1bmN0aW9uX2lkKQotCQk6ICJyIiAoYXJnMCksICJyIiAoYXJnMSksICJyIiAoYXJnMikpOwotCi0JcmV0dXJuIGZ1bmN0aW9uX2lkOwotfQotCi1zdGF0aWMgbm9pbmxpbmUgaW50IF9faW52b2tlX3BzY2lfZm5fc21jKHUzMiBmdW5jdGlvbl9pZCwgdTMyIGFyZzAsIHUzMiBhcmcxLAotCQkJCQkgdTMyIGFyZzIpCi17Ci0JYXNtIHZvbGF0aWxlKAotCQkJX19hc21lcSgiJTAiLCAicjAiKQotCQkJX19hc21lcSgiJTEiLCAicjEiKQotCQkJX19hc21lcSgiJTIiLCAicjIiKQotCQkJX19hc21lcSgiJTMiLCAicjMiKQotCQkJX19TTUMoMCkKLQkJOiAiK3IiIChmdW5jdGlvbl9pZCkKLQkJOiAiciIgKGFyZzApLCAiciIgKGFyZzEpLCAiciIgKGFyZzIpKTsKLQotCXJldHVybiBmdW5jdGlvbl9pZDsKLX0KLQogc3RhdGljIGludCBwc2NpX2dldF92ZXJzaW9uKHZvaWQpCiB7CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gvYXJtL2tlcm5lbC9yZWJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTRkMjMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL3JlYm9vdC5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwIFJ1c3NlbGwgS2luZyAtIENvbnZlcnRlZCB0byBBUk0uCisgKiAgT3JpZ2luYWwgQ29weXJpZ2h0IChDKSAxOTk1ICBMaW51cyBUb3J2YWxkcworICogCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKworI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2lkbWFwLmg+CisKKyNpbmNsdWRlICJyZWJvb3QuaCIKKwordHlwZWRlZiB2b2lkICgqcGh5c19yZXNldF90KSh1bnNpZ25lZCBsb25nKTsKKworLyoKKyAqIEZ1bmN0aW9uIHBvaW50ZXJzIHRvIG9wdGlvbmFsIG1hY2hpbmUgc3BlY2lmaWMgZnVuY3Rpb25zCisgKi8KK3ZvaWQgKCphcm1fcG1fcmVzdGFydCkoZW51bSByZWJvb3RfbW9kZSByZWJvb3RfbW9kZSwgY29uc3QgY2hhciAqY21kKTsKK3ZvaWQgKCpwbV9wb3dlcl9vZmYpKHZvaWQpOworRVhQT1JUX1NZTUJPTChwbV9wb3dlcl9vZmYpOworCisvKgorICogQSB0ZW1wb3Jhcnkgc3RhY2sgdG8gdXNlIGZvciBDUFUgcmVzZXQuIFRoaXMgaXMgc3RhdGljIHNvIHRoYXQgd2UKKyAqIGRvbid0IGNsb2JiZXIgaXQgd2l0aCB0aGUgaWRlbnRpdHkgbWFwcGluZy4gV2hlbiBydW5uaW5nIHdpdGggdGhpcworICogc3RhY2ssIGFueSByZWZlcmVuY2VzIHRvIHRoZSBjdXJyZW50IHRhc2sgKndpbGwgbm90IHdvcmsqIHNvIHlvdQorICogc2hvdWxkIHJlYWxseSBkbyBhcyBsaXR0bGUgYXMgcG9zc2libGUgYmVmb3JlIGp1bXBpbmcgdG8geW91ciByZXNldAorICogY29kZS4KKyAqLworc3RhdGljIHU2NCBzb2Z0X3Jlc3RhcnRfc3RhY2tbMTZdOworCitzdGF0aWMgdm9pZCBfX3NvZnRfcmVzdGFydCh2b2lkICphZGRyKQoreworCXBoeXNfcmVzZXRfdCBwaHlzX3Jlc2V0OworCisJLyogVGFrZSBvdXQgYSBmbGF0IG1lbW9yeSBtYXBwaW5nLiAqLworCXNldHVwX21tX2Zvcl9yZWJvb3QoKTsKKworCS8qIENsZWFuIGFuZCBpbnZhbGlkYXRlIGNhY2hlcyAqLworCWZsdXNoX2NhY2hlX2FsbCgpOworCisJLyogVHVybiBvZmYgY2FjaGluZyAqLworCWNwdV9wcm9jX2ZpbigpOworCisJLyogUHVzaCBvdXQgYW55IGZ1cnRoZXIgZGlydHkgZGF0YSwgYW5kIGVuc3VyZSBjYWNoZSBpcyBlbXB0eSAqLworCWZsdXNoX2NhY2hlX2FsbCgpOworCisJLyogU3dpdGNoIHRvIHRoZSBpZGVudGl0eSBtYXBwaW5nLiAqLworCXBoeXNfcmVzZXQgPSAocGh5c19yZXNldF90KSh1bnNpZ25lZCBsb25nKXZpcnRfdG9fcGh5cyhjcHVfcmVzZXQpOworCXBoeXNfcmVzZXQoKHVuc2lnbmVkIGxvbmcpYWRkcik7CisKKwkvKiBTaG91bGQgbmV2ZXIgZ2V0IGhlcmUuICovCisJQlVHKCk7Cit9CisKK3ZvaWQgX3NvZnRfcmVzdGFydCh1bnNpZ25lZCBsb25nIGFkZHIsIGJvb2wgZGlzYWJsZV9sMikKK3sKKwl1NjQgKnN0YWNrID0gc29mdF9yZXN0YXJ0X3N0YWNrICsgQVJSQVlfU0laRShzb2Z0X3Jlc3RhcnRfc3RhY2spOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzIGZpcnN0ICovCisJcmF3X2xvY2FsX2lycV9kaXNhYmxlKCk7CisJbG9jYWxfZmlxX2Rpc2FibGUoKTsKKworCS8qIERpc2FibGUgdGhlIEwyIGlmIHdlJ3JlIHRoZSBsYXN0IG1hbiBzdGFuZGluZy4gKi8KKwlpZiAoZGlzYWJsZV9sMikKKwkJb3V0ZXJfZGlzYWJsZSgpOworCisJLyogQ2hhbmdlIHRvIHRoZSBuZXcgc3RhY2sgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHJlc2V0LiAqLworCWNhbGxfd2l0aF9zdGFjayhfX3NvZnRfcmVzdGFydCwgKHZvaWQgKilhZGRyLCAodm9pZCAqKXN0YWNrKTsKKworCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZS4gKi8KKwlCVUcoKTsKK30KKwordm9pZCBzb2Z0X3Jlc3RhcnQodW5zaWduZWQgbG9uZyBhZGRyKQoreworCV9zb2Z0X3Jlc3RhcnQoYWRkciwgbnVtX29ubGluZV9jcHVzKCkgPT0gMSk7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkga2V4ZWMsIGltbWVkaWF0ZWx5IHByaW9yIHRvIG1hY2hpbmVfa2V4ZWMoKS4KKyAqCisgKiBUaGlzIG11c3QgY29tcGxldGVseSBkaXNhYmxlIGFsbCBzZWNvbmRhcnkgQ1BVczsgc2ltcGx5IGNhdXNpbmcgdGhvc2UgQ1BVcworICogdG8gZXhlY3V0ZSBlLmcuIGEgUkFNLWJhc2VkIHBpbiBsb29wIGlzIG5vdCBzdWZmaWNpZW50LiBUaGlzIGFsbG93cyB0aGUKKyAqIGtleGVjJ2Qga2VybmVsIHRvIHVzZSBhbnkgYW5kIGFsbCBSQU0gYXMgaXQgc2VlcyBmaXQsIHdpdGhvdXQgaGF2aW5nIHRvCisgKiBhdm9pZCBhbnkgY29kZSBvciBkYXRhIHVzZWQgYnkgYW55IFNXIENQVSBwaW4gbG9vcC4gVGhlIENQVSBob3RwbHVnCisgKiBmdW5jdGlvbmFsaXR5IGVtYm9kaWVkIGluIGRpc2FibGVfbm9uYm9vdF9jcHVzKCkgdG8gYWNoaWV2ZSB0aGlzLgorICovCit2b2lkIG1hY2hpbmVfc2h1dGRvd24odm9pZCkKK3sKKwlkaXNhYmxlX25vbmJvb3RfY3B1cygpOworfQorCisvKgorICogSGFsdGluZyBzaW1wbHkgcmVxdWlyZXMgdGhhdCB0aGUgc2Vjb25kYXJ5IENQVXMgc3RvcCBwZXJmb3JtaW5nIGFueQorICogYWN0aXZpdHkgKGV4ZWN1dGluZyB0YXNrcywgaGFuZGxpbmcgaW50ZXJydXB0cykuIHNtcF9zZW5kX3N0b3AoKQorICogYWNoaWV2ZXMgdGhpcy4KKyAqLwordm9pZCBtYWNoaW5lX2hhbHQodm9pZCkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXNtcF9zZW5kX3N0b3AoKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJd2hpbGUgKDEpOworfQorCisvKgorICogUG93ZXItb2ZmIHNpbXBseSByZXF1aXJlcyB0aGF0IHRoZSBzZWNvbmRhcnkgQ1BVcyBzdG9wIHBlcmZvcm1pbmcgYW55CisgKiBhY3Rpdml0eSAoZXhlY3V0aW5nIHRhc2tzLCBoYW5kbGluZyBpbnRlcnJ1cHRzKS4gc21wX3NlbmRfc3RvcCgpCisgKiBhY2hpZXZlcyB0aGlzLiBXaGVuIHRoZSBzeXN0ZW0gcG93ZXIgaXMgdHVybmVkIG9mZiwgaXQgd2lsbCB0YWtlIGFsbCBDUFVzCisgKiB3aXRoIGl0LgorICovCit2b2lkIG1hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCit7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwlzbXBfc2VuZF9zdG9wKCk7CisKKwlpZiAocG1fcG93ZXJfb2ZmKQorCQlwbV9wb3dlcl9vZmYoKTsKK30KKworLyoKKyAqIFJlc3RhcnQgcmVxdWlyZXMgdGhhdCB0aGUgc2Vjb25kYXJ5IENQVXMgc3RvcCBwZXJmb3JtaW5nIGFueSBhY3Rpdml0eQorICogd2hpbGUgdGhlIHByaW1hcnkgQ1BVIHJlc2V0cyB0aGUgc3lzdGVtLiBTeXN0ZW1zIHdpdGggYSBzaW5nbGUgQ1BVIGNhbgorICogdXNlIHNvZnRfcmVzdGFydCgpIGFzIHRoZWlyIG1hY2hpbmUgZGVzY3JpcHRvcidzIC5yZXN0YXJ0IGhvb2ssIHNpbmNlIHRoYXQKKyAqIHdpbGwgY2F1c2UgdGhlIG9ubHkgYXZhaWxhYmxlIENQVSB0byByZXNldC4gU3lzdGVtcyB3aXRoIG11bHRpcGxlIENQVXMgbXVzdAorICogcHJvdmlkZSBhIEhXIHJlc3RhcnQgaW1wbGVtZW50YXRpb24sIHRvIGVuc3VyZSB0aGF0IGFsbCBDUFVzIHJlc2V0IGF0IG9uY2UuCisgKiBUaGlzIGlzIHJlcXVpcmVkIHNvIHRoYXQgYW55IGNvZGUgcnVubmluZyBhZnRlciByZXNldCBvbiB0aGUgcHJpbWFyeSBDUFUKKyAqIGRvZXNuJ3QgaGF2ZSB0byBjby1vcmRpbmF0ZSB3aXRoIG90aGVyIENQVXMgdG8gZW5zdXJlIHRoZXkgYXJlbid0IHN0aWxsCisgKiBleGVjdXRpbmcgcHJlLXJlc2V0IGNvZGUsIGFuZCB1c2luZyBSQU0gdGhhdCB0aGUgcHJpbWFyeSBDUFUncyBjb2RlIHdpc2hlcworICogdG8gdXNlLiBJbXBsZW1lbnRpbmcgc3VjaCBjby1vcmRpbmF0aW9uIHdvdWxkIGJlIGVzc2VudGlhbGx5IGltcG9zc2libGUuCisgKi8KK3ZvaWQgbWFjaGluZV9yZXN0YXJ0KGNoYXIgKmNtZCkKK3sKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXNtcF9zZW5kX3N0b3AoKTsKKworCWlmIChhcm1fcG1fcmVzdGFydCkKKwkJYXJtX3BtX3Jlc3RhcnQocmVib290X21vZGUsIGNtZCk7CisJZWxzZQorCQlkb19rZXJuZWxfcmVzdGFydChjbWQpOworCisJLyogR2l2ZSBhIGdyYWNlIHBlcmlvZCBmb3IgZmFpbHVyZSB0byByZXN0YXJ0IG9mIDFzICovCisJbWRlbGF5KDEwMDApOworCisJLyogV2hvb3BzIC0gdGhlIHBsYXRmb3JtIHdhcyB1bmFibGUgdG8gcmVib290LiBUZWxsIHRoZSB1c2VyISAqLworCXByaW50aygiUmVib290IGZhaWxlZCAtLSBTeXN0ZW0gaGFsdGVkXG4iKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXdoaWxlICgxKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9yZWJvb3QuaCBiL2FyY2gvYXJtL2tlcm5lbC9yZWJvb3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjdhMGIxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0va2VybmVsL3JlYm9vdC5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBSRUJPT1RfSAorI2RlZmluZSBSRUJPT1RfSAorCitleHRlcm4gdm9pZCBjYWxsX3dpdGhfc3RhY2sodm9pZCAoKmZuKSh2b2lkICopLCB2b2lkICphcmcsIHZvaWQgKnNwKTsKK2V4dGVybiB2b2lkIF9zb2Z0X3Jlc3RhcnQodW5zaWduZWQgbG9uZyBhZGRyLCBib29sIGRpc2FibGVfbDIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9yZXR1cm5fYWRkcmVzcy5jIGIvYXJjaC9hcm0va2VybmVsL3JldHVybl9hZGRyZXNzLmMKaW5kZXggMjRiNGEwNC4uMzZlZDM1MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3JldHVybl9hZGRyZXNzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3JldHVybl9hZGRyZXNzLmMKQEAgLTU2LDggKzU2LDYgQEAKIAkJcmV0dXJuIE5VTEw7CiB9CiAKLSNlbHNlIC8qIGlmIGRlZmluZWQoQ09ORklHX0ZSQU1FX1BPSU5URVIpICYmICFkZWZpbmVkKENPTkZJR19BUk1fVU5XSU5EKSAqLwotCi0jZW5kaWYgLyogaWYgZGVmaW5lZChDT05GSUdfRlJBTUVfUE9JTlRFUikgJiYgIWRlZmluZWQoQ09ORklHX0FSTV9VTldJTkQpIC8gZWxzZSAqLworI2VuZGlmIC8qIGlmIGRlZmluZWQoQ09ORklHX0ZSQU1FX1BPSU5URVIpICYmICFkZWZpbmVkKENPTkZJR19BUk1fVU5XSU5EKSAqLwogCiBFWFBPUlRfU1lNQk9MX0dQTChyZXR1cm5fYWRkcmVzcyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCmluZGV4IGU1NTQwOGUuLjZjNzc3ZTkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zZXR1cC5jCkBAIC0yNDYsMTIgKzI0Niw5IEBACiAJCWlmIChjcHVfYXJjaCkKIAkJCWNwdV9hcmNoICs9IENQVV9BUkNIX0FSTXYzOwogCX0gZWxzZSBpZiAoKHJlYWRfY3B1aWRfaWQoKSAmIDB4MDAwZjAwMDApID09IDB4MDAwZjAwMDApIHsKLQkJdW5zaWduZWQgaW50IG1tZnIwOwotCiAJCS8qIFJldmlzZWQgQ1BVSUQgZm9ybWF0LiBSZWFkIHRoZSBNZW1vcnkgTW9kZWwgRmVhdHVyZQogCQkgKiBSZWdpc3RlciAwIGFuZCBjaGVjayBmb3IgVk1TQXY3IG9yIFBNU0F2NyAqLwotCQlhc20oIm1yYwlwMTUsIDAsICUwLCBjMCwgYzEsIDQiCi0JCSAgICA6ICI9ciIgKG1tZnIwKSk7CisJCXVuc2lnbmVkIGludCBtbWZyMCA9IHJlYWRfY3B1aWRfZXh0KENQVUlEX0VYVF9NTUZSMCk7CiAJCWlmICgobW1mcjAgJiAweDAwMDAwMDBmKSA+PSAweDAwMDAwMDAzIHx8CiAJCSAgICAobW1mcjAgJiAweDAwMDAwMGYwKSA+PSAweDAwMDAwMDMwKQogCQkJY3B1X2FyY2ggPSBDUFVfQVJDSF9BUk12NzsKQEAgLTM3NSwzMCArMzcyLDQ4IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBjcHVpZF9pbml0X2h3Y2Fwcyh2b2lkKQogewotCXVuc2lnbmVkIGludCBkaXZpZGVfaW5zdHJzLCB2bXNhOworCWludCBibG9jazsKKwl1MzIgaXNhcjU7CiAKIAlpZiAoY3B1X2FyY2hpdGVjdHVyZSgpIDwgQ1BVX0FSQ0hfQVJNdjcpCiAJCXJldHVybjsKIAotCWRpdmlkZV9pbnN0cnMgPSAocmVhZF9jcHVpZF9leHQoQ1BVSURfRVhUX0lTQVIwKSAmIDB4MGYwMDAwMDApID4+IDI0OwotCi0Jc3dpdGNoIChkaXZpZGVfaW5zdHJzKSB7Ci0JY2FzZSAyOgorCWJsb2NrID0gY3B1aWRfZmVhdHVyZV9leHRyYWN0KENQVUlEX0VYVF9JU0FSMCwgMjQpOworCWlmIChibG9jayA+PSAyKQogCQllbGZfaHdjYXAgfD0gSFdDQVBfSURJVkE7Ci0JY2FzZSAxOgorCWlmIChibG9jayA+PSAxKQogCQllbGZfaHdjYXAgfD0gSFdDQVBfSURJVlQ7Ci0JfQogCiAJLyogTFBBRSBpbXBsaWVzIGF0b21pYyBsZHJkL3N0cmQgaW5zdHJ1Y3Rpb25zICovCi0Jdm1zYSA9IChyZWFkX2NwdWlkX2V4dChDUFVJRF9FWFRfTU1GUjApICYgMHhmKSA+PiAwOwotCWlmICh2bXNhID49IDUpCisJYmxvY2sgPSBjcHVpZF9mZWF0dXJlX2V4dHJhY3QoQ1BVSURfRVhUX01NRlIwLCAwKTsKKwlpZiAoYmxvY2sgPj0gNSkKIAkJZWxmX2h3Y2FwIHw9IEhXQ0FQX0xQQUU7CisKKwkvKiBjaGVjayBmb3Igc3VwcG9ydGVkIHY4IENyeXB0byBpbnN0cnVjdGlvbnMgKi8KKwlpc2FyNSA9IHJlYWRfY3B1aWRfZXh0KENQVUlEX0VYVF9JU0FSNSk7CisKKwlibG9jayA9IGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF9maWVsZChpc2FyNSwgNCk7CisJaWYgKGJsb2NrID49IDIpCisJCWVsZl9od2NhcDIgfD0gSFdDQVAyX1BNVUxMOworCWlmIChibG9jayA+PSAxKQorCQllbGZfaHdjYXAyIHw9IEhXQ0FQMl9BRVM7CisKKwlibG9jayA9IGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF9maWVsZChpc2FyNSwgOCk7CisJaWYgKGJsb2NrID49IDEpCisJCWVsZl9od2NhcDIgfD0gSFdDQVAyX1NIQTE7CisKKwlibG9jayA9IGNwdWlkX2ZlYXR1cmVfZXh0cmFjdF9maWVsZChpc2FyNSwgMTIpOworCWlmIChibG9jayA+PSAxKQorCQllbGZfaHdjYXAyIHw9IEhXQ0FQMl9TSEEyOworCisJYmxvY2sgPSBjcHVpZF9mZWF0dXJlX2V4dHJhY3RfZmllbGQoaXNhcjUsIDE2KTsKKwlpZiAoYmxvY2sgPj0gMSkKKwkJZWxmX2h3Y2FwMiB8PSBIV0NBUDJfQ1JDMzI7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBlbGZfaHdjYXBfZml4dXAodm9pZCkKIHsKIAl1bnNpZ25lZCBpZCA9IHJlYWRfY3B1aWRfaWQoKTsKLQl1bnNpZ25lZCBzeW5jX3ByaW07CiAKIAkvKgogCSAqIEhXQ0FQX1RMUyBpcyBhdmFpbGFibGUgb25seSBvbiAxMTM2IHIxcDAgYW5kIGxhdGVyLApAQCAtNDE5LDkgKzQzNCw5IEBACiAJICogYXZvaWQgYWR2ZXJ0aXNpbmcgU1dQOyBpdCBtYXkgbm90IGJlIGF0b21pYyB3aXRoCiAJICogbXVsdGlwcm9jZXNzaW5nIGNvcmVzLgogCSAqLwotCXN5bmNfcHJpbSA9ICgocmVhZF9jcHVpZF9leHQoQ1BVSURfRVhUX0lTQVIzKSA+PiA4KSAmIDB4ZjApIHwKLQkJICAgICgocmVhZF9jcHVpZF9leHQoQ1BVSURfRVhUX0lTQVI0KSA+PiAyMCkgJiAweDBmKTsKLQlpZiAoc3luY19wcmltID49IDB4MTMpCisJaWYgKGNwdWlkX2ZlYXR1cmVfZXh0cmFjdChDUFVJRF9FWFRfSVNBUjMsIDEyKSA+IDEgfHwKKwkgICAgKGNwdWlkX2ZlYXR1cmVfZXh0cmFjdChDUFVJRF9FWFRfSVNBUjMsIDEyKSA9PSAxICYmCisJICAgICBjcHVpZF9mZWF0dXJlX2V4dHJhY3QoQ1BVSURfRVhUX0lTQVIzLCAyMCkgPj0gMykpCiAJCWVsZl9od2NhcCAmPSB+SFdDQVBfU1dQOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2FybS9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMDIzYWM5MC4uNDIzNjYzZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zaWduYWwuYwpAQCAtMzE4LDE3ICszMTgsNiBAQAogCXJldHVybiBmcmFtZTsKIH0KIAotLyoKLSAqIHRyYW5zbGF0ZSB0aGUgc2lnbmFsCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IG1hcF9zaWcoaW50IHNpZykKLXsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKLQlpZiAoc2lnIDwgMzIgJiYgdGhyZWFkLT5leGVjX2RvbWFpbiAmJiB0aHJlYWQtPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwKQotCQlzaWcgPSB0aHJlYWQtPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ107Ci0JcmV0dXJuIHNpZzsKLX0KLQogc3RhdGljIGludAogc2V0dXBfcmV0dXJuKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qga3NpZ25hbCAqa3NpZywKIAkgICAgIHVuc2lnbmVkIGxvbmcgX191c2VyICpyYywgdm9pZCBfX3VzZXIgKmZyYW1lKQpAQCAtNDEyLDcgKzQwMSw3IEBACiAJCX0KIAl9CiAKLQlyZWdzLT5BUk1fcjAgPSBtYXBfc2lnKGtzaWctPnNpZyk7CisJcmVncy0+QVJNX3IwID0ga3NpZy0+c2lnOwogCXJlZ3MtPkFSTV9zcCA9ICh1bnNpZ25lZCBsb25nKWZyYW1lOwogCXJlZ3MtPkFSTV9sciA9IHJldGNvZGU7CiAJcmVncy0+QVJNX3BjID0gaGFuZGxlcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9zbGVlcC5TIGIvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKaW5kZXggZTFlNjBlNS4uN2QzN2JmYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKKysrIGIvYXJjaC9hcm0va2VybmVsL3NsZWVwLlMKQEAgLTExNiwxNCArMTE2LDcgQEAKIAlsZG1mZAlzcCEsIHtyNCAtIHIxMSwgcGN9CiBFTkRQUk9DKGNwdV9yZXN1bWVfYWZ0ZXJfbW11KQogCi0vKgotICogTm90ZTogWWVzLCBwYXJ0IG9mIHRoZSBmb2xsb3dpbmcgY29kZSBpcyBsb2NhdGVkIGludG8gdGhlIC5kYXRhIHNlY3Rpb24uCi0gKiAgICAgICBUaGlzIGlzIHRvIGFsbG93IHNsZWVwX3NhdmVfc3AgdG8gYmUgYWNjZXNzZWQgd2l0aCBhIHJlbGF0aXZlIGxvYWQKLSAqICAgICAgIHdoaWxlIHdlIGNhbid0IHJlbHkgb24gYW55IE1NVSB0cmFuc2xhdGlvbi4gIFdlIGNvdWxkIGhhdmUgcHV0Ci0gKiAgICAgICBzbGVlcF9zYXZlX3NwIGluIHRoZSAudGV4dCBzZWN0aW9uIGFzIHdlbGwsIGJ1dCBzb21lIHNldHVwcyBtaWdodAotICogICAgICAgaW5zaXN0IG9uIGl0IHRvIGJlIHRydWx5IHJlYWQtb25seS4KLSAqLwotCS5kYXRhCisJLnRleHQKIAkuYWxpZ24KIEVOVFJZKGNwdV9yZXN1bWUpCiBBUk1fQkU4KHNldGVuZCBiZSkJCQlAIGVuc3VyZSB3ZSBhcmUgaW4gQkUgbW9kZQpAQCAtMTQ1LDYgKzEzOCw4IEBACiAJY29tcHV0ZV9tcGlkcl9oYXNoCXIxLCByNCwgcjUsIHI2LCByMCwgcjMKIDE6CiAJYWRyCXIwLCBfc2xlZXBfc2F2ZV9zcAorCWxkcglyMiwgW3IwXQorCWFkZAlyMCwgcjAsIHIyCiAJbGRyCXIwLCBbcjAsICNTTEVFUF9TQVZFX1NQX1BIWVNdCiAJbGRyCXIwLCBbcjAsIHIxLCBsc2wgIzJdCiAKQEAgLTE1NiwxMCArMTUxLDEyIEBACiBFTkRQUk9DKGNwdV9yZXN1bWUpCiAKIAkuYWxpZ24gMgorX3NsZWVwX3NhdmVfc3A6CisJLmxvbmcJc2xlZXBfc2F2ZV9zcCAtIC4KIG1waWRyX2hhc2hfcHRyOgogCS5sb25nCW1waWRyX2hhc2ggLSAuCQkJQCBtcGlkcl9oYXNoIHN0cnVjdCBvZmZzZXQKIAorCS5kYXRhCiAJLnR5cGUJc2xlZXBfc2F2ZV9zcCwgI29iamVjdAogRU5UUlkoc2xlZXBfc2F2ZV9zcCkKLV9zbGVlcF9zYXZlX3NwOgogCS5zcGFjZQlTTEVFUF9TQVZFX1NQX1NaCQlAIHN0cnVjdCBzbGVlcF9zYXZlX3NwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc21wLmMgYi9hcmNoL2FybS9rZXJuZWwvc21wLmMKaW5kZXggODZlZjI0NC4uY2NhNWI4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3NtcC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zbXAuYwpAQCAtMTQ1LDYgKzE0NSwxMSBAQAogCQlzbXBfb3BzLnNtcF9pbml0X2NwdXMoKTsKIH0KIAoraW50IHBsYXRmb3JtX2Nhbl9zZWNvbmRhcnlfYm9vdCh2b2lkKQoreworCXJldHVybiAhIXNtcF9vcHMuc21wX2Jvb3Rfc2Vjb25kYXJ5OworfQorCiBpbnQgcGxhdGZvcm1fY2FuX2NwdV9ob3RwbHVnKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvc3dwX2VtdWxhdGUuYyBiL2FyY2gvYXJtL2tlcm5lbC9zd3BfZW11bGF0ZS5jCmluZGV4IGFmZGQ1MWUuLjEzNjE3NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC9zd3BfZW11bGF0ZS5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9zd3BfZW11bGF0ZS5jCkBAIC00Miw3ICs0Miw3IEBACiAJIgljbXAJCSUwLCAjMFxuIgkJCVwKIAkiCW1vdm5lCQklMCwgJTRcbiIJCQlcCiAJIjI6XG4iCQkJCQkJCVwKLQkiCS5zZWN0aW9uCSAuZml4dXAsXCJheFwiXG4iCQlcCisJIgkuc2VjdGlvbgkgLnRleHQuZml4dXAsXCJheFwiXG4iCQlcCiAJIgkuYWxpZ24JCTJcbiIJCQkJXAogCSIzOgltb3YJCSUwLCAlNVxuIgkJCVwKIAkiCWIJCTJiXG4iCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMgYi9hcmNoL2FybS9rZXJuZWwvdGltZS5jCmluZGV4IDBjYzdlNTguLmE2NmUzN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RpbWUuYwpAQCAtNzYsNyArNzYsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGR1bW15X2Nsb2NrX2FjY2VzcyhzdHJ1Y3QgdGltZXNwZWMgKnRzKQorc3RhdGljIHZvaWQgZHVtbXlfY2xvY2tfYWNjZXNzKHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAl0cy0+dHZfc2VjID0gMDsKIAl0cy0+dHZfbnNlYyA9IDA7CkBAIC04NSwxMiArODUsMTIgQEAKIHN0YXRpYyBjbG9ja19hY2Nlc3NfZm4gX19yZWFkX3BlcnNpc3RlbnRfY2xvY2sgPSBkdW1teV9jbG9ja19hY2Nlc3M7CiBzdGF0aWMgY2xvY2tfYWNjZXNzX2ZuIF9fcmVhZF9ib290X2Nsb2NrID0gZHVtbXlfY2xvY2tfYWNjZXNzOzsKIAotdm9pZCByZWFkX3BlcnNpc3RlbnRfY2xvY2soc3RydWN0IHRpbWVzcGVjICp0cykKK3ZvaWQgcmVhZF9wZXJzaXN0ZW50X2Nsb2NrNjQoc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCV9fcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHRzKTsKIH0KIAotdm9pZCByZWFkX2Jvb3RfY2xvY2soc3RydWN0IHRpbWVzcGVjICp0cykKK3ZvaWQgcmVhZF9ib290X2Nsb2NrNjQoc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCV9fcmVhZF9ib290X2Nsb2NrKHRzKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKaW5kZXggNzg4ZTIzZi4uM2RjZTFhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL3RyYXBzLmMKQEAgLTUwNSwxMiArNTA1LDEwIEBACiAKIHN0YXRpYyBpbnQgYmFkX3N5c2NhbGwoaW50IG4sIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGhyZWFkID0gY3VycmVudF90aHJlYWRfaW5mbygpOwogCXNpZ2luZm9fdCBpbmZvOwogCi0JaWYgKChjdXJyZW50LT5wZXJzb25hbGl0eSAmIFBFUl9NQVNLKSAhPSBQRVJfTElOVVggJiYKLQkgICAgdGhyZWFkLT5leGVjX2RvbWFpbi0+aGFuZGxlcikgewotCQl0aHJlYWQtPmV4ZWNfZG9tYWluLT5oYW5kbGVyKG4sIHJlZ3MpOworCWlmICgoY3VycmVudC0+cGVyc29uYWxpdHkgJiBQRVJfTUFTSykgIT0gUEVSX0xJTlVYKSB7CisJCXNlbmRfc2lnKFNJR1NFR1YsIGN1cnJlbnQsIDEpOwogCQlyZXR1cm4gcmVncy0+QVJNX3IwOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Zkc28uYyBiL2FyY2gvYXJtL2tlcm5lbC92ZHNvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZlMTdkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2tlcm5lbC92ZHNvLmMKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiBBZGFwdGVkIGZyb20gYXJtNjQgdmVyc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQVJNIExpbWl0ZWQKKyAqIENvcHlyaWdodCAoQykgMjAxNSBNZW50b3IgR3JhcGhpY3MgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1la2VlcGVyX2ludGVybmFsLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9hcmNoX3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2JhcnJpZXIuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3Zkc28uaD4KKyNpbmNsdWRlIDxhc20vdmRzb19kYXRhcGFnZS5oPgorI2luY2x1ZGUgPGNsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmg+CisKKyNkZWZpbmUgTUFYX1NZTU5BTUUJNjQKKworc3RhdGljIHN0cnVjdCBwYWdlICoqdmRzb190ZXh0X3BhZ2VsaXN0OworCisvKiBUb3RhbCBudW1iZXIgb2YgcGFnZXMgbmVlZGVkIGZvciB0aGUgZGF0YSBhbmQgdGV4dCBwb3J0aW9ucyBvZiB0aGUgVkRTTy4gKi8KK3Vuc2lnbmVkIGludCB2ZHNvX3RvdGFsX3BhZ2VzIF9fcmVhZF9tb3N0bHk7CisKKy8qCisgKiBUaGUgVkRTTyBkYXRhIHBhZ2UuCisgKi8KK3N0YXRpYyB1bmlvbiB2ZHNvX2RhdGFfc3RvcmUgdmRzb19kYXRhX3N0b3JlIF9fcGFnZV9hbGlnbmVkX2RhdGE7CitzdGF0aWMgc3RydWN0IHZkc29fZGF0YSAqdmRzb19kYXRhID0gJnZkc29fZGF0YV9zdG9yZS5kYXRhOworCitzdGF0aWMgc3RydWN0IHBhZ2UgKnZkc29fZGF0YV9wYWdlOworc3RhdGljIHN0cnVjdCB2bV9zcGVjaWFsX21hcHBpbmcgdmRzb19kYXRhX21hcHBpbmcgPSB7CisJLm5hbWUgPSAiW3Z2YXJdIiwKKwkucGFnZXMgPSAmdmRzb19kYXRhX3BhZ2UsCit9OworCitzdGF0aWMgc3RydWN0IHZtX3NwZWNpYWxfbWFwcGluZyB2ZHNvX3RleHRfbWFwcGluZyA9IHsKKwkubmFtZSA9ICJbdmRzb10iLAorfTsKKworc3RydWN0IGVsZmluZm8geworCUVsZjMyX0VoZHIJKmhkcjsJCS8qIHB0ciB0byBFTEYgKi8KKwlFbGYzMl9TeW0JKmR5bnN5bTsJLyogcHRyIHRvIC5keW5zeW0gc2VjdGlvbiAqLworCXVuc2lnbmVkIGxvbmcJZHluc3ltc2l6ZTsJLyogc2l6ZSBvZiAuZHluc3ltIHNlY3Rpb24gKi8KKwljaGFyCQkqZHluc3RyOwkvKiBwdHIgdG8gLmR5bnN0ciBzZWN0aW9uICovCit9OworCisvKiBDYWNoZWQgcmVzdWx0IG9mIGJvb3QtdGltZSBjaGVjayBmb3Igd2hldGhlciB0aGUgYXJjaCB0aW1lciBleGlzdHMsCisgKiBhbmQgaWYgc28sIHdoZXRoZXIgdGhlIHZpcnR1YWwgY291bnRlciBpcyB1c2VhYmxlLgorICovCitzdGF0aWMgYm9vbCBjbnR2Y3Rfb2sgX19yZWFkX21vc3RseTsKKworc3RhdGljIGJvb2wgX19pbml0IGNudHZjdF9mdW5jdGlvbmFsKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlib29sIHJldCA9IGZhbHNlOworCisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19BUk1fQVJDSF9USU1FUikpCisJCWdvdG8gb3V0OworCisJLyogVGhlIGFybV9hcmNoX3RpbWVyIGNvcmUgc2hvdWxkIGV4cG9ydAorCSAqIGFyY2hfdGltZXJfdXNlX3ZpcnR1YWwgb3Igc2ltaWxhciBzbyB3ZSBkb24ndCBoYXZlIHRvIGRvCisJICogdGhpcy4KKwkgKi8KKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJhcm0sYXJtdjctdGltZXIiKTsKKwlpZiAoIW5wKQorCQlnb3RvIG91dF9wdXQ7CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYXJtLGNwdS1yZWdpc3RlcnMtbm90LWZ3LWNvbmZpZ3VyZWQiKSkKKwkJZ290byBvdXRfcHV0OworCisJcmV0ID0gdHJ1ZTsKKworb3V0X3B1dDoKKwlvZl9ub2RlX3B1dChucCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgKiBfX2luaXQgZmluZF9zZWN0aW9uKEVsZjMyX0VoZHIgKmVoZHIsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICB1bnNpZ25lZCBsb25nICpzaXplKQoreworCUVsZjMyX1NoZHIgKnNlY2hkcnM7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciAqc2VjbmFtZXM7CisKKwkvKiBHcmFiIHNlY3Rpb24gaGVhZGVycyBhbmQgc3RyaW5ncyBzbyB3ZSBjYW4gdGVsbCB3aG8gaXMgd2hvICovCisJc2VjaGRycyA9ICh2b2lkICopZWhkciArIGVoZHItPmVfc2hvZmY7CisJc2VjbmFtZXMgPSAodm9pZCAqKWVoZHIgKyBzZWNoZHJzW2VoZHItPmVfc2hzdHJuZHhdLnNoX29mZnNldDsKKworCS8qIEZpbmQgdGhlIHNlY3Rpb24gdGhleSB3YW50ICovCisJZm9yIChpID0gMTsgaSA8IGVoZHItPmVfc2hudW07IGkrKykgeworCQlpZiAoc3RyY21wKHNlY25hbWVzICsgc2VjaGRyc1tpXS5zaF9uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQlpZiAoc2l6ZSkKKwkJCQkqc2l6ZSA9IHNlY2hkcnNbaV0uc2hfc2l6ZTsKKwkJCXJldHVybiAodm9pZCAqKWVoZHIgKyBzZWNoZHJzW2ldLnNoX29mZnNldDsKKwkJfQorCX0KKworCWlmIChzaXplKQorCQkqc2l6ZSA9IDA7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBFbGYzMl9TeW0gKiBfX2luaXQgZmluZF9zeW1ib2woc3RydWN0IGVsZmluZm8gKmxpYiwgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAobGliLT5keW5zeW1zaXplIC8gc2l6ZW9mKEVsZjMyX1N5bSkpOyBpKyspIHsKKwkJY2hhciBuYW1lW01BWF9TWU1OQU1FXSwgKmM7CisKKwkJaWYgKGxpYi0+ZHluc3ltW2ldLnN0X25hbWUgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlzdHJsY3B5KG5hbWUsIGxpYi0+ZHluc3RyICsgbGliLT5keW5zeW1baV0uc3RfbmFtZSwKKwkJCU1BWF9TWU1OQU1FKTsKKwkJYyA9IHN0cmNocihuYW1lLCAnQCcpOworCQlpZiAoYykKKwkJCSpjID0gMDsKKwkJaWYgKHN0cmNtcChzeW1uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuICZsaWItPmR5bnN5bVtpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB2ZHNvX251bGxwYXRjaF9vbmUoc3RydWN0IGVsZmluZm8gKmxpYiwgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwlFbGYzMl9TeW0gKnN5bTsKKworCXN5bSA9IGZpbmRfc3ltYm9sKGxpYiwgc3ltbmFtZSk7CisJaWYgKCFzeW0pCisJCXJldHVybjsKKworCXN5bS0+c3RfbmFtZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwYXRjaF92ZHNvKHZvaWQgKmVoZHIpCit7CisJc3RydWN0IGVsZmluZm8gZWluZm87CisKKwllaW5mbyA9IChzdHJ1Y3QgZWxmaW5mbykgeworCQkuaGRyID0gZWhkciwKKwl9OworCisJZWluZm8uZHluc3ltID0gZmluZF9zZWN0aW9uKGVpbmZvLmhkciwgIi5keW5zeW0iLCAmZWluZm8uZHluc3ltc2l6ZSk7CisJZWluZm8uZHluc3RyID0gZmluZF9zZWN0aW9uKGVpbmZvLmhkciwgIi5keW5zdHIiLCBOVUxMKTsKKworCS8qIElmIHRoZSB2aXJ0dWFsIGNvdW50ZXIgaXMgYWJzZW50IG9yIG5vbi1mdW5jdGlvbmFsIHdlIGRvbid0CisJICogd2FudCBwcm9ncmFtcyB0byBpbmN1ciB0aGUgc2xpZ2h0IGFkZGl0aW9uYWwgb3ZlcmhlYWQgb2YKKwkgKiBkaXNwYXRjaGluZyB0aHJvdWdoIHRoZSBWRFNPIG9ubHkgdG8gZmFsbCBiYWNrIHRvIHN5c2NhbGxzLgorCSAqLworCWlmICghY250dmN0X29rKSB7CisJCXZkc29fbnVsbHBhdGNoX29uZSgmZWluZm8sICJfX3Zkc29fZ2V0dGltZW9mZGF5Iik7CisJCXZkc29fbnVsbHBhdGNoX29uZSgmZWluZm8sICJfX3Zkc29fY2xvY2tfZ2V0dGltZSIpOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgdmRzb19pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IHRleHRfcGFnZXM7CisJaW50IGk7CisKKwlpZiAobWVtY21wKCZ2ZHNvX3N0YXJ0LCAiXDE3N0VMRiIsIDQpKSB7CisJCXByX2VycigiVkRTTyBpcyBub3QgYSB2YWxpZCBFTEYgb2JqZWN0IVxuIik7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CisKKwl0ZXh0X3BhZ2VzID0gKCZ2ZHNvX2VuZCAtICZ2ZHNvX3N0YXJ0KSA+PiBQQUdFX1NISUZUOworCXByX2RlYnVnKCJ2ZHNvOiAlaSB0ZXh0IHBhZ2VzIGF0IGJhc2UgJXBcbiIsIHRleHRfcGFnZXMsICZ2ZHNvX3N0YXJ0KTsKKworCS8qIEFsbG9jYXRlIHRoZSBWRFNPIHRleHQgcGFnZWxpc3QgKi8KKwl2ZHNvX3RleHRfcGFnZWxpc3QgPSBrY2FsbG9jKHRleHRfcGFnZXMsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOworCWlmICh2ZHNvX3RleHRfcGFnZWxpc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBHcmFiIHRoZSBWRFNPIGRhdGEgcGFnZS4gKi8KKwl2ZHNvX2RhdGFfcGFnZSA9IHZpcnRfdG9fcGFnZSh2ZHNvX2RhdGEpOworCisJLyogR3JhYiB0aGUgVkRTTyB0ZXh0IHBhZ2VzLiAqLworCWZvciAoaSA9IDA7IGkgPCB0ZXh0X3BhZ2VzOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJcGFnZSA9IHZpcnRfdG9fcGFnZSgmdmRzb19zdGFydCArIGkgKiBQQUdFX1NJWkUpOworCQl2ZHNvX3RleHRfcGFnZWxpc3RbaV0gPSBwYWdlOworCX0KKworCXZkc29fdGV4dF9tYXBwaW5nLnBhZ2VzID0gdmRzb190ZXh0X3BhZ2VsaXN0OworCisJdmRzb190b3RhbF9wYWdlcyA9IDE7IC8qIGZvciB0aGUgZGF0YS92dmFyIHBhZ2UgKi8KKwl2ZHNvX3RvdGFsX3BhZ2VzICs9IHRleHRfcGFnZXM7CisKKwljbnR2Y3Rfb2sgPSBjbnR2Y3RfZnVuY3Rpb25hbCgpOworCisJcGF0Y2hfdmRzbygmdmRzb19zdGFydCk7CisKKwlyZXR1cm4gMDsKK30KK2FyY2hfaW5pdGNhbGwodmRzb19pbml0KTsKKworc3RhdGljIGludCBpbnN0YWxsX3Z2YXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKworCXZtYSA9IF9pbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwgYWRkciwgUEFHRV9TSVpFLAorCQkJCSAgICAgICBWTV9SRUFEIHwgVk1fTUFZUkVBRCwKKwkJCQkgICAgICAgJnZkc29fZGF0YV9tYXBwaW5nKTsKKworCXJldHVybiBJU19FUlIodm1hKSA/IFBUUl9FUlIodm1hKSA6IDA7Cit9CisKKy8qIGFzc3VtZXMgbW1hcF9zZW0gaXMgd3JpdGUtbG9ja2VkICovCit2b2lkIGFybV9pbnN0YWxsX3Zkc28oc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwl1bnNpZ25lZCBsb25nIGxlbjsKKworCW1tLT5jb250ZXh0LnZkc28gPSAwOworCisJaWYgKHZkc29fdGV4dF9wYWdlbGlzdCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlpZiAoaW5zdGFsbF92dmFyKG1tLCBhZGRyKSkKKwkJcmV0dXJuOworCisJLyogQWNjb3VudCBmb3IgdnZhciBwYWdlLiAqLworCWFkZHIgKz0gUEFHRV9TSVpFOworCWxlbiA9ICh2ZHNvX3RvdGFsX3BhZ2VzIC0gMSkgPDwgUEFHRV9TSElGVDsKKworCXZtYSA9IF9pbnN0YWxsX3NwZWNpYWxfbWFwcGluZyhtbSwgYWRkciwgbGVuLAorCQlWTV9SRUFEIHwgVk1fRVhFQyB8IFZNX01BWVJFQUQgfCBWTV9NQVlXUklURSB8IFZNX01BWUVYRUMsCisJCSZ2ZHNvX3RleHRfbWFwcGluZyk7CisKKwlpZiAoIUlTX0VSUih2bWEpKQorCQltbS0+Y29udGV4dC52ZHNvID0gYWRkcjsKK30KKworc3RhdGljIHZvaWQgdmRzb193cml0ZV9iZWdpbihzdHJ1Y3QgdmRzb19kYXRhICp2ZGF0YSkKK3sKKwkrK3Zkc29fZGF0YS0+c2VxX2NvdW50OworCXNtcF93bWIoKTsgLyogUGFpcnMgd2l0aCBzbXBfcm1iIGluIHZkc29fcmVhZF9yZXRyeSAqLworfQorCitzdGF0aWMgdm9pZCB2ZHNvX3dyaXRlX2VuZChzdHJ1Y3QgdmRzb19kYXRhICp2ZGF0YSkKK3sKKwlzbXBfd21iKCk7IC8qIFBhaXJzIHdpdGggc21wX3JtYiBpbiB2ZHNvX3JlYWRfYmVnaW4gKi8KKwkrK3Zkc29fZGF0YS0+c2VxX2NvdW50OworfQorCitzdGF0aWMgYm9vbCB0a19pc19jbnR2Y3QoY29uc3Qgc3RydWN0IHRpbWVrZWVwZXIgKnRrKQoreworCWlmICghSVNfRU5BQkxFRChDT05GSUdfQVJNX0FSQ0hfVElNRVIpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc3RyY21wKHRrLT50a3JfbW9uby5jbG9jay0+bmFtZSwgImFyY2hfc3lzX2NvdW50ZXIiKSAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiB1cGRhdGVfdnN5c2NhbGwgLSB1cGRhdGUgdGhlIHZkc28gZGF0YSBwYWdlCisgKgorICogSW5jcmVtZW50IHRoZSBzZXF1ZW5jZSBjb3VudGVyLCBtYWtpbmcgaXQgb2RkLCBpbmRpY2F0aW5nIHRvCisgKiB1c2Vyc3BhY2UgdGhhdCBhbiB1cGRhdGUgaXMgaW4gcHJvZ3Jlc3MuICBVcGRhdGUgdGhlIGZpZWxkcyB1c2VkCisgKiBmb3IgY29hcnNlIGNsb2NrcyBhbmQsIGlmIHRoZSBhcmNoaXRlY3RlZCBzeXN0ZW0gdGltZXIgaXMgaW4gdXNlLAorICogdGhlIGZpZWxkcyB1c2VkIGZvciBoaWdoIHByZWNpc2lvbiBjbG9ja3MuICBJbmNyZW1lbnQgdGhlIHNlcXVlbmNlCisgKiBjb3VudGVyIGFnYWluLCBtYWtpbmcgaXQgZXZlbiwgaW5kaWNhdGluZyB0byB1c2Vyc3BhY2UgdGhhdCB0aGUKKyAqIHVwZGF0ZSBpcyBmaW5pc2hlZC4KKyAqCisgKiBVc2Vyc3BhY2UgaXMgZXhwZWN0ZWQgdG8gc2FtcGxlIHNlcV9jb3VudCBiZWZvcmUgcmVhZGluZyBhbnkgb3RoZXIKKyAqIGZpZWxkcyBmcm9tIHRoZSBkYXRhIHBhZ2UuICBJZiBzZXFfY291bnQgaXMgb2RkLCB1c2Vyc3BhY2UgaXMKKyAqIGV4cGVjdGVkIHRvIHdhaXQgdW50aWwgaXQgYmVjb21lcyBldmVuLiAgQWZ0ZXIgY29weWluZyBkYXRhIGZyb20KKyAqIHRoZSBwYWdlLCB1c2Vyc3BhY2UgbXVzdCBzYW1wbGUgc2VxX2NvdW50IGFnYWluOyBpZiBpdCBoYXMgY2hhbmdlZAorICogZnJvbSBpdHMgcHJldmlvdXMgdmFsdWUsIHVzZXJzcGFjZSBtdXN0IHJldHJ5IHRoZSB3aG9sZSBzZXF1ZW5jZS4KKyAqCisgKiBDYWxscyB0byB1cGRhdGVfdnN5c2NhbGwgYXJlIHNlcmlhbGl6ZWQgYnkgdGhlIHRpbWVrZWVwaW5nIGNvcmUuCisgKi8KK3ZvaWQgdXBkYXRlX3ZzeXNjYWxsKHN0cnVjdCB0aW1la2VlcGVyICp0aykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgeHRpbWVfY29hcnNlOworCXN0cnVjdCB0aW1lc3BlYzY0ICp3dG0gPSAmdGstPndhbGxfdG9fbW9ub3RvbmljOworCisJaWYgKCFjbnR2Y3Rfb2spIHsKKwkJLyogVGhlIGVudHJ5IHBvaW50cyBoYXZlIGJlZW4gemVyb2VkLCBzbyB0aGVyZSBpcyBubworCQkgKiBwb2ludCBpbiB1cGRhdGluZyB0aGUgZGF0YSBwYWdlLgorCQkgKi8KKwkJcmV0dXJuOworCX0KKworCXZkc29fd3JpdGVfYmVnaW4odmRzb19kYXRhKTsKKworCXh0aW1lX2NvYXJzZSA9IF9fY3VycmVudF9rZXJuZWxfdGltZSgpOworCXZkc29fZGF0YS0+dGtfaXNfY250dmN0CQkJPSB0a19pc19jbnR2Y3QodGspOworCXZkc29fZGF0YS0+eHRpbWVfY29hcnNlX3NlYwkJPSB4dGltZV9jb2Fyc2UudHZfc2VjOworCXZkc29fZGF0YS0+eHRpbWVfY29hcnNlX25zZWMJCT0geHRpbWVfY29hcnNlLnR2X25zZWM7CisJdmRzb19kYXRhLT53dG1fY2xvY2tfc2VjCQk9IHd0bS0+dHZfc2VjOworCXZkc29fZGF0YS0+d3RtX2Nsb2NrX25zZWMJCT0gd3RtLT50dl9uc2VjOworCisJaWYgKHZkc29fZGF0YS0+dGtfaXNfY250dmN0KSB7CisJCXZkc29fZGF0YS0+Y3NfY3ljbGVfbGFzdAk9IHRrLT50a3JfbW9uby5jeWNsZV9sYXN0OworCQl2ZHNvX2RhdGEtPnh0aW1lX2Nsb2NrX3NlYwk9IHRrLT54dGltZV9zZWM7CisJCXZkc29fZGF0YS0+eHRpbWVfY2xvY2tfc25zZWMJPSB0ay0+dGtyX21vbm8ueHRpbWVfbnNlYzsKKwkJdmRzb19kYXRhLT5jc19tdWx0CQk9IHRrLT50a3JfbW9uby5tdWx0OworCQl2ZHNvX2RhdGEtPmNzX3NoaWZ0CQk9IHRrLT50a3JfbW9uby5zaGlmdDsKKwkJdmRzb19kYXRhLT5jc19tYXNrCQk9IHRrLT50a3JfbW9uby5tYXNrOworCX0KKworCXZkc29fd3JpdGVfZW5kKHZkc29fZGF0YSk7CisKKwlmbHVzaF9kY2FjaGVfcGFnZSh2aXJ0X3RvX3BhZ2UodmRzb19kYXRhKSk7Cit9CisKK3ZvaWQgdXBkYXRlX3ZzeXNjYWxsX3R6KHZvaWQpCit7CisJdmRzb19kYXRhLT50el9taW51dGVzd2VzdAk9IHN5c190ei50el9taW51dGVzd2VzdDsKKwl2ZHNvX2RhdGEtPnR6X2RzdHRpbWUJCT0gc3lzX3R6LnR6X2RzdHRpbWU7CisJZmx1c2hfZGNhY2hlX3BhZ2UodmlydF90b19wYWdlKHZkc29fZGF0YSkpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCBiMzFhYTczLi43YTMwMWJlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL2FybS9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNzQsNyArNzQsNyBAQAogCQlBUk1fRVhJVF9ESVNDQVJEKEVYSVRfREFUQSkKIAkJRVhJVF9DQUxMCiAjaWZuZGVmIENPTkZJR19NTVUKLQkJKiguZml4dXApCisJCSooLnRleHQuZml4dXApCiAJCSooX19leF90YWJsZSkKICNlbmRpZgogI2lmbmRlZiBDT05GSUdfU01QX09OX1VQCkBAIC0xMDAsNiArMTAwLDcgQEAKIAogCS50ZXh0IDogewkJCS8qIFJlYWwgdGV4dCBzZWdtZW50CQkqLwogCQlfc3RleHQgPSAuOwkJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEJKi8KKwkJCUlETUFQX1RFWFQKIAkJCV9fZXhjZXB0aW9uX3RleHRfc3RhcnQgPSAuOwogCQkJKiguZXhjZXB0aW9uLnRleHQpCiAJCQlfX2V4Y2VwdGlvbl90ZXh0X2VuZCA9IC47CkBAIC0xMDgsMTAgKzEwOSw2IEBACiAJCQlTQ0hFRF9URVhUCiAJCQlMT0NLX1RFWFQKIAkJCUtQUk9CRVNfVEVYVAotCQkJSURNQVBfVEVYVAotI2lmZGVmIENPTkZJR19NTVUKLQkJCSooLmZpeHVwKQotI2VuZGlmCiAJCQkqKC5nbnUud2FybmluZykKIAkJCSooLmdsdWVfNykKIAkJCSooLmdsdWVfN3QpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vS2NvbmZpZyBiL2FyY2gvYXJtL2t2bS9LY29uZmlnCmluZGV4IDMzOGFjZTcuLmYxZjc5ZDEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL2t2bS9LY29uZmlnCkBAIC0xOCw2ICsxOCw3IEBACiAKIGNvbmZpZyBLVk0KIAlib29sICJLZXJuZWwtYmFzZWQgVmlydHVhbCBNYWNoaW5lIChLVk0pIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNTVUgJiYgT0YKIAlzZWxlY3QgUFJFRU1QVF9OT1RJRklFUlMKIAlzZWxlY3QgQU5PTl9JTk9ERVMKIAlzZWxlY3QgSEFWRV9LVk1fQ1BVX1JFTEFYX0lOVEVSQ0VQVApAQCAtMjYsMTAgKzI3LDEyIEBACiAJc2VsZWN0IEtWTV9BUk1fSE9TVAogCXNlbGVjdCBLVk1fR0VORVJJQ19ESVJUWUxPR19SRUFEX1BST1RFQ1QKIAlzZWxlY3QgU1JDVQotCWRlcGVuZHMgb24gQVJNX1ZJUlRfRVhUICYmIEFSTV9MUEFFCisJc2VsZWN0IE1NVV9OT1RJRklFUgorCXNlbGVjdCBIQVZFX0tWTV9FVkVOVEZECisJc2VsZWN0IEhBVkVfS1ZNX0lSUUZECisJZGVwZW5kcyBvbiBBUk1fVklSVF9FWFQgJiYgQVJNX0xQQUUgJiYgQVJNX0FSQ0hfVElNRVIKIAktLS1oZWxwLS0tCi0JICBTdXBwb3J0IGhvc3RpbmcgdmlydHVhbGl6ZWQgZ3Vlc3QgbWFjaGluZXMuIFlvdSB3aWxsIGFsc28KLQkgIG5lZWQgdG8gc2VsZWN0IG9uZSBvciBtb3JlIG9mIHRoZSBwcm9jZXNzb3IgbW9kdWxlcyBiZWxvdy4KKwkgIFN1cHBvcnQgaG9zdGluZyB2aXJ0dWFsaXplZCBndWVzdCBtYWNoaW5lcy4KIAogCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMgdGhyb3VnaAogCSAgYSBjaGFyYWN0ZXIgZGV2aWNlIG5vZGUgbmFtZWQgL2Rldi9rdm0uCkBAIC0zNywxMCArNDAsNyBAQAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIEtWTV9BUk1fSE9TVAotCWJvb2wgIktWTSBob3N0IHN1cHBvcnQgZm9yIEFSTSBjcHVzLiIKLQlkZXBlbmRzIG9uIEtWTQotCWRlcGVuZHMgb24gTU1VCi0Jc2VsZWN0CU1NVV9OT1RJRklFUgorCWJvb2wKIAktLS1oZWxwLS0tCiAJICBQcm92aWRlcyBob3N0IHN1cHBvcnQgZm9yIEFSTSBwcm9jZXNzb3JzLgogCkBAIC01NSwyMCArNTUsNCBAQAogCSAgbGFyZ2UsIHNvIG9ubHkgY2hvb3NlIGEgcmVhc29uYWJsZSBudW1iZXIgdGhhdCB5b3UgZXhwZWN0IHRvCiAJICBhY3R1YWxseSB1c2UuCiAKLWNvbmZpZyBLVk1fQVJNX1ZHSUMKLQlib29sICJLVk0gc3VwcG9ydCBmb3IgVmlydHVhbCBHSUMiCi0JZGVwZW5kcyBvbiBLVk1fQVJNX0hPU1QgJiYgT0YKLQlzZWxlY3QgSEFWRV9LVk1fSVJRQ0hJUAotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIEFkZHMgc3VwcG9ydCBmb3IgYSBoYXJkd2FyZSBhc3Npc3RlZCwgaW4ta2VybmVsIEdJQyBlbXVsYXRpb24uCi0KLWNvbmZpZyBLVk1fQVJNX1RJTUVSCi0JYm9vbCAiS1ZNIHN1cHBvcnQgZm9yIEFyY2hpdGVjdGVkIFRpbWVycyIKLQlkZXBlbmRzIG9uIEtWTV9BUk1fVkdJQyAmJiBBUk1fQVJDSF9USU1FUgotCXNlbGVjdCBIQVZFX0tWTV9JUlFDSElQCi0JZGVmYXVsdCB5Ci0JLS0taGVscC0tLQotCSAgQWRkcyBzdXBwb3J0IGZvciB0aGUgQXJjaGl0ZWN0ZWQgVGltZXJzIGluIHZpcnR1YWwgbWFjaGluZXMKLQogZW5kaWYgIyBWSVJUVUFMSVpBVElPTgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL01ha2VmaWxlIGIvYXJjaC9hcm0va3ZtL01ha2VmaWxlCmluZGV4IDQ0M2I4YmUuLjEzOWU0NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9rdm0vTWFrZWZpbGUKQEAgLTcsNyArNyw3IEBACiAJcGx1c192aXJ0X2RlZiA6PSAtRFJFUVVJUkVTX1ZJUlQ9MQogZW5kaWYKIAotY2NmbGFncy15ICs9IC1JdmlydC9rdm0gLUlhcmNoL2FybS9rdm0KK2NjZmxhZ3MteSArPSAtSWFyY2gvYXJtL2t2bQogQ0ZMQUdTX2FybS5vIDo9IC1JLiAkKHBsdXNfdmlydF9kZWYpCiBDRkxBR1NfbW11Lm8gOj0gLUkuCiAKQEAgLTE1LDEyICsxNSwxMiBAQAogQUZMQUdTX2ludGVycnVwdHMubyA6PSAtV2EsLW1hcmNoPWFybXY3LWEkKHBsdXNfdmlydCkKIAogS1ZNIDo9IC4uLy4uLy4uL3ZpcnQva3ZtCi1rdm0tYXJtLXkgPSAkKEtWTSkva3ZtX21haW4ubyAkKEtWTSkvY29hbGVzY2VkX21taW8ubwora3ZtLWFybS15ID0gJChLVk0pL2t2bV9tYWluLm8gJChLVk0pL2NvYWxlc2NlZF9tbWlvLm8gJChLVk0pL2V2ZW50ZmQubwogCiBvYmoteSArPSBrdm0tYXJtLm8gaW5pdC5vIGludGVycnVwdHMubwogb2JqLXkgKz0gYXJtLm8gaGFuZGxlX2V4aXQubyBndWVzdC5vIG1tdS5vIGVtdWxhdGUubyByZXNldC5vCiBvYmoteSArPSBjb3Byb2MubyBjb3Byb2NfYTE1Lm8gY29wcm9jX2E3Lm8gbW1pby5vIHBzY2kubyBwZXJmLm8KLW9iai0kKENPTkZJR19LVk1fQVJNX1ZHSUMpICs9ICQoS1ZNKS9hcm0vdmdpYy5vCi1vYmotJChDT05GSUdfS1ZNX0FSTV9WR0lDKSArPSAkKEtWTSkvYXJtL3ZnaWMtdjIubwotb2JqLSQoQ09ORklHX0tWTV9BUk1fVkdJQykgKz0gJChLVk0pL2FybS92Z2ljLXYyLWVtdWwubwotb2JqLSQoQ09ORklHX0tWTV9BUk1fVElNRVIpICs9ICQoS1ZNKS9hcm0vYXJjaF90aW1lci5vCitvYmoteSArPSAkKEtWTSkvYXJtL3ZnaWMubworb2JqLXkgKz0gJChLVk0pL2FybS92Z2ljLXYyLm8KK29iai15ICs9ICQoS1ZNKS9hcm0vdmdpYy12Mi1lbXVsLm8KK29iai15ICs9ICQoS1ZNKS9hcm0vYXJjaF90aW1lci5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vYXJtLmMgYi9hcmNoL2FybS9rdm0vYXJtLmMKaW5kZXggNTU2MGY3NC4uNmY1MzY0NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL2FybS5jCisrKyBiL2FyY2gvYXJtL2t2bS9hcm0uYwpAQCAtNjEsOCArNjEsNiBAQAogc3RhdGljIHU4IGt2bV9uZXh0X3ZtaWQ7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGt2bV92bWlkX2xvY2spOwogCi1zdGF0aWMgYm9vbCB2Z2ljX3ByZXNlbnQ7Ci0KIHN0YXRpYyB2b2lkIGt2bV9hcm1fc2V0X3J1bm5pbmdfdmNwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJQlVHX09OKHByZWVtcHRpYmxlKCkpOwpAQCAtMTczLDggKzE3MSw4IEBACiAJaW50IHI7CiAJc3dpdGNoIChleHQpIHsKIAljYXNlIEtWTV9DQVBfSVJRQ0hJUDoKLQkJciA9IHZnaWNfcHJlc2VudDsKLQkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX0lSUUZEOgorCWNhc2UgS1ZNX0NBUF9JT0VWRU5URkQ6CiAJY2FzZSBLVk1fQ0FQX0RFVklDRV9DVFJMOgogCWNhc2UgS1ZNX0NBUF9VU0VSX01FTU9SWToKIAljYXNlIEtWTV9DQVBfU1lOQ19NTVU6CkBAIC0xODMsNiArMTgxLDcgQEAKIAljYXNlIEtWTV9DQVBfQVJNX1BTQ0k6CiAJY2FzZSBLVk1fQ0FQX0FSTV9QU0NJXzBfMjoKIAljYXNlIEtWTV9DQVBfUkVBRE9OTFlfTUVNOgorCWNhc2UgS1ZNX0NBUF9NUF9TVEFURToKIAkJciA9IDE7CiAJCWJyZWFrOwogCWNhc2UgS1ZNX0NBUF9DT0FMRVNDRURfTU1JTzoKQEAgLTI2OCw3ICsyNjcsNyBAQAogCiBpbnQga3ZtX2NwdV9oYXNfcGVuZGluZ190aW1lcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGt2bV90aW1lcl9zaG91bGRfZmlyZSh2Y3B1KTsKIH0KIAogaW50IGt2bV9hcmNoX3ZjcHVfaW5pdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC0zMTMsMTMgKzMxMiwyOSBAQAogaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfZ2V0X21wc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCSAgICBzdHJ1Y3Qga3ZtX21wX3N0YXRlICptcF9zdGF0ZSkKIHsKLQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmNwdS0+YXJjaC5wYXVzZSkKKwkJbXBfc3RhdGUtPm1wX3N0YXRlID0gS1ZNX01QX1NUQVRFX1NUT1BQRUQ7CisJZWxzZQorCQltcF9zdGF0ZS0+bXBfc3RhdGUgPSBLVk1fTVBfU1RBVEVfUlVOTkFCTEU7CisKKwlyZXR1cm4gMDsKIH0KIAogaW50IGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X21wc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCSAgICBzdHJ1Y3Qga3ZtX21wX3N0YXRlICptcF9zdGF0ZSkKIHsKLQlyZXR1cm4gLUVJTlZBTDsKKwlzd2l0Y2ggKG1wX3N0YXRlLT5tcF9zdGF0ZSkgeworCWNhc2UgS1ZNX01QX1NUQVRFX1JVTk5BQkxFOgorCQl2Y3B1LT5hcmNoLnBhdXNlID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgS1ZNX01QX1NUQVRFX1NUT1BQRUQ6CisJCXZjcHUtPmFyY2gucGF1c2UgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC00NTIsNiArNDY3LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK2Jvb2wga3ZtX2FyY2hfaW50Y19pbml0aWFsaXplZChzdHJ1Y3Qga3ZtICprdm0pCit7CisJcmV0dXJuIHZnaWNfaW5pdGlhbGl6ZWQoa3ZtKTsKK30KKwogc3RhdGljIHZvaWQgdmNwdV9wYXVzZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJd2FpdF9xdWV1ZV9oZWFkX3QgKndxID0ga3ZtX2FyY2hfdmNwdV93cSh2Y3B1KTsKQEAgLTgzMSw4ICs4NTEsNiBAQAogCiAJc3dpdGNoIChkZXZfaWQpIHsKIAljYXNlIEtWTV9BUk1fREVWSUNFX1ZHSUNfVjI6Ci0JCWlmICghdmdpY19wcmVzZW50KQotCQkJcmV0dXJuIC1FTlhJTzsKIAkJcmV0dXJuIGt2bV92Z2ljX2FkZHIoa3ZtLCB0eXBlLCAmZGV2X2FkZHItPmFkZHIsIHRydWUpOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PREVWOwpAQCAtODQ3LDEwICs4NjUsNyBAQAogCiAJc3dpdGNoIChpb2N0bCkgewogCWNhc2UgS1ZNX0NSRUFURV9JUlFDSElQOiB7Ci0JCWlmICh2Z2ljX3ByZXNlbnQpCi0JCQlyZXR1cm4ga3ZtX3ZnaWNfY3JlYXRlKGt2bSwgS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YyKTsKLQkJZWxzZQotCQkJcmV0dXJuIC1FTlhJTzsKKwkJcmV0dXJuIGt2bV92Z2ljX2NyZWF0ZShrdm0sIEtWTV9ERVZfVFlQRV9BUk1fVkdJQ19WMik7CiAJfQogCWNhc2UgS1ZNX0FSTV9TRVRfREVWSUNFX0FERFI6IHsKIAkJc3RydWN0IGt2bV9hcm1fZGV2aWNlX2FkZHIgZGV2X2FkZHI7CkBAIC0xMDM1LDEwICsxMDUwLDYgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlX2NvbnRleHQ7CiAKLSNpZmRlZiBDT05GSUdfS1ZNX0FSTV9WR0lDCi0JCXZnaWNfcHJlc2VudCA9IHRydWU7Ci0jZW5kaWYKLQogCS8qCiAJICogSW5pdCBIWVAgYXJjaGl0ZWN0ZWQgdGltZXIgc3VwcG9ydAogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va3ZtL2d1ZXN0LmMgYi9hcmNoL2FybS9rdm0vZ3Vlc3QuYwppbmRleCAzODRiYWI2Li5kNTAzZmJiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rdm0vZ3Vlc3QuYworKysgYi9hcmNoL2FybS9rdm0vZ3Vlc3QuYwpAQCAtMTA5LDIyICsxMDksNiBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi0jaWZuZGVmIENPTkZJR19LVk1fQVJNX1RJTUVSCi0KLSNkZWZpbmUgTlVNX1RJTUVSX1JFR1MgMAotCi1zdGF0aWMgaW50IGNvcHlfdGltZXJfaW5kaWNlcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBfX3VzZXIgKnVpbmRpY2VzKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBpc190aW1lcl9yZWcodTY0IGluZGV4KQotewotCXJldHVybiBmYWxzZTsKLX0KLQotI2Vsc2UKLQogI2RlZmluZSBOVU1fVElNRVJfUkVHUyAzCiAKIHN0YXRpYyBib29sIGlzX3RpbWVyX3JlZyh1NjQgaW5kZXgpCkBAIC0xNTIsOCArMTM2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCi0KIHN0YXRpYyBpbnQgc2V0X3RpbWVyX3JlZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGNvbnN0IHN0cnVjdCBrdm1fb25lX3JlZyAqcmVnKQogewogCXZvaWQgX191c2VyICp1YWRkciA9ICh2b2lkIF9fdXNlciAqKShsb25nKXJlZy0+YWRkcjsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2t2bS9pbnRlcnJ1cHRzX2hlYWQuUyBiL2FyY2gvYXJtL2t2bS9pbnRlcnJ1cHRzX2hlYWQuUwppbmRleCAxNGQ0ODgzLi4zNWU0YTNhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rdm0vaW50ZXJydXB0c19oZWFkLlMKKysrIGIvYXJjaC9hcm0va3ZtL2ludGVycnVwdHNfaGVhZC5TCkBAIC00MDIsNyArNDAyLDYgQEAKICAqIEFzc3VtZXMgdmNwdSBwb2ludGVyIGluIHZjcHUgcmVnCiAgKi8KIC5tYWNybyBzYXZlX3ZnaWNfc3RhdGUKLSNpZmRlZiBDT05GSUdfS1ZNX0FSTV9WR0lDCiAJLyogR2V0IFZHSUMgVkNUUkwgYmFzZSBpbnRvIHIyICovCiAJbGRyCXIyLCBbdmNwdSwgI1ZDUFVfS1ZNXQogCWxkcglyMiwgW3IyLCAjS1ZNX1ZHSUNfVkNUUkxdCkBAIC00NjAsNyArNDU5LDYgQEAKIAlzdWJzCXI0LCByNCwgIzEKIAlibmUJMWIKIDI6Ci0jZW5kaWYKIC5lbmRtCiAKIC8qCkBAIC00NjksNyArNDY3LDYgQEAKICAqIEFzc3VtZXMgdmNwdSBwb2ludGVyIGluIHZjcHUgcmVnCiAgKi8KIC5tYWNybyByZXN0b3JlX3ZnaWNfc3RhdGUKLSNpZmRlZiBDT05GSUdfS1ZNX0FSTV9WR0lDCiAJLyogR2V0IFZHSUMgVkNUUkwgYmFzZSBpbnRvIHIyICovCiAJbGRyCXIyLCBbdmNwdSwgI1ZDUFVfS1ZNXQogCWxkcglyMiwgW3IyLCAjS1ZNX1ZHSUNfVkNUUkxdCkBAIC01MDEsNyArNDk4LDYgQEAKIAlzdWJzCXI0LCByNCwgIzEKIAlibmUJMWIKIDI6Ci0jZW5kaWYKIC5lbmRtCiAKICNkZWZpbmUgQ05USENUTF9QTDFQQ1RFTgkoMSA8PCAwKQpAQCAtNTE1LDcgKzUxMSw2IEBACiAgKiBDbG9iYmVycyByMi1yNQogICovCiAubWFjcm8gc2F2ZV90aW1lcl9zdGF0ZQotI2lmZGVmIENPTkZJR19LVk1fQVJNX1RJTUVSCiAJbGRyCXI0LCBbdmNwdSwgI1ZDUFVfS1ZNXQogCWxkcglyMiwgW3I0LCAjS1ZNX1RJTUVSX0VOQUJMRURdCiAJY21wCXIyLCAjMApAQCAtNTM3LDcgKzUzMiw2IEBACiAJbWNycglwMTUsIDQsIHIyLCByMiwgYzE0CUAgQ05UVk9GRgogCiAxOgotI2VuZGlmCiAJQCBBbGxvdyBwaHlzaWNhbCB0aW1lci9jb3VudGVyIGFjY2VzcyBmb3IgdGhlIGhvc3QKIAltcmMJcDE1LCA0LCByMiwgYzE0LCBjMSwgMAlAIENOVEhDVEwKIAlvcnIJcjIsIHIyLCAjKENOVEhDVExfUEwxUENFTiB8IENOVEhDVExfUEwxUENURU4pCkBAIC01NTksNyArNTUzLDYgQEAKIAliaWMJcjIsIHIyLCAjQ05USENUTF9QTDFQQ0VOCiAJbWNyCXAxNSwgNCwgcjIsIGMxNCwgYzEsIDAJQCBDTlRIQ1RMCiAKLSNpZmRlZiBDT05GSUdfS1ZNX0FSTV9USU1FUgogCWxkcglyNCwgW3ZjcHUsICNWQ1BVX0tWTV0KIAlsZHIJcjIsIFtyNCwgI0tWTV9USU1FUl9FTkFCTEVEXQogCWNtcAlyMiwgIzAKQEAgLTU3OSw3ICs1NzIsNiBAQAogCWFuZAlyMiwgcjIsICMzCiAJbWNyCXAxNSwgMCwgcjIsIGMxNCwgYzMsIDEJQCBDTlRWX0NUTAogMToKLSNlbmRpZgogLmVuZG0KIAogLmVxdSB2bWVudHJ5LAkwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vbW1pby5jIGIvYXJjaC9hcm0va3ZtL21taW8uYwppbmRleCA1ZDNiZmMwLi45NzRiMWM2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rdm0vbW1pby5jCisrKyBiL2FyY2gvYXJtL2t2bS9tbWlvLmMKQEAgLTEyMSwxMiArMTIxLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZGVjb2RlX2hzcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHBoeXNfYWRkcl90IGZhdWx0X2lwYSwKLQkJICAgICAgc3RydWN0IGt2bV9leGl0X21taW8gKm1taW8pCitzdGF0aWMgaW50IGRlY29kZV9oc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBib29sICppc193cml0ZSwgaW50ICpsZW4pCiB7CiAJdW5zaWduZWQgbG9uZyBydDsKLQlpbnQgbGVuOwotCWJvb2wgaXNfd3JpdGUsIHNpZ25fZXh0ZW5kOworCWludCBhY2Nlc3Nfc2l6ZTsKKwlib29sIHNpZ25fZXh0ZW5kOwogCiAJaWYgKGt2bV92Y3B1X2RhYnRfaXNleHRhYnQodmNwdSkpIHsKIAkJLyogY2FjaGUgb3BlcmF0aW9uIG9uIEkvTyBhZGRyLCB0ZWxsIGd1ZXN0IHVuc3VwcG9ydGVkICovCkBAIC0xNDAsMTcgKzEzOSwxNSBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlsZW4gPSBrdm1fdmNwdV9kYWJ0X2dldF9hcyh2Y3B1KTsKLQlpZiAodW5saWtlbHkobGVuIDwgMCkpCi0JCXJldHVybiBsZW47CisJYWNjZXNzX3NpemUgPSBrdm1fdmNwdV9kYWJ0X2dldF9hcyh2Y3B1KTsKKwlpZiAodW5saWtlbHkoYWNjZXNzX3NpemUgPCAwKSkKKwkJcmV0dXJuIGFjY2Vzc19zaXplOwogCi0JaXNfd3JpdGUgPSBrdm1fdmNwdV9kYWJ0X2lzd3JpdGUodmNwdSk7CisJKmlzX3dyaXRlID0ga3ZtX3ZjcHVfZGFidF9pc3dyaXRlKHZjcHUpOwogCXNpZ25fZXh0ZW5kID0ga3ZtX3ZjcHVfZGFidF9pc3NleHQodmNwdSk7CiAJcnQgPSBrdm1fdmNwdV9kYWJ0X2dldF9yZCh2Y3B1KTsKIAotCW1taW8tPmlzX3dyaXRlID0gaXNfd3JpdGU7Ci0JbW1pby0+cGh5c19hZGRyID0gZmF1bHRfaXBhOwotCW1taW8tPmxlbiA9IGxlbjsKKwkqbGVuID0gYWNjZXNzX3NpemU7CiAJdmNwdS0+YXJjaC5tbWlvX2RlY29kZS5zaWduX2V4dGVuZCA9IHNpZ25fZXh0ZW5kOwogCXZjcHUtPmFyY2gubW1pb19kZWNvZGUucnQgPSBydDsKIApAQCAtMTY1LDIwICsxNjIsMjAgQEAKIGludCBpb19tZW1fYWJvcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuLAogCQkgcGh5c19hZGRyX3QgZmF1bHRfaXBhKQogewotCXN0cnVjdCBrdm1fZXhpdF9tbWlvIG1taW87CiAJdW5zaWduZWQgbG9uZyBkYXRhOwogCXVuc2lnbmVkIGxvbmcgcnQ7CiAJaW50IHJldDsKKwlib29sIGlzX3dyaXRlOworCWludCBsZW47CisJdTggZGF0YV9idWZbOF07CiAKIAkvKgotCSAqIFByZXBhcmUgTU1JTyBvcGVyYXRpb24uIEZpcnN0IHN0YXNoIGl0IGluIGEgcHJpdmF0ZQotCSAqIHN0cnVjdHVyZSB0aGF0IHdlIGNhbiB1c2UgZm9yIGluLWtlcm5lbCBlbXVsYXRpb24uIElmIHRoZQotCSAqIGtlcm5lbCBjYW4ndCBoYW5kbGUgaXQsIGNvcHkgaXQgaW50byBydW4tPm1taW8gYW5kIGxldCB1c2VyCi0JICogc3BhY2UgZG8gaXRzIG1hZ2ljLgorCSAqIFByZXBhcmUgTU1JTyBvcGVyYXRpb24uIEZpcnN0IGRlY29kZSB0aGUgc3luZHJvbWUgZGF0YSB3ZSBnZXQKKwkgKiBmcm9tIHRoZSBDUFUuIFRoZW4gdHJ5IGlmIHNvbWUgaW4ta2VybmVsIGVtdWxhdGlvbiBmZWVscworCSAqIHJlc3BvbnNpYmxlLCBvdGhlcndpc2UgbGV0IHVzZXIgc3BhY2UgZG8gaXRzIG1hZ2ljLgogCSAqLwotCiAJaWYgKGt2bV92Y3B1X2RhYnRfaXN2YWxpZCh2Y3B1KSkgewotCQlyZXQgPSBkZWNvZGVfaHNyKHZjcHUsIGZhdWx0X2lwYSwgJm1taW8pOworCQlyZXQgPSBkZWNvZGVfaHNyKHZjcHUsICZpc193cml0ZSwgJmxlbik7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0gZWxzZSB7CkBAIC0xODgsMjEgKzE4NSwzNCBAQAogCiAJcnQgPSB2Y3B1LT5hcmNoLm1taW9fZGVjb2RlLnJ0OwogCi0JaWYgKG1taW8uaXNfd3JpdGUpIHsKLQkJZGF0YSA9IHZjcHVfZGF0YV9ndWVzdF90b19ob3N0KHZjcHUsICp2Y3B1X3JlZyh2Y3B1LCBydCksCi0JCQkJCSAgICAgICBtbWlvLmxlbik7CisJaWYgKGlzX3dyaXRlKSB7CisJCWRhdGEgPSB2Y3B1X2RhdGFfZ3Vlc3RfdG9faG9zdCh2Y3B1LCAqdmNwdV9yZWcodmNwdSwgcnQpLCBsZW4pOwogCi0JCXRyYWNlX2t2bV9tbWlvKEtWTV9UUkFDRV9NTUlPX1dSSVRFLCBtbWlvLmxlbiwKLQkJCSAgICAgICBmYXVsdF9pcGEsIGRhdGEpOwotCQltbWlvX3dyaXRlX2J1ZihtbWlvLmRhdGEsIG1taW8ubGVuLCBkYXRhKTsKKwkJdHJhY2Vfa3ZtX21taW8oS1ZNX1RSQUNFX01NSU9fV1JJVEUsIGxlbiwgZmF1bHRfaXBhLCBkYXRhKTsKKwkJbW1pb193cml0ZV9idWYoZGF0YV9idWYsIGxlbiwgZGF0YSk7CisKKwkJcmV0ID0ga3ZtX2lvX2J1c193cml0ZSh2Y3B1LCBLVk1fTU1JT19CVVMsIGZhdWx0X2lwYSwgbGVuLAorCQkJCSAgICAgICBkYXRhX2J1Zik7CiAJfSBlbHNlIHsKLQkJdHJhY2Vfa3ZtX21taW8oS1ZNX1RSQUNFX01NSU9fUkVBRF9VTlNBVElTRklFRCwgbW1pby5sZW4sCisJCXRyYWNlX2t2bV9tbWlvKEtWTV9UUkFDRV9NTUlPX1JFQURfVU5TQVRJU0ZJRUQsIGxlbiwKIAkJCSAgICAgICBmYXVsdF9pcGEsIDApOworCisJCXJldCA9IGt2bV9pb19idXNfcmVhZCh2Y3B1LCBLVk1fTU1JT19CVVMsIGZhdWx0X2lwYSwgbGVuLAorCQkJCSAgICAgIGRhdGFfYnVmKTsKIAl9CiAKLQlpZiAodmdpY19oYW5kbGVfbW1pbyh2Y3B1LCBydW4sICZtbWlvKSkKLQkJcmV0dXJuIDE7CisJLyogTm93IHByZXBhcmUga3ZtX3J1biBmb3IgdGhlIHBvdGVudGlhbCByZXR1cm4gdG8gdXNlcmxhbmQuICovCisJcnVuLT5tbWlvLmlzX3dyaXRlCT0gaXNfd3JpdGU7CisJcnVuLT5tbWlvLnBoeXNfYWRkcgk9IGZhdWx0X2lwYTsKKwlydW4tPm1taW8ubGVuCQk9IGxlbjsKKwltZW1jcHkocnVuLT5tbWlvLmRhdGEsIGRhdGFfYnVmLCBsZW4pOwogCi0Ja3ZtX3ByZXBhcmVfbW1pbyhydW4sICZtbWlvKTsKKwlpZiAoIXJldCkgeworCQkvKiBXZSBoYW5kbGVkIHRoZSBhY2Nlc3Mgc3VjY2Vzc2Z1bGx5IGluIHRoZSBrZXJuZWwuICovCisJCWt2bV9oYW5kbGVfbW1pb19yZXR1cm4odmNwdSwgcnVuKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcnVuLT5leGl0X3JlYXNvbgk9IEtWTV9FWElUX01NSU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vbW11LmMgYi9hcmNoL2FybS9rdm0vbW11LmMKaW5kZXggM2U2ODU5Yi4uMTViMDUwZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va3ZtL21tdS5jCisrKyBiL2FyY2gvYXJtL2t2bS9tbXUuYwpAQCAtMjkwLDcgKzI5MCw3IEBACiAJcGh5c19hZGRyX3QgYWRkciA9IHN0YXJ0LCBlbmQgPSBzdGFydCArIHNpemU7CiAJcGh5c19hZGRyX3QgbmV4dDsKIAotCXBnZCA9IHBnZHAgKyBwZ2RfaW5kZXgoYWRkcik7CisJcGdkID0gcGdkcCArIGt2bV9wZ2RfaW5kZXgoYWRkcik7CiAJZG8gewogCQluZXh0ID0ga3ZtX3BnZF9hZGRyX2VuZChhZGRyLCBlbmQpOwogCQlpZiAoIXBnZF9ub25lKCpwZ2QpKQpAQCAtMzU1LDcgKzM1NSw3IEBACiAJcGh5c19hZGRyX3QgbmV4dDsKIAlwZ2RfdCAqcGdkOwogCi0JcGdkID0ga3ZtLT5hcmNoLnBnZCArIHBnZF9pbmRleChhZGRyKTsKKwlwZ2QgPSBrdm0tPmFyY2gucGdkICsga3ZtX3BnZF9pbmRleChhZGRyKTsKIAlkbyB7CiAJCW5leHQgPSBrdm1fcGdkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CiAJCXN0YWdlMl9mbHVzaF9wdWRzKGt2bSwgcGdkLCBhZGRyLCBuZXh0KTsKQEAgLTYzMiw2ICs2MzIsMjAgQEAKIAkJCQkgICAgIF9fcGh5c190b19wZm4ocGh5c19hZGRyKSwgUEFHRV9IWVBfREVWSUNFKTsKIH0KIAorLyogRnJlZSB0aGUgSFcgcGdkLCBvbmUgcGFnZSBhdCBhIHRpbWUgKi8KK3N0YXRpYyB2b2lkIGt2bV9mcmVlX2h3cGdkKHZvaWQgKmh3cGdkKQoreworCWZyZWVfcGFnZXNfZXhhY3QoaHdwZ2QsIGt2bV9nZXRfaHdwZ2Rfc2l6ZSgpKTsKK30KKworLyogQWxsb2NhdGUgdGhlIEhXIFBHRCwgbWFraW5nIHN1cmUgdGhhdCBlYWNoIHBhZ2UgZ2V0cyBpdHMgb3duIHJlZmNvdW50ICovCitzdGF0aWMgdm9pZCAqa3ZtX2FsbG9jX2h3cGdkKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHNpemUgPSBrdm1fZ2V0X2h3cGdkX3NpemUoKTsKKworCXJldHVybiBhbGxvY19wYWdlc19leGFjdChzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7Cit9CisKIC8qKgogICoga3ZtX2FsbG9jX3N0YWdlMl9wZ2QgLSBhbGxvY2F0ZSBsZXZlbC0xIHRhYmxlIGZvciBzdGFnZS0yIHRyYW5zbGF0aW9uLgogICogQGt2bToJVGhlIEtWTSBzdHJ1Y3QgcG9pbnRlciBmb3IgdGhlIFZNLgpAQCAtNjQ1LDE1ICs2NTksMzEgQEAKICAqLwogaW50IGt2bV9hbGxvY19zdGFnZTJfcGdkKHN0cnVjdCBrdm0gKmt2bSkKIHsKLQlpbnQgcmV0OwogCXBnZF90ICpwZ2Q7CisJdm9pZCAqaHdwZ2Q7CiAKIAlpZiAoa3ZtLT5hcmNoLnBnZCAhPSBOVUxMKSB7CiAJCWt2bV9lcnIoImt2bV9hcmNoIGFscmVhZHkgaW5pdGlhbGl6ZWQ/XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaHdwZ2QgPSBrdm1fYWxsb2NfaHdwZ2QoKTsKKwlpZiAoIWh3cGdkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFdoZW4gdGhlIGtlcm5lbCB1c2VzIG1vcmUgbGV2ZWxzIG9mIHBhZ2UgdGFibGVzIHRoYW4gdGhlCisJICogZ3Vlc3QsIHdlIGFsbG9jYXRlIGEgZmFrZSBQR0QgYW5kIHByZS1wb3B1bGF0ZSBpdCB0byBwb2ludAorCSAqIHRvIHRoZSBuZXh0LWxldmVsIHBhZ2UgdGFibGUsIHdoaWNoIHdpbGwgYmUgdGhlIHJlYWwKKwkgKiBpbml0aWFsIHBhZ2UgdGFibGUgcG9pbnRlZCB0byBieSB0aGUgVlRUQlIuCisJICoKKwkgKiBXaGVuIEtWTV9QUkVBTExPQ19MRVZFTD09Miwgd2UgYWxsb2NhdGUgYSBzaW5nbGUgcGFnZSBmb3IKKwkgKiB0aGUgUE1EIGFuZCB0aGUga2VybmVsIHdpbGwgdXNlIGZvbGRlZCBwdWQuCisJICogV2hlbiBLVk1fUFJFQUxMT0NfTEVWRUw9PTEsIHdlIGFsbG9jYXRlIDIgY29uc2VjdXRpdmUgUFVECisJICogcGFnZXMuCisJICovCiAJaWYgKEtWTV9QUkVBTExPQ19MRVZFTCA+IDApIHsKKwkJaW50IGk7CisKIAkJLyoKIAkJICogQWxsb2NhdGUgZmFrZSBwZ2QgZm9yIHRoZSBwYWdlIHRhYmxlIG1hbmlwdWxhdGlvbiBtYWNyb3MgdG8KIAkJICogd29yay4gIFRoaXMgaXMgbm90IHVzZWQgYnkgdGhlIGhhcmR3YXJlIGFuZCB3ZSBoYXZlIG5vCkBAIC02NjEsMzAgKzY5MSwzMiBAQAogCQkgKi8KIAkJcGdkID0gKHBnZF90ICopa21hbGxvYyhQVFJTX1BFUl9TMl9QR0QgKiBzaXplb2YocGdkX3QpLAogCQkJCSAgICAgICBHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyk7CisKKwkJaWYgKCFwZ2QpIHsKKwkJCWt2bV9mcmVlX2h3cGdkKGh3cGdkKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJLyogUGx1ZyB0aGUgSFcgUEdEIGludG8gdGhlIGZha2Ugb25lLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgUFRSU19QRVJfUzJfUEdEOyBpKyspIHsKKwkJCWlmIChLVk1fUFJFQUxMT0NfTEVWRUwgPT0gMSkKKwkJCQlwZ2RfcG9wdWxhdGUoTlVMTCwgcGdkICsgaSwKKwkJCQkJICAgICAocHVkX3QgKilod3BnZCArIGkgKiBQVFJTX1BFUl9QVUQpOworCQkJZWxzZSBpZiAoS1ZNX1BSRUFMTE9DX0xFVkVMID09IDIpCisJCQkJcHVkX3BvcHVsYXRlKE5VTEwsIHB1ZF9vZmZzZXQocGdkLCAwKSArIGksCisJCQkJCSAgICAgKHBtZF90ICopaHdwZ2QgKyBpICogUFRSU19QRVJfUE1EKTsKKwkJfQogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIEFsbG9jYXRlIGFjdHVhbCBmaXJzdC1sZXZlbCBTdGFnZS0yIHBhZ2UgdGFibGUgdXNlZCBieSB0aGUKIAkJICogaGFyZHdhcmUgZm9yIFN0YWdlLTIgcGFnZSB0YWJsZSB3YWxrcy4KIAkJICovCi0JCXBnZCA9IChwZ2RfdCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8sIFMyX1BHRF9PUkRFUik7CisJCXBnZCA9IChwZ2RfdCAqKWh3cGdkOwogCX0KIAotCWlmICghcGdkKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IGt2bV9wcmVhbGxvY19od3BnZChrdm0sIHBnZCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfZXJyOwotCiAJa3ZtX2NsZWFuX3BnZChwZ2QpOwogCWt2bS0+YXJjaC5wZ2QgPSBwZ2Q7CiAJcmV0dXJuIDA7Ci1vdXRfZXJyOgotCWlmIChLVk1fUFJFQUxMT0NfTEVWRUwgPiAwKQotCQlrZnJlZShwZ2QpOwotCWVsc2UKLQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylwZ2QsIFMyX1BHRF9PUkRFUik7Ci0JcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC03ODUsMTEgKzgxNywxMCBAQAogCQlyZXR1cm47CiAKIAl1bm1hcF9zdGFnZTJfcmFuZ2Uoa3ZtLCAwLCBLVk1fUEhZU19TSVpFKTsKLQlrdm1fZnJlZV9od3BnZChrdm0pOworCWt2bV9mcmVlX2h3cGdkKGt2bV9nZXRfaHdwZ2Qoa3ZtKSk7CiAJaWYgKEtWTV9QUkVBTExPQ19MRVZFTCA+IDApCiAJCWtmcmVlKGt2bS0+YXJjaC5wZ2QpOwotCWVsc2UKLQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylrdm0tPmFyY2gucGdkLCBTMl9QR0RfT1JERVIpOworCiAJa3ZtLT5hcmNoLnBnZCA9IE5VTEw7CiB9CiAKQEAgLTc5OSw3ICs4MzAsNyBAQAogCXBnZF90ICpwZ2Q7CiAJcHVkX3QgKnB1ZDsKIAotCXBnZCA9IGt2bS0+YXJjaC5wZ2QgKyBwZ2RfaW5kZXgoYWRkcik7CisJcGdkID0ga3ZtLT5hcmNoLnBnZCArIGt2bV9wZ2RfaW5kZXgoYWRkcik7CiAJaWYgKFdBUk5fT04ocGdkX25vbmUoKnBnZCkpKSB7CiAJCWlmICghY2FjaGUpCiAJCQlyZXR1cm4gTlVMTDsKQEAgLTEwODksNyArMTEyMCw3IEBACiAJcGdkX3QgKnBnZDsKIAlwaHlzX2FkZHJfdCBuZXh0OwogCi0JcGdkID0ga3ZtLT5hcmNoLnBnZCArIHBnZF9pbmRleChhZGRyKTsKKwlwZ2QgPSBrdm0tPmFyY2gucGdkICsga3ZtX3BnZF9pbmRleChhZGRyKTsKIAlkbyB7CiAJCS8qCiAJCSAqIFJlbGVhc2Uga3ZtX21tdV9sb2NrIHBlcmlvZGljYWxseSBpZiB0aGUgbWVtb3J5IHJlZ2lvbiBpcwpAQCAtMTI5OSwxMCArMTMzMCw1MSBAQAogCiBvdXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZrdm0tPm1tdV9sb2NrKTsKKwlrdm1fc2V0X3Bmbl9hY2Nlc3NlZChwZm4pOwogCWt2bV9yZWxlYXNlX3Bmbl9jbGVhbihwZm4pOwogCXJldHVybiByZXQ7CiB9CiAKKy8qCisgKiBSZXNvbHZlIHRoZSBhY2Nlc3MgZmF1bHQgYnkgbWFraW5nIHRoZSBwYWdlIHlvdW5nIGFnYWluLgorICogTm90ZSB0aGF0IGJlY2F1c2UgdGhlIGZhdWx0aW5nIGVudHJ5IGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlCisgKiBjYWNoZWQgaW4gdGhlIFRMQiwgd2UgZG9uJ3QgbmVlZCB0byBpbnZhbGlkYXRlIGFueXRoaW5nLgorICovCitzdGF0aWMgdm9pZCBoYW5kbGVfYWNjZXNzX2ZhdWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgcGh5c19hZGRyX3QgZmF1bHRfaXBhKQoreworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKwlwZm5fdCBwZm47CisJYm9vbCBwZm5fdmFsaWQgPSBmYWxzZTsKKworCXRyYWNlX2t2bV9hY2Nlc3NfZmF1bHQoZmF1bHRfaXBhKTsKKworCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5tbXVfbG9jayk7CisKKwlwbWQgPSBzdGFnZTJfZ2V0X3BtZCh2Y3B1LT5rdm0sIE5VTEwsIGZhdWx0X2lwYSk7CisJaWYgKCFwbWQgfHwgcG1kX25vbmUoKnBtZCkpCS8qIE5vdGhpbmcgdGhlcmUgKi8KKwkJZ290byBvdXQ7CisKKwlpZiAoa3ZtX3BtZF9odWdlKCpwbWQpKSB7CS8qIFRIUCwgSHVnZVRMQiAqLworCQkqcG1kID0gcG1kX21reW91bmcoKnBtZCk7CisJCXBmbiA9IHBtZF9wZm4oKnBtZCk7CisJCXBmbl92YWxpZCA9IHRydWU7CisJCWdvdG8gb3V0OworCX0KKworCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgZmF1bHRfaXBhKTsKKwlpZiAocHRlX25vbmUoKnB0ZSkpCQkvKiBOb3RoaW5nIHRoZXJlIGVpdGhlciAqLworCQlnb3RvIG91dDsKKworCSpwdGUgPSBwdGVfbWt5b3VuZygqcHRlKTsJLyogSnVzdCBhIHBhZ2UuLi4gKi8KKwlwZm4gPSBwdGVfcGZuKCpwdGUpOworCXBmbl92YWxpZCA9IHRydWU7CitvdXQ6CisJc3Bpbl91bmxvY2soJnZjcHUtPmt2bS0+bW11X2xvY2spOworCWlmIChwZm5fdmFsaWQpCisJCWt2bV9zZXRfcGZuX2FjY2Vzc2VkKHBmbik7Cit9CisKIC8qKgogICoga3ZtX2hhbmRsZV9ndWVzdF9hYm9ydCAtIGhhbmRsZXMgYWxsIDJuZCBzdGFnZSBhYm9ydHMKICAqIEB2Y3B1Ogl0aGUgVkNQVSBwb2ludGVyCkBAIC0xMzMzLDcgKzE0MDUsOCBAQAogCiAJLyogQ2hlY2sgdGhlIHN0YWdlLTIgZmF1bHQgaXMgdHJhbnMuIGZhdWx0IG9yIHdyaXRlIGZhdWx0ICovCiAJZmF1bHRfc3RhdHVzID0ga3ZtX3ZjcHVfdHJhcF9nZXRfZmF1bHRfdHlwZSh2Y3B1KTsKLQlpZiAoZmF1bHRfc3RhdHVzICE9IEZTQ19GQVVMVCAmJiBmYXVsdF9zdGF0dXMgIT0gRlNDX1BFUk0pIHsKKwlpZiAoZmF1bHRfc3RhdHVzICE9IEZTQ19GQVVMVCAmJiBmYXVsdF9zdGF0dXMgIT0gRlNDX1BFUk0gJiYKKwkgICAgZmF1bHRfc3RhdHVzICE9IEZTQ19BQ0NFU1MpIHsKIAkJa3ZtX2VycigiVW5zdXBwb3J0ZWQgRlNDOiBFQz0lI3ggeEZTQz0lI2x4IEVTUl9FTDI9JSNseFxuIiwKIAkJCWt2bV92Y3B1X3RyYXBfZ2V0X2NsYXNzKHZjcHUpLAogCQkJKHVuc2lnbmVkIGxvbmcpa3ZtX3ZjcHVfdHJhcF9nZXRfZmF1bHQodmNwdSksCkBAIC0xMzY5LDYgKzE0NDIsMTIgQEAKIAkvKiBVc2Vyc3BhY2Ugc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHJlZ2lzdGVyIG91dC1vZi1ib3VuZHMgSVBBcyAqLwogCVZNX0JVR19PTihmYXVsdF9pcGEgPj0gS1ZNX1BIWVNfU0laRSk7CiAKKwlpZiAoZmF1bHRfc3RhdHVzID09IEZTQ19BQ0NFU1MpIHsKKwkJaGFuZGxlX2FjY2Vzc19mYXVsdCh2Y3B1LCBmYXVsdF9pcGEpOworCQlyZXQgPSAxOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCiAJcmV0ID0gdXNlcl9tZW1fYWJvcnQodmNwdSwgZmF1bHRfaXBhLCBtZW1zbG90LCBodmEsIGZhdWx0X3N0YXR1cyk7CiAJaWYgKHJldCA9PSAwKQogCQlyZXQgPSAxOwpAQCAtMTM3NywxNSArMTQ1NiwxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGhhbmRsZV9odmFfdG9fZ3BhKHN0cnVjdCBrdm0gKmt2bSwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGVuZCwKLQkJCSAgICAgIHZvaWQgKCpoYW5kbGVyKShzdHJ1Y3Qga3ZtICprdm0sCi0JCQkJCSAgICAgIGdwYV90IGdwYSwgdm9pZCAqZGF0YSksCi0JCQkgICAgICB2b2lkICpkYXRhKQorc3RhdGljIGludCBoYW5kbGVfaHZhX3RvX2dwYShzdHJ1Y3Qga3ZtICprdm0sCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kLAorCQkJICAgICBpbnQgKCpoYW5kbGVyKShzdHJ1Y3Qga3ZtICprdm0sCisJCQkJCSAgICBncGFfdCBncGEsIHZvaWQgKmRhdGEpLAorCQkJICAgICB2b2lkICpkYXRhKQogewogCXN0cnVjdCBrdm1fbWVtc2xvdHMgKnNsb3RzOwogCXN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3Q7CisJaW50IHJldCA9IDA7CiAKIAlzbG90cyA9IGt2bV9tZW1zbG90cyhrdm0pOwogCkBAIC0xNDA5LDE0ICsxNDg5LDE3IEBACiAKIAkJZm9yICg7IGdmbiA8IGdmbl9lbmQ7ICsrZ2ZuKSB7CiAJCQlncGFfdCBncGEgPSBnZm4gPDwgUEFHRV9TSElGVDsKLQkJCWhhbmRsZXIoa3ZtLCBncGEsIGRhdGEpOworCQkJcmV0IHw9IGhhbmRsZXIoa3ZtLCBncGEsIGRhdGEpOwogCQl9CiAJfQorCisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQga3ZtX3VubWFwX2h2YV9oYW5kbGVyKHN0cnVjdCBrdm0gKmt2bSwgZ3BhX3QgZ3BhLCB2b2lkICpkYXRhKQorc3RhdGljIGludCBrdm1fdW5tYXBfaHZhX2hhbmRsZXIoc3RydWN0IGt2bSAqa3ZtLCBncGFfdCBncGEsIHZvaWQgKmRhdGEpCiB7CiAJdW5tYXBfc3RhZ2UyX3JhbmdlKGt2bSwgZ3BhLCBQQUdFX1NJWkUpOworCXJldHVybiAwOwogfQogCiBpbnQga3ZtX3VubWFwX2h2YShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgaHZhKQpAQCAtMTQ0Miw3ICsxNTI1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQga3ZtX3NldF9zcHRlX2hhbmRsZXIoc3RydWN0IGt2bSAqa3ZtLCBncGFfdCBncGEsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGt2bV9zZXRfc3B0ZV9oYW5kbGVyKHN0cnVjdCBrdm0gKmt2bSwgZ3BhX3QgZ3BhLCB2b2lkICpkYXRhKQogewogCXB0ZV90ICpwdGUgPSAocHRlX3QgKilkYXRhOwogCkBAIC0xNDU0LDYgKzE1MzcsNyBAQAogCSAqIHRocm91Z2ggdGhpcyBjYWxsaW5nIHBhdGguCiAJICovCiAJc3RhZ2UyX3NldF9wdGUoa3ZtLCBOVUxMLCBncGEsIHB0ZSwgMCk7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMTQ3MCw2ICsxNTU0LDY3IEBACiAJaGFuZGxlX2h2YV90b19ncGEoa3ZtLCBodmEsIGVuZCwgJmt2bV9zZXRfc3B0ZV9oYW5kbGVyLCAmc3RhZ2UyX3B0ZSk7CiB9CiAKK3N0YXRpYyBpbnQga3ZtX2FnZV9odmFfaGFuZGxlcihzdHJ1Y3Qga3ZtICprdm0sIGdwYV90IGdwYSwgdm9pZCAqZGF0YSkKK3sKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGU7CisKKwlwbWQgPSBzdGFnZTJfZ2V0X3BtZChrdm0sIE5VTEwsIGdwYSk7CisJaWYgKCFwbWQgfHwgcG1kX25vbmUoKnBtZCkpCS8qIE5vdGhpbmcgdGhlcmUgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAoa3ZtX3BtZF9odWdlKCpwbWQpKSB7CS8qIFRIUCwgSHVnZVRMQiAqLworCQlpZiAocG1kX3lvdW5nKCpwbWQpKSB7CisJCQkqcG1kID0gcG1kX21rb2xkKCpwbWQpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQlyZXR1cm4gMDsKKwl9CisKKwlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIGdwYSk7CisJaWYgKHB0ZV9ub25lKCpwdGUpKQorCQlyZXR1cm4gMDsKKworCWlmIChwdGVfeW91bmcoKnB0ZSkpIHsKKwkJKnB0ZSA9IHB0ZV9ta29sZCgqcHRlKTsJLyogSnVzdCBhIHBhZ2UuLi4gKi8KKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga3ZtX3Rlc3RfYWdlX2h2YV9oYW5kbGVyKHN0cnVjdCBrdm0gKmt2bSwgZ3BhX3QgZ3BhLCB2b2lkICpkYXRhKQoreworCXBtZF90ICpwbWQ7CisJcHRlX3QgKnB0ZTsKKworCXBtZCA9IHN0YWdlMl9nZXRfcG1kKGt2bSwgTlVMTCwgZ3BhKTsKKwlpZiAoIXBtZCB8fCBwbWRfbm9uZSgqcG1kKSkJLyogTm90aGluZyB0aGVyZSAqLworCQlyZXR1cm4gMDsKKworCWlmIChrdm1fcG1kX2h1Z2UoKnBtZCkpCQkvKiBUSFAsIEh1Z2VUTEIgKi8KKwkJcmV0dXJuIHBtZF95b3VuZygqcG1kKTsKKworCXB0ZSA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZCwgZ3BhKTsKKwlpZiAoIXB0ZV9ub25lKCpwdGUpKQkJLyogSnVzdCBhIHBhZ2UuLi4gKi8KKwkJcmV0dXJuIHB0ZV95b3VuZygqcHRlKTsKKworCXJldHVybiAwOworfQorCitpbnQga3ZtX2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwl0cmFjZV9rdm1fYWdlX2h2YShzdGFydCwgZW5kKTsKKwlyZXR1cm4gaGFuZGxlX2h2YV90b19ncGEoa3ZtLCBzdGFydCwgZW5kLCBrdm1fYWdlX2h2YV9oYW5kbGVyLCBOVUxMKTsKK30KKworaW50IGt2bV90ZXN0X2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSkKK3sKKwl0cmFjZV9rdm1fdGVzdF9hZ2VfaHZhKGh2YSk7CisJcmV0dXJuIGhhbmRsZV9odmFfdG9fZ3BhKGt2bSwgaHZhLCBodmEsIGt2bV90ZXN0X2FnZV9odmFfaGFuZGxlciwgTlVMTCk7Cit9CisKIHZvaWQga3ZtX21tdV9mcmVlX21lbW9yeV9jYWNoZXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCW1tdV9mcmVlX21lbW9yeV9jYWNoZSgmdmNwdS0+YXJjaC5tbXVfcGFnZV9jYWNoZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rdm0vdHJhY2UuaCBiL2FyY2gvYXJtL2t2bS90cmFjZS5oCmluZGV4IDY4MTc2NjQuLjBlYzM1MzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2t2bS90cmFjZS5oCisrKyBiL2FyY2gvYXJtL2t2bS90cmFjZS5oCkBAIC02OCw2ICs2OCwyMSBAQAogCQkgIF9fZW50cnktPmh4ZmFyLCBfX2VudHJ5LT52Y3B1X3BjKQogKTsKIAorVFJBQ0VfRVZFTlQoa3ZtX2FjY2Vzc19mYXVsdCwKKwlUUF9QUk9UTyh1bnNpZ25lZCBsb25nIGlwYSksCisJVFBfQVJHUyhpcGEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJaXBhCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5pcGEJCT0gaXBhOworCSksCisKKwlUUF9wcmludGsoIklQQTogJWx4IiwgX19lbnRyeS0+aXBhKQorKTsKKwogVFJBQ0VfRVZFTlQoa3ZtX2lycV9saW5lLAogCVRQX1BST1RPKHVuc2lnbmVkIGludCB0eXBlLCBpbnQgdmNwdV9pZHgsIGludCBpcnFfbnVtLCBpbnQgbGV2ZWwpLAogCVRQX0FSR1ModHlwZSwgdmNwdV9pZHgsIGlycV9udW0sIGxldmVsKSwKQEAgLTIxMCw2ICsyMjUsMzkgQEAKIAlUUF9wcmludGsoIm1tdSBub3RpZmllciBzZXQgcHRlIGh2YTogJSMwOGx4IiwgX19lbnRyeS0+aHZhKQogKTsKIAorVFJBQ0VfRVZFTlQoa3ZtX2FnZV9odmEsCisJVFBfUFJPVE8odW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpLAorCVRQX0FSR1Moc3RhcnQsIGVuZCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAlzdGFydAkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAllbmQJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnN0YXJ0CQk9IHN0YXJ0OworCQlfX2VudHJ5LT5lbmQJCT0gZW5kOworCSksCisKKwlUUF9wcmludGsoIm1tdSBub3RpZmllciBhZ2UgaHZhOiAlIzA4bHggLS0gJSMwOGx4IiwKKwkJICBfX2VudHJ5LT5zdGFydCwgX19lbnRyeS0+ZW5kKQorKTsKKworVFJBQ0VfRVZFTlQoa3ZtX3Rlc3RfYWdlX2h2YSwKKwlUUF9QUk9UTyh1bnNpZ25lZCBsb25nIGh2YSksCisJVFBfQVJHUyhodmEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJaHZhCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5odmEJCT0gaHZhOworCSksCisKKwlUUF9wcmludGsoIm1tdSBub3RpZmllciB0ZXN0IGFnZSBodmE6ICUjMDhseCIsIF9fZW50cnktPmh2YSkKKyk7CisKIFRSQUNFX0VWRU5UKGt2bV9odmMsCiAJVFBfUFJPVE8odW5zaWduZWQgbG9uZyB2Y3B1X3BjLCB1bnNpZ25lZCBsb25nIHIwLCB1bnNpZ25lZCBsb25nIGltbSksCiAJVFBfQVJHUyh2Y3B1X3BjLCByMCwgaW1tKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2xpYi9jbGVhcl91c2VyLlMgYi9hcmNoL2FybS9saWIvY2xlYXJfdXNlci5TCmluZGV4IDE0YTBkOTguLjE3MTBmZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jbGVhcl91c2VyLlMKKysrIGIvYXJjaC9hcm0vbGliL2NsZWFyX3VzZXIuUwpAQCAtNDcsNyArNDcsNyBAQAogRU5EUFJPQyhfX2NsZWFyX3VzZXIpCiBFTkRQUk9DKF9fY2xlYXJfdXNlcl9zdGQpCiAKLQkJLnB1c2hzZWN0aW9uIC5maXh1cCwiYXgiCisJCS5wdXNoc2VjdGlvbiAudGV4dC5maXh1cCwiYXgiCiAJCS5hbGlnbgkwCiA5MDAxOgkJbGRtZmQJc3AhLCB7cjAsIHBjfQogCQkucG9wc2VjdGlvbgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2NvcHlfdG9fdXNlci5TIGIvYXJjaC9hcm0vbGliL2NvcHlfdG9fdXNlci5TCmluZGV4IGE5ZDNkYjEuLjk2NDhiMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9jb3B5X3RvX3VzZXIuUworKysgYi9hcmNoL2FybS9saWIvY29weV90b191c2VyLlMKQEAgLTEwMCw3ICsxMDAsNyBAQAogRU5EUFJPQyhfX2NvcHlfdG9fdXNlcikKIEVORFBST0MoX19jb3B5X3RvX3VzZXJfc3RkKQogCi0JLnB1c2hzZWN0aW9uIC5maXh1cCwiYXgiCisJLnB1c2hzZWN0aW9uIC50ZXh0LmZpeHVwLCJheCIKIAkuYWxpZ24gMAogCWNvcHlfYWJvcnRfcHJlYW1ibGUKIAlsZG1mZAlzcCEsIHtyMSwgcjIsIHIzfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUyBiL2FyY2gvYXJtL2xpYi9jc3VtcGFydGlhbGNvcHl1c2VyLlMKaW5kZXggN2QwOGI0My4uMWQwOTU3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbGliL2NzdW1wYXJ0aWFsY29weXVzZXIuUworKysgYi9hcmNoL2FybS9saWIvY3N1bXBhcnRpYWxjb3B5dXNlci5TCkBAIC02OCw3ICs2OCw3IEBACiAgKiBzbyBwcm9wZXJseSwgd2Ugd291bGQgaGF2ZSB0byBhZGQgaW4gd2hhdGV2ZXIgcmVnaXN0ZXJzIHdlcmUgbG9hZGVkIGJlZm9yZQogICogdGhlIGZhdWx0LCB3aGljaCwgd2l0aCB0aGUgY3VycmVudCBhc20gYWJvdmUgaXMgbm90IHByZWRpY3RhYmxlLgogICovCi0JCS5wdXNoc2VjdGlvbiAuZml4dXAsImF4IgorCQkucHVzaHNlY3Rpb24gLnRleHQuZml4dXAsImF4IgogCQkuYWxpZ24JNAogOTAwMToJCW1vdglyNCwgIy1FRkFVTFQKIAkJbGRyCXI1LCBbc3AsICM4KjRdCQlAICplcnJfcHRyCmRpZmYgLS1naXQgYS9hcmNoL2FybS9saWIvZGVsYXkuYyBiL2FyY2gvYXJtL2xpYi9kZWxheS5jCmluZGV4IDMxMmQ0M2UuLjgwNDQ1OTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2xpYi9kZWxheS5jCisrKyBiL2FyY2gvYXJtL2xpYi9kZWxheS5jCkBAIC04Myw2ICs4MywxMiBAQAogCQkJICAgICAgIE5TRUNfUEVSX1NFQywgMzYwMCk7CiAJcmVzID0gY3ljX3RvX25zKDFVTEwsIG5ld19tdWx0LCBuZXdfc2hpZnQpOwogCisJaWYgKHJlcyA+IDEwMDApIHsKKwkJcHJfZXJyKCJJZ25vcmluZyBkZWxheSB0aW1lciAlcHMsIHdoaWNoIGhhcyBpbnN1ZmZpY2llbnQgcmVzb2x1dGlvbiBvZiAlbGx1bnNcbiIsCisJCQl0aW1lciwgcmVzKTsKKwkJcmV0dXJuOworCX0KKwogCWlmICghZGVsYXlfY2FsaWJyYXRlZCAmJiAoIWRlbGF5X3JlcyB8fCAocmVzIDwgZGVsYXlfcmVzKSkpIHsKIAkJcHJfaW5mbygiU3dpdGNoaW5nIHRvIHRpbWVyLWJhc2VkIGRlbGF5IGxvb3AsIHJlc29sdXRpb24gJWxsdW5zXG4iLCByZXMpOwogCQlkZWxheV90aW1lcgkJCT0gdGltZXI7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3B1aWRsZS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2NwdWlkbGUuYwppbmRleCBlMzY1YzFiLi4zMDZlYmM1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvY3B1aWRsZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9jcHVpZGxlLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KICNpbmNsdWRlIDxhc20vY3B1aWRsZS5oPgogCiAjaW5jbHVkZSA8bWFjaC9jcHVpZGxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRvdmUvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL3BjaWUuYwppbmRleCA4YTI3NWYyLi45MWZlOTcxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRvdmUvcGNpZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZG92ZS9wY2llLmMKQEAgLTE1NSwxNyArMTU1LDEzIEBACiBzdGF0aWMgc3RydWN0IHBjaV9idXMgX19pbml0ICoKIGRvdmVfcGNpZV9zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKIHsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCi0JaWYgKG5yIDwgbnVtX3BjaWVfcG9ydHMpIHsKLQkJYnVzID0gcGNpX3NjYW5fcm9vdF9idXMoTlVMTCwgc3lzLT5idXNuciwgJnBjaWVfb3BzLCBzeXMsCi0JCQkJCSZzeXMtPnJlc291cmNlcyk7Ci0JfSBlbHNlIHsKLQkJYnVzID0gTlVMTDsKKwlpZiAobnIgPj0gbnVtX3BjaWVfcG9ydHMpIHsKIAkJQlVHKCk7CisJCXJldHVybiBOVUxMOwogCX0KIAotCXJldHVybiBidXM7CisJcmV0dXJuIHBjaV9zY2FuX3Jvb3RfYnVzKE5VTEwsIHN5cy0+YnVzbnIsICZwY2llX29wcywgc3lzLAorCQkJCSAmc3lzLT5yZXNvdXJjZXMpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBkb3ZlX3BjaWVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9leHlub3MuYyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2V4eW5vcy5jCmluZGV4IDllOWRmZGYuLmY0NGMyZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL2V4eW5vcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL2V4eW5vcy5jCkBAIC0xNjYsMTYgKzE2NiwxNCBAQAogCWV4eW5vc19tYXBfaW8oKTsKIH0KIAorLyoKKyAqIEFwcGFyZW50bHksIHRoZXNlIFNvQ3MgYXJlIG5vdCBhYmxlIHRvIHdha2UtdXAgZnJvbSBzdXNwZW5kIHVzaW5nCisgKiB0aGUgUE1VLiBUb28gYmFkLiBTaG91bGQgdGhleSBzdWRkZW5seSBiZWNvbWUgY2FwYWJsZSBvZiBzdWNoIGEKKyAqIGZlYXQsIHRoZSBtYXRjaGVzIGJlbG93IHNob3VsZCBiZSBtb3ZlZCB0byBzdXNwZW5kLmMuCisgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGV4eW5vc19kdF9wbXVfbWF0Y2hbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zMzI1MC1wbXUiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczQyMTAtcG11IiB9LAotCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M0MjEyLXBtdSIgfSwKLQl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNDQxMi1wbXUiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczQ0MTUtcG11IiB9LAotCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1MjUwLXBtdSIgfSwKIAl7IC5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTI2MC1wbXUiIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczU0MTAtcG11IiB9LAotCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1NDIwLXBtdSIgfSwKIAl7IC8qc2VudGluZWwqLyB9LAogfTsKIApAQCAtMTg2LDkgKzE4NCw2IEBACiAJbnAgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgZXh5bm9zX2R0X3BtdV9tYXRjaCk7CiAJaWYgKG5wKQogCQlwbXVfYmFzZV9hZGRyID0gb2ZfaW9tYXAobnAsIDApOwotCi0JaWYgKCFwbXVfYmFzZV9hZGRyKQotCQlwYW5pYygiZmFpbGVkIHRvIGZpbmQgZXh5bm9zIHBtdSByZWdpc3RlclxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBleHlub3NfaW5pdF9pcnEodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NsZWVwLlMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zbGVlcC5TCmluZGV4IDMxZDI1ODMuLmNmOTUwNzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL3NsZWVwLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3Mvc2xlZXAuUwpAQCAtMjMsMTQgKzIzLDcgQEAKICNkZWZpbmUgQ1BVX01BU0sJMHhmZjBmZmZmMAogI2RlZmluZSBDUFVfQ09SVEVYX0E5CTB4NDEwZmMwOTAKIAotCS8qCi0JICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGxvY2F0ZWQgaW50byB0aGUgLmRhdGEgc2VjdGlvbi4gVGhpcyBpcyB0bwotCSAqIGFsbG93IGwyeDBfcmVnc19waHlzIHRvIGJlIGFjY2Vzc2VkIHdpdGggYSByZWxhdGl2ZSBsb2FkIHdoaWxlIHdlCi0JICogY2FuJ3QgcmVseSBvbiBhbnkgTU1VIHRyYW5zbGF0aW9uLiBXZSBjb3VsZCBoYXZlIHB1dCBsMngwX3JlZ3NfcGh5cwotCSAqIGluIHRoZSAudGV4dCBzZWN0aW9uIGFzIHdlbGwsIGJ1dCBzb21lIHNldHVwcyBtaWdodCBpbnNpc3Qgb24gaXQgdG8KLQkgKiBiZSB0cnVseSByZWFkLW9ubHkuIChSZWZlcmVuY2UgZnJvbTogYXJjaC9hcm0va2VybmVsL3NsZWVwLlMpCi0JICovCi0JLmRhdGEKKwkudGV4dAogCS5hbGlnbgogCiAJLyoKQEAgLTY5LDEwICs2MiwxMiBAQAogCWNtcAlyMCwgcjEKIAlibmUJc2tpcF9jcDE1CiAKLQlhZHIJcjAsIGNwMTVfc2F2ZV9wb3dlcgorCWFkcglyMCwgX2NwMTVfc2F2ZV9wb3dlcgogCWxkcglyMSwgW3IwXQotCWFkcglyMCwgY3AxNV9zYXZlX2RpYWcKKwlsZHIJcjEsIFtyMCwgcjFdCisJYWRyCXIwLCBfY3AxNV9zYXZlX2RpYWcKIAlsZHIJcjIsIFtyMF0KKwlsZHIJcjIsIFtyMCwgcjJdCiAJbW92CXIwLCAjU01DX0NNRF9DMTVSRVNVTUUKIAlkc2IKIAlzbWMJIzAKQEAgLTExOCwxNCArMTEzLDIwIEBACiBza2lwX2NwMTU6CiAJYgljcHVfcmVzdW1lCiBFTkRQUk9DKGV4eW5vc19jcHVfcmVzdW1lX25zKQorCisJLmFsaWduCitfY3AxNV9zYXZlX3Bvd2VyOgorCS5sb25nCWNwMTVfc2F2ZV9wb3dlciAtIC4KK19jcDE1X3NhdmVfZGlhZzoKKwkubG9uZwljcDE1X3NhdmVfZGlhZyAtIC4KKyNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAorMToJLmxvbmcJbDJ4MF9zYXZlZF9yZWdzIC0gLgorI2VuZGlmIC8qIENPTkZJR19DQUNIRV9MMlgwICovCisKKwkuZGF0YQogCS5nbG9ibCBjcDE1X3NhdmVfZGlhZwogY3AxNV9zYXZlX2RpYWc6CiAJLmxvbmcJMAlAIGNwMTUgZGlhZ25vc3RpYwogCS5nbG9ibCBjcDE1X3NhdmVfcG93ZXIKIGNwMTVfc2F2ZV9wb3dlcjoKIAkubG9uZwkwCUAgY3AxNSBwb3dlciBjb250cm9sCi0KLSNpZmRlZiBDT05GSUdfQ0FDSEVfTDJYMAotCS5hbGlnbgotMToJLmxvbmcJbDJ4MF9zYXZlZF9yZWdzIC0gLgotI2VuZGlmIC8qIENPTkZJR19DQUNIRV9MMlgwICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9zdXNwZW5kLmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9zdXNwZW5kLmMKaW5kZXggMzE4ZDEyNy4uMjE0NmQ5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3Mvc3VzcGVuZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZXh5bm9zL3N1c3BlbmQuYwpAQCAtMTgsNyArMTgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1X3BtLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2FybS1naWMuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KIApAQCAtNDMsOCArNDUsOCBAQAogI2RlZmluZSBFWFlOT1M1NDIwX0NQVV9TVEFURQkweDI4CiAKIC8qKgotICogc3RydWN0IGV4eW5vc193a3VwX2lycSAtIEV4eW5vcyBHSUMgdG8gUE1VIElSUSBtYXBwaW5nCi0gKiBAaHdpcnE6IEhhcmR3YXJlIElSUSBzaWduYWwgb2YgdGhlIEdJQworICogc3RydWN0IGV4eW5vc193a3VwX2lycSAtIFBNVSBJUlEgdG8gbWFzayBtYXBwaW5nCisgKiBAaHdpcnE6IEhhcmR3YXJlIElSUSBzaWduYWwgb2YgdGhlIFBNVQogICogQG1hc2s6IE1hc2sgaW4gUE1VIHdha2UtdXAgbWFzayByZWdpc3RlcgogICovCiBzdHJ1Y3QgZXh5bm9zX3drdXBfaXJxIHsKQEAgLTkzLDE0ICs5NSwxNCBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3Nfd2t1cF9pcnEgZXh5bm9zNF93a3VwX2lycVtdID0gewotCXsgNzYsIEJJVCgxKSB9LCAvKiBSVEMgYWxhcm0gKi8KLQl7IDc3LCBCSVQoMikgfSwgLyogUlRDIHRpY2sgKi8KKwl7IDQ0LCBCSVQoMSkgfSwgLyogUlRDIGFsYXJtICovCisJeyA0NSwgQklUKDIpIH0sIC8qIFJUQyB0aWNrICovCiAJeyAvKiBzZW50aW5lbCAqLyB9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3Nfd2t1cF9pcnEgZXh5bm9zNTI1MF93a3VwX2lycVtdID0gewotCXsgNzUsIEJJVCgxKSB9LCAvKiBSVEMgYWxhcm0gKi8KLQl7IDc2LCBCSVQoMikgfSwgLyogUlRDIHRpY2sgKi8KKwl7IDQzLCBCSVQoMSkgfSwgLyogUlRDIGFsYXJtICovCisJeyA0NCwgQklUKDIpIH0sIC8qIFJUQyB0aWNrICovCiAJeyAvKiBzZW50aW5lbCAqLyB9LAogfTsKIApAQCAtMTY3LDYgKzE2OSwxMTMgQEAKIAlyZXR1cm4gLUVOT0VOVDsKIH0KIAorc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBleHlub3NfcG11X2NoaXAgPSB7CisJLm5hbWUJCQk9ICJQTVUiLAorCS5pcnFfZW9pCQk9IGlycV9jaGlwX2VvaV9wYXJlbnQsCisJLmlycV9tYXNrCQk9IGlycV9jaGlwX21hc2tfcGFyZW50LAorCS5pcnFfdW5tYXNrCQk9IGlycV9jaGlwX3VubWFza19wYXJlbnQsCisJLmlycV9yZXRyaWdnZXIJCT0gaXJxX2NoaXBfcmV0cmlnZ2VyX2hpZXJhcmNoeSwKKwkuaXJxX3NldF93YWtlCQk9IGV4eW5vc19pcnFfc2V0X3dha2UsCisjaWZkZWYgQ09ORklHX1NNUAorCS5pcnFfc2V0X2FmZmluaXR5CT0gaXJxX2NoaXBfc2V0X2FmZmluaXR5X3BhcmVudCwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBleHlub3NfcG11X2RvbWFpbl94bGF0ZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLAorCQkJCSAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKKwkJCQkgICBjb25zdCB1MzIgKmludHNwZWMsCisJCQkJICAgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkJICAgdW5zaWduZWQgbG9uZyAqb3V0X2h3aXJxLAorCQkJCSAgIHVuc2lnbmVkIGludCAqb3V0X3R5cGUpCit7CisJaWYgKGRvbWFpbi0+b2Zfbm9kZSAhPSBjb250cm9sbGVyKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogU2hvdWxkbid0IGhhcHBlbiwgcmVhbGx5Li4uICovCisJaWYgKGludHNpemUgIT0gMykKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIE5vdCBHSUMgY29tcGxpYW50ICovCisJaWYgKGludHNwZWNbMF0gIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIE5vIFBQSSBzaG91bGQgcG9pbnQgdG8gdGhpcyBkb21haW4gKi8KKworCSpvdXRfaHdpcnEgPSBpbnRzcGVjWzFdOworCSpvdXRfdHlwZSA9IGludHNwZWNbMl07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXh5bm9zX3BtdV9kb21haW5fYWxsb2Moc3RydWN0IGlycV9kb21haW4gKmRvbWFpbiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbnJfaXJxcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICphcmdzID0gZGF0YTsKKwlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIHBhcmVudF9hcmdzOworCWlycV9od19udW1iZXJfdCBod2lycTsKKwlpbnQgaTsKKworCWlmIChhcmdzLT5hcmdzX2NvdW50ICE9IDMpCisJCXJldHVybiAtRUlOVkFMOwkvKiBOb3QgR0lDIGNvbXBsaWFudCAqLworCWlmIChhcmdzLT5hcmdzWzBdICE9IDApCisJCXJldHVybiAtRUlOVkFMOwkvKiBObyBQUEkgc2hvdWxkIHBvaW50IHRvIHRoaXMgZG9tYWluICovCisKKwlod2lycSA9IGFyZ3MtPmFyZ3NbMV07CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKQorCQlpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkb21haW4sIHZpcnEgKyBpLCBod2lycSArIGksCisJCQkJCSAgICAgICZleHlub3NfcG11X2NoaXAsIE5VTEwpOworCisJcGFyZW50X2FyZ3MgPSAqYXJnczsKKwlwYXJlbnRfYXJncy5ucCA9IGRvbWFpbi0+cGFyZW50LT5vZl9ub2RlOworCXJldHVybiBpcnFfZG9tYWluX2FsbG9jX2lycXNfcGFyZW50KGRvbWFpbiwgdmlycSwgbnJfaXJxcywgJnBhcmVudF9hcmdzKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluX29wcyBleHlub3NfcG11X2RvbWFpbl9vcHMgPSB7CisJLnhsYXRlCT0gZXh5bm9zX3BtdV9kb21haW5feGxhdGUsCisJLmFsbG9jCT0gZXh5bm9zX3BtdV9kb21haW5fYWxsb2MsCisJLmZyZWUJPSBpcnFfZG9tYWluX2ZyZWVfaXJxc19jb21tb24sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBleHlub3NfcG11X2lycV9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgaXJxX2RvbWFpbiAqcGFyZW50X2RvbWFpbiwgKmRvbWFpbjsKKworCWlmICghcGFyZW50KSB7CisJCXByX2VycigiJXM6IG5vIHBhcmVudCwgZ2l2aW5nIHVwXG4iLCBub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwYXJlbnRfZG9tYWluID0gaXJxX2ZpbmRfaG9zdChwYXJlbnQpOworCWlmICghcGFyZW50X2RvbWFpbikgeworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gb2J0YWluIHBhcmVudCBkb21haW5cbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcG11X2Jhc2VfYWRkciA9IG9mX2lvbWFwKG5vZGUsIDApOworCisJaWYgKCFwbXVfYmFzZV9hZGRyKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBmaW5kIGV4eW5vcyBwbXUgcmVnaXN0ZXJcbiIsCisJCSAgICAgICBub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkb21haW4gPSBpcnFfZG9tYWluX2FkZF9oaWVyYXJjaHkocGFyZW50X2RvbWFpbiwgMCwgMCwKKwkJCQkJICBub2RlLCAmZXh5bm9zX3BtdV9kb21haW5fb3BzLAorCQkJCQkgIE5VTEwpOworCWlmICghZG9tYWluKSB7CisJCWlvdW5tYXAocG11X2Jhc2VfYWRkcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisjZGVmaW5lIEVYWU5PU19QTVVfSVJRKHN5bWJvbCwgbmFtZSkJT0ZfREVDTEFSRV8yKGlycWNoaXAsIHN5bWJvbCwgbmFtZSwgZXh5bm9zX3BtdV9pcnFfaW5pdCkKKworRVhZTk9TX1BNVV9JUlEoZXh5bm9zMzI1MF9wbXVfaXJxLCAic2Ftc3VuZyxleHlub3MzMjUwLXBtdSIpOworRVhZTk9TX1BNVV9JUlEoZXh5bm9zNDIxMF9wbXVfaXJxLCAic2Ftc3VuZyxleHlub3M0MjEwLXBtdSIpOworRVhZTk9TX1BNVV9JUlEoZXh5bm9zNDIxMl9wbXVfaXJxLCAic2Ftc3VuZyxleHlub3M0MjEyLXBtdSIpOworRVhZTk9TX1BNVV9JUlEoZXh5bm9zNDQxMl9wbXVfaXJxLCAic2Ftc3VuZyxleHlub3M0NDEyLXBtdSIpOworRVhZTk9TX1BNVV9JUlEoZXh5bm9zNDQxNV9wbXVfaXJxLCAic2Ftc3VuZyxleHlub3M0NDE1LXBtdSIpOworRVhZTk9TX1BNVV9JUlEoZXh5bm9zNTI1MF9wbXVfaXJxLCAic2Ftc3VuZyxleHlub3M1MjUwLXBtdSIpOworRVhZTk9TX1BNVV9JUlEoZXh5bm9zNTQyMF9wbXVfaXJxLCAic2Ftc3VuZyxleHlub3M1NDIwLXBtdSIpOworCiBzdGF0aWMgaW50IGV4eW5vc19jcHVfZG9faWRsZSh2b2lkKQogewogCS8qIGlzc3VlIHRoZSBzdGFuZGJ5IHNpZ25hbCBpbnRvIHRoZSBwbSB1bml0LiAqLwpAQCAtNjE1LDE3ICs3MjQsMTkgQEAKIHZvaWQgX19pbml0IGV4eW5vc19wbV9pbml0KHZvaWQpCiB7CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAl1MzIgdG1wOwogCi0Jb2ZfZmluZF9tYXRjaGluZ19ub2RlX2FuZF9tYXRjaChOVUxMLCBleHlub3NfcG11X29mX2RldmljZV9pZHMsICZtYXRjaCk7Ci0JaWYgKCFtYXRjaCkgeworCW5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlX2FuZF9tYXRjaChOVUxMLCBleHlub3NfcG11X29mX2RldmljZV9pZHMsICZtYXRjaCk7CisJaWYgKCFucCkgewogCQlwcl9lcnIoIkZhaWxlZCB0byBmaW5kIFBNVSBub2RlXG4iKTsKIAkJcmV0dXJuOwogCX0KLQlwbV9kYXRhID0gKHN0cnVjdCBleHlub3NfcG1fZGF0YSAqKSBtYXRjaC0+ZGF0YTsKIAotCS8qIFBsYXRmb3JtLXNwZWNpZmljIEdJQyBjYWxsYmFjayAqLwotCWdpY19hcmNoX2V4dG4uaXJxX3NldF93YWtlID0gZXh5bm9zX2lycV9zZXRfd2FrZTsKKwlpZiAoV0FSTl9PTighb2ZfZmluZF9wcm9wZXJ0eShucCwgImludGVycnVwdC1jb250cm9sbGVyIiwgTlVMTCkpKQorCQlwcl93YXJuKCJPdXRkYXRlZCBEVCBkZXRlY3RlZCwgc3VzcGVuZC9yZXN1bWUgd2lsbCBOT1Qgd29ya1xuIik7CisKKwlwbV9kYXRhID0gKHN0cnVjdCBleHlub3NfcG1fZGF0YSAqKSBtYXRjaC0+ZGF0YTsKIAogCS8qIEFsbCB3YWtldXAgZGlzYWJsZSAqLwogCXRtcCA9IHBtdV9yYXdfcmVhZGwoUzVQX1dBS0VVUF9NQVNLKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L0tjb25maWcgYi9hcmNoL2FybS9tYWNoLWlteC9LY29uZmlnCmluZGV4IGU4NjI3ZTAuLmM4ZGZmY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZwpAQCAtNjMxLDYgKzYzMSw3IEBACiAKIGNvbmZpZyBTT0NfVkY2MTAKIAlib29sICJWeWJyaWQgRmFtaWx5IFZGNjEwIHN1cHBvcnQiCisJc2VsZWN0IElSUV9ET01BSU5fSElFUkFSQ0hZCiAJc2VsZWN0IEFSTV9HSUMKIAlzZWxlY3QgUElOQ1RSTF9WRjYxMAogCXNlbGVjdCBQTDMxMF9FUlJBVEFfNzY5NDE5IGlmIENBQ0hFX0wyWDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2NwdWlkbGUtaW14NnEuYyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdWlkbGUtaW14NnEuYwppbmRleCBkNzZkMDg2Li44ZTIxY2NjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9jcHVpZGxlLWlteDZxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY3B1aWRsZS1pbXg2cS5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vY3B1aWRsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogCiAjaW5jbHVkZSAiY29tbW9uLmgiCiAjaW5jbHVkZSAiY3B1aWRsZS5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY3B1aWRsZS1pbXg2c2wuYyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdWlkbGUtaW14NnNsLmMKaW5kZXggN2Q5MmU2NS4uNTc0MmE5ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY3B1aWRsZS1pbXg2c2wuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jcHVpZGxlLWlteDZzbC5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxhc20vY3B1aWRsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogCiAjaW5jbHVkZSAiY29tbW9uLmgiCiAjaW5jbHVkZSAiY3B1aWRsZS5oIgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY3B1aWRsZS1pbXg2c3guYyBiL2FyY2gvYXJtL21hY2gtaW14L2NwdWlkbGUtaW14NnN4LmMKaW5kZXggNWEzNjcyMi4uMmM5ZjFhOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY3B1aWRsZS1pbXg2c3guYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jcHVpZGxlLWlteDZzeC5jCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bGludXgvY3B1X3BtLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWlkbGUuaD4KLSNpbmNsdWRlIDxhc20vcHJvYy1mbnMuaD4KICNpbmNsdWRlIDxhc20vc3VzcGVuZC5oPgogCiAjaW5jbHVkZSAiY29tbW9uLmgiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYwppbmRleCA0NDVlNTUzLi4wOTdlYTRjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMKQEAgLTE5NywxNyArMTk3LDEzIEBACiBzdGF0aWMgc3RydWN0IHBjaV9idXMgX19pbml0ICoKIG12Nzh4eDBfcGNpZV9zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKIHsKLQlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwotCi0JaWYgKG5yIDwgbnVtX3BjaWVfcG9ydHMpIHsKLQkJYnVzID0gcGNpX3NjYW5fcm9vdF9idXMoTlVMTCwgc3lzLT5idXNuciwgJnBjaWVfb3BzLCBzeXMsCi0JCQkJCSZzeXMtPnJlc291cmNlcyk7Ci0JfSBlbHNlIHsKLQkJYnVzID0gTlVMTDsKKwlpZiAobnIgPj0gbnVtX3BjaWVfcG9ydHMpIHsKIAkJQlVHKCk7CisJCXJldHVybiBOVUxMOwogCX0KIAotCXJldHVybiBidXM7CisJcmV0dXJuIHBjaV9zY2FuX3Jvb3RfYnVzKE5VTEwsIHN5cy0+YnVzbnIsICZwY2llX29wcywgc3lzLAorCQkJCSAmc3lzLT5yZXNvdXJjZXMpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBtdjc4eHgwX3BjaWVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9jcHVpZGxlNDR4eC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9jcHVpZGxlNDR4eC5jCmluZGV4IDAxZTM5OGEuLjRiOGU5ZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvY3B1aWRsZTQ0eHguYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2NwdWlkbGU0NHh4LmMKQEAgLTE0LDEwICsxNCw5IEBACiAjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdV9wbS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAKICNpbmNsdWRlIDxhc20vY3B1aWRsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogCiAjaW5jbHVkZSAiY29tbW9uLmgiCiAjaW5jbHVkZSAicG0uaCIKQEAgLTg0LDcgKzgzLDYgQEAKIHsKIAlzdHJ1Y3QgaWRsZV9zdGF0ZWRhdGEgKmN4ID0gc3RhdGVfcHRyICsgaW5kZXg7CiAJdTMyIG1wdXNzX2Nhbl9sb3NlX2NvbnRleHQgPSAwOwotCWludCBjcHVfaWQgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKIAkvKgogCSAqIENQVTAgaGFzIHRvIHdhaXQgYW5kIHN0YXkgT04gdW50aWwgQ1BVMSBpcyBPRkYgc3RhdGUuCkBAIC0xMTIsNyArMTEwLDcgQEAKIAltcHVzc19jYW5fbG9zZV9jb250ZXh0ID0gKGN4LT5tcHVfc3RhdGUgPT0gUFdSRE1fUE9XRVJfUkVUKSAmJgogCQkJCSAoY3gtPm1wdV9sb2dpY19zdGF0ZSA9PSBQV1JETV9QT1dFUl9PRkYpOwogCi0JY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VOVEVSLCAmY3B1X2lkKTsKKwl0aWNrX2Jyb2FkY2FzdF9lbnRlcigpOwogCiAJLyoKIAkgKiBDYWxsIGlkbGUgQ1BVIFBNIGVudGVyIG5vdGlmaWVyIGNoYWluIHNvIHRoYXQKQEAgLTE2OSw3ICsxNjcsNyBAQAogCWlmIChkZXYtPmNwdSA9PSAwICYmIG1wdXNzX2Nhbl9sb3NlX2NvbnRleHQpCiAJCWNwdV9jbHVzdGVyX3BtX2V4aXQoKTsKIAotCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElULCAmY3B1X2lkKTsKKwl0aWNrX2Jyb2FkY2FzdF9leGl0KCk7CiAKIGZhaWw6CiAJY3B1aWRsZV9jb3VwbGVkX3BhcmFsbGVsX2JhcnJpZXIoZGV2LCAmYWJvcnRfYmFycmllcik7CkBAIC0xODQsOCArMTgyLDcgQEAKICAqLwogc3RhdGljIHZvaWQgb21hcF9zZXR1cF9icm9hZGNhc3RfdGltZXIodm9pZCAqYXJnKQogewotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OLCAmY3B1KTsKKwl0aWNrX2Jyb2FkY2FzdF9lbmFibGUoKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjcHVpZGxlX2RyaXZlciBvbWFwNF9pZGxlX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvaHNtbWMuYwppbmRleCBkYzZlNzljLi45YTg2MTFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2hzbW1jLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9oc21tYy5jCkBAIC0xNTAsOSArMTUwLDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgb21hcF9oc21tY19tdXgoc3RydWN0IG9tYXBfaHNtbWNfcGxhdGZvcm1fZGF0YQogCQkJCSAgKm1tY19jb250cm9sbGVyLCBpbnQgY29udHJvbGxlcl9ucikKIHsKLQlpZiAoZ3Bpb19pc192YWxpZChtbWNfY29udHJvbGxlci0+c3dpdGNoX3BpbikgJiYKLQkgICAgKG1tY19jb250cm9sbGVyLT5zd2l0Y2hfcGluIDwgT01BUF9NQVhfR1BJT19MSU5FUykpCi0JCW9tYXBfbXV4X2luaXRfZ3BpbyhtbWNfY29udHJvbGxlci0+c3dpdGNoX3BpbiwKKwlpZiAoZ3Bpb19pc192YWxpZChtbWNfY29udHJvbGxlci0+Z3Bpb19jZCkgJiYKKwkgICAgKG1tY19jb250cm9sbGVyLT5ncGlvX2NkIDwgT01BUF9NQVhfR1BJT19MSU5FUykpCisJCW9tYXBfbXV4X2luaXRfZ3BpbyhtbWNfY29udHJvbGxlci0+Z3Bpb19jZCwKKwkJCQkgICBPTUFQX1BJTl9JTlBVVF9QVUxMVVApOworCWlmIChncGlvX2lzX3ZhbGlkKG1tY19jb250cm9sbGVyLT5ncGlvX2NvZCkgJiYKKwkgICAgKG1tY19jb250cm9sbGVyLT5ncGlvX2NvZCA8IE9NQVBfTUFYX0dQSU9fTElORVMpKQorCQlvbWFwX211eF9pbml0X2dwaW8obW1jX2NvbnRyb2xsZXItPmdwaW9fY29kLAogCQkJCSAgIE9NQVBfUElOX0lOUFVUX1BVTExVUCk7CiAJaWYgKGdwaW9faXNfdmFsaWQobW1jX2NvbnRyb2xsZXItPmdwaW9fd3ApICYmCiAJICAgIChtbWNfY29udHJvbGxlci0+Z3Bpb193cCA8IE9NQVBfTUFYX0dQSU9fTElORVMpKQpAQCAtMjUwLDE1ICsyNTQsMjAgQEAKIAltbWMtPmludGVybmFsX2Nsb2NrID0gIWMtPmV4dF9jbG9jazsKIAltbWMtPnJlZ19vZmZzZXQgPSAwOwogCi0JbW1jLT5zd2l0Y2hfcGluID0gYy0+Z3Bpb19jZDsKKwlpZiAoYy0+Y292ZXJfb25seSkgeworCQkvKiBkZXRlY3QgaWYgbW9iaWxlIHBob25lIGNvdmVyIHJlbW92ZWQgKi8KKwkJbW1jLT5ncGlvX2NkID0gLUVJTlZBTDsKKwkJbW1jLT5ncGlvX2NvZCA9IGMtPmdwaW9fY2Q7CisJfSBlbHNlIHsKKwkJLyogY2FyZCBkZXRlY3QgcGluIG9uIHRoZSBtbWMgc29ja2V0IGl0c2VsZiAqLworCQltbWMtPmdwaW9fY2QgPSBjLT5ncGlvX2NkOworCQltbWMtPmdwaW9fY29kID0gLUVJTlZBTDsKKwl9CiAJbW1jLT5ncGlvX3dwID0gYy0+Z3Bpb193cDsKIAogCW1tYy0+cmVtdXggPSBjLT5yZW11eDsKIAltbWMtPmluaXRfY2FyZCA9IGMtPmluaXRfY2FyZDsKIAotCWlmIChjLT5jb3Zlcl9vbmx5KQotCQltbWMtPmNvdmVyID0gMTsKLQogCWlmIChjLT5ub25yZW1vdmFibGUpCiAJCW1tYy0+bm9ucmVtb3ZhYmxlID0gMTsKIApAQCAtMzU4LDcgKzM2NywxNSBAQAogCQlpZiAoIW1tY19wZGF0YSkKIAkJCWNvbnRpbnVlOwogCi0JCW1tY19wZGF0YS0+c3dpdGNoX3BpbiA9IGMtPmdwaW9fY2Q7CisJCWlmIChjLT5jb3Zlcl9vbmx5KSB7CisJCQkvKiBkZXRlY3QgaWYgbW9iaWxlIHBob25lIGNvdmVyIHJlbW92ZWQgKi8KKwkJCW1tY19wZGF0YS0+Z3Bpb19jZCA9IC1FSU5WQUw7CisJCQltbWNfcGRhdGEtPmdwaW9fY29kID0gYy0+Z3Bpb19jZDsKKwkJfSBlbHNlIHsKKwkJCS8qIGNhcmQgZGV0ZWN0IHBpbiBvbiB0aGUgbW1jIHNvY2tldCBpdHNlbGYgKi8KKwkJCW1tY19wZGF0YS0+Z3Bpb19jZCA9IGMtPmdwaW9fY2Q7CisJCQltbWNfcGRhdGEtPmdwaW9fY29kID0gLUVJTlZBTDsKKwkJfQogCQltbWNfcGRhdGEtPmdwaW9fd3AgPSBjLT5ncGlvX3dwOwogCiAJCXJlcyA9IG9tYXBfZGV2aWNlX3JlZ2lzdGVyKHBkZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9pZC5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9pZC5jCmluZGV4IDJhMmY0ZDUuLjI1ZjFiZWUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvaWQuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2lkLmMKQEAgLTcyMCw2ICs3MjAsOCBAQAogCQlyZXR1cm4ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJPTUFQNCIpOwogCWVsc2UgaWYgKHNvY19pc19vbWFwNTR4eCgpKQogCQlyZXR1cm4ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJPTUFQNSIpOworCWVsc2UgaWYgKHNvY19pc19hbTMzeHgoKSB8fCBzb2NfaXNfYW0zMzV4KCkpCisJCXJldHVybiBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIkFNMzN4eCIpOwogCWVsc2UgaWYgKHNvY19pc19hbTQzeHgoKSkKIAkJcmV0dXJuIGthc3ByaW50ZihHRlBfS0VSTkVMLCAiQU00M3h4Iik7CiAJZWxzZSBpZiAoc29jX2lzX2RyYTd4eCgpKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXdha2V1cGdlbi5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXdha2V1cGdlbi5jCmluZGV4IGY5NjFjNDYuLjNiNTY3MjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC13YWtldXBnZW4uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtd2FrZXVwZ2VuLmMKQEAgLTIwLDExICsyMCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdV9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvYXJtLWdpYy5oPgogCiAjaW5jbHVkZSAib21hcC13YWtldXBnZW4uaCIKICNpbmNsdWRlICJvbWFwLXNlY3VyZS5oIgpAQCAtNzgsMjkgKzc5LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IF93YWtldXBnZW5fZ2V0X2lycV9pbmZvKHUzMiBpcnEsIHUzMiAqYml0X3Bvc24sIHU4ICpyZWdfaW5kZXgpCiB7Ci0JdW5zaWduZWQgaW50IHNwaV9pcnE7Ci0KLQkvKgotCSAqIFBQSXMgYW5kIFNHSXMgYXJlIG5vdCBzdXBwb3J0ZWQuCi0JICovCi0JaWYgKGlycSA8IE9NQVA0NFhYX0lSUV9HSUNfU1RBUlQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyoKLQkgKiBTdWJ0cmFjdCB0aGUgR0lDIG9mZnNldC4KLQkgKi8KLQlzcGlfaXJxID0gaXJxIC0gT01BUDQ0WFhfSVJRX0dJQ19TVEFSVDsKLQlpZiAoc3BpX2lycSA+IE1BWF9JUlFTKSB7Ci0JCXByX2Vycigib21hcCB3YWtldXBHZW46IEludmFsaWQgSVJRJWRcbiIsIGlycSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCS8qCiAJICogRWFjaCBXYWtldXBHZW4gcmVnaXN0ZXIgY29udHJvbHMgMzIgaW50ZXJydXB0LgogCSAqIGkuZS4gMSBiaXQgcGVyIFNQSSBJUlEKIAkgKi8KLQkqcmVnX2luZGV4ID0gc3BpX2lycSA+PiA1OwotCSpiaXRfcG9zbiA9IHNwaV9pcnEgJT0gMzI7CisJKnJlZ19pbmRleCA9IGlycSA+PiA1OworCSpiaXRfcG9zbiA9IGlycSAlPSAzMjsKIAogCXJldHVybiAwOwogfQpAQCAtMTQxLDYgKzEyNSw3IEBACiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZ3YWtldXBnZW5fbG9jaywgZmxhZ3MpOwogCV93YWtldXBnZW5fY2xlYXIoZC0+aHdpcnEsIGlycV90YXJnZXRfY3B1W2QtPmh3aXJxXSk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndha2V1cGdlbl9sb2NrLCBmbGFncyk7CisJaXJxX2NoaXBfbWFza19wYXJlbnQoZCk7CiB9CiAKIC8qCkBAIC0xNTMsNiArMTM4LDcgQEAKIAlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJndha2V1cGdlbl9sb2NrLCBmbGFncyk7CiAJX3dha2V1cGdlbl9zZXQoZC0+aHdpcnEsIGlycV90YXJnZXRfY3B1W2QtPmh3aXJxXSk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndha2V1cGdlbl9sb2NrLCBmbGFncyk7CisJaXJxX2NoaXBfdW5tYXNrX3BhcmVudChkKTsKIH0KIAogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpAQCAtNDAwLDE1ICszODYsOTEgQEAKIAlyZXR1cm4gb21hcF9zZWN1cmVfYXBpczsKIH0KIAorc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB3YWtldXBnZW5fY2hpcCA9IHsKKwkubmFtZQkJCT0gIldVR0VOIiwKKwkuaXJxX2VvaQkJPSBpcnFfY2hpcF9lb2lfcGFyZW50LAorCS5pcnFfbWFzawkJPSB3YWtldXBnZW5fbWFzaywKKwkuaXJxX3VubWFzawkJPSB3YWtldXBnZW5fdW5tYXNrLAorCS5pcnFfcmV0cmlnZ2VyCQk9IGlycV9jaGlwX3JldHJpZ2dlcl9oaWVyYXJjaHksCisJLmZsYWdzCQkJPSBJUlFDSElQX1NLSVBfU0VUX1dBS0UgfCBJUlFDSElQX01BU0tfT05fU1VTUEVORCwKKyNpZmRlZiBDT05GSUdfU01QCisJLmlycV9zZXRfYWZmaW5pdHkJPSBpcnFfY2hpcF9zZXRfYWZmaW5pdHlfcGFyZW50LAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IHdha2V1cGdlbl9kb21haW5feGxhdGUoc3RydWN0IGlycV9kb21haW4gKmRvbWFpbiwKKwkJCQkgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKKwkJCQkgIGNvbnN0IHUzMiAqaW50c3BlYywKKwkJCQkgIHVuc2lnbmVkIGludCBpbnRzaXplLAorCQkJCSAgdW5zaWduZWQgbG9uZyAqb3V0X2h3aXJxLAorCQkJCSAgdW5zaWduZWQgaW50ICpvdXRfdHlwZSkKK3sKKwlpZiAoZG9tYWluLT5vZl9ub2RlICE9IGNvbnRyb2xsZXIpCisJCXJldHVybiAtRUlOVkFMOwkvKiBTaG91bGRuJ3QgaGFwcGVuLCByZWFsbHkuLi4gKi8KKwlpZiAoaW50c2l6ZSAhPSAzKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogTm90IEdJQyBjb21wbGlhbnQgKi8KKwlpZiAoaW50c3BlY1swXSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogTm8gUFBJIHNob3VsZCBwb2ludCB0byB0aGlzIGRvbWFpbiAqLworCisJKm91dF9od2lycSA9IGludHNwZWNbMV07CisJKm91dF90eXBlID0gaW50c3BlY1syXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3YWtldXBnZW5fZG9tYWluX2FsbG9jKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sCisJCQkJICB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCQkgIHVuc2lnbmVkIGludCBucl9pcnFzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmFyZ3MgPSBkYXRhOworCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgcGFyZW50X2FyZ3M7CisJaXJxX2h3X251bWJlcl90IGh3aXJxOworCWludCBpOworCisJaWYgKGFyZ3MtPmFyZ3NfY291bnQgIT0gMykKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIE5vdCBHSUMgY29tcGxpYW50ICovCisJaWYgKGFyZ3MtPmFyZ3NbMF0gIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIE5vIFBQSSBzaG91bGQgcG9pbnQgdG8gdGhpcyBkb21haW4gKi8KKworCWh3aXJxID0gYXJncy0+YXJnc1sxXTsKKwlpZiAoaHdpcnEgPj0gTUFYX0lSUVMpCisJCXJldHVybiAtRUlOVkFMOwkvKiBDYW4ndCBkZWFsIHdpdGggdGhpcyAqLworCisJZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykKKwkJaXJxX2RvbWFpbl9zZXRfaHdpcnFfYW5kX2NoaXAoZG9tYWluLCB2aXJxICsgaSwgaHdpcnEgKyBpLAorCQkJCQkgICAgICAmd2FrZXVwZ2VuX2NoaXAsIE5VTEwpOworCisJcGFyZW50X2FyZ3MgPSAqYXJnczsKKwlwYXJlbnRfYXJncy5ucCA9IGRvbWFpbi0+cGFyZW50LT5vZl9ub2RlOworCXJldHVybiBpcnFfZG9tYWluX2FsbG9jX2lycXNfcGFyZW50KGRvbWFpbiwgdmlycSwgbnJfaXJxcywgJnBhcmVudF9hcmdzKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluX29wcyB3YWtldXBnZW5fZG9tYWluX29wcyA9IHsKKwkueGxhdGUJPSB3YWtldXBnZW5fZG9tYWluX3hsYXRlLAorCS5hbGxvYwk9IHdha2V1cGdlbl9kb21haW5fYWxsb2MsCisJLmZyZWUJPSBpcnFfZG9tYWluX2ZyZWVfaXJxc19jb21tb24sCit9OworCiAvKgogICogSW5pdGlhbGlzZSB0aGUgd2FrZXVwZ2VuIG1vZHVsZS4KICAqLwotaW50IF9faW5pdCBvbWFwX3dha2V1cGdlbl9pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCB3YWtldXBnZW5faW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KQogeworCXN0cnVjdCBpcnFfZG9tYWluICpwYXJlbnRfZG9tYWluLCAqZG9tYWluOwogCWludCBpOwogCXVuc2lnbmVkIGludCBib290X2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl1MzIgdmFsOwogCisJaWYgKCFwYXJlbnQpIHsKKwkJcHJfZXJyKCIlczogbm8gcGFyZW50LCBnaXZpbmcgdXBcbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBhcmVudF9kb21haW4gPSBpcnFfZmluZF9ob3N0KHBhcmVudCk7CisJaWYgKCFwYXJlbnRfZG9tYWluKSB7CisJCXByX2VycigiJXM6IHVuYWJsZSB0byBvYnRhaW4gcGFyZW50IGRvbWFpblxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CiAJLyogTm90IHN1cHBvcnRlZCBvbiBPTUFQNCBFUzEuMCBzaWxpY29uICovCiAJaWYgKG9tYXBfcmV2KCkgPT0gT01BUDQ0MzBfUkVWX0VTMV8wKSB7CiAJCVdBUk4oMSwgIldha2V1cEdlbjogTm90IHN1cHBvcnRlZCBvbiBPTUFQNDQzMCBFUzEuMFxuIik7CkBAIC00MTYsNyArNDc4LDcgQEAKIAl9CiAKIAkvKiBTdGF0aWMgbWFwcGluZywgbmV2ZXIgcmVsZWFzZWQgKi8KLQl3YWtldXBnZW5fYmFzZSA9IGlvcmVtYXAoT01BUF9XS1VQR0VOX0JBU0UsIFNaXzRLKTsKKwl3YWtldXBnZW5fYmFzZSA9IG9mX2lvbWFwKG5vZGUsIDApOwogCWlmIChXQVJOX09OKCF3YWtldXBnZW5fYmFzZSkpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC00MjksNiArNDkxLDE0IEBACiAJCW1heF9pcnFzID0gQU00M1hYX0lSUVM7CiAJfQogCisJZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfaGllcmFyY2h5KHBhcmVudF9kb21haW4sIDAsIG1heF9pcnFzLAorCQkJCQkgIG5vZGUsICZ3YWtldXBnZW5fZG9tYWluX29wcywKKwkJCQkJICBOVUxMKTsKKwlpZiAoIWRvbWFpbikgeworCQlpb3VubWFwKHdha2V1cGdlbl9iYXNlKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJLyogQ2xlYXIgYWxsIElSUSBiaXRtYXNrcyBhdCB3YWtldXBHZW4gbGV2ZWwgKi8KIAlmb3IgKGkgPSAwOyBpIDwgaXJxX2JhbmtzOyBpKyspIHsKIAkJd2FrZXVwZ2VuX3dyaXRlbCgwLCBpLCBDUFUwX0lEKTsKQEAgLTQzNywxNCArNTA3LDYgQEAKIAl9CiAKIAkvKgotCSAqIE92ZXJyaWRlIEdJQyBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgZnVuY3Rpb25zIHRvIGFkZAotCSAqIE9NQVAgV2FrZXVwR2VuIGludGVycnVwdCBjb250cm9sbGVyIGFsb25nIHdpdGggR0lDCi0JICovCi0JZ2ljX2FyY2hfZXh0bi5pcnFfbWFzayA9IHdha2V1cGdlbl9tYXNrOwotCWdpY19hcmNoX2V4dG4uaXJxX3VubWFzayA9IHdha2V1cGdlbl91bm1hc2s7Ci0JZ2ljX2FyY2hfZXh0bi5mbGFncyA9IElSUUNISVBfTUFTS19PTl9TVVNQRU5EIHwgSVJRQ0hJUF9TS0lQX1NFVF9XQUtFOwotCi0JLyoKIAkgKiBGSVhNRTogQWRkIHN1cHBvcnQgdG8gc2V0X3NtcF9hZmZpbml0eSgpIG9uY2UgdGhlIGNvcmUKIAkgKiBHSUMgY29kZSBoYXMgbmVjZXNzYXJ5IGhvb2tzIGluIHBsYWNlLgogCSAqLwpAQCAtNDc0LDMgKzUzNiw5IEBACiAKIAlyZXR1cm4gMDsKIH0KKworLyoKKyAqIFdlIGNhbm5vdCB1c2UgdGhlIElSUUNISVBfREVDTEFSRSBtYWNybyB0aGF0IGxpdmVzIGluCisgKiBkcml2ZXJzL2lycWNoaXAsIHNvIHdlJ3JlIGZvcmNlZCB0byByb2xsIG91ciBvd24uIE5vdCB2ZXJ5IG5pY2UuCisgKi8KK09GX0RFQ0xBUkVfMihpcnFjaGlwLCB0aV93YWtldXBnZW4sICJ0aSxvbWFwNC13dWdlbi1tcHUiLCB3YWtldXBnZW5faW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtd2FrZXVwZ2VuLmggYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXAtd2FrZXVwZ2VuLmgKaW5kZXggYjNjOGVjYy4uYTM0OTFhZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwLXdha2V1cGdlbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcC13YWtldXBnZW4uaApAQCAtMzMsNyArMzMsNiBAQAogI2RlZmluZSBPTUFQX1RJTUVTVEFNUENZQ0xFTE8JCQkweGMwOAogI2RlZmluZSBPTUFQX1RJTUVTVEFNUENZQ0xFSEkJCQkweGMwYwogCi1leHRlcm4gaW50IF9faW5pdCBvbWFwX3dha2V1cGdlbl9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgX19pb21lbSAqb21hcF9nZXRfd2FrZXVwZ2VuX2Jhc2Uodm9pZCk7CiBleHRlcm4gaW50IG9tYXBfc2VjdXJlX2FwaXNfc3VwcG9ydCh2b2lkKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwNC1jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcDQtY29tbW9uLmMKaW5kZXggY2VlMGZlMS4uN2JiMTE2YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwNC1jb21tb24uYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXA0LWNvbW1vbi5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2FybS1naWMuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2lycS1jcm9zc2Jhci5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgpAQCAtMjQyLDI2ICsyNDEsMjYgQEAKIH0KIG9tYXBfZWFybHlfaW5pdGNhbGwob21hcDRfc2FyX3JhbV9pbml0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZ2ljX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWE5LWdpYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJhcm0sY29ydGV4LWExNS1naWMiLCB9LAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaW50Y19tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAidGksb21hcDQtd3VnZW4tbXB1IiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLG9tYXA1LXd1Z2VuLW1wdSIsIH0sCiAJeyB9LAogfTsKIAotc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZ2ljX25vZGU7CitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICppbnRjX25vZGU7CiAKIHVuc2lnbmVkIGludCBvbWFwNF94bGF0ZV9pcnEodW5zaWduZWQgaW50IGh3aXJxKQogewogCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgaXJxX2RhdGE7CiAJdW5zaWduZWQgaW50IGlycTsKIAotCWlmICghZ2ljX25vZGUpCi0JCWdpY19ub2RlID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIGdpY19tYXRjaCk7CisJaWYgKCFpbnRjX25vZGUpCisJCWludGNfbm9kZSA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCBpbnRjX21hdGNoKTsKIAotCWlmIChXQVJOX09OKCFnaWNfbm9kZSkpCisJaWYgKFdBUk5fT04oIWludGNfbm9kZSkpCiAJCXJldHVybiBod2lycTsKIAotCWlycV9kYXRhLm5wID0gZ2ljX25vZGU7CisJaXJxX2RhdGEubnAgPSBpbnRjX25vZGU7CiAJaXJxX2RhdGEuYXJnc19jb3VudCA9IDM7CiAJaXJxX2RhdGEuYXJnc1swXSA9IDA7CiAJaXJxX2RhdGEuYXJnc1sxXSA9IGh3aXJxIC0gT01BUDQ0WFhfSVJRX0dJQ19TVEFSVDsKQEAgLTI3OCw2ICsyNzcsMTIgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCisJaW50Y19ub2RlID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIGludGNfbWF0Y2gpOworCWlmIChXQVJOX09OKCFpbnRjX25vZGUpKSB7CisJCXByX2VycigiTm8gV1VHRU4gZm91bmQgaW4gRFQsIHN5c3RlbSB3aWxsIG1pc2JlaGF2ZS5cbiIpOworCQlwcl9lcnIoIlVQREFURSBZT1VSIERFVklDRSBUUkVFIVxuIik7CisJfQorCiAJLyogRXh0cmFjdCBHSUMgZGlzdHJpYnV0b3IgYW5kIFRXRCBiYXNlcyBmb3IgT01BUDQ0NjAgUk9NIEVycmF0YSBXQSAqLwogCWlmICghY3B1X2lzX29tYXA0NDZ4KCkpCiAJCWdvdG8gc2tpcF9lcnJhdGFfaW5pdDsKQEAgLTI5MSw5ICsyOTYsNSBAQAogCVdBUk5fT04oIXR3ZF9iYXNlKTsKIAogc2tpcF9lcnJhdGFfaW5pdDoKLQlvbWFwX3dha2V1cGdlbl9pbml0KCk7Ci0jaWZkZWYgQ09ORklHX0lSUV9DUk9TU0JBUgotCWlycWNyb3NzYmFyX2luaXQoKTsKLSNlbmRpZgogCWlycWNoaXBfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jCmluZGV4IDg3YTEyZDYuLmIwMmYzOTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKQEAgLTU0MCwzNyArNTQwLDMzIEBACiAKIGludCBfX2luaXQgb3Jpb241eF9wY2lfc3lzX3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQogewotCWludCByZXQgPSAwOwotCiAJdmdhX2Jhc2UgPSBPUklPTjVYX1BDSUVfTUVNX1BIWVNfQkFTRTsKIAogCWlmIChuciA9PSAwKSB7CiAJCW9yaW9uX3BjaWVfc2V0X2xvY2FsX2J1c19ucihQQ0lFX0JBU0UsIHN5cy0+YnVzbnIpOwotCQlyZXQgPSBwY2llX3NldHVwKHN5cyk7Ci0JfSBlbHNlIGlmIChuciA9PSAxICYmICFvcmlvbjV4X3BjaV9kaXNhYmxlZCkgewotCQlvcmlvbjV4X3BjaV9zZXRfYnVzX25yKHN5cy0+YnVzbnIpOwotCQlyZXQgPSBwY2lfc2V0dXAoc3lzKTsKKwkJcmV0dXJuIHBjaWVfc2V0dXAoc3lzKTsKIAl9CiAKLQlyZXR1cm4gcmV0OworCWlmIChuciA9PSAxICYmICFvcmlvbjV4X3BjaV9kaXNhYmxlZCkgeworCQlvcmlvbjV4X3BjaV9zZXRfYnVzX25yKHN5cy0+YnVzbnIpOworCQlyZXR1cm4gcGNpX3NldHVwKHN5cyk7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0cnVjdCBwY2lfYnVzIF9faW5pdCAqb3Jpb241eF9wY2lfc3lzX3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKQogewotCXN0cnVjdCBwY2lfYnVzICpidXM7CisJaWYgKG5yID09IDApCisJCXJldHVybiBwY2lfc2Nhbl9yb290X2J1cyhOVUxMLCBzeXMtPmJ1c25yLCAmcGNpZV9vcHMsIHN5cywKKwkJCQkJICZzeXMtPnJlc291cmNlcyk7CiAKLQlpZiAobnIgPT0gMCkgewotCQlidXMgPSBwY2lfc2Nhbl9yb290X2J1cyhOVUxMLCBzeXMtPmJ1c25yLCAmcGNpZV9vcHMsIHN5cywKLQkJCQkJJnN5cy0+cmVzb3VyY2VzKTsKLQl9IGVsc2UgaWYgKG5yID09IDEgJiYgIW9yaW9uNXhfcGNpX2Rpc2FibGVkKSB7Ci0JCWJ1cyA9IHBjaV9zY2FuX3Jvb3RfYnVzKE5VTEwsIHN5cy0+YnVzbnIsICZwY2lfb3BzLCBzeXMsCi0JCQkJCSZzeXMtPnJlc291cmNlcyk7Ci0JfSBlbHNlIHsKLQkJYnVzID0gTlVMTDsKLQkJQlVHKCk7Ci0JfQorCWlmIChuciA9PSAxICYmICFvcmlvbjV4X3BjaV9kaXNhYmxlZCkKKwkJcmV0dXJuIHBjaV9zY2FuX3Jvb3RfYnVzKE5VTEwsIHN5cy0+YnVzbnIsICZwY2lfb3BzLCBzeXMsCisJCQkJCSAmc3lzLT5yZXNvdXJjZXMpOwogCi0JcmV0dXJuIGJ1czsKKwlCVUcoKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogaW50IF9faW5pdCBvcmlvbjV4X3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtcHhhL2lycS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvaXJxLmMKaW5kZXggMGVlY2Q4My4uODlhN2MwNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvaXJxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1weGEvaXJxLmMKQEAgLTExLDYgKzExLDcgQEAKICAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgpAQCAtNDAsNyArNDEsNiBAQAogI2RlZmluZSBJQ0hQX1ZBTF9JUlEJCSgxIDw8IDMxKQogI2RlZmluZSBJQ0hQX0lSUShpKQkJKCgoaSkgPj4gMTYpICYgMHg3ZmZmKQogI2RlZmluZSBJUFJfVkFMSUQJCSgxIDw8IDMxKQotI2RlZmluZSBJUlFfQklUKG4pCQkoKChuKSAtIFBYQV9JUlEoMCkpICYgMHgxZikKIAogI2RlZmluZSBNQVhfSU5URVJOQUxfSVJRUwkxMjgKIApAQCAtNTEsNiArNTEsNyBAQAogc3RhdGljIHZvaWQgX19pb21lbSAqcHhhX2lycV9iYXNlOwogc3RhdGljIGludCBweGFfaW50ZXJuYWxfaXJxX25yOwogc3RhdGljIGJvb2wgY3B1X2hhc19pcHI7CitzdGF0aWMgc3RydWN0IGlycV9kb21haW4gKnB4YV9pcnFfZG9tYWluOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19pb21lbSAqaXJxX2Jhc2UoaW50IGkpCiB7CkBAIC02NiwxOCArNjcsMjAgQEAKIHZvaWQgcHhhX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlpcnFfaHdfbnVtYmVyX3QgaXJxID0gaXJxZF90b19od2lycShkKTsKIAl1aW50MzJfdCBpY21yID0gX19yYXdfcmVhZGwoYmFzZSArIElDTVIpOwogCi0JaWNtciAmPSB+KDEgPDwgSVJRX0JJVChkLT5pcnEpKTsKKwlpY21yICY9IH5CSVQoaXJxICYgMHgxZik7CiAJX19yYXdfd3JpdGVsKGljbXIsIGJhc2UgKyBJQ01SKTsKIH0KIAogdm9pZCBweGFfdW5tYXNrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJaXJxX2h3X251bWJlcl90IGlycSA9IGlycWRfdG9faHdpcnEoZCk7CiAJdWludDMyX3QgaWNtciA9IF9fcmF3X3JlYWRsKGJhc2UgKyBJQ01SKTsKIAotCWljbXIgfD0gMSA8PCBJUlFfQklUKGQtPmlycSk7CisJaWNtciB8PSBCSVQoaXJxICYgMHgxZik7CiAJX19yYXdfd3JpdGVsKGljbXIsIGJhc2UgKyBJQ01SKTsKIH0KIApAQCAtMTE4LDQwICsxMjEsNjMgQEAKIAl9IHdoaWxlICgxKTsKIH0KIAotdm9pZCBfX2luaXQgcHhhX2luaXRfaXJxKGludCBpcnFfbnIsIGludCAoKmZuKShzdHJ1Y3QgaXJxX2RhdGEgKiwgdW5zaWduZWQgaW50KSkKK3N0YXRpYyBpbnQgcHhhX2lycV9tYXAoc3RydWN0IGlycV9kb21haW4gKmgsIHVuc2lnbmVkIGludCB2aXJxLAorCQkgICAgICAgaXJxX2h3X251bWJlcl90IGh3KQogewotCWludCBpcnEsIGksIG47CisJdm9pZCBfX2lvbWVtICpiYXNlID0gaXJxX2Jhc2UoaHcgLyAzMik7CiAKLQlCVUdfT04oaXJxX25yID4gTUFYX0lOVEVSTkFMX0lSUVMpOworCS8qIGluaXRpYWxpemUgaW50ZXJydXB0IHByaW9yaXR5ICovCisJaWYgKGNwdV9oYXNfaXByKQorCQlfX3Jhd193cml0ZWwoaHcgfCBJUFJfVkFMSUQsIHB4YV9pcnFfYmFzZSArIElQUihodykpOworCisJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZweGFfaW50ZXJuYWxfaXJxX2NoaXAsCisJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOworCWlycV9zZXRfY2hpcF9kYXRhKHZpcnEsIGJhc2UpOworCXNldF9pcnFfZmxhZ3ModmlycSwgSVJRRl9WQUxJRCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluX29wcyBweGFfaXJxX29wcyA9IHsKKwkubWFwICAgID0gcHhhX2lycV9tYXAsCisJLnhsYXRlICA9IGlycV9kb21haW5feGxhdGVfb25lY2VsbCwKK307CisKK3N0YXRpYyBfX2luaXQgdm9pZAorcHhhX2luaXRfaXJxX2NvbW1vbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIGludCBpcnFfbnIsCisJCSAgICBpbnQgKCpmbikoc3RydWN0IGlycV9kYXRhICosIHVuc2lnbmVkIGludCkpCit7CisJaW50IG47CiAKIAlweGFfaW50ZXJuYWxfaXJxX25yID0gaXJxX25yOwotCWNwdV9oYXNfaXByID0gIWNwdV9pc19weGEyNXgoKTsKLQlweGFfaXJxX2Jhc2UgPSBpb19wMnYoMHg0MGQwMDAwMCk7CisJcHhhX2lycV9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9sZWdhY3kobm9kZSwgaXJxX25yLAorCQkJCQkgICAgICAgUFhBX0lSUSgwKSwgMCwKKwkJCQkJICAgICAgICZweGFfaXJxX29wcywgTlVMTCk7CisJaWYgKCFweGFfaXJxX2RvbWFpbikKKwkJcGFuaWMoIlVuYWJsZSB0byBhZGQgUFhBIElSUSBkb21haW5cbiIpOworCWlycV9zZXRfZGVmYXVsdF9ob3N0KHB4YV9pcnFfZG9tYWluKTsKIAogCWZvciAobiA9IDA7IG4gPCBpcnFfbnI7IG4gKz0gMzIpIHsKIAkJdm9pZCBfX2lvbWVtICpiYXNlID0gaXJxX2Jhc2UobiA+PiA1KTsKIAogCQlfX3Jhd193cml0ZWwoMCwgYmFzZSArIElDTVIpOwkvKiBkaXNhYmxlIGFsbCBJUlFzICovCiAJCV9fcmF3X3dyaXRlbCgwLCBiYXNlICsgSUNMUik7CS8qIGFsbCBJUlFzIGFyZSBJUlEsIG5vdCBGSVEgKi8KLQkJZm9yIChpID0gbjsgKGkgPCAobiArIDMyKSkgJiYgKGkgPCBpcnFfbnIpOyBpKyspIHsKLQkJCS8qIGluaXRpYWxpemUgaW50ZXJydXB0IHByaW9yaXR5ICovCi0JCQlpZiAoY3B1X2hhc19pcHIpCi0JCQkJX19yYXdfd3JpdGVsKGkgfCBJUFJfVkFMSUQsIHB4YV9pcnFfYmFzZSArIElQUihpKSk7Ci0KLQkJCWlycSA9IFBYQV9JUlEoaSk7Ci0JCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmcHhhX2ludGVybmFsX2lycV9jaGlwLAotCQkJCQkJIGhhbmRsZV9sZXZlbF9pcnEpOwotCQkJaXJxX3NldF9jaGlwX2RhdGEoaXJxLCBiYXNlKTsKLQkJCXNldF9pcnFfZmxhZ3MoaXJxLCBJUlFGX1ZBTElEKTsKLQkJfQogCX0KLQogCS8qIG9ubHkgdW5tYXNrZWQgaW50ZXJydXB0cyBraWNrIHVzIG91dCBvZiBpZGxlICovCiAJX19yYXdfd3JpdGVsKDEsIGlycV9iYXNlKDApICsgSUNDUik7CiAKIAlweGFfaW50ZXJuYWxfaXJxX2NoaXAuaXJxX3NldF93YWtlID0gZm47CiB9CiAKK3ZvaWQgX19pbml0IHB4YV9pbml0X2lycShpbnQgaXJxX25yLCBpbnQgKCpmbikoc3RydWN0IGlycV9kYXRhICosIHVuc2lnbmVkIGludCkpCit7CisJQlVHX09OKGlycV9uciA+IE1BWF9JTlRFUk5BTF9JUlFTKTsKKworCXB4YV9pcnFfYmFzZSA9IGlvX3AydigweDQwZDAwMDAwKTsKKwljcHVfaGFzX2lwciA9ICFjcHVfaXNfcHhhMjV4KCk7CisJcHhhX2luaXRfaXJxX2NvbW1vbihOVUxMLCBpcnFfbnIsIGZuKTsKK30KKwogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2F2ZWRfaWNtcltNQVhfSU5URVJOQUxfSVJRUy8zMl07CiBzdGF0aWMgdW5zaWduZWQgbG9uZyBzYXZlZF9pcHJbTUFYX0lOVEVSTkFMX0lSUVNdOwpAQCAtMjAzLDMwICsyMjksNiBAQAogfTsKIAogI2lmZGVmIENPTkZJR19PRgotc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluICpweGFfaXJxX2RvbWFpbjsKLQotc3RhdGljIGludCBweGFfaXJxX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqaCwgdW5zaWduZWQgaW50IHZpcnEsCi0JCSAgICAgICBpcnFfaHdfbnVtYmVyX3QgaHcpCi17Ci0Jdm9pZCBfX2lvbWVtICpiYXNlID0gaXJxX2Jhc2UoaHcgLyAzMik7Ci0KLQkvKiBpbml0aWFsaXplIGludGVycnVwdCBwcmlvcml0eSAqLwotCWlmIChjcHVfaGFzX2lwcikKLQkJX19yYXdfd3JpdGVsKGh3IHwgSVBSX1ZBTElELCBweGFfaXJxX2Jhc2UgKyBJUFIoaHcpKTsKLQotCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihodywgJnB4YV9pbnRlcm5hbF9pcnFfY2hpcCwKLQkJCQkgaGFuZGxlX2xldmVsX2lycSk7Ci0JaXJxX3NldF9jaGlwX2RhdGEoaHcsIGJhc2UpOwotCXNldF9pcnFfZmxhZ3MoaHcsIElSUUZfVkFMSUQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgcHhhX2lycV9vcHMgPSB7Ci0JLm1hcCAgICA9IHB4YV9pcnFfbWFwLAotCS54bGF0ZSAgPSBpcnFfZG9tYWluX3hsYXRlX29uZWNlbGwsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbnRjX2lkc1tdIF9faW5pdGNvbnN0ID0gewogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxweGEtaW50YyIsIH0sCiAJe30KQEAgLTIzNiw3ICsyMzgsNyBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwotCWludCBuLCByZXQ7CisJaW50IHJldDsKIAogCW5vZGUgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgaW50Y19pZHMpOwogCWlmICghbm9kZSkgewpAQCAtMjY3LDIzICsyNjksNiBAQAogCQlyZXR1cm47CiAJfQogCi0JcHhhX2lycV9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9sZWdhY3kobm9kZSwgcHhhX2ludGVybmFsX2lycV9uciwgMCwgMCwKLQkJCQkJICAgICAgICZweGFfaXJxX29wcywgTlVMTCk7Ci0JaWYgKCFweGFfaXJxX2RvbWFpbikKLQkJcGFuaWMoIlVuYWJsZSB0byBhZGQgUFhBIElSUSBkb21haW5cbiIpOwotCi0JaXJxX3NldF9kZWZhdWx0X2hvc3QocHhhX2lycV9kb21haW4pOwotCi0JZm9yIChuID0gMDsgbiA8IHB4YV9pbnRlcm5hbF9pcnFfbnI7IG4gKz0gMzIpIHsKLQkJdm9pZCBfX2lvbWVtICpiYXNlID0gaXJxX2Jhc2UobiA+PiA1KTsKLQotCQlfX3Jhd193cml0ZWwoMCwgYmFzZSArIElDTVIpOwkvKiBkaXNhYmxlIGFsbCBJUlFzICovCi0JCV9fcmF3X3dyaXRlbCgwLCBiYXNlICsgSUNMUik7CS8qIGFsbCBJUlFzIGFyZSBJUlEsIG5vdCBGSVEgKi8KLQl9Ci0KLQkvKiBvbmx5IHVubWFza2VkIGludGVycnVwdHMga2ljayB1cyBvdXQgb2YgaWRsZSAqLwotCV9fcmF3X3dyaXRlbCgxLCBpcnFfYmFzZSgwKSArIElDQ1IpOwotCi0JcHhhX2ludGVybmFsX2lycV9jaGlwLmlycV9zZXRfd2FrZSA9IGZuOworCXB4YV9pbml0X2lycV9jb21tb24obm9kZSwgcHhhX2ludGVybmFsX2lycV9uciwgZm4pOwogfQogI2VuZGlmIC8qIENPTkZJR19PRiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvcmF1bWZlbGQuYyBiL2FyY2gvYXJtL21hY2gtcHhhL3JhdW1mZWxkLmMKaW5kZXggYTc2MmIyMy4uNmRjNGYwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvcmF1bWZlbGQuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS9yYXVtZmVsZC5jCkBAIC03NTgsOCArNzU4LDEwIEBACiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0KIAkJcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lKHJhdW1mZWxkX3Bvd2VyX3N1cHBsaWNhbnRzWzBdKTsKIAotCWlmIChwc3kpCisJaWYgKHBzeSkgewogCQlwb3dlcl9zdXBwbHlfc2V0X2JhdHRlcnlfY2hhcmdlZChwc3kpOworCQlwb3dlcl9zdXBwbHlfcHV0KHBzeSk7CisJfQogfQogCiBzdGF0aWMgaW50IHJhdW1mZWxkX3Bvd2VyX3Jlc3VtZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1weGEvemV1cy5jIGIvYXJjaC9hcm0vbWFjaC1weGEvemV1cy5jCmluZGV4IDIwNWY5YmYuLmFjMmFlNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHhhL3pldXMuYworKysgYi9hcmNoL2FybS9tYWNoLXB4YS96ZXVzLmMKQEAgLTQxMiw3ICs0MTIsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgY2FuX3JlZ3VsYXRvcl9kZXZpY2UgPSB7Ci0JLm5hbWUJPSAicmVnLWZpeGVkLXZvbGFnZSIsCisJLm5hbWUJPSAicmVnLWZpeGVkLXZvbHRhZ2UiLAogCS5pZAk9IDAsCiAJLmRldgk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSAmY2FuX3JlZ3VsYXRvcl9wZGF0YSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9jcHVpZGxlLmMgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvY3B1aWRsZS5jCmluZGV4IDJlYjA3MjQuLjkzYWE4Y2IgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9jcHVpZGxlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2NwdWlkbGUuYwpAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAotI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgorI2luY2x1ZGUgPGFzbS9jcHVpZGxlLmg+CiAKICNpbmNsdWRlIDxtYWNoL21hcC5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXM1cHYyMTAvc2xlZXAuUyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9zbGVlcC5TCmluZGV4IDdjNDNkZGQuLmRmYmZjMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtczVwdjIxMC9zbGVlcC5TCisrKyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9zbGVlcC5TCkBAIC0xNCw3ICsxNCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CiAKLQkuZGF0YQorCS50ZXh0CiAJLmFsaWduCiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcm1hZGlsbG84MDBldmEuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXJtYWRpbGxvODAwZXZhLmMKaW5kZXggNmQ5NDlmMS4uMzZhYWViMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcm1hZGlsbG84MDBldmEuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFybWFkaWxsbzgwMGV2YS5jCkBAIC0xMDE1LDcgKzEwMTUsNiBAQAogCS5wbGF0Zm9ybQk9ICJzaF9mc2kyIiwKIAkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk0sCiAJLmNwdV9kYWkgPSB7Ci0JCS5mbXQJPSBTTkRfU09DX0RBSUZNVF9JQl9ORiwKIAkJLm5hbWUJPSAiZnNpYS1kYWkiLAogCX0sCiAJLmNvZGVjX2RhaSA9IHsKQEAgLTEwNDAsOSArMTAzOSw5IEBACiAJLmNhcmQJCT0gIkZTSTJCLUhETUkiLAogCS5jb2RlYwkJPSAic2gtbW9iaWxlLWhkbWkiLAogCS5wbGF0Zm9ybQk9ICJzaF9mc2kyIiwKKwkuZGFpZm10CQk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJLmNwdV9kYWkgPSB7CiAJCS5uYW1lCT0gImZzaWItZGFpIiwKLQkJLmZtdAk9IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCiAJfSwKIAkuY29kZWNfZGFpID0gewogCQkubmFtZSA9ICJzaF9tb2JpbGVfaGRtaS1oaWZpIiwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczYTAuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvaW50Yy1zaDczYTAuYwppbmRleCA5ZTM2MTgwLi5mZDYzYWU2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2ludGMtc2g3M2EwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9pbnRjLXNoNzNhMC5jCkBAIC0yNTIsMTEgKzI1Miw2IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgaW50IHNoNzNhMF9zZXRfd2FrZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCBvbikKLXsKLQlyZXR1cm4gMDsgLyogYWx3YXlzIGFsbG93IHdha2V1cCAqLwotfQotCiAjZGVmaW5lIFBJTlRFUjBfUEhZUyAweGU2OTAwMGEwCiAjZGVmaW5lIFBJTlRFUjFfUEhZUyAweGU2OTAwMGE0CiAjZGVmaW5lIFBJTlRFUjBfVklSVCBJT01FTSgweGU2OTAwMGEwKQpAQCAtMzE4LDggKzMxMyw4IEBACiAJdm9pZCBfX2lvbWVtICpnaWNfY3B1X2Jhc2UgPSBJT01FTSgweGYwMDAwMTAwKTsKIAl2b2lkIF9faW9tZW0gKmludGV2dHNhID0gaW9yZW1hcF9ub2NhY2hlKDB4ZmZkMjAxMDAsIFBBR0VfU0laRSk7CiAKKwlnaWNfc2V0X2lycWNoaXBfZmxhZ3MoSVJRQ0hJUF9TS0lQX1NFVF9XQUtFKTsKIAlnaWNfaW5pdCgwLCAyOSwgZ2ljX2Rpc3RfYmFzZSwgZ2ljX2NwdV9iYXNlKTsKLQlnaWNfYXJjaF9leHRuLmlycV9zZXRfd2FrZSA9IHNoNzNhMF9zZXRfd2FrZTsKIAogCXJlZ2lzdGVyX2ludGNfY29udHJvbGxlcigmaW50Y3NfZGVzYyk7CiAJcmVnaXN0ZXJfaW50Y19jb250cm9sbGVyKCZpbnRjX3BpbnQwX2Rlc2MpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1yOGE3Nzc5LmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL3NldHVwLXI4YTc3NzkuYwppbmRleCAyN2RjZWFmOS4uYzAzZTU2MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1yOGE3Nzc5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9zZXR1cC1yOGE3Nzc5LmMKQEAgLTcxMywxOCArNzEzLDEzIEBACiB9CiAKICNpZmRlZiBDT05GSUdfVVNFX09GCi1zdGF0aWMgaW50IHI4YTc3Nzlfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgb24pCi17Ci0JcmV0dXJuIDA7IC8qIGFsd2F5cyBhbGxvdyB3YWtldXAgKi8KLX0KLQogdm9pZCBfX2luaXQgcjhhNzc3OV9pbml0X2lycV9kdCh2b2lkKQogewogI2lmZGVmIENPTkZJR19BUkNIX1NITU9CSUxFX0xFR0FDWQogCXZvaWQgX19pb21lbSAqZ2ljX2Rpc3RfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZSgweGYwMDAxMDAwLCAweDEwMDApOwogCXZvaWQgX19pb21lbSAqZ2ljX2NwdV9iYXNlID0gaW9yZW1hcF9ub2NhY2hlKDB4ZjAwMDAxMDAsIDB4MTAwMCk7CiAjZW5kaWYKLQlnaWNfYXJjaF9leHRuLmlycV9zZXRfd2FrZSA9IHI4YTc3Nzlfc2V0X3dha2U7CisJZ2ljX3NldF9pcnFjaGlwX2ZsYWdzKElSUUNISVBfU0tJUF9TRVRfV0FLRSk7CiAKICNpZmRlZiBDT05GSUdfQVJDSF9TSE1PQklMRV9MRUdBQ1kKIAlnaWNfaW5pdCgwLCAyOSwgZ2ljX2Rpc3RfYmFzZSwgZ2ljX2NwdV9iYXNlKTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc3VueGkvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtc3VueGkvS2NvbmZpZwppbmRleCBhNzc2MDRmLi44MTUwMmI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXN1bnhpL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC1zdW54aS9LY29uZmlnCkBAIC0xLDEwICsxLDEyIEBACiBtZW51Y29uZmlnIEFSQ0hfU1VOWEkKIAlib29sICJBbGx3aW5uZXIgU29DcyIgaWYgQVJDSF9NVUxUSV9WNwogCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgorCXNlbGVjdCBBUkNIX0hBU19SRVNFVF9DT05UUk9MTEVSCiAJc2VsZWN0IENMS1NSQ19NTUlPCiAJc2VsZWN0IEdFTkVSSUNfSVJRX0NISVAKIAlzZWxlY3QgUElOQ1RSTAogCXNlbGVjdCBTVU40SV9USU1FUgorCXNlbGVjdCBSRVNFVF9DT05UUk9MTEVSCiAKIGlmIEFSQ0hfU1VOWEkKIApAQCAtMjAsMTAgKzIyLDggQEAKIGNvbmZpZyBNQUNIX1NVTjZJCiAJYm9vbCAiQWxsd2lubmVyIEEzMSAoc3VuNmkpIFNvQ3Mgc3VwcG9ydCIKIAlkZWZhdWx0IEFSQ0hfU1VOWEkKLQlzZWxlY3QgQVJDSF9IQVNfUkVTRVRfQ09OVFJPTExFUgogCXNlbGVjdCBBUk1fR0lDCiAJc2VsZWN0IE1GRF9TVU42SV9QUkNNCi0Jc2VsZWN0IFJFU0VUX0NPTlRST0xMRVIKIAlzZWxlY3QgU1VONUlfSFNUSU1FUgogCiBjb25maWcgTUFDSF9TVU43SQpAQCAtMzcsMTYgKzM3LDEyIEBACiBjb25maWcgTUFDSF9TVU44SQogCWJvb2wgIkFsbHdpbm5lciBBMjMgKHN1bjhpKSBTb0NzIHN1cHBvcnQiCiAJZGVmYXVsdCBBUkNIX1NVTlhJCi0Jc2VsZWN0IEFSQ0hfSEFTX1JFU0VUX0NPTlRST0xMRVIKIAlzZWxlY3QgQVJNX0dJQwogCXNlbGVjdCBNRkRfU1VONklfUFJDTQotCXNlbGVjdCBSRVNFVF9DT05UUk9MTEVSCiAKIGNvbmZpZyBNQUNIX1NVTjlJCiAJYm9vbCAiQWxsd2lubmVyIChzdW45aSkgU29DcyBzdXBwb3J0IgogCWRlZmF1bHQgQVJDSF9TVU5YSQotCXNlbGVjdCBBUkNIX0hBU19SRVNFVF9DT05UUk9MTEVSCiAJc2VsZWN0IEFSTV9HSUMKLQlzZWxlY3QgUkVTRVRfQ09OVFJPTExFUgogCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9jcHVpZGxlLXRlZ3JhMTE0LmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2NwdWlkbGUtdGVncmExMTQuYwppbmRleCBmMmI1ODZkLi4xNTU4MDdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2NwdWlkbGUtdGVncmExMTQuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2NwdWlkbGUtdGVncmExMTQuYwpAQCAtMTUsNyArMTUsNyBAQAogICovCiAKICNpbmNsdWRlIDxhc20vZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVfcG0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTQ0LDcgKzQ0LDcgQEAKIAl0ZWdyYV9zZXRfY3B1X2luX2xwMigpOwogCWNwdV9wbV9lbnRlcigpOwogCi0JY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VOVEVSLCAmZGV2LT5jcHUpOworCXRpY2tfYnJvYWRjYXN0X2VudGVyKCk7CiAKIAljYWxsX2Zpcm13YXJlX29wKHByZXBhcmVfaWRsZSk7CiAKQEAgLTUyLDcgKzUyLDcgQEAKIAlpZiAoY2FsbF9maXJtd2FyZV9vcChkb19pZGxlLCAwKSA9PSAtRU5PU1lTKQogCQljcHVfc3VzcGVuZCgwLCB0ZWdyYTMwX3NsZWVwX2NwdV9zZWNvbmRhcnlfZmluaXNoKTsKIAotCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElULCAmZGV2LT5jcHUpOworCXRpY2tfYnJvYWRjYXN0X2V4aXQoKTsKIAogCWNwdV9wbV9leGl0KCk7CiAJdGVncmFfY2xlYXJfY3B1X2luX2xwMigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9jcHVpZGxlLXRlZ3JhMjAuYyBiL2FyY2gvYXJtL21hY2gtdGVncmEvY3B1aWRsZS10ZWdyYTIwLmMKaW5kZXggNGYyNWE3Yy4uODhkZTJkYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9jcHVpZGxlLXRlZ3JhMjAuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2NwdWlkbGUtdGVncmEyMC5jCkBAIC0yMCwxNCArMjAsMTMgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvY2xrL3RlZ3JhLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1X3BtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICNpbmNsdWRlIDxhc20vY3B1aWRsZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogI2luY2x1ZGUgPGFzbS9zbXBfcGxhdC5oPgogI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAKQEAgLTEzNiwxMSArMTM1LDExIEBACiAJaWYgKHRlZ3JhMjBfcmVzZXRfY3B1XzEoKSB8fCAhdGVncmFfY3B1X3JhaWxfb2ZmX3JlYWR5KCkpCiAJCXJldHVybiBmYWxzZTsKIAotCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FTlRFUiwgJmRldi0+Y3B1KTsKKwl0aWNrX2Jyb2FkY2FzdF9lbnRlcigpOwogCiAJdGVncmFfaWRsZV9scDJfbGFzdCgpOwogCi0JY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VYSVQsICZkZXYtPmNwdSk7CisJdGlja19icm9hZGNhc3RfZXhpdCgpOwogCiAJaWYgKGNwdV9vbmxpbmUoMSkpCiAJCXRlZ3JhMjBfd2FrZV9jcHUxX2Zyb21fcmVzZXQoKTsKQEAgLTE1MywxMyArMTUyLDEzIEBACiAJCQkJCSBzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKIAkJCQkJIGludCBpbmRleCkKIHsKLQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIsICZkZXYtPmNwdSk7CisJdGlja19icm9hZGNhc3RfZW50ZXIoKTsKIAogCWNwdV9zdXNwZW5kKDAsIHRlZ3JhMjBfc2xlZXBfY3B1X3NlY29uZGFyeV9maW5pc2gpOwogCiAJdGVncmEyMF9jcHVfY2xlYXJfcmVzZXR0YWJsZSgpOwogCi0JY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VYSVQsICZkZXYtPmNwdSk7CisJdGlja19icm9hZGNhc3RfZXhpdCgpOwogCiAJcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2NwdWlkbGUtdGVncmEzMC5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9jcHVpZGxlLXRlZ3JhMzAuYwppbmRleCBmODgxNWVkLi40ZGJlMWRhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2NwdWlkbGUtdGVncmEzMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvY3B1aWRsZS10ZWdyYTMwLmMKQEAgLTIwLDE0ICsyMCwxMyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9jbGsvdGVncmEuaD4KLSNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVfcG0uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHVpZGxlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CiAjaW5jbHVkZSA8YXNtL3NtcF9wbGF0Lmg+CiAjaW5jbHVkZSA8YXNtL3N1c3BlbmQuaD4KIApAQCAtNzYsMTEgKzc1LDExIEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIsICZkZXYtPmNwdSk7CisJdGlja19icm9hZGNhc3RfZW50ZXIoKTsKIAogCXRlZ3JhX2lkbGVfbHAyX2xhc3QoKTsKIAotCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElULCAmZGV2LT5jcHUpOworCXRpY2tfYnJvYWRjYXN0X2V4aXQoKTsKIAogCXJldHVybiB0cnVlOwogfQpAQCAtOTAsMTMgKzg5LDEzIEBACiAJCQkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAogCQkJCQlpbnQgaW5kZXgpCiB7Ci0JY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VOVEVSLCAmZGV2LT5jcHUpOworCXRpY2tfYnJvYWRjYXN0X2VudGVyKCk7CiAKIAlzbXBfd21iKCk7CiAKIAljcHVfc3VzcGVuZCgwLCB0ZWdyYTMwX3NsZWVwX2NwdV9zZWNvbmRhcnlfZmluaXNoKTsKIAotCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElULCAmZGV2LT5jcHUpOworCXRpY2tfYnJvYWRjYXN0X2V4aXQoKTsKIAogCXJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pb21hcC5oIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pb21hcC5oCmluZGV4IGVlNzk4MDguLjgxZGM5NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvaW9tYXAuaAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2lvbWFwLmgKQEAgLTMxLDIxICszMSw2IEBACiAjZGVmaW5lIFRFR1JBX0FSTV9JTlRfRElTVF9CQVNFCQkweDUwMDQxMDAwCiAjZGVmaW5lIFRFR1JBX0FSTV9JTlRfRElTVF9TSVpFCQlTWl80SwogCi0jZGVmaW5lIFRFR1JBX1BSSU1BUllfSUNUTFJfQkFTRQkweDYwMDA0MDAwCi0jZGVmaW5lIFRFR1JBX1BSSU1BUllfSUNUTFJfU0laRQlTWl82NAotCi0jZGVmaW5lIFRFR1JBX1NFQ09OREFSWV9JQ1RMUl9CQVNFCTB4NjAwMDQxMDAKLSNkZWZpbmUgVEVHUkFfU0VDT05EQVJZX0lDVExSX1NJWkUJU1pfNjQKLQotI2RlZmluZSBURUdSQV9URVJUSUFSWV9JQ1RMUl9CQVNFCTB4NjAwMDQyMDAKLSNkZWZpbmUgVEVHUkFfVEVSVElBUllfSUNUTFJfU0laRQlTWl82NAotCi0jZGVmaW5lIFRFR1JBX1FVQVRFUk5BUllfSUNUTFJfQkFTRQkweDYwMDA0MzAwCi0jZGVmaW5lIFRFR1JBX1FVQVRFUk5BUllfSUNUTFJfU0laRQlTWl82NAotCi0jZGVmaW5lIFRFR1JBX1FVSU5BUllfSUNUTFJfQkFTRQkweDYwMDA0NDAwCi0jZGVmaW5lIFRFR1JBX1FVSU5BUllfSUNUTFJfU0laRQlTWl82NAotCiAjZGVmaW5lIFRFR1JBX1RNUjFfQkFTRQkJCTB4NjAwMDUwMDAKICNkZWZpbmUgVEVHUkFfVE1SMV9TSVpFCQkJU1pfOAogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2lycS5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9pcnEuYwppbmRleCBhYjk1ZjUzLi4zYjkwOThkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2lycS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvaXJxLmMKQEAgLTMwLDQzICszMCw5IEBACiAjaW5jbHVkZSAiYm9hcmQuaCIKICNpbmNsdWRlICJpb21hcC5oIgogCi0jZGVmaW5lIElDVExSX0NQVV9JRVBfVkZJUQkweDA4Ci0jZGVmaW5lIElDVExSX0NQVV9JRVBfRklSCTB4MTQKLSNkZWZpbmUgSUNUTFJfQ1BVX0lFUF9GSVJfU0VUCTB4MTgKLSNkZWZpbmUgSUNUTFJfQ1BVX0lFUF9GSVJfQ0xSCTB4MWMKLQotI2RlZmluZSBJQ1RMUl9DUFVfSUVSCQkweDIwCi0jZGVmaW5lIElDVExSX0NQVV9JRVJfU0VUCTB4MjQKLSNkZWZpbmUgSUNUTFJfQ1BVX0lFUl9DTFIJMHgyOAotI2RlZmluZSBJQ1RMUl9DUFVfSUVQX0NMQVNTCTB4MkMKLQotI2RlZmluZSBJQ1RMUl9DT1BfSUVSCQkweDMwCi0jZGVmaW5lIElDVExSX0NPUF9JRVJfU0VUCTB4MzQKLSNkZWZpbmUgSUNUTFJfQ09QX0lFUl9DTFIJMHgzOAotI2RlZmluZSBJQ1RMUl9DT1BfSUVQX0NMQVNTCTB4M2MKLQotI2RlZmluZSBGSVJTVF9MRUdBQ1lfSVJRIDMyCi0jZGVmaW5lIFRFR1JBX01BWF9OVU1fSUNUTFJTCTUKLQogI2RlZmluZSBTR0lfTUFTSyAweEZGRkYKIAotc3RhdGljIGludCBudW1faWN0bHJzOwotCi1zdGF0aWMgdm9pZCBfX2lvbWVtICppY3Rscl9yZWdfYmFzZVtdID0gewotCUlPX0FERFJFU1MoVEVHUkFfUFJJTUFSWV9JQ1RMUl9CQVNFKSwKLQlJT19BRERSRVNTKFRFR1JBX1NFQ09OREFSWV9JQ1RMUl9CQVNFKSwKLQlJT19BRERSRVNTKFRFR1JBX1RFUlRJQVJZX0lDVExSX0JBU0UpLAotCUlPX0FERFJFU1MoVEVHUkFfUVVBVEVSTkFSWV9JQ1RMUl9CQVNFKSwKLQlJT19BRERSRVNTKFRFR1JBX1FVSU5BUllfSUNUTFJfQkFTRSksCi19OwotCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgdTMyIGNvcF9pZXJbVEVHUkFfTUFYX05VTV9JQ1RMUlNdOwotc3RhdGljIHUzMiBjb3BfaWVwW1RFR1JBX01BWF9OVU1fSUNUTFJTXTsKLXN0YXRpYyB1MzIgY3B1X2llcltURUdSQV9NQVhfTlVNX0lDVExSU107Ci1zdGF0aWMgdTMyIGNwdV9pZXBbVEVHUkFfTUFYX05VTV9JQ1RMUlNdOwotCi1zdGF0aWMgdTMyIGljdGxyX3dha2VfbWFza1tURUdSQV9NQVhfTlVNX0lDVExSU107CiBzdGF0aWMgdm9pZCBfX2lvbWVtICp0ZWdyYV9naWNfY3B1X2Jhc2U7CiAjZW5kaWYKIApAQCAtODMsMTQwICs0OSw3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdGVncmFfaXJxX3dyaXRlX21hc2sodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgbG9uZyByZWcpCi17Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwotCXUzMiBtYXNrOwotCi0JQlVHX09OKGlycSA8IEZJUlNUX0xFR0FDWV9JUlEgfHwKLQkJaXJxID49IEZJUlNUX0xFR0FDWV9JUlEgKyBudW1faWN0bHJzICogMzIpOwotCi0JYmFzZSA9IGljdGxyX3JlZ19iYXNlWyhpcnEgLSBGSVJTVF9MRUdBQ1lfSVJRKSAvIDMyXTsKLQltYXNrID0gQklUKChpcnEgLSBGSVJTVF9MRUdBQ1lfSVJRKSAlIDMyKTsKLQotCV9fcmF3X3dyaXRlbChtYXNrLCBiYXNlICsgcmVnKTsKLX0KLQotc3RhdGljIHZvaWQgdGVncmFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JaWYgKGQtPmh3aXJxIDwgRklSU1RfTEVHQUNZX0lSUSkKLQkJcmV0dXJuOwotCi0JdGVncmFfaXJxX3dyaXRlX21hc2soZC0+aHdpcnEsIElDVExSX0NQVV9JRVJfQ0xSKTsKLX0KLQotc3RhdGljIHZvaWQgdGVncmFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQlpZiAoZC0+aHdpcnEgPCBGSVJTVF9MRUdBQ1lfSVJRKQotCQlyZXR1cm47Ci0KLQl0ZWdyYV9pcnFfd3JpdGVfbWFzayhkLT5od2lycSwgSUNUTFJfQ1BVX0lFUl9TRVQpOwotfQotCi1zdGF0aWMgdm9pZCB0ZWdyYV9hY2soc3RydWN0IGlycV9kYXRhICpkKQotewotCWlmIChkLT5od2lycSA8IEZJUlNUX0xFR0FDWV9JUlEpCi0JCXJldHVybjsKLQotCXRlZ3JhX2lycV93cml0ZV9tYXNrKGQtPmh3aXJxLCBJQ1RMUl9DUFVfSUVQX0ZJUl9DTFIpOwotfQotCi1zdGF0aWMgdm9pZCB0ZWdyYV9lb2koc3RydWN0IGlycV9kYXRhICpkKQotewotCWlmIChkLT5od2lycSA8IEZJUlNUX0xFR0FDWV9JUlEpCi0JCXJldHVybjsKLQotCXRlZ3JhX2lycV93cml0ZV9tYXNrKGQtPmh3aXJxLCBJQ1RMUl9DUFVfSUVQX0ZJUl9DTFIpOwotfQotCi1zdGF0aWMgaW50IHRlZ3JhX3JldHJpZ2dlcihzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JaWYgKGQtPmh3aXJxIDwgRklSU1RfTEVHQUNZX0lSUSkKLQkJcmV0dXJuIDA7Ci0KLQl0ZWdyYV9pcnFfd3JpdGVfbWFzayhkLT5od2lycSwgSUNUTFJfQ1BVX0lFUF9GSVJfU0VUKTsKLQotCXJldHVybiAxOwotfQotCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1zdGF0aWMgaW50IHRlZ3JhX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IGVuYWJsZSkKLXsKLQl1MzIgaXJxID0gZC0+aHdpcnE7Ci0JdTMyIGluZGV4LCBtYXNrOwotCi0JaWYgKGlycSA8IEZJUlNUX0xFR0FDWV9JUlEgfHwKLQkJaXJxID49IEZJUlNUX0xFR0FDWV9JUlEgKyBudW1faWN0bHJzICogMzIpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaW5kZXggPSAoKGlycSAtIEZJUlNUX0xFR0FDWV9JUlEpIC8gMzIpOwotCW1hc2sgPSBCSVQoKGlycSAtIEZJUlNUX0xFR0FDWV9JUlEpICUgMzIpOwotCWlmIChlbmFibGUpCi0JCWljdGxyX3dha2VfbWFza1tpbmRleF0gfD0gbWFzazsKLQllbHNlCi0JCWljdGxyX3dha2VfbWFza1tpbmRleF0gJj0gfm1hc2s7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0ZWdyYV9sZWdhY3lfaXJxX3N1c3BlbmQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBpOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBudW1faWN0bHJzOyBpKyspIHsKLQkJdm9pZCBfX2lvbWVtICppY3RsciA9IGljdGxyX3JlZ19iYXNlW2ldOwotCQkvKiBTYXZlIGludGVycnVwdCBzdGF0ZSAqLwotCQljcHVfaWVyW2ldID0gcmVhZGxfcmVsYXhlZChpY3RsciArIElDVExSX0NQVV9JRVIpOwotCQljcHVfaWVwW2ldID0gcmVhZGxfcmVsYXhlZChpY3RsciArIElDVExSX0NQVV9JRVBfQ0xBU1MpOwotCQljb3BfaWVyW2ldID0gcmVhZGxfcmVsYXhlZChpY3RsciArIElDVExSX0NPUF9JRVIpOwotCQljb3BfaWVwW2ldID0gcmVhZGxfcmVsYXhlZChpY3RsciArIElDVExSX0NPUF9JRVBfQ0xBU1MpOwotCi0JCS8qIERpc2FibGUgQ09QIGludGVycnVwdHMgKi8KLQkJd3JpdGVsX3JlbGF4ZWQofjB1bCwgaWN0bHIgKyBJQ1RMUl9DT1BfSUVSX0NMUik7Ci0KLQkJLyogRGlzYWJsZSBDUFUgaW50ZXJydXB0cyAqLwotCQl3cml0ZWxfcmVsYXhlZCh+MHVsLCBpY3RsciArIElDVExSX0NQVV9JRVJfQ0xSKTsKLQotCQkvKiBFbmFibGUgdGhlIHdha2V1cCBzb3VyY2VzIG9mIGljdGxyICovCi0JCXdyaXRlbF9yZWxheGVkKGljdGxyX3dha2VfbWFza1tpXSwgaWN0bHIgKyBJQ1RMUl9DUFVfSUVSX1NFVCk7Ci0JfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB0ZWdyYV9sZWdhY3lfaXJxX3Jlc3VtZSh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JZm9yIChpID0gMDsgaSA8IG51bV9pY3RscnM7IGkrKykgewotCQl2b2lkIF9faW9tZW0gKmljdGxyID0gaWN0bHJfcmVnX2Jhc2VbaV07Ci0JCXdyaXRlbF9yZWxheGVkKGNwdV9pZXBbaV0sIGljdGxyICsgSUNUTFJfQ1BVX0lFUF9DTEFTUyk7Ci0JCXdyaXRlbF9yZWxheGVkKH4wdWwsIGljdGxyICsgSUNUTFJfQ1BVX0lFUl9DTFIpOwotCQl3cml0ZWxfcmVsYXhlZChjcHVfaWVyW2ldLCBpY3RsciArIElDVExSX0NQVV9JRVJfU0VUKTsKLQkJd3JpdGVsX3JlbGF4ZWQoY29wX2llcFtpXSwgaWN0bHIgKyBJQ1RMUl9DT1BfSUVQX0NMQVNTKTsKLQkJd3JpdGVsX3JlbGF4ZWQofjB1bCwgaWN0bHIgKyBJQ1RMUl9DT1BfSUVSX0NMUik7Ci0JCXdyaXRlbF9yZWxheGVkKGNvcF9pZXJbaV0sIGljdGxyICsgSUNUTFJfQ09QX0lFUl9TRVQpOwotCX0KLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgdGVncmFfbGVnYWN5X2lycV9zeXNjb3JlX29wcyA9IHsKLQkuc3VzcGVuZCA9IHRlZ3JhX2xlZ2FjeV9pcnFfc3VzcGVuZCwKLQkucmVzdW1lID0gdGVncmFfbGVnYWN5X2lycV9yZXN1bWUsCi19OwotCi1pbnQgdGVncmFfbGVnYWN5X2lycV9zeXNjb3JlX2luaXQodm9pZCkKLXsKLQlyZWdpc3Rlcl9zeXNjb3JlX29wcygmdGVncmFfbGVnYWN5X2lycV9zeXNjb3JlX29wcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCB0ZWdyYV9naWNfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKnYpCiB7CkBAIC0yNTEsNDUgKzg0LDE5IEBACiAJY3B1X3BtX3JlZ2lzdGVyX25vdGlmaWVyKCZ0ZWdyYV9naWNfbm90aWZpZXJfYmxvY2spOwogfQogI2Vsc2UKLSNkZWZpbmUgdGVncmFfc2V0X3dha2UgTlVMTAogc3RhdGljIHZvaWQgdGVncmExMTRfZ2ljX2NwdV9wbV9yZWdpc3RyYXRpb24odm9pZCkgeyB9CiAjZW5kaWYKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfaWN0bHJfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWljdGxyIiB9LAorCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtaWN0bHIiIH0sCisJeyB9Cit9OworCiB2b2lkIF9faW5pdCB0ZWdyYV9pbml0X2lycSh2b2lkKQogewotCWludCBpOwotCXZvaWQgX19pb21lbSAqZGlzdGJhc2U7Ci0KLQlkaXN0YmFzZSA9IElPX0FERFJFU1MoVEVHUkFfQVJNX0lOVF9ESVNUX0JBU0UpOwotCW51bV9pY3RscnMgPSByZWFkbF9yZWxheGVkKGRpc3RiYXNlICsgR0lDX0RJU1RfQ1RSKSAmIDB4MWY7Ci0KLQlpZiAobnVtX2ljdGxycyA+IEFSUkFZX1NJWkUoaWN0bHJfcmVnX2Jhc2UpKSB7Ci0JCVdBUk4oMSwgIlRvbyBtYW55ICglZCkgaW50ZXJydXB0IGNvbnRyb2xsZXJzIGZvdW5kLiBNYXhpbXVtIGlzICVkLiIsCi0JCQludW1faWN0bHJzLCBBUlJBWV9TSVpFKGljdGxyX3JlZ19iYXNlKSk7Ci0JCW51bV9pY3RscnMgPSBBUlJBWV9TSVpFKGljdGxyX3JlZ19iYXNlKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2ljdGxyczsgaSsrKSB7Ci0JCXZvaWQgX19pb21lbSAqaWN0bHIgPSBpY3Rscl9yZWdfYmFzZVtpXTsKLQkJd3JpdGVsKH4wLCBpY3RsciArIElDVExSX0NQVV9JRVJfQ0xSKTsKLQkJd3JpdGVsKDAsIGljdGxyICsgSUNUTFJfQ1BVX0lFUF9DTEFTUyk7Ci0JfQotCi0JZ2ljX2FyY2hfZXh0bi5pcnFfYWNrID0gdGVncmFfYWNrOwotCWdpY19hcmNoX2V4dG4uaXJxX2VvaSA9IHRlZ3JhX2VvaTsKLQlnaWNfYXJjaF9leHRuLmlycV9tYXNrID0gdGVncmFfbWFzazsKLQlnaWNfYXJjaF9leHRuLmlycV91bm1hc2sgPSB0ZWdyYV91bm1hc2s7Ci0JZ2ljX2FyY2hfZXh0bi5pcnFfcmV0cmlnZ2VyID0gdGVncmFfcmV0cmlnZ2VyOwotCWdpY19hcmNoX2V4dG4uaXJxX3NldF93YWtlID0gdGVncmFfc2V0X3dha2U7Ci0JZ2ljX2FyY2hfZXh0bi5mbGFncyA9IElSUUNISVBfTUFTS19PTl9TVVNQRU5EOwotCi0JLyoKLQkgKiBDaGVjayBpZiB0aGVyZSBpcyBhIGRldmljZXRyZWUgcHJlc2VudCwgc2luY2UgdGhlIEdJQyB3aWxsIGJlCi0JICogaW5pdGlhbGl6ZWQgZWxzZXdoZXJlIHVuZGVyIERULgotCSAqLwotCWlmICghb2ZfaGF2ZV9wb3B1bGF0ZWRfZHQoKSkKLQkJZ2ljX2luaXQoMCwgMjksIGRpc3RiYXNlLAotCQkJSU9fQUREUkVTUyhURUdSQV9BUk1fUEVSSUZfQkFTRSArIDB4MTAwKSk7CisJaWYgKFdBUk5fT04oIW9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCB0ZWdyYV9pY3Rscl9tYXRjaCkpKQorCQlwcl93YXJuKCJPdXRkYXRlZCBEVCBkZXRlY3RlZCwgc3VzcGVuZC9yZXN1bWUgd2lsbCBOT1Qgd29ya1xuIik7CiAKIAl0ZWdyYTExNF9naWNfY3B1X3BtX3JlZ2lzdHJhdGlvbigpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pcnEuaCBiL2FyY2gvYXJtL21hY2gtdGVncmEvaXJxLmgKaW5kZXggYmMwNWNlNS4uNTE0MjY0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9pcnEuaAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2lycS5oCkBAIC0xOSwxMCArMTksNCBAQAogCiBib29sIHRlZ3JhX3BlbmRpbmdfc2dpKHZvaWQpOwogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCi1pbnQgdGVncmFfbGVnYWN5X2lycV9zeXNjb3JlX2luaXQodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgdGVncmFfbGVnYWN5X2lycV9zeXNjb3JlX2luaXQodm9pZCkgeyByZXR1cm4gMDsgfQotI2VuZGlmCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS90ZWdyYS5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS90ZWdyYS5jCmluZGV4IDkxNDM0MWIuLjg2MWQ4ODQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvdGVncmEuYworKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL3RlZ3JhLmMKQEAgLTgyLDcgKzgyLDYgQEAKIHsKIAl0ZWdyYV9pbml0X2lycSgpOwogCWlycWNoaXBfaW5pdCgpOwotCXRlZ3JhX2xlZ2FjeV9pcnFfc3lzY29yZV9pbml0KCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCB0ZWdyYV9kdF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS5jIGIvYXJjaC9hcm0vbWFjaC11eDUwMC9jcHUuYwppbmRleCBkYmIyOTcwLi42Y2VkMGY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXV4NTAwL2NwdS5jCisrKyBiL2FyY2gvYXJtL21hY2gtdXg1MDAvY3B1LmMKQEAgLTUyLDcgKzUyLDcgQEAKICovCiB2b2lkIF9faW5pdCB1eDUwMF9pbml0X2lycSh2b2lkKQogewotCWdpY19hcmNoX2V4dG4uZmxhZ3MgPSBJUlFDSElQX1NLSVBfU0VUX1dBS0UgfCBJUlFDSElQX01BU0tfT05fU1VTUEVORDsKKwlnaWNfc2V0X2lycWNoaXBfZmxhZ3MoSVJRQ0hJUF9TS0lQX1NFVF9XQUtFIHwgSVJRQ0hJUF9NQVNLX09OX1NVU1BFTkQpOwogCWlycWNoaXBfaW5pdCgpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtdmV4cHJlc3MvS2NvbmZpZwppbmRleCAzYzI1MDliLi40YmU1Mzc5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZleHByZXNzL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXhwcmVzcy9LY29uZmlnCkBAIC00Miw2ICs0Miw3IEBACiBjb25maWcgQVJDSF9WRVhQUkVTU19DT1JURVhfQTVfQTlfRVJSQVRBCiAJYm9vbCAiRW5hYmxlIEE1IGFuZCBBOSBvbmx5IGVycmF0YSB3b3JrLWFyb3VuZHMiCiAJZGVmYXVsdCB5CisJc2VsZWN0IEFSTV9FUlJBVEFfNjQzNzE5IGlmIFNNUAogCXNlbGVjdCBBUk1fRVJSQVRBXzcyMDc4OQogCXNlbGVjdCBQTDMxMF9FUlJBVEFfNzUzOTcwIGlmIENBQ0hFX0wyWDAKIAloZWxwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXp5bnEvY29tbW9uLmMgYi9hcmNoL2FybS9tYWNoLXp5bnEvY29tbW9uLmMKaW5kZXggYzg4NzE5Ni4uNThlZjJhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC16eW5xL2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtenlucS9jb21tb24uYwpAQCAtMTg2LDcgKzE4Niw3IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCB6eW5xX2lycV9pbml0KHZvaWQpCiB7Ci0JZ2ljX2FyY2hfZXh0bi5mbGFncyA9IElSUUNISVBfU0tJUF9TRVRfV0FLRSB8IElSUUNISVBfTUFTS19PTl9TVVNQRU5EOworCWdpY19zZXRfaXJxY2hpcF9mbGFncyhJUlFDSElQX1NLSVBfU0VUX1dBS0UgfCBJUlFDSElQX01BU0tfT05fU1VTUEVORCk7CiAJaXJxY2hpcF9pbml0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL0tjb25maWcgYi9hcmNoL2FybS9tbS9LY29uZmlnCmluZGV4IDliNGYyOWUuLmI3NjQ0MzEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL0tjb25maWcKKysrIGIvYXJjaC9hcm0vbW0vS2NvbmZpZwpAQCAtNzM4LDcgKzczOCw3IEBACiAKIGNvbmZpZyBDUFVfRENBQ0hFX0RJU0FCTEUKIAlib29sICJEaXNhYmxlIEQtQ2FjaGUgKEMtYml0KSIKLQlkZXBlbmRzIG9uIENQVV9DUDE1CisJZGVwZW5kcyBvbiBDUFVfQ1AxNSAmJiAhU01QCiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBkaXNhYmxlIHRoZSBwcm9jZXNzb3IgZGF0YSBjYWNoZS4gVW5sZXNzCiAJICB5b3UgaGF2ZSBhIHJlYXNvbiBub3QgdG8gb3IgYXJlIHVuc3VyZSwgc2F5IE4uCkBAIC04MjUsNiArODI1LDIwIEBACiAJICBTYXkgTiBoZXJlIG9ubHkgaWYgeW91IGFyZSBhYnNvbHV0ZWx5IGNlcnRhaW4gdGhhdCB5b3UgZG8gbm90CiAJICBuZWVkIHRoZXNlIGhlbHBlcnM7IG90aGVyd2lzZSwgdGhlIHNhZmUgb3B0aW9uIGlzIHRvIHNheSBZLgogCitjb25maWcgVkRTTworCWJvb2wgIkVuYWJsZSBWRFNPIGZvciBhY2NlbGVyYXRpb24gb2Ygc29tZSBzeXN0ZW0gY2FsbHMiCisJZGVwZW5kcyBvbiBBRUFCSSAmJiBNTVUKKwlkZWZhdWx0IHkgaWYgQVJNX0FSQ0hfVElNRVIKKwlzZWxlY3QgR0VORVJJQ19USU1FX1ZTWVNDQUxMCisJaGVscAorCSAgUGxhY2UgaW4gdGhlIHByb2Nlc3MgYWRkcmVzcyBzcGFjZSBhbiBFTEYgc2hhcmVkIG9iamVjdAorCSAgcHJvdmlkaW5nIGZhc3QgaW1wbGVtZW50YXRpb25zIG9mIGdldHRpbWVvZmRheSBhbmQKKwkgIGNsb2NrX2dldHRpbWUuICBTeXN0ZW1zIHRoYXQgaW1wbGVtZW50IHRoZSBBUk0gYXJjaGl0ZWN0ZWQKKwkgIHRpbWVyIHdpbGwgcmVjZWl2ZSBtYXhpbXVtIGJlbmVmaXQuCisKKwkgIFlvdSBtdXN0IGhhdmUgZ2xpYmMgMi4yMiBvciBsYXRlciBmb3IgcHJvZ3JhbXMgdG8gc2VhbWxlc3NseQorCSAgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcy4KKwogY29uZmlnIERNQV9DQUNIRV9SV0ZPCiAJYm9vbCAiRW5hYmxlIHJlYWQvd3JpdGUgZm9yIG93bmVyc2hpcCBETUEgY2FjaGUgbWFpbnRlbmFuY2UiCiAJZGVwZW5kcyBvbiBDUFVfVjZLICYmIFNNUApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vYWxpZ25tZW50LmMgYi9hcmNoL2FybS9tbS9hbGlnbm1lbnQuYwppbmRleCAyYzBjNTQxLi45NzY5ZjFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9hbGlnbm1lbnQuYworKysgYi9hcmNoL2FybS9tbS9hbGlnbm1lbnQuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAgVEhVTUIoCSIxOgkiaW5zIgklMSwgWyUyXVxuIgkpCQlcCiAgVEhVTUIoCSIJYWRkCSUyLCAlMiwgIzFcbiIJKQkJXAogCSIyOlxuIgkJCQkJCVwKLQkiCS5wdXNoc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQlcCisJIgkucHVzaHNlY3Rpb24gLnRleHQuZml4dXAsXCJheFwiXG4iCVwKIAkiCS5hbGlnbgkyXG4iCQkJCVwKIAkiMzoJbW92CSUwLCAjMVxuIgkJCVwKIAkiCWIJMmJcbiIJCQkJXApAQCAtMjYxLDcgKzI2MSw3IEBACiAJCSIJbW92CSUxLCAlMSwgIk5FWFRfQllURSJcbiIJCVwKIAkJIjI6CSJpbnMiCSUxLCBbJTJdXG4iCQkJXAogCQkiMzpcbiIJCQkJCQlcCi0JCSIJLnB1c2hzZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCVwKKwkJIgkucHVzaHNlY3Rpb24gLnRleHQuZml4dXAsXCJheFwiXG4iCVwKIAkJIgkuYWxpZ24JMlxuIgkJCQlcCiAJCSI0Ogltb3YJJTAsICMxXG4iCQkJXAogCQkiCWIJM2JcbiIJCQkJXApAQCAtMzAxLDcgKzMwMSw3IEBACiAJCSIJbW92CSUxLCAlMSwgIk5FWFRfQllURSJcbiIJCVwKIAkJIjQ6CSJpbnMiCSUxLCBbJTJdXG4iCQkJXAogCQkiNTpcbiIJCQkJCQlcCi0JCSIJLnB1c2hzZWN0aW9uIC5maXh1cCxcImF4XCJcbiIJCVwKKwkJIgkucHVzaHNlY3Rpb24gLnRleHQuZml4dXAsXCJheFwiXG4iCVwKIAkJIgkuYWxpZ24JMlxuIgkJCQlcCiAJCSI2Ogltb3YJJTAsICMxXG4iCQkJXAogCQkiCWIJNWJcbiIJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jIGIvYXJjaC9hcm0vbW0vY2FjaGUtbDJ4MC5jCmluZGV4IGM2Yzc2OTYuLmUzMDljOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2NhY2hlLWwyeDAuYworKysgYi9hcmNoL2FybS9tbS9jYWNoZS1sMngwLmMKQEAgLTExMzEsMjMgKzExMzEsMjIgQEAKIAl9CiAKIAlyZXQgPSBsMngwX2NhY2hlX3NpemVfb2ZfcGFyc2UobnAsIGF1eF92YWwsIGF1eF9tYXNrLCAmYXNzb2MsIFNaXzUxMkspOwotCWlmIChyZXQpCi0JCXJldHVybjsKLQotCXN3aXRjaCAoYXNzb2MpIHsKLQljYXNlIDE2OgotCQkqYXV4X3ZhbCAmPSB+TDJYMF9BVVhfQ1RSTF9BU1NPQ19NQVNLOwotCQkqYXV4X3ZhbCB8PSBMMzEwX0FVWF9DVFJMX0FTU09DSUFUSVZJVFlfMTY7Ci0JCSphdXhfbWFzayAmPSB+TDJYMF9BVVhfQ1RSTF9BU1NPQ19NQVNLOwotCQlicmVhazsKLQljYXNlIDg6Ci0JCSphdXhfdmFsICY9IH5MMlgwX0FVWF9DVFJMX0FTU09DX01BU0s7Ci0JCSphdXhfbWFzayAmPSB+TDJYMF9BVVhfQ1RSTF9BU1NPQ19NQVNLOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlwcl9lcnIoIkwyQy0zMTAgT0YgY2FjaGUgYXNzb2NpYXRpdml0eSAlZCBpbnZhbGlkLCBvbmx5IDggb3IgMTYgcGVybWl0dGVkXG4iLAotCQkgICAgICAgYXNzb2MpOwotCQlicmVhazsKKwlpZiAoIXJldCkgeworCQlzd2l0Y2ggKGFzc29jKSB7CisJCWNhc2UgMTY6CisJCQkqYXV4X3ZhbCAmPSB+TDJYMF9BVVhfQ1RSTF9BU1NPQ19NQVNLOworCQkJKmF1eF92YWwgfD0gTDMxMF9BVVhfQ1RSTF9BU1NPQ0lBVElWSVRZXzE2OworCQkJKmF1eF9tYXNrICY9IH5MMlgwX0FVWF9DVFJMX0FTU09DX01BU0s7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJKmF1eF92YWwgJj0gfkwyWDBfQVVYX0NUUkxfQVNTT0NfTUFTSzsKKwkJCSphdXhfbWFzayAmPSB+TDJYMF9BVVhfQ1RSTF9BU1NPQ19NQVNLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIkwyQy0zMTAgT0YgY2FjaGUgYXNzb2NpYXRpdml0eSAlZCBpbnZhbGlkLCBvbmx5IDggb3IgMTYgcGVybWl0dGVkXG4iLAorCQkJICAgICAgIGFzc29jKTsKKwkJCWJyZWFrOworCQl9CiAJfQogCiAJcHJlZmV0Y2ggPSBsMngwX3NhdmVkX3JlZ3MucHJlZmV0Y2hfY3RybDsKQEAgLTE2NDgsNiArMTY0Nyw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpucDsKIAlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwogCXUzMiBjYWNoZV9pZCwgb2xkX2F1eDsKKwl1MzIgY2FjaGVfbGV2ZWwgPSAyOwogCiAJbnAgPSBvZl9maW5kX21hdGNoaW5nX25vZGUoTlVMTCwgbDJ4MF9pZHMpOwogCWlmICghbnApCkBAIC0xNjgwLDYgKzE2ODAsMTIgQEAKIAlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImNhY2hlLXVuaWZpZWQiKSkKIAkJcHJfZXJyKCJMMkM6IGRldmljZSB0cmVlIG9taXRzIHRvIHNwZWNpZnkgdW5pZmllZCBjYWNoZVxuIik7CiAKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJjYWNoZS1sZXZlbCIsICZjYWNoZV9sZXZlbCkpCisJCXByX2VycigiTDJDOiBkZXZpY2UgdHJlZSBvbWl0cyB0byBzcGVjaWZ5IGNhY2hlLWxldmVsXG4iKTsKKworCWlmIChjYWNoZV9sZXZlbCAhPSAyKQorCQlwcl9lcnIoIkwyQzogZGV2aWNlIHRyZWUgc3BlY2lmaWVzIGludmFsaWQgY2FjaGUgbGV2ZWxcbiIpOworCiAJLyogUmVhZCBiYWNrIGN1cnJlbnQgKGRlZmF1bHQpIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24gKi8KIAlpZiAoZGF0YS0+c2F2ZSkKIAkJZGF0YS0+c2F2ZShsMngwX2Jhc2UpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vY2FjaGUtdjcuUyBiL2FyY2gvYXJtL21tL2NhY2hlLXY3LlMKaW5kZXggYjk2NjY1Ni4uYTEzNGQ4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vY2FjaGUtdjcuUworKysgYi9hcmNoL2FybS9tbS9jYWNoZS12Ny5TCkBAIC0zNiwxMCArMzYsMTAgQEAKICAgICAgICBtY3IgICAgIHAxNSwgMiwgcjAsIGMwLCBjMCwgMAogICAgICAgIG1yYyAgICAgcDE1LCAxLCByMCwgYzAsIGMwLCAwCiAKLSAgICAgICBsZHIgICAgIHIxLCA9MHg3ZmZmCisgICAgICAgbW92dyAgICByMSwgIzB4N2ZmZgogICAgICAgIGFuZCAgICAgcjIsIHIxLCByMCwgbHNyICMxMwogCi0gICAgICAgbGRyICAgICByMSwgPTB4M2ZmCisgICAgICAgbW92dyAgICByMSwgIzB4M2ZmCiAKICAgICAgICBhbmQgICAgIHIzLCByMSwgcjAsIGxzciAjMyAgICAgIEAgTnVtV2F5cyAtIDEKICAgICAgICBhZGQgICAgIHIyLCByMiwgIzEgICAgICAgICAgICAgIEAgTnVtU2V0cwpAQCAtOTAsMjEgKzkwLDIwIEBACiBFTlRSWSh2N19mbHVzaF9kY2FjaGVfbG91aXMpCiAJZG1iCQkJCQlAIGVuc3VyZSBvcmRlcmluZyB3aXRoIHByZXZpb3VzIG1lbW9yeSBhY2Nlc3NlcwogCW1yYwlwMTUsIDEsIHIwLCBjMCwgYzAsIDEJCUAgcmVhZCBjbGlkciwgcjAgPSBjbGlkcgotCUFMVF9TTVAoYW5kcwlyMywgcjAsICMoNyA8PCAyMSkpCUAgZXh0cmFjdCBMb1VJUyBmcm9tIGNsaWRyCi0JQUxUX1VQKGFuZHMJcjMsIHIwLCAjKDcgPDwgMjcpKQlAIGV4dHJhY3QgTG9VVSBmcm9tIGNsaWRyCitBTFRfU01QKG1vdglyMywgcjAsIGxzciAjMjApCQlAIG1vdmUgTG9VSVMgaW50byBwb3NpdGlvbgorQUxUX1VQKAltb3YJcjMsIHIwLCBsc3IgIzI2KQkJQCBtb3ZlIExvVVUgaW50byBwb3NpdGlvbgorCWFuZHMJcjMsIHIzLCAjNyA8PCAxIAkJQCBleHRyYWN0IExvVSoyIGZpZWxkIGZyb20gY2xpZHIKKwlibmUJc3RhcnRfZmx1c2hfbGV2ZWxzCQlAIExvVSAhPSAwLCBzdGFydCBmbHVzaGluZwogI2lmZGVmIENPTkZJR19BUk1fRVJSQVRBXzY0MzcxOQotCUFMVF9TTVAobXJjZXEJcDE1LCAwLCByMiwgYzAsIGMwLCAwKQlAIHJlYWQgbWFpbiBJRCByZWdpc3RlcgotCUFMVF9VUChyZXRlcQlscikJCQlAIExvVVUgaXMgemVybywgc28gbm90aGluZyB0byBkbwotCWxkcmVxCXIxLCA9MHg0MTBmYzA5MCAgICAgICAgICAgICAgICAgQCBJRCBvZiBBUk0gQ29ydGV4IEE5IHIwcD8KLQliaWNlcQlyMiwgcjIsICMweDAwMDAwMDBmICAgICAgICAgICAgIEAgY2xlYXIgbWlub3IgcmV2aXNpb24gbnVtYmVyCi0JdGVxZXEJcjIsIHIxICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRlc3QgZm9yIGVycmF0YSBhZmZlY3RlZCBjb3JlIGFuZCBpZiBzby4uLgotCW9ycmVxcwlyMywgIygxIDw8IDIxKQkJCUAgICBmaXggTG9VSVMgdmFsdWUgKGFuZCBzZXQgZmxhZ3Mgc3RhdGUgdG8gJ25lJykKK0FMVF9TTVAobXJjCXAxNSwgMCwgcjIsIGMwLCBjMCwgMCkJCUAgcmVhZCBtYWluIElEIHJlZ2lzdGVyCitBTFRfVVAoCXJldAlscikJCQkJQCBMb1VVIGlzIHplcm8sIHNvIG5vdGhpbmcgdG8gZG8KKwltb3Z3CXIxLCAjOmxvd2VyMTY6KDB4NDEwZmMwOTAgPj4gNCkJQCBJRCBvZiBBUk0gQ29ydGV4IEE5IHIwcD8KKwltb3Z0CXIxLCAjOnVwcGVyMTY6KDB4NDEwZmMwOTAgPj4gNCkKKwl0ZXEJcjEsIHIyLCBsc3IgIzQJCQlAIHRlc3QgZm9yIGVycmF0YSBhZmZlY3RlZCBjb3JlIGFuZCBpZiBzby4uLgorCW1vdmVxCXIzLCAjMSA8PCAxCQkJQCAgIGZpeCBMb1VJUyB2YWx1ZQorCWJlcQlzdGFydF9mbHVzaF9sZXZlbHMJCUAgICBzdGFydCBmbHVzaGluZyBjYWNoZSBsZXZlbHMKICNlbmRpZgotCUFMVF9TTVAobW92CXIzLCByMywgbHNyICMyMCkJQCByMyA9IExvVUlTICogMgotCUFMVF9VUChtb3YJcjMsIHIzLCBsc3IgIzI2KQlAIHIzID0gTG9VVSAqIDIKLQlyZXRlcQlscgkJCQlAIHJldHVybiBpZiBsZXZlbCA9PSAwCi0JbW92CXIxMCwgIzAJCQkJQCByMTAgKHN0YXJ0aW5nIGxldmVsKSA9IDAKLQliCWZsdXNoX2xldmVscwkJCUAgc3RhcnQgZmx1c2hpbmcgY2FjaGUgbGV2ZWxzCisJcmV0CWxyCiBFTkRQUk9DKHY3X2ZsdXNoX2RjYWNoZV9sb3VpcykKIAogLyoKQEAgLTExOSw5ICsxMTgsMTAgQEAKIEVOVFJZKHY3X2ZsdXNoX2RjYWNoZV9hbGwpCiAJZG1iCQkJCQlAIGVuc3VyZSBvcmRlcmluZyB3aXRoIHByZXZpb3VzIG1lbW9yeSBhY2Nlc3NlcwogCW1yYwlwMTUsIDEsIHIwLCBjMCwgYzAsIDEJCUAgcmVhZCBjbGlkcgotCWFuZHMJcjMsIHIwLCAjMHg3MDAwMDAwCQlAIGV4dHJhY3QgbG9jIGZyb20gY2xpZHIKLQltb3YJcjMsIHIzLCBsc3IgIzIzCQkJQCBsZWZ0IGFsaWduIGxvYyBiaXQgZmllbGQKKwltb3YJcjMsIHIwLCBsc3IgIzIzCQkJQCBtb3ZlIExvQyBpbnRvIHBvc2l0aW9uCisJYW5kcwlyMywgcjMsICM3IDw8IDEJCQlAIGV4dHJhY3QgTG9DKjIgZnJvbSBjbGlkcgogCWJlcQlmaW5pc2hlZAkJCUAgaWYgbG9jIGlzIDAsIHRoZW4gbm8gbmVlZCB0byBjbGVhbgorc3RhcnRfZmx1c2hfbGV2ZWxzOgogCW1vdglyMTAsICMwCQkJCUAgc3RhcnQgY2xlYW4gYXQgY2FjaGUgbGV2ZWwgMAogZmx1c2hfbGV2ZWxzOgogCWFkZAlyMiwgcjEwLCByMTAsIGxzciAjMQkJQCB3b3JrIG91dCAzeCBjdXJyZW50IGNhY2hlIGxldmVsCkBAIC0xNDAsMTAgKzE0MCwxMCBAQAogI2VuZGlmCiAJYW5kCXIyLCByMSwgIzcJCQlAIGV4dHJhY3QgdGhlIGxlbmd0aCBvZiB0aGUgY2FjaGUgbGluZXMKIAlhZGQJcjIsIHIyLCAjNAkJCUAgYWRkIDQgKGxpbmUgbGVuZ3RoIG9mZnNldCkKLQlsZHIJcjQsID0weDNmZgorCW1vdncJcjQsICMweDNmZgogCWFuZHMJcjQsIHI0LCByMSwgbHNyICMzCQlAIGZpbmQgbWF4aW11bSBudW1iZXIgb24gdGhlIHdheSBzaXplCiAJY2x6CXI1LCByNAkJCQlAIGZpbmQgYml0IHBvc2l0aW9uIG9mIHdheSBzaXplIGluY3JlbWVudAotCWxkcglyNywgPTB4N2ZmZgorCW1vdncJcjcsICMweDdmZmYKIAlhbmRzCXI3LCByNywgcjEsIGxzciAjMTMJCUAgZXh0cmFjdCBtYXggbnVtYmVyIG9mIHRoZSBpbmRleCBzaXplCiBsb29wMToKIAltb3YJcjksIHI3CQkJCUAgY3JlYXRlIHdvcmtpbmcgY29weSBvZiBtYXggaW5kZXgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMgYi9hcmNoL2FybS9tbS9kbWEtbWFwcGluZy5jCmluZGV4IDE3MGExMTYuLjA5YzVmZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2RtYS1tYXBwaW5nLmMKKysrIGIvYXJjaC9hcm0vbW0vZG1hLW1hcHBpbmcuYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJICovCiAJaWYgKHNpemVvZihtYXNrKSAhPSBzaXplb2YoZG1hX2FkZHJfdCkgJiYKIAkgICAgbWFzayA+IChkbWFfYWRkcl90KX4wICYmCi0JICAgIGRtYV90b19wZm4oZGV2LCB+MCkgPCBtYXhfcGZuKSB7CisJICAgIGRtYV90b19wZm4oZGV2LCB+MCkgPCBtYXhfcGZuIC0gMSkgewogCQlpZiAod2FybikgewogCQkJZGV2X3dhcm4oZGV2LCAiQ29oZXJlbnQgRE1BIG1hc2sgJSNsbHggaXMgbGFyZ2VyIHRoYW4gZG1hX2FkZHJfdCBhbGxvd3NcbiIsCiAJCQkJIG1hc2spOwpAQCAtMjg5LDExICsyODksMTEgQEAKIAogc3RhdGljIHZvaWQgKl9fYWxsb2NfZnJvbV9jb250aWd1b3VzKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCiAJCQkJICAgICBwZ3Byb3RfdCBwcm90LCBzdHJ1Y3QgcGFnZSAqKnJldF9wYWdlLAotCQkJCSAgICAgY29uc3Qgdm9pZCAqY2FsbGVyKTsKKwkJCQkgICAgIGNvbnN0IHZvaWQgKmNhbGxlciwgYm9vbCB3YW50X3ZhZGRyKTsKIAogc3RhdGljIHZvaWQgKl9fYWxsb2NfcmVtYXBfYnVmZmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGdmcF90IGdmcCwKIAkJCQkgcGdwcm90X3QgcHJvdCwgc3RydWN0IHBhZ2UgKipyZXRfcGFnZSwKLQkJCQkgY29uc3Qgdm9pZCAqY2FsbGVyKTsKKwkJCQkgY29uc3Qgdm9pZCAqY2FsbGVyLCBib29sIHdhbnRfdmFkZHIpOwogCiBzdGF0aWMgdm9pZCAqCiBfX2RtYV9hbGxvY19yZW1hcChzdHJ1Y3QgcGFnZSAqcGFnZSwgc2l6ZV90IHNpemUsIGdmcF90IGdmcCwgcGdwcm90X3QgcHJvdCwKQEAgLTM1NywxMCArMzU3LDEwIEBACiAKIAlpZiAoZGV2X2dldF9jbWFfYXJlYShOVUxMKSkKIAkJcHRyID0gX19hbGxvY19mcm9tX2NvbnRpZ3VvdXMoTlVMTCwgYXRvbWljX3Bvb2xfc2l6ZSwgcHJvdCwKLQkJCQkJICAgICAgJnBhZ2UsIGF0b21pY19wb29sX2luaXQpOworCQkJCQkgICAgICAmcGFnZSwgYXRvbWljX3Bvb2xfaW5pdCwgdHJ1ZSk7CiAJZWxzZQogCQlwdHIgPSBfX2FsbG9jX3JlbWFwX2J1ZmZlcihOVUxMLCBhdG9taWNfcG9vbF9zaXplLCBnZnAsIHByb3QsCi0JCQkJCSAgICZwYWdlLCBhdG9taWNfcG9vbF9pbml0KTsKKwkJCQkJICAgJnBhZ2UsIGF0b21pY19wb29sX2luaXQsIHRydWUpOwogCWlmIChwdHIpIHsKIAkJaW50IHJldDsKIApAQCAtNDY3LDEzICs0NjcsMTUgQEAKIAogc3RhdGljIHZvaWQgKl9fYWxsb2NfcmVtYXBfYnVmZmVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGdmcF90IGdmcCwKIAkJCQkgcGdwcm90X3QgcHJvdCwgc3RydWN0IHBhZ2UgKipyZXRfcGFnZSwKLQkJCQkgY29uc3Qgdm9pZCAqY2FsbGVyKQorCQkJCSBjb25zdCB2b2lkICpjYWxsZXIsIGJvb2wgd2FudF92YWRkcikKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl2b2lkICpwdHI7CisJdm9pZCAqcHRyID0gTlVMTDsKIAlwYWdlID0gX19kbWFfYWxsb2NfYnVmZmVyKGRldiwgc2l6ZSwgZ2ZwKTsKIAlpZiAoIXBhZ2UpCiAJCXJldHVybiBOVUxMOworCWlmICghd2FudF92YWRkcikKKwkJZ290byBvdXQ7CiAKIAlwdHIgPSBfX2RtYV9hbGxvY19yZW1hcChwYWdlLCBzaXplLCBnZnAsIHByb3QsIGNhbGxlcik7CiAJaWYgKCFwdHIpIHsKQEAgLTQ4MSw2ICs0ODMsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKKyBvdXQ6CiAJKnJldF9wYWdlID0gcGFnZTsKIAlyZXR1cm4gcHRyOwogfQpAQCAtNTIzLDEyICs1MjYsMTIgQEAKIAogc3RhdGljIHZvaWQgKl9fYWxsb2NfZnJvbV9jb250aWd1b3VzKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCiAJCQkJICAgICBwZ3Byb3RfdCBwcm90LCBzdHJ1Y3QgcGFnZSAqKnJldF9wYWdlLAotCQkJCSAgICAgY29uc3Qgdm9pZCAqY2FsbGVyKQorCQkJCSAgICAgY29uc3Qgdm9pZCAqY2FsbGVyLCBib29sIHdhbnRfdmFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBvcmRlciA9IGdldF9vcmRlcihzaXplKTsKIAlzaXplX3QgY291bnQgPSBzaXplID4+IFBBR0VfU0hJRlQ7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0Jdm9pZCAqcHRyOworCXZvaWQgKnB0ciA9IE5VTEw7CiAKIAlwYWdlID0gZG1hX2FsbG9jX2Zyb21fY29udGlndW91cyhkZXYsIGNvdW50LCBvcmRlcik7CiAJaWYgKCFwYWdlKQpAQCAtNTM2LDYgKzUzOSw5IEBACiAKIAlfX2RtYV9jbGVhcl9idWZmZXIocGFnZSwgc2l6ZSk7CiAKKwlpZiAoIXdhbnRfdmFkZHIpCisJCWdvdG8gb3V0OworCiAJaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpKSB7CiAJCXB0ciA9IF9fZG1hX2FsbG9jX3JlbWFwKHBhZ2UsIHNpemUsIEdGUF9LRVJORUwsIHByb3QsIGNhbGxlcik7CiAJCWlmICghcHRyKSB7CkBAIC01NDYsMTcgKzU1MiwyMSBAQAogCQlfX2RtYV9yZW1hcChwYWdlLCBzaXplLCBwcm90KTsKIAkJcHRyID0gcGFnZV9hZGRyZXNzKHBhZ2UpOwogCX0KKworIG91dDoKIAkqcmV0X3BhZ2UgPSBwYWdlOwogCXJldHVybiBwdHI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZnJlZV9mcm9tX2NvbnRpZ3VvdXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCQkgICB2b2lkICpjcHVfYWRkciwgc2l6ZV90IHNpemUpCisJCQkJICAgdm9pZCAqY3B1X2FkZHIsIHNpemVfdCBzaXplLCBib29sIHdhbnRfdmFkZHIpCiB7Ci0JaWYgKFBhZ2VIaWdoTWVtKHBhZ2UpKQotCQlfX2RtYV9mcmVlX3JlbWFwKGNwdV9hZGRyLCBzaXplKTsKLQllbHNlCi0JCV9fZG1hX3JlbWFwKHBhZ2UsIHNpemUsIFBBR0VfS0VSTkVMKTsKKwlpZiAod2FudF92YWRkcikgeworCQlpZiAoUGFnZUhpZ2hNZW0ocGFnZSkpCisJCQlfX2RtYV9mcmVlX3JlbWFwKGNwdV9hZGRyLCBzaXplKTsKKwkJZWxzZQorCQkJX19kbWFfcmVtYXAocGFnZSwgc2l6ZSwgUEFHRV9LRVJORUwpOworCX0KIAlkbWFfcmVsZWFzZV9mcm9tX2NvbnRpZ3VvdXMoZGV2LCBwYWdlLCBzaXplID4+IFBBR0VfU0hJRlQpOwogfQogCkBAIC01NzQsMTIgKzU4NCwxMiBAQAogCiAjZGVmaW5lIG5vbW11KCkgMQogCi0jZGVmaW5lIF9fZ2V0X2RtYV9wZ3Byb3QoYXR0cnMsIHByb3QpCV9fcGdwcm90KDApCi0jZGVmaW5lIF9fYWxsb2NfcmVtYXBfYnVmZmVyKGRldiwgc2l6ZSwgZ2ZwLCBwcm90LCByZXQsIGMpCU5VTEwKKyNkZWZpbmUgX19nZXRfZG1hX3BncHJvdChhdHRycywgcHJvdCkJCQkJX19wZ3Byb3QoMCkKKyNkZWZpbmUgX19hbGxvY19yZW1hcF9idWZmZXIoZGV2LCBzaXplLCBnZnAsIHByb3QsIHJldCwgYywgd3YpCU5VTEwKICNkZWZpbmUgX19hbGxvY19mcm9tX3Bvb2woc2l6ZSwgcmV0X3BhZ2UpCQkJTlVMTAotI2RlZmluZSBfX2FsbG9jX2Zyb21fY29udGlndW91cyhkZXYsIHNpemUsIHByb3QsIHJldCwgYykJTlVMTAorI2RlZmluZSBfX2FsbG9jX2Zyb21fY29udGlndW91cyhkZXYsIHNpemUsIHByb3QsIHJldCwgYywgd3YpCU5VTEwKICNkZWZpbmUgX19mcmVlX2Zyb21fcG9vbChjcHVfYWRkciwgc2l6ZSkJCQkwCi0jZGVmaW5lIF9fZnJlZV9mcm9tX2NvbnRpZ3VvdXMoZGV2LCBwYWdlLCBjcHVfYWRkciwgc2l6ZSkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBfX2ZyZWVfZnJvbV9jb250aWd1b3VzKGRldiwgcGFnZSwgY3B1X2FkZHIsIHNpemUsIHd2KQlkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIF9fZG1hX2ZyZWVfcmVtYXAoY3B1X2FkZHIsIHNpemUpCQkJZG8geyB9IHdoaWxlICgwKQogCiAjZW5kaWYJLyogQ09ORklHX01NVSAqLwpAQCAtNTk5LDExICs2MDksMTMgQEAKIAogCiBzdGF0aWMgdm9pZCAqX19kbWFfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwgZG1hX2FkZHJfdCAqaGFuZGxlLAotCQkJIGdmcF90IGdmcCwgcGdwcm90X3QgcHJvdCwgYm9vbCBpc19jb2hlcmVudCwgY29uc3Qgdm9pZCAqY2FsbGVyKQorCQkJIGdmcF90IGdmcCwgcGdwcm90X3QgcHJvdCwgYm9vbCBpc19jb2hlcmVudCwKKwkJCSBzdHJ1Y3QgZG1hX2F0dHJzICphdHRycywgY29uc3Qgdm9pZCAqY2FsbGVyKQogewogCXU2NCBtYXNrID0gZ2V0X2NvaGVyZW50X2RtYV9tYXNrKGRldik7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCXZvaWQgKmFkZHI7CisJYm9vbCB3YW50X3ZhZGRyOwogCiAjaWZkZWYgQ09ORklHX0RNQV9BUElfREVCVUcKIAl1NjQgbGltaXQgPSAobWFzayArIDEpICYgfm1hc2s7CkBAIC02MzEsMjAgKzY0MywyMSBAQAogCiAJKmhhbmRsZSA9IERNQV9FUlJPUl9DT0RFOwogCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOworCXdhbnRfdmFkZHIgPSAhZG1hX2dldF9hdHRyKERNQV9BVFRSX05PX0tFUk5FTF9NQVBQSU5HLCBhdHRycyk7CiAKIAlpZiAoaXNfY29oZXJlbnQgfHwgbm9tbXUoKSkKIAkJYWRkciA9IF9fYWxsb2Nfc2ltcGxlX2J1ZmZlcihkZXYsIHNpemUsIGdmcCwgJnBhZ2UpOwogCWVsc2UgaWYgKCEoZ2ZwICYgX19HRlBfV0FJVCkpCiAJCWFkZHIgPSBfX2FsbG9jX2Zyb21fcG9vbChzaXplLCAmcGFnZSk7CiAJZWxzZSBpZiAoIWRldl9nZXRfY21hX2FyZWEoZGV2KSkKLQkJYWRkciA9IF9fYWxsb2NfcmVtYXBfYnVmZmVyKGRldiwgc2l6ZSwgZ2ZwLCBwcm90LCAmcGFnZSwgY2FsbGVyKTsKKwkJYWRkciA9IF9fYWxsb2NfcmVtYXBfYnVmZmVyKGRldiwgc2l6ZSwgZ2ZwLCBwcm90LCAmcGFnZSwgY2FsbGVyLCB3YW50X3ZhZGRyKTsKIAllbHNlCi0JCWFkZHIgPSBfX2FsbG9jX2Zyb21fY29udGlndW91cyhkZXYsIHNpemUsIHByb3QsICZwYWdlLCBjYWxsZXIpOworCQlhZGRyID0gX19hbGxvY19mcm9tX2NvbnRpZ3VvdXMoZGV2LCBzaXplLCBwcm90LCAmcGFnZSwgY2FsbGVyLCB3YW50X3ZhZGRyKTsKIAotCWlmIChhZGRyKQorCWlmIChwYWdlKQogCQkqaGFuZGxlID0gcGZuX3RvX2RtYShkZXYsIHBhZ2VfdG9fcGZuKHBhZ2UpKTsKIAotCXJldHVybiBhZGRyOworCXJldHVybiB3YW50X3ZhZGRyID8gYWRkciA6IHBhZ2U7CiB9CiAKIC8qCkBAIC02NjEsNyArNjc0LDcgQEAKIAkJcmV0dXJuIG1lbW9yeTsKIAogCXJldHVybiBfX2RtYV9hbGxvYyhkZXYsIHNpemUsIGhhbmRsZSwgZ2ZwLCBwcm90LCBmYWxzZSwKLQkJCSAgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CisJCQkgICBhdHRycywgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KIAogc3RhdGljIHZvaWQgKmFybV9jb2hlcmVudF9kbWFfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKQEAgLTY3NCw3ICs2ODcsNyBAQAogCQlyZXR1cm4gbWVtb3J5OwogCiAJcmV0dXJuIF9fZG1hX2FsbG9jKGRldiwgc2l6ZSwgaGFuZGxlLCBnZnAsIHByb3QsIHRydWUsCi0JCQkgICBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCQkJICAgYXR0cnMsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiB9CiAKIC8qCkBAIC03MTUsNiArNzI4LDcgQEAKIAkJCSAgIGJvb2wgaXNfY29oZXJlbnQpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShkbWFfdG9fcGZuKGRldiwgaGFuZGxlKSk7CisJYm9vbCB3YW50X3ZhZGRyID0gIWRtYV9nZXRfYXR0cihETUFfQVRUUl9OT19LRVJORUxfTUFQUElORywgYXR0cnMpOwogCiAJaWYgKGRtYV9yZWxlYXNlX2Zyb21fY29oZXJlbnQoZGV2LCBnZXRfb3JkZXIoc2l6ZSksIGNwdV9hZGRyKSkKIAkJcmV0dXJuOwpAQCAtNzI2LDE0ICs3NDAsMTUgQEAKIAl9IGVsc2UgaWYgKF9fZnJlZV9mcm9tX3Bvb2woY3B1X2FkZHIsIHNpemUpKSB7CiAJCXJldHVybjsKIAl9IGVsc2UgaWYgKCFkZXZfZ2V0X2NtYV9hcmVhKGRldikpIHsKLQkJX19kbWFfZnJlZV9yZW1hcChjcHVfYWRkciwgc2l6ZSk7CisJCWlmICh3YW50X3ZhZGRyKQorCQkJX19kbWFfZnJlZV9yZW1hcChjcHVfYWRkciwgc2l6ZSk7CiAJCV9fZG1hX2ZyZWVfYnVmZmVyKHBhZ2UsIHNpemUpOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIE5vbi1hdG9taWMgYWxsb2NhdGlvbnMgY2Fubm90IGJlIGZyZWVkIHdpdGggSVJRcyBkaXNhYmxlZAogCQkgKi8KIAkJV0FSTl9PTihpcnFzX2Rpc2FibGVkKCkpOwotCQlfX2ZyZWVfZnJvbV9jb250aWd1b3VzKGRldiwgcGFnZSwgY3B1X2FkZHIsIHNpemUpOworCQlfX2ZyZWVfZnJvbV9jb250aWd1b3VzKGRldiwgcGFnZSwgY3B1X2FkZHIsIHNpemUsIHdhbnRfdmFkZHIpOwogCX0KIH0KIApAQCAtMTEzNSwxMyArMTE1MCwyOCBAQAogCWdmcCB8PSBfX0dGUF9OT1dBUk4gfCBfX0dGUF9ISUdITUVNOwogCiAJd2hpbGUgKGNvdW50KSB7Ci0JCWludCBqLCBvcmRlciA9IF9fZmxzKGNvdW50KTsKKwkJaW50IGosIG9yZGVyOwogCi0JCXBhZ2VzW2ldID0gYWxsb2NfcGFnZXMoZ2ZwLCBvcmRlcik7Ci0JCXdoaWxlICghcGFnZXNbaV0gJiYgb3JkZXIpCi0JCQlwYWdlc1tpXSA9IGFsbG9jX3BhZ2VzKGdmcCwgLS1vcmRlcik7Ci0JCWlmICghcGFnZXNbaV0pCi0JCQlnb3RvIGVycm9yOworCQlmb3IgKG9yZGVyID0gX19mbHMoY291bnQpOyBvcmRlciA+IDA7IC0tb3JkZXIpIHsKKwkJCS8qCisJCQkgKiBXZSBkbyBub3Qgd2FudCBPT00ga2lsbGVyIHRvIGJlIGludm9rZWQgYXMgbG9uZworCQkJICogYXMgd2UgY2FuIGZhbGwgYmFjayB0byBzaW5nbGUgcGFnZXMsIHNvIHdlIGZvcmNlCisJCQkgKiBfX0dGUF9OT1JFVFJZIGZvciBvcmRlcnMgaGlnaGVyIHRoYW4gemVyby4KKwkJCSAqLworCQkJcGFnZXNbaV0gPSBhbGxvY19wYWdlcyhnZnAgfCBfX0dGUF9OT1JFVFJZLCBvcmRlcik7CisJCQlpZiAocGFnZXNbaV0pCisJCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIXBhZ2VzW2ldKSB7CisJCQkvKgorCQkJICogRmFsbCBiYWNrIHRvIHNpbmdsZSBwYWdlIGFsbG9jYXRpb24uCisJCQkgKiBNaWdodCBpbnZva2UgT09NIGtpbGxlciBhcyBsYXN0IHJlc29ydC4KKwkJCSAqLworCQkJcGFnZXNbaV0gPSBhbGxvY19wYWdlcyhnZnAsIDApOworCQkJaWYgKCFwYWdlc1tpXSkKKwkJCQlnb3RvIGVycm9yOworCQl9CiAKIAkJaWYgKG9yZGVyKSB7CiAJCQlzcGxpdF9wYWdlKHBhZ2VzW2ldLCBvcmRlcik7CkBAIC0xMjA2LDcgKzEyMzYsNyBAQAogc3RhdGljIGRtYV9hZGRyX3QKIF9faW9tbXVfY3JlYXRlX21hcHBpbmcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBzaXplX3Qgc2l6ZSkKIHsKLQlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcgPSBkZXYtPmFyY2hkYXRhLm1hcHBpbmc7CisJc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nID0gdG9fZG1hX2lvbW11X21hcHBpbmcoZGV2KTsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSBQQUdFX0FMSUdOKHNpemUpID4+IFBBR0VfU0hJRlQ7CiAJZG1hX2FkZHJfdCBkbWFfYWRkciwgaW92YTsKIAlpbnQgaSwgcmV0ID0gRE1BX0VSUk9SX0NPREU7CkBAIC0xMjQyLDcgKzEyNzIsNyBAQAogCiBzdGF0aWMgaW50IF9faW9tbXVfcmVtb3ZlX21hcHBpbmcoc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGlvdmEsIHNpemVfdCBzaXplKQogewotCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZyA9IGRldi0+YXJjaGRhdGEubWFwcGluZzsKKwlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcgPSB0b19kbWFfaW9tbXVfbWFwcGluZyhkZXYpOwogCiAJLyoKIAkgKiBhZGQgb3B0aW9uYWwgaW4tcGFnZSBvZmZzZXQgZnJvbSBpb3ZhIHRvIHNpemUgYW5kIGFsaWduCkBAIC0xNDU3LDcgKzE0ODcsNyBAQAogCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzLAogCQkJICBib29sIGlzX2NvaGVyZW50KQogewotCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZyA9IGRldi0+YXJjaGRhdGEubWFwcGluZzsKKwlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcgPSB0b19kbWFfaW9tbXVfbWFwcGluZyhkZXYpOwogCWRtYV9hZGRyX3QgaW92YSwgaW92YV9iYXNlOwogCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGludCBjb3VudDsKQEAgLTE2NzgsNyArMTcwOCw3IEBACiAJICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKIAkgICAgIHN0cnVjdCBkbWFfYXR0cnMgKmF0dHJzKQogewotCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZyA9IGRldi0+YXJjaGRhdGEubWFwcGluZzsKKwlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcgPSB0b19kbWFfaW9tbXVfbWFwcGluZyhkZXYpOwogCWRtYV9hZGRyX3QgZG1hX2FkZHI7CiAJaW50IHJldCwgcHJvdCwgbGVuID0gUEFHRV9BTElHTihzaXplICsgb2Zmc2V0KTsKIApAQCAtMTczMSw3ICsxNzYxLDcgQEAKIAkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKIAkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7Ci0Jc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nID0gZGV2LT5hcmNoZGF0YS5tYXBwaW5nOworCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZyA9IHRvX2RtYV9pb21tdV9tYXBwaW5nKGRldik7CiAJZG1hX2FkZHJfdCBpb3ZhID0gaGFuZGxlICYgUEFHRV9NQVNLOwogCWludCBvZmZzZXQgPSBoYW5kbGUgJiB+UEFHRV9NQVNLOwogCWludCBsZW4gPSBQQUdFX0FMSUdOKHNpemUgKyBvZmZzZXQpOwpAQCAtMTc1Niw3ICsxNzg2LDcgQEAKIAkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKIAkJc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7Ci0Jc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nID0gZGV2LT5hcmNoZGF0YS5tYXBwaW5nOworCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZyA9IHRvX2RtYV9pb21tdV9tYXBwaW5nKGRldik7CiAJZG1hX2FkZHJfdCBpb3ZhID0gaGFuZGxlICYgUEFHRV9NQVNLOwogCXN0cnVjdCBwYWdlICpwYWdlID0gcGh5c190b19wYWdlKGlvbW11X2lvdmFfdG9fcGh5cyhtYXBwaW5nLT5kb21haW4sIGlvdmEpKTsKIAlpbnQgb2Zmc2V0ID0gaGFuZGxlICYgflBBR0VfTUFTSzsKQEAgLTE3NzUsNyArMTgwNSw3IEBACiBzdGF0aWMgdm9pZCBhcm1faW9tbXVfc3luY19zaW5nbGVfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCWRtYV9hZGRyX3QgaGFuZGxlLCBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQogewotCXN0cnVjdCBkbWFfaW9tbXVfbWFwcGluZyAqbWFwcGluZyA9IGRldi0+YXJjaGRhdGEubWFwcGluZzsKKwlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcgPSB0b19kbWFfaW9tbXVfbWFwcGluZyhkZXYpOwogCWRtYV9hZGRyX3QgaW92YSA9IGhhbmRsZSAmIFBBR0VfTUFTSzsKIAlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHBoeXNfdG9fcGFnZShpb21tdV9pb3ZhX3RvX3BoeXMobWFwcGluZy0+ZG9tYWluLCBpb3ZhKSk7CiAJdW5zaWduZWQgaW50IG9mZnNldCA9IGhhbmRsZSAmIH5QQUdFX01BU0s7CkBAIC0xNzg5LDcgKzE4MTksNyBAQAogc3RhdGljIHZvaWQgYXJtX2lvbW11X3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAogCQlkbWFfYWRkcl90IGhhbmRsZSwgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKIHsKLQlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcgPSBkZXYtPmFyY2hkYXRhLm1hcHBpbmc7CisJc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nID0gdG9fZG1hX2lvbW11X21hcHBpbmcoZGV2KTsKIAlkbWFfYWRkcl90IGlvdmEgPSBoYW5kbGUgJiBQQUdFX01BU0s7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwaHlzX3RvX3BhZ2UoaW9tbXVfaW92YV90b19waHlzKG1hcHBpbmctPmRvbWFpbiwgaW92YSkpOwogCXVuc2lnbmVkIGludCBvZmZzZXQgPSBoYW5kbGUgJiB+UEFHRV9NQVNLOwpAQCAtMTk1MCw3ICsxOTgwLDcgQEAKIAkJcmV0dXJuIGVycjsKIAogCWtyZWZfZ2V0KCZtYXBwaW5nLT5rcmVmKTsKLQlkZXYtPmFyY2hkYXRhLm1hcHBpbmcgPSBtYXBwaW5nOworCXRvX2RtYV9pb21tdV9tYXBwaW5nKGRldikgPSBtYXBwaW5nOwogCiAJcHJfZGVidWcoIkF0dGFjaGVkIElPTU1VIGNvbnRyb2xsZXIgdG8gJXMgZGV2aWNlLlxuIiwgZGV2X25hbWUoZGV2KSk7CiAJcmV0dXJuIDA7CkBAIC0xOTk1LDcgKzIwMjUsNyBAQAogCiAJaW9tbXVfZGV0YWNoX2RldmljZShtYXBwaW5nLT5kb21haW4sIGRldik7CiAJa3JlZl9wdXQoJm1hcHBpbmctPmtyZWYsIHJlbGVhc2VfaW9tbXVfbWFwcGluZyk7Ci0JZGV2LT5hcmNoZGF0YS5tYXBwaW5nID0gTlVMTDsKKwl0b19kbWFfaW9tbXVfbWFwcGluZyhkZXYpID0gTlVMTDsKIAogCXByX2RlYnVnKCJEZXRhY2hlZCBJT01NVSBjb250cm9sbGVyIGZyb20gJXMgZGV2aWNlLlxuIiwgZGV2X25hbWUoZGV2KSk7CiB9CkBAIC0yMDI3LDYgKzIwNTcsMTMgQEAKIAlpZiAoIWlvbW11KQogCQlyZXR1cm4gZmFsc2U7CiAKKwkvKgorCSAqIGN1cnJlbnRseSBhcm1faW9tbXVfY3JlYXRlX21hcHBpbmcoKSB0YWtlcyBhIG1heCBvZiBzaXplX3QKKwkgKiBmb3Igc2l6ZSBwYXJhbS4gU28gY2hlY2sgdGhpcyBsaW1pdCBmb3Igbm93LgorCSAqLworCWlmIChzaXplID4gU0laRV9NQVgpCisJCXJldHVybiBmYWxzZTsKKwogCW1hcHBpbmcgPSBhcm1faW9tbXVfY3JlYXRlX21hcHBpbmcoZGV2LT5idXMsIGRtYV9iYXNlLCBzaXplKTsKIAlpZiAoSVNfRVJSKG1hcHBpbmcpKSB7CiAJCXByX3dhcm4oIkZhaWxlZCB0byBjcmVhdGUgJWxsdS1ieXRlIElPTU1VIG1hcHBpbmcgZm9yIGRldmljZSAlc1xuIiwKQEAgLTIwNDYsNyArMjA4Myw3IEBACiAKIHN0YXRpYyB2b2lkIGFybV90ZWFyZG93bl9pb21tdV9kbWFfb3BzKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZG1hX2lvbW11X21hcHBpbmcgKm1hcHBpbmcgPSBkZXYtPmFyY2hkYXRhLm1hcHBpbmc7CisJc3RydWN0IGRtYV9pb21tdV9tYXBwaW5nICptYXBwaW5nID0gdG9fZG1hX2lvbW11X21hcHBpbmcoZGV2KTsKIAogCWlmICghbWFwcGluZykKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vZmF1bHQuYyBiL2FyY2gvYXJtL21tL2ZhdWx0LmMKaW5kZXggYTk4MmRjMy4uNjMzM2Q5YyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vZmF1bHQuYworKysgYi9hcmNoL2FybS9tbS9mYXVsdC5jCkBAIC01NTIsNiArNTUyLDcgQEAKIAogCXByX2FsZXJ0KCJVbmhhbmRsZWQgZmF1bHQ6ICVzICgweCUwM3gpIGF0IDB4JTA4bHhcbiIsCiAJCWluZi0+bmFtZSwgZnNyLCBhZGRyKTsKKwlzaG93X3B0ZShjdXJyZW50LT5tbSwgYWRkcik7CiAKIAlpbmZvLnNpX3NpZ25vID0gaW5mLT5zaWc7CiAJaW5mby5zaV9lcnJubyA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9pbml0LmMgYi9hcmNoL2FybS9tbS9pbml0LmMKaW5kZXggMTYwOWIwMi4uYmU5MmZhMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vaW5pdC5jCisrKyBiL2FyY2gvYXJtL21tL2luaXQuYwpAQCAtODYsNTUgKzg2LDYgQEAKIAogX190YWd0YWJsZShBVEFHX0lOSVRSRDIsIHBhcnNlX3RhZ19pbml0cmQyKTsKIAotLyoKLSAqIFRoaXMga2VlcHMgbWVtb3J5IGNvbmZpZ3VyYXRpb24gZGF0YSB1c2VkIGJ5IGEgY291cGxlIG1lbW9yeQotICogaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLCBhcyB3ZWxsIGFzIHNob3dfbWVtKCkgZm9yIHRoZSBza2lwcGluZwotICogb2YgaG9sZXMgaW4gdGhlIG1lbW9yeSBtYXAuICBJdCBpcyBwb3B1bGF0ZWQgYnkgYXJtX2FkZF9tZW1vcnkoKS4KLSAqLwotdm9pZCBzaG93X21lbSh1bnNpZ25lZCBpbnQgZmlsdGVyKQotewotCWludCBmcmVlID0gMCwgdG90YWwgPSAwLCByZXNlcnZlZCA9IDA7Ci0JaW50IHNoYXJlZCA9IDAsIGNhY2hlZCA9IDAsIHNsYWIgPSAwOwotCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnJlZzsKLQotCXByaW50aygiTWVtLWluZm86XG4iKTsKLQlzaG93X2ZyZWVfYXJlYXMoZmlsdGVyKTsKLQotCWZvcl9lYWNoX21lbWJsb2NrIChtZW1vcnksIHJlZykgewotCQl1bnNpZ25lZCBpbnQgcGZuMSwgcGZuMjsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UsICplbmQ7Ci0KLQkJcGZuMSA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfYmFzZV9wZm4ocmVnKTsKLQkJcGZuMiA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfZW5kX3BmbihyZWcpOwotCi0JCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4xKTsKLQkJZW5kICA9IHBmbl90b19wYWdlKHBmbjIgLSAxKSArIDE7Ci0KLQkJZG8gewotCQkJdG90YWwrKzsKLQkJCWlmIChQYWdlUmVzZXJ2ZWQocGFnZSkpCi0JCQkJcmVzZXJ2ZWQrKzsKLQkJCWVsc2UgaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpCi0JCQkJY2FjaGVkKys7Ci0JCQllbHNlIGlmIChQYWdlU2xhYihwYWdlKSkKLQkJCQlzbGFiKys7Ci0JCQllbHNlIGlmICghcGFnZV9jb3VudChwYWdlKSkKLQkJCQlmcmVlKys7Ci0JCQllbHNlCi0JCQkJc2hhcmVkICs9IHBhZ2VfY291bnQocGFnZSkgLSAxOwotCQkJcGZuMSsrOwotCQkJcGFnZSA9IHBmbl90b19wYWdlKHBmbjEpOwotCQl9IHdoaWxlIChwZm4xIDwgcGZuMik7Ci0JfQotCi0JcHJpbnRrKCIlZCBwYWdlcyBvZiBSQU1cbiIsIHRvdGFsKTsKLQlwcmludGsoIiVkIGZyZWUgcGFnZXNcbiIsIGZyZWUpOwotCXByaW50aygiJWQgcmVzZXJ2ZWQgcGFnZXNcbiIsIHJlc2VydmVkKTsKLQlwcmludGsoIiVkIHNsYWIgcGFnZXNcbiIsIHNsYWIpOwotCXByaW50aygiJWQgcGFnZXMgc2hhcmVkXG4iLCBzaGFyZWQpOwotCXByaW50aygiJWQgcGFnZXMgc3dhcCBjYWNoZWRcbiIsIGNhY2hlZCk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBmaW5kX2xpbWl0cyh1bnNpZ25lZCBsb25nICptaW4sIHVuc2lnbmVkIGxvbmcgKm1heF9sb3csCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbWF4X2hpZ2gpCiB7CkBAIC0zMzUsNiArMjg2LDkgQEAKIAogCWZpbmRfbGltaXRzKCZtaW4sICZtYXhfbG93LCAmbWF4X2hpZ2gpOwogCisJZWFybHlfbWVtdGVzdCgocGh5c19hZGRyX3QpbWluIDw8IFBBR0VfU0hJRlQsCisJCSAgICAgIChwaHlzX2FkZHJfdCltYXhfbG93IDw8IFBBR0VfU0hJRlQpOworCiAJLyoKIAkgKiBTcGFyc2VtZW0gdHJpZXMgdG8gYWxsb2NhdGUgYm9vdG1lbSBpbiBtZW1vcnlfcHJlc2VudCgpLAogCSAqIHNvIG11c3QgYmUgZG9uZSBhZnRlciB0aGUgZml4ZWQgcmVzZXJ2YXRpb25zCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9tbWFwLmMgYi9hcmNoL2FybS9tbS9tbWFwLmMKaW5kZXggNWU4NWVkMy4uNDA3ZGM3OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vbW1hcC5jCisrKyBiL2FyY2gvYXJtL21tL21tYXAuYwpAQCAtMTY5LDE0ICsxNjksMjIgQEAKIAlyZXR1cm4gYWRkcjsKIH0KIAordW5zaWduZWQgbG9uZyBhcmNoX21tYXBfcm5kKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBybmQ7CisKKwkvKiA4IGJpdHMgb2YgcmFuZG9tbmVzcyBpbiAyMCBhZGRyZXNzIHNwYWNlIGJpdHMgKi8KKwlybmQgPSAodW5zaWduZWQgbG9uZylnZXRfcmFuZG9tX2ludCgpICUgKDEgPDwgOCk7CisKKwlyZXR1cm4gcm5kIDw8IFBBR0VfU0hJRlQ7Cit9CisKIHZvaWQgYXJjaF9waWNrX21tYXBfbGF5b3V0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewogCXVuc2lnbmVkIGxvbmcgcmFuZG9tX2ZhY3RvciA9IDBVTDsKIAotCS8qIDggYml0cyBvZiByYW5kb21uZXNzIGluIDIwIGFkZHJlc3Mgc3BhY2UgYml0cyAqLwotCWlmICgoY3VycmVudC0+ZmxhZ3MgJiBQRl9SQU5ET01JWkUpICYmCi0JICAgICEoY3VycmVudC0+cGVyc29uYWxpdHkgJiBBRERSX05PX1JBTkRPTUlaRSkpCi0JCXJhbmRvbV9mYWN0b3IgPSAoZ2V0X3JhbmRvbV9pbnQoKSAlICgxIDw8IDgpKSA8PCBQQUdFX1NISUZUOworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkKKwkJcmFuZG9tX2ZhY3RvciA9IGFyY2hfbW1hcF9ybmQoKTsKIAogCWlmIChtbWFwX2lzX2xlZ2FjeSgpKSB7CiAJCW1tLT5tbWFwX2Jhc2UgPSBUQVNLX1VOTUFQUEVEX0JBU0UgKyByYW5kb21fZmFjdG9yOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcGFnZWF0dHIuYyBiL2FyY2gvYXJtL21tL3BhZ2VhdHRyLmMKaW5kZXggMDA0ZTM1Yy4uY2YzMGRhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcGFnZWF0dHIuYworKysgYi9hcmNoL2FybS9tbS9wYWdlYXR0ci5jCkBAIC00OSw3ICs0OSwxMCBAQAogCQlXQVJOX09OX09OQ0UoMSk7CiAJfQogCi0JaWYgKCFpc19tb2R1bGVfYWRkcmVzcyhzdGFydCkgfHwgIWlzX21vZHVsZV9hZGRyZXNzKGVuZCAtIDEpKQorCWlmIChzdGFydCA8IE1PRFVMRVNfVkFERFIgfHwgc3RhcnQgPj0gTU9EVUxFU19FTkQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGVuZCA8IE1PRFVMRVNfVkFERFIgfHwgc3RhcnQgPj0gTU9EVUxFU19FTkQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZGF0YS5zZXRfbWFzayA9IHNldF9tYXNrOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwppbmRleCA4NmVlNWQ0Li5hYTA1MTllIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjAuUwpAQCAtNTA3LDcgKzUwNyw3IEBACiAKIAkuYWxpZ24KIAotCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKKwkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jCiAKIAkudHlwZQlfX2FybTEwMjBfcHJvY19pbmZvLCNvYmplY3QKIF9fYXJtMTAyMF9wcm9jX2luZm86CkBAIC01MTksNyArNTE5LDcgQEAKIAkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQlQTURfU0VDVF9BUF9SRUFECi0JYglfX2FybTEwMjBfc2V0dXAKKwlpbml0Zm4JX19hcm0xMDIwX3NldHVwLCBfX2FybTEwMjBfcHJvY19pbmZvCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQogCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIwZS5TCmluZGV4IGE2MzMxZDcuLmJmZjRjN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMGUuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjBlLlMKQEAgLTQ2NSw3ICs0NjUsNyBAQAogCiAJLmFsaWduCiAKLQkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCisJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYwogCiAJLnR5cGUJX19hcm0xMDIwZV9wcm9jX2luZm8sI29iamVjdAogX19hcm0xMDIwZV9wcm9jX2luZm86CkBAIC00NzksNyArNDc5LDcgQEAKIAkJUE1EX0JJVDQgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQlQTURfU0VDVF9BUF9SRUFECi0JYglfX2FybTEwMjBlX3NldHVwCisJaW5pdGZuCV9fYXJtMTAyMGVfc2V0dXAsIF9fYXJtMTAyMGVfcHJvY19pbmZvCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQogCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQiB8IEhXQ0FQX0VEU1AKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyMi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKaW5kZXggYTEyNmI3YS4uZGJiMjQxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm0xMDIyLlMKQEAgLTQ0OCw3ICs0NDgsNyBAQAogCiAJLmFsaWduCiAKLQkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCisJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYwogCiAJLnR5cGUJX19hcm0xMDIyX3Byb2NfaW5mbywjb2JqZWN0CiBfX2FybTEwMjJfcHJvY19pbmZvOgpAQCAtNDYyLDcgKzQ2Miw3IEBACiAJCVBNRF9CSVQ0IHwgXAogCQlQTURfU0VDVF9BUF9XUklURSB8IFwKIAkJUE1EX1NFQ1RfQVBfUkVBRAotCWIJX19hcm0xMDIyX3NldHVwCisJaW5pdGZuCV9fYXJtMTAyMl9zZXR1cCwgX19hcm0xMDIyX3Byb2NfaW5mbwogCS5sb25nCWNwdV9hcmNoX25hbWUKIAkubG9uZwljcHVfZWxmX25hbWUKIAkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9IQUxGIHwgSFdDQVBfVEhVTUIgfCBIV0NBUF9FRFNQCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTEwMjYuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyNi5TCmluZGV4IGZjMjk0MDYuLjBiMzdiMmMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyNi5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtMTAyNi5TCkBAIC00NDIsNyArNDQyLDcgQEAKIAlzdHJpbmcJY3B1X2FybTEwMjZfbmFtZSwgIkFSTTEwMjZFSi1TIgogCS5hbGlnbgogCi0JLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgorCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MKIAogCS50eXBlCV9fYXJtMTAyNl9wcm9jX2luZm8sI29iamVjdAogX19hcm0xMDI2X3Byb2NfaW5mbzoKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCQlQTURfQklUNCB8IFwKIAkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCiAJCVBNRF9TRUNUX0FQX1JFQUQKLQliCV9fYXJtMTAyNl9zZXR1cAorCWluaXRmbglfX2FybTEwMjZfc2V0dXAsIF9fYXJtMTAyNl9wcm9jX2luZm8KIAkubG9uZwljcHVfYXJjaF9uYW1lCiAJLmxvbmcJY3B1X2VsZl9uYW1lCiAJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1B8SFdDQVBfSkFWQQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzIwLlMKaW5kZXggMmJhYTY2Yi4uMzY1MWNkNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03MjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTcyMC5TCkBAIC0xODYsNyArMTg2LDcgQEAKICAqIFNlZSA8YXNtL3Byb2NpbmZvLmg+IGZvciBhIGRlZmluaXRpb24gb2YgdGhpcyBzdHJ1Y3R1cmUuCiAgKi8KIAkKLQkJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgorCQkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jCiAKIC5tYWNybyBhcm03MjBfcHJvY19pbmZvIG5hbWU6cmVxLCBjcHVfdmFsOnJlcSwgY3B1X21hc2s6cmVxLCBjcHVfbmFtZTpyZXEsIGNwdV9mbHVzaDpyZXEKIAkJLnR5cGUJX19cbmFtZVwoKV9wcm9jX2luZm8sI29iamVjdApAQCAtMjAzLDcgKzIwMyw3IEBACiAJCQlQTURfQklUNCB8IFwKIAkJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQkJUE1EX1NFQ1RfQVBfUkVBRAotCQliCVxjcHVfZmx1c2gJCQkJQCBjcHVfZmx1c2gKKwkJaW5pdGZuCVxjcHVfZmx1c2gsIF9fXG5hbWVcKClfcHJvY19pbmZvCUAgY3B1X2ZsdXNoCiAJCS5sb25nCWNwdV9hcmNoX25hbWUJCQkJQCBhcmNoX25hbWUKIAkJLmxvbmcJY3B1X2VsZl9uYW1lCQkJCUAgZWxmX25hbWUKIAkJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRiB8IEhXQ0FQX1RIVU1CCUAgZWxmX2h3Y2FwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTc0MC5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm03NDAuUwppbmRleCBhYzFlYTZiLi4wMjRmYjc3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTc0MC5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtNzQwLlMKQEAgLTEzMiwxNCArMTMyLDE0IEBACiAKIAkuYWxpZ24KIAotCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKKwkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jCiAJLnR5cGUJX19hcm03NDBfcHJvY19pbmZvLCNvYmplY3QKIF9fYXJtNzQwX3Byb2NfaW5mbzoKIAkubG9uZwkweDQxODA3NDAwCiAJLmxvbmcJMHhmZmZmZmZmMAogCS5sb25nCTAKIAkubG9uZwkwCi0JYglfX2FybTc0MF9zZXR1cAorCWluaXRmbglfX2FybTc0MF9zZXR1cCwgX19hcm03NDBfcHJvY19pbmZvCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQogCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQiB8IEhXQ0FQXzI2QklUCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTd0ZG1pLlMgYi9hcmNoL2FybS9tbS9wcm9jLWFybTd0ZG1pLlMKaW5kZXggYmY2YmE0Yi4uMjU0NzJkOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm03dGRtaS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtN3RkbWkuUwpAQCAtNzYsNyArNzYsNyBAQAogCiAJCS5hbGlnbgogCi0JCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKKwkJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYwogCiAubWFjcm8gYXJtN3RkbWlfcHJvY19pbmZvIG5hbWU6cmVxLCBjcHVfdmFsOnJlcSwgY3B1X21hc2s6cmVxLCBjcHVfbmFtZTpyZXEsIFwKIAlleHRyYV9od2NhcHM9MApAQCAtODYsNyArODYsNyBAQAogCQkubG9uZwlcY3B1X21hc2sKIAkJLmxvbmcJMAogCQkubG9uZwkwCi0JCWIJX19hcm03dGRtaV9zZXR1cAorCQlpbml0Zm4JX19hcm03dGRtaV9zZXR1cCwgX19cbmFtZVwoKV9wcm9jX2luZm8KIAkJLmxvbmcJY3B1X2FyY2hfbmFtZQogCQkubG9uZwljcHVfZWxmX25hbWUKIAkJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfMjZCSVQgfCAoIFxleHRyYV9od2NhcHMgKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIwLlMKaW5kZXggMjJiZjhkZC4uN2ExNGJkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMC5TCkBAIC00NDgsNyArNDQ4LDcgQEAKIAogCS5hbGlnbgogCi0JLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgorCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MKIAogCS50eXBlCV9fYXJtOTIwX3Byb2NfaW5mbywjb2JqZWN0CiBfX2FybTkyMF9wcm9jX2luZm86CkBAIC00NjQsNyArNDY0LDcgQEAKIAkJUE1EX0JJVDQgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQlQTURfU0VDVF9BUF9SRUFECi0JYglfX2FybTkyMF9zZXR1cAorCWluaXRmbglfX2FybTkyMF9zZXR1cCwgX19hcm05MjBfcHJvY19pbmZvCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQogCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjIuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTIyLlMKaW5kZXggMGM2ZDVhYy4uZWRjY2ZjZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjIuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyMi5TCkBAIC00MjYsNyArNDI2LDcgQEAKIAogCS5hbGlnbgogCi0JLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgorCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MKIAogCS50eXBlCV9fYXJtOTIyX3Byb2NfaW5mbywjb2JqZWN0CiBfX2FybTkyMl9wcm9jX2luZm86CkBAIC00NDIsNyArNDQyLDcgQEAKIAkJUE1EX0JJVDQgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQlQTURfU0VDVF9BUF9SRUFECi0JYglfX2FybTkyMl9zZXR1cAorCWluaXRmbglfX2FybTkyMl9zZXR1cCwgX19hcm05MjJfcHJvY19pbmZvCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQogCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjUuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI1LlMKaW5kZXggYzMyZDA3My4uZWRlOGM1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjUuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTkyNS5TCkBAIC00OTQsNyArNDk0LDcgQEAKIAogCS5hbGlnbgogCi0JLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgorCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MKIAogLm1hY3JvIGFybTkyNV9wcm9jX2luZm8gbmFtZTpyZXEsIGNwdV92YWw6cmVxLCBjcHVfbWFzazpyZXEsIGNwdV9uYW1lOnJlcSwgY2FjaGUKIAkudHlwZQlfX1xuYW1lXCgpX3Byb2NfaW5mbywjb2JqZWN0CkBAIC01MTAsNyArNTEwLDcgQEAKIAkJUE1EX0JJVDQgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQlQTURfU0VDVF9BUF9SRUFECi0JYglfX2FybTkyNV9zZXR1cAorCWluaXRmbglfX2FybTkyNV9zZXR1cCwgX19cbmFtZVwoKV9wcm9jX2luZm8KIAkubG9uZwljcHVfYXJjaF9uYW1lCiAJLmxvbmcJY3B1X2VsZl9uYW1lCiAJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRiB8IEhXQ0FQX1RIVU1CCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05MjYuUwppbmRleCAyNTJiMjUwLi5mYjgyN2M2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTkyNi5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTI2LlMKQEAgLTQ3NCw3ICs0NzQsNyBAQAogCiAJLmFsaWduCiAKLQkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCisJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYwogCiAJLnR5cGUJX19hcm05MjZfcHJvY19pbmZvLCNvYmplY3QKIF9fYXJtOTI2X3Byb2NfaW5mbzoKQEAgLTQ5MCw3ICs0OTAsNyBAQAogCQlQTURfQklUNCB8IFwKIAkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCiAJCVBNRF9TRUNUX0FQX1JFQUQKLQliCV9fYXJtOTI2X3NldHVwCisJaW5pdGZuCV9fYXJtOTI2X3NldHVwLCBfX2FybTkyNl9wcm9jX2luZm8KIAkubG9uZwljcHVfYXJjaF9uYW1lCiAJLmxvbmcJY3B1X2VsZl9uYW1lCiAJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1B8SFdDQVBfSkFWQQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDAuUyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQwLlMKaW5kZXggZTUyMTJkNC4uZWU1YjY2ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDAuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTk0MC5TCkBAIC0yOTcsMjYgKzI5NywxNiBAQAogCW1jcglwMTUsIDAsIHIwLCBjNiwJYzAsIDEKIAogCWxkcglyMCwgPShDT05GSUdfRFJBTV9CQVNFICYgMHhGRkZGRjAwMCkgQCBiYXNlWzMxOjEyXSBvZiBSQU0KLQlsZHIJcjEsID0oQ09ORklHX0RSQU1fU0laRSA+PiAxMikJQCBzaXplIG9mIFJBTSAobXVzdCBiZSA+PSA0S0IpCi0JbW92CXIyLCAjMTAJCQkJQCAxMSBpcyB0aGUgbWluaW11bSAoNEtCKQotMToJYWRkCXIyLCByMiwgIzEJCQlAIGFyZWEgc2l6ZSAqPSAyCi0JbW92CXIxLCByMSwgbHNyICMxCi0JYm5lCTFiCQkJCUAgY291bnQgbm90IHplcm8gci1zaGlmdAotCW9ycglyMCwgcjAsIHIyLCBsc2wgIzEJCUAgdGhlIGFyZWEgcmVnaXN0ZXIgdmFsdWUKLQlvcnIJcjAsIHIwLCAjMQkJCUAgc2V0IGVuYWJsZSBiaXQKLQltY3IJcDE1LCAwLCByMCwgYzYsCWMxLCAwCQlAIHNldCBhcmVhIDEsIFJBTQotCW1jcglwMTUsIDAsIHIwLCBjNiwJYzEsIDEKKwlsZHIJcjcsID1DT05GSUdfRFJBTV9TSVpFID4+IDEyCUAgc2l6ZSBvZiBSQU0gKG11c3QgYmUgPj0gNEtCKQorCXByX3ZhbAlyMywgcjAsIHI3LCAjMQorCW1jcglwMTUsIDAsIHIzLCBjNiwJYzEsIDAJCUAgc2V0IGFyZWEgMSwgUkFNCisJbWNyCXAxNSwgMCwgcjMsIGM2LAljMSwgMQogCiAJbGRyCXIwLCA9KENPTkZJR19GTEFTSF9NRU1fQkFTRSAmIDB4RkZGRkYwMDApIEAgYmFzZVszMToxMl0gb2YgRkxBU0gKLQlsZHIJcjEsID0oQ09ORklHX0ZMQVNIX1NJWkUgPj4gMTIpCUAgc2l6ZSBvZiBGTEFTSCAobXVzdCBiZSA+PSA0S0IpCi0JbW92CXIyLCAjMTAJCQkJQCAxMSBpcyB0aGUgbWluaW11bSAoNEtCKQotMToJYWRkCXIyLCByMiwgIzEJCQlAIGFyZWEgc2l6ZSAqPSAyCi0JbW92CXIxLCByMSwgbHNyICMxCi0JYm5lCTFiCQkJCUAgY291bnQgbm90IHplcm8gci1zaGlmdAotCW9ycglyMCwgcjAsIHIyLCBsc2wgIzEJCUAgdGhlIGFyZWEgcmVnaXN0ZXIgdmFsdWUKLQlvcnIJcjAsIHIwLCAjMQkJCUAgc2V0IGVuYWJsZSBiaXQKLQltY3IJcDE1LCAwLCByMCwgYzYsCWMyLCAwCQlAIHNldCBhcmVhIDIsIFJPTS9GTEFTSAotCW1jcglwMTUsIDAsIHIwLCBjNiwJYzIsIDEKKwlsZHIJcjcsID1DT05GSUdfRkxBU0hfU0laRQkJQCBzaXplIG9mIEZMQVNIIChtdXN0IGJlID49IDRLQikKKwlwcl92YWwJcjMsIHIwLCByNiwgIzEKKwltY3IJcDE1LCAwLCByMywgYzYsCWMyLCAwCQlAIHNldCBhcmVhIDIsIFJPTS9GTEFTSAorCW1jcglwMTUsIDAsIHIzLCBjNiwJYzIsIDEKIAogCW1vdglyMCwgIzB4MDYKIAltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIFJlZ2lvbiAxJjIgY2FjaGVhYmxlCkBAIC0zNTQsMTQgKzM0NCwxNCBAQAogCiAJLmFsaWduCiAKLQkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCisJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYwogCiAJLnR5cGUJX19hcm05NDBfcHJvY19pbmZvLCNvYmplY3QKIF9fYXJtOTQwX3Byb2NfaW5mbzoKIAkubG9uZwkweDQxMDA5NDAwCiAJLmxvbmcJMHhmZjAwZmZmMAogCS5sb25nCTAKLQliCV9fYXJtOTQwX3NldHVwCisJaW5pdGZuCV9fYXJtOTQwX3NldHVwLCBfX2FybTk0MF9wcm9jX2luZm8KIAkubG9uZwljcHVfYXJjaF9uYW1lCiAJLmxvbmcJY3B1X2VsZl9uYW1lCiAJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRiB8IEhXQ0FQX1RIVU1CCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWFybTk0Ni5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05NDYuUwppbmRleCBiM2RkOWIyLi43MzYxODM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLWFybTk0Ni5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtYXJtOTQ2LlMKQEAgLTM0MywyNCArMzQzLDE0IEBACiAJbWNyCXAxNSwgMCwgcjAsIGM2LAljMCwgMAkJQCBzZXQgcmVnaW9uIDAsIGRlZmF1bHQKIAogCWxkcglyMCwgPShDT05GSUdfRFJBTV9CQVNFICYgMHhGRkZGRjAwMCkgQCBiYXNlWzMxOjEyXSBvZiBSQU0KLQlsZHIJcjEsID0oQ09ORklHX0RSQU1fU0laRSA+PiAxMikJQCBzaXplIG9mIFJBTSAobXVzdCBiZSA+PSA0S0IpCi0JbW92CXIyLCAjMTAJCQkJQCAxMSBpcyB0aGUgbWluaW11bSAoNEtCKQotMToJYWRkCXIyLCByMiwgIzEJCQlAIGFyZWEgc2l6ZSAqPSAyCi0JbW92CXIxLCByMSwgbHNyICMxCi0JYm5lCTFiCQkJCUAgY291bnQgbm90IHplcm8gci1zaGlmdAotCW9ycglyMCwgcjAsIHIyLCBsc2wgIzEJCUAgdGhlIHJlZ2lvbiByZWdpc3RlciB2YWx1ZQotCW9ycglyMCwgcjAsICMxCQkJQCBzZXQgZW5hYmxlIGJpdAotCW1jcglwMTUsIDAsIHIwLCBjNiwJYzEsIDAJCUAgc2V0IHJlZ2lvbiAxLCBSQU0KKwlsZHIJcjcsID1DT05GSUdfRFJBTV9TSVpFCQlAIHNpemUgb2YgUkFNIChtdXN0IGJlID49IDRLQikKKwlwcl92YWwJcjMsIHIwLCByNywgIzEKKwltY3IJcDE1LCAwLCByMywgYzYsIGMxLCAwCiAKIAlsZHIJcjAsID0oQ09ORklHX0ZMQVNIX01FTV9CQVNFICYgMHhGRkZGRjAwMCkgQCBiYXNlWzMxOjEyXSBvZiBGTEFTSAotCWxkcglyMSwgPShDT05GSUdfRkxBU0hfU0laRSA+PiAxMikJQCBzaXplIG9mIEZMQVNIIChtdXN0IGJlID49IDRLQikKLQltb3YJcjIsICMxMAkJCQlAIDExIGlzIHRoZSBtaW5pbXVtICg0S0IpCi0xOglhZGQJcjIsIHIyLCAjMQkJCUAgYXJlYSBzaXplICo9IDIKLQltb3YJcjEsIHIxLCBsc3IgIzEKLQlibmUJMWIJCQkJQCBjb3VudCBub3QgemVybyByLXNoaWZ0Ci0Jb3JyCXIwLCByMCwgcjIsIGxzbCAjMQkJQCB0aGUgcmVnaW9uIHJlZ2lzdGVyIHZhbHVlCi0Jb3JyCXIwLCByMCwgIzEJCQlAIHNldCBlbmFibGUgYml0Ci0JbWNyCXAxNSwgMCwgcjAsIGM2LAljMiwgMAkJQCBzZXQgcmVnaW9uIDIsIFJPTS9GTEFTSAorCWxkcglyNywgPUNPTkZJR19GTEFTSF9TSVpFCQlAIHNpemUgb2YgRkxBU0ggKG11c3QgYmUgPj0gNEtCKQorCXByX3ZhbAlyMywgcjAsIHI3LCAjMQorCW1jcglwMTUsIDAsIHIzLCBjNiwgYzIsIDAKIAogCW1vdglyMCwgIzB4MDYKIAltY3IJcDE1LCAwLCByMCwgYzIsIGMwLCAwCQlAIHJlZ2lvbiAxLDIgZC1jYWNoZWFibGUKQEAgLTQwOSwxNCArMzk5LDE0IEBACiAKIAkuYWxpZ24KIAotCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKKwkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jCiAJLnR5cGUJX19hcm05NDZfcHJvY19pbmZvLCNvYmplY3QKIF9fYXJtOTQ2X3Byb2NfaW5mbzoKIAkubG9uZwkweDQxMDA5NDYwCiAJLmxvbmcJMHhmZjAwZmZmMAogCS5sb25nCTAKIAkubG9uZwkwCi0JYglfX2FybTk0Nl9zZXR1cAorCWluaXRmbglfX2FybTk0Nl9zZXR1cCwgX19hcm05NDZfcHJvY19pbmZvCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQogCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1hcm05dGRtaS5TIGIvYXJjaC9hcm0vbW0vcHJvYy1hcm05dGRtaS5TCmluZGV4IDgyMjczMjIuLjdmYWM4YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtYXJtOXRkbWkuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWFybTl0ZG1pLlMKQEAgLTcwLDcgKzcwLDcgQEAKIAogCQkuYWxpZ24KIAotCQkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCisJCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MKIAogLm1hY3JvIGFybTl0ZG1pX3Byb2NfaW5mbyBuYW1lOnJlcSwgY3B1X3ZhbDpyZXEsIGNwdV9tYXNrOnJlcSwgY3B1X25hbWU6cmVxCiAJCS50eXBlCV9fXG5hbWVcKClfcHJvY19pbmZvLCAjb2JqZWN0CkBAIC03OSw3ICs3OSw3IEBACiAJCS5sb25nCVxjcHVfbWFzawogCQkubG9uZwkwCiAJCS5sb25nCTAKLQkJYglfX2FybTl0ZG1pX3NldHVwCisJCWluaXRmbglfX2FybTl0ZG1pX3NldHVwLCBfX1xuYW1lXCgpX3Byb2NfaW5mbwogCQkubG9uZwljcHVfYXJjaF9uYW1lCiAJCS5sb25nCWNwdV9lbGZfbmFtZQogCQkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9USFVNQiB8IEhXQ0FQXzI2QklUCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLWZhNTI2LlMgYi9hcmNoL2FybS9tbS9wcm9jLWZhNTI2LlMKaW5kZXggYzQ5NDg4Ni4uNDAwMWI3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy1mYTUyNi5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtZmE1MjYuUwpAQCAtMTkwLDcgKzE5MCw3IEBACiAKIAkuYWxpZ24KIAotCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKKwkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jCiAKIAkudHlwZQlfX2ZhNTI2X3Byb2NfaW5mbywjb2JqZWN0CiBfX2ZhNTI2X3Byb2NfaW5mbzoKQEAgLTIwNiw3ICsyMDYsNyBAQAogCQlQTURfQklUNCB8IFwKIAkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCiAJCVBNRF9TRUNUX0FQX1JFQUQKLQliCV9fZmE1MjZfc2V0dXAKKwlpbml0Zm4JX19mYTUyNl9zZXR1cCwgX19mYTUyNl9wcm9jX2luZm8KIAkubG9uZwljcHVfYXJjaF9uYW1lCiAJLmxvbmcJY3B1X2VsZl9uYW1lCiAJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy1mZXJvY2Vvbi5TIGIvYXJjaC9hcm0vbW0vcHJvYy1mZXJvY2Vvbi5TCmluZGV4IDAzYTFiNzUuLmU0OTRkNmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MtZmVyb2Nlb24uUworKysgYi9hcmNoL2FybS9tbS9wcm9jLWZlcm9jZW9uLlMKQEAgLTU4NCw3ICs1ODQsNyBAQAogCiAJLmFsaWduCiAKLQkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCisJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYwogCiAubWFjcm8gZmVyb2Nlb25fcHJvY19pbmZvIG5hbWU6cmVxLCBjcHVfdmFsOnJlcSwgY3B1X21hc2s6cmVxLCBjcHVfbmFtZTpyZXEsIGNhY2hlOnJlcQogCS50eXBlCV9fXG5hbWVcKClfcHJvY19pbmZvLCNvYmplY3QKQEAgLTYwMSw3ICs2MDEsOCBAQAogCQlQTURfQklUNCB8IFwKIAkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCiAJCVBNRF9TRUNUX0FQX1JFQUQKLQliCV9fZmVyb2Nlb25fc2V0dXAKKwlpbml0Zm4JX19mZXJvY2Vvbl9zZXR1cCwgX19cbmFtZVwoKV9wcm9jX2luZm8KKwkubG9uZyBfX2Zlcm9jZW9uX3NldHVwCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQogCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLW1hY3Jvcy5TIGIvYXJjaC9hcm0vbW0vcHJvYy1tYWNyb3MuUwppbmRleCAwODJiOWYyLi5jNjcxZjM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLW1hY3Jvcy5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtbWFjcm9zLlMKQEAgLTMzMSwzICszMzEsMzEgQEAKIAkuZ2xvYmwJXHgKIAkuZXF1CVx4LCBceQogLmVuZG0KKworLm1hY3JvCWluaXRmbiwgZnVuYywgYmFzZQorCS5sb25nCVxmdW5jIC0gXGJhc2UKKy5lbmRtCisKKwkvKgorCSAqIE1hY3JvIHRvIGNhbGN1bGF0ZSB0aGUgbG9nMiBzaXplIGZvciB0aGUgcHJvdGVjdGlvbiByZWdpb24KKwkgKiByZWdpc3RlcnMuIFRoaXMgY2FsY3VsYXRlcyByZCA9IGxvZzIoc2l6ZSkgLSAxLiAgdG1wIG11c3QKKwkgKiBub3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIgYXMgcmQuCisJICovCisubWFjcm8JcHJfc3osIHJkLCBzaXplLCB0bXAKKwltb3YJXHRtcCwgXHNpemUsIGxzciAjMTIKKwltb3YJXHJkLCAjMTEKKzE6CW1vdnMJXHRtcCwgXHRtcCwgbHNyICMxCisJYWRkbmUJXHJkLCBccmQsICMxCisJYm5lCTFiCisuZW5kbQorCisJLyoKKwkgKiBNYWNybyB0byBnZW5lcmF0ZSBhIHByb3RlY3Rpb24gcmVnaW9uIHJlZ2lzdGVyIHZhbHVlCisJICogZ2l2ZW4gYSBwcmUtbWFza2VkIGFkZHJlc3MsIHNpemUsIGFuZCBlbmFibGUgYml0LgorCSAqIENvcnJ1cHRzIHNpemUuCisJICovCisubWFjcm8JcHJfdmFsLCBkZXN0LCBhZGRyLCBzaXplLCBlbmFibGUKKwlwcl9zeglcZGVzdCwgXHNpemUsIFxzaXplCQlAIGNhbGN1bGF0ZSBsb2cyKHNpemUpIC0gMQorCW9ycglcZGVzdCwgXGFkZHIsIFxkZXN0LCBsc2wgIzEJQCBtYXNrIGluIHRoZSByZWdpb24gc2l6ZQorCW9ycglcZGVzdCwgXGRlc3QsIFxlbmFibGUKKy5lbmRtCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLW1vaGF3ay5TIGIvYXJjaC9hcm0vbW0vcHJvYy1tb2hhd2suUwppbmRleCA1M2QzOTM0Li5kNjVlZGY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLW1vaGF3ay5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtbW9oYXdrLlMKQEAgLTQyNyw3ICs0MjcsNyBAQAogCiAJLmFsaWduCiAKLQkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCisJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYwogCiAJLnR5cGUJX184OHN2MzMxeF9wcm9jX2luZm8sI29iamVjdAogX184OHN2MzMxeF9wcm9jX2luZm86CkBAIC00NDMsNyArNDQzLDcgQEAKIAkJUE1EX0JJVDQgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQlQTURfU0VDVF9BUF9SRUFECi0JYglfX21vaGF3a19zZXR1cAorCWluaXRmbglfX21vaGF3a19zZXR1cCwgX184OHN2MzMxeF9wcm9jX2luZm8KIAkubG9uZwljcHVfYXJjaF9uYW1lCiAJLmxvbmcJY3B1X2VsZl9uYW1lCiAJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAuUyBiL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAuUwppbmRleCA4MDA4YTA0Li5lZTJjZTQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXNhMTEwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMC5TCkBAIC0xOTksNyArMTk5LDcgQEAKIAogCS5hbGlnbgogCi0JLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgorCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MKIAogCS50eXBlCV9fc2ExMTBfcHJvY19pbmZvLCNvYmplY3QKIF9fc2ExMTBfcHJvY19pbmZvOgpAQCAtMjEzLDcgKzIxMyw3IEBACiAJLmxvbmcgICBQTURfVFlQRV9TRUNUIHwgXAogCQlQTURfU0VDVF9BUF9XUklURSB8IFwKIAkJUE1EX1NFQ1RfQVBfUkVBRAotCWIJX19zYTExMF9zZXR1cAorCWluaXRmbglfX3NhMTEwX3NldHVwLCBfX3NhMTEwX3Byb2NfaW5mbwogCS5sb25nCWNwdV9hcmNoX25hbWUKIAkubG9uZwljcHVfZWxmX25hbWUKIAkubG9uZwlIV0NBUF9TV1AgfCBIV0NBUF9IQUxGIHwgSFdDQVBfMjZCSVQgfCBIV0NBUF9GQVNUX01VTFQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMgYi9hcmNoL2FybS9tbS9wcm9jLXNhMTEwMC5TCmluZGV4IDg5Zjk3YWMuLjIyMmQ1ODMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2Mtc2ExMTAwLlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy1zYTExMDAuUwpAQCAtMjQyLDcgKzI0Miw3IEBACiAKIAkuYWxpZ24KIAotCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKKwkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jCiAKIC5tYWNybyBzYTExMDBfcHJvY19pbmZvIG5hbWU6cmVxLCBjcHVfdmFsOnJlcSwgY3B1X21hc2s6cmVxLCBjcHVfbmFtZTpyZXEKIAkudHlwZQlfX1xuYW1lXCgpX3Byb2NfaW5mbywjb2JqZWN0CkBAIC0yNTcsNyArMjU3LDcgQEAKIAkubG9uZyAgIFBNRF9UWVBFX1NFQ1QgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQlQTURfU0VDVF9BUF9SRUFECi0JYglfX3NhMTEwMF9zZXR1cAorCWluaXRmbglfX3NhMTEwMF9zZXR1cCwgX19cbmFtZVwoKV9wcm9jX2luZm8KIAkubG9uZwljcHVfYXJjaF9uYW1lCiAJLmxvbmcJY3B1X2VsZl9uYW1lCiAJLmxvbmcJSFdDQVBfU1dQIHwgSFdDQVBfSEFMRiB8IEhXQ0FQXzI2QklUIHwgSFdDQVBfRkFTVF9NVUxUCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXY2LlMgYi9hcmNoL2FybS9tbS9wcm9jLXY2LlMKaW5kZXggZDAzOTBmNC4uMDZkODkwYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy12Ni5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtdjYuUwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJc3RyaW5nCWNwdV9lbGZfbmFtZSwgInY2IgogCS5hbGlnbgogCi0JLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgorCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MKIAogCS8qCiAJICogTWF0Y2ggYW55IEFSTXY2IHByb2Nlc3NvciBjb3JlLgpAQCAtMjg3LDcgKzI4Nyw3IEBACiAJCVBNRF9TRUNUX1hOIHwgXAogCQlQTURfU0VDVF9BUF9XUklURSB8IFwKIAkJUE1EX1NFQ1RfQVBfUkVBRAotCWIJX192Nl9zZXR1cAorCWluaXRmbglfX3Y2X3NldHVwLCBfX3Y2X3Byb2NfaW5mbwogCS5sb25nCWNwdV9hcmNoX25hbWUKIAkubG9uZwljcHVfZWxmX25hbWUKIAkvKiBTZWUgYWxzbyBmZWF0X3Y2X2ZpeHVwKCkgZm9yIEhXQ0FQX1RMUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vcHJvYy12Ny0ybGV2ZWwuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjctMmxldmVsLlMKaW5kZXggZWQ0NDhkOC4uMTA0MDViOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbW0vcHJvYy12Ny0ybGV2ZWwuUworKysgYi9hcmNoL2FybS9tbS9wcm9jLXY3LTJsZXZlbC5TCkBAIC0zNywxNSArMzcsMTggQEAKICAqCUl0IGlzIGFzc3VtZWQgdGhhdDoKICAqCS0gd2UgYXJlIG5vdCB1c2luZyBzcGxpdCBwYWdlIHRhYmxlcwogICovCi1FTlRSWShjcHVfdjdfc3dpdGNoX21tKQorRU5UUlkoY3B1X2NhOF9zd2l0Y2hfbW0pCiAjaWZkZWYgQ09ORklHX01NVQogCW1vdglyMiwgIzAKLQltbWlkCXIxLCByMQkJCQlAIGdldCBtbS0+Y29udGV4dC5pZAotCUFMVF9TTVAob3JyCXIwLCByMCwgI1RUQl9GTEFHU19TTVApCi0JQUxUX1VQKG9ycglyMCwgcjAsICNUVEJfRkxBR1NfVVApCiAjaWZkZWYgQ09ORklHX0FSTV9FUlJBVEFfNDMwOTczCiAJbWNyCXAxNSwgMCwgcjIsIGM3LCBjNSwgNgkJQCBmbHVzaCBCVEFDL0JUQgogI2VuZGlmCisjZW5kaWYKK0VOVFJZKGNwdV92N19zd2l0Y2hfbW0pCisjaWZkZWYgQ09ORklHX01NVQorCW1taWQJcjEsIHIxCQkJCUAgZ2V0IG1tLT5jb250ZXh0LmlkCisJQUxUX1NNUChvcnIJcjAsIHIwLCAjVFRCX0ZMQUdTX1NNUCkKKwlBTFRfVVAob3JyCXIwLCByMCwgI1RUQl9GTEFHU19VUCkKICNpZmRlZiBDT05GSUdfUElEX0lOX0NPTlRFWFRJRFIKIAltcmMJcDE1LCAwLCByMiwgYzEzLCBjMCwgMQkJQCByZWFkIGN1cnJlbnQgY29udGV4dCBJRAogCWxzcglyMiwgcjIsICM4CQkJQCBleHRyYWN0IHRoZSBQSUQKQEAgLTYxLDYgKzY0LDcgQEAKICNlbmRpZgogCWJ4CWxyCiBFTkRQUk9DKGNwdV92N19zd2l0Y2hfbW0pCitFTkRQUk9DKGNwdV9jYThfc3dpdGNoX21tKQogCiAvKgogICoJY3B1X3Y3X3NldF9wdGVfZXh0KHB0ZXAsIHB0ZSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwppbmRleCA4YjRlZTVlLi4zZDEwNTRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCkBAIC0xNTMsNiArMTUzLDIxIEBACiAjZW5kaWYKIAogLyoKKyAqIENvcnRleC1BOAorICovCisJZ2xvYmxfZXF1CWNwdV9jYThfcHJvY19pbml0LAljcHVfdjdfcHJvY19pbml0CisJZ2xvYmxfZXF1CWNwdV9jYThfcHJvY19maW4sCWNwdV92N19wcm9jX2ZpbgorCWdsb2JsX2VxdQljcHVfY2E4X3Jlc2V0LAkJY3B1X3Y3X3Jlc2V0CisJZ2xvYmxfZXF1CWNwdV9jYThfZG9faWRsZSwJY3B1X3Y3X2RvX2lkbGUKKwlnbG9ibF9lcXUJY3B1X2NhOF9kY2FjaGVfY2xlYW5fYXJlYSwgY3B1X3Y3X2RjYWNoZV9jbGVhbl9hcmVhCisJZ2xvYmxfZXF1CWNwdV9jYThfc2V0X3B0ZV9leHQsCWNwdV92N19zZXRfcHRlX2V4dAorCWdsb2JsX2VxdQljcHVfY2E4X3N1c3BlbmRfc2l6ZSwJY3B1X3Y3X3N1c3BlbmRfc2l6ZQorI2lmZGVmIENPTkZJR19BUk1fQ1BVX1NVU1BFTkQKKwlnbG9ibF9lcXUJY3B1X2NhOF9kb19zdXNwZW5kLAljcHVfdjdfZG9fc3VzcGVuZAorCWdsb2JsX2VxdQljcHVfY2E4X2RvX3Jlc3VtZSwJY3B1X3Y3X2RvX3Jlc3VtZQorI2VuZGlmCisKKy8qCiAgKiBDb3J0ZXgtQTkgcHJvY2Vzc29yIGZ1bmN0aW9ucwogICovCiAJZ2xvYmxfZXF1CWNwdV9jYTltcF9wcm9jX2luaXQsCWNwdV92N19wcm9jX2luaXQKQEAgLTQ1MSw3ICs0NjYsMTAgQEAKIAogCUAgZGVmaW5lIHN0cnVjdCBwcm9jZXNzb3IgKHNlZSA8YXNtL3Byb2MtZm5zLmg+IGFuZCBwcm9jLW1hY3Jvcy5TKQogCWRlZmluZV9wcm9jZXNzb3JfZnVuY3Rpb25zIHY3LCBkYWJvcnQ9djdfZWFybHlfYWJvcnQsIHBhYm9ydD12N19wYWJvcnQsIHN1c3BlbmQ9MQorI2lmbmRlZiBDT05GSUdfQVJNX0xQQUUKKwlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBjYTgsIGRhYm9ydD12N19lYXJseV9hYm9ydCwgcGFib3J0PXY3X3BhYm9ydCwgc3VzcGVuZD0xCiAJZGVmaW5lX3Byb2Nlc3Nvcl9mdW5jdGlvbnMgY2E5bXAsIGRhYm9ydD12N19lYXJseV9hYm9ydCwgcGFib3J0PXY3X3BhYm9ydCwgc3VzcGVuZD0xCisjZW5kaWYKICNpZmRlZiBDT05GSUdfQ1BVX1BKNEIKIAlkZWZpbmVfcHJvY2Vzc29yX2Z1bmN0aW9ucyBwajRiLCBkYWJvcnQ9djdfZWFybHlfYWJvcnQsIHBhYm9ydD12N19wYWJvcnQsIHN1c3BlbmQ9MQogI2VuZGlmCkBAIC00NjIsMTkgKzQ4MCwxOSBAQAogCXN0cmluZwljcHVfZWxmX25hbWUsICJ2NyIKIAkuYWxpZ24KIAotCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MsICNleGVjaW5zdHIKKwkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jCiAKIAkvKgogCSAqIFN0YW5kYXJkIHY3IHByb2MgaW5mbyBjb250ZW50CiAJICovCi0ubWFjcm8gX192N19wcm9jIGluaXRmdW5jLCBtbV9tbXVmbGFncyA9IDAsIGlvX21tdWZsYWdzID0gMCwgaHdjYXBzID0gMCwgcHJvY19mbnMgPSB2N19wcm9jZXNzb3JfZnVuY3Rpb25zCisubWFjcm8gX192N19wcm9jIG5hbWUsIGluaXRmdW5jLCBtbV9tbXVmbGFncyA9IDAsIGlvX21tdWZsYWdzID0gMCwgaHdjYXBzID0gMCwgcHJvY19mbnMgPSB2N19wcm9jZXNzb3JfZnVuY3Rpb25zCiAJQUxUX1NNUCgubG9uZwlQTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfQVBfV1JJVEUgfCBQTURfU0VDVF9BUF9SRUFEIHwgXAogCQkJUE1EX1NFQ1RfQUYgfCBQTURfRkxBR1NfU01QIHwgXG1tX21tdWZsYWdzKQogCUFMVF9VUCgubG9uZwlQTURfVFlQRV9TRUNUIHwgUE1EX1NFQ1RfQVBfV1JJVEUgfCBQTURfU0VDVF9BUF9SRUFEIHwgXAogCQkJUE1EX1NFQ1RfQUYgfCBQTURfRkxBR1NfVVAgfCBcbW1fbW11ZmxhZ3MpCiAJLmxvbmcJUE1EX1RZUEVfU0VDVCB8IFBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQlQTURfU0VDVF9BUF9SRUFEIHwgUE1EX1NFQ1RfQUYgfCBcaW9fbW11ZmxhZ3MKLQlXKGIpCVxpbml0ZnVuYworCWluaXRmbglcaW5pdGZ1bmMsIFxuYW1lCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQogCS5sb25nCUhXQ0FQX1NXUCB8IEhXQ0FQX0hBTEYgfCBIV0NBUF9USFVNQiB8IEhXQ0FQX0ZBU1RfTVVMVCB8IFwKQEAgLTQ5NCw3ICs1MTIsNyBAQAogX192N19jYTVtcF9wcm9jX2luZm86CiAJLmxvbmcJMHg0MTBmYzA1MAogCS5sb25nCTB4ZmYwZmZmZjAKLQlfX3Y3X3Byb2MgX192N19jYTVtcF9zZXR1cAorCV9fdjdfcHJvYyBfX3Y3X2NhNW1wX3Byb2NfaW5mbywgX192N19jYTVtcF9zZXR1cAogCS5zaXplCV9fdjdfY2E1bXBfcHJvY19pbmZvLCAuIC0gX192N19jYTVtcF9wcm9jX2luZm8KIAogCS8qCkBAIC01MDQsOSArNTIyLDE5IEBACiBfX3Y3X2NhOW1wX3Byb2NfaW5mbzoKIAkubG9uZwkweDQxMGZjMDkwCiAJLmxvbmcJMHhmZjBmZmZmMAotCV9fdjdfcHJvYyBfX3Y3X2NhOW1wX3NldHVwLCBwcm9jX2ZucyA9IGNhOW1wX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwlfX3Y3X3Byb2MgX192N19jYTltcF9wcm9jX2luZm8sIF9fdjdfY2E5bXBfc2V0dXAsIHByb2NfZm5zID0gY2E5bXBfcHJvY2Vzc29yX2Z1bmN0aW9ucwogCS5zaXplCV9fdjdfY2E5bXBfcHJvY19pbmZvLCAuIC0gX192N19jYTltcF9wcm9jX2luZm8KIAorCS8qCisJICogQVJNIEx0ZC4gQ29ydGV4IEE4IHByb2Nlc3Nvci4KKwkgKi8KKwkudHlwZQlfX3Y3X2NhOF9wcm9jX2luZm8sICNvYmplY3QKK19fdjdfY2E4X3Byb2NfaW5mbzoKKwkubG9uZwkweDQxMGZjMDgwCisJLmxvbmcJMHhmZjBmZmZmMAorCV9fdjdfcHJvYyBfX3Y3X2NhOF9wcm9jX2luZm8sIF9fdjdfc2V0dXAsIHByb2NfZm5zID0gY2E4X3Byb2Nlc3Nvcl9mdW5jdGlvbnMKKwkuc2l6ZQlfX3Y3X2NhOF9wcm9jX2luZm8sIC4gLSBfX3Y3X2NhOF9wcm9jX2luZm8KKwogI2VuZGlmCS8qIENPTkZJR19BUk1fTFBBRSAqLwogCiAJLyoKQEAgLTUxNyw3ICs1NDUsNyBAQAogX192N19wajRiX3Byb2NfaW5mbzoKIAkubG9uZwkweDU2MGY1ODAwCiAJLmxvbmcJMHhmZjBmZmYwMAotCV9fdjdfcHJvYyBfX3Y3X3BqNGJfc2V0dXAsIHByb2NfZm5zID0gcGo0Yl9wcm9jZXNzb3JfZnVuY3Rpb25zCisJX192N19wcm9jIF9fdjdfcGo0Yl9wcm9jX2luZm8sIF9fdjdfcGo0Yl9zZXR1cCwgcHJvY19mbnMgPSBwajRiX3Byb2Nlc3Nvcl9mdW5jdGlvbnMKIAkuc2l6ZQlfX3Y3X3BqNGJfcHJvY19pbmZvLCAuIC0gX192N19wajRiX3Byb2NfaW5mbwogI2VuZGlmCiAKQEAgLTUyOCw3ICs1NTYsNyBAQAogX192N19jcjdtcF9wcm9jX2luZm86CiAJLmxvbmcJMHg0MTBmYzE3MAogCS5sb25nCTB4ZmYwZmZmZjAKLQlfX3Y3X3Byb2MgX192N19jcjdtcF9zZXR1cAorCV9fdjdfcHJvYyBfX3Y3X2NyN21wX3Byb2NfaW5mbywgX192N19jcjdtcF9zZXR1cAogCS5zaXplCV9fdjdfY3I3bXBfcHJvY19pbmZvLCAuIC0gX192N19jcjdtcF9wcm9jX2luZm8KIAogCS8qCkBAIC01MzgsNyArNTY2LDcgQEAKIF9fdjdfY2E3bXBfcHJvY19pbmZvOgogCS5sb25nCTB4NDEwZmMwNzAKIAkubG9uZwkweGZmMGZmZmYwCi0JX192N19wcm9jIF9fdjdfY2E3bXBfc2V0dXAKKwlfX3Y3X3Byb2MgX192N19jYTdtcF9wcm9jX2luZm8sIF9fdjdfY2E3bXBfc2V0dXAKIAkuc2l6ZQlfX3Y3X2NhN21wX3Byb2NfaW5mbywgLiAtIF9fdjdfY2E3bXBfcHJvY19pbmZvCiAKIAkvKgpAQCAtNTQ4LDcgKzU3Niw3IEBACiBfX3Y3X2NhMTJtcF9wcm9jX2luZm86CiAJLmxvbmcJMHg0MTBmYzBkMAogCS5sb25nCTB4ZmYwZmZmZjAKLQlfX3Y3X3Byb2MgX192N19jYTEybXBfc2V0dXAKKwlfX3Y3X3Byb2MgX192N19jYTEybXBfcHJvY19pbmZvLCBfX3Y3X2NhMTJtcF9zZXR1cAogCS5zaXplCV9fdjdfY2ExMm1wX3Byb2NfaW5mbywgLiAtIF9fdjdfY2ExMm1wX3Byb2NfaW5mbwogCiAJLyoKQEAgLTU1OCw3ICs1ODYsNyBAQAogX192N19jYTE1bXBfcHJvY19pbmZvOgogCS5sb25nCTB4NDEwZmMwZjAKIAkubG9uZwkweGZmMGZmZmYwCi0JX192N19wcm9jIF9fdjdfY2ExNW1wX3NldHVwCisJX192N19wcm9jIF9fdjdfY2ExNW1wX3Byb2NfaW5mbywgX192N19jYTE1bXBfc2V0dXAKIAkuc2l6ZQlfX3Y3X2NhMTVtcF9wcm9jX2luZm8sIC4gLSBfX3Y3X2NhMTVtcF9wcm9jX2luZm8KIAogCS8qCkBAIC01NjgsNyArNTk2LDcgQEAKIF9fdjdfYjE1bXBfcHJvY19pbmZvOgogCS5sb25nCTB4NDIwZjAwZjAKIAkubG9uZwkweGZmMGZmZmYwCi0JX192N19wcm9jIF9fdjdfYjE1bXBfc2V0dXAKKwlfX3Y3X3Byb2MgX192N19iMTVtcF9wcm9jX2luZm8sIF9fdjdfYjE1bXBfc2V0dXAKIAkuc2l6ZQlfX3Y3X2IxNW1wX3Byb2NfaW5mbywgLiAtIF9fdjdfYjE1bXBfcHJvY19pbmZvCiAKIAkvKgpAQCAtNTc4LDcgKzYwNiw3IEBACiBfX3Y3X2NhMTdtcF9wcm9jX2luZm86CiAJLmxvbmcJMHg0MTBmYzBlMAogCS5sb25nCTB4ZmYwZmZmZjAKLQlfX3Y3X3Byb2MgX192N19jYTE3bXBfc2V0dXAKKwlfX3Y3X3Byb2MgX192N19jYTE3bXBfcHJvY19pbmZvLCBfX3Y3X2NhMTdtcF9zZXR1cAogCS5zaXplCV9fdjdfY2ExN21wX3Byb2NfaW5mbywgLiAtIF9fdjdfY2ExN21wX3Byb2NfaW5mbwogCiAJLyoKQEAgLTU5NCw3ICs2MjIsNyBAQAogCSAqIGRvIHN1cHBvcnQgdGhlbS4gVGhleSBhbHNvIGRvbid0IGluZGljYXRlIHN1cHBvcnQgZm9yIGZ1c2VkIG11bHRpcGx5CiAJICogaW5zdHJ1Y3Rpb25zIGV2ZW4gdGhvdWdoIHRoZXkgYWN0dWFsbHkgZG8gc3VwcG9ydCB0aGVtLgogCSAqLwotCV9fdjdfcHJvYyBfX3Y3X3NldHVwLCBod2NhcHMgPSBIV0NBUF9JRElWIHwgSFdDQVBfVkZQdjQKKwlfX3Y3X3Byb2MgX19rcmFpdF9wcm9jX2luZm8sIF9fdjdfc2V0dXAsIGh3Y2FwcyA9IEhXQ0FQX0lESVYgfCBIV0NBUF9WRlB2NAogCS5zaXplCV9fa3JhaXRfcHJvY19pbmZvLCAuIC0gX19rcmFpdF9wcm9jX2luZm8KIAogCS8qCkBAIC02MDQsNSArNjMyLDUgQEAKIF9fdjdfcHJvY19pbmZvOgogCS5sb25nCTB4MDAwZjAwMDAJCUAgUmVxdWlyZWQgSUQgdmFsdWUKIAkubG9uZwkweDAwMGYwMDAwCQlAIE1hc2sgZm9yIElECi0JX192N19wcm9jIF9fdjdfc2V0dXAKKwlfX3Y3X3Byb2MgX192N19wcm9jX2luZm8sIF9fdjdfc2V0dXAKIAkuc2l6ZQlfX3Y3X3Byb2NfaW5mbywgLiAtIF9fdjdfcHJvY19pbmZvCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXY3bS5TIGIvYXJjaC9hcm0vbW0vcHJvYy12N20uUwppbmRleCBkMWU2OGI1Li5lMDhlMWYyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY3bS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MtdjdtLlMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCXN0cmluZyBjcHVfZWxmX25hbWUgInY3bSIKIAlzdHJpbmcgY3B1X3Y3bV9uYW1lICJBUk12Ny1NIgogCi0JLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgorCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MKIAogCS8qCiAJICogTWF0Y2ggYW55IEFSTXY3LU0gcHJvY2Vzc29yIGNvcmUuCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAkubG9uZwkweDAwMGYwMDAwCQlAIE1hc2sgZm9yIElECiAJLmxvbmcgICAwCQkJQCBwcm9jX2luZm9fbGlzdC5fX2NwdV9tbV9tbXVfZmxhZ3MKIAkubG9uZyAgIDAJCQlAIHByb2NfaW5mb19saXN0Ll9fY3B1X2lvX21tdV9mbGFncwotCWIJX192N21fc2V0dXAJCUAgcHJvY19pbmZvX2xpc3QuX19jcHVfZmx1c2gKKwlpbml0Zm4JX192N21fc2V0dXAsIF9fdjdtX3Byb2NfaW5mbwlAIHByb2NfaW5mb19saXN0Ll9fY3B1X2ZsdXNoCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQogCS5sb25nCUhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXhzYzMuUyBiL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCmluZGV4IGY4YWNkZmUuLjI5M2RjYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MteHNjMy5TCkBAIC00OTksNyArNDk5LDcgQEAKIAogCS5hbGlnbgogCi0JLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYywgI2V4ZWNpbnN0cgorCS5zZWN0aW9uICIucHJvYy5pbmZvLmluaXQiLCAjYWxsb2MKIAogLm1hY3JvIHhzYzNfcHJvY19pbmZvIG5hbWU6cmVxLCBjcHVfdmFsOnJlcSwgY3B1X21hc2s6cmVxCiAJLnR5cGUJX19cbmFtZVwoKV9wcm9jX2luZm8sI29iamVjdApAQCAtNTE0LDcgKzUxNCw3IEBACiAJLmxvbmcJUE1EX1RZUEVfU0VDVCB8IFwKIAkJUE1EX1NFQ1RfQVBfV1JJVEUgfCBcCiAJCVBNRF9TRUNUX0FQX1JFQUQKLQliCV9feHNjM19zZXR1cAorCWluaXRmbglfX3hzYzNfc2V0dXAsIF9fXG5hbWVcKClfcHJvY19pbmZvCiAJLmxvbmcJY3B1X2FyY2hfbmFtZQogCS5sb25nCWNwdV9lbGZfbmFtZQogCS5sb25nCUhXQ0FQX1NXUHxIV0NBUF9IQUxGfEhXQ0FQX1RIVU1CfEhXQ0FQX0ZBU1RfTVVMVHxIV0NBUF9FRFNQCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TIGIvYXJjaC9hcm0vbW0vcHJvYy14c2NhbGUuUwppbmRleCBhZmEyYjNjLi5iNmJiZmRiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXhzY2FsZS5TCisrKyBiL2FyY2gvYXJtL21tL3Byb2MteHNjYWxlLlMKQEAgLTYxMiw3ICs2MTIsNyBAQAogCiAJLmFsaWduCiAKLQkuc2VjdGlvbiAiLnByb2MuaW5mby5pbml0IiwgI2FsbG9jLCAjZXhlY2luc3RyCisJLnNlY3Rpb24gIi5wcm9jLmluZm8uaW5pdCIsICNhbGxvYwogCiAubWFjcm8geHNjYWxlX3Byb2NfaW5mbyBuYW1lOnJlcSwgY3B1X3ZhbDpyZXEsIGNwdV9tYXNrOnJlcSwgY3B1X25hbWU6cmVxLCBjYWNoZQogCS50eXBlCV9fXG5hbWVcKClfcHJvY19pbmZvLCNvYmplY3QKQEAgLTYyNyw3ICs2MjcsNyBAQAogCS5sb25nCVBNRF9UWVBFX1NFQ1QgfCBcCiAJCVBNRF9TRUNUX0FQX1dSSVRFIHwgXAogCQlQTURfU0VDVF9BUF9SRUFECi0JYglfX3hzY2FsZV9zZXR1cAorCWluaXRmbglfX3hzY2FsZV9zZXR1cCwgX19cbmFtZVwoKV9wcm9jX2luZm8KIAkubG9uZwljcHVfYXJjaF9uYW1lCiAJLmxvbmcJY3B1X2VsZl9uYW1lCiAJLmxvbmcJSFdDQVBfU1dQfEhXQ0FQX0hBTEZ8SFdDQVBfVEhVTUJ8SFdDQVBfRkFTVF9NVUxUfEhXQ0FQX0VEU1AKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL253ZnBlL2VudHJ5LlMgYi9hcmNoL2FybS9ud2ZwZS9lbnRyeS5TCmluZGV4IDVkNjViZTEuLjcxZGY0MzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL253ZnBlL2VudHJ5LlMKKysrIGIvYXJjaC9hcm0vbndmcGUvZW50cnkuUwpAQCAtMTEzLDcgKzExMyw3IEBACiAJQCB0byBmYXVsdC4gIEVtaXQgdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBndW5rIHRvIGZpeCB0aGluZ3MgdXAuCiAJQCA/Pz8gRm9yIHNvbWUgcmVhc29uLCBmYXVsdHMgY2FuIGhhcHBlbiBhdCAuTHgyIGV2ZW4gd2l0aCBhCiAJQCBwbGFpbiBMRFIgaW5zdHJ1Y3Rpb24uICBXZWlyZCwgYnV0IGl0IHNlZW1zIGhhcm1sZXNzLgotCS5wdXNoc2VjdGlvbiAuZml4dXAsImF4IgorCS5wdXNoc2VjdGlvbiAudGV4dC5maXh1cCwiYXgiCiAJLmFsaWduCTIKIC5MZml4OglyZXQJcjkJCQlAIGxldCB0aGUgdXNlciBlYXQgc2VnZmF1bHRzCiAJLnBvcHNlY3Rpb24KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb21hcC9jb3VudGVyXzMyay5jIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2NvdW50ZXJfMzJrLmMKaW5kZXggNjFiNGQ3MC4uMjQzOGI5NiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2NvdW50ZXJfMzJrLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vbWFwL2NvdW50ZXJfMzJrLmMKQEAgLTQ0LDI0ICs0NCwyMCBAQAogfQogCiAvKioKLSAqIG9tYXBfcmVhZF9wZXJzaXN0ZW50X2Nsb2NrIC0gIFJldHVybiB0aW1lIGZyb20gYSBwZXJzaXN0ZW50IGNsb2NrLgorICogb21hcF9yZWFkX3BlcnNpc3RlbnRfY2xvY2s2NCAtICBSZXR1cm4gdGltZSBmcm9tIGEgcGVyc2lzdGVudCBjbG9jay4KICAqCiAgKiBSZWFkcyB0aGUgdGltZSBmcm9tIGEgc291cmNlIHdoaWNoIGlzbid0IGRpc2FibGVkIGR1cmluZyBQTSwgdGhlCiAgKiAzMmsgc3luYyB0aW1lci4gIENvbnZlcnQgdGhlIGN5Y2xlcyBlbGFwc2VkIHNpbmNlIGxhc3QgcmVhZCBpbnRvCi0gKiBuc2VjcyBhbmQgYWRkcyB0byBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB0aW1lc3BlYy4KKyAqIG5zZWNzIGFuZCBhZGRzIHRvIGEgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHRpbWVzcGVjNjQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgdGltZXNwZWMgcGVyc2lzdGVudF90czsKK3N0YXRpYyBzdHJ1Y3QgdGltZXNwZWM2NCBwZXJzaXN0ZW50X3RzOwogc3RhdGljIGN5Y2xlc190IGN5Y2xlczsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcGVyc2lzdGVudF9tdWx0LCBwZXJzaXN0ZW50X3NoaWZ0Owotc3RhdGljIERFRklORV9TUElOTE9DSyhyZWFkX3BlcnNpc3RlbnRfY2xvY2tfbG9jayk7CiAKLXN0YXRpYyB2b2lkIG9tYXBfcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHN0cnVjdCB0aW1lc3BlYyAqdHMpCitzdGF0aWMgdm9pZCBvbWFwX3JlYWRfcGVyc2lzdGVudF9jbG9jazY0KHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbnNlY3M7CiAJY3ljbGVzX3QgbGFzdF9jeWNsZXM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyZWFkX3BlcnNpc3RlbnRfY2xvY2tfbG9jaywgZmxhZ3MpOwogCiAJbGFzdF9jeWNsZXMgPSBjeWNsZXM7CiAJY3ljbGVzID0gc3luYzMya19jbnRfcmVnID8gcmVhZGxfcmVsYXhlZChzeW5jMzJrX2NudF9yZWcpIDogMDsKQEAgLTY5LDExICs2NSw5IEBACiAJbnNlY3MgPSBjbG9ja3NvdXJjZV9jeWMybnMoY3ljbGVzIC0gbGFzdF9jeWNsZXMsCiAJCQkJCXBlcnNpc3RlbnRfbXVsdCwgcGVyc2lzdGVudF9zaGlmdCk7CiAKLQl0aW1lc3BlY19hZGRfbnMoJnBlcnNpc3RlbnRfdHMsIG5zZWNzKTsKKwl0aW1lc3BlYzY0X2FkZF9ucygmcGVyc2lzdGVudF90cywgbnNlY3MpOwogCiAJKnRzID0gcGVyc2lzdGVudF90czsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJlYWRfcGVyc2lzdGVudF9jbG9ja19sb2NrLCBmbGFncyk7CiB9CiAKIC8qKgpAQCAtMTAzLDcgKzk3LDcgQEAKIAogCS8qCiAJICogMTIwMDAwIHJvdWdoIGVzdGltYXRlIGZyb20gdGhlIGNhbGN1bGF0aW9ucyBpbgotCSAqIF9fY2xvY2tzb3VyY2VfdXBkYXRlZnJlcV9zY2FsZS4KKwkgKiBfX2Nsb2Nrc291cmNlX3VwZGF0ZV9mcmVxX3NjYWxlLgogCSAqLwogCWNsb2Nrc19jYWxjX211bHRfc2hpZnQoJnBlcnNpc3RlbnRfbXVsdCwgJnBlcnNpc3RlbnRfc2hpZnQsCiAJCQkzMjc2OCwgTlNFQ19QRVJfU0VDLCAxMjAwMDApOwpAQCAtMTE2LDcgKzExMCw3IEBACiAJfQogCiAJc2NoZWRfY2xvY2tfcmVnaXN0ZXIob21hcF8zMmtfcmVhZF9zY2hlZF9jbG9jaywgMzIsIDMyNzY4KTsKLQlyZWdpc3Rlcl9wZXJzaXN0ZW50X2Nsb2NrKE5VTEwsIG9tYXBfcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKTsKKwlyZWdpc3Rlcl9wZXJzaXN0ZW50X2Nsb2NrKE5VTEwsIG9tYXBfcmVhZF9wZXJzaXN0ZW50X2Nsb2NrNjQpOwogCXByX2luZm8oIk9NQVAgY2xvY2tzb3VyY2U6IDMya19jb3VudGVyIGF0IDMyNzY4IEh6XG4iKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYyBiL2FyY2gvYXJtL3BsYXQtb21hcC9kbXRpbWVyLmMKaW5kZXggZGIxMDE2OS4uOGNhOTRkMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vbWFwL2RtdGltZXIuYworKysgYi9hcmNoL2FybS9wbGF0LW9tYXAvZG10aW1lci5jCkBAIC03OTksNiArNzk5LDcgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCWNvbnN0IHN0cnVjdCBkbXRpbWVyX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCWludCByZXQ7CiAKIAltYXRjaCA9IG9mX21hdGNoX2RldmljZShvZl9tYXRjaF9wdHIob21hcF90aW1lcl9tYXRjaCksIGRldik7CiAJcGRhdGEgPSBtYXRjaCA/IG1hdGNoLT5kYXRhIDogZGV2LT5wbGF0Zm9ybV9kYXRhOwpAQCAtODYwLDcgKzg2MSwxMiBAQAogCX0KIAogCWlmICghdGltZXItPnJlc2VydmVkKSB7Ci0JCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKwkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICIlczogcG1fcnVudGltZV9nZXRfc3luYyBmYWlsZWQhXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJCWdvdG8gZXJyX2dldF9zeW5jOworCQl9CiAJCV9fb21hcF9kbV90aW1lcl9pbml0X3JlZ3ModGltZXIpOwogCQlwbV9ydW50aW1lX3B1dChkZXYpOwogCX0KQEAgLTg3Myw2ICs4NzksMTEgQEAKIAlkZXZfZGJnKGRldiwgIkRldmljZSBQcm9iZWQuXG4iKTsKIAogCXJldHVybiAwOworCitlcnJfZ2V0X3N5bmM6CisJcG1fcnVudGltZV9wdXRfbm9pZGxlKGRldik7CisJcG1fcnVudGltZV9kaXNhYmxlKGRldik7CisJcmV0dXJuIHJldDsKIH0KIAogLyoqCkBAIC04OTksNiArOTEwLDggQEAKIAkJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtX3RpbWVyX2xvY2ssIGZsYWdzKTsKIAorCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtcHhhL2RtYS5jIGIvYXJjaC9hcm0vcGxhdC1weGEvZG1hLmMKaW5kZXggMDU0ZmM1YS4uZDkyZjA3ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1weGEvZG1hLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1weGEvZG1hLmMKQEAgLTUxLDE5ICs1MSwxOSBAQAogCiBzdGF0aWMgaW50IGRiZ19zaG93X3JlcXVlc3Rlcl9jaGFuKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKIHsKLQlpbnQgcG9zID0gMDsKIAlpbnQgY2hhbiA9IChpbnQpcy0+cHJpdmF0ZTsKIAlpbnQgaTsKIAl1MzIgZHJjbXI7CiAKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiRE1BIGNoYW5uZWwgJWQgcmVxdWVzdGVycyBsaXN0IDpcbiIsIGNoYW4pOworCXNlcV9wcmludGYocywgIkRNQSBjaGFubmVsICVkIHJlcXVlc3RlcnMgbGlzdCA6XG4iLCBjaGFuKTsKIAlmb3IgKGkgPSAwOyBpIDwgRE1BX01BWF9SRVFVRVNURVJTOyBpKyspIHsKIAkJZHJjbXIgPSBEUkNNUihpKTsKIAkJaWYgKChkcmNtciAmIERSQ01SX0NITE5VTSkgPT0gY2hhbikKLQkJCXBvcyArPSBzZXFfcHJpbnRmKHMsICJcdFJlcXVlc3RlciAlZCAoTUFQVkxEPSVkKVxuIiwgaSwKLQkJCQkJICAhIShkcmNtciAmIERSQ01SX01BUFZMRCkpOworCQkJc2VxX3ByaW50ZihzLCAiXHRSZXF1ZXN0ZXIgJWQgKE1BUFZMRD0lZClcbiIsCisJCQkJICAgaSwgISEoZHJjbXIgJiBEUkNNUl9NQVBWTEQpKTsKIAl9Ci0JcmV0dXJuIHBvczsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBkYmdfYnVyc3RfZnJvbV9kY21kKHUzMiBkY21kKQpAQCAtODMsNyArODMsNiBAQAogCiBzdGF0aWMgaW50IGRiZ19zaG93X2Rlc2NyaXB0b3JzKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKIHsKLQlpbnQgcG9zID0gMDsKIAlpbnQgY2hhbiA9IChpbnQpcy0+cHJpdmF0ZTsKIAlpbnQgaSwgbWF4X3Nob3cgPSAyMCwgYnVyc3QsIHdpZHRoOwogCXUzMiBkY21kOwpAQCAtOTQsNDQgKzkzLDQzIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYV9jaGFubmVsc1tjaGFuXS5sb2NrLCBmbGFncyk7CiAJcGh5c19kZXNjID0gRERBRFIoY2hhbik7CiAKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiRE1BIGNoYW5uZWwgJWQgZGVzY3JpcHRvcnMgOlxuIiwgY2hhbik7Ci0JcG9zICs9IHNlcV9wcmludGYocywgIlslMDNkXSBGaXJzdCBkZXNjcmlwdG9yIHVua25vd25cbiIsIDApOworCXNlcV9wcmludGYocywgIkRNQSBjaGFubmVsICVkIGRlc2NyaXB0b3JzIDpcbiIsIGNoYW4pOworCXNlcV9wcmludGYocywgIlslMDNkXSBGaXJzdCBkZXNjcmlwdG9yIHVua25vd25cbiIsIDApOwogCWZvciAoaSA9IDE7IGkgPCBtYXhfc2hvdyAmJiBpc19waHlzX3ZhbGlkKHBoeXNfZGVzYyk7IGkrKykgewogCQlkZXNjID0gcGh5c190b192aXJ0KHBoeXNfZGVzYyk7CiAJCWRjbWQgPSBkZXNjLT5kY21kOwogCQlidXJzdCA9IGRiZ19idXJzdF9mcm9tX2RjbWQoZGNtZCk7CiAJCXdpZHRoID0gKDEgPDwgKChkY21kID4+IDE0KSAmIDB4MykpID4+IDE7CiAKLQkJcG9zICs9IHNlcV9wcmludGYocywgIlslMDNkXSBEZXNjIGF0ICUwOGx4KHZpcnQgJXApXG4iLAotCQkJCSAgaSwgcGh5c19kZXNjLCBkZXNjKTsKLQkJcG9zICs9IHNlcV9wcmludGYocywgIlx0RERBRFIgPSAlMDh4XG4iLCBkZXNjLT5kZGFkcik7Ci0JCXBvcyArPSBzZXFfcHJpbnRmKHMsICJcdERTQURSID0gJTA4eFxuIiwgZGVzYy0+ZHNhZHIpOwotCQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiXHREVEFEUiA9ICUwOHhcbiIsIGRlc2MtPmR0YWRyKTsKLQkJcG9zICs9IHNlcV9wcmludGYocywgIlx0RENNRCAgPSAlMDh4ICglcyVzJXMlcyVzJXMlc2J1cnN0PSVkIgotCQkJCSAgIiB3aWR0aD0lZCBsZW49JWQpXG4iLAotCQkJCSAgZGNtZCwKLQkJCQkgIERDTURfU1RSKElOQ1NSQ0FERFIpLCBEQ01EX1NUUihJTkNUUkdBRERSKSwKLQkJCQkgIERDTURfU1RSKEZMT1dTUkMpLCBEQ01EX1NUUihGTE9XVFJHKSwKLQkJCQkgIERDTURfU1RSKFNUQVJUSVJRRU4pLCBEQ01EX1NUUihFTkRJUlFFTiksCi0JCQkJICBEQ01EX1NUUihFTkRJQU4pLCBidXJzdCwgd2lkdGgsCi0JCQkJICBkY21kICYgRENNRF9MRU5HVEgpOworCQlzZXFfcHJpbnRmKHMsICJbJTAzZF0gRGVzYyBhdCAlMDhseCh2aXJ0ICVwKVxuIiwKKwkJCSAgIGksIHBoeXNfZGVzYywgZGVzYyk7CisJCXNlcV9wcmludGYocywgIlx0RERBRFIgPSAlMDh4XG4iLCBkZXNjLT5kZGFkcik7CisJCXNlcV9wcmludGYocywgIlx0RFNBRFIgPSAlMDh4XG4iLCBkZXNjLT5kc2Fkcik7CisJCXNlcV9wcmludGYocywgIlx0RFRBRFIgPSAlMDh4XG4iLCBkZXNjLT5kdGFkcik7CisJCXNlcV9wcmludGYocywgIlx0RENNRCAgPSAlMDh4ICglcyVzJXMlcyVzJXMlc2J1cnN0PSVkIHdpZHRoPSVkIGxlbj0lZClcbiIsCisJCQkgICBkY21kLAorCQkJICAgRENNRF9TVFIoSU5DU1JDQUREUiksIERDTURfU1RSKElOQ1RSR0FERFIpLAorCQkJICAgRENNRF9TVFIoRkxPV1NSQyksIERDTURfU1RSKEZMT1dUUkcpLAorCQkJICAgRENNRF9TVFIoU1RBUlRJUlFFTiksIERDTURfU1RSKEVORElSUUVOKSwKKwkJCSAgIERDTURfU1RSKEVORElBTiksIGJ1cnN0LCB3aWR0aCwKKwkJCSAgIGRjbWQgJiBEQ01EX0xFTkdUSCk7CiAJCXBoeXNfZGVzYyA9IGRlc2MtPmRkYWRyOwogCX0KIAlpZiAoaSA9PSBtYXhfc2hvdykKLQkJcG9zICs9IHNlcV9wcmludGYocywgIlslMDNkXSBEZXNjIGF0ICUwOGx4IC4uLiBtYXggZGlzcGxheSByZWFjaGVkXG4iLAotCQkJCSAgaSwgcGh5c19kZXNjKTsKKwkJc2VxX3ByaW50ZihzLCAiWyUwM2RdIERlc2MgYXQgJTA4bHggLi4uIG1heCBkaXNwbGF5IHJlYWNoZWRcbiIsCisJCQkgICBpLCBwaHlzX2Rlc2MpOwogCWVsc2UKLQkJcG9zICs9IHNlcV9wcmludGYocywgIlslMDNkXSBEZXNjIGF0ICUwOGx4IGlzICVzXG4iLAotCQkJCSAgaSwgcGh5c19kZXNjLCBwaHlzX2Rlc2MgPT0gRERBRFJfU1RPUCA/Ci0JCQkJICAiRERBRFJfU1RPUCIgOiAiaW52YWxpZCIpOworCQlzZXFfcHJpbnRmKHMsICJbJTAzZF0gRGVzYyBhdCAlMDhseCBpcyAlc1xuIiwKKwkJCSAgIGksIHBoeXNfZGVzYywgcGh5c19kZXNjID09IEREQURSX1NUT1AgPworCQkJICAgIkREQURSX1NUT1AiIDogImludmFsaWQiKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9jaGFubmVsc1tjaGFuXS5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHBvczsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRiZ19zaG93X2NoYW5fc3RhdGUoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQogewotCWludCBwb3MgPSAwOwogCWludCBjaGFuID0gKGludClzLT5wcml2YXRlOwogCXUzMiBkY3NyLCBkY21kOwogCWludCBidXJzdCwgd2lkdGg7CkBAIC0xNDIsNDIgKzE0MCwzOSBAQAogCWJ1cnN0ID0gZGJnX2J1cnN0X2Zyb21fZGNtZChkY21kKTsKIAl3aWR0aCA9ICgxIDw8ICgoZGNtZCA+PiAxNCkgJiAweDMpKSA+PiAxOwogCi0JcG9zICs9IHNlcV9wcmludGYocywgIkRNQSBjaGFubmVsICVkXG4iLCBjaGFuKTsKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiXHRQcmlvcml0eSA6ICVzXG4iLAotCQkJICBzdHJfcHJpb1tkbWFfY2hhbm5lbHNbY2hhbl0ucHJpb10pOwotCXBvcyArPSBzZXFfcHJpbnRmKHMsICJcdFVuYWxpZ25lZCB0cmFuc2ZlciBiaXQ6ICVzXG4iLAotCQkJICBEQUxHTiAmICgxIDw8IGNoYW4pID8gInllcyIgOiAibm8iKTsKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiXHREQ1NSICA9ICUwOHggKCVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcylcbiIsCi0JCQkgIGRjc3IsIERDU1JfU1RSKFJVTiksIERDU1JfU1RSKE5PREVTQyksCi0JCQkgIERDU1JfU1RSKFNUT1BJUlFFTiksIERDU1JfU1RSKEVPUklSUUVOKSwKLQkJCSAgRENTUl9TVFIoRU9SSk1QRU4pLCBEQ1NSX1NUUihFT1JTVE9QRU4pLAotCQkJICBEQ1NSX1NUUihTRVRDTVBTVCksIERDU1JfU1RSKENMUkNNUFNUKSwKLQkJCSAgRENTUl9TVFIoQ01QU1QpLCBEQ1NSX1NUUihFT1JJTlRSKSwgRENTUl9TVFIoUkVRUEVORCksCi0JCQkgIERDU1JfU1RSKFNUT1BTVEFURSksIERDU1JfU1RSKEVORElOVFIpLAotCQkJICBEQ1NSX1NUUihTVEFSVElOVFIpLCBEQ1NSX1NUUihCVVNFUlIpKTsKKwlzZXFfcHJpbnRmKHMsICJETUEgY2hhbm5lbCAlZFxuIiwgY2hhbik7CisJc2VxX3ByaW50ZihzLCAiXHRQcmlvcml0eSA6ICVzXG4iLCBzdHJfcHJpb1tkbWFfY2hhbm5lbHNbY2hhbl0ucHJpb10pOworCXNlcV9wcmludGYocywgIlx0VW5hbGlnbmVkIHRyYW5zZmVyIGJpdDogJXNcbiIsCisJCSAgIERBTEdOICYgKDEgPDwgY2hhbikgPyAieWVzIiA6ICJubyIpOworCXNlcV9wcmludGYocywgIlx0RENTUiAgPSAlMDh4ICglcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMpXG4iLAorCQkgICBkY3NyLCBEQ1NSX1NUUihSVU4pLCBEQ1NSX1NUUihOT0RFU0MpLAorCQkgICBEQ1NSX1NUUihTVE9QSVJRRU4pLCBEQ1NSX1NUUihFT1JJUlFFTiksCisJCSAgIERDU1JfU1RSKEVPUkpNUEVOKSwgRENTUl9TVFIoRU9SU1RPUEVOKSwKKwkJICAgRENTUl9TVFIoU0VUQ01QU1QpLCBEQ1NSX1NUUihDTFJDTVBTVCksCisJCSAgIERDU1JfU1RSKENNUFNUKSwgRENTUl9TVFIoRU9SSU5UUiksIERDU1JfU1RSKFJFUVBFTkQpLAorCQkgICBEQ1NSX1NUUihTVE9QU1RBVEUpLCBEQ1NSX1NUUihFTkRJTlRSKSwKKwkJICAgRENTUl9TVFIoU1RBUlRJTlRSKSwgRENTUl9TVFIoQlVTRVJSKSk7CiAKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiXHREQ01EICA9ICUwOHggKCVzJXMlcyVzJXMlcyVzYnVyc3Q9JWQgd2lkdGg9JWQiCi0JCQkgICIgbGVuPSVkKVxuIiwKLQkJCSAgZGNtZCwKLQkJCSAgRENNRF9TVFIoSU5DU1JDQUREUiksIERDTURfU1RSKElOQ1RSR0FERFIpLAotCQkJICBEQ01EX1NUUihGTE9XU1JDKSwgRENNRF9TVFIoRkxPV1RSRyksCi0JCQkgIERDTURfU1RSKFNUQVJUSVJRRU4pLCBEQ01EX1NUUihFTkRJUlFFTiksCi0JCQkgIERDTURfU1RSKEVORElBTiksIGJ1cnN0LCB3aWR0aCwgZGNtZCAmIERDTURfTEVOR1RIKTsKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiXHREU0FEUiA9ICUwOHhcbiIsIERTQURSKGNoYW4pKTsKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiXHREVEFEUiA9ICUwOHhcbiIsIERUQURSKGNoYW4pKTsKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiXHREREFEUiA9ICUwOHhcbiIsIEREQURSKGNoYW4pKTsKLQlyZXR1cm4gcG9zOworCXNlcV9wcmludGYocywgIlx0RENNRCAgPSAlMDh4ICglcyVzJXMlcyVzJXMlc2J1cnN0PSVkIHdpZHRoPSVkIGxlbj0lZClcbiIsCisJCSAgIGRjbWQsCisJCSAgIERDTURfU1RSKElOQ1NSQ0FERFIpLCBEQ01EX1NUUihJTkNUUkdBRERSKSwKKwkJICAgRENNRF9TVFIoRkxPV1NSQyksIERDTURfU1RSKEZMT1dUUkcpLAorCQkgICBEQ01EX1NUUihTVEFSVElSUUVOKSwgRENNRF9TVFIoRU5ESVJRRU4pLAorCQkgICBEQ01EX1NUUihFTkRJQU4pLCBidXJzdCwgd2lkdGgsIGRjbWQgJiBEQ01EX0xFTkdUSCk7CisJc2VxX3ByaW50ZihzLCAiXHREU0FEUiA9ICUwOHhcbiIsIERTQURSKGNoYW4pKTsKKwlzZXFfcHJpbnRmKHMsICJcdERUQURSID0gJTA4eFxuIiwgRFRBRFIoY2hhbikpOworCXNlcV9wcmludGYocywgIlx0RERBRFIgPSAlMDh4XG4iLCBEREFEUihjaGFuKSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkYmdfc2hvd19zdGF0ZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCiB7Ci0JaW50IHBvcyA9IDA7Ci0KIAkvKiBiYXNpYyBkZXZpY2Ugc3RhdHVzICovCi0JcG9zICs9IHNlcV9wcmludGYocywgIkRNQSBlbmdpbmUgc3RhdHVzXG4iKTsKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiXHRDaGFubmVsIG51bWJlcjogJWRcbiIsIG51bV9kbWFfY2hhbm5lbHMpOworCXNlcV9wdXRzKHMsICJETUEgZW5naW5lIHN0YXR1c1xuIik7CisJc2VxX3ByaW50ZihzLCAiXHRDaGFubmVsIG51bWJlcjogJWRcbiIsIG51bV9kbWFfY2hhbm5lbHMpOwogCi0JcmV0dXJuIHBvczsKKwlyZXR1cm4gMDsKIH0KIAogI2RlZmluZSBEQkdGU19GVU5DX0RFQ0wobmFtZSkgXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmRzby8uZ2l0aWdub3JlIGIvYXJjaC9hcm0vdmRzby8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjY5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS92ZHNvLy5naXRpZ25vcmUKQEAgLTAsMCArMSBAQAordmRzby5sZHMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3Zkc28vTWFrZWZpbGUgYi9hcmNoL2FybS92ZHNvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYjBhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS92ZHNvL01ha2VmaWxlCkBAIC0wLDAgKzEsNzQgQEAKK2hvc3Rwcm9ncy15IDo9IHZkc29tdW5nZQorCitvYmotdmRzbyA6PSB2Z2V0dGltZW9mZGF5Lm8gZGF0YXBhZ2UubworCisjIEJ1aWxkIHJ1bGVzCit0YXJnZXRzIDo9ICQob2JqLXZkc28pIHZkc28uc28gdmRzby5zby5kYmcgdmRzby5zby5yYXcgdmRzby5sZHMKK29iai12ZHNvIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sICQob2JqLXZkc28pKQorCitjY2ZsYWdzLXkgOj0gLXNoYXJlZCAtZlBJQyAtZm5vLWNvbW1vbiAtZm5vLWJ1aWx0aW4gLWZuby1zdGFjay1wcm90ZWN0b3IKK2NjZmxhZ3MteSArPSAtbm9zdGRsaWIgLVdsLC1zb25hbWU9bGludXgtdmRzby5zby4xIC1ERElTQUJMRV9CUkFOQ0hfUFJPRklMSU5HCitjY2ZsYWdzLXkgKz0gLVdsLC0tbm8tdW5kZWZpbmVkICQoY2FsbCBjYy1sZG9wdGlvbiwgLVdsJChjb21tYSktLWhhc2gtc3R5bGU9c3lzdikKKworb2JqLXkgKz0gdmRzby5vCitleHRyYS15ICs9IHZkc28ubGRzCitDUFBGTEFHU192ZHNvLmxkcyArPSAtUCAtQyAtVSQoQVJDSCkKKworQ0ZMQUdTX1JFTU9WRV92ZHNvLm8gPSAtcGcKKworIyBGb3JjZSAtTzIgdG8gYXZvaWQgbGliZ2NjIGRlcGVuZGVuY2llcworQ0ZMQUdTX1JFTU9WRV92Z2V0dGltZW9mZGF5Lm8gPSAtcGcgLU9zCitDRkxBR1NfdmdldHRpbWVvZmRheS5vID0gLU8yCisKKyMgRGlzYWJsZSBnY292IHByb2ZpbGluZyBmb3IgVkRTTyBjb2RlCitHQ09WX1BST0ZJTEUgOj0gbgorCisjIEZvcmNlIGRlcGVuZGVuY3kKKyQob2JqKS92ZHNvLm8gOiAkKG9iaikvdmRzby5zbworCisjIExpbmsgcnVsZSBmb3IgdGhlIC5zbyBmaWxlCiskKG9iaikvdmRzby5zby5yYXc6ICQoc3JjKS92ZHNvLmxkcyAkKG9iai12ZHNvKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHZkc29sZCkKKworJChvYmopL3Zkc28uc28uZGJnOiAkKG9iaikvdmRzby5zby5yYXcgJChvYmopL3Zkc29tdW5nZSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHZkc29tdW5nZSkKKworIyBTdHJpcCBydWxlIGZvciB0aGUgLnNvIGZpbGUKKyQob2JqKS8lLnNvOiBPQkpDT1BZRkxBR1MgOj0gLVMKKyQob2JqKS8lLnNvOiAkKG9iaikvJS5zby5kYmcgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxvYmpjb3B5KQorCisjIEFjdHVhbCBidWlsZCBjb21tYW5kcworcXVpZXRfY21kX3Zkc29sZCA9IFZEU08gICAgJEAKKyAgICAgIGNtZF92ZHNvbGQgPSAkKENDKSAkKGNfZmxhZ3MpIC1XbCwtVCAkKGZpbHRlciAlLmxkcywkXikgJChmaWx0ZXIgJS5vLCReKSBcCisgICAgICAgICAgICAgICAgICAgJChjYWxsIGNjLWxkb3B0aW9uLCAtV2wkKGNvbW1hKS0tYnVpbGQtaWQpIFwKKyAgICAgICAgICAgICAgICAgICAtV2wsLUJzeW1ib2xpYyAtV2wsLXosbWF4LXBhZ2Utc2l6ZT00MDk2IFwKKyAgICAgICAgICAgICAgICAgICAtV2wsLXosY29tbW9uLXBhZ2Utc2l6ZT00MDk2IC1vICRACisKK3F1aWV0X2NtZF92ZHNvbXVuZ2UgPSBNVU5HRSAgICRACisgICAgICBjbWRfdmRzb211bmdlID0gJChvYmp0cmVlKS8kKG9iaikvdmRzb211bmdlICQ8ICRACisKKyMKKyMgSW5zdGFsbCB0aGUgdW5zdHJpcHBlZCBjb3B5IG9mIHZkc28uc28uZGJnLiAgSWYgb3VyIHRvb2xjaGFpbgorIyBzdXBwb3J0cyBidWlsZC1pZCwgaW5zdGFsbCAuYnVpbGQtaWQgbGlua3MgYXMgd2VsbC4KKyMKKyMgQ3JpYmJlZCBmcm9tIGFyY2gveDg2L3Zkc28vTWFrZWZpbGUuCisjCitxdWlldF9jbWRfdmRzb19pbnN0YWxsID0gSU5TVEFMTCAkPAorZGVmaW5lIGNtZF92ZHNvX2luc3RhbGwKKwljcCAkPCAiJChNT0RMSUIpL3Zkc28vdmRzby5zbyI7IFwKKwlpZiByZWFkZWxmIC1uICQ8IHwgZ3JlcCAtcSAnQnVpbGQgSUQnOyB0aGVuIFwKKwkgIGJ1aWxkaWQ9YHJlYWRlbGYgLW4gJDwgfGdyZXAgJ0J1aWxkIElEJyB8c2VkIC1lICdzL14uKkJ1aWxkIElEOiBcKC4qXCkkJC9cMS8nYDsgXAorCSAgZmlyc3Q9YGVjaG8gJCRidWlsZGlkIHwgY3V0IC1iLTJgOyBcCisJICBsYXN0PWBlY2hvICQkYnVpbGRpZCB8IGN1dCAtYjMtYDsgXAorCSAgbWtkaXIgLXAgIiQoTU9ETElCKS92ZHNvLy5idWlsZC1pZC8kJGZpcnN0IjsgXAorCSAgbG4gLXNmICIuLi8uLi92ZHNvLnNvIiAiJChNT0RMSUIpL3Zkc28vLmJ1aWxkLWlkLyQkZmlyc3QvJCRsYXN0LmRlYnVnIjsgXAorCWZpCitlbmRlZgorCiskKE1PRExJQikvdmRzbzogRk9SQ0UKKwlAbWtkaXIgLXAgJChNT0RMSUIpL3Zkc28KKworUEhPTlkgKz0gdmRzb19pbnN0YWxsCit2ZHNvX2luc3RhbGw6ICQob2JqKS92ZHNvLnNvLmRiZyAkKE1PRExJQikvdmRzbyBGT1JDRQorCSQoY2FsbCBjbWQsdmRzb19pbnN0YWxsKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmRzby9kYXRhcGFnZS5TIGIvYXJjaC9hcm0vdmRzby9kYXRhcGFnZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTYwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS92ZHNvL2RhdGFwYWdlLlMKQEAgLTAsMCArMSwxNSBAQAorI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKworCS5hbGlnbiAyCisuTF92ZHNvX2RhdGFfcHRyOgorCS5sb25nCV9zdGFydCAtIC4gLSBWRFNPX0RBVEFfU0laRQorCitFTlRSWShfX2dldF9kYXRhcGFnZSkKKwkuZm5zdGFydAorCWFkcglyMCwgLkxfdmRzb19kYXRhX3B0cgorCWxkcglyMSwgW3IwXQorCWFkZAlyMCwgcjAsIHIxCisJYngJbHIKKwkuZm5lbmQKK0VORFBST0MoX19nZXRfZGF0YXBhZ2UpCmRpZmYgLS1naXQgYS9hcmNoL2FybS92ZHNvL3Zkc28uUyBiL2FyY2gvYXJtL3Zkc28vdmRzby5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYjk3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS92ZHNvL3Zkc28uUwpAQCAtMCwwICsxLDM1IEBACisvKgorICogQWRhcHRlZCBmcm9tIGFybTY0IHZlcnNpb24uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEFSTSBMaW1pdGVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqCisgKiBBdXRob3I6IFdpbGwgRGVhY29uIDx3aWxsLmRlYWNvbkBhcm0uY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnN0Lmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworCV9fUEFHRV9BTElHTkVEX0RBVEEKKworCS5nbG9ibCB2ZHNvX3N0YXJ0LCB2ZHNvX2VuZAorCS5iYWxpZ24gUEFHRV9TSVpFCit2ZHNvX3N0YXJ0OgorCS5pbmNiaW4gImFyY2gvYXJtL3Zkc28vdmRzby5zbyIKKwkuYmFsaWduIFBBR0VfU0laRQordmRzb19lbmQ6CisKKwkucHJldmlvdXMKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3Zkc28vdmRzby5sZHMuUyBiL2FyY2gvYXJtL3Zkc28vdmRzby5sZHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWNhODlmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vdmRzby92ZHNvLmxkcy5TCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBBZGFwdGVkIGZyb20gYXJtNjQgdmVyc2lvbi4KKyAqCisgKiBHTlUgbGlua2VyIHNjcmlwdCBmb3IgdGhlIFZEU08gbGlicmFyeS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgQVJNIExpbWl0ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIEF1dGhvcjogV2lsbCBEZWFjb24gPHdpbGwuZGVhY29uQGFybS5jb20+CisgKiBIZWF2aWx5IGJhc2VkIG9uIHRoZSB2RFNPIGxpbmtlciBzY3JpcHRzIGZvciBvdGhlciBhcmNocy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uc3QuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS92ZHNvLmg+CisKK09VVFBVVF9GT1JNQVQoImVsZjMyLWxpdHRsZWFybSIsICJlbGYzMi1iaWdhcm0iLCAiZWxmMzItbGl0dGxlYXJtIikKK09VVFBVVF9BUkNIKGFybSkKKworU0VDVElPTlMKK3sKKwlQUk9WSURFKF9zdGFydCA9IC4pOworCisJLiA9IFNJWkVPRl9IRUFERVJTOworCisJLmhhc2gJCTogeyAqKC5oYXNoKSB9CQkJOnRleHQKKwkuZ251Lmhhc2gJOiB7ICooLmdudS5oYXNoKSB9CisJLmR5bnN5bQkJOiB7ICooLmR5bnN5bSkgfQorCS5keW5zdHIJCTogeyAqKC5keW5zdHIpIH0KKwkuZ251LnZlcnNpb24JOiB7ICooLmdudS52ZXJzaW9uKSB9CisJLmdudS52ZXJzaW9uX2QJOiB7ICooLmdudS52ZXJzaW9uX2QpIH0KKwkuZ251LnZlcnNpb25fcgk6IHsgKiguZ251LnZlcnNpb25fcikgfQorCisJLm5vdGUJCTogeyAqKC5ub3RlLiopIH0JCTp0ZXh0CTpub3RlCisKKworCS5laF9mcmFtZV9oZHIJOiB7ICooLmVoX2ZyYW1lX2hkcikgfQkJOnRleHQJOmVoX2ZyYW1lX2hkcgorCS5laF9mcmFtZQk6IHsgS0VFUCAoKiguZWhfZnJhbWUpKSB9CTp0ZXh0CisKKwkuZHluYW1pYwk6IHsgKiguZHluYW1pYykgfQkJOnRleHQJOmR5bmFtaWMKKworCS5yb2RhdGEJCTogeyAqKC5yb2RhdGEqKSB9CQk6dGV4dAorCisJLnRleHQJCTogeyAqKC50ZXh0KikgfQkJCTp0ZXh0CT0weGU3ZjAwMWYyCisKKwkuZ290CQk6IHsgKiguZ290KSB9CisJLnJlbC5wbHQJOiB7ICooLnJlbC5wbHQpIH0KKworCS9ESVNDQVJELwk6IHsKKwkJKigubm90ZS5HTlUtc3RhY2spCisJCSooLmRhdGEgLmRhdGEuKiAuZ251LmxpbmtvbmNlLmQuKiAuc2RhdGEqKQorCQkqKC5ic3MgLnNic3MgLmR5bmJzcyAuZHluc2JzcykKKwl9Cit9CisKKy8qCisgKiBXZSBtdXN0IHN1cHBseSB0aGUgRUxGIHByb2dyYW0gaGVhZGVycyBleHBsaWNpdGx5IHRvIGdldCBqdXN0IG9uZQorICogUFRfTE9BRCBzZWdtZW50LCBhbmQgc2V0IHRoZSBmbGFncyBleHBsaWNpdGx5IHRvIG1ha2Ugc2VnbWVudHMgcmVhZC1vbmx5LgorICovCitQSERSUworeworCXRleHQJCVBUX0xPQUQJCUZMQUdTKDUpIEZJTEVIRFIgUEhEUlM7IC8qIFBGX1J8UEZfWCAqLworCWR5bmFtaWMJCVBUX0RZTkFNSUMJRkxBR1MoNCk7CQkvKiBQRl9SICovCisJbm90ZQkJUFRfTk9URQkJRkxBR1MoNCk7CQkvKiBQRl9SICovCisJZWhfZnJhbWVfaGRyCVBUX0dOVV9FSF9GUkFNRTsKK30KKworVkVSU0lPTgoreworCUxJTlVYXzIuNiB7CisJZ2xvYmFsOgorCQlfX3Zkc29fY2xvY2tfZ2V0dGltZTsKKwkJX192ZHNvX2dldHRpbWVvZmRheTsKKwlsb2NhbDogKjsKKwl9OworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmRzby92ZHNvbXVuZ2UuYyBiL2FyY2gvYXJtL3Zkc28vdmRzb211bmdlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAwNWIwNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL3Zkc28vdmRzb211bmdlLmMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBNZW50b3IgR3JhcGhpY3MgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqCisgKiB2ZHNvbXVuZ2UgLSBIb3N0IHByb2dyYW0gd2hpY2ggcHJvZHVjZXMgYSBzaGFyZWQgb2JqZWN0CisgKiBhcmNoaXRlY3R1cmFsbHkgc3BlY2lmaWVkIHRvIGJlIHVzYWJsZSBieSBib3RoIHNvZnQtIGFuZCBoYXJkLWZsb2F0CisgKiBwcm9ncmFtcy4KKyAqCisgKiBUaGUgUHJvY2VkdXJlIENhbGwgU3RhbmRhcmQgZm9yIHRoZSBBUk0gQXJjaGl0ZWN0dXJlIChBUk0gSUhJCisgKiAwMDQyRSkgc2F5czoKKyAqCisgKgk2LjQuMSBWRlAgYW5kIEJhc2UgU3RhbmRhcmQgQ29tcGF0aWJpbGl0eQorICoKKyAqCUNvZGUgY29tcGlsZWQgZm9yIHRoZSBWRlAgY2FsbGluZyBzdGFuZGFyZCBpcyBjb21wYXRpYmxlIHdpdGgKKyAqCXRoZSBiYXNlIHN0YW5kYXJkIChhbmQgdmljZS12ZXJzYSkgaWYgbm8gZmxvYXRpbmctcG9pbnQgb3IKKyAqCWNvbnRhaW5lcml6ZWQgdmVjdG9yIGFyZ3VtZW50cyBvciByZXN1bHRzIGFyZSB1c2VkLgorICoKKyAqIEFuZCBFTEYgZm9yIHRoZSBBUk0gQXJjaGl0ZWN0dXJlIChBUk0gSUhJIDAwNDRFKSAoVGFibGUgNC0yKSBzYXlzOgorICoKKyAqCUlmIGJvdGggRUZfQVJNX0FCSV9GTE9BVF9YWFhYIGJpdHMgYXJlIGNsZWFyLCBjb25mb3JtYW5jZSB0byB0aGUKKyAqCWJhc2UgcHJvY2VkdXJlLWNhbGwgc3RhbmRhcmQgaXMgaW1wbGllZC4KKyAqCisgKiBUaGUgVkRTTyBpcyBidWlsdCB3aXRoIC1tc29mdC1mbG9hdCwgYXMgd2l0aCB0aGUgcmVzdCBvZiB0aGUgQVJNCisgKiBrZXJuZWwsIGFuZCB1c2VzIG5vIGZsb2F0aW5nIHBvaW50IGFyZ3VtZW50cyBvciByZXN1bHRzLiAgVGhlIGJ1aWxkCisgKiBwcm9jZXNzIHdpbGwgcHJvZHVjZSBhIHNoYXJlZCBvYmplY3QgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIHRoZQorICogRUZfQVJNX0FCSV9GTE9BVF9TT0ZUIGZsYWcgc2V0IChpdCBzZWVtcyB0byBkZXBlbmQgb24gdGhlIGJpbnV0aWxzCisgKiB2ZXJzaW9uOyBiaW51dGlscyBzdGFydGluZyB3aXRoIDIuMjQgYXBwZWFycyB0byBzZXQgaXQpLiAgVGhlCisgKiBFRl9BUk1fQUJJX0ZMT0FUX0hBUkQgZmxhZyBzaG91bGQgZGVmaW5pdGVseSBub3QgYmUgc2V0LCBhbmQgdGhpcworICogcHJvZ3JhbSB3aWxsIGVycm9yIG91dCBpZiBpdCBpcy4KKyAqCisgKiBJZiB0aGUgc29mdC1mbG9hdCBmbGFnIGlzIHNldCwgdGhpcyBwcm9ncmFtIGNsZWFycyBpdC4gIFRoYXQncyBhbGwKKyAqIGl0IGRvZXMuCisgKi8KKworI2RlZmluZSBfR05VX1NPVVJDRQorCisjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGVycm9yLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZiBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0xJVFRMRV9FTkRJQU5fXworI2RlZmluZSBIT1NUX09SREVSIEVMRkRBVEEyTFNCCisjZWxpZiBfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0JJR19FTkRJQU5fXworI2RlZmluZSBIT1NUX09SREVSIEVMRkRBVEEyTVNCCisjZW5kaWYKKworLyogU29tZSBvZiB0aGUgRUxGIGNvbnN0YW50cyB3ZSdkIGxpa2UgdG8gdXNlIHdlcmUgYWRkZWQgdG8gPGVsZi5oPgorICogcmVsYXRpdmVseSByZWNlbnRseS4KKyAqLworI2lmbmRlZiBFRl9BUk1fRUFCSV9WRVI1CisjZGVmaW5lIEVGX0FSTV9FQUJJX1ZFUjUgMHgwNTAwMDAwMAorI2VuZGlmCisKKyNpZm5kZWYgRUZfQVJNX0FCSV9GTE9BVF9TT0ZUCisjZGVmaW5lIEVGX0FSTV9BQklfRkxPQVRfU09GVCAweDIwMAorI2VuZGlmCisKKyNpZm5kZWYgRUZfQVJNX0FCSV9GTE9BVF9IQVJECisjZGVmaW5lIEVGX0FSTV9BQklfRkxPQVRfSEFSRCAweDQwMAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICpvdXRmaWxlOworCitzdGF0aWMgdm9pZCBjbGVhbnVwKHZvaWQpCit7CisJaWYgKGVycm9yX21lc3NhZ2VfY291bnQgPiAwICYmIG91dGZpbGUgIT0gTlVMTCkKKwkJdW5saW5rKG91dGZpbGUpOworfQorCitzdGF0aWMgRWxmMzJfV29yZCByZWFkX2VsZl93b3JkKEVsZjMyX1dvcmQgd29yZCwgYm9vbCBzd2FwKQoreworCXJldHVybiBzd2FwID8gYnN3YXBfMzIod29yZCkgOiB3b3JkOworfQorCitzdGF0aWMgRWxmMzJfSGFsZiByZWFkX2VsZl9oYWxmKEVsZjMyX0hhbGYgaGFsZiwgYm9vbCBzd2FwKQoreworCXJldHVybiBzd2FwID8gYnN3YXBfMTYoaGFsZikgOiBoYWxmOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9lbGZfd29yZChFbGYzMl9Xb3JkIHZhbCwgRWxmMzJfV29yZCAqZHN0LCBib29sIHN3YXApCit7CisJKmRzdCA9IHN3YXAgPyBic3dhcF8zMih2YWwpIDogdmFsOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgRWxmMzJfRWhkciAqaW5oZHI7CisJYm9vbCBjbGVhcl9zb2Z0X2Zsb2F0OworCWNvbnN0IGNoYXIgKmluZmlsZTsKKwlFbGYzMl9Xb3JkIGVfZmxhZ3M7CisJY29uc3Qgdm9pZCAqaW5idWY7CisJc3RydWN0IHN0YXQgc3RhdDsKKwl2b2lkICpvdXRidWY7CisJYm9vbCBzd2FwOworCWludCBvdXRmZDsKKwlpbnQgaW5mZDsKKworCWF0ZXhpdChjbGVhbnVwKTsKKworCWlmIChhcmdjICE9IDMpCisJCWVycm9yKEVYSVRfRkFJTFVSRSwgMCwgIlVzYWdlOiAlcyBbaW5maWxlXSBbb3V0ZmlsZV0iLCBhcmd2WzBdKTsKKworCWluZmlsZSA9IGFyZ3ZbMV07CisJb3V0ZmlsZSA9IGFyZ3ZbMl07CisKKwlpbmZkID0gb3BlbihpbmZpbGUsIE9fUkRPTkxZKTsKKwlpZiAoaW5mZCA8IDApCisJCWVycm9yKEVYSVRfRkFJTFVSRSwgZXJybm8sICJDYW5ub3Qgb3BlbiAlcyIsIGluZmlsZSk7CisKKwlpZiAoZnN0YXQoaW5mZCwgJnN0YXQpICE9IDApCisJCWVycm9yKEVYSVRfRkFJTFVSRSwgZXJybm8sICJGYWlsZWQgc3RhdCBmb3IgJXMiLCBpbmZpbGUpOworCisJaW5idWYgPSBtbWFwKE5VTEwsIHN0YXQuc3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgaW5mZCwgMCk7CisJaWYgKGluYnVmID09IE1BUF9GQUlMRUQpCisJCWVycm9yKEVYSVRfRkFJTFVSRSwgZXJybm8sICJGYWlsZWQgdG8gbWFwICVzIiwgaW5maWxlKTsKKworCWNsb3NlKGluZmQpOworCisJaW5oZHIgPSBpbmJ1ZjsKKworCWlmIChtZW1jbXAoJmluaGRyLT5lX2lkZW50LCBFTEZNQUcsIFNFTEZNQUcpICE9IDApCisJCWVycm9yKEVYSVRfRkFJTFVSRSwgMCwgIk5vdCBhbiBFTEYgZmlsZSIpOworCisJaWYgKGluaGRyLT5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTUzMyKQorCQllcnJvcihFWElUX0ZBSUxVUkUsIDAsICJVbnN1cHBvcnRlZCBFTEYgY2xhc3MiKTsKKworCXN3YXAgPSBpbmhkci0+ZV9pZGVudFtFSV9EQVRBXSAhPSBIT1NUX09SREVSOworCisJaWYgKHJlYWRfZWxmX2hhbGYoaW5oZHItPmVfdHlwZSwgc3dhcCkgIT0gRVRfRFlOKQorCQllcnJvcihFWElUX0ZBSUxVUkUsIDAsICJOb3QgYSBzaGFyZWQgb2JqZWN0Iik7CisKKwlpZiAocmVhZF9lbGZfaGFsZihpbmhkci0+ZV9tYWNoaW5lLCBzd2FwKSAhPSBFTV9BUk0pIHsKKwkJZXJyb3IoRVhJVF9GQUlMVVJFLCAwLCAiVW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlICUjeCIsCisJCSAgICAgIGluaGRyLT5lX21hY2hpbmUpOworCX0KKworCWVfZmxhZ3MgPSByZWFkX2VsZl93b3JkKGluaGRyLT5lX2ZsYWdzLCBzd2FwKTsKKworCWlmIChFRl9BUk1fRUFCSV9WRVJTSU9OKGVfZmxhZ3MpICE9IEVGX0FSTV9FQUJJX1ZFUjUpIHsKKwkJZXJyb3IoRVhJVF9GQUlMVVJFLCAwLCAiVW5zdXBwb3J0ZWQgRUFCSSB2ZXJzaW9uICUjeCIsCisJCSAgICAgIEVGX0FSTV9FQUJJX1ZFUlNJT04oZV9mbGFncykpOworCX0KKworCWlmIChlX2ZsYWdzICYgRUZfQVJNX0FCSV9GTE9BVF9IQVJEKQorCQllcnJvcihFWElUX0ZBSUxVUkUsIDAsCisJCSAgICAgICJVbmV4cGVjdGVkIGhhcmQtZmxvYXQgZmxhZyBzZXQgaW4gZV9mbGFncyIpOworCisJY2xlYXJfc29mdF9mbG9hdCA9ICEhKGVfZmxhZ3MgJiBFRl9BUk1fQUJJX0ZMT0FUX1NPRlQpOworCisJb3V0ZmQgPSBvcGVuKG91dGZpbGUsIE9fUkRXUiB8IE9fQ1JFQVQgfCBPX1RSVU5DLCBTX0lSVVNSIHwgU19JV1VTUik7CisJaWYgKG91dGZkIDwgMCkKKwkJZXJyb3IoRVhJVF9GQUlMVVJFLCBlcnJubywgIkNhbm5vdCBvcGVuICVzIiwgb3V0ZmlsZSk7CisKKwlpZiAoZnRydW5jYXRlKG91dGZkLCBzdGF0LnN0X3NpemUpICE9IDApCisJCWVycm9yKEVYSVRfRkFJTFVSRSwgZXJybm8sICJDYW5ub3QgdHJ1bmNhdGUgJXMiLCBvdXRmaWxlKTsKKworCW91dGJ1ZiA9IG1tYXAoTlVMTCwgc3RhdC5zdF9zaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELAorCQkgICAgICBvdXRmZCwgMCk7CisJaWYgKG91dGJ1ZiA9PSBNQVBfRkFJTEVEKQorCQllcnJvcihFWElUX0ZBSUxVUkUsIGVycm5vLCAiRmFpbGVkIHRvIG1hcCAlcyIsIG91dGZpbGUpOworCisJY2xvc2Uob3V0ZmQpOworCisJbWVtY3B5KG91dGJ1ZiwgaW5idWYsIHN0YXQuc3Rfc2l6ZSk7CisKKwlpZiAoY2xlYXJfc29mdF9mbG9hdCkgeworCQlFbGYzMl9FaGRyICpvdXRoZHI7CisKKwkJb3V0aGRyID0gb3V0YnVmOworCQllX2ZsYWdzICY9IH5FRl9BUk1fQUJJX0ZMT0FUX1NPRlQ7CisJCXdyaXRlX2VsZl93b3JkKGVfZmxhZ3MsICZvdXRoZHItPmVfZmxhZ3MsIHN3YXApOworCX0KKworCWlmIChtc3luYyhvdXRidWYsIHN0YXQuc3Rfc2l6ZSwgTVNfU1lOQykgIT0gMCkKKwkJZXJyb3IoRVhJVF9GQUlMVVJFLCBlcnJubywgIkZhaWxlZCB0byBzeW5jICVzIiwgb3V0ZmlsZSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vdmRzby92Z2V0dGltZW9mZGF5LmMgYi9hcmNoL2FybS92ZHNvL3ZnZXR0aW1lb2ZkYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTIxNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vdmRzby92Z2V0dGltZW9mZGF5LmMKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBNZW50b3IgR3JhcGhpY3MgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlCisgKiBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8YXNtL2FyY2hfdGltZXIuaD4KKyNpbmNsdWRlIDxhc20vYmFycmllci5oPgorI2luY2x1ZGUgPGFzbS9idWcuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxhc20vdmRzb19kYXRhcGFnZS5oPgorCisjaWZuZGVmIENPTkZJR19BRUFCSQorI2Vycm9yIFRoaXMgY29kZSBkZXBlbmRzIG9uIEFFQUJJIHN5c3RlbSBjYWxsIGNvbnZlbnRpb25zCisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCB2ZHNvX2RhdGEgKl9fZ2V0X2RhdGFwYWdlKHZvaWQpOworCitzdGF0aWMgbm90cmFjZSB1MzIgX192ZHNvX3JlYWRfYmVnaW4oY29uc3Qgc3RydWN0IHZkc29fZGF0YSAqdmRhdGEpCit7CisJdTMyIHNlcTsKK3JlcGVhdDoKKwlzZXEgPSBBQ0NFU1NfT05DRSh2ZGF0YS0+c2VxX2NvdW50KTsKKwlpZiAoc2VxICYgMSkgeworCQljcHVfcmVsYXgoKTsKKwkJZ290byByZXBlYXQ7CisJfQorCXJldHVybiBzZXE7Cit9CisKK3N0YXRpYyBub3RyYWNlIHUzMiB2ZHNvX3JlYWRfYmVnaW4oY29uc3Qgc3RydWN0IHZkc29fZGF0YSAqdmRhdGEpCit7CisJdTMyIHNlcTsKKworCXNlcSA9IF9fdmRzb19yZWFkX2JlZ2luKHZkYXRhKTsKKworCXNtcF9ybWIoKTsgLyogUGFpcnMgd2l0aCBzbXBfd21iIGluIHZkc29fd3JpdGVfZW5kICovCisJcmV0dXJuIHNlcTsKK30KKworc3RhdGljIG5vdHJhY2UgaW50IHZkc29fcmVhZF9yZXRyeShjb25zdCBzdHJ1Y3QgdmRzb19kYXRhICp2ZGF0YSwgdTMyIHN0YXJ0KQoreworCXNtcF9ybWIoKTsgLyogUGFpcnMgd2l0aCBzbXBfd21iIGluIHZkc29fd3JpdGVfYmVnaW4gKi8KKwlyZXR1cm4gdmRhdGEtPnNlcV9jb3VudCAhPSBzdGFydDsKK30KKworc3RhdGljIG5vdHJhY2UgbG9uZyBjbG9ja19nZXR0aW1lX2ZhbGxiYWNrKGNsb2NraWRfdCBfY2xraWQsCisJCQkJCSAgIHN0cnVjdCB0aW1lc3BlYyAqX3RzKQoreworCXJlZ2lzdGVyIHN0cnVjdCB0aW1lc3BlYyAqdHMgYXNtKCJyMSIpID0gX3RzOworCXJlZ2lzdGVyIGNsb2NraWRfdCBjbGtpZCBhc20oInIwIikgPSBfY2xraWQ7CisJcmVnaXN0ZXIgbG9uZyByZXQgYXNtICgicjAiKTsKKwlyZWdpc3RlciBsb25nIG5yIGFzbSgicjciKSA9IF9fTlJfY2xvY2tfZ2V0dGltZTsKKworCWFzbSB2b2xhdGlsZSgKKwkiCXN3aSAjMFxuIgorCTogIj1yIiAocmV0KQorCTogInIiIChjbGtpZCksICJyIiAodHMpLCAiciIgKG5yKQorCTogIm1lbW9yeSIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIG5vdHJhY2UgaW50IGRvX3JlYWx0aW1lX2NvYXJzZShzdHJ1Y3QgdGltZXNwZWMgKnRzLAorCQkJCSAgICAgIHN0cnVjdCB2ZHNvX2RhdGEgKnZkYXRhKQoreworCXUzMiBzZXE7CisKKwlkbyB7CisJCXNlcSA9IHZkc29fcmVhZF9iZWdpbih2ZGF0YSk7CisKKwkJdHMtPnR2X3NlYyA9IHZkYXRhLT54dGltZV9jb2Fyc2Vfc2VjOworCQl0cy0+dHZfbnNlYyA9IHZkYXRhLT54dGltZV9jb2Fyc2VfbnNlYzsKKworCX0gd2hpbGUgKHZkc29fcmVhZF9yZXRyeSh2ZGF0YSwgc2VxKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIG5vdHJhY2UgaW50IGRvX21vbm90b25pY19jb2Fyc2Uoc3RydWN0IHRpbWVzcGVjICp0cywKKwkJCQkgICAgICAgc3RydWN0IHZkc29fZGF0YSAqdmRhdGEpCit7CisJc3RydWN0IHRpbWVzcGVjIHRvbW9ubzsKKwl1MzIgc2VxOworCisJZG8geworCQlzZXEgPSB2ZHNvX3JlYWRfYmVnaW4odmRhdGEpOworCisJCXRzLT50dl9zZWMgPSB2ZGF0YS0+eHRpbWVfY29hcnNlX3NlYzsKKwkJdHMtPnR2X25zZWMgPSB2ZGF0YS0+eHRpbWVfY29hcnNlX25zZWM7CisKKwkJdG9tb25vLnR2X3NlYyA9IHZkYXRhLT53dG1fY2xvY2tfc2VjOworCQl0b21vbm8udHZfbnNlYyA9IHZkYXRhLT53dG1fY2xvY2tfbnNlYzsKKworCX0gd2hpbGUgKHZkc29fcmVhZF9yZXRyeSh2ZGF0YSwgc2VxKSk7CisKKwl0cy0+dHZfc2VjICs9IHRvbW9uby50dl9zZWM7CisJdGltZXNwZWNfYWRkX25zKHRzLCB0b21vbm8udHZfbnNlYyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19BUk1fQVJDSF9USU1FUgorCitzdGF0aWMgbm90cmFjZSB1NjQgZ2V0X25zKHN0cnVjdCB2ZHNvX2RhdGEgKnZkYXRhKQoreworCXU2NCBjeWNsZV9kZWx0YTsKKwl1NjQgY3ljbGVfbm93OworCXU2NCBuc2VjOworCisJY3ljbGVfbm93ID0gYXJjaF9jb3VudGVyX2dldF9jbnR2Y3QoKTsKKworCWN5Y2xlX2RlbHRhID0gKGN5Y2xlX25vdyAtIHZkYXRhLT5jc19jeWNsZV9sYXN0KSAmIHZkYXRhLT5jc19tYXNrOworCisJbnNlYyA9IChjeWNsZV9kZWx0YSAqIHZkYXRhLT5jc19tdWx0KSArIHZkYXRhLT54dGltZV9jbG9ja19zbnNlYzsKKwluc2VjID4+PSB2ZGF0YS0+Y3Nfc2hpZnQ7CisKKwlyZXR1cm4gbnNlYzsKK30KKworc3RhdGljIG5vdHJhY2UgaW50IGRvX3JlYWx0aW1lKHN0cnVjdCB0aW1lc3BlYyAqdHMsIHN0cnVjdCB2ZHNvX2RhdGEgKnZkYXRhKQoreworCXU2NCBuc2VjczsKKwl1MzIgc2VxOworCisJZG8geworCQlzZXEgPSB2ZHNvX3JlYWRfYmVnaW4odmRhdGEpOworCisJCWlmICghdmRhdGEtPnRrX2lzX2NudHZjdCkKKwkJCXJldHVybiAtMTsKKworCQl0cy0+dHZfc2VjID0gdmRhdGEtPnh0aW1lX2Nsb2NrX3NlYzsKKwkJbnNlY3MgPSBnZXRfbnModmRhdGEpOworCisJfSB3aGlsZSAodmRzb19yZWFkX3JldHJ5KHZkYXRhLCBzZXEpKTsKKworCXRzLT50dl9uc2VjID0gMDsKKwl0aW1lc3BlY19hZGRfbnModHMsIG5zZWNzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgbm90cmFjZSBpbnQgZG9fbW9ub3RvbmljKHN0cnVjdCB0aW1lc3BlYyAqdHMsIHN0cnVjdCB2ZHNvX2RhdGEgKnZkYXRhKQoreworCXN0cnVjdCB0aW1lc3BlYyB0b21vbm87CisJdTY0IG5zZWNzOworCXUzMiBzZXE7CisKKwlkbyB7CisJCXNlcSA9IHZkc29fcmVhZF9iZWdpbih2ZGF0YSk7CisKKwkJaWYgKCF2ZGF0YS0+dGtfaXNfY250dmN0KQorCQkJcmV0dXJuIC0xOworCisJCXRzLT50dl9zZWMgPSB2ZGF0YS0+eHRpbWVfY2xvY2tfc2VjOworCQluc2VjcyA9IGdldF9ucyh2ZGF0YSk7CisKKwkJdG9tb25vLnR2X3NlYyA9IHZkYXRhLT53dG1fY2xvY2tfc2VjOworCQl0b21vbm8udHZfbnNlYyA9IHZkYXRhLT53dG1fY2xvY2tfbnNlYzsKKworCX0gd2hpbGUgKHZkc29fcmVhZF9yZXRyeSh2ZGF0YSwgc2VxKSk7CisKKwl0cy0+dHZfc2VjICs9IHRvbW9uby50dl9zZWM7CisJdHMtPnR2X25zZWMgPSAwOworCXRpbWVzcGVjX2FkZF9ucyh0cywgbnNlY3MgKyB0b21vbm8udHZfbnNlYyk7CisKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UgLyogQ09ORklHX0FSTV9BUkNIX1RJTUVSICovCisKK3N0YXRpYyBub3RyYWNlIGludCBkb19yZWFsdGltZShzdHJ1Y3QgdGltZXNwZWMgKnRzLCBzdHJ1Y3QgdmRzb19kYXRhICp2ZGF0YSkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBub3RyYWNlIGludCBkb19tb25vdG9uaWMoc3RydWN0IHRpbWVzcGVjICp0cywgc3RydWN0IHZkc29fZGF0YSAqdmRhdGEpCit7CisJcmV0dXJuIC0xOworfQorCisjZW5kaWYgLyogQ09ORklHX0FSTV9BUkNIX1RJTUVSICovCisKK25vdHJhY2UgaW50IF9fdmRzb19jbG9ja19nZXR0aW1lKGNsb2NraWRfdCBjbGtpZCwgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzdHJ1Y3QgdmRzb19kYXRhICp2ZGF0YTsKKwlpbnQgcmV0ID0gLTE7CisKKwl2ZGF0YSA9IF9fZ2V0X2RhdGFwYWdlKCk7CisKKwlzd2l0Y2ggKGNsa2lkKSB7CisJY2FzZSBDTE9DS19SRUFMVElNRV9DT0FSU0U6CisJCXJldCA9IGRvX3JlYWx0aW1lX2NvYXJzZSh0cywgdmRhdGEpOworCQlicmVhazsKKwljYXNlIENMT0NLX01PTk9UT05JQ19DT0FSU0U6CisJCXJldCA9IGRvX21vbm90b25pY19jb2Fyc2UodHMsIHZkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBDTE9DS19SRUFMVElNRToKKwkJcmV0ID0gZG9fcmVhbHRpbWUodHMsIHZkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBDTE9DS19NT05PVE9OSUM6CisJCXJldCA9IGRvX21vbm90b25pYyh0cywgdmRhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAocmV0KQorCQlyZXQgPSBjbG9ja19nZXR0aW1lX2ZhbGxiYWNrKGNsa2lkLCB0cyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbm90cmFjZSBsb25nIGdldHRpbWVvZmRheV9mYWxsYmFjayhzdHJ1Y3QgdGltZXZhbCAqX3R2LAorCQkJCQkgIHN0cnVjdCB0aW1lem9uZSAqX3R6KQoreworCXJlZ2lzdGVyIHN0cnVjdCB0aW1lem9uZSAqdHogYXNtKCJyMSIpID0gX3R6OworCXJlZ2lzdGVyIHN0cnVjdCB0aW1ldmFsICp0diBhc20oInIwIikgPSBfdHY7CisJcmVnaXN0ZXIgbG9uZyByZXQgYXNtICgicjAiKTsKKwlyZWdpc3RlciBsb25nIG5yIGFzbSgicjciKSA9IF9fTlJfZ2V0dGltZW9mZGF5OworCisJYXNtIHZvbGF0aWxlKAorCSIJc3dpICMwXG4iCisJOiAiPXIiIChyZXQpCisJOiAiciIgKHR2KSwgInIiICh0eiksICJyIiAobnIpCisJOiAibWVtb3J5Iik7CisKKwlyZXR1cm4gcmV0OworfQorCitub3RyYWNlIGludCBfX3Zkc29fZ2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICp0diwgc3RydWN0IHRpbWV6b25lICp0eikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHZkc29fZGF0YSAqdmRhdGE7CisJaW50IHJldDsKKworCXZkYXRhID0gX19nZXRfZGF0YXBhZ2UoKTsKKworCXJldCA9IGRvX3JlYWx0aW1lKCZ0cywgdmRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiBnZXR0aW1lb2ZkYXlfZmFsbGJhY2sodHYsIHR6KTsKKworCWlmICh0dikgeworCQl0di0+dHZfc2VjID0gdHMudHZfc2VjOworCQl0di0+dHZfdXNlYyA9IHRzLnR2X25zZWMgLyAxMDAwOworCX0KKwlpZiAodHopIHsKKwkJdHotPnR6X21pbnV0ZXN3ZXN0ID0gdmRhdGEtPnR6X21pbnV0ZXN3ZXN0OworCQl0ei0+dHpfZHN0dGltZSA9IHZkYXRhLT50el9kc3R0aW1lOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIEF2b2lkIHVucmVzb2x2ZWQgcmVmZXJlbmNlcyBlbWl0dGVkIGJ5IEdDQyAqLworCit2b2lkIF9fYWVhYmlfdW53aW5kX2NwcF9wcjAodm9pZCkKK3sKK30KKwordm9pZCBfX2FlYWJpX3Vud2luZF9jcHBfcHIxKHZvaWQpCit7Cit9CisKK3ZvaWQgX19hZWFiaV91bndpbmRfY3BwX3ByMih2b2lkKQoreworfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9LY29uZmlnIGIvYXJjaC9hcm02NC9LY29uZmlnCmluZGV4IDFiOGU5NzMuLjM0ZjQ4N2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvS2NvbmZpZworKysgYi9hcmNoL2FybTY0L0tjb25maWcKQEAgLTEsNyArMSw3IEBACiBjb25maWcgQVJNNjQKIAlkZWZfYm9vbCB5Ci0Jc2VsZWN0IEFSQ0hfQklORk1UX0VMRl9SQU5ET01JWkVfUElFCiAJc2VsZWN0IEFSQ0hfSEFTX0FUT01JQzY0X0RFQ19JRl9QT1NJVElWRQorCXNlbGVjdCBBUkNIX0hBU19FTEZfUkFORE9NSVpFCiAJc2VsZWN0IEFSQ0hfSEFTX0dDT1ZfUFJPRklMRV9BTEwKIAlzZWxlY3QgQVJDSF9IQVNfU0dfQ0hBSU4KIAlzZWxlY3QgQVJDSF9IQVNfVElDS19CUk9BRENBU1QgaWYgR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKQEAgLTE0Myw2ICsxNDMsMTMgQEAKIGNvbmZpZyBGSVhfRUFSTFlDT05fTUVNCiAJZGVmX2Jvb2wgeQogCitjb25maWcgUEdUQUJMRV9MRVZFTFMKKwlpbnQKKwlkZWZhdWx0IDIgaWYgQVJNNjRfNjRLX1BBR0VTICYmIEFSTTY0X1ZBX0JJVFNfNDIKKwlkZWZhdWx0IDMgaWYgQVJNNjRfNjRLX1BBR0VTICYmIEFSTTY0X1ZBX0JJVFNfNDgKKwlkZWZhdWx0IDMgaWYgQVJNNjRfNEtfUEFHRVMgJiYgQVJNNjRfVkFfQklUU18zOQorCWRlZmF1bHQgNCBpZiBBUk02NF80S19QQUdFUyAmJiBBUk02NF9WQV9CSVRTXzQ4CisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiBzb3VyY2UgImtlcm5lbC9LY29uZmlnLmZyZWV6ZXIiCkBAIC00MTMsMTMgKzQyMCw2IEBACiAJZGVmYXVsdCA0MiBpZiBBUk02NF9WQV9CSVRTXzQyCiAJZGVmYXVsdCA0OCBpZiBBUk02NF9WQV9CSVRTXzQ4CiAKLWNvbmZpZyBBUk02NF9QR1RBQkxFX0xFVkVMUwotCWludAotCWRlZmF1bHQgMiBpZiBBUk02NF82NEtfUEFHRVMgJiYgQVJNNjRfVkFfQklUU180MgotCWRlZmF1bHQgMyBpZiBBUk02NF82NEtfUEFHRVMgJiYgQVJNNjRfVkFfQklUU180OAotCWRlZmF1bHQgMyBpZiBBUk02NF80S19QQUdFUyAmJiBBUk02NF9WQV9CSVRTXzM5Ci0JZGVmYXVsdCA0IGlmIEFSTTY0XzRLX1BBR0VTICYmIEFSTTY0X1ZBX0JJVFNfNDgKLQogY29uZmlnIENQVV9CSUdfRU5ESUFOCiAgICAgICAgYm9vbCAiQnVpbGQgYmlnLWVuZGlhbiBrZXJuZWwiCiAgICAgICAgaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9ib290L2R0cy9hcG0vYXBtLW11c3RhbmcuZHRzIGIvYXJjaC9hcm02NC9ib290L2R0cy9hcG0vYXBtLW11c3RhbmcuZHRzCmluZGV4IDJlMjVkZTAuLjgzNTc4ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1tdXN0YW5nLmR0cworKysgYi9hcmNoL2FybTY0L2Jvb3QvZHRzL2FwbS9hcG0tbXVzdGFuZy5kdHMKQEAgLTQ1LDYgKzQ1LDEwIEBACiAJc3RhdHVzID0gIm9rIjsKIH07CiAKKyZzZ2VuZXQxIHsKKwlzdGF0dXMgPSAib2siOworfTsKKwogJnhnZW5ldCB7CiAJc3RhdHVzID0gIm9rIjsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FwbS9hcG0tc3Rvcm0uZHRzaSBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1zdG9ybS5kdHNpCmluZGV4IGE4NTc3OTQuLmU3NGY2ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1zdG9ybS5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXBtL2FwbS1zdG9ybS5kdHNpCkBAIC0xODYsNiArMTg2LDE2IEBACiAJCQkJY2xvY2stb3V0cHV0LW5hbWVzID0gInNnZTBjbGsiOwogCQkJfTsKIAorCQkJc2dlMWNsazogc2dlMWNsa0AxZjIxYzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtZGV2aWNlLWNsb2NrIjsKKwkJCQkjY2xvY2stY2VsbHMgPSA8MT47CisJCQkJY2xvY2tzID0gPCZzb2NwbGxkaXYyIDA+OworCQkJCXJlZyA9IDwweDAgMHgxZjIxYzAwMCAweDAgMHgxMDAwPjsKKwkJCQlyZWctbmFtZXMgPSAiY3NyLXJlZyI7CisJCQkJY3NyLW1hc2sgPSA8MHhjPjsKKwkJCQljbG9jay1vdXRwdXQtbmFtZXMgPSAic2dlMWNsayI7CisJCQl9OworCiAJCQl4Z2UwY2xrOiB4Z2UwY2xrQDFmNjFjMDAwIHsKIAkJCQljb21wYXRpYmxlID0gImFwbSx4Z2VuZS1kZXZpY2UtY2xvY2siOwogCQkJCSNjbG9jay1jZWxscyA9IDwxPjsKQEAgLTYyOCwxMyArNjM4LDMwIEBACiAJCQkgICAgICA8MHgwIDB4MWYyMDAwMDAgMHgwIDBYYzMwMD4sCiAJCQkgICAgICA8MHgwIDB4MUIwMDAwMDAgMHgwIDBYMjAwPjsKIAkJCXJlZy1uYW1lcyA9ICJlbmV0X2NzciIsICJyaW5nX2NzciIsICJyaW5nX2NtZCI7Ci0JCQlpbnRlcnJ1cHRzID0gPDB4MCAweEEwIDB4ND47CisJCQlpbnRlcnJ1cHRzID0gPDB4MCAweEEwIDB4ND4sCisJCQkJICAgICA8MHgwIDB4QTEgMHg0PjsKIAkJCWRtYS1jb2hlcmVudDsKIAkJCWNsb2NrcyA9IDwmc2dlMGNsayAwPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWzAwIDAwIDAwIDAwIDAwIDAwXTsKIAkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAic2dtaWkiOwogCQl9OwogCisJCXNnZW5ldDE6IGV0aGVybmV0QDFmMjEwMDMwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lMS1zZ2VuZXQiOworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCXJlZyA9IDwweDAgMHgxZjIxMDAzMCAweDAgMHhkMTAwPiwKKwkJCSAgICAgIDwweDAgMHgxZjIwMDAwMCAweDAgMFhjMzAwPiwKKwkJCSAgICAgIDwweDAgMHgxQjAwMDAwMCAweDAgMFg4MDAwPjsKKwkJCXJlZy1uYW1lcyA9ICJlbmV0X2NzciIsICJyaW5nX2NzciIsICJyaW5nX2NtZCI7CisJCQlpbnRlcnJ1cHRzID0gPDB4MCAweEFDIDB4ND4sCisJCQkJICAgICA8MHgwIDB4QUQgMHg0PjsKKwkJCXBvcnQtaWQgPSA8MT47CisJCQlkbWEtY29oZXJlbnQ7CisJCQljbG9ja3MgPSA8JnNnZTFjbGsgMD47CisJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFswMCAwMCAwMCAwMCAwMCAwMF07CisJCQlwaHktY29ubmVjdGlvbi10eXBlID0gInNnbWlpIjsKKwkJfTsKKwogCQl4Z2VuZXQ6IGV0aGVybmV0QDFmNjEwMDAwIHsKIAkJCWNvbXBhdGlibGUgPSAiYXBtLHhnZW5lMS14Z2VuZXQiOwogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKQEAgLTY0Miw3ICs2NjksOCBAQAogCQkJICAgICAgPDB4MCAweDFmNjAwMDAwIDB4MCAwWGMzMDA+LAogCQkJICAgICAgPDB4MCAweDE4MDAwMDAwIDB4MCAwWDIwMD47CiAJCQlyZWctbmFtZXMgPSAiZW5ldF9jc3IiLCAicmluZ19jc3IiLCAicmluZ19jbWQiOwotCQkJaW50ZXJydXB0cyA9IDwweDAgMHg2MCAweDQ+OworCQkJaW50ZXJydXB0cyA9IDwweDAgMHg2MCAweDQ+LAorCQkJCSAgICAgPDB4MCAweDYxIDB4ND47CiAJCQlkbWEtY29oZXJlbnQ7CiAJCQljbG9ja3MgPSA8JnhnZTBjbGsgMD47CiAJCQkvKiBtYWMgYWRkcmVzcyB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IHRoZSBib290bG9hZGVyICovCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FybS9qdW5vLWNsb2Nrcy5kdHNpIGIvYXJjaC9hcm02NC9ib290L2R0cy9hcm0vanVuby1jbG9ja3MuZHRzaQppbmRleCBlYTJiNTY2Li5jOWI4OWVmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2Jvb3QvZHRzL2FybS9qdW5vLWNsb2Nrcy5kdHNpCisrKyBiL2FyY2gvYXJtNjQvYm9vdC9kdHMvYXJtL2p1bm8tY2xvY2tzLmR0c2kKQEAgLTgsNyArOCw3IEBACiAgKi8KIAogCS8qIFNvQyBmaXhlZCBjbG9ja3MgKi8KLQlzb2NfdWFydGNsazogcmVmY2xrNzI3MzhraHogeworCXNvY191YXJ0Y2xrOiByZWZjbGs3MjczODAwaHogewogCQljb21wYXRpYmxlID0gImZpeGVkLWNsb2NrIjsKIAkJI2Nsb2NrLWNlbGxzID0gPDA+OwogCQljbG9jay1mcmVxdWVuY3kgPSA8NzI3MzgwMD47CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2NvbmZpZ3MvZGVmY29uZmlnIGIvYXJjaC9hcm02NC9jb25maWdzL2RlZmNvbmZpZwppbmRleCBiZTFmMTJhLi5hZjZhNDUyIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2NvbmZpZ3MvZGVmY29uZmlnCisrKyBiL2FyY2gvYXJtNjQvY29uZmlncy9kZWZjb25maWcKQEAgLTQ4LDcgKzQ4LDcgQEAKICMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKIENPTkZJR19DT01QQVQ9eQogQ09ORklHX0NQVV9JRExFPXkKLUNPTkZJR19BUk02NF9DUFVJRExFPXkKK0NPTkZJR19BUk1fQ1BVSURMRT15CiBDT05GSUdfTkVUPXkKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1VOSVg9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9jcnlwdG8vYWVzLWdsdWUuYyBiL2FyY2gvYXJtNjQvY3J5cHRvL2Flcy1nbHVlLmMKaW5kZXggYjFiNWI4OS4uMDVkOWUxNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9jcnlwdG8vYWVzLWdsdWUuYworKysgYi9hcmNoL2FybTY0L2NyeXB0by9hZXMtZ2x1ZS5jCkBAIC0yODQsNyArMjg0LDggQEAKIAkuY3JhX25hbWUJCT0gIl9fZWNiLWFlcy0iIE1PREUsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1lY2ItYWVzLSIgTU9ERSwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IEFFU19CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IGNyeXB0b19hZXNfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSA3LApAQCAtMzAyLDcgKzMwMyw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX2NiYy1hZXMtIiBNT0RFLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY2JjLWFlcy0iIE1PREUsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjcnlwdG9fYWVzX2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gNywKQEAgLTMyMCw3ICszMjIsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19jdHItYWVzLSIgTU9ERSwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWN0ci1hZXMtIiBNT0RFLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gMSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjcnlwdG9fYWVzX2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gNywKQEAgLTMzOCw3ICszNDEsOCBAQAogCS5jcmFfbmFtZQkJPSAiX194dHMtYWVzLSIgTU9ERSwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLXh0cy1hZXMtIiBNT0RFLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gQUVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgY3J5cHRvX2Flc194dHNfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSA3LApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9jcnlwdG8vc2hhMS1jZS1jb3JlLlMgYi9hcmNoL2FybTY0L2NyeXB0by9zaGExLWNlLWNvcmUuUwppbmRleCAwOWQ1N2Q5Li4wMzNhYWU2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2NyeXB0by9zaGExLWNlLWNvcmUuUworKysgYi9hcmNoL2FybTY0L2NyeXB0by9zaGExLWNlLWNvcmUuUwpAQCAtNjYsOCArNjYsOCBAQAogCS53b3JkCQkweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjLCAweGNhNjJjMWQ2CiAKIAkvKgotCSAqIHZvaWQgc2hhMV9jZV90cmFuc2Zvcm0oaW50IGJsb2NrcywgdTggY29uc3QgKnNyYywgdTMyICpzdGF0ZSwKLQkgKiAJCQkgIHU4ICpoZWFkLCBsb25nIGJ5dGVzKQorCSAqIHZvaWQgc2hhMV9jZV90cmFuc2Zvcm0oc3RydWN0IHNoYTFfY2Vfc3RhdGUgKnNzdCwgdTggY29uc3QgKnNyYywKKwkgKgkJCSAgaW50IGJsb2NrcykKIAkgKi8KIEVOVFJZKHNoYTFfY2VfdHJhbnNmb3JtKQogCS8qIGxvYWQgcm91bmQgY29uc3RhbnRzICovCkBAIC03OCwyNSArNzgsMjIgQEAKIAlsZDFyCQl7azMuNHN9LCBbeDZdCiAKIAkvKiBsb2FkIHN0YXRlICovCi0JbGRyCQlkZ2EsIFt4Ml0KLQlsZHIJCWRnYiwgW3gyLCAjMTZdCisJbGRyCQlkZ2EsIFt4MF0KKwlsZHIJCWRnYiwgW3gwLCAjMTZdCiAKLQkvKiBsb2FkIHBhcnRpYWwgc3RhdGUgKGlmIHN1cHBsaWVkKSAqLwotCWNiegkJeDMsIDBmCi0JbGQxCQl7djguNHMtdjExLjRzfSwgW3gzXQotCWIJCTFmCisJLyogbG9hZCBzaGExX2NlX3N0YXRlOjpmaW5hbGl6ZSAqLworCWxkcgkJdzQsIFt4MCwgIzpsbzEyOnNoYTFfY2Vfb2Zmc2V0b2ZfZmluYWxpemVdCiAKIAkvKiBsb2FkIGlucHV0ICovCiAwOglsZDEJCXt2OC40cy12MTEuNHN9LCBbeDFdLCAjNjQKLQlzdWIJCXcwLCB3MCwgIzEKKwlzdWIJCXcyLCB3MiwgIzEKIAotMToKIENQVV9MRSgJcmV2MzIJCXY4LjE2YiwgdjguMTZiCQkpCiBDUFVfTEUoCXJldjMyCQl2OS4xNmIsIHY5LjE2YgkJKQogQ1BVX0xFKAlyZXYzMgkJdjEwLjE2YiwgdjEwLjE2YgkpCiBDUFVfTEUoCXJldjMyCQl2MTEuMTZiLCB2MTEuMTZiCSkKIAotMjoJYWRkCQl0MC40cywgdjguNHMsIGswLjRzCisxOglhZGQJCXQwLjRzLCB2OC40cywgazAuNHMKIAltb3YJCWRnMHYuMTZiLCBkZ2F2LjE2YgogCiAJYWRkX3VwZGF0ZQljLCBldiwgazAsICA4LCAgOSwgMTAsIDExLCBkZ2IKQEAgLTEyNywxNSArMTI0LDE1IEBACiAJYWRkCQlkZ2J2LjJzLCBkZ2J2LjJzLCBkZzF2LjJzCiAJYWRkCQlkZ2F2LjRzLCBkZ2F2LjRzLCBkZzB2LjRzCiAKLQljYm56CQl3MCwgMGIKKwljYm56CQl3MiwgMGIKIAogCS8qCiAJICogRmluYWwgYmxvY2s6IGFkZCBwYWRkaW5nIGFuZCB0b3RhbCBiaXQgY291bnQuCi0JICogU2tpcCBpZiB3ZSBoYXZlIG5vIHRvdGFsIGJ5dGUgY291bnQgaW4geDQuIEluIHRoYXQgY2FzZSwgdGhlIGlucHV0Ci0JICogc2l6ZSB3YXMgbm90IGEgcm91bmQgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUsIGFuZCB0aGUgcGFkZGluZyBpcwotCSAqIGhhbmRsZWQgYnkgdGhlIEMgY29kZS4KKwkgKiBTa2lwIGlmIHRoZSBpbnB1dCBzaXplIHdhcyBub3QgYSByb3VuZCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZSwKKwkgKiB0aGUgcGFkZGluZyBpcyBoYW5kbGVkIGJ5IHRoZSBDIGNvZGUgaW4gdGhhdCBjYXNlLgogCSAqLwogCWNiegkJeDQsIDNmCisJbGRyCQl4NCwgW3gwLCAjOmxvMTI6c2hhMV9jZV9vZmZzZXRvZl9jb3VudF0KIAltb3ZpCQl2OS4yZCwgIzAKIAltb3YJCXg4LCAjMHg4MDAwMDAwMAogCW1vdmkJCXYxMC4yZCwgIzAKQEAgLTE0NCwxMCArMTQxLDEwIEBACiAJbW92CQl4NCwgIzAKIAltb3YJCXYxMS5kWzBdLCB4enIKIAltb3YJCXYxMS5kWzFdLCB4NwotCWIJCTJiCisJYgkJMWIKIAogCS8qIHN0b3JlIG5ldyBzdGF0ZSAqLwotMzoJc3RyCQlkZ2EsIFt4Ml0KLQlzdHIJCWRnYiwgW3gyLCAjMTZdCiszOglzdHIJCWRnYSwgW3gwXQorCXN0cgkJZGdiLCBbeDAsICMxNl0KIAlyZXQKIEVORFBST0Moc2hhMV9jZV90cmFuc2Zvcm0pCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2NyeXB0by9zaGExLWNlLWdsdWUuYyBiL2FyY2gvYXJtNjQvY3J5cHRvL3NoYTEtY2UtZ2x1ZS5jCmluZGV4IDZmZTgzZjMuLjExNGU3Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvY3J5cHRvL3NoYTEtY2UtZ2x1ZS5jCisrKyBiL2FyY2gvYXJtNjQvY3J5cHRvL3NoYTEtY2UtZ2x1ZS5jCkBAIC0xMiwxNDQgKzEyLDgxIEBACiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgorI2luY2x1ZGUgPGNyeXB0by9zaGExX2Jhc2UuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmZWF0dXJlLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKKyNkZWZpbmUgQVNNX0VYUE9SVChzeW0sIHZhbCkgXAorCWFzbSgiLmdsb2JsICIgI3N5bSAiOyAuc2V0ICIgI3N5bSAiLCAlMCIgOjogIkkiKHZhbCkpOworCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNIQTEgc2VjdXJlIGhhc2ggdXNpbmcgQVJNdjggQ3J5cHRvIEV4dGVuc2lvbnMiKTsKIE1PRFVMRV9BVVRIT1IoIkFyZCBCaWVzaGV1dmVsIDxhcmQuYmllc2hldXZlbEBsaW5hcm8ub3JnPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogCi1hc21saW5rYWdlIHZvaWQgc2hhMV9jZV90cmFuc2Zvcm0oaW50IGJsb2NrcywgdTggY29uc3QgKnNyYywgdTMyICpzdGF0ZSwKLQkJCQkgIHU4ICpoZWFkLCBsb25nIGJ5dGVzKTsKK3N0cnVjdCBzaGExX2NlX3N0YXRlIHsKKwlzdHJ1Y3Qgc2hhMV9zdGF0ZQlzc3Q7CisJdTMyCQkJZmluYWxpemU7Cit9OwogCi1zdGF0aWMgaW50IHNoYTFfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKK2FzbWxpbmthZ2Ugdm9pZCBzaGExX2NlX3RyYW5zZm9ybShzdHJ1Y3Qgc2hhMV9jZV9zdGF0ZSAqc3N0LCB1OCBjb25zdCAqc3JjLAorCQkJCSAgaW50IGJsb2Nrcyk7CisKK3N0YXRpYyBpbnQgc2hhMV9jZV91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJICB1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisJc3RydWN0IHNoYTFfY2Vfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKIAotCSpzY3R4ID0gKHN0cnVjdCBzaGExX3N0YXRlKXsKLQkJLnN0YXRlID0geyBTSEExX0gwLCBTSEExX0gxLCBTSEExX0gyLCBTSEExX0gzLCBTSEExX0g0IH0sCi0JfTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzaGExX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuKQotewotCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0JdW5zaWduZWQgaW50IHBhcnRpYWwgPSBzY3R4LT5jb3VudCAlIFNIQTFfQkxPQ0tfU0laRTsKLQotCXNjdHgtPmNvdW50ICs9IGxlbjsKLQotCWlmICgocGFydGlhbCArIGxlbikgPj0gU0hBMV9CTE9DS19TSVpFKSB7Ci0JCWludCBibG9ja3M7Ci0KLQkJaWYgKHBhcnRpYWwpIHsKLQkJCWludCBwID0gU0hBMV9CTE9DS19TSVpFIC0gcGFydGlhbDsKLQotCQkJbWVtY3B5KHNjdHgtPmJ1ZmZlciArIHBhcnRpYWwsIGRhdGEsIHApOwotCQkJZGF0YSArPSBwOwotCQkJbGVuIC09IHA7Ci0JCX0KLQotCQlibG9ja3MgPSBsZW4gLyBTSEExX0JMT0NLX1NJWkU7Ci0JCWxlbiAlPSBTSEExX0JMT0NLX1NJWkU7Ci0KLQkJa2VybmVsX25lb25fYmVnaW5fcGFydGlhbCgxNik7Ci0JCXNoYTFfY2VfdHJhbnNmb3JtKGJsb2NrcywgZGF0YSwgc2N0eC0+c3RhdGUsCi0JCQkJICBwYXJ0aWFsID8gc2N0eC0+YnVmZmVyIDogTlVMTCwgMCk7Ci0JCWtlcm5lbF9uZW9uX2VuZCgpOwotCi0JCWRhdGEgKz0gYmxvY2tzICogU0hBMV9CTE9DS19TSVpFOwotCQlwYXJ0aWFsID0gMDsKLQl9Ci0JaWYgKGxlbikKLQkJbWVtY3B5KHNjdHgtPmJ1ZmZlciArIHBhcnRpYWwsIGRhdGEsIGxlbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhMV9maW5hbChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKLXsKLQlzdGF0aWMgY29uc3QgdTggcGFkZGluZ1tTSEExX0JMT0NLX1NJWkVdID0geyAweDgwLCB9OwotCi0Jc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQlfX2JlNjQgYml0cyA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50IDw8IDMpOwotCV9fYmUzMiAqZHN0ID0gKF9fYmUzMiAqKW91dDsKLQlpbnQgaTsKLQotCXUzMiBwYWRsZW4gPSBTSEExX0JMT0NLX1NJWkUKLQkJICAgICAtICgoc2N0eC0+Y291bnQgKyBzaXplb2YoYml0cykpICUgU0hBMV9CTE9DS19TSVpFKTsKLQotCXNoYTFfdXBkYXRlKGRlc2MsIHBhZGRpbmcsIHBhZGxlbik7Ci0Jc2hhMV91cGRhdGUoZGVzYywgKGNvbnN0IHU4ICopJmJpdHMsIHNpemVvZihiaXRzKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgU0hBMV9ESUdFU1RfU0laRSAvIHNpemVvZihfX2JlMzIpOyBpKyspCi0JCXB1dF91bmFsaWduZWRfYmUzMihzY3R4LT5zdGF0ZVtpXSwgZHN0KyspOwotCi0JKnNjdHggPSAoc3RydWN0IHNoYTFfc3RhdGUpe307Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhMV9maW51cChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCi0JCSAgICAgIHVuc2lnbmVkIGludCBsZW4sIHU4ICpvdXQpCi17Ci0Jc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXQ7Ci0JaW50IGJsb2NrczsKLQlpbnQgaTsKLQotCWlmIChzY3R4LT5jb3VudCB8fCAhbGVuIHx8IChsZW4gJSBTSEExX0JMT0NLX1NJWkUpKSB7Ci0JCXNoYTFfdXBkYXRlKGRlc2MsIGRhdGEsIGxlbik7Ci0JCXJldHVybiBzaGExX2ZpbmFsKGRlc2MsIG91dCk7Ci0JfQotCi0JLyoKLQkgKiBVc2UgYSBmYXN0IHBhdGggaWYgdGhlIGlucHV0IGlzIGEgbXVsdGlwbGUgb2YgNjQgYnl0ZXMuIEluCi0JICogdGhpcyBjYXNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGNvcHkgZGF0YSBhcm91bmQsIGFuZCB3ZSBjYW4KLQkgKiBwZXJmb3JtIHRoZSBlbnRpcmUgZGlnZXN0IGNhbGN1bGF0aW9uIGluIGEgc2luZ2xlIGludm9jYXRpb24KLQkgKiBvZiBzaGExX2NlX3RyYW5zZm9ybSgpCi0JICovCi0JYmxvY2tzID0gbGVuIC8gU0hBMV9CTE9DS19TSVpFOwotCisJc2N0eC0+ZmluYWxpemUgPSAwOwogCWtlcm5lbF9uZW9uX2JlZ2luX3BhcnRpYWwoMTYpOwotCXNoYTFfY2VfdHJhbnNmb3JtKGJsb2NrcywgZGF0YSwgc2N0eC0+c3RhdGUsIE5VTEwsIGxlbik7CisJc2hhMV9iYXNlX2RvX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sCisJCQkgICAgKHNoYTFfYmxvY2tfZm4gKilzaGExX2NlX3RyYW5zZm9ybSk7CiAJa2VybmVsX25lb25fZW5kKCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgU0hBMV9ESUdFU1RfU0laRSAvIHNpemVvZihfX2JlMzIpOyBpKyspCi0JCXB1dF91bmFsaWduZWRfYmUzMihzY3R4LT5zdGF0ZVtpXSwgZHN0KyspOwotCi0JKnNjdHggPSAoc3RydWN0IHNoYTFfc3RhdGUpe307CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2hhMV9leHBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHZvaWQgKm91dCkKK3N0YXRpYyBpbnQgc2hhMV9jZV9maW51cChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCisJCQkgdW5zaWduZWQgaW50IGxlbiwgdTggKm91dCkKIHsKLQlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCXN0cnVjdCBzaGExX3N0YXRlICpkc3QgPSBvdXQ7CisJc3RydWN0IHNoYTFfY2Vfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwlib29sIGZpbmFsaXplID0gIXNjdHgtPnNzdC5jb3VudCAmJiAhKGxlbiAlIFNIQTFfQkxPQ0tfU0laRSk7CiAKLQkqZHN0ID0gKnNjdHg7Ci0JcmV0dXJuIDA7CisJQVNNX0VYUE9SVChzaGExX2NlX29mZnNldG9mX2NvdW50LAorCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2hhMV9jZV9zdGF0ZSwgc3N0LmNvdW50KSk7CisJQVNNX0VYUE9SVChzaGExX2NlX29mZnNldG9mX2ZpbmFsaXplLAorCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2hhMV9jZV9zdGF0ZSwgZmluYWxpemUpKTsKKworCS8qCisJICogQWxsb3cgdGhlIGFzbSBjb2RlIHRvIHBlcmZvcm0gdGhlIGZpbmFsaXphdGlvbiBpZiB0aGVyZSBpcyBubworCSAqIHBhcnRpYWwgZGF0YSBhbmQgdGhlIGlucHV0IGlzIGEgcm91bmQgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuCisJICovCisJc2N0eC0+ZmluYWxpemUgPSBmaW5hbGl6ZTsKKworCWtlcm5lbF9uZW9uX2JlZ2luX3BhcnRpYWwoMTYpOworCXNoYTFfYmFzZV9kb191cGRhdGUoZGVzYywgZGF0YSwgbGVuLAorCQkJICAgIChzaGExX2Jsb2NrX2ZuICopc2hhMV9jZV90cmFuc2Zvcm0pOworCWlmICghZmluYWxpemUpCisJCXNoYTFfYmFzZV9kb19maW5hbGl6ZShkZXNjLCAoc2hhMV9ibG9ja19mbiAqKXNoYTFfY2VfdHJhbnNmb3JtKTsKKwlrZXJuZWxfbmVvbl9lbmQoKTsKKwlyZXR1cm4gc2hhMV9iYXNlX2ZpbmlzaChkZXNjLCBvdXQpOwogfQogCi1zdGF0aWMgaW50IHNoYTFfaW1wb3J0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB2b2lkICppbikKK3N0YXRpYyBpbnQgc2hhMV9jZV9maW5hbChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKIHsKLQlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCXN0cnVjdCBzaGExX3N0YXRlIGNvbnN0ICpzcmMgPSBpbjsKLQotCSpzY3R4ID0gKnNyYzsKLQlyZXR1cm4gMDsKKwlrZXJuZWxfbmVvbl9iZWdpbl9wYXJ0aWFsKDE2KTsKKwlzaGExX2Jhc2VfZG9fZmluYWxpemUoZGVzYywgKHNoYTFfYmxvY2tfZm4gKilzaGExX2NlX3RyYW5zZm9ybSk7CisJa2VybmVsX25lb25fZW5kKCk7CisJcmV0dXJuIHNoYTFfYmFzZV9maW5pc2goZGVzYywgb3V0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgYWxnID0gewotCS5pbml0CQkJPSBzaGExX2luaXQsCi0JLnVwZGF0ZQkJCT0gc2hhMV91cGRhdGUsCi0JLmZpbmFsCQkJPSBzaGExX2ZpbmFsLAotCS5maW51cAkJCT0gc2hhMV9maW51cCwKLQkuZXhwb3J0CQkJPSBzaGExX2V4cG9ydCwKLQkuaW1wb3J0CQkJPSBzaGExX2ltcG9ydCwKLQkuZGVzY3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBzaGExX3N0YXRlKSwKKwkuaW5pdAkJCT0gc2hhMV9iYXNlX2luaXQsCisJLnVwZGF0ZQkJCT0gc2hhMV9jZV91cGRhdGUsCisJLmZpbmFsCQkJPSBzaGExX2NlX2ZpbmFsLAorCS5maW51cAkJCT0gc2hhMV9jZV9maW51cCwKKwkuZGVzY3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBzaGExX2NlX3N0YXRlKSwKIAkuZGlnZXN0c2l6ZQkJPSBTSEExX0RJR0VTVF9TSVpFLAotCS5zdGF0ZXNpemUJCT0gc2l6ZW9mKHN0cnVjdCBzaGExX3N0YXRlKSwKIAkuYmFzZQkJCT0gewogCQkuY3JhX25hbWUJCT0gInNoYTEiLAogCQkuY3JhX2RyaXZlcl9uYW1lCT0gInNoYTEtY2UiLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9jcnlwdG8vc2hhMi1jZS1jb3JlLlMgYi9hcmNoL2FybTY0L2NyeXB0by9zaGEyLWNlLWNvcmUuUwppbmRleCA3ZjI5ZmMwLi41ZGY5ZDlkIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2NyeXB0by9zaGEyLWNlLWNvcmUuUworKysgYi9hcmNoL2FybTY0L2NyeXB0by9zaGEyLWNlLWNvcmUuUwpAQCAtNzMsOCArNzMsOCBAQAogCS53b3JkCQkweDkwYmVmZmZhLCAweGE0NTA2Y2ViLCAweGJlZjlhM2Y3LCAweGM2NzE3OGYyCiAKIAkvKgotCSAqIHZvaWQgc2hhMl9jZV90cmFuc2Zvcm0oaW50IGJsb2NrcywgdTggY29uc3QgKnNyYywgdTMyICpzdGF0ZSwKLQkgKiAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpoZWFkLCBsb25nIGJ5dGVzKQorCSAqIHZvaWQgc2hhMl9jZV90cmFuc2Zvcm0oc3RydWN0IHNoYTI1Nl9jZV9zdGF0ZSAqc3N0LCB1OCBjb25zdCAqc3JjLAorCSAqCQkJICBpbnQgYmxvY2tzKQogCSAqLwogRU5UUlkoc2hhMl9jZV90cmFuc2Zvcm0pCiAJLyogbG9hZCByb3VuZCBjb25zdGFudHMgKi8KQEAgLTg1LDI0ICs4NSwyMSBAQAogCWxkMQkJe3YxMi40cy12MTUuNHN9LCBbeDhdCiAKIAkvKiBsb2FkIHN0YXRlICovCi0JbGRwCQlkZ2EsIGRnYiwgW3gyXQorCWxkcAkJZGdhLCBkZ2IsIFt4MF0KIAotCS8qIGxvYWQgcGFydGlhbCBpbnB1dCAoaWYgc3VwcGxpZWQpICovCi0JY2J6CQl4MywgMGYKLQlsZDEJCXt2MTYuNHMtdjE5LjRzfSwgW3gzXQotCWIJCTFmCisJLyogbG9hZCBzaGEyNTZfY2Vfc3RhdGU6OmZpbmFsaXplICovCisJbGRyCQl3NCwgW3gwLCAjOmxvMTI6c2hhMjU2X2NlX29mZnNldG9mX2ZpbmFsaXplXQogCiAJLyogbG9hZCBpbnB1dCAqLwogMDoJbGQxCQl7djE2LjRzLXYxOS40c30sIFt4MV0sICM2NAotCXN1YgkJdzAsIHcwLCAjMQorCXN1YgkJdzIsIHcyLCAjMQogCi0xOgogQ1BVX0xFKAlyZXYzMgkJdjE2LjE2YiwgdjE2LjE2YgkpCiBDUFVfTEUoCXJldjMyCQl2MTcuMTZiLCB2MTcuMTZiCSkKIENQVV9MRSgJcmV2MzIJCXYxOC4xNmIsIHYxOC4xNmIJKQogQ1BVX0xFKAlyZXYzMgkJdjE5LjE2YiwgdjE5LjE2YgkpCiAKLTI6CWFkZAkJdDAuNHMsIHYxNi40cywgdjAuNHMKKzE6CWFkZAkJdDAuNHMsIHYxNi40cywgdjAuNHMKIAltb3YJCWRnMHYuMTZiLCBkZ2F2LjE2YgogCW1vdgkJZGcxdi4xNmIsIGRnYnYuMTZiCiAKQEAgLTEzMSwxNSArMTI4LDE1IEBACiAJYWRkCQlkZ2J2LjRzLCBkZ2J2LjRzLCBkZzF2LjRzCiAKIAkvKiBoYW5kbGVkIGFsbCBpbnB1dCBibG9ja3M/ICovCi0JY2JuegkJdzAsIDBiCisJY2JuegkJdzIsIDBiCiAKIAkvKgogCSAqIEZpbmFsIGJsb2NrOiBhZGQgcGFkZGluZyBhbmQgdG90YWwgYml0IGNvdW50LgotCSAqIFNraXAgaWYgd2UgaGF2ZSBubyB0b3RhbCBieXRlIGNvdW50IGluIHg0LiBJbiB0aGF0IGNhc2UsIHRoZSBpbnB1dAotCSAqIHNpemUgd2FzIG5vdCBhIHJvdW5kIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLCBhbmQgdGhlIHBhZGRpbmcgaXMKLQkgKiBoYW5kbGVkIGJ5IHRoZSBDIGNvZGUuCisJICogU2tpcCBpZiB0aGUgaW5wdXQgc2l6ZSB3YXMgbm90IGEgcm91bmQgbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUsCisJICogdGhlIHBhZGRpbmcgaXMgaGFuZGxlZCBieSB0aGUgQyBjb2RlIGluIHRoYXQgY2FzZS4KIAkgKi8KIAljYnoJCXg0LCAzZgorCWxkcgkJeDQsIFt4MCwgIzpsbzEyOnNoYTI1Nl9jZV9vZmZzZXRvZl9jb3VudF0KIAltb3ZpCQl2MTcuMmQsICMwCiAJbW92CQl4OCwgIzB4ODAwMDAwMDAKIAltb3ZpCQl2MTguMmQsICMwCkBAIC0xNDgsOSArMTQ1LDkgQEAKIAltb3YJCXg0LCAjMAogCW1vdgkJdjE5LmRbMF0sIHh6cgogCW1vdgkJdjE5LmRbMV0sIHg3Ci0JYgkJMmIKKwliCQkxYgogCiAJLyogc3RvcmUgbmV3IHN0YXRlICovCi0zOglzdHAJCWRnYSwgZGdiLCBbeDJdCiszOglzdHAJCWRnYSwgZGdiLCBbeDBdCiAJcmV0CiBFTkRQUk9DKHNoYTJfY2VfdHJhbnNmb3JtKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9jcnlwdG8vc2hhMi1jZS1nbHVlLmMgYi9hcmNoL2FybTY0L2NyeXB0by9zaGEyLWNlLWdsdWUuYwppbmRleCBhZTY3ZTg4Li4xMzQwZTQ0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2NyeXB0by9zaGEyLWNlLWdsdWUuYworKysgYi9hcmNoL2FybTY0L2NyeXB0by9zaGEyLWNlLWdsdWUuYwpAQCAtMTIsMjA2ICsxMiw4MiBAQAogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvaGFzaC5oPgogI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhMjU2X2Jhc2UuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVmZWF0dXJlLmg+CiAjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKKyNkZWZpbmUgQVNNX0VYUE9SVChzeW0sIHZhbCkgXAorCWFzbSgiLmdsb2JsICIgI3N5bSAiOyAuc2V0ICIgI3N5bSAiLCAlMCIgOjogIkkiKHZhbCkpOworCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNIQS0yMjQvU0hBLTI1NiBzZWN1cmUgaGFzaCB1c2luZyBBUk12OCBDcnlwdG8gRXh0ZW5zaW9ucyIpOwogTU9EVUxFX0FVVEhPUigiQXJkIEJpZXNoZXV2ZWwgPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CiAKLWFzbWxpbmthZ2UgaW50IHNoYTJfY2VfdHJhbnNmb3JtKGludCBibG9ja3MsIHU4IGNvbnN0ICpzcmMsIHUzMiAqc3RhdGUsCi0JCQkJIHU4ICpoZWFkLCBsb25nIGJ5dGVzKTsKK3N0cnVjdCBzaGEyNTZfY2Vfc3RhdGUgeworCXN0cnVjdCBzaGEyNTZfc3RhdGUJc3N0OworCXUzMgkJCWZpbmFsaXplOworfTsKIAotc3RhdGljIGludCBzaGEyMjRfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKK2FzbWxpbmthZ2Ugdm9pZCBzaGEyX2NlX3RyYW5zZm9ybShzdHJ1Y3Qgc2hhMjU2X2NlX3N0YXRlICpzc3QsIHU4IGNvbnN0ICpzcmMsCisJCQkJICBpbnQgYmxvY2tzKTsKKworc3RhdGljIGludCBzaGEyNTZfY2VfdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwlzdHJ1Y3Qgc2hhMjU2X2NlX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CiAKLQkqc2N0eCA9IChzdHJ1Y3Qgc2hhMjU2X3N0YXRlKXsKLQkJLnN0YXRlID0gewotCQkJU0hBMjI0X0gwLCBTSEEyMjRfSDEsIFNIQTIyNF9IMiwgU0hBMjI0X0gzLAotCQkJU0hBMjI0X0g0LCBTSEEyMjRfSDUsIFNIQTIyNF9INiwgU0hBMjI0X0g3LAotCQl9Ci0JfTsKKwlzY3R4LT5maW5hbGl6ZSA9IDA7CisJa2VybmVsX25lb25fYmVnaW5fcGFydGlhbCgyOCk7CisJc2hhMjU2X2Jhc2VfZG9fdXBkYXRlKGRlc2MsIGRhdGEsIGxlbiwKKwkJCSAgICAgIChzaGEyNTZfYmxvY2tfZm4gKilzaGEyX2NlX3RyYW5zZm9ybSk7CisJa2VybmVsX25lb25fZW5kKCk7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzaGEyNTZfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKK3N0YXRpYyBpbnQgc2hhMjU2X2NlX2ZpbnVwKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgIHVuc2lnbmVkIGludCBsZW4sIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCXN0cnVjdCBzaGEyNTZfY2Vfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwlib29sIGZpbmFsaXplID0gIXNjdHgtPnNzdC5jb3VudCAmJiAhKGxlbiAlIFNIQTI1Nl9CTE9DS19TSVpFKTsKIAotCSpzY3R4ID0gKHN0cnVjdCBzaGEyNTZfc3RhdGUpewotCQkuc3RhdGUgPSB7Ci0JCQlTSEEyNTZfSDAsIFNIQTI1Nl9IMSwgU0hBMjU2X0gyLCBTSEEyNTZfSDMsCi0JCQlTSEEyNTZfSDQsIFNIQTI1Nl9INSwgU0hBMjU2X0g2LCBTSEEyNTZfSDcsCi0JCX0KLQl9OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNoYTJfdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKLQkJICAgICAgIHVuc2lnbmVkIGludCBsZW4pCi17Ci0Jc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCXVuc2lnbmVkIGludCBwYXJ0aWFsID0gc2N0eC0+Y291bnQgJSBTSEEyNTZfQkxPQ0tfU0laRTsKLQotCXNjdHgtPmNvdW50ICs9IGxlbjsKLQotCWlmICgocGFydGlhbCArIGxlbikgPj0gU0hBMjU2X0JMT0NLX1NJWkUpIHsKLQkJaW50IGJsb2NrczsKLQotCQlpZiAocGFydGlhbCkgewotCQkJaW50IHAgPSBTSEEyNTZfQkxPQ0tfU0laRSAtIHBhcnRpYWw7Ci0KLQkJCW1lbWNweShzY3R4LT5idWYgKyBwYXJ0aWFsLCBkYXRhLCBwKTsKLQkJCWRhdGEgKz0gcDsKLQkJCWxlbiAtPSBwOwotCQl9Ci0KLQkJYmxvY2tzID0gbGVuIC8gU0hBMjU2X0JMT0NLX1NJWkU7Ci0JCWxlbiAlPSBTSEEyNTZfQkxPQ0tfU0laRTsKLQotCQlrZXJuZWxfbmVvbl9iZWdpbl9wYXJ0aWFsKDI4KTsKLQkJc2hhMl9jZV90cmFuc2Zvcm0oYmxvY2tzLCBkYXRhLCBzY3R4LT5zdGF0ZSwKLQkJCQkgIHBhcnRpYWwgPyBzY3R4LT5idWYgOiBOVUxMLCAwKTsKLQkJa2VybmVsX25lb25fZW5kKCk7Ci0KLQkJZGF0YSArPSBibG9ja3MgKiBTSEEyNTZfQkxPQ0tfU0laRTsKLQkJcGFydGlhbCA9IDA7Ci0JfQotCWlmIChsZW4pCi0JCW1lbWNweShzY3R4LT5idWYgKyBwYXJ0aWFsLCBkYXRhLCBsZW4pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzaGEyX2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQotewotCXN0YXRpYyBjb25zdCB1OCBwYWRkaW5nW1NIQTI1Nl9CTE9DS19TSVpFXSA9IHsgMHg4MCwgfTsKLQotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQlfX2JlNjQgYml0cyA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50IDw8IDMpOwotCXUzMiBwYWRsZW4gPSBTSEEyNTZfQkxPQ0tfU0laRQotCQkgICAgIC0gKChzY3R4LT5jb3VudCArIHNpemVvZihiaXRzKSkgJSBTSEEyNTZfQkxPQ0tfU0laRSk7Ci0KLQlzaGEyX3VwZGF0ZShkZXNjLCBwYWRkaW5nLCBwYWRsZW4pOwotCXNoYTJfdXBkYXRlKGRlc2MsIChjb25zdCB1OCAqKSZiaXRzLCBzaXplb2YoYml0cykpOwotfQotCi1zdGF0aWMgaW50IHNoYTIyNF9maW5hbChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKLXsKLQlzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0JX19iZTMyICpkc3QgPSAoX19iZTMyICopb3V0OwotCWludCBpOwotCi0Jc2hhMl9maW5hbChkZXNjKTsKLQotCWZvciAoaSA9IDA7IGkgPCBTSEEyMjRfRElHRVNUX1NJWkUgLyBzaXplb2YoX19iZTMyKTsgaSsrKQotCQlwdXRfdW5hbGlnbmVkX2JlMzIoc2N0eC0+c3RhdGVbaV0sIGRzdCsrKTsKLQotCSpzY3R4ID0gKHN0cnVjdCBzaGEyNTZfc3RhdGUpe307Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhMjU2X2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KQotewotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXQ7Ci0JaW50IGk7Ci0KLQlzaGEyX2ZpbmFsKGRlc2MpOwotCi0JZm9yIChpID0gMDsgaSA8IFNIQTI1Nl9ESUdFU1RfU0laRSAvIHNpemVvZihfX2JlMzIpOyBpKyspCi0JCXB1dF91bmFsaWduZWRfYmUzMihzY3R4LT5zdGF0ZVtpXSwgZHN0KyspOwotCi0JKnNjdHggPSAoc3RydWN0IHNoYTI1Nl9zdGF0ZSl7fTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2hhMl9maW51cChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCi0JCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuKQotewotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQlpbnQgYmxvY2tzOwotCi0JaWYgKHNjdHgtPmNvdW50IHx8ICFsZW4gfHwgKGxlbiAlIFNIQTI1Nl9CTE9DS19TSVpFKSkgewotCQlzaGEyX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4pOwotCQlzaGEyX2ZpbmFsKGRlc2MpOwotCQlyZXR1cm47Ci0JfQorCUFTTV9FWFBPUlQoc2hhMjU2X2NlX29mZnNldG9mX2NvdW50LAorCQkgICBvZmZzZXRvZihzdHJ1Y3Qgc2hhMjU2X2NlX3N0YXRlLCBzc3QuY291bnQpKTsKKwlBU01fRVhQT1JUKHNoYTI1Nl9jZV9vZmZzZXRvZl9maW5hbGl6ZSwKKwkJICAgb2Zmc2V0b2Yoc3RydWN0IHNoYTI1Nl9jZV9zdGF0ZSwgZmluYWxpemUpKTsKIAogCS8qCi0JICogVXNlIGEgZmFzdCBwYXRoIGlmIHRoZSBpbnB1dCBpcyBhIG11bHRpcGxlIG9mIDY0IGJ5dGVzLiBJbgotCSAqIHRoaXMgY2FzZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBjb3B5IGRhdGEgYXJvdW5kLCBhbmQgd2UgY2FuCi0JICogcGVyZm9ybSB0aGUgZW50aXJlIGRpZ2VzdCBjYWxjdWxhdGlvbiBpbiBhIHNpbmdsZSBpbnZvY2F0aW9uCi0JICogb2Ygc2hhMl9jZV90cmFuc2Zvcm0oKQorCSAqIEFsbG93IHRoZSBhc20gY29kZSB0byBwZXJmb3JtIHRoZSBmaW5hbGl6YXRpb24gaWYgdGhlcmUgaXMgbm8KKwkgKiBwYXJ0aWFsIGRhdGEgYW5kIHRoZSBpbnB1dCBpcyBhIHJvdW5kIG11bHRpcGxlIG9mIHRoZSBibG9jayBzaXplLgogCSAqLwotCWJsb2NrcyA9IGxlbiAvIFNIQTI1Nl9CTE9DS19TSVpFOworCXNjdHgtPmZpbmFsaXplID0gZmluYWxpemU7CiAKIAlrZXJuZWxfbmVvbl9iZWdpbl9wYXJ0aWFsKDI4KTsKLQlzaGEyX2NlX3RyYW5zZm9ybShibG9ja3MsIGRhdGEsIHNjdHgtPnN0YXRlLCBOVUxMLCBsZW4pOworCXNoYTI1Nl9iYXNlX2RvX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sCisJCQkgICAgICAoc2hhMjU2X2Jsb2NrX2ZuICopc2hhMl9jZV90cmFuc2Zvcm0pOworCWlmICghZmluYWxpemUpCisJCXNoYTI1Nl9iYXNlX2RvX2ZpbmFsaXplKGRlc2MsCisJCQkJCShzaGEyNTZfYmxvY2tfZm4gKilzaGEyX2NlX3RyYW5zZm9ybSk7CiAJa2VybmVsX25lb25fZW5kKCk7CisJcmV0dXJuIHNoYTI1Nl9iYXNlX2ZpbmlzaChkZXNjLCBvdXQpOwogfQogCi1zdGF0aWMgaW50IHNoYTIyNF9maW51cChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCi0JCQl1bnNpZ25lZCBpbnQgbGVuLCB1OCAqb3V0KQorc3RhdGljIGludCBzaGEyNTZfY2VfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCV9fYmUzMiAqZHN0ID0gKF9fYmUzMiAqKW91dDsKLQlpbnQgaTsKLQotCXNoYTJfZmludXAoZGVzYywgZGF0YSwgbGVuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBTSEEyMjRfRElHRVNUX1NJWkUgLyBzaXplb2YoX19iZTMyKTsgaSsrKQotCQlwdXRfdW5hbGlnbmVkX2JlMzIoc2N0eC0+c3RhdGVbaV0sIGRzdCsrKTsKLQotCSpzY3R4ID0gKHN0cnVjdCBzaGEyNTZfc3RhdGUpe307Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhMjU2X2ZpbnVwKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKLQkJCXVuc2lnbmVkIGludCBsZW4sIHU4ICpvdXQpCi17Ci0Jc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCV9fYmUzMiAqZHN0ID0gKF9fYmUzMiAqKW91dDsKLQlpbnQgaTsKLQotCXNoYTJfZmludXAoZGVzYywgZGF0YSwgbGVuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBTSEEyNTZfRElHRVNUX1NJWkUgLyBzaXplb2YoX19iZTMyKTsgaSsrKQotCQlwdXRfdW5hbGlnbmVkX2JlMzIoc2N0eC0+c3RhdGVbaV0sIGRzdCsrKTsKLQotCSpzY3R4ID0gKHN0cnVjdCBzaGEyNTZfc3RhdGUpe307Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhMl9leHBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHZvaWQgKm91dCkKLXsKLQlzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0Jc3RydWN0IHNoYTI1Nl9zdGF0ZSAqZHN0ID0gb3V0OwotCi0JKmRzdCA9ICpzY3R4OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNoYTJfaW1wb3J0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB2b2lkICppbikKLXsKLQlzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0Jc3RydWN0IHNoYTI1Nl9zdGF0ZSBjb25zdCAqc3JjID0gaW47Ci0KLQkqc2N0eCA9ICpzcmM7Ci0JcmV0dXJuIDA7CisJa2VybmVsX25lb25fYmVnaW5fcGFydGlhbCgyOCk7CisJc2hhMjU2X2Jhc2VfZG9fZmluYWxpemUoZGVzYywgKHNoYTI1Nl9ibG9ja19mbiAqKXNoYTJfY2VfdHJhbnNmb3JtKTsKKwlrZXJuZWxfbmVvbl9lbmQoKTsKKwlyZXR1cm4gc2hhMjU2X2Jhc2VfZmluaXNoKGRlc2MsIG91dCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2hhc2hfYWxnIGFsZ3NbXSA9IHsgewotCS5pbml0CQkJPSBzaGEyMjRfaW5pdCwKLQkudXBkYXRlCQkJPSBzaGEyX3VwZGF0ZSwKLQkuZmluYWwJCQk9IHNoYTIyNF9maW5hbCwKLQkuZmludXAJCQk9IHNoYTIyNF9maW51cCwKLQkuZXhwb3J0CQkJPSBzaGEyX2V4cG9ydCwKLQkuaW1wb3J0CQkJPSBzaGEyX2ltcG9ydCwKLQkuZGVzY3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBzaGEyNTZfc3RhdGUpLAorCS5pbml0CQkJPSBzaGEyMjRfYmFzZV9pbml0LAorCS51cGRhdGUJCQk9IHNoYTI1Nl9jZV91cGRhdGUsCisJLmZpbmFsCQkJPSBzaGEyNTZfY2VfZmluYWwsCisJLmZpbnVwCQkJPSBzaGEyNTZfY2VfZmludXAsCisJLmRlc2NzaXplCQk9IHNpemVvZihzdHJ1Y3Qgc2hhMjU2X2NlX3N0YXRlKSwKIAkuZGlnZXN0c2l6ZQkJPSBTSEEyMjRfRElHRVNUX1NJWkUsCi0JLnN0YXRlc2l6ZQkJPSBzaXplb2Yoc3RydWN0IHNoYTI1Nl9zdGF0ZSksCiAJLmJhc2UJCQk9IHsKIAkJLmNyYV9uYW1lCQk9ICJzaGEyMjQiLAogCQkuY3JhX2RyaXZlcl9uYW1lCT0gInNoYTIyNC1jZSIsCkBAIC0yMjEsMTUgKzk3LDEyIEBACiAJCS5jcmFfbW9kdWxlCQk9IFRISVNfTU9EVUxFLAogCX0KIH0sIHsKLQkuaW5pdAkJCT0gc2hhMjU2X2luaXQsCi0JLnVwZGF0ZQkJCT0gc2hhMl91cGRhdGUsCi0JLmZpbmFsCQkJPSBzaGEyNTZfZmluYWwsCi0JLmZpbnVwCQkJPSBzaGEyNTZfZmludXAsCi0JLmV4cG9ydAkJCT0gc2hhMl9leHBvcnQsCi0JLmltcG9ydAkJCT0gc2hhMl9pbXBvcnQsCi0JLmRlc2NzaXplCQk9IHNpemVvZihzdHJ1Y3Qgc2hhMjU2X3N0YXRlKSwKKwkuaW5pdAkJCT0gc2hhMjU2X2Jhc2VfaW5pdCwKKwkudXBkYXRlCQkJPSBzaGEyNTZfY2VfdXBkYXRlLAorCS5maW5hbAkJCT0gc2hhMjU2X2NlX2ZpbmFsLAorCS5maW51cAkJCT0gc2hhMjU2X2NlX2ZpbnVwLAorCS5kZXNjc2l6ZQkJPSBzaXplb2Yoc3RydWN0IHNoYTI1Nl9jZV9zdGF0ZSksCiAJLmRpZ2VzdHNpemUJCT0gU0hBMjU2X0RJR0VTVF9TSVpFLAotCS5zdGF0ZXNpemUJCT0gc2l6ZW9mKHN0cnVjdCBzaGEyNTZfc3RhdGUpLAogCS5iYXNlCQkJPSB7CiAJCS5jcmFfbmFtZQkJPSAic2hhMjU2IiwKIAkJLmNyYV9kcml2ZXJfbmFtZQk9ICJzaGEyNTYtY2UiLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jbXB4Y2hnLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NtcHhjaGcuaAppbmRleCBjYjk1OTMwLi5kOGMyNWI3IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NtcHhjaGcuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NtcHhjaGcuaApAQCAtMjQ2LDE0ICsyNDYsMzAgQEAKIAlfX3JldDsgXAogfSkKIAotI2RlZmluZSB0aGlzX2NwdV9jbXB4Y2hnXzEocHRyLCBvLCBuKSBjbXB4Y2hnX2xvY2FsKHJhd19jcHVfcHRyKCYocHRyKSksIG8sIG4pCi0jZGVmaW5lIHRoaXNfY3B1X2NtcHhjaGdfMihwdHIsIG8sIG4pIGNtcHhjaGdfbG9jYWwocmF3X2NwdV9wdHIoJihwdHIpKSwgbywgbikKLSNkZWZpbmUgdGhpc19jcHVfY21weGNoZ180KHB0ciwgbywgbikgY21weGNoZ19sb2NhbChyYXdfY3B1X3B0cigmKHB0cikpLCBvLCBuKQotI2RlZmluZSB0aGlzX2NwdV9jbXB4Y2hnXzgocHRyLCBvLCBuKSBjbXB4Y2hnX2xvY2FsKHJhd19jcHVfcHRyKCYocHRyKSksIG8sIG4pCisjZGVmaW5lIF9wcm90ZWN0X2NtcHhjaGdfbG9jYWwocGNwLCBvLCBuKQkJCVwKKyh7CQkJCQkJCQlcCisJdHlwZW9mKCpyYXdfY3B1X3B0cigmKHBjcCkpKSBfX3JldDsJCQlcCisJcHJlZW1wdF9kaXNhYmxlKCk7CQkJCQlcCisJX19yZXQgPSBjbXB4Y2hnX2xvY2FsKHJhd19jcHVfcHRyKCYocGNwKSksIG8sIG4pOwlcCisJcHJlZW1wdF9lbmFibGUoKTsJCQkJCVwKKwlfX3JldDsJCQkJCQkJXAorfSkKIAotI2RlZmluZSB0aGlzX2NwdV9jbXB4Y2hnX2RvdWJsZV84KHB0cjEsIHB0cjIsIG8xLCBvMiwgbjEsIG4yKSBcCi0JY21weGNoZ19kb3VibGVfbG9jYWwocmF3X2NwdV9wdHIoJihwdHIxKSksIHJhd19jcHVfcHRyKCYocHRyMikpLCBcCi0JCQkJbzEsIG8yLCBuMSwgbjIpCisjZGVmaW5lIHRoaXNfY3B1X2NtcHhjaGdfMShwdHIsIG8sIG4pIF9wcm90ZWN0X2NtcHhjaGdfbG9jYWwocHRyLCBvLCBuKQorI2RlZmluZSB0aGlzX2NwdV9jbXB4Y2hnXzIocHRyLCBvLCBuKSBfcHJvdGVjdF9jbXB4Y2hnX2xvY2FsKHB0ciwgbywgbikKKyNkZWZpbmUgdGhpc19jcHVfY21weGNoZ180KHB0ciwgbywgbikgX3Byb3RlY3RfY21weGNoZ19sb2NhbChwdHIsIG8sIG4pCisjZGVmaW5lIHRoaXNfY3B1X2NtcHhjaGdfOChwdHIsIG8sIG4pIF9wcm90ZWN0X2NtcHhjaGdfbG9jYWwocHRyLCBvLCBuKQorCisjZGVmaW5lIHRoaXNfY3B1X2NtcHhjaGdfZG91YmxlXzgocHRyMSwgcHRyMiwgbzEsIG8yLCBuMSwgbjIpCQlcCisoewkJCQkJCQkJCVwKKwlpbnQgX19yZXQ7CQkJCQkJCVwKKwlwcmVlbXB0X2Rpc2FibGUoKTsJCQkJCQlcCisJX19yZXQgPSBjbXB4Y2hnX2RvdWJsZV9sb2NhbCgJcmF3X2NwdV9wdHIoJihwdHIxKSksCQlcCisJCQkJCXJhd19jcHVfcHRyKCYocHRyMikpLAkJXAorCQkJCQlvMSwgbzIsIG4xLCBuMik7CQlcCisJcHJlZW1wdF9lbmFibGUoKTsJCQkJCQlcCisJX19yZXQ7CQkJCQkJCQlcCit9KQogCiAjZGVmaW5lIGNtcHhjaGc2NChwdHIsbyxuKQkJY21weGNoZygocHRyKSwobyksKG4pKQogI2RlZmluZSBjbXB4Y2hnNjRfbG9jYWwocHRyLG8sbikJY21weGNoZ19sb2NhbCgocHRyKSwobyksKG4pKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9jcHVpZGxlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdWlkbGUuaAppbmRleCBjNjA2NDNmLi4xNDFiMmZjIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdWlkbGUuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2NwdWlkbGUuaApAQCAtNCwxMCArNCwxMCBAQAogI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogCiAjaWZkZWYgQ09ORklHX0NQVV9JRExFCi1leHRlcm4gaW50IGNwdV9pbml0X2lkbGUodW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gaW50IGFybV9jcHVpZGxlX2luaXQodW5zaWduZWQgaW50IGNwdSk7CiBleHRlcm4gaW50IGNwdV9zdXNwZW5kKHVuc2lnbmVkIGxvbmcgYXJnKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBjcHVfaW5pdF9pZGxlKHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgaW5saW5lIGludCBhcm1fY3B1aWRsZV9pbml0KHVuc2lnbmVkIGludCBjcHUpCiB7CiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQpAQCAtMTcsNSArMTcsOCBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KICNlbmRpZgotCitzdGF0aWMgaW5saW5lIGludCBhcm1fY3B1aWRsZV9zdXNwZW5kKGludCBpbmRleCkKK3sKKwlyZXR1cm4gY3B1X3N1c3BlbmQoaW5kZXgpOworfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2VsZi5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCAxZjY1YmUzLi5mYWFkNmRmIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZWxmLmgKQEAgLTEyNSw3ICsxMjUsNiBAQAogICogdGhlIGxvYWRlci4gIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgb3V0IG9mIHRoZSB3YXkgb2YgdGhlIHByb2dyYW0KICAqIHRoYXQgaXQgd2lsbCAiZXhlYyIsIGFuZCB0aGF0IHRoZXJlIGlzIHN1ZmZpY2llbnQgcm9vbSBmb3IgdGhlIGJyay4KICAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmFuZG9taXplX2V0X2R5bih1bnNpZ25lZCBsb25nIGJhc2UpOwogI2RlZmluZSBFTEZfRVRfRFlOX0JBU0UJKDIgKiBUQVNLX1NJWkVfNjQgLyAzKQogCiAvKgpAQCAtMTU3LDEwICsxNTYsNiBAQAogI2RlZmluZSBTVEFDS19STkRfTUFTSwkJCSgweDNmZmZmID4+IChQQUdFX1NISUZUIC0gMTIpKQogI2VuZGlmCiAKLXN0cnVjdCBtbV9zdHJ1Y3Q7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pOwotI2RlZmluZSBhcmNoX3JhbmRvbWl6ZV9icmsgYXJjaF9yYW5kb21pemVfYnJrCi0KICNpZmRlZiBDT05GSUdfQ09NUEFUCiAKICNpZmRlZiBfX0FBUkNINjRFQl9fCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9lc3IuaAppbmRleCA5MmJiYWUzLi43MDUyMjQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2Vzci5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vZXNyLmgKQEAgLTkwLDYgKzkwLDcgQEAKICNkZWZpbmUgRVNSX0VMeF9GU0MJCSgweDNGKQogI2RlZmluZSBFU1JfRUx4X0ZTQ19UWVBFCSgweDNDKQogI2RlZmluZSBFU1JfRUx4X0ZTQ19FWFRBQlQJKDB4MTApCisjZGVmaW5lIEVTUl9FTHhfRlNDX0FDQ0VTUwkoMHgwOCkKICNkZWZpbmUgRVNSX0VMeF9GU0NfRkFVTFQJKDB4MDQpCiAjZGVmaW5lIEVTUl9FTHhfRlNDX1BFUk0JKDB4MEMpCiAjZGVmaW5lIEVTUl9FTHhfQ1YJCShVTCgxKSA8PCAyNCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKaW5kZXggMDc2YTFjNy4uYzBlNTE2NSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKQEAgLTE4LDExICsxOCwxMiBAQAogICovCiAjaWZuZGVmIF9fQVNNX0pVTVBfTEFCRUxfSAogI2RlZmluZSBfX0FTTV9KVU1QX0xBQkVMX0gKKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL2luc24uaD4KIAotI2lmZGVmIF9fS0VSTkVMX18KLQogI2RlZmluZSBKVU1QX0xBQkVMX05PUF9TSVpFCQlBQVJDSDY0X0lOU05fU0laRQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgYXJjaF9zdGF0aWNfYnJhbmNoKHN0cnVjdCBzdGF0aWNfa2V5ICprZXkpCkBAIC0zOSw4ICs0MCw2IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCi0KIHR5cGVkZWYgdTY0IGp1bXBfbGFiZWxfdDsKIAogc3RydWN0IGp1bXBfZW50cnkgewpAQCAtNDksNCArNDgsNSBAQAogCWp1bXBfbGFiZWxfdCBrZXk7CiB9OwogCisjZW5kaWYgIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmCS8qIF9fQVNNX0pVTVBfTEFCRUxfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fYXJtLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hcm0uaAppbmRleCA5NDY3NGViLi5hYzZmYWZiIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hcm0uaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9hcm0uaApAQCAtMTI5LDYgKzEyOSw5IEBACiAgKiA0MCBiaXRzIHdpZGUgKFQwU1ogPSAyNCkuICBTeXN0ZW1zIHdpdGggYSBQQVJhbmdlIHNtYWxsZXIgdGhhbiA0MCBiaXRzIGFyZQogICogbm90IGtub3duIHRvIGV4aXN0IGFuZCB3aWxsIGJyZWFrIHdpdGggdGhpcyBjb25maWd1cmF0aW9uLgogICoKKyAqIFZUQ1JfRUwyLlBTIGlzIGV4dHJhY3RlZCBmcm9tIElEX0FBNjRNTUZSMF9FTDEuUEFSYW5nZSBhdCBib290IHRpbWUKKyAqIChzZWUgaHlwLWluaXQuUykuCisgKgogICogTm90ZSB0aGF0IHdoZW4gdXNpbmcgNEsgcGFnZXMsIHdlIGNvbmNhdGVuYXRlIHR3byBmaXJzdCBsZXZlbCBwYWdlIHRhYmxlcwogICogdG9nZXRoZXIuCiAgKgpAQCAtMTM4LDcgKzE0MSw2IEBACiAjaWZkZWYgQ09ORklHX0FSTTY0XzY0S19QQUdFUwogLyoKICAqIFN0YWdlMiB0cmFuc2xhdGlvbiBjb25maWd1cmF0aW9uOgotICogNDBiaXRzIG91dHB1dCAoUFMgPSAyKQogICogNDBiaXRzIGlucHV0ICAoVDBTWiA9IDI0KQogICogNjRrQiBwYWdlcyAoVEcwID0gMSkKICAqIDIgbGV2ZWwgcGFnZSB0YWJsZXMgKFNMID0gMSkKQEAgLTE1MCw3ICsxNTIsNiBAQAogI2Vsc2UKIC8qCiAgKiBTdGFnZTIgdHJhbnNsYXRpb24gY29uZmlndXJhdGlvbjoKLSAqIDQwYml0cyBvdXRwdXQgKFBTID0gMikKICAqIDQwYml0cyBpbnB1dCAgKFQwU1ogPSAyNCkKICAqIDRrQiBwYWdlcyAoVEcwID0gMCkKICAqIDMgbGV2ZWwgcGFnZSB0YWJsZXMgKFNMID0gMSkKQEAgLTE4Nyw2ICsxODgsNyBAQAogCiAvKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIGZhdWx0IGNvZGUgc2hhcmVkIHdpdGggMzItYml0ICovCiAjZGVmaW5lIEZTQ19GQVVMVAlFU1JfRUx4X0ZTQ19GQVVMVAorI2RlZmluZSBGU0NfQUNDRVNTCUVTUl9FTHhfRlNDX0FDQ0VTUwogI2RlZmluZSBGU0NfUEVSTQlFU1JfRUx4X0ZTQ19QRVJNCiAKIC8qIEh5cCBQcmVmZXRjaCBGYXVsdCBBZGRyZXNzIFJlZ2lzdGVyIChIUEZBUi9IREZBUikgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCA4YWMzYzcwLi5mMGY1OGM5IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8YXNtL2t2bV9hc20uaD4KICNpbmNsdWRlIDxhc20va3ZtX21taW8uaD4KIAorI2RlZmluZSBfX0tWTV9IQVZFX0FSQ0hfSU5UQ19JTklUSUFMSVpFRAorCiAjaWYgZGVmaW5lZChDT05GSUdfS1ZNX0FSTV9NQVhfVkNQVVMpCiAjZGVmaW5lIEtWTV9NQVhfVkNQVVMgQ09ORklHX0tWTV9BUk1fTUFYX1ZDUFVTCiAjZWxzZQpAQCAtMTc3LDE5ICsxNzksMTAgQEAKIGludCBrdm1fdW5tYXBfaHZhX3JhbmdlKHN0cnVjdCBrdm0gKmt2bSwKIAkJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKIHZvaWQga3ZtX3NldF9zcHRlX2h2YShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgaHZhLCBwdGVfdCBwdGUpOworaW50IGt2bV9hZ2VfaHZhKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOworaW50IGt2bV90ZXN0X2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIGh2YSk7CiAKIC8qIFdlIGRvIG5vdCBoYXZlIHNoYWRvdyBwYWdlIHRhYmxlcywgaGVuY2UgdGhlIGVtcHR5IGhvb2tzICovCi1zdGF0aWMgaW5saW5lIGludCBrdm1fYWdlX2h2YShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0JCQkgICAgICB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQga3ZtX3Rlc3RfYWdlX2h2YShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgaHZhKQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX2FyY2hfbW11X25vdGlmaWVyX2ludmFsaWRhdGVfcGFnZShzdHJ1Y3Qga3ZtICprdm0sCiAJCQkJCQkJIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX21taW8uaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20va3ZtX21taW8uaAppbmRleCA5ZjUyYmViLi44ODljOTA4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9tbWlvLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW1pby5oCkBAIC0zMSwyOCArMzEsNiBAQAogCWJvb2wgc2lnbl9leHRlbmQ7CiB9OwogCi0vKgotICogVGhlIGluLWtlcm5lbCBNTUlPIGVtdWxhdGlvbiBjb2RlIHdhbnRzIHRvIHVzZSBhIGNvcHkgb2YgcnVuLT5tbWlvLAotICogd2hpY2ggaXMgYW4gYW5vbnltb3VzIHR5cGUuIFVzZSBvdXIgb3duIHR5cGUgaW5zdGVhZC4KLSAqLwotc3RydWN0IGt2bV9leGl0X21taW8gewotCXBoeXNfYWRkcl90CXBoeXNfYWRkcjsKLQl1OAkJZGF0YVs4XTsKLQl1MzIJCWxlbjsKLQlib29sCQlpc193cml0ZTsKLQl2b2lkCQkqcHJpdmF0ZTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fcHJlcGFyZV9tbWlvKHN0cnVjdCBrdm1fcnVuICpydW4sCi0JCQkJICAgIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvKQotewotCXJ1bi0+bW1pby5waHlzX2FkZHIJPSBtbWlvLT5waHlzX2FkZHI7Ci0JcnVuLT5tbWlvLmxlbgkJPSBtbWlvLT5sZW47Ci0JcnVuLT5tbWlvLmlzX3dyaXRlCT0gbW1pby0+aXNfd3JpdGU7Ci0JbWVtY3B5KHJ1bi0+bW1pby5kYXRhLCBtbWlvLT5kYXRhLCBtbWlvLT5sZW4pOwotCXJ1bi0+ZXhpdF9yZWFzb24JPSBLVk1fRVhJVF9NTUlPOwotfQotCiBpbnQga3ZtX2hhbmRsZV9tbWlvX3JldHVybihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4pOwogaW50IGlvX21lbV9hYm9ydChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4sCiAJCSBwaHlzX2FkZHJfdCBmYXVsdF9pcGEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9rdm1fbW11LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9tbXUuaAppbmRleCA2NDU4YjUzLi4zNjI1MDcwIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9tbXUuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9tbXUuaApAQCAtMTU4LDU2ICsxNTgsMjEgQEAKICNkZWZpbmUgUFRSU19QRVJfUzJfUEdECQkoMSA8PCBQVFJTX1BFUl9TMl9QR0RfU0hJRlQpCiAjZGVmaW5lIFMyX1BHRF9PUkRFUgkJZ2V0X29yZGVyKFBUUlNfUEVSX1MyX1BHRCAqIHNpemVvZihwZ2RfdCkpCiAKKyNkZWZpbmUga3ZtX3BnZF9pbmRleChhZGRyKQkoKChhZGRyKSA+PiBQR0RJUl9TSElGVCkgJiAoUFRSU19QRVJfUzJfUEdEIC0gMSkpCisKIC8qCiAgKiBJZiB3ZSBhcmUgY29uY2F0ZW5hdGluZyBmaXJzdCBsZXZlbCBzdGFnZS0yIHBhZ2UgdGFibGVzLCB3ZSB3b3VsZCBoYXZlIGxlc3MKICAqIHRoYW4gb3IgZXF1YWwgdG8gMTYgcG9pbnRlcnMgaW4gdGhlIGZha2UgUEdELCBiZWNhdXNlIHRoYXQncyB3aGF0IHRoZQotICogYXJjaGl0ZWN0dXJlIGFsbG93cy4gIEluIHRoaXMgY2FzZSwgKDQgLSBDT05GSUdfQVJNNjRfUEdUQUJMRV9MRVZFTFMpCisgKiBhcmNoaXRlY3R1cmUgYWxsb3dzLiAgSW4gdGhpcyBjYXNlLCAoNCAtIENPTkZJR19QR1RBQkxFX0xFVkVMUykKICAqIHJlcHJlc2VudHMgdGhlIGZpcnN0IGxldmVsIGZvciB0aGUgaG9zdCwgYW5kIHdlIGFkZCAxIHRvIGdvIHRvIHRoZSBuZXh0CiAgKiBsZXZlbCAod2hpY2ggdXNlcyBjb250YXRlbmF0aW9uKSBmb3IgdGhlIHN0YWdlLTIgdGFibGVzLgogICovCiAjaWYgUFRSU19QRVJfUzJfUEdEIDw9IDE2Ci0jZGVmaW5lIEtWTV9QUkVBTExPQ19MRVZFTAkoNCAtIENPTkZJR19BUk02NF9QR1RBQkxFX0xFVkVMUyArIDEpCisjZGVmaW5lIEtWTV9QUkVBTExPQ19MRVZFTAkoNCAtIENPTkZJR19QR1RBQkxFX0xFVkVMUyArIDEpCiAjZWxzZQogI2RlZmluZSBLVk1fUFJFQUxMT0NfTEVWRUwJKDApCiAjZW5kaWYKIAotLyoqCi0gKiBrdm1fcHJlYWxsb2NfaHdwZ2QgLSBhbGxvY2F0ZSBpbml0YWwgdGFibGUgZm9yIFZUVEJSCi0gKiBAa3ZtOglUaGUgS1ZNIHN0cnVjdCBwb2ludGVyIGZvciB0aGUgVk0uCi0gKiBAcGdkOglUaGUga2VybmVsIHBzZXVkbyBwZ2QKLSAqCi0gKiBXaGVuIHRoZSBrZXJuZWwgdXNlcyBtb3JlIGxldmVscyBvZiBwYWdlIHRhYmxlcyB0aGFuIHRoZSBndWVzdCwgd2UgYWxsb2NhdGUKLSAqIGEgZmFrZSBQR0QgYW5kIHByZS1wb3B1bGF0ZSBpdCB0byBwb2ludCB0byB0aGUgbmV4dC1sZXZlbCBwYWdlIHRhYmxlLCB3aGljaAotICogd2lsbCBiZSB0aGUgcmVhbCBpbml0aWFsIHBhZ2UgdGFibGUgcG9pbnRlZCB0byBieSB0aGUgVlRUQlIuCi0gKgotICogV2hlbiBLVk1fUFJFQUxMT0NfTEVWRUw9PTIsIHdlIGFsbG9jYXRlIGEgc2luZ2xlIHBhZ2UgZm9yIHRoZSBQTUQgYW5kCi0gKiB0aGUga2VybmVsIHdpbGwgdXNlIGZvbGRlZCBwdWQuICBXaGVuIEtWTV9QUkVBTExPQ19MRVZFTD09MSwgd2UKLSAqIGFsbG9jYXRlIDIgY29uc2VjdXRpdmUgUFVEIHBhZ2VzLgotICovCi1zdGF0aWMgaW5saW5lIGludCBrdm1fcHJlYWxsb2NfaHdwZ2Qoc3RydWN0IGt2bSAqa3ZtLCBwZ2RfdCAqcGdkKQotewotCXVuc2lnbmVkIGludCBpOwotCXVuc2lnbmVkIGxvbmcgaHdwZ2Q7Ci0KLQlpZiAoS1ZNX1BSRUFMTE9DX0xFVkVMID09IDApCi0JCXJldHVybiAwOwotCi0JaHdwZ2QgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCBQVFJTX1BFUl9TMl9QR0RfU0hJRlQpOwotCWlmICghaHdwZ2QpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX1MyX1BHRDsgaSsrKSB7Ci0JCWlmIChLVk1fUFJFQUxMT0NfTEVWRUwgPT0gMSkKLQkJCXBnZF9wb3B1bGF0ZShOVUxMLCBwZ2QgKyBpLAotCQkJCSAgICAgKHB1ZF90ICopaHdwZ2QgKyBpICogUFRSU19QRVJfUFVEKTsKLQkJZWxzZSBpZiAoS1ZNX1BSRUFMTE9DX0xFVkVMID09IDIpCi0JCQlwdWRfcG9wdWxhdGUoTlVMTCwgcHVkX29mZnNldChwZ2QsIDApICsgaSwKLQkJCQkgICAgIChwbWRfdCAqKWh3cGdkICsgaSAqIFBUUlNfUEVSX1BNRCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCAqa3ZtX2dldF9od3BnZChzdHJ1Y3Qga3ZtICprdm0pCiB7CiAJcGdkX3QgKnBnZCA9IGt2bS0+YXJjaC5wZ2Q7CkBAIC0yMjQsMTIgKzE4OSwxMSBAQAogCXJldHVybiBwbWRfb2Zmc2V0KHB1ZCwgMCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fZnJlZV9od3BnZChzdHJ1Y3Qga3ZtICprdm0pCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBrdm1fZ2V0X2h3cGdkX3NpemUodm9pZCkKIHsKLQlpZiAoS1ZNX1BSRUFMTE9DX0xFVkVMID4gMCkgewotCQl1bnNpZ25lZCBsb25nIGh3cGdkID0gKHVuc2lnbmVkIGxvbmcpa3ZtX2dldF9od3BnZChrdm0pOwotCQlmcmVlX3BhZ2VzKGh3cGdkLCBQVFJTX1BFUl9TMl9QR0RfU0hJRlQpOwotCX0KKwlpZiAoS1ZNX1BSRUFMTE9DX0xFVkVMID4gMCkKKwkJcmV0dXJuIFBUUlNfUEVSX1MyX1BHRCAqIFBBR0VfU0laRTsKKwlyZXR1cm4gUFRSU19QRVJfUzJfUEdEICogc2l6ZW9mKHBnZF90KTsKIH0KIAogc3RhdGljIGlubGluZSBib29sIGt2bV9wYWdlX2VtcHR5KHZvaWQgKnB0cikKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAppbmRleCBhOWVlZTMzLi4xMDFhNDJiIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC0xNTEsNiArMTUxLDE1IEBACiB7CiAJdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAorCS8qCisJICogaW5pdF9tbS5wZ2QgZG9lcyBub3QgY29udGFpbiBhbnkgdXNlciBtYXBwaW5ncyBhbmQgaXQgaXMgYWx3YXlzCisJICogYWN0aXZlIGZvciBrZXJuZWwgYWRkcmVzc2VzIGluIFRUQlIxLiBKdXN0IHNldCB0aGUgcmVzZXJ2ZWQgVFRCUjAuCisJICovCisJaWYgKG5leHQgPT0gJmluaXRfbW0pIHsKKwkJY3B1X3NldF9yZXNlcnZlZF90dGJyMCgpOworCQlyZXR1cm47CisJfQorCiAJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX3NldF9jcHUoY3B1LCBtbV9jcHVtYXNrKG5leHQpKSB8fCBwcmV2ICE9IG5leHQpCiAJCWNoZWNrX2FuZF9zd2l0Y2hfY29udGV4dChuZXh0LCB0c2spOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BhZ2UuaAppbmRleCAyMmIxNjIzLi44ZmM4ZmEyIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMzYsOSArMzYsOSBAQAogICogZm9yIG1vcmUgaW5mb3JtYXRpb24pLgogICovCiAjaWZkZWYgQ09ORklHX0FSTTY0XzY0S19QQUdFUwotI2RlZmluZSBTV0FQUEVSX1BHVEFCTEVfTEVWRUxTCShDT05GSUdfQVJNNjRfUEdUQUJMRV9MRVZFTFMpCisjZGVmaW5lIFNXQVBQRVJfUEdUQUJMRV9MRVZFTFMJKENPTkZJR19QR1RBQkxFX0xFVkVMUykKICNlbHNlCi0jZGVmaW5lIFNXQVBQRVJfUEdUQUJMRV9MRVZFTFMJKENPTkZJR19BUk02NF9QR1RBQkxFX0xFVkVMUyAtIDEpCisjZGVmaW5lIFNXQVBQRVJfUEdUQUJMRV9MRVZFTFMJKENPTkZJR19QR1RBQkxFX0xFVkVMUyAtIDEpCiAjZW5kaWYKIAogI2RlZmluZSBTV0FQUEVSX0RJUl9TSVpFCShTV0FQUEVSX1BHVEFCTEVfTEVWRUxTICogUEFHRV9TSVpFKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZXJjcHUuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGVyY3B1LmgKaW5kZXggMDlkYTI1Yi4uNGZkZThjMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZXJjcHUuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BlcmNwdS5oCkBAIC0yMDQsMjUgKzIwNCw0NyBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNkZWZpbmUgX3BlcmNwdV9hZGQocGNwLCB2YWwpIFwKLQlfX3BlcmNwdV9hZGQocmF3X2NwdV9wdHIoJihwY3ApKSwgdmFsLCBzaXplb2YocGNwKSkKKyNkZWZpbmUgX3BlcmNwdV9yZWFkKHBjcCkJCQkJCQlcCisoewkJCQkJCQkJCVwKKwl0eXBlb2YocGNwKSBfX3JldHZhbDsJCQkJCQlcCisJcHJlZW1wdF9kaXNhYmxlKCk7CQkJCQkJXAorCV9fcmV0dmFsID0gKHR5cGVvZihwY3ApKV9fcGVyY3B1X3JlYWQocmF3X2NwdV9wdHIoJihwY3ApKSwgCVwKKwkJCQkJICAgICAgc2l6ZW9mKHBjcCkpOwkJXAorCXByZWVtcHRfZW5hYmxlKCk7CQkJCQkJXAorCV9fcmV0dmFsOwkJCQkJCQlcCit9KQogCi0jZGVmaW5lIF9wZXJjcHVfYWRkX3JldHVybihwY3AsIHZhbCkgKHR5cGVvZihwY3ApKSAoX3BlcmNwdV9hZGQocGNwLCB2YWwpKQorI2RlZmluZSBfcGVyY3B1X3dyaXRlKHBjcCwgdmFsKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJcHJlZW1wdF9kaXNhYmxlKCk7CQkJCQkJXAorCV9fcGVyY3B1X3dyaXRlKHJhd19jcHVfcHRyKCYocGNwKSksICh1bnNpZ25lZCBsb25nKSh2YWwpLCAJXAorCQkJCXNpemVvZihwY3ApKTsJCQkJXAorCXByZWVtcHRfZW5hYmxlKCk7CQkJCQkJXAorfSB3aGlsZSgwKQkJCQkJCQkJXAorCisjZGVmaW5lIF9wY3BfcHJvdGVjdChvcGVyYXRpb24sIHBjcCwgdmFsKQkJCVwKKyh7CQkJCQkJCQlcCisJdHlwZW9mKHBjcCkgX19yZXR2YWw7CQkJCQlcCisJcHJlZW1wdF9kaXNhYmxlKCk7CQkJCQlcCisJX19yZXR2YWwgPSAodHlwZW9mKHBjcCkpb3BlcmF0aW9uKHJhd19jcHVfcHRyKCYocGNwKSksCVwKKwkJCQkJICAodmFsKSwgc2l6ZW9mKHBjcCkpOwlcCisJcHJlZW1wdF9lbmFibGUoKTsJCQkJCVwKKwlfX3JldHZhbDsJCQkJCQlcCit9KQorCisjZGVmaW5lIF9wZXJjcHVfYWRkKHBjcCwgdmFsKSBcCisJX3BjcF9wcm90ZWN0KF9fcGVyY3B1X2FkZCwgcGNwLCB2YWwpCisKKyNkZWZpbmUgX3BlcmNwdV9hZGRfcmV0dXJuKHBjcCwgdmFsKSBfcGVyY3B1X2FkZChwY3AsIHZhbCkKIAogI2RlZmluZSBfcGVyY3B1X2FuZChwY3AsIHZhbCkgXAotCV9fcGVyY3B1X2FuZChyYXdfY3B1X3B0cigmKHBjcCkpLCB2YWwsIHNpemVvZihwY3ApKQorCV9wY3BfcHJvdGVjdChfX3BlcmNwdV9hbmQsIHBjcCwgdmFsKQogCiAjZGVmaW5lIF9wZXJjcHVfb3IocGNwLCB2YWwpIFwKLQlfX3BlcmNwdV9vcihyYXdfY3B1X3B0cigmKHBjcCkpLCB2YWwsIHNpemVvZihwY3ApKQotCi0jZGVmaW5lIF9wZXJjcHVfcmVhZChwY3ApICh0eXBlb2YocGNwKSkJXAotCShfX3BlcmNwdV9yZWFkKHJhd19jcHVfcHRyKCYocGNwKSksIHNpemVvZihwY3ApKSkKLQotI2RlZmluZSBfcGVyY3B1X3dyaXRlKHBjcCwgdmFsKSBcCi0JX19wZXJjcHVfd3JpdGUocmF3X2NwdV9wdHIoJihwY3ApKSwgKHVuc2lnbmVkIGxvbmcpKHZhbCksIHNpemVvZihwY3ApKQorCV9wY3BfcHJvdGVjdChfX3BlcmNwdV9vciwgcGNwLCB2YWwpCiAKICNkZWZpbmUgX3BlcmNwdV94Y2hnKHBjcCwgdmFsKSAodHlwZW9mKHBjcCkpIFwKLQkoX19wZXJjcHVfeGNoZyhyYXdfY3B1X3B0cigmKHBjcCkpLCAodW5zaWduZWQgbG9uZykodmFsKSwgc2l6ZW9mKHBjcCkpKQorCV9wY3BfcHJvdGVjdChfX3BlcmNwdV94Y2hnLCBwY3AsICh1bnNpZ25lZCBsb25nKSh2YWwpKQogCiAjZGVmaW5lIHRoaXNfY3B1X2FkZF8xKHBjcCwgdmFsKSBfcGVyY3B1X2FkZChwY3AsIHZhbCkKICNkZWZpbmUgdGhpc19jcHVfYWRkXzIocGNwLCB2YWwpIF9wZXJjcHVfYWRkKHBjcCwgdmFsKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ2FsbG9jLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BnYWxsb2MuaAppbmRleCBlMjBkZjM4Li43NjQyMDU2IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BnYWxsb2MuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BnYWxsb2MuaApAQCAtMjgsNyArMjgsNyBAQAogCiAjZGVmaW5lIFBHQUxMT0NfR0ZQCShHRlBfS0VSTkVMIHwgX19HRlBfTk9UUkFDSyB8IF9fR0ZQX1JFUEVBVCB8IF9fR0ZQX1pFUk8pCiAKLSNpZiBDT05GSUdfQVJNNjRfUEdUQUJMRV9MRVZFTFMgPiAyCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID4gMgogCiBzdGF0aWMgaW5saW5lIHBtZF90ICpwbWRfYWxsb2Nfb25lKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CkBAIC00Niw5ICs0Niw5IEBACiAJc2V0X3B1ZChwdWQsIF9fcHVkKF9fcGEocG1kKSB8IFBNRF9UWVBFX1RBQkxFKSk7CiB9CiAKLSNlbmRpZgkvKiBDT05GSUdfQVJNNjRfUEdUQUJMRV9MRVZFTFMgPiAyICovCisjZW5kaWYJLyogQ09ORklHX1BHVEFCTEVfTEVWRUxTID4gMiAqLwogCi0jaWYgQ09ORklHX0FSTTY0X1BHVEFCTEVfTEVWRUxTID4gMworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDMKIAogc3RhdGljIGlubGluZSBwdWRfdCAqcHVkX2FsbG9jX29uZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyKQogewpAQCAtNjYsNyArNjYsNyBAQAogCXNldF9wZ2QocGdkLCBfX3BnZChfX3BhKHB1ZCkgfCBQVURfVFlQRV9UQUJMRSkpOwogfQogCi0jZW5kaWYJLyogQ09ORklHX0FSTTY0X1BHVEFCTEVfTEVWRUxTID4gMyAqLworI2VuZGlmCS8qIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDMgKi8KIAogZXh0ZXJuIHBnZF90ICpwZ2RfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogZXh0ZXJuIHZvaWQgcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLWh3ZGVmLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtaHdkZWYuaAppbmRleCA1ZjkzMGNjLi44MGYzZDI0IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtaHdkZWYuaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BndGFibGUtaHdkZWYuaApAQCAtMjEsNyArMjEsNyBAQAogLyoKICAqIFBNRF9TSElGVCBkZXRlcm1pbmVzIHRoZSBzaXplIGEgbGV2ZWwgMiBwYWdlIHRhYmxlIGVudHJ5IGNhbiBtYXAuCiAgKi8KLSNpZiBDT05GSUdfQVJNNjRfUEdUQUJMRV9MRVZFTFMgPiAyCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID4gMgogI2RlZmluZSBQTURfU0hJRlQJCSgoUEFHRV9TSElGVCAtIDMpICogMiArIDMpCiAjZGVmaW5lIFBNRF9TSVpFCQkoX0FDKDEsIFVMKSA8PCBQTURfU0hJRlQpCiAjZGVmaW5lIFBNRF9NQVNLCQkofihQTURfU0laRS0xKSkKQEAgLTMxLDcgKzMxLDcgQEAKIC8qCiAgKiBQVURfU0hJRlQgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBhIGxldmVsIDEgcGFnZSB0YWJsZSBlbnRyeSBjYW4gbWFwLgogICovCi0jaWYgQ09ORklHX0FSTTY0X1BHVEFCTEVfTEVWRUxTID4gMworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDMKICNkZWZpbmUgUFVEX1NISUZUCQkoKFBBR0VfU0hJRlQgLSAzKSAqIDMgKyAzKQogI2RlZmluZSBQVURfU0laRQkJKF9BQygxLCBVTCkgPDwgUFVEX1NISUZUKQogI2RlZmluZSBQVURfTUFTSwkJKH4oUFVEX1NJWkUtMSkpCkBAIC00Miw3ICs0Miw3IEBACiAgKiBQR0RJUl9TSElGVCBkZXRlcm1pbmVzIHRoZSBzaXplIGEgdG9wLWxldmVsIHBhZ2UgdGFibGUgZW50cnkgY2FuIG1hcAogICogKGRlcGVuZGluZyBvbiB0aGUgY29uZmlndXJhdGlvbiwgdGhpcyBsZXZlbCBjYW4gYmUgMCwgMSBvciAyKS4KICAqLwotI2RlZmluZSBQR0RJUl9TSElGVAkJKChQQUdFX1NISUZUIC0gMykgKiBDT05GSUdfQVJNNjRfUEdUQUJMRV9MRVZFTFMgKyAzKQorI2RlZmluZSBQR0RJUl9TSElGVAkJKChQQUdFX1NISUZUIC0gMykgKiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgKyAzKQogI2RlZmluZSBQR0RJUl9TSVpFCQkoX0FDKDEsIFVMKSA8PCBQR0RJUl9TSElGVCkKICNkZWZpbmUgUEdESVJfTUFTSwkJKH4oUEdESVJfU0laRS0xKSkKICNkZWZpbmUgUFRSU19QRVJfUEdECQkoMSA8PCAoVkFfQklUUyAtIFBHRElSX1NISUZUKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS10eXBlcy5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLXR5cGVzLmgKaW5kZXggY2E5ZGY4MC4uMmIxYmQ3ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLXR5cGVzLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLXR5cGVzLmgKQEAgLTM4LDEzICszOCwxMyBAQAogI2RlZmluZSBwdGVfdmFsKHgpCSgoeCkucHRlKQogI2RlZmluZSBfX3B0ZSh4KQkoKHB0ZV90KSB7ICh4KSB9ICkKIAotI2lmIENPTkZJR19BUk02NF9QR1RBQkxFX0xFVkVMUyA+IDIKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPiAyCiB0eXBlZGVmIHN0cnVjdCB7IHBtZHZhbF90IHBtZDsgfSBwbWRfdDsKICNkZWZpbmUgcG1kX3ZhbCh4KQkoKHgpLnBtZCkKICNkZWZpbmUgX19wbWQoeCkJKChwbWRfdCkgeyAoeCkgfSApCiAjZW5kaWYKIAotI2lmIENPTkZJR19BUk02NF9QR1RBQkxFX0xFVkVMUyA+IDMKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPiAzCiB0eXBlZGVmIHN0cnVjdCB7IHB1ZHZhbF90IHB1ZDsgfSBwdWRfdDsKICNkZWZpbmUgcHVkX3ZhbCh4KQkoKHgpLnB1ZCkKICNkZWZpbmUgX19wdWQoeCkJKChwdWRfdCkgeyAoeCkgfSApCkBAIC02NCwxMyArNjQsMTMgQEAKICNkZWZpbmUgcHRlX3ZhbCh4KQkoeCkKICNkZWZpbmUgX19wdGUoeCkJKHgpCiAKLSNpZiBDT05GSUdfQVJNNjRfUEdUQUJMRV9MRVZFTFMgPiAyCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID4gMgogdHlwZWRlZiBwbWR2YWxfdCBwbWRfdDsKICNkZWZpbmUgcG1kX3ZhbCh4KQkoeCkKICNkZWZpbmUgX19wbWQoeCkJKHgpCiAjZW5kaWYKIAotI2lmIENPTkZJR19BUk02NF9QR1RBQkxFX0xFVkVMUyA+IDMKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPiAzCiB0eXBlZGVmIHB1ZHZhbF90IHB1ZF90OwogI2RlZmluZSBwdWRfdmFsKHgpCSh4KQogI2RlZmluZSBfX3B1ZCh4KQkoeCkKQEAgLTg2LDkgKzg2LDkgQEAKIAogI2VuZGlmIC8qIFNUUklDVF9NTV9UWVBFQ0hFQ0tTICovCiAKLSNpZiBDT05GSUdfQVJNNjRfUEdUQUJMRV9MRVZFTFMgPT0gMgorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSAyCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS1ub3BtZC5oPgotI2VsaWYgQ09ORklHX0FSTTY0X1BHVEFCTEVfTEVWRUxTID09IDMKKyNlbGlmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSAzCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS1ub3B1ZC5oPgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggODAwZWMwZS4uNTYyODNmOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTM3NCw3ICszNzQsNyBAQAogICovCiAjZGVmaW5lIG1rX3B0ZShwYWdlLHByb3QpCXBmbl9wdGUocGFnZV90b19wZm4ocGFnZSkscHJvdCkKIAotI2lmIENPTkZJR19BUk02NF9QR1RBQkxFX0xFVkVMUyA+IDIKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPiAyCiAKICNkZWZpbmUgcG1kX0VSUk9SKHBtZCkJCV9fcG1kX2Vycm9yKF9fRklMRV9fLCBfX0xJTkVfXywgcG1kX3ZhbChwbWQpKQogCkBAIC00MDksOSArNDA5LDkgQEAKIAogI2RlZmluZSBwdWRfcGFnZShwdWQpCQlwZm5fdG9fcGFnZShfX3BoeXNfdG9fcGZuKHB1ZF92YWwocHVkKSAmIFBIWVNfTUFTSykpCiAKLSNlbmRpZgkvKiBDT05GSUdfQVJNNjRfUEdUQUJMRV9MRVZFTFMgPiAyICovCisjZW5kaWYJLyogQ09ORklHX1BHVEFCTEVfTEVWRUxTID4gMiAqLwogCi0jaWYgQ09ORklHX0FSTTY0X1BHVEFCTEVfTEVWRUxTID4gMworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDMKIAogI2RlZmluZSBwdWRfRVJST1IocHVkKQkJX19wdWRfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCBwdWRfdmFsKHB1ZCkpCiAKQEAgLTQ0NSw3ICs0NDUsNyBAQAogCiAjZGVmaW5lIHBnZF9wYWdlKHBnZCkJCXBmbl90b19wYWdlKF9fcGh5c190b19wZm4ocGdkX3ZhbChwZ2QpICYgUEhZU19NQVNLKSkKIAotI2VuZGlmICAvKiBDT05GSUdfQVJNNjRfUEdUQUJMRV9MRVZFTFMgPiAzICovCisjZW5kaWYgIC8qIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDMgKi8KIAogI2RlZmluZSBwZ2RfRVJST1IocGdkKQkJX19wZ2RfZXJyb3IoX19GSUxFX18sIF9fTElORV9fLCBwZ2RfdmFsKHBnZCkpCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcHJvYy1mbnMuaCBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcHJvYy1mbnMuaAppbmRleCA5YThmZDg0Li45NDFjMzc1IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3Byb2MtZm5zLmgKKysrIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS9wcm9jLWZucy5oCkBAIC0zOSw3ICszOSwxMSBAQAogCiAjaW5jbHVkZSA8YXNtL21lbW9yeS5oPgogCi0jZGVmaW5lIGNwdV9zd2l0Y2hfbW0ocGdkLG1tKSBjcHVfZG9fc3dpdGNoX21tKHZpcnRfdG9fcGh5cyhwZ2QpLG1tKQorI2RlZmluZSBjcHVfc3dpdGNoX21tKHBnZCxtbSkJCQkJXAorZG8gewkJCQkJCQlcCisJQlVHX09OKHBnZCA9PSBzd2FwcGVyX3BnX2Rpcik7CQkJXAorCWNwdV9kb19zd2l0Y2hfbW0odmlydF90b19waHlzKHBnZCksbW0pOwkJXAorfSB3aGlsZSAoMCkKIAogI2RlZmluZSBjcHVfZ2V0X3BnZCgpCQkJCQlcCiAoewkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggNzAyZTFlNi4uZGNkMDZkMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMzMsNyArMzMsNiBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogc3RydWN0IHRhc2tfc3RydWN0Owotc3RydWN0IGV4ZWNfZG9tYWluOwogCiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKQEAgLTQ3LDcgKzQ2LDYgQEAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGxvdyBsZXZlbCBmbGFncyAqLwogCW1tX3NlZ21lbnRfdAkJYWRkcl9saW1pdDsJLyogYWRkcmVzcyBsaW1pdCAqLwogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJaW50CQkJcHJlZW1wdF9jb3VudDsJLyogMCA9PiBwcmVlbXB0YWJsZSwgPDAgPT4gYnVnICovCiAJaW50CQkJY3B1OwkJLyogY3B1ICovCiB9OwpAQCAtNTUsNyArNTMsNiBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQkJCQlcCiB7CQkJCQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJCQkJXAotCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAkJCQlcCiAJLmZsYWdzCQk9IDAsCQkJCQkJXAogCS5wcmVlbXB0X2NvdW50CT0gSU5JVF9QUkVFTVBUX0NPVU5ULAkJCQlcCiAJLmFkZHJfbGltaXQJPSBLRVJORUxfRFMsCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RsYi5oIGIvYXJjaC9hcm02NC9pbmNsdWRlL2FzbS90bGIuaAppbmRleCA1M2Q5YzM1Li4zYTAyNDJjIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3RsYi5oCisrKyBiL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vdGxiLmgKQEAgLTUzLDcgKzUzLDcgQEAKIAl0bGJfcmVtb3ZlX2VudHJ5KHRsYiwgcHRlKTsKIH0KIAotI2lmIENPTkZJR19BUk02NF9QR1RBQkxFX0xFVkVMUyA+IDIKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPiAyCiBzdGF0aWMgaW5saW5lIHZvaWQgX19wbWRfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcG1kX3QgKnBtZHAsCiAJCQkJICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CkBAIC02Miw3ICs2Miw3IEBACiB9CiAjZW5kaWYKIAotI2lmIENPTkZJR19BUk02NF9QR1RBQkxFX0xFVkVMUyA+IDMKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPiAzCiBzdGF0aWMgaW5saW5lIHZvaWQgX19wdWRfZnJlZV90bGIoc3RydWN0IG1tdV9nYXRoZXIgKnRsYiwgcHVkX3QgKnB1ZHAsCiAJCQkJICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20va3ZtLmggYi9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKaW5kZXggM2VmNzdhNC4uYzE1NGMwYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS91YXBpL2FzbS9rdm0uaAorKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvdWFwaS9hc20va3ZtLmgKQEAgLTE5MSw2ICsxOTEsOSBAQAogLyogSGlnaGVzdCBzdXBwb3J0ZWQgU1BJLCBmcm9tIFZHSUNfTlJfSVJRUyAqLwogI2RlZmluZSBLVk1fQVJNX0lSUV9HSUNfTUFYCQkxMjcKIAorLyogT25lIHNpbmdsZSBLVk0gaXJxY2hpcCwgaWUuIHRoZSBWR0lDICovCisjZGVmaW5lIEtWTV9OUl9JUlFDSElQUyAgICAgICAgICAxCisKIC8qIFBTQ0kgaW50ZXJmYWNlICovCiAjZGVmaW5lIEtWTV9QU0NJX0ZOX0JBU0UJCTB4OTVjMWJhNWUKICNkZWZpbmUgS1ZNX1BTQ0lfRk4obikJCQkoS1ZNX1BTQ0lfRk5fQkFTRSArIChuKSkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGY3ZmE2NWQuLjU2Y2FkZDMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMzgsNyArMzgsNiBAQAogICBERUZJTkUoVElfUFJFRU1QVCwJCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgcHJlZW1wdF9jb3VudCkpOwogICBERUZJTkUoVElfQUREUl9MSU1JVCwJCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgYWRkcl9saW1pdCkpOwogICBERUZJTkUoVElfVEFTSywJCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdGFzaykpOwotICBERUZJTkUoVElfRVhFQ19ET01BSU4sCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZXhlY19kb21haW4pKTsKICAgREVGSU5FKFRJX0NQVSwJCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgY3B1KSk7CiAgIEJMQU5LKCk7CiAgIERFRklORShUSFJFQURfQ1BVX0NPTlRFWFQsCW9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkLmNwdV9jb250ZXh0KSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9jcHVpZGxlLmMgYi9hcmNoL2FybTY0L2tlcm5lbC9jcHVpZGxlLmMKaW5kZXggNWMwODk2Ni4uYTc4MTQzYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvY3B1aWRsZS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2NwdWlkbGUuYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPGFzbS9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8YXNtL2NwdV9vcHMuaD4KIAotaW50IGNwdV9pbml0X2lkbGUodW5zaWduZWQgaW50IGNwdSkKK2ludCBhcm1fY3B1aWRsZV9pbml0KHVuc2lnbmVkIGludCBjcHUpCiB7CiAJaW50IHJldCA9IC1FT1BOT1RTVVBQOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1X25vZGUgPSBvZl9jcHVfZGV2aWNlX25vZGVfZ2V0KGNwdSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9lZmkuYyBiL2FyY2gvYXJtNjQva2VybmVsL2VmaS5jCmluZGV4IDJiOGQ3MDEuLmFiMjFlMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL2VmaS5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2VmaS5jCkBAIC0zMzcsNyArMzM3LDExIEBACiAKIHN0YXRpYyB2b2lkIGVmaV9zZXRfcGdkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCWNwdV9zd2l0Y2hfbW0obW0tPnBnZCwgbW0pOworCWlmIChtbSA9PSAmaW5pdF9tbSkKKwkJY3B1X3NldF9yZXNlcnZlZF90dGJyMCgpOworCWVsc2UKKwkJY3B1X3N3aXRjaF9tbShtbS0+cGdkLCBtbSk7CisKIAlmbHVzaF90bGJfYWxsKCk7CiAJaWYgKGljYWNoZV9pc19haXZpdnQoKSkKIAkJX19mbHVzaF9pY2FjaGVfYWxsKCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9od19icmVha3BvaW50LmMgYi9hcmNoL2FybTY0L2tlcm5lbC9od19icmVha3BvaW50LmMKaW5kZXggOThiYmUwNi4uZTdkOTM0ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvaHdfYnJlYWtwb2ludC5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL2h3X2JyZWFrcG9pbnQuYwpAQCAtNTI3LDcgKzUyNyw3IEBACiAJICogRGlzYWxsb3cgcGVyLXRhc2sga2VybmVsIGJyZWFrcG9pbnRzIHNpbmNlIHRoZXNlIHdvdWxkCiAJICogY29tcGxpY2F0ZSB0aGUgc3RlcHBpbmcgY29kZS4KIAkgKi8KLQlpZiAoaW5mby0+Y3RybC5wcml2aWxlZ2UgPT0gQUFSQ0g2NF9CUkVBS1BPSU5UX0VMMSAmJiBicC0+aHcuYnBfdGFyZ2V0KQorCWlmIChpbmZvLT5jdHJsLnByaXZpbGVnZSA9PSBBQVJDSDY0X0JSRUFLUE9JTlRfRUwxICYmIGJwLT5ody50YXJnZXQpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvYXJtNjQva2VybmVsL3NpZ25hbC5jCmluZGV4IDY2MGNjZjkuLmUxOGM0OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvYXJtNjQva2VybmVsL3NpZ25hbC5jCkBAIC0yODcsMTkgKzI4NywxMiBAQAogICovCiBzdGF0aWMgdm9pZCBoYW5kbGVfc2lnbmFsKHN0cnVjdCBrc2lnbmFsICprc2lnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlzdHJ1Y3QgdGhyZWFkX2luZm8gKnRocmVhZCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7CiAJc2lnc2V0X3QgKm9sZHNldCA9IHNpZ21hc2tfdG9fc2F2ZSgpOwogCWludCB1c2lnID0ga3NpZy0+c2lnOwogCWludCByZXQ7CiAKIAkvKgotCSAqIHRyYW5zbGF0ZSB0aGUgc2lnbmFsCi0JICovCi0JaWYgKHVzaWcgPCAzMiAmJiB0aHJlYWQtPmV4ZWNfZG9tYWluICYmIHRocmVhZC0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXApCi0JCXVzaWcgPSB0aHJlYWQtPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3VzaWddOwotCi0JLyoKIAkgKiBTZXQgdXAgdGhlIHN0YWNrIGZyYW1lCiAJICovCiAJaWYgKGlzX2NvbXBhdF90YXNrKCkpIHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYyBiL2FyY2gvYXJtNjQva2VybmVsL3Zkc28uYwppbmRleCAzMmFlZWEwLi5lYzM3YWIzIDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2tlcm5lbC92ZHNvLmMKKysrIGIvYXJjaC9hcm02NC9rZXJuZWwvdmRzby5jCkBAIC0yMDAsNyArMjAwLDcgQEAKIHZvaWQgdXBkYXRlX3ZzeXNjYWxsKHN0cnVjdCB0aW1la2VlcGVyICp0aykKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgeHRpbWVfY29hcnNlOwotCXUzMiB1c2Vfc3lzY2FsbCA9IHN0cmNtcCh0ay0+dGtyLmNsb2NrLT5uYW1lLCAiYXJjaF9zeXNfY291bnRlciIpOworCXUzMiB1c2Vfc3lzY2FsbCA9IHN0cmNtcCh0ay0+dGtyX21vbm8uY2xvY2stPm5hbWUsICJhcmNoX3N5c19jb3VudGVyIik7CiAKIAkrK3Zkc29fZGF0YS0+dGJfc2VxX2NvdW50OwogCXNtcF93bWIoKTsKQEAgLTIxMywxMSArMjEzLDExIEBACiAJdmRzb19kYXRhLT53dG1fY2xvY2tfbnNlYwkJPSB0ay0+d2FsbF90b19tb25vdG9uaWMudHZfbnNlYzsKIAogCWlmICghdXNlX3N5c2NhbGwpIHsKLQkJdmRzb19kYXRhLT5jc19jeWNsZV9sYXN0CT0gdGstPnRrci5jeWNsZV9sYXN0OworCQl2ZHNvX2RhdGEtPmNzX2N5Y2xlX2xhc3QJPSB0ay0+dGtyX21vbm8uY3ljbGVfbGFzdDsKIAkJdmRzb19kYXRhLT54dGltZV9jbG9ja19zZWMJPSB0ay0+eHRpbWVfc2VjOwotCQl2ZHNvX2RhdGEtPnh0aW1lX2Nsb2NrX25zZWMJPSB0ay0+dGtyLnh0aW1lX25zZWM7Ci0JCXZkc29fZGF0YS0+Y3NfbXVsdAkJPSB0ay0+dGtyLm11bHQ7Ci0JCXZkc29fZGF0YS0+Y3Nfc2hpZnQJCT0gdGstPnRrci5zaGlmdDsKKwkJdmRzb19kYXRhLT54dGltZV9jbG9ja19uc2VjCT0gdGstPnRrcl9tb25vLnh0aW1lX25zZWM7CisJCXZkc29fZGF0YS0+Y3NfbXVsdAkJPSB0ay0+dGtyX21vbm8ubXVsdDsKKwkJdmRzb19kYXRhLT5jc19zaGlmdAkJPSB0ay0+dGtyX21vbm8uc2hpZnQ7CiAJfQogCiAJc21wX3dtYigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vS2NvbmZpZyBiL2FyY2gvYXJtNjQva3ZtL0tjb25maWcKaW5kZXggZjU1OTBjOC4uNTEwNWUyOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9rdm0vS2NvbmZpZworKysgYi9hcmNoL2FybTY0L2t2bS9LY29uZmlnCkBAIC0xOCw2ICsxOCw3IEBACiAKIGNvbmZpZyBLVk0KIAlib29sICJLZXJuZWwtYmFzZWQgVmlydHVhbCBNYWNoaW5lIChLVk0pIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBPRgogCXNlbGVjdCBNTVVfTk9USUZJRVIKIAlzZWxlY3QgUFJFRU1QVF9OT1RJRklFUlMKIAlzZWxlY3QgQU5PTl9JTk9ERVMKQEAgLTI1LDEwICsyNiwxMCBAQAogCXNlbGVjdCBIQVZFX0tWTV9BUkNIX1RMQl9GTFVTSF9BTEwKIAlzZWxlY3QgS1ZNX01NSU8KIAlzZWxlY3QgS1ZNX0FSTV9IT1NUCi0Jc2VsZWN0IEtWTV9BUk1fVkdJQwotCXNlbGVjdCBLVk1fQVJNX1RJTUVSCiAJc2VsZWN0IEtWTV9HRU5FUklDX0RJUlRZTE9HX1JFQURfUFJPVEVDVAogCXNlbGVjdCBTUkNVCisJc2VsZWN0IEhBVkVfS1ZNX0VWRU5URkQKKwlzZWxlY3QgSEFWRV9LVk1fSVJRRkQKIAktLS1oZWxwLS0tCiAJICBTdXBwb3J0IGhvc3RpbmcgdmlydHVhbGl6ZWQgZ3Vlc3QgbWFjaGluZXMuCiAKQEAgLTUwLDE3ICs1MSw0IEBACiAJICBsYXJnZSwgc28gb25seSBjaG9vc2UgYSByZWFzb25hYmxlIG51bWJlciB0aGF0IHlvdSBleHBlY3QgdG8KIAkgIGFjdHVhbGx5IHVzZS4KIAotY29uZmlnIEtWTV9BUk1fVkdJQwotCWJvb2wKLQlkZXBlbmRzIG9uIEtWTV9BUk1fSE9TVCAmJiBPRgotCXNlbGVjdCBIQVZFX0tWTV9JUlFDSElQCi0JLS0taGVscC0tLQotCSAgQWRkcyBzdXBwb3J0IGZvciBhIGhhcmR3YXJlIGFzc2lzdGVkLCBpbi1rZXJuZWwgR0lDIGVtdWxhdGlvbi4KLQotY29uZmlnIEtWTV9BUk1fVElNRVIKLQlib29sCi0JZGVwZW5kcyBvbiBLVk1fQVJNX1ZHSUMKLQktLS1oZWxwLS0tCi0JICBBZGRzIHN1cHBvcnQgZm9yIHRoZSBBcmNoaXRlY3RlZCBUaW1lcnMgaW4gdmlydHVhbCBtYWNoaW5lcy4KLQogZW5kaWYgIyBWSVJUVUFMSVpBVElPTgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vTWFrZWZpbGUgYi9hcmNoL2FybTY0L2t2bS9NYWtlZmlsZQppbmRleCA0ZTZlMDllLi5kNTkwNGY4IDEwMDY0NAotLS0gYS9hcmNoL2FybTY0L2t2bS9NYWtlZmlsZQorKysgYi9hcmNoL2FybTY0L2t2bS9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIEtlcm5lbC1iYXNlZCBWaXJ0dWFsIE1hY2hpbmUgbW9kdWxlCiAjCiAKLWNjZmxhZ3MteSArPSAtSXZpcnQva3ZtIC1JYXJjaC9hcm02NC9rdm0KK2NjZmxhZ3MteSArPSAtSWFyY2gvYXJtNjQva3ZtCiBDRkxBR1NfYXJtLm8gOj0gLUkuCiBDRkxBR1NfbW11Lm8gOj0gLUkuCiAKQEAgLTExLDcgKzExLDcgQEAKIAogb2JqLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0ga3ZtLm8KIAota3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChLVk0pL2t2bV9tYWluLm8gJChLVk0pL2NvYWxlc2NlZF9tbWlvLm8KK2t2bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoS1ZNKS9rdm1fbWFpbi5vICQoS1ZNKS9jb2FsZXNjZWRfbW1pby5vICQoS1ZNKS9ldmVudGZkLm8KIGt2bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoQVJNKS9hcm0ubyAkKEFSTSkvbW11Lm8gJChBUk0pL21taW8ubwoga3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChBUk0pL3BzY2kubyAkKEFSTSkvcGVyZi5vCiAKQEAgLTE5LDExICsxOSwxMSBAQAoga3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gaHlwLm8gaHlwLWluaXQubyBoYW5kbGVfZXhpdC5vCiBrdm0tJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSBndWVzdC5vIHJlc2V0Lm8gc3lzX3JlZ3MubyBzeXNfcmVnc19nZW5lcmljX3Y4Lm8KIAota3ZtLSQoQ09ORklHX0tWTV9BUk1fVkdJQykgKz0gJChLVk0pL2FybS92Z2ljLm8KLWt2bS0kKENPTkZJR19LVk1fQVJNX1ZHSUMpICs9ICQoS1ZNKS9hcm0vdmdpYy12Mi5vCi1rdm0tJChDT05GSUdfS1ZNX0FSTV9WR0lDKSArPSAkKEtWTSkvYXJtL3ZnaWMtdjItZW11bC5vCi1rdm0tJChDT05GSUdfS1ZNX0FSTV9WR0lDKSArPSB2Z2ljLXYyLXN3aXRjaC5vCi1rdm0tJChDT05GSUdfS1ZNX0FSTV9WR0lDKSArPSAkKEtWTSkvYXJtL3ZnaWMtdjMubwota3ZtLSQoQ09ORklHX0tWTV9BUk1fVkdJQykgKz0gJChLVk0pL2FybS92Z2ljLXYzLWVtdWwubwota3ZtLSQoQ09ORklHX0tWTV9BUk1fVkdJQykgKz0gdmdpYy12My1zd2l0Y2gubwota3ZtLSQoQ09ORklHX0tWTV9BUk1fVElNRVIpICs9ICQoS1ZNKS9hcm0vYXJjaF90aW1lci5vCitrdm0tJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSAkKEtWTSkvYXJtL3ZnaWMubwora3ZtLSQoQ09ORklHX0tWTV9BUk1fSE9TVCkgKz0gJChLVk0pL2FybS92Z2ljLXYyLm8KK2t2bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoS1ZNKS9hcm0vdmdpYy12Mi1lbXVsLm8KK2t2bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9IHZnaWMtdjItc3dpdGNoLm8KK2t2bS0kKENPTkZJR19LVk1fQVJNX0hPU1QpICs9ICQoS1ZNKS9hcm0vdmdpYy12My5vCitrdm0tJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSAkKEtWTSkvYXJtL3ZnaWMtdjMtZW11bC5vCitrdm0tJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSB2Z2ljLXYzLXN3aXRjaC5vCitrdm0tJChDT05GSUdfS1ZNX0FSTV9IT1NUKSArPSAkKEtWTSkvYXJtL2FyY2hfdGltZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9kbWEtbWFwcGluZy5jIGIvYXJjaC9hcm02NC9tbS9kbWEtbWFwcGluZy5jCmluZGV4IDU4ZTBjMmIuLmVmN2QxMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vZG1hLW1hcHBpbmcuYworKysgYi9hcmNoL2FybTY0L21tL2RtYS1tYXBwaW5nLmMKQEAgLTUxLDcgKzUxLDcgQEAKIH0KIGVhcmx5X3BhcmFtKCJjb2hlcmVudF9wb29sIiwgZWFybHlfY29oZXJlbnRfcG9vbCk7CiAKLXN0YXRpYyB2b2lkICpfX2FsbG9jX2Zyb21fcG9vbChzaXplX3Qgc2l6ZSwgc3RydWN0IHBhZ2UgKipyZXRfcGFnZSkKK3N0YXRpYyB2b2lkICpfX2FsbG9jX2Zyb21fcG9vbChzaXplX3Qgc2l6ZSwgc3RydWN0IHBhZ2UgKipyZXRfcGFnZSwgZ2ZwX3QgZmxhZ3MpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJdm9pZCAqcHRyID0gTlVMTDsKQEAgLTY3LDYgKzY3LDggQEAKIAogCQkqcmV0X3BhZ2UgPSBwaHlzX3RvX3BhZ2UocGh5cyk7CiAJCXB0ciA9ICh2b2lkICopdmFsOworCQlpZiAoZmxhZ3MgJiBfX0dGUF9aRVJPKQorCQkJbWVtc2V0KHB0ciwgMCwgc2l6ZSk7CiAJfQogCiAJcmV0dXJuIHB0cjsKQEAgLTEwMSw2ICsxMDMsNyBAQAogCQlmbGFncyB8PSBHRlBfRE1BOwogCWlmIChJU19FTkFCTEVEKENPTkZJR19ETUFfQ01BKSAmJiAoZmxhZ3MgJiBfX0dGUF9XQUlUKSkgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJdm9pZCAqYWRkcjsKIAogCQlzaXplID0gUEFHRV9BTElHTihzaXplKTsKIAkJcGFnZSA9IGRtYV9hbGxvY19mcm9tX2NvbnRpZ3VvdXMoZGV2LCBzaXplID4+IFBBR0VfU0hJRlQsCkBAIC0xMDksNyArMTEyLDEwIEBACiAJCQlyZXR1cm4gTlVMTDsKIAogCQkqZG1hX2hhbmRsZSA9IHBoeXNfdG9fZG1hKGRldiwgcGFnZV90b19waHlzKHBhZ2UpKTsKLQkJcmV0dXJuIHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKTsKKwkJaWYgKGZsYWdzICYgX19HRlBfWkVSTykKKwkJCW1lbXNldChhZGRyLCAwLCBzaXplKTsKKwkJcmV0dXJuIGFkZHI7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIHN3aW90bGJfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplLCBkbWFfaGFuZGxlLCBmbGFncyk7CiAJfQpAQCAtMTQ2LDcgKzE1Miw3IEBACiAKIAlpZiAoIWNvaGVyZW50ICYmICEoZmxhZ3MgJiBfX0dGUF9XQUlUKSkgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7Ci0JCXZvaWQgKmFkZHIgPSBfX2FsbG9jX2Zyb21fcG9vbChzaXplLCAmcGFnZSk7CisJCXZvaWQgKmFkZHIgPSBfX2FsbG9jX2Zyb21fcG9vbChzaXplLCAmcGFnZSwgZmxhZ3MpOwogCiAJCWlmIChhZGRyKQogCQkJKmRtYV9oYW5kbGUgPSBwaHlzX3RvX2RtYShkZXYsIHBhZ2VfdG9fcGh5cyhwYWdlKSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL2luaXQuYyBiL2FyY2gvYXJtNjQvbW0vaW5pdC5jCmluZGV4IGFlODVkYTYuLjU5NzgzMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvYXJtNjQvbW0vaW5pdC5jCkBAIC0xOTAsNiArMTkwLDggQEAKIAltaW4gPSBQRk5fVVAobWVtYmxvY2tfc3RhcnRfb2ZfRFJBTSgpKTsKIAltYXggPSBQRk5fRE9XTihtZW1ibG9ja19lbmRfb2ZfRFJBTSgpKTsKIAorCWVhcmx5X21lbXRlc3QobWluIDw8IFBBR0VfU0hJRlQsIG1heCA8PCBQQUdFX1NISUZUKTsKKwogCS8qCiAJICogU3BhcnNlbWVtIHRyaWVzIHRvIGFsbG9jYXRlIGJvb3RtZW0gaW4gbWVtb3J5X3ByZXNlbnQoKSwgc28gbXVzdCBiZQogCSAqIGRvbmUgYWZ0ZXIgdGhlIGZpeGVkIHJlc2VydmF0aW9ucy4KZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vbW1hcC5jIGIvYXJjaC9hcm02NC9tbS9tbWFwLmMKaW5kZXggNTQ5MjJkMS4uZWQxNzc0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9tbWFwLmMKKysrIGIvYXJjaC9hcm02NC9tbS9tbWFwLmMKQEAgLTQ3LDE3ICs0NywxNiBAQAogCXJldHVybiBzeXNjdGxfbGVnYWN5X3ZhX2xheW91dDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbW1hcF9ybmQodm9pZCkKK3Vuc2lnbmVkIGxvbmcgYXJjaF9tbWFwX3JuZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgcm5kID0gMDsKKwl1bnNpZ25lZCBsb25nIHJuZDsKIAotCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkKLQkJcm5kID0gKGxvbmcpZ2V0X3JhbmRvbV9pbnQoKSAmIFNUQUNLX1JORF9NQVNLOworCXJuZCA9ICh1bnNpZ25lZCBsb25nKWdldF9yYW5kb21faW50KCkgJiBTVEFDS19STkRfTUFTSzsKIAogCXJldHVybiBybmQgPDwgUEFHRV9TSElGVDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbW1hcF9iYXNlKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtbWFwX2Jhc2UodW5zaWduZWQgbG9uZyBybmQpCiB7CiAJdW5zaWduZWQgbG9uZyBnYXAgPSBybGltaXQoUkxJTUlUX1NUQUNLKTsKIApAQCAtNjYsNyArNjUsNyBAQAogCWVsc2UgaWYgKGdhcCA+IE1BWF9HQVApCiAJCWdhcCA9IE1BWF9HQVA7CiAKLQlyZXR1cm4gUEFHRV9BTElHTihTVEFDS19UT1AgLSBnYXAgLSBtbWFwX3JuZCgpKTsKKwlyZXR1cm4gUEFHRV9BTElHTihTVEFDS19UT1AgLSBnYXAgLSBybmQpOwogfQogCiAvKgpAQCAtNzUsMTUgKzc0LDIwIEBACiAgKi8KIHZvaWQgYXJjaF9waWNrX21tYXBfbGF5b3V0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogeworCXVuc2lnbmVkIGxvbmcgcmFuZG9tX2ZhY3RvciA9IDBVTDsKKworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkKKwkJcmFuZG9tX2ZhY3RvciA9IGFyY2hfbW1hcF9ybmQoKTsKKwogCS8qCiAJICogRmFsbCBiYWNrIHRvIHRoZSBzdGFuZGFyZCBsYXlvdXQgaWYgdGhlIHBlcnNvbmFsaXR5IGJpdCBpcyBzZXQsIG9yCiAJICogaWYgdGhlIGV4cGVjdGVkIHN0YWNrIGdyb3d0aCBpcyB1bmxpbWl0ZWQ6CiAJICovCiAJaWYgKG1tYXBfaXNfbGVnYWN5KCkpIHsKLQkJbW0tPm1tYXBfYmFzZSA9IFRBU0tfVU5NQVBQRURfQkFTRTsKKwkJbW0tPm1tYXBfYmFzZSA9IFRBU0tfVU5NQVBQRURfQkFTRSArIHJhbmRvbV9mYWN0b3I7CiAJCW1tLT5nZXRfdW5tYXBwZWRfYXJlYSA9IGFyY2hfZ2V0X3VubWFwcGVkX2FyZWE7CiAJfSBlbHNlIHsKLQkJbW0tPm1tYXBfYmFzZSA9IG1tYXBfYmFzZSgpOworCQltbS0+bW1hcF9iYXNlID0gbW1hcF9iYXNlKHJhbmRvbV9mYWN0b3IpOwogCQltbS0+Z2V0X3VubWFwcGVkX2FyZWEgPSBhcmNoX2dldF91bm1hcHBlZF9hcmVhX3RvcGRvd247CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9tbS9tbXUuYyBiL2FyY2gvYXJtNjQvbW0vbW11LmMKaW5kZXggYzZkYWFmNi4uNzllMDExNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm02NC9tbS9tbXUuYworKysgYi9hcmNoL2FybTY0L21tL21tdS5jCkBAIC01NTAsMTAgKzU1MCwxMCBAQAogI2VuZGlmCS8qIENPTkZJR19TUEFSU0VNRU1fVk1FTU1BUCAqLwogCiBzdGF0aWMgcHRlX3QgYm1fcHRlW1BUUlNfUEVSX1BURV0gX19wYWdlX2FsaWduZWRfYnNzOwotI2lmIENPTkZJR19BUk02NF9QR1RBQkxFX0xFVkVMUyA+IDIKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPiAyCiBzdGF0aWMgcG1kX3QgYm1fcG1kW1BUUlNfUEVSX1BNRF0gX19wYWdlX2FsaWduZWRfYnNzOwogI2VuZGlmCi0jaWYgQ09ORklHX0FSTTY0X1BHVEFCTEVfTEVWRUxTID4gMworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDMKIHN0YXRpYyBwdWRfdCBibV9wdWRbUFRSU19QRVJfUFVEXSBfX3BhZ2VfYWxpZ25lZF9ic3M7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggZDIzMjg4OC4uMDM4OGVjZSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9lbGYuaAorKysgYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC04NCw3ICs4NCw3IEBACiAgICB0aGUgbG9hZGVyLiAgV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBvdXQgb2YgdGhlIHdheSBvZiB0aGUgcHJvZ3JhbQogICAgdGhhdCBpdCB3aWxsICJleGVjIiwgYW5kIHRoYXQgdGhlcmUgaXMgc3VmZmljaWVudCByb29tIGZvciB0aGUgYnJrLiAgKi8KIAotI2RlZmluZSBFTEZfRVRfRFlOX0JBU0UgICAgICAgICAoMiAqIFRBU0tfU0laRSAvIDMpCisjZGVmaW5lIEVMRl9FVF9EWU5fQkFTRSAgICAgICAgIChUQVNLX1NJWkUgLyAzICogMikKIAogCiAvKiBUaGlzIHlpZWxkcyBhIG1hc2sgdGhhdCB1c2VyIHByb2dyYW1zIGNhbiB1c2UgdG8gZmlndXJlIG91dCB3aGF0CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggZDU2YWZhOS4uZDRkMzA3OSAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMTcsMTEgKzE3LDkgQEAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KIAogc3RydWN0IHRhc2tfc3RydWN0Owotc3RydWN0IGV4ZWNfZG9tYWluOwogCiBzdHJ1Y3QgdGhyZWFkX2luZm8gewogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KIAlfX3UzMgkJCWNwdTsKIAlfX3MzMgkJCXByZWVtcHRfY291bnQ7CS8qIDAgPT4gcHJlZW1wdGFibGUsIDwwID0+IEJVRyAqLwpAQCAtMzYsNyArMzQsNiBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQkJCQlcCiB7CQkJCQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJCQkJXAotCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAkJCQlcCiAJLmZsYWdzCQk9IDAsCQkJCQkJXAogCS5jcHUJCT0gMCwJCQkJCQlcCiAJLnByZWVtcHRfY291bnQJPSBJTklUX1BSRUVNUFRfQ09VTlQsCQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGU0MWM4NDUuLjJjOTc2NGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMTIsNyArMTIsNiBAQAogdm9pZCBmb28odm9pZCkKIHsKIAlPRkZTRVQoVElfdGFzaywgdGhyZWFkX2luZm8sIHRhc2spOwotCU9GRlNFVChUSV9leGVjX2RvbWFpbiwgdGhyZWFkX2luZm8sIGV4ZWNfZG9tYWluKTsKIAlPRkZTRVQoVElfZmxhZ3MsIHRocmVhZF9pbmZvLCBmbGFncyk7CiAJT0ZGU0VUKFRJX2NwdSwgdGhyZWFkX2luZm8sIGNwdSk7CiAJT0ZGU0VUKFRJX3ByZWVtcHRfY291bnQsIHRocmVhZF9pbmZvLCBwcmVlbXB0X2NvdW50KTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvYmxhY2tmaW4vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCA1N2MzYThiLi4yOTY2YjkzIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9ibGFja2Zpbi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0zNyw3ICszNyw2IEBACiAKIHN0cnVjdCB0aHJlYWRfaW5mbyB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwkvKiBtYWluIHRhc2sgc3RydWN0dXJlICovCi0Jc3RydWN0IGV4ZWNfZG9tYWluICpleGVjX2RvbWFpbjsJLyogZXhlY3V0aW9uIGRvbWFpbiAqLwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CS8qIGxvdyBsZXZlbCBmbGFncyAqLwogCWludCBjcHU7CQkvKiBjcHUgd2UncmUgb24gKi8KIAlpbnQgcHJlZW1wdF9jb3VudDsJLyogMCA9PiBwcmVlbXB0YWJsZSwgPDAgPT4gQlVHICovCkBAIC01Myw3ICs1Miw2IEBACiAjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKIHsJCQkJCQlcCiAJLnRhc2sJCT0gJnRzaywJCQlcCi0JLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKIAkuZmxhZ3MJCT0gMCwJCQlcCiAJLmNwdQkJPSAwLAkJCVwKIAkucHJlZW1wdF9jb3VudAk9IElOSVRfUFJFRU1QVF9DT1VOVCwJXApAQCAtNzYsMTUgKzc0LDYgQEAKICNlbmRpZgkJCQkvKiBfX0FTU0VNQkxZX18gKi8KIAogLyoKLSAqIE9mZnNldHMgaW4gdGhyZWFkX2luZm8gc3RydWN0dXJlLCB1c2VkIGluIGFzc2VtYmx5IGNvZGUKLSAqLwotI2RlZmluZSBUSV9UQVNLCQkwCi0jZGVmaW5lIFRJX0VYRUNET01BSU4JNAotI2RlZmluZSBUSV9GTEFHUwk4Ci0jZGVmaW5lIFRJX0NQVQkJMTIKLSNkZWZpbmUgVElfUFJFRU1QVAkxNgotCi0vKgogICogdGhyZWFkIGluZm9ybWF0aW9uIGZsYWcgYml0IG51bWJlcnMKICAqLwogI2RlZmluZSBUSUZfU1lTQ0FMTF9UUkFDRQkwCS8qIHN5c2NhbGwgdHJhY2UgYWN0aXZlICovCmRpZmYgLS1naXQgYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAzN2ZjYWU5Li40ODY1NjBhIDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTQyLDYgKzQyLDEyIEBACiAJREVGSU5FKFRIUkVBRF9QQywgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9zdHJ1Y3QsIHBjKSk7CiAJREVGSU5FKEtFUk5FTF9TVEFDS19TSVpFLCBUSFJFQURfU0laRSk7CiAKKwkvKiBvZmZzZXRzIGluIHRocmVhZF9pbmZvIHN0cnVjdCAqLworCU9GRlNFVChUSV9UQVNLLCB0aHJlYWRfaW5mbywgdGFzayk7CisJT0ZGU0VUKFRJX0ZMQUdTLCB0aHJlYWRfaW5mbywgZmxhZ3MpOworCU9GRlNFVChUSV9DUFUsIHRocmVhZF9pbmZvLCBjcHUpOworCU9GRlNFVChUSV9QUkVFTVBULCB0aHJlYWRfaW5mbywgcHJlZW1wdF9jb3VudCk7CisKIAkvKiBvZmZzZXRzIGludG8gdGhlIHB0X3JlZ3MgKi8KIAlERUZJTkUoUFRfT1JJR19SMCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIG9yaWdfcjApKTsKIAlERUZJTkUoUFRfT1JJR19QMCwgb2Zmc2V0b2Yoc3RydWN0IHB0X3JlZ3MsIG9yaWdfcDApKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3NpZ25hbC5jIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggZjJhOGI1NC4uZWE1NzBkYiAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvc2lnbmFsLmMKQEAgLTE1MSwxMSArMTUxLDcgQEAKIAogCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGtzaWcsIHNpemVvZigqZnJhbWUpKTsKIAotCWVyciB8PSBfX3B1dF91c2VyKChjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCi0JCQkgICAmJiBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwCi0JCQkgICAmJiBrc2lnLT5zaWcgPCAzMgotCQkJICAgPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT4KLQkJCSAgIHNpZ25hbF9pbnZtYXBba3NpZy0+c2lnXSA6IGtzaWctPnNpZyksICZmcmFtZS0+c2lnKTsKKwllcnIgfD0gX19wdXRfdXNlcihrc2lnLT5zaWcsICZmcmFtZS0+c2lnKTsKIAogCWVyciB8PSBfX3B1dF91c2VyKCZmcmFtZS0+aW5mbywgJmZyYW1lLT5waW5mbyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT51YywgJmZyYW1lLT5wdWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3RyYXBzLmMKaW5kZXggZGU1YzJjMy4uMWVkODVkZCAxMDA2NDQKLS0tIGEvYXJjaC9ibGFja2Zpbi9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL2JsYWNrZmluL2tlcm5lbC90cmFwcy5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8YXNtL2ZpeGVkX2NvZGUuaD4KICNpbmNsdWRlIDxhc20vcHNldWRvX2luc3RydWN0aW9ucy5oPgogI2luY2x1ZGUgPGFzbS9wZGEuaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KIAogI2lmZGVmIENPTkZJR19LR0RCCiAjIGluY2x1ZGUgPGxpbnV4L2tnZGIuaD4KZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMgYi9hcmNoL2JsYWNrZmluL21hY2gtY29tbW9uL3NtcC5jCmluZGV4IDhhZDNlOTAuLjFjNzI1OTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYmxhY2tmaW4vbWFjaC1jb21tb24vc21wLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9tYWNoLWNvbW1vbi9zbXAuYwpAQCAtNDEzLDE2ICs0MTMsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihjcHVfa2lsbGVkKTsKLQogaW50IF9fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCXJldHVybiB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNwdV9raWxsZWQsIDUwMDApOworCXJldHVybiBjcHVfd2FpdF9kZWF0aChjcHUsIDUpOwogfQogCiB2b2lkIGNwdV9kaWUodm9pZCkKIHsKLQljb21wbGV0ZSgmY3B1X2tpbGxlZCk7CisJKHZvaWQpY3B1X3JlcG9ydF9kZWF0aCgpOwogCiAJYXRvbWljX2RlYygmaW5pdF9tbS5tbV91c2Vycyk7CiAJYXRvbWljX2RlYygmaW5pdF9tbS5tbV9jb3VudCk7CmRpZmYgLS1naXQgYS9hcmNoL2M2eC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9jNngvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCA1ODRlMjUzLi5hY2M3MGMxIDEwMDY0NAotLS0gYS9hcmNoL2M2eC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvYzZ4L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTQwLDcgKzQwLDYgQEAKICAqLwogc3RydWN0IHRocmVhZF9pbmZvIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CQkvKiBtYWluIHRhc2sgc3RydWN0dXJlICovCi0Jc3RydWN0IGV4ZWNfZG9tYWluCSpleGVjX2RvbWFpbjsJLyogZXhlY3V0aW9uIGRvbWFpbiAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogbG93IGxldmVsIGZsYWdzICovCiAJaW50CQkJY3B1OwkJLyogY3B1IHdlJ3JlIG9uICovCiAJaW50CQkJcHJlZW1wdF9jb3VudDsJLyogMCA9IHByZWVtcHRhYmxlLCA8MCA9IEJVRyAqLwpAQCAtNTUsNyArNTQsNiBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCiB7CQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJXAotCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAlcCiAJLmZsYWdzCQk9IDAsCQkJXAogCS5jcHUJCT0gMCwJCQlcCiAJLnByZWVtcHRfY291bnQJPSBJTklUX1BSRUVNUFRfQ09VTlQsCVwKZGlmZiAtLWdpdCBhL2FyY2gvYzZ4L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2M2eC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDU3ZDJlYTguLjNhZTlmNWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYzZ4L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9jNngva2VybmVsL3Byb2Nlc3MuYwpAQCAtMTAxLDcgKzEwMSw2IEBACiAJICovCiAJdXNwIC09IDg7CiAKLQlzZXRfZnMoVVNFUl9EUyk7CiAJcmVncy0+cGMgID0gcGM7CiAJcmVncy0+c3AgID0gdXNwOwogCXJlZ3MtPnRzciB8PSAweDQwOyAvKiBzZXQgdXNlciBtb2RlICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2Zhc3R0aW1lci5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9mYXN0dGltZXIuYwppbmRleCA0OGE1OWFmLi5lOTI5ODczIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2Zhc3R0aW1lci5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvZmFzdHRpbWVyLmMKQEAgLTUyNyw3ICs1MjcsOCBAQAogCQkJaSA9IGRlYnVnX2xvZ19jbnQ7CiAKIAkJd2hpbGUgKGkgIT0gZW5kX2kgfHwgZGVidWdfbG9nX2NudF93cmFwcGVkKSB7Ci0JCQlpZiAoc2VxX3ByaW50ZihtLCBkZWJ1Z19sb2dfc3RyaW5nW2ldLCBkZWJ1Z19sb2dfdmFsdWVbaV0pIDwgMCkKKwkJCXNlcV9wcmludGYobSwgZGVidWdfbG9nX3N0cmluZ1tpXSwgZGVidWdfbG9nX3ZhbHVlW2ldKTsKKwkJCWlmIChzZXFfaGFzX292ZXJmbG93ZWQobSkpCiAJCQkJcmV0dXJuIDA7CiAJCQlpID0gKGkrMSkgJSBERUJVR19MT0dfTUFYOwogCQl9CkBAIC01NDIsMjQgKzU0MywyMiBAQAogCQlpbnQgY3VyID0gKGZhc3RfdGltZXJzX3N0YXJ0ZWQgLSBpIC0gMSkgJSBOVU1fVElNRVJfU1RBVFM7CiAKICNpZiAxIC8vbmRlZiBGQVNUX1RJTUVSX0xPRwotCQlzZXFfcHJpbnRmKG0sICJkaXY6ICVpIGZyZXE6ICVpIGRlbGF5OiAlaSIKLQkJCSAgICJcbiIsCisJCXNlcV9wcmludGYobSwgImRpdjogJWkgZnJlcTogJWkgZGVsYXk6ICVpXG4iLAogCQkJICAgdGltZXJfZGl2X3NldHRpbmdzW2N1cl0sCiAJCQkgICB0aW1lcl9mcmVxX3NldHRpbmdzW2N1cl0sCiAJCQkgICB0aW1lcl9kZWxheV9zZXR0aW5nc1tjdXJdKTsKICNlbmRpZgogI2lmZGVmIEZBU1RfVElNRVJfTE9HCiAJCXQgPSAmdGltZXJfc3RhcnRlZF9sb2dbY3VyXTsKLQkJaWYgKHNlcV9wcmludGYobSwgIiUtMTRzIHM6ICU2bHUuJTA2bHUgZTogJTZsdS4lMDZsdSAiCi0JCQkgICAgICAgImQ6ICU2bGkgdXMgZGF0YTogMHglMDhsWCIKLQkJCSAgICAgICAiXG4iLAotCQkJICAgICAgIHQtPm5hbWUsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X2ppZmYsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X3VzZWMsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl9qaWZmLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfdXNlYywKLQkJCSAgICAgICB0LT5kZWxheV91cywKLQkJCSAgICAgICB0LT5kYXRhKSA8IDApCisJCXNlcV9wcmludGYobSwgIiUtMTRzIHM6ICU2bHUuJTA2bHUgZTogJTZsdS4lMDZsdSBkOiAlNmxpIHVzIGRhdGE6IDB4JTA4bFhcbiIsCisJCQkgICB0LT5uYW1lLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X2ppZmYsCisJCQkgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfdXNlYywKKwkJCSAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfamlmZiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfdXNlYywKKwkJCSAgIHQtPmRlbGF5X3VzLAorCQkJICAgdC0+ZGF0YSk7CisJCWlmIChzZXFfaGFzX292ZXJmbG93ZWQobSkpCiAJCQlyZXR1cm4gMDsKICNlbmRpZgogCX0KQEAgLTU3MSwxNiArNTcwLDE1IEBACiAJc2VxX3ByaW50ZihtLCAiVGltZXJzIGFkZGVkOiAlaVxuIiwgZmFzdF90aW1lcnNfYWRkZWQpOwogCWZvciAoaSA9IDA7IGkgPCBudW1fdG9fc2hvdzsgaSsrKSB7CiAJCXQgPSAmdGltZXJfYWRkZWRfbG9nWyhmYXN0X3RpbWVyc19hZGRlZCAtIGkgLSAxKSAlIE5VTV9USU1FUl9TVEFUU107Ci0JCWlmIChzZXFfcHJpbnRmKG0sICIlLTE0cyBzOiAlNmx1LiUwNmx1IGU6ICU2bHUuJTA2bHUgIgotCQkJICAgICAgICJkOiAlNmxpIHVzIGRhdGE6IDB4JTA4bFgiCi0JCQkgICAgICAgIlxuIiwKLQkJCSAgICAgICB0LT5uYW1lLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl9qaWZmLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl91c2VjLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfamlmZiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X3VzZWMsCi0JCQkgICAgICAgdC0+ZGVsYXlfdXMsCi0JCQkgICAgICAgdC0+ZGF0YSkgPCAwKQorCQlzZXFfcHJpbnRmKG0sICIlLTE0cyBzOiAlNmx1LiUwNmx1IGU6ICU2bHUuJTA2bHUgZDogJTZsaSB1cyBkYXRhOiAweCUwOGxYXG4iLAorCQkJICAgdC0+bmFtZSwKKwkJCSAgICh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl9qaWZmLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X3VzZWMsCisJCQkgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X2ppZmYsCisJCQkgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X3VzZWMsCisJCQkgICB0LT5kZWxheV91cywKKwkJCSAgIHQtPmRhdGEpOworCQlpZiAoc2VxX2hhc19vdmVyZmxvd2VkKG0pKQogCQkJcmV0dXJuIDA7CiAJfQogCXNlcV9wdXRjKG0sICdcbicpOwpAQCAtNTkwLDE2ICs1ODgsMTUgQEAKIAlzZXFfcHJpbnRmKG0sICJUaW1lcnMgZXhwaXJlZDogJWlcbiIsIGZhc3RfdGltZXJzX2V4cGlyZWQpOwogCWZvciAoaSA9IDA7IGkgPCBudW1fdG9fc2hvdzsgaSsrKSB7CiAJCXQgPSAmdGltZXJfZXhwaXJlZF9sb2dbKGZhc3RfdGltZXJzX2V4cGlyZWQgLSBpIC0gMSkgJSBOVU1fVElNRVJfU1RBVFNdOwotCQlpZiAoc2VxX3ByaW50ZihtLCAiJS0xNHMgczogJTZsdS4lMDZsdSBlOiAlNmx1LiUwNmx1ICIKLQkJCSAgICAgICAiZDogJTZsaSB1cyBkYXRhOiAweCUwOGxYIgotCQkJICAgICAgICJcbiIsCi0JCQkgICAgICAgdC0+bmFtZSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfamlmZiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfdXNlYywKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X2ppZmYsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl91c2VjLAotCQkJICAgICAgIHQtPmRlbGF5X3VzLAotCQkJICAgICAgIHQtPmRhdGEpIDwgMCkKKwkJc2VxX3ByaW50ZihtLCAiJS0xNHMgczogJTZsdS4lMDZsdSBlOiAlNmx1LiUwNmx1IGQ6ICU2bGkgdXMgZGF0YTogMHglMDhsWFxuIiwKKwkJCSAgIHQtPm5hbWUsCisJCQkgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfamlmZiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl91c2VjLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl9qaWZmLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl91c2VjLAorCQkJICAgdC0+ZGVsYXlfdXMsCisJCQkgICB0LT5kYXRhKTsKKwkJaWYgKHNlcV9oYXNfb3ZlcmZsb3dlZChtKSkKIAkJCXJldHVybiAwOwogCX0KIAlzZXFfcHV0YyhtLCAnXG4nKTsKQEAgLTYxMSwxOSArNjA4LDE1IEBACiAJd2hpbGUgKHQpIHsKIAkJbmV4dHQgPSB0LT5uZXh0OwogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCWlmIChzZXFfcHJpbnRmKG0sICIlLTE0cyBzOiAlNmx1LiUwNmx1IGU6ICU2bHUuJTA2bHUgIgotCQkJICAgICAgICJkOiAlNmxpIHVzIGRhdGE6IDB4JTA4bFgiCi0vKiAgICAgICAgICAgICAgICAgICAgICAiIGZ1bmM6IDB4JTA4bFgiICovCi0JCQkgICAgICAgIlxuIiwKLQkJCSAgICAgICB0LT5uYW1lLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl9qaWZmLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl91c2VjLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfamlmZiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X3VzZWMsCi0JCQkgICAgICAgdC0+ZGVsYXlfdXMsCi0JCQkgICAgICAgdC0+ZGF0YQotLyogICAgICAgICAgICAgICAgICAgICAgLCB0LT5mdW5jdGlvbiAqLwotCQkJICAgICAgICkgPCAwKQorCQlzZXFfcHJpbnRmKG0sICIlLTE0cyBzOiAlNmx1LiUwNmx1IGU6ICU2bHUuJTA2bHUgZDogJTZsaSB1cyBkYXRhOiAweCUwOGxYXG4iLAorCQkJICAgdC0+bmFtZSwKKwkJCSAgICh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl9qaWZmLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X3VzZWMsCisJCQkgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X2ppZmYsCisJCQkgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X3VzZWMsCisJCQkgICB0LT5kZWxheV91cywKKwkJCSAgIHQtPmRhdGEpOworCQlpZiAoc2VxX2hhc19vdmVyZmxvd2VkKG0pKQogCQkJcmV0dXJuIDA7CiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJaWYgKHQtPm5leHQgIT0gbmV4dHQpCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3NldHVwLmMgYi9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3NldHVwLmMKaW5kZXggNGY5NmQ3MS4uN2FiMzFmMSAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvc2V0dXAuYwpAQCAtNjMsMzUgKzYzLDM3IEBACiAJZWxzZQogCQlpbmZvID0gJmNwdV9pbmZvW3JldmlzaW9uXTsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sCi0JCSAgICAgICAicHJvY2Vzc29yXHQ6IDBcbiIgCi0JCSAgICAgICAiY3B1XHRcdDogQ1JJU1xuIgotCQkgICAgICAgImNwdSByZXZpc2lvblx0OiAlbHVcbiIKLQkJICAgICAgICJjcHUgbW9kZWxcdDogJXNcbiIKLQkJICAgICAgICJjYWNoZSBzaXplXHQ6ICVkIGtCXG4iCi0JCSAgICAgICAiZnB1XHRcdDogJXNcbiIKLQkJICAgICAgICJtbXVcdFx0OiAlc1xuIgotCQkgICAgICAgIm1tdSBETUEgYnVnXHQ6ICVzXG4iCi0JCSAgICAgICAiZXRoZXJuZXRcdDogJXMgTWJwc1xuIgotCQkgICAgICAgInRva2VuIHJpbmdcdDogJXNcbiIKLQkJICAgICAgICJzY3NpXHRcdDogJXNcbiIKLQkJICAgICAgICJhdGFcdFx0OiAlc1xuIgotCQkgICAgICAgInVzYlx0XHQ6ICVzXG4iCi0JCSAgICAgICAiYm9nb21pcHNcdDogJWx1LiUwMmx1XG4iLAorCXNlcV9wcmludGYobSwKKwkJICAgInByb2Nlc3Nvclx0OiAwXG4iCisJCSAgICJjcHVcdFx0OiBDUklTXG4iCisJCSAgICJjcHUgcmV2aXNpb25cdDogJWx1XG4iCisJCSAgICJjcHUgbW9kZWxcdDogJXNcbiIKKwkJICAgImNhY2hlIHNpemVcdDogJWQga0JcbiIKKwkJICAgImZwdVx0XHQ6ICVzXG4iCisJCSAgICJtbXVcdFx0OiAlc1xuIgorCQkgICAibW11IERNQSBidWdcdDogJXNcbiIKKwkJICAgImV0aGVybmV0XHQ6ICVzIE1icHNcbiIKKwkJICAgInRva2VuIHJpbmdcdDogJXNcbiIKKwkJICAgInNjc2lcdFx0OiAlc1xuIgorCQkgICAiYXRhXHRcdDogJXNcbiIKKwkJICAgInVzYlx0XHQ6ICVzXG4iCisJCSAgICJib2dvbWlwc1x0OiAlbHUuJTAybHVcbiIsCiAKLQkJICAgICAgIHJldmlzaW9uLAotCQkgICAgICAgaW5mby0+bW9kZWwsCi0JCSAgICAgICBpbmZvLT5jYWNoZSwKLQkJICAgICAgIGluZm8tPmZsYWdzICYgSEFTX0ZQVSA/ICJ5ZXMiIDogIm5vIiwKLQkJICAgICAgIGluZm8tPmZsYWdzICYgSEFTX01NVSA/ICJ5ZXMiIDogIm5vIiwKLQkJICAgICAgIGluZm8tPmZsYWdzICYgSEFTX01NVV9CVUcgPyAieWVzIiA6ICJubyIsCi0JCSAgICAgICBpbmZvLT5mbGFncyAmIEhBU19FVEhFUk5FVDEwMCA/ICIxMC8xMDAiIDogIjEwIiwKLQkJICAgICAgIGluZm8tPmZsYWdzICYgSEFTX1RPS0VOUklORyA/ICI0LzE2IE1icHMiIDogIm5vIiwKLQkJICAgICAgIGluZm8tPmZsYWdzICYgSEFTX1NDU0kgPyAieWVzIiA6ICJubyIsCi0JCSAgICAgICBpbmZvLT5mbGFncyAmIEhBU19BVEEgPyAieWVzIiA6ICJubyIsCi0JCSAgICAgICBpbmZvLT5mbGFncyAmIEhBU19VU0IgPyAieWVzIiA6ICJubyIsCi0JCSAgICAgICAobG9vcHNfcGVyX2ppZmZ5ICogSFogKyA1MDApIC8gNTAwMDAwLAotCQkgICAgICAgKChsb29wc19wZXJfamlmZnkgKiBIWiArIDUwMCkgLyA1MDAwKSAlIDEwMCk7CisJCSAgIHJldmlzaW9uLAorCQkgICBpbmZvLT5tb2RlbCwKKwkJICAgaW5mby0+Y2FjaGUsCisJCSAgIGluZm8tPmZsYWdzICYgSEFTX0ZQVSA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgaW5mby0+ZmxhZ3MgJiBIQVNfTU1VID8gInllcyIgOiAibm8iLAorCQkgICBpbmZvLT5mbGFncyAmIEhBU19NTVVfQlVHID8gInllcyIgOiAibm8iLAorCQkgICBpbmZvLT5mbGFncyAmIEhBU19FVEhFUk5FVDEwMCA/ICIxMC8xMDAiIDogIjEwIiwKKwkJICAgaW5mby0+ZmxhZ3MgJiBIQVNfVE9LRU5SSU5HID8gIjQvMTYgTWJwcyIgOiAibm8iLAorCQkgICBpbmZvLT5mbGFncyAmIEhBU19TQ1NJID8gInllcyIgOiAibm8iLAorCQkgICBpbmZvLT5mbGFncyAmIEhBU19BVEEgPyAieWVzIiA6ICJubyIsCisJCSAgIGluZm8tPmZsYWdzICYgSEFTX1VTQiA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgKGxvb3BzX3Blcl9qaWZmeSAqIEhaICsgNTAwKSAvIDUwMDAwMCwKKwkJICAgKChsb29wc19wZXJfamlmZnkgKiBIWiArIDUwMCkgLyA1MDAwKSAlIDEwMCk7CisKKwlyZXR1cm4gMDsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9zaWduYWwuYwppbmRleCA3NGQ3YmEzLi43MTIyZDk3IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvc2lnbmFsLmMKQEAgLTMyMSw4ICszMjEsNiBAQAogCWlmIChlcnIpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JLyogVE9ETyB3aGF0IGlzIHRoZSBjdXJyZW50LT5leGVjX2RvbWFpbiBzdHVmZiBhbmQgaW52bWFwID8gKi8KLQogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCiAKIAkvKiBXaGF0IHdlIGVudGVyIE5PVyAgICovCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2Zhc3R0aW1lci5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9mYXN0dGltZXIuYwppbmRleCBiMTMwYzJjLi41Yzg0ZGJiIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2Zhc3R0aW1lci5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvZmFzdHRpbWVyLmMKQEAgLTUwMSw3ICs1MDEsOCBAQAogCQkJaSA9IGRlYnVnX2xvZ19jbnQ7CiAKIAkJd2hpbGUgKChpICE9IGVuZF9pIHx8IGRlYnVnX2xvZ19jbnRfd3JhcHBlZCkpIHsKLQkJCWlmIChzZXFfcHJpbnRmKG0sIGRlYnVnX2xvZ19zdHJpbmdbaV0sIGRlYnVnX2xvZ192YWx1ZVtpXSkgPCAwKQorCQkJc2VxX3ByaW50ZihtLCBkZWJ1Z19sb2dfc3RyaW5nW2ldLCBkZWJ1Z19sb2dfdmFsdWVbaV0pOworCQkJaWYgKHNlcV9oYXNfb3ZlcmZsb3dlZChtKSkKIAkJCQlyZXR1cm4gMDsKIAkJCWkgPSAoaSsxKSAlIERFQlVHX0xPR19NQVg7CiAJCX0KQEAgLTUxNiwyMyArNTE3LDIxIEBACiAJCWludCBjdXIgPSAoZmFzdF90aW1lcnNfc3RhcnRlZCAtIGkgLSAxKSAlIE5VTV9USU1FUl9TVEFUUzsKIAogI2lmIDEgLy9uZGVmIEZBU1RfVElNRVJfTE9HCi0JCXNlcV9wcmludGYobSwgImRpdjogJWkgZGVsYXk6ICVpIgotCQkJICAgIlxuIiwKKwkJc2VxX3ByaW50ZihtLCAiZGl2OiAlaSBkZWxheTogJWlcbiIsCiAJCQkgICB0aW1lcl9kaXZfc2V0dGluZ3NbY3VyXSwKIAkJCSAgIHRpbWVyX2RlbGF5X3NldHRpbmdzW2N1cl0pOwogI2VuZGlmCiAjaWZkZWYgRkFTVF9USU1FUl9MT0cKIAkJdCA9ICZ0aW1lcl9zdGFydGVkX2xvZ1tjdXJdOwotCQlpZiAoc2VxX3ByaW50ZihtLCAiJS0xNHMgczogJTZsdS4lMDZsdSBlOiAlNmx1LiUwNmx1ICIKLQkJCSAgICAgICAiZDogJTZsaSB1cyBkYXRhOiAweCUwOGxYIgotCQkJICAgICAgICJcbiIsCi0JCQkgICAgICAgdC0+bmFtZSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfamlmZiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfdXNlYywKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X2ppZmYsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl91c2VjLAotCQkJICAgICAgIHQtPmRlbGF5X3VzLAotCQkJICAgICAgIHQtPmRhdGEpIDwgMCkKKwkJc2VxX3ByaW50ZihtLCAiJS0xNHMgczogJTZsdS4lMDZsdSBlOiAlNmx1LiUwNmx1IGQ6ICU2bGkgdXMgZGF0YTogMHglMDhsWFxuIiwKKwkJCSAgIHQtPm5hbWUsCisJCQkgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfamlmZiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl91c2VjLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl9qaWZmLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl91c2VjLAorCQkJICAgdC0+ZGVsYXlfdXMsCisJCQkgICB0LT5kYXRhKTsKKwkJaWYgKHNlcV9oYXNfb3ZlcmZsb3dlZChtKSkKIAkJCXJldHVybiAwOwogI2VuZGlmCiAJfQpAQCAtNTQ0LDE2ICs1NDMsMTUgQEAKIAlzZXFfcHJpbnRmKG0sICJUaW1lcnMgYWRkZWQ6ICVpXG4iLCBmYXN0X3RpbWVyc19hZGRlZCk7CiAJZm9yIChpID0gMDsgaSA8IG51bV90b19zaG93OyBpKyspIHsKIAkJdCA9ICZ0aW1lcl9hZGRlZF9sb2dbKGZhc3RfdGltZXJzX2FkZGVkIC0gaSAtIDEpICUgTlVNX1RJTUVSX1NUQVRTXTsKLQkJaWYgKHNlcV9wcmludGYobSwgIiUtMTRzIHM6ICU2bHUuJTA2bHUgZTogJTZsdS4lMDZsdSAiCi0JCQkgICAgICAgImQ6ICU2bGkgdXMgZGF0YTogMHglMDhsWCIKLQkJCSAgICAgICAiXG4iLAotCQkJICAgICAgIHQtPm5hbWUsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X2ppZmYsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X3VzZWMsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl9qaWZmLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfdXNlYywKLQkJCSAgICAgICB0LT5kZWxheV91cywKLQkJCSAgICAgICB0LT5kYXRhKSA8IDApCisJCXNlcV9wcmludGYobSwgIiUtMTRzIHM6ICU2bHUuJTA2bHUgZTogJTZsdS4lMDZsdSBkOiAlNmxpIHVzIGRhdGE6IDB4JTA4bFhcbiIsCisJCQkgICB0LT5uYW1lLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X2ppZmYsCisJCQkgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfdXNlYywKKwkJCSAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfamlmZiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfdXNlYywKKwkJCSAgIHQtPmRlbGF5X3VzLAorCQkJICAgdC0+ZGF0YSk7CisJCWlmIChzZXFfaGFzX292ZXJmbG93ZWQobSkpCiAJCQlyZXR1cm4gMDsKIAl9CiAJc2VxX3B1dGMobSwgJ1xuJyk7CkBAIC01NjMsMTYgKzU2MSwxNSBAQAogCXNlcV9wcmludGYobSwgIlRpbWVycyBleHBpcmVkOiAlaVxuIiwgZmFzdF90aW1lcnNfZXhwaXJlZCk7CiAJZm9yIChpID0gMDsgaSA8IG51bV90b19zaG93OyBpKyspewogCQl0ID0gJnRpbWVyX2V4cGlyZWRfbG9nWyhmYXN0X3RpbWVyc19leHBpcmVkIC0gaSAtIDEpICUgTlVNX1RJTUVSX1NUQVRTXTsKLQkJaWYgKHNlcV9wcmludGYobSwgIiUtMTRzIHM6ICU2bHUuJTA2bHUgZTogJTZsdS4lMDZsdSAiCi0JCQkgICAgICAgImQ6ICU2bGkgdXMgZGF0YTogMHglMDhsWCIKLQkJCSAgICAgICAiXG4iLAotCQkJICAgICAgIHQtPm5hbWUsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X2ppZmYsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X3VzZWMsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl9qaWZmLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfdXNlYywKLQkJCSAgICAgICB0LT5kZWxheV91cywKLQkJCSAgICAgICB0LT5kYXRhKSA8IDApCisJCXNlcV9wcmludGYobSwgIiUtMTRzIHM6ICU2bHUuJTA2bHUgZTogJTZsdS4lMDZsdSBkOiAlNmxpIHVzIGRhdGE6IDB4JTA4bFhcbiIsCisJCQkgICB0LT5uYW1lLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfc2V0LnR2X2ppZmYsCisJCQkgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfdXNlYywKKwkJCSAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfamlmZiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKXQtPnR2X2V4cGlyZXMudHZfdXNlYywKKwkJCSAgIHQtPmRlbGF5X3VzLAorCQkJICAgdC0+ZGF0YSk7CisJCWlmIChzZXFfaGFzX292ZXJmbG93ZWQobSkpCiAJCQlyZXR1cm4gMDsKIAl9CiAJc2VxX3B1dGMobSwgJ1xuJyk7CkBAIC01ODQsMTkgKzU4MSwxNSBAQAogCXdoaWxlICh0ICE9IE5VTEwpewogCQluZXh0dCA9IHQtPm5leHQ7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJaWYgKHNlcV9wcmludGYobSwgIiUtMTRzIHM6ICU2bHUuJTA2bHUgZTogJTZsdS4lMDZsdSAiCi0JCQkgICAgICAgImQ6ICU2bGkgdXMgZGF0YTogMHglMDhsWCIKLS8qCQkJIiBmdW5jOiAweCUwOGxYIiAqLwotCQkJICAgICAgICJcbiIsCi0JCQkgICAgICAgdC0+bmFtZSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfamlmZiwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfdXNlYywKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyl0LT50dl9leHBpcmVzLnR2X2ppZmYsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl91c2VjLAotCQkJICAgICAgIHQtPmRlbGF5X3VzLAotCQkJICAgICAgIHQtPmRhdGEKLS8qICAgICAgICAgICAgICAgICAgICAgICwgdC0+ZnVuY3Rpb24gKi8KLQkJCSAgICAgICApIDwgMCkKKwkJc2VxX3ByaW50ZihtLCAiJS0xNHMgczogJTZsdS4lMDZsdSBlOiAlNmx1LiUwNmx1IGQ6ICU2bGkgdXMgZGF0YTogMHglMDhsWFxuIiwKKwkJCSAgIHQtPm5hbWUsCisJCQkgICAodW5zaWduZWQgbG9uZyl0LT50dl9zZXQudHZfamlmZiwKKwkJCSAgICh1bnNpZ25lZCBsb25nKXQtPnR2X3NldC50dl91c2VjLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl9qaWZmLAorCQkJICAgKHVuc2lnbmVkIGxvbmcpdC0+dHZfZXhwaXJlcy50dl91c2VjLAorCQkJICAgdC0+ZGVsYXlfdXMsCisJCQkgICB0LT5kYXRhKTsKKwkJaWYgKHNlcV9oYXNfb3ZlcmZsb3dlZChtKSkKIAkJCXJldHVybiAwOwogCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCWlmICh0LT5uZXh0ICE9IG5leHR0KQpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zZXR1cC5jCmluZGV4IDYxZTEwYWUuLjgxNzE1YzYgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NldHVwLmMKQEAgLTc3LDM2ICs3NywzOCBAQAogCQl9CiAJfQogCi0JcmV0dXJuIHNlcV9wcmludGYobSwKLQkJInByb2Nlc3Nvclx0OiAlZFxuIgotCQkiY3B1XHRcdDogQ1JJU1xuIgotCQkiY3B1IHJldmlzaW9uXHQ6ICVsdVxuIgotCQkiY3B1IG1vZGVsXHQ6ICVzXG4iCi0JCSJjYWNoZSBzaXplXHQ6ICVkIEtCXG4iCi0JCSJmcHVcdFx0OiAlc1xuIgotCQkibW11XHRcdDogJXNcbiIKLQkJIm1tdSBETUEgYnVnXHQ6ICVzXG4iCi0JCSJldGhlcm5ldFx0OiAlcyBNYnBzXG4iCi0JCSJ0b2tlbiByaW5nXHQ6ICVzXG4iCi0JCSJzY3NpXHRcdDogJXNcbiIKLQkJImF0YVx0XHQ6ICVzXG4iCi0JCSJ1c2JcdFx0OiAlc1xuIgotCQkiYm9nb21pcHNcdDogJWx1LiUwMmx1XG5cbiIsCisJc2VxX3ByaW50ZihtLAorCQkgICAicHJvY2Vzc29yXHQ6ICVkXG4iCisJCSAgICJjcHVcdFx0OiBDUklTXG4iCisJCSAgICJjcHUgcmV2aXNpb25cdDogJWx1XG4iCisJCSAgICJjcHUgbW9kZWxcdDogJXNcbiIKKwkJICAgImNhY2hlIHNpemVcdDogJWQgS0JcbiIKKwkJICAgImZwdVx0XHQ6ICVzXG4iCisJCSAgICJtbXVcdFx0OiAlc1xuIgorCQkgICAibW11IERNQSBidWdcdDogJXNcbiIKKwkJICAgImV0aGVybmV0XHQ6ICVzIE1icHNcbiIKKwkJICAgInRva2VuIHJpbmdcdDogJXNcbiIKKwkJICAgInNjc2lcdFx0OiAlc1xuIgorCQkgICAiYXRhXHRcdDogJXNcbiIKKwkJICAgInVzYlx0XHQ6ICVzXG4iCisJCSAgICJib2dvbWlwc1x0OiAlbHUuJTAybHVcblxuIiwKIAotCQljcHUsCi0JCXJldmlzaW9uLAotCQlpbmZvLT5jcHVfbW9kZWwsCi0JCWluZm8tPmNhY2hlX3NpemUsCi0JCWluZm8tPmZsYWdzICYgSEFTX0ZQVSA/ICJ5ZXMiIDogIm5vIiwKLQkJaW5mby0+ZmxhZ3MgJiBIQVNfTU1VID8gInllcyIgOiAibm8iLAotCQlpbmZvLT5mbGFncyAmIEhBU19NTVVfQlVHID8gInllcyIgOiAibm8iLAotCQlpbmZvLT5mbGFncyAmIEhBU19FVEhFUk5FVDEwMCA/ICIxMC8xMDAiIDogIjEwIiwKLQkJaW5mby0+ZmxhZ3MgJiBIQVNfVE9LRU5SSU5HID8gIjQvMTYgTWJwcyIgOiAibm8iLAotCQlpbmZvLT5mbGFncyAmIEhBU19TQ1NJID8gInllcyIgOiAibm8iLAotCQlpbmZvLT5mbGFncyAmIEhBU19BVEEgPyAieWVzIiA6ICJubyIsCi0JCWluZm8tPmZsYWdzICYgSEFTX1VTQiA/ICJ5ZXMiIDogIm5vIiwKLQkJKGxvb3BzX3Blcl9qaWZmeSAqIEhaICsgNTAwKSAvIDUwMDAwMCwKLQkJKChsb29wc19wZXJfamlmZnkgKiBIWiArIDUwMCkgLyA1MDAwKSAlIDEwMCk7CisJCSAgIGNwdSwKKwkJICAgcmV2aXNpb24sCisJCSAgIGluZm8tPmNwdV9tb2RlbCwKKwkJICAgaW5mby0+Y2FjaGVfc2l6ZSwKKwkJICAgaW5mby0+ZmxhZ3MgJiBIQVNfRlBVID8gInllcyIgOiAibm8iLAorCQkgICBpbmZvLT5mbGFncyAmIEhBU19NTVUgPyAieWVzIiA6ICJubyIsCisJCSAgIGluZm8tPmZsYWdzICYgSEFTX01NVV9CVUcgPyAieWVzIiA6ICJubyIsCisJCSAgIGluZm8tPmZsYWdzICYgSEFTX0VUSEVSTkVUMTAwID8gIjEwLzEwMCIgOiAiMTAiLAorCQkgICBpbmZvLT5mbGFncyAmIEhBU19UT0tFTlJJTkcgPyAiNC8xNiBNYnBzIiA6ICJubyIsCisJCSAgIGluZm8tPmZsYWdzICYgSEFTX1NDU0kgPyAieWVzIiA6ICJubyIsCisJCSAgIGluZm8tPmZsYWdzICYgSEFTX0FUQSA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgaW5mby0+ZmxhZ3MgJiBIQVNfVVNCID8gInllcyIgOiAibm8iLAorCQkgICAobG9vcHNfcGVyX2ppZmZ5ICogSFogKyA1MDApIC8gNTAwMDAwLAorCQkgICAoKGxvb3BzX3Blcl9qaWZmeSAqIEhaICsgNTAwKSAvIDUwMDApICUgMTAwKTsKKworCXJldHVybiAwOwogfQogCiAjZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3NpZ25hbC5jCmluZGV4IDg3MGUzZTAuLjBjOWNlOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9zaWduYWwuYwpAQCAtMjg3LDggKzI4Nyw2IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCS8qIFRPRE86IHdoYXQgaXMgdGhlIGN1cnJlbnQtPmV4ZWNfZG9tYWluIHN0dWZmIGFuZCBpbnZtYXAgPyAqLwotCiAJZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT5pbmZvLCAmZnJhbWUtPnBpbmZvKTsKIAllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPnVjLCAmZnJhbWUtPnB1Yyk7CiAJZXJyIHw9IGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgJmtzaWctPmluZm8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCA3Mjg2ZGI1Li40ZWFkMWI0IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMjgsNyArMjgsNiBAQAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIHN0cnVjdCB0aHJlYWRfaW5mbyB7CiAJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogbWFpbiB0YXNrIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBleGVjX2RvbWFpbgkqZXhlY19kb21haW47CS8qIGV4ZWN1dGlvbiBkb21haW4gKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGxvdyBsZXZlbCBmbGFncyAqLwogCV9fdTMyCQkJY3B1OwkJLyogY3VycmVudCBDUFUgKi8KIAlpbnQJCQlwcmVlbXB0X2NvdW50OwkvKiAwID0+IHByZWVtcHRhYmxlLCA8MCA9PiBCVUcgKi8KQEAgLTUwLDcgKzQ5LDYgQEAKICNkZWZpbmUgSU5JVF9USFJFQURfSU5GTyh0c2spCQkJCVwKIHsJCQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJCVwKLQkuZXhlY19kb21haW4JPSAmZGVmYXVsdF9leGVjX2RvbWFpbiwJCVwKIAkuZmxhZ3MJCT0gMCwJCQkJXAogCS5jcHUJCT0gMCwJCQkJXAogCS5wcmVlbXB0X2NvdW50CT0gSU5JVF9QUkVFTVBUX0NPVU5ULAkJXApkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggNmI5MTdmMS4uY2NiYTNiNiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2Zydi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0zMSw3ICszMSw2IEBACiAKIHN0cnVjdCB0aHJlYWRfaW5mbyB7CiAJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogbWFpbiB0YXNrIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBleGVjX2RvbWFpbgkqZXhlY19kb21haW47CS8qIGV4ZWN1dGlvbiBkb21haW4gKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGxvdyBsZXZlbCBmbGFncyAqLwogCXVuc2lnbmVkIGxvbmcJCXN0YXR1czsJCS8qIHRocmVhZC1zeW5jaHJvbm91cyBmbGFncyAqLwogCV9fdTMyCQkJY3B1OwkJLyogY3VycmVudCBDUFUgKi8KQEAgLTU5LDcgKzU4LDYgQEAKICNkZWZpbmUgSU5JVF9USFJFQURfSU5GTyh0c2spCQkJXAogewkJCQkJCVwKIAkudGFzawkJPSAmdHNrLAkJCVwKLQkuZXhlY19kb21haW4JPSAmZGVmYXVsdF9leGVjX2RvbWFpbiwJXAogCS5mbGFncwkJPSAwLAkJCVwKIAkuY3B1CQk9IDAsCQkJXAogCS5wcmVlbXB0X2NvdW50CT0gSU5JVF9QUkVFTVBUX0NPVU5ULAlcCmRpZmYgLS1naXQgYS9hcmNoL2Zydi9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvZnJ2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDQ0NmU4OWQuLjg0MTQyOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvZnJ2L2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0zNCw3ICszNCw2IEBACiB7CiAJLyogb2Zmc2V0cyBpbnRvIHRoZSB0aHJlYWRfaW5mbyBzdHJ1Y3R1cmUgKi8KIAlPRkZTRVQoVElfVEFTSywJCQl0aHJlYWRfaW5mbywgdGFzayk7Ci0JT0ZGU0VUKFRJX0VYRUNfRE9NQUlOLAkJdGhyZWFkX2luZm8sIGV4ZWNfZG9tYWluKTsKIAlPRkZTRVQoVElfRkxBR1MsCQl0aHJlYWRfaW5mbywgZmxhZ3MpOwogCU9GRlNFVChUSV9TVEFUVVMsCQl0aHJlYWRfaW5mbywgc3RhdHVzKTsKIAlPRkZTRVQoVElfQ1BVLAkJCXRocmVhZF9pbmZvLCBjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9mcnYva2VybmVsL3NpZ25hbC5jCmluZGV4IDMzNjcxM2EuLjgyZDVlOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvZnJ2L2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL2Zydi9rZXJuZWwvc2lnbmFsLmMKQEAgLTE3NCwyMiArMTc0LDE0IEBACiBzdGF0aWMgaW50IHNldHVwX2ZyYW1lKHN0cnVjdCBrc2lnbmFsICprc2lnLCBzaWdzZXRfdCAqc2V0KQogewogCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwotCWludCByc2lnLCBzaWcgPSBrc2lnLT5zaWc7Ci0KLQlzZXRfZnMoVVNFUl9EUyk7CisJaW50IHNpZyA9IGtzaWctPnNpZzsKIAogCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKGtzaWcsIHNpemVvZigqZnJhbWUpKTsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyc2lnID0gc2lnOwotCWlmIChzaWcgPCAzMiAmJgotCSAgICBfX2N1cnJlbnRfdGhyZWFkX2luZm8tPmV4ZWNfZG9tYWluICYmCi0JICAgIF9fY3VycmVudF90aHJlYWRfaW5mby0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXApCi0JCXJzaWcgPSBfX2N1cnJlbnRfdGhyZWFkX2luZm8tPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ107Ci0KLQlpZiAoX19wdXRfdXNlcihyc2lnLCAmZnJhbWUtPnNpZykgPCAwKQorCWlmIChfX3B1dF91c2VyKHNpZywgJmZyYW1lLT5zaWcpIDwgMCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlpZiAoc2V0dXBfc2lnY29udGV4dCgmZnJhbWUtPnNjLCBzZXQtPnNpZ1swXSkpCkBAIC0yNTUsMjIgKzI0NywxNCBAQAogc3RhdGljIGludCBzZXR1cF9ydF9mcmFtZShzdHJ1Y3Qga3NpZ25hbCAqa3NpZywgc2lnc2V0X3QgKnNldCkKIHsKIAlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKLQlpbnQgcnNpZywgc2lnID0ga3NpZy0+c2lnOwotCi0Jc2V0X2ZzKFVTRVJfRFMpOworCWludCBzaWcgPSBrc2lnLT5zaWc7CiAKIAlmcmFtZSA9IGdldF9zaWdmcmFtZShrc2lnLCBzaXplb2YoKmZyYW1lKSk7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcnNpZyA9IHNpZzsKLQlpZiAoc2lnIDwgMzIgJiYKLQkgICAgX19jdXJyZW50X3RocmVhZF9pbmZvLT5leGVjX2RvbWFpbiAmJgotCSAgICBfX2N1cnJlbnRfdGhyZWFkX2luZm8tPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwKQotCQlyc2lnID0gX19jdXJyZW50X3RocmVhZF9pbmZvLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddOwotCi0JaWYgKF9fcHV0X3VzZXIocnNpZywJCSZmcmFtZS0+c2lnKSB8fAorCWlmIChfX3B1dF91c2VyKHNpZywJCSZmcmFtZS0+c2lnKSB8fAogCSAgICBfX3B1dF91c2VyKCZmcmFtZS0+aW5mbywJJmZyYW1lLT5waW5mbykgfHwKIAkgICAgX19wdXRfdXNlcigmZnJhbWUtPnVjLAkmZnJhbWUtPnB1YykpCiAJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS12ZGsuYyBiL2FyY2gvZnJ2L21iOTMwOTAtbWIwMC9wY2ktdmRrLmMKaW5kZXggYjA3M2Y0ZC4uZjIxMTgzOSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvbWI5MzA5MC1tYjAwL3BjaS12ZGsuYworKysgYi9hcmNoL2Zydi9tYjkzMDkwLW1iMDAvcGNpLXZkay5jCkBAIC0zMTYsNiArMzE2LDcgQEAKIAogaW50IF9faW5pdCBwY2liaW9zX2luaXQodm9pZCkKIHsKKwlzdHJ1Y3QgcGNpX2J1cyAqYnVzOwogCXN0cnVjdCBwY2lfb3BzICpkaXIgPSBOVUxMOwogCUxJU1RfSEVBRChyZXNvdXJjZXMpOwogCkBAIC0zODMsMTIgKzM4NCwxNSBAQAogCXByaW50aygiUENJOiBQcm9iaW5nIFBDSSBoYXJkd2FyZVxuIik7CiAJcGNpX2FkZF9yZXNvdXJjZSgmcmVzb3VyY2VzLCAmcGNpX2lvcG9ydF9yZXNvdXJjZSk7CiAJcGNpX2FkZF9yZXNvdXJjZSgmcmVzb3VyY2VzLCAmcGNpX2lvbWVtX3Jlc291cmNlKTsKLQlwY2lfc2Nhbl9yb290X2J1cyhOVUxMLCAwLCBwY2lfcm9vdF9vcHMsIE5VTEwsICZyZXNvdXJjZXMpOworCWJ1cyA9IHBjaV9zY2FuX3Jvb3RfYnVzKE5VTEwsIDAsIHBjaV9yb290X29wcywgTlVMTCwgJnJlc291cmNlcyk7CiAKIAlwY2liaW9zX2lycV9pbml0KCk7CiAJcGNpYmlvc19maXh1cF9pcnFzKCk7CiAJcGNpYmlvc19yZXNvdXJjZV9zdXJ2ZXkoKTsKKwlpZiAoIWJ1cykKKwkJcmV0dXJuIDA7CiAKKwlwY2lfYnVzX2FkZF9kZXZpY2VzKGJ1cyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaGV4YWdvbi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggYmFjZDNkNi4uYjgwZmUxZCAxMDA2NDQKLS0tIGEvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9oZXhhZ29uL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTQ3LDcgKzQ3LDYgQEAKIAogc3RydWN0IHRocmVhZF9pbmZvIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CQkvKiBtYWluIHRhc2sgc3RydWN0dXJlICovCi0Jc3RydWN0IGV4ZWNfZG9tYWluICAgICAgKmV4ZWNfZG9tYWluOyAgIC8qIGV4ZWN1dGlvbiBkb21haW4gKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsgICAgICAgICAgLyogbG93IGxldmVsIGZsYWdzICovCiAJX191MzIgICAgICAgICAgICAgICAgICAgY3B1OyAgICAgICAgICAgIC8qIGN1cnJlbnQgY3B1ICovCiAJaW50ICAgICAgICAgICAgICAgICAgICAgcHJlZW1wdF9jb3VudDsgIC8qIDA9PnByZWVtcHRpYmxlLDwwPT5CVUcgKi8KQEAgLTc3LDcgKzc2LDYgQEAKICNkZWZpbmUgSU5JVF9USFJFQURfSU5GTyh0c2spICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkudGFzayAgICAgICAgICAgPSAmdHNrLCAgICAgICAgICAgICAgICAgXAotCS5leGVjX2RvbWFpbiAgICA9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLCBcCiAJLmZsYWdzICAgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgIFwKIAkuY3B1ICAgICAgICAgICAgPSAwLCAgICAgICAgICAgICAgICAgICAgXAogCS5wcmVlbXB0X2NvdW50ICA9IDEsICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9hcmNoL2hleGFnb24va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDBhMGRkNWMuLmE5ZWJkNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvaGV4YWdvbi9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvaGV4YWdvbi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zNyw4ICszNyw2IEBACiAgKi8KIHZvaWQgc3RhcnRfdGhyZWFkKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nIHNwKQogewotCS8qIFNldCB0byBydW4gd2l0aCB1c2VyLW1vZGUgZGF0YSBzZWdtZW50YXRpb24gKi8KLQlzZXRfZnMoVVNFUl9EUyk7CiAJLyogV2Ugd2FudCB0byB6ZXJvIGFsbCBkYXRhLWNvbnRhaW5pbmcgcmVnaXN0ZXJzLiBJcyB0aGlzIG92ZXJraWxsPyAqLwogCW1lbXNldChyZWdzLCAwLCBzaXplb2YoKnJlZ3MpKTsKIAkvKiBXZSBtaWdodCB3YW50IHRvIGFsc28gemVybyBhbGwgUHJvY2Vzc29yIHJlZ2lzdGVycyBoZXJlICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvS2NvbmZpZyBiL2FyY2gvaWE2NC9LY29uZmlnCmluZGV4IDA3NGU1MmIuLjRmOWE2NjYgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9LY29uZmlnCkBAIC0xLDMgKzEsOCBAQAorY29uZmlnIFBHVEFCTEVfTEVWRUxTCisJaW50ICJQYWdlIFRhYmxlIExldmVscyIgaWYgIUlBNjRfUEFHRV9TSVpFXzY0S0IKKwlyYW5nZSAzIDQgaWYgIUlBNjRfUEFHRV9TSVpFXzY0S0IKKwlkZWZhdWx0IDMKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAia2VybmVsL0tjb25maWcuZnJlZXplciIKQEAgLTI4NiwxOSArMjkxLDYgQEAKIAogZW5kY2hvaWNlCiAKLWNob2ljZQotCXByb21wdCAiUGFnZSBUYWJsZSBMZXZlbHMiCi0JZGVmYXVsdCBQR1RBQkxFXzMKLQotY29uZmlnIFBHVEFCTEVfMwotCWJvb2wgIjMgTGV2ZWxzIgotCi1jb25maWcgUEdUQUJMRV80Ci0JZGVwZW5kcyBvbiAhSUE2NF9QQUdFX1NJWkVfNjRLQgotCWJvb2wgIjQgTGV2ZWxzIgotCi1lbmRjaG9pY2UKLQogaWYgSUE2NF9IUF9TSU0KIGNvbmZpZyBIWgogCWRlZmF1bHQgMzIKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGFnZS5oCmluZGV4IDFmMWJmMTQuLmVjNDhiYjkgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtMTczLDcgKzE3Myw3IEBACiAgICAqLwogICB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcHRlOyB9IHB0ZV90OwogICB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcG1kOyB9IHBtZF90OwotI2lmZGVmIENPTkZJR19QR1RBQkxFXzQKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gNAogICB0eXBlZGVmIHN0cnVjdCB7IHVuc2lnbmVkIGxvbmcgcHVkOyB9IHB1ZF90OwogI2VuZGlmCiAgIHR5cGVkZWYgc3RydWN0IHsgdW5zaWduZWQgbG9uZyBwZ2Q7IH0gcGdkX3Q7CkBAIC0xODIsNyArMTgyLDcgQEAKIAogIyBkZWZpbmUgcHRlX3ZhbCh4KQkoKHgpLnB0ZSkKICMgZGVmaW5lIHBtZF92YWwoeCkJKCh4KS5wbWQpCi0jaWZkZWYgQ09ORklHX1BHVEFCTEVfNAorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0CiAjIGRlZmluZSBwdWRfdmFsKHgpCSgoeCkucHVkKQogI2VuZGlmCiAjIGRlZmluZSBwZ2RfdmFsKHgpCSgoeCkucGdkKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BnYWxsb2MuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKaW5kZXggNTc2N2NkZi4uZjVlNzBlOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BnYWxsb2MuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGdhbGxvYy5oCkBAIC0zMiw3ICszMiw3IEBACiAJcXVpY2tsaXN0X2ZyZWUoMCwgTlVMTCwgcGdkKTsKIH0KIAotI2lmZGVmIENPTkZJR19QR1RBQkxFXzQKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gNAogc3RhdGljIGlubGluZSB2b2lkCiBwZ2RfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICogcGdkX2VudHJ5LCBwdWRfdCAqIHB1ZCkKIHsKQEAgLTQ5LDcgKzQ5LDcgQEAKIAlxdWlja2xpc3RfZnJlZSgwLCBOVUxMLCBwdWQpOwogfQogI2RlZmluZSBfX3B1ZF9mcmVlX3RsYih0bGIsIHB1ZCwgYWRkcmVzcykJcHVkX2ZyZWUoKHRsYiktPm1tLCBwdWQpCi0jZW5kaWYgLyogQ09ORklHX1BHVEFCTEVfNCAqLworI2VuZGlmIC8qIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0ICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogcHVkX3BvcHVsYXRlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdWRfdCAqIHB1ZF9lbnRyeSwgcG1kX3QgKiBwbWQpCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCA3YjZmODgwLi45ZjNlZDllIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTk5LDcgKzk5LDcgQEAKICNkZWZpbmUgUE1EX01BU0sJKH4oUE1EX1NJWkUtMSkpCiAjZGVmaW5lIFBUUlNfUEVSX1BNRAkoMVVMIDw8IChQVFJTX1BFUl9QVERfU0hJRlQpKQogCi0jaWZkZWYgQ09ORklHX1BHVEFCTEVfNAorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0CiAvKgogICogRGVmaW5pdGlvbnMgZm9yIHNlY29uZCBsZXZlbDoKICAqCkBAIC0xMTcsNyArMTE3LDcgQEAKICAqCiAgKiBQR0RJUl9TSElGVCBkZXRlcm1pbmVzIHdoYXQgYSBmaXJzdC1sZXZlbCBwYWdlIHRhYmxlIGVudHJ5IGNhbiBtYXAuCiAgKi8KLSNpZmRlZiBDT05GSUdfUEdUQUJMRV80CisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKICNkZWZpbmUgUEdESVJfU0hJRlQJCShQVURfU0hJRlQgKyAoUFRSU19QRVJfUFREX1NISUZUKSkKICNlbHNlCiAjZGVmaW5lIFBHRElSX1NISUZUCQkoUE1EX1NISUZUICsgKFBUUlNfUEVSX1BURF9TSElGVCkpCkBAIC0xODAsNyArMTgwLDcgQEAKICNkZWZpbmUgX19TMTExCV9fcGdwcm90KF9fQUNDRVNTX0JJVFMgfCBfUEFHRV9QTF8zIHwgX1BBR0VfQVJfUldYKQogCiAjZGVmaW5lIHBnZF9FUlJPUihlKQlwcmludGsoIiVzOiVkOiBiYWQgcGdkICUwMTZseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcGdkX3ZhbChlKSkKLSNpZmRlZiBDT05GSUdfUEdUQUJMRV80CisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKICNkZWZpbmUgcHVkX0VSUk9SKGUpCXByaW50aygiJXM6JWQ6IGJhZCBwdWQgJTAxNmx4LlxuIiwgX19GSUxFX18sIF9fTElORV9fLCBwdWRfdmFsKGUpKQogI2VuZGlmCiAjZGVmaW5lIHBtZF9FUlJPUihlKQlwcmludGsoIiVzOiVkOiBiYWQgcG1kICUwMTZseC5cbiIsIF9fRklMRV9fLCBfX0xJTkVfXywgcG1kX3ZhbChlKSkKQEAgLTI4MSw3ICsyODEsNyBAQAogI2RlZmluZSBwdWRfcGFnZV92YWRkcihwdWQpCQkoKHVuc2lnbmVkIGxvbmcpIF9fdmEocHVkX3ZhbChwdWQpICYgX1BGTl9NQVNLKSkKICNkZWZpbmUgcHVkX3BhZ2UocHVkKQkJCXZpcnRfdG9fcGFnZSgocHVkX3ZhbChwdWQpICsgUEFHRV9PRkZTRVQpKQogCi0jaWZkZWYgQ09ORklHX1BHVEFCTEVfNAorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0CiAjZGVmaW5lIHBnZF9ub25lKHBnZCkJCQkoIXBnZF92YWwocGdkKSkKICNkZWZpbmUgcGdkX2JhZChwZ2QpCQkJKCFpYTY0X3BoeXNfYWRkcl92YWxpZChwZ2RfdmFsKHBnZCkpKQogI2RlZmluZSBwZ2RfcHJlc2VudChwZ2QpCQkocGdkX3ZhbChwZ2QpICE9IDBVTCkKQEAgLTM4NCw3ICszODQsNyBAQAogICAgaGVyZS4gICovCiAjZGVmaW5lIHBnZF9vZmZzZXRfZ2F0ZShtbSwgYWRkcikJcGdkX29mZnNldF9rKGFkZHIpCiAKLSNpZmRlZiBDT05GSUdfUEdUQUJMRV80CisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKIC8qIEZpbmQgYW4gZW50cnkgaW4gdGhlIHNlY29uZC1sZXZlbCBwYWdlIHRhYmxlLi4gKi8KICNkZWZpbmUgcHVkX29mZnNldChkaXIsYWRkcikgXAogCSgocHVkX3QgKikgcGdkX3BhZ2VfdmFkZHIoKihkaXIpKSArICgoKGFkZHIpID4+IFBVRF9TSElGVCkgJiAoUFRSU19QRVJfUFVEIC0gMSkpKQpAQCAtNTg2LDcgKzU4Niw3IEBACiAjZGVmaW5lIF9fSEFWRV9BUkNIX1BHRF9PRkZTRVRfR0FURQogCiAKLSNpZm5kZWYgQ09ORklHX1BHVEFCTEVfNAorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSAzCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS1ub3B1ZC5oPgogI2VuZGlmCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCBjMTZmMjFhLi5hYTk5NWI2IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMjAsNyArMjAsNiBAQAogICovCiBzdHJ1Y3QgdGhyZWFkX2luZm8gewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsJLyogWFhYIG5vdCByZWFsbHkgbmVlZGVkLCBleGNlcHQgZm9yIGR1cF90YXNrX3N0cnVjdCgpICovCi0Jc3RydWN0IGV4ZWNfZG9tYWluICpleGVjX2RvbWFpbjsvKiBleGVjdXRpb24gZG9tYWluICovCiAJX191MzIgZmxhZ3M7CQkJLyogdGhyZWFkX2luZm8gZmxhZ3MgKHNlZSBUSUZfKikgKi8KIAlfX3UzMiBjcHU7CQkJLyogY3VycmVudCBDUFUgKi8KIAlfX3UzMiBsYXN0X2NwdTsJCQkvKiBMYXN0IENQVSB0aHJlYWQgcmFuIG9uICovCkBAIC00MCw3ICszOSw2IEBACiAjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKIHsJCQkJCQlcCiAJLnRhc2sJCT0gJnRzaywJCQlcCi0JLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKIAkuZmxhZ3MJCT0gMCwJCQlcCiAJLmNwdQkJPSAwLAkJCVwKIAkuYWRkcl9saW1pdAk9IEtFUk5FTF9EUywJCVwKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlCmluZGV4IDIwNjc4YTkuLmQ2OGI1Y2YgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9NYWtlZmlsZQpAQCAtNTEsNyArNTEsNyBAQAogQ0ZMQUdTX3RyYXBzLm8gICs9IC1tZml4ZWQtcmFuZ2U9ZjItZjUsZjE2LWYzMQogCiAjIFRoZSBnYXRlIERTTyBpbWFnZSBpcyBidWlsdCB1c2luZyBhIHNwZWNpYWwgbGlua2VyIHNjcmlwdC4KLWluY2x1ZGUgJChzcmN0cmVlKS9hcmNoL2lhNjQva2VybmVsL01ha2VmaWxlLmdhdGUKK2luY2x1ZGUgJChzcmMpL01ha2VmaWxlLmdhdGUKICMgdGVsbCBjb21waWxlZCBmb3IgbmF0aXZlCiBDUFBGTEFHU19nYXRlLmxkcyArPSAtRF9fSUE2NF9HQVRFX1BBUkFWSVJUVUFMSVpFRF9OQVRJVkUKIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2tlcm5lbC9pdnQuUyBiL2FyY2gvaWE2NC9rZXJuZWwvaXZ0LlMKaW5kZXggMThlNzk0YS4uZTQyYmY3YSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pdnQuUworKysgYi9hcmNoL2lhNjQva2VybmVsL2l2dC5TCkBAIC0xNDYsNyArMTQ2LDcgQEAKIChwNikJZGVwIHIxNz1yMTgscjE5LDMsKFBBR0VfU0hJRlQtMykJLy8gcjE3PXBnZF9vZmZzZXQgZm9yIHJlZ2lvbiA1CiAocDcpCWRlcCByMTc9cjE4LHIxNywzLChQQUdFX1NISUZULTYpCS8vIHIxNz1wZ2Rfb2Zmc2V0IGZvciByZWdpb25bMC00XQogCWNtcC5lcSBwNyxwNj0wLHIyMQkJCS8vIHVudXNlZCBhZGRyZXNzIGJpdHMgYWxsIHplcm9lcz8KLSNpZmRlZiBDT05GSUdfUEdUQUJMRV80CisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKIAlzaHIudSByMjg9cjIyLFBVRF9TSElGVAkJCS8vIHNoaWZ0IHB1ZCBpbmRleCBpbnRvIHBvc2l0aW9uCiAjZWxzZQogCXNoci51IHIxOD1yMjIsUE1EX1NISUZUCQkJLy8gc2hpZnQgcG1kIGluZGV4IGludG8gcG9zaXRpb24KQEAgLTE1NSw3ICsxNTUsNyBAQAogCWxkOCByMTc9W3IxN10JCQkJLy8gZ2V0ICpwZ2QgKG1heSBiZSAwKQogCTs7CiAocDcpCWNtcC5lcSBwNixwNz1yMTcscjAJCQkvLyB3YXMgcGdkX3ByZXNlbnQoKnBnZCkgPT0gTlVMTD8KLSNpZmRlZiBDT05GSUdfUEdUQUJMRV80CisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKIAlkZXAgcjI4PXIyOCxyMTcsMywoUEFHRV9TSElGVC0zKQkvLyByMjg9cHVkX29mZnNldChwZ2QsYWRkcikKIAk7OwogCXNoci51IHIxOD1yMjIsUE1EX1NISUZUCQkJLy8gc2hpZnQgcG1kIGluZGV4IGludG8gcG9zaXRpb24KQEAgLTIyMiwxMyArMjIyLDEzIEBACiAJICovCiAJbGQ4IHIyNT1bcjIxXQkJCQkvLyByZWFkICpwdGUgYWdhaW4KIAlsZDggcjI2PVtyMTddCQkJCS8vIHJlYWQgKnBtZCBhZ2FpbgotI2lmZGVmIENPTkZJR19QR1RBQkxFXzQKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gNAogCWxkOCByMTk9W3IyOF0JCQkJLy8gcmVhZCAqcHVkIGFnYWluCiAjZW5kaWYKIAljbXAubmUgcDYscDc9cjAscjAKIAk7OwogCWNtcC5uZS5vci5hbmRjbSBwNixwNz1yMjYscjIwCQkvLyBkaWQgKnBtZCBjaGFuZ2UKLSNpZmRlZiBDT05GSUdfUEdUQUJMRV80CisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKIAljbXAubmUub3IuYW5kY20gcDYscDc9cjE5LHIyOQkJLy8gZGlkICpwdWQgY2hhbmdlCiAjZW5kaWYKIAltb3YgcjI3PVBBR0VfU0hJRlQ8PDIKQEAgLTQ3Niw3ICs0NzYsNyBAQAogKHA2KQlkZXAgcjE3PXIxOCxyMTksMywoUEFHRV9TSElGVC0zKQkvLyByMTc9cGdkX29mZnNldCBmb3IgcmVnaW9uIDUKIChwNykJZGVwIHIxNz1yMTgscjE3LDMsKFBBR0VfU0hJRlQtNikJLy8gcjE3PXBnZF9vZmZzZXQgZm9yIHJlZ2lvblswLTRdCiAJY21wLmVxIHA3LHA2PTAscjIxCQkJLy8gdW51c2VkIGFkZHJlc3MgYml0cyBhbGwgemVyb2VzPwotI2lmZGVmIENPTkZJR19QR1RBQkxFXzQKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gNAogCXNoci51IHIxOD1yMjIsUFVEX1NISUZUCQkJLy8gc2hpZnQgcHVkIGluZGV4IGludG8gcG9zaXRpb24KICNlbHNlCiAJc2hyLnUgcjE4PXIyMixQTURfU0hJRlQJCQkvLyBzaGlmdCBwbWQgaW5kZXggaW50byBwb3NpdGlvbgpAQCAtNDg3LDcgKzQ4Nyw3IEBACiAocDcpCWNtcC5lcSBwNixwNz1yMTcscjAJCQkvLyB3YXMgcGdkX3ByZXNlbnQoKnBnZCkgPT0gTlVMTD8KIAlkZXAgcjE3PXIxOCxyMTcsMywoUEFHRV9TSElGVC0zKQkvLyByMTc9cFt1fG1dZF9vZmZzZXQocGdkLGFkZHIpCiAJOzsKLSNpZmRlZiBDT05GSUdfUEdUQUJMRV80CisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKIChwNykJbGQ4IHIxNz1bcjE3XQkJCQkvLyBnZXQgKnB1ZCAobWF5IGJlIDApCiAJc2hyLnUgcjE4PXIyMixQTURfU0hJRlQJCQkvLyBzaGlmdCBwbWQgaW5kZXggaW50byBwb3NpdGlvbgogCTs7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL21hY2hpbmVfa2V4ZWMuYyBiL2FyY2gvaWE2NC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCmluZGV4IDUxNTFhNjQuLmI3MmNkN2EgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCkBAIC0xNTYsOSArMTU2LDkgQEAKIAlWTUNPUkVJTkZPX09GRlNFVChub2RlX21lbWJsa19zLCBzdGFydF9wYWRkcik7CiAJVk1DT1JFSU5GT19PRkZTRVQobm9kZV9tZW1ibGtfcywgc2l6ZSk7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfUEdUQUJMRV8zCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDMKIAlWTUNPUkVJTkZPX0NPTkZJRyhQR1RBQkxFXzMpOwotI2VsaWYgZGVmaW5lZChDT05GSUdfUEdUQUJMRV80KQorI2VsaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKIAlWTUNPUkVJTkZPX0NPTkZJRyhQR1RBQkxFXzQpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vaW5pdC5jIGIvYXJjaC9pYTY0L21tL2luaXQuYwppbmRleCA2YjMzNDU3Li5hOWI2NWNmIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKQEAgLTY5MiwzMSArNjkyLDYgQEAKICNlbmRpZgogI2VuZGlmCiAKLS8qCi0gKiBFdmVuIHdoZW4gQ09ORklHX0lBMzJfU1VQUE9SVCBpcyBub3QgZW5hYmxlZCBpdCBpcwotICogdXNlZnVsIHRvIGhhdmUgdGhlIExpbnV4L3g4NiBkb21haW4gcmVnaXN0ZXJlZCB0bwotICogYXZvaWQgYW4gYXR0ZW1wdGVkIG1vZHVsZSBsb2FkIHdoZW4gZW11bGF0b3JzIGNhbGwKLSAqIHBlcnNvbmFsaXR5KFBFUl9MSU5VWDMyKS4gVGhpcyBzYXZlcyBzZXZlcmFsIG1pbGxpc2Vjb25kcwotICogb24gZWFjaCBzdWNoIGNhbGwuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZXhlY19kb21haW4gaWEzMl9leGVjX2RvbWFpbjsKLQotc3RhdGljIGludCBfX2luaXQKLXBlcl9saW51eDMyX2luaXQodm9pZCkKLXsKLQlpYTMyX2V4ZWNfZG9tYWluLm5hbWUgPSAiTGludXgveDg2IjsKLQlpYTMyX2V4ZWNfZG9tYWluLmhhbmRsZXIgPSBOVUxMOwotCWlhMzJfZXhlY19kb21haW4ucGVyc19sb3cgPSBQRVJfTElOVVgzMjsKLQlpYTMyX2V4ZWNfZG9tYWluLnBlcnNfaGlnaCA9IFBFUl9MSU5VWDMyOwotCWlhMzJfZXhlY19kb21haW4uc2lnbmFsX21hcCA9IGRlZmF1bHRfZXhlY19kb21haW4uc2lnbmFsX21hcDsKLQlpYTMyX2V4ZWNfZG9tYWluLnNpZ25hbF9pbnZtYXAgPSBkZWZhdWx0X2V4ZWNfZG9tYWluLnNpZ25hbF9pbnZtYXA7Ci0JcmVnaXN0ZXJfZXhlY19kb21haW4oJmlhMzJfZXhlY19kb21haW4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLV9faW5pdGNhbGwocGVyX2xpbnV4MzJfaW5pdCk7Ci0KIC8qKgogICogc2hvd19tZW0gLSBnaXZlIHNob3J0IHN1bW1hcnkgb2YgbWVtb3J5IHN0YXRzCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pb19pbml0LmMgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYwppbmRleCAwYjVjZTgyLi4xYmU2NWViIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lvX2luaXQuYwpAQCAtMjcxLDcgKzI3MSw5IEBACiAgCWlmIChidXMgPT0gTlVMTCkgewogCQlrZnJlZShyZXMpOwogCQlrZnJlZShjb250cm9sbGVyKTsKKwkJcmV0dXJuOwogCX0KKwlwY2lfYnVzX2FkZF9kZXZpY2VzKGJ1cyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL20zMnIvaW5jbHVkZS9hc20vYXNtLW9mZnNldHMuaCBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS9hc20tb2Zmc2V0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzBlZTMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL20zMnIvaW5jbHVkZS9hc20vYXNtLW9mZnNldHMuaApAQCAtMCwwICsxIEBACisjaW5jbHVkZSA8Z2VuZXJhdGVkL2FzbS1vZmZzZXRzLmg+CmRpZmYgLS1naXQgYS9hcmNoL20zMnIvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDMyNDIyZDAuLmY2MzBkOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvbTMyci9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0yNCw3ICsyNCw2IEBACiAKIHN0cnVjdCB0aHJlYWRfaW5mbyB7CiAJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogbWFpbiB0YXNrIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBleGVjX2RvbWFpbgkqZXhlY19kb21haW47CS8qIGV4ZWN1dGlvbiBkb21haW4gKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGxvdyBsZXZlbCBmbGFncyAqLwogCXVuc2lnbmVkIGxvbmcJCXN0YXR1czsJCS8qIHRocmVhZC1zeW5jaHJvbm91cyBmbGFncyAqLwogCV9fdTMyCQkJY3B1OwkJLyogY3VycmVudCBDUFUgKi8KQEAgLTM4LDE4ICszNyw3IEBACiAJX191OAkJCXN1cGVydmlzb3Jfc3RhY2tbMF07CiB9OwogCi0jZWxzZSAvKiAhX19BU1NFTUJMWV9fICovCi0KLS8qIG9mZnNldHMgaW50byB0aGUgdGhyZWFkX2luZm8gc3RydWN0IGZvciBhc3NlbWJseSBjb2RlIGFjY2VzcyAqLwotI2RlZmluZSBUSV9UQVNLCQkweDAwMDAwMDAwCi0jZGVmaW5lIFRJX0VYRUNfRE9NQUlOCTB4MDAwMDAwMDQKLSNkZWZpbmUgVElfRkxBR1MJMHgwMDAwMDAwOAotI2RlZmluZSBUSV9TVEFUVVMJMHgwMDAwMDAwQwotI2RlZmluZSBUSV9DUFUJCTB4MDAwMDAwMTAKLSNkZWZpbmUgVElfUFJFX0NPVU5UCTB4MDAwMDAwMTQKLSNkZWZpbmUgVElfQUREUl9MSU1JVAkweDAwMDAwMDE4Ci0KLSNlbmRpZgorI2VuZGlmIC8qICFfX0FTU0VNQkxZX18gKi8KIAogI2RlZmluZSBUSFJFQURfU0laRQkJKFBBR0VfU0laRSA8PCAxKQogI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUgkxCkBAIC02MSw3ICs0OSw2IEBACiAjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKIHsJCQkJCQlcCiAJLnRhc2sJCT0gJnRzaywJCQlcCi0JLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKIAkuZmxhZ3MJCT0gMCwJCQlcCiAJLmNwdQkJPSAwLAkJCVwKIAkucHJlZW1wdF9jb3VudAk9IElOSVRfUFJFRU1QVF9DT1VOVCwJXApkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9tMzJyL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDllMjYzMTEuLmNkM2QyZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTMyci9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL20zMnIva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTEgKzEsMTQgQEAKLS8qIER1bW15IGFzbS1vZmZzZXRzLmMgZmlsZS4gUmVxdWlyZWQgYnkga2J1aWxkIGFuZCByZWFkeSB0byBiZSB1c2VkIC0gaGludCEgKi8KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L2tidWlsZC5oPgorCitpbnQgZm9vKHZvaWQpCit7CisJT0ZGU0VUKFRJX1RBU0ssIHRocmVhZF9pbmZvLCB0YXNrKTsKKwlPRkZTRVQoVElfRkxBR1MsIHRocmVhZF9pbmZvLCBmbGFncyk7CisJT0ZGU0VUKFRJX1NUQVRVUywgdGhyZWFkX2luZm8sIHN0YXR1cyk7CisJT0ZGU0VUKFRJX0NQVSwgdGhyZWFkX2luZm8sIGNwdSk7CisJT0ZGU0VUKFRJX1BSRV9DT1VOVCwgdGhyZWFkX2luZm8sIHByZWVtcHRfY291bnQpOworCU9GRlNFVChUSV9BRERSX0xJTUlULCB0aHJlYWRfaW5mbywgYWRkcl9saW1pdCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gvbTMyci9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbTMyci9rZXJuZWwvZW50cnkuUwppbmRleCA3YzNkYjk5Li5jNjM5YmZhIDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9tMzJyL2tlcm5lbC9lbnRyeS5TCkBAIC02NSw2ICs2NSw3IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vbTMyci5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCiAjaWYgIWRlZmluZWQoQ09ORklHX01NVSkKICNkZWZpbmUgc3lzX21hZHZpc2UJCXN5c19uaV9zeXNjYWxsCmRpZmYgLS1naXQgYS9hcmNoL20zMnIva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tMzJyL2tlcm5lbC9zaWduYWwuYwppbmRleCA3NzM2YzY2Li4xYzgxZTI0IDEwMDY0NAotLS0gYS9hcmNoL20zMnIva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbTMyci9rZXJuZWwvc2lnbmFsLmMKQEAgLTE3MiwyMCArMTcyLDE0IEBACiB7CiAJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CiAJaW50IGVyciA9IDA7Ci0JaW50IHNpZ25hbCwgc2lnID0ga3NpZy0+c2lnOworCWludCBzaWcgPSBrc2lnLT5zaWc7CiAKIAlmcmFtZSA9IGdldF9zaWdmcmFtZShrc2lnLCByZWdzLT5zcHUsIHNpemVvZigqZnJhbWUpKTsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlzaWduYWwgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCi0JCSYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKLQkJJiYgc2lnIDwgMzIKLQkJPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ10KLQkJOiBzaWc7Ci0KLQllcnIgfD0gX19wdXRfdXNlcihzaWduYWwsICZmcmFtZS0+c2lnKTsKKwllcnIgfD0gX19wdXRfdXNlcihzaWcsICZmcmFtZS0+c2lnKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gLUVGQVVMVDsKIApAQCAtMjA5LDEzICsyMDMsMTEgQEAKIAogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCiAJcmVncy0+c3B1ID0gKHVuc2lnbmVkIGxvbmcpZnJhbWU7Ci0JcmVncy0+cjAgPSBzaWduYWw7CS8qIEFyZyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwlyZWdzLT5yMCA9IHNpZzsJLyogQXJnIGZvciBzaWduYWwgaGFuZGxlciAqLwogCXJlZ3MtPnIxID0gKHVuc2lnbmVkIGxvbmcpJmZyYW1lLT5pbmZvOwogCXJlZ3MtPnIyID0gKHVuc2lnbmVkIGxvbmcpJmZyYW1lLT51YzsKIAlyZWdzLT5icGMgPSAodW5zaWduZWQgbG9uZylrc2lnLT5rYS5zYS5zYV9oYW5kbGVyOwogCi0Jc2V0X2ZzKFVTRVJfRFMpOwotCiAjaWYgREVCVUdfU0lHCiAJcHJpbnRrKCJTSUcgZGVsaXZlciAoJXM6JWQpOiBzcD0lcCBwYz0lcFxuIiwKIAkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwgcmVncy0+cGMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcgYi9hcmNoL202OGsvS2NvbmZpZwppbmRleCA4N2I3Yzc1Li4yZGQ4ZjYzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvS2NvbmZpZworKysgYi9hcmNoL202OGsvS2NvbmZpZwpAQCAtNjcsNiArNjcsMTAgQEAKIAlkZWZhdWx0IDEwMDAgaWYgQ0xFT1BBVFJBCiAJZGVmYXVsdCAxMDAKIAorY29uZmlnIFBHVEFCTEVfTEVWRUxTCisJZGVmYXVsdCAyIGlmIFNVTjMgfHwgQ09MREZJUkUKKwlkZWZhdWx0IDMKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAia2VybmVsL0tjb25maWcuZnJlZXplciIKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb2xkZmlyZS9wY2kuYyBiL2FyY2gvbTY4ay9jb2xkZmlyZS9wY2kuYwppbmRleCBkZjk2NzkyLi44MjFkZTkyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29sZGZpcmUvcGNpLmMKKysrIGIvYXJjaC9tNjhrL2NvbGRmaXJlL3BjaS5jCkBAIC0zMTMsMTIgKzMxMywxNiBAQAogCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcygyMDApKTsKIAogCXJvb3RidXMgPSBwY2lfc2Nhbl9idXMoMCwgJm1jZl9wY2lfb3BzLCBOVUxMKTsKKwlpZiAoIXJvb3RidXMpCisJCXJldHVybiAtRU5PREVWOworCiAJcm9vdGJ1cy0+cmVzb3VyY2VbMF0gPSAmbWNmX3BjaV9pbzsKIAlyb290YnVzLT5yZXNvdXJjZVsxXSA9ICZtY2ZfcGNpX21lbTsKIAogCXBjaV9maXh1cF9pcnFzKHBjaV9jb21tb25fc3dpenpsZSwgbWNmX3BjaV9tYXBfaXJxKTsKIAlwY2lfYnVzX3NpemVfYnJpZGdlcyhyb290YnVzKTsKIAlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMocm9vdGJ1cyk7CisJcGNpX2J1c19hZGRfZGV2aWNlcyhyb290YnVzKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvYW1pZ2FfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYW1pZ2FfZGVmY29uZmlnCmluZGV4IDFhMTBhMDguLmVkMTY0M2IgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2FtaWdhX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9hbWlnYV9kZWZjb25maWcKQEAgLTUyMSw4ICs1MjEsMTAgQEAKIENPTkZJR19ETE09bQogQ09ORklHX01BR0lDX1NZU1JRPXkKIENPTkZJR19BU1lOQ19SQUlENl9URVNUPW0KK0NPTkZJR19URVNUX0hFWERVTVA9bQogQ09ORklHX1RFU1RfU1RSSU5HX0hFTFBFUlM9bQogQ09ORklHX1RFU1RfS1NUUlRPWD1tCitDT05GSUdfVEVTVF9SSEFTSFRBQkxFPW0KIENPTkZJR19URVNUX0xLTT1tCiBDT05GSUdfVEVTVF9VU0VSX0NPUFk9bQogQ09ORklHX1RFU1RfQlBGPW0KQEAgLTU3Myw1ICs1NzUsNiBAQAogQ09ORklHX0NSWVBUT19EUkJHX0NUUj15CiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9bQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj1tCitDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1JORz1tCiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAogQ09ORklHX1haX0RFQ19URVNUPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2Fwb2xsb19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9hcG9sbG9fZGVmY29uZmlnCmluZGV4IDc4NTlhNzMuLmQzODgyMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2Fwb2xsb19kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYXBvbGxvX2RlZmNvbmZpZwpAQCAtNDc5LDggKzQ3OSwxMCBAQAogQ09ORklHX0RMTT1tCiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0FTWU5DX1JBSUQ2X1RFU1Q9bQorQ09ORklHX1RFU1RfSEVYRFVNUD1tCiBDT05GSUdfVEVTVF9TVFJJTkdfSEVMUEVSUz1tCiBDT05GSUdfVEVTVF9LU1RSVE9YPW0KK0NPTkZJR19URVNUX1JIQVNIVEFCTEU9bQogQ09ORklHX1RFU1RfTEtNPW0KIENPTkZJR19URVNUX1VTRVJfQ09QWT1tCiBDT05GSUdfVEVTVF9CUEY9bQpAQCAtNTMxLDUgKzUzMyw2IEBACiBDT05GSUdfQ1JZUFRPX0RSQkdfQ1RSPXkKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KK0NPTkZJR19DUllQVE9fVVNFUl9BUElfUk5HPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CiBDT05GSUdfWFpfREVDX1RFU1Q9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvYXRhcmlfZGVmY29uZmlnIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYXRhcmlfZGVmY29uZmlnCmluZGV4IDM3MjU5M2EuLmM0MjkxOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL2F0YXJpX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9hdGFyaV9kZWZjb25maWcKQEAgLTUwMSw4ICs1MDEsMTAgQEAKIENPTkZJR19ETE09bQogQ09ORklHX01BR0lDX1NZU1JRPXkKIENPTkZJR19BU1lOQ19SQUlENl9URVNUPW0KK0NPTkZJR19URVNUX0hFWERVTVA9bQogQ09ORklHX1RFU1RfU1RSSU5HX0hFTFBFUlM9bQogQ09ORklHX1RFU1RfS1NUUlRPWD1tCitDT05GSUdfVEVTVF9SSEFTSFRBQkxFPW0KIENPTkZJR19URVNUX0xLTT1tCiBDT05GSUdfVEVTVF9VU0VSX0NPUFk9bQogQ09ORklHX1RFU1RfQlBGPW0KQEAgLTU1Myw1ICs1NTUsNiBAQAogQ09ORklHX0NSWVBUT19EUkJHX0NUUj15CiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX0hBU0g9bQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9TS0NJUEhFUj1tCitDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1JORz1tCiAjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldAogQ09ORklHX1haX0RFQ19URVNUPW0KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9jb25maWdzL2J2bWU2MDAwX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL2J2bWU2MDAwX2RlZmNvbmZpZwppbmRleCBmM2JkMzVlLi45Yjg4MDM3IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9idm1lNjAwMF9kZWZjb25maWcKKysrIGIvYXJjaC9tNjhrL2NvbmZpZ3MvYnZtZTYwMDBfZGVmY29uZmlnCkBAIC00NzIsOCArNDcyLDEwIEBACiBDT05GSUdfRExNPW0KIENPTkZJR19NQUdJQ19TWVNSUT15CiBDT05GSUdfQVNZTkNfUkFJRDZfVEVTVD1tCitDT05GSUdfVEVTVF9IRVhEVU1QPW0KIENPTkZJR19URVNUX1NUUklOR19IRUxQRVJTPW0KIENPTkZJR19URVNUX0tTVFJUT1g9bQorQ09ORklHX1RFU1RfUkhBU0hUQUJMRT1tCiBDT05GSUdfVEVTVF9MS009bQogQ09ORklHX1RFU1RfVVNFUl9DT1BZPW0KIENPTkZJR19URVNUX0JQRj1tCkBAIC01MjQsNSArNTI2LDYgQEAKIENPTkZJR19DUllQVE9fRFJCR19DVFI9eQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQorQ09ORklHX0NSWVBUT19VU0VSX0FQSV9STkc9bQogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKIENPTkZJR19YWl9ERUNfVEVTVD1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9ocDMwMF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9ocDMwMF9kZWZjb25maWcKaW5kZXggOWY5NzkzZi4uNDlhZTMzNyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvaHAzMDBfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL2hwMzAwX2RlZmNvbmZpZwpAQCAtNDgxLDggKzQ4MSwxMCBAQAogQ09ORklHX0RMTT1tCiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0FTWU5DX1JBSUQ2X1RFU1Q9bQorQ09ORklHX1RFU1RfSEVYRFVNUD1tCiBDT05GSUdfVEVTVF9TVFJJTkdfSEVMUEVSUz1tCiBDT05GSUdfVEVTVF9LU1RSVE9YPW0KK0NPTkZJR19URVNUX1JIQVNIVEFCTEU9bQogQ09ORklHX1RFU1RfTEtNPW0KIENPTkZJR19URVNUX1VTRVJfQ09QWT1tCiBDT05GSUdfVEVTVF9CUEY9bQpAQCAtNTMzLDUgKzUzNSw2IEBACiBDT05GSUdfQ1JZUFRPX0RSQkdfQ1RSPXkKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KK0NPTkZJR19DUllQVE9fVVNFUl9BUElfUk5HPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CiBDT05GSUdfWFpfREVDX1RFU1Q9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvbWFjX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL21hY19kZWZjb25maWcKaW5kZXggODlmMjI1Yy4uZWUxNDNhNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvbWFjX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9tYWNfZGVmY29uZmlnCkBAIC01MDMsOCArNTAzLDEwIEBACiBDT05GSUdfRExNPW0KIENPTkZJR19NQUdJQ19TWVNSUT15CiBDT05GSUdfQVNZTkNfUkFJRDZfVEVTVD1tCitDT05GSUdfVEVTVF9IRVhEVU1QPW0KIENPTkZJR19URVNUX1NUUklOR19IRUxQRVJTPW0KIENPTkZJR19URVNUX0tTVFJUT1g9bQorQ09ORklHX1RFU1RfUkhBU0hUQUJMRT1tCiBDT05GSUdfVEVTVF9MS009bQogQ09ORklHX1RFU1RfVVNFUl9DT1BZPW0KIENPTkZJR19URVNUX0JQRj1tCkBAIC01NTUsNSArNTU3LDYgQEAKIENPTkZJR19DUllQVE9fRFJCR19DVFI9eQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQorQ09ORklHX0NSWVBUT19VU0VSX0FQSV9STkc9bQogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKIENPTkZJR19YWl9ERUNfVEVTVD1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9tdWx0aV9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tdWx0aV9kZWZjb25maWcKaW5kZXggZDNjZGI1NC4uYzc3N2FhMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXVsdGlfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL211bHRpX2RlZmNvbmZpZwpAQCAtNTgzLDggKzU4MywxMCBAQAogQ09ORklHX0RMTT1tCiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0FTWU5DX1JBSUQ2X1RFU1Q9bQorQ09ORklHX1RFU1RfSEVYRFVNUD1tCiBDT05GSUdfVEVTVF9TVFJJTkdfSEVMUEVSUz1tCiBDT05GSUdfVEVTVF9LU1RSVE9YPW0KK0NPTkZJR19URVNUX1JIQVNIVEFCTEU9bQogQ09ORklHX1RFU1RfTEtNPW0KIENPTkZJR19URVNUX1VTRVJfQ09QWT1tCiBDT05GSUdfVEVTVF9CUEY9bQpAQCAtNjM1LDUgKzYzNyw2IEBACiBDT05GSUdfQ1JZUFRPX0RSQkdfQ1RSPXkKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KK0NPTkZJR19DUllQVE9fVVNFUl9BUElfUk5HPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CiBDT05GSUdfWFpfREVDX1RFU1Q9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE0N19kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTQ3X2RlZmNvbmZpZwppbmRleCBiNGM3NjY0Li5hNzYyOGE4IDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9tdm1lMTQ3X2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTQ3X2RlZmNvbmZpZwpAQCAtNDcyLDggKzQ3MiwxMCBAQAogQ09ORklHX0RMTT1tCiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0FTWU5DX1JBSUQ2X1RFU1Q9bQorQ09ORklHX1RFU1RfSEVYRFVNUD1tCiBDT05GSUdfVEVTVF9TVFJJTkdfSEVMUEVSUz1tCiBDT05GSUdfVEVTVF9LU1RSVE9YPW0KK0NPTkZJR19URVNUX1JIQVNIVEFCTEU9bQogQ09ORklHX1RFU1RfTEtNPW0KIENPTkZJR19URVNUX1VTRVJfQ09QWT1tCiBDT05GSUdfVEVTVF9CUEY9bQpAQCAtNTI0LDUgKzUyNiw2IEBACiBDT05GSUdfQ1JZUFRPX0RSQkdfQ1RSPXkKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KK0NPTkZJR19DUllQVE9fVVNFUl9BUElfUk5HPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CiBDT05GSUdfWFpfREVDX1RFU1Q9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvbXZtZTE2eF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZwppbmRleCAwZDRhMjZmLi5lYmFhNjgyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9tdm1lMTZ4X2RlZmNvbmZpZwpAQCAtNDcyLDggKzQ3MiwxMCBAQAogQ09ORklHX0RMTT1tCiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0FTWU5DX1JBSUQ2X1RFU1Q9bQorQ09ORklHX1RFU1RfSEVYRFVNUD1tCiBDT05GSUdfVEVTVF9TVFJJTkdfSEVMUEVSUz1tCiBDT05GSUdfVEVTVF9LU1RSVE9YPW0KK0NPTkZJR19URVNUX1JIQVNIVEFCTEU9bQogQ09ORklHX1RFU1RfTEtNPW0KIENPTkZJR19URVNUX1VTRVJfQ09QWT1tCiBDT05GSUdfVEVTVF9CUEY9bQpAQCAtNTI0LDUgKzUyNiw2IEBACiBDT05GSUdfQ1JZUFRPX0RSQkdfQ1RSPXkKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KK0NPTkZJR19DUllQVE9fVVNFUl9BUElfUk5HPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CiBDT05GSUdfWFpfREVDX1RFU1Q9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2NvbmZpZ3MvcTQwX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL3E0MF9kZWZjb25maWcKaW5kZXggNWQ1ODFjNS4uMmMxNjg1MyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3MvcTQwX2RlZmNvbmZpZworKysgYi9hcmNoL202OGsvY29uZmlncy9xNDBfZGVmY29uZmlnCkBAIC0zNDAsNyArMzQwLDcgQEAKICMgQ09ORklHX05FVF9WRU5ET1JfSU5URUwgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1ZFTkRPUl9NQVJWRUxMIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9WRU5ET1JfTUlDUkVMIGlzIG5vdCBzZXQKLUNPTkZJR19ORTIwMDA9bQorQ09ORklHX05FMjAwMD15CiAjIENPTkZJR19ORVRfVkVORE9SX1FVQUxDT01NIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9WRU5ET1JfUk9DS0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9WRU5ET1JfU0FNU1VORyBpcyBub3Qgc2V0CkBAIC00OTQsOCArNDk0LDEwIEBACiBDT05GSUdfRExNPW0KIENPTkZJR19NQUdJQ19TWVNSUT15CiBDT05GSUdfQVNZTkNfUkFJRDZfVEVTVD1tCitDT05GSUdfVEVTVF9IRVhEVU1QPW0KIENPTkZJR19URVNUX1NUUklOR19IRUxQRVJTPW0KIENPTkZJR19URVNUX0tTVFJUT1g9bQorQ09ORklHX1RFU1RfUkhBU0hUQUJMRT1tCiBDT05GSUdfVEVTVF9MS009bQogQ09ORklHX1RFU1RfVVNFUl9DT1BZPW0KIENPTkZJR19URVNUX0JQRj1tCkBAIC01NDYsNSArNTQ4LDYgQEAKIENPTkZJR19DUllQVE9fRFJCR19DVFI9eQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQorQ09ORklHX0NSWVBUT19VU0VSX0FQSV9STkc9bQogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKIENPTkZJR19YWl9ERUNfVEVTVD1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9zdW4zX2RlZmNvbmZpZyBiL2FyY2gvbTY4ay9jb25maWdzL3N1bjNfZGVmY29uZmlnCmluZGV4IGM2YjQ5YTQuLmUzMDU2YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9jb25maWdzL3N1bjNfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL3N1bjNfZGVmY29uZmlnCkBAIC00NzMsOCArNDczLDEwIEBACiBDT05GSUdfRExNPW0KIENPTkZJR19NQUdJQ19TWVNSUT15CiBDT05GSUdfQVNZTkNfUkFJRDZfVEVTVD1tCitDT05GSUdfVEVTVF9IRVhEVU1QPW0KIENPTkZJR19URVNUX1NUUklOR19IRUxQRVJTPW0KIENPTkZJR19URVNUX0tTVFJUT1g9bQorQ09ORklHX1RFU1RfUkhBU0hUQUJMRT1tCiBDT05GSUdfVEVTVF9MS009bQogQ09ORklHX1RFU1RfVVNFUl9DT1BZPW0KIENPTkZJR19URVNUX0JQRj1tCkBAIC01MjQsNSArNTI2LDYgQEAKIENPTkZJR19DUllQVE9fRFJCR19DVFI9eQogQ09ORklHX0NSWVBUT19VU0VSX0FQSV9IQVNIPW0KIENPTkZJR19DUllQVE9fVVNFUl9BUElfU0tDSVBIRVI9bQorQ09ORklHX0NSWVBUT19VU0VSX0FQSV9STkc9bQogIyBDT05GSUdfQ1JZUFRPX0hXIGlzIG5vdCBzZXQKIENPTkZJR19YWl9ERUNfVEVTVD1tCmRpZmYgLS1naXQgYS9hcmNoL202OGsvY29uZmlncy9zdW4zeF9kZWZjb25maWcgYi9hcmNoL202OGsvY29uZmlncy9zdW4zeF9kZWZjb25maWcKaW5kZXggYjY1Nzg1ZS4uNzNjMzZiNyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2NvbmZpZ3Mvc3VuM3hfZGVmY29uZmlnCisrKyBiL2FyY2gvbTY4ay9jb25maWdzL3N1bjN4X2RlZmNvbmZpZwpAQCAtNDczLDggKzQ3MywxMCBAQAogQ09ORklHX0RMTT1tCiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0FTWU5DX1JBSUQ2X1RFU1Q9bQorQ09ORklHX1RFU1RfSEVYRFVNUD1tCiBDT05GSUdfVEVTVF9TVFJJTkdfSEVMUEVSUz1tCiBDT05GSUdfVEVTVF9LU1RSVE9YPW0KK0NPTkZJR19URVNUX1JIQVNIVEFCTEU9bQogQ09ORklHX1RFU1RfTEtNPW0KIENPTkZJR19URVNUX1VTRVJfQ09QWT1tCiBDT05GSUdfVEVTVF9CUEY9bQpAQCAtNTI1LDUgKzUyNyw2IEBACiBDT05GSUdfQ1JZUFRPX0RSQkdfQ1RSPXkKIENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSD1tCiBDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSPW0KK0NPTkZJR19DUllQVE9fVVNFUl9BUElfUk5HPW0KICMgQ09ORklHX0NSWVBUT19IVyBpcyBub3Qgc2V0CiBDT05GSUdfWFpfREVDX1RFU1Q9bQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21jZnFzcGkuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tY2Zxc3BpLmgKaW5kZXggN2I1MTQxNi4uMjU2ZGEwZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21jZnFzcGkuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbWNmcXNwaS5oCkBAIC0xMSwxMSArMTEsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgotICoKICovCiAKICNpZm5kZWYgbWNmcXNwaV9oCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IGM1NDI1NmUuLmNlZTEzYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0yNiw3ICsyNiw2IEBACiBzdHJ1Y3QgdGhyZWFkX2luZm8gewogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJbW1fc2VnbWVudF90CQlhZGRyX2xpbWl0OwkvKiB0aHJlYWQgYWRkcmVzcyBzcGFjZSAqLwogCWludAkJCXByZWVtcHRfY291bnQ7CS8qIDAgPT4gcHJlZW1wdGFibGUsIDwwID0+IEJVRyAqLwogCV9fdTMyCQkJY3B1OwkJLyogc2hvdWxkIGFsd2F5cyBiZSAwIG9uIG02OGsgKi8KQEAgLTM3LDcgKzM2LDYgQEAKICNkZWZpbmUgSU5JVF9USFJFQURfSU5GTyh0c2spCQkJXAogewkJCQkJCVwKIAkudGFzawkJPSAmdHNrLAkJCVwKLQkuZXhlY19kb21haW4JPSAmZGVmYXVsdF9leGVjX2RvbWFpbiwJXAogCS5hZGRyX2xpbWl0CT0gS0VSTkVMX0RTLAkJXAogCS5wcmVlbXB0X2NvdW50CT0gSU5JVF9QUkVFTVBUX0NPVU5ULAlcCiB9CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3BjaWJpb3MuYyBiL2FyY2gvbTY4ay9rZXJuZWwvcGNpYmlvcy5jCmluZGV4IDkzMWEzMWYuLjg1MjAyNTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvcGNpYmlvcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvcGNpYmlvcy5jCkBAIC02Miw3ICs2Miw3IEBACiAKIAkJciA9IGRldi0+cmVzb3VyY2UgKyBpZHg7CiAJCWlmICghci0+c3RhcnQgJiYgci0+ZW5kKSB7Ci0JCQlwcl9lcnIoS0VSTl9FUlIgIlBDSTogRGV2aWNlICVzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSBvZiByZXNvdXJjZSBjb2xsaXNpb25zXG4iLAorCQkJcHJfZXJyKCJQQ0k6IERldmljZSAlcyBub3QgYXZhaWxhYmxlIGJlY2F1c2Ugb2YgcmVzb3VyY2UgY29sbGlzaW9uc1xuIiwKIAkJCQlwY2lfbmFtZShkZXYpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWwuYwppbmRleCBkNzE3OTI4Li5hZjFjNGYzIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsLmMKQEAgLTg2MywxMiArODYzLDcgQEAKIAlpZiAoZnNpemUpCiAJCWVyciB8PSBjb3B5X3RvX3VzZXIgKGZyYW1lICsgMSwgcmVncyArIDEsIGZzaXplKTsKIAotCWVyciB8PSBfX3B1dF91c2VyKChjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCi0JCQkgICAmJiBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwCi0JCQkgICAmJiBzaWcgPCAzMgotCQkJICAgPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ10KLQkJCSAgIDogc2lnKSwKLQkJCSAgJmZyYW1lLT5zaWcpOworCWVyciB8PSBfX3B1dF91c2VyKHNpZywgJmZyYW1lLT5zaWcpOwogCiAJZXJyIHw9IF9fcHV0X3VzZXIocmVncy0+dmVjdG9yLCAmZnJhbWUtPmNvZGUpOwogCWVyciB8PSBfX3B1dF91c2VyKCZmcmFtZS0+c2MsICZmcmFtZS0+cHNjKTsKQEAgLTk0OCwxMiArOTQzLDcgQEAKIAlpZiAoZnNpemUpCiAJCWVyciB8PSBjb3B5X3RvX3VzZXIgKCZmcmFtZS0+dWMudWNfZXh0cmEsIHJlZ3MgKyAxLCBmc2l6ZSk7CiAKLQllcnIgfD0gX19wdXRfdXNlcigoY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbgotCQkJICAgJiYgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcAotCQkJICAgJiYgc2lnIDwgMzIKLQkJCSAgID8gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddCi0JCQkgICA6IHNpZyksCi0JCQkgICZmcmFtZS0+c2lnKTsKKwllcnIgfD0gX19wdXRfdXNlcihzaWcsICZmcmFtZS0+c2lnKTsKIAllcnIgfD0gX19wdXRfdXNlcigmZnJhbWUtPmluZm8sICZmcmFtZS0+cGluZm8pOwogCWVyciB8PSBfX3B1dF91c2VyKCZmcmFtZS0+dWMsICZmcmFtZS0+cHVjKTsKIAllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCAma3NpZy0+aW5mbyk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL2FzaGxkaTMuYyBiL2FyY2gvbTY4ay9saWIvYXNobGRpMy5jCmluZGV4IDc3MjlmMzMuLjM3MjM0YzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9saWIvYXNobGRpMy5jCisrKyBiL2FyY2gvbTY4ay9saWIvYXNobGRpMy5jCkBAIC0xMSwxMiArMTEsNyBAQAogR05VIENDIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggR05VIENDOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICovCiAKICNkZWZpbmUgQklUU19QRVJfVU5JVCA4CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9saWIvYXNocmRpMy5jIGIvYXJjaC9tNjhrL2xpYi9hc2hyZGkzLmMKaW5kZXggMThlYTVmNy4uMWQ1OTM0NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2xpYi9hc2hyZGkzLmMKKysrIGIvYXJjaC9tNjhrL2xpYi9hc2hyZGkzLmMKQEAgLTExLDEyICsxMSw3IEBACiBHTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gKi8KIAogI2RlZmluZSBCSVRTX1BFUl9VTklUIDgKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi9kaXZzaTMuUyBiL2FyY2gvbTY4ay9saWIvZGl2c2kzLlMKaW5kZXggZWMzMDdiNi4uMmMwZWM4NSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2xpYi9kaXZzaTMuUworKysgYi9hcmNoL202OGsvbGliL2RpdnNpMy5TCkBAIC0xOSwxMiArMTksNyBAQAogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gKi8KIAogLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggZmlsZXMKICAgIGNvbXBpbGVkIHdpdGggR0NDIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBkb2VzIG5vdCBjYXVzZQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2xpYi9sc2hyZGkzLmMgYi9hcmNoL202OGsvbGliL2xzaHJkaTMuYwppbmRleCBkMDY0NDJkLi40OWUxZWM4IDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL2xzaHJkaTMuYworKysgYi9hcmNoL202OGsvbGliL2xzaHJkaTMuYwpAQCAtMTEsMTIgKzExLDcgQEAKIEdOVSBDQyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIEdOVSBDQzsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAqLwogCiAjZGVmaW5lIEJJVFNfUEVSX1VOSVQgOAogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL21vZHNpMy5TIGIvYXJjaC9tNjhrL2xpYi9tb2RzaTMuUwppbmRleCBlZjM4NDk0Li4xZDllMGVmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL21vZHNpMy5TCisrKyBiL2FyY2gvbTY4ay9saWIvbW9kc2kzLlMKQEAgLTE5LDEyICsxOSw3IEBACiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAqLwogCiAvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcwogICAgY29tcGlsZWQgd2l0aCBHQ0MgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGRvZXMgbm90IGNhdXNlCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL211bGRpMy5jIGIvYXJjaC9tNjhrL2xpYi9tdWxkaTMuYwppbmRleCBlZTVmMGIxLi45MDA2ZDE1IDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL211bGRpMy5jCisrKyBiL2FyY2gvbTY4ay9saWIvbXVsZGkzLmMKQEAgLTEyLDEyICsxMiw3IEBACiBHTlUgQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi1HTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCBHTlUgQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gKi8KIAogI2lmZGVmIENPTkZJR19DUFVfSEFTX05PX01VTERJVjY0CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9saWIvbXVsc2kzLlMgYi9hcmNoL202OGsvbGliL211bHNpMy5TCmluZGV4IGNlMjllYTMuLmMzOWFkNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9saWIvbXVsc2kzLlMKKysrIGIvYXJjaC9tNjhrL2xpYi9tdWxzaTMuUwpAQCAtMTksMTIgKzE5LDcgQEAKIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi1HZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi1hbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCi10aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCi1Cb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICovCiAKIC8qIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIGlmIHlvdSBsaW5rIHRoaXMgbGlicmFyeSB3aXRoIGZpbGVzCiAgICBjb21waWxlZCB3aXRoIEdDQyB0byBwcm9kdWNlIGFuIGV4ZWN1dGFibGUsIHRoaXMgZG9lcyBub3QgY2F1c2UKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9saWIvdWRpdnNpMy5TIGIvYXJjaC9tNjhrL2xpYi91ZGl2c2kzLlMKaW5kZXggYzQyNGM0YS4uMzVhNTQ0NiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2xpYi91ZGl2c2kzLlMKKysrIGIvYXJjaC9tNjhrL2xpYi91ZGl2c2kzLlMKQEAgLTE5LDEyICsxOSw3IEBACiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotCi1Zb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bwotdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAqLwogCiAvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCBpZiB5b3UgbGluayB0aGlzIGxpYnJhcnkgd2l0aCBmaWxlcwogICAgY29tcGlsZWQgd2l0aCBHQ0MgdG8gcHJvZHVjZSBhbiBleGVjdXRhYmxlLCB0aGlzIGRvZXMgbm90IGNhdXNlCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL3Vtb2RzaTMuUyBiL2FyY2gvbTY4ay9saWIvdW1vZHNpMy5TCmluZGV4IDVkZWY1ZjYuLjA5OWRhNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9saWIvdW1vZHNpMy5TCisrKyBiL2FyY2gvbTY4ay9saWIvdW1vZHNpMy5TCkBAIC0xOSwxMiArMTksNyBAQAogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLUdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KLXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLUJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KK0dlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gKi8KIAogLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgaWYgeW91IGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggZmlsZXMKICAgIGNvbXBpbGVkIHdpdGggR0NDIHRvIHByb2R1Y2UgYW4gZXhlY3V0YWJsZSwgdGhpcyBkb2VzIG5vdCBjYXVzZQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21hYy9vc3MuYyBiL2FyY2gvbTY4ay9tYWMvb3NzLmMKaW5kZXggNTQwMzcxMi4uYmIxMWRjZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21hYy9vc3MuYworKysgYi9hcmNoL202OGsvbWFjL29zcy5jCkBAIC00Nyw5ICs0Nyw4IEBACiAJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cy4gVW5saWtlIGEgVklBIGl0IGxvb2tzIGxpa2Ugd2UgICAgKi8KIAkvKiBkbyB0aGlzIGJ5IHNldHRpbmcgdGhlIHNvdXJjZSdzIGludGVycnVwdCBsZXZlbCB0byB6ZXJvLiAqLwogCi0JZm9yIChpID0gMDsgaSA8PSBPU1NfTlVNX1NPVVJDRVM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBPU1NfTlVNX1NPVVJDRVM7IGkrKykKIAkJb3NzLT5pcnFfbGV2ZWxbaV0gPSAwOwotCX0KIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vaW8uaCBiL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vaW8uaAppbmRleCA5MzU5ZTUwLi5kNTc3OWIwIDEwMDY0NAotLS0gYS9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL2lvLmgKKysrIGIvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS9pby5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfQVNNX01FVEFHX0lPX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUtYml0cy5oPgogCiAjZGVmaW5lIElPX1NQQUNFX0xJTUlUICAwCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vcGd0YWJsZS1iaXRzLmggYi9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3BndGFibGUtYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmE2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3BndGFibGUtYml0cy5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTWV0YSBwYWdlIHRhYmxlIGRlZmluaXRpb25zLgorICovCisKKyNpZm5kZWYgX01FVEFHX1BHVEFCTEVfQklUU19ICisjZGVmaW5lIF9NRVRBR19QR1RBQkxFX0JJVFNfSAorCisjaW5jbHVkZSA8YXNtL21ldGFnX21lbS5oPgorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIE1NVSBkZXNjcmlwdG9ycworICoKKyAqIFRoZXNlIGFyZSB0aGUgaGFyZHdhcmUgYml0cyBpbiB0aGUgTU1DVSBwdGUgZW50cmllcy4KKyAqIERlcml2ZWQgZnJvbSB0aGUgTWV0YSB0b29sa2l0IGhlYWRlcnMuCisgKi8KKyNkZWZpbmUgX1BBR0VfUFJFU0VOVAkJTU1DVV9FTlRSWV9WQUxfQklUCisjZGVmaW5lIF9QQUdFX1dSSVRFCQlNTUNVX0VOVFJZX1dSX0JJVAorI2RlZmluZSBfUEFHRV9QUklWCQlNTUNVX0VOVFJZX1BSSVZfQklUCisvKiBXcml0ZSBjb21iaW5lIGJpdCAtIHRoaXMgY2FuIGNhdXNlIHdyaXRlcyB0byBvY2N1ciBvdXQgb2Ygb3JkZXIgKi8KKyNkZWZpbmUgX1BBR0VfV1JfQ09NQklORQlNTUNVX0VOVFJZX1dSQ19CSVQKKy8qIFN5cyBjb2hlcmVudCBiaXQgLSB0aGlzIGJpdCBpcyBuZXZlciB1c2VkIGJ5IExpbnV4ICovCisjZGVmaW5lIF9QQUdFX1NZU19DT0hFUkVOVAlNTUNVX0VOVFJZX1NZU19CSVQKKyNkZWZpbmUgX1BBR0VfQUxXQVlTX1pFUk9fMQkweDAyMAorI2RlZmluZSBfUEFHRV9DQUNIRV9DVFJMMAkweDA0MAorI2RlZmluZSBfUEFHRV9DQUNIRV9DVFJMMQkweDA4MAorI2RlZmluZSBfUEFHRV9BTFdBWVNfWkVST18yCTB4MTAwCisjZGVmaW5lIF9QQUdFX0FMV0FZU19aRVJPXzMJMHgyMDAKKyNkZWZpbmUgX1BBR0VfQUxXQVlTX1pFUk9fNAkweDQwMAorI2RlZmluZSBfUEFHRV9BTFdBWVNfWkVST181CTB4ODAwCisKKy8qIFRoZXNlIGFyZSBzb2Z0d2FyZSBiaXRzIHRoYXQgd2Ugc3R1ZmYgaW50byB0aGUgZ2FwcyBpbiB0aGUgaGFyZHdhcmUKKyAqIHB0ZSBlbnRyaWVzIHRoYXQgYXJlIG5vdCB1c2VkLiAgTm90ZSwgdGhlc2UgRE8gZ2V0IHN0b3JlZCBpbiB0aGUgYWN0dWFsCisgKiBoYXJkd2FyZSwgYnV0IHRoZSBoYXJkd2FyZSBqdXN0IGRvZXMgbm90IHVzZSB0aGVtLgorICovCisjZGVmaW5lIF9QQUdFX0FDQ0VTU0VECQlfUEFHRV9BTFdBWVNfWkVST18xCisjZGVmaW5lIF9QQUdFX0RJUlRZCQlfUEFHRV9BTFdBWVNfWkVST18yCisKKy8qIFBhZ2VzIG93bmVkLCBhbmQgcHJvdGVjdGVkIGJ5LCB0aGUga2VybmVsLiAqLworI2RlZmluZSBfUEFHRV9LRVJORUwJCV9QQUdFX1BSSVYKKworLyogTm8gY2FjaGVpbmcgb2YgdGhpcyBwYWdlICovCisjZGVmaW5lIF9QQUdFX0NBQ0hFX1dJTjAJKE1NQ1VfQ1dJTl9VTkNBQ0hFRCA8PCBNTUNVX0VOVFJZX0NXSU5fUykKKy8qIGJ1cnN0IGNhY2hlaW5nIC0gZ29vZCBmb3IgZGF0YSBzdHJlYW1pbmcgKi8KKyNkZWZpbmUgX1BBR0VfQ0FDSEVfV0lOMQkoTU1DVV9DV0lOX0JVUlNUIDw8IE1NQ1VfRU5UUllfQ1dJTl9TKQorLyogT25lIGNhY2hlIHdheSBwZXIgdGhyZWFkICovCisjZGVmaW5lIF9QQUdFX0NBQ0hFX1dJTjIJKE1NQ1VfQ1dJTl9DMVNFVCA8PCBNTUNVX0VOVFJZX0NXSU5fUykKKy8qIEZ1bGwgb24gY2FjaGVpbmcgKi8KKyNkZWZpbmUgX1BBR0VfQ0FDSEVfV0lOMwkoTU1DVV9DV0lOX0NBQ0hFRCA8PCBNTUNVX0VOVFJZX0NXSU5fUykKKworI2RlZmluZSBfUEFHRV9DQUNIRUFCTEUJCShfUEFHRV9DQUNIRV9XSU4zIHwgX1BBR0VfV1JfQ09NQklORSkKKworLyogd2hpY2ggYml0cyBhcmUgdXNlZCBmb3IgY2FjaGUgY29udHJvbCAuLi4gKi8KKyNkZWZpbmUgX1BBR0VfQ0FDSEVfTUFTSwkoX1BBR0VfQ0FDSEVfQ1RSTDAgfCBfUEFHRV9DQUNIRV9DVFJMMSB8IFwKKwkJCQkgX1BBR0VfV1JfQ09NQklORSkKKworLyogVGhpcyBpcyBhIG1hc2sgb2YgdGhlIGJpdHMgdGhhdCBwdGVfbW9kaWZ5IGlzIGFsbG93ZWQgdG8gY2hhbmdlLiAqLworI2RlZmluZSBfUEFHRV9DSEdfTUFTSwkJKFBBR0VfTUFTSykKKworI2RlZmluZSBfUEFHRV9TWl9TSElGVAkJMQorI2RlZmluZSBfUEFHRV9TWl80SwkJKDB4MCkKKyNkZWZpbmUgX1BBR0VfU1pfOEsJCSgweDEgPDwgX1BBR0VfU1pfU0hJRlQpCisjZGVmaW5lIF9QQUdFX1NaXzE2SwkJKDB4MiA8PCBfUEFHRV9TWl9TSElGVCkKKyNkZWZpbmUgX1BBR0VfU1pfMzJLCQkoMHgzIDw8IF9QQUdFX1NaX1NISUZUKQorI2RlZmluZSBfUEFHRV9TWl82NEsJCSgweDQgPDwgX1BBR0VfU1pfU0hJRlQpCisjZGVmaW5lIF9QQUdFX1NaXzEyOEsJCSgweDUgPDwgX1BBR0VfU1pfU0hJRlQpCisjZGVmaW5lIF9QQUdFX1NaXzI1NksJCSgweDYgPDwgX1BBR0VfU1pfU0hJRlQpCisjZGVmaW5lIF9QQUdFX1NaXzUxMksJCSgweDcgPDwgX1BBR0VfU1pfU0hJRlQpCisjZGVmaW5lIF9QQUdFX1NaXzFNCQkoMHg4IDw8IF9QQUdFX1NaX1NISUZUKQorI2RlZmluZSBfUEFHRV9TWl8yTQkJKDB4OSA8PCBfUEFHRV9TWl9TSElGVCkKKyNkZWZpbmUgX1BBR0VfU1pfNE0JCSgweGEgPDwgX1BBR0VfU1pfU0hJRlQpCisjZGVmaW5lIF9QQUdFX1NaX01BU0sJCSgweGYgPDwgX1BBR0VfU1pfU0hJRlQpCisKKyNpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfNEspCisjZGVmaW5lIF9QQUdFX1NaCQkoX1BBR0VfU1pfNEspCisjZWxpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfOEspCisjZGVmaW5lIF9QQUdFX1NaCQkoX1BBR0VfU1pfOEspCisjZWxpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfMTZLKQorI2RlZmluZSBfUEFHRV9TWgkJKF9QQUdFX1NaXzE2SykKKyNlbmRpZgorI2RlZmluZSBfUEFHRV9UQUJMRQkJKF9QQUdFX1NaIHwgX1BBR0VfUFJFU0VOVCkKKworI2lmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzhLKQorIyBkZWZpbmUgX1BBR0VfU1pIVUdFCQkoX1BBR0VfU1pfOEspCisjZWxpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8xNkspCisjIGRlZmluZSBfUEFHRV9TWkhVR0UJCShfUEFHRV9TWl8xNkspCisjZWxpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8zMkspCisjIGRlZmluZSBfUEFHRV9TWkhVR0UJCShfUEFHRV9TWl8zMkspCisjZWxpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0VfU0laRV82NEspCisjIGRlZmluZSBfUEFHRV9TWkhVR0UJCShfUEFHRV9TWl82NEspCisjZWxpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8xMjhLKQorIyBkZWZpbmUgX1BBR0VfU1pIVUdFCQkoX1BBR0VfU1pfMTI4SykKKyNlbGlmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzI1NkspCisjIGRlZmluZSBfUEFHRV9TWkhVR0UJCShfUEFHRV9TWl8yNTZLKQorI2VsaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNTEySykKKyMgZGVmaW5lIF9QQUdFX1NaSFVHRQkJKF9QQUdFX1NaXzUxMkspCisjZWxpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8xTSkKKyMgZGVmaW5lIF9QQUdFX1NaSFVHRQkJKF9QQUdFX1NaXzFNKQorI2VsaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMk0pCisjIGRlZmluZSBfUEFHRV9TWkhVR0UJCShfUEFHRV9TWl8yTSkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzRNKQorIyBkZWZpbmUgX1BBR0VfU1pIVUdFCQkoX1BBR0VfU1pfNE0pCisjZW5kaWYKKworI2VuZGlmIC8qIF9NRVRBR19QR1RBQkxFX0JJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCBkMDYwNGMwLi5mZmEzYTNhIDEwMDY0NAotLS0gYS9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtNSw2ICs1LDcgQEAKICNpZm5kZWYgX01FVEFHX1BHVEFCTEVfSAogI2RlZmluZSBfTUVUQUdfUEdUQUJMRV9ICiAKKyNpbmNsdWRlIDxhc20vcGd0YWJsZS1iaXRzLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGd0YWJsZS1ub3BtZC5oPgogCiAvKiBJbnZhbGlkIHJlZ2lvbnMgb24gTWV0YTogMHgwMDAwMDAwMC0weDAwMUZGRkZGIGFuZCAweEZGRkYwMDAwLTB4RkZGRkZGRkYgKi8KQEAgLTIxLDEwMCArMjIsNiBAQAogI2VuZGlmCiAKIC8qCi0gKiBEZWZpbml0aW9ucyBmb3IgTU1VIGRlc2NyaXB0b3JzCi0gKgotICogVGhlc2UgYXJlIHRoZSBoYXJkd2FyZSBiaXRzIGluIHRoZSBNTUNVIHB0ZSBlbnRyaWVzLgotICogRGVyaXZlZCBmcm9tIHRoZSBNZXRhIHRvb2xraXQgaGVhZGVycy4KLSAqLwotI2RlZmluZSBfUEFHRV9QUkVTRU5UCQlNTUNVX0VOVFJZX1ZBTF9CSVQKLSNkZWZpbmUgX1BBR0VfV1JJVEUJCU1NQ1VfRU5UUllfV1JfQklUCi0jZGVmaW5lIF9QQUdFX1BSSVYJCU1NQ1VfRU5UUllfUFJJVl9CSVQKLS8qIFdyaXRlIGNvbWJpbmUgYml0IC0gdGhpcyBjYW4gY2F1c2Ugd3JpdGVzIHRvIG9jY3VyIG91dCBvZiBvcmRlciAqLwotI2RlZmluZSBfUEFHRV9XUl9DT01CSU5FCU1NQ1VfRU5UUllfV1JDX0JJVAotLyogU3lzIGNvaGVyZW50IGJpdCAtIHRoaXMgYml0IGlzIG5ldmVyIHVzZWQgYnkgTGludXggKi8KLSNkZWZpbmUgX1BBR0VfU1lTX0NPSEVSRU5UCU1NQ1VfRU5UUllfU1lTX0JJVAotI2RlZmluZSBfUEFHRV9BTFdBWVNfWkVST18xCTB4MDIwCi0jZGVmaW5lIF9QQUdFX0NBQ0hFX0NUUkwwCTB4MDQwCi0jZGVmaW5lIF9QQUdFX0NBQ0hFX0NUUkwxCTB4MDgwCi0jZGVmaW5lIF9QQUdFX0FMV0FZU19aRVJPXzIJMHgxMDAKLSNkZWZpbmUgX1BBR0VfQUxXQVlTX1pFUk9fMwkweDIwMAotI2RlZmluZSBfUEFHRV9BTFdBWVNfWkVST180CTB4NDAwCi0jZGVmaW5lIF9QQUdFX0FMV0FZU19aRVJPXzUJMHg4MDAKLQotLyogVGhlc2UgYXJlIHNvZnR3YXJlIGJpdHMgdGhhdCB3ZSBzdHVmZiBpbnRvIHRoZSBnYXBzIGluIHRoZSBoYXJkd2FyZQotICogcHRlIGVudHJpZXMgdGhhdCBhcmUgbm90IHVzZWQuICBOb3RlLCB0aGVzZSBETyBnZXQgc3RvcmVkIGluIHRoZSBhY3R1YWwKLSAqIGhhcmR3YXJlLCBidXQgdGhlIGhhcmR3YXJlIGp1c3QgZG9lcyBub3QgdXNlIHRoZW0uCi0gKi8KLSNkZWZpbmUgX1BBR0VfQUNDRVNTRUQJCV9QQUdFX0FMV0FZU19aRVJPXzEKLSNkZWZpbmUgX1BBR0VfRElSVFkJCV9QQUdFX0FMV0FZU19aRVJPXzIKLQotLyogUGFnZXMgb3duZWQsIGFuZCBwcm90ZWN0ZWQgYnksIHRoZSBrZXJuZWwuICovCi0jZGVmaW5lIF9QQUdFX0tFUk5FTAkJX1BBR0VfUFJJVgotCi0vKiBObyBjYWNoZWluZyBvZiB0aGlzIHBhZ2UgKi8KLSNkZWZpbmUgX1BBR0VfQ0FDSEVfV0lOMAkoTU1DVV9DV0lOX1VOQ0FDSEVEIDw8IE1NQ1VfRU5UUllfQ1dJTl9TKQotLyogYnVyc3QgY2FjaGVpbmcgLSBnb29kIGZvciBkYXRhIHN0cmVhbWluZyAqLwotI2RlZmluZSBfUEFHRV9DQUNIRV9XSU4xCShNTUNVX0NXSU5fQlVSU1QgPDwgTU1DVV9FTlRSWV9DV0lOX1MpCi0vKiBPbmUgY2FjaGUgd2F5IHBlciB0aHJlYWQgKi8KLSNkZWZpbmUgX1BBR0VfQ0FDSEVfV0lOMgkoTU1DVV9DV0lOX0MxU0VUIDw8IE1NQ1VfRU5UUllfQ1dJTl9TKQotLyogRnVsbCBvbiBjYWNoZWluZyAqLwotI2RlZmluZSBfUEFHRV9DQUNIRV9XSU4zCShNTUNVX0NXSU5fQ0FDSEVEIDw8IE1NQ1VfRU5UUllfQ1dJTl9TKQotCi0jZGVmaW5lIF9QQUdFX0NBQ0hFQUJMRQkJKF9QQUdFX0NBQ0hFX1dJTjMgfCBfUEFHRV9XUl9DT01CSU5FKQotCi0vKiB3aGljaCBiaXRzIGFyZSB1c2VkIGZvciBjYWNoZSBjb250cm9sIC4uLiAqLwotI2RlZmluZSBfUEFHRV9DQUNIRV9NQVNLCShfUEFHRV9DQUNIRV9DVFJMMCB8IF9QQUdFX0NBQ0hFX0NUUkwxIHwgXAotCQkJCSBfUEFHRV9XUl9DT01CSU5FKQotCi0vKiBUaGlzIGlzIGEgbWFzayBvZiB0aGUgYml0cyB0aGF0IHB0ZV9tb2RpZnkgaXMgYWxsb3dlZCB0byBjaGFuZ2UuICovCi0jZGVmaW5lIF9QQUdFX0NIR19NQVNLCQkoUEFHRV9NQVNLKQotCi0jZGVmaW5lIF9QQUdFX1NaX1NISUZUCQkxCi0jZGVmaW5lIF9QQUdFX1NaXzRLCQkoMHgwKQotI2RlZmluZSBfUEFHRV9TWl84SwkJKDB4MSA8PCBfUEFHRV9TWl9TSElGVCkKLSNkZWZpbmUgX1BBR0VfU1pfMTZLCQkoMHgyIDw8IF9QQUdFX1NaX1NISUZUKQotI2RlZmluZSBfUEFHRV9TWl8zMksJCSgweDMgPDwgX1BBR0VfU1pfU0hJRlQpCi0jZGVmaW5lIF9QQUdFX1NaXzY0SwkJKDB4NCA8PCBfUEFHRV9TWl9TSElGVCkKLSNkZWZpbmUgX1BBR0VfU1pfMTI4SwkJKDB4NSA8PCBfUEFHRV9TWl9TSElGVCkKLSNkZWZpbmUgX1BBR0VfU1pfMjU2SwkJKDB4NiA8PCBfUEFHRV9TWl9TSElGVCkKLSNkZWZpbmUgX1BBR0VfU1pfNTEySwkJKDB4NyA8PCBfUEFHRV9TWl9TSElGVCkKLSNkZWZpbmUgX1BBR0VfU1pfMU0JCSgweDggPDwgX1BBR0VfU1pfU0hJRlQpCi0jZGVmaW5lIF9QQUdFX1NaXzJNCQkoMHg5IDw8IF9QQUdFX1NaX1NISUZUKQotI2RlZmluZSBfUEFHRV9TWl80TQkJKDB4YSA8PCBfUEFHRV9TWl9TSElGVCkKLSNkZWZpbmUgX1BBR0VfU1pfTUFTSwkJKDB4ZiA8PCBfUEFHRV9TWl9TSElGVCkKLQotI2lmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV80SykKLSNkZWZpbmUgX1BBR0VfU1oJCShfUEFHRV9TWl80SykKLSNlbGlmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV84SykKLSNkZWZpbmUgX1BBR0VfU1oJCShfUEFHRV9TWl84SykKLSNlbGlmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV8xNkspCi0jZGVmaW5lIF9QQUdFX1NaCQkoX1BBR0VfU1pfMTZLKQotI2VuZGlmCi0jZGVmaW5lIF9QQUdFX1RBQkxFCQkoX1BBR0VfU1ogfCBfUEFHRV9QUkVTRU5UKQotCi0jaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfOEspCi0jIGRlZmluZSBfUEFHRV9TWkhVR0UJCShfUEFHRV9TWl84SykKLSNlbGlmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzE2SykKLSMgZGVmaW5lIF9QQUdFX1NaSFVHRQkJKF9QQUdFX1NaXzE2SykKLSNlbGlmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzMySykKLSMgZGVmaW5lIF9QQUdFX1NaSFVHRQkJKF9QQUdFX1NaXzMySykKLSNlbGlmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzY0SykKLSMgZGVmaW5lIF9QQUdFX1NaSFVHRQkJKF9QQUdFX1NaXzY0SykKLSNlbGlmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzEyOEspCi0jIGRlZmluZSBfUEFHRV9TWkhVR0UJCShfUEFHRV9TWl8xMjhLKQotI2VsaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfMjU2SykKLSMgZGVmaW5lIF9QQUdFX1NaSFVHRQkJKF9QQUdFX1NaXzI1NkspCi0jZWxpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0VfU0laRV81MTJLKQotIyBkZWZpbmUgX1BBR0VfU1pIVUdFCQkoX1BBR0VfU1pfNTEySykKLSNlbGlmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRV9TSVpFXzFNKQotIyBkZWZpbmUgX1BBR0VfU1pIVUdFCQkoX1BBR0VfU1pfMU0pCi0jZWxpZiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0VfU0laRV8yTSkKLSMgZGVmaW5lIF9QQUdFX1NaSFVHRQkJKF9QQUdFX1NaXzJNKQotI2VsaWYgZGVmaW5lZChDT05GSUdfSFVHRVRMQl9QQUdFX1NJWkVfNE0pCi0jIGRlZmluZSBfUEFHRV9TWkhVR0UJCShfUEFHRV9TWl80TSkKLSNlbmRpZgotCi0vKgogICogVGhlIExpbnV4IG1lbW9yeSBtYW5hZ2VtZW50IGFzc3VtZXMgYSB0aHJlZS1sZXZlbCBwYWdlIHRhYmxlIHNldHVwLiBPbgogICogTWV0YSwgd2UgdXNlIHRoYXQsIGJ1dCAiZm9sZCIgdGhlIG1pZCBsZXZlbCBpbnRvIHRoZSB0b3AtbGV2ZWwgcGFnZQogICogdGFibGUuCmRpZmYgLS1naXQgYS9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCAxMzI3MmZkLi4wODM4Y2E2IDEwMDY0NAotLS0gYS9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTExMSw3ICsxMTEsNiBAQAogICovCiAjZGVmaW5lIHN0YXJ0X3RocmVhZChyZWdzLCBwYywgdXNwKSBkbyB7CQkJCSAgIFwKIAl1bnNpZ25lZCBpbnQgKmFyZ2MgPSAodW5zaWduZWQgaW50ICopIGJwcm0tPmV4ZWM7CQkgICBcCi0Jc2V0X2ZzKFVTRVJfRFMpOwkJCQkJCSAgIFwKIAljdXJyZW50LT50aHJlYWQuaW50X2RlcHRoID0gMTsJCQkJCSAgIFwKIAkvKiBGb3JjZSB0aGlzIHByb2Nlc3MgZG93biB0byB1c2VyIGxhbmQgKi8JCQkgICBcCiAJcmVncy0+Y3R4LlNhdmVNYXNrID0gVEJJQ1RYX1BSSVZfQklUOwkJCQkgICBcCmRpZmYgLS1naXQgYS9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL21ldGFnL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggYWZiM2NhNC4uMzI2NzdjYyAxMDA2NDQKLS0tIGEvYXJjaC9tZXRhZy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvbWV0YWcvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMjgsNyArMjgsNiBAQAogLyogVGhpcyBtdXN0IGJlIDggYnl0ZSBhbGlnbmVkIHNvIHdlIGNhbiBlbnN1cmUgc3RhY2sgYWxpZ25tZW50LiAqLwogc3RydWN0IHRocmVhZF9pbmZvIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4gKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJdW5zaWduZWQgbG9uZyBmbGFnczsJLyogbG93IGxldmVsIGZsYWdzICovCiAJdW5zaWduZWQgbG9uZyBzdGF0dXM7CS8qIHRocmVhZC1zeW5jaHJvbm91cyBmbGFncyAqLwogCXUzMiBjcHU7CQkvKiBjdXJyZW50IENQVSAqLwpAQCAtNjgsNyArNjcsNiBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCiB7CQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJXAotCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAlcCiAJLmZsYWdzCQk9IDAsCQkJXAogCS5jcHUJCT0gMCwJCQlcCiAJLnByZWVtcHRfY291bnQJPSBJTklUX1BSRUVNUFRfQ09VTlQsCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWV0YWcva2VybmVsL2lycS5jIGIvYXJjaC9tZXRhZy9rZXJuZWwvaXJxLmMKaW5kZXggNTM4NWRkMS4uNGY4ZjFmOCAxMDA2NDQKLS0tIGEvYXJjaC9tZXRhZy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9tZXRhZy9rZXJuZWwvaXJxLmMKQEAgLTEzMiw3ICsxMzIsNiBAQAogCiAJaXJxY3R4ID0gKHVuaW9uIGlycV9jdHggKikgJmhhcmRpcnFfc3RhY2tbY3B1ICogVEhSRUFEX1NJWkVdOwogCWlycWN0eC0+dGluZm8udGFzayAgICAgICAgICAgICAgPSBOVUxMOwotCWlycWN0eC0+dGluZm8uZXhlY19kb21haW4gICAgICAgPSBOVUxMOwogCWlycWN0eC0+dGluZm8uY3B1ICAgICAgICAgICAgICAgPSBjcHU7CiAJaXJxY3R4LT50aW5mby5wcmVlbXB0X2NvdW50ICAgICA9IEhBUkRJUlFfT0ZGU0VUOwogCWlycWN0eC0+dGluZm8uYWRkcl9saW1pdCAgICAgICAgPSBNQUtFX01NX1NFRygwKTsKQEAgLTE0MSw3ICsxNDAsNiBAQAogCiAJaXJxY3R4ID0gKHVuaW9uIGlycV9jdHggKikgJnNvZnRpcnFfc3RhY2tbY3B1ICogVEhSRUFEX1NJWkVdOwogCWlycWN0eC0+dGluZm8udGFzayAgICAgICAgICAgICAgPSBOVUxMOwotCWlycWN0eC0+dGluZm8uZXhlY19kb21haW4gICAgICAgPSBOVUxMOwogCWlycWN0eC0+dGluZm8uY3B1ICAgICAgICAgICAgICAgPSBjcHU7CiAJaXJxY3R4LT50aW5mby5wcmVlbXB0X2NvdW50ICAgICA9IDA7CiAJaXJxY3R4LT50aW5mby5hZGRyX2xpbWl0ICAgICAgICA9IE1BS0VfTU1fU0VHKDApOwpkaWZmIC0tZ2l0IGEvYXJjaC9tZXRhZy9rZXJuZWwvc21wLmMgYi9hcmNoL21ldGFnL2tlcm5lbC9zbXAuYwppbmRleCBmMDA2ZDIyLi5hYzNhMTk5IDEwMDY0NAotLS0gYS9hcmNoL21ldGFnL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL21ldGFnL2tlcm5lbC9zbXAuYwpAQCAtMjYxLDcgKzI2MSw2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKLXN0YXRpYyBERUNMQVJFX0NPTVBMRVRJT04oY3B1X2tpbGxlZCk7CiAKIC8qCiAgKiBfX2NwdV9kaXNhYmxlIHJ1bnMgb24gdGhlIHByb2Nlc3NvciB0byBiZSBzaHV0ZG93bi4KQEAgLTI5OSw3ICsyOTgsNyBAQAogICovCiB2b2lkIF9fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQogewotCWlmICghd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZjcHVfa2lsbGVkLCBtc2Vjc190b19qaWZmaWVzKDEpKSkKKwlpZiAoIWNwdV93YWl0X2RlYXRoKGNwdSwgMSkpCiAJCXByX2VycigiQ1BVJXU6IHVuYWJsZSB0byBraWxsXG4iLCBjcHUpOwogfQogCkBAIC0zMTQsNyArMzEzLDcgQEAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWlkbGVfdGFza19leGl0KCk7CiAKLQljb21wbGV0ZSgmY3B1X2tpbGxlZCk7CisJKHZvaWQpY3B1X3JlcG9ydF9kZWF0aCgpOwogCiAJYXNtICgiWE9SCVRYRU5BQkxFLCBEMFJlMCxEMFJlMFxuIik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IGI2OTlmYmQuLjM4M2YzODcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC02NSw3ICs2NSw2IEBACiAKIHN0cnVjdCB0aHJlYWRfaW5mbyB7CiAJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOyAvKiBtYWluIHRhc2sgc3RydWN0dXJlICovCi0Jc3RydWN0IGV4ZWNfZG9tYWluCSpleGVjX2RvbWFpbjsgLyogZXhlY3V0aW9uIGRvbWFpbiAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOyAvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KIAl1bnNpZ25lZCBsb25nCQlzdGF0dXM7IC8qIHRocmVhZC1zeW5jaHJvbm91cyBmbGFncyAqLwogCV9fdTMyCQkJY3B1OyAvKiBjdXJyZW50IENQVSAqLwpAQCAtODEsNyArODAsNiBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCiB7CQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJXAotCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAlcCiAJLmZsYWdzCQk9IDAsCQkJXAogCS5jcHUJCT0gMCwJCQlcCiAJLnByZWVtcHRfY291bnQJPSBJTklUX1BSRUVNUFRfQ09VTlQsCVwKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L21iLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9tYi5jCmluZGV4IDdiNWRjYTcuLjk1ODFkMTk0IDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL2NwdS9tYi5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvY3B1L21iLmMKQEAgLTI3LDcgKzI3LDYgQEAKIAogc3RhdGljIGludCBzaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCWludCBjb3VudCA9IDA7CiAJY2hhciAqZnBnYV9mYW1pbHkgPSAiVW5rbm93biI7CiAJY2hhciAqY3B1X3ZlciA9ICJVbmtub3duIjsKIAlpbnQgaTsKQEAgLTQ4LDkxICs0Nyw4OSBAQAogCQl9CiAJfQogCi0JY291bnQgPSBzZXFfcHJpbnRmKG0sCi0JCQkiQ1BVLUZhbWlseToJTWljcm9CbGF6ZVxuIgotCQkJIkZQR0EtQXJjaDoJJXNcbiIKLQkJCSJDUFUtVmVyOgklcywgJXMgZW5kaWFuXG4iCi0JCQkiQ1BVLU1IejoJJWQuJTAyZFxuIgotCQkJIkJvZ29NaXBzOgklbHUuJTAybHVcbiIsCi0JCQlmcGdhX2ZhbWlseSwKLQkJCWNwdV92ZXIsCi0JCQljcHVpbmZvLmVuZGlhbiA/ICJsaXR0bGUiIDogImJpZyIsCi0JCQljcHVpbmZvLmNwdV9jbG9ja19mcmVxIC8KLQkJCTEwMDAwMDAsCi0JCQljcHVpbmZvLmNwdV9jbG9ja19mcmVxICUKLQkJCTEwMDAwMDAsCi0JCQlsb29wc19wZXJfamlmZnkgLyAoNTAwMDAwIC8gSFopLAotCQkJKGxvb3BzX3Blcl9qaWZmeSAvICg1MDAwIC8gSFopKSAlIDEwMCk7CisJc2VxX3ByaW50ZihtLAorCQkgICAiQ1BVLUZhbWlseToJTWljcm9CbGF6ZVxuIgorCQkgICAiRlBHQS1BcmNoOgklc1xuIgorCQkgICAiQ1BVLVZlcjoJJXMsICVzIGVuZGlhblxuIgorCQkgICAiQ1BVLU1IejoJJWQuJTAyZFxuIgorCQkgICAiQm9nb01pcHM6CSVsdS4lMDJsdVxuIiwKKwkJICAgZnBnYV9mYW1pbHksCisJCSAgIGNwdV92ZXIsCisJCSAgIGNwdWluZm8uZW5kaWFuID8gImxpdHRsZSIgOiAiYmlnIiwKKwkJICAgY3B1aW5mby5jcHVfY2xvY2tfZnJlcSAvIDEwMDAwMDAsCisJCSAgIGNwdWluZm8uY3B1X2Nsb2NrX2ZyZXEgJSAxMDAwMDAwLAorCQkgICBsb29wc19wZXJfamlmZnkgLyAoNTAwMDAwIC8gSFopLAorCQkgICAobG9vcHNfcGVyX2ppZmZ5IC8gKDUwMDAgLyBIWikpICUgMTAwKTsKIAotCWNvdW50ICs9IHNlcV9wcmludGYobSwKLQkJIkhXOlxuIFNoaWZ0Olx0XHQlc1xuIgotCQkiIE1TUjpcdFx0JXNcbiIKLQkJIiBQQ01QOlx0XHQlc1xuIgotCQkiIERJVjpcdFx0JXNcbiIsCi0JCShjcHVpbmZvLnVzZV9pbnN0ciAmIFBWUjBfVVNFX0JBUlJFTF9NQVNLKSA/ICJ5ZXMiIDogIm5vIiwKLQkJKGNwdWluZm8udXNlX2luc3RyICYgUFZSMl9VU0VfTVNSX0lOU1RSKSA/ICJ5ZXMiIDogIm5vIiwKLQkJKGNwdWluZm8udXNlX2luc3RyICYgUFZSMl9VU0VfUENNUF9JTlNUUikgPyAieWVzIiA6ICJubyIsCi0JCShjcHVpbmZvLnVzZV9pbnN0ciAmIFBWUjBfVVNFX0RJVl9NQVNLKSA/ICJ5ZXMiIDogIm5vIik7CisJc2VxX3ByaW50ZihtLAorCQkgICAiSFc6XG4gU2hpZnQ6XHRcdCVzXG4iCisJCSAgICIgTVNSOlx0XHQlc1xuIgorCQkgICAiIFBDTVA6XHRcdCVzXG4iCisJCSAgICIgRElWOlx0XHQlc1xuIiwKKwkJICAgKGNwdWluZm8udXNlX2luc3RyICYgUFZSMF9VU0VfQkFSUkVMX01BU0spID8gInllcyIgOiAibm8iLAorCQkgICAoY3B1aW5mby51c2VfaW5zdHIgJiBQVlIyX1VTRV9NU1JfSU5TVFIpID8gInllcyIgOiAibm8iLAorCQkgICAoY3B1aW5mby51c2VfaW5zdHIgJiBQVlIyX1VTRV9QQ01QX0lOU1RSKSA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgKGNwdWluZm8udXNlX2luc3RyICYgUFZSMF9VU0VfRElWX01BU0spID8gInllcyIgOiAibm8iKTsKIAotCWNvdW50ICs9IHNlcV9wcmludGYobSwKLQkJCSIgTU1VOlx0XHQleFxuIiwKLQkJCWNwdWluZm8ubW11KTsKKwlzZXFfcHJpbnRmKG0sICIgTU1VOlx0XHQleFxuIiwgY3B1aW5mby5tbXUpOwogCi0JY291bnQgKz0gc2VxX3ByaW50ZihtLAotCQkiIE1VTDpcdFx0JXNcbiIKLQkJIiBGUFU6XHRcdCVzXG4iLAotCQkoY3B1aW5mby51c2VfbXVsdCAmIFBWUjJfVVNFX01VTDY0X01BU0spID8gInYyIiA6Ci0JCQkoY3B1aW5mby51c2VfbXVsdCAmIFBWUjBfVVNFX0hXX01VTF9NQVNLKSA/ICJ2MSIgOiAibm8iLAotCQkoY3B1aW5mby51c2VfZnB1ICYgUFZSMl9VU0VfRlBVMl9NQVNLKSA/ICJ2MiIgOgotCQkJKGNwdWluZm8udXNlX2ZwdSAmIFBWUjBfVVNFX0ZQVV9NQVNLKSA/ICJ2MSIgOiAibm8iKTsKKwlzZXFfcHJpbnRmKG0sCisJCSAgICIgTVVMOlx0XHQlc1xuIgorCQkgICAiIEZQVTpcdFx0JXNcbiIsCisJCSAgIChjcHVpbmZvLnVzZV9tdWx0ICYgUFZSMl9VU0VfTVVMNjRfTUFTSykgPyAidjIiIDoKKwkJICAgKGNwdWluZm8udXNlX211bHQgJiBQVlIwX1VTRV9IV19NVUxfTUFTSykgPyAidjEiIDogIm5vIiwKKwkJICAgKGNwdWluZm8udXNlX2ZwdSAmIFBWUjJfVVNFX0ZQVTJfTUFTSykgPyAidjIiIDoKKwkJICAgKGNwdWluZm8udXNlX2ZwdSAmIFBWUjBfVVNFX0ZQVV9NQVNLKSA/ICJ2MSIgOiAibm8iKTsKIAotCWNvdW50ICs9IHNlcV9wcmludGYobSwKLQkJIiBFeGM6XHRcdCVzJXMlcyVzJXMlcyVzJXNcbiIsCi0JCShjcHVpbmZvLnVzZV9leGMgJiBQVlIyX09QQ09ERV8weDBfSUxMX01BU0spID8gIm9wMHgwICIgOiAiIiwKLQkJKGNwdWluZm8udXNlX2V4YyAmIFBWUjJfVU5BTElHTkVEX0VYQ19NQVNLKSA/ICJ1bmFsICIgOiAiIiwKLQkJKGNwdWluZm8udXNlX2V4YyAmIFBWUjJfSUxMX09QQ09ERV9FWENfTUFTSykgPyAiaWxsICIgOiAiIiwKLQkJKGNwdWluZm8udXNlX2V4YyAmIFBWUjJfSU9QQl9CVVNfRVhDX01BU0spID8gImlvcGIgIiA6ICIiLAotCQkoY3B1aW5mby51c2VfZXhjICYgUFZSMl9ET1BCX0JVU19FWENfTUFTSykgPyAiZG9wYiAiIDogIiIsCi0JCShjcHVpbmZvLnVzZV9leGMgJiBQVlIyX0RJVl9aRVJPX0VYQ19NQVNLKSA/ICJ6ZXJvICIgOiAiIiwKLQkJKGNwdWluZm8udXNlX2V4YyAmIFBWUjJfRlBVX0VYQ19NQVNLKSA/ICJmcHUgIiA6ICIiLAotCQkoY3B1aW5mby51c2VfZXhjICYgUFZSMl9VU0VfRlNMX0VYQykgPyAiZnNsICIgOiAiIik7CisJc2VxX3ByaW50ZihtLAorCQkgICAiIEV4YzpcdFx0JXMlcyVzJXMlcyVzJXMlc1xuIiwKKwkJICAgKGNwdWluZm8udXNlX2V4YyAmIFBWUjJfT1BDT0RFXzB4MF9JTExfTUFTSykgPyAib3AweDAgIiA6ICIiLAorCQkgICAoY3B1aW5mby51c2VfZXhjICYgUFZSMl9VTkFMSUdORURfRVhDX01BU0spID8gInVuYWwgIiA6ICIiLAorCQkgICAoY3B1aW5mby51c2VfZXhjICYgUFZSMl9JTExfT1BDT0RFX0VYQ19NQVNLKSA/ICJpbGwgIiA6ICIiLAorCQkgICAoY3B1aW5mby51c2VfZXhjICYgUFZSMl9JT1BCX0JVU19FWENfTUFTSykgPyAiaW9wYiAiIDogIiIsCisJCSAgIChjcHVpbmZvLnVzZV9leGMgJiBQVlIyX0RPUEJfQlVTX0VYQ19NQVNLKSA/ICJkb3BiICIgOiAiIiwKKwkJICAgKGNwdWluZm8udXNlX2V4YyAmIFBWUjJfRElWX1pFUk9fRVhDX01BU0spID8gInplcm8gIiA6ICIiLAorCQkgICAoY3B1aW5mby51c2VfZXhjICYgUFZSMl9GUFVfRVhDX01BU0spID8gImZwdSAiIDogIiIsCisJCSAgIChjcHVpbmZvLnVzZV9leGMgJiBQVlIyX1VTRV9GU0xfRVhDKSA/ICJmc2wgIiA6ICIiKTsKIAotCWNvdW50ICs9IHNlcV9wcmludGYobSwKLQkJCSJTdHJlYW0taW5zbnM6XHQlc3ByaXZpbGVnZWRcbiIsCi0JCQljcHVpbmZvLm1tdV9wcml2aW5zID8gInVuIiA6ICIiKTsKKwlzZXFfcHJpbnRmKG0sCisJCSAgICJTdHJlYW0taW5zbnM6XHQlc3ByaXZpbGVnZWRcbiIsCisJCSAgIGNwdWluZm8ubW11X3ByaXZpbnMgPyAidW4iIDogIiIpOwogCiAJaWYgKGNwdWluZm8udXNlX2ljYWNoZSkKLQkJY291bnQgKz0gc2VxX3ByaW50ZihtLAotCQkJCSJJY2FjaGU6XHRcdCV1a0JcdGxpbmUgbGVuZ3RoOlx0JWRCXG4iLAotCQkJCWNwdWluZm8uaWNhY2hlX3NpemUgPj4gMTAsCi0JCQkJY3B1aW5mby5pY2FjaGVfbGluZV9sZW5ndGgpOworCQlzZXFfcHJpbnRmKG0sCisJCQkgICAiSWNhY2hlOlx0XHQldWtCXHRsaW5lIGxlbmd0aDpcdCVkQlxuIiwKKwkJCSAgIGNwdWluZm8uaWNhY2hlX3NpemUgPj4gMTAsCisJCQkgICBjcHVpbmZvLmljYWNoZV9saW5lX2xlbmd0aCk7CiAJZWxzZQotCQljb3VudCArPSBzZXFfcHJpbnRmKG0sICJJY2FjaGU6XHRcdG5vXG4iKTsKKwkJc2VxX3B1dHMobSwgIkljYWNoZTpcdFx0bm9cbiIpOwogCiAJaWYgKGNwdWluZm8udXNlX2RjYWNoZSkgewotCQljb3VudCArPSBzZXFfcHJpbnRmKG0sCi0JCQkJIkRjYWNoZTpcdFx0JXVrQlx0bGluZSBsZW5ndGg6XHQlZEJcbiIsCi0JCQkJY3B1aW5mby5kY2FjaGVfc2l6ZSA+PiAxMCwKLQkJCQljcHVpbmZvLmRjYWNoZV9saW5lX2xlbmd0aCk7Ci0JCXNlcV9wcmludGYobSwgIkRjYWNoZS1Qb2xpY3k6XHQiKTsKKwkJc2VxX3ByaW50ZihtLAorCQkJICAgIkRjYWNoZTpcdFx0JXVrQlx0bGluZSBsZW5ndGg6XHQlZEJcbiIsCisJCQkgICBjcHVpbmZvLmRjYWNoZV9zaXplID4+IDEwLAorCQkJICAgY3B1aW5mby5kY2FjaGVfbGluZV9sZW5ndGgpOworCQlzZXFfcHV0cyhtLCAiRGNhY2hlLVBvbGljeTpcdCIpOwogCQlpZiAoY3B1aW5mby5kY2FjaGVfd2IpCi0JCQljb3VudCArPSBzZXFfcHJpbnRmKG0sICJ3cml0ZS1iYWNrXG4iKTsKKwkJCXNlcV9wdXRzKG0sICJ3cml0ZS1iYWNrXG4iKTsKIAkJZWxzZQotCQkJY291bnQgKz0gc2VxX3ByaW50ZihtLCAid3JpdGUtdGhyb3VnaFxuIik7Ci0JfSBlbHNlCi0JCWNvdW50ICs9IHNlcV9wcmludGYobSwgIkRjYWNoZTpcdFx0bm9cbiIpOworCQkJc2VxX3B1dHMobSwgIndyaXRlLXRocm91Z2hcbiIpOworCX0gZWxzZSB7CisJCXNlcV9wdXRzKG0sICJEY2FjaGU6XHRcdG5vXG4iKTsKKwl9CiAKLQljb3VudCArPSBzZXFfcHJpbnRmKG0sCi0JCQkiSFctRGVidWc6XHQlc1xuIiwKLQkJCWNwdWluZm8uaHdfZGVidWcgPyAieWVzIiA6ICJubyIpOworCXNlcV9wcmludGYobSwKKwkJICAgIkhXLURlYnVnOlx0JXNcbiIsCisJCSAgIGNwdWluZm8uaHdfZGVidWcgPyAieWVzIiA6ICJubyIpOwogCi0JY291bnQgKz0gc2VxX3ByaW50ZihtLAotCQkJIlBWUi1VU1IxOlx0JTAyeFxuIgotCQkJIlBWUi1VU1IyOlx0JTA4eFxuIiwKLQkJCWNwdWluZm8ucHZyX3VzZXIxLAotCQkJY3B1aW5mby5wdnJfdXNlcjIpOworCXNlcV9wcmludGYobSwKKwkJICAgIlBWUi1VU1IxOlx0JTAyeFxuIgorCQkgICAiUFZSLVVTUjI6XHQlMDh4XG4iLAorCQkgICBjcHVpbmZvLnB2cl91c2VyMSwKKwkJICAgY3B1aW5mby5wdnJfdXNlcjIpOwogCi0JY291bnQgKz0gc2VxX3ByaW50ZihtLCAiUGFnZSBzaXplOlx0JWx1XG4iLCBQQUdFX1NJWkUpOworCXNlcV9wcmludGYobSwgIlBhZ2Ugc2l6ZTpcdCVsdVxuIiwgUEFHRV9TSVpFKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9zaWduYWwuYwppbmRleCBhMWNiYWY5Li45NzAwMTUyIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvc2lnbmFsLmMKQEAgLTE1OCw3ICsxNTgsNiBAQAogewogCXN0cnVjdCBydF9zaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwogCWludCBlcnIgPSAwLCBzaWcgPSBrc2lnLT5zaWc7Ci0JdW5zaWduZWQgbG9uZyBzaWduYWw7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzID0gMDsKICNpZmRlZiBDT05GSUdfTU1VCiAJcG1kX3QgKnBtZHA7CkBAIC0xNzAsMTIgKzE2OSw2IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXNpZ25hbCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4KLQkJJiYgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcAotCQkmJiBzaWcgPCAzMgotCQk/IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXBbc2lnXQotCQk6ICh1bnNpZ25lZCBsb25nKXNpZzsKLQogCWlmIChrc2lnLT5rYS5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pCiAJCWVyciB8PSBjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sICZrc2lnLT5pbmZvKTsKIApAQCAtMjMwLDE0ICsyMjMsMTIgQEAKIAlyZWdzLT5yMSA9ICh1bnNpZ25lZCBsb25nKSBmcmFtZTsKIAogCS8qIFNpZ25hbCBoYW5kbGVyIGFyZ3M6ICovCi0JcmVncy0+cjUgPSBzaWduYWw7IC8qIGFyZyAwOiBzaWdudW0gKi8KKwlyZWdzLT5yNSA9IHNpZzsgLyogYXJnIDA6IHNpZ251bSAqLwogCXJlZ3MtPnI2ID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+aW5mbzsgLyogYXJnIDE6IHNpZ2luZm8gKi8KIAlyZWdzLT5yNyA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnVjOyAvKiBhcmcyOiB1Y29udGV4dCAqLwogCS8qIE9mZnNldCB0byBoYW5kbGUgbWljcm9ibGF6ZSBydGlkIHIxNCwgMCAqLwogCXJlZ3MtPnBjID0gKHVuc2lnbmVkIGxvbmcpa3NpZy0+a2Euc2Euc2FfaGFuZGxlcjsKIAotCXNldF9mcyhVU0VSX0RTKTsKLQogI2lmZGVmIERFQlVHX1NJRwogCXByX2luZm8oIlNJRyBkZWxpdmVyICglczolZCk6IHNwPSVwIHBjPSUwOGx4XG4iLAogCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIGZyYW1lLCByZWdzLT5wYyk7CmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUvcGNpL3BjaS1jb21tb24uYyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCmluZGV4IDQ4NTI4ZmIuLmFlODM4ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCkBAIC0xMzgyLDYgKzEzODIsMTAgQEAKIAogCS8qIENhbGwgY29tbW9uIGNvZGUgdG8gaGFuZGxlIHJlc291cmNlIGFsbG9jYXRpb24gKi8KIAlwY2liaW9zX3Jlc291cmNlX3N1cnZleSgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShob3NlLCB0bXAsICZob3NlX2xpc3QsIGxpc3Rfbm9kZSkgeworCQlpZiAoaG9zZS0+YnVzKQorCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhob3NlLT5idXMpOworCX0KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCBjN2ExNjkwLi5hMzI2YzRjIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtMjMsNyArMjMsNyBAQAogCXNlbGVjdCBIQVZFX0tSRVRQUk9CRVMKIAlzZWxlY3QgSEFWRV9ERUJVR19LTUVNTEVBSwogCXNlbGVjdCBIQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFMKLQlzZWxlY3QgQVJDSF9CSU5GTVRfRUxGX1JBTkRPTUlaRV9QSUUKKwlzZWxlY3QgQVJDSF9IQVNfRUxGX1JBTkRPTUlaRQogCXNlbGVjdCBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0UgaWYgQ1BVX1NVUFBPUlRTX0hVR0VQQUdFUyAmJiA2NEJJVAogCXNlbGVjdCBSVENfTElCIGlmICFNQUNIX0xPT05HU09OCiAJc2VsZWN0IEdFTkVSSUNfQVRPTUlDNjQgaWYgITY0QklUCkBAIC0yNjAwLDYgKzI2MDAsMTEgQEAKIAlib29sCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBQR1RBQkxFX0xFVkVMUworCWludAorCWRlZmF1bHQgMyBpZiA2NEJJVCAmJiAhUEFHRV9TSVpFXzY0S0IKKwlkZWZhdWx0IDIKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAia2VybmVsL0tjb25maWcuZnJlZXplciIKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9NYWtlZmlsZSBiL2FyY2gvbWlwcy9NYWtlZmlsZQppbmRleCA4ZjU3ZmM3Li5kMTUyZGZiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvTWFrZWZpbGUKKysrIGIvYXJjaC9taXBzL01ha2VmaWxlCkBAIC0yMjUsNyArMjI1LDcgQEAKICMKICMgQm9hcmQtZGVwZW5kZW50IG9wdGlvbnMgYW5kIGV4dHJhIGZpbGVzCiAjCi1pbmNsdWRlICQoc3JjdHJlZSkvYXJjaC9taXBzL0tidWlsZC5wbGF0Zm9ybXMKK2luY2x1ZGUgYXJjaC9taXBzL0tidWlsZC5wbGF0Zm9ybXMKIAogaWZkZWYgQ09ORklHX1BIWVNJQ0FMX1NUQVJUCiBsb2FkLXkJCQkJCT0gJChDT05GSUdfUEhZU0lDQUxfU1RBUlQpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcnlwdG8vTWFrZWZpbGUgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcnlwdG8vTWFrZWZpbGUKaW5kZXggYTc0Zjc2ZC4uZjdhYTlkNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3J5cHRvL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2NyeXB0by9NYWtlZmlsZQpAQCAtNCw0ICs0LDcgQEAKIAogb2JqLXkgKz0gb2N0ZW9uLWNyeXB0by5vCiAKLW9iai0kKENPTkZJR19DUllQVE9fTUQ1X09DVEVPTikgKz0gb2N0ZW9uLW1kNS5vCitvYmotJChDT05GSUdfQ1JZUFRPX01ENV9PQ1RFT04pCQkrPSBvY3Rlb24tbWQ1Lm8KK29iai0kKENPTkZJR19DUllQVE9fU0hBMV9PQ1RFT04pCSs9IG9jdGVvbi1zaGExLm8KK29iai0kKENPTkZJR19DUllQVE9fU0hBMjU2X09DVEVPTikJKz0gb2N0ZW9uLXNoYTI1Ni5vCitvYmotJChDT05GSUdfQ1JZUFRPX1NIQTUxMl9PQ1RFT04pCSs9IG9jdGVvbi1zaGE1MTIubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3J5cHRvL29jdGVvbi1jcnlwdG8uYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2NyeXB0by9vY3Rlb24tY3J5cHRvLmMKaW5kZXggN2M4MmZmNC4uZjY2YmQxYSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3J5cHRvL29jdGVvbi1jcnlwdG8uYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcnlwdG8vb2N0ZW9uLWNyeXB0by5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKiBjcnlwdG8gb3BlcmF0aW9ucyBpbiBjYWxscyB0byBvY3Rlb25fY3J5cHRvX2VuYWJsZS9kaXNhYmxlIGluIG9yZGVyIHRvIG1ha2UKICAqIHN1cmUgdGhlIHN0YXRlIG9mIENPUDIgaXNuJ3QgY29ycnVwdGVkIGlmIHVzZXJzcGFjZSBpcyBhbHNvIHBlcmZvcm1pbmcKICAqIGhhcmR3YXJlIGNyeXB0byBvcGVyYXRpb25zLiBBbGxvY2F0ZSB0aGUgc3RhdGUgcGFyYW1ldGVyIG9uIHRoZSBzdGFjay4KLSAqIFByZWVtcHRpb24gbXVzdCBiZSBkaXNhYmxlZCB0byBwcmV2ZW50IGNvbnRleHQgc3dpdGNoZXMuCisgKiBSZXR1cm5zIHdpdGggcHJlZW1wdGlvbiBkaXNhYmxlZC4KICAqCiAgKiBAc3RhdGU6IFBvaW50ZXIgdG8gc3RhdGUgc3RydWN0dXJlIHRvIHN0b3JlIGN1cnJlbnQgQ09QMiBzdGF0ZSBpbi4KICAqCkBAIC0yOCw2ICsyOCw3IEBACiAJaW50IHN0YXR1czsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXN0YXR1cyA9IHJlYWRfYzBfc3RhdHVzKCk7CiAJd3JpdGVfYzBfc3RhdHVzKHN0YXR1cyB8IFNUMF9DVTIpOwpAQCAtNjIsNSArNjMsNiBAQAogCWVsc2UKIAkJd3JpdGVfYzBfc3RhdHVzKHJlYWRfYzBfc3RhdHVzKCkgJiB+U1QwX0NVMik7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXByZWVtcHRfZW5hYmxlKCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvY3Rlb25fY3J5cHRvX2Rpc2FibGUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3J5cHRvL29jdGVvbi1jcnlwdG8uaCBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2NyeXB0by9vY3Rlb24tY3J5cHRvLmgKaW5kZXggZTJhNGFlYy4uMzU1MDcyNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3J5cHRvL29jdGVvbi1jcnlwdG8uaAorKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcnlwdG8vb2N0ZW9uLWNyeXB0by5oCkBAIC01LDcgKzUsOCBAQAogICoKICAqIENvcHlyaWdodCAoQykgMjAxMi0yMDEzIENhdml1bSBJbmMuLCBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKLSAqIE1ENSBpbnN0cnVjdGlvbiBkZWZpbml0aW9ucyBhZGRlZCBieSBBYXJvIEtvc2tpbmVuIDxhYXJvLmtvc2tpbmVuQGlraS5maT4uCisgKiBNRDUvU0hBMS9TSEEyNTYvU0hBNTEyIGluc3RydWN0aW9uIGRlZmluaXRpb25zIGFkZGVkIGJ5CisgKiBBYXJvIEtvc2tpbmVuIDxhYXJvLmtvc2tpbmVuQGlraS5maT4uCiAgKgogICovCiAjaWZuZGVmIF9fTElOVVhfT0NURU9OX0NSWVBUT19ICkBAIC0yMSwxMSArMjIsMTEgQEAKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogCiAvKgotICogTWFjcm9zIG5lZWRlZCB0byBpbXBsZW1lbnQgTUQ1OgorICogTWFjcm9zIG5lZWRlZCB0byBpbXBsZW1lbnQgTUQ1L1NIQTEvU0hBMjU2OgogICovCiAKIC8qCi0gKiBUaGUgaW5kZXggY2FuIGJlIDAtMS4KKyAqIFRoZSBpbmRleCBjYW4gYmUgMC0xIChNRDUpIG9yIDAtMiAoU0hBMSksIDAtMyAoU0hBMjU2KS4KICAqLwogI2RlZmluZSB3cml0ZV9vY3Rlb25fNjRiaXRfaGFzaF9kd29yZCh2YWx1ZSwgaW5kZXgpCVwKIGRvIHsJCQkJCQkJXApAQCAtMzYsNyArMzcsNyBAQAogfSB3aGlsZSAoMCkKIAogLyoKLSAqIFRoZSBpbmRleCBjYW4gYmUgMC0xLgorICogVGhlIGluZGV4IGNhbiBiZSAwLTEgKE1ENSkgb3IgMC0yIChTSEExKSwgMC0zIChTSEEyNTYpLgogICovCiAjZGVmaW5lIHJlYWRfb2N0ZW9uXzY0Yml0X2hhc2hfZHdvcmQoaW5kZXgpCQlcCiAoewkJCQkJCQlcCkBAIC03Miw0ICs3Myw3OCBAQAogCTogW3J0XSAiZCIgKHZhbHVlKSk7CQkJCVwKIH0gd2hpbGUgKDApCiAKKy8qCisgKiBUaGUgdmFsdWUgaXMgdGhlIGZpbmFsIGJsb2NrIGR3b3JkICg2NC1iaXQpLgorICovCisjZGVmaW5lIG9jdGVvbl9zaGExX3N0YXJ0KHZhbHVlKQkJCVwKK2RvIHsJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJXAorCSJkbXRjMiAlW3J0XSwweDQwNTciCQkJCVwKKwk6CQkJCQkJXAorCTogW3J0XSAiZCIgKHZhbHVlKSk7CQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBUaGUgdmFsdWUgaXMgdGhlIGZpbmFsIGJsb2NrIGR3b3JkICg2NC1iaXQpLgorICovCisjZGVmaW5lIG9jdGVvbl9zaGEyNTZfc3RhcnQodmFsdWUpCQkJXAorZG8gewkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQlcCisJImRtdGMyICVbcnRdLDB4NDA0ZiIJCQkJXAorCToJCQkJCQlcCisJOiBbcnRdICJkIiAodmFsdWUpKTsJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIE1hY3JvcyBuZWVkZWQgdG8gaW1wbGVtZW50IFNIQTUxMjoKKyAqLworCisvKgorICogVGhlIGluZGV4IGNhbiBiZSAwLTcuCisgKi8KKyNkZWZpbmUgd3JpdGVfb2N0ZW9uXzY0Yml0X2hhc2hfc2hhNTEyKHZhbHVlLCBpbmRleCkJXAorZG8gewkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQlcCisJImRtdGMyICVbcnRdLDB4MDI1MCsiIFNUUihpbmRleCkJCVwKKwk6CQkJCQkJXAorCTogW3J0XSAiZCIgKHZhbHVlKSk7CQkJCVwKK30gd2hpbGUgKDApCisKKy8qCisgKiBUaGUgaW5kZXggY2FuIGJlIDAtNy4KKyAqLworI2RlZmluZSByZWFkX29jdGVvbl82NGJpdF9oYXNoX3NoYTUxMihpbmRleCkJCVwKKyh7CQkJCQkJCVwKKwl1NjQgX192YWx1ZTsJCQkJCVwKKwkJCQkJCQlcCisJX19hc21fXyBfX3ZvbGF0aWxlX18gKAkJCQlcCisJImRtZmMyICVbcnRdLDB4MDI1MCsiIFNUUihpbmRleCkJCVwKKwk6IFtydF0gIj1kIiAoX192YWx1ZSkJCQkJXAorCTogKTsJCQkJCQlcCisJCQkJCQkJXAorCV9fdmFsdWU7CQkJCQlcCit9KQorCisvKgorICogVGhlIGluZGV4IGNhbiBiZSAwLTE0LgorICovCisjZGVmaW5lIHdyaXRlX29jdGVvbl82NGJpdF9ibG9ja19zaGE1MTIodmFsdWUsIGluZGV4KQlcCitkbyB7CQkJCQkJCVwKKwlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCQkJCVwKKwkiZG10YzIgJVtydF0sMHgwMjQwKyIgU1RSKGluZGV4KQkJXAorCToJCQkJCQlcCisJOiBbcnRdICJkIiAodmFsdWUpKTsJCQkJXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFRoZSB2YWx1ZSBpcyB0aGUgZmluYWwgYmxvY2sgd29yZCAoNjQtYml0KS4KKyAqLworI2RlZmluZSBvY3Rlb25fc2hhNTEyX3N0YXJ0KHZhbHVlKQkJCVwKK2RvIHsJCQkJCQkJXAorCV9fYXNtX18gX192b2xhdGlsZV9fICgJCQkJXAorCSJkbXRjMiAlW3J0XSwweDQyNGYiCQkJCVwKKwk6CQkJCQkJXAorCTogW3J0XSAiZCIgKHZhbHVlKSk7CQkJCVwKK30gd2hpbGUgKDApCisKICNlbmRpZiAvKiBfX0xJTlVYX09DVEVPTl9DUllQVE9fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3J5cHRvL29jdGVvbi1tZDUuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2NyeXB0by9vY3Rlb24tbWQ1LmMKaW5kZXggYjkwOTg4MS4uMTJkY2NkYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3J5cHRvL29jdGVvbi1tZDUuYworKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcnlwdG8vb2N0ZW9uLW1kNS5jCkBAIC05Nyw4ICs5Nyw2IEBACiAJbWVtY3B5KChjaGFyICopbWN0eC0+YmxvY2sgKyAoc2l6ZW9mKG1jdHgtPmJsb2NrKSAtIGF2YWlsKSwgZGF0YSwKIAkgICAgICAgYXZhaWwpOwogCi0JbG9jYWxfYmhfZGlzYWJsZSgpOwotCXByZWVtcHRfZGlzYWJsZSgpOwogCWZsYWdzID0gb2N0ZW9uX2NyeXB0b19lbmFibGUoJnN0YXRlKTsKIAlvY3Rlb25fbWQ1X3N0b3JlX2hhc2gobWN0eCk7CiAKQEAgLTExNCw4ICsxMTIsNiBAQAogCiAJb2N0ZW9uX21kNV9yZWFkX2hhc2gobWN0eCk7CiAJb2N0ZW9uX2NyeXB0b19kaXNhYmxlKCZzdGF0ZSwgZmxhZ3MpOwotCXByZWVtcHRfZW5hYmxlKCk7Ci0JbG9jYWxfYmhfZW5hYmxlKCk7CiAKIAltZW1jcHkobWN0eC0+YmxvY2ssIGRhdGEsIGxlbik7CiAKQEAgLTEzMyw4ICsxMjksNiBAQAogCiAJKnArKyA9IDB4ODA7CiAKLQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JcHJlZW1wdF9kaXNhYmxlKCk7CiAJZmxhZ3MgPSBvY3Rlb25fY3J5cHRvX2VuYWJsZSgmc3RhdGUpOwogCW9jdGVvbl9tZDVfc3RvcmVfaGFzaChtY3R4KTsKIApAQCAtMTUyLDggKzE0Niw2IEBACiAKIAlvY3Rlb25fbWQ1X3JlYWRfaGFzaChtY3R4KTsKIAlvY3Rlb25fY3J5cHRvX2Rpc2FibGUoJnN0YXRlLCBmbGFncyk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLQlsb2NhbF9iaF9lbmFibGUoKTsKIAogCW1lbWNweShvdXQsIG1jdHgtPmhhc2gsIHNpemVvZihtY3R4LT5oYXNoKSk7CiAJbWVtc2V0KG1jdHgsIDAsIHNpemVvZigqbWN0eCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3J5cHRvL29jdGVvbi1zaGExLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcnlwdG8vb2N0ZW9uLXNoYTEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjc0YjViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3J5cHRvL29jdGVvbi1zaGExLmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBDcnlwdG9ncmFwaGljIEFQSS4KKyAqCisgKiBTSEExIFNlY3VyZSBIYXNoIEFsZ29yaXRobS4KKyAqCisgKiBBZGFwdGVkIGZvciBPQ1RFT04gYnkgQWFybyBLb3NraW5lbiA8YWFyby5rb3NraW5lbkBpa2kuZmk+LgorICoKKyAqIEJhc2VkIG9uIGNyeXB0by9zaGExX2dlbmVyaWMuYywgd2hpY2ggaXM6CisgKgorICogQ29weXJpZ2h0IChjKSBBbGFuIFNtaXRoZWUuCisgKiBDb3B5cmlnaHQgKGMpIEFuZHJldyBNY0RvbmFsZCA8YW5kcmV3QG1jZG9uYWxkLm9yZy51az4KKyAqIENvcHlyaWdodCAoYykgSmVhbi1GcmFuY29pcyBEaXZlIDxqZWZAbGludXhiZS5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9vY3Rlb24vb2N0ZW9uLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKworI2luY2x1ZGUgIm9jdGVvbi1jcnlwdG8uaCIKKworLyoKKyAqIFdlIHBhc3MgZXZlcnl0aGluZyBhcyA2NC1iaXQuIE9DVEVPTiBjYW4gaGFuZGxlIG1pc2FsaWduZWQgZGF0YS4KKyAqLworCitzdGF0aWMgdm9pZCBvY3Rlb25fc2hhMV9zdG9yZV9oYXNoKHN0cnVjdCBzaGExX3N0YXRlICpzY3R4KQoreworCXU2NCAqaGFzaCA9ICh1NjQgKilzY3R4LT5zdGF0ZTsKKwl1bmlvbiB7CisJCXUzMiB3b3JkWzJdOworCQl1NjQgZHdvcmQ7CisJfSBoYXNoX3RhaWwgPSB7IHsgc2N0eC0+c3RhdGVbNF0sIH0gfTsKKworCXdyaXRlX29jdGVvbl82NGJpdF9oYXNoX2R3b3JkKGhhc2hbMF0sIDApOworCXdyaXRlX29jdGVvbl82NGJpdF9oYXNoX2R3b3JkKGhhc2hbMV0sIDEpOworCXdyaXRlX29jdGVvbl82NGJpdF9oYXNoX2R3b3JkKGhhc2hfdGFpbC5kd29yZCwgMik7CisJbWVtemVyb19leHBsaWNpdCgmaGFzaF90YWlsLndvcmRbMF0sIHNpemVvZihoYXNoX3RhaWwud29yZFswXSkpOworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25fc2hhMV9yZWFkX2hhc2goc3RydWN0IHNoYTFfc3RhdGUgKnNjdHgpCit7CisJdTY0ICpoYXNoID0gKHU2NCAqKXNjdHgtPnN0YXRlOworCXVuaW9uIHsKKwkJdTMyIHdvcmRbMl07CisJCXU2NCBkd29yZDsKKwl9IGhhc2hfdGFpbDsKKworCWhhc2hbMF0JCT0gcmVhZF9vY3Rlb25fNjRiaXRfaGFzaF9kd29yZCgwKTsKKwloYXNoWzFdCQk9IHJlYWRfb2N0ZW9uXzY0Yml0X2hhc2hfZHdvcmQoMSk7CisJaGFzaF90YWlsLmR3b3JkCT0gcmVhZF9vY3Rlb25fNjRiaXRfaGFzaF9kd29yZCgyKTsKKwlzY3R4LT5zdGF0ZVs0XQk9IGhhc2hfdGFpbC53b3JkWzBdOworCW1lbXplcm9fZXhwbGljaXQoJmhhc2hfdGFpbC5kd29yZCwgc2l6ZW9mKGhhc2hfdGFpbC5kd29yZCkpOworfQorCitzdGF0aWMgdm9pZCBvY3Rlb25fc2hhMV90cmFuc2Zvcm0oY29uc3Qgdm9pZCAqX2Jsb2NrKQoreworCWNvbnN0IHU2NCAqYmxvY2sgPSBfYmxvY2s7CisKKwl3cml0ZV9vY3Rlb25fNjRiaXRfYmxvY2tfZHdvcmQoYmxvY2tbMF0sIDApOworCXdyaXRlX29jdGVvbl82NGJpdF9ibG9ja19kd29yZChibG9ja1sxXSwgMSk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX2R3b3JkKGJsb2NrWzJdLCAyKTsKKwl3cml0ZV9vY3Rlb25fNjRiaXRfYmxvY2tfZHdvcmQoYmxvY2tbM10sIDMpOworCXdyaXRlX29jdGVvbl82NGJpdF9ibG9ja19kd29yZChibG9ja1s0XSwgNCk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX2R3b3JkKGJsb2NrWzVdLCA1KTsKKwl3cml0ZV9vY3Rlb25fNjRiaXRfYmxvY2tfZHdvcmQoYmxvY2tbNl0sIDYpOworCW9jdGVvbl9zaGExX3N0YXJ0KGJsb2NrWzddKTsKK30KKworc3RhdGljIGludCBvY3Rlb25fc2hhMV9pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQoreworCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKwlzY3R4LT5zdGF0ZVswXSA9IFNIQTFfSDA7CisJc2N0eC0+c3RhdGVbMV0gPSBTSEExX0gxOworCXNjdHgtPnN0YXRlWzJdID0gU0hBMV9IMjsKKwlzY3R4LT5zdGF0ZVszXSA9IFNIQTFfSDM7CisJc2N0eC0+c3RhdGVbNF0gPSBTSEExX0g0OworCXNjdHgtPmNvdW50ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX29jdGVvbl9zaGExX3VwZGF0ZShzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCwgY29uc3QgdTggKmRhdGEsCisJCQkJIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IHBhcnRpYWw7CisJdW5zaWduZWQgaW50IGRvbmU7CisJY29uc3QgdTggKnNyYzsKKworCXBhcnRpYWwgPSBzY3R4LT5jb3VudCAlIFNIQTFfQkxPQ0tfU0laRTsKKwlzY3R4LT5jb3VudCArPSBsZW47CisJZG9uZSA9IDA7CisJc3JjID0gZGF0YTsKKworCWlmICgocGFydGlhbCArIGxlbikgPj0gU0hBMV9CTE9DS19TSVpFKSB7CisJCWlmIChwYXJ0aWFsKSB7CisJCQlkb25lID0gLXBhcnRpYWw7CisJCQltZW1jcHkoc2N0eC0+YnVmZmVyICsgcGFydGlhbCwgZGF0YSwKKwkJCSAgICAgICBkb25lICsgU0hBMV9CTE9DS19TSVpFKTsKKwkJCXNyYyA9IHNjdHgtPmJ1ZmZlcjsKKwkJfQorCisJCWRvIHsKKwkJCW9jdGVvbl9zaGExX3RyYW5zZm9ybShzcmMpOworCQkJZG9uZSArPSBTSEExX0JMT0NLX1NJWkU7CisJCQlzcmMgPSBkYXRhICsgZG9uZTsKKwkJfSB3aGlsZSAoZG9uZSArIFNIQTFfQkxPQ0tfU0laRSA8PSBsZW4pOworCisJCXBhcnRpYWwgPSAwOworCX0KKwltZW1jcHkoc2N0eC0+YnVmZmVyICsgcGFydGlhbCwgc3JjLCBsZW4gLSBkb25lKTsKK30KKworc3RhdGljIGludCBvY3Rlb25fc2hhMV91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCXN0cnVjdCBvY3Rlb25fY29wMl9zdGF0ZSBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBTbWFsbCB1cGRhdGVzIG5ldmVyIHJlYWNoIHRoZSBjcnlwdG8gZW5naW5lLCBzbyB0aGUgZ2VuZXJpYyBzaGExIGlzCisJICogZmFzdGVyIGJlY2F1c2Ugb2YgdGhlIGhlYXZ5d2VpZ2h0IG9jdGVvbl9jcnlwdG9fZW5hYmxlKCkgLworCSAqIG9jdGVvbl9jcnlwdG9fZGlzYWJsZSgpLgorCSAqLworCWlmICgoc2N0eC0+Y291bnQgJSBTSEExX0JMT0NLX1NJWkUpICsgbGVuIDwgU0hBMV9CTE9DS19TSVpFKQorCQlyZXR1cm4gY3J5cHRvX3NoYTFfdXBkYXRlKGRlc2MsIGRhdGEsIGxlbik7CisKKwlmbGFncyA9IG9jdGVvbl9jcnlwdG9fZW5hYmxlKCZzdGF0ZSk7CisJb2N0ZW9uX3NoYTFfc3RvcmVfaGFzaChzY3R4KTsKKworCV9fb2N0ZW9uX3NoYTFfdXBkYXRlKHNjdHgsIGRhdGEsIGxlbik7CisKKwlvY3Rlb25fc2hhMV9yZWFkX2hhc2goc2N0eCk7CisJb2N0ZW9uX2NyeXB0b19kaXNhYmxlKCZzdGF0ZSwgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2N0ZW9uX3NoYTFfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCit7CisJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwlzdGF0aWMgY29uc3QgdTggcGFkZGluZ1s2NF0gPSB7IDB4ODAsIH07CisJc3RydWN0IG9jdGVvbl9jb3AyX3N0YXRlIHN0YXRlOworCV9fYmUzMiAqZHN0ID0gKF9fYmUzMiAqKW91dDsKKwl1bnNpZ25lZCBpbnQgcGFkX2xlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpbmRleDsKKwlfX2JlNjQgYml0czsKKwlpbnQgaTsKKworCS8qIFNhdmUgbnVtYmVyIG9mIGJpdHMuICovCisJYml0cyA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50IDw8IDMpOworCisJLyogUGFkIG91dCB0byA1NiBtb2QgNjQuICovCisJaW5kZXggPSBzY3R4LT5jb3VudCAmIDB4M2Y7CisJcGFkX2xlbiA9IChpbmRleCA8IDU2KSA/ICg1NiAtIGluZGV4KSA6ICgoNjQrNTYpIC0gaW5kZXgpOworCisJZmxhZ3MgPSBvY3Rlb25fY3J5cHRvX2VuYWJsZSgmc3RhdGUpOworCW9jdGVvbl9zaGExX3N0b3JlX2hhc2goc2N0eCk7CisKKwlfX29jdGVvbl9zaGExX3VwZGF0ZShzY3R4LCBwYWRkaW5nLCBwYWRfbGVuKTsKKworCS8qIEFwcGVuZCBsZW5ndGggKGJlZm9yZSBwYWRkaW5nKS4gKi8KKwlfX29jdGVvbl9zaGExX3VwZGF0ZShzY3R4LCAoY29uc3QgdTggKikmYml0cywgc2l6ZW9mKGJpdHMpKTsKKworCW9jdGVvbl9zaGExX3JlYWRfaGFzaChzY3R4KTsKKwlvY3Rlb25fY3J5cHRvX2Rpc2FibGUoJnN0YXRlLCBmbGFncyk7CisKKwkvKiBTdG9yZSBzdGF0ZSBpbiBkaWdlc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlkc3RbaV0gPSBjcHVfdG9fYmUzMihzY3R4LT5zdGF0ZVtpXSk7CisKKwkvKiBaZXJvaXplIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gKi8KKwltZW1zZXQoc2N0eCwgMCwgc2l6ZW9mKCpzY3R4KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY3Rlb25fc2hhMV9leHBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHZvaWQgKm91dCkKK3sKKwlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJbWVtY3B5KG91dCwgc2N0eCwgc2l6ZW9mKCpzY3R4KSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2N0ZW9uX3NoYTFfaW1wb3J0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB2b2lkICppbikKK3sKKwlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJbWVtY3B5KHNjdHgsIGluLCBzaXplb2YoKnNjdHgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgb2N0ZW9uX3NoYTFfYWxnID0geworCS5kaWdlc3RzaXplCT0JU0hBMV9ESUdFU1RfU0laRSwKKwkuaW5pdAkJPQlvY3Rlb25fc2hhMV9pbml0LAorCS51cGRhdGUJCT0Jb2N0ZW9uX3NoYTFfdXBkYXRlLAorCS5maW5hbAkJPQlvY3Rlb25fc2hhMV9maW5hbCwKKwkuZXhwb3J0CQk9CW9jdGVvbl9zaGExX2V4cG9ydCwKKwkuaW1wb3J0CQk9CW9jdGVvbl9zaGExX2ltcG9ydCwKKwkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTFfc3RhdGUpLAorCS5zdGF0ZXNpemUJPQlzaXplb2Yoc3RydWN0IHNoYTFfc3RhdGUpLAorCS5iYXNlCQk9CXsKKwkJLmNyYV9uYW1lCT0JInNoYTEiLAorCQkuY3JhX2RyaXZlcl9uYW1lPQkib2N0ZW9uLXNoYTEiLAorCQkuY3JhX3ByaW9yaXR5CT0JT0NURU9OX0NSX09QQ09ERV9QUklPUklUWSwKKwkJLmNyYV9mbGFncwk9CUNSWVBUT19BTEdfVFlQRV9TSEFTSCwKKwkJLmNyYV9ibG9ja3NpemUJPQlTSEExX0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCT0JVEhJU19NT0RVTEUsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgb2N0ZW9uX3NoYTFfbW9kX2luaXQodm9pZCkKK3sKKwlpZiAoIW9jdGVvbl9oYXNfY3J5cHRvKCkpCisJCXJldHVybiAtRU5PVFNVUFA7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9zaGFzaCgmb2N0ZW9uX3NoYTFfYWxnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG9jdGVvbl9zaGExX21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfc2hhc2goJm9jdGVvbl9zaGExX2FsZyk7Cit9CisKK21vZHVsZV9pbml0KG9jdGVvbl9zaGExX21vZF9pbml0KTsKK21vZHVsZV9leGl0KG9jdGVvbl9zaGExX21vZF9maW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTSEExIFNlY3VyZSBIYXNoIEFsZ29yaXRobSAoT0NURU9OKSIpOworTU9EVUxFX0FVVEhPUigiQWFybyBLb3NraW5lbiA8YWFyby5rb3NraW5lbkBpa2kuZmk+Iik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcnlwdG8vb2N0ZW9uLXNoYTI1Ni5jIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3J5cHRvL29jdGVvbi1zaGEyNTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2U5NmZlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vY3J5cHRvL29jdGVvbi1zaGEyNTYuYwpAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIFNIQS0yMjQgYW5kIFNIQS0yNTYgU2VjdXJlIEhhc2ggQWxnb3JpdGhtLgorICoKKyAqIEFkYXB0ZWQgZm9yIE9DVEVPTiBieSBBYXJvIEtvc2tpbmVuIDxhYXJvLmtvc2tpbmVuQGlraS5maT4uCisgKgorICogQmFzZWQgb24gY3J5cHRvL3NoYTI1Nl9nZW5lcmljLmMsIHdoaWNoIGlzOgorICoKKyAqIENvcHlyaWdodCAoYykgSmVhbi1MdWMgQ29va2UgPGpsY29va2VAY2VydGFpbmtleS5jb20+CisgKiBDb3B5cmlnaHQgKGMpIEFuZHJldyBNY0RvbmFsZCA8YW5kcmV3QG1jZG9uYWxkLm9yZy51az4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KKyAqIFNIQTIyNCBTdXBwb3J0IENvcHlyaWdodCAyMDA3IEludGVsIENvcnBvcmF0aW9uIDxqb25hdGhhbi5seW5jaEBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS9vY3Rlb24vb2N0ZW9uLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKworI2luY2x1ZGUgIm9jdGVvbi1jcnlwdG8uaCIKKworLyoKKyAqIFdlIHBhc3MgZXZlcnl0aGluZyBhcyA2NC1iaXQuIE9DVEVPTiBjYW4gaGFuZGxlIG1pc2FsaWduZWQgZGF0YS4KKyAqLworCitzdGF0aWMgdm9pZCBvY3Rlb25fc2hhMjU2X3N0b3JlX2hhc2goc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCkKK3sKKwl1NjQgKmhhc2ggPSAodTY0ICopc2N0eC0+c3RhdGU7CisKKwl3cml0ZV9vY3Rlb25fNjRiaXRfaGFzaF9kd29yZChoYXNoWzBdLCAwKTsKKwl3cml0ZV9vY3Rlb25fNjRiaXRfaGFzaF9kd29yZChoYXNoWzFdLCAxKTsKKwl3cml0ZV9vY3Rlb25fNjRiaXRfaGFzaF9kd29yZChoYXNoWzJdLCAyKTsKKwl3cml0ZV9vY3Rlb25fNjRiaXRfaGFzaF9kd29yZChoYXNoWzNdLCAzKTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX3NoYTI1Nl9yZWFkX2hhc2goc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCkKK3sKKwl1NjQgKmhhc2ggPSAodTY0ICopc2N0eC0+c3RhdGU7CisKKwloYXNoWzBdID0gcmVhZF9vY3Rlb25fNjRiaXRfaGFzaF9kd29yZCgwKTsKKwloYXNoWzFdID0gcmVhZF9vY3Rlb25fNjRiaXRfaGFzaF9kd29yZCgxKTsKKwloYXNoWzJdID0gcmVhZF9vY3Rlb25fNjRiaXRfaGFzaF9kd29yZCgyKTsKKwloYXNoWzNdID0gcmVhZF9vY3Rlb25fNjRiaXRfaGFzaF9kd29yZCgzKTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX3NoYTI1Nl90cmFuc2Zvcm0oY29uc3Qgdm9pZCAqX2Jsb2NrKQoreworCWNvbnN0IHU2NCAqYmxvY2sgPSBfYmxvY2s7CisKKwl3cml0ZV9vY3Rlb25fNjRiaXRfYmxvY2tfZHdvcmQoYmxvY2tbMF0sIDApOworCXdyaXRlX29jdGVvbl82NGJpdF9ibG9ja19kd29yZChibG9ja1sxXSwgMSk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX2R3b3JkKGJsb2NrWzJdLCAyKTsKKwl3cml0ZV9vY3Rlb25fNjRiaXRfYmxvY2tfZHdvcmQoYmxvY2tbM10sIDMpOworCXdyaXRlX29jdGVvbl82NGJpdF9ibG9ja19kd29yZChibG9ja1s0XSwgNCk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX2R3b3JkKGJsb2NrWzVdLCA1KTsKKwl3cml0ZV9vY3Rlb25fNjRiaXRfYmxvY2tfZHdvcmQoYmxvY2tbNl0sIDYpOworCW9jdGVvbl9zaGEyNTZfc3RhcnQoYmxvY2tbN10pOworfQorCitzdGF0aWMgaW50IG9jdGVvbl9zaGEyMjRfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKwlzY3R4LT5zdGF0ZVswXSA9IFNIQTIyNF9IMDsKKwlzY3R4LT5zdGF0ZVsxXSA9IFNIQTIyNF9IMTsKKwlzY3R4LT5zdGF0ZVsyXSA9IFNIQTIyNF9IMjsKKwlzY3R4LT5zdGF0ZVszXSA9IFNIQTIyNF9IMzsKKwlzY3R4LT5zdGF0ZVs0XSA9IFNIQTIyNF9INDsKKwlzY3R4LT5zdGF0ZVs1XSA9IFNIQTIyNF9INTsKKwlzY3R4LT5zdGF0ZVs2XSA9IFNIQTIyNF9INjsKKwlzY3R4LT5zdGF0ZVs3XSA9IFNIQTIyNF9INzsKKwlzY3R4LT5jb3VudCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY3Rlb25fc2hhMjU2X2luaXQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJc2N0eC0+c3RhdGVbMF0gPSBTSEEyNTZfSDA7CisJc2N0eC0+c3RhdGVbMV0gPSBTSEEyNTZfSDE7CisJc2N0eC0+c3RhdGVbMl0gPSBTSEEyNTZfSDI7CisJc2N0eC0+c3RhdGVbM10gPSBTSEEyNTZfSDM7CisJc2N0eC0+c3RhdGVbNF0gPSBTSEEyNTZfSDQ7CisJc2N0eC0+c3RhdGVbNV0gPSBTSEEyNTZfSDU7CisJc2N0eC0+c3RhdGVbNl0gPSBTSEEyNTZfSDY7CisJc2N0eC0+c3RhdGVbN10gPSBTSEEyNTZfSDc7CisJc2N0eC0+Y291bnQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fb2N0ZW9uX3NoYTI1Nl91cGRhdGUoc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCwgY29uc3QgdTggKmRhdGEsCisJCQkJICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgcGFydGlhbDsKKwl1bnNpZ25lZCBpbnQgZG9uZTsKKwljb25zdCB1OCAqc3JjOworCisJcGFydGlhbCA9IHNjdHgtPmNvdW50ICUgU0hBMjU2X0JMT0NLX1NJWkU7CisJc2N0eC0+Y291bnQgKz0gbGVuOworCWRvbmUgPSAwOworCXNyYyA9IGRhdGE7CisKKwlpZiAoKHBhcnRpYWwgKyBsZW4pID49IFNIQTI1Nl9CTE9DS19TSVpFKSB7CisJCWlmIChwYXJ0aWFsKSB7CisJCQlkb25lID0gLXBhcnRpYWw7CisJCQltZW1jcHkoc2N0eC0+YnVmICsgcGFydGlhbCwgZGF0YSwKKwkJCSAgICAgICBkb25lICsgU0hBMjU2X0JMT0NLX1NJWkUpOworCQkJc3JjID0gc2N0eC0+YnVmOworCQl9CisKKwkJZG8geworCQkJb2N0ZW9uX3NoYTI1Nl90cmFuc2Zvcm0oc3JjKTsKKwkJCWRvbmUgKz0gU0hBMjU2X0JMT0NLX1NJWkU7CisJCQlzcmMgPSBkYXRhICsgZG9uZTsKKwkJfSB3aGlsZSAoZG9uZSArIFNIQTI1Nl9CTE9DS19TSVpFIDw9IGxlbik7CisKKwkJcGFydGlhbCA9IDA7CisJfQorCW1lbWNweShzY3R4LT5idWYgKyBwYXJ0aWFsLCBzcmMsIGxlbiAtIGRvbmUpOworfQorCitzdGF0aWMgaW50IG9jdGVvbl9zaGEyNTZfdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCQl1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwlzdHJ1Y3Qgb2N0ZW9uX2NvcDJfc3RhdGUgc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogU21hbGwgdXBkYXRlcyBuZXZlciByZWFjaCB0aGUgY3J5cHRvIGVuZ2luZSwgc28gdGhlIGdlbmVyaWMgc2hhMjU2IGlzCisJICogZmFzdGVyIGJlY2F1c2Ugb2YgdGhlIGhlYXZ5d2VpZ2h0IG9jdGVvbl9jcnlwdG9fZW5hYmxlKCkgLworCSAqIG9jdGVvbl9jcnlwdG9fZGlzYWJsZSgpLgorCSAqLworCWlmICgoc2N0eC0+Y291bnQgJSBTSEEyNTZfQkxPQ0tfU0laRSkgKyBsZW4gPCBTSEEyNTZfQkxPQ0tfU0laRSkKKwkJcmV0dXJuIGNyeXB0b19zaGEyNTZfdXBkYXRlKGRlc2MsIGRhdGEsIGxlbik7CisKKwlmbGFncyA9IG9jdGVvbl9jcnlwdG9fZW5hYmxlKCZzdGF0ZSk7CisJb2N0ZW9uX3NoYTI1Nl9zdG9yZV9oYXNoKHNjdHgpOworCisJX19vY3Rlb25fc2hhMjU2X3VwZGF0ZShzY3R4LCBkYXRhLCBsZW4pOworCisJb2N0ZW9uX3NoYTI1Nl9yZWFkX2hhc2goc2N0eCk7CisJb2N0ZW9uX2NyeXB0b19kaXNhYmxlKCZzdGF0ZSwgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2N0ZW9uX3NoYTI1Nl9maW5hbChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKK3sKKwlzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisJc3RhdGljIGNvbnN0IHU4IHBhZGRpbmdbNjRdID0geyAweDgwLCB9OworCXN0cnVjdCBvY3Rlb25fY29wMl9zdGF0ZSBzdGF0ZTsKKwlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXQ7CisJdW5zaWduZWQgaW50IHBhZF9sZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJX19iZTY0IGJpdHM7CisJaW50IGk7CisKKwkvKiBTYXZlIG51bWJlciBvZiBiaXRzLiAqLworCWJpdHMgPSBjcHVfdG9fYmU2NChzY3R4LT5jb3VudCA8PCAzKTsKKworCS8qIFBhZCBvdXQgdG8gNTYgbW9kIDY0LiAqLworCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOworCXBhZF9sZW4gPSAoaW5kZXggPCA1NikgPyAoNTYgLSBpbmRleCkgOiAoKDY0KzU2KSAtIGluZGV4KTsKKworCWZsYWdzID0gb2N0ZW9uX2NyeXB0b19lbmFibGUoJnN0YXRlKTsKKwlvY3Rlb25fc2hhMjU2X3N0b3JlX2hhc2goc2N0eCk7CisKKwlfX29jdGVvbl9zaGEyNTZfdXBkYXRlKHNjdHgsIHBhZGRpbmcsIHBhZF9sZW4pOworCisJLyogQXBwZW5kIGxlbmd0aCAoYmVmb3JlIHBhZGRpbmcpLiAqLworCV9fb2N0ZW9uX3NoYTI1Nl91cGRhdGUoc2N0eCwgKGNvbnN0IHU4ICopJmJpdHMsIHNpemVvZihiaXRzKSk7CisKKwlvY3Rlb25fc2hhMjU2X3JlYWRfaGFzaChzY3R4KTsKKwlvY3Rlb25fY3J5cHRvX2Rpc2FibGUoJnN0YXRlLCBmbGFncyk7CisKKwkvKiBTdG9yZSBzdGF0ZSBpbiBkaWdlc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQlkc3RbaV0gPSBjcHVfdG9fYmUzMihzY3R4LT5zdGF0ZVtpXSk7CisKKwkvKiBaZXJvaXplIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gKi8KKwltZW1zZXQoc2N0eCwgMCwgc2l6ZW9mKCpzY3R4KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY3Rlb25fc2hhMjI0X2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB1OCAqaGFzaCkKK3sKKwl1OCBEW1NIQTI1Nl9ESUdFU1RfU0laRV07CisKKwlvY3Rlb25fc2hhMjU2X2ZpbmFsKGRlc2MsIEQpOworCisJbWVtY3B5KGhhc2gsIEQsIFNIQTIyNF9ESUdFU1RfU0laRSk7CisJbWVtemVyb19leHBsaWNpdChELCBTSEEyNTZfRElHRVNUX1NJWkUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2N0ZW9uX3NoYTI1Nl9leHBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHZvaWQgKm91dCkKK3sKKwlzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKwltZW1jcHkob3V0LCBzY3R4LCBzaXplb2YoKnNjdHgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY3Rlb25fc2hhMjU2X2ltcG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3Qgdm9pZCAqaW4pCit7CisJc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJbWVtY3B5KHNjdHgsIGluLCBzaXplb2YoKnNjdHgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgb2N0ZW9uX3NoYTI1Nl9hbGdzWzJdID0geyB7CisJLmRpZ2VzdHNpemUJPQlTSEEyNTZfRElHRVNUX1NJWkUsCisJLmluaXQJCT0Jb2N0ZW9uX3NoYTI1Nl9pbml0LAorCS51cGRhdGUJCT0Jb2N0ZW9uX3NoYTI1Nl91cGRhdGUsCisJLmZpbmFsCQk9CW9jdGVvbl9zaGEyNTZfZmluYWwsCisJLmV4cG9ydAkJPQlvY3Rlb25fc2hhMjU2X2V4cG9ydCwKKwkuaW1wb3J0CQk9CW9jdGVvbl9zaGEyNTZfaW1wb3J0LAorCS5kZXNjc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMjU2X3N0YXRlKSwKKwkuc3RhdGVzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGEyNTZfc3RhdGUpLAorCS5iYXNlCQk9CXsKKwkJLmNyYV9uYW1lCT0JInNoYTI1NiIsCisJCS5jcmFfZHJpdmVyX25hbWU9CSJvY3Rlb24tc2hhMjU2IiwKKwkJLmNyYV9wcmlvcml0eQk9CU9DVEVPTl9DUl9PUENPREVfUFJJT1JJVFksCisJCS5jcmFfZmxhZ3MJPQlDUllQVE9fQUxHX1RZUEVfU0hBU0gsCisJCS5jcmFfYmxvY2tzaXplCT0JU0hBMjU2X0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCT0JVEhJU19NT0RVTEUsCisJfQorfSwgeworCS5kaWdlc3RzaXplCT0JU0hBMjI0X0RJR0VTVF9TSVpFLAorCS5pbml0CQk9CW9jdGVvbl9zaGEyMjRfaW5pdCwKKwkudXBkYXRlCQk9CW9jdGVvbl9zaGEyNTZfdXBkYXRlLAorCS5maW5hbAkJPQlvY3Rlb25fc2hhMjI0X2ZpbmFsLAorCS5kZXNjc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMjU2X3N0YXRlKSwKKwkuYmFzZQkJPQl7CisJCS5jcmFfbmFtZQk9CSJzaGEyMjQiLAorCQkuY3JhX2RyaXZlcl9uYW1lPQkib2N0ZW9uLXNoYTIyNCIsCisJCS5jcmFfZmxhZ3MJPQlDUllQVE9fQUxHX1RZUEVfU0hBU0gsCisJCS5jcmFfYmxvY2tzaXplCT0JU0hBMjI0X0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCT0JVEhJU19NT0RVTEUsCisJfQorfSB9OworCitzdGF0aWMgaW50IF9faW5pdCBvY3Rlb25fc2hhMjU2X21vZF9pbml0KHZvaWQpCit7CisJaWYgKCFvY3Rlb25faGFzX2NyeXB0bygpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfc2hhc2hlcyhvY3Rlb25fc2hhMjU2X2FsZ3MsCisJCQkJICAgICAgIEFSUkFZX1NJWkUob2N0ZW9uX3NoYTI1Nl9hbGdzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvY3Rlb25fc2hhMjU2X21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfc2hhc2hlcyhvY3Rlb25fc2hhMjU2X2FsZ3MsCisJCQkJICBBUlJBWV9TSVpFKG9jdGVvbl9zaGEyNTZfYWxncykpOworfQorCittb2R1bGVfaW5pdChvY3Rlb25fc2hhMjU2X21vZF9pbml0KTsKK21vZHVsZV9leGl0KG9jdGVvbl9zaGEyNTZfbW9kX2ZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNIQS0yMjQgYW5kIFNIQS0yNTYgU2VjdXJlIEhhc2ggQWxnb3JpdGhtIChPQ1RFT04pIik7CitNT0RVTEVfQVVUSE9SKCJBYXJvIEtvc2tpbmVuIDxhYXJvLmtvc2tpbmVuQGlraS5maT4iKTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL2NyeXB0by9vY3Rlb24tc2hhNTEyLmMgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcnlwdG8vb2N0ZW9uLXNoYTUxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZmIzYzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9jcnlwdG8vb2N0ZW9uLXNoYTUxMi5jCkBAIC0wLDAgKzEsMjc3IEBACisvKgorICogQ3J5cHRvZ3JhcGhpYyBBUEkuCisgKgorICogU0hBLTUxMiBhbmQgU0hBLTM4NCBTZWN1cmUgSGFzaCBBbGdvcml0aG0uCisgKgorICogQWRhcHRlZCBmb3IgT0NURU9OIGJ5IEFhcm8gS29za2luZW4gPGFhcm8ua29za2luZW5AaWtpLmZpPi4KKyAqCisgKiBCYXNlZCBvbiBjcnlwdG8vc2hhNTEyX2dlbmVyaWMuYywgd2hpY2ggaXM6CisgKgorICogQ29weXJpZ2h0IChjKSBKZWFuLUx1YyBDb29rZSA8amxjb29rZUBjZXJ0YWlua2V5LmNvbT4KKyAqIENvcHlyaWdodCAoYykgQW5kcmV3IE1jRG9uYWxkIDxhbmRyZXdAbWNkb25hbGQub3JnLnVrPgorICogQ29weXJpZ2h0IChjKSAyMDAzIEt5bGUgTWNNYXJ0aW4gPGt5bGVAZGViaWFuLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL29jdGVvbi9vY3Rlb24uaD4KKyNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvaGFzaC5oPgorCisjaW5jbHVkZSAib2N0ZW9uLWNyeXB0by5oIgorCisvKgorICogV2UgcGFzcyBldmVyeXRoaW5nIGFzIDY0LWJpdC4gT0NURU9OIGNhbiBoYW5kbGUgbWlzYWxpZ25lZCBkYXRhLgorICovCisKK3N0YXRpYyB2b2lkIG9jdGVvbl9zaGE1MTJfc3RvcmVfaGFzaChzdHJ1Y3Qgc2hhNTEyX3N0YXRlICpzY3R4KQoreworCXdyaXRlX29jdGVvbl82NGJpdF9oYXNoX3NoYTUxMihzY3R4LT5zdGF0ZVswXSwgMCk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2hhc2hfc2hhNTEyKHNjdHgtPnN0YXRlWzFdLCAxKTsKKwl3cml0ZV9vY3Rlb25fNjRiaXRfaGFzaF9zaGE1MTIoc2N0eC0+c3RhdGVbMl0sIDIpOworCXdyaXRlX29jdGVvbl82NGJpdF9oYXNoX3NoYTUxMihzY3R4LT5zdGF0ZVszXSwgMyk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2hhc2hfc2hhNTEyKHNjdHgtPnN0YXRlWzRdLCA0KTsKKwl3cml0ZV9vY3Rlb25fNjRiaXRfaGFzaF9zaGE1MTIoc2N0eC0+c3RhdGVbNV0sIDUpOworCXdyaXRlX29jdGVvbl82NGJpdF9oYXNoX3NoYTUxMihzY3R4LT5zdGF0ZVs2XSwgNik7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2hhc2hfc2hhNTEyKHNjdHgtPnN0YXRlWzddLCA3KTsKK30KKworc3RhdGljIHZvaWQgb2N0ZW9uX3NoYTUxMl9yZWFkX2hhc2goc3RydWN0IHNoYTUxMl9zdGF0ZSAqc2N0eCkKK3sKKwlzY3R4LT5zdGF0ZVswXSA9IHJlYWRfb2N0ZW9uXzY0Yml0X2hhc2hfc2hhNTEyKDApOworCXNjdHgtPnN0YXRlWzFdID0gcmVhZF9vY3Rlb25fNjRiaXRfaGFzaF9zaGE1MTIoMSk7CisJc2N0eC0+c3RhdGVbMl0gPSByZWFkX29jdGVvbl82NGJpdF9oYXNoX3NoYTUxMigyKTsKKwlzY3R4LT5zdGF0ZVszXSA9IHJlYWRfb2N0ZW9uXzY0Yml0X2hhc2hfc2hhNTEyKDMpOworCXNjdHgtPnN0YXRlWzRdID0gcmVhZF9vY3Rlb25fNjRiaXRfaGFzaF9zaGE1MTIoNCk7CisJc2N0eC0+c3RhdGVbNV0gPSByZWFkX29jdGVvbl82NGJpdF9oYXNoX3NoYTUxMig1KTsKKwlzY3R4LT5zdGF0ZVs2XSA9IHJlYWRfb2N0ZW9uXzY0Yml0X2hhc2hfc2hhNTEyKDYpOworCXNjdHgtPnN0YXRlWzddID0gcmVhZF9vY3Rlb25fNjRiaXRfaGFzaF9zaGE1MTIoNyk7Cit9CisKK3N0YXRpYyB2b2lkIG9jdGVvbl9zaGE1MTJfdHJhbnNmb3JtKGNvbnN0IHZvaWQgKl9ibG9jaykKK3sKKwljb25zdCB1NjQgKmJsb2NrID0gX2Jsb2NrOworCisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1swXSwgMCk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1sxXSwgMSk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1syXSwgMik7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1szXSwgMyk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1s0XSwgNCk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1s1XSwgNSk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1s2XSwgNik7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1s3XSwgNyk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1s4XSwgOCk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1s5XSwgOSk7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1sxMF0sIDEwKTsKKwl3cml0ZV9vY3Rlb25fNjRiaXRfYmxvY2tfc2hhNTEyKGJsb2NrWzExXSwgMTEpOworCXdyaXRlX29jdGVvbl82NGJpdF9ibG9ja19zaGE1MTIoYmxvY2tbMTJdLCAxMik7CisJd3JpdGVfb2N0ZW9uXzY0Yml0X2Jsb2NrX3NoYTUxMihibG9ja1sxM10sIDEzKTsKKwl3cml0ZV9vY3Rlb25fNjRiaXRfYmxvY2tfc2hhNTEyKGJsb2NrWzE0XSwgMTQpOworCW9jdGVvbl9zaGE1MTJfc3RhcnQoYmxvY2tbMTVdKTsKK30KKworc3RhdGljIGludCBvY3Rlb25fc2hhNTEyX2luaXQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHNoYTUxMl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJc2N0eC0+c3RhdGVbMF0gPSBTSEE1MTJfSDA7CisJc2N0eC0+c3RhdGVbMV0gPSBTSEE1MTJfSDE7CisJc2N0eC0+c3RhdGVbMl0gPSBTSEE1MTJfSDI7CisJc2N0eC0+c3RhdGVbM10gPSBTSEE1MTJfSDM7CisJc2N0eC0+c3RhdGVbNF0gPSBTSEE1MTJfSDQ7CisJc2N0eC0+c3RhdGVbNV0gPSBTSEE1MTJfSDU7CisJc2N0eC0+c3RhdGVbNl0gPSBTSEE1MTJfSDY7CisJc2N0eC0+c3RhdGVbN10gPSBTSEE1MTJfSDc7CisJc2N0eC0+Y291bnRbMF0gPSBzY3R4LT5jb3VudFsxXSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY3Rlb25fc2hhMzg0X2luaXQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHNoYTUxMl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJc2N0eC0+c3RhdGVbMF0gPSBTSEEzODRfSDA7CisJc2N0eC0+c3RhdGVbMV0gPSBTSEEzODRfSDE7CisJc2N0eC0+c3RhdGVbMl0gPSBTSEEzODRfSDI7CisJc2N0eC0+c3RhdGVbM10gPSBTSEEzODRfSDM7CisJc2N0eC0+c3RhdGVbNF0gPSBTSEEzODRfSDQ7CisJc2N0eC0+c3RhdGVbNV0gPSBTSEEzODRfSDU7CisJc2N0eC0+c3RhdGVbNl0gPSBTSEEzODRfSDY7CisJc2N0eC0+c3RhdGVbN10gPSBTSEEzODRfSDc7CisJc2N0eC0+Y291bnRbMF0gPSBzY3R4LT5jb3VudFsxXSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19vY3Rlb25fc2hhNTEyX3VwZGF0ZShzdHJ1Y3Qgc2hhNTEyX3N0YXRlICpzY3R4LCBjb25zdCB1OCAqZGF0YSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBwYXJ0X2xlbjsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKiBDb21wdXRlIG51bWJlciBvZiBieXRlcyBtb2QgMTI4LiAqLworCWluZGV4ID0gc2N0eC0+Y291bnRbMF0gJSBTSEE1MTJfQkxPQ0tfU0laRTsKKworCS8qIFVwZGF0ZSBudW1iZXIgb2YgYnl0ZXMuICovCisJaWYgKChzY3R4LT5jb3VudFswXSArPSBsZW4pIDwgbGVuKQorCQlzY3R4LT5jb3VudFsxXSsrOworCisJcGFydF9sZW4gPSBTSEE1MTJfQkxPQ0tfU0laRSAtIGluZGV4OworCisJLyogVHJhbnNmb3JtIGFzIG1hbnkgdGltZXMgYXMgcG9zc2libGUuICovCisJaWYgKGxlbiA+PSBwYXJ0X2xlbikgeworCQltZW1jcHkoJnNjdHgtPmJ1ZltpbmRleF0sIGRhdGEsIHBhcnRfbGVuKTsKKwkJb2N0ZW9uX3NoYTUxMl90cmFuc2Zvcm0oc2N0eC0+YnVmKTsKKworCQlmb3IgKGkgPSBwYXJ0X2xlbjsgaSArIFNIQTUxMl9CTE9DS19TSVpFIDw9IGxlbjsKKwkJCWkgKz0gU0hBNTEyX0JMT0NLX1NJWkUpCisJCQlvY3Rlb25fc2hhNTEyX3RyYW5zZm9ybSgmZGF0YVtpXSk7CisKKwkJaW5kZXggPSAwOworCX0gZWxzZSB7CisJCWkgPSAwOworCX0KKworCS8qIEJ1ZmZlciByZW1haW5pbmcgaW5wdXQuICovCisJbWVtY3B5KCZzY3R4LT5idWZbaW5kZXhdLCAmZGF0YVtpXSwgbGVuIC0gaSk7Cit9CisKK3N0YXRpYyBpbnQgb2N0ZW9uX3NoYTUxMl91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJCXVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHNoYTUxMl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCXN0cnVjdCBvY3Rlb25fY29wMl9zdGF0ZSBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBTbWFsbCB1cGRhdGVzIG5ldmVyIHJlYWNoIHRoZSBjcnlwdG8gZW5naW5lLCBzbyB0aGUgZ2VuZXJpYyBzaGE1MTIgaXMKKwkgKiBmYXN0ZXIgYmVjYXVzZSBvZiB0aGUgaGVhdnl3ZWlnaHQgb2N0ZW9uX2NyeXB0b19lbmFibGUoKSAvCisJICogb2N0ZW9uX2NyeXB0b19kaXNhYmxlKCkuCisJICovCisJaWYgKChzY3R4LT5jb3VudFswXSAlIFNIQTUxMl9CTE9DS19TSVpFKSArIGxlbiA8IFNIQTUxMl9CTE9DS19TSVpFKQorCQlyZXR1cm4gY3J5cHRvX3NoYTUxMl91cGRhdGUoZGVzYywgZGF0YSwgbGVuKTsKKworCWZsYWdzID0gb2N0ZW9uX2NyeXB0b19lbmFibGUoJnN0YXRlKTsKKwlvY3Rlb25fc2hhNTEyX3N0b3JlX2hhc2goc2N0eCk7CisKKwlfX29jdGVvbl9zaGE1MTJfdXBkYXRlKHNjdHgsIGRhdGEsIGxlbik7CisKKwlvY3Rlb25fc2hhNTEyX3JlYWRfaGFzaChzY3R4KTsKKwlvY3Rlb25fY3J5cHRvX2Rpc2FibGUoJnN0YXRlLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvY3Rlb25fc2hhNTEyX2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB1OCAqaGFzaCkKK3sKKwlzdHJ1Y3Qgc2hhNTEyX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisJc3RhdGljIHU4IHBhZGRpbmdbMTI4XSA9IHsgMHg4MCwgfTsKKwlzdHJ1Y3Qgb2N0ZW9uX2NvcDJfc3RhdGUgc3RhdGU7CisJX19iZTY0ICpkc3QgPSAoX19iZTY0ICopaGFzaDsKKwl1bnNpZ25lZCBpbnQgcGFkX2xlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpbmRleDsKKwlfX2JlNjQgYml0c1syXTsKKwlpbnQgaTsKKworCS8qIFNhdmUgbnVtYmVyIG9mIGJpdHMuICovCisJYml0c1sxXSA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50WzBdIDw8IDMpOworCWJpdHNbMF0gPSBjcHVfdG9fYmU2NChzY3R4LT5jb3VudFsxXSA8PCAzIHwgc2N0eC0+Y291bnRbMF0gPj4gNjEpOworCisJLyogUGFkIG91dCB0byAxMTIgbW9kIDEyOC4gKi8KKwlpbmRleCA9IHNjdHgtPmNvdW50WzBdICYgMHg3ZjsKKwlwYWRfbGVuID0gKGluZGV4IDwgMTEyKSA/ICgxMTIgLSBpbmRleCkgOiAoKDEyOCsxMTIpIC0gaW5kZXgpOworCisJZmxhZ3MgPSBvY3Rlb25fY3J5cHRvX2VuYWJsZSgmc3RhdGUpOworCW9jdGVvbl9zaGE1MTJfc3RvcmVfaGFzaChzY3R4KTsKKworCV9fb2N0ZW9uX3NoYTUxMl91cGRhdGUoc2N0eCwgcGFkZGluZywgcGFkX2xlbik7CisKKwkvKiBBcHBlbmQgbGVuZ3RoIChiZWZvcmUgcGFkZGluZykuICovCisJX19vY3Rlb25fc2hhNTEyX3VwZGF0ZShzY3R4LCAoY29uc3QgdTggKiliaXRzLCBzaXplb2YoYml0cykpOworCisJb2N0ZW9uX3NoYTUxMl9yZWFkX2hhc2goc2N0eCk7CisJb2N0ZW9uX2NyeXB0b19kaXNhYmxlKCZzdGF0ZSwgZmxhZ3MpOworCisJLyogU3RvcmUgc3RhdGUgaW4gZGlnZXN0LiAqLworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWRzdFtpXSA9IGNwdV90b19iZTY0KHNjdHgtPnN0YXRlW2ldKTsKKworCS8qIFplcm9pemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAqLworCW1lbXNldChzY3R4LCAwLCBzaXplb2Yoc3RydWN0IHNoYTUxMl9zdGF0ZSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb2N0ZW9uX3NoYTM4NF9maW5hbChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKmhhc2gpCit7CisJdTggRFs2NF07CisKKwlvY3Rlb25fc2hhNTEyX2ZpbmFsKGRlc2MsIEQpOworCisJbWVtY3B5KGhhc2gsIEQsIDQ4KTsKKwltZW16ZXJvX2V4cGxpY2l0KEQsIDY0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNoYXNoX2FsZyBvY3Rlb25fc2hhNTEyX2FsZ3NbMl0gPSB7IHsKKwkuZGlnZXN0c2l6ZQk9CVNIQTUxMl9ESUdFU1RfU0laRSwKKwkuaW5pdAkJPQlvY3Rlb25fc2hhNTEyX2luaXQsCisJLnVwZGF0ZQkJPQlvY3Rlb25fc2hhNTEyX3VwZGF0ZSwKKwkuZmluYWwJCT0Jb2N0ZW9uX3NoYTUxMl9maW5hbCwKKwkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTUxMl9zdGF0ZSksCisJLmJhc2UJCT0JeworCQkuY3JhX25hbWUJPQkic2hhNTEyIiwKKwkJLmNyYV9kcml2ZXJfbmFtZT0JIm9jdGVvbi1zaGE1MTIiLAorCQkuY3JhX3ByaW9yaXR5CT0JT0NURU9OX0NSX09QQ09ERV9QUklPUklUWSwKKwkJLmNyYV9mbGFncwk9CUNSWVBUT19BTEdfVFlQRV9TSEFTSCwKKwkJLmNyYV9ibG9ja3NpemUJPQlTSEE1MTJfQkxPQ0tfU0laRSwKKwkJLmNyYV9tb2R1bGUJPQlUSElTX01PRFVMRSwKKwl9Cit9LCB7CisJLmRpZ2VzdHNpemUJPQlTSEEzODRfRElHRVNUX1NJWkUsCisJLmluaXQJCT0Jb2N0ZW9uX3NoYTM4NF9pbml0LAorCS51cGRhdGUJCT0Jb2N0ZW9uX3NoYTUxMl91cGRhdGUsCisJLmZpbmFsCQk9CW9jdGVvbl9zaGEzODRfZmluYWwsCisJLmRlc2NzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGE1MTJfc3RhdGUpLAorCS5iYXNlCQk9CXsKKwkJLmNyYV9uYW1lCT0JInNoYTM4NCIsCisJCS5jcmFfZHJpdmVyX25hbWU9CSJvY3Rlb24tc2hhMzg0IiwKKwkJLmNyYV9wcmlvcml0eQk9CU9DVEVPTl9DUl9PUENPREVfUFJJT1JJVFksCisJCS5jcmFfZmxhZ3MJPQlDUllQVE9fQUxHX1RZUEVfU0hBU0gsCisJCS5jcmFfYmxvY2tzaXplCT0JU0hBMzg0X0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCT0JVEhJU19NT0RVTEUsCisJfQorfSB9OworCitzdGF0aWMgaW50IF9faW5pdCBvY3Rlb25fc2hhNTEyX21vZF9pbml0KHZvaWQpCit7CisJaWYgKCFvY3Rlb25faGFzX2NyeXB0bygpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfc2hhc2hlcyhvY3Rlb25fc2hhNTEyX2FsZ3MsCisJCQkJICAgICAgIEFSUkFZX1NJWkUob2N0ZW9uX3NoYTUxMl9hbGdzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvY3Rlb25fc2hhNTEyX21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfc2hhc2hlcyhvY3Rlb25fc2hhNTEyX2FsZ3MsCisJCQkJICBBUlJBWV9TSVpFKG9jdGVvbl9zaGE1MTJfYWxncykpOworfQorCittb2R1bGVfaW5pdChvY3Rlb25fc2hhNTEyX21vZF9pbml0KTsKK21vZHVsZV9leGl0KG9jdGVvbl9zaGE1MTJfbW9kX2ZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNIQS01MTIgYW5kIFNIQS0zODQgU2VjdXJlIEhhc2ggQWxnb3JpdGhtcyAoT0NURU9OKSIpOworTU9EVUxFX0FVVEhPUigiQWFybyBLb3NraW5lbiA8YWFyby5rb3NraW5lbkBpa2kuZmk+Iik7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8tMzIuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby0zMi5oCmluZGV4IGNkYWM3YjMuLjgwMzg2NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby0zMi5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9hc21tYWNyby0zMi5oCkBAIC0xNiwzOCArMTYsMzggQEAKIAkuc2V0IHB1c2gKIAlTRVRfSEFSREZMT0FUCiAJY2ZjMQlcdG1wLCAgZmNyMzEKLQlzd2MxCSRmMCwgIFRIUkVBRF9GUFIwX0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmMSwgIFRIUkVBRF9GUFIxX0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmMiwgIFRIUkVBRF9GUFIyX0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmMywgIFRIUkVBRF9GUFIzX0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmNCwgIFRIUkVBRF9GUFI0X0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmNSwgIFRIUkVBRF9GUFI1X0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmNiwgIFRIUkVBRF9GUFI2X0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmNywgIFRIUkVBRF9GUFI3X0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmOCwgIFRIUkVBRF9GUFI4X0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmOSwgIFRIUkVBRF9GUFI5X0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmMTAsIFRIUkVBRF9GUFIxMF9MUzY0KFx0aHJlYWQpCi0Jc3djMQkkZjExLCBUSFJFQURfRlBSMTFfTFM2NChcdGhyZWFkKQotCXN3YzEJJGYxMiwgVEhSRUFEX0ZQUjEyX0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmMTMsIFRIUkVBRF9GUFIxM19MUzY0KFx0aHJlYWQpCi0Jc3djMQkkZjE0LCBUSFJFQURfRlBSMTRfTFM2NChcdGhyZWFkKQotCXN3YzEJJGYxNSwgVEhSRUFEX0ZQUjE1X0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmMTYsIFRIUkVBRF9GUFIxNl9MUzY0KFx0aHJlYWQpCi0Jc3djMQkkZjE3LCBUSFJFQURfRlBSMTdfTFM2NChcdGhyZWFkKQotCXN3YzEJJGYxOCwgVEhSRUFEX0ZQUjE4X0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmMTksIFRIUkVBRF9GUFIxOV9MUzY0KFx0aHJlYWQpCi0Jc3djMQkkZjIwLCBUSFJFQURfRlBSMjBfTFM2NChcdGhyZWFkKQotCXN3YzEJJGYyMSwgVEhSRUFEX0ZQUjIxX0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmMjIsIFRIUkVBRF9GUFIyMl9MUzY0KFx0aHJlYWQpCi0Jc3djMQkkZjIzLCBUSFJFQURfRlBSMjNfTFM2NChcdGhyZWFkKQotCXN3YzEJJGYyNCwgVEhSRUFEX0ZQUjI0X0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmMjUsIFRIUkVBRF9GUFIyNV9MUzY0KFx0aHJlYWQpCi0Jc3djMQkkZjI2LCBUSFJFQURfRlBSMjZfTFM2NChcdGhyZWFkKQotCXN3YzEJJGYyNywgVEhSRUFEX0ZQUjI3X0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmMjgsIFRIUkVBRF9GUFIyOF9MUzY0KFx0aHJlYWQpCi0Jc3djMQkkZjI5LCBUSFJFQURfRlBSMjlfTFM2NChcdGhyZWFkKQotCXN3YzEJJGYzMCwgVEhSRUFEX0ZQUjMwX0xTNjQoXHRocmVhZCkKLQlzd2MxCSRmMzEsIFRIUkVBRF9GUFIzMV9MUzY0KFx0aHJlYWQpCisJc3djMQkkZjAsICBUSFJFQURfRlBSMChcdGhyZWFkKQorCXN3YzEJJGYxLCAgVEhSRUFEX0ZQUjEoXHRocmVhZCkKKwlzd2MxCSRmMiwgIFRIUkVBRF9GUFIyKFx0aHJlYWQpCisJc3djMQkkZjMsICBUSFJFQURfRlBSMyhcdGhyZWFkKQorCXN3YzEJJGY0LCAgVEhSRUFEX0ZQUjQoXHRocmVhZCkKKwlzd2MxCSRmNSwgIFRIUkVBRF9GUFI1KFx0aHJlYWQpCisJc3djMQkkZjYsICBUSFJFQURfRlBSNihcdGhyZWFkKQorCXN3YzEJJGY3LCAgVEhSRUFEX0ZQUjcoXHRocmVhZCkKKwlzd2MxCSRmOCwgIFRIUkVBRF9GUFI4KFx0aHJlYWQpCisJc3djMQkkZjksICBUSFJFQURfRlBSOShcdGhyZWFkKQorCXN3YzEJJGYxMCwgVEhSRUFEX0ZQUjEwKFx0aHJlYWQpCisJc3djMQkkZjExLCBUSFJFQURfRlBSMTEoXHRocmVhZCkKKwlzd2MxCSRmMTIsIFRIUkVBRF9GUFIxMihcdGhyZWFkKQorCXN3YzEJJGYxMywgVEhSRUFEX0ZQUjEzKFx0aHJlYWQpCisJc3djMQkkZjE0LCBUSFJFQURfRlBSMTQoXHRocmVhZCkKKwlzd2MxCSRmMTUsIFRIUkVBRF9GUFIxNShcdGhyZWFkKQorCXN3YzEJJGYxNiwgVEhSRUFEX0ZQUjE2KFx0aHJlYWQpCisJc3djMQkkZjE3LCBUSFJFQURfRlBSMTcoXHRocmVhZCkKKwlzd2MxCSRmMTgsIFRIUkVBRF9GUFIxOChcdGhyZWFkKQorCXN3YzEJJGYxOSwgVEhSRUFEX0ZQUjE5KFx0aHJlYWQpCisJc3djMQkkZjIwLCBUSFJFQURfRlBSMjAoXHRocmVhZCkKKwlzd2MxCSRmMjEsIFRIUkVBRF9GUFIyMShcdGhyZWFkKQorCXN3YzEJJGYyMiwgVEhSRUFEX0ZQUjIyKFx0aHJlYWQpCisJc3djMQkkZjIzLCBUSFJFQURfRlBSMjMoXHRocmVhZCkKKwlzd2MxCSRmMjQsIFRIUkVBRF9GUFIyNChcdGhyZWFkKQorCXN3YzEJJGYyNSwgVEhSRUFEX0ZQUjI1KFx0aHJlYWQpCisJc3djMQkkZjI2LCBUSFJFQURfRlBSMjYoXHRocmVhZCkKKwlzd2MxCSRmMjcsIFRIUkVBRF9GUFIyNyhcdGhyZWFkKQorCXN3YzEJJGYyOCwgVEhSRUFEX0ZQUjI4KFx0aHJlYWQpCisJc3djMQkkZjI5LCBUSFJFQURfRlBSMjkoXHRocmVhZCkKKwlzd2MxCSRmMzAsIFRIUkVBRF9GUFIzMChcdGhyZWFkKQorCXN3YzEJJGYzMSwgVEhSRUFEX0ZQUjMxKFx0aHJlYWQpCiAJc3cJXHRtcCwgVEhSRUFEX0ZDUjMxKFx0aHJlYWQpCiAJLnNldCBwb3AKIAkuZW5kbQpAQCAtNTYsMzggKzU2LDM4IEBACiAJLnNldCBwdXNoCiAJU0VUX0hBUkRGTE9BVAogCWx3CVx0bXAsIFRIUkVBRF9GQ1IzMShcdGhyZWFkKQotCWx3YzEJJGYwLCAgVEhSRUFEX0ZQUjBfTFM2NChcdGhyZWFkKQotCWx3YzEJJGYxLCAgVEhSRUFEX0ZQUjFfTFM2NChcdGhyZWFkKQotCWx3YzEJJGYyLCAgVEhSRUFEX0ZQUjJfTFM2NChcdGhyZWFkKQotCWx3YzEJJGYzLCAgVEhSRUFEX0ZQUjNfTFM2NChcdGhyZWFkKQotCWx3YzEJJGY0LCAgVEhSRUFEX0ZQUjRfTFM2NChcdGhyZWFkKQotCWx3YzEJJGY1LCAgVEhSRUFEX0ZQUjVfTFM2NChcdGhyZWFkKQotCWx3YzEJJGY2LCAgVEhSRUFEX0ZQUjZfTFM2NChcdGhyZWFkKQotCWx3YzEJJGY3LCAgVEhSRUFEX0ZQUjdfTFM2NChcdGhyZWFkKQotCWx3YzEJJGY4LCAgVEhSRUFEX0ZQUjhfTFM2NChcdGhyZWFkKQotCWx3YzEJJGY5LCAgVEhSRUFEX0ZQUjlfTFM2NChcdGhyZWFkKQotCWx3YzEJJGYxMCwgVEhSRUFEX0ZQUjEwX0xTNjQoXHRocmVhZCkKLQlsd2MxCSRmMTEsIFRIUkVBRF9GUFIxMV9MUzY0KFx0aHJlYWQpCi0JbHdjMQkkZjEyLCBUSFJFQURfRlBSMTJfTFM2NChcdGhyZWFkKQotCWx3YzEJJGYxMywgVEhSRUFEX0ZQUjEzX0xTNjQoXHRocmVhZCkKLQlsd2MxCSRmMTQsIFRIUkVBRF9GUFIxNF9MUzY0KFx0aHJlYWQpCi0JbHdjMQkkZjE1LCBUSFJFQURfRlBSMTVfTFM2NChcdGhyZWFkKQotCWx3YzEJJGYxNiwgVEhSRUFEX0ZQUjE2X0xTNjQoXHRocmVhZCkKLQlsd2MxCSRmMTcsIFRIUkVBRF9GUFIxN19MUzY0KFx0aHJlYWQpCi0JbHdjMQkkZjE4LCBUSFJFQURfRlBSMThfTFM2NChcdGhyZWFkKQotCWx3YzEJJGYxOSwgVEhSRUFEX0ZQUjE5X0xTNjQoXHRocmVhZCkKLQlsd2MxCSRmMjAsIFRIUkVBRF9GUFIyMF9MUzY0KFx0aHJlYWQpCi0JbHdjMQkkZjIxLCBUSFJFQURfRlBSMjFfTFM2NChcdGhyZWFkKQotCWx3YzEJJGYyMiwgVEhSRUFEX0ZQUjIyX0xTNjQoXHRocmVhZCkKLQlsd2MxCSRmMjMsIFRIUkVBRF9GUFIyM19MUzY0KFx0aHJlYWQpCi0JbHdjMQkkZjI0LCBUSFJFQURfRlBSMjRfTFM2NChcdGhyZWFkKQotCWx3YzEJJGYyNSwgVEhSRUFEX0ZQUjI1X0xTNjQoXHRocmVhZCkKLQlsd2MxCSRmMjYsIFRIUkVBRF9GUFIyNl9MUzY0KFx0aHJlYWQpCi0JbHdjMQkkZjI3LCBUSFJFQURfRlBSMjdfTFM2NChcdGhyZWFkKQotCWx3YzEJJGYyOCwgVEhSRUFEX0ZQUjI4X0xTNjQoXHRocmVhZCkKLQlsd2MxCSRmMjksIFRIUkVBRF9GUFIyOV9MUzY0KFx0aHJlYWQpCi0JbHdjMQkkZjMwLCBUSFJFQURfRlBSMzBfTFM2NChcdGhyZWFkKQotCWx3YzEJJGYzMSwgVEhSRUFEX0ZQUjMxX0xTNjQoXHRocmVhZCkKKwlsd2MxCSRmMCwgIFRIUkVBRF9GUFIwKFx0aHJlYWQpCisJbHdjMQkkZjEsICBUSFJFQURfRlBSMShcdGhyZWFkKQorCWx3YzEJJGYyLCAgVEhSRUFEX0ZQUjIoXHRocmVhZCkKKwlsd2MxCSRmMywgIFRIUkVBRF9GUFIzKFx0aHJlYWQpCisJbHdjMQkkZjQsICBUSFJFQURfRlBSNChcdGhyZWFkKQorCWx3YzEJJGY1LCAgVEhSRUFEX0ZQUjUoXHRocmVhZCkKKwlsd2MxCSRmNiwgIFRIUkVBRF9GUFI2KFx0aHJlYWQpCisJbHdjMQkkZjcsICBUSFJFQURfRlBSNyhcdGhyZWFkKQorCWx3YzEJJGY4LCAgVEhSRUFEX0ZQUjgoXHRocmVhZCkKKwlsd2MxCSRmOSwgIFRIUkVBRF9GUFI5KFx0aHJlYWQpCisJbHdjMQkkZjEwLCBUSFJFQURfRlBSMTAoXHRocmVhZCkKKwlsd2MxCSRmMTEsIFRIUkVBRF9GUFIxMShcdGhyZWFkKQorCWx3YzEJJGYxMiwgVEhSRUFEX0ZQUjEyKFx0aHJlYWQpCisJbHdjMQkkZjEzLCBUSFJFQURfRlBSMTMoXHRocmVhZCkKKwlsd2MxCSRmMTQsIFRIUkVBRF9GUFIxNChcdGhyZWFkKQorCWx3YzEJJGYxNSwgVEhSRUFEX0ZQUjE1KFx0aHJlYWQpCisJbHdjMQkkZjE2LCBUSFJFQURfRlBSMTYoXHRocmVhZCkKKwlsd2MxCSRmMTcsIFRIUkVBRF9GUFIxNyhcdGhyZWFkKQorCWx3YzEJJGYxOCwgVEhSRUFEX0ZQUjE4KFx0aHJlYWQpCisJbHdjMQkkZjE5LCBUSFJFQURfRlBSMTkoXHRocmVhZCkKKwlsd2MxCSRmMjAsIFRIUkVBRF9GUFIyMChcdGhyZWFkKQorCWx3YzEJJGYyMSwgVEhSRUFEX0ZQUjIxKFx0aHJlYWQpCisJbHdjMQkkZjIyLCBUSFJFQURfRlBSMjIoXHRocmVhZCkKKwlsd2MxCSRmMjMsIFRIUkVBRF9GUFIyMyhcdGhyZWFkKQorCWx3YzEJJGYyNCwgVEhSRUFEX0ZQUjI0KFx0aHJlYWQpCisJbHdjMQkkZjI1LCBUSFJFQURfRlBSMjUoXHRocmVhZCkKKwlsd2MxCSRmMjYsIFRIUkVBRF9GUFIyNihcdGhyZWFkKQorCWx3YzEJJGYyNywgVEhSRUFEX0ZQUjI3KFx0aHJlYWQpCisJbHdjMQkkZjI4LCBUSFJFQURfRlBSMjgoXHRocmVhZCkKKwlsd2MxCSRmMjksIFRIUkVBRF9GUFIyOShcdGhyZWFkKQorCWx3YzEJJGYzMCwgVEhSRUFEX0ZQUjMwKFx0aHJlYWQpCisJbHdjMQkkZjMxLCBUSFJFQURfRlBSMzEoXHRocmVhZCkKIAljdGMxCVx0bXAsIGZjcjMxCiAJLnNldCBwb3AKIAkuZW5kbQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2FzbW1hY3JvLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaAppbmRleCAwY2FlNDU5Li42MTU2YWM4IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vYXNtbWFjcm8uaApAQCAtNjAsMjIgKzYwLDIyIEBACiAJLnNldAlwdXNoCiAJU0VUX0hBUkRGTE9BVAogCWNmYzEJXHRtcCwgZmNyMzEKLQlzZGMxCSRmMCwgIFRIUkVBRF9GUFIwX0xTNjQoXHRocmVhZCkKLQlzZGMxCSRmMiwgIFRIUkVBRF9GUFIyX0xTNjQoXHRocmVhZCkKLQlzZGMxCSRmNCwgIFRIUkVBRF9GUFI0X0xTNjQoXHRocmVhZCkKLQlzZGMxCSRmNiwgIFRIUkVBRF9GUFI2X0xTNjQoXHRocmVhZCkKLQlzZGMxCSRmOCwgIFRIUkVBRF9GUFI4X0xTNjQoXHRocmVhZCkKLQlzZGMxCSRmMTAsIFRIUkVBRF9GUFIxMF9MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjEyLCBUSFJFQURfRlBSMTJfTFM2NChcdGhyZWFkKQotCXNkYzEJJGYxNCwgVEhSRUFEX0ZQUjE0X0xTNjQoXHRocmVhZCkKLQlzZGMxCSRmMTYsIFRIUkVBRF9GUFIxNl9MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjE4LCBUSFJFQURfRlBSMThfTFM2NChcdGhyZWFkKQotCXNkYzEJJGYyMCwgVEhSRUFEX0ZQUjIwX0xTNjQoXHRocmVhZCkKLQlzZGMxCSRmMjIsIFRIUkVBRF9GUFIyMl9MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjI0LCBUSFJFQURfRlBSMjRfTFM2NChcdGhyZWFkKQotCXNkYzEJJGYyNiwgVEhSRUFEX0ZQUjI2X0xTNjQoXHRocmVhZCkKLQlzZGMxCSRmMjgsIFRIUkVBRF9GUFIyOF9MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjMwLCBUSFJFQURfRlBSMzBfTFM2NChcdGhyZWFkKQorCXNkYzEJJGYwLCAgVEhSRUFEX0ZQUjAoXHRocmVhZCkKKwlzZGMxCSRmMiwgIFRIUkVBRF9GUFIyKFx0aHJlYWQpCisJc2RjMQkkZjQsICBUSFJFQURfRlBSNChcdGhyZWFkKQorCXNkYzEJJGY2LCAgVEhSRUFEX0ZQUjYoXHRocmVhZCkKKwlzZGMxCSRmOCwgIFRIUkVBRF9GUFI4KFx0aHJlYWQpCisJc2RjMQkkZjEwLCBUSFJFQURfRlBSMTAoXHRocmVhZCkKKwlzZGMxCSRmMTIsIFRIUkVBRF9GUFIxMihcdGhyZWFkKQorCXNkYzEJJGYxNCwgVEhSRUFEX0ZQUjE0KFx0aHJlYWQpCisJc2RjMQkkZjE2LCBUSFJFQURfRlBSMTYoXHRocmVhZCkKKwlzZGMxCSRmMTgsIFRIUkVBRF9GUFIxOChcdGhyZWFkKQorCXNkYzEJJGYyMCwgVEhSRUFEX0ZQUjIwKFx0aHJlYWQpCisJc2RjMQkkZjIyLCBUSFJFQURfRlBSMjIoXHRocmVhZCkKKwlzZGMxCSRmMjQsIFRIUkVBRF9GUFIyNChcdGhyZWFkKQorCXNkYzEJJGYyNiwgVEhSRUFEX0ZQUjI2KFx0aHJlYWQpCisJc2RjMQkkZjI4LCBUSFJFQURfRlBSMjgoXHRocmVhZCkKKwlzZGMxCSRmMzAsIFRIUkVBRF9GUFIzMChcdGhyZWFkKQogCXN3CVx0bXAsIFRIUkVBRF9GQ1IzMShcdGhyZWFkKQogCS5zZXQJcG9wCiAJLmVuZG0KQEAgLTg0LDIyICs4NCwyMiBAQAogCS5zZXQJcHVzaAogCS5zZXQJbWlwczY0cjIKIAlTRVRfSEFSREZMT0FUCi0Jc2RjMQkkZjEsICBUSFJFQURfRlBSMV9MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjMsICBUSFJFQURfRlBSM19MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjUsICBUSFJFQURfRlBSNV9MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjcsICBUSFJFQURfRlBSN19MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjksICBUSFJFQURfRlBSOV9MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjExLCBUSFJFQURfRlBSMTFfTFM2NChcdGhyZWFkKQotCXNkYzEJJGYxMywgVEhSRUFEX0ZQUjEzX0xTNjQoXHRocmVhZCkKLQlzZGMxCSRmMTUsIFRIUkVBRF9GUFIxNV9MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjE3LCBUSFJFQURfRlBSMTdfTFM2NChcdGhyZWFkKQotCXNkYzEJJGYxOSwgVEhSRUFEX0ZQUjE5X0xTNjQoXHRocmVhZCkKLQlzZGMxCSRmMjEsIFRIUkVBRF9GUFIyMV9MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjIzLCBUSFJFQURfRlBSMjNfTFM2NChcdGhyZWFkKQotCXNkYzEJJGYyNSwgVEhSRUFEX0ZQUjI1X0xTNjQoXHRocmVhZCkKLQlzZGMxCSRmMjcsIFRIUkVBRF9GUFIyN19MUzY0KFx0aHJlYWQpCi0Jc2RjMQkkZjI5LCBUSFJFQURfRlBSMjlfTFM2NChcdGhyZWFkKQotCXNkYzEJJGYzMSwgVEhSRUFEX0ZQUjMxX0xTNjQoXHRocmVhZCkKKwlzZGMxCSRmMSwgIFRIUkVBRF9GUFIxKFx0aHJlYWQpCisJc2RjMQkkZjMsICBUSFJFQURfRlBSMyhcdGhyZWFkKQorCXNkYzEJJGY1LCAgVEhSRUFEX0ZQUjUoXHRocmVhZCkKKwlzZGMxCSRmNywgIFRIUkVBRF9GUFI3KFx0aHJlYWQpCisJc2RjMQkkZjksICBUSFJFQURfRlBSOShcdGhyZWFkKQorCXNkYzEJJGYxMSwgVEhSRUFEX0ZQUjExKFx0aHJlYWQpCisJc2RjMQkkZjEzLCBUSFJFQURfRlBSMTMoXHRocmVhZCkKKwlzZGMxCSRmMTUsIFRIUkVBRF9GUFIxNShcdGhyZWFkKQorCXNkYzEJJGYxNywgVEhSRUFEX0ZQUjE3KFx0aHJlYWQpCisJc2RjMQkkZjE5LCBUSFJFQURfRlBSMTkoXHRocmVhZCkKKwlzZGMxCSRmMjEsIFRIUkVBRF9GUFIyMShcdGhyZWFkKQorCXNkYzEJJGYyMywgVEhSRUFEX0ZQUjIzKFx0aHJlYWQpCisJc2RjMQkkZjI1LCBUSFJFQURfRlBSMjUoXHRocmVhZCkKKwlzZGMxCSRmMjcsIFRIUkVBRF9GUFIyNyhcdGhyZWFkKQorCXNkYzEJJGYyOSwgVEhSRUFEX0ZQUjI5KFx0aHJlYWQpCisJc2RjMQkkZjMxLCBUSFJFQURfRlBSMzEoXHRocmVhZCkKIAkuc2V0CXBvcAogCS5lbmRtCiAKQEAgLTExOCwyMiArMTE4LDIyIEBACiAJLnNldAlwdXNoCiAJU0VUX0hBUkRGTE9BVAogCWx3CVx0bXAsIFRIUkVBRF9GQ1IzMShcdGhyZWFkKQotCWxkYzEJJGYwLCAgVEhSRUFEX0ZQUjBfTFM2NChcdGhyZWFkKQotCWxkYzEJJGYyLCAgVEhSRUFEX0ZQUjJfTFM2NChcdGhyZWFkKQotCWxkYzEJJGY0LCAgVEhSRUFEX0ZQUjRfTFM2NChcdGhyZWFkKQotCWxkYzEJJGY2LCAgVEhSRUFEX0ZQUjZfTFM2NChcdGhyZWFkKQotCWxkYzEJJGY4LCAgVEhSRUFEX0ZQUjhfTFM2NChcdGhyZWFkKQotCWxkYzEJJGYxMCwgVEhSRUFEX0ZQUjEwX0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmMTIsIFRIUkVBRF9GUFIxMl9MUzY0KFx0aHJlYWQpCi0JbGRjMQkkZjE0LCBUSFJFQURfRlBSMTRfTFM2NChcdGhyZWFkKQotCWxkYzEJJGYxNiwgVEhSRUFEX0ZQUjE2X0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmMTgsIFRIUkVBRF9GUFIxOF9MUzY0KFx0aHJlYWQpCi0JbGRjMQkkZjIwLCBUSFJFQURfRlBSMjBfTFM2NChcdGhyZWFkKQotCWxkYzEJJGYyMiwgVEhSRUFEX0ZQUjIyX0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmMjQsIFRIUkVBRF9GUFIyNF9MUzY0KFx0aHJlYWQpCi0JbGRjMQkkZjI2LCBUSFJFQURfRlBSMjZfTFM2NChcdGhyZWFkKQotCWxkYzEJJGYyOCwgVEhSRUFEX0ZQUjI4X0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmMzAsIFRIUkVBRF9GUFIzMF9MUzY0KFx0aHJlYWQpCisJbGRjMQkkZjAsICBUSFJFQURfRlBSMChcdGhyZWFkKQorCWxkYzEJJGYyLCAgVEhSRUFEX0ZQUjIoXHRocmVhZCkKKwlsZGMxCSRmNCwgIFRIUkVBRF9GUFI0KFx0aHJlYWQpCisJbGRjMQkkZjYsICBUSFJFQURfRlBSNihcdGhyZWFkKQorCWxkYzEJJGY4LCAgVEhSRUFEX0ZQUjgoXHRocmVhZCkKKwlsZGMxCSRmMTAsIFRIUkVBRF9GUFIxMChcdGhyZWFkKQorCWxkYzEJJGYxMiwgVEhSRUFEX0ZQUjEyKFx0aHJlYWQpCisJbGRjMQkkZjE0LCBUSFJFQURfRlBSMTQoXHRocmVhZCkKKwlsZGMxCSRmMTYsIFRIUkVBRF9GUFIxNihcdGhyZWFkKQorCWxkYzEJJGYxOCwgVEhSRUFEX0ZQUjE4KFx0aHJlYWQpCisJbGRjMQkkZjIwLCBUSFJFQURfRlBSMjAoXHRocmVhZCkKKwlsZGMxCSRmMjIsIFRIUkVBRF9GUFIyMihcdGhyZWFkKQorCWxkYzEJJGYyNCwgVEhSRUFEX0ZQUjI0KFx0aHJlYWQpCisJbGRjMQkkZjI2LCBUSFJFQURfRlBSMjYoXHRocmVhZCkKKwlsZGMxCSRmMjgsIFRIUkVBRF9GUFIyOChcdGhyZWFkKQorCWxkYzEJJGYzMCwgVEhSRUFEX0ZQUjMwKFx0aHJlYWQpCiAJY3RjMQlcdG1wLCBmY3IzMQogCS5lbmRtCiAKQEAgLTE0MSwyMiArMTQxLDIyIEBACiAJLnNldAlwdXNoCiAJLnNldAltaXBzNjRyMgogCVNFVF9IQVJERkxPQVQKLQlsZGMxCSRmMSwgIFRIUkVBRF9GUFIxX0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmMywgIFRIUkVBRF9GUFIzX0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmNSwgIFRIUkVBRF9GUFI1X0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmNywgIFRIUkVBRF9GUFI3X0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmOSwgIFRIUkVBRF9GUFI5X0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmMTEsIFRIUkVBRF9GUFIxMV9MUzY0KFx0aHJlYWQpCi0JbGRjMQkkZjEzLCBUSFJFQURfRlBSMTNfTFM2NChcdGhyZWFkKQotCWxkYzEJJGYxNSwgVEhSRUFEX0ZQUjE1X0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmMTcsIFRIUkVBRF9GUFIxN19MUzY0KFx0aHJlYWQpCi0JbGRjMQkkZjE5LCBUSFJFQURfRlBSMTlfTFM2NChcdGhyZWFkKQotCWxkYzEJJGYyMSwgVEhSRUFEX0ZQUjIxX0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmMjMsIFRIUkVBRF9GUFIyM19MUzY0KFx0aHJlYWQpCi0JbGRjMQkkZjI1LCBUSFJFQURfRlBSMjVfTFM2NChcdGhyZWFkKQotCWxkYzEJJGYyNywgVEhSRUFEX0ZQUjI3X0xTNjQoXHRocmVhZCkKLQlsZGMxCSRmMjksIFRIUkVBRF9GUFIyOV9MUzY0KFx0aHJlYWQpCi0JbGRjMQkkZjMxLCBUSFJFQURfRlBSMzFfTFM2NChcdGhyZWFkKQorCWxkYzEJJGYxLCAgVEhSRUFEX0ZQUjEoXHRocmVhZCkKKwlsZGMxCSRmMywgIFRIUkVBRF9GUFIzKFx0aHJlYWQpCisJbGRjMQkkZjUsICBUSFJFQURfRlBSNShcdGhyZWFkKQorCWxkYzEJJGY3LCAgVEhSRUFEX0ZQUjcoXHRocmVhZCkKKwlsZGMxCSRmOSwgIFRIUkVBRF9GUFI5KFx0aHJlYWQpCisJbGRjMQkkZjExLCBUSFJFQURfRlBSMTEoXHRocmVhZCkKKwlsZGMxCSRmMTMsIFRIUkVBRF9GUFIxMyhcdGhyZWFkKQorCWxkYzEJJGYxNSwgVEhSRUFEX0ZQUjE1KFx0aHJlYWQpCisJbGRjMQkkZjE3LCBUSFJFQURfRlBSMTcoXHRocmVhZCkKKwlsZGMxCSRmMTksIFRIUkVBRF9GUFIxOShcdGhyZWFkKQorCWxkYzEJJGYyMSwgVEhSRUFEX0ZQUjIxKFx0aHJlYWQpCisJbGRjMQkkZjIzLCBUSFJFQURfRlBSMjMoXHRocmVhZCkKKwlsZGMxCSRmMjUsIFRIUkVBRF9GUFIyNShcdGhyZWFkKQorCWxkYzEJJGYyNywgVEhSRUFEX0ZQUjI3KFx0aHJlYWQpCisJbGRjMQkkZjI5LCBUSFJFQURfRlBSMjkoXHRocmVhZCkKKwlsZGMxCSRmMzEsIFRIUkVBRF9GUFIzMShcdGhyZWFkKQogCS5zZXQJcG9wCiAJLmVuZG0KIApAQCAtMjExLDYgKzIxMSwyMiBAQAogCS5lbmRtCiAKICNpZmRlZiBUT09MQ0hBSU5fU1VQUE9SVFNfTVNBCisJLm1hY3JvCV9jZmNtc2EJcmQsIGNzCisJLnNldAlwdXNoCisJLnNldAltaXBzMzJyMgorCS5zZXQJbXNhCisJY2ZjbXNhCVxyZCwgJFxjcworCS5zZXQJcG9wCisJLmVuZG0KKworCS5tYWNybwlfY3RjbXNhCWNkLCBycworCS5zZXQJcHVzaAorCS5zZXQJbWlwczMycjIKKwkuc2V0CW1zYQorCWN0Y21zYQkkXGNkLCBccnMKKwkuc2V0CXBvcAorCS5lbmRtCisKIAkubWFjcm8JbGRfZAl3ZCwgb2ZmLCBiYXNlCiAJLnNldAlwdXNoCiAJLnNldAltaXBzMzJyMgpAQCAtMjI3LDM1ICsyNDMsMzUgQEAKIAkuc2V0CXBvcAogCS5lbmRtCiAKLQkubWFjcm8JY29weV91X3cJcmQsIHdzLCBuCisJLm1hY3JvCWNvcHlfdV93CXdzLCBuCiAJLnNldAlwdXNoCiAJLnNldAltaXBzMzJyMgogCS5zZXQJbXNhCi0JY29weV91LncgXHJkLCAkd1x3c1tcbl0KKwljb3B5X3UudyAkMSwgJHdcd3NbXG5dCiAJLnNldAlwb3AKIAkuZW5kbQogCi0JLm1hY3JvCWNvcHlfdV9kCXJkLCB3cywgbgorCS5tYWNybwljb3B5X3VfZAl3cywgbgogCS5zZXQJcHVzaAogCS5zZXQJbWlwczY0cjIKIAkuc2V0CW1zYQotCWNvcHlfdS5kIFxyZCwgJHdcd3NbXG5dCisJY29weV91LmQgJDEsICR3XHdzW1xuXQogCS5zZXQJcG9wCiAJLmVuZG0KIAotCS5tYWNybwlpbnNlcnRfdwl3ZCwgbiwgcnMKKwkubWFjcm8JaW5zZXJ0X3cJd2QsIG4KIAkuc2V0CXB1c2gKIAkuc2V0CW1pcHMzMnIyCiAJLnNldAltc2EKLQlpbnNlcnQudyAkd1x3ZFtcbl0sIFxycworCWluc2VydC53ICR3XHdkW1xuXSwgJDEKIAkuc2V0CXBvcAogCS5lbmRtCiAKLQkubWFjcm8JaW5zZXJ0X2QJd2QsIG4sIHJzCisJLm1hY3JvCWluc2VydF9kCXdkLCBuCiAJLnNldAlwdXNoCiAJLnNldAltaXBzNjRyMgogCS5zZXQJbXNhCi0JaW5zZXJ0LmQgJHdcd2RbXG5dLCBccnMKKwlpbnNlcnQuZCAkd1x3ZFtcbl0sICQxCiAJLnNldAlwb3AKIAkuZW5kbQogI2Vsc2UKQEAgLTI4Myw3ICsyOTksNyBAQAogCS8qCiAJICogVGVtcG9yYXJ5IHVudGlsIGFsbCB0b29sY2hhaW5zIGluIHVzZSBpbmNsdWRlIE1TQSBzdXBwb3J0LgogCSAqLwotCS5tYWNybwljZmNtc2EJcmQsIGNzCisJLm1hY3JvCV9jZmNtc2EJcmQsIGNzCiAJLnNldAlwdXNoCiAJLnNldAlub2F0CiAJU0VUX0hBUkRGTE9BVApAQCAtMjkzLDcgKzMwOSw3IEBACiAJLnNldAlwb3AKIAkuZW5kbQogCi0JLm1hY3JvCWN0Y21zYQljZCwgcnMKKwkubWFjcm8JX2N0Y21zYQljZCwgcnMKIAkuc2V0CXB1c2gKIAkuc2V0CW5vYXQKIAlTRVRfSEFSREZMT0FUCkBAIC0zMjAsNDQgKzMzNiwzNiBAQAogCS5zZXQJcG9wCiAJLmVuZG0KIAotCS5tYWNybwljb3B5X3VfdwlyZCwgd3MsIG4KKwkubWFjcm8JY29weV91X3cJd3MsIG4KIAkuc2V0CXB1c2gKIAkuc2V0CW5vYXQKIAlTRVRfSEFSREZMT0FUCiAJLmluc24KIAkud29yZAlDT1BZX1VXX01TQV9JTlNOIHwgKFxuIDw8IDE2KSB8IChcd3MgPDwgMTEpCi0JLyogbW92ZSB0cmlnZ2VycyBhbiBhc3NlbWJsZXIgYnVnLi4uICovCi0Jb3IJXHJkLCAkMSwgemVybwogCS5zZXQJcG9wCiAJLmVuZG0KIAotCS5tYWNybwljb3B5X3VfZAlyZCwgd3MsIG4KKwkubWFjcm8JY29weV91X2QJd3MsIG4KIAkuc2V0CXB1c2gKIAkuc2V0CW5vYXQKIAlTRVRfSEFSREZMT0FUCiAJLmluc24KIAkud29yZAlDT1BZX1VEX01TQV9JTlNOIHwgKFxuIDw8IDE2KSB8IChcd3MgPDwgMTEpCi0JLyogbW92ZSB0cmlnZ2VycyBhbiBhc3NlbWJsZXIgYnVnLi4uICovCi0Jb3IJXHJkLCAkMSwgemVybwogCS5zZXQJcG9wCiAJLmVuZG0KIAotCS5tYWNybwlpbnNlcnRfdwl3ZCwgbiwgcnMKKwkubWFjcm8JaW5zZXJ0X3cJd2QsIG4KIAkuc2V0CXB1c2gKIAkuc2V0CW5vYXQKIAlTRVRfSEFSREZMT0FUCi0JLyogbW92ZSB0cmlnZ2VycyBhbiBhc3NlbWJsZXIgYnVnLi4uICovCi0Jb3IJJDEsIFxycywgemVybwogCS53b3JkCUlOU0VSVF9XX01TQV9JTlNOIHwgKFxuIDw8IDE2KSB8IChcd2QgPDwgNikKIAkuc2V0CXBvcAogCS5lbmRtCiAKLQkubWFjcm8JaW5zZXJ0X2QJd2QsIG4sIHJzCisJLm1hY3JvCWluc2VydF9kCXdkLCBuCiAJLnNldAlwdXNoCiAJLnNldAlub2F0CiAJU0VUX0hBUkRGTE9BVAotCS8qIG1vdmUgdHJpZ2dlcnMgYW4gYXNzZW1ibGVyIGJ1Zy4uLiAqLwotCW9yCSQxLCBccnMsIHplcm8KIAkud29yZAlJTlNFUlRfRF9NU0FfSU5TTiB8IChcbiA8PCAxNikgfCAoXHdkIDw8IDYpCiAJLnNldAlwb3AKIAkuZW5kbQpAQCAtMzk5LDcgKzQwNyw3IEBACiAJLnNldAlwdXNoCiAJLnNldAlub2F0CiAJU0VUX0hBUkRGTE9BVAotCWNmY21zYQkkMSwgTVNBX0NTUgorCV9jZmNtc2EJJDEsIE1TQV9DU1IKIAlzdwkkMSwgVEhSRUFEX01TQV9DU1IoXHRocmVhZCkKIAkuc2V0CXBvcAogCS5lbmRtCkBAIC00MDksNyArNDE3LDcgQEAKIAkuc2V0CW5vYXQKIAlTRVRfSEFSREZMT0FUCiAJbHcJJDEsIFRIUkVBRF9NU0FfQ1NSKFx0aHJlYWQpCi0JY3RjbXNhCU1TQV9DU1IsICQxCisJX2N0Y21zYQlNU0FfQ1NSLCAkMQogCS5zZXQJcG9wCiAJbGRfZAkwLCBUSFJFQURfRlBSMCwgXHRocmVhZAogCWxkX2QJMSwgVEhSRUFEX0ZQUjEsIFx0aHJlYWQKQEAgLTQ1Miw5ICs0NjAsNiBAQAogCWluc2VydF93IFx3ZCwgMgogCWluc2VydF93IFx3ZCwgMwogI2VuZGlmCi0JLmlmCTMxLVx3ZAotCW1zYV9pbml0X3VwcGVyCShcd2QrMSkKLQkuZW5kaWYKIAkuZW5kbQogCiAJLm1hY3JvCW1zYV9pbml0X2FsbF91cHBlcgpAQCAtNDYzLDYgKzQ2OCwzNyBAQAogCVNFVF9IQVJERkxPQVQKIAlub3QJJDEsIHplcm8KIAltc2FfaW5pdF91cHBlcgkwCisJbXNhX2luaXRfdXBwZXIJMQorCW1zYV9pbml0X3VwcGVyCTIKKwltc2FfaW5pdF91cHBlcgkzCisJbXNhX2luaXRfdXBwZXIJNAorCW1zYV9pbml0X3VwcGVyCTUKKwltc2FfaW5pdF91cHBlcgk2CisJbXNhX2luaXRfdXBwZXIJNworCW1zYV9pbml0X3VwcGVyCTgKKwltc2FfaW5pdF91cHBlcgk5CisJbXNhX2luaXRfdXBwZXIJMTAKKwltc2FfaW5pdF91cHBlcgkxMQorCW1zYV9pbml0X3VwcGVyCTEyCisJbXNhX2luaXRfdXBwZXIJMTMKKwltc2FfaW5pdF91cHBlcgkxNAorCW1zYV9pbml0X3VwcGVyCTE1CisJbXNhX2luaXRfdXBwZXIJMTYKKwltc2FfaW5pdF91cHBlcgkxNworCW1zYV9pbml0X3VwcGVyCTE4CisJbXNhX2luaXRfdXBwZXIJMTkKKwltc2FfaW5pdF91cHBlcgkyMAorCW1zYV9pbml0X3VwcGVyCTIxCisJbXNhX2luaXRfdXBwZXIJMjIKKwltc2FfaW5pdF91cHBlcgkyMworCW1zYV9pbml0X3VwcGVyCTI0CisJbXNhX2luaXRfdXBwZXIJMjUKKwltc2FfaW5pdF91cHBlcgkyNgorCW1zYV9pbml0X3VwcGVyCTI3CisJbXNhX2luaXRfdXBwZXIJMjgKKwltc2FfaW5pdF91cHBlcgkyOQorCW1zYV9pbml0X3VwcGVyCTMwCisJbXNhX2luaXRfdXBwZXIJMzEKIAkuc2V0CXBvcAogCS5lbmRtCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCA1MzVmMTk2Li4zMWQ3NDdkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC00MTAsMTAgKzQxMCw2IEBACiBleHRlcm4gaW50IGFyY2hfc2V0dXBfYWRkaXRpb25hbF9wYWdlcyhzdHJ1Y3QgbGludXhfYmlucHJtICpicHJtLAogCQkJCSAgICAgICBpbnQgdXNlc19pbnRlcnApOwogCi1zdHJ1Y3QgbW1fc3RydWN0OwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXJjaF9yYW5kb21pemVfYnJrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKLSNkZWZpbmUgYXJjaF9yYW5kb21pemVfYnJrIGFyY2hfcmFuZG9taXplX2JyawotCiBzdHJ1Y3QgYXJjaF9lbGZfc3RhdGUgewogCWludCBmcF9hYmk7CiAJaW50IGludGVycF9mcF9hYmk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnB1LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vZnB1LmgKaW5kZXggZGQwODNlOS4uYjEwNGFkOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2ZwdS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9mcHUuaApAQCAtNDgsNiArNDgsMTIgQEAKICNkZWZpbmUgRlBVX0ZSX01BU0sJCTB4MQogfTsKIAorI2RlZmluZSBfX2Rpc2FibGVfZnB1KCkJCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwljbGVhcl9jMF9zdGF0dXMoU1QwX0NVMSk7CQkJCQlcCisJZGlzYWJsZV9mcHVfaGF6YXJkKCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKwogc3RhdGljIGlubGluZSBpbnQgX19lbmFibGVfZnB1KGVudW0gZnB1X21vZGUgbW9kZSkKIHsKIAlpbnQgZnI7CkBAIC04Niw3ICs5MiwxMiBAQAogCQllbmFibGVfZnB1X2hhemFyZCgpOwogCiAJCS8qIGNoZWNrIEZSIGhhcyB0aGUgZGVzaXJlZCB2YWx1ZSAqLwotCQlyZXR1cm4gKCEhKHJlYWRfYzBfc3RhdHVzKCkgJiBTVDBfRlIpID09ICEhZnIpID8gMCA6IFNJR0ZQRTsKKwkJaWYgKCEhKHJlYWRfYzBfc3RhdHVzKCkgJiBTVDBfRlIpID09ICEhZnIpCisJCQlyZXR1cm4gMDsKKworCQkvKiB1bnN1cHBvcnRlZCBGUiB2YWx1ZSAqLworCQlfX2Rpc2FibGVfZnB1KCk7CisJCXJldHVybiBTSUdGUEU7CiAKIAlkZWZhdWx0OgogCQlCVUcoKTsKQEAgLTk1LDEyICsxMDYsNiBAQAogCXJldHVybiBTSUdGUEU7CiB9CiAKLSNkZWZpbmUgX19kaXNhYmxlX2ZwdSgpCQkJCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JY2xlYXJfYzBfc3RhdHVzKFNUMF9DVTEpOwkJCQkJXAotCWRpc2FibGVfZnB1X2hhemFyZCgpOwkJCQkJCVwKLX0gd2hpbGUgKDApCi0KICNkZWZpbmUgY2xlYXJfZnB1X293bmVyKCkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1VTRURGUFUpCiAKIHN0YXRpYyBpbmxpbmUgaW50IF9faXNfZnB1X293bmVyKHZvaWQpCkBAIC0xNzAsNiArMTc1LDcgQEAKIAkJfQogCQlkaXNhYmxlX21zYSgpOwogCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfVVNFRE1TQSk7CisJCV9fZGlzYWJsZV9mcHUoKTsKIAl9IGVsc2UgaWYgKGlzX2ZwdV9vd25lcigpKSB7CiAJCWlmIChzYXZlKQogCQkJX3NhdmVfZnAoY3VycmVudCk7CmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaAppbmRleCBmZGJmZjQ0Li42MDhhYTU3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKQEAgLTgsOSArOCw5IEBACiAjaWZuZGVmIF9BU01fTUlQU19KVU1QX0xBQkVMX0gKICNkZWZpbmUgX0FTTV9NSVBTX0pVTVBfTEFCRUxfSAogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpZm5kZWYgX19BU1NFTUJMWV9fCiAKLSNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2RlZmluZSBKVU1QX0xBQkVMX05PUF9TSVpFIDQKIApAQCAtMzksOCArMzksNiBAQAogCXJldHVybiB0cnVlOwogfQogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiAjaWZkZWYgQ09ORklHXzY0QklUCiB0eXBlZGVmIHU2NCBqdW1wX2xhYmVsX3Q7CiAjZWxzZQpAQCAtNTMsNCArNTEsNSBAQAogCWp1bXBfbGFiZWxfdCBrZXk7CiB9OwogCisjZW5kaWYgIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIF9BU01fTUlQU19KVU1QX0xBQkVMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rZGVidWcuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9rZGVidWcuaAppbmRleCA2YTlhZjVmLi5jYmEyMmFiIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20va2RlYnVnLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCkBAIC0xMCw3ICsxMCw4IEBACiAJRElFX1JJLAogCURJRV9QQUdFX0ZBVUxULAogCURJRV9CUkVBSywKLQlESUVfU1NURVBCUAorCURJRV9TU1RFUEJQLAorCURJRV9NU0FGUAogfTsKIAogI2VuZGlmIC8qIF9BU01fTUlQU19LREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2t2bV9ob3N0LmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAppbmRleCBhYzRmYzcxLi40YzI1ODIzIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAorKysgYi9hcmNoL21pcHMvaW5jbHVkZS9hc20va3ZtX2hvc3QuaApAQCAtMjEsMTAgKzIxLDEwIEBACiAKIC8qIE1JUFMgS1ZNIHJlZ2lzdGVyIGlkcyAqLwogI2RlZmluZSBNSVBTX0NQMF8zMihfUiwgX1MpCQkJCQlcCi0JKEtWTV9SRUdfTUlQUyB8IEtWTV9SRUdfU0laRV9VMzIgfCAweDEwMDAwIHwgKDggKiAoX1IpICsgKF9TKSkpCisJKEtWTV9SRUdfTUlQU19DUDAgfCBLVk1fUkVHX1NJWkVfVTMyIHwgKDggKiAoX1IpICsgKF9TKSkpCiAKICNkZWZpbmUgTUlQU19DUDBfNjQoX1IsIF9TKQkJCQkJXAotCShLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMHgxMDAwMCB8ICg4ICogKF9SKSArIChfUykpKQorCShLVk1fUkVHX01JUFNfQ1AwIHwgS1ZNX1JFR19TSVpFX1U2NCB8ICg4ICogKF9SKSArIChfUykpKQogCiAjZGVmaW5lIEtWTV9SRUdfTUlQU19DUDBfSU5ERVgJCU1JUFNfQ1AwXzMyKDAsIDApCiAjZGVmaW5lIEtWTV9SRUdfTUlQU19DUDBfRU5UUllMTzAJTUlQU19DUDBfNjQoMiwgMCkKQEAgLTQyLDExICs0MiwxNCBAQAogI2RlZmluZSBLVk1fUkVHX01JUFNfQ1AwX1NUQVRVUwkJTUlQU19DUDBfMzIoMTIsIDApCiAjZGVmaW5lIEtWTV9SRUdfTUlQU19DUDBfQ0FVU0UJCU1JUFNfQ1AwXzMyKDEzLCAwKQogI2RlZmluZSBLVk1fUkVHX01JUFNfQ1AwX0VQQwkJTUlQU19DUDBfNjQoMTQsIDApCisjZGVmaW5lIEtWTV9SRUdfTUlQU19DUDBfUFJJRAkJTUlQU19DUDBfMzIoMTUsIDApCiAjZGVmaW5lIEtWTV9SRUdfTUlQU19DUDBfRUJBU0UJCU1JUFNfQ1AwXzY0KDE1LCAxKQogI2RlZmluZSBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRwkJTUlQU19DUDBfMzIoMTYsIDApCiAjZGVmaW5lIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHMQlNSVBTX0NQMF8zMigxNiwgMSkKICNkZWZpbmUgS1ZNX1JFR19NSVBTX0NQMF9DT05GSUcyCU1JUFNfQ1AwXzMyKDE2LCAyKQogI2RlZmluZSBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzMJTUlQU19DUDBfMzIoMTYsIDMpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHNAlNSVBTX0NQMF8zMigxNiwgNCkKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX0NQMF9DT05GSUc1CU1JUFNfQ1AwXzMyKDE2LCA1KQogI2RlZmluZSBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzcJTUlQU19DUDBfMzIoMTYsIDcpCiAjZGVmaW5lIEtWTV9SRUdfTUlQU19DUDBfWENPTlRFWFQJTUlQU19DUDBfNjQoMjAsIDApCiAjZGVmaW5lIEtWTV9SRUdfTUlQU19DUDBfRVJST1JFUEMJTUlQU19DUDBfNjQoMzAsIDApCkBAIC0xMTksNiArMTIyLDEwIEBACiAJdTMyIHN5c2NhbGxfZXhpdHM7CiAJdTMyIHJlc3ZkX2luc3RfZXhpdHM7CiAJdTMyIGJyZWFrX2luc3RfZXhpdHM7CisJdTMyIHRyYXBfaW5zdF9leGl0czsKKwl1MzIgbXNhX2ZwZV9leGl0czsKKwl1MzIgZnBlX2V4aXRzOworCXUzMiBtc2FfZGlzYWJsZWRfZXhpdHM7CiAJdTMyIGZsdXNoX2RjYWNoZV9leGl0czsKIAl1MzIgaGFsdF9zdWNjZXNzZnVsX3BvbGw7CiAJdTMyIGhhbHRfd2FrZXVwOwpAQCAtMTM4LDYgKzE0NSwxMCBAQAogCVNZU0NBTExfRVhJVFMsCiAJUkVTVkRfSU5TVF9FWElUUywKIAlCUkVBS19JTlNUX0VYSVRTLAorCVRSQVBfSU5TVF9FWElUUywKKwlNU0FfRlBFX0VYSVRTLAorCUZQRV9FWElUUywKKwlNU0FfRElTQUJMRURfRVhJVFMsCiAJRkxVU0hfRENBQ0hFX0VYSVRTLAogCU1BWF9LVk1fTUlQU19FWElUX1RZUEVTCiB9OwpAQCAtMjA2LDYgKzIxNyw4IEBACiAjZGVmaW5lIE1JUFNfQ1AwX0NPTkZJRzFfU0VMCTEKICNkZWZpbmUgTUlQU19DUDBfQ09ORklHMl9TRUwJMgogI2RlZmluZSBNSVBTX0NQMF9DT05GSUczX1NFTAkzCisjZGVmaW5lIE1JUFNfQ1AwX0NPTkZJRzRfU0VMCTQKKyNkZWZpbmUgTUlQU19DUDBfQ09ORklHNV9TRUwJNQogCiAvKiBDb25maWcwIHJlZ2lzdGVyIGJpdHMgKi8KICNkZWZpbmUgQ1AwQzBfTQkJCTMxCkBAIC0yNjIsMzEgKzI3NSw2IEBACiAjZGVmaW5lIENQMEMzX1NNCQkxCiAjZGVmaW5lIENQMEMzX1RMCQkwCiAKLS8qIEhhdmUgY29uZmlnMSwgQ2FjaGVhYmxlLCBub25jb2hlcmVudCwgd3JpdGUtYmFjaywgd3JpdGUgYWxsb2NhdGUqLwotI2RlZmluZSBNSVBTX0NPTkZJRzAJCQkJCQlcCi0gICgoMSA8PCBDUDBDMF9NKSB8ICgweDMgPDwgQ1AwQzBfSzApKQotCi0vKiBIYXZlIGNvbmZpZzIsIG5vIGNvcHJvY2Vzc29yMiBhdHRhY2hlZCwgbm8gTURNWCBzdXBwb3J0IGF0dGFjaGVkLAotICAgbm8gcGVyZm9ybWFuY2UgY291bnRlcnMsIHdhdGNoIHJlZ2lzdGVycyBwcmVzZW50LAotICAgbm8gY29kZSBjb21wcmVzc2lvbiwgRUpUQUcgcHJlc2VudCwgbm8gRlBVLCBubyB3YXRjaCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgTUlQU19DT05GSUcxCQkJCQkJXAotKCgxIDw8IENQMEMxX00pIHwJCQkJCQlcCi0gKDAgPDwgQ1AwQzFfQzIpIHwgKDAgPDwgQ1AwQzFfTUQpIHwgKDAgPDwgQ1AwQzFfUEMpIHwJCVwKLSAoMCA8PCBDUDBDMV9XUikgfCAoMCA8PCBDUDBDMV9DQSkgfCAoMSA8PCBDUDBDMV9FUCkgfAkJXAotICgwIDw8IENQMEMxX0ZQKSkKLQotLyogSGF2ZSBjb25maWczLCBubyB0ZXJ0aWFyeS9zZWNvbmRhcnkgY2FjaGVzIGltcGxlbWVudGVkICovCi0jZGVmaW5lIE1JUFNfQ09ORklHMgkJCQkJCVwKLSgoMSA8PCBDUDBDMl9NKSkKLQotLyogTm8gY29uZmlnNCwgbm8gRFNQIEFTRSwgbm8gbGFyZ2UgcGh5c2FkZHIgKFBBQklUUyksCi0gICBubyBleHRlcm5hbCBpbnRlcnJ1cHQgY29udHJvbGxlciwgbm8gdmVjdG9yZWQgaW50ZXJydXB0cywKLSAgIG5vIDFrYiBwYWdlcywgbm8gU21hcnRNSVBTIEFTRSwgbm8gdHJhY2UgbG9naWMgKi8KLSNkZWZpbmUgTUlQU19DT05GSUczCQkJCQkJXAotKCgwIDw8IENQMEMzX00pIHwgKDAgPDwgQ1AwQzNfRFNQUCkgfCAoMCA8PCBDUDBDM19MUEEpIHwJXAotICgwIDw8IENQMEMzX1ZFSUMpIHwgKDAgPDwgQ1AwQzNfVkludCkgfCAoMCA8PCBDUDBDM19TUCkgfAlcCi0gKDAgPDwgQ1AwQzNfU00pIHwgKDAgPDwgQ1AwQzNfVEwpKQotCiAvKiBNTVUgdHlwZXMsIHRoZSBmaXJzdCBmb3VyIGVudHJpZXMgaGF2ZSB0aGUgc2FtZSBsYXlvdXQgYXMgdGhlCiAgICBDUDBDMF9NVCBmaWVsZC4gICovCiBlbnVtIG1pcHNfbW11X3R5cGVzIHsKQEAgLTMyMSw3ICszMDksOSBAQAogICovCiAjZGVmaW5lIFRfVFJBUAkJCTEzCS8qIFRyYXAgaW5zdHJ1Y3Rpb24gKi8KICNkZWZpbmUgVF9WQ0VJCQkJMTQJLyogVmlydHVhbCBjb2hlcmVuY3kgZXhjZXB0aW9uICovCisjZGVmaW5lIFRfTVNBRlBFCQkxNAkvKiBNU0EgZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uICovCiAjZGVmaW5lIFRfRlBFCQkJMTUJLyogRmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uICovCisjZGVmaW5lIFRfTVNBRElTCQkyMQkvKiBNU0EgZGlzYWJsZWQgZXhjZXB0aW9uICovCiAjZGVmaW5lIFRfV0FUQ0gJCQkyMwkvKiBXYXRjaCBhZGRyZXNzIHJlZmVyZW5jZSAqLwogI2RlZmluZSBUX1ZDRUQJCQkzMQkvKiBWaXJ0dWFsIGNvaGVyZW5jeSBkYXRhICovCiAKQEAgLTM3NCw2ICszNjQsOSBAQAogCWxvbmcgdGxiX2xvMTsKIH07CiAKKyNkZWZpbmUgS1ZNX01JUFNfRlBVX0ZQVQkweDEKKyNkZWZpbmUgS1ZNX01JUFNfRlBVX01TQQkweDIKKwogI2RlZmluZSBLVk1fTUlQU19HVUVTVF9UTEJfU0laRQk2NAogc3RydWN0IGt2bV92Y3B1X2FyY2ggewogCXZvaWQgKmhvc3RfZWJhc2UsICpndWVzdF9lYmFzZTsKQEAgLTM5NSw2ICszODgsOCBAQAogCiAJLyogRlBVIFN0YXRlICovCiAJc3RydWN0IG1pcHNfZnB1X3N0cnVjdCBmcHU7CisJLyogV2hpY2ggRlBVIHN0YXRlIGlzIGxvYWRlZCAoS1ZNX01JUFNfRlBVXyopICovCisJdW5zaWduZWQgaW50IGZwdV9pbnVzZTsKIAogCS8qIENPUDAgU3RhdGUgKi8KIAlzdHJ1Y3QgbWlwc19jb3Byb2MgKmNvcDA7CkBAIC00NDEsNiArNDM2LDkgQEAKIAogCS8qIFdBSVQgZXhlY3V0ZWQgKi8KIAlpbnQgd2FpdDsKKworCXU4IGZwdV9lbmFibGVkOworCXU4IG1zYV9lbmFibGVkOwogfTsKIAogCkBAIC00ODIsMTEgKzQ4MCwxNSBAQAogI2RlZmluZSBrdm1fcmVhZF9jMF9ndWVzdF9jb25maWcxKGNvcDApCQkoY29wMC0+cmVnW01JUFNfQ1AwX0NPTkZJR11bMV0pCiAjZGVmaW5lIGt2bV9yZWFkX2MwX2d1ZXN0X2NvbmZpZzIoY29wMCkJCShjb3AwLT5yZWdbTUlQU19DUDBfQ09ORklHXVsyXSkKICNkZWZpbmUga3ZtX3JlYWRfYzBfZ3Vlc3RfY29uZmlnMyhjb3AwKQkJKGNvcDAtPnJlZ1tNSVBTX0NQMF9DT05GSUddWzNdKQorI2RlZmluZSBrdm1fcmVhZF9jMF9ndWVzdF9jb25maWc0KGNvcDApCQkoY29wMC0+cmVnW01JUFNfQ1AwX0NPTkZJR11bNF0pCisjZGVmaW5lIGt2bV9yZWFkX2MwX2d1ZXN0X2NvbmZpZzUoY29wMCkJCShjb3AwLT5yZWdbTUlQU19DUDBfQ09ORklHXVs1XSkKICNkZWZpbmUga3ZtX3JlYWRfYzBfZ3Vlc3RfY29uZmlnNyhjb3AwKQkJKGNvcDAtPnJlZ1tNSVBTX0NQMF9DT05GSUddWzddKQogI2RlZmluZSBrdm1fd3JpdGVfYzBfZ3Vlc3RfY29uZmlnKGNvcDAsIHZhbCkJKGNvcDAtPnJlZ1tNSVBTX0NQMF9DT05GSUddWzBdID0gKHZhbCkpCiAjZGVmaW5lIGt2bV93cml0ZV9jMF9ndWVzdF9jb25maWcxKGNvcDAsIHZhbCkJKGNvcDAtPnJlZ1tNSVBTX0NQMF9DT05GSUddWzFdID0gKHZhbCkpCiAjZGVmaW5lIGt2bV93cml0ZV9jMF9ndWVzdF9jb25maWcyKGNvcDAsIHZhbCkJKGNvcDAtPnJlZ1tNSVBTX0NQMF9DT05GSUddWzJdID0gKHZhbCkpCiAjZGVmaW5lIGt2bV93cml0ZV9jMF9ndWVzdF9jb25maWczKGNvcDAsIHZhbCkJKGNvcDAtPnJlZ1tNSVBTX0NQMF9DT05GSUddWzNdID0gKHZhbCkpCisjZGVmaW5lIGt2bV93cml0ZV9jMF9ndWVzdF9jb25maWc0KGNvcDAsIHZhbCkJKGNvcDAtPnJlZ1tNSVBTX0NQMF9DT05GSUddWzRdID0gKHZhbCkpCisjZGVmaW5lIGt2bV93cml0ZV9jMF9ndWVzdF9jb25maWc1KGNvcDAsIHZhbCkJKGNvcDAtPnJlZ1tNSVBTX0NQMF9DT05GSUddWzVdID0gKHZhbCkpCiAjZGVmaW5lIGt2bV93cml0ZV9jMF9ndWVzdF9jb25maWc3KGNvcDAsIHZhbCkJKGNvcDAtPnJlZ1tNSVBTX0NQMF9DT05GSUddWzddID0gKHZhbCkpCiAjZGVmaW5lIGt2bV9yZWFkX2MwX2d1ZXN0X2Vycm9yZXBjKGNvcDApCShjb3AwLT5yZWdbTUlQU19DUDBfRVJST1JfUENdWzBdKQogI2RlZmluZSBrdm1fd3JpdGVfYzBfZ3Vlc3RfZXJyb3JlcGMoY29wMCwgdmFsKQkoY29wMC0+cmVnW01JUFNfQ1AwX0VSUk9SX1BDXVswXSA9ICh2YWwpKQpAQCAtNTY3LDYgKzU2OSwzMSBAQAogCWt2bV9zZXRfYzBfZ3Vlc3RfZWJhc2UoY29wMCwgKCh2YWwpICYgKGNoYW5nZSkpKTsJCVwKIH0KIAorLyogSGVscGVycyAqLworCitzdGF0aWMgaW5saW5lIGJvb2wga3ZtX21pcHNfZ3Vlc3RfY2FuX2hhdmVfZnB1KHN0cnVjdCBrdm1fdmNwdV9hcmNoICp2Y3B1KQoreworCXJldHVybiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKGNwdV9oYXNfZnB1KSB8fCBjcHVfaGFzX2ZwdSkgJiYKKwkJdmNwdS0+ZnB1X2VuYWJsZWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1fbWlwc19ndWVzdF9oYXNfZnB1KHN0cnVjdCBrdm1fdmNwdV9hcmNoICp2Y3B1KQoreworCXJldHVybiBrdm1fbWlwc19ndWVzdF9jYW5faGF2ZV9mcHUodmNwdSkgJiYKKwkJa3ZtX3JlYWRfYzBfZ3Vlc3RfY29uZmlnMSh2Y3B1LT5jb3AwKSAmIE1JUFNfQ09ORjFfRlA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1fbWlwc19ndWVzdF9jYW5faGF2ZV9tc2Eoc3RydWN0IGt2bV92Y3B1X2FyY2ggKnZjcHUpCit7CisJcmV0dXJuICghX19idWlsdGluX2NvbnN0YW50X3AoY3B1X2hhc19tc2EpIHx8IGNwdV9oYXNfbXNhKSAmJgorCQl2Y3B1LT5tc2FfZW5hYmxlZDsKK30KKworc3RhdGljIGlubGluZSBib29sIGt2bV9taXBzX2d1ZXN0X2hhc19tc2Eoc3RydWN0IGt2bV92Y3B1X2FyY2ggKnZjcHUpCit7CisJcmV0dXJuIGt2bV9taXBzX2d1ZXN0X2Nhbl9oYXZlX21zYSh2Y3B1KSAmJgorCQlrdm1fcmVhZF9jMF9ndWVzdF9jb25maWczKHZjcHUtPmNvcDApICYgTUlQU19DT05GM19NU0E7Cit9CiAKIHN0cnVjdCBrdm1fbWlwc19jYWxsYmFja3MgewogCWludCAoKmhhbmRsZV9jb3BfdW51c2FibGUpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CkBAIC01NzgsNiArNjA1LDEwIEBACiAJaW50ICgqaGFuZGxlX3N5c2NhbGwpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAJaW50ICgqaGFuZGxlX3Jlc19pbnN0KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCWludCAoKmhhbmRsZV9icmVhaykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwlpbnQgKCpoYW5kbGVfdHJhcCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwlpbnQgKCpoYW5kbGVfbXNhX2ZwZSkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwlpbnQgKCpoYW5kbGVfZnBlKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCWludCAoKmhhbmRsZV9tc2FfZGlzYWJsZWQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAJaW50ICgqdm1faW5pdCkoc3RydWN0IGt2bSAqa3ZtKTsKIAlpbnQgKCp2Y3B1X2luaXQpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAJaW50ICgqdmNwdV9zZXR1cCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKQEAgLTU5Niw2ICs2MjcsOCBAQAogCQkJICAgY29uc3Qgc3RydWN0IGt2bV9vbmVfcmVnICpyZWcsIHM2NCAqdik7CiAJaW50ICgqc2V0X29uZV9yZWcpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCSAgIGNvbnN0IHN0cnVjdCBrdm1fb25lX3JlZyAqcmVnLCBzNjQgdik7CisJaW50ICgqdmNwdV9nZXRfcmVncykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKKwlpbnQgKCp2Y3B1X3NldF9yZWdzKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogfTsKIGV4dGVybiBzdHJ1Y3Qga3ZtX21pcHNfY2FsbGJhY2tzICprdm1fbWlwc19jYWxsYmFja3M7CiBpbnQga3ZtX21pcHNfZW11bGF0aW9uX2luaXQoc3RydWN0IGt2bV9taXBzX2NhbGxiYWNrcyAqKmluc3RhbGxfY2FsbGJhY2tzKTsKQEAgLTYwNiw2ICs2MzksMTkgQEAKIC8qIFRyYW1wb2xpbmUgQVNNIHJvdXRpbmUgdG8gc3RhcnQgcnVubmluZyBpbiAiR3Vlc3QiIGNvbnRleHQgKi8KIGV4dGVybiBpbnQgX19rdm1fbWlwc192Y3B1X3J1bihzdHJ1Y3Qga3ZtX3J1biAqcnVuLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCisvKiBGUFUvTVNBIGNvbnRleHQgbWFuYWdlbWVudCAqLwordm9pZCBfX2t2bV9zYXZlX2ZwdShzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCAqdmNwdSk7Cit2b2lkIF9fa3ZtX3Jlc3RvcmVfZnB1KHN0cnVjdCBrdm1fdmNwdV9hcmNoICp2Y3B1KTsKK3ZvaWQgX19rdm1fcmVzdG9yZV9mY3NyKHN0cnVjdCBrdm1fdmNwdV9hcmNoICp2Y3B1KTsKK3ZvaWQgX19rdm1fc2F2ZV9tc2Eoc3RydWN0IGt2bV92Y3B1X2FyY2ggKnZjcHUpOwordm9pZCBfX2t2bV9yZXN0b3JlX21zYShzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCAqdmNwdSk7Cit2b2lkIF9fa3ZtX3Jlc3RvcmVfbXNhX3VwcGVyKHN0cnVjdCBrdm1fdmNwdV9hcmNoICp2Y3B1KTsKK3ZvaWQgX19rdm1fcmVzdG9yZV9tc2Fjc3Ioc3RydWN0IGt2bV92Y3B1X2FyY2ggKnZjcHUpOwordm9pZCBrdm1fb3duX2ZwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwordm9pZCBrdm1fb3duX21zYShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwordm9pZCBrdm1fZHJvcF9mcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK3ZvaWQga3ZtX2xvc2VfZnB1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisKIC8qIFRMQiBoYW5kbGluZyAqLwogdWludDMyX3Qga3ZtX2dldF9rZXJuZWxfYXNpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCkBAIC03MTEsNiArNzU3LDI2IEBACiAJCQkJCQkgICAgIHN0cnVjdCBrdm1fcnVuICpydW4sCiAJCQkJCQkgICAgIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKK2V4dGVybiBlbnVtIGVtdWxhdGlvbl9yZXN1bHQga3ZtX21pcHNfZW11bGF0ZV90cmFwX2V4Yyh1bnNpZ25lZCBsb25nIGNhdXNlLAorCQkJCQkJICAgICAgIHVpbnQzMl90ICpvcGMsCisJCQkJCQkgICAgICAgc3RydWN0IGt2bV9ydW4gKnJ1biwKKwkJCQkJCSAgICAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCitleHRlcm4gZW51bSBlbXVsYXRpb25fcmVzdWx0IGt2bV9taXBzX2VtdWxhdGVfbXNhZnBlX2V4Yyh1bnNpZ25lZCBsb25nIGNhdXNlLAorCQkJCQkJCSB1aW50MzJfdCAqb3BjLAorCQkJCQkJCSBzdHJ1Y3Qga3ZtX3J1biAqcnVuLAorCQkJCQkJCSBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCitleHRlcm4gZW51bSBlbXVsYXRpb25fcmVzdWx0IGt2bV9taXBzX2VtdWxhdGVfZnBlX2V4Yyh1bnNpZ25lZCBsb25nIGNhdXNlLAorCQkJCQkJICAgICAgdWludDMyX3QgKm9wYywKKwkJCQkJCSAgICAgIHN0cnVjdCBrdm1fcnVuICpydW4sCisJCQkJCQkgICAgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCitleHRlcm4gZW51bSBlbXVsYXRpb25fcmVzdWx0IGt2bV9taXBzX2VtdWxhdGVfbXNhZGlzX2V4Yyh1bnNpZ25lZCBsb25nIGNhdXNlLAorCQkJCQkJCSB1aW50MzJfdCAqb3BjLAorCQkJCQkJCSBzdHJ1Y3Qga3ZtX3J1biAqcnVuLAorCQkJCQkJCSBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCiBleHRlcm4gZW51bSBlbXVsYXRpb25fcmVzdWx0IGt2bV9taXBzX2NvbXBsZXRlX21taW9fbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkJCQkJIHN0cnVjdCBrdm1fcnVuICpydW4pOwogCkBAIC03NDksNiArODE1LDExIEBACiAJCQkJCSAgICBzdHJ1Y3Qga3ZtX3J1biAqcnVuLAogCQkJCQkgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAordW5zaWduZWQgaW50IGt2bV9taXBzX2NvbmZpZzFfd3JtYXNrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Cit1bnNpZ25lZCBpbnQga3ZtX21pcHNfY29uZmlnM193cm1hc2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKK3Vuc2lnbmVkIGludCBrdm1fbWlwc19jb25maWc0X3dybWFzayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwordW5zaWduZWQgaW50IGt2bV9taXBzX2NvbmZpZzVfd3JtYXNrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CisKIC8qIER5bmFtaWMgYmluYXJ5IHRyYW5zbGF0aW9uICovCiBleHRlcm4gaW50IGt2bV9taXBzX3RyYW5zX2NhY2hlX2luZGV4KHVpbnQzMl90IGluc3QsIHVpbnQzMl90ICpvcGMsCiAJCQkJICAgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTYzeHgvYmNtNjN4eF9yZWdzLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vbWFjaC1iY202M3h4L2JjbTYzeHhfcmVncy5oCmluZGV4IDQ3OTQwNjcuLjUwMzVmMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9tYWNoLWJjbTYzeHgvYmNtNjN4eF9yZWdzLmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL21hY2gtYmNtNjN4eC9iY202M3h4X3JlZ3MuaApAQCAtMTI1OSwyMCArMTI1OSw2IEBACiAjZGVmaW5lIE0yTV9EU1RJRF9SRUcoeCkJCSgoeCkgKiAweDQwICsgMHgxOCkKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIF9SRUcgcmVsYXRpdmUgdG8gUlNFVF9STkcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFJOR19DVFJMCQkJMHgwMAotI2RlZmluZSBSTkdfRU4JCQkJKDEgPDwgMCkKLQotI2RlZmluZSBSTkdfU1RBVAkJCTB4MDQKLSNkZWZpbmUgUk5HX0FWQUlMX01BU0sJCQkoMHhmZjAwMDAwMCkKLQotI2RlZmluZSBSTkdfREFUQQkJCTB4MDgKLSNkZWZpbmUgUk5HX1RIUkVTCQkJMHgwYwotI2RlZmluZSBSTkdfTUFTSwkJCTB4MTAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIF9SRUcgcmVsYXRpdmUgdG8gUlNFVF9TUEkKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggYjVkY2JlZS4uOWIzYjQ4ZSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTA1LDcgKzEwNSw3IEBACiAjaWZkZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCiAjIGRlZmluZSBGUFJfSURYKHdpZHRoLCBpZHgpCShpZHgpCiAjZWxzZQotIyBkZWZpbmUgRlBSX0lEWCh3aWR0aCwgaWR4KQkoKEZQVV9SRUdfV0lEVEggLyAod2lkdGgpKSAtIDEgLSAoaWR4KSkKKyMgZGVmaW5lIEZQUl9JRFgod2lkdGgsIGlkeCkJKChpZHgpIF4gKCg2NCAvICh3aWR0aCkpIC0gMSkpCiAjZW5kaWYKIAogI2RlZmluZSBCVUlMRF9GUFJfQUNDRVNTKHdpZHRoKSBcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDU1ZWQ2NjAuLjg0MDhhMzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0yMyw3ICsyMyw2IEBACiAgKi8KIHN0cnVjdCB0aHJlYWRfaW5mbyB7CiAJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogbWFpbiB0YXNrIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBleGVjX2RvbWFpbgkqZXhlY19kb21haW47CS8qIGV4ZWN1dGlvbiBkb21haW4gKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGxvdyBsZXZlbCBmbGFncyAqLwogCXVuc2lnbmVkIGxvbmcJCXRwX3ZhbHVlOwkvKiB0aHJlYWQgcG9pbnRlciAqLwogCV9fdTMyCQkJY3B1OwkJLyogY3VycmVudCBDUFUgKi8KQEAgLTQ0LDcgKzQzLDYgQEAKICNkZWZpbmUgSU5JVF9USFJFQURfSU5GTyh0c2spCQkJXAogewkJCQkJCVwKIAkudGFzawkJPSAmdHNrLAkJCVwKLQkuZXhlY19kb21haW4JPSAmZGVmYXVsdF9leGVjX2RvbWFpbiwgXAogCS5mbGFncwkJPSBfVElGX0ZJWEFERSwJCVwKIAkuY3B1CQk9IDAsCQkJXAogCS5wcmVlbXB0X2NvdW50CT0gSU5JVF9QUkVFTVBUX0NPVU5ULAlcCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS91YXBpL2FzbS9rdm0uaCBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCmluZGV4IDJjMDRiNmQuLjY5ODVlYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL3VhcGkvYXNtL2t2bS5oCkBAIC0zNiw3NyArMzYsODUgQEAKIAogLyoKICAqIGZvciBLVk1fR0VUX0ZQVSBhbmQgS1ZNX1NFVF9GUFUKLSAqCi0gKiBJZiBTdGF0dXNbRlJdIGlzIHplcm8gKDMyLWJpdCBGUFUpLCB0aGUgdXBwZXIgMzItYml0cyBvZiB0aGUgRlBScwotICogYXJlIHplcm8gZmlsbGVkLgogICovCiBzdHJ1Y3Qga3ZtX2ZwdSB7Ci0JX191NjQgZnByWzMyXTsKLQlfX3UzMiBmaXI7Ci0JX191MzIgZmNjcjsKLQlfX3UzMiBmZXhyOwotCV9fdTMyIGZlbnI7Ci0JX191MzIgZmNzcjsKLQlfX3UzMiBwYWQ7CiB9OwogCiAKIC8qCi0gKiBGb3IgTUlQUywgd2UgdXNlIEtWTV9TRVRfT05FX1JFRyBhbmQgS1ZNX0dFVF9PTkVfUkVHIHRvIGFjY2VzcyBDUDAKKyAqIEZvciBNSVBTLCB3ZSB1c2UgS1ZNX1NFVF9PTkVfUkVHIGFuZCBLVk1fR0VUX09ORV9SRUcgdG8gYWNjZXNzIHZhcmlvdXMKICAqIHJlZ2lzdGVycy4gIFRoZSBpZCBmaWVsZCBpcyBicm9rZW4gZG93biBhcyBmb2xsb3dzOgogICoKLSAqICBiaXRzWzIuLjBdICAgLSBSZWdpc3RlciAnc2VsJyBpbmRleC4KLSAqICBiaXRzWzcuLjNdICAgLSBSZWdpc3RlciAncmQnICBpbmRleC4KLSAqICBiaXRzWzE1Li44XSAgLSBNdXN0IGJlIHplcm8uCi0gKiAgYml0c1szMS4uMTZdIC0gMSAtPiBDUDAgcmVnaXN0ZXJzLgotICogIGJpdHNbNTEuLjMyXSAtIE11c3QgYmUgemVyby4KICAqICBiaXRzWzYzLi41Ml0gLSBBcyBwZXIgbGludXgva3ZtLmgKKyAqICBiaXRzWzUxLi4zMl0gLSBNdXN0IGJlIHplcm8uCisgKiAgYml0c1szMS4uMTZdIC0gUmVnaXN0ZXIgc2V0LgorICoKKyAqIFJlZ2lzdGVyIHNldCA9IDA6IEdQIHJlZ2lzdGVycyBmcm9tIGt2bV9yZWdzIChzZWUgZGVmaW5pdGlvbnMgYmVsb3cpLgorICoKKyAqIFJlZ2lzdGVyIHNldCA9IDE6IENQMCByZWdpc3RlcnMuCisgKiAgYml0c1sxNS4uOF0gIC0gTXVzdCBiZSB6ZXJvLgorICogIGJpdHNbNy4uM10gICAtIFJlZ2lzdGVyICdyZCcgIGluZGV4LgorICogIGJpdHNbMi4uMF0gICAtIFJlZ2lzdGVyICdzZWwnIGluZGV4LgorICoKKyAqIFJlZ2lzdGVyIHNldCA9IDI6IEtWTSBzcGVjaWZpYyByZWdpc3RlcnMgKHNlZSBkZWZpbml0aW9ucyBiZWxvdykuCisgKgorICogUmVnaXN0ZXIgc2V0ID0gMzogRlBVIC8gTVNBIHJlZ2lzdGVycyAoc2VlIGRlZmluaXRpb25zIGJlbG93KS4KICAqCiAgKiBPdGhlciBzZXRzIHJlZ2lzdGVycyBtYXkgYmUgYWRkZWQgaW4gdGhlIGZ1dHVyZS4gIEVhY2ggc2V0IHdvdWxkCiAgKiBoYXZlIGl0cyBvd24gaWRlbnRpZmllciBpbiBiaXRzWzMxLi4xNl0uCi0gKgotICogVGhlIHJlZ2lzdGVycyBkZWZpbmVkIGluIHN0cnVjdCBrdm1fcmVncyBhcmUgYWxzbyBhY2Nlc3NpYmxlLCB0aGUKLSAqIGlkIHZhbHVlcyBmb3IgdGhlc2UgYXJlIGJlbG93LgogICovCiAKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IwIChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMCkKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IxIChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMSkKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IyIChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMikKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IzIChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMykKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1I0IChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgNCkKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1I1IChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgNSkKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1I2IChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgNikKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1I3IChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgNykKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1I4IChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgOCkKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1I5IChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgOSkKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IxMCAoS1ZNX1JFR19NSVBTIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDEwKQotI2RlZmluZSBLVk1fUkVHX01JUFNfUjExIChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMTEpCi0jZGVmaW5lIEtWTV9SRUdfTUlQU19SMTIgKEtWTV9SRUdfTUlQUyB8IEtWTV9SRUdfU0laRV9VNjQgfCAxMikKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IxMyAoS1ZNX1JFR19NSVBTIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDEzKQotI2RlZmluZSBLVk1fUkVHX01JUFNfUjE0IChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMTQpCi0jZGVmaW5lIEtWTV9SRUdfTUlQU19SMTUgKEtWTV9SRUdfTUlQUyB8IEtWTV9SRUdfU0laRV9VNjQgfCAxNSkKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IxNiAoS1ZNX1JFR19NSVBTIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDE2KQotI2RlZmluZSBLVk1fUkVHX01JUFNfUjE3IChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMTcpCi0jZGVmaW5lIEtWTV9SRUdfTUlQU19SMTggKEtWTV9SRUdfTUlQUyB8IEtWTV9SRUdfU0laRV9VNjQgfCAxOCkKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IxOSAoS1ZNX1JFR19NSVBTIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDE5KQotI2RlZmluZSBLVk1fUkVHX01JUFNfUjIwIChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMjApCi0jZGVmaW5lIEtWTV9SRUdfTUlQU19SMjEgKEtWTV9SRUdfTUlQUyB8IEtWTV9SRUdfU0laRV9VNjQgfCAyMSkKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IyMiAoS1ZNX1JFR19NSVBTIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDIyKQotI2RlZmluZSBLVk1fUkVHX01JUFNfUjIzIChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMjMpCi0jZGVmaW5lIEtWTV9SRUdfTUlQU19SMjQgKEtWTV9SRUdfTUlQUyB8IEtWTV9SRUdfU0laRV9VNjQgfCAyNCkKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IyNSAoS1ZNX1JFR19NSVBTIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDI1KQotI2RlZmluZSBLVk1fUkVHX01JUFNfUjI2IChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMjYpCi0jZGVmaW5lIEtWTV9SRUdfTUlQU19SMjcgKEtWTV9SRUdfTUlQUyB8IEtWTV9SRUdfU0laRV9VNjQgfCAyNykKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IyOCAoS1ZNX1JFR19NSVBTIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDI4KQotI2RlZmluZSBLVk1fUkVHX01JUFNfUjI5IChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMjkpCi0jZGVmaW5lIEtWTV9SRUdfTUlQU19SMzAgKEtWTV9SRUdfTUlQUyB8IEtWTV9SRUdfU0laRV9VNjQgfCAzMCkKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX1IzMSAoS1ZNX1JFR19NSVBTIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDMxKQorI2RlZmluZSBLVk1fUkVHX01JUFNfR1AJCShLVk1fUkVHX01JUFMgfCAweDAwMDAwMDAwMDAwMDAwMDBVTEwpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19DUDAJKEtWTV9SRUdfTUlQUyB8IDB4MDAwMDAwMDAwMDAxMDAwMFVMTCkKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX0tWTQkoS1ZNX1JFR19NSVBTIHwgMHgwMDAwMDAwMDAwMDIwMDAwVUxMKQorI2RlZmluZSBLVk1fUkVHX01JUFNfRlBVCShLVk1fUkVHX01JUFMgfCAweDAwMDAwMDAwMDAwMzAwMDBVTEwpCiAKLSNkZWZpbmUgS1ZNX1JFR19NSVBTX0hJIChLVk1fUkVHX01JUFMgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMzIpCi0jZGVmaW5lIEtWTV9SRUdfTUlQU19MTyAoS1ZNX1JFR19NSVBTIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDMzKQotI2RlZmluZSBLVk1fUkVHX01JUFNfUEMgKEtWTV9SRUdfTUlQUyB8IEtWTV9SRUdfU0laRV9VNjQgfCAzNCkKIAotLyogS1ZNIHNwZWNpZmljIGNvbnRyb2wgcmVnaXN0ZXJzICovCisvKgorICogS1ZNX1JFR19NSVBTX0dQIC0gR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyBmcm9tIGt2bV9yZWdzLgorICovCisKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX1IwCQkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8ICAwKQorI2RlZmluZSBLVk1fUkVHX01JUFNfUjEJCShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgIDEpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19SMgkJKEtWTV9SRUdfTUlQU19HUCB8IEtWTV9SRUdfU0laRV9VNjQgfCAgMikKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX1IzCQkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8ICAzKQorI2RlZmluZSBLVk1fUkVHX01JUFNfUjQJCShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgIDQpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19SNQkJKEtWTV9SRUdfTUlQU19HUCB8IEtWTV9SRUdfU0laRV9VNjQgfCAgNSkKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX1I2CQkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8ICA2KQorI2RlZmluZSBLVk1fUkVHX01JUFNfUjcJCShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgIDcpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19SOAkJKEtWTV9SRUdfTUlQU19HUCB8IEtWTV9SRUdfU0laRV9VNjQgfCAgOCkKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX1I5CQkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8ICA5KQorI2RlZmluZSBLVk1fUkVHX01JUFNfUjEwCShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMTApCisjZGVmaW5lIEtWTV9SRUdfTUlQU19SMTEJKEtWTV9SRUdfTUlQU19HUCB8IEtWTV9SRUdfU0laRV9VNjQgfCAxMSkKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX1IxMgkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDEyKQorI2RlZmluZSBLVk1fUkVHX01JUFNfUjEzCShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMTMpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19SMTQJKEtWTV9SRUdfTUlQU19HUCB8IEtWTV9SRUdfU0laRV9VNjQgfCAxNCkKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX1IxNQkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDE1KQorI2RlZmluZSBLVk1fUkVHX01JUFNfUjE2CShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMTYpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19SMTcJKEtWTV9SRUdfTUlQU19HUCB8IEtWTV9SRUdfU0laRV9VNjQgfCAxNykKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX1IxOAkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDE4KQorI2RlZmluZSBLVk1fUkVHX01JUFNfUjE5CShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMTkpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19SMjAJKEtWTV9SRUdfTUlQU19HUCB8IEtWTV9SRUdfU0laRV9VNjQgfCAyMCkKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX1IyMQkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDIxKQorI2RlZmluZSBLVk1fUkVHX01JUFNfUjIyCShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMjIpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19SMjMJKEtWTV9SRUdfTUlQU19HUCB8IEtWTV9SRUdfU0laRV9VNjQgfCAyMykKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX1IyNAkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDI0KQorI2RlZmluZSBLVk1fUkVHX01JUFNfUjI1CShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMjUpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19SMjYJKEtWTV9SRUdfTUlQU19HUCB8IEtWTV9SRUdfU0laRV9VNjQgfCAyNikKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX1IyNwkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDI3KQorI2RlZmluZSBLVk1fUkVHX01JUFNfUjI4CShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMjgpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19SMjkJKEtWTV9SRUdfTUlQU19HUCB8IEtWTV9SRUdfU0laRV9VNjQgfCAyOSkKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX1IzMAkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDMwKQorI2RlZmluZSBLVk1fUkVHX01JUFNfUjMxCShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMzEpCisKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX0hJCQkoS1ZNX1JFR19NSVBTX0dQIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDMyKQorI2RlZmluZSBLVk1fUkVHX01JUFNfTE8JCShLVk1fUkVHX01JUFNfR1AgfCBLVk1fUkVHX1NJWkVfVTY0IHwgMzMpCisjZGVmaW5lIEtWTV9SRUdfTUlQU19QQwkJKEtWTV9SRUdfTUlQU19HUCB8IEtWTV9SRUdfU0laRV9VNjQgfCAzNCkKKworCisvKgorICogS1ZNX1JFR19NSVBTX0tWTSAtIEtWTSBzcGVjaWZpYyBjb250cm9sIHJlZ2lzdGVycy4KKyAqLwogCiAvKgogICogQ1AwX0NvdW50IGNvbnRyb2wKQEAgLTExOCw4ICsxMjYsNyBAQAogICogICAgICAgIHNhZmVseSB3aXRob3V0IGxvc2luZyB0aW1lIG9yIGd1ZXN0IHRpbWVyIGludGVycnVwdHMuCiAgKiBPdGhlcjogUmVzZXJ2ZWQsIGRvIG5vdCBjaGFuZ2UuCiAgKi8KLSNkZWZpbmUgS1ZNX1JFR19NSVBTX0NPVU5UX0NUTAkJKEtWTV9SRUdfTUlQUyB8IEtWTV9SRUdfU0laRV9VNjQgfCBcCi0JCQkJCSAweDIwMDAwIHwgMCkKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX0NPVU5UX0NUTAkgICAgKEtWTV9SRUdfTUlQU19LVk0gfCBLVk1fUkVHX1NJWkVfVTY0IHwgMCkKICNkZWZpbmUgS1ZNX1JFR19NSVBTX0NPVU5UX0NUTF9EQwkweDAwMDAwMDAxCiAKIC8qCkBAIC0xMzEsMTUgKzEzOCw0NiBAQAogICogZW11bGF0ZWQuCiAgKiBNb2RpZmljYXRpb25zIHRvIHRpbWVzIGluIHRoZSBmdXR1cmUgYXJlIHJlamVjdGVkLgogICovCi0jZGVmaW5lIEtWTV9SRUdfTUlQU19DT1VOVF9SRVNVTUUJKEtWTV9SRUdfTUlQUyB8IEtWTV9SRUdfU0laRV9VNjQgfCBcCi0JCQkJCSAweDIwMDAwIHwgMSkKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX0NPVU5UX1JFU1VNRSAgIChLVk1fUkVHX01JUFNfS1ZNIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDEpCiAvKgogICogQ1AwX0NvdW50IHJhdGUgaW4gSHoKICAqIFNwZWNpZmllcyB0aGUgcmF0ZSBvZiB0aGUgQ1AwX0NvdW50IHRpbWVyIGluIEh6LiBNb2RpZmljYXRpb25zIG9jY3VyIHdpdGhvdXQKICAqIGRpc2NvbnRpbnVpdGllcyBpbiBDUDBfQ291bnQuCiAgKi8KLSNkZWZpbmUgS1ZNX1JFR19NSVBTX0NPVU5UX0haCQkoS1ZNX1JFR19NSVBTIHwgS1ZNX1JFR19TSVpFX1U2NCB8IFwKLQkJCQkJIDB4MjAwMDAgfCAyKQorI2RlZmluZSBLVk1fUkVHX01JUFNfQ09VTlRfSFoJICAgIChLVk1fUkVHX01JUFNfS1ZNIHwgS1ZNX1JFR19TSVpFX1U2NCB8IDIpCisKKworLyoKKyAqIEtWTV9SRUdfTUlQU19GUFUgLSBGbG9hdGluZyBQb2ludCBhbmQgTUlQUyBTSU1EIEFyY2hpdGVjdHVyZSAoTVNBKSByZWdpc3RlcnMuCisgKgorICogIGJpdHNbMTUuLjhdICAtIFJlZ2lzdGVyIHN1YnNldCAoc2VlIGRlZmluaXRpb25zIGJlbG93KS4KKyAqICBiaXRzWzcuLjVdICAgLSBNdXN0IGJlIHplcm8uCisgKiAgYml0c1s0Li4wXSAgIC0gUmVnaXN0ZXIgbnVtYmVyIHdpdGhpbiByZWdpc3RlciBzdWJzZXQuCisgKi8KKworI2RlZmluZSBLVk1fUkVHX01JUFNfRlBSCShLVk1fUkVHX01JUFNfRlBVIHwgMHgwMDAwMDAwMDAwMDAwMDAwVUxMKQorI2RlZmluZSBLVk1fUkVHX01JUFNfRkNSCShLVk1fUkVHX01JUFNfRlBVIHwgMHgwMDAwMDAwMDAwMDAwMTAwVUxMKQorI2RlZmluZSBLVk1fUkVHX01JUFNfTVNBQ1IJKEtWTV9SRUdfTUlQU19GUFUgfCAweDAwMDAwMDAwMDAwMDAyMDBVTEwpCisKKy8qCisgKiBLVk1fUkVHX01JUFNfRlBSIC0gRmxvYXRpbmcgcG9pbnQgLyBWZWN0b3IgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIEtWTV9SRUdfTUlQU19GUFJfMzIobikJKEtWTV9SRUdfTUlQU19GUFIgfCBLVk1fUkVHX1NJWkVfVTMyICB8IChuKSkKKyNkZWZpbmUgS1ZNX1JFR19NSVBTX0ZQUl82NChuKQkoS1ZNX1JFR19NSVBTX0ZQUiB8IEtWTV9SRUdfU0laRV9VNjQgIHwgKG4pKQorI2RlZmluZSBLVk1fUkVHX01JUFNfVkVDXzEyOChuKQkoS1ZNX1JFR19NSVBTX0ZQUiB8IEtWTV9SRUdfU0laRV9VMTI4IHwgKG4pKQorCisvKgorICogS1ZNX1JFR19NSVBTX0ZDUiAtIEZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIEtWTV9SRUdfTUlQU19GQ1JfSVIJKEtWTV9SRUdfTUlQU19GQ1IgfCBLVk1fUkVHX1NJWkVfVTMyIHwgIDApCisjZGVmaW5lIEtWTV9SRUdfTUlQU19GQ1JfQ1NSCShLVk1fUkVHX01JUFNfRkNSIHwgS1ZNX1JFR19TSVpFX1UzMiB8IDMxKQorCisvKgorICogS1ZNX1JFR19NSVBTX01TQUNSIC0gTUlQUyBTSU1EIEFyY2hpdGVjdHVyZSAoTVNBKSBjb250cm9sIHJlZ2lzdGVycy4KKyAqLworI2RlZmluZSBLVk1fUkVHX01JUFNfTVNBX0lSCSAoS1ZNX1JFR19NSVBTX01TQUNSIHwgS1ZNX1JFR19TSVpFX1UzMiB8ICAwKQorI2RlZmluZSBLVk1fUkVHX01JUFNfTVNBX0NTUgkgKEtWTV9SRUdfTUlQU19NU0FDUiB8IEtWTV9SRUdfU0laRV9VMzIgfCAgMSkKKwogCiAvKgogICogS1ZNIE1JUFMgc3BlY2lmaWMgc3RydWN0dXJlcyBhbmQgZGVmaW5pdGlvbnMKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvbWlwcy9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCA3NTBkNjdhLi5iZWFiZTE5IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC05Miw3ICs5Miw2IEBACiB7CiAJQ09NTUVOVCgiTUlQUyB0aHJlYWRfaW5mbyBvZmZzZXRzLiIpOwogCU9GRlNFVChUSV9UQVNLLCB0aHJlYWRfaW5mbywgdGFzayk7Ci0JT0ZGU0VUKFRJX0VYRUNfRE9NQUlOLCB0aHJlYWRfaW5mbywgZXhlY19kb21haW4pOwogCU9GRlNFVChUSV9GTEFHUywgdGhyZWFkX2luZm8sIGZsYWdzKTsKIAlPRkZTRVQoVElfVFBfVkFMVUUsIHRocmVhZF9pbmZvLCB0cF92YWx1ZSk7CiAJT0ZGU0VUKFRJX0NQVSwgdGhyZWFkX2luZm8sIGNwdSk7CkBAIC0xNjcsNzIgKzE2Niw2IEBACiAJT0ZGU0VUKFRIUkVBRF9GUFIzMCwgdGFza19zdHJ1Y3QsIHRocmVhZC5mcHUuZnByWzMwXSk7CiAJT0ZGU0VUKFRIUkVBRF9GUFIzMSwgdGFza19zdHJ1Y3QsIHRocmVhZC5mcHUuZnByWzMxXSk7CiAKLQkvKiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgNjQgYml0cyBvZiBlYWNoIEZQIHJlZ2lzdGVyICovCi0JT0ZGU0VUKFRIUkVBRF9GUFIwX0xTNjQsIHRhc2tfc3RydWN0LAotCSAgICAgICB0aHJlYWQuZnB1LmZwclswXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMV9MUzY0LCB0YXNrX3N0cnVjdCwKLQkgICAgICAgdGhyZWFkLmZwdS5mcHJbMV0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKLQlPRkZTRVQoVEhSRUFEX0ZQUjJfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzJdLnZhbDY0W0ZQUl9JRFgoNjQsIDApXSk7Ci0JT0ZGU0VUKFRIUkVBRF9GUFIzX0xTNjQsIHRhc2tfc3RydWN0LAotCSAgICAgICB0aHJlYWQuZnB1LmZwclszXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSNF9MUzY0LCB0YXNrX3N0cnVjdCwKLQkgICAgICAgdGhyZWFkLmZwdS5mcHJbNF0udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKLQlPRkZTRVQoVEhSRUFEX0ZQUjVfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzVdLnZhbDY0W0ZQUl9JRFgoNjQsIDApXSk7Ci0JT0ZGU0VUKFRIUkVBRF9GUFI2X0xTNjQsIHRhc2tfc3RydWN0LAotCSAgICAgICB0aHJlYWQuZnB1LmZwcls2XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSN19MUzY0LCB0YXNrX3N0cnVjdCwKLQkgICAgICAgdGhyZWFkLmZwdS5mcHJbN10udmFsNjRbRlBSX0lEWCg2NCwgMCldKTsKLQlPRkZTRVQoVEhSRUFEX0ZQUjhfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzhdLnZhbDY0W0ZQUl9JRFgoNjQsIDApXSk7Ci0JT0ZGU0VUKFRIUkVBRF9GUFI5X0xTNjQsIHRhc2tfc3RydWN0LAotCSAgICAgICB0aHJlYWQuZnB1LmZwcls5XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMTBfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzEwXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMTFfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzExXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMTJfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzEyXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMTNfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzEzXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMTRfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzE0XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMTVfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzE1XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMTZfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzE2XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMTdfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzE3XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMThfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzE4XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMTlfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzE5XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMjBfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzIwXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMjFfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzIxXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMjJfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzIyXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMjNfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzIzXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMjRfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzI0XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMjVfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzI1XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMjZfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzI2XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMjdfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzI3XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMjhfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzI4XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMjlfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzI5XS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMzBfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzMwXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCU9GRlNFVChUSFJFQURfRlBSMzFfTFM2NCwgdGFza19zdHJ1Y3QsCi0JICAgICAgIHRocmVhZC5mcHUuZnByWzMxXS52YWw2NFtGUFJfSURYKDY0LCAwKV0pOwotCiAJT0ZGU0VUKFRIUkVBRF9GQ1IzMSwgdGFza19zdHJ1Y3QsIHRocmVhZC5mcHUuZmNyMzEpOwogCU9GRlNFVChUSFJFQURfTVNBX0NTUiwgdGFza19zdHJ1Y3QsIHRocmVhZC5mcHUubXNhY3NyKTsKIAlCTEFOSygpOwpAQCAtNDcwLDYgKzQwMyw0NSBAQAogCU9GRlNFVChWQ1BVX0xPLCBrdm1fdmNwdV9hcmNoLCBsbyk7CiAJT0ZGU0VUKFZDUFVfSEksIGt2bV92Y3B1X2FyY2gsIGhpKTsKIAlPRkZTRVQoVkNQVV9QQywga3ZtX3ZjcHVfYXJjaCwgcGMpOworCUJMQU5LKCk7CisKKwlPRkZTRVQoVkNQVV9GUFIwLCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzBdKTsKKwlPRkZTRVQoVkNQVV9GUFIxLCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzFdKTsKKwlPRkZTRVQoVkNQVV9GUFIyLCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzJdKTsKKwlPRkZTRVQoVkNQVV9GUFIzLCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzNdKTsKKwlPRkZTRVQoVkNQVV9GUFI0LCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzRdKTsKKwlPRkZTRVQoVkNQVV9GUFI1LCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzVdKTsKKwlPRkZTRVQoVkNQVV9GUFI2LCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzZdKTsKKwlPRkZTRVQoVkNQVV9GUFI3LCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzddKTsKKwlPRkZTRVQoVkNQVV9GUFI4LCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzhdKTsKKwlPRkZTRVQoVkNQVV9GUFI5LCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzldKTsKKwlPRkZTRVQoVkNQVV9GUFIxMCwga3ZtX3ZjcHVfYXJjaCwgZnB1LmZwclsxMF0pOworCU9GRlNFVChWQ1BVX0ZQUjExLCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzExXSk7CisJT0ZGU0VUKFZDUFVfRlBSMTIsIGt2bV92Y3B1X2FyY2gsIGZwdS5mcHJbMTJdKTsKKwlPRkZTRVQoVkNQVV9GUFIxMywga3ZtX3ZjcHVfYXJjaCwgZnB1LmZwclsxM10pOworCU9GRlNFVChWQ1BVX0ZQUjE0LCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzE0XSk7CisJT0ZGU0VUKFZDUFVfRlBSMTUsIGt2bV92Y3B1X2FyY2gsIGZwdS5mcHJbMTVdKTsKKwlPRkZTRVQoVkNQVV9GUFIxNiwga3ZtX3ZjcHVfYXJjaCwgZnB1LmZwclsxNl0pOworCU9GRlNFVChWQ1BVX0ZQUjE3LCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzE3XSk7CisJT0ZGU0VUKFZDUFVfRlBSMTgsIGt2bV92Y3B1X2FyY2gsIGZwdS5mcHJbMThdKTsKKwlPRkZTRVQoVkNQVV9GUFIxOSwga3ZtX3ZjcHVfYXJjaCwgZnB1LmZwclsxOV0pOworCU9GRlNFVChWQ1BVX0ZQUjIwLCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzIwXSk7CisJT0ZGU0VUKFZDUFVfRlBSMjEsIGt2bV92Y3B1X2FyY2gsIGZwdS5mcHJbMjFdKTsKKwlPRkZTRVQoVkNQVV9GUFIyMiwga3ZtX3ZjcHVfYXJjaCwgZnB1LmZwclsyMl0pOworCU9GRlNFVChWQ1BVX0ZQUjIzLCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzIzXSk7CisJT0ZGU0VUKFZDUFVfRlBSMjQsIGt2bV92Y3B1X2FyY2gsIGZwdS5mcHJbMjRdKTsKKwlPRkZTRVQoVkNQVV9GUFIyNSwga3ZtX3ZjcHVfYXJjaCwgZnB1LmZwclsyNV0pOworCU9GRlNFVChWQ1BVX0ZQUjI2LCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzI2XSk7CisJT0ZGU0VUKFZDUFVfRlBSMjcsIGt2bV92Y3B1X2FyY2gsIGZwdS5mcHJbMjddKTsKKwlPRkZTRVQoVkNQVV9GUFIyOCwga3ZtX3ZjcHVfYXJjaCwgZnB1LmZwclsyOF0pOworCU9GRlNFVChWQ1BVX0ZQUjI5LCBrdm1fdmNwdV9hcmNoLCBmcHUuZnByWzI5XSk7CisJT0ZGU0VUKFZDUFVfRlBSMzAsIGt2bV92Y3B1X2FyY2gsIGZwdS5mcHJbMzBdKTsKKwlPRkZTRVQoVkNQVV9GUFIzMSwga3ZtX3ZjcHVfYXJjaCwgZnB1LmZwclszMV0pOworCisJT0ZGU0VUKFZDUFVfRkNSMzEsIGt2bV92Y3B1X2FyY2gsIGZwdS5mY3IzMSk7CisJT0ZGU0VUKFZDUFVfTVNBX0NTUiwga3ZtX3ZjcHVfYXJjaCwgZnB1Lm1zYWNzcik7CisJQkxBTksoKTsKKwogCU9GRlNFVChWQ1BVX0NPUDAsIGt2bV92Y3B1X2FyY2gsIGNvcDApOwogCU9GRlNFVChWQ1BVX0dVRVNUX0tFUk5FTF9BU0lELCBrdm1fdmNwdV9hcmNoLCBndWVzdF9rZXJuZWxfYXNpZCk7CiAJT0ZGU0VUKFZDUFVfR1VFU1RfVVNFUl9BU0lELCBrdm1fdmNwdV9hcmNoLCBndWVzdF91c2VyX2FzaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TIGIvYXJjaC9taXBzL2tlcm5lbC9nZW5leC5TCmluZGV4IDJlYmFhYmUuLmFmNDJlNzAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvZ2VuZXguUworKysgYi9hcmNoL21pcHMva2VybmVsL2dlbmV4LlMKQEAgLTM2MCwxMiArMzYwLDE1IEBACiAJLnNldAltaXBzMQogCVNFVF9IQVJERkxPQVQKIAljZmMxCWExLCBmY3IzMQotCWxpCWEyLCB+KDB4M2YgPDwgMTIpCi0JYW5kCWEyLCBhMQotCWN0YzEJYTIsIGZjcjMxCiAJLnNldAlwb3AKLQlUUkFDRV9JUlFTX09OCi0JU1RJCisJQ0xJCisJVFJBQ0VfSVJRU19PRkYKKwkuZW5kbQorCisJLm1hY3JvCV9fYnVpbGRfY2xlYXJfbXNhX2ZwZQorCV9jZmNtc2EJYTEsIE1TQV9DU1IKKwlDTEkKKwlUUkFDRV9JUlFTX09GRgogCS5lbmRtCiAKIAkubWFjcm8JX19idWlsZF9jbGVhcl9hZGUKQEAgLTQyNiw3ICs0MjksNyBAQAogCUJVSUxEX0hBTkRMRVIgY3B1IGNwdSBzdGkgc2lsZW50CQkvKiAjMTEgKi8KIAlCVUlMRF9IQU5ETEVSIG92IG92IHN0aSBzaWxlbnQJCQkvKiAjMTIgKi8KIAlCVUlMRF9IQU5ETEVSIHRyIHRyIHN0aSBzaWxlbnQJCQkvKiAjMTMgKi8KLQlCVUlMRF9IQU5ETEVSIG1zYV9mcGUgbXNhX2ZwZSBzdGkgc2lsZW50CS8qICMxNCAqLworCUJVSUxEX0hBTkRMRVIgbXNhX2ZwZSBtc2FfZnBlIG1zYV9mcGUgc2lsZW50CS8qICMxNCAqLwogCUJVSUxEX0hBTkRMRVIgZnBlIGZwZSBmcGUgc2lsZW50CQkvKiAjMTUgKi8KIAlCVUlMRF9IQU5ETEVSIGZ0bGIgZnRsYiBub25lIHNpbGVudAkJLyogIzE2ICovCiAJQlVJTERfSEFORExFUiBtc2EgbXNhIHN0aSBzaWxlbnQJCS8qICMyMSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvbWlwcy9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNTEwNDUyOC4uN2RhNmUzMiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL21pcHMva2VybmVsL3B0cmFjZS5jCkBAIC00Niw2ICs0NiwyNiBAQAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3N5c2NhbGxzLmg+CiAKK3N0YXRpYyB2b2lkIGluaXRfZnBfY3R4KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0KQoreworCS8qIElmIEZQIGhhcyBiZWVuIHVzZWQgdGhlbiB0aGUgdGFyZ2V0IGFscmVhZHkgaGFzIGNvbnRleHQgKi8KKwlpZiAodHNrX3VzZWRfbWF0aCh0YXJnZXQpKQorCQlyZXR1cm47CisKKwkvKiBCZWdpbiB3aXRoIGRhdGEgcmVnaXN0ZXJzIHNldCB0byBhbGwgMXMuLi4gKi8KKwltZW1zZXQoJnRhcmdldC0+dGhyZWFkLmZwdS5mcHIsIH4wLCBzaXplb2YodGFyZ2V0LT50aHJlYWQuZnB1LmZwcikpOworCisJLyogLi4uYW5kIEZDU1IgemVyb2VkICovCisJdGFyZ2V0LT50aHJlYWQuZnB1LmZjcjMxID0gMDsKKworCS8qCisJICogUmVjb3JkIHRoYXQgdGhlIHRhcmdldCBoYXMgInVzZWQiIG1hdGgsIHN1Y2ggdGhhdCB0aGUgY29udGV4dAorCSAqIGp1c3QgaW5pdGlhbGlzZWQsIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoZSBjYWxsZXIsCisJICogYXJlbid0IGRpc2NhcmRlZC4KKwkgKi8KKwlzZXRfc3RvcHBlZF9jaGlsZF91c2VkX21hdGgodGFyZ2V0KTsKK30KKwogLyoKICAqIENhbGxlZCBieSBrZXJuZWwvcHRyYWNlLmMgd2hlbiBkZXRhY2hpbmcuLgogICoKQEAgLTE0Miw2ICsxNjIsNyBAQAogCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBkYXRhLCAzMyAqIDgpKQogCQlyZXR1cm4gLUVJTzsKIAorCWluaXRfZnBfY3R4KGNoaWxkKTsKIAlmcmVncyA9IGdldF9mcHVfcmVncyhjaGlsZCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewpAQCAtNDM5LDYgKzQ2MCw4IEBACiAKIAkvKiBYWFggZmNyMzEgICovCiAKKwlpbml0X2ZwX2N0eCh0YXJnZXQpOworCiAJaWYgKHNpemVvZih0YXJnZXQtPnRocmVhZC5mcHUuZnByW2ldKSA9PSBzaXplb2YoZWxmX2ZwcmVnX3QpKQogCQlyZXR1cm4gdXNlcl9yZWdzZXRfY29weWluKCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAogCQkJCQkgICZ0YXJnZXQtPnRocmVhZC5mcHUsCkBAIC02NjAsMTIgKzY4Myw3IEBACiAJCWNhc2UgRlBSX0JBU0UgLi4uIEZQUl9CQVNFICsgMzE6IHsKIAkJCXVuaW9uIGZwdXJlZyAqZnJlZ3MgPSBnZXRfZnB1X3JlZ3MoY2hpbGQpOwogCi0JCQlpZiAoIXRza191c2VkX21hdGgoY2hpbGQpKSB7Ci0JCQkJLyogRlAgbm90IHlldCB1c2VkICAqLwotCQkJCW1lbXNldCgmY2hpbGQtPnRocmVhZC5mcHUsIH4wLAotCQkJCSAgICAgICBzaXplb2YoY2hpbGQtPnRocmVhZC5mcHUpKTsKLQkJCQljaGlsZC0+dGhyZWFkLmZwdS5mY3IzMSA9IDA7Ci0JCQl9CisJCQlpbml0X2ZwX2N0eChjaGlsZCk7CiAjaWZkZWYgQ09ORklHXzMyQklUCiAJCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzJCSVRfRlBSRUdTKSkgewogCQkJCS8qCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3I0a19mcHUuUyBiL2FyY2gvbWlwcy9rZXJuZWwvcjRrX2ZwdS5TCmluZGV4IDY3NmM1MDMuLjFkODhhZjIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvcjRrX2ZwdS5TCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcjRrX2ZwdS5TCkBAIC0zNCw3ICszNCw2IEBACiAJLmVuZG0KIAogCS5zZXQJbm9yZW9yZGVyCi0JLnNldAlNSVBTX0lTQV9BUkNIX0xFVkVMX1JBVwogCiBMRUFGKF9zYXZlX2ZwX2NvbnRleHQpCiAJLnNldAlwdXNoCkBAIC0xMDMsNiArMTAyLDcgQEAKIAkvKiBTYXZlIDMyLWJpdCBwcm9jZXNzIGZsb2F0aW5nIHBvaW50IGNvbnRleHQgKi8KIExFQUYoX3NhdmVfZnBfY29udGV4dDMyKQogCS5zZXQgcHVzaAorCS5zZXQgTUlQU19JU0FfQVJDSF9MRVZFTF9SQVcKIAlTRVRfSEFSREZMT0FUCiAJY2ZjMQl0MSwgZmNyMzEKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9taXBzL2tlcm5lbC90cmFwcy5jCmluZGV4IDMzOTg0YzAuLjViNGQ3MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RyYXBzLmMKQEAgLTcwMSw2ICs3MDEsMTMgQEAKIAogaW50IHByb2Nlc3NfZnBlbXVfcmV0dXJuKGludCBzaWcsIHZvaWQgX191c2VyICpmYXVsdF9hZGRyKQogeworCS8qCisJICogV2UgY2FuJ3QgYWxsb3cgdGhlIGVtdWxhdGVkIGluc3RydWN0aW9uIHRvIGxlYXZlIGFueSBvZiB0aGUgY2F1c2UKKwkgKiBiaXRzIHNldCBpbiBGQ1NSLiBJZiB0aGV5IHdlcmUgdGhlbiB0aGUga2VybmVsIHdvdWxkIHRha2UgYW4gRlAKKwkgKiBleGNlcHRpb24gd2hlbiByZXN0b3JpbmcgRlAgY29udGV4dC4KKwkgKi8KKwljdXJyZW50LT50aHJlYWQuZnB1LmZjcjMxICY9IH5GUFVfQ1NSX0FMTF9YOworCiAJaWYgKHNpZyA9PSBTSUdTRUdWIHx8IHNpZyA9PSBTSUdCVVMpIHsKIAkJc3RydWN0IHNpZ2luZm8gc2kgPSB7MH07CiAJCXNpLnNpX2FkZHIgPSBmYXVsdF9hZGRyOwpAQCAtNzgxLDYgKzc4OCwxMSBAQAogCWlmIChub3RpZnlfZGllKERJRV9GUCwgIkZQIGV4Y2VwdGlvbiIsIHJlZ3MsIDAsIHJlZ3NfdG9fdHJhcG5yKHJlZ3MpLAogCQkgICAgICAgU0lHRlBFKSA9PSBOT1RJRllfU1RPUCkKIAkJZ290byBvdXQ7CisKKwkvKiBDbGVhciBGQ1NSLkNhdXNlIGJlZm9yZSBlbmFibGluZyBpbnRlcnJ1cHRzICovCisJd3JpdGVfMzJiaXRfY3AxX3JlZ2lzdGVyKENQMV9TVEFUVVMsIGZjcjMxICYgfkZQVV9DU1JfQUxMX1gpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwogCWRpZV9pZl9rZXJuZWwoIkZQIGV4Y2VwdGlvbiBpbiBrZXJuZWwgY29kZSIsIHJlZ3MpOwogCiAJaWYgKGZjcjMxICYgRlBVX0NTUl9VTklfWCkgewpAQCAtODA0LDE4ICs4MTYsMTIgQEAKIAkJc2lnID0gZnB1X2VtdWxhdG9yX2NvcDFIYW5kbGVyKHJlZ3MsICZjdXJyZW50LT50aHJlYWQuZnB1LCAxLAogCQkJCQkgICAgICAgJmZhdWx0X2FkZHIpOwogCi0JCS8qCi0JCSAqIFdlIGNhbid0IGFsbG93IHRoZSBlbXVsYXRlZCBpbnN0cnVjdGlvbiB0byBsZWF2ZSBhbnkgb2YKLQkJICogdGhlIGNhdXNlIGJpdCBzZXQgaW4gJGZjcjMxLgotCQkgKi8KLQkJY3VycmVudC0+dGhyZWFkLmZwdS5mY3IzMSAmPSB+RlBVX0NTUl9BTExfWDsKKwkJLyogSWYgc29tZXRoaW5nIHdlbnQgd3JvbmcsIHNpZ25hbCAqLworCQlwcm9jZXNzX2ZwZW11X3JldHVybihzaWcsIGZhdWx0X2FkZHIpOwogCiAJCS8qIFJlc3RvcmUgdGhlIGhhcmR3YXJlIHJlZ2lzdGVyIHN0YXRlICovCiAJCW93bl9mcHUoMSk7CS8qIFVzaW5nIHRoZSBGUFUgYWdhaW4uCSAqLwogCi0JCS8qIElmIHNvbWV0aGluZyB3ZW50IHdyb25nLCBzaWduYWwgKi8KLQkJcHJvY2Vzc19mcGVtdV9yZXR1cm4oc2lnLCBmYXVsdF9hZGRyKTsKLQogCQlnb3RvIG91dDsKIAl9IGVsc2UgaWYgKGZjcjMxICYgRlBVX0NTUl9JTlZfWCkKIAkJaW5mby5zaV9jb2RlID0gRlBFX0ZMVElOVjsKQEAgLTEzOTIsMTMgKzEzOTgsMjIgQEAKIAlleGNlcHRpb25fZXhpdChwcmV2X3N0YXRlKTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIGRvX21zYV9mcGUoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIHZvaWQgZG9fbXNhX2ZwZShzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgaW50IG1zYWNzcikKIHsKIAllbnVtIGN0eF9zdGF0ZSBwcmV2X3N0YXRlOwogCiAJcHJldl9zdGF0ZSA9IGV4Y2VwdGlvbl9lbnRlcigpOworCWlmIChub3RpZnlfZGllKERJRV9NU0FGUCwgIk1TQSBGUCBleGNlcHRpb24iLCByZWdzLCAwLAorCQkgICAgICAgcmVnc190b190cmFwbnIocmVncyksIFNJR0ZQRSkgPT0gTk9USUZZX1NUT1ApCisJCWdvdG8gb3V0OworCisJLyogQ2xlYXIgTVNBQ1NSLkNhdXNlIGJlZm9yZSBlbmFibGluZyBpbnRlcnJ1cHRzICovCisJd3JpdGVfbXNhX2Nzcihtc2Fjc3IgJiB+TVNBX0NTUl9DQVVTRUYpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKwogCWRpZV9pZl9rZXJuZWwoImRvX21zYV9mcGUgaW52b2tlZCBmcm9tIGtlcm5lbCBjb250ZXh0ISIsIHJlZ3MpOwogCWZvcmNlX3NpZyhTSUdGUEUsIGN1cnJlbnQpOworb3V0OgogCWV4Y2VwdGlvbl9leGl0KHByZXZfc3RhdGUpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva3ZtL01ha2VmaWxlIGIvYXJjaC9taXBzL2t2bS9NYWtlZmlsZQppbmRleCA0MDFmZTAyLi42MzdlYmJlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva3ZtL01ha2VmaWxlCisrKyBiL2FyY2gvbWlwcy9rdm0vTWFrZWZpbGUKQEAgLTEsMTMgKzEsMTUgQEAKICMgTWFrZWZpbGUgZm9yIEtWTSBzdXBwb3J0IGZvciBNSVBTCiAjCiAKLWNvbW1vbi1vYmpzID0gJChhZGRwcmVmaXggLi4vLi4vLi4vdmlydC9rdm0vLCBrdm1fbWFpbi5vIGNvYWxlc2NlZF9tbWlvLm8pCitjb21tb24tb2Jqcy15ID0gJChhZGRwcmVmaXggLi4vLi4vLi4vdmlydC9rdm0vLCBrdm1fbWFpbi5vIGNvYWxlc2NlZF9tbWlvLm8pCiAKIEVYVFJBX0NGTEFHUyArPSAtSXZpcnQva3ZtIC1JYXJjaC9taXBzL2t2bQogCi1rdm0tb2JqcyA6PSAkKGNvbW1vbi1vYmpzKSBtaXBzLm8gZW11bGF0ZS5vIGxvY29yZS5vIFwKK2NvbW1vbi1vYmpzLSQoQ09ORklHX0NQVV9IQVNfTVNBKSArPSBtc2EubworCitrdm0tb2JqcyA6PSAkKGNvbW1vbi1vYmpzLXkpIG1pcHMubyBlbXVsYXRlLm8gbG9jb3JlLm8gXAogCSAgICBpbnRlcnJ1cHQubyBzdGF0cy5vIGNvbW1wYWdlLm8gXAotCSAgICBkeW50cmFucy5vIHRyYXBfZW11bC5vCisJICAgIGR5bnRyYW5zLm8gdHJhcF9lbXVsLm8gZnB1Lm8KIAogb2JqLSQoQ09ORklHX0tWTSkJKz0ga3ZtLm8KIG9iai15CQkJKz0gY2FsbGJhY2subyB0bGIubwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2t2bS9lbXVsYXRlLmMgYi9hcmNoL21pcHMva3ZtL2VtdWxhdGUuYwppbmRleCBmYjNlOGRmLi42MjMwZjM3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva3ZtL2VtdWxhdGUuYworKysgYi9hcmNoL21pcHMva3ZtL2VtdWxhdGUuYwpAQCAtODg0LDYgKzg4NCw4NCBAQAogCXJldHVybiBFTVVMQVRFX0RPTkU7CiB9CiAKKy8qKgorICoga3ZtX21pcHNfY29uZmlnMV93cm1hc2soKSAtIEZpbmQgbWFzayBvZiB3cml0YWJsZSBiaXRzIGluIGd1ZXN0IENvbmZpZzEKKyAqIEB2Y3B1OglWaXJ0dWFsIENQVS4KKyAqCisgKiBGaW5kcyB0aGUgbWFzayBvZiBiaXRzIHdoaWNoIGFyZSB3cml0YWJsZSBpbiB0aGUgZ3Vlc3QncyBDb25maWcxIENQMAorICogcmVnaXN0ZXIsIGJ5IHVzZXJsYW5kIChjdXJyZW50bHkgcmVhZC1vbmx5IHRvIHRoZSBndWVzdCkuCisgKi8KK3Vuc2lnbmVkIGludCBrdm1fbWlwc19jb25maWcxX3dybWFzayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJLyogUGVybWl0IEZQVSB0byBiZSBwcmVzZW50IGlmIEZQVSBpcyBzdXBwb3J0ZWQgKi8KKwlpZiAoa3ZtX21pcHNfZ3Vlc3RfY2FuX2hhdmVfZnB1KCZ2Y3B1LT5hcmNoKSkKKwkJbWFzayB8PSBNSVBTX0NPTkYxX0ZQOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoga3ZtX21pcHNfY29uZmlnM193cm1hc2soKSAtIEZpbmQgbWFzayBvZiB3cml0YWJsZSBiaXRzIGluIGd1ZXN0IENvbmZpZzMKKyAqIEB2Y3B1OglWaXJ0dWFsIENQVS4KKyAqCisgKiBGaW5kcyB0aGUgbWFzayBvZiBiaXRzIHdoaWNoIGFyZSB3cml0YWJsZSBpbiB0aGUgZ3Vlc3QncyBDb25maWczIENQMAorICogcmVnaXN0ZXIsIGJ5IHVzZXJsYW5kIChjdXJyZW50bHkgcmVhZC1vbmx5IHRvIHRoZSBndWVzdCkuCisgKi8KK3Vuc2lnbmVkIGludCBrdm1fbWlwc19jb25maWczX3dybWFzayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJLyogQ29uZmlnNCBpcyBvcHRpb25hbCAqLworCXVuc2lnbmVkIGludCBtYXNrID0gTUlQU19DT05GX007CisKKwkvKiBQZXJtaXQgTVNBIHRvIGJlIHByZXNlbnQgaWYgTVNBIGlzIHN1cHBvcnRlZCAqLworCWlmIChrdm1fbWlwc19ndWVzdF9jYW5faGF2ZV9tc2EoJnZjcHUtPmFyY2gpKQorCQltYXNrIHw9IE1JUFNfQ09ORjNfTVNBOworCisJcmV0dXJuIG1hc2s7Cit9CisKKy8qKgorICoga3ZtX21pcHNfY29uZmlnNF93cm1hc2soKSAtIEZpbmQgbWFzayBvZiB3cml0YWJsZSBiaXRzIGluIGd1ZXN0IENvbmZpZzQKKyAqIEB2Y3B1OglWaXJ0dWFsIENQVS4KKyAqCisgKiBGaW5kcyB0aGUgbWFzayBvZiBiaXRzIHdoaWNoIGFyZSB3cml0YWJsZSBpbiB0aGUgZ3Vlc3QncyBDb25maWc0IENQMAorICogcmVnaXN0ZXIsIGJ5IHVzZXJsYW5kIChjdXJyZW50bHkgcmVhZC1vbmx5IHRvIHRoZSBndWVzdCkuCisgKi8KK3Vuc2lnbmVkIGludCBrdm1fbWlwc19jb25maWc0X3dybWFzayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJLyogQ29uZmlnNSBpcyBvcHRpb25hbCAqLworCXJldHVybiBNSVBTX0NPTkZfTTsKK30KKworLyoqCisgKiBrdm1fbWlwc19jb25maWc1X3dybWFzaygpIC0gRmluZCBtYXNrIG9mIHdyaXRhYmxlIGJpdHMgaW4gZ3Vlc3QgQ29uZmlnNQorICogQHZjcHU6CVZpcnR1YWwgQ1BVLgorICoKKyAqIEZpbmRzIHRoZSBtYXNrIG9mIGJpdHMgd2hpY2ggYXJlIHdyaXRhYmxlIGluIHRoZSBndWVzdCdzIENvbmZpZzUgQ1AwCisgKiByZWdpc3RlciwgYnkgdGhlIGd1ZXN0IGl0c2VsZi4KKyAqLwordW5zaWduZWQgaW50IGt2bV9taXBzX2NvbmZpZzVfd3JtYXNrKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwkvKiBQZXJtaXQgTVNBRW4gY2hhbmdlcyBpZiBNU0Egc3VwcG9ydGVkIGFuZCBlbmFibGVkICovCisJaWYgKGt2bV9taXBzX2d1ZXN0X2hhc19tc2EoJnZjcHUtPmFyY2gpKQorCQltYXNrIHw9IE1JUFNfQ09ORjVfTVNBRU47CisKKwkvKgorCSAqIFBlcm1pdCBndWVzdCBGUFUgbW9kZSBjaGFuZ2VzIGlmIEZQVSBpcyBlbmFibGVkIGFuZCB0aGUgcmVsZXZhbnQKKwkgKiBmZWF0dXJlIGV4aXN0cyBhY2NvcmRpbmcgdG8gRklSIHJlZ2lzdGVyLgorCSAqLworCWlmIChrdm1fbWlwc19ndWVzdF9oYXNfZnB1KCZ2Y3B1LT5hcmNoKSkgeworCQlpZiAoY3B1X2hhc19mcmUpCisJCQltYXNrIHw9IE1JUFNfQ09ORjVfRlJFOworCQkvKiBXZSBkb24ndCBzdXBwb3J0IFVGUiBvciBVRkUgKi8KKwl9CisKKwlyZXR1cm4gbWFzazsKK30KKwogZW51bSBlbXVsYXRpb25fcmVzdWx0IGt2bV9taXBzX2VtdWxhdGVfQ1AwKHVpbnQzMl90IGluc3QsIHVpbnQzMl90ICpvcGMsCiAJCQkJCSAgIHVpbnQzMl90IGNhdXNlLCBzdHJ1Y3Qga3ZtX3J1biAqcnVuLAogCQkJCQkgICBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC0xMDIxLDE4ICsxMDk5LDExNCBAQAogCQkJCWt2bV9taXBzX3dyaXRlX2NvbXBhcmUodmNwdSwKIAkJCQkJCSAgICAgICB2Y3B1LT5hcmNoLmdwcnNbcnRdKTsKIAkJCX0gZWxzZSBpZiAoKHJkID09IE1JUFNfQ1AwX1NUQVRVUykgJiYgKHNlbCA9PSAwKSkgewotCQkJCWt2bV93cml0ZV9jMF9ndWVzdF9zdGF0dXMoY29wMCwKLQkJCQkJCQkgIHZjcHUtPmFyY2guZ3Byc1tydF0pOworCQkJCXVuc2lnbmVkIGludCBvbGRfdmFsLCB2YWwsIGNoYW5nZTsKKworCQkJCW9sZF92YWwgPSBrdm1fcmVhZF9jMF9ndWVzdF9zdGF0dXMoY29wMCk7CisJCQkJdmFsID0gdmNwdS0+YXJjaC5ncHJzW3J0XTsKKwkJCQljaGFuZ2UgPSB2YWwgXiBvbGRfdmFsOworCisJCQkJLyogTWFrZSBzdXJlIHRoYXQgdGhlIE5NSSBiaXQgaXMgbmV2ZXIgc2V0ICovCisJCQkJdmFsICY9IH5TVDBfTk1JOworCiAJCQkJLyoKLQkJCQkgKiBNYWtlIHN1cmUgdGhhdCBDVTEgYW5kIE5NSSBiaXRzIGFyZQotCQkJCSAqIG5ldmVyIHNldAorCQkJCSAqIERvbid0IGFsbG93IENVMSBvciBGUiB0byBiZSBzZXQgdW5sZXNzIEZQVQorCQkJCSAqIGNhcGFiaWxpdHkgZW5hYmxlZCBhbmQgZXhpc3RzIGluIGd1ZXN0CisJCQkJICogY29uZmlndXJhdGlvbi4KIAkJCQkgKi8KLQkJCQlrdm1fY2xlYXJfYzBfZ3Vlc3Rfc3RhdHVzKGNvcDAsCi0JCQkJCQkJICAoU1QwX0NVMSB8IFNUMF9OTUkpKTsKKwkJCQlpZiAoIWt2bV9taXBzX2d1ZXN0X2hhc19mcHUoJnZjcHUtPmFyY2gpKQorCQkJCQl2YWwgJj0gfihTVDBfQ1UxIHwgU1QwX0ZSKTsKKworCQkJCS8qCisJCQkJICogQWxzbyBkb24ndCBhbGxvdyBGUiB0byBiZSBzZXQgaWYgaG9zdCBkb2Vzbid0CisJCQkJICogc3VwcG9ydCBpdC4KKwkJCQkgKi8KKwkJCQlpZiAoIShjdXJyZW50X2NwdV9kYXRhLmZwdV9pZCAmIE1JUFNfRlBJUl9GNjQpKQorCQkJCQl2YWwgJj0gflNUMF9GUjsKKworCisJCQkJLyogSGFuZGxlIGNoYW5nZXMgaW4gRlBVIG1vZGUgKi8KKwkJCQlwcmVlbXB0X2Rpc2FibGUoKTsKKworCQkJCS8qCisJCQkJICogRlBVIGFuZCBWZWN0b3IgcmVnaXN0ZXIgc3RhdGUgaXMgbWFkZQorCQkJCSAqIFVOUFJFRElDVEFCTEUgYnkgYSBjaGFuZ2Ugb2YgRlIsIHNvIGRvbid0CisJCQkJICogZXZlbiBib3RoZXIgc2F2aW5nIGl0LgorCQkJCSAqLworCQkJCWlmIChjaGFuZ2UgJiBTVDBfRlIpCisJCQkJCWt2bV9kcm9wX2ZwdSh2Y3B1KTsKKworCQkJCS8qCisJCQkJICogSWYgTVNBIHN0YXRlIGlzIGFscmVhZHkgbGl2ZSwgaXQgaXMgdW5kZWZpbmVkCisJCQkJICogaG93IGl0IGludGVyYWN0cyB3aXRoIEZSPTAgRlBVIHN0YXRlLCBhbmQgd2UKKwkJCQkgKiBkb24ndCB3YW50IHRvIGhpdCByZXNlcnZlZCBpbnN0cnVjdGlvbgorCQkJCSAqIGV4Y2VwdGlvbnMgdHJ5aW5nIHRvIHNhdmUgdGhlIE1TQSBzdGF0ZSBsYXRlcgorCQkJCSAqIHdoZW4gQ1U9MSAmJiBGUj0xLCBzbyBwbGF5IGl0IHNhZmUgYW5kIHNhdmUKKwkJCQkgKiBpdCBmaXJzdC4KKwkJCQkgKi8KKwkJCQlpZiAoY2hhbmdlICYgU1QwX0NVMSAmJiAhKHZhbCAmIFNUMF9GUikgJiYKKwkJCQkgICAgdmNwdS0+YXJjaC5mcHVfaW51c2UgJiBLVk1fTUlQU19GUFVfTVNBKQorCQkJCQlrdm1fbG9zZV9mcHUodmNwdSk7CisKKwkJCQkvKgorCQkJCSAqIFByb3BhZ2F0ZSBDVTEgKEZQVSBlbmFibGUpIGNoYW5nZXMKKwkJCQkgKiBpbW1lZGlhdGVseSBpZiB0aGUgRlBVIGNvbnRleHQgaXMgYWxyZWFkeQorCQkJCSAqIGxvYWRlZC4gV2hlbiBkaXNhYmxpbmcgd2UgbGVhdmUgdGhlIGNvbnRleHQKKwkJCQkgKiBsb2FkZWQgc28gaXQgY2FuIGJlIHF1aWNrbHkgZW5hYmxlZCBhZ2FpbiBpbgorCQkJCSAqIHRoZSBuZWFyIGZ1dHVyZS4KKwkJCQkgKi8KKwkJCQlpZiAoY2hhbmdlICYgU1QwX0NVMSAmJgorCQkJCSAgICB2Y3B1LT5hcmNoLmZwdV9pbnVzZSAmIEtWTV9NSVBTX0ZQVV9GUFUpCisJCQkJCWNoYW5nZV9jMF9zdGF0dXMoU1QwX0NVMSwgdmFsKTsKKworCQkJCXByZWVtcHRfZW5hYmxlKCk7CisKKwkJCQlrdm1fd3JpdGVfYzBfZ3Vlc3Rfc3RhdHVzKGNvcDAsIHZhbCk7CiAKICNpZmRlZiBDT05GSUdfS1ZNX01JUFNfRFlOX1RSQU5TCi0JCQkJa3ZtX21pcHNfdHJhbnNfbXRjMChpbnN0LCBvcGMsIHZjcHUpOworCQkJCS8qCisJCQkJICogSWYgRlBVIHByZXNlbnQsIHdlIG5lZWQgQ1UxL0ZSIGJpdHMgdG8gdGFrZQorCQkJCSAqIGVmZmVjdCBmYWlybHkgc29vbi4KKwkJCQkgKi8KKwkJCQlpZiAoIWt2bV9taXBzX2d1ZXN0X2hhc19mcHUoJnZjcHUtPmFyY2gpKQorCQkJCQlrdm1fbWlwc190cmFuc19tdGMwKGluc3QsIG9wYywgdmNwdSk7CiAjZW5kaWYKKwkJCX0gZWxzZSBpZiAoKHJkID09IE1JUFNfQ1AwX0NPTkZJRykgJiYgKHNlbCA9PSA1KSkgeworCQkJCXVuc2lnbmVkIGludCBvbGRfdmFsLCB2YWwsIGNoYW5nZSwgd3JtYXNrOworCisJCQkJb2xkX3ZhbCA9IGt2bV9yZWFkX2MwX2d1ZXN0X2NvbmZpZzUoY29wMCk7CisJCQkJdmFsID0gdmNwdS0+YXJjaC5ncHJzW3J0XTsKKworCQkJCS8qIE9ubHkgYSBmZXcgYml0cyBhcmUgd3JpdGFibGUgaW4gQ29uZmlnNSAqLworCQkJCXdybWFzayA9IGt2bV9taXBzX2NvbmZpZzVfd3JtYXNrKHZjcHUpOworCQkJCWNoYW5nZSA9ICh2YWwgXiBvbGRfdmFsKSAmIHdybWFzazsKKwkJCQl2YWwgPSBvbGRfdmFsIF4gY2hhbmdlOworCisKKwkJCQkvKiBIYW5kbGUgY2hhbmdlcyBpbiBGUFUvTVNBIG1vZGVzICovCisJCQkJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwkJCQkvKgorCQkJCSAqIFByb3BhZ2F0ZSBGUkUgY2hhbmdlcyBpbW1lZGlhdGVseSBpZiB0aGUgRlBVCisJCQkJICogY29udGV4dCBpcyBhbHJlYWR5IGxvYWRlZC4KKwkJCQkgKi8KKwkJCQlpZiAoY2hhbmdlICYgTUlQU19DT05GNV9GUkUgJiYKKwkJCQkgICAgdmNwdS0+YXJjaC5mcHVfaW51c2UgJiBLVk1fTUlQU19GUFVfRlBVKQorCQkJCQljaGFuZ2VfYzBfY29uZmlnNShNSVBTX0NPTkY1X0ZSRSwgdmFsKTsKKworCQkJCS8qCisJCQkJICogUHJvcGFnYXRlIE1TQUVuIGNoYW5nZXMgaW1tZWRpYXRlbHkgaWYgdGhlCisJCQkJICogTVNBIGNvbnRleHQgaXMgYWxyZWFkeSBsb2FkZWQuIFdoZW4gZGlzYWJsaW5nCisJCQkJICogd2UgbGVhdmUgdGhlIGNvbnRleHQgbG9hZGVkIHNvIGl0IGNhbiBiZQorCQkJCSAqIHF1aWNrbHkgZW5hYmxlZCBhZ2FpbiBpbiB0aGUgbmVhciBmdXR1cmUuCisJCQkJICovCisJCQkJaWYgKGNoYW5nZSAmIE1JUFNfQ09ORjVfTVNBRU4gJiYKKwkJCQkgICAgdmNwdS0+YXJjaC5mcHVfaW51c2UgJiBLVk1fTUlQU19GUFVfTVNBKQorCQkJCQljaGFuZ2VfYzBfY29uZmlnNShNSVBTX0NPTkY1X01TQUVOLAorCQkJCQkJCSAgdmFsKTsKKworCQkJCXByZWVtcHRfZW5hYmxlKCk7CisKKwkJCQlrdm1fd3JpdGVfYzBfZ3Vlc3RfY29uZmlnNShjb3AwLCB2YWwpOwogCQkJfSBlbHNlIGlmICgocmQgPT0gTUlQU19DUDBfQ0FVU0UpICYmIChzZWwgPT0gMCkpIHsKIAkJCQl1aW50MzJfdCBvbGRfY2F1c2UsIG5ld19jYXVzZTsKIApAQCAtMTk3MCw2ICsyMTQ0LDE0NiBAQAogCXJldHVybiBlcjsKIH0KIAorZW51bSBlbXVsYXRpb25fcmVzdWx0IGt2bV9taXBzX2VtdWxhdGVfdHJhcF9leGModW5zaWduZWQgbG9uZyBjYXVzZSwKKwkJCQkJCXVpbnQzMl90ICpvcGMsCisJCQkJCQlzdHJ1Y3Qga3ZtX3J1biAqcnVuLAorCQkJCQkJc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBtaXBzX2NvcHJvYyAqY29wMCA9IHZjcHUtPmFyY2guY29wMDsKKwlzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCAqYXJjaCA9ICZ2Y3B1LT5hcmNoOworCWVudW0gZW11bGF0aW9uX3Jlc3VsdCBlciA9IEVNVUxBVEVfRE9ORTsKKworCWlmICgoa3ZtX3JlYWRfYzBfZ3Vlc3Rfc3RhdHVzKGNvcDApICYgU1QwX0VYTCkgPT0gMCkgeworCQkvKiBzYXZlIG9sZCBwYyAqLworCQlrdm1fd3JpdGVfYzBfZ3Vlc3RfZXBjKGNvcDAsIGFyY2gtPnBjKTsKKwkJa3ZtX3NldF9jMF9ndWVzdF9zdGF0dXMoY29wMCwgU1QwX0VYTCk7CisKKwkJaWYgKGNhdXNlICYgQ0FVU0VGX0JEKQorCQkJa3ZtX3NldF9jMF9ndWVzdF9jYXVzZShjb3AwLCBDQVVTRUZfQkQpOworCQllbHNlCisJCQlrdm1fY2xlYXJfYzBfZ3Vlc3RfY2F1c2UoY29wMCwgQ0FVU0VGX0JEKTsKKworCQlrdm1fZGVidWcoIkRlbGl2ZXJpbmcgVFJBUCBAIHBjICUjbHhcbiIsIGFyY2gtPnBjKTsKKworCQlrdm1fY2hhbmdlX2MwX2d1ZXN0X2NhdXNlKGNvcDAsICgweGZmKSwKKwkJCQkJICAoVF9UUkFQIDw8IENBVVNFQl9FWENDT0RFKSk7CisKKwkJLyogU2V0IFBDIHRvIHRoZSBleGNlcHRpb24gZW50cnkgcG9pbnQgKi8KKwkJYXJjaC0+cGMgPSBLVk1fR1VFU1RfS1NFRzAgKyAweDE4MDsKKworCX0gZWxzZSB7CisJCWt2bV9lcnIoIlRyeWluZyB0byBkZWxpdmVyIFRSQVAgd2hlbiBFWEwgaXMgYWxyZWFkeSBzZXRcbiIpOworCQllciA9IEVNVUxBVEVfRkFJTDsKKwl9CisKKwlyZXR1cm4gZXI7Cit9CisKK2VudW0gZW11bGF0aW9uX3Jlc3VsdCBrdm1fbWlwc19lbXVsYXRlX21zYWZwZV9leGModW5zaWduZWQgbG9uZyBjYXVzZSwKKwkJCQkJCSAgdWludDMyX3QgKm9wYywKKwkJCQkJCSAgc3RydWN0IGt2bV9ydW4gKnJ1biwKKwkJCQkJCSAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBtaXBzX2NvcHJvYyAqY29wMCA9IHZjcHUtPmFyY2guY29wMDsKKwlzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCAqYXJjaCA9ICZ2Y3B1LT5hcmNoOworCWVudW0gZW11bGF0aW9uX3Jlc3VsdCBlciA9IEVNVUxBVEVfRE9ORTsKKworCWlmICgoa3ZtX3JlYWRfYzBfZ3Vlc3Rfc3RhdHVzKGNvcDApICYgU1QwX0VYTCkgPT0gMCkgeworCQkvKiBzYXZlIG9sZCBwYyAqLworCQlrdm1fd3JpdGVfYzBfZ3Vlc3RfZXBjKGNvcDAsIGFyY2gtPnBjKTsKKwkJa3ZtX3NldF9jMF9ndWVzdF9zdGF0dXMoY29wMCwgU1QwX0VYTCk7CisKKwkJaWYgKGNhdXNlICYgQ0FVU0VGX0JEKQorCQkJa3ZtX3NldF9jMF9ndWVzdF9jYXVzZShjb3AwLCBDQVVTRUZfQkQpOworCQllbHNlCisJCQlrdm1fY2xlYXJfYzBfZ3Vlc3RfY2F1c2UoY29wMCwgQ0FVU0VGX0JEKTsKKworCQlrdm1fZGVidWcoIkRlbGl2ZXJpbmcgTVNBRlBFIEAgcGMgJSNseFxuIiwgYXJjaC0+cGMpOworCisJCWt2bV9jaGFuZ2VfYzBfZ3Vlc3RfY2F1c2UoY29wMCwgKDB4ZmYpLAorCQkJCQkgIChUX01TQUZQRSA8PCBDQVVTRUJfRVhDQ09ERSkpOworCisJCS8qIFNldCBQQyB0byB0aGUgZXhjZXB0aW9uIGVudHJ5IHBvaW50ICovCisJCWFyY2gtPnBjID0gS1ZNX0dVRVNUX0tTRUcwICsgMHgxODA7CisKKwl9IGVsc2UgeworCQlrdm1fZXJyKCJUcnlpbmcgdG8gZGVsaXZlciBNU0FGUEUgd2hlbiBFWEwgaXMgYWxyZWFkeSBzZXRcbiIpOworCQllciA9IEVNVUxBVEVfRkFJTDsKKwl9CisKKwlyZXR1cm4gZXI7Cit9CisKK2VudW0gZW11bGF0aW9uX3Jlc3VsdCBrdm1fbWlwc19lbXVsYXRlX2ZwZV9leGModW5zaWduZWQgbG9uZyBjYXVzZSwKKwkJCQkJICAgICAgIHVpbnQzMl90ICpvcGMsCisJCQkJCSAgICAgICBzdHJ1Y3Qga3ZtX3J1biAqcnVuLAorCQkJCQkgICAgICAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBtaXBzX2NvcHJvYyAqY29wMCA9IHZjcHUtPmFyY2guY29wMDsKKwlzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCAqYXJjaCA9ICZ2Y3B1LT5hcmNoOworCWVudW0gZW11bGF0aW9uX3Jlc3VsdCBlciA9IEVNVUxBVEVfRE9ORTsKKworCWlmICgoa3ZtX3JlYWRfYzBfZ3Vlc3Rfc3RhdHVzKGNvcDApICYgU1QwX0VYTCkgPT0gMCkgeworCQkvKiBzYXZlIG9sZCBwYyAqLworCQlrdm1fd3JpdGVfYzBfZ3Vlc3RfZXBjKGNvcDAsIGFyY2gtPnBjKTsKKwkJa3ZtX3NldF9jMF9ndWVzdF9zdGF0dXMoY29wMCwgU1QwX0VYTCk7CisKKwkJaWYgKGNhdXNlICYgQ0FVU0VGX0JEKQorCQkJa3ZtX3NldF9jMF9ndWVzdF9jYXVzZShjb3AwLCBDQVVTRUZfQkQpOworCQllbHNlCisJCQlrdm1fY2xlYXJfYzBfZ3Vlc3RfY2F1c2UoY29wMCwgQ0FVU0VGX0JEKTsKKworCQlrdm1fZGVidWcoIkRlbGl2ZXJpbmcgRlBFIEAgcGMgJSNseFxuIiwgYXJjaC0+cGMpOworCisJCWt2bV9jaGFuZ2VfYzBfZ3Vlc3RfY2F1c2UoY29wMCwgKDB4ZmYpLAorCQkJCQkgIChUX0ZQRSA8PCBDQVVTRUJfRVhDQ09ERSkpOworCisJCS8qIFNldCBQQyB0byB0aGUgZXhjZXB0aW9uIGVudHJ5IHBvaW50ICovCisJCWFyY2gtPnBjID0gS1ZNX0dVRVNUX0tTRUcwICsgMHgxODA7CisKKwl9IGVsc2UgeworCQlrdm1fZXJyKCJUcnlpbmcgdG8gZGVsaXZlciBGUEUgd2hlbiBFWEwgaXMgYWxyZWFkeSBzZXRcbiIpOworCQllciA9IEVNVUxBVEVfRkFJTDsKKwl9CisKKwlyZXR1cm4gZXI7Cit9CisKK2VudW0gZW11bGF0aW9uX3Jlc3VsdCBrdm1fbWlwc19lbXVsYXRlX21zYWRpc19leGModW5zaWduZWQgbG9uZyBjYXVzZSwKKwkJCQkJCSAgdWludDMyX3QgKm9wYywKKwkJCQkJCSAgc3RydWN0IGt2bV9ydW4gKnJ1biwKKwkJCQkJCSAgc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBtaXBzX2NvcHJvYyAqY29wMCA9IHZjcHUtPmFyY2guY29wMDsKKwlzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCAqYXJjaCA9ICZ2Y3B1LT5hcmNoOworCWVudW0gZW11bGF0aW9uX3Jlc3VsdCBlciA9IEVNVUxBVEVfRE9ORTsKKworCWlmICgoa3ZtX3JlYWRfYzBfZ3Vlc3Rfc3RhdHVzKGNvcDApICYgU1QwX0VYTCkgPT0gMCkgeworCQkvKiBzYXZlIG9sZCBwYyAqLworCQlrdm1fd3JpdGVfYzBfZ3Vlc3RfZXBjKGNvcDAsIGFyY2gtPnBjKTsKKwkJa3ZtX3NldF9jMF9ndWVzdF9zdGF0dXMoY29wMCwgU1QwX0VYTCk7CisKKwkJaWYgKGNhdXNlICYgQ0FVU0VGX0JEKQorCQkJa3ZtX3NldF9jMF9ndWVzdF9jYXVzZShjb3AwLCBDQVVTRUZfQkQpOworCQllbHNlCisJCQlrdm1fY2xlYXJfYzBfZ3Vlc3RfY2F1c2UoY29wMCwgQ0FVU0VGX0JEKTsKKworCQlrdm1fZGVidWcoIkRlbGl2ZXJpbmcgTVNBRElTIEAgcGMgJSNseFxuIiwgYXJjaC0+cGMpOworCisJCWt2bV9jaGFuZ2VfYzBfZ3Vlc3RfY2F1c2UoY29wMCwgKDB4ZmYpLAorCQkJCQkgIChUX01TQURJUyA8PCBDQVVTRUJfRVhDQ09ERSkpOworCisJCS8qIFNldCBQQyB0byB0aGUgZXhjZXB0aW9uIGVudHJ5IHBvaW50ICovCisJCWFyY2gtPnBjID0gS1ZNX0dVRVNUX0tTRUcwICsgMHgxODA7CisKKwl9IGVsc2UgeworCQlrdm1fZXJyKCJUcnlpbmcgdG8gZGVsaXZlciBNU0FESVMgd2hlbiBFWEwgaXMgYWxyZWFkeSBzZXRcbiIpOworCQllciA9IEVNVUxBVEVfRkFJTDsKKwl9CisKKwlyZXR1cm4gZXI7Cit9CisKIC8qIGxsL3NjLCByZGh3ciwgc3luYyBlbXVsYXRpb24gKi8KIAogI2RlZmluZSBPUENPREUgMHhmYzAwMDAwMApAQCAtMjE3Niw2ICsyNDkwLDEwIEBACiAJCWNhc2UgVF9TWVNDQUxMOgogCQljYXNlIFRfQlJFQUs6CiAJCWNhc2UgVF9SRVNfSU5TVDoKKwkJY2FzZSBUX1RSQVA6CisJCWNhc2UgVF9NU0FGUEU6CisJCWNhc2UgVF9GUEU6CisJCWNhc2UgVF9NU0FESVM6CiAJCQlicmVhazsKIAogCQljYXNlIFRfQ09QX1VOVVNBQkxFOgpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2t2bS9mcHUuUyBiL2FyY2gvbWlwcy9rdm0vZnB1LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxZmJmNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9rdm0vZnB1LlMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBGUFUgY29udGV4dCBoYW5kbGluZyBjb2RlIGZvciBLVk0uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCisgKi8KKworI2luY2x1ZGUgPGFzbS9hc20uaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vZnByZWdkZWYuaD4KKyNpbmNsdWRlIDxhc20vbWlwc3JlZ3MuaD4KKyNpbmNsdWRlIDxhc20vcmVnZGVmLmg+CisKKwkuc2V0CW5vcmVvcmRlcgorCS5zZXQJbm9hdAorCitMRUFGKF9fa3ZtX3NhdmVfZnB1KQorCS5zZXQJcHVzaAorCS5zZXQJbWlwczY0cjIKKwlTRVRfSEFSREZMT0FUCisJbWZjMAl0MCwgQ1AwX1NUQVRVUworCXNsbCAgICAgdDAsIHQwLCA1CQkJIyBpcyBTdGF0dXMuRlIgc2V0PworCWJnZXogICAgdDAsIDFmCQkJCSMgbm86IHNraXAgb2RkIGRvdWJsZXMKKwkgbm9wCisJc2RjMQkkZjEsICBWQ1BVX0ZQUjEoYTApCisJc2RjMQkkZjMsICBWQ1BVX0ZQUjMoYTApCisJc2RjMQkkZjUsICBWQ1BVX0ZQUjUoYTApCisJc2RjMQkkZjcsICBWQ1BVX0ZQUjcoYTApCisJc2RjMQkkZjksICBWQ1BVX0ZQUjkoYTApCisJc2RjMQkkZjExLCBWQ1BVX0ZQUjExKGEwKQorCXNkYzEJJGYxMywgVkNQVV9GUFIxMyhhMCkKKwlzZGMxCSRmMTUsIFZDUFVfRlBSMTUoYTApCisJc2RjMQkkZjE3LCBWQ1BVX0ZQUjE3KGEwKQorCXNkYzEJJGYxOSwgVkNQVV9GUFIxOShhMCkKKwlzZGMxCSRmMjEsIFZDUFVfRlBSMjEoYTApCisJc2RjMQkkZjIzLCBWQ1BVX0ZQUjIzKGEwKQorCXNkYzEJJGYyNSwgVkNQVV9GUFIyNShhMCkKKwlzZGMxCSRmMjcsIFZDUFVfRlBSMjcoYTApCisJc2RjMQkkZjI5LCBWQ1BVX0ZQUjI5KGEwKQorCXNkYzEJJGYzMSwgVkNQVV9GUFIzMShhMCkKKzE6CXNkYzEJJGYwLCAgVkNQVV9GUFIwKGEwKQorCXNkYzEJJGYyLCAgVkNQVV9GUFIyKGEwKQorCXNkYzEJJGY0LCAgVkNQVV9GUFI0KGEwKQorCXNkYzEJJGY2LCAgVkNQVV9GUFI2KGEwKQorCXNkYzEJJGY4LCAgVkNQVV9GUFI4KGEwKQorCXNkYzEJJGYxMCwgVkNQVV9GUFIxMChhMCkKKwlzZGMxCSRmMTIsIFZDUFVfRlBSMTIoYTApCisJc2RjMQkkZjE0LCBWQ1BVX0ZQUjE0KGEwKQorCXNkYzEJJGYxNiwgVkNQVV9GUFIxNihhMCkKKwlzZGMxCSRmMTgsIFZDUFVfRlBSMTgoYTApCisJc2RjMQkkZjIwLCBWQ1BVX0ZQUjIwKGEwKQorCXNkYzEJJGYyMiwgVkNQVV9GUFIyMihhMCkKKwlzZGMxCSRmMjQsIFZDUFVfRlBSMjQoYTApCisJc2RjMQkkZjI2LCBWQ1BVX0ZQUjI2KGEwKQorCXNkYzEJJGYyOCwgVkNQVV9GUFIyOChhMCkKKwlqcglyYQorCSBzZGMxCSRmMzAsIFZDUFVfRlBSMzAoYTApCisJLnNldAlwb3AKKwlFTkQoX19rdm1fc2F2ZV9mcHUpCisKK0xFQUYoX19rdm1fcmVzdG9yZV9mcHUpCisJLnNldAlwdXNoCisJLnNldAltaXBzNjRyMgorCVNFVF9IQVJERkxPQVQKKwltZmMwCXQwLCBDUDBfU1RBVFVTCisJc2xsICAgICB0MCwgdDAsIDUJCQkjIGlzIFN0YXR1cy5GUiBzZXQ/CisJYmdleiAgICB0MCwgMWYJCQkJIyBubzogc2tpcCBvZGQgZG91YmxlcworCSBub3AKKwlsZGMxCSRmMSwgIFZDUFVfRlBSMShhMCkKKwlsZGMxCSRmMywgIFZDUFVfRlBSMyhhMCkKKwlsZGMxCSRmNSwgIFZDUFVfRlBSNShhMCkKKwlsZGMxCSRmNywgIFZDUFVfRlBSNyhhMCkKKwlsZGMxCSRmOSwgIFZDUFVfRlBSOShhMCkKKwlsZGMxCSRmMTEsIFZDUFVfRlBSMTEoYTApCisJbGRjMQkkZjEzLCBWQ1BVX0ZQUjEzKGEwKQorCWxkYzEJJGYxNSwgVkNQVV9GUFIxNShhMCkKKwlsZGMxCSRmMTcsIFZDUFVfRlBSMTcoYTApCisJbGRjMQkkZjE5LCBWQ1BVX0ZQUjE5KGEwKQorCWxkYzEJJGYyMSwgVkNQVV9GUFIyMShhMCkKKwlsZGMxCSRmMjMsIFZDUFVfRlBSMjMoYTApCisJbGRjMQkkZjI1LCBWQ1BVX0ZQUjI1KGEwKQorCWxkYzEJJGYyNywgVkNQVV9GUFIyNyhhMCkKKwlsZGMxCSRmMjksIFZDUFVfRlBSMjkoYTApCisJbGRjMQkkZjMxLCBWQ1BVX0ZQUjMxKGEwKQorMToJbGRjMQkkZjAsICBWQ1BVX0ZQUjAoYTApCisJbGRjMQkkZjIsICBWQ1BVX0ZQUjIoYTApCisJbGRjMQkkZjQsICBWQ1BVX0ZQUjQoYTApCisJbGRjMQkkZjYsICBWQ1BVX0ZQUjYoYTApCisJbGRjMQkkZjgsICBWQ1BVX0ZQUjgoYTApCisJbGRjMQkkZjEwLCBWQ1BVX0ZQUjEwKGEwKQorCWxkYzEJJGYxMiwgVkNQVV9GUFIxMihhMCkKKwlsZGMxCSRmMTQsIFZDUFVfRlBSMTQoYTApCisJbGRjMQkkZjE2LCBWQ1BVX0ZQUjE2KGEwKQorCWxkYzEJJGYxOCwgVkNQVV9GUFIxOChhMCkKKwlsZGMxCSRmMjAsIFZDUFVfRlBSMjAoYTApCisJbGRjMQkkZjIyLCBWQ1BVX0ZQUjIyKGEwKQorCWxkYzEJJGYyNCwgVkNQVV9GUFIyNChhMCkKKwlsZGMxCSRmMjYsIFZDUFVfRlBSMjYoYTApCisJbGRjMQkkZjI4LCBWQ1BVX0ZQUjI4KGEwKQorCWpyCXJhCisJIGxkYzEJJGYzMCwgVkNQVV9GUFIzMChhMCkKKwkuc2V0CXBvcAorCUVORChfX2t2bV9yZXN0b3JlX2ZwdSkKKworTEVBRihfX2t2bV9yZXN0b3JlX2Zjc3IpCisJLnNldAlwdXNoCisJU0VUX0hBUkRGTE9BVAorCWx3CXQwLCBWQ1BVX0ZDUjMxKGEwKQorCS8qCisJICogVGhlIGN0YzEgbXVzdCBzdGF5IGF0IHRoaXMgb2Zmc2V0IGluIF9fa3ZtX3Jlc3RvcmVfZmNzci4KKwkgKiBTZWUga3ZtX21pcHNfY3NyX2RpZV9ub3RpZnkoKSB3aGljaCBoYW5kbGVzIHQwIGNvbnRhaW5pbmcgYSB2YWx1ZQorCSAqIHdoaWNoIHRyaWdnZXJzIGFuIEZQIEV4Y2VwdGlvbiwgd2hpY2ggbXVzdCBiZSBzdGVwcGVkIG92ZXIgYW5kCisJICogaWdub3JlZCBzaW5jZSB0aGUgc2V0IGNhdXNlIGJpdHMgbXVzdCByZW1haW4gdGhlcmUgZm9yIHRoZSBndWVzdC4KKwkgKi8KKwljdGMxCXQwLCBmY3IzMQorCWpyCXJhCisJIG5vcAorCS5zZXQJcG9wCisJRU5EKF9fa3ZtX3Jlc3RvcmVfZmNzcikKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rdm0vbG9jb3JlLlMgYi9hcmNoL21pcHMva3ZtL2xvY29yZS5TCmluZGV4IDRhNjhiMTcuLmM1NjcyNDAgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rdm0vbG9jb3JlLlMKKysrIGIvYXJjaC9taXBzL2t2bS9sb2NvcmUuUwpAQCAtMzYsNiArMzYsOCBAQAogI2RlZmluZSBQVF9IT1NUX1VTRVJMT0NBTCAgIFBUX0VQQwogCiAjZGVmaW5lIENQMF9EREFUQV9MTyAgICAgICAgJDI4LDMKKyNkZWZpbmUgQ1AwX0NPTkZJRzMgICAgICAgICAkMTYsMworI2RlZmluZSBDUDBfQ09ORklHNSAgICAgICAgICQxNiw1CiAjZGVmaW5lIENQMF9FQkFTRSAgICAgICAgICAgJDE1LDEKIAogI2RlZmluZSBDUDBfSU5UQ1RMICAgICAgICAgICQxMiwxCkBAIC0zNTMsNiArMzU1LDQyIEBACiAJTE9OR19MCWswLCBWQ1BVX0hPU1RfRUJBU0UoazEpCiAJbXRjMAlrMCxDUDBfRUJBU0UKIAorCS8qCisJICogSWYgRlBVIGlzIGVuYWJsZWQsIHNhdmUgRkNSMzEgYW5kIGNsZWFyIGl0IHNvIHRoYXQgbGF0ZXIgY3RjMSdzIGRvbid0CisJICogdHJpZ2dlciBGUEUgZm9yIHBlbmRpbmcgZXhjZXB0aW9ucy4KKwkgKi8KKwkuc2V0CWF0CisJYW5kCXYxLCB2MCwgU1QwX0NVMQorCWJlcXoJdjEsIDFmCisJIG5vcAorCS5zZXQJcHVzaAorCVNFVF9IQVJERkxPQVQKKwljZmMxCXQwLCBmY3IzMQorCXN3CXQwLCBWQ1BVX0ZDUjMxKGsxKQorCWN0YzEJemVybyxmY3IzMQorCS5zZXQJcG9wCisJLnNldAlub2F0CisxOgorCisjaWZkZWYgQ09ORklHX0NQVV9IQVNfTVNBCisJLyoKKwkgKiBJZiBNU0EgaXMgZW5hYmxlZCwgc2F2ZSBNU0FDU1IgYW5kIGNsZWFyIGl0IHNvIHRoYXQgbGF0ZXIKKwkgKiBpbnN0cnVjdGlvbnMgZG9uJ3QgdHJpZ2dlciBNU0FGUEUgZm9yIHBlbmRpbmcgZXhjZXB0aW9ucy4KKwkgKi8KKwltZmMwCXQwLCBDUDBfQ09ORklHMworCWV4dAl0MCwgdDAsIDI4LCAxIC8qIE1JUFNfQ09ORjNfTVNBUCAqLworCWJlcXoJdDAsIDFmCisJIG5vcAorCW1mYzAJdDAsIENQMF9DT05GSUc1CisJZXh0CXQwLCB0MCwgMjcsIDEgLyogTUlQU19DT05GNV9NU0FFTiAqLworCWJlcXoJdDAsIDFmCisJIG5vcAorCV9jZmNtc2EJdDAsIE1TQV9DU1IKKwlzdwl0MCwgVkNQVV9NU0FfQ1NSKGsxKQorCV9jdGNtc2EJTVNBX0NTUiwgemVybworMToKKyNlbmRpZgorCiAJLyogTm93IHRoYXQgdGhlIG5ldyBFQkFTRSBoYXMgYmVlbiBsb2FkZWQsIHVuc2V0IEJFViBhbmQgS1NVX1VTRVIgKi8KIAkuc2V0CWF0CiAJYW5kCXYwLCB2MCwgfihTVDBfRVhMIHwgS1NVX1VTRVIgfCBTVDBfSUUpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva3ZtL21pcHMuYyBiL2FyY2gvbWlwcy9rdm0vbWlwcy5jCmluZGV4IGM5ZWNjZjUuLmJiNjhlOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rdm0vbWlwcy5jCisrKyBiL2FyY2gvbWlwcy9rdm0vbWlwcy5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpAQCAtNDgsNiArNDksMTAgQEAKIAl7ICJzeXNjYWxsIiwJICBWQ1BVX1NUQVQoc3lzY2FsbF9leGl0cyksCSBLVk1fU1RBVF9WQ1BVIH0sCiAJeyAicmVzdmRfaW5zdCIsCSAgVkNQVV9TVEFUKHJlc3ZkX2luc3RfZXhpdHMpLAkgS1ZNX1NUQVRfVkNQVSB9LAogCXsgImJyZWFrX2luc3QiLAkgIFZDUFVfU1RBVChicmVha19pbnN0X2V4aXRzKSwJIEtWTV9TVEFUX1ZDUFUgfSwKKwl7ICJ0cmFwX2luc3QiLAkgIFZDUFVfU1RBVCh0cmFwX2luc3RfZXhpdHMpLAkgS1ZNX1NUQVRfVkNQVSB9LAorCXsgIm1zYV9mcGUiLAkgIFZDUFVfU1RBVChtc2FfZnBlX2V4aXRzKSwJIEtWTV9TVEFUX1ZDUFUgfSwKKwl7ICJmcGUiLAkgIFZDUFVfU1RBVChmcGVfZXhpdHMpLAkJIEtWTV9TVEFUX1ZDUFUgfSwKKwl7ICJtc2FfZGlzYWJsZWQiLCBWQ1BVX1NUQVQobXNhX2Rpc2FibGVkX2V4aXRzKSwgS1ZNX1NUQVRfVkNQVSB9LAogCXsgImZsdXNoX2RjYWNoZSIsIFZDUFVfU1RBVChmbHVzaF9kY2FjaGVfZXhpdHMpLCBLVk1fU1RBVF9WQ1BVIH0sCiAJeyAiaGFsdF9zdWNjZXNzZnVsX3BvbGwiLCBWQ1BVX1NUQVQoaGFsdF9zdWNjZXNzZnVsX3BvbGwpLCBLVk1fU1RBVF9WQ1BVIH0sCiAJeyAiaGFsdF93YWtldXAiLCAgVkNQVV9TVEFUKGhhbHRfd2FrZXVwKSwJIEtWTV9TVEFUX1ZDUFUgfSwKQEAgLTUwNCwxMCArNTA5LDEzIEBACiAJS1ZNX1JFR19NSVBTX0NQMF9TVEFUVVMsCiAJS1ZNX1JFR19NSVBTX0NQMF9DQVVTRSwKIAlLVk1fUkVHX01JUFNfQ1AwX0VQQywKKwlLVk1fUkVHX01JUFNfQ1AwX1BSSUQsCiAJS1ZNX1JFR19NSVBTX0NQMF9DT05GSUcsCiAJS1ZNX1JFR19NSVBTX0NQMF9DT05GSUcxLAogCUtWTV9SRUdfTUlQU19DUDBfQ09ORklHMiwKIAlLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzMsCisJS1ZNX1JFR19NSVBTX0NQMF9DT05GSUc0LAorCUtWTV9SRUdfTUlQU19DUDBfQ09ORklHNSwKIAlLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzcsCiAJS1ZNX1JFR19NSVBTX0NQMF9FUlJPUkVQQywKIApAQCAtNTIwLDEwICs1MjgsMTQgQEAKIAkJCSAgICBjb25zdCBzdHJ1Y3Qga3ZtX29uZV9yZWcgKnJlZykKIHsKIAlzdHJ1Y3QgbWlwc19jb3Byb2MgKmNvcDAgPSB2Y3B1LT5hcmNoLmNvcDA7CisJc3RydWN0IG1pcHNfZnB1X3N0cnVjdCAqZnB1ID0gJnZjcHUtPmFyY2guZnB1OwogCWludCByZXQ7CiAJczY0IHY7CisJczY0IHZzWzJdOworCXVuc2lnbmVkIGludCBpZHg7CiAKIAlzd2l0Y2ggKHJlZy0+aWQpIHsKKwkvKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzICovCiAJY2FzZSBLVk1fUkVHX01JUFNfUjAgLi4uIEtWTV9SRUdfTUlQU19SMzE6CiAJCXYgPSAobG9uZyl2Y3B1LT5hcmNoLmdwcnNbcmVnLT5pZCAtIEtWTV9SRUdfTUlQU19SMF07CiAJCWJyZWFrOwpAQCAtNTM3LDYgKzU0OSw2NyBAQAogCQl2ID0gKGxvbmcpdmNwdS0+YXJjaC5wYzsKIAkJYnJlYWs7CiAKKwkvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKwljYXNlIEtWTV9SRUdfTUlQU19GUFJfMzIoMCkgLi4uIEtWTV9SRUdfTUlQU19GUFJfMzIoMzEpOgorCQlpZiAoIWt2bV9taXBzX2d1ZXN0X2hhc19mcHUoJnZjcHUtPmFyY2gpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeCA9IHJlZy0+aWQgLSBLVk1fUkVHX01JUFNfRlBSXzMyKDApOworCQkvKiBPZGQgc2luZ2xlcyBpbiB0b3Agb2YgZXZlbiBkb3VibGUgd2hlbiBGUj0wICovCisJCWlmIChrdm1fcmVhZF9jMF9ndWVzdF9zdGF0dXMoY29wMCkgJiBTVDBfRlIpCisJCQl2ID0gZ2V0X2ZwcjMyKCZmcHUtPmZwcltpZHhdLCAwKTsKKwkJZWxzZQorCQkJdiA9IGdldF9mcHIzMigmZnB1LT5mcHJbaWR4ICYgfjFdLCBpZHggJiAxKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX01JUFNfRlBSXzY0KDApIC4uLiBLVk1fUkVHX01JUFNfRlBSXzY0KDMxKToKKwkJaWYgKCFrdm1fbWlwc19ndWVzdF9oYXNfZnB1KCZ2Y3B1LT5hcmNoKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHggPSByZWctPmlkIC0gS1ZNX1JFR19NSVBTX0ZQUl82NCgwKTsKKwkJLyogQ2FuJ3QgYWNjZXNzIG9kZCBkb3VibGVzIGluIEZSPTAgbW9kZSAqLworCQlpZiAoaWR4ICYgMSAmJiAhKGt2bV9yZWFkX2MwX2d1ZXN0X3N0YXR1cyhjb3AwKSAmIFNUMF9GUikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdiA9IGdldF9mcHI2NCgmZnB1LT5mcHJbaWR4XSwgMCk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19NSVBTX0ZDUl9JUjoKKwkJaWYgKCFrdm1fbWlwc19ndWVzdF9oYXNfZnB1KCZ2Y3B1LT5hcmNoKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl2ID0gYm9vdF9jcHVfZGF0YS5mcHVfaWQ7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19NSVBTX0ZDUl9DU1I6CisJCWlmICgha3ZtX21pcHNfZ3Vlc3RfaGFzX2ZwdSgmdmNwdS0+YXJjaCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdiA9IGZwdS0+ZmNyMzE7CisJCWJyZWFrOworCisJLyogTUlQUyBTSU1EIEFyY2hpdGVjdHVyZSAoTVNBKSByZWdpc3RlcnMgKi8KKwljYXNlIEtWTV9SRUdfTUlQU19WRUNfMTI4KDApIC4uLiBLVk1fUkVHX01JUFNfVkVDXzEyOCgzMSk6CisJCWlmICgha3ZtX21pcHNfZ3Vlc3RfaGFzX21zYSgmdmNwdS0+YXJjaCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogQ2FuJ3QgYWNjZXNzIE1TQSByZWdpc3RlcnMgaW4gRlI9MCBtb2RlICovCisJCWlmICghKGt2bV9yZWFkX2MwX2d1ZXN0X3N0YXR1cyhjb3AwKSAmIFNUMF9GUikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWR4ID0gcmVnLT5pZCAtIEtWTV9SRUdfTUlQU19WRUNfMTI4KDApOworI2lmZGVmIENPTkZJR19DUFVfTElUVExFX0VORElBTgorCQkvKiBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0ICovCisJCXZzWzBdID0gZ2V0X2ZwcjY0KCZmcHUtPmZwcltpZHhdLCAwKTsKKwkJdnNbMV0gPSBnZXRfZnByNjQoJmZwdS0+ZnByW2lkeF0sIDEpOworI2Vsc2UKKwkJLyogbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0ICovCisJCXZzWzBdID0gZ2V0X2ZwcjY0KCZmcHUtPmZwcltpZHhdLCAxKTsKKwkJdnNbMV0gPSBnZXRfZnByNjQoJmZwdS0+ZnByW2lkeF0sIDApOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19NSVBTX01TQV9JUjoKKwkJaWYgKCFrdm1fbWlwc19ndWVzdF9oYXNfbXNhKCZ2Y3B1LT5hcmNoKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl2ID0gYm9vdF9jcHVfZGF0YS5tc2FfaWQ7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19NSVBTX01TQV9DU1I6CisJCWlmICgha3ZtX21pcHNfZ3Vlc3RfaGFzX21zYSgmdmNwdS0+YXJjaCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdiA9IGZwdS0+bXNhY3NyOworCQlicmVhazsKKworCS8qIENvLXByb2Nlc3NvciAwIHJlZ2lzdGVycyAqLwogCWNhc2UgS1ZNX1JFR19NSVBTX0NQMF9JTkRFWDoKIAkJdiA9IChsb25nKWt2bV9yZWFkX2MwX2d1ZXN0X2luZGV4KGNvcDApOwogCQlicmVhazsKQEAgLTU3Myw4ICs2NDYsOCBAQAogCWNhc2UgS1ZNX1JFR19NSVBTX0NQMF9FUEM6CiAJCXYgPSAobG9uZylrdm1fcmVhZF9jMF9ndWVzdF9lcGMoY29wMCk7CiAJCWJyZWFrOwotCWNhc2UgS1ZNX1JFR19NSVBTX0NQMF9FUlJPUkVQQzoKLQkJdiA9IChsb25nKWt2bV9yZWFkX2MwX2d1ZXN0X2Vycm9yZXBjKGNvcDApOworCWNhc2UgS1ZNX1JFR19NSVBTX0NQMF9QUklEOgorCQl2ID0gKGxvbmcpa3ZtX3JlYWRfYzBfZ3Vlc3RfcHJpZChjb3AwKTsKIAkJYnJlYWs7CiAJY2FzZSBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzoKIAkJdiA9IChsb25nKWt2bV9yZWFkX2MwX2d1ZXN0X2NvbmZpZyhjb3AwKTsKQEAgLTU4OCw5ICs2NjEsMTggQEAKIAljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHMzoKIAkJdiA9IChsb25nKWt2bV9yZWFkX2MwX2d1ZXN0X2NvbmZpZzMoY29wMCk7CiAJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19NSVBTX0NQMF9DT05GSUc0OgorCQl2ID0gKGxvbmcpa3ZtX3JlYWRfYzBfZ3Vlc3RfY29uZmlnNChjb3AwKTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzU6CisJCXYgPSAobG9uZylrdm1fcmVhZF9jMF9ndWVzdF9jb25maWc1KGNvcDApOworCQlicmVhazsKIAljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHNzoKIAkJdiA9IChsb25nKWt2bV9yZWFkX2MwX2d1ZXN0X2NvbmZpZzcoY29wMCk7CiAJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19NSVBTX0NQMF9FUlJPUkVQQzoKKwkJdiA9IChsb25nKWt2bV9yZWFkX2MwX2d1ZXN0X2Vycm9yZXBjKGNvcDApOworCQlicmVhazsKIAkvKiByZWdpc3RlcnMgdG8gYmUgaGFuZGxlZCBzcGVjaWFsbHkgKi8KIAljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09VTlQ6CiAJY2FzZSBLVk1fUkVHX01JUFNfQ09VTlRfQ1RMOgpAQCAtNjEyLDYgKzY5NCwxMCBAQAogCQl1MzIgdjMyID0gKHUzMil2OwogCiAJCXJldHVybiBwdXRfdXNlcih2MzIsIHVhZGRyMzIpOworCX0gZWxzZSBpZiAoKHJlZy0+aWQgJiBLVk1fUkVHX1NJWkVfTUFTSykgPT0gS1ZNX1JFR19TSVpFX1UxMjgpIHsKKwkJdm9pZCBfX3VzZXIgKnVhZGRyID0gKHZvaWQgX191c2VyICopKGxvbmcpcmVnLT5hZGRyOworCisJCXJldHVybiBjb3B5X3RvX3VzZXIodWFkZHIsIHZzLCAxNik7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNjIxLDcgKzcwNywxMCBAQAogCQkJICAgIGNvbnN0IHN0cnVjdCBrdm1fb25lX3JlZyAqcmVnKQogewogCXN0cnVjdCBtaXBzX2NvcHJvYyAqY29wMCA9IHZjcHUtPmFyY2guY29wMDsKLQl1NjQgdjsKKwlzdHJ1Y3QgbWlwc19mcHVfc3RydWN0ICpmcHUgPSAmdmNwdS0+YXJjaC5mcHU7CisJczY0IHY7CisJczY0IHZzWzJdOworCXVuc2lnbmVkIGludCBpZHg7CiAKIAlpZiAoKHJlZy0+aWQgJiBLVk1fUkVHX1NJWkVfTUFTSykgPT0gS1ZNX1JFR19TSVpFX1U2NCkgewogCQl1NjQgX191c2VyICp1YWRkcjY0ID0gKHU2NCBfX3VzZXIgKikobG9uZylyZWctPmFkZHI7CkBAIC02MzUsMTEgKzcyNCwxNiBAQAogCQlpZiAoZ2V0X3VzZXIodjMyLCB1YWRkcjMyKSAhPSAwKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXYgPSAoczY0KXYzMjsKKwl9IGVsc2UgaWYgKChyZWctPmlkICYgS1ZNX1JFR19TSVpFX01BU0spID09IEtWTV9SRUdfU0laRV9VMTI4KSB7CisJCXZvaWQgX191c2VyICp1YWRkciA9ICh2b2lkIF9fdXNlciAqKShsb25nKXJlZy0+YWRkcjsKKworCQlyZXR1cm4gY29weV9mcm9tX3VzZXIodnMsIHVhZGRyLCAxNik7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc3dpdGNoIChyZWctPmlkKSB7CisJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLwogCWNhc2UgS1ZNX1JFR19NSVBTX1IwOgogCQkvKiBTaWxlbnRseSBpZ25vcmUgcmVxdWVzdHMgdG8gc2V0ICQwICovCiAJCWJyZWFrOwpAQCAtNjU2LDYgKzc1MCw2NCBAQAogCQl2Y3B1LT5hcmNoLnBjID0gdjsKIAkJYnJlYWs7CiAKKwkvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKwljYXNlIEtWTV9SRUdfTUlQU19GUFJfMzIoMCkgLi4uIEtWTV9SRUdfTUlQU19GUFJfMzIoMzEpOgorCQlpZiAoIWt2bV9taXBzX2d1ZXN0X2hhc19mcHUoJnZjcHUtPmFyY2gpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlkeCA9IHJlZy0+aWQgLSBLVk1fUkVHX01JUFNfRlBSXzMyKDApOworCQkvKiBPZGQgc2luZ2xlcyBpbiB0b3Agb2YgZXZlbiBkb3VibGUgd2hlbiBGUj0wICovCisJCWlmIChrdm1fcmVhZF9jMF9ndWVzdF9zdGF0dXMoY29wMCkgJiBTVDBfRlIpCisJCQlzZXRfZnByMzIoJmZwdS0+ZnByW2lkeF0sIDAsIHYpOworCQllbHNlCisJCQlzZXRfZnByMzIoJmZwdS0+ZnByW2lkeCAmIH4xXSwgaWR4ICYgMSwgdik7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19NSVBTX0ZQUl82NCgwKSAuLi4gS1ZNX1JFR19NSVBTX0ZQUl82NCgzMSk6CisJCWlmICgha3ZtX21pcHNfZ3Vlc3RfaGFzX2ZwdSgmdmNwdS0+YXJjaCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWR4ID0gcmVnLT5pZCAtIEtWTV9SRUdfTUlQU19GUFJfNjQoMCk7CisJCS8qIENhbid0IGFjY2VzcyBvZGQgZG91YmxlcyBpbiBGUj0wIG1vZGUgKi8KKwkJaWYgKGlkeCAmIDEgJiYgIShrdm1fcmVhZF9jMF9ndWVzdF9zdGF0dXMoY29wMCkgJiBTVDBfRlIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNldF9mcHI2NCgmZnB1LT5mcHJbaWR4XSwgMCwgdik7CisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19NSVBTX0ZDUl9JUjoKKwkJaWYgKCFrdm1fbWlwc19ndWVzdF9oYXNfZnB1KCZ2Y3B1LT5hcmNoKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKiBSZWFkLW9ubHkgKi8KKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX01JUFNfRkNSX0NTUjoKKwkJaWYgKCFrdm1fbWlwc19ndWVzdF9oYXNfZnB1KCZ2Y3B1LT5hcmNoKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlmcHUtPmZjcjMxID0gdjsKKwkJYnJlYWs7CisKKwkvKiBNSVBTIFNJTUQgQXJjaGl0ZWN0dXJlIChNU0EpIHJlZ2lzdGVycyAqLworCWNhc2UgS1ZNX1JFR19NSVBTX1ZFQ18xMjgoMCkgLi4uIEtWTV9SRUdfTUlQU19WRUNfMTI4KDMxKToKKwkJaWYgKCFrdm1fbWlwc19ndWVzdF9oYXNfbXNhKCZ2Y3B1LT5hcmNoKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZHggPSByZWctPmlkIC0gS1ZNX1JFR19NSVBTX1ZFQ18xMjgoMCk7CisjaWZkZWYgQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOCisJCS8qIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKi8KKwkJc2V0X2ZwcjY0KCZmcHUtPmZwcltpZHhdLCAwLCB2c1swXSk7CisJCXNldF9mcHI2NCgmZnB1LT5mcHJbaWR4XSwgMSwgdnNbMV0pOworI2Vsc2UKKwkJLyogbW9zdCBzaWduaWZpY2FudCBieXRlIGZpcnN0ICovCisJCXNldF9mcHI2NCgmZnB1LT5mcHJbaWR4XSwgMSwgdnNbMF0pOworCQlzZXRfZnByNjQoJmZwdS0+ZnByW2lkeF0sIDAsIHZzWzFdKTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEtWTV9SRUdfTUlQU19NU0FfSVI6CisJCWlmICgha3ZtX21pcHNfZ3Vlc3RfaGFzX21zYSgmdmNwdS0+YXJjaCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogUmVhZC1vbmx5ICovCisJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19NSVBTX01TQV9DU1I6CisJCWlmICgha3ZtX21pcHNfZ3Vlc3RfaGFzX21zYSgmdmNwdS0+YXJjaCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZnB1LT5tc2Fjc3IgPSB2OworCQlicmVhazsKKworCS8qIENvLXByb2Nlc3NvciAwIHJlZ2lzdGVycyAqLwogCWNhc2UgS1ZNX1JFR19NSVBTX0NQMF9JTkRFWDoKIAkJa3ZtX3dyaXRlX2MwX2d1ZXN0X2luZGV4KGNvcDAsIHYpOwogCQlicmVhazsKQEAgLTY4Niw2ICs4MzgsOSBAQAogCWNhc2UgS1ZNX1JFR19NSVBTX0NQMF9FUEM6CiAJCWt2bV93cml0ZV9jMF9ndWVzdF9lcGMoY29wMCwgdik7CiAJCWJyZWFrOworCWNhc2UgS1ZNX1JFR19NSVBTX0NQMF9QUklEOgorCQlrdm1fd3JpdGVfYzBfZ3Vlc3RfcHJpZChjb3AwLCB2KTsKKwkJYnJlYWs7CiAJY2FzZSBLVk1fUkVHX01JUFNfQ1AwX0VSUk9SRVBDOgogCQlrdm1fd3JpdGVfYzBfZ3Vlc3RfZXJyb3JlcGMoY29wMCwgdik7CiAJCWJyZWFrOwpAQCAtNjkzLDYgKzg0OCwxMiBAQAogCWNhc2UgS1ZNX1JFR19NSVBTX0NQMF9DT1VOVDoKIAljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09NUEFSRToKIAljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ0FVU0U6CisJY2FzZSBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzoKKwljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHMToKKwljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHMjoKKwljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHMzoKKwljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHNDoKKwljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHNToKIAljYXNlIEtWTV9SRUdfTUlQU19DT1VOVF9DVEw6CiAJY2FzZSBLVk1fUkVHX01JUFNfQ09VTlRfUkVTVU1FOgogCWNhc2UgS1ZNX1JFR19NSVBTX0NPVU5UX0haOgpAQCAtNzAzLDYgKzg2NCwzMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGt2bV92Y3B1X2lvY3RsX2VuYWJsZV9jYXAoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgICAgc3RydWN0IGt2bV9lbmFibGVfY2FwICpjYXApCit7CisJaW50IHIgPSAwOworCisJaWYgKCFrdm1fdm1faW9jdGxfY2hlY2tfZXh0ZW5zaW9uKHZjcHUtPmt2bSwgY2FwLT5jYXApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY2FwLT5mbGFncykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNhcC0+YXJnc1swXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGNhcC0+Y2FwKSB7CisJY2FzZSBLVk1fQ0FQX01JUFNfRlBVOgorCQl2Y3B1LT5hcmNoLmZwdV9lbmFibGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX01JUFNfTVNBOgorCQl2Y3B1LT5hcmNoLm1zYV9lbmFibGVkID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJciA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByOworfQorCiBsb25nIGt2bV9hcmNoX3ZjcHVfaW9jdGwoc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGludCBpb2N0bCwKIAkJCSB1bnNpZ25lZCBsb25nIGFyZykKIHsKQEAgLTc2MCw2ICs5NDgsMTUgQEAKIAkJCXIgPSBrdm1fdmNwdV9pb2N0bF9pbnRlcnJ1cHQodmNwdSwgJmlycSk7CiAJCQlicmVhazsKIAkJfQorCWNhc2UgS1ZNX0VOQUJMRV9DQVA6IHsKKwkJc3RydWN0IGt2bV9lbmFibGVfY2FwIGNhcDsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZjYXAsIGFyZ3AsIHNpemVvZihjYXApKSkKKwkJCWdvdG8gb3V0OworCQlyID0ga3ZtX3ZjcHVfaW9jdGxfZW5hYmxlX2NhcCh2Y3B1LCAmY2FwKTsKKwkJYnJlYWs7CisJfQogCWRlZmF1bHQ6CiAJCXIgPSAtRU5PSU9DVExDTUQ7CiAJfQpAQCAtODY4LDExICsxMDY1LDMwIEBACiAKIAlzd2l0Y2ggKGV4dCkgewogCWNhc2UgS1ZNX0NBUF9PTkVfUkVHOgorCWNhc2UgS1ZNX0NBUF9FTkFCTEVfQ0FQOgogCQlyID0gMTsKIAkJYnJlYWs7CiAJY2FzZSBLVk1fQ0FQX0NPQUxFU0NFRF9NTUlPOgogCQlyID0gS1ZNX0NPQUxFU0NFRF9NTUlPX1BBR0VfT0ZGU0VUOwogCQlicmVhazsKKwljYXNlIEtWTV9DQVBfTUlQU19GUFU6CisJCXIgPSAhIWNwdV9oYXNfZnB1OworCQlicmVhazsKKwljYXNlIEtWTV9DQVBfTUlQU19NU0E6CisJCS8qCisJCSAqIFdlIGRvbid0IHN1cHBvcnQgTVNBIHZlY3RvciBwYXJ0aXRpb25pbmcgeWV0OgorCQkgKiAxKSBJdCB3b3VsZCByZXF1aXJlIGV4cGxpY2l0IHN1cHBvcnQgd2hpY2ggY2FuJ3QgYmUgdGVzdGVkCisJCSAqICAgIHlldCBkdWUgdG8gbGFjayBvZiBzdXBwb3J0IGluIGN1cnJlbnQgaGFyZHdhcmUuCisJCSAqIDIpIEl0IGV4dGVuZHMgdGhlIHN0YXRlIHRoYXQgd291bGQgbmVlZCB0byBiZSBzYXZlZC9yZXN0b3JlZAorCQkgKiAgICBieSBlLmcuIFFFTVUgZm9yIG1pZ3JhdGlvbi4KKwkJICoKKwkJICogV2hlbiB2ZWN0b3IgcGFydGl0aW9uaW5nIGhhcmR3YXJlIGJlY29tZXMgYXZhaWxhYmxlLCBzdXBwb3J0CisJCSAqIGNvdWxkIGJlIGFkZGVkIGJ5IHJlcXVpcmluZyBhIGZsYWcgd2hlbiBlbmFibGluZworCQkgKiBLVk1fQ0FQX01JUFNfTVNBIGNhcGFiaWxpdHkgdG8gaW5kaWNhdGUgdGhhdCB1c2VybGFuZCBrbm93cworCQkgKiB0byBzYXZlL3Jlc3RvcmUgdGhlIGFwcHJvcHJpYXRlIGV4dHJhIHN0YXRlLgorCQkgKi8KKwkJciA9IGNwdV9oYXNfbXNhICYmICEoYm9vdF9jcHVfZGF0YS5tc2FfaWQgJiBNU0FfSVJfV1JQRik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXIgPSAwOwogCQlicmVhazsKQEAgLTExMTksNiArMTMzNSwzMCBAQAogCQlyZXQgPSBrdm1fbWlwc19jYWxsYmFja3MtPmhhbmRsZV9icmVhayh2Y3B1KTsKIAkJYnJlYWs7CiAKKwljYXNlIFRfVFJBUDoKKwkJKyt2Y3B1LT5zdGF0LnRyYXBfaW5zdF9leGl0czsKKwkJdHJhY2Vfa3ZtX2V4aXQodmNwdSwgVFJBUF9JTlNUX0VYSVRTKTsKKwkJcmV0ID0ga3ZtX21pcHNfY2FsbGJhY2tzLT5oYW5kbGVfdHJhcCh2Y3B1KTsKKwkJYnJlYWs7CisKKwljYXNlIFRfTVNBRlBFOgorCQkrK3ZjcHUtPnN0YXQubXNhX2ZwZV9leGl0czsKKwkJdHJhY2Vfa3ZtX2V4aXQodmNwdSwgTVNBX0ZQRV9FWElUUyk7CisJCXJldCA9IGt2bV9taXBzX2NhbGxiYWNrcy0+aGFuZGxlX21zYV9mcGUodmNwdSk7CisJCWJyZWFrOworCisJY2FzZSBUX0ZQRToKKwkJKyt2Y3B1LT5zdGF0LmZwZV9leGl0czsKKwkJdHJhY2Vfa3ZtX2V4aXQodmNwdSwgRlBFX0VYSVRTKTsKKwkJcmV0ID0ga3ZtX21pcHNfY2FsbGJhY2tzLT5oYW5kbGVfZnBlKHZjcHUpOworCQlicmVhazsKKworCWNhc2UgVF9NU0FESVM6CisJCSsrdmNwdS0+c3RhdC5tc2FfZGlzYWJsZWRfZXhpdHM7CisJCXRyYWNlX2t2bV9leGl0KHZjcHUsIE1TQV9ESVNBQkxFRF9FWElUUyk7CisJCXJldCA9IGt2bV9taXBzX2NhbGxiYWNrcy0+aGFuZGxlX21zYV9kaXNhYmxlZCh2Y3B1KTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlrdm1fZXJyKCJFeGNlcHRpb24gQ29kZTogJWQsIG5vdCB5ZXQgaGFuZGxlZCwgQCBQQzogJXAsIGluc3Q6IDB4JTA4eCAgQmFkVmFkZHI6ICUjbHggU3RhdHVzOiAlI2x4XG4iLAogCQkJZXhjY29kZSwgb3BjLCBrdm1fZ2V0X2luc3Qob3BjLCB2Y3B1KSwgYmFkdmFkZHIsCkBAIC0xMTQ2LDEyICsxMzg2LDIzMyBAQAogCQl9CiAJfQogCisJaWYgKHJldCA9PSBSRVNVTUVfR1VFU1QpIHsKKwkJLyoKKwkJICogSWYgRlBVIC8gTVNBIGFyZSBlbmFibGVkIChpLmUuIHRoZSBndWVzdCdzIEZQVSAvIE1TQSBjb250ZXh0CisJCSAqIGlzIGxpdmUpLCByZXN0b3JlIEZDUjMxIC8gTVNBQ1NSLgorCQkgKgorCQkgKiBUaGlzIHNob3VsZCBiZSBiZWZvcmUgcmV0dXJuaW5nIHRvIHRoZSBndWVzdCBleGNlcHRpb24KKwkJICogdmVjdG9yLCBhcyBpdCBtYXkgd2VsbCBjYXVzZSBhbiBbTVNBXSBGUCBleGNlcHRpb24gaWYgdGhlcmUKKwkJICogYXJlIHBlbmRpbmcgZXhjZXB0aW9uIGJpdHMgdW5tYXNrZWQuIChzZWUKKwkJICoga3ZtX21pcHNfY3NyX2RpZV9ub3RpZmllcigpIGZvciBob3cgdGhhdCBpcyBoYW5kbGVkKS4KKwkJICovCisJCWlmIChrdm1fbWlwc19ndWVzdF9oYXNfZnB1KCZ2Y3B1LT5hcmNoKSAmJgorCQkgICAgcmVhZF9jMF9zdGF0dXMoKSAmIFNUMF9DVTEpCisJCQlfX2t2bV9yZXN0b3JlX2Zjc3IoJnZjcHUtPmFyY2gpOworCisJCWlmIChrdm1fbWlwc19ndWVzdF9oYXNfbXNhKCZ2Y3B1LT5hcmNoKSAmJgorCQkgICAgcmVhZF9jMF9jb25maWc1KCkgJiBNSVBTX0NPTkY1X01TQUVOKQorCQkJX19rdm1fcmVzdG9yZV9tc2Fjc3IoJnZjcHUtPmFyY2gpOworCX0KKwogCS8qIERpc2FibGUgSFRXIGJlZm9yZSByZXR1cm5pbmcgdG8gZ3Vlc3Qgb3IgaG9zdCAqLwogCWh0d19zdG9wKCk7CiAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBFbmFibGUgRlBVIGZvciBndWVzdCBhbmQgcmVzdG9yZSBjb250ZXh0ICovCit2b2lkIGt2bV9vd25fZnB1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3QgbWlwc19jb3Byb2MgKmNvcDAgPSB2Y3B1LT5hcmNoLmNvcDA7CisJdW5zaWduZWQgaW50IHNyLCBjZmc1OworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwlzciA9IGt2bV9yZWFkX2MwX2d1ZXN0X3N0YXR1cyhjb3AwKTsKKworCS8qCisJICogSWYgTVNBIHN0YXRlIGlzIGFscmVhZHkgbGl2ZSwgaXQgaXMgdW5kZWZpbmVkIGhvdyBpdCBpbnRlcmFjdHMgd2l0aAorCSAqIEZSPTAgRlBVIHN0YXRlLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBoaXQgcmVzZXJ2ZWQgaW5zdHJ1Y3Rpb24KKwkgKiBleGNlcHRpb25zIHRyeWluZyB0byBzYXZlIHRoZSBNU0Egc3RhdGUgbGF0ZXIgd2hlbiBDVT0xICYmIEZSPTEsIHNvCisJICogcGxheSBpdCBzYWZlIGFuZCBzYXZlIGl0IGZpcnN0LgorCSAqCisJICogSW4gdGhlb3J5IHdlIHNob3VsZG4ndCBldmVyIGhpdCB0aGlzIGNhc2Ugc2luY2Uga3ZtX2xvc2VfZnB1KCkgc2hvdWxkCisJICogZ2V0IGNhbGxlZCB3aGVuIGd1ZXN0IENVMSBpcyBzZXQsIGhvd2V2ZXIgd2UgY2FuJ3QgdHJ1c3QgdGhlIGd1ZXN0CisJICogbm90IHRvIGNsb2JiZXIgdGhlIHN0YXR1cyByZWdpc3RlciBkaXJlY3RseSB2aWEgdGhlIGNvbW1wYWdlLgorCSAqLworCWlmIChjcHVfaGFzX21zYSAmJiBzciAmIFNUMF9DVTEgJiYgIShzciAmIFNUMF9GUikgJiYKKwkgICAgdmNwdS0+YXJjaC5mcHVfaW51c2UgJiBLVk1fTUlQU19GUFVfTVNBKQorCQlrdm1fbG9zZV9mcHUodmNwdSk7CisKKwkvKgorCSAqIEVuYWJsZSBGUFUgZm9yIGd1ZXN0CisJICogV2Ugc2V0IEZSIGFuZCBGUkUgYWNjb3JkaW5nIHRvIGd1ZXN0IGNvbnRleHQKKwkgKi8KKwljaGFuZ2VfYzBfc3RhdHVzKFNUMF9DVTEgfCBTVDBfRlIsIHNyKTsKKwlpZiAoY3B1X2hhc19mcmUpIHsKKwkJY2ZnNSA9IGt2bV9yZWFkX2MwX2d1ZXN0X2NvbmZpZzUoY29wMCk7CisJCWNoYW5nZV9jMF9jb25maWc1KE1JUFNfQ09ORjVfRlJFLCBjZmc1KTsKKwl9CisJZW5hYmxlX2ZwdV9oYXphcmQoKTsKKworCS8qIElmIGd1ZXN0IEZQVSBzdGF0ZSBub3QgYWN0aXZlLCByZXN0b3JlIGl0IG5vdyAqLworCWlmICghKHZjcHUtPmFyY2guZnB1X2ludXNlICYgS1ZNX01JUFNfRlBVX0ZQVSkpIHsKKwkJX19rdm1fcmVzdG9yZV9mcHUoJnZjcHUtPmFyY2gpOworCQl2Y3B1LT5hcmNoLmZwdV9pbnVzZSB8PSBLVk1fTUlQU19GUFVfRlBVOworCX0KKworCXByZWVtcHRfZW5hYmxlKCk7Cit9CisKKyNpZmRlZiBDT05GSUdfQ1BVX0hBU19NU0EKKy8qIEVuYWJsZSBNU0EgZm9yIGd1ZXN0IGFuZCByZXN0b3JlIGNvbnRleHQgKi8KK3ZvaWQga3ZtX293bl9tc2Eoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBtaXBzX2NvcHJvYyAqY29wMCA9IHZjcHUtPmFyY2guY29wMDsKKwl1bnNpZ25lZCBpbnQgc3IsIGNmZzU7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCS8qCisJICogRW5hYmxlIEZQVSBpZiBlbmFibGVkIGluIGd1ZXN0LCBzaW5jZSB3ZSdyZSByZXN0b3JpbmcgRlBVIGNvbnRleHQKKwkgKiBhbnl3YXkuIFdlIHNldCBGUiBhbmQgRlJFIGFjY29yZGluZyB0byBndWVzdCBjb250ZXh0LgorCSAqLworCWlmIChrdm1fbWlwc19ndWVzdF9oYXNfZnB1KCZ2Y3B1LT5hcmNoKSkgeworCQlzciA9IGt2bV9yZWFkX2MwX2d1ZXN0X3N0YXR1cyhjb3AwKTsKKworCQkvKgorCQkgKiBJZiBGUj0wIEZQVSBzdGF0ZSBpcyBhbHJlYWR5IGxpdmUsIGl0IGlzIHVuZGVmaW5lZCBob3cgaXQKKwkJICogaW50ZXJhY3RzIHdpdGggTVNBIHN0YXRlLCBzbyBwbGF5IGl0IHNhZmUgYW5kIHNhdmUgaXQgZmlyc3QuCisJCSAqLworCQlpZiAoIShzciAmIFNUMF9GUikgJiYKKwkJICAgICh2Y3B1LT5hcmNoLmZwdV9pbnVzZSAmIChLVk1fTUlQU19GUFVfRlBVIHwKKwkJCQlLVk1fTUlQU19GUFVfTVNBKSkgPT0gS1ZNX01JUFNfRlBVX0ZQVSkKKwkJCWt2bV9sb3NlX2ZwdSh2Y3B1KTsKKworCQljaGFuZ2VfYzBfc3RhdHVzKFNUMF9DVTEgfCBTVDBfRlIsIHNyKTsKKwkJaWYgKHNyICYgU1QwX0NVMSAmJiBjcHVfaGFzX2ZyZSkgeworCQkJY2ZnNSA9IGt2bV9yZWFkX2MwX2d1ZXN0X2NvbmZpZzUoY29wMCk7CisJCQljaGFuZ2VfYzBfY29uZmlnNShNSVBTX0NPTkY1X0ZSRSwgY2ZnNSk7CisJCX0KKwl9CisKKwkvKiBFbmFibGUgTVNBIGZvciBndWVzdCAqLworCXNldF9jMF9jb25maWc1KE1JUFNfQ09ORjVfTVNBRU4pOworCWVuYWJsZV9mcHVfaGF6YXJkKCk7CisKKwlzd2l0Y2ggKHZjcHUtPmFyY2guZnB1X2ludXNlICYgKEtWTV9NSVBTX0ZQVV9GUFUgfCBLVk1fTUlQU19GUFVfTVNBKSkgeworCWNhc2UgS1ZNX01JUFNfRlBVX0ZQVToKKwkJLyoKKwkJICogR3Vlc3QgRlBVIHN0YXRlIGFscmVhZHkgbG9hZGVkLCBvbmx5IHJlc3RvcmUgdXBwZXIgTVNBIHN0YXRlCisJCSAqLworCQlfX2t2bV9yZXN0b3JlX21zYV91cHBlcigmdmNwdS0+YXJjaCk7CisJCXZjcHUtPmFyY2guZnB1X2ludXNlIHw9IEtWTV9NSVBTX0ZQVV9NU0E7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJLyogTmVpdGhlciBGUFUgb3IgTVNBIGFscmVhZHkgYWN0aXZlLCByZXN0b3JlIGZ1bGwgTVNBIHN0YXRlICovCisJCV9fa3ZtX3Jlc3RvcmVfbXNhKCZ2Y3B1LT5hcmNoKTsKKwkJdmNwdS0+YXJjaC5mcHVfaW51c2UgfD0gS1ZNX01JUFNfRlBVX01TQTsKKwkJaWYgKGt2bV9taXBzX2d1ZXN0X2hhc19mcHUoJnZjcHUtPmFyY2gpKQorCQkJdmNwdS0+YXJjaC5mcHVfaW51c2UgfD0gS1ZNX01JUFNfRlBVX0ZQVTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKyNlbmRpZgorCisvKiBEcm9wIEZQVSAmIE1TQSB3aXRob3V0IHNhdmluZyBpdCAqLwordm9pZCBrdm1fZHJvcF9mcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXByZWVtcHRfZGlzYWJsZSgpOworCWlmIChjcHVfaGFzX21zYSAmJiB2Y3B1LT5hcmNoLmZwdV9pbnVzZSAmIEtWTV9NSVBTX0ZQVV9NU0EpIHsKKwkJZGlzYWJsZV9tc2EoKTsKKwkJdmNwdS0+YXJjaC5mcHVfaW51c2UgJj0gfktWTV9NSVBTX0ZQVV9NU0E7CisJfQorCWlmICh2Y3B1LT5hcmNoLmZwdV9pbnVzZSAmIEtWTV9NSVBTX0ZQVV9GUFUpIHsKKwkJY2xlYXJfYzBfc3RhdHVzKFNUMF9DVTEgfCBTVDBfRlIpOworCQl2Y3B1LT5hcmNoLmZwdV9pbnVzZSAmPSB+S1ZNX01JUFNfRlBVX0ZQVTsKKwl9CisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworLyogU2F2ZSBhbmQgZGlzYWJsZSBGUFUgJiBNU0EgKi8KK3ZvaWQga3ZtX2xvc2VfZnB1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwkvKgorCSAqIEZQVSAmIE1TQSBnZXQgZGlzYWJsZWQgaW4gcm9vdCBjb250ZXh0IChoYXJkd2FyZSkgd2hlbiBpdCBpcyBkaXNhYmxlZAorCSAqIGluIGd1ZXN0IGNvbnRleHQgKHNvZnR3YXJlKSwgYnV0IHRoZSByZWdpc3RlciBzdGF0ZSBpbiB0aGUgaGFyZHdhcmUKKwkgKiBtYXkgc3RpbGwgYmUgaW4gdXNlLiBUaGlzIGlzIHdoeSB3ZSBleHBsaWNpdGx5IHJlLWVuYWJsZSB0aGUgaGFyZHdhcmUKKwkgKiBiZWZvcmUgc2F2aW5nLgorCSAqLworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJaWYgKGNwdV9oYXNfbXNhICYmIHZjcHUtPmFyY2guZnB1X2ludXNlICYgS1ZNX01JUFNfRlBVX01TQSkgeworCQlzZXRfYzBfY29uZmlnNShNSVBTX0NPTkY1X01TQUVOKTsKKwkJZW5hYmxlX2ZwdV9oYXphcmQoKTsKKworCQlfX2t2bV9zYXZlX21zYSgmdmNwdS0+YXJjaCk7CisKKwkJLyogRGlzYWJsZSBNU0EgJiBGUFUgKi8KKwkJZGlzYWJsZV9tc2EoKTsKKwkJaWYgKHZjcHUtPmFyY2guZnB1X2ludXNlICYgS1ZNX01JUFNfRlBVX0ZQVSkKKwkJCWNsZWFyX2MwX3N0YXR1cyhTVDBfQ1UxIHwgU1QwX0ZSKTsKKwkJdmNwdS0+YXJjaC5mcHVfaW51c2UgJj0gfihLVk1fTUlQU19GUFVfRlBVIHwgS1ZNX01JUFNfRlBVX01TQSk7CisJfSBlbHNlIGlmICh2Y3B1LT5hcmNoLmZwdV9pbnVzZSAmIEtWTV9NSVBTX0ZQVV9GUFUpIHsKKwkJc2V0X2MwX3N0YXR1cyhTVDBfQ1UxKTsKKwkJZW5hYmxlX2ZwdV9oYXphcmQoKTsKKworCQlfX2t2bV9zYXZlX2ZwdSgmdmNwdS0+YXJjaCk7CisJCXZjcHUtPmFyY2guZnB1X2ludXNlICY9IH5LVk1fTUlQU19GUFVfRlBVOworCisJCS8qIERpc2FibGUgRlBVICovCisJCWNsZWFyX2MwX3N0YXR1cyhTVDBfQ1UxIHwgU1QwX0ZSKTsKKwl9CisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworLyoKKyAqIFN0ZXAgb3ZlciBhIHNwZWNpZmljIGN0YzEgdG8gRkNTUiBhbmQgYSBzcGVjaWZpYyBjdGNtc2EgdG8gTVNBQ1NSIHdoaWNoIGFyZQorICogdXNlZCB0byByZXN0b3JlIGd1ZXN0IEZDU1IvTVNBQ1NSIHN0YXRlIGFuZCBtYXkgdHJpZ2dlciBhICJoYXJtbGVzcyIgRlAvTVNBRlAKKyAqIGV4Y2VwdGlvbiBpZiBjYXVzZSBiaXRzIGFyZSBzZXQgaW4gdGhlIHZhbHVlIGJlaW5nIHdyaXR0ZW4uCisgKi8KK3N0YXRpYyBpbnQga3ZtX21pcHNfY3NyX2RpZV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICpwdHIpCit7CisJc3RydWN0IGRpZV9hcmdzICphcmdzID0gKHN0cnVjdCBkaWVfYXJncyAqKXB0cjsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGFyZ3MtPnJlZ3M7CisJdW5zaWduZWQgbG9uZyBwYzsKKworCS8qIE9ubHkgaW50ZXJlc3RlZCBpbiBGUEUgYW5kIE1TQUZQRSAqLworCWlmIChjbWQgIT0gRElFX0ZQICYmIGNtZCAhPSBESUVfTVNBRlApCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCS8qIFJldHVybiBpbW1lZGlhdGVseSBpZiBndWVzdCBjb250ZXh0IGlzbid0IGFjdGl2ZSAqLworCWlmICghKGN1cnJlbnQtPmZsYWdzICYgUEZfVkNQVSkpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCS8qIFNob3VsZCBuZXZlciBnZXQgaGVyZSBmcm9tIHVzZXIgbW9kZSAqLworCUJVR19PTih1c2VyX21vZGUocmVncykpOworCisJcGMgPSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBESUVfRlA6CisJCS8qIG1hdGNoIDJuZCBpbnN0cnVjdGlvbiBpbiBfX2t2bV9yZXN0b3JlX2Zjc3IgKi8KKwkJaWYgKHBjICE9ICh1bnNpZ25lZCBsb25nKSZfX2t2bV9yZXN0b3JlX2Zjc3IgKyA0KQorCQkJcmV0dXJuIE5PVElGWV9ET05FOworCQlicmVhazsKKwljYXNlIERJRV9NU0FGUDoKKwkJLyogbWF0Y2ggMm5kLzNyZCBpbnN0cnVjdGlvbiBpbiBfX2t2bV9yZXN0b3JlX21zYWNzciAqLworCQlpZiAoIWNwdV9oYXNfbXNhIHx8CisJCSAgICBwYyA8ICh1bnNpZ25lZCBsb25nKSZfX2t2bV9yZXN0b3JlX21zYWNzciArIDQgfHwKKwkJICAgIHBjID4gKHVuc2lnbmVkIGxvbmcpJl9fa3ZtX3Jlc3RvcmVfbXNhY3NyICsgOCkKKwkJCXJldHVybiBOT1RJRllfRE9ORTsKKwkJYnJlYWs7CisJfQorCisJLyogTW92ZSBQQyBmb3J3YXJkIGEgbGl0dGxlIGFuZCBjb250aW51ZSBleGVjdXRpbmcgKi8KKwlpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpICs9IDQ7CisKKwlyZXR1cm4gTk9USUZZX1NUT1A7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sga3ZtX21pcHNfY3NyX2RpZV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGt2bV9taXBzX2Nzcl9kaWVfbm90aWZ5LAorfTsKKwogaW50IF9faW5pdCBrdm1fbWlwc19pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTExNjEsNiArMTYyMiw4IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXJlZ2lzdGVyX2RpZV9ub3RpZmllcigma3ZtX21pcHNfY3NyX2RpZV9ub3RpZmllcik7CisKIAkvKgogCSAqIE9uIE1JUFMsIGtlcm5lbCBtb2R1bGVzIGFyZSBleGVjdXRlZCBmcm9tICJtYXBwZWQgc3BhY2UiLCB3aGljaAogCSAqIHJlcXVpcmVzIFRMQnMuIFRoZSBUTEIgaGFuZGxpbmcgY29kZSBpcyBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoCkBAIC0xMTczLDcgKzE2MzYsNiBAQAogCWt2bV9taXBzX3JlbGVhc2VfcGZuX2NsZWFuID0ga3ZtX3JlbGVhc2VfcGZuX2NsZWFuOwogCWt2bV9taXBzX2lzX2Vycm9yX3BmbiA9IGlzX2Vycm9yX3BmbjsKIAotCXByX2luZm8oIktWTS9NSVBTIEluaXRpYWxpemVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE4NSw3ICsxNjQ3LDcgQEAKIAlrdm1fbWlwc19yZWxlYXNlX3Bmbl9jbGVhbiA9IE5VTEw7CiAJa3ZtX21pcHNfaXNfZXJyb3JfcGZuID0gTlVMTDsKIAotCXByX2luZm8oIktWTS9NSVBTIHVubG9hZGVkXG4iKTsKKwl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigma3ZtX21pcHNfY3NyX2RpZV9ub3RpZmllcik7CiB9CiAKIG1vZHVsZV9pbml0KGt2bV9taXBzX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2t2bS9tc2EuUyBiL2FyY2gvbWlwcy9rdm0vbXNhLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAyZjBjNgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbWlwcy9rdm0vbXNhLlMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSAiQ09QWUlORyIgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBNSVBTIFNJTUQgQXJjaGl0ZWN0dXJlIChNU0EpIGNvbnRleHQgaGFuZGxpbmcgY29kZSBmb3IgS1ZNLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgTHRkLgorICovCisKKyNpbmNsdWRlIDxhc20vYXNtLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbW1hY3JvLmg+CisjaW5jbHVkZSA8YXNtL3JlZ2RlZi5oPgorCisJLnNldAlub3Jlb3JkZXIKKwkuc2V0CW5vYXQKKworTEVBRihfX2t2bV9zYXZlX21zYSkKKwlzdF9kCTAsICBWQ1BVX0ZQUjAsICBhMAorCXN0X2QJMSwgIFZDUFVfRlBSMSwgIGEwCisJc3RfZAkyLCAgVkNQVV9GUFIyLCAgYTAKKwlzdF9kCTMsICBWQ1BVX0ZQUjMsICBhMAorCXN0X2QJNCwgIFZDUFVfRlBSNCwgIGEwCisJc3RfZAk1LCAgVkNQVV9GUFI1LCAgYTAKKwlzdF9kCTYsICBWQ1BVX0ZQUjYsICBhMAorCXN0X2QJNywgIFZDUFVfRlBSNywgIGEwCisJc3RfZAk4LCAgVkNQVV9GUFI4LCAgYTAKKwlzdF9kCTksICBWQ1BVX0ZQUjksICBhMAorCXN0X2QJMTAsIFZDUFVfRlBSMTAsIGEwCisJc3RfZAkxMSwgVkNQVV9GUFIxMSwgYTAKKwlzdF9kCTEyLCBWQ1BVX0ZQUjEyLCBhMAorCXN0X2QJMTMsIFZDUFVfRlBSMTMsIGEwCisJc3RfZAkxNCwgVkNQVV9GUFIxNCwgYTAKKwlzdF9kCTE1LCBWQ1BVX0ZQUjE1LCBhMAorCXN0X2QJMTYsIFZDUFVfRlBSMTYsIGEwCisJc3RfZAkxNywgVkNQVV9GUFIxNywgYTAKKwlzdF9kCTE4LCBWQ1BVX0ZQUjE4LCBhMAorCXN0X2QJMTksIFZDUFVfRlBSMTksIGEwCisJc3RfZAkyMCwgVkNQVV9GUFIyMCwgYTAKKwlzdF9kCTIxLCBWQ1BVX0ZQUjIxLCBhMAorCXN0X2QJMjIsIFZDUFVfRlBSMjIsIGEwCisJc3RfZAkyMywgVkNQVV9GUFIyMywgYTAKKwlzdF9kCTI0LCBWQ1BVX0ZQUjI0LCBhMAorCXN0X2QJMjUsIFZDUFVfRlBSMjUsIGEwCisJc3RfZAkyNiwgVkNQVV9GUFIyNiwgYTAKKwlzdF9kCTI3LCBWQ1BVX0ZQUjI3LCBhMAorCXN0X2QJMjgsIFZDUFVfRlBSMjgsIGEwCisJc3RfZAkyOSwgVkNQVV9GUFIyOSwgYTAKKwlzdF9kCTMwLCBWQ1BVX0ZQUjMwLCBhMAorCXN0X2QJMzEsIFZDUFVfRlBSMzEsIGEwCisJanIJcmEKKwkgbm9wCisJRU5EKF9fa3ZtX3NhdmVfbXNhKQorCitMRUFGKF9fa3ZtX3Jlc3RvcmVfbXNhKQorCWxkX2QJMCwgIFZDUFVfRlBSMCwgIGEwCisJbGRfZAkxLCAgVkNQVV9GUFIxLCAgYTAKKwlsZF9kCTIsICBWQ1BVX0ZQUjIsICBhMAorCWxkX2QJMywgIFZDUFVfRlBSMywgIGEwCisJbGRfZAk0LCAgVkNQVV9GUFI0LCAgYTAKKwlsZF9kCTUsICBWQ1BVX0ZQUjUsICBhMAorCWxkX2QJNiwgIFZDUFVfRlBSNiwgIGEwCisJbGRfZAk3LCAgVkNQVV9GUFI3LCAgYTAKKwlsZF9kCTgsICBWQ1BVX0ZQUjgsICBhMAorCWxkX2QJOSwgIFZDUFVfRlBSOSwgIGEwCisJbGRfZAkxMCwgVkNQVV9GUFIxMCwgYTAKKwlsZF9kCTExLCBWQ1BVX0ZQUjExLCBhMAorCWxkX2QJMTIsIFZDUFVfRlBSMTIsIGEwCisJbGRfZAkxMywgVkNQVV9GUFIxMywgYTAKKwlsZF9kCTE0LCBWQ1BVX0ZQUjE0LCBhMAorCWxkX2QJMTUsIFZDUFVfRlBSMTUsIGEwCisJbGRfZAkxNiwgVkNQVV9GUFIxNiwgYTAKKwlsZF9kCTE3LCBWQ1BVX0ZQUjE3LCBhMAorCWxkX2QJMTgsIFZDUFVfRlBSMTgsIGEwCisJbGRfZAkxOSwgVkNQVV9GUFIxOSwgYTAKKwlsZF9kCTIwLCBWQ1BVX0ZQUjIwLCBhMAorCWxkX2QJMjEsIFZDUFVfRlBSMjEsIGEwCisJbGRfZAkyMiwgVkNQVV9GUFIyMiwgYTAKKwlsZF9kCTIzLCBWQ1BVX0ZQUjIzLCBhMAorCWxkX2QJMjQsIFZDUFVfRlBSMjQsIGEwCisJbGRfZAkyNSwgVkNQVV9GUFIyNSwgYTAKKwlsZF9kCTI2LCBWQ1BVX0ZQUjI2LCBhMAorCWxkX2QJMjcsIFZDUFVfRlBSMjcsIGEwCisJbGRfZAkyOCwgVkNQVV9GUFIyOCwgYTAKKwlsZF9kCTI5LCBWQ1BVX0ZQUjI5LCBhMAorCWxkX2QJMzAsIFZDUFVfRlBSMzAsIGEwCisJbGRfZAkzMSwgVkNQVV9GUFIzMSwgYTAKKwlqcglyYQorCSBub3AKKwlFTkQoX19rdm1fcmVzdG9yZV9tc2EpCisKKwkubWFjcm8Ja3ZtX3Jlc3RvcmVfbXNhX3VwcGVyCXdyLCBvZmYsIGJhc2UKKwkuc2V0CXB1c2gKKwkuc2V0CW5vYXQKKyNpZmRlZiBDT05GSUdfNjRCSVQKKwlsZAkkMSwgXG9mZihcYmFzZSkKKwlpbnNlcnRfZCBcd3IsIDEKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOKQorCWx3CSQxLCBcb2ZmKFxiYXNlKQorCWluc2VydF93IFx3ciwgMgorCWx3CSQxLCAoXG9mZis0KShcYmFzZSkKKwlpbnNlcnRfdyBcd3IsIDMKKyNlbHNlIC8qIENPTkZJR19DUFVfQklHX0VORElBTiAqLworCWx3CSQxLCAoXG9mZis0KShcYmFzZSkKKwlpbnNlcnRfdyBcd3IsIDIKKwlsdwkkMSwgXG9mZihcYmFzZSkKKwlpbnNlcnRfdyBcd3IsIDMKKyNlbmRpZgorCS5zZXQJcG9wCisJLmVuZG0KKworTEVBRihfX2t2bV9yZXN0b3JlX21zYV91cHBlcikKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMCwgIFZDUFVfRlBSMCArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMSwgIFZDUFVfRlBSMSArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMiwgIFZDUFVfRlBSMiArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMywgIFZDUFVfRlBSMyArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJNCwgIFZDUFVfRlBSNCArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJNSwgIFZDUFVfRlBSNSArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJNiwgIFZDUFVfRlBSNiArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJNywgIFZDUFVfRlBSNyArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJOCwgIFZDUFVfRlBSOCArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJOSwgIFZDUFVfRlBSOSArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMTAsIFZDUFVfRlBSMTArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMTEsIFZDUFVfRlBSMTErOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMTIsIFZDUFVfRlBSMTIrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMTMsIFZDUFVfRlBSMTMrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMTQsIFZDUFVfRlBSMTQrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMTUsIFZDUFVfRlBSMTUrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMTYsIFZDUFVfRlBSMTYrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMTcsIFZDUFVfRlBSMTcrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMTgsIFZDUFVfRlBSMTgrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMTksIFZDUFVfRlBSMTkrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMjAsIFZDUFVfRlBSMjArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMjEsIFZDUFVfRlBSMjErOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMjIsIFZDUFVfRlBSMjIrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMjMsIFZDUFVfRlBSMjMrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMjQsIFZDUFVfRlBSMjQrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMjUsIFZDUFVfRlBSMjUrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMjYsIFZDUFVfRlBSMjYrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMjcsIFZDUFVfRlBSMjcrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMjgsIFZDUFVfRlBSMjgrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMjksIFZDUFVfRlBSMjkrOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMzAsIFZDUFVfRlBSMzArOCwgYTAKKwlrdm1fcmVzdG9yZV9tc2FfdXBwZXIJMzEsIFZDUFVfRlBSMzErOCwgYTAKKwlqcglyYQorCSBub3AKKwlFTkQoX19rdm1fcmVzdG9yZV9tc2FfdXBwZXIpCisKK0xFQUYoX19rdm1fcmVzdG9yZV9tc2Fjc3IpCisJbHcJdDAsIFZDUFVfTVNBX0NTUihhMCkKKwkvKgorCSAqIFRoZSBjdGNtc2EgbXVzdCBzdGF5IGF0IHRoaXMgb2Zmc2V0IGluIF9fa3ZtX3Jlc3RvcmVfbXNhY3NyLgorCSAqIFNlZSBrdm1fbWlwc19jc3JfZGllX25vdGlmeSgpIHdoaWNoIGhhbmRsZXMgdDAgY29udGFpbmluZyBhIHZhbHVlCisJICogd2hpY2ggdHJpZ2dlcnMgYW4gTVNBIEZQIEV4Y2VwdGlvbiwgd2hpY2ggbXVzdCBiZSBzdGVwcGVkIG92ZXIgYW5kCisJICogaWdub3JlZCBzaW5jZSB0aGUgc2V0IGNhdXNlIGJpdHMgbXVzdCByZW1haW4gdGhlcmUgZm9yIHRoZSBndWVzdC4KKwkgKi8KKwlfY3RjbXNhCU1TQV9DU1IsIHQwCisJanIJcmEKKwkgbm9wCisJRU5EKF9fa3ZtX3Jlc3RvcmVfbXNhY3NyKQpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2t2bS9zdGF0cy5jIGIvYXJjaC9taXBzL2t2bS9zdGF0cy5jCmluZGV4IGE3NGQ2MDIuLjg4OGJiNjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rdm0vc3RhdHMuYworKysgYi9hcmNoL21pcHMva3ZtL3N0YXRzLmMKQEAgLTI1LDYgKzI1LDEwIEBACiAJIlN5c3RlbSBDYWxsIiwKIAkiUmVzZXJ2ZWQgSW5zdCIsCiAJIkJyZWFrIEluc3QiLAorCSJUcmFwIEluc3QiLAorCSJNU0EgRlBFIiwKKwkiRlBFIiwKKwkiTVNBIERpc2FibGVkIiwKIAkiRC1DYWNoZSBGbHVzaGVzIiwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rdm0vdGxiLmMgYi9hcmNoL21pcHMva3ZtL3RsYi5jCmluZGV4IGI2YmViMGUuLmFlZDBhYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rdm0vdGxiLmMKKysrIGIvYXJjaC9taXBzL2t2bS90bGIuYwpAQCAtNzMzLDYgKzczMyw5IEBACiAJCX0KIAl9CiAKKwkvKiByZXN0b3JlIGd1ZXN0IHN0YXRlIHRvIHJlZ2lzdGVycyAqLworCWt2bV9taXBzX2NhbGxiYWNrcy0+dmNwdV9zZXRfcmVncyh2Y3B1KTsKKwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogfQpAQCAtNzUxLDYgKzc1NCw5IEBACiAJdmNwdS0+YXJjaC5wcmVlbXB0X2VudHJ5aGkgPSByZWFkX2MwX2VudHJ5aGkoKTsKIAl2Y3B1LT5hcmNoLmxhc3Rfc2NoZWRfY3B1ID0gY3B1OwogCisJLyogc2F2ZSBndWVzdCBzdGF0ZSBpbiByZWdpc3RlcnMgKi8KKwlrdm1fbWlwc19jYWxsYmFja3MtPnZjcHVfZ2V0X3JlZ3ModmNwdSk7CisKIAlpZiAoKChjcHVfY29udGV4dChjcHUsIGN1cnJlbnQtPm1tKSBeIGFzaWRfY2FjaGUoY3B1KSkgJgogCSAgICAgQVNJRF9WRVJTSU9OX01BU0spKSB7CiAJCWt2bV9kZWJ1ZygiJXM6IERyb3BwaW5nIE1NVSBDb250ZXh0OiAgJSNseFxuIiwgX19mdW5jX18sCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva3ZtL3RyYXBfZW11bC5jIGIvYXJjaC9taXBzL2t2bS90cmFwX2VtdWwuYwppbmRleCBmZDcyNTdiLi5kODM2ZWQ1IDEwMDY0NAotLS0gYS9hcmNoL21pcHMva3ZtL3RyYXBfZW11bC5jCisrKyBiL2FyY2gvbWlwcy9rdm0vdHJhcF9lbXVsLmMKQEAgLTM5LDE2ICszOSwzMCBAQAogCiBzdGF0aWMgaW50IGt2bV90cmFwX2VtdWxfaGFuZGxlX2NvcF91bnVzYWJsZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CisJc3RydWN0IG1pcHNfY29wcm9jICpjb3AwID0gdmNwdS0+YXJjaC5jb3AwOwogCXN0cnVjdCBrdm1fcnVuICpydW4gPSB2Y3B1LT5ydW47CiAJdWludDMyX3QgX191c2VyICpvcGMgPSAodWludDMyX3QgX191c2VyICopIHZjcHUtPmFyY2gucGM7CiAJdW5zaWduZWQgbG9uZyBjYXVzZSA9IHZjcHUtPmFyY2guaG9zdF9jcDBfY2F1c2U7CiAJZW51bSBlbXVsYXRpb25fcmVzdWx0IGVyID0gRU1VTEFURV9ET05FOwogCWludCByZXQgPSBSRVNVTUVfR1VFU1Q7CiAKLQlpZiAoKChjYXVzZSAmIENBVVNFRl9DRSkgPj4gQ0FVU0VCX0NFKSA9PSAxKQotCQllciA9IGt2bV9taXBzX2VtdWxhdGVfZnB1X2V4YyhjYXVzZSwgb3BjLCBydW4sIHZjcHUpOwotCWVsc2UKKwlpZiAoKChjYXVzZSAmIENBVVNFRl9DRSkgPj4gQ0FVU0VCX0NFKSA9PSAxKSB7CisJCS8qIEZQVSBVbnVzYWJsZSAqLworCQlpZiAoIWt2bV9taXBzX2d1ZXN0X2hhc19mcHUoJnZjcHUtPmFyY2gpIHx8CisJCSAgICAoa3ZtX3JlYWRfYzBfZ3Vlc3Rfc3RhdHVzKGNvcDApICYgU1QwX0NVMSkgPT0gMCkgeworCQkJLyoKKwkJCSAqIFVudXNhYmxlL25vIEZQVSBpbiBndWVzdDoKKwkJCSAqIGRlbGl2ZXIgZ3Vlc3QgQ09QMSBVbnVzYWJsZSBFeGNlcHRpb24KKwkJCSAqLworCQkJZXIgPSBrdm1fbWlwc19lbXVsYXRlX2ZwdV9leGMoY2F1c2UsIG9wYywgcnVuLCB2Y3B1KTsKKwkJfSBlbHNlIHsKKwkJCS8qIFJlc3RvcmUgRlBVIHN0YXRlICovCisJCQlrdm1fb3duX2ZwdSh2Y3B1KTsKKwkJCWVyID0gRU1VTEFURV9ET05FOworCQl9CisJfSBlbHNlIHsKIAkJZXIgPSBrdm1fbWlwc19lbXVsYXRlX2luc3QoY2F1c2UsIG9wYywgcnVuLCB2Y3B1KTsKKwl9CiAKIAlzd2l0Y2ggKGVyKSB7CiAJY2FzZSBFTVVMQVRFX0RPTkU6CkBAIC0zMzAsNiArMzQ0LDEwNyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQga3ZtX3RyYXBfZW11bF9oYW5kbGVfdHJhcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJc3RydWN0IGt2bV9ydW4gKnJ1biA9IHZjcHUtPnJ1bjsKKwl1aW50MzJfdCBfX3VzZXIgKm9wYyA9ICh1aW50MzJfdCBfX3VzZXIgKil2Y3B1LT5hcmNoLnBjOworCXVuc2lnbmVkIGxvbmcgY2F1c2UgPSB2Y3B1LT5hcmNoLmhvc3RfY3AwX2NhdXNlOworCWVudW0gZW11bGF0aW9uX3Jlc3VsdCBlciA9IEVNVUxBVEVfRE9ORTsKKwlpbnQgcmV0ID0gUkVTVU1FX0dVRVNUOworCisJZXIgPSBrdm1fbWlwc19lbXVsYXRlX3RyYXBfZXhjKGNhdXNlLCBvcGMsIHJ1biwgdmNwdSk7CisJaWYgKGVyID09IEVNVUxBVEVfRE9ORSkgeworCQlyZXQgPSBSRVNVTUVfR1VFU1Q7CisJfSBlbHNlIHsKKwkJcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVEVSTkFMX0VSUk9SOworCQlyZXQgPSBSRVNVTUVfSE9TVDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBrdm1fdHJhcF9lbXVsX2hhbmRsZV9tc2FfZnBlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX3J1biAqcnVuID0gdmNwdS0+cnVuOworCXVpbnQzMl90IF9fdXNlciAqb3BjID0gKHVpbnQzMl90IF9fdXNlciAqKXZjcHUtPmFyY2gucGM7CisJdW5zaWduZWQgbG9uZyBjYXVzZSA9IHZjcHUtPmFyY2guaG9zdF9jcDBfY2F1c2U7CisJZW51bSBlbXVsYXRpb25fcmVzdWx0IGVyID0gRU1VTEFURV9ET05FOworCWludCByZXQgPSBSRVNVTUVfR1VFU1Q7CisKKwllciA9IGt2bV9taXBzX2VtdWxhdGVfbXNhZnBlX2V4YyhjYXVzZSwgb3BjLCBydW4sIHZjcHUpOworCWlmIChlciA9PSBFTVVMQVRFX0RPTkUpIHsKKwkJcmV0ID0gUkVTVU1FX0dVRVNUOworCX0gZWxzZSB7CisJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKKwkJcmV0ID0gUkVTVU1FX0hPU1Q7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQga3ZtX3RyYXBfZW11bF9oYW5kbGVfZnBlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX3J1biAqcnVuID0gdmNwdS0+cnVuOworCXVpbnQzMl90IF9fdXNlciAqb3BjID0gKHVpbnQzMl90IF9fdXNlciAqKXZjcHUtPmFyY2gucGM7CisJdW5zaWduZWQgbG9uZyBjYXVzZSA9IHZjcHUtPmFyY2guaG9zdF9jcDBfY2F1c2U7CisJZW51bSBlbXVsYXRpb25fcmVzdWx0IGVyID0gRU1VTEFURV9ET05FOworCWludCByZXQgPSBSRVNVTUVfR1VFU1Q7CisKKwllciA9IGt2bV9taXBzX2VtdWxhdGVfZnBlX2V4YyhjYXVzZSwgb3BjLCBydW4sIHZjcHUpOworCWlmIChlciA9PSBFTVVMQVRFX0RPTkUpIHsKKwkJcmV0ID0gUkVTVU1FX0dVRVNUOworCX0gZWxzZSB7CisJCXJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKKwkJcmV0ID0gUkVTVU1FX0hPU1Q7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoga3ZtX3RyYXBfZW11bF9oYW5kbGVfbXNhX2Rpc2FibGVkKCkgLSBHdWVzdCB1c2VkIE1TQSB3aGlsZSBkaXNhYmxlZCBpbiByb290LgorICogQHZjcHU6CVZpcnR1YWwgQ1BVIGNvbnRleHQuCisgKgorICogSGFuZGxlIHdoZW4gdGhlIGd1ZXN0IGF0dGVtcHRzIHRvIHVzZSBNU0Egd2hlbiBpdCBpcyBkaXNhYmxlZC4KKyAqLworc3RhdGljIGludCBrdm1fdHJhcF9lbXVsX2hhbmRsZV9tc2FfZGlzYWJsZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBtaXBzX2NvcHJvYyAqY29wMCA9IHZjcHUtPmFyY2guY29wMDsKKwlzdHJ1Y3Qga3ZtX3J1biAqcnVuID0gdmNwdS0+cnVuOworCXVpbnQzMl90IF9fdXNlciAqb3BjID0gKHVpbnQzMl90IF9fdXNlciAqKSB2Y3B1LT5hcmNoLnBjOworCXVuc2lnbmVkIGxvbmcgY2F1c2UgPSB2Y3B1LT5hcmNoLmhvc3RfY3AwX2NhdXNlOworCWVudW0gZW11bGF0aW9uX3Jlc3VsdCBlciA9IEVNVUxBVEVfRE9ORTsKKwlpbnQgcmV0ID0gUkVTVU1FX0dVRVNUOworCisJaWYgKCFrdm1fbWlwc19ndWVzdF9oYXNfbXNhKCZ2Y3B1LT5hcmNoKSB8fAorCSAgICAoa3ZtX3JlYWRfYzBfZ3Vlc3Rfc3RhdHVzKGNvcDApICYgKFNUMF9DVTEgfCBTVDBfRlIpKSA9PSBTVDBfQ1UxKSB7CisJCS8qCisJCSAqIE5vIE1TQSBpbiBndWVzdCwgb3IgRlBVIGVuYWJsZWQgYW5kIG5vdCBpbiBGUj0xIG1vZGUsCisJCSAqIGd1ZXN0IHJlc2VydmVkIGluc3RydWN0aW9uIGV4Y2VwdGlvbgorCQkgKi8KKwkJZXIgPSBrdm1fbWlwc19lbXVsYXRlX3JpX2V4YyhjYXVzZSwgb3BjLCBydW4sIHZjcHUpOworCX0gZWxzZSBpZiAoIShrdm1fcmVhZF9jMF9ndWVzdF9jb25maWc1KGNvcDApICYgTUlQU19DT05GNV9NU0FFTikpIHsKKwkJLyogTVNBIGRpc2FibGVkIGJ5IGd1ZXN0LCBndWVzdCBNU0EgZGlzYWJsZWQgZXhjZXB0aW9uICovCisJCWVyID0ga3ZtX21pcHNfZW11bGF0ZV9tc2FkaXNfZXhjKGNhdXNlLCBvcGMsIHJ1biwgdmNwdSk7CisJfSBlbHNlIHsKKwkJLyogUmVzdG9yZSBNU0EvRlBVIHN0YXRlICovCisJCWt2bV9vd25fbXNhKHZjcHUpOworCQllciA9IEVNVUxBVEVfRE9ORTsKKwl9CisKKwlzd2l0Y2ggKGVyKSB7CisJY2FzZSBFTVVMQVRFX0RPTkU6CisJCXJldCA9IFJFU1VNRV9HVUVTVDsKKwkJYnJlYWs7CisKKwljYXNlIEVNVUxBVEVfRkFJTDoKKwkJcnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVEVSTkFMX0VSUk9SOworCQlyZXQgPSBSRVNVTUVfSE9TVDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBrdm1fdHJhcF9lbXVsX3ZtX2luaXQoc3RydWN0IGt2bSAqa3ZtKQogewogCXJldHVybiAwOwpAQCAtMzUxLDggKzQ2Niw5IEBACiAJICogZ3Vlc3Qgd2lsbCBjb21lIHVwIGFzIGV4cGVjdGVkLCBmb3Igbm93IHdlIHNpbXVsYXRlIGEgTUlQUyAyNGtjCiAJICovCiAJa3ZtX3dyaXRlX2MwX2d1ZXN0X3ByaWQoY29wMCwgMHgwMDAxOTMwMCk7Ci0Ja3ZtX3dyaXRlX2MwX2d1ZXN0X2NvbmZpZyhjb3AwLAotCQkJCSAgTUlQU19DT05GSUcwIHwgKDB4MSA8PCBDUDBDMF9BUikgfAorCS8qIEhhdmUgY29uZmlnMSwgQ2FjaGVhYmxlLCBub25jb2hlcmVudCwgd3JpdGUtYmFjaywgd3JpdGUgYWxsb2NhdGUgKi8KKwlrdm1fd3JpdGVfYzBfZ3Vlc3RfY29uZmlnKGNvcDAsIE1JUFNfQ09ORl9NIHwgKDB4MyA8PCBDUDBDMF9LMCkgfAorCQkJCSAgKDB4MSA8PCBDUDBDMF9BUikgfAogCQkJCSAgKE1NVV9UWVBFX1I0MDAwIDw8IENQMEMwX01UKSk7CiAKIAkvKiBSZWFkIHRoZSBjYWNoZSBjaGFyYWN0ZXJpc3RpY3MgZnJvbSB0aGUgaG9zdCBDb25maWcxIFJlZ2lzdGVyICovCkBAIC0zNjgsMTAgKzQ4NCwxOCBAQAogCSAgICAgICgxIDw8IENQMEMxX1dSKSB8ICgxIDw8IENQMEMxX0NBKSk7CiAJa3ZtX3dyaXRlX2MwX2d1ZXN0X2NvbmZpZzEoY29wMCwgY29uZmlnMSk7CiAKLQlrdm1fd3JpdGVfYzBfZ3Vlc3RfY29uZmlnMihjb3AwLCBNSVBTX0NPTkZJRzIpOwotCS8qIE1JUFNfQ09ORklHMiB8IChyZWFkX2MwX2NvbmZpZzIoKSAmIDB4ZmZmKSAqLwotCWt2bV93cml0ZV9jMF9ndWVzdF9jb25maWczKGNvcDAsIE1JUFNfQ09ORklHMyB8ICgwIDw8IENQMEMzX1ZJbnQpIHwKLQkJCQkJICgxIDw8IENQMEMzX1VMUkkpKTsKKwkvKiBIYXZlIGNvbmZpZzMsIG5vIHRlcnRpYXJ5L3NlY29uZGFyeSBjYWNoZXMgaW1wbGVtZW50ZWQgKi8KKwlrdm1fd3JpdGVfYzBfZ3Vlc3RfY29uZmlnMihjb3AwLCBNSVBTX0NPTkZfTSk7CisJLyogTUlQU19DT05GX00gfCAocmVhZF9jMF9jb25maWcyKCkgJiAweGZmZikgKi8KKworCS8qIEhhdmUgY29uZmlnNCwgVXNlckxvY2FsICovCisJa3ZtX3dyaXRlX2MwX2d1ZXN0X2NvbmZpZzMoY29wMCwgTUlQU19DT05GX00gfCBNSVBTX0NPTkYzX1VMUkkpOworCisJLyogSGF2ZSBjb25maWc1ICovCisJa3ZtX3dyaXRlX2MwX2d1ZXN0X2NvbmZpZzQoY29wMCwgTUlQU19DT05GX00pOworCisJLyogTm8gY29uZmlnNiAqLworCWt2bV93cml0ZV9jMF9ndWVzdF9jb25maWc1KGNvcDAsIDApOwogCiAJLyogU2V0IFdhaXQgSUUvSVhNVCBJZ25vcmUgaW4gQ29uZmlnNywgSUFSLCBBUiAqLwogCWt2bV93cml0ZV9jMF9ndWVzdF9jb25maWc3KGNvcDAsIChNSVBTX0NPTkY3X1dJSSkgfCAoMSA8PCAxMCkpOwpAQCAtNDE2LDYgKzU0MCw3IEBACiB7CiAJc3RydWN0IG1pcHNfY29wcm9jICpjb3AwID0gdmNwdS0+YXJjaC5jb3AwOwogCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBjdXIsIGNoYW5nZTsKIAogCXN3aXRjaCAocmVnLT5pZCkgewogCWNhc2UgS1ZNX1JFR19NSVBTX0NQMF9DT1VOVDoKQEAgLTQ0NCw2ICs1NjksNDQgQEAKIAkJCWt2bV93cml0ZV9jMF9ndWVzdF9jYXVzZShjb3AwLCB2KTsKIAkJfQogCQlicmVhazsKKwljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHOgorCQkvKiByZWFkLW9ubHkgZm9yIG5vdyAqLworCQlicmVhazsKKwljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHMToKKwkJY3VyID0ga3ZtX3JlYWRfYzBfZ3Vlc3RfY29uZmlnMShjb3AwKTsKKwkJY2hhbmdlID0gKGN1ciBeIHYpICYga3ZtX21pcHNfY29uZmlnMV93cm1hc2sodmNwdSk7CisJCWlmIChjaGFuZ2UpIHsKKwkJCXYgPSBjdXIgXiBjaGFuZ2U7CisJCQlrdm1fd3JpdGVfYzBfZ3Vlc3RfY29uZmlnMShjb3AwLCB2KTsKKwkJfQorCQlicmVhazsKKwljYXNlIEtWTV9SRUdfTUlQU19DUDBfQ09ORklHMjoKKwkJLyogcmVhZC1vbmx5IGZvciBub3cgKi8KKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzM6CisJCWN1ciA9IGt2bV9yZWFkX2MwX2d1ZXN0X2NvbmZpZzMoY29wMCk7CisJCWNoYW5nZSA9IChjdXIgXiB2KSAmIGt2bV9taXBzX2NvbmZpZzNfd3JtYXNrKHZjcHUpOworCQlpZiAoY2hhbmdlKSB7CisJCQl2ID0gY3VyIF4gY2hhbmdlOworCQkJa3ZtX3dyaXRlX2MwX2d1ZXN0X2NvbmZpZzMoY29wMCwgdik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzQ6CisJCWN1ciA9IGt2bV9yZWFkX2MwX2d1ZXN0X2NvbmZpZzQoY29wMCk7CisJCWNoYW5nZSA9IChjdXIgXiB2KSAmIGt2bV9taXBzX2NvbmZpZzRfd3JtYXNrKHZjcHUpOworCQlpZiAoY2hhbmdlKSB7CisJCQl2ID0gY3VyIF4gY2hhbmdlOworCQkJa3ZtX3dyaXRlX2MwX2d1ZXN0X2NvbmZpZzQoY29wMCwgdik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBLVk1fUkVHX01JUFNfQ1AwX0NPTkZJRzU6CisJCWN1ciA9IGt2bV9yZWFkX2MwX2d1ZXN0X2NvbmZpZzUoY29wMCk7CisJCWNoYW5nZSA9IChjdXIgXiB2KSAmIGt2bV9taXBzX2NvbmZpZzVfd3JtYXNrKHZjcHUpOworCQlpZiAoY2hhbmdlKSB7CisJCQl2ID0gY3VyIF4gY2hhbmdlOworCQkJa3ZtX3dyaXRlX2MwX2d1ZXN0X2NvbmZpZzUoY29wMCwgdik7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBLVk1fUkVHX01JUFNfQ09VTlRfQ1RMOgogCQlyZXQgPSBrdm1fbWlwc19zZXRfY291bnRfY3RsKHZjcHUsIHYpOwogCQlicmVhazsKQEAgLTQ1OSw2ICs2MjIsMTggQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGt2bV90cmFwX2VtdWxfdmNwdV9nZXRfcmVncyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJa3ZtX2xvc2VfZnB1KHZjcHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQga3ZtX3RyYXBfZW11bF92Y3B1X3NldF9yZWdzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBrdm1fbWlwc19jYWxsYmFja3Mga3ZtX3RyYXBfZW11bF9jYWxsYmFja3MgPSB7CiAJLyogZXhpdCBoYW5kbGVycyAqLwogCS5oYW5kbGVfY29wX3VudXNhYmxlID0ga3ZtX3RyYXBfZW11bF9oYW5kbGVfY29wX3VudXNhYmxlLApAQCAtNDcwLDYgKzY0NSwxMCBAQAogCS5oYW5kbGVfc3lzY2FsbCA9IGt2bV90cmFwX2VtdWxfaGFuZGxlX3N5c2NhbGwsCiAJLmhhbmRsZV9yZXNfaW5zdCA9IGt2bV90cmFwX2VtdWxfaGFuZGxlX3Jlc19pbnN0LAogCS5oYW5kbGVfYnJlYWsgPSBrdm1fdHJhcF9lbXVsX2hhbmRsZV9icmVhaywKKwkuaGFuZGxlX3RyYXAgPSBrdm1fdHJhcF9lbXVsX2hhbmRsZV90cmFwLAorCS5oYW5kbGVfbXNhX2ZwZSA9IGt2bV90cmFwX2VtdWxfaGFuZGxlX21zYV9mcGUsCisJLmhhbmRsZV9mcGUgPSBrdm1fdHJhcF9lbXVsX2hhbmRsZV9mcGUsCisJLmhhbmRsZV9tc2FfZGlzYWJsZWQgPSBrdm1fdHJhcF9lbXVsX2hhbmRsZV9tc2FfZGlzYWJsZWQsCiAKIAkudm1faW5pdCA9IGt2bV90cmFwX2VtdWxfdm1faW5pdCwKIAkudmNwdV9pbml0ID0ga3ZtX3RyYXBfZW11bF92Y3B1X2luaXQsCkBAIC00ODMsNiArNjYyLDggQEAKIAkuaXJxX2NsZWFyID0ga3ZtX21pcHNfaXJxX2NsZWFyX2NiLAogCS5nZXRfb25lX3JlZyA9IGt2bV90cmFwX2VtdWxfZ2V0X29uZV9yZWcsCiAJLnNldF9vbmVfcmVnID0ga3ZtX3RyYXBfZW11bF9zZXRfb25lX3JlZywKKwkudmNwdV9nZXRfcmVncyA9IGt2bV90cmFwX2VtdWxfdmNwdV9nZXRfcmVncywKKwkudmNwdV9zZXRfcmVncyA9IGt2bV90cmFwX2VtdWxfdmNwdV9zZXRfcmVncywKIH07CiAKIGludCBrdm1fbWlwc19lbXVsYXRpb25faW5pdChzdHJ1Y3Qga3ZtX21pcHNfY2FsbGJhY2tzICoqaW5zdGFsbF9jYWxsYmFja3MpCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbGFzYXQvc3lzY3RsLmMgYi9hcmNoL21pcHMvbGFzYXQvc3lzY3RsLmMKaW5kZXggM2I3ZjY1Yy4uY2Y5YjQ2MzMgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9sYXNhdC9zeXNjdGwuYworKysgYi9hcmNoL21pcHMvbGFzYXQvc3lzY3RsLmMKQEAgLTc1LDExICs3NSwxMSBAQAogaW50IHByb2NfZG9sYXNhdHJ0YyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkgICAgICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHRpbWVzcGVjNjQgdHM7CiAJaW50IHI7CiAKIAlpZiAoIXdyaXRlKSB7Ci0JCXJlYWRfcGVyc2lzdGVudF9jbG9jaygmdHMpOworCQlyZWFkX3BlcnNpc3RlbnRfY2xvY2s2NCgmdHMpOwogCQlydGN0bXAgPSB0cy50dl9zZWM7CiAJCS8qIGNoZWNrIGZvciB0aW1lIDwgMCBhbmQgc2V0IHRvIDAgKi8KIAkJaWYgKHJ0Y3RtcCA8IDApCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9ocGV0LmMgYi9hcmNoL21pcHMvbG9vbmdzb24vbG9vbmdzb24tMy9ocGV0LmMKaW5kZXggZTg5OGQ2OC4uNWMyMWNkMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2xvb25nc29uL2xvb25nc29uLTMvaHBldC5jCisrKyBiL2FyY2gvbWlwcy9sb29uZ3Nvbi9sb29uZ3Nvbi0zL2hwZXQuYwpAQCAtMTYyLDcgKzE2Miw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGhwZXRfaXJxID0gewogCS5oYW5kbGVyID0gaHBldF9pcnFfaGFuZGxlciwKLQkuZmxhZ3MgPSBJUlFGX0RJU0FCTEVEIHwgSVJRRl9OT0JBTEFOQ0lORyB8IElSUUZfVElNRVIsCisJLmZsYWdzID0gSVJRRl9OT0JBTEFOQ0lORyB8IElSUUZfVElNRVIsCiAJLm5hbWUgPSAiaHBldCIsCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvbW0vbW1hcC5jIGIvYXJjaC9taXBzL21tL21tYXAuYwppbmRleCBmMWJhYWRkLi41YzgxZmRkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvbW0vbW1hcC5jCisrKyBiL2FyY2gvbWlwcy9tbS9tbWFwLmMKQEAgLTE0MiwxOCArMTQyLDI2IEBACiAJCQlhZGRyMCwgbGVuLCBwZ29mZiwgZmxhZ3MsIERPV04pOwogfQogCit1bnNpZ25lZCBsb25nIGFyY2hfbW1hcF9ybmQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJuZDsKKworCXJuZCA9ICh1bnNpZ25lZCBsb25nKWdldF9yYW5kb21faW50KCk7CisJcm5kIDw8PSBQQUdFX1NISUZUOworCWlmIChUQVNLX0lTXzMyQklUX0FERFIpCisJCXJuZCAmPSAweGZmZmZmZnVsOworCWVsc2UKKwkJcm5kICY9IDB4ZmZmZmZmZnVsOworCisJcmV0dXJuIHJuZDsKK30KKwogdm9pZCBhcmNoX3BpY2tfbW1hcF9sYXlvdXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJdW5zaWduZWQgbG9uZyByYW5kb21fZmFjdG9yID0gMFVMOwogCi0JaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKSB7Ci0JCXJhbmRvbV9mYWN0b3IgPSBnZXRfcmFuZG9tX2ludCgpOwotCQlyYW5kb21fZmFjdG9yID0gcmFuZG9tX2ZhY3RvciA8PCBQQUdFX1NISUZUOwotCQlpZiAoVEFTS19JU18zMkJJVF9BRERSKQotCQkJcmFuZG9tX2ZhY3RvciAmPSAweGZmZmZmZnVsOwotCQllbHNlCi0JCQlyYW5kb21fZmFjdG9yICY9IDB4ZmZmZmZmZnVsOwotCX0KKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9SQU5ET01JWkUpCisJCXJhbmRvbV9mYWN0b3IgPSBhcmNoX21tYXBfcm5kKCk7CiAKIAlpZiAobW1hcF9pc19sZWdhY3koKSkgewogCQltbS0+bW1hcF9iYXNlID0gVEFTS19VTk1BUFBFRF9CQVNFICsgcmFuZG9tX2ZhY3RvcjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9wY2kvcGNpLmMgYi9hcmNoL21pcHMvcGNpL3BjaS5jCmluZGV4IDFiZjYwYjEuLjhiYjEzYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9wY2kvcGNpLmMKKysrIGIvYXJjaC9taXBzL3BjaS9wY2kuYwpAQCAtOTQsMjcgKzk0LDI5IEBACiAJcGNpX2FkZF9yZXNvdXJjZV9vZmZzZXQoJnJlc291cmNlcywgaG9zZS0+aW9fcmVzb3VyY2UsIGhvc2UtPmlvX29mZnNldCk7CiAJYnVzID0gcGNpX3NjYW5fcm9vdF9idXMoTlVMTCwgbmV4dF9idXNubywgaG9zZS0+cGNpX29wcywgaG9zZSwKIAkJCQkmcmVzb3VyY2VzKTsKLQlpZiAoIWJ1cykKLQkJcGNpX2ZyZWVfcmVzb3VyY2VfbGlzdCgmcmVzb3VyY2VzKTsKLQogCWhvc2UtPmJ1cyA9IGJ1czsKIAogCW5lZWRfZG9tYWluX2luZm8gPSBuZWVkX2RvbWFpbl9pbmZvIHx8IGhvc2UtPmluZGV4OwogCWhvc2UtPm5lZWRfZG9tYWluX2luZm8gPSBuZWVkX2RvbWFpbl9pbmZvOwotCWlmIChidXMpIHsKLQkJbmV4dF9idXNubyA9IGJ1cy0+YnVzbl9yZXMuZW5kICsgMTsKLQkJLyogRG9uJ3QgYWxsb3cgOC1iaXQgYnVzIG51bWJlciBvdmVyZmxvdyBpbnNpZGUgdGhlIGhvc2UgLQotCQkgICByZXNlcnZlIHNvbWUgc3BhY2UgZm9yIGJyaWRnZXMuICovCi0JCWlmIChuZXh0X2J1c25vID4gMjI0KSB7Ci0JCQluZXh0X2J1c25vID0gMDsKLQkJCW5lZWRfZG9tYWluX2luZm8gPSAxOwotCQl9CiAKLQkJaWYgKCFwY2lfaGFzX2ZsYWcoUENJX1BST0JFX09OTFkpKSB7Ci0JCQlwY2lfYnVzX3NpemVfYnJpZGdlcyhidXMpOwotCQkJcGNpX2J1c19hc3NpZ25fcmVzb3VyY2VzKGJ1cyk7Ci0JCX0KKwlpZiAoIWJ1cykgeworCQlwY2lfZnJlZV9yZXNvdXJjZV9saXN0KCZyZXNvdXJjZXMpOworCQlyZXR1cm47CiAJfQorCisJbmV4dF9idXNubyA9IGJ1cy0+YnVzbl9yZXMuZW5kICsgMTsKKwkvKiBEb24ndCBhbGxvdyA4LWJpdCBidXMgbnVtYmVyIG92ZXJmbG93IGluc2lkZSB0aGUgaG9zZSAtCisJICAgcmVzZXJ2ZSBzb21lIHNwYWNlIGZvciBicmlkZ2VzLiAqLworCWlmIChuZXh0X2J1c25vID4gMjI0KSB7CisJCW5leHRfYnVzbm8gPSAwOworCQluZWVkX2RvbWFpbl9pbmZvID0gMTsKKwl9CisKKwlpZiAoIXBjaV9oYXNfZmxhZyhQQ0lfUFJPQkVfT05MWSkpIHsKKwkJcGNpX2J1c19zaXplX2JyaWRnZXMoYnVzKTsKKwkJcGNpX2J1c19hc3NpZ25fcmVzb3VyY2VzKGJ1cyk7CisJfQorCXBjaV9idXNfYWRkX2RldmljZXMoYnVzKTsKIH0KIAogI2lmZGVmIENPTkZJR19PRgpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCBjMWMzNzRmLi40ODYxYTc4IDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtNDAsNyArNDAsNiBAQAogCiBzdHJ1Y3QgdGhyZWFkX2luZm8gewogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJc3RydWN0IHB0X3JlZ3MJCSpmcmFtZTsJCS8qIGN1cnJlbnQgZXhjZXB0aW9uIGZyYW1lICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KIAlfX3UzMgkJCWNwdTsJCS8qIGN1cnJlbnQgQ1BVICovCkBAIC03NCw3ICs3Myw2IEBACiAjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKIHsJCQkJCQlcCiAJLnRhc2sJCT0gJnRzaywJCQlcCi0JLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKIAkuZmxhZ3MJCT0gMCwJCQlcCiAJLmNwdQkJPSAwLAkJCVwKIAkucHJlZW1wdF9jb3VudAk9IElOSVRfUFJFRU1QVF9DT1VOVCwJXApkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGQ3ODA2NzAuLmU1YTYxYzYgMTAwNjQ0Ci0tLSBhL2FyY2gvbW4xMDMwMC9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL21uMTAzMDAva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTIyLDcgKzIyLDYgQEAKIAlCTEFOSygpOwogCiAJT0ZGU0VUKFRJX3Rhc2ssCQkJdGhyZWFkX2luZm8sIHRhc2spOwotCU9GRlNFVChUSV9leGVjX2RvbWFpbiwJCXRocmVhZF9pbmZvLCBleGVjX2RvbWFpbik7CiAJT0ZGU0VUKFRJX2ZyYW1lLAkJdGhyZWFkX2luZm8sIGZyYW1lKTsKIAlPRkZTRVQoVElfZmxhZ3MsCQl0aHJlYWRfaW5mbywgZmxhZ3MpOwogCU9GRlNFVChUSV9jcHUsCQkJdGhyZWFkX2luZm8sIGNwdSk7CkBAIC04NSw3ICs4NCw2IEBACiAJREVGSU5FKFNJR0NITERfYXNtLAkJU0lHQ0hMRCk7CiAJQkxBTksoKTsKIAotCU9GRlNFVChFWEVDX0RPTUFJTl9oYW5kbGVyLAlleGVjX2RvbWFpbiwgaGFuZGxlcik7CiAJT0ZGU0VUKFJUX1NJR0ZSQU1FX3NpZ2NvbnRleHQsCXJ0X3NpZ2ZyYW1lLCB1Yy51Y19tY29udGV4dCk7CiAKIAlERUZJTkUoUEFHRV9TSVpFX2FzbSwJCVBBR0VfU0laRSk7CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9tbjEwMzAwL2tlcm5lbC9zaWduYWwuYwppbmRleCA4NjA5ODQ1Li5kZmQwMzAxIDEwMDY0NAotLS0gYS9hcmNoL21uMTAzMDAva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gvbW4xMDMwMC9rZXJuZWwvc2lnbmFsLmMKQEAgLTIwMiwyMCArMjAyLDE0IEBACiAJCSAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICpmcmFtZTsKLQlpbnQgcnNpZywgc2lnID0ga3NpZy0+c2lnOworCWludCBzaWcgPSBrc2lnLT5zaWc7CiAKIAlmcmFtZSA9IGdldF9zaWdmcmFtZShrc2lnLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcnNpZyA9IHNpZzsKLQlpZiAoc2lnIDwgMzIgJiYKLQkgICAgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbiAmJgotCSAgICBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwKQotCQlyc2lnID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddOwotCi0JaWYgKF9fcHV0X3VzZXIocnNpZywgJmZyYW1lLT5zaWcpIDwgMCB8fAorCWlmIChfX3B1dF91c2VyKHNpZywgJmZyYW1lLT5zaWcpIDwgMCB8fAogCSAgICBfX3B1dF91c2VyKCZmcmFtZS0+c2MsICZmcmFtZS0+cHNjKSA8IDApCiAJCXJldHVybiAtRUZBVUxUOwogCkBAIC0yNzAsMjAgKzI2NCwxNCBAQAogCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKLQlpbnQgcnNpZywgc2lnID0ga3NpZy0+c2lnOworCWludCBzaWcgPSBrc2lnLT5zaWc7CiAKIAlmcmFtZSA9IGdldF9zaWdmcmFtZShrc2lnLCByZWdzLCBzaXplb2YoKmZyYW1lKSk7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcnNpZyA9IHNpZzsKLQlpZiAoc2lnIDwgMzIgJiYKLQkgICAgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbiAmJgotCSAgICBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwKQotCQlyc2lnID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddOwotCi0JaWYgKF9fcHV0X3VzZXIocnNpZywgJmZyYW1lLT5zaWcpIHx8CisJaWYgKF9fcHV0X3VzZXIoc2lnLCAmZnJhbWUtPnNpZykgfHwKIAkgICAgX19wdXRfdXNlcigmZnJhbWUtPmluZm8sICZmcmFtZS0+cGluZm8pIHx8CiAJICAgIF9fcHV0X3VzZXIoJmZyYW1lLT51YywgJmZyYW1lLT5wdWMpIHx8CiAJICAgIGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgJmtzaWctPmluZm8pKQpkaWZmIC0tZ2l0IGEvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS9wY2kuYyBiL2FyY2gvbW4xMDMwMC91bml0LWFzYjIzMDUvcGNpLmMKaW5kZXggNjEzY2ExZS4uM2RmZTJkMyAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL3VuaXQtYXNiMjMwNS9wY2kuYworKysgYi9hcmNoL21uMTAzMDAvdW5pdC1hc2IyMzA1L3BjaS5jCkBAIC0zNDIsNiArMzQyLDcgQEAKIHsKIAlyZXNvdXJjZV9zaXplX3QgaW9fb2Zmc2V0LCBtZW1fb2Zmc2V0OwogCUxJU1RfSEVBRChyZXNvdXJjZXMpOworCXN0cnVjdCBwY2lfYnVzICpidXM7CiAKIAlpb3BvcnRfcmVzb3VyY2Uuc3RhcnQJPSAweEEwMDAwMDAwOwogCWlvcG9ydF9yZXNvdXJjZS5lbmQJPSAweERGRkZGRkZGOwpAQCAtMzcxLDExICszNzIsMTQgQEAKIAogCXBjaV9hZGRfcmVzb3VyY2Vfb2Zmc2V0KCZyZXNvdXJjZXMsICZwY2lfaW9wb3J0X3Jlc291cmNlLCBpb19vZmZzZXQpOwogCXBjaV9hZGRfcmVzb3VyY2Vfb2Zmc2V0KCZyZXNvdXJjZXMsICZwY2lfaW9tZW1fcmVzb3VyY2UsIG1lbV9vZmZzZXQpOwotCXBjaV9zY2FuX3Jvb3RfYnVzKE5VTEwsIDAsICZwY2lfZGlyZWN0X2FtcGNpLCBOVUxMLCAmcmVzb3VyY2VzKTsKKwlidXMgPSBwY2lfc2Nhbl9yb290X2J1cyhOVUxMLCAwLCAmcGNpX2RpcmVjdF9hbXBjaSwgTlVMTCwgJnJlc291cmNlcyk7CisJaWYgKCFidXMpCisJCXJldHVybiAwOwogCiAJcGNpYmlvc19pcnFfaW5pdCgpOwogCXBjaWJpb3NfZml4dXBfaXJxcygpOwogCXBjaWJpb3NfcmVzb3VyY2Vfc3VydmV5KCk7CisJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL25pb3MyL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL25pb3MyL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggMWYyNjY1Ny4uZDY5YzMzOCAxMDA2NDQKLS0tIGEvYXJjaC9uaW9zMi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvbmlvczIvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMzksNyArMzksNiBAQAogICovCiBzdHJ1Y3QgdGhyZWFkX2luZm8gewogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KIAlfX3UzMgkJCWNwdTsJCS8qIGN1cnJlbnQgQ1BVICovCiAJaW50CQkJcHJlZW1wdF9jb3VudDsJLyogMCA9PiBwcmVlbXB0YWJsZSw8MCA9PiBCVUcgKi8KQEAgLTQ3LDcgKzQ2LDYgQEAKIAkJCQkJCSAgMC0weDdGRkZGRkZGIGZvciB1c2VyLXRoZWFkCiAJCQkJCQkgIDAtMHhGRkZGRkZGRiBmb3Iga2VybmVsLXRocmVhZAogCQkJCQkJKi8KLQlzdHJ1Y3QgcmVzdGFydF9ibG9jawlyZXN0YXJ0X2Jsb2NrOwogCXN0cnVjdCBwdF9yZWdzCQkqcmVnczsKIH07CiAKQEAgLTU5LDE0ICs1NywxMCBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCiB7CQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJXAotCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAlcCiAJLmZsYWdzCQk9IDAsCQkJXAogCS5jcHUJCT0gMCwJCQlcCiAJLnByZWVtcHRfY291bnQJPSBJTklUX1BSRUVNUFRfQ09VTlQsCVwKIAkuYWRkcl9saW1pdAk9IEtFUk5FTF9EUywJCVwKLQkucmVzdGFydF9ibG9jawk9IHsJCQlcCi0JCS5mbiA9IGRvX25vX3Jlc3RhcnRfc3lzY2FsbCwJXAotCX0sCQkJCQlcCiB9CiAKICNkZWZpbmUgaW5pdF90aHJlYWRfaW5mbwkoaW5pdF90aHJlYWRfdW5pb24udGhyZWFkX2luZm8pCmRpZmYgLS1naXQgYS9hcmNoL25pb3MyL2luY2x1ZGUvdWFwaS9hc20vS2J1aWxkIGIvYXJjaC9uaW9zMi9pbmNsdWRlL3VhcGkvYXNtL0tidWlsZAppbmRleCAzNzYxMzExOS4uZTBiYjk3MiAxMDA2NDQKLS0tIGEvYXJjaC9uaW9zMi9pbmNsdWRlL3VhcGkvYXNtL0tidWlsZAorKysgYi9hcmNoL25pb3MyL2luY2x1ZGUvdWFwaS9hc20vS2J1aWxkCkBAIC0xLDYgKzEsNSBAQAogaW5jbHVkZSBpbmNsdWRlL3VhcGkvYXNtLWdlbmVyaWMvS2J1aWxkLmFzbQogCiBoZWFkZXIteSArPSBlbGYuaAotaGVhZGVyLXkgKz0gdWNvbnRleHQuaAogCiBnZW5lcmljLXkgKz0gdWNvbnRleHQuaApkaWZmIC0tZ2l0IGEvYXJjaC9uaW9zMi9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS5oIGIvYXJjaC9uaW9zMi9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS5oCmluZGV4IDcxYTMzMDUuLmVmZjAwZTY3IDEwMDY0NAotLS0gYS9hcmNoL25pb3MyL2luY2x1ZGUvdWFwaS9hc20vcHRyYWNlLmgKKysrIGIvYXJjaC9uaW9zMi9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS5oCkBAIC02MCwxMiArNjAsMTcgQEAKICNkZWZpbmUgUFRSX0lQRU5ESU5HCTM3CiAjZGVmaW5lIFBUUl9DUFVJRAkzOAogI2RlZmluZSBQVFJfQ1RMNgkzOQotI2RlZmluZSBQVFJfQ1RMNwk0MAorI2RlZmluZSBQVFJfRVhDRVBUSU9OCTQwCiAjZGVmaW5lIFBUUl9QVEVBRERSCTQxCiAjZGVmaW5lIFBUUl9UTEJBQ0MJNDIKICNkZWZpbmUgUFRSX1RMQk1JU0MJNDMKKyNkZWZpbmUgUFRSX0VDQ0lOSgk0NAorI2RlZmluZSBQVFJfQkFEQUREUgk0NQorI2RlZmluZSBQVFJfQ09ORklHCTQ2CisjZGVmaW5lIFBUUl9NUFVCQVNFCTQ3CisjZGVmaW5lIFBUUl9NUFVBQ0MJNDgKIAotI2RlZmluZSBOVU1fUFRSQUNFX1JFRyAoUFRSX1RMQk1JU0MgKyAxKQorI2RlZmluZSBOVU1fUFRSQUNFX1JFRyAoUFRSX01QVUFDQyArIDEpCiAKIC8qIFVzZXIgc3RydWN0dXJlcyBmb3IgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycy4gICovCiBzdHJ1Y3QgdXNlcl9wdF9yZWdzIHsKZGlmZiAtLWdpdCBhL2FyY2gvbmlvczIva2VybmVsL2NwdWluZm8uYyBiL2FyY2gvbmlvczIva2VybmVsL2NwdWluZm8uYwppbmRleCBhMjIzNjkxZC4uMWQ5NmRlMCAxMDA2NDQKLS0tIGEvYXJjaC9uaW9zMi9rZXJuZWwvY3B1aW5mby5jCisrKyBiL2FyY2gvbmlvczIva2VybmVsL2NwdWluZm8uYwpAQCAtMTI2LDQ3ICsxMjYsNDYgQEAKICAqLwogc3RhdGljIGludCBzaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCWludCBjb3VudCA9IDA7CiAJY29uc3QgdTMyIGNsb2NrZnJlcSA9IGNwdWluZm8uY3B1X2Nsb2NrX2ZyZXE7CiAKLQljb3VudCA9IHNlcV9wcmludGYobSwKLQkJCSJDUFU6XHRcdE5pb3MgSUkvJXNcbiIKLQkJCSJNTVU6XHRcdCVzXG4iCi0JCQkiRlBVOlx0XHRub25lXG4iCi0JCQkiQ2xvY2tpbmc6XHQldS4lMDJ1IE1IelxuIgotCQkJIkJvZ29NaXBzOlx0JWx1LiUwMmx1XG4iCi0JCQkiQ2FsaWJyYXRpb246XHQlbHUgbG9vcHNcbiIsCi0JCQljcHVpbmZvLmNwdV9pbXBsLAotCQkJY3B1aW5mby5tbXUgPyAicHJlc2VudCIgOiAibm9uZSIsCi0JCQljbG9ja2ZyZXEgLyAxMDAwMDAwLCAoY2xvY2tmcmVxIC8gMTAwMDAwKSAlIDEwLAotCQkJKGxvb3BzX3Blcl9qaWZmeSAqIEhaKSAvIDUwMDAwMCwKLQkJCSgobG9vcHNfcGVyX2ppZmZ5ICogSFopIC8gNTAwMCkgJSAxMDAsCi0JCQkobG9vcHNfcGVyX2ppZmZ5ICogSFopKTsKKwlzZXFfcHJpbnRmKG0sCisJCSAgICJDUFU6XHRcdE5pb3MgSUkvJXNcbiIKKwkJICAgIk1NVTpcdFx0JXNcbiIKKwkJICAgIkZQVTpcdFx0bm9uZVxuIgorCQkgICAiQ2xvY2tpbmc6XHQldS4lMDJ1IE1IelxuIgorCQkgICAiQm9nb01pcHM6XHQlbHUuJTAybHVcbiIKKwkJICAgIkNhbGlicmF0aW9uOlx0JWx1IGxvb3BzXG4iLAorCQkgICBjcHVpbmZvLmNwdV9pbXBsLAorCQkgICBjcHVpbmZvLm1tdSA/ICJwcmVzZW50IiA6ICJub25lIiwKKwkJICAgY2xvY2tmcmVxIC8gMTAwMDAwMCwgKGNsb2NrZnJlcSAvIDEwMDAwMCkgJSAxMCwKKwkJICAgKGxvb3BzX3Blcl9qaWZmeSAqIEhaKSAvIDUwMDAwMCwKKwkJICAgKChsb29wc19wZXJfamlmZnkgKiBIWikgLyA1MDAwKSAlIDEwMCwKKwkJICAgKGxvb3BzX3Blcl9qaWZmeSAqIEhaKSk7CiAKLQljb3VudCArPSBzZXFfcHJpbnRmKG0sCi0JCQkiSFc6XG4iCi0JCQkiIE1VTDpcdFx0JXNcbiIKLQkJCSIgTVVMWDpcdFx0JXNcbiIKLQkJCSIgRElWOlx0XHQlc1xuIiwKLQkJCWNwdWluZm8uaGFzX211bCA/ICJ5ZXMiIDogIm5vIiwKLQkJCWNwdWluZm8uaGFzX211bHggPyAieWVzIiA6ICJubyIsCi0JCQljcHVpbmZvLmhhc19kaXYgPyAieWVzIiA6ICJubyIpOworCXNlcV9wcmludGYobSwKKwkJICAgIkhXOlxuIgorCQkgICAiIE1VTDpcdFx0JXNcbiIKKwkJICAgIiBNVUxYOlx0XHQlc1xuIgorCQkgICAiIERJVjpcdFx0JXNcbiIsCisJCSAgIGNwdWluZm8uaGFzX211bCA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgY3B1aW5mby5oYXNfbXVseCA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgY3B1aW5mby5oYXNfZGl2ID8gInllcyIgOiAibm8iKTsKIAotCWNvdW50ICs9IHNlcV9wcmludGYobSwKLQkJCSJJY2FjaGU6XHRcdCV1a0IsIGxpbmUgbGVuZ3RoOiAldVxuIiwKLQkJCWNwdWluZm8uaWNhY2hlX3NpemUgPj4gMTAsCi0JCQljcHVpbmZvLmljYWNoZV9saW5lX3NpemUpOworCXNlcV9wcmludGYobSwKKwkJICAgIkljYWNoZTpcdFx0JXVrQiwgbGluZSBsZW5ndGg6ICV1XG4iLAorCQkgICBjcHVpbmZvLmljYWNoZV9zaXplID4+IDEwLAorCQkgICBjcHVpbmZvLmljYWNoZV9saW5lX3NpemUpOwogCi0JY291bnQgKz0gc2VxX3ByaW50ZihtLAotCQkJIkRjYWNoZTpcdFx0JXVrQiwgbGluZSBsZW5ndGg6ICV1XG4iLAotCQkJY3B1aW5mby5kY2FjaGVfc2l6ZSA+PiAxMCwKLQkJCWNwdWluZm8uZGNhY2hlX2xpbmVfc2l6ZSk7CisJc2VxX3ByaW50ZihtLAorCQkgICAiRGNhY2hlOlx0XHQldWtCLCBsaW5lIGxlbmd0aDogJXVcbiIsCisJCSAgIGNwdWluZm8uZGNhY2hlX3NpemUgPj4gMTAsCisJCSAgIGNwdWluZm8uZGNhY2hlX2xpbmVfc2l6ZSk7CiAKLQljb3VudCArPSBzZXFfcHJpbnRmKG0sCi0JCQkiVExCOlx0XHQldSB3YXlzLCAldSBlbnRyaWVzLCAldSBQSUQgYml0c1xuIiwKLQkJCWNwdWluZm8udGxiX251bV93YXlzLAotCQkJY3B1aW5mby50bGJfbnVtX2VudHJpZXMsCi0JCQljcHVpbmZvLnRsYl9waWRfbnVtX2JpdHMpOworCXNlcV9wcmludGYobSwKKwkJICAgIlRMQjpcdFx0JXUgd2F5cywgJXUgZW50cmllcywgJXUgUElEIGJpdHNcbiIsCisJCSAgIGNwdWluZm8udGxiX251bV93YXlzLAorCQkgICBjcHVpbmZvLnRsYl9udW1fZW50cmllcywKKwkJICAgY3B1aW5mby50bGJfcGlkX251bV9iaXRzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9uaW9zMi9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbmlvczIva2VybmVsL2VudHJ5LlMKaW5kZXggNzcyOWJkMy4uMjdiMDA2YyAxMDA2NDQKLS0tIGEvYXJjaC9uaW9zMi9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL25pb3MyL2tlcm5lbC9lbnRyeS5TCkBAIC0xNjEsNyArMTYxLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCiBFTlRSWShoYW5kbGVfdHJhcCkKLQlsZHcJcjI0LCAtNChlYSkJLyogaW5zdHJ1Y3Rpb24gdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiAqLworCWxkd2lvCXIyNCwgLTQoZWEpCS8qIGluc3RydWN0aW9uIHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24gKi8KIAlzcmxpCXIyNCwgcjI0LCA0CiAJYW5kaQlyMjQsIHIyNCwgMHg3YwogCW1vdmlhCXI5LHRyYXBfdGFibGUKZGlmZiAtLWdpdCBhL2FyY2gvbmlvczIva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbmlvczIva2VybmVsL3Byb2Nlc3MuYwppbmRleCAwZTA3NWI1Li4yZjhjNzRmIDEwMDY0NAotLS0gYS9hcmNoL25pb3MyL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9uaW9zMi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC05NCw3ICs5NCw2IEBACiAKIHZvaWQgZmx1c2hfdGhyZWFkKHZvaWQpCiB7Ci0Jc2V0X2ZzKFVTRVJfRFMpOwogfQogCiBpbnQgY29weV90aHJlYWQodW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywKZGlmZiAtLWdpdCBhL2FyY2gvbmlvczIva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9uaW9zMi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggZGRhNDFlNC4uMjA2NjJiMCAxMDA2NDQKLS0tIGEvYXJjaC9uaW9zMi9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9uaW9zMi9rZXJuZWwvc2lnbmFsLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAlpbnQgZXJyOwogCiAJLyogQWx3YXlzIG1ha2UgYW55IHBlbmRpbmcgcmVzdGFydGVkIHN5c3RlbSBjYWxscyByZXR1cm4gLUVJTlRSICovCi0JY3VycmVudF90aHJlYWRfaW5mbygpLT5yZXN0YXJ0X2Jsb2NrLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOworCWN1cnJlbnQtPnJlc3RhcnRfYmxvY2suZm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CiAKIAllcnIgPSBfX2dldF91c2VyKHRlbXAsICZ1Yy0+dWNfbWNvbnRleHQudmVyc2lvbik7CiAJaWYgKHRlbXAgIT0gTUNPTlRFWFRfVkVSU0lPTikKZGlmZiAtLWdpdCBhL2FyY2gvbmlvczIvbW0vY2FjaGVmbHVzaC5jIGIvYXJjaC9uaW9zMi9tbS9jYWNoZWZsdXNoLmMKaW5kZXggMmFlNDgyYjQuLjc5NjY0MjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbmlvczIvbW0vY2FjaGVmbHVzaC5jCisrKyBiL2FyY2gvbmlvczIvbW0vY2FjaGVmbHVzaC5jCkBAIC0yMyw5ICsyMyw2IEBACiAJZW5kICs9IChjcHVpbmZvLmRjYWNoZV9saW5lX3NpemUgLSAxKTsKIAllbmQgJj0gfihjcHVpbmZvLmRjYWNoZV9saW5lX3NpemUgLSAxKTsKIAotCWlmIChlbmQgPiBzdGFydCArIGNwdWluZm8uZGNhY2hlX3NpemUpCi0JCWVuZCA9IHN0YXJ0ICsgY3B1aW5mby5kY2FjaGVfc2l6ZTsKLQogCWZvciAoYWRkciA9IHN0YXJ0OyBhZGRyIDwgZW5kOyBhZGRyICs9IGNwdWluZm8uZGNhY2hlX2xpbmVfc2l6ZSkgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIiAgIGZsdXNoZGEgMCglMClcbiIKIAkJCQkJOiAvKiBPdXRwdXRzICovCmRpZmYgLS1naXQgYS9hcmNoL25pb3MyL21tL2ZhdWx0LmMgYi9hcmNoL25pb3MyL21tL2ZhdWx0LmMKaW5kZXggMGQyMzFhZC4uMGM5YjZhZiAxMDA2NDQKLS0tIGEvYXJjaC9uaW9zMi9tbS9mYXVsdC5jCisrKyBiL2FyY2gvbmlvczIvbW0vZmF1bHQuYwpAQCAtMTI2LDcgKzEyNiw2IEBACiAJCWJyZWFrOwogCX0KIAotc3Vydml2ZToKIAkvKgogCSAqIElmIGZvciBhbnkgcmVhc29uIGF0IGFsbCB3ZSBjb3VsZG4ndCBoYW5kbGUgdGhlIGZhdWx0LAogCSAqIG1ha2Ugc3VyZSB3ZSBleGl0IGdyYWNlZnVsbHkgcmF0aGVyIHRoYW4gZW5kbGVzc2x5IHJlZG8KQEAgLTIyMCwxMSArMjE5LDYgQEAKICAqLwogb3V0X29mX21lbW9yeToKIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCWlmIChpc19nbG9iYWxfaW5pdCh0c2spKSB7Ci0JCXlpZWxkKCk7Ci0JCWRvd25fcmVhZCgmbW0tPm1tYXBfc2VtKTsKLQkJZ290byBzdXJ2aXZlOwotCX0KIAlpZiAoIXVzZXJfbW9kZShyZWdzKSkKIAkJZ290byBub19jb250ZXh0OwogCXBhZ2VmYXVsdF9vdXRfb2ZfbWVtb3J5KCk7CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggODc1ZjA4NC4uNmU2MTlhNyAxMDA2NDQKLS0tIGEvYXJjaC9vcGVucmlzYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtNDgsNyArNDgsNiBAQAogCiBzdHJ1Y3QgdGhyZWFkX2luZm8gewogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KIAlfX3UzMgkJCWNwdTsJCS8qIGN1cnJlbnQgQ1BVICovCiAJX19zMzIJCQlwcmVlbXB0X2NvdW50OyAvKiAwID0+IHByZWVtcHRhYmxlLCA8MCA9PiBCVUcgKi8KQEAgLTczLDcgKzcyLDYgQEAKICNkZWZpbmUgSU5JVF9USFJFQURfSU5GTyh0c2spCQkJCVwKIHsJCQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJCVwKLQkuZXhlY19kb21haW4JPSAmZGVmYXVsdF9leGVjX2RvbWFpbiwJCVwKIAkuZmxhZ3MJCT0gMCwJCQkJXAogCS5jcHUJCT0gMCwJCQkJXAogCS5wcmVlbXB0X2NvdW50CT0gMSwJCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDM4NmFmMjUuLjcwOTVkZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvb3BlbnJpc2Mva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE5Nyw3ICsxOTcsNiBAQAogewogCXVuc2lnbmVkIGxvbmcgc3IgPSBtZnNwcihTUFJfU1IpICYgflNQUl9TUl9TTTsKIAotCXNldF9mcyhVU0VSX0RTKTsKIAltZW1zZXQocmVncywgMCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CiAKIAlyZWdzLT5wYyA9IHBjOwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL3NldHVwLmMKaW5kZXggNGZjN2NjYy4uYjRlZDhiMyAxMDA2NDQKLS0tIGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9zZXR1cC5jCkBAIC0zMjksMzAgKzMyOSwzMiBAQAogCXZlcnNpb24gPSAodnIgJiBTUFJfVlJfVkVSKSA+PiAyNDsKIAlyZXZpc2lvbiA9IHZyICYgU1BSX1ZSX1JFVjsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sCi0JCQkgICJjcHVcdFx0OiBPcGVuUklTQy0leFxuIgotCQkJICAicmV2aXNpb25cdDogJWRcbiIKLQkJCSAgImZyZXF1ZW5jeVx0OiAlbGRcbiIKLQkJCSAgImRjYWNoZSBzaXplXHQ6ICVkIGJ5dGVzXG4iCi0JCQkgICJkY2FjaGUgYmxvY2sgc2l6ZVx0OiAlZCBieXRlc1xuIgotCQkJICAiaWNhY2hlIHNpemVcdDogJWQgYnl0ZXNcbiIKLQkJCSAgImljYWNoZSBibG9jayBzaXplXHQ6ICVkIGJ5dGVzXG4iCi0JCQkgICJpbW11XHRcdDogJWQgZW50cmllcywgJWx1IHdheXNcbiIKLQkJCSAgImRtbXVcdFx0OiAlZCBlbnRyaWVzLCAlbHUgd2F5c1xuIgotCQkJICAiYm9nb21pcHNcdDogJWx1LiUwMmx1XG4iLAotCQkJICB2ZXJzaW9uLAotCQkJICByZXZpc2lvbiwKLQkJCSAgbG9vcHNfcGVyX2ppZmZ5ICogSFosCi0JCQkgIGNwdWluZm8uZGNhY2hlX3NpemUsCi0JCQkgIGNwdWluZm8uZGNhY2hlX2Jsb2NrX3NpemUsCi0JCQkgIGNwdWluZm8uaWNhY2hlX3NpemUsCi0JCQkgIGNwdWluZm8uaWNhY2hlX2Jsb2NrX3NpemUsCi0JCQkgIDEgPDwgKChtZnNwcihTUFJfRE1NVUNGR1IpICYgU1BSX0RNTVVDRkdSX05UUykgPj4gMiksCi0JCQkgIDEgKyAobWZzcHIoU1BSX0RNTVVDRkdSKSAmIFNQUl9ETU1VQ0ZHUl9OVFcpLAotCQkJICAxIDw8ICgobWZzcHIoU1BSX0lNTVVDRkdSKSAmIFNQUl9JTU1VQ0ZHUl9OVFMpID4+IDIpLAotCQkJICAxICsgKG1mc3ByKFNQUl9JTU1VQ0ZHUikgJiBTUFJfSU1NVUNGR1JfTlRXKSwKLQkJCSAgKGxvb3BzX3Blcl9qaWZmeSAqIEhaKSAvIDUwMDAwMCwKLQkJCSAgKChsb29wc19wZXJfamlmZnkgKiBIWikgLyA1MDAwKSAlIDEwMCk7CisJc2VxX3ByaW50ZihtLAorCQkgICAiY3B1XHRcdDogT3BlblJJU0MtJXhcbiIKKwkJICAgInJldmlzaW9uXHQ6ICVkXG4iCisJCSAgICJmcmVxdWVuY3lcdDogJWxkXG4iCisJCSAgICJkY2FjaGUgc2l6ZVx0OiAlZCBieXRlc1xuIgorCQkgICAiZGNhY2hlIGJsb2NrIHNpemVcdDogJWQgYnl0ZXNcbiIKKwkJICAgImljYWNoZSBzaXplXHQ6ICVkIGJ5dGVzXG4iCisJCSAgICJpY2FjaGUgYmxvY2sgc2l6ZVx0OiAlZCBieXRlc1xuIgorCQkgICAiaW1tdVx0XHQ6ICVkIGVudHJpZXMsICVsdSB3YXlzXG4iCisJCSAgICJkbW11XHRcdDogJWQgZW50cmllcywgJWx1IHdheXNcbiIKKwkJICAgImJvZ29taXBzXHQ6ICVsdS4lMDJsdVxuIiwKKwkJICAgdmVyc2lvbiwKKwkJICAgcmV2aXNpb24sCisJCSAgIGxvb3BzX3Blcl9qaWZmeSAqIEhaLAorCQkgICBjcHVpbmZvLmRjYWNoZV9zaXplLAorCQkgICBjcHVpbmZvLmRjYWNoZV9ibG9ja19zaXplLAorCQkgICBjcHVpbmZvLmljYWNoZV9zaXplLAorCQkgICBjcHVpbmZvLmljYWNoZV9ibG9ja19zaXplLAorCQkgICAxIDw8ICgobWZzcHIoU1BSX0RNTVVDRkdSKSAmIFNQUl9ETU1VQ0ZHUl9OVFMpID4+IDIpLAorCQkgICAxICsgKG1mc3ByKFNQUl9ETU1VQ0ZHUikgJiBTUFJfRE1NVUNGR1JfTlRXKSwKKwkJICAgMSA8PCAoKG1mc3ByKFNQUl9JTU1VQ0ZHUikgJiBTUFJfSU1NVUNGR1JfTlRTKSA+PiAyKSwKKwkJICAgMSArIChtZnNwcihTUFJfSU1NVUNGR1IpICYgU1BSX0lNTVVDRkdSX05UVyksCisJCSAgIChsb29wc19wZXJfamlmZnkgKiBIWikgLyA1MDAwMDAsCisJCSAgICgobG9vcHNfcGVyX2ppZmZ5ICogSFopIC8gNTAwMCkgJSAxMDApOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkICpjX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICogcG9zKQpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9zaWduYWwuYwppbmRleCA0MTEyMTc1Yi4uYzgyYmU2OSAxMDA2NDQKLS0tIGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvc2lnbmFsLmMKQEAgLTE5Myw4ICsxOTMsNiBAQAogCWlmIChlcnIpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JLyogVE9ETyB3aGF0IGlzIHRoZSBjdXJyZW50LT5leGVjX2RvbWFpbiBzdHVmZiBhbmQgaW52bWFwID8gKi8KLQogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCiAJcmVncy0+cGMgPSAodW5zaWduZWQgbG9uZylrc2lnLT5rYS5zYS5zYV9oYW5kbGVyOyAvKiB3aGF0IHdlIGVudGVyIE5PVyAqLwogCXJlZ3MtPmdwcls5XSA9ICh1bnNpZ25lZCBsb25nKXJldHVybl9pcDsgICAgIC8qIHdoYXQgd2UgZW50ZXIgTEFURVIgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL0tjb25maWcgYi9hcmNoL3BhcmlzYy9LY29uZmlnCmluZGV4IDgwMTQ3MjcuLmMzNjU0NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL0tjb25maWcKKysrIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwpAQCAtMTAzLDYgKzEwMywxMSBAQAogCWRlcGVuZHMgb24gQlJPS0VOCiAJZGVmYXVsdCB5CiAKK2NvbmZpZyBQR1RBQkxFX0xFVkVMUworCWludAorCWRlZmF1bHQgMyBpZiA2NEJJVCAmJiBQQVJJU0NfUEFHRV9TSVpFXzRLQgorCWRlZmF1bHQgMgorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogc291cmNlICJrZXJuZWwvS2NvbmZpZy5mcmVlemVyIgpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcGdhbGxvYy5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcGdhbGxvYy5oCmluZGV4IGYyMTNmNWIuLjFiYTI5MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3BnYWxsb2MuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKQEAgLTI2LDcgKzI2LDcgQEAKIAogCWlmIChsaWtlbHkocGdkICE9IE5VTEwpKSB7CiAJCW1lbXNldChwZ2QsIDAsIFBBR0VfU0laRTw8UEdEX0FMTE9DX09SREVSKTsKLSNpZmRlZiBDT05GSUdfNjRCSVQKKyNpZiBQVF9OTEVWRUxTID09IDMKIAkJYWN0dWFsX3BnZCArPSBQVFJTX1BFUl9QR0Q7CiAJCS8qIFBvcHVsYXRlIGZpcnN0IHBtZCB3aXRoIGFsbG9jYXRlZCBtZW1vcnkuICBXZSBtYXJrIGl0CiAJCSAqIHdpdGggUHhEX0ZMQUdfQVRUQUNIRUQgYXMgYSBzaWduYWwgdG8gdGhlIHN5c3RlbSB0aGF0IHRoaXMKQEAgLTQ1LDEzICs0NSwxMyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCiB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCisjaWYgUFRfTkxFVkVMUyA9PSAzCiAJcGdkIC09IFBUUlNfUEVSX1BHRDsKICNlbmRpZgogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcGdkLCBQR0RfQUxMT0NfT1JERVIpOwogfQogCi0jaWYgUFRfTkxFVkVMUyA9PSAzCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDMKIAogLyogVGhyZWUgTGV2ZWwgUGFnZSBUYWJsZSBTdXBwb3J0IGZvciBwbWQncyAqLwogCkBAIC03MiwxMiArNzIsMTUgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHBtZF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kKQogewotI2lmZGVmIENPTkZJR182NEJJVAogCWlmKHBtZF9mbGFnKCpwbWQpICYgUHhEX0ZMQUdfQVRUQUNIRUQpCi0JCS8qIFRoaXMgaXMgdGhlIHBlcm1hbmVudCBwbWQgYXR0YWNoZWQgdG8gdGhlIHBnZDsKLQkJICogY2Fubm90IGZyZWUgaXQgKi8KKwkJLyoKKwkJICogVGhpcyBpcyB0aGUgcGVybWFuZW50IHBtZCBhdHRhY2hlZCB0byB0aGUgcGdkOworCQkgKiBjYW5ub3QgZnJlZSBpdC4KKwkJICogSW5jcmVtZW50IHRoZSBjb3VudGVyIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBkZWNyZW1lbnQKKwkJICogZG9uZSBieSBnZW5lcmljIG1tIGNvZGUuCisJCSAqLworCQltbV9pbmNfbnJfcG1kcyhtbSk7CiAJCXJldHVybjsKLSNlbmRpZgogCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcG1kLCBQTURfT1JERVIpOwogfQogCkBAIC05OSw3ICsxMDIsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBwbWRfcG9wdWxhdGVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwbWRfdCAqcG1kLCBwdGVfdCAqcHRlKQogewotI2lmZGVmIENPTkZJR182NEJJVAorI2lmIFBUX05MRVZFTFMgPT0gMwogCS8qIHByZXNlcnZlIHRoZSBnYXRld2F5IG1hcmtlciBpZiB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YKIAkgKiB0aGUgcGVybWFuZW50IHBtZCAqLwogCWlmKHBtZF9mbGFnKCpwbWQpICYgUHhEX0ZMQUdfQVRUQUNIRUQpCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKaW5kZXggMTUyMDdiOS4uMGExODM3NSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtNjgsMTMgKzY4LDExIEBACiAjZGVmaW5lIEtFUk5FTF9JTklUSUFMX09SREVSCTI0CS8qIDAgdG8gMTw8MjQgPSAxNk1CICovCiAjZGVmaW5lIEtFUk5FTF9JTklUSUFMX1NJWkUJKDEgPDwgS0VSTkVMX0lOSVRJQUxfT1JERVIpCiAKLSNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgZGVmaW5lZChDT05GSUdfUEFSSVNDX1BBR0VfU0laRV80S0IpCi0jZGVmaW5lIFBUX05MRVZFTFMJMworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSAzCiAjZGVmaW5lIFBHRF9PUkRFUgkxIC8qIE51bWJlciBvZiBwYWdlcyBwZXIgcGdkICovCiAjZGVmaW5lIFBNRF9PUkRFUgkxIC8qIE51bWJlciBvZiBwYWdlcyBwZXIgcG1kICovCiAjZGVmaW5lIFBHRF9BTExPQ19PUkRFUgkyIC8qIGZpcnN0IHBnZCBjb250YWlucyBwbWQgKi8KICNlbHNlCi0jZGVmaW5lIFBUX05MRVZFTFMJMgogI2RlZmluZSBQR0RfT1JERVIJMSAvKiBOdW1iZXIgb2YgcGFnZXMgcGVyIHBnZCAqLwogI2RlZmluZSBQR0RfQUxMT0NfT1JERVIJUEdEX09SREVSCiAjZW5kaWYKQEAgLTkzLDcgKzkxLDcgQEAKICNkZWZpbmUgUE1EX1NISUZUICAgICAgIChQTERfU0hJRlQgKyBCSVRTX1BFUl9QVEUpCiAjZGVmaW5lIFBNRF9TSVpFCSgxVUwgPDwgUE1EX1NISUZUKQogI2RlZmluZSBQTURfTUFTSwkofihQTURfU0laRS0xKSkKLSNpZiBQVF9OTEVWRUxTID09IDMKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gMwogI2RlZmluZSBCSVRTX1BFUl9QTUQJKFBBR0VfU0hJRlQgKyBQTURfT1JERVIgLSBCSVRTX1BFUl9QTURfRU5UUlkpCiAjZWxzZQogI2RlZmluZSBfX1BBR0VUQUJMRV9QTURfRk9MREVECkBAIC0yNzcsNyArMjc1LDcgQEAKICNkZWZpbmUgcGdkX2ZsYWcoeCkJKHBnZF92YWwoeCkgJiBQeERfRkxBR19NQVNLKQogI2RlZmluZSBwZ2RfYWRkcmVzcyh4KQkoKHVuc2lnbmVkIGxvbmcpKHBnZF92YWwoeCkgJn4gUHhEX0ZMQUdfTUFTSykgPDwgUHhEX1ZBTFVFX1NISUZUKQogCi0jaWYgUFRfTkxFVkVMUyA9PSAzCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDMKIC8qIFRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgcGVybWFuZW50IHBtZCBpcyBub3QgdGhlcmUgaWYgaXQgY29udGFpbnMKICAqIHRoZSBnYXRld2F5IG1hcmtlciAqLwogI2RlZmluZSBwbWRfbm9uZSh4KQkoIXBtZF92YWwoeCkgfHwgcG1kX2ZsYWcoeCkgPT0gUHhEX0ZMQUdfQVRUQUNIRUQpCkBAIC0yODcsNyArMjg1LDcgQEAKICNkZWZpbmUgcG1kX2JhZCh4KQkoIShwbWRfZmxhZyh4KSAmIFB4RF9GTEFHX1ZBTElEKSkKICNkZWZpbmUgcG1kX3ByZXNlbnQoeCkJKHBtZF9mbGFnKHgpICYgUHhEX0ZMQUdfUFJFU0VOVCkKIHN0YXRpYyBpbmxpbmUgdm9pZCBwbWRfY2xlYXIocG1kX3QgKnBtZCkgewotI2lmIFBUX05MRVZFTFMgPT0gMworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSAzCiAJaWYgKHBtZF9mbGFnKCpwbWQpICYgUHhEX0ZMQUdfQVRUQUNIRUQpCiAJCS8qIFRoaXMgaXMgdGhlIGVudHJ5IHBvaW50aW5nIHRvIHRoZSBwZXJtYW5lbnQgcG1kCiAJCSAqIGF0dGFjaGVkIHRvIHRoZSBwZ2Q7IGNhbm5vdCBjbGVhciBpdCAqLwpAQCAtMjk5LDcgKzI5Nyw3IEBACiAKIAogCi0jaWYgUFRfTkxFVkVMUyA9PSAzCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDMKICNkZWZpbmUgcGdkX3BhZ2VfdmFkZHIocGdkKSAoKHVuc2lnbmVkIGxvbmcpIF9fdmEocGdkX2FkZHJlc3MocGdkKSkpCiAjZGVmaW5lIHBnZF9wYWdlKHBnZCkJdmlydF90b19wYWdlKCh2b2lkICopcGdkX3BhZ2VfdmFkZHIocGdkKSkKIApAQCAtMzA5LDcgKzMwNyw3IEBACiAjZGVmaW5lIHBnZF9iYWQoeCkgICAgICAoIShwZ2RfZmxhZyh4KSAmIFB4RF9GTEFHX1ZBTElEKSkKICNkZWZpbmUgcGdkX3ByZXNlbnQoeCkgIChwZ2RfZmxhZyh4KSAmIFB4RF9GTEFHX1BSRVNFTlQpCiBzdGF0aWMgaW5saW5lIHZvaWQgcGdkX2NsZWFyKHBnZF90ICpwZ2QpIHsKLSNpZiBQVF9OTEVWRUxTID09IDMKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gMwogCWlmKHBnZF9mbGFnKCpwZ2QpICYgUHhEX0ZMQUdfQVRUQUNIRUQpCiAJCS8qIFRoaXMgaXMgdGhlIHBlcm1hbmVudCBwbWQgYXR0YWNoZWQgdG8gdGhlIHBnZDsgY2Fubm90CiAJCSAqIGZyZWUgaXQgKi8KQEAgLTM5Myw3ICszOTEsNyBAQAogCiAvKiBGaW5kIGFuIGVudHJ5IGluIHRoZSBzZWNvbmQtbGV2ZWwgcGFnZSB0YWJsZS4uICovCiAKLSNpZiBQVF9OTEVWRUxTID09IDMKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gMwogI2RlZmluZSBwbWRfb2Zmc2V0KGRpcixhZGRyZXNzKSBcCiAoKHBtZF90ICopIHBnZF9wYWdlX3ZhZGRyKCooZGlyKSkgKyAoKChhZGRyZXNzKT4+UE1EX1NISUZUKSAmIChQVFJTX1BFUl9QTUQtMSkpKQogI2Vsc2UKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IGZiMTNlMzguLmU5NmU2OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtOSw3ICs5LDYgQEAKIAogc3RydWN0IHRocmVhZF9pbmZvIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4gKmV4ZWNfZG9tYWluOy8qIGV4ZWN1dGlvbiBkb21haW4gKi8KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogdGhyZWFkX2luZm8gZmxhZ3MgKHNlZSBUSUZfKikgKi8KIAltbV9zZWdtZW50X3QgYWRkcl9saW1pdDsJLyogdXNlci1sZXZlbCBhZGRyZXNzIHNwYWNlIGxpbWl0ICovCiAJX191MzIgY3B1OwkJCS8qIGN1cnJlbnQgQ1BVICovCkBAIC0xOSw3ICsxOCw2IEBACiAjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKIHsJCQkJCQlcCiAJLnRhc2sJCT0gJnRzaywJCQlcCi0JLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKIAkuZmxhZ3MJCT0gMCwJCQlcCiAJLmNwdQkJPSAwLAkJCVwKIAkuYWRkcl9saW1pdAk9IEtFUk5FTF9EUywJCVwKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9wYXJpc2Mva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggZGNkNTUxMC4uNTkwMDFjZSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTI0Miw3ICsyNDIsNiBAQAogCURFRklORShQVF9TWl9BTEdOLCBhbGlnbl9mcmFtZShzaXplb2Yoc3RydWN0IHB0X3JlZ3MpLCBGUkFNRV9BTElHTikpOwogCUJMQU5LKCk7CiAJREVGSU5FKFRJX1RBU0ssIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdGFzaykpOwotCURFRklORShUSV9FWEVDX0RPTUFJTiwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBleGVjX2RvbWFpbikpOwogCURFRklORShUSV9GTEFHUywgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBmbGFncykpOwogCURFRklORShUSV9DUFUsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgY3B1KSk7CiAJREVGSU5FKFRJX1NFR01FTlQsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgYWRkcl9saW1pdCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL2VudHJ5LlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUwppbmRleCAyYWIxNmJiLi43NTgxOTYxIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvZW50cnkuUwpAQCAtMzk4LDcgKzM5OCw3IEBACiAJICogY2FuIGFkZHJlc3MgdXAgdG8gMVRCCiAJICovCiAJLm1hY3JvCQlMMl9wdGVwCXBtZCxwdGUsaW5kZXgsdmEsZmF1bHQKLSNpZiBQVF9OTEVWRUxTID09IDMKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gMwogCWV4dHJ1CQlcdmEsMzEtQVNNX1BNRF9TSElGVCxBU01fQklUU19QRVJfUE1ELFxpbmRleAogI2Vsc2UKICMgaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpCkBAIC00MzYsNyArNDM2LDcgQEAKIAkgKiBhbGwgSUxQMzIgcHJvY2Vzc2VzIGFuZCBhbGwgdGhlIGtlcm5lbCBmb3IgbWFjaGluZXMgd2l0aAogCSAqIHVuZGVyIDRHQiBvZiBtZW1vcnkpICovCiAJLm1hY3JvCQlMM19wdGVwIHBnZCxwdGUsaW5kZXgsdmEsZmF1bHQKLSNpZiBQVF9OTEVWRUxTID09IDMgLyogd2UgbWlnaHQgaGF2ZSBhIDItTGV2ZWwgc2NoZW1lLCBlLmcuIHdpdGggMTZrYiBwYWdlIHNpemUgKi8KKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gMyAvKiB3ZSBtaWdodCBoYXZlIGEgMi1MZXZlbCBzY2hlbWUsIGUuZy4gd2l0aCAxNmtiIHBhZ2Ugc2l6ZSAqLwogCWV4dHJkLHUJCVx2YSw2My1BU01fUEdESVJfU0hJRlQsQVNNX0JJVFNfUEVSX1BHRCxcaW5kZXgKIAljb3B5CQklcjAsXHB0ZQogCWV4dHJkLHUsKj0JXHZhLDYzLUFTTV9QR0RJUl9TSElGVCw2NC1BU01fUEdESVJfU0hJRlQsJXIwCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvaGVhZC5TIGIvYXJjaC9wYXJpc2Mva2VybmVsL2hlYWQuUwppbmRleCBkNGRjNTg4Li5lN2Q2NDUyIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvaGVhZC5TCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9oZWFkLlMKQEAgLTc0LDcgKzc0LDcgQEAKIAltdGN0bAkJJXI0LCVjcjI0CS8qIEluaXRpYWxpemUga2VybmVsIHJvb3QgcG9pbnRlciAqLwogCW10Y3RsCQklcjQsJWNyMjUJLyogSW5pdGlhbGl6ZSB1c2VyIHJvb3QgcG9pbnRlciAqLwogCi0jaWYgUFRfTkxFVkVMUyA9PSAzCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDMKIAkvKiBTZXQgcG1kIGluIHBnZCAqLwogCWxvYWQzMgkJUEEocG1kMCksJXI1CiAJc2hyZCAgICAgICAgICAgICVyNSxQeERfVkFMVUVfU0hJRlQsJXIzCQpAQCAtOTcsNyArOTcsNyBAQAogCXN0dwkJJXIzLDAoJXI0KQogCWxkbwkJKFBBR0VfU0laRSA+PiBQeERfVkFMVUVfU0hJRlQpKCVyMyksJXIzCiAJYWRkaWIsPgkJLTEsJXIxLDFiCi0jaWYgUFRfTkxFVkVMUyA9PSAzCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDMKIAlsZG8gICAgICAgICAgICAgQVNNX1BNRF9FTlRSWV9TSVpFKCVyNCksJXI0CiAjZWxzZQogCWxkbyAgICAgICAgICAgICBBU01fUEdEX0VOVFJZX1NJWkUoJXI0KSwlcjQKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCmluZGV4IDVhODk5N2QuLjhlZWZiMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKKysrIGIvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUwpAQCAtNTUsOCArNTUsOCBAQAogI2RlZmluZSBFTlRSWV9DT01QKF9uYW1lXykgLndvcmQgc3lzXyMjX25hbWVfCiAjZW5kaWYKIAotCUVOVFJZX1NBTUUocmVzdGFydF9zeXNjYWxsKQkvKiAwICovCi0JRU5UUllfU0FNRShleGl0KQorOTA6CUVOVFJZX1NBTUUocmVzdGFydF9zeXNjYWxsKQkvKiAwICovCis5MToJRU5UUllfU0FNRShleGl0KQogCUVOVFJZX1NBTUUoZm9ya193cmFwcGVyKQogCUVOVFJZX1NBTUUocmVhZCkKIAlFTlRSWV9TQU1FKHdyaXRlKQpAQCAtNDM5LDcgKzQzOSwxMCBAQAogCUVOVFJZX1NBTUUoYnBmKQogCUVOVFJZX0NPTVAoZXhlY3ZlYXQpCiAKLQkvKiBOb3RoaW5nIHlldCAqLworCisuaWZuZSAoLiAtIDkwYikgLSAoX19OUl9MaW51eF9zeXNjYWxscyAqICg5MWIgLSA5MGIpKQorLmVycm9yICJzaXplIG9mIHN5c2NhbGwgdGFibGUgZG9lcyBub3QgZml0IHZhbHVlIG9mIF9fTlJfTGludXhfc3lzY2FsbHMiCisuZW5kaWYKIAogI3VuZGVmIEVOVFJZX1NBTUUKICN1bmRlZiBFTlRSWV9ESUZGCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9tbS9pbml0LmMgYi9hcmNoL3BhcmlzYy9tbS9pbml0LmMKaW5kZXggMTVkYmU4MS4uYzIyOTQyNyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvbW0vaW5pdC5jCisrKyBiL2FyY2gvcGFyaXNjL21tL2luaXQuYwpAQCAtMzQsNyArMzQsNyBAQAogZXh0ZXJuIGludCAgZGF0YV9zdGFydDsKIGV4dGVybiB2b2lkIHBhcmlzY19rZXJuZWxfc3RhcnQodm9pZCk7CS8qIEtlcm5lbCBlbnRyeSBwb2ludCBpbiBoZWFkLlMgKi8KIAotI2lmIFBUX05MRVZFTFMgPT0gMworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSAzCiAvKiBOT1RFOiBUaGlzIGxheW91dCBleGFjdGx5IGNvbmZvcm1zIHRvIHRoZSBoeWJyaWQgTDIvTDMgcGFnZSB0YWJsZSBsYXlvdXQKICAqIHdpdGggdGhlIGZpcnN0IHBtZCBhZGphY2VudCB0byB0aGUgcGdkIGFuZCBiZWxvdyBpdC4gZ2NjIGRvZXNuJ3QgYWN0dWFsbHkKICAqIGd1YXJhbnRlZSB0aGF0IGdsb2JhbCBvYmplY3RzIHdpbGwgYmUgbGFpZCBvdXQgaW4gbWVtb3J5IGluIHRoZSBzYW1lIG9yZGVyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IDcxNmM5ZTYuLjE5MGNjNDggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC04OCw3ICs4OCw3IEBACiAJc2VsZWN0IEFSQ0hfTUlHSFRfSEFWRV9QQ19QQVJQT1JUCiAJc2VsZWN0IEFSQ0hfTUlHSFRfSEFWRV9QQ19TRVJJTwogCXNlbGVjdCBCSU5GTVRfRUxGCi0Jc2VsZWN0IEFSQ0hfQklORk1UX0VMRl9SQU5ET01JWkVfUElFCisJc2VsZWN0IEFSQ0hfSEFTX0VMRl9SQU5ET01JWkUKIAlzZWxlY3QgT0YKIAlzZWxlY3QgT0ZfRUFSTFlfRkxBVFRSRUUKIAlzZWxlY3QgT0ZfUkVTRVJWRURfTUVNCkBAIC0xMjYsNyArMTI2LDcgQEAKIAlzZWxlY3QgSVJRX0ZPUkNFRF9USFJFQURJTkcKIAlzZWxlY3QgSEFWRV9SQ1VfVEFCTEVfRlJFRSBpZiBTTVAKIAlzZWxlY3QgSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTCi0Jc2VsZWN0IEhBVkVfQlBGX0pJVCBpZiBQUEM2NAorCXNlbGVjdCBIQVZFX0JQRl9KSVQKIAlzZWxlY3QgSEFWRV9BUkNIX0pVTVBfTEFCRUwKIAlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAlzZWxlY3QgQVJDSF9IQVNfR0NPVl9QUk9GSUxFX0FMTApAQCAtMjk1LDYgKzI5NSwxMiBAQAogCWJvb2wKIAlkZWZhdWx0IHkgaWYgUFBDNjQKIAorY29uZmlnIFBHVEFCTEVfTEVWRUxTCisJaW50CisJZGVmYXVsdCAyIGlmICFQUEM2NAorCWRlZmF1bHQgMyBpZiBQUENfNjRLX1BBR0VTCisJZGVmYXVsdCA0CisKIHNvdXJjZSAiaW5pdC9LY29uZmlnIgogCiBzb3VyY2UgImtlcm5lbC9LY29uZmlnLmZyZWV6ZXIiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3J5cHRvL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2NyeXB0by9NYWtlZmlsZQppbmRleCAyOTI2ZmI5Li45YzIyMWI2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY3J5cHRvL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9jcnlwdG8vTWFrZWZpbGUKQEAgLTQsNiArNCwxNCBAQAogIyBBcmNoLXNwZWNpZmljIENyeXB0b0FQSSBtb2R1bGVzLgogIwogCitvYmotJChDT05GSUdfQ1JZUFRPX0FFU19QUENfU1BFKSArPSBhZXMtcHBjLXNwZS5vCitvYmotJChDT05GSUdfQ1JZUFRPX01ENV9QUEMpICs9IG1kNS1wcGMubwogb2JqLSQoQ09ORklHX0NSWVBUT19TSEExX1BQQykgKz0gc2hhMS1wb3dlcnBjLm8KK29iai0kKENPTkZJR19DUllQVE9fU0hBMV9QUENfU1BFKSArPSBzaGExLXBwYy1zcGUubworb2JqLSQoQ09ORklHX0NSWVBUT19TSEEyNTZfUFBDX1NQRSkgKz0gc2hhMjU2LXBwYy1zcGUubwogCithZXMtcHBjLXNwZS15IDo9IGFlcy1zcGUtY29yZS5vIGFlcy1zcGUta2V5cy5vIGFlcy10YWItNGsubyBhZXMtc3BlLW1vZGVzLm8gYWVzLXNwZS1nbHVlLm8KK21kNS1wcGMteSA6PSBtZDUtYXNtLm8gbWQ1LWdsdWUubwogc2hhMS1wb3dlcnBjLXkgOj0gc2hhMS1wb3dlcnBjLWFzbS5vIHNoYTEubworc2hhMS1wcGMtc3BlLXkgOj0gc2hhMS1zcGUtYXNtLm8gc2hhMS1zcGUtZ2x1ZS5vCitzaGEyNTYtcHBjLXNwZS15IDo9IHNoYTI1Ni1zcGUtYXNtLm8gc2hhMjU2LXNwZS1nbHVlLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcnlwdG8vYWVzLXNwZS1jb3JlLlMgYi9hcmNoL3Bvd2VycGMvY3J5cHRvL2Flcy1zcGUtY29yZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYzZiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3J5cHRvL2Flcy1zcGUtY29yZS5TCkBAIC0wLDAgKzEsMzUxIEBACisvKgorICogRmFzdCBBRVMgaW1wbGVtZW50YXRpb24gZm9yIFNQRSBpbnN0cnVjdGlvbiBzZXQgKFBQQykKKyAqCisgKiBUaGlzIGNvZGUgbWFrZXMgdXNlIG9mIHRoZSBTUEUgU0lNRCBpbnN0cnVjdGlvbiBzZXQgYXMgZGVmaW5lZCBpbgorICogaHR0cDovL2NhY2hlLmZyZWVzY2FsZS5jb20vZmlsZXMvMzJiaXQvZG9jL3JlZl9tYW51YWwvU1BFUElNLnBkZgorICogSW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gb3B0aW1pemF0aW9uIGd1aWRlIG5vdGVzIGZyb20KKyAqIGh0dHA6Ly9jYWNoZS5mcmVlc2NhbGUuY29tL2ZpbGVzLzMyYml0L2RvYy9hcHBfbm90ZS9BTjI2NjUucGRmCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IE1hcmt1cyBTdG9ja2hhdXNlbiA8c3RvY2toYXVzZW5AY29sbG9naWEuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CisjaW5jbHVkZSAiYWVzLXNwZS1yZWdzLmgiCisKKyNkZWZpbmUJRUFEKGluLCBicG9zKSBcCisJcmx3aW1pCQlyVDAsaW4sMjgtKChicG9zKzMpJTQpKjgsMjAsMjc7CisKKyNkZWZpbmUgREFEKGluLCBicG9zKSBcCisJcmx3aW1pCQlyVDEsaW4sMjQtKChicG9zKzMpJTQpKjgsMjQsMzE7CisKKyNkZWZpbmUgTFdIKG91dCwgb2ZmKSBcCisJZXZsd3dzcGxhdAlvdXQsb2ZmKHJUMCk7CS8qIGxvYWQgd29yZCBoaWdoCQkqLworCisjZGVmaW5lIExXTChvdXQsIG9mZikgXAorCWx3egkJb3V0LG9mZihyVDApOwkvKiBsb2FkIHdvcmQgbG93CQkqLworCisjZGVmaW5lIExCWihvdXQsIHRhYiwgb2ZmKSBcCisJbGJ6CQlvdXQsb2ZmKHRhYik7CS8qIGxvYWQgYnl0ZQkJCSovCisKKyNkZWZpbmUgTEFIKG91dCwgaW4sIGJwb3MsIG9mZikgXAorCUVBRChpbiwgYnBvcykJCQkvKiBjYWxjIGFkZHIgKyBsb2FkIHdvcmQgaGlnaAkqLyBcCisJTFdIKG91dCwgb2ZmKQorCisjZGVmaW5lIExBTChvdXQsIGluLCBicG9zLCBvZmYpIFwKKwlFQUQoaW4sIGJwb3MpCQkJLyogY2FsYyBhZGRyICsgbG9hZCB3b3JkIGxvdwkqLyBcCisJTFdMKG91dCwgb2ZmKQorCisjZGVmaW5lIExBRShvdXQsIGluLCBicG9zKSBcCisJRUFEKGluLCBicG9zKQkJCS8qIGNhbGMgYWRkciArIGxvYWQgZW5jIGJ5dGUJKi8gXAorCUxCWihvdXQsIHJUMCwgOCkKKworI2RlZmluZSBMQkUob3V0KSBcCisJTEJaKG91dCwgclQwLCA4KQkJLyogbG9hZCBlbmMgYnl0ZQkJKi8KKworI2RlZmluZSBMQUQob3V0LCBpbiwgYnBvcykgXAorCURBRChpbiwgYnBvcykJCQkvKiBjYWxjIGFkZHIgKyBsb2FkIGRlYyBieXRlCSovIFwKKwlMQloob3V0LCByVDEsIDApCisKKyNkZWZpbmUgTEJEKG91dCkgXAorCUxCWihvdXQsIHJUMSwgMCkKKworLyoKKyAqIHBwY19lbmNyeXB0X2Jsb2NrOiBUaGUgY2VudHJhbCBlbmNyeXB0aW9uIGZ1bmN0aW9uIGZvciBhIHNpbmdsZSAxNiBieXRlcworICogYmxvY2suIEl0IGRvZXMgbm8gc3RhY2sgaGFuZGxpbmcgb3IgcmVnaXN0ZXIgc2F2aW5nIHRvIHN1cHBvcnQgZmFzdCBjYWxscworICogdmlhIGJsL2Jsci4gSXQgZXhwZWN0cyB0aGF0IGNhbGxlciBoYXMgcHJlLXhvcmVkIGlucHV0IGRhdGEgd2l0aCBmaXJzdAorICogNCB3b3JkcyBvZiBlbmNyeXB0aW9uIGtleSBpbnRvIHJEMC1yRDMuIFBvaW50ZXIvY291bnRlciByZWdpc3RlcnMgbXVzdAorICogaGF2ZSBhbHNvIGJlZW4gc2V0IHVwIGJlZm9yZSAoclQwLCByS1AsIENUUikuIE91dHB1dCBpcyBzdG9yZWQgaW4gckQwLXJEMworICogYW5kIHJXMC1yVzMgYW5kIGNhbGxlciBtdXN0IGV4ZWN1dGUgYSBmaW5hbCB4b3Igb24gdGhlIG91cHV0IHJlZ2lzdGVycy4KKyAqIEFsbCB3b3JraW5nIHJlZ2lzdGVycyByRDAtckQzICYgclcwLXJXNyBhcmUgb3ZlcndyaXR0ZW4gZHVyaW5nIHByb2Nlc3NpbmcuCisgKgorICovCitfR0xPQkFMKHBwY19lbmNyeXB0X2Jsb2NrKQorCUxBSChyVzQsIHJEMSwgMiwgNCkKKwlMQUgoclc2LCByRDAsIDMsIDApCisJTEFIKHJXMywgckQwLCAxLCA4KQorcHBjX2VuY3J5cHRfYmxvY2tfbG9vcDoKKwlMQUgoclcwLCByRDMsIDAsIDEyKQorCUxBTChyVzAsIHJEMCwgMCwgMTIpCisJTEFIKHJXMSwgckQxLCAwLCAxMikKKwlMQUgoclcyLCByRDIsIDEsIDgpCisJTEFMKHJXMiwgckQzLCAxLCA4KQorCUxBTChyVzMsIHJEMSwgMSwgOCkKKwlMQUwoclc0LCByRDIsIDIsIDQpCisJTEFMKHJXNiwgckQxLCAzLCAwKQorCUxBSChyVzUsIHJEMywgMiwgNCkKKwlMQUwoclc1LCByRDAsIDIsIDQpCisJTEFIKHJXNywgckQyLCAzLCAwKQorCWV2bGR3CQlyRDEsMTYocktQKQorCUVBRChyRDMsIDMpCisJZXZ4b3IJCXJXMixyVzIsclc0CisJTFdMKHJXNywgMCkKKwlldnhvcgkJclcyLHJXMixyVzYKKwlFQUQockQyLCAwKQorCWV2eG9yCQlyRDEsckQxLHJXMgorCUxXTChyVzEsIDEyKQorCWV2eG9yCQlyRDEsckQxLHJXMAorCWV2bGR3CQlyRDMsMjQocktQKQorCWV2bWVyZ2VoaQlyRDAsckQwLHJEMQorCUVBRChyRDEsIDIpCisJZXZ4b3IJCXJXMyxyVzMsclc1CisJTFdIKHJXNCwgNCkKKwlldnhvcgkJclczLHJXMyxyVzcKKwlFQUQockQwLCAzKQorCWV2eG9yCQlyRDMsckQzLHJXMworCUxXSChyVzYsIDApCisJZXZ4b3IJCXJEMyxyRDMsclcxCisJRUFEKHJEMCwgMSkKKwlldm1lcmdlaGkJckQyLHJEMixyRDMKKwlMV0goclczLCA4KQorCUxBSChyVzAsIHJEMywgMCwgMTIpCisJTEFMKHJXMCwgckQwLCAwLCAxMikKKwlMQUgoclcxLCByRDEsIDAsIDEyKQorCUxBSChyVzIsIHJEMiwgMSwgOCkKKwlMQUwoclcyLCByRDMsIDEsIDgpCisJTEFMKHJXMywgckQxLCAxLCA4KQorCUxBTChyVzQsIHJEMiwgMiwgNCkKKwlMQUwoclc2LCByRDEsIDMsIDApCisJTEFIKHJXNSwgckQzLCAyLCA0KQorCUxBTChyVzUsIHJEMCwgMiwgNCkKKwlMQUgoclc3LCByRDIsIDMsIDApCisJZXZsZHcJCXJEMSwzMihyS1ApCisJRUFEKHJEMywgMykKKwlldnhvcgkJclcyLHJXMixyVzQKKwlMV0woclc3LCAwKQorCWV2eG9yCQlyVzIsclcyLHJXNgorCUVBRChyRDIsIDApCisJZXZ4b3IJCXJEMSxyRDEsclcyCisJTFdMKHJXMSwgMTIpCisJZXZ4b3IJCXJEMSxyRDEsclcwCisJZXZsZHcJCXJEMyw0MChyS1ApCisJZXZtZXJnZWhpCXJEMCxyRDAsckQxCisJRUFEKHJEMSwgMikKKwlldnhvcgkJclczLHJXMyxyVzUKKwlMV0goclc0LCA0KQorCWV2eG9yCQlyVzMsclczLHJXNworCUVBRChyRDAsIDMpCisJZXZ4b3IJCXJEMyxyRDMsclczCisJTFdIKHJXNiwgMCkKKwlldnhvcgkJckQzLHJEMyxyVzEKKwlFQUQockQwLCAxKQorCWV2bWVyZ2VoaQlyRDIsckQyLHJEMworCUxXSChyVzMsIDgpCisJYWRkaQkJcktQLHJLUCwzMgorCWJkbnoJCXBwY19lbmNyeXB0X2Jsb2NrX2xvb3AKKwlMQUgoclcwLCByRDMsIDAsIDEyKQorCUxBTChyVzAsIHJEMCwgMCwgMTIpCisJTEFIKHJXMSwgckQxLCAwLCAxMikKKwlMQUgoclcyLCByRDIsIDEsIDgpCisJTEFMKHJXMiwgckQzLCAxLCA4KQorCUxBTChyVzMsIHJEMSwgMSwgOCkKKwlMQUwoclc0LCByRDIsIDIsIDQpCisJTEFIKHJXNSwgckQzLCAyLCA0KQorCUxBTChyVzYsIHJEMSwgMywgMCkKKwlMQUwoclc1LCByRDAsIDIsIDQpCisJTEFIKHJXNywgckQyLCAzLCAwKQorCWV2bGR3CQlyRDEsMTYocktQKQorCUVBRChyRDMsIDMpCisJZXZ4b3IJCXJXMixyVzIsclc0CisJTFdMKHJXNywgMCkKKwlldnhvcgkJclcyLHJXMixyVzYKKwlFQUQockQyLCAwKQorCWV2eG9yCQlyRDEsckQxLHJXMgorCUxXTChyVzEsIDEyKQorCWV2eG9yCQlyRDEsckQxLHJXMAorCWV2bGR3CQlyRDMsMjQocktQKQorCWV2bWVyZ2VoaQlyRDAsckQwLHJEMQorCUVBRChyRDEsIDApCisJZXZ4b3IJCXJXMyxyVzMsclc1CisJTEJFKHJXMikKKwlldnhvcgkJclczLHJXMyxyVzcKKwlFQUQockQwLCAxKQorCWV2eG9yCQlyRDMsckQzLHJXMworCUxCRShyVzYpCisJZXZ4b3IJCXJEMyxyRDMsclcxCisJRUFEKHJEMCwgMCkKKwlldm1lcmdlaGkJckQyLHJEMixyRDMKKwlMQkUoclcxKQorCUxBRShyVzAsIHJEMywgMCkKKwlMQUUoclcxLCByRDAsIDApCisJTEFFKHJXNCwgckQyLCAxKQorCUxBRShyVzUsIHJEMywgMSkKKwlMQUUoclczLCByRDIsIDApCisJTEFFKHJXNywgckQxLCAxKQorCXJsd2ltaQkJclcwLHJXNCw4LDE2LDIzCisJcmx3aW1pCQlyVzEsclc1LDgsMTYsMjMKKwlMQUUoclc0LCByRDEsIDIpCisJTEFFKHJXNSwgckQyLCAyKQorCXJsd2ltaQkJclcyLHJXNiw4LDE2LDIzCisJcmx3aW1pCQlyVzMsclc3LDgsMTYsMjMKKwlMQUUoclc2LCByRDMsIDIpCisJTEFFKHJXNywgckQwLCAyKQorCXJsd2ltaQkJclcwLHJXNCwxNiw4LDE1CisJcmx3aW1pCQlyVzEsclc1LDE2LDgsMTUKKwlMQUUoclc0LCByRDAsIDMpCisJTEFFKHJXNSwgckQxLCAzKQorCXJsd2ltaQkJclcyLHJXNiwxNiw4LDE1CisJbHd6CQlyRDAsMzIocktQKQorCXJsd2ltaQkJclczLHJXNywxNiw4LDE1CisJbHd6CQlyRDEsMzYocktQKQorCUxBRShyVzYsIHJEMiwgMykKKwlMQUUoclc3LCByRDMsIDMpCisJcmx3aW1pCQlyVzAsclc0LDI0LDAsNworCWx3egkJckQyLDQwKHJLUCkKKwlybHdpbWkJCXJXMSxyVzUsMjQsMCw3CisJbHd6CQlyRDMsNDQocktQKQorCXJsd2ltaQkJclcyLHJXNiwyNCwwLDcKKwlybHdpbWkJCXJXMyxyVzcsMjQsMCw3CisJYmxyCisKKy8qCisgKiBwcGNfZGVjcnlwdF9ibG9jazogVGhlIGNlbnRyYWwgZGVjcnlwdGlvbiBmdW5jdGlvbiBmb3IgYSBzaW5nbGUgMTYgYnl0ZXMKKyAqIGJsb2NrLiBJdCBkb2VzIG5vIHN0YWNrIGhhbmRsaW5nIG9yIHJlZ2lzdGVyIHNhdmluZyB0byBzdXBwb3J0IGZhc3QgY2FsbHMKKyAqIHZpYSBibC9ibHIuIEl0IGV4cGVjdHMgdGhhdCBjYWxsZXIgaGFzIHByZS14b3JlZCBpbnB1dCBkYXRhIHdpdGggZmlyc3QKKyAqIDQgd29yZHMgb2YgZW5jcnlwdGlvbiBrZXkgaW50byByRDAtckQzLiBQb2ludGVyL2NvdW50ZXIgcmVnaXN0ZXJzIG11c3QKKyAqIGhhdmUgYWxzbyBiZWVuIHNldCB1cCBiZWZvcmUgKHJUMCwgcktQLCBDVFIpLiBPdXRwdXQgaXMgc3RvcmVkIGluIHJEMC1yRDMKKyAqIGFuZCByVzAtclczIGFuZCBjYWxsZXIgbXVzdCBleGVjdXRlIGEgZmluYWwgeG9yIG9uIHRoZSBvdXB1dCByZWdpc3RlcnMuCisgKiBBbGwgd29ya2luZyByZWdpc3RlcnMgckQwLXJEMyAmIHJXMC1yVzcgYXJlIG92ZXJ3cml0dGVuIGR1cmluZyBwcm9jZXNzaW5nLgorICoKKyAqLworX0dMT0JBTChwcGNfZGVjcnlwdF9ibG9jaykKKwlMQUgoclcwLCByRDEsIDAsIDEyKQorCUxBSChyVzYsIHJEMCwgMywgMCkKKwlMQUgoclczLCByRDAsIDEsIDgpCitwcGNfZGVjcnlwdF9ibG9ja19sb29wOgorCUxBSChyVzEsIHJEMywgMCwgMTIpCisJTEFMKHJXMCwgckQyLCAwLCAxMikKKwlMQUgoclcyLCByRDIsIDEsIDgpCisJTEFMKHJXMiwgckQzLCAxLCA4KQorCUxBSChyVzQsIHJEMywgMiwgNCkKKwlMQUwoclc0LCByRDAsIDIsIDQpCisJTEFMKHJXNiwgckQxLCAzLCAwKQorCUxBSChyVzUsIHJEMSwgMiwgNCkKKwlMQUgoclc3LCByRDIsIDMsIDApCisJTEFMKHJXNywgckQzLCAzLCAwKQorCUxBTChyVzMsIHJEMSwgMSwgOCkKKwlldmxkdwkJckQxLDE2KHJLUCkKKwlFQUQockQwLCAwKQorCWV2eG9yCQlyVzQsclc0LHJXNgorCUxXTChyVzEsIDEyKQorCWV2eG9yCQlyVzAsclcwLHJXNAorCUVBRChyRDIsIDIpCisJZXZ4b3IJCXJXMCxyVzAsclcyCisJTFdMKHJXNSwgNCkKKwlldnhvcgkJckQxLHJEMSxyVzAKKwlldmxkdwkJckQzLDI0KHJLUCkKKwlldm1lcmdlaGkJckQwLHJEMCxyRDEKKwlFQUQockQxLCAwKQorCWV2eG9yCQlyVzMsclczLHJXNworCUxXSChyVzAsIDEyKQorCWV2eG9yCQlyVzMsclczLHJXMQorCUVBRChyRDAsIDMpCisJZXZ4b3IJCXJEMyxyRDMsclczCisJTFdIKHJXNiwgMCkKKwlldnhvcgkJckQzLHJEMyxyVzUKKwlFQUQockQwLCAxKQorCWV2bWVyZ2VoaQlyRDIsckQyLHJEMworCUxXSChyVzMsIDgpCisJTEFIKHJXMSwgckQzLCAwLCAxMikKKwlMQUwoclcwLCByRDIsIDAsIDEyKQorCUxBSChyVzIsIHJEMiwgMSwgOCkKKwlMQUwoclcyLCByRDMsIDEsIDgpCisJTEFIKHJXNCwgckQzLCAyLCA0KQorCUxBTChyVzQsIHJEMCwgMiwgNCkKKwlMQUwoclc2LCByRDEsIDMsIDApCisJTEFIKHJXNSwgckQxLCAyLCA0KQorCUxBSChyVzcsIHJEMiwgMywgMCkKKwlMQUwoclc3LCByRDMsIDMsIDApCisJTEFMKHJXMywgckQxLCAxLCA4KQorCWV2bGR3CQkgckQxLDMyKHJLUCkKKwlFQUQockQwLCAwKQorCWV2eG9yCQlyVzQsclc0LHJXNgorCUxXTChyVzEsIDEyKQorCWV2eG9yCQlyVzAsclcwLHJXNAorCUVBRChyRDIsIDIpCisJZXZ4b3IJCXJXMCxyVzAsclcyCisJTFdMKHJXNSwgNCkKKwlldnhvcgkJckQxLHJEMSxyVzAKKwlldmxkdwkJckQzLDQwKHJLUCkKKwlldm1lcmdlaGkJckQwLHJEMCxyRDEKKwlFQUQockQxLCAwKQorCWV2eG9yCQlyVzMsclczLHJXNworCUxXSChyVzAsIDEyKQorCWV2eG9yCQlyVzMsclczLHJXMQorCUVBRChyRDAsIDMpCisJZXZ4b3IJCXJEMyxyRDMsclczCisJTFdIKHJXNiwgMCkKKwlldnhvcgkJckQzLHJEMyxyVzUKKwlFQUQockQwLCAxKQorCWV2bWVyZ2VoaQlyRDIsckQyLHJEMworCUxXSChyVzMsIDgpCisJYWRkaQkJcktQLHJLUCwzMgorCWJkbnoJCXBwY19kZWNyeXB0X2Jsb2NrX2xvb3AKKwlMQUgoclcxLCByRDMsIDAsIDEyKQorCUxBTChyVzAsIHJEMiwgMCwgMTIpCisJTEFIKHJXMiwgckQyLCAxLCA4KQorCUxBTChyVzIsIHJEMywgMSwgOCkKKwlMQUgoclc0LCByRDMsIDIsIDQpCisJTEFMKHJXNCwgckQwLCAyLCA0KQorCUxBTChyVzYsIHJEMSwgMywgMCkKKwlMQUgoclc1LCByRDEsIDIsIDQpCisJTEFIKHJXNywgckQyLCAzLCAwKQorCUxBTChyVzcsIHJEMywgMywgMCkKKwlMQUwoclczLCByRDEsIDEsIDgpCisJZXZsZHcJCSByRDEsMTYocktQKQorCUVBRChyRDAsIDApCisJZXZ4b3IJCXJXNCxyVzQsclc2CisJTFdMKHJXMSwgMTIpCisJZXZ4b3IJCXJXMCxyVzAsclc0CisJRUFEKHJEMiwgMikKKwlldnhvcgkJclcwLHJXMCxyVzIKKwlMV0woclc1LCA0KQorCWV2eG9yCQlyRDEsckQxLHJXMAorCWV2bGR3CQlyRDMsMjQocktQKQorCWV2bWVyZ2VoaQlyRDAsckQwLHJEMQorCURBRChyRDEsIDApCisJZXZ4b3IJCXJXMyxyVzMsclc3CisJTEJEKHJXMCkKKwlldnhvcgkJclczLHJXMyxyVzEKKwlEQUQockQwLCAxKQorCWV2eG9yCQlyRDMsckQzLHJXMworCUxCRChyVzYpCisJZXZ4b3IJCXJEMyxyRDMsclc1CisJREFEKHJEMCwgMCkKKwlldm1lcmdlaGkJckQyLHJEMixyRDMKKwlMQkQoclczKQorCUxBRChyVzIsIHJEMywgMCkKKwlMQUQoclcxLCByRDIsIDApCisJTEFEKHJXNCwgckQyLCAxKQorCUxBRChyVzUsIHJEMywgMSkKKwlMQUQoclc3LCByRDEsIDEpCisJcmx3aW1pCQlyVzAsclc0LDgsMTYsMjMKKwlybHdpbWkJCXJXMSxyVzUsOCwxNiwyMworCUxBRChyVzQsIHJEMywgMikKKwlMQUQoclc1LCByRDAsIDIpCisJcmx3aW1pCQlyVzIsclc2LDgsMTYsMjMKKwlybHdpbWkJCXJXMyxyVzcsOCwxNiwyMworCUxBRChyVzYsIHJEMSwgMikKKwlMQUQoclc3LCByRDIsIDIpCisJcmx3aW1pCQlyVzAsclc0LDE2LDgsMTUKKwlybHdpbWkJCXJXMSxyVzUsMTYsOCwxNQorCUxBRChyVzQsIHJEMCwgMykKKwlMQUQoclc1LCByRDEsIDMpCisJcmx3aW1pCQlyVzIsclc2LDE2LDgsMTUKKwlsd3oJCXJEMCwzMihyS1ApCisJcmx3aW1pCQlyVzMsclc3LDE2LDgsMTUKKwlsd3oJCXJEMSwzNihyS1ApCisJTEFEKHJXNiwgckQyLCAzKQorCUxBRChyVzcsIHJEMywgMykKKwlybHdpbWkJCXJXMCxyVzQsMjQsMCw3CisJbHd6CQlyRDIsNDAocktQKQorCXJsd2ltaQkJclcxLHJXNSwyNCwwLDcKKwlsd3oJCXJEMyw0NChyS1ApCisJcmx3aW1pCQlyVzIsclc2LDI0LDAsNworCXJsd2ltaQkJclczLHJXNywyNCwwLDcKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcnlwdG8vYWVzLXNwZS1nbHVlLmMgYi9hcmNoL3Bvd2VycGMvY3J5cHRvL2Flcy1zcGUtZ2x1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNWU2M2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3J5cHRvL2Flcy1zcGUtZ2x1ZS5jCkBAIC0wLDAgKzEsNTEyIEBACisvKgorICogR2x1ZSBjb2RlIGZvciBBRVMgaW1wbGVtZW50YXRpb24gZm9yIFNQRSBpbnN0cnVjdGlvbnMgKFBQQykKKyAqCisgKiBCYXNlZCBvbiBnZW5lcmljIGltcGxlbWVudGF0aW9uLiBUaGUgYXNzZW1ibGVyIG1vZHVsZSB0YWtlcyBjYXJlCisgKiBhYm91dCB0aGUgU1BFIHJlZ2lzdGVycyBzbyBpdCBjYW4gcnVuIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IE1hcmt1cyBTdG9ja2hhdXNlbiA8c3RvY2toYXVzZW5AY29sbG9naWEuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2FsZ2FwaS5oPgorCisvKgorICogTUFYX0JZVEVTIGRlZmluZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHByb2Nlc3NlZAorICogYmV0d2VlbiBwcmVlbXB0X2Rpc2FibGUoKSBhbmQgcHJlZW1wdF9lbmFibGUoKS4gZTUwMCBjb3JlcyBjYW4gaXNzdWUgdHdvCisgKiBpbnN0cnVjdGlvbnMgcGVyIGNsb2NrIGN5Y2xlIHVzaW5nIG9uZSAzMi82NCBiaXQgdW5pdCAoU1UxKSBhbmQgb25lIDMyCisgKiBiaXQgdW5pdCAoU1UyKS4gT25lIG9mIHRoZXNlIGNhbiBiZSBhIG1lbW9yeSBhY2Nlc3MgdGhhdCBpcyBleGVjdXRlZCB2aWEKKyAqIGEgc2luZ2xlIGxvYWQgYW5kIHN0b3JlIHVuaXQgKExTVSkuIFhUUy1BRVMtMjU2IHRha2VzIH43ODAgb3BlcmF0aW9ucyBwZXIKKyAqIDE2IGJ5dGUgYmxvY2sgYmxvY2sgb3IgMjUgY3ljbGVzIHBlciBieXRlLiBUaHVzIDc2OCBieXRlcyBvZiBpbnB1dCBkYXRhCisgKiB3aWxsIG5lZWQgYW4gZXN0aW1hdGVkIG1heGltdW0gb2YgMjAsMDAwIGN5Y2xlcy4gSGVhZHJvb20gZm9yIGNhY2hlIG1pc3NlcworICogaW5jbHVkZWQuIEV2ZW4gd2l0aCB0aGUgbG93IGVuZCBtb2RlbCBjbG9ja2VkIGF0IDY2NyBNSHogdGhpcyBlcXVhbHMgdG8gYQorICogY3JpdGljYWwgdGltZSB3aW5kb3cgb2YgbGVzcyB0aGFuIDMwdXMuIFRoZSB2YWx1ZSBoYXMgYmVlbiBjaG9vc2VuIHRvCisgKiBwcm9jZXNzIGEgNTEyIGJ5dGUgZGlzayBibG9jayBpbiBvbmUgb3IgYSBsYXJnZSAxNDAwIGJ5dGVzIElQc2VjIG5ldHdvcmsKKyAqIHBhY2tldCBpbiB0d28gcnVucy4KKyAqCisgKi8KKyNkZWZpbmUgTUFYX0JZVEVTIDc2OAorCitzdHJ1Y3QgcHBjX2Flc19jdHggeworCXUzMiBrZXlfZW5jW0FFU19NQVhfS0VZTEVOR1RIX1UzMl07CisJdTMyIGtleV9kZWNbQUVTX01BWF9LRVlMRU5HVEhfVTMyXTsKKwl1MzIgcm91bmRzOworfTsKKworc3RydWN0IHBwY194dHNfY3R4IHsKKwl1MzIga2V5X2VuY1tBRVNfTUFYX0tFWUxFTkdUSF9VMzJdOworCXUzMiBrZXlfZGVjW0FFU19NQVhfS0VZTEVOR1RIX1UzMl07CisJdTMyIGtleV90d2tbQUVTX01BWF9LRVlMRU5HVEhfVTMyXTsKKwl1MzIgcm91bmRzOworfTsKKworZXh0ZXJuIHZvaWQgcHBjX2VuY3J5cHRfYWVzKHU4ICpvdXQsIGNvbnN0IHU4ICppbiwgdTMyICprZXlfZW5jLCB1MzIgcm91bmRzKTsKK2V4dGVybiB2b2lkIHBwY19kZWNyeXB0X2Flcyh1OCAqb3V0LCBjb25zdCB1OCAqaW4sIHUzMiAqa2V5X2RlYywgdTMyIHJvdW5kcyk7CitleHRlcm4gdm9pZCBwcGNfZW5jcnlwdF9lY2IodTggKm91dCwgY29uc3QgdTggKmluLCB1MzIgKmtleV9lbmMsIHUzMiByb3VuZHMsCisJCQkgICAgdTMyIGJ5dGVzKTsKK2V4dGVybiB2b2lkIHBwY19kZWNyeXB0X2VjYih1OCAqb3V0LCBjb25zdCB1OCAqaW4sIHUzMiAqa2V5X2RlYywgdTMyIHJvdW5kcywKKwkJCSAgICB1MzIgYnl0ZXMpOworZXh0ZXJuIHZvaWQgcHBjX2VuY3J5cHRfY2JjKHU4ICpvdXQsIGNvbnN0IHU4ICppbiwgdTMyICprZXlfZW5jLCB1MzIgcm91bmRzLAorCQkJICAgIHUzMiBieXRlcywgdTggKml2KTsKK2V4dGVybiB2b2lkIHBwY19kZWNyeXB0X2NiYyh1OCAqb3V0LCBjb25zdCB1OCAqaW4sIHUzMiAqa2V5X2RlYywgdTMyIHJvdW5kcywKKwkJCSAgICB1MzIgYnl0ZXMsIHU4ICppdik7CitleHRlcm4gdm9pZCBwcGNfY3J5cHRfY3RyICAodTggKm91dCwgY29uc3QgdTggKmluLCB1MzIgKmtleV9lbmMsIHUzMiByb3VuZHMsCisJCQkgICAgdTMyIGJ5dGVzLCB1OCAqaXYpOworZXh0ZXJuIHZvaWQgcHBjX2VuY3J5cHRfeHRzKHU4ICpvdXQsIGNvbnN0IHU4ICppbiwgdTMyICprZXlfZW5jLCB1MzIgcm91bmRzLAorCQkJICAgIHUzMiBieXRlcywgdTggKml2LCB1MzIgKmtleV90d2spOworZXh0ZXJuIHZvaWQgcHBjX2RlY3J5cHRfeHRzKHU4ICpvdXQsIGNvbnN0IHU4ICppbiwgdTMyICprZXlfZGVjLCB1MzIgcm91bmRzLAorCQkJICAgIHUzMiBieXRlcywgdTggKml2LCB1MzIgKmtleV90d2spOworCitleHRlcm4gdm9pZCBwcGNfZXhwYW5kX2tleV8xMjgodTMyICprZXlfZW5jLCBjb25zdCB1OCAqa2V5KTsKK2V4dGVybiB2b2lkIHBwY19leHBhbmRfa2V5XzE5Mih1MzIgKmtleV9lbmMsIGNvbnN0IHU4ICprZXkpOworZXh0ZXJuIHZvaWQgcHBjX2V4cGFuZF9rZXlfMjU2KHUzMiAqa2V5X2VuYywgY29uc3QgdTggKmtleSk7CisKK2V4dGVybiB2b2lkIHBwY19nZW5lcmF0ZV9kZWNyeXB0X2tleSh1MzIgKmtleV9kZWMsdTMyICprZXlfZW5jLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGtleV9sZW4pOworCitzdGF0aWMgdm9pZCBzcGVfYmVnaW4odm9pZCkKK3sKKwkvKiBkaXNhYmxlIHByZWVtcHRpb24gYW5kIHNhdmUgdXNlcnMgU1BFIHJlZ2lzdGVycyBpZiByZXF1aXJlZCAqLworCXByZWVtcHRfZGlzYWJsZSgpOworCWVuYWJsZV9rZXJuZWxfc3BlKCk7Cit9CisKK3N0YXRpYyB2b2lkIHNwZV9lbmQodm9pZCkKK3sKKwkvKiByZWVuYWJsZSBwcmVlbXB0aW9uICovCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIGludCBwcGNfYWVzX3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqaW5fa2V5LAorCQl1bnNpZ25lZCBpbnQga2V5X2xlbikKK3sKKwlzdHJ1Y3QgcHBjX2Flc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisKKwlpZiAoa2V5X2xlbiAhPSBBRVNfS0VZU0laRV8xMjggJiYKKwkgICAga2V5X2xlbiAhPSBBRVNfS0VZU0laRV8xOTIgJiYKKwkgICAga2V5X2xlbiAhPSBBRVNfS0VZU0laRV8yNTYpIHsKKwkJdGZtLT5jcnRfZmxhZ3MgfD0gQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9MRU47CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAoa2V5X2xlbikgeworCWNhc2UgQUVTX0tFWVNJWkVfMTI4OgorCQljdHgtPnJvdW5kcyA9IDQ7CisJCXBwY19leHBhbmRfa2V5XzEyOChjdHgtPmtleV9lbmMsIGluX2tleSk7CisJCWJyZWFrOworCWNhc2UgQUVTX0tFWVNJWkVfMTkyOgorCQljdHgtPnJvdW5kcyA9IDU7CisJCXBwY19leHBhbmRfa2V5XzE5MihjdHgtPmtleV9lbmMsIGluX2tleSk7CisJCWJyZWFrOworCWNhc2UgQUVTX0tFWVNJWkVfMjU2OgorCQljdHgtPnJvdW5kcyA9IDY7CisJCXBwY19leHBhbmRfa2V5XzI1NihjdHgtPmtleV9lbmMsIGluX2tleSk7CisJCWJyZWFrOworCX0KKworCXBwY19nZW5lcmF0ZV9kZWNyeXB0X2tleShjdHgtPmtleV9kZWMsIGN0eC0+a2V5X2VuYywga2V5X2xlbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcGNfeHRzX3NldGtleShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqaW5fa2V5LAorCQkgICB1bnNpZ25lZCBpbnQga2V5X2xlbikKK3sKKwlzdHJ1Y3QgcHBjX3h0c19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisKKwlrZXlfbGVuID4+PSAxOworCisJaWYgKGtleV9sZW4gIT0gQUVTX0tFWVNJWkVfMTI4ICYmCisJICAgIGtleV9sZW4gIT0gQUVTX0tFWVNJWkVfMTkyICYmCisJICAgIGtleV9sZW4gIT0gQUVTX0tFWVNJWkVfMjU2KSB7CisJCXRmbS0+Y3J0X2ZsYWdzIHw9IENSWVBUT19URk1fUkVTX0JBRF9LRVlfTEVOOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGtleV9sZW4pIHsKKwljYXNlIEFFU19LRVlTSVpFXzEyODoKKwkJY3R4LT5yb3VuZHMgPSA0OworCQlwcGNfZXhwYW5kX2tleV8xMjgoY3R4LT5rZXlfZW5jLCBpbl9rZXkpOworCQlwcGNfZXhwYW5kX2tleV8xMjgoY3R4LT5rZXlfdHdrLCBpbl9rZXkgKyBBRVNfS0VZU0laRV8xMjgpOworCQlicmVhazsKKwljYXNlIEFFU19LRVlTSVpFXzE5MjoKKwkJY3R4LT5yb3VuZHMgPSA1OworCQlwcGNfZXhwYW5kX2tleV8xOTIoY3R4LT5rZXlfZW5jLCBpbl9rZXkpOworCQlwcGNfZXhwYW5kX2tleV8xOTIoY3R4LT5rZXlfdHdrLCBpbl9rZXkgKyBBRVNfS0VZU0laRV8xOTIpOworCQlicmVhazsKKwljYXNlIEFFU19LRVlTSVpFXzI1NjoKKwkJY3R4LT5yb3VuZHMgPSA2OworCQlwcGNfZXhwYW5kX2tleV8yNTYoY3R4LT5rZXlfZW5jLCBpbl9rZXkpOworCQlwcGNfZXhwYW5kX2tleV8yNTYoY3R4LT5rZXlfdHdrLCBpbl9rZXkgKyBBRVNfS0VZU0laRV8yNTYpOworCQlicmVhazsKKwl9CisKKwlwcGNfZ2VuZXJhdGVfZGVjcnlwdF9rZXkoY3R4LT5rZXlfZGVjLCBjdHgtPmtleV9lbmMsIGtleV9sZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBwY19hZXNfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqb3V0LCBjb25zdCB1OCAqaW4pCit7CisJc3RydWN0IHBwY19hZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisJc3BlX2JlZ2luKCk7CisJcHBjX2VuY3J5cHRfYWVzKG91dCwgaW4sIGN0eC0+a2V5X2VuYywgY3R4LT5yb3VuZHMpOworCXNwZV9lbmQoKTsKK30KKworc3RhdGljIHZvaWQgcHBjX2Flc19kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpvdXQsIGNvbnN0IHU4ICppbikKK3sKKwlzdHJ1Y3QgcHBjX2Flc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisKKwlzcGVfYmVnaW4oKTsKKwlwcGNfZGVjcnlwdF9hZXMob3V0LCBpbiwgY3R4LT5rZXlfZGVjLCBjdHgtPnJvdW5kcyk7CisJc3BlX2VuZCgpOworfQorCitzdGF0aWMgaW50IHBwY19lY2JfZW5jcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IHBwY19hZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCXVuc2lnbmVkIGludCB1Ynl0ZXM7CisJaW50IGVycjsKKworCWRlc2MtPmZsYWdzICY9IH5DUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGsubmJ5dGVzKSkgeworCQl1Ynl0ZXMgPSBuYnl0ZXMgPiBNQVhfQllURVMgPworCQkJIG5ieXRlcyAtIE1BWF9CWVRFUyA6IG5ieXRlcyAmIChBRVNfQkxPQ0tfU0laRSAtIDEpOworCQluYnl0ZXMgLT0gdWJ5dGVzOworCisJCXNwZV9iZWdpbigpOworCQlwcGNfZW5jcnlwdF9lY2Iod2Fsay5kc3QudmlydC5hZGRyLCB3YWxrLnNyYy52aXJ0LmFkZHIsCisJCQkJY3R4LT5rZXlfZW5jLCBjdHgtPnJvdW5kcywgbmJ5dGVzKTsKKwkJc3BlX2VuZCgpOworCisJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgJndhbGssIHVieXRlcyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwcGNfZWNiX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBwcGNfYWVzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKwl1bnNpZ25lZCBpbnQgdWJ5dGVzOworCWludCBlcnI7CisKKwlkZXNjLT5mbGFncyAmPSB+Q1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQOworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCWVyciA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgJndhbGspOworCisJd2hpbGUgKChuYnl0ZXMgPSB3YWxrLm5ieXRlcykpIHsKKwkJdWJ5dGVzID0gbmJ5dGVzID4gTUFYX0JZVEVTID8KKwkJCSBuYnl0ZXMgLSBNQVhfQllURVMgOiBuYnl0ZXMgJiAoQUVTX0JMT0NLX1NJWkUgLSAxKTsKKwkJbmJ5dGVzIC09IHVieXRlczsKKworCQlzcGVfYmVnaW4oKTsKKwkJcHBjX2RlY3J5cHRfZWNiKHdhbGsuZHN0LnZpcnQuYWRkciwgd2Fsay5zcmMudmlydC5hZGRyLAorCQkJCWN0eC0+a2V5X2RlYywgY3R4LT5yb3VuZHMsIG5ieXRlcyk7CisJCXNwZV9lbmQoKTsKKworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCB1Ynl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcHBjX2NiY19lbmNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgcHBjX2Flc19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisJdW5zaWduZWQgaW50IHVieXRlczsKKwlpbnQgZXJyOworCisJZGVzYy0+ZmxhZ3MgJj0gfkNSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCXVieXRlcyA9IG5ieXRlcyA+IE1BWF9CWVRFUyA/CisJCQkgbmJ5dGVzIC0gTUFYX0JZVEVTIDogbmJ5dGVzICYgKEFFU19CTE9DS19TSVpFIC0gMSk7CisJCW5ieXRlcyAtPSB1Ynl0ZXM7CisKKwkJc3BlX2JlZ2luKCk7CisJCXBwY19lbmNyeXB0X2NiYyh3YWxrLmRzdC52aXJ0LmFkZHIsIHdhbGsuc3JjLnZpcnQuYWRkciwKKwkJCQljdHgtPmtleV9lbmMsIGN0eC0+cm91bmRzLCBuYnl0ZXMsIHdhbGsuaXYpOworCQlzcGVfZW5kKCk7CisKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgdWJ5dGVzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHBwY19jYmNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAorCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IHBwY19hZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCXVuc2lnbmVkIGludCB1Ynl0ZXM7CisJaW50IGVycjsKKworCWRlc2MtPmZsYWdzICY9IH5DUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisJZXJyID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGsubmJ5dGVzKSkgeworCQl1Ynl0ZXMgPSBuYnl0ZXMgPiBNQVhfQllURVMgPworCQkJIG5ieXRlcyAtIE1BWF9CWVRFUyA6IG5ieXRlcyAmIChBRVNfQkxPQ0tfU0laRSAtIDEpOworCQluYnl0ZXMgLT0gdWJ5dGVzOworCisJCXNwZV9iZWdpbigpOworCQlwcGNfZGVjcnlwdF9jYmMod2Fsay5kc3QudmlydC5hZGRyLCB3YWxrLnNyYy52aXJ0LmFkZHIsCisJCQkJY3R4LT5rZXlfZGVjLCBjdHgtPnJvdW5kcywgbmJ5dGVzLCB3YWxrLml2KTsKKwkJc3BlX2VuZCgpOworCisJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgJndhbGssIHVieXRlcyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwcGNfY3RyX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisJc3RydWN0IHBwY19hZXNfY3R4ICpjdHggPSBjcnlwdG9fYmxrY2lwaGVyX2N0eChkZXNjLT50Zm0pOworCXN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworCXVuc2lnbmVkIGludCBwYnl0ZXMsIHVieXRlczsKKwlpbnQgZXJyOworCisJZGVzYy0+ZmxhZ3MgJj0gfkNSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0X2Jsb2NrKGRlc2MsICZ3YWxrLCBBRVNfQkxPQ0tfU0laRSk7CisKKwl3aGlsZSAoKHBieXRlcyA9IHdhbGsubmJ5dGVzKSkgeworCQlwYnl0ZXMgPSBwYnl0ZXMgPiBNQVhfQllURVMgPyBNQVhfQllURVMgOiBwYnl0ZXM7CisJCXBieXRlcyA9IHBieXRlcyA9PSBuYnl0ZXMgPworCQkJIG5ieXRlcyA6IHBieXRlcyAmIH4oQUVTX0JMT0NLX1NJWkUgLSAxKTsKKwkJdWJ5dGVzID0gd2Fsay5uYnl0ZXMgLSBwYnl0ZXM7CisKKwkJc3BlX2JlZ2luKCk7CisJCXBwY19jcnlwdF9jdHIod2Fsay5kc3QudmlydC5hZGRyLCB3YWxrLnNyYy52aXJ0LmFkZHIsCisJCQkgICAgICBjdHgtPmtleV9lbmMsIGN0eC0+cm91bmRzLCBwYnl0ZXMgLCB3YWxrLml2KTsKKwkJc3BlX2VuZCgpOworCisJCW5ieXRlcyAtPSBwYnl0ZXM7CisJCWVyciA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgJndhbGssIHVieXRlcyk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBwcGNfeHRzX2VuY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKKwkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBwcGNfeHRzX2N0eCAqY3R4ID0gY3J5cHRvX2Jsa2NpcGhlcl9jdHgoZGVzYy0+dGZtKTsKKwlzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKwl1bnNpZ25lZCBpbnQgdWJ5dGVzOworCWludCBlcnI7CisJdTMyICp0d2s7CisKKwlkZXNjLT5mbGFncyAmPSB+Q1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQOworCWJsa2NpcGhlcl93YWxrX2luaXQoJndhbGssIGRzdCwgc3JjLCBuYnl0ZXMpOworCWVyciA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgJndhbGspOworCXR3ayA9IGN0eC0+a2V5X3R3azsKKworCXdoaWxlICgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCXVieXRlcyA9IG5ieXRlcyA+IE1BWF9CWVRFUyA/CisJCQkgbmJ5dGVzIC0gTUFYX0JZVEVTIDogbmJ5dGVzICYgKEFFU19CTE9DS19TSVpFIC0gMSk7CisJCW5ieXRlcyAtPSB1Ynl0ZXM7CisKKwkJc3BlX2JlZ2luKCk7CisJCXBwY19lbmNyeXB0X3h0cyh3YWxrLmRzdC52aXJ0LmFkZHIsIHdhbGsuc3JjLnZpcnQuYWRkciwKKwkJCQljdHgtPmtleV9lbmMsIGN0eC0+cm91bmRzLCBuYnl0ZXMsIHdhbGsuaXYsIHR3ayk7CisJCXNwZV9lbmQoKTsKKworCQl0d2sgPSBOVUxMOworCQllcnIgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCB1Ynl0ZXMpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcHBjX3h0c19kZWNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCisJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKwlzdHJ1Y3QgcHBjX3h0c19jdHggKmN0eCA9IGNyeXB0b19ibGtjaXBoZXJfY3R4KGRlc2MtPnRmbSk7CisJc3RydWN0IGJsa2NpcGhlcl93YWxrIHdhbGs7CisJdW5zaWduZWQgaW50IHVieXRlczsKKwlpbnQgZXJyOworCXUzMiAqdHdrOworCisJZGVzYy0+ZmxhZ3MgJj0gfkNSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKwllcnIgPSBibGtjaXBoZXJfd2Fsa192aXJ0KGRlc2MsICZ3YWxrKTsKKwl0d2sgPSBjdHgtPmtleV90d2s7CisKKwl3aGlsZSAoKG5ieXRlcyA9IHdhbGsubmJ5dGVzKSkgeworCQl1Ynl0ZXMgPSBuYnl0ZXMgPiBNQVhfQllURVMgPworCQkJIG5ieXRlcyAtIE1BWF9CWVRFUyA6IG5ieXRlcyAmIChBRVNfQkxPQ0tfU0laRSAtIDEpOworCQluYnl0ZXMgLT0gdWJ5dGVzOworCisJCXNwZV9iZWdpbigpOworCQlwcGNfZGVjcnlwdF94dHMod2Fsay5kc3QudmlydC5hZGRyLCB3YWxrLnNyYy52aXJ0LmFkZHIsCisJCQkJY3R4LT5rZXlfZGVjLCBjdHgtPnJvdW5kcywgbmJ5dGVzLCB3YWxrLml2LCB0d2spOworCQlzcGVfZW5kKCk7CisKKwkJdHdrID0gTlVMTDsKKwkJZXJyID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgdWJ5dGVzKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogQWxnb3JpdGhtIGRlZmluaXRpb25zLiBEaXNhYmxpbmcgYWxpZ25tZW50IChjcmFfYWxpZ25tYXNrPTApIHdhcyBjaG9zZW4KKyAqIGJlY2F1c2UgdGhlIGU1MDAgcGxhdGZvcm0gY2FuIGhhbmRsZSB1bmFsaWduZWQgcmVhZHMvd3JpdGVzIHZlcnkgZWZmaWNlbnRseS4KKyAqIFRoaXMgaW1wcm92ZXMgSVBzZWMgdGhvdWdocHV0IGJ5IGFub3RoZXIgZmV3IHBlcmNlbnQuIEFkZGl0aW9uYWxseSB3ZSBhc3N1bWUKKyAqIHRoYXQgQUVTIGNvbnRleHQgaXMgYWx3YXlzIGFsaWduZWQgdG8gYXQgbGVhc3QgOCBieXRlcyBiZWNhdXNlIGl0IGlzIGNyZWF0ZWQKKyAqIHdpdGgga21hbGxvYygpIGluIHRoZSBjcnlwdG8gaW5mcmFzdHJ1Y3R1cmUKKyAqCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX2FsZyBhZXNfYWxnc1tdID0geyB7CisJLmNyYV9uYW1lCQk9CSJhZXMiLAorCS5jcmFfZHJpdmVyX25hbWUJPQkiYWVzLXBwYy1zcGUiLAorCS5jcmFfcHJpb3JpdHkJCT0JMzAwLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlBRVNfQkxPQ0tfU0laRSwKKwkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBwcGNfYWVzX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0JMCwKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX3UJCQk9CXsKKwkJLmNpcGhlciA9IHsKKwkJCS5jaWFfbWluX2tleXNpemUJPQlBRVNfTUlOX0tFWV9TSVpFLAorCQkJLmNpYV9tYXhfa2V5c2l6ZQk9CUFFU19NQVhfS0VZX1NJWkUsCisJCQkuY2lhX3NldGtleQkJPQlwcGNfYWVzX3NldGtleSwKKwkJCS5jaWFfZW5jcnlwdAkJPQlwcGNfYWVzX2VuY3J5cHQsCisJCQkuY2lhX2RlY3J5cHQJCT0JcHBjX2Flc19kZWNyeXB0CisJCX0KKwl9Cit9LCB7CisJLmNyYV9uYW1lCQk9CSJlY2IoYWVzKSIsCisJLmNyYV9kcml2ZXJfbmFtZQk9CSJlY2ItcHBjLXNwZSIsCisJLmNyYV9wcmlvcml0eQkJPQkzMDAsCisJLmNyYV9mbGFncwkJPQlDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfYmxvY2tzaXplCQk9CUFFU19CTE9DS19TSVpFLAorCS5jcmFfY3R4c2l6ZQkJPQlzaXplb2Yoc3RydWN0IHBwY19hZXNfY3R4KSwKKwkuY3JhX2FsaWdubWFzawkJPQkwLAorCS5jcmFfdHlwZQkJPQkmY3J5cHRvX2Jsa2NpcGhlcl90eXBlLAorCS5jcmFfbW9kdWxlCQk9CVRISVNfTU9EVUxFLAorCS5jcmFfdSA9IHsKKwkJLmJsa2NpcGhlciA9IHsKKwkJCS5taW5fa2V5c2l6ZQkJPQlBRVNfTUlOX0tFWV9TSVpFLAorCQkJLm1heF9rZXlzaXplCQk9CUFFU19NQVhfS0VZX1NJWkUsCisJCQkuaXZzaXplCQkJPQlBRVNfQkxPQ0tfU0laRSwKKwkJCS5zZXRrZXkJCQk9CXBwY19hZXNfc2V0a2V5LAorCQkJLmVuY3J5cHQJCT0JcHBjX2VjYl9lbmNyeXB0LAorCQkJLmRlY3J5cHQJCT0JcHBjX2VjYl9kZWNyeXB0LAorCQl9CisJfQorfSwgeworCS5jcmFfbmFtZQkJPQkiY2JjKGFlcykiLAorCS5jcmFfZHJpdmVyX25hbWUJPQkiY2JjLXBwYy1zcGUiLAorCS5jcmFfcHJpb3JpdHkJCT0JMzAwLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlBRVNfQkxPQ0tfU0laRSwKKwkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBwcGNfYWVzX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0JMCwKKwkuY3JhX3R5cGUJCT0JJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX3UgPSB7CisJCS5ibGtjaXBoZXIgPSB7CisJCQkubWluX2tleXNpemUJCT0JQUVTX01JTl9LRVlfU0laRSwKKwkJCS5tYXhfa2V5c2l6ZQkJPQlBRVNfTUFYX0tFWV9TSVpFLAorCQkJLml2c2l6ZQkJCT0JQUVTX0JMT0NLX1NJWkUsCisJCQkuc2V0a2V5CQkJPQlwcGNfYWVzX3NldGtleSwKKwkJCS5lbmNyeXB0CQk9CXBwY19jYmNfZW5jcnlwdCwKKwkJCS5kZWNyeXB0CQk9CXBwY19jYmNfZGVjcnlwdCwKKwkJfQorCX0KK30sIHsKKwkuY3JhX25hbWUJCT0JImN0cihhZXMpIiwKKwkuY3JhX2RyaXZlcl9uYW1lCT0JImN0ci1wcGMtc3BlIiwKKwkuY3JhX3ByaW9yaXR5CQk9CTMwMCwKKwkuY3JhX2ZsYWdzCQk9CUNSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9ibG9ja3NpemUJCT0JMSwKKwkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBwcGNfYWVzX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0JMCwKKwkuY3JhX3R5cGUJCT0JJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX3UgPSB7CisJCS5ibGtjaXBoZXIgPSB7CisJCQkubWluX2tleXNpemUJCT0JQUVTX01JTl9LRVlfU0laRSwKKwkJCS5tYXhfa2V5c2l6ZQkJPQlBRVNfTUFYX0tFWV9TSVpFLAorCQkJLml2c2l6ZQkJCT0JQUVTX0JMT0NLX1NJWkUsCisJCQkuc2V0a2V5CQkJPQlwcGNfYWVzX3NldGtleSwKKwkJCS5lbmNyeXB0CQk9CXBwY19jdHJfY3J5cHQsCisJCQkuZGVjcnlwdAkJPQlwcGNfY3RyX2NyeXB0LAorCQl9CisJfQorfSwgeworCS5jcmFfbmFtZQkJPQkieHRzKGFlcykiLAorCS5jcmFfZHJpdmVyX25hbWUJPQkieHRzLXBwYy1zcGUiLAorCS5jcmFfcHJpb3JpdHkJCT0JMzAwLAorCS5jcmFfZmxhZ3MJCT0JQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2Jsb2Nrc2l6ZQkJPQlBRVNfQkxPQ0tfU0laRSwKKwkuY3JhX2N0eHNpemUJCT0Jc2l6ZW9mKHN0cnVjdCBwcGNfeHRzX2N0eCksCisJLmNyYV9hbGlnbm1hc2sJCT0JMCwKKwkuY3JhX3R5cGUJCT0JJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKKwkuY3JhX21vZHVsZQkJPQlUSElTX01PRFVMRSwKKwkuY3JhX3UgPSB7CisJCS5ibGtjaXBoZXIgPSB7CisJCQkubWluX2tleXNpemUJCT0JQUVTX01JTl9LRVlfU0laRSAqIDIsCisJCQkubWF4X2tleXNpemUJCT0JQUVTX01BWF9LRVlfU0laRSAqIDIsCisJCQkuaXZzaXplCQkJPQlBRVNfQkxPQ0tfU0laRSwKKwkJCS5zZXRrZXkJCQk9CXBwY194dHNfc2V0a2V5LAorCQkJLmVuY3J5cHQJCT0JcHBjX3h0c19lbmNyeXB0LAorCQkJLmRlY3J5cHQJCT0JcHBjX3h0c19kZWNyeXB0LAorCQl9CisJfQorfSB9OworCitzdGF0aWMgaW50IF9faW5pdCBwcGNfYWVzX21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9hbGdzKGFlc19hbGdzLCBBUlJBWV9TSVpFKGFlc19hbGdzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcGNfYWVzX21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfYWxncyhhZXNfYWxncywgQVJSQVlfU0laRShhZXNfYWxncykpOworfQorCittb2R1bGVfaW5pdChwcGNfYWVzX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHBwY19hZXNfbW9kX2ZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFFUy1FQ0IvQ0JDL0NUUi9YVFMsIFNQRSBvcHRpbWl6ZWQiKTsKKworTU9EVUxFX0FMSUFTX0NSWVBUTygiYWVzIik7CitNT0RVTEVfQUxJQVNfQ1JZUFRPKCJlY2IoYWVzKSIpOworTU9EVUxFX0FMSUFTX0NSWVBUTygiY2JjKGFlcykiKTsKK01PRFVMRV9BTElBU19DUllQVE8oImN0cihhZXMpIik7CitNT0RVTEVfQUxJQVNfQ1JZUFRPKCJ4dHMoYWVzKSIpOworTU9EVUxFX0FMSUFTX0NSWVBUTygiYWVzLXBwYy1zcGUiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcnlwdG8vYWVzLXNwZS1rZXlzLlMgYi9hcmNoL3Bvd2VycGMvY3J5cHRvL2Flcy1zcGUta2V5cy5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODA5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3J5cHRvL2Flcy1zcGUta2V5cy5TCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogS2V5IGhhbmRsaW5nIGZ1bmN0aW9ucyBmb3IgUFBDIEFFUyBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBNYXJrdXMgU3RvY2toYXVzZW4gPHN0b2NraGF1c2VuQGNvbGxvZ2lhLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgorCisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyNkZWZpbmUgTE9BRF9LRVkoZCwgcywgb2ZmKSBcCisJbHd6CQlkLG9mZihzKTsKKyNlbHNlCisjZGVmaW5lIExPQURfS0VZKGQsIHMsIG9mZikgXAorCWxpCQlyMCxvZmY7IFwKKwlsd2JyeAkJZCxzLHIwOworI2VuZGlmCisKKyNkZWZpbmUgSU5JVElBTElaRV9LRVkgXAorCXN0d3UJCXIxLC0zMihyMSk7CS8qIGNyZWF0ZSBzdGFjayBmcmFtZQkJKi8gXAorCXN0dwkJcjE0LDgocjEpOwkvKiBzYXZlIHJlZ2lzdGVycwkJKi8gXAorCXN0dwkJcjE1LDEyKHIxKTsJCQkJCSAgIFwKKwlzdHcJCXIxNiwxNihyMSk7CisKKyNkZWZpbmUgRklOQUxJWkVfS0VZIFwKKwlsd3oJCXIxNCw4KHIxKTsJLyogcmVzdG9yZSByZWdpc3RlcnMJCSovIFwKKwlsd3oJCXIxNSwxMihyMSk7CQkJCQkgICBcCisJbHd6CQlyMTYsMTYocjEpOwkJCQkJICAgXAorCXhvcgkJcjUscjUscjU7CS8qIGNsZWFyIHNlbnNpdGl2ZSBkYXRhCQkqLyBcCisJeG9yCQlyNixyNixyNjsJCQkJCSAgIFwKKwl4b3IJCXI3LHI3LHI3OwkJCQkJICAgXAorCXhvcgkJcjgscjgscjg7CQkJCQkgICBcCisJeG9yCQlyOSxyOSxyOTsJCQkJCSAgIFwKKwl4b3IJCXIxMCxyMTAscjEwOwkJCQkJICAgXAorCXhvcgkJcjExLHIxMSxyMTE7CQkJCQkgICBcCisJeG9yCQlyMTIscjEyLHIxMjsJCQkJCSAgIFwKKwlhZGRpCQlyMSxyMSwzMjsJLyogY2xlYW51cCBzdGFjawkJKi8KKworI2RlZmluZSBMU19CT1gociwgdDEsIHQyKSBcCisJbGlzCQl0MixQUENfQUVTXzRLX0VOQ1RBQkBoOwkJCQkgICBcCisJb3JpCQl0Mix0MixQUENfQUVTXzRLX0VOQ1RBQkBsOwkJCSAgIFwKKwlybHdpbWkJCXQyLHIsNCwyMCwyNzsJCQkJCSAgIFwKKwlsYnoJCXQxLDgodDIpOwkJCQkJICAgXAorCXJsd2ltaQkJcix0MSwwLDI0LDMxOwkJCQkJICAgXAorCXJsd2ltaQkJdDIsciwyOCwyMCwyNzsJCQkJCSAgIFwKKwlsYnoJCXQxLDgodDIpOwkJCQkJICAgXAorCXJsd2ltaQkJcix0MSw4LDE2LDIzOwkJCQkJICAgXAorCXJsd2ltaQkJdDIsciwyMCwyMCwyNzsJCQkJCSAgIFwKKwlsYnoJCXQxLDgodDIpOwkJCQkJICAgXAorCXJsd2ltaQkJcix0MSwxNiw4LDE1OwkJCQkJICAgXAorCXJsd2ltaQkJdDIsciwxMiwyMCwyNzsJCQkJCSAgIFwKKwlsYnoJCXQxLDgodDIpOwkJCQkJICAgXAorCXJsd2ltaQkJcix0MSwyNCwwLDc7CisKKyNkZWZpbmUgR0Y4X01VTChvdXQsIGluLCB0MSwgdDIpIFwKKwlsaXMgdDEsMHg4MDgwOwkJCS8qIG11bHRpcGxpY2F0aW9uIGluIEdGOAkqLyBcCisJb3JpIHQxLHQxLDB4ODA4MDsgCQkJCQkJICAgXAorCWFuZCB0MSx0MSxpbjsgCQkJCQkJCSAgIFwKKwlzcndpIHQxLHQxLDc7IAkJCQkJCQkgICBcCisJbXVsbGkgdDEsdDEsMHgxYjsgCQkJCQkJICAgXAorCWxpcyB0MiwweDdmN2Y7IAkJCQkJCQkgICBcCisJb3JpIHQyLHQyLDB4N2Y3ZjsgCQkJCQkJICAgXAorCWFuZCB0Mix0MixpbjsgCQkJCQkJCSAgIFwKKwlzbHdpIHQyLHQyLDE7IAkJCQkJCQkgICBcCisJeG9yIG91dCx0MSx0MjsKKworLyoKKyAqIHBwY19leHBhbmRfa2V5XzEyOCh1MzIgKmtleV9lbmMsIGNvbnN0IHU4ICprZXkpCisgKgorICogRXhwYW5kIDEyOCBiaXQga2V5IGludG8gMTc2IGJ5dGVzIGVuY3J5cHRpb24ga2V5LiBJdCBjb25zaXN0cyBvZgorICoga2V5IGl0c2VsZiBwbHVzIDEwIHJvdW5kcyB3aXRoIDE2IGJ5dGVzIGVhY2gKKyAqCisgKi8KK19HTE9CQUwocHBjX2V4cGFuZF9rZXlfMTI4KQorCUlOSVRJQUxJWkVfS0VZCisJTE9BRF9LRVkocjUscjQsMCkKKwlMT0FEX0tFWShyNixyNCw0KQorCUxPQURfS0VZKHI3LHI0LDgpCisJTE9BRF9LRVkocjgscjQsMTIpCisJc3R3CQlyNSwwKHIzKQkvKiBrZXlbMC4uM10gPSBpbnB1dCBkYXRhCSovCisJc3R3CQlyNiw0KHIzKQorCXN0dwkJcjcsOChyMykKKwlzdHcJCXI4LDEyKHIzKQorCWxpCQlyMTYsMTAJCS8qIDEwIGV4cGFuc2lvbiByb3VuZHMJCSovCisJbGlzCQlyMCwweDAxMDAJLyogUkNPKDEpCQkJKi8KK3BwY19leHBhbmRfMTI4X2xvb3A6CisJYWRkaQkJcjMscjMsMTYKKwltcgkJcjE0LHI4CQkvKiBhcHBseSBMU19CT1ggdG8gNHRoIHRlbXAJKi8KKwlyb3Rsd2kJCXIxNCxyMTQsOAorCUxTX0JPWChyMTQsIHIxNSwgcjQpCisJeG9yCQlyMTQscjE0LHIwCisJeG9yCQlyNSxyNSxyMTQJLyogeG9yIG5leHQgNCBrZXlzCQkqLworCXhvcgkJcjYscjYscjUKKwl4b3IJCXI3LHI3LHI2CisJeG9yCQlyOCxyOCxyNworCXN0dwkJcjUsMChyMykJLyogc3RvcmUgbmV4dCA0IGtleXMJCSovCisJc3R3CQlyNiw0KHIzKQorCXN0dwkJcjcsOChyMykKKwlzdHcJCXI4LDEyKHIzKQorCUdGOF9NVUwocjAsIHIwLCByNCwgcjE0KQkvKiBtdWx0aXBseSBSQ08gYnkgMiBpbiBHRgkqLworCXN1YmkJCXIxNixyMTYsMQorCWNtcHdpCQlyMTYsMAorCWJ0CQllcSxwcGNfZXhwYW5kXzEyOF9lbmQKKwliCQlwcGNfZXhwYW5kXzEyOF9sb29wCitwcGNfZXhwYW5kXzEyOF9lbmQ6CisJRklOQUxJWkVfS0VZCisJYmxyCisKKy8qCisgKiBwcGNfZXhwYW5kX2tleV8xOTIodTMyICprZXlfZW5jLCBjb25zdCB1OCAqa2V5KQorICoKKyAqIEV4cGFuZCAxOTIgYml0IGtleSBpbnRvIDIwOCBieXRlcyBlbmNyeXB0aW9uIGtleS4gSXQgY29uc2lzdHMgb2Yga2V5CisgKiBpdHNlbGYgcGx1cyAxMiByb3VuZHMgd2l0aCAxNiBieXRlcyBlYWNoCisgKgorICovCitfR0xPQkFMKHBwY19leHBhbmRfa2V5XzE5MikKKwlJTklUSUFMSVpFX0tFWQorCUxPQURfS0VZKHI1LHI0LDApCisJTE9BRF9LRVkocjYscjQsNCkKKwlMT0FEX0tFWShyNyxyNCw4KQorCUxPQURfS0VZKHI4LHI0LDEyKQorCUxPQURfS0VZKHI5LHI0LDE2KQorCUxPQURfS0VZKHIxMCxyNCwyMCkKKwlzdHcJCXI1LDAocjMpCisJc3R3CQlyNiw0KHIzKQorCXN0dwkJcjcsOChyMykKKwlzdHcJCXI4LDEyKHIzKQorCXN0dwkJcjksMTYocjMpCisJc3R3CQlyMTAsMjAocjMpCisJbGkJCXIxNiw4CQkvKiA4IGV4cGFuc2lvbiByb3VuZHMJCSovCisJbGlzCQlyMCwweDAxMDAJLyogUkNPKDEpCQkJKi8KK3BwY19leHBhbmRfMTkyX2xvb3A6CisJYWRkaQkJcjMscjMsMjQKKwltcgkJcjE0LHIxMAkJLyogYXBwbHkgTFNfQk9YIHRvIDZ0aCB0ZW1wCSovCisJcm90bHdpCQlyMTQscjE0LDgKKwlMU19CT1gocjE0LCByMTUsIHI0KQorCXhvcgkJcjE0LHIxNCxyMAorCXhvcgkJcjUscjUscjE0CS8qIHhvciBuZXh0IDYga2V5cwkJKi8KKwl4b3IJCXI2LHI2LHI1CisJeG9yCQlyNyxyNyxyNgorCXhvcgkJcjgscjgscjcKKwl4b3IJCXI5LHI5LHI4CisJeG9yCQlyMTAscjEwLHI5CisJc3R3CQlyNSwwKHIzKQorCXN0dwkJcjYsNChyMykKKwlzdHcJCXI3LDgocjMpCisJc3R3CQlyOCwxMihyMykKKwlzdWJpCQlyMTYscjE2LDEKKwljbXB3aQkJcjE2LDAJCS8qIGxhc3Qgcm91bmQgZWFybHkga2ljayBvdXQJKi8KKwlidAkJZXEscHBjX2V4cGFuZF8xOTJfZW5kCisJc3R3CQlyOSwxNihyMykKKwlzdHcJCXIxMCwyMChyMykKKwlHRjhfTVVMKHIwLCByMCwgcjQsIHIxNCkJLyogbXVsdGlwbHkgUkNPIEdGOAkJKi8KKwliCQlwcGNfZXhwYW5kXzE5Ml9sb29wCitwcGNfZXhwYW5kXzE5Ml9lbmQ6CisJRklOQUxJWkVfS0VZCisJYmxyCisKKy8qCisgKiBwcGNfZXhwYW5kX2tleV8yNTYodTMyICprZXlfZW5jLCBjb25zdCB1OCAqa2V5KQorICoKKyAqIEV4cGFuZCAyNTYgYml0IGtleSBpbnRvIDI0MCBieXRlcyBlbmNyeXB0aW9uIGtleS4gSXQgY29uc2lzdHMgb2Yga2V5CisgKiBpdHNlbGYgcGx1cyAxNCByb3VuZHMgd2l0aCAxNiBieXRlcyBlYWNoCisgKgorICovCitfR0xPQkFMKHBwY19leHBhbmRfa2V5XzI1NikKKwlJTklUSUFMSVpFX0tFWQorCUxPQURfS0VZKHI1LHI0LDApCisJTE9BRF9LRVkocjYscjQsNCkKKwlMT0FEX0tFWShyNyxyNCw4KQorCUxPQURfS0VZKHI4LHI0LDEyKQorCUxPQURfS0VZKHI5LHI0LDE2KQorCUxPQURfS0VZKHIxMCxyNCwyMCkKKwlMT0FEX0tFWShyMTEscjQsMjQpCisJTE9BRF9LRVkocjEyLHI0LDI4KQorCXN0dwkJcjUsMChyMykKKwlzdHcJCXI2LDQocjMpCisJc3R3CQlyNyw4KHIzKQorCXN0dwkJcjgsMTIocjMpCisJc3R3CQlyOSwxNihyMykKKwlzdHcJCXIxMCwyMChyMykKKwlzdHcJCXIxMSwyNChyMykKKwlzdHcJCXIxMiwyOChyMykKKwlsaQkJcjE2LDcJCS8qIDcgZXhwYW5zaW9uIHJvdW5kcwkJKi8KKwlsaXMJCXIwLDB4MDEwMAkvKiBSQ08oMSkJCQkqLworcHBjX2V4cGFuZF8yNTZfbG9vcDoKKwlhZGRpCQlyMyxyMywzMgorCW1yCQlyMTQscjEyCQkvKiBhcHBseSBMU19CT1ggdG8gOHRoIHRlbXAJKi8KKwlyb3Rsd2kJCXIxNCxyMTQsOAorCUxTX0JPWChyMTQsIHIxNSwgcjQpCisJeG9yCQlyMTQscjE0LHIwCisJeG9yCQlyNSxyNSxyMTQJLyogeG9yIDQga2V5cwkJCSovCisJeG9yCQlyNixyNixyNQorCXhvcgkJcjcscjcscjYKKwl4b3IJCXI4LHI4LHI3CisJbXIJCXIxNCxyOAorCUxTX0JPWChyMTQsIHIxNSwgcjQpCQkvKiBhcHBseSBMU19CT1ggdG8gNHRoIHRlbXAJKi8KKwl4b3IJCXI5LHI5LHIxNAkvKiB4b3IgNCBrZXlzCQkJKi8KKwl4b3IJCXIxMCxyMTAscjkKKwl4b3IJCXIxMSxyMTEscjEwCisJeG9yCQlyMTIscjEyLHIxMQorCXN0dwkJcjUsMChyMykKKwlzdHcJCXI2LDQocjMpCisJc3R3CQlyNyw4KHIzKQorCXN0dwkJcjgsMTIocjMpCisJc3ViaQkJcjE2LHIxNiwxCisJY21wd2kJCXIxNiwwCQkvKiBsYXN0IHJvdW5kIGVhcmx5IGtpY2sgb3V0CSovCisJYnQJCWVxLHBwY19leHBhbmRfMjU2X2VuZAorCXN0dwkJcjksMTYocjMpCisJc3R3CQlyMTAsMjAocjMpCisJc3R3CQlyMTEsMjQocjMpCisJc3R3CQlyMTIsMjgocjMpCisJR0Y4X01VTChyMCwgcjAsIHI0LCByMTQpCisJYgkJcHBjX2V4cGFuZF8yNTZfbG9vcAorcHBjX2V4cGFuZF8yNTZfZW5kOgorCUZJTkFMSVpFX0tFWQorCWJscgorCisvKgorICogcHBjX2dlbmVyYXRlX2RlY3J5cHRfa2V5OiBkZXJpdmUgZGVjcnlwdGlvbiBrZXkgZnJvbSBlbmNyeXB0aW9uIGtleQorICogbnVtYmVyIG9mIGJ5dGVzIHRvIGhhbmRsZSBhcmUgY2FsY3VsYXRlZCBmcm9tIGxlbmd0aCBvZiBrZXkgKDE2LzI0LzMyKQorICoKKyAqLworX0dMT0JBTChwcGNfZ2VuZXJhdGVfZGVjcnlwdF9rZXkpCisJYWRkaQkJcjYscjUsMjQKKwlzbHdpCQlyNixyNiwyCisJbHd6eAkJcjcscjQscjYJLyogZmlyc3QvbGFzdCA0IHdvcmRzIGFyZSBzYW1lCSovCisJc3R3CQlyNywwKHIzKQorCWx3egkJcjcsMChyNCkKKwlzdHd4CQlyNyxyMyxyNgorCWFkZGkJCXI2LHI2LDQKKwlsd3p4CQlyNyxyNCxyNgorCXN0dwkJcjcsNChyMykKKwlsd3oJCXI3LDQocjQpCisJc3R3eAkJcjcscjMscjYKKwlhZGRpCQlyNixyNiw0CisJbHd6eAkJcjcscjQscjYKKwlzdHcJCXI3LDgocjMpCisJbHd6CQlyNyw4KHI0KQorCXN0d3gJCXI3LHIzLHI2CisJYWRkaQkJcjYscjYsNAorCWx3engJCXI3LHI0LHI2CisJc3R3CQlyNywxMihyMykKKwlsd3oJCXI3LDEyKHI0KQorCXN0d3gJCXI3LHIzLHI2CisJYWRkaQkJcjMscjMsMTYKKwlhZGQJCXI0LHI0LHI2CisJc3ViaQkJcjQscjQsMjgKKwlhZGRpCQlyNSxyNSwyMAorCXNyd2kJCXI1LHI1LDIKK3BwY19nZW5lcmF0ZV9kZWNyeXB0X2Jsb2NrOgorCWxpCXI2LDQKKwltdGN0cglyNgorcHBjX2dlbmVyYXRlX2RlY3J5cHRfd29yZDoKKwlsd3oJCXI2LDAocjQpCisJR0Y4X01VTChyNywgcjYsIHIwLCByNykKKwlHRjhfTVVMKHI4LCByNywgcjAsIHI4KQorCUdGOF9NVUwocjksIHI4LCByMCwgcjkpCisJeG9yCQlyMTAscjkscjYKKwl4b3IJCXIxMSxyNyxyOAorCXhvcgkJcjExLHIxMSxyOQorCXhvcgkJcjEyLHI3LHIxMAorCXJvdHJ3aQkJcjEyLHIxMiwyNAorCXhvcgkJcjExLHIxMSxyMTIKKwl4b3IJCXIxMixyOCxyMTAKKwlyb3Ryd2kJCXIxMixyMTIsMTYKKwl4b3IJCXIxMSxyMTEscjEyCisJcm90cndpCQlyMTIscjEwLDgKKwl4b3IJCXIxMSxyMTEscjEyCisJc3R3CQlyMTEsMChyMykKKwlhZGRpCQlyMyxyMyw0CisJYWRkaQkJcjQscjQsNAorCWJkbnoJCXBwY19nZW5lcmF0ZV9kZWNyeXB0X3dvcmQKKwlzdWJpCQlyNCxyNCwzMgorCXN1YmkJCXI1LHI1LDEKKwljbXB3aQkJcjUsMAorCWJ0CQlndCxwcGNfZ2VuZXJhdGVfZGVjcnlwdF9ibG9jaworCWJscgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NyeXB0by9hZXMtc3BlLW1vZGVzLlMgYi9hcmNoL3Bvd2VycGMvY3J5cHRvL2Flcy1zcGUtbW9kZXMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDQ4MDMyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NyeXB0by9hZXMtc3BlLW1vZGVzLlMKQEAgLTAsMCArMSw2MzAgQEAKKy8qCisgKiBBRVMgbW9kZXMgKEVDQi9DQkMvQ1RSL1hUUykgZm9yIFBQQyBBRVMgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgTWFya3VzIFN0b2NraGF1c2VuIDxzdG9ja2hhdXNlbkBjb2xsb2dpYS5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KKyNpbmNsdWRlICJhZXMtc3BlLXJlZ3MuaCIKKworI2lmZGVmIF9fQklHX0VORElBTl9fCQkJLyogTWFjcm9zIGZvciBiaWcgZW5kaWFuIGJ1aWxkcwkqLworCisjZGVmaW5lIExPQURfREFUQShyZWcsIG9mZikgXAorCWx3egkJcmVnLG9mZihyU1ApOwkvKiBsb2FkIHdpdGggb2Zmc2V0CQkqLworI2RlZmluZSBTQVZFX0RBVEEocmVnLCBvZmYpIFwKKwlzdHcJCXJlZyxvZmYockRQKTsJLyogc2F2ZSB3aXRoIG9mZnNldAkJKi8KKyNkZWZpbmUgTkVYVF9CTE9DSyBcCisJYWRkaQkJclNQLHJTUCwxNjsJLyogaW5jcmVtZW50IHBvaW50ZXJzIHBlciBibG9jCSovIFwKKwlhZGRpCQlyRFAsckRQLDE2OworI2RlZmluZSBMT0FEX0lWKHJlZywgb2ZmKSBcCisJbHd6CQlyZWcsb2ZmKHJJUCk7CS8qIElWIGxvYWRpbmcgd2l0aCBvZmZzZXQJKi8KKyNkZWZpbmUgU0FWRV9JVihyZWcsIG9mZikgXAorCXN0dwkJcmVnLG9mZihySVApOwkvKiBJViBzYXZpbmcgd2l0aCBvZmZzZXQJKi8KKyNkZWZpbmUgU1RBUlRfSVYJCQkvKiBub3RoaW5nIHRvIHJlc2V0CQkqLworI2RlZmluZSBDQkNfREVDIDE2CQkJLyogQ0JDIGRlY3JlbWVudCBwZXIgYmxvY2sJKi8KKyNkZWZpbmUgQ1RSX0RFQyAxCQkJLyogQ1RSIGRlY3JlbWVudCBvbmUgYnl0ZQkqLworCisjZWxzZQkJCQkJLyogTWFjcm9zIGZvciBsaXR0bGUgZW5kaWFuCSovCisKKyNkZWZpbmUgTE9BRF9EQVRBKHJlZywgb2ZmKSBcCisJbHdicngJCXJlZywwLHJTUDsJLyogbG9hZCByZXZlcnNlZAkJKi8gXAorCWFkZGkJCXJTUCxyU1AsNDsJLyogYW5kIGluY3JlbWVudCBwb2ludGVyCSovCisjZGVmaW5lIFNBVkVfREFUQShyZWcsIG9mZikgXAorCXN0d2JyeAkJcmVnLDAsckRQOwkvKiBzYXZlIHJldmVyc2VkCQkqLyBcCisJYWRkaQkJckRQLHJEUCw0OwkvKiBhbmQgaW5jcmVtZW50IHBvaW50ZXIJKi8KKyNkZWZpbmUgTkVYVF9CTE9DSwkJCS8qIG5vdGhpbmcgdG9kbwkJCSovCisjZGVmaW5lIExPQURfSVYocmVnLCBvZmYpIFwKKwlsd2JyeAkJcmVnLDAscklQOwkvKiBsb2FkIHJldmVyc2VkCQkqLyBcCisJYWRkaQkJcklQLHJJUCw0OwkvKiBhbmQgaW5jcmVtZW50IHBvaW50ZXIJKi8KKyNkZWZpbmUgU0FWRV9JVihyZWcsIG9mZikgXAorCXN0d2JyeAkJcmVnLDAscklQOwkvKiBsb2FkIHJldmVyc2VkCQkqLyBcCisJYWRkaQkJcklQLHJJUCw0OwkvKiBhbmQgaW5jcmVtZW50IHBvaW50ZXIJKi8KKyNkZWZpbmUgU1RBUlRfSVYgXAorCXN1YmkJCXJJUCxySVAsMTY7CS8qIG11c3QgcmVzZXQgcG9pbnRlcgkJKi8KKyNkZWZpbmUgQ0JDX0RFQyAzMgkJCS8qIDIgYmxvY2tzIGJlY2F1c2Ugb2YgaW5jcwkqLworI2RlZmluZSBDVFJfREVDIDE3CQkJLyogMSBibG9jayBiZWNhdXNlIG9mIGluY3MJKi8KKworI2VuZGlmCisKKyNkZWZpbmUgU0FWRV8wX1JFR1MKKyNkZWZpbmUgTE9BRF8wX1JFR1MKKworI2RlZmluZSBTQVZFXzRfUkVHUyBcCisJc3R3CQlySTAsOTYocjEpOwkvKiBzYXZlIDMyIGJpdCByZWdpc3RlcnMJKi8gXAorCXN0dwkJckkxLDEwMChyMSk7CQkJCQkgICBcCisJc3R3CQlySTIsMTA0KHIxKTsJCQkJCSAgIFwKKwlzdHcJCXJJMywxMDgocjEpOworCisjZGVmaW5lIExPQURfNF9SRUdTIFwKKwlsd3oJCXJJMCw5NihyMSk7CS8qIHJlc3RvcmUgMzIgYml0IHJlZ2lzdGVycwkqLyBcCisJbHd6CQlySTEsMTAwKHIxKTsJCQkJCSAgIFwKKwlsd3oJCXJJMiwxMDQocjEpOwkJCQkJICAgXAorCWx3egkJckkzLDEwOChyMSk7CisKKyNkZWZpbmUgU0FWRV84X1JFR1MgXAorCVNBVkVfNF9SRUdTCQkJCQkJCSAgIFwKKwlzdHcJCXJHMCwxMTIocjEpOwkvKiBzYXZlIDMyIGJpdCByZWdpc3RlcnMJKi8gXAorCXN0dwkJckcxLDExNihyMSk7CQkJCQkgICBcCisJc3R3CQlyRzIsMTIwKHIxKTsJCQkJCSAgIFwKKwlzdHcJCXJHMywxMjQocjEpOworCisjZGVmaW5lIExPQURfOF9SRUdTIFwKKwlMT0FEXzRfUkVHUwkJCQkJCQkgICBcCisJbHd6CQlyRzAsMTEyKHIxKTsJLyogcmVzdG9yZSAzMiBiaXQgcmVnaXN0ZXJzCSovIFwKKwlsd3oJCXJHMSwxMTYocjEpOwkJCQkJICAgXAorCWx3egkJckcyLDEyMChyMSk7CQkJCQkgICBcCisJbHd6CQlyRzMsMTI0KHIxKTsKKworI2RlZmluZSBJTklUSUFMSVpFX0NSWVBUKHRhYixucjMyYml0cmVncykgXAorCW1mbHIJCXIwOwkJCQkJCSAgIFwKKwlzdHd1CQlyMSwtMTYwKHIxKTsJLyogY3JlYXRlIHN0YWNrIGZyYW1lCQkqLyBcCisJbGlzCQlyVDAsdGFiQGg7CS8qIGVuLS9kZWNyeXB0aW9uIHRhYmxlIHBvaW50ZXIJKi8gXAorCXN0dwkJcjAsOChyMSk7CS8qIHNhdmUgbGluayByZWdpc3RlcgkJKi8gXAorCW9yaQkJclQwLHJUMCx0YWJAbDsJCQkJCSAgIFwKKwlldnN0ZHcJCXIxNCwxNihyMSk7CQkJCQkgICBcCisJbXIJCXJLUyxyS1A7CQkJCQkgICBcCisJZXZzdGR3CQlyMTUsMjQocjEpOwkvKiBXZSBtdXN0IHNhdmUgbm9uIHZvbGF0aWxlCSovIFwKKwlldnN0ZHcJCXIxNiwzMihyMSk7CS8qIHJlZ2lzdGVycy4gVGFrZSB0aGUgY2hhbmNlCSovIFwKKwlldnN0ZHcJCXIxNyw0MChyMSk7CS8qIGFuZCBzYXZlIHRoZSBTUEUgcGFydCB0b28JKi8gXAorCWV2c3RkdwkJcjE4LDQ4KHIxKTsJCQkJCSAgIFwKKwlldnN0ZHcJCXIxOSw1NihyMSk7CQkJCQkgICBcCisJZXZzdGR3CQlyMjAsNjQocjEpOwkJCQkJICAgXAorCWV2c3RkdwkJcjIxLDcyKHIxKTsJCQkJCSAgIFwKKwlldnN0ZHcJCXIyMiw4MChyMSk7CQkJCQkgICBcCisJZXZzdGR3CQlyMjMsODgocjEpOwkJCQkJICAgXAorCVNBVkVfIyNucjMyYml0cmVncyMjX1JFR1MKKworI2RlZmluZSBGSU5BTElaRV9DUllQVChucjMyYml0cmVncykgXAorCWx3egkJcjAsOChyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIxNCwxNihyMSk7CS8qIHJlc3RvcmUgU1BFIHJlZ2lzdGVycwkqLyBcCisJZXZsZHcJCXIxNSwyNChyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIxNiwzMihyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIxNyw0MChyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIxOCw0OChyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIxOSw1NihyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIyMCw2NChyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIyMSw3MihyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIyMiw4MChyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIyMyw4OChyMSk7CQkJCQkgICBcCisJTE9BRF8jI25yMzJiaXRyZWdzIyNfUkVHUwkJCQkJICAgXAorCW10bHIJCXIwOwkJLyogcmVzdG9yZSBsaW5rIHJlZ2lzdGVyCSovIFwKKwl4b3IJCXIwLHIwLHIwOwkJCQkJICAgXAorCXN0dwkJcjAsMTYocjEpOwkvKiBkZWxldGUgc2Vuc2l0aXZlIGRhdGEJKi8gXAorCXN0dwkJcjAsMjQocjEpOwkvKiB0aGF0IHdlIG1pZ2h0IGhhdmUgcHVzaGVkCSovIFwKKwlzdHcJCXIwLDMyKHIxKTsJLyogZnJvbSBvdGhlciBjb250ZXh0IHRoYXQgcnVucwkqLyBcCisJc3R3CQlyMCw0MChyMSk7CS8qIHRoZSBzYW1lIGNvZGUJCSovIFwKKwlzdHcJCXIwLDQ4KHIxKTsJCQkJCSAgIFwKKwlzdHcJCXIwLDU2KHIxKTsJCQkJCSAgIFwKKwlzdHcJCXIwLDY0KHIxKTsJCQkJCSAgIFwKKwlzdHcJCXIwLDcyKHIxKTsJCQkJCSAgIFwKKwlzdHcJCXIwLDgwKHIxKTsJCQkJCSAgIFwKKwlzdHcJCXIwLDg4KHIxKTsJCQkJCSAgIFwKKwlhZGRpCQlyMSxyMSwxNjA7CS8qIGNsZWFudXAgc3RhY2sgZnJhbWUJCSovCisKKyNkZWZpbmUgRU5ESUFOX1NXQVAodDAsIHQxLCBzMCwgczEpIFwKKwlyb3Ryd2kJCXQwLHMwLDg7CS8qIHN3YXAgZW5kaWFubmVzcyBmb3IgMiBHUFJzCSovIFwKKwlyb3Ryd2kJCXQxLHMxLDg7CQkJCQkgICBcCisJcmx3aW1pCQl0MCxzMCw4LDgsMTU7CQkJCQkgICBcCisJcmx3aW1pCQl0MSxzMSw4LDgsMTU7CQkJCQkgICBcCisJcmx3aW1pCQl0MCxzMCw4LDI0LDMxOwkJCQkJICAgXAorCXJsd2ltaQkJdDEsczEsOCwyNCwzMTsKKworI2RlZmluZSBHRjEyOF9NVUwoZDAsIGQxLCBkMiwgZDMsIHQwKSBcCisJbGkJCXQwLDB4ODc7CS8qIG11bHRpcGxpY2F0aW9uIGluIEdGMTI4CSovIFwKKwljbXB3aQkJZDMsLTE7CQkJCQkJICAgXAorCWlzZWxndAkJdDAsMCx0MDsJCQkJCSAgIFwKKwlybHdpbWkJCWQzLGQyLDAsMCwwOwkvKiBwcm9wYWdhdGUgImNhcnJ5IiBiaXRzCSovIFwKKwlyb3Rsd2kJCWQzLGQzLDE7CQkJCQkgICBcCisJcmx3aW1pCQlkMixkMSwwLDAsMDsJCQkJCSAgIFwKKwlyb3Rsd2kJCWQyLGQyLDE7CQkJCQkgICBcCisJcmx3aW1pCQlkMSxkMCwwLDAsMDsJCQkJCSAgIFwKKwlzbHdpCQlkMCxkMCwxOwkvKiBzaGlmdCBsZWZ0IDEyOCBiaXQJCSovIFwKKwlyb3Rsd2kJCWQxLGQxLDE7CQkJCQkgICBcCisJeG9yCQlkMCxkMCx0MDsKKworI2RlZmluZSBTVEFSVF9LRVkoZDAsIGQxLCBkMiwgZDMpIFwKKwlsd3oJCXJXMCwwKHJLUCk7CQkJCQkgICBcCisJbXRjdHIJCXJSUjsJCQkJCQkgICBcCisJbHd6CQlyVzEsNChyS1ApOwkJCQkJICAgXAorCWx3egkJclcyLDgocktQKTsJCQkJCSAgIFwKKwlsd3oJCXJXMywxMihyS1ApOwkJCQkJICAgXAorCXhvcgkJckQwLGQwLHJXMDsJCQkJCSAgIFwKKwl4b3IJCXJEMSxkMSxyVzE7CQkJCQkgICBcCisJeG9yCQlyRDIsZDIsclcyOwkJCQkJICAgXAorCXhvcgkJckQzLGQzLHJXMzsKKworLyoKKyAqIHBwY19lbmNyeXB0X2Flcyh1OCAqb3V0LCBjb25zdCB1OCAqaW4sIHUzMiAqa2V5X2VuYywKKyAqCQkgICB1MzIgcm91bmRzKQorICoKKyAqIGNhbGxlZCBmcm9tIGdsdWUgbGF5ZXIgdG8gZW5jcnlwdCBhIHNpbmdsZSAxNiBieXRlIGJsb2NrCisgKiByb3VuZCB2YWx1ZXMgYXJlIEFFUzEyOCA9IDQsIEFFUzE5MiA9IDUsIEFFUzI1NiA9IDYKKyAqCisgKi8KK19HTE9CQUwocHBjX2VuY3J5cHRfYWVzKQorCUlOSVRJQUxJWkVfQ1JZUFQoUFBDX0FFU180S19FTkNUQUIsIDApCisJTE9BRF9EQVRBKHJEMCwgMCkKKwlMT0FEX0RBVEEockQxLCA0KQorCUxPQURfREFUQShyRDIsIDgpCisJTE9BRF9EQVRBKHJEMywgMTIpCisJU1RBUlRfS0VZKHJEMCwgckQxLCByRDIsIHJEMykKKwlibAkJcHBjX2VuY3J5cHRfYmxvY2sKKwl4b3IJCXJEMCxyRDAsclcwCisJU0FWRV9EQVRBKHJEMCwgMCkKKwl4b3IJCXJEMSxyRDEsclcxCisJU0FWRV9EQVRBKHJEMSwgNCkKKwl4b3IJCXJEMixyRDIsclcyCisJU0FWRV9EQVRBKHJEMiwgOCkKKwl4b3IJCXJEMyxyRDMsclczCisJU0FWRV9EQVRBKHJEMywgMTIpCisJRklOQUxJWkVfQ1JZUFQoMCkKKwlibHIKKworLyoKKyAqIHBwY19kZWNyeXB0X2Flcyh1OCAqb3V0LCBjb25zdCB1OCAqaW4sIHUzMiAqa2V5X2RlYywKKyAqCQkgICB1MzIgcm91bmRzKQorICoKKyAqIGNhbGxlZCBmcm9tIGdsdWUgbGF5ZXIgdG8gZGVjcnlwdCBhIHNpbmdsZSAxNiBieXRlIGJsb2NrCisgKiByb3VuZCB2YWx1ZXMgYXJlIEFFUzEyOCA9IDQsIEFFUzE5MiA9IDUsIEFFUzI1NiA9IDYKKyAqCisgKi8KK19HTE9CQUwocHBjX2RlY3J5cHRfYWVzKQorCUlOSVRJQUxJWkVfQ1JZUFQoUFBDX0FFU180S19ERUNUQUIsMCkKKwlMT0FEX0RBVEEockQwLCAwKQorCWFkZGkJCXJUMSxyVDAsNDA5NgorCUxPQURfREFUQShyRDEsIDQpCisJTE9BRF9EQVRBKHJEMiwgOCkKKwlMT0FEX0RBVEEockQzLCAxMikKKwlTVEFSVF9LRVkockQwLCByRDEsIHJEMiwgckQzKQorCWJsCQlwcGNfZGVjcnlwdF9ibG9jaworCXhvcgkJckQwLHJEMCxyVzAKKwlTQVZFX0RBVEEockQwLCAwKQorCXhvcgkJckQxLHJEMSxyVzEKKwlTQVZFX0RBVEEockQxLCA0KQorCXhvcgkJckQyLHJEMixyVzIKKwlTQVZFX0RBVEEockQyLCA4KQorCXhvcgkJckQzLHJEMyxyVzMKKwlTQVZFX0RBVEEockQzLCAxMikKKwlGSU5BTElaRV9DUllQVCgwKQorCWJscgorCisvKgorICogcHBjX2VuY3J5cHRfZWNiKHU4ICpvdXQsIGNvbnN0IHU4ICppbiwgdTMyICprZXlfZW5jLAorICoJCSAgIHUzMiByb3VuZHMsIHUzMiBieXRlcyk7CisgKgorICogY2FsbGVkIGZyb20gZ2x1ZSBsYXllciB0byBlbmNyeXB0IG11bHRpcGxlIGJsb2NrcyB2aWEgRUNCCisgKiBCeXRlcyBtdXN0IGJlIGxhcmdlciBvciBlcXVhbCAxNiBhbmQgb25seSB3aG9sZSBibG9ja3MgYXJlCisgKiBwcm9jZXNzZWQuIHJvdW5kIHZhbHVlcyBhcmUgQUVTMTI4ID0gNCwgQUVTMTkyID0gNSBhbmQKKyAqIEFFUzI1NiA9IDYKKyAqCisgKi8KK19HTE9CQUwocHBjX2VuY3J5cHRfZWNiKQorCUlOSVRJQUxJWkVfQ1JZUFQoUFBDX0FFU180S19FTkNUQUIsIDApCitwcGNfZW5jcnlwdF9lY2JfbG9vcDoKKwlMT0FEX0RBVEEockQwLCAwKQorCW1yCQlyS1AscktTCisJTE9BRF9EQVRBKHJEMSwgNCkKKwlzdWJpCQlyTE4sckxOLDE2CisJTE9BRF9EQVRBKHJEMiwgOCkKKwljbXB3aQkJckxOLDE1CisJTE9BRF9EQVRBKHJEMywgMTIpCisJU1RBUlRfS0VZKHJEMCwgckQxLCByRDIsIHJEMykKKwlibAkJcHBjX2VuY3J5cHRfYmxvY2sKKwl4b3IJCXJEMCxyRDAsclcwCisJU0FWRV9EQVRBKHJEMCwgMCkKKwl4b3IJCXJEMSxyRDEsclcxCisJU0FWRV9EQVRBKHJEMSwgNCkKKwl4b3IJCXJEMixyRDIsclcyCisJU0FWRV9EQVRBKHJEMiwgOCkKKwl4b3IJCXJEMyxyRDMsclczCisJU0FWRV9EQVRBKHJEMywgMTIpCisJTkVYVF9CTE9DSworCWJ0CQlndCxwcGNfZW5jcnlwdF9lY2JfbG9vcAorCUZJTkFMSVpFX0NSWVBUKDApCisJYmxyCisKKy8qCisgKiBwcGNfZGVjcnlwdF9lY2IodTggKm91dCwgY29uc3QgdTggKmluLCB1MzIgKmtleV9kZWMsCisgKgkJICAgdTMyIHJvdW5kcywgdTMyIGJ5dGVzKTsKKyAqCisgKiBjYWxsZWQgZnJvbSBnbHVlIGxheWVyIHRvIGRlY3J5cHQgbXVsdGlwbGUgYmxvY2tzIHZpYSBFQ0IKKyAqIEJ5dGVzIG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIDE2IGFuZCBvbmx5IHdob2xlIGJsb2NrcyBhcmUKKyAqIHByb2Nlc3NlZC4gcm91bmQgdmFsdWVzIGFyZSBBRVMxMjggPSA0LCBBRVMxOTIgPSA1IGFuZAorICogQUVTMjU2ID0gNgorICoKKyAqLworX0dMT0JBTChwcGNfZGVjcnlwdF9lY2IpCisJSU5JVElBTElaRV9DUllQVChQUENfQUVTXzRLX0RFQ1RBQiwgMCkKKwlhZGRpCQlyVDEsclQwLDQwOTYKK3BwY19kZWNyeXB0X2VjYl9sb29wOgorCUxPQURfREFUQShyRDAsIDApCisJbXIJCXJLUCxyS1MKKwlMT0FEX0RBVEEockQxLCA0KQorCXN1YmkJCXJMTixyTE4sMTYKKwlMT0FEX0RBVEEockQyLCA4KQorCWNtcHdpCQlyTE4sMTUKKwlMT0FEX0RBVEEockQzLCAxMikKKwlTVEFSVF9LRVkockQwLCByRDEsIHJEMiwgckQzKQorCWJsCQlwcGNfZGVjcnlwdF9ibG9jaworCXhvcgkJckQwLHJEMCxyVzAKKwlTQVZFX0RBVEEockQwLCAwKQorCXhvcgkJckQxLHJEMSxyVzEKKwlTQVZFX0RBVEEockQxLCA0KQorCXhvcgkJckQyLHJEMixyVzIKKwlTQVZFX0RBVEEockQyLCA4KQorCXhvcgkJckQzLHJEMyxyVzMKKwlTQVZFX0RBVEEockQzLCAxMikKKwlORVhUX0JMT0NLCisJYnQJCWd0LHBwY19kZWNyeXB0X2VjYl9sb29wCisJRklOQUxJWkVfQ1JZUFQoMCkKKwlibHIKKworLyoKKyAqIHBwY19lbmNyeXB0X2NiYyh1OCAqb3V0LCBjb25zdCB1OCAqaW4sIHUzMiAqa2V5X2VuYywKKyAqCQkgICAzMiByb3VuZHMsIHUzMiBieXRlcywgdTggKml2KTsKKyAqCisgKiBjYWxsZWQgZnJvbSBnbHVlIGxheWVyIHRvIGVuY3J5cHQgbXVsdGlwbGUgYmxvY2tzIHZpYSBDQkMKKyAqIEJ5dGVzIG11c3QgYmUgbGFyZ2VyIG9yIGVxdWFsIDE2IGFuZCBvbmx5IHdob2xlIGJsb2NrcyBhcmUKKyAqIHByb2Nlc3NlZC4gcm91bmQgdmFsdWVzIGFyZSBBRVMxMjggPSA0LCBBRVMxOTIgPSA1IGFuZAorICogQUVTMjU2ID0gNgorICoKKyAqLworX0dMT0JBTChwcGNfZW5jcnlwdF9jYmMpCisJSU5JVElBTElaRV9DUllQVChQUENfQUVTXzRLX0VOQ1RBQiwgNCkKKwlMT0FEX0lWKHJJMCwgMCkKKwlMT0FEX0lWKHJJMSwgNCkKKwlMT0FEX0lWKHJJMiwgOCkKKwlMT0FEX0lWKHJJMywgMTIpCitwcGNfZW5jcnlwdF9jYmNfbG9vcDoKKwlMT0FEX0RBVEEockQwLCAwKQorCW1yCQlyS1AscktTCisJTE9BRF9EQVRBKHJEMSwgNCkKKwlzdWJpCQlyTE4sckxOLDE2CisJTE9BRF9EQVRBKHJEMiwgOCkKKwljbXB3aQkJckxOLDE1CisJTE9BRF9EQVRBKHJEMywgMTIpCisJeG9yCQlyRDAsckQwLHJJMAorCXhvcgkJckQxLHJEMSxySTEKKwl4b3IJCXJEMixyRDIsckkyCisJeG9yCQlyRDMsckQzLHJJMworCVNUQVJUX0tFWShyRDAsIHJEMSwgckQyLCByRDMpCisJYmwJCXBwY19lbmNyeXB0X2Jsb2NrCisJeG9yCQlySTAsckQwLHJXMAorCVNBVkVfREFUQShySTAsIDApCisJeG9yCQlySTEsckQxLHJXMQorCVNBVkVfREFUQShySTEsIDQpCisJeG9yCQlySTIsckQyLHJXMgorCVNBVkVfREFUQShySTIsIDgpCisJeG9yCQlySTMsckQzLHJXMworCVNBVkVfREFUQShySTMsIDEyKQorCU5FWFRfQkxPQ0sKKwlidAkJZ3QscHBjX2VuY3J5cHRfY2JjX2xvb3AKKwlTVEFSVF9JVgorCVNBVkVfSVYockkwLCAwKQorCVNBVkVfSVYockkxLCA0KQorCVNBVkVfSVYockkyLCA4KQorCVNBVkVfSVYockkzLCAxMikKKwlGSU5BTElaRV9DUllQVCg0KQorCWJscgorCisvKgorICogcHBjX2RlY3J5cHRfY2JjKHU4ICpvdXQsIGNvbnN0IHU4ICppbiwgdTMyICprZXlfZGVjLAorICoJCSAgIHUzMiByb3VuZHMsIHUzMiBieXRlcywgdTggKml2KTsKKyAqCisgKiBjYWxsZWQgZnJvbSBnbHVlIGxheWVyIHRvIGRlY3J5cHQgbXVsdGlwbGUgYmxvY2tzIHZpYSBDQkMKKyAqIHJvdW5kIHZhbHVlcyBhcmUgQUVTMTI4ID0gNCwgQUVTMTkyID0gNSwgQUVTMjU2ID0gNgorICoKKyAqLworX0dMT0JBTChwcGNfZGVjcnlwdF9jYmMpCisJSU5JVElBTElaRV9DUllQVChQUENfQUVTXzRLX0RFQ1RBQiwgNCkKKwlsaQkJclQxLDE1CisJTE9BRF9JVihySTAsIDApCisJYW5kYwkJckxOLHJMTixyVDEKKwlMT0FEX0lWKHJJMSwgNCkKKwlzdWJpCQlyTE4sckxOLDE2CisJTE9BRF9JVihySTIsIDgpCisJYWRkCQlyU1AsclNQLHJMTgkvKiByZXZlcnNlIHByb2Nlc3NpbmcJCSovCisJTE9BRF9JVihySTMsIDEyKQorCWFkZAkJckRQLHJEUCxyTE4KKwlMT0FEX0RBVEEockQwLCAwKQorCWFkZGkJCXJUMSxyVDAsNDA5NgorCUxPQURfREFUQShyRDEsIDQpCisJTE9BRF9EQVRBKHJEMiwgOCkKKwlMT0FEX0RBVEEockQzLCAxMikKKwlTVEFSVF9JVgorCVNBVkVfSVYockQwLCAwKQorCVNBVkVfSVYockQxLCA0KQorCVNBVkVfSVYockQyLCA4KQorCWNtcHdpCQlyTE4sMTYKKwlTQVZFX0lWKHJEMywgMTIpCisJYnQJCWx0LHBwY19kZWNyeXB0X2NiY19lbmQKK3BwY19kZWNyeXB0X2NiY19sb29wOgorCW1yCQlyS1AscktTCisJU1RBUlRfS0VZKHJEMCwgckQxLCByRDIsIHJEMykKKwlibAkJcHBjX2RlY3J5cHRfYmxvY2sKKwlzdWJpCQlyTE4sckxOLDE2CisJc3ViaQkJclNQLHJTUCxDQkNfREVDCisJeG9yCQlyVzAsckQwLHJXMAorCUxPQURfREFUQShyRDAsIDApCisJeG9yCQlyVzEsckQxLHJXMQorCUxPQURfREFUQShyRDEsIDQpCisJeG9yCQlyVzIsckQyLHJXMgorCUxPQURfREFUQShyRDIsIDgpCisJeG9yCQlyVzMsckQzLHJXMworCUxPQURfREFUQShyRDMsIDEyKQorCXhvcgkJclcwLHJXMCxyRDAKKwlTQVZFX0RBVEEoclcwLCAwKQorCXhvcgkJclcxLHJXMSxyRDEKKwlTQVZFX0RBVEEoclcxLCA0KQorCXhvcgkJclcyLHJXMixyRDIKKwlTQVZFX0RBVEEoclcyLCA4KQorCXhvcgkJclczLHJXMyxyRDMKKwlTQVZFX0RBVEEoclczLCAxMikKKwljbXB3aQkJckxOLDE1CisJc3ViaQkJckRQLHJEUCxDQkNfREVDCisJYnQJCWd0LHBwY19kZWNyeXB0X2NiY19sb29wCitwcGNfZGVjcnlwdF9jYmNfZW5kOgorCW1yCQlyS1AscktTCisJU1RBUlRfS0VZKHJEMCwgckQxLCByRDIsIHJEMykKKwlibAkJcHBjX2RlY3J5cHRfYmxvY2sKKwl4b3IJCXJXMCxyVzAsckQwCisJeG9yCQlyVzEsclcxLHJEMQorCXhvcgkJclcyLHJXMixyRDIKKwl4b3IJCXJXMyxyVzMsckQzCisJeG9yCQlyVzAsclcwLHJJMAkvKiBkZWNyeXB0IHdpdGggaW5pdGlhbCBJVgkqLworCVNBVkVfREFUQShyVzAsIDApCisJeG9yCQlyVzEsclcxLHJJMQorCVNBVkVfREFUQShyVzEsIDQpCisJeG9yCQlyVzIsclcyLHJJMgorCVNBVkVfREFUQShyVzIsIDgpCisJeG9yCQlyVzMsclczLHJJMworCVNBVkVfREFUQShyVzMsIDEyKQorCUZJTkFMSVpFX0NSWVBUKDQpCisJYmxyCisKKy8qCisgKiBwcGNfY3J5cHRfY3RyKHU4ICpvdXQsIGNvbnN0IHU4ICppbiwgdTMyICprZXlfZW5jLAorICoJCSB1MzIgcm91bmRzLCB1MzIgYnl0ZXMsIHU4ICppdik7CisgKgorICogY2FsbGVkIGZyb20gZ2x1ZSBsYXllciB0byBlbmNyeXB0L2RlY3J5cHQgbXVsdGlwbGUgYmxvY2tzCisgKiB2aWEgQ1RSLiBOdW1iZXIgb2YgYnl0ZXMgZG9lcyBub3QgbmVlZCB0byBiZSBhIG11bHRpcGxlIG9mCisgKiAxNi4gUm91bmQgdmFsdWVzIGFyZSBBRVMxMjggPSA0LCBBRVMxOTIgPSA1LCBBRVMyNTYgPSA2CisgKgorICovCitfR0xPQkFMKHBwY19jcnlwdF9jdHIpCisJSU5JVElBTElaRV9DUllQVChQUENfQUVTXzRLX0VOQ1RBQiwgNCkKKwlMT0FEX0lWKHJJMCwgMCkKKwlMT0FEX0lWKHJJMSwgNCkKKwlMT0FEX0lWKHJJMiwgOCkKKwljbXB3aQkJckxOLDE2CisJTE9BRF9JVihySTMsIDEyKQorCVNUQVJUX0lWCisJYnQJCWx0LHBwY19jcnlwdF9jdHJfcGFydGlhbAorcHBjX2NyeXB0X2N0cl9sb29wOgorCW1yCQlyS1AscktTCisJU1RBUlRfS0VZKHJJMCwgckkxLCBySTIsIHJJMykKKwlibAkJcHBjX2VuY3J5cHRfYmxvY2sKKwl4b3IJCXJXMCxyRDAsclcwCisJeG9yCQlyVzEsckQxLHJXMQorCXhvcgkJclcyLHJEMixyVzIKKwl4b3IJCXJXMyxyRDMsclczCisJTE9BRF9EQVRBKHJEMCwgMCkKKwlzdWJpCQlyTE4sckxOLDE2CisJTE9BRF9EQVRBKHJEMSwgNCkKKwlMT0FEX0RBVEEockQyLCA4KQorCUxPQURfREFUQShyRDMsIDEyKQorCXhvcgkJckQwLHJEMCxyVzAKKwlTQVZFX0RBVEEockQwLCAwKQorCXhvcgkJckQxLHJEMSxyVzEKKwlTQVZFX0RBVEEockQxLCA0KQorCXhvcgkJckQyLHJEMixyVzIKKwlTQVZFX0RBVEEockQyLCA4KQorCXhvcgkJckQzLHJEMyxyVzMKKwlTQVZFX0RBVEEockQzLCAxMikKKwlhZGRpYwkJckkzLHJJMywxCS8qIGluY3JlYXNlIGNvdW50ZXIJCQkqLworCWFkZHplCQlySTIsckkyCisJYWRkemUJCXJJMSxySTEKKwlhZGR6ZQkJckkwLHJJMAorCU5FWFRfQkxPQ0sKKwljbXB3aQkJckxOLDE1CisJYnQJCWd0LHBwY19jcnlwdF9jdHJfbG9vcAorcHBjX2NyeXB0X2N0cl9wYXJ0aWFsOgorCWNtcHdpCQlyTE4sMAorCWJ0CQllcSxwcGNfY3J5cHRfY3RyX2VuZAorCW1yCQlyS1AscktTCisJU1RBUlRfS0VZKHJJMCwgckkxLCBySTIsIHJJMykKKwlibAkJcHBjX2VuY3J5cHRfYmxvY2sKKwl4b3IJCXJXMCxyRDAsclcwCisJU0FWRV9JVihyVzAsIDApCisJeG9yCQlyVzEsckQxLHJXMQorCVNBVkVfSVYoclcxLCA0KQorCXhvcgkJclcyLHJEMixyVzIKKwlTQVZFX0lWKHJXMiwgOCkKKwl4b3IJCXJXMyxyRDMsclczCisJU0FWRV9JVihyVzMsIDEyKQorCW10Y3RyCQlyTE4KKwlzdWJpCQlySVAscklQLENUUl9ERUMKKwlzdWJpCQlyU1AsclNQLDEKKwlzdWJpCQlyRFAsckRQLDEKK3BwY19jcnlwdF9jdHJfeG9yYnl0ZToKKwlsYnp1CQlyVzQsMShySVApCS8qIGJ5dGV3aXNlIHhvciBmb3IgcGFydGlhbCBibG9jawkqLworCWxienUJCXJXNSwxKHJTUCkKKwl4b3IJCXJXNCxyVzQsclc1CisJc3RidQkJclc0LDEockRQKQorCWJkbnoJCXBwY19jcnlwdF9jdHJfeG9yYnl0ZQorCXN1YmYJCXJJUCxyTE4scklQCisJYWRkaQkJcklQLHJJUCwxCisJYWRkaWMJCXJJMyxySTMsMQorCWFkZHplCQlySTIsckkyCisJYWRkemUJCXJJMSxySTEKKwlhZGR6ZQkJckkwLHJJMAorcHBjX2NyeXB0X2N0cl9lbmQ6CisJU0FWRV9JVihySTAsIDApCisJU0FWRV9JVihySTEsIDQpCisJU0FWRV9JVihySTIsIDgpCisJU0FWRV9JVihySTMsIDEyKQorCUZJTkFMSVpFX0NSWVBUKDQpCisJYmxyCisKKy8qCisgKiBwcGNfZW5jcnlwdF94dHModTggKm91dCwgY29uc3QgdTggKmluLCB1MzIgKmtleV9lbmMsCisgKgkJICAgdTMyIHJvdW5kcywgdTMyIGJ5dGVzLCB1OCAqaXYsIHUzMiAqa2V5X3R3ayk7CisgKgorICogY2FsbGVkIGZyb20gZ2x1ZSBsYXllciB0byBlbmNyeXB0IG11bHRpcGxlIGJsb2NrcyB2aWEgWFRTCisgKiBJZiBrZXlfdHdrIGlzIGdpdmVuLCB0aGUgaW5pdGlhbCBJViBlbmNyeXB0aW9uIHdpbGwgYmUKKyAqIHByb2Nlc3NlZCB0b28uIFJvdW5kIHZhbHVlcyBhcmUgQUVTMTI4ID0gNCwgQUVTMTkyID0gNSwKKyAqIEFFUzI1NiA9IDYKKyAqCisgKi8KK19HTE9CQUwocHBjX2VuY3J5cHRfeHRzKQorCUlOSVRJQUxJWkVfQ1JZUFQoUFBDX0FFU180S19FTkNUQUIsIDgpCisJTE9BRF9JVihySTAsIDApCisJTE9BRF9JVihySTEsIDQpCisJTE9BRF9JVihySTIsIDgpCisJY21wd2kJCXJLVCwwCisJTE9BRF9JVihySTMsIDEyKQorCWJ0CQllcSxwcGNfZW5jcnlwdF94dHNfbm90d2VhaworCW1yCQlyS1AscktUCisJU1RBUlRfS0VZKHJJMCwgckkxLCBySTIsIHJJMykKKwlibAkJcHBjX2VuY3J5cHRfYmxvY2sKKwl4b3IJCXJJMCxyRDAsclcwCisJeG9yCQlySTEsckQxLHJXMQorCXhvcgkJckkyLHJEMixyVzIKKwl4b3IJCXJJMyxyRDMsclczCitwcGNfZW5jcnlwdF94dHNfbm90d2VhazoKKwlFTkRJQU5fU1dBUChyRzAsIHJHMSwgckkwLCBySTEpCisJRU5ESUFOX1NXQVAockcyLCByRzMsIHJJMiwgckkzKQorcHBjX2VuY3J5cHRfeHRzX2xvb3A6CisJTE9BRF9EQVRBKHJEMCwgMCkKKwltcgkJcktQLHJLUworCUxPQURfREFUQShyRDEsIDQpCisJc3ViaQkJckxOLHJMTiwxNgorCUxPQURfREFUQShyRDIsIDgpCisJTE9BRF9EQVRBKHJEMywgMTIpCisJeG9yCQlyRDAsckQwLHJJMAorCXhvcgkJckQxLHJEMSxySTEKKwl4b3IJCXJEMixyRDIsckkyCisJeG9yCQlyRDMsckQzLHJJMworCVNUQVJUX0tFWShyRDAsIHJEMSwgckQyLCByRDMpCisJYmwJCXBwY19lbmNyeXB0X2Jsb2NrCisJeG9yCQlyRDAsckQwLHJXMAorCXhvcgkJckQxLHJEMSxyVzEKKwl4b3IJCXJEMixyRDIsclcyCisJeG9yCQlyRDMsckQzLHJXMworCXhvcgkJckQwLHJEMCxySTAKKwlTQVZFX0RBVEEockQwLCAwKQorCXhvcgkJckQxLHJEMSxySTEKKwlTQVZFX0RBVEEockQxLCA0KQorCXhvcgkJckQyLHJEMixySTIKKwlTQVZFX0RBVEEockQyLCA4KQorCXhvcgkJckQzLHJEMyxySTMKKwlTQVZFX0RBVEEockQzLCAxMikKKwlHRjEyOF9NVUwockcwLCByRzEsIHJHMiwgckczLCByVzApCisJRU5ESUFOX1NXQVAockkwLCBySTEsIHJHMCwgckcxKQorCUVORElBTl9TV0FQKHJJMiwgckkzLCByRzIsIHJHMykKKwljbXB3aQkJckxOLDAKKwlORVhUX0JMT0NLCisJYnQJCWd0LHBwY19lbmNyeXB0X3h0c19sb29wCisJU1RBUlRfSVYKKwlTQVZFX0lWKHJJMCwgMCkKKwlTQVZFX0lWKHJJMSwgNCkKKwlTQVZFX0lWKHJJMiwgOCkKKwlTQVZFX0lWKHJJMywgMTIpCisJRklOQUxJWkVfQ1JZUFQoOCkKKwlibHIKKworLyoKKyAqIHBwY19kZWNyeXB0X3h0cyh1OCAqb3V0LCBjb25zdCB1OCAqaW4sIHUzMiAqa2V5X2RlYywKKyAqCQkgICB1MzIgcm91bmRzLCB1MzIgYmxvY2tzLCB1OCAqaXYsIHUzMiAqa2V5X3R3ayk7CisgKgorICogY2FsbGVkIGZyb20gZ2x1ZSBsYXllciB0byBkZWNyeXB0IG11bHRpcGxlIGJsb2NrcyB2aWEgWFRTCisgKiBJZiBrZXlfdHdrIGlzIGdpdmVuLCB0aGUgaW5pdGlhbCBJViBlbmNyeXB0aW9uIHdpbGwgYmUKKyAqIHByb2Nlc3NlZCB0b28uIFJvdW5kIHZhbHVlcyBhcmUgQUVTMTI4ID0gNCwgQUVTMTkyID0gNSwKKyAqIEFFUzI1NiA9IDYKKyAqCisgKi8KK19HTE9CQUwocHBjX2RlY3J5cHRfeHRzKQorCUlOSVRJQUxJWkVfQ1JZUFQoUFBDX0FFU180S19ERUNUQUIsIDgpCisJTE9BRF9JVihySTAsIDApCisJYWRkaQkJclQxLHJUMCw0MDk2CisJTE9BRF9JVihySTEsIDQpCisJTE9BRF9JVihySTIsIDgpCisJY21wd2kJCXJLVCwwCisJTE9BRF9JVihySTMsIDEyKQorCWJ0CQllcSxwcGNfZGVjcnlwdF94dHNfbm90d2VhaworCXN1YmkJCXJUMCxyVDAsNDA5NgorCW1yCQlyS1AscktUCisJU1RBUlRfS0VZKHJJMCwgckkxLCBySTIsIHJJMykKKwlibAkJcHBjX2VuY3J5cHRfYmxvY2sKKwl4b3IJCXJJMCxyRDAsclcwCisJeG9yCQlySTEsckQxLHJXMQorCXhvcgkJckkyLHJEMixyVzIKKwl4b3IJCXJJMyxyRDMsclczCisJYWRkaQkJclQwLHJUMCw0MDk2CitwcGNfZGVjcnlwdF94dHNfbm90d2VhazoKKwlFTkRJQU5fU1dBUChyRzAsIHJHMSwgckkwLCBySTEpCisJRU5ESUFOX1NXQVAockcyLCByRzMsIHJJMiwgckkzKQorcHBjX2RlY3J5cHRfeHRzX2xvb3A6CisJTE9BRF9EQVRBKHJEMCwgMCkKKwltcgkJcktQLHJLUworCUxPQURfREFUQShyRDEsIDQpCisJc3ViaQkJckxOLHJMTiwxNgorCUxPQURfREFUQShyRDIsIDgpCisJTE9BRF9EQVRBKHJEMywgMTIpCisJeG9yCQlyRDAsckQwLHJJMAorCXhvcgkJckQxLHJEMSxySTEKKwl4b3IJCXJEMixyRDIsckkyCisJeG9yCQlyRDMsckQzLHJJMworCVNUQVJUX0tFWShyRDAsIHJEMSwgckQyLCByRDMpCisJYmwJCXBwY19kZWNyeXB0X2Jsb2NrCisJeG9yCQlyRDAsckQwLHJXMAorCXhvcgkJckQxLHJEMSxyVzEKKwl4b3IJCXJEMixyRDIsclcyCisJeG9yCQlyRDMsckQzLHJXMworCXhvcgkJckQwLHJEMCxySTAKKwlTQVZFX0RBVEEockQwLCAwKQorCXhvcgkJckQxLHJEMSxySTEKKwlTQVZFX0RBVEEockQxLCA0KQorCXhvcgkJckQyLHJEMixySTIKKwlTQVZFX0RBVEEockQyLCA4KQorCXhvcgkJckQzLHJEMyxySTMKKwlTQVZFX0RBVEEockQzLCAxMikKKwlHRjEyOF9NVUwockcwLCByRzEsIHJHMiwgckczLCByVzApCisJRU5ESUFOX1NXQVAockkwLCBySTEsIHJHMCwgckcxKQorCUVORElBTl9TV0FQKHJJMiwgckkzLCByRzIsIHJHMykKKwljbXB3aQkJckxOLDAKKwlORVhUX0JMT0NLCisJYnQJCWd0LHBwY19kZWNyeXB0X3h0c19sb29wCisJU1RBUlRfSVYKKwlTQVZFX0lWKHJJMCwgMCkKKwlTQVZFX0lWKHJJMSwgNCkKKwlTQVZFX0lWKHJJMiwgOCkKKwlTQVZFX0lWKHJJMywgMTIpCisJRklOQUxJWkVfQ1JZUFQoOCkKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcnlwdG8vYWVzLXNwZS1yZWdzLmggYi9hcmNoL3Bvd2VycGMvY3J5cHRvL2Flcy1zcGUtcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDIxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY3J5cHRvL2Flcy1zcGUtcmVncy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb21tb24gcmVnaXN0ZXJzIGZvciBQUEMgQUVTIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IE1hcmt1cyBTdG9ja2hhdXNlbiA8c3RvY2toYXVzZW5AY29sbG9naWEuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2RlZmluZSByS1MgcjAJLyogY29weSBvZiBlbi0vZGVjcnlwdGlvbiBrZXkgcG9pbnRlcgkJCSovCisjZGVmaW5lIHJEUCByMwkvKiBkZXN0aW5hdGlvbiBwb2ludGVyCQkJCQkqLworI2RlZmluZSByU1AgcjQJLyogc291cmNlIHBvaW50ZXIJCQkJCSovCisjZGVmaW5lIHJLUCByNQkvKiBwb2ludGVyIHRvIGVuLS9kZWNyeXB0aW9uIGtleSBwb2ludGVyCQkqLworI2RlZmluZSByUlIgcjYJLyogZW4tL2RlY3J5cHRpb24gcm91bmRzCQkJCSovCisjZGVmaW5lIHJMTiByNwkvKiBsZW5ndGggb2YgZGF0YSB0byBiZSBwcm9jZXNzZWQJCQkqLworI2RlZmluZSBySVAgcjgJLyogcG90aW5lciB0byBJViAoQ0JDL0NUUi9YVFMgbW9kZXMpCQkJKi8KKyNkZWZpbmUgcktUIHI5CS8qIHBvaW50ZXIgdG8gdHdlYWsga2V5IChYVFMgbW9kZSkJCQkqLworI2RlZmluZSByVDAgcjExCS8qIHBvaW50ZXJzIHRvIGVuLS9kZWNycHl0aW9uIHRhYmxlcwkJCSovCisjZGVmaW5lIHJUMSByMTAKKyNkZWZpbmUgckQwIHI5CS8qIGRhdGEgCQkJCQkJKi8KKyNkZWZpbmUgckQxIHIxNAorI2RlZmluZSByRDIgcjEyCisjZGVmaW5lIHJEMyByMTUKKyNkZWZpbmUgclcwIHIxNgkvKiB3b3JraW5nIHJlZ2lzdGVycwkJCQkJKi8KKyNkZWZpbmUgclcxIHIxNworI2RlZmluZSByVzIgcjE4CisjZGVmaW5lIHJXMyByMTkKKyNkZWZpbmUgclc0IHIyMAorI2RlZmluZSByVzUgcjIxCisjZGVmaW5lIHJXNiByMjIKKyNkZWZpbmUgclc3IHIyMworI2RlZmluZSBySTAgcjI0CS8qIElWCQkJCQkJCSovCisjZGVmaW5lIHJJMSByMjUKKyNkZWZpbmUgckkyIHIyNgorI2RlZmluZSBySTMgcjI3CisjZGVmaW5lIHJHMCByMjgJLyogZW5kaWFuIHJldmVyc2VkIHR3ZWFrIChYVFMgbW9kZSkJCQkqLworI2RlZmluZSByRzEgcjI5CisjZGVmaW5lIHJHMiByMzAKKyNkZWZpbmUgckczIHIzMQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NyeXB0by9hZXMtdGFiLTRrLlMgYi9hcmNoL3Bvd2VycGMvY3J5cHRvL2Flcy10YWItNGsuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDFlNjAyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NyeXB0by9hZXMtdGFiLTRrLlMKQEAgLTAsMCArMSwzMzEgQEAKKy8qCisgKiA0SyBBRVMgdGFibGVzIGZvciBQUEMgQUVTIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IE1hcmt1cyBTdG9ja2hhdXNlbiA8c3RvY2toYXVzZW5AY29sbG9naWEuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworLyoKKyAqIFRoZXNlIGJpZyBlbmRpYW4gQUVTIGVuY3J5cHRpb24vZGVjcnlwdGlvbiB0YWJsZXMgaGF2ZSBiZWVuIHRha2VuIGZyb20KKyAqIGNyeXB0by9hZXNfZ2VuZXJpYy5jIGFuZCBhcmUgZGVzaWduZWQgdG8gYmUgc2ltcGx5IGFjY2Vzc2VkIGJ5IGEgY29tYmluYXRpb24KKyAqIG9mIHJsd2ltaS9sd3ogaW5zdHJ1Y3Rpb25zIHdpdGggYSBtaW5pbXVtIG9mIHRhYmxlIHJlZ2lzdGVycyAodXN1YWxseSBvbmx5CisgKiBvbmUgcmVxdWlyZWQpLiBUaHVzIHRoZXkgYXJlIGFsaWduZWQgdG8gNEsuIFRoZSBsb2NhbGl0eSBvZiByb3RhdGVkIHZhbHVlcworICogaXMgZGVyaXZlZCBmcm9tIHRoZSByZWR1Y2VkIG9mZnNldHMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIHRoZSBTUEUgbG9hZAorICogaW5zdHJ1Y3Rpb25zLiBFLmcuIGV2bGR3LCBldmx3d3NwbGF0LCAuLi4KKyAqCisgKiBGb3IgdGhlIHNhZmV0eS1jb25zY2lvdXMgaXQgaGFzIHRvIGJlIG5vdGVkIHRoYXQgdGhleSBtaWdodCBiZSB2dWxuZXJhYmxlCisgKiB0byBjYWNoZSB0aW1pbmcgYXR0YWNrcyBiZWNhdXNlIG9mIHRoZWlyIHNpemUuIE5ldmVydGhlbGVzcyBpbiBjb250cmFzdCB0bworICogdGhlIGdlbmVyaWMgdGFibGVzIHRoZXkgaGF2ZSBiZWVuIHJlZHVjZWQgZnJvbSAxNktCIHRvIDhLQiArIDI1NiBieXRlcy4KKyAqIFRoaXMgaXMgYSBxdWl0ZSBnb29kIHRyYWRlb2ZmIGZvciBsb3cgcG93ZXIgZGV2aWNlcyAoZS5nLiByb3V0ZXJzKSB3aXRob3V0CisgKiBkZWRpY2F0ZWQgZW5jcnlwdGlvbiBoYXJkd2FyZSB3aGVyZSB3ZSB1c3VhbGx5IGhhdmUgbm8gbXVsdGl1c2VyCisgKiBlbnZpcm9ubWVudC4KKyAqCisgKi8KKworI2RlZmluZSBSKGEsIGIsIGMsIGQpIFwKKwkweCMjYSMjYiMjYyMjZCwgMHgjI2QjI2EjI2IjI2MsIDB4IyNjIyNkIyNhIyNiLCAweCMjYiMjYyMjZCMjYQorCisuZGF0YQorLmFsaWduIDEyCisuZ2xvYmwgUFBDX0FFU180S19FTkNUQUIKK1BQQ19BRVNfNEtfRU5DVEFCOgorLyogZW5jcnlwdGlvbiB0YWJsZSwgc2FtZSBhcyBjcnlwdG9fZnRfdGFiIGluIGNyeXB0by9hZXMtZ2VuZXJpYy5jICovCisJLmxvbmcgUihjNiwgNjMsIDYzLCBhNSksIFIoZjgsIDdjLCA3YywgODQpCisJLmxvbmcgUihlZSwgNzcsIDc3LCA5OSksIFIoZjYsIDdiLCA3YiwgOGQpCisJLmxvbmcgUihmZiwgZjIsIGYyLCAwZCksIFIoZDYsIDZiLCA2YiwgYmQpCisJLmxvbmcgUihkZSwgNmYsIDZmLCBiMSksIFIoOTEsIGM1LCBjNSwgNTQpCisJLmxvbmcgUig2MCwgMzAsIDMwLCA1MCksIFIoMDIsIDAxLCAwMSwgMDMpCisJLmxvbmcgUihjZSwgNjcsIDY3LCBhOSksIFIoNTYsIDJiLCAyYiwgN2QpCisJLmxvbmcgUihlNywgZmUsIGZlLCAxOSksIFIoYjUsIGQ3LCBkNywgNjIpCisJLmxvbmcgUig0ZCwgYWIsIGFiLCBlNiksIFIoZWMsIDc2LCA3NiwgOWEpCisJLmxvbmcgUig4ZiwgY2EsIGNhLCA0NSksIFIoMWYsIDgyLCA4MiwgOWQpCisJLmxvbmcgUig4OSwgYzksIGM5LCA0MCksIFIoZmEsIDdkLCA3ZCwgODcpCisJLmxvbmcgUihlZiwgZmEsIGZhLCAxNSksIFIoYjIsIDU5LCA1OSwgZWIpCisJLmxvbmcgUig4ZSwgNDcsIDQ3LCBjOSksIFIoZmIsIGYwLCBmMCwgMGIpCisJLmxvbmcgUig0MSwgYWQsIGFkLCBlYyksIFIoYjMsIGQ0LCBkNCwgNjcpCisJLmxvbmcgUig1ZiwgYTIsIGEyLCBmZCksIFIoNDUsIGFmLCBhZiwgZWEpCisJLmxvbmcgUigyMywgOWMsIDljLCBiZiksIFIoNTMsIGE0LCBhNCwgZjcpCisJLmxvbmcgUihlNCwgNzIsIDcyLCA5NiksIFIoOWIsIGMwLCBjMCwgNWIpCisJLmxvbmcgUig3NSwgYjcsIGI3LCBjMiksIFIoZTEsIGZkLCBmZCwgMWMpCisJLmxvbmcgUigzZCwgOTMsIDkzLCBhZSksIFIoNGMsIDI2LCAyNiwgNmEpCisJLmxvbmcgUig2YywgMzYsIDM2LCA1YSksIFIoN2UsIDNmLCAzZiwgNDEpCisJLmxvbmcgUihmNSwgZjcsIGY3LCAwMiksIFIoODMsIGNjLCBjYywgNGYpCisJLmxvbmcgUig2OCwgMzQsIDM0LCA1YyksIFIoNTEsIGE1LCBhNSwgZjQpCisJLmxvbmcgUihkMSwgZTUsIGU1LCAzNCksIFIoZjksIGYxLCBmMSwgMDgpCisJLmxvbmcgUihlMiwgNzEsIDcxLCA5MyksIFIoYWIsIGQ4LCBkOCwgNzMpCisJLmxvbmcgUig2MiwgMzEsIDMxLCA1MyksIFIoMmEsIDE1LCAxNSwgM2YpCisJLmxvbmcgUigwOCwgMDQsIDA0LCAwYyksIFIoOTUsIGM3LCBjNywgNTIpCisJLmxvbmcgUig0NiwgMjMsIDIzLCA2NSksIFIoOWQsIGMzLCBjMywgNWUpCisJLmxvbmcgUigzMCwgMTgsIDE4LCAyOCksIFIoMzcsIDk2LCA5NiwgYTEpCisJLmxvbmcgUigwYSwgMDUsIDA1LCAwZiksIFIoMmYsIDlhLCA5YSwgYjUpCisJLmxvbmcgUigwZSwgMDcsIDA3LCAwOSksIFIoMjQsIDEyLCAxMiwgMzYpCisJLmxvbmcgUigxYiwgODAsIDgwLCA5YiksIFIoZGYsIGUyLCBlMiwgM2QpCisJLmxvbmcgUihjZCwgZWIsIGViLCAyNiksIFIoNGUsIDI3LCAyNywgNjkpCisJLmxvbmcgUig3ZiwgYjIsIGIyLCBjZCksIFIoZWEsIDc1LCA3NSwgOWYpCisJLmxvbmcgUigxMiwgMDksIDA5LCAxYiksIFIoMWQsIDgzLCA4MywgOWUpCisJLmxvbmcgUig1OCwgMmMsIDJjLCA3NCksIFIoMzQsIDFhLCAxYSwgMmUpCisJLmxvbmcgUigzNiwgMWIsIDFiLCAyZCksIFIoZGMsIDZlLCA2ZSwgYjIpCisJLmxvbmcgUihiNCwgNWEsIDVhLCBlZSksIFIoNWIsIGEwLCBhMCwgZmIpCisJLmxvbmcgUihhNCwgNTIsIDUyLCBmNiksIFIoNzYsIDNiLCAzYiwgNGQpCisJLmxvbmcgUihiNywgZDYsIGQ2LCA2MSksIFIoN2QsIGIzLCBiMywgY2UpCisJLmxvbmcgUig1MiwgMjksIDI5LCA3YiksIFIoZGQsIGUzLCBlMywgM2UpCisJLmxvbmcgUig1ZSwgMmYsIDJmLCA3MSksIFIoMTMsIDg0LCA4NCwgOTcpCisJLmxvbmcgUihhNiwgNTMsIDUzLCBmNSksIFIoYjksIGQxLCBkMSwgNjgpCisJLmxvbmcgUigwMCwgMDAsIDAwLCAwMCksIFIoYzEsIGVkLCBlZCwgMmMpCisJLmxvbmcgUig0MCwgMjAsIDIwLCA2MCksIFIoZTMsIGZjLCBmYywgMWYpCisJLmxvbmcgUig3OSwgYjEsIGIxLCBjOCksIFIoYjYsIDViLCA1YiwgZWQpCisJLmxvbmcgUihkNCwgNmEsIDZhLCBiZSksIFIoOGQsIGNiLCBjYiwgNDYpCisJLmxvbmcgUig2NywgYmUsIGJlLCBkOSksIFIoNzIsIDM5LCAzOSwgNGIpCisJLmxvbmcgUig5NCwgNGEsIDRhLCBkZSksIFIoOTgsIDRjLCA0YywgZDQpCisJLmxvbmcgUihiMCwgNTgsIDU4LCBlOCksIFIoODUsIGNmLCBjZiwgNGEpCisJLmxvbmcgUihiYiwgZDAsIGQwLCA2YiksIFIoYzUsIGVmLCBlZiwgMmEpCisJLmxvbmcgUig0ZiwgYWEsIGFhLCBlNSksIFIoZWQsIGZiLCBmYiwgMTYpCisJLmxvbmcgUig4NiwgNDMsIDQzLCBjNSksIFIoOWEsIDRkLCA0ZCwgZDcpCisJLmxvbmcgUig2NiwgMzMsIDMzLCA1NSksIFIoMTEsIDg1LCA4NSwgOTQpCisJLmxvbmcgUig4YSwgNDUsIDQ1LCBjZiksIFIoZTksIGY5LCBmOSwgMTApCisJLmxvbmcgUigwNCwgMDIsIDAyLCAwNiksIFIoZmUsIDdmLCA3ZiwgODEpCisJLmxvbmcgUihhMCwgNTAsIDUwLCBmMCksIFIoNzgsIDNjLCAzYywgNDQpCisJLmxvbmcgUigyNSwgOWYsIDlmLCBiYSksIFIoNGIsIGE4LCBhOCwgZTMpCisJLmxvbmcgUihhMiwgNTEsIDUxLCBmMyksIFIoNWQsIGEzLCBhMywgZmUpCisJLmxvbmcgUig4MCwgNDAsIDQwLCBjMCksIFIoMDUsIDhmLCA4ZiwgOGEpCisJLmxvbmcgUigzZiwgOTIsIDkyLCBhZCksIFIoMjEsIDlkLCA5ZCwgYmMpCisJLmxvbmcgUig3MCwgMzgsIDM4LCA0OCksIFIoZjEsIGY1LCBmNSwgMDQpCisJLmxvbmcgUig2MywgYmMsIGJjLCBkZiksIFIoNzcsIGI2LCBiNiwgYzEpCisJLmxvbmcgUihhZiwgZGEsIGRhLCA3NSksIFIoNDIsIDIxLCAyMSwgNjMpCisJLmxvbmcgUigyMCwgMTAsIDEwLCAzMCksIFIoZTUsIGZmLCBmZiwgMWEpCisJLmxvbmcgUihmZCwgZjMsIGYzLCAwZSksIFIoYmYsIGQyLCBkMiwgNmQpCisJLmxvbmcgUig4MSwgY2QsIGNkLCA0YyksIFIoMTgsIDBjLCAwYywgMTQpCisJLmxvbmcgUigyNiwgMTMsIDEzLCAzNSksIFIoYzMsIGVjLCBlYywgMmYpCisJLmxvbmcgUihiZSwgNWYsIDVmLCBlMSksIFIoMzUsIDk3LCA5NywgYTIpCisJLmxvbmcgUig4OCwgNDQsIDQ0LCBjYyksIFIoMmUsIDE3LCAxNywgMzkpCisJLmxvbmcgUig5MywgYzQsIGM0LCA1NyksIFIoNTUsIGE3LCBhNywgZjIpCisJLmxvbmcgUihmYywgN2UsIDdlLCA4MiksIFIoN2EsIDNkLCAzZCwgNDcpCisJLmxvbmcgUihjOCwgNjQsIDY0LCBhYyksIFIoYmEsIDVkLCA1ZCwgZTcpCisJLmxvbmcgUigzMiwgMTksIDE5LCAyYiksIFIoZTYsIDczLCA3MywgOTUpCisJLmxvbmcgUihjMCwgNjAsIDYwLCBhMCksIFIoMTksIDgxLCA4MSwgOTgpCisJLmxvbmcgUig5ZSwgNGYsIDRmLCBkMSksIFIoYTMsIGRjLCBkYywgN2YpCisJLmxvbmcgUig0NCwgMjIsIDIyLCA2NiksIFIoNTQsIDJhLCAyYSwgN2UpCisJLmxvbmcgUigzYiwgOTAsIDkwLCBhYiksIFIoMGIsIDg4LCA4OCwgODMpCisJLmxvbmcgUig4YywgNDYsIDQ2LCBjYSksIFIoYzcsIGVlLCBlZSwgMjkpCisJLmxvbmcgUig2YiwgYjgsIGI4LCBkMyksIFIoMjgsIDE0LCAxNCwgM2MpCisJLmxvbmcgUihhNywgZGUsIGRlLCA3OSksIFIoYmMsIDVlLCA1ZSwgZTIpCisJLmxvbmcgUigxNiwgMGIsIDBiLCAxZCksIFIoYWQsIGRiLCBkYiwgNzYpCisJLmxvbmcgUihkYiwgZTAsIGUwLCAzYiksIFIoNjQsIDMyLCAzMiwgNTYpCisJLmxvbmcgUig3NCwgM2EsIDNhLCA0ZSksIFIoMTQsIDBhLCAwYSwgMWUpCisJLmxvbmcgUig5MiwgNDksIDQ5LCBkYiksIFIoMGMsIDA2LCAwNiwgMGEpCisJLmxvbmcgUig0OCwgMjQsIDI0LCA2YyksIFIoYjgsIDVjLCA1YywgZTQpCisJLmxvbmcgUig5ZiwgYzIsIGMyLCA1ZCksIFIoYmQsIGQzLCBkMywgNmUpCisJLmxvbmcgUig0MywgYWMsIGFjLCBlZiksIFIoYzQsIDYyLCA2MiwgYTYpCisJLmxvbmcgUigzOSwgOTEsIDkxLCBhOCksIFIoMzEsIDk1LCA5NSwgYTQpCisJLmxvbmcgUihkMywgZTQsIGU0LCAzNyksIFIoZjIsIDc5LCA3OSwgOGIpCisJLmxvbmcgUihkNSwgZTcsIGU3LCAzMiksIFIoOGIsIGM4LCBjOCwgNDMpCisJLmxvbmcgUig2ZSwgMzcsIDM3LCA1OSksIFIoZGEsIDZkLCA2ZCwgYjcpCisJLmxvbmcgUigwMSwgOGQsIDhkLCA4YyksIFIoYjEsIGQ1LCBkNSwgNjQpCisJLmxvbmcgUig5YywgNGUsIDRlLCBkMiksIFIoNDksIGE5LCBhOSwgZTApCisJLmxvbmcgUihkOCwgNmMsIDZjLCBiNCksIFIoYWMsIDU2LCA1NiwgZmEpCisJLmxvbmcgUihmMywgZjQsIGY0LCAwNyksIFIoY2YsIGVhLCBlYSwgMjUpCisJLmxvbmcgUihjYSwgNjUsIDY1LCBhZiksIFIoZjQsIDdhLCA3YSwgOGUpCisJLmxvbmcgUig0NywgYWUsIGFlLCBlOSksIFIoMTAsIDA4LCAwOCwgMTgpCisJLmxvbmcgUig2ZiwgYmEsIGJhLCBkNSksIFIoZjAsIDc4LCA3OCwgODgpCisJLmxvbmcgUig0YSwgMjUsIDI1LCA2ZiksIFIoNWMsIDJlLCAyZSwgNzIpCisJLmxvbmcgUigzOCwgMWMsIDFjLCAyNCksIFIoNTcsIGE2LCBhNiwgZjEpCisJLmxvbmcgUig3MywgYjQsIGI0LCBjNyksIFIoOTcsIGM2LCBjNiwgNTEpCisJLmxvbmcgUihjYiwgZTgsIGU4LCAyMyksIFIoYTEsIGRkLCBkZCwgN2MpCisJLmxvbmcgUihlOCwgNzQsIDc0LCA5YyksIFIoM2UsIDFmLCAxZiwgMjEpCisJLmxvbmcgUig5NiwgNGIsIDRiLCBkZCksIFIoNjEsIGJkLCBiZCwgZGMpCisJLmxvbmcgUigwZCwgOGIsIDhiLCA4NiksIFIoMGYsIDhhLCA4YSwgODUpCisJLmxvbmcgUihlMCwgNzAsIDcwLCA5MCksIFIoN2MsIDNlLCAzZSwgNDIpCisJLmxvbmcgUig3MSwgYjUsIGI1LCBjNCksIFIoY2MsIDY2LCA2NiwgYWEpCisJLmxvbmcgUig5MCwgNDgsIDQ4LCBkOCksIFIoMDYsIDAzLCAwMywgMDUpCisJLmxvbmcgUihmNywgZjYsIGY2LCAwMSksIFIoMWMsIDBlLCAwZSwgMTIpCisJLmxvbmcgUihjMiwgNjEsIDYxLCBhMyksIFIoNmEsIDM1LCAzNSwgNWYpCisJLmxvbmcgUihhZSwgNTcsIDU3LCBmOSksIFIoNjksIGI5LCBiOSwgZDApCisJLmxvbmcgUigxNywgODYsIDg2LCA5MSksIFIoOTksIGMxLCBjMSwgNTgpCisJLmxvbmcgUigzYSwgMWQsIDFkLCAyNyksIFIoMjcsIDllLCA5ZSwgYjkpCisJLmxvbmcgUihkOSwgZTEsIGUxLCAzOCksIFIoZWIsIGY4LCBmOCwgMTMpCisJLmxvbmcgUigyYiwgOTgsIDk4LCBiMyksIFIoMjIsIDExLCAxMSwgMzMpCisJLmxvbmcgUihkMiwgNjksIDY5LCBiYiksIFIoYTksIGQ5LCBkOSwgNzApCisJLmxvbmcgUigwNywgOGUsIDhlLCA4OSksIFIoMzMsIDk0LCA5NCwgYTcpCisJLmxvbmcgUigyZCwgOWIsIDliLCBiNiksIFIoM2MsIDFlLCAxZSwgMjIpCisJLmxvbmcgUigxNSwgODcsIDg3LCA5MiksIFIoYzksIGU5LCBlOSwgMjApCisJLmxvbmcgUig4NywgY2UsIGNlLCA0OSksIFIoYWEsIDU1LCA1NSwgZmYpCisJLmxvbmcgUig1MCwgMjgsIDI4LCA3OCksIFIoYTUsIGRmLCBkZiwgN2EpCisJLmxvbmcgUigwMywgOGMsIDhjLCA4ZiksIFIoNTksIGExLCBhMSwgZjgpCisJLmxvbmcgUigwOSwgODksIDg5LCA4MCksIFIoMWEsIDBkLCAwZCwgMTcpCisJLmxvbmcgUig2NSwgYmYsIGJmLCBkYSksIFIoZDcsIGU2LCBlNiwgMzEpCisJLmxvbmcgUig4NCwgNDIsIDQyLCBjNiksIFIoZDAsIDY4LCA2OCwgYjgpCisJLmxvbmcgUig4MiwgNDEsIDQxLCBjMyksIFIoMjksIDk5LCA5OSwgYjApCisJLmxvbmcgUig1YSwgMmQsIDJkLCA3NyksIFIoMWUsIDBmLCAwZiwgMTEpCisJLmxvbmcgUig3YiwgYjAsIGIwLCBjYiksIFIoYTgsIDU0LCA1NCwgZmMpCisJLmxvbmcgUig2ZCwgYmIsIGJiLCBkNiksIFIoMmMsIDE2LCAxNiwgM2EpCisuZ2xvYmwgUFBDX0FFU180S19ERUNUQUIKK1BQQ19BRVNfNEtfREVDVEFCOgorLyogZGVjcnlwdGlvbiB0YWJsZSwgc2FtZSBhcyBjcnlwdG9faXRfdGFiIGluIGNyeXB0by9hZXMtZ2VuZXJpYy5jICovCisJLmxvbmcgUig1MSwgZjQsIGE3LCA1MCksIFIoN2UsIDQxLCA2NSwgNTMpCisJLmxvbmcgUigxYSwgMTcsIGE0LCBjMyksIFIoM2EsIDI3LCA1ZSwgOTYpCisJLmxvbmcgUigzYiwgYWIsIDZiLCBjYiksIFIoMWYsIDlkLCA0NSwgZjEpCisJLmxvbmcgUihhYywgZmEsIDU4LCBhYiksIFIoNGIsIGUzLCAwMywgOTMpCisJLmxvbmcgUigyMCwgMzAsIGZhLCA1NSksIFIoYWQsIDc2LCA2ZCwgZjYpCisJLmxvbmcgUig4OCwgY2MsIDc2LCA5MSksIFIoZjUsIDAyLCA0YywgMjUpCisJLmxvbmcgUig0ZiwgZTUsIGQ3LCBmYyksIFIoYzUsIDJhLCBjYiwgZDcpCisJLmxvbmcgUigyNiwgMzUsIDQ0LCA4MCksIFIoYjUsIDYyLCBhMywgOGYpCisJLmxvbmcgUihkZSwgYjEsIDVhLCA0OSksIFIoMjUsIGJhLCAxYiwgNjcpCisJLmxvbmcgUig0NSwgZWEsIDBlLCA5OCksIFIoNWQsIGZlLCBjMCwgZTEpCisJLmxvbmcgUihjMywgMmYsIDc1LCAwMiksIFIoODEsIDRjLCBmMCwgMTIpCisJLmxvbmcgUig4ZCwgNDYsIDk3LCBhMyksIFIoNmIsIGQzLCBmOSwgYzYpCisJLmxvbmcgUigwMywgOGYsIDVmLCBlNyksIFIoMTUsIDkyLCA5YywgOTUpCisJLmxvbmcgUihiZiwgNmQsIDdhLCBlYiksIFIoOTUsIDUyLCA1OSwgZGEpCisJLmxvbmcgUihkNCwgYmUsIDgzLCAyZCksIFIoNTgsIDc0LCAyMSwgZDMpCisJLmxvbmcgUig0OSwgZTAsIDY5LCAyOSksIFIoOGUsIGM5LCBjOCwgNDQpCisJLmxvbmcgUig3NSwgYzIsIDg5LCA2YSksIFIoZjQsIDhlLCA3OSwgNzgpCisJLmxvbmcgUig5OSwgNTgsIDNlLCA2YiksIFIoMjcsIGI5LCA3MSwgZGQpCisJLmxvbmcgUihiZSwgZTEsIDRmLCBiNiksIFIoZjAsIDg4LCBhZCwgMTcpCisJLmxvbmcgUihjOSwgMjAsIGFjLCA2NiksIFIoN2QsIGNlLCAzYSwgYjQpCisJLmxvbmcgUig2MywgZGYsIDRhLCAxOCksIFIoZTUsIDFhLCAzMSwgODIpCisJLmxvbmcgUig5NywgNTEsIDMzLCA2MCksIFIoNjIsIDUzLCA3ZiwgNDUpCisJLmxvbmcgUihiMSwgNjQsIDc3LCBlMCksIFIoYmIsIDZiLCBhZSwgODQpCisJLmxvbmcgUihmZSwgODEsIGEwLCAxYyksIFIoZjksIDA4LCAyYiwgOTQpCisJLmxvbmcgUig3MCwgNDgsIDY4LCA1OCksIFIoOGYsIDQ1LCBmZCwgMTkpCisJLmxvbmcgUig5NCwgZGUsIDZjLCA4NyksIFIoNTIsIDdiLCBmOCwgYjcpCisJLmxvbmcgUihhYiwgNzMsIGQzLCAyMyksIFIoNzIsIDRiLCAwMiwgZTIpCisJLmxvbmcgUihlMywgMWYsIDhmLCA1NyksIFIoNjYsIDU1LCBhYiwgMmEpCisJLmxvbmcgUihiMiwgZWIsIDI4LCAwNyksIFIoMmYsIGI1LCBjMiwgMDMpCisJLmxvbmcgUig4NiwgYzUsIDdiLCA5YSksIFIoZDMsIDM3LCAwOCwgYTUpCisJLmxvbmcgUigzMCwgMjgsIDg3LCBmMiksIFIoMjMsIGJmLCBhNSwgYjIpCisJLmxvbmcgUigwMiwgMDMsIDZhLCBiYSksIFIoZWQsIDE2LCA4MiwgNWMpCisJLmxvbmcgUig4YSwgY2YsIDFjLCAyYiksIFIoYTcsIDc5LCBiNCwgOTIpCisJLmxvbmcgUihmMywgMDcsIGYyLCBmMCksIFIoNGUsIDY5LCBlMiwgYTEpCisJLmxvbmcgUig2NSwgZGEsIGY0LCBjZCksIFIoMDYsIDA1LCBiZSwgZDUpCisJLmxvbmcgUihkMSwgMzQsIDYyLCAxZiksIFIoYzQsIGE2LCBmZSwgOGEpCisJLmxvbmcgUigzNCwgMmUsIDUzLCA5ZCksIFIoYTIsIGYzLCA1NSwgYTApCisJLmxvbmcgUigwNSwgOGEsIGUxLCAzMiksIFIoYTQsIGY2LCBlYiwgNzUpCisJLmxvbmcgUigwYiwgODMsIGVjLCAzOSksIFIoNDAsIDYwLCBlZiwgYWEpCisJLmxvbmcgUig1ZSwgNzEsIDlmLCAwNiksIFIoYmQsIDZlLCAxMCwgNTEpCisJLmxvbmcgUigzZSwgMjEsIDhhLCBmOSksIFIoOTYsIGRkLCAwNiwgM2QpCisJLmxvbmcgUihkZCwgM2UsIDA1LCBhZSksIFIoNGQsIGU2LCBiZCwgNDYpCisJLmxvbmcgUig5MSwgNTQsIDhkLCBiNSksIFIoNzEsIGM0LCA1ZCwgMDUpCisJLmxvbmcgUigwNCwgMDYsIGQ0LCA2ZiksIFIoNjAsIDUwLCAxNSwgZmYpCisJLmxvbmcgUigxOSwgOTgsIGZiLCAyNCksIFIoZDYsIGJkLCBlOSwgOTcpCisJLmxvbmcgUig4OSwgNDAsIDQzLCBjYyksIFIoNjcsIGQ5LCA5ZSwgNzcpCisJLmxvbmcgUihiMCwgZTgsIDQyLCBiZCksIFIoMDcsIDg5LCA4YiwgODgpCisJLmxvbmcgUihlNywgMTksIDViLCAzOCksIFIoNzksIGM4LCBlZSwgZGIpCisJLmxvbmcgUihhMSwgN2MsIDBhLCA0NyksIFIoN2MsIDQyLCAwZiwgZTkpCisJLmxvbmcgUihmOCwgODQsIDFlLCBjOSksIFIoMDAsIDAwLCAwMCwgMDApCisJLmxvbmcgUigwOSwgODAsIDg2LCA4MyksIFIoMzIsIDJiLCBlZCwgNDgpCisJLmxvbmcgUigxZSwgMTEsIDcwLCBhYyksIFIoNmMsIDVhLCA3MiwgNGUpCisJLmxvbmcgUihmZCwgMGUsIGZmLCBmYiksIFIoMGYsIDg1LCAzOCwgNTYpCisJLmxvbmcgUigzZCwgYWUsIGQ1LCAxZSksIFIoMzYsIDJkLCAzOSwgMjcpCisJLmxvbmcgUigwYSwgMGYsIGQ5LCA2NCksIFIoNjgsIDVjLCBhNiwgMjEpCisJLmxvbmcgUig5YiwgNWIsIDU0LCBkMSksIFIoMjQsIDM2LCAyZSwgM2EpCisJLmxvbmcgUigwYywgMGEsIDY3LCBiMSksIFIoOTMsIDU3LCBlNywgMGYpCisJLmxvbmcgUihiNCwgZWUsIDk2LCBkMiksIFIoMWIsIDliLCA5MSwgOWUpCisJLmxvbmcgUig4MCwgYzAsIGM1LCA0ZiksIFIoNjEsIGRjLCAyMCwgYTIpCisJLmxvbmcgUig1YSwgNzcsIDRiLCA2OSksIFIoMWMsIDEyLCAxYSwgMTYpCisJLmxvbmcgUihlMiwgOTMsIGJhLCAwYSksIFIoYzAsIGEwLCAyYSwgZTUpCisJLmxvbmcgUigzYywgMjIsIGUwLCA0MyksIFIoMTIsIDFiLCAxNywgMWQpCisJLmxvbmcgUigwZSwgMDksIDBkLCAwYiksIFIoZjIsIDhiLCBjNywgYWQpCisJLmxvbmcgUigyZCwgYjYsIGE4LCBiOSksIFIoMTQsIDFlLCBhOSwgYzgpCisJLmxvbmcgUig1NywgZjEsIDE5LCA4NSksIFIoYWYsIDc1LCAwNywgNGMpCisJLmxvbmcgUihlZSwgOTksIGRkLCBiYiksIFIoYTMsIDdmLCA2MCwgZmQpCisJLmxvbmcgUihmNywgMDEsIDI2LCA5ZiksIFIoNWMsIDcyLCBmNSwgYmMpCisJLmxvbmcgUig0NCwgNjYsIDNiLCBjNSksIFIoNWIsIGZiLCA3ZSwgMzQpCisJLmxvbmcgUig4YiwgNDMsIDI5LCA3NiksIFIoY2IsIDIzLCBjNiwgZGMpCisJLmxvbmcgUihiNiwgZWQsIGZjLCA2OCksIFIoYjgsIGU0LCBmMSwgNjMpCisJLmxvbmcgUihkNywgMzEsIGRjLCBjYSksIFIoNDIsIDYzLCA4NSwgMTApCisJLmxvbmcgUigxMywgOTcsIDIyLCA0MCksIFIoODQsIGM2LCAxMSwgMjApCisJLmxvbmcgUig4NSwgNGEsIDI0LCA3ZCksIFIoZDIsIGJiLCAzZCwgZjgpCisJLmxvbmcgUihhZSwgZjksIDMyLCAxMSksIFIoYzcsIDI5LCBhMSwgNmQpCisJLmxvbmcgUigxZCwgOWUsIDJmLCA0YiksIFIoZGMsIGIyLCAzMCwgZjMpCisJLmxvbmcgUigwZCwgODYsIDUyLCBlYyksIFIoNzcsIGMxLCBlMywgZDApCisJLmxvbmcgUigyYiwgYjMsIDE2LCA2YyksIFIoYTksIDcwLCBiOSwgOTkpCisJLmxvbmcgUigxMSwgOTQsIDQ4LCBmYSksIFIoNDcsIGU5LCA2NCwgMjIpCisJLmxvbmcgUihhOCwgZmMsIDhjLCBjNCksIFIoYTAsIGYwLCAzZiwgMWEpCisJLmxvbmcgUig1NiwgN2QsIDJjLCBkOCksIFIoMjIsIDMzLCA5MCwgZWYpCisJLmxvbmcgUig4NywgNDksIDRlLCBjNyksIFIoZDksIDM4LCBkMSwgYzEpCisJLmxvbmcgUig4YywgY2EsIGEyLCBmZSksIFIoOTgsIGQ0LCAwYiwgMzYpCisJLmxvbmcgUihhNiwgZjUsIDgxLCBjZiksIFIoYTUsIDdhLCBkZSwgMjgpCisJLmxvbmcgUihkYSwgYjcsIDhlLCAyNiksIFIoM2YsIGFkLCBiZiwgYTQpCisJLmxvbmcgUigyYywgM2EsIDlkLCBlNCksIFIoNTAsIDc4LCA5MiwgMGQpCisJLmxvbmcgUig2YSwgNWYsIGNjLCA5YiksIFIoNTQsIDdlLCA0NiwgNjIpCisJLmxvbmcgUihmNiwgOGQsIDEzLCBjMiksIFIoOTAsIGQ4LCBiOCwgZTgpCisJLmxvbmcgUigyZSwgMzksIGY3LCA1ZSksIFIoODIsIGMzLCBhZiwgZjUpCisJLmxvbmcgUig5ZiwgNWQsIDgwLCBiZSksIFIoNjksIGQwLCA5MywgN2MpCisJLmxvbmcgUig2ZiwgZDUsIDJkLCBhOSksIFIoY2YsIDI1LCAxMiwgYjMpCisJLmxvbmcgUihjOCwgYWMsIDk5LCAzYiksIFIoMTAsIDE4LCA3ZCwgYTcpCisJLmxvbmcgUihlOCwgOWMsIDYzLCA2ZSksIFIoZGIsIDNiLCBiYiwgN2IpCisJLmxvbmcgUihjZCwgMjYsIDc4LCAwOSksIFIoNmUsIDU5LCAxOCwgZjQpCisJLmxvbmcgUihlYywgOWEsIGI3LCAwMSksIFIoODMsIDRmLCA5YSwgYTgpCisJLmxvbmcgUihlNiwgOTUsIDZlLCA2NSksIFIoYWEsIGZmLCBlNiwgN2UpCisJLmxvbmcgUigyMSwgYmMsIGNmLCAwOCksIFIoZWYsIDE1LCBlOCwgZTYpCisJLmxvbmcgUihiYSwgZTcsIDliLCBkOSksIFIoNGEsIDZmLCAzNiwgY2UpCisJLmxvbmcgUihlYSwgOWYsIDA5LCBkNCksIFIoMjksIGIwLCA3YywgZDYpCisJLmxvbmcgUigzMSwgYTQsIGIyLCBhZiksIFIoMmEsIDNmLCAyMywgMzEpCisJLmxvbmcgUihjNiwgYTUsIDk0LCAzMCksIFIoMzUsIGEyLCA2NiwgYzApCisJLmxvbmcgUig3NCwgNGUsIGJjLCAzNyksIFIoZmMsIDgyLCBjYSwgYTYpCisJLmxvbmcgUihlMCwgOTAsIGQwLCBiMCksIFIoMzMsIGE3LCBkOCwgMTUpCisJLmxvbmcgUihmMSwgMDQsIDk4LCA0YSksIFIoNDEsIGVjLCBkYSwgZjcpCisJLmxvbmcgUig3ZiwgY2QsIDUwLCAwZSksIFIoMTcsIDkxLCBmNiwgMmYpCisJLmxvbmcgUig3NiwgNGQsIGQ2LCA4ZCksIFIoNDMsIGVmLCBiMCwgNGQpCisJLmxvbmcgUihjYywgYWEsIDRkLCA1NCksIFIoZTQsIDk2LCAwNCwgZGYpCisJLmxvbmcgUig5ZSwgZDEsIGI1LCBlMyksIFIoNGMsIDZhLCA4OCwgMWIpCisJLmxvbmcgUihjMSwgMmMsIDFmLCBiOCksIFIoNDYsIDY1LCA1MSwgN2YpCisJLmxvbmcgUig5ZCwgNWUsIGVhLCAwNCksIFIoMDEsIDhjLCAzNSwgNWQpCisJLmxvbmcgUihmYSwgODcsIDc0LCA3MyksIFIoZmIsIDBiLCA0MSwgMmUpCisJLmxvbmcgUihiMywgNjcsIDFkLCA1YSksIFIoOTIsIGRiLCBkMiwgNTIpCisJLmxvbmcgUihlOSwgMTAsIDU2LCAzMyksIFIoNmQsIGQ2LCA0NywgMTMpCisJLmxvbmcgUig5YSwgZDcsIDYxLCA4YyksIFIoMzcsIGExLCAwYywgN2EpCisJLmxvbmcgUig1OSwgZjgsIDE0LCA4ZSksIFIoZWIsIDEzLCAzYywgODkpCisJLmxvbmcgUihjZSwgYTksIDI3LCBlZSksIFIoYjcsIDYxLCBjOSwgMzUpCisJLmxvbmcgUihlMSwgMWMsIGU1LCBlZCksIFIoN2EsIDQ3LCBiMSwgM2MpCisJLmxvbmcgUig5YywgZDIsIGRmLCA1OSksIFIoNTUsIGYyLCA3MywgM2YpCisJLmxvbmcgUigxOCwgMTQsIGNlLCA3OSksIFIoNzMsIGM3LCAzNywgYmYpCisJLmxvbmcgUig1MywgZjcsIGNkLCBlYSksIFIoNWYsIGZkLCBhYSwgNWIpCisJLmxvbmcgUihkZiwgM2QsIDZmLCAxNCksIFIoNzgsIDQ0LCBkYiwgODYpCisJLmxvbmcgUihjYSwgYWYsIGYzLCA4MSksIFIoYjksIDY4LCBjNCwgM2UpCisJLmxvbmcgUigzOCwgMjQsIDM0LCAyYyksIFIoYzIsIGEzLCA0MCwgNWYpCisJLmxvbmcgUigxNiwgMWQsIGMzLCA3MiksIFIoYmMsIGUyLCAyNSwgMGMpCisJLmxvbmcgUigyOCwgM2MsIDQ5LCA4YiksIFIoZmYsIDBkLCA5NSwgNDEpCisJLmxvbmcgUigzOSwgYTgsIDAxLCA3MSksIFIoMDgsIDBjLCBiMywgZGUpCisJLmxvbmcgUihkOCwgYjQsIGU0LCA5YyksIFIoNjQsIDU2LCBjMSwgOTApCisJLmxvbmcgUig3YiwgY2IsIDg0LCA2MSksIFIoZDUsIDMyLCBiNiwgNzApCisJLmxvbmcgUig0OCwgNmMsIDVjLCA3NCksIFIoZDAsIGI4LCA1NywgNDIpCisuZ2xvYmwgUFBDX0FFU180S19ERUNUQUIyCitQUENfQUVTXzRLX0RFQ1RBQjI6CisvKiBkZWNyeXB0aW9uIHRhYmxlLCBzYW1lIGFzIGNyeXB0b19pbF90YWIgaW4gY3J5cHRvL2Flcy1nZW5lcmljLmMgKi8KKwkuYnl0ZSAweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4CisJLmJ5dGUgMHhiZiwgMHg0MCwgMHhhMywgMHg5ZSwgMHg4MSwgMHhmMywgMHhkNywgMHhmYgorCS5ieXRlIDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcKKwkuYnl0ZSAweDM0LCAweDhlLCAweDQzLCAweDQ0LCAweGM0LCAweGRlLCAweGU5LCAweGNiCisJLmJ5dGUgMHg1NCwgMHg3YiwgMHg5NCwgMHgzMiwgMHhhNiwgMHhjMiwgMHgyMywgMHgzZAorCS5ieXRlIDB4ZWUsIDB4NGMsIDB4OTUsIDB4MGIsIDB4NDIsIDB4ZmEsIDB4YzMsIDB4NGUKKwkuYnl0ZSAweDA4LCAweDJlLCAweGExLCAweDY2LCAweDI4LCAweGQ5LCAweDI0LCAweGIyCisJLmJ5dGUgMHg3NiwgMHg1YiwgMHhhMiwgMHg0OSwgMHg2ZCwgMHg4YiwgMHhkMSwgMHgyNQorCS5ieXRlIDB4NzIsIDB4ZjgsIDB4ZjYsIDB4NjQsIDB4ODYsIDB4NjgsIDB4OTgsIDB4MTYKKwkuYnl0ZSAweGQ0LCAweGE0LCAweDVjLCAweGNjLCAweDVkLCAweDY1LCAweGI2LCAweDkyCisJLmJ5dGUgMHg2YywgMHg3MCwgMHg0OCwgMHg1MCwgMHhmZCwgMHhlZCwgMHhiOSwgMHhkYQorCS5ieXRlIDB4NWUsIDB4MTUsIDB4NDYsIDB4NTcsIDB4YTcsIDB4OGQsIDB4OWQsIDB4ODQKKwkuYnl0ZSAweDkwLCAweGQ4LCAweGFiLCAweDAwLCAweDhjLCAweGJjLCAweGQzLCAweDBhCisJLmJ5dGUgMHhmNywgMHhlNCwgMHg1OCwgMHgwNSwgMHhiOCwgMHhiMywgMHg0NSwgMHgwNgorCS5ieXRlIDB4ZDAsIDB4MmMsIDB4MWUsIDB4OGYsIDB4Y2EsIDB4M2YsIDB4MGYsIDB4MDIKKwkuYnl0ZSAweGMxLCAweGFmLCAweGJkLCAweDAzLCAweDAxLCAweDEzLCAweDhhLCAweDZiCisJLmJ5dGUgMHgzYSwgMHg5MSwgMHgxMSwgMHg0MSwgMHg0ZiwgMHg2NywgMHhkYywgMHhlYQorCS5ieXRlIDB4OTcsIDB4ZjIsIDB4Y2YsIDB4Y2UsIDB4ZjAsIDB4YjQsIDB4ZTYsIDB4NzMKKwkuYnl0ZSAweDk2LCAweGFjLCAweDc0LCAweDIyLCAweGU3LCAweGFkLCAweDM1LCAweDg1CisJLmJ5dGUgMHhlMiwgMHhmOSwgMHgzNywgMHhlOCwgMHgxYywgMHg3NSwgMHhkZiwgMHg2ZQorCS5ieXRlIDB4NDcsIDB4ZjEsIDB4MWEsIDB4NzEsIDB4MWQsIDB4MjksIDB4YzUsIDB4ODkKKwkuYnl0ZSAweDZmLCAweGI3LCAweDYyLCAweDBlLCAweGFhLCAweDE4LCAweGJlLCAweDFiCisJLmJ5dGUgMHhmYywgMHg1NiwgMHgzZSwgMHg0YiwgMHhjNiwgMHhkMiwgMHg3OSwgMHgyMAorCS5ieXRlIDB4OWEsIDB4ZGIsIDB4YzAsIDB4ZmUsIDB4NzgsIDB4Y2QsIDB4NWEsIDB4ZjQKKwkuYnl0ZSAweDFmLCAweGRkLCAweGE4LCAweDMzLCAweDg4LCAweDA3LCAweGM3LCAweDMxCisJLmJ5dGUgMHhiMSwgMHgxMiwgMHgxMCwgMHg1OSwgMHgyNywgMHg4MCwgMHhlYywgMHg1ZgorCS5ieXRlIDB4NjAsIDB4NTEsIDB4N2YsIDB4YTksIDB4MTksIDB4YjUsIDB4NGEsIDB4MGQKKwkuYnl0ZSAweDJkLCAweGU1LCAweDdhLCAweDlmLCAweDkzLCAweGM5LCAweDljLCAweGVmCisJLmJ5dGUgMHhhMCwgMHhlMCwgMHgzYiwgMHg0ZCwgMHhhZSwgMHgyYSwgMHhmNSwgMHhiMAorCS5ieXRlIDB4YzgsIDB4ZWIsIDB4YmIsIDB4M2MsIDB4ODMsIDB4NTMsIDB4OTksIDB4NjEKKwkuYnl0ZSAweDE3LCAweDJiLCAweDA0LCAweDdlLCAweGJhLCAweDc3LCAweGQ2LCAweDI2CisJLmJ5dGUgMHhlMSwgMHg2OSwgMHgxNCwgMHg2MywgMHg1NSwgMHgyMSwgMHgwYywgMHg3ZApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NyeXB0by9tZDUtYXNtLlMgYi9hcmNoL3Bvd2VycGMvY3J5cHRvL21kNS1hc20uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGNkZjViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NyeXB0by9tZDUtYXNtLlMKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBGYXN0IE1ENSBpbXBsZW1lbnRhdGlvbiBmb3IgUFBDCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IE1hcmt1cyBTdG9ja2hhdXNlbiA8c3RvY2toYXVzZW5AY29sbG9naWEuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorCisjZGVmaW5lIHJIUAlyMworI2RlZmluZSByV1AJcjQKKworI2RlZmluZSBySDAJcjAKKyNkZWZpbmUgckgxCXI2CisjZGVmaW5lIHJIMglyNworI2RlZmluZSBySDMJcjUKKworI2RlZmluZSByVzAwCXI4CisjZGVmaW5lIHJXMDEJcjkKKyNkZWZpbmUgclcwMglyMTAKKyNkZWZpbmUgclcwMwlyMTEKKyNkZWZpbmUgclcwNAlyMTIKKyNkZWZpbmUgclcwNQlyMTQKKyNkZWZpbmUgclcwNglyMTUKKyNkZWZpbmUgclcwNwlyMTYKKyNkZWZpbmUgclcwOAlyMTcKKyNkZWZpbmUgclcwOQlyMTgKKyNkZWZpbmUgclcxMAlyMTkKKyNkZWZpbmUgclcxMQlyMjAKKyNkZWZpbmUgclcxMglyMjEKKyNkZWZpbmUgclcxMwlyMjIKKyNkZWZpbmUgclcxNAlyMjMKKyNkZWZpbmUgclcxNQlyMjQKKworI2RlZmluZSByVDAJcjI1CisjZGVmaW5lIHJUMQlyMjYKKworI2RlZmluZSBJTklUSUFMSVpFIFwKKwlQUENfU1RMVSByMSwtSU5UX0ZSQU1FX1NJWkUocjEpOyBcCisJU0FWRV84R1BSUygxNCwgcjEpOwkJLyogcHVzaCByZWdpc3RlcnMgb250byBzdGFjawkqLyBcCisJU0FWRV80R1BSUygyMiwgcjEpOwkJCQkJCSAgIFwKKwlTQVZFX0dQUigyNiwgcjEpCisKKyNkZWZpbmUgRklOQUxJWkUgXAorCVJFU1RfOEdQUlMoMTQsIHIxKTsJCS8qIHBvcCByZWdpc3RlcnMgZnJvbSBzdGFjawkqLyBcCisJUkVTVF80R1BSUygyMiwgcjEpOwkJCQkJCSAgIFwKKwlSRVNUX0dQUigyNiwgcjEpOwkJCQkJCSAgIFwKKwlhZGRpCXIxLHIxLElOVF9GUkFNRV9TSVpFOworCisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyNkZWZpbmUgTE9BRF9EQVRBKHJlZywgb2ZmKSBcCisJbHdicngJCXJlZywwLHJXUDsJLyogbG9hZCBkYXRhCQkJKi8KKyNkZWZpbmUgSU5DX1BUUiBcCisJYWRkaQkJcldQLHJXUCw0OwkvKiBpbmNyZW1lbnQgcGVyIHdvcmQJCSovCisjZGVmaW5lIE5FWFRfQkxPQ0sJCQkvKiBub3RoaW5nIHRvIGRvCQkqLworI2Vsc2UKKyNkZWZpbmUgTE9BRF9EQVRBKHJlZywgb2ZmKSBcCisJbHd6CQlyZWcsb2ZmKHJXUCk7CS8qIGxvYWQgZGF0YQkJCSovCisjZGVmaW5lIElOQ19QVFIJCQkJLyogbm90aGluZyB0byBkbwkJKi8KKyNkZWZpbmUgTkVYVF9CTE9DSyBcCisJYWRkaQkJcldQLHJXUCw2NDsJLyogaW5jcmVtZW50IHBlciBibG9jawkJKi8KKyNlbmRpZgorCisjZGVmaW5lIFJfMDBfMTUoYSwgYiwgYywgZCwgdzAsIHcxLCBwLCBxLCBvZmYsIGswaCwgazBsLCBrMWgsIGsxbCkgXAorCUxPQURfREFUQSh3MCwgb2ZmKQkJLyogICAgVwkJCQkqLyBcCisJYW5kCQlyVDAsYixjOwkvKiAxOiBmID0gYiBhbmQgYwkJKi8gXAorCUlOQ19QVFIJCQkJLyogICAgcHRyKysJCQkqLyBcCisJYW5kYwkJclQxLGQsYjsJLyogMTogZicgPSB+YiBhbmQgZAkJKi8gXAorCUxPQURfREFUQSh3MSwgb2ZmKzQpCQkvKiAgICBXCQkJCSovIFwKKwlvcgkJclQwLHJUMCxyVDE7CS8qIDE6IGYgPSBmIG9yIGYnCQkqLyBcCisJYWRkaQkJdzAsdzAsazBsOwkvKiAxOiB3ayA9IHcgKyBrCQkqLyBcCisJYWRkCQlhLGEsclQwOwkvKiAxOiBhID0gYSArIGYJCQkqLyBcCisJYWRkaXMJCXcwLHcwLGswaDsJLyogMTogd2sgPSB3ICsgaycJCSovIFwKKwlhZGRpcwkJdzEsdzEsazFoOwkvKiAyOiB3ayA9IHcgKyBrCQkqLyBcCisJYWRkCQlhLGEsdzA7CQkvKiAxOiBhID0gYSArIHdrCQkqLyBcCisJYWRkaQkJdzEsdzEsazFsOwkvKiAyOiB3ayA9IHcgKyBrJwkJKi8gXAorCXJvdHJ3aQkJYSxhLHA7CQkvKiAxOiBhID0gYSByb3RsIHgJCSovIFwKKwlhZGQJCWQsZCx3MTsJCS8qIDI6IGEgPSBhICsgd2sJCSovIFwKKwlhZGQJCWEsYSxiOwkJLyogMTogYSA9IGEgKyBiCQkJKi8gXAorCWFuZAkJclQwLGEsYjsJLyogMjogZiA9IGIgYW5kIGMJCSovIFwKKwlhbmRjCQlyVDEsYyxhOwkvKiAyOiBmJyA9IH5iIGFuZCBkCQkqLyBcCisJb3IJCXJUMCxyVDAsclQxOwkvKiAyOiBmID0gZiBvciBmJwkJKi8gXAorCWFkZAkJZCxkLHJUMDsJLyogMjogYSA9IGEgKyBmCQkJKi8gXAorCUlOQ19QVFIJCQkJLyogICAgcHRyKysJCQkqLyBcCisJcm90cndpCQlkLGQscTsJCS8qIDI6IGEgPSBhIHJvdGwgeAkJKi8gXAorCWFkZAkJZCxkLGE7CQkvKiAyOiBhID0gYSArIGIJCQkqLworCisjZGVmaW5lIFJfMTZfMzEoYSwgYiwgYywgZCwgdzAsIHcxLCBwLCBxLCBrMGgsIGswbCwgazFoLCBrMWwpIFwKKwlhbmRjCQlyVDAsYyxkOwkvKiAxOiBmID0gYyBhbmQgfmQJCSovIFwKKwlhbmQJCXJUMSxiLGQ7CS8qIDE6IGYnID0gYiBhbmQgZAkJKi8gXAorCWFkZGkJCXcwLHcwLGswbDsJLyogMTogd2sgPSB3ICsgawkJKi8gXAorCW9yCQlyVDAsclQwLHJUMTsJLyogMTogZiA9IGYgb3IgZicJCSovIFwKKwlhZGRpcwkJdzAsdzAsazBoOwkvKiAxOiB3ayA9IHcgKyBrJwkJKi8gXAorCWFkZAkJYSxhLHJUMDsJLyogMTogYSA9IGEgKyBmCQkJKi8gXAorCWFkZGkJCXcxLHcxLGsxbDsJLyogMjogd2sgPSB3ICsgawkJKi8gXAorCWFkZAkJYSxhLHcwOwkJLyogMTogYSA9IGEgKyB3awkJKi8gXAorCWFkZGlzCQl3MSx3MSxrMWg7CS8qIDI6IHdrID0gdyArIGsnCQkqLyBcCisJYW5kYwkJclQwLGIsYzsJLyogMjogZiA9IGMgYW5kIH5kCQkqLyBcCisJcm90cndpCQlhLGEscDsJCS8qIDE6IGEgPSBhIHJvdGwgeAkJKi8gXAorCWFkZAkJYSxhLGI7CQkvKiAxOiBhID0gYSArIGIJCQkqLyBcCisJYWRkCQlkLGQsdzE7CQkvKiAyOiBhID0gYSArIHdrCQkqLyBcCisJYW5kCQlyVDEsYSxjOwkvKiAyOiBmJyA9IGIgYW5kIGQJCSovIFwKKwlvcgkJclQwLHJUMCxyVDE7CS8qIDI6IGYgPSBmIG9yIGYnCQkqLyBcCisJYWRkCQlkLGQsclQwOwkvKiAyOiBhID0gYSArIGYJCQkqLyBcCisJcm90cndpCQlkLGQscTsJCS8qIDI6IGEgPSBhIHJvdGwgeAkJKi8gXAorCWFkZAkJZCxkLGE7CQkvKiAyOiBhID0gYSArYgkJCSovCisKKyNkZWZpbmUgUl8zMl80NyhhLCBiLCBjLCBkLCB3MCwgdzEsIHAsIHEsIGswaCwgazBsLCBrMWgsIGsxbCkgXAorCXhvcgkJclQwLGIsYzsJLyogMTogZicgPSBiIHhvciBjCQkqLyBcCisJYWRkaQkJdzAsdzAsazBsOwkvKiAxOiB3ayA9IHcgKyBrCQkqLyBcCisJeG9yCQlyVDEsclQwLGQ7CS8qIDE6IGYgPSBmIHhvciBmJwkJKi8gXAorCWFkZGlzCQl3MCx3MCxrMGg7CS8qIDE6IHdrID0gdyArIGsnCQkqLyBcCisJYWRkCQlhLGEsclQxOwkvKiAxOiBhID0gYSArIGYJCQkqLyBcCisJYWRkaQkJdzEsdzEsazFsOwkvKiAyOiB3ayA9IHcgKyBrCQkqLyBcCisJYWRkCQlhLGEsdzA7CQkvKiAxOiBhID0gYSArIHdrCQkqLyBcCisJYWRkaXMJCXcxLHcxLGsxaDsJLyogMjogd2sgPSB3ICsgaycJCSovIFwKKwlyb3Ryd2kJCWEsYSxwOwkJLyogMTogYSA9IGEgcm90bCB4CQkqLyBcCisJYWRkCQlkLGQsdzE7CQkvKiAyOiBhID0gYSArIHdrCQkqLyBcCisJYWRkCQlhLGEsYjsJCS8qIDE6IGEgPSBhICsgYgkJCSovIFwKKwl4b3IJCXJUMSxyVDAsYTsJLyogMjogZiA9IGIgeG9yIGYnCQkqLyBcCisJYWRkCQlkLGQsclQxOwkvKiAyOiBhID0gYSArIGYJCQkqLyBcCisJcm90cndpCQlkLGQscTsJCS8qIDI6IGEgPSBhIHJvdGwgeAkJKi8gXAorCWFkZAkJZCxkLGE7CQkvKiAyOiBhID0gYSArIGIJCQkqLworCisjZGVmaW5lIFJfNDhfNjMoYSwgYiwgYywgZCwgdzAsIHcxLCBwLCBxLCBrMGgsIGswbCwgazFoLCBrMWwpIFwKKwlhZGRpCQl3MCx3MCxrMGw7CS8qIDE6IHcgPSB3ICsgawkJCSovIFwKKwlvcmMJCXJUMCxiLGQ7CS8qIDE6IGYgPSBiIG9yIH5kCQkqLyBcCisJYWRkaXMJCXcwLHcwLGswaDsJLyogMTogdyA9IHcgKyBrJwkJKi8gXAorCXhvcgkJclQwLHJUMCxjOwkvKiAxOiBmID0gZiB4b3IgYwkJKi8gXAorCWFkZAkJYSxhLHcwOwkJLyogMTogYSA9IGEgKyB3awkJKi8gXAorCWFkZGkJCXcxLHcxLGsxbDsJLyogMjogdyA9IHcgKyBrCQkJKi8gXAorCWFkZAkJYSxhLHJUMDsJLyogMTogYSA9IGEgKyBmCQkJKi8gXAorCWFkZGlzCQl3MSx3MSxrMWg7CS8qIDI6IHcgPSB3ICsgaycJCSovIFwKKwlyb3Ryd2kJCWEsYSxwOwkJLyogMTogYSA9IGEgcm90bCB4CQkqLyBcCisJYWRkCQlhLGEsYjsJCS8qIDE6IGEgPSBhICsgYgkJCSovIFwKKwlvcmMJCXJUMCxhLGM7CS8qIDI6IGYgPSBiIG9yIH5kCQkqLyBcCisJYWRkCQlkLGQsdzE7CQkvKiAyOiBhID0gYSArIHdrCQkqLyBcCisJeG9yCQlyVDAsclQwLGI7CS8qIDI6IGYgPSBmIHhvciBjCQkqLyBcCisJYWRkCQlkLGQsclQwOwkvKiAyOiBhID0gYSArIGYJCQkqLyBcCisJcm90cndpCQlkLGQscTsJCS8qIDI6IGEgPSBhIHJvdGwgeAkJKi8gXAorCWFkZAkJZCxkLGE7CQkvKiAyOiBhID0gYSArIGIJCQkqLworCitfR0xPQkFMKHBwY19tZDVfdHJhbnNmb3JtKQorCUlOSVRJQUxJWkUKKworCW10Y3RyCQlyNQorCWx3egkJckgwLDAockhQKQorCWx3egkJckgxLDQockhQKQorCWx3egkJckgyLDgockhQKQorCWx3egkJckgzLDEyKHJIUCkKKworcHBjX21kNV9tYWluOgorCVJfMDBfMTUockgwLCBySDEsIHJIMiwgckgzLCByVzAwLCByVzAxLCAyNSwgMjAsIDAsCisJCTB4ZDc2YiwgLTIzNDMyLCAweGU4YzgsIC0xODYwMikKKwlSXzAwXzE1KHJIMiwgckgzLCBySDAsIHJIMSwgclcwMiwgclcwMywgMTUsIDEwLCA4LAorCQkweDI0MjAsIDB4NzBkYiwgMHhjMWJlLCAtMTI1NjIpCisJUl8wMF8xNShySDAsIHJIMSwgckgyLCBySDMsIHJXMDQsIHJXMDUsIDI1LCAyMCwgMTYsCisJCTB4ZjU3YywgMHgwZmFmLCAweDQ3ODgsIC0xNDgwNikKKwlSXzAwXzE1KHJIMiwgckgzLCBySDAsIHJIMSwgclcwNiwgclcwNywgMTUsIDEwLCAyNCwKKwkJMHhhODMwLCAweDQ2MTMsIDB4ZmQ0NywgLTI3MzkxKQorCVJfMDBfMTUockgwLCBySDEsIHJIMiwgckgzLCByVzA4LCByVzA5LCAyNSwgMjAsIDMyLAorCQkweDY5ODEsIC0yNjQwOCwgMHg4YjQ1LCAgLTIxMjkpCisJUl8wMF8xNShySDIsIHJIMywgckgwLCBySDEsIHJXMTAsIHJXMTEsIDE1LCAxMCwgNDAsCisJCTB4ZmZmZiwgMHg1YmIxLCAweDg5NWQsIC0xMDMwNikKKwlSXzAwXzE1KHJIMCwgckgxLCBySDIsIHJIMywgclcxMiwgclcxMywgMjUsIDIwLCA0OCwKKwkJMHg2YjkwLCAweDExMjIsIDB4ZmQ5OCwgMHg3MTkzKQorCVJfMDBfMTUockgyLCBySDMsIHJIMCwgckgxLCByVzE0LCByVzE1LCAxNSwgMTAsIDU2LAorCQkweGE2NzksIDB4NDM4ZSwgMHg0OWI0LCAweDA4MjEpCisKKwlSXzE2XzMxKHJIMCwgckgxLCBySDIsIHJIMywgclcwMSwgclcwNiwgMjcsIDIzLAorCQkweDBkNTYsIDB4NmUwYywgMHgxODEwLCAweDZkMmQpCisJUl8xNl8zMShySDIsIHJIMywgckgwLCBySDEsIHJXMTEsIHJXMDAsIDE4LCAxMiwKKwkJMHg5ZDAyLCAtMzIxMDksIDB4MTI0YywgMHgyMzMyKQorCVJfMTZfMzEockgwLCBySDEsIHJIMiwgckgzLCByVzA1LCByVzEwLCAyNywgMjMsCisJCTB4OGVhNywgMHg0YTMzLCAweDAyNDUsIC0xODI3MCkKKwlSXzE2XzMxKHJIMiwgckgzLCBySDAsIHJIMSwgclcxNSwgclcwNCwgMTgsIDEyLAorCQkweDhlZWUsICAtODYwOCwgMHhmMjU4LCAgLTUwOTUpCisJUl8xNl8zMShySDAsIHJIMSwgckgyLCBySDMsIHJXMDksIHJXMTQsIDI3LCAyMywKKwkJMHg5NjlkLCAtMTA2OTcsIDB4MWNiZSwgLTE1Mjg4KQorCVJfMTZfMzEockgyLCBySDMsIHJIMCwgckgxLCByVzAzLCByVzA4LCAxOCwgMTIsCisJCTB4MzMxNywgMHgzZTk5LCAweGRiZDksIDB4N2MxNSkKKwlSXzE2XzMxKHJIMCwgckgxLCBySDIsIHJIMywgclcxMywgclcwMiwgMjcsIDIzLAorCQkweGFjNGIsIDB4Nzc3MiwgMHhkOGNmLCAweDMzMWQpCisJUl8xNl8zMShySDIsIHJIMywgckgwLCBySDEsIHJXMDcsIHJXMTIsIDE4LCAxMiwKKwkJMHg2YTI4LCAweDZkZDgsIDB4MjE5YSwgMHgzYjY4KQorCisJUl8zMl80NyhySDAsIHJIMSwgckgyLCBySDMsIHJXMDUsIHJXMDgsIDI4LCAyMSwKKwkJMHgyOWNiLCAweDI4ZTUsIDB4NDIxOCwgIC03Nzg4KQorCVJfMzJfNDcockgyLCBySDMsIHJIMCwgckgxLCByVzExLCByVzE0LCAxNiwgIDksCisJCTB4NDczZiwgMHgwNmQxLCAweDNhYWUsIDB4MzAzNikKKwlSXzMyXzQ3KHJIMCwgckgxLCBySDIsIHJIMywgclcwMSwgclcwNCwgMjgsIDIxLAorCQkweGFlYTEsIC0xNTEzNCwgMHg2NDBiLCAtMTEyOTUpCisJUl8zMl80NyhySDIsIHJIMywgckgwLCBySDEsIHJXMDcsIHJXMTAsIDE2LCAgOSwKKwkJMHg4ZjRjLCAweDQ4ODcsIDB4YmM3YywgLTIyNDk5KQorCVJfMzJfNDcockgwLCBySDEsIHJIMiwgckgzLCByVzEzLCByVzAwLCAyOCwgMjEsCisJCTB4N2ViOCwgLTI3MTk5LCAweDAwZWEsIDB4NjA1MCkKKwlSXzMyXzQ3KHJIMiwgckgzLCBySDAsIHJIMSwgclcwMywgclcwNiwgMTYsICA5LAorCQkweGUwMWEsIDB4MjJmZSwgMHg0NDQ3LCAweDY5YzUpCisJUl8zMl80NyhySDAsIHJIMSwgckgyLCBySDMsIHJXMDksIHJXMTIsIDI4LCAyMSwKKwkJMHhiN2YzLCAweDAyNTMsIDB4NTliMSwgMHg0ZDViKQorCVJfMzJfNDcockgyLCBySDMsIHJIMCwgckgxLCByVzE1LCByVzAyLCAxNiwgIDksCisJCTB4NDcwMSwgLTI3MDE3LCAweGM3YmQsIC0xOTg1OSkKKworCVJfNDhfNjMockgwLCBySDEsIHJIMiwgckgzLCByVzAwLCByVzA3LCAyNiwgMjIsCisJCTB4MDk4OCwgIC0xNDYyLCAweDRjNzAsIC0xOTQwMSkKKwlSXzQ4XzYzKHJIMiwgckgzLCBySDAsIHJIMSwgclcxNCwgclcwNSwgMTcsIDExLAorCQkweGFkYWYsICAtNTIyMSwgMHhmYzk5LCAweDY2ZjcpCisJUl80OF82MyhySDAsIHJIMSwgckgyLCBySDMsIHJXMTIsIHJXMDMsIDI2LCAyMiwKKwkJMHg3ZTgwLCAtMTY0MTgsIDB4YmExZSwgLTI1NTg3KQorCVJfNDhfNjMockgyLCBySDMsIHJIMCwgckgxLCByVzEwLCByVzAxLCAxNywgMTEsCisJCTB4NDEzMCwgMHgzODBkLCAweGUwYzUsIDB4NzM4ZCkKKwlsd3oJCXJXMDAsMChySFApCisJUl80OF82MyhySDAsIHJIMSwgckgyLCBySDMsIHJXMDgsIHJXMTUsIDI2LCAyMiwKKwkJMHhlODM3LCAtMzA3NzAsIDB4ZGU4YSwgMHg2OWU4KQorCWx3egkJclcxNCw0KHJIUCkKKwlSXzQ4XzYzKHJIMiwgckgzLCBySDAsIHJIMSwgclcwNiwgclcxMywgMTcsIDExLAorCQkweDllNzksIDB4MjYwZiwgMHgyNTZkLCAtMjc5NDEpCisJbHd6CQlyVzEyLDgockhQKQorCVJfNDhfNjMockgwLCBySDEsIHJIMiwgckgzLCByVzA0LCByVzExLCAyNiwgMjIsCisJCTB4YWI3NSwgLTIwNzc1LCAweDRmOWUsIC0yODM5NykKKwlsd3oJCXJXMTAsMTIockhQKQorCVJfNDhfNjMockgyLCBySDMsIHJIMCwgckgxLCByVzAyLCByVzA5LCAxNywgMTEsCisJCTB4NjYyYiwgMHg3YzU2LCAweDExYjIsIDB4MDM1OCkKKworCWFkZAkJckgwLHJIMCxyVzAwCisJc3R3CQlySDAsMChySFApCisJYWRkCQlySDEsckgxLHJXMTQKKwlzdHcJCXJIMSw0KHJIUCkKKwlhZGQJCXJIMixySDIsclcxMgorCXN0dwkJckgyLDgockhQKQorCWFkZAkJckgzLHJIMyxyVzEwCisJc3R3CQlySDMsMTIockhQKQorCU5FWFRfQkxPQ0sKKworCWJkbnoJCXBwY19tZDVfbWFpbgorCisJRklOQUxJWkUKKwlibHIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcnlwdG8vbWQ1LWdsdWUuYyBiL2FyY2gvcG93ZXJwYy9jcnlwdG8vbWQ1LWdsdWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTJmYjRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NyeXB0by9tZDUtZ2x1ZS5jCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogR2x1ZSBjb2RlIGZvciBNRDUgaW1wbGVtZW50YXRpb24gZm9yIFBQQyBhc3NlbWJsZXIKKyAqCisgKiBCYXNlZCBvbiBnZW5lcmljIGltcGxlbWVudGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBNYXJrdXMgU3RvY2toYXVzZW4gPHN0b2NraGF1c2VuQGNvbGxvZ2lhLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxjcnlwdG8vaW50ZXJuYWwvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGNyeXB0by9tZDUuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKK2V4dGVybiB2b2lkIHBwY19tZDVfdHJhbnNmb3JtKHUzMiAqc3RhdGUsIGNvbnN0IHU4ICpzcmMsIHUzMiBibG9ja3MpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcHBjX21kNV9jbGVhcl9jb250ZXh0KHN0cnVjdCBtZDVfc3RhdGUgKnNjdHgpCit7CisJaW50IGNvdW50ID0gc2l6ZW9mKHN0cnVjdCBtZDVfc3RhdGUpID4+IDI7CisJdTMyICpwdHIgPSAodTMyICopc2N0eDsKKworCS8qIG1ha2Ugc3VyZSB3ZSBjYW4gY2xlYXIgdGhlIGZhc3Qgd2F5ICovCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgbWQ1X3N0YXRlKSAlIDQpOworCWRvIHsgKnB0cisrID0gMDsgfSB3aGlsZSAoLS1jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgcHBjX21kNV9pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQoreworCXN0cnVjdCBtZDVfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCXNjdHgtPmhhc2hbMF0gPSAweDY3NDUyMzAxOworCXNjdHgtPmhhc2hbMV0gPSAweGVmY2RhYjg5OworCXNjdHgtPmhhc2hbMl0gPSAweDk4YmFkY2ZlOworCXNjdHgtPmhhc2hbM10gPQkweDEwMzI1NDc2OworCXNjdHgtPmJ5dGVfY291bnQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHBjX21kNV91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJdW5zaWduZWQgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbWQ1X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisJY29uc3QgdW5zaWduZWQgaW50IG9mZnNldCA9IHNjdHgtPmJ5dGVfY291bnQgJiAweDNmOworCXVuc2lnbmVkIGludCBhdmFpbCA9IDY0IC0gb2Zmc2V0OworCWNvbnN0IHU4ICpzcmMgPSBkYXRhOworCisJc2N0eC0+Ynl0ZV9jb3VudCArPSBsZW47CisKKwlpZiAoYXZhaWwgPiBsZW4pIHsKKwkJbWVtY3B5KChjaGFyICopc2N0eC0+YmxvY2sgKyBvZmZzZXQsIHNyYywgbGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9mZnNldCkgeworCQltZW1jcHkoKGNoYXIgKilzY3R4LT5ibG9jayArIG9mZnNldCwgc3JjLCBhdmFpbCk7CisJCXBwY19tZDVfdHJhbnNmb3JtKHNjdHgtPmhhc2gsIChjb25zdCB1OCAqKXNjdHgtPmJsb2NrLCAxKTsKKwkJbGVuIC09IGF2YWlsOworCQlzcmMgKz0gYXZhaWw7CisJfQorCisJaWYgKGxlbiA+IDYzKSB7CisJCXBwY19tZDVfdHJhbnNmb3JtKHNjdHgtPmhhc2gsIHNyYywgbGVuID4+IDYpOworCQlzcmMgKz0gbGVuICYgfjB4M2Y7CisJCWxlbiAmPSAweDNmOworCX0KKworCW1lbWNweSgoY2hhciAqKXNjdHgtPmJsb2NrLCBzcmMsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHBjX21kNV9maW5hbChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKK3sKKwlzdHJ1Y3QgbWQ1X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisJY29uc3QgdW5zaWduZWQgaW50IG9mZnNldCA9IHNjdHgtPmJ5dGVfY291bnQgJiAweDNmOworCWNvbnN0IHU4ICpzcmMgPSAoY29uc3QgdTggKilzY3R4LT5ibG9jazsKKwl1OCAqcCA9ICh1OCAqKXNyYyArIG9mZnNldDsKKwlpbnQgcGFkbGVuID0gNTUgLSBvZmZzZXQ7CisJX19sZTY0ICpwYml0cyA9IChfX2xlNjQgKikoKGNoYXIgKilzY3R4LT5ibG9jayArIDU2KTsKKwlfX2xlMzIgKmRzdCA9IChfX2xlMzIgKilvdXQ7CisKKwkqcCsrID0gMHg4MDsKKworCWlmIChwYWRsZW4gPCAwKSB7CisJCW1lbXNldChwLCAweDAwLCBwYWRsZW4gKyBzaXplb2YgKHU2NCkpOworCQlwcGNfbWQ1X3RyYW5zZm9ybShzY3R4LT5oYXNoLCBzcmMsIDEpOworCQlwID0gKGNoYXIgKilzY3R4LT5ibG9jazsKKwkJcGFkbGVuID0gNTY7CisJfQorCisJbWVtc2V0KHAsIDAsIHBhZGxlbik7CisJKnBiaXRzID0gY3B1X3RvX2xlNjQoc2N0eC0+Ynl0ZV9jb3VudCA8PCAzKTsKKwlwcGNfbWQ1X3RyYW5zZm9ybShzY3R4LT5oYXNoLCBzcmMsIDEpOworCisJZHN0WzBdID0gY3B1X3RvX2xlMzIoc2N0eC0+aGFzaFswXSk7CisJZHN0WzFdID0gY3B1X3RvX2xlMzIoc2N0eC0+aGFzaFsxXSk7CisJZHN0WzJdID0gY3B1X3RvX2xlMzIoc2N0eC0+aGFzaFsyXSk7CisJZHN0WzNdID0gY3B1X3RvX2xlMzIoc2N0eC0+aGFzaFszXSk7CisKKwlwcGNfbWQ1X2NsZWFyX2NvbnRleHQoc2N0eCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHBjX21kNV9leHBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHZvaWQgKm91dCkKK3sKKwlzdHJ1Y3QgbWQ1X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKwltZW1jcHkob3V0LCBzY3R4LCBzaXplb2YoKnNjdHgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcGNfbWQ1X2ltcG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3Qgdm9pZCAqaW4pCit7CisJc3RydWN0IG1kNV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJbWVtY3B5KHNjdHgsIGluLCBzaXplb2YoKnNjdHgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgYWxnID0geworCS5kaWdlc3RzaXplCT0JTUQ1X0RJR0VTVF9TSVpFLAorCS5pbml0CQk9CXBwY19tZDVfaW5pdCwKKwkudXBkYXRlCQk9CXBwY19tZDVfdXBkYXRlLAorCS5maW5hbAkJPQlwcGNfbWQ1X2ZpbmFsLAorCS5leHBvcnQJCT0JcHBjX21kNV9leHBvcnQsCisJLmltcG9ydAkJPQlwcGNfbWQ1X2ltcG9ydCwKKwkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IG1kNV9zdGF0ZSksCisJLnN0YXRlc2l6ZQk9CXNpemVvZihzdHJ1Y3QgbWQ1X3N0YXRlKSwKKwkuYmFzZQkJPQl7CisJCS5jcmFfbmFtZQk9CSJtZDUiLAorCQkuY3JhX2RyaXZlcl9uYW1lPQkibWQ1LXBwYyIsCisJCS5jcmFfcHJpb3JpdHkJPQkyMDAsCisJCS5jcmFfZmxhZ3MJPQlDUllQVE9fQUxHX1RZUEVfU0hBU0gsCisJCS5jcmFfYmxvY2tzaXplCT0JTUQ1X0hNQUNfQkxPQ0tfU0laRSwKKwkJLmNyYV9tb2R1bGUJPQlUSElTX01PRFVMRSwKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcGNfbWQ1X21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGNyeXB0b19yZWdpc3Rlcl9zaGFzaCgmYWxnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwY19tZDVfbW9kX2Zpbmkodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9zaGFzaCgmYWxnKTsKK30KKworbW9kdWxlX2luaXQocHBjX21kNV9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChwcGNfbWQ1X21vZF9maW5pKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNRDUgU2VjdXJlIEhhc2ggQWxnb3JpdGhtLCBQUEMgYXNzZW1ibGVyIik7CisKK01PRFVMRV9BTElBU19DUllQVE8oIm1kNSIpOworTU9EVUxFX0FMSUFTX0NSWVBUTygibWQ1LXBwYyIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NyeXB0by9zaGExLXNwZS1hc20uUyBiL2FyY2gvcG93ZXJwYy9jcnlwdG8vc2hhMS1zcGUtYXNtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiNmNmMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcnlwdG8vc2hhMS1zcGUtYXNtLlMKQEAgLTAsMCArMSwyOTkgQEAKKy8qCisgKiBGYXN0IFNIQS0xIGltcGxlbWVudGF0aW9uIGZvciBTUEUgaW5zdHJ1Y3Rpb24gc2V0IChQUEMpCisgKgorICogVGhpcyBjb2RlIG1ha2VzIHVzZSBvZiB0aGUgU1BFIFNJTUQgaW5zdHJ1Y3Rpb24gc2V0IGFzIGRlZmluZWQgaW4KKyAqIGh0dHA6Ly9jYWNoZS5mcmVlc2NhbGUuY29tL2ZpbGVzLzMyYml0L2RvYy9yZWZfbWFudWFsL1NQRVBJTS5wZGYKKyAqIEltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIG9wdGltaXphdGlvbiBndWlkZSBub3RlcyBmcm9tCisgKiBodHRwOi8vY2FjaGUuZnJlZXNjYWxlLmNvbS9maWxlcy8zMmJpdC9kb2MvYXBwX25vdGUvQU4yNjY1LnBkZgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBNYXJrdXMgU3RvY2toYXVzZW4gPHN0b2NraGF1c2VuQGNvbGxvZ2lhLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgorI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgorCisjZGVmaW5lIHJIUAlyMwkvKiBwb2ludGVyIHRvIGhhc2ggdmFsdWUJCQkqLworI2RlZmluZSByV1AJcjQJLyogcG9pbnRlciB0byBpbnB1dAkJCQkqLworI2RlZmluZSByS1AJcjUJLyogcG9pbnRlciB0byBjb25zdGFudHMJCQkJKi8KKworI2RlZmluZSByVzAJcjE0CS8qIDY0IGJpdCByb3VuZCB3b3JkcwkJCQkqLworI2RlZmluZSByVzEJcjE1CisjZGVmaW5lIHJXMglyMTYKKyNkZWZpbmUgclczCXIxNworI2RlZmluZSByVzQJcjE4CisjZGVmaW5lIHJXNQlyMTkKKyNkZWZpbmUgclc2CXIyMAorI2RlZmluZSByVzcJcjIxCisKKyNkZWZpbmUgckgwCXI2CS8qIDMyIGJpdCBoYXNoIHZhbHVlcyAJCQkJKi8KKyNkZWZpbmUgckgxCXI3CisjZGVmaW5lIHJIMglyOAorI2RlZmluZSBySDMJcjkKKyNkZWZpbmUgckg0CXIxMAorCisjZGVmaW5lIHJUMAlyMjIJLyogNjQgYml0IHRlbXBvcmFyeQkJCQkqLworI2RlZmluZSByVDEJcjAJLyogMzIgYml0IHRlbXBvcmFyaWVzCQkJCSovCisjZGVmaW5lIHJUMglyMTEKKyNkZWZpbmUgclQzCXIxMgorCisjZGVmaW5lIHJLCXIyMwkvKiA2NCBiaXQgY29uc3RhbnQgaW4gdm9sYXRpbGUgcmVnaXN0ZXIJCSovCisKKyNkZWZpbmUgTE9BRF9LMDEKKworI2RlZmluZSBMT0FEX0sxMSBcCisJZXZsd3dzcGxhdAlySywwKHJLUCk7CisKKyNkZWZpbmUgTE9BRF9LMjEgXAorCWV2bHd3c3BsYXQJckssNChyS1ApOworCisjZGVmaW5lIExPQURfSzMxIFwKKwlldmx3d3NwbGF0CXJLLDgocktQKTsKKworI2RlZmluZSBMT0FEX0s0MSBcCisJZXZsd3dzcGxhdAlySywxMihyS1ApOworCisjZGVmaW5lIElOSVRJQUxJWkUgXAorCXN0d3UJCXIxLC0xMjgocjEpOwkvKiBjcmVhdGUgc3RhY2sgZnJhbWUJCSovIFwKKwlldnN0ZHcJCXIxNCw4KHIxKTsJLyogV2UgbXVzdCBzYXZlIG5vbiB2b2xhdGlsZQkqLyBcCisJZXZzdGR3CQlyMTUsMTYocjEpOwkvKiByZWdpc3RlcnMuIFRha2UgdGhlIGNoYW5jZQkqLyBcCisJZXZzdGR3CQlyMTYsMjQocjEpOwkvKiBhbmQgc2F2ZSB0aGUgU1BFIHBhcnQgdG9vCSovIFwKKwlldnN0ZHcJCXIxNywzMihyMSk7CQkJCQkgICBcCisJZXZzdGR3CQlyMTgsNDAocjEpOwkJCQkJICAgXAorCWV2c3RkdwkJcjE5LDQ4KHIxKTsJCQkJCSAgIFwKKwlldnN0ZHcJCXIyMCw1NihyMSk7CQkJCQkgICBcCisJZXZzdGR3CQlyMjEsNjQocjEpOwkJCQkJICAgXAorCWV2c3RkdwkJcjIyLDcyKHIxKTsJCQkJCSAgIFwKKwlldnN0ZHcJCXIyMyw4MChyMSk7CisKKworI2RlZmluZSBGSU5BTElaRSBcCisJZXZsZHcJCXIxNCw4KHIxKTsJLyogcmVzdG9yZSBTUEUgcmVnaXN0ZXJzCSovIFwKKwlldmxkdwkJcjE1LDE2KHIxKTsJCQkJCSAgIFwKKwlldmxkdwkJcjE2LDI0KHIxKTsJCQkJCSAgIFwKKwlldmxkdwkJcjE3LDMyKHIxKTsJCQkJCSAgIFwKKwlldmxkdwkJcjE4LDQwKHIxKTsJCQkJCSAgIFwKKwlldmxkdwkJcjE5LDQ4KHIxKTsJCQkJCSAgIFwKKwlldmxkdwkJcjIwLDU2KHIxKTsJCQkJCSAgIFwKKwlldmxkdwkJcjIxLDY0KHIxKTsJCQkJCSAgIFwKKwlldmxkdwkJcjIyLDcyKHIxKTsJCQkJCSAgIFwKKwlldmxkdwkJcjIzLDgwKHIxKTsJCQkJCSAgIFwKKwl4b3IJCXIwLHIwLHIwOwkJCQkJICAgXAorCXN0dwkJcjAsOChyMSk7CS8qIERlbGV0ZSBzZW5zaXRpdmUgZGF0YQkqLyBcCisJc3R3CQlyMCwxNihyMSk7CS8qIHRoYXQgd2UgbWlnaHQgaGF2ZSBwdXNoZWQJKi8gXAorCXN0dwkJcjAsMjQocjEpOwkvKiBmcm9tIG90aGVyIGNvbnRleHQgdGhhdCBydW5zCSovIFwKKwlzdHcJCXIwLDMyKHIxKTsJLyogdGhlIHNhbWUgY29kZS4gQXNzdW1lIHRoYXQJKi8gXAorCXN0dwkJcjAsNDAocjEpOwkvKiB0aGUgbG93ZXIgcGFydCBvZiB0aGUgR1BScwkqLyBcCisJc3R3CQlyMCw0OChyMSk7CS8qIHdlcmUgYWxyZWFkeSBvdmVyd3JpdHRlbiBvbgkqLyBcCisJc3R3CQlyMCw1NihyMSk7CS8qIHRoZSB3YXkgZG93biB0byBoZXJlCQkqLyBcCisJc3R3CQlyMCw2NChyMSk7CQkJCQkgICBcCisJc3R3CQlyMCw3MihyMSk7CQkJCQkgICBcCisJc3R3CQlyMCw4MChyMSk7CQkJCQkgICBcCisJYWRkaQkJcjEscjEsMTI4OwkvKiBjbGVhbnVwIHN0YWNrIGZyYW1lCQkqLworCisjaWZkZWYgX19CSUdfRU5ESUFOX18KKyNkZWZpbmUgTE9BRF9EQVRBKHJlZywgb2ZmKSBcCisJbHd6CQlyZWcsb2ZmKHJXUCk7CS8qIGxvYWQgZGF0YQkJCSovCisjZGVmaW5lIE5FWFRfQkxPQ0sgXAorCWFkZGkJCXJXUCxyV1AsNjQ7CS8qIGluY3JlbWVudCBwZXIgYmxvY2sJCSovCisjZWxzZQorI2RlZmluZSBMT0FEX0RBVEEocmVnLCBvZmYpIFwKKwlsd2JyeAkJcmVnLDAscldQOwkvKiBsb2FkIGRhdGEJCQkqLyBcCisJYWRkaQkJcldQLHJXUCw0OwkvKiBpbmNyZW1lbnQgcGVyIHdvcmQJCSovCisjZGVmaW5lIE5FWFRfQkxPQ0sJCQkvKiBub3RoaW5nIHRvIGRvCQkqLworI2VuZGlmCisKKyNkZWZpbmUJUl8wMF8xNShhLCBiLCBjLCBkLCBlLCB3MCwgdzEsIGssIG9mZikgXAorCUxPQURfREFUQSh3MCwgb2ZmKQkJLyogMTogVwkJCQkqLyBcCisJYW5kCQlyVDIsYixjOwkvKiAxOiBGJyA9IEIgYW5kIEMgCQkqLyBcCisJTE9BRF9LIyNrIyMxCQkJCQkJCSAgIFwKKwlhbmRjCQlyVDEsZCxiOwkvKiAxOiBGIiA9IH5CIGFuZCBEIAkJKi8gXAorCXJvdHJ3aQkJclQwLGEsMjc7CS8qIDE6IEEnID0gQSByb3RsIDUJCSovIFwKKwlvcgkJclQyLHJUMixyVDE7CS8qIDE6IEYgPSBGJyBvciBGIgkJKi8gXAorCWFkZAkJZSxlLHJUMDsJLyogMTogRSA9IEUgKyBBJwkJKi8gXAorCXJvdHJ3aQkJYixiLDI7CQkvKiAxOiBCID0gQiByb3RsIDMwCQkqLyBcCisJYWRkCQllLGUsdzA7CQkvKiAxOiBFID0gRSArIFcJCQkqLyBcCisJTE9BRF9EQVRBKHcxLCBvZmYrNCkJCS8qIDI6IFcJCQkJKi8gXAorCWFkZAkJZSxlLHJUMjsJLyogMTogRSA9IEUgKyBGCQkJKi8gXAorCWFuZAkJclQxLGEsYjsJLyogMjogRicgPSBCIGFuZCBDIAkJKi8gXAorCWFkZAkJZSxlLHJLOwkJLyogMTogRSA9IEUgKyBLCQkJKi8gXAorCWFuZGMJCXJUMixjLGE7CS8qIDI6IEYiID0gfkIgYW5kIEQgCQkqLyBcCisJYWRkCQlkLGQscks7CQkvKiAyOiBFID0gRSArIEsJCQkqLyBcCisJb3IJCXJUMixyVDIsclQxOwkvKiAyOiBGID0gRicgb3IgRiIJCSovIFwKKwlyb3Ryd2kJCXJUMCxlLDI3OwkvKiAyOiBBJyA9IEEgcm90bCA1CQkqLyBcCisJYWRkCQlkLGQsdzE7CQkvKiAyOiBFID0gRSArIFcJCQkqLyBcCisJcm90cndpCQlhLGEsMjsJCS8qIDI6IEIgPSBCIHJvdGwgMzAJCSovIFwKKwlhZGQJCWQsZCxyVDA7CS8qIDI6IEUgPSBFICsgQScJCSovIFwKKwlldm1lcmdlbG8JdzEsdzEsdzA7CS8qICAgIG1peCBXWzBdL1dbMV0JCSovIFwKKwlhZGQJCWQsZCxyVDIJCS8qIDI6IEUgPSBFICsgRgkJCSovCisKKyNkZWZpbmUgUl8xNl8xOShhLCBiLCBjLCBkLCBlLCB3MCwgdzEsIHc0LCB3NiwgdzcsIGspIFwKKwlhbmQJCXJUMixiLGM7CS8qIDE6IEYnID0gQiBhbmQgQyAJCSovIFwKKwlldm1lcmdlbG9oaQlyVDAsdzcsdzY7CS8qICAgIFdbLTNdCQkJKi8gXAorCWFuZGMJCXJUMSxkLGI7CS8qIDE6IEYiID0gfkIgYW5kIEQgCQkqLyBcCisJZXZ4b3IJCXcwLHcwLHJUMDsJLyogICAgVyA9IFdbLTE2XSB4b3IgV1stM10JKi8gXAorCW9yCQlyVDEsclQxLHJUMjsJLyogMTogRiA9IEYnIG9yIEYiCQkqLyBcCisJZXZ4b3IJCXcwLHcwLHc0OwkvKiAgICBXID0gVyB4b3IgV1stOF0JCSovIFwKKwlhZGQJCWUsZSxyVDE7CS8qIDE6IEUgPSBFICsgRgkJCSovIFwKKwlldnhvcgkJdzAsdzAsdzE7CS8qICAgIFcgPSBXIHhvciBXWy0xNF0JCSovIFwKKwlyb3Ryd2kJCXJUMixhLDI3OwkvKiAxOiBBJyA9IEEgcm90bCA1CQkqLyBcCisJZXZybHdpCQl3MCx3MCwxOwkvKiAgICBXID0gVyByb3RsIDEJCSovIFwKKwlhZGQJCWUsZSxyVDI7CS8qIDE6IEUgPSBFICsgQScJCSovIFwKKwlldmFkZHcJCXJUMCx3MCxySzsJLyogICAgV0sgPSBXICsgSwkJKi8gXAorCXJvdHJ3aQkJYixiLDI7CQkvKiAxOiBCID0gQiByb3RsIDMwCQkqLyBcCisJTE9BRF9LIyNrIyMxCQkJCQkJCSAgIFwKKwlldm1lcmdlaGkJclQxLHJUMSxyVDA7CS8qICAgIFdLMS9XSzIJCQkqLyBcCisJYWRkCQllLGUsclQwOwkvKiAxOiBFID0gRSArIFdLCQkqLyBcCisJYWRkCQlkLGQsclQxOwkvKiAyOiBFID0gRSArIFdLCQkqLyBcCisJYW5kCQlyVDIsYSxiOwkvKiAyOiBGJyA9IEIgYW5kIEMgCQkqLyBcCisJYW5kYwkJclQxLGMsYTsJLyogMjogRiIgPSB+QiBhbmQgRCAJCSovIFwKKwlyb3Ryd2kJCXJUMCxlLDI3OwkvKiAyOiBBJyA9IEEgcm90bCA1CQkqLyBcCisJb3IJCXJUMSxyVDEsclQyOwkvKiAyOiBGID0gRicgb3IgRiIJCSovIFwKKwlhZGQJCWQsZCxyVDA7CS8qIDI6IEUgPSBFICsgQScJCSovIFwKKwlyb3Ryd2kJCWEsYSwyOwkJLyogMjogQiA9IEIgcm90bCAzMAkJKi8gXAorCWFkZAkJZCxkLHJUMQkJLyogMjogRSA9IEUgKyBGCQkJKi8KKworI2RlZmluZSBSXzIwXzM5KGEsIGIsIGMsIGQsIGUsIHcwLCB3MSwgdzQsIHc2LCB3NywgaykgXAorCWV2bWVyZ2Vsb2hpCXJUMCx3Nyx3NjsJLyogICAgV1stM10JCQkqLyBcCisJeG9yCQlyVDIsYixjOwkvKiAxOiBGJyA9IEIgeG9yIEMJCSovIFwKKwlldnhvcgkJdzAsdzAsclQwOwkvKiAgICBXID0gV1stMTZdIHhvciBXWy0zXQkqLyBcCisJeG9yCQlyVDIsclQyLGQ7CS8qIDE6IEYgPSBGJyB4b3IgRAkJKi8gXAorCWV2eG9yCQl3MCx3MCx3NDsJLyogICAgVyA9IFcgeG9yIFdbLThdCQkqLyBcCisJYWRkCQllLGUsclQyOwkvKiAxOiBFID0gRSArIEYJCQkqLyBcCisJZXZ4b3IJCXcwLHcwLHcxOwkvKiAgICBXID0gVyB4b3IgV1stMTRdCQkqLyBcCisJcm90cndpCQlyVDIsYSwyNzsJLyogMTogQScgPSBBIHJvdGwgNQkJKi8gXAorCWV2cmx3aQkJdzAsdzAsMTsJLyogICAgVyA9IFcgcm90bCAxCQkqLyBcCisJYWRkCQllLGUsclQyOwkvKiAxOiBFID0gRSArIEEnCQkqLyBcCisJZXZhZGR3CQlyVDAsdzAscks7CS8qICAgIFdLID0gVyArIEsJCSovIFwKKwlyb3Ryd2kJCWIsYiwyOwkJLyogMTogQiA9IEIgcm90bCAzMAkJKi8gXAorCUxPQURfSyMjayMjMQkJCQkJCQkgICBcCisJZXZtZXJnZWhpCXJUMSxyVDEsclQwOwkvKiAgICBXSzEvV0syCQkJKi8gXAorCWFkZAkJZSxlLHJUMDsJLyogMTogRSA9IEUgKyBXSwkJKi8gXAorCXhvcgkJclQyLGEsYjsJLyogMjogRicgPSBCIHhvciBDCQkqLyBcCisJYWRkCQlkLGQsclQxOwkvKiAyOiBFID0gRSArIFdLCQkqLyBcCisJeG9yCQlyVDIsclQyLGM7CS8qIDI6IEYgPSBGJyB4b3IgRAkJKi8gXAorCXJvdHJ3aQkJclQwLGUsMjc7CS8qIDI6IEEnID0gQSByb3RsIDUJCSovIFwKKwlhZGQJCWQsZCxyVDI7CS8qIDI6IEUgPSBFICsgRgkJCSovIFwKKwlyb3Ryd2kJCWEsYSwyOwkJLyogMjogQiA9IEIgcm90bCAzMAkJKi8gXAorCWFkZAkJZCxkLHJUMAkJLyogMjogRSA9IEUgKyBBJwkJKi8KKworI2RlZmluZSBSXzQwXzU5KGEsIGIsIGMsIGQsIGUsIHcwLCB3MSwgdzQsIHc2LCB3NywgaykgXAorCWFuZAkJclQyLGIsYzsJLyogMTogRicgPSBCIGFuZCBDCQkqLyBcCisJZXZtZXJnZWxvaGkJclQwLHc3LHc2OwkvKiAgICBXWy0zXQkJCSovIFwKKwlvcgkJclQxLGIsYzsJLyogMTogRiIgPSBCIG9yIEMJCSovIFwKKwlldnhvcgkJdzAsdzAsclQwOwkvKiAgICBXID0gV1stMTZdIHhvciBXWy0zXQkqLyBcCisJYW5kCQlyVDEsZCxyVDE7CS8qIDE6IEYiID0gRiIgYW5kIEQJCSovIFwKKwlldnhvcgkJdzAsdzAsdzQ7CS8qICAgIFcgPSBXIHhvciBXWy04XQkJKi8gXAorCW9yCQlyVDIsclQyLHJUMTsJLyogMTogRiA9IEYnIG9yIEYiCQkqLyBcCisJZXZ4b3IJCXcwLHcwLHcxOwkvKiAgICBXID0gVyB4b3IgV1stMTRdCQkqLyBcCisJYWRkCQllLGUsclQyOwkvKiAxOiBFID0gRSArIEYJCQkqLyBcCisJZXZybHdpCQl3MCx3MCwxOwkvKiAgICBXID0gVyByb3RsIDEJCSovIFwKKwlyb3Ryd2kJCXJUMixhLDI3OwkvKiAxOiBBJyA9IEEgcm90bCA1CQkqLyBcCisJZXZhZGR3CQlyVDAsdzAscks7CS8qICAgIFdLID0gVyArIEsJCSovIFwKKwlhZGQJCWUsZSxyVDI7CS8qIDE6IEUgPSBFICsgQScJCSovIFwKKwlMT0FEX0sjI2sjIzEJCQkJCQkJICAgXAorCWV2bWVyZ2VoaQlyVDEsclQxLHJUMDsJLyogICAgV0sxL1dLMgkJCSovIFwKKwlyb3Ryd2kJCWIsYiwyOwkJLyogMTogQiA9IEIgcm90bCAzMAkJKi8gXAorCWFkZAkJZSxlLHJUMDsJLyogMTogRSA9IEUgKyBXSwkJKi8gXAorCWFuZAkJclQyLGEsYjsJLyogMjogRicgPSBCIGFuZCBDCQkqLyBcCisJb3IJCXJUMCxhLGI7CS8qIDI6IEYiID0gQiBvciBDCQkqLyBcCisJYWRkCQlkLGQsclQxOwkvKiAyOiBFID0gRSArIFdLCQkqLyBcCisJYW5kCQlyVDAsYyxyVDA7CS8qIDI6IEYiID0gRiIgYW5kIEQJCSovIFwKKwlyb3Ryd2kJCWEsYSwyOwkJLyogMjogQiA9IEIgcm90bCAzMAkJKi8gXAorCW9yCQlyVDIsclQyLHJUMDsJLyogMjogRiA9IEYnIG9yIEYiCQkqLyBcCisJcm90cndpCQlyVDAsZSwyNzsJLyogMjogQScgPSBBIHJvdGwgNQkJKi8gXAorCWFkZAkJZCxkLHJUMjsJLyogMjogRSA9IEUgKyBGCQkJKi8gXAorCWFkZAkJZCxkLHJUMAkJLyogMjogRSA9IEUgKyBBJwkJKi8KKworI2RlZmluZSBSXzYwXzc5KGEsIGIsIGMsIGQsIGUsIHcwLCB3MSwgdzQsIHc2LCB3NywgaykgXAorCVJfMjBfMzkoYSwgYiwgYywgZCwgZSwgdzAsIHcxLCB3NCwgdzYsIHc3LCBrKQorCitfR0xPQkFMKHBwY19zcGVfc2hhMV90cmFuc2Zvcm0pCisJSU5JVElBTElaRQorCisJbHd6CQlySDAsMChySFApCisJbHd6CQlySDEsNChySFApCisJbXRjdHIJCXI1CisJbHd6CQlySDIsOChySFApCisJbGlzCQlyS1AsUFBDX1NQRV9TSEExX0tAaAorCWx3egkJckgzLDEyKHJIUCkKKwlvcmkJCXJLUCxyS1AsUFBDX1NQRV9TSEExX0tAbAorCWx3egkJckg0LDE2KHJIUCkKKworcHBjX3NwZV9zaGExX21haW46CisJUl8wMF8xNShySDAsIHJIMSwgckgyLCBySDMsIHJINCwgclcxLCByVzAsIDEsIDApCisJUl8wMF8xNShySDMsIHJINCwgckgwLCBySDEsIHJIMiwgclcyLCByVzEsIDAsIDgpCisJUl8wMF8xNShySDEsIHJIMiwgckgzLCBySDQsIHJIMCwgclczLCByVzIsIDAsIDE2KQorCVJfMDBfMTUockg0LCBySDAsIHJIMSwgckgyLCBySDMsIHJXNCwgclczLCAwLCAyNCkKKwlSXzAwXzE1KHJIMiwgckgzLCBySDQsIHJIMCwgckgxLCByVzUsIHJXNCwgMCwgMzIpCisJUl8wMF8xNShySDAsIHJIMSwgckgyLCBySDMsIHJINCwgclc2LCByVzUsIDAsIDQwKQorCVJfMDBfMTUockgzLCBySDQsIHJIMCwgckgxLCBySDIsIHJUMywgclc2LCAwLCA0OCkKKwlSXzAwXzE1KHJIMSwgckgyLCBySDMsIHJINCwgckgwLCByVDMsIHJXNywgMCwgNTYpCisKKwlSXzE2XzE5KHJINCwgckgwLCBySDEsIHJIMiwgckgzLCByVzAsIHJXMSwgclc0LCByVzYsIHJXNywgMCkKKwlSXzE2XzE5KHJIMiwgckgzLCBySDQsIHJIMCwgckgxLCByVzEsIHJXMiwgclc1LCByVzcsIHJXMCwgMikKKworCVJfMjBfMzkockgwLCBySDEsIHJIMiwgckgzLCBySDQsIHJXMiwgclczLCByVzYsIHJXMCwgclcxLCAwKQorCVJfMjBfMzkockgzLCBySDQsIHJIMCwgckgxLCBySDIsIHJXMywgclc0LCByVzcsIHJXMSwgclcyLCAwKQorCVJfMjBfMzkockgxLCBySDIsIHJIMywgckg0LCBySDAsIHJXNCwgclc1LCByVzAsIHJXMiwgclczLCAwKQorCVJfMjBfMzkockg0LCBySDAsIHJIMSwgckgyLCBySDMsIHJXNSwgclc2LCByVzEsIHJXMywgclc0LCAwKQorCVJfMjBfMzkockgyLCBySDMsIHJINCwgckgwLCBySDEsIHJXNiwgclc3LCByVzIsIHJXNCwgclc1LCAwKQorCVJfMjBfMzkockgwLCBySDEsIHJIMiwgckgzLCBySDQsIHJXNywgclcwLCByVzMsIHJXNSwgclc2LCAwKQorCVJfMjBfMzkockgzLCBySDQsIHJIMCwgckgxLCBySDIsIHJXMCwgclcxLCByVzQsIHJXNiwgclc3LCAwKQorCVJfMjBfMzkockgxLCBySDIsIHJIMywgckg0LCBySDAsIHJXMSwgclcyLCByVzUsIHJXNywgclcwLCAwKQorCVJfMjBfMzkockg0LCBySDAsIHJIMSwgckgyLCBySDMsIHJXMiwgclczLCByVzYsIHJXMCwgclcxLCAwKQorCVJfMjBfMzkockgyLCBySDMsIHJINCwgckgwLCBySDEsIHJXMywgclc0LCByVzcsIHJXMSwgclcyLCAzKQorCisJUl80MF81OShySDAsIHJIMSwgckgyLCBySDMsIHJINCwgclc0LCByVzUsIHJXMCwgclcyLCByVzMsIDApCisJUl80MF81OShySDMsIHJINCwgckgwLCBySDEsIHJIMiwgclc1LCByVzYsIHJXMSwgclczLCByVzQsIDApCisJUl80MF81OShySDEsIHJIMiwgckgzLCBySDQsIHJIMCwgclc2LCByVzcsIHJXMiwgclc0LCByVzUsIDApCisJUl80MF81OShySDQsIHJIMCwgckgxLCBySDIsIHJIMywgclc3LCByVzAsIHJXMywgclc1LCByVzYsIDApCisJUl80MF81OShySDIsIHJIMywgckg0LCBySDAsIHJIMSwgclcwLCByVzEsIHJXNCwgclc2LCByVzcsIDApCisJUl80MF81OShySDAsIHJIMSwgckgyLCBySDMsIHJINCwgclcxLCByVzIsIHJXNSwgclc3LCByVzAsIDApCisJUl80MF81OShySDMsIHJINCwgckgwLCBySDEsIHJIMiwgclcyLCByVzMsIHJXNiwgclcwLCByVzEsIDApCisJUl80MF81OShySDEsIHJIMiwgckgzLCBySDQsIHJIMCwgclczLCByVzQsIHJXNywgclcxLCByVzIsIDApCisJUl80MF81OShySDQsIHJIMCwgckgxLCBySDIsIHJIMywgclc0LCByVzUsIHJXMCwgclcyLCByVzMsIDApCisJUl80MF81OShySDIsIHJIMywgckg0LCBySDAsIHJIMSwgclc1LCByVzYsIHJXMSwgclczLCByVzQsIDQpCisKKwlSXzYwXzc5KHJIMCwgckgxLCBySDIsIHJIMywgckg0LCByVzYsIHJXNywgclcyLCByVzQsIHJXNSwgMCkKKwlSXzYwXzc5KHJIMywgckg0LCBySDAsIHJIMSwgckgyLCByVzcsIHJXMCwgclczLCByVzUsIHJXNiwgMCkKKwlSXzYwXzc5KHJIMSwgckgyLCBySDMsIHJINCwgckgwLCByVzAsIHJXMSwgclc0LCByVzYsIHJXNywgMCkKKwlSXzYwXzc5KHJINCwgckgwLCBySDEsIHJIMiwgckgzLCByVzEsIHJXMiwgclc1LCByVzcsIHJXMCwgMCkKKwlSXzYwXzc5KHJIMiwgckgzLCBySDQsIHJIMCwgckgxLCByVzIsIHJXMywgclc2LCByVzAsIHJXMSwgMCkKKwlSXzYwXzc5KHJIMCwgckgxLCBySDIsIHJIMywgckg0LCByVzMsIHJXNCwgclc3LCByVzEsIHJXMiwgMCkKKwlSXzYwXzc5KHJIMywgckg0LCBySDAsIHJIMSwgckgyLCByVzQsIHJXNSwgclcwLCByVzIsIHJXMywgMCkKKwlsd3oJCXJUMywwKHJIUCkKKwlSXzYwXzc5KHJIMSwgckgyLCBySDMsIHJINCwgckgwLCByVzUsIHJXNiwgclcxLCByVzMsIHJXNCwgMCkKKwlsd3oJCXJXMSw0KHJIUCkKKwlSXzYwXzc5KHJINCwgckgwLCBySDEsIHJIMiwgckgzLCByVzYsIHJXNywgclcyLCByVzQsIHJXNSwgMCkKKwlsd3oJCXJXMiw4KHJIUCkKKwlSXzYwXzc5KHJIMiwgckgzLCBySDQsIHJIMCwgckgxLCByVzcsIHJXMCwgclczLCByVzUsIHJXNiwgMCkKKwlsd3oJCXJXMywxMihySFApCisJTkVYVF9CTE9DSworCWx3egkJclc0LDE2KHJIUCkKKworCWFkZAkJckgwLHJIMCxyVDMKKwlzdHcJCXJIMCwwKHJIUCkKKwlhZGQJCXJIMSxySDEsclcxCisJc3R3CQlySDEsNChySFApCisJYWRkCQlySDIsckgyLHJXMgorCXN0dwkJckgyLDgockhQKQorCWFkZAkJckgzLHJIMyxyVzMKKwlzdHcJCXJIMywxMihySFApCisJYWRkCQlySDQsckg0LHJXNAorCXN0dwkJckg0LDE2KHJIUCkKKworCWJkbnoJCXBwY19zcGVfc2hhMV9tYWluCisKKwlGSU5BTElaRQorCWJscgorCisuZGF0YQorLmFsaWduIDQKK1BQQ19TUEVfU0hBMV9LOgorCS5sb25nIDB4NUE4Mjc5OTksMHg2RUQ5RUJBMSwweDhGMUJCQ0RDLDB4Q0E2MkMxRDYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jcnlwdG8vc2hhMS1zcGUtZ2x1ZS5jIGIvYXJjaC9wb3dlcnBjL2NyeXB0by9zaGExLXNwZS1nbHVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxZDIyMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcnlwdG8vc2hhMS1zcGUtZ2x1ZS5jCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogR2x1ZSBjb2RlIGZvciBTSEEtMSBpbXBsZW1lbnRhdGlvbiBmb3IgU1BFIGluc3RydWN0aW9ucyAoUFBDKQorICoKKyAqIEJhc2VkIG9uIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IE1hcmt1cyBTdG9ja2hhdXNlbiA8c3RvY2toYXVzZW5AY29sbG9naWEuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorCisvKgorICogTUFYX0JZVEVTIGRlZmluZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHByb2Nlc3NlZAorICogYmV0d2VlbiBwcmVlbXB0X2Rpc2FibGUoKSBhbmQgcHJlZW1wdF9lbmFibGUoKS4gU0hBMSB0YWtlcyB+MTAwMAorICogb3BlcmF0aW9ucyBwZXIgNjQgYnl0ZXMuIGU1MDAgY29yZXMgY2FuIGlzc3VlIHR3byBhcml0aG1ldGljIGluc3RydWN0aW9ucworICogcGVyIGNsb2NrIGN5Y2xlIHVzaW5nIG9uZSAzMi82NCBiaXQgdW5pdCAoU1UxKSBhbmQgb25lIDMyIGJpdCB1bml0IChTVTIpLgorICogVGh1cyAyS0Igb2YgaW5wdXQgZGF0YSB3aWxsIG5lZWQgYW4gZXN0aW1hdGVkIG1heGltdW0gb2YgMTgsMDAwIGN5Y2xlcy4KKyAqIEhlYWRyb29tIGZvciBjYWNoZSBtaXNzZXMgaW5jbHVkZWQuIEV2ZW4gd2l0aCB0aGUgbG93IGVuZCBtb2RlbCBjbG9ja2VkCisgKiBhdCA2NjcgTUh6IHRoaXMgZXF1YWxzIHRvIGEgY3JpdGljYWwgdGltZSB3aW5kb3cgb2YgbGVzcyB0aGFuIDI3dXMuCisgKgorICovCisjZGVmaW5lIE1BWF9CWVRFUyAyMDQ4CisKK2V4dGVybiB2b2lkIHBwY19zcGVfc2hhMV90cmFuc2Zvcm0odTMyICpzdGF0ZSwgY29uc3QgdTggKnNyYywgdTMyIGJsb2Nrcyk7CisKK3N0YXRpYyB2b2lkIHNwZV9iZWdpbih2b2lkKQoreworCS8qIFdlIGp1c3Qgc3RhcnQgU1BFIG9wZXJhdGlvbnMgYW5kIHdpbGwgc2F2ZSBTUEUgcmVnaXN0ZXJzIGxhdGVyLiAqLworCXByZWVtcHRfZGlzYWJsZSgpOworCWVuYWJsZV9rZXJuZWxfc3BlKCk7Cit9CisKK3N0YXRpYyB2b2lkIHNwZV9lbmQodm9pZCkKK3sKKwkvKiByZWVuYWJsZSBwcmVlbXB0aW9uICovCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBwY19zaGExX2NsZWFyX2NvbnRleHQoc3RydWN0IHNoYTFfc3RhdGUgKnNjdHgpCit7CisJaW50IGNvdW50ID0gc2l6ZW9mKHN0cnVjdCBzaGExX3N0YXRlKSA+PiAyOworCXUzMiAqcHRyID0gKHUzMiAqKXNjdHg7CisKKwkvKiBtYWtlIHN1cmUgd2UgY2FuIGNsZWFyIHRoZSBmYXN0IHdheSAqLworCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHNoYTFfc3RhdGUpICUgNCk7CisJZG8geyAqcHRyKysgPSAwOyB9IHdoaWxlICgtLWNvdW50KTsKK30KKworc3RhdGljIGludCBwcGNfc3BlX3NoYTFfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJc2N0eC0+c3RhdGVbMF0gPSBTSEExX0gwOworCXNjdHgtPnN0YXRlWzFdID0gU0hBMV9IMTsKKwlzY3R4LT5zdGF0ZVsyXSA9IFNIQTFfSDI7CisJc2N0eC0+c3RhdGVbM10gPSBTSEExX0gzOworCXNjdHgtPnN0YXRlWzRdID0gU0hBMV9INDsKKwlzY3R4LT5jb3VudCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcGNfc3BlX3NoYTFfdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCXVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2N0eC0+Y291bnQgJiAweDNmOworCWNvbnN0IHVuc2lnbmVkIGludCBhdmFpbCA9IDY0IC0gb2Zmc2V0OworCXVuc2lnbmVkIGludCBieXRlczsKKwljb25zdCB1OCAqc3JjID0gZGF0YTsKKworCWlmIChhdmFpbCA+IGxlbikgeworCQlzY3R4LT5jb3VudCArPSBsZW47CisJCW1lbWNweSgoY2hhciAqKXNjdHgtPmJ1ZmZlciArIG9mZnNldCwgc3JjLCBsZW4pOworCQlyZXR1cm4gMDsKKwl9CisKKwlzY3R4LT5jb3VudCArPSBsZW47CisKKwlpZiAob2Zmc2V0KSB7CisJCW1lbWNweSgoY2hhciAqKXNjdHgtPmJ1ZmZlciArIG9mZnNldCwgc3JjLCBhdmFpbCk7CisKKwkJc3BlX2JlZ2luKCk7CisJCXBwY19zcGVfc2hhMV90cmFuc2Zvcm0oc2N0eC0+c3RhdGUsIChjb25zdCB1OCAqKXNjdHgtPmJ1ZmZlciwgMSk7CisJCXNwZV9lbmQoKTsKKworCQlsZW4gLT0gYXZhaWw7CisJCXNyYyArPSBhdmFpbDsKKwl9CisKKwl3aGlsZSAobGVuID4gNjMpIHsKKwkJYnl0ZXMgPSAobGVuID4gTUFYX0JZVEVTKSA/IE1BWF9CWVRFUyA6IGxlbjsKKwkJYnl0ZXMgPSBieXRlcyAmIH4weDNmOworCisJCXNwZV9iZWdpbigpOworCQlwcGNfc3BlX3NoYTFfdHJhbnNmb3JtKHNjdHgtPnN0YXRlLCBzcmMsIGJ5dGVzID4+IDYpOworCQlzcGVfZW5kKCk7CisKKwkJc3JjICs9IGJ5dGVzOworCQlsZW4gLT0gYnl0ZXM7CisJfTsKKworCW1lbWNweSgoY2hhciAqKXNjdHgtPmJ1ZmZlciwgc3JjLCBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBwY19zcGVfc2hhMV9maW5hbChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKK3sKKwlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCWNvbnN0IHVuc2lnbmVkIGludCBvZmZzZXQgPSBzY3R4LT5jb3VudCAmIDB4M2Y7CisJY2hhciAqcCA9IChjaGFyICopc2N0eC0+YnVmZmVyICsgb2Zmc2V0OworCWludCBwYWRsZW47CisJX19iZTY0ICpwYml0cyA9IChfX2JlNjQgKikoKChjaGFyICopJnNjdHgtPmJ1ZmZlcikgKyA1Nik7CisJX19iZTMyICpkc3QgPSAoX19iZTMyICopb3V0OworCisJcGFkbGVuID0gNTUgLSBvZmZzZXQ7CisJKnArKyA9IDB4ODA7CisKKwlzcGVfYmVnaW4oKTsKKworCWlmIChwYWRsZW4gPCAwKSB7CisJCW1lbXNldChwLCAweDAwLCBwYWRsZW4gKyBzaXplb2YgKHU2NCkpOworCQlwcGNfc3BlX3NoYTFfdHJhbnNmb3JtKHNjdHgtPnN0YXRlLCBzY3R4LT5idWZmZXIsIDEpOworCQlwID0gKGNoYXIgKilzY3R4LT5idWZmZXI7CisJCXBhZGxlbiA9IDU2OworCX0KKworCW1lbXNldChwLCAwLCBwYWRsZW4pOworCSpwYml0cyA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50IDw8IDMpOworCXBwY19zcGVfc2hhMV90cmFuc2Zvcm0oc2N0eC0+c3RhdGUsIHNjdHgtPmJ1ZmZlciwgMSk7CisKKwlzcGVfZW5kKCk7CisKKwlkc3RbMF0gPSBjcHVfdG9fYmUzMihzY3R4LT5zdGF0ZVswXSk7CisJZHN0WzFdID0gY3B1X3RvX2JlMzIoc2N0eC0+c3RhdGVbMV0pOworCWRzdFsyXSA9IGNwdV90b19iZTMyKHNjdHgtPnN0YXRlWzJdKTsKKwlkc3RbM10gPSBjcHVfdG9fYmUzMihzY3R4LT5zdGF0ZVszXSk7CisJZHN0WzRdID0gY3B1X3RvX2JlMzIoc2N0eC0+c3RhdGVbNF0pOworCisJcHBjX3NoYTFfY2xlYXJfY29udGV4dChzY3R4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcGNfc3BlX3NoYTFfZXhwb3J0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB2b2lkICpvdXQpCit7CisJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCW1lbWNweShvdXQsIHNjdHgsIHNpemVvZigqc2N0eCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBwY19zcGVfc2hhMV9pbXBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHZvaWQgKmluKQoreworCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKwltZW1jcHkoc2N0eCwgaW4sIHNpemVvZigqc2N0eCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNoYXNoX2FsZyBhbGcgPSB7CisJLmRpZ2VzdHNpemUJPQlTSEExX0RJR0VTVF9TSVpFLAorCS5pbml0CQk9CXBwY19zcGVfc2hhMV9pbml0LAorCS51cGRhdGUJCT0JcHBjX3NwZV9zaGExX3VwZGF0ZSwKKwkuZmluYWwJCT0JcHBjX3NwZV9zaGExX2ZpbmFsLAorCS5leHBvcnQJCT0JcHBjX3NwZV9zaGExX2V4cG9ydCwKKwkuaW1wb3J0CQk9CXBwY19zcGVfc2hhMV9pbXBvcnQsCisJLmRlc2NzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGExX3N0YXRlKSwKKwkuc3RhdGVzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGExX3N0YXRlKSwKKwkuYmFzZQkJPQl7CisJCS5jcmFfbmFtZQk9CSJzaGExIiwKKwkJLmNyYV9kcml2ZXJfbmFtZT0JInNoYTEtcHBjLXNwZSIsCisJCS5jcmFfcHJpb3JpdHkJPQkzMDAsCisJCS5jcmFfZmxhZ3MJPQlDUllQVE9fQUxHX1RZUEVfU0hBU0gsCisJCS5jcmFfYmxvY2tzaXplCT0JU0hBMV9CTE9DS19TSVpFLAorCQkuY3JhX21vZHVsZQk9CVRISVNfTU9EVUxFLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBwY19zcGVfc2hhMV9tb2RfaW5pdCh2b2lkKQoreworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfc2hhc2goJmFsZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwcGNfc3BlX3NoYTFfbW9kX2Zpbmkodm9pZCkKK3sKKwljcnlwdG9fdW5yZWdpc3Rlcl9zaGFzaCgmYWxnKTsKK30KKworbW9kdWxlX2luaXQocHBjX3NwZV9zaGExX21vZF9pbml0KTsKK21vZHVsZV9leGl0KHBwY19zcGVfc2hhMV9tb2RfZmluaSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0hBMSBTZWN1cmUgSGFzaCBBbGdvcml0aG0sIFNQRSBvcHRpbWl6ZWQiKTsKKworTU9EVUxFX0FMSUFTX0NSWVBUTygic2hhMSIpOworTU9EVUxFX0FMSUFTX0NSWVBUTygic2hhMS1wcGMtc3BlIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3J5cHRvL3NoYTI1Ni1zcGUtYXNtLlMgYi9hcmNoL3Bvd2VycGMvY3J5cHRvL3NoYTI1Ni1zcGUtYXNtLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQxMGU0YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jcnlwdG8vc2hhMjU2LXNwZS1hc20uUwpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIEZhc3QgU0hBLTI1NiBpbXBsZW1lbnRhdGlvbiBmb3IgU1BFIGluc3RydWN0aW9uIHNldCAoUFBDKQorICoKKyAqIFRoaXMgY29kZSBtYWtlcyB1c2Ugb2YgdGhlIFNQRSBTSU1EIGluc3RydWN0aW9uIHNldCBhcyBkZWZpbmVkIGluCisgKiBodHRwOi8vY2FjaGUuZnJlZXNjYWxlLmNvbS9maWxlcy8zMmJpdC9kb2MvcmVmX21hbnVhbC9TUEVQSU0ucGRmCisgKiBJbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBvcHRpbWl6YXRpb24gZ3VpZGUgbm90ZXMgZnJvbQorICogaHR0cDovL2NhY2hlLmZyZWVzY2FsZS5jb20vZmlsZXMvMzJiaXQvZG9jL2FwcF9ub3RlL0FOMjY2NS5wZGYKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgTWFya3VzIFN0b2NraGF1c2VuIDxzdG9ja2hhdXNlbkBjb2xsb2dpYS5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KKyNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKworI2RlZmluZSBySFAJcjMJLyogcG9pbnRlciB0byBoYXNoIHZhbHVlcyBpbiBtZW1vcnkJCSovCisjZGVmaW5lIHJLUAlyMjQJLyogcG9pbnRlciB0byByb3VuZCBjb25zdGFudHMJCQkqLworI2RlZmluZSByV1AJcjQJLyogcG9pbnRlciB0byBpbnB1dCBkYXRhCQkJKi8KKworI2RlZmluZSBySDAJcjUJLyogOCAzMiBiaXQgaGFzaCB2YWx1ZXMgaW4gOCByZWdpc3RlcnMJCSovCisjZGVmaW5lIHJIMQlyNgorI2RlZmluZSBySDIJcjcKKyNkZWZpbmUgckgzCXI4CisjZGVmaW5lIHJINAlyOQorI2RlZmluZSBySDUJcjEwCisjZGVmaW5lIHJINglyMTEKKyNkZWZpbmUgckg3CXIxMgorCisjZGVmaW5lIHJXMAlyMTQJLyogNjQgYml0IHJlZ2lzdGVycy4gMTYgd29yZHMgaW4gOCByZWdpc3RlcnMJKi8KKyNkZWZpbmUgclcxCXIxNQorI2RlZmluZSByVzIJcjE2CisjZGVmaW5lIHJXMwlyMTcKKyNkZWZpbmUgclc0CXIxOAorI2RlZmluZSByVzUJcjE5CisjZGVmaW5lIHJXNglyMjAKKyNkZWZpbmUgclc3CXIyMQorCisjZGVmaW5lIHJUMAlyMjIJLyogNjQgYml0IHRlbXBvcmFyaWVzIAkJCQkqLworI2RlZmluZSByVDEJcjIzCisjZGVmaW5lIHJUMglyMAkvKiAzMiBiaXQgdGVtcG9yYXJpZXMJCQkJKi8KKyNkZWZpbmUgclQzCXIyNQorCisjZGVmaW5lIENNUF9LTl9MT09QCisjZGVmaW5lIENNUF9LQ19MT09QIFwKKwljbXB3aQkJclQxLDA7CisKKyNkZWZpbmUgSU5JVElBTElaRSBcCisJc3R3dQkJcjEsLTEyOChyMSk7CS8qIGNyZWF0ZSBzdGFjayBmcmFtZQkJKi8gXAorCWV2c3RkdwkJcjE0LDgocjEpOwkvKiBXZSBtdXN0IHNhdmUgbm9uIHZvbGF0aWxlCSovIFwKKwlldnN0ZHcJCXIxNSwxNihyMSk7CS8qIHJlZ2lzdGVycy4gVGFrZSB0aGUgY2hhbmNlCSovIFwKKwlldnN0ZHcJCXIxNiwyNChyMSk7CS8qIGFuZCBzYXZlIHRoZSBTUEUgcGFydCB0b28JKi8gXAorCWV2c3RkdwkJcjE3LDMyKHIxKTsJCQkJCSAgIFwKKwlldnN0ZHcJCXIxOCw0MChyMSk7CQkJCQkgICBcCisJZXZzdGR3CQlyMTksNDgocjEpOwkJCQkJICAgXAorCWV2c3RkdwkJcjIwLDU2KHIxKTsJCQkJCSAgIFwKKwlldnN0ZHcJCXIyMSw2NChyMSk7CQkJCQkgICBcCisJZXZzdGR3CQlyMjIsNzIocjEpOwkJCQkJICAgXAorCWV2c3RkdwkJcjIzLDgwKHIxKTsJCQkJCSAgIFwKKwlzdHcJCXIyNCw4OChyMSk7CS8qIHNhdmUgbm9ybWFsIHJlZ2lzdGVycwkqLyBcCisJc3R3CQlyMjUsOTIocjEpOworCisKKyNkZWZpbmUgRklOQUxJWkUgXAorCWV2bGR3CQlyMTQsOChyMSk7CS8qIHJlc3RvcmUgU1BFIHJlZ2lzdGVycwkqLyBcCisJZXZsZHcJCXIxNSwxNihyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIxNiwyNChyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIxNywzMihyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIxOCw0MChyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIxOSw0OChyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIyMCw1NihyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIyMSw2NChyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIyMiw3MihyMSk7CQkJCQkgICBcCisJZXZsZHcJCXIyMyw4MChyMSk7CQkJCQkgICBcCisJbHd6CQlyMjQsODgocjEpOwkvKiByZXN0b3JlIG5vcm1hbCByZWdpc3RlcnMJKi8gXAorCWx3egkJcjI1LDkyKHIxKTsJCQkJCSAgIFwKKwl4b3IJCXIwLHIwLHIwOwkJCQkJICAgXAorCXN0dwkJcjAsOChyMSk7CS8qIERlbGV0ZSBzZW5zaXRpdmUgZGF0YQkqLyBcCisJc3R3CQlyMCwxNihyMSk7CS8qIHRoYXQgd2UgbWlnaHQgaGF2ZSBwdXNoZWQJKi8gXAorCXN0dwkJcjAsMjQocjEpOwkvKiBmcm9tIG90aGVyIGNvbnRleHQgdGhhdCBydW5zCSovIFwKKwlzdHcJCXIwLDMyKHIxKTsJLyogdGhlIHNhbWUgY29kZS4gQXNzdW1lIHRoYXQJKi8gXAorCXN0dwkJcjAsNDAocjEpOwkvKiB0aGUgbG93ZXIgcGFydCBvZiB0aGUgR1BScwkqLyBcCisJc3R3CQlyMCw0OChyMSk7CS8qIHdhcyBhbHJlYWR5IG92ZXJ3cml0dGVuIG9uCSovIFwKKwlzdHcJCXIwLDU2KHIxKTsJLyogdGhlIHdheSBkb3duIHRvIGhlcmUJCSovIFwKKwlzdHcJCXIwLDY0KHIxKTsJCQkJCSAgIFwKKwlzdHcJCXIwLDcyKHIxKTsJCQkJCSAgIFwKKwlzdHcJCXIwLDgwKHIxKTsJCQkJCSAgIFwKKwlhZGRpCQlyMSxyMSwxMjg7CS8qIGNsZWFudXAgc3RhY2sgZnJhbWUJCSovCisKKyNpZmRlZiBfX0JJR19FTkRJQU5fXworI2RlZmluZSBMT0FEX0RBVEEocmVnLCBvZmYpIFwKKwlsd3oJCXJlZyxvZmYocldQKTsJLyogbG9hZCBkYXRhCQkJKi8KKyNkZWZpbmUgTkVYVF9CTE9DSyBcCisJYWRkaQkJcldQLHJXUCw2NDsJLyogaW5jcmVtZW50IHBlciBibG9jawkJKi8KKyNlbHNlCisjZGVmaW5lIExPQURfREFUQShyZWcsIG9mZikgXAorCWx3YnJ4CQlyZWcsMCxyV1A7IAkvKiBsb2FkIGRhdGEJCQkqLyBcCisJYWRkaQkJcldQLHJXUCw0OwkvKiBpbmNyZW1lbnQgcGVyIHdvcmQJCSovCisjZGVmaW5lIE5FWFRfQkxPQ0sJCQkvKiBub3RoaW5nIHRvIGRvCQkqLworI2VuZGlmCisKKyNkZWZpbmUgUl9MT0FEX1coYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgdywgb2ZmKSBcCisJTE9BRF9EQVRBKHcsIG9mZikJCS8qIDE6IFcJCQkJKi8gXAorCXJvdHJ3aQkJclQwLGUsNjsJLyogMTogUzEgPSBlIHJvdHIgNgkJKi8gXAorCXJvdHJ3aQkJclQxLGUsMTE7CS8qIDE6IFMxJyA9IGUgcm90ciAxMQkJKi8gXAorCXJvdHJ3aQkJclQyLGUsMjU7CS8qIDE6IFMxIiA9IGUgcm90ciAyNQkJKi8gXAorCXhvcgkJclQwLHJUMCxyVDE7CS8qIDE6IFMxID0gUzEgeG9yIFMxJwkJKi8gXAorCWFuZAkJclQzLGUsZjsJLyogMTogY2ggPSBlIGFuZCBmCQkqLyBcCisJeG9yCQlyVDAsclQwLHJUMjsJLyogMTogUzEgPSBTMSB4b3IgUzEiCQkqLyBcCisJYW5kYwkJclQxLGcsZTsJLyogMTogY2gnID0gfmUgYW5kIGcJCSovIFwKKwlsd3oJCXJUMixvZmYocktQKTsJLyogMTogSwkJCQkqLyBcCisJeG9yCQlyVDMsclQzLHJUMTsJLyogMTogY2ggPSBjaCB4b3IgY2gnCQkqLyBcCisJYWRkCQloLGgsclQwOwkvKiAxOiB0ZW1wMSA9IGggKyBTMQkJKi8gXAorCWFkZAkJclQzLHJUMyx3OwkvKiAxOiB0ZW1wMScgPSBjaCArIHcJCSovIFwKKwlyb3Ryd2kJCXJUMCxhLDI7CS8qIDE6IFMwID0gYSByb3RyIDIJCSovIFwKKwlhZGQJCWgsaCxyVDM7CS8qIDE6IHRlbXAxID0gdGVtcDEgKyB0ZW1wMScJKi8gXAorCXJvdHJ3aQkJclQxLGEsMTM7CS8qIDE6IFMwJyA9IGEgcm90ciAxMwkJKi8gXAorCWFkZAkJaCxoLHJUMjsJLyogMTogdGVtcDEgPSB0ZW1wMSArIEsJCSovIFwKKwlyb3Ryd2kJCXJUMyxhLDIyOwkvKiAxOiBTMCIgPSBhIHJvdHIgMjIJCSovIFwKKwl4b3IJCXJUMCxyVDAsclQxOwkvKiAxOiBTMCA9IFMwIHhvciBTMCcJCSovIFwKKwlhZGQJCWQsZCxoOwkJLyogMTogZCA9IGQgKyB0ZW1wMQkJKi8gXAorCXhvcgkJclQzLHJUMCxyVDM7CS8qIDE6IFMwID0gUzAgeG9yIFMwIgkJKi8gXAorCWV2bWVyZ2Vsbwl3LHcsdzsJCS8qICAgIHNoaWZ0IFcJCQkqLyBcCisJb3IJCXJUMixhLGI7CS8qIDE6IG1haiA9IGEgb3IgYgkJKi8gXAorCWFuZAkJclQxLGEsYjsJLyogMTogbWFqJyA9IGEgYW5kIGIJCSovIFwKKwlhbmQJCXJUMixyVDIsYzsJLyogMTogbWFqID0gbWFqIGFuZCBjCQkqLyBcCisJTE9BRF9EQVRBKHcsIG9mZis0KQkJLyogMjogVwkJCQkqLyBcCisJb3IJCXJUMixyVDEsclQyOwkvKiAxOiBtYWogPSBtYWogb3IgbWFqJwkJKi8gXAorCXJvdHJ3aQkJclQwLGQsNjsJLyogMjogUzEgPSBlIHJvdHIgNgkJKi8gXAorCWFkZAkJclQzLHJUMyxyVDI7CS8qIDE6IHRlbXAyID0gUzAgKyBtYWoJCSovIFwKKwlyb3Ryd2kJCXJUMSxkLDExOwkvKiAyOiBTMScgPSBlIHJvdHIgMTEJCSovIFwKKwlhZGQJCWgsaCxyVDM7CS8qIDE6IGggPSB0ZW1wMSArIHRlbXAyCQkqLyBcCisJcm90cndpCQlyVDIsZCwyNTsJLyogMjogUzEiID0gZSByb3RyIDI1CQkqLyBcCisJeG9yCQlyVDAsclQwLHJUMTsJLyogMjogUzEgPSBTMSB4b3IgUzEnCQkqLyBcCisJYW5kCQlyVDMsZCxlOwkvKiAyOiBjaCA9IGUgYW5kIGYJCSovIFwKKwl4b3IJCXJUMCxyVDAsclQyOwkvKiAyOiBTMSA9IFMxIHhvciBTMSIJCSovIFwKKwlhbmRjCQlyVDEsZixkOwkvKiAyOiBjaCcgPSB+ZSBhbmQgZwkJKi8gXAorCWx3egkJclQyLG9mZis0KHJLUCk7CS8qIDI6IEsJCQkJKi8gXAorCXhvcgkJclQzLHJUMyxyVDE7CS8qIDI6IGNoID0gY2ggeG9yIGNoJwkJKi8gXAorCWFkZAkJZyxnLHJUMDsJLyogMjogdGVtcDEgPSBoICsgUzEJCSovIFwKKwlhZGQJCXJUMyxyVDMsdzsJLyogMjogdGVtcDEnID0gY2ggKyB3CQkqLyBcCisJcm90cndpCQlyVDAsaCwyOwkvKiAyOiBTMCA9IGEgcm90ciAyCQkqLyBcCisJYWRkCQlnLGcsclQzOwkvKiAyOiB0ZW1wMSA9IHRlbXAxICsgdGVtcDEnCSovIFwKKwlyb3Ryd2kJCXJUMSxoLDEzOwkvKiAyOiBTMCcgPSBhIHJvdHIgMTMJCSovIFwKKwlhZGQJCWcsZyxyVDI7CS8qIDI6IHRlbXAxID0gdGVtcDEgKyBLCQkqLyBcCisJcm90cndpCQlyVDMsaCwyMjsJLyogMjogUzAiID0gYSByb3RyIDIyCQkqLyBcCisJeG9yCQlyVDAsclQwLHJUMTsJLyogMjogUzAgPSBTMCB4b3IgUzAnCQkqLyBcCisJb3IJCXJUMixoLGE7CS8qIDI6IG1haiA9IGEgb3IgYgkJKi8gXAorCXhvcgkJclQzLHJUMCxyVDM7CS8qIDI6IFMwID0gUzAgeG9yIFMwIgkJKi8gXAorCWFuZAkJclQxLGgsYTsJLyogMjogbWFqJyA9IGEgYW5kIGIJCSovIFwKKwlhbmQJCXJUMixyVDIsYjsJLyogMjogbWFqID0gbWFqIGFuZCBjCQkqLyBcCisJYWRkCQljLGMsZzsJCS8qIDI6IGQgPSBkICsgdGVtcDEJCSovIFwKKwlvcgkJclQyLHJUMSxyVDI7CS8qIDI6IG1haiA9IG1haiBvciBtYWonCQkqLyBcCisJYWRkCQlyVDMsclQzLHJUMjsJLyogMjogdGVtcDIgPSBTMCArIG1hagkJKi8gXAorCWFkZAkJZyxnLHJUMwkJLyogMjogaCA9IHRlbXAxICsgdGVtcDIJCSovCisKKyNkZWZpbmUgUl9DQUxDX1coYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgdzAsIHcxLCB3NCwgdzUsIHc3LCBrLCBvZmYpIFwKKwlyb3Ryd2kJCXJUMixlLDY7CS8qIDE6IFMxID0gZSByb3RyIDYJCSovIFwKKwlldm1lcmdlbG9oaQlyVDAsdzAsdzE7CS8qICAgIHdbLTE1XQkJCSovIFwKKwlyb3Ryd2kJCXJUMyxlLDExOwkvKiAxOiBTMScgPSBlIHJvdHIgMTEJCSovIFwKKwlldnNyd2l1CQlyVDEsclQwLDM7CS8qICAgIHMwID0gd1stMTVdID4+IDMJCSovIFwKKwl4b3IJCXJUMixyVDIsclQzOwkvKiAxOiBTMSA9IFMxIHhvciBTMScJCSovIFwKKwlldnJsd2kJCXJUMCxyVDAsMjU7CS8qICAgIHMwJyA9IHdbLTE1XSByb3RyCTcJKi8gXAorCXJvdHJ3aQkJclQzLGUsMjU7CS8qIDE6IFMxJyA9IGUgcm90ciAyNQkJKi8gXAorCWV2eG9yCQlyVDEsclQxLHJUMDsJLyogICAgczAgPSBzMCB4b3IgczAnCQkqLyBcCisJeG9yCQlyVDIsclQyLHJUMzsJLyogMTogUzEgPSBTMSB4b3IgUzEnCQkqLyBcCisJZXZybHdpCQlyVDAsclQwLDIxOwkvKiAgICBzMCcgPSB3Wy0xNV0gcm90ciAxOAkqLyBcCisJYWRkCQloLGgsclQyOwkvKiAxOiB0ZW1wMSA9IGggKyBTMQkJKi8gXAorCWV2eG9yCQlyVDAsclQwLHJUMTsJLyogICAgczAgPSBzMCB4b3IgczAnCQkqLyBcCisJYW5kCQlyVDIsZSxmOwkvKiAxOiBjaCA9IGUgYW5kIGYJCSovIFwKKwlldmFkZHcJCXcwLHcwLHJUMDsJLyogICAgdyA9IHdbLTE2XSArIHMwCQkqLyBcCisJYW5kYwkJclQzLGcsZTsJLyogMTogY2gnID0gfmUgYW5kIGcJCSovIFwKKwlldnNyd2l1CQlyVDAsdzcsMTA7CS8qICAgIHMxID0gd1stMl0gPj4gMTAJCSovIFwKKwl4b3IJCXJUMixyVDIsclQzOwkvKiAxOiBjaCA9IGNoIHhvciBjaCcJCSovIFwKKwlldnJsd2kJCXJUMSx3NywxNTsJLyogICAgczEnID0gd1stMl0gcm90ciAxNwkqLyBcCisJYWRkCQloLGgsclQyOwkvKiAxOiB0ZW1wMSA9IHRlbXAxICsgY2gJKi8gXAorCWV2eG9yCQlyVDAsclQwLHJUMTsJLyogICAgczEgPSBzMSB4b3IgczEnCQkqLyBcCisJcm90cndpCQlyVDIsYSwyOwkvKiAxOiBTMCA9IGEgcm90ciAyCQkqLyBcCisJZXZybHdpCQlyVDEsdzcsMTM7CS8qICAgIHMxJyA9IHdbLTJdIHJvdHIgMTkJKi8gXAorCXJvdHJ3aQkJclQzLGEsMTM7CS8qIDE6IFMwJyA9IGEgcm90ciAxMwkJKi8gXAorCWV2eG9yCQlyVDAsclQwLHJUMTsJLyogICAgczEgPSBzMSB4b3IgczEnCQkqLyBcCisJeG9yCQlyVDIsclQyLHJUMzsJLyogMTogUzAgPSBTMCB4b3IgUzAnCQkqLyBcCisJZXZsZHcJCXJUMSxvZmYocktQKTsJLyogICAgawkJCQkqLyBcCisJcm90cndpCQlyVDMsYSwyMjsJLyogMTogUzAnID0gYSByb3RyIDIyCQkqLyBcCisJZXZhZGR3CQl3MCx3MCxyVDA7CS8qICAgIHcgPSB3ICsgczEJCSovIFwKKwl4b3IJCXJUMixyVDIsclQzOwkvKiAxOiBTMCA9IFMwIHhvciBTMCcJCSovIFwKKwlldm1lcmdlbG9oaQlyVDAsdzQsdzU7CS8qICAgIHdbLTddCQkJKi8gXAorCWFuZAkJclQzLGEsYjsJLyogMTogbWFqID0gYSBhbmQgYgkJKi8gXAorCWV2YWRkdwkJdzAsdzAsclQwOwkvKiAgICB3ID0gdyArIHdbLTddCQkqLyBcCisJQ01QX0sjI2sjI19MT09QCQkJCQkJCSAgIFwKKwlhZGQJCXJUMixyVDIsclQzOwkvKiAxOiB0ZW1wMiA9IFMwICsgbWFqCQkqLyBcCisJZXZhZGR3CQlyVDEsclQxLHcwOwkvKiAgICB3ayA9IHcgKyBrCQkqLyBcCisJeG9yCQlyVDMsYSxiOwkvKiAxOiBtYWogPSBhIHhvciBiCQkqLyBcCisJZXZtZXJnZWhpCXJUMCxyVDEsclQxOwkvKiAgICB3azEvd2syCQkJKi8gXAorCWFuZAkJclQzLHJUMyxjOwkvKiAxOiBtYWogPSBtYWogYW5kIGMJCSovIFwKKwlhZGQJCWgsaCxyVDA7CS8qIDE6IHRlbXAxID0gdGVtcDEgKyB3awkqLyBcCisJYWRkCQlyVDIsclQyLHJUMzsJLyogMTogdGVtcDIgPSB0ZW1wMiArIG1hagkqLyBcCisJYWRkCQlnLGcsclQxOwkvKiAyOiB0ZW1wMSA9IHRlbXAxICsgd2sJKi8gXAorCWFkZAkJZCxkLGg7CQkvKiAxOiBkID0gZCArIHRlbXAxCQkqLyBcCisJcm90cndpCQlyVDAsZCw2OwkvKiAyOiBTMSA9IGUgcm90ciA2CQkqLyBcCisJYWRkCQloLGgsclQyOwkvKiAxOiBoID0gdGVtcDEgKyB0ZW1wMgkJKi8gXAorCXJvdHJ3aQkJclQxLGQsMTE7CS8qIDI6IFMxJyA9IGUgcm90ciAxMQkJKi8gXAorCXJvdHJ3aQkJclQyLGQsMjU7CS8qIDI6IFMiID0gZSByb3RyIDI1CQkqLyBcCisJeG9yCQlyVDAsclQwLHJUMTsJLyogMjogUzEgPSBTMSB4b3IgUzEnCQkqLyBcCisJYW5kCQlyVDMsZCxlOwkvKiAyOiBjaCA9IGUgYW5kIGYJCSovIFwKKwl4b3IJCXJUMCxyVDAsclQyOwkvKiAyOiBTMSA9IFMxIHhvciBTMSIJCSovIFwKKwlhbmRjCQlyVDEsZixkOwkvKiAyOiBjaCcgPSB+ZSBhbmQgZwkJKi8gXAorCWFkZAkJZyxnLHJUMDsJLyogMjogdGVtcDEgPSBoICsgUzEJCSovIFwKKwl4b3IJCXJUMyxyVDMsclQxOwkvKiAyOiBjaCA9IGNoIHhvciBjaCcJCSovIFwKKwlyb3Ryd2kJCXJUMCxoLDI7CS8qIDI6IFMwID0gYSByb3RyIDIJCSovIFwKKwlhZGQJCWcsZyxyVDM7CS8qIDI6IHRlbXAxID0gdGVtcDEgKyBjaAkqLyBcCisJcm90cndpCQlyVDEsaCwxMzsJLyogMjogUzAnID0gYSByb3RyIDEzCQkqLyBcCisJcm90cndpCQlyVDMsaCwyMjsJLyogMjogUzAiID0gYSByb3RyIDIyCQkqLyBcCisJeG9yCQlyVDAsclQwLHJUMTsJLyogMjogUzAgPSBTMCB4b3IgUzAnCQkqLyBcCisJb3IJCXJUMixoLGE7CS8qIDI6IG1haiA9IGEgb3IgYgkJKi8gXAorCWFuZAkJclQxLGgsYTsJLyogMjogbWFqJyA9IGEgYW5kIGIJCSovIFwKKwlhbmQJCXJUMixyVDIsYjsJLyogMjogbWFqID0gbWFqIGFuZCBjCQkqLyBcCisJeG9yCQlyVDMsclQwLHJUMzsJLyogMjogUzAgPSBTMCB4b3IgUzAiCQkqLyBcCisJb3IJCXJUMixyVDEsclQyOwkvKiAyOiBtYWogPSBtYWogb3IgbWFqJwkJKi8gXAorCWFkZAkJYyxjLGc7CQkvKiAyOiBkID0gZCArIHRlbXAxCQkqLyBcCisJYWRkCQlyVDMsclQzLHJUMjsJLyogMjogdGVtcDIgPSBTMCArIG1hagkJKi8gXAorCWFkZAkJZyxnLHJUMwkJLyogMjogaCA9IHRlbXAxICsgdGVtcDIJCSovCisKK19HTE9CQUwocHBjX3NwZV9zaGEyNTZfdHJhbnNmb3JtKQorCUlOSVRJQUxJWkUKKworCW10Y3RyCQlyNQorCWx3egkJckgwLDAockhQKQorCWx3egkJckgxLDQockhQKQorCWx3egkJckgyLDgockhQKQorCWx3egkJckgzLDEyKHJIUCkKKwlsd3oJCXJINCwxNihySFApCisJbHd6CQlySDUsMjAockhQKQorCWx3egkJckg2LDI0KHJIUCkKKwlsd3oJCXJINywyOChySFApCisKK3BwY19zcGVfc2hhMjU2X21haW46CisJbGlzCQlyS1AsUFBDX1NQRV9TSEEyNTZfS0BoYQorCWFkZGkJCXJLUCxyS1AsUFBDX1NQRV9TSEEyNTZfS0BsCisKKwlSX0xPQURfVyhySDAsIHJIMSwgckgyLCBySDMsIHJINCwgckg1LCBySDYsIHJINywgclcwLCAwKQorCVJfTE9BRF9XKHJINiwgckg3LCBySDAsIHJIMSwgckgyLCBySDMsIHJINCwgckg1LCByVzEsIDgpCisJUl9MT0FEX1cockg0LCBySDUsIHJINiwgckg3LCBySDAsIHJIMSwgckgyLCBySDMsIHJXMiwgMTYpCisJUl9MT0FEX1cockgyLCBySDMsIHJINCwgckg1LCBySDYsIHJINywgckgwLCBySDEsIHJXMywgMjQpCisJUl9MT0FEX1cockgwLCBySDEsIHJIMiwgckgzLCBySDQsIHJINSwgckg2LCBySDcsIHJXNCwgMzIpCisJUl9MT0FEX1cockg2LCBySDcsIHJIMCwgckgxLCBySDIsIHJIMywgckg0LCBySDUsIHJXNSwgNDApCisJUl9MT0FEX1cockg0LCBySDUsIHJINiwgckg3LCBySDAsIHJIMSwgckgyLCBySDMsIHJXNiwgNDgpCisJUl9MT0FEX1cockgyLCBySDMsIHJINCwgckg1LCBySDYsIHJINywgckgwLCBySDEsIHJXNywgNTYpCitwcGNfc3BlX3NoYTI1Nl8xNl9yb3VuZHM6CisJYWRkaQkJcktQLHJLUCw2NAorCVJfQ0FMQ19XKHJIMCwgckgxLCBySDIsIHJIMywgckg0LCBySDUsIHJINiwgckg3LAorCQkgclcwLCByVzEsIHJXNCwgclc1LCByVzcsIE4sIDApCisJUl9DQUxDX1cockg2LCBySDcsIHJIMCwgckgxLCBySDIsIHJIMywgckg0LCBySDUsCisJCSByVzEsIHJXMiwgclc1LCByVzYsIHJXMCwgTiwgOCkKKwlSX0NBTENfVyhySDQsIHJINSwgckg2LCBySDcsIHJIMCwgckgxLCBySDIsIHJIMywKKwkJIHJXMiwgclczLCByVzYsIHJXNywgclcxLCBOLCAxNikKKwlSX0NBTENfVyhySDIsIHJIMywgckg0LCBySDUsIHJINiwgckg3LCBySDAsIHJIMSwKKwkJIHJXMywgclc0LCByVzcsIHJXMCwgclcyLCBOLCAyNCkKKwlSX0NBTENfVyhySDAsIHJIMSwgckgyLCBySDMsIHJINCwgckg1LCBySDYsIHJINywKKwkJIHJXNCwgclc1LCByVzAsIHJXMSwgclczLCBOLCAzMikKKwlSX0NBTENfVyhySDYsIHJINywgckgwLCBySDEsIHJIMiwgckgzLCBySDQsIHJINSwKKwkJIHJXNSwgclc2LCByVzEsIHJXMiwgclc0LCBOLCA0MCkKKwlSX0NBTENfVyhySDQsIHJINSwgckg2LCBySDcsIHJIMCwgckgxLCBySDIsIHJIMywKKwkJIHJXNiwgclc3LCByVzIsIHJXMywgclc1LCBOLCA0OCkKKwlSX0NBTENfVyhySDIsIHJIMywgckg0LCBySDUsIHJINiwgckg3LCBySDAsIHJIMSwKKwkJIHJXNywgclcwLCByVzMsIHJXNCwgclc2LCBDLCA1NikKKwlidAkJZ3QscHBjX3NwZV9zaGEyNTZfMTZfcm91bmRzCisKKwlsd3oJCXJXMCwwKHJIUCkKKwlORVhUX0JMT0NLCisJbHd6CQlyVzEsNChySFApCisJbHd6CQlyVzIsOChySFApCisJbHd6CQlyVzMsMTIockhQKQorCWx3egkJclc0LDE2KHJIUCkKKwlsd3oJCXJXNSwyMChySFApCisJbHd6CQlyVzYsMjQockhQKQorCWx3egkJclc3LDI4KHJIUCkKKworCWFkZAkJckgwLHJIMCxyVzAKKwlzdHcJCXJIMCwwKHJIUCkKKwlhZGQJCXJIMSxySDEsclcxCisJc3R3CQlySDEsNChySFApCisJYWRkCQlySDIsckgyLHJXMgorCXN0dwkJckgyLDgockhQKQorCWFkZAkJckgzLHJIMyxyVzMKKwlzdHcJCXJIMywxMihySFApCisJYWRkCQlySDQsckg0LHJXNAorCXN0dwkJckg0LDE2KHJIUCkKKwlhZGQJCXJINSxySDUsclc1CisJc3R3CQlySDUsMjAockhQKQorCWFkZAkJckg2LHJINixyVzYKKwlzdHcJCXJINiwyNChySFApCisJYWRkCQlySDcsckg3LHJXNworCXN0dwkJckg3LDI4KHJIUCkKKworCWJkbnoJCXBwY19zcGVfc2hhMjU2X21haW4KKworCUZJTkFMSVpFCisJYmxyCisKKy5kYXRhCisuYWxpZ24gNQorUFBDX1NQRV9TSEEyNTZfSzoKKwkubG9uZyAweDQyOGEyZjk4LDB4NzEzNzQ0OTEsMHhiNWMwZmJjZiwweGU5YjVkYmE1CisJLmxvbmcgMHgzOTU2YzI1YiwweDU5ZjExMWYxLDB4OTIzZjgyYTQsMHhhYjFjNWVkNQorCS5sb25nIDB4ZDgwN2FhOTgsMHgxMjgzNWIwMSwweDI0MzE4NWJlLDB4NTUwYzdkYzMKKwkubG9uZyAweDcyYmU1ZDc0LDB4ODBkZWIxZmUsMHg5YmRjMDZhNywweGMxOWJmMTc0CisJLmxvbmcgMHhlNDliNjljMSwweGVmYmU0Nzg2LDB4MGZjMTlkYzYsMHgyNDBjYTFjYworCS5sb25nIDB4MmRlOTJjNmYsMHg0YTc0ODRhYSwweDVjYjBhOWRjLDB4NzZmOTg4ZGEKKwkubG9uZyAweDk4M2U1MTUyLDB4YTgzMWM2NmQsMHhiMDAzMjdjOCwweGJmNTk3ZmM3CisJLmxvbmcgMHhjNmUwMGJmMywweGQ1YTc5MTQ3LDB4MDZjYTYzNTEsMHgxNDI5Mjk2NworCS5sb25nIDB4MjdiNzBhODUsMHgyZTFiMjEzOCwweDRkMmM2ZGZjLDB4NTMzODBkMTMKKwkubG9uZyAweDY1MGE3MzU0LDB4NzY2YTBhYmIsMHg4MWMyYzkyZSwweDkyNzIyYzg1CisJLmxvbmcgMHhhMmJmZThhMSwweGE4MWE2NjRiLDB4YzI0YjhiNzAsMHhjNzZjNTFhMworCS5sb25nIDB4ZDE5MmU4MTksMHhkNjk5MDYyNCwweGY0MGUzNTg1LDB4MTA2YWEwNzAKKwkubG9uZyAweDE5YTRjMTE2LDB4MWUzNzZjMDgsMHgyNzQ4Nzc0YywweDM0YjBiY2I1CisJLmxvbmcgMHgzOTFjMGNiMywweDRlZDhhYTRhLDB4NWI5Y2NhNGYsMHg2ODJlNmZmMworCS5sb25nIDB4NzQ4ZjgyZWUsMHg3OGE1NjM2ZiwweDg0Yzg3ODE0LDB4OGNjNzAyMDgKKwkubG9uZyAweDkwYmVmZmZhLDB4YTQ1MDZjZWIsMHhiZWY5YTNmNywweGM2NzE3OGYyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY3J5cHRvL3NoYTI1Ni1zcGUtZ2x1ZS5jIGIvYXJjaC9wb3dlcnBjL2NyeXB0by9zaGEyNTYtc3BlLWdsdWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGE2MTZmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2NyeXB0by9zaGEyNTYtc3BlLWdsdWUuYwpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIEdsdWUgY29kZSBmb3IgU0hBLTI1NiBpbXBsZW1lbnRhdGlvbiBmb3IgU1BFIGluc3RydWN0aW9ucyAoUFBDKQorICoKKyAqIEJhc2VkIG9uIGdlbmVyaWMgaW1wbGVtZW50YXRpb24uIFRoZSBhc3NlbWJsZXIgbW9kdWxlIHRha2VzIGNhcmUgCisgKiBhYm91dCB0aGUgU1BFIHJlZ2lzdGVycyBzbyBpdCBjYW4gcnVuIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IE1hcmt1cyBTdG9ja2hhdXNlbiA8c3RvY2toYXVzZW5AY29sbG9naWEuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgorI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorCisvKgorICogTUFYX0JZVEVTIGRlZmluZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHByb2Nlc3NlZAorICogYmV0d2VlbiBwcmVlbXB0X2Rpc2FibGUoKSBhbmQgcHJlZW1wdF9lbmFibGUoKS4gU0hBMjU2IHRha2VzIH4yLDAwMAorICogb3BlcmF0aW9ucyBwZXIgNjQgYnl0ZXMuIGU1MDAgY29yZXMgY2FuIGlzc3VlIHR3byBhcml0aG1ldGljIGluc3RydWN0aW9ucworICogcGVyIGNsb2NrIGN5Y2xlIHVzaW5nIG9uZSAzMi82NCBiaXQgdW5pdCAoU1UxKSBhbmQgb25lIDMyIGJpdCB1bml0IChTVTIpLgorICogVGh1cyAxS0Igb2YgaW5wdXQgZGF0YSB3aWxsIG5lZWQgYW4gZXN0aW1hdGVkIG1heGltdW0gb2YgMTgsMDAwIGN5Y2xlcy4KKyAqIEhlYWRyb29tIGZvciBjYWNoZSBtaXNzZXMgaW5jbHVkZWQuIEV2ZW4gd2l0aCB0aGUgbG93IGVuZCBtb2RlbCBjbG9ja2VkCisgKiBhdCA2NjcgTUh6IHRoaXMgZXF1YWxzIHRvIGEgY3JpdGljYWwgdGltZSB3aW5kb3cgb2YgbGVzcyB0aGFuIDI3dXMuCisgKgorICovCisjZGVmaW5lIE1BWF9CWVRFUyAxMDI0CisKK2V4dGVybiB2b2lkIHBwY19zcGVfc2hhMjU2X3RyYW5zZm9ybSh1MzIgKnN0YXRlLCBjb25zdCB1OCAqc3JjLCB1MzIgYmxvY2tzKTsKKworc3RhdGljIHZvaWQgc3BlX2JlZ2luKHZvaWQpCit7CisJLyogV2UganVzdCBzdGFydCBTUEUgb3BlcmF0aW9ucyBhbmQgd2lsbCBzYXZlIFNQRSByZWdpc3RlcnMgbGF0ZXIuICovCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJZW5hYmxlX2tlcm5lbF9zcGUoKTsKK30KKworc3RhdGljIHZvaWQgc3BlX2VuZCh2b2lkKQoreworCS8qIHJlZW5hYmxlIHByZWVtcHRpb24gKi8KKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHBjX3NoYTI1Nl9jbGVhcl9jb250ZXh0KHN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHgpCit7CisJaW50IGNvdW50ID0gc2l6ZW9mKHN0cnVjdCBzaGEyNTZfc3RhdGUpID4+IDI7CisJdTMyICpwdHIgPSAodTMyICopc2N0eDsKKworCS8qIG1ha2Ugc3VyZSB3ZSBjYW4gY2xlYXIgdGhlIGZhc3Qgd2F5ICovCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3Qgc2hhMjU2X3N0YXRlKSAlIDQpOworCWRvIHsgKnB0cisrID0gMDsgfSB3aGlsZSAoLS1jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgcHBjX3NwZV9zaGEyNTZfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKwlzY3R4LT5zdGF0ZVswXSA9IFNIQTI1Nl9IMDsKKwlzY3R4LT5zdGF0ZVsxXSA9IFNIQTI1Nl9IMTsKKwlzY3R4LT5zdGF0ZVsyXSA9IFNIQTI1Nl9IMjsKKwlzY3R4LT5zdGF0ZVszXSA9IFNIQTI1Nl9IMzsKKwlzY3R4LT5zdGF0ZVs0XSA9IFNIQTI1Nl9INDsKKwlzY3R4LT5zdGF0ZVs1XSA9IFNIQTI1Nl9INTsKKwlzY3R4LT5zdGF0ZVs2XSA9IFNIQTI1Nl9INjsKKwlzY3R4LT5zdGF0ZVs3XSA9IFNIQTI1Nl9INzsKKwlzY3R4LT5jb3VudCA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcGNfc3BlX3NoYTIyNF9pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQoreworCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCXNjdHgtPnN0YXRlWzBdID0gU0hBMjI0X0gwOworCXNjdHgtPnN0YXRlWzFdID0gU0hBMjI0X0gxOworCXNjdHgtPnN0YXRlWzJdID0gU0hBMjI0X0gyOworCXNjdHgtPnN0YXRlWzNdID0gU0hBMjI0X0gzOworCXNjdHgtPnN0YXRlWzRdID0gU0hBMjI0X0g0OworCXNjdHgtPnN0YXRlWzVdID0gU0hBMjI0X0g1OworCXNjdHgtPnN0YXRlWzZdID0gU0hBMjI0X0g2OworCXNjdHgtPnN0YXRlWzddID0gU0hBMjI0X0g3OworCXNjdHgtPmNvdW50ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBwY19zcGVfc2hhMjU2X3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCisJCQl1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2N0eC0+Y291bnQgJiAweDNmOworCWNvbnN0IHVuc2lnbmVkIGludCBhdmFpbCA9IDY0IC0gb2Zmc2V0OworCXVuc2lnbmVkIGludCBieXRlczsKKwljb25zdCB1OCAqc3JjID0gZGF0YTsKKworCWlmIChhdmFpbCA+IGxlbikgeworCQlzY3R4LT5jb3VudCArPSBsZW47CisJCW1lbWNweSgoY2hhciAqKXNjdHgtPmJ1ZiArIG9mZnNldCwgc3JjLCBsZW4pOworCQlyZXR1cm4gMDsKKwl9CisKKwlzY3R4LT5jb3VudCArPSBsZW47CisKKwlpZiAob2Zmc2V0KSB7CisJCW1lbWNweSgoY2hhciAqKXNjdHgtPmJ1ZiArIG9mZnNldCwgc3JjLCBhdmFpbCk7CisKKwkJc3BlX2JlZ2luKCk7CisJCXBwY19zcGVfc2hhMjU2X3RyYW5zZm9ybShzY3R4LT5zdGF0ZSwgKGNvbnN0IHU4ICopc2N0eC0+YnVmLCAxKTsKKwkJc3BlX2VuZCgpOworCisJCWxlbiAtPSBhdmFpbDsKKwkJc3JjICs9IGF2YWlsOworCX0KKworCXdoaWxlIChsZW4gPiA2MykgeworCQkvKiBjdXQgaW5wdXQgZGF0YSBpbnRvIHNtYWxsZXIgYmxvY2tzICovCisJCWJ5dGVzID0gKGxlbiA+IE1BWF9CWVRFUykgPyBNQVhfQllURVMgOiBsZW47CisJCWJ5dGVzID0gYnl0ZXMgJiB+MHgzZjsKKworCQlzcGVfYmVnaW4oKTsKKwkJcHBjX3NwZV9zaGEyNTZfdHJhbnNmb3JtKHNjdHgtPnN0YXRlLCBzcmMsIGJ5dGVzID4+IDYpOworCQlzcGVfZW5kKCk7CisKKwkJc3JjICs9IGJ5dGVzOworCQlsZW4gLT0gYnl0ZXM7CisJfTsKKworCW1lbWNweSgoY2hhciAqKXNjdHgtPmJ1Ziwgc3JjLCBsZW4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBwY19zcGVfc2hhMjU2X2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KQoreworCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2N0eC0+Y291bnQgJiAweDNmOworCWNoYXIgKnAgPSAoY2hhciAqKXNjdHgtPmJ1ZiArIG9mZnNldDsKKwlpbnQgcGFkbGVuOworCV9fYmU2NCAqcGJpdHMgPSAoX19iZTY0ICopKCgoY2hhciAqKSZzY3R4LT5idWYpICsgNTYpOworCV9fYmUzMiAqZHN0ID0gKF9fYmUzMiAqKW91dDsKKworCXBhZGxlbiA9IDU1IC0gb2Zmc2V0OworCSpwKysgPSAweDgwOworCisJc3BlX2JlZ2luKCk7CisKKwlpZiAocGFkbGVuIDwgMCkgeworCQltZW1zZXQocCwgMHgwMCwgcGFkbGVuICsgc2l6ZW9mICh1NjQpKTsKKwkJcHBjX3NwZV9zaGEyNTZfdHJhbnNmb3JtKHNjdHgtPnN0YXRlLCBzY3R4LT5idWYsIDEpOworCQlwID0gKGNoYXIgKilzY3R4LT5idWY7CisJCXBhZGxlbiA9IDU2OworCX0KKworCW1lbXNldChwLCAwLCBwYWRsZW4pOworCSpwYml0cyA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50IDw8IDMpOworCXBwY19zcGVfc2hhMjU2X3RyYW5zZm9ybShzY3R4LT5zdGF0ZSwgc2N0eC0+YnVmLCAxKTsKKworCXNwZV9lbmQoKTsKKworCWRzdFswXSA9IGNwdV90b19iZTMyKHNjdHgtPnN0YXRlWzBdKTsKKwlkc3RbMV0gPSBjcHVfdG9fYmUzMihzY3R4LT5zdGF0ZVsxXSk7CisJZHN0WzJdID0gY3B1X3RvX2JlMzIoc2N0eC0+c3RhdGVbMl0pOworCWRzdFszXSA9IGNwdV90b19iZTMyKHNjdHgtPnN0YXRlWzNdKTsKKwlkc3RbNF0gPSBjcHVfdG9fYmUzMihzY3R4LT5zdGF0ZVs0XSk7CisJZHN0WzVdID0gY3B1X3RvX2JlMzIoc2N0eC0+c3RhdGVbNV0pOworCWRzdFs2XSA9IGNwdV90b19iZTMyKHNjdHgtPnN0YXRlWzZdKTsKKwlkc3RbN10gPSBjcHVfdG9fYmUzMihzY3R4LT5zdGF0ZVs3XSk7CisKKwlwcGNfc2hhMjU2X2NsZWFyX2NvbnRleHQoc2N0eCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHBjX3NwZV9zaGEyMjRfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCit7CisJdTMyIERbU0hBMjU2X0RJR0VTVF9TSVpFID4+IDJdOworCV9fYmUzMiAqZHN0ID0gKF9fYmUzMiAqKW91dDsKKworCXBwY19zcGVfc2hhMjU2X2ZpbmFsKGRlc2MsICh1OCAqKUQpOworCisJLyogYXZvaWQgYnl0ZXdpc2UgbWVtY3B5ICovCisJZHN0WzBdID0gRFswXTsKKwlkc3RbMV0gPSBEWzFdOworCWRzdFsyXSA9IERbMl07CisJZHN0WzNdID0gRFszXTsKKwlkc3RbNF0gPSBEWzRdOworCWRzdFs1XSA9IERbNV07CisJZHN0WzZdID0gRFs2XTsKKworCS8qIGNsZWFyIHNlbnNpdGl2ZSBkYXRhICovCisJbWVtemVyb19leHBsaWNpdChELCBTSEEyNTZfRElHRVNUX1NJWkUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBwY19zcGVfc2hhMjU2X2V4cG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdm9pZCAqb3V0KQoreworCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworCW1lbWNweShvdXQsIHNjdHgsIHNpemVvZigqc2N0eCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBwY19zcGVfc2hhMjU2X2ltcG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3Qgdm9pZCAqaW4pCit7CisJc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJbWVtY3B5KHNjdHgsIGluLCBzaXplb2YoKnNjdHgpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgYWxnc1syXSA9IHsgeworCS5kaWdlc3RzaXplCT0JU0hBMjU2X0RJR0VTVF9TSVpFLAorCS5pbml0CQk9CXBwY19zcGVfc2hhMjU2X2luaXQsCisJLnVwZGF0ZQkJPQlwcGNfc3BlX3NoYTI1Nl91cGRhdGUsCisJLmZpbmFsCQk9CXBwY19zcGVfc2hhMjU2X2ZpbmFsLAorCS5leHBvcnQJCT0JcHBjX3NwZV9zaGEyNTZfZXhwb3J0LAorCS5pbXBvcnQJCT0JcHBjX3NwZV9zaGEyNTZfaW1wb3J0LAorCS5kZXNjc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMjU2X3N0YXRlKSwKKwkuc3RhdGVzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGEyNTZfc3RhdGUpLAorCS5iYXNlCQk9CXsKKwkJLmNyYV9uYW1lCT0JInNoYTI1NiIsCisJCS5jcmFfZHJpdmVyX25hbWU9CSJzaGEyNTYtcHBjLXNwZSIsCisJCS5jcmFfcHJpb3JpdHkJPQkzMDAsCisJCS5jcmFfZmxhZ3MJPQlDUllQVE9fQUxHX1RZUEVfU0hBU0gsCisJCS5jcmFfYmxvY2tzaXplCT0JU0hBMjU2X0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCT0JVEhJU19NT0RVTEUsCisJfQorfSwgeworCS5kaWdlc3RzaXplCT0JU0hBMjI0X0RJR0VTVF9TSVpFLAorCS5pbml0CQk9CXBwY19zcGVfc2hhMjI0X2luaXQsCisJLnVwZGF0ZQkJPQlwcGNfc3BlX3NoYTI1Nl91cGRhdGUsCisJLmZpbmFsCQk9CXBwY19zcGVfc2hhMjI0X2ZpbmFsLAorCS5leHBvcnQJCT0JcHBjX3NwZV9zaGEyNTZfZXhwb3J0LAorCS5pbXBvcnQJCT0JcHBjX3NwZV9zaGEyNTZfaW1wb3J0LAorCS5kZXNjc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMjU2X3N0YXRlKSwKKwkuc3RhdGVzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGEyNTZfc3RhdGUpLAorCS5iYXNlCQk9CXsKKwkJLmNyYV9uYW1lCT0JInNoYTIyNCIsCisJCS5jcmFfZHJpdmVyX25hbWU9CSJzaGEyMjQtcHBjLXNwZSIsCisJCS5jcmFfcHJpb3JpdHkJPQkzMDAsCisJCS5jcmFfZmxhZ3MJPQlDUllQVE9fQUxHX1RZUEVfU0hBU0gsCisJCS5jcmFfYmxvY2tzaXplCT0JU0hBMjI0X0JMT0NLX1NJWkUsCisJCS5jcmFfbW9kdWxlCT0JVEhJU19NT0RVTEUsCisJfQorfSB9OworCitzdGF0aWMgaW50IF9faW5pdCBwcGNfc3BlX3NoYTI1Nl9tb2RfaW5pdCh2b2lkKQoreworCXJldHVybiBjcnlwdG9fcmVnaXN0ZXJfc2hhc2hlcyhhbGdzLCBBUlJBWV9TSVpFKGFsZ3MpKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBwY19zcGVfc2hhMjU2X21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX3VucmVnaXN0ZXJfc2hhc2hlcyhhbGdzLCBBUlJBWV9TSVpFKGFsZ3MpKTsKK30KKworbW9kdWxlX2luaXQocHBjX3NwZV9zaGEyNTZfbW9kX2luaXQpOworbW9kdWxlX2V4aXQocHBjX3NwZV9zaGEyNTZfbW9kX2ZpbmkpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNIQS0yMjQgYW5kIFNIQS0yNTYgU2VjdXJlIEhhc2ggQWxnb3JpdGhtLCBTUEUgb3B0aW1pemVkIik7CisKK01PRFVMRV9BTElBU19DUllQVE8oInNoYTIyNCIpOworTU9EVUxFX0FMSUFTX0NSWVBUTygic2hhMjI0LXBwYy1zcGUiKTsKK01PRFVMRV9BTElBU19DUllQVE8oInNoYTI1NiIpOworTU9EVUxFX0FMSUFTX0NSWVBUTygic2hhMjU2LXBwYy1zcGUiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hc20tY29tcGF0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vYXNtLWNvbXBhdC5oCmluZGV4IDIxYmU4YWUuLmRjODVkY2IgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9hc20tY29tcGF0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2FzbS1jb21wYXQuaApAQCAtMjMsNiArMjMsOCBAQAogI2RlZmluZSBQUENfU1RMCQlzdHJpbmdpZnlfaW5fYyhzdGQpCiAjZGVmaW5lIFBQQ19TVExVCXN0cmluZ2lmeV9pbl9jKHN0ZHUpCiAjZGVmaW5lIFBQQ19MQ01QSQlzdHJpbmdpZnlfaW5fYyhjbXBkaSkKKyNkZWZpbmUgUFBDX0xDTVBMSQlzdHJpbmdpZnlfaW5fYyhjbXBsZGkpCisjZGVmaW5lIFBQQ19MQ01QCXN0cmluZ2lmeV9pbl9jKGNtcGQpCiAjZGVmaW5lIFBQQ19MT05HCXN0cmluZ2lmeV9pbl9jKC5sbG9uZykKICNkZWZpbmUgUFBDX0xPTkdfQUxJR04Jc3RyaW5naWZ5X2luX2MoLmJhbGlnbiA4KQogI2RlZmluZSBQUENfVExORUkJc3RyaW5naWZ5X2luX2ModGRuZWkpCkBAIC01Miw2ICs1NCw4IEBACiAjZGVmaW5lIFBQQ19TVEwJCXN0cmluZ2lmeV9pbl9jKHN0dykKICNkZWZpbmUgUFBDX1NUTFUJc3RyaW5naWZ5X2luX2Moc3R3dSkKICNkZWZpbmUgUFBDX0xDTVBJCXN0cmluZ2lmeV9pbl9jKGNtcHdpKQorI2RlZmluZSBQUENfTENNUExJCXN0cmluZ2lmeV9pbl9jKGNtcGx3aSkKKyNkZWZpbmUgUFBDX0xDTVAJc3RyaW5naWZ5X2luX2MoY21wdykKICNkZWZpbmUgUFBDX0xPTkcJc3RyaW5naWZ5X2luX2MoLmxvbmcpCiAjZGVmaW5lIFBQQ19MT05HX0FMSUdOCXN0cmluZ2lmeV9pbl9jKC5iYWxpZ24gNCkKICNkZWZpbmUgUFBDX1RMTkVJCXN0cmluZ2lmeV9pbl9jKHR3bmVpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRocmVhZHMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0aHJlYWRzLmgKaW5kZXggMmJmOGU5My4uNGM4YWQ1OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRocmVhZHMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGhyZWFkcy5oCkBAIC01NSw3ICs1NSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGNwdV9ucl9jb3Jlcyh2b2lkKQogewotCXJldHVybiBOUl9DUFVTID4+IHRocmVhZHNfc2hpZnQ7CisJcmV0dXJuIG5yX2NwdV9pZHMgPj4gdGhyZWFkc19zaGlmdDsKIH0KIAogc3RhdGljIGlubGluZSBjcHVtYXNrX3QgY3B1X29ubGluZV9jb3Jlc19tYXAodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCA1N2QyODlhLi5lZTQ2ZmZlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC0xMjgsMTAgKzEyOCw2IEBACiAJKDB4N2ZmID4+IChQQUdFX1NISUZUIC0gMTIpKSA6IFwKIAkoMHgzZmZmZiA+PiAoUEFHRV9TSElGVCAtIDEyKSkpCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfcmFuZG9taXplX2JyayhzdHJ1Y3QgbW1fc3RydWN0ICptbSk7Ci0jZGVmaW5lIGFyY2hfcmFuZG9taXplX2JyayBhcmNoX3JhbmRvbWl6ZV9icmsKLQotCiAjaWZkZWYgQ09ORklHX1NQVV9CQVNFCiAvKiBOb3RlcyB1c2VkIGluIEVUX0NPUkUuIE5vdGUgbmFtZSBpcyAiU1BVLzxmZD4vPGZpbGVuYW1lPiIuICovCiAjZGVmaW5lIE5UX1NQVQkJMQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmgKaW5kZXggOTQyYzdiMS4uOTkzMDkwNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oCkBAIC0xMDYsMTAgKzEwNiw2IEBACiAJc3BpbmxvY2tfdCBtbXVfbG9jazsKIH07CiAKLSNkZWZpbmUgQ09OVEVYVF9IT1NUCQkwCi0jZGVmaW5lIENPTlRFWFRfR1VFU1QJCTEKLSNkZWZpbmUgQ09OVEVYVF9HVUVTVF9FTkQJMgotCiAjZGVmaW5lIFZTSURfUkVBTAkweDA3ZmZmZmZmZmZjMDAwMDBVTEwKICNkZWZpbmUgVlNJRF9CQVQJMHgwN2ZmZmZmZmZmYjAwMDAwVUxMCiAjZGVmaW5lIFZTSURfNjRLCTB4MDgwMDAwMDAwMDAwMDAwMFVMTApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwYy1vcGNvZGUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcGMtb3Bjb2RlLmgKaW5kZXggMDNjZDg1OC4uNWM5M2Y2OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BwYy1vcGNvZGUuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHBjLW9wY29kZS5oCkBAIC0xNTMsNiArMTUzLDcgQEAKICNkZWZpbmUgUFBDX0lOU1RfTUZTUFJfUFZSX01BU0sJCTB4ZmMxZmZmZmYKICNkZWZpbmUgUFBDX0lOU1RfTUZUTVIJCQkweDdjMDAwMmRjCiAjZGVmaW5lIFBQQ19JTlNUX01TR1NORAkJCTB4N2MwMDAxOWMKKyNkZWZpbmUgUFBDX0lOU1RfTVNHQ0xSCQkJMHg3YzAwMDFkYwogI2RlZmluZSBQUENfSU5TVF9NU0dTTkRQCQkweDdjMDAwMTFjCiAjZGVmaW5lIFBQQ19JTlNUX01UVE1SCQkJMHg3YzAwMDNkYwogI2RlZmluZSBQUENfSU5TVF9OT1AJCQkweDYwMDAwMDAwCkBAIC0yMTIsNiArMjEzLDggQEAKICNkZWZpbmUgUFBDX0lOU1RfTFdaCQkJMHg4MDAwMDAwMAogI2RlZmluZSBQUENfSU5TVF9TVEQJCQkweGY4MDAwMDAwCiAjZGVmaW5lIFBQQ19JTlNUX1NURFUJCQkweGY4MDAwMDAxCisjZGVmaW5lIFBQQ19JTlNUX1NUVwkJCTB4OTAwMDAwMDAKKyNkZWZpbmUgUFBDX0lOU1RfU1RXVQkJCTB4OTQwMDAwMDAKICNkZWZpbmUgUFBDX0lOU1RfTUZMUgkJCTB4N2MwODAyYTYKICNkZWZpbmUgUFBDX0lOU1RfTVRMUgkJCTB4N2MwODAzYTYKICNkZWZpbmUgUFBDX0lOU1RfQ01QV0kJCQkweDJjMDAwMDAwCkBAIC0zMDksNiArMzEyLDggQEAKIAkJCQkJX19fUFBDX1JCKGIpIHwgX19QUENfRUgoZWgpKQogI2RlZmluZSBQUENfTVNHU05EKGIpCQlzdHJpbmdpZnlfaW5fYygubG9uZyBQUENfSU5TVF9NU0dTTkQgfCBcCiAJCQkJCV9fX1BQQ19SQihiKSkKKyNkZWZpbmUgUFBDX01TR0NMUihiKQkJc3RyaW5naWZ5X2luX2MoLmxvbmcgUFBDX0lOU1RfTVNHQ0xSIHwgXAorCQkJCQlfX19QUENfUkIoYikpCiAjZGVmaW5lIFBQQ19NU0dTTkRQKGIpCQlzdHJpbmdpZnlfaW5fYygubG9uZyBQUENfSU5TVF9NU0dTTkRQIHwgXAogCQkJCQlfX19QUENfUkIoYikpCiAjZGVmaW5lIFBQQ19QT1BDTlRCKGEsIHMpCXN0cmluZ2lmeV9pbl9jKC5sb25nIFBQQ19JTlNUX1BPUENOVEIgfCBcCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmgKaW5kZXggMWM4NzRmYi4uYWY1NmI1YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaApAQCAtNjA4LDEzICs2MDgsMTYgQEAKICNkZWZpbmUgICBTUlIxX0lTSV9OX09SX0cJMHgxMDAwMDAwMCAvKiBJU0k6IEFjY2VzcyBpcyBuby1leGVjIG9yIEcgKi8KICNkZWZpbmUgICBTUlIxX0lTSV9QUk9UCQkweDA4MDAwMDAwIC8qIElTSTogT3RoZXIgcHJvdGVjdGlvbiBmYXVsdCAqLwogI2RlZmluZSAgIFNSUjFfV0FLRU1BU0sJCTB4MDAzODAwMDAgLyogcmVhc29uIGZvciB3YWtldXAgKi8KKyNkZWZpbmUgICBTUlIxX1dBS0VNQVNLX1A4CTB4MDAzYzAwMDAgLyogcmVhc29uIGZvciB3YWtldXAgb24gUE9XRVI4ICovCiAjZGVmaW5lICAgU1JSMV9XQUtFU1lTRVJSCTB4MDAzMDAwMDAgLyogU3lzdGVtIGVycm9yICovCiAjZGVmaW5lICAgU1JSMV9XQUtFRUUJCTB4MDAyMDAwMDAgLyogRXh0ZXJuYWwgaW50ZXJydXB0ICovCiAjZGVmaW5lICAgU1JSMV9XQUtFTVQJCTB4MDAyODAwMDAgLyogbXRjdHJsICovCiAjZGVmaW5lCSAgU1JSMV9XQUtFSE1JCQkweDAwMjgwMDAwIC8qIEh5cGVydmlzb3IgbWFpbnRlbmFuY2UgKi8KICNkZWZpbmUgICBTUlIxX1dBS0VERUMJCTB4MDAxODAwMDAgLyogRGVjcmVtZW50ZXIgaW50ZXJydXB0ICovCisjZGVmaW5lICAgU1JSMV9XQUtFREJFTEwJMHgwMDE0MDAwMCAvKiBQcml2aWxlZ2VkIGRvb3JiZWxsIG9uIFA4ICovCiAjZGVmaW5lICAgU1JSMV9XQUtFVEhFUk0JMHgwMDEwMDAwMCAvKiBUaGVybWFsIG1hbmFnZW1lbnQgaW50ZXJydXB0ICovCiAjZGVmaW5lCSAgU1JSMV9XQUtFUkVTRVQJMHgwMDEwMDAwMCAvKiBTeXN0ZW0gcmVzZXQgKi8KKyNkZWZpbmUgICBTUlIxX1dBS0VIREJFTEwJMHgwMDBjMDAwMCAvKiBIeXBlcnZpc29yIGRvb3JiZWxsIG9uIFA4ICovCiAjZGVmaW5lCSAgU1JSMV9XQUtFU1RBVEUJMHgwMDAzMDAwMCAvKiBQb3dlcnNhdmUgZXhpdCBtYXNrIFs0Njo0N10gKi8KICNkZWZpbmUJICBTUlIxX1dTX0RFRVBFU1QJMHgwMDAzMDAwMCAvKiBTb21lIHJlc291cmNlcyBub3QgbWFpbnRhaW5lZCwKIAkJCQkJICAqIG1heSBub3QgYmUgcmVjb3ZlcmFibGUgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zbXUuaAppbmRleCA2ZTkwOWYzLi4zN2QyZGE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc211LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NtdS5oCkBAIC00NzgsNyArNDc4LDcgQEAKIAogCiAvKgotICogS2VucmVsIGFzeW5jaHJvbm91cyBpMmMgaW50ZXJmYWNlCisgKiBLZXJuZWwgYXN5bmNocm9ub3VzIGkyYyBpbnRlcmZhY2UKICAqLwogCiAjZGVmaW5lIFNNVV9JMkNfUkVBRF9NQVgJMHgxZApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCA3MjQ4OTc5Li43ZWZlZTRhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMzksNyArMzksNiBAQAogICovCiBzdHJ1Y3QgdGhyZWFkX2luZm8gewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4gKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJaW50CQljcHU7CQkJLyogY3B1IHdlJ3JlIG9uICovCiAJaW50CQlwcmVlbXB0X2NvdW50OwkJLyogMCA9PiBwcmVlbXB0YWJsZSwKIAkJCQkJCSAgIDwwID0+IEJVRyAqLwpAQCAtNTUsNyArNTQsNiBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCiB7CQkJCQkJXAogCS50YXNrID0JCSZ0c2ssCQkJXAotCS5leGVjX2RvbWFpbiA9CSZkZWZhdWx0X2V4ZWNfZG9tYWluLAlcCiAJLmNwdSA9CQkwLAkJCVwKIAkucHJlZW1wdF9jb3VudCA9IElOSVRfUFJFRU1QVF9DT1VOVCwJXAogCS5mbGFncyA9CTAsCQkJXApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IDdlZDEyNmIuLjYwMjYyZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKQEAgLTQzNyw2ICs0MzcsMjYgQEAKIAkJLm1hY2hpbmVfY2hlY2tfZWFybHkJPSBfX21hY2hpbmVfY2hlY2tfZWFybHlfcmVhbG1vZGVfcDgsCiAJCS5wbGF0Zm9ybQkJPSAicG93ZXI4IiwKIAl9LAorCXsJLyogUG93ZXI4TlZMICovCisJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAorCQkucHZyX3ZhbHVlCQk9IDB4MDA0YzAwMDAsCisJCS5jcHVfbmFtZQkJPSAiUE9XRVI4TlZMIChyYXcpIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU19QT1dFUjgsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IENPTU1PTl9VU0VSX1BPV0VSOCwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzMgk9IENPTU1PTl9VU0VSMl9QT1dFUjgsCisJCS5tbXVfZmVhdHVyZXMJCT0gTU1VX0ZUUlNfUE9XRVI4LAorCQkuaWNhY2hlX2JzaXplCQk9IDEyOCwKKwkJLmRjYWNoZV9ic2l6ZQkJPSAxMjgsCisJCS5udW1fcG1jcwkJPSA2LAorCQkucG1jX3R5cGUJCT0gUFBDX1BNQ19JQk0sCisJCS5vcHJvZmlsZV9jcHVfdHlwZQk9ICJwcGM2NC9wb3dlcjgiLAorCQkub3Byb2ZpbGVfdHlwZQkJPSBQUENfT1BST0ZJTEVfSU5WQUxJRCwKKwkJLmNwdV9zZXR1cAkJPSBfX3NldHVwX2NwdV9wb3dlcjgsCisJCS5jcHVfcmVzdG9yZQkJPSBfX3Jlc3RvcmVfY3B1X3Bvd2VyOCwKKwkJLmZsdXNoX3RsYgkJPSBfX2ZsdXNoX3RsYl9wb3dlcjgsCisJCS5tYWNoaW5lX2NoZWNrX2Vhcmx5CT0gX19tYWNoaW5lX2NoZWNrX2Vhcmx5X3JlYWxtb2RlX3A4LAorCQkucGxhdGZvcm0JCT0gInBvd2VyOCIsCisJfSwKIAl7CS8qIFBvd2VyOCBERDE6IERvZXMgbm90IHN1cHBvcnQgZG9vcmJlbGwgSVBJcyAqLwogCQkucHZyX21hc2sJCT0gMHhmZmZmZmYwMCwKIAkJLnB2cl92YWx1ZQkJPSAweDAwNGQwMTAwLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9kYmVsbC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9kYmVsbC5jCmluZGV4IGY0MjE3ODEuLjIxMjhmM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZGJlbGwuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2RiZWxsLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9kYmVsbC5oPgogI2luY2x1ZGUgPGFzbS9pcnFfcmVncy5oPgorI2luY2x1ZGUgPGFzbS9rdm1fcHBjLmg+CiAKICNpZmRlZiBDT05GSUdfU01QCiB2b2lkIGRvb3JiZWxsX3NldHVwX3RoaXNfY3B1KHZvaWQpCkBAIC00MSw2ICs0Miw3IEBACiAKIAltYXlfaGFyZF9pcnFfZW5hYmxlKCk7CiAKKwlrdm1wcGNfc2V0X2hvc3RfaXBpKHNtcF9wcm9jZXNzb3JfaWQoKSwgMCk7CiAJX190aGlzX2NwdV9pbmMoaXJxX3N0YXQuZG9vcmJlbGxfaXJxcyk7CiAKIAlzbXBfaXBpX2RlbXV4KCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKaW5kZXggYzJkZjgxNS4uOTUxOWU2YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUwpAQCAtMTQwOCw3ICsxNDA4LDcgQEAKIAlibmUJOWYJCQkvKiBjb250aW51ZSBpbiBWIG1vZGUgaWYgd2UgYXJlLiAqLwogCiA1OgotI2lmZGVmIENPTkZJR19LVk1fQk9PSzNTXzY0X0hWCisjaWZkZWYgQ09ORklHX0tWTV9CT09LM1NfNjRfSEFORExFUgogCS8qCiAJICogV2UgYXJlIGNvbWluZyBmcm9tIGtlcm5lbCBjb250ZXh0LiBDaGVjayBpZiB3ZSBhcmUgY29taW5nIGZyb20KIAkgKiBndWVzdC4gaWYgeWVzLCB0aGVuIHdlIGNhbiBjb250aW51ZS4gV2Ugd2lsbCBmYWxsIHRocm91Z2gKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKaW5kZXggYjhlMTVjNi4uMzA4YzVlMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMKQEAgLTcyMSw3ICs3MjEsNyBAQAogCSAqLwogCW9mX3NjYW5fZmxhdF9kdChlYXJseV9pbml0X2R0X3NjYW5fY3B1cywgTlVMTCk7CiAJaWYgKGJvb3RfY3B1aWQgPCAwKSB7Ci0JCXByaW50aygiRmFpbGVkIHRvIGluZGVudGlmeSBib290IENQVSAhXG4iKTsKKwkJcHJpbnRrKCJGYWlsZWQgdG8gaWRlbnRpZnkgYm9vdCBDUFUgIVxuIik7CiAJCUJVRygpOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCmluZGV4IDc1NTFlNTYuLmM2OTY3MWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKQEAgLTc5Myw3ICs3OTMsNyBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBkaXNhYmxlX2hhcmRsb2NrdXBfZGV0ZWN0b3Iodm9pZCkKIHsKLQl3YXRjaGRvZ19lbmFibGVfaGFyZGxvY2t1cF9kZXRlY3RvcihmYWxzZSk7CisJaGFyZGxvY2t1cF9kZXRlY3Rvcl9kaXNhYmxlKCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jCmluZGV4IGRlNDAxOGEuLmRlNzQ3NTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYwpAQCAtNjM2LDcgKzYzNiw3IEBACiAJc3Bpbl9sb2NrKCZ2Y3B1LT5hcmNoLnZwYV91cGRhdGVfbG9jayk7CiAJbHBwYWNhID0gKHN0cnVjdCBscHBhY2EgKil2Y3B1LT5hcmNoLnZwYS5waW5uZWRfYWRkcjsKIAlpZiAobHBwYWNhKQotCQl5aWVsZF9jb3VudCA9IGxwcGFjYS0+eWllbGRfY291bnQ7CisJCXlpZWxkX2NvdW50ID0gYmUzMl90b19jcHUobHBwYWNhLT55aWVsZF9jb3VudCk7CiAJc3Bpbl91bmxvY2soJnZjcHUtPmFyY2gudnBhX3VwZGF0ZV9sb2NrKTsKIAlyZXR1cm4geWllbGRfY291bnQ7CiB9CkBAIC05NDIsMjAgKzk0MiwyMCBAQAogc3RhdGljIHZvaWQga3ZtcHBjX3NldF9scGNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IG5ld19scGNyLAogCQlib29sIHByZXNlcnZlX3RvcDMyKQogeworCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtPmt2bTsKIAlzdHJ1Y3Qga3ZtcHBjX3Zjb3JlICp2YyA9IHZjcHUtPmFyY2gudmNvcmU7CiAJdTY0IG1hc2s7CiAKKwltdXRleF9sb2NrKCZrdm0tPmxvY2spOwogCXNwaW5fbG9jaygmdmMtPmxvY2spOwogCS8qCiAJICogSWYgSUxFIChpbnRlcnJ1cHQgbGl0dGxlLWVuZGlhbikgaGFzIGNoYW5nZWQsIHVwZGF0ZSB0aGUKIAkgKiBNU1JfTEUgYml0IGluIHRoZSBpbnRyX21zciBmb3IgZWFjaCB2Y3B1IGluIHRoaXMgdmNvcmUuCiAJICovCiAJaWYgKChuZXdfbHBjciAmIExQQ1JfSUxFKSAhPSAodmMtPmxwY3IgJiBMUENSX0lMRSkpIHsKLQkJc3RydWN0IGt2bSAqa3ZtID0gdmNwdS0+a3ZtOwogCQlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHU7CiAJCWludCBpOwogCi0JCW11dGV4X2xvY2soJmt2bS0+bG9jayk7CiAJCWt2bV9mb3JfZWFjaF92Y3B1KGksIHZjcHUsIGt2bSkgewogCQkJaWYgKHZjcHUtPmFyY2gudmNvcmUgIT0gdmMpCiAJCQkJY29udGludWU7CkBAIC05NjQsNyArOTY0LDYgQEAKIAkJCWVsc2UKIAkJCQl2Y3B1LT5hcmNoLmludHJfbXNyICY9IH5NU1JfTEU7CiAJCX0KLQkJbXV0ZXhfdW5sb2NrKCZrdm0tPmxvY2spOwogCX0KIAogCS8qCkBAIC05ODEsNiArOTgwLDcgQEAKIAkJbWFzayAmPSAweEZGRkZGRkZGOwogCXZjLT5scGNyID0gKHZjLT5scGNyICYgfm1hc2spIHwgKG5ld19scGNyICYgbWFzayk7CiAJc3Bpbl91bmxvY2soJnZjLT5sb2NrKTsKKwltdXRleF91bmxvY2soJmt2bS0+bG9jayk7CiB9CiAKIHN0YXRpYyBpbnQga3ZtcHBjX2dldF9vbmVfcmVnX2h2KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTY0IGlkLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TCmluZGV4IGJiOTRlNmYuLjZjYmYxNjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKQEAgLTEwMDUsNiArMTAwNSw3IEBACiAJLyogU2F2ZSBIRUlSIChIViBlbXVsYXRpb24gYXNzaXN0IHJlZykgaW4gZW11bF9pbnN0CiAJICAgaWYgdGhpcyBpcyBhbiBIRUkgKEhWIGVtdWxhdGlvbiBpbnRlcnJ1cHQsIGU0MCkgKi8KIAlsaQlyMyxLVk1fSU5TVF9GRVRDSF9GQUlMRUQKKwlzdHcJcjMsVkNQVV9MQVNUX0lOU1QocjkpCiAJY21wd2kJcjEyLEJPT0szU19JTlRFUlJVUFRfSF9FTVVMX0FTU0lTVAogCWJuZQkxMWYKIAltZnNwcglyMyxTUFJOX0hFSVIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vbXBpYy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9tcGljLmMKaW5kZXggMzliM2E4Zi4uNjI0OWNkYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9tcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9tcGljLmMKQEAgLTM0LDcgKzM0LDcgQEAKICNpbmNsdWRlIDxhc20va3ZtX3BhcmEuaD4KICNpbmNsdWRlIDxhc20va3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxhc20va3ZtX3BwYy5oPgotI2luY2x1ZGUgImlvZGV2LmgiCisjaW5jbHVkZSA8a3ZtL2lvZGV2Lmg+CiAKICNkZWZpbmUgTUFYX0NQVSAgICAgMzIKICNkZWZpbmUgTUFYX1NSQyAgICAgMjU2CkBAIC0yODksMTEgKzI4OSw2IEBACiAJY2xlYXJfYml0KG5fSVJRLCBxLT5xdWV1ZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IElSUV90ZXN0Yml0KHN0cnVjdCBpcnFfcXVldWUgKnEsIGludCBuX0lSUSkKLXsKLQlyZXR1cm4gdGVzdF9iaXQobl9JUlEsIHEtPnF1ZXVlKTsKLX0KLQogc3RhdGljIHZvaWQgSVJRX2NoZWNrKHN0cnVjdCBvcGVucGljICpvcHAsIHN0cnVjdCBpcnFfcXVldWUgKnEpCiB7CiAJaW50IGlycSA9IC0xOwpAQCAtMTM3NCw4ICsxMzY5LDkgQEAKIAlyZXR1cm4gLUVOWElPOwogfQogCi1zdGF0aWMgaW50IGt2bV9tcGljX3JlYWQoc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsIGdwYV90IGFkZHIsCi0JCQkgaW50IGxlbiwgdm9pZCAqcHRyKQorc3RhdGljIGludCBrdm1fbXBpY19yZWFkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCSBzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKKwkJCSBncGFfdCBhZGRyLCBpbnQgbGVuLCB2b2lkICpwdHIpCiB7CiAJc3RydWN0IG9wZW5waWMgKm9wcCA9IGNvbnRhaW5lcl9vZih0aGlzLCBzdHJ1Y3Qgb3BlbnBpYywgbW1pbyk7CiAJaW50IHJldDsKQEAgLTE0MTUsOCArMTQxMSw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBrdm1fbXBpY193cml0ZShzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywgZ3BhX3QgYWRkciwKLQkJCSAgaW50IGxlbiwgY29uc3Qgdm9pZCAqcHRyKQorc3RhdGljIGludCBrdm1fbXBpY193cml0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkgIHN0cnVjdCBrdm1faW9fZGV2aWNlICp0aGlzLAorCQkJICBncGFfdCBhZGRyLCBpbnQgbGVuLCBjb25zdCB2b2lkICpwdHIpCiB7CiAJc3RydWN0IG9wZW5waWMgKm9wcCA9IGNvbnRhaW5lcl9vZih0aGlzLCBzdHJ1Y3Qgb3BlbnBpYywgbW1pbyk7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vcG93ZXJwYy5jIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKaW5kZXggNDFjNWY4Zi4uOTFiYmM4NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9wb3dlcnBjLmMKQEAgLTgwNiw3ICs4MDYsNyBAQAogCiAJaWR4ID0gc3JjdV9yZWFkX2xvY2soJnZjcHUtPmt2bS0+c3JjdSk7CiAKLQlyZXQgPSBrdm1faW9fYnVzX3JlYWQodmNwdS0+a3ZtLCBLVk1fTU1JT19CVVMsIHJ1bi0+bW1pby5waHlzX2FkZHIsCisJcmV0ID0ga3ZtX2lvX2J1c19yZWFkKHZjcHUsIEtWTV9NTUlPX0JVUywgcnVuLT5tbWlvLnBoeXNfYWRkciwKIAkJCSAgICAgIGJ5dGVzLCAmcnVuLT5tbWlvLmRhdGEpOwogCiAJc3JjdV9yZWFkX3VubG9jaygmdmNwdS0+a3ZtLT5zcmN1LCBpZHgpOwpAQCAtODc4LDcgKzg3OCw3IEBACiAKIAlpZHggPSBzcmN1X3JlYWRfbG9jaygmdmNwdS0+a3ZtLT5zcmN1KTsKIAotCXJldCA9IGt2bV9pb19idXNfd3JpdGUodmNwdS0+a3ZtLCBLVk1fTU1JT19CVVMsIHJ1bi0+bW1pby5waHlzX2FkZHIsCisJcmV0ID0ga3ZtX2lvX2J1c193cml0ZSh2Y3B1LCBLVk1fTU1JT19CVVMsIHJ1bi0+bW1pby5waHlzX2FkZHIsCiAJCQkgICAgICAgYnl0ZXMsICZydW4tPm1taW8uZGF0YSk7CiAKIAlzcmN1X3JlYWRfdW5sb2NrKCZ2Y3B1LT5rdm0tPnNyY3UsIGlkeCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW1hcC5jIGIvYXJjaC9wb3dlcnBjL21tL21tYXAuYwppbmRleCBjYjhiZGJlLi4wZjA1MDJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vbW1hcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbWFwLmMKQEAgLTUzLDIxICs1MywyMCBAQAogCXJldHVybiBzeXNjdGxfbGVnYWN5X3ZhX2xheW91dDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbW1hcF9ybmQodm9pZCkKK3Vuc2lnbmVkIGxvbmcgYXJjaF9tbWFwX3JuZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgcm5kID0gMDsKKwl1bnNpZ25lZCBsb25nIHJuZDsKIAotCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkgewotCQkvKiA4TUIgZm9yIDMyYml0LCAxR0IgZm9yIDY0Yml0ICovCi0JCWlmIChpc18zMmJpdF90YXNrKCkpCi0JCQlybmQgPSAobG9uZykoZ2V0X3JhbmRvbV9pbnQoKSAlICgxPDwoMjMtUEFHRV9TSElGVCkpKTsKLQkJZWxzZQotCQkJcm5kID0gKGxvbmcpKGdldF9yYW5kb21faW50KCkgJSAoMTw8KDMwLVBBR0VfU0hJRlQpKSk7Ci0JfQorCS8qIDhNQiBmb3IgMzJiaXQsIDFHQiBmb3IgNjRiaXQgKi8KKwlpZiAoaXNfMzJiaXRfdGFzaygpKQorCQlybmQgPSAodW5zaWduZWQgbG9uZylnZXRfcmFuZG9tX2ludCgpICUgKDE8PCgyMy1QQUdFX1NISUZUKSk7CisJZWxzZQorCQlybmQgPSAodW5zaWduZWQgbG9uZylnZXRfcmFuZG9tX2ludCgpICUgKDE8PCgzMC1QQUdFX1NISUZUKSk7CisKIAlyZXR1cm4gcm5kIDw8IFBBR0VfU0hJRlQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbWFwX2Jhc2Uodm9pZCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbWFwX2Jhc2UodW5zaWduZWQgbG9uZyBybmQpCiB7CiAJdW5zaWduZWQgbG9uZyBnYXAgPSBybGltaXQoUkxJTUlUX1NUQUNLKTsKIApAQCAtNzYsNyArNzUsNyBAQAogCWVsc2UgaWYgKGdhcCA+IE1BWF9HQVApCiAJCWdhcCA9IE1BWF9HQVA7CiAKLQlyZXR1cm4gUEFHRV9BTElHTihUQVNLX1NJWkUgLSBnYXAgLSBtbWFwX3JuZCgpKTsKKwlyZXR1cm4gUEFHRV9BTElHTihUQVNLX1NJWkUgLSBnYXAgLSBybmQpOwogfQogCiAvKgpAQCAtODUsNiArODQsMTEgQEAKICAqLwogdm9pZCBhcmNoX3BpY2tfbW1hcF9sYXlvdXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CisJdW5zaWduZWQgbG9uZyByYW5kb21fZmFjdG9yID0gMFVMOworCisJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKQorCQlyYW5kb21fZmFjdG9yID0gYXJjaF9tbWFwX3JuZCgpOworCiAJLyoKIAkgKiBGYWxsIGJhY2sgdG8gdGhlIHN0YW5kYXJkIGxheW91dCBpZiB0aGUgcGVyc29uYWxpdHkKIAkgKiBiaXQgaXMgc2V0LCBvciBpZiB0aGUgZXhwZWN0ZWQgc3RhY2sgZ3Jvd3RoIGlzIHVubGltaXRlZDoKQEAgLTkzLDcgKzk3LDcgQEAKIAkJbW0tPm1tYXBfYmFzZSA9IFRBU0tfVU5NQVBQRURfQkFTRTsKIAkJbW0tPmdldF91bm1hcHBlZF9hcmVhID0gYXJjaF9nZXRfdW5tYXBwZWRfYXJlYTsKIAl9IGVsc2UgewotCQltbS0+bW1hcF9iYXNlID0gbW1hcF9iYXNlKCk7CisJCW1tLT5tbWFwX2Jhc2UgPSBtbWFwX2Jhc2UocmFuZG9tX2ZhY3Rvcik7CiAJCW1tLT5nZXRfdW5tYXBwZWRfYXJlYSA9IGFyY2hfZ2V0X3VubWFwcGVkX2FyZWFfdG9wZG93bjsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbmV0L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL25ldC9NYWtlZmlsZQppbmRleCAyNjZiMzk1Li4xMzA2YTU4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbmV0L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9uZXQvTWFrZWZpbGUKQEAgLTEsNCArMSw0IEBACiAjCiAjIEFyY2gtc3BlY2lmaWMgbmV0d29yayBtb2R1bGVzCiAjCi1vYmotJChDT05GSUdfQlBGX0pJVCkgKz0gYnBmX2ppdF82NC5vIGJwZl9qaXRfY29tcC5vCitvYmotJChDT05GSUdfQlBGX0pJVCkgKz0gYnBmX2ppdF9hc20ubyBicGZfaml0X2NvbXAubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0LmggYi9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXQuaAppbmRleCBjNDA2YWE5Li44ODlmZDE5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXQuaAorKysgYi9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXQuaApAQCAtMTAsMTIgKzEwLDI1IEBACiAjaWZuZGVmIF9CUEZfSklUX0gKICNkZWZpbmUgX0JQRl9KSVRfSAogCisjaWZkZWYgQ09ORklHX1BQQzY0CisjZGVmaW5lIEJQRl9QUENfU1RBQ0tfUjNfT0ZGCTQ4CiAjZGVmaW5lIEJQRl9QUENfU1RBQ0tfTE9DQUxTCTMyCiAjZGVmaW5lIEJQRl9QUENfU1RBQ0tfQkFTSUMJKDQ4KzY0KQogI2RlZmluZSBCUEZfUFBDX1NUQUNLX1NBVkUJKDE4KjgpCiAjZGVmaW5lIEJQRl9QUENfU1RBQ0tGUkFNRQkoQlBGX1BQQ19TVEFDS19CQVNJQytCUEZfUFBDX1NUQUNLX0xPQ0FMUysgXAogCQkJCSBCUEZfUFBDX1NUQUNLX1NBVkUpCiAjZGVmaW5lIEJQRl9QUENfU0xPV1BBVEhfRlJBTUUJKDQ4KzY0KQorI2Vsc2UKKyNkZWZpbmUgQlBGX1BQQ19TVEFDS19SM19PRkYJMjQKKyNkZWZpbmUgQlBGX1BQQ19TVEFDS19MT0NBTFMJMTYKKyNkZWZpbmUgQlBGX1BQQ19TVEFDS19CQVNJQwkoMjQrMzIpCisjZGVmaW5lIEJQRl9QUENfU1RBQ0tfU0FWRQkoMTgqNCkKKyNkZWZpbmUgQlBGX1BQQ19TVEFDS0ZSQU1FCShCUEZfUFBDX1NUQUNLX0JBU0lDK0JQRl9QUENfU1RBQ0tfTE9DQUxTKyBcCisJCQkJIEJQRl9QUENfU1RBQ0tfU0FWRSkKKyNkZWZpbmUgQlBGX1BQQ19TTE9XUEFUSF9GUkFNRQkoMjQrMzIpCisjZW5kaWYKKworI2RlZmluZSBSRUdfU1ogICAgICAgICAoQklUU19QRVJfTE9ORy84KQogCiAvKgogICogR2VuZXJhdGVkIGNvZGUgcmVnaXN0ZXIgdXNhZ2U6CkBAIC01Nyw3ICs3MCwxMSBAQAogREVDTEFSRV9MT0FEX0ZVTkMoc2tfbG9hZF9ieXRlKTsKIERFQ0xBUkVfTE9BRF9GVU5DKHNrX2xvYWRfYnl0ZV9tc2gpOwogCisjaWZkZWYgQ09ORklHX1BQQzY0CiAjZGVmaW5lIEZVTkNUSU9OX0RFU0NSX1NJWkUJMjQKKyNlbHNlCisjZGVmaW5lIEZVTkNUSU9OX0RFU0NSX1NJWkUJMAorI2VuZGlmCiAKIC8qCiAgKiAxNi1iaXQgaW1tZWRpYXRlIGhlbHBlciBtYWNyb3M6IEhBKCkgaXMgZm9yIHVzZSB3aXRoIHNpZ24tZXh0ZW5kaW5nIGluc3RycwpAQCAtODYsNyArMTAzLDEyIEBACiAjZGVmaW5lIFBQQ19MSVMociwgaSkJCVBQQ19BRERJUyhyLCAwLCBpKQogI2RlZmluZSBQUENfU1REKHIsIGJhc2UsIGkpCUVNSVQoUFBDX0lOU1RfU1REIHwgX19fUFBDX1JTKHIpIHwJICAgICAgXAogCQkJCSAgICAgX19fUFBDX1JBKGJhc2UpIHwgKChpKSAmIDB4ZmZmYykpCi0KKyNkZWZpbmUgUFBDX1NURFUociwgYmFzZSwgaSkJRU1JVChQUENfSU5TVF9TVERVIHwgX19fUFBDX1JTKHIpIHwJICAgICAgXAorCQkJCSAgICAgX19fUFBDX1JBKGJhc2UpIHwgKChpKSAmIDB4ZmZmYykpCisjZGVmaW5lIFBQQ19TVFcociwgYmFzZSwgaSkJRU1JVChQUENfSU5TVF9TVFcgfCBfX19QUENfUlMocikgfAkgICAgICBcCisJCQkJICAgICBfX19QUENfUkEoYmFzZSkgfCAoKGkpICYgMHhmZmZjKSkKKyNkZWZpbmUgUFBDX1NUV1UociwgYmFzZSwgaSkJRU1JVChQUENfSU5TVF9TVFdVIHwgX19fUFBDX1JTKHIpIHwJICAgICAgXAorCQkJCSAgICAgX19fUFBDX1JBKGJhc2UpIHwgKChpKSAmIDB4ZmZmYykpCiAKICNkZWZpbmUgUFBDX0xCWihyLCBiYXNlLCBpKQlFTUlUKFBQQ19JTlNUX0xCWiB8IF9fX1BQQ19SVChyKSB8CSAgICAgIFwKIAkJCQkgICAgIF9fX1BQQ19SQShiYXNlKSB8IElNTV9MKGkpKQpAQCAtOTgsNiArMTIwLDE3IEBACiAJCQkJICAgICBfX19QUENfUkEoYmFzZSkgfCBJTU1fTChpKSkKICNkZWZpbmUgUFBDX0xIQlJYKHIsIGJhc2UsIGIpCUVNSVQoUFBDX0lOU1RfTEhCUlggfCBfX19QUENfUlQocikgfAkgICAgICBcCiAJCQkJICAgICBfX19QUENfUkEoYmFzZSkgfCBfX19QUENfUkIoYikpCisKKyNpZmRlZiBDT05GSUdfUFBDNjQKKyNkZWZpbmUgUFBDX0JQRl9MTChyLCBiYXNlLCBpKSBkbyB7IFBQQ19MRChyLCBiYXNlLCBpKTsgfSB3aGlsZSgwKQorI2RlZmluZSBQUENfQlBGX1NUTChyLCBiYXNlLCBpKSBkbyB7IFBQQ19TVEQociwgYmFzZSwgaSk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgUFBDX0JQRl9TVExVKHIsIGJhc2UsIGkpIGRvIHsgUFBDX1NURFUociwgYmFzZSwgaSk7IH0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIFBQQ19CUEZfTEwociwgYmFzZSwgaSkgZG8geyBQUENfTFdaKHIsIGJhc2UsIGkpOyB9IHdoaWxlKDApCisjZGVmaW5lIFBQQ19CUEZfU1RMKHIsIGJhc2UsIGkpIGRvIHsgUFBDX1NUVyhyLCBiYXNlLCBpKTsgfSB3aGlsZSgwKQorI2RlZmluZSBQUENfQlBGX1NUTFUociwgYmFzZSwgaSkgZG8geyBQUENfU1RXVShyLCBiYXNlLCBpKTsgfSB3aGlsZSgwKQorI2VuZGlmCisKIC8qIENvbnZlbmllbmNlIGhlbHBlcnMgZm9yIHRoZSBhYm92ZSB3aXRoICdmYXInIG9mZnNldHM6ICovCiAjZGVmaW5lIFBQQ19MQlpfT0ZGUyhyLCBiYXNlLCBpKSBkbyB7IGlmICgoaSkgPCAzMjc2OCkgUFBDX0xCWihyLCBiYXNlLCBpKTsgICBcCiAJCWVsc2UgewlQUENfQURESVMociwgYmFzZSwgSU1NX0hBKGkpKTsJCQkgICAgICBcCkBAIC0xMTUsNiArMTQ4LDI5IEBACiAJCWVsc2UgewlQUENfQURESVMociwgYmFzZSwgSU1NX0hBKGkpKTsJCQkgICAgICBcCiAJCQlQUENfTEhaKHIsIHIsIElNTV9MKGkpKTsgfSB9IHdoaWxlKDApCiAKKyNpZmRlZiBDT05GSUdfUFBDNjQKKyNkZWZpbmUgUFBDX0xMX09GRlMociwgYmFzZSwgaSkgZG8geyBQUENfTERfT0ZGUyhyLCBiYXNlLCBpKTsgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgUFBDX0xMX09GRlMociwgYmFzZSwgaSkgZG8geyBQUENfTFdaX09GRlMociwgYmFzZSwgaSk7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NNUAorI2lmZGVmIENPTkZJR19QUEM2NAorI2RlZmluZSBQUENfQlBGX0xPQURfQ1BVKHIpCQlcCisJZG8geyBCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBwYWNhX3N0cnVjdCwgcGFjYV9pbmRleCkgIT0gMik7CVwKKwkJUFBDX0xIWl9PRkZTKHIsIDEzLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHBhY2FfaW5kZXgpKTsJCVwKKwl9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUFBDX0JQRl9MT0FEX0NQVShyKSAgICAgXAorCWRvIHsgQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgdGhyZWFkX2luZm8sIGNwdSkgIT0gNCk7CQkJXAorCQlQUENfTEhaX09GRlMociwgKDEgJiB+KFRIUkVBRF9TSVpFIC0gMSkpLAkJCQkJCQlcCisJCQkJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBjcHUpKTsJCQkJCQkJXAorCX0gd2hpbGUoMCkKKyNlbmRpZgorI2Vsc2UKKyNkZWZpbmUgUFBDX0JQRl9MT0FEX0NQVShyKSBkbyB7IFBQQ19MSShyLCAwKTsgfSB3aGlsZSgwKQorI2VuZGlmCisKICNkZWZpbmUgUFBDX0NNUFdJKGEsIGkpCQlFTUlUKFBQQ19JTlNUX0NNUFdJIHwgX19fUFBDX1JBKGEpIHwgSU1NX0woaSkpCiAjZGVmaW5lIFBQQ19DTVBESShhLCBpKQkJRU1JVChQUENfSU5TVF9DTVBESSB8IF9fX1BQQ19SQShhKSB8IElNTV9MKGkpKQogI2RlZmluZSBQUENfQ01QTFdJKGEsIGkpCUVNSVQoUFBDX0lOU1RfQ01QTFdJIHwgX19fUFBDX1JBKGEpIHwgSU1NX0woaSkpCkBAIC0xOTYsNiArMjUyLDEyIEBACiAJCQkJUFBDX09SSShkLCBkLCAodWludHB0cl90KShpKSAmIDB4ZmZmZik7CSAgICAgIFwKIAkJfSB9IHdoaWxlICgwKTsKIAorI2lmZGVmIENPTkZJR19QUEM2NAorI2RlZmluZSBQUENfRlVOQ19BRERSKGQsaSkgZG8geyBQUENfTEk2NChkLCBpKTsgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgUFBDX0ZVTkNfQUREUihkLGkpIGRvIHsgUFBDX0xJMzIoZCwgaSk7IH0gd2hpbGUoMCkKKyNlbmRpZgorCiAjZGVmaW5lIFBQQ19MSEJSWF9PRkZTKHIsIGJhc2UsIGkpIFwKIAkJZG8geyBQUENfTEkzMihyLCBpKTsgUFBDX0xIQlJYKHIsIHIsIGJhc2UpOyB9IHdoaWxlKDApCiAjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF82NC5TIGIvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0XzY0LlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmODdkOTIuLjAwMDAwMDAKLS0tIGEvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0XzY0LlMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyogYnBmX2ppdC5TOiBQYWNrZXQvaGVhZGVyIGFjY2VzcyBoZWxwZXIgZnVuY3Rpb25zCi0gKiBmb3IgUFBDNjQgQlBGIGNvbXBpbGVyLgotICoKLSAqIENvcHlyaWdodCAyMDExIE1hdHQgRXZhbnMgPG1hdHRAb3psYWJzLm9yZz4sIElCTSBDb3Jwb3JhdGlvbgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyCi0gKiBvZiB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KLSNpbmNsdWRlICJicGZfaml0LmgiCi0KLS8qCi0gKiBBbGwgb2YgdGhlc2Ugcm91dGluZXMgYXJlIGNhbGxlZCBkaXJlY3RseSBmcm9tIGdlbmVyYXRlZCBjb2RlLAotICogd2hvc2UgcmVnaXN0ZXIgdXNhZ2UgaXM6Ci0gKgotICogcjMJCXNrYgotICogcjQscjUJQSxYCi0gKiByNgkJKioqIGFkZHJlc3MgcGFyYW1ldGVyIHRvIGhlbHBlciAqKioKLSAqIHI3LXIxMAlzY3JhdGNoCi0gKiByMTQJCXNrYi0+ZGF0YQotICogcjE1CQlza2IgaGVhZGxlbgotICogcjE2LTMxCU1bXQotICovCi0KLS8qCi0gKiBUbyBjb25zaWRlcjogVGhlc2UgaGVscGVycyBhcmUgc28gc21hbGwgaXQgY291bGQgYmUgYmV0dGVyIHRvIGp1c3QKLSAqIGdlbmVyYXRlIHRoZW0gaW5saW5lLiAgSW5saW5lIGNvZGUgY2FuIGRvIHRoZSBzaW1wbGUgaGVhZGxlbiBjaGVjawotICogdGhlbiBicmFuY2ggZGlyZWN0bHkgdG8gc2xvd19wYXRoX1hYWCBpZiByZXF1aXJlZC4gIChJbiBmYWN0LCBjb3VsZAotICogbG9hZCBhIHNwYXJlIEdQUiB3aXRoIHRoZSBhZGRyZXNzIG9mIHNsb3dfcGF0aF9nZW5lcmljIGFuZCBwYXNzIHNpemUKLSAqIGFzIGFuIGFyZ3VtZW50LCBtYWtpbmcgdGhlIGNhbGwgc2l0ZSBhIG10bHIsIGxpIGFuZCBibGxyLikKLSAqLwotCS5nbG9ibAlza19sb2FkX3dvcmQKLXNrX2xvYWRfd29yZDoKLQljbXBkaQlyX2FkZHIsIDAKLQlibHQJYnBmX3Nsb3dfcGF0aF93b3JkX25lZwotCS5nbG9ibAlza19sb2FkX3dvcmRfcG9zaXRpdmVfb2Zmc2V0Ci1za19sb2FkX3dvcmRfcG9zaXRpdmVfb2Zmc2V0OgotCS8qIEFyZSB3ZSBhY2Nlc3NpbmcgcGFzdCBoZWFkbGVuPyAqLwotCXN1YmkJcl9zY3JhdGNoMSwgcl9ITCwgNAotCWNtcGQJcl9zY3JhdGNoMSwgcl9hZGRyCi0JYmx0CWJwZl9zbG93X3BhdGhfd29yZAotCS8qIE5vcGUsIGp1c3QgaGl0dGluZyB0aGUgaGVhZGVyLiAgY3IwIGhlcmUgaXMgZXEgb3IgZ3QhICovCi0jaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KLQlsd2JyeAlyX0EsIHJfRCwgcl9hZGRyCi0jZWxzZQotCWx3engJcl9BLCByX0QsIHJfYWRkcgotI2VuZGlmCi0JYmxyCS8qIFJldHVybiBzdWNjZXNzLCBjcjAgIT0gTFQgKi8KLQotCS5nbG9ibAlza19sb2FkX2hhbGYKLXNrX2xvYWRfaGFsZjoKLQljbXBkaQlyX2FkZHIsIDAKLQlibHQJYnBmX3Nsb3dfcGF0aF9oYWxmX25lZwotCS5nbG9ibAlza19sb2FkX2hhbGZfcG9zaXRpdmVfb2Zmc2V0Ci1za19sb2FkX2hhbGZfcG9zaXRpdmVfb2Zmc2V0OgotCXN1YmkJcl9zY3JhdGNoMSwgcl9ITCwgMgotCWNtcGQJcl9zY3JhdGNoMSwgcl9hZGRyCi0JYmx0CWJwZl9zbG93X3BhdGhfaGFsZgotI2lmZGVmIF9fTElUVExFX0VORElBTl9fCi0JbGhicngJcl9BLCByX0QsIHJfYWRkcgotI2Vsc2UKLQlsaHp4CXJfQSwgcl9ELCByX2FkZHIKLSNlbmRpZgotCWJscgotCi0JLmdsb2JsCXNrX2xvYWRfYnl0ZQotc2tfbG9hZF9ieXRlOgotCWNtcGRpCXJfYWRkciwgMAotCWJsdAlicGZfc2xvd19wYXRoX2J5dGVfbmVnCi0JLmdsb2JsCXNrX2xvYWRfYnl0ZV9wb3NpdGl2ZV9vZmZzZXQKLXNrX2xvYWRfYnl0ZV9wb3NpdGl2ZV9vZmZzZXQ6Ci0JY21wZAlyX0hMLCByX2FkZHIKLQlibGUJYnBmX3Nsb3dfcGF0aF9ieXRlCi0JbGJ6eAlyX0EsIHJfRCwgcl9hZGRyCi0JYmxyCi0KLS8qCi0gKiBCUEZfTERYIHwgQlBGX0IgfCBCUEZfTVNIOiBsZHhiICA0Kihbb2Zmc2V0XSYweGYpCi0gKiByX2FkZHIgaXMgdGhlIG9mZnNldCB2YWx1ZQotICovCi0JLmdsb2JsIHNrX2xvYWRfYnl0ZV9tc2gKLXNrX2xvYWRfYnl0ZV9tc2g6Ci0JY21wZGkJcl9hZGRyLCAwCi0JYmx0CWJwZl9zbG93X3BhdGhfYnl0ZV9tc2hfbmVnCi0JLmdsb2JsIHNrX2xvYWRfYnl0ZV9tc2hfcG9zaXRpdmVfb2Zmc2V0Ci1za19sb2FkX2J5dGVfbXNoX3Bvc2l0aXZlX29mZnNldDoKLQljbXBkCXJfSEwsIHJfYWRkcgotCWJsZQlicGZfc2xvd19wYXRoX2J5dGVfbXNoCi0JbGJ6eAlyX1gsIHJfRCwgcl9hZGRyCi0Jcmx3aW5tCXJfWCwgcl9YLCAyLCAzMi00LTIsIDMxLTIKLQlibHIKLQotLyogQ2FsbCBvdXQgdG8gc2tiX2NvcHlfYml0czoKLSAqIFdlJ2xsIG5lZWQgdG8gYmFjayB1cCBvdXIgdm9sYXRpbGUgcmVncyBmaXJzdDsgd2UgaGF2ZQotICogbG9jYWwgdmFyaWFibGUgc3BhY2UgYXQgcjErKEJQRl9QUENfU1RBQ0tfQkFTSUMpLgotICogQWxsb2NhdGUgYSBuZXcgc3RhY2sgZnJhbWUgaGVyZSB0byByZW1haW4gQUJJLWNvbXBsaWFudCBpbgotICogc3Rhc2hpbmcgTFIuCi0gKi8KLSNkZWZpbmUgYnBmX3Nsb3dfcGF0aF9jb21tb24oU0laRSkJCQkJXAotCW1mbHIJcjA7CQkJCQkJXAotCXN0ZAlyMCwgMTYocjEpOwkJCQkJXAotCS8qIFIzIGdvZXMgaW4gcGFyYW1ldGVyIHNwYWNlIG9mIGNhbGxlcidzIGZyYW1lICovCVwKLQlzdGQJcl9za2IsIChCUEZfUFBDX1NUQUNLRlJBTUUrNDgpKHIxKTsJCVwKLQlzdGQJcl9BLCAoQlBGX1BQQ19TVEFDS19CQVNJQysoMCo4KSkocjEpOwkJXAotCXN0ZAlyX1gsIChCUEZfUFBDX1NUQUNLX0JBU0lDKygxKjgpKShyMSk7CQlcCi0JYWRkaQlyNSwgcjEsIEJQRl9QUENfU1RBQ0tfQkFTSUMrKDIqOCk7CQlcCi0Jc3RkdQlyMSwgLUJQRl9QUENfU0xPV1BBVEhfRlJBTUUocjEpOwkJXAotCS8qIFIzID0gcl9za2IsIGFzIHBhc3NlZCAqLwkJCQlcCi0JbXIJcjQsIHJfYWRkcjsJCQkJCVwKLQlsaQlyNiwgU0laRTsJCQkJCVwKLQlibAlza2JfY29weV9iaXRzOwkJCQkJXAotCW5vcDsJCQkJCQkJXAotCS8qIFIzID0gMCBvbiBzdWNjZXNzICovCQkJCQlcCi0JYWRkaQlyMSwgcjEsIEJQRl9QUENfU0xPV1BBVEhfRlJBTUU7CQkJXAotCWxkCXIwLCAxNihyMSk7CQkJCQlcCi0JbGQJcl9BLCAoQlBGX1BQQ19TVEFDS19CQVNJQysoMCo4KSkocjEpOwkJXAotCWxkCXJfWCwgKEJQRl9QUENfU1RBQ0tfQkFTSUMrKDEqOCkpKHIxKTsJCVwKLQltdGxyCXIwOwkJCQkJCVwKLQljbXBkaQlyMywgMDsJCQkJCQlcCi0JYmx0CWJwZl9lcnJvcjsJLyogY3IwID0gTFQgKi8JCQlcCi0JbGQJcl9za2IsIChCUEZfUFBDX1NUQUNLRlJBTUUrNDgpKHIxKTsJCVwKLQkvKiBHcmVhdCBzdWNjZXNzISAqLwotCi1icGZfc2xvd19wYXRoX3dvcmQ6Ci0JYnBmX3Nsb3dfcGF0aF9jb21tb24oNCkKLQkvKiBEYXRhIHZhbHVlIGlzIG9uIHN0YWNrLCBhbmQgY3IwICE9IExUICovCi0JbHd6CXJfQSwgQlBGX1BQQ19TVEFDS19CQVNJQysoMio4KShyMSkKLQlibHIKLQotYnBmX3Nsb3dfcGF0aF9oYWxmOgotCWJwZl9zbG93X3BhdGhfY29tbW9uKDIpCi0JbGh6CXJfQSwgQlBGX1BQQ19TVEFDS19CQVNJQysoMio4KShyMSkKLQlibHIKLQotYnBmX3Nsb3dfcGF0aF9ieXRlOgotCWJwZl9zbG93X3BhdGhfY29tbW9uKDEpCi0JbGJ6CXJfQSwgQlBGX1BQQ19TVEFDS19CQVNJQysoMio4KShyMSkKLQlibHIKLQotYnBmX3Nsb3dfcGF0aF9ieXRlX21zaDoKLQlicGZfc2xvd19wYXRoX2NvbW1vbigxKQotCWxieglyX1gsIEJQRl9QUENfU1RBQ0tfQkFTSUMrKDIqOCkocjEpCi0Jcmx3aW5tCXJfWCwgcl9YLCAyLCAzMi00LTIsIDMxLTIKLQlibHIKLQotLyogQ2FsbCBvdXQgdG8gYnBmX2ludGVybmFsX2xvYWRfcG9pbnRlcl9uZWdfaGVscGVyOgotICogV2UnbGwgbmVlZCB0byBiYWNrIHVwIG91ciB2b2xhdGlsZSByZWdzIGZpcnN0OyB3ZSBoYXZlCi0gKiBsb2NhbCB2YXJpYWJsZSBzcGFjZSBhdCByMSsoQlBGX1BQQ19TVEFDS19CQVNJQykuCi0gKiBBbGxvY2F0ZSBhIG5ldyBzdGFjayBmcmFtZSBoZXJlIHRvIHJlbWFpbiBBQkktY29tcGxpYW50IGluCi0gKiBzdGFzaGluZyBMUi4KLSAqLwotI2RlZmluZSBza19uZWdhdGl2ZV9jb21tb24oU0laRSkJCQkJXAotCW1mbHIJcjA7CQkJCQkJXAotCXN0ZAlyMCwgMTYocjEpOwkJCQkJXAotCS8qIFIzIGdvZXMgaW4gcGFyYW1ldGVyIHNwYWNlIG9mIGNhbGxlcidzIGZyYW1lICovCVwKLQlzdGQJcl9za2IsIChCUEZfUFBDX1NUQUNLRlJBTUUrNDgpKHIxKTsJCVwKLQlzdGQJcl9BLCAoQlBGX1BQQ19TVEFDS19CQVNJQysoMCo4KSkocjEpOwkJXAotCXN0ZAlyX1gsIChCUEZfUFBDX1NUQUNLX0JBU0lDKygxKjgpKShyMSk7CQlcCi0Jc3RkdQlyMSwgLUJQRl9QUENfU0xPV1BBVEhfRlJBTUUocjEpOwkJXAotCS8qIFIzID0gcl9za2IsIGFzIHBhc3NlZCAqLwkJCQlcCi0JbXIJcjQsIHJfYWRkcjsJCQkJCVwKLQlsaQlyNSwgU0laRTsJCQkJCVwKLQlibAlicGZfaW50ZXJuYWxfbG9hZF9wb2ludGVyX25lZ19oZWxwZXI7CQlcCi0Jbm9wOwkJCQkJCQlcCi0JLyogUjMgIT0gMCBvbiBzdWNjZXNzICovCQkJCVwKLQlhZGRpCXIxLCByMSwgQlBGX1BQQ19TTE9XUEFUSF9GUkFNRTsJCQlcCi0JbGQJcjAsIDE2KHIxKTsJCQkJCVwKLQlsZAlyX0EsIChCUEZfUFBDX1NUQUNLX0JBU0lDKygwKjgpKShyMSk7CQlcCi0JbGQJcl9YLCAoQlBGX1BQQ19TVEFDS19CQVNJQysoMSo4KSkocjEpOwkJXAotCW10bHIJcjA7CQkJCQkJXAotCWNtcGxkaQlyMywgMDsJCQkJCQlcCi0JYmVxCWJwZl9lcnJvcl9zbG93OwkvKiBjcjAgPSBFUSAqLwkJCVwKLQltcglyX2FkZHIsIHIzOwkJCQkJXAotCWxkCXJfc2tiLCAoQlBGX1BQQ19TVEFDS0ZSQU1FKzQ4KShyMSk7CQlcCi0JLyogR3JlYXQgc3VjY2VzcyEgKi8KLQotYnBmX3Nsb3dfcGF0aF93b3JkX25lZzoKLQlsaXMgICAgIHJfc2NyYXRjaDEsLTMyCS8qIFNLRl9MTF9PRkYgKi8KLQljbXBkCXJfYWRkciwgcl9zY3JhdGNoMQkvKiBhZGRyIDwgU0tGXyogKi8KLQlibHQJYnBmX2Vycm9yCS8qIGNyMCA9IExUICovCi0JLmdsb2JsCXNrX2xvYWRfd29yZF9uZWdhdGl2ZV9vZmZzZXQKLXNrX2xvYWRfd29yZF9uZWdhdGl2ZV9vZmZzZXQ6Ci0Jc2tfbmVnYXRpdmVfY29tbW9uKDQpCi0JbHd6CXJfQSwgMChyX2FkZHIpCi0JYmxyCi0KLWJwZl9zbG93X3BhdGhfaGFsZl9uZWc6Ci0JbGlzICAgICByX3NjcmF0Y2gxLC0zMgkvKiBTS0ZfTExfT0ZGICovCi0JY21wZAlyX2FkZHIsIHJfc2NyYXRjaDEJLyogYWRkciA8IFNLRl8qICovCi0JYmx0CWJwZl9lcnJvcgkvKiBjcjAgPSBMVCAqLwotCS5nbG9ibAlza19sb2FkX2hhbGZfbmVnYXRpdmVfb2Zmc2V0Ci1za19sb2FkX2hhbGZfbmVnYXRpdmVfb2Zmc2V0OgotCXNrX25lZ2F0aXZlX2NvbW1vbigyKQotCWxoeglyX0EsIDAocl9hZGRyKQotCWJscgotCi1icGZfc2xvd19wYXRoX2J5dGVfbmVnOgotCWxpcyAgICAgcl9zY3JhdGNoMSwtMzIJLyogU0tGX0xMX09GRiAqLwotCWNtcGQJcl9hZGRyLCByX3NjcmF0Y2gxCS8qIGFkZHIgPCBTS0ZfKiAqLwotCWJsdAlicGZfZXJyb3IJLyogY3IwID0gTFQgKi8KLQkuZ2xvYmwJc2tfbG9hZF9ieXRlX25lZ2F0aXZlX29mZnNldAotc2tfbG9hZF9ieXRlX25lZ2F0aXZlX29mZnNldDoKLQlza19uZWdhdGl2ZV9jb21tb24oMSkKLQlsYnoJcl9BLCAwKHJfYWRkcikKLQlibHIKLQotYnBmX3Nsb3dfcGF0aF9ieXRlX21zaF9uZWc6Ci0JbGlzICAgICByX3NjcmF0Y2gxLC0zMgkvKiBTS0ZfTExfT0ZGICovCi0JY21wZAlyX2FkZHIsIHJfc2NyYXRjaDEJLyogYWRkciA8IFNLRl8qICovCi0JYmx0CWJwZl9lcnJvcgkvKiBjcjAgPSBMVCAqLwotCS5nbG9ibAlza19sb2FkX2J5dGVfbXNoX25lZ2F0aXZlX29mZnNldAotc2tfbG9hZF9ieXRlX21zaF9uZWdhdGl2ZV9vZmZzZXQ6Ci0Jc2tfbmVnYXRpdmVfY29tbW9uKDEpCi0JbGJ6CXJfWCwgMChyX2FkZHIpCi0Jcmx3aW5tCXJfWCwgcl9YLCAyLCAzMi00LTIsIDMxLTIKLQlibHIKLQotYnBmX2Vycm9yX3Nsb3c6Ci0JLyogZmFicmljYXRlIGEgY3IwID0gbHQgKi8KLQlsaQlyX3NjcmF0Y2gxLCAtMQotCWNtcGRpCXJfc2NyYXRjaDEsIDAKLWJwZl9lcnJvcjoKLQkvKiBFbnRlcmVkIHdpdGggY3IwID0gbHQgKi8KLQlsaQlyMywgMAotCS8qIEdlbmVyYXRlZCBjb2RlIHdpbGwgJ2JsdCBlcGlsb2d1ZScsIHJldHVybmluZyAwLiAqLwotCWJscgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0X2FzbS5TIGIvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0X2FzbS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZjVhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfYXNtLlMKQEAgLTAsMCArMSwyMjkgQEAKKy8qIGJwZl9qaXQuUzogUGFja2V0L2hlYWRlciBhY2Nlc3MgaGVscGVyIGZ1bmN0aW9ucworICogZm9yIFBQQzY0IEJQRiBjb21waWxlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBNYXR0IEV2YW5zIDxtYXR0QG96bGFicy5vcmc+LCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CisjaW5jbHVkZSAiYnBmX2ppdC5oIgorCisvKgorICogQWxsIG9mIHRoZXNlIHJvdXRpbmVzIGFyZSBjYWxsZWQgZGlyZWN0bHkgZnJvbSBnZW5lcmF0ZWQgY29kZSwKKyAqIHdob3NlIHJlZ2lzdGVyIHVzYWdlIGlzOgorICoKKyAqIHIzCQlza2IKKyAqIHI0LHI1CUEsWAorICogcjYJCSoqKiBhZGRyZXNzIHBhcmFtZXRlciB0byBoZWxwZXIgKioqCisgKiByNy1yMTAJc2NyYXRjaAorICogcjE0CQlza2ItPmRhdGEKKyAqIHIxNQkJc2tiIGhlYWRsZW4KKyAqIHIxNi0zMQlNW10KKyAqLworCisvKgorICogVG8gY29uc2lkZXI6IFRoZXNlIGhlbHBlcnMgYXJlIHNvIHNtYWxsIGl0IGNvdWxkIGJlIGJldHRlciB0byBqdXN0CisgKiBnZW5lcmF0ZSB0aGVtIGlubGluZS4gIElubGluZSBjb2RlIGNhbiBkbyB0aGUgc2ltcGxlIGhlYWRsZW4gY2hlY2sKKyAqIHRoZW4gYnJhbmNoIGRpcmVjdGx5IHRvIHNsb3dfcGF0aF9YWFggaWYgcmVxdWlyZWQuICAoSW4gZmFjdCwgY291bGQKKyAqIGxvYWQgYSBzcGFyZSBHUFIgd2l0aCB0aGUgYWRkcmVzcyBvZiBzbG93X3BhdGhfZ2VuZXJpYyBhbmQgcGFzcyBzaXplCisgKiBhcyBhbiBhcmd1bWVudCwgbWFraW5nIHRoZSBjYWxsIHNpdGUgYSBtdGxyLCBsaSBhbmQgYmxsci4pCisgKi8KKwkuZ2xvYmwJc2tfbG9hZF93b3JkCitza19sb2FkX3dvcmQ6CisJUFBDX0xDTVBJCXJfYWRkciwgMAorCWJsdAlicGZfc2xvd19wYXRoX3dvcmRfbmVnCisJLmdsb2JsCXNrX2xvYWRfd29yZF9wb3NpdGl2ZV9vZmZzZXQKK3NrX2xvYWRfd29yZF9wb3NpdGl2ZV9vZmZzZXQ6CisJLyogQXJlIHdlIGFjY2Vzc2luZyBwYXN0IGhlYWRsZW4/ICovCisJc3ViaQlyX3NjcmF0Y2gxLCByX0hMLCA0CisJUFBDX0xDTVAJcl9zY3JhdGNoMSwgcl9hZGRyCisJYmx0CWJwZl9zbG93X3BhdGhfd29yZAorCS8qIE5vcGUsIGp1c3QgaGl0dGluZyB0aGUgaGVhZGVyLiAgY3IwIGhlcmUgaXMgZXEgb3IgZ3QhICovCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKwlsd2JyeAlyX0EsIHJfRCwgcl9hZGRyCisjZWxzZQorCWx3engJcl9BLCByX0QsIHJfYWRkcgorI2VuZGlmCisJYmxyCS8qIFJldHVybiBzdWNjZXNzLCBjcjAgIT0gTFQgKi8KKworCS5nbG9ibAlza19sb2FkX2hhbGYKK3NrX2xvYWRfaGFsZjoKKwlQUENfTENNUEkJcl9hZGRyLCAwCisJYmx0CWJwZl9zbG93X3BhdGhfaGFsZl9uZWcKKwkuZ2xvYmwJc2tfbG9hZF9oYWxmX3Bvc2l0aXZlX29mZnNldAorc2tfbG9hZF9oYWxmX3Bvc2l0aXZlX29mZnNldDoKKwlzdWJpCXJfc2NyYXRjaDEsIHJfSEwsIDIKKwlQUENfTENNUAlyX3NjcmF0Y2gxLCByX2FkZHIKKwlibHQJYnBmX3Nsb3dfcGF0aF9oYWxmCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOX18KKwlsaGJyeAlyX0EsIHJfRCwgcl9hZGRyCisjZWxzZQorCWxoengJcl9BLCByX0QsIHJfYWRkcgorI2VuZGlmCisJYmxyCisKKwkuZ2xvYmwJc2tfbG9hZF9ieXRlCitza19sb2FkX2J5dGU6CisJUFBDX0xDTVBJCXJfYWRkciwgMAorCWJsdAlicGZfc2xvd19wYXRoX2J5dGVfbmVnCisJLmdsb2JsCXNrX2xvYWRfYnl0ZV9wb3NpdGl2ZV9vZmZzZXQKK3NrX2xvYWRfYnl0ZV9wb3NpdGl2ZV9vZmZzZXQ6CisJUFBDX0xDTVAJcl9ITCwgcl9hZGRyCisJYmxlCWJwZl9zbG93X3BhdGhfYnl0ZQorCWxiengJcl9BLCByX0QsIHJfYWRkcgorCWJscgorCisvKgorICogQlBGX0xEWCB8IEJQRl9CIHwgQlBGX01TSDogbGR4YiAgNCooW29mZnNldF0mMHhmKQorICogcl9hZGRyIGlzIHRoZSBvZmZzZXQgdmFsdWUKKyAqLworCS5nbG9ibCBza19sb2FkX2J5dGVfbXNoCitza19sb2FkX2J5dGVfbXNoOgorCVBQQ19MQ01QSQlyX2FkZHIsIDAKKwlibHQJYnBmX3Nsb3dfcGF0aF9ieXRlX21zaF9uZWcKKwkuZ2xvYmwgc2tfbG9hZF9ieXRlX21zaF9wb3NpdGl2ZV9vZmZzZXQKK3NrX2xvYWRfYnl0ZV9tc2hfcG9zaXRpdmVfb2Zmc2V0OgorCVBQQ19MQ01QCXJfSEwsIHJfYWRkcgorCWJsZQlicGZfc2xvd19wYXRoX2J5dGVfbXNoCisJbGJ6eAlyX1gsIHJfRCwgcl9hZGRyCisJcmx3aW5tCXJfWCwgcl9YLCAyLCAzMi00LTIsIDMxLTIKKwlibHIKKworLyogQ2FsbCBvdXQgdG8gc2tiX2NvcHlfYml0czoKKyAqIFdlJ2xsIG5lZWQgdG8gYmFjayB1cCBvdXIgdm9sYXRpbGUgcmVncyBmaXJzdDsgd2UgaGF2ZQorICogbG9jYWwgdmFyaWFibGUgc3BhY2UgYXQgcjErKEJQRl9QUENfU1RBQ0tfQkFTSUMpLgorICogQWxsb2NhdGUgYSBuZXcgc3RhY2sgZnJhbWUgaGVyZSB0byByZW1haW4gQUJJLWNvbXBsaWFudCBpbgorICogc3Rhc2hpbmcgTFIuCisgKi8KKyNkZWZpbmUgYnBmX3Nsb3dfcGF0aF9jb21tb24oU0laRSkJCQkJXAorCW1mbHIJcjA7CQkJCQkJXAorCVBQQ19TVEwJcjAsIFBQQ19MUl9TVEtPRkYocjEpOwkJCQkJXAorCS8qIFIzIGdvZXMgaW4gcGFyYW1ldGVyIHNwYWNlIG9mIGNhbGxlcidzIGZyYW1lICovCVwKKwlQUENfU1RMCXJfc2tiLCAoQlBGX1BQQ19TVEFDS0ZSQU1FK0JQRl9QUENfU1RBQ0tfUjNfT0ZGKShyMSk7CQlcCisJUFBDX1NUTAlyX0EsIChCUEZfUFBDX1NUQUNLX0JBU0lDKygwKlJFR19TWikpKHIxKTsJCVwKKwlQUENfU1RMCXJfWCwgKEJQRl9QUENfU1RBQ0tfQkFTSUMrKDEqUkVHX1NaKSkocjEpOwkJXAorCWFkZGkJcjUsIHIxLCBCUEZfUFBDX1NUQUNLX0JBU0lDKygyKlJFR19TWik7CQlcCisJUFBDX1NUTFUJcjEsIC1CUEZfUFBDX1NMT1dQQVRIX0ZSQU1FKHIxKTsJCVwKKwkvKiBSMyA9IHJfc2tiLCBhcyBwYXNzZWQgKi8JCQkJXAorCW1yCXI0LCByX2FkZHI7CQkJCQlcCisJbGkJcjYsIFNJWkU7CQkJCQlcCisJYmwJc2tiX2NvcHlfYml0czsJCQkJCVwKKwlub3A7CQkJCQkJCVwKKwkvKiBSMyA9IDAgb24gc3VjY2VzcyAqLwkJCQkJXAorCWFkZGkJcjEsIHIxLCBCUEZfUFBDX1NMT1dQQVRIX0ZSQU1FOwkJCVwKKwlQUENfTEwJcjAsIFBQQ19MUl9TVEtPRkYocjEpOwkJCQkJXAorCVBQQ19MTAlyX0EsIChCUEZfUFBDX1NUQUNLX0JBU0lDKygwKlJFR19TWikpKHIxKTsJCVwKKwlQUENfTEwJcl9YLCAoQlBGX1BQQ19TVEFDS19CQVNJQysoMSpSRUdfU1opKShyMSk7CQlcCisJbXRscglyMDsJCQkJCQlcCisJUFBDX0xDTVBJCXIzLCAwOwkJCQkJCVwKKwlibHQJYnBmX2Vycm9yOwkvKiBjcjAgPSBMVCAqLwkJCVwKKwlQUENfTEwJcl9za2IsIChCUEZfUFBDX1NUQUNLRlJBTUUrQlBGX1BQQ19TVEFDS19SM19PRkYpKHIxKTsJCVwKKwkvKiBHcmVhdCBzdWNjZXNzISAqLworCiticGZfc2xvd19wYXRoX3dvcmQ6CisJYnBmX3Nsb3dfcGF0aF9jb21tb24oNCkKKwkvKiBEYXRhIHZhbHVlIGlzIG9uIHN0YWNrLCBhbmQgY3IwICE9IExUICovCisJbHd6CXJfQSwgQlBGX1BQQ19TVEFDS19CQVNJQysoMipSRUdfU1opKHIxKQorCWJscgorCiticGZfc2xvd19wYXRoX2hhbGY6CisJYnBmX3Nsb3dfcGF0aF9jb21tb24oMikKKwlsaHoJcl9BLCBCUEZfUFBDX1NUQUNLX0JBU0lDKygyKjgpKHIxKQorCWJscgorCiticGZfc2xvd19wYXRoX2J5dGU6CisJYnBmX3Nsb3dfcGF0aF9jb21tb24oMSkKKwlsYnoJcl9BLCBCUEZfUFBDX1NUQUNLX0JBU0lDKygyKjgpKHIxKQorCWJscgorCiticGZfc2xvd19wYXRoX2J5dGVfbXNoOgorCWJwZl9zbG93X3BhdGhfY29tbW9uKDEpCisJbGJ6CXJfWCwgQlBGX1BQQ19TVEFDS19CQVNJQysoMio4KShyMSkKKwlybHdpbm0Jcl9YLCByX1gsIDIsIDMyLTQtMiwgMzEtMgorCWJscgorCisvKiBDYWxsIG91dCB0byBicGZfaW50ZXJuYWxfbG9hZF9wb2ludGVyX25lZ19oZWxwZXI6CisgKiBXZSdsbCBuZWVkIHRvIGJhY2sgdXAgb3VyIHZvbGF0aWxlIHJlZ3MgZmlyc3Q7IHdlIGhhdmUKKyAqIGxvY2FsIHZhcmlhYmxlIHNwYWNlIGF0IHIxKyhCUEZfUFBDX1NUQUNLX0JBU0lDKS4KKyAqIEFsbG9jYXRlIGEgbmV3IHN0YWNrIGZyYW1lIGhlcmUgdG8gcmVtYWluIEFCSS1jb21wbGlhbnQgaW4KKyAqIHN0YXNoaW5nIExSLgorICovCisjZGVmaW5lIHNrX25lZ2F0aXZlX2NvbW1vbihTSVpFKQkJCQlcCisJbWZscglyMDsJCQkJCQlcCisJUFBDX1NUTAlyMCwgUFBDX0xSX1NUS09GRihyMSk7CQkJCQlcCisJLyogUjMgZ29lcyBpbiBwYXJhbWV0ZXIgc3BhY2Ugb2YgY2FsbGVyJ3MgZnJhbWUgKi8JXAorCVBQQ19TVEwJcl9za2IsIChCUEZfUFBDX1NUQUNLRlJBTUUrQlBGX1BQQ19TVEFDS19SM19PRkYpKHIxKTsJCVwKKwlQUENfU1RMCXJfQSwgKEJQRl9QUENfU1RBQ0tfQkFTSUMrKDAqUkVHX1NaKSkocjEpOwkJXAorCVBQQ19TVEwJcl9YLCAoQlBGX1BQQ19TVEFDS19CQVNJQysoMSpSRUdfU1opKShyMSk7CQlcCisJUFBDX1NUTFUJcjEsIC1CUEZfUFBDX1NMT1dQQVRIX0ZSQU1FKHIxKTsJCVwKKwkvKiBSMyA9IHJfc2tiLCBhcyBwYXNzZWQgKi8JCQkJXAorCW1yCXI0LCByX2FkZHI7CQkJCQlcCisJbGkJcjUsIFNJWkU7CQkJCQlcCisJYmwJYnBmX2ludGVybmFsX2xvYWRfcG9pbnRlcl9uZWdfaGVscGVyOwkJXAorCW5vcDsJCQkJCQkJXAorCS8qIFIzICE9IDAgb24gc3VjY2VzcyAqLwkJCQlcCisJYWRkaQlyMSwgcjEsIEJQRl9QUENfU0xPV1BBVEhfRlJBTUU7CQkJXAorCVBQQ19MTAlyMCwgUFBDX0xSX1NUS09GRihyMSk7CQkJCQlcCisJUFBDX0xMCXJfQSwgKEJQRl9QUENfU1RBQ0tfQkFTSUMrKDAqUkVHX1NaKSkocjEpOwkJXAorCVBQQ19MTAlyX1gsIChCUEZfUFBDX1NUQUNLX0JBU0lDKygxKlJFR19TWikpKHIxKTsJCVwKKwltdGxyCXIwOwkJCQkJCVwKKwlQUENfTENNUExJCXIzLCAwOwkJCQkJCVwKKwliZXEJYnBmX2Vycm9yX3Nsb3c7CS8qIGNyMCA9IEVRICovCQkJXAorCW1yCXJfYWRkciwgcjM7CQkJCQlcCisJUFBDX0xMCXJfc2tiLCAoQlBGX1BQQ19TVEFDS0ZSQU1FK0JQRl9QUENfU1RBQ0tfUjNfT0ZGKShyMSk7CQlcCisJLyogR3JlYXQgc3VjY2VzcyEgKi8KKworYnBmX3Nsb3dfcGF0aF93b3JkX25lZzoKKwlsaXMgICAgIHJfc2NyYXRjaDEsLTMyCS8qIFNLRl9MTF9PRkYgKi8KKwlQUENfTENNUAlyX2FkZHIsIHJfc2NyYXRjaDEJLyogYWRkciA8IFNLRl8qICovCisJYmx0CWJwZl9lcnJvcgkvKiBjcjAgPSBMVCAqLworCS5nbG9ibAlza19sb2FkX3dvcmRfbmVnYXRpdmVfb2Zmc2V0Citza19sb2FkX3dvcmRfbmVnYXRpdmVfb2Zmc2V0OgorCXNrX25lZ2F0aXZlX2NvbW1vbig0KQorCWx3eglyX0EsIDAocl9hZGRyKQorCWJscgorCiticGZfc2xvd19wYXRoX2hhbGZfbmVnOgorCWxpcyAgICAgcl9zY3JhdGNoMSwtMzIJLyogU0tGX0xMX09GRiAqLworCVBQQ19MQ01QCXJfYWRkciwgcl9zY3JhdGNoMQkvKiBhZGRyIDwgU0tGXyogKi8KKwlibHQJYnBmX2Vycm9yCS8qIGNyMCA9IExUICovCisJLmdsb2JsCXNrX2xvYWRfaGFsZl9uZWdhdGl2ZV9vZmZzZXQKK3NrX2xvYWRfaGFsZl9uZWdhdGl2ZV9vZmZzZXQ6CisJc2tfbmVnYXRpdmVfY29tbW9uKDIpCisJbGh6CXJfQSwgMChyX2FkZHIpCisJYmxyCisKK2JwZl9zbG93X3BhdGhfYnl0ZV9uZWc6CisJbGlzICAgICByX3NjcmF0Y2gxLC0zMgkvKiBTS0ZfTExfT0ZGICovCisJUFBDX0xDTVAJcl9hZGRyLCByX3NjcmF0Y2gxCS8qIGFkZHIgPCBTS0ZfKiAqLworCWJsdAlicGZfZXJyb3IJLyogY3IwID0gTFQgKi8KKwkuZ2xvYmwJc2tfbG9hZF9ieXRlX25lZ2F0aXZlX29mZnNldAorc2tfbG9hZF9ieXRlX25lZ2F0aXZlX29mZnNldDoKKwlza19uZWdhdGl2ZV9jb21tb24oMSkKKwlsYnoJcl9BLCAwKHJfYWRkcikKKwlibHIKKworYnBmX3Nsb3dfcGF0aF9ieXRlX21zaF9uZWc6CisJbGlzICAgICByX3NjcmF0Y2gxLC0zMgkvKiBTS0ZfTExfT0ZGICovCisJUFBDX0xDTVAJcl9hZGRyLCByX3NjcmF0Y2gxCS8qIGFkZHIgPCBTS0ZfKiAqLworCWJsdAlicGZfZXJyb3IJLyogY3IwID0gTFQgKi8KKwkuZ2xvYmwJc2tfbG9hZF9ieXRlX21zaF9uZWdhdGl2ZV9vZmZzZXQKK3NrX2xvYWRfYnl0ZV9tc2hfbmVnYXRpdmVfb2Zmc2V0OgorCXNrX25lZ2F0aXZlX2NvbW1vbigxKQorCWxieglyX1gsIDAocl9hZGRyKQorCXJsd2lubQlyX1gsIHJfWCwgMiwgMzItNC0yLCAzMS0yCisJYmxyCisKK2JwZl9lcnJvcl9zbG93OgorCS8qIGZhYnJpY2F0ZSBhIGNyMCA9IGx0ICovCisJbGkJcl9zY3JhdGNoMSwgLTEKKwlQUENfTENNUEkJcl9zY3JhdGNoMSwgMAorYnBmX2Vycm9yOgorCS8qIEVudGVyZWQgd2l0aCBjcjAgPSBsdCAqLworCWxpCXIzLCAwCisJLyogR2VuZXJhdGVkIGNvZGUgd2lsbCAnYmx0IGVwaWxvZ3VlJywgcmV0dXJuaW5nIDAuICovCisJYmxyCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jIGIvYXJjaC9wb3dlcnBjL25ldC9icGZfaml0X2NvbXAuYwppbmRleCBkMTkxNmI1Li4xN2NlYTE4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbmV0L2JwZl9qaXRfY29tcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9uZXQvYnBmX2ppdF9jb21wLmMKQEAgLTEsOCArMSw5IEBACi0vKiBicGZfaml0X2NvbXAuYzogQlBGIEpJVCBjb21waWxlciBmb3IgUFBDNjQKKy8qIGJwZl9qaXRfY29tcC5jOiBCUEYgSklUIGNvbXBpbGVyCiAgKgogICogQ29weXJpZ2h0IDIwMTEgTWF0dCBFdmFucyA8bWF0dEBvemxhYnMub3JnPiwgSUJNIENvcnBvcmF0aW9uCiAgKgogICogQmFzZWQgb24gdGhlIHg4NiBCUEYgY29tcGlsZXIsIGJ5IEVyaWMgRHVtYXpldCAoZXJpYy5kdW1hemV0QGdtYWlsLmNvbSkKKyAqIFBvcnRlZCB0byBwcGMzMiBieSBEZW5pcyBLaXJqYW5vdiA8a2RhQGxpbnV4LXBvd2VycGMub3JnPgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCkBAIC0zNiwxMSArMzcsMTEgQEAKIAkJaWYgKGN0eC0+c2VlbiAmIFNFRU5fREFUQVJFRikgewogCQkJLyogSWYgd2UgY2FsbCBhbnkgaGVscGVycyAoZm9yIGxvYWRzKSwgc2F2ZSBMUiAqLwogCQkJRU1JVChQUENfSU5TVF9NRkxSIHwgX19QUENfUlQoUjApKTsKLQkJCVBQQ19TVEQoMCwgMSwgMTYpOworCQkJUFBDX0JQRl9TVEwoMCwgMSwgUFBDX0xSX1NUS09GRik7CiAKIAkJCS8qIEJhY2sgdXAgbm9uLXZvbGF0aWxlIHJlZ3MuICovCi0JCQlQUENfU1REKHJfRCwgMSwgLSg4KigzMi1yX0QpKSk7Ci0JCQlQUENfU1REKHJfSEwsIDEsIC0oOCooMzItcl9ITCkpKTsKKwkJCVBQQ19CUEZfU1RMKHJfRCwgMSwgLShSRUdfU1oqKDMyLXJfRCkpKTsKKwkJCVBQQ19CUEZfU1RMKHJfSEwsIDEsIC0oUkVHX1NaKigzMi1yX0hMKSkpOwogCQl9CiAJCWlmIChjdHgtPnNlZW4gJiBTRUVOX01FTSkgewogCQkJLyoKQEAgLTQ5LDExICs1MCwxMCBAQAogCQkJICovCiAJCQlmb3IgKGkgPSByX007IGkgPCAocl9NKzE2KTsgaSsrKSB7CiAJCQkJaWYgKGN0eC0+c2VlbiAmICgxIDw8IChpLXJfTSkpKQotCQkJCQlQUENfU1REKGksIDEsIC0oOCooMzItaSkpKTsKKwkJCQkJUFBDX0JQRl9TVEwoaSwgMSwgLShSRUdfU1oqKDMyLWkpKSk7CiAJCQl9CiAJCX0KLQkJRU1JVChQUENfSU5TVF9TVERVIHwgX19QUENfUlMoUjEpIHwgX19QUENfUkEoUjEpIHwKLQkJICAgICAoLUJQRl9QUENfU1RBQ0tGUkFNRSAmIDB4ZmZmYykpOworCQlQUENfQlBGX1NUTFUoMSwgMSwgLUJQRl9QUENfU1RBQ0tGUkFNRSk7CiAJfQogCiAJaWYgKGN0eC0+c2VlbiAmIFNFRU5fREFUQVJFRikgewpAQCAtNjcsNyArNjcsNyBAQAogCQkJCQkJCSBkYXRhX2xlbikpOwogCQlQUENfTFdaX09GRlMocl9ITCwgcl9za2IsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBsZW4pKTsKIAkJUFBDX1NVQihyX0hMLCByX0hMLCByX3NjcmF0Y2gxKTsKLQkJUFBDX0xEX09GRlMocl9ELCByX3NrYiwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRhdGEpKTsKKwkJUFBDX0xMX09GRlMocl9ELCByX3NrYiwgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIGRhdGEpKTsKIAl9CiAKIAlpZiAoY3R4LT5zZWVuICYgU0VFTl9YUkVHKSB7CkBAIC05OSwxNiArOTksMTYgQEAKIAlpZiAoY3R4LT5zZWVuICYgKFNFRU5fTUVNIHwgU0VFTl9EQVRBUkVGKSkgewogCQlQUENfQURESSgxLCAxLCBCUEZfUFBDX1NUQUNLRlJBTUUpOwogCQlpZiAoY3R4LT5zZWVuICYgU0VFTl9EQVRBUkVGKSB7Ci0JCQlQUENfTEQoMCwgMSwgMTYpOworCQkJUFBDX0JQRl9MTCgwLCAxLCBQUENfTFJfU1RLT0ZGKTsKIAkJCVBQQ19NVExSKDApOwotCQkJUFBDX0xEKHJfRCwgMSwgLSg4KigzMi1yX0QpKSk7Ci0JCQlQUENfTEQocl9ITCwgMSwgLSg4KigzMi1yX0hMKSkpOworCQkJUFBDX0JQRl9MTChyX0QsIDEsIC0oUkVHX1NaKigzMi1yX0QpKSk7CisJCQlQUENfQlBGX0xMKHJfSEwsIDEsIC0oUkVHX1NaKigzMi1yX0hMKSkpOwogCQl9CiAJCWlmIChjdHgtPnNlZW4gJiBTRUVOX01FTSkgewogCQkJLyogUmVzdG9yZSBhbnkgc2F2ZWQgbm9uLXZvbCByZWdpc3RlcnMgKi8KIAkJCWZvciAoaSA9IHJfTTsgaSA8IChyX00rMTYpOyBpKyspIHsKIAkJCQlpZiAoY3R4LT5zZWVuICYgKDEgPDwgKGktcl9NKSkpCi0JCQkJCVBQQ19MRChpLCAxLCAtKDgqKDMyLWkpKSk7CisJCQkJCVBQQ19CUEZfTEwoaSwgMSwgLShSRUdfU1oqKDMyLWkpKSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0zNTUsNyArMzU1LDcgQEAKIAkJCQkJCWlmaW5kZXgpICE9IDQpOwogCQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmV0X2RldmljZSwKIAkJCQkJCXR5cGUpICE9IDIpOwotCQkJUFBDX0xEX09GRlMocl9zY3JhdGNoMSwgcl9za2IsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLAorCQkJUFBDX0xMX09GRlMocl9zY3JhdGNoMSwgcl9za2IsIG9mZnNldG9mKHN0cnVjdCBza19idWZmLAogCQkJCQkJCQlkZXYpKTsKIAkJCVBQQ19DTVBESShyX3NjcmF0Y2gxLCAwKTsKIAkJCWlmIChjdHgtPnBjX3JldDAgIT0gLTEpIHsKQEAgLTQxMSwyMCArNDExLDggQEAKIAkJCVBQQ19TUldJKHJfQSwgcl9BLCA1KTsKIAkJCWJyZWFrOwogCQljYXNlIEJQRl9BTkMgfCBTS0ZfQURfQ1BVOgotI2lmZGVmIENPTkZJR19TTVAKLQkJCS8qCi0JCQkgKiBQQUNBIHB0ciBpcyByMTM6Ci0JCQkgKiByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpID0gbG9jYWxfcGFjYS0+cGFjYV9pbmRleAotCQkJICovCi0JCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBwYWNhX3N0cnVjdCwKLQkJCQkJCSAgcGFjYV9pbmRleCkgIT0gMik7Ci0JCQlQUENfTEhaX09GRlMocl9BLCAxMywKLQkJCQkgICAgIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgcGFjYV9pbmRleCkpOwotI2Vsc2UKLQkJCVBQQ19MSShyX0EsIDApOwotI2VuZGlmCisJCQlQUENfQlBGX0xPQURfQ1BVKHJfQSk7CiAJCQlicmVhazsKLQogCQkJLyoqKiBBYnNvbHV0ZSBsb2FkcyBmcm9tIHBhY2tldCBoZWFkZXIvZGF0YSAqKiovCiAJCWNhc2UgQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTOgogCQkJZnVuYyA9IENIT09TRV9MT0FEX0ZVTkMoSywgc2tfbG9hZF93b3JkKTsKQEAgLTQzNyw3ICs0MjUsNyBAQAogCQljb21tb25fbG9hZDoKIAkJCS8qIExvYWQgZnJvbSBbS10uICovCiAJCQljdHgtPnNlZW4gfD0gU0VFTl9EQVRBUkVGOwotCQkJUFBDX0xJNjQocl9zY3JhdGNoMSwgZnVuYyk7CisJCQlQUENfRlVOQ19BRERSKHJfc2NyYXRjaDEsIGZ1bmMpOwogCQkJUFBDX01UTFIocl9zY3JhdGNoMSk7CiAJCQlQUENfTEkzMihyX2FkZHIsIEspOwogCQkJUFBDX0JMUkwoKTsKQEAgLTQ2Myw3ICs0NTEsNyBAQAogCQkJICogaW4gdGhlIGhlbHBlciBmdW5jdGlvbnMuCiAJCQkgKi8KIAkJCWN0eC0+c2VlbiB8PSBTRUVOX0RBVEFSRUYgfCBTRUVOX1hSRUc7Ci0JCQlQUENfTEk2NChyX3NjcmF0Y2gxLCBmdW5jKTsKKwkJCVBQQ19GVU5DX0FERFIocl9zY3JhdGNoMSwgZnVuYyk7CiAJCQlQUENfTVRMUihyX3NjcmF0Y2gxKTsKIAkJCVBQQ19BRERJKHJfYWRkciwgcl9YLCBJTU1fTChLKSk7CiAJCQlpZiAoSyA+PSAzMjc2OCkKQEAgLTY4NSw5ICs2NzMsMTEgQEAKIAogCWlmIChpbWFnZSkgewogCQlicGZfZmx1c2hfaWNhY2hlKGNvZGVfYmFzZSwgY29kZV9iYXNlICsgKHByb2dsZW4vNCkpOworI2lmZGVmIENPTkZJR19QUEM2NAogCQkvKiBGdW5jdGlvbiBkZXNjcmlwdG9yIG5hc3RpbmVzczogQWRkcmVzcyArIFRPQyAqLwogCQkoKHU2NCAqKWltYWdlKVswXSA9ICh1NjQpY29kZV9iYXNlOwogCQkoKHU2NCAqKWltYWdlKVsxXSA9IGxvY2FsX3BhY2EtPmtlcm5lbF90b2M7CisjZW5kaWYKIAkJZnAtPmJwZl9mdW5jID0gKHZvaWQgKilpbWFnZTsKIAkJZnAtPmppdGVkID0gdHJ1ZTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGVyZi9jb3JlLWJvb2szcy5jIGIvYXJjaC9wb3dlcnBjL3BlcmYvY29yZS1ib29rM3MuYwppbmRleCBiMTAxYzBiLi4xMmI2Mzg0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGVyZi9jb3JlLWJvb2szcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wZXJmL2NvcmUtYm9vazNzLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgcG93ZXJfcG11X2JocmJfZW5hYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBwb3dlcl9wbXVfYmhyYl9kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkge30KLXN0YXRpYyB2b2lkIHBvd2VyX3BtdV9mbHVzaF9icmFuY2hfc3RhY2sodm9pZCkge30KK3N0YXRpYyB2b2lkIHBvd2VyX3BtdV9zY2hlZF90YXNrKHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCwgYm9vbCBzY2hlZF9pbikge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBwb3dlcl9wbXVfYmhyYl9yZWFkKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVodykge30KIHN0YXRpYyB2b2lkIHBtYW9fcmVzdG9yZV93b3JrYXJvdW5kKGJvb2wgZWJiKSB7IH0KICNlbmRpZiAvKiBDT05GSUdfUFBDMzIgKi8KQEAgLTM1MCw2ICszNTAsNyBAQAogCQljcHVody0+YmhyYl9jb250ZXh0ID0gZXZlbnQtPmN0eDsKIAl9CiAJY3B1aHctPmJocmJfdXNlcnMrKzsKKwlwZXJmX3NjaGVkX2NiX2luYyhldmVudC0+Y3R4LT5wbXUpOwogfQogCiBzdGF0aWMgdm9pZCBwb3dlcl9wbXVfYmhyYl9kaXNhYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKQEAgLTM2MSw2ICszNjIsNyBAQAogCiAJY3B1aHctPmJocmJfdXNlcnMtLTsKIAlXQVJOX09OX09OQ0UoY3B1aHctPmJocmJfdXNlcnMgPCAwKTsKKwlwZXJmX3NjaGVkX2NiX2RlYyhldmVudC0+Y3R4LT5wbXUpOwogCiAJaWYgKCFjcHVody0+ZGlzYWJsZWQgJiYgIWNwdWh3LT5iaHJiX3VzZXJzKSB7CiAJCS8qIEJIUkIgY2Fubm90IGJlIHR1cm5lZCBvZmYgd2hlbiBvdGhlcgpAQCAtMzc1LDkgKzM3NywxMiBAQAogLyogQ2FsbGVkIGZyb20gY3R4c3cgdG8gcHJldmVudCBvbmUgcHJvY2VzcydzIGJyYW5jaCBlbnRyaWVzIHRvCiAgKiBtaW5nbGUgd2l0aCB0aGUgb3RoZXIgcHJvY2VzcydzIGVudHJpZXMgZHVyaW5nIGNvbnRleHQgc3dpdGNoLgogICovCi1zdGF0aWMgdm9pZCBwb3dlcl9wbXVfZmx1c2hfYnJhbmNoX3N0YWNrKHZvaWQpCitzdGF0aWMgdm9pZCBwb3dlcl9wbXVfc2NoZWRfdGFzayhzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgsIGJvb2wgc2NoZWRfaW4pCiB7Ci0JaWYgKHBwbXUtPmJocmJfbnIpCisJaWYgKCFwcG11LT5iaHJiX25yKQorCQlyZXR1cm47CisKKwlpZiAoc2NoZWRfaW4pCiAJCXBvd2VyX3BtdV9iaHJiX3Jlc2V0KCk7CiB9CiAvKiBDYWxjdWxhdGUgdGhlIHRvIGFkZHJlc3MgZm9yIGEgYnJhbmNoICovCkBAIC0xOTAzLDcgKzE5MDgsNyBAQAogCS5jYW5jZWxfdHhuCT0gcG93ZXJfcG11X2NhbmNlbF90eG4sCiAJLmNvbW1pdF90eG4JPSBwb3dlcl9wbXVfY29tbWl0X3R4biwKIAkuZXZlbnRfaWR4CT0gcG93ZXJfcG11X2V2ZW50X2lkeCwKLQkuZmx1c2hfYnJhbmNoX3N0YWNrID0gcG93ZXJfcG11X2ZsdXNoX2JyYW5jaF9zdGFjaywKKwkuc2NoZWRfdGFzawk9IHBvd2VyX3BtdV9zY2hlZF90YXNrLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuYyBiL2FyY2gvcG93ZXJwYy9wZXJmL2h2LTI0eDcuYwppbmRleCBmZjQxMzYxLi5lYzJlYjIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGVyZi9odi0yNHg3LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BlcmYvaHYtMjR4Ny5jCkBAIC0xMTkzLDcgKzExOTMsNyBAQAogCS8qIFBoeXNpY2FsIGRvbWFpbnMgJiBvdGhlciBscGFycyByZXF1aXJlIGV4dHJhIGNhcGFiaWxpdGllcyAqLwogCWlmICghY2Fwcy5jb2xsZWN0X3ByaXZpbGVnZWQgJiYgKGlzX3BoeXNpY2FsX2RvbWFpbihkb21haW4pIHx8CiAJCShldmVudF9nZXRfbHBhcihldmVudCkgIT0gZXZlbnRfZ2V0X2xwYXJfbWF4KCkpKSkgewotCQlwcl9kZXZlbCgiaHYgcGVybWlzaW9ucyBkaXNhbGxvdzogaXNfcGh5c2ljYWxfZG9tYWluOiVkLCBscGFyPTB4JWxseFxuIiwKKwkJcHJfZGV2ZWwoImh2IHBlcm1pc3Npb25zIGRpc2FsbG93OiBpc19waHlzaWNhbF9kb21haW46JWQsIGxwYXI9MHglbGx4XG4iLAogCQkJCWlzX3BoeXNpY2FsX2RvbWFpbihkb21haW4pLAogCQkJCWV2ZW50X2dldF9scGFyKGV2ZW50KSk7CiAJCXJldHVybiAtRUFDQ0VTOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX3Jkay5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX3Jkay5jCmluZGV4IDdhMTgwZjAuLjY4MDIzMmQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyMl9yZGsuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjJfcmRrLmMKQEAgLTUwLDE0ICs1MCwxNCBAQAogCS8qIE1hcCB0aGUgZ2xvYmFsIHV0aWxpdGllcyByZWdpc3RlcnMuICovCiAJZ3V0c19ucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscDEwMjItZ3V0cyIpOwogCWlmICghZ3V0c19ucCkgewotCQlwcl9lcnIoInAxMDIycmRrOiBtaXNzaW5nIGdsb2JhbCB1dGlsdGllcyBkZXZpY2Ugbm9kZVxuIik7CisJCXByX2VycigicDEwMjJyZGs6IG1pc3NpbmcgZ2xvYmFsIHV0aWxpdGllcyBkZXZpY2Ugbm9kZVxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlndXRzID0gb2ZfaW9tYXAoZ3V0c19ucCwgMCk7CiAJb2Zfbm9kZV9wdXQoZ3V0c19ucCk7CiAJaWYgKCFndXRzKSB7Ci0JCXByX2VycigicDEwMjJyZGs6IGNvdWxkIG5vdCBtYXAgZ2xvYmFsIHV0aWx0aWVzIGRldmljZVxuIik7CisJCXByX2VycigicDEwMjJyZGs6IGNvdWxkIG5vdCBtYXAgZ2xvYmFsIHV0aWxpdGllcyBkZXZpY2VcbiIpOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1wb3dlci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtcG93ZXIuYwppbmRleCA0OGJmNWIwLi5hYzQ2YzJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC1wb3dlci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXBvd2VyLmMKQEAgLTI5LDggKzI5LDkgQEAKIAogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgU09GVF9SRUJPT1Q6Ci0JCS8qIEZhbGwgdGhyb3VnaC4gVGhlIHNlcnZpY2UgcHJvY2Vzc29yIGlzIHJlc3BvbnNpYmxlIGZvcgotCQkgKiBicmluZ2luZyB0aGUgbWFjaGluZSBiYWNrIHVwICovCisJCXByX2luZm8oIk9QQUw6IHJlYm9vdCByZXF1ZXN0ZWRcbiIpOworCQlvcmRlcmx5X3JlYm9vdCgpOworCQlicmVhazsKIAljYXNlIFNPRlRfT0ZGOgogCQlwcl9pbmZvKCJPUEFMOiBwb3dlcm9mZiByZXF1ZXN0ZWRcbiIpOwogCQlvcmRlcmx5X3Bvd2Vyb2ZmKHRydWUpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtd3JhcHBlcnMuUyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXdyYXBwZXJzLlMKaW5kZXggNGU3NDAzNy4uYTdhZGU5NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtd3JhcHBlcnMuUworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC13cmFwcGVycy5TCkBAIC05LDExICs5LDExIEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vaHZjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL29wYWwuaD4KLSNpbmNsdWRlIDxhc20vanVtcF9sYWJlbC5oPgogCiAJLnNlY3Rpb24JIi50ZXh0IgogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc21wLmMKaW5kZXggMjczZDdiNC4uOGY3MGJhNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zbXAuYwpAQCAtMzIsNiArMzIsOCBAQAogI2luY2x1ZGUgPGFzbS9ydW5sYXRjaC5oPgogI2luY2x1ZGUgPGFzbS9jb2RlLXBhdGNoaW5nLmg+CiAjaW5jbHVkZSA8YXNtL2RiZWxsLmg+CisjaW5jbHVkZSA8YXNtL2t2bV9wcGMuaD4KKyNpbmNsdWRlIDxhc20vcHBjLW9wY29kZS5oPgogCiAjaW5jbHVkZSAicG93ZXJudi5oIgogCkBAIC0xNDgsNyArMTUwLDcgQEAKIHN0YXRpYyB2b2lkIHBudl9zbXBfY3B1X2tpbGxfc2VsZih2b2lkKQogewogCXVuc2lnbmVkIGludCBjcHU7Ci0JdW5zaWduZWQgbG9uZyBzcnIxOworCXVuc2lnbmVkIGxvbmcgc3JyMSwgd21hc2s7CiAJdTMyIGlkbGVfc3RhdGVzOwogCiAJLyogU3RhbmRhcmQgaG90IHVucGx1ZyBwcm9jZWR1cmUgKi8KQEAgLTE2MCw2ICsxNjIsMTAgQEAKIAlnZW5lcmljX3NldF9jcHVfZGVhZChjcHUpOwogCXNtcF93bWIoKTsKIAorCXdtYXNrID0gU1JSMV9XQUtFTUFTSzsKKwlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVJDSF8yMDdTKSkKKwkJd21hc2sgPSBTUlIxX1dBS0VNQVNLX1A4OworCiAJaWRsZV9zdGF0ZXMgPSBwbnZfZ2V0X3N1cHBvcnRlZF9jcHVpZGxlX3N0YXRlcygpOwogCS8qIFdlIGRvbid0IHdhbnQgdG8gdGFrZSBkZWNyZW1lbnRlciBpbnRlcnJ1cHRzIHdoaWxlIHdlIGFyZSBvZmZsaW5lLAogCSAqIHNvIGNsZWFyIExQQ1I6UEVDRTEuIFdlIGtlZXAgUEVDRTIgZW5hYmxlZC4KQEAgLTE5MCwxMCArMTk2LDE0IEBACiAJCSAqIGhhdmluZyBmaW5pc2hlZCBleGVjdXRpbmcgaW4gYSBLVk0gZ3Vlc3QsIHRoZW4gc3JyMQogCQkgKiBjb250YWlucyAwLgogCQkgKi8KLQkJaWYgKChzcnIxICYgU1JSMV9XQUtFTUFTSykgPT0gU1JSMV9XQUtFRUUpIHsKKwkJaWYgKChzcnIxICYgd21hc2spID09IFNSUjFfV0FLRUVFKSB7CiAJCQlpY3BfbmF0aXZlX2ZsdXNoX2ludGVycnVwdCgpOwogCQkJbG9jYWxfcGFjYS0+aXJxX2hhcHBlbmVkICY9IFBBQ0FfSVJRX0hBUkRfRElTOwogCQkJc21wX21iKCk7CisJCX0gZWxzZSBpZiAoKHNycjEgJiB3bWFzaykgPT0gU1JSMV9XQUtFSERCRUxMKSB7CisJCQl1bnNpZ25lZCBsb25nIG1zZyA9IFBQQ19EQkVMTF9UWVBFKFBQQ19EQkVMTF9TRVJWRVIpOworCQkJYXNtIHZvbGF0aWxlKFBQQ19NU0dDTFIoJTApIDogOiAiciIgKG1zZykpOworCQkJa3ZtcHBjX3NldF9ob3N0X2lwaShjcHUsIDApOwogCQl9CiAKIAkJaWYgKGNwdV9jb3JlX3NwbGl0X3JlcXVpcmVkKCkpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZDYWxsLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZDYWxsLlMKaW5kZXggY2NkNTNmOS4uNzRiNWI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2h2Q2FsbC5TCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odkNhbGwuUwpAQCAtNywxMiArNywxMiBAQAogICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCisjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgogI2luY2x1ZGUgPGFzbS9odmNhbGwuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3BwY19hc20uaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL2p1bXBfbGFiZWwuaD4KIAogCS5zZWN0aW9uCSIudGV4dCIKIAkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCmluZGV4IGI1NjgyZmQuLmI3YTY3ZTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3N0YXRpY19rZXkuaD4KKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9tbXUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL21vYmlsaXR5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbW9iaWxpdHkuYwppbmRleCAzOGRiMWI5Li5jZWIxOGQzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbW9iaWxpdHkuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbW9iaWxpdHkuYwpAQCAtMjUsMTAgKzI1LDEwIEBACiBzdGF0aWMgc3RydWN0IGtvYmplY3QgKm1vYmlsaXR5X2tvYmo7CiAKIHN0cnVjdCB1cGRhdGVfcHJvcHNfd29ya2FyZWEgewotCXUzMiBwaGFuZGxlOwotCXUzMiBzdGF0ZTsKLQl1NjQgcmVzZXJ2ZWQ7Ci0JdTMyIG5wcm9wczsKKwlfX2JlMzIgcGhhbmRsZTsKKwlfX2JlMzIgc3RhdGU7CisJX19iZTY0IHJlc2VydmVkOworCV9fYmUzMiBucHJvcHM7CiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIE5PREVfQUNUSU9OX01BU0sJMHhmZjAwMDAwMApAQCAtNTQsMTEgKzU0LDExIEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IGRlbGV0ZV9kdF9ub2RlKHUzMiBwaGFuZGxlKQorc3RhdGljIGludCBkZWxldGVfZHRfbm9kZShfX2JlMzIgcGhhbmRsZSkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRuOwogCi0JZG4gPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZShwaGFuZGxlKTsKKwlkbiA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKGJlMzJfdG9fY3B1KHBoYW5kbGUpKTsKIAlpZiAoIWRuKQogCQlyZXR1cm4gLUVOT0VOVDsKIApAQCAtMTI3LDcgKzEyNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdXBkYXRlX2R0X25vZGUodTMyIHBoYW5kbGUsIHMzMiBzY29wZSkKK3N0YXRpYyBpbnQgdXBkYXRlX2R0X25vZGUoX19iZTMyIHBoYW5kbGUsIHMzMiBzY29wZSkKIHsKIAlzdHJ1Y3QgdXBkYXRlX3Byb3BzX3dvcmthcmVhICp1cHdhOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CkBAIC0xMzYsNiArMTM2LDcgQEAKIAljaGFyICpwcm9wX2RhdGE7CiAJY2hhciAqcnRhc19idWY7CiAJaW50IHVwZGF0ZV9wcm9wZXJ0aWVzX3Rva2VuOworCXUzMiBucHJvcHM7CiAJdTMyIHZkOwogCiAJdXBkYXRlX3Byb3BlcnRpZXNfdG9rZW4gPSBydGFzX3Rva2VuKCJpYm0sdXBkYXRlLXByb3BlcnRpZXMiKTsKQEAgLTE0Niw3ICsxNDcsNyBAQAogCWlmICghcnRhc19idWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZG4gPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZShwaGFuZGxlKTsKKwlkbiA9IG9mX2ZpbmRfbm9kZV9ieV9waGFuZGxlKGJlMzJfdG9fY3B1KHBoYW5kbGUpKTsKIAlpZiAoIWRuKSB7CiAJCWtmcmVlKHJ0YXNfYnVmKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0xNjIsNiArMTYzLDcgQEAKIAkJCWJyZWFrOwogCiAJCXByb3BfZGF0YSA9IHJ0YXNfYnVmICsgc2l6ZW9mKCp1cHdhKTsKKwkJbnByb3BzID0gYmUzMl90b19jcHUodXB3YS0+bnByb3BzKTsKIAogCQkvKiBPbiB0aGUgZmlyc3QgY2FsbCB0byBpYm0sdXBkYXRlLXByb3BlcnRpZXMgZm9yIGEgbm9kZSB0aGUKIAkJICogdGhlIGZpcnN0IHByb3BlcnR5IHZhbHVlIGRlc2NyaXB0b3IgY29udGFpbnMgYW4gZW1wdHkKQEAgLTE3MCwxNyArMTcyLDE3IEBACiAJCSAqLwogCQlpZiAoKnByb3BfZGF0YSA9PSAwKSB7CiAJCQlwcm9wX2RhdGErKzsKLQkJCXZkID0gKih1MzIgKilwcm9wX2RhdGE7CisJCQl2ZCA9IGJlMzJfdG9fY3B1KCooX19iZTMyICopcHJvcF9kYXRhKTsKIAkJCXByb3BfZGF0YSArPSB2ZCArIHNpemVvZih2ZCk7Ci0JCQl1cHdhLT5ucHJvcHMtLTsKKwkJCW5wcm9wcy0tOwogCQl9CiAKLQkJZm9yIChpID0gMDsgaSA8IHVwd2EtPm5wcm9wczsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBucHJvcHM7IGkrKykgewogCQkJY2hhciAqcHJvcF9uYW1lOwogCiAJCQlwcm9wX25hbWUgPSBwcm9wX2RhdGE7CiAJCQlwcm9wX2RhdGEgKz0gc3RybGVuKHByb3BfbmFtZSkgKyAxOwotCQkJdmQgPSAqKHUzMiAqKXByb3BfZGF0YTsKKwkJCXZkID0gYmUzMl90b19jcHUoKihfX2JlMzIgKilwcm9wX2RhdGEpOwogCQkJcHJvcF9kYXRhICs9IHNpemVvZih2ZCk7CiAKIAkJCXN3aXRjaCAodmQpIHsKQEAgLTIxMiwxMyArMjE0LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWRkX2R0X25vZGUodTMyIHBhcmVudF9waGFuZGxlLCB1MzIgZHJjX2luZGV4KQorc3RhdGljIGludCBhZGRfZHRfbm9kZShfX2JlMzIgcGFyZW50X3BoYW5kbGUsIF9fYmUzMiBkcmNfaW5kZXgpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBhcmVudF9kbjsKIAlpbnQgcmM7CiAKLQlwYXJlbnRfZG4gPSBvZl9maW5kX25vZGVfYnlfcGhhbmRsZShwYXJlbnRfcGhhbmRsZSk7CisJcGFyZW50X2RuID0gb2ZfZmluZF9ub2RlX2J5X3BoYW5kbGUoYmUzMl90b19jcHUocGFyZW50X3BoYW5kbGUpKTsKIAlpZiAoIXBhcmVudF9kbikKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKQEAgLTIzNyw3ICsyMzksNyBAQAogaW50IHBzZXJpZXNfZGV2aWNldHJlZV91cGRhdGUoczMyIHNjb3BlKQogewogCWNoYXIgKnJ0YXNfYnVmOwotCXUzMiAqZGF0YTsKKwlfX2JlMzIgKmRhdGE7CiAJaW50IHVwZGF0ZV9ub2Rlc190b2tlbjsKIAlpbnQgcmM7CiAKQEAgLTI1NCwxNyArMjU2LDE3IEBACiAJCWlmIChyYyAmJiByYyAhPSAxKQogCQkJYnJlYWs7CiAKLQkJZGF0YSA9ICh1MzIgKilydGFzX2J1ZiArIDQ7Ci0JCXdoaWxlICgqZGF0YSAmIE5PREVfQUNUSU9OX01BU0spIHsKKwkJZGF0YSA9IChfX2JlMzIgKilydGFzX2J1ZiArIDQ7CisJCXdoaWxlIChiZTMyX3RvX2NwdSgqZGF0YSkgJiBOT0RFX0FDVElPTl9NQVNLKSB7CiAJCQlpbnQgaTsKLQkJCXUzMiBhY3Rpb24gPSAqZGF0YSAmIE5PREVfQUNUSU9OX01BU0s7Ci0JCQlpbnQgbm9kZV9jb3VudCA9ICpkYXRhICYgTk9ERV9DT1VOVF9NQVNLOworCQkJdTMyIGFjdGlvbiA9IGJlMzJfdG9fY3B1KCpkYXRhKSAmIE5PREVfQUNUSU9OX01BU0s7CisJCQl1MzIgbm9kZV9jb3VudCA9IGJlMzJfdG9fY3B1KCpkYXRhKSAmIE5PREVfQ09VTlRfTUFTSzsKIAogCQkJZGF0YSsrOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgbm9kZV9jb3VudDsgaSsrKSB7Ci0JCQkJdTMyIHBoYW5kbGUgPSAqZGF0YSsrOwotCQkJCXUzMiBkcmNfaW5kZXg7CisJCQkJX19iZTMyIHBoYW5kbGUgPSAqZGF0YSsrOworCQkJCV9fYmUzMiBkcmNfaW5kZXg7CiAKIAkJCQlzd2l0Y2ggKGFjdGlvbikgewogCQkJCWNhc2UgREVMRVRFX0RUX05PREU6CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvS2J1aWxkIGIvYXJjaC9zMzkwL0tidWlsZAppbmRleCA2NDdjM2VjLi4yOTM4OTM0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvS2J1aWxkCisrKyBiL2FyY2gvczM5MC9LYnVpbGQKQEAgLTQsNiArNCw1IEBACiBvYmotJChDT05GSUdfQ1JZUFRPX0hXKQkJKz0gY3J5cHRvLwogb2JqLSQoQ09ORklHX1MzOTBfSFlQRlNfRlMpCSs9IGh5cGZzLwogb2JqLSQoQ09ORklHX0FQUExEQVRBX0JBU0UpCSs9IGFwcGxkYXRhLwotb2JqLSQoQ09ORklHX01BVEhFTVUpCQkrPSBtYXRoLWVtdS8KIG9iai15CQkJCSs9IG5ldC8KIG9iai0kKENPTkZJR19QQ0kpCQkrPSBwY2kvCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvS2NvbmZpZyBiL2FyY2gvczM5MC9LY29uZmlnCmluZGV4IDM3M2NkNWIuLmRlMjcyNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9LY29uZmlnCisrKyBiL2FyY2gvczM5MC9LY29uZmlnCkBAIC0zNSw3ICszNSw3IEBACiAJZGVmX2Jvb2wgeQogCiBjb25maWcgQVJDSF9ETUFfQUREUl9UXzY0QklUCi0JZGVmX2Jvb2wgNjRCSVQKKwlkZWZfYm9vbCB5CiAKIGNvbmZpZyBHRU5FUklDX0xPQ0tCUkVBSwogCWRlZl9ib29sIHkgaWYgU01QICYmIFBSRUVNUFQKQEAgLTU5LDEyICs1OSwxMyBAQAogCWRlZl9ib29sIG4KIAogY29uZmlnIEFSQ0hfU1VQUE9SVFNfVVBST0JFUwotCWRlZl9ib29sIDY0QklUCisJZGVmX2Jvb2wgeQogCiBjb25maWcgUzM5MAogCWRlZl9ib29sIHkKIAlzZWxlY3QgQVJDSF9IQVNfQVRPTUlDNjRfREVDX0lGX1BPU0lUSVZFCiAJc2VsZWN0IEFSQ0hfSEFTX0RFQlVHX1NUUklDVF9VU0VSX0NPUFlfQ0hFQ0tTCisJc2VsZWN0IEFSQ0hfSEFTX0VMRl9SQU5ET01JWkUKIAlzZWxlY3QgQVJDSF9IQVNfR0NPVl9QUk9GSUxFX0FMTAogCXNlbGVjdCBBUkNIX0hBU19TR19DSEFJTgogCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRwpAQCAtMTEwLDE5ICsxMTEsMTkgQEAKIAlzZWxlY3QgR0VORVJJQ19USU1FX1ZTWVNDQUxMCiAJc2VsZWN0IEhBVkVfQUxJR05FRF9TVFJVQ1RfUEFHRSBpZiBTTFVCCiAJc2VsZWN0IEhBVkVfQVJDSF9BVURJVFNZU0NBTEwKLQlzZWxlY3QgSEFWRV9BUkNIX0pVTVBfTEFCRUwgaWYgIU1BUkNIX0c1CisJc2VsZWN0IEhBVkVfQVJDSF9KVU1QX0xBQkVMCiAJc2VsZWN0IEhBVkVfQVJDSF9TRUNDT01QX0ZJTFRFUgogCXNlbGVjdCBIQVZFX0FSQ0hfVFJBQ0VIT09LCi0Jc2VsZWN0IEhBVkVfQVJDSF9UUkFOU1BBUkVOVF9IVUdFUEFHRSBpZiA2NEJJVAotCXNlbGVjdCBIQVZFX0JQRl9KSVQgaWYgNjRCSVQgJiYgUEFDS19TVEFDSworCXNlbGVjdCBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0UKKwlzZWxlY3QgSEFWRV9CUEZfSklUIGlmIFBBQ0tfU1RBQ0sKIAlzZWxlY3QgSEFWRV9DTVBYQ0hHX0RPVUJMRQogCXNlbGVjdCBIQVZFX0NNUFhDSEdfTE9DQUwKIAlzZWxlY3QgSEFWRV9ERUJVR19LTUVNTEVBSwotCXNlbGVjdCBIQVZFX0RZTkFNSUNfRlRSQUNFIGlmIDY0QklUCi0Jc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0VfV0lUSF9SRUdTIGlmIDY0QklUCisJc2VsZWN0IEhBVkVfRFlOQU1JQ19GVFJBQ0UKKwlzZWxlY3QgSEFWRV9EWU5BTUlDX0ZUUkFDRV9XSVRIX1JFR1MKIAlzZWxlY3QgSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRAotCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiBpZiA2NEJJVAotCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUiBpZiA2NEJJVAorCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgorCXNlbGVjdCBIQVZFX0ZVTkNUSU9OX1RSQUNFUgogCXNlbGVjdCBIQVZFX0ZVVEVYX0NNUFhDSEcgaWYgRlVURVgKIAlzZWxlY3QgSEFWRV9LRVJORUxfQlpJUDIKIAlzZWxlY3QgSEFWRV9LRVJORUxfR1pJUApAQCAtMTMyLDcgKzEzMyw4IEBACiAJc2VsZWN0IEhBVkVfS0VSTkVMX1haCiAJc2VsZWN0IEhBVkVfS1BST0JFUwogCXNlbGVjdCBIQVZFX0tSRVRQUk9CRVMKLQlzZWxlY3QgSEFWRV9LVk0gaWYgNjRCSVQKKwlzZWxlY3QgSEFWRV9LVk0KKwlzZWxlY3QgSEFWRV9MSVZFUEFUQ0gKIAlzZWxlY3QgSEFWRV9NRU1CTE9DSwogCXNlbGVjdCBIQVZFX01FTUJMT0NLX05PREVfTUFQCiAJc2VsZWN0IEhBVkVfTUVNQkxPQ0tfUEhZU19NQVAKQEAgLTE0MSw3ICsxNDMsNiBAQAogCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCiAJc2VsZWN0IEhBVkVfUkVHU19BTkRfU1RBQ0tfQUNDRVNTX0FQSQogCXNlbGVjdCBIQVZFX1NZU0NBTExfVFJBQ0VQT0lOVFMKLQlzZWxlY3QgSEFWRV9VSUQxNiBpZiAzMkJJVAogCXNlbGVjdCBIQVZFX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKIAlzZWxlY3QgTU9EVUxFU19VU0VfRUxGX1JFTEEKIAlzZWxlY3QgTk9fQk9PVE1FTQpAQCAtMTU1LDEwICsxNTYsMTcgQEAKIGNvbmZpZyBTQ0hFRF9PTUlUX0ZSQU1FX1BPSU5URVIKIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBQR1RBQkxFX0xFVkVMUworCWludAorCWRlZmF1bHQgNCBpZiA2NEJJVAorCWRlZmF1bHQgMgorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogc291cmNlICJrZXJuZWwvS2NvbmZpZy5mcmVlemVyIgogCitzb3VyY2UgImtlcm5lbC9saXZlcGF0Y2gvS2NvbmZpZyIKKwogbWVudSAiUHJvY2Vzc29yIHR5cGUgYW5kIGZlYXR1cmVzIgogCiBjb25maWcgSEFWRV9NQVJDSF9aOTAwX0ZFQVRVUkVTCkBAIC0xOTAsMTggKzE5OCwxMSBAQAogCiBjaG9pY2UKIAlwcm9tcHQgIlByb2Nlc3NvciB0eXBlIgotCWRlZmF1bHQgTUFSQ0hfRzUKLQotY29uZmlnIE1BUkNIX0c1Ci0JYm9vbCAiU3lzdGVtLzM5MCBtb2RlbCBHNSBhbmQgRzYiCi0JZGVwZW5kcyBvbiAhNjRCSVQKLQloZWxwCi0JICBTZWxlY3QgdGhpcyB0byBidWlsZCBhIDMxIGJpdCBrZXJuZWwgdGhhdCB3b3JrcwotCSAgb24gYWxsIEVTQS8zOTAgYW5kIHovQXJjaGl0ZWN0dXJlIG1hY2hpbmVzLgorCWRlZmF1bHQgTUFSQ0hfWjkwMAogCiBjb25maWcgTUFSQ0hfWjkwMAogCWJvb2wgIklCTSB6U2VyaWVzIG1vZGVsIHo4MDAgYW5kIHo5MDAiCi0Jc2VsZWN0IEhBVkVfTUFSQ0hfWjkwMF9GRUFUVVJFUyBpZiA2NEJJVAorCXNlbGVjdCBIQVZFX01BUkNIX1o5MDBfRkVBVFVSRVMKIAloZWxwCiAJICBTZWxlY3QgdGhpcyB0byBlbmFibGUgb3B0aW1pemF0aW9ucyBmb3IgbW9kZWwgejgwMC96OTAwICgyMDY0IGFuZAogCSAgMjA2NiBzZXJpZXMpLiBUaGlzIHdpbGwgZW5hYmxlIHNvbWUgb3B0aW1pemF0aW9ucyB0aGF0IGFyZSBub3QKQEAgLTIwOSw3ICsyMTAsNyBAQAogCiBjb25maWcgTUFSQ0hfWjk5MAogCWJvb2wgIklCTSB6U2VyaWVzIG1vZGVsIHo4OTAgYW5kIHo5OTAiCi0Jc2VsZWN0IEhBVkVfTUFSQ0hfWjk5MF9GRUFUVVJFUyBpZiA2NEJJVAorCXNlbGVjdCBIQVZFX01BUkNIX1o5OTBfRkVBVFVSRVMKIAloZWxwCiAJICBTZWxlY3QgdGhpcyB0byBlbmFibGUgb3B0aW1pemF0aW9ucyBmb3IgbW9kZWwgejg5MC96OTkwICgyMDg0IGFuZAogCSAgMjA4NiBzZXJpZXMpLiBUaGUga2VybmVsIHdpbGwgYmUgc2xpZ2h0bHkgZmFzdGVyIGJ1dCB3aWxsIG5vdCB3b3JrCkBAIC0yMTcsNyArMjE4LDcgQEAKIAogY29uZmlnIE1BUkNIX1o5XzEwOQogCWJvb2wgIklCTSBTeXN0ZW0gejkiCi0Jc2VsZWN0IEhBVkVfTUFSQ0hfWjlfMTA5X0ZFQVRVUkVTIGlmIDY0QklUCisJc2VsZWN0IEhBVkVfTUFSQ0hfWjlfMTA5X0ZFQVRVUkVTCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIG9wdGltaXphdGlvbnMgZm9yIElCTSBTeXN0ZW0gejkgKDIwOTQgYW5kCiAJICAyMDk2IHNlcmllcykuIFRoZSBrZXJuZWwgd2lsbCBiZSBzbGlnaHRseSBmYXN0ZXIgYnV0IHdpbGwgbm90IHdvcmsKQEAgLTIyNSw3ICsyMjYsNyBAQAogCiBjb25maWcgTUFSQ0hfWjEwCiAJYm9vbCAiSUJNIFN5c3RlbSB6MTAiCi0Jc2VsZWN0IEhBVkVfTUFSQ0hfWjEwX0ZFQVRVUkVTIGlmIDY0QklUCisJc2VsZWN0IEhBVkVfTUFSQ0hfWjEwX0ZFQVRVUkVTCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIG9wdGltaXphdGlvbnMgZm9yIElCTSBTeXN0ZW0gejEwICgyMDk3IGFuZAogCSAgMjA5OCBzZXJpZXMpLiBUaGUga2VybmVsIHdpbGwgYmUgc2xpZ2h0bHkgZmFzdGVyIGJ1dCB3aWxsIG5vdCB3b3JrCkBAIC0yMzMsNyArMjM0LDcgQEAKIAogY29uZmlnIE1BUkNIX1oxOTYKIAlib29sICJJQk0gekVudGVycHJpc2UgMTE0IGFuZCAxOTYiCi0Jc2VsZWN0IEhBVkVfTUFSQ0hfWjE5Nl9GRUFUVVJFUyBpZiA2NEJJVAorCXNlbGVjdCBIQVZFX01BUkNIX1oxOTZfRkVBVFVSRVMKIAloZWxwCiAJICBTZWxlY3QgdGhpcyB0byBlbmFibGUgb3B0aW1pemF0aW9ucyBmb3IgSUJNIHpFbnRlcnByaXNlIDExNCBhbmQgMTk2CiAJICAoMjgxOCBhbmQgMjgxNyBzZXJpZXMpLiBUaGUga2VybmVsIHdpbGwgYmUgc2xpZ2h0bHkgZmFzdGVyIGJ1dCB3aWxsCkBAIC0yNDEsNyArMjQyLDcgQEAKIAogY29uZmlnIE1BUkNIX1pFQzEyCiAJYm9vbCAiSUJNIHpCQzEyIGFuZCB6RUMxMiIKLQlzZWxlY3QgSEFWRV9NQVJDSF9aRUMxMl9GRUFUVVJFUyBpZiA2NEJJVAorCXNlbGVjdCBIQVZFX01BUkNIX1pFQzEyX0ZFQVRVUkVTCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIG9wdGltaXphdGlvbnMgZm9yIElCTSB6QkMxMiBhbmQgekVDMTIgKDI4MjggYW5kCiAJICAyODI3IHNlcmllcykuIFRoZSBrZXJuZWwgd2lsbCBiZSBzbGlnaHRseSBmYXN0ZXIgYnV0IHdpbGwgbm90IHdvcmsgb24KQEAgLTI0OSw3ICsyNTAsNyBAQAogCiBjb25maWcgTUFSQ0hfWjEzCiAJYm9vbCAiSUJNIHoxMyIKLQlzZWxlY3QgSEFWRV9NQVJDSF9aMTNfRkVBVFVSRVMgaWYgNjRCSVQKKwlzZWxlY3QgSEFWRV9NQVJDSF9aMTNfRkVBVFVSRVMKIAloZWxwCiAJICBTZWxlY3QgdGhpcyB0byBlbmFibGUgb3B0aW1pemF0aW9ucyBmb3IgSUJNIHoxMyAoMjk2NCBzZXJpZXMpLgogCSAgVGhlIGtlcm5lbCB3aWxsIGJlIHNsaWdodGx5IGZhc3RlciBidXQgd2lsbCBub3Qgd29yayBvbiBvbGRlcgpAQCAtMjU3LDkgKzI1OCw2IEBACiAKIGVuZGNob2ljZQogCi1jb25maWcgTUFSQ0hfRzVfVFVORQotCWRlZl9ib29sIFRVTkVfRzUgfHwgTUFSQ0hfRzUgJiYgVFVORV9ERUZBVUxUCi0KIGNvbmZpZyBNQVJDSF9aOTAwX1RVTkUKIAlkZWZfYm9vbCBUVU5FX1o5MDAgfHwgTUFSQ0hfWjkwMCAmJiBUVU5FX0RFRkFVTFQKIApAQCAtMjk4LDkgKzI5Niw2IEBACiAJICBUdW5lIHRoZSBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlIHRhcmdldCBwcm9jZXNzb3IgZm9yIHdoaWNoIHRoZSBrZXJuZWwKIAkgIHdpbGwgYmUgY29tcGlsZWQuCiAKLWNvbmZpZyBUVU5FX0c1Ci0JYm9vbCAiU3lzdGVtLzM5MCBtb2RlbCBHNSBhbmQgRzYiCi0KIGNvbmZpZyBUVU5FX1o5MDAKIAlib29sICJJQk0gelNlcmllcyBtb2RlbCB6ODAwIGFuZCB6OTAwIgogCkBAIC0zMjYsMjEgKzMyMSwxNCBAQAogCiBjb25maWcgNjRCSVQKIAlkZWZfYm9vbCB5Ci0JcHJvbXB0ICI2NCBiaXQga2VybmVsIgotCWhlbHAKLQkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB5b3UgaGF2ZSBhbiBJQk0gei9BcmNoaXRlY3R1cmUgbWFjaGluZQotCSAgYW5kIHdhbnQgdG8gdXNlIHRoZSA2NCBiaXQgYWRkcmVzc2luZyBtb2RlLgotCi1jb25maWcgMzJCSVQKLQlkZWZfYm9vbCB5IGlmICE2NEJJVAogCiBjb25maWcgQ09NUEFUCiAJZGVmX2Jvb2wgeQogCXByb21wdCAiS2VybmVsIHN1cHBvcnQgZm9yIDMxIGJpdCBlbXVsYXRpb24iCi0JZGVwZW5kcyBvbiA2NEJJVAogCXNlbGVjdCBDT01QQVRfQklORk1UX0VMRiBpZiBCSU5GTVRfRUxGCiAJc2VsZWN0IEFSQ0hfV0FOVF9PTERfQ09NUEFUX0lQQwogCXNlbGVjdCBDT01QQVRfT0xEX1NJR0FDVElPTgorCWRlcGVuZHMgb24gTVVMVElVU0VSCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB5b3VyIHN5c3RlbSBrZXJuZWwgdG8KIAkgIGhhbmRsZSBzeXN0ZW0tY2FsbHMgZnJvbSBFTEYgYmluYXJpZXMgZm9yIDMxIGJpdCBFU0EuICBUaGlzIG9wdGlvbgpAQCAtMzc2LDggKzM2NCw3IEBACiAJaW50ICJNYXhpbXVtIG51bWJlciBvZiBDUFVzICgyLTUxMikiCiAJcmFuZ2UgMiA1MTIKIAlkZXBlbmRzIG9uIFNNUAotCWRlZmF1bHQgIjMyIiBpZiAhNjRCSVQKLQlkZWZhdWx0ICI2NCIgaWYgNjRCSVQKKwlkZWZhdWx0ICI2NCIKIAloZWxwCiAJICBUaGlzIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgQ1BVcyB3aGljaCB0aGlzCiAJICBrZXJuZWwgd2lsbCBzdXBwb3J0LiBUaGUgbWF4aW11bSBzdXBwb3J0ZWQgdmFsdWUgaXMgNTEyIGFuZCB0aGUKQEAgLTQxOCwxNSArNDA1LDYgQEAKIAogc291cmNlIGtlcm5lbC9LY29uZmlnLnByZWVtcHQKIAotY29uZmlnIE1BVEhFTVUKLQlkZWZfYm9vbCB5Ci0JcHJvbXB0ICJJRUVFIEZQVSBlbXVsYXRpb24iCi0JZGVwZW5kcyBvbiBNQVJDSF9HNQotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIGZvciBJRUVFIGNvbXBsaWFudCBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljCi0JICBvbiBvbGRlciBFU0EvMzkwIG1hY2hpbmVzLiBTYXkgWSB1bmxlc3MgeW91IGtub3cgeW91ciBtYWNoaW5lIGRvZXNuJ3QKLQkgIG5lZWQgdGhpcy4KLQogc291cmNlIGtlcm5lbC9LY29uZmlnLmh6CiAKIGVuZG1lbnUKQEAgLTQzNyw3ICs0MTUsNiBAQAogCWRlZl9ib29sIHkKIAlzZWxlY3QgU1BBUlNFTUVNX1ZNRU1NQVBfRU5BQkxFCiAJc2VsZWN0IFNQQVJTRU1FTV9WTUVNTUFQCi0Jc2VsZWN0IFNQQVJTRU1FTV9TVEFUSUMgaWYgITY0QklUCiAKIGNvbmZpZyBBUkNIX1NQQVJTRU1FTV9ERUZBVUxUCiAJZGVmX2Jvb2wgeQpAQCAtNDUzLDcgKzQzMCw2IEBACiAKIGNvbmZpZyBBUkNIX0VOQUJMRV9TUExJVF9QTURfUFRMT0NLCiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gNjRCSVQKIAogY29uZmlnIEZPUkNFX01BWF9aT05FT1JERVIKIAlpbnQKQEAgLTUyOCw3ICs1MDQsNiBAQAogCiBtZW51Y29uZmlnIFBDSQogCWJvb2wgIlBDSSBzdXBwb3J0IgotCWRlcGVuZHMgb24gNjRCSVQKIAlzZWxlY3QgSEFWRV9ETUFfQVRUUlMKIAlzZWxlY3QgUENJX01TSQogCWhlbHAKQEAgLTU5OCw3ICs1NzMsNiBAQAogCiBjb25maWcgU0NNX0JVUwogCWRlZl9ib29sIHkKLQlkZXBlbmRzIG9uIDY0QklUCiAJcHJvbXB0ICJTQ00gYnVzIGRyaXZlciIKIAloZWxwCiAJICBCdXMgZHJpdmVyIGZvciBTdG9yYWdlIENsYXNzIE1lbW9yeS4KQEAgLTYyMCw3ICs1OTQsNyBAQAogCiBjb25maWcgQ1JBU0hfRFVNUAogCWJvb2wgImtlcm5lbCBjcmFzaCBkdW1wcyIKLQlkZXBlbmRzIG9uIDY0QklUICYmIFNNUAorCWRlcGVuZHMgb24gU01QCiAJc2VsZWN0IEtFWEVDCiAJaGVscAogCSAgR2VuZXJhdGUgY3Jhc2ggZHVtcCBhZnRlciBiZWluZyBzdGFydGVkIGJ5IGtleGVjLgpAQCAtNjU5LDcgKzYzMyw3IEBACiBtZW51ICJQb3dlciBNYW5hZ2VtZW50IgogCiBjb25maWcgQVJDSF9ISUJFUk5BVElPTl9QT1NTSUJMRQotCWRlZl9ib29sIHkgaWYgNjRCSVQKKwlkZWZfYm9vbCB5CiAKIHNvdXJjZSAia2VybmVsL3Bvd2VyL0tjb25maWciCiAKQEAgLTgxMCw3ICs3ODQsNiBAQAogY29uZmlnIFMzOTBfR1VFU1QKIAlkZWZfYm9vbCB5CiAJcHJvbXB0ICJzMzkwIHN1cHBvcnQgZm9yIHZpcnRpbyBkZXZpY2VzIgotCWRlcGVuZHMgb24gNjRCSVQKIAlzZWxlY3QgVFRZCiAJc2VsZWN0IFZJUlRVQUxJWkFUSU9OCiAJc2VsZWN0IFZJUlRJTwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL01ha2VmaWxlIGIvYXJjaC9zMzkwL01ha2VmaWxlCmluZGV4IGFjYjY4NTkuLjY2N2IxYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAvTWFrZWZpbGUKQEAgLTEzLDE1ICsxMyw2IEBACiAjIENvcHlyaWdodCAoQykgMTk5NCBieSBMaW51cyBUb3J2YWxkcwogIwogCi1pZm5kZWYgQ09ORklHXzY0QklUCi1MRF9CRkQJCTo9IGVsZjMyLXMzOTAKLUxERkxBR1MJCTo9IC1tIGVsZl9zMzkwCi1LQlVJTERfQ0ZMQUdTCSs9IC1tMzEKLUtCVUlMRF9BRkxBR1MJKz0gLW0zMQotVVRTX01BQ0hJTkUJOj0gczM5MAotU1RBQ0tfU0laRQk6PSA4MTkyCi1DSEVDS0ZMQUdTCSs9IC1EX19zMzkwX18gLW1zaXplLWxvbmcKLWVsc2UKIExEX0JGRAkJOj0gZWxmNjQtczM5MAogTERGTEFHUwkJOj0gLW0gZWxmNjRfczM5MAogS0JVSUxEX0FGTEFHU19NT0RVTEUgKz0gLWZQSUMKQEAgLTMxLDExICsyMiw5IEBACiBVVFNfTUFDSElORQk6PSBzMzkweAogU1RBQ0tfU0laRQk6PSAxNjM4NAogQ0hFQ0tGTEFHUwkrPSAtRF9fczM5MF9fIC1EX19zMzkweF9fCi1lbmRpZgogCiBleHBvcnQgTERfQkZECiAKLW1mbGFncy0kKENPTkZJR19NQVJDSF9HNSkgICAgIDo9IC1tYXJjaD1nNQogbWZsYWdzLSQoQ09ORklHX01BUkNIX1o5MDApICAgOj0gLW1hcmNoPXo5MDAKIG1mbGFncy0kKENPTkZJR19NQVJDSF9aOTkwKSAgIDo9IC1tYXJjaD16OTkwCiBtZmxhZ3MtJChDT05GSUdfTUFSQ0hfWjlfMTA5KSA6PSAtbWFyY2g9ejktMTA5CkBAIC00Nyw3ICszNiw2IEBACiBhZmxhZ3MteSArPSAkKG1mbGFncy15KQogY2ZsYWdzLXkgKz0gJChtZmxhZ3MteSkKIAotY2ZsYWdzLSQoQ09ORklHX01BUkNIX0c1X1RVTkUpCQkrPSAtbXR1bmU9ZzUKIGNmbGFncy0kKENPTkZJR19NQVJDSF9aOTAwX1RVTkUpCSs9IC1tdHVuZT16OTAwCiBjZmxhZ3MtJChDT05GSUdfTUFSQ0hfWjk5MF9UVU5FKQkrPSAtbXR1bmU9ejk5MAogY2ZsYWdzLSQoQ09ORklHX01BUkNIX1o5XzEwOV9UVU5FKQkrPSAtbXR1bmU9ejktMTA5CkBAIC0xMDQsNyArOTIsNyBAQAogT0JKQ09QWUZMQUdTCTo9IC1PIGJpbmFyeQogCiBoZWFkLXkJCTo9IGFyY2gvczM5MC9rZXJuZWwvaGVhZC5vCi1oZWFkLXkJCSs9IGFyY2gvczM5MC9rZXJuZWwvJChpZiAkKENPTkZJR182NEJJVCksaGVhZDY0Lm8saGVhZDMxLm8pCitoZWFkLXkJCSs9IGFyY2gvczM5MC9rZXJuZWwvaGVhZDY0Lm8KIAogIyBTZWUgYXJjaC9zMzkwL0tidWlsZCBmb3IgY29udGVudCBvZiBjb3JlIHBhcnQgb2YgdGhlIGtlcm5lbAogY29yZS15CQkrPSBhcmNoL3MzOTAvCkBAIC0xMjksOSArMTE3LDcgQEAKIAkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJvb3QpICQoYm9vdCkvJEAKIAogdmRzb19pbnN0YWxsOgotaWZlcSAoJChDT05GSUdfNjRCSVQpLHkpCiAJJChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC8kKEFSQ0gpL2tlcm5lbC92ZHNvNjQgJEAKLWVuZGlmCiAJJChRKSQoTUFLRSkgJChidWlsZCk9YXJjaC8kKEFSQ0gpL2tlcm5lbC92ZHNvMzIgJEAKIAogYXJjaGNsZWFuOgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZSBiL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKaW5kZXggZjkwZDFmYy4uZDQ3ODgxMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCkBAIC00LDEzICs0LDExIEBACiAjIGNyZWF0ZSBhIGNvbXByZXNzZWQgdm1saW51eCBpbWFnZSBmcm9tIHRoZSBvcmlnaW5hbCB2bWxpbnV4CiAjCiAKLUJJVFMgOj0gJChpZiAkKENPTkZJR182NEJJVCksNjQsMzEpCi0KIHRhcmdldHMJOj0gdm1saW51eC5sZHMgdm1saW51eCB2bWxpbnV4LmJpbiB2bWxpbnV4LmJpbi5neiB2bWxpbnV4LmJpbi5iejIKIHRhcmdldHMgKz0gdm1saW51eC5iaW4ueHogdm1saW51eC5iaW4ubHptYSB2bWxpbnV4LmJpbi5sem8gdm1saW51eC5iaW4ubHo0Ci10YXJnZXRzICs9IG1pc2MubyBwaWdneS5vIHNpemVzLmggaGVhZCQoQklUUykubwordGFyZ2V0cyArPSBtaXNjLm8gcGlnZ3kubyBzaXplcy5oIGhlYWQubwogCi1LQlVJTERfQ0ZMQUdTIDo9IC1tJChCSVRTKSAtRF9fS0VSTkVMX18gJChMSU5VWF9JTkNMVURFKSAtTzIKK0tCVUlMRF9DRkxBR1MgOj0gLW02NCAtRF9fS0VSTkVMX18gJChMSU5VWF9JTkNMVURFKSAtTzIKIEtCVUlMRF9DRkxBR1MgKz0gLURESVNBQkxFX0JSQU5DSF9QUk9GSUxJTkcKIEtCVUlMRF9DRkxBR1MgKz0gJChjZmxhZ3MteSkgLWZuby1kZWxldGUtbnVsbC1wb2ludGVyLWNoZWNrcwogS0JVSUxEX0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1tcGFja2VkLXN0YWNrKQpAQCAtMTksNyArMTcsNyBAQAogR0NPVl9QUk9GSUxFIDo9IG4KIAogT0JKRUNUUyA6PSAkKGFkZHByZWZpeCAkKG9ianRyZWUpL2FyY2gvczM5MC9rZXJuZWwvLCBoZWFkLm8gc2NscC5vIGViY2RpYy5vKQotT0JKRUNUUyArPSAkKG9iaikvaGVhZCQoQklUUykubyAkKG9iaikvbWlzYy5vICQob2JqKS9waWdneS5vCitPQkpFQ1RTICs9ICQob2JqKS9oZWFkLm8gJChvYmopL21pc2MubyAkKG9iaikvcGlnZ3kubwogCiBMREZMQUdTX3ZtbGludXggOj0gLS1vZm9ybWF0ICQoTERfQkZEKSAtZSBzdGFydHVwIC1UCiAkKG9iaikvdm1saW51eDogJChvYmopL3ZtbGludXgubGRzICQoT0JKRUNUUykKQEAgLTM0LDggKzMyLDggQEAKICQob2JqKS9zaXplcy5oOiB2bWxpbnV4CiAJJChjYWxsIGlmX2NoYW5nZWQsc2l6ZXMpCiAKLUFGTEFHU19oZWFkJChCSVRTKS5vICs9IC1JJChvYmopCi0kKG9iaikvaGVhZCQoQklUUykubzogJChvYmopL3NpemVzLmgKK0FGTEFHU19oZWFkLm8gKz0gLUkkKG9iaikKKyQob2JqKS9oZWFkLm86ICQob2JqKS9zaXplcy5oCiAKIENGTEFHU19taXNjLm8gKz0gLUkkKG9iaikKICQob2JqKS9taXNjLm86ICQob2JqKS9zaXplcy5oCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL2hlYWQ2NC5TIGIvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9oZWFkLlMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGFyY2gvczM5MC9ib290L2NvbXByZXNzZWQvaGVhZDY0LlMKcmVuYW1lIHRvIGFyY2gvczM5MC9ib290L2NvbXByZXNzZWQvaGVhZC5TCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL2hlYWQzMS5TIGIvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC9oZWFkMzEuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjOWUxOC4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL2hlYWQzMS5TCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoKLSAqIFN0YXJ0dXAgZ2x1ZSBjb2RlIHRvIHVuY29tcHJlc3MgdGhlIGtlcm5lbAotICoKLSAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAxMAotICoKLSAqICAgQXV0aG9yKHMpOglNYXJ0aW4gU2Nod2lkZWZza3kgPHNjaHdpZGVmc2t5QGRlLmlibS5jb20+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlICJzaXplcy5oIgotCi1fX0hFQUQKLUVOVFJZKHN0YXJ0dXBfY29udGludWUpCi0JYmFzcgklcjEzLDAJCQkjIGdldCBiYXNlCi0uTFBHMToKLQkjIHNldHVwIHN0YWNrCi0JbAklcjE1LC5Mc3RhY2stLkxQRzEoJXIxMykKLQlhaGkJJXIxNSwtOTYKLQlsCSVyMSwuTGRlY29tcHJlc3MtLkxQRzEoJXIxMykKLQliYXNyCSVyMTQsJXIxCi0JIyBzZXR1cCByZWdpc3RlcnMgZm9yIG1lbW9yeSBtb3ZlciAmIGJyYW5jaCB0byB0YXJnZXQKLQlscgklcjQsJXIyCi0JbAklcjIsLkxvZmZzZXQtLkxQRzEoJXIxMykKLQlsYQklcjQsMCglcjIsJXI0KQotCWwJJXIzLC5MbXZzaXplLS5MUEcxKCVyMTMpCi0JbHIJJXI1LCVyMwotCSMgbW92ZSB0aGUgbWVtb3J5IG1vdmVyIHNvbWVwbGFjZSBzYWZlCi0JbGEJJXIxLDB4MjAwCi0JbXZjCTAobW92ZXJfZW5kLW1vdmVyLCVyMSksbW92ZXItLkxQRzEoJXIxMykKLQkjIGRlY29tcHJlc3MgaW1hZ2UgaXMgc3RhcnRlZCBhdCAweDExMDAwCi0JbHIJJXI2LCVyMgotCWJyCSVyMQotbW92ZXI6Ci0JbXZjbGUJJXIyLCVyNCwwCi0Jam8JbW92ZXIKLQlicgklcjYKLW1vdmVyX2VuZDoKLQotCS5hbGlnbgk4Ci0uTHN0YWNrOgotCS5sb25nCTB4ODAwMCArICgxPDwoUEFHRV9TSElGVCtUSFJFQURfT1JERVIpKQotLkxkZWNvbXByZXNzOgotCS5sb25nCWRlY29tcHJlc3Nfa2VybmVsCi0uTG9mZnNldDoKLQkubG9uZwkweDExMDAwCi0uTG12c2l6ZToKLQkubG9uZwlTWl9fYnNzX3N0YXJ0CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLlMgYi9hcmNoL3MzOTAvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLlMKaW5kZXggOGUxZmI4Mi4uNzQ3NzM1ZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvczM5MC9ib290L2NvbXByZXNzZWQvdm1saW51eC5sZHMuUwpAQCAtMSwxMiArMSw3IEBACiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KIAotI2lmZGVmIENPTkZJR182NEJJVAogT1VUUFVUX0ZPUk1BVCgiZWxmNjQtczM5MCIsICJlbGY2NC1zMzkwIiwgImVsZjY0LXMzOTAiKQogT1VUUFVUX0FSQ0goczM5MDo2NC1iaXQpCi0jZWxzZQotT1VUUFVUX0ZPUk1BVCgiZWxmMzItczM5MCIsICJlbGYzMi1zMzkwIiwgImVsZjMyLXMzOTAiKQotT1VUUFVUX0FSQ0goczM5MDozMS1iaXQpCi0jZW5kaWYKIAogRU5UUlkoc3RhcnR1cCkKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2NyeXB0by9jcnlwdF9zMzkwLmggYi9hcmNoL3MzOTAvY3J5cHRvL2NyeXB0X3MzOTAuaAppbmRleCA2YzVjYzZkLi5iYTNiMmFlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvY3J5cHRvL2NyeXB0X3MzOTAuaAorKysgYi9hcmNoL3MzOTAvY3J5cHRvL2NyeXB0X3MzOTAuaApAQCAtMzY5LDE0ICszNjksMTAgQEAKIAogCWlmIChmYWNpbGl0eV9tYXNrICYgQ1JZUFRfUzM5MF9NU0EgJiYgIXRlc3RfZmFjaWxpdHkoMTcpKQogCQlyZXR1cm4gMDsKLQotCWlmIChmYWNpbGl0eV9tYXNrICYgQ1JZUFRfUzM5MF9NU0EzICYmCi0JICAgICghdGVzdF9mYWNpbGl0eSgyKSB8fCAhdGVzdF9mYWNpbGl0eSg3NikpKQorCWlmIChmYWNpbGl0eV9tYXNrICYgQ1JZUFRfUzM5MF9NU0EzICYmICF0ZXN0X2ZhY2lsaXR5KDc2KSkKIAkJcmV0dXJuIDA7Ci0JaWYgKGZhY2lsaXR5X21hc2sgJiBDUllQVF9TMzkwX01TQTQgJiYKLQkgICAgKCF0ZXN0X2ZhY2lsaXR5KDIpIHx8ICF0ZXN0X2ZhY2lsaXR5KDc3KSkpCisJaWYgKGZhY2lsaXR5X21hc2sgJiBDUllQVF9TMzkwX01TQTQgJiYgIXRlc3RfZmFjaWxpdHkoNzcpKQogCQlyZXR1cm4gMDsKLQogCXN3aXRjaCAoZnVuYyAmIENSWVBUX1MzOTBfT1BfTUFTSykgewogCWNhc2UgQ1JZUFRfUzM5MF9LTToKIAkJcmV0ID0gY3J5cHRfczM5MF9rbShLTV9RVUVSWSwgJnN0YXR1cywgTlVMTCwgTlVMTCwgMCk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaHlwZnMvaHlwZnNfZGlhZzBjLmMgYi9hcmNoL3MzOTAvaHlwZnMvaHlwZnNfZGlhZzBjLmMKaW5kZXggZDRjMGQzNy4uMjRjNzQ3YSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2h5cGZzL2h5cGZzX2RpYWcwYy5jCisrKyBiL2FyY2gvczM5MC9oeXBmcy9oeXBmc19kaWFnMGMuYwpAQCAtMTksMTMgKzE5LDkgQEAKIHN0YXRpYyB2b2lkIGRpYWcwYyhzdHJ1Y3QgaHlwZnNfZGlhZzBjX2VudHJ5ICplbnRyeSkKIHsKIAlhc20gdm9sYXRpbGUgKAotI2lmZGVmIENPTkZJR182NEJJVAogCQkiCXNhbTMxXG4iCiAJCSIJZGlhZwklMCwlMCwweDBjXG4iCiAJCSIJc2FtNjRcbiIKLSNlbHNlCi0JCSIJZGlhZyAlMCwlMCwweDBjXG4iCi0jZW5kaWYKIAkJOiAvKiBubyBvdXRwdXQgcmVnaXN0ZXIgKi8KIAkJOiAiYSIgKGVudHJ5KQogCQk6ICJtZW1vcnkiKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9oeXBmcy9pbm9kZS5jIGIvYXJjaC9zMzkwL2h5cGZzL2lub2RlLmMKaW5kZXggOTk4MjRmZi4uM2Y1Yzc5OSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2h5cGZzL2lub2RlLmMKKysrIGIvYXJjaC9zMzkwL2h5cGZzL2lub2RlLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgogI2luY2x1ZGUgImh5cGZzLmgiCiAKQEAgLTQzNyw4ICs0MzcsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHlwZnNfZmlsZV9vcHMgPSB7CiAJLm9wZW4JCT0gaHlwZnNfb3BlbiwKIAkucmVsZWFzZQk9IGh5cGZzX3JlbGVhc2UsCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlcgk9IGh5cGZzX3JlYWRfaXRlciwKIAkud3JpdGVfaXRlcgk9IGh5cGZzX3dyaXRlX2l0ZXIsCiAJLmxsc2VlawkJPSBub19sbHNlZWssCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYXBwbGRhdGEuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9hcHBsZGF0YS5oCmluZGV4IDMyYTcwNTkuLjE2ODg3YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9hcHBsZGF0YS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9hcHBsZGF0YS5oCkBAIC05LDI4ICs5LDYgQEAKIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCi0jaWZuZGVmIENPTkZJR182NEJJVAotCi0jZGVmaW5lIEFQUExEQVRBX1NUQVJUX0lOVEVSVkFMX1JFQwkweDAwCS8qIEZ1bmN0aW9uIGNvZGVzIGZvciAqLwotI2RlZmluZSBBUFBMREFUQV9TVE9QX1JFQwkJMHgwMQkvKiBESUFHIDB4REMJICAgICAgKi8KLSNkZWZpbmUgQVBQTERBVEFfR0VOX0VWRU5UX1JFQwkJMHgwMgotI2RlZmluZSBBUFBMREFUQV9TVEFSVF9DT05GSUdfUkVDCTB4MDMKLQotLyoKLSAqIFBhcmFtZXRlciBsaXN0IGZvciBESUFHTk9TRSBYJ0RDJwotICovCi1zdHJ1Y3QgYXBwbGRhdGFfcGFyYW1ldGVyX2xpc3QgewotCXUxNiBkaWFnOwkJLyogVGhlIERJQUdOT1NFIGNvZGUgWCcwMERDJwkgICAgICAqLwotCXU4ICBmdW5jdGlvbjsJCS8qIFRoZSBmdW5jdGlvbiBjb2RlIGZvciB0aGUgRElBR05PU0UgKi8KLQl1OCAgcGFybGlzdF9sZW5ndGg7CS8qIExlbmd0aCBvZiB0aGUgcGFyYW1ldGVyIGxpc3QgICAgICAgKi8KLQl1MzIgcHJvZHVjdF9pZF9hZGRyOwkvKiBBZGRyZXNzIG9mIHRoZSAxNi1ieXRlIHByb2R1Y3QgSUQgICovCi0JdTE2IHJlc2VydmVkOwotCXUxNiBidWZmZXJfbGVuZ3RoOwkvKiBMZW5ndGggb2YgdGhlIGFwcGxpY2F0aW9uIGRhdGEgYnVmZmVyICAqLwotCXUzMiBidWZmZXJfYWRkcjsJLyogQWRkcmVzcyBvZiB0aGUgYXBwbGljYXRpb24gZGF0YSBidWZmZXIgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KLQogI2RlZmluZSBBUFBMREFUQV9TVEFSVF9JTlRFUlZBTF9SRUMJMHg4MAogI2RlZmluZSBBUFBMREFUQV9TVE9QX1JFQwkJMHg4MQogI2RlZmluZSBBUFBMREFUQV9HRU5fRVZFTlRfUkVDCQkweDgyCkBAIC01MSw4ICsyOSw2IEBACiAJdTY0IGJ1ZmZlcl9hZGRyOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQogc3RydWN0IGFwcGxkYXRhX3Byb2R1Y3RfaWQgewogCWNoYXIgcHJvZF9ucls3XTsJLyogcHJvZHVjdCBudW1iZXIgKi8KIAl1MTYgIHByb2RfZm47CQkvKiBwcm9kdWN0IGZ1bmN0aW9uICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYXRvbWljLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggZmE5MzRmZS4uYWRiZTM4MCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2F0b21pYy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9hdG9taWMuaApAQCAtMTYwLDggKzE2MCw2IEBACiAKICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKSAgeyAoaSkgfQogCi0jaWZkZWYgQ09ORklHXzY0QklUCi0KICNkZWZpbmUgX19BVE9NSUM2NF9OT19CQVJSSUVSCSJcbiIKIAogI2lmZGVmIENPTkZJR19IQVZFX01BUkNIX1oxOTZfRkVBVFVSRVMKQEAgLTI3NCw5OSArMjcyLDYgQEAKIAogI3VuZGVmIF9fQVRPTUlDNjRfTE9PUAogCi0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotCWxvbmcgbG9uZyBjb3VudGVyOwotfSBhdG9taWM2NF90OwotCi1zdGF0aWMgaW5saW5lIGxvbmcgbG9uZyBhdG9taWM2NF9yZWFkKGNvbnN0IGF0b21pYzY0X3QgKnYpCi17Ci0JcmVnaXN0ZXJfcGFpciBycDsKLQotCWFzbSB2b2xhdGlsZSgKLQkJIglsbQklMCwlTjAsJTEiCi0JCTogIj0mZCIgKHJwKSA6ICJRIiAodi0+Y291bnRlcikJKTsKLQlyZXR1cm4gcnAucGFpcjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF0b21pYzY0X3NldChhdG9taWM2NF90ICp2LCBsb25nIGxvbmcgaSkKLXsKLQlyZWdpc3Rlcl9wYWlyIHJwID0gey5wYWlyID0gaX07Ci0KLQlhc20gdm9sYXRpbGUoCi0JCSIJc3RtCSUxLCVOMSwlMCIKLQkJOiAiPVEiICh2LT5jb3VudGVyKSA6ICJkIiAocnApICk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgbG9uZyBsb25nIGF0b21pYzY0X3hjaGcoYXRvbWljNjRfdCAqdiwgbG9uZyBsb25nIG5ldykKLXsKLQlyZWdpc3Rlcl9wYWlyIHJwX25ldyA9IHsucGFpciA9IG5ld307Ci0JcmVnaXN0ZXJfcGFpciBycF9vbGQ7Ci0KLQlhc20gdm9sYXRpbGUoCi0JCSIJbG0JJTAsJU4wLCUxXG4iCi0JCSIwOgljZHMJJTAsJTIsJTFcbiIKLQkJIglqbAkwYlxuIgotCQk6ICI9JmQiIChycF9vbGQpLCAiK1EiICh2LT5jb3VudGVyKQotCQk6ICJkIiAocnBfbmV3KQotCQk6ICJjYyIpOwotCXJldHVybiBycF9vbGQucGFpcjsKLX0KLQotc3RhdGljIGlubGluZSBsb25nIGxvbmcgYXRvbWljNjRfY21weGNoZyhhdG9taWM2NF90ICp2LAotCQkJCQkgbG9uZyBsb25nIG9sZCwgbG9uZyBsb25nIG5ldykKLXsKLQlyZWdpc3Rlcl9wYWlyIHJwX29sZCA9IHsucGFpciA9IG9sZH07Ci0JcmVnaXN0ZXJfcGFpciBycF9uZXcgPSB7LnBhaXIgPSBuZXd9OwotCi0JYXNtIHZvbGF0aWxlKAotCQkiCWNkcwklMCwlMiwlMSIKLQkJOiAiKyZkIiAocnBfb2xkKSwgIitRIiAodi0+Y291bnRlcikKLQkJOiAiZCIgKHJwX25ldykKLQkJOiAiY2MiKTsKLQlyZXR1cm4gcnBfb2xkLnBhaXI7Ci19Ci0KLQotc3RhdGljIGlubGluZSBsb25nIGxvbmcgYXRvbWljNjRfYWRkX3JldHVybihsb25nIGxvbmcgaSwgYXRvbWljNjRfdCAqdikKLXsKLQlsb25nIGxvbmcgb2xkLCBuZXc7Ci0KLQlkbyB7Ci0JCW9sZCA9IGF0b21pYzY0X3JlYWQodik7Ci0JCW5ldyA9IG9sZCArIGk7Ci0JfSB3aGlsZSAoYXRvbWljNjRfY21weGNoZyh2LCBvbGQsIG5ldykgIT0gb2xkKTsKLQlyZXR1cm4gbmV3OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljNjRfc2V0X21hc2sodW5zaWduZWQgbG9uZyBsb25nIG1hc2ssIGF0b21pYzY0X3QgKnYpCi17Ci0JbG9uZyBsb25nIG9sZCwgbmV3OwotCi0JZG8gewotCQlvbGQgPSBhdG9taWM2NF9yZWFkKHYpOwotCQluZXcgPSBvbGQgfCBtYXNrOwotCX0gd2hpbGUgKGF0b21pYzY0X2NtcHhjaGcodiwgb2xkLCBuZXcpICE9IG9sZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWM2NF9jbGVhcl9tYXNrKHVuc2lnbmVkIGxvbmcgbG9uZyBtYXNrLCBhdG9taWM2NF90ICp2KQotewotCWxvbmcgbG9uZyBvbGQsIG5ldzsKLQotCWRvIHsKLQkJb2xkID0gYXRvbWljNjRfcmVhZCh2KTsKLQkJbmV3ID0gb2xkICYgbWFzazsKLQl9IHdoaWxlIChhdG9taWM2NF9jbXB4Y2hnKHYsIG9sZCwgbmV3KSAhPSBvbGQpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljNjRfYWRkKGxvbmcgbG9uZyBpLCBhdG9taWM2NF90ICp2KQotewotCWF0b21pYzY0X2FkZF9yZXR1cm4oaSwgdik7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQogc3RhdGljIGlubGluZSBpbnQgYXRvbWljNjRfYWRkX3VubGVzcyhhdG9taWM2NF90ICp2LCBsb25nIGxvbmcgaSwgbG9uZyBsb25nIHUpCiB7CiAJbG9uZyBsb25nIGMsIG9sZDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9iaXRvcHMuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9iaXRvcHMuaAppbmRleCA1MjA1NDI0Li45YjY4ZTk4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vYml0b3BzLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2JpdG9wcy5oCkBAIC01MSwzMiArNTEsNiBAQAogCiAjZGVmaW5lIF9fQklUT1BTX05PX0JBUlJJRVIJIlxuIgogCi0jaWZuZGVmIENPTkZJR182NEJJVAotCi0jZGVmaW5lIF9fQklUT1BTX09SCQkib3IiCi0jZGVmaW5lIF9fQklUT1BTX0FORAkJIm5yIgotI2RlZmluZSBfX0JJVE9QU19YT1IJCSJ4ciIKLSNkZWZpbmUgX19CSVRPUFNfQkFSUklFUgkiXG4iCi0KLSNkZWZpbmUgX19CSVRPUFNfTE9PUChfX2FkZHIsIF9fdmFsLCBfX29wX3N0cmluZywgX19iYXJyaWVyKQlcCi0oewkJCQkJCQkJXAotCXVuc2lnbmVkIGxvbmcgX19vbGQsIF9fbmV3OwkJCQlcCi0JCQkJCQkJCVwKLQl0eXBlY2hlY2sodW5zaWduZWQgbG9uZyAqLCAoX19hZGRyKSk7CQkJXAotCWFzbSB2b2xhdGlsZSgJCQkJCQlcCi0JCSIJbAklMCwlMlxuIgkJCVwKLQkJIjA6CWxyCSUxLCUwXG4iCQkJXAotCQlfX29wX3N0cmluZyAiCSUxLCUzXG4iCQkJXAotCQkiCWNzCSUwLCUxLCUyXG4iCQkJXAotCQkiCWpsCTBiIgkJCQlcCi0JCTogIj0mZCIgKF9fb2xkKSwgIj0mZCIgKF9fbmV3KSwgIitRIiAoKihfX2FkZHIpKVwKLQkJOiAiZCIgKF9fdmFsKQkJCQkJXAotCQk6ICJjYyIsICJtZW1vcnkiKTsJCQkJXAotCV9fb2xkOwkJCQkJCQlcCi19KQotCi0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KLQogI2lmZGVmIENPTkZJR19IQVZFX01BUkNIX1oxOTZfRkVBVFVSRVMKIAogI2RlZmluZSBfX0JJVE9QU19PUgkJImxhb2ciCkBAIC0xMjUsOCArOTksNiBAQAogCiAjZW5kaWYgLyogQ09ORklHX0hBVkVfTUFSQ0hfWjE5Nl9GRUFUVVJFUyAqLwogCi0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCi0KICNkZWZpbmUgX19CSVRPUFNfV09SRFMoYml0cykgKCgoYml0cykgKyBCSVRTX1BFUl9MT05HIC0gMSkgLyBCSVRTX1BFUl9MT05HKQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NtcHhjaGcuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKaW5kZXggNjI1OTg5NS4uNGVhZGVjNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NtcHhjaGcuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY21weGNoZy5oCkBAIC04MCwxNSArODAsMTAgQEAKICh7CQkJCQkJCQkJXAogCV9fdHlwZW9mX18ocDEpIF9fcDEgPSAocDEpOwkJCQkJXAogCV9fdHlwZW9mX18ocDIpIF9fcDIgPSAocDIpOwkJCQkJXAotCWludCBfX3JldDsJCQkJCQkJXAogCUJVSUxEX0JVR19PTihzaXplb2YoKihwMSkpICE9IHNpemVvZihsb25nKSk7CQkJXAogCUJVSUxEX0JVR19PTihzaXplb2YoKihwMikpICE9IHNpemVvZihsb25nKSk7CQkJXAogCVZNX0JVR19PTigodW5zaWduZWQgbG9uZykoKF9fcDEpICsgMSkgIT0gKHVuc2lnbmVkIGxvbmcpKF9fcDIpKTtcCi0JaWYgKHNpemVvZihsb25nKSA9PSA0KQkJCQkJCVwKLQkJX19yZXQgPSBfX2NtcHhjaGdfZG91YmxlXzQoX19wMSwgX19wMiwgbzEsIG8yLCBuMSwgbjIpOwlcCi0JZWxzZQkJCQkJCQkJXAotCQlfX3JldCA9IF9fY21weGNoZ19kb3VibGVfOChfX3AxLCBfX3AyLCBvMSwgbzIsIG4xLCBuMik7CVwKLQlfX3JldDsJCQkJCQkJCVwKKwlfX2NtcHhjaGdfZG91YmxlXzgoX19wMSwgX19wMiwgbzEsIG8yLCBuMSwgbjIpOwkJCVwKIH0pCiAKICNkZWZpbmUgc3lzdGVtX2hhc19jbXB4Y2hnX2RvdWJsZSgpCTEKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jcHV0aW1lLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY3B1dGltZS5oCmluZGV4IGI5MWU5NjAuLjIyMWI0NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NwdXRpbWUuaApAQCAtMjIsMTUgKzIyLDcgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fZGl2KHVuc2lnbmVkIGxvbmcgbG9uZyBuLCB1bnNpZ25lZCBsb25nIGJhc2UpCiB7Ci0jaWZuZGVmIENPTkZJR182NEJJVAotCXJlZ2lzdGVyX3BhaXIgcnA7Ci0KLQlycC5wYWlyID0gbiA+PiAxOwotCWFzbSAoImRyICUwLCUxIiA6ICIrZCIgKHJwKSA6ICJkIiAoYmFzZSA+PiAxKSk7Ci0JcmV0dXJuIHJwLnN1YnJlZy5vZGQ7Ci0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KIAlyZXR1cm4gbiAvIGJhc2U7Ci0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiB9CiAKICNkZWZpbmUgY3B1dGltZV9vbmVfamlmZnkJCWppZmZpZXNfdG9fY3B1dGltZSgxKQpAQCAtMTAxLDE3ICs5Myw4IEBACiAJCQkJICAgICAgIHN0cnVjdCB0aW1lc3BlYyAqdmFsdWUpCiB7CiAJdW5zaWduZWQgbG9uZyBsb25nIF9fY3B1dGltZSA9IChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcgbG9uZykgY3B1dGltZTsKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0JcmVnaXN0ZXJfcGFpciBycDsKLQotCXJwLnBhaXIgPSBfX2NwdXRpbWUgPj4gMTsKLQlhc20gKCJkciAlMCwlMSIgOiAiK2QiIChycCkgOiAiZCIgKENQVVRJTUVfUEVSX1NFQyAvIDIpKTsKLQl2YWx1ZS0+dHZfbnNlYyA9IHJwLnN1YnJlZy5ldmVuICogTlNFQ19QRVJfVVNFQyAvIENQVVRJTUVfUEVSX1VTRUM7Ci0JdmFsdWUtPnR2X3NlYyA9IHJwLnN1YnJlZy5vZGQ7Ci0jZWxzZQogCXZhbHVlLT50dl9uc2VjID0gKF9fY3B1dGltZSAlIENQVVRJTUVfUEVSX1NFQykgKiBOU0VDX1BFUl9VU0VDIC8gQ1BVVElNRV9QRVJfVVNFQzsKIAl2YWx1ZS0+dHZfc2VjID0gX19jcHV0aW1lIC8gQ1BVVElNRV9QRVJfU0VDOwotI2VuZGlmCiB9CiAKIC8qCkBAIC0xMjksMTcgKzExMiw4IEBACiAJCQkJICAgICAgc3RydWN0IHRpbWV2YWwgKnZhbHVlKQogewogCXVuc2lnbmVkIGxvbmcgbG9uZyBfX2NwdXRpbWUgPSAoX19mb3JjZSB1bnNpZ25lZCBsb25nIGxvbmcpIGNwdXRpbWU7Ci0jaWZuZGVmIENPTkZJR182NEJJVAotCXJlZ2lzdGVyX3BhaXIgcnA7Ci0KLQlycC5wYWlyID0gX19jcHV0aW1lID4+IDE7Ci0JYXNtICgiZHIgJTAsJTEiIDogIitkIiAocnApIDogImQiIChDUFVUSU1FX1BFUl9VU0VDIC8gMikpOwotCXZhbHVlLT50dl91c2VjID0gcnAuc3VicmVnLmV2ZW4gLyBDUFVUSU1FX1BFUl9VU0VDOwotCXZhbHVlLT50dl9zZWMgPSBycC5zdWJyZWcub2RkOwotI2Vsc2UKIAl2YWx1ZS0+dHZfdXNlYyA9IChfX2NwdXRpbWUgJSBDUFVUSU1FX1BFUl9TRUMpIC8gQ1BVVElNRV9QRVJfVVNFQzsKIAl2YWx1ZS0+dHZfc2VjID0gX19jcHV0aW1lIC8gQ1BVVElNRV9QRVJfU0VDOwotI2VuZGlmCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY3RsX3JlZy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2N0bF9yZWcuaAppbmRleCAzMWFiOWYzLi5jZmFkN2ZjYSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2N0bF9yZWcuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY3RsX3JlZy5oCkBAIC05LDIwICs5LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9idWcuaD4KIAotI2lmZGVmIENPTkZJR182NEJJVAotIyBkZWZpbmUgX19DVExfTE9BRAkibGN0bGciCi0jIGRlZmluZSBfX0NUTF9TVE9SRQkic3RjdGciCi0jZWxzZQotIyBkZWZpbmUgX19DVExfTE9BRAkibGN0bCIKLSMgZGVmaW5lIF9fQ1RMX1NUT1JFCSJzdGN0bCIKLSNlbmRpZgotCiAjZGVmaW5lIF9fY3RsX2xvYWQoYXJyYXksIGxvdywgaGlnaCkgewkJCQkJXAogCXR5cGVkZWYgc3RydWN0IHsgY2hhciBfW3NpemVvZihhcnJheSldOyB9IGFkZHJ0eXBlOwkJXAogCQkJCQkJCQkJXAogCUJVSUxEX0JVR19PTihzaXplb2YoYWRkcnR5cGUpICE9IChoaWdoIC0gbG93ICsgMSkgKiBzaXplb2YobG9uZykpO1wKIAlhc20gdm9sYXRpbGUoCQkJCQkJCVwKLQkJX19DVExfTE9BRCAiICUxLCUyLCUwXG4iCQkJCVwKKwkJIglsY3RsZwklMSwlMiwlMFxuIgkJCQlcCiAJCTogOiAiUSIgKCooYWRkcnR5cGUgKikoJmFycmF5KSksICJpIiAobG93KSwgImkiIChoaWdoKSk7XAogfQogCkBAIC0zMSw3ICsyMyw3IEBACiAJCQkJCQkJCQlcCiAJQlVJTERfQlVHX09OKHNpemVvZihhZGRydHlwZSkgIT0gKGhpZ2ggLSBsb3cgKyAxKSAqIHNpemVvZihsb25nKSk7XAogCWFzbSB2b2xhdGlsZSgJCQkJCQkJXAotCQlfX0NUTF9TVE9SRSAiICUxLCUyLCUwXG4iCQkJCVwKKwkJIglzdGN0ZwklMSwlMiwlMFxuIgkJCQlcCiAJCTogIj1RIiAoKihhZGRydHlwZSAqKSgmYXJyYXkpKQkJCQlcCiAJCTogImkiIChsb3cpLCAiaSIgKGhpZ2gpKTsJCQkJXAogfQpAQCAtNjAsOSArNTIsNyBAQAogdW5pb24gY3RscmVnMCB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJc3RydWN0IHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAkJdW5zaWduZWQgbG9uZwkgICA6IDMyOwotI2VuZGlmCiAJCXVuc2lnbmVkIGxvbmcJICAgOiAzOwogCQl1bnNpZ25lZCBsb25nIGxhcCAgOiAxOyAvKiBMb3ctYWRkcmVzcy1wcm90ZWN0aW9uIGNvbnRyb2wgKi8KIAkJdW5zaWduZWQgbG9uZwkgICA6IDQ7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZWxmLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vZWxmLmgKaW5kZXggYzlkZjQwYi4uM2FkNDhmMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9lbGYuaApAQCAtMTA3LDExICsxMDcsNyBAQAogLyoKICAqIFRoZXNlIGFyZSB1c2VkIHRvIHNldCBwYXJhbWV0ZXJzIGluIHRoZSBjb3JlIGR1bXBzLgogICovCi0jaWZuZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBFTEZfQ0xBU1MJRUxGQ0xBU1MzMgotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAjZGVmaW5lIEVMRl9DTEFTUwlFTEZDTEFTUzY0Ci0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAjZGVmaW5lIEVMRl9EQVRBCUVMRkRBVEEyTVNCCiAjZGVmaW5lIEVMRl9BUkNICUVNX1MzOTAKIApAQCAtMTYxLDEwICsxNTcsMTEgQEAKIC8qIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHRoYXQgYW4gRVRfRFlOIHByb2dyYW0gaXMgbG9hZGVkIGlmIGV4ZWMnZWQuICBUeXBpY2FsCiAgICB1c2Ugb2YgdGhpcyBpcyB0byBpbnZva2UgIi4vbGQuc28gc29tZXByb2ciIHRvIHRlc3Qgb3V0IGEgbmV3IHZlcnNpb24gb2YKICAgIHRoZSBsb2FkZXIuICBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIG91dCBvZiB0aGUgd2F5IG9mIHRoZSBwcm9ncmFtCi0gICB0aGF0IGl0IHdpbGwgImV4ZWMiLCBhbmQgdGhhdCB0aGVyZSBpcyBzdWZmaWNpZW50IHJvb20gZm9yIHRoZSBicmsuICAqLwotCi1leHRlcm4gdW5zaWduZWQgbG9uZyByYW5kb21pemVfZXRfZHluKHZvaWQpOwotI2RlZmluZSBFTEZfRVRfRFlOX0JBU0UJCXJhbmRvbWl6ZV9ldF9keW4oKQorICAgdGhhdCBpdCB3aWxsICJleGVjIiwgYW5kIHRoYXQgdGhlcmUgaXMgc3VmZmljaWVudCByb29tIGZvciB0aGUgYnJrLiA2NC1iaXQKKyAgIHRhc2tzIGFyZSBhbGlnbmVkIHRvIDRHQi4gKi8KKyNkZWZpbmUgRUxGX0VUX0RZTl9CQVNFIChpc18zMmJpdF90YXNrKCkgPyBcCisJCQkJKFNUQUNLX1RPUCAvIDMgKiAyKSA6IFwKKwkJCQkoU1RBQ0tfVE9QIC8gMyAqIDIpICYgfigoMVVMIDw8IDMyKSAtIDEpKQogCiAvKiBUaGlzIHlpZWxkcyBhIG1hc2sgdGhhdCB1c2VyIHByb2dyYW1zIGNhbiB1c2UgdG8gZmlndXJlIG91dCB3aGF0CiAgICBpbnN0cnVjdGlvbiBzZXQgdGhpcyBDUFUgc3VwcG9ydHMuICovCkBAIC0yMTEsNyArMjA4LDcgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW1hcF9ybmRfbWFzazsKIAotI2RlZmluZSBTVEFDS19STkRfTUFTSwkobW1hcF9ybmRfbWFzaykKKyNkZWZpbmUgU1RBQ0tfUk5EX01BU0sJKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMxQklUKSA/IDB4N2ZmIDogbW1hcF9ybmRfbWFzaykKIAogI2RlZmluZSBBUkNIX0RMSU5GTwkJCQkJCQkgICAgXAogZG8gewkJCQkJCQkJCSAgICBcCkBAIC0yMjUsOSArMjIyLDYgQEAKICNkZWZpbmUgQVJDSF9IQVNfU0VUVVBfQURESVRJT05BTF9QQUdFUyAxCiBpbnQgYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzKHN0cnVjdCBsaW51eF9iaW5wcm0gKiwgaW50KTsKIAotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXJjaF9yYW5kb21pemVfYnJrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKLSNkZWZpbmUgYXJjaF9yYW5kb21pemVfYnJrIGFyY2hfcmFuZG9taXplX2JyawotCiB2b2lkICpmaWxsX2NwdV9lbGZfbm90ZXModm9pZCAqcHRyLCBzdHJ1Y3Qgc2F2ZV9hcmVhICpzYSwgX192ZWN0b3IxMjggKnZ4cnMpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pZGFscy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lkYWxzLmgKaW5kZXggZWE1YTZlNC4uYTdiMmQ3NSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lkYWxzLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lkYWxzLmgKQEAgLTE5LDExICsxOSw3IEBACiAjaW5jbHVkZSA8YXNtL2Npby5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKICNkZWZpbmUgSURBX1NJWkVfTE9HIDEyIC8qIDExIGZvciAyayAsIDEyIGZvciA0ayAqLwotI2Vsc2UKLSNkZWZpbmUgSURBX1NJWkVfTE9HIDExIC8qIDExIGZvciAyayAsIDEyIGZvciA0ayAqLwotI2VuZGlmCiAjZGVmaW5lIElEQV9CTE9DS19TSVpFICgxTDw8SURBX1NJWkVfTE9HKQogCiAvKgpAQCAtMzIsMTEgKzI4LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBpZGFsX2lzX25lZWRlZCh2b2lkICp2YWRkciwgdW5zaWduZWQgaW50IGxlbmd0aCkKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlyZXR1cm4gKChfX3BhKHZhZGRyKSArIGxlbmd0aCAtIDEpID4+IDMxKSAhPSAwOwotI2Vsc2UKLQlyZXR1cm4gMDsKLSNlbmRpZgogfQogCiAKQEAgLTc3LDcgKzY5LDYgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBzZXRfbm9ybWFsaXplZF9jZGEoc3RydWN0IGNjdzEgKiBjY3csIHZvaWQgKnZhZGRyKQogewotI2lmZGVmIENPTkZJR182NEJJVAogCXVuc2lnbmVkIGludCBucmlkYXdzOwogCXVuc2lnbmVkIGxvbmcgKmlkYWw7CiAKQEAgLTkzLDcgKzg0LDYgQEAKIAkJY2N3LT5mbGFncyB8PSBDQ1dfRkxBR19JREE7CiAJCXZhZGRyID0gaWRhbDsKIAl9Ci0jZW5kaWYKIAljY3ctPmNkYSA9IChfX3UzMikodW5zaWduZWQgbG9uZykgdmFkZHI7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDQsMTIgKzk0LDEwIEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGNsZWFyX25vcm1hbGl6ZWRfY2RhKHN0cnVjdCBjY3cxICogY2N3KQogewotI2lmZGVmIENPTkZJR182NEJJVAogCWlmIChjY3ctPmZsYWdzICYgQ0NXX0ZMQUdfSURBKSB7CiAJCWtmcmVlKCh2b2lkICopKHVuc2lnbmVkIGxvbmcpIGNjdy0+Y2RhKTsKIAkJY2N3LT5mbGFncyAmPSB+Q0NXX0ZMQUdfSURBOwogCX0KLSNlbmRpZgogCWNjdy0+Y2RhID0gMDsKIH0KIApAQCAtMTgxLDEyICsxNjksOCBAQAogc3RhdGljIGlubGluZSBpbnQKIF9faWRhbF9idWZmZXJfaXNfbmVlZGVkKHN0cnVjdCBpZGFsX2J1ZmZlciAqaWIpCiB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJcmV0dXJuIGliLT5zaXplID4gKDQwOTZ1bCA8PCBpYi0+cGFnZV9vcmRlcikgfHwKIAkJaWRhbF9pc19uZWVkZWQoaWItPmRhdGFbMF0sIGliLT5zaXplKTsKLSNlbHNlCi0JcmV0dXJuIGliLT5zaXplID4gKDQwOTZ1bCA8PCBpYi0+cGFnZV9vcmRlcik7Ci0jZW5kaWYKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcnEuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcnEuaAppbmRleCAzNDNlYTdjLi5mZjk1ZDE1IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXJxLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lycS5oCkBAIC01Nyw3ICs1Nyw2IEBACiAJSVJRSU9fVEFQLAogCUlSUUlPX1ZNUiwKIAlJUlFJT19MQ1MsCi0JSVJRSU9fQ0xXLAogCUlSUUlPX0NUQywKIAlJUlFJT19BUEIsCiAJSVJRSU9fQURNLApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKaW5kZXggNTg2NDJmZC4uNjk5NzJiNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oCkBAIC0xLDE5ICsxLDEzIEBACiAjaWZuZGVmIF9BU01fUzM5MF9KVU1QX0xBQkVMX0gKICNkZWZpbmUgX0FTTV9TMzkwX0pVTVBfTEFCRUxfSAogCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogI2RlZmluZSBKVU1QX0xBQkVMX05PUF9TSVpFIDYKICNkZWZpbmUgSlVNUF9MQUJFTF9OT1BfT0ZGU0VUIDIKIAotI2lmZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBBU01fUFRSICIucXVhZCIKLSNkZWZpbmUgQVNNX0FMSUdOICIuYmFsaWduIDgiCi0jZWxzZQotI2RlZmluZSBBU01fUFRSICIubG9uZyIKLSNkZWZpbmUgQVNNX0FMSUdOICIuYmFsaWduIDQiCi0jZW5kaWYKLQogLyoKICAqIFdlIHVzZSBhIGJyY2wgMCwyIGluc3RydWN0aW9uIGZvciBqdW1wIGxhYmVscyBhdCBjb21waWxlIHRpbWUgc28gaXQKICAqIGNhbiBiZSBlYXNpbHkgZGlzdGluZ3Vpc2hlZCBmcm9tIGEgaG90cGF0Y2ggZ2VuZXJhdGVkIGluc3RydWN0aW9uLgpAQCAtMjIsOCArMTYsOCBAQAogewogCWFzbV92b2xhdGlsZV9nb3RvKCIwOglicmNsIDAsIl9fc3RyaW5naWZ5KEpVTVBfTEFCRUxfTk9QX09GRlNFVCkiXG4iCiAJCSIucHVzaHNlY3Rpb24gX19qdW1wX3RhYmxlLCBcImF3XCJcbiIKLQkJQVNNX0FMSUdOICJcbiIKLQkJQVNNX1BUUiAiIDBiLCAlbFtsYWJlbF0sICUwXG4iCisJCSIuYmFsaWduIDhcbiIKKwkJIi5xdWFkIDBiLCAlbFtsYWJlbF0sICUwXG4iCiAJCSIucG9wc2VjdGlvblxuIgogCQk6IDogIlgiIChrZXkpIDogOiBsYWJlbCk7CiAJcmV0dXJuIGZhbHNlOwpAQCAtMzksNCArMzMsNSBAQAogCWp1bXBfbGFiZWxfdCBrZXk7CiB9OwogCisjZW5kaWYgIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCmluZGV4IGY0MDdiYmYuLmQwMWZjNTggMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC0xNzIsNyArMTcyLDkgQEAKIAlfX3UzMglmYWM7CQkJLyogMHgwMWEwICovCiAJX191OAlyZXNlcnZlZDFhNFsyMF07CS8qIDB4MDFhNCAqLwogCV9fdTY0CWNicmxvOwkJCS8qIDB4MDFiOCAqLwotCV9fdTgJcmVzZXJ2ZWQxYzBbMzBdOwkvKiAweDAxYzAgKi8KKwlfX3U4CXJlc2VydmVkMWMwWzhdOwkJLyogMHgwMWMwICovCisJX191MzIJZWNkOwkJCS8qIDB4MDFjOCAqLworCV9fdTgJcmVzZXJ2ZWQxY2NbMThdOwkvKiAweDAxY2MgKi8KIAlfX3U2NAlwcDsJCQkvKiAweDAxZGUgKi8KIAlfX3U4CXJlc2VydmVkMWU2WzJdOwkJLyogMHgwMWU2ICovCiAJX191NjQJaXRkYmE7CQkJLyogMHgwMWU4ICovCkBAIC0xODMsMTEgKzE4NSwxNyBAQAogCV9fdTgJZGF0YVsyNTZdOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IGt2bV9zMzkwX3ZyZWdzIHsKKwlfX3ZlY3RvcjEyOCB2cnNbMzJdOworCV9fdTgJcmVzZXJ2ZWQyMDBbNTEyXTsJLyogZm9yIGZ1dHVyZSB2ZWN0b3IgZXhwYW5zaW9uICovCit9IF9fcGFja2VkOworCiBzdHJ1Y3Qgc2llX3BhZ2UgewogCXN0cnVjdCBrdm1fczM5MF9zaWVfYmxvY2sgc2llX2Jsb2NrOwogCV9fdTggcmVzZXJ2ZWQyMDBbMTAyNF07CQkvKiAweDAyMDAgKi8KIAlzdHJ1Y3Qga3ZtX3MzOTBfaXRkYiBpdGRiOwkvKiAweDA2MDAgKi8KLQlfX3U4IHJlc2VydmVkNzAwWzIzMDRdOwkJLyogMHgwNzAwICovCisJX191OCByZXNlcnZlZDcwMFsxMjgwXTsJCS8qIDB4MDcwMCAqLworCXN0cnVjdCBrdm1fczM5MF92cmVncyB2cmVnczsJLyogMHgwYzAwICovCiB9IF9fcGFja2VkOwogCiBzdHJ1Y3Qga3ZtX3ZjcHVfc3RhdCB7CkBAIC0yMzgsNiArMjQ2LDcgQEAKIAl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9zdG9wOwogCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3N0b3Bfc3RvcmVfc3RhdHVzOwogCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3N0b3JlX3N0YXR1czsKKwl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9zdG9yZV9hZHRsX3N0YXR1czsKIAl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9hcmNoOwogCXUzMiBpbnN0cnVjdGlvbl9zaWdwX3ByZWZpeDsKIAl1MzIgaW5zdHJ1Y3Rpb25fc2lncF9yZXN0YXJ0OwpAQCAtMjcwLDYgKzI3OSw3IEBACiAjZGVmaW5lIFBHTV9TUEVDSUFMX09QRVJBVElPTgkJMHgxMwogI2RlZmluZSBQR01fT1BFUkFORAkJCTB4MTUKICNkZWZpbmUgUEdNX1RSQUNFX1RBQkVMCQkJMHgxNgorI2RlZmluZSBQR01fVkVDVE9SX1BST0NFU1NJTkcJCTB4MWIKICNkZWZpbmUgUEdNX1NQQUNFX1NXSVRDSAkJMHgxYwogI2RlZmluZSBQR01fSEZQX1NRVUFSRV9ST09UCQkweDFkCiAjZGVmaW5lIFBHTV9QQ19UUkFOU0xBVElPTl9TUEVDCQkweDFmCkBAIC0zMzQsNiArMzQ0LDExIEBACiAJSVJRX1BFTkRfQ09VTlQKIH07CiAKKy8qIFdlIGhhdmUgMk0gZm9yIHZpcnRpbyBkZXZpY2UgZGVzY3JpcHRvciBwYWdlcy4gU21hbGxlc3QgYW1vdW50IG9mCisgKiBtZW1vcnkgcGVyIHBhZ2UgaXMgMjQgYnl0ZXMgKDEgcXVldWUpLCBzbyAoMjA0OCoxMDI0KSAvIDI0ID0gODczODEKKyAqLworI2RlZmluZSBLVk1fUzM5MF9NQVhfVklSVElPX0lSUVMgODczODEKKwogLyoKICAqIFJlcHJlc3NpYmxlIChub24tZmxvYXRpbmcpIG1hY2hpbmUgY2hlY2sgaW50ZXJydXB0cwogICogc3ViY2xhc3MgYml0cyBpbiBNQ0lDCkBAIC00MTEsMTMgKzQyNiwzMiBAQAogCXVuc2lnbmVkIGxvbmcgcGVuZGluZ19pcnFzOwogfTsKIAorI2RlZmluZSBGSVJRX0xJU1RfSU9fSVNDXzAgMAorI2RlZmluZSBGSVJRX0xJU1RfSU9fSVNDXzEgMQorI2RlZmluZSBGSVJRX0xJU1RfSU9fSVNDXzIgMgorI2RlZmluZSBGSVJRX0xJU1RfSU9fSVNDXzMgMworI2RlZmluZSBGSVJRX0xJU1RfSU9fSVNDXzQgNAorI2RlZmluZSBGSVJRX0xJU1RfSU9fSVNDXzUgNQorI2RlZmluZSBGSVJRX0xJU1RfSU9fSVNDXzYgNgorI2RlZmluZSBGSVJRX0xJU1RfSU9fSVNDXzcgNworI2RlZmluZSBGSVJRX0xJU1RfUEZBVUxUICAgOAorI2RlZmluZSBGSVJRX0xJU1RfVklSVElPICAgOQorI2RlZmluZSBGSVJRX0xJU1RfQ09VTlQgICAxMAorI2RlZmluZSBGSVJRX0NOVFJfSU8gICAgICAgMAorI2RlZmluZSBGSVJRX0NOVFJfU0VSVklDRSAgMQorI2RlZmluZSBGSVJRX0NOVFJfVklSVElPICAgMgorI2RlZmluZSBGSVJRX0NOVFJfUEZBVUxUICAgMworI2RlZmluZSBGSVJRX01BWF9DT1VOVCAgICAgNAorCiBzdHJ1Y3Qga3ZtX3MzOTBfZmxvYXRfaW50ZXJydXB0IHsKKwl1bnNpZ25lZCBsb25nIHBlbmRpbmdfaXJxczsKIAlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCWF0b21pY190IGFjdGl2ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RzW0ZJUlFfTElTVF9DT1VOVF07CisJaW50IGNvdW50ZXJzW0ZJUlFfTUFYX0NPVU5UXTsKKwlzdHJ1Y3Qga3ZtX3MzOTBfbWNoa19pbmZvIG1jaGs7CisJc3RydWN0IGt2bV9zMzkwX2V4dF9pbmZvIHNydl9zaWduYWw7CiAJaW50IG5leHRfcnJfY3B1OwogCXVuc2lnbmVkIGxvbmcgaWRsZV9tYXNrW0JJVFNfVE9fTE9OR1MoS1ZNX01BWF9WQ1BVUyldOwotCXVuc2lnbmVkIGludCBpcnFfY291bnQ7CiB9OwogCiBzdHJ1Y3Qga3ZtX2h3X3dwX2luZm9fYXJjaCB7CkBAIC00NjUsNiArNDk5LDcgQEAKIAlzMzkwX2ZwX3JlZ3MgICAgICBob3N0X2ZwcmVnczsKIAl1bnNpZ25lZCBpbnQgICAgICBob3N0X2FjcnNbTlVNX0FDUlNdOwogCXMzOTBfZnBfcmVncyAgICAgIGd1ZXN0X2ZwcmVnczsKKwlzdHJ1Y3Qga3ZtX3MzOTBfdnJlZ3MJKmhvc3RfdnJlZ3M7CiAJc3RydWN0IGt2bV9zMzkwX2xvY2FsX2ludGVycnVwdCBsb2NhbF9pbnQ7CiAJc3RydWN0IGhydGltZXIgICAgY2tjX3RpbWVyOwogCXN0cnVjdCBrdm1fczM5MF9wZ21faW5mbyBwZ207CkBAIC01NTMsNiArNTg4LDcgQEAKIAlpbnQgdXNlX2NtbWE7CiAJaW50IHVzZXJfY3B1X3N0YXRlX2N0cmw7CiAJaW50IHVzZXJfc2lncDsKKwlpbnQgdXNlcl9zdHNpOwogCXN0cnVjdCBzMzkwX2lvX2FkYXB0ZXIgKmFkYXB0ZXJzW01BWF9TMzkwX0lPX0FEQVBURVJTXTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpcHRlX3dxOwogCWludCBpcHRlX2xvY2tfY291bnQ7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbGl2ZXBhdGNoLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbGl2ZXBhdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhNzk5MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9saXZlcGF0Y2guaApAQCAtMCwwICsxLDQzIEBACisvKgorICogbGl2ZXBhdGNoLmggLSBzMzkwLXNwZWNpZmljIEtlcm5lbCBMaXZlIFBhdGNoaW5nIENvcmUKKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgU1VTRQorICogICBBdXRob3JzOiBKaXJpIEtvc2luYQorICoJICAgICAgVm9qdGVjaCBQYXZsaWsKKyAqCSAgICAgIEppcmkgU2xhYnkKKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIEFTTV9MSVZFUEFUQ0hfSAorI2RlZmluZSBBU01fTElWRVBBVENIX0gKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaWZkZWYgQ09ORklHX0xJVkVQQVRDSAorc3RhdGljIGlubGluZSBpbnQga2xwX2NoZWNrX2NvbXBpbGVyX3N1cHBvcnQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQga2xwX3dyaXRlX21vZHVsZV9yZWxvYyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcKKwkJdHlwZSwgdW5zaWduZWQgbG9uZyBsb2MsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGtscF9hcmNoX3NldF9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBpcCkKK3sKKwlyZWdzLT5wc3cuYWRkciA9IGlwOworfQorI2Vsc2UKKyNlcnJvciBMaXZlIHBhdGNoaW5nIHN1cHBvcnQgaXMgZGlzYWJsZWQ7IGNoZWNrIENPTkZJR19MSVZFUEFUQ0gKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oCmluZGV4IDM0ZmJjYWMuLjY2M2YyM2UgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaApAQCAtMTMsMTYzICsxMyw2IEBACiAjaW5jbHVkZSA8YXNtL2NwdS5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCi0jaWZkZWYgQ09ORklHXzMyQklUCi0KLSNkZWZpbmUgTENfT1JERVIgMAotI2RlZmluZSBMQ19QQUdFUyAxCi0KLXN0cnVjdCBzYXZlX2FyZWEgewotCXUzMglleHRfc2F2ZTsKLQl1NjQJdGltZXI7Ci0JdTY0CWNsa19jbXA7Ci0JdTgJcGFkMVsyNF07Ci0JdTgJcHN3WzhdOwotCXUzMglwcmVmX3JlZzsKLQl1OAlwYWQyWzIwXTsKLQl1MzIJYWNjX3JlZ3NbMTZdOwotCXU2NAlmcF9yZWdzWzRdOwotCXUzMglncF9yZWdzWzE2XTsKLQl1MzIJY3RybF9yZWdzWzE2XTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzYXZlX2FyZWFfZXh0IHsKLQlzdHJ1Y3Qgc2F2ZV9hcmVhCXNhOwotCV9fdmVjdG9yMTI4CQl2eF9yZWdzWzMyXTsKLX07Ci0KLXN0cnVjdCBfbG93Y29yZSB7Ci0JcHN3X3QJcmVzdGFydF9wc3c7CQkJLyogMHgwMDAwICovCi0JcHN3X3QJcmVzdGFydF9vbGRfcHN3OwkJLyogMHgwMDA4ICovCi0JX191OAlwYWRfMHgwMDEwWzB4MDAxNC0weDAwMTBdOwkvKiAweDAwMTAgKi8KLQlfX3UzMglpcGxfcGFybWJsb2NrX3B0cjsJCS8qIDB4MDAxNCAqLwotCXBzd190CWV4dGVybmFsX29sZF9wc3c7CQkvKiAweDAwMTggKi8KLQlwc3dfdAlzdmNfb2xkX3BzdzsJCQkvKiAweDAwMjAgKi8KLQlwc3dfdAlwcm9ncmFtX29sZF9wc3c7CQkvKiAweDAwMjggKi8KLQlwc3dfdAltY2NrX29sZF9wc3c7CQkJLyogMHgwMDMwICovCi0JcHN3X3QJaW9fb2xkX3BzdzsJCQkvKiAweDAwMzggKi8KLQlfX3U4CXBhZF8weDAwNDBbMHgwMDU4LTB4MDA0MF07CS8qIDB4MDA0MCAqLwotCXBzd190CWV4dGVybmFsX25ld19wc3c7CQkvKiAweDAwNTggKi8KLQlwc3dfdAlzdmNfbmV3X3BzdzsJCQkvKiAweDAwNjAgKi8KLQlwc3dfdAlwcm9ncmFtX25ld19wc3c7CQkvKiAweDAwNjggKi8KLQlwc3dfdAltY2NrX25ld19wc3c7CQkJLyogMHgwMDcwICovCi0JcHN3X3QJaW9fbmV3X3BzdzsJCQkvKiAweDAwNzggKi8KLQlfX3UzMglleHRfcGFyYW1zOwkJCS8qIDB4MDA4MCAqLwotCV9fdTE2CWV4dF9jcHVfYWRkcjsJCQkvKiAweDAwODQgKi8KLQlfX3UxNglleHRfaW50X2NvZGU7CQkJLyogMHgwMDg2ICovCi0JX191MTYJc3ZjX2lsYzsJCQkvKiAweDAwODggKi8KLQlfX3UxNglzdmNfY29kZTsJCQkvKiAweDAwOGEgKi8KLQlfX3UxNglwZ21faWxjOwkJCS8qIDB4MDA4YyAqLwotCV9fdTE2CXBnbV9jb2RlOwkJCS8qIDB4MDA4ZSAqLwotCV9fdTMyCXRyYW5zX2V4Y19jb2RlOwkJCS8qIDB4MDA5MCAqLwotCV9fdTE2CW1vbl9jbGFzc19udW07CQkJLyogMHgwMDk0ICovCi0JX191OAlwZXJfY29kZTsJCQkvKiAweDAwOTYgKi8KLQlfX3U4CXBlcl9hdG1pZDsJCQkvKiAweDAwOTcgKi8KLQlfX3UzMglwZXJfYWRkcmVzczsJCQkvKiAweDAwOTggKi8KLQlfX3UzMgltb25pdG9yX2NvZGU7CQkJLyogMHgwMDljICovCi0JX191OAlleGNfYWNjZXNzX2lkOwkJCS8qIDB4MDBhMCAqLwotCV9fdTgJcGVyX2FjY2Vzc19pZDsJCQkvKiAweDAwYTEgKi8KLQlfX3U4CW9wX2FjY2Vzc19pZDsJCQkvKiAweDAwYTIgKi8KLQlfX3U4CWFyX21vZGVfaWQ7CQkJLyogMHgwMGEzICovCi0JX191OAlwYWRfMHgwMGE0WzB4MDBiOC0weDAwYTRdOwkvKiAweDAwYTQgKi8KLQlfX3UxNglzdWJjaGFubmVsX2lkOwkJCS8qIDB4MDBiOCAqLwotCV9fdTE2CXN1YmNoYW5uZWxfbnI7CQkJLyogMHgwMGJhICovCi0JX191MzIJaW9faW50X3Bhcm07CQkJLyogMHgwMGJjICovCi0JX191MzIJaW9faW50X3dvcmQ7CQkJLyogMHgwMGMwICovCi0JX191OAlwYWRfMHgwMGM0WzB4MDBjOC0weDAwYzRdOwkvKiAweDAwYzQgKi8KLQlfX3UzMglzdGZsX2ZhY19saXN0OwkJCS8qIDB4MDBjOCAqLwotCV9fdTgJcGFkXzB4MDBjY1sweDAwZDQtMHgwMGNjXTsJLyogMHgwMGNjICovCi0JX191MzIJZXh0ZW5kZWRfc2F2ZV9hcmVhX2FkZHI7CS8qIDB4MDBkNCAqLwotCV9fdTMyCWNwdV90aW1lcl9zYXZlX2FyZWFbMl07CQkvKiAweDAwZDggKi8KLQlfX3UzMgljbG9ja19jb21wX3NhdmVfYXJlYVsyXTsJLyogMHgwMGUwICovCi0JX191MzIJbWNja19pbnRlcnJ1cHRpb25fY29kZVsyXTsJLyogMHgwMGU4ICovCi0JX191OAlwYWRfMHgwMGYwWzB4MDBmNC0weDAwZjBdOwkvKiAweDAwZjAgKi8KLQlfX3UzMglleHRlcm5hbF9kYW1hZ2VfY29kZTsJCS8qIDB4MDBmNCAqLwotCV9fdTMyCWZhaWxpbmdfc3RvcmFnZV9hZGRyZXNzOwkvKiAweDAwZjggKi8KLQlfX3U4CXBhZF8weDAwZmNbMHgwMTAwLTB4MDBmY107CS8qIDB4MDBmYyAqLwotCXBzd190CXBzd19zYXZlX2FyZWE7CQkJLyogMHgwMTAwICovCi0JX191MzIJcHJlZml4cmVnX3NhdmVfYXJlYTsJCS8qIDB4MDEwOCAqLwotCV9fdTgJcGFkXzB4MDEwY1sweDAxMjAtMHgwMTBjXTsJLyogMHgwMTBjICovCi0KLQkvKiBDUFUgcmVnaXN0ZXIgc2F2ZSBhcmVhOiBkZWZpbmVkIGJ5IGFyY2hpdGVjdHVyZSAqLwotCV9fdTMyCWFjY2Vzc19yZWdzX3NhdmVfYXJlYVsxNl07CS8qIDB4MDEyMCAqLwotCV9fdTMyCWZsb2F0aW5nX3B0X3NhdmVfYXJlYVs4XTsJLyogMHgwMTYwICovCi0JX191MzIJZ3ByZWdzX3NhdmVfYXJlYVsxNl07CQkvKiAweDAxODAgKi8KLQlfX3UzMgljcmVnc19zYXZlX2FyZWFbMTZdOwkJLyogMHgwMWMwICovCi0KLQkvKiBTYXZlIGFyZWFzLiAqLwotCV9fdTMyCXNhdmVfYXJlYV9zeW5jWzhdOwkJLyogMHgwMjAwICovCi0JX191MzIJc2F2ZV9hcmVhX2FzeW5jWzhdOwkJLyogMHgwMjIwICovCi0JX191MzIJc2F2ZV9hcmVhX3Jlc3RhcnRbMV07CQkvKiAweDAyNDAgKi8KLQotCS8qIENQVSBmbGFncy4gKi8KLQlfX3UzMgljcHVfZmxhZ3M7CQkJLyogMHgwMjQ0ICovCi0KLQkvKiBSZXR1cm4gcHN3cy4gKi8KLQlwc3dfdAlyZXR1cm5fcHN3OwkJCS8qIDB4MDI0OCAqLwotCXBzd190CXJldHVybl9tY2NrX3BzdzsJCS8qIDB4MDI1MCAqLwotCi0JLyogQ1BVIHRpbWUgYWNjb3VudGluZyB2YWx1ZXMgKi8KLQlfX3U2NAlzeW5jX2VudGVyX3RpbWVyOwkJLyogMHgwMjU4ICovCi0JX191NjQJYXN5bmNfZW50ZXJfdGltZXI7CQkvKiAweDAyNjAgKi8KLQlfX3U2NAltY2NrX2VudGVyX3RpbWVyOwkJLyogMHgwMjY4ICovCi0JX191NjQJZXhpdF90aW1lcjsJCQkvKiAweDAyNzAgKi8KLQlfX3U2NAl1c2VyX3RpbWVyOwkJCS8qIDB4MDI3OCAqLwotCV9fdTY0CXN5c3RlbV90aW1lcjsJCQkvKiAweDAyODAgKi8KLQlfX3U2NAlzdGVhbF90aW1lcjsJCQkvKiAweDAyODggKi8KLQlfX3U2NAlsYXN0X3VwZGF0ZV90aW1lcjsJCS8qIDB4MDI5MCAqLwotCV9fdTY0CWxhc3RfdXBkYXRlX2Nsb2NrOwkJLyogMHgwMjk4ICovCi0JX191NjQJaW50X2Nsb2NrOwkJCS8qIDB4MDJhMCAqLwotCV9fdTY0CW1jY2tfY2xvY2s7CQkJLyogMHgwMmE4ICovCi0JX191NjQJY2xvY2tfY29tcGFyYXRvcjsJCS8qIDB4MDJiMCAqLwotCi0JLyogQ3VycmVudCBwcm9jZXNzLiAqLwotCV9fdTMyCWN1cnJlbnRfdGFzazsJCQkvKiAweDAyYjggKi8KLQlfX3UzMgl0aHJlYWRfaW5mbzsJCQkvKiAweDAyYmMgKi8KLQlfX3UzMglrZXJuZWxfc3RhY2s7CQkJLyogMHgwMmMwICovCi0KLQkvKiBJbnRlcnJ1cHQsIHBhbmljIGFuZCByZXN0YXJ0IHN0YWNrLiAqLwotCV9fdTMyCWFzeW5jX3N0YWNrOwkJCS8qIDB4MDJjNCAqLwotCV9fdTMyCXBhbmljX3N0YWNrOwkJCS8qIDB4MDJjOCAqLwotCV9fdTMyCXJlc3RhcnRfc3RhY2s7CQkJLyogMHgwMmNjICovCi0KLQkvKiBSZXN0YXJ0IGZ1bmN0aW9uIGFuZCBwYXJhbWV0ZXIuICovCi0JX191MzIJcmVzdGFydF9mbjsJCQkvKiAweDAyZDAgKi8KLQlfX3UzMglyZXN0YXJ0X2RhdGE7CQkJLyogMHgwMmQ0ICovCi0JX191MzIJcmVzdGFydF9zb3VyY2U7CQkJLyogMHgwMmQ4ICovCi0KLQkvKiBBZGRyZXNzIHNwYWNlIHBvaW50ZXIuICovCi0JX191MzIJa2VybmVsX2FzY2U7CQkJLyogMHgwMmRjICovCi0JX191MzIJdXNlcl9hc2NlOwkJCS8qIDB4MDJlMCAqLwotCV9fdTMyCWN1cnJlbnRfcGlkOwkJCS8qIDB4MDJlNCAqLwotCi0JLyogU01QIGluZm8gYXJlYSAqLwotCV9fdTMyCWNwdV9ucjsJCQkJLyogMHgwMmU4ICovCi0JX191MzIJc29mdGlycV9wZW5kaW5nOwkJLyogMHgwMmVjICovCi0JX191MzIJcGVyY3B1X29mZnNldDsJCQkvKiAweDAyZjAgKi8KLQlfX3UzMgltYWNoaW5lX2ZsYWdzOwkJCS8qIDB4MDJmNCAqLwotCV9fdTgJcGFkXzB4MDJmOFsweDAyZmMtMHgwMmY4XTsJLyogMHgwMmY4ICovCi0JX191MzIJc3BpbmxvY2tfbG9ja3ZhbDsJCS8qIDB4MDJmYyAqLwotCi0JX191OAlwYWRfMHgwMzAwWzB4MGUwMC0weDAzMDBdOwkvKiAweDAzMDAgKi8KLQotCS8qCi0JICogMHhlMDAgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhlIElQTCBQYXJhbWV0ZXIgSW5mb3JtYXRpb24KLQkgKiBibG9jay4gRHVtcCB0b29scyBuZWVkIElQSUIgZm9yIElQTCBhZnRlciBkdW1wLgotCSAqIE5vdGU6IGRvIG5vdCBjaGFuZ2UgdGhlIHBvc2l0aW9uIG9mIGFueSBmaWVsZHMgaW4gMHgwZTAwLTB4MGYwMAotCSAqLwotCV9fdTMyCWlwaWI7CQkJCS8qIDB4MGUwMCAqLwotCV9fdTMyCWlwaWJfY2hlY2tzdW07CQkJLyogMHgwZTA0ICovCi0JX191MzIJdm1jb3JlX2luZm87CQkJLyogMHgwZTA4ICovCi0JX191OAlwYWRfMHgwZTBjWzB4MGUxOC0weDBlMGNdOwkvKiAweDBlMGMgKi8KLQlfX3UzMglvc19pbmZvOwkJCS8qIDB4MGUxOCAqLwotCV9fdTgJcGFkXzB4MGUxY1sweDBmMDAtMHgwZTFjXTsJLyogMHgwZTFjICovCi0KLQkvKiBFeHRlbmRlZCBmYWNpbGl0eSBsaXN0ICovCi0JX191NjQJc3RmbGVfZmFjX2xpc3RbMzJdOwkJLyogMHgwZjAwICovCi19IF9fcGFja2VkOwotCi0jZWxzZSAvKiBDT05GSUdfMzJCSVQgKi8KLQogI2RlZmluZSBMQ19PUkRFUiAxCiAjZGVmaW5lIExDX1BBR0VTIDIKIApAQCAtMzU0LDggKzE5Nyw2IEBACiAJX191OAl2ZWN0b3Jfc2F2ZV9hcmVhWzEwMjRdOwkJLyogMHgxYzAwICovCiB9IF9fcGFja2VkOwogCi0jZW5kaWYgLyogQ09ORklHXzMyQklUICovCi0KICNkZWZpbmUgUzM5MF9sb3djb3JlICgqKChzdHJ1Y3QgX2xvd2NvcmUgKikgMCkpCiAKIGV4dGVybiBzdHJ1Y3QgX2xvd2NvcmUgKmxvd2NvcmVfcHRyW107CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW1hbi5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tYW4uaAppbmRleCA5OTc3ZTA4Li5iNTVhNTllIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW1hbi5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9tbWFuLmgKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDx1YXBpL2FzbS9tbWFuLmg+CiAKLSNpZiAhZGVmaW5lZChfX0FTU0VNQkxZX18pICYmIGRlZmluZWQoQ09ORklHXzY0QklUKQorI2lmbmRlZiBfX0FTU0VNQkxZX18KIGludCBzMzkwX21tYXBfY2hlY2sodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncyk7CiAjZGVmaW5lIGFyY2hfbW1hcF9jaGVjayhhZGRyLCBsZW4sIGZsYWdzKSBzMzkwX21tYXBfY2hlY2soYWRkciwgbGVuLCBmbGFncykKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL21tdV9jb250ZXh0LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAppbmRleCA4ZmIzODAyLi5kMjVkOWZmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaApAQCAtMTksOSArMTksNyBAQAogCWF0b21pY19zZXQoJm1tLT5jb250ZXh0LmF0dGFjaF9jb3VudCwgMCk7CiAJbW0tPmNvbnRleHQuZmx1c2hfbW0gPSAwOwogCW1tLT5jb250ZXh0LmFzY2VfYml0cyA9IF9BU0NFX1RBQkxFX0xFTkdUSCB8IF9BU0NFX1VTRVJfQklUUzsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAltbS0+Y29udGV4dC5hc2NlX2JpdHMgfD0gX0FTQ0VfVFlQRV9SRUdJT04zOwotI2VuZGlmCiAJbW0tPmNvbnRleHQuaGFzX3Bnc3RlID0gMDsKIAltbS0+Y29udGV4dC51c2Vfc2tleSA9IDA7CiAJbW0tPmNvbnRleHQuYXNjZV9saW1pdCA9IFNUQUNLX1RPUF9NQVg7CkBAIC0xMTAsMTAgKzEwOCw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9kdXBfbW1hcChzdHJ1Y3QgbW1fc3RydWN0ICpvbGRtbSwKIAkJCQkgc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJaWYgKG9sZG1tLT5jb250ZXh0LmFzY2VfbGltaXQgPCBtbS0+Y29udGV4dC5hc2NlX2xpbWl0KQogCQljcnN0X3RhYmxlX2Rvd25ncmFkZShtbSwgb2xkbW0tPmNvbnRleHQuYXNjZV9saW1pdCk7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZXhpdF9tbWFwKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BlcmNwdS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BlcmNwdS5oCmluZGV4IDkzMzM1NWUuLjZkNjU1NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZXJjcHUuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGVyY3B1LmgKQEAgLTEwLDggKzEwLDYgQEAKICAqLwogI2RlZmluZSBfX215X2NwdV9vZmZzZXQgUzM5MF9sb3djb3JlLnBlcmNwdV9vZmZzZXQKIAotI2lmZGVmIENPTkZJR182NEJJVAotCiAvKgogICogRm9yIDY0IGJpdCBtb2R1bGUgY29kZSwgdGhlIG1vZHVsZSBtYXkgYmUgbW9yZSB0aGFuIDRHIGFib3ZlIHRoZQogICogcGVyIGNwdSBhcmVhLCB1c2Ugd2VhayBkZWZpbml0aW9ucyB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8KQEAgLTE4Myw4ICsxODEsNiBAQAogI2RlZmluZSB0aGlzX2NwdV9jbXB4Y2hnX2RvdWJsZV80IGFyY2hfdGhpc19jcHVfY21weGNoZ19kb3VibGUKICNkZWZpbmUgdGhpc19jcHVfY21weGNoZ19kb3VibGVfOCBhcmNoX3RoaXNfY3B1X2NtcHhjaGdfZG91YmxlCiAKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3BlcmNwdS5oPgogCiAjZW5kaWYgLyogX19BUkNIX1MzOTBfUEVSQ1BVX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCmluZGV4IDE1OWE4ZWMuLjRjYjE5ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaApAQCAtOSw4ICs5LDYgQEAKICNpZm5kZWYgX0FTTV9TMzkwX1BFUkZfRVZFTlRfSAogI2RlZmluZSBfQVNNX1MzOTBfUEVSRl9FVkVOVF9ICiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKLQogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vY3B1X21mLmg+CkBAIC05Miw1ICs5MCw0IEBACiBpbnQgcGVyZl9yZXNlcnZlX3NhbXBsaW5nKHZvaWQpOwogdm9pZCBwZXJmX3JlbGVhc2Vfc2FtcGxpbmcodm9pZCk7CiAKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KICNlbmRpZiAvKiBfQVNNX1MzOTBfUEVSRl9FVkVOVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGdhbGxvYy5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BnYWxsb2MuaAppbmRleCAzMDA5YzJiLi41MWU3ZmI2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGdhbGxvYy5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKQEAgLTMzLDExICszMyw3IEBACiAJKnMgPSB2YWw7CiAJbiA9IChuIC8gMjU2KSAtIDE7CiAJYXNtIHZvbGF0aWxlKAotI2lmZGVmIENPTkZJR182NEJJVAogCQkiCW12Ywk4KDI0OCwlMCksMCglMClcbiIKLSNlbHNlCi0JCSIJbXZjCTQoMjUyLCUwKSwwKCUwKVxuIgotI2VuZGlmCiAJCSIwOgltdmMJMjU2KDI1NiwlMCksMCglMClcbiIKIAkJIglsYQklMCwyNTYoJTApXG4iCiAJCSIJYnJjdAklMSwwYlxuIgpAQCAtNTAsMjQgKzQ2LDYgQEAKIAljbGVhcl90YWJsZShjcnN0LCBlbnRyeSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKjIwNDgpOwogfQogCi0jaWZuZGVmIENPTkZJR182NEJJVAotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGdkX2VudHJ5X3R5cGUoc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JcmV0dXJuIF9TRUdNRU5UX0VOVFJZX0VNUFRZOwotfQotCi0jZGVmaW5lIHB1ZF9hbGxvY19vbmUobW0sYWRkcmVzcykJCSh7IEJVRygpOyAoKHB1ZF90ICopMik7IH0pCi0jZGVmaW5lIHB1ZF9mcmVlKG1tLCB4KQkJCQlkbyB7IH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgcG1kX2FsbG9jX29uZShtbSxhZGRyZXNzKQkJKHsgQlVHKCk7ICgocG1kX3QgKikyKTsgfSkKLSNkZWZpbmUgcG1kX2ZyZWUobW0sIHgpCQkJCWRvIHsgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBwZ2RfcG9wdWxhdGUobW0sIHBnZCwgcHVkKQkJQlVHKCkKLSNkZWZpbmUgcHVkX3BvcHVsYXRlKG1tLCBwdWQsIHBtZCkJCUJVRygpCi0KLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwotCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGdkX2VudHJ5X3R5cGUoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJaWYgKG1tLT5jb250ZXh0LmFzY2VfbGltaXQgPD0gKDFVTCA8PCAzMSkpCkBAIC0xMTksOCArOTcsNiBAQAogCXB1ZF92YWwoKnB1ZCkgPSBfUkVHSU9OM19FTlRSWSB8IF9fcGEocG1kKTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwotCiBzdGF0aWMgaW5saW5lIHBnZF90ICpwZ2RfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJc3Bpbl9sb2NrX2luaXQoJm1tLT5jb250ZXh0Lmxpc3RfbG9jayk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCBlMDhlYzM4Li45ODljZmFlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTY2LDE1ICs2Niw5IEBACiAgKiB0YWJsZSBjYW4gbWFwCiAgKiBQR0RJUl9TSElGVCBkZXRlcm1pbmVzIHdoYXQgYSB0aGlyZC1sZXZlbCBwYWdlIHRhYmxlIGVudHJ5IGNhbiBtYXAKICAqLwotI2lmbmRlZiBDT05GSUdfNjRCSVQKLSMgZGVmaW5lIFBNRF9TSElGVAkyMAotIyBkZWZpbmUgUFVEX1NISUZUCTIwCi0jIGRlZmluZSBQR0RJUl9TSElGVAkyMAotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCi0jIGRlZmluZSBQTURfU0hJRlQJMjAKLSMgZGVmaW5lIFBVRF9TSElGVAkzMQotIyBkZWZpbmUgUEdESVJfU0hJRlQJNDIKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KKyNkZWZpbmUgUE1EX1NISUZUCTIwCisjZGVmaW5lIFBVRF9TSElGVAkzMQorI2RlZmluZSBQR0RJUl9TSElGVAk0MgogCiAjZGVmaW5lIFBNRF9TSVpFICAgICAgICAoMVVMIDw8IFBNRF9TSElGVCkKICNkZWZpbmUgUE1EX01BU0sgICAgICAgICh+KFBNRF9TSVpFLTEpKQpAQCAtOTAsMTUgKzg0LDggQEAKICAqIHRoYXQgbGVhZHMgdG8gMTAyNCBwdGUgcGVyIHBnZAogICovCiAjZGVmaW5lIFBUUlNfUEVSX1BURQkyNTYKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0jZGVmaW5lIF9fUEFHRVRBQkxFX1BVRF9GT0xERUQKLSNkZWZpbmUgUFRSU19QRVJfUE1ECTEKLSNkZWZpbmUgX19QQUdFVEFCTEVfUE1EX0ZPTERFRAotI2RlZmluZSBQVFJTX1BFUl9QVUQJMQotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAjZGVmaW5lIFBUUlNfUEVSX1BNRAkyMDQ4CiAjZGVmaW5lIFBUUlNfUEVSX1BVRAkyMDQ4Ci0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAjZGVmaW5lIFBUUlNfUEVSX1BHRAkyMDQ4CiAKICNkZWZpbmUgRklSU1RfVVNFUl9BRERSRVNTICAwVUwKQEAgLTEyNywyMyArMTE0LDE5IEBACiAKICNkZWZpbmUgVk1FTV9NQVhfUEhZUyAoKHVuc2lnbmVkIGxvbmcpIHZtZW1tYXApCiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKIGV4dGVybiB1bnNpZ25lZCBsb25nIE1PRFVMRVNfVkFERFI7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBNT0RVTEVTX0VORDsKICNkZWZpbmUgTU9EVUxFU19WQUREUglNT0RVTEVTX1ZBRERSCiAjZGVmaW5lIE1PRFVMRVNfRU5ECU1PRFVMRVNfRU5ECiAjZGVmaW5lIE1PRFVMRVNfTEVOCSgxVUwgPDwgMzEpCi0jZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgaXNfbW9kdWxlX2FkZHIodm9pZCAqYWRkcikKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlCVUlMRF9CVUdfT04oTU9EVUxFU19MRU4gPiAoMVVMIDw8IDMxKSk7CiAJaWYgKGFkZHIgPCAodm9pZCAqKU1PRFVMRVNfVkFERFIpCiAJCXJldHVybiAwOwogCWlmIChhZGRyID4gKHZvaWQgKilNT0RVTEVTX0VORCkKIAkJcmV0dXJuIDA7Ci0jZW5kaWYKIAlyZXR1cm4gMTsKIH0KIApAQCAtMjg0LDU2ICsyNjcsNiBAQAogICogcHRlX3N3YXAgICAgaXMgdHJ1ZSBmb3IgdGhlIGJpdCBwYXR0ZXJuIC4xMC4uLnh4eHgxMCwgKHB0ZSAmIDB4NjAzKSA9PSAweDQwMgogICovCiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0KLS8qIEJpdHMgaW4gdGhlIHNlZ21lbnQgdGFibGUgYWRkcmVzcy1zcGFjZS1jb250cm9sLWVsZW1lbnQgKi8KLSNkZWZpbmUgX0FTQ0VfU1BBQ0VfU1dJVENICTB4ODAwMDAwMDBVTAkvKiBzcGFjZSBzd2l0Y2ggZXZlbnQJICAgICovCi0jZGVmaW5lIF9BU0NFX09SSUdJTl9NQVNLCTB4N2ZmZmYwMDBVTAkvKiBzZWdtZW50IHRhYmxlIG9yaWdpbgkgICAgKi8KLSNkZWZpbmUgX0FTQ0VfUFJJVkFURV9TUEFDRQkweDEwMAkvKiBwcml2YXRlIHNwYWNlIGNvbnRyb2wJICAgICovCi0jZGVmaW5lIF9BU0NFX0FMVF9FVkVOVAkJMHg4MAkvKiBzdG9yYWdlIGFsdGVyYXRpb24gZXZlbnQgY29udHJvbCAqLwotI2RlZmluZSBfQVNDRV9UQUJMRV9MRU5HVEgJMHg3ZgkvKiAxMjggeCA2NCBlbnRyaWVzID0gOGsJICAgICovCi0KLS8qIEJpdHMgaW4gdGhlIHNlZ21lbnQgdGFibGUgZW50cnkgKi8KLSNkZWZpbmUgX1NFR01FTlRfRU5UUllfQklUUwkweDdmZmZmZmZmVUwJLyogVmFsaWQgc2VnbWVudCB0YWJsZSBiaXRzICovCi0jZGVmaW5lIF9TRUdNRU5UX0VOVFJZX09SSUdJTgkweDdmZmZmZmMwVUwJLyogcGFnZSB0YWJsZSBvcmlnaW4JICAgICovCi0jZGVmaW5lIF9TRUdNRU5UX0VOVFJZX1BST1RFQ1QJMHgyMDAJLyogcGFnZSBwcm90ZWN0aW9uIGJpdAkJICAgICovCi0jZGVmaW5lIF9TRUdNRU5UX0VOVFJZX0lOVkFMSUQJMHgyMAkvKiBpbnZhbGlkIHNlZ21lbnQgdGFibGUgZW50cnkJICAgICovCi0jZGVmaW5lIF9TRUdNRU5UX0VOVFJZX0NPTU1PTgkweDEwCS8qIGNvbW1vbiBzZWdtZW50IGJpdAkJICAgICovCi0jZGVmaW5lIF9TRUdNRU5UX0VOVFJZX1BUTAkweDBmCS8qIHBhZ2UgdGFibGUgbGVuZ3RoCQkgICAgKi8KLQotI2RlZmluZSBfU0VHTUVOVF9FTlRSWV9ESVJUWQkwCS8qIE5vIHN3IGRpcnR5IGJpdCBmb3IgMzEtYml0ICovCi0jZGVmaW5lIF9TRUdNRU5UX0VOVFJZX1lPVU5HCTAJLyogTm8gc3cgeW91bmcgYml0IGZvciAzMS1iaXQgKi8KLSNkZWZpbmUgX1NFR01FTlRfRU5UUllfUkVBRAkwCS8qIE5vIHN3IHJlYWQgYml0IGZvciAzMS1iaXQgKi8KLSNkZWZpbmUgX1NFR01FTlRfRU5UUllfV1JJVEUJMAkvKiBObyBzdyB3cml0ZSBiaXQgZm9yIDMxLWJpdCAqLwotI2RlZmluZSBfU0VHTUVOVF9FTlRSWV9MQVJHRQkwCS8qIE5vIGxhcmdlIHBhZ2VzIGZvciAzMS1iaXQgKi8KLSNkZWZpbmUgX1NFR01FTlRfRU5UUllfQklUU19MQVJHRSAwCi0jZGVmaW5lIF9TRUdNRU5UX0VOVFJZX09SSUdJTl9MQVJHRSAwCi0KLSNkZWZpbmUgX1NFR01FTlRfRU5UUlkJCShfU0VHTUVOVF9FTlRSWV9QVEwpCi0jZGVmaW5lIF9TRUdNRU5UX0VOVFJZX0VNUFRZCShfU0VHTUVOVF9FTlRSWV9JTlZBTElEKQotCi0vKgotICogU2VnbWVudCB0YWJsZSBlbnRyeSBlbmNvZGluZyAoSSA9IGludmFsaWQsIFIgPSByZWFkLW9ubHkgYml0KToKLSAqCQkuLlIuLi5JLi4uLi4KLSAqIHByb3Qtbm9uZQkuLjEuLi4xLi4uLi4KLSAqIHJlYWQtb25seQkuLjEuLi4wLi4uLi4KLSAqIHJlYWQtd3JpdGUJLi4wLi4uMC4uLi4uCi0gKiBlbXB0eQkuLjAuLi4xLi4uLi4KLSAqLwotCi0vKiBQYWdlIHN0YXR1cyB0YWJsZSBiaXRzIGZvciB2aXJ0dWFsaXphdGlvbiAqLwotI2RlZmluZSBQR1NURV9BQ0NfQklUUwkweGYwMDAwMDAwVUwKLSNkZWZpbmUgUEdTVEVfRlBfQklUCTB4MDgwMDAwMDBVTAotI2RlZmluZSBQR1NURV9QQ0xfQklUCTB4MDA4MDAwMDBVTAotI2RlZmluZSBQR1NURV9IUl9CSVQJMHgwMDQwMDAwMFVMCi0jZGVmaW5lIFBHU1RFX0hDX0JJVAkweDAwMjAwMDAwVUwKLSNkZWZpbmUgUEdTVEVfR1JfQklUCTB4MDAwNDAwMDBVTAotI2RlZmluZSBQR1NURV9HQ19CSVQJMHgwMDAyMDAwMFVMCi0jZGVmaW5lIFBHU1RFX1VDX0JJVAkweDAwMDA4MDAwVUwJLyogdXNlciBkaXJ0eSAobWlncmF0aW9uKSAqLwotI2RlZmluZSBQR1NURV9JTl9CSVQJMHgwMDAwNDAwMFVMCS8qIElQVEUgbm90aWZ5IGJpdCAqLwotCi0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KLQogLyogQml0cyBpbiB0aGUgc2VnbWVudC9yZWdpb24gdGFibGUgYWRkcmVzcy1zcGFjZS1jb250cm9sLWVsZW1lbnQgKi8KICNkZWZpbmUgX0FTQ0VfT1JJR0lOCQl+MHhmZmZVTC8qIHNlZ21lbnQgdGFibGUgb3JpZ2luCQkgICAgKi8KICNkZWZpbmUgX0FTQ0VfUFJJVkFURV9TUEFDRQkweDEwMAkvKiBwcml2YXRlIHNwYWNlIGNvbnRyb2wJICAgICovCkBAIC00MTcsOCArMzUwLDYgQEAKICNkZWZpbmUgUEdTVEVfVUNfQklUCTB4MDAwMDgwMDAwMDAwMDAwMFVMCS8qIHVzZXIgZGlydHkgKG1pZ3JhdGlvbikgKi8KICNkZWZpbmUgUEdTVEVfSU5fQklUCTB4MDAwMDQwMDAwMDAwMDAwMFVMCS8qIElQVEUgbm90aWZ5IGJpdCAqLwogCi0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCi0KIC8qIEd1ZXN0IFBhZ2UgU3RhdGUgdXNlZCBmb3IgdmlydHVhbGl6YXRpb24gKi8KICNkZWZpbmUgX1BHU1RFX0dQU19aRVJPCQkweDAwMDAwMDAwODAwMDAwMDBVTAogI2RlZmluZSBfUEdTVEVfR1BTX1VTQUdFX01BU0sJMHgwMDAwMDAwMDAzMDAwMDAwVUwKQEAgLTUwOSwxOSArNDQwLDYgQEAKIC8qCiAgKiBwZ2QvcG1kL3B0ZSBxdWVyeSBmdW5jdGlvbnMKICAqLwotI2lmbmRlZiBDT05GSUdfNjRCSVQKLQotc3RhdGljIGlubGluZSBpbnQgcGdkX3ByZXNlbnQocGdkX3QgcGdkKSB7IHJldHVybiAxOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwZ2Rfbm9uZShwZ2RfdCBwZ2QpICAgIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHBnZF9iYWQocGdkX3QgcGdkKSAgICAgeyByZXR1cm4gMDsgfQotCi1zdGF0aWMgaW5saW5lIGludCBwdWRfcHJlc2VudChwdWRfdCBwdWQpIHsgcmV0dXJuIDE7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB1ZF9ub25lKHB1ZF90IHB1ZCkJIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHB1ZF9sYXJnZShwdWRfdCBwdWQpCSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBwdWRfYmFkKHB1ZF90IHB1ZCkJIHsgcmV0dXJuIDA7IH0KLQotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCi0KIHN0YXRpYyBpbmxpbmUgaW50IHBnZF9wcmVzZW50KHBnZF90IHBnZCkKIHsKIAlpZiAoKHBnZF92YWwocGdkKSAmIF9SRUdJT05fRU5UUllfVFlQRV9NQVNLKSA8IF9SRUdJT05fRU5UUllfVFlQRV9SMikKQEAgLTU4Myw4ICs1MDEsNiBAQAogCXJldHVybiAocHVkX3ZhbChwdWQpICYgbWFzaykgIT0gMDsKIH0KIAotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwotCiBzdGF0aWMgaW5saW5lIGludCBwbWRfcHJlc2VudChwbWRfdCBwbWQpCiB7CiAJcmV0dXJuIHBtZF92YWwocG1kKSAhPSBfU0VHTUVOVF9FTlRSWV9JTlZBTElEOwpAQCAtOTE2LDE4ICs4MzIsMTQgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHBnZF9jbGVhcihwZ2RfdCAqcGdkKQogewotI2lmZGVmIENPTkZJR182NEJJVAogCWlmICgocGdkX3ZhbCgqcGdkKSAmIF9SRUdJT05fRU5UUllfVFlQRV9NQVNLKSA9PSBfUkVHSU9OX0VOVFJZX1RZUEVfUjIpCiAJCXBnZF92YWwoKnBnZCkgPSBfUkVHSU9OMl9FTlRSWV9FTVBUWTsKLSNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHVkX2NsZWFyKHB1ZF90ICpwdWQpCiB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJaWYgKChwdWRfdmFsKCpwdWQpICYgX1JFR0lPTl9FTlRSWV9UWVBFX01BU0spID09IF9SRUdJT05fRU5UUllfVFlQRV9SMykKIAkJcHVkX3ZhbCgqcHVkKSA9IF9SRUdJT04zX0VOVFJZX0VNUFRZOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwbWRfY2xlYXIocG1kX3QgKnBtZHApCkBAIC0xMDI2LDEwICs5MzgsNiBAQAogewogCXVuc2lnbmVkIGxvbmcgcHRvID0gKHVuc2lnbmVkIGxvbmcpIHB0ZXA7CiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0JLyogcHRvIGluIEVTQSBtb2RlIG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWdtZW50IHRhYmxlICovCi0JcHRvICY9IDB4N2ZmZmZjMDA7Ci0jZW5kaWYKIAkvKiBJbnZhbGlkYXRpb24gKyBnbG9iYWwgVExCIGZsdXNoIGZvciB0aGUgcHRlICovCiAJYXNtIHZvbGF0aWxlKAogCQkiCWlwdGUJJTIsJTMiCkBAIC0xMDQwLDEwICs5NDgsNiBAQAogewogCXVuc2lnbmVkIGxvbmcgcHRvID0gKHVuc2lnbmVkIGxvbmcpIHB0ZXA7CiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0JLyogcHRvIGluIEVTQSBtb2RlIG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWdtZW50IHRhYmxlICovCi0JcHRvICY9IDB4N2ZmZmZjMDA7Ci0jZW5kaWYKIAkvKiBJbnZhbGlkYXRpb24gKyBsb2NhbCBUTEIgZmx1c2ggZm9yIHRoZSBwdGUgKi8KIAlhc20gdm9sYXRpbGUoCiAJCSIJLmluc24gcnJmLDB4YjIyMTAwMDAsJTIsJTMsMCwxIgpAQCAtMTA1NCwxMCArOTU4LDYgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHB0byA9ICh1bnNpZ25lZCBsb25nKSBwdGVwOwogCi0jaWZuZGVmIENPTkZJR182NEJJVAotCS8qIHB0byBpbiBFU0EgbW9kZSBtdXN0IHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgc2VnbWVudCB0YWJsZSAqLwotCXB0byAmPSAweDdmZmZmYzAwOwotI2VuZGlmCiAJLyogSW52YWxpZGF0ZSBhIHJhbmdlIG9mIHB0ZXMgKyBnbG9iYWwgVExCIGZsdXNoIG9mIHRoZSBwdGVzICovCiAJZG8gewogCQlhc20gdm9sYXRpbGUoCkBAIC0xMzc2LDE3ICsxMjc2LDYgQEAKICNkZWZpbmUgcGdkX29mZnNldChtbSwgYWRkcmVzcykgKChtbSktPnBnZCArIHBnZF9pbmRleChhZGRyZXNzKSkKICNkZWZpbmUgcGdkX29mZnNldF9rKGFkZHJlc3MpIHBnZF9vZmZzZXQoJmluaXRfbW0sIGFkZHJlc3MpCiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0KLSNkZWZpbmUgcG1kX2RlcmVmKHBtZCkgKHBtZF92YWwocG1kKSAmIF9TRUdNRU5UX0VOVFJZX09SSUdJTikKLSNkZWZpbmUgcHVkX2RlcmVmKHBtZCkgKHsgQlVHKCk7IDBVTDsgfSkKLSNkZWZpbmUgcGdkX2RlcmVmKHBtZCkgKHsgQlVHKCk7IDBVTDsgfSkKLQotI2RlZmluZSBwdWRfb2Zmc2V0KHBnZCwgYWRkcmVzcykgKChwdWRfdCAqKSBwZ2QpCi0jZGVmaW5lIHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKSAoKHBtZF90ICopIHB1ZCArIHBtZF9pbmRleChhZGRyZXNzKSkKLQotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCi0KICNkZWZpbmUgcG1kX2RlcmVmKHBtZCkgKHBtZF92YWwocG1kKSAmIF9TRUdNRU5UX0VOVFJZX09SSUdJTikKICNkZWZpbmUgcHVkX2RlcmVmKHB1ZCkgKHB1ZF92YWwocHVkKSAmIF9SRUdJT05fRU5UUllfT1JJR0lOKQogI2RlZmluZSBwZ2RfZGVyZWYocGdkKSAocGdkX3ZhbChwZ2QpICYgX1JFR0lPTl9FTlRSWV9PUklHSU4pCkBAIC0xNDA3LDggKzEyOTYsNiBAQAogCXJldHVybiBwbWQgKyBwbWRfaW5kZXgoYWRkcmVzcyk7CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQogI2RlZmluZSBwZm5fcHRlKHBmbixwZ3Byb3QpIG1rX3B0ZV9waHlzKF9fcGEoKHBmbikgPDwgUEFHRV9TSElGVCksKHBncHJvdCkpCiAjZGVmaW5lIHB0ZV9wZm4oeCkgKHB0ZV92YWwoeCkgPj4gUEFHRV9TSElGVCkKICNkZWZpbmUgcHRlX3BhZ2UoeCkgcGZuX3RvX3BhZ2UocHRlX3Bmbih4KSkKQEAgLTE3MjksMTEgKzE2MTYsOSBAQAogICogIDAwMDAwMDAwMDAxMTExMTExMTExMjIyMjIyMjIyMjMzMzMzMzMzMzM0NDQ0NDQ0NDQ0NTUgNTU1NSA1IDU1NTY2IDY2CiAgKiAgMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMSAyMzQ1IDYgNzg5MDEgMjMKICAqLwotI2lmbmRlZiBDT05GSUdfNjRCSVQKLSNkZWZpbmUgX19TV1BfT0ZGU0VUX01BU0sgKH4wVUwgPj4gMTIpCi0jZWxzZQorCiAjZGVmaW5lIF9fU1dQX09GRlNFVF9NQVNLICh+MFVMID4+IDExKQotI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgcHRlX3QgbWtfc3dhcF9wdGUodW5zaWduZWQgbG9uZyB0eXBlLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKIAlwdGVfdCBwdGU7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggZTdjYmJkYy4uZGVkYjYyMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTksNyArMTksNiBAQAogI2RlZmluZSBfQ0lGX0FTQ0UJCSgxPDxDSUZfQVNDRSkKICNkZWZpbmUgX0NJRl9OT0haX0RFTEFZCQkoMTw8Q0lGX05PSFpfREVMQVkpCiAKLQogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KQEAgLTY2LDEzICs2NSw2IEBACiAvKgogICogVXNlciBzcGFjZSBwcm9jZXNzIHNpemU6IDJHQiBmb3IgMzEgYml0LCA0VEIgb3IgOFBUIGZvciA2NCBiaXQuCiAgKi8KLSNpZm5kZWYgQ09ORklHXzY0QklUCi0KLSNkZWZpbmUgVEFTS19TSVpFCQkoMVVMIDw8IDMxKQotI2RlZmluZSBUQVNLX01BWF9TSVpFCQkoMVVMIDw8IDMxKQotI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJKDFVTCA8PCAzMCkKLQotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAKICNkZWZpbmUgVEFTS19TSVpFX09GKHRzaykJKCh0c2spLT5tbS0+Y29udGV4dC5hc2NlX2xpbWl0KQogI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMxQklUKSA/IFwKQEAgLTgwLDE1ICs3Miw4IEBACiAjZGVmaW5lIFRBU0tfU0laRQkJVEFTS19TSVpFX09GKGN1cnJlbnQpCiAjZGVmaW5lIFRBU0tfTUFYX1NJWkUJCSgxVUwgPDwgNTMpCiAKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KLQotI2lmbmRlZiBDT05GSUdfNjRCSVQKLSNkZWZpbmUgU1RBQ0tfVE9QCQkoMVVMIDw8IDMxKQotI2RlZmluZSBTVEFDS19UT1BfTUFYCQkoMVVMIDw8IDMxKQotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAjZGVmaW5lIFNUQUNLX1RPUAkJKDFVTCA8PCAodGVzdF90aHJlYWRfZmxhZyhUSUZfMzFCSVQpID8gMzE6NDIpKQogI2RlZmluZSBTVEFDS19UT1BfTUFYCQkoMVVMIDw8IDQyKQotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCiAjZGVmaW5lIEhBVkVfQVJDSF9QSUNLX01NQVBfTEFZT1VUCiAKQEAgLTExNSwxMCArMTAwLDggQEAKIAkvKiBjcHUgcnVudGltZSBpbnN0cnVtZW50YXRpb24gKi8KIAlzdHJ1Y3QgcnVudGltZV9pbnN0cl9jYiAqcmlfY2I7CiAJaW50IHJpX3NpZ251bTsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl1bnNpZ25lZCBjaGFyIHRyYXBfdGRiWzI1Nl07CS8qIFRyYW5zYWN0aW9uIGFib3J0IGRpYWdub3NlIGJsb2NrICovCiAJX192ZWN0b3IxMjggKnZ4cnM7CQkvKiBWZWN0b3IgcmVnaXN0ZXIgc2F2ZSBhcmVhICovCi0jZW5kaWYKIH07CiAKIC8qIEZsYWcgdG8gZGlzYWJsZSB0cmFuc2FjdGlvbnMuICovCkBAIC0xODEsMTEgKzE2NCw3IEBACiBzdHJ1Y3QgbW1fc3RydWN0Owogc3RydWN0IHNlcV9maWxlOwogCi0jaWZkZWYgQ09ORklHXzY0QklUCi1leHRlcm4gdm9pZCBzaG93X2NhY2hlaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG93X2NhY2hlaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pIHsgfQotI2VuZGlmCit2b2lkIHNob3dfY2FjaGVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSk7CiAKIC8qIEZyZWUgYWxsIHJlc291cmNlcyBoZWxkIGJ5IGEgdGhyZWFkLiAqLwogZXh0ZXJuIHZvaWQgcmVsZWFzZV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICopOwpAQCAtMjI5LDExICsyMDgsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgX19sb2FkX3Bzdyhwc3dfdCBwc3cpCiB7Ci0jaWZuZGVmIENPTkZJR182NEJJVAotCWFzbSB2b2xhdGlsZSgibHBzdyAgJTAiIDogOiAiUSIgKHBzdykgOiAiY2MiKTsKLSNlbHNlCiAJYXNtIHZvbGF0aWxlKCJscHN3ZSAlMCIgOiA6ICJRIiAocHN3KSA6ICJjYyIpOwotI2VuZGlmCiB9CiAKIC8qCkBAIC0yNDcsMjIgKzIyMiwxMiBAQAogCiAJcHN3Lm1hc2sgPSBtYXNrOwogCi0jaWZuZGVmIENPTkZJR182NEJJVAotCWFzbSB2b2xhdGlsZSgKLQkJIgliYXNyCSUwLDBcbiIKLQkJIjA6CWFoaQklMCwxZi0wYlxuIgotCQkiCXN0CSUwLCVPMSs0KCVSMSlcbiIKLQkJIglscHN3CSUxXG4iCi0JCSIxOiIKLQkJOiAiPSZkIiAoYWRkciksICI9USIgKHBzdykgOiAiUSIgKHBzdykgOiAibWVtb3J5IiwgImNjIik7Ci0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KIAlhc20gdm9sYXRpbGUoCiAJCSIJbGFybAklMCwxZlxuIgogCQkiCXN0ZwklMCwlTzErOCglUjEpXG4iCiAJCSIJbHBzd2UJJTFcbiIKIAkJIjE6IgogCQk6ICI9JmQiIChhZGRyKSwgIj1RIiAocHN3KSA6ICJRIiAocHN3KSA6ICJtZW1vcnkiLCAiY2MiKTsKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIH0KIAogLyoKQEAgLTI3MCwyMCArMjM1LDEyIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBfX3Jld2luZF9wc3cocHN3X3QgcHN3LCB1bnNpZ25lZCBsb25nIGlsYykKIHsKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0JaWYgKHBzdy5hZGRyICYgUFNXX0FERFJfQU1PREUpCi0JCS8qIDMxIGJpdCBtb2RlICovCi0JCXJldHVybiAocHN3LmFkZHIgLSBpbGMpIHwgUFNXX0FERFJfQU1PREU7Ci0JLyogMjQgYml0IG1vZGUgKi8KLQlyZXR1cm4gKHBzdy5hZGRyIC0gaWxjKSAmICgoMVVMIDw8IDI0KSAtIDEpOwotI2Vsc2UKIAl1bnNpZ25lZCBsb25nIG1hc2s7CiAKIAltYXNrID0gKHBzdy5tYXNrICYgUFNXX01BU0tfRUEpID8gLTFVTCA6CiAJICAgICAgIChwc3cubWFzayAmIFBTV19NQVNLX0JBKSA/ICgxVUwgPDwgMzEpIC0gMSA6CiAJCQkJCSAgKDFVTCA8PCAyNCkgLSAxOwogCXJldHVybiAocHN3LmFkZHIgLSBpbGMpICYgbWFzazsKLSNlbmRpZgogfQogCiAvKgpAQCAtMzA1LDI2ICsyNjIsNiBAQAogICAgICAgICAgKiBTdG9yZSBzdGF0dXMgYW5kIHRoZW4gbG9hZCBkaXNhYmxlZCB3YWl0IHBzdywKICAgICAgICAgICogdGhlIHByb2Nlc3NvciBpcyBkZWFkIGFmdGVyd2FyZHMKICAgICAgICAgICovCi0jaWZuZGVmIENPTkZJR182NEJJVAotCWFzbSB2b2xhdGlsZSgKLQkJIglzdGN0bAkwLDAsMCglMilcbiIKLQkJIgluaQkwKCUyKSwweGVmXG4iCS8qIHN3aXRjaCBvZmYgcHJvdGVjdGlvbiAqLwotCQkiCWxjdGwJMCwwLDAoJTIpXG4iCi0JCSIJc3RwdAkweGQ4XG4iCQkvKiBzdG9yZSB0aW1lciAqLwotCQkiCXN0Y2tjCTB4ZTBcbiIJCS8qIHN0b3JlIGNsb2NrIGNvbXBhcmF0b3IgKi8KLQkJIglzdHB4CTB4MTA4XG4iCS8qIHN0b3JlIHByZWZpeCByZWdpc3RlciAqLwotCQkiCXN0YW0JMCwxNSwweDEyMFxuIgkvKiBzdG9yZSBhY2Nlc3MgcmVnaXN0ZXJzICovCi0JCSIJc3RkCTAsMHgxNjBcbiIJLyogc3RvcmUgZjAgKi8KLQkJIglzdGQJMiwweDE2OFxuIgkvKiBzdG9yZSBmMiAqLwotCQkiCXN0ZAk0LDB4MTcwXG4iCS8qIHN0b3JlIGY0ICovCi0JCSIJc3RkCTYsMHgxNzhcbiIJLyogc3RvcmUgZjYgKi8KLQkJIglzdG0JMCwxNSwweDE4MFxuIgkvKiBzdG9yZSBnZW5lcmFsIHJlZ2lzdGVycyAqLwotCQkiCXN0Y3RsCTAsMTUsMHgxYzBcbiIJLyogc3RvcmUgY29udHJvbCByZWdpc3RlcnMgKi8KLQkJIglvaQkweDFjMCwweDEwXG4iCS8qIGZha2UgcHJvdGVjdGlvbiBiaXQgKi8KLQkJIglscHN3CTAoJTEpIgotCQk6ICI9bSIgKGN0bF9idWYpCi0JCTogImEiICgmZHdfcHN3KSwgImEiICgmY3RsX2J1ZiksICJtIiAoZHdfcHN3KSA6ICJjYyIpOwotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAJYXNtIHZvbGF0aWxlKAogCQkiCXN0Y3RnCTAsMCwwKCUyKVxuIgogCQkiCW5pCTQoJTIpLDB4ZWZcbiIJLyogc3dpdGNoIG9mZiBwcm90ZWN0aW9uICovCkBAIC0zNTcsNyArMjk0LDYgQEAKIAkJIglscHN3ZQkwKCUxKSIKIAkJOiAiPW0iIChjdGxfYnVmKQogCQk6ICJhIiAoJmR3X3BzdyksICJhIiAoJmN0bF9idWYpLCAibSIgKGR3X3BzdykgOiAiY2MiLCAiMCIsICIxIik7Ci0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAJd2hpbGUgKDEpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHRyYWNlLmgKaW5kZXggYmUzMTdmZS4uNmZlZGEyNSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3B0cmFjZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtNDAsMTIgKzQwLDggQEAKIAl1bnNpZ25lZCBsb25nIGxvbmcgcmkJOiAxOyAvKiBSdW50aW1lIEluc3RydW1lbnRhdGlvbiAqLwogCXVuc2lnbmVkIGxvbmcgbG9uZwk6IDY7CiAJdW5zaWduZWQgbG9uZyBsb25nIGVhYmEgOiAyOyAvKiBBZGRyZXNzaW5nIE1vZGUgKi8KLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl1bnNpZ25lZCBsb25nIGxvbmcJOiAzMTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgaWEJOiA2NDsvKiBJbnN0cnVjdGlvbiBBZGRyZXNzICovCi0jZWxzZQotCXVuc2lnbmVkIGxvbmcgbG9uZyBpYQk6IDMxOy8qIEluc3RydWN0aW9uIEFkZHJlc3MgKi8KLSNlbmRpZgogfTsKIAogZW51bSB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3FkaW8uaAppbmRleCAwNmYzMDM0Li45OThiNjFjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcWRpby5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9xZGlvLmgKQEAgLTIxMSwxMSArMjExLDYgQEAKIAl1OCBzY291bnQ7CiAJdTggc2ZsYWdzOwogCXUzMiBsZW5ndGg7Ci0jaWZkZWYgQ09ORklHXzMyQklUCi0JLyogcHJpdmF0ZTogKi8KLQl2b2lkICpyZXMyOwotCS8qIHB1YmxpYzogKi8KLSNlbmRpZgogCXZvaWQgKmFkZHI7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoMTYpKSk7CiAKQEAgLTIzMiwxMSArMjI3LDYgQEAKICAqIEBzYmFsOiBhYnNvbHV0ZSBTQkFMIGFkZHJlc3MKICAqLwogc3RydWN0IHNsX2VsZW1lbnQgewotI2lmZGVmIENPTkZJR18zMkJJVAotCS8qIHByaXZhdGU6ICovCi0JdW5zaWduZWQgbG9uZyByZXNlcnZlZDsKLQkvKiBwdWJsaWM6ICovCi0jZW5kaWYKIAl1bnNpZ25lZCBsb25nIHNiYWw7CiB9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3J1bnRpbWVfaW5zdHIuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9ydW50aW1lX2luc3RyLmgKaW5kZXggODMwZGE3My4uNDAyYWQ2ZCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3J1bnRpbWVfaW5zdHIuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcnVudGltZV9pbnN0ci5oCkBAIC03MiwyNyArNzIsMTkgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHNhdmVfcmlfY2Ioc3RydWN0IHJ1bnRpbWVfaW5zdHJfY2IgKmNiX3ByZXYpCiB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJaWYgKGNiX3ByZXYpCiAJCXN0b3JlX3J1bnRpbWVfaW5zdHJfY2IoY2JfcHJldik7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfcmlfY2Ioc3RydWN0IHJ1bnRpbWVfaW5zdHJfY2IgKmNiX25leHQsCiAJCQkJIHN0cnVjdCBydW50aW1lX2luc3RyX2NiICpjYl9wcmV2KQogewotI2lmZGVmIENPTkZJR182NEJJVAogCWlmIChjYl9uZXh0KQogCQlsb2FkX3J1bnRpbWVfaW5zdHJfY2IoY2JfbmV4dCk7CiAJZWxzZSBpZiAoY2JfcHJldikKIAkJbG9hZF9ydW50aW1lX2luc3RyX2NiKCZydW50aW1lX2luc3RyX2VtcHR5X2NiKTsKLSNlbmRpZgogfQogCi0jaWZkZWYgQ09ORklHXzY0QklUCi1leHRlcm4gdm9pZCBleGl0X3RocmVhZF9ydW50aW1lX2luc3RyKHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBleGl0X3RocmVhZF9ydW50aW1lX2luc3RyKHZvaWQpIHsgfQotI2VuZGlmCit2b2lkIGV4aXRfdGhyZWFkX3J1bnRpbWVfaW5zdHIodm9pZCk7CiAKICNlbmRpZiAvKiBfUlVOVElNRV9JTlNUUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcndzZW0uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9yd3NlbS5oCmluZGV4IDQ4N2Y5YjYuLjRiNDNlZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9yd3NlbS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9yd3NlbS5oCkBAIC0zOSwxNyArMzksMTAgQEAKICNlcnJvciAicGxlYXNlIGRvbid0IGluY2x1ZGUgYXNtL3J3c2VtLmggZGlyZWN0bHksIHVzZSBsaW51eC9yd3NlbS5oIGluc3RlYWQiCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfNjRCSVQKLSNkZWZpbmUgUldTRU1fVU5MT0NLRURfVkFMVUUJMHgwMDAwMDAwMAotI2RlZmluZSBSV1NFTV9BQ1RJVkVfQklBUwkweDAwMDAwMDAxCi0jZGVmaW5lIFJXU0VNX0FDVElWRV9NQVNLCTB4MDAwMGZmZmYKLSNkZWZpbmUgUldTRU1fV0FJVElOR19CSUFTCSgtMHgwMDAxMDAwMCkKLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwogI2RlZmluZSBSV1NFTV9VTkxPQ0tFRF9WQUxVRQkweDAwMDAwMDAwMDAwMDAwMDBMCiAjZGVmaW5lIFJXU0VNX0FDVElWRV9CSUFTCTB4MDAwMDAwMDAwMDAwMDAwMUwKICNkZWZpbmUgUldTRU1fQUNUSVZFX01BU0sJMHgwMDAwMDAwMGZmZmZmZmZmTAogI2RlZmluZSBSV1NFTV9XQUlUSU5HX0JJQVMJKC0weDAwMDAwMDAxMDAwMDAwMDBMKQotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogI2RlZmluZSBSV1NFTV9BQ1RJVkVfUkVBRF9CSUFTCVJXU0VNX0FDVElWRV9CSUFTCiAjZGVmaW5lIFJXU0VNX0FDVElWRV9XUklURV9CSUFTCShSV1NFTV9XQUlUSU5HX0JJQVMgKyBSV1NFTV9BQ1RJVkVfQklBUykKIApAQCAtNjEsMTkgKzU0LDExIEBACiAJc2lnbmVkIGxvbmcgb2xkLCBuZXc7CiAKIAlhc20gdm9sYXRpbGUoCi0jaWZuZGVmIENPTkZJR182NEJJVAotCQkiCWwJJTAsJTJcbiIKLQkJIjA6CWxyCSUxLCUwXG4iCi0JCSIJYWhpCSUxLCU0XG4iCi0JCSIJY3MJJTAsJTEsJTJcbiIKLQkJIglqbAkwYiIKLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwogCQkiCWxnCSUwLCUyXG4iCiAJCSIwOglsZ3IJJTEsJTBcbiIKIAkJIglhZ2hpCSUxLCU0XG4iCiAJCSIJY3NnCSUwLCUxLCUyXG4iCiAJCSIJamwJMGIiCi0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAJCTogIj0mZCIgKG9sZCksICI9JmQiIChuZXcpLCAiPVEiIChzZW0tPmNvdW50KQogCQk6ICJRIiAoc2VtLT5jb3VudCksICJpIiAoUldTRU1fQUNUSVZFX1JFQURfQklBUykKIAkJOiAiY2MiLCAibWVtb3J5Iik7CkBAIC04OSwxNSArNzQsNiBAQAogCXNpZ25lZCBsb25nIG9sZCwgbmV3OwogCiAJYXNtIHZvbGF0aWxlKAotI2lmbmRlZiBDT05GSUdfNjRCSVQKLQkJIglsCSUwLCUyXG4iCi0JCSIwOglsdHIJJTEsJTBcbiIKLQkJIglqbQkxZlxuIgotCQkiCWFoaQklMSwlNFxuIgotCQkiCWNzCSUwLCUxLCUyXG4iCi0JCSIJamwJMGJcbiIKLQkJIjE6IgotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAJCSIJbGcJJTAsJTJcbiIKIAkJIjA6CWx0Z3IJJTEsJTBcbiIKIAkJIglqbQkxZlxuIgpAQCAtMTA1LDcgKzgxLDYgQEAKIAkJIgljc2cJJTAsJTEsJTJcbiIKIAkJIglqbAkwYlxuIgogCQkiMToiCi0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAJCTogIj0mZCIgKG9sZCksICI9JmQiIChuZXcpLCAiPVEiIChzZW0tPmNvdW50KQogCQk6ICJRIiAoc2VtLT5jb3VudCksICJpIiAoUldTRU1fQUNUSVZFX1JFQURfQklBUykKIAkJOiAiY2MiLCAibWVtb3J5Iik7CkBAIC0xMjEsMTkgKzk2LDExIEBACiAKIAl0bXAgPSBSV1NFTV9BQ1RJVkVfV1JJVEVfQklBUzsKIAlhc20gdm9sYXRpbGUoCi0jaWZuZGVmIENPTkZJR182NEJJVAotCQkiCWwJJTAsJTJcbiIKLQkJIjA6CWxyCSUxLCUwXG4iCi0JCSIJYQklMSwlNFxuIgotCQkiCWNzCSUwLCUxLCUyXG4iCi0JCSIJamwJMGIiCi0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KIAkJIglsZwklMCwlMlxuIgogCQkiMDoJbGdyCSUxLCUwXG4iCiAJCSIJYWcJJTEsJTRcbiIKIAkJIgljc2cJJTAsJTEsJTJcbiIKIAkJIglqbAkwYiIKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAkJOiAiPSZkIiAob2xkKSwgIj0mZCIgKG5ldyksICI9USIgKHNlbS0+Y291bnQpCiAJCTogIlEiIChzZW0tPmNvdW50KSwgIm0iICh0bXApCiAJCTogImNjIiwgIm1lbW9yeSIpOwpAQCAtMTU0LDE5ICsxMjEsMTEgQEAKIAlzaWduZWQgbG9uZyBvbGQ7CiAKIAlhc20gdm9sYXRpbGUoCi0jaWZuZGVmIENPTkZJR182NEJJVAotCQkiCWwJJTAsJTFcbiIKLQkJIjA6CWx0cgklMCwlMFxuIgotCQkiCWpuegkxZlxuIgotCQkiCWNzCSUwLCUzLCUxXG4iCi0JCSIJamwJMGJcbiIKLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwogCQkiCWxnCSUwLCUxXG4iCiAJCSIwOglsdGdyCSUwLCUwXG4iCiAJCSIJam56CTFmXG4iCiAJCSIJY3NnCSUwLCUzLCUxXG4iCiAJCSIJamwJMGJcbiIKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAkJIjE6IgogCQk6ICI9JmQiIChvbGQpLCAiPVEiIChzZW0tPmNvdW50KQogCQk6ICJRIiAoc2VtLT5jb3VudCksICJkIiAoUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMpCkBAIC0xODIsMTkgKzE0MSwxMSBAQAogCXNpZ25lZCBsb25nIG9sZCwgbmV3OwogCiAJYXNtIHZvbGF0aWxlKAotI2lmbmRlZiBDT05GSUdfNjRCSVQKLQkJIglsCSUwLCUyXG4iCi0JCSIwOglscgklMSwlMFxuIgotCQkiCWFoaQklMSwlNFxuIgotCQkiCWNzCSUwLCUxLCUyXG4iCi0JCSIJamwJMGIiCi0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KIAkJIglsZwklMCwlMlxuIgogCQkiMDoJbGdyCSUxLCUwXG4iCiAJCSIJYWdoaQklMSwlNFxuIgogCQkiCWNzZwklMCwlMSwlMlxuIgogCQkiCWpsCTBiIgotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCQk6ICI9JmQiIChvbGQpLCAiPSZkIiAobmV3KSwgIj1RIiAoc2VtLT5jb3VudCkKIAkJOiAiUSIgKHNlbS0+Y291bnQpLCAiaSIgKC1SV1NFTV9BQ1RJVkVfUkVBRF9CSUFTKQogCQk6ICJjYyIsICJtZW1vcnkiKTsKQEAgLTIxMiwxOSArMTYzLDExIEBACiAKIAl0bXAgPSAtUldTRU1fQUNUSVZFX1dSSVRFX0JJQVM7CiAJYXNtIHZvbGF0aWxlKAotI2lmbmRlZiBDT05GSUdfNjRCSVQKLQkJIglsCSUwLCUyXG4iCi0JCSIwOglscgklMSwlMFxuIgotCQkiCWEJJTEsJTRcbiIKLQkJIgljcwklMCwlMSwlMlxuIgotCQkiCWpsCTBiIgotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAJCSIJbGcJJTAsJTJcbiIKIAkJIjA6CWxncgklMSwlMFxuIgogCQkiCWFnCSUxLCU0XG4iCiAJCSIJY3NnCSUwLCUxLCUyXG4iCiAJCSIJamwJMGIiCi0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAJCTogIj0mZCIgKG9sZCksICI9JmQiIChuZXcpLCAiPVEiIChzZW0tPmNvdW50KQogCQk6ICJRIiAoc2VtLT5jb3VudCksICJtIiAodG1wKQogCQk6ICJjYyIsICJtZW1vcnkiKTsKQEAgLTI0MiwxOSArMTg1LDExIEBACiAKIAl0bXAgPSAtUldTRU1fV0FJVElOR19CSUFTOwogCWFzbSB2b2xhdGlsZSgKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0JCSIJbAklMCwlMlxuIgotCQkiMDoJbHIJJTEsJTBcbiIKLQkJIglhCSUxLCU0XG4iCi0JCSIJY3MJJTAsJTEsJTJcbiIKLQkJIglqbAkwYiIKLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwogCQkiCWxnCSUwLCUyXG4iCiAJCSIwOglsZ3IJJTEsJTBcbiIKIAkJIglhZwklMSwlNFxuIgogCQkiCWNzZwklMCwlMSwlMlxuIgogCQkiCWpsCTBiIgotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCQk6ICI9JmQiIChvbGQpLCAiPSZkIiAobmV3KSwgIj1RIiAoc2VtLT5jb3VudCkKIAkJOiAiUSIgKHNlbS0+Y291bnQpLCAibSIgKHRtcCkKIAkJOiAiY2MiLCAibWVtb3J5Iik7CkBAIC0yNzAsMTkgKzIwNSwxMSBAQAogCXNpZ25lZCBsb25nIG9sZCwgbmV3OwogCiAJYXNtIHZvbGF0aWxlKAotI2lmbmRlZiBDT05GSUdfNjRCSVQKLQkJIglsCSUwLCUyXG4iCi0JCSIwOglscgklMSwlMFxuIgotCQkiCWFyCSUxLCU0XG4iCi0JCSIJY3MJJTAsJTEsJTJcbiIKLQkJIglqbAkwYiIKLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwogCQkiCWxnCSUwLCUyXG4iCiAJCSIwOglsZ3IJJTEsJTBcbiIKIAkJIglhZ3IJJTEsJTRcbiIKIAkJIgljc2cJJTAsJTEsJTJcbiIKIAkJIglqbAkwYiIKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAkJOiAiPSZkIiAob2xkKSwgIj0mZCIgKG5ldyksICI9USIgKHNlbS0+Y291bnQpCiAJCTogIlEiIChzZW0tPmNvdW50KSwgImQiIChkZWx0YSkKIAkJOiAiY2MiLCAibWVtb3J5Iik7CkBAIC0yOTYsMTkgKzIyMywxMSBAQAogCXNpZ25lZCBsb25nIG9sZCwgbmV3OwogCiAJYXNtIHZvbGF0aWxlKAotI2lmbmRlZiBDT05GSUdfNjRCSVQKLQkJIglsCSUwLCUyXG4iCi0JCSIwOglscgklMSwlMFxuIgotCQkiCWFyCSUxLCU0XG4iCi0JCSIJY3MJJTAsJTEsJTJcbiIKLQkJIglqbAkwYiIKLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwogCQkiCWxnCSUwLCUyXG4iCiAJCSIwOglsZ3IJJTEsJTBcbiIKIAkJIglhZ3IJJTEsJTRcbiIKIAkJIgljc2cJJTAsJTEsJTJcbiIKIAkJIglqbAkwYiIKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAkJOiAiPSZkIiAob2xkKSwgIj0mZCIgKG5ldyksICI9USIgKHNlbS0+Y291bnQpCiAJCTogIlEiIChzZW0tPmNvdW50KSwgImQiIChkZWx0YSkKIAkJOiAiY2MiLCAibWVtb3J5Iik7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2V0dXAuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IGI4ZDFlNTQuLmI4ZmZjMWIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZXR1cC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZXR1cC5oCkBAIC0xNSwxOSArMTUsMTEgQEAKICNpbmNsdWRlIDxhc20vbG93Y29yZS5oPgogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCi0jaWZuZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBJUExfREVWSUNFICAgICAgICAoKih1bnNpZ25lZCBsb25nICopICAoMHgxMDQwNCkpCi0jZGVmaW5lIElOSVRSRF9TVEFSVCAgICAgICgqKHVuc2lnbmVkIGxvbmcgKikgICgweDEwNDBDKSkKLSNkZWZpbmUgSU5JVFJEX1NJWkUgICAgICAgKCoodW5zaWduZWQgbG9uZyAqKSAgKDB4MTA0MTQpKQotI2RlZmluZSBPTERNRU1fQkFTRQkgICgqKHVuc2lnbmVkIGxvbmcgKikgICgweDEwNDFDKSkKLSNkZWZpbmUgT0xETUVNX1NJWkUJICAoKih1bnNpZ25lZCBsb25nICopICAoMHgxMDQyNCkpCi0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KICNkZWZpbmUgSVBMX0RFVklDRSAgICAgICAgKCoodW5zaWduZWQgbG9uZyAqKSAgKDB4MTA0MDApKQogI2RlZmluZSBJTklUUkRfU1RBUlQgICAgICAoKih1bnNpZ25lZCBsb25nICopICAoMHgxMDQwOCkpCiAjZGVmaW5lIElOSVRSRF9TSVpFICAgICAgICgqKHVuc2lnbmVkIGxvbmcgKikgICgweDEwNDEwKSkKICNkZWZpbmUgT0xETUVNX0JBU0UJICAoKih1bnNpZ25lZCBsb25nICopICAoMHgxMDQxOCkpCiAjZGVmaW5lIE9MRE1FTV9TSVpFCSAgKCoodW5zaWduZWQgbG9uZyAqKSAgKDB4MTA0MjApKQotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogI2RlZmluZSBDT01NQU5EX0xJTkUgICAgICAoKGNoYXIgKikgICAgICAgICAgICAoMHgxMDQ4MCkpCiAKIGV4dGVybiBpbnQgbWVtb3J5X2VuZF9zZXQ7CkBAIC02OCwyNiArNjAsOCBAQAogI2RlZmluZSBNQUNISU5FX0hBU19QRk1GCU1BQ0hJTkVfSEFTX0VEQVQxCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX0hQQUdFCU1BQ0hJTkVfSEFTX0VEQVQxCiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0jZGVmaW5lIE1BQ0hJTkVfSEFTX0lFRUUJKFMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzICYgTUFDSElORV9GTEFHX0lFRUUpCi0jZGVmaW5lIE1BQ0hJTkVfSEFTX0NTUAkJKFMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzICYgTUFDSElORV9GTEFHX0NTUCkKLSNkZWZpbmUgTUFDSElORV9IQVNfSURURQkoMCkKLSNkZWZpbmUgTUFDSElORV9IQVNfRElBRzQ0CSgxKQotI2RlZmluZSBNQUNISU5FX0hBU19NVlBHCShTMzkwX2xvd2NvcmUubWFjaGluZV9mbGFncyAmIE1BQ0hJTkVfRkxBR19NVlBHKQotI2RlZmluZSBNQUNISU5FX0hBU19FREFUMQkoMCkKLSNkZWZpbmUgTUFDSElORV9IQVNfRURBVDIJKDApCi0jZGVmaW5lIE1BQ0hJTkVfSEFTX0xQUAkJKDApCi0jZGVmaW5lIE1BQ0hJTkVfSEFTX1RPUE9MT0dZCSgwKQotI2RlZmluZSBNQUNISU5FX0hBU19URQkJKDApCi0jZGVmaW5lIE1BQ0hJTkVfSEFTX1RMQl9MQwkoMCkKLSNkZWZpbmUgTUFDSElORV9IQVNfVlgJCSgwKQotI2RlZmluZSBNQUNISU5FX0hBU19DQUQJCSgwKQotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCi0jZGVmaW5lIE1BQ0hJTkVfSEFTX0lFRUUJKDEpCi0jZGVmaW5lIE1BQ0hJTkVfSEFTX0NTUAkJKDEpCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX0lEVEUJKFMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzICYgTUFDSElORV9GTEFHX0lEVEUpCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX0RJQUc0NAkoUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgJiBNQUNISU5FX0ZMQUdfRElBRzQ0KQotI2RlZmluZSBNQUNISU5FX0hBU19NVlBHCSgxKQogI2RlZmluZSBNQUNISU5FX0hBU19FREFUMQkoUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgJiBNQUNISU5FX0ZMQUdfRURBVDEpCiAjZGVmaW5lIE1BQ0hJTkVfSEFTX0VEQVQyCShTMzkwX2xvd2NvcmUubWFjaGluZV9mbGFncyAmIE1BQ0hJTkVfRkxBR19FREFUMikKICNkZWZpbmUgTUFDSElORV9IQVNfTFBQCQkoUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgJiBNQUNISU5FX0ZMQUdfTFBQKQpAQCAtOTYsNyArNzAsNiBAQAogI2RlZmluZSBNQUNISU5FX0hBU19UTEJfTEMJKFMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzICYgTUFDSElORV9GTEFHX1RMQl9MQykKICNkZWZpbmUgTUFDSElORV9IQVNfVlgJCShTMzkwX2xvd2NvcmUubWFjaGluZV9mbGFncyAmIE1BQ0hJTkVfRkxBR19WWCkKICNkZWZpbmUgTUFDSElORV9IQVNfQ0FECQkoUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgJiBNQUNISU5FX0ZMQUdfQ0FEKQotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCiAvKgogICogQ29uc29sZSBtb2RlLiBPdmVycmlkZSB3aXRoIGNvbm1vZGU9CkBAIC0xMzUsMTkgKzEwOCwxMSBAQAogCiAjZWxzZSAvKiBfX0FTU0VNQkxZX18gKi8KIAotI2lmbmRlZiBDT05GSUdfNjRCSVQKLSNkZWZpbmUgSVBMX0RFVklDRSAgICAgICAgMHgxMDQwNAotI2RlZmluZSBJTklUUkRfU1RBUlQgICAgICAweDEwNDBDCi0jZGVmaW5lIElOSVRSRF9TSVpFICAgICAgIDB4MTA0MTQKLSNkZWZpbmUgT0xETUVNX0JBU0UJICAweDEwNDFDCi0jZGVmaW5lIE9MRE1FTV9TSVpFCSAgMHgxMDQyNAotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAjZGVmaW5lIElQTF9ERVZJQ0UgICAgICAgIDB4MTA0MDAKICNkZWZpbmUgSU5JVFJEX1NUQVJUICAgICAgMHgxMDQwOAogI2RlZmluZSBJTklUUkRfU0laRSAgICAgICAweDEwNDEwCiAjZGVmaW5lIE9MRE1FTV9CQVNFCSAgMHgxMDQxOAogI2RlZmluZSBPTERNRU1fU0laRQkgIDB4MTA0MjAKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KICNkZWZpbmUgQ09NTUFORF9MSU5FICAgICAgMHgxMDQ4MAogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc2ZwLXV0aWwuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZnAtdXRpbC5oCmluZGV4IDU5NTliZmIuLmM4YjdjZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZnAtdXRpbC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zZnAtdXRpbC5oCkBAIC01MSw3ICs1MSw2IEBACiAJd2wgPSBfX3dsOwkJCQkJXAogfSkKIAotI2lmZGVmIENPTkZJR182NEJJVAogI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkJCQlcCiAgIGRvIHsgdW5zaWduZWQgbG9uZyBfX247CQkJCVwKICAgICAgICB1bnNpZ25lZCBpbnQgX19yLCBfX2Q7CQkJCVwKQEAgLTYwLDE1ICs1OSw2IEBACiAgICAgKHEpID0gX19uIC8gX19kOwkJCQkJXAogICAgIChyKSA9IF9fbiAlIF9fZDsJCQkJCVwKICAgfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKQkJCVwKLSAgZG8geyB1bnNpZ25lZCBpbnQgX19yOwkJCQlcCi0gICAgKHEpID0gX191ZGl2X3Fybm5kICgmX19yLCAobjEpLCAobjApLCAoZCkpOwkJXAotICAgIChyKSA9IF9fcjsJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi1leHRlcm4gdW5zaWduZWQgbG9uZyBfX3VkaXZfcXJubmQgKHVuc2lnbmVkIGludCAqLCB1bnNpZ25lZCBpbnQsCi0JCQkJICAgdW5zaWduZWQgaW50ICwgdW5zaWduZWQgaW50KTsKLSNlbmRpZgogCiAjZGVmaW5lIFVESVZfTkVFRFNfTk9STUFMSVpBVElPTiAwCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zcGFyc2VtZW0uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zcGFyc2VtZW0uaAppbmRleCBhNjBkMDg1Li40ODc0MjhiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3BhcnNlbWVtLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NwYXJzZW1lbS5oCkBAIC0xLDE2ICsxLDcgQEAKICNpZm5kZWYgX0FTTV9TMzkwX1NQQVJTRU1FTV9ICiAjZGVmaW5lIF9BU01fUzM5MF9TUEFSU0VNRU1fSAogCi0jaWZkZWYgQ09ORklHXzY0QklUCi0KICNkZWZpbmUgU0VDVElPTl9TSVpFX0JJVFMJMjgKICNkZWZpbmUgTUFYX1BIWVNNRU1fQklUUwk0NgogCi0jZWxzZQotCi0jZGVmaW5lIFNFQ1RJT05fU0laRV9CSVRTCTI1Ci0jZGVmaW5lIE1BWF9QSFlTTUVNX0JJVFMJMzEKLQotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwotCiAjZW5kaWYgLyogX0FTTV9TMzkwX1NQQVJTRU1FTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3dpdGNoX3RvLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3dpdGNoX3RvLmgKaW5kZXggMjU0MmE3ZS4uZDYyZTdhNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N3aXRjaF90by5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaApAQCAtMTgsOSArMTgsNiBAQAogCXUzMiBvcmlnX2ZwYzsKIAlpbnQgcmM7CiAKLQlpZiAoIU1BQ0hJTkVfSEFTX0lFRUUpCi0JCXJldHVybiAwOwotCiAJYXNtIHZvbGF0aWxlKAogCQkiCWVmcGMgICAgJTFcbiIKIAkJIglzZnBjCSUyXG4iCkBAIC0zNSw5ICszMiw2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX2ZwX2N0bCh1MzIgKmZwYykKIHsKLQlpZiAoIU1BQ0hJTkVfSEFTX0lFRUUpCi0JCXJldHVybjsKLQogCWFzbSB2b2xhdGlsZSgKIAkJIiAgICAgICBzdGZwYyAgICUwXG4iCiAJCTogIitRIiAoKmZwYykpOwpAQCAtNDcsOSArNDEsNiBAQAogewogCWludCByYzsKIAotCWlmICghTUFDSElORV9IQVNfSUVFRSkKLQkJcmV0dXJuIDA7Ci0KIAlhc20gdm9sYXRpbGUoCiAJCSIJbGZwYyAgICAlMVxuIgogCQkiMDoJbGEJJTAsMFxuIgpAQCAtNjUsOCArNTYsNiBAQAogCWFzbSB2b2xhdGlsZSgic3RkIDIsJTAiIDogIj1RIiAoZnByc1syXSkpOwogCWFzbSB2b2xhdGlsZSgic3RkIDQsJTAiIDogIj1RIiAoZnByc1s0XSkpOwogCWFzbSB2b2xhdGlsZSgic3RkIDYsJTAiIDogIj1RIiAoZnByc1s2XSkpOwotCWlmICghTUFDSElORV9IQVNfSUVFRSkKLQkJcmV0dXJuOwogCWFzbSB2b2xhdGlsZSgic3RkIDEsJTAiIDogIj1RIiAoZnByc1sxXSkpOwogCWFzbSB2b2xhdGlsZSgic3RkIDMsJTAiIDogIj1RIiAoZnByc1szXSkpOwogCWFzbSB2b2xhdGlsZSgic3RkIDUsJTAiIDogIj1RIiAoZnByc1s1XSkpOwpAQCAtODcsOCArNzYsNiBAQAogCWFzbSB2b2xhdGlsZSgibGQgMiwlMCIgOiA6ICJRIiAoZnByc1syXSkpOwogCWFzbSB2b2xhdGlsZSgibGQgNCwlMCIgOiA6ICJRIiAoZnByc1s0XSkpOwogCWFzbSB2b2xhdGlsZSgibGQgNiwlMCIgOiA6ICJRIiAoZnByc1s2XSkpOwotCWlmICghTUFDSElORV9IQVNfSUVFRSkKLQkJcmV0dXJuOwogCWFzbSB2b2xhdGlsZSgibGQgMSwlMCIgOiA6ICJRIiAoZnByc1sxXSkpOwogCWFzbSB2b2xhdGlsZSgibGQgMywlMCIgOiA6ICJRIiAoZnByc1szXSkpOwogCWFzbSB2b2xhdGlsZSgibGQgNSwlMCIgOiA6ICJRIiAoZnByc1s1XSkpOwpAQCAtMTQwLDIyICsxMjcsMTggQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHNhdmVfZnBfdnhfcmVncyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJaWYgKHRhc2stPnRocmVhZC52eHJzKQogCQlzYXZlX3Z4X3JlZ3ModGFzay0+dGhyZWFkLnZ4cnMpOwogCWVsc2UKLSNlbmRpZgotCXNhdmVfZnBfcmVncyh0YXNrLT50aHJlYWQuZnBfcmVncy5mcHJzKTsKKwkJc2F2ZV9mcF9yZWdzKHRhc2stPnRocmVhZC5mcF9yZWdzLmZwcnMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9mcF92eF9yZWdzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlpZiAodGFzay0+dGhyZWFkLnZ4cnMpCiAJCXJlc3RvcmVfdnhfcmVncyh0YXNrLT50aHJlYWQudnhycyk7CiAJZWxzZQotI2VuZGlmCi0JcmVzdG9yZV9mcF9yZWdzKHRhc2stPnRocmVhZC5mcF9yZWdzLmZwcnMpOworCQlyZXN0b3JlX2ZwX3JlZ3ModGFzay0+dGhyZWFkLmZwX3JlZ3MuZnBycyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzYXZlX2FjY2Vzc19yZWdzKHVuc2lnbmVkIGludCAqYWNycykKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXNjYWxsLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzY2FsbC5oCmluZGV4IDViYzEyNTkuLjZiYTBiZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXNjYWxsLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c2NhbGwuaApAQCAtOTUsNiArOTUsNiBAQAogCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyhjdXJyZW50LCBUSUZfMzFCSVQpKQogCQlyZXR1cm4gQVVESVRfQVJDSF9TMzkwOwogI2VuZGlmCi0JcmV0dXJuIHNpemVvZihsb25nKSA9PSA4ID8gQVVESVRfQVJDSF9TMzkwWCA6IEFVRElUX0FSQ0hfUzM5MDsKKwlyZXR1cm4gQVVESVRfQVJDSF9TMzkwWDsKIH0KICNlbmRpZgkvKiBfQVNNX1NZU0NBTExfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCBlZjFkZjcxLi40YzI3ZWM3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMTAsMTMgKzEwLDggQEAKIC8qCiAgKiBTaXplIG9mIGtlcm5lbCBzdGFjayBmb3IgZWFjaCBwcm9jZXNzCiAgKi8KLSNpZm5kZWYgQ09ORklHXzY0QklUCi0jZGVmaW5lIFRIUkVBRF9PUkRFUiAxCi0jZGVmaW5lIEFTWU5DX09SREVSICAxCi0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KICNkZWZpbmUgVEhSRUFEX09SREVSIDIKICNkZWZpbmUgQVNZTkNfT1JERVIgIDIKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAogI2RlZmluZSBUSFJFQURfU0laRSAoUEFHRV9TSVpFIDw8IFRIUkVBRF9PUkRFUikKICNkZWZpbmUgQVNZTkNfU0laRSAgKFBBR0VfU0laRSA8PCBBU1lOQ19PUkRFUikKQEAgLTM0LDcgKzI5LDYgQEAKICAqLwogc3RydWN0IHRocmVhZF9pbmZvIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CQkvKiBtYWluIHRhc2sgc3RydWN0dXJlICovCi0Jc3RydWN0IGV4ZWNfZG9tYWluCSpleGVjX2RvbWFpbjsJLyogZXhlY3V0aW9uIGRvbWFpbiAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogbG93IGxldmVsIGZsYWdzICovCiAJdW5zaWduZWQgbG9uZwkJc3lzX2NhbGxfdGFibGU7CS8qIFN5c3RlbSBjYWxsIHRhYmxlIGFkZHJlc3MgKi8KIAl1bnNpZ25lZCBpbnQJCWNwdTsJCS8qIGN1cnJlbnQgQ1BVICovCkBAIC01MSw3ICs0NSw2IEBACiAjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKIHsJCQkJCQlcCiAJLnRhc2sJCT0gJnRzaywJCQlcCi0JLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKIAkuZmxhZ3MJCT0gMCwJCQlcCiAJLmNwdQkJPSAwLAkJCVwKIAkucHJlZW1wdF9jb3VudAk9IElOSVRfUFJFRU1QVF9DT1VOVCwJXApAQCAtNjYsNiArNTksOCBAQAogCXJldHVybiAoc3RydWN0IHRocmVhZF9pbmZvICopIFMzOTBfbG93Y29yZS50aHJlYWRfaW5mbzsKIH0KIAordm9pZCBhcmNoX3JlbGVhc2VfdGFza19zdHJ1Y3Qoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworCiAjZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSIFRIUkVBRF9PUkRFUgogCiAjZW5kaWYKQEAgLTk5LDEwICs5NCw2IEBACiAjZGVmaW5lIF9USUZfMzFCSVQJCSgxPDxUSUZfMzFCSVQpCiAjZGVmaW5lIF9USUZfU0lOR0xFX1NURVAJKDE8PFRJRl9TSU5HTEVfU1RFUCkKIAotI2lmZGVmIENPTkZJR182NEJJVAogI2RlZmluZSBpc18zMmJpdF90YXNrKCkJCSh0ZXN0X3RocmVhZF9mbGFnKFRJRl8zMUJJVCkpCi0jZWxzZQotI2RlZmluZSBpc18zMmJpdF90YXNrKCkJCSgxKQotI2VuZGlmCiAKICNlbmRpZiAvKiBfQVNNX1RIUkVBRF9JTkZPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGIuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGIuaAppbmRleCAwNmQ4NzQxLi43YTkyZTY5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdGxiLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYi5oCkBAIC0xMTgsMTIgKzExOCwxMCBAQAogc3RhdGljIGlubGluZSB2b2lkIHBtZF9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwbWRfdCAqcG1kLAogCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlpZiAodGxiLT5tbS0+Y29udGV4dC5hc2NlX2xpbWl0IDw9ICgxVUwgPDwgMzEpKQogCQlyZXR1cm47CiAJcGd0YWJsZV9wbWRfcGFnZV9kdG9yKHZpcnRfdG9fcGFnZShwbWQpKTsKIAl0bGJfcmVtb3ZlX3RhYmxlKHRsYiwgcG1kKTsKLSNlbmRpZgogfQogCiAvKgpAQCAtMTM2LDExICsxMzQsOSBAQAogc3RhdGljIGlubGluZSB2b2lkIHB1ZF9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwdWRfdCAqcHVkLAogCQkJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlpZiAodGxiLT5tbS0+Y29udGV4dC5hc2NlX2xpbWl0IDw9ICgxVUwgPDwgNDIpKQogCQlyZXR1cm47CiAJdGxiX3JlbW92ZV90YWJsZSh0bGIsIHB1ZCk7Ci0jZW5kaWYKIH0KIAogI2RlZmluZSB0bGJfc3RhcnRfdm1hKHRsYiwgdm1hKQkJCWRvIHsgfSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS90bGJmbHVzaC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKaW5kZXggMTZjOWM4OC4uY2ExNDhmNyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKQEAgLTQ5LDEzICs0OSw2IEBACiAJcmVnaXN0ZXIgdW5zaWduZWQgbG9uZyByZWc0IGFzbSgiNCIpOwogCWxvbmcgZHVtbXk7CiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0JaWYgKCFNQUNISU5FX0hBU19DU1ApIHsKLQkJc21wX3B0bGJfYWxsKCk7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCi0KIAlkdW1teSA9IDA7CiAJcmVnMiA9IHJlZzMgPSAwOwogCXJlZzQgPSAoKHVuc2lnbmVkIGxvbmcpICZkdW1teSkgKyAxOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3R5cGVzLmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdHlwZXMuaAppbmRleCBkY2NlZjNjLi42NzQwZjRmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdHlwZXMuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdHlwZXMuaApAQCAtOCwyMSArOCw0IEBACiAKICNpbmNsdWRlIDx1YXBpL2FzbS90eXBlcy5oPgogCi0vKgotICogVGhlc2UgYXJlbid0IGV4cG9ydGVkIG91dHNpZGUgdGhlIGtlcm5lbCB0byBhdm9pZCBuYW1lIHNwYWNlIGNsYXNoZXMKLSAqLwotCi0jaWZuZGVmIF9fQVNTRU1CTFlfXwotCi0jaWZuZGVmIENPTkZJR182NEJJVAotdHlwZWRlZiB1bmlvbiB7Ci0JdW5zaWduZWQgbG9uZyBsb25nIHBhaXI7Ci0Jc3RydWN0IHsKLQkJdW5zaWduZWQgbG9uZyBldmVuOwotCQl1bnNpZ25lZCBsb25nIG9kZDsKLQl9IHN1YnJlZzsKLX0gcmVnaXN0ZXJfcGFpcjsKLQotI2VuZGlmIC8qICEgQ09ORklHXzY0QklUICAgKi8KLSNlbmRpZiAvKiBfX0FTU0VNQkxZX18gICovCiAjZW5kaWYgLyogX1MzOTBfVFlQRVNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS91YWNjZXNzLmgKaW5kZXggY2Q0YzY4ZS4uZDY0YTdhNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCkBAIC0zNzIsNSArMzcyLDYgQEAKIH0KIAogaW50IGNvcHlfdG9fdXNlcl9yZWFsKHZvaWQgX191c2VyICpkZXN0LCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpOwordm9pZCBzMzkwX2tlcm5lbF93cml0ZSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNpemUpOwogCiAjZW5kaWYgLyogX19TMzkwX1VBQ0NFU1NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IDY1MTg4NjMuLjkxZjU2YjEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTksMTEgKzksNyBAQAogI2luY2x1ZGUgPHVhcGkvYXNtL3VuaXN0ZC5oPgogCiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0jZGVmaW5lIF9fSUdOT1JFX3NlbGVjdAotI2Vsc2UKICNkZWZpbmUgX19JR05PUkVfdGltZQotI2VuZGlmCiAKIC8qIElnbm9yZSBOVU1BIHN5c3RlbSBjYWxscy4gTm90IHdpcmVkIHVwIG9uIHMzOTAuICovCiAjZGVmaW5lIF9fSUdOT1JFX21iaW5kCkBAIC00MywxMCArMzksNiBAQAogI2RlZmluZSBfX0FSQ0hfV0FOVF9TWVNfT0xEVU1PVU5UCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQRU5ESU5HCiAjZGVmaW5lIF9fQVJDSF9XQU5UX1NZU19TSUdQUk9DTUFTSwotIyBpZm5kZWYgQ09ORklHXzY0QklUCi0jICAgZGVmaW5lIF9fQVJDSF9XQU5UX1NUQVQ2NAotIyAgIGRlZmluZSBfX0FSQ0hfV0FOVF9TWVNfVElNRQotIyBlbmRpZgogIyBpZmRlZiBDT05GSUdfQ09NUEFUCiAjICAgZGVmaW5lIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfVElNRQogIyBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Zkc28uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS92ZHNvLmgKaW5kZXggYTYyNTI2ZC4uNzg3YWNkNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Zkc28uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vdmRzby5oCkBAIC00MiwxMCArNDIsOCBAQAogCiBleHRlcm4gc3RydWN0IHZkc29fZGF0YSAqdmRzb19kYXRhOwogCi0jaWZkZWYgQ09ORklHXzY0QklUCiBpbnQgdmRzb19hbGxvY19wZXJfY3B1KHN0cnVjdCBfbG93Y29yZSAqbG93Y29yZSk7CiB2b2lkIHZkc29fZnJlZV9wZXJfY3B1KHN0cnVjdCBfbG93Y29yZSAqbG93Y29yZSk7Ci0jZW5kaWYKIAogI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIF9fUzM5MF9WRFNPX0hfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20va3ZtLmggYi9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9rdm0uaAppbmRleCA5Yzc3ZTYwLi5lZjFhNWZjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9rdm0uaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS91YXBpL2FzbS9rdm0uaApAQCAtMTUwLDYgKzE1MCw3IEBACiAjZGVmaW5lIEtWTV9TWU5DX0NSUyAgICAoMVVMIDw8IDMpCiAjZGVmaW5lIEtWTV9TWU5DX0FSQ0gwICAoMVVMIDw8IDQpCiAjZGVmaW5lIEtWTV9TWU5DX1BGQVVMVCAoMVVMIDw8IDUpCisjZGVmaW5lIEtWTV9TWU5DX1ZSUyAgICAoMVVMIDw8IDYpCiAvKiBkZWZpbml0aW9uIG9mIHJlZ2lzdGVycyBpbiBrdm1fcnVuICovCiBzdHJ1Y3Qga3ZtX3N5bmNfcmVncyB7CiAJX191NjQgcHJlZml4OwkvKiBwcmVmaXggcmVnaXN0ZXIgKi8KQEAgLTE2NCw2ICsxNjUsOSBAQAogCV9fdTY0IHBmdDsJLyogcGZhdWx0IHRva2VuIFtQRkFVTFRdICovCiAJX191NjQgcGZzOwkvKiBwZmF1bHQgc2VsZWN0IFtQRkFVTFRdICovCiAJX191NjQgcGZjOwkvKiBwZmF1bHQgY29tcGFyZSBbUEZBVUxUXSAqLworCV9fdTY0IHZyc1szMl1bMl07CS8qIHZlY3RvciByZWdpc3RlcnMgKi8KKwlfX3U4ICByZXNlcnZlZFs1MTJdOwkvKiBmb3IgZnV0dXJlIHZlY3RvciBleHBhbnNpb24gKi8KKwlfX3UzMiBmcGM7CS8qIG9ubHkgdmFsaWQgd2l0aCB2ZWN0b3IgcmVnaXN0ZXJzICovCiB9OwogCiAjZGVmaW5lIEtWTV9SRUdfUzM5MF9UT0RQUgkoS1ZNX1JFR19TMzkwIHwgS1ZNX1JFR19TSVpFX1UzMiB8IDB4MSkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL3VhcGkvYXNtL3NpZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vc2llLmgKaW5kZXggZDQwOTZmZC4uZWU2OWMwOCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vc2llLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvdWFwaS9hc20vc2llLmgKQEAgLTIzMCw3ICsyMzAsNyBAQAogICogYW5kIHJldHVybnMgYSBrZXksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGZpbmQgYSBtbmVtb25pYyBuYW1lCiAgKiBvZiB0aGUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGljcHRfaW5zbl9jb2RlcyB0YWJsZS4KICAqLwotI2RlZmluZSBpY3B0X2luc25fZGVjb2RlcihpbnNuKQkJCVwKKyNkZWZpbmUgaWNwdF9pbnNuX2RlY29kZXIoaW5zbikgKAkJXAogCUlOU05fREVDT0RFX0lQQTAoMHgwMSwgaW5zbiwgNDgsIDB4ZmYpCVwKIAlJTlNOX0RFQ09ERV9JUEEwKDB4YWEsIGluc24sIDQ4LCAweDBmKQlcCiAJSU5TTl9ERUNPREVfSVBBMCgweGIyLCBpbnNuLCA0OCwgMHhmZikJXApAQCAtMjM5LDYgKzIzOSw2IEBACiAJSU5TTl9ERUNPREVfSVBBMCgweGU1LCBpbnNuLCA0OCwgMHhmZikJXAogCUlOU05fREVDT0RFX0lQQTAoMHhlYiwgaW5zbiwgMTYsIDB4ZmYpCVwKIAlJTlNOX0RFQ09ERV9JUEEwKDB4YzgsIGluc24sIDQ4LCAweDBmKQlcCi0JSU5TTl9ERUNPREUoaW5zbikKKwlJTlNOX0RFQ09ERShpbnNuKSkKIAogI2VuZGlmIC8qIF9VQVBJX0FTTV9TMzkwX1NJRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlIGIvYXJjaC9zMzkwL2tlcm5lbC9NYWtlZmlsZQppbmRleCAzMWZhYjI2Li5mZmI4NzYxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvTWFrZWZpbGUKQEAgLTI2LDI1ICsyNiwyMSBAQAogIwogQ0ZMQUdTX3B0cmFjZS5vCQkrPSAtRFVUU19NQUNISU5FPSciJChVVFNfTUFDSElORSkiJwogCi1DRkxBR1Nfc3lzaW5mby5vICs9IC1JaW5jbHVkZS9tYXRoLWVtdSAtSWFyY2gvczM5MC9tYXRoLWVtdSAtdworQ0ZMQUdTX3N5c2luZm8ubyArPSAtdwogCiBvYmoteQk6PSB0cmFwcy5vIHRpbWUubyBwcm9jZXNzLm8gYmFzZS5vIGVhcmx5Lm8gc2V0dXAubyBpZGxlLm8gdnRpbWUubwogb2JqLXkJKz0gcHJvY2Vzc29yLm8gc3lzX3MzOTAubyBwdHJhY2UubyBzaWduYWwubyBjcGNtZC5vIGViY2RpYy5vIG5taS5vCiBvYmoteQkrPSBkZWJ1Zy5vIGlycS5vIGlwbC5vIGRpcy5vIGRpYWcubyBzY2xwLm8gdmRzby5vCiBvYmoteQkrPSBzeXNpbmZvLm8ganVtcF9sYWJlbC5vIGxnci5vIG9zX2luZm8ubyBtYWNoaW5lX2tleGVjLm8gcGdtX2NoZWNrLm8KLW9iai15CSs9IGR1bXBzdGFjay5vCitvYmoteQkrPSBydW50aW1lX2luc3RyLm8gY2FjaGUubyBkdW1wc3RhY2subworb2JqLXkJKz0gZW50cnkubyByZWlwbC5vIHJlbG9jYXRlX2tlcm5lbC5vCiAKLW9iai15CSs9ICQoaWYgJChDT05GSUdfNjRCSVQpLGVudHJ5NjQubyxlbnRyeS5vKQotb2JqLXkJKz0gJChpZiAkKENPTkZJR182NEJJVCkscmVpcGw2NC5vLHJlaXBsLm8pCi1vYmoteQkrPSAkKGlmICQoQ09ORklHXzY0QklUKSxyZWxvY2F0ZV9rZXJuZWw2NC5vLHJlbG9jYXRlX2tlcm5lbC5vKQotCi1leHRyYS15CQkJCSs9IGhlYWQubyB2bWxpbnV4LmxkcwotZXh0cmEteQkJCQkrPSAkKGlmICQoQ09ORklHXzY0QklUKSxoZWFkNjQubyxoZWFkMzEubykKK2V4dHJhLXkJCQkJKz0gaGVhZC5vIGhlYWQ2NC5vIHZtbGludXgubGRzCiAKIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gczM5MF9rc3ltcy5vIG1vZHVsZS5vCiBvYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8KIG9iai0kKENPTkZJR19TQ0hFRF9CT09LKQkrPSB0b3BvbG9neS5vCi1vYmotJChDT05GSUdfSElCRVJOQVRJT04pCSs9IHN1c3BlbmQubyBzd3N1c3BfYXNtNjQubworb2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkrPSBzdXNwZW5kLm8gc3dzdXNwLm8KIG9iai0kKENPTkZJR19BVURJVCkJCSs9IGF1ZGl0Lm8KIGNvbXBhdC1vYmotJChDT05GSUdfQVVESVQpCSs9IGNvbXBhdF9hdWRpdC5vCiBvYmotJChDT05GSUdfQ09NUEFUKQkJKz0gY29tcGF0X2xpbnV4Lm8gY29tcGF0X3NpZ25hbC5vCkBAIC01NiwxMyArNTIsOSBAQAogb2JqLSQoQ09ORklHX0NSQVNIX0RVTVApCSs9IGNyYXNoX2R1bXAubwogb2JqLSQoQ09ORklHX1VQUk9CRVMpCQkrPSB1cHJvYmVzLm8KIAotaWZkZWYgQ09ORklHXzY0QklUCi1vYmotJChDT05GSUdfUEVSRl9FVkVOVFMpCSs9IHBlcmZfZXZlbnQubyBwZXJmX2NwdW1fY2YubyBwZXJmX2NwdW1fc2YubyBcCi0JCQkJCQlwZXJmX2NwdW1fY2ZfZXZlbnRzLm8KLW9iai15CQkJCSs9IHJ1bnRpbWVfaW5zdHIubyBjYWNoZS5vCi1lbmRpZgorb2JqLSQoQ09ORklHX1BFUkZfRVZFTlRTKQkrPSBwZXJmX2V2ZW50Lm8gcGVyZl9jcHVtX2NmLm8gcGVyZl9jcHVtX3NmLm8KK29iai0kKENPTkZJR19QRVJGX0VWRU5UUykJKz0gcGVyZl9jcHVtX2NmX2V2ZW50cy5vCiAKICMgdmRzbwotb2JqLSQoQ09ORklHXzY0QklUKQkJKz0gdmRzbzY0Lwotb2JqLSQoQ09ORklHXzMyQklUKQkJKz0gdmRzbzMyLworb2JqLXkJCQkJKz0gdmRzbzY0Lwogb2JqLSQoQ09ORklHX0NPTVBBVCkJCSs9IHZkc28zMi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvczM5MC9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCBlMDdlOTE2Li5jN2QxYjlkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0zNCw3ICszNCw2IEBACiAJREVGSU5FKF9fVEhSRUFEX3Blcl9wYWlkLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5wZXJfZXZlbnQucGFpZCkpOwogCUJMQU5LKCk7CiAJREVGSU5FKF9fVElfdGFzaywgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCB0YXNrKSk7Ci0JREVGSU5FKF9fVElfZG9tYWluLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGV4ZWNfZG9tYWluKSk7CiAJREVGSU5FKF9fVElfZmxhZ3MsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZmxhZ3MpKTsKIAlERUZJTkUoX19USV9zeXNjX3RhYmxlLCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHN5c19jYWxsX3RhYmxlKSk7CiAJREVGSU5FKF9fVElfY3B1LCBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGNwdSkpOwpAQCAtMTY2LDExICsxNjUsOSBAQAogCURFRklORShfX0xDX0ZQUkVHU19TQVZFX0FSRUEsIG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgZmxvYXRpbmdfcHRfc2F2ZV9hcmVhKSk7CiAJREVGSU5FKF9fTENfR1BSRUdTX1NBVkVfQVJFQSwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBncHJlZ3Nfc2F2ZV9hcmVhKSk7CiAJREVGSU5FKF9fTENfQ1JFR1NfU0FWRV9BUkVBLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGNyZWdzX3NhdmVfYXJlYSkpOwotI2lmZGVmIENPTkZJR18zMkJJVAotCURFRklORShTQVZFX0FSRUFfQkFTRSwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBleHRlbmRlZF9zYXZlX2FyZWFfYWRkcikpOwotI2Vsc2UgLyogQ09ORklHXzMyQklUICovCiAJREVGSU5FKF9fTENfREFUQV9FWENfQ09ERSwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBkYXRhX2V4Y19jb2RlKSk7CiAJREVGSU5FKF9fTENfTUNDS19GQUlMX1NUT1JfQUREUiwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBmYWlsaW5nX3N0b3JhZ2VfYWRkcmVzcykpOworCURFRklORShfX0xDX1ZYX1NBVkVfQVJFQV9BRERSLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIHZlY3Rvcl9zYXZlX2FyZWFfYWRkcikpOwogCURFRklORShfX0xDX0VYVF9QQVJBTVMyLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGV4dF9wYXJhbXMyKSk7CiAJREVGSU5FKFNBVkVfQVJFQV9CQVNFLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGZsb2F0aW5nX3B0X3NhdmVfYXJlYSkpOwogCURFRklORShfX0xDX1BBU1RFLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIHBhc3RlKSk7CkBAIC0xODMsNiArMTgwLDUgQEAKIAlERUZJTkUoX19HTUFQX0FTQ0UsIG9mZnNldG9mKHN0cnVjdCBnbWFwLCBhc2NlKSk7CiAJREVGSU5FKF9fU0lFX1BST0cwQywgb2Zmc2V0b2Yoc3RydWN0IGt2bV9zMzkwX3NpZV9ibG9jaywgcHJvZzBjKSk7CiAJREVGSU5FKF9fU0lFX1BST0cyMCwgb2Zmc2V0b2Yoc3RydWN0IGt2bV9zMzkwX3NpZV9ibG9jaywgcHJvZzIwKSk7Ci0jZW5kaWYgLyogQ09ORklHXzMyQklUICovCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2Jhc2UuUyBiL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TCmluZGV4IGY3NGE1M2QuLmRhZWQzZmQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TCkBAIC0xMSw4ICsxMSw2IEBACiAjaW5jbHVkZSA8YXNtL3B0cmFjZS5oPgogI2luY2x1ZGUgPGFzbS9zaWdwLmg+CiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKLQogRU5UUlkoczM5MF9iYXNlX21jY2tfaGFuZGxlcikKIAliYXNyCSVyMTMsMAogMDoJbGcJJXIxNSxfX0xDX1BBTklDX1NUQUNLCSMgbG9hZCBwYW5pYyBzdGFjawpAQCAtMTMxLDc3ICsxMjksMyBAQAogLkxmcGN0bDoKIAkubG9uZwkwCiAJLnByZXZpb3VzCi0KLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwotCi1FTlRSWShzMzkwX2Jhc2VfbWNja19oYW5kbGVyKQotCWJhc3IJJXIxMywwCi0wOglsCSVyMTUsX19MQ19QQU5JQ19TVEFDSwkjIGxvYWQgcGFuaWMgc3RhY2sKLQlhaGkJJXIxNSwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLQlsCSVyMSwyZi0wYiglcjEzKQotCWwJJXIxLDAoJXIxKQotCWx0cgklcjEsJXIxCi0JanoJMWYKLQliYXNyCSVyMTQsJXIxCi0xOglsbQklcjAsJXIxNSxfX0xDX0dQUkVHU19TQVZFX0FSRUEKLQlscHN3CV9fTENfTUNLX09MRF9QU1cKLQotMjoJLmxvbmcJczM5MF9iYXNlX21jY2tfaGFuZGxlcl9mbgotCi0JLnNlY3Rpb24gLmJzcwotCS5hbGlnbiA0Ci0JLmdsb2JsCXMzOTBfYmFzZV9tY2NrX2hhbmRsZXJfZm4KLXMzOTBfYmFzZV9tY2NrX2hhbmRsZXJfZm46Ci0JLmxvbmcJMAotCS5wcmV2aW91cwotCi1FTlRSWShzMzkwX2Jhc2VfZXh0X2hhbmRsZXIpCi0Jc3RtCSVyMCwlcjE1LF9fTENfU0FWRV9BUkVBX0FTWU5DCi0JYmFzcgklcjEzLDAKLTA6CWFoaQklcjE1LC1TVEFDS19GUkFNRV9PVkVSSEVBRAotCWwJJXIxLDJmLTBiKCVyMTMpCi0JbAklcjEsMCglcjEpCi0JbHRyCSVyMSwlcjEKLQlqegkxZgotCWJhc3IJJXIxNCwlcjEKLTE6CWxtCSVyMCwlcjE1LF9fTENfU0FWRV9BUkVBX0FTWU5DCi0JbmkJX19MQ19FWFRfT0xEX1BTVysxLDB4ZmQJIyBjbGVhciB3YWl0IHN0YXRlIGJpdAotCWxwc3cJX19MQ19FWFRfT0xEX1BTVwotCi0yOgkubG9uZwlzMzkwX2Jhc2VfZXh0X2hhbmRsZXJfZm4KLQotCS5zZWN0aW9uIC5ic3MKLQkuYWxpZ24gNAotCS5nbG9ibAlzMzkwX2Jhc2VfZXh0X2hhbmRsZXJfZm4KLXMzOTBfYmFzZV9leHRfaGFuZGxlcl9mbjoKLQkubG9uZwkwCi0JLnByZXZpb3VzCi0KLUVOVFJZKHMzOTBfYmFzZV9wZ21faGFuZGxlcikKLQlzdG0JJXIwLCVyMTUsX19MQ19TQVZFX0FSRUFfU1lOQwotCWJhc3IJJXIxMywwCi0wOglhaGkJJXIxNSwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQKLQlsCSVyMSwyZi0wYiglcjEzKQotCWwJJXIxLDAoJXIxKQotCWx0cgklcjEsJXIxCi0JanoJMWYKLQliYXNyCSVyMTQsJXIxCi0JbG0JJXIwLCVyMTUsX19MQ19TQVZFX0FSRUFfU1lOQwotCWxwc3cJX19MQ19QR01fT0xEX1BTVwotCi0xOglscHN3CWRpc2FibGVkX3dhaXRfcHN3LTBiKCVyMTMpCi0KLTI6CS5sb25nCXMzOTBfYmFzZV9wZ21faGFuZGxlcl9mbgotCi1kaXNhYmxlZF93YWl0X3BzdzoKLQkuYWxpZ24JOAotCS5sb25nCTB4MDAwYTAwMDAsMHgwMDAwMDAwMCArIHMzOTBfYmFzZV9wZ21faGFuZGxlcgotCi0JLnNlY3Rpb24gLmJzcwotCS5hbGlnbiA0Ci0JLmdsb2JsCXMzOTBfYmFzZV9wZ21faGFuZGxlcl9mbgotczM5MF9iYXNlX3BnbV9oYW5kbGVyX2ZuOgotCS5sb25nCTAKLQkucHJldmlvdXMKLQotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9jYWNoZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9jYWNoZS5jCmluZGV4IDA5NjlkMTEzLi5iZmY1ZTNiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NhY2hlLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jYWNoZS5jCkBAIC03MCw2ICs3MCw4IEBACiAJc3RydWN0IGNhY2hlaW5mbyAqY2FjaGU7CiAJaW50IGlkeDsKIAorCWlmICghdGVzdF9mYWNpbGl0eSgzNCkpCisJCXJldHVybjsKIAlnZXRfb25saW5lX2NwdXMoKTsKIAl0aGlzX2NwdV9jaSA9IGdldF9jcHVfY2FjaGVpbmZvKGNwdW1hc2tfYW55KGNwdV9vbmxpbmVfbWFzaykpOwogCWZvciAoaWR4ID0gMDsgaWR4IDwgdGhpc19jcHVfY2ktPm51bV9sZWF2ZXM7IGlkeCsrKSB7CkBAIC0xNTksNiArMTYxLDggQEAKIAl1bmlvbiBjYWNoZV90b3BvbG9neSBjdDsKIAllbnVtIGNhY2hlX3R5cGUgY3R5cGU7CiAKKwlpZiAoIXRlc3RfZmFjaWxpdHkoMzQpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJY3QucmF3ID0gZWNhZyhFWFRSQUNUX1RPUE9MT0dZLCAwLCAwKTsKIAlmb3IgKGlkeCA9IDAsIGxldmVsID0gMDsgbGV2ZWwgPCB0aGlzX2NwdV9jaS0+bnVtX2xldmVscyAmJgogCSAgICAgaWR4IDwgdGhpc19jcHVfY2ktPm51bV9sZWF2ZXM7IGlkeCsrLCBsZXZlbCsrKSB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCmluZGV4IGJjMWRmMTIuLmZlOGQ2OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCkBAIC0zNzAsMTYgKzM3MCw2IEBACiAJcmV0dXJuICh2b2lkIF9fdXNlciAqKSgoc3AgLSBmcmFtZV9zaXplKSAmIC04dWwpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtYXBfc2lnbmFsKGludCBzaWcpCi17Ci0JaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4KLQkgICAgJiYgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcAotCSAgICAmJiBzaWcgPCAzMikKLQkJcmV0dXJuIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXBbc2lnXTsKLSAgICAgICAgZWxzZQotCQlyZXR1cm4gc2lnOwotfQotCiBzdGF0aWMgaW50IHNldHVwX2ZyYW1lMzIoc3RydWN0IGtzaWduYWwgKmtzaWcsIHNpZ3NldF90ICpzZXQsCiAJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC00NDksNyArNDM5LDcgQEAKIAkJKHJlZ3MtPnBzdy5tYXNrICYgflBTV19NQVNLX0FTQyk7CiAJcmVncy0+cHN3LmFkZHIgPSAoX19mb3JjZSBfX3U2NCkga3NpZy0+a2Euc2Euc2FfaGFuZGxlcjsKIAotCXJlZ3MtPmdwcnNbMl0gPSBtYXBfc2lnbmFsKHNpZyk7CisJcmVncy0+Z3Byc1syXSA9IHNpZzsKIAlyZWdzLT5ncHJzWzNdID0gKF9fZm9yY2UgX191NjQpICZmcmFtZS0+c2M7CiAKIAkvKiBXZSBmb3Jnb3QgdG8gaW5jbHVkZSB0aGVzZSBpbiB0aGUgc2lnY29udGV4dC4KQEAgLTUzMiw3ICs1MjIsNyBAQAogCQkocmVncy0+cHN3Lm1hc2sgJiB+UFNXX01BU0tfQVNDKTsKIAlyZWdzLT5wc3cuYWRkciA9IChfX3U2NCBfX2ZvcmNlKSBrc2lnLT5rYS5zYS5zYV9oYW5kbGVyOwogCi0JcmVncy0+Z3Byc1syXSA9IG1hcF9zaWduYWwoa3NpZy0+c2lnKTsKKwlyZWdzLT5ncHJzWzJdID0ga3NpZy0+c2lnOwogCXJlZ3MtPmdwcnNbM10gPSAoX19mb3JjZSBfX3U2NCkgJmZyYW1lLT5pbmZvOwogCXJlZ3MtPmdwcnNbNF0gPSAoX19mb3JjZSBfX3U2NCkgJmZyYW1lLT51YzsKIAlyZWdzLT5ncHJzWzVdID0gdGFza190aHJlYWRfaW5mbyhjdXJyZW50KS0+bGFzdF9icmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvY3BjbWQuYyBiL2FyY2gvczM5MC9rZXJuZWwvY3BjbWQuYwppbmRleCBkN2IwYzRkLi4xOTllYzkyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2NwY21kLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9jcGNtZC5jCkBAIC0yNywxMyArMjcsOSBAQAogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnMyBhc20gKCIzIikgPSBjbWRsZW47CiAKIAlhc20gdm9sYXRpbGUoCi0jaWZuZGVmIENPTkZJR182NEJJVAotCQkiCWRpYWcJJTEsJTAsMHg4XG4iCi0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KIAkJIglzYW0zMVxuIgogCQkiCWRpYWcJJTEsJTAsMHg4XG4iCiAJCSIJc2FtNjRcbiIKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAkJOiAiK2QiIChyZWczKSA6ICJkIiAocmVnMikgOiAiY2MiKTsKIAlyZXR1cm4gcmVnMzsKIH0KQEAgLTQ2LDE3ICs0MiwxMSBAQAogCXJlZ2lzdGVyIHVuc2lnbmVkIGxvbmcgcmVnNSBhc20gKCI1IikgPSAqcmxlbjsKIAogCWFzbSB2b2xhdGlsZSgKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0JCSIJZGlhZwklMiwlMCwweDhcbiIKLQkJIglicmMJOCwxZlxuIgotCQkiCWFyCSUxLCU0XG4iCi0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KIAkJIglzYW0zMVxuIgogCQkiCWRpYWcJJTIsJTAsMHg4XG4iCiAJCSIJc2FtNjRcbiIKIAkJIglicmMJOCwxZlxuIgogCQkiCWFncgklMSwlNFxuIgotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCQkiMTpcbiIKIAkJOiAiK2QiIChyZWc0KSwgIitkIiAocmVnNSkKIAkJOiAiZCIgKHJlZzIpLCAiZCIgKHJlZzMpLCAiZCIgKCpybGVuKSA6ICJjYyIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9kaWFnLmMgYi9hcmNoL3MzOTAva2VybmVsL2RpYWcuYwppbmRleCA4MjM3ZmMwLi4yZjY5MjQzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2RpYWcuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2RpYWcuYwpAQCAtMTgsMTMgKzE4LDkgQEAKIAlpbnQgcmMgPSAwOwogCiAJYXNtIHZvbGF0aWxlKAotI2lmZGVmIENPTkZJR182NEJJVAogCQkiICAgc2FtMzFcbiIKIAkJIiAgIGRpYWcgICAgJTIsMiwweDE0XG4iCiAJCSIgICBzYW02NFxuIgotI2Vsc2UKLQkJIiAgIGRpYWcgICAgJTIsMiwweDE0XG4iCi0jZW5kaWYKIAkJIiAgIGlwbSAgICAgJTBcbiIKIAkJIiAgIHNybCAgICAgJTAsMjhcbiIKIAkJOiAiPWQiIChyYyksICIrZCIgKF9yeTIpCkBAIC01Miw3ICs0OCw2IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRpYWcyMTBfbG9jaywgZmxhZ3MpOwogCWRpYWcyMTBfdG1wID0gKmFkZHI7CiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlhc20gdm9sYXRpbGUoCiAJCSIJbGhpCSUwLC0xXG4iCiAJCSIJc2FtMzFcbiIKQEAgLTYyLDE2ICs1Nyw2IEBACiAJCSIxOglzYW02NFxuIgogCQlFWF9UQUJMRSgwYiwgMWIpCiAJCTogIj0mZCIgKGNjb2RlKSA6ICJhIiAoJmRpYWcyMTBfdG1wKSA6ICJjYyIsICJtZW1vcnkiKTsKLSNlbHNlCi0JYXNtIHZvbGF0aWxlKAotCQkiCWxoaQklMCwtMVxuIgotCQkiCWRpYWcJJTEsMCwweDIxMFxuIgotCQkiMDoJaXBtCSUwXG4iCi0JCSIJc3JsCSUwLDI4XG4iCi0JCSIxOlxuIgotCQlFWF9UQUJMRSgwYiwgMWIpCi0JCTogIj0mZCIgKGNjb2RlKSA6ICJhIiAoJmRpYWcyMTBfdG1wKSA6ICJjYyIsICJtZW1vcnkiKTsKLSNlbmRpZgogCiAJKmFkZHIgPSBkaWFnMjEwX3RtcDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaWFnMjEwX2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZGlzLmMgYi9hcmNoL3MzOTAva2VybmVsL2Rpcy5jCmluZGV4IDUzMzQzMDMuLjgxNDBkMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZGlzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9kaXMuYwpAQCAtMzIsMTIgKzMyLDYgQEAKICNpbmNsdWRlIDxhc20vZGVidWcuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0jZGVmaW5lIE9ORUxPTkcgIiUwOGx4OiAiCi0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KLSNkZWZpbmUgT05FTE9ORyAiJTAxNmx4OiAiCi0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCi0KIGVudW0gewogCVVOVVNFRCwJLyogSW5kaWNhdGVzIHRoZSBlbmQgb2YgdGhlIG9wZXJhbmQgbGlzdCAqLwogCVJfOCwJLyogR1BSIHN0YXJ0aW5nIGF0IHBvc2l0aW9uIDggKi8KQEAgLTUzNiwxMiArNTMwLDEwIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHMzOTBfaW5zbiBvcGNvZGVbXSA9IHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl7ICJicHJwIiwgMHhjNSwgSU5TVFJfTUlJX1VQSSB9LAogCXsgImJwcCIsIDB4YzcsIElOU1RSX1NNSV9VMFJEUCB9LAogCXsgInRydHIiLCAweGQwLCBJTlNUUl9TU19MMFJEUkQgfSwKIAl7ICJsbWQiLCAweGVmLCBJTlNUUl9TU19SUlJEUkQzIH0sCi0jZW5kaWYKIAl7ICJzcG0iLCAweDA0LCBJTlNUUl9SUl9SMCB9LAogCXsgImJhbHIiLCAweDA1LCBJTlNUUl9SUl9SUiB9LAogCXsgImJjdHIiLCAweDA2LCBJTlNUUl9SUl9SUiB9LApAQCAtNzI1LDExICs3MTcsOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzMzkwX2luc24gb3Bjb2RlXzAxW10gPSB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJeyAicHRmZiIsIDB4MDQsIElOU1RSX0UgfSwKIAl7ICJwZnBvIiwgMHgwYSwgSU5TVFJfRSB9LAogCXsgInNhbTY0IiwgMHgwZSwgSU5TVFJfRSB9LAotI2VuZGlmCiAJeyAicHIiLCAweDAxLCBJTlNUUl9FIH0sCiAJeyAidXB0IiwgMHgwMiwgSU5TVFJfRSB9LAogCXsgInNja3BmIiwgMHgwNywgSU5TVFJfRSB9LApAQCAtNzQxLDcgKzczMSw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHMzOTBfaW5zbiBvcGNvZGVfYTVbXSA9IHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl7ICJpaWhoIiwgMHgwMCwgSU5TVFJfUklfUlUgfSwKIAl7ICJpaWhsIiwgMHgwMSwgSU5TVFJfUklfUlUgfSwKIAl7ICJpaWxoIiwgMHgwMiwgSU5TVFJfUklfUlUgfSwKQEAgLTc1OCwxMiArNzQ3LDEwIEBACiAJeyAibGxpaGwiLCAweDBkLCBJTlNUUl9SSV9SVSB9LAogCXsgImxsaWxoIiwgMHgwZSwgSU5TVFJfUklfUlUgfSwKIAl7ICJsbGlsbCIsIDB4MGYsIElOU1RSX1JJX1JVIH0sCi0jZW5kaWYKIAl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczM5MF9pbnNuIG9wY29kZV9hN1tdID0gewotI2lmZGVmIENPTkZJR182NEJJVAogCXsgInRtaGgiLCAweDAyLCBJTlNUUl9SSV9SVSB9LAogCXsgInRtaGwiLCAweDAzLCBJTlNUUl9SSV9SVSB9LAogCXsgImJyY3RnIiwgMHgwNywgSU5TVFJfUklfUlAgfSwKQEAgLTc3MSw3ICs3NTgsNiBAQAogCXsgImFnaGkiLCAweDBiLCBJTlNUUl9SSV9SSSB9LAogCXsgIm1naGkiLCAweDBkLCBJTlNUUl9SSV9SSSB9LAogCXsgImNnaGkiLCAweDBmLCBJTlNUUl9SSV9SSSB9LAotI2VuZGlmCiAJeyAidG1saCIsIDB4MDAsIElOU1RSX1JJX1JVIH0sCiAJeyAidG1sbCIsIDB4MDEsIElOU1RSX1JJX1JVIH0sCiAJeyAiYnJjIiwgMHgwNCwgSU5TVFJfUklfVVAgfSwKQEAgLTc4NSwxOCArNzcxLDE1IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHMzOTBfaW5zbiBvcGNvZGVfYWFbXSA9IHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl7IHsgMCwgTE9OR19JTlNOX1JJTkVYVCB9LCAweDAwLCBJTlNUUl9SSV9SSSB9LAogCXsgInJpb24iLCAweDAxLCBJTlNUUl9SSV9SSSB9LAogCXsgInRyaWMiLCAweDAyLCBJTlNUUl9SSV9SSSB9LAogCXsgInJpb2ZmIiwgMHgwMywgSU5TVFJfUklfUkkgfSwKIAl7IHsgMCwgTE9OR19JTlNOX1JJRU1JVCB9LCAweDA0LCBJTlNUUl9SSV9SSSB9LAotI2VuZGlmCiAJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9CiB9OwogCiBzdGF0aWMgc3RydWN0IHMzOTBfaW5zbiBvcGNvZGVfYjJbXSA9IHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl7ICJzdGNrZiIsIDB4N2MsIElOU1RSX1NfUkQgfSwKIAl7ICJscHAiLCAweDgwLCBJTlNUUl9TX1JEIH0sCiAJeyAibGNjdGwiLCAweDg0LCBJTlNUUl9TX1JEIH0sCkBAIC04MTksNyArODAyLDYgQEAKIAl7ICJ0ZW5kIiwgMHhmOCwgSU5TVFJfU18wMCB9LAogCXsgIm5pYWkiLCAweGZhLCBJTlNUUl9JRV9VVSB9LAogCXsgeyAwLCBMT05HX0lOU05fVEFCT1JUIH0sIDB4ZmMsIElOU1RSX1NfUkQgfSwKLSNlbmRpZgogCXsgInN0aWRwIiwgMHgwMiwgSU5TVFJfU19SRCB9LAogCXsgInNjayIsIDB4MDQsIElOU1RSX1NfUkQgfSwKIAl7ICJzdGNrIiwgMHgwNSwgSU5TVFJfU19SRCB9LApAQCAtOTA4LDcgKzg5MCw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHMzOTBfaW5zbiBvcGNvZGVfYjNbXSA9IHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl7ICJtYXlsciIsIDB4MzgsIElOU1RSX1JSRl9GMEZGIH0sCiAJeyAibXlsciIsIDB4MzksIElOU1RSX1JSRl9GMEZGIH0sCiAJeyAibWF5ciIsIDB4M2EsIElOU1RSX1JSRl9GMEZGIH0sCkBAIC05OTYsNyArOTc3LDYgQEAKIAl7ICJxYXh0ciIsIDB4ZmQsIElOU1RSX1JSRl9GVUZGIH0sCiAJeyAiaWV4dHIiLCAweGZlLCBJTlNUUl9SUkZfRjBGUiB9LAogCXsgInJyeHRyIiwgMHhmZiwgSU5TVFJfUlJGX0ZGUlUgfSwKLSNlbmRpZgogCXsgImxwZWJyIiwgMHgwMCwgSU5TVFJfUlJFX0ZGIH0sCiAJeyAibG5lYnIiLCAweDAxLCBJTlNUUl9SUkVfRkYgfSwKIAl7ICJsdGViciIsIDB4MDIsIElOU1RSX1JSRV9GRiB9LApAQCAtMTA5MSw3ICsxMDcxLDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczM5MF9pbnNuIG9wY29kZV9iOVtdID0gewotI2lmZGVmIENPTkZJR182NEJJVAogCXsgImxwZ3IiLCAweDAwLCBJTlNUUl9SUkVfUlIgfSwKIAl7ICJsbmdyIiwgMHgwMSwgSU5TVFJfUlJFX1JSIH0sCiAJeyAibHRnciIsIDB4MDIsIElOU1RSX1JSRV9SUiB9LApAQCAtMTIwNCw3ICsxMTgzLDYgQEAKIAl7ICJzcmsiLCAweGY5LCBJTlNUUl9SUkZfUjBSUjIgfSwKIAl7ICJhbHJrIiwgMHhmYSwgSU5TVFJfUlJGX1IwUlIyIH0sCiAJeyAic2xyayIsIDB4ZmIsIElOU1RSX1JSRl9SMFJSMiB9LAotI2VuZGlmCiAJeyAia21hYyIsIDB4MWUsIElOU1RSX1JSRV9SUiB9LAogCXsgImxydnIiLCAweDFmLCBJTlNUUl9SUkVfUlIgfSwKIAl7ICJrbSIsIDB4MmUsIElOU1RSX1JSRV9SUiB9LApAQCAtMTIyNCw3ICsxMjAyLDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczM5MF9pbnNuIG9wY29kZV9jMFtdID0gewotI2lmZGVmIENPTkZJR182NEJJVAogCXsgImxnZmkiLCAweDAxLCBJTlNUUl9SSUxfUkkgfSwKIAl7ICJ4aWhmIiwgMHgwNiwgSU5TVFJfUklMX1JVIH0sCiAJeyAieGlsZiIsIDB4MDcsIElOU1RSX1JJTF9SVSB9LApAQCAtMTIzNiw3ICsxMjEzLDYgQEAKIAl7ICJvaWxmIiwgMHgwZCwgSU5TVFJfUklMX1JVIH0sCiAJeyAibGxpaGYiLCAweDBlLCBJTlNUUl9SSUxfUlUgfSwKIAl7ICJsbGlsZiIsIDB4MGYsIElOU1RSX1JJTF9SVSB9LAotI2VuZGlmCiAJeyAibGFybCIsIDB4MDAsIElOU1RSX1JJTF9SUCB9LAogCXsgImJyY2wiLCAweDA0LCBJTlNUUl9SSUxfVVAgfSwKIAl7ICJicmFzbCIsIDB4MDUsIElOU1RSX1JJTF9SUCB9LApAQCAtMTI0NCw3ICsxMjIwLDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczM5MF9pbnNuIG9wY29kZV9jMltdID0gewotI2lmZGVmIENPTkZJR182NEJJVAogCXsgIm1zZ2ZpIiwgMHgwMCwgSU5TVFJfUklMX1JJIH0sCiAJeyAibXNmaSIsIDB4MDEsIElOU1RSX1JJTF9SSSB9LAogCXsgInNsZ2ZpIiwgMHgwNCwgSU5TVFJfUklMX1JVIH0sCkBAIC0xMjU3LDEyICsxMjMyLDEwIEBACiAJeyAiY2ZpIiwgMHgwZCwgSU5TVFJfUklMX1JJIH0sCiAJeyAiY2xnZmkiLCAweDBlLCBJTlNUUl9SSUxfUlUgfSwKIAl7ICJjbGZpIiwgMHgwZiwgSU5TVFJfUklMX1JVIH0sCi0jZW5kaWYKIAl7ICIiLCAwLCBJTlNUUl9JTlZBTElEIH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczM5MF9pbnNuIG9wY29kZV9jNFtdID0gewotI2lmZGVmIENPTkZJR182NEJJVAogCXsgImxsaHJsIiwgMHgwMiwgSU5TVFJfUklMX1JQIH0sCiAJeyAibGdocmwiLCAweDA0LCBJTlNUUl9SSUxfUlAgfSwKIAl7ICJsaHJsIiwgMHgwNSwgSU5TVFJfUklMX1JQIH0sCkBAIC0xMjc0LDEyICsxMjQ3LDEwIEBACiAJeyAibHJsIiwgMHgwZCwgSU5TVFJfUklMX1JQIH0sCiAJeyB7IDAsIExPTkdfSU5TTl9MTEdGUkwgfSwgMHgwZSwgSU5TVFJfUklMX1JQIH0sCiAJeyAic3RybCIsIDB4MGYsIElOU1RSX1JJTF9SUCB9LAotI2VuZGlmCiAJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9CiB9OwogCiBzdGF0aWMgc3RydWN0IHMzOTBfaW5zbiBvcGNvZGVfYzZbXSA9IHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl7ICJleHJsIiwgMHgwMCwgSU5TVFJfUklMX1JQIH0sCiAJeyAicGZkcmwiLCAweDAyLCBJTlNUUl9SSUxfVVAgfSwKIAl7ICJjZ2hybCIsIDB4MDQsIElOU1RSX1JJTF9SUCB9LApAQCAtMTI5MiwzNSArMTI2MywyOSBAQAogCXsgImNybCIsIDB4MGQsIElOU1RSX1JJTF9SUCB9LAogCXsgeyAwLCBMT05HX0lOU05fQ0xHRlJMIH0sIDB4MGUsIElOU1RSX1JJTF9SUCB9LAogCXsgImNscmwiLCAweDBmLCBJTlNUUl9SSUxfUlAgfSwKLSNlbmRpZgogCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQogfTsKIAogc3RhdGljIHN0cnVjdCBzMzkwX2luc24gb3Bjb2RlX2M4W10gPSB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJeyAibXZjb3MiLCAweDAwLCBJTlNUUl9TU0ZfUlJEUkQgfSwKIAl7ICJlY3RnIiwgMHgwMSwgSU5TVFJfU1NGX1JSRFJEIH0sCiAJeyAiY3NzdCIsIDB4MDIsIElOU1RSX1NTRl9SUkRSRCB9LAogCXsgImxwZCIsIDB4MDQsIElOU1RSX1NTRl9SUkRSRDIgfSwKIAl7ICJscGRnIiwgMHgwNSwgSU5TVFJfU1NGX1JSRFJEMiB9LAotI2VuZGlmCiAJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9CiB9OwogCiBzdGF0aWMgc3RydWN0IHMzOTBfaW5zbiBvcGNvZGVfY2NbXSA9IHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl7ICJicmN0aCIsIDB4MDYsIElOU1RSX1JJTF9SUCB9LAogCXsgImFpaCIsIDB4MDgsIElOU1RSX1JJTF9SSSB9LAogCXsgImFsc2loIiwgMHgwYSwgSU5TVFJfUklMX1JJIH0sCiAJeyB7IDAsIExPTkdfSU5TTl9BTFNJSE4gfSwgMHgwYiwgSU5TVFJfUklMX1JJIH0sCiAJeyAiY2loIiwgMHgwZCwgSU5TVFJfUklMX1JJIH0sCiAJeyAiY2xpaCIsIDB4MGYsIElOU1RSX1JJTF9SSSB9LAotI2VuZGlmCiAJeyAiIiwgMCwgSU5TVFJfSU5WQUxJRCB9CiB9OwogCiBzdGF0aWMgc3RydWN0IHMzOTBfaW5zbiBvcGNvZGVfZTNbXSA9IHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl7ICJsdGciLCAweDAyLCBJTlNUUl9SWFlfUlJSRCB9LAogCXsgImxyYWciLCAweDAzLCBJTlNUUl9SWFlfUlJSRCB9LAogCXsgImxnIiwgMHgwNCwgSU5TVFJfUlhZX1JSUkQgfSwKQEAgLTE0MTQsNyArMTM3OSw2IEBACiAJeyAiY2xoZiIsIDB4Y2YsIElOU1RSX1JYWV9SUlJEIH0sCiAJeyB7IDAsIExPTkdfSU5TTl9NUENJRkMgfSwgMHhkMCwgSU5TVFJfUlhZX1JSUkQgfSwKIAl7IHsgMCwgTE9OR19JTlNOX1NUUENJRkMgfSwgMHhkNCwgSU5TVFJfUlhZX1JSUkQgfSwKLSNlbmRpZgogCXsgImxydiIsIDB4MWUsIElOU1RSX1JYWV9SUlJEIH0sCiAJeyAibHJ2aCIsIDB4MWYsIElOU1RSX1JYWV9SUlJEIH0sCiAJeyAic3RydiIsIDB4M2UsIElOU1RSX1JYWV9SUlJEIH0sCkBAIC0xNDI2LDcgKzEzOTAsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzMzkwX2luc24gb3Bjb2RlX2U1W10gPSB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJeyAic3RyYWciLCAweDAyLCBJTlNUUl9TU0VfUkRSRCB9LAogCXsgIm12aGhpIiwgMHg0NCwgSU5TVFJfU0lMX1JESSB9LAogCXsgIm12Z2hpIiwgMHg0OCwgSU5TVFJfU0lMX1JESSB9LApAQCAtMTQzOSw3ICsxNDAyLDYgQEAKIAl7IHsgMCwgTE9OR19JTlNOX0NMRkhTSSB9LCAweDVkLCBJTlNUUl9TSUxfUkRVIH0sCiAJeyB7IDAsIExPTkdfSU5TTl9UQkVHSU4gfSwgMHg2MCwgSU5TVFJfU0lMX1JEVSB9LAogCXsgeyAwLCBMT05HX0lOU05fVEJFR0lOQyB9LCAweDYxLCBJTlNUUl9TSUxfUkRVIH0sCi0jZW5kaWYKIAl7ICJsYXNwIiwgMHgwMCwgSU5TVFJfU1NFX1JEUkQgfSwKIAl7ICJ0cHJvdCIsIDB4MDEsIElOU1RSX1NTRV9SRFJEIH0sCiAJeyAibXZjc2siLCAweDBlLCBJTlNUUl9TU0VfUkRSRCB9LApAQCAtMTQ0OCw3ICsxNDEwLDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgczM5MF9pbnNuIG9wY29kZV9lN1tdID0gewotI2lmZGVmIENPTkZJR182NEJJVAogCXsgImxjYmIiLCAweDI3LCBJTlNUUl9SWEVfUlJSRE0gfSwKIAl7ICJ2Z2VmIiwgMHgxMywgSU5TVFJfVlJWX1ZWUkRNIH0sCiAJeyAidmdlZyIsIDB4MTIsIElOU1RSX1ZSVl9WVlJETSB9LApAQCAtMTU4OCwxMSArMTU0OSw5IEBACiAJeyAidmZzcSIsIDB4Y2UsIElOU1RSX1ZSUl9WVjAwME1NIH0sCiAJeyAidmZzIiwgMHhlMiwgSU5TVFJfVlJSX1ZWVjAwTU0gfSwKIAl7ICJ2ZnRjaSIsIDB4NGEsIElOU1RSX1ZSSV9WVklNTSB9LAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IHMzOTBfaW5zbiBvcGNvZGVfZWJbXSA9IHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl7ICJsbWciLCAweDA0LCBJTlNUUl9SU1lfUlJSRCB9LAogCXsgInNyYWciLCAweDBhLCBJTlNUUl9SU1lfUlJSRCB9LAogCXsgInNsYWciLCAweDBiLCBJTlNUUl9SU1lfUlJSRCB9LApAQCAtMTY1OSw3ICsxNjE4LDYgQEAKIAl7ICJzdHJpYyIsIDB4NjEsIElOU1RSX1JTWV9SRFJNIH0sCiAJeyAibXJpYyIsIDB4NjIsIElOU1RSX1JTWV9SRFJNIH0sCiAJeyB7IDAsIExPTkdfSU5TTl9TVENDVE0gfSwgMHgxNywgSU5TVFJfUlNZX1JNUkQgfSwKLSNlbmRpZgogCXsgInJsbCIsIDB4MWQsIElOU1RSX1JTWV9SUlJEIH0sCiAJeyAibXZjbHUiLCAweDhlLCBJTlNUUl9SU1lfUlJSRCB9LAogCXsgInRwIiwgMHhjMCwgSU5TVFJfUlNMX1IwUkQgfSwKQEAgLTE2NjcsNyArMTYyNSw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHMzOTBfaW5zbiBvcGNvZGVfZWNbXSA9IHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl7ICJicnhoZyIsIDB4NDQsIElOU1RSX1JJRV9SUlAgfSwKIAl7ICJicnhsZyIsIDB4NDUsIElOU1RSX1JJRV9SUlAgfSwKIAl7IHsgMCwgTE9OR19JTlNOX1JJU0JMRyB9LCAweDUxLCBJTlNUUl9SSUVfUlJVVVUgfSwKQEAgLTE3MDEsMTIgKzE2NTgsMTAgQEAKIAl7ICJjbGdpYiIsIDB4ZmQsIElOU1RSX1JJU19SVVJEVSB9LAogCXsgImNpYiIsIDB4ZmUsIElOU1RSX1JJU19SVVJESSB9LAogCXsgImNsaWIiLCAweGZmLCBJTlNUUl9SSVNfUlVSRFUgfSwKLSNlbmRpZgogCXsgIiIsIDAsIElOU1RSX0lOVkFMSUQgfQogfTsKIAogc3RhdGljIHN0cnVjdCBzMzkwX2luc24gb3Bjb2RlX2VkW10gPSB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJeyAibWF5bCIsIDB4MzgsIElOU1RSX1JYRl9GUlJERiB9LAogCXsgIm15bCIsIDB4MzksIElOU1RSX1JYRl9GUlJERiB9LAogCXsgIm1heSIsIDB4M2EsIElOU1RSX1JYRl9GUlJERiB9LApAQCAtMTczMSw3ICsxNjg2LDYgQEAKIAl7ICJjenh0IiwgMHhhOSwgSU5TVFJfUlNMX0xSREZVIH0sCiAJeyAiY2R6dCIsIDB4YWEsIElOU1RSX1JTTF9MUkRGVSB9LAogCXsgImN4enQiLCAweGFiLCBJTlNUUl9SU0xfTFJERlUgfSwKLSNlbmRpZgogCXsgImxkZWIiLCAweDA0LCBJTlNUUl9SWEVfRlJSRCB9LAogCXsgImx4ZGIiLCAweDA1LCBJTlNUUl9SWEVfRlJSRCB9LAogCXsgImx4ZWIiLCAweDA2LCBJTlNUUl9SWEVfRlJSRCB9LApAQCAtMjA1MSw3ICsyMDA1LDcgQEAKIAkJZWxzZQogCQkJKnB0cisrID0gJyAnOwogCQlhZGRyID0gcmVncy0+cHN3LmFkZHIgKyBzdGFydCAtIDMyOwotCQlwdHIgKz0gc3ByaW50ZihwdHIsIE9ORUxPTkcsIGFkZHIpOworCQlwdHIgKz0gc3ByaW50ZihwdHIsICIlMDE2bHg6ICIsIGFkZHIpOwogCQlpZiAoc3RhcnQgKyBvcHNpemUgPj0gZW5kKQogCQkJYnJlYWs7CiAJCWZvciAoaSA9IDA7IGkgPCBvcHNpemU7IGkrKykKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZHVtcHN0YWNrLmMgYi9hcmNoL3MzOTAva2VybmVsL2R1bXBzdGFjay5jCmluZGV4IGE5OTg1MmUuLmRjOGUyMDQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZHVtcHN0YWNrLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9kdW1wc3RhY2suYwpAQCAtMTgsMTYgKzE4LDYgQEAKICNpbmNsdWRlIDxhc20vZGlzLmg+CiAjaW5jbHVkZSA8YXNtL2lwbC5oPgogCi0jaWZuZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBMT05HICIlMDhseCAiCi0jZGVmaW5lIEZPVVJMT05HICIlMDhseCAlMDhseCAlMDhseCAlMDhseFxuIgotc3RhdGljIGludCBrc3RhY2tfZGVwdGhfdG9fcHJpbnQgPSAxMjsKLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwotI2RlZmluZSBMT05HICIlMDE2bHggIgotI2RlZmluZSBGT1VSTE9ORyAiJTAxNmx4ICUwMTZseCAlMDE2bHggJTAxNmx4XG4iCi1zdGF0aWMgaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDIwOwotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwotCiAvKgogICogRm9yIHNob3dfdHJhY2Ugd2UgaGF2ZSB0cmVlIGRpZmZlcmVudCBzdGFjayB0byBjb25zaWRlcjoKICAqICAgLSB0aGUgcGFuaWMgc3RhY2sgd2hpY2ggaXMgdXNlZCBpZiB0aGUga2VybmVsIHN0YWNrIGhhcyBvdmVyZmxvd24KQEAgLTExNSwxMiArMTA1LDEyIEBACiAJZWxzZQogCQlzdGFjayA9IHNwOwogCi0JZm9yIChpID0gMDsgaSA8IGtzdGFja19kZXB0aF90b19wcmludDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDIwOyBpKyspIHsKIAkJaWYgKCgoYWRkcl90KSBzdGFjayAmIChUSFJFQURfU0laRS0xKSkgPT0gMCkKIAkJCWJyZWFrOwogCQlpZiAoKGkgKiBzaXplb2YobG9uZykgJSAzMikgPT0gMCkKIAkJCXByaW50aygiJXMgICAgICAgIiwgaSA9PSAwID8gIiIgOiAiXG4iKTsKLQkJcHJpbnRrKExPTkcsICpzdGFjaysrKTsKKwkJcHJpbnRrKCIlMDE2bHggIiwgKnN0YWNrKyspOwogCX0KIAlwcmludGsoIlxuIik7CiAJc2hvd190cmFjZSh0YXNrLCBzcCk7CkBAIC0xMjgsMTAgKzExOCw4IEBACiAKIHN0YXRpYyB2b2lkIHNob3dfbGFzdF9icmVha2luZ19ldmVudChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlwcmludGsoIkxhc3QgQnJlYWtpbmctRXZlbnQtQWRkcmVzczpcbiIpOwogCXByaW50aygiIFs8JTAxNmx4Pl0gJXBTUlxuIiwgcmVncy0+YXJnc1swXSwgKHZvaWQgKilyZWdzLT5hcmdzWzBdKTsKLSNlbmRpZgogfQogCiBzdGF0aWMgaW5saW5lIGludCBtYXNrX2JpdHMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYml0cykKQEAgLTE1NSwxNiArMTQzLDE0IEBACiAJICAgICAgIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19NQ0hFQ0spLCBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfV0FJVCksCiAJICAgICAgIG1hc2tfYml0cyhyZWdzLCBQU1dfTUFTS19QU1RBVEUpLCBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfQVNDKSwKIAkgICAgICAgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX0NDKSwgbWFza19iaXRzKHJlZ3MsIFBTV19NQVNLX1BNKSk7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJcHJpbnRrKCIgRUE6JXgiLCBtYXNrX2JpdHMocmVncywgUFNXX01BU0tfRUEgfCBQU1dfTUFTS19CQSkpOwotI2VuZGlmCi0JcHJpbnRrKCJcbiVzIEdQUlM6ICIgRk9VUkxPTkcsIG1vZGUsCisJcHJpbnRrKCJcbiVzIEdQUlM6ICUwMTZseCAlMDE2bHggJTAxNmx4ICUwMTZseFxuIiwgbW9kZSwKIAkgICAgICAgcmVncy0+Z3Byc1swXSwgcmVncy0+Z3Byc1sxXSwgcmVncy0+Z3Byc1syXSwgcmVncy0+Z3Byc1szXSk7Ci0JcHJpbnRrKCIgICAgICAgICAgICIgRk9VUkxPTkcsCisJcHJpbnRrKCIgICAgICAgICAgICUwMTZseCAlMDE2bHggJTAxNmx4ICUwMTZseFxuIiwKIAkgICAgICAgcmVncy0+Z3Byc1s0XSwgcmVncy0+Z3Byc1s1XSwgcmVncy0+Z3Byc1s2XSwgcmVncy0+Z3Byc1s3XSk7Ci0JcHJpbnRrKCIgICAgICAgICAgICIgRk9VUkxPTkcsCisJcHJpbnRrKCIgICAgICAgICAgICUwMTZseCAlMDE2bHggJTAxNmx4ICUwMTZseFxuIiwKIAkgICAgICAgcmVncy0+Z3Byc1s4XSwgcmVncy0+Z3Byc1s5XSwgcmVncy0+Z3Byc1sxMF0sIHJlZ3MtPmdwcnNbMTFdKTsKLQlwcmludGsoIiAgICAgICAgICAgIiBGT1VSTE9ORywKKwlwcmludGsoIiAgICAgICAgICAgJTAxNmx4ICUwMTZseCAlMDE2bHggJTAxNmx4XG4iLAogCSAgICAgICByZWdzLT5ncHJzWzEyXSwgcmVncy0+Z3Byc1sxM10sIHJlZ3MtPmdwcnNbMTRdLCByZWdzLT5ncHJzWzE1XSk7CiAJc2hvd19jb2RlKHJlZ3MpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9lYXJseS5jCmluZGV4IDQ0MjdhYjcuLjU0OWE3M2EgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZWFybHkuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2Vhcmx5LmMKQEAgLTY0LDcgKzY0LDYgQEAKIAkiCS5hbGlnbgk0XG4iCiAJIgkudHlwZQlzYXZlc3lzX2lwbF9uc3MsIEBmdW5jdGlvblxuIgogCSJzYXZlc3lzX2lwbF9uc3M6XG4iCi0jaWZkZWYgQ09ORklHXzY0QklUCiAJIglzdG1nCTYsMTUsNDgoMTUpXG4iCiAJIglsZ3IJMTQsM1xuIgogCSIJc2FtMzFcbiIKQEAgLTcyLDEzICs3MSw2IEBACiAJIglzYW02NFxuIgogCSIJbGdyCTIsMTRcbiIKIAkiCWxtZwk2LDE1LDQ4KDE1KVxuIgotI2Vsc2UKLQkiCXN0bQk2LDE1LDI0KDE1KVxuIgotCSIJbHIJMTQsM1xuIgotCSIJZGlhZwkyLDE0LDB4OFxuIgotCSIJbHIJMiwxNFxuIgotCSIJbG0JNiwxNSwyNCgxNSlcbiIKLSNlbmRpZgogCSIJYnIJMTRcbiIKIAkiCS5zaXplCXNhdmVzeXNfaXBsX25zcywgLi1zYXZlc3lzX2lwbF9uc3NcbiIKIAkiCS5wcmV2aW91c1xuIik7CkBAIC0yNDAsNyArMjMyLDYgQEAKIAogc3RhdGljIF9faW5pdCB2b2lkIHNldHVwX3RvcG9sb2d5KHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJaW50IG1heF9tbmVzdDsKIAogCWlmICghdGVzdF9mYWNpbGl0eSgxMSkpCkBAIC0yNTEsNyArMjQyLDYgQEAKIAkJCWJyZWFrOwogCX0KIAl0b3BvbG9neV9tYXhfbW5lc3QgPSBtYXhfbW5lc3Q7Ci0jZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgZWFybHlfcGdtX2NoZWNrX2hhbmRsZXIodm9pZCkKQEAgLTI5MCw1OCArMjgwLDYgQEAKIAkgICAgICBBUlJBWV9TSVpFKFMzOTBfbG93Y29yZS5zdGZsZV9mYWNfbGlzdCkpOwogfQogCi1zdGF0aWMgX19pbml0IHZvaWQgZGV0ZWN0X212cGcodm9pZCkKLXsKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0JaW50IHJjOwotCi0JYXNtIHZvbGF0aWxlKAotCQkiCWxhCTAsMFxuIgotCQkiCW12cGcJJTIsJTJcbiIKLQkJIjA6CWxhCSUwLDBcbiIKLQkJIjE6XG4iCi0JCUVYX1RBQkxFKDBiLDFiKQotCQk6ICI9ZCIgKHJjKSA6ICIwIiAoLUVPUE5PVFNVUFApLCAiYSIgKDApIDogIm1lbW9yeSIsICJjYyIsICIwIik7Ci0JaWYgKCFyYykKLQkJUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgfD0gTUFDSElORV9GTEFHX01WUEc7Ci0jZW5kaWYKLX0KLQotc3RhdGljIF9faW5pdCB2b2lkIGRldGVjdF9pZWVlKHZvaWQpCi17Ci0jaWZuZGVmIENPTkZJR182NEJJVAotCWludCByYywgdG1wOwotCi0JYXNtIHZvbGF0aWxlKAotCQkiCWVmcGMJJTEsMFxuIgotCQkiMDoJbGEJJTAsMFxuIgotCQkiMTpcbiIKLQkJRVhfVEFCTEUoMGIsMWIpCi0JCTogIj1kIiAocmMpLCAiPWQiICh0bXApOiAiMCIgKC1FT1BOT1RTVVBQKSA6ICJjYyIpOwotCWlmICghcmMpCi0JCVMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzIHw9IE1BQ0hJTkVfRkxBR19JRUVFOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBfX2luaXQgdm9pZCBkZXRlY3RfY3NwKHZvaWQpCi17Ci0jaWZuZGVmIENPTkZJR182NEJJVAotCWludCByYzsKLQotCWFzbSB2b2xhdGlsZSgKLQkJIglsYQkwLDBcbiIKLQkJIglsYQkxLDBcbiIKLQkJIglsYQkyLDRcbiIKLQkJIgljc3AJMCwyXG4iCi0JCSIwOglsYQklMCwwXG4iCi0JCSIxOlxuIgotCQlFWF9UQUJMRSgwYiwxYikKLQkJOiAiPWQiIChyYykgOiAiMCIgKC1FT1BOT1RTVVBQKSA6ICJjYyIsICIwIiwgIjEiLCAiMiIpOwotCWlmICghcmMpCi0JCVMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzIHw9IE1BQ0hJTkVfRkxBR19DU1A7Ci0jZW5kaWYKLX0KLQogc3RhdGljIF9faW5pdCB2b2lkIGRldGVjdF9kaWFnOWModm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1X2FkZHJlc3M7CkBAIC0zNjAsNyArMjk4LDYgQEAKIAogc3RhdGljIF9faW5pdCB2b2lkIGRldGVjdF9kaWFnNDQodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlpbnQgcmM7CiAKIAlhc20gdm9sYXRpbGUoCkBAIC0zNzEsMTIgKzMwOCwxMCBAQAogCQk6ICI9ZCIgKHJjKSA6ICIwIiAoLUVPUE5PVFNVUFApIDogImNjIik7CiAJaWYgKCFyYykKIAkJUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgfD0gTUFDSElORV9GTEFHX0RJQUc0NDsKLSNlbmRpZgogfQogCiBzdGF0aWMgX19pbml0IHZvaWQgZGV0ZWN0X21hY2hpbmVfZmFjaWxpdGllcyh2b2lkKQogewotI2lmZGVmIENPTkZJR182NEJJVAogCWlmICh0ZXN0X2ZhY2lsaXR5KDgpKSB7CiAJCVMzOTBfbG93Y29yZS5tYWNoaW5lX2ZsYWdzIHw9IE1BQ0hJTkVfRkxBR19FREFUMTsKIAkJX19jdGxfc2V0X2JpdCgwLCAyMyk7CkBAIC0zOTMsNyArMzI4LDYgQEAKIAkJUzM5MF9sb3djb3JlLm1hY2hpbmVfZmxhZ3MgfD0gTUFDSElORV9GTEFHX1RMQl9MQzsKIAlpZiAodGVzdF9mYWNpbGl0eSgxMjkpKQogCQlTMzkwX2xvd2NvcmUubWFjaGluZV9mbGFncyB8PSBNQUNISU5FX0ZMQUdfVlg7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGludCBfX2luaXQgY2FkX3NldHVwKGNoYXIgKnN0cikKQEAgLTUwMSw5ICs0MzUsNiBAQAogCWlwbF91cGRhdGVfcGFyYW1ldGVycygpOwogCXNldHVwX2Jvb3RfY29tbWFuZF9saW5lKCk7CiAJY3JlYXRlX2tlcm5lbF9uc3MoKTsKLQlkZXRlY3RfbXZwZygpOwotCWRldGVjdF9pZWVlKCk7Ci0JZGV0ZWN0X2NzcCgpOwogCWRldGVjdF9kaWFnOWMoKTsKIAlkZXRlY3RfZGlhZzQ0KCk7CiAJZGV0ZWN0X21hY2hpbmVfZmFjaWxpdGllcygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCmluZGV4IDM5ODMyOWIuLjk5YjQ0YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKQEAgLTIyLDI3ICsyMiwyOCBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAogX19QVF9SMCAgICAgID0JX19QVF9HUFJTCi1fX1BUX1IxICAgICAgPQlfX1BUX0dQUlMgKyA0Ci1fX1BUX1IyICAgICAgPQlfX1BUX0dQUlMgKyA4Ci1fX1BUX1IzICAgICAgPQlfX1BUX0dQUlMgKyAxMgotX19QVF9SNCAgICAgID0JX19QVF9HUFJTICsgMTYKLV9fUFRfUjUgICAgICA9CV9fUFRfR1BSUyArIDIwCi1fX1BUX1I2ICAgICAgPQlfX1BUX0dQUlMgKyAyNAotX19QVF9SNyAgICAgID0JX19QVF9HUFJTICsgMjgKLV9fUFRfUjggICAgICA9CV9fUFRfR1BSUyArIDMyCi1fX1BUX1I5ICAgICAgPQlfX1BUX0dQUlMgKyAzNgotX19QVF9SMTAgICAgID0JX19QVF9HUFJTICsgNDAKLV9fUFRfUjExICAgICA9CV9fUFRfR1BSUyArIDQ0Ci1fX1BUX1IxMiAgICAgPQlfX1BUX0dQUlMgKyA0OAotX19QVF9SMTMgICAgID0JX19QVF9HUFJTICsgNTI0Ci1fX1BUX1IxNCAgICAgPQlfX1BUX0dQUlMgKyA1NgotX19QVF9SMTUgICAgID0JX19QVF9HUFJTICsgNjAKK19fUFRfUjEgICAgICA9CV9fUFRfR1BSUyArIDgKK19fUFRfUjIgICAgICA9CV9fUFRfR1BSUyArIDE2CitfX1BUX1IzICAgICAgPQlfX1BUX0dQUlMgKyAyNAorX19QVF9SNCAgICAgID0JX19QVF9HUFJTICsgMzIKK19fUFRfUjUgICAgICA9CV9fUFRfR1BSUyArIDQwCitfX1BUX1I2ICAgICAgPQlfX1BUX0dQUlMgKyA0OAorX19QVF9SNyAgICAgID0JX19QVF9HUFJTICsgNTYKK19fUFRfUjggICAgICA9CV9fUFRfR1BSUyArIDY0CitfX1BUX1I5ICAgICAgPQlfX1BUX0dQUlMgKyA3MgorX19QVF9SMTAgICAgID0JX19QVF9HUFJTICsgODAKK19fUFRfUjExICAgICA9CV9fUFRfR1BSUyArIDg4CitfX1BUX1IxMiAgICAgPQlfX1BUX0dQUlMgKyA5NgorX19QVF9SMTMgICAgID0JX19QVF9HUFJTICsgMTA0CitfX1BUX1IxNCAgICAgPQlfX1BUX0dQUlMgKyAxMTIKK19fUFRfUjE1ICAgICA9CV9fUFRfR1BSUyArIDEyMAogCiBTVEFDS19TSElGVCA9IFBBR0VfU0hJRlQgKyBUSFJFQURfT1JERVIKIFNUQUNLX1NJWkUgID0gMSA8PCBTVEFDS19TSElGVAotU1RBQ0tfSU5JVCAgPSBTVEFDS19TSVpFIC0gU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgLSBfX1BUX1NJWkUKK1NUQUNLX0lOSVQgPSBTVEFDS19TSVpFIC0gU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgLSBfX1BUX1NJWkUKIAotX1RJRl9XT1JLCT0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfTkVFRF9SRVNDSEVEKQorX1RJRl9XT1JLCT0gKF9USUZfU0lHUEVORElORyB8IF9USUZfTk9USUZZX1JFU1VNRSB8IF9USUZfTkVFRF9SRVNDSEVEIHwgXAorCQkgICBfVElGX1VQUk9CRSkKIF9USUZfVFJBQ0UJPSAoX1RJRl9TWVNDQUxMX1RSQUNFIHwgX1RJRl9TWVNDQUxMX0FVRElUIHwgX1RJRl9TRUNDT01QIHwgXAogCQkgICBfVElGX1NZU0NBTExfVFJBQ0VQT0lOVCkKIF9DSUZfV09SSwk9IChfQ0lGX01DQ0tfUEVORElORyB8IF9DSUZfQVNDRSkKQEAgLTUzLDE2ICs1NCwxNCBAQAogCS5tYWNybwlUUkFDRV9JUlFTX09OCiAjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCiAJYmFzcgklcjIsJXIwCi0JbAklcjEsQkFTRUQoLkxjX2hhcmRpcnFzX29uKQotCWJhc3IJJXIxNCwlcjEJCSMgY2FsbCB0cmFjZV9oYXJkaXJxc19vbl9jYWxsZXIKKwlicmFzbAklcjE0LHRyYWNlX2hhcmRpcnFzX29uX2NhbGxlcgogI2VuZGlmCiAJLmVuZG0KIAogCS5tYWNybwlUUkFDRV9JUlFTX09GRgogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwogCWJhc3IJJXIyLCVyMAotCWwJJXIxLEJBU0VEKC5MY19oYXJkaXJxc19vZmYpCi0JYmFzcgklcjE0LCVyMQkJIyBjYWxsIHRyYWNlX2hhcmRpcnFzX29mZl9jYWxsZXIKKwlicmFzbAklcjE0LHRyYWNlX2hhcmRpcnFzX29mZl9jYWxsZXIKICNlbmRpZgogCS5lbmRtCiAKQEAgLTcwLDczICs2OSwxMDQgQEAKICNpZmRlZiBDT05GSUdfTE9DS0RFUAogCXRtCV9fUFRfUFNXKzEoJXIxMSksMHgwMQkjIHJldHVybmluZyB0byB1c2VyID8KIAlqegkuKzEwCi0JbAklcjEsQkFTRUQoLkxjX2xvY2tkZXBfc3lzX2V4aXQpCi0JYmFzcgklcjE0LCVyMQkJIyBjYWxsIGxvY2tkZXBfc3lzX2V4aXQKKwlicmFzbAklcjE0LGxvY2tkZXBfc3lzX2V4aXQKKyNlbmRpZgorCS5lbmRtCisKKwkubWFjcm8gTFBQIG5ld3BwCisjaWYgSVNfRU5BQkxFRChDT05GSUdfS1ZNKQorCXRtCV9fTENfTUFDSElORV9GTEFHUys2LDB4MjAJIyBNQUNISU5FX0ZMQUdfTFBQCisJanoJLis4CisJLmluc24JcywweGIyODAwMDAwLFxuZXdwcAorI2VuZGlmCisJLmVuZG0KKworCS5tYWNybwlIQU5ETEVfU0lFX0lOVEVSQ0VQVCBzY3JhdGNoLHJlYXNvbgorI2lmIElTX0VOQUJMRUQoQ09ORklHX0tWTSkKKwl0bWhoCSVyOCwweDAwMDEJCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CisJam56CS4rNjIKKwlsZ3IJXHNjcmF0Y2gsJXI5CisJc2xnCVxzY3JhdGNoLEJBU0VEKC5Mc2llX2NyaXRpY2FsKQorCWNsZwlcc2NyYXRjaCxCQVNFRCguTHNpZV9jcml0aWNhbF9sZW5ndGgpCisJLmlmCVxyZWFzb249PTEKKwkjIFNvbWUgcHJvZ3JhbSBpbnRlcnJ1cHRzIGFyZSBzdXBwcmVzc2luZyAoZS5nLiBwcm90ZWN0aW9uKS4KKwkjIFdlIG11c3QgYWxzbyBjaGVjayB0aGUgaW5zdHJ1Y3Rpb24gYWZ0ZXIgU0lFIGluIHRoYXQgY2FzZS4KKwkjIGRvX3Byb3RlY3Rpb25fZXhjZXB0aW9uIHdpbGwgcmV3aW5kIHRvIC5McmV3aW5kX3BhZAorCWpoCS4rNDIKKwkuZWxzZQorCWpoZQkuKzQyCisJLmVuZGlmCisJbGcJJXIxNCxfX1NGX0VNUFRZKCVyMTUpCQkjIGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIKKwlMUFAJX19TRl9FTVBUWSsxNiglcjE1KQkJIyBzZXQgaG9zdCBpZAorCW5pCV9fU0lFX1BST0cwQyszKCVyMTQpLDB4ZmUJIyBubyBsb25nZXIgaW4gU0lFCisJbGN0bGcJJWMxLCVjMSxfX0xDX1VTRVJfQVNDRQkJIyBsb2FkIHByaW1hcnkgYXNjZQorCWxhcmwJJXI5LHNpZV9leGl0CQkJIyBza2lwIGZvcndhcmQgdG8gc2llX2V4aXQKKwltdmkJX19TRl9FTVBUWSszMSglcjE1KSxccmVhc29uCSMgc2V0IGV4aXQgcmVhc29uCiAjZW5kaWYKIAkuZW5kbQogCiAJLm1hY3JvCUNIRUNLX1NUQUNLIHN0YWNrc2l6ZSxzYXZlYXJlYQogI2lmZGVmIENPTkZJR19DSEVDS19TVEFDSwogCXRtbAklcjE1LFxzdGFja3NpemUgLSBDT05GSUdfU1RBQ0tfR1VBUkQKLQlsYQklcjE0LFxzYXZlYXJlYQorCWxnaGkJJXIxNCxcc2F2ZWFyZWEKIAlqeglzdGFja19vdmVyZmxvdwogI2VuZGlmCiAJLmVuZG0KIAogCS5tYWNybwlTV0lUQ0hfQVNZTkMgc2F2ZWFyZWEsc3RhY2ssc2hpZnQKLQl0bWgJJXI4LDB4MDAwMQkJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KKwl0bWhoCSVyOCwweDAwMDEJCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/CiAJam56CTFmCi0JbHIJJXIxNCwlcjkKLQlzbAklcjE0LEJBU0VEKC5MY19jcml0aWNhbF9zdGFydCkKLQljbAklcjE0LEJBU0VEKC5MY19jcml0aWNhbF9sZW5ndGgpCisJbGdyCSVyMTQsJXI5CisJc2xnCSVyMTQsQkFTRUQoLkxjcml0aWNhbF9zdGFydCkKKwljbGcJJXIxNCxCQVNFRCguTGNyaXRpY2FsX2xlbmd0aCkKIAlqaGUJMGYKLQlsYQklcjExLFxzYXZlYXJlYQkJIyBpbnNpZGUgY3JpdGljYWwgc2VjdGlvbiwgZG8gY2xlYW51cAotCWJyYXMJJXIxNCxjbGVhbnVwX2NyaXRpY2FsCi0JdG1oCSVyOCwweDAwMDEJCSMgcmV0ZXN0IHByb2JsZW0gc3RhdGUgYWZ0ZXIgY2xlYW51cAorCWxnaGkJJXIxMSxcc2F2ZWFyZWEJCSMgaW5zaWRlIGNyaXRpY2FsIHNlY3Rpb24sIGRvIGNsZWFudXAKKwlicmFzbAklcjE0LGNsZWFudXBfY3JpdGljYWwKKwl0bWhoCSVyOCwweDAwMDEJCSMgcmV0ZXN0IHByb2JsZW0gc3RhdGUgYWZ0ZXIgY2xlYW51cAogCWpuegkxZgotMDoJbAklcjE0LFxzdGFjawkJIyBhcmUgd2UgYWxyZWFkeSBvbiB0aGUgdGFyZ2V0IHN0YWNrPwotCXNscgklcjE0LCVyMTUKLQlzcmEJJXIxNCxcc2hpZnQKKzA6CWxnCSVyMTQsXHN0YWNrCQkjIGFyZSB3ZSBhbHJlYWR5IG9uIHRoZSB0YXJnZXQgc3RhY2s/CisJc2xncgklcjE0LCVyMTUKKwlzcmFnCSVyMTQsJXIxNCxcc2hpZnQKIAlqbnoJMWYKIAlDSEVDS19TVEFDSyAxPDxcc2hpZnQsXHNhdmVhcmVhCi0JYWhpCSVyMTUsLShTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfU0laRSkKKwlhZ2hpCSVyMTUsLShTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfU0laRSkKIAlqCTJmCi0xOglsCSVyMTUsXHN0YWNrCQkjIGxvYWQgdGFyZ2V0IHN0YWNrCisxOglsZwklcjE1LFxzdGFjawkJIyBsb2FkIHRhcmdldCBzdGFjawogMjoJbGEJJXIxMSxTVEFDS19GUkFNRV9PVkVSSEVBRCglcjE1KQogCS5lbmRtCiAKLQkubWFjcm8JQURENjQgaGlnaCxsb3csdGltZXIKLQlhbAlcaGlnaCxcdGltZXIKLQlhbAlcbG93LDQrXHRpbWVyCi0JYnJjCTEyLC4rOAotCWFoaQlcaGlnaCwxCi0JLmVuZG0KLQotCS5tYWNybwlTVUI2NCBoaWdoLGxvdyx0aW1lcgotCXNsCVxoaWdoLFx0aW1lcgotCXNsCVxsb3csNCtcdGltZXIKLQlicmMJMywuKzgKLQlhaGkJXGhpZ2gsLTEKLQkuZW5kbQotCi0JLm1hY3JvCVVQREFURV9WVElNRSBoaWdoLGxvdyxlbnRlcl90aW1lcgotCWxtCVxoaWdoLFxsb3csX19MQ19FWElUX1RJTUVSCi0JU1VCNjQJXGhpZ2gsXGxvdyxcZW50ZXJfdGltZXIKLQlBREQ2NAlcaGlnaCxcbG93LF9fTENfVVNFUl9USU1FUgotCXN0bQlcaGlnaCxcbG93LF9fTENfVVNFUl9USU1FUgotCWxtCVxoaWdoLFxsb3csX19MQ19MQVNUX1VQREFURV9USU1FUgotCVNVQjY0CVxoaWdoLFxsb3csX19MQ19FWElUX1RJTUVSCi0JQURENjQJXGhpZ2gsXGxvdyxfX0xDX1NZU1RFTV9USU1FUgotCXN0bQlcaGlnaCxcbG93LF9fTENfU1lTVEVNX1RJTUVSCisJLm1hY3JvIFVQREFURV9WVElNRSBzY3JhdGNoLGVudGVyX3RpbWVyCisJbGcJXHNjcmF0Y2gsX19MQ19FWElUX1RJTUVSCisJc2xnCVxzY3JhdGNoLFxlbnRlcl90aW1lcgorCWFsZwlcc2NyYXRjaCxfX0xDX1VTRVJfVElNRVIKKwlzdGcJXHNjcmF0Y2gsX19MQ19VU0VSX1RJTUVSCisJbGcJXHNjcmF0Y2gsX19MQ19MQVNUX1VQREFURV9USU1FUgorCXNsZwlcc2NyYXRjaCxfX0xDX0VYSVRfVElNRVIKKwlhbGcJXHNjcmF0Y2gsX19MQ19TWVNURU1fVElNRVIKKwlzdGcJXHNjcmF0Y2gsX19MQ19TWVNURU1fVElNRVIKIAltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxcZW50ZXJfdGltZXIKIAkuZW5kbQogCisJLm1hY3JvCUxBU1RfQlJFQUsgc2NyYXRjaAorCXNyYWcJXHNjcmF0Y2gsJXIxMCwyMworCWp6CS4rMTAKKwlzdGcJJXIxMCxfX1RJX2xhc3RfYnJlYWsoJXIxMikKKwkuZW5kbQorCiAJLm1hY3JvIFJFRU5BQkxFX0lSUVMKLQlzdAklcjgsX19MQ19SRVRVUk5fUFNXCisJc3RnCSVyOCxfX0xDX1JFVFVSTl9QU1cKIAluaQlfX0xDX1JFVFVSTl9QU1csMHhiZgogCXNzbQlfX0xDX1JFVFVSTl9QU1cKIAkuZW5kbQogCisJLm1hY3JvIFNUQ0sgc2F2ZWFyZWEKKyNpZmRlZiBDT05GSUdfSEFWRV9NQVJDSF9aOV8xMDlfRkVBVFVSRVMKKwkuaW5zbglzLDB4YjI3YzAwMDAsXHNhdmVhcmVhCQkjIHN0b3JlIGNsb2NrIGZhc3QKKyNlbHNlCisJLmluc24JcywweGIyMDUwMDAwLFxzYXZlYXJlYQkJIyBzdG9yZSBjbG9jaworI2VuZGlmCisJLmVuZG0KKwogCS5zZWN0aW9uIC5rcHJvYmVzLnRleHQsICJheCIKIAogLyoKQEAgLTE0NywxOSArMTc3LDE5IEBACiAgKiAgZ3ByMiA9IHByZXYKICAqLwogRU5UUlkoX19zd2l0Y2hfdG8pCi0Jc3RtCSVyNiwlcjE1LF9fU0ZfR1BSUyglcjE1KQkjIHN0b3JlIGdwcnMgb2YgcHJldiB0YXNrCi0Jc3QJJXIxNSxfX1RIUkVBRF9rc3AoJXIyKQkJIyBzdG9yZSBrZXJuZWwgc3RhY2sgb2YgcHJldgotCWwJJXI0LF9fVEhSRUFEX2luZm8oJXIyKQkJIyBnZXQgdGhyZWFkX2luZm8gb2YgcHJldgotCWwJJXI1LF9fVEhSRUFEX2luZm8oJXIzKQkJIyBnZXQgdGhyZWFkX2luZm8gb2YgbmV4dAotCWxyCSVyMTUsJXI1Ci0JYWhpCSVyMTUsU1RBQ0tfSU5JVAkJCSMgZW5kIG9mIGtlcm5lbCBzdGFjayBvZiBuZXh0Ci0Jc3QJJXIzLF9fTENfQ1VSUkVOVAkJIyBzdG9yZSB0YXNrIHN0cnVjdCBvZiBuZXh0Ci0Jc3QJJXI1LF9fTENfVEhSRUFEX0lORk8JCSMgc3RvcmUgdGhyZWFkIGluZm8gb2YgbmV4dAotCXN0CSVyMTUsX19MQ19LRVJORUxfU1RBQ0sJCSMgc3RvcmUgZW5kIG9mIGtlcm5lbCBzdGFjaworCXN0bWcJJXI2LCVyMTUsX19TRl9HUFJTKCVyMTUpCSMgc3RvcmUgZ3BycyBvZiBwcmV2IHRhc2sKKwlzdGcJJXIxNSxfX1RIUkVBRF9rc3AoJXIyKQkJIyBzdG9yZSBrZXJuZWwgc3RhY2sgb2YgcHJldgorCWxnCSVyNCxfX1RIUkVBRF9pbmZvKCVyMikJCSMgZ2V0IHRocmVhZF9pbmZvIG9mIHByZXYKKwlsZwklcjUsX19USFJFQURfaW5mbyglcjMpCQkjIGdldCB0aHJlYWRfaW5mbyBvZiBuZXh0CisJbGdyCSVyMTUsJXI1CisJYWdoaQklcjE1LFNUQUNLX0lOSVQJCQkjIGVuZCBvZiBrZXJuZWwgc3RhY2sgb2YgbmV4dAorCXN0ZwklcjMsX19MQ19DVVJSRU5UCQkjIHN0b3JlIHRhc2sgc3RydWN0IG9mIG5leHQKKwlzdGcJJXI1LF9fTENfVEhSRUFEX0lORk8JCSMgc3RvcmUgdGhyZWFkIGluZm8gb2YgbmV4dAorCXN0ZwklcjE1LF9fTENfS0VSTkVMX1NUQUNLCQkjIHN0b3JlIGVuZCBvZiBrZXJuZWwgc3RhY2sKIAlsY3RsCSVjNCwlYzQsX19UQVNLX3BpZCglcjMpCQkjIGxvYWQgcGlkIHRvIGNvbnRyb2wgcmVnLiA0Ci0JbXZjCV9fTENfQ1VSUkVOVF9QSUQoNCwlcjApLF9fVEFTS19waWQoJXIzKQkjIHN0b3JlIHBpZCBvZiBuZXh0Ci0JbAklcjE1LF9fVEhSRUFEX2tzcCglcjMpCQkjIGxvYWQga2VybmVsIHN0YWNrIG9mIG5leHQKLQlsbQklcjYsJXIxNSxfX1NGX0dQUlMoJXIxNSkJIyBsb2FkIGdwcnMgb2YgbmV4dCB0YXNrCisJbXZjCV9fTENfQ1VSUkVOVF9QSUQrNCg0LCVyMCksX19UQVNLX3BpZCglcjMpICMgc3RvcmUgcGlkIG9mIG5leHQKKwlsZwklcjE1LF9fVEhSRUFEX2tzcCglcjMpCQkjIGxvYWQga2VybmVsIHN0YWNrIG9mIG5leHQKKwlsbWcJJXI2LCVyMTUsX19TRl9HUFJTKCVyMTUpCSMgbG9hZCBncHJzIG9mIG5leHQgdGFzawogCWJyCSVyMTQKIAogLkxfX2NyaXRpY2FsX3N0YXJ0OgpAQCAtMTcwLDc1ICsyMDAsODMgQEAKIAogRU5UUlkoc3lzdGVtX2NhbGwpCiAJc3RwdAlfX0xDX1NZTkNfRU5URVJfVElNRVIKLS5Mc3lzY19zdG06Ci0Jc3RtCSVyOCwlcjE1LF9fTENfU0FWRV9BUkVBX1NZTkMKLQlsCSVyMTIsX19MQ19USFJFQURfSU5GTwotCWwJJXIxMyxfX0xDX1NWQ19ORVdfUFNXKzQKLQlsaGkJJXIxNCxfUElGX1NZU0NBTEwKKy5Mc3lzY19zdG1nOgorCXN0bWcJJXI4LCVyMTUsX19MQ19TQVZFX0FSRUFfU1lOQworCWxnCSVyMTAsX19MQ19MQVNUX0JSRUFLCisJbGcJJXIxMixfX0xDX1RIUkVBRF9JTkZPCisJbGdoaQklcjE0LF9QSUZfU1lTQ0FMTAogLkxzeXNjX3BlcjoKLQlsCSVyMTUsX19MQ19LRVJORUxfU1RBQ0sKKwlsZwklcjE1LF9fTENfS0VSTkVMX1NUQUNLCiAJbGEJJXIxMSxTVEFDS19GUkFNRV9PVkVSSEVBRCglcjE1KQkjIHBvaW50ZXIgdG8gcHRfcmVncwogLkxzeXNjX3Z0aW1lOgotCVVQREFURV9WVElNRSAlcjgsJXI5LF9fTENfU1lOQ19FTlRFUl9USU1FUgotCXN0bQklcjAsJXI3LF9fUFRfUjAoJXIxMSkKLQltdmMJX19QVF9SOCgzMiwlcjExKSxfX0xDX1NBVkVfQVJFQV9TWU5DCi0JbXZjCV9fUFRfUFNXKDgsJXIxMSksX19MQ19TVkNfT0xEX1BTVworCVVQREFURV9WVElNRSAlcjEzLF9fTENfU1lOQ19FTlRFUl9USU1FUgorCUxBU1RfQlJFQUsgJXIxMworCXN0bWcJJXIwLCVyNyxfX1BUX1IwKCVyMTEpCisJbXZjCV9fUFRfUjgoNjQsJXIxMSksX19MQ19TQVZFX0FSRUFfU1lOQworCW12YwlfX1BUX1BTVygxNiwlcjExKSxfX0xDX1NWQ19PTERfUFNXCiAJbXZjCV9fUFRfSU5UX0NPREUoNCwlcjExKSxfX0xDX1NWQ19JTEMKLQlzdAklcjE0LF9fUFRfRkxBR1MoJXIxMSkKKwlzdGcJJXIxNCxfX1BUX0ZMQUdTKCVyMTEpCiAuTHN5c2NfZG9fc3ZjOgotCWwJJXIxMCxfX1RJX3N5c2NfdGFibGUoJXIxMikJIyAzMSBiaXQgc3lzdGVtIGNhbGwgdGFibGUKLQlsaAklcjgsX19QVF9JTlRfQ09ERSsyKCVyMTEpCi0Jc2xhCSVyOCwyCQkJCSMgc2hpZnQgYW5kIHRlc3QgZm9yIHN2YzAKKwlsZwklcjEwLF9fVElfc3lzY190YWJsZSglcjEyKQkjIGFkZHJlc3Mgb2Ygc3lzdGVtIGNhbGwgdGFibGUKKwlsbGdoCSVyOCxfX1BUX0lOVF9DT0RFKzIoJXIxMSkKKwlzbGFnCSVyOCwlcjgsMgkJCSMgc2hpZnQgYW5kIHRlc3QgZm9yIHN2YyAwCiAJam56CS5Mc3lzY19ucl9vawogCSMgc3ZjIDA6IHN5c3RlbSBjYWxsIG51bWJlciBpbiAlcjEKLQljbAklcjEsQkFTRUQoLkxucl9zeXNjYWxscykKKwlsbGdmcgklcjEsJXIxCQkJCSMgY2xlYXIgaGlnaCB3b3JkIGluIHIxCisJY2doaQklcjEsTlJfc3lzY2FsbHMKIAlqbmwJLkxzeXNjX25yX29rCiAJc3RoCSVyMSxfX1BUX0lOVF9DT0RFKzIoJXIxMSkKLQlscgklcjgsJXIxCi0Jc2xhCSVyOCwyCisJc2xhZwklcjgsJXIxLDIKIC5Mc3lzY19ucl9vazoKLQl4YwlfX1NGX0JBQ0tDSEFJTig0LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpCi0Jc3QJJXIyLF9fUFRfT1JJR19HUFIyKCVyMTEpCi0Jc3QJJXI3LFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCi0JbAklcjksMCglcjgsJXIxMCkJCQkjIGdldCBzeXN0ZW0gY2FsbCBhZGRyLgotCXRtCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX1RSQUNFCisJeGMJX19TRl9CQUNLQ0hBSU4oOCwlcjE1KSxfX1NGX0JBQ0tDSEFJTiglcjE1KQorCXN0ZwklcjIsX19QVF9PUklHX0dQUjIoJXIxMSkKKwlzdGcJJXI3LFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCisJbGdmCSVyOSwwKCVyOCwlcjEwKQkJCSMgZ2V0IHN5c3RlbSBjYWxsIGFkZC4KKwl0bQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9UUkFDRQogCWpuegkuTHN5c2NfdHJhY2VzeXMKIAliYXNyCSVyMTQsJXI5CQkJIyBjYWxsIHN5c194eHh4Ci0Jc3QJJXIyLF9fUFRfUjIoJXIxMSkJCSMgc3RvcmUgcmV0dXJuIHZhbHVlCisJc3RnCSVyMixfX1BUX1IyKCVyMTEpCQkjIHN0b3JlIHJldHVybiB2YWx1ZQogCiAuTHN5c2NfcmV0dXJuOgogCUxPQ0tERVBfU1lTX0VYSVQKIC5Mc3lzY190aWY6CiAJdG0JX19QVF9QU1crMSglcjExKSwweDAxCQkjIHJldHVybmluZyB0byB1c2VyID8KIAlqbm8JLkxzeXNjX3Jlc3RvcmUKLQl0bQlfX1BUX0ZMQUdTKzMoJXIxMSksX1BJRl9XT1JLCisJdG0JX19QVF9GTEFHUys3KCVyMTEpLF9QSUZfV09SSwogCWpuegkuTHN5c2Nfd29yawotCXRtCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX1dPUksKLQlqbnoJLkxzeXNjX3dvcmsJCQkjIGNoZWNrIGZvciB0aHJlYWQgd29yawotCXRtCV9fTENfQ1BVX0ZMQUdTKzMsX0NJRl9XT1JLCisJdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfV09SSworCWpuegkuTHN5c2Nfd29yawkJCSMgY2hlY2sgZm9yIHdvcmsKKwl0bQlfX0xDX0NQVV9GTEFHUys3LF9DSUZfV09SSwogCWpuegkuTHN5c2Nfd29yawogLkxzeXNjX3Jlc3RvcmU6Ci0JbXZjCV9fTENfUkVUVVJOX1BTVyg4KSxfX1BUX1BTVyglcjExKQorCWxnCSVyMTQsX19MQ19WRFNPX1BFUl9DUFUKKwlsbWcJJXIwLCVyMTAsX19QVF9SMCglcjExKQorCW12YwlfX0xDX1JFVFVSTl9QU1coMTYpLF9fUFRfUFNXKCVyMTEpCiAJc3RwdAlfX0xDX0VYSVRfVElNRVIKLQlsbQklcjAsJXIxNSxfX1BUX1IwKCVyMTEpCi0JbHBzdwlfX0xDX1JFVFVSTl9QU1cKKwltdmMJX19WRFNPX0VDVEdfQkFTRSgxNiwlcjE0KSxfX0xDX0VYSVRfVElNRVIKKwlsbWcJJXIxMSwlcjE1LF9fUFRfUjExKCVyMTEpCisJbHBzd2UJX19MQ19SRVRVUk5fUFNXCiAuTHN5c2NfZG9uZToKIAogIwogIyBPbmUgb2YgdGhlIHdvcmsgYml0cyBpcyBvbi4gRmluZCBvdXQgd2hpY2ggb25lLgogIwogLkxzeXNjX3dvcms6Ci0JdG0JX19MQ19DUFVfRkxBR1MrMyxfQ0lGX01DQ0tfUEVORElORworCXRtCV9fTENfQ1BVX0ZMQUdTKzcsX0NJRl9NQ0NLX1BFTkRJTkcKIAlqbwkuTHN5c2NfbWNja19wZW5kaW5nCi0JdG0JX19USV9mbGFncyszKCVyMTIpLF9USUZfTkVFRF9SRVNDSEVECisJdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfTkVFRF9SRVNDSEVECiAJam8JLkxzeXNjX3Jlc2NoZWR1bGUKLQl0bQlfX1BUX0ZMQUdTKzMoJXIxMSksX1BJRl9QRVJfVFJBUAorI2lmZGVmIENPTkZJR19VUFJPQkVTCisJdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfVVBST0JFCisJam8JLkxzeXNjX3Vwcm9iZV9ub3RpZnkKKyNlbmRpZgorCXRtCV9fUFRfRkxBR1MrNyglcjExKSxfUElGX1BFUl9UUkFQCiAJam8JLkxzeXNjX3NpbmdsZXN0ZXAKLQl0bQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9TSUdQRU5ESU5HCisJdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfU0lHUEVORElORwogCWpvCS5Mc3lzY19zaWdwZW5kaW5nCi0JdG0JX19USV9mbGFncyszKCVyMTIpLF9USUZfTk9USUZZX1JFU1VNRQorCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX05PVElGWV9SRVNVTUUKIAlqbwkuTHN5c2Nfbm90aWZ5X3Jlc3VtZQotCXRtCV9fTENfQ1BVX0ZMQUdTKzMsX0NJRl9BU0NFCisJdG0JX19MQ19DUFVfRkxBR1MrNyxfQ0lGX0FTQ0UKIAlqbwkuTHN5c2NfdWFjY2VzcwogCWoJLkxzeXNjX3JldHVybgkJIyBiZXdhcmUgb2YgY3JpdGljYWwgc2VjdGlvbiBjbGVhbnVwCiAKQEAgLTI0NiwxMDkgKzI4NCwxMDkgQEAKICMgX1RJRl9ORUVEX1JFU0NIRUQgaXMgc2V0LCBjYWxsIHNjaGVkdWxlCiAjCiAuTHN5c2NfcmVzY2hlZHVsZToKLQlsCSVyMSxCQVNFRCguTGNfc2NoZWR1bGUpCi0JbGEJJXIxNCxCQVNFRCguTHN5c2NfcmV0dXJuKQotCWJyCSVyMQkJCSMgY2FsbCBzY2hlZHVsZQorCWxhcmwJJXIxNCwuTHN5c2NfcmV0dXJuCisJamcJc2NoZWR1bGUKIAogIwogIyBfQ0lGX01DQ0tfUEVORElORyBpcyBzZXQsIGNhbGwgaGFuZGxlcgogIwogLkxzeXNjX21jY2tfcGVuZGluZzoKLQlsCSVyMSxCQVNFRCguTGNfaGFuZGxlX21jY2spCi0JbGEJJXIxNCxCQVNFRCguTHN5c2NfcmV0dXJuKQotCWJyCSVyMQkJCSMgVElGIGJpdCB3aWxsIGJlIGNsZWFyZWQgYnkgaGFuZGxlcgorCWxhcmwJJXIxNCwuTHN5c2NfcmV0dXJuCisJamcJczM5MF9oYW5kbGVfbWNjawkjIFRJRiBiaXQgd2lsbCBiZSBjbGVhcmVkIGJ5IGhhbmRsZXIKIAogIwogIyBfQ0lGX0FTQ0UgaXMgc2V0LCBsb2FkIHVzZXIgc3BhY2UgYXNjZQogIwogLkxzeXNjX3VhY2Nlc3M6Ci0JbmkJX19MQ19DUFVfRkxBR1MrMywyNTUtX0NJRl9BU0NFCi0JbGN0bAklYzEsJWMxLF9fTENfVVNFUl9BU0NFCSMgbG9hZCBwcmltYXJ5IGFzY2UKKwluaQlfX0xDX0NQVV9GTEFHUys3LDI1NS1fQ0lGX0FTQ0UKKwlsY3RsZwklYzEsJWMxLF9fTENfVVNFUl9BU0NFCQkjIGxvYWQgcHJpbWFyeSBhc2NlCiAJagkuTHN5c2NfcmV0dXJuCiAKICMKICMgX1RJRl9TSUdQRU5ESU5HIGlzIHNldCwgY2FsbCBkb19zaWduYWwKICMKIC5Mc3lzY19zaWdwZW5kaW5nOgotCWxyCSVyMiwlcjExCQkjIHBhc3MgcG9pbnRlciB0byBwdF9yZWdzCi0JbAklcjEsQkFTRUQoLkxjX2RvX3NpZ25hbCkKLQliYXNyCSVyMTQsJXIxCQkjIGNhbGwgZG9fc2lnbmFsCi0JdG0JX19QVF9GTEFHUyszKCVyMTEpLF9QSUZfU1lTQ0FMTAorCWxncgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncworCWJyYXNsCSVyMTQsZG9fc2lnbmFsCisJdG0JX19QVF9GTEFHUys3KCVyMTEpLF9QSUZfU1lTQ0FMTAogCWpubwkuTHN5c2NfcmV0dXJuCi0JbG0JJXIyLCVyNyxfX1BUX1IyKCVyMTEpCSMgbG9hZCBzdmMgYXJndW1lbnRzCi0JbAklcjEwLF9fVElfc3lzY190YWJsZSglcjEyKQkjIDMxIGJpdCBzeXN0ZW0gY2FsbCB0YWJsZQotCXhyCSVyOCwlcjgJCQkjIHN2YyAwIHJldHVybnMgLUVOT1NZUwotCWNsYwlfX1BUX0lOVF9DT0RFKzIoMiwlcjExKSxCQVNFRCguTG5yX3N5c2NhbGxzKzIpCisJbG1nCSVyMiwlcjcsX19QVF9SMiglcjExKQkjIGxvYWQgc3ZjIGFyZ3VtZW50cworCWxnCSVyMTAsX19USV9zeXNjX3RhYmxlKCVyMTIpCSMgYWRkcmVzcyBvZiBzeXN0ZW0gY2FsbCB0YWJsZQorCWxnaGkJJXI4LDAJCQkjIHN2YyAwIHJldHVybnMgLUVOT1NZUworCWxsZ2gJJXIxLF9fUFRfSU5UX0NPREUrMiglcjExKQkjIGxvYWQgbmV3IHN2YyBudW1iZXIKKwljZ2hpCSVyMSxOUl9zeXNjYWxscwogCWpubAkuTHN5c2NfbnJfb2sJCSMgaW52YWxpZCBzdmMgbnVtYmVyIC0+IGRvIHN2YyAwCi0JbGgJJXI4LF9fUFRfSU5UX0NPREUrMiglcjExKQkjIGxvYWQgbmV3IHN2YyBudW1iZXIKLQlzbGEJJXI4LDIKKwlzbGFnCSVyOCwlcjEsMgogCWoJLkxzeXNjX25yX29rCQkjIHJlc3RhcnQgc3ZjCiAKICMKICMgX1RJRl9OT1RJRllfUkVTVU1FIGlzIHNldCwgY2FsbCBkb19ub3RpZnlfcmVzdW1lCiAjCiAuTHN5c2Nfbm90aWZ5X3Jlc3VtZToKLQlscgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncwotCWwJJXIxLEJBU0VEKC5MY19kb19ub3RpZnlfcmVzdW1lKQotCWxhCSVyMTQsQkFTRUQoLkxzeXNjX3JldHVybikKLQlicgklcjEJCQkjIGNhbGwgZG9fbm90aWZ5X3Jlc3VtZQorCWxncgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncworCWxhcmwJJXIxNCwuTHN5c2NfcmV0dXJuCisJamcJZG9fbm90aWZ5X3Jlc3VtZQorCisjCisjIF9USUZfVVBST0JFIGlzIHNldCwgY2FsbCB1cHJvYmVfbm90aWZ5X3Jlc3VtZQorIworI2lmZGVmIENPTkZJR19VUFJPQkVTCisuTHN5c2NfdXByb2JlX25vdGlmeToKKwlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKKwlsYXJsCSVyMTQsLkxzeXNjX3JldHVybgorCWpnCXVwcm9iZV9ub3RpZnlfcmVzdW1lCisjZW5kaWYKIAogIwogIyBfUElGX1BFUl9UUkFQIGlzIHNldCwgY2FsbCBkb19wZXJfdHJhcAogIwogLkxzeXNjX3NpbmdsZXN0ZXA6Ci0JbmkJX19QVF9GTEFHUyszKCVyMTEpLDI1NS1fUElGX1BFUl9UUkFQCi0JbHIJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKLQlsCSVyMSxCQVNFRCguTGNfZG9fcGVyX3RyYXApCi0JbGEJJXIxNCxCQVNFRCguTHN5c2NfcmV0dXJuKQotCWJyCSVyMQkJCSMgY2FsbCBkb19wZXJfdHJhcAorCW5pCV9fUFRfRkxBR1MrNyglcjExKSwyNTUtX1BJRl9QRVJfVFJBUAorCWxncgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncworCWxhcmwJJXIxNCwuTHN5c2NfcmV0dXJuCisJamcJZG9fcGVyX3RyYXAKIAogIwogIyBjYWxsIHRyYWNlaG9va19yZXBvcnRfc3lzY2FsbF9lbnRyeS90cmFjZWhvb2tfcmVwb3J0X3N5c2NhbGxfZXhpdCBiZWZvcmUKICMgYW5kIGFmdGVyIHRoZSBzeXN0ZW0gY2FsbAogIwogLkxzeXNjX3RyYWNlc3lzOgotCWwJJXIxLEJBU0VEKC5MY190cmFjZV9lbnRlcikKLQlscgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncworCWxncgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncwogCWxhCSVyMywwCi0JeHIJJXIwLCVyMAotCWljbQklcjAsMyxfX1BUX0lOVF9DT0RFKzIoJXIxMSkKLQlzdAklcjAsX19QVF9SMiglcjExKQotCWJhc3IJJXIxNCwlcjEJCSMgY2FsbCBkb19zeXNjYWxsX3RyYWNlX2VudGVyCi0JY2wJJXIyLEJBU0VEKC5MbnJfc3lzY2FsbHMpCi0Jam5sCS5Mc3lzY190cmFjZW5vZ28KLQlscgklcjgsJXIyCi0Jc2xsCSVyOCwyCi0JbAklcjksMCglcjgsJXIxMCkKKwlsbGdoCSVyMCxfX1BUX0lOVF9DT0RFKzIoJXIxMSkKKwlzdGcJJXIwLF9fUFRfUjIoJXIxMSkKKwlicmFzbAklcjE0LGRvX3N5c2NhbGxfdHJhY2VfZW50ZXIKKwlsZ2hpCSVyMCxOUl9zeXNjYWxscworCWNsZ3IJJXIwLCVyMgorCWpuaAkuTHN5c2NfdHJhY2Vub2dvCisJc2xsZwklcjgsJXIyLDIKKwlsZ2YJJXI5LDAoJXI4LCVyMTApCiAuTHN5c2NfdHJhY2VnbzoKLQlsbQklcjMsJXI3LF9fUFRfUjMoJXIxMSkKLQlzdAklcjcsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQoJXIxNSkKLQlsCSVyMixfX1BUX09SSUdfR1BSMiglcjExKQorCWxtZwklcjMsJXI3LF9fUFRfUjMoJXIxMSkKKwlzdGcJJXI3LFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCisJbGcJJXIyLF9fUFRfT1JJR19HUFIyKCVyMTEpCiAJYmFzcgklcjE0LCVyOQkJIyBjYWxsIHN5c194eHgKLQlzdAklcjIsX19QVF9SMiglcjExKQkjIHN0b3JlIHJldHVybiB2YWx1ZQorCXN0ZwklcjIsX19QVF9SMiglcjExKQkjIHN0b3JlIHJldHVybiB2YWx1ZQogLkxzeXNjX3RyYWNlbm9nbzoKLQl0bQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9UUkFDRQorCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX1RSQUNFCiAJanoJLkxzeXNjX3JldHVybgotCWwJJXIxLEJBU0VEKC5MY190cmFjZV9leGl0KQotCWxyCSVyMiwlcjExCQkjIHBhc3MgcG9pbnRlciB0byBwdF9yZWdzCi0JbGEJJXIxNCxCQVNFRCguTHN5c2NfcmV0dXJuKQotCWJyCSVyMQkJCSMgY2FsbCBkb19zeXNjYWxsX3RyYWNlX2V4aXQKKwlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKKwlsYXJsCSVyMTQsLkxzeXNjX3JldHVybgorCWpnCWRvX3N5c2NhbGxfdHJhY2VfZXhpdAogCiAjCiAjIGEgbmV3IHByb2Nlc3MgZXhpdHMgdGhlIGtlcm5lbCB3aXRoIHJldF9mcm9tX2ZvcmsKICMKIEVOVFJZKHJldF9mcm9tX2ZvcmspCiAJbGEJJXIxMSxTVEFDS19GUkFNRV9PVkVSSEVBRCglcjE1KQotCWwJJXIxMixfX0xDX1RIUkVBRF9JTkZPCi0JbAklcjEzLF9fTENfU1ZDX05FV19QU1crNAotCWwJJXIxLEJBU0VEKC5MY19zY2hlZHVsZV90YWlsKQotCWJhc3IJJXIxNCwlcjEJCSMgY2FsbCBzY2hlZHVsZV90YWlsCisJbGcJJXIxMixfX0xDX1RIUkVBRF9JTkZPCisJYnJhc2wJJXIxNCxzY2hlZHVsZV90YWlsCiAJVFJBQ0VfSVJRU19PTgogCXNzbQlfX0xDX1NWQ19ORVdfUFNXCSMgcmVlbmFibGUgaW50ZXJydXB0cwogCXRtCV9fUFRfUFNXKzEoJXIxMSksMHgwMQkjIGZvcmtpbmcgYSBrZXJuZWwgdGhyZWFkID8KIAlqbmUJLkxzeXNjX3RyYWNlbm9nbwogCSMgaXQncyBhIGtlcm5lbCB0aHJlYWQKLQlsbQklcjksJXIxMCxfX1BUX1I5KCVyMTEpCSMgbG9hZCBncHJzCisJbG1nCSVyOSwlcjEwLF9fUFRfUjkoJXIxMSkJIyBsb2FkIGdwcnMKIEVOVFJZKGtlcm5lbF90aHJlYWRfc3RhcnRlcikKIAlsYQklcjIsMCglcjEwKQogCWJhc3IJJXIxNCwlcjkKQEAgLTM2MCw0NiArMzk4LDU0IEBACiAKIEVOVFJZKHBnbV9jaGVja19oYW5kbGVyKQogCXN0cHQJX19MQ19TWU5DX0VOVEVSX1RJTUVSCi0Jc3RtCSVyOCwlcjE1LF9fTENfU0FWRV9BUkVBX1NZTkMKLQlsCSVyMTIsX19MQ19USFJFQURfSU5GTwotCWwJJXIxMyxfX0xDX1NWQ19ORVdfUFNXKzQKLQlsbQklcjgsJXI5LF9fTENfUEdNX09MRF9QU1cKLQl0bWgJJXI4LDB4MDAwMQkJIyB0ZXN0IHByb2JsZW0gc3RhdGUgYml0CisJc3RtZwklcjgsJXIxNSxfX0xDX1NBVkVfQVJFQV9TWU5DCisJbGcJJXIxMCxfX0xDX0xBU1RfQlJFQUsKKwlsZwklcjEyLF9fTENfVEhSRUFEX0lORk8KKwlsYXJsCSVyMTMsc3lzdGVtX2NhbGwKKwlsbWcJJXI4LCVyOSxfX0xDX1BHTV9PTERfUFNXCisJSEFORExFX1NJRV9JTlRFUkNFUFQgJXIxNCwxCisJdG1oaAklcjgsMHgwMDAxCQkjIHRlc3QgcHJvYmxlbSBzdGF0ZSBiaXQKIAlqbnoJMWYJCQkjIC0+IGZhdWx0IGluIHVzZXIgc3BhY2UKLQl0bWgJJXI4LDB4NDAwMAkJIyBQRVIgYml0IHNldCBpbiBvbGQgUFNXID8KKwl0bWhoCSVyOCwweDQwMDAJCSMgUEVSIGJpdCBzZXQgaW4gb2xkIFBTVyA/CiAJam56CTBmCQkJIyAtPiBlbmFibGVkLCBjYW4ndCBiZSBhIGRvdWJsZSBmYXVsdAogCXRtCV9fTENfUEdNX0lMQyszLDB4ODAJIyBjaGVjayBmb3IgcGVyIGV4Y2VwdGlvbgogCWpuegkuTHBnbV9zdmNwZXIJCSMgLT4gc2luZ2xlIHN0ZXBwZWQgc3ZjCiAwOglDSEVDS19TVEFDSyBTVEFDS19TSVpFLF9fTENfU0FWRV9BUkVBX1NZTkMKLQlhaGkJJXIxNSwtKFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TSVpFKQorCWFnaGkJJXIxNSwtKFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TSVpFKQogCWoJMmYKLTE6CVVQREFURV9WVElNRSAlcjE0LCVyMTUsX19MQ19TWU5DX0VOVEVSX1RJTUVSCi0JbAklcjE1LF9fTENfS0VSTkVMX1NUQUNLCisxOglVUERBVEVfVlRJTUUgJXIxNCxfX0xDX1NZTkNfRU5URVJfVElNRVIKKwlMQVNUX0JSRUFLICVyMTQKKwlsZwklcjE1LF9fTENfS0VSTkVMX1NUQUNLCisJbGcJJXIxNCxfX1RJX3Rhc2soJXIxMikKKwlsZ2hpCSVyMTMsX19MQ19QR01fVERCCisJdG0JX19MQ19QR01fSUxDKzIsMHgwMgkjIGNoZWNrIGZvciB0cmFuc2FjdGlvbiBhYm9ydAorCWp6CTJmCisJbXZjCV9fVEhSRUFEX3RyYXBfdGRiKDI1NiwlcjE0KSwwKCVyMTMpCiAyOglsYQklcjExLFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCi0Jc3RtCSVyMCwlcjcsX19QVF9SMCglcjExKQotCW12YwlfX1BUX1I4KDMyLCVyMTEpLF9fTENfU0FWRV9BUkVBX1NZTkMKLQlzdG0JJXI4LCVyOSxfX1BUX1BTVyglcjExKQorCXN0bWcJJXIwLCVyNyxfX1BUX1IwKCVyMTEpCisJbXZjCV9fUFRfUjgoNjQsJXIxMSksX19MQ19TQVZFX0FSRUFfU1lOQworCXN0bWcJJXI4LCVyOSxfX1BUX1BTVyglcjExKQogCW12YwlfX1BUX0lOVF9DT0RFKDQsJXIxMSksX19MQ19QR01fSUxDCi0JbXZjCV9fUFRfSU5UX1BBUk1fTE9ORyg0LCVyMTEpLF9fTENfVFJBTlNfRVhDX0NPREUKLQl4YwlfX1BUX0ZMQUdTKDQsJXIxMSksX19QVF9GTEFHUyglcjExKQorCW12YwlfX1BUX0lOVF9QQVJNX0xPTkcoOCwlcjExKSxfX0xDX1RSQU5TX0VYQ19DT0RFCisJeGMJX19QVF9GTEFHUyg4LCVyMTEpLF9fUFRfRkxBR1MoJXIxMSkKKwlzdGcJJXIxMCxfX1BUX0FSR1MoJXIxMSkKIAl0bQlfX0xDX1BHTV9JTEMrMywweDgwCSMgY2hlY2sgZm9yIHBlciBleGNlcHRpb24KIAlqegkwZgotCWwJJXIxLF9fVElfdGFzayglcjEyKQotCXRtaAklcjgsMHgwMDAxCQkjIGtlcm5lbCBwZXIgZXZlbnQgPworCXRtaGgJJXI4LDB4MDAwMQkJIyBrZXJuZWwgcGVyIGV2ZW50ID8KIAlqegkuTHBnbV9rcHJvYmUKLQlvaQlfX1BUX0ZMQUdTKzMoJXIxMSksX1BJRl9QRVJfVFJBUAotCW12YwlfX1RIUkVBRF9wZXJfYWRkcmVzcyg0LCVyMSksX19MQ19QRVJfQUREUkVTUwotCW12YwlfX1RIUkVBRF9wZXJfY2F1c2UoMiwlcjEpLF9fTENfUEVSX0NPREUKLQltdmMJX19USFJFQURfcGVyX3BhaWQoMSwlcjEpLF9fTENfUEVSX0FDQ0VTU19JRAorCW9pCV9fUFRfRkxBR1MrNyglcjExKSxfUElGX1BFUl9UUkFQCisJbXZjCV9fVEhSRUFEX3Blcl9hZGRyZXNzKDgsJXIxNCksX19MQ19QRVJfQUREUkVTUworCW12YwlfX1RIUkVBRF9wZXJfY2F1c2UoMiwlcjE0KSxfX0xDX1BFUl9DT0RFCisJbXZjCV9fVEhSRUFEX3Blcl9wYWlkKDEsJXIxNCksX19MQ19QRVJfQUNDRVNTX0lECiAwOglSRUVOQUJMRV9JUlFTCi0JeGMJX19TRl9CQUNLQ0hBSU4oNCwlcjE1KSxfX1NGX0JBQ0tDSEFJTiglcjE1KQotCWwJJXIxLEJBU0VEKC5MY19qdW1wX3RhYmxlKQotCWxhCSVyMTAsMHg3ZgotCW4JJXIxMCxfX1BUX0lOVF9DT0RFKCVyMTEpCi0JamUJLkxzeXNjX3JldHVybgorCXhjCV9fU0ZfQkFDS0NIQUlOKDgsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkKKwlsYXJsCSVyMSxwZ21fY2hlY2tfdGFibGUKKwlsbGdoCSVyMTAsX19QVF9JTlRfQ09ERSsyKCVyMTEpCisJbmlsbAklcjEwLDB4MDA3ZgogCXNsbAklcjEwLDIKLQlsCSVyMSwwKCVyMTAsJXIxKQkJIyBsb2FkIGFkZHJlc3Mgb2YgaGFuZGxlciByb3V0aW5lCi0JbHIJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKKwlqZQkuTHN5c2NfcmV0dXJuCisJbGdmCSVyMSwwKCVyMTAsJXIxKQkJIyBsb2FkIGFkZHJlc3Mgb2YgaGFuZGxlciByb3V0aW5lCisJbGdyCSVyMiwlcjExCQkjIHBhc3MgcG9pbnRlciB0byBwdF9yZWdzCiAJYmFzcgklcjE0LCVyMQkJIyBicmFuY2ggdG8gaW50ZXJydXB0LWhhbmRsZXIKIAlqCS5Mc3lzY19yZXR1cm4KIApAQCAtNDA4LDU0ICs0NTQsNTUgQEAKICMKIC5McGdtX2twcm9iZToKIAlSRUVOQUJMRV9JUlFTCi0JeGMJX19TRl9CQUNLQ0hBSU4oNCwlcjE1KSxfX1NGX0JBQ0tDSEFJTiglcjE1KQotCWwJJXIxLEJBU0VEKC5MY19kb19wZXJfdHJhcCkKLQlscgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncwotCWJhc3IJJXIxNCwlcjEJCSMgY2FsbCBkb19wZXJfdHJhcAorCXhjCV9fU0ZfQkFDS0NIQUlOKDgsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkKKwlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKKwlicmFzbAklcjE0LGRvX3Blcl90cmFwCiAJagkuTHN5c2NfcmV0dXJuCiAKICMKICMgc2luZ2xlIHN0ZXBwZWQgc3lzdGVtIGNhbGwKICMKIC5McGdtX3N2Y3BlcjoKLQltdmMJX19MQ19SRVRVUk5fUFNXKDQpLF9fTENfU1ZDX05FV19QU1cKLQltdmMJX19MQ19SRVRVUk5fUFNXKzQoNCksQkFTRUQoLkxjX3N5c2NfcGVyKQotCWxoaQklcjE0LF9QSUZfU1lTQ0FMTCB8IF9QSUZfUEVSX1RSQVAKLQlscHN3CV9fTENfUkVUVVJOX1BTVwkJIyBicmFuY2ggdG8gLkxzeXNjX3BlciBhbmQgZW5hYmxlIGlycXMKKwltdmMJX19MQ19SRVRVUk5fUFNXKDgpLF9fTENfU1ZDX05FV19QU1cKKwlsYXJsCSVyMTQsLkxzeXNjX3BlcgorCXN0ZwklcjE0LF9fTENfUkVUVVJOX1BTVys4CisJbGdoaQklcjE0LF9QSUZfU1lTQ0FMTCB8IF9QSUZfUEVSX1RSQVAKKwlscHN3ZQlfX0xDX1JFVFVSTl9QU1cJCSMgYnJhbmNoIHRvIC5Mc3lzY19wZXIgYW5kIGVuYWJsZSBpcnFzCiAKIC8qCiAgKiBJTyBpbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lCiAgKi8KLQogRU5UUlkoaW9faW50X2hhbmRsZXIpCi0Jc3RjawlfX0xDX0lOVF9DTE9DSworCVNUQ0sJX19MQ19JTlRfQ0xPQ0sKIAlzdHB0CV9fTENfQVNZTkNfRU5URVJfVElNRVIKLQlzdG0JJXI4LCVyMTUsX19MQ19TQVZFX0FSRUFfQVNZTkMKLQlsCSVyMTIsX19MQ19USFJFQURfSU5GTwotCWwJJXIxMyxfX0xDX1NWQ19ORVdfUFNXKzQKLQlsbQklcjgsJXI5LF9fTENfSU9fT0xEX1BTVwotCXRtaAklcjgsMHgwMDAxCQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPwotCWp6CS5MaW9fc2tpcAotCVVQREFURV9WVElNRSAlcjE0LCVyMTUsX19MQ19BU1lOQ19FTlRFUl9USU1FUgotLkxpb19za2lwOgorCXN0bWcJJXI4LCVyMTUsX19MQ19TQVZFX0FSRUFfQVNZTkMKKwlsZwklcjEwLF9fTENfTEFTVF9CUkVBSworCWxnCSVyMTIsX19MQ19USFJFQURfSU5GTworCWxhcmwJJXIxMyxzeXN0ZW1fY2FsbAorCWxtZwklcjgsJXI5LF9fTENfSU9fT0xEX1BTVworCUhBTkRMRV9TSUVfSU5URVJDRVBUICVyMTQsMgogCVNXSVRDSF9BU1lOQyBfX0xDX1NBVkVfQVJFQV9BU1lOQyxfX0xDX0FTWU5DX1NUQUNLLFNUQUNLX1NISUZUCi0Jc3RtCSVyMCwlcjcsX19QVF9SMCglcjExKQotCW12YwlfX1BUX1I4KDMyLCVyMTEpLF9fTENfU0FWRV9BUkVBX0FTWU5DCi0Jc3RtCSVyOCwlcjksX19QVF9QU1coJXIxMSkKKwl0bWhoCSVyOCwweDAwMDEJCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlcj8KKwlqegkuTGlvX3NraXAKKwlVUERBVEVfVlRJTUUgJXIxNCxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCisJTEFTVF9CUkVBSyAlcjE0CisuTGlvX3NraXA6CisJc3RtZwklcjAsJXI3LF9fUFRfUjAoJXIxMSkKKwltdmMJX19QVF9SOCg2NCwlcjExKSxfX0xDX1NBVkVfQVJFQV9BU1lOQworCXN0bWcJJXI4LCVyOSxfX1BUX1BTVyglcjExKQogCW12YwlfX1BUX0lOVF9DT0RFKDEyLCVyMTEpLF9fTENfU1VCQ0hBTk5FTF9JRAotCXhjCV9fUFRfRkxBR1MoNCwlcjExKSxfX1BUX0ZMQUdTKCVyMTEpCisJeGMJX19QVF9GTEFHUyg4LCVyMTEpLF9fUFRfRkxBR1MoJXIxMSkKIAlUUkFDRV9JUlFTX09GRgotCXhjCV9fU0ZfQkFDS0NIQUlOKDQsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkKKwl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpCiAuTGlvX2xvb3A6Ci0JbAklcjEsQkFTRUQoLkxjX2RvX0lSUSkKLQlscgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncwotCWxoaQklcjMsSU9fSU5URVJSVVBUCisJbGdyCSVyMiwlcjExCQkjIHBhc3MgcG9pbnRlciB0byBwdF9yZWdzCisJbGdoaQklcjMsSU9fSU5URVJSVVBUCiAJdG0JX19QVF9JTlRfQ09ERSs4KCVyMTEpLDB4ODAJIyBhZGFwdGVyIGludGVycnVwdCA/CiAJanoJLkxpb19jYWxsCi0JbGhpCSVyMyxUSElOX0lOVEVSUlVQVAorCWxnaGkJJXIzLFRISU5fSU5URVJSVVBUCiAuTGlvX2NhbGw6Ci0JYmFzcgklcjE0LCVyMQkJIyBjYWxsIGRvX0lSUQotCXRtCV9fTENfTUFDSElORV9GTEFHUysyLDB4MTAJIyBNQUNISU5FX0ZMQUdfTFBBUgorCWJyYXNsCSVyMTQsZG9fSVJRCisJdG0JX19MQ19NQUNISU5FX0ZMQUdTKzYsMHgxMAkjIE1BQ0hJTkVfRkxBR19MUEFSCiAJanoJLkxpb19yZXR1cm4KIAl0cGkJMAogCWp6CS5MaW9fcmV0dXJuCkBAIC00NjUsMjEgKzUxMiwyNiBAQAogCUxPQ0tERVBfU1lTX0VYSVQKIAlUUkFDRV9JUlFTX09OCiAuTGlvX3RpZjoKLQl0bQlfX1RJX2ZsYWdzKzMoJXIxMiksX1RJRl9XT1JLCisJdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfV09SSwogCWpuegkuTGlvX3dvcmsJCSMgdGhlcmUgaXMgd29yayB0byBkbyAoc2lnbmFscyBldGMuKQotCXRtCV9fTENfQ1BVX0ZMQUdTKzMsX0NJRl9XT1JLCisJdG0JX19MQ19DUFVfRkxBR1MrNyxfQ0lGX1dPUksKIAlqbnoJLkxpb193b3JrCiAuTGlvX3Jlc3RvcmU6Ci0JbXZjCV9fTENfUkVUVVJOX1BTVyg4KSxfX1BUX1BTVyglcjExKQorCWxnCSVyMTQsX19MQ19WRFNPX1BFUl9DUFUKKwlsbWcJJXIwLCVyMTAsX19QVF9SMCglcjExKQorCW12YwlfX0xDX1JFVFVSTl9QU1coMTYpLF9fUFRfUFNXKCVyMTEpCiAJc3RwdAlfX0xDX0VYSVRfVElNRVIKLQlsbQklcjAsJXIxNSxfX1BUX1IwKCVyMTEpCi0JbHBzdwlfX0xDX1JFVFVSTl9QU1cKKwltdmMJX19WRFNPX0VDVEdfQkFTRSgxNiwlcjE0KSxfX0xDX0VYSVRfVElNRVIKKwlsbWcJJXIxMSwlcjE1LF9fUFRfUjExKCVyMTEpCisJbHBzd2UJX19MQ19SRVRVUk5fUFNXCiAuTGlvX2RvbmU6CiAKICMKICMgVGhlcmUgaXMgd29yayB0b2RvLCBmaW5kIG91dCBpbiB3aGljaCBjb250ZXh0IHdlIGhhdmUgYmVlbiBpbnRlcnJ1cHRlZDoKICMgMSkgaWYgd2UgcmV0dXJuIHRvIHVzZXIgc3BhY2Ugd2UgY2FuIGRvIGFsbCBfVElGX1dPUksgd29yawotIyAyKSBpZiB3ZSByZXR1cm4gdG8ga2VybmVsIGNvZGUgYW5kIHByZWVtcHRpdmUgc2NoZWR1bGluZyBpcyBlbmFibGVkIGNoZWNrCisjIDIpIGlmIHdlIHJldHVybiB0byBrZXJuZWwgY29kZSBhbmQga3ZtIGlzIGVuYWJsZWQgY2hlY2sgaWYgd2UgbmVlZCB0bworIyAgICBtb2RpZnkgdGhlIHBzdyB0byBsZWF2ZSBTSUUKKyMgMykgaWYgd2UgcmV0dXJuIHRvIGtlcm5lbCBjb2RlIGFuZCBwcmVlbXB0aXZlIHNjaGVkdWxpbmcgaXMgZW5hYmxlZCBjaGVjawogIyAgICB0aGUgcHJlZW1wdGlvbiBjb3VudGVyIGFuZCBpZiBpdCBpcyB6ZXJvIGNhbGwgcHJlZW1wdF9zY2hlZHVsZV9pcnEKICMgQmVmb3JlIGFueSB3b3JrIGNhbiBiZSBkb25lLCBhIHN3aXRjaCB0byB0aGUga2VybmVsIHN0YWNrIGlzIHJlcXVpcmVkLgogIwpAQCAtNDg5LDIxICs1NDEsMjAgQEAKICNpZmRlZiBDT05GSUdfUFJFRU1QVAogCSMgY2hlY2sgZm9yIHByZWVtcHRpdmUgc2NoZWR1bGluZwogCWljbQklcjAsMTUsX19USV9wcmVjb3VudCglcjEyKQotCWpuegkuTGlvX3Jlc3RvcmUJCSMgcHJlZW1wdGlvbiBkaXNhYmxlZAotCXRtCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX05FRURfUkVTQ0hFRAorCWpuegkuTGlvX3Jlc3RvcmUJCSMgcHJlZW1wdGlvbiBpcyBkaXNhYmxlZAorCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX05FRURfUkVTQ0hFRAogCWpubwkuTGlvX3Jlc3RvcmUKIAkjIHN3aXRjaCB0byBrZXJuZWwgc3RhY2sKLQlsCSVyMSxfX1BUX1IxNSglcjExKQotCWFoaQklcjEsLShTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfU0laRSkKKwlsZwklcjEsX19QVF9SMTUoJXIxMSkKKwlhZ2hpCSVyMSwtKFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TSVpFKQogCW12YwlTVEFDS19GUkFNRV9PVkVSSEVBRChfX1BUX1NJWkUsJXIxKSwwKCVyMTEpCi0JeGMJX19TRl9CQUNLQ0hBSU4oNCwlcjEpLF9fU0ZfQkFDS0NIQUlOKCVyMSkKKwl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMSksX19TRl9CQUNLQ0hBSU4oJXIxKQogCWxhCSVyMTEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQoJXIxKQotCWxyCSVyMTUsJXIxCisJbGdyCSVyMTUsJXIxCiAJIyBUUkFDRV9JUlFTX09OIGFscmVhZHkgZG9uZSBhdCAuTGlvX3JldHVybiwgY2FsbAogCSMgVFJBQ0VfSVJRU19PRkYgdG8ga2VlcCB0aGluZ3Mgc3ltbWV0cmljYWwKIAlUUkFDRV9JUlFTX09GRgotCWwJJXIxLEJBU0VEKC5MY19wcmVlbXB0X2lycSkKLQliYXNyCSVyMTQsJXIxCQkjIGNhbGwgcHJlZW1wdF9zY2hlZHVsZV9pcnEKKwlicmFzbAklcjE0LHByZWVtcHRfc2NoZWR1bGVfaXJxCiAJagkuTGlvX3JldHVybgogI2Vsc2UKIAlqCS5MaW9fcmVzdG9yZQpAQCAtNTEzLDI1ICs1NjQsMjUgQEAKICMgTmVlZCB0byBkbyB3b3JrIGJlZm9yZSByZXR1cm5pbmcgdG8gdXNlcnNwYWNlLCBzd2l0Y2ggdG8ga2VybmVsIHN0YWNrCiAjCiAuTGlvX3dvcmtfdXNlcjoKLQlsCSVyMSxfX0xDX0tFUk5FTF9TVEFDSworCWxnCSVyMSxfX0xDX0tFUk5FTF9TVEFDSwogCW12YwlTVEFDS19GUkFNRV9PVkVSSEVBRChfX1BUX1NJWkUsJXIxKSwwKCVyMTEpCi0JeGMJX19TRl9CQUNLQ0hBSU4oNCwlcjEpLF9fU0ZfQkFDS0NIQUlOKCVyMSkKKwl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMSksX19TRl9CQUNLQ0hBSU4oJXIxKQogCWxhCSVyMTEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQoJXIxKQotCWxyCSVyMTUsJXIxCisJbGdyCSVyMTUsJXIxCiAKICMKICMgT25lIG9mIHRoZSB3b3JrIGJpdHMgaXMgb24uIEZpbmQgb3V0IHdoaWNoIG9uZS4KICMKIC5MaW9fd29ya190aWY6Ci0JdG0JX19MQ19DUFVfRkxBR1MrMyglcjEyKSxfQ0lGX01DQ0tfUEVORElORworCXRtCV9fTENfQ1BVX0ZMQUdTKzcsX0NJRl9NQ0NLX1BFTkRJTkcKIAlqbwkuTGlvX21jY2tfcGVuZGluZwotCXRtCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX05FRURfUkVTQ0hFRAorCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX05FRURfUkVTQ0hFRAogCWpvCS5MaW9fcmVzY2hlZHVsZQotCXRtCV9fVElfZmxhZ3MrMyglcjEyKSxfVElGX1NJR1BFTkRJTkcKKwl0bQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9TSUdQRU5ESU5HCiAJam8JLkxpb19zaWdwZW5kaW5nCi0JdG0JX19USV9mbGFncyszKCVyMTIpLF9USUZfTk9USUZZX1JFU1VNRQorCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX05PVElGWV9SRVNVTUUKIAlqbwkuTGlvX25vdGlmeV9yZXN1bWUKLQl0bQlfX0xDX0NQVV9GTEFHUyszLF9DSUZfQVNDRQorCXRtCV9fTENfQ1BVX0ZMQUdTKzcsX0NJRl9BU0NFCiAJam8JLkxpb191YWNjZXNzCiAJagkuTGlvX3JldHVybgkJIyBiZXdhcmUgb2YgY3JpdGljYWwgc2VjdGlvbiBjbGVhbnVwCiAKQEAgLTU0MCw4ICs1OTEsNyBAQAogIwogLkxpb19tY2NrX3BlbmRpbmc6CiAJIyBUUkFDRV9JUlFTX09OIGFscmVhZHkgZG9uZSBhdCAuTGlvX3JldHVybgotCWwJJXIxLEJBU0VEKC5MY19oYW5kbGVfbWNjaykKLQliYXNyCSVyMTQsJXIxCQkjIFRJRiBiaXQgd2lsbCBiZSBjbGVhcmVkIGJ5IGhhbmRsZXIKKwlicmFzbAklcjE0LHMzOTBfaGFuZGxlX21jY2sJIyBUSUYgYml0IHdpbGwgYmUgY2xlYXJlZCBieSBoYW5kbGVyCiAJVFJBQ0VfSVJRU19PRkYKIAlqCS5MaW9fcmV0dXJuCiAKQEAgLTU0OSw4ICs1OTksOCBAQAogIyBfQ0lGX0FTQ0UgaXMgc2V0LCBsb2FkIHVzZXIgc3BhY2UgYXNjZQogIwogLkxpb191YWNjZXNzOgotCW5pCV9fTENfQ1BVX0ZMQUdTKzMsMjU1LV9DSUZfQVNDRQotCWxjdGwJJWMxLCVjMSxfX0xDX1VTRVJfQVNDRQkjIGxvYWQgcHJpbWFyeSBhc2NlCisJbmkJX19MQ19DUFVfRkxBR1MrNywyNTUtX0NJRl9BU0NFCisJbGN0bGcJJWMxLCVjMSxfX0xDX1VTRVJfQVNDRQkJIyBsb2FkIHByaW1hcnkgYXNjZQogCWoJLkxpb19yZXR1cm4KIAogIwpAQCAtNTU4LDM1ICs2MDgsMzIgQEAKICMKIC5MaW9fcmVzY2hlZHVsZToKIAkjIFRSQUNFX0lSUVNfT04gYWxyZWFkeSBkb25lIGF0IC5MaW9fcmV0dXJuCi0JbAklcjEsQkFTRUQoLkxjX3NjaGVkdWxlKQogCXNzbQlfX0xDX1NWQ19ORVdfUFNXCSMgcmVlbmFibGUgaW50ZXJydXB0cwotCWJhc3IJJXIxNCwlcjEJCSMgY2FsbCBzY2hlZHVsZXIKKwlicmFzbAklcjE0LHNjaGVkdWxlCQkjIGNhbGwgc2NoZWR1bGVyCiAJc3NtCV9fTENfUEdNX05FV19QU1cJIyBkaXNhYmxlIEkvTyBhbmQgZXh0LiBpbnRlcnJ1cHRzCiAJVFJBQ0VfSVJRU19PRkYKIAlqCS5MaW9fcmV0dXJuCiAKICMKLSMgX1RJRl9TSUdQRU5ESU5HIGlzIHNldCwgY2FsbCBkb19zaWduYWwKKyMgX1RJRl9TSUdQRU5ESU5HIG9yIGlzIHNldCwgY2FsbCBkb19zaWduYWwKICMKIC5MaW9fc2lncGVuZGluZzoKIAkjIFRSQUNFX0lSUVNfT04gYWxyZWFkeSBkb25lIGF0IC5MaW9fcmV0dXJuCi0JbAklcjEsQkFTRUQoLkxjX2RvX3NpZ25hbCkKIAlzc20JX19MQ19TVkNfTkVXX1BTVwkjIHJlZW5hYmxlIGludGVycnVwdHMKLQlscgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncwotCWJhc3IJJXIxNCwlcjEJCSMgY2FsbCBkb19zaWduYWwKKwlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKKwlicmFzbAklcjE0LGRvX3NpZ25hbAogCXNzbQlfX0xDX1BHTV9ORVdfUFNXCSMgZGlzYWJsZSBJL08gYW5kIGV4dC4gaW50ZXJydXB0cwogCVRSQUNFX0lSUVNfT0ZGCiAJagkuTGlvX3JldHVybgogCiAjCi0jIF9USUZfU0lHUEVORElORyBpcyBzZXQsIGNhbGwgZG9fc2lnbmFsCisjIF9USUZfTk9USUZZX1JFU1VNRSBvciBpcyBzZXQsIGNhbGwgZG9fbm90aWZ5X3Jlc3VtZQogIwogLkxpb19ub3RpZnlfcmVzdW1lOgogCSMgVFJBQ0VfSVJRU19PTiBhbHJlYWR5IGRvbmUgYXQgLkxpb19yZXR1cm4KLQlsCSVyMSxCQVNFRCguTGNfZG9fbm90aWZ5X3Jlc3VtZSkKIAlzc20JX19MQ19TVkNfTkVXX1BTVwkjIHJlZW5hYmxlIGludGVycnVwdHMKLQlscgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncwotCWJhc3IJJXIxNCwlcjEJCSMgY2FsbCBkb19ub3RpZnlfcmVzdW1lCisJbGdyCSVyMiwlcjExCQkjIHBhc3MgcG9pbnRlciB0byBwdF9yZWdzCisJYnJhc2wJJXIxNCxkb19ub3RpZnlfcmVzdW1lCiAJc3NtCV9fTENfUEdNX05FV19QU1cJIyBkaXNhYmxlIEkvTyBhbmQgZXh0LiBpbnRlcnJ1cHRzCiAJVFJBQ0VfSVJRU19PRkYKIAlqCS5MaW9fcmV0dXJuCkBAIC01OTQsNDUgKzY0MSw0NyBAQAogLyoKICAqIEV4dGVybmFsIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUKICAqLwotCiBFTlRSWShleHRfaW50X2hhbmRsZXIpCi0Jc3RjawlfX0xDX0lOVF9DTE9DSworCVNUQ0sJX19MQ19JTlRfQ0xPQ0sKIAlzdHB0CV9fTENfQVNZTkNfRU5URVJfVElNRVIKLQlzdG0JJXI4LCVyMTUsX19MQ19TQVZFX0FSRUFfQVNZTkMKLQlsCSVyMTIsX19MQ19USFJFQURfSU5GTwotCWwJJXIxMyxfX0xDX1NWQ19ORVdfUFNXKzQKLQlsbQklcjgsJXI5LF9fTENfRVhUX09MRF9QU1cKLQl0bWgJJXI4LDB4MDAwMQkJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KLQlqegkuTGV4dF9za2lwCi0JVVBEQVRFX1ZUSU1FICVyMTQsJXIxNSxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCi0uTGV4dF9za2lwOgorCXN0bWcJJXI4LCVyMTUsX19MQ19TQVZFX0FSRUFfQVNZTkMKKwlsZwklcjEwLF9fTENfTEFTVF9CUkVBSworCWxnCSVyMTIsX19MQ19USFJFQURfSU5GTworCWxhcmwJJXIxMyxzeXN0ZW1fY2FsbAorCWxtZwklcjgsJXI5LF9fTENfRVhUX09MRF9QU1cKKwlIQU5ETEVfU0lFX0lOVEVSQ0VQVCAlcjE0LDMKIAlTV0lUQ0hfQVNZTkMgX19MQ19TQVZFX0FSRUFfQVNZTkMsX19MQ19BU1lOQ19TVEFDSyxTVEFDS19TSElGVAotCXN0bQklcjAsJXI3LF9fUFRfUjAoJXIxMSkKLQltdmMJX19QVF9SOCgzMiwlcjExKSxfX0xDX1NBVkVfQVJFQV9BU1lOQwotCXN0bQklcjgsJXI5LF9fUFRfUFNXKCVyMTEpCisJdG1oaAklcjgsMHgwMDAxCQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPworCWp6CS5MZXh0X3NraXAKKwlVUERBVEVfVlRJTUUgJXIxNCxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCisJTEFTVF9CUkVBSyAlcjE0CisuTGV4dF9za2lwOgorCXN0bWcJJXIwLCVyNyxfX1BUX1IwKCVyMTEpCisJbXZjCV9fUFRfUjgoNjQsJXIxMSksX19MQ19TQVZFX0FSRUFfQVNZTkMKKwlzdG1nCSVyOCwlcjksX19QVF9QU1coJXIxMSkKKwlsZ2hpCSVyMSxfX0xDX0VYVF9QQVJBTVMyCiAJbXZjCV9fUFRfSU5UX0NPREUoNCwlcjExKSxfX0xDX0VYVF9DUFVfQUREUgogCW12YwlfX1BUX0lOVF9QQVJNKDQsJXIxMSksX19MQ19FWFRfUEFSQU1TCi0JeGMJX19QVF9GTEFHUyg0LCVyMTEpLF9fUFRfRkxBR1MoJXIxMSkKKwltdmMJX19QVF9JTlRfUEFSTV9MT05HKDgsJXIxMSksMCglcjEpCisJeGMJX19QVF9GTEFHUyg4LCVyMTEpLF9fUFRfRkxBR1MoJXIxMSkKIAlUUkFDRV9JUlFTX09GRgotCWwJJXIxLEJBU0VEKC5MY19kb19JUlEpCi0JbHIJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKLQlsaGkJJXIzLEVYVF9JTlRFUlJVUFQKLQliYXNyCSVyMTQsJXIxCQkjIGNhbGwgZG9fSVJRCisJeGMJX19TRl9CQUNLQ0hBSU4oOCwlcjE1KSxfX1NGX0JBQ0tDSEFJTiglcjE1KQorCWxncgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncworCWxnaGkJJXIzLEVYVF9JTlRFUlJVUFQKKwlicmFzbAklcjE0LGRvX0lSUQogCWoJLkxpb19yZXR1cm4KIAogLyoKICAqIExvYWQgaWRsZSBQU1cuIFRoZSBzZWNvbmQgImhhbGYiIG9mIHRoaXMgZnVuY3Rpb24gaXMgaW4gLkxjbGVhbnVwX2lkbGUuCiAgKi8KIEVOVFJZKHBzd19pZGxlKQotCXN0CSVyMyxfX1NGX0VNUFRZKCVyMTUpCi0JYmFzcgklcjEsMAotCWxhCSVyMSwuTHBzd19pZGxlX2xwc3crNC0uKCVyMSkKLQlzdAklcjEsX19TRl9FTVBUWSs0KCVyMTUpCi0Jb2kJX19TRl9FTVBUWSs0KCVyMTUpLDB4ODAKLQlzdGNrCV9fQ0xPQ0tfSURMRV9FTlRFUiglcjIpCisJc3RnCSVyMyxfX1NGX0VNUFRZKCVyMTUpCisJbGFybAklcjEsLkxwc3dfaWRsZV9scHN3KzQKKwlzdGcJJXIxLF9fU0ZfRU1QVFkrOCglcjE1KQorCVNUQ0sJX19DTE9DS19JRExFX0VOVEVSKCVyMikKIAlzdHB0CV9fVElNRVJfSURMRV9FTlRFUiglcjIpCiAuTHBzd19pZGxlX2xwc3c6Ci0JbHBzdwlfX1NGX0VNUFRZKCVyMTUpCisJbHBzd2UJX19TRl9FTVBUWSglcjE1KQogCWJyCSVyMTQKIC5McHN3X2lkbGVfZW5kOgogCkBAIC02NDEsMTcgKzY5MCwxOSBAQAogLyoKICAqIE1hY2hpbmUgY2hlY2sgaGFuZGxlciByb3V0aW5lcwogICovCi0KIEVOVFJZKG1jY2tfaW50X2hhbmRsZXIpCi0Jc3RjawlfX0xDX01DQ0tfQ0xPQ0sKLQlzcHQJX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBCSMgcmV2YWxpZGF0ZSBjcHUgdGltZXIKLQlsbQklcjAsJXIxNSxfX0xDX0dQUkVHU19TQVZFX0FSRUEJIyByZXZhbGlkYXRlIGdwcnMKLQlsCSVyMTIsX19MQ19USFJFQURfSU5GTwotCWwJJXIxMyxfX0xDX1NWQ19ORVdfUFNXKzQKLQlsbQklcjgsJXI5LF9fTENfTUNLX09MRF9QU1cKKwlTVENLCV9fTENfTUNDS19DTE9DSworCWxhCSVyMSw0MDk1CQkjIHJldmFsaWRhdGUgcjEKKwlzcHQJX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBLTQwOTUoJXIxKQkjIHJldmFsaWRhdGUgY3B1IHRpbWVyCisJbG1nCSVyMCwlcjE1LF9fTENfR1BSRUdTX1NBVkVfQVJFQS00MDk1KCVyMSkjIHJldmFsaWRhdGUgZ3BycworCWxnCSVyMTAsX19MQ19MQVNUX0JSRUFLCisJbGcJJXIxMixfX0xDX1RIUkVBRF9JTkZPCisJbGFybAklcjEzLHN5c3RlbV9jYWxsCisJbG1nCSVyOCwlcjksX19MQ19NQ0tfT0xEX1BTVworCUhBTkRMRV9TSUVfSU5URVJDRVBUICVyMTQsNAogCXRtCV9fTENfTUNDS19DT0RFLDB4ODAJIyBzeXN0ZW0gZGFtYWdlPwogCWpvCS5MbWNja19wYW5pYwkJIyB5ZXMgLT4gcmVzdCBvZiBtY2NrIGNvZGUgaW52YWxpZAotCWxhCSVyMTQsX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBCisJbGdoaQklcjE0LF9fTENfQ1BVX1RJTUVSX1NBVkVfQVJFQQogCW12YwlfX0xDX01DQ0tfRU5URVJfVElNRVIoOCksMCglcjE0KQogCXRtCV9fTENfTUNDS19DT0RFKzUsMHgwMgkjIHN0b3JlZCBjcHUgdGltZXIgdmFsdWUgdmFsaWQ/CiAJam8JM2YKQEAgLTY2OSw3NiArNzIwLDc2IEBACiAJbXZjCV9fTENfTUNDS19FTlRFUl9USU1FUig4KSwwKCVyMTQpCiAzOgl0bQlfX0xDX01DQ0tfQ09ERSsyLDB4MDkJIyBtd3AgKyBpYSBvZiBvbGQgcHN3IHZhbGlkPwogCWpubwkuTG1jY2tfcGFuaWMJCSMgbm8gLT4gc2tpcCBjbGVhbnVwIGNyaXRpY2FsCisJU1dJVENIX0FTWU5DIF9fTENfR1BSRUdTX1NBVkVfQVJFQSs2NCxfX0xDX1BBTklDX1NUQUNLLFBBR0VfU0hJRlQKIAl0bQklcjgsMHgwMDAxCQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPwogCWp6CS5MbWNja19za2lwCi0JVVBEQVRFX1ZUSU1FICVyMTQsJXIxNSxfX0xDX01DQ0tfRU5URVJfVElNRVIKKwlVUERBVEVfVlRJTUUgJXIxNCxfX0xDX01DQ0tfRU5URVJfVElNRVIKKwlMQVNUX0JSRUFLICVyMTQKIC5MbWNja19za2lwOgotCVNXSVRDSF9BU1lOQyBfX0xDX0dQUkVHU19TQVZFX0FSRUErMzIsX19MQ19QQU5JQ19TVEFDSyxQQUdFX1NISUZUCi0Jc3RtCSVyMCwlcjcsX19QVF9SMCglcjExKQotCW12YwlfX1BUX1I4KDMyLCVyMTEpLF9fTENfR1BSRUdTX1NBVkVfQVJFQSszMgotCXN0bQklcjgsJXI5LF9fUFRfUFNXKCVyMTEpCi0JeGMJX19QVF9GTEFHUyg0LCVyMTEpLF9fUFRfRkxBR1MoJXIxMSkKLQl4YwlfX1NGX0JBQ0tDSEFJTig0LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpCi0JbAklcjEsQkFTRUQoLkxjX2RvX21hY2hpbmVfY2hlY2spCi0JbHIJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKLQliYXNyCSVyMTQsJXIxCQkjIGNhbGwgczM5MF9kb19tYWNoaW5lX2NoZWNrCisJbGdoaQklcjE0LF9fTENfR1BSRUdTX1NBVkVfQVJFQSs2NAorCXN0bWcJJXIwLCVyNyxfX1BUX1IwKCVyMTEpCisJbXZjCV9fUFRfUjgoNjQsJXIxMSksMCglcjE0KQorCXN0bWcJJXI4LCVyOSxfX1BUX1BTVyglcjExKQorCXhjCV9fUFRfRkxBR1MoOCwlcjExKSxfX1BUX0ZMQUdTKCVyMTEpCisJeGMJX19TRl9CQUNLQ0hBSU4oOCwlcjE1KSxfX1NGX0JBQ0tDSEFJTiglcjE1KQorCWxncgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncworCWJyYXNsCSVyMTQsczM5MF9kb19tYWNoaW5lX2NoZWNrCiAJdG0JX19QVF9QU1crMSglcjExKSwweDAxCSMgcmV0dXJuaW5nIHRvIHVzZXIgPwogCWpubwkuTG1jY2tfcmV0dXJuCi0JbAklcjEsX19MQ19LRVJORUxfU1RBQ0sJIyBzd2l0Y2ggdG8ga2VybmVsIHN0YWNrCisJbGcJJXIxLF9fTENfS0VSTkVMX1NUQUNLCSMgc3dpdGNoIHRvIGtlcm5lbCBzdGFjawogCW12YwlTVEFDS19GUkFNRV9PVkVSSEVBRChfX1BUX1NJWkUsJXIxKSwwKCVyMTEpCi0JeGMJX19TRl9CQUNLQ0hBSU4oNCwlcjEpLF9fU0ZfQkFDS0NIQUlOKCVyMSkKLQlsYQklcjExLFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCi0JbHIJJXIxNSwlcjEKKwl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMSksX19TRl9CQUNLQ0hBSU4oJXIxKQorCWxhCSVyMTEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQoJXIxKQorCWxncgklcjE1LCVyMQogCXNzbQlfX0xDX1BHTV9ORVdfUFNXCSMgdHVybiBkYXQgb24sIGtlZXAgaXJxcyBvZmYKLQl0bQlfX0xDX0NQVV9GTEFHUyszLF9DSUZfTUNDS19QRU5ESU5HCisJdG0JX19MQ19DUFVfRkxBR1MrNyxfQ0lGX01DQ0tfUEVORElORwogCWpubwkuTG1jY2tfcmV0dXJuCiAJVFJBQ0VfSVJRU19PRkYKLQlsCSVyMSxCQVNFRCguTGNfaGFuZGxlX21jY2spCi0JYmFzcgklcjE0LCVyMQkJIyBjYWxsIHMzOTBfaGFuZGxlX21jY2sKKwlicmFzbAklcjE0LHMzOTBfaGFuZGxlX21jY2sKIAlUUkFDRV9JUlFTX09OCiAuTG1jY2tfcmV0dXJuOgotCW12YwlfX0xDX1JFVFVSTl9NQ0NLX1BTVyg4KSxfX1BUX1BTVyglcjExKSAjIG1vdmUgcmV0dXJuIFBTVworCWxnCSVyMTQsX19MQ19WRFNPX1BFUl9DUFUKKwlsbWcJJXIwLCVyMTAsX19QVF9SMCglcjExKQorCW12YwlfX0xDX1JFVFVSTl9NQ0NLX1BTVygxNiksX19QVF9QU1coJXIxMSkgIyBtb3ZlIHJldHVybiBQU1cKIAl0bQlfX0xDX1JFVFVSTl9NQ0NLX1BTVysxLDB4MDEgIyByZXR1cm5pbmcgdG8gdXNlciA/CiAJam5vCTBmCi0JbG0JJXIwLCVyMTUsX19QVF9SMCglcjExKQogCXN0cHQJX19MQ19FWElUX1RJTUVSCi0JbHBzdwlfX0xDX1JFVFVSTl9NQ0NLX1BTVwotMDoJbG0JJXIwLCVyMTUsX19QVF9SMCglcjExKQotCWxwc3cJX19MQ19SRVRVUk5fTUNDS19QU1cKKwltdmMJX19WRFNPX0VDVEdfQkFTRSgxNiwlcjE0KSxfX0xDX0VYSVRfVElNRVIKKzA6CWxtZwklcjExLCVyMTUsX19QVF9SMTEoJXIxMSkKKwlscHN3ZQlfX0xDX1JFVFVSTl9NQ0NLX1BTVwogCiAuTG1jY2tfcGFuaWM6Ci0JbAklcjE0LF9fTENfUEFOSUNfU1RBQ0sKLQlzbHIJJXIxNCwlcjE1Ci0Jc3JhCSVyMTQsUEFHRV9TSElGVAorCWxnCSVyMTQsX19MQ19QQU5JQ19TVEFDSworCXNsZ3IJJXIxNCwlcjE1CisJc3JhZwklcjE0LCVyMTQsUEFHRV9TSElGVAogCWp6CTBmCi0JbAklcjE1LF9fTENfUEFOSUNfU1RBQ0sKLQlqCS5MbWNja19za2lwCi0wOglhaGkJJXIxNSwtKFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TSVpFKQorCWxnCSVyMTUsX19MQ19QQU5JQ19TVEFDSworMDoJYWdoaQklcjE1LC0oU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1BUX1NJWkUpCiAJagkuTG1jY2tfc2tpcAogCiAjCiAjIFBTVyByZXN0YXJ0IGludGVycnVwdCBoYW5kbGVyCiAjCiBFTlRSWShyZXN0YXJ0X2ludF9oYW5kbGVyKQotCXN0CSVyMTUsX19MQ19TQVZFX0FSRUFfUkVTVEFSVAotCWwJJXIxNSxfX0xDX1JFU1RBUlRfU1RBQ0sKLQlhaGkJJXIxNSwtX19QVF9TSVpFCQkJIyBjcmVhdGUgcHRfcmVncyBvbiBzdGFjaworCXN0ZwklcjE1LF9fTENfU0FWRV9BUkVBX1JFU1RBUlQKKwlsZwklcjE1LF9fTENfUkVTVEFSVF9TVEFDSworCWFnaGkJJXIxNSwtX19QVF9TSVpFCQkJIyBjcmVhdGUgcHRfcmVncyBvbiBzdGFjawogCXhjCTAoX19QVF9TSVpFLCVyMTUpLDAoJXIxNSkKLQlzdG0JJXIwLCVyMTQsX19QVF9SMCglcjE1KQotCW12YwlfX1BUX1IxNSg0LCVyMTUpLF9fTENfU0FWRV9BUkVBX1JFU1RBUlQKLQltdmMJX19QVF9QU1coOCwlcjE1KSxfX0xDX1JTVF9PTERfUFNXICMgc3RvcmUgcmVzdGFydCBvbGQgcHN3Ci0JYWhpCSVyMTUsLVNUQUNLX0ZSQU1FX09WRVJIRUFECSMgY3JlYXRlIHN0YWNrIGZyYW1lIG9uIHN0YWNrCisJc3RtZwklcjAsJXIxNCxfX1BUX1IwKCVyMTUpCisJbXZjCV9fUFRfUjE1KDgsJXIxNSksX19MQ19TQVZFX0FSRUFfUkVTVEFSVAorCW12YwlfX1BUX1BTVygxNiwlcjE1KSxfX0xDX1JTVF9PTERfUFNXICMgc3RvcmUgcmVzdGFydCBvbGQgcHN3CisJYWdoaQklcjE1LC1TVEFDS19GUkFNRV9PVkVSSEVBRAkjIGNyZWF0ZSBzdGFjayBmcmFtZSBvbiBzdGFjawogCXhjCTAoU1RBQ0tfRlJBTUVfT1ZFUkhFQUQsJXIxNSksMCglcjE1KQotCWwJJXIxLF9fTENfUkVTVEFSVF9GTgkJIyBsb2FkIGZuLCBwYXJtICYgc291cmNlIGNwdQotCWwJJXIyLF9fTENfUkVTVEFSVF9EQVRBCi0JbAklcjMsX19MQ19SRVNUQVJUX1NPVVJDRQotCWx0cgklcjMsJXIzCQkJCSMgdGVzdCBzb3VyY2UgY3B1IGFkZHJlc3MKKwlsZwklcjEsX19MQ19SRVNUQVJUX0ZOCQkjIGxvYWQgZm4sIHBhcm0gJiBzb3VyY2UgY3B1CisJbGcJJXIyLF9fTENfUkVTVEFSVF9EQVRBCisJbGcJJXIzLF9fTENfUkVTVEFSVF9TT1VSQ0UKKwlsdGdyCSVyMywlcjMJCQkJIyB0ZXN0IHNvdXJjZSBjcHUgYWRkcmVzcwogCWptCTFmCQkJCSMgbmVnYXRpdmUgLT4gc2tpcCBzb3VyY2Ugc3RvcAogMDoJc2lncAklcjQsJXIzLFNJR1BfU0VOU0UJCSMgc2lncCBzZW5zZSB0byBzb3VyY2UgY3B1CiAJYnJjCTEwLDBiCQkJCSMgd2FpdCBmb3Igc3RhdHVzIHN0b3JlZAogMToJYmFzcgklcjE0LCVyMQkJCSMgY2FsbCBmdW5jdGlvbgogCXN0YXAJX19TRl9FTVBUWSglcjE1KQkJIyBzdG9yZSBjcHUgYWRkcmVzcwotCWxoCSVyMyxfX1NGX0VNUFRZKCVyMTUpCisJbGxnaAklcjMsX19TRl9FTVBUWSglcjE1KQogMjoJc2lncAklcjQsJXIzLFNJR1BfU1RPUAkJIyBzaWdwIHN0b3AgdG8gY3VycmVudCBjcHUKIAlicmMJMiwyYgogMzoJagkzYgpAQCAtNzUyLDIxNSArODAzLDI1NyBAQAogICogU2V0dXAgYSBwdF9yZWdzIHNvIHRoYXQgc2hvd190cmFjZSBjYW4gcHJvdmlkZSBhIGdvb2QgY2FsbCB0cmFjZS4KICAqLwogc3RhY2tfb3ZlcmZsb3c6Ci0JbAklcjE1LF9fTENfUEFOSUNfU1RBQ0sJIyBjaGFuZ2UgdG8gcGFuaWMgc3RhY2sKKwlsZwklcjE1LF9fTENfUEFOSUNfU1RBQ0sJIyBjaGFuZ2UgdG8gcGFuaWMgc3RhY2sKIAlsYQklcjExLFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCi0Jc3RtCSVyMCwlcjcsX19QVF9SMCglcjExKQotCXN0bQklcjgsJXI5LF9fUFRfUFNXKCVyMTEpCi0JbXZjCV9fUFRfUjgoMzIsJXIxMSksMCglcjE0KQotCWwJJXIxLEJBU0VEKDFmKQotCXhjCV9fU0ZfQkFDS0NIQUlOKDQsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkKLQlscgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncwotCWJyCSVyMQkJCSMgYnJhbmNoIHRvIGtlcm5lbF9zdGFja19vdmVyZmxvdwotMToJLmxvbmcJa2VybmVsX3N0YWNrX292ZXJmbG93CisJc3RtZwklcjAsJXI3LF9fUFRfUjAoJXIxMSkKKwlzdG1nCSVyOCwlcjksX19QVF9QU1coJXIxMSkKKwltdmMJX19QVF9SOCg2NCwlcjExKSwwKCVyMTQpCisJc3RnCSVyMTAsX19QVF9PUklHX0dQUjIoJXIxMSkgIyBzdG9yZSBsYXN0IGJyZWFrIHRvIG9yaWdfZ3ByMgorCXhjCV9fU0ZfQkFDS0NIQUlOKDgsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkKKwlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKKwlqZwlrZXJuZWxfc3RhY2tfb3ZlcmZsb3cKICNlbmRpZgogCisJLmFsaWduCTgKIC5MY2xlYW51cF90YWJsZToKLQkubG9uZwlzeXN0ZW1fY2FsbCArIDB4ODAwMDAwMDAKLQkubG9uZwkuTHN5c2NfZG9fc3ZjICsgMHg4MDAwMDAwMAotCS5sb25nCS5Mc3lzY190aWYgKyAweDgwMDAwMDAwCi0JLmxvbmcJLkxzeXNjX3Jlc3RvcmUgKyAweDgwMDAwMDAwCi0JLmxvbmcJLkxzeXNjX2RvbmUgKyAweDgwMDAwMDAwCi0JLmxvbmcJLkxpb190aWYgKyAweDgwMDAwMDAwCi0JLmxvbmcJLkxpb19yZXN0b3JlICsgMHg4MDAwMDAwMAotCS5sb25nCS5MaW9fZG9uZSArIDB4ODAwMDAwMDAKLQkubG9uZwlwc3dfaWRsZSArIDB4ODAwMDAwMDAKLQkubG9uZwkuTHBzd19pZGxlX2VuZCArIDB4ODAwMDAwMDAKKwkucXVhZAlzeXN0ZW1fY2FsbAorCS5xdWFkCS5Mc3lzY19kb19zdmMKKwkucXVhZAkuTHN5c2NfdGlmCisJLnF1YWQJLkxzeXNjX3Jlc3RvcmUKKwkucXVhZAkuTHN5c2NfZG9uZQorCS5xdWFkCS5MaW9fdGlmCisJLnF1YWQJLkxpb19yZXN0b3JlCisJLnF1YWQJLkxpb19kb25lCisJLnF1YWQJcHN3X2lkbGUKKwkucXVhZAkuTHBzd19pZGxlX2VuZAogCiBjbGVhbnVwX2NyaXRpY2FsOgotCWNsCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUpCSMgc3lzdGVtX2NhbGwKKwljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSkJIyBzeXN0ZW1fY2FsbAogCWpsCTBmCi0JY2wJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSs0KQkjIC5Mc3lzY19kb19zdmMKKwljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSs4KQkjIC5Mc3lzY19kb19zdmMKIAlqbAkuTGNsZWFudXBfc3lzdGVtX2NhbGwKLQljbAklcjksQkFTRUQoLkxjbGVhbnVwX3RhYmxlKzgpCSMgLkxzeXNjX3RpZgorCWNsZwklcjksQkFTRUQoLkxjbGVhbnVwX3RhYmxlKzE2KQkjIC5Mc3lzY190aWYKIAlqbAkwZgotCWNsCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUrMTIpCSMgLkxzeXNjX3Jlc3RvcmUKKwljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSsyNCkJIyAuTHN5c2NfcmVzdG9yZQogCWpsCS5MY2xlYW51cF9zeXNjX3RpZgotCWNsCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUrMTYpCSMgLkxzeXNjX2RvbmUKKwljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSszMikJIyAuTHN5c2NfZG9uZQogCWpsCS5MY2xlYW51cF9zeXNjX3Jlc3RvcmUKLQljbAklcjksQkFTRUQoLkxjbGVhbnVwX3RhYmxlKzIwKQkjIC5MaW9fdGlmCisJY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUrNDApCSMgLkxpb190aWYKIAlqbAkwZgotCWNsCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUrMjQpCSMgLkxpb19yZXN0b3JlCisJY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUrNDgpCSMgLkxpb19yZXN0b3JlCiAJamwJLkxjbGVhbnVwX2lvX3RpZgotCWNsCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUrMjgpCSMgLkxpb19kb25lCisJY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUrNTYpCSMgLkxpb19kb25lCiAJamwJLkxjbGVhbnVwX2lvX3Jlc3RvcmUKLQljbAklcjksQkFTRUQoLkxjbGVhbnVwX3RhYmxlKzMyKQkjIHBzd19pZGxlCisJY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUrNjQpCSMgcHN3X2lkbGUKIAlqbAkwZgotCWNsCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUrMzYpCSMgLkxwc3dfaWRsZV9lbmQKKwljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSs3MikJIyAuTHBzd19pZGxlX2VuZAogCWpsCS5MY2xlYW51cF9pZGxlCiAwOglicgklcjE0CiAKKwogLkxjbGVhbnVwX3N5c3RlbV9jYWxsOgogCSMgY2hlY2sgaWYgc3RwdCBoYXMgYmVlbiBleGVjdXRlZAotCWNsCSVyOSxCQVNFRCguTGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbikKKwljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF9zeXN0ZW1fY2FsbF9pbnNuKQogCWpoCTBmCiAJbXZjCV9fTENfU1lOQ19FTlRFUl9USU1FUig4KSxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCi0JY2hpCSVyMTEsX19MQ19TQVZFX0FSRUFfQVNZTkMKKwljZ2hpCSVyMTEsX19MQ19TQVZFX0FSRUFfQVNZTkMKIAlqZQkwZgogCW12YwlfX0xDX1NZTkNfRU5URVJfVElNRVIoOCksX19MQ19NQ0NLX0VOVEVSX1RJTUVSCi0wOgkjIGNoZWNrIGlmIHN0bSBoYXMgYmVlbiBleGVjdXRlZAotCWNsCSVyOSxCQVNFRCguTGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbis0KQorMDoJIyBjaGVjayBpZiBzdG1nIGhhcyBiZWVuIGV4ZWN1dGVkCisJY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbis4KQogCWpoCTBmCi0JbXZjCV9fTENfU0FWRV9BUkVBX1NZTkMoMzIpLDAoJXIxMSkKLTA6CSMgc2V0IHVwIHNhdmVkIHJlZ2lzdGVycyByMTIsIGFuZCByMTMKLQlzdAklcjEyLDE2KCVyMTEpCQkjIHIxMiB0aHJlYWQtaW5mbyBwb2ludGVyCi0Jc3QJJXIxMywyMCglcjExKQkJIyByMTMgbGl0ZXJhbC1wb29sIHBvaW50ZXIKLQkjIGNoZWNrIGlmIHRoZSB1c2VyIHRpbWUgY2FsY3VsYXRpb24gaGFzIGJlZW4gZG9uZQotCWNsCSVyOSxCQVNFRCguTGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbis4KQorCW12YwlfX0xDX1NBVkVfQVJFQV9TWU5DKDY0KSwwKCVyMTEpCiswOgkjIGNoZWNrIGlmIGJhc2UgcmVnaXN0ZXIgc2V0dXAgKyBUSUYgYml0IGxvYWQgaGFzIGJlZW4gZG9uZQorCWNsZwklcjksQkFTRUQoLkxjbGVhbnVwX3N5c3RlbV9jYWxsX2luc24rMTYpCisJamhlCTBmCisJIyBzZXQgdXAgc2F2ZWQgcmVnaXN0ZXJzIHIxMCBhbmQgcjEyCisJc3RnCSVyMTAsMTYoJXIxMSkJCSMgcjEwIGxhc3QgYnJlYWsKKwlzdGcJJXIxMiwzMiglcjExKQkJIyByMTIgdGhyZWFkLWluZm8gcG9pbnRlcgorMDoJIyBjaGVjayBpZiB0aGUgdXNlciB0aW1lIHVwZGF0ZSBoYXMgYmVlbiBkb25lCisJY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbisyNCkKIAlqaAkwZgotCWwJJXIxMCxfX0xDX0VYSVRfVElNRVIKLQlsCSVyMTUsX19MQ19FWElUX1RJTUVSKzQKLQlTVUI2NAklcjEwLCVyMTUsX19MQ19TWU5DX0VOVEVSX1RJTUVSCi0JQURENjQJJXIxMCwlcjE1LF9fTENfVVNFUl9USU1FUgotCXN0CSVyMTAsX19MQ19VU0VSX1RJTUVSCi0Jc3QJJXIxNSxfX0xDX1VTRVJfVElNRVIrNAotMDoJIyBjaGVjayBpZiB0aGUgc3lzdGVtIHRpbWUgY2FsY3VsYXRpb24gaGFzIGJlZW4gZG9uZQotCWNsCSVyOSxCQVNFRCguTGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbisxMikKKwlsZwklcjE1LF9fTENfRVhJVF9USU1FUgorCXNsZwklcjE1LF9fTENfU1lOQ19FTlRFUl9USU1FUgorCWFsZwklcjE1LF9fTENfVVNFUl9USU1FUgorCXN0ZwklcjE1LF9fTENfVVNFUl9USU1FUgorMDoJIyBjaGVjayBpZiB0aGUgc3lzdGVtIHRpbWUgdXBkYXRlIGhhcyBiZWVuIGRvbmUKKwljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF9zeXN0ZW1fY2FsbF9pbnNuKzMyKQogCWpoCTBmCi0JbAklcjEwLF9fTENfTEFTVF9VUERBVEVfVElNRVIKLQlsCSVyMTUsX19MQ19MQVNUX1VQREFURV9USU1FUis0Ci0JU1VCNjQJJXIxMCwlcjE1LF9fTENfRVhJVF9USU1FUgotCUFERDY0CSVyMTAsJXIxNSxfX0xDX1NZU1RFTV9USU1FUgotCXN0CSVyMTAsX19MQ19TWVNURU1fVElNRVIKLQlzdAklcjE1LF9fTENfU1lTVEVNX1RJTUVSKzQKKwlsZwklcjE1LF9fTENfTEFTVF9VUERBVEVfVElNRVIKKwlzbGcJJXIxNSxfX0xDX0VYSVRfVElNRVIKKwlhbGcJJXIxNSxfX0xDX1NZU1RFTV9USU1FUgorCXN0ZwklcjE1LF9fTENfU1lTVEVNX1RJTUVSCiAwOgkjIHVwZGF0ZSBhY2NvdW50aW5nIHRpbWUgc3RhbXAKIAltdmMJX19MQ19MQVNUX1VQREFURV9USU1FUig4KSxfX0xDX1NZTkNfRU5URVJfVElNRVIKLQkjIHNldCB1cCBzYXZlZCByZWdpc3RlciAxMQotCWwJJXIxNSxfX0xDX0tFUk5FTF9TVEFDSworCSMgZG8gTEFTVF9CUkVBSworCWxnCSVyOSwxNiglcjExKQorCXNyYWcJJXI5LCVyOSwyMworCWp6CTBmCisJbXZjCV9fVElfbGFzdF9icmVhayg4LCVyMTIpLDE2KCVyMTEpCiswOgkjIHNldCB1cCBzYXZlZCByZWdpc3RlciByMTEKKwlsZwklcjE1LF9fTENfS0VSTkVMX1NUQUNLCiAJbGEJJXI5LFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCi0Jc3QJJXI5LDEyKCVyMTEpCQkjIHIxMSBwdF9yZWdzIHBvaW50ZXIKKwlzdGcJJXI5LDI0KCVyMTEpCQkjIHIxMSBwdF9yZWdzIHBvaW50ZXIKIAkjIGZpbGwgcHRfcmVncwotCW12YwlfX1BUX1I4KDMyLCVyOSksX19MQ19TQVZFX0FSRUFfU1lOQwotCXN0bQklcjAsJXI3LF9fUFRfUjAoJXI5KQotCW12YwlfX1BUX1BTVyg4LCVyOSksX19MQ19TVkNfT0xEX1BTVworCW12YwlfX1BUX1I4KDY0LCVyOSksX19MQ19TQVZFX0FSRUFfU1lOQworCXN0bWcJJXIwLCVyNyxfX1BUX1IwKCVyOSkKKwltdmMJX19QVF9QU1coMTYsJXI5KSxfX0xDX1NWQ19PTERfUFNXCiAJbXZjCV9fUFRfSU5UX0NPREUoNCwlcjkpLF9fTENfU1ZDX0lMQwotCXhjCV9fUFRfRkxBR1MoNCwlcjkpLF9fUFRfRkxBR1MoJXI5KQotCW12aQlfX1BUX0ZMQUdTKzMoJXI5KSxfUElGX1NZU0NBTEwKLQkjIHNldHVwIHNhdmVkIHJlZ2lzdGVyIDE1Ci0Jc3QJJXIxNSwyOCglcjExKQkJIyByMTUgc3RhY2sgcG9pbnRlcgorCXhjCV9fUFRfRkxBR1MoOCwlcjkpLF9fUFRfRkxBR1MoJXI5KQorCW12aQlfX1BUX0ZMQUdTKzcoJXI5KSxfUElGX1NZU0NBTEwKKwkjIHNldHVwIHNhdmVkIHJlZ2lzdGVyIHIxNQorCXN0ZwklcjE1LDU2KCVyMTEpCQkjIHIxNSBzdGFjayBwb2ludGVyCiAJIyBzZXQgbmV3IHBzdyBhZGRyZXNzIGFuZCBleGl0Ci0JbAklcjksQkFTRUQoLkxjbGVhbnVwX3RhYmxlKzQpCSMgLkxzeXNjX2RvX3N2YyArIDB4ODAwMDAwMDAKKwlsYXJsCSVyOSwuTHN5c2NfZG9fc3ZjCiAJYnIJJXIxNAogLkxjbGVhbnVwX3N5c3RlbV9jYWxsX2luc246Ci0JLmxvbmcJc3lzdGVtX2NhbGwgKyAweDgwMDAwMDAwCi0JLmxvbmcJLkxzeXNjX3N0bSArIDB4ODAwMDAwMDAKLQkubG9uZwkuTHN5c2NfdnRpbWUgKyAweDgwMDAwMDAwICsgMzYKLQkubG9uZwkuTHN5c2NfdnRpbWUgKyAweDgwMDAwMDAwICsgNzYKKwkucXVhZAlzeXN0ZW1fY2FsbAorCS5xdWFkCS5Mc3lzY19zdG1nCisJLnF1YWQJLkxzeXNjX3BlcgorCS5xdWFkCS5Mc3lzY192dGltZSsxOAorCS5xdWFkCS5Mc3lzY192dGltZSs0MgogCiAuTGNsZWFudXBfc3lzY190aWY6Ci0JbAklcjksQkFTRUQoLkxjbGVhbnVwX3RhYmxlKzgpCSMgLkxzeXNjX3RpZiArIDB4ODAwMDAwMDAKKwlsYXJsCSVyOSwuTHN5c2NfdGlmCiAJYnIJJXIxNAogCiAuTGNsZWFudXBfc3lzY19yZXN0b3JlOgotCWNsCSVyOSxCQVNFRCguTGNsZWFudXBfc3lzY19yZXN0b3JlX2luc24pCi0JamhlCTBmCi0JbAklcjksMTIoJXIxMSkJCSMgZ2V0IHNhdmVkIHBvaW50ZXIgdG8gcHRfcmVncwotCW12YwlfX0xDX1JFVFVSTl9QU1coOCksX19QVF9QU1coJXI5KQotCW12YwkwKDMyLCVyMTEpLF9fUFRfUjgoJXI5KQotCWxtCSVyMCwlcjcsX19QVF9SMCglcjkpCi0wOglsbQklcjgsJXI5LF9fTENfUkVUVVJOX1BTVworCWNsZwklcjksQkFTRUQoLkxjbGVhbnVwX3N5c2NfcmVzdG9yZV9pbnNuKQorCWplCTBmCisJbGcJJXI5LDI0KCVyMTEpCQkjIGdldCBzYXZlZCBwb2ludGVyIHRvIHB0X3JlZ3MKKwltdmMJX19MQ19SRVRVUk5fUFNXKDE2KSxfX1BUX1BTVyglcjkpCisJbXZjCTAoNjQsJXIxMSksX19QVF9SOCglcjkpCisJbG1nCSVyMCwlcjcsX19QVF9SMCglcjkpCiswOglsbWcJJXI4LCVyOSxfX0xDX1JFVFVSTl9QU1cKIAlicgklcjE0CiAuTGNsZWFudXBfc3lzY19yZXN0b3JlX2luc246Ci0JLmxvbmcJLkxzeXNjX2RvbmUgLSA0ICsgMHg4MDAwMDAwMAorCS5xdWFkCS5Mc3lzY19kb25lIC0gNAogCiAuTGNsZWFudXBfaW9fdGlmOgotCWwJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSsyMCkJIyAuTGlvX3RpZiArIDB4ODAwMDAwMDAKKwlsYXJsCSVyOSwuTGlvX3RpZgogCWJyCSVyMTQKIAogLkxjbGVhbnVwX2lvX3Jlc3RvcmU6Ci0JY2wJJXI5LEJBU0VEKC5MY2xlYW51cF9pb19yZXN0b3JlX2luc24pCi0JamhlCTBmCi0JbAklcjksMTIoJXIxMSkJCSMgZ2V0IHNhdmVkIHIxMSBwb2ludGVyIHRvIHB0X3JlZ3MKLQltdmMJX19MQ19SRVRVUk5fUFNXKDgpLF9fUFRfUFNXKCVyOSkKLQltdmMJMCgzMiwlcjExKSxfX1BUX1I4KCVyOSkKLQlsbQklcjAsJXI3LF9fUFRfUjAoJXI5KQotMDoJbG0JJXI4LCVyOSxfX0xDX1JFVFVSTl9QU1cKKwljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF9pb19yZXN0b3JlX2luc24pCisJamUJMGYKKwlsZwklcjksMjQoJXIxMSkJCSMgZ2V0IHNhdmVkIHIxMSBwb2ludGVyIHRvIHB0X3JlZ3MKKwltdmMJX19MQ19SRVRVUk5fUFNXKDE2KSxfX1BUX1BTVyglcjkpCisJbXZjCTAoNjQsJXIxMSksX19QVF9SOCglcjkpCisJbG1nCSVyMCwlcjcsX19QVF9SMCglcjkpCiswOglsbWcJJXI4LCVyOSxfX0xDX1JFVFVSTl9QU1cKIAlicgklcjE0CiAuTGNsZWFudXBfaW9fcmVzdG9yZV9pbnNuOgotCS5sb25nCS5MaW9fZG9uZSAtIDQgKyAweDgwMDAwMDAwCisJLnF1YWQJLkxpb19kb25lIC0gNAogCiAuTGNsZWFudXBfaWRsZToKIAkjIGNvcHkgaW50ZXJydXB0IGNsb2NrICYgY3B1IHRpbWVyCiAJbXZjCV9fQ0xPQ0tfSURMRV9FWElUKDgsJXIyKSxfX0xDX0lOVF9DTE9DSwogCW12YwlfX1RJTUVSX0lETEVfRVhJVCg4LCVyMiksX19MQ19BU1lOQ19FTlRFUl9USU1FUgotCWNoaQklcjExLF9fTENfU0FWRV9BUkVBX0FTWU5DCisJY2doaQklcjExLF9fTENfU0FWRV9BUkVBX0FTWU5DCiAJamUJMGYKIAltdmMJX19DTE9DS19JRExFX0VYSVQoOCwlcjIpLF9fTENfTUNDS19DTE9DSwogCW12YwlfX1RJTUVSX0lETEVfRVhJVCg4LCVyMiksX19MQ19NQ0NLX0VOVEVSX1RJTUVSCi0wOgkjIGNoZWNrIGlmIHN0Y2sgaGFzIGJlZW4gZXhlY3V0ZWQKLQljbAklcjksQkFTRUQoLkxjbGVhbnVwX2lkbGVfaW5zbikKKzA6CSMgY2hlY2sgaWYgc3RjayAmIHN0cHQgaGF2ZSBiZWVuIGV4ZWN1dGVkCisJY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfaWRsZV9pbnNuKQogCWpoZQkxZgogCW12YwlfX0NMT0NLX0lETEVfRU5URVIoOCwlcjIpLF9fQ0xPQ0tfSURMRV9FWElUKCVyMikKLQltdmMJX19USU1FUl9JRExFX0VOVEVSKDgsJXIyKSxfX1RJTUVSX0lETEVfRVhJVCglcjMpCisJbXZjCV9fVElNRVJfSURMRV9FTlRFUig4LCVyMiksX19USU1FUl9JRExFX0VYSVQoJXIyKQogMToJIyBhY2NvdW50IHN5c3RlbSB0aW1lIGdvaW5nIGlkbGUKLQlsbQklcjksJXIxMCxfX0xDX1NURUFMX1RJTUVSCi0JQURENjQJJXI5LCVyMTAsX19DTE9DS19JRExFX0VOVEVSKCVyMikKLQlTVUI2NAklcjksJXIxMCxfX0xDX0xBU1RfVVBEQVRFX0NMT0NLCi0Jc3RtCSVyOSwlcjEwLF9fTENfU1RFQUxfVElNRVIKKwlsZwklcjksX19MQ19TVEVBTF9USU1FUgorCWFsZwklcjksX19DTE9DS19JRExFX0VOVEVSKCVyMikKKwlzbGcJJXI5LF9fTENfTEFTVF9VUERBVEVfQ0xPQ0sKKwlzdGcJJXI5LF9fTENfU1RFQUxfVElNRVIKIAltdmMJX19MQ19MQVNUX1VQREFURV9DTE9DSyg4KSxfX0NMT0NLX0lETEVfRVhJVCglcjIpCi0JbG0JJXI5LCVyMTAsX19MQ19TWVNURU1fVElNRVIKLQlBREQ2NAklcjksJXIxMCxfX0xDX0xBU1RfVVBEQVRFX1RJTUVSCi0JU1VCNjQJJXI5LCVyMTAsX19USU1FUl9JRExFX0VOVEVSKCVyMikKLQlzdG0JJXI5LCVyMTAsX19MQ19TWVNURU1fVElNRVIKKwlsZwklcjksX19MQ19TWVNURU1fVElNRVIKKwlhbGcJJXI5LF9fTENfTEFTVF9VUERBVEVfVElNRVIKKwlzbGcJJXI5LF9fVElNRVJfSURMRV9FTlRFUiglcjIpCisJc3RnCSVyOSxfX0xDX1NZU1RFTV9USU1FUgogCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fVElNRVJfSURMRV9FWElUKCVyMikKIAkjIHByZXBhcmUgcmV0dXJuIHBzdwotCW4JJXI4LEJBU0VEKC5MY2xlYW51cF9pZGxlX3dhaXQpCSMgY2xlYXIgaXJxICYgd2FpdCBzdGF0ZSBiaXRzCi0JbAklcjksMjQoJXIxMSkJCQkjIHJldHVybiBmcm9tIHBzd19pZGxlCisJbmloaAklcjgsMHhmY2ZkCQkjIGNsZWFyIGlycSAmIHdhaXQgc3RhdGUgYml0cworCWxnCSVyOSw0OCglcjExKQkJIyByZXR1cm4gZnJvbSBwc3dfaWRsZQogCWJyCSVyMTQKIC5MY2xlYW51cF9pZGxlX2luc246Ci0JLmxvbmcJLkxwc3dfaWRsZV9scHN3ICsgMHg4MDAwMDAwMAotLkxjbGVhbnVwX2lkbGVfd2FpdDoKLQkubG9uZwkweGZjZmRmZmZmCisJLnF1YWQJLkxwc3dfaWRsZV9scHN3CiAKIC8qCiAgKiBJbnRlZ2VyIGNvbnN0YW50cwogICovCi0JLmFsaWduCTQKLS5MbnJfc3lzY2FsbHM6Ci0JLmxvbmcJTlJfc3lzY2FsbHMKLS5MdnRpbWVyX21heDoKLQkucXVhZAkweDdmZmZmZmZmZmZmZmZmZmYKKwkuYWxpZ24JOAorLkxjcml0aWNhbF9zdGFydDoKKwkucXVhZAkuTF9fY3JpdGljYWxfc3RhcnQKKy5MY3JpdGljYWxfbGVuZ3RoOgorCS5xdWFkCS5MX19jcml0aWNhbF9lbmQgLSAuTF9fY3JpdGljYWxfc3RhcnQKIAorCisjaWYgSVNfRU5BQkxFRChDT05GSUdfS1ZNKQogLyoKLSAqIFN5bWJvbCBjb25zdGFudHMKKyAqIHNpZTY0YSBjYWxsaW5nIGNvbnZlbnRpb246CisgKiAlcjIgcG9pbnRlciB0byBzaWUgY29udHJvbCBibG9jaworICogJXIzIGd1ZXN0IHJlZ2lzdGVyIHNhdmUgYXJlYQogICovCi0uTGNfZG9fbWFjaGluZV9jaGVjazoJLmxvbmcJczM5MF9kb19tYWNoaW5lX2NoZWNrCi0uTGNfaGFuZGxlX21jY2s6CS5sb25nCXMzOTBfaGFuZGxlX21jY2sKLS5MY19kb19JUlE6CQkubG9uZwlkb19JUlEKLS5MY19kb19zaWduYWw6CQkubG9uZwlkb19zaWduYWwKLS5MY19kb19ub3RpZnlfcmVzdW1lOgkubG9uZwlkb19ub3RpZnlfcmVzdW1lCi0uTGNfZG9fcGVyX3RyYXA6CS5sb25nCWRvX3Blcl90cmFwCi0uTGNfanVtcF90YWJsZToJCS5sb25nCXBnbV9jaGVja190YWJsZQotLkxjX3NjaGVkdWxlOgkJLmxvbmcJc2NoZWR1bGUKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotLkxjX3ByZWVtcHRfaXJxOgkubG9uZwlwcmVlbXB0X3NjaGVkdWxlX2lycQotI2VuZGlmCi0uTGNfdHJhY2VfZW50ZXI6CS5sb25nCWRvX3N5c2NhbGxfdHJhY2VfZW50ZXIKLS5MY190cmFjZV9leGl0OgkJLmxvbmcJZG9fc3lzY2FsbF90cmFjZV9leGl0Ci0uTGNfc2NoZWR1bGVfdGFpbDoJLmxvbmcJc2NoZWR1bGVfdGFpbAotLkxjX3N5c2NfcGVyOgkJLmxvbmcJLkxzeXNjX3BlciArIDB4ODAwMDAwMDAKLSNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKLS5MY19oYXJkaXJxc19vbjoJLmxvbmcJdHJhY2VfaGFyZGlycXNfb25fY2FsbGVyCi0uTGNfaGFyZGlycXNfb2ZmOgkubG9uZwl0cmFjZV9oYXJkaXJxc19vZmZfY2FsbGVyCi0jZW5kaWYKLSNpZmRlZiBDT05GSUdfTE9DS0RFUAotLkxjX2xvY2tkZXBfc3lzX2V4aXQ6CS5sb25nCWxvY2tkZXBfc3lzX2V4aXQKLSNlbmRpZgotLkxjX2NyaXRpY2FsX3N0YXJ0OgkubG9uZwkuTF9fY3JpdGljYWxfc3RhcnQgKyAweDgwMDAwMDAwCi0uTGNfY3JpdGljYWxfbGVuZ3RoOgkubG9uZwkuTF9fY3JpdGljYWxfZW5kIC0gLkxfX2NyaXRpY2FsX3N0YXJ0CitFTlRSWShzaWU2NGEpCisJc3RtZwklcjYsJXIxNCxfX1NGX0dQUlMoJXIxNSkJIyBzYXZlIGtlcm5lbCByZWdpc3RlcnMKKwlzdGcJJXIyLF9fU0ZfRU1QVFkoJXIxNSkJCSMgc2F2ZSBjb250cm9sIGJsb2NrIHBvaW50ZXIKKwlzdGcJJXIzLF9fU0ZfRU1QVFkrOCglcjE1KQkJIyBzYXZlIGd1ZXN0IHJlZ2lzdGVyIHNhdmUgYXJlYQorCXhjCV9fU0ZfRU1QVFkrMTYoMTYsJXIxNSksX19TRl9FTVBUWSsxNiglcjE1KSAjIGhvc3QgaWQgJiByZWFzb24KKwlsbWcJJXIwLCVyMTMsMCglcjMpCQkJIyBsb2FkIGd1ZXN0IGdwcnMgMC0xMworCWxnCSVyMTQsX19MQ19HTUFQCQkJIyBnZXQgZ21hcCBwb2ludGVyCisJbHRncgklcjE0LCVyMTQKKwlqegkuTHNpZV9nbWFwCisJbGN0bGcJJWMxLCVjMSxfX0dNQVBfQVNDRSglcjE0KQkjIGxvYWQgcHJpbWFyeSBhc2NlCisuTHNpZV9nbWFwOgorCWxnCSVyMTQsX19TRl9FTVBUWSglcjE1KQkJIyBnZXQgY29udHJvbCBibG9jayBwb2ludGVyCisJb2kJX19TSUVfUFJPRzBDKzMoJXIxNCksMQkJIyB3ZSBhcmUgZ29pbmcgaW50byBTSUUgbm93CisJdG0JX19TSUVfUFJPRzIwKzMoJXIxNCksMQkJIyBsYXN0IGV4aXQuLi4KKwlqbnoJLkxzaWVfZG9uZQorCUxQUAlfX1NGX0VNUFRZKCVyMTUpCQkjIHNldCBndWVzdCBpZAorCXNpZQkwKCVyMTQpCisuTHNpZV9kb25lOgorCUxQUAlfX1NGX0VNUFRZKzE2KCVyMTUpCQkjIHNldCBob3N0IGlkCisJbmkJX19TSUVfUFJPRzBDKzMoJXIxNCksMHhmZQkjIG5vIGxvbmdlciBpbiBTSUUKKwlsY3RsZwklYzEsJWMxLF9fTENfVVNFUl9BU0NFCQkjIGxvYWQgcHJpbWFyeSBhc2NlCisjIHNvbWUgcHJvZ3JhbSBjaGVja3MgYXJlIHN1cHByZXNzaW5nLiBDIGNvZGUgKGUuZy4gZG9fcHJvdGVjdGlvbl9leGNlcHRpb24pCisjIHdpbGwgcmV3aW5kIHRoZSBQU1cgYnkgdGhlIElMQywgd2hpY2ggaXMgNCBieXRlcyBpbiBjYXNlIG9mIFNJRS4gT3RoZXIKKyMgaW5zdHJ1Y3Rpb25zIGJldHdlZW4gc2llNjRhIGFuZCAuTHNpZV9kb25lIHNob3VsZCBub3QgY2F1c2UgcHJvZ3JhbQorIyBpbnRlcnJ1cHRzLiBTbyBsZXRzIHVzZSBhIG5vcCAoNDcgMDAgMDAgMDApIGFzIGEgbGFuZGluZyBwYWQuCisjIFNlZSBhbHNvIEhBTkRMRV9TSUVfSU5URVJDRVBUCisuTHJld2luZF9wYWQ6CisJbm9wCTAKKwkuZ2xvYmwgc2llX2V4aXQKK3NpZV9leGl0OgorCWxnCSVyMTQsX19TRl9FTVBUWSs4KCVyMTUpCQkjIGxvYWQgZ3Vlc3QgcmVnaXN0ZXIgc2F2ZSBhcmVhCisJc3RtZwklcjAsJXIxMywwKCVyMTQpCQkjIHNhdmUgZ3Vlc3QgZ3BycyAwLTEzCisJbG1nCSVyNiwlcjE0LF9fU0ZfR1BSUyglcjE1KQkjIHJlc3RvcmUga2VybmVsIHJlZ2lzdGVycworCWxnCSVyMixfX1NGX0VNUFRZKzI0KCVyMTUpCQkjIHJldHVybiBleGl0IHJlYXNvbiBjb2RlCisJYnIJJXIxNAorLkxzaWVfZmF1bHQ6CisJbGdoaQklcjE0LC1FRkFVTFQKKwlzdGcJJXIxNCxfX1NGX0VNUFRZKzI0KCVyMTUpCSMgc2V0IGV4aXQgcmVhc29uIGNvZGUKKwlqCXNpZV9leGl0CiAKLQkJLnNlY3Rpb24gLnJvZGF0YSwgImEiCi0jZGVmaW5lIFNZU0NBTEwoZXNhLGVzYW1lLGVtdSkJLmxvbmcgZXNhCisJLmFsaWduCTgKKy5Mc2llX2NyaXRpY2FsOgorCS5xdWFkCS5Mc2llX2dtYXAKKy5Mc2llX2NyaXRpY2FsX2xlbmd0aDoKKwkucXVhZAkuTHNpZV9kb25lIC0gLkxzaWVfZ21hcAorCisJRVhfVEFCTEUoLkxyZXdpbmRfcGFkLC5Mc2llX2ZhdWx0KQorCUVYX1RBQkxFKHNpZV9leGl0LC5Mc2llX2ZhdWx0KQorI2VuZGlmCisKKwkuc2VjdGlvbiAucm9kYXRhLCAiYSIKKyNkZWZpbmUgU1lTQ0FMTChlc2FtZSxlbXUpCS5sb25nIGVzYW1lCiAJLmdsb2JsCXN5c19jYWxsX3RhYmxlCiBzeXNfY2FsbF90YWJsZToKICNpbmNsdWRlICJzeXNjYWxscy5TIgogI3VuZGVmIFNZU0NBTEwKKworI2lmZGVmIENPTkZJR19DT01QQVQKKworI2RlZmluZSBTWVNDQUxMKGVzYW1lLGVtdSkJLmxvbmcgZW11CisJLmdsb2JsCXN5c19jYWxsX3RhYmxlX2VtdQorc3lzX2NhbGxfdGFibGVfZW11OgorI2luY2x1ZGUgInN5c2NhbGxzLlMiCisjdW5kZWYgU1lTQ0FMTAorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5NjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzI5NDQ2Li4wMDAwMDAwCi0tLSBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TCisrKyAvZGV2L251bGwKQEAgLTEsMTA1OSArMCwwIEBACi0vKgotICogICAgUzM5MCBsb3ctbGV2ZWwgZW50cnkgcG9pbnRzLgotICoKLSAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMTk5OSwgMjAxMgotICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pLAotICoJCSBIYXJ0bXV0IFBlbm5lciAoaHBAZGUuaWJtLmNvbSksCi0gKgkJIERlbmlzIEpvc2VwaCBCYXJyb3cgKGRqYmFycm93QGRlLmlibS5jb20sYmFycm93X2RqQHlhaG9vLmNvbSksCi0gKgkJIEhlaWtvIENhcnN0ZW5zIDxoZWlrby5jYXJzdGVuc0BkZS5pYm0uY29tPgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vY2FjaGUuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KLSNpbmNsdWRlIDxhc20vcHRyYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3NpZ3AuaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0KLV9fUFRfUjAgICAgICA9CV9fUFRfR1BSUwotX19QVF9SMSAgICAgID0JX19QVF9HUFJTICsgOAotX19QVF9SMiAgICAgID0JX19QVF9HUFJTICsgMTYKLV9fUFRfUjMgICAgICA9CV9fUFRfR1BSUyArIDI0Ci1fX1BUX1I0ICAgICAgPQlfX1BUX0dQUlMgKyAzMgotX19QVF9SNSAgICAgID0JX19QVF9HUFJTICsgNDAKLV9fUFRfUjYgICAgICA9CV9fUFRfR1BSUyArIDQ4Ci1fX1BUX1I3ICAgICAgPQlfX1BUX0dQUlMgKyA1NgotX19QVF9SOCAgICAgID0JX19QVF9HUFJTICsgNjQKLV9fUFRfUjkgICAgICA9CV9fUFRfR1BSUyArIDcyCi1fX1BUX1IxMCAgICAgPQlfX1BUX0dQUlMgKyA4MAotX19QVF9SMTEgICAgID0JX19QVF9HUFJTICsgODgKLV9fUFRfUjEyICAgICA9CV9fUFRfR1BSUyArIDk2Ci1fX1BUX1IxMyAgICAgPQlfX1BUX0dQUlMgKyAxMDQKLV9fUFRfUjE0ICAgICA9CV9fUFRfR1BSUyArIDExMgotX19QVF9SMTUgICAgID0JX19QVF9HUFJTICsgMTIwCi0KLVNUQUNLX1NISUZUID0gUEFHRV9TSElGVCArIFRIUkVBRF9PUkRFUgotU1RBQ0tfU0laRSAgPSAxIDw8IFNUQUNLX1NISUZUCi1TVEFDS19JTklUID0gU1RBQ0tfU0laRSAtIFNUQUNLX0ZSQU1FX09WRVJIRUFEIC0gX19QVF9TSVpFCi0KLV9USUZfV09SSwk9IChfVElGX1NJR1BFTkRJTkcgfCBfVElGX05PVElGWV9SRVNVTUUgfCBfVElGX05FRURfUkVTQ0hFRCB8IFwKLQkJICAgX1RJRl9VUFJPQkUpCi1fVElGX1RSQUNFCT0gKF9USUZfU1lTQ0FMTF9UUkFDRSB8IF9USUZfU1lTQ0FMTF9BVURJVCB8IF9USUZfU0VDQ09NUCB8IFwKLQkJICAgX1RJRl9TWVNDQUxMX1RSQUNFUE9JTlQpCi1fQ0lGX1dPUksJPSAoX0NJRl9NQ0NLX1BFTkRJTkcgfCBfQ0lGX0FTQ0UpCi1fUElGX1dPUksJPSAoX1BJRl9QRVJfVFJBUCkKLQotI2RlZmluZSBCQVNFRChuYW1lKSBuYW1lLXN5c3RlbV9jYWxsKCVyMTMpCi0KLQkubWFjcm8JVFJBQ0VfSVJRU19PTgotI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwotCWJhc3IJJXIyLCVyMAotCWJyYXNsCSVyMTQsdHJhY2VfaGFyZGlycXNfb25fY2FsbGVyCi0jZW5kaWYKLQkuZW5kbQotCi0JLm1hY3JvCVRSQUNFX0lSUVNfT0ZGCi0jaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCi0JYmFzcgklcjIsJXIwCi0JYnJhc2wJJXIxNCx0cmFjZV9oYXJkaXJxc19vZmZfY2FsbGVyCi0jZW5kaWYKLQkuZW5kbQotCi0JLm1hY3JvCUxPQ0tERVBfU1lTX0VYSVQKLSNpZmRlZiBDT05GSUdfTE9DS0RFUAotCXRtCV9fUFRfUFNXKzEoJXIxMSksMHgwMQkjIHJldHVybmluZyB0byB1c2VyID8KLQlqegkuKzEwCi0JYnJhc2wJJXIxNCxsb2NrZGVwX3N5c19leGl0Ci0jZW5kaWYKLQkuZW5kbQotCi0JLm1hY3JvIExQUCBuZXdwcAotI2lmIElTX0VOQUJMRUQoQ09ORklHX0tWTSkKLQl0bQlfX0xDX01BQ0hJTkVfRkxBR1MrNiwweDIwCSMgTUFDSElORV9GTEFHX0xQUAotCWp6CS4rOAotCS5pbnNuCXMsMHhiMjgwMDAwMCxcbmV3cHAKLSNlbmRpZgotCS5lbmRtCi0KLQkubWFjcm8JSEFORExFX1NJRV9JTlRFUkNFUFQgc2NyYXRjaCxyZWFzb24KLSNpZiBJU19FTkFCTEVEKENPTkZJR19LVk0pCi0JdG1oaAklcjgsMHgwMDAxCQkjIGludGVycnVwdGluZyBmcm9tIHVzZXIgPwotCWpuegkuKzYyCi0JbGdyCVxzY3JhdGNoLCVyOQotCXNsZwlcc2NyYXRjaCxCQVNFRCguTHNpZV9jcml0aWNhbCkKLQljbGcJXHNjcmF0Y2gsQkFTRUQoLkxzaWVfY3JpdGljYWxfbGVuZ3RoKQotCS5pZglccmVhc29uPT0xCi0JIyBTb21lIHByb2dyYW0gaW50ZXJydXB0cyBhcmUgc3VwcHJlc3NpbmcgKGUuZy4gcHJvdGVjdGlvbikuCi0JIyBXZSBtdXN0IGFsc28gY2hlY2sgdGhlIGluc3RydWN0aW9uIGFmdGVyIFNJRSBpbiB0aGF0IGNhc2UuCi0JIyBkb19wcm90ZWN0aW9uX2V4Y2VwdGlvbiB3aWxsIHJld2luZCB0byAuTHJld2luZF9wYWQKLQlqaAkuKzQyCi0JLmVsc2UKLQlqaGUJLis0MgotCS5lbmRpZgotCWxnCSVyMTQsX19TRl9FTVBUWSglcjE1KQkJIyBnZXQgY29udHJvbCBibG9jayBwb2ludGVyCi0JTFBQCV9fU0ZfRU1QVFkrMTYoJXIxNSkJCSMgc2V0IGhvc3QgaWQKLQluaQlfX1NJRV9QUk9HMEMrMyglcjE0KSwweGZlCSMgbm8gbG9uZ2VyIGluIFNJRQotCWxjdGxnCSVjMSwlYzEsX19MQ19VU0VSX0FTQ0UJCSMgbG9hZCBwcmltYXJ5IGFzY2UKLQlsYXJsCSVyOSxzaWVfZXhpdAkJCSMgc2tpcCBmb3J3YXJkIHRvIHNpZV9leGl0Ci0JbXZpCV9fU0ZfRU1QVFkrMzEoJXIxNSksXHJlYXNvbgkjIHNldCBleGl0IHJlYXNvbgotI2VuZGlmCi0JLmVuZG0KLQotCS5tYWNybwlDSEVDS19TVEFDSyBzdGFja3NpemUsc2F2ZWFyZWEKLSNpZmRlZiBDT05GSUdfQ0hFQ0tfU1RBQ0sKLQl0bWwJJXIxNSxcc3RhY2tzaXplIC0gQ09ORklHX1NUQUNLX0dVQVJECi0JbGdoaQklcjE0LFxzYXZlYXJlYQotCWp6CXN0YWNrX292ZXJmbG93Ci0jZW5kaWYKLQkuZW5kbQotCi0JLm1hY3JvCVNXSVRDSF9BU1lOQyBzYXZlYXJlYSxzdGFjayxzaGlmdAotCXRtaGgJJXI4LDB4MDAwMQkJIyBpbnRlcnJ1cHRpbmcgZnJvbSB1c2VyID8KLQlqbnoJMWYKLQlsZ3IJJXIxNCwlcjkKLQlzbGcJJXIxNCxCQVNFRCguTGNyaXRpY2FsX3N0YXJ0KQotCWNsZwklcjE0LEJBU0VEKC5MY3JpdGljYWxfbGVuZ3RoKQotCWpoZQkwZgotCWxnaGkJJXIxMSxcc2F2ZWFyZWEJCSMgaW5zaWRlIGNyaXRpY2FsIHNlY3Rpb24sIGRvIGNsZWFudXAKLQlicmFzbAklcjE0LGNsZWFudXBfY3JpdGljYWwKLQl0bWhoCSVyOCwweDAwMDEJCSMgcmV0ZXN0IHByb2JsZW0gc3RhdGUgYWZ0ZXIgY2xlYW51cAotCWpuegkxZgotMDoJbGcJJXIxNCxcc3RhY2sJCSMgYXJlIHdlIGFscmVhZHkgb24gdGhlIHRhcmdldCBzdGFjaz8KLQlzbGdyCSVyMTQsJXIxNQotCXNyYWcJJXIxNCwlcjE0LFxzaGlmdAotCWpuegkxZgotCUNIRUNLX1NUQUNLIDE8PFxzaGlmdCxcc2F2ZWFyZWEKLQlhZ2hpCSVyMTUsLShTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfU0laRSkKLQlqCTJmCi0xOglsZwklcjE1LFxzdGFjawkJIyBsb2FkIHRhcmdldCBzdGFjawotMjoJbGEJJXIxMSxTVEFDS19GUkFNRV9PVkVSSEVBRCglcjE1KQotCS5lbmRtCi0KLQkubWFjcm8gVVBEQVRFX1ZUSU1FIHNjcmF0Y2gsZW50ZXJfdGltZXIKLQlsZwlcc2NyYXRjaCxfX0xDX0VYSVRfVElNRVIKLQlzbGcJXHNjcmF0Y2gsXGVudGVyX3RpbWVyCi0JYWxnCVxzY3JhdGNoLF9fTENfVVNFUl9USU1FUgotCXN0Zwlcc2NyYXRjaCxfX0xDX1VTRVJfVElNRVIKLQlsZwlcc2NyYXRjaCxfX0xDX0xBU1RfVVBEQVRFX1RJTUVSCi0Jc2xnCVxzY3JhdGNoLF9fTENfRVhJVF9USU1FUgotCWFsZwlcc2NyYXRjaCxfX0xDX1NZU1RFTV9USU1FUgotCXN0Zwlcc2NyYXRjaCxfX0xDX1NZU1RFTV9USU1FUgotCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLFxlbnRlcl90aW1lcgotCS5lbmRtCi0KLQkubWFjcm8JTEFTVF9CUkVBSyBzY3JhdGNoCi0Jc3JhZwlcc2NyYXRjaCwlcjEwLDIzCi0JanoJLisxMAotCXN0ZwklcjEwLF9fVElfbGFzdF9icmVhayglcjEyKQotCS5lbmRtCi0KLQkubWFjcm8gUkVFTkFCTEVfSVJRUwotCXN0ZwklcjgsX19MQ19SRVRVUk5fUFNXCi0JbmkJX19MQ19SRVRVUk5fUFNXLDB4YmYKLQlzc20JX19MQ19SRVRVUk5fUFNXCi0JLmVuZG0KLQotCS5tYWNybyBTVENLIHNhdmVhcmVhCi0jaWZkZWYgQ09ORklHX0hBVkVfTUFSQ0hfWjlfMTA5X0ZFQVRVUkVTCi0JLmluc24JcywweGIyN2MwMDAwLFxzYXZlYXJlYQkJIyBzdG9yZSBjbG9jayBmYXN0Ci0jZWxzZQotCS5pbnNuCXMsMHhiMjA1MDAwMCxcc2F2ZWFyZWEJCSMgc3RvcmUgY2xvY2sKLSNlbmRpZgotCS5lbmRtCi0KLQkuc2VjdGlvbiAua3Byb2Jlcy50ZXh0LCAiYXgiCi0KLS8qCi0gKiBTY2hlZHVsZXIgcmVzdW1lIGZ1bmN0aW9uLCBjYWxsZWQgYnkgc3dpdGNoX3RvCi0gKiAgZ3ByMiA9ICh0YXNrX3N0cnVjdCAqKSBwcmV2Ci0gKiAgZ3ByMyA9ICh0YXNrX3N0cnVjdCAqKSBuZXh0Ci0gKiBSZXR1cm5zOgotICogIGdwcjIgPSBwcmV2Ci0gKi8KLUVOVFJZKF9fc3dpdGNoX3RvKQotCXN0bWcJJXI2LCVyMTUsX19TRl9HUFJTKCVyMTUpCSMgc3RvcmUgZ3BycyBvZiBwcmV2IHRhc2sKLQlzdGcJJXIxNSxfX1RIUkVBRF9rc3AoJXIyKQkJIyBzdG9yZSBrZXJuZWwgc3RhY2sgb2YgcHJldgotCWxnCSVyNCxfX1RIUkVBRF9pbmZvKCVyMikJCSMgZ2V0IHRocmVhZF9pbmZvIG9mIHByZXYKLQlsZwklcjUsX19USFJFQURfaW5mbyglcjMpCQkjIGdldCB0aHJlYWRfaW5mbyBvZiBuZXh0Ci0JbGdyCSVyMTUsJXI1Ci0JYWdoaQklcjE1LFNUQUNLX0lOSVQJCQkjIGVuZCBvZiBrZXJuZWwgc3RhY2sgb2YgbmV4dAotCXN0ZwklcjMsX19MQ19DVVJSRU5UCQkjIHN0b3JlIHRhc2sgc3RydWN0IG9mIG5leHQKLQlzdGcJJXI1LF9fTENfVEhSRUFEX0lORk8JCSMgc3RvcmUgdGhyZWFkIGluZm8gb2YgbmV4dAotCXN0ZwklcjE1LF9fTENfS0VSTkVMX1NUQUNLCQkjIHN0b3JlIGVuZCBvZiBrZXJuZWwgc3RhY2sKLQlsY3RsCSVjNCwlYzQsX19UQVNLX3BpZCglcjMpCQkjIGxvYWQgcGlkIHRvIGNvbnRyb2wgcmVnLiA0Ci0JbXZjCV9fTENfQ1VSUkVOVF9QSUQrNCg0LCVyMCksX19UQVNLX3BpZCglcjMpICMgc3RvcmUgcGlkIG9mIG5leHQKLQlsZwklcjE1LF9fVEhSRUFEX2tzcCglcjMpCQkjIGxvYWQga2VybmVsIHN0YWNrIG9mIG5leHQKLQlsbWcJJXI2LCVyMTUsX19TRl9HUFJTKCVyMTUpCSMgbG9hZCBncHJzIG9mIG5leHQgdGFzawotCWJyCSVyMTQKLQotLkxfX2NyaXRpY2FsX3N0YXJ0OgotLyoKLSAqIFNWQyBpbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lLiBTeXN0ZW0gY2FsbHMgYXJlIHN5bmNocm9ub3VzIGV2ZW50cyBhbmQKLSAqIGFyZSBleGVjdXRlZCB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4KLSAqLwotCi1FTlRSWShzeXN0ZW1fY2FsbCkKLQlzdHB0CV9fTENfU1lOQ19FTlRFUl9USU1FUgotLkxzeXNjX3N0bWc6Ci0Jc3RtZwklcjgsJXIxNSxfX0xDX1NBVkVfQVJFQV9TWU5DCi0JbGcJJXIxMCxfX0xDX0xBU1RfQlJFQUsKLQlsZwklcjEyLF9fTENfVEhSRUFEX0lORk8KLQlsZ2hpCSVyMTQsX1BJRl9TWVNDQUxMCi0uTHN5c2NfcGVyOgotCWxnCSVyMTUsX19MQ19LRVJORUxfU1RBQ0sKLQlsYQklcjExLFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCSMgcG9pbnRlciB0byBwdF9yZWdzCi0uTHN5c2NfdnRpbWU6Ci0JVVBEQVRFX1ZUSU1FICVyMTMsX19MQ19TWU5DX0VOVEVSX1RJTUVSCi0JTEFTVF9CUkVBSyAlcjEzCi0Jc3RtZwklcjAsJXI3LF9fUFRfUjAoJXIxMSkKLQltdmMJX19QVF9SOCg2NCwlcjExKSxfX0xDX1NBVkVfQVJFQV9TWU5DCi0JbXZjCV9fUFRfUFNXKDE2LCVyMTEpLF9fTENfU1ZDX09MRF9QU1cKLQltdmMJX19QVF9JTlRfQ09ERSg0LCVyMTEpLF9fTENfU1ZDX0lMQwotCXN0ZwklcjE0LF9fUFRfRkxBR1MoJXIxMSkKLS5Mc3lzY19kb19zdmM6Ci0JbGcJJXIxMCxfX1RJX3N5c2NfdGFibGUoJXIxMikJIyBhZGRyZXNzIG9mIHN5c3RlbSBjYWxsIHRhYmxlCi0JbGxnaAklcjgsX19QVF9JTlRfQ09ERSsyKCVyMTEpCi0Jc2xhZwklcjgsJXI4LDIJCQkjIHNoaWZ0IGFuZCB0ZXN0IGZvciBzdmMgMAotCWpuegkuTHN5c2NfbnJfb2sKLQkjIHN2YyAwOiBzeXN0ZW0gY2FsbCBudW1iZXIgaW4gJXIxCi0JbGxnZnIJJXIxLCVyMQkJCQkjIGNsZWFyIGhpZ2ggd29yZCBpbiByMQotCWNnaGkJJXIxLE5SX3N5c2NhbGxzCi0Jam5sCS5Mc3lzY19ucl9vawotCXN0aAklcjEsX19QVF9JTlRfQ09ERSsyKCVyMTEpCi0Jc2xhZwklcjgsJXIxLDIKLS5Mc3lzY19ucl9vazoKLQl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpCi0Jc3RnCSVyMixfX1BUX09SSUdfR1BSMiglcjExKQotCXN0ZwklcjcsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQoJXIxNSkKLQlsZ2YJJXI5LDAoJXI4LCVyMTApCQkJIyBnZXQgc3lzdGVtIGNhbGwgYWRkLgotCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX1RSQUNFCi0Jam56CS5Mc3lzY190cmFjZXN5cwotCWJhc3IJJXIxNCwlcjkJCQkjIGNhbGwgc3lzX3h4eHgKLQlzdGcJJXIyLF9fUFRfUjIoJXIxMSkJCSMgc3RvcmUgcmV0dXJuIHZhbHVlCi0KLS5Mc3lzY19yZXR1cm46Ci0JTE9DS0RFUF9TWVNfRVhJVAotLkxzeXNjX3RpZjoKLQl0bQlfX1BUX1BTVysxKCVyMTEpLDB4MDEJCSMgcmV0dXJuaW5nIHRvIHVzZXIgPwotCWpubwkuTHN5c2NfcmVzdG9yZQotCXRtCV9fUFRfRkxBR1MrNyglcjExKSxfUElGX1dPUksKLQlqbnoJLkxzeXNjX3dvcmsKLQl0bQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9XT1JLCi0Jam56CS5Mc3lzY193b3JrCQkJIyBjaGVjayBmb3Igd29yawotCXRtCV9fTENfQ1BVX0ZMQUdTKzcsX0NJRl9XT1JLCi0Jam56CS5Mc3lzY193b3JrCi0uTHN5c2NfcmVzdG9yZToKLQlsZwklcjE0LF9fTENfVkRTT19QRVJfQ1BVCi0JbG1nCSVyMCwlcjEwLF9fUFRfUjAoJXIxMSkKLQltdmMJX19MQ19SRVRVUk5fUFNXKDE2KSxfX1BUX1BTVyglcjExKQotCXN0cHQJX19MQ19FWElUX1RJTUVSCi0JbXZjCV9fVkRTT19FQ1RHX0JBU0UoMTYsJXIxNCksX19MQ19FWElUX1RJTUVSCi0JbG1nCSVyMTEsJXIxNSxfX1BUX1IxMSglcjExKQotCWxwc3dlCV9fTENfUkVUVVJOX1BTVwotLkxzeXNjX2RvbmU6Ci0KLSMKLSMgT25lIG9mIHRoZSB3b3JrIGJpdHMgaXMgb24uIEZpbmQgb3V0IHdoaWNoIG9uZS4KLSMKLS5Mc3lzY193b3JrOgotCXRtCV9fTENfQ1BVX0ZMQUdTKzcsX0NJRl9NQ0NLX1BFTkRJTkcKLQlqbwkuTHN5c2NfbWNja19wZW5kaW5nCi0JdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfTkVFRF9SRVNDSEVECi0Jam8JLkxzeXNjX3Jlc2NoZWR1bGUKLSNpZmRlZiBDT05GSUdfVVBST0JFUwotCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX1VQUk9CRQotCWpvCS5Mc3lzY191cHJvYmVfbm90aWZ5Ci0jZW5kaWYKLQl0bQlfX1BUX0ZMQUdTKzcoJXIxMSksX1BJRl9QRVJfVFJBUAotCWpvCS5Mc3lzY19zaW5nbGVzdGVwCi0JdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfU0lHUEVORElORwotCWpvCS5Mc3lzY19zaWdwZW5kaW5nCi0JdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfTk9USUZZX1JFU1VNRQotCWpvCS5Mc3lzY19ub3RpZnlfcmVzdW1lCi0JdG0JX19MQ19DUFVfRkxBR1MrNyxfQ0lGX0FTQ0UKLQlqbwkuTHN5c2NfdWFjY2VzcwotCWoJLkxzeXNjX3JldHVybgkJIyBiZXdhcmUgb2YgY3JpdGljYWwgc2VjdGlvbiBjbGVhbnVwCi0KLSMKLSMgX1RJRl9ORUVEX1JFU0NIRUQgaXMgc2V0LCBjYWxsIHNjaGVkdWxlCi0jCi0uTHN5c2NfcmVzY2hlZHVsZToKLQlsYXJsCSVyMTQsLkxzeXNjX3JldHVybgotCWpnCXNjaGVkdWxlCi0KLSMKLSMgX0NJRl9NQ0NLX1BFTkRJTkcgaXMgc2V0LCBjYWxsIGhhbmRsZXIKLSMKLS5Mc3lzY19tY2NrX3BlbmRpbmc6Ci0JbGFybAklcjE0LC5Mc3lzY19yZXR1cm4KLQlqZwlzMzkwX2hhbmRsZV9tY2NrCSMgVElGIGJpdCB3aWxsIGJlIGNsZWFyZWQgYnkgaGFuZGxlcgotCi0jCi0jIF9DSUZfQVNDRSBpcyBzZXQsIGxvYWQgdXNlciBzcGFjZSBhc2NlCi0jCi0uTHN5c2NfdWFjY2VzczoKLQluaQlfX0xDX0NQVV9GTEFHUys3LDI1NS1fQ0lGX0FTQ0UKLQlsY3RsZwklYzEsJWMxLF9fTENfVVNFUl9BU0NFCQkjIGxvYWQgcHJpbWFyeSBhc2NlCi0JagkuTHN5c2NfcmV0dXJuCi0KLSMKLSMgX1RJRl9TSUdQRU5ESU5HIGlzIHNldCwgY2FsbCBkb19zaWduYWwKLSMKLS5Mc3lzY19zaWdwZW5kaW5nOgotCWxncgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncwotCWJyYXNsCSVyMTQsZG9fc2lnbmFsCi0JdG0JX19QVF9GTEFHUys3KCVyMTEpLF9QSUZfU1lTQ0FMTAotCWpubwkuTHN5c2NfcmV0dXJuCi0JbG1nCSVyMiwlcjcsX19QVF9SMiglcjExKQkjIGxvYWQgc3ZjIGFyZ3VtZW50cwotCWxnCSVyMTAsX19USV9zeXNjX3RhYmxlKCVyMTIpCSMgYWRkcmVzcyBvZiBzeXN0ZW0gY2FsbCB0YWJsZQotCWxnaGkJJXI4LDAJCQkjIHN2YyAwIHJldHVybnMgLUVOT1NZUwotCWxsZ2gJJXIxLF9fUFRfSU5UX0NPREUrMiglcjExKQkjIGxvYWQgbmV3IHN2YyBudW1iZXIKLQljZ2hpCSVyMSxOUl9zeXNjYWxscwotCWpubAkuTHN5c2NfbnJfb2sJCSMgaW52YWxpZCBzdmMgbnVtYmVyIC0+IGRvIHN2YyAwCi0Jc2xhZwklcjgsJXIxLDIKLQlqCS5Mc3lzY19ucl9vawkJIyByZXN0YXJ0IHN2YwotCi0jCi0jIF9USUZfTk9USUZZX1JFU1VNRSBpcyBzZXQsIGNhbGwgZG9fbm90aWZ5X3Jlc3VtZQotIwotLkxzeXNjX25vdGlmeV9yZXN1bWU6Ci0JbGdyCSVyMiwlcjExCQkjIHBhc3MgcG9pbnRlciB0byBwdF9yZWdzCi0JbGFybAklcjE0LC5Mc3lzY19yZXR1cm4KLQlqZwlkb19ub3RpZnlfcmVzdW1lCi0KLSMKLSMgX1RJRl9VUFJPQkUgaXMgc2V0LCBjYWxsIHVwcm9iZV9ub3RpZnlfcmVzdW1lCi0jCi0jaWZkZWYgQ09ORklHX1VQUk9CRVMKLS5Mc3lzY191cHJvYmVfbm90aWZ5OgotCWxncgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncwotCWxhcmwJJXIxNCwuTHN5c2NfcmV0dXJuCi0JamcJdXByb2JlX25vdGlmeV9yZXN1bWUKLSNlbmRpZgotCi0jCi0jIF9QSUZfUEVSX1RSQVAgaXMgc2V0LCBjYWxsIGRvX3Blcl90cmFwCi0jCi0uTHN5c2Nfc2luZ2xlc3RlcDoKLQluaQlfX1BUX0ZMQUdTKzcoJXIxMSksMjU1LV9QSUZfUEVSX1RSQVAKLQlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKLQlsYXJsCSVyMTQsLkxzeXNjX3JldHVybgotCWpnCWRvX3Blcl90cmFwCi0KLSMKLSMgY2FsbCB0cmFjZWhvb2tfcmVwb3J0X3N5c2NhbGxfZW50cnkvdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2V4aXQgYmVmb3JlCi0jIGFuZCBhZnRlciB0aGUgc3lzdGVtIGNhbGwKLSMKLS5Mc3lzY190cmFjZXN5czoKLQlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKLQlsYQklcjMsMAotCWxsZ2gJJXIwLF9fUFRfSU5UX0NPREUrMiglcjExKQotCXN0ZwklcjAsX19QVF9SMiglcjExKQotCWJyYXNsCSVyMTQsZG9fc3lzY2FsbF90cmFjZV9lbnRlcgotCWxnaGkJJXIwLE5SX3N5c2NhbGxzCi0JY2xncgklcjAsJXIyCi0Jam5oCS5Mc3lzY190cmFjZW5vZ28KLQlzbGxnCSVyOCwlcjIsMgotCWxnZgklcjksMCglcjgsJXIxMCkKLS5Mc3lzY190cmFjZWdvOgotCWxtZwklcjMsJXI3LF9fUFRfUjMoJXIxMSkKLQlzdGcJJXI3LFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCi0JbGcJJXIyLF9fUFRfT1JJR19HUFIyKCVyMTEpCi0JYmFzcgklcjE0LCVyOQkJIyBjYWxsIHN5c194eHgKLQlzdGcJJXIyLF9fUFRfUjIoJXIxMSkJIyBzdG9yZSByZXR1cm4gdmFsdWUKLS5Mc3lzY190cmFjZW5vZ286Ci0JdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfVFJBQ0UKLQlqegkuTHN5c2NfcmV0dXJuCi0JbGdyCSVyMiwlcjExCQkjIHBhc3MgcG9pbnRlciB0byBwdF9yZWdzCi0JbGFybAklcjE0LC5Mc3lzY19yZXR1cm4KLQlqZwlkb19zeXNjYWxsX3RyYWNlX2V4aXQKLQotIwotIyBhIG5ldyBwcm9jZXNzIGV4aXRzIHRoZSBrZXJuZWwgd2l0aCByZXRfZnJvbV9mb3JrCi0jCi1FTlRSWShyZXRfZnJvbV9mb3JrKQotCWxhCSVyMTEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQoJXIxNSkKLQlsZwklcjEyLF9fTENfVEhSRUFEX0lORk8KLQlicmFzbAklcjE0LHNjaGVkdWxlX3RhaWwKLQlUUkFDRV9JUlFTX09OCi0Jc3NtCV9fTENfU1ZDX05FV19QU1cJIyByZWVuYWJsZSBpbnRlcnJ1cHRzCi0JdG0JX19QVF9QU1crMSglcjExKSwweDAxCSMgZm9ya2luZyBhIGtlcm5lbCB0aHJlYWQgPwotCWpuZQkuTHN5c2NfdHJhY2Vub2dvCi0JIyBpdCdzIGEga2VybmVsIHRocmVhZAotCWxtZwklcjksJXIxMCxfX1BUX1I5KCVyMTEpCSMgbG9hZCBncHJzCi1FTlRSWShrZXJuZWxfdGhyZWFkX3N0YXJ0ZXIpCi0JbGEJJXIyLDAoJXIxMCkKLQliYXNyCSVyMTQsJXI5Ci0JagkuTHN5c2NfdHJhY2Vub2dvCi0KLS8qCi0gKiBQcm9ncmFtIGNoZWNrIGhhbmRsZXIgcm91dGluZQotICovCi0KLUVOVFJZKHBnbV9jaGVja19oYW5kbGVyKQotCXN0cHQJX19MQ19TWU5DX0VOVEVSX1RJTUVSCi0Jc3RtZwklcjgsJXIxNSxfX0xDX1NBVkVfQVJFQV9TWU5DCi0JbGcJJXIxMCxfX0xDX0xBU1RfQlJFQUsKLQlsZwklcjEyLF9fTENfVEhSRUFEX0lORk8KLQlsYXJsCSVyMTMsc3lzdGVtX2NhbGwKLQlsbWcJJXI4LCVyOSxfX0xDX1BHTV9PTERfUFNXCi0JSEFORExFX1NJRV9JTlRFUkNFUFQgJXIxNCwxCi0JdG1oaAklcjgsMHgwMDAxCQkjIHRlc3QgcHJvYmxlbSBzdGF0ZSBiaXQKLQlqbnoJMWYJCQkjIC0+IGZhdWx0IGluIHVzZXIgc3BhY2UKLQl0bWhoCSVyOCwweDQwMDAJCSMgUEVSIGJpdCBzZXQgaW4gb2xkIFBTVyA/Ci0Jam56CTBmCQkJIyAtPiBlbmFibGVkLCBjYW4ndCBiZSBhIGRvdWJsZSBmYXVsdAotCXRtCV9fTENfUEdNX0lMQyszLDB4ODAJIyBjaGVjayBmb3IgcGVyIGV4Y2VwdGlvbgotCWpuegkuTHBnbV9zdmNwZXIJCSMgLT4gc2luZ2xlIHN0ZXBwZWQgc3ZjCi0wOglDSEVDS19TVEFDSyBTVEFDS19TSVpFLF9fTENfU0FWRV9BUkVBX1NZTkMKLQlhZ2hpCSVyMTUsLShTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfU0laRSkKLQlqCTJmCi0xOglVUERBVEVfVlRJTUUgJXIxNCxfX0xDX1NZTkNfRU5URVJfVElNRVIKLQlMQVNUX0JSRUFLICVyMTQKLQlsZwklcjE1LF9fTENfS0VSTkVMX1NUQUNLCi0JbGcJJXIxNCxfX1RJX3Rhc2soJXIxMikKLQlsZ2hpCSVyMTMsX19MQ19QR01fVERCCi0JdG0JX19MQ19QR01fSUxDKzIsMHgwMgkjIGNoZWNrIGZvciB0cmFuc2FjdGlvbiBhYm9ydAotCWp6CTJmCi0JbXZjCV9fVEhSRUFEX3RyYXBfdGRiKDI1NiwlcjE0KSwwKCVyMTMpCi0yOglsYQklcjExLFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCi0Jc3RtZwklcjAsJXI3LF9fUFRfUjAoJXIxMSkKLQltdmMJX19QVF9SOCg2NCwlcjExKSxfX0xDX1NBVkVfQVJFQV9TWU5DCi0Jc3RtZwklcjgsJXI5LF9fUFRfUFNXKCVyMTEpCi0JbXZjCV9fUFRfSU5UX0NPREUoNCwlcjExKSxfX0xDX1BHTV9JTEMKLQltdmMJX19QVF9JTlRfUEFSTV9MT05HKDgsJXIxMSksX19MQ19UUkFOU19FWENfQ09ERQotCXhjCV9fUFRfRkxBR1MoOCwlcjExKSxfX1BUX0ZMQUdTKCVyMTEpCi0Jc3RnCSVyMTAsX19QVF9BUkdTKCVyMTEpCi0JdG0JX19MQ19QR01fSUxDKzMsMHg4MAkjIGNoZWNrIGZvciBwZXIgZXhjZXB0aW9uCi0JanoJMGYKLQl0bWhoCSVyOCwweDAwMDEJCSMga2VybmVsIHBlciBldmVudCA/Ci0JanoJLkxwZ21fa3Byb2JlCi0Jb2kJX19QVF9GTEFHUys3KCVyMTEpLF9QSUZfUEVSX1RSQVAKLQltdmMJX19USFJFQURfcGVyX2FkZHJlc3MoOCwlcjE0KSxfX0xDX1BFUl9BRERSRVNTCi0JbXZjCV9fVEhSRUFEX3Blcl9jYXVzZSgyLCVyMTQpLF9fTENfUEVSX0NPREUKLQltdmMJX19USFJFQURfcGVyX3BhaWQoMSwlcjE0KSxfX0xDX1BFUl9BQ0NFU1NfSUQKLTA6CVJFRU5BQkxFX0lSUVMKLQl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpCi0JbGFybAklcjEscGdtX2NoZWNrX3RhYmxlCi0JbGxnaAklcjEwLF9fUFRfSU5UX0NPREUrMiglcjExKQotCW5pbGwJJXIxMCwweDAwN2YKLQlzbGwJJXIxMCwyCi0JamUJLkxzeXNjX3JldHVybgotCWxnZgklcjEsMCglcjEwLCVyMSkJCSMgbG9hZCBhZGRyZXNzIG9mIGhhbmRsZXIgcm91dGluZQotCWxncgklcjIsJXIxMQkJIyBwYXNzIHBvaW50ZXIgdG8gcHRfcmVncwotCWJhc3IJJXIxNCwlcjEJCSMgYnJhbmNoIHRvIGludGVycnVwdC1oYW5kbGVyCi0JagkuTHN5c2NfcmV0dXJuCi0KLSMKLSMgUEVSIGV2ZW50IGluIHN1cGVydmlzb3Igc3RhdGUsIG11c3QgYmUga3Byb2JlcwotIwotLkxwZ21fa3Byb2JlOgotCVJFRU5BQkxFX0lSUVMKLQl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpCi0JbGdyCSVyMiwlcjExCQkjIHBhc3MgcG9pbnRlciB0byBwdF9yZWdzCi0JYnJhc2wJJXIxNCxkb19wZXJfdHJhcAotCWoJLkxzeXNjX3JldHVybgotCi0jCi0jIHNpbmdsZSBzdGVwcGVkIHN5c3RlbSBjYWxsCi0jCi0uTHBnbV9zdmNwZXI6Ci0JbXZjCV9fTENfUkVUVVJOX1BTVyg4KSxfX0xDX1NWQ19ORVdfUFNXCi0JbGFybAklcjE0LC5Mc3lzY19wZXIKLQlzdGcJJXIxNCxfX0xDX1JFVFVSTl9QU1crOAotCWxnaGkJJXIxNCxfUElGX1NZU0NBTEwgfCBfUElGX1BFUl9UUkFQCi0JbHBzd2UJX19MQ19SRVRVUk5fUFNXCQkjIGJyYW5jaCB0byAuTHN5c2NfcGVyIGFuZCBlbmFibGUgaXJxcwotCi0vKgotICogSU8gaW50ZXJydXB0IGhhbmRsZXIgcm91dGluZQotICovCi1FTlRSWShpb19pbnRfaGFuZGxlcikKLQlTVENLCV9fTENfSU5UX0NMT0NLCi0Jc3RwdAlfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCi0Jc3RtZwklcjgsJXIxNSxfX0xDX1NBVkVfQVJFQV9BU1lOQwotCWxnCSVyMTAsX19MQ19MQVNUX0JSRUFLCi0JbGcJJXIxMixfX0xDX1RIUkVBRF9JTkZPCi0JbGFybAklcjEzLHN5c3RlbV9jYWxsCi0JbG1nCSVyOCwlcjksX19MQ19JT19PTERfUFNXCi0JSEFORExFX1NJRV9JTlRFUkNFUFQgJXIxNCwyCi0JU1dJVENIX0FTWU5DIF9fTENfU0FWRV9BUkVBX0FTWU5DLF9fTENfQVNZTkNfU1RBQ0ssU1RBQ0tfU0hJRlQKLQl0bWhoCSVyOCwweDAwMDEJCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlcj8KLQlqegkuTGlvX3NraXAKLQlVUERBVEVfVlRJTUUgJXIxNCxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCi0JTEFTVF9CUkVBSyAlcjE0Ci0uTGlvX3NraXA6Ci0Jc3RtZwklcjAsJXI3LF9fUFRfUjAoJXIxMSkKLQltdmMJX19QVF9SOCg2NCwlcjExKSxfX0xDX1NBVkVfQVJFQV9BU1lOQwotCXN0bWcJJXI4LCVyOSxfX1BUX1BTVyglcjExKQotCW12YwlfX1BUX0lOVF9DT0RFKDEyLCVyMTEpLF9fTENfU1VCQ0hBTk5FTF9JRAotCXhjCV9fUFRfRkxBR1MoOCwlcjExKSxfX1BUX0ZMQUdTKCVyMTEpCi0JVFJBQ0VfSVJRU19PRkYKLQl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpCi0uTGlvX2xvb3A6Ci0JbGdyCSVyMiwlcjExCQkjIHBhc3MgcG9pbnRlciB0byBwdF9yZWdzCi0JbGdoaQklcjMsSU9fSU5URVJSVVBUCi0JdG0JX19QVF9JTlRfQ09ERSs4KCVyMTEpLDB4ODAJIyBhZGFwdGVyIGludGVycnVwdCA/Ci0JanoJLkxpb19jYWxsCi0JbGdoaQklcjMsVEhJTl9JTlRFUlJVUFQKLS5MaW9fY2FsbDoKLQlicmFzbAklcjE0LGRvX0lSUQotCXRtCV9fTENfTUFDSElORV9GTEFHUys2LDB4MTAJIyBNQUNISU5FX0ZMQUdfTFBBUgotCWp6CS5MaW9fcmV0dXJuCi0JdHBpCTAKLQlqegkuTGlvX3JldHVybgotCW12YwlfX1BUX0lOVF9DT0RFKDEyLCVyMTEpLF9fTENfU1VCQ0hBTk5FTF9JRAotCWoJLkxpb19sb29wCi0uTGlvX3JldHVybjoKLQlMT0NLREVQX1NZU19FWElUCi0JVFJBQ0VfSVJRU19PTgotLkxpb190aWY6Ci0JdG0JX19USV9mbGFncys3KCVyMTIpLF9USUZfV09SSwotCWpuegkuTGlvX3dvcmsJCSMgdGhlcmUgaXMgd29yayB0byBkbyAoc2lnbmFscyBldGMuKQotCXRtCV9fTENfQ1BVX0ZMQUdTKzcsX0NJRl9XT1JLCi0Jam56CS5MaW9fd29yawotLkxpb19yZXN0b3JlOgotCWxnCSVyMTQsX19MQ19WRFNPX1BFUl9DUFUKLQlsbWcJJXIwLCVyMTAsX19QVF9SMCglcjExKQotCW12YwlfX0xDX1JFVFVSTl9QU1coMTYpLF9fUFRfUFNXKCVyMTEpCi0Jc3RwdAlfX0xDX0VYSVRfVElNRVIKLQltdmMJX19WRFNPX0VDVEdfQkFTRSgxNiwlcjE0KSxfX0xDX0VYSVRfVElNRVIKLQlsbWcJJXIxMSwlcjE1LF9fUFRfUjExKCVyMTEpCi0JbHBzd2UJX19MQ19SRVRVUk5fUFNXCi0uTGlvX2RvbmU6Ci0KLSMKLSMgVGhlcmUgaXMgd29yayB0b2RvLCBmaW5kIG91dCBpbiB3aGljaCBjb250ZXh0IHdlIGhhdmUgYmVlbiBpbnRlcnJ1cHRlZDoKLSMgMSkgaWYgd2UgcmV0dXJuIHRvIHVzZXIgc3BhY2Ugd2UgY2FuIGRvIGFsbCBfVElGX1dPUksgd29yawotIyAyKSBpZiB3ZSByZXR1cm4gdG8ga2VybmVsIGNvZGUgYW5kIGt2bSBpcyBlbmFibGVkIGNoZWNrIGlmIHdlIG5lZWQgdG8KLSMgICAgbW9kaWZ5IHRoZSBwc3cgdG8gbGVhdmUgU0lFCi0jIDMpIGlmIHdlIHJldHVybiB0byBrZXJuZWwgY29kZSBhbmQgcHJlZW1wdGl2ZSBzY2hlZHVsaW5nIGlzIGVuYWJsZWQgY2hlY2sKLSMgICAgdGhlIHByZWVtcHRpb24gY291bnRlciBhbmQgaWYgaXQgaXMgemVybyBjYWxsIHByZWVtcHRfc2NoZWR1bGVfaXJxCi0jIEJlZm9yZSBhbnkgd29yayBjYW4gYmUgZG9uZSwgYSBzd2l0Y2ggdG8gdGhlIGtlcm5lbCBzdGFjayBpcyByZXF1aXJlZC4KLSMKLS5MaW9fd29yazoKLQl0bQlfX1BUX1BTVysxKCVyMTEpLDB4MDEJIyByZXR1cm5pbmcgdG8gdXNlciA/Ci0Jam8JLkxpb193b3JrX3VzZXIJCSMgeWVzIC0+IGRvIHJlc2NoZWQgJiBzaWduYWwKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCSMgY2hlY2sgZm9yIHByZWVtcHRpdmUgc2NoZWR1bGluZwotCWljbQklcjAsMTUsX19USV9wcmVjb3VudCglcjEyKQotCWpuegkuTGlvX3Jlc3RvcmUJCSMgcHJlZW1wdGlvbiBpcyBkaXNhYmxlZAotCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX05FRURfUkVTQ0hFRAotCWpubwkuTGlvX3Jlc3RvcmUKLQkjIHN3aXRjaCB0byBrZXJuZWwgc3RhY2sKLQlsZwklcjEsX19QVF9SMTUoJXIxMSkKLQlhZ2hpCSVyMSwtKFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19QVF9TSVpFKQotCW12YwlTVEFDS19GUkFNRV9PVkVSSEVBRChfX1BUX1NJWkUsJXIxKSwwKCVyMTEpCi0JeGMJX19TRl9CQUNLQ0hBSU4oOCwlcjEpLF9fU0ZfQkFDS0NIQUlOKCVyMSkKLQlsYQklcjExLFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMSkKLQlsZ3IJJXIxNSwlcjEKLQkjIFRSQUNFX0lSUVNfT04gYWxyZWFkeSBkb25lIGF0IC5MaW9fcmV0dXJuLCBjYWxsCi0JIyBUUkFDRV9JUlFTX09GRiB0byBrZWVwIHRoaW5ncyBzeW1tZXRyaWNhbAotCVRSQUNFX0lSUVNfT0ZGCi0JYnJhc2wJJXIxNCxwcmVlbXB0X3NjaGVkdWxlX2lycQotCWoJLkxpb19yZXR1cm4KLSNlbHNlCi0JagkuTGlvX3Jlc3RvcmUKLSNlbmRpZgotCi0jCi0jIE5lZWQgdG8gZG8gd29yayBiZWZvcmUgcmV0dXJuaW5nIHRvIHVzZXJzcGFjZSwgc3dpdGNoIHRvIGtlcm5lbCBzdGFjawotIwotLkxpb193b3JrX3VzZXI6Ci0JbGcJJXIxLF9fTENfS0VSTkVMX1NUQUNLCi0JbXZjCVNUQUNLX0ZSQU1FX09WRVJIRUFEKF9fUFRfU0laRSwlcjEpLDAoJXIxMSkKLQl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMSksX19TRl9CQUNLQ0hBSU4oJXIxKQotCWxhCSVyMTEsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQoJXIxKQotCWxncgklcjE1LCVyMQotCi0jCi0jIE9uZSBvZiB0aGUgd29yayBiaXRzIGlzIG9uLiBGaW5kIG91dCB3aGljaCBvbmUuCi0jCi0uTGlvX3dvcmtfdGlmOgotCXRtCV9fTENfQ1BVX0ZMQUdTKzcsX0NJRl9NQ0NLX1BFTkRJTkcKLQlqbwkuTGlvX21jY2tfcGVuZGluZwotCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX05FRURfUkVTQ0hFRAotCWpvCS5MaW9fcmVzY2hlZHVsZQotCXRtCV9fVElfZmxhZ3MrNyglcjEyKSxfVElGX1NJR1BFTkRJTkcKLQlqbwkuTGlvX3NpZ3BlbmRpbmcKLQl0bQlfX1RJX2ZsYWdzKzcoJXIxMiksX1RJRl9OT1RJRllfUkVTVU1FCi0Jam8JLkxpb19ub3RpZnlfcmVzdW1lCi0JdG0JX19MQ19DUFVfRkxBR1MrNyxfQ0lGX0FTQ0UKLQlqbwkuTGlvX3VhY2Nlc3MKLQlqCS5MaW9fcmV0dXJuCQkjIGJld2FyZSBvZiBjcml0aWNhbCBzZWN0aW9uIGNsZWFudXAKLQotIwotIyBfQ0lGX01DQ0tfUEVORElORyBpcyBzZXQsIGNhbGwgaGFuZGxlcgotIwotLkxpb19tY2NrX3BlbmRpbmc6Ci0JIyBUUkFDRV9JUlFTX09OIGFscmVhZHkgZG9uZSBhdCAuTGlvX3JldHVybgotCWJyYXNsCSVyMTQsczM5MF9oYW5kbGVfbWNjawkjIFRJRiBiaXQgd2lsbCBiZSBjbGVhcmVkIGJ5IGhhbmRsZXIKLQlUUkFDRV9JUlFTX09GRgotCWoJLkxpb19yZXR1cm4KLQotIwotIyBfQ0lGX0FTQ0UgaXMgc2V0LCBsb2FkIHVzZXIgc3BhY2UgYXNjZQotIwotLkxpb191YWNjZXNzOgotCW5pCV9fTENfQ1BVX0ZMQUdTKzcsMjU1LV9DSUZfQVNDRQotCWxjdGxnCSVjMSwlYzEsX19MQ19VU0VSX0FTQ0UJCSMgbG9hZCBwcmltYXJ5IGFzY2UKLQlqCS5MaW9fcmV0dXJuCi0KLSMKLSMgX1RJRl9ORUVEX1JFU0NIRUQgaXMgc2V0LCBjYWxsIHNjaGVkdWxlCi0jCi0uTGlvX3Jlc2NoZWR1bGU6Ci0JIyBUUkFDRV9JUlFTX09OIGFscmVhZHkgZG9uZSBhdCAuTGlvX3JldHVybgotCXNzbQlfX0xDX1NWQ19ORVdfUFNXCSMgcmVlbmFibGUgaW50ZXJydXB0cwotCWJyYXNsCSVyMTQsc2NoZWR1bGUJCSMgY2FsbCBzY2hlZHVsZXIKLQlzc20JX19MQ19QR01fTkVXX1BTVwkjIGRpc2FibGUgSS9PIGFuZCBleHQuIGludGVycnVwdHMKLQlUUkFDRV9JUlFTX09GRgotCWoJLkxpb19yZXR1cm4KLQotIwotIyBfVElGX1NJR1BFTkRJTkcgb3IgaXMgc2V0LCBjYWxsIGRvX3NpZ25hbAotIwotLkxpb19zaWdwZW5kaW5nOgotCSMgVFJBQ0VfSVJRU19PTiBhbHJlYWR5IGRvbmUgYXQgLkxpb19yZXR1cm4KLQlzc20JX19MQ19TVkNfTkVXX1BTVwkjIHJlZW5hYmxlIGludGVycnVwdHMKLQlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKLQlicmFzbAklcjE0LGRvX3NpZ25hbAotCXNzbQlfX0xDX1BHTV9ORVdfUFNXCSMgZGlzYWJsZSBJL08gYW5kIGV4dC4gaW50ZXJydXB0cwotCVRSQUNFX0lSUVNfT0ZGCi0JagkuTGlvX3JldHVybgotCi0jCi0jIF9USUZfTk9USUZZX1JFU1VNRSBvciBpcyBzZXQsIGNhbGwgZG9fbm90aWZ5X3Jlc3VtZQotIwotLkxpb19ub3RpZnlfcmVzdW1lOgotCSMgVFJBQ0VfSVJRU19PTiBhbHJlYWR5IGRvbmUgYXQgLkxpb19yZXR1cm4KLQlzc20JX19MQ19TVkNfTkVXX1BTVwkjIHJlZW5hYmxlIGludGVycnVwdHMKLQlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKLQlicmFzbAklcjE0LGRvX25vdGlmeV9yZXN1bWUKLQlzc20JX19MQ19QR01fTkVXX1BTVwkjIGRpc2FibGUgSS9PIGFuZCBleHQuIGludGVycnVwdHMKLQlUUkFDRV9JUlFTX09GRgotCWoJLkxpb19yZXR1cm4KLQotLyoKLSAqIEV4dGVybmFsIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUKLSAqLwotRU5UUlkoZXh0X2ludF9oYW5kbGVyKQotCVNUQ0sJX19MQ19JTlRfQ0xPQ0sKLQlzdHB0CV9fTENfQVNZTkNfRU5URVJfVElNRVIKLQlzdG1nCSVyOCwlcjE1LF9fTENfU0FWRV9BUkVBX0FTWU5DCi0JbGcJJXIxMCxfX0xDX0xBU1RfQlJFQUsKLQlsZwklcjEyLF9fTENfVEhSRUFEX0lORk8KLQlsYXJsCSVyMTMsc3lzdGVtX2NhbGwKLQlsbWcJJXI4LCVyOSxfX0xDX0VYVF9PTERfUFNXCi0JSEFORExFX1NJRV9JTlRFUkNFUFQgJXIxNCwzCi0JU1dJVENIX0FTWU5DIF9fTENfU0FWRV9BUkVBX0FTWU5DLF9fTENfQVNZTkNfU1RBQ0ssU1RBQ0tfU0hJRlQKLQl0bWhoCSVyOCwweDAwMDEJCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/Ci0JanoJLkxleHRfc2tpcAotCVVQREFURV9WVElNRSAlcjE0LF9fTENfQVNZTkNfRU5URVJfVElNRVIKLQlMQVNUX0JSRUFLICVyMTQKLS5MZXh0X3NraXA6Ci0Jc3RtZwklcjAsJXI3LF9fUFRfUjAoJXIxMSkKLQltdmMJX19QVF9SOCg2NCwlcjExKSxfX0xDX1NBVkVfQVJFQV9BU1lOQwotCXN0bWcJJXI4LCVyOSxfX1BUX1BTVyglcjExKQotCWxnaGkJJXIxLF9fTENfRVhUX1BBUkFNUzIKLQltdmMJX19QVF9JTlRfQ09ERSg0LCVyMTEpLF9fTENfRVhUX0NQVV9BRERSCi0JbXZjCV9fUFRfSU5UX1BBUk0oNCwlcjExKSxfX0xDX0VYVF9QQVJBTVMKLQltdmMJX19QVF9JTlRfUEFSTV9MT05HKDgsJXIxMSksMCglcjEpCi0JeGMJX19QVF9GTEFHUyg4LCVyMTEpLF9fUFRfRkxBR1MoJXIxMSkKLQlUUkFDRV9JUlFTX09GRgotCXhjCV9fU0ZfQkFDS0NIQUlOKDgsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkKLQlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKLQlsZ2hpCSVyMyxFWFRfSU5URVJSVVBUCi0JYnJhc2wJJXIxNCxkb19JUlEKLQlqCS5MaW9fcmV0dXJuCi0KLS8qCi0gKiBMb2FkIGlkbGUgUFNXLiBUaGUgc2Vjb25kICJoYWxmIiBvZiB0aGlzIGZ1bmN0aW9uIGlzIGluIC5MY2xlYW51cF9pZGxlLgotICovCi1FTlRSWShwc3dfaWRsZSkKLQlzdGcJJXIzLF9fU0ZfRU1QVFkoJXIxNSkKLQlsYXJsCSVyMSwuTHBzd19pZGxlX2xwc3crNAotCXN0ZwklcjEsX19TRl9FTVBUWSs4KCVyMTUpCi0JU1RDSwlfX0NMT0NLX0lETEVfRU5URVIoJXIyKQotCXN0cHQJX19USU1FUl9JRExFX0VOVEVSKCVyMikKLS5McHN3X2lkbGVfbHBzdzoKLQlscHN3ZQlfX1NGX0VNUFRZKCVyMTUpCi0JYnIJJXIxNAotLkxwc3dfaWRsZV9lbmQ6Ci0KLS5MX19jcml0aWNhbF9lbmQ6Ci0KLS8qCi0gKiBNYWNoaW5lIGNoZWNrIGhhbmRsZXIgcm91dGluZXMKLSAqLwotRU5UUlkobWNja19pbnRfaGFuZGxlcikKLQlTVENLCV9fTENfTUNDS19DTE9DSwotCWxhCSVyMSw0MDk1CQkjIHJldmFsaWRhdGUgcjEKLQlzcHQJX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBLTQwOTUoJXIxKQkjIHJldmFsaWRhdGUgY3B1IHRpbWVyCi0JbG1nCSVyMCwlcjE1LF9fTENfR1BSRUdTX1NBVkVfQVJFQS00MDk1KCVyMSkjIHJldmFsaWRhdGUgZ3BycwotCWxnCSVyMTAsX19MQ19MQVNUX0JSRUFLCi0JbGcJJXIxMixfX0xDX1RIUkVBRF9JTkZPCi0JbGFybAklcjEzLHN5c3RlbV9jYWxsCi0JbG1nCSVyOCwlcjksX19MQ19NQ0tfT0xEX1BTVwotCUhBTkRMRV9TSUVfSU5URVJDRVBUICVyMTQsNAotCXRtCV9fTENfTUNDS19DT0RFLDB4ODAJIyBzeXN0ZW0gZGFtYWdlPwotCWpvCS5MbWNja19wYW5pYwkJIyB5ZXMgLT4gcmVzdCBvZiBtY2NrIGNvZGUgaW52YWxpZAotCWxnaGkJJXIxNCxfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEKLQltdmMJX19MQ19NQ0NLX0VOVEVSX1RJTUVSKDgpLDAoJXIxNCkKLQl0bQlfX0xDX01DQ0tfQ09ERSs1LDB4MDIJIyBzdG9yZWQgY3B1IHRpbWVyIHZhbHVlIHZhbGlkPwotCWpvCTNmCi0JbGEJJXIxNCxfX0xDX1NZTkNfRU5URVJfVElNRVIKLQljbGMJMCg4LCVyMTQpLF9fTENfQVNZTkNfRU5URVJfVElNRVIKLQlqbAkwZgotCWxhCSVyMTQsX19MQ19BU1lOQ19FTlRFUl9USU1FUgotMDoJY2xjCTAoOCwlcjE0KSxfX0xDX0VYSVRfVElNRVIKLQlqbAkxZgotCWxhCSVyMTQsX19MQ19FWElUX1RJTUVSCi0xOgljbGMJMCg4LCVyMTQpLF9fTENfTEFTVF9VUERBVEVfVElNRVIKLQlqbAkyZgotCWxhCSVyMTQsX19MQ19MQVNUX1VQREFURV9USU1FUgotMjoJc3B0CTAoJXIxNCkKLQltdmMJX19MQ19NQ0NLX0VOVEVSX1RJTUVSKDgpLDAoJXIxNCkKLTM6CXRtCV9fTENfTUNDS19DT0RFKzIsMHgwOQkjIG13cCArIGlhIG9mIG9sZCBwc3cgdmFsaWQ/Ci0Jam5vCS5MbWNja19wYW5pYwkJIyBubyAtPiBza2lwIGNsZWFudXAgY3JpdGljYWwKLQlTV0lUQ0hfQVNZTkMgX19MQ19HUFJFR1NfU0FWRV9BUkVBKzY0LF9fTENfUEFOSUNfU1RBQ0ssUEFHRV9TSElGVAotCXRtCSVyOCwweDAwMDEJCSMgaW50ZXJydXB0aW5nIGZyb20gdXNlciA/Ci0JanoJLkxtY2NrX3NraXAKLQlVUERBVEVfVlRJTUUgJXIxNCxfX0xDX01DQ0tfRU5URVJfVElNRVIKLQlMQVNUX0JSRUFLICVyMTQKLS5MbWNja19za2lwOgotCWxnaGkJJXIxNCxfX0xDX0dQUkVHU19TQVZFX0FSRUErNjQKLQlzdG1nCSVyMCwlcjcsX19QVF9SMCglcjExKQotCW12YwlfX1BUX1I4KDY0LCVyMTEpLDAoJXIxNCkKLQlzdG1nCSVyOCwlcjksX19QVF9QU1coJXIxMSkKLQl4YwlfX1BUX0ZMQUdTKDgsJXIxMSksX19QVF9GTEFHUyglcjExKQotCXhjCV9fU0ZfQkFDS0NIQUlOKDgsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkKLQlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKLQlicmFzbAklcjE0LHMzOTBfZG9fbWFjaGluZV9jaGVjawotCXRtCV9fUFRfUFNXKzEoJXIxMSksMHgwMQkjIHJldHVybmluZyB0byB1c2VyID8KLQlqbm8JLkxtY2NrX3JldHVybgotCWxnCSVyMSxfX0xDX0tFUk5FTF9TVEFDSwkjIHN3aXRjaCB0byBrZXJuZWwgc3RhY2sKLQltdmMJU1RBQ0tfRlJBTUVfT1ZFUkhFQUQoX19QVF9TSVpFLCVyMSksMCglcjExKQotCXhjCV9fU0ZfQkFDS0NIQUlOKDgsJXIxKSxfX1NGX0JBQ0tDSEFJTiglcjEpCi0JbGEJJXIxMSxTVEFDS19GUkFNRV9PVkVSSEVBRCglcjEpCi0JbGdyCSVyMTUsJXIxCi0Jc3NtCV9fTENfUEdNX05FV19QU1cJIyB0dXJuIGRhdCBvbiwga2VlcCBpcnFzIG9mZgotCXRtCV9fTENfQ1BVX0ZMQUdTKzcsX0NJRl9NQ0NLX1BFTkRJTkcKLQlqbm8JLkxtY2NrX3JldHVybgotCVRSQUNFX0lSUVNfT0ZGCi0JYnJhc2wJJXIxNCxzMzkwX2hhbmRsZV9tY2NrCi0JVFJBQ0VfSVJRU19PTgotLkxtY2NrX3JldHVybjoKLQlsZwklcjE0LF9fTENfVkRTT19QRVJfQ1BVCi0JbG1nCSVyMCwlcjEwLF9fUFRfUjAoJXIxMSkKLQltdmMJX19MQ19SRVRVUk5fTUNDS19QU1coMTYpLF9fUFRfUFNXKCVyMTEpICMgbW92ZSByZXR1cm4gUFNXCi0JdG0JX19MQ19SRVRVUk5fTUNDS19QU1crMSwweDAxICMgcmV0dXJuaW5nIHRvIHVzZXIgPwotCWpubwkwZgotCXN0cHQJX19MQ19FWElUX1RJTUVSCi0JbXZjCV9fVkRTT19FQ1RHX0JBU0UoMTYsJXIxNCksX19MQ19FWElUX1RJTUVSCi0wOglsbWcJJXIxMSwlcjE1LF9fUFRfUjExKCVyMTEpCi0JbHBzd2UJX19MQ19SRVRVUk5fTUNDS19QU1cKLQotLkxtY2NrX3BhbmljOgotCWxnCSVyMTQsX19MQ19QQU5JQ19TVEFDSwotCXNsZ3IJJXIxNCwlcjE1Ci0Jc3JhZwklcjE0LCVyMTQsUEFHRV9TSElGVAotCWp6CTBmCi0JbGcJJXIxNSxfX0xDX1BBTklDX1NUQUNLCi0wOglhZ2hpCSVyMTUsLShTVEFDS19GUkFNRV9PVkVSSEVBRCArIF9fUFRfU0laRSkKLQlqCS5MbWNja19za2lwCi0KLSMKLSMgUFNXIHJlc3RhcnQgaW50ZXJydXB0IGhhbmRsZXIKLSMKLUVOVFJZKHJlc3RhcnRfaW50X2hhbmRsZXIpCi0Jc3RnCSVyMTUsX19MQ19TQVZFX0FSRUFfUkVTVEFSVAotCWxnCSVyMTUsX19MQ19SRVNUQVJUX1NUQUNLCi0JYWdoaQklcjE1LC1fX1BUX1NJWkUJCQkjIGNyZWF0ZSBwdF9yZWdzIG9uIHN0YWNrCi0JeGMJMChfX1BUX1NJWkUsJXIxNSksMCglcjE1KQotCXN0bWcJJXIwLCVyMTQsX19QVF9SMCglcjE1KQotCW12YwlfX1BUX1IxNSg4LCVyMTUpLF9fTENfU0FWRV9BUkVBX1JFU1RBUlQKLQltdmMJX19QVF9QU1coMTYsJXIxNSksX19MQ19SU1RfT0xEX1BTVyAjIHN0b3JlIHJlc3RhcnQgb2xkIHBzdwotCWFnaGkJJXIxNSwtU1RBQ0tfRlJBTUVfT1ZFUkhFQUQJIyBjcmVhdGUgc3RhY2sgZnJhbWUgb24gc3RhY2sKLQl4YwkwKFNUQUNLX0ZSQU1FX09WRVJIRUFELCVyMTUpLDAoJXIxNSkKLQlsZwklcjEsX19MQ19SRVNUQVJUX0ZOCQkjIGxvYWQgZm4sIHBhcm0gJiBzb3VyY2UgY3B1Ci0JbGcJJXIyLF9fTENfUkVTVEFSVF9EQVRBCi0JbGcJJXIzLF9fTENfUkVTVEFSVF9TT1VSQ0UKLQlsdGdyCSVyMywlcjMJCQkJIyB0ZXN0IHNvdXJjZSBjcHUgYWRkcmVzcwotCWptCTFmCQkJCSMgbmVnYXRpdmUgLT4gc2tpcCBzb3VyY2Ugc3RvcAotMDoJc2lncAklcjQsJXIzLFNJR1BfU0VOU0UJCSMgc2lncCBzZW5zZSB0byBzb3VyY2UgY3B1Ci0JYnJjCTEwLDBiCQkJCSMgd2FpdCBmb3Igc3RhdHVzIHN0b3JlZAotMToJYmFzcgklcjE0LCVyMQkJCSMgY2FsbCBmdW5jdGlvbgotCXN0YXAJX19TRl9FTVBUWSglcjE1KQkJIyBzdG9yZSBjcHUgYWRkcmVzcwotCWxsZ2gJJXIzLF9fU0ZfRU1QVFkoJXIxNSkKLTI6CXNpZ3AJJXI0LCVyMyxTSUdQX1NUT1AJCSMgc2lncCBzdG9wIHRvIGN1cnJlbnQgY3B1Ci0JYnJjCTIsMmIKLTM6CWoJM2IKLQotCS5zZWN0aW9uIC5rcHJvYmVzLnRleHQsICJheCIKLQotI2lmZGVmIENPTkZJR19DSEVDS19TVEFDSwotLyoKLSAqIFRoZSBzeW5jaHJvbm91cyBvciB0aGUgYXN5bmNocm9ub3VzIHN0YWNrIG92ZXJmbG93ZWQuIFdlIGFyZSBkZWFkLgotICogTm8gbmVlZCB0byBwcm9wZXJseSBzYXZlIHRoZSByZWdpc3RlcnMsIHdlIGFyZSBnb2luZyB0byBwYW5pYyBhbnl3YXkuCi0gKiBTZXR1cCBhIHB0X3JlZ3Mgc28gdGhhdCBzaG93X3RyYWNlIGNhbiBwcm92aWRlIGEgZ29vZCBjYWxsIHRyYWNlLgotICovCi1zdGFja19vdmVyZmxvdzoKLQlsZwklcjE1LF9fTENfUEFOSUNfU1RBQ0sJIyBjaGFuZ2UgdG8gcGFuaWMgc3RhY2sKLQlsYQklcjExLFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCi0Jc3RtZwklcjAsJXI3LF9fUFRfUjAoJXIxMSkKLQlzdG1nCSVyOCwlcjksX19QVF9QU1coJXIxMSkKLQltdmMJX19QVF9SOCg2NCwlcjExKSwwKCVyMTQpCi0Jc3RnCSVyMTAsX19QVF9PUklHX0dQUjIoJXIxMSkgIyBzdG9yZSBsYXN0IGJyZWFrIHRvIG9yaWdfZ3ByMgotCXhjCV9fU0ZfQkFDS0NIQUlOKDgsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkKLQlsZ3IJJXIyLCVyMTEJCSMgcGFzcyBwb2ludGVyIHRvIHB0X3JlZ3MKLQlqZwlrZXJuZWxfc3RhY2tfb3ZlcmZsb3cKLSNlbmRpZgotCi0JLmFsaWduCTgKLS5MY2xlYW51cF90YWJsZToKLQkucXVhZAlzeXN0ZW1fY2FsbAotCS5xdWFkCS5Mc3lzY19kb19zdmMKLQkucXVhZAkuTHN5c2NfdGlmCi0JLnF1YWQJLkxzeXNjX3Jlc3RvcmUKLQkucXVhZAkuTHN5c2NfZG9uZQotCS5xdWFkCS5MaW9fdGlmCi0JLnF1YWQJLkxpb19yZXN0b3JlCi0JLnF1YWQJLkxpb19kb25lCi0JLnF1YWQJcHN3X2lkbGUKLQkucXVhZAkuTHBzd19pZGxlX2VuZAotCi1jbGVhbnVwX2NyaXRpY2FsOgotCWNsZwklcjksQkFTRUQoLkxjbGVhbnVwX3RhYmxlKQkjIHN5c3RlbV9jYWxsCi0JamwJMGYKLQljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSs4KQkjIC5Mc3lzY19kb19zdmMKLQlqbAkuTGNsZWFudXBfc3lzdGVtX2NhbGwKLQljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSsxNikJIyAuTHN5c2NfdGlmCi0JamwJMGYKLQljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSsyNCkJIyAuTHN5c2NfcmVzdG9yZQotCWpsCS5MY2xlYW51cF9zeXNjX3RpZgotCWNsZwklcjksQkFTRUQoLkxjbGVhbnVwX3RhYmxlKzMyKQkjIC5Mc3lzY19kb25lCi0JamwJLkxjbGVhbnVwX3N5c2NfcmVzdG9yZQotCWNsZwklcjksQkFTRUQoLkxjbGVhbnVwX3RhYmxlKzQwKQkjIC5MaW9fdGlmCi0JamwJMGYKLQljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSs0OCkJIyAuTGlvX3Jlc3RvcmUKLQlqbAkuTGNsZWFudXBfaW9fdGlmCi0JY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUrNTYpCSMgLkxpb19kb25lCi0JamwJLkxjbGVhbnVwX2lvX3Jlc3RvcmUKLQljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF90YWJsZSs2NCkJIyBwc3dfaWRsZQotCWpsCTBmCi0JY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfdGFibGUrNzIpCSMgLkxwc3dfaWRsZV9lbmQKLQlqbAkuTGNsZWFudXBfaWRsZQotMDoJYnIJJXIxNAotCi0KLS5MY2xlYW51cF9zeXN0ZW1fY2FsbDoKLQkjIGNoZWNrIGlmIHN0cHQgaGFzIGJlZW4gZXhlY3V0ZWQKLQljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF9zeXN0ZW1fY2FsbF9pbnNuKQotCWpoCTBmCi0JbXZjCV9fTENfU1lOQ19FTlRFUl9USU1FUig4KSxfX0xDX0FTWU5DX0VOVEVSX1RJTUVSCi0JY2doaQklcjExLF9fTENfU0FWRV9BUkVBX0FTWU5DCi0JamUJMGYKLQltdmMJX19MQ19TWU5DX0VOVEVSX1RJTUVSKDgpLF9fTENfTUNDS19FTlRFUl9USU1FUgotMDoJIyBjaGVjayBpZiBzdG1nIGhhcyBiZWVuIGV4ZWN1dGVkCi0JY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbis4KQotCWpoCTBmCi0JbXZjCV9fTENfU0FWRV9BUkVBX1NZTkMoNjQpLDAoJXIxMSkKLTA6CSMgY2hlY2sgaWYgYmFzZSByZWdpc3RlciBzZXR1cCArIFRJRiBiaXQgbG9hZCBoYXMgYmVlbiBkb25lCi0JY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbisxNikKLQlqaGUJMGYKLQkjIHNldCB1cCBzYXZlZCByZWdpc3RlcnMgcjEwIGFuZCByMTIKLQlzdGcJJXIxMCwxNiglcjExKQkJIyByMTAgbGFzdCBicmVhawotCXN0ZwklcjEyLDMyKCVyMTEpCQkjIHIxMiB0aHJlYWQtaW5mbyBwb2ludGVyCi0wOgkjIGNoZWNrIGlmIHRoZSB1c2VyIHRpbWUgdXBkYXRlIGhhcyBiZWVuIGRvbmUKLQljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF9zeXN0ZW1fY2FsbF9pbnNuKzI0KQotCWpoCTBmCi0JbGcJJXIxNSxfX0xDX0VYSVRfVElNRVIKLQlzbGcJJXIxNSxfX0xDX1NZTkNfRU5URVJfVElNRVIKLQlhbGcJJXIxNSxfX0xDX1VTRVJfVElNRVIKLQlzdGcJJXIxNSxfX0xDX1VTRVJfVElNRVIKLTA6CSMgY2hlY2sgaWYgdGhlIHN5c3RlbSB0aW1lIHVwZGF0ZSBoYXMgYmVlbiBkb25lCi0JY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbiszMikKLQlqaAkwZgotCWxnCSVyMTUsX19MQ19MQVNUX1VQREFURV9USU1FUgotCXNsZwklcjE1LF9fTENfRVhJVF9USU1FUgotCWFsZwklcjE1LF9fTENfU1lTVEVNX1RJTUVSCi0Jc3RnCSVyMTUsX19MQ19TWVNURU1fVElNRVIKLTA6CSMgdXBkYXRlIGFjY291bnRpbmcgdGltZSBzdGFtcAotCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fTENfU1lOQ19FTlRFUl9USU1FUgotCSMgZG8gTEFTVF9CUkVBSwotCWxnCSVyOSwxNiglcjExKQotCXNyYWcJJXI5LCVyOSwyMwotCWp6CTBmCi0JbXZjCV9fVElfbGFzdF9icmVhayg4LCVyMTIpLDE2KCVyMTEpCi0wOgkjIHNldCB1cCBzYXZlZCByZWdpc3RlciByMTEKLQlsZwklcjE1LF9fTENfS0VSTkVMX1NUQUNLCi0JbGEJJXI5LFNUQUNLX0ZSQU1FX09WRVJIRUFEKCVyMTUpCi0Jc3RnCSVyOSwyNCglcjExKQkJIyByMTEgcHRfcmVncyBwb2ludGVyCi0JIyBmaWxsIHB0X3JlZ3MKLQltdmMJX19QVF9SOCg2NCwlcjkpLF9fTENfU0FWRV9BUkVBX1NZTkMKLQlzdG1nCSVyMCwlcjcsX19QVF9SMCglcjkpCi0JbXZjCV9fUFRfUFNXKDE2LCVyOSksX19MQ19TVkNfT0xEX1BTVwotCW12YwlfX1BUX0lOVF9DT0RFKDQsJXI5KSxfX0xDX1NWQ19JTEMKLQl4YwlfX1BUX0ZMQUdTKDgsJXI5KSxfX1BUX0ZMQUdTKCVyOSkKLQltdmkJX19QVF9GTEFHUys3KCVyOSksX1BJRl9TWVNDQUxMCi0JIyBzZXR1cCBzYXZlZCByZWdpc3RlciByMTUKLQlzdGcJJXIxNSw1NiglcjExKQkJIyByMTUgc3RhY2sgcG9pbnRlcgotCSMgc2V0IG5ldyBwc3cgYWRkcmVzcyBhbmQgZXhpdAotCWxhcmwJJXI5LC5Mc3lzY19kb19zdmMKLQlicgklcjE0Ci0uTGNsZWFudXBfc3lzdGVtX2NhbGxfaW5zbjoKLQkucXVhZAlzeXN0ZW1fY2FsbAotCS5xdWFkCS5Mc3lzY19zdG1nCi0JLnF1YWQJLkxzeXNjX3BlcgotCS5xdWFkCS5Mc3lzY192dGltZSsxOAotCS5xdWFkCS5Mc3lzY192dGltZSs0MgotCi0uTGNsZWFudXBfc3lzY190aWY6Ci0JbGFybAklcjksLkxzeXNjX3RpZgotCWJyCSVyMTQKLQotLkxjbGVhbnVwX3N5c2NfcmVzdG9yZToKLQljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF9zeXNjX3Jlc3RvcmVfaW5zbikKLQlqZQkwZgotCWxnCSVyOSwyNCglcjExKQkJIyBnZXQgc2F2ZWQgcG9pbnRlciB0byBwdF9yZWdzCi0JbXZjCV9fTENfUkVUVVJOX1BTVygxNiksX19QVF9QU1coJXI5KQotCW12YwkwKDY0LCVyMTEpLF9fUFRfUjgoJXI5KQotCWxtZwklcjAsJXI3LF9fUFRfUjAoJXI5KQotMDoJbG1nCSVyOCwlcjksX19MQ19SRVRVUk5fUFNXCi0JYnIJJXIxNAotLkxjbGVhbnVwX3N5c2NfcmVzdG9yZV9pbnNuOgotCS5xdWFkCS5Mc3lzY19kb25lIC0gNAotCi0uTGNsZWFudXBfaW9fdGlmOgotCWxhcmwJJXI5LC5MaW9fdGlmCi0JYnIJJXIxNAotCi0uTGNsZWFudXBfaW9fcmVzdG9yZToKLQljbGcJJXI5LEJBU0VEKC5MY2xlYW51cF9pb19yZXN0b3JlX2luc24pCi0JamUJMGYKLQlsZwklcjksMjQoJXIxMSkJCSMgZ2V0IHNhdmVkIHIxMSBwb2ludGVyIHRvIHB0X3JlZ3MKLQltdmMJX19MQ19SRVRVUk5fUFNXKDE2KSxfX1BUX1BTVyglcjkpCi0JbXZjCTAoNjQsJXIxMSksX19QVF9SOCglcjkpCi0JbG1nCSVyMCwlcjcsX19QVF9SMCglcjkpCi0wOglsbWcJJXI4LCVyOSxfX0xDX1JFVFVSTl9QU1cKLQlicgklcjE0Ci0uTGNsZWFudXBfaW9fcmVzdG9yZV9pbnNuOgotCS5xdWFkCS5MaW9fZG9uZSAtIDQKLQotLkxjbGVhbnVwX2lkbGU6Ci0JIyBjb3B5IGludGVycnVwdCBjbG9jayAmIGNwdSB0aW1lcgotCW12YwlfX0NMT0NLX0lETEVfRVhJVCg4LCVyMiksX19MQ19JTlRfQ0xPQ0sKLQltdmMJX19USU1FUl9JRExFX0VYSVQoOCwlcjIpLF9fTENfQVNZTkNfRU5URVJfVElNRVIKLQljZ2hpCSVyMTEsX19MQ19TQVZFX0FSRUFfQVNZTkMKLQlqZQkwZgotCW12YwlfX0NMT0NLX0lETEVfRVhJVCg4LCVyMiksX19MQ19NQ0NLX0NMT0NLCi0JbXZjCV9fVElNRVJfSURMRV9FWElUKDgsJXIyKSxfX0xDX01DQ0tfRU5URVJfVElNRVIKLTA6CSMgY2hlY2sgaWYgc3RjayAmIHN0cHQgaGF2ZSBiZWVuIGV4ZWN1dGVkCi0JY2xnCSVyOSxCQVNFRCguTGNsZWFudXBfaWRsZV9pbnNuKQotCWpoZQkxZgotCW12YwlfX0NMT0NLX0lETEVfRU5URVIoOCwlcjIpLF9fQ0xPQ0tfSURMRV9FWElUKCVyMikKLQltdmMJX19USU1FUl9JRExFX0VOVEVSKDgsJXIyKSxfX1RJTUVSX0lETEVfRVhJVCglcjIpCi0xOgkjIGFjY291bnQgc3lzdGVtIHRpbWUgZ29pbmcgaWRsZQotCWxnCSVyOSxfX0xDX1NURUFMX1RJTUVSCi0JYWxnCSVyOSxfX0NMT0NLX0lETEVfRU5URVIoJXIyKQotCXNsZwklcjksX19MQ19MQVNUX1VQREFURV9DTE9DSwotCXN0ZwklcjksX19MQ19TVEVBTF9USU1FUgotCW12YwlfX0xDX0xBU1RfVVBEQVRFX0NMT0NLKDgpLF9fQ0xPQ0tfSURMRV9FWElUKCVyMikKLQlsZwklcjksX19MQ19TWVNURU1fVElNRVIKLQlhbGcJJXI5LF9fTENfTEFTVF9VUERBVEVfVElNRVIKLQlzbGcJJXI5LF9fVElNRVJfSURMRV9FTlRFUiglcjIpCi0Jc3RnCSVyOSxfX0xDX1NZU1RFTV9USU1FUgotCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLF9fVElNRVJfSURMRV9FWElUKCVyMikKLQkjIHByZXBhcmUgcmV0dXJuIHBzdwotCW5paGgJJXI4LDB4ZmNmZAkJIyBjbGVhciBpcnEgJiB3YWl0IHN0YXRlIGJpdHMKLQlsZwklcjksNDgoJXIxMSkJCSMgcmV0dXJuIGZyb20gcHN3X2lkbGUKLQlicgklcjE0Ci0uTGNsZWFudXBfaWRsZV9pbnNuOgotCS5xdWFkCS5McHN3X2lkbGVfbHBzdwotCi0vKgotICogSW50ZWdlciBjb25zdGFudHMKLSAqLwotCS5hbGlnbgk4Ci0uTGNyaXRpY2FsX3N0YXJ0OgotCS5xdWFkCS5MX19jcml0aWNhbF9zdGFydAotLkxjcml0aWNhbF9sZW5ndGg6Ci0JLnF1YWQJLkxfX2NyaXRpY2FsX2VuZCAtIC5MX19jcml0aWNhbF9zdGFydAotCi0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19LVk0pCi0vKgotICogc2llNjRhIGNhbGxpbmcgY29udmVudGlvbjoKLSAqICVyMiBwb2ludGVyIHRvIHNpZSBjb250cm9sIGJsb2NrCi0gKiAlcjMgZ3Vlc3QgcmVnaXN0ZXIgc2F2ZSBhcmVhCi0gKi8KLUVOVFJZKHNpZTY0YSkKLQlzdG1nCSVyNiwlcjE0LF9fU0ZfR1BSUyglcjE1KQkjIHNhdmUga2VybmVsIHJlZ2lzdGVycwotCXN0ZwklcjIsX19TRl9FTVBUWSglcjE1KQkJIyBzYXZlIGNvbnRyb2wgYmxvY2sgcG9pbnRlcgotCXN0ZwklcjMsX19TRl9FTVBUWSs4KCVyMTUpCQkjIHNhdmUgZ3Vlc3QgcmVnaXN0ZXIgc2F2ZSBhcmVhCi0JeGMJX19TRl9FTVBUWSsxNigxNiwlcjE1KSxfX1NGX0VNUFRZKzE2KCVyMTUpICMgaG9zdCBpZCAmIHJlYXNvbgotCWxtZwklcjAsJXIxMywwKCVyMykJCQkjIGxvYWQgZ3Vlc3QgZ3BycyAwLTEzCi0JbGcJJXIxNCxfX0xDX0dNQVAJCQkjIGdldCBnbWFwIHBvaW50ZXIKLQlsdGdyCSVyMTQsJXIxNAotCWp6CS5Mc2llX2dtYXAKLQlsY3RsZwklYzEsJWMxLF9fR01BUF9BU0NFKCVyMTQpCSMgbG9hZCBwcmltYXJ5IGFzY2UKLS5Mc2llX2dtYXA6Ci0JbGcJJXIxNCxfX1NGX0VNUFRZKCVyMTUpCQkjIGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIKLQlvaQlfX1NJRV9QUk9HMEMrMyglcjE0KSwxCQkjIHdlIGFyZSBnb2luZyBpbnRvIFNJRSBub3cKLQl0bQlfX1NJRV9QUk9HMjArMyglcjE0KSwxCQkjIGxhc3QgZXhpdC4uLgotCWpuegkuTHNpZV9kb25lCi0JTFBQCV9fU0ZfRU1QVFkoJXIxNSkJCSMgc2V0IGd1ZXN0IGlkCi0Jc2llCTAoJXIxNCkKLS5Mc2llX2RvbmU6Ci0JTFBQCV9fU0ZfRU1QVFkrMTYoJXIxNSkJCSMgc2V0IGhvc3QgaWQKLQluaQlfX1NJRV9QUk9HMEMrMyglcjE0KSwweGZlCSMgbm8gbG9uZ2VyIGluIFNJRQotCWxjdGxnCSVjMSwlYzEsX19MQ19VU0VSX0FTQ0UJCSMgbG9hZCBwcmltYXJ5IGFzY2UKLSMgc29tZSBwcm9ncmFtIGNoZWNrcyBhcmUgc3VwcHJlc3NpbmcuIEMgY29kZSAoZS5nLiBkb19wcm90ZWN0aW9uX2V4Y2VwdGlvbikKLSMgd2lsbCByZXdpbmQgdGhlIFBTVyBieSB0aGUgSUxDLCB3aGljaCBpcyA0IGJ5dGVzIGluIGNhc2Ugb2YgU0lFLiBPdGhlcgotIyBpbnN0cnVjdGlvbnMgYmV0d2VlbiBzaWU2NGEgYW5kIC5Mc2llX2RvbmUgc2hvdWxkIG5vdCBjYXVzZSBwcm9ncmFtCi0jIGludGVycnVwdHMuIFNvIGxldHMgdXNlIGEgbm9wICg0NyAwMCAwMCAwMCkgYXMgYSBsYW5kaW5nIHBhZC4KLSMgU2VlIGFsc28gSEFORExFX1NJRV9JTlRFUkNFUFQKLS5McmV3aW5kX3BhZDoKLQlub3AJMAotCS5nbG9ibCBzaWVfZXhpdAotc2llX2V4aXQ6Ci0JbGcJJXIxNCxfX1NGX0VNUFRZKzgoJXIxNSkJCSMgbG9hZCBndWVzdCByZWdpc3RlciBzYXZlIGFyZWEKLQlzdG1nCSVyMCwlcjEzLDAoJXIxNCkJCSMgc2F2ZSBndWVzdCBncHJzIDAtMTMKLQlsbWcJJXI2LCVyMTQsX19TRl9HUFJTKCVyMTUpCSMgcmVzdG9yZSBrZXJuZWwgcmVnaXN0ZXJzCi0JbGcJJXIyLF9fU0ZfRU1QVFkrMjQoJXIxNSkJCSMgcmV0dXJuIGV4aXQgcmVhc29uIGNvZGUKLQlicgklcjE0Ci0uTHNpZV9mYXVsdDoKLQlsZ2hpCSVyMTQsLUVGQVVMVAotCXN0ZwklcjE0LF9fU0ZfRU1QVFkrMjQoJXIxNSkJIyBzZXQgZXhpdCByZWFzb24gY29kZQotCWoJc2llX2V4aXQKLQotCS5hbGlnbgk4Ci0uTHNpZV9jcml0aWNhbDoKLQkucXVhZAkuTHNpZV9nbWFwCi0uTHNpZV9jcml0aWNhbF9sZW5ndGg6Ci0JLnF1YWQJLkxzaWVfZG9uZSAtIC5Mc2llX2dtYXAKLQotCUVYX1RBQkxFKC5McmV3aW5kX3BhZCwuTHNpZV9mYXVsdCkKLQlFWF9UQUJMRShzaWVfZXhpdCwuTHNpZV9mYXVsdCkKLSNlbmRpZgotCi0JCS5zZWN0aW9uIC5yb2RhdGEsICJhIgotI2RlZmluZSBTWVNDQUxMKGVzYSxlc2FtZSxlbXUpCS5sb25nIGVzYW1lCi0JLmdsb2JsCXN5c19jYWxsX3RhYmxlCi1zeXNfY2FsbF90YWJsZToKLSNpbmNsdWRlICJzeXNjYWxscy5TIgotI3VuZGVmIFNZU0NBTEwKLQotI2lmZGVmIENPTkZJR19DT01QQVQKLQotI2RlZmluZSBTWVNDQUxMKGVzYSxlc2FtZSxlbXUpCS5sb25nIGVtdQotCS5nbG9ibAlzeXNfY2FsbF90YWJsZV9lbXUKLXN5c19jYWxsX3RhYmxlX2VtdToKLSNpbmNsdWRlICJzeXNjYWxscy5TIgotI3VuZGVmIFNZU0NBTEwKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9mdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvZnRyYWNlLmMKaW5kZXggODJjMTk4OS4uZTBlYWYxMSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9mdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2Z0cmFjZS5jCkBAIC01Nyw2ICs1Nyw0NCBAQAogCiB1bnNpZ25lZCBsb25nIGZ0cmFjZV9wbHQ7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBmdHJhY2VfZ2VuZXJhdGVfb3JpZ19pbnNuKHN0cnVjdCBmdHJhY2VfaW5zbiAqaW5zbikKK3sKKyNpZmRlZiBDQ19VU0lOR19IT1RQQVRDSAorCS8qIGJyY2wgMCwwICovCisJaW5zbi0+b3BjID0gMHhjMDA0OworCWluc24tPmRpc3AgPSAwOworI2Vsc2UKKwkvKiBzdGcgcjE0LDgocjE1KSAqLworCWluc24tPm9wYyA9IDB4ZTNlMDsKKwlpbnNuLT5kaXNwID0gMHhmMDA4MDAyNDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGludCBpc19rcHJvYmVfb25fZnRyYWNlKHN0cnVjdCBmdHJhY2VfaW5zbiAqaW5zbikKK3sKKyNpZmRlZiBDT05GSUdfS1BST0JFUworCWlmIChpbnNuLT5vcGMgPT0gQlJFQUtQT0lOVF9JTlNUUlVDVElPTikKKwkJcmV0dXJuIDE7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9nZW5lcmF0ZV9rcHJvYmVfbm9wX2luc24oc3RydWN0IGZ0cmFjZV9pbnNuICppbnNuKQoreworI2lmZGVmIENPTkZJR19LUFJPQkVTCisJaW5zbi0+b3BjID0gQlJFQUtQT0lOVF9JTlNUUlVDVElPTjsKKwlpbnNuLT5kaXNwID0gS1BST0JFX09OX0ZUUkFDRV9OT1A7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9nZW5lcmF0ZV9rcHJvYmVfY2FsbF9pbnNuKHN0cnVjdCBmdHJhY2VfaW5zbiAqaW5zbikKK3sKKyNpZmRlZiBDT05GSUdfS1BST0JFUworCWluc24tPm9wYyA9IEJSRUFLUE9JTlRfSU5TVFJVQ1RJT047CisJaW5zbi0+ZGlzcCA9IEtQUk9CRV9PTl9GVFJBQ0VfQ0FMTDsKKyNlbmRpZgorfQorCiBpbnQgZnRyYWNlX21vZGlmeV9jYWxsKHN0cnVjdCBkeW5fZnRyYWNlICpyZWMsIHVuc2lnbmVkIGxvbmcgb2xkX2FkZHIsCiAJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CkBAIC03MiwxNiArMTEwLDkgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJaWYgKGFkZHIgPT0gTUNPVU5UX0FERFIpIHsKIAkJLyogSW5pdGlhbCBjb2RlIHJlcGxhY2VtZW50ICovCi0jaWZkZWYgQ0NfVVNJTkdfSE9UUEFUQ0gKLQkJLyogV2UgZXhwZWN0IHRvIHNlZSBicmNsIDAsMCAqLwotCQlmdHJhY2VfZ2VuZXJhdGVfbm9wX2luc24oJm9yaWcpOwotI2Vsc2UKLQkJLyogV2UgZXhwZWN0IHRvIHNlZSBzdGcgcjE0LDgocjE1KSAqLwotCQlvcmlnLm9wYyA9IDB4ZTNlMDsKLQkJb3JpZy5kaXNwID0gMHhmMDA4MDAyNDsKLSNlbmRpZgorCQlmdHJhY2VfZ2VuZXJhdGVfb3JpZ19pbnNuKCZvcmlnKTsKIAkJZnRyYWNlX2dlbmVyYXRlX25vcF9pbnNuKCZuZXcpOwotCX0gZWxzZSBpZiAob2xkLm9wYyA9PSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OKSB7CisJfSBlbHNlIGlmIChpc19rcHJvYmVfb25fZnRyYWNlKCZvbGQpKSB7CiAJCS8qCiAJCSAqIElmIHdlIGZpbmQgYSBicmVha3BvaW50IGluc3RydWN0aW9uLCBhIGtwcm9iZSBoYXMgYmVlbgogCQkgKiBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24uIFdlIHdyaXRlIHRoZQpAQCAtODksOSArMTIwLDggQEAKIAkJICogYnl0ZXMgb2YgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIHNvIHRoYXQgdGhlIGtwcm9iZXMKIAkJICogaGFuZGxlciBjYW4gZXhlY3V0ZSBhIG5vcCwgaWYgaXQgcmVhY2hlcyB0aGlzIGJyZWFrcG9pbnQuCiAJCSAqLwotCQluZXcub3BjID0gb3JpZy5vcGMgPSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OOwotCQlvcmlnLmRpc3AgPSBLUFJPQkVfT05fRlRSQUNFX0NBTEw7Ci0JCW5ldy5kaXNwID0gS1BST0JFX09OX0ZUUkFDRV9OT1A7CisJCWZ0cmFjZV9nZW5lcmF0ZV9rcHJvYmVfY2FsbF9pbnNuKCZvcmlnKTsKKwkJZnRyYWNlX2dlbmVyYXRlX2twcm9iZV9ub3BfaW5zbigmbmV3KTsKIAl9IGVsc2UgewogCQkvKiBSZXBsYWNlIGZ0cmFjZSBjYWxsIHdpdGggYSBub3AuICovCiAJCWZ0cmFjZV9nZW5lcmF0ZV9jYWxsX2luc24oJm9yaWcsIHJlYy0+aXApOwpAQCAtMTAwLDggKzEzMCw3IEBACiAJLyogVmVyaWZ5IHRoYXQgdGhlIHRvIGJlIHJlcGxhY2VkIGNvZGUgbWF0Y2hlcyB3aGF0IHdlIGV4cGVjdC4gKi8KIAlpZiAobWVtY21wKCZvcmlnLCAmb2xkLCBzaXplb2Yob2xkKSkpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChwcm9iZV9rZXJuZWxfd3JpdGUoKHZvaWQgKikgcmVjLT5pcCwgJm5ldywgc2l6ZW9mKG5ldykpKQotCQlyZXR1cm4gLUVQRVJNOworCXMzOTBfa2VybmVsX3dyaXRlKCh2b2lkICopIHJlYy0+aXAsICZuZXcsIHNpemVvZihuZXcpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTExLDcgKzE0MCw3IEBACiAKIAlpZiAocHJvYmVfa2VybmVsX3JlYWQoJm9sZCwgKHZvaWQgKikgcmVjLT5pcCwgc2l6ZW9mKG9sZCkpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAob2xkLm9wYyA9PSBCUkVBS1BPSU5UX0lOU1RSVUNUSU9OKSB7CisJaWYgKGlzX2twcm9iZV9vbl9mdHJhY2UoJm9sZCkpIHsKIAkJLyoKIAkJICogSWYgd2UgZmluZCBhIGJyZWFrcG9pbnQgaW5zdHJ1Y3Rpb24sIGEga3Byb2JlIGhhcyBiZWVuCiAJCSAqIHBsYWNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmdW5jdGlvbi4gV2Ugd3JpdGUgdGhlCkBAIC0xMTksOSArMTQ4LDggQEAKIAkJICogYnl0ZXMgb2YgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIHNvIHRoYXQgdGhlIGtwcm9iZXMKIAkJICogaGFuZGxlciBjYW4gZXhlY3V0ZSBhIGJyYXNsIGlmIGl0IHJlYWNoZXMgdGhpcyBicmVha3BvaW50LgogCQkgKi8KLQkJbmV3Lm9wYyA9IG9yaWcub3BjID0gQlJFQUtQT0lOVF9JTlNUUlVDVElPTjsKLQkJb3JpZy5kaXNwID0gS1BST0JFX09OX0ZUUkFDRV9OT1A7Ci0JCW5ldy5kaXNwID0gS1BST0JFX09OX0ZUUkFDRV9DQUxMOworCQlmdHJhY2VfZ2VuZXJhdGVfa3Byb2JlX25vcF9pbnNuKCZvcmlnKTsKKwkJZnRyYWNlX2dlbmVyYXRlX2twcm9iZV9jYWxsX2luc24oJm5ldyk7CiAJfSBlbHNlIHsKIAkJLyogUmVwbGFjZSBub3Agd2l0aCBhbiBmdHJhY2UgY2FsbC4gKi8KIAkJZnRyYWNlX2dlbmVyYXRlX25vcF9pbnNuKCZvcmlnKTsKQEAgLTEzMCw4ICsxNTgsNyBAQAogCS8qIFZlcmlmeSB0aGF0IHRoZSB0byBiZSByZXBsYWNlZCBjb2RlIG1hdGNoZXMgd2hhdCB3ZSBleHBlY3QuICovCiAJaWYgKG1lbWNtcCgmb3JpZywgJm9sZCwgc2l6ZW9mKG9sZCkpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAocHJvYmVfa2VybmVsX3dyaXRlKCh2b2lkICopIHJlYy0+aXAsICZuZXcsIHNpemVvZihuZXcpKSkKLQkJcmV0dXJuIC1FUEVSTTsKKwlzMzkwX2tlcm5lbF93cml0ZSgodm9pZCAqKSByZWMtPmlwLCAmbmV3LCBzaXplb2YobmV3KSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwMiwxNCArMjI5LDE2IEBACiB7CiAJdTggb3AgPSAweDA0OyAvKiBzZXQgbWFzayBmaWVsZCB0byB6ZXJvICovCiAKLQlyZXR1cm4gcHJvYmVfa2VybmVsX3dyaXRlKF9fdmEoZnRyYWNlX2dyYXBoX2NhbGxlcikrMSwgJm9wLCBzaXplb2Yob3ApKTsKKwlzMzkwX2tlcm5lbF93cml0ZShfX3ZhKGZ0cmFjZV9ncmFwaF9jYWxsZXIpKzEsICZvcCwgc2l6ZW9mKG9wKSk7CisJcmV0dXJuIDA7CiB9CiAKIGludCBmdHJhY2VfZGlzYWJsZV9mdHJhY2VfZ3JhcGhfY2FsbGVyKHZvaWQpCiB7CiAJdTggb3AgPSAweGY0OyAvKiBzZXQgbWFzayBmaWVsZCB0byBhbGwgb25lcyAqLwogCi0JcmV0dXJuIHByb2JlX2tlcm5lbF93cml0ZShfX3ZhKGZ0cmFjZV9ncmFwaF9jYWxsZXIpKzEsICZvcCwgc2l6ZW9mKG9wKSk7CisJczM5MF9rZXJuZWxfd3JpdGUoX192YShmdHJhY2VfZ3JhcGhfY2FsbGVyKSsxLCAmb3AsIHNpemVvZihvcCkpOworCXJldHVybiAwOwogfQogCiAjZW5kaWYgLyogQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkLlMgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQuUwppbmRleCAxMzJmNGM5Li41OWI3YzY0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWQuUwpAQCAtMjcsMTEgKzI3LDcgQEAKICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgogCi0jaWZkZWYgQ09ORklHXzY0QklUCiAjZGVmaW5lIEFSQ0hfT0ZGU0VUCTQKLSNlbHNlCi0jZGVmaW5lIEFSQ0hfT0ZGU0VUCTAKLSNlbmRpZgogCiBfX0hFQUQKIApAQCAtNjcsNyArNjMsNiBAQAogIyBzdWJyb3V0aW5lIHRvIHNldCBhcmNoaXRlY3R1cmUgbW9kZQogIwogLkxzZXRtb2RlOgotI2lmZGVmIENPTkZJR182NEJJVAogCW12aQlfX0xDX0FSX01PREVfSUQsMQkjIHNldCBlc2FtZSBmbGFnCiAJc2xyCSVyMCwlcjAgCQkjIHNldCBjcHVpZCB0byB6ZXJvCiAJbGhpCSVyMSwyCQkJIyBtb2RlIDIgPSBlc2FtZSAoZHVtcCkKQEAgLTc2LDE2ICs3MSwxMiBAQAogCS5maWxsCTE2LDQsMHgwCiAwOglsbWgJJXIwLCVyMTUsMCglcjEzKQkjIGNsZWFyIGhpZ2gtb3JkZXIgaGFsZiBvZiBncHJzCiAJc2FtMzEJCQkJIyBzd2l0Y2ggdG8gMzEgYml0IGFkZHJlc3NpbmcgbW9kZQotI2Vsc2UKLQltdmkJX19MQ19BUl9NT0RFX0lELDAJIyBzZXQgRVNBIGZsYWcgKG1vZGUgMCkKLSNlbmRpZgogCWJyCSVyMTQKIAogIwogIyBzdWJyb3V0aW5lIHRvIHdhaXQgZm9yIGVuZCBJL08KICMKIC5MaXJxd2FpdDoKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAltdmMJMHgxZjAoMTYpLC5MbmV3cHN3CSMgc2V0IHVwIElPIGludGVycnVwdCBwc3cKIAlscHN3CS5Md2FpdHBzdwogLkxpb2ludDoKQEAgLTkzLDE1ICs4NCw2IEBACiAJLmFsaWduCTgKIC5MbmV3cHN3OgogCS5xdWFkCTB4MDAwMDAwMDA4MDAwMDAwMCwuTGlvaW50Ci0jZWxzZQotCW12YwkweDc4KDgpLC5MbmV3cHN3CSMgc2V0IHVwIElPIGludGVycnVwdCBwc3cKLQlscHN3CS5Md2FpdHBzdwotLkxpb2ludDoKLQlicgklcjE0Ci0JLmFsaWduCTgKLS5MbmV3cHN3OgotCS5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMCsuTGlvaW50Ci0jZW5kaWYKIC5Md2FpdHBzdzoKIAkubG9uZwkweDAyMGEwMDAwLDB4ODAwMDAwMDArLkxpb2ludAogCkBAIC0zNzUsNyArMzU3LDYgQEAKIEVOVFJZKHN0YXJ0dXBfa2R1bXApCiAJagkuTGVwX3N0YXJ0dXBfa2R1bXAKIC5MZXBfc3RhcnR1cF9ub3JtYWw6Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJbXZpCV9fTENfQVJfTU9ERV9JRCwxCSMgc2V0IGVzYW1lIGZsYWcKIAlzbHIJJXIwLCVyMCAJCSMgc2V0IGNwdWlkIHRvIHplcm8KIAlsaGkJJXIxLDIJCQkjIG1vZGUgMiA9IGVzYW1lIChkdW1wKQpAQCAtMzg0LDkgKzM2NSw2IEBACiAJLmZpbGwJMTYsNCwweDAKIDA6CWxtaAklcjAsJXIxNSwwKCVyMTMpCSMgY2xlYXIgaGlnaC1vcmRlciBoYWxmIG9mIGdwcnMKIAlzYW0zMQkJCQkjIHN3aXRjaCB0byAzMSBiaXQgYWRkcmVzc2luZyBtb2RlCi0jZWxzZQotCW12aQlfX0xDX0FSX01PREVfSUQsMAkjIHNldCBFU0EgZmxhZyAobW9kZSAwKQotI2VuZGlmCiAJYmFzcgklcjEzLDAJCQkjIGdldCBiYXNlCiAuTFBHMDoKIAl4YwkweDIwMCgyNTYpLDB4MjAwCSMgcGFydGlhbGx5IGNsZWFyIGxvd2NvcmUKQEAgLTM5Niw3ICszNzQsNiBAQAogCXNwdAk2Zi0uTFBHMCglcjEzKQogCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLDZmLS5MUEcwKCVyMTMpCiAJeGMJX19MQ19TVEZMX0ZBQ19MSVNUKDgpLF9fTENfU1RGTF9GQUNfTElTVAotI2lmbmRlZiBDT05GSUdfTUFSQ0hfRzUKIAkjIGNoZWNrIGNhcGFiaWxpdGllcyBhZ2FpbnN0IE1BUkNIX3tHNSxaOTAwLFo5OTAsWjlfMTA5LFoxMH0KIAkuaW5zbglzLDB4YjJiMTAwMDAsMAkJIyBzdG9yZSBmYWNpbGl0aWVzIEAgX19MQ19TVEZMX0ZBQ19MSVNUCiAJdG0JX19MQ19TVEZMX0ZBQ19MSVNULDB4MDEJIyBzdGZsZSBhdmFpbGFibGUgPwpAQCAtNDM1LDcgKzQxMiw2IEBACiAjIHRoZSBrZXJuZWwgd2lsbCBjcmFzaC4gRm9ybWF0IGlzIG51bWJlciBvZiBmYWNpbGl0eSB3b3JkcyB3aXRoIGJpdHMgc2V0LAogIyBmb2xsb3dlZCBieSB0aGUgZmFjaWxpdHkgd29yZHMuCiAKLSNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkKICNpZiBkZWZpbmVkKENPTkZJR19NQVJDSF9aMTMpCiAJLmxvbmcgMywgMHhjMTAwZWZmMiwgMHhmNDZjZTgwMCwgMHgwMDQwMDAwMAogI2VsaWYgZGVmaW5lZChDT05GSUdfTUFSQ0hfWkVDMTIpCkBAIC00NTEsMzUgKzQyNywxMCBAQAogI2VsaWYgZGVmaW5lZChDT05GSUdfTUFSQ0hfWjkwMCkKIAkubG9uZyAxLCAweGMwMDAwMDAwCiAjZW5kaWYKLSNlbHNlCi0jaWYgZGVmaW5lZChDT05GSUdfTUFSQ0hfWkVDMTIpCi0JLmxvbmcgMSwgMHg4MTAwYzg4MAotI2VsaWYgZGVmaW5lZChDT05GSUdfTUFSQ0hfWjE5NikKLQkubG9uZyAxLCAweDgxMDBjODgwCi0jZWxpZiBkZWZpbmVkKENPTkZJR19NQVJDSF9aMTApCi0JLmxvbmcgMSwgMHg4MTAwYzg4MAotI2VsaWYgZGVmaW5lZChDT05GSUdfTUFSQ0hfWjlfMTA5KQotCS5sb25nIDEsIDB4ODEwMGM4ODAKLSNlbGlmIGRlZmluZWQoQ09ORklHX01BUkNIX1o5OTApCi0JLmxvbmcgMSwgMHg4MDAwMjAwMAotI2VsaWYgZGVmaW5lZChDT05GSUdfTUFSQ0hfWjkwMCkKLQkubG9uZyAxLCAweDgwMDAwMDAwCi0jZW5kaWYKLSNlbmRpZgogNDoKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHXzY0QklUCiAJLyogQ29udGludWUgd2l0aCA2NGJpdCBzdGFydHVwIGNvZGUgaW4gaGVhZDY0LlMgKi8KIAlzYW02NAkJCQkjIHN3aXRjaCB0byA2NCBiaXQgbW9kZQogCWpnCXN0YXJ0dXBfY29udGludWUKLSNlbHNlCi0JLyogQ29udGludWUgd2l0aCAzMWJpdCBzdGFydHVwIGNvZGUgaW4gaGVhZDMxLlMgKi8KLQlsCSVyMTMsNWYtLkxQRzAoJXIxMykKLQliCTAoJXIxMykKLQkuYWxpZ24JOAotNToJLmxvbmcJc3RhcnR1cF9jb250aW51ZQotI2VuZGlmCiAKIAkuYWxpZ24JOAogNjoJLmxvbmcJMHg3ZmZmZmZmZiwweGZmZmZmZmZmCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2hlYWQzMS5TIGIvYXJjaC9zMzkwL2tlcm5lbC9oZWFkMzEuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZTgwOS4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWQzMS5TCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDUsIDIwMTAKLSAqCi0gKiAgIEF1dGhvcihzKToJSGFydG11dCBQZW5uZXIgPGhwQGRlLmlibS5jb20+Ci0gKgkJTWFydGluIFNjaHdpZGVmc2t5IDxzY2h3aWRlZnNreUBkZS5pYm0uY29tPgotICoJCVJvYiB2YW4gZGVyIEhlaWogPHJ2ZGhlaUBpYWUubmw+Ci0gKgkJSGVpa28gQ2Fyc3RlbnMgPGhlaWtvLmNhcnN0ZW5zQGRlLmlibS5jb20+Ci0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgotI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0KLV9fSEVBRAotRU5UUlkoc3RhcnR1cF9jb250aW51ZSkKLQliYXNyCSVyMTMsMAkJCSMgZ2V0IGJhc2UKLS5MUEcxOgotCi0JbAklcjEsLkxiYXNlX2NjLS5MUEcxKCVyMTMpCi0JbXZjCTAoOCwlcjEpLF9fTENfTEFTVF9VUERBVEVfQ0xPQ0sKLQlsY3RsCSVjMCwlYzE1LC5MY3RsLS5MUEcxKCVyMTMpICMgbG9hZCBjb250cm9sIHJlZ2lzdGVycwotCWwJJXIxMiwuTHBhcm1hZGRyLS5MUEcxKCVyMTMpICMgcG9pbnRlciB0byBwYXJhbWV0ZXIgYXJlYQotCQkJCQkjIG1vdmUgSVBMIGRldmljZSB0byBsb3djb3JlCi0jCi0jIFNldHVwIHN0YWNrCi0jCi0JbAklcjE1LC5MaW5pdHR1LS5MUEcxKCVyMTMpCi0Jc3QJJXIxNSxfX0xDX1RIUkVBRF9JTkZPCSMgY2FjaGUgdGhyZWFkIGluZm8gaW4gbG93Y29yZQotCW12YwlfX0xDX0NVUlJFTlQoNCksX19USV90YXNrKCVyMTUpCi0JYWhpCSVyMTUsMTw8KFBBR0VfU0hJRlQrVEhSRUFEX09SREVSKSAjIGluaXRfdGFza191bmlvbitUSFJFQURfU0laRQotCXN0CSVyMTUsX19MQ19LRVJORUxfU1RBQ0sJIyBzZXQgZW5kIG9mIGtlcm5lbCBzdGFjawotCWFoaQklcjE1LC05NgotIwotIyBTYXZlIGlwbCBwYXJhbWV0ZXJzLCBjbGVhciBic3MgbWVtb3J5LCBpbml0aWFsaXplIHN0b3JhZ2Uga2V5IGZvciBrZXJuZWwgcGFnZXMsCi0jIGFuZCBjcmVhdGUgYSBrZXJuZWwgTlNTIGlmIHRoZSBTQVZFU1lTPSBwYXJtIGlzIGRlZmluZWQKLSMKLQlsCSVyMTQsLkxzdGFydHVwX2luaXQtLkxQRzEoJXIxMykKLQliYXNyCSVyMTQsJXIxNAotCWxwc3cgIC5MZW50cnktLkxQRzEoMTMpCQkjIGp1bXAgdG8gX3N0ZXh0IGluIHByaW1hcnktc3BhY2UsCi0JCQkJCSMgdmlydHVhbCBhbmQgbmV2ZXIgcmV0dXJuIC4uLgotCS5hbGlnbgk4Ci0uTGVudHJ5Oi5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMCArIF9zdGV4dAotLkxjdGw6CS5sb25nCTB4MDRiNTAwMDAJCSMgY3IwOiB2YXJpb3VzIHRoaW5ncwotCS5sb25nCTAJCQkjIGNyMTogcHJpbWFyeSBzcGFjZSBzZWdtZW50IHRhYmxlCi0JLmxvbmcJLkxkdWN0CQkJIyBjcjI6IGRpc3BhdGNoYWJsZSB1bml0IGNvbnRyb2wgdGFibGUKLQkubG9uZwkwCQkJIyBjcjM6IGluc3RydWN0aW9uIGF1dGhvcml6YXRpb24KLQkubG9uZwkwCQkJIyBjcjQ6IGluc3RydWN0aW9uIGF1dGhvcml6YXRpb24KLQkubG9uZwkuTGR1Y3QJCQkjIGNyNTogcHJpbWFyeS1hc3RlIG9yaWdpbgotCS5sb25nCTAJCQkjIGNyNjoJSS9PIGludGVycnVwdHMKLQkubG9uZwkwCQkJIyBjcjc6CXNlY29uZGFyeSBzcGFjZSBzZWdtZW50IHRhYmxlCi0JLmxvbmcJMAkJCSMgY3I4OglhY2Nlc3MgcmVnaXN0ZXJzIHRyYW5zbGF0aW9uCi0JLmxvbmcJMAkJCSMgY3I5Ogl0cmFjaW5nIG9mZgotCS5sb25nCTAJCQkjIGNyMTA6IHRyYWNpbmcgb2ZmCi0JLmxvbmcJMAkJCSMgY3IxMTogdHJhY2luZyBvZmYKLQkubG9uZwkwCQkJIyBjcjEyOiB0cmFjaW5nIG9mZgotCS5sb25nCTAJCQkjIGNyMTM6IGhvbWUgc3BhY2Ugc2VnbWVudCB0YWJsZQotCS5sb25nCTB4YzAwMDAwMDAJCSMgY3IxNDogbWFjaGluZSBjaGVjayBoYW5kbGluZyBvZmYKLQkubG9uZwkwCQkJIyBjcjE1OiBsaW5rYWdlIHN0YWNrIG9wZXJhdGlvbnMKLS5MYnNzX2JnbjogIC5sb25nIF9fYnNzX3N0YXJ0Ci0uTGJzc19lbmQ6ICAubG9uZyBfZW5kCi0uTHBhcm1hZGRyOiAubG9uZyBQQVJNQVJFQQotLkxpbml0dHU6ICAgLmxvbmcgaW5pdF90aHJlYWRfdW5pb24KLS5Mc3RhcnR1cF9pbml0OgotCSAgICAubG9uZyBzdGFydHVwX2luaXQKLQkuYWxpZ24JNjQKLS5MZHVjdDoJLmxvbmcJMCwwLDAsMCwuTGR1YWxkLDAsMCwwCi0JLmxvbmcJMCwwLDAsMCwwLDAsMCwwCi0JLmFsaWduCTEyOAotLkxkdWFsZDoucmVwdAk4Ci0JLmxvbmcJMHg4MDAwMDAwMCwwLDAsMAkjIGludmFsaWQgYWNjZXNzLWxpc3QgZW50cmllcwotCS5lbmRyCi0uTGJhc2VfY2M6Ci0JLmxvbmcJc2NoZWRfY2xvY2tfYmFzZV9jYwotCi1FTlRSWShfZWhlYWQpCi0KLQkub3JnCTB4MTAwMDAwIC0gMHgxMTAwMAkjIGhlYWQubyBlbmRzIGF0IDB4MTEwMDAKLSMKLSMgc3RhcnR1cC1jb2RlLCBydW5uaW5nIGluIGFic29sdXRlIGFkZHJlc3NpbmcgbW9kZQotIwotRU5UUlkoX3N0ZXh0KQotCWJhc3IJJXIxMywwCQkJIyBnZXQgYmFzZQotLkxQRzM6Ci0jIGNoZWNrIGNvbnRyb2wgcmVnaXN0ZXJzCi0Jc3RjdGwJJWMwLCVjMTUsMCglcjE1KQotCW9pCTIoJXIxNSksMHg2MAkJIyBlbmFibGUgc2lncCBlbWVyZ2VuY3kgJiBleHRlcm5hbCBjYWxsCi0Jb2kJMCglcjE1KSwweDEwCQkjIHN3aXRjaCBvbiBsb3cgYWRkcmVzcyBwcm90ZWN0aW9uCi0JbGN0bAklYzAsJWMxNSwwKCVyMTUpCi0KLSMKLQlsYW0JMCwxNSwuTGFyZWdzLS5MUEczKCVyMTMpICMgbG9hZCBhY2Nlc3MgcmVncyBuZWVkZWQgYnkgdWFjY2VzcwotCWwJJXIxNCwuTHN0YXJ0LS5MUEczKCVyMTMpCi0JYmFzcgklcjE0LCVyMTQJCSMgY2FsbCBzdGFydF9rZXJuZWwKLSMKLSMgV2UgcmV0dXJuZWQgZnJvbSBzdGFydF9rZXJuZWwgPyE/IFBBTklLCi0jCi0JYmFzcgklcjEzLDAKLQlscHN3CS5MZHctLiglcjEzKQkJIyBsb2FkIGRpc2FibGVkIHdhaXQgcHN3Ci0jCi0JLmFsaWduCTgKLS5MZHc6CS5sb25nCTB4MDAwYTAwMDAsMHgwMDAwMDAwMAotLkxzdGFydDoubG9uZwlzdGFydF9rZXJuZWwKLS5MYXJlZ3M6LmxvbmcJMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9oZWFkX2tkdW1wLlMgYi9hcmNoL3MzOTAva2VybmVsL2hlYWRfa2R1bXAuUwppbmRleCAwODVhOTVlLi5kMDU5NTBmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2hlYWRfa2R1bXAuUworKysgYi9hcmNoL3MzOTAva2VybmVsL2hlYWRfa2R1bXAuUwpAQCAtOTIsMTcgKzkyLDkgQEAKICNlbHNlCiAuYWxpZ24gMgogLkxlcF9zdGFydHVwX2tkdW1wOgotI2lmZGVmIENPTkZJR182NEJJVAogCWxhcmwJJXIxMyxzdGFydHVwX2tkdW1wX2NyYXNoCiAJbHBzd2UJMCglcjEzKQogLmFsaWduIDgKIHN0YXJ0dXBfa2R1bXBfY3Jhc2g6CiAJLnF1YWQJMHgwMDAyMDAwMDgwMDAwMDAwLDB4MDAwMDAwMDAwMDAwMDAwMCArIHN0YXJ0dXBfa2R1bXBfY3Jhc2gKLSNlbHNlCi0JYmFzcgklcjEzLDAKLTA6CWxwc3cJc3RhcnR1cF9rZHVtcF9jcmFzaC0wYiglcjEzKQotLmFsaWduIDgKLXN0YXJ0dXBfa2R1bXBfY3Jhc2g6Ci0JLmxvbmcJMHgwMDBhMDAwMCwweDAwMDAwMDAwICsgc3RhcnR1cF9rZHVtcF9jcmFzaAotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogI2VuZGlmIC8qIENPTkZJR19DUkFTSF9EVU1QICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2lwbC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYwppbmRleCA1Yzg2NTFmLi41MmZiZWY5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2lwbC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMKQEAgLTE4MiwyNCArMTgyLDIxIEBACiAKIC8qIFNZU0ZTICovCiAKLSNkZWZpbmUgREVGSU5FX0lQTF9BVFRSX1JPKF9wcmVmaXgsIF9uYW1lLCBfZm9ybWF0LCBfdmFsdWUpCQlcCisjZGVmaW5lIElQTF9BVFRSX1NIT1dfRk4oX3ByZWZpeCwgX25hbWUsIF9mb3JtYXQsIGFyZ3MuLi4pCQlcCiBzdGF0aWMgc3NpemVfdCBzeXNfIyNfcHJlZml4IyNfIyNfbmFtZSMjX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCVwKIAkJc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAkJCQlcCiAJCWNoYXIgKnBhZ2UpCQkJCQkJXAogewkJCQkJCQkJCVwKLQlyZXR1cm4gc3ByaW50ZihwYWdlLCBfZm9ybWF0LCBfdmFsdWUpOwkJCQlcCi19CQkJCQkJCQkJXAorCXJldHVybiBzbnByaW50ZihwYWdlLCBQQUdFX1NJWkUsIF9mb3JtYXQsICMjYXJncyk7CQlcCit9CisKKyNkZWZpbmUgREVGSU5FX0lQTF9BVFRSX1JPKF9wcmVmaXgsIF9uYW1lLCBfZm9ybWF0LCBfdmFsdWUpCQlcCitJUExfQVRUUl9TSE9XX0ZOKF9wcmVmaXgsIF9uYW1lLCBfZm9ybWF0LCBfdmFsdWUpCQkJXAogc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBzeXNfIyNfcHJlZml4IyNfIyNfbmFtZSMjX2F0dHIgPQkJXAotCV9fQVRUUihfbmFtZSwgU19JUlVHTywgc3lzXyMjX3ByZWZpeCMjXyMjX25hbWUjI19zaG93LCBOVUxMKTsKKwlfX0FUVFIoX25hbWUsIFNfSVJVR08sIHN5c18jI19wcmVmaXgjI18jI19uYW1lIyNfc2hvdywgTlVMTCkKIAogI2RlZmluZSBERUZJTkVfSVBMX0FUVFJfUlcoX3ByZWZpeCwgX25hbWUsIF9mbXRfb3V0LCBfZm10X2luLCBfdmFsdWUpCVwKLXN0YXRpYyBzc2l6ZV90IHN5c18jI19wcmVmaXgjI18jI19uYW1lIyNfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwJXAotCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCQkJCVwKLQkJY2hhciAqcGFnZSkJCQkJCQlcCi17CQkJCQkJCQkJXAotCXJldHVybiBzcHJpbnRmKHBhZ2UsIF9mbXRfb3V0LAkJCQkJXAotCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgX3ZhbHVlKTsJCQlcCi19CQkJCQkJCQkJXAorSVBMX0FUVFJfU0hPV19GTihfcHJlZml4LCBfbmFtZSwgX2ZtdF9vdXQsICh1bnNpZ25lZCBsb25nIGxvbmcpIF92YWx1ZSkJXAogc3RhdGljIHNzaXplX3Qgc3lzXyMjX3ByZWZpeCMjXyMjX25hbWUjI19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwJXAogCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCQkJCVwKIAkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQkJCQlcCkBAIC0yMTMsMTUgKzIxMCwxMCBAQAogc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBzeXNfIyNfcHJlZml4IyNfIyNfbmFtZSMjX2F0dHIgPQkJXAogCV9fQVRUUihfbmFtZSwoU19JUlVHTyB8IFNfSVdVU1IpLAkJCQlcCiAJCQlzeXNfIyNfcHJlZml4IyNfIyNfbmFtZSMjX3Nob3csCQkJXAotCQkJc3lzXyMjX3ByZWZpeCMjXyMjX25hbWUjI19zdG9yZSk7CisJCQlzeXNfIyNfcHJlZml4IyNfIyNfbmFtZSMjX3N0b3JlKQogCiAjZGVmaW5lIERFRklORV9JUExfQVRUUl9TVFJfUlcoX3ByZWZpeCwgX25hbWUsIF9mbXRfb3V0LCBfZm10X2luLCBfdmFsdWUpXAotc3RhdGljIHNzaXplX3Qgc3lzXyMjX3ByZWZpeCMjXyMjX25hbWUjI19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAlcCi0JCXN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwJCQkJXAotCQljaGFyICpwYWdlKQkJCQkJCVwKLXsJCQkJCQkJCQlcCi0JcmV0dXJuIHNwcmludGYocGFnZSwgX2ZtdF9vdXQsIF92YWx1ZSk7CQkJCVwKLX0JCQkJCQkJCQlcCitJUExfQVRUUl9TSE9XX0ZOKF9wcmVmaXgsIF9uYW1lLCBfZm10X291dCwgX3ZhbHVlKQkJCVwKIHN0YXRpYyBzc2l6ZV90IHN5c18jI19wcmVmaXgjI18jI19uYW1lIyNfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosCVwKIAkJc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAkJCQlcCiAJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikJCQkJXApAQCAtMjMzLDcgKzIyNSw3IEBACiBzdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIHN5c18jI19wcmVmaXgjI18jI19uYW1lIyNfYXR0ciA9CQlcCiAJX19BVFRSKF9uYW1lLChTX0lSVUdPIHwgU19JV1VTUiksCQkJCVwKIAkJCXN5c18jI19wcmVmaXgjI18jI19uYW1lIyNfc2hvdywJCQlcCi0JCQlzeXNfIyNfcHJlZml4IyNfIyNfbmFtZSMjX3N0b3JlKTsKKwkJCXN5c18jI19wcmVmaXgjI18jI19uYW1lIyNfc3RvcmUpCiAKIHN0YXRpYyB2b2lkIG1ha2VfYXR0cnNfcm8oc3RydWN0IGF0dHJpYnV0ZSAqKmF0dHJzKQogewpAQCAtNDE1LDE1ICs0MDcsOSBAQAogCXJldHVybiBtZW1vcnlfcmVhZF9mcm9tX2J1ZmZlcihidWYsIGNvdW50LCAmb2ZmLCBJUExfUEFSTUJMT0NLX1NUQVJULAogCQkJCQlJUExfUEFSTUJMT0NLX1NJWkUpOwogfQotCi1zdGF0aWMgc3RydWN0IGJpbl9hdHRyaWJ1dGUgaXBsX3BhcmFtZXRlcl9hdHRyID0gewotCS5hdHRyID0gewotCQkubmFtZSA9ICJiaW5hcnlfcGFyYW1ldGVyIiwKLQkJLm1vZGUgPSBTX0lSVUdPLAotCX0sCi0JLnNpemUgPSBQQUdFX1NJWkUsCi0JLnJlYWQgPSAmaXBsX3BhcmFtZXRlcl9yZWFkLAotfTsKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBpcGxfcGFyYW1ldGVyX2F0dHIgPQorCV9fQklOX0FUVFIoYmluYXJ5X3BhcmFtZXRlciwgU19JUlVHTywgaXBsX3BhcmFtZXRlcl9yZWFkLCBOVUxMLAorCQkgICBQQUdFX1NJWkUpOwogCiBzdGF0aWMgc3NpemVfdCBpcGxfc2NwX2RhdGFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkJIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYsCkBAIC00MzQsMTQgKzQyMCwxMyBAQAogCiAJcmV0dXJuIG1lbW9yeV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY291bnQsICZvZmYsIHNjcF9kYXRhLCBzaXplKTsKIH0KK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBpcGxfc2NwX2RhdGFfYXR0ciA9CisJX19CSU5fQVRUUihzY3BfZGF0YSwgU19JUlVHTywgaXBsX3NjcF9kYXRhX3JlYWQsIE5VTEwsIFBBR0VfU0laRSk7CiAKLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBpcGxfc2NwX2RhdGFfYXR0ciA9IHsKLQkuYXR0ciA9IHsKLQkJLm5hbWUgPSAic2NwX2RhdGEiLAotCQkubW9kZSA9IFNfSVJVR08sCi0JfSwKLQkuc2l6ZSA9IFBBR0VfU0laRSwKLQkucmVhZCA9IGlwbF9zY3BfZGF0YV9yZWFkLAorc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlICppcGxfZmNwX2Jpbl9hdHRyc1tdID0geworCSZpcGxfcGFyYW1ldGVyX2F0dHIsCisJJmlwbF9zY3BfZGF0YV9hdHRyLAorCU5VTEwsCiB9OwogCiAvKiBGQ1AgaXBsIGRldmljZSBhdHRyaWJ1dGVzICovCkBAIC00ODQsNiArNDY5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaXBsX2ZjcF9hdHRyX2dyb3VwID0gewogCS5hdHRycyA9IGlwbF9mY3BfYXR0cnMsCisJLmJpbl9hdHRycyA9IGlwbF9mY3BfYmluX2F0dHJzLAogfTsKIAogLyogQ0NXIGlwbCBkZXZpY2UgYXR0cmlidXRlcyAqLwpAQCAtNTQwLDI4ICs1MjYsNiBAQAogCiBzdGF0aWMgc3RydWN0IGtzZXQgKmlwbF9rc2V0OwogCi1zdGF0aWMgaW50IF9faW5pdCBpcGxfcmVnaXN0ZXJfZmNwX2ZpbGVzKHZvaWQpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmlwbF9rc2V0LT5rb2JqLCAmaXBsX2ZjcF9hdHRyX2dyb3VwKTsKLQlpZiAocmMpCi0JCWdvdG8gb3V0OwotCXJjID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZpcGxfa3NldC0+a29iaiwgJmlwbF9wYXJhbWV0ZXJfYXR0cik7Ci0JaWYgKHJjKQotCQlnb3RvIG91dF9pcGxfcGFybTsKLQlyYyA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmaXBsX2tzZXQtPmtvYmosICZpcGxfc2NwX2RhdGFfYXR0cik7Ci0JaWYgKCFyYykKLQkJZ290byBvdXQ7Ci0KLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmlwbF9rc2V0LT5rb2JqLCAmaXBsX3BhcmFtZXRlcl9hdHRyKTsKLQotb3V0X2lwbF9wYXJtOgotCXN5c2ZzX3JlbW92ZV9ncm91cCgmaXBsX2tzZXQtPmtvYmosICZpcGxfZmNwX2F0dHJfZ3JvdXApOwotb3V0OgotCXJldHVybiByYzsKLX0KLQogc3RhdGljIHZvaWQgX19pcGxfcnVuKHZvaWQgKnVudXNlZCkKIHsKIAlkaWFnMzA4KERJQUczMDhfSVBMLCBOVUxMKTsKQEAgLTU5Niw3ICs1NjAsNyBAQAogCQlicmVhazsKIAljYXNlIElQTF9UWVBFX0ZDUDoKIAljYXNlIElQTF9UWVBFX0ZDUF9EVU1QOgotCQlyYyA9IGlwbF9yZWdpc3Rlcl9mY3BfZmlsZXMoKTsKKwkJcmMgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmlwbF9rc2V0LT5rb2JqLCAmaXBsX2ZjcF9hdHRyX2dyb3VwKTsKIAkJYnJlYWs7CiAJY2FzZSBJUExfVFlQRV9OU1M6CiAJCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZpcGxfa3NldC0+a29iaiwgJmlwbF9uc3NfYXR0cl9ncm91cCk7CkBAIC03NDQsMTUgKzcwOCwxMyBAQAogCiAJcmV0dXJuIGNvdW50OwogfQorc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIHN5c19yZWlwbF9mY3Bfc2NwX2RhdGFfYXR0ciA9CisJX19CSU5fQVRUUihzY3BfZGF0YSwgKFNfSVJVR08gfCBTX0lXVVNSKSwgcmVpcGxfZmNwX3NjcGRhdGFfcmVhZCwKKwkJICAgcmVpcGxfZmNwX3NjcGRhdGFfd3JpdGUsIFBBR0VfU0laRSk7CiAKLXN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBzeXNfcmVpcGxfZmNwX3NjcF9kYXRhX2F0dHIgPSB7Ci0JLmF0dHIgPSB7Ci0JCS5uYW1lID0gInNjcF9kYXRhIiwKLQkJLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUiwKLQl9LAotCS5zaXplID0gUEFHRV9TSVpFLAotCS5yZWFkID0gcmVpcGxfZmNwX3NjcGRhdGFfcmVhZCwKLQkud3JpdGUgPSByZWlwbF9mY3Bfc2NwZGF0YV93cml0ZSwKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqcmVpcGxfZmNwX2Jpbl9hdHRyc1tdID0geworCSZzeXNfcmVpcGxfZmNwX3NjcF9kYXRhX2F0dHIsCisJTlVMTCwKIH07CiAKIERFRklORV9JUExfQVRUUl9SVyhyZWlwbF9mY3AsIHd3cG4sICIweCUwMTZsbHhcbiIsICIlbGx4XG4iLApAQCAtODQxLDYgKzgwMyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHJlaXBsX2ZjcF9hdHRyX2dyb3VwID0gewogCS5hdHRycyA9IHJlaXBsX2ZjcF9hdHRycywKKwkuYmluX2F0dHJzID0gcmVpcGxfZmNwX2Jpbl9hdHRycywKIH07CiAKIC8qIENDVyByZWlwbCBkZXZpY2UgYXR0cmlidXRlcyAqLwpAQCAtMTI2MSwxNSArMTIyNCw2IEBACiAJCXJldHVybiByYzsKIAl9CiAKLQlyYyA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmcmVpcGxfZmNwX2tzZXQtPmtvYmosCi0JCQkJICAgJnN5c19yZWlwbF9mY3Bfc2NwX2RhdGFfYXR0cik7Ci0JaWYgKHJjKSB7Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmcmVpcGxfZmNwX2tzZXQtPmtvYmosICZyZWlwbF9mY3BfYXR0cl9ncm91cCk7Ci0JCWtzZXRfdW5yZWdpc3RlcihyZWlwbF9mY3Bfa3NldCk7Ci0JCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcmVpcGxfYmxvY2tfZmNwKTsKLQkJcmV0dXJuIHJjOwotCX0KLQogCWlmIChpcGxfaW5mby50eXBlID09IElQTF9UWVBFX0ZDUCkgewogCQltZW1jcHkocmVpcGxfYmxvY2tfZmNwLCBJUExfUEFSTUJMT0NLX1NUQVJULCBQQUdFX1NJWkUpOwogCQkvKgpAQCAtMTcxMyw5ICsxNjY3LDcgQEAKIHsKIAlyZXR1cm4gc2V0X3RyaWdnZXIoYnVmLCAmb25fcmVib290X3RyaWdnZXIsIGxlbik7CiB9Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgb25fcmVib290X2F0dHIgPQotCV9fQVRUUihvbl9yZWJvb3QsIDA2NDQsIG9uX3JlYm9vdF9zaG93LCBvbl9yZWJvb3Rfc3RvcmUpOworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBvbl9yZWJvb3RfYXR0ciA9IF9fQVRUUl9SVyhvbl9yZWJvb3QpOwogCiBzdGF0aWMgdm9pZCBkb19tYWNoaW5lX3Jlc3RhcnQoY2hhciAqX191bnVzZWQpCiB7CkBAIC0xNzQxLDkgKzE2OTMsNyBAQAogewogCXJldHVybiBzZXRfdHJpZ2dlcihidWYsICZvbl9wYW5pY190cmlnZ2VyLCBsZW4pOwogfQotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIG9uX3BhbmljX2F0dHIgPQotCV9fQVRUUihvbl9wYW5pYywgMDY0NCwgb25fcGFuaWNfc2hvdywgb25fcGFuaWNfc3RvcmUpOworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBvbl9wYW5pY19hdHRyID0gX19BVFRSX1JXKG9uX3BhbmljKTsKIAogc3RhdGljIHZvaWQgZG9fcGFuaWModm9pZCkKIHsKQEAgLTE3NjksOSArMTcxOSw3IEBACiB7CiAJcmV0dXJuIHNldF90cmlnZ2VyKGJ1ZiwgJm9uX3Jlc3RhcnRfdHJpZ2dlciwgbGVuKTsKIH0KLQotc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBvbl9yZXN0YXJ0X2F0dHIgPQotCV9fQVRUUihvbl9yZXN0YXJ0LCAwNjQ0LCBvbl9yZXN0YXJ0X3Nob3csIG9uX3Jlc3RhcnRfc3RvcmUpOworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBvbl9yZXN0YXJ0X2F0dHIgPSBfX0FUVFJfUlcob25fcmVzdGFydCk7CiAKIHN0YXRpYyB2b2lkIF9fZG9fcmVzdGFydCh2b2lkICppZ25vcmUpCiB7CkBAIC0xODA4LDEwICsxNzU2LDcgQEAKIHsKIAlyZXR1cm4gc2V0X3RyaWdnZXIoYnVmLCAmb25faGFsdF90cmlnZ2VyLCBsZW4pOwogfQotCi1zdGF0aWMgc3RydWN0IGtvYmpfYXR0cmlidXRlIG9uX2hhbHRfYXR0ciA9Ci0JX19BVFRSKG9uX2hhbHQsIDA2NDQsIG9uX2hhbHRfc2hvdywgb25faGFsdF9zdG9yZSk7Ci0KK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgb25faGFsdF9hdHRyID0gX19BVFRSX1JXKG9uX2hhbHQpOwogCiBzdGF0aWMgdm9pZCBkb19tYWNoaW5lX2hhbHQodm9pZCkKIHsKQEAgLTE4MzcsMTAgKzE3ODIsNyBAQAogewogCXJldHVybiBzZXRfdHJpZ2dlcihidWYsICZvbl9wb2ZmX3RyaWdnZXIsIGxlbik7CiB9Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgb25fcG9mZl9hdHRyID0KLQlfX0FUVFIob25fcG9mZiwgMDY0NCwgb25fcG9mZl9zaG93LCBvbl9wb2ZmX3N0b3JlKTsKLQorc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBvbl9wb2ZmX2F0dHIgPSBfX0FUVFJfUlcob25fcG9mZik7CiAKIHN0YXRpYyB2b2lkIGRvX21hY2hpbmVfcG93ZXJfb2ZmKHZvaWQpCiB7CkBAIC0xODUwLDI2ICsxNzkyLDI3IEBACiB9CiB2b2lkICgqX21hY2hpbmVfcG93ZXJfb2ZmKSh2b2lkKSA9IGRvX21hY2hpbmVfcG93ZXJfb2ZmOwogCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2h1dGRvd25fYWN0aW9uX2F0dHJzW10gPSB7CisJJm9uX3Jlc3RhcnRfYXR0ci5hdHRyLAorCSZvbl9yZWJvb3RfYXR0ci5hdHRyLAorCSZvbl9wYW5pY19hdHRyLmF0dHIsCisJJm9uX2hhbHRfYXR0ci5hdHRyLAorCSZvbl9wb2ZmX2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2h1dGRvd25fYWN0aW9uX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gc2h1dGRvd25fYWN0aW9uX2F0dHJzLAorfTsKKwogc3RhdGljIHZvaWQgX19pbml0IHNodXRkb3duX3RyaWdnZXJzX2luaXQodm9pZCkKIHsKIAlzaHV0ZG93bl9hY3Rpb25zX2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCJzaHV0ZG93bl9hY3Rpb25zIiwgTlVMTCwKIAkJCQkJCSAgICBmaXJtd2FyZV9rb2JqKTsKIAlpZiAoIXNodXRkb3duX2FjdGlvbnNfa3NldCkKIAkJZ290byBmYWlsOwotCWlmIChzeXNmc19jcmVhdGVfZmlsZSgmc2h1dGRvd25fYWN0aW9uc19rc2V0LT5rb2JqLAotCQkJICAgICAgJm9uX3JlYm9vdF9hdHRyLmF0dHIpKQotCQlnb3RvIGZhaWw7Ci0JaWYgKHN5c2ZzX2NyZWF0ZV9maWxlKCZzaHV0ZG93bl9hY3Rpb25zX2tzZXQtPmtvYmosCi0JCQkgICAgICAmb25fcGFuaWNfYXR0ci5hdHRyKSkKLQkJZ290byBmYWlsOwotCWlmIChzeXNmc19jcmVhdGVfZmlsZSgmc2h1dGRvd25fYWN0aW9uc19rc2V0LT5rb2JqLAotCQkJICAgICAgJm9uX2hhbHRfYXR0ci5hdHRyKSkKLQkJZ290byBmYWlsOwotCWlmIChzeXNmc19jcmVhdGVfZmlsZSgmc2h1dGRvd25fYWN0aW9uc19rc2V0LT5rb2JqLAotCQkJICAgICAgJm9uX3BvZmZfYXR0ci5hdHRyKSkKLQkJZ290byBmYWlsOwotCWlmIChzeXNmc19jcmVhdGVfZmlsZSgmc2h1dGRvd25fYWN0aW9uc19rc2V0LT5rb2JqLAotCQkJICAgICAgJm9uX3Jlc3RhcnRfYXR0ci5hdHRyKSkKKwlpZiAoc3lzZnNfY3JlYXRlX2dyb3VwKCZzaHV0ZG93bl9hY3Rpb25zX2tzZXQtPmtvYmosCisJCQkgICAgICAgJnNodXRkb3duX2FjdGlvbl9hdHRyX2dyb3VwKSkKIAkJZ290byBmYWlsOwogCXJldHVybjsKIGZhaWw6CkBAIC0yMDYyLDEyICsyMDA1LDEwIEBACiB7CiAJc3RydWN0IHJlc2V0X2NhbGwgKnJlc2V0OwogCi0jaWZkZWYgQ09ORklHXzY0QklUCiAJaWYgKGRpYWczMDhfc2V0X3dvcmtzKSB7CiAJCWRpYWczMDhfcmVzZXQoKTsKIAkJcmV0dXJuOwogCX0KLSNlbmRpZgogCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzZXQsICZyY2FsbCwgbGlzdCkKIAkJcmVzZXQtPmZuKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2lycS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9pcnEuYwppbmRleCBmMjM4NzIwLi5lOWQ5YWRkIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2lycS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvaXJxLmMKQEAgLTU2LDcgKzU2LDcgQEAKICAqIC9wcm9jL2ludGVycnVwdHMuCiAgKiBJbiBhZGRpdGlvbiB0aGlzIGxpc3QgY29udGFpbnMgbm9uIGV4dGVybmFsIC8gSS9PIGV2ZW50cyBsaWtlIE5NSXMuCiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2NsYXNzIGlycWNsYXNzX3N1Yl9kZXNjW05SX0FSQ0hfSVJRU10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9jbGFzcyBpcnFjbGFzc19zdWJfZGVzY1tdID0gewogCXsuaXJxID0gSVJRRVhUX0NMSywgLm5hbWUgPSAiQ0xLIiwgLmRlc2MgPSAiW0VYVF0gQ2xvY2sgQ29tcGFyYXRvciJ9LAogCXsuaXJxID0gSVJRRVhUX0VYQywgLm5hbWUgPSAiRVhDIiwgLmRlc2MgPSAiW0VYVF0gRXh0ZXJuYWwgQ2FsbCJ9LAogCXsuaXJxID0gSVJRRVhUX0VNUywgLm5hbWUgPSAiRU1TIiwgLmRlc2MgPSAiW0VYVF0gRW1lcmdlbmN5IFNpZ25hbCJ9LApAQCAtNzksNyArNzksNiBAQAogCXsuaXJxID0gSVJRSU9fVEFQLCAgLm5hbWUgPSAiVEFQIiwgLmRlc2MgPSAiW0kvT10gVGFwZSJ9LAogCXsuaXJxID0gSVJRSU9fVk1SLCAgLm5hbWUgPSAiVk1SIiwgLmRlc2MgPSAiW0kvT10gVW5pdCBSZWNvcmQgRGV2aWNlcyJ9LAogCXsuaXJxID0gSVJRSU9fTENTLCAgLm5hbWUgPSAiTENTIiwgLmRlc2MgPSAiW0kvT10gTENTIn0sCi0Jey5pcnEgPSBJUlFJT19DTFcsICAubmFtZSA9ICJDTFciLCAuZGVzYyA9ICJbSS9PXSBDTEFXIn0sCiAJey5pcnEgPSBJUlFJT19DVEMsICAubmFtZSA9ICJDVEMiLCAuZGVzYyA9ICJbSS9PXSBDVEMifSwKIAl7LmlycSA9IElSUUlPX0FQQiwgIC5uYW1lID0gIkFQQiIsIC5kZXNjID0gIltJL09dIEFQIEJ1cyJ9LAogCXsuaXJxID0gSVJRSU9fQURNLCAgLm5hbWUgPSAiQURNIiwgLmRlc2MgPSAiW0kvT10gRUFETSBTdWJjaGFubmVsIn0sCkBAIC05NCw2ICs5Myw3IEBACiAKIHZvaWQgX19pbml0IGluaXRfSVJRKHZvaWQpCiB7CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoaXJxY2xhc3Nfc3ViX2Rlc2MpICE9IE5SX0FSQ0hfSVJRUyk7CiAJaW5pdF9jaW9faW50ZXJydXB0cygpOwogCWluaXRfYWlycV9pbnRlcnJ1cHRzKCk7CiAJaW5pdF9leHRfaW50ZXJydXB0cygpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9qdW1wX2xhYmVsLmMgYi9hcmNoL3MzOTAva2VybmVsL2p1bXBfbGFiZWwuYwppbmRleCA4MzAwNjZmLi5hOTAyOTk2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2p1bXBfbGFiZWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2p1bXBfbGFiZWwuYwpAQCAtNzgsNyArNzgsNyBAQAogCQlpZiAobWVtY21wKCh2b2lkICopZW50cnktPmNvZGUsICZvbGQsIHNpemVvZihvbGQpKSkKIAkJCWp1bXBfbGFiZWxfYnVnKGVudHJ5LCAmb2xkLCAmbmV3KTsKIAl9Ci0JcHJvYmVfa2VybmVsX3dyaXRlKCh2b2lkICopZW50cnktPmNvZGUsICZuZXcsIHNpemVvZihuZXcpKTsKKwlzMzkwX2tlcm5lbF93cml0ZSgodm9pZCAqKWVudHJ5LT5jb2RlLCAmbmV3LCBzaXplb2YobmV3KSk7CiB9CiAKIHN0YXRpYyBpbnQgX19zbV9hcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtKHZvaWQgKmRhdGEpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2twcm9iZXMuYyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCmluZGV4IGY1MTZlZGMuLjM4OWRiNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwva3Byb2Jlcy5jCkBAIC0xNzgsNyArMTc4LDcgQEAKIAl9CiBza2lwX2Z0cmFjZToKIAlrY2ItPmtwcm9iZV9zdGF0dXMgPSBLUFJPQkVfU1dBUF9JTlNUOwotCXByb2JlX2tlcm5lbF93cml0ZShwLT5hZGRyLCAmbmV3X2luc24sIGxlbik7CisJczM5MF9rZXJuZWxfd3JpdGUocC0+YWRkciwgJm5ld19pbnNuLCBsZW4pOwogCWtjYi0+a3Byb2JlX3N0YXR1cyA9IHN0YXR1czsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvbW9kdWxlLmMgYi9hcmNoL3MzOTAva2VybmVsL21vZHVsZS5jCmluZGV4IDJjYTk1ODYuLjBjMWE2NzkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9tb2R1bGUuYwpAQCAtMzgsMTMgKzM4LDggQEAKICNkZWZpbmUgREVCVUdQKGZtdCAsIC4uLikKICNlbmRpZgogCi0jaWZuZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBQTFRfRU5UUllfU0laRSAxMgotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAjZGVmaW5lIFBMVF9FTlRSWV9TSVpFIDIwCi0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKIHZvaWQgKm1vZHVsZV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJaWYgKFBBR0VfQUxJR04oc2l6ZSkgPiBNT0RVTEVTX0xFTikKQEAgLTUzLDcgKzQ4LDYgQEAKIAkJCQkgICAgR0ZQX0tFUk5FTCwgUEFHRV9LRVJORUwsIDAsIE5VTUFfTk9fTk9ERSwKIAkJCQkgICAgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKIH0KLSNlbmRpZgogCiB2b2lkIG1vZHVsZV9hcmNoX2ZyZWVpbmdfaW5pdChzdHJ1Y3QgbW9kdWxlICptb2QpCiB7CkBAIC0zMjMsMTcgKzMxNywxMSBAQAogCQkJdW5zaWduZWQgaW50ICppcDsKIAkJCWlwID0gbWUtPm1vZHVsZV9jb3JlICsgbWUtPmFyY2gucGx0X29mZnNldCArCiAJCQkJaW5mby0+cGx0X29mZnNldDsKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0JCQlpcFswXSA9IDB4MGQxMDU4MTA7IC8qIGJhc3IgMSwwOyBsIDEsNigxKTsgYnIgMSAqLwotCQkJaXBbMV0gPSAweDEwMDYwN2YxOwotCQkJaXBbMl0gPSB2YWw7Ci0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KIAkJCWlwWzBdID0gMHgwZDEwZTMxMDsgLyogYmFzciAxLDA7IGxnIDEsMTAoMSk7IGJyIDEgKi8KIAkJCWlwWzFdID0gMHgxMDBhMDAwNDsKIAkJCWlwWzJdID0gMHgwN2YxMDAwMDsKIAkJCWlwWzNdID0gKHVuc2lnbmVkIGludCkgKHZhbCA+PiAzMik7CiAJCQlpcFs0XSA9ICh1bnNpZ25lZCBpbnQpIHZhbDsKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAkJCWluZm8tPnBsdF9pbml0aWFsaXplZCA9IDE7CiAJCX0KIAkJaWYgKHJfdHlwZSA9PSBSXzM5MF9QTFRPRkYxNiB8fApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9ubWkuYyBiL2FyY2gvczM5MC9rZXJuZWwvbm1pLmMKaW5kZXggM2Y1MWNmNC4uNTA1YzE3YyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9ubWkuYworKysgYi9hcmNoL3MzOTAva2VybmVsL25taS5jCkBAIC0xMTcsNTUgKzExNywzNiBAQAogCQkgKi8KIAkJa2lsbF90YXNrID0gMTsKIAl9Ci0jaWZuZGVmIENPTkZJR182NEJJVAorCWZwdF9zYXZlX2FyZWEgPSAmUzM5MF9sb3djb3JlLmZsb2F0aW5nX3B0X3NhdmVfYXJlYTsKKwlmcHRfY3JlZ19zYXZlX2FyZWEgPSAmUzM5MF9sb3djb3JlLmZwdF9jcmVnX3NhdmVfYXJlYTsKKwlpZiAoIW1jaS0+ZmMpIHsKKwkJLyoKKwkJICogRmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlciBjYW4ndCBiZSByZXN0b3JlZC4KKwkJICogVGFzayB3aWxsIGJlIHRlcm1pbmF0ZWQuCisJCSAqLworCQlhc20gdm9sYXRpbGUoImxmcGMgMCglMCkiIDogOiAiYSIgKCZ6ZXJvKSwgIm0iICh6ZXJvKSk7CisJCWtpbGxfdGFzayA9IDE7CisJfSBlbHNlCisJCWFzbSB2b2xhdGlsZSgibGZwYyAwKCUwKSIgOiA6ICJhIiAoZnB0X2NyZWdfc2F2ZV9hcmVhKSk7CisKIAlhc20gdm9sYXRpbGUoCiAJCSIJbGQJMCwwKCUwKVxuIgotCQkiCWxkCTIsOCglMClcbiIKLQkJIglsZAk0LDE2KCUwKVxuIgotCQkiCWxkCTYsMjQoJTApIgotCQk6IDogImEiICgmUzM5MF9sb3djb3JlLmZsb2F0aW5nX3B0X3NhdmVfYXJlYSkpOwotI2VuZGlmCi0KLQlpZiAoTUFDSElORV9IQVNfSUVFRSkgewotI2lmZGVmIENPTkZJR182NEJJVAotCQlmcHRfc2F2ZV9hcmVhID0gJlMzOTBfbG93Y29yZS5mbG9hdGluZ19wdF9zYXZlX2FyZWE7Ci0JCWZwdF9jcmVnX3NhdmVfYXJlYSA9ICZTMzkwX2xvd2NvcmUuZnB0X2NyZWdfc2F2ZV9hcmVhOwotI2Vsc2UKLQkJZnB0X3NhdmVfYXJlYSA9ICh2b2lkICopIFMzOTBfbG93Y29yZS5leHRlbmRlZF9zYXZlX2FyZWFfYWRkcjsKLQkJZnB0X2NyZWdfc2F2ZV9hcmVhID0gZnB0X3NhdmVfYXJlYSArIDEyODsKLSNlbmRpZgotCQlpZiAoIW1jaS0+ZmMpIHsKLQkJCS8qCi0JCQkgKiBGbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyIGNhbid0IGJlIHJlc3RvcmVkLgotCQkJICogVGFzayB3aWxsIGJlIHRlcm1pbmF0ZWQuCi0JCQkgKi8KLQkJCWFzbSB2b2xhdGlsZSgibGZwYyAwKCUwKSIgOiA6ICJhIiAoJnplcm8pLCAibSIgKHplcm8pKTsKLQkJCWtpbGxfdGFzayA9IDE7Ci0KLQkJfSBlbHNlCi0JCQlhc20gdm9sYXRpbGUoImxmcGMgMCglMCkiIDogOiAiYSIgKGZwdF9jcmVnX3NhdmVfYXJlYSkpOwotCi0JCWFzbSB2b2xhdGlsZSgKLQkJCSIJbGQJMCwwKCUwKVxuIgotCQkJIglsZAkxLDgoJTApXG4iCi0JCQkiCWxkCTIsMTYoJTApXG4iCi0JCQkiCWxkCTMsMjQoJTApXG4iCi0JCQkiCWxkCTQsMzIoJTApXG4iCi0JCQkiCWxkCTUsNDAoJTApXG4iCi0JCQkiCWxkCTYsNDgoJTApXG4iCi0JCQkiCWxkCTcsNTYoJTApXG4iCi0JCQkiCWxkCTgsNjQoJTApXG4iCi0JCQkiCWxkCTksNzIoJTApXG4iCi0JCQkiCWxkCTEwLDgwKCUwKVxuIgotCQkJIglsZAkxMSw4OCglMClcbiIKLQkJCSIJbGQJMTIsOTYoJTApXG4iCi0JCQkiCWxkCTEzLDEwNCglMClcbiIKLQkJCSIJbGQJMTQsMTEyKCUwKVxuIgotCQkJIglsZAkxNSwxMjAoJTApXG4iCi0JCQk6IDogImEiIChmcHRfc2F2ZV9hcmVhKSk7Ci0JfQotCi0jaWZkZWYgQ09ORklHXzY0QklUCisJCSIJbGQJMSw4KCUwKVxuIgorCQkiCWxkCTIsMTYoJTApXG4iCisJCSIJbGQJMywyNCglMClcbiIKKwkJIglsZAk0LDMyKCUwKVxuIgorCQkiCWxkCTUsNDAoJTApXG4iCisJCSIJbGQJNiw0OCglMClcbiIKKwkJIglsZAk3LDU2KCUwKVxuIgorCQkiCWxkCTgsNjQoJTApXG4iCisJCSIJbGQJOSw3MiglMClcbiIKKwkJIglsZAkxMCw4MCglMClcbiIKKwkJIglsZAkxMSw4OCglMClcbiIKKwkJIglsZAkxMiw5NiglMClcbiIKKwkJIglsZAkxMywxMDQoJTApXG4iCisJCSIJbGQJMTQsMTEyKCUwKVxuIgorCQkiCWxkCTE1LDEyMCglMClcbiIKKwkJOiA6ICJhIiAoZnB0X3NhdmVfYXJlYSkpOwogCS8qIFJldmFsaWRhdGUgdmVjdG9yIHJlZ2lzdGVycyAqLwogCWlmIChNQUNISU5FX0hBU19WWCAmJiBjdXJyZW50LT50aHJlYWQudnhycykgewogCQlpZiAoIW1jaS0+dnIpIHsKQEAgLTE3OCw3ICsxNTksNiBAQAogCQlyZXN0b3JlX3Z4X3JlZ3MoKF9fdmVjdG9yMTI4ICopCiAJCQkJUzM5MF9sb3djb3JlLnZlY3Rvcl9zYXZlX2FyZWFfYWRkcik7CiAJfQotI2VuZGlmCiAJLyogUmV2YWxpZGF0ZSBhY2Nlc3MgcmVnaXN0ZXJzICovCiAJYXNtIHZvbGF0aWxlKAogCQkiCWxhbQkwLDE1LDAoJTApIgpAQCAtMTk4LDIxICsxNzgsMTQgQEAKIAkJICovCiAJCXMzOTBfaGFuZGxlX2RhbWFnZSgiaW52YWxpZCBjb250cm9sIHJlZ2lzdGVycy4iKTsKIAl9IGVsc2UgewotI2lmZGVmIENPTkZJR182NEJJVAogCQlhc20gdm9sYXRpbGUoCiAJCQkiCWxjdGxnCTAsMTUsMCglMCkiCiAJCQk6IDogImEiICgmUzM5MF9sb3djb3JlLmNyZWdzX3NhdmVfYXJlYSkpOwotI2Vsc2UKLQkJYXNtIHZvbGF0aWxlKAotCQkJIglsY3RsCTAsMTUsMCglMCkiCi0JCQk6IDogImEiICgmUzM5MF9sb3djb3JlLmNyZWdzX3NhdmVfYXJlYSkpOwotI2VuZGlmCiAJfQogCS8qCiAJICogV2UgZG9uJ3QgZXZlbiB0cnkgdG8gcmV2YWxpZGF0ZSB0aGUgVE9EIHJlZ2lzdGVyLCBzaW5jZSB3ZSBzaW1wbHkKIAkgKiBjYW4ndCB3cml0ZSBzb21ldGhpbmcgc2Vuc2libGUgaW50byB0aGF0IHJlZ2lzdGVyLgogCSAqLwotI2lmZGVmIENPTkZJR182NEJJVAogCS8qCiAJICogU2VlIGlmIHdlIGNhbiByZXZhbGlkYXRlIHRoZSBUT0QgcHJvZ3JhbW1hYmxlIHJlZ2lzdGVyIHdpdGggaXRzCiAJICogb2xkIGNvbnRlbnRzIChzaG91bGQgYmUgemVybykgb3RoZXJ3aXNlIHNldCBpdCB0byB6ZXJvLgpAQCAtMjI4LDcgKzIwMSw2IEBACiAJCQkiCXNja3BmIgogCQkJOiA6ICJhIiAoJlMzOTBfbG93Y29yZS50b2RfcHJvZ3JlZ19zYXZlX2FyZWEpCiAJCQk6ICIwIiwgImNjIik7Ci0jZW5kaWYKIAkvKiBSZXZhbGlkYXRlIGNsb2NrIGNvbXBhcmF0b3IgcmVnaXN0ZXIgKi8KIAlzZXRfY2xvY2tfY29tcGFyYXRvcihTMzkwX2xvd2NvcmUuY2xvY2tfY29tcGFyYXRvcik7CiAJLyogQ2hlY2sgaWYgb2xkIFBTVyBpcyB2YWxpZCAqLwpAQCAtMjgwLDE5ICsyNTIsMTEgQEAKIAkJaWYgKG1jaS0+YikgewogCQkJLyogUHJvY2Vzc2luZyBiYWNrdXAgLT4gdmVyaWZ5IGlmIHdlIGNhbiBzdXJ2aXZlIHRoaXMgKi8KIAkJCXU2NCB6X21jaWMsIG9fbWNpYywgdF9tY2ljOwotI2lmZGVmIENPTkZJR182NEJJVAogCQkJel9tY2ljID0gKDFVTEw8PDYzIHwgMVVMTDw8NTkgfCAxVUxMPDwyOSk7CiAJCQlvX21jaWMgPSAoMVVMTDw8NDMgfCAxVUxMPDw0MiB8IDFVTEw8PDQxIHwgMVVMTDw8NDAgfAogCQkJCSAgMVVMTDw8MzYgfCAxVUxMPDwzNSB8IDFVTEw8PDM0IHwgMVVMTDw8MzIgfAogCQkJCSAgMVVMTDw8MzAgfCAxVUxMPDwyMSB8IDFVTEw8PDIwIHwgMVVMTDw8MTcgfAogCQkJCSAgMVVMTDw8MTYpOwotI2Vsc2UKLQkJCXpfbWNpYyA9ICgxVUxMPDw2MyB8IDFVTEw8PDU5IHwgMVVMTDw8NTcgfCAxVUxMPDw1MCB8Ci0JCQkJICAxVUxMPDwyOSk7Ci0JCQlvX21jaWMgPSAoMVVMTDw8NDMgfCAxVUxMPDw0MiB8IDFVTEw8PDQxIHwgMVVMTDw8NDAgfAotCQkJCSAgMVVMTDw8MzYgfCAxVUxMPDwzNSB8IDFVTEw8PDM0IHwgMVVMTDw8MzIgfAotCQkJCSAgMVVMTDw8MzAgfCAxVUxMPDwyMCB8IDFVTEw8PDE3IHwgMVVMTDw8MTYpOwotI2VuZGlmCiAJCQl0X21jaWMgPSAqKHU2NCAqKW1jaTsKIAogCQkJaWYgKCgodF9tY2ljICYgel9tY2ljKSAhPSAwKSB8fApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wZXJmX2NwdW1fc2YuYyBiL2FyY2gvczM5MC9rZXJuZWwvcGVyZl9jcHVtX3NmLmMKaW5kZXggYzNmOGQxNS4uZTZhMTU3OCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wZXJmX2NwdW1fc2YuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3BlcmZfY3B1bV9zZi5jCkBAIC0xNDE1LDcgKzE0MTUsNyBAQAogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY3B1bXNmX3BtdV9ldmVudHNfYXR0cltdID0gewogCUNQVU1GX0VWRU5UX1BUUihTRiwgU0ZfQ1lDTEVTX0JBU0lDKSwKLQlDUFVNRl9FVkVOVF9QVFIoU0YsIFNGX0NZQ0xFU19CQVNJQ19ESUFHKSwKKwlOVUxMLAogCU5VTEwsCiB9OwogCkBAIC0xNjA2LDggKzE2MDYsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKHNpLmFkKQorCWlmIChzaS5hZCkgewogCQlzZmJfc2V0X2xpbWl0cyhDUFVNX1NGX01JTl9TREIsIENQVU1fU0ZfTUFYX1NEQik7CisJCWNwdW1zZl9wbXVfZXZlbnRzX2F0dHJbMV0gPQorCQkJQ1BVTUZfRVZFTlRfUFRSKFNGLCBTRl9DWUNMRVNfQkFTSUNfRElBRyk7CisJfQogCiAJc2ZkYmcgPSBkZWJ1Z19yZWdpc3RlcihLTVNHX0NPTVBPTkVOVCwgMiwgMSwgODApOwogCWlmICghc2ZkYmcpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3BnbV9jaGVjay5TIGIvYXJjaC9zMzkwL2tlcm5lbC9wZ21fY2hlY2suUwppbmRleCBmNmY4ODg2Li4wMzZhYTAxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3BnbV9jaGVjay5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcGdtX2NoZWNrLlMKQEAgLTYsMTkgKzYsMTMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KIAotI2lmZGVmIENPTkZJR18zMkJJVAotI2RlZmluZSBQR01fQ0hFQ0tfNjRCSVQoaGFuZGxlcikgLmxvbmcgZGVmYXVsdF90cmFwX2hhbmRsZXIKLSNlbHNlCi0jZGVmaW5lIFBHTV9DSEVDS182NEJJVChoYW5kbGVyKSAubG9uZyBoYW5kbGVyCi0jZW5kaWYKLQogI2RlZmluZSBQR01fQ0hFQ0soaGFuZGxlcikJLmxvbmcgaGFuZGxlcgogI2RlZmluZSBQR01fQ0hFQ0tfREVGQVVMVAlQR01fQ0hFQ0soZGVmYXVsdF90cmFwX2hhbmRsZXIpCiAKIC8qCiAgKiBUaGUgcHJvZ3JhbSBjaGVjayB0YWJsZSBjb250YWlucyBleGFjdGx5IDEyOCAoMHgwMC0weDdmKSBlbnRyaWVzLiBFYWNoCi0gKiBsaW5lIGRlZmluZXMgdGhlIDMxIGFuZC9vciA2NCBiaXQgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGNvcnJlc3BvbmRpbmcKLSAqIHRvIHRoZSBwcm9ncmFtIGNoZWNrIGludGVycnVwdGlvbiBjb2RlLgorICogbGluZSBkZWZpbmVzIHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvZ3JhbSBjaGVjaworICogaW50ZXJydXB0aW9uIGNvZGUuCiAgKi8KIC5zZWN0aW9uIC5yb2RhdGEsICJhIgogRU5UUlkocGdtX2NoZWNrX3RhYmxlKQpAQCAtNDYsMTAgKzQwLDEwIEBACiBQR01fQ0hFQ0sob3BlcmFuZF9leGNlcHRpb24pCQkvKiAxNSAqLwogUEdNX0NIRUNLX0RFRkFVTFQJCQkvKiAxNiAqLwogUEdNX0NIRUNLX0RFRkFVTFQJCQkvKiAxNyAqLwotUEdNX0NIRUNLXzY0QklUKHRyYW5zYWN0aW9uX2V4Y2VwdGlvbikJLyogMTggKi8KK1BHTV9DSEVDSyh0cmFuc2FjdGlvbl9leGNlcHRpb24pCS8qIDE4ICovCiBQR01fQ0hFQ0tfREVGQVVMVAkJCS8qIDE5ICovCiBQR01fQ0hFQ0tfREVGQVVMVAkJCS8qIDFhICovCi1QR01fQ0hFQ0tfNjRCSVQodmVjdG9yX2V4Y2VwdGlvbikJLyogMWIgKi8KK1BHTV9DSEVDSyh2ZWN0b3JfZXhjZXB0aW9uKQkJLyogMWIgKi8KIFBHTV9DSEVDSyhzcGFjZV9zd2l0Y2hfZXhjZXB0aW9uKQkvKiAxYyAqLwogUEdNX0NIRUNLKGhmcF9zcXJ0X2V4Y2VwdGlvbikJCS8qIDFkICovCiBQR01fQ0hFQ0tfREVGQVVMVAkJCS8qIDFlICovCkBAIC03OCwxMCArNzIsMTAgQEAKIFBHTV9DSEVDS19ERUZBVUxUCQkJLyogMzUgKi8KIFBHTV9DSEVDS19ERUZBVUxUCQkJLyogMzYgKi8KIFBHTV9DSEVDS19ERUZBVUxUCQkJLyogMzcgKi8KLVBHTV9DSEVDS182NEJJVChkb19kYXRfZXhjZXB0aW9uKQkvKiAzOCAqLwotUEdNX0NIRUNLXzY0QklUKGRvX2RhdF9leGNlcHRpb24pCS8qIDM5ICovCi1QR01fQ0hFQ0tfNjRCSVQoZG9fZGF0X2V4Y2VwdGlvbikJLyogM2EgKi8KLVBHTV9DSEVDS182NEJJVChkb19kYXRfZXhjZXB0aW9uKQkvKiAzYiAqLworUEdNX0NIRUNLKGRvX2RhdF9leGNlcHRpb24pCQkvKiAzOCAqLworUEdNX0NIRUNLKGRvX2RhdF9leGNlcHRpb24pCQkvKiAzOSAqLworUEdNX0NIRUNLKGRvX2RhdF9leGNlcHRpb24pCQkvKiAzYSAqLworUEdNX0NIRUNLKGRvX2RhdF9leGNlcHRpb24pCQkvKiAzYiAqLwogUEdNX0NIRUNLX0RFRkFVTFQJCQkvKiAzYyAqLwogUEdNX0NIRUNLX0RFRkFVTFQJCQkvKiAzZCAqLwogUEdNX0NIRUNLX0RFRkFVTFQJCQkvKiAzZSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYwppbmRleCAxM2ZjMDk3Li5kYzVlZGMyIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3Byb2Nlc3MuYwpAQCAtNzksMTMgKzc5LDExIEBACiB7CiB9CiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKIHZvaWQgYXJjaF9yZWxlYXNlX3Rhc2tfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQogewogCWlmICh0c2stPnRocmVhZC52eHJzKQogCQlrZnJlZSh0c2stPnRocmVhZC52eHJzKTsKIH0KLSNlbmRpZgogCiBpbnQgY29weV90aHJlYWQodW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncywgdW5zaWduZWQgbG9uZyBuZXdfc3RhY2twLAogCQl1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IHRhc2tfc3RydWN0ICpwKQpAQCAtMTQ0LDE5ICsxNDIsNiBAQAogCXAtPnRocmVhZC5yaV9zaWdudW0gPSAwOwogCWZyYW1lLT5jaGlsZHJlZ3MucHN3Lm1hc2sgJj0gflBTV19NQVNLX1JJOwogCi0jaWZuZGVmIENPTkZJR182NEJJVAotCS8qCi0JICogc2F2ZSBmcHJzIHRvIGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzIHRvIG1lcmdlIHRoZW0gd2l0aAotCSAqIHRoZSBlbXVsYXRlZCByZWdpc3RlcnMgYW5kIHRoZW4gY29weSB0aGUgcmVzdWx0IHRvIHRoZSBjaGlsZC4KLQkgKi8KLQlzYXZlX2ZwX2N0bCgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjKTsKLQlzYXZlX2ZwX3JlZ3MoY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBycyk7Ci0JbWVtY3B5KCZwLT50aHJlYWQuZnBfcmVncywgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLAotCSAgICAgICBzaXplb2YoczM5MF9mcF9yZWdzKSk7Ci0JLyogU2V0IGEgbmV3IFRMUyA/ICAqLwotCWlmIChjbG9uZV9mbGFncyAmIENMT05FX1NFVFRMUykKLQkJcC0+dGhyZWFkLmFjcnNbMF0gPSBmcmFtZS0+Y2hpbGRyZWdzLmdwcnNbNl07Ci0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KIAkvKiBTYXZlIHRoZSBmcHUgcmVnaXN0ZXJzIHRvIG5ldyB0aHJlYWQgc3RydWN0dXJlLiAqLwogCXNhdmVfZnBfY3RsKCZwLT50aHJlYWQuZnBfcmVncy5mcGMpOwogCXNhdmVfZnBfcmVncyhwLT50aHJlYWQuZnBfcmVncy5mcHJzKTsKQEAgLTE3MiwxNSArMTU3LDEzIEBACiAJCQlwLT50aHJlYWQuYWNyc1sxXSA9ICh1bnNpZ25lZCBpbnQpdGxzOwogCQl9CiAJfQotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCXJldHVybiAwOwogfQogCiBhc21saW5rYWdlIHZvaWQgZXhlY3ZlX3RhaWwodm9pZCkKIHsKIAljdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgPSAwOwotCWlmIChNQUNISU5FX0hBU19JRUVFKQotCQlhc20gdm9sYXRpbGUoInNmcGMgJTAsJTAiIDogOiAiZCIgKDApKTsKKwlhc20gdm9sYXRpbGUoInNmcGMgJTAsJTAiIDogOiAiZCIgKDApKTsKIH0KIAogLyoKQEAgLTE4OCwxOCArMTcxLDggQEAKICAqLwogaW50IGR1bXBfZnB1IChzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MsIHMzOTBfZnBfcmVncyAqZnByZWdzKQogewotI2lmbmRlZiBDT05GSUdfNjRCSVQKLQkvKgotCSAqIHNhdmUgZnBycyB0byBjdXJyZW50LT50aHJlYWQuZnBfcmVncyB0byBtZXJnZSB0aGVtIHdpdGgKLQkgKiB0aGUgZW11bGF0ZWQgcmVnaXN0ZXJzIGFuZCB0aGVuIGNvcHkgdGhlIHJlc3VsdCB0byB0aGUgZHVtcC4KLQkgKi8KLQlzYXZlX2ZwX2N0bCgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjKTsKLQlzYXZlX2ZwX3JlZ3MoY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBycyk7Ci0JbWVtY3B5KGZwcmVncywgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLCBzaXplb2YoczM5MF9mcF9yZWdzKSk7Ci0jZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KIAlzYXZlX2ZwX2N0bCgmZnByZWdzLT5mcGMpOwogCXNhdmVfZnBfcmVncyhmcHJlZ3MtPmZwcnMpOwotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCXJldHVybiAxOwogfQogRVhQT1JUX1NZTUJPTChkdW1wX2ZwdSk7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYwppbmRleCBlYWJmYjQ1Li5kMzYzYzljIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKQEAgLTQ0LDcgKzQ0LDYgQEAKIAlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkID0gJnRhc2stPnRocmVhZDsKIAlzdHJ1Y3QgcGVyX3JlZ3Mgb2xkLCBuZXc7CiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAkvKiBUYWtlIGNhcmUgb2YgdGhlIGVuYWJsZS9kaXNhYmxlIG9mIHRyYW5zYWN0aW9uYWwgZXhlY3V0aW9uLiAqLwogCWlmIChNQUNISU5FX0hBU19URSB8fCBNQUNISU5FX0hBU19WWCkgewogCQl1bnNpZ25lZCBsb25nIGNyLCBjcl9uZXc7CkBAIC04MCw3ICs3OSw2IEBACiAJCQkJX19jdGxfbG9hZChjcl9uZXcsIDIsIDIpOwogCQl9CiAJfQotI2VuZGlmCiAJLyogQ29weSB1c2VyIHNwZWNpZmllZCBQRVIgcmVnaXN0ZXJzICovCiAJbmV3LmNvbnRyb2wgPSB0aHJlYWQtPnBlcl91c2VyLmNvbnRyb2w7CiAJbmV3LnN0YXJ0ID0gdGhyZWFkLT5wZXJfdXNlci5zdGFydDsKQEAgLTkzLDEwICs5MSw4IEBACiAJCQluZXcuY29udHJvbCB8PSBQRVJfRVZFTlRfQlJBTkNIOwogCQllbHNlCiAJCQluZXcuY29udHJvbCB8PSBQRVJfRVZFTlRfSUZFVENIOwotI2lmZGVmIENPTkZJR182NEJJVAogCQluZXcuY29udHJvbCB8PSBQRVJfQ09OVFJPTF9TVVNQRU5TSU9OOwogCQluZXcuY29udHJvbCB8PSBQRVJfRVZFTlRfVFJBTlNBQ1RJT05fRU5EOwotI2VuZGlmCiAJCWlmICh0ZXN0X3Rza190aHJlYWRfZmxhZyh0YXNrLCBUSUZfVVBST0JFX1NJTkdMRVNURVApKQogCQkJbmV3LmNvbnRyb2wgfD0gUEVSX0VWRU5UX0lGRVRDSDsKIAkJbmV3LnN0YXJ0ID0gMDsKQEAgLTE0NiwxMSArMTQyLDcgQEAKIAl0YXNrLT50aHJlYWQucGVyX2ZsYWdzID0gMDsKIH0KIAotI2lmbmRlZiBDT05GSUdfNjRCSVQKLSMgZGVmaW5lIF9fQUREUl9NQVNLIDMKLSNlbHNlCi0jIGRlZmluZSBfX0FERFJfTUFTSyA3Ci0jZW5kaWYKKyNkZWZpbmUgX19BRERSX01BU0sgNwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19wZWVrX3VzZXJfcGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCiAJCQkJCSAgICBhZGRyX3QgYWRkcikKQEAgLTIyMyw3ICsyMTUsNiBAQAogCQkgKiBhY2Nlc3MgcmVnaXN0ZXJzIGFyZSBzdG9yZWQgaW4gdGhlIHRocmVhZCBzdHJ1Y3R1cmUKIAkJICovCiAJCW9mZnNldCA9IGFkZHIgLSAoYWRkcl90KSAmZHVtbXktPnJlZ3MuYWNyczsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAkJLyoKIAkJICogVmVyeSBzcGVjaWFsIGNhc2U6IG9sZCAmIGJyb2tlbiA2NCBiaXQgZ2RiIHJlYWRpbmcKIAkJICogZnJvbSBhY3JzWzE1XS4gUmVzdWx0IGlzIGEgNjQgYml0IHZhbHVlLiBSZWFkIHRoZQpAQCAtMjMyLDggKzIyMyw3IEBACiAJCWlmIChhZGRyID09IChhZGRyX3QpICZkdW1teS0+cmVncy5hY3JzWzE1XSkKIAkJCXRtcCA9ICgodW5zaWduZWQgbG9uZykgY2hpbGQtPnRocmVhZC5hY3JzWzE1XSkgPDwgMzI7CiAJCWVsc2UKLSNlbmRpZgotCQl0bXAgPSAqKGFkZHJfdCAqKSgoYWRkcl90KSAmY2hpbGQtPnRocmVhZC5hY3JzICsgb2Zmc2V0KTsKKwkJCXRtcCA9ICooYWRkcl90ICopKChhZGRyX3QpICZjaGlsZC0+dGhyZWFkLmFjcnMgKyBvZmZzZXQpOwogCiAJfSBlbHNlIGlmIChhZGRyID09IChhZGRyX3QpICZkdW1teS0+cmVncy5vcmlnX2dwcjIpIHsKIAkJLyoKQEAgLTI2MSwxMiArMjUxLDEwIEBACiAJCSAqIG9yIHRoZSBjaGlsZC0+dGhyZWFkLnZ4cnMgYXJyYXkKIAkJICovCiAJCW9mZnNldCA9IGFkZHIgLSAoYWRkcl90KSAmZHVtbXktPnJlZ3MuZnBfcmVncy5mcHJzOwotI2lmZGVmIENPTkZJR182NEJJVAogCQlpZiAoY2hpbGQtPnRocmVhZC52eHJzKQogCQkJdG1wID0gKihhZGRyX3QgKikKIAkJCSAgICAgICAoKGFkZHJfdCkgY2hpbGQtPnRocmVhZC52eHJzICsgMipvZmZzZXQpOwogCQllbHNlCi0jZW5kaWYKIAkJCXRtcCA9ICooYWRkcl90ICopCiAJCQkgICAgICAgKChhZGRyX3QpICZjaGlsZC0+dGhyZWFkLmZwX3JlZ3MuZnBycyArIG9mZnNldCk7CiAKQEAgLTI5MywxMSArMjgxLDkgQEAKIAkgKiBhbiBhbGlnbm1lbnQgb2YgNC4gUHJvZ3JhbW1lcnMgZnJvbSBoZWxsLi4uCiAJICovCiAJbWFzayA9IF9fQUREUl9NQVNLOwotI2lmZGVmIENPTkZJR182NEJJVAogCWlmIChhZGRyID49IChhZGRyX3QpICYoKHN0cnVjdCB1c2VyICopIE5VTEwpLT5yZWdzLmFjcnMgJiYKIAkgICAgYWRkciA8IChhZGRyX3QpICYoKHN0cnVjdCB1c2VyICopIE5VTEwpLT5yZWdzLm9yaWdfZ3ByMikKIAkJbWFzayA9IDM7Ci0jZW5kaWYKIAlpZiAoKGFkZHIgJiBtYXNrKSB8fCBhZGRyID4gc2l6ZW9mKHN0cnVjdCB1c2VyKSAtIF9fQUREUl9NQVNLKQogCQlyZXR1cm4gLUVJTzsKIApAQCAtMzcwLDcgKzM1Niw2IEBACiAJCSAqIGFjY2VzcyByZWdpc3RlcnMgYXJlIHN0b3JlZCBpbiB0aGUgdGhyZWFkIHN0cnVjdHVyZQogCQkgKi8KIAkJb2Zmc2V0ID0gYWRkciAtIChhZGRyX3QpICZkdW1teS0+cmVncy5hY3JzOwotI2lmZGVmIENPTkZJR182NEJJVAogCQkvKgogCQkgKiBWZXJ5IHNwZWNpYWwgY2FzZTogb2xkICYgYnJva2VuIDY0IGJpdCBnZGIgd3JpdGluZwogCQkgKiB0byBhY3JzWzE1XSB3aXRoIGEgNjQgYml0IHZhbHVlLiBJZ25vcmUgdGhlIGxvd2VyCkBAIC0zODAsOCArMzY1LDcgQEAKIAkJaWYgKGFkZHIgPT0gKGFkZHJfdCkgJmR1bW15LT5yZWdzLmFjcnNbMTVdKQogCQkJY2hpbGQtPnRocmVhZC5hY3JzWzE1XSA9ICh1bnNpZ25lZCBpbnQpIChkYXRhID4+IDMyKTsKIAkJZWxzZQotI2VuZGlmCi0JCSooYWRkcl90ICopKChhZGRyX3QpICZjaGlsZC0+dGhyZWFkLmFjcnMgKyBvZmZzZXQpID0gZGF0YTsKKwkJCSooYWRkcl90ICopKChhZGRyX3QpICZjaGlsZC0+dGhyZWFkLmFjcnMgKyBvZmZzZXQpID0gZGF0YTsKIAogCX0gZWxzZSBpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXktPnJlZ3Mub3JpZ19ncHIyKSB7CiAJCS8qCkBAIC00MTEsMTIgKzM5NSwxMCBAQAogCQkgKiBvciB0aGUgY2hpbGQtPnRocmVhZC52eHJzIGFycmF5CiAJCSAqLwogCQlvZmZzZXQgPSBhZGRyIC0gKGFkZHJfdCkgJmR1bW15LT5yZWdzLmZwX3JlZ3MuZnByczsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAkJaWYgKGNoaWxkLT50aHJlYWQudnhycykKIAkJCSooYWRkcl90ICopKChhZGRyX3QpCiAJCQkJY2hpbGQtPnRocmVhZC52eHJzICsgMipvZmZzZXQpID0gZGF0YTsKIAkJZWxzZQotI2VuZGlmCiAJCQkqKGFkZHJfdCAqKSgoYWRkcl90KQogCQkJCSZjaGlsZC0+dGhyZWFkLmZwX3JlZ3MuZnBycyArIG9mZnNldCkgPSBkYXRhOwogCkBAIC00NDEsMTEgKzQyMyw5IEBACiAJICogYW4gYWxpZ25tZW50IG9mIDQuIFByb2dyYW1tZXJzIGZyb20gaGVsbCBpbmRlZWQuLi4KIAkgKi8KIAltYXNrID0gX19BRERSX01BU0s7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJaWYgKGFkZHIgPj0gKGFkZHJfdCkgJigoc3RydWN0IHVzZXIgKikgTlVMTCktPnJlZ3MuYWNycyAmJgogCSAgICBhZGRyIDwgKGFkZHJfdCkgJigoc3RydWN0IHVzZXIgKikgTlVMTCktPnJlZ3Mub3JpZ19ncHIyKQogCQltYXNrID0gMzsKLSNlbmRpZgogCWlmICgoYWRkciAmIG1hc2spIHx8IGFkZHIgPiBzaXplb2Yoc3RydWN0IHVzZXIpIC0gX19BRERSX01BU0spCiAJCXJldHVybiAtRUlPOwogCkBAIC02NDksMTIgKzYyOSwxMCBAQAogCQkgKiBvciB0aGUgY2hpbGQtPnRocmVhZC52eHJzIGFycmF5CiAJCSAqLwogCQlvZmZzZXQgPSBhZGRyIC0gKGFkZHJfdCkgJmR1bW15MzItPnJlZ3MuZnBfcmVncy5mcHJzOwotI2lmZGVmIENPTkZJR182NEJJVAogCQlpZiAoY2hpbGQtPnRocmVhZC52eHJzKQogCQkJdG1wID0gKihfX3UzMiAqKQogCQkJICAgICAgICgoYWRkcl90KSBjaGlsZC0+dGhyZWFkLnZ4cnMgKyAyKm9mZnNldCk7CiAJCWVsc2UKLSNlbmRpZgogCQkJdG1wID0gKihfX3UzMiAqKQogCQkJICAgICAgICgoYWRkcl90KSAmY2hpbGQtPnRocmVhZC5mcF9yZWdzLmZwcnMgKyBvZmZzZXQpOwogCkBAIC03NzYsMTIgKzc1NCwxMCBAQAogCQkgKiBvciB0aGUgY2hpbGQtPnRocmVhZC52eHJzIGFycmF5CiAJCSAqLwogCQlvZmZzZXQgPSBhZGRyIC0gKGFkZHJfdCkgJmR1bW15MzItPnJlZ3MuZnBfcmVncy5mcHJzOwotI2lmZGVmIENPTkZJR182NEJJVAogCQlpZiAoY2hpbGQtPnRocmVhZC52eHJzKQogCQkJKihfX3UzMiAqKSgoYWRkcl90KQogCQkJCWNoaWxkLT50aHJlYWQudnhycyArIDIqb2Zmc2V0KSA9IHRtcDsKIAkJZWxzZQotI2VuZGlmCiAJCQkqKF9fdTMyICopKChhZGRyX3QpCiAJCQkJJmNoaWxkLT50aHJlYWQuZnBfcmVncy5mcHJzICsgb2Zmc2V0KSA9IHRtcDsKIApAQCAtOTc5LDE2ICs5NTUsMTMgQEAKIAlpZiAodGFyZ2V0ID09IGN1cnJlbnQpIHsKIAkJc2F2ZV9mcF9jdGwoJnRhcmdldC0+dGhyZWFkLmZwX3JlZ3MuZnBjKTsKIAkJc2F2ZV9mcF9yZWdzKHRhcmdldC0+dGhyZWFkLmZwX3JlZ3MuZnBycyk7Ci0JfQotI2lmZGVmIENPTkZJR182NEJJVAotCWVsc2UgaWYgKHRhcmdldC0+dGhyZWFkLnZ4cnMpIHsKKwl9IGVsc2UgaWYgKHRhcmdldC0+dGhyZWFkLnZ4cnMpIHsKIAkJaW50IGk7CiAKIAkJZm9yIChpID0gMDsgaSA8IF9fTlVNX1ZYUlNfTE9XOyBpKyspCiAJCQl0YXJnZXQtPnRocmVhZC5mcF9yZWdzLmZwcnNbaV0gPQogCQkJCSooZnJlZ190ICopKHRhcmdldC0+dGhyZWFkLnZ4cnMgKyBpKTsKIAl9Ci0jZW5kaWYKIAlyZXR1cm4gdXNlcl9yZWdzZXRfY29weW91dCgmcG9zLCAmY291bnQsICZrYnVmLCAmdWJ1ZiwKIAkJCQkgICAmdGFyZ2V0LT50aHJlYWQuZnBfcmVncywgMCwgLTEpOwogfQpAQCAtMTAyNiwyMyArOTk5LDE4IEBACiAJCWlmICh0YXJnZXQgPT0gY3VycmVudCkgewogCQkJcmVzdG9yZV9mcF9jdGwoJnRhcmdldC0+dGhyZWFkLmZwX3JlZ3MuZnBjKTsKIAkJCXJlc3RvcmVfZnBfcmVncyh0YXJnZXQtPnRocmVhZC5mcF9yZWdzLmZwcnMpOwotCQl9Ci0jaWZkZWYgQ09ORklHXzY0QklUCi0JCWVsc2UgaWYgKHRhcmdldC0+dGhyZWFkLnZ4cnMpIHsKKwkJfSBlbHNlIGlmICh0YXJnZXQtPnRocmVhZC52eHJzKSB7CiAJCQlpbnQgaTsKIAogCQkJZm9yIChpID0gMDsgaSA8IF9fTlVNX1ZYUlNfTE9XOyBpKyspCiAJCQkJKihmcmVnX3QgKikodGFyZ2V0LT50aHJlYWQudnhycyArIGkpID0KIAkJCQkJdGFyZ2V0LT50aHJlYWQuZnBfcmVncy5mcHJzW2ldOwogCQl9Ci0jZW5kaWYKIAl9CiAKIAlyZXR1cm4gcmM7CiB9CiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKLQogc3RhdGljIGludCBzMzkwX2xhc3RfYnJlYWtfZ2V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2VyX3JlZ3NldCAqcmVnc2V0LAogCQkJICAgICAgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKQEAgLTExODIsOCArMTE1MCw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0jZW5kaWYKLQogc3RhdGljIGludCBzMzkwX3N5c3RlbV9jYWxsX2dldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKIAkJCQljb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXQgKnJlZ3NldCwKIAkJCQl1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCkBAIC0xMjI5LDcgKzExOTUsNiBAQAogCQkuZ2V0ID0gczM5MF9zeXN0ZW1fY2FsbF9nZXQsCiAJCS5zZXQgPSBzMzkwX3N5c3RlbV9jYWxsX3NldCwKIAl9LAotI2lmZGVmIENPTkZJR182NEJJVAogCXsKIAkJLmNvcmVfbm90ZV90eXBlID0gTlRfUzM5MF9MQVNUX0JSRUFLLAogCQkubiA9IDEsCkBAIC0xMjYyLDcgKzEyMjcsNiBAQAogCQkuZ2V0ID0gczM5MF92eHJzX2hpZ2hfZ2V0LAogCQkuc2V0ID0gczM5MF92eHJzX2hpZ2hfc2V0LAogCX0sCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNlcl9yZWdzZXRfdmlldyB1c2VyX3MzOTBfdmlldyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcmVpcGwuUyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGwuUwppbmRleCBkZDgwMTZiLi41MmFhYjBiIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWlwbC5TCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqICBTMzkwIHZlcnNpb24KLSAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMAotICogICAgQXV0aG9yKHMpOiBIb2xnZXIgU21vbGluc2tpIChIb2xnZXIuU21vbGluc2tpQGRlLmlibS5jb20pCisgKiAgICBDb3B5cmlnaHQgSUJNIENvcnAgMjAwMCwgMjAxMQorICogICAgQXV0aG9yKHMpOiBIb2xnZXIgU21vbGluc2tpIDxIb2xnZXIuU21vbGluc2tpQGRlLmlibS5jb20+LAorICoJCSBEZW5pcyBKb3NlcGggQmFycm93LAogICovCiAKICNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CkBAIC05LDQzICs5LDkwIEBACiAjaW5jbHVkZSA8YXNtL3NpZ3AuaD4KIAogIwotIyBzdG9yZV9zdGF0dXM6IEVtcHR5IGltcGxlbWVudGF0aW9uIHVudGlsIGtkdW1wIGlzIHN1cHBvcnRlZCBvbiAzMSBiaXQKKyMgc3RvcmVfc3RhdHVzCisjCisjIFByZXJlcXVpc2l0ZXMgdG8gcnVuIHRoaXMgZnVuY3Rpb246CisjIC0gUHJlZml4IHJlZ2lzdGVyIGlzIHNldCB0byB6ZXJvCisjIC0gT3JpZ2luYWwgcHJlZml4IHJlZ2lzdGVyIGlzIHN0b3JlZCBpbiAiZHVtcF9wcmVmaXhfcGFnZSIKKyMgLSBMb3djb3JlIHByb3RlY3Rpb24gaXMgb2ZmCiAjCiBFTlRSWShzdG9yZV9zdGF0dXMpCi0JCWJyCSVyMTQKKwkvKiBTYXZlIHJlZ2lzdGVyIG9uZSBhbmQgbG9hZCBzYXZlIGFyZWEgYmFzZSAqLworCXN0ZwklcjEsX19MQ19TQVZFX0FSRUFfUkVTVEFSVAorCWxnaGkJJXIxLFNBVkVfQVJFQV9CQVNFCisJLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLworCXN0bWcJJXIwLCVyMTUsX19MQ19HUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlsZwklcjIsX19MQ19TQVZFX0FSRUFfUkVTVEFSVAorCXN0ZwklcjIsX19MQ19HUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKzgoJXIxKQorCS8qIENvbnRyb2wgcmVnaXN0ZXJzICovCisJc3RjdGcJJWMwLCVjMTUsX19MQ19DUkVHU19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UoJXIxKQorCS8qIEFjY2VzcyByZWdpc3RlcnMgKi8KKwlzdGFtCSVhMCwlYTE1LF9fTENfQVJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwkvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KKwlzdGQJJWYwLCAweDAwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxLCAweDA4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYyLCAweDEwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYzLCAweDE4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY0LCAweDIwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY1LCAweDI4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY2LCAweDMwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY3LCAweDM4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY4LCAweDQwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWY5LCAweDQ4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxMCwweDUwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxMSwweDU4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxMiwweDYwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxMywweDY4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxNCwweDcwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwlzdGQJJWYxNSwweDc4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwkvKiBGbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyICovCisJc3RmcGMJX19MQ19GUF9DUkVHX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJLyogQ1BVIHRpbWVyICovCisJc3RwdAlfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UoJXIxKQorCS8qIFNhdmVkIHByZWZpeCByZWdpc3RlciAqLworCWxhcmwJJXIyLGR1bXBfcHJlZml4X3BhZ2UKKwltdmMJX19MQ19QUkVGSVhfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKDQsJXIxKSwwKCVyMikKKwkvKiBDbG9jayBjb21wYXJhdG9yIC0gc2V2ZW4gYnl0ZXMgKi8KKwlsYXJsCSVyMiwuTGNsa2NtcAorCXN0Y2tjCTAoJXIyKQorCW12YwlfX0xDX0NMT0NLX0NPTVBfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFICsgMSg3LCVyMSksMSglcjIpCisJLyogUHJvZ3JhbSBzdGF0dXMgd29yZCAqLworCWVwc3cJJXIyLCVyMworCXN0CSVyMixfX0xDX1BTV19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UgKyAwKCVyMSkKKwlzdAklcjMsX19MQ19QU1dfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFICsgNCglcjEpCisJbGFybAklcjIsc3RvcmVfc3RhdHVzCisJc3RnCSVyMixfX0xDX1BTV19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UgKyA4KCVyMSkKKwlicgklcjE0CisKKwkuc2VjdGlvbiAuYnNzCisJLmFsaWduCTgKKy5MY2xrY21wOgkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKKwkucHJldmlvdXMKIAogIwogIyBkb19yZWlwbF9hc20KICMgUGFyYW1ldGVyOiByMiA9IHNjaGlkIG9mIHJlaXBsIGRldmljZQogIworCiBFTlRSWShkb19yZWlwbF9hc20pCiAJCWJhc3IJJXIxMywwCi0uTHBnMDoJCWxwc3cJLkxuZXdwc3ctLkxwZzAoJXIxMykKLS5McGcxOgkJIyBkbyBzdG9yZSBzdGF0dXMgb2YgYWxsIHJlZ2lzdGVycworLkxwZzA6CQlscHN3ZQkuTG5ld3Bzdy0uTHBnMCglcjEzKQorLkxwZzE6CQlicmFzbAklcjE0LHN0b3JlX3N0YXR1cwogCi0JCXN0bQklcjAsJXIxNSxfX0xDX0dQUkVHU19TQVZFX0FSRUEKLQkJc3RjdGwJJWMwLCVjMTUsX19MQ19DUkVHU19TQVZFX0FSRUEKLQkJc3RhbQklYTAsJWExNSxfX0xDX0FSRUdTX1NBVkVfQVJFQQotCQlsCSVyMTAsLkxkdW1wX3BmeC0uTHBnMCglcjEzKQotCQltdmMJX19MQ19QUkVGSVhfU0FWRV9BUkVBKDQpLDAoJXIxMCkKLQkJc3Rja2MJLkxjbGtjbXAtLkxwZzAoJXIxMykKLQkJbXZjCV9fTENfQ0xPQ0tfQ09NUF9TQVZFX0FSRUEoOCksLkxjbGtjbXAtLkxwZzAoJXIxMykKLQkJc3RwdAlfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEKLQkJc3QJJXIxMywgX19MQ19QU1dfU0FWRV9BUkVBKzQKLQkJbGN0bAklYzYsJWM2LC5MYWxsLS5McGcwKCVyMTMpCi0JCWxyCSVyMSwlcjIKLQkJbXZjCV9fTENfUEdNX05FV19QU1coOCksLkxwY25ldy0uTHBnMCglcjEzKQorCQlsY3RsZwklYzYsJWM2LC5MYWxsLS5McGcwKCVyMTMpCisJCWxncgklcjEsJXIyCisJCW12YwlfX0xDX1BHTV9ORVdfUFNXKDE2KSwuTHBjbmV3LS5McGcwKCVyMTMpCiAJCXN0c2NoCS5Mc2NoaWItLkxwZzAoJXIxMykKIAkJb2kJLkxzY2hpYis1LS5McGcwKCVyMTMpLDB4ODQKLS5MZWNzOiAgCXhpCS5Mc2NoaWIrMjctLkxwZzAoJXIxMyksMHgwMQorLkxlY3M6CQl4aQkuTHNjaGliKzI3LS5McGcwKCVyMTMpLDB4MDEKIAkJbXNjaAkuTHNjaGliLS5McGcwKCVyMTMpCi0JCWxoaQklcjAsNQorCQlsZ2hpCSVyMCw1CiAuTHNzY2g6CQlzc2NoCS5MaXBsb3JiLS5McGcwKCVyMTMpCiAJCWp6CS5MMDAxCiAJCWJyY3QJJXIwLC5Mc3NjaAogCQliYXMJJXIxNCwuTGRpc2FiLS5McGcwKCVyMTMpCi0uTDAwMToJCW12YwlfX0xDX0lPX05FV19QU1coOCksLkxpb25ldy0uTHBnMCglcjEzKQotLkx0cGk6CQlscHN3CS5Md2FpdHBzdy0uTHBnMCglcjEzKQorLkwwMDE6CQltdmMJX19MQ19JT19ORVdfUFNXKDE2KSwuTGlvbmV3LS5McGcwKCVyMTMpCisuTHRwaToJCWxwc3dlCS5Md2FpdHBzdy0uTHBnMCglcjEzKQogLkxjb250OgkJYwklcjEsX19MQ19TVUJDSEFOTkVMX0lECiAJCWpuegkuTHRwaQogCQljbGMJX19MQ19JT19JTlRfUEFSTSg0KSwuTGlwbG9yYi0uTHBnMCglcjEzKQpAQCAtNTgsMjAgKzEwNSwzNiBAQAogCQlqegkuTDAwMwogCQliYXMJJXIxNCwuTGRpc2FiLS5McGcwKCVyMTMpCiAuTDAwMzoJCXN0CSVyMSxfX0xDX1NVQkNIQU5ORUxfSUQKKwkJbGhpCSVyMSwwCQkgIyBtb2RlIDAgPSBlc2EKKwkJc2xyCSVyMCwlcjAJCSAjIHNldCBjcHVpZCB0byB6ZXJvCisJCXNpZ3AJJXIxLCVyMCxTSUdQX1NFVF9BUkNISVRFQ1RVUkUgIyBzd2l0Y2ggdG8gZXNhIG1vZGUKIAkJbHBzdwkwCi0JCXNpZ3AJMCwwLFNJR1BfUkVTVEFSVAotLkxkaXNhYjoJc3QJJXIxNCwuTGRpc3Bzdys0LS5McGcwKCVyMTMpCi0JCWxwc3cJLkxkaXNwc3ctLkxwZzAoJXIxMykKKy5MZGlzYWI6CXNsbAklcjE0LDEKKwkJc3JsCSVyMTQsMQkJICMgbmVlZCB0byBraWxsIGhpIGJpdCB0byBhdm9pZCBzcGVjaWZpY2F0aW9uIGV4Y2VwdGlvbnMuCisJCXN0CSVyMTQsLkxkaXNwc3crMTItLkxwZzAoJXIxMykKKwkJbHBzd2UJLkxkaXNwc3ctLkxwZzAoJXIxMykKIAkJLmFsaWduCTgKLS5MY2xrY21wOgkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKLS5MYWxsOgkJLmxvbmcJMHhmZjAwMDAwMAotLkxkdW1wX3BmeDoJLmxvbmcJZHVtcF9wcmVmaXhfcGFnZQotCQkuYWxpZ24JOAotLkxuZXdwc3c6CS5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMCsuTHBnMQotLkxwY25ldzoJLmxvbmcJMHgwMDA4MDAwMCwweDgwMDAwMDAwKy5MZWNzCi0uTGlvbmV3OgkubG9uZwkweDAwMDgwMDAwLDB4ODAwMDAwMDArLkxjb250Ci0uTHdhaXRwc3c6CS5sb25nCTB4MDIwYTAwMDAsMHgwMDAwMDAwMCsuTHRwaQotLkxkaXNwc3c6CS5sb25nCTB4MDAwYTAwMDAsMHgwMDAwMDAwMAorLkxhbGw6CQkucXVhZAkweDAwMDAwMDAwZmYwMDAwMDAKKwkJLmFsaWduCTE2CisvKgorICogVGhlc2UgYWRkcmVzc2VzIGhhdmUgdG8gYmUgMzEgYml0IG90aGVyd2lzZQorICogdGhlIHNpZ3Agd2lsbCB0aHJvdyBhIHNwZWNpZmNhdGlvbiBleGNlcHRpb24KKyAqIHdoZW4gc3dpdGNoaW5nIHRvIEVTQSBtb2RlIGFzIGJpdCAzMSBiZSBzZXQKKyAqIGluIHRoZSBFU0EgcHN3LgorICogQml0IDMxIG9mIHRoZSBhZGRyZXNzZXMgaGFzIHRvIGJlIDAgZm9yIHRoZQorICogMzFiaXQgbHBzd2UgaW5zdHJ1Y3Rpb24gYSBmYWN0IHRoZXkgYXBwZWFyIHRvIGhhdmUKKyAqIG9taXR0ZWQgZnJvbSB0aGUgcG9wLgorICovCisuTG5ld3BzdzoJLnF1YWQJMHgwMDAwMDAwMDgwMDAwMDAwCisJCS5xdWFkCS5McGcxCisuTHBjbmV3OgkucXVhZAkweDAwMDAwMDAwODAwMDAwMDAKKwkJLnF1YWQJLkxlY3MKKy5MaW9uZXc6CS5xdWFkCTB4MDAwMDAwMDA4MDAwMDAwMAorCQkucXVhZAkuTGNvbnQKKy5Md2FpdHBzdzoJLnF1YWQJMHgwMjAyMDAwMDgwMDAwMDAwCisJCS5xdWFkCS5MdHBpCisuTGRpc3BzdzoJLnF1YWQJMHgwMDAyMDAwMDgwMDAwMDAwCisJCS5xdWFkCTB4MDAwMDAwMDAwMDAwMDAwMAogLkxpcGxjY3dzOgkubG9uZwkweDAyMDAwMDAwLDB4NjAwMDAwMTgKIAkJLmxvbmcJMHgwODAwMDAwOCwweDIwMDAwMDAxCiAuTGlwbG9yYjoJLmxvbmcJMHgwMDQ5NTA0YywweDAwNDBmZjgwCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsNjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzNiMTI3Li4wMDAwMDAwCi0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qCi0gKiAgICBDb3B5cmlnaHQgSUJNIENvcnAgMjAwMCwgMjAxMQotICogICAgQXV0aG9yKHMpOiBIb2xnZXIgU21vbGluc2tpIDxIb2xnZXIuU21vbGluc2tpQGRlLmlibS5jb20+LAotICoJCSBEZW5pcyBKb3NlcGggQmFycm93LAotICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+Ci0jaW5jbHVkZSA8YXNtL3NpZ3AuaD4KLQotIwotIyBzdG9yZV9zdGF0dXMKLSMKLSMgUHJlcmVxdWlzaXRlcyB0byBydW4gdGhpcyBmdW5jdGlvbjoKLSMgLSBQcmVmaXggcmVnaXN0ZXIgaXMgc2V0IHRvIHplcm8KLSMgLSBPcmlnaW5hbCBwcmVmaXggcmVnaXN0ZXIgaXMgc3RvcmVkIGluICJkdW1wX3ByZWZpeF9wYWdlIgotIyAtIExvd2NvcmUgcHJvdGVjdGlvbiBpcyBvZmYKLSMKLUVOVFJZKHN0b3JlX3N0YXR1cykKLQkvKiBTYXZlIHJlZ2lzdGVyIG9uZSBhbmQgbG9hZCBzYXZlIGFyZWEgYmFzZSAqLwotCXN0ZwklcjEsX19MQ19TQVZFX0FSRUFfUkVTVEFSVAotCWxnaGkJJXIxLFNBVkVfQVJFQV9CQVNFCi0JLyogR2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyAqLwotCXN0bWcJJXIwLCVyMTUsX19MQ19HUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlsZwklcjIsX19MQ19TQVZFX0FSRUFfUkVTVEFSVAotCXN0ZwklcjIsX19MQ19HUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKzgoJXIxKQotCS8qIENvbnRyb2wgcmVnaXN0ZXJzICovCi0Jc3RjdGcJJWMwLCVjMTUsX19MQ19DUkVHU19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UoJXIxKQotCS8qIEFjY2VzcyByZWdpc3RlcnMgKi8KLQlzdGFtCSVhMCwlYTE1LF9fTENfQVJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQkvKiBGbG9hdGluZyBwb2ludCByZWdpc3RlcnMgKi8KLQlzdGQJJWYwLCAweDAwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWYxLCAweDA4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWYyLCAweDEwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWYzLCAweDE4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWY0LCAweDIwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWY1LCAweDI4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWY2LCAweDMwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWY3LCAweDM4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWY4LCAweDQwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWY5LCAweDQ4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWYxMCwweDUwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWYxMSwweDU4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWYxMiwweDYwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWYxMywweDY4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWYxNCwweDcwICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQlzdGQJJWYxNSwweDc4ICsgX19MQ19GUFJFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKLQkvKiBGbG9hdGluZyBwb2ludCBjb250cm9sIHJlZ2lzdGVyICovCi0Jc3RmcGMJX19MQ19GUF9DUkVHX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCi0JLyogQ1BVIHRpbWVyICovCi0Jc3RwdAlfX0xDX0NQVV9USU1FUl9TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UoJXIxKQotCS8qIFNhdmVkIHByZWZpeCByZWdpc3RlciAqLwotCWxhcmwJJXIyLGR1bXBfcHJlZml4X3BhZ2UKLQltdmMJX19MQ19QUkVGSVhfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKDQsJXIxKSwwKCVyMikKLQkvKiBDbG9jayBjb21wYXJhdG9yIC0gc2V2ZW4gYnl0ZXMgKi8KLQlsYXJsCSVyMiwuTGNsa2NtcAotCXN0Y2tjCTAoJXIyKQotCW12YwlfX0xDX0NMT0NLX0NPTVBfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFICsgMSg3LCVyMSksMSglcjIpCi0JLyogUHJvZ3JhbSBzdGF0dXMgd29yZCAqLwotCWVwc3cJJXIyLCVyMwotCXN0CSVyMixfX0xDX1BTV19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UgKyAwKCVyMSkKLQlzdAklcjMsX19MQ19QU1dfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFICsgNCglcjEpCi0JbGFybAklcjIsc3RvcmVfc3RhdHVzCi0Jc3RnCSVyMixfX0xDX1BTV19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UgKyA4KCVyMSkKLQlicgklcjE0Ci0KLQkuc2VjdGlvbiAuYnNzCi0JLmFsaWduCTgKLS5MY2xrY21wOgkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKLQkucHJldmlvdXMKLQotIwotIyBkb19yZWlwbF9hc20KLSMgUGFyYW1ldGVyOiByMiA9IHNjaGlkIG9mIHJlaXBsIGRldmljZQotIwotCi1FTlRSWShkb19yZWlwbF9hc20pCi0JCWJhc3IJJXIxMywwCi0uTHBnMDoJCWxwc3dlCS5MbmV3cHN3LS5McGcwKCVyMTMpCi0uTHBnMToJCWJyYXNsCSVyMTQsc3RvcmVfc3RhdHVzCi0KLQkJbGN0bGcJJWM2LCVjNiwuTGFsbC0uTHBnMCglcjEzKQotCQlsZ3IJJXIxLCVyMgotCQltdmMJX19MQ19QR01fTkVXX1BTVygxNiksLkxwY25ldy0uTHBnMCglcjEzKQotCQlzdHNjaAkuTHNjaGliLS5McGcwKCVyMTMpCi0JCW9pCS5Mc2NoaWIrNS0uTHBnMCglcjEzKSwweDg0Ci0uTGVjczogIAl4aQkuTHNjaGliKzI3LS5McGcwKCVyMTMpLDB4MDEKLQkJbXNjaAkuTHNjaGliLS5McGcwKCVyMTMpCi0JCWxnaGkJJXIwLDUKLS5Mc3NjaDoJCXNzY2gJLkxpcGxvcmItLkxwZzAoJXIxMykKLQkJanoJLkwwMDEKLQkJYnJjdAklcjAsLkxzc2NoCi0JCWJhcwklcjE0LC5MZGlzYWItLkxwZzAoJXIxMykKLS5MMDAxOgkJbXZjCV9fTENfSU9fTkVXX1BTVygxNiksLkxpb25ldy0uTHBnMCglcjEzKQotLkx0cGk6CQlscHN3ZQkuTHdhaXRwc3ctLkxwZzAoJXIxMykKLS5MY29udDoJCWMJJXIxLF9fTENfU1VCQ0hBTk5FTF9JRAotCQlqbnoJLkx0cGkKLQkJY2xjCV9fTENfSU9fSU5UX1BBUk0oNCksLkxpcGxvcmItLkxwZzAoJXIxMykKLQkJam56CS5MdHBpCi0JCXRzY2gJLkxpcGxpcmItLkxwZzAoJXIxMykKLQkJdG0JLkxpcGxpcmIrOS0uTHBnMCglcjEzKSwweGJmCi0JCWp6CS5MMDAyCi0JCWJhcwklcjE0LC5MZGlzYWItLkxwZzAoJXIxMykKLS5MMDAyOgkJdG0JLkxpcGxpcmIrOC0uTHBnMCglcjEzKSwweGYzCi0JCWp6CS5MMDAzCi0JCWJhcwklcjE0LC5MZGlzYWItLkxwZzAoJXIxMykKLS5MMDAzOgkJc3QJJXIxLF9fTENfU1VCQ0hBTk5FTF9JRAotCQlsaGkJJXIxLDAJCSAjIG1vZGUgMCA9IGVzYQotCQlzbHIJJXIwLCVyMCAJICMgc2V0IGNwdWlkIHRvIHplcm8KLQkJc2lncAklcjEsJXIwLFNJR1BfU0VUX0FSQ0hJVEVDVFVSRSAjIHN3aXRjaCB0byBlc2EgbW9kZQotCQlscHN3CTAKLS5MZGlzYWI6CXNsbAklcjE0LDEKLQkJc3JsCSVyMTQsMQkJICMgbmVlZCB0byBraWxsIGhpIGJpdCB0byBhdm9pZCBzcGVjaWZpY2F0aW9uIGV4Y2VwdGlvbnMuCi0JCXN0CSVyMTQsLkxkaXNwc3crMTItLkxwZzAoJXIxMykKLQkJbHBzd2UJLkxkaXNwc3ctLkxwZzAoJXIxMykKLQkJLmFsaWduCTgKLS5MYWxsOgkJLnF1YWQJMHgwMDAwMDAwMGZmMDAwMDAwCi0JCS5hbGlnbgkxNgotLyoKLSAqIFRoZXNlIGFkZHJlc3NlcyBoYXZlIHRvIGJlIDMxIGJpdCBvdGhlcndpc2UKLSAqIHRoZSBzaWdwIHdpbGwgdGhyb3cgYSBzcGVjaWZjYXRpb24gZXhjZXB0aW9uCi0gKiB3aGVuIHN3aXRjaGluZyB0byBFU0EgbW9kZSBhcyBiaXQgMzEgYmUgc2V0Ci0gKiBpbiB0aGUgRVNBIHBzdy4KLSAqIEJpdCAzMSBvZiB0aGUgYWRkcmVzc2VzIGhhcyB0byBiZSAwIGZvciB0aGUKLSAqIDMxYml0IGxwc3dlIGluc3RydWN0aW9uIGEgZmFjdCB0aGV5IGFwcGVhciB0byBoYXZlCi0gKiBvbWl0dGVkIGZyb20gdGhlIHBvcC4KLSAqLwotLkxuZXdwc3c6CS5xdWFkCTB4MDAwMDAwMDA4MDAwMDAwMAotCQkucXVhZAkuTHBnMQotLkxwY25ldzoJLnF1YWQJMHgwMDAwMDAwMDgwMDAwMDAwCi0JCS5xdWFkCS5MZWNzCi0uTGlvbmV3OgkucXVhZAkweDAwMDAwMDAwODAwMDAwMDAKLQkJLnF1YWQJLkxjb250Ci0uTHdhaXRwc3c6CS5xdWFkCTB4MDIwMjAwMDA4MDAwMDAwMAotCQkucXVhZAkuTHRwaQotLkxkaXNwc3c6CS5xdWFkCTB4MDAwMjAwMDA4MDAwMDAwMAotCQkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKLS5MaXBsY2N3czoJLmxvbmcJMHgwMjAwMDAwMCwweDYwMDAwMDE4Ci0JCS5sb25nCTB4MDgwMDAwMDgsMHgyMDAwMDAwMQotLkxpcGxvcmI6CS5sb25nCTB4MDA0OTUwNGMsMHgwMDQwZmY4MAotCQkubG9uZwkweDAwMDAwMDAwKy5MaXBsY2N3cwotLkxzY2hpYjoJLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwCi0JCS5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAotCQkubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAKLQkJLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwCi0JCS5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAotCQkubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAKLS5MaXBsaXJiOgkubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAKLQkJLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwCi0JCS5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAotCQkubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAKLQkJLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwCi0JCS5sb25nCTB4MDAwMDAwMDAsMHgwMDAwMDAwMAotCQkubG9uZwkweDAwMDAwMDAwLDB4MDAwMDAwMDAKLQkJLmxvbmcJMHgwMDAwMDAwMCwweDAwMDAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwppbmRleCBmNGU2ZjIwLi5jZmFjMjgzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKQEAgLTE5LDcgKzE5LDggQEAKICAqICVyNyA9IFBBR0VfU0laRQogICogJXI4IGhvbGRzIHRoZSBzb3VyY2UgYWRkcmVzcwogICogJXI5ID0gUEFHRV9TSVpFCi0gKiAlcjEwIGlzIGEgcGFnZSBtYXNrCisgKgorICogMHhmMDAwIGlzIGEgcGFnZV9tYXNrCiAgKi8KIAogCS50ZXh0CkBAIC0yNyw0NiArMjgsNDcgQEAKIAkJYmFzcgklcjEzLDAJCSMgYmFzZSBhZGRyZXNzCiAJLmJhc2U6CiAJCXN0bnNtCXN5c19tc2stLmJhc2UoJXIxMyksMHhmYgkjIGRpc2FibGUgREFUCi0JCXN0Y3RsCSVjMCwlYzE1LGN0bHJlZ3MtLmJhc2UoJXIxMykKLQkJc3RtCSVyMCwlcjE1LGdwcnJlZ3MtLmJhc2UoJXIxMykKKwkJc3RjdGcJJWMwLCVjMTUsY3RscmVncy0uYmFzZSglcjEzKQorCQlzdG1nCSVyMCwlcjE1LGdwcnJlZ3MtLmJhc2UoJXIxMykKKwkJbGdoaQklcjAsMworCQlzbGxnCSVyMCwlcjAsMzEKKwkJc3RnCSVyMCwweDFkMCglcjApCisJCWxhCSVyMCwuYmFja19wZ20tLmJhc2UoJXIxMykKKwkJc3RnCSVyMCwweDFkOCglcjApCiAJCWxhCSVyMSxsb2FkX3Bzdy0uYmFzZSglcjEzKQogCQltdmMJMCg4LCVyMCksMCglcjEpCiAJCWxhCSVyMCwuYmFjay0uYmFzZSglcjEzKQogCQlzdAklcjAsNCglcjApCiAJCW9pCTQoJXIwKSwweDgwCi0JCW12YwkweDY4KDgsJXIwKSwwKCVyMSkKLQkJbGEJJXIwLC5iYWNrX3BnbS0uYmFzZSglcjEzKQotCQlzdAklcjAsMHg2YyglcjApCi0JCW9pCTB4NmMoJXIwKSwweDgwCi0JCWxoaQklcjAsMAorCQlsZ2hpCSVyMCwwCiAJCWRpYWcJJXIwLCVyMCwweDMwOAogCS5iYWNrOgorCQlsaGkJJXIxLDEJCSMgbW9kZSAxID0gZXNhbWUKKwkJc2lncAklcjEsJXIwLFNJR1BfU0VUX0FSQ0hJVEVDVFVSRSAjIHN3aXRjaCB0byBlc2FtZSBtb2RlCisJCXNhbTY0CQkJIyBzd2l0Y2ggdG8gNjQgYml0IGFkZHJlc3NpbmcgbW9kZQogCQliYXNyCSVyMTMsMAogCS5iYWNrX2Jhc2U6CiAJCW9pCWhhdmVfZGlhZzMwOC0uYmFja19iYXNlKCVyMTMpLDB4MDEKLQkJbGN0bAklYzAsJWMxNSxjdGxyZWdzLS5iYWNrX2Jhc2UoJXIxMykKLQkJbG0JJXIwLCVyMTUsZ3BycmVncy0uYmFja19iYXNlKCVyMTMpCi0JCWoJLnN0YXJ0X3JlbG9jCisJCWxjdGxnCSVjMCwlYzE1LGN0bHJlZ3MtLmJhY2tfYmFzZSglcjEzKQorCQlsbWcJJXIwLCVyMTUsZ3BycmVncy0uYmFja19iYXNlKCVyMTMpCisJCWoJLnRvcAogCS5iYWNrX3BnbToKLQkJbG0JJXIwLCVyMTUsZ3BycmVncy0uYmFzZSglcjEzKQotCS5zdGFydF9yZWxvYzoKLQkJbGhpCSVyMTAsLTEJCSMgcHJlcGFyaW5nIHRoZSBtYXNrCi0JCXNsbAklcjEwLDEyCQkjIHNoaWZ0IGl0IHN1Y2ggdGhhdCBpdCBiZWNvbWVzIDB4ZjAwMAorCQlsbWcJJXIwLCVyMTUsZ3BycmVncy0uYmFzZSglcjEzKQogCS50b3A6Ci0JCWxoaQklcjcsNDA5NgkjIGxvYWQgUEFHRV9TSVpFIGluIHI3Ci0JCWxoaQklcjksNDA5NgkjIGxvYWQgUEFHRV9TSVpFIGluIHI5Ci0JCWwJJXI1LDAoJXIyKQkjIHJlYWQgYW5vdGhlciB3b3JkIGZvciBpbmRpcmVjdGlvbiBwYWdlCi0JCWFoaQklcjIsNAkJIyBpbmNyZW1lbnQgcG9pbnRlcgorCQlsZ2hpCSVyNyw0MDk2CSMgbG9hZCBQQUdFX1NJWkUgaW4gcjcKKwkJbGdoaQklcjksNDA5NgkjIGxvYWQgUEFHRV9TSVpFIGluIHI5CisJCWxnCSVyNSwwKCVyMikJIyByZWFkIGFub3RoZXIgd29yZCBmb3IgaW5kaXJlY3Rpb24gcGFnZQorCQlhZ2hpCSVyMiw4CQkjIGluY3JlbWVudCBwb2ludGVyCiAJCXRtbAklcjUsMHgxCQkjIGlzIGl0IGEgZGVzdGluYXRpb24gcGFnZT8KIAkJamUJLmluZGlyX2NoZWNrCSMgTk8sIGdvdG8gImluZGlyX2NoZWNrIgotCQlscgklcjYsJXI1CQkjIHI2ID0gcjUKLQkJbnIJJXI2LCVyMTAJIyBtYXNrIGl0IG91dCBhbmQuLi4KKwkJbGdyCSVyNiwlcjUJCSMgcjYgPSByNQorCQluaWxsCSVyNiwweGYwMDAJIyBtYXNrIGl0IG91dCBhbmQuLi4KIAkJagkudG9wCQkjIC4uLm5leHQgaXRlcmF0aW9uCiAJLmluZGlyX2NoZWNrOgogCQl0bWwJJXI1LDB4MgkJIyBpcyBpdCBhIGluZGlyZWN0aW9uIHBhZ2U/CiAJCWplCS5kb25lX3Rlc3QJIyBOTywgZ290byAiZG9uZV90ZXN0IgotCQlucgklcjUsJXIxMAkjIFlFUywgbWFzayBvdXQsCi0JCWxyCSVyMiwlcjUJCSMgbW92ZSBpdCBpbnRvIHRoZSByaWdodCByZWdpc3RlciwKKwkJbmlsbAklcjUsMHhmMDAwCSMgWUVTLCBtYXNrIG91dCwKKwkJbGdyCSVyMiwlcjUJCSMgbW92ZSBpdCBpbnRvIHRoZSByaWdodCByZWdpc3RlciwKIAkJagkudG9wCQkjIGFuZCByZWFkIG5leHQuLi4KIAkuZG9uZV90ZXN0OgogCQl0bWwJJXI1LDB4NAkJIyBpcyBpdCB0aGUgZG9uZSBpbmRpY2F0b3I/CkBAIC03NSwxMyArNzcsMTMgQEAKIAkuc291cmNlX3Rlc3Q6CiAJCXRtbAklcjUsMHg4CQkjIGl0IHNob3VsZCBiZSBhIHNvdXJjZSBpbmRpY2F0b3IuLi4KIAkJamUJLnRvcAkJIyBOTywgaWdub3JlIGl0Li4uCi0JCWxyCSVyOCwlcjUJCSMgcjggPSByNQotCQlucgklcjgsJXIxMAkjIG1hc2tpbmcKKwkJbGdyCSVyOCwlcjUJCSMgcjggPSByNQorCQluaWxsCSVyOCwweGYwMDAJIyBtYXNraW5nCiAJMDoJbXZjbGUJJXI2LCVyOCwweDAJIyBjb3B5IFBBR0VfU0laRSBieXRlcyBmcm9tIHI4IHRvIHI2IC0gcGFkIHdpdGggMAogCQlqbwkwYgogCQlqCS50b3AKIAkuZG9uZToKLQkJc3IJJXIwLCVyMAkJIyBjbGVhciByZWdpc3RlciByMAorCQlzZ3IJJXIwLCVyMAkJIyBjbGVhciByZWdpc3RlciByMAogCQlsYQklcjQsbG9hZF9wc3ctLmJhc2UoJXIxMykJIyBsb2FkIHBzdy1hZGRyZXNzIGludG8gdGhlIHJlZ2lzdGVyCiAJCW8JJXIzLDQoJXI0KQkjIG9yIGxvYWQgYWRkcmVzcyBpbnRvIHBzdwogCQlzdAklcjMsNCglcjQpCkBAIC05MCw4ICs5Miw5IEBACiAJCWpubwkubm9fZGlhZzMwOAogCQlkaWFnCSVyMCwlcjAsMHgzMDgKIAkubm9fZGlhZzMwODoKLQkJc3IJJXIxLCVyMQkJIyBjbGVhciAlcjEKLQkJc3IJJXIyLCVyMgkJIyBjbGVhciAlcjIKKwkJc2FtMzEJCQkjIDMxIGJpdCBtb2RlCisJCXNyCSVyMSwlcjEJCSMgZXJhc2UgcmVnaXN0ZXIgcjEKKwkJc3IJJXIyLCVyMgkJIyBlcmFzZSByZWdpc3RlciByMgogCQlzaWdwCSVyMSwlcjIsU0lHUF9TRVRfQVJDSElURUNUVVJFICMgc2V0IGNwdWlkIHRvIHplcm8KIAkJbHBzdwkwCQkjIGhvcGVmdWxseSBzdGFydCBuZXcga2VybmVsLi4uCiAKQEAgLTEwMiwxMSArMTA1LDExIEBACiAJCS5xdWFkCTAKIAljdGxyZWdzOgogCQkucmVwdAkxNgotCQkubG9uZwkwCisJCS5xdWFkCTAKIAkJLmVuZHIKIAlncHJyZWdzOgogCQkucmVwdAkxNgotCQkubG9uZwkwCisJCS5xdWFkCTAKIAkJLmVuZHIKIAloYXZlX2RpYWczMDg6CiAJCS5ieXRlCTAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsNjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvcmVsb2NhdGVfa2VybmVsNjQuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZhYzI4My4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3JlbG9jYXRlX2tlcm5lbDY0LlMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNQotICoKLSAqIEF1dGhvcihzKTogUm9sZiBBZGVsc2JlcmdlciwKLSAqCSAgICAgIEhlaWtvIENhcnN0ZW5zIDxoZWlrby5jYXJzdGVuc0BkZS5pYm0uY29tPgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGFzbS9zaWdwLmg+Ci0KLS8qCi0gKiBtb3ZlcyB0aGUgbmV3IGtlcm5lbCB0byBpdHMgZGVzdGluYXRpb24uLi4KLSAqICVyMiA9IHBvaW50ZXIgdG8gZmlyc3Qga2ltYWdlX2VudHJ5X3QKLSAqICVyMyA9IHN0YXJ0IGFkZHJlc3MgLSB3aGVyZSB0byBqdW1wIHRvIGFmdGVyIHRoZSBqb2IgaXMgZG9uZS4uLgotICoKLSAqICVyNSB3aWxsIGJlIHVzZWQgYXMgdGVtcC4gc3RvcmFnZQotICogJXI2IGhvbGRzIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzCi0gKiAlcjcgPSBQQUdFX1NJWkUKLSAqICVyOCBob2xkcyB0aGUgc291cmNlIGFkZHJlc3MKLSAqICVyOSA9IFBBR0VfU0laRQotICoKLSAqIDB4ZjAwMCBpcyBhIHBhZ2VfbWFzawotICovCi0KLQkudGV4dAotRU5UUlkocmVsb2NhdGVfa2VybmVsKQotCQliYXNyCSVyMTMsMAkJIyBiYXNlIGFkZHJlc3MKLQkuYmFzZToKLQkJc3Ruc20Jc3lzX21zay0uYmFzZSglcjEzKSwweGZiCSMgZGlzYWJsZSBEQVQKLQkJc3RjdGcJJWMwLCVjMTUsY3RscmVncy0uYmFzZSglcjEzKQotCQlzdG1nCSVyMCwlcjE1LGdwcnJlZ3MtLmJhc2UoJXIxMykKLQkJbGdoaQklcjAsMwotCQlzbGxnCSVyMCwlcjAsMzEKLQkJc3RnCSVyMCwweDFkMCglcjApCi0JCWxhCSVyMCwuYmFja19wZ20tLmJhc2UoJXIxMykKLQkJc3RnCSVyMCwweDFkOCglcjApCi0JCWxhCSVyMSxsb2FkX3Bzdy0uYmFzZSglcjEzKQotCQltdmMJMCg4LCVyMCksMCglcjEpCi0JCWxhCSVyMCwuYmFjay0uYmFzZSglcjEzKQotCQlzdAklcjAsNCglcjApCi0JCW9pCTQoJXIwKSwweDgwCi0JCWxnaGkJJXIwLDAKLQkJZGlhZwklcjAsJXIwLDB4MzA4Ci0JLmJhY2s6Ci0JCWxoaQklcjEsMQkJIyBtb2RlIDEgPSBlc2FtZQotCQlzaWdwCSVyMSwlcjAsU0lHUF9TRVRfQVJDSElURUNUVVJFICMgc3dpdGNoIHRvIGVzYW1lIG1vZGUKLQkJc2FtNjQJCQkjIHN3aXRjaCB0byA2NCBiaXQgYWRkcmVzc2luZyBtb2RlCi0JCWJhc3IJJXIxMywwCi0JLmJhY2tfYmFzZToKLQkJb2kJaGF2ZV9kaWFnMzA4LS5iYWNrX2Jhc2UoJXIxMyksMHgwMQotCQlsY3RsZwklYzAsJWMxNSxjdGxyZWdzLS5iYWNrX2Jhc2UoJXIxMykKLQkJbG1nCSVyMCwlcjE1LGdwcnJlZ3MtLmJhY2tfYmFzZSglcjEzKQotCQlqCS50b3AKLQkuYmFja19wZ206Ci0JCWxtZwklcjAsJXIxNSxncHJyZWdzLS5iYXNlKCVyMTMpCi0JLnRvcDoKLQkJbGdoaQklcjcsNDA5NgkjIGxvYWQgUEFHRV9TSVpFIGluIHI3Ci0JCWxnaGkJJXI5LDQwOTYJIyBsb2FkIFBBR0VfU0laRSBpbiByOQotCQlsZwklcjUsMCglcjIpCSMgcmVhZCBhbm90aGVyIHdvcmQgZm9yIGluZGlyZWN0aW9uIHBhZ2UKLQkJYWdoaQklcjIsOAkJIyBpbmNyZW1lbnQgcG9pbnRlcgotCQl0bWwJJXI1LDB4MQkJIyBpcyBpdCBhIGRlc3RpbmF0aW9uIHBhZ2U/Ci0JCWplCS5pbmRpcl9jaGVjawkjIE5PLCBnb3RvICJpbmRpcl9jaGVjayIKLQkJbGdyCSVyNiwlcjUJCSMgcjYgPSByNQotCQluaWxsCSVyNiwweGYwMDAJIyBtYXNrIGl0IG91dCBhbmQuLi4KLQkJagkudG9wCQkjIC4uLm5leHQgaXRlcmF0aW9uCi0JLmluZGlyX2NoZWNrOgotCQl0bWwJJXI1LDB4MgkJIyBpcyBpdCBhIGluZGlyZWN0aW9uIHBhZ2U/Ci0JCWplCS5kb25lX3Rlc3QJIyBOTywgZ290byAiZG9uZV90ZXN0IgotCQluaWxsCSVyNSwweGYwMDAJIyBZRVMsIG1hc2sgb3V0LAotCQlsZ3IJJXIyLCVyNQkJIyBtb3ZlIGl0IGludG8gdGhlIHJpZ2h0IHJlZ2lzdGVyLAotCQlqCS50b3AJCSMgYW5kIHJlYWQgbmV4dC4uLgotCS5kb25lX3Rlc3Q6Ci0JCXRtbAklcjUsMHg0CQkjIGlzIGl0IHRoZSBkb25lIGluZGljYXRvcj8KLQkJamUJLnNvdXJjZV90ZXN0CSMgTk8hIFdlbGwsIHRoZW4gaXQgc2hvdWxkIGJlIHRoZSBzb3VyY2UgaW5kaWNhdG9yLi4uCi0JCWoJLmRvbmUJCSMgb2ssIGxldHMgZmluaXNoIGl0IGhlcmUuLi4KLQkuc291cmNlX3Rlc3Q6Ci0JCXRtbAklcjUsMHg4CQkjIGl0IHNob3VsZCBiZSBhIHNvdXJjZSBpbmRpY2F0b3IuLi4KLQkJamUJLnRvcAkJIyBOTywgaWdub3JlIGl0Li4uCi0JCWxncgklcjgsJXI1CQkjIHI4ID0gcjUKLQkJbmlsbAklcjgsMHhmMDAwCSMgbWFza2luZwotCTA6CW12Y2xlCSVyNiwlcjgsMHgwCSMgY29weSBQQUdFX1NJWkUgYnl0ZXMgZnJvbSByOCB0byByNiAtIHBhZCB3aXRoIDAKLQkJam8JMGIKLQkJagkudG9wCi0JLmRvbmU6Ci0JCXNncgklcjAsJXIwCQkjIGNsZWFyIHJlZ2lzdGVyIHIwCi0JCWxhCSVyNCxsb2FkX3Bzdy0uYmFzZSglcjEzKQkjIGxvYWQgcHN3LWFkZHJlc3MgaW50byB0aGUgcmVnaXN0ZXIKLQkJbwklcjMsNCglcjQpCSMgb3IgbG9hZCBhZGRyZXNzIGludG8gcHN3Ci0JCXN0CSVyMyw0KCVyNCkKLQkJbXZjCTAoOCwlcjApLDAoJXI0KQkjIGNvcHkgcHN3IHRvIGFic29sdXRlIGFkZHJlc3MgMAotCQl0bQloYXZlX2RpYWczMDgtLmJhc2UoJXIxMyksMHgwMQotCQlqbm8JLm5vX2RpYWczMDgKLQkJZGlhZwklcjAsJXIwLDB4MzA4Ci0JLm5vX2RpYWczMDg6Ci0JCXNhbTMxCQkJIyAzMSBiaXQgbW9kZQotCQlzcgklcjEsJXIxCQkjIGVyYXNlIHJlZ2lzdGVyIHIxCi0JCXNyCSVyMiwlcjIJCSMgZXJhc2UgcmVnaXN0ZXIgcjIKLQkJc2lncAklcjEsJXIyLFNJR1BfU0VUX0FSQ0hJVEVDVFVSRSAjIHNldCBjcHVpZCB0byB6ZXJvCi0JCWxwc3cJMAkJIyBob3BlZnVsbHkgc3RhcnQgbmV3IGtlcm5lbC4uLgotCi0JCS5hbGlnbgk4Ci0JbG9hZF9wc3c6Ci0JCS5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMAotCXN5c19tc2s6Ci0JCS5xdWFkCTAKLQljdGxyZWdzOgotCQkucmVwdAkxNgotCQkucXVhZAkwCi0JCS5lbmRyCi0JZ3BycmVnczoKLQkJLnJlcHQJMTYKLQkJLnF1YWQJMAotCQkuZW5kcgotCWhhdmVfZGlhZzMwODoKLQkJLmJ5dGUJMAotCQkuYWxpZ24JOAotCXJlbG9jYXRlX2tlcm5lbF9lbmQ6Ci0JLmFsaWduIDgKLQkuZ2xvYmwJcmVsb2NhdGVfa2VybmVsX2xlbgotCXJlbG9jYXRlX2tlcm5lbF9sZW46Ci0JCS5xdWFkCXJlbG9jYXRlX2tlcm5lbF9lbmQgLSByZWxvY2F0ZV9rZXJuZWwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2NscC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9zY2xwLlMKaW5kZXggN2U3N2UwMy4uNDNjMzE2OSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zY2xwLlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zY2xwLlMKQEAgLTM2LDIxICszNiwxNyBAQAogCWFoaQklcjE1LC05NgkJCSMgY3JlYXRlIHN0YWNrIGZyYW1lCiAJbGEJJXI4LExDX0VYVF9ORVdfUFNXCQkjIHJlZ2lzdGVyIGludCBoYW5kbGVyCiAJbGEJJXI5LC5MZXh0cHN3UzEtLkxiYXNlUzEoJXIxMykKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl0bQlMQ19BUl9NT0RFX0lELDEKIAlqbm8JLkxlc2ExCiAJbGEJJXI4LExDX0VYVF9ORVdfUFNXXzY0CQkjIHJlZ2lzdGVyIGludCBoYW5kbGVyIDY0IGJpdAogCWxhCSVyOSwuTGV4dHBzd1MxXzY0LS5MYmFzZVMxKCVyMTMpCiAuTGVzYTE6Ci0jZW5kaWYKIAltdmMJLkxvbGRwc3dTMS0uTGJhc2VTMSgxNiwlcjEzKSwwKCVyOCkKIAltdmMJMCgxNiwlcjgpLDAoJXI5KQotI2lmZGVmIENPTkZJR182NEJJVAogCWVwc3cJJXI2LCVyNwkJCQkjIHNldCBjdXJyZW50IGFkZHJlc3NpbmcgbW9kZQogCW5pbGwJJXI2LDB4MQkJCQkjIGluIG5ldyBwc3cgKDMxIG9yIDY0IGJpdCBtb2RlKQogCW5pbGgJJXI3LDB4ODAwMAogCXN0bQklcjYsJXI3LDAoJXI4KQotI2VuZGlmCiAJbGhpCSVyNiwweDAyMDAJCQkjIGNyIG1hc2sgZm9yIGV4dCBpbnQgKGNyMC41NCkKIAlsdHIJJXIyLCVyMgogCWp6CS5Mc2V0Y3RTMQpAQCAtOTIsMTAgKzg4LDggQEAKIAkubG9uZwkwLCAwLCAwLCAwCQkJIyBvbGQgZXh0IGludCBQU1cKIC5MZXh0cHN3UzE6CiAJLmxvbmcJMHgwMDA4MDAwMCwgMHg4MDAwMDAwMCsuTHdhaXRTMQkjIFBTVyB0byBoYW5kbGUgZXh0IGludAotI2lmZGVmIENPTkZJR182NEJJVAogLkxleHRwc3dTMV82NDoKIAkucXVhZAkwLCAuTHdhaXRTMQkJCSMgUFNXIHRvIGhhbmRsZSBleHQgaW50LCA2NCBiaXQKLSNlbmRpZgogLkx3YWl0cHN3UzE6CiAJLmxvbmcJMHgwMTBhMDAwMCwgMHgwMDAwMDAwMCsuTGxvb3BTMQkjIFBTVyB0byB3YWl0IGZvciBleHQgaW50CiAuTHRpbWVTMToKQEAgLTI3MiwxMyArMjY2LDExIEBACiBFTlRSWShfc2NscF9wcmludF9lYXJseSkKIAlzdG0JJXI2LCVyMTUsMjQoJXIxNSkJCSMgc2F2ZSByZWdpc3RlcnMKIAlhaGkJJXIxNSwtOTYJCQkjIGNyZWF0ZSBzdGFjayBmcmFtZQotI2lmZGVmIENPTkZJR182NEJJVAogCXRtCUxDX0FSX01PREVfSUQsMQogCWpubwkuTGVzYTIKIAlhaGkJJXIxNSwtODAKIAlzdG1oCSVyNiwlcjE1LDk2KCVyMTUpCQkjIHN0b3JlIHVwcGVyIHJlZ2lzdGVyIGhhbHZlcwogLkxlc2EyOgotI2VuZGlmCiAJbHIJJXIxMCwlcjIJCQkjIHNhdmUgc3RyaW5nIHBvaW50ZXIKIAlsaGkJJXIyLDAKIAlicmFzCSVyMTQsX3NjbHBfc2V0dXAJCSMgZW5hYmxlIGNvbnNvbGUKQEAgLTI5MSwxNCArMjgzLDEyIEBACiAJbGhpCSVyMiwxCiAJYnJhcwklcjE0LF9zY2xwX3NldHVwCQkjIGRpc2FibGUgY29uc29sZQogLkxlbmRTNToKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl0bQlMQ19BUl9NT0RFX0lELDEKIAlqbm8JLkxlc2EzCiAJbGdmcgklcjIsJXIyCQkJCSMgc2lnbiBleHRlbmQgcmV0dXJuIHZhbHVlCiAJbG1oCSVyNiwlcjE1LDk2KCVyMTUpCQkjIHJlc3RvcmUgdXBwZXIgcmVnaXN0ZXIgaGFsdmVzCiAJYWhpCSVyMTUsODAKIC5MZXNhMzoKLSNlbmRpZgogCWxtCSVyNiwlcjE1LDEyMCglcjE1KQkJIyByZXN0b3JlIHJlZ2lzdGVycwogCWJyCSVyMTQKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCmluZGV4IGE1ZWE4YmMuLjcyNjJmZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKQEAgLTkyLDEwICs5Miw4IEBACiBzdHJ1Y3QgcGFnZSAqdm1lbW1hcDsKIEVYUE9SVF9TWU1CT0wodm1lbW1hcCk7CiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKIHVuc2lnbmVkIGxvbmcgTU9EVUxFU19WQUREUjsKIHVuc2lnbmVkIGxvbmcgTU9EVUxFU19FTkQ7Ci0jZW5kaWYKIAogLyogQW4gYXJyYXkgd2l0aCBhIHBvaW50ZXIgdG8gdGhlIGxvd2NvcmUgb2YgZXZlcnkgQ1BVLiAqLwogc3RydWN0IF9sb3djb3JlICpsb3djb3JlX3B0cltOUl9DUFVTXTsKQEAgLTMzNCwxOSArMzMyLDEwIEBACiAJbGMtPnN0ZmxfZmFjX2xpc3QgPSBTMzkwX2xvd2NvcmUuc3RmbF9mYWNfbGlzdDsKIAltZW1jcHkobGMtPnN0ZmxlX2ZhY19saXN0LCBTMzkwX2xvd2NvcmUuc3RmbGVfZmFjX2xpc3QsCiAJICAgICAgIE1BWF9GQUNJTElUWV9CSVQvOCk7Ci0jaWZuZGVmIENPTkZJR182NEJJVAotCWlmIChNQUNISU5FX0hBU19JRUVFKSB7Ci0JCWxjLT5leHRlbmRlZF9zYXZlX2FyZWFfYWRkciA9IChfX3UzMikKLQkJCV9fYWxsb2NfYm9vdG1lbV9sb3coUEFHRV9TSVpFLCBQQUdFX1NJWkUsIDApOwotCQkvKiBlbmFibGUgZXh0ZW5kZWQgc2F2ZSBhcmVhICovCi0JCV9fY3RsX3NldF9iaXQoMTQsIDI5KTsKLQl9Ci0jZWxzZQogCWlmIChNQUNISU5FX0hBU19WWCkKIAkJbGMtPnZlY3Rvcl9zYXZlX2FyZWFfYWRkciA9CiAJCQkodW5zaWduZWQgbG9uZykgJmxjLT52ZWN0b3Jfc2F2ZV9hcmVhOwogCWxjLT52ZHNvX3Blcl9jcHVfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmbGMtPnBhc3RlWzBdOwotI2VuZGlmCiAJbGMtPnN5bmNfZW50ZXJfdGltZXIgPSBTMzkwX2xvd2NvcmUuc3luY19lbnRlcl90aW1lcjsKIAlsYy0+YXN5bmNfZW50ZXJfdGltZXIgPSBTMzkwX2xvd2NvcmUuYXN5bmNfZW50ZXJfdGltZXI7CiAJbGMtPmV4aXRfdGltZXIgPSBTMzkwX2xvd2NvcmUuZXhpdF90aW1lcjsKQEAgLTQ1MCw3ICs0MzksNiBAQAogCXVuc2lnbmVkIGxvbmcgdm1heCwgdm1hbGxvY19zaXplLCB0bXA7CiAKIAkvKiBDaG9vc2Uga2VybmVsIGFkZHJlc3Mgc3BhY2UgbGF5b3V0OiAyLCAzLCBvciA0IGxldmVscy4gKi8KLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl2bWFsbG9jX3NpemUgPSBWTUFMTE9DX0VORCA/OiAoMTI4VUwgPDwgMzApIC0gTU9EVUxFU19MRU47CiAJdG1wID0gKG1lbW9yeV9lbmQgPzogbWF4X3BoeXNtZW1fZW5kKSAvIFBBR0VfU0laRTsKIAl0bXAgPSB0bXAgKiAoc2l6ZW9mKHN0cnVjdCBwYWdlKSArIFBBR0VfU0laRSk7CkBAIC00NjIsMTIgKzQ1MCw2IEBACiAJTU9EVUxFU19FTkQgPSB2bWF4OwogCU1PRFVMRVNfVkFERFIgPSBNT0RVTEVTX0VORCAtIE1PRFVMRVNfTEVOOwogCVZNQUxMT0NfRU5EID0gTU9EVUxFU19WQUREUjsKLSNlbHNlCi0Jdm1hbGxvY19zaXplID0gVk1BTExPQ19FTkQgPzogOTZVTCA8PCAyMDsKLQl2bWF4ID0gMVVMIDw8IDMxOwkJLyogMi1sZXZlbCBrZXJuZWwgcGFnZSB0YWJsZSAqLwotCS8qIHZtYWxsb2MgYXJlYSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBrZXJuZWwgYWRkcmVzcyBzcGFjZS4gKi8KLQlWTUFMTE9DX0VORCA9IHZtYXg7Ci0jZW5kaWYKIAlWTUFMTE9DX1NUQVJUID0gdm1heCAtIHZtYWxsb2Nfc2l6ZTsKIAogCS8qIFNwbGl0IHJlbWFpbmluZyB2aXJ0dWFsIHNwYWNlIGJldHdlZW4gMToxIG1hcHBpbmcgJiB2bWVtbWFwIGFycmF5ICovCkBAIC03NTQsNyArNzM2LDYgQEAKIAlpZiAoTUFDSElORV9IQVNfSFBBR0UpCiAJCWVsZl9od2NhcCB8PSBIV0NBUF9TMzkwX0hQQUdFOwogCi0jaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpCiAJLyoKIAkgKiA2NC1iaXQgcmVnaXN0ZXIgc3VwcG9ydCBmb3IgMzEtYml0IHByb2Nlc3NlcwogCSAqIEhXQ0FQX1MzOTBfSElHSF9HUFJTIGlzIGJpdCA5LgpAQCAtNzcyLDIyICs3NTMsMTUgQEAKIAkgKi8KIAlpZiAodGVzdF9mYWNpbGl0eSgxMjkpKQogCQllbGZfaHdjYXAgfD0gSFdDQVBfUzM5MF9WWFJTOwotI2VuZGlmCi0KIAlnZXRfY3B1X2lkKCZjcHVfaWQpOwogCWFkZF9kZXZpY2VfcmFuZG9tbmVzcygmY3B1X2lkLCBzaXplb2YoY3B1X2lkKSk7CiAJc3dpdGNoIChjcHVfaWQubWFjaGluZSkgewogCWNhc2UgMHg5NjcyOgotI2lmICFkZWZpbmVkKENPTkZJR182NEJJVCkKLQlkZWZhdWx0OgkvKiBVc2UgImc1IiBhcyBkZWZhdWx0IGZvciAzMSBiaXQga2VybmVscy4gKi8KLSNlbmRpZgogCQlzdHJjcHkoZWxmX3BsYXRmb3JtLCAiZzUiKTsKIAkJYnJlYWs7CiAJY2FzZSAweDIwNjQ6CiAJY2FzZSAweDIwNjY6Ci0jaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpCiAJZGVmYXVsdDoJLyogVXNlICJ6OTAwIiBhcyBkZWZhdWx0IGZvciA2NCBiaXQga2VybmVscy4gKi8KLSNlbmRpZgogCQlzdHJjcHkoZWxmX3BsYXRmb3JtLCAiejkwMCIpOwogCQlicmVhazsKIAljYXNlIDB4MjA4NDoKQEAgLTgzOSwxOSArODEzLDYgQEAKICAgICAgICAgLyoKICAgICAgICAgICogcHJpbnQgd2hhdCBoZWFkLlMgaGFzIGZvdW5kIG91dCBhYm91dCB0aGUgbWFjaGluZQogICAgICAgICAgKi8KLSNpZm5kZWYgQ09ORklHXzY0QklUCi0JaWYgKE1BQ0hJTkVfSVNfVk0pCi0JCXByX2luZm8oIkxpbnV4IGlzIHJ1bm5pbmcgYXMgYSB6L1ZNICIKLQkJCSJndWVzdCBvcGVyYXRpbmcgc3lzdGVtIGluIDMxLWJpdCBtb2RlXG4iKTsKLQllbHNlIGlmIChNQUNISU5FX0lTX0xQQVIpCi0JCXByX2luZm8oIkxpbnV4IGlzIHJ1bm5pbmcgbmF0aXZlbHkgaW4gMzEtYml0IG1vZGVcbiIpOwotCWlmIChNQUNISU5FX0hBU19JRUVFKQotCQlwcl9pbmZvKCJUaGUgaGFyZHdhcmUgc3lzdGVtIGhhcyBJRUVFIGNvbXBhdGlibGUgIgotCQkJImZsb2F0aW5nIHBvaW50IHVuaXRzXG4iKTsKLQllbHNlCi0JCXByX2luZm8oIlRoZSBoYXJkd2FyZSBzeXN0ZW0gaGFzIG5vIElFRUUgY29tcGF0aWJsZSAiCi0JCQkiZmxvYXRpbmcgcG9pbnQgdW5pdHNcbiIpOwotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAJaWYgKE1BQ0hJTkVfSVNfVk0pCiAJCXByX2luZm8oIkxpbnV4IGlzIHJ1bm5pbmcgYXMgYSB6L1ZNICIKIAkJCSJndWVzdCBvcGVyYXRpbmcgc3lzdGVtIGluIDY0LWJpdCBtb2RlXG4iKTsKQEAgLTg1OSw3ICs4MjAsNiBAQAogCQlwcl9pbmZvKCJMaW51eCBpcyBydW5uaW5nIHVuZGVyIEtWTSBpbiA2NC1iaXQgbW9kZVxuIik7CiAJZWxzZSBpZiAoTUFDSElORV9JU19MUEFSKQogCQlwcl9pbmZvKCJMaW51eCBpcyBydW5uaW5nIG5hdGl2ZWx5IGluIDY0LWJpdCBtb2RlXG4iKTsKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAogCS8qIEhhdmUgb25lIGNvbW1hbmQgbGluZSB0aGF0IGlzIHBhcnNlZCBhbmQgc2F2ZWQgaW4gL3Byb2MvY21kbGluZSAqLwogCS8qIGJvb3RfY29tbWFuZF9saW5lIGhhcyBiZWVuIGFscmVhZHkgc2V0IHVwIGluIGVhcmx5LmMgKi8KQEAgLTkzMCwzNSArODkwLDMgQEAKIAkvKiBBZGQgc3lzdGVtIHNwZWNpZmljIGRhdGEgdG8gdGhlIHJhbmRvbSBwb29sICovCiAJc2V0dXBfcmFuZG9tbmVzcygpOwogfQotCi0jaWZkZWYgQ09ORklHXzMyQklUCi1zdGF0aWMgaW50IG5vX3JlbW92YWxfd2FybmluZyBfX2luaXRkYXRhOwotCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV9ub19yZW1vdmFsX3dhcm5pbmcoY2hhciAqc3RyKQotewotCW5vX3JlbW92YWxfd2FybmluZyA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci1fX3NldHVwKCJub19yZW1vdmFsX3dhcm5pbmciLCBwYXJzZV9ub19yZW1vdmFsX3dhcm5pbmcpOwotCi1zdGF0aWMgaW50IF9faW5pdCByZW1vdmFsX3dhcm5pbmcodm9pZCkKLXsKLQlpZiAobm9fcmVtb3ZhbF93YXJuaW5nKQotCQlyZXR1cm4gMDsKLQlwcmludGsoS0VSTl9BTEVSVCAiXG5cbiIpOwotCXByaW50ayhLRVJOX0NPTlQgIldhcm5pbmcgLSB5b3UgYXJlIHVzaW5nIGEgMzEgYml0IGtlcm5lbCFcblxuIik7Ci0JcHJpbnRrKEtFUk5fQ09OVCAiV2UgcGxhbiB0byByZW1vdmUgMzEgYml0IGtlcm5lbCBzdXBwb3J0IGZyb20gdGhlIGtlcm5lbCBzb3VyY2VzIGluIE1hcmNoIDIwMTUuXG4iKTsKLQlwcmludGsoS0VSTl9DT05UICJDdXJyZW50bHkgd2UgYXNzdW1lIHRoYXQgbm9ib2R5IGlzIHVzaW5nIHRoZSAzMSBiaXQga2VybmVsIG9uIG9sZCAzMSBiaXRcbiIpOwotCXByaW50ayhLRVJOX0NPTlQgImhhcmR3YXJlIGFueW1vcmUuIElmIHlvdSB0aGluayB0aGF0IHRoZSBjb2RlIHNob3VsZCBub3QgYmUgcmVtb3ZlZCBhbmQgYWxzb1xuIik7Ci0JcHJpbnRrKEtFUk5fQ09OVCAiZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBMaW51eCBrZXJuZWwgc2hvdWxkIGJlIGFibGUgdG8gcnVuIGluIDMxIGJpdCBtb2RlXG4iKTsKLQlwcmludGsoS0VSTl9DT05UICJwbGVhc2UgbGV0IHVzIGtub3cuIFBsZWFzZSB3cml0ZSB0bzpcbiIpOwotCXByaW50ayhLRVJOX0NPTlQgImxpbnV4MzkwQGRlLmlibS5jb20gKG1haWwgYWRkcmVzcykgYW5kL29yXG4iKTsKLQlwcmludGsoS0VSTl9DT05UICJsaW51eC1zMzkwQHZnZXIua2VybmVsLm9yZyAobWFpbGluZyBsaXN0KS5cblxuIik7Ci0JcHJpbnRrKEtFUk5fQ09OVCAiVGhhbmsgeW91IVxuXG4iKTsKLQlwcmludGsoS0VSTl9DT05UICJJZiB0aGlzIGtlcm5lbCBydW5zIG9uIGEgNjQgYml0IG1hY2hpbmUgeW91IG1heSBjb25zaWRlciB1c2luZyBhIDY0IGJpdCBrZXJuZWwuXG4iKTsKLQlwcmludGsoS0VSTl9DT05UICJUaGlzIG1lc3NhZ2UgY2FuIGJlIGRpc2FibGVkIHdpdGggdGhlIFwibm9fcmVtb3ZhbF93YXJuaW5nXCIga2VybmVsIHBhcmFtZXRlci5cbiIpOwotCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKDMwMCAqIEhaKTsKLQlyZXR1cm4gMDsKLX0KLWVhcmx5X2luaXRjYWxsKHJlbW92YWxfd2FybmluZyk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCmluZGV4IGIzYWU2ZjcuLmM1NTFmMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYwpAQCAtMTA2LDcgKzEwNiw2IEBACiB7CiAJc2F2ZV9hY2Nlc3NfcmVncyhjdXJyZW50LT50aHJlYWQuYWNycyk7CiAJc2F2ZV9mcF9jdGwoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyk7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJaWYgKGN1cnJlbnQtPnRocmVhZC52eHJzKSB7CiAJCWludCBpOwogCkBAIC0xMTUsNyArMTE0LDYgQEAKIAkJCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbaV0gPQogCQkJCSooZnJlZ190ICopKGN1cnJlbnQtPnRocmVhZC52eHJzICsgaSk7CiAJfSBlbHNlCi0jZW5kaWYKIAkJc2F2ZV9mcF9yZWdzKGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnMpOwogfQogCkBAIC0xMjQsNyArMTIyLDYgQEAKIHsKIAlyZXN0b3JlX2FjY2Vzc19yZWdzKGN1cnJlbnQtPnRocmVhZC5hY3JzKTsKIAkvKiByZXN0b3JlX2ZwX2N0bCBpcyBkb25lIGluIHJlc3RvcmVfc2lncmVncyAqLwotI2lmZGVmIENPTkZJR182NEJJVAogCWlmIChjdXJyZW50LT50aHJlYWQudnhycykgewogCQlpbnQgaTsKIApAQCAtMTMzLDcgKzEzMCw2IEBACiAJCQkJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tpXTsKIAkJcmVzdG9yZV92eF9yZWdzKGN1cnJlbnQtPnRocmVhZC52eHJzKTsKIAl9IGVsc2UKLSNlbmRpZgogCQlyZXN0b3JlX2ZwX3JlZ3MoY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBycyk7CiB9CiAKQEAgLTIwMCw3ICsxOTYsNiBAQAogc3RhdGljIGludCBzYXZlX3NpZ3JlZ3NfZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLAogCQkJICAgIF9zaWdyZWdzX2V4dCBfX3VzZXIgKnNyZWdzX2V4dCkKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlfX3U2NCB2eHJzW19fTlVNX1ZYUlNfTE9XXTsKIAlpbnQgaTsKIApAQCAtMjE1LDE0ICsyMTAsMTIgQEAKIAkJCQkgICBzaXplb2Yoc3JlZ3NfZXh0LT52eHJzX2hpZ2gpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCX0KLSNlbmRpZgogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJlc3RvcmVfc2lncmVnc19leHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCiAJCQkgICAgICAgX3NpZ3JlZ3NfZXh0IF9fdXNlciAqc3JlZ3NfZXh0KQogewotI2lmZGVmIENPTkZJR182NEJJVAogCV9fdTY0IHZ4cnNbX19OVU1fVlhSU19MT1ddOwogCWludCBpOwogCkBAIC0yMzcsNyArMjMwLDYgQEAKIAkJZm9yIChpID0gMDsgaSA8IF9fTlVNX1ZYUlNfTE9XOyBpKyspCiAJCQkqKChfX3U2NCAqKShjdXJyZW50LT50aHJlYWQudnhycyArIGkpICsgMSkgPSB2eHJzW2ldOwogCX0KLSNlbmRpZgogCXJldHVybiAwOwogfQogCkBAIC0zMDksMTYgKzMwMSw2IEBACiAJcmV0dXJuICh2b2lkIF9fdXNlciAqKSgoc3AgLSBmcmFtZV9zaXplKSAmIC04dWwpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBtYXBfc2lnbmFsKGludCBzaWcpCi17Ci0JaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4KLQkgICAgJiYgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcAotCSAgICAmJiBzaWcgPCAzMikKLQkJcmV0dXJuIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXBbc2lnXTsKLQllbHNlCi0JCXJldHVybiBzaWc7Ci19Ci0KIHN0YXRpYyBpbnQgc2V0dXBfZnJhbWUoaW50IHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKIAkJICAgICAgIHNpZ3NldF90ICpzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKIHsKQEAgLTM4Niw3ICszNjgsNyBAQAogCQkocmVncy0+cHN3Lm1hc2sgJiB+UFNXX01BU0tfQVNDKTsKIAlyZWdzLT5wc3cuYWRkciA9ICh1bnNpZ25lZCBsb25nKSBrYS0+c2Euc2FfaGFuZGxlciB8IFBTV19BRERSX0FNT0RFOwogCi0JcmVncy0+Z3Byc1syXSA9IG1hcF9zaWduYWwoc2lnKTsKKwlyZWdzLT5ncHJzWzJdID0gc2lnOwogCXJlZ3MtPmdwcnNbM10gPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT5zYzsKIAogCS8qIFdlIGZvcmdvdCB0byBpbmNsdWRlIHRoZXNlIGluIHRoZSBzaWdjb250ZXh0LgpAQCAtNDE2LDEzICszOTgsMTEgQEAKIAkgKiBpbmNsdWRlZCBpbiB0aGUgc2lnbmFsIGZyYW1lIG9uIGEgMzEtYml0IHN5c3RlbS4KIAkgKi8KIAl1Y19mbGFncyA9IDA7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJaWYgKE1BQ0hJTkVfSEFTX1ZYKSB7CiAJCWZyYW1lX3NpemUgKz0gc2l6ZW9mKF9zaWdyZWdzX2V4dCk7CiAJCWlmIChjdXJyZW50LT50aHJlYWQudnhycykKIAkJCXVjX2ZsYWdzIHw9IFVDX1ZYUlM7CiAJfQotI2VuZGlmCiAJZnJhbWUgPSBnZXRfc2lnZnJhbWUoJmtzaWctPmthLCByZWdzLCBmcmFtZV9zaXplKTsKIAlpZiAoZnJhbWUgPT0gKHZvaWQgX191c2VyICopIC0xVUwpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNDY4LDcgKzQ0OCw3IEBACiAJCShyZWdzLT5wc3cubWFzayAmIH5QU1dfTUFTS19BU0MpOwogCXJlZ3MtPnBzdy5hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGtzaWctPmthLnNhLnNhX2hhbmRsZXIgfCBQU1dfQUREUl9BTU9ERTsKIAotCXJlZ3MtPmdwcnNbMl0gPSBtYXBfc2lnbmFsKGtzaWctPnNpZyk7CisJcmVncy0+Z3Byc1syXSA9IGtzaWctPnNpZzsKIAlyZWdzLT5ncHJzWzNdID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+aW5mbzsKIAlyZWdzLT5ncHJzWzRdID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+dWM7CiAJcmVncy0+Z3Byc1s1XSA9IHRhc2tfdGhyZWFkX2luZm8oY3VycmVudCktPmxhc3RfYnJlYWs7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwppbmRleCBkYjhmMTExLi5lZmQyYzE5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKQEAgLTE5OCwxOSArMTk4LDExIEBACiAJbGMtPnBhbmljX3N0YWNrID0gcGFuaWNfc3RhY2sgKyBQQU5JQ19GUkFNRV9PRkZTRVQ7CiAJbGMtPmNwdV9uciA9IGNwdTsKIAlsYy0+c3BpbmxvY2tfbG9ja3ZhbCA9IGFyY2hfc3Bpbl9sb2NrdmFsKGNwdSk7Ci0jaWZuZGVmIENPTkZJR182NEJJVAotCWlmIChNQUNISU5FX0hBU19JRUVFKSB7Ci0JCWxjLT5leHRlbmRlZF9zYXZlX2FyZWFfYWRkciA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKCFsYy0+ZXh0ZW5kZWRfc2F2ZV9hcmVhX2FkZHIpCi0JCQlnb3RvIG91dDsKLQl9Ci0jZWxzZQogCWlmIChNQUNISU5FX0hBU19WWCkKIAkJbGMtPnZlY3Rvcl9zYXZlX2FyZWFfYWRkciA9CiAJCQkodW5zaWduZWQgbG9uZykgJmxjLT52ZWN0b3Jfc2F2ZV9hcmVhOwogCWlmICh2ZHNvX2FsbG9jX3Blcl9jcHUobGMpKQogCQlnb3RvIG91dDsKLSNlbmRpZgogCWxvd2NvcmVfcHRyW2NwdV0gPSBsYzsKIAlwY3B1X3NpZ3BfcmV0cnkocGNwdSwgU0lHUF9TRVRfUFJFRklYLCAodTMyKSh1bnNpZ25lZCBsb25nKSBsYyk7CiAJcmV0dXJuIDA7CkBAIC0yMjksMTYgKzIyMSw3IEBACiB7CiAJcGNwdV9zaWdwX3JldHJ5KHBjcHUsIFNJR1BfU0VUX1BSRUZJWCwgMCk7CiAJbG93Y29yZV9wdHJbcGNwdSAtIHBjcHVfZGV2aWNlc10gPSBOVUxMOwotI2lmbmRlZiBDT05GSUdfNjRCSVQKLQlpZiAoTUFDSElORV9IQVNfSUVFRSkgewotCQlzdHJ1Y3QgX2xvd2NvcmUgKmxjID0gcGNwdS0+bG93Y29yZTsKLQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGxjLT5leHRlbmRlZF9zYXZlX2FyZWFfYWRkcik7Ci0JCWxjLT5leHRlbmRlZF9zYXZlX2FyZWFfYWRkciA9IDA7Ci0JfQotI2Vsc2UKIAl2ZHNvX2ZyZWVfcGVyX2NwdShwY3B1LT5sb3djb3JlKTsKLSNlbmRpZgogCWlmIChwY3B1ID09ICZwY3B1X2RldmljZXNbMF0pCiAJCXJldHVybjsKIAlmcmVlX3BhZ2UocGNwdS0+bG93Y29yZS0+cGFuaWNfc3RhY2stUEFOSUNfRlJBTUVfT0ZGU0VUKTsKQEAgLTQ5MiwyMiArNDc1LDYgQEAKIAlwY3B1X2VjX2NhbGwocGNwdV9kZXZpY2VzICsgY3B1LCBlY19jYWxsX2Z1bmN0aW9uX3NpbmdsZSk7CiB9CiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0vKgotICogdGhpcyBmdW5jdGlvbiBzZW5kcyBhICdwdXJnZSB0bGInIHNpZ25hbCB0byBhbm90aGVyIENQVS4KLSAqLwotc3RhdGljIHZvaWQgc21wX3B0bGJfY2FsbGJhY2sodm9pZCAqaW5mbykKLXsKLQlfX3RsYl9mbHVzaF9sb2NhbCgpOwotfQotCi12b2lkIHNtcF9wdGxiX2FsbCh2b2lkKQotewotCW9uX2VhY2hfY3B1KHNtcF9wdGxiX2NhbGxiYWNrLCBOVUxMLCAxKTsKLX0KLUVYUE9SVF9TWU1CT0woc21wX3B0bGJfYWxsKTsKLSNlbmRpZiAvKiAhIENPTkZJR182NEJJVCAqLwotCiAvKgogICogdGhpcyBmdW5jdGlvbiBzZW5kcyBhICdyZXNjaGVkdWxlJyBJUEkgdG8gYW5vdGhlciBDUFUuCiAgKiBpdCBnb2VzIHN0cmFpZ2h0IHRocm91Z2ggYW5kIHdhc3RlcyBubyB0aW1lIHNlcmlhbGl6aW5nCkBAIC04NTEsNyArODE4LDggQEAKIAlwY3B1X3ByZXBhcmVfc2Vjb25kYXJ5KHBjcHUsIGNwdSk7CiAJcGNwdV9hdHRhY2hfdGFzayhwY3B1LCB0aWRsZSk7CiAJcGNwdV9zdGFydF9mbihwY3B1LCBzbXBfc3RhcnRfc2Vjb25kYXJ5LCBOVUxMKTsKLQl3aGlsZSAoIWNwdV9vbmxpbmUoY3B1KSkKKwkvKiBXYWl0IHVudGlsIGNwdSBwdXRzIGl0c2VsZiBpbiB0aGUgb25saW5lICYgYWN0aXZlIG1hcHMgKi8KKwl3aGlsZSAoIWNwdV9vbmxpbmUoY3B1KSB8fCAhY3B1X2FjdGl2ZShjcHUpKQogCQljcHVfcmVsYXgoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3VzcGVuZC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zdXNwZW5kLmMKaW5kZXggMWM0YzVhYy4uZDMyMzZjOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zdXNwZW5kLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zdXNwZW5kLmMKQEAgLTEzOCw2ICsxMzgsOCBAQAogewogCXVuc2lnbmVkIGxvbmcgbm9zYXZlX2JlZ2luX3BmbiA9IFBGTl9ET1dOKF9fcGEoJl9fbm9zYXZlX2JlZ2luKSk7CiAJdW5zaWduZWQgbG9uZyBub3NhdmVfZW5kX3BmbiA9IFBGTl9ET1dOKF9fcGEoJl9fbm9zYXZlX2VuZCkpOworCXVuc2lnbmVkIGxvbmcgZXNoYXJlZF9wZm4gPSBQRk5fRE9XTihfX3BhKCZfZXNoYXJlZCkpIC0gMTsKKwl1bnNpZ25lZCBsb25nIHN0ZXh0X3BmbiA9IFBGTl9ET1dOKF9fcGEoJl9zdGV4dCkpOwogCiAJLyogQWx3YXlzIHNhdmUgbG93Y29yZSBwYWdlcyAoTEMgcHJvdGVjdGlvbiBtaWdodCBiZSBlbmFibGVkKS4gKi8KIAlpZiAocGZuIDw9IExDX1BBR0VTKQpAQCAtMTQ1LDYgKzE0Nyw4IEBACiAJaWYgKHBmbiA+PSBub3NhdmVfYmVnaW5fcGZuICYmIHBmbiA8IG5vc2F2ZV9lbmRfcGZuKQogCQlyZXR1cm4gMTsKIAkvKiBTa2lwIG1lbW9yeSBob2xlcyBhbmQgcmVhZC1vbmx5IHBhZ2VzIChOU1MsIERDU1MsIC4uLikuICovCisJaWYgKHBmbiA+PSBzdGV4dF9wZm4gJiYgcGZuIDw9IGVzaGFyZWRfcGZuKQorCQlyZXR1cm4gaXBsX2luZm8udHlwZSA9PSBJUExfVFlQRV9OU1MgPyAxIDogMDsKIAlpZiAodHByb3QoUEZOX1BIWVMocGZuKSkpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zd3N1c3AuUyBiL2FyY2gvczM5MC9rZXJuZWwvc3dzdXNwLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E2Mjk0NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc3dzdXNwLlMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBTMzkwIDY0LWJpdCBzd3N1c3AgaW1wbGVtZW50YXRpb24KKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDkKKyAqCisgKiBBdXRob3Iocyk6IEhhbnMtSm9hY2hpbSBQaWNodCA8aGFuc0BsaW51eC52bmV0LmlibS5jb20+CisgKgkgICAgICBNaWNoYWVsIEhvbHpoZXUgPGhvbHpoZXVAbGludXgudm5ldC5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3NpZ3AuaD4KKworLyoKKyAqIFNhdmUgcmVnaXN0ZXIgY29udGV4dCBpbiBhYnNvbHV0ZSAwIGxvd2NvcmUgYW5kIGNhbGwgc3dzdXNwX3NhdmUoKSB0bworICogY3JlYXRlIGluLW1lbW9yeSBrZXJuZWwgaW1hZ2UuIFRoZSBjb250ZXh0IGlzIHNhdmVkIGluIHRoZSBkZXNpZ25hdGVkCisgKiAic3RvcmUgc3RhdHVzIiBtZW1vcnkgbG9jYXRpb25zIChzZWUgUE9QKS4KKyAqIFdlIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gdHdpY2UuIFRoZSBmaXJzdCB0aW1lIGR1cmluZyB0aGUgc3VzcGVuZCB0bworICogZGlzayBwcm9jZXNzLiBUaGUgc2Vjb25kIHRpbWUgdmlhIHRoZSBzd3N1c3BfYXJjaF9yZXN1bWUoKSBmdW5jdGlvbgorICogKHNlZSBiZWxvdykgaW4gdGhlIHJlc3VtZSBwcm9jZXNzLgorICogVGhpcyBmdW5jdGlvbiBydW5zIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cy4KKyAqLworCS5zZWN0aW9uIC50ZXh0CitFTlRSWShzd3N1c3BfYXJjaF9zdXNwZW5kKQorCXN0bWcJJXI2LCVyMTUsX19TRl9HUFJTKCVyMTUpCisJbGdyCSVyMSwlcjE1CisJYWdoaQklcjE1LC1TVEFDS19GUkFNRV9PVkVSSEVBRAorCXN0ZwklcjEsX19TRl9CQUNLQ0hBSU4oJXIxNSkKKworCS8qIERlYWN0aXZhdGUgREFUICovCisJc3Ruc20JX19TRl9FTVBUWSglcjE1KSwweGZiCisKKwkvKiBTdG9yZSBwcmVmaXggcmVnaXN0ZXIgb24gc3RhY2sgKi8KKwlzdHB4CV9fU0ZfRU1QVFkoJXIxNSkKKworCS8qIFNhdmUgcHJlZml4IHJlZ2lzdGVyIGNvbnRlbnRzIGZvciBsb3djb3JlIGNvcHkgKi8KKwlsbGdmCSVyMTAsX19TRl9FTVBUWSglcjE1KQorCisJLyogR2V0IHBvaW50ZXIgdG8gc2F2ZSBhcmVhICovCisJbGdoaQklcjEsMHgxMDAwCisKKwkvKiBTYXZlIENQVSBhZGRyZXNzICovCisJc3RhcAlfX0xDX0VYVF9DUFVfQUREUiglcjApCisKKwkvKiBTdG9yZSByZWdpc3RlcnMgKi8KKwltdmMJMHgzMTgoNCwlcjEpLF9fU0ZfRU1QVFkoJXIxNSkJLyogbW92ZSBwcmVmaXggdG8gbG93Y29yZSAqLworCXN0ZnBjCTB4MzFjKCVyMSkJCQkvKiBzdG9yZSBmcHUgY29udHJvbCAqLworCXN0ZAkwLDB4MjAwKCVyMSkJCQkvKiBzdG9yZSBmMCAqLworCXN0ZAkxLDB4MjA4KCVyMSkJCQkvKiBzdG9yZSBmMSAqLworCXN0ZAkyLDB4MjEwKCVyMSkJCQkvKiBzdG9yZSBmMiAqLworCXN0ZAkzLDB4MjE4KCVyMSkJCQkvKiBzdG9yZSBmMyAqLworCXN0ZAk0LDB4MjIwKCVyMSkJCQkvKiBzdG9yZSBmNCAqLworCXN0ZAk1LDB4MjI4KCVyMSkJCQkvKiBzdG9yZSBmNSAqLworCXN0ZAk2LDB4MjMwKCVyMSkJCQkvKiBzdG9yZSBmNiAqLworCXN0ZAk3LDB4MjM4KCVyMSkJCQkvKiBzdG9yZSBmNyAqLworCXN0ZAk4LDB4MjQwKCVyMSkJCQkvKiBzdG9yZSBmOCAqLworCXN0ZAk5LDB4MjQ4KCVyMSkJCQkvKiBzdG9yZSBmOSAqLworCXN0ZAkxMCwweDI1MCglcjEpCQkJLyogc3RvcmUgZjEwICovCisJc3RkCTExLDB4MjU4KCVyMSkJCQkvKiBzdG9yZSBmMTEgKi8KKwlzdGQJMTIsMHgyNjAoJXIxKQkJCS8qIHN0b3JlIGYxMiAqLworCXN0ZAkxMywweDI2OCglcjEpCQkJLyogc3RvcmUgZjEzICovCisJc3RkCTE0LDB4MjcwKCVyMSkJCQkvKiBzdG9yZSBmMTQgKi8KKwlzdGQJMTUsMHgyNzgoJXIxKQkJCS8qIHN0b3JlIGYxNSAqLworCXN0YW0JJWEwLCVhMTUsMHgzNDAoJXIxKQkJLyogc3RvcmUgYWNjZXNzIHJlZ2lzdGVycyAqLworCXN0Y3RnCSVjMCwlYzE1LDB4MzgwKCVyMSkJCS8qIHN0b3JlIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJc3RtZwklcjAsJXIxNSwweDI4MCglcjEpCQkvKiBzdG9yZSBnZW5lcmFsIHJlZ2lzdGVycyAqLworCisJc3RwdAkweDMyOCglcjEpCQkJLyogc3RvcmUgdGltZXIgKi8KKwlzdGNrCV9fU0ZfRU1QVFkoJXIxNSkJCS8qIHN0b3JlIGNsb2NrICovCisJc3Rja2MJMHgzMzAoJXIxKQkJCS8qIHN0b3JlIGNsb2NrIGNvbXBhcmF0b3IgKi8KKworCS8qIFVwZGF0ZSBjcHV0aW1lIGFjY291bnRpbmcgYmVmb3JlIGdvaW5nIHRvIHNsZWVwICovCisJbGcJJXIwLF9fTENfTEFTVF9VUERBVEVfVElNRVIKKwlzbGcJJXIwLDB4MzI4KCVyMSkKKwlhbGcJJXIwLF9fTENfU1lTVEVNX1RJTUVSCisJc3RnCSVyMCxfX0xDX1NZU1RFTV9USU1FUgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX1RJTUVSKDgpLDB4MzI4KCVyMSkKKwlsZwklcjAsX19MQ19MQVNUX1VQREFURV9DTE9DSworCXNsZwklcjAsX19TRl9FTVBUWSglcjE1KQorCWFsZwklcjAsX19MQ19TVEVBTF9USU1FUgorCXN0ZwklcjAsX19MQ19TVEVBTF9USU1FUgorCW12YwlfX0xDX0xBU1RfVVBEQVRFX0NMT0NLKDgpLF9fU0ZfRU1QVFkoJXIxNSkKKworCS8qIEFjdGl2YXRlIERBVCAqLworCXN0b3NtCV9fU0ZfRU1QVFkoJXIxNSksMHgwNAorCisJLyogU2V0IHByZWZpeCBwYWdlIHRvIHplcm8gKi8KKwl4YwlfX1NGX0VNUFRZKDQsJXIxNSksX19TRl9FTVBUWSglcjE1KQorCXNweAlfX1NGX0VNUFRZKCVyMTUpCisKKwkvKiBTYXZlIGFic29sdXRlIHplcm8gcGFnZXMgKi8KKwlsYXJsCSVyMixzdXNwZW5kX3plcm9fcGFnZXMKKwlsZwklcjIsMCglcjIpCisJbGdoaQklcjQsMAorCWxnaGkJJXIzLDIqUEFHRV9TSVpFCisJbGdoaQklcjUsMipQQUdFX1NJWkUKKzE6CW12Y2xlCSVyMiwlcjQsMAorCWpvCTFiCisKKwkvKiBDb3B5IGxvd2NvcmUgdG8gYWJzb2x1dGUgemVybyBsb3djb3JlICovCisJbGdoaQklcjIsMAorCWxncgklcjQsJXIxMAorCWxnaGkJJXIzLDIqUEFHRV9TSVpFCisJbGdoaQklcjUsMipQQUdFX1NJWkUKKzE6CW12Y2xlCSVyMiwlcjQsMAorCWpvCTFiCisKKwkvKiBTYXZlIGltYWdlICovCisJYnJhc2wJJXIxNCxzd3N1c3Bfc2F2ZQorCisJLyogUmVzdG9yZSBwcmVmaXggcmVnaXN0ZXIgYW5kIHJldHVybiAqLworCWxnaGkJJXIxLDB4MTAwMAorCXNweAkweDMxOCglcjEpCisJbG1nCSVyNiwlcjE1LFNUQUNLX0ZSQU1FX09WRVJIRUFEICsgX19TRl9HUFJTKCVyMTUpCisJbGdoaQklcjIsMAorCWJyCSVyMTQKKworLyoKKyAqIFJlc3RvcmUgc2F2ZWQgbWVtb3J5IGltYWdlIHRvIGNvcnJlY3QgcGxhY2UgYW5kIHJlc3RvcmUgcmVnaXN0ZXIgY29udGV4dC4KKyAqIFRoZW4gd2UgcmV0dXJuIHRvIHRoZSBmdW5jdGlvbiB0aGF0IGNhbGxlZCBzd3N1c3BfYXJjaF9zdXNwZW5kKCkuCisgKiBzd3N1c3BfYXJjaF9yZXN1bWUoKSBydW5zIHdpdGggZGlzYWJsZWQgaW50ZXJydXB0cy4KKyAqLworRU5UUlkoc3dzdXNwX2FyY2hfcmVzdW1lKQorCXN0bWcJJXI2LCVyMTUsX19TRl9HUFJTKCVyMTUpCisJbGdyCSVyMSwlcjE1CisJYWdoaQklcjE1LC1TVEFDS19GUkFNRV9PVkVSSEVBRAorCXN0ZwklcjEsX19TRl9CQUNLQ0hBSU4oJXIxNSkKKworCS8qIE1ha2UgYWxsIGZyZWUgcGFnZXMgc3RhYmxlICovCisJbGdoaQklcjIsMQorCWJyYXNsCSVyMTQsYXJjaF9zZXRfcGFnZV9zdGF0ZXMKKworCS8qIERlYWN0aXZhdGUgREFUICovCisJc3Ruc20JX19TRl9FTVBUWSglcjE1KSwweGZiCisKKwkvKiBTZXQgcHJlZml4IHBhZ2UgdG8gemVybyAqLworCXhjCV9fU0ZfRU1QVFkoNCwlcjE1KSxfX1NGX0VNUFRZKCVyMTUpCisJc3B4CV9fU0ZfRU1QVFkoJXIxNSkKKworCS8qIFJlc3RvcmUgc2F2ZWQgaW1hZ2UgKi8KKwlsYXJsCSVyMSxyZXN0b3JlX3BibGlzdAorCWxnCSVyMSwwKCVyMSkKKwlsdGdyCSVyMSwlcjEKKwlqegkyZgorMDoKKwlsZwklcjIsOCglcjEpCisJbGcJJXI0LDAoJXIxKQorCWlza2UJJXIwLCVyNAorCWxnaGkJJXIzLFBBR0VfU0laRQorCWxnaGkJJXI1LFBBR0VfU0laRQorMToKKwltdmNsZQklcjIsJXI0LDAKKwlqbwkxYgorCWxnCSVyMiw4KCVyMSkKKwlzc2tlCSVyMCwlcjIKKwlsZwklcjEsMTYoJXIxKQorCWx0Z3IJJXIxLCVyMQorCWpuegkwYgorMjoKKwlwdGxiCQkJCS8qIGZsdXNoIHRsYiAqLworCisJLyogUmVzZXQgU3lzdGVtICovCisJbGFybAklcjEscmVzdGFydF9lbnRyeQorCWxhcmwJJXIyLC5McmVzdGFydF9kaWFnMzA4X3BzdworCW9nCSVyMSwwKCVyMikKKwlzdGcJJXIxLDAoJXIwKQorCWxhcmwJJXIxLC5MbmV3X3BnbV9jaGVja19wc3cKKwllcHN3CSVyMiwlcjMKKwlzdG0JJXIyLCVyMywwKCVyMSkKKwltdmMJX19MQ19QR01fTkVXX1BTVygxNiwlcjApLDAoJXIxKQorCWxnaGkJJXIwLDAKKwlkaWFnCSVyMCwlcjAsMHgzMDgKK3Jlc3RhcnRfZW50cnk6CisJbGhpCSVyMSwxCisJc2lncAklcjEsJXIwLFNJR1BfU0VUX0FSQ0hJVEVDVFVSRQorCXNhbTY0CisjaWZkZWYgQ09ORklHX1NNUAorCWxhcmwJJXIxLHNtcF9jcHVfbXRfc2hpZnQKKwlpY20JJXIxLDE1LDAoJXIxKQorCWp6CXNtdF9kb25lCisJbGxnZnIJJXIxLCVyMQorc210X2xvb3A6CisJc2lncAklcjEsJXIwLFNJR1BfU0VUX01VTFRJX1RIUkVBRElORworCWJyYwk4LHNtdF9kb25lCQkJLyogYWNjZXB0ZWQgKi8KKwlicmMJMixzbXRfbG9vcAkJCS8qIGJ1c3ksIHRyeSBhZ2FpbiAqLworc210X2RvbmU6CisjZW5kaWYKKwlsYXJsCSVyMSwuTG5ld19wZ21fY2hlY2tfcHN3CisJbHBzd2UJMCglcjEpCitwZ21fY2hlY2tfZW50cnk6CisKKwkvKiBTd2l0Y2ggdG8gb3JpZ2luYWwgc3VzcGVuZCBDUFUgKi8KKwlsYXJsCSVyMSwuTHJlc3VtZV9jcHUJCS8qIFJlc3VtZSBDUFUgYWRkcmVzczogcjIgKi8KKwlzdGFwCTAoJXIxKQorCWxsZ2gJJXIyLDAoJXIxKQorCWxsZ2gJJXIxLF9fTENfRVhUX0NQVV9BRERSKCVyMCkJLyogU3VzcGVuZCBDUFUgYWRkcmVzczogcjEgKi8KKwljZ3IJJXIxLCVyMgorCWplCXJlc3RvcmVfcmVnaXN0ZXJzCQkvKiByMSA9IHIyIC0+IG5vdGhpbmcgdG8gZG8gKi8KKwlsYXJsCSVyNCwuTHJlc3RhcnRfc3VzcGVuZF9wc3cJLyogU2V0IG5ldyByZXN0YXJ0IFBTVyAqLworCW12YwlfX0xDX1JTVF9ORVdfUFNXKDE2LCVyMCksMCglcjQpCiszOgorCXNpZ3AJJXI5LCVyMSxTSUdQX0lOSVRJQUxfQ1BVX1JFU0VUCS8qIHNpZ3AgaW5pdGlhbCBjcHUgcmVzZXQgKi8KKwlicmMJOCw0ZgkJCQkvKiBhY2NlcHRlZCAqLworCWJyYwkyLDNiCQkJCS8qIGJ1c3ksIHRyeSBhZ2FpbiAqLworCisJLyogU3VzcGVuZCBDUFUgbm90IGF2YWlsYWJsZSAtPiBwYW5pYyAqLworCWxhcmwJJXIxNSxpbml0X3RocmVhZF91bmlvbgorCWFoaQklcjE1LDE8PChQQUdFX1NISUZUK1RIUkVBRF9PUkRFUikKKwlsYXJsCSVyMiwuTHBhbmljX3N0cmluZworCWxhcmwJJXIzLF9zY2xwX3ByaW50X2Vhcmx5CisJbGdoaQklcjEsMAorCXNhbTMxCisJc2lncAklcjEsJXIwLFNJR1BfU0VUX0FSQ0hJVEVDVFVSRQorCWJhc3IJJXIxNCwlcjMKKwlsYXJsCSVyMywuTGRpc2FibGVkX3dhaXRfMzEKKwlscHN3CTAoJXIzKQorNDoKKwkvKiBTd2l0Y2ggdG8gc3VzcGVuZCBDUFUgKi8KKwlzaWdwCSVyOSwlcjEsU0lHUF9SRVNUQVJUCS8qIHNpZ3AgcmVzdGFydCB0byBzdXNwZW5kIENQVSAqLworCWJyYwkyLDRiCQkJLyogYnVzeSwgdHJ5IGFnYWluICovCis1OgorCXNpZ3AJJXI5LCVyMixTSUdQX1NUT1AJLyogc2lncCBzdG9wIHRvIGN1cnJlbnQgcmVzdW1lIENQVSAqLworCWJyYwkyLDViCQkJLyogYnVzeSwgdHJ5IGFnYWluICovCis2OglqCTZiCisKK3Jlc3RhcnRfc3VzcGVuZDoKKwlsYXJsCSVyMSwuTHJlc3VtZV9jcHUKKwlsbGdoCSVyMiwwKCVyMSkKKzc6CisJc2lncAklcjksJXIyLFNJR1BfU0VOU0UJLyogc2lncCBzZW5zZSwgd2FpdCBmb3IgcmVzdW1lIENQVSAqLworCWJyYwk4LDdiCQkJLyogYWNjZXB0ZWQsIHN0YXR1cyAwLCBzdGlsbCBydW5uaW5nICovCisJYnJjCTIsN2IJCQkvKiBidXN5LCB0cnkgYWdhaW4gKi8KKwl0bWxsCSVyOSwweDQwCQkvKiBUZXN0IGlmIHJlc3VtZSBDUFUgaXMgc3RvcHBlZCAqLworCWp6CTdiCisKK3Jlc3RvcmVfcmVnaXN0ZXJzOgorCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCisJbGdoaQklcjEzLDB4MTAwMAkJLyogJXIxID0gcG9pbnRlciB0byBzYXZlIGFyZWEgKi8KKworCS8qIElnbm9yZSB0aW1lIHNwZW50IGluIHN1c3BlbmRlZCBzdGF0ZS4gKi8KKwlsbGdmCSVyMSwweDMxOCglcjEzKQorCXN0Y2sJX19MQ19MQVNUX1VQREFURV9DTE9DSyglcjEpCisJc3B0CTB4MzI4KCVyMTMpCQkvKiByZXByb2dyYW0gdGltZXIgKi8KKwkvL3Nja2MJMHgzMzAoJXIxMykJCS8qIHNldCBjbG9jayBjb21wYXJhdG9yICovCisKKwlsY3RsZwklYzAsJWMxNSwweDM4MCglcjEzKQkvKiBsb2FkIGNvbnRyb2wgcmVnaXN0ZXJzICovCisJbGFtCSVhMCwlYTE1LDB4MzQwKCVyMTMpCS8qIGxvYWQgYWNjZXNzIHJlZ2lzdGVycyAqLworCisJbGZwYwkweDMxYyglcjEzKQkJLyogbG9hZCBmcHUgY29udHJvbCAqLworCWxkCTAsMHgyMDAoJXIxMykJCS8qIGxvYWQgZjAgKi8KKwlsZAkxLDB4MjA4KCVyMTMpCQkvKiBsb2FkIGYxICovCisJbGQJMiwweDIxMCglcjEzKQkJLyogbG9hZCBmMiAqLworCWxkCTMsMHgyMTgoJXIxMykJCS8qIGxvYWQgZjMgKi8KKwlsZAk0LDB4MjIwKCVyMTMpCQkvKiBsb2FkIGY0ICovCisJbGQJNSwweDIyOCglcjEzKQkJLyogbG9hZCBmNSAqLworCWxkCTYsMHgyMzAoJXIxMykJCS8qIGxvYWQgZjYgKi8KKwlsZAk3LDB4MjM4KCVyMTMpCQkvKiBsb2FkIGY3ICovCisJbGQJOCwweDI0MCglcjEzKQkJLyogbG9hZCBmOCAqLworCWxkCTksMHgyNDgoJXIxMykJCS8qIGxvYWQgZjkgKi8KKwlsZAkxMCwweDI1MCglcjEzKQkJLyogbG9hZCBmMTAgKi8KKwlsZAkxMSwweDI1OCglcjEzKQkJLyogbG9hZCBmMTEgKi8KKwlsZAkxMiwweDI2MCglcjEzKQkJLyogbG9hZCBmMTIgKi8KKwlsZAkxMywweDI2OCglcjEzKQkJLyogbG9hZCBmMTMgKi8KKwlsZAkxNCwweDI3MCglcjEzKQkJLyogbG9hZCBmMTQgKi8KKwlsZAkxNSwweDI3OCglcjEzKQkJLyogbG9hZCBmMTUgKi8KKworCS8qIExvYWQgb2xkIHN0YWNrICovCisJbGcJJXIxNSwweDJmOCglcjEzKQorCisJLyogU2F2ZSBwcmVmaXggcmVnaXN0ZXIgKi8KKwltdmMgX19TRl9FTVBUWSg0LCVyMTUpLDB4MzE4KCVyMTMpCisKKwkvKiBSZXN0b3JlIGFic29sdXRlIHplcm8gcGFnZXMgKi8KKwlsZ2hpCSVyMiwwCisJbGFybAklcjQsc3VzcGVuZF96ZXJvX3BhZ2VzCisJbGcJJXI0LDAoJXI0KQorCWxnaGkJJXIzLDIqUEFHRV9TSVpFCisJbGdoaQklcjUsMipQQUdFX1NJWkUKKzE6CW12Y2xlCSVyMiwlcjQsMAorCWpvCTFiCisKKwkvKiBSZXN0b3JlIHByZWZpeCByZWdpc3RlciAqLworCXNweAlfX1NGX0VNUFRZKCVyMTUpCisKKwkvKiBBY3RpdmF0ZSBEQVQgKi8KKwlzdG9zbQlfX1NGX0VNUFRZKCVyMTUpLDB4MDQKKworCS8qIE1ha2UgYWxsIGZyZWUgcGFnZXMgdW5zdGFibGUgKi8KKwlsZ2hpCSVyMiwwCisJYnJhc2wJJXIxNCxhcmNoX3NldF9wYWdlX3N0YXRlcworCisJLyogQ2FsbCBhcmNoIHNwZWNpZmljIGVhcmx5IHJlc3VtZSBjb2RlICovCisJYnJhc2wJJXIxNCxzMzkwX2Vhcmx5X3Jlc3VtZQorCisJLyogUmV0dXJuIDAgKi8KKwlsbWcJJXI2LCVyMTUsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1NGX0dQUlMoJXIxNSkKKwlsZ2hpCSVyMiwwCisJYnIJJXIxNAorCisJLnNlY3Rpb24gLmRhdGEuLm5vc2F2ZSwiYXciLEBwcm9nYml0cworCS5hbGlnbgk4CisuTGRpc2FibGVkX3dhaXRfMzE6CisJLmxvbmcgIDB4MDAwYTAwMDAsMHgwMDAwMDAwMAorLkxwYW5pY19zdHJpbmc6CisJLmFzY2l6CSJSZXN1bWUgbm90IHBvc3NpYmxlIGJlY2F1c2Ugc3VzcGVuZCBDUFUgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSIKKwkuYWxpZ24JOAorLkxyZXN0YXJ0X2RpYWczMDhfcHN3OgorCS5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMAorLkxyZXN0YXJ0X3N1c3BlbmRfcHN3OgorCS5xdWFkCTB4MDAwMDAwMDE4MDAwMDAwMCxyZXN0YXJ0X3N1c3BlbmQKKy5MbmV3X3BnbV9jaGVja19wc3c6CisJLnF1YWQJMCxwZ21fY2hlY2tfZW50cnkKKy5McmVzdW1lX2NwdToKKwkuYnl0ZQkwLDAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3dzdXNwX2FzbTY0LlMgYi9hcmNoL3MzOTAva2VybmVsL3N3c3VzcF9hc202NC5TCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA5ZmRmLi4wMDAwMDAwCi0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc3dzdXNwX2FzbTY0LlMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoKLSAqIFMzOTAgNjQtYml0IHN3c3VzcCBpbXBsZW1lbnRhdGlvbgotICoKLSAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwOQotICoKLSAqIEF1dGhvcihzKTogSGFucy1Kb2FjaGltIFBpY2h0IDxoYW5zQGxpbnV4LnZuZXQuaWJtLmNvbT4KLSAqCSAgICAgIE1pY2hhZWwgSG9semhldSA8aG9semhldUBsaW51eC52bmV0LmlibS5jb20+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNpbmNsdWRlIDxhc20vc2lncC5oPgotCi0vKgotICogU2F2ZSByZWdpc3RlciBjb250ZXh0IGluIGFic29sdXRlIDAgbG93Y29yZSBhbmQgY2FsbCBzd3N1c3Bfc2F2ZSgpIHRvCi0gKiBjcmVhdGUgaW4tbWVtb3J5IGtlcm5lbCBpbWFnZS4gVGhlIGNvbnRleHQgaXMgc2F2ZWQgaW4gdGhlIGRlc2lnbmF0ZWQKLSAqICJzdG9yZSBzdGF0dXMiIG1lbW9yeSBsb2NhdGlvbnMgKHNlZSBQT1ApLgotICogV2UgcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbiB0d2ljZS4gVGhlIGZpcnN0IHRpbWUgZHVyaW5nIHRoZSBzdXNwZW5kIHRvCi0gKiBkaXNrIHByb2Nlc3MuIFRoZSBzZWNvbmQgdGltZSB2aWEgdGhlIHN3c3VzcF9hcmNoX3Jlc3VtZSgpIGZ1bmN0aW9uCi0gKiAoc2VlIGJlbG93KSBpbiB0aGUgcmVzdW1lIHByb2Nlc3MuCi0gKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzLgotICovCi0JLnNlY3Rpb24gLnRleHQKLUVOVFJZKHN3c3VzcF9hcmNoX3N1c3BlbmQpCi0Jc3RtZwklcjYsJXIxNSxfX1NGX0dQUlMoJXIxNSkKLQlsZ3IJJXIxLCVyMTUKLQlhZ2hpCSVyMTUsLVNUQUNLX0ZSQU1FX09WRVJIRUFECi0Jc3RnCSVyMSxfX1NGX0JBQ0tDSEFJTiglcjE1KQotCi0JLyogRGVhY3RpdmF0ZSBEQVQgKi8KLQlzdG5zbQlfX1NGX0VNUFRZKCVyMTUpLDB4ZmIKLQotCS8qIFN0b3JlIHByZWZpeCByZWdpc3RlciBvbiBzdGFjayAqLwotCXN0cHgJX19TRl9FTVBUWSglcjE1KQotCi0JLyogU2F2ZSBwcmVmaXggcmVnaXN0ZXIgY29udGVudHMgZm9yIGxvd2NvcmUgY29weSAqLwotCWxsZ2YJJXIxMCxfX1NGX0VNUFRZKCVyMTUpCi0KLQkvKiBHZXQgcG9pbnRlciB0byBzYXZlIGFyZWEgKi8KLQlsZ2hpCSVyMSwweDEwMDAKLQotCS8qIFNhdmUgQ1BVIGFkZHJlc3MgKi8KLQlzdGFwCV9fTENfRVhUX0NQVV9BRERSKCVyMCkKLQotCS8qIFN0b3JlIHJlZ2lzdGVycyAqLwotCW12YwkweDMxOCg0LCVyMSksX19TRl9FTVBUWSglcjE1KQkvKiBtb3ZlIHByZWZpeCB0byBsb3djb3JlICovCi0Jc3RmcGMJMHgzMWMoJXIxKQkJCS8qIHN0b3JlIGZwdSBjb250cm9sICovCi0Jc3RkCTAsMHgyMDAoJXIxKQkJCS8qIHN0b3JlIGYwICovCi0Jc3RkCTEsMHgyMDgoJXIxKQkJCS8qIHN0b3JlIGYxICovCi0Jc3RkCTIsMHgyMTAoJXIxKQkJCS8qIHN0b3JlIGYyICovCi0Jc3RkCTMsMHgyMTgoJXIxKQkJCS8qIHN0b3JlIGYzICovCi0Jc3RkCTQsMHgyMjAoJXIxKQkJCS8qIHN0b3JlIGY0ICovCi0Jc3RkCTUsMHgyMjgoJXIxKQkJCS8qIHN0b3JlIGY1ICovCi0Jc3RkCTYsMHgyMzAoJXIxKQkJCS8qIHN0b3JlIGY2ICovCi0Jc3RkCTcsMHgyMzgoJXIxKQkJCS8qIHN0b3JlIGY3ICovCi0Jc3RkCTgsMHgyNDAoJXIxKQkJCS8qIHN0b3JlIGY4ICovCi0Jc3RkCTksMHgyNDgoJXIxKQkJCS8qIHN0b3JlIGY5ICovCi0Jc3RkCTEwLDB4MjUwKCVyMSkJCQkvKiBzdG9yZSBmMTAgKi8KLQlzdGQJMTEsMHgyNTgoJXIxKQkJCS8qIHN0b3JlIGYxMSAqLwotCXN0ZAkxMiwweDI2MCglcjEpCQkJLyogc3RvcmUgZjEyICovCi0Jc3RkCTEzLDB4MjY4KCVyMSkJCQkvKiBzdG9yZSBmMTMgKi8KLQlzdGQJMTQsMHgyNzAoJXIxKQkJCS8qIHN0b3JlIGYxNCAqLwotCXN0ZAkxNSwweDI3OCglcjEpCQkJLyogc3RvcmUgZjE1ICovCi0Jc3RhbQklYTAsJWExNSwweDM0MCglcjEpCQkvKiBzdG9yZSBhY2Nlc3MgcmVnaXN0ZXJzICovCi0Jc3RjdGcJJWMwLCVjMTUsMHgzODAoJXIxKQkJLyogc3RvcmUgY29udHJvbCByZWdpc3RlcnMgKi8KLQlzdG1nCSVyMCwlcjE1LDB4MjgwKCVyMSkJCS8qIHN0b3JlIGdlbmVyYWwgcmVnaXN0ZXJzICovCi0KLQlzdHB0CTB4MzI4KCVyMSkJCQkvKiBzdG9yZSB0aW1lciAqLwotCXN0Y2sJX19TRl9FTVBUWSglcjE1KQkJLyogc3RvcmUgY2xvY2sgKi8KLQlzdGNrYwkweDMzMCglcjEpCQkJLyogc3RvcmUgY2xvY2sgY29tcGFyYXRvciAqLwotCi0JLyogVXBkYXRlIGNwdXRpbWUgYWNjb3VudGluZyBiZWZvcmUgZ29pbmcgdG8gc2xlZXAgKi8KLQlsZwklcjAsX19MQ19MQVNUX1VQREFURV9USU1FUgotCXNsZwklcjAsMHgzMjgoJXIxKQotCWFsZwklcjAsX19MQ19TWVNURU1fVElNRVIKLQlzdGcJJXIwLF9fTENfU1lTVEVNX1RJTUVSCi0JbXZjCV9fTENfTEFTVF9VUERBVEVfVElNRVIoOCksMHgzMjgoJXIxKQotCWxnCSVyMCxfX0xDX0xBU1RfVVBEQVRFX0NMT0NLCi0Jc2xnCSVyMCxfX1NGX0VNUFRZKCVyMTUpCi0JYWxnCSVyMCxfX0xDX1NURUFMX1RJTUVSCi0Jc3RnCSVyMCxfX0xDX1NURUFMX1RJTUVSCi0JbXZjCV9fTENfTEFTVF9VUERBVEVfQ0xPQ0soOCksX19TRl9FTVBUWSglcjE1KQotCi0JLyogQWN0aXZhdGUgREFUICovCi0Jc3Rvc20JX19TRl9FTVBUWSglcjE1KSwweDA0Ci0KLQkvKiBTZXQgcHJlZml4IHBhZ2UgdG8gemVybyAqLwotCXhjCV9fU0ZfRU1QVFkoNCwlcjE1KSxfX1NGX0VNUFRZKCVyMTUpCi0Jc3B4CV9fU0ZfRU1QVFkoJXIxNSkKLQotCS8qIFNhdmUgYWJzb2x1dGUgemVybyBwYWdlcyAqLwotCWxhcmwJJXIyLHN1c3BlbmRfemVyb19wYWdlcwotCWxnCSVyMiwwKCVyMikKLQlsZ2hpCSVyNCwwCi0JbGdoaQklcjMsMipQQUdFX1NJWkUKLQlsZ2hpCSVyNSwyKlBBR0VfU0laRQotMToJbXZjbGUJJXIyLCVyNCwwCi0Jam8JMWIKLQotCS8qIENvcHkgbG93Y29yZSB0byBhYnNvbHV0ZSB6ZXJvIGxvd2NvcmUgKi8KLQlsZ2hpCSVyMiwwCi0JbGdyCSVyNCwlcjEwCi0JbGdoaQklcjMsMipQQUdFX1NJWkUKLQlsZ2hpCSVyNSwyKlBBR0VfU0laRQotMToJbXZjbGUJJXIyLCVyNCwwCi0Jam8JMWIKLQotCS8qIFNhdmUgaW1hZ2UgKi8KLQlicmFzbAklcjE0LHN3c3VzcF9zYXZlCi0KLQkvKiBSZXN0b3JlIHByZWZpeCByZWdpc3RlciBhbmQgcmV0dXJuICovCi0JbGdoaQklcjEsMHgxMDAwCi0Jc3B4CTB4MzE4KCVyMSkKLQlsbWcJJXI2LCVyMTUsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1NGX0dQUlMoJXIxNSkKLQlsZ2hpCSVyMiwwCi0JYnIJJXIxNAotCi0vKgotICogUmVzdG9yZSBzYXZlZCBtZW1vcnkgaW1hZ2UgdG8gY29ycmVjdCBwbGFjZSBhbmQgcmVzdG9yZSByZWdpc3RlciBjb250ZXh0LgotICogVGhlbiB3ZSByZXR1cm4gdG8gdGhlIGZ1bmN0aW9uIHRoYXQgY2FsbGVkIHN3c3VzcF9hcmNoX3N1c3BlbmQoKS4KLSAqIHN3c3VzcF9hcmNoX3Jlc3VtZSgpIHJ1bnMgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzLgotICovCi1FTlRSWShzd3N1c3BfYXJjaF9yZXN1bWUpCi0Jc3RtZwklcjYsJXIxNSxfX1NGX0dQUlMoJXIxNSkKLQlsZ3IJJXIxLCVyMTUKLQlhZ2hpCSVyMTUsLVNUQUNLX0ZSQU1FX09WRVJIRUFECi0Jc3RnCSVyMSxfX1NGX0JBQ0tDSEFJTiglcjE1KQotCi0JLyogTWFrZSBhbGwgZnJlZSBwYWdlcyBzdGFibGUgKi8KLQlsZ2hpCSVyMiwxCi0JYnJhc2wJJXIxNCxhcmNoX3NldF9wYWdlX3N0YXRlcwotCi0JLyogRGVhY3RpdmF0ZSBEQVQgKi8KLQlzdG5zbQlfX1NGX0VNUFRZKCVyMTUpLDB4ZmIKLQotCS8qIFNldCBwcmVmaXggcGFnZSB0byB6ZXJvICovCi0JeGMJX19TRl9FTVBUWSg0LCVyMTUpLF9fU0ZfRU1QVFkoJXIxNSkKLQlzcHgJX19TRl9FTVBUWSglcjE1KQotCi0JLyogUmVzdG9yZSBzYXZlZCBpbWFnZSAqLwotCWxhcmwJJXIxLHJlc3RvcmVfcGJsaXN0Ci0JbGcJJXIxLDAoJXIxKQotCWx0Z3IJJXIxLCVyMQotCWp6CTJmCi0wOgotCWxnCSVyMiw4KCVyMSkKLQlsZwklcjQsMCglcjEpCi0JaXNrZQklcjAsJXI0Ci0JbGdoaQklcjMsUEFHRV9TSVpFCi0JbGdoaQklcjUsUEFHRV9TSVpFCi0xOgotCW12Y2xlCSVyMiwlcjQsMAotCWpvCTFiCi0JbGcJJXIyLDgoJXIxKQotCXNza2UJJXIwLCVyMgotCWxnCSVyMSwxNiglcjEpCi0JbHRncgklcjEsJXIxCi0Jam56CTBiCi0yOgotCXB0bGIJCQkJLyogZmx1c2ggdGxiICovCi0KLQkvKiBSZXNldCBTeXN0ZW0gKi8KLQlsYXJsCSVyMSxyZXN0YXJ0X2VudHJ5Ci0JbGFybAklcjIsLkxyZXN0YXJ0X2RpYWczMDhfcHN3Ci0Jb2cJJXIxLDAoJXIyKQotCXN0ZwklcjEsMCglcjApCi0JbGFybAklcjEsLkxuZXdfcGdtX2NoZWNrX3BzdwotCWVwc3cJJXIyLCVyMwotCXN0bQklcjIsJXIzLDAoJXIxKQotCW12YwlfX0xDX1BHTV9ORVdfUFNXKDE2LCVyMCksMCglcjEpCi0JbGdoaQklcjAsMAotCWRpYWcJJXIwLCVyMCwweDMwOAotcmVzdGFydF9lbnRyeToKLQlsaGkJJXIxLDEKLQlzaWdwCSVyMSwlcjAsU0lHUF9TRVRfQVJDSElURUNUVVJFCi0Jc2FtNjQKLQlsYXJsCSVyMSwuTG5ld19wZ21fY2hlY2tfcHN3Ci0JbHBzd2UJMCglcjEpCi1wZ21fY2hlY2tfZW50cnk6Ci0KLQkvKiBTd2l0Y2ggdG8gb3JpZ2luYWwgc3VzcGVuZCBDUFUgKi8KLQlsYXJsCSVyMSwuTHJlc3VtZV9jcHUJCS8qIFJlc3VtZSBDUFUgYWRkcmVzczogcjIgKi8KLQlzdGFwCTAoJXIxKQotCWxsZ2gJJXIyLDAoJXIxKQotCWxsZ2gJJXIxLF9fTENfRVhUX0NQVV9BRERSKCVyMCkJLyogU3VzcGVuZCBDUFUgYWRkcmVzczogcjEgKi8KLQljZ3IJJXIxLCVyMgotCWplCXJlc3RvcmVfcmVnaXN0ZXJzCQkvKiByMSA9IHIyIC0+IG5vdGhpbmcgdG8gZG8gKi8KLQlsYXJsCSVyNCwuTHJlc3RhcnRfc3VzcGVuZF9wc3cJLyogU2V0IG5ldyByZXN0YXJ0IFBTVyAqLwotCW12YwlfX0xDX1JTVF9ORVdfUFNXKDE2LCVyMCksMCglcjQpCi0zOgotCXNpZ3AJJXI5LCVyMSxTSUdQX0lOSVRJQUxfQ1BVX1JFU0VUCS8qIHNpZ3AgaW5pdGlhbCBjcHUgcmVzZXQgKi8KLQlicmMJOCw0ZgkJCQkvKiBhY2NlcHRlZCAqLwotCWJyYwkyLDNiCQkJCS8qIGJ1c3ksIHRyeSBhZ2FpbiAqLwotCi0JLyogU3VzcGVuZCBDUFUgbm90IGF2YWlsYWJsZSAtPiBwYW5pYyAqLwotCWxhcmwJJXIxNSxpbml0X3RocmVhZF91bmlvbgotCWFoaQklcjE1LDE8PChQQUdFX1NISUZUK1RIUkVBRF9PUkRFUikKLQlsYXJsCSVyMiwuTHBhbmljX3N0cmluZwotCWxhcmwJJXIzLF9zY2xwX3ByaW50X2Vhcmx5Ci0JbGdoaQklcjEsMAotCXNhbTMxCi0Jc2lncAklcjEsJXIwLFNJR1BfU0VUX0FSQ0hJVEVDVFVSRQotCWJhc3IJJXIxNCwlcjMKLQlsYXJsCSVyMywuTGRpc2FibGVkX3dhaXRfMzEKLQlscHN3CTAoJXIzKQotNDoKLQkvKiBTd2l0Y2ggdG8gc3VzcGVuZCBDUFUgKi8KLQlzaWdwCSVyOSwlcjEsU0lHUF9SRVNUQVJUCS8qIHNpZ3AgcmVzdGFydCB0byBzdXNwZW5kIENQVSAqLwotCWJyYwkyLDRiCQkJLyogYnVzeSwgdHJ5IGFnYWluICovCi01OgotCXNpZ3AJJXI5LCVyMixTSUdQX1NUT1AJLyogc2lncCBzdG9wIHRvIGN1cnJlbnQgcmVzdW1lIENQVSAqLwotCWJyYwkyLDViCQkJLyogYnVzeSwgdHJ5IGFnYWluICovCi02OglqCTZiCi0KLXJlc3RhcnRfc3VzcGVuZDoKLQlsYXJsCSVyMSwuTHJlc3VtZV9jcHUKLQlsbGdoCSVyMiwwKCVyMSkKLTc6Ci0Jc2lncAklcjksJXIyLFNJR1BfU0VOU0UJLyogc2lncCBzZW5zZSwgd2FpdCBmb3IgcmVzdW1lIENQVSAqLwotCWJyYwk4LDdiCQkJLyogYWNjZXB0ZWQsIHN0YXR1cyAwLCBzdGlsbCBydW5uaW5nICovCi0JYnJjCTIsN2IJCQkvKiBidXN5LCB0cnkgYWdhaW4gKi8KLQl0bWxsCSVyOSwweDQwCQkvKiBUZXN0IGlmIHJlc3VtZSBDUFUgaXMgc3RvcHBlZCAqLwotCWp6CTdiCi0KLXJlc3RvcmVfcmVnaXN0ZXJzOgotCS8qIFJlc3RvcmUgcmVnaXN0ZXJzICovCi0JbGdoaQklcjEzLDB4MTAwMAkJLyogJXIxID0gcG9pbnRlciB0byBzYXZlIGFyZWEgKi8KLQotCS8qIElnbm9yZSB0aW1lIHNwZW50IGluIHN1c3BlbmRlZCBzdGF0ZS4gKi8KLQlsbGdmCSVyMSwweDMxOCglcjEzKQotCXN0Y2sJX19MQ19MQVNUX1VQREFURV9DTE9DSyglcjEpCi0Jc3B0CTB4MzI4KCVyMTMpCQkvKiByZXByb2dyYW0gdGltZXIgKi8KLQkvL3Nja2MJMHgzMzAoJXIxMykJCS8qIHNldCBjbG9jayBjb21wYXJhdG9yICovCi0KLQlsY3RsZwklYzAsJWMxNSwweDM4MCglcjEzKQkvKiBsb2FkIGNvbnRyb2wgcmVnaXN0ZXJzICovCi0JbGFtCSVhMCwlYTE1LDB4MzQwKCVyMTMpCS8qIGxvYWQgYWNjZXNzIHJlZ2lzdGVycyAqLwotCi0JbGZwYwkweDMxYyglcjEzKQkJLyogbG9hZCBmcHUgY29udHJvbCAqLwotCWxkCTAsMHgyMDAoJXIxMykJCS8qIGxvYWQgZjAgKi8KLQlsZAkxLDB4MjA4KCVyMTMpCQkvKiBsb2FkIGYxICovCi0JbGQJMiwweDIxMCglcjEzKQkJLyogbG9hZCBmMiAqLwotCWxkCTMsMHgyMTgoJXIxMykJCS8qIGxvYWQgZjMgKi8KLQlsZAk0LDB4MjIwKCVyMTMpCQkvKiBsb2FkIGY0ICovCi0JbGQJNSwweDIyOCglcjEzKQkJLyogbG9hZCBmNSAqLwotCWxkCTYsMHgyMzAoJXIxMykJCS8qIGxvYWQgZjYgKi8KLQlsZAk3LDB4MjM4KCVyMTMpCQkvKiBsb2FkIGY3ICovCi0JbGQJOCwweDI0MCglcjEzKQkJLyogbG9hZCBmOCAqLwotCWxkCTksMHgyNDgoJXIxMykJCS8qIGxvYWQgZjkgKi8KLQlsZAkxMCwweDI1MCglcjEzKQkJLyogbG9hZCBmMTAgKi8KLQlsZAkxMSwweDI1OCglcjEzKQkJLyogbG9hZCBmMTEgKi8KLQlsZAkxMiwweDI2MCglcjEzKQkJLyogbG9hZCBmMTIgKi8KLQlsZAkxMywweDI2OCglcjEzKQkJLyogbG9hZCBmMTMgKi8KLQlsZAkxNCwweDI3MCglcjEzKQkJLyogbG9hZCBmMTQgKi8KLQlsZAkxNSwweDI3OCglcjEzKQkJLyogbG9hZCBmMTUgKi8KLQotCS8qIExvYWQgb2xkIHN0YWNrICovCi0JbGcJJXIxNSwweDJmOCglcjEzKQotCi0JLyogU2F2ZSBwcmVmaXggcmVnaXN0ZXIgKi8KLQltdmMgX19TRl9FTVBUWSg0LCVyMTUpLDB4MzE4KCVyMTMpCi0KLQkvKiBSZXN0b3JlIGFic29sdXRlIHplcm8gcGFnZXMgKi8KLQlsZ2hpCSVyMiwwCi0JbGFybAklcjQsc3VzcGVuZF96ZXJvX3BhZ2VzCi0JbGcJJXI0LDAoJXI0KQotCWxnaGkJJXIzLDIqUEFHRV9TSVpFCi0JbGdoaQklcjUsMipQQUdFX1NJWkUKLTE6CW12Y2xlCSVyMiwlcjQsMAotCWpvCTFiCi0KLQkvKiBSZXN0b3JlIHByZWZpeCByZWdpc3RlciAqLwotCXNweAlfX1NGX0VNUFRZKCVyMTUpCi0KLQkvKiBBY3RpdmF0ZSBEQVQgKi8KLQlzdG9zbQlfX1NGX0VNUFRZKCVyMTUpLDB4MDQKLQotCS8qIE1ha2UgYWxsIGZyZWUgcGFnZXMgdW5zdGFibGUgKi8KLQlsZ2hpCSVyMiwwCi0JYnJhc2wJJXIxNCxhcmNoX3NldF9wYWdlX3N0YXRlcwotCi0JLyogQ2FsbCBhcmNoIHNwZWNpZmljIGVhcmx5IHJlc3VtZSBjb2RlICovCi0JYnJhc2wJJXIxNCxzMzkwX2Vhcmx5X3Jlc3VtZQotCi0JLyogUmV0dXJuIDAgKi8KLQlsbWcJJXI2LCVyMTUsU1RBQ0tfRlJBTUVfT1ZFUkhFQUQgKyBfX1NGX0dQUlMoJXIxNSkKLQlsZ2hpCSVyMiwwCi0JYnIJJXIxNAotCi0JLnNlY3Rpb24gLmRhdGEuLm5vc2F2ZSwiYXciLEBwcm9nYml0cwotCS5hbGlnbgk4Ci0uTGRpc2FibGVkX3dhaXRfMzE6Ci0JLmxvbmcgIDB4MDAwYTAwMDAsMHgwMDAwMDAwMAotLkxwYW5pY19zdHJpbmc6Ci0JLmFzY2l6CSJSZXN1bWUgbm90IHBvc3NpYmxlIGJlY2F1c2Ugc3VzcGVuZCBDUFUgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSIKLQkuYWxpZ24JOAotLkxyZXN0YXJ0X2RpYWczMDhfcHN3OgotCS5sb25nCTB4MDAwODAwMDAsMHg4MDAwMDAwMAotLkxyZXN0YXJ0X3N1c3BlbmRfcHN3OgotCS5xdWFkCTB4MDAwMDAwMDE4MDAwMDAwMCxyZXN0YXJ0X3N1c3BlbmQKLS5MbmV3X3BnbV9jaGVja19wc3c6Ci0JLnF1YWQJMCxwZ21fY2hlY2tfZW50cnkKLS5McmVzdW1lX2NwdToKLQkuYnl0ZQkwLDAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc3lzX3MzOTAuYyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzX3MzOTAuYwppbmRleCAyM2ViMjIyLi5mMTQ1NDkwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3N5c19zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zeXNfczM5MC5jCkBAIC03Niw3ICs3Niw2IEBACiAJcmV0dXJuIHN5c19pcGMoY2FsbCwgZmlyc3QsIHNlY29uZCwgdGhpcmQsIHB0ciwgdGhpcmQpOwogfQogCi0jaWZkZWYgQ09ORklHXzY0QklUCiBTWVNDQUxMX0RFRklORTEoczM5MF9wZXJzb25hbGl0eSwgdW5zaWduZWQgaW50LCBwZXJzb25hbGl0eSkKIHsKIAl1bnNpZ25lZCBpbnQgcmV0OwpAQCAtOTAsNTEgKzg5LDMgQEAKIAogCXJldHVybiByZXQ7CiB9Ci0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCi0KLS8qCi0gKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBzeXNfZmFkdmlzZTY0L2ZhZHZpc2U2NF82NAotICovCi0jaWZuZGVmIENPTkZJR182NEJJVAotCi1TWVNDQUxMX0RFRklORTUoczM5MF9mYWR2aXNlNjQsIGludCwgZmQsIHUzMiwgb2Zmc2V0X2hpZ2gsIHUzMiwgb2Zmc2V0X2xvdywKLQkJc2l6ZV90LCBsZW4sIGludCwgYWR2aWNlKQotewotCXJldHVybiBzeXNfZmFkdmlzZTY0KGZkLCAodTY0KSBvZmZzZXRfaGlnaCA8PCAzMiB8IG9mZnNldF9sb3csCi0JCQlsZW4sIGFkdmljZSk7Ci19Ci0KLXN0cnVjdCBmYWR2aXNlNjRfNjRfYXJncyB7Ci0JaW50IGZkOwotCWxvbmcgbG9uZyBvZmZzZXQ7Ci0JbG9uZyBsb25nIGxlbjsKLQlpbnQgYWR2aWNlOwotfTsKLQotU1lTQ0FMTF9ERUZJTkUxKHMzOTBfZmFkdmlzZTY0XzY0LCBzdHJ1Y3QgZmFkdmlzZTY0XzY0X2FyZ3MgX191c2VyICosIGFyZ3MpCi17Ci0Jc3RydWN0IGZhZHZpc2U2NF82NF9hcmdzIGE7Ci0KLQlpZiAoIGNvcHlfZnJvbV91c2VyKCZhLCBhcmdzLCBzaXplb2YoYSkpICkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JcmV0dXJuIHN5c19mYWR2aXNlNjRfNjQoYS5mZCwgYS5vZmZzZXQsIGEubGVuLCBhLmFkdmljZSk7Ci19Ci0KLS8qCi0gKiBUaGlzIGlzIGEgd3JhcHBlciB0byBjYWxsIHN5c19mYWxsb2NhdGUoKS4gRm9yIDMxIGJpdCBzMzkwIHRoZSBsYXN0Ci0gKiA2NCBiaXQgYXJndW1lbnQgImxlbiIgaXMgc3BsaXQgaW50byB0aGUgdXBwZXIgYW5kIGxvd2VyIDMyIGJpdHMuIFRoZQotICogc3lzdGVtIGNhbGwgd3JhcHBlciBpbiB0aGUgdXNlciBzcGFjZSBsb2FkcyB0aGUgdmFsdWUgdG8gJXI2LyVyNy4KLSAqIFRoZSBjb2RlIGluIGVudHJ5LlMga2VlcHMgdGhlIHZhbHVlcyBpbiAlcjIgLSAlcjYgd2hlcmUgdGhleSBhcmUgYW5kCi0gKiBzdG9yZXMgJXI3IHRvIDk2KCVyMTUpLiBCdXQgdGhlIHN0YW5kYXJkIEMgbGlua2FnZSByZXF1aXJlcyB0aGF0Ci0gKiB0aGUgd2hvbGUgNjQgYml0IHZhbHVlIGZvciBsZW4gaXMgc3RvcmVkIG9uIHRoZSBzdGFjayBhbmQgZG9lc24ndAotICogdXNlICVyNiBhdCBhbGwuIFNvIHMzOTBfZmFsbG9jYXRlIGhhcyB0byBjb252ZXJ0IHRoZSBhcmd1bWVudHMgZnJvbQotICogICAlcjI6IGZkLCAlcjM6IG1vZGUsICVyNC8lcjU6IG9mZnNldCwgJXI2Lzk2KCVyMTUpLTk5KCVyMTUpOiBsZW4KLSAqIHRvCi0gKiAgICVyMjogZmQsICVyMzogbW9kZSwgJXI0LyVyNTogb2Zmc2V0LCA5NiglcjE1KS0xMDMoJXIxNSk6IGxlbgotICovCi1TWVNDQUxMX0RFRklORTUoczM5MF9mYWxsb2NhdGUsIGludCwgZmQsIGludCwgbW9kZSwgbG9mZl90LCBvZmZzZXQsCi0JCQkgICAgICAgdTMyLCBsZW5faGlnaCwgdTMyLCBsZW5fbG93KQotewotCXJldHVybiBzeXNfZmFsbG9jYXRlKGZkLCBtb2RlLCBvZmZzZXQsICgodTY0KWxlbl9oaWdoIDw8IDMyKSB8IGxlbl9sb3cpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMgYi9hcmNoL3MzOTAva2VybmVsL3N5c2NhbGxzLlMKaW5kZXggOTM5ZWM0Ny4uMWFjYWQwMiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zeXNjYWxscy5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc3lzY2FsbHMuUwpAQCAtMSwzNjUgKzEsMzY1IEBACiAvKgogICogZGVmaW5pdGlvbnMgZm9yIHN5c19jYWxsX3RhYmxlLCBlYWNoIGxpbmUgcmVwcmVzZW50cyBhbgotICogZW50cnkgaW4gdGhlIHRhYmxlIGluIHRoZSBmb3JtIAotICogU1lTQ0FMTCgzMSBiaXQgc3lzY2FsbCwgNjQgYml0IHN5c2NhbGwsIDMxIGJpdCBlbXVsYXRlZCBzeXNjYWxsKQorICogZW50cnkgaW4gdGhlIHRhYmxlIGluIHRoZSBmb3JtCisgKiBTWVNDQUxMKDY0IGJpdCBzeXNjYWxsLCAzMSBiaXQgZW11bGF0ZWQgc3lzY2FsbCkKICAqCi0gKiB0aGlzIGZpbGUgaXMgbWVhbnQgdG8gYmUgaW5jbHVkZWQgZnJvbSBlbnRyeS5TIGFuZCBlbnRyeTY0LlMKKyAqIHRoaXMgZmlsZSBpcyBtZWFudCB0byBiZSBpbmNsdWRlZCBmcm9tIGVudHJ5LlMKICAqLwogCi0jZGVmaW5lIE5JX1NZU0NBTEwgU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxzeXNfbmlfc3lzY2FsbCxzeXNfbmlfc3lzY2FsbCkKKyNkZWZpbmUgTklfU1lTQ0FMTCBTWVNDQUxMKHN5c19uaV9zeXNjYWxsLHN5c19uaV9zeXNjYWxsKQogCi1OSV9TWVNDQUxMCQkJCQkJCS8qIDAgKi8KLVNZU0NBTEwoc3lzX2V4aXQsc3lzX2V4aXQsY29tcGF0X3N5c19leGl0KQotU1lTQ0FMTChzeXNfZm9yayxzeXNfZm9yayxzeXNfZm9yaykKLVNZU0NBTEwoc3lzX3JlYWQsc3lzX3JlYWQsY29tcGF0X3N5c19zMzkwX3JlYWQpCi1TWVNDQUxMKHN5c193cml0ZSxzeXNfd3JpdGUsY29tcGF0X3N5c19zMzkwX3dyaXRlKQotU1lTQ0FMTChzeXNfb3BlbixzeXNfb3Blbixjb21wYXRfc3lzX29wZW4pCQkJLyogNSAqLwotU1lTQ0FMTChzeXNfY2xvc2Usc3lzX2Nsb3NlLGNvbXBhdF9zeXNfY2xvc2UpCi1TWVNDQUxMKHN5c19yZXN0YXJ0X3N5c2NhbGwsc3lzX3Jlc3RhcnRfc3lzY2FsbCxzeXNfcmVzdGFydF9zeXNjYWxsKQotU1lTQ0FMTChzeXNfY3JlYXQsc3lzX2NyZWF0LGNvbXBhdF9zeXNfY3JlYXQpCi1TWVNDQUxMKHN5c19saW5rLHN5c19saW5rLGNvbXBhdF9zeXNfbGluaykKLVNZU0NBTEwoc3lzX3VubGluayxzeXNfdW5saW5rLGNvbXBhdF9zeXNfdW5saW5rKQkJLyogMTAgKi8KLVNZU0NBTEwoc3lzX2V4ZWN2ZSxzeXNfZXhlY3ZlLGNvbXBhdF9zeXNfZXhlY3ZlKQotU1lTQ0FMTChzeXNfY2hkaXIsc3lzX2NoZGlyLGNvbXBhdF9zeXNfY2hkaXIpCi1TWVNDQUxMKHN5c190aW1lLHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfdGltZSkJCS8qIG9sZCB0aW1lIHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX21rbm9kLHN5c19ta25vZCxjb21wYXRfc3lzX21rbm9kKQotU1lTQ0FMTChzeXNfY2htb2Qsc3lzX2NobW9kLGNvbXBhdF9zeXNfY2htb2QpCQkJLyogMTUgKi8KLVNZU0NBTEwoc3lzX2xjaG93bjE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9sY2hvd24xNikJLyogb2xkIGxjaG93bjE2IHN5c2NhbGwqLwotTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgYnJlYWsgc3lzY2FsbCBob2xkZXIgKi8KLU5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHN0YXQgc3lzY2FsbCBob2xkZXIgKi8KLVNZU0NBTEwoc3lzX2xzZWVrLHN5c19sc2Vlayxjb21wYXRfc3lzX2xzZWVrKQotU1lTQ0FMTChzeXNfZ2V0cGlkLHN5c19nZXRwaWQsc3lzX2dldHBpZCkJCQkvKiAyMCAqLwotU1lTQ0FMTChzeXNfbW91bnQsc3lzX21vdW50LGNvbXBhdF9zeXNfbW91bnQpCi1TWVNDQUxMKHN5c19vbGR1bW91bnQsc3lzX29sZHVtb3VudCxjb21wYXRfc3lzX29sZHVtb3VudCkKLVNZU0NBTEwoc3lzX3NldHVpZDE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9zZXR1aWQxNikJLyogb2xkIHNldHVpZDE2IHN5c2NhbGwqLwotU1lTQ0FMTChzeXNfZ2V0dWlkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2dldHVpZDE2KQkvKiBvbGQgZ2V0dWlkMTYgc3lzY2FsbCovCi1TWVNDQUxMKHN5c19zdGltZSxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3N0aW1lKQkJLyogMjUgb2xkIHN0aW1lIHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3B0cmFjZSxzeXNfcHRyYWNlLGNvbXBhdF9zeXNfcHRyYWNlKQotU1lTQ0FMTChzeXNfYWxhcm0sc3lzX2FsYXJtLGNvbXBhdF9zeXNfYWxhcm0pCi1OSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBmc3RhdCBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19wYXVzZSxzeXNfcGF1c2Usc3lzX3BhdXNlKQotU1lTQ0FMTChzeXNfdXRpbWUsc3lzX3V0aW1lLGNvbXBhdF9zeXNfdXRpbWUpCQkvKiAzMCAqLwotTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgc3R0eSBzeXNjYWxsICovCi1OSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBndHR5IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX2FjY2VzcyxzeXNfYWNjZXNzLGNvbXBhdF9zeXNfYWNjZXNzKQotU1lTQ0FMTChzeXNfbmljZSxzeXNfbmljZSxjb21wYXRfc3lzX25pY2UpCi1OSV9TWVNDQUxMCQkJCQkJCS8qIDM1IG9sZCBmdGltZSBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19zeW5jLHN5c19zeW5jLHN5c19zeW5jKQotU1lTQ0FMTChzeXNfa2lsbCxzeXNfa2lsbCxjb21wYXRfc3lzX2tpbGwpCi1TWVNDQUxMKHN5c19yZW5hbWUsc3lzX3JlbmFtZSxjb21wYXRfc3lzX3JlbmFtZSkKLVNZU0NBTEwoc3lzX21rZGlyLHN5c19ta2Rpcixjb21wYXRfc3lzX21rZGlyKQotU1lTQ0FMTChzeXNfcm1kaXIsc3lzX3JtZGlyLGNvbXBhdF9zeXNfcm1kaXIpCQkvKiA0MCAqLwotU1lTQ0FMTChzeXNfZHVwLHN5c19kdXAsY29tcGF0X3N5c19kdXApCi1TWVNDQUxMKHN5c19waXBlLHN5c19waXBlLGNvbXBhdF9zeXNfcGlwZSkKLVNZU0NBTEwoc3lzX3RpbWVzLHN5c190aW1lcyxjb21wYXRfc3lzX3RpbWVzKQotTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgcHJvZiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19icmssc3lzX2Jyayxjb21wYXRfc3lzX2JyaykJCQkJLyogNDUgKi8KLVNZU0NBTEwoc3lzX3NldGdpZDE2LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9zZXRnaWQxNikJLyogb2xkIHNldGdpZDE2IHN5c2NhbGwqLwotU1lTQ0FMTChzeXNfZ2V0Z2lkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2dldGdpZDE2KQkvKiBvbGQgZ2V0Z2lkMTYgc3lzY2FsbCovCi1TWVNDQUxMKHN5c19zaWduYWwsc3lzX3NpZ25hbCxjb21wYXRfc3lzX3NpZ25hbCkKLVNZU0NBTEwoc3lzX2dldGV1aWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZ2V0ZXVpZDE2KQkvKiBvbGQgZ2V0ZXVpZDE2IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX2dldGVnaWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZ2V0ZWdpZDE2KQkvKiA1MCBvbGQgZ2V0ZWdpZDE2IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX2FjY3Qsc3lzX2FjY3QsY29tcGF0X3N5c19hY2N0KQotU1lTQ0FMTChzeXNfdW1vdW50LHN5c191bW91bnQsY29tcGF0X3N5c191bW91bnQpCi1OSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBsb2NrIHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX2lvY3RsLHN5c19pb2N0bCxjb21wYXRfc3lzX2lvY3RsKQotU1lTQ0FMTChzeXNfZmNudGwsc3lzX2ZjbnRsLGNvbXBhdF9zeXNfZmNudGwpCQkvKiA1NSAqLwotTklfU1lTQ0FMTAkJCQkJCQkvKiBpbnRlbCBtcHggc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfc2V0cGdpZCxzeXNfc2V0cGdpZCxjb21wYXRfc3lzX3NldHBnaWQpCi1OSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCB1bGltaXQgc3lzY2FsbCAqLwotTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgdW5hbWUgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfdW1hc2ssc3lzX3VtYXNrLGNvbXBhdF9zeXNfdW1hc2spCQkJLyogNjAgKi8KLVNZU0NBTEwoc3lzX2Nocm9vdCxzeXNfY2hyb290LGNvbXBhdF9zeXNfY2hyb290KQotU1lTQ0FMTChzeXNfdXN0YXQsc3lzX3VzdGF0LGNvbXBhdF9zeXNfdXN0YXQpCi1TWVNDQUxMKHN5c19kdXAyLHN5c19kdXAyLGNvbXBhdF9zeXNfZHVwMikKLVNZU0NBTEwoc3lzX2dldHBwaWQsc3lzX2dldHBwaWQsc3lzX2dldHBwaWQpCi1TWVNDQUxMKHN5c19nZXRwZ3JwLHN5c19nZXRwZ3JwLHN5c19nZXRwZ3JwKQkJCS8qIDY1ICovCi1TWVNDQUxMKHN5c19zZXRzaWQsc3lzX3NldHNpZCxzeXNfc2V0c2lkKQotU1lTQ0FMTChzeXNfc2lnYWN0aW9uLHN5c19zaWdhY3Rpb24sY29tcGF0X3N5c19zaWdhY3Rpb24pCi1OSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBzZ2V0bWFzayBzeXNjYWxsKi8KLU5JX1NZU0NBTEwJCQkJCQkJLyogb2xkIHNzZXRtYXNrIHN5c2NhbGwqLwotU1lTQ0FMTChzeXNfc2V0cmV1aWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0cmV1aWQxNikgLyogb2xkIHNldHJldWlkMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfc2V0cmVnaWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0cmVnaWQxNikgLyogb2xkIHNldHJlZ2lkMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfc2lnc3VzcGVuZCxzeXNfc2lnc3VzcGVuZCxjb21wYXRfc3lzX3NpZ3N1c3BlbmQpCi1TWVNDQUxMKHN5c19zaWdwZW5kaW5nLHN5c19zaWdwZW5kaW5nLGNvbXBhdF9zeXNfc2lncGVuZGluZykKLVNZU0NBTEwoc3lzX3NldGhvc3RuYW1lLHN5c19zZXRob3N0bmFtZSxjb21wYXRfc3lzX3NldGhvc3RuYW1lKQotU1lTQ0FMTChzeXNfc2V0cmxpbWl0LHN5c19zZXRybGltaXQsY29tcGF0X3N5c19zZXRybGltaXQpCS8qIDc1ICovCi1TWVNDQUxMKHN5c19vbGRfZ2V0cmxpbWl0LHN5c19nZXRybGltaXQsY29tcGF0X3N5c19vbGRfZ2V0cmxpbWl0KQotU1lTQ0FMTChzeXNfZ2V0cnVzYWdlLHN5c19nZXRydXNhZ2UsY29tcGF0X3N5c19nZXRydXNhZ2UpCi1TWVNDQUxMKHN5c19nZXR0aW1lb2ZkYXksc3lzX2dldHRpbWVvZmRheSxjb21wYXRfc3lzX2dldHRpbWVvZmRheSkKLVNZU0NBTEwoc3lzX3NldHRpbWVvZmRheSxzeXNfc2V0dGltZW9mZGF5LGNvbXBhdF9zeXNfc2V0dGltZW9mZGF5KQotU1lTQ0FMTChzeXNfZ2V0Z3JvdXBzMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2dldGdyb3VwczE2KQkvKiA4MCBvbGQgZ2V0Z3JvdXBzMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfc2V0Z3JvdXBzMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldGdyb3VwczE2KQkvKiBvbGQgc2V0Z3JvdXBzMTYgc3lzY2FsbCAqLwotTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgc2VsZWN0IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3N5bWxpbmssc3lzX3N5bWxpbmssY29tcGF0X3N5c19zeW1saW5rKQotTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgbHN0YXQgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfcmVhZGxpbmssc3lzX3JlYWRsaW5rLGNvbXBhdF9zeXNfcmVhZGxpbmspCQkvKiA4NSAqLwotU1lTQ0FMTChzeXNfdXNlbGliLHN5c191c2VsaWIsY29tcGF0X3N5c191c2VsaWIpCi1TWVNDQUxMKHN5c19zd2Fwb24sc3lzX3N3YXBvbixjb21wYXRfc3lzX3N3YXBvbikKLVNZU0NBTEwoc3lzX3JlYm9vdCxzeXNfcmVib290LGNvbXBhdF9zeXNfcmVib290KQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX29sZF9yZWFkZGlyKQkvKiBvbGQgcmVhZGRpciBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19vbGRfbW1hcCxzeXNfb2xkX21tYXAsY29tcGF0X3N5c19zMzkwX29sZF9tbWFwKQkvKiA5MCAqLwotU1lTQ0FMTChzeXNfbXVubWFwLHN5c19tdW5tYXAsY29tcGF0X3N5c19tdW5tYXApCi1TWVNDQUxMKHN5c190cnVuY2F0ZSxzeXNfdHJ1bmNhdGUsY29tcGF0X3N5c190cnVuY2F0ZSkKLVNZU0NBTEwoc3lzX2Z0cnVuY2F0ZSxzeXNfZnRydW5jYXRlLGNvbXBhdF9zeXNfZnRydW5jYXRlKQotU1lTQ0FMTChzeXNfZmNobW9kLHN5c19mY2htb2QsY29tcGF0X3N5c19mY2htb2QpCi1TWVNDQUxMKHN5c19mY2hvd24xNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZmNob3duMTYpCS8qIDk1IG9sZCBmY2hvd24xNiBzeXNjYWxsKi8KLVNZU0NBTEwoc3lzX2dldHByaW9yaXR5LHN5c19nZXRwcmlvcml0eSxjb21wYXRfc3lzX2dldHByaW9yaXR5KQotU1lTQ0FMTChzeXNfc2V0cHJpb3JpdHksc3lzX3NldHByaW9yaXR5LGNvbXBhdF9zeXNfc2V0cHJpb3JpdHkpCi1OSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBwcm9maWwgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfc3RhdGZzLHN5c19zdGF0ZnMsY29tcGF0X3N5c19zdGF0ZnMpCi1TWVNDQUxMKHN5c19mc3RhdGZzLHN5c19mc3RhdGZzLGNvbXBhdF9zeXNfZnN0YXRmcykJLyogMTAwICovCi1OSV9TWVNDQUxMCQkJCQkJCS8qIGlvcGVybSBmb3IgaTM4NiAqLwotU1lTQ0FMTChzeXNfc29ja2V0Y2FsbCxzeXNfc29ja2V0Y2FsbCxjb21wYXRfc3lzX3NvY2tldGNhbGwpCi1TWVNDQUxMKHN5c19zeXNsb2csc3lzX3N5c2xvZyxjb21wYXRfc3lzX3N5c2xvZykKLVNZU0NBTEwoc3lzX3NldGl0aW1lcixzeXNfc2V0aXRpbWVyLGNvbXBhdF9zeXNfc2V0aXRpbWVyKQotU1lTQ0FMTChzeXNfZ2V0aXRpbWVyLHN5c19nZXRpdGltZXIsY29tcGF0X3N5c19nZXRpdGltZXIpCS8qIDEwNSAqLwotU1lTQ0FMTChzeXNfbmV3c3RhdCxzeXNfbmV3c3RhdCxjb21wYXRfc3lzX25ld3N0YXQpCi1TWVNDQUxMKHN5c19uZXdsc3RhdCxzeXNfbmV3bHN0YXQsY29tcGF0X3N5c19uZXdsc3RhdCkKLVNZU0NBTEwoc3lzX25ld2ZzdGF0LHN5c19uZXdmc3RhdCxjb21wYXRfc3lzX25ld2ZzdGF0KQotTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgdW5hbWUgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfbG9va3VwX2Rjb29raWUsc3lzX2xvb2t1cF9kY29va2llLGNvbXBhdF9zeXNfbG9va3VwX2Rjb29raWUpCS8qIDExMCAqLwotU1lTQ0FMTChzeXNfdmhhbmd1cCxzeXNfdmhhbmd1cCxzeXNfdmhhbmd1cCkKLU5JX1NZU0NBTEwJCQkJCQkJLyogb2xkICJpZGxlIiBzeXN0ZW0gY2FsbCAqLwotTklfU1lTQ0FMTAkJCQkJCQkvKiB2bTg2b2xkIGZvciBpMzg2ICovCi1TWVNDQUxMKHN5c193YWl0NCxzeXNfd2FpdDQsY29tcGF0X3N5c193YWl0NCkKLVNZU0NBTEwoc3lzX3N3YXBvZmYsc3lzX3N3YXBvZmYsY29tcGF0X3N5c19zd2Fwb2ZmKQkJLyogMTE1ICovCi1TWVNDQUxMKHN5c19zeXNpbmZvLHN5c19zeXNpbmZvLGNvbXBhdF9zeXNfc3lzaW5mbykKLVNZU0NBTEwoc3lzX3MzOTBfaXBjLHN5c19zMzkwX2lwYyxjb21wYXRfc3lzX3MzOTBfaXBjKQotU1lTQ0FMTChzeXNfZnN5bmMsc3lzX2ZzeW5jLGNvbXBhdF9zeXNfZnN5bmMpCi1TWVNDQUxMKHN5c19zaWdyZXR1cm4sc3lzX3NpZ3JldHVybixjb21wYXRfc3lzX3NpZ3JldHVybikKLVNZU0NBTEwoc3lzX2Nsb25lLHN5c19jbG9uZSxjb21wYXRfc3lzX2Nsb25lKQkJCS8qIDEyMCAqLwotU1lTQ0FMTChzeXNfc2V0ZG9tYWlubmFtZSxzeXNfc2V0ZG9tYWlubmFtZSxjb21wYXRfc3lzX3NldGRvbWFpbm5hbWUpCi1TWVNDQUxMKHN5c19uZXd1bmFtZSxzeXNfbmV3dW5hbWUsY29tcGF0X3N5c19uZXd1bmFtZSkKLU5JX1NZU0NBTEwJCQkJCQkJLyogbW9kaWZ5X2xkdCBmb3IgaTM4NiAqLwotU1lTQ0FMTChzeXNfYWRqdGltZXgsc3lzX2FkanRpbWV4LGNvbXBhdF9zeXNfYWRqdGltZXgpCi1TWVNDQUxMKHN5c19tcHJvdGVjdCxzeXNfbXByb3RlY3QsY29tcGF0X3N5c19tcHJvdGVjdCkJCS8qIDEyNSAqLwotU1lTQ0FMTChzeXNfc2lncHJvY21hc2ssc3lzX3NpZ3Byb2NtYXNrLGNvbXBhdF9zeXNfc2lncHJvY21hc2spCi1OSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCAiY3JlYXRlIG1vZHVsZSIgKi8KLVNZU0NBTEwoc3lzX2luaXRfbW9kdWxlLHN5c19pbml0X21vZHVsZSxjb21wYXRfc3lzX2luaXRfbW9kdWxlKQotU1lTQ0FMTChzeXNfZGVsZXRlX21vZHVsZSxzeXNfZGVsZXRlX21vZHVsZSxjb21wYXRfc3lzX2RlbGV0ZV9tb2R1bGUpCi1OSV9TWVNDQUxMCQkJCQkJCS8qIDEzMDogb2xkIGdldF9rZXJuZWxfc3ltcyAqLwotU1lTQ0FMTChzeXNfcXVvdGFjdGwsc3lzX3F1b3RhY3RsLGNvbXBhdF9zeXNfcXVvdGFjdGwpCi1TWVNDQUxMKHN5c19nZXRwZ2lkLHN5c19nZXRwZ2lkLGNvbXBhdF9zeXNfZ2V0cGdpZCkKLVNZU0NBTEwoc3lzX2ZjaGRpcixzeXNfZmNoZGlyLGNvbXBhdF9zeXNfZmNoZGlyKQotU1lTQ0FMTChzeXNfYmRmbHVzaCxzeXNfYmRmbHVzaCxjb21wYXRfc3lzX2JkZmx1c2gpCi1TWVNDQUxMKHN5c19zeXNmcyxzeXNfc3lzZnMsY29tcGF0X3N5c19zeXNmcykJCS8qIDEzNSAqLwotU1lTQ0FMTChzeXNfcGVyc29uYWxpdHksc3lzX3MzOTBfcGVyc29uYWxpdHksY29tcGF0X3N5c19zMzkwX3BlcnNvbmFsaXR5KQotTklfU1lTQ0FMTAkJCQkJCQkvKiBmb3IgYWZzX3N5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3NldGZzdWlkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldGZzdWlkMTYpCS8qIG9sZCBzZXRmc3VpZDE2IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX3NldGZzZ2lkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldGZzZ2lkMTYpCS8qIG9sZCBzZXRmc2dpZDE2IHN5c2NhbGwgKi8KLVNZU0NBTEwoc3lzX2xsc2VlayxzeXNfbGxzZWVrLGNvbXBhdF9zeXNfbGxzZWVrKQkJLyogMTQwICovCi1TWVNDQUxMKHN5c19nZXRkZW50cyxzeXNfZ2V0ZGVudHMsY29tcGF0X3N5c19nZXRkZW50cykKLVNZU0NBTEwoc3lzX3NlbGVjdCxzeXNfc2VsZWN0LGNvbXBhdF9zeXNfc2VsZWN0KQotU1lTQ0FMTChzeXNfZmxvY2ssc3lzX2Zsb2NrLGNvbXBhdF9zeXNfZmxvY2spCi1TWVNDQUxMKHN5c19tc3luYyxzeXNfbXN5bmMsY29tcGF0X3N5c19tc3luYykKLVNZU0NBTEwoc3lzX3JlYWR2LHN5c19yZWFkdixjb21wYXRfc3lzX3JlYWR2KQkJLyogMTQ1ICovCi1TWVNDQUxMKHN5c193cml0ZXYsc3lzX3dyaXRldixjb21wYXRfc3lzX3dyaXRldikKLVNZU0NBTEwoc3lzX2dldHNpZCxzeXNfZ2V0c2lkLGNvbXBhdF9zeXNfZ2V0c2lkKQotU1lTQ0FMTChzeXNfZmRhdGFzeW5jLHN5c19mZGF0YXN5bmMsY29tcGF0X3N5c19mZGF0YXN5bmMpCi1TWVNDQUxMKHN5c19zeXNjdGwsc3lzX3N5c2N0bCxjb21wYXRfc3lzX3N5c2N0bCkKLVNZU0NBTEwoc3lzX21sb2NrLHN5c19tbG9jayxjb21wYXRfc3lzX21sb2NrKQkJCS8qIDE1MCAqLwotU1lTQ0FMTChzeXNfbXVubG9jayxzeXNfbXVubG9jayxjb21wYXRfc3lzX211bmxvY2spCi1TWVNDQUxMKHN5c19tbG9ja2FsbCxzeXNfbWxvY2thbGwsY29tcGF0X3N5c19tbG9ja2FsbCkKLVNZU0NBTEwoc3lzX211bmxvY2thbGwsc3lzX211bmxvY2thbGwsc3lzX211bmxvY2thbGwpCi1TWVNDQUxMKHN5c19zY2hlZF9zZXRwYXJhbSxzeXNfc2NoZWRfc2V0cGFyYW0sY29tcGF0X3N5c19zY2hlZF9zZXRwYXJhbSkKLVNZU0NBTEwoc3lzX3NjaGVkX2dldHBhcmFtLHN5c19zY2hlZF9nZXRwYXJhbSxjb21wYXRfc3lzX3NjaGVkX2dldHBhcmFtKQkvKiAxNTUgKi8KLVNZU0NBTEwoc3lzX3NjaGVkX3NldHNjaGVkdWxlcixzeXNfc2NoZWRfc2V0c2NoZWR1bGVyLGNvbXBhdF9zeXNfc2NoZWRfc2V0c2NoZWR1bGVyKQotU1lTQ0FMTChzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyLHN5c19zY2hlZF9nZXRzY2hlZHVsZXIsY29tcGF0X3N5c19zY2hlZF9nZXRzY2hlZHVsZXIpCi1TWVNDQUxMKHN5c19zY2hlZF95aWVsZCxzeXNfc2NoZWRfeWllbGQsc3lzX3NjaGVkX3lpZWxkKQotU1lTQ0FMTChzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCxzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21heCxjb21wYXRfc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgpCi1TWVNDQUxMKHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluLHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluLGNvbXBhdF9zeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbikJLyogMTYwICovCi1TWVNDQUxMKHN5c19zY2hlZF9ycl9nZXRfaW50ZXJ2YWwsc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbCxjb21wYXRfc3lzX3NjaGVkX3JyX2dldF9pbnRlcnZhbCkKLVNZU0NBTEwoc3lzX25hbm9zbGVlcCxzeXNfbmFub3NsZWVwLGNvbXBhdF9zeXNfbmFub3NsZWVwKQotU1lTQ0FMTChzeXNfbXJlbWFwLHN5c19tcmVtYXAsY29tcGF0X3N5c19tcmVtYXApCi1TWVNDQUxMKHN5c19zZXRyZXN1aWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0cmVzdWlkMTYpCS8qIG9sZCBzZXRyZXN1aWQxNiBzeXNjYWxsICovCi1TWVNDQUxMKHN5c19nZXRyZXN1aWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZ2V0cmVzdWlkMTYpCS8qIDE2NSBvbGQgZ2V0cmVzdWlkMTYgc3lzY2FsbCAqLwotTklfU1lTQ0FMTAkJCQkJCQkvKiBmb3Igdm04NiAqLwotTklfU1lTQ0FMTAkJCQkJCQkvKiBvbGQgc3lzX3F1ZXJ5X21vZHVsZSAqLwotU1lTQ0FMTChzeXNfcG9sbCxzeXNfcG9sbCxjb21wYXRfc3lzX3BvbGwpCi1OSV9TWVNDQUxMCQkJCQkJCS8qIG9sZCBuZnNzZXJ2Y3RsICovCi1TWVNDQUxMKHN5c19zZXRyZXNnaWQxNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0cmVzZ2lkMTYpCS8qIDE3MCBvbGQgc2V0cmVzZ2lkMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfZ2V0cmVzZ2lkMTYsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2dldHJlc2dpZDE2KQkvKiBvbGQgZ2V0cmVzZ2lkMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfcHJjdGwsc3lzX3ByY3RsLGNvbXBhdF9zeXNfcHJjdGwpCi1TWVNDQUxMKHN5c19ydF9zaWdyZXR1cm4sc3lzX3J0X3NpZ3JldHVybixjb21wYXRfc3lzX3J0X3NpZ3JldHVybikKLVNZU0NBTEwoc3lzX3J0X3NpZ2FjdGlvbixzeXNfcnRfc2lnYWN0aW9uLGNvbXBhdF9zeXNfcnRfc2lnYWN0aW9uKQotU1lTQ0FMTChzeXNfcnRfc2lncHJvY21hc2ssc3lzX3J0X3NpZ3Byb2NtYXNrLGNvbXBhdF9zeXNfcnRfc2lncHJvY21hc2spIC8qIDE3NSAqLwotU1lTQ0FMTChzeXNfcnRfc2lncGVuZGluZyxzeXNfcnRfc2lncGVuZGluZyxjb21wYXRfc3lzX3J0X3NpZ3BlbmRpbmcpCi1TWVNDQUxMKHN5c19ydF9zaWd0aW1lZHdhaXQsc3lzX3J0X3NpZ3RpbWVkd2FpdCxjb21wYXRfc3lzX3J0X3NpZ3RpbWVkd2FpdCkKLVNZU0NBTEwoc3lzX3J0X3NpZ3F1ZXVlaW5mbyxzeXNfcnRfc2lncXVldWVpbmZvLGNvbXBhdF9zeXNfcnRfc2lncXVldWVpbmZvKQotU1lTQ0FMTChzeXNfcnRfc2lnc3VzcGVuZCxzeXNfcnRfc2lnc3VzcGVuZCxjb21wYXRfc3lzX3J0X3NpZ3N1c3BlbmQpCi1TWVNDQUxMKHN5c19wcmVhZDY0LHN5c19wcmVhZDY0LGNvbXBhdF9zeXNfczM5MF9wcmVhZDY0KQkJLyogMTgwICovCi1TWVNDQUxMKHN5c19wd3JpdGU2NCxzeXNfcHdyaXRlNjQsY29tcGF0X3N5c19zMzkwX3B3cml0ZTY0KQotU1lTQ0FMTChzeXNfY2hvd24xNixzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfY2hvd24xNikJLyogb2xkIGNob3duMTYgc3lzY2FsbCAqLwotU1lTQ0FMTChzeXNfZ2V0Y3dkLHN5c19nZXRjd2QsY29tcGF0X3N5c19nZXRjd2QpCi1TWVNDQUxMKHN5c19jYXBnZXQsc3lzX2NhcGdldCxjb21wYXRfc3lzX2NhcGdldCkKLVNZU0NBTEwoc3lzX2NhcHNldCxzeXNfY2Fwc2V0LGNvbXBhdF9zeXNfY2Fwc2V0KQkJLyogMTg1ICovCi1TWVNDQUxMKHN5c19zaWdhbHRzdGFjayxzeXNfc2lnYWx0c3RhY2ssY29tcGF0X3N5c19zaWdhbHRzdGFjaykKLVNZU0NBTEwoc3lzX3NlbmRmaWxlLHN5c19zZW5kZmlsZTY0LGNvbXBhdF9zeXNfc2VuZGZpbGUpCi1OSV9TWVNDQUxMCQkJCQkJCS8qIHN0cmVhbXMxICovCi1OSV9TWVNDQUxMCQkJCQkJCS8qIHN0cmVhbXMyICovCi1TWVNDQUxMKHN5c192Zm9yayxzeXNfdmZvcmssc3lzX3Zmb3JrKQkJCQkvKiAxOTAgKi8KLVNZU0NBTEwoc3lzX2dldHJsaW1pdCxzeXNfZ2V0cmxpbWl0LGNvbXBhdF9zeXNfZ2V0cmxpbWl0KQotU1lTQ0FMTChzeXNfbW1hcDIsc3lzX21tYXAyLGNvbXBhdF9zeXNfczM5MF9tbWFwMikKLVNZU0NBTEwoc3lzX3RydW5jYXRlNjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3RydW5jYXRlNjQpCi1TWVNDQUxMKHN5c19mdHJ1bmNhdGU2NCxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZnRydW5jYXRlNjQpCi1TWVNDQUxMKHN5c19zdGF0NjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3N0YXQ2NCkJCS8qIDE5NSAqLwotU1lTQ0FMTChzeXNfbHN0YXQ2NCxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfbHN0YXQ2NCkKLVNZU0NBTEwoc3lzX2ZzdGF0NjQsc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2ZzdGF0NjQpCi1TWVNDQUxMKHN5c19sY2hvd24sc3lzX2xjaG93bixjb21wYXRfc3lzX2xjaG93bikKLVNZU0NBTEwoc3lzX2dldHVpZCxzeXNfZ2V0dWlkLHN5c19nZXR1aWQpCi1TWVNDQUxMKHN5c19nZXRnaWQsc3lzX2dldGdpZCxzeXNfZ2V0Z2lkKQkJCS8qIDIwMCAqLwotU1lTQ0FMTChzeXNfZ2V0ZXVpZCxzeXNfZ2V0ZXVpZCxzeXNfZ2V0ZXVpZCkKLVNZU0NBTEwoc3lzX2dldGVnaWQsc3lzX2dldGVnaWQsc3lzX2dldGVnaWQpCi1TWVNDQUxMKHN5c19zZXRyZXVpZCxzeXNfc2V0cmV1aWQsY29tcGF0X3N5c19zZXRyZXVpZCkKLVNZU0NBTEwoc3lzX3NldHJlZ2lkLHN5c19zZXRyZWdpZCxjb21wYXRfc3lzX3NldHJlZ2lkKQotU1lTQ0FMTChzeXNfZ2V0Z3JvdXBzLHN5c19nZXRncm91cHMsY29tcGF0X3N5c19nZXRncm91cHMpCS8qIDIwNSAqLwotU1lTQ0FMTChzeXNfc2V0Z3JvdXBzLHN5c19zZXRncm91cHMsY29tcGF0X3N5c19zZXRncm91cHMpCi1TWVNDQUxMKHN5c19mY2hvd24sc3lzX2ZjaG93bixjb21wYXRfc3lzX2ZjaG93bikKLVNZU0NBTEwoc3lzX3NldHJlc3VpZCxzeXNfc2V0cmVzdWlkLGNvbXBhdF9zeXNfc2V0cmVzdWlkKQotU1lTQ0FMTChzeXNfZ2V0cmVzdWlkLHN5c19nZXRyZXN1aWQsY29tcGF0X3N5c19nZXRyZXN1aWQpCi1TWVNDQUxMKHN5c19zZXRyZXNnaWQsc3lzX3NldHJlc2dpZCxjb21wYXRfc3lzX3NldHJlc2dpZCkJLyogMjEwICovCi1TWVNDQUxMKHN5c19nZXRyZXNnaWQsc3lzX2dldHJlc2dpZCxjb21wYXRfc3lzX2dldHJlc2dpZCkKLVNZU0NBTEwoc3lzX2Nob3duLHN5c19jaG93bixjb21wYXRfc3lzX2Nob3duKQotU1lTQ0FMTChzeXNfc2V0dWlkLHN5c19zZXR1aWQsY29tcGF0X3N5c19zZXR1aWQpCi1TWVNDQUxMKHN5c19zZXRnaWQsc3lzX3NldGdpZCxjb21wYXRfc3lzX3NldGdpZCkKLVNZU0NBTEwoc3lzX3NldGZzdWlkLHN5c19zZXRmc3VpZCxjb21wYXRfc3lzX3NldGZzdWlkKQkvKiAyMTUgKi8KLVNZU0NBTEwoc3lzX3NldGZzZ2lkLHN5c19zZXRmc2dpZCxjb21wYXRfc3lzX3NldGZzZ2lkKQotU1lTQ0FMTChzeXNfcGl2b3Rfcm9vdCxzeXNfcGl2b3Rfcm9vdCxjb21wYXRfc3lzX3Bpdm90X3Jvb3QpCi1TWVNDQUxMKHN5c19taW5jb3JlLHN5c19taW5jb3JlLGNvbXBhdF9zeXNfbWluY29yZSkKLVNZU0NBTEwoc3lzX21hZHZpc2Usc3lzX21hZHZpc2UsY29tcGF0X3N5c19tYWR2aXNlKQotU1lTQ0FMTChzeXNfZ2V0ZGVudHM2NCxzeXNfZ2V0ZGVudHM2NCxjb21wYXRfc3lzX2dldGRlbnRzNjQpCS8qIDIyMCAqLwotU1lTQ0FMTChzeXNfZmNudGw2NCxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX2ZjbnRsNjQpCi1TWVNDQUxMKHN5c19yZWFkYWhlYWQsc3lzX3JlYWRhaGVhZCxjb21wYXRfc3lzX3MzOTBfcmVhZGFoZWFkKQotU1lTQ0FMTChzeXNfc2VuZGZpbGU2NCxzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3NlbmRmaWxlNjQpCi1TWVNDQUxMKHN5c19zZXR4YXR0cixzeXNfc2V0eGF0dHIsY29tcGF0X3N5c19zZXR4YXR0cikKLVNZU0NBTEwoc3lzX2xzZXR4YXR0cixzeXNfbHNldHhhdHRyLGNvbXBhdF9zeXNfbHNldHhhdHRyKQkvKiAyMjUgKi8KLVNZU0NBTEwoc3lzX2ZzZXR4YXR0cixzeXNfZnNldHhhdHRyLGNvbXBhdF9zeXNfZnNldHhhdHRyKQotU1lTQ0FMTChzeXNfZ2V0eGF0dHIsc3lzX2dldHhhdHRyLGNvbXBhdF9zeXNfZ2V0eGF0dHIpCi1TWVNDQUxMKHN5c19sZ2V0eGF0dHIsc3lzX2xnZXR4YXR0cixjb21wYXRfc3lzX2xnZXR4YXR0cikKLVNZU0NBTEwoc3lzX2ZnZXR4YXR0cixzeXNfZmdldHhhdHRyLGNvbXBhdF9zeXNfZmdldHhhdHRyKQotU1lTQ0FMTChzeXNfbGlzdHhhdHRyLHN5c19saXN0eGF0dHIsY29tcGF0X3N5c19saXN0eGF0dHIpCS8qIDIzMCAqLwotU1lTQ0FMTChzeXNfbGxpc3R4YXR0cixzeXNfbGxpc3R4YXR0cixjb21wYXRfc3lzX2xsaXN0eGF0dHIpCi1TWVNDQUxMKHN5c19mbGlzdHhhdHRyLHN5c19mbGlzdHhhdHRyLGNvbXBhdF9zeXNfZmxpc3R4YXR0cikKLVNZU0NBTEwoc3lzX3JlbW92ZXhhdHRyLHN5c19yZW1vdmV4YXR0cixjb21wYXRfc3lzX3JlbW92ZXhhdHRyKQotU1lTQ0FMTChzeXNfbHJlbW92ZXhhdHRyLHN5c19scmVtb3ZleGF0dHIsY29tcGF0X3N5c19scmVtb3ZleGF0dHIpCi1TWVNDQUxMKHN5c19mcmVtb3ZleGF0dHIsc3lzX2ZyZW1vdmV4YXR0cixjb21wYXRfc3lzX2ZyZW1vdmV4YXR0cikJLyogMjM1ICovCi1TWVNDQUxMKHN5c19nZXR0aWQsc3lzX2dldHRpZCxzeXNfZ2V0dGlkKQotU1lTQ0FMTChzeXNfdGtpbGwsc3lzX3RraWxsLGNvbXBhdF9zeXNfdGtpbGwpCi1TWVNDQUxMKHN5c19mdXRleCxzeXNfZnV0ZXgsY29tcGF0X3N5c19mdXRleCkKLVNZU0NBTEwoc3lzX3NjaGVkX3NldGFmZmluaXR5LHN5c19zY2hlZF9zZXRhZmZpbml0eSxjb21wYXRfc3lzX3NjaGVkX3NldGFmZmluaXR5KQotU1lTQ0FMTChzeXNfc2NoZWRfZ2V0YWZmaW5pdHksc3lzX3NjaGVkX2dldGFmZmluaXR5LGNvbXBhdF9zeXNfc2NoZWRfZ2V0YWZmaW5pdHkpCS8qIDI0MCAqLwotU1lTQ0FMTChzeXNfdGdraWxsLHN5c190Z2tpbGwsY29tcGF0X3N5c190Z2tpbGwpCi1OSV9TWVNDQUxMCQkJCQkJCS8qIHJlc2VydmVkIGZvciBUVVggKi8KLVNZU0NBTEwoc3lzX2lvX3NldHVwLHN5c19pb19zZXR1cCxjb21wYXRfc3lzX2lvX3NldHVwKQotU1lTQ0FMTChzeXNfaW9fZGVzdHJveSxzeXNfaW9fZGVzdHJveSxjb21wYXRfc3lzX2lvX2Rlc3Ryb3kpCi1TWVNDQUxMKHN5c19pb19nZXRldmVudHMsc3lzX2lvX2dldGV2ZW50cyxjb21wYXRfc3lzX2lvX2dldGV2ZW50cykJLyogMjQ1ICovCi1TWVNDQUxMKHN5c19pb19zdWJtaXQsc3lzX2lvX3N1Ym1pdCxjb21wYXRfc3lzX2lvX3N1Ym1pdCkKLVNZU0NBTEwoc3lzX2lvX2NhbmNlbCxzeXNfaW9fY2FuY2VsLGNvbXBhdF9zeXNfaW9fY2FuY2VsKQotU1lTQ0FMTChzeXNfZXhpdF9ncm91cCxzeXNfZXhpdF9ncm91cCxjb21wYXRfc3lzX2V4aXRfZ3JvdXApCi1TWVNDQUxMKHN5c19lcG9sbF9jcmVhdGUsc3lzX2Vwb2xsX2NyZWF0ZSxjb21wYXRfc3lzX2Vwb2xsX2NyZWF0ZSkKLVNZU0NBTEwoc3lzX2Vwb2xsX2N0bCxzeXNfZXBvbGxfY3RsLGNvbXBhdF9zeXNfZXBvbGxfY3RsKQkvKiAyNTAgKi8KLVNZU0NBTEwoc3lzX2Vwb2xsX3dhaXQsc3lzX2Vwb2xsX3dhaXQsY29tcGF0X3N5c19lcG9sbF93YWl0KQotU1lTQ0FMTChzeXNfc2V0X3RpZF9hZGRyZXNzLHN5c19zZXRfdGlkX2FkZHJlc3MsY29tcGF0X3N5c19zZXRfdGlkX2FkZHJlc3MpCi1TWVNDQUxMKHN5c19zMzkwX2ZhZHZpc2U2NCxzeXNfZmFkdmlzZTY0XzY0LGNvbXBhdF9zeXNfczM5MF9mYWR2aXNlNjQpCi1TWVNDQUxMKHN5c190aW1lcl9jcmVhdGUsc3lzX3RpbWVyX2NyZWF0ZSxjb21wYXRfc3lzX3RpbWVyX2NyZWF0ZSkKLVNZU0NBTEwoc3lzX3RpbWVyX3NldHRpbWUsc3lzX3RpbWVyX3NldHRpbWUsY29tcGF0X3N5c190aW1lcl9zZXR0aW1lKQkvKiAyNTUgKi8KLVNZU0NBTEwoc3lzX3RpbWVyX2dldHRpbWUsc3lzX3RpbWVyX2dldHRpbWUsY29tcGF0X3N5c190aW1lcl9nZXR0aW1lKQotU1lTQ0FMTChzeXNfdGltZXJfZ2V0b3ZlcnJ1bixzeXNfdGltZXJfZ2V0b3ZlcnJ1bixjb21wYXRfc3lzX3RpbWVyX2dldG92ZXJydW4pCi1TWVNDQUxMKHN5c190aW1lcl9kZWxldGUsc3lzX3RpbWVyX2RlbGV0ZSxjb21wYXRfc3lzX3RpbWVyX2RlbGV0ZSkKLVNZU0NBTEwoc3lzX2Nsb2NrX3NldHRpbWUsc3lzX2Nsb2NrX3NldHRpbWUsY29tcGF0X3N5c19jbG9ja19zZXR0aW1lKQotU1lTQ0FMTChzeXNfY2xvY2tfZ2V0dGltZSxzeXNfY2xvY2tfZ2V0dGltZSxjb21wYXRfc3lzX2Nsb2NrX2dldHRpbWUpCS8qIDI2MCAqLwotU1lTQ0FMTChzeXNfY2xvY2tfZ2V0cmVzLHN5c19jbG9ja19nZXRyZXMsY29tcGF0X3N5c19jbG9ja19nZXRyZXMpCi1TWVNDQUxMKHN5c19jbG9ja19uYW5vc2xlZXAsc3lzX2Nsb2NrX25hbm9zbGVlcCxjb21wYXRfc3lzX2Nsb2NrX25hbm9zbGVlcCkKLU5JX1NZU0NBTEwJCQkJCQkJLyogcmVzZXJ2ZWQgZm9yIHZzZXJ2ZXIgKi8KLVNZU0NBTEwoc3lzX3MzOTBfZmFkdmlzZTY0XzY0LHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9mYWR2aXNlNjRfNjQpCi1TWVNDQUxMKHN5c19zdGF0ZnM2NCxzeXNfc3RhdGZzNjQsY29tcGF0X3N5c19zdGF0ZnM2NCkKLVNZU0NBTEwoc3lzX2ZzdGF0ZnM2NCxzeXNfZnN0YXRmczY0LGNvbXBhdF9zeXNfZnN0YXRmczY0KQotU1lTQ0FMTChzeXNfcmVtYXBfZmlsZV9wYWdlcyxzeXNfcmVtYXBfZmlsZV9wYWdlcyxjb21wYXRfc3lzX3JlbWFwX2ZpbGVfcGFnZXMpCi1OSV9TWVNDQUxMCQkJCQkJCS8qIDI2OCBzeXNfbWJpbmQgKi8KLU5JX1NZU0NBTEwJCQkJCQkJLyogMjY5IHN5c19nZXRfbWVtcG9saWN5ICovCi1OSV9TWVNDQUxMCQkJCQkJCS8qIDI3MCBzeXNfc2V0X21lbXBvbGljeSAqLwotU1lTQ0FMTChzeXNfbXFfb3BlbixzeXNfbXFfb3Blbixjb21wYXRfc3lzX21xX29wZW4pCi1TWVNDQUxMKHN5c19tcV91bmxpbmssc3lzX21xX3VubGluayxjb21wYXRfc3lzX21xX3VubGluaykKLVNZU0NBTEwoc3lzX21xX3RpbWVkc2VuZCxzeXNfbXFfdGltZWRzZW5kLGNvbXBhdF9zeXNfbXFfdGltZWRzZW5kKQotU1lTQ0FMTChzeXNfbXFfdGltZWRyZWNlaXZlLHN5c19tcV90aW1lZHJlY2VpdmUsY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmUpCi1TWVNDQUxMKHN5c19tcV9ub3RpZnksc3lzX21xX25vdGlmeSxjb21wYXRfc3lzX21xX25vdGlmeSkgLyogMjc1ICovCi1TWVNDQUxMKHN5c19tcV9nZXRzZXRhdHRyLHN5c19tcV9nZXRzZXRhdHRyLGNvbXBhdF9zeXNfbXFfZ2V0c2V0YXR0cikKLVNZU0NBTEwoc3lzX2tleGVjX2xvYWQsc3lzX2tleGVjX2xvYWQsY29tcGF0X3N5c19rZXhlY19sb2FkKQotU1lTQ0FMTChzeXNfYWRkX2tleSxzeXNfYWRkX2tleSxjb21wYXRfc3lzX2FkZF9rZXkpCi1TWVNDQUxMKHN5c19yZXF1ZXN0X2tleSxzeXNfcmVxdWVzdF9rZXksY29tcGF0X3N5c19yZXF1ZXN0X2tleSkKLVNZU0NBTEwoc3lzX2tleWN0bCxzeXNfa2V5Y3RsLGNvbXBhdF9zeXNfa2V5Y3RsKQkJLyogMjgwICovCi1TWVNDQUxMKHN5c193YWl0aWQsc3lzX3dhaXRpZCxjb21wYXRfc3lzX3dhaXRpZCkKLVNZU0NBTEwoc3lzX2lvcHJpb19zZXQsc3lzX2lvcHJpb19zZXQsY29tcGF0X3N5c19pb3ByaW9fc2V0KQotU1lTQ0FMTChzeXNfaW9wcmlvX2dldCxzeXNfaW9wcmlvX2dldCxjb21wYXRfc3lzX2lvcHJpb19nZXQpCi1TWVNDQUxMKHN5c19pbm90aWZ5X2luaXQsc3lzX2lub3RpZnlfaW5pdCxzeXNfaW5vdGlmeV9pbml0KQotU1lTQ0FMTChzeXNfaW5vdGlmeV9hZGRfd2F0Y2gsc3lzX2lub3RpZnlfYWRkX3dhdGNoLGNvbXBhdF9zeXNfaW5vdGlmeV9hZGRfd2F0Y2gpCS8qIDI4NSAqLwotU1lTQ0FMTChzeXNfaW5vdGlmeV9ybV93YXRjaCxzeXNfaW5vdGlmeV9ybV93YXRjaCxjb21wYXRfc3lzX2lub3RpZnlfcm1fd2F0Y2gpCi1OSV9TWVNDQUxMCQkJCQkJCS8qIDI4NyBzeXNfbWlncmF0ZV9wYWdlcyAqLwotU1lTQ0FMTChzeXNfb3BlbmF0LHN5c19vcGVuYXQsY29tcGF0X3N5c19vcGVuYXQpCi1TWVNDQUxMKHN5c19ta2RpcmF0LHN5c19ta2RpcmF0LGNvbXBhdF9zeXNfbWtkaXJhdCkKLVNZU0NBTEwoc3lzX21rbm9kYXQsc3lzX21rbm9kYXQsY29tcGF0X3N5c19ta25vZGF0KQkvKiAyOTAgKi8KLVNZU0NBTEwoc3lzX2ZjaG93bmF0LHN5c19mY2hvd25hdCxjb21wYXRfc3lzX2ZjaG93bmF0KQotU1lTQ0FMTChzeXNfZnV0aW1lc2F0LHN5c19mdXRpbWVzYXQsY29tcGF0X3N5c19mdXRpbWVzYXQpCi1TWVNDQUxMKHN5c19mc3RhdGF0NjQsc3lzX25ld2ZzdGF0YXQsY29tcGF0X3N5c19zMzkwX2ZzdGF0YXQ2NCkKLVNZU0NBTEwoc3lzX3VubGlua2F0LHN5c191bmxpbmthdCxjb21wYXRfc3lzX3VubGlua2F0KQotU1lTQ0FMTChzeXNfcmVuYW1lYXQsc3lzX3JlbmFtZWF0LGNvbXBhdF9zeXNfcmVuYW1lYXQpCS8qIDI5NSAqLwotU1lTQ0FMTChzeXNfbGlua2F0LHN5c19saW5rYXQsY29tcGF0X3N5c19saW5rYXQpCi1TWVNDQUxMKHN5c19zeW1saW5rYXQsc3lzX3N5bWxpbmthdCxjb21wYXRfc3lzX3N5bWxpbmthdCkKLVNZU0NBTEwoc3lzX3JlYWRsaW5rYXQsc3lzX3JlYWRsaW5rYXQsY29tcGF0X3N5c19yZWFkbGlua2F0KQotU1lTQ0FMTChzeXNfZmNobW9kYXQsc3lzX2ZjaG1vZGF0LGNvbXBhdF9zeXNfZmNobW9kYXQpCi1TWVNDQUxMKHN5c19mYWNjZXNzYXQsc3lzX2ZhY2Nlc3NhdCxjb21wYXRfc3lzX2ZhY2Nlc3NhdCkJLyogMzAwICovCi1TWVNDQUxMKHN5c19wc2VsZWN0NixzeXNfcHNlbGVjdDYsY29tcGF0X3N5c19wc2VsZWN0NikKLVNZU0NBTEwoc3lzX3Bwb2xsLHN5c19wcG9sbCxjb21wYXRfc3lzX3Bwb2xsKQotU1lTQ0FMTChzeXNfdW5zaGFyZSxzeXNfdW5zaGFyZSxjb21wYXRfc3lzX3Vuc2hhcmUpCi1TWVNDQUxMKHN5c19zZXRfcm9idXN0X2xpc3Qsc3lzX3NldF9yb2J1c3RfbGlzdCxjb21wYXRfc3lzX3NldF9yb2J1c3RfbGlzdCkKLVNZU0NBTEwoc3lzX2dldF9yb2J1c3RfbGlzdCxzeXNfZ2V0X3JvYnVzdF9saXN0LGNvbXBhdF9zeXNfZ2V0X3JvYnVzdF9saXN0KQotU1lTQ0FMTChzeXNfc3BsaWNlLHN5c19zcGxpY2UsY29tcGF0X3N5c19zcGxpY2UpCi1TWVNDQUxMKHN5c19zeW5jX2ZpbGVfcmFuZ2Usc3lzX3N5bmNfZmlsZV9yYW5nZSxjb21wYXRfc3lzX3MzOTBfc3luY19maWxlX3JhbmdlKQotU1lTQ0FMTChzeXNfdGVlLHN5c190ZWUsY29tcGF0X3N5c190ZWUpCi1TWVNDQUxMKHN5c192bXNwbGljZSxzeXNfdm1zcGxpY2UsY29tcGF0X3N5c192bXNwbGljZSkKLU5JX1NZU0NBTEwJCQkJCQkJLyogMzEwIHN5c19tb3ZlX3BhZ2VzICovCi1TWVNDQUxMKHN5c19nZXRjcHUsc3lzX2dldGNwdSxjb21wYXRfc3lzX2dldGNwdSkKLVNZU0NBTEwoc3lzX2Vwb2xsX3B3YWl0LHN5c19lcG9sbF9wd2FpdCxjb21wYXRfc3lzX2Vwb2xsX3B3YWl0KQotU1lTQ0FMTChzeXNfdXRpbWVzLHN5c191dGltZXMsY29tcGF0X3N5c191dGltZXMpCi1TWVNDQUxMKHN5c19zMzkwX2ZhbGxvY2F0ZSxzeXNfZmFsbG9jYXRlLGNvbXBhdF9zeXNfczM5MF9mYWxsb2NhdGUpCi1TWVNDQUxMKHN5c191dGltZW5zYXQsc3lzX3V0aW1lbnNhdCxjb21wYXRfc3lzX3V0aW1lbnNhdCkJLyogMzE1ICovCi1TWVNDQUxMKHN5c19zaWduYWxmZCxzeXNfc2lnbmFsZmQsY29tcGF0X3N5c19zaWduYWxmZCkKK05JX1NZU0NBTEwJCQkJCQkvKiAwICovCitTWVNDQUxMKHN5c19leGl0LGNvbXBhdF9zeXNfZXhpdCkKK1NZU0NBTEwoc3lzX2Zvcmssc3lzX2ZvcmspCitTWVNDQUxMKHN5c19yZWFkLGNvbXBhdF9zeXNfczM5MF9yZWFkKQorU1lTQ0FMTChzeXNfd3JpdGUsY29tcGF0X3N5c19zMzkwX3dyaXRlKQorU1lTQ0FMTChzeXNfb3Blbixjb21wYXRfc3lzX29wZW4pCQkJLyogNSAqLworU1lTQ0FMTChzeXNfY2xvc2UsY29tcGF0X3N5c19jbG9zZSkKK1NZU0NBTEwoc3lzX3Jlc3RhcnRfc3lzY2FsbCxzeXNfcmVzdGFydF9zeXNjYWxsKQorU1lTQ0FMTChzeXNfY3JlYXQsY29tcGF0X3N5c19jcmVhdCkKK1NZU0NBTEwoc3lzX2xpbmssY29tcGF0X3N5c19saW5rKQorU1lTQ0FMTChzeXNfdW5saW5rLGNvbXBhdF9zeXNfdW5saW5rKQkJCS8qIDEwICovCitTWVNDQUxMKHN5c19leGVjdmUsY29tcGF0X3N5c19leGVjdmUpCitTWVNDQUxMKHN5c19jaGRpcixjb21wYXRfc3lzX2NoZGlyKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3RpbWUpCQkJLyogb2xkIHRpbWUgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfbWtub2QsY29tcGF0X3N5c19ta25vZCkKK1NZU0NBTEwoc3lzX2NobW9kLGNvbXBhdF9zeXNfY2htb2QpCQkJLyogMTUgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2xjaG93bjE2KQkvKiBvbGQgbGNob3duMTYgc3lzY2FsbCovCitOSV9TWVNDQUxMCQkJCQkJLyogb2xkIGJyZWFrIHN5c2NhbGwgaG9sZGVyICovCitOSV9TWVNDQUxMCQkJCQkJLyogb2xkIHN0YXQgc3lzY2FsbCBob2xkZXIgKi8KK1NZU0NBTEwoc3lzX2xzZWVrLGNvbXBhdF9zeXNfbHNlZWspCitTWVNDQUxMKHN5c19nZXRwaWQsc3lzX2dldHBpZCkJCQkJLyogMjAgKi8KK1NZU0NBTEwoc3lzX21vdW50LGNvbXBhdF9zeXNfbW91bnQpCitTWVNDQUxMKHN5c19vbGR1bW91bnQsY29tcGF0X3N5c19vbGR1bW91bnQpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9zZXR1aWQxNikJLyogb2xkIHNldHVpZDE2IHN5c2NhbGwqLworU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZ2V0dWlkMTYpCS8qIG9sZCBnZXR1aWQxNiBzeXNjYWxsKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zdGltZSkJCS8qIDI1IG9sZCBzdGltZSBzeXNjYWxsICovCitTWVNDQUxMKHN5c19wdHJhY2UsY29tcGF0X3N5c19wdHJhY2UpCitTWVNDQUxMKHN5c19hbGFybSxjb21wYXRfc3lzX2FsYXJtKQorTklfU1lTQ0FMTAkJCQkJCS8qIG9sZCBmc3RhdCBzeXNjYWxsICovCitTWVNDQUxMKHN5c19wYXVzZSxzeXNfcGF1c2UpCitTWVNDQUxMKHN5c191dGltZSxjb21wYXRfc3lzX3V0aW1lKQkJCS8qIDMwICovCitOSV9TWVNDQUxMCQkJCQkJLyogb2xkIHN0dHkgc3lzY2FsbCAqLworTklfU1lTQ0FMTAkJCQkJCS8qIG9sZCBndHR5IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX2FjY2Vzcyxjb21wYXRfc3lzX2FjY2VzcykKK1NZU0NBTEwoc3lzX25pY2UsY29tcGF0X3N5c19uaWNlKQorTklfU1lTQ0FMTAkJCQkJCS8qIDM1IG9sZCBmdGltZSBzeXNjYWxsICovCitTWVNDQUxMKHN5c19zeW5jLHN5c19zeW5jKQorU1lTQ0FMTChzeXNfa2lsbCxjb21wYXRfc3lzX2tpbGwpCitTWVNDQUxMKHN5c19yZW5hbWUsY29tcGF0X3N5c19yZW5hbWUpCitTWVNDQUxMKHN5c19ta2Rpcixjb21wYXRfc3lzX21rZGlyKQorU1lTQ0FMTChzeXNfcm1kaXIsY29tcGF0X3N5c19ybWRpcikJCQkvKiA0MCAqLworU1lTQ0FMTChzeXNfZHVwLGNvbXBhdF9zeXNfZHVwKQorU1lTQ0FMTChzeXNfcGlwZSxjb21wYXRfc3lzX3BpcGUpCitTWVNDQUxMKHN5c190aW1lcyxjb21wYXRfc3lzX3RpbWVzKQorTklfU1lTQ0FMTAkJCQkJCS8qIG9sZCBwcm9mIHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX2Jyayxjb21wYXRfc3lzX2JyaykJCQkJLyogNDUgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldGdpZDE2KQkvKiBvbGQgc2V0Z2lkMTYgc3lzY2FsbCovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9nZXRnaWQxNikJLyogb2xkIGdldGdpZDE2IHN5c2NhbGwqLworU1lTQ0FMTChzeXNfc2lnbmFsLGNvbXBhdF9zeXNfc2lnbmFsKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZ2V0ZXVpZDE2KQkvKiBvbGQgZ2V0ZXVpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2dldGVnaWQxNikJLyogNTAgb2xkIGdldGVnaWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19hY2N0LGNvbXBhdF9zeXNfYWNjdCkKK1NZU0NBTEwoc3lzX3Vtb3VudCxjb21wYXRfc3lzX3Vtb3VudCkKK05JX1NZU0NBTEwJCQkJCQkvKiBvbGQgbG9jayBzeXNjYWxsICovCitTWVNDQUxMKHN5c19pb2N0bCxjb21wYXRfc3lzX2lvY3RsKQorU1lTQ0FMTChzeXNfZmNudGwsY29tcGF0X3N5c19mY250bCkJCQkvKiA1NSAqLworTklfU1lTQ0FMTAkJCQkJCS8qIGludGVsIG1weCBzeXNjYWxsICovCitTWVNDQUxMKHN5c19zZXRwZ2lkLGNvbXBhdF9zeXNfc2V0cGdpZCkKK05JX1NZU0NBTEwJCQkJCQkvKiBvbGQgdWxpbWl0IHN5c2NhbGwgKi8KK05JX1NZU0NBTEwJCQkJCQkvKiBvbGQgdW5hbWUgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfdW1hc2ssY29tcGF0X3N5c191bWFzaykJCQkvKiA2MCAqLworU1lTQ0FMTChzeXNfY2hyb290LGNvbXBhdF9zeXNfY2hyb290KQorU1lTQ0FMTChzeXNfdXN0YXQsY29tcGF0X3N5c191c3RhdCkKK1NZU0NBTEwoc3lzX2R1cDIsY29tcGF0X3N5c19kdXAyKQorU1lTQ0FMTChzeXNfZ2V0cHBpZCxzeXNfZ2V0cHBpZCkKK1NZU0NBTEwoc3lzX2dldHBncnAsc3lzX2dldHBncnApCQkJLyogNjUgKi8KK1NZU0NBTEwoc3lzX3NldHNpZCxzeXNfc2V0c2lkKQorU1lTQ0FMTChzeXNfc2lnYWN0aW9uLGNvbXBhdF9zeXNfc2lnYWN0aW9uKQorTklfU1lTQ0FMTAkJCQkJCS8qIG9sZCBzZ2V0bWFzayBzeXNjYWxsKi8KK05JX1NZU0NBTEwJCQkJCQkvKiBvbGQgc3NldG1hc2sgc3lzY2FsbCovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9zZXRyZXVpZDE2KQkvKiBvbGQgc2V0cmV1aWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9zZXRyZWdpZDE2KQkvKiBvbGQgc2V0cmVnaWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19zaWdzdXNwZW5kLGNvbXBhdF9zeXNfc2lnc3VzcGVuZCkKK1NZU0NBTEwoc3lzX3NpZ3BlbmRpbmcsY29tcGF0X3N5c19zaWdwZW5kaW5nKQorU1lTQ0FMTChzeXNfc2V0aG9zdG5hbWUsY29tcGF0X3N5c19zZXRob3N0bmFtZSkKK1NZU0NBTEwoc3lzX3NldHJsaW1pdCxjb21wYXRfc3lzX3NldHJsaW1pdCkJCS8qIDc1ICovCitTWVNDQUxMKHN5c19nZXRybGltaXQsY29tcGF0X3N5c19vbGRfZ2V0cmxpbWl0KQorU1lTQ0FMTChzeXNfZ2V0cnVzYWdlLGNvbXBhdF9zeXNfZ2V0cnVzYWdlKQorU1lTQ0FMTChzeXNfZ2V0dGltZW9mZGF5LGNvbXBhdF9zeXNfZ2V0dGltZW9mZGF5KQorU1lTQ0FMTChzeXNfc2V0dGltZW9mZGF5LGNvbXBhdF9zeXNfc2V0dGltZW9mZGF5KQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZ2V0Z3JvdXBzMTYpCS8qIDgwIG9sZCBnZXRncm91cHMxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9zZXRncm91cHMxNikJLyogb2xkIHNldGdyb3VwczE2IHN5c2NhbGwgKi8KK05JX1NZU0NBTEwJCQkJCQkvKiBvbGQgc2VsZWN0IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX3N5bWxpbmssY29tcGF0X3N5c19zeW1saW5rKQorTklfU1lTQ0FMTAkJCQkJCS8qIG9sZCBsc3RhdCBzeXNjYWxsICovCitTWVNDQUxMKHN5c19yZWFkbGluayxjb21wYXRfc3lzX3JlYWRsaW5rKQkJLyogODUgKi8KK1NZU0NBTEwoc3lzX3VzZWxpYixjb21wYXRfc3lzX3VzZWxpYikKK1NZU0NBTEwoc3lzX3N3YXBvbixjb21wYXRfc3lzX3N3YXBvbikKK1NZU0NBTEwoc3lzX3JlYm9vdCxjb21wYXRfc3lzX3JlYm9vdCkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19vbGRfcmVhZGRpcikJCS8qIG9sZCByZWFkZGlyIHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX29sZF9tbWFwLGNvbXBhdF9zeXNfczM5MF9vbGRfbW1hcCkJCS8qIDkwICovCitTWVNDQUxMKHN5c19tdW5tYXAsY29tcGF0X3N5c19tdW5tYXApCitTWVNDQUxMKHN5c190cnVuY2F0ZSxjb21wYXRfc3lzX3RydW5jYXRlKQorU1lTQ0FMTChzeXNfZnRydW5jYXRlLGNvbXBhdF9zeXNfZnRydW5jYXRlKQorU1lTQ0FMTChzeXNfZmNobW9kLGNvbXBhdF9zeXNfZmNobW9kKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZmNob3duMTYpCS8qIDk1IG9sZCBmY2hvd24xNiBzeXNjYWxsKi8KK1NZU0NBTEwoc3lzX2dldHByaW9yaXR5LGNvbXBhdF9zeXNfZ2V0cHJpb3JpdHkpCitTWVNDQUxMKHN5c19zZXRwcmlvcml0eSxjb21wYXRfc3lzX3NldHByaW9yaXR5KQorTklfU1lTQ0FMTAkJCQkJCS8qIG9sZCBwcm9maWwgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfc3RhdGZzLGNvbXBhdF9zeXNfc3RhdGZzKQorU1lTQ0FMTChzeXNfZnN0YXRmcyxjb21wYXRfc3lzX2ZzdGF0ZnMpCQkJLyogMTAwICovCitOSV9TWVNDQUxMCQkJCQkJLyogaW9wZXJtIGZvciBpMzg2ICovCitTWVNDQUxMKHN5c19zb2NrZXRjYWxsLGNvbXBhdF9zeXNfc29ja2V0Y2FsbCkKK1NZU0NBTEwoc3lzX3N5c2xvZyxjb21wYXRfc3lzX3N5c2xvZykKK1NZU0NBTEwoc3lzX3NldGl0aW1lcixjb21wYXRfc3lzX3NldGl0aW1lcikKK1NZU0NBTEwoc3lzX2dldGl0aW1lcixjb21wYXRfc3lzX2dldGl0aW1lcikJCS8qIDEwNSAqLworU1lTQ0FMTChzeXNfbmV3c3RhdCxjb21wYXRfc3lzX25ld3N0YXQpCitTWVNDQUxMKHN5c19uZXdsc3RhdCxjb21wYXRfc3lzX25ld2xzdGF0KQorU1lTQ0FMTChzeXNfbmV3ZnN0YXQsY29tcGF0X3N5c19uZXdmc3RhdCkKK05JX1NZU0NBTEwJCQkJCQkvKiBvbGQgdW5hbWUgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfbG9va3VwX2Rjb29raWUsY29tcGF0X3N5c19sb29rdXBfZGNvb2tpZSkJLyogMTEwICovCitTWVNDQUxMKHN5c192aGFuZ3VwLHN5c192aGFuZ3VwKQorTklfU1lTQ0FMTAkJCQkJCS8qIG9sZCAiaWRsZSIgc3lzdGVtIGNhbGwgKi8KK05JX1NZU0NBTEwJCQkJCQkvKiB2bTg2b2xkIGZvciBpMzg2ICovCitTWVNDQUxMKHN5c193YWl0NCxjb21wYXRfc3lzX3dhaXQ0KQorU1lTQ0FMTChzeXNfc3dhcG9mZixjb21wYXRfc3lzX3N3YXBvZmYpCQkJLyogMTE1ICovCitTWVNDQUxMKHN5c19zeXNpbmZvLGNvbXBhdF9zeXNfc3lzaW5mbykKK1NZU0NBTEwoc3lzX3MzOTBfaXBjLGNvbXBhdF9zeXNfczM5MF9pcGMpCitTWVNDQUxMKHN5c19mc3luYyxjb21wYXRfc3lzX2ZzeW5jKQorU1lTQ0FMTChzeXNfc2lncmV0dXJuLGNvbXBhdF9zeXNfc2lncmV0dXJuKQorU1lTQ0FMTChzeXNfY2xvbmUsY29tcGF0X3N5c19jbG9uZSkJCQkvKiAxMjAgKi8KK1NZU0NBTEwoc3lzX3NldGRvbWFpbm5hbWUsY29tcGF0X3N5c19zZXRkb21haW5uYW1lKQorU1lTQ0FMTChzeXNfbmV3dW5hbWUsY29tcGF0X3N5c19uZXd1bmFtZSkKK05JX1NZU0NBTEwJCQkJCQkvKiBtb2RpZnlfbGR0IGZvciBpMzg2ICovCitTWVNDQUxMKHN5c19hZGp0aW1leCxjb21wYXRfc3lzX2FkanRpbWV4KQorU1lTQ0FMTChzeXNfbXByb3RlY3QsY29tcGF0X3N5c19tcHJvdGVjdCkJCS8qIDEyNSAqLworU1lTQ0FMTChzeXNfc2lncHJvY21hc2ssY29tcGF0X3N5c19zaWdwcm9jbWFzaykKK05JX1NZU0NBTEwJCQkJCQkvKiBvbGQgImNyZWF0ZSBtb2R1bGUiICovCitTWVNDQUxMKHN5c19pbml0X21vZHVsZSxjb21wYXRfc3lzX2luaXRfbW9kdWxlKQorU1lTQ0FMTChzeXNfZGVsZXRlX21vZHVsZSxjb21wYXRfc3lzX2RlbGV0ZV9tb2R1bGUpCitOSV9TWVNDQUxMCQkJCQkJLyogMTMwOiBvbGQgZ2V0X2tlcm5lbF9zeW1zICovCitTWVNDQUxMKHN5c19xdW90YWN0bCxjb21wYXRfc3lzX3F1b3RhY3RsKQorU1lTQ0FMTChzeXNfZ2V0cGdpZCxjb21wYXRfc3lzX2dldHBnaWQpCitTWVNDQUxMKHN5c19mY2hkaXIsY29tcGF0X3N5c19mY2hkaXIpCitTWVNDQUxMKHN5c19iZGZsdXNoLGNvbXBhdF9zeXNfYmRmbHVzaCkKK1NZU0NBTEwoc3lzX3N5c2ZzLGNvbXBhdF9zeXNfc3lzZnMpCQkJLyogMTM1ICovCitTWVNDQUxMKHN5c19zMzkwX3BlcnNvbmFsaXR5LGNvbXBhdF9zeXNfczM5MF9wZXJzb25hbGl0eSkKK05JX1NZU0NBTEwJCQkJCQkvKiBmb3IgYWZzX3N5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldGZzdWlkMTYpCS8qIG9sZCBzZXRmc3VpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldGZzZ2lkMTYpCS8qIG9sZCBzZXRmc2dpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX2xsc2Vlayxjb21wYXRfc3lzX2xsc2VlaykJCQkvKiAxNDAgKi8KK1NZU0NBTEwoc3lzX2dldGRlbnRzLGNvbXBhdF9zeXNfZ2V0ZGVudHMpCitTWVNDQUxMKHN5c19zZWxlY3QsY29tcGF0X3N5c19zZWxlY3QpCitTWVNDQUxMKHN5c19mbG9jayxjb21wYXRfc3lzX2Zsb2NrKQorU1lTQ0FMTChzeXNfbXN5bmMsY29tcGF0X3N5c19tc3luYykKK1NZU0NBTEwoc3lzX3JlYWR2LGNvbXBhdF9zeXNfcmVhZHYpCQkJLyogMTQ1ICovCitTWVNDQUxMKHN5c193cml0ZXYsY29tcGF0X3N5c193cml0ZXYpCitTWVNDQUxMKHN5c19nZXRzaWQsY29tcGF0X3N5c19nZXRzaWQpCitTWVNDQUxMKHN5c19mZGF0YXN5bmMsY29tcGF0X3N5c19mZGF0YXN5bmMpCitTWVNDQUxMKHN5c19zeXNjdGwsY29tcGF0X3N5c19zeXNjdGwpCitTWVNDQUxMKHN5c19tbG9jayxjb21wYXRfc3lzX21sb2NrKQkJCS8qIDE1MCAqLworU1lTQ0FMTChzeXNfbXVubG9jayxjb21wYXRfc3lzX211bmxvY2spCitTWVNDQUxMKHN5c19tbG9ja2FsbCxjb21wYXRfc3lzX21sb2NrYWxsKQorU1lTQ0FMTChzeXNfbXVubG9ja2FsbCxzeXNfbXVubG9ja2FsbCkKK1NZU0NBTEwoc3lzX3NjaGVkX3NldHBhcmFtLGNvbXBhdF9zeXNfc2NoZWRfc2V0cGFyYW0pCitTWVNDQUxMKHN5c19zY2hlZF9nZXRwYXJhbSxjb21wYXRfc3lzX3NjaGVkX2dldHBhcmFtKQkvKiAxNTUgKi8KK1NZU0NBTEwoc3lzX3NjaGVkX3NldHNjaGVkdWxlcixjb21wYXRfc3lzX3NjaGVkX3NldHNjaGVkdWxlcikKK1NZU0NBTEwoc3lzX3NjaGVkX2dldHNjaGVkdWxlcixjb21wYXRfc3lzX3NjaGVkX2dldHNjaGVkdWxlcikKK1NZU0NBTEwoc3lzX3NjaGVkX3lpZWxkLHN5c19zY2hlZF95aWVsZCkKK1NZU0NBTEwoc3lzX3NjaGVkX2dldF9wcmlvcml0eV9tYXgsY29tcGF0X3N5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4KQorU1lTQ0FMTChzeXNfc2NoZWRfZ2V0X3ByaW9yaXR5X21pbixjb21wYXRfc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4pCS8qIDE2MCAqLworU1lTQ0FMTChzeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsLGNvbXBhdF9zeXNfc2NoZWRfcnJfZ2V0X2ludGVydmFsKQorU1lTQ0FMTChzeXNfbmFub3NsZWVwLGNvbXBhdF9zeXNfbmFub3NsZWVwKQorU1lTQ0FMTChzeXNfbXJlbWFwLGNvbXBhdF9zeXNfbXJlbWFwKQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfc2V0cmVzdWlkMTYpCS8qIG9sZCBzZXRyZXN1aWQxNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9nZXRyZXN1aWQxNikJLyogMTY1IG9sZCBnZXRyZXN1aWQxNiBzeXNjYWxsICovCitOSV9TWVNDQUxMCQkJCQkJLyogZm9yIHZtODYgKi8KK05JX1NZU0NBTEwJCQkJCQkvKiBvbGQgc3lzX3F1ZXJ5X21vZHVsZSAqLworU1lTQ0FMTChzeXNfcG9sbCxjb21wYXRfc3lzX3BvbGwpCitOSV9TWVNDQUxMCQkJCQkJLyogb2xkIG5mc3NlcnZjdGwgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX3NldHJlc2dpZDE2KQkvKiAxNzAgb2xkIHNldHJlc2dpZDE2IHN5c2NhbGwgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2dldHJlc2dpZDE2KQkvKiBvbGQgZ2V0cmVzZ2lkMTYgc3lzY2FsbCAqLworU1lTQ0FMTChzeXNfcHJjdGwsY29tcGF0X3N5c19wcmN0bCkKK1NZU0NBTEwoc3lzX3J0X3NpZ3JldHVybixjb21wYXRfc3lzX3J0X3NpZ3JldHVybikKK1NZU0NBTEwoc3lzX3J0X3NpZ2FjdGlvbixjb21wYXRfc3lzX3J0X3NpZ2FjdGlvbikKK1NZU0NBTEwoc3lzX3J0X3NpZ3Byb2NtYXNrLGNvbXBhdF9zeXNfcnRfc2lncHJvY21hc2spCS8qIDE3NSAqLworU1lTQ0FMTChzeXNfcnRfc2lncGVuZGluZyxjb21wYXRfc3lzX3J0X3NpZ3BlbmRpbmcpCitTWVNDQUxMKHN5c19ydF9zaWd0aW1lZHdhaXQsY29tcGF0X3N5c19ydF9zaWd0aW1lZHdhaXQpCitTWVNDQUxMKHN5c19ydF9zaWdxdWV1ZWluZm8sY29tcGF0X3N5c19ydF9zaWdxdWV1ZWluZm8pCitTWVNDQUxMKHN5c19ydF9zaWdzdXNwZW5kLGNvbXBhdF9zeXNfcnRfc2lnc3VzcGVuZCkKK1NZU0NBTEwoc3lzX3ByZWFkNjQsY29tcGF0X3N5c19zMzkwX3ByZWFkNjQpCQkvKiAxODAgKi8KK1NZU0NBTEwoc3lzX3B3cml0ZTY0LGNvbXBhdF9zeXNfczM5MF9wd3JpdGU2NCkKK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2Nob3duMTYpCQkvKiBvbGQgY2hvd24xNiBzeXNjYWxsICovCitTWVNDQUxMKHN5c19nZXRjd2QsY29tcGF0X3N5c19nZXRjd2QpCitTWVNDQUxMKHN5c19jYXBnZXQsY29tcGF0X3N5c19jYXBnZXQpCitTWVNDQUxMKHN5c19jYXBzZXQsY29tcGF0X3N5c19jYXBzZXQpCQkJLyogMTg1ICovCitTWVNDQUxMKHN5c19zaWdhbHRzdGFjayxjb21wYXRfc3lzX3NpZ2FsdHN0YWNrKQorU1lTQ0FMTChzeXNfc2VuZGZpbGU2NCxjb21wYXRfc3lzX3NlbmRmaWxlKQorTklfU1lTQ0FMTAkJCQkJCS8qIHN0cmVhbXMxICovCitOSV9TWVNDQUxMCQkJCQkJLyogc3RyZWFtczIgKi8KK1NZU0NBTEwoc3lzX3Zmb3JrLHN5c192Zm9yaykJCQkJLyogMTkwICovCitTWVNDQUxMKHN5c19nZXRybGltaXQsY29tcGF0X3N5c19nZXRybGltaXQpCitTWVNDQUxMKHN5c19tbWFwMixjb21wYXRfc3lzX3MzOTBfbW1hcDIpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF90cnVuY2F0ZTY0KQorU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxjb21wYXRfc3lzX3MzOTBfZnRydW5jYXRlNjQpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9zdGF0NjQpCQkvKiAxOTUgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19zMzkwX2xzdGF0NjQpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9mc3RhdDY0KQorU1lTQ0FMTChzeXNfbGNob3duLGNvbXBhdF9zeXNfbGNob3duKQorU1lTQ0FMTChzeXNfZ2V0dWlkLHN5c19nZXR1aWQpCitTWVNDQUxMKHN5c19nZXRnaWQsc3lzX2dldGdpZCkJCQkJLyogMjAwICovCitTWVNDQUxMKHN5c19nZXRldWlkLHN5c19nZXRldWlkKQorU1lTQ0FMTChzeXNfZ2V0ZWdpZCxzeXNfZ2V0ZWdpZCkKK1NZU0NBTEwoc3lzX3NldHJldWlkLGNvbXBhdF9zeXNfc2V0cmV1aWQpCitTWVNDQUxMKHN5c19zZXRyZWdpZCxjb21wYXRfc3lzX3NldHJlZ2lkKQorU1lTQ0FMTChzeXNfZ2V0Z3JvdXBzLGNvbXBhdF9zeXNfZ2V0Z3JvdXBzKQkJLyogMjA1ICovCitTWVNDQUxMKHN5c19zZXRncm91cHMsY29tcGF0X3N5c19zZXRncm91cHMpCitTWVNDQUxMKHN5c19mY2hvd24sY29tcGF0X3N5c19mY2hvd24pCitTWVNDQUxMKHN5c19zZXRyZXN1aWQsY29tcGF0X3N5c19zZXRyZXN1aWQpCitTWVNDQUxMKHN5c19nZXRyZXN1aWQsY29tcGF0X3N5c19nZXRyZXN1aWQpCitTWVNDQUxMKHN5c19zZXRyZXNnaWQsY29tcGF0X3N5c19zZXRyZXNnaWQpCQkvKiAyMTAgKi8KK1NZU0NBTEwoc3lzX2dldHJlc2dpZCxjb21wYXRfc3lzX2dldHJlc2dpZCkKK1NZU0NBTEwoc3lzX2Nob3duLGNvbXBhdF9zeXNfY2hvd24pCitTWVNDQUxMKHN5c19zZXR1aWQsY29tcGF0X3N5c19zZXR1aWQpCitTWVNDQUxMKHN5c19zZXRnaWQsY29tcGF0X3N5c19zZXRnaWQpCitTWVNDQUxMKHN5c19zZXRmc3VpZCxjb21wYXRfc3lzX3NldGZzdWlkKQkJLyogMjE1ICovCitTWVNDQUxMKHN5c19zZXRmc2dpZCxjb21wYXRfc3lzX3NldGZzZ2lkKQorU1lTQ0FMTChzeXNfcGl2b3Rfcm9vdCxjb21wYXRfc3lzX3Bpdm90X3Jvb3QpCitTWVNDQUxMKHN5c19taW5jb3JlLGNvbXBhdF9zeXNfbWluY29yZSkKK1NZU0NBTEwoc3lzX21hZHZpc2UsY29tcGF0X3N5c19tYWR2aXNlKQorU1lTQ0FMTChzeXNfZ2V0ZGVudHM2NCxjb21wYXRfc3lzX2dldGRlbnRzNjQpCQkvKiAyMjAgKi8KK1NZU0NBTEwoc3lzX25pX3N5c2NhbGwsY29tcGF0X3N5c19mY250bDY0KQorU1lTQ0FMTChzeXNfcmVhZGFoZWFkLGNvbXBhdF9zeXNfczM5MF9yZWFkYWhlYWQpCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfc2VuZGZpbGU2NCkKK1NZU0NBTEwoc3lzX3NldHhhdHRyLGNvbXBhdF9zeXNfc2V0eGF0dHIpCitTWVNDQUxMKHN5c19sc2V0eGF0dHIsY29tcGF0X3N5c19sc2V0eGF0dHIpCQkvKiAyMjUgKi8KK1NZU0NBTEwoc3lzX2ZzZXR4YXR0cixjb21wYXRfc3lzX2ZzZXR4YXR0cikKK1NZU0NBTEwoc3lzX2dldHhhdHRyLGNvbXBhdF9zeXNfZ2V0eGF0dHIpCitTWVNDQUxMKHN5c19sZ2V0eGF0dHIsY29tcGF0X3N5c19sZ2V0eGF0dHIpCitTWVNDQUxMKHN5c19mZ2V0eGF0dHIsY29tcGF0X3N5c19mZ2V0eGF0dHIpCitTWVNDQUxMKHN5c19saXN0eGF0dHIsY29tcGF0X3N5c19saXN0eGF0dHIpCQkvKiAyMzAgKi8KK1NZU0NBTEwoc3lzX2xsaXN0eGF0dHIsY29tcGF0X3N5c19sbGlzdHhhdHRyKQorU1lTQ0FMTChzeXNfZmxpc3R4YXR0cixjb21wYXRfc3lzX2ZsaXN0eGF0dHIpCitTWVNDQUxMKHN5c19yZW1vdmV4YXR0cixjb21wYXRfc3lzX3JlbW92ZXhhdHRyKQorU1lTQ0FMTChzeXNfbHJlbW92ZXhhdHRyLGNvbXBhdF9zeXNfbHJlbW92ZXhhdHRyKQorU1lTQ0FMTChzeXNfZnJlbW92ZXhhdHRyLGNvbXBhdF9zeXNfZnJlbW92ZXhhdHRyKQkvKiAyMzUgKi8KK1NZU0NBTEwoc3lzX2dldHRpZCxzeXNfZ2V0dGlkKQorU1lTQ0FMTChzeXNfdGtpbGwsY29tcGF0X3N5c190a2lsbCkKK1NZU0NBTEwoc3lzX2Z1dGV4LGNvbXBhdF9zeXNfZnV0ZXgpCitTWVNDQUxMKHN5c19zY2hlZF9zZXRhZmZpbml0eSxjb21wYXRfc3lzX3NjaGVkX3NldGFmZmluaXR5KQorU1lTQ0FMTChzeXNfc2NoZWRfZ2V0YWZmaW5pdHksY29tcGF0X3N5c19zY2hlZF9nZXRhZmZpbml0eSkJLyogMjQwICovCitTWVNDQUxMKHN5c190Z2tpbGwsY29tcGF0X3N5c190Z2tpbGwpCitOSV9TWVNDQUxMCQkJCQkJLyogcmVzZXJ2ZWQgZm9yIFRVWCAqLworU1lTQ0FMTChzeXNfaW9fc2V0dXAsY29tcGF0X3N5c19pb19zZXR1cCkKK1NZU0NBTEwoc3lzX2lvX2Rlc3Ryb3ksY29tcGF0X3N5c19pb19kZXN0cm95KQorU1lTQ0FMTChzeXNfaW9fZ2V0ZXZlbnRzLGNvbXBhdF9zeXNfaW9fZ2V0ZXZlbnRzKQkvKiAyNDUgKi8KK1NZU0NBTEwoc3lzX2lvX3N1Ym1pdCxjb21wYXRfc3lzX2lvX3N1Ym1pdCkKK1NZU0NBTEwoc3lzX2lvX2NhbmNlbCxjb21wYXRfc3lzX2lvX2NhbmNlbCkKK1NZU0NBTEwoc3lzX2V4aXRfZ3JvdXAsY29tcGF0X3N5c19leGl0X2dyb3VwKQorU1lTQ0FMTChzeXNfZXBvbGxfY3JlYXRlLGNvbXBhdF9zeXNfZXBvbGxfY3JlYXRlKQorU1lTQ0FMTChzeXNfZXBvbGxfY3RsLGNvbXBhdF9zeXNfZXBvbGxfY3RsKQkJLyogMjUwICovCitTWVNDQUxMKHN5c19lcG9sbF93YWl0LGNvbXBhdF9zeXNfZXBvbGxfd2FpdCkKK1NZU0NBTEwoc3lzX3NldF90aWRfYWRkcmVzcyxjb21wYXRfc3lzX3NldF90aWRfYWRkcmVzcykKK1NZU0NBTEwoc3lzX2ZhZHZpc2U2NF82NCxjb21wYXRfc3lzX3MzOTBfZmFkdmlzZTY0KQorU1lTQ0FMTChzeXNfdGltZXJfY3JlYXRlLGNvbXBhdF9zeXNfdGltZXJfY3JlYXRlKQorU1lTQ0FMTChzeXNfdGltZXJfc2V0dGltZSxjb21wYXRfc3lzX3RpbWVyX3NldHRpbWUpCS8qIDI1NSAqLworU1lTQ0FMTChzeXNfdGltZXJfZ2V0dGltZSxjb21wYXRfc3lzX3RpbWVyX2dldHRpbWUpCitTWVNDQUxMKHN5c190aW1lcl9nZXRvdmVycnVuLGNvbXBhdF9zeXNfdGltZXJfZ2V0b3ZlcnJ1bikKK1NZU0NBTEwoc3lzX3RpbWVyX2RlbGV0ZSxjb21wYXRfc3lzX3RpbWVyX2RlbGV0ZSkKK1NZU0NBTEwoc3lzX2Nsb2NrX3NldHRpbWUsY29tcGF0X3N5c19jbG9ja19zZXR0aW1lKQorU1lTQ0FMTChzeXNfY2xvY2tfZ2V0dGltZSxjb21wYXRfc3lzX2Nsb2NrX2dldHRpbWUpCS8qIDI2MCAqLworU1lTQ0FMTChzeXNfY2xvY2tfZ2V0cmVzLGNvbXBhdF9zeXNfY2xvY2tfZ2V0cmVzKQorU1lTQ0FMTChzeXNfY2xvY2tfbmFub3NsZWVwLGNvbXBhdF9zeXNfY2xvY2tfbmFub3NsZWVwKQorTklfU1lTQ0FMTAkJCQkJCS8qIHJlc2VydmVkIGZvciB2c2VydmVyICovCitTWVNDQUxMKHN5c19uaV9zeXNjYWxsLGNvbXBhdF9zeXNfczM5MF9mYWR2aXNlNjRfNjQpCitTWVNDQUxMKHN5c19zdGF0ZnM2NCxjb21wYXRfc3lzX3N0YXRmczY0KQorU1lTQ0FMTChzeXNfZnN0YXRmczY0LGNvbXBhdF9zeXNfZnN0YXRmczY0KQorU1lTQ0FMTChzeXNfcmVtYXBfZmlsZV9wYWdlcyxjb21wYXRfc3lzX3JlbWFwX2ZpbGVfcGFnZXMpCitOSV9TWVNDQUxMCQkJCQkJLyogMjY4IHN5c19tYmluZCAqLworTklfU1lTQ0FMTAkJCQkJCS8qIDI2OSBzeXNfZ2V0X21lbXBvbGljeSAqLworTklfU1lTQ0FMTAkJCQkJCS8qIDI3MCBzeXNfc2V0X21lbXBvbGljeSAqLworU1lTQ0FMTChzeXNfbXFfb3Blbixjb21wYXRfc3lzX21xX29wZW4pCitTWVNDQUxMKHN5c19tcV91bmxpbmssY29tcGF0X3N5c19tcV91bmxpbmspCitTWVNDQUxMKHN5c19tcV90aW1lZHNlbmQsY29tcGF0X3N5c19tcV90aW1lZHNlbmQpCitTWVNDQUxMKHN5c19tcV90aW1lZHJlY2VpdmUsY29tcGF0X3N5c19tcV90aW1lZHJlY2VpdmUpCitTWVNDQUxMKHN5c19tcV9ub3RpZnksY29tcGF0X3N5c19tcV9ub3RpZnkpCQkvKiAyNzUgKi8KK1NZU0NBTEwoc3lzX21xX2dldHNldGF0dHIsY29tcGF0X3N5c19tcV9nZXRzZXRhdHRyKQorU1lTQ0FMTChzeXNfa2V4ZWNfbG9hZCxjb21wYXRfc3lzX2tleGVjX2xvYWQpCitTWVNDQUxMKHN5c19hZGRfa2V5LGNvbXBhdF9zeXNfYWRkX2tleSkKK1NZU0NBTEwoc3lzX3JlcXVlc3Rfa2V5LGNvbXBhdF9zeXNfcmVxdWVzdF9rZXkpCitTWVNDQUxMKHN5c19rZXljdGwsY29tcGF0X3N5c19rZXljdGwpCQkJLyogMjgwICovCitTWVNDQUxMKHN5c193YWl0aWQsY29tcGF0X3N5c193YWl0aWQpCitTWVNDQUxMKHN5c19pb3ByaW9fc2V0LGNvbXBhdF9zeXNfaW9wcmlvX3NldCkKK1NZU0NBTEwoc3lzX2lvcHJpb19nZXQsY29tcGF0X3N5c19pb3ByaW9fZ2V0KQorU1lTQ0FMTChzeXNfaW5vdGlmeV9pbml0LHN5c19pbm90aWZ5X2luaXQpCitTWVNDQUxMKHN5c19pbm90aWZ5X2FkZF93YXRjaCxjb21wYXRfc3lzX2lub3RpZnlfYWRkX3dhdGNoKQkvKiAyODUgKi8KK1NZU0NBTEwoc3lzX2lub3RpZnlfcm1fd2F0Y2gsY29tcGF0X3N5c19pbm90aWZ5X3JtX3dhdGNoKQorTklfU1lTQ0FMTAkJCQkJCS8qIDI4NyBzeXNfbWlncmF0ZV9wYWdlcyAqLworU1lTQ0FMTChzeXNfb3BlbmF0LGNvbXBhdF9zeXNfb3BlbmF0KQorU1lTQ0FMTChzeXNfbWtkaXJhdCxjb21wYXRfc3lzX21rZGlyYXQpCitTWVNDQUxMKHN5c19ta25vZGF0LGNvbXBhdF9zeXNfbWtub2RhdCkJCQkvKiAyOTAgKi8KK1NZU0NBTEwoc3lzX2ZjaG93bmF0LGNvbXBhdF9zeXNfZmNob3duYXQpCitTWVNDQUxMKHN5c19mdXRpbWVzYXQsY29tcGF0X3N5c19mdXRpbWVzYXQpCitTWVNDQUxMKHN5c19uZXdmc3RhdGF0LGNvbXBhdF9zeXNfczM5MF9mc3RhdGF0NjQpCitTWVNDQUxMKHN5c191bmxpbmthdCxjb21wYXRfc3lzX3VubGlua2F0KQorU1lTQ0FMTChzeXNfcmVuYW1lYXQsY29tcGF0X3N5c19yZW5hbWVhdCkJCS8qIDI5NSAqLworU1lTQ0FMTChzeXNfbGlua2F0LGNvbXBhdF9zeXNfbGlua2F0KQorU1lTQ0FMTChzeXNfc3ltbGlua2F0LGNvbXBhdF9zeXNfc3ltbGlua2F0KQorU1lTQ0FMTChzeXNfcmVhZGxpbmthdCxjb21wYXRfc3lzX3JlYWRsaW5rYXQpCitTWVNDQUxMKHN5c19mY2htb2RhdCxjb21wYXRfc3lzX2ZjaG1vZGF0KQorU1lTQ0FMTChzeXNfZmFjY2Vzc2F0LGNvbXBhdF9zeXNfZmFjY2Vzc2F0KQkJLyogMzAwICovCitTWVNDQUxMKHN5c19wc2VsZWN0Nixjb21wYXRfc3lzX3BzZWxlY3Q2KQorU1lTQ0FMTChzeXNfcHBvbGwsY29tcGF0X3N5c19wcG9sbCkKK1NZU0NBTEwoc3lzX3Vuc2hhcmUsY29tcGF0X3N5c191bnNoYXJlKQorU1lTQ0FMTChzeXNfc2V0X3JvYnVzdF9saXN0LGNvbXBhdF9zeXNfc2V0X3JvYnVzdF9saXN0KQorU1lTQ0FMTChzeXNfZ2V0X3JvYnVzdF9saXN0LGNvbXBhdF9zeXNfZ2V0X3JvYnVzdF9saXN0KQorU1lTQ0FMTChzeXNfc3BsaWNlLGNvbXBhdF9zeXNfc3BsaWNlKQorU1lTQ0FMTChzeXNfc3luY19maWxlX3JhbmdlLGNvbXBhdF9zeXNfczM5MF9zeW5jX2ZpbGVfcmFuZ2UpCitTWVNDQUxMKHN5c190ZWUsY29tcGF0X3N5c190ZWUpCitTWVNDQUxMKHN5c192bXNwbGljZSxjb21wYXRfc3lzX3Ztc3BsaWNlKQorTklfU1lTQ0FMTAkJCQkJCS8qIDMxMCBzeXNfbW92ZV9wYWdlcyAqLworU1lTQ0FMTChzeXNfZ2V0Y3B1LGNvbXBhdF9zeXNfZ2V0Y3B1KQorU1lTQ0FMTChzeXNfZXBvbGxfcHdhaXQsY29tcGF0X3N5c19lcG9sbF9wd2FpdCkKK1NZU0NBTEwoc3lzX3V0aW1lcyxjb21wYXRfc3lzX3V0aW1lcykKK1NZU0NBTEwoc3lzX2ZhbGxvY2F0ZSxjb21wYXRfc3lzX3MzOTBfZmFsbG9jYXRlKQorU1lTQ0FMTChzeXNfdXRpbWVuc2F0LGNvbXBhdF9zeXNfdXRpbWVuc2F0KQkJLyogMzE1ICovCitTWVNDQUxMKHN5c19zaWduYWxmZCxjb21wYXRfc3lzX3NpZ25hbGZkKQogTklfU1lTQ0FMTAkJCQkJCS8qIDMxNyBvbGQgc3lzX3RpbWVyX2ZkICovCi1TWVNDQUxMKHN5c19ldmVudGZkLHN5c19ldmVudGZkLGNvbXBhdF9zeXNfZXZlbnRmZCkKLVNZU0NBTEwoc3lzX3RpbWVyZmRfY3JlYXRlLHN5c190aW1lcmZkX2NyZWF0ZSxjb21wYXRfc3lzX3RpbWVyZmRfY3JlYXRlKQotU1lTQ0FMTChzeXNfdGltZXJmZF9zZXR0aW1lLHN5c190aW1lcmZkX3NldHRpbWUsY29tcGF0X3N5c190aW1lcmZkX3NldHRpbWUpIC8qIDMyMCAqLwotU1lTQ0FMTChzeXNfdGltZXJmZF9nZXR0aW1lLHN5c190aW1lcmZkX2dldHRpbWUsY29tcGF0X3N5c190aW1lcmZkX2dldHRpbWUpCi1TWVNDQUxMKHN5c19zaWduYWxmZDQsc3lzX3NpZ25hbGZkNCxjb21wYXRfc3lzX3NpZ25hbGZkNCkKLVNZU0NBTEwoc3lzX2V2ZW50ZmQyLHN5c19ldmVudGZkMixjb21wYXRfc3lzX2V2ZW50ZmQyKQotU1lTQ0FMTChzeXNfaW5vdGlmeV9pbml0MSxzeXNfaW5vdGlmeV9pbml0MSxjb21wYXRfc3lzX2lub3RpZnlfaW5pdDEpCi1TWVNDQUxMKHN5c19waXBlMixzeXNfcGlwZTIsY29tcGF0X3N5c19waXBlMikgLyogMzI1ICovCi1TWVNDQUxMKHN5c19kdXAzLHN5c19kdXAzLGNvbXBhdF9zeXNfZHVwMykKLVNZU0NBTEwoc3lzX2Vwb2xsX2NyZWF0ZTEsc3lzX2Vwb2xsX2NyZWF0ZTEsY29tcGF0X3N5c19lcG9sbF9jcmVhdGUxKQotU1lTQ0FMTChzeXNfcHJlYWR2LHN5c19wcmVhZHYsY29tcGF0X3N5c19wcmVhZHYpCi1TWVNDQUxMKHN5c19wd3JpdGV2LHN5c19wd3JpdGV2LGNvbXBhdF9zeXNfcHdyaXRldikKLVNZU0NBTEwoc3lzX3J0X3Rnc2lncXVldWVpbmZvLHN5c19ydF90Z3NpZ3F1ZXVlaW5mbyxjb21wYXRfc3lzX3J0X3Rnc2lncXVldWVpbmZvKSAvKiAzMzAgKi8KLVNZU0NBTEwoc3lzX3BlcmZfZXZlbnRfb3BlbixzeXNfcGVyZl9ldmVudF9vcGVuLGNvbXBhdF9zeXNfcGVyZl9ldmVudF9vcGVuKQotU1lTQ0FMTChzeXNfZmFub3RpZnlfaW5pdCxzeXNfZmFub3RpZnlfaW5pdCxjb21wYXRfc3lzX2Zhbm90aWZ5X2luaXQpCi1TWVNDQUxMKHN5c19mYW5vdGlmeV9tYXJrLHN5c19mYW5vdGlmeV9tYXJrLGNvbXBhdF9zeXNfZmFub3RpZnlfbWFyaykKLVNZU0NBTEwoc3lzX3BybGltaXQ2NCxzeXNfcHJsaW1pdDY0LGNvbXBhdF9zeXNfcHJsaW1pdDY0KQotU1lTQ0FMTChzeXNfbmFtZV90b19oYW5kbGVfYXQsc3lzX25hbWVfdG9faGFuZGxlX2F0LGNvbXBhdF9zeXNfbmFtZV90b19oYW5kbGVfYXQpIC8qIDMzNSAqLwotU1lTQ0FMTChzeXNfb3Blbl9ieV9oYW5kbGVfYXQsc3lzX29wZW5fYnlfaGFuZGxlX2F0LGNvbXBhdF9zeXNfb3Blbl9ieV9oYW5kbGVfYXQpCi1TWVNDQUxMKHN5c19jbG9ja19hZGp0aW1lLHN5c19jbG9ja19hZGp0aW1lLGNvbXBhdF9zeXNfY2xvY2tfYWRqdGltZSkKLVNZU0NBTEwoc3lzX3N5bmNmcyxzeXNfc3luY2ZzLGNvbXBhdF9zeXNfc3luY2ZzKQotU1lTQ0FMTChzeXNfc2V0bnMsc3lzX3NldG5zLGNvbXBhdF9zeXNfc2V0bnMpCi1TWVNDQUxMKHN5c19wcm9jZXNzX3ZtX3JlYWR2LHN5c19wcm9jZXNzX3ZtX3JlYWR2LGNvbXBhdF9zeXNfcHJvY2Vzc192bV9yZWFkdikgLyogMzQwICovCi1TWVNDQUxMKHN5c19wcm9jZXNzX3ZtX3dyaXRldixzeXNfcHJvY2Vzc192bV93cml0ZXYsY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldikKLVNZU0NBTEwoc3lzX25pX3N5c2NhbGwsc3lzX3MzOTBfcnVudGltZV9pbnN0cixjb21wYXRfc3lzX3MzOTBfcnVudGltZV9pbnN0cikKLVNZU0NBTEwoc3lzX2tjbXAsc3lzX2tjbXAsY29tcGF0X3N5c19rY21wKQotU1lTQ0FMTChzeXNfZmluaXRfbW9kdWxlLHN5c19maW5pdF9tb2R1bGUsY29tcGF0X3N5c19maW5pdF9tb2R1bGUpCi1TWVNDQUxMKHN5c19zY2hlZF9zZXRhdHRyLHN5c19zY2hlZF9zZXRhdHRyLGNvbXBhdF9zeXNfc2NoZWRfc2V0YXR0cikgLyogMzQ1ICovCi1TWVNDQUxMKHN5c19zY2hlZF9nZXRhdHRyLHN5c19zY2hlZF9nZXRhdHRyLGNvbXBhdF9zeXNfc2NoZWRfZ2V0YXR0cikKLVNZU0NBTEwoc3lzX3JlbmFtZWF0MixzeXNfcmVuYW1lYXQyLGNvbXBhdF9zeXNfcmVuYW1lYXQyKQotU1lTQ0FMTChzeXNfc2VjY29tcCxzeXNfc2VjY29tcCxjb21wYXRfc3lzX3NlY2NvbXApCi1TWVNDQUxMKHN5c19nZXRyYW5kb20sc3lzX2dldHJhbmRvbSxjb21wYXRfc3lzX2dldHJhbmRvbSkKLVNZU0NBTEwoc3lzX21lbWZkX2NyZWF0ZSxzeXNfbWVtZmRfY3JlYXRlLGNvbXBhdF9zeXNfbWVtZmRfY3JlYXRlKSAvKiAzNTAgKi8KLVNZU0NBTEwoc3lzX2JwZixzeXNfYnBmLGNvbXBhdF9zeXNfYnBmKQotU1lTQ0FMTChzeXNfbmlfc3lzY2FsbCxzeXNfczM5MF9wY2lfbW1pb193cml0ZSxjb21wYXRfc3lzX3MzOTBfcGNpX21taW9fd3JpdGUpCi1TWVNDQUxMKHN5c19uaV9zeXNjYWxsLHN5c19zMzkwX3BjaV9tbWlvX3JlYWQsY29tcGF0X3N5c19zMzkwX3BjaV9tbWlvX3JlYWQpCi1TWVNDQUxMKHN5c19leGVjdmVhdCxzeXNfZXhlY3ZlYXQsY29tcGF0X3N5c19leGVjdmVhdCkKK1NZU0NBTEwoc3lzX2V2ZW50ZmQsY29tcGF0X3N5c19ldmVudGZkKQorU1lTQ0FMTChzeXNfdGltZXJmZF9jcmVhdGUsY29tcGF0X3N5c190aW1lcmZkX2NyZWF0ZSkKK1NZU0NBTEwoc3lzX3RpbWVyZmRfc2V0dGltZSxjb21wYXRfc3lzX3RpbWVyZmRfc2V0dGltZSkgLyogMzIwICovCitTWVNDQUxMKHN5c190aW1lcmZkX2dldHRpbWUsY29tcGF0X3N5c190aW1lcmZkX2dldHRpbWUpCitTWVNDQUxMKHN5c19zaWduYWxmZDQsY29tcGF0X3N5c19zaWduYWxmZDQpCitTWVNDQUxMKHN5c19ldmVudGZkMixjb21wYXRfc3lzX2V2ZW50ZmQyKQorU1lTQ0FMTChzeXNfaW5vdGlmeV9pbml0MSxjb21wYXRfc3lzX2lub3RpZnlfaW5pdDEpCitTWVNDQUxMKHN5c19waXBlMixjb21wYXRfc3lzX3BpcGUyKQkJCS8qIDMyNSAqLworU1lTQ0FMTChzeXNfZHVwMyxjb21wYXRfc3lzX2R1cDMpCitTWVNDQUxMKHN5c19lcG9sbF9jcmVhdGUxLGNvbXBhdF9zeXNfZXBvbGxfY3JlYXRlMSkKK1NZU0NBTEwoc3lzX3ByZWFkdixjb21wYXRfc3lzX3ByZWFkdikKK1NZU0NBTEwoc3lzX3B3cml0ZXYsY29tcGF0X3N5c19wd3JpdGV2KQorU1lTQ0FMTChzeXNfcnRfdGdzaWdxdWV1ZWluZm8sY29tcGF0X3N5c19ydF90Z3NpZ3F1ZXVlaW5mbykgLyogMzMwICovCitTWVNDQUxMKHN5c19wZXJmX2V2ZW50X29wZW4sY29tcGF0X3N5c19wZXJmX2V2ZW50X29wZW4pCitTWVNDQUxMKHN5c19mYW5vdGlmeV9pbml0LGNvbXBhdF9zeXNfZmFub3RpZnlfaW5pdCkKK1NZU0NBTEwoc3lzX2Zhbm90aWZ5X21hcmssY29tcGF0X3N5c19mYW5vdGlmeV9tYXJrKQorU1lTQ0FMTChzeXNfcHJsaW1pdDY0LGNvbXBhdF9zeXNfcHJsaW1pdDY0KQorU1lTQ0FMTChzeXNfbmFtZV90b19oYW5kbGVfYXQsY29tcGF0X3N5c19uYW1lX3RvX2hhbmRsZV9hdCkgLyogMzM1ICovCitTWVNDQUxMKHN5c19vcGVuX2J5X2hhbmRsZV9hdCxjb21wYXRfc3lzX29wZW5fYnlfaGFuZGxlX2F0KQorU1lTQ0FMTChzeXNfY2xvY2tfYWRqdGltZSxjb21wYXRfc3lzX2Nsb2NrX2FkanRpbWUpCitTWVNDQUxMKHN5c19zeW5jZnMsY29tcGF0X3N5c19zeW5jZnMpCitTWVNDQUxMKHN5c19zZXRucyxjb21wYXRfc3lzX3NldG5zKQorU1lTQ0FMTChzeXNfcHJvY2Vzc192bV9yZWFkdixjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHYpIC8qIDM0MCAqLworU1lTQ0FMTChzeXNfcHJvY2Vzc192bV93cml0ZXYsY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldikKK1NZU0NBTEwoc3lzX3MzOTBfcnVudGltZV9pbnN0cixjb21wYXRfc3lzX3MzOTBfcnVudGltZV9pbnN0cikKK1NZU0NBTEwoc3lzX2tjbXAsY29tcGF0X3N5c19rY21wKQorU1lTQ0FMTChzeXNfZmluaXRfbW9kdWxlLGNvbXBhdF9zeXNfZmluaXRfbW9kdWxlKQorU1lTQ0FMTChzeXNfc2NoZWRfc2V0YXR0cixjb21wYXRfc3lzX3NjaGVkX3NldGF0dHIpCS8qIDM0NSAqLworU1lTQ0FMTChzeXNfc2NoZWRfZ2V0YXR0cixjb21wYXRfc3lzX3NjaGVkX2dldGF0dHIpCitTWVNDQUxMKHN5c19yZW5hbWVhdDIsY29tcGF0X3N5c19yZW5hbWVhdDIpCitTWVNDQUxMKHN5c19zZWNjb21wLGNvbXBhdF9zeXNfc2VjY29tcCkKK1NZU0NBTEwoc3lzX2dldHJhbmRvbSxjb21wYXRfc3lzX2dldHJhbmRvbSkKK1NZU0NBTEwoc3lzX21lbWZkX2NyZWF0ZSxjb21wYXRfc3lzX21lbWZkX2NyZWF0ZSkJLyogMzUwICovCitTWVNDQUxMKHN5c19icGYsY29tcGF0X3N5c19icGYpCitTWVNDQUxMKHN5c19zMzkwX3BjaV9tbWlvX3dyaXRlLGNvbXBhdF9zeXNfczM5MF9wY2lfbW1pb193cml0ZSkKK1NZU0NBTEwoc3lzX3MzOTBfcGNpX21taW9fcmVhZCxjb21wYXRfc3lzX3MzOTBfcGNpX21taW9fcmVhZCkKK1NZU0NBTEwoc3lzX2V4ZWN2ZWF0LGNvbXBhdF9zeXNfZXhlY3ZlYXQpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3RpbWUuYyBiL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCmluZGV4IDIwNjYwZGQuLjE3MGRkZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jCkBAIC0yMTUsMjAgKzIxNSwyMCBAQAogewogCXU2NCBuc2VjcHM7CiAKLQlpZiAodGstPnRrci5jbG9jayAhPSAmY2xvY2tzb3VyY2VfdG9kKQorCWlmICh0ay0+dGtyX21vbm8uY2xvY2sgIT0gJmNsb2Nrc291cmNlX3RvZCkKIAkJcmV0dXJuOwogCiAJLyogTWFrZSB1c2Vyc3BhY2UgZ2V0dGltZW9mZGF5IHNwaW4gdW50aWwgd2UncmUgZG9uZS4gKi8KIAkrK3Zkc29fZGF0YS0+dGJfdXBkYXRlX2NvdW50OwogCXNtcF93bWIoKTsKLQl2ZHNvX2RhdGEtPnh0aW1lX3RvZF9zdGFtcCA9IHRrLT50a3IuY3ljbGVfbGFzdDsKKwl2ZHNvX2RhdGEtPnh0aW1lX3RvZF9zdGFtcCA9IHRrLT50a3JfbW9uby5jeWNsZV9sYXN0OwogCXZkc29fZGF0YS0+eHRpbWVfY2xvY2tfc2VjID0gdGstPnh0aW1lX3NlYzsKLQl2ZHNvX2RhdGEtPnh0aW1lX2Nsb2NrX25zZWMgPSB0ay0+dGtyLnh0aW1lX25zZWM7CisJdmRzb19kYXRhLT54dGltZV9jbG9ja19uc2VjID0gdGstPnRrcl9tb25vLnh0aW1lX25zZWM7CiAJdmRzb19kYXRhLT53dG9tX2Nsb2NrX3NlYyA9CiAJCXRrLT54dGltZV9zZWMgKyB0ay0+d2FsbF90b19tb25vdG9uaWMudHZfc2VjOwotCXZkc29fZGF0YS0+d3RvbV9jbG9ja19uc2VjID0gdGstPnRrci54dGltZV9uc2VjICsKLQkJKyAoKHU2NCkgdGstPndhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMgPDwgdGstPnRrci5zaGlmdCk7Ci0JbnNlY3BzID0gKHU2NCkgTlNFQ19QRVJfU0VDIDw8IHRrLT50a3Iuc2hpZnQ7CisJdmRzb19kYXRhLT53dG9tX2Nsb2NrX25zZWMgPSB0ay0+dGtyX21vbm8ueHRpbWVfbnNlYyArCisJCSsgKCh1NjQpIHRrLT53YWxsX3RvX21vbm90b25pYy50dl9uc2VjIDw8IHRrLT50a3JfbW9uby5zaGlmdCk7CisJbnNlY3BzID0gKHU2NCkgTlNFQ19QRVJfU0VDIDw8IHRrLT50a3JfbW9uby5zaGlmdDsKIAl3aGlsZSAodmRzb19kYXRhLT53dG9tX2Nsb2NrX25zZWMgPj0gbnNlY3BzKSB7CiAJCXZkc29fZGF0YS0+d3RvbV9jbG9ja19uc2VjIC09IG5zZWNwczsKIAkJdmRzb19kYXRhLT53dG9tX2Nsb2NrX3NlYysrOwpAQCAtMjM2LDcgKzIzNiw3IEBACiAKIAl2ZHNvX2RhdGEtPnh0aW1lX2NvYXJzZV9zZWMgPSB0ay0+eHRpbWVfc2VjOwogCXZkc29fZGF0YS0+eHRpbWVfY29hcnNlX25zZWMgPQotCQkobG9uZykodGstPnRrci54dGltZV9uc2VjID4+IHRrLT50a3Iuc2hpZnQpOworCQkobG9uZykodGstPnRrcl9tb25vLnh0aW1lX25zZWMgPj4gdGstPnRrcl9tb25vLnNoaWZ0KTsKIAl2ZHNvX2RhdGEtPnd0b21fY29hcnNlX3NlYyA9CiAJCXZkc29fZGF0YS0+eHRpbWVfY29hcnNlX3NlYyArIHRrLT53YWxsX3RvX21vbm90b25pYy50dl9zZWM7CiAJdmRzb19kYXRhLT53dG9tX2NvYXJzZV9uc2VjID0KQEAgLTI0Niw4ICsyNDYsOCBAQAogCQl2ZHNvX2RhdGEtPnd0b21fY29hcnNlX3NlYysrOwogCX0KIAotCXZkc29fZGF0YS0+dGtfbXVsdCA9IHRrLT50a3IubXVsdDsKLQl2ZHNvX2RhdGEtPnRrX3NoaWZ0ID0gdGstPnRrci5zaGlmdDsKKwl2ZHNvX2RhdGEtPnRrX211bHQgPSB0ay0+dGtyX21vbm8ubXVsdDsKKwl2ZHNvX2RhdGEtPnRrX3NoaWZ0ID0gdGstPnRrcl9tb25vLnNoaWZ0OwogCXNtcF93bWIoKTsKIAkrK3Zkc29fZGF0YS0+dGJfdXBkYXRlX2NvdW50OwogfQpAQCAtMjgzLDcgKzI4Myw3IEBACiAJaWYgKHJlZ2lzdGVyX2V4dGVybmFsX2lycShFWFRfSVJRX1RJTUlOR19BTEVSVCwgdGltaW5nX2FsZXJ0X2ludGVycnVwdCkpCiAJCXBhbmljKCJDb3VsZG4ndCByZXF1ZXN0IGV4dGVybmFsIGludGVycnVwdCAweDE0MDYiKTsKIAotCWlmIChjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfdG9kKSAhPSAwKQorCWlmIChfX2Nsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV90b2QpICE9IDApCiAJCXBhbmljKCJDb3VsZCBub3QgcmVnaXN0ZXIgVE9EIGNsb2NrIHNvdXJjZSIpOwogCiAJLyogRW5hYmxlIFRPRCBjbG9jayBpbnRlcnJ1cHRzIG9uIHRoZSBib290IGNwdS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdG9wb2xvZ3kuYyBiL2FyY2gvczM5MC9rZXJuZWwvdG9wb2xvZ3kuYwppbmRleCAxNGRhNDNiLi41NzI4YzViIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3RvcG9sb2d5LmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90b3BvbG9neS5jCkBAIC00MjEsNyArNDIxLDcgQEAKIAlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKCZjcHUtPmRldi5rb2JqLCAmdG9wb2xvZ3lfY3B1X2F0dHJfZ3JvdXApOwogfQogCi1jb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X3RocmVhZF9tYXNrKGludCBjcHUpCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV90aHJlYWRfbWFzayhpbnQgY3B1KQogewogCXJldHVybiAmcGVyX2NwdShjcHVfdG9wb2xvZ3ksIGNwdSkudGhyZWFkX21hc2s7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMgYi9hcmNoL3MzOTAva2VybmVsL3RyYXBzLmMKaW5kZXggZjA4MWNmMS4uNGQ5NmM5ZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdHJhcHMuYwpAQCAtMjYsNyArMjYsNiBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgX191c2VyICpnZXRfdHJhcF9pcChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAl1bnNpZ25lZCBsb25nIGFkZHJlc3M7CiAKIAlpZiAocmVncy0+aW50X2NvZGUgJiAweDIwMCkKQEAgLTM1LDEwICszNCw2IEBACiAJCWFkZHJlc3MgPSByZWdzLT5wc3cuYWRkcjsKIAlyZXR1cm4gKHZvaWQgX191c2VyICopCiAJCSgoYWRkcmVzcyAtIChyZWdzLT5pbnRfY29kZSA+PiAxNikpICYgUFNXX0FERFJfSU5TTik7Ci0jZWxzZQotCXJldHVybiAodm9pZCBfX3VzZXIgKikKLQkJKChyZWdzLT5wc3cuYWRkciAtIChyZWdzLT5pbnRfY29kZSA+PiAxNikpICYgUFNXX0FERFJfSU5TTik7Ci0jZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJlcG9ydF91c2VyX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgc2lnbnIpCkBAIC0xNTMsMTEgKzE0OCw4IEBACiAJICAgICAgInByaXZpbGVnZWQgb3BlcmF0aW9uIikKIERPX0VSUk9SX0lORk8oc3BlY2lhbF9vcF9leGNlcHRpb24sIFNJR0lMTCwgSUxMX0lMTE9QTiwKIAkgICAgICAic3BlY2lhbCBvcGVyYXRpb24gZXhjZXB0aW9uIikKLQotI2lmZGVmIENPTkZJR182NEJJVAogRE9fRVJST1JfSU5GTyh0cmFuc2FjdGlvbl9leGNlcHRpb24sIFNJR0lMTCwgSUxMX0lMTE9QTiwKIAkgICAgICAidHJhbnNhY3Rpb24gY29uc3RyYWludCBleGNlcHRpb24iKQotI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkb19mcF90cmFwKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgZnBjKQogewpAQCAtMTgyLDcgKzE3NCw3IEBACiB2b2lkIHRyYW5zbGF0aW9uX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAkvKiBNYXkgbmV2ZXIgaGFwcGVuLiAqLwotCWRpZShyZWdzLCAiVHJhbnNsYXRpb24gZXhjZXB0aW9uIik7CisJcGFuaWMoIlRyYW5zbGF0aW9uIGV4Y2VwdGlvbiIpOwogfQogCiB2b2lkIGlsbGVnYWxfb3Aoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCkBAIC0yMTEsMjkgKzIwMyw2IEBACiAJCX0gZWxzZSBpZiAoKigoX191MTYgKikgb3Bjb2RlKSA9PSBVUFJPQkVfU1dCUF9JTlNOKSB7CiAJCQlpc191cHJvYmVfaW5zbiA9IDE7CiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfTUFUSEVNVQotCQl9IGVsc2UgaWYgKG9wY29kZVswXSA9PSAweGIzKSB7Ci0JCQlpZiAoZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpKQotCQkJCXJldHVybjsKLQkJCXNpZ25hbCA9IG1hdGhfZW11X2IzKG9wY29kZSwgcmVncyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcGNvZGVbMF0gPT0gMHhlZCkgewotCQkJaWYgKGdldF91c2VyKCooKF9fdTMyICopIChvcGNvZGUrMikpLAotCQkJCSAgICAgKF9fdTMyIF9fdXNlciAqKShsb2NhdGlvbisxKSkpCi0JCQkJcmV0dXJuOwotCQkJc2lnbmFsID0gbWF0aF9lbXVfZWQob3Bjb2RlLCByZWdzKTsKLQkJfSBlbHNlIGlmICgqKChfX3UxNiAqKSBvcGNvZGUpID09IDB4YjI5OSkgewotCQkJaWYgKGdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKSkKLQkJCQlyZXR1cm47Ci0JCQlzaWduYWwgPSBtYXRoX2VtdV9zcm5tKG9wY29kZSwgcmVncyk7Ci0JCX0gZWxzZSBpZiAoKigoX191MTYgKikgb3Bjb2RlKSA9PSAweGIyOWMpIHsKLQkJCWlmIChnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSkpCi0JCQkJcmV0dXJuOwotCQkJc2lnbmFsID0gbWF0aF9lbXVfc3RmcGMob3Bjb2RlLCByZWdzKTsKLQkJfSBlbHNlIGlmICgqKChfX3UxNiAqKSBvcGNvZGUpID09IDB4YjI5ZCkgewotCQkJaWYgKGdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKSkKLQkJCQlyZXR1cm47Ci0JCQlzaWduYWwgPSBtYXRoX2VtdV9sZnBjKG9wY29kZSwgcmVncyk7Ci0jZW5kaWYKIAkJfSBlbHNlCiAJCQlzaWduYWwgPSBTSUdJTEw7CiAJfQpAQCAtMjQ3LDcxICsyMTYsMTQgQEAKIAkJCSAgICAgICAzLCBTSUdUUkFQKSAhPSBOT1RJRllfU1RPUCkKIAkJCXNpZ25hbCA9IFNJR0lMTDsKIAl9Ci0KLSNpZmRlZiBDT05GSUdfTUFUSEVNVQotICAgICAgICBpZiAoc2lnbmFsID09IFNJR0ZQRSkKLQkJZG9fZnBfdHJhcChyZWdzLCBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMpOwotCWVsc2UgaWYgKHNpZ25hbCA9PSBTSUdTRUdWKQotCQlkb190cmFwKHJlZ3MsIHNpZ25hbCwgU0VHVl9NQVBFUlIsICJ1c2VyIGFkZHJlc3MgZmF1bHQiKTsKLQllbHNlCi0jZW5kaWYKIAlpZiAoc2lnbmFsKQogCQlkb190cmFwKHJlZ3MsIHNpZ25hbCwgSUxMX0lMTE9QQywgImlsbGVnYWwgb3BlcmF0aW9uIik7CiB9CiBOT0tQUk9CRV9TWU1CT0woaWxsZWdhbF9vcCk7CiAKLSNpZmRlZiBDT05GSUdfTUFUSEVNVQotdm9pZCBzcGVjaWZpY2F0aW9uX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLSAgICAgICAgX191OCBvcGNvZGVbNl07Ci0JX191MTYgX191c2VyICpsb2NhdGlvbiA9IE5VTEw7Ci0JaW50IHNpZ25hbCA9IDA7Ci0KLQlsb2NhdGlvbiA9IChfX3UxNiBfX3VzZXIgKikgZ2V0X3RyYXBfaXAocmVncyk7Ci0KLQlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7Ci0JCWdldF91c2VyKCooKF9fdTE2ICopIG9wY29kZSksIGxvY2F0aW9uKTsKLQkJc3dpdGNoIChvcGNvZGVbMF0pIHsKLQkJY2FzZSAweDI4OiAvKiBMRFIgUngsUnkgICAqLwotCQkJc2lnbmFsID0gbWF0aF9lbXVfbGRyKG9wY29kZSk7Ci0JCQlicmVhazsKLQkJY2FzZSAweDM4OiAvKiBMRVIgUngsUnkgICAqLwotCQkJc2lnbmFsID0gbWF0aF9lbXVfbGVyKG9wY29kZSk7Ci0JCQlicmVhazsKLQkJY2FzZSAweDYwOiAvKiBTVEQgUixEKFgsQikgKi8KLQkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKLQkJCXNpZ25hbCA9IG1hdGhfZW11X3N0ZChvcGNvZGUsIHJlZ3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHg2ODogLyogTEQgUixEKFgsQikgKi8KLQkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKLQkJCXNpZ25hbCA9IG1hdGhfZW11X2xkKG9wY29kZSwgcmVncyk7Ci0JCQlicmVhazsKLQkJY2FzZSAweDcwOiAvKiBTVEUgUixEKFgsQikgKi8KLQkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKLQkJCXNpZ25hbCA9IG1hdGhfZW11X3N0ZShvcGNvZGUsIHJlZ3MpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMHg3ODogLyogTEUgUixEKFgsQikgKi8KLQkJCWdldF91c2VyKCooKF9fdTE2ICopIChvcGNvZGUrMikpLCBsb2NhdGlvbisxKTsKLQkJCXNpZ25hbCA9IG1hdGhfZW11X2xlKG9wY29kZSwgcmVncyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNpZ25hbCA9IFNJR0lMTDsKLQkJCWJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0JCXNpZ25hbCA9IFNJR0lMTDsKLQotICAgICAgICBpZiAoc2lnbmFsID09IFNJR0ZQRSkKLQkJZG9fZnBfdHJhcChyZWdzLCBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMpOwotCWVsc2UgaWYgKHNpZ25hbCkKLQkJZG9fdHJhcChyZWdzLCBzaWduYWwsIElMTF9JTExPUE4sICJzcGVjaWZpY2F0aW9uIGV4Y2VwdGlvbiIpOwotfQotI2Vsc2UKIERPX0VSUk9SX0lORk8oc3BlY2lmaWNhdGlvbl9leGNlcHRpb24sIFNJR0lMTCwgSUxMX0lMTE9QTiwKIAkgICAgICAic3BlY2lmaWNhdGlvbiBleGNlcHRpb24iKTsKLSNlbmRpZgogCi0jaWZkZWYgQ09ORklHXzY0QklUCiBpbnQgYWxsb2NfdmVjdG9yX3JlZ2lzdGVycyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlfX3ZlY3RvcjEyOCAqdnhyczsKQEAgLTM3Nyw3ICsyODksNiBAQAogCXJldHVybiAxOwogfQogX19zZXR1cCgibm92eCIsIGRpc2FibGVfdmVjdG9yX2V4dGVuc2lvbik7Ci0jZW5kaWYKIAogdm9pZCBkYXRhX2V4Y2VwdGlvbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTM4Niw2NSArMjk3LDcgQEAKIAogCWxvY2F0aW9uID0gZ2V0X3RyYXBfaXAocmVncyk7CiAKLQlpZiAoTUFDSElORV9IQVNfSUVFRSkKLQkJYXNtIHZvbGF0aWxlKCJzdGZwYyAlMCIgOiAiPW0iIChjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMpKTsKLQotI2lmZGVmIENPTkZJR19NQVRIRU1VCi0JZWxzZSBpZiAodXNlcl9tb2RlKHJlZ3MpKSB7Ci0gICAgICAgIAlfX3U4IG9wY29kZVs2XTsKLQkJZ2V0X3VzZXIoKigoX191MTYgKikgb3Bjb2RlKSwgbG9jYXRpb24pOwotCQlzd2l0Y2ggKG9wY29kZVswXSkgewotCQljYXNlIDB4Mjg6IC8qIExEUiBSeCxSeSAgICovCi0JCQlzaWduYWwgPSBtYXRoX2VtdV9sZHIob3Bjb2RlKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4Mzg6IC8qIExFUiBSeCxSeSAgICovCi0JCQlzaWduYWwgPSBtYXRoX2VtdV9sZXIob3Bjb2RlKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4NjA6IC8qIFNURCBSLEQoWCxCKSAqLwotCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOwotCQkJc2lnbmFsID0gbWF0aF9lbXVfc3RkKG9wY29kZSwgcmVncyk7Ci0JCQlicmVhazsKLQkJY2FzZSAweDY4OiAvKiBMRCBSLEQoWCxCKSAqLwotCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOwotCQkJc2lnbmFsID0gbWF0aF9lbXVfbGQob3Bjb2RlLCByZWdzKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4NzA6IC8qIFNURSBSLEQoWCxCKSAqLwotCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOwotCQkJc2lnbmFsID0gbWF0aF9lbXVfc3RlKG9wY29kZSwgcmVncyk7Ci0JCQlicmVhazsKLQkJY2FzZSAweDc4OiAvKiBMRSBSLEQoWCxCKSAqLwotCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOwotCQkJc2lnbmFsID0gbWF0aF9lbXVfbGUob3Bjb2RlLCByZWdzKTsKLQkJCWJyZWFrOwotCQljYXNlIDB4YjM6Ci0JCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7Ci0JCQlzaWduYWwgPSBtYXRoX2VtdV9iMyhvcGNvZGUsIHJlZ3MpOwotCQkJYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweGVkOgotCQkJZ2V0X3VzZXIoKigoX191MzIgKikgKG9wY29kZSsyKSksCi0JCQkJIChfX3UzMiBfX3VzZXIgKikobG9jYXRpb24rMSkpOwotCQkJc2lnbmFsID0gbWF0aF9lbXVfZWQob3Bjb2RlLCByZWdzKTsKLQkJCWJyZWFrOwotCSAgICAgICAgY2FzZSAweGIyOgotCQkJaWYgKG9wY29kZVsxXSA9PSAweDk5KSB7Ci0JCQkJZ2V0X3VzZXIoKigoX191MTYgKikgKG9wY29kZSsyKSksIGxvY2F0aW9uKzEpOwotCQkJCXNpZ25hbCA9IG1hdGhfZW11X3Nybm0ob3Bjb2RlLCByZWdzKTsKLQkJCX0gZWxzZSBpZiAob3Bjb2RlWzFdID09IDB4OWMpIHsKLQkJCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7Ci0JCQkJc2lnbmFsID0gbWF0aF9lbXVfc3RmcGMob3Bjb2RlLCByZWdzKTsKLQkJCX0gZWxzZSBpZiAob3Bjb2RlWzFdID09IDB4OWQpIHsKLQkJCQlnZXRfdXNlcigqKChfX3UxNiAqKSAob3Bjb2RlKzIpKSwgbG9jYXRpb24rMSk7Ci0JCQkJc2lnbmFsID0gbWF0aF9lbXVfbGZwYyhvcGNvZGUsIHJlZ3MpOwotCQkJfSBlbHNlCi0JCQkJc2lnbmFsID0gU0lHSUxMOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlzaWduYWwgPSBTSUdJTEw7Ci0JCQlicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKKwlhc20gdm9sYXRpbGUoInN0ZnBjICUwIiA6ICI9bSIgKGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYykpOwogCS8qIENoZWNrIGZvciB2ZWN0b3IgcmVnaXN0ZXIgZW5hYmxlbWVudCAqLwogCWlmIChNQUNISU5FX0hBU19WWCAmJiAhY3VycmVudC0+dGhyZWFkLnZ4cnMgJiYKIAkgICAgKGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIEZQQ19EWENfTUFTSykgPT0gMHhmZTAwKSB7CkBAIC00NTQsMTMgKzMwNywxMSBAQAogCQljbGVhcl9wdF9yZWdzX2ZsYWcocmVncywgUElGX1BFUl9UUkFQKTsKIAkJcmV0dXJuOwogCX0KLSNlbmRpZgotCiAJaWYgKGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIEZQQ19EWENfTUFTSykKIAkJc2lnbmFsID0gU0lHRlBFOwogCWVsc2UKIAkJc2lnbmFsID0gU0lHSUxMOwotICAgICAgICBpZiAoc2lnbmFsID09IFNJR0ZQRSkKKwlpZiAoc2lnbmFsID09IFNJR0ZQRSkKIAkJZG9fZnBfdHJhcChyZWdzLCBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMpOwogCWVsc2UgaWYgKHNpZ25hbCkKIAkJZG9fdHJhcChyZWdzLCBzaWduYWwsIElMTF9JTExPUE4sICJkYXRhIGV4Y2VwdGlvbiIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC91cHJvYmVzLmMgYi9hcmNoL3MzOTAva2VybmVsL3Vwcm9iZXMuYwppbmRleCBjYzczMjgwLi42Njk1NmMwIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3Vwcm9iZXMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3Vwcm9iZXMuYwpAQCAtMTg4LDcgKzE4OCw5IEBACiAJZWxzZSBpZiAocHV0X3VzZXIoKihpbnB1dCksIF9fcHRyKSkJCVwKIAkJX19yYyA9IEVNVV9BRERSRVNTSU5HOwkJCVwKIAlpZiAoX19yYyA9PSAwKQkJCQkJXAotCQlzaW1fc3Rvcl9ldmVudChyZWdzLCBfX3B0ciwgbWFzayArIDEpOwlcCisJCXNpbV9zdG9yX2V2ZW50KHJlZ3MsCQkJXAorCQkJICAgICAgICh2b2lkIF9fZm9yY2UgKilfX3B0ciwJXAorCQkJICAgICAgIG1hc2sgKyAxKTsJCVwKIAlfX3JjOwkJCQkJCVwKIH0pCiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdmRzby5jIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvLmMKaW5kZXggMGJiYjdlMC4uMGQ1ODI2OSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92ZHNvLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC92ZHNvLmMKQEAgLTMyLDE5ICszMiwxNyBAQAogI2luY2x1ZGUgPGFzbS92ZHNvLmg+CiAjaW5jbHVkZSA8YXNtL2ZhY2lsaXR5Lmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR18zMkJJVCkgfHwgZGVmaW5lZChDT05GSUdfQ09NUEFUKQorI2lmZGVmIENPTkZJR19DT01QQVQKIGV4dGVybiBjaGFyIHZkc28zMl9zdGFydCwgdmRzbzMyX2VuZDsKIHN0YXRpYyB2b2lkICp2ZHNvMzJfa2Jhc2UgPSAmdmRzbzMyX3N0YXJ0Owogc3RhdGljIHVuc2lnbmVkIGludCB2ZHNvMzJfcGFnZXM7CiBzdGF0aWMgc3RydWN0IHBhZ2UgKip2ZHNvMzJfcGFnZWxpc3Q7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR182NEJJVAogZXh0ZXJuIGNoYXIgdmRzbzY0X3N0YXJ0LCB2ZHNvNjRfZW5kOwogc3RhdGljIHZvaWQgKnZkc282NF9rYmFzZSA9ICZ2ZHNvNjRfc3RhcnQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IHZkc282NF9wYWdlczsKIHN0YXRpYyBzdHJ1Y3QgcGFnZSAqKnZkc282NF9wYWdlbGlzdDsKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAogLyoKICAqIFNob3VsZCB0aGUga2VybmVsIG1hcCBhIFZEU08gcGFnZSBpbnRvIHByb2Nlc3NlcyBhbmQgcGFzcyBpdHMKQEAgLTg3LDcgKzg1LDYgQEAKIAl2ZC0+ZWN0Z19hdmFpbGFibGUgPSB0ZXN0X2ZhY2lsaXR5KDMxKTsKIH0KIAotI2lmZGVmIENPTkZJR182NEJJVAogLyoKICAqIEFsbG9jYXRlL2ZyZWUgcGVyIGNwdSB2ZHNvIGRhdGEuCiAgKi8KQEAgLTE2OSw3ICsxNjYsNiBAQAogCWNyNSA9IG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgcGFzdGUpOwogCV9fY3RsX2xvYWQoY3I1LCA1LCA1KTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAogLyoKICAqIFRoaXMgaXMgY2FsbGVkIGZyb20gYmluZm10X2VsZiwgd2UgY3JlYXRlIHRoZSBzcGVjaWFsIHZtYSBmb3IgdGhlCkBAIC0xOTEsNyArMTg3LDYgQEAKIAlpZiAoIXVzZXNfaW50ZXJwKQogCQlyZXR1cm4gMDsKIAotI2lmZGVmIENPTkZJR182NEJJVAogCXZkc29fcGFnZWxpc3QgPSB2ZHNvNjRfcGFnZWxpc3Q7CiAJdmRzb19wYWdlcyA9IHZkc282NF9wYWdlczsKICNpZmRlZiBDT05GSUdfQ09NUEFUCkBAIC0yMDAsMTEgKzE5NSw2IEBACiAJCXZkc29fcGFnZXMgPSB2ZHNvMzJfcGFnZXM7CiAJfQogI2VuZGlmCi0jZWxzZQotCXZkc29fcGFnZWxpc3QgPSB2ZHNvMzJfcGFnZWxpc3Q7Ci0JdmRzb19wYWdlcyA9IHZkc28zMl9wYWdlczsKLSNlbmRpZgotCiAJLyoKIAkgKiB2RFNPIGhhcyBhIHByb2JsZW0gYW5kIHdhcyBkaXNhYmxlZCwganVzdCBkb24ndCAiZW5hYmxlIiBpdCBmb3IKIAkgKiB0aGUgcHJvY2VzcwpAQCAtMjY4LDcgKzI1OCw3IEBACiAJaWYgKCF2ZHNvX2VuYWJsZWQpCiAJCXJldHVybiAwOwogCXZkc29faW5pdF9kYXRhKHZkc29fZGF0YSk7Ci0jaWYgZGVmaW5lZChDT05GSUdfMzJCSVQpIHx8IGRlZmluZWQoQ09ORklHX0NPTVBBVCkKKyNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLyogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSAzMiBiaXQgdkRTTyAqLwogCXZkc28zMl9wYWdlcyA9ICgoJnZkc28zMl9lbmQgLSAmdmRzbzMyX3N0YXJ0CiAJCQkgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUKSArIDE7CkBAIC0yODcsNyArMjc3LDYgQEAKIAl2ZHNvMzJfcGFnZWxpc3RbdmRzbzMyX3BhZ2VzXSA9IE5VTEw7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR182NEJJVAogCS8qIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgNjQgYml0IHZEU08gKi8KIAl2ZHNvNjRfcGFnZXMgPSAoKCZ2ZHNvNjRfZW5kIC0gJnZkc282NF9zdGFydAogCQkJICsgUEFHRV9TSVpFIC0gMSkgPj4gUEFHRV9TSElGVCkgKyAxOwpAQCAtMzA3LDcgKzI5Niw2IEBACiAJaWYgKHZkc29fYWxsb2NfcGVyX2NwdSgmUzM5MF9sb3djb3JlKSkKIAkJQlVHKCk7CiAJdmRzb19pbml0X2NyNSgpOwotI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwogCiAJZ2V0X3BhZ2UodmlydF90b19wYWdlKHZkc29fZGF0YSkpOwogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3MzOTAva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggMzViMTNlZC4uNDQ1NjU3ZiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtNiwxNyArNiwxMCBAQAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KIAotI2lmbmRlZiBDT05GSUdfNjRCSVQKLU9VVFBVVF9GT1JNQVQoImVsZjMyLXMzOTAiLCAiZWxmMzItczM5MCIsICJlbGYzMi1zMzkwIikKLU9VVFBVVF9BUkNIKHMzOTA6MzEtYml0KQotRU5UUlkoc3RhcnR1cCkKLWppZmZpZXMgPSBqaWZmaWVzXzY0ICsgNDsKLSNlbHNlCiBPVVRQVVRfRk9STUFUKCJlbGY2NC1zMzkwIiwgImVsZjY0LXMzOTAiLCAiZWxmNjQtczM5MCIpCiBPVVRQVVRfQVJDSChzMzkwOjY0LWJpdCkKIEVOVFJZKHN0YXJ0dXApCiBqaWZmaWVzID0gamlmZmllc182NDsKLSNlbmRpZgogCiBQSERSUyB7CiAJdGV4dCBQVF9MT0FEIEZMQUdTKDUpOwkvKiBSX0UgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vZGlhZy5jIGIvYXJjaC9zMzkwL2t2bS9kaWFnLmMKaW5kZXggOTI1NGFmZi4uZmM3ZWM5NSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9kaWFnLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9kaWFnLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAogCWlmICh2Y3B1LT5ydW4tPnMucmVncy5ncHJzW3J4XSAmIDcpCiAJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ3JhbV9pbnQodmNwdSwgUEdNX1NQRUNJRklDQVRJT04pOwotCXJjID0gcmVhZF9ndWVzdCh2Y3B1LCB2Y3B1LT5ydW4tPnMucmVncy5ncHJzW3J4XSwgJnBhcm0sIHNpemVvZihwYXJtKSk7CisJcmMgPSByZWFkX2d1ZXN0KHZjcHUsIHZjcHUtPnJ1bi0+cy5yZWdzLmdwcnNbcnhdLCByeCwgJnBhcm0sIHNpemVvZihwYXJtKSk7CiAJaWYgKHJjKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dfY29uZCh2Y3B1LCByYyk7CiAJaWYgKHBhcm0ucGFybV92ZXJzaW9uICE9IDIgfHwgcGFybS5wYXJtX2xlbiA8IDUgfHwgcGFybS5jb2RlICE9IDB4MjU4KQpAQCAtMjEzLDcgKzIxMyw3IEBACiAJICogLSBncHIgMyBjb250YWlucyB0aGUgdmlydHF1ZXVlIGluZGV4IChwYXNzZWQgYXMgZGF0YW1hdGNoKQogCSAqIC0gZ3ByIDQgY29udGFpbnMgdGhlIGluZGV4IG9uIHRoZSBidXMgKG9wdGlvbmFsbHkpCiAJICovCi0JcmV0ID0ga3ZtX2lvX2J1c193cml0ZV9jb29raWUodmNwdS0+a3ZtLCBLVk1fVklSVElPX0NDV19OT1RJRllfQlVTLAorCXJldCA9IGt2bV9pb19idXNfd3JpdGVfY29va2llKHZjcHUsIEtWTV9WSVJUSU9fQ0NXX05PVElGWV9CVVMsCiAJCQkJICAgICAgdmNwdS0+cnVuLT5zLnJlZ3MuZ3Byc1syXSAmIDB4ZmZmZmZmZmYsCiAJCQkJICAgICAgOCwgJnZjcHUtPnJ1bi0+cy5yZWdzLmdwcnNbM10sCiAJCQkJICAgICAgdmNwdS0+cnVuLT5zLnJlZ3MuZ3Byc1s0XSk7CkBAIC0yMzAsNyArMjMwLDcgQEAKIAogaW50IGt2bV9zMzkwX2hhbmRsZV9kaWFnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlpbnQgY29kZSA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3BfcnModmNwdSkgJiAweGZmZmY7CisJaW50IGNvZGUgPSBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3JzKHZjcHUsIE5VTEwpICYgMHhmZmZmOwogCiAJaWYgKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpCiAJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ3JhbV9pbnQodmNwdSwgUEdNX1BSSVZJTEVHRURfT1ApOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9nYWNjZXNzLmMgYi9hcmNoL3MzOTAva3ZtL2dhY2Nlc3MuYwppbmRleCAyNjc1MjNjLi5hNzU1OWY3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2dhY2Nlc3MuYworKysgYi9hcmNoL3MzOTAva3ZtL2dhY2Nlc3MuYwpAQCAtMTAsNiArMTAsNyBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSAia3ZtLXMzOTAuaCIKICNpbmNsdWRlICJnYWNjZXNzLmgiCisjaW5jbHVkZSA8YXNtL3N3aXRjaF90by5oPgogCiB1bmlvbiBhc2NlIHsKIAl1bnNpZ25lZCBsb25nIHZhbDsKQEAgLTIwNyw2ICsyMDgsNTQgQEAKIAl1bnNpZ25lZCBsb25nIHBmcmEgOiA1MjsgLyogUGFnZS1GcmFtZSBSZWFsIEFkZHJlc3MgKi8KIH07CiAKK3VuaW9uIGFsZXQgeworCXUzMiB2YWw7CisJc3RydWN0IHsKKwkJdTMyIHJlc2VydmVkIDogNzsKKwkJdTMyIHAgICAgICAgIDogMTsKKwkJdTMyIGFsZXNuICAgIDogODsKKwkJdTMyIGFsZW4gICAgIDogMTY7CisJfTsKK307CisKK3VuaW9uIGFsZCB7CisJdTMyIHZhbDsKKwlzdHJ1Y3QgeworCQl1MzIgICAgIDogMTsKKwkJdTMyIGFsbyA6IDI0OworCQl1MzIgYWxsIDogNzsKKwl9OworfTsKKworc3RydWN0IGFsZSB7CisJdW5zaWduZWQgbG9uZyBpICAgICAgOiAxOyAvKiBBTEVOLUludmFsaWQgQml0ICovCisJdW5zaWduZWQgbG9uZyAgICAgICAgOiA1OworCXVuc2lnbmVkIGxvbmcgZm8gICAgIDogMTsgLyogRmV0Y2gtT25seSBCaXQgKi8KKwl1bnNpZ25lZCBsb25nIHAgICAgICA6IDE7IC8qIFByaXZhdGUgQml0ICovCisJdW5zaWduZWQgbG9uZyBhbGVzbiAgOiA4OyAvKiBBY2Nlc3MtTGlzdC1FbnRyeSBTZXF1ZW5jZSBOdW1iZXIgKi8KKwl1bnNpZ25lZCBsb25nIGFsZWF4ICA6IDE2OyAvKiBBY2Nlc3MtTGlzdC1FbnRyeSBBdXRob3JpemF0aW9uIEluZGV4ICovCisJdW5zaWduZWQgbG9uZyAgICAgICAgOiAzMjsKKwl1bnNpZ25lZCBsb25nICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBhc3RlbyAgOiAyNTsgLyogQVNOLVNlY29uZC1UYWJsZS1FbnRyeSBPcmlnaW4gKi8KKwl1bnNpZ25lZCBsb25nICAgICAgICA6IDY7CisJdW5zaWduZWQgbG9uZyBhc3Rlc24gOiAzMjsgLyogQVNURSBTZXF1ZW5jZSBOdW1iZXIgKi8KK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhc3RlIHsKKwl1bnNpZ25lZCBsb25nIGkgICAgICA6IDE7IC8qIEFTWC1JbnZhbGlkIEJpdCAqLworCXVuc2lnbmVkIGxvbmcgYXRvICAgIDogMjk7IC8qIEF1dGhvcml0eS1UYWJsZSBPcmlnaW4gKi8KKwl1bnNpZ25lZCBsb25nICAgICAgICA6IDE7CisJdW5zaWduZWQgbG9uZyBiICAgICAgOiAxOyAvKiBCYXNlLVNwYWNlIEJpdCAqLworCXVuc2lnbmVkIGxvbmcgYXggICAgIDogMTY7IC8qIEF1dGhvcml6YXRpb24gSW5kZXggKi8KKwl1bnNpZ25lZCBsb25nIGF0bCAgICA6IDEyOyAvKiBBdXRob3JpdHktVGFibGUgTGVuZ3RoICovCisJdW5zaWduZWQgbG9uZyAgICAgICAgOiAyOworCXVuc2lnbmVkIGxvbmcgY2EgICAgIDogMTsgLyogQ29udHJvbGxlZC1BU04gQml0ICovCisJdW5zaWduZWQgbG9uZyByYSAgICAgOiAxOyAvKiBSZXVzYWJsZS1BU04gQml0ICovCisJdW5zaWduZWQgbG9uZyBhc2NlICAgOiA2NDsgLyogQWRkcmVzcy1TcGFjZS1Db250cm9sIEVsZW1lbnQgKi8KKwl1bnNpZ25lZCBsb25nIGFsZCAgICA6IDMyOworCXVuc2lnbmVkIGxvbmcgYXN0ZXNuIDogMzI7CisJLyogLi4gbW9yZSBmaWVsZHMgdGhlcmUgKi8KK30gX19wYWNrZWQ7CiAKIGludCBpcHRlX2xvY2tfaGVsZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CkBAIC0zMDcsMTUgKzM1NiwxNTcgQEAKIAkJaXB0ZV91bmxvY2tfc2ltcGxlKHZjcHUpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfdmNwdV9hc2NlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3N0YXRpYyBpbnQgYXJfdHJhbnNsYXRpb24oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bmlvbiBhc2NlICphc2NlLCBhcl90IGFyLAorCQkJICBpbnQgd3JpdGUpCiB7CisJdW5pb24gYWxldCBhbGV0OworCXN0cnVjdCBhbGUgYWxlOworCXN0cnVjdCBhc3RlIGFzdGU7CisJdW5zaWduZWQgbG9uZyBhbGRfYWRkciwgYXV0aG9yaXR5X3RhYmxlX2FkZHI7CisJdW5pb24gYWxkIGFsZDsKKwlpbnQgZWF4LCByYzsKKwl1OCBhdXRob3JpdHlfdGFibGU7CisKKwlpZiAoYXIgPj0gTlVNX0FDUlMpCisJCXJldHVybiAtRUlOVkFMOworCisJc2F2ZV9hY2Nlc3NfcmVncyh2Y3B1LT5ydW4tPnMucmVncy5hY3JzKTsKKwlhbGV0LnZhbCA9IHZjcHUtPnJ1bi0+cy5yZWdzLmFjcnNbYXJdOworCisJaWYgKGFyID09IDAgfHwgYWxldC52YWwgPT0gMCkgeworCQlhc2NlLT52YWwgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzFdOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGFsZXQudmFsID09IDEpIHsKKwkJYXNjZS0+dmFsID0gdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdjcls3XTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGFsZXQucmVzZXJ2ZWQpCisJCXJldHVybiBQR01fQUxFVF9TUEVDSUZJQ0FUSU9OOworCisJaWYgKGFsZXQucCkKKwkJYWxkX2FkZHIgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzVdOworCWVsc2UKKwkJYWxkX2FkZHIgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzJdOworCWFsZF9hZGRyICY9IDB4N2ZmZmZmYzA7CisKKwlyYyA9IHJlYWRfZ3Vlc3RfcmVhbCh2Y3B1LCBhbGRfYWRkciArIDE2LCAmYWxkLnZhbCwgc2l6ZW9mKHVuaW9uIGFsZCkpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKGFsZXQuYWxlbiAvIDggPiBhbGQuYWxsKQorCQlyZXR1cm4gUEdNX0FMRU5fVFJBTlNMQVRJT047CisKKwlpZiAoMHg3ZmZmZmZmZiAtIGFsZC5hbG8gKiAxMjggPCBhbGV0LmFsZW4gKiAxNikKKwkJcmV0dXJuIFBHTV9BRERSRVNTSU5HOworCisJcmMgPSByZWFkX2d1ZXN0X3JlYWwodmNwdSwgYWxkLmFsbyAqIDEyOCArIGFsZXQuYWxlbiAqIDE2LCAmYWxlLAorCQkJICAgICBzaXplb2Yoc3RydWN0IGFsZSkpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKGFsZS5pID09IDEpCisJCXJldHVybiBQR01fQUxFTl9UUkFOU0xBVElPTjsKKwlpZiAoYWxlLmFsZXNuICE9IGFsZXQuYWxlc24pCisJCXJldHVybiBQR01fQUxFX1NFUVVFTkNFOworCisJcmMgPSByZWFkX2d1ZXN0X3JlYWwodmNwdSwgYWxlLmFzdGVvICogNjQsICZhc3RlLCBzaXplb2Yoc3RydWN0IGFzdGUpKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChhc3RlLmkpCisJCXJldHVybiBQR01fQVNURV9WQUxJRElUWTsKKwlpZiAoYXN0ZS5hc3Rlc24gIT0gYWxlLmFzdGVzbikKKwkJcmV0dXJuIFBHTV9BU1RFX1NFUVVFTkNFOworCisJaWYgKGFsZS5wID09IDEpIHsKKwkJZWF4ID0gKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbOF0gPj4gMTYpICYgMHhmZmZmOworCQlpZiAoYWxlLmFsZWF4ICE9IGVheCkgeworCQkJaWYgKGVheCAvIDE2ID4gYXN0ZS5hdGwpCisJCQkJcmV0dXJuIFBHTV9FWFRFTkRFRF9BVVRIT1JJVFk7CisKKwkJCWF1dGhvcml0eV90YWJsZV9hZGRyID0gYXN0ZS5hdG8gKiA0ICsgZWF4IC8gNDsKKworCQkJcmMgPSByZWFkX2d1ZXN0X3JlYWwodmNwdSwgYXV0aG9yaXR5X3RhYmxlX2FkZHIsCisJCQkJCSAgICAgJmF1dGhvcml0eV90YWJsZSwKKwkJCQkJICAgICBzaXplb2YodTgpKTsKKwkJCWlmIChyYykKKwkJCQlyZXR1cm4gcmM7CisKKwkJCWlmICgoYXV0aG9yaXR5X3RhYmxlICYgKDB4NDAgPj4gKChlYXggJiAzKSAqIDIpKSkgPT0gMCkKKwkJCQlyZXR1cm4gUEdNX0VYVEVOREVEX0FVVEhPUklUWTsKKwkJfQorCX0KKworCWlmIChhbGUuZm8gPT0gMSAmJiB3cml0ZSkKKwkJcmV0dXJuIFBHTV9QUk9URUNUSU9OOworCisJYXNjZS0+dmFsID0gYXN0ZS5hc2NlOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgdHJhbnNfZXhjX2NvZGVfYml0cyB7CisJdW5zaWduZWQgbG9uZyBhZGRyIDogNTI7IC8qIFRyYW5zbGF0aW9uLWV4Y2VwdGlvbiBBZGRyZXNzICovCisJdW5zaWduZWQgbG9uZyBmc2kgIDogMjsgIC8qIEFjY2VzcyBFeGNlcHRpb24gRmV0Y2gvU3RvcmUgSW5kaWNhdGlvbiAqLworCXVuc2lnbmVkIGxvbmcJICAgOiA2OworCXVuc2lnbmVkIGxvbmcgYjYwICA6IDE7CisJdW5zaWduZWQgbG9uZyBiNjEgIDogMTsKKwl1bnNpZ25lZCBsb25nIGFzICAgOiAyOyAgLyogQVNDRSBJZGVudGlmaWVyICovCit9OworCitlbnVtIHsKKwlGU0lfVU5LTk9XTiA9IDAsIC8qIFVua25vd24gd2V0aGVyIGZldGNoIG9yIHN0b3JlICovCisJRlNJX1NUT1JFICAgPSAxLCAvKiBFeGNlcHRpb24gd2FzIGR1ZSB0byBzdG9yZSBvcGVyYXRpb24gKi8KKwlGU0lfRkVUQ0ggICA9IDIgIC8qIEV4Y2VwdGlvbiB3YXMgZHVlIHRvIGZldGNoIG9wZXJhdGlvbiAqLworfTsKKworc3RhdGljIGludCBnZXRfdmNwdV9hc2NlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5pb24gYXNjZSAqYXNjZSwKKwkJCSBhcl90IGFyLCBpbnQgd3JpdGUpCit7CisJaW50IHJjOworCXBzd190ICpwc3cgPSAmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3c7CisJc3RydWN0IGt2bV9zMzkwX3BnbV9pbmZvICpwZ20gPSAmdmNwdS0+YXJjaC5wZ207CisJc3RydWN0IHRyYW5zX2V4Y19jb2RlX2JpdHMgKnRlY19iaXRzOworCisJbWVtc2V0KHBnbSwgMCwgc2l6ZW9mKCpwZ20pKTsKKwl0ZWNfYml0cyA9IChzdHJ1Y3QgdHJhbnNfZXhjX2NvZGVfYml0cyAqKSZwZ20tPnRyYW5zX2V4Y19jb2RlOworCXRlY19iaXRzLT5mc2kgPSB3cml0ZSA/IEZTSV9TVE9SRSA6IEZTSV9GRVRDSDsKKwl0ZWNfYml0cy0+YXMgPSBwc3dfYml0cygqcHN3KS5hczsKKworCWlmICghcHN3X2JpdHMoKnBzdykudCkgeworCQlhc2NlLT52YWwgPSAwOworCQlhc2NlLT5yID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc3dpdGNoIChwc3dfYml0cyh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3BzdykuYXMpIHsKIAljYXNlIFBTV19BU19QUklNQVJZOgotCQlyZXR1cm4gdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdjclsxXTsKKwkJYXNjZS0+dmFsID0gdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdjclsxXTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBQU1dfQVNfU0VDT05EQVJZOgotCQlyZXR1cm4gdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdjcls3XTsKKwkJYXNjZS0+dmFsID0gdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdjcls3XTsKKwkJcmV0dXJuIDA7CiAJY2FzZSBQU1dfQVNfSE9NRToKLQkJcmV0dXJuIHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbMTNdOworCQlhc2NlLT52YWwgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzEzXTsKKwkJcmV0dXJuIDA7CisJY2FzZSBQU1dfQVNfQUNDUkVHOgorCQlyYyA9IGFyX3RyYW5zbGF0aW9uKHZjcHUsIGFzY2UsIGFyLCB3cml0ZSk7CisJCXN3aXRjaCAocmMpIHsKKwkJY2FzZSBQR01fQUxFTl9UUkFOU0xBVElPTjoKKwkJY2FzZSBQR01fQUxFX1NFUVVFTkNFOgorCQljYXNlIFBHTV9BU1RFX1ZBTElESVRZOgorCQljYXNlIFBHTV9BU1RFX1NFUVVFTkNFOgorCQljYXNlIFBHTV9FWFRFTkRFRF9BVVRIT1JJVFk6CisJCQl2Y3B1LT5hcmNoLnBnbS5leGNfYWNjZXNzX2lkID0gYXI7CisJCQlicmVhazsKKwkJY2FzZSBQR01fUFJPVEVDVElPTjoKKwkJCXRlY19iaXRzLT5iNjAgPSAxOworCQkJdGVjX2JpdHMtPmI2MSA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAocmMgPiAwKQorCQkJcGdtLT5jb2RlID0gcmM7CisJCXJldHVybiByYzsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0zMzAsMTAgKzUyMSwxMSBAQAogICogQHZjcHU6IHZpcnR1YWwgY3B1CiAgKiBAZ3ZhOiBndWVzdCB2aXJ0dWFsIGFkZHJlc3MKICAqIEBncGE6IHBvaW50cyB0byB3aGVyZSBndWVzdCBwaHlzaWNhbCAoYWJzb2x1dGUpIGFkZHJlc3Mgc2hvdWxkIGJlIHN0b3JlZAorICogQGFzY2U6IGVmZmVjdGl2ZSBhc2NlCiAgKiBAd3JpdGU6IGluZGljYXRlcyBpZiBhY2Nlc3MgaXMgYSB3cml0ZSBhY2Nlc3MKICAqCiAgKiBUcmFuc2xhdGUgYSBndWVzdCB2aXJ0dWFsIGFkZHJlc3MgaW50byBhIGd1ZXN0IGFic29sdXRlIGFkZHJlc3MgYnkgbWVhbnMKLSAqIG9mIGR5bmFtaWMgYWRkcmVzcyB0cmFuc2xhdGlvbiBhcyBzcGVjaWZpZWQgYnkgdGhlIGFyY2hpdGVjdXR1cmUuCisgKiBvZiBkeW5hbWljIGFkZHJlc3MgdHJhbnNsYXRpb24gYXMgc3BlY2lmaWVkIGJ5IHRoZSBhcmNoaXRlY3R1cmUuCiAgKiBJZiB0aGUgcmVzdWx0aW5nIGFic29sdXRlIGFkZHJlc3MgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgY29uZmlndXJhdGlvbgogICogYW4gYWRkcmVzc2luZyBleGNlcHRpb24gaXMgaW5kaWNhdGVkIGFuZCBAZ3BhIHdpbGwgbm90IGJlIGNoYW5nZWQuCiAgKgpAQCAtMzQ1LDcgKzUzNyw4IEBACiAgKgkgICAgICBieSB0aGUgYXJjaGl0ZWN0dXJlCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGd1ZXN0X3RyYW5zbGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZ3ZhLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqZ3BhLCBpbnQgd3JpdGUpCisJCQkJICAgICB1bnNpZ25lZCBsb25nICpncGEsIGNvbnN0IHVuaW9uIGFzY2UgYXNjZSwKKwkJCQkgICAgIGludCB3cml0ZSkKIHsKIAl1bmlvbiB2YWRkcmVzcyB2YWRkciA9IHsuYWRkciA9IGd2YX07CiAJdW5pb24gcmFkZHJlc3MgcmFkZHIgPSB7LmFkZHIgPSBndmF9OwpAQCAtMzU0LDEyICs1NDcsMTAgQEAKIAl1bmlvbiBjdGxyZWcwIGN0bHJlZzA7CiAJdW5zaWduZWQgbG9uZyBwdHI7CiAJaW50IGVkYXQxLCBlZGF0MjsKLQl1bmlvbiBhc2NlIGFzY2U7CiAKIAljdGxyZWcwLnZhbCA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbMF07CiAJZWRhdDEgPSBjdGxyZWcwLmVkYXQgJiYgdGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCA4KTsKIAllZGF0MiA9IGVkYXQxICYmIHRlc3Rfa3ZtX2ZhY2lsaXR5KHZjcHUtPmt2bSwgNzgpOwotCWFzY2UudmFsID0gZ2V0X3ZjcHVfYXNjZSh2Y3B1KTsKIAlpZiAoYXNjZS5yKQogCQlnb3RvIHJlYWxfYWRkcmVzczsKIAlwdHIgPSBhc2NlLm9yaWdpbiAqIDQwOTY7CkBAIC01MDYsNDggKzY5NywzMCBAQAogCXJldHVybiAoZ2EgJiB+MHgxMWZmdWwpID09IDA7CiB9CiAKLXN0YXRpYyBpbnQgbG93X2FkZHJlc3NfcHJvdGVjdGlvbl9lbmFibGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3N0YXRpYyBpbnQgbG93X2FkZHJlc3NfcHJvdGVjdGlvbl9lbmFibGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkJICBjb25zdCB1bmlvbiBhc2NlIGFzY2UpCiB7CiAJdW5pb24gY3RscmVnMCBjdGxyZWcwID0gey52YWwgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzBdfTsKIAlwc3dfdCAqcHN3ID0gJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3OwotCXVuaW9uIGFzY2UgYXNjZTsKIAogCWlmICghY3RscmVnMC5sYXApCiAJCXJldHVybiAwOwotCWFzY2UudmFsID0gZ2V0X3ZjcHVfYXNjZSh2Y3B1KTsKIAlpZiAocHN3X2JpdHMoKnBzdykudCAmJiBhc2NlLnApCiAJCXJldHVybiAwOwogCXJldHVybiAxOwogfQogCi1zdHJ1Y3QgdHJhbnNfZXhjX2NvZGVfYml0cyB7Ci0JdW5zaWduZWQgbG9uZyBhZGRyIDogNTI7IC8qIFRyYW5zbGF0aW9uLWV4Y2VwdGlvbiBBZGRyZXNzICovCi0JdW5zaWduZWQgbG9uZyBmc2kgIDogMjsgIC8qIEFjY2VzcyBFeGNlcHRpb24gRmV0Y2gvU3RvcmUgSW5kaWNhdGlvbiAqLwotCXVuc2lnbmVkIGxvbmcJICAgOiA3OwotCXVuc2lnbmVkIGxvbmcgYjYxICA6IDE7Ci0JdW5zaWduZWQgbG9uZyBhcyAgIDogMjsgIC8qIEFTQ0UgSWRlbnRpZmllciAqLwotfTsKLQotZW51bSB7Ci0JRlNJX1VOS05PV04gPSAwLCAvKiBVbmtub3duIHdldGhlciBmZXRjaCBvciBzdG9yZSAqLwotCUZTSV9TVE9SRSAgID0gMSwgLyogRXhjZXB0aW9uIHdhcyBkdWUgdG8gc3RvcmUgb3BlcmF0aW9uICovCi0JRlNJX0ZFVENIICAgPSAyICAvKiBFeGNlcHRpb24gd2FzIGR1ZSB0byBmZXRjaCBvcGVyYXRpb24gKi8KLX07Ci0KIHN0YXRpYyBpbnQgZ3Vlc3RfcGFnZV9yYW5nZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZ2EsCiAJCQkgICAgdW5zaWduZWQgbG9uZyAqcGFnZXMsIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsCi0JCQkgICAgaW50IHdyaXRlKQorCQkJICAgIGNvbnN0IHVuaW9uIGFzY2UgYXNjZSwgaW50IHdyaXRlKQogewogCXN0cnVjdCBrdm1fczM5MF9wZ21faW5mbyAqcGdtID0gJnZjcHUtPmFyY2gucGdtOwogCXBzd190ICpwc3cgPSAmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3c7CiAJc3RydWN0IHRyYW5zX2V4Y19jb2RlX2JpdHMgKnRlY19iaXRzOwogCWludCBsYXBfZW5hYmxlZCwgcmM7CiAKLQltZW1zZXQocGdtLCAwLCBzaXplb2YoKnBnbSkpOwogCXRlY19iaXRzID0gKHN0cnVjdCB0cmFuc19leGNfY29kZV9iaXRzICopJnBnbS0+dHJhbnNfZXhjX2NvZGU7Ci0JdGVjX2JpdHMtPmZzaSA9IHdyaXRlID8gRlNJX1NUT1JFIDogRlNJX0ZFVENIOwotCXRlY19iaXRzLT5hcyA9IHBzd19iaXRzKCpwc3cpLmFzOwotCWxhcF9lbmFibGVkID0gbG93X2FkZHJlc3NfcHJvdGVjdGlvbl9lbmFibGVkKHZjcHUpOworCWxhcF9lbmFibGVkID0gbG93X2FkZHJlc3NfcHJvdGVjdGlvbl9lbmFibGVkKHZjcHUsIGFzY2UpOwogCXdoaWxlIChucl9wYWdlcykgewogCQlnYSA9IGt2bV9zMzkwX2xvZ2ljYWxfdG9fZWZmZWN0aXZlKHZjcHUsIGdhKTsKIAkJdGVjX2JpdHMtPmFkZHIgPSBnYSA+PiBQQUdFX1NISUZUOwpAQCAtNTU3LDcgKzczMCw3IEBACiAJCX0KIAkJZ2EgJj0gUEFHRV9NQVNLOwogCQlpZiAocHN3X2JpdHMoKnBzdykudCkgewotCQkJcmMgPSBndWVzdF90cmFuc2xhdGUodmNwdSwgZ2EsIHBhZ2VzLCB3cml0ZSk7CisJCQlyYyA9IGd1ZXN0X3RyYW5zbGF0ZSh2Y3B1LCBnYSwgcGFnZXMsIGFzY2UsIHdyaXRlKTsKIAkJCWlmIChyYyA8IDApCiAJCQkJcmV0dXJuIHJjOwogCQkJaWYgKHJjID09IFBHTV9QUk9URUNUSU9OKQpAQCAtNTc4LDcgKzc1MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhY2Nlc3NfZ3Vlc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGdhLCB2b2lkICpkYXRhLAoraW50IGFjY2Vzc19ndWVzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZ2EsIGFyX3QgYXIsIHZvaWQgKmRhdGEsCiAJCSB1bnNpZ25lZCBsb25nIGxlbiwgaW50IHdyaXRlKQogewogCXBzd190ICpwc3cgPSAmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3c7CkBAIC01OTEsMjAgKzc2NCwxOSBAQAogCiAJaWYgKCFsZW4pCiAJCXJldHVybiAwOwotCS8qIEFjY2VzcyByZWdpc3RlciBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LiAqLwotCWlmIChwc3dfYml0cygqcHN3KS50ICYmIHBzd19iaXRzKCpwc3cpLmFzID09IFBTV19BU19BQ0NSRUcpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKKwlyYyA9IGdldF92Y3B1X2FzY2UodmNwdSwgJmFzY2UsIGFyLCB3cml0ZSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAJbnJfcGFnZXMgPSAoKChnYSAmIH5QQUdFX01BU0spICsgbGVuIC0gMSkgPj4gUEFHRV9TSElGVCkgKyAxOwogCXBhZ2VzID0gcGFnZXNfYXJyYXk7CiAJaWYgKG5yX3BhZ2VzID4gQVJSQVlfU0laRShwYWdlc19hcnJheSkpCiAJCXBhZ2VzID0gdm1hbGxvYyhucl9wYWdlcyAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CiAJaWYgKCFwYWdlcykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JYXNjZS52YWwgPSBnZXRfdmNwdV9hc2NlKHZjcHUpOwogCW5lZWRfaXB0ZV9sb2NrID0gcHN3X2JpdHMoKnBzdykudCAmJiAhYXNjZS5yOwogCWlmIChuZWVkX2lwdGVfbG9jaykKIAkJaXB0ZV9sb2NrKHZjcHUpOwotCXJjID0gZ3Vlc3RfcGFnZV9yYW5nZSh2Y3B1LCBnYSwgcGFnZXMsIG5yX3BhZ2VzLCB3cml0ZSk7CisJcmMgPSBndWVzdF9wYWdlX3JhbmdlKHZjcHUsIGdhLCBwYWdlcywgbnJfcGFnZXMsIGFzY2UsIHdyaXRlKTsKIAlmb3IgKGlkeCA9IDA7IGlkeCA8IG5yX3BhZ2VzICYmICFyYzsgaWR4KyspIHsKIAkJZ3BhID0gKihwYWdlcyArIGlkeCkgKyAoZ2EgJiB+UEFHRV9NQVNLKTsKIAkJX2xlbiA9IG1pbihQQUdFX1NJWkUgLSAoZ3BhICYgflBBR0VfTUFTSyksIGxlbik7CkBAIC02NTIsNyArODI0LDcgQEAKICAqIE5vdGU6IFRoZSBJUFRFIGxvY2sgaXMgbm90IHRha2VuIGR1cmluZyB0aGlzIGZ1bmN0aW9uLCBzbyB0aGUgY2FsbGVyCiAgKiBoYXMgdG8gdGFrZSBjYXJlIG9mIHRoaXMuCiAgKi8KLWludCBndWVzdF90cmFuc2xhdGVfYWRkcmVzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZ3ZhLAoraW50IGd1ZXN0X3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBndmEsIGFyX3QgYXIsCiAJCQkgICAgdW5zaWduZWQgbG9uZyAqZ3BhLCBpbnQgd3JpdGUpCiB7CiAJc3RydWN0IGt2bV9zMzkwX3BnbV9pbmZvICpwZ20gPSAmdmNwdS0+YXJjaC5wZ207CkBAIC02NjEsMjYgKzgzMywyMSBAQAogCXVuaW9uIGFzY2UgYXNjZTsKIAlpbnQgcmM7CiAKLQkvKiBBY2Nlc3MgcmVnaXN0ZXIgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4gKi8KLQlpZiAocHN3X2JpdHMoKnBzdykudCAmJiBwc3dfYml0cygqcHN3KS5hcyA9PSBQU1dfQVNfQUNDUkVHKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KIAlndmEgPSBrdm1fczM5MF9sb2dpY2FsX3RvX2VmZmVjdGl2ZSh2Y3B1LCBndmEpOwotCW1lbXNldChwZ20sIDAsIHNpemVvZigqcGdtKSk7CiAJdGVjID0gKHN0cnVjdCB0cmFuc19leGNfY29kZV9iaXRzICopJnBnbS0+dHJhbnNfZXhjX2NvZGU7Ci0JdGVjLT5hcyA9IHBzd19iaXRzKCpwc3cpLmFzOwotCXRlYy0+ZnNpID0gd3JpdGUgPyBGU0lfU1RPUkUgOiBGU0lfRkVUQ0g7CisJcmMgPSBnZXRfdmNwdV9hc2NlKHZjcHUsICZhc2NlLCBhciwgd3JpdGUpOwogCXRlYy0+YWRkciA9IGd2YSA+PiBQQUdFX1NISUZUOwotCWlmIChpc19sb3dfYWRkcmVzcyhndmEpICYmIGxvd19hZGRyZXNzX3Byb3RlY3Rpb25fZW5hYmxlZCh2Y3B1KSkgeworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWlmIChpc19sb3dfYWRkcmVzcyhndmEpICYmIGxvd19hZGRyZXNzX3Byb3RlY3Rpb25fZW5hYmxlZCh2Y3B1LCBhc2NlKSkgewogCQlpZiAod3JpdGUpIHsKIAkJCXJjID0gcGdtLT5jb2RlID0gUEdNX1BST1RFQ1RJT047CiAJCQlyZXR1cm4gcmM7CiAJCX0KIAl9CiAKLQlhc2NlLnZhbCA9IGdldF92Y3B1X2FzY2UodmNwdSk7CiAJaWYgKHBzd19iaXRzKCpwc3cpLnQgJiYgIWFzY2UucikgewkvKiBVc2UgREFUPyAqLwotCQlyYyA9IGd1ZXN0X3RyYW5zbGF0ZSh2Y3B1LCBndmEsIGdwYSwgd3JpdGUpOworCQlyYyA9IGd1ZXN0X3RyYW5zbGF0ZSh2Y3B1LCBndmEsIGdwYSwgYXNjZSwgd3JpdGUpOwogCQlpZiAocmMgPiAwKSB7CiAJCQlpZiAocmMgPT0gUEdNX1BST1RFQ1RJT04pCiAJCQkJdGVjLT5iNjEgPSAxOwpAQCAtNjk3LDI4ICs4NjQsNTEgQEAKIH0KIAogLyoqCi0gKiBrdm1fczM5MF9jaGVja19sb3dfYWRkcl9wcm90ZWN0aW9uIC0gY2hlY2sgZm9yIGxvdy1hZGRyZXNzIHByb3RlY3Rpb24KLSAqIEBnYTogR3Vlc3QgYWRkcmVzcworICogY2hlY2tfZ3ZhX3JhbmdlIC0gdGVzdCBhIHJhbmdlIG9mIGd1ZXN0IHZpcnR1YWwgYWRkcmVzc2VzIGZvciBhY2Nlc3NpYmlsaXR5CisgKi8KK2ludCBjaGVja19ndmFfcmFuZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGd2YSwgYXJfdCBhciwKKwkJICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCBpbnQgaXNfd3JpdGUpCit7CisJdW5zaWduZWQgbG9uZyBncGE7CisJdW5zaWduZWQgbG9uZyBjdXJybGVuOworCWludCByYyA9IDA7CisKKwlpcHRlX2xvY2sodmNwdSk7CisJd2hpbGUgKGxlbmd0aCA+IDAgJiYgIXJjKSB7CisJCWN1cnJsZW4gPSBtaW4obGVuZ3RoLCBQQUdFX1NJWkUgLSAoZ3ZhICUgUEFHRV9TSVpFKSk7CisJCXJjID0gZ3Vlc3RfdHJhbnNsYXRlX2FkZHJlc3ModmNwdSwgZ3ZhLCBhciwgJmdwYSwgaXNfd3JpdGUpOworCQlndmEgKz0gY3VycmxlbjsKKwkJbGVuZ3RoIC09IGN1cnJsZW47CisJfQorCWlwdGVfdW5sb2NrKHZjcHUpOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGt2bV9zMzkwX2NoZWNrX2xvd19hZGRyX3Byb3RfcmVhbCAtIGNoZWNrIGZvciBsb3ctYWRkcmVzcyBwcm90ZWN0aW9uCisgKiBAZ3JhOiBHdWVzdCByZWFsIGFkZHJlc3MKICAqCiAgKiBDaGVja3Mgd2hldGhlciBhbiBhZGRyZXNzIGlzIHN1YmplY3QgdG8gbG93LWFkZHJlc3MgcHJvdGVjdGlvbiBhbmQgc2V0CiAgKiB1cCB2Y3B1LT5hcmNoLnBnbSBhY2NvcmRpbmdseSBpZiBuZWNlc3NhcnkuCiAgKgogICogUmV0dXJuOiAwIGlmIG5vIHByb3RlY3Rpb24gZXhjZXB0aW9uLCBvciBQR01fUFJPVEVDVElPTiBpZiBwcm90ZWN0ZWQuCiAgKi8KLWludCBrdm1fczM5MF9jaGVja19sb3dfYWRkcl9wcm90ZWN0aW9uKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBnYSkKK2ludCBrdm1fczM5MF9jaGVja19sb3dfYWRkcl9wcm90X3JlYWwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGdyYSkKIHsKIAlzdHJ1Y3Qga3ZtX3MzOTBfcGdtX2luZm8gKnBnbSA9ICZ2Y3B1LT5hcmNoLnBnbTsKIAlwc3dfdCAqcHN3ID0gJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3OwogCXN0cnVjdCB0cmFuc19leGNfY29kZV9iaXRzICp0ZWNfYml0czsKKwl1bmlvbiBjdGxyZWcwIGN0bHJlZzAgPSB7LnZhbCA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbMF19OwogCi0JaWYgKCFpc19sb3dfYWRkcmVzcyhnYSkgfHwgIWxvd19hZGRyZXNzX3Byb3RlY3Rpb25fZW5hYmxlZCh2Y3B1KSkKKwlpZiAoIWN0bHJlZzAubGFwIHx8ICFpc19sb3dfYWRkcmVzcyhncmEpKQogCQlyZXR1cm4gMDsKIAogCW1lbXNldChwZ20sIDAsIHNpemVvZigqcGdtKSk7CiAJdGVjX2JpdHMgPSAoc3RydWN0IHRyYW5zX2V4Y19jb2RlX2JpdHMgKikmcGdtLT50cmFuc19leGNfY29kZTsKIAl0ZWNfYml0cy0+ZnNpID0gRlNJX1NUT1JFOwogCXRlY19iaXRzLT5hcyA9IHBzd19iaXRzKCpwc3cpLmFzOwotCXRlY19iaXRzLT5hZGRyID0gZ2EgPj4gUEFHRV9TSElGVDsKKwl0ZWNfYml0cy0+YWRkciA9IGdyYSA+PiBQQUdFX1NISUZUOwogCXBnbS0+Y29kZSA9IFBHTV9QUk9URUNUSU9OOwogCiAJcmV0dXJuIHBnbS0+Y29kZTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vZ2FjY2Vzcy5oIGIvYXJjaC9zMzkwL2t2bS9nYWNjZXNzLmgKaW5kZXggMDE0OWNmMS4uZWYwMzcyNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9nYWNjZXNzLmgKKysrIGIvYXJjaC9zMzkwL2t2bS9nYWNjZXNzLmgKQEAgLTE1Niw5ICsxNTYsMTEgQEAKIH0KIAogaW50IGd1ZXN0X3RyYW5zbGF0ZV9hZGRyZXNzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBndmEsCi0JCQkgICAgdW5zaWduZWQgbG9uZyAqZ3BhLCBpbnQgd3JpdGUpOworCQkJICAgIGFyX3QgYXIsIHVuc2lnbmVkIGxvbmcgKmdwYSwgaW50IHdyaXRlKTsKK2ludCBjaGVja19ndmFfcmFuZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGd2YSwgYXJfdCBhciwKKwkJICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCBpbnQgaXNfd3JpdGUpOwogCi1pbnQgYWNjZXNzX2d1ZXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBnYSwgdm9pZCAqZGF0YSwKK2ludCBhY2Nlc3NfZ3Vlc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGdhLCBhcl90IGFyLCB2b2lkICpkYXRhLAogCQkgdW5zaWduZWQgbG9uZyBsZW4sIGludCB3cml0ZSk7CiAKIGludCBhY2Nlc3NfZ3Vlc3RfcmVhbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZ3JhLApAQCAtMTY4LDYgKzE3MCw3IEBACiAgKiB3cml0ZV9ndWVzdCAtIGNvcHkgZGF0YSBmcm9tIGtlcm5lbCBzcGFjZSB0byBndWVzdCBzcGFjZQogICogQHZjcHU6IHZpcnR1YWwgY3B1CiAgKiBAZ2E6IGd1ZXN0IGFkZHJlc3MKKyAqIEBhcjogYWNjZXNzIHJlZ2lzdGVyCiAgKiBAZGF0YTogc291cmNlIGFkZHJlc3MgaW4ga2VybmVsIHNwYWNlCiAgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQogICoKQEAgLTE3Niw4ICsxNzksNyBAQAogICogSWYgREFUIGlzIG9mZiBkYXRhIHdpbGwgYmUgY29waWVkIHRvIGd1ZXN0IHJlYWwgb3IgYWJzb2x1dGUgbWVtb3J5LgogICogSWYgREFUIGlzIG9uIGRhdGEgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGFkZHJlc3Mgc3BhY2UgYXMgc3BlY2lmaWVkIGJ5CiAgKiB0aGUgYWRkcmVzcyBzcGFjZSBiaXRzIG9mIHRoZSBQU1c6Ci0gKiBQcmltYXJ5LCBzZWNvbmRvcnkgb3IgaG9tZSBzcGFjZSAoYWNjZXNzIHJlZ2lzdGVyIG1vZGUgaXMgY3VycmVudGx5IG5vdAotICogaW1wbGVtZW50ZWQpLgorICogUHJpbWFyeSwgc2Vjb25kYXJ5LCBob21lIHNwYWNlIG9yIGFjY2VzcyByZWdpc3RlciBtb2RlLgogICogVGhlIGFkZHJlc3NpbmcgbW9kZSBvZiB0aGUgUFNXIGlzIGFsc28gaW5zcGVjdGVkLCBzbyB0aGF0IGFkZHJlc3Mgd3JhcAogICogYXJvdW5kIGlzIHRha2VuIGludG8gYWNjb3VudCBmb3IgMjQtLCAzMS0gYW5kIDY0LWJpdCBhZGRyZXNzaW5nIG1vZGUsCiAgKiBpZiB0aGUgdG8gYmUgY29waWVkIGRhdGEgY3Jvc3NlcyBwYWdlIGJvdW5kYXJpZXMgaW4gZ3Vlc3QgYWRkcmVzcyBzcGFjZS4KQEAgLTIxMCwxNiArMjEyLDE3IEBACiAgKgkgaWYgZGF0YSBoYXMgYmVlbiBjaGFuZ2VkIGluIGd1ZXN0IHNwYWNlIGluIGNhc2Ugb2YgYW4gZXhjZXB0aW9uLgogICovCiBzdGF0aWMgaW5saW5lIF9fbXVzdF9jaGVjawotaW50IHdyaXRlX2d1ZXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBnYSwgdm9pZCAqZGF0YSwKK2ludCB3cml0ZV9ndWVzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZ2EsIGFyX3QgYXIsIHZvaWQgKmRhdGEsCiAJCXVuc2lnbmVkIGxvbmcgbGVuKQogewotCXJldHVybiBhY2Nlc3NfZ3Vlc3QodmNwdSwgZ2EsIGRhdGEsIGxlbiwgMSk7CisJcmV0dXJuIGFjY2Vzc19ndWVzdCh2Y3B1LCBnYSwgYXIsIGRhdGEsIGxlbiwgMSk7CiB9CiAKIC8qKgogICogcmVhZF9ndWVzdCAtIGNvcHkgZGF0YSBmcm9tIGd1ZXN0IHNwYWNlIHRvIGtlcm5lbCBzcGFjZQogICogQHZjcHU6IHZpcnR1YWwgY3B1CiAgKiBAZ2E6IGd1ZXN0IGFkZHJlc3MKKyAqIEBhcjogYWNjZXNzIHJlZ2lzdGVyCiAgKiBAZGF0YTogZGVzdGluYXRpb24gYWRkcmVzcyBpbiBrZXJuZWwgc3BhY2UKICAqIEBsZW46IG51bWJlciBvZiBieXRlcyB0byBjb3B5CiAgKgpAQCAtMjI5LDEwICsyMzIsMTAgQEAKICAqIGRhdGEgd2lsbCBiZSBjb3BpZWQgZnJvbSBndWVzdCBzcGFjZSB0byBrZXJuZWwgc3BhY2UuCiAgKi8KIHN0YXRpYyBpbmxpbmUgX19tdXN0X2NoZWNrCi1pbnQgcmVhZF9ndWVzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZ2EsIHZvaWQgKmRhdGEsCitpbnQgcmVhZF9ndWVzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZ2EsIGFyX3QgYXIsIHZvaWQgKmRhdGEsCiAJICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuKQogewotCXJldHVybiBhY2Nlc3NfZ3Vlc3QodmNwdSwgZ2EsIGRhdGEsIGxlbiwgMCk7CisJcmV0dXJuIGFjY2Vzc19ndWVzdCh2Y3B1LCBnYSwgYXIsIGRhdGEsIGxlbiwgMCk7CiB9CiAKIC8qKgpAQCAtMzMwLDYgKzMzMyw2IEBACiB2b2lkIGlwdGVfbG9jayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBpcHRlX3VubG9jayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogaW50IGlwdGVfbG9ja19oZWxkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7Ci1pbnQga3ZtX3MzOTBfY2hlY2tfbG93X2FkZHJfcHJvdGVjdGlvbihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZ2EpOworaW50IGt2bV9zMzkwX2NoZWNrX2xvd19hZGRyX3Byb3RfcmVhbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgZ3JhKTsKIAogI2VuZGlmIC8qIF9fS1ZNX1MzOTBfR0FDQ0VTU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL2d1ZXN0ZGJnLmMgYi9hcmNoL3MzOTAva3ZtL2d1ZXN0ZGJnLmMKaW5kZXggM2U4ZDQwOS4uZTk3YjM0NSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9ndWVzdGRiZy5jCisrKyBiL2FyY2gvczM5MC9rdm0vZ3Vlc3RkYmcuYwpAQCAtMTkxLDggKzE5MSw4IEBACiAJaWYgKCF3cF9pbmZvLT5vbGRfZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJLyogdHJ5IHRvIGJhY2t1cCB0aGUgb3JpZ2luYWwgdmFsdWUgKi8KLQlyZXQgPSByZWFkX2d1ZXN0KHZjcHUsIHdwX2luZm8tPnBoeXNfYWRkciwgd3BfaW5mby0+b2xkX2RhdGEsCi0JCQkgd3BfaW5mby0+bGVuKTsKKwlyZXQgPSByZWFkX2d1ZXN0X2Ficyh2Y3B1LCB3cF9pbmZvLT5waHlzX2FkZHIsIHdwX2luZm8tPm9sZF9kYXRhLAorCQkJICAgICB3cF9pbmZvLT5sZW4pOwogCWlmIChyZXQpIHsKIAkJa2ZyZWUod3BfaW5mby0+b2xkX2RhdGEpOwogCQl3cF9pbmZvLT5vbGRfZGF0YSA9IE5VTEw7CkBAIC0zNjIsOCArMzYyLDggQEAKIAkJCWNvbnRpbnVlOwogCiAJCS8qIHJlZmV0Y2ggdGhlIHdwIGRhdGEgYW5kIGNvbXBhcmUgaXQgdG8gdGhlIG9sZCB2YWx1ZSAqLwotCQlpZiAoIXJlYWRfZ3Vlc3QodmNwdSwgd3BfaW5mby0+cGh5c19hZGRyLCB0ZW1wLAotCQkJCXdwX2luZm8tPmxlbikpIHsKKwkJaWYgKCFyZWFkX2d1ZXN0X2Ficyh2Y3B1LCB3cF9pbmZvLT5waHlzX2FkZHIsIHRlbXAsCisJCQkJICAgIHdwX2luZm8tPmxlbikpIHsKIAkJCWlmIChtZW1jbXAodGVtcCwgd3BfaW5mby0+b2xkX2RhdGEsIHdwX2luZm8tPmxlbikpIHsKIAkJCQlrZnJlZSh0ZW1wKTsKIAkJCQlyZXR1cm4gd3BfaW5mbzsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vaW50ZXJjZXB0LmMgYi9hcmNoL3MzOTAva3ZtL2ludGVyY2VwdC5jCmluZGV4IGJlYmQyMTUuLjllMzc3OWUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vaW50ZXJjZXB0LmMKKysrIGIvYXJjaC9zMzkwL2t2bS9pbnRlcmNlcHQuYwpAQCAtMTY1LDYgKzE2NSw3IEBACiAJCXBnbV9pbmZvLT5tb25fY2xhc3NfbnIgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+bWNuOwogCQlwZ21faW5mby0+bW9uX2NvZGUgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+dGVjbWM7CiAJCWJyZWFrOworCWNhc2UgUEdNX1ZFQ1RPUl9QUk9DRVNTSU5HOgogCWNhc2UgUEdNX0RBVEE6CiAJCXBnbV9pbmZvLT5kYXRhX2V4Y19jb2RlID0gdmNwdS0+YXJjaC5zaWVfYmxvY2stPmR4YzsKIAkJYnJlYWs7CkBAIC0zMTksNyArMzIwLDcgQEAKIAogCS8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBzb3VyY2UgaXMgcGFnZWQtaW4gKi8KIAlyYyA9IGd1ZXN0X3RyYW5zbGF0ZV9hZGRyZXNzKHZjcHUsIHZjcHUtPnJ1bi0+cy5yZWdzLmdwcnNbcmVnMl0sCi0JCQkJICAgICAmc3JjYWRkciwgMCk7CisJCQkJICAgICByZWcyLCAmc3JjYWRkciwgMCk7CiAJaWYgKHJjKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dfY29uZCh2Y3B1LCByYyk7CiAJcmMgPSBrdm1fYXJjaF9mYXVsdF9pbl9wYWdlKHZjcHUsIHNyY2FkZHIsIDApOwpAQCAtMzI4LDcgKzMyOSw3IEBACiAKIAkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgZGVzdGluYXRpb24gaXMgcGFnZWQtaW4gKi8KIAlyYyA9IGd1ZXN0X3RyYW5zbGF0ZV9hZGRyZXNzKHZjcHUsIHZjcHUtPnJ1bi0+cy5yZWdzLmdwcnNbcmVnMV0sCi0JCQkJICAgICAmZHN0YWRkciwgMSk7CisJCQkJICAgICByZWcxLCAmZHN0YWRkciwgMSk7CiAJaWYgKHJjKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dfY29uZCh2Y3B1LCByYyk7CiAJcmMgPSBrdm1fYXJjaF9mYXVsdF9pbl9wYWdlKHZjcHUsIGRzdGFkZHIsIDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYyBiL2FyY2gvczM5MC9rdm0vaW50ZXJydXB0LmMKaW5kZXggMDczYjVmMy4uOWRlNDcyNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3MzOTAva3ZtL2ludGVycnVwdC5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGhhbmRsaW5nIGt2bSBndWVzdCBpbnRlcnJ1cHRzCiAgKgotICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA4LDIwMTQKKyAqIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwOCwgMjAxNQogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICh2ZXJzaW9uIDIgb25seSkKQEAgLTE3LDkgKzE3LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KKyNpbmNsdWRlIDxhc20vZGlzLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vc2NscC5oPgorI2luY2x1ZGUgPGFzbS9pc2MuaD4KICNpbmNsdWRlICJrdm0tczM5MC5oIgogI2luY2x1ZGUgImdhY2Nlc3MuaCIKICNpbmNsdWRlICJ0cmFjZS1zMzkwLmgiCkBAIC0zMiwxMSArMzUsNiBAQAogI2RlZmluZSBQRkFVTFRfRE9ORSAweDA2ODAKICNkZWZpbmUgVklSVElPX1BBUkFNIDB4MGQwMAogCi1zdGF0aWMgaW50IGlzX2lvaW50KHU2NCB0eXBlKQotewotCXJldHVybiAoKHR5cGUgJiAweGZmZmUwMDAwdSkgIT0gMHhmZmZlMDAwMHUpOwotfQotCiBpbnQgcHN3X2V4dGludF9kaXNhYmxlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJcmV0dXJuICEodmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3cubWFzayAmIFBTV19NQVNLX0VYVCk7CkBAIC03Miw3MCArNzAsNDUgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHU2NCBpbnRfd29yZF90b19pc2NfYml0cyh1MzIgaW50X3dvcmQpCitzdGF0aWMgaW50IGNrY19pcnFfcGVuZGluZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0JdTggaXNjID0gKGludF93b3JkICYgMHgzODAwMDAwMCkgPj4gMjc7CisJaWYgKCEodmNwdS0+YXJjaC5zaWVfYmxvY2stPmNrYyA8CisJICAgICAgZ2V0X3RvZF9jbG9ja19mYXN0KCkgKyB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZXBvY2gpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gY2tjX2ludGVycnVwdHNfZW5hYmxlZCh2Y3B1KTsKK30KIAorc3RhdGljIGludCBjcHVfdGltZXJfaW50ZXJydXB0c19lbmFibGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gIXBzd19leHRpbnRfZGlzYWJsZWQodmNwdSkgJiYKKwkgICAgICAgKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbMF0gJiAweDQwMHVsKTsKK30KKworc3RhdGljIGludCBjcHVfdGltZXJfaXJxX3BlbmRpbmcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXJldHVybiAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmNwdXRtID4+IDYzKSAmJgorCSAgICAgICBjcHVfdGltZXJfaW50ZXJydXB0c19lbmFibGVkKHZjcHUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19pb2lycSh1bnNpZ25lZCBsb25nIGlycV90eXBlKQoreworCXJldHVybiAoKGlycV90eXBlID49IElSUV9QRU5EX0lPX0lTQ18wKSAmJgorCQkoaXJxX3R5cGUgPD0gSVJRX1BFTkRfSU9fSVNDXzcpKTsKK30KKworc3RhdGljIHVpbnQ2NF90IGlzY190b19pc2NfYml0cyhpbnQgaXNjKQorewogCXJldHVybiAoMHg4MCA+PiBpc2MpIDw8IDI0OwogfQogCi1zdGF0aWMgaW50IF9fbXVzdF9jaGVjayBfX2ludGVycnVwdF9pc19kZWxpdmVyYWJsZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJICAgICAgc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpKQorc3RhdGljIGlubGluZSB1OCBpbnRfd29yZF90b19pc2ModTMyIGludF93b3JkKQogewotCXN3aXRjaCAoaW50aS0+dHlwZSkgewotCWNhc2UgS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEw6Ci0JCWlmIChwc3dfZXh0aW50X2Rpc2FibGVkKHZjcHUpKQotCQkJcmV0dXJuIDA7Ci0JCWlmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzBdICYgMHgyMDAwdWwpCi0JCQlyZXR1cm4gMTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBLVk1fUzM5MF9JTlRfRU1FUkdFTkNZOgotCQlpZiAocHN3X2V4dGludF9kaXNhYmxlZCh2Y3B1KSkKLQkJCXJldHVybiAwOwotCQlpZiAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmdjclswXSAmIDB4NDAwMHVsKQotCQkJcmV0dXJuIDE7Ci0JCXJldHVybiAwOwotCWNhc2UgS1ZNX1MzOTBfSU5UX0NMT0NLX0NPTVA6Ci0JCXJldHVybiBja2NfaW50ZXJydXB0c19lbmFibGVkKHZjcHUpOwotCWNhc2UgS1ZNX1MzOTBfSU5UX0NQVV9USU1FUjoKLQkJaWYgKHBzd19leHRpbnRfZGlzYWJsZWQodmNwdSkpCi0JCQlyZXR1cm4gMDsKLQkJaWYgKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbMF0gJiAweDQwMHVsKQotCQkJcmV0dXJuIDE7Ci0JCXJldHVybiAwOwotCWNhc2UgS1ZNX1MzOTBfSU5UX1NFUlZJQ0U6Ci0JY2FzZSBLVk1fUzM5MF9JTlRfUEZBVUxUX0lOSVQ6Ci0JY2FzZSBLVk1fUzM5MF9JTlRfUEZBVUxUX0RPTkU6Ci0JY2FzZSBLVk1fUzM5MF9JTlRfVklSVElPOgotCQlpZiAocHN3X2V4dGludF9kaXNhYmxlZCh2Y3B1KSkKLQkJCXJldHVybiAwOwotCQlpZiAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmdjclswXSAmIDB4MjAwdWwpCi0JCQlyZXR1cm4gMTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBLVk1fUzM5MF9QUk9HUkFNX0lOVDoKLQljYXNlIEtWTV9TMzkwX1NJR1BfU1RPUDoKLQljYXNlIEtWTV9TMzkwX1NJR1BfU0VUX1BSRUZJWDoKLQljYXNlIEtWTV9TMzkwX1JFU1RBUlQ6Ci0JCXJldHVybiAxOwotCWNhc2UgS1ZNX1MzOTBfTUNISzoKLQkJaWYgKHBzd19tY2hrX2Rpc2FibGVkKHZjcHUpKQotCQkJcmV0dXJuIDA7Ci0JCWlmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzE0XSAmIGludGktPm1jaGsuY3IxNCkKLQkJCXJldHVybiAxOwotCQlyZXR1cm4gMDsKLQljYXNlIEtWTV9TMzkwX0lOVF9JT19NSU4uLi5LVk1fUzM5MF9JTlRfSU9fTUFYOgotCQlpZiAocHN3X2lvaW50X2Rpc2FibGVkKHZjcHUpKQotCQkJcmV0dXJuIDA7Ci0JCWlmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzZdICYKLQkJICAgIGludF93b3JkX3RvX2lzY19iaXRzKGludGktPmlvLmlvX2ludF93b3JkKSkKLQkJCXJldHVybiAxOwotCQlyZXR1cm4gMDsKLQlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9XQVJOSU5HICJpbGxlZ2FsIGludGVycnVwdCB0eXBlICVsbHhcbiIsCi0JCSAgICAgICBpbnRpLT50eXBlKTsKLQkJQlVHKCk7Ci0JfQotCXJldHVybiAwOworCXJldHVybiAoaW50X3dvcmQgJiAweDM4MDAwMDAwKSA+PiAyNzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBlbmRpbmdfZmxvYXRpbmdfaXJxcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuIHZjcHUtPmt2bS0+YXJjaC5mbG9hdF9pbnQucGVuZGluZ19pcnFzOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcGVuZGluZ19sb2NhbF9pcnFzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTE0MywxMiArMTE2LDMxIEBACiAJcmV0dXJuIHZjcHUtPmFyY2gubG9jYWxfaW50LnBlbmRpbmdfaXJxczsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVsaXZlcmFibGVfbG9jYWxfaXJxcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXNhYmxlX2lzY3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYWN0aXZlX21hc2spCiB7Ci0JdW5zaWduZWQgbG9uZyBhY3RpdmVfbWFzayA9IHBlbmRpbmdfbG9jYWxfaXJxcyh2Y3B1KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gTUFYX0lTQzsgaSsrKQorCQlpZiAoISh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzZdICYgaXNjX3RvX2lzY19iaXRzKGkpKSkKKwkJCWFjdGl2ZV9tYXNrICY9IH4oMVVMIDw8IChJUlFfUEVORF9JT19JU0NfMCArIGkpKTsKKworCXJldHVybiBhY3RpdmVfbWFzazsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVsaXZlcmFibGVfaXJxcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdW5zaWduZWQgbG9uZyBhY3RpdmVfbWFzazsKKworCWFjdGl2ZV9tYXNrID0gcGVuZGluZ19sb2NhbF9pcnFzKHZjcHUpOworCWFjdGl2ZV9tYXNrIHw9IHBlbmRpbmdfZmxvYXRpbmdfaXJxcyh2Y3B1KTsKIAogCWlmIChwc3dfZXh0aW50X2Rpc2FibGVkKHZjcHUpKQogCQlhY3RpdmVfbWFzayAmPSB+SVJRX1BFTkRfRVhUX01BU0s7CisJaWYgKHBzd19pb2ludF9kaXNhYmxlZCh2Y3B1KSkKKwkJYWN0aXZlX21hc2sgJj0gfklSUV9QRU5EX0lPX01BU0s7CisJZWxzZQorCQlhY3RpdmVfbWFzayA9IGRpc2FibGVfaXNjcyh2Y3B1LCBhY3RpdmVfbWFzayk7CiAJaWYgKCEodmNwdS0+YXJjaC5zaWVfYmxvY2stPmdjclswXSAmIDB4MjAwMHVsKSkKIAkJX19jbGVhcl9iaXQoSVJRX1BFTkRfRVhUX0VYVEVSTkFMLCAmYWN0aXZlX21hc2spOwogCWlmICghKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbMF0gJiAweDQwMDB1bCkpCkBAIC0xNTcsOCArMTQ5LDEzIEBACiAJCV9fY2xlYXJfYml0KElSUV9QRU5EX0VYVF9DTE9DS19DT01QLCAmYWN0aXZlX21hc2spOwogCWlmICghKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbMF0gJiAweDQwMHVsKSkKIAkJX19jbGVhcl9iaXQoSVJRX1BFTkRfRVhUX0NQVV9USU1FUiwgJmFjdGl2ZV9tYXNrKTsKKwlpZiAoISh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzBdICYgMHgyMDB1bCkpCisJCV9fY2xlYXJfYml0KElSUV9QRU5EX0VYVF9TRVJWSUNFLCAmYWN0aXZlX21hc2spOwogCWlmIChwc3dfbWNoa19kaXNhYmxlZCh2Y3B1KSkKIAkJYWN0aXZlX21hc2sgJj0gfklSUV9QRU5EX01DSEtfTUFTSzsKKwlpZiAoISh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2NyWzE0XSAmCisJICAgICAgdmNwdS0+a3ZtLT5hcmNoLmZsb2F0X2ludC5tY2hrLmNyMTQpKQorCQlfX2NsZWFyX2JpdChJUlFfUEVORF9NQ0hLX1JFUCwgJmFjdGl2ZV9tYXNrKTsKIAogCS8qCiAJICogU1RPUCBpcnFzIHdpbGwgbmV2ZXIgYmUgYWN0aXZlbHkgZGVsaXZlcmVkLiBUaGV5IGFyZSB0cmlnZ2VyZWQgdmlhCkBAIC0yMDAsNiArMTk3LDE2IEBACiAJYXRvbWljX3NldF9tYXNrKGZsYWcsICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y3B1ZmxhZ3MpOwogfQogCitzdGF0aWMgdm9pZCBzZXRfaW50ZXJjZXB0X2luZGljYXRvcnNfaW8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWlmICghKHBlbmRpbmdfZmxvYXRpbmdfaXJxcyh2Y3B1KSAmIElSUV9QRU5EX0lPX01BU0spKQorCQlyZXR1cm47CisJZWxzZSBpZiAocHN3X2lvaW50X2Rpc2FibGVkKHZjcHUpKQorCQlfX3NldF9jcHVmbGFnKHZjcHUsIENQVVNUQVRfSU9fSU5UKTsKKwllbHNlCisJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5sY3RsIHw9IExDVExfQ1I2OworfQorCiBzdGF0aWMgdm9pZCBzZXRfaW50ZXJjZXB0X2luZGljYXRvcnNfZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlpZiAoIShwZW5kaW5nX2xvY2FsX2lycXModmNwdSkgJiBJUlFfUEVORF9FWFRfTUFTSykpCkBAIC0yMjYsNDcgKzIzMywxNyBAQAogCQlfX3NldF9jcHVmbGFnKHZjcHUsIENQVVNUQVRfU1RPUF9JTlQpOwogfQogCi0vKiBTZXQgaW50ZXJjZXB0aW9uIHJlcXVlc3QgZm9yIG5vbi1kZWxpdmVyYWJsZSBsb2NhbCBpbnRlcnJ1cHRzICovCi1zdGF0aWMgdm9pZCBzZXRfaW50ZXJjZXB0X2luZGljYXRvcnNfbG9jYWwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorLyogU2V0IGludGVyY2VwdGlvbiByZXF1ZXN0IGZvciBub24tZGVsaXZlcmFibGUgaW50ZXJydXB0cyAqLworc3RhdGljIHZvaWQgc2V0X2ludGVyY2VwdF9pbmRpY2F0b3JzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKKwlzZXRfaW50ZXJjZXB0X2luZGljYXRvcnNfaW8odmNwdSk7CiAJc2V0X2ludGVyY2VwdF9pbmRpY2F0b3JzX2V4dCh2Y3B1KTsKIAlzZXRfaW50ZXJjZXB0X2luZGljYXRvcnNfbWNoayh2Y3B1KTsKIAlzZXRfaW50ZXJjZXB0X2luZGljYXRvcnNfc3RvcCh2Y3B1KTsKIH0KIAotc3RhdGljIHZvaWQgX19zZXRfaW50ZXJjZXB0X2luZGljYXRvcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJICAgICAgc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpKQotewotCXN3aXRjaCAoaW50aS0+dHlwZSkgewotCWNhc2UgS1ZNX1MzOTBfSU5UX1NFUlZJQ0U6Ci0JY2FzZSBLVk1fUzM5MF9JTlRfUEZBVUxUX0RPTkU6Ci0JY2FzZSBLVk1fUzM5MF9JTlRfVklSVElPOgotCQlpZiAocHN3X2V4dGludF9kaXNhYmxlZCh2Y3B1KSkKLQkJCV9fc2V0X2NwdWZsYWcodmNwdSwgQ1BVU1RBVF9FWFRfSU5UKTsKLQkJZWxzZQotCQkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmxjdGwgfD0gTENUTF9DUjA7Ci0JCWJyZWFrOwotCWNhc2UgS1ZNX1MzOTBfTUNISzoKLQkJaWYgKHBzd19tY2hrX2Rpc2FibGVkKHZjcHUpKQotCQkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmljdGwgfD0gSUNUTF9MUFNXOwotCQllbHNlCi0JCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+bGN0bCB8PSBMQ1RMX0NSMTQ7Ci0JCWJyZWFrOwotCWNhc2UgS1ZNX1MzOTBfSU5UX0lPX01JTi4uLktWTV9TMzkwX0lOVF9JT19NQVg6Ci0JCWlmIChwc3dfaW9pbnRfZGlzYWJsZWQodmNwdSkpCi0JCQlfX3NldF9jcHVmbGFnKHZjcHUsIENQVVNUQVRfSU9fSU5UKTsKLQkJZWxzZQotCQkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmxjdGwgfD0gTENUTF9DUjY7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLX0KLQogc3RhdGljIHUxNiBnZXRfaWxjKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQljb25zdCB1bnNpZ25lZCBzaG9ydCB0YWJsZVtdID0geyAyLCA0LCA0LCA2IH07Ci0KIAlzd2l0Y2ggKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5pY3B0Y29kZSkgewogCWNhc2UgSUNQVF9JTlNUOgogCWNhc2UgSUNQVF9JTlNUUFJPR0k6CkBAIC0yNzQsNyArMjUxLDcgQEAKIAljYXNlIElDUFRfUEFSVEVYRUM6CiAJY2FzZSBJQ1BUX0lPSU5TVDoKIAkJLyogbGFzdCBpbnN0cnVjdGlvbiBvbmx5IHN0b3JlZCBmb3IgdGhlc2UgaWNwdGNvZGVzICovCi0JCXJldHVybiB0YWJsZVt2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBhID4+IDE0XTsKKwkJcmV0dXJuIGluc25fbGVuZ3RoKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5pcGEgPj4gOCk7CiAJY2FzZSBJQ1BUX1BST0dJOgogCQlyZXR1cm4gdmNwdS0+YXJjaC5zaWVfYmxvY2stPnBnbWlsYzsKIAlkZWZhdWx0OgpAQCAtMzUwLDM4ICszMjcsNzIgQEAKIAogc3RhdGljIGludCBfX211c3RfY2hlY2sgX19kZWxpdmVyX21hY2hpbmVfY2hlY2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogeworCXN0cnVjdCBrdm1fczM5MF9mbG9hdF9pbnRlcnJ1cHQgKmZpID0gJnZjcHUtPmt2bS0+YXJjaC5mbG9hdF9pbnQ7CiAJc3RydWN0IGt2bV9zMzkwX2xvY2FsX2ludGVycnVwdCAqbGkgPSAmdmNwdS0+YXJjaC5sb2NhbF9pbnQ7Ci0Jc3RydWN0IGt2bV9zMzkwX21jaGtfaW5mbyBtY2hrOwotCWludCByYzsKKwlzdHJ1Y3Qga3ZtX3MzOTBfbWNoa19pbmZvIG1jaGsgPSB7fTsKKwl1bnNpZ25lZCBsb25nIGFkdGxfc3RhdHVzX2FkZHI7CisJaW50IGRlbGl2ZXIgPSAwOworCWludCByYyA9IDA7CiAKKwlzcGluX2xvY2soJmZpLT5sb2NrKTsKIAlzcGluX2xvY2soJmxpLT5sb2NrKTsKLQltY2hrID0gbGktPmlycS5tY2hrOworCWlmICh0ZXN0X2JpdChJUlFfUEVORF9NQ0hLX0VYLCAmbGktPnBlbmRpbmdfaXJxcykgfHwKKwkgICAgdGVzdF9iaXQoSVJRX1BFTkRfTUNIS19SRVAsICZsaS0+cGVuZGluZ19pcnFzKSkgeworCQkvKgorCQkgKiBJZiB0aGVyZSB3YXMgYW4gZXhpZ2VudCBtYWNoaW5lIGNoZWNrIHBlbmRpbmcsIHRoZW4gYW55CisJCSAqIHJlcHJlc3NpYmxlIG1hY2hpbmUgY2hlY2tzIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIHBlbmRpbmcKKwkJICogYXJlIGluZGljYXRlZCBhbG9uZyB3aXRoIGl0LCBzbyBhbHdheXMgY2xlYXIgYml0cyBmb3IKKwkJICogcmVwcmVzc2libGUgYW5kIGV4aWdlbnQgaW50ZXJydXB0cworCQkgKi8KKwkJbWNoayA9IGxpLT5pcnEubWNoazsKKwkJY2xlYXJfYml0KElSUV9QRU5EX01DSEtfRVgsICZsaS0+cGVuZGluZ19pcnFzKTsKKwkJY2xlYXJfYml0KElSUV9QRU5EX01DSEtfUkVQLCAmbGktPnBlbmRpbmdfaXJxcyk7CisJCW1lbXNldCgmbGktPmlycS5tY2hrLCAwLCBzaXplb2YobWNoaykpOworCQlkZWxpdmVyID0gMTsKKwl9CiAJLyoKLQkgKiBJZiB0aGVyZSB3YXMgYW4gZXhpZ2VudCBtYWNoaW5lIGNoZWNrIHBlbmRpbmcsIHRoZW4gYW55IHJlcHJlc3NpYmxlCi0JICogbWFjaGluZSBjaGVja3MgdGhhdCBtaWdodCBoYXZlIGJlZW4gcGVuZGluZyBhcmUgaW5kaWNhdGVkIGFsb25nCi0JICogd2l0aCBpdCwgc28gYWx3YXlzIGNsZWFyIGJvdGggYml0cworCSAqIFdlIGluZGljYXRlIGZsb2F0aW5nIHJlcHJlc3NpYmxlIGNvbmRpdGlvbnMgYWxvbmcgd2l0aAorCSAqIG90aGVyIHBlbmRpbmcgY29uZGl0aW9ucy4gQ2hhbm5lbCBSZXBvcnQgUGVuZGluZyBhbmQgQ2hhbm5lbAorCSAqIFN1YnN5c3RlbSBkYW1hZ2UgYXJlIHRoZSBvbmx5IHR3byBhbmQgYW5kIGFyZSBpbmRpY2F0ZWQgYnkKKwkgKiBiaXRzIGluIG1jaWMgYW5kIG1hc2tlZCBpbiBjcjE0LgogCSAqLwotCWNsZWFyX2JpdChJUlFfUEVORF9NQ0hLX0VYLCAmbGktPnBlbmRpbmdfaXJxcyk7Ci0JY2xlYXJfYml0KElSUV9QRU5EX01DSEtfUkVQLCAmbGktPnBlbmRpbmdfaXJxcyk7Ci0JbWVtc2V0KCZsaS0+aXJxLm1jaGssIDAsIHNpemVvZihtY2hrKSk7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChJUlFfUEVORF9NQ0hLX1JFUCwgJmZpLT5wZW5kaW5nX2lycXMpKSB7CisJCW1jaGsubWNpYyB8PSBmaS0+bWNoay5tY2ljOworCQltY2hrLmNyMTQgfD0gZmktPm1jaGsuY3IxNDsKKwkJbWVtc2V0KCZmaS0+bWNoaywgMCwgc2l6ZW9mKG1jaGspKTsKKwkJZGVsaXZlciA9IDE7CisJfQogCXNwaW5fdW5sb2NrKCZsaS0+bG9jayk7CisJc3Bpbl91bmxvY2soJmZpLT5sb2NrKTsKIAotCVZDUFVfRVZFTlQodmNwdSwgNCwgImludGVycnVwdDogbWFjaGluZSBjaGVjayBtY2ljPSVsbHgiLAotCQkgICBtY2hrLm1jaWMpOwotCXRyYWNlX2t2bV9zMzkwX2RlbGl2ZXJfaW50ZXJydXB0KHZjcHUtPnZjcHVfaWQsIEtWTV9TMzkwX01DSEssCi0JCQkJCSBtY2hrLmNyMTQsIG1jaGsubWNpYyk7CisJaWYgKGRlbGl2ZXIpIHsKKwkJVkNQVV9FVkVOVCh2Y3B1LCA0LCAiaW50ZXJydXB0OiBtYWNoaW5lIGNoZWNrIG1jaWM9JWxseCIsCisJCQkgICBtY2hrLm1jaWMpOworCQl0cmFjZV9rdm1fczM5MF9kZWxpdmVyX2ludGVycnVwdCh2Y3B1LT52Y3B1X2lkLAorCQkJCQkJIEtWTV9TMzkwX01DSEssCisJCQkJCQkgbWNoay5jcjE0LCBtY2hrLm1jaWMpOwogCi0JcmMgID0ga3ZtX3MzOTBfdmNwdV9zdG9yZV9zdGF0dXModmNwdSwgS1ZNX1MzOTBfU1RPUkVfU1RBVFVTX1BSRUZJWEVEKTsKLQlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgbWNoay5tY2ljLAotCQkJICAgKHU2NCBfX3VzZXIgKikgX19MQ19NQ0NLX0NPREUpOwotCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBtY2hrLmZhaWxpbmdfc3RvcmFnZV9hZGRyZXNzLAotCQkJICAgKHU2NCBfX3VzZXIgKikgX19MQ19NQ0NLX0ZBSUxfU1RPUl9BRERSKTsKLQlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX1BTV19TQVZFX0FSRUEsCi0JCQkgICAgICZtY2hrLmZpeGVkX2xvZ291dCwgc2l6ZW9mKG1jaGsuZml4ZWRfbG9nb3V0KSk7Ci0JcmMgfD0gd3JpdGVfZ3Vlc3RfbGModmNwdSwgX19MQ19NQ0tfT0xEX1BTVywKLQkJCSAgICAgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LCBzaXplb2YocHN3X3QpKTsKLQlyYyB8PSByZWFkX2d1ZXN0X2xjKHZjcHUsIF9fTENfTUNLX05FV19QU1csCi0JCQkgICAgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LCBzaXplb2YocHN3X3QpKTsKKwkJcmMgID0ga3ZtX3MzOTBfdmNwdV9zdG9yZV9zdGF0dXModmNwdSwKKwkJCQkJCSBLVk1fUzM5MF9TVE9SRV9TVEFUVVNfUFJFRklYRUQpOworCQlyYyB8PSByZWFkX2d1ZXN0X2xjKHZjcHUsIF9fTENfVlhfU0FWRV9BUkVBX0FERFIsCisJCQkJICAgICZhZHRsX3N0YXR1c19hZGRyLAorCQkJCSAgICBzaXplb2YodW5zaWduZWQgbG9uZykpOworCQlyYyB8PSBrdm1fczM5MF92Y3B1X3N0b3JlX2FkdGxfc3RhdHVzKHZjcHUsCisJCQkJCQkgICAgICBhZHRsX3N0YXR1c19hZGRyKTsKKwkJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIG1jaGsubWNpYywKKwkJCQkgICAodTY0IF9fdXNlciAqKSBfX0xDX01DQ0tfQ09ERSk7CisJCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBtY2hrLmZhaWxpbmdfc3RvcmFnZV9hZGRyZXNzLAorCQkJCSAgICh1NjQgX191c2VyICopIF9fTENfTUNDS19GQUlMX1NUT1JfQUREUik7CisJCXJjIHw9IHdyaXRlX2d1ZXN0X2xjKHZjcHUsIF9fTENfUFNXX1NBVkVfQVJFQSwKKwkJCQkgICAgICZtY2hrLmZpeGVkX2xvZ291dCwKKwkJCQkgICAgIHNpemVvZihtY2hrLmZpeGVkX2xvZ291dCkpOworCQlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX01DS19PTERfUFNXLAorCQkJCSAgICAgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LAorCQkJCSAgICAgc2l6ZW9mKHBzd190KSk7CisJCXJjIHw9IHJlYWRfZ3Vlc3RfbGModmNwdSwgX19MQ19NQ0tfTkVXX1BTVywKKwkJCQkgICAgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LAorCQkJCSAgICBzaXplb2YocHN3X3QpKTsKKwl9CiAJcmV0dXJuIHJjID8gLUVGQVVMVCA6IDA7CiB9CiAKQEAgLTQ4NCw3ICs0OTUsNyBAQAogewogCXN0cnVjdCBrdm1fczM5MF9sb2NhbF9pbnRlcnJ1cHQgKmxpID0gJnZjcHUtPmFyY2gubG9jYWxfaW50OwogCXN0cnVjdCBrdm1fczM5MF9wZ21faW5mbyBwZ21faW5mbzsKLQlpbnQgcmMgPSAwOworCWludCByYyA9IDAsIG51bGxpZnlpbmcgPSBmYWxzZTsKIAl1MTYgaWxjID0gZ2V0X2lsYyh2Y3B1KTsKIAogCXNwaW5fbG9jaygmbGktPmxvY2spOwpAQCAtNTA5LDYgKzUyMCw4IEBACiAJY2FzZSBQR01fTFhfVFJBTlNMQVRJT046CiAJY2FzZSBQR01fUFJJTUFSWV9BVVRIT1JJVFk6CiAJY2FzZSBQR01fU0VDT05EQVJZX0FVVEhPUklUWToKKwkJbnVsbGlmeWluZyA9IHRydWU7CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgUEdNX1NQQUNFX1NXSVRDSDoKIAkJcmMgPSBwdXRfZ3Vlc3RfbGModmNwdSwgcGdtX2luZm8udHJhbnNfZXhjX2NvZGUsCiAJCQkJICAodTY0ICopX19MQ19UUkFOU19FWENfQ09ERSk7CkBAIC01MjEsNiArNTM0LDcgQEAKIAljYXNlIFBHTV9FWFRFTkRFRF9BVVRIT1JJVFk6CiAJCXJjID0gcHV0X2d1ZXN0X2xjKHZjcHUsIHBnbV9pbmZvLmV4Y19hY2Nlc3NfaWQsCiAJCQkJICAodTggKilfX0xDX0VYQ19BQ0NFU1NfSUQpOworCQludWxsaWZ5aW5nID0gdHJ1ZTsKIAkJYnJlYWs7CiAJY2FzZSBQR01fQVNDRV9UWVBFOgogCWNhc2UgUEdNX1BBR0VfVFJBTlNMQVRJT046CkBAIC01MzQsNiArNTQ4LDcgQEAKIAkJCQkgICAodTggKilfX0xDX0VYQ19BQ0NFU1NfSUQpOwogCQlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgcGdtX2luZm8ub3BfYWNjZXNzX2lkLAogCQkJCSAgICh1OCAqKV9fTENfT1BfQUNDRVNTX0lEKTsKKwkJbnVsbGlmeWluZyA9IHRydWU7CiAJCWJyZWFrOwogCWNhc2UgUEdNX01PTklUT1I6CiAJCXJjID0gcHV0X2d1ZXN0X2xjKHZjcHUsIHBnbV9pbmZvLm1vbl9jbGFzc19uciwKQEAgLTU0MSw2ICs1NTYsNyBAQAogCQlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgcGdtX2luZm8ubW9uX2NvZGUsCiAJCQkJICAgKHU2NCAqKV9fTENfTU9OX0NPREUpOwogCQlicmVhazsKKwljYXNlIFBHTV9WRUNUT1JfUFJPQ0VTU0lORzoKIAljYXNlIFBHTV9EQVRBOgogCQlyYyA9IHB1dF9ndWVzdF9sYyh2Y3B1LCBwZ21faW5mby5kYXRhX2V4Y19jb2RlLAogCQkJCSAgKHUzMiAqKV9fTENfREFUQV9FWENfQ09ERSk7CkBAIC01NTEsNiArNTY3LDE1IEBACiAJCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBwZ21faW5mby5leGNfYWNjZXNzX2lkLAogCQkJCSAgICh1OCAqKV9fTENfRVhDX0FDQ0VTU19JRCk7CiAJCWJyZWFrOworCWNhc2UgUEdNX1NUQUNLX0ZVTEw6CisJY2FzZSBQR01fU1RBQ0tfRU1QVFk6CisJY2FzZSBQR01fU1RBQ0tfU1BFQ0lGSUNBVElPTjoKKwljYXNlIFBHTV9TVEFDS19UWVBFOgorCWNhc2UgUEdNX1NUQUNLX09QRVJBVElPTjoKKwljYXNlIFBHTV9UUkFDRV9UQUJFTDoKKwljYXNlIFBHTV9DUllQVE9fT1BFUkFUSU9OOgorCQludWxsaWZ5aW5nID0gdHJ1ZTsKKwkJYnJlYWs7CiAJfQogCiAJaWYgKHBnbV9pbmZvLmNvZGUgJiBQR01fUEVSKSB7CkBAIC01NjQsNyArNTg5LDEyIEBACiAJCQkJICAgKHU4ICopIF9fTENfUEVSX0FDQ0VTU19JRCk7CiAJfQogCisJaWYgKG51bGxpZnlpbmcgJiYgdmNwdS0+YXJjaC5zaWVfYmxvY2stPmljcHRjb2RlID09IElDUFRfSU5TVCkKKwkJa3ZtX3MzOTBfcmV3aW5kX3Bzdyh2Y3B1LCBpbGMpOworCiAJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIGlsYywgKHUxNiAqKSBfX0xDX1BHTV9JTEMpOworCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z2JlYSwKKwkJCQkgKHU2NCAqKSBfX0xDX0xBU1RfQlJFQUspOwogCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBwZ21faW5mby5jb2RlLAogCQkJICAgKHUxNiAqKV9fTENfUEdNX0lOVF9DT0RFKTsKIAlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX1BHTV9PTERfUFNXLApAQCAtNTc0LDE2ICs2MDQsMjcgQEAKIAlyZXR1cm4gcmMgPyAtRUZBVUxUIDogMDsKIH0KIAotc3RhdGljIGludCBfX211c3RfY2hlY2sgX19kZWxpdmVyX3NlcnZpY2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotCQkJCQkgIHN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHRfaW5mbyAqaW50aSkKK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrIF9fZGVsaXZlcl9zZXJ2aWNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlpbnQgcmM7CisJc3RydWN0IGt2bV9zMzkwX2Zsb2F0X2ludGVycnVwdCAqZmkgPSAmdmNwdS0+a3ZtLT5hcmNoLmZsb2F0X2ludDsKKwlzdHJ1Y3Qga3ZtX3MzOTBfZXh0X2luZm8gZXh0OworCWludCByYyA9IDA7CisKKwlzcGluX2xvY2soJmZpLT5sb2NrKTsKKwlpZiAoISh0ZXN0X2JpdChJUlFfUEVORF9FWFRfU0VSVklDRSwgJmZpLT5wZW5kaW5nX2lycXMpKSkgeworCQlzcGluX3VubG9jaygmZmktPmxvY2spOworCQlyZXR1cm4gMDsKKwl9CisJZXh0ID0gZmktPnNydl9zaWduYWw7CisJbWVtc2V0KCZmaS0+c3J2X3NpZ25hbCwgMCwgc2l6ZW9mKGV4dCkpOworCWNsZWFyX2JpdChJUlFfUEVORF9FWFRfU0VSVklDRSwgJmZpLT5wZW5kaW5nX2lycXMpOworCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7CiAKIAlWQ1BVX0VWRU5UKHZjcHUsIDQsICJpbnRlcnJ1cHQ6IHNjbHAgcGFybToleCIsCi0JCSAgIGludGktPmV4dC5leHRfcGFyYW1zKTsKKwkJICAgZXh0LmV4dF9wYXJhbXMpOwogCXZjcHUtPnN0YXQuZGVsaXZlcl9zZXJ2aWNlX3NpZ25hbCsrOwotCXRyYWNlX2t2bV9zMzkwX2RlbGl2ZXJfaW50ZXJydXB0KHZjcHUtPnZjcHVfaWQsIGludGktPnR5cGUsCi0JCQkJCSBpbnRpLT5leHQuZXh0X3BhcmFtcywgMCk7CisJdHJhY2Vfa3ZtX3MzOTBfZGVsaXZlcl9pbnRlcnJ1cHQodmNwdS0+dmNwdV9pZCwgS1ZNX1MzOTBfSU5UX1NFUlZJQ0UsCisJCQkJCSBleHQuZXh0X3BhcmFtcywgMCk7CiAKIAlyYyAgPSBwdXRfZ3Vlc3RfbGModmNwdSwgRVhUX0lSUV9TRVJWSUNFX1NJRywgKHUxNiAqKV9fTENfRVhUX0lOVF9DT0RFKTsKIAlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgMCwgKHUxNiAqKV9fTENfRVhUX0NQVV9BRERSKTsKQEAgLTU5MSwxMDYgKzYzMiwxNDYgQEAKIAkJCSAgICAgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LCBzaXplb2YocHN3X3QpKTsKIAlyYyB8PSByZWFkX2d1ZXN0X2xjKHZjcHUsIF9fTENfRVhUX05FV19QU1csCiAJCQkgICAgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LCBzaXplb2YocHN3X3QpKTsKLQlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgaW50aS0+ZXh0LmV4dF9wYXJhbXMsCisJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIGV4dC5leHRfcGFyYW1zLAogCQkJICAgKHUzMiAqKV9fTENfRVhUX1BBUkFNUyk7CisKIAlyZXR1cm4gcmMgPyAtRUZBVUxUIDogMDsKIH0KIAotc3RhdGljIGludCBfX211c3RfY2hlY2sgX19kZWxpdmVyX3BmYXVsdF9kb25lKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJCQkJICAgc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpKQorc3RhdGljIGludCBfX211c3RfY2hlY2sgX19kZWxpdmVyX3BmYXVsdF9kb25lKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlpbnQgcmM7CisJc3RydWN0IGt2bV9zMzkwX2Zsb2F0X2ludGVycnVwdCAqZmkgPSAmdmNwdS0+a3ZtLT5hcmNoLmZsb2F0X2ludDsKKwlzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKmludGk7CisJaW50IHJjID0gMDsKIAotCXRyYWNlX2t2bV9zMzkwX2RlbGl2ZXJfaW50ZXJydXB0KHZjcHUtPnZjcHVfaWQsCi0JCQkJCSBLVk1fUzM5MF9JTlRfUEZBVUxUX0RPTkUsIDAsCi0JCQkJCSBpbnRpLT5leHQuZXh0X3BhcmFtczIpOworCXNwaW5fbG9jaygmZmktPmxvY2spOworCWludGkgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmZpLT5saXN0c1tGSVJRX0xJU1RfUEZBVUxUXSwKKwkJCQkJc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvLAorCQkJCQlsaXN0KTsKKwlpZiAoaW50aSkgeworCQl0cmFjZV9rdm1fczM5MF9kZWxpdmVyX2ludGVycnVwdCh2Y3B1LT52Y3B1X2lkLAorCQkJCUtWTV9TMzkwX0lOVF9QRkFVTFRfRE9ORSwgMCwKKwkJCQlpbnRpLT5leHQuZXh0X3BhcmFtczIpOworCQlsaXN0X2RlbCgmaW50aS0+bGlzdCk7CisJCWZpLT5jb3VudGVyc1tGSVJRX0NOVFJfUEZBVUxUXSAtPSAxOworCX0KKwlpZiAobGlzdF9lbXB0eSgmZmktPmxpc3RzW0ZJUlFfTElTVF9QRkFVTFRdKSkKKwkJY2xlYXJfYml0KElSUV9QRU5EX1BGQVVMVF9ET05FLCAmZmktPnBlbmRpbmdfaXJxcyk7CisJc3Bpbl91bmxvY2soJmZpLT5sb2NrKTsKIAotCXJjICA9IHB1dF9ndWVzdF9sYyh2Y3B1LCBFWFRfSVJRX0NQX1NFUlZJQ0UsICh1MTYgKilfX0xDX0VYVF9JTlRfQ09ERSk7Ci0JcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIFBGQVVMVF9ET05FLCAodTE2ICopX19MQ19FWFRfQ1BVX0FERFIpOwotCXJjIHw9IHdyaXRlX2d1ZXN0X2xjKHZjcHUsIF9fTENfRVhUX09MRF9QU1csCi0JCQkgICAgICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdywgc2l6ZW9mKHBzd190KSk7Ci0JcmMgfD0gcmVhZF9ndWVzdF9sYyh2Y3B1LCBfX0xDX0VYVF9ORVdfUFNXLAotCQkJICAgICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdywgc2l6ZW9mKHBzd190KSk7Ci0JcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIGludGktPmV4dC5leHRfcGFyYW1zMiwKLQkJCSAgICh1NjQgKilfX0xDX0VYVF9QQVJBTVMyKTsKKwlpZiAoaW50aSkgeworCQlyYyAgPSBwdXRfZ3Vlc3RfbGModmNwdSwgRVhUX0lSUV9DUF9TRVJWSUNFLAorCQkJCSh1MTYgKilfX0xDX0VYVF9JTlRfQ09ERSk7CisJCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBQRkFVTFRfRE9ORSwKKwkJCQkodTE2ICopX19MQ19FWFRfQ1BVX0FERFIpOworCQlyYyB8PSB3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX0VYVF9PTERfUFNXLAorCQkJCSZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3BzdywKKwkJCQlzaXplb2YocHN3X3QpKTsKKwkJcmMgfD0gcmVhZF9ndWVzdF9sYyh2Y3B1LCBfX0xDX0VYVF9ORVdfUFNXLAorCQkJCSZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3BzdywKKwkJCQlzaXplb2YocHN3X3QpKTsKKwkJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIGludGktPmV4dC5leHRfcGFyYW1zMiwKKwkJCQkodTY0ICopX19MQ19FWFRfUEFSQU1TMik7CisJCWtmcmVlKGludGkpOworCX0KIAlyZXR1cm4gcmMgPyAtRUZBVUxUIDogMDsKIH0KIAotc3RhdGljIGludCBfX211c3RfY2hlY2sgX19kZWxpdmVyX3ZpcnRpbyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJCSBzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKmludGkpCitzdGF0aWMgaW50IF9fbXVzdF9jaGVjayBfX2RlbGl2ZXJfdmlydGlvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlpbnQgcmM7CisJc3RydWN0IGt2bV9zMzkwX2Zsb2F0X2ludGVycnVwdCAqZmkgPSAmdmNwdS0+a3ZtLT5hcmNoLmZsb2F0X2ludDsKKwlzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKmludGk7CisJaW50IHJjID0gMDsKIAotCVZDUFVfRVZFTlQodmNwdSwgNCwgImludGVycnVwdDogdmlydGlvIHBhcm06JXgscGFybTY0OiVsbHgiLAotCQkgICBpbnRpLT5leHQuZXh0X3BhcmFtcywgaW50aS0+ZXh0LmV4dF9wYXJhbXMyKTsKLQl2Y3B1LT5zdGF0LmRlbGl2ZXJfdmlydGlvX2ludGVycnVwdCsrOwotCXRyYWNlX2t2bV9zMzkwX2RlbGl2ZXJfaW50ZXJydXB0KHZjcHUtPnZjcHVfaWQsIGludGktPnR5cGUsCi0JCQkJCSBpbnRpLT5leHQuZXh0X3BhcmFtcywKLQkJCQkJIGludGktPmV4dC5leHRfcGFyYW1zMik7CisJc3Bpbl9sb2NrKCZmaS0+bG9jayk7CisJaW50aSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZmktPmxpc3RzW0ZJUlFfTElTVF9WSVJUSU9dLAorCQkJCQlzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8sCisJCQkJCWxpc3QpOworCWlmIChpbnRpKSB7CisJCVZDUFVfRVZFTlQodmNwdSwgNCwKKwkJCSAgICJpbnRlcnJ1cHQ6IHZpcnRpbyBwYXJtOiV4LHBhcm02NDolbGx4IiwKKwkJCSAgIGludGktPmV4dC5leHRfcGFyYW1zLCBpbnRpLT5leHQuZXh0X3BhcmFtczIpOworCQl2Y3B1LT5zdGF0LmRlbGl2ZXJfdmlydGlvX2ludGVycnVwdCsrOworCQl0cmFjZV9rdm1fczM5MF9kZWxpdmVyX2ludGVycnVwdCh2Y3B1LT52Y3B1X2lkLAorCQkJCWludGktPnR5cGUsCisJCQkJaW50aS0+ZXh0LmV4dF9wYXJhbXMsCisJCQkJaW50aS0+ZXh0LmV4dF9wYXJhbXMyKTsKKwkJbGlzdF9kZWwoJmludGktPmxpc3QpOworCQlmaS0+Y291bnRlcnNbRklSUV9DTlRSX1ZJUlRJT10gLT0gMTsKKwl9CisJaWYgKGxpc3RfZW1wdHkoJmZpLT5saXN0c1tGSVJRX0xJU1RfVklSVElPXSkpCisJCWNsZWFyX2JpdChJUlFfUEVORF9WSVJUSU8sICZmaS0+cGVuZGluZ19pcnFzKTsKKwlzcGluX3VubG9jaygmZmktPmxvY2spOwogCi0JcmMgID0gcHV0X2d1ZXN0X2xjKHZjcHUsIEVYVF9JUlFfQ1BfU0VSVklDRSwgKHUxNiAqKV9fTENfRVhUX0lOVF9DT0RFKTsKLQlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgVklSVElPX1BBUkFNLCAodTE2ICopX19MQ19FWFRfQ1BVX0FERFIpOwotCXJjIHw9IHdyaXRlX2d1ZXN0X2xjKHZjcHUsIF9fTENfRVhUX09MRF9QU1csCi0JCQkgICAgICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdywgc2l6ZW9mKHBzd190KSk7Ci0JcmMgfD0gcmVhZF9ndWVzdF9sYyh2Y3B1LCBfX0xDX0VYVF9ORVdfUFNXLAotCQkJICAgICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdywgc2l6ZW9mKHBzd190KSk7Ci0JcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIGludGktPmV4dC5leHRfcGFyYW1zLAotCQkJICAgKHUzMiAqKV9fTENfRVhUX1BBUkFNUyk7Ci0JcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIGludGktPmV4dC5leHRfcGFyYW1zMiwKLQkJCSAgICh1NjQgKilfX0xDX0VYVF9QQVJBTVMyKTsKKwlpZiAoaW50aSkgeworCQlyYyAgPSBwdXRfZ3Vlc3RfbGModmNwdSwgRVhUX0lSUV9DUF9TRVJWSUNFLAorCQkJCSh1MTYgKilfX0xDX0VYVF9JTlRfQ09ERSk7CisJCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBWSVJUSU9fUEFSQU0sCisJCQkJKHUxNiAqKV9fTENfRVhUX0NQVV9BRERSKTsKKwkJcmMgfD0gd3JpdGVfZ3Vlc3RfbGModmNwdSwgX19MQ19FWFRfT0xEX1BTVywKKwkJCQkmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3csCisJCQkJc2l6ZW9mKHBzd190KSk7CisJCXJjIHw9IHJlYWRfZ3Vlc3RfbGModmNwdSwgX19MQ19FWFRfTkVXX1BTVywKKwkJCQkmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3csCisJCQkJc2l6ZW9mKHBzd190KSk7CisJCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBpbnRpLT5leHQuZXh0X3BhcmFtcywKKwkJCQkodTMyICopX19MQ19FWFRfUEFSQU1TKTsKKwkJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIGludGktPmV4dC5leHRfcGFyYW1zMiwKKwkJCQkodTY0ICopX19MQ19FWFRfUEFSQU1TMik7CisJCWtmcmVlKGludGkpOworCX0KIAlyZXR1cm4gcmMgPyAtRUZBVUxUIDogMDsKIH0KIAogc3RhdGljIGludCBfX211c3RfY2hlY2sgX19kZWxpdmVyX2lvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJCQkgICAgIHN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHRfaW5mbyAqaW50aSkKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgaXJxX3R5cGUpCiB7Ci0JaW50IHJjOworCXN0cnVjdCBsaXN0X2hlYWQgKmlzY19saXN0OworCXN0cnVjdCBrdm1fczM5MF9mbG9hdF9pbnRlcnJ1cHQgKmZpOworCXN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHRfaW5mbyAqaW50aSA9IE5VTEw7CisJaW50IHJjID0gMDsKIAotCVZDUFVfRVZFTlQodmNwdSwgNCwgImludGVycnVwdDogSS9PICVsbHgiLCBpbnRpLT50eXBlKTsKLQl2Y3B1LT5zdGF0LmRlbGl2ZXJfaW9faW50Kys7Ci0JdHJhY2Vfa3ZtX3MzOTBfZGVsaXZlcl9pbnRlcnJ1cHQodmNwdS0+dmNwdV9pZCwgaW50aS0+dHlwZSwKLQkJCQkJICgoX191MzIpaW50aS0+aW8uc3ViY2hhbm5lbF9pZCA8PCAxNikgfAotCQkJCQkJaW50aS0+aW8uc3ViY2hhbm5lbF9uciwKLQkJCQkJICgoX191NjQpaW50aS0+aW8uaW9faW50X3Bhcm0gPDwgMzIpIHwKLQkJCQkJCWludGktPmlvLmlvX2ludF93b3JkKTsKKwlmaSA9ICZ2Y3B1LT5rdm0tPmFyY2guZmxvYXRfaW50OwogCi0JcmMgID0gcHV0X2d1ZXN0X2xjKHZjcHUsIGludGktPmlvLnN1YmNoYW5uZWxfaWQsCi0JCQkgICAodTE2ICopX19MQ19TVUJDSEFOTkVMX0lEKTsKLQlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgaW50aS0+aW8uc3ViY2hhbm5lbF9uciwKLQkJCSAgICh1MTYgKilfX0xDX1NVQkNIQU5ORUxfTlIpOwotCXJjIHw9IHB1dF9ndWVzdF9sYyh2Y3B1LCBpbnRpLT5pby5pb19pbnRfcGFybSwKLQkJCSAgICh1MzIgKilfX0xDX0lPX0lOVF9QQVJNKTsKLQlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgaW50aS0+aW8uaW9faW50X3dvcmQsCi0JCQkgICAodTMyICopX19MQ19JT19JTlRfV09SRCk7Ci0JcmMgfD0gd3JpdGVfZ3Vlc3RfbGModmNwdSwgX19MQ19JT19PTERfUFNXLAotCQkJICAgICAmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3csIHNpemVvZihwc3dfdCkpOwotCXJjIHw9IHJlYWRfZ3Vlc3RfbGModmNwdSwgX19MQ19JT19ORVdfUFNXLAotCQkJICAgICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdywgc2l6ZW9mKHBzd190KSk7Ci0JcmV0dXJuIHJjID8gLUVGQVVMVCA6IDA7Ci19CisJc3Bpbl9sb2NrKCZmaS0+bG9jayk7CisJaXNjX2xpc3QgPSAmZmktPmxpc3RzW2lycV90eXBlIC0gSVJRX1BFTkRfSU9fSVNDXzBdOworCWludGkgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoaXNjX2xpc3QsCisJCQkJCXN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHRfaW5mbywKKwkJCQkJbGlzdCk7CisJaWYgKGludGkpIHsKKwkJVkNQVV9FVkVOVCh2Y3B1LCA0LCAiaW50ZXJydXB0OiBJL08gJWxseCIsIGludGktPnR5cGUpOworCQl2Y3B1LT5zdGF0LmRlbGl2ZXJfaW9faW50Kys7CisJCXRyYWNlX2t2bV9zMzkwX2RlbGl2ZXJfaW50ZXJydXB0KHZjcHUtPnZjcHVfaWQsCisJCQkJaW50aS0+dHlwZSwKKwkJCQkoKF9fdTMyKWludGktPmlvLnN1YmNoYW5uZWxfaWQgPDwgMTYpIHwKKwkJCQlpbnRpLT5pby5zdWJjaGFubmVsX25yLAorCQkJCSgoX191NjQpaW50aS0+aW8uaW9faW50X3Bhcm0gPDwgMzIpIHwKKwkJCQlpbnRpLT5pby5pb19pbnRfd29yZCk7CisJCWxpc3RfZGVsKCZpbnRpLT5saXN0KTsKKwkJZmktPmNvdW50ZXJzW0ZJUlFfQ05UUl9JT10gLT0gMTsKKwl9CisJaWYgKGxpc3RfZW1wdHkoaXNjX2xpc3QpKQorCQljbGVhcl9iaXQoaXJxX3R5cGUsICZmaS0+cGVuZGluZ19pcnFzKTsKKwlzcGluX3VubG9jaygmZmktPmxvY2spOwogCi1zdGF0aWMgaW50IF9fbXVzdF9jaGVjayBfX2RlbGl2ZXJfbWNoa19mbG9hdGluZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJCSAgIHN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHRfaW5mbyAqaW50aSkKLXsKLQlzdHJ1Y3Qga3ZtX3MzOTBfbWNoa19pbmZvICptY2hrID0gJmludGktPm1jaGs7Ci0JaW50IHJjOworCWlmIChpbnRpKSB7CisJCXJjICA9IHB1dF9ndWVzdF9sYyh2Y3B1LCBpbnRpLT5pby5zdWJjaGFubmVsX2lkLAorCQkJCSh1MTYgKilfX0xDX1NVQkNIQU5ORUxfSUQpOworCQlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgaW50aS0+aW8uc3ViY2hhbm5lbF9uciwKKwkJCQkodTE2ICopX19MQ19TVUJDSEFOTkVMX05SKTsKKwkJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIGludGktPmlvLmlvX2ludF9wYXJtLAorCQkJCSh1MzIgKilfX0xDX0lPX0lOVF9QQVJNKTsKKwkJcmMgfD0gcHV0X2d1ZXN0X2xjKHZjcHUsIGludGktPmlvLmlvX2ludF93b3JkLAorCQkJCSh1MzIgKilfX0xDX0lPX0lOVF9XT1JEKTsKKwkJcmMgfD0gd3JpdGVfZ3Vlc3RfbGModmNwdSwgX19MQ19JT19PTERfUFNXLAorCQkJCSZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3BzdywKKwkJCQlzaXplb2YocHN3X3QpKTsKKwkJcmMgfD0gcmVhZF9ndWVzdF9sYyh2Y3B1LCBfX0xDX0lPX05FV19QU1csCisJCQkJJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3LAorCQkJCXNpemVvZihwc3dfdCkpOworCQlrZnJlZShpbnRpKTsKKwl9CiAKLQlWQ1BVX0VWRU5UKHZjcHUsIDQsICJpbnRlcnJ1cHQ6IG1hY2hpbmUgY2hlY2sgbWNpYz0lbGx4IiwKLQkJICAgbWNoay0+bWNpYyk7Ci0JdHJhY2Vfa3ZtX3MzOTBfZGVsaXZlcl9pbnRlcnJ1cHQodmNwdS0+dmNwdV9pZCwgS1ZNX1MzOTBfTUNISywKLQkJCQkJIG1jaGstPmNyMTQsIG1jaGstPm1jaWMpOwotCi0JcmMgID0ga3ZtX3MzOTBfdmNwdV9zdG9yZV9zdGF0dXModmNwdSwgS1ZNX1MzOTBfU1RPUkVfU1RBVFVTX1BSRUZJWEVEKTsKLQlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgbWNoay0+bWNpYywKLQkJCSh1NjQgX191c2VyICopIF9fTENfTUNDS19DT0RFKTsKLQlyYyB8PSBwdXRfZ3Vlc3RfbGModmNwdSwgbWNoay0+ZmFpbGluZ19zdG9yYWdlX2FkZHJlc3MsCi0JCQkodTY0IF9fdXNlciAqKSBfX0xDX01DQ0tfRkFJTF9TVE9SX0FERFIpOwotCXJjIHw9IHdyaXRlX2d1ZXN0X2xjKHZjcHUsIF9fTENfUFNXX1NBVkVfQVJFQSwKLQkJCSAgICAgJm1jaGstPmZpeGVkX2xvZ291dCwgc2l6ZW9mKG1jaGstPmZpeGVkX2xvZ291dCkpOwotCXJjIHw9IHdyaXRlX2d1ZXN0X2xjKHZjcHUsIF9fTENfTUNLX09MRF9QU1csCi0JCQkgICAgICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdywgc2l6ZW9mKHBzd190KSk7Ci0JcmMgfD0gcmVhZF9ndWVzdF9sYyh2Y3B1LCBfX0xDX01DS19ORVdfUFNXLAotCQkJICAgICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdywgc2l6ZW9mKHBzd190KSk7CiAJcmV0dXJuIHJjID8gLUVGQVVMVCA6IDA7CiB9CiAKQEAgLTY5OCw2ICs3NzksNyBAQAogCiBzdGF0aWMgY29uc3QgZGVsaXZlcl9pcnFfdCBkZWxpdmVyX2lycV9mdW5jc1tdID0gewogCVtJUlFfUEVORF9NQ0hLX0VYXSAgICAgICAgPSBfX2RlbGl2ZXJfbWFjaGluZV9jaGVjaywKKwlbSVJRX1BFTkRfTUNIS19SRVBdICAgICAgID0gX19kZWxpdmVyX21hY2hpbmVfY2hlY2ssCiAJW0lSUV9QRU5EX1BST0ddICAgICAgICAgICA9IF9fZGVsaXZlcl9wcm9nLAogCVtJUlFfUEVORF9FWFRfRU1FUkdFTkNZXSAgPSBfX2RlbGl2ZXJfZW1lcmdlbmN5X3NpZ25hbCwKIAlbSVJRX1BFTkRfRVhUX0VYVEVSTkFMXSAgID0gX19kZWxpdmVyX2V4dGVybmFsX2NhbGwsCkBAIC03MDYsMzYgKzc4OCwxMSBAQAogCVtJUlFfUEVORF9SRVNUQVJUXSAgICAgICAgPSBfX2RlbGl2ZXJfcmVzdGFydCwKIAlbSVJRX1BFTkRfU0VUX1BSRUZJWF0gICAgID0gX19kZWxpdmVyX3NldF9wcmVmaXgsCiAJW0lSUV9QRU5EX1BGQVVMVF9JTklUXSAgICA9IF9fZGVsaXZlcl9wZmF1bHRfaW5pdCwKKwlbSVJRX1BFTkRfRVhUX1NFUlZJQ0VdICAgID0gX19kZWxpdmVyX3NlcnZpY2UsCisJW0lSUV9QRU5EX1BGQVVMVF9ET05FXSAgICA9IF9fZGVsaXZlcl9wZmF1bHRfZG9uZSwKKwlbSVJRX1BFTkRfVklSVElPXSAgICAgICAgID0gX19kZWxpdmVyX3ZpcnRpbywKIH07CiAKLXN0YXRpYyBpbnQgX19tdXN0X2NoZWNrIF9fZGVsaXZlcl9mbG9hdGluZ19pbnRlcnJ1cHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotCQkJCQkgICBzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKmludGkpCi17Ci0JaW50IHJjOwotCi0Jc3dpdGNoIChpbnRpLT50eXBlKSB7Ci0JY2FzZSBLVk1fUzM5MF9JTlRfU0VSVklDRToKLQkJcmMgPSBfX2RlbGl2ZXJfc2VydmljZSh2Y3B1LCBpbnRpKTsKLQkJYnJlYWs7Ci0JY2FzZSBLVk1fUzM5MF9JTlRfUEZBVUxUX0RPTkU6Ci0JCXJjID0gX19kZWxpdmVyX3BmYXVsdF9kb25lKHZjcHUsIGludGkpOwotCQlicmVhazsKLQljYXNlIEtWTV9TMzkwX0lOVF9WSVJUSU86Ci0JCXJjID0gX19kZWxpdmVyX3ZpcnRpbyh2Y3B1LCBpbnRpKTsKLQkJYnJlYWs7Ci0JY2FzZSBLVk1fUzM5MF9NQ0hLOgotCQlyYyA9IF9fZGVsaXZlcl9tY2hrX2Zsb2F0aW5nKHZjcHUsIGludGkpOwotCQlicmVhazsKLQljYXNlIEtWTV9TMzkwX0lOVF9JT19NSU4uLi5LVk1fUzM5MF9JTlRfSU9fTUFYOgotCQlyYyA9IF9fZGVsaXZlcl9pbyh2Y3B1LCBpbnRpKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0JcmV0dXJuIHJjOwotfQotCiAvKiBDaGVjayB3aGV0aGVyIGFuIGV4dGVybmFsIGNhbGwgaXMgcGVuZGluZyAoZGVsaXZlcmFibGUgb3Igbm90KSAqLwogaW50IGt2bV9zMzkwX2V4dF9jYWxsX3BlbmRpbmcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewpAQCAtNzUxLDIxICs4MDgsOSBAQAogCiBpbnQga3ZtX3MzOTBfdmNwdV9oYXNfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGV4Y2x1ZGVfc3RvcCkKIHsKLQlzdHJ1Y3Qga3ZtX3MzOTBfZmxvYXRfaW50ZXJydXB0ICpmaSA9IHZjcHUtPmFyY2gubG9jYWxfaW50LmZsb2F0X2ludDsKLQlzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gICppbnRpOwogCWludCByYzsKIAotCXJjID0gISFkZWxpdmVyYWJsZV9sb2NhbF9pcnFzKHZjcHUpOwotCi0JaWYgKCghcmMpICYmIGF0b21pY19yZWFkKCZmaS0+YWN0aXZlKSkgewotCQlzcGluX2xvY2soJmZpLT5sb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRpLCAmZmktPmxpc3QsIGxpc3QpCi0JCQlpZiAoX19pbnRlcnJ1cHRfaXNfZGVsaXZlcmFibGUodmNwdSwgaW50aSkpIHsKLQkJCQlyYyA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7Ci0JfQorCXJjID0gISFkZWxpdmVyYWJsZV9pcnFzKHZjcHUpOwogCiAJaWYgKCFyYyAmJiBrdm1fY3B1X2hhc19wZW5kaW5nX3RpbWVyKHZjcHUpKQogCQlyYyA9IDE7CkBAIC03ODQsMTIgKzgyOSw3IEBACiAKIGludCBrdm1fY3B1X2hhc19wZW5kaW5nX3RpbWVyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKLQlpZiAoISh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y2tjIDwKLQkgICAgICBnZXRfdG9kX2Nsb2NrX2Zhc3QoKSArIHZjcHUtPmFyY2guc2llX2Jsb2NrLT5lcG9jaCkpCi0JCXJldHVybiAwOwotCWlmICghY2tjX2ludGVycnVwdHNfZW5hYmxlZCh2Y3B1KSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisJcmV0dXJuIGNrY19pcnFfcGVuZGluZyh2Y3B1KSB8fCBjcHVfdGltZXJfaXJxX3BlbmRpbmcodmNwdSk7CiB9CiAKIGludCBrdm1fczM5MF9oYW5kbGVfd2FpdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC04ODQsNjAgKzkyNCw0NSBAQAogaW50IF9fbXVzdF9jaGVjayBrdm1fczM5MF9kZWxpdmVyX3BlbmRpbmdfaW50ZXJydXB0cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IGt2bV9zMzkwX2xvY2FsX2ludGVycnVwdCAqbGkgPSAmdmNwdS0+YXJjaC5sb2NhbF9pbnQ7Ci0Jc3RydWN0IGt2bV9zMzkwX2Zsb2F0X2ludGVycnVwdCAqZmkgPSB2Y3B1LT5hcmNoLmxvY2FsX2ludC5mbG9hdF9pbnQ7Ci0Jc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICAqbiwgKmludGkgPSBOVUxMOwogCWRlbGl2ZXJfaXJxX3QgZnVuYzsKLQlpbnQgZGVsaXZlcjsKIAlpbnQgcmMgPSAwOwogCXVuc2lnbmVkIGxvbmcgaXJxX3R5cGU7Ci0JdW5zaWduZWQgbG9uZyBkZWxpdmVyYWJsZV9pcnFzOworCXVuc2lnbmVkIGxvbmcgaXJxczsKIAogCV9fcmVzZXRfaW50ZXJjZXB0X2luZGljYXRvcnModmNwdSk7CiAKIAkvKiBwZW5kaW5nIGNrYyBjb25kaXRpb25zIG1pZ2h0IGhhdmUgYmVlbiBpbnZhbGlkYXRlZCAqLwogCWNsZWFyX2JpdChJUlFfUEVORF9FWFRfQ0xPQ0tfQ09NUCwgJmxpLT5wZW5kaW5nX2lycXMpOwotCWlmIChrdm1fY3B1X2hhc19wZW5kaW5nX3RpbWVyKHZjcHUpKQorCWlmIChja2NfaXJxX3BlbmRpbmcodmNwdSkpCiAJCXNldF9iaXQoSVJRX1BFTkRfRVhUX0NMT0NLX0NPTVAsICZsaS0+cGVuZGluZ19pcnFzKTsKIAorCS8qIHBlbmRpbmcgY3B1IHRpbWVyIGNvbmRpdGlvbnMgbWlnaHQgaGF2ZSBiZWVuIGludmFsaWRhdGVkICovCisJY2xlYXJfYml0KElSUV9QRU5EX0VYVF9DUFVfVElNRVIsICZsaS0+cGVuZGluZ19pcnFzKTsKKwlpZiAoY3B1X3RpbWVyX2lycV9wZW5kaW5nKHZjcHUpKQorCQlzZXRfYml0KElSUV9QRU5EX0VYVF9DUFVfVElNRVIsICZsaS0+cGVuZGluZ19pcnFzKTsKKwogCWRvIHsKLQkJZGVsaXZlcmFibGVfaXJxcyA9IGRlbGl2ZXJhYmxlX2xvY2FsX2lycXModmNwdSk7CisJCWlycXMgPSBkZWxpdmVyYWJsZV9pcnFzKHZjcHUpOwogCQkvKiBiaXRzIGFyZSBpbiB0aGUgb3JkZXIgb2YgaW50ZXJydXB0IHByaW9yaXR5ICovCi0JCWlycV90eXBlID0gZmluZF9maXJzdF9iaXQoJmRlbGl2ZXJhYmxlX2lycXMsIElSUV9QRU5EX0NPVU5UKTsKKwkJaXJxX3R5cGUgPSBmaW5kX2ZpcnN0X2JpdCgmaXJxcywgSVJRX1BFTkRfQ09VTlQpOwogCQlpZiAoaXJxX3R5cGUgPT0gSVJRX1BFTkRfQ09VTlQpCiAJCQlicmVhazsKLQkJZnVuYyA9IGRlbGl2ZXJfaXJxX2Z1bmNzW2lycV90eXBlXTsKLQkJaWYgKCFmdW5jKSB7Ci0JCQlXQVJOX09OX09OQ0UoZnVuYyA9PSBOVUxMKTsKLQkJCWNsZWFyX2JpdChpcnFfdHlwZSwgJmxpLT5wZW5kaW5nX2lycXMpOwotCQkJY29udGludWU7CisJCWlmIChpc19pb2lycShpcnFfdHlwZSkpIHsKKwkJCXJjID0gX19kZWxpdmVyX2lvKHZjcHUsIGlycV90eXBlKTsKKwkJfSBlbHNlIHsKKwkJCWZ1bmMgPSBkZWxpdmVyX2lycV9mdW5jc1tpcnFfdHlwZV07CisJCQlpZiAoIWZ1bmMpIHsKKwkJCQlXQVJOX09OX09OQ0UoZnVuYyA9PSBOVUxMKTsKKwkJCQljbGVhcl9iaXQoaXJxX3R5cGUsICZsaS0+cGVuZGluZ19pcnFzKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJjID0gZnVuYyh2Y3B1KTsKIAkJfQotCQlyYyA9IGZ1bmModmNwdSk7Ci0JfSB3aGlsZSAoIXJjICYmIGlycV90eXBlICE9IElSUV9QRU5EX0NPVU5UKTsKKwkJaWYgKHJjKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoIXJjKTsKIAotCXNldF9pbnRlcmNlcHRfaW5kaWNhdG9yc19sb2NhbCh2Y3B1KTsKLQotCWlmICghcmMgJiYgYXRvbWljX3JlYWQoJmZpLT5hY3RpdmUpKSB7Ci0JCWRvIHsKLQkJCWRlbGl2ZXIgPSAwOwotCQkJc3Bpbl9sb2NrKCZmaS0+bG9jayk7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW50aSwgbiwgJmZpLT5saXN0LCBsaXN0KSB7Ci0JCQkJaWYgKF9faW50ZXJydXB0X2lzX2RlbGl2ZXJhYmxlKHZjcHUsIGludGkpKSB7Ci0JCQkJCWxpc3RfZGVsKCZpbnRpLT5saXN0KTsKLQkJCQkJZmktPmlycV9jb3VudC0tOwotCQkJCQlkZWxpdmVyID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCV9fc2V0X2ludGVyY2VwdF9pbmRpY2F0b3IodmNwdSwgaW50aSk7Ci0JCQl9Ci0JCQlpZiAobGlzdF9lbXB0eSgmZmktPmxpc3QpKQotCQkJCWF0b21pY19zZXQoJmZpLT5hY3RpdmUsIDApOwotCQkJc3Bpbl91bmxvY2soJmZpLT5sb2NrKTsKLQkJCWlmIChkZWxpdmVyKSB7Ci0JCQkJcmMgPSBfX2RlbGl2ZXJfZmxvYXRpbmdfaW50ZXJydXB0KHZjcHUsIGludGkpOwotCQkJCWtmcmVlKGludGkpOwotCQkJfQotCQl9IHdoaWxlICghcmMgJiYgZGVsaXZlcik7Ci0JfQorCXNldF9pbnRlcmNlcHRfaW5kaWNhdG9ycyh2Y3B1KTsKIAogCXJldHVybiByYzsKIH0KQEAgLTExNzIsODAgKzExOTcsMTgyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKmdldF9pb19pbnQoc3RydWN0IGt2bSAqa3ZtLAorCQkJCQkJICBpbnQgaXNjLCB1MzIgc2NoaWQpCit7CisJc3RydWN0IGt2bV9zMzkwX2Zsb2F0X2ludGVycnVwdCAqZmkgPSAma3ZtLT5hcmNoLmZsb2F0X2ludDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICppc2NfbGlzdCA9ICZmaS0+bGlzdHNbRklSUV9MSVNUX0lPX0lTQ18wICsgaXNjXTsKKwlzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKml0ZXI7CisJdTE2IGlkID0gKHNjaGlkICYgMHhmZmZmMDAwMFUpID4+IDE2OworCXUxNiBuciA9IHNjaGlkICYgMHgwMDAwZmZmZlU7CiAKKwlzcGluX2xvY2soJmZpLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXIsIGlzY19saXN0LCBsaXN0KSB7CisJCWlmIChzY2hpZCAmJiAoaWQgIT0gaXRlci0+aW8uc3ViY2hhbm5lbF9pZCB8fAorCQkJICAgICAgbnIgIT0gaXRlci0+aW8uc3ViY2hhbm5lbF9ucikpCisJCQljb250aW51ZTsKKwkJLyogZm91bmQgYW4gYXBwcm9wcmlhdGUgZW50cnkgKi8KKwkJbGlzdF9kZWxfaW5pdCgmaXRlci0+bGlzdCk7CisJCWZpLT5jb3VudGVyc1tGSVJRX0NOVFJfSU9dIC09IDE7CisJCWlmIChsaXN0X2VtcHR5KGlzY19saXN0KSkKKwkJCWNsZWFyX2JpdChJUlFfUEVORF9JT19JU0NfMCArIGlzYywgJmZpLT5wZW5kaW5nX2lycXMpOworCQlzcGluX3VubG9jaygmZmktPmxvY2spOworCQlyZXR1cm4gaXRlcjsKKwl9CisJc3Bpbl91bmxvY2soJmZpLT5sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIERlcXVldWUgYW5kIHJldHVybiBhbiBJL08gaW50ZXJydXB0IG1hdGNoaW5nIGFueSBvZiB0aGUgaW50ZXJydXB0aW9uCisgKiBzdWJjbGFzc2VzIGFzIGRlc2lnbmF0ZWQgYnkgdGhlIGlzYyBtYXNrIGluIGNyNiBhbmQgdGhlIHNjaGlkIChpZiAhPSAwKS4KKyAqLwogc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICprdm1fczM5MF9nZXRfaW9faW50KHN0cnVjdCBrdm0gKmt2bSwKLQkJCQkJCSAgICB1NjQgY3I2LCB1NjQgc2NoaWQpCisJCQkJCQkgICAgdTY0IGlzY19tYXNrLCB1MzIgc2NoaWQpCit7CisJc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpID0gTlVMTDsKKwlpbnQgaXNjOworCisJZm9yIChpc2MgPSAwOyBpc2MgPD0gTUFYX0lTQyAmJiAhaW50aTsgaXNjKyspIHsKKwkJaWYgKGlzY19tYXNrICYgaXNjX3RvX2lzY19iaXRzKGlzYykpCisJCQlpbnRpID0gZ2V0X2lvX2ludChrdm0sIGlzYywgc2NoaWQpOworCX0KKwlyZXR1cm4gaW50aTsKK30KKworI2RlZmluZSBTQ0NCX01BU0sgMHhGRkZGRkZGOAorI2RlZmluZSBTQ0NCX0VWRU5UX1BFTkRJTkcgMHgzCisKK3N0YXRpYyBpbnQgX19pbmplY3Rfc2VydmljZShzdHJ1Y3Qga3ZtICprdm0sCisJCQkgICAgIHN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHRfaW5mbyAqaW50aSkKK3sKKwlzdHJ1Y3Qga3ZtX3MzOTBfZmxvYXRfaW50ZXJydXB0ICpmaSA9ICZrdm0tPmFyY2guZmxvYXRfaW50OworCisJc3Bpbl9sb2NrKCZmaS0+bG9jayk7CisJZmktPnNydl9zaWduYWwuZXh0X3BhcmFtcyB8PSBpbnRpLT5leHQuZXh0X3BhcmFtcyAmIFNDQ0JfRVZFTlRfUEVORElORzsKKwkvKgorCSAqIEVhcmx5IHZlcnNpb25zIG9mIHRoZSBRRU1VIHMzOTAgYmlvcyB3aWxsIGluamVjdCBzZXZlcmFsCisJICogc2VydmljZSBpbnRlcnJ1cHRzIGFmdGVyIGFub3RoZXIgd2l0aG91dCBoYW5kbGluZyBhCisJICogY29uZGl0aW9uIGNvZGUgaW5kaWNhdGluZyBidXN5LgorCSAqIFdlIHdpbGwgc2lsZW50bHkgaWdub3JlIHRob3NlIHN1cGVyZmx1b3VzIHNjY2IgdmFsdWVzLgorCSAqIEEgZnV0dXJlIHZlcnNpb24gb2YgUUVNVSB3aWxsIHRha2UgY2FyZSBvZiBzZXJpYWxpemF0aW9uCisJICogb2Ygc2VydmMgcmVxdWVzdHMKKwkgKi8KKwlpZiAoZmktPnNydl9zaWduYWwuZXh0X3BhcmFtcyAmIFNDQ0JfTUFTSykKKwkJZ290byBvdXQ7CisJZmktPnNydl9zaWduYWwuZXh0X3BhcmFtcyB8PSBpbnRpLT5leHQuZXh0X3BhcmFtcyAmIFNDQ0JfTUFTSzsKKwlzZXRfYml0KElSUV9QRU5EX0VYVF9TRVJWSUNFLCAmZmktPnBlbmRpbmdfaXJxcyk7CitvdXQ6CisJc3Bpbl91bmxvY2soJmZpLT5sb2NrKTsKKwlrZnJlZShpbnRpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luamVjdF92aXJ0aW8oc3RydWN0IGt2bSAqa3ZtLAorCQkJICAgIHN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHRfaW5mbyAqaW50aSkKK3sKKwlzdHJ1Y3Qga3ZtX3MzOTBfZmxvYXRfaW50ZXJydXB0ICpmaSA9ICZrdm0tPmFyY2guZmxvYXRfaW50OworCisJc3Bpbl9sb2NrKCZmaS0+bG9jayk7CisJaWYgKGZpLT5jb3VudGVyc1tGSVJRX0NOVFJfVklSVElPXSA+PSBLVk1fUzM5MF9NQVhfVklSVElPX0lSUVMpIHsKKwkJc3Bpbl91bmxvY2soJmZpLT5sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJZmktPmNvdW50ZXJzW0ZJUlFfQ05UUl9WSVJUSU9dICs9IDE7CisJbGlzdF9hZGRfdGFpbCgmaW50aS0+bGlzdCwgJmZpLT5saXN0c1tGSVJRX0xJU1RfVklSVElPXSk7CisJc2V0X2JpdChJUlFfUEVORF9WSVJUSU8sICZmaS0+cGVuZGluZ19pcnFzKTsKKwlzcGluX3VubG9jaygmZmktPmxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5qZWN0X3BmYXVsdF9kb25lKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQkgc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpKQoreworCXN0cnVjdCBrdm1fczM5MF9mbG9hdF9pbnRlcnJ1cHQgKmZpID0gJmt2bS0+YXJjaC5mbG9hdF9pbnQ7CisKKwlzcGluX2xvY2soJmZpLT5sb2NrKTsKKwlpZiAoZmktPmNvdW50ZXJzW0ZJUlFfQ05UUl9QRkFVTFRdID49CisJCShBU1lOQ19QRl9QRVJfVkNQVSAqIEtWTV9NQVhfVkNQVVMpKSB7CisJCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWZpLT5jb3VudGVyc1tGSVJRX0NOVFJfUEZBVUxUXSArPSAxOworCWxpc3RfYWRkX3RhaWwoJmludGktPmxpc3QsICZmaS0+bGlzdHNbRklSUV9MSVNUX1BGQVVMVF0pOworCXNldF9iaXQoSVJRX1BFTkRfUEZBVUxUX0RPTkUsICZmaS0+cGVuZGluZ19pcnFzKTsKKwlzcGluX3VubG9jaygmZmktPmxvY2spOworCXJldHVybiAwOworfQorCisjZGVmaW5lIENSX1BFTkRJTkdfU1VCQ0xBU1MgMjgKK3N0YXRpYyBpbnQgX19pbmplY3RfZmxvYXRfbWNoayhzdHJ1Y3Qga3ZtICprdm0sCisJCQkJc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpKQoreworCXN0cnVjdCBrdm1fczM5MF9mbG9hdF9pbnRlcnJ1cHQgKmZpID0gJmt2bS0+YXJjaC5mbG9hdF9pbnQ7CisKKwlzcGluX2xvY2soJmZpLT5sb2NrKTsKKwlmaS0+bWNoay5jcjE0IHw9IGludGktPm1jaGsuY3IxNCAmICgxVUwgPDwgQ1JfUEVORElOR19TVUJDTEFTUyk7CisJZmktPm1jaGsubWNpYyB8PSBpbnRpLT5tY2hrLm1jaWM7CisJc2V0X2JpdChJUlFfUEVORF9NQ0hLX1JFUCwgJmZpLT5wZW5kaW5nX2lycXMpOworCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7CisJa2ZyZWUoaW50aSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbmplY3RfaW8oc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKmludGkpCiB7CiAJc3RydWN0IGt2bV9zMzkwX2Zsb2F0X2ludGVycnVwdCAqZmk7Ci0Jc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpLCAqaXRlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCWludCBpc2M7CiAKLQlpZiAoKCFzY2hpZCAmJiAhY3I2KSB8fCAoc2NoaWQgJiYgY3I2KSkKLQkJcmV0dXJuIE5VTEw7CiAJZmkgPSAma3ZtLT5hcmNoLmZsb2F0X2ludDsKIAlzcGluX2xvY2soJmZpLT5sb2NrKTsKLQlpbnRpID0gTlVMTDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXIsICZmaS0+bGlzdCwgbGlzdCkgewotCQlpZiAoIWlzX2lvaW50KGl0ZXItPnR5cGUpKQotCQkJY29udGludWU7Ci0JCWlmIChjcjYgJiYKLQkJICAgICgoY3I2ICYgaW50X3dvcmRfdG9faXNjX2JpdHMoaXRlci0+aW8uaW9faW50X3dvcmQpKSA9PSAwKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoc2NoaWQpIHsKLQkJCWlmICgoKHNjaGlkICYgMHgwMDAwMDAwMGZmZmYwMDAwKSA+PiAxNikgIT0KLQkJCSAgICBpdGVyLT5pby5zdWJjaGFubmVsX2lkKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKChzY2hpZCAmIDB4MDAwMDAwMDAwMDAwZmZmZikgIT0KLQkJCSAgICBpdGVyLT5pby5zdWJjaGFubmVsX25yKQotCQkJCWNvbnRpbnVlOwotCQl9Ci0JCWludGkgPSBpdGVyOwotCQlicmVhazsKKwlpZiAoZmktPmNvdW50ZXJzW0ZJUlFfQ05UUl9JT10gPj0gS1ZNX1MzOTBfTUFYX0ZMT0FUX0lSUVMpIHsKKwkJc3Bpbl91bmxvY2soJmZpLT5sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9Ci0JaWYgKGludGkpIHsKLQkJbGlzdF9kZWxfaW5pdCgmaW50aS0+bGlzdCk7Ci0JCWZpLT5pcnFfY291bnQtLTsKLQl9Ci0JaWYgKGxpc3RfZW1wdHkoJmZpLT5saXN0KSkKLQkJYXRvbWljX3NldCgmZmktPmFjdGl2ZSwgMCk7CisJZmktPmNvdW50ZXJzW0ZJUlFfQ05UUl9JT10gKz0gMTsKKworCWlzYyA9IGludF93b3JkX3RvX2lzYyhpbnRpLT5pby5pb19pbnRfd29yZCk7CisJbGlzdCA9ICZmaS0+bGlzdHNbRklSUV9MSVNUX0lPX0lTQ18wICsgaXNjXTsKKwlsaXN0X2FkZF90YWlsKCZpbnRpLT5saXN0LCBsaXN0KTsKKwlzZXRfYml0KElSUV9QRU5EX0lPX0lTQ18wICsgaXNjLCAmZmktPnBlbmRpbmdfaXJxcyk7CiAJc3Bpbl91bmxvY2soJmZpLT5sb2NrKTsKLQlyZXR1cm4gaW50aTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBfX2luamVjdF92bShzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHRfaW5mbyAqaW50aSkKIHsKIAlzdHJ1Y3Qga3ZtX3MzOTBfbG9jYWxfaW50ZXJydXB0ICpsaTsKIAlzdHJ1Y3Qga3ZtX3MzOTBfZmxvYXRfaW50ZXJydXB0ICpmaTsKLQlzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKml0ZXI7CiAJc3RydWN0IGt2bV92Y3B1ICpkc3RfdmNwdSA9IE5VTEw7CiAJaW50IHNpZ2NwdTsKLQlpbnQgcmMgPSAwOworCXU2NCB0eXBlID0gUkVBRF9PTkNFKGludGktPnR5cGUpOworCWludCByYzsKIAogCWZpID0gJmt2bS0+YXJjaC5mbG9hdF9pbnQ7Ci0Jc3Bpbl9sb2NrKCZmaS0+bG9jayk7Ci0JaWYgKGZpLT5pcnFfY291bnQgPj0gS1ZNX1MzOTBfTUFYX0ZMT0FUX0lSUVMpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIHVubG9ja19maTsKLQl9Ci0JZmktPmlycV9jb3VudCsrOwotCWlmICghaXNfaW9pbnQoaW50aS0+dHlwZSkpIHsKLQkJbGlzdF9hZGRfdGFpbCgmaW50aS0+bGlzdCwgJmZpLT5saXN0KTsKLQl9IGVsc2UgewotCQl1NjQgaXNjX2JpdHMgPSBpbnRfd29yZF90b19pc2NfYml0cyhpbnRpLT5pby5pb19pbnRfd29yZCk7CiAKLQkJLyogS2VlcCBJL08gaW50ZXJydXB0cyBzb3J0ZWQgaW4gaXNjIG9yZGVyLiAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXIsICZmaS0+bGlzdCwgbGlzdCkgewotCQkJaWYgKCFpc19pb2ludChpdGVyLT50eXBlKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChpbnRfd29yZF90b19pc2NfYml0cyhpdGVyLT5pby5pb19pbnRfd29yZCkKLQkJCSAgICA8PSBpc2NfYml0cykKLQkJCQljb250aW51ZTsKLQkJCWJyZWFrOwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJmludGktPmxpc3QsICZpdGVyLT5saXN0KTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEtWTV9TMzkwX01DSEs6CisJCXJjID0gX19pbmplY3RfZmxvYXRfbWNoayhrdm0sIGludGkpOworCQlicmVhazsKKwljYXNlIEtWTV9TMzkwX0lOVF9WSVJUSU86CisJCXJjID0gX19pbmplY3RfdmlydGlvKGt2bSwgaW50aSk7CisJCWJyZWFrOworCWNhc2UgS1ZNX1MzOTBfSU5UX1NFUlZJQ0U6CisJCXJjID0gX19pbmplY3Rfc2VydmljZShrdm0sIGludGkpOworCQlicmVhazsKKwljYXNlIEtWTV9TMzkwX0lOVF9QRkFVTFRfRE9ORToKKwkJcmMgPSBfX2luamVjdF9wZmF1bHRfZG9uZShrdm0sIGludGkpOworCQlicmVhazsKKwljYXNlIEtWTV9TMzkwX0lOVF9JT19NSU4uLi5LVk1fUzM5MF9JTlRfSU9fTUFYOgorCQlyYyA9IF9faW5qZWN0X2lvKGt2bSwgaW50aSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKIAl9Ci0JYXRvbWljX3NldCgmZmktPmFjdGl2ZSwgMSk7Ci0JaWYgKGF0b21pY19yZWFkKCZrdm0tPm9ubGluZV92Y3B1cykgPT0gMCkKLQkJZ290byB1bmxvY2tfZmk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKIAlzaWdjcHUgPSBmaW5kX2ZpcnN0X2JpdChmaS0+aWRsZV9tYXNrLCBLVk1fTUFYX1ZDUFVTKTsKIAlpZiAoc2lnY3B1ID09IEtWTV9NQVhfVkNQVVMpIHsKIAkJZG8gewpAQCAtMTI1Nyw3ICsxMzg0LDcgQEAKIAlkc3RfdmNwdSA9IGt2bV9nZXRfdmNwdShrdm0sIHNpZ2NwdSk7CiAJbGkgPSAmZHN0X3ZjcHUtPmFyY2gubG9jYWxfaW50OwogCXNwaW5fbG9jaygmbGktPmxvY2spOwotCXN3aXRjaCAoaW50aS0+dHlwZSkgeworCXN3aXRjaCAodHlwZSkgewogCWNhc2UgS1ZNX1MzOTBfTUNISzoKIAkJYXRvbWljX3NldF9tYXNrKENQVVNUQVRfU1RPUF9JTlQsIGxpLT5jcHVmbGFncyk7CiAJCWJyZWFrOwpAQCAtMTI3MCw5ICsxMzk3LDggQEAKIAl9CiAJc3Bpbl91bmxvY2soJmxpLT5sb2NrKTsKIAlrdm1fczM5MF92Y3B1X3dha2V1cChrdm1fZ2V0X3ZjcHUoa3ZtLCBzaWdjcHUpKTsKLXVubG9ja19maToKLQlzcGluX3VubG9jaygmZmktPmxvY2spOwotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKKwogfQogCiBpbnQga3ZtX3MzOTBfaW5qZWN0X3ZtKHN0cnVjdCBrdm0gKmt2bSwKQEAgLTEzMzIsMTAgKzE0NTgsMTAgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXZvaWQga3ZtX3MzOTBfcmVpbmplY3RfaW9faW50KHN0cnVjdCBrdm0gKmt2bSwKK2ludCBrdm1fczM5MF9yZWluamVjdF9pb19pbnQoc3RydWN0IGt2bSAqa3ZtLAogCQkJICAgICAgc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpKQogewotCV9faW5qZWN0X3ZtKGt2bSwgaW50aSk7CisJcmV0dXJuIF9faW5qZWN0X3ZtKGt2bSwgaW50aSk7CiB9CiAKIGludCBzMzkwaW50X3RvX3MzOTBpcnEoc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdCAqczM5MGludCwKQEAgLTEzODgsMTIgKzE1MTQsMTAgQEAKIAlzcGluX3VubG9jaygmbGktPmxvY2spOwogfQogCi1pbnQga3ZtX3MzOTBfaW5qZWN0X3ZjcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3MzOTBfaXJxICppcnEpCitzdGF0aWMgaW50IGRvX2luamVjdF92Y3B1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9zMzkwX2lycSAqaXJxKQogewotCXN0cnVjdCBrdm1fczM5MF9sb2NhbF9pbnRlcnJ1cHQgKmxpID0gJnZjcHUtPmFyY2gubG9jYWxfaW50OwogCWludCByYzsKIAotCXNwaW5fbG9jaygmbGktPmxvY2spOwogCXN3aXRjaCAoaXJxLT50eXBlKSB7CiAJY2FzZSBLVk1fUzM5MF9QUk9HUkFNX0lOVDoKIAkJVkNQVV9FVkVOVCh2Y3B1LCAzLCAiaW5qZWN0OiBwcm9ncmFtIGNoZWNrICVkIChmcm9tIHVzZXIpIiwKQEAgLTE0MzMsODMgKzE1NTcsMTMwIEBACiAJZGVmYXVsdDoKIAkJcmMgPSAtRUlOVkFMOwogCX0KKworCXJldHVybiByYzsKK30KKworaW50IGt2bV9zMzkwX2luamVjdF92Y3B1KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9zMzkwX2lycSAqaXJxKQoreworCXN0cnVjdCBrdm1fczM5MF9sb2NhbF9pbnRlcnJ1cHQgKmxpID0gJnZjcHUtPmFyY2gubG9jYWxfaW50OworCWludCByYzsKKworCXNwaW5fbG9jaygmbGktPmxvY2spOworCXJjID0gZG9faW5qZWN0X3ZjcHUodmNwdSwgaXJxKTsKIAlzcGluX3VubG9jaygmbGktPmxvY2spOwogCWlmICghcmMpCiAJCWt2bV9zMzkwX3ZjcHVfd2FrZXVwKHZjcHUpOwogCXJldHVybiByYzsKIH0KIAotdm9pZCBrdm1fczM5MF9jbGVhcl9mbG9hdF9pcnFzKHN0cnVjdCBrdm0gKmt2bSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9pcnFfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpfbGlzdCkKIHsKLQlzdHJ1Y3Qga3ZtX3MzOTBfZmxvYXRfaW50ZXJydXB0ICpmaTsKLQlzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8JKm4sICppbnRpID0gTlVMTDsKKwlzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKmludGksICpuOwogCi0JZmkgPSAma3ZtLT5hcmNoLmZsb2F0X2ludDsKLQlzcGluX2xvY2soJmZpLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW50aSwgbiwgJmZpLT5saXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGludGksIG4sIF9saXN0LCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZpbnRpLT5saXN0KTsKIAkJa2ZyZWUoaW50aSk7CiAJfQotCWZpLT5pcnFfY291bnQgPSAwOwotCWF0b21pY19zZXQoJmZpLT5hY3RpdmUsIDApOwotCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNvcHlfaXJxX3RvX3VzZXIoc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpLAotCQkJCSAgIHU4ICphZGRyKQorc3RhdGljIHZvaWQgaW50aV90b19pcnEoc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpLAorCQkgICAgICAgc3RydWN0IGt2bV9zMzkwX2lycSAqaXJxKQogewotCXN0cnVjdCBrdm1fczM5MF9pcnEgX191c2VyICp1cHRyID0gKHN0cnVjdCBrdm1fczM5MF9pcnEgX191c2VyICopIGFkZHI7Ci0Jc3RydWN0IGt2bV9zMzkwX2lycSBpcnEgPSB7MH07Ci0KLQlpcnEudHlwZSA9IGludGktPnR5cGU7CisJaXJxLT50eXBlID0gaW50aS0+dHlwZTsKIAlzd2l0Y2ggKGludGktPnR5cGUpIHsKIAljYXNlIEtWTV9TMzkwX0lOVF9QRkFVTFRfSU5JVDoKIAljYXNlIEtWTV9TMzkwX0lOVF9QRkFVTFRfRE9ORToKIAljYXNlIEtWTV9TMzkwX0lOVF9WSVJUSU86Ci0JY2FzZSBLVk1fUzM5MF9JTlRfU0VSVklDRToKLQkJaXJxLnUuZXh0ID0gaW50aS0+ZXh0OworCQlpcnEtPnUuZXh0ID0gaW50aS0+ZXh0OwogCQlicmVhazsKIAljYXNlIEtWTV9TMzkwX0lOVF9JT19NSU4uLi5LVk1fUzM5MF9JTlRfSU9fTUFYOgotCQlpcnEudS5pbyA9IGludGktPmlvOworCQlpcnEtPnUuaW8gPSBpbnRpLT5pbzsKIAkJYnJlYWs7Ci0JY2FzZSBLVk1fUzM5MF9NQ0hLOgotCQlpcnEudS5tY2hrID0gaW50aS0+bWNoazsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCi0JaWYgKGNvcHlfdG9fdXNlcih1cHRyLCAmaXJxLCBzaXplb2YoaXJxKSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X2FsbF9mbG9hdGluZ19pcnFzKHN0cnVjdCBrdm0gKmt2bSwgX191OCAqYnVmLCBfX3U2NCBsZW4pCit2b2lkIGt2bV9zMzkwX2NsZWFyX2Zsb2F0X2lycXMoc3RydWN0IGt2bSAqa3ZtKQoreworCXN0cnVjdCBrdm1fczM5MF9mbG9hdF9pbnRlcnJ1cHQgKmZpID0gJmt2bS0+YXJjaC5mbG9hdF9pbnQ7CisJaW50IGk7CisKKwlzcGluX2xvY2soJmZpLT5sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgRklSUV9MSVNUX0NPVU5UOyBpKyspCisJCWNsZWFyX2lycV9saXN0KCZmaS0+bGlzdHNbaV0pOworCWZvciAoaSA9IDA7IGkgPCBGSVJRX01BWF9DT1VOVDsgaSsrKQorCQlmaS0+Y291bnRlcnNbaV0gPSAwOworCXNwaW5fdW5sb2NrKCZmaS0+bG9jayk7Cit9OworCitzdGF0aWMgaW50IGdldF9hbGxfZmxvYXRpbmdfaXJxcyhzdHJ1Y3Qga3ZtICprdm0sIHU4IF9fdXNlciAqdXNyYnVmLCB1NjQgbGVuKQogewogCXN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHRfaW5mbyAqaW50aTsKIAlzdHJ1Y3Qga3ZtX3MzOTBfZmxvYXRfaW50ZXJydXB0ICpmaTsKKwlzdHJ1Y3Qga3ZtX3MzOTBfaXJxICpidWY7CisJc3RydWN0IGt2bV9zMzkwX2lycSAqaXJxOworCWludCBtYXhfaXJxczsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgbiA9IDA7CisJaW50IGk7CisKKwlpZiAobGVuID4gS1ZNX1MzOTBfRkxJQ19NQVhfQlVGRkVSIHx8IGxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogV2UgYXJlIGFscmVhZHkgdXNpbmcgLUVOT01FTSB0byBzaWduYWwKKwkgKiB1c2Vyc3BhY2UgaXQgbWF5IHJldHJ5IHdpdGggYSBiaWdnZXIgYnVmZmVyLAorCSAqIHNvIHdlIG5lZWQgdG8gdXNlIHNvbWV0aGluZyBlbHNlIGZvciB0aGlzIGNhc2UKKwkgKi8KKwlidWYgPSB2emFsbG9jKGxlbik7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PQlVGUzsKKworCW1heF9pcnFzID0gbGVuIC8gc2l6ZW9mKHN0cnVjdCBrdm1fczM5MF9pcnEpOwogCiAJZmkgPSAma3ZtLT5hcmNoLmZsb2F0X2ludDsKIAlzcGluX2xvY2soJmZpLT5sb2NrKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50aSwgJmZpLT5saXN0LCBsaXN0KSB7Ci0JCWlmIChsZW4gPCBzaXplb2Yoc3RydWN0IGt2bV9zMzkwX2lycSkpIHsKKwlmb3IgKGkgPSAwOyBpIDwgRklSUV9MSVNUX0NPVU5UOyBpKyspIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRpLCAmZmktPmxpc3RzW2ldLCBsaXN0KSB7CisJCQlpZiAobiA9PSBtYXhfaXJxcykgeworCQkJCS8qIHNpZ25hbCB1c2Vyc3BhY2UgdG8gdHJ5IGFnYWluICovCisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWludGlfdG9faXJxKGludGksICZidWZbbl0pOworCQkJbisrOworCQl9CisJfQorCWlmICh0ZXN0X2JpdChJUlFfUEVORF9FWFRfU0VSVklDRSwgJmZpLT5wZW5kaW5nX2lycXMpKSB7CisJCWlmIChuID09IG1heF9pcnFzKSB7CiAJCQkvKiBzaWduYWwgdXNlcnNwYWNlIHRvIHRyeSBhZ2FpbiAqLwogCQkJcmV0ID0gLUVOT01FTTsKLQkJCWJyZWFrOworCQkJZ290byBvdXQ7CiAJCX0KLQkJcmV0ID0gY29weV9pcnFfdG9fdXNlcihpbnRpLCBidWYpOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0JCWJ1ZiArPSBzaXplb2Yoc3RydWN0IGt2bV9zMzkwX2lycSk7Ci0JCWxlbiAtPSBzaXplb2Yoc3RydWN0IGt2bV9zMzkwX2lycSk7CisJCWlycSA9IChzdHJ1Y3Qga3ZtX3MzOTBfaXJxICopICZidWZbbl07CisJCWlycS0+dHlwZSA9IEtWTV9TMzkwX0lOVF9TRVJWSUNFOworCQlpcnEtPnUuZXh0ID0gZmktPnNydl9zaWduYWw7CiAJCW4rKzsKIAl9CisJaWYgKHRlc3RfYml0KElSUV9QRU5EX01DSEtfUkVQLCAmZmktPnBlbmRpbmdfaXJxcykpIHsKKwkJaWYgKG4gPT0gbWF4X2lycXMpIHsKKwkJCQkvKiBzaWduYWwgdXNlcnNwYWNlIHRvIHRyeSBhZ2FpbiAqLworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCX0KKwkJaXJxID0gKHN0cnVjdCBrdm1fczM5MF9pcnEgKikgJmJ1ZltuXTsKKwkJaXJxLT50eXBlID0gS1ZNX1MzOTBfTUNISzsKKwkJaXJxLT51Lm1jaGsgPSBmaS0+bWNoazsKKwkJbisrOworfQogCitvdXQ6CiAJc3Bpbl91bmxvY2soJmZpLT5sb2NrKTsKKwlpZiAoIXJldCAmJiBuID4gMCkgeworCQlpZiAoY29weV90b191c2VyKHVzcmJ1ZiwgYnVmLCBzaXplb2Yoc3RydWN0IGt2bV9zMzkwX2lycSkgKiBuKSkKKwkJCXJldCA9IC1FRkFVTFQ7CisJfQorCXZmcmVlKGJ1Zik7CiAKIAlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IG47CiB9CkBAIC0xNTIwLDcgKzE2OTEsNyBAQAogCiAJc3dpdGNoIChhdHRyLT5ncm91cCkgewogCWNhc2UgS1ZNX0RFVl9GTElDX0dFVF9BTExfSVJRUzoKLQkJciA9IGdldF9hbGxfZmxvYXRpbmdfaXJxcyhkZXYtPmt2bSwgKHU4ICopIGF0dHItPmFkZHIsCisJCXIgPSBnZXRfYWxsX2Zsb2F0aW5nX2lycXMoZGV2LT5rdm0sICh1OCBfX3VzZXIgKikgYXR0ci0+YWRkciwKIAkJCQkJICBhdHRyLT5hdHRyKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE5NTIsMyArMjEyMywxNDMgQEAKIHsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KKworaW50IGt2bV9zMzkwX3NldF9pcnFfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB2b2lkIF9fdXNlciAqaXJxc3RhdGUsIGludCBsZW4pCit7CisJc3RydWN0IGt2bV9zMzkwX2xvY2FsX2ludGVycnVwdCAqbGkgPSAmdmNwdS0+YXJjaC5sb2NhbF9pbnQ7CisJc3RydWN0IGt2bV9zMzkwX2lycSAqYnVmOworCWludCByID0gMDsKKwlpbnQgbjsKKworCWJ1ZiA9IHZtYWxsb2MobGVuKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoY29weV9mcm9tX3VzZXIoKHZvaWQgKikgYnVmLCBpcnFzdGF0ZSwgbGVuKSkgeworCQlyID0gLUVGQVVMVDsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwkvKgorCSAqIERvbid0IGFsbG93IHNldHRpbmcgdGhlIGludGVycnVwdCBzdGF0ZQorCSAqIHdoZW4gdGhlcmUgYXJlIGFscmVhZHkgaW50ZXJydXB0cyBwZW5kaW5nCisJICovCisJc3Bpbl9sb2NrKCZsaS0+bG9jayk7CisJaWYgKGxpLT5wZW5kaW5nX2lycXMpIHsKKwkJciA9IC1FQlVTWTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWZvciAobiA9IDA7IG4gPCBsZW4gLyBzaXplb2YoKmJ1Zik7IG4rKykgeworCQlyID0gZG9faW5qZWN0X3ZjcHUodmNwdSwgJmJ1ZltuXSk7CisJCWlmIChyKQorCQkJYnJlYWs7CisJfQorCitvdXRfdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZsaS0+bG9jayk7CitvdXRfZnJlZToKKwl2ZnJlZShidWYpOworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3JlX2xvY2FsX2lycShzdHJ1Y3Qga3ZtX3MzOTBfbG9jYWxfaW50ZXJydXB0ICpsaSwKKwkJCSAgICBzdHJ1Y3Qga3ZtX3MzOTBfaXJxICppcnEsCisJCQkgICAgdW5zaWduZWQgbG9uZyBpcnFfdHlwZSkKK3sKKwlzd2l0Y2ggKGlycV90eXBlKSB7CisJY2FzZSBJUlFfUEVORF9NQ0hLX0VYOgorCWNhc2UgSVJRX1BFTkRfTUNIS19SRVA6CisJCWlycS0+dHlwZSA9IEtWTV9TMzkwX01DSEs7CisJCWlycS0+dS5tY2hrID0gbGktPmlycS5tY2hrOworCQlicmVhazsKKwljYXNlIElSUV9QRU5EX1BST0c6CisJCWlycS0+dHlwZSA9IEtWTV9TMzkwX1BST0dSQU1fSU5UOworCQlpcnEtPnUucGdtID0gbGktPmlycS5wZ207CisJCWJyZWFrOworCWNhc2UgSVJRX1BFTkRfUEZBVUxUX0lOSVQ6CisJCWlycS0+dHlwZSA9IEtWTV9TMzkwX0lOVF9QRkFVTFRfSU5JVDsKKwkJaXJxLT51LmV4dCA9IGxpLT5pcnEuZXh0OworCQlicmVhazsKKwljYXNlIElSUV9QRU5EX0VYVF9FWFRFUk5BTDoKKwkJaXJxLT50eXBlID0gS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEw7CisJCWlycS0+dS5leHRjYWxsID0gbGktPmlycS5leHRjYWxsOworCQlicmVhazsKKwljYXNlIElSUV9QRU5EX0VYVF9DTE9DS19DT01QOgorCQlpcnEtPnR5cGUgPSBLVk1fUzM5MF9JTlRfQ0xPQ0tfQ09NUDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfUEVORF9FWFRfQ1BVX1RJTUVSOgorCQlpcnEtPnR5cGUgPSBLVk1fUzM5MF9JTlRfQ1BVX1RJTUVSOworCQlicmVhazsKKwljYXNlIElSUV9QRU5EX1NJR1BfU1RPUDoKKwkJaXJxLT50eXBlID0gS1ZNX1MzOTBfU0lHUF9TVE9QOworCQlpcnEtPnUuc3RvcCA9IGxpLT5pcnEuc3RvcDsKKwkJYnJlYWs7CisJY2FzZSBJUlFfUEVORF9SRVNUQVJUOgorCQlpcnEtPnR5cGUgPSBLVk1fUzM5MF9SRVNUQVJUOworCQlicmVhazsKKwljYXNlIElSUV9QRU5EX1NFVF9QUkVGSVg6CisJCWlycS0+dHlwZSA9IEtWTV9TMzkwX1NJR1BfU0VUX1BSRUZJWDsKKwkJaXJxLT51LnByZWZpeCA9IGxpLT5pcnEucHJlZml4OworCQlicmVhazsKKwl9Cit9CisKK2ludCBrdm1fczM5MF9nZXRfaXJxX3N0YXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgX191OCBfX3VzZXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1aW50OF90IHNpZ3BfY3RybCA9IHZjcHUtPmt2bS0+YXJjaC5zY2EtPmNwdVt2Y3B1LT52Y3B1X2lkXS5zaWdwX2N0cmw7CisJdW5zaWduZWQgbG9uZyBzaWdwX2VtZXJnX3BlbmRpbmdbQklUU19UT19MT05HUyhLVk1fTUFYX1ZDUFVTKV07CisJc3RydWN0IGt2bV9zMzkwX2xvY2FsX2ludGVycnVwdCAqbGkgPSAmdmNwdS0+YXJjaC5sb2NhbF9pbnQ7CisJdW5zaWduZWQgbG9uZyBwZW5kaW5nX2lycXM7CisJc3RydWN0IGt2bV9zMzkwX2lycSBpcnE7CisJdW5zaWduZWQgbG9uZyBpcnFfdHlwZTsKKwlpbnQgY3B1YWRkcjsKKwlpbnQgbiA9IDA7CisKKwlzcGluX2xvY2soJmxpLT5sb2NrKTsKKwlwZW5kaW5nX2lycXMgPSBsaS0+cGVuZGluZ19pcnFzOworCW1lbWNweSgmc2lncF9lbWVyZ19wZW5kaW5nLCAmbGktPnNpZ3BfZW1lcmdfcGVuZGluZywKKwkgICAgICAgc2l6ZW9mKHNpZ3BfZW1lcmdfcGVuZGluZykpOworCXNwaW5fdW5sb2NrKCZsaS0+bG9jayk7CisKKwlmb3JfZWFjaF9zZXRfYml0KGlycV90eXBlLCAmcGVuZGluZ19pcnFzLCBJUlFfUEVORF9DT1VOVCkgeworCQltZW1zZXQoJmlycSwgMCwgc2l6ZW9mKGlycSkpOworCQlpZiAoaXJxX3R5cGUgPT0gSVJRX1BFTkRfRVhUX0VNRVJHRU5DWSkKKwkJCWNvbnRpbnVlOworCQlpZiAobiArIHNpemVvZihpcnEpID4gbGVuKQorCQkJcmV0dXJuIC1FTk9CVUZTOworCQlzdG9yZV9sb2NhbF9pcnEoJnZjcHUtPmFyY2gubG9jYWxfaW50LCAmaXJxLCBpcnFfdHlwZSk7CisJCWlmIChjb3B5X3RvX3VzZXIoJmJ1ZltuXSwgJmlycSwgc2l6ZW9mKGlycSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCW4gKz0gc2l6ZW9mKGlycSk7CisJfQorCisJaWYgKHRlc3RfYml0KElSUV9QRU5EX0VYVF9FTUVSR0VOQ1ksICZwZW5kaW5nX2lycXMpKSB7CisJCWZvcl9lYWNoX3NldF9iaXQoY3B1YWRkciwgc2lncF9lbWVyZ19wZW5kaW5nLCBLVk1fTUFYX1ZDUFVTKSB7CisJCQltZW1zZXQoJmlycSwgMCwgc2l6ZW9mKGlycSkpOworCQkJaWYgKG4gKyBzaXplb2YoaXJxKSA+IGxlbikKKwkJCQlyZXR1cm4gLUVOT0JVRlM7CisJCQlpcnEudHlwZSA9IEtWTV9TMzkwX0lOVF9FTUVSR0VOQ1k7CisJCQlpcnEudS5lbWVyZy5jb2RlID0gY3B1YWRkcjsKKwkJCWlmIChjb3B5X3RvX3VzZXIoJmJ1ZltuXSwgJmlycSwgc2l6ZW9mKGlycSkpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJbiArPSBzaXplb2YoaXJxKTsKKwkJfQorCX0KKworCWlmICgoc2lncF9jdHJsICYgU0lHUF9DVFJMX0MpICYmCisJICAgIChhdG9taWNfcmVhZCgmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmNwdWZsYWdzKSAmCisJICAgICBDUFVTVEFUX0VDQUxMX1BFTkQpKSB7CisJCWlmIChuICsgc2l6ZW9mKGlycSkgPiBsZW4pCisJCQlyZXR1cm4gLUVOT0JVRlM7CisJCW1lbXNldCgmaXJxLCAwLCBzaXplb2YoaXJxKSk7CisJCWlycS50eXBlID0gS1ZNX1MzOTBfSU5UX0VYVEVSTkFMX0NBTEw7CisJCWlycS51LmV4dGNhbGwuY29kZSA9IHNpZ3BfY3RybCAmIFNJR1BfQ1RSTF9TQ05fTUFTSzsKKwkJaWYgKGNvcHlfdG9fdXNlcigmYnVmW25dLCAmaXJxLCBzaXplb2YoaXJxKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbiArPSBzaXplb2YoaXJxKTsKKwl9CisKKwlyZXR1cm4gbjsKK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYyBiL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuYwppbmRleCBmNjU3OWNmLi5hZmEyYmQ3IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmMKKysrIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5jCkBAIC0yNSwxMSArMjUsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KICNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CisjaW5jbHVkZSA8YXNtL2lzYy5oPgogI2luY2x1ZGUgPGFzbS9zY2xwLmg+CiAjaW5jbHVkZSAia3ZtLXMzOTAuaCIKICNpbmNsdWRlICJnYWNjZXNzLmgiCkBAIC0zOCw2ICs0MCwxMSBAQAogI2luY2x1ZGUgInRyYWNlLmgiCiAjaW5jbHVkZSAidHJhY2UtczM5MC5oIgogCisjZGVmaW5lIE1FTV9PUF9NQVhfU0laRSA2NTUzNgkvKiBNYXhpbXVtIHRyYW5zZmVyIHNpemUgZm9yIEtWTV9TMzkwX01FTV9PUCAqLworI2RlZmluZSBMT0NBTF9JUlFTIDMyCisjZGVmaW5lIFZDUFVfSVJRU19NQVhfQlVGIChzaXplb2Yoc3RydWN0IGt2bV9zMzkwX2lycSkgKiBcCisJCQkgICAoS1ZNX01BWF9WQ1BVUyArIExPQ0FMX0lSUVMpKQorCiAjZGVmaW5lIFZDUFVfU1RBVCh4KSBvZmZzZXRvZihzdHJ1Y3Qga3ZtX3ZjcHUsIHN0YXQueCksIEtWTV9TVEFUX1ZDUFUKIAogc3RydWN0IGt2bV9zdGF0c19kZWJ1Z2ZzX2l0ZW0gZGVidWdmc19lbnRyaWVzW10gPSB7CkBAIC04Nyw2ICs5NCw3IEBACiAJeyAiaW5zdHJ1Y3Rpb25fc2lncF9zdG9wIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3NpZ3Bfc3RvcCkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zaWdwX3N0b3Bfc3RvcmVfc3RhdHVzIiwgVkNQVV9TVEFUKGluc3RydWN0aW9uX3NpZ3Bfc3RvcF9zdG9yZV9zdGF0dXMpIH0sCiAJeyAiaW5zdHJ1Y3Rpb25fc2lncF9zdG9yZV9zdGF0dXMiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc2lncF9zdG9yZV9zdGF0dXMpIH0sCisJeyAiaW5zdHJ1Y3Rpb25fc2lncF9zdG9yZV9hZHRsX3N0YXR1cyIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9zaWdwX3N0b3JlX2FkdGxfc3RhdHVzKSB9LAogCXsgImluc3RydWN0aW9uX3NpZ3Bfc2V0X2FyY2giLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc2lncF9hcmNoKSB9LAogCXsgImluc3RydWN0aW9uX3NpZ3Bfc2V0X3ByZWZpeCIsIFZDUFVfU1RBVChpbnN0cnVjdGlvbl9zaWdwX3ByZWZpeCkgfSwKIAl7ICJpbnN0cnVjdGlvbl9zaWdwX3Jlc3RhcnQiLCBWQ1BVX1NUQVQoaW5zdHJ1Y3Rpb25fc2lncF9yZXN0YXJ0KSB9LApAQCAtMTAxLDggKzEwOSw4IEBACiAKIC8qIHVwcGVyIGZhY2lsaXRpZXMgbGltaXQgZm9yIGt2bSAqLwogdW5zaWduZWQgbG9uZyBrdm1fczM5MF9mYWNfbGlzdF9tYXNrW10gPSB7Ci0JMHhmZjgyZmZmYmY0ZmMyMDAwVUwsCi0JMHgwMDVjMDAwMDAwMDAwMDAwVUwsCisJMHhmZmU2ZmZmYmZjZmRmYzQwVUwsCisJMHgyMDVjODAwMDAwMDAwMDAwVUwsCiB9OwogCiB1bnNpZ25lZCBsb25nIGt2bV9zMzkwX2ZhY19saXN0X21hc2tfc2l6ZSh2b2lkKQpAQCAtMTY1LDE2ICsxNzMsMjIgQEAKIAljYXNlIEtWTV9DQVBfT05FX1JFRzoKIAljYXNlIEtWTV9DQVBfRU5BQkxFX0NBUDoKIAljYXNlIEtWTV9DQVBfUzM5MF9DU1NfU1VQUE9SVDoKLQljYXNlIEtWTV9DQVBfSVJRRkQ6CiAJY2FzZSBLVk1fQ0FQX0lPRVZFTlRGRDoKIAljYXNlIEtWTV9DQVBfREVWSUNFX0NUUkw6CiAJY2FzZSBLVk1fQ0FQX0VOQUJMRV9DQVBfVk06CiAJY2FzZSBLVk1fQ0FQX1MzOTBfSVJRQ0hJUDoKIAljYXNlIEtWTV9DQVBfVk1fQVRUUklCVVRFUzoKIAljYXNlIEtWTV9DQVBfTVBfU1RBVEU6CisJY2FzZSBLVk1fQ0FQX1MzOTBfSU5KRUNUX0lSUToKIAljYXNlIEtWTV9DQVBfUzM5MF9VU0VSX1NJR1A6CisJY2FzZSBLVk1fQ0FQX1MzOTBfVVNFUl9TVFNJOgorCWNhc2UgS1ZNX0NBUF9TMzkwX1NLRVlTOgorCWNhc2UgS1ZNX0NBUF9TMzkwX0lSUV9TVEFURToKIAkJciA9IDE7CiAJCWJyZWFrOworCWNhc2UgS1ZNX0NBUF9TMzkwX01FTV9PUDoKKwkJciA9IE1FTV9PUF9NQVhfU0laRTsKKwkJYnJlYWs7CiAJY2FzZSBLVk1fQ0FQX05SX1ZDUFVTOgogCWNhc2UgS1ZNX0NBUF9NQVhfVkNQVVM6CiAJCXIgPSBLVk1fTUFYX1ZDUFVTOwpAQCAtMTg1LDYgKzE5OSw5IEBACiAJY2FzZSBLVk1fQ0FQX1MzOTBfQ09XOgogCQlyID0gTUFDSElORV9IQVNfRVNPUDsKIAkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX1MzOTBfVkVDVE9SX1JFR0lTVEVSUzoKKwkJciA9IE1BQ0hJTkVfSEFTX1ZYOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyID0gMDsKIAl9CkBAIC0yNjUsNiArMjgyLDE4IEBACiAJCWt2bS0+YXJjaC51c2VyX3NpZ3AgPSAxOwogCQlyID0gMDsKIAkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX1MzOTBfVkVDVE9SX1JFR0lTVEVSUzoKKwkJaWYgKE1BQ0hJTkVfSEFTX1ZYKSB7CisJCQlzZXRfa3ZtX2ZhY2lsaXR5KGt2bS0+YXJjaC5tb2RlbC5mYWMtPm1hc2ssIDEyOSk7CisJCQlzZXRfa3ZtX2ZhY2lsaXR5KGt2bS0+YXJjaC5tb2RlbC5mYWMtPmxpc3QsIDEyOSk7CisJCQlyID0gMDsKKwkJfSBlbHNlCisJCQlyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBLVk1fQ0FQX1MzOTBfVVNFUl9TVFNJOgorCQlrdm0tPmFyY2gudXNlcl9zdHNpID0gMTsKKwkJciA9IDA7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXIgPSAtRUlOVkFMOwogCQlicmVhazsKQEAgLTcwOSw2ICs3MzgsMTA4IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGxvbmcga3ZtX3MzOTBfZ2V0X3NrZXlzKHN0cnVjdCBrdm0gKmt2bSwgc3RydWN0IGt2bV9zMzkwX3NrZXlzICphcmdzKQoreworCXVpbnQ4X3QgKmtleXM7CisJdWludDY0X3QgaHZhOworCXVuc2lnbmVkIGxvbmcgY3Vya2V5OworCWludCBpLCByID0gMDsKKworCWlmIChhcmdzLT5mbGFncyAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIElzIHRoaXMgZ3Vlc3QgdXNpbmcgc3RvcmFnZSBrZXlzPyAqLworCWlmICghbW1fdXNlX3NrZXkoY3VycmVudC0+bW0pKQorCQlyZXR1cm4gS1ZNX1MzOTBfR0VUX1NLRVlTX05PTkU7CisKKwkvKiBFbmZvcmNlIHNhbmUgbGltaXQgb24gbWVtb3J5IGFsbG9jYXRpb24gKi8KKwlpZiAoYXJncy0+Y291bnQgPCAxIHx8IGFyZ3MtPmNvdW50ID4gS1ZNX1MzOTBfU0tFWVNfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWtleXMgPSBrbWFsbG9jX2FycmF5KGFyZ3MtPmNvdW50LCBzaXplb2YodWludDhfdCksCisJCQkgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pOworCWlmICgha2V5cykKKwkJa2V5cyA9IHZtYWxsb2Moc2l6ZW9mKHVpbnQ4X3QpICogYXJncy0+Y291bnQpOworCWlmICgha2V5cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgYXJncy0+Y291bnQ7IGkrKykgeworCQlodmEgPSBnZm5fdG9faHZhKGt2bSwgYXJncy0+c3RhcnRfZ2ZuICsgaSk7CisJCWlmIChrdm1faXNfZXJyb3JfaHZhKGh2YSkpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQljdXJrZXkgPSBnZXRfZ3Vlc3Rfc3RvcmFnZV9rZXkoY3VycmVudC0+bW0sIGh2YSk7CisJCWlmIChJU19FUlJfVkFMVUUoY3Vya2V5KSkgeworCQkJciA9IGN1cmtleTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWtleXNbaV0gPSBjdXJrZXk7CisJfQorCisJciA9IGNvcHlfdG9fdXNlcigodWludDhfdCBfX3VzZXIgKilhcmdzLT5za2V5ZGF0YV9hZGRyLCBrZXlzLAorCQkJIHNpemVvZih1aW50OF90KSAqIGFyZ3MtPmNvdW50KTsKKwlpZiAocikKKwkJciA9IC1FRkFVTFQ7CitvdXQ6CisJa3ZmcmVlKGtleXMpOworCXJldHVybiByOworfQorCitzdGF0aWMgbG9uZyBrdm1fczM5MF9zZXRfc2tleXMoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX3MzOTBfc2tleXMgKmFyZ3MpCit7CisJdWludDhfdCAqa2V5czsKKwl1aW50NjRfdCBodmE7CisJaW50IGksIHIgPSAwOworCisJaWYgKGFyZ3MtPmZsYWdzICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRW5mb3JjZSBzYW5lIGxpbWl0IG9uIG1lbW9yeSBhbGxvY2F0aW9uICovCisJaWYgKGFyZ3MtPmNvdW50IDwgMSB8fCBhcmdzLT5jb3VudCA+IEtWTV9TMzkwX1NLRVlTX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrZXlzID0ga21hbGxvY19hcnJheShhcmdzLT5jb3VudCwgc2l6ZW9mKHVpbnQ4X3QpLAorCQkJICAgICBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKKwlpZiAoIWtleXMpCisJCWtleXMgPSB2bWFsbG9jKHNpemVvZih1aW50OF90KSAqIGFyZ3MtPmNvdW50KTsKKwlpZiAoIWtleXMpCisJCXJldHVybiAtRU5PTUVNOworCisJciA9IGNvcHlfZnJvbV91c2VyKGtleXMsICh1aW50OF90IF9fdXNlciAqKWFyZ3MtPnNrZXlkYXRhX2FkZHIsCisJCQkgICBzaXplb2YodWludDhfdCkgKiBhcmdzLT5jb3VudCk7CisJaWYgKHIpIHsKKwkJciA9IC1FRkFVTFQ7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEVuYWJsZSBzdG9yYWdlIGtleSBoYW5kbGluZyBmb3IgdGhlIGd1ZXN0ICovCisJczM5MF9lbmFibGVfc2tleSgpOworCisJZm9yIChpID0gMDsgaSA8IGFyZ3MtPmNvdW50OyBpKyspIHsKKwkJaHZhID0gZ2ZuX3RvX2h2YShrdm0sIGFyZ3MtPnN0YXJ0X2dmbiArIGkpOworCQlpZiAoa3ZtX2lzX2Vycm9yX2h2YShodmEpKSB7CisJCQlyID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogTG93ZXN0IG9yZGVyIGJpdCBpcyByZXNlcnZlZCAqLworCQlpZiAoa2V5c1tpXSAmIDB4MDEpIHsKKwkJCXIgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKworCQlyID0gc2V0X2d1ZXN0X3N0b3JhZ2Vfa2V5KGN1cnJlbnQtPm1tLCBodmEsCisJCQkJCSAgKHVuc2lnbmVkIGxvbmcpa2V5c1tpXSwgMCk7CisJCWlmIChyKQorCQkJZ290byBvdXQ7CisJfQorb3V0OgorCWt2ZnJlZShrZXlzKTsKKwlyZXR1cm4gcjsKK30KKwogbG9uZyBrdm1fYXJjaF92bV9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlscCwKIAkJICAgICAgIHVuc2lnbmVkIGludCBpb2N0bCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC03NjgsNiArODk5LDI2IEBACiAJCXIgPSBrdm1fczM5MF92bV9oYXNfYXR0cihrdm0sICZhdHRyKTsKIAkJYnJlYWs7CiAJfQorCWNhc2UgS1ZNX1MzOTBfR0VUX1NLRVlTOiB7CisJCXN0cnVjdCBrdm1fczM5MF9za2V5cyBhcmdzOworCisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmFyZ3MsIGFyZ3AsCisJCQkJICAgc2l6ZW9mKHN0cnVjdCBrdm1fczM5MF9za2V5cykpKQorCQkJYnJlYWs7CisJCXIgPSBrdm1fczM5MF9nZXRfc2tleXMoa3ZtLCAmYXJncyk7CisJCWJyZWFrOworCX0KKwljYXNlIEtWTV9TMzkwX1NFVF9TS0VZUzogeworCQlzdHJ1Y3Qga3ZtX3MzOTBfc2tleXMgYXJnczsKKworCQlyID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZhcmdzLCBhcmdwLAorCQkJCSAgIHNpemVvZihzdHJ1Y3Qga3ZtX3MzOTBfc2tleXMpKSkKKwkJCWJyZWFrOworCQlyID0ga3ZtX3MzOTBfc2V0X3NrZXlzKGt2bSwgJmFyZ3MpOworCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJciA9IC1FTk9UVFk7CiAJfQpAQCAtODg4LDcgKzEwMzksNyBAQAogCiAJa3ZtLT5hcmNoLmRiZiA9IGRlYnVnX3JlZ2lzdGVyKGRlYnVnX25hbWUsIDgsIDIsIDggKiBzaXplb2YobG9uZykpOwogCWlmICgha3ZtLT5hcmNoLmRiZikKLQkJZ290byBvdXRfbm9kYmY7CisJCWdvdG8gb3V0X2VycjsKIAogCS8qCiAJICogVGhlIGFyY2hpdGVjdHVyYWwgbWF4aW11bSBhbW91bnQgb2YgZmFjaWxpdGllcyBpcyAxNiBrYml0LiBUbyBzdG9yZQpAQCAtOTAwLDcgKzEwNTEsNyBAQAogCWt2bS0+YXJjaC5tb2RlbC5mYWMgPQogCQkoc3RydWN0IGt2bV9zMzkwX2ZhYyAqKSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwogCWlmICgha3ZtLT5hcmNoLm1vZGVsLmZhYykKLQkJZ290byBvdXRfbm9mYWM7CisJCWdvdG8gb3V0X2VycjsKIAogCS8qIFBvcHVsYXRlIHRoZSBmYWNpbGl0eSBtYXNrIGluaXRpYWxseS4gKi8KIAltZW1jcHkoa3ZtLT5hcmNoLm1vZGVsLmZhYy0+bWFzaywgUzM5MF9sb3djb3JlLnN0ZmxlX2ZhY19saXN0LApAQCAtOTIwLDEwICsxMDcxLDExIEBACiAJa3ZtLT5hcmNoLm1vZGVsLmliYyA9IHNjbHBfZ2V0X2liYygpICYgMHgwZmZmOwogCiAJaWYgKGt2bV9zMzkwX2NyeXB0b19pbml0KGt2bSkgPCAwKQotCQlnb3RvIG91dF9jcnlwdG87CisJCWdvdG8gb3V0X2VycjsKIAogCXNwaW5fbG9ja19pbml0KCZrdm0tPmFyY2guZmxvYXRfaW50LmxvY2spOwotCUlOSVRfTElTVF9IRUFEKCZrdm0tPmFyY2guZmxvYXRfaW50Lmxpc3QpOworCWZvciAoaSA9IDA7IGkgPCBGSVJRX0xJU1RfQ09VTlQ7IGkrKykKKwkJSU5JVF9MSVNUX0hFQUQoJmt2bS0+YXJjaC5mbG9hdF9pbnQubGlzdHNbaV0pOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmt2bS0+YXJjaC5pcHRlX3dxKTsKIAltdXRleF9pbml0KCZrdm0tPmFyY2guaXB0ZV9tdXRleCk7CiAKQEAgLTkzNSw3ICsxMDg3LDcgQEAKIAl9IGVsc2UgewogCQlrdm0tPmFyY2guZ21hcCA9IGdtYXBfYWxsb2MoY3VycmVudC0+bW0sICgxVUwgPDwgNDQpIC0gMSk7CiAJCWlmICgha3ZtLT5hcmNoLmdtYXApCi0JCQlnb3RvIG91dF9ub2dtYXA7CisJCQlnb3RvIG91dF9lcnI7CiAJCWt2bS0+YXJjaC5nbWFwLT5wcml2YXRlID0ga3ZtOwogCQlrdm0tPmFyY2guZ21hcC0+cGZhdWx0X2VuYWJsZWQgPSAwOwogCX0KQEAgLTk0NywxNSArMTA5OSwxMSBAQAogCXNwaW5fbG9ja19pbml0KCZrdm0tPmFyY2guc3RhcnRfc3RvcF9sb2NrKTsKIAogCXJldHVybiAwOwotb3V0X25vZ21hcDoKLQlrZnJlZShrdm0tPmFyY2guY3J5cHRvLmNyeWNiKTsKLW91dF9jcnlwdG86Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWt2bS0+YXJjaC5tb2RlbC5mYWMpOwotb3V0X25vZmFjOgotCWRlYnVnX3VucmVnaXN0ZXIoa3ZtLT5hcmNoLmRiZik7Ci1vdXRfbm9kYmY6Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKShrdm0tPmFyY2guc2NhKSk7CiBvdXRfZXJyOgorCWtmcmVlKGt2bS0+YXJjaC5jcnlwdG8uY3J5Y2IpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylrdm0tPmFyY2gubW9kZWwuZmFjKTsKKwlkZWJ1Z191bnJlZ2lzdGVyKGt2bS0+YXJjaC5kYmYpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykoa3ZtLT5hcmNoLnNjYSkpOwogCXJldHVybiByYzsKIH0KIApAQCAtMTAzNSw2ICsxMTgzLDggQEAKIAkJCQkgICAgS1ZNX1NZTkNfQ1JTIHwKIAkJCQkgICAgS1ZNX1NZTkNfQVJDSDAgfAogCQkJCSAgICBLVk1fU1lOQ19QRkFVTFQ7CisJaWYgKHRlc3Rfa3ZtX2ZhY2lsaXR5KHZjcHUtPmt2bSwgMTI5KSkKKwkJdmNwdS0+cnVuLT5rdm1fdmFsaWRfcmVncyB8PSBLVk1fU1lOQ19WUlM7CiAKIAlpZiAoa3ZtX2lzX3Vjb250cm9sKHZjcHUtPmt2bSkpCiAJCXJldHVybiBfX2t2bV91Y29udHJvbF92Y3B1X2luaXQodmNwdSk7CkBAIC0xMDQ1LDEwICsxMTk1LDE4IEBACiB2b2lkIGt2bV9hcmNoX3ZjcHVfbG9hZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBjcHUpCiB7CiAJc2F2ZV9mcF9jdGwoJnZjcHUtPmFyY2guaG9zdF9mcHJlZ3MuZnBjKTsKLQlzYXZlX2ZwX3JlZ3ModmNwdS0+YXJjaC5ob3N0X2ZwcmVncy5mcHJzKTsKKwlpZiAodGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCAxMjkpKQorCQlzYXZlX3Z4X3JlZ3MoKF9fdmVjdG9yMTI4ICopJnZjcHUtPmFyY2guaG9zdF92cmVncy0+dnJzKTsKKwllbHNlCisJCXNhdmVfZnBfcmVncyh2Y3B1LT5hcmNoLmhvc3RfZnByZWdzLmZwcnMpOwogCXNhdmVfYWNjZXNzX3JlZ3ModmNwdS0+YXJjaC5ob3N0X2FjcnMpOwotCXJlc3RvcmVfZnBfY3RsKCZ2Y3B1LT5hcmNoLmd1ZXN0X2ZwcmVncy5mcGMpOwotCXJlc3RvcmVfZnBfcmVncyh2Y3B1LT5hcmNoLmd1ZXN0X2ZwcmVncy5mcHJzKTsKKwlpZiAodGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCAxMjkpKSB7CisJCXJlc3RvcmVfZnBfY3RsKCZ2Y3B1LT5ydW4tPnMucmVncy5mcGMpOworCQlyZXN0b3JlX3Z4X3JlZ3MoKF9fdmVjdG9yMTI4ICopJnZjcHUtPnJ1bi0+cy5yZWdzLnZycyk7CisJfSBlbHNlIHsKKwkJcmVzdG9yZV9mcF9jdGwoJnZjcHUtPmFyY2guZ3Vlc3RfZnByZWdzLmZwYyk7CisJCXJlc3RvcmVfZnBfcmVncyh2Y3B1LT5hcmNoLmd1ZXN0X2ZwcmVncy5mcHJzKTsKKwl9CiAJcmVzdG9yZV9hY2Nlc3NfcmVncyh2Y3B1LT5ydW4tPnMucmVncy5hY3JzKTsKIAlnbWFwX2VuYWJsZSh2Y3B1LT5hcmNoLmdtYXApOwogCWF0b21pY19zZXRfbWFzayhDUFVTVEFUX1JVTk5JTkcsICZ2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Y3B1ZmxhZ3MpOwpAQCAtMTA1OCwxMSArMTIxNiwxOSBAQAogewogCWF0b21pY19jbGVhcl9tYXNrKENQVVNUQVRfUlVOTklORywgJnZjcHUtPmFyY2guc2llX2Jsb2NrLT5jcHVmbGFncyk7CiAJZ21hcF9kaXNhYmxlKHZjcHUtPmFyY2guZ21hcCk7Ci0Jc2F2ZV9mcF9jdGwoJnZjcHUtPmFyY2guZ3Vlc3RfZnByZWdzLmZwYyk7Ci0Jc2F2ZV9mcF9yZWdzKHZjcHUtPmFyY2guZ3Vlc3RfZnByZWdzLmZwcnMpOworCWlmICh0ZXN0X2t2bV9mYWNpbGl0eSh2Y3B1LT5rdm0sIDEyOSkpIHsKKwkJc2F2ZV9mcF9jdGwoJnZjcHUtPnJ1bi0+cy5yZWdzLmZwYyk7CisJCXNhdmVfdnhfcmVncygoX192ZWN0b3IxMjggKikmdmNwdS0+cnVuLT5zLnJlZ3MudnJzKTsKKwl9IGVsc2UgeworCQlzYXZlX2ZwX2N0bCgmdmNwdS0+YXJjaC5ndWVzdF9mcHJlZ3MuZnBjKTsKKwkJc2F2ZV9mcF9yZWdzKHZjcHUtPmFyY2guZ3Vlc3RfZnByZWdzLmZwcnMpOworCX0KIAlzYXZlX2FjY2Vzc19yZWdzKHZjcHUtPnJ1bi0+cy5yZWdzLmFjcnMpOwogCXJlc3RvcmVfZnBfY3RsKCZ2Y3B1LT5hcmNoLmhvc3RfZnByZWdzLmZwYyk7Ci0JcmVzdG9yZV9mcF9yZWdzKHZjcHUtPmFyY2guaG9zdF9mcHJlZ3MuZnBycyk7CisJaWYgKHRlc3Rfa3ZtX2ZhY2lsaXR5KHZjcHUtPmt2bSwgMTI5KSkKKwkJcmVzdG9yZV92eF9yZWdzKChfX3ZlY3RvcjEyOCAqKSZ2Y3B1LT5hcmNoLmhvc3RfdnJlZ3MtPnZycyk7CisJZWxzZQorCQlyZXN0b3JlX2ZwX3JlZ3ModmNwdS0+YXJjaC5ob3N0X2ZwcmVncy5mcHJzKTsKIAlyZXN0b3JlX2FjY2Vzc19yZWdzKHZjcHUtPmFyY2guaG9zdF9hY3JzKTsKIH0KIApAQCAtMTEzMCw2ICsxMjk2LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGt2bV9zMzkwX3ZjcHVfc2V0dXBfbW9kZWwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCBrdm1fczM5MF9jcHVfbW9kZWwgKm1vZGVsID0gJnZjcHUtPmt2bS0+YXJjaC5tb2RlbDsKKworCXZjcHUtPmFyY2guY3B1X2lkID0gbW9kZWwtPmNwdV9pZDsKKwl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aWJjID0gbW9kZWwtPmliYzsKKwl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZmFjID0gKGludCkgKGxvbmcpIG1vZGVsLT5mYWMtPmxpc3Q7Cit9CisKIGludCBrdm1fYXJjaF92Y3B1X3NldHVwKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlpbnQgcmMgPSAwOwpAQCAtMTEzOCw2ICsxMzEzLDggQEAKIAkJCQkJCSAgICBDUFVTVEFUX1NNIHwKIAkJCQkJCSAgICBDUFVTVEFUX1NUT1BQRUQgfAogCQkJCQkJICAgIENQVVNUQVRfR0VEKTsKKwlrdm1fczM5MF92Y3B1X3NldHVwX21vZGVsKHZjcHUpOworCiAJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjYiAgID0gNjsKIAlpZiAodGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCA1MCkgJiYgdGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCA3MykpCiAJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5lY2IgfD0gMHgxMDsKQEAgLTExNDgsOCArMTMyNSwxMSBAQAogCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNhIHw9IDE7CiAJaWYgKHNjbHBfaGFzX3NpZ3BpZigpKQogCQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+ZWNhIHw9IDB4MTAwMDAwMDBVOwotCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5pY3RsIHw9IElDVExfSVNLRSB8IElDVExfU1NLRSB8IElDVExfUlJCRSB8Ci0JCQkJICAgICAgSUNUTF9UUFJPVDsKKwlpZiAodGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCAxMjkpKSB7CisJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5lY2EgfD0gMHgwMDAyMDAwMDsKKwkJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmVjZCB8PSAweDIwMDAwMDAwOworCX0KKwl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aWN0bCB8PSBJQ1RMX0lTS0UgfCBJQ1RMX1NTS0UgfCBJQ1RMX1JSQkU7CiAKIAlpZiAoa3ZtX3MzOTBfY21tYV9lbmFibGVkKHZjcHUtPmt2bSkpIHsKIAkJcmMgPSBrdm1fczM5MF92Y3B1X3NldHVwX2NtbWEodmNwdSk7CkBAIC0xMTU5LDExICsxMzM5LDYgQEAKIAlocnRpbWVyX2luaXQoJnZjcHUtPmFyY2guY2tjX3RpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwogCXZjcHUtPmFyY2guY2tjX3RpbWVyLmZ1bmN0aW9uID0ga3ZtX3MzOTBfaWRsZV93YWtldXA7CiAKLQltdXRleF9sb2NrKCZ2Y3B1LT5rdm0tPmxvY2spOwotCXZjcHUtPmFyY2guY3B1X2lkID0gdmNwdS0+a3ZtLT5hcmNoLm1vZGVsLmNwdV9pZDsKLQl2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aWJjID0gdmNwdS0+a3ZtLT5hcmNoLm1vZGVsLmliYzsKLQltdXRleF91bmxvY2soJnZjcHUtPmt2bS0+bG9jayk7Ci0KIAlrdm1fczM5MF92Y3B1X2NyeXB0b19zZXR1cCh2Y3B1KTsKIAogCXJldHVybiByYzsKQEAgLTExOTEsNiArMTM2Niw3IEBACiAKIAl2Y3B1LT5hcmNoLnNpZV9ibG9jayA9ICZzaWVfcGFnZS0+c2llX2Jsb2NrOwogCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5pdGRiYSA9ICh1bnNpZ25lZCBsb25nKSAmc2llX3BhZ2UtPml0ZGI7CisJdmNwdS0+YXJjaC5ob3N0X3ZyZWdzID0gJnNpZV9wYWdlLT52cmVnczsKIAogCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5pY3B1YSA9IGlkOwogCWlmICgha3ZtX2lzX3Vjb250cm9sKGt2bSkpIHsKQEAgLTEyMDYsNyArMTM4Miw2IEBACiAJCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5zY2FvbCA9IChfX3UzMikoX191NjQpa3ZtLT5hcmNoLnNjYTsKIAkJc2V0X2JpdCg2MyAtIGlkLCAodW5zaWduZWQgbG9uZyAqKSAma3ZtLT5hcmNoLnNjYS0+bWNuKTsKIAl9Ci0JdmNwdS0+YXJjaC5zaWVfYmxvY2stPmZhYyA9IChpbnQpIChsb25nKSBrdm0tPmFyY2gubW9kZWwuZmFjLT5saXN0OwogCiAJc3Bpbl9sb2NrX2luaXQoJnZjcHUtPmFyY2gubG9jYWxfaW50LmxvY2spOwogCXZjcHUtPmFyY2gubG9jYWxfaW50LmZsb2F0X2ludCA9ICZrdm0tPmFyY2guZmxvYXRfaW50OwpAQCAtMTcyNiw2ICsxOTAxLDMxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdmNwdV9wb3N0X3J1bl9mYXVsdF9pbl9zaWUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXBzd190ICpwc3cgPSAmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3c7CisJdTggb3Bjb2RlOworCWludCByYzsKKworCVZDUFVfRVZFTlQodmNwdSwgMywgIiVzIiwgImZhdWx0IGluIHNpZSBpbnN0cnVjdGlvbiIpOworCXRyYWNlX2t2bV9zMzkwX3NpZV9mYXVsdCh2Y3B1KTsKKworCS8qCisJICogV2Ugd2FudCB0byBpbmplY3QgYW4gYWRkcmVzc2luZyBleGNlcHRpb24sIHdoaWNoIGlzIGRlZmluZWQgYXMgYQorCSAqIHN1cHByZXNzaW5nIG9yIHRlcm1pbmF0aW5nIGV4Y2VwdGlvbi4gSG93ZXZlciwgc2luY2Ugd2UgY2FtZSBoZXJlCisJICogYnkgYSBEQVQgYWNjZXNzIGV4Y2VwdGlvbiwgdGhlIFBTVyBzdGlsbCBwb2ludHMgdG8gdGhlIGZhdWx0aW5nCisJICogaW5zdHJ1Y3Rpb24gc2luY2UgREFUIGV4Y2VwdGlvbnMgYXJlIG51bGxpZnlpbmcuIFNvIHdlJ3ZlIGdvdAorCSAqIHRvIGxvb2sgdXAgdGhlIGN1cnJlbnQgb3Bjb2RlIHRvIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBpbnN0cnVjdGlvbgorCSAqIHRvIGJlIGFibGUgdG8gZm9yd2FyZCB0aGUgUFNXLgorCSAqLworCXJjID0gcmVhZF9ndWVzdCh2Y3B1LCBwc3ctPmFkZHIsIDAsICZvcGNvZGUsIDEpOworCWlmIChyYykKKwkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9nX2NvbmQodmNwdSwgcmMpOworCXBzdy0+YWRkciA9IF9fcmV3aW5kX3BzdygqcHN3LCAtaW5zbl9sZW5ndGgob3Bjb2RlKSk7CisKKwlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9BRERSRVNTSU5HKTsKK30KKwogc3RhdGljIGludCB2Y3B1X3Bvc3RfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGV4aXRfcmVhc29uKQogewogCWludCByYyA9IC0xOwpAQCAtMTc1NywxMSArMTk1Nyw4IEBACiAJCX0KIAl9CiAKLQlpZiAocmMgPT0gLTEpIHsKLQkJVkNQVV9FVkVOVCh2Y3B1LCAzLCAiJXMiLCAiZmF1bHQgaW4gc2llIGluc3RydWN0aW9uIik7Ci0JCXRyYWNlX2t2bV9zMzkwX3NpZV9mYXVsdCh2Y3B1KTsKLQkJcmMgPSBrdm1fczM5MF9pbmplY3RfcHJvZ3JhbV9pbnQodmNwdSwgUEdNX0FERFJFU1NJTkcpOwotCX0KKwlpZiAocmMgPT0gLTEpCisJCXJjID0gdmNwdV9wb3N0X3J1bl9mYXVsdF9pbl9zaWUodmNwdSk7CiAKIAltZW1jcHkoJnZjcHUtPnJ1bi0+cy5yZWdzLmdwcnNbMTRdLCAmdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdnMTQsIDE2KTsKIApAQCAtMTk3Nyw2ICsyMTc0LDM1IEBACiAJcmV0dXJuIGt2bV9zMzkwX3N0b3JlX3N0YXR1c191bmxvYWRlZCh2Y3B1LCBhZGRyKTsKIH0KIAorLyoKKyAqIHN0b3JlIGFkZGl0aW9uYWwgc3RhdHVzIGF0IGFkZHJlc3MKKyAqLworaW50IGt2bV9zMzkwX3N0b3JlX2FkdGxfc3RhdHVzX3VubG9hZGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkJdW5zaWduZWQgbG9uZyBncGEpCit7CisJLyogT25seSBiaXRzIDAtNTMgYXJlIHVzZWQgZm9yIGFkZHJlc3MgZm9ybWF0aW9uICovCisJaWYgKCEoZ3BhICYgfjB4M2ZmKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gd3JpdGVfZ3Vlc3RfYWJzKHZjcHUsIGdwYSAmIH4weDNmZiwKKwkJCSAgICAgICAodm9pZCAqKSZ2Y3B1LT5ydW4tPnMucmVncy52cnMsIDUxMik7Cit9CisKK2ludCBrdm1fczM5MF92Y3B1X3N0b3JlX2FkdGxfc3RhdHVzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdW5zaWduZWQgbG9uZyBhZGRyKQoreworCWlmICghdGVzdF9rdm1fZmFjaWxpdHkodmNwdS0+a3ZtLCAxMjkpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVGhlIGd1ZXN0IFZYUlMgYXJlIGluIHRoZSBob3N0IFZYUnMgZHVlIHRvIHRoZSBsYXp5CisJICogY29weWluZyBpbiB2Y3B1IGxvYWQvcHV0LiBMZXQncyB1cGRhdGUgb3VyIGNvcGllcyBiZWZvcmUgd2Ugc2F2ZQorCSAqIGl0IGludG8gdGhlIHNhdmUgYXJlYS4KKwkgKi8KKwlzYXZlX3Z4X3JlZ3MoKF9fdmVjdG9yMTI4ICopJnZjcHUtPnJ1bi0+cy5yZWdzLnZycyk7CisKKwlyZXR1cm4ga3ZtX3MzOTBfc3RvcmVfYWR0bF9zdGF0dXNfdW5sb2FkZWQodmNwdSwgYWRkcik7Cit9CisKIHN0YXRpYyB2b2lkIF9fZGlzYWJsZV9pYnNfb25fdmNwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJa3ZtX2NoZWNrX3JlcXVlc3QoS1ZNX1JFUV9FTkFCTEVfSUJTLCB2Y3B1KTsKQEAgLTIxMDEsNiArMjMyNyw2NSBAQAogCXJldHVybiByOwogfQogCitzdGF0aWMgbG9uZyBrdm1fczM5MF9ndWVzdF9tZW1fb3Aoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgc3RydWN0IGt2bV9zMzkwX21lbV9vcCAqbW9wKQoreworCXZvaWQgX191c2VyICp1YWRkciA9ICh2b2lkIF9fdXNlciAqKW1vcC0+YnVmOworCXZvaWQgKnRtcGJ1ZiA9IE5VTEw7CisJaW50IHIsIHNyY3VfaWR4OworCWNvbnN0IHU2NCBzdXBwb3J0ZWRfZmxhZ3MgPSBLVk1fUzM5MF9NRU1PUF9GX0lOSkVDVF9FWENFUFRJT04KKwkJCQkgICAgfCBLVk1fUzM5MF9NRU1PUF9GX0NIRUNLX09OTFk7CisKKwlpZiAobW9wLT5mbGFncyAmIH5zdXBwb3J0ZWRfZmxhZ3MpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKG1vcC0+c2l6ZSA+IE1FTV9PUF9NQVhfU0laRSkKKwkJcmV0dXJuIC1FMkJJRzsKKworCWlmICghKG1vcC0+ZmxhZ3MgJiBLVk1fUzM5MF9NRU1PUF9GX0NIRUNLX09OTFkpKSB7CisJCXRtcGJ1ZiA9IHZtYWxsb2MobW9wLT5zaXplKTsKKwkJaWYgKCF0bXBidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcmN1X2lkeCA9IHNyY3VfcmVhZF9sb2NrKCZ2Y3B1LT5rdm0tPnNyY3UpOworCisJc3dpdGNoIChtb3AtPm9wKSB7CisJY2FzZSBLVk1fUzM5MF9NRU1PUF9MT0dJQ0FMX1JFQUQ6CisJCWlmIChtb3AtPmZsYWdzICYgS1ZNX1MzOTBfTUVNT1BfRl9DSEVDS19PTkxZKSB7CisJCQlyID0gY2hlY2tfZ3ZhX3JhbmdlKHZjcHUsIG1vcC0+Z2FkZHIsIG1vcC0+YXIsIG1vcC0+c2l6ZSwgZmFsc2UpOworCQkJYnJlYWs7CisJCX0KKwkJciA9IHJlYWRfZ3Vlc3QodmNwdSwgbW9wLT5nYWRkciwgbW9wLT5hciwgdG1wYnVmLCBtb3AtPnNpemUpOworCQlpZiAociA9PSAwKSB7CisJCQlpZiAoY29weV90b191c2VyKHVhZGRyLCB0bXBidWYsIG1vcC0+c2l6ZSkpCisJCQkJciA9IC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBLVk1fUzM5MF9NRU1PUF9MT0dJQ0FMX1dSSVRFOgorCQlpZiAobW9wLT5mbGFncyAmIEtWTV9TMzkwX01FTU9QX0ZfQ0hFQ0tfT05MWSkgeworCQkJciA9IGNoZWNrX2d2YV9yYW5nZSh2Y3B1LCBtb3AtPmdhZGRyLCBtb3AtPmFyLCBtb3AtPnNpemUsIHRydWUpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKHRtcGJ1ZiwgdWFkZHIsIG1vcC0+c2l6ZSkpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJciA9IHdyaXRlX2d1ZXN0KHZjcHUsIG1vcC0+Z2FkZHIsIG1vcC0+YXIsIHRtcGJ1ZiwgbW9wLT5zaXplKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJciA9IC1FSU5WQUw7CisJfQorCisJc3JjdV9yZWFkX3VubG9jaygmdmNwdS0+a3ZtLT5zcmN1LCBzcmN1X2lkeCk7CisKKwlpZiAociA+IDAgJiYgKG1vcC0+ZmxhZ3MgJiBLVk1fUzM5MF9NRU1PUF9GX0lOSkVDVF9FWENFUFRJT04pICE9IDApCisJCWt2bV9zMzkwX2luamVjdF9wcm9nX2lycSh2Y3B1LCAmdmNwdS0+YXJjaC5wZ20pOworCisJdmZyZWUodG1wYnVmKTsKKwlyZXR1cm4gcjsKK30KKwogbG9uZyBrdm1fYXJjaF92Y3B1X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLAogCQkJIHVuc2lnbmVkIGludCBpb2N0bCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC0yMTEwLDYgKzIzOTUsMTUgQEAKIAlsb25nIHI7CiAKIAlzd2l0Y2ggKGlvY3RsKSB7CisJY2FzZSBLVk1fUzM5MF9JUlE6IHsKKwkJc3RydWN0IGt2bV9zMzkwX2lycSBzMzkwaXJxOworCisJCXIgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJnMzOTBpcnEsIGFyZ3AsIHNpemVvZihzMzkwaXJxKSkpCisJCQlicmVhazsKKwkJciA9IGt2bV9zMzkwX2luamVjdF92Y3B1KHZjcHUsICZzMzkwaXJxKTsKKwkJYnJlYWs7CisJfQogCWNhc2UgS1ZNX1MzOTBfSU5URVJSVVBUOiB7CiAJCXN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHQgczM5MGludDsKIAkJc3RydWN0IGt2bV9zMzkwX2lycSBzMzkwaXJxOwpAQCAtMjIwMCw2ICsyNDk0LDQ3IEBACiAJCXIgPSBrdm1fdmNwdV9pb2N0bF9lbmFibGVfY2FwKHZjcHUsICZjYXApOwogCQlicmVhazsKIAl9CisJY2FzZSBLVk1fUzM5MF9NRU1fT1A6IHsKKwkJc3RydWN0IGt2bV9zMzkwX21lbV9vcCBtZW1fb3A7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtZW1fb3AsIGFyZ3AsIHNpemVvZihtZW1fb3ApKSA9PSAwKQorCQkJciA9IGt2bV9zMzkwX2d1ZXN0X21lbV9vcCh2Y3B1LCAmbWVtX29wKTsKKwkJZWxzZQorCQkJciA9IC1FRkFVTFQ7CisJCWJyZWFrOworCX0KKwljYXNlIEtWTV9TMzkwX1NFVF9JUlFfU1RBVEU6IHsKKwkJc3RydWN0IGt2bV9zMzkwX2lycV9zdGF0ZSBpcnFfc3RhdGU7CisKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaXJxX3N0YXRlLCBhcmdwLCBzaXplb2YoaXJxX3N0YXRlKSkpCisJCQlicmVhazsKKwkJaWYgKGlycV9zdGF0ZS5sZW4gPiBWQ1BVX0lSUVNfTUFYX0JVRiB8fAorCQkgICAgaXJxX3N0YXRlLmxlbiA9PSAwIHx8CisJCSAgICBpcnFfc3RhdGUubGVuICUgc2l6ZW9mKHN0cnVjdCBrdm1fczM5MF9pcnEpID4gMCkgeworCQkJciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlyID0ga3ZtX3MzOTBfc2V0X2lycV9zdGF0ZSh2Y3B1LAorCQkJCQkgICAodm9pZCBfX3VzZXIgKikgaXJxX3N0YXRlLmJ1ZiwKKwkJCQkJICAgaXJxX3N0YXRlLmxlbik7CisJCWJyZWFrOworCX0KKwljYXNlIEtWTV9TMzkwX0dFVF9JUlFfU1RBVEU6IHsKKwkJc3RydWN0IGt2bV9zMzkwX2lycV9zdGF0ZSBpcnFfc3RhdGU7CisKKwkJciA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaXJxX3N0YXRlLCBhcmdwLCBzaXplb2YoaXJxX3N0YXRlKSkpCisJCQlicmVhazsKKwkJaWYgKGlycV9zdGF0ZS5sZW4gPT0gMCkgeworCQkJciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlyID0ga3ZtX3MzOTBfZ2V0X2lycV9zdGF0ZSh2Y3B1LAorCQkJCQkgICAoX191OCBfX3VzZXIgKikgIGlycV9zdGF0ZS5idWYsCisJCQkJCSAgIGlycV9zdGF0ZS5sZW4pOworCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJciA9IC1FTk9UVFk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oIGIvYXJjaC9zMzkwL2t2bS9rdm0tczM5MC5oCmluZGV4IGMzNDEwOWEuLmNhMTA4YjkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0va3ZtLXMzOTAuaAorKysgYi9hcmNoL3MzOTAva3ZtL2t2bS1zMzkwLmgKQEAgLTcwLDE2ICs3MCwyMiBAQAogCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9NTVVfUkVMT0FELCB2Y3B1KTsKIH0KIAotc3RhdGljIGlubGluZSB1NjQga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9zKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3R5cGVkZWYgdTggX19iaXR3aXNlIGFyX3Q7CisKK3N0YXRpYyBpbmxpbmUgdTY0IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3BfcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGFyX3QgKmFyKQogewogCXUzMiBiYXNlMiA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5pcGIgPj4gMjg7CiAJdTMyIGRpc3AyID0gKCh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBiICYgMHgwZmZmMDAwMCkgPj4gMTYpOwogCisJaWYgKGFyKQorCQkqYXIgPSBiYXNlMjsKKwogCXJldHVybiAoYmFzZTIgPyB2Y3B1LT5ydW4tPnMucmVncy5ncHJzW2Jhc2UyXSA6IDApICsgZGlzcDI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3NzZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJCSAgICAgIHU2NCAqYWRkcmVzczEsIHU2NCAqYWRkcmVzczIpCisJCQkJCSAgICAgIHU2NCAqYWRkcmVzczEsIHU2NCAqYWRkcmVzczIsCisJCQkJCSAgICAgIGFyX3QgKmFyX2IxLCBhcl90ICphcl9iMikKIHsKIAl1MzIgYmFzZTEgPSAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmlwYiAmIDB4ZjAwMDAwMDApID4+IDI4OwogCXUzMiBkaXNwMSA9ICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBiICYgMHgwZmZmMDAwMCkgPj4gMTY7CkBAIC04OCw2ICs5NCwxMSBAQAogCiAJKmFkZHJlc3MxID0gKGJhc2UxID8gdmNwdS0+cnVuLT5zLnJlZ3MuZ3Byc1tiYXNlMV0gOiAwKSArIGRpc3AxOwogCSphZGRyZXNzMiA9IChiYXNlMiA/IHZjcHUtPnJ1bi0+cy5yZWdzLmdwcnNbYmFzZTJdIDogMCkgKyBkaXNwMjsKKworCWlmIChhcl9iMSkKKwkJKmFyX2IxID0gYmFzZTE7CisJaWYgKGFyX2IyKQorCQkqYXJfYjIgPSBiYXNlMjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGt2bV9zMzkwX2dldF9yZWdzX3JyZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCAqcjEsIGludCAqcjIpCkBAIC05OCw3ICsxMDksNyBAQAogCQkqcjIgPSAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmlwYiAmIDB4MDAwZjAwMDApID4+IDE2OwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3JzeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitzdGF0aWMgaW5saW5lIHU2NCBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3JzeShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGFyX3QgKmFyKQogewogCXUzMiBiYXNlMiA9IHZjcHUtPmFyY2guc2llX2Jsb2NrLT5pcGIgPj4gMjg7CiAJdTMyIGRpc3AyID0gKCh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBiICYgMHgwZmZmMDAwMCkgPj4gMTYpICsKQEAgLTEwNywxNCArMTE4LDIwIEBACiAJaWYgKGRpc3AyICYgMHg4MDAwMCkKIAkJZGlzcDIrPTB4ZmZmMDAwMDA7CiAKKwlpZiAoYXIpCisJCSphciA9IGJhc2UyOworCiAJcmV0dXJuIChiYXNlMiA/IHZjcHUtPnJ1bi0+cy5yZWdzLmdwcnNbYmFzZTJdIDogMCkgKyAobG9uZykoaW50KWRpc3AyOwogfQogCi1zdGF0aWMgaW5saW5lIHU2NCBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3JzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3N0YXRpYyBpbmxpbmUgdTY0IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3BfcnMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBhcl90ICphcikKIHsKIAl1MzIgYmFzZTIgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBiID4+IDI4OwogCXUzMiBkaXNwMiA9ICgodmNwdS0+YXJjaC5zaWVfYmxvY2stPmlwYiAmIDB4MGZmZjAwMDApID4+IDE2KTsKIAorCWlmIChhcikKKwkJKmFyID0gYmFzZTI7CisKIAlyZXR1cm4gKGJhc2UyID8gdmNwdS0+cnVuLT5zLnJlZ3MuZ3Byc1tiYXNlMl0gOiAwKSArIGRpc3AyOwogfQogCkBAIC0xMjUsMTMgKzE0MiwyNCBAQAogCXZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3Lm1hc2sgfD0gY2MgPDwgNDQ7CiB9CiAKLS8qIHRlc3QgYXZhaWxhYmlsaXR5IG9mIGZhY2lsaXR5IGluIGEga3ZtIGludGFuY2UgKi8KKy8qIHRlc3QgYXZhaWxhYmlsaXR5IG9mIGZhY2lsaXR5IGluIGEga3ZtIGluc3RhbmNlICovCiBzdGF0aWMgaW5saW5lIGludCB0ZXN0X2t2bV9mYWNpbGl0eShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgbnIpCiB7CiAJcmV0dXJuIF9fdGVzdF9mYWNpbGl0eShuciwga3ZtLT5hcmNoLm1vZGVsLmZhYy0+bWFzaykgJiYKIAkJX190ZXN0X2ZhY2lsaXR5KG5yLCBrdm0tPmFyY2gubW9kZWwuZmFjLT5saXN0KTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgc2V0X2t2bV9mYWNpbGl0eSh1NjQgKmZhY19saXN0LCB1bnNpZ25lZCBsb25nIG5yKQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCWlmIChuciA+PSBNQVhfRkFDSUxJVFlfQklUKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwdHIgPSAodW5zaWduZWQgY2hhciAqKSBmYWNfbGlzdCArIChuciA+PiAzKTsKKwkqcHRyIHw9ICgweDgwVUwgPj4gKG5yICYgNykpOworCXJldHVybiAwOworfQorCiAvKiBhcmUgY3B1IHN0YXRlcyBjb250cm9sbGVkIGJ5IHVzZXIgc3BhY2UgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGt2bV9zMzkwX3VzZXJfY3B1X3N0YXRlX2N0cmwoc3RydWN0IGt2bSAqa3ZtKQogewpAQCAtMTUwLDkgKzE3OCw5IEBACiAJCQkJICAgICAgc3RydWN0IGt2bV9zMzkwX2lycSAqaXJxKTsKIGludCBfX211c3RfY2hlY2sga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTE2IGNvZGUpOwogc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICprdm1fczM5MF9nZXRfaW9faW50KHN0cnVjdCBrdm0gKmt2bSwKLQkJCQkJCSAgICB1NjQgY3I2LCB1NjQgc2NoaWQpOwotdm9pZCBrdm1fczM5MF9yZWluamVjdF9pb19pbnQoc3RydWN0IGt2bSAqa3ZtLAotCQkJICAgICAgc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpKTsKKwkJCQkJCSAgICB1NjQgaXNjX21hc2ssIHUzMiBzY2hpZCk7CitpbnQga3ZtX3MzOTBfcmVpbmplY3RfaW9faW50KHN0cnVjdCBrdm0gKmt2bSwKKwkJCSAgICAgc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpKTsKIGludCBrdm1fczM5MF9tYXNrX2FkYXB0ZXIoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBpbnQgaWQsIGJvb2wgbWFza2VkKTsKIAogLyogaW1wbGVtZW50ZWQgaW4gaW50ZXJjZXB0LmMgKi8KQEAgLTE3Nyw3ICsyMDUsMTAgQEAKIC8qIGltcGxlbWVudGVkIGluIGt2bS1zMzkwLmMgKi8KIGxvbmcga3ZtX2FyY2hfZmF1bHRfaW5fcGFnZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGdwYV90IGdwYSwgaW50IHdyaXRhYmxlKTsKIGludCBrdm1fczM5MF9zdG9yZV9zdGF0dXNfdW5sb2FkZWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1bnNpZ25lZCBsb25nIGFkZHIpOworaW50IGt2bV9zMzkwX3N0b3JlX2FkdGxfc3RhdHVzX3VubG9hZGVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkJdW5zaWduZWQgbG9uZyBhZGRyKTsKIGludCBrdm1fczM5MF92Y3B1X3N0b3JlX3N0YXR1cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcik7CitpbnQga3ZtX3MzOTBfdmNwdV9zdG9yZV9hZHRsX3N0YXR1cyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgYWRkcik7CiB2b2lkIGt2bV9zMzkwX3ZjcHVfc3RhcnQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIHZvaWQga3ZtX3MzOTBfdmNwdV9zdG9wKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIHMzOTBfdmNwdV9ibG9jayhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpAQCAtMjQxLDYgKzI3MiwxMCBAQAogZXh0ZXJuIHN0cnVjdCBrdm1fZGV2aWNlX29wcyBrdm1fZmxpY19vcHM7CiBpbnQga3ZtX3MzOTBfaXNfc3RvcF9pcnFfcGVuZGluZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogdm9pZCBrdm1fczM5MF9jbGVhcl9zdG9wX2lycShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworaW50IGt2bV9zMzkwX3NldF9pcnFfc3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJICAgdm9pZCBfX3VzZXIgKmJ1ZiwgaW50IGxlbik7CitpbnQga3ZtX3MzOTBfZ2V0X2lycV9zdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkgICBfX3U4IF9fdXNlciAqYnVmLCBpbnQgbGVuKTsKIAogLyogaW1wbGVtZW50ZWQgaW4gZ3Vlc3RkYmcuYyAqLwogdm9pZCBrdm1fczM5MF9iYWNrdXBfZ3Vlc3RfcGVyX3JlZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rdm0vcHJpdi5jIGIvYXJjaC9zMzkwL2t2bS9wcml2LmMKaW5kZXggMzUxMTE2OS4uZDIyZDhlZSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2t2bS9wcml2LmMKKysrIGIvYXJjaC9zMzkwL2t2bS9wcml2LmMKQEAgLTM2LDE1ICszNiwxNiBAQAogCXN0cnVjdCBrdm1fdmNwdSAqY3B1cDsKIAlzNjQgaG9zdGNsaywgdmFsOwogCWludCBpLCByYzsKKwlhcl90IGFyOwogCXU2NCBvcDI7CiAKIAlpZiAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fUFJJVklMRUdFRF9PUCk7CiAKLQlvcDIgPSBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3ModmNwdSk7CisJb3AyID0ga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9zKHZjcHUsICZhcik7CiAJaWYgKG9wMiAmIDcpCS8qIE9wZXJhbmQgbXVzdCBiZSBvbiBhIGRvdWJsZXdvcmQgYm91bmRhcnkgKi8KIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fU1BFQ0lGSUNBVElPTik7Ci0JcmMgPSByZWFkX2d1ZXN0KHZjcHUsIG9wMiwgJnZhbCwgc2l6ZW9mKHZhbCkpOworCXJjID0gcmVhZF9ndWVzdCh2Y3B1LCBvcDIsIGFyLCAmdmFsLCBzaXplb2YodmFsKSk7CiAJaWYgKHJjKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dfY29uZCh2Y3B1LCByYyk7CiAKQEAgLTY4LDIwICs2OSwyMSBAQAogCXU2NCBvcGVyYW5kMjsKIAl1MzIgYWRkcmVzczsKIAlpbnQgcmM7CisJYXJfdCBhcjsKIAogCXZjcHUtPnN0YXQuaW5zdHJ1Y3Rpb25fc3B4Kys7CiAKIAlpZiAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fUFJJVklMRUdFRF9PUCk7CiAKLQlvcGVyYW5kMiA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3Bfcyh2Y3B1KTsKKwlvcGVyYW5kMiA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3Bfcyh2Y3B1LCAmYXIpOwogCiAJLyogbXVzdCBiZSB3b3JkIGJvdW5kYXJ5ICovCiAJaWYgKG9wZXJhbmQyICYgMykKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fU1BFQ0lGSUNBVElPTik7CiAKIAkvKiBnZXQgdGhlIHZhbHVlICovCi0JcmMgPSByZWFkX2d1ZXN0KHZjcHUsIG9wZXJhbmQyLCAmYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpKTsKKwlyYyA9IHJlYWRfZ3Vlc3QodmNwdSwgb3BlcmFuZDIsIGFyLCAmYWRkcmVzcywgc2l6ZW9mKGFkZHJlc3MpKTsKIAlpZiAocmMpCiAJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ19jb25kKHZjcHUsIHJjKTsKIApAQCAtMTA3LDEzICsxMDksMTQgQEAKIAl1NjQgb3BlcmFuZDI7CiAJdTMyIGFkZHJlc3M7CiAJaW50IHJjOworCWFyX3QgYXI7CiAKIAl2Y3B1LT5zdGF0Lmluc3RydWN0aW9uX3N0cHgrKzsKIAogCWlmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9QUklWSUxFR0VEX09QKTsKIAotCW9wZXJhbmQyID0ga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9zKHZjcHUpOworCW9wZXJhbmQyID0ga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9zKHZjcHUsICZhcik7CiAKIAkvKiBtdXN0IGJlIHdvcmQgYm91bmRhcnkgKi8KIAlpZiAob3BlcmFuZDIgJiAzKQpAQCAtMTIyLDcgKzEyNSw3IEBACiAJYWRkcmVzcyA9IGt2bV9zMzkwX2dldF9wcmVmaXgodmNwdSk7CiAKIAkvKiBnZXQgdGhlIHZhbHVlICovCi0JcmMgPSB3cml0ZV9ndWVzdCh2Y3B1LCBvcGVyYW5kMiwgJmFkZHJlc3MsIHNpemVvZihhZGRyZXNzKSk7CisJcmMgPSB3cml0ZV9ndWVzdCh2Y3B1LCBvcGVyYW5kMiwgYXIsICZhZGRyZXNzLCBzaXplb2YoYWRkcmVzcykpOwogCWlmIChyYykKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9nX2NvbmQodmNwdSwgcmMpOwogCkBAIC0xMzYsMTggKzEzOSwxOSBAQAogCXUxNiB2Y3B1X2lkID0gdmNwdS0+dmNwdV9pZDsKIAl1NjQgZ2E7CiAJaW50IHJjOworCWFyX3QgYXI7CiAKIAl2Y3B1LT5zdGF0Lmluc3RydWN0aW9uX3N0YXArKzsKIAogCWlmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9QUklWSUxFR0VEX09QKTsKIAotCWdhID0ga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9zKHZjcHUpOworCWdhID0ga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9zKHZjcHUsICZhcik7CiAKIAlpZiAoZ2EgJiAxKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9TUEVDSUZJQ0FUSU9OKTsKIAotCXJjID0gd3JpdGVfZ3Vlc3QodmNwdSwgZ2EsICZ2Y3B1X2lkLCBzaXplb2YodmNwdV9pZCkpOworCXJjID0gd3JpdGVfZ3Vlc3QodmNwdSwgZ2EsIGFyLCAmdmNwdV9pZCwgc2l6ZW9mKHZjcHVfaWQpKTsKIAlpZiAocmMpCiAJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ19jb25kKHZjcHUsIHJjKTsKIApAQCAtMjA3LDcgKzIxMSw3IEBACiAJa3ZtX3MzOTBfZ2V0X3JlZ3NfcnJlKHZjcHUsIE5VTEwsICZyZWcyKTsKIAlhZGRyID0gdmNwdS0+cnVuLT5zLnJlZ3MuZ3Byc1tyZWcyXSAmIFBBR0VfTUFTSzsKIAlhZGRyID0ga3ZtX3MzOTBfbG9naWNhbF90b19lZmZlY3RpdmUodmNwdSwgYWRkcik7Ci0JaWYgKGt2bV9zMzkwX2NoZWNrX2xvd19hZGRyX3Byb3RlY3Rpb24odmNwdSwgYWRkcikpCisJaWYgKGt2bV9zMzkwX2NoZWNrX2xvd19hZGRyX3Byb3RfcmVhbCh2Y3B1LCBhZGRyKSkKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9nX2lycSh2Y3B1LCAmdmNwdS0+YXJjaC5wZ20pOwogCWFkZHIgPSBrdm1fczM5MF9yZWFsX3RvX2Ficyh2Y3B1LCBhZGRyKTsKIApAQCAtMjI5LDE4ICsyMzMsMjAgQEAKIAlzdHJ1Y3Qga3ZtX3MzOTBfaW50ZXJydXB0X2luZm8gKmludGk7CiAJdW5zaWduZWQgbG9uZyBsZW47CiAJdTMyIHRwaV9kYXRhWzNdOwotCWludCBjYywgcmM7CisJaW50IHJjOwogCXU2NCBhZGRyOworCWFyX3QgYXI7CiAKLQlyYyA9IDA7Ci0JYWRkciA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3Bfcyh2Y3B1KTsKKwlhZGRyID0ga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9zKHZjcHUsICZhcik7CiAJaWYgKGFkZHIgJiAzKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9TUEVDSUZJQ0FUSU9OKTsKLQljYyA9IDA7CisKIAlpbnRpID0ga3ZtX3MzOTBfZ2V0X2lvX2ludCh2Y3B1LT5rdm0sIHZjcHUtPmFyY2guc2llX2Jsb2NrLT5nY3JbNl0sIDApOwotCWlmICghaW50aSkKLQkJZ290byBub19pbnRlcnJ1cHQ7Ci0JY2MgPSAxOworCWlmICghaW50aSkgeworCQlrdm1fczM5MF9zZXRfcHN3X2NjKHZjcHUsIDApOworCQlyZXR1cm4gMDsKKwl9CisKIAl0cGlfZGF0YVswXSA9IGludGktPmlvLnN1YmNoYW5uZWxfaWQgPDwgMTYgfCBpbnRpLT5pby5zdWJjaGFubmVsX25yOwogCXRwaV9kYXRhWzFdID0gaW50aS0+aW8uaW9faW50X3Bhcm07CiAJdHBpX2RhdGFbMl0gPSBpbnRpLT5pby5pb19pbnRfd29yZDsKQEAgLTI1MCw0MCArMjU2LDUxIEBACiAJCSAqIHByb3ZpZGVkIGFyZWEuCiAJCSAqLwogCQlsZW4gPSBzaXplb2YodHBpX2RhdGEpIC0gNDsKLQkJcmMgPSB3cml0ZV9ndWVzdCh2Y3B1LCBhZGRyLCAmdHBpX2RhdGEsIGxlbik7Ci0JCWlmIChyYykKLQkJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ19jb25kKHZjcHUsIHJjKTsKKwkJcmMgPSB3cml0ZV9ndWVzdCh2Y3B1LCBhZGRyLCBhciwgJnRwaV9kYXRhLCBsZW4pOworCQlpZiAocmMpIHsKKwkJCXJjID0ga3ZtX3MzOTBfaW5qZWN0X3Byb2dfY29uZCh2Y3B1LCByYyk7CisJCQlnb3RvIHJlaW5qZWN0X2ludGVycnVwdDsKKwkJfQogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFN0b3JlIHRoZSB0aHJlZS13b3JkIEkvTyBpbnRlcnJ1cHRpb24gY29kZSBpbnRvCiAJCSAqIHRoZSBhcHByb3ByaWF0ZSBsb3djb3JlIGFyZWEuCiAJCSAqLwogCQlsZW4gPSBzaXplb2YodHBpX2RhdGEpOwotCQlpZiAod3JpdGVfZ3Vlc3RfbGModmNwdSwgX19MQ19TVUJDSEFOTkVMX0lELCAmdHBpX2RhdGEsIGxlbikpCisJCWlmICh3cml0ZV9ndWVzdF9sYyh2Y3B1LCBfX0xDX1NVQkNIQU5ORUxfSUQsICZ0cGlfZGF0YSwgbGVuKSkgeworCQkJLyogZmFpbGVkIHdyaXRlcyB0byB0aGUgbG93IGNvcmUgYXJlIG5vdCByZWNvdmVyYWJsZSAqLwogCQkJcmMgPSAtRUZBVUxUOworCQkJZ290byByZWluamVjdF9pbnRlcnJ1cHQ7CisJCX0KIAl9CisKKwkvKiBpcnEgd2FzIHN1Y2Nlc3NmdWxseSBoYW5kZWQgdG8gdGhlIGd1ZXN0ICovCisJa2ZyZWUoaW50aSk7CisJa3ZtX3MzOTBfc2V0X3Bzd19jYyh2Y3B1LCAxKTsKKwlyZXR1cm4gMDsKK3JlaW5qZWN0X2ludGVycnVwdDoKIAkvKgogCSAqIElmIHdlIGVuY291bnRlciBhIHByb2JsZW0gc3RvcmluZyB0aGUgaW50ZXJydXB0aW9uIGNvZGUsIHRoZQogCSAqIGluc3RydWN0aW9uIGlzIHN1cHByZXNzZWQgZnJvbSB0aGUgZ3Vlc3QncyB2aWV3OiByZWluamVjdCB0aGUKIAkgKiBpbnRlcnJ1cHQuCiAJICovCi0JaWYgKCFyYykKKwlpZiAoa3ZtX3MzOTBfcmVpbmplY3RfaW9faW50KHZjcHUtPmt2bSwgaW50aSkpIHsKIAkJa2ZyZWUoaW50aSk7Ci0JZWxzZQotCQlrdm1fczM5MF9yZWluamVjdF9pb19pbnQodmNwdS0+a3ZtLCBpbnRpKTsKLW5vX2ludGVycnVwdDoKLQkvKiBTZXQgY29uZGl0aW9uIGNvZGUgYW5kIHdlJ3JlIGRvbmUuICovCi0JaWYgKCFyYykKLQkJa3ZtX3MzOTBfc2V0X3Bzd19jYyh2Y3B1LCBjYyk7CisJCXJjID0gLUVGQVVMVDsKKwl9CisJLyogZG9uJ3Qgc2V0IHRoZSBjYywgYSBwZ20gaXJxIHdhcyBpbmplY3RlZCBvciB3ZSBkcm9wIHRvIHVzZXIgc3BhY2UgKi8KIAlyZXR1cm4gcmMgPyAtRUZBVUxUIDogMDsKIH0KIAogc3RhdGljIGludCBoYW5kbGVfdHNjaChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Jc3RydWN0IGt2bV9zMzkwX2ludGVycnVwdF9pbmZvICppbnRpOworCXN0cnVjdCBrdm1fczM5MF9pbnRlcnJ1cHRfaW5mbyAqaW50aSA9IE5VTEw7CisJY29uc3QgdTY0IGlzY19tYXNrID0gMHhmZlVMIDw8IDI0OyAvKiBhbGwgaXNjcyBzZXQgKi8KIAotCWludGkgPSBrdm1fczM5MF9nZXRfaW9faW50KHZjcHUtPmt2bSwgMCwKLQkJCQkgICB2Y3B1LT5ydW4tPnMucmVncy5ncHJzWzFdKTsKKwkvKiBhIHZhbGlkIHNjaGlkIGhhcyBhdCBsZWFzdCBvbmUgYml0IHNldCAqLworCWlmICh2Y3B1LT5ydW4tPnMucmVncy5ncHJzWzFdKQorCQlpbnRpID0ga3ZtX3MzOTBfZ2V0X2lvX2ludCh2Y3B1LT5rdm0sIGlzY19tYXNrLAorCQkJCQkgICB2Y3B1LT5ydW4tPnMucmVncy5ncHJzWzFdKTsKIAogCS8qCiAJICogUHJlcGFyZSBleGl0IHRvIHVzZXJzcGFjZS4KQEAgLTM4NiwxNSArNDAzLDE2IEBACiAJcHN3X2NvbXBhdF90IG5ld19wc3c7CiAJdTY0IGFkZHI7CiAJaW50IHJjOworCWFyX3QgYXI7CiAKIAlpZiAoZ3Bzdy0+bWFzayAmIFBTV19NQVNLX1BTVEFURSkKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fUFJJVklMRUdFRF9PUCk7CiAKLQlhZGRyID0ga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9zKHZjcHUpOworCWFkZHIgPSBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3ModmNwdSwgJmFyKTsKIAlpZiAoYWRkciAmIDcpCiAJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ3JhbV9pbnQodmNwdSwgUEdNX1NQRUNJRklDQVRJT04pOwogCi0JcmMgPSByZWFkX2d1ZXN0KHZjcHUsIGFkZHIsICZuZXdfcHN3LCBzaXplb2YobmV3X3BzdykpOworCXJjID0gcmVhZF9ndWVzdCh2Y3B1LCBhZGRyLCBhciwgJm5ld19wc3csIHNpemVvZihuZXdfcHN3KSk7CiAJaWYgKHJjKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dfY29uZCh2Y3B1LCByYyk7CiAJaWYgKCEobmV3X3Bzdy5tYXNrICYgUFNXMzJfTUFTS19CQVNFKSkKQEAgLTQxMiwxNCArNDMwLDE1IEBACiAJcHN3X3QgbmV3X3BzdzsKIAl1NjQgYWRkcjsKIAlpbnQgcmM7CisJYXJfdCBhcjsKIAogCWlmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9QUklWSUxFR0VEX09QKTsKIAotCWFkZHIgPSBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3ModmNwdSk7CisJYWRkciA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3Bfcyh2Y3B1LCAmYXIpOwogCWlmIChhZGRyICYgNykKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fU1BFQ0lGSUNBVElPTik7Ci0JcmMgPSByZWFkX2d1ZXN0KHZjcHUsIGFkZHIsICZuZXdfcHN3LCBzaXplb2YobmV3X3BzdykpOworCXJjID0gcmVhZF9ndWVzdCh2Y3B1LCBhZGRyLCBhciwgJm5ld19wc3csIHNpemVvZihuZXdfcHN3KSk7CiAJaWYgKHJjKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dfY29uZCh2Y3B1LCByYyk7CiAJdmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3cgPSBuZXdfcHN3OwpAQCAtNDMzLDE4ICs0NTIsMTkgQEAKIAl1NjQgc3RpZHBfZGF0YSA9IHZjcHUtPmFyY2guc3RpZHBfZGF0YTsKIAl1NjQgb3BlcmFuZDI7CiAJaW50IHJjOworCWFyX3QgYXI7CiAKIAl2Y3B1LT5zdGF0Lmluc3RydWN0aW9uX3N0aWRwKys7CiAKIAlpZiAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fUFJJVklMRUdFRF9PUCk7CiAKLQlvcGVyYW5kMiA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3Bfcyh2Y3B1KTsKKwlvcGVyYW5kMiA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3Bfcyh2Y3B1LCAmYXIpOwogCiAJaWYgKG9wZXJhbmQyICYgNykKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fU1BFQ0lGSUNBVElPTik7CiAKLQlyYyA9IHdyaXRlX2d1ZXN0KHZjcHUsIG9wZXJhbmQyLCAmc3RpZHBfZGF0YSwgc2l6ZW9mKHN0aWRwX2RhdGEpKTsKKwlyYyA9IHdyaXRlX2d1ZXN0KHZjcHUsIG9wZXJhbmQyLCBhciwgJnN0aWRwX2RhdGEsIHNpemVvZihzdGlkcF9kYXRhKSk7CiAJaWYgKHJjKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dfY29uZCh2Y3B1LCByYyk7CiAKQEAgLTQ2Nyw2ICs0ODcsNyBAQAogCWZvciAobiA9IG1lbS0+Y291bnQgLSAxOyBuID4gMCA7IG4tLSkKIAkJbWVtY3B5KCZtZW0tPnZtW25dLCAmbWVtLT52bVtuIC0gMV0sIHNpemVvZihtZW0tPnZtWzBdKSk7CiAKKwltZW1zZXQoJm1lbS0+dm1bMF0sIDAsIHNpemVvZihtZW0tPnZtWzBdKSk7CiAJbWVtLT52bVswXS5jcHVzX3RvdGFsID0gY3B1czsKIAltZW0tPnZtWzBdLmNwdXNfY29uZmlndXJlZCA9IGNwdXM7CiAJbWVtLT52bVswXS5jcHVzX3N0YW5kYnkgPSAwOwpAQCAtNDc4LDYgKzQ5OSwxNyBAQAogCUFTQ0VCQyhtZW0tPnZtWzBdLmNwaSwgMTYpOwogfQogCitzdGF0aWMgdm9pZCBpbnNlcnRfc3RzaV91c3JfZGF0YShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCBhZGRyLCBhcl90IGFyLAorCQkJCSB1OCBmYywgdTggc2VsMSwgdTE2IHNlbDIpCit7CisJdmNwdS0+cnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX1MzOTBfU1RTSTsKKwl2Y3B1LT5ydW4tPnMzOTBfc3RzaS5hZGRyID0gYWRkcjsKKwl2Y3B1LT5ydW4tPnMzOTBfc3RzaS5hciA9IGFyOworCXZjcHUtPnJ1bi0+czM5MF9zdHNpLmZjID0gZmM7CisJdmNwdS0+cnVuLT5zMzkwX3N0c2kuc2VsMSA9IHNlbDE7CisJdmNwdS0+cnVuLT5zMzkwX3N0c2kuc2VsMiA9IHNlbDI7Cit9CisKIHN0YXRpYyBpbnQgaGFuZGxlX3N0c2koc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWludCBmYyA9ICh2Y3B1LT5ydW4tPnMucmVncy5ncHJzWzBdICYgMHhmMDAwMDAwMCkgPj4gMjg7CkBAIC00ODYsNiArNTE4LDcgQEAKIAl1bnNpZ25lZCBsb25nIG1lbSA9IDA7CiAJdTY0IG9wZXJhbmQyOwogCWludCByYyA9IDA7CisJYXJfdCBhcjsKIAogCXZjcHUtPnN0YXQuaW5zdHJ1Y3Rpb25fc3RzaSsrOwogCVZDUFVfRVZFTlQodmNwdSwgNCwgInN0c2k6IGZjOiAleCBzZWwxOiAleCBzZWwyOiAleCIsIGZjLCBzZWwxLCBzZWwyKTsKQEAgLTUwOCw3ICs1NDEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlvcGVyYW5kMiA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3Bfcyh2Y3B1KTsKKwlvcGVyYW5kMiA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3Bfcyh2Y3B1LCAmYXIpOwogCiAJaWYgKG9wZXJhbmQyICYgMHhmZmYpCiAJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ3JhbV9pbnQodmNwdSwgUEdNX1NQRUNJRklDQVRJT04pOwpAQCAtNTMyLDE2ICs1NjUsMjAgQEAKIAkJYnJlYWs7CiAJfQogCi0JcmMgPSB3cml0ZV9ndWVzdCh2Y3B1LCBvcGVyYW5kMiwgKHZvaWQgKiltZW0sIFBBR0VfU0laRSk7CisJcmMgPSB3cml0ZV9ndWVzdCh2Y3B1LCBvcGVyYW5kMiwgYXIsICh2b2lkICopbWVtLCBQQUdFX1NJWkUpOwogCWlmIChyYykgewogCQlyYyA9IGt2bV9zMzkwX2luamVjdF9wcm9nX2NvbmQodmNwdSwgcmMpOwogCQlnb3RvIG91dDsKIAl9CisJaWYgKHZjcHUtPmt2bS0+YXJjaC51c2VyX3N0c2kpIHsKKwkJaW5zZXJ0X3N0c2lfdXNyX2RhdGEodmNwdSwgb3BlcmFuZDIsIGFyLCBmYywgc2VsMSwgc2VsMik7CisJCXJjID0gLUVSRU1PVEU7CisJfQogCXRyYWNlX2t2bV9zMzkwX2hhbmRsZV9zdHNpKHZjcHUsIGZjLCBzZWwxLCBzZWwyLCBvcGVyYW5kMik7CiAJZnJlZV9wYWdlKG1lbSk7CiAJa3ZtX3MzOTBfc2V0X3Bzd19jYyh2Y3B1LCAwKTsKIAl2Y3B1LT5ydW4tPnMucmVncy5ncHJzWzBdID0gMDsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmM7CiBvdXRfbm9fZGF0YToKIAlrdm1fczM5MF9zZXRfcHN3X2NjKHZjcHUsIDMpOwogb3V0OgpAQCAtNjcwLDcgKzcwNyw3IEBACiAJfQogCiAJaWYgKHZjcHUtPnJ1bi0+cy5yZWdzLmdwcnNbcmVnMV0gJiBQRk1GX0NGKSB7Ci0JCWlmIChrdm1fczM5MF9jaGVja19sb3dfYWRkcl9wcm90ZWN0aW9uKHZjcHUsIHN0YXJ0KSkKKwkJaWYgKGt2bV9zMzkwX2NoZWNrX2xvd19hZGRyX3Byb3RfcmVhbCh2Y3B1LCBzdGFydCkpCiAJCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dfaXJxKHZjcHUsICZ2Y3B1LT5hcmNoLnBnbSk7CiAJfQogCkBAIC03NzYsMTMgKzgxMywxNCBAQAogCWludCByZWcsIHJjLCBucl9yZWdzOwogCXUzMiBjdGxfYXJyYXlbMTZdOwogCXU2NCBnYTsKKwlhcl90IGFyOwogCiAJdmNwdS0+c3RhdC5pbnN0cnVjdGlvbl9sY3RsKys7CiAKIAlpZiAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fUFJJVklMRUdFRF9PUCk7CiAKLQlnYSA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3BfcnModmNwdSk7CisJZ2EgPSBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3JzKHZjcHUsICZhcik7CiAKIAlpZiAoZ2EgJiAzKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9TUEVDSUZJQ0FUSU9OKTsKQEAgLTc5MSw3ICs4MjksNyBAQAogCXRyYWNlX2t2bV9zMzkwX2hhbmRsZV9sY3RsKHZjcHUsIDAsIHJlZzEsIHJlZzMsIGdhKTsKIAogCW5yX3JlZ3MgPSAoKHJlZzMgLSByZWcxKSAmIDB4ZikgKyAxOwotCXJjID0gcmVhZF9ndWVzdCh2Y3B1LCBnYSwgY3RsX2FycmF5LCBucl9yZWdzICogc2l6ZW9mKHUzMikpOworCXJjID0gcmVhZF9ndWVzdCh2Y3B1LCBnYSwgYXIsIGN0bF9hcnJheSwgbnJfcmVncyAqIHNpemVvZih1MzIpKTsKIAlpZiAocmMpCiAJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ19jb25kKHZjcHUsIHJjKTsKIAlyZWcgPSByZWcxOwpAQCAtODE0LDEzICs4NTIsMTQgQEAKIAlpbnQgcmVnLCByYywgbnJfcmVnczsKIAl1MzIgY3RsX2FycmF5WzE2XTsKIAl1NjQgZ2E7CisJYXJfdCBhcjsKIAogCXZjcHUtPnN0YXQuaW5zdHJ1Y3Rpb25fc3RjdGwrKzsKIAogCWlmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9QUklWSUxFR0VEX09QKTsKIAotCWdhID0ga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9ycyh2Y3B1KTsKKwlnYSA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3BfcnModmNwdSwgJmFyKTsKIAogCWlmIChnYSAmIDMpCiAJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ3JhbV9pbnQodmNwdSwgUEdNX1NQRUNJRklDQVRJT04pOwpAQCAtODM2LDcgKzg3NSw3IEBACiAJCQlicmVhazsKIAkJcmVnID0gKHJlZyArIDEpICUgMTY7CiAJfSB3aGlsZSAoMSk7Ci0JcmMgPSB3cml0ZV9ndWVzdCh2Y3B1LCBnYSwgY3RsX2FycmF5LCBucl9yZWdzICogc2l6ZW9mKHUzMikpOworCXJjID0gd3JpdGVfZ3Vlc3QodmNwdSwgZ2EsIGFyLCBjdGxfYXJyYXksIG5yX3JlZ3MgKiBzaXplb2YodTMyKSk7CiAJcmV0dXJuIHJjID8ga3ZtX3MzOTBfaW5qZWN0X3Byb2dfY29uZCh2Y3B1LCByYykgOiAwOwogfQogCkBAIC04NDcsMTMgKzg4NiwxNCBAQAogCWludCByZWcsIHJjLCBucl9yZWdzOwogCXU2NCBjdGxfYXJyYXlbMTZdOwogCXU2NCBnYTsKKwlhcl90IGFyOwogCiAJdmNwdS0+c3RhdC5pbnN0cnVjdGlvbl9sY3RsZysrOwogCiAJaWYgKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3Lm1hc2sgJiBQU1dfTUFTS19QU1RBVEUpCiAJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ3JhbV9pbnQodmNwdSwgUEdNX1BSSVZJTEVHRURfT1ApOwogCi0JZ2EgPSBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3JzeSh2Y3B1KTsKKwlnYSA9IGt2bV9zMzkwX2dldF9iYXNlX2Rpc3BfcnN5KHZjcHUsICZhcik7CiAKIAlpZiAoZ2EgJiA3KQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9TUEVDSUZJQ0FUSU9OKTsKQEAgLTg2Miw3ICs5MDIsNyBAQAogCXRyYWNlX2t2bV9zMzkwX2hhbmRsZV9sY3RsKHZjcHUsIDEsIHJlZzEsIHJlZzMsIGdhKTsKIAogCW5yX3JlZ3MgPSAoKHJlZzMgLSByZWcxKSAmIDB4ZikgKyAxOwotCXJjID0gcmVhZF9ndWVzdCh2Y3B1LCBnYSwgY3RsX2FycmF5LCBucl9yZWdzICogc2l6ZW9mKHU2NCkpOworCXJjID0gcmVhZF9ndWVzdCh2Y3B1LCBnYSwgYXIsIGN0bF9hcnJheSwgbnJfcmVncyAqIHNpemVvZih1NjQpKTsKIAlpZiAocmMpCiAJCXJldHVybiBrdm1fczM5MF9pbmplY3RfcHJvZ19jb25kKHZjcHUsIHJjKTsKIAlyZWcgPSByZWcxOwpAQCAtODg0LDEzICs5MjQsMTQgQEAKIAlpbnQgcmVnLCByYywgbnJfcmVnczsKIAl1NjQgY3RsX2FycmF5WzE2XTsKIAl1NjQgZ2E7CisJYXJfdCBhcjsKIAogCXZjcHUtPnN0YXQuaW5zdHJ1Y3Rpb25fc3RjdGcrKzsKIAogCWlmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9QUklWSUxFR0VEX09QKTsKIAotCWdhID0ga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9yc3kodmNwdSk7CisJZ2EgPSBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3JzeSh2Y3B1LCAmYXIpOwogCiAJaWYgKGdhICYgNykKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fU1BFQ0lGSUNBVElPTik7CkBAIC05MDYsNyArOTQ3LDcgQEAKIAkJCWJyZWFrOwogCQlyZWcgPSAocmVnICsgMSkgJSAxNjsKIAl9IHdoaWxlICgxKTsKLQlyYyA9IHdyaXRlX2d1ZXN0KHZjcHUsIGdhLCBjdGxfYXJyYXksIG5yX3JlZ3MgKiBzaXplb2YodTY0KSk7CisJcmMgPSB3cml0ZV9ndWVzdCh2Y3B1LCBnYSwgYXIsIGN0bF9hcnJheSwgbnJfcmVncyAqIHNpemVvZih1NjQpKTsKIAlyZXR1cm4gcmMgPyBrdm1fczM5MF9pbmplY3RfcHJvZ19jb25kKHZjcHUsIHJjKSA6IDA7CiB9CiAKQEAgLTkzMSwxMyArOTcyLDE0IEBACiAJdW5zaWduZWQgbG9uZyBodmEsIGdwYTsKIAlpbnQgcmV0ID0gMCwgY2MgPSAwOwogCWJvb2wgd3JpdGFibGU7CisJYXJfdCBhcjsKIAogCXZjcHUtPnN0YXQuaW5zdHJ1Y3Rpb25fdHByb3QrKzsKIAogCWlmICh2Y3B1LT5hcmNoLnNpZV9ibG9jay0+Z3Bzdy5tYXNrICYgUFNXX01BU0tfUFNUQVRFKQogCQlyZXR1cm4ga3ZtX3MzOTBfaW5qZWN0X3Byb2dyYW1faW50KHZjcHUsIFBHTV9QUklWSUxFR0VEX09QKTsKIAotCWt2bV9zMzkwX2dldF9iYXNlX2Rpc3Bfc3NlKHZjcHUsICZhZGRyZXNzMSwgJmFkZHJlc3MyKTsKKwlrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3NzZSh2Y3B1LCAmYWRkcmVzczEsICZhZGRyZXNzMiwgJmFyLCBOVUxMKTsKIAogCS8qIHdlIG9ubHkgaGFuZGxlIHRoZSBMaW51eCBtZW1vcnkgZGV0ZWN0aW9uIGNhc2U6CiAJICogYWNjZXNzIGtleSA9PSAwCkBAIC05NDYsMTEgKzk4OCwxMSBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJaWYgKHZjcHUtPmFyY2guc2llX2Jsb2NrLT5ncHN3Lm1hc2sgJiBQU1dfTUFTS19EQVQpCiAJCWlwdGVfbG9jayh2Y3B1KTsKLQlyZXQgPSBndWVzdF90cmFuc2xhdGVfYWRkcmVzcyh2Y3B1LCBhZGRyZXNzMSwgJmdwYSwgMSk7CisJcmV0ID0gZ3Vlc3RfdHJhbnNsYXRlX2FkZHJlc3ModmNwdSwgYWRkcmVzczEsIGFyLCAmZ3BhLCAxKTsKIAlpZiAocmV0ID09IFBHTV9QUk9URUNUSU9OKSB7CiAJCS8qIFdyaXRlIHByb3RlY3RlZD8gVHJ5IGFnYWluIHdpdGggcmVhZC1vbmx5Li4uICovCiAJCWNjID0gMTsKLQkJcmV0ID0gZ3Vlc3RfdHJhbnNsYXRlX2FkZHJlc3ModmNwdSwgYWRkcmVzczEsICZncGEsIDApOworCQlyZXQgPSBndWVzdF90cmFuc2xhdGVfYWRkcmVzcyh2Y3B1LCBhZGRyZXNzMSwgYXIsICZncGEsIDApOwogCX0KIAlpZiAocmV0KSB7CiAJCWlmIChyZXQgPT0gUEdNX0FERFJFU1NJTkcgfHwgcmV0ID09IFBHTV9UUkFOU0xBVElPTl9TUEVDKSB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva3ZtL3NpZ3AuYyBiL2FyY2gvczM5MC9rdm0vc2lncC5jCmluZGV4IDIzYjFlODYuLjcyZTU4YmQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rdm0vc2lncC5jCisrKyBiL2FyY2gvczM5MC9rdm0vc2lncC5jCkBAIC0zOTMsNiArMzkzLDkgQEAKIAljYXNlIFNJR1BfU1RPUkVfU1RBVFVTX0FUX0FERFJFU1M6CiAJCXZjcHUtPnN0YXQuaW5zdHJ1Y3Rpb25fc2lncF9zdG9yZV9zdGF0dXMrKzsKIAkJYnJlYWs7CisJY2FzZSBTSUdQX1NUT1JFX0FERElUSU9OQUxfU1RBVFVTOgorCQl2Y3B1LT5zdGF0Lmluc3RydWN0aW9uX3NpZ3Bfc3RvcmVfYWR0bF9zdGF0dXMrKzsKKwkJYnJlYWs7CiAJY2FzZSBTSUdQX1NFVF9QUkVGSVg6CiAJCXZjcHUtPnN0YXQuaW5zdHJ1Y3Rpb25fc2lncF9wcmVmaXgrKzsKIAkJYnJlYWs7CkBAIC00MzEsNyArNDM0LDcgQEAKIAlpZiAodmNwdS0+YXJjaC5zaWVfYmxvY2stPmdwc3cubWFzayAmIFBTV19NQVNLX1BTVEFURSkKIAkJcmV0dXJuIGt2bV9zMzkwX2luamVjdF9wcm9ncmFtX2ludCh2Y3B1LCBQR01fUFJJVklMRUdFRF9PUCk7CiAKLQlvcmRlcl9jb2RlID0ga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9ycyh2Y3B1KTsKKwlvcmRlcl9jb2RlID0ga3ZtX3MzOTBfZ2V0X2Jhc2VfZGlzcF9ycyh2Y3B1LCBOVUxMKTsKIAlpZiAoaGFuZGxlX3NpZ3Bfb3JkZXJfaW5fdXNlcl9zcGFjZSh2Y3B1LCBvcmRlcl9jb2RlKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCkBAIC00NzMsNyArNDc2LDcgQEAKIAlpbnQgcjMgPSB2Y3B1LT5hcmNoLnNpZV9ibG9jay0+aXBhICYgMHgwMDBmOwogCXUxNiBjcHVfYWRkciA9IHZjcHUtPnJ1bi0+cy5yZWdzLmdwcnNbcjNdOwogCXN0cnVjdCBrdm1fdmNwdSAqZGVzdF92Y3B1OwotCXU4IG9yZGVyX2NvZGUgPSBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3JzKHZjcHUpOworCXU4IG9yZGVyX2NvZGUgPSBrdm1fczM5MF9nZXRfYmFzZV9kaXNwX3JzKHZjcHUsIE5VTEwpOwogCiAJdHJhY2Vfa3ZtX3MzOTBfaGFuZGxlX3NpZ3BfcGVpKHZjcHUsIG9yZGVyX2NvZGUsIGNwdV9hZGRyKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2t2bS90cmFjZS1zMzkwLmggYi9hcmNoL3MzOTAva3ZtL3RyYWNlLXMzOTAuaAppbmRleCA2NTNhN2VjLi4zMjA4ZDMzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva3ZtL3RyYWNlLXMzOTAuaAorKysgYi9hcmNoL3MzOTAva3ZtL3RyYWNlLXMzOTAuaApAQCAtMTAsNiArMTAsMTMgQEAKICNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIHRyYWNlLXMzOTAKIAogLyoKKyAqIFRoZSBUUkFDRV9TWVNURU1fVkFSIGRlZmF1bHRzIHRvIFRSQUNFX1NZU1RFTSwgYnV0IG11c3QgYmUgYQorICogbGVnaXRpbWF0ZSBDIHZhcmlhYmxlLiBJdCBpcyBub3QgZXhwb3J0ZWQgdG8gdXNlciBzcGFjZS4KKyAqLworI3VuZGVmIFRSQUNFX1NZU1RFTV9WQVIKKyNkZWZpbmUgVFJBQ0VfU1lTVEVNX1ZBUiBrdm1fczM5MAorCisvKgogICogVHJhY2UgcG9pbnQgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUga3ZtIGluc3RhbmNlLgogICovCiBUUkFDRV9FVkVOVChrdm1fczM5MF9jcmVhdGVfdm0sCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL01ha2VmaWxlIGIvYXJjaC9zMzkwL2xpYi9NYWtlZmlsZQppbmRleCBhMDFkZjIzLi4wZThmZWZlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvczM5MC9saWIvTWFrZWZpbGUKQEAgLTMsOCArMyw3IEBACiAjCiAKIGxpYi15ICs9IGRlbGF5Lm8gc3RyaW5nLm8gdWFjY2Vzcy5vIGZpbmQubwotb2JqLSQoQ09ORklHXzMyQklUKSArPSBkaXY2NC5vIHFybm5kLm8gdWNtcGRpMi5vIG1lbTMyLm8KLW9iai0kKENPTkZJR182NEJJVCkgKz0gbWVtNjQubworb2JqLXkgKz0gbWVtLm8KIGxpYi0kKENPTkZJR19TTVApICs9IHNwaW5sb2NrLm8KIGxpYi0kKENPTkZJR19LUFJPQkVTKSArPSBwcm9iZXMubwogbGliLSQoQ09ORklHX1VQUk9CRVMpICs9IHByb2Jlcy5vCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL2RpdjY0LmMgYi9hcmNoL3MzOTAvbGliL2RpdjY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTE1MmYuLjAwMDAwMDAKLS0tIGEvYXJjaC9zMzkwL2xpYi9kaXY2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiAgX19kaXY2NF8zMiBpbXBsZW1lbnRhdGlvbiBmb3IgMzEgYml0LgotICoKLSAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNgotICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pLAotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaWZkZWYgQ09ORklHX01BUkNIX0c1Ci0KLS8qCi0gKiBGdW5jdGlvbiB0byBkaXZpZGUgYW4gdW5zaWduZWQgNjQgYml0IGludGVnZXIgYnkgYW4gdW5zaWduZWQKLSAqIDMxIGJpdCBpbnRlZ2VyIHVzaW5nIHNpZ25lZCA2NC8zMiBiaXQgZGl2aXNpb24uCi0gKi8KLXN0YXRpYyB1aW50MzJfdCBfX2RpdjY0XzMxKHVpbnQ2NF90ICpuLCB1aW50MzJfdCBiYXNlKQotewotCXJlZ2lzdGVyIHVpbnQzMl90IHJlZzIgYXNtKCIyIik7Ci0JcmVnaXN0ZXIgdWludDMyX3QgcmVnMyBhc20oIjMiKTsKLQl1aW50MzJfdCAqd29yZHMgPSAodWludDMyX3QgKikgbjsKLQl1aW50MzJfdCB0bXA7Ci0KLQkvKiBTcGVjaWFsIGNhc2UgYmFzZT09MSwgcmVtYWluZGVyID0gMCwgcXVvdGllbnQgPSBuICovCi0JaWYgKGJhc2UgPT0gMSkKLQkJcmV0dXJuIDA7Ci0JLyoKLQkgKiBTcGVjaWFsIGNhc2UgYmFzZT09MCB3aWxsIGNhdXNlIGEgZml4ZWQgcG9pbnQgZGl2aWRlIGV4Y2VwdGlvbgotCSAqIG9uIHRoZSBkciBpbnN0cnVjdGlvbiBhbmQgbWF5IG5vdCBoYXBwZW4gYW55d2F5LiBGb3IgdGhlCi0JICogZm9sbG93aW5nIGNhbGN1bGF0aW9uIHdlIGNhbiBhc3N1bWUgYmFzZSA+IDEuIFRoZSBmaXJzdAotCSAqIHNpZ25lZCA2NCAvIDMyIGJpdCBkaXZpc2lvbiB3aXRoIGFuIHVwcGVyIGhhbGYgb2YgMCB3aWxsCi0JICogZ2l2ZSB0aGUgY29ycmVjdCB1cHBlciBoYWxmIG9mIHRoZSA2NCBiaXQgcXVvdGllbnQuCi0JICovCi0JcmVnMiA9IDBVTDsKLQlyZWczID0gd29yZHNbMF07Ci0JYXNtIHZvbGF0aWxlKAotCQkiCWRyCSUwLCUyXG4iCi0JCTogIitkIiAocmVnMiksICIrZCIgKHJlZzMpIDogImQiIChiYXNlKSA6ICJjYyIgKTsKLQl3b3Jkc1swXSA9IHJlZzM7Ci0JcmVnMyA9IHdvcmRzWzFdOwotCS8qCi0JICogVG8gZ2V0IHRoZSBsb3dlciBoYWxmIG9mIHRoZSA2NCBiaXQgcXVvdGllbnQgYW5kIHRoZSAzMiBiaXQKLQkgKiByZW1haW5kZXIgd2UgaGF2ZSB0byB1c2UgYSBsaXR0bGUgdHJpY2suIFNpbmNlIHdlIG9ubHkgaGF2ZQotCSAqIGEgc2lnbmVkIGRpdmlzaW9uIHRoZSBxdW90aWVudCBjYW4gZ2V0IHRvbyBiaWcuIFRvIGF2b2lkIHRoaXMKLQkgKiB0aGUgNjQgYml0IGRpdmlkZW5kIGlzIGhhbHZlZCwgdGhlbiB0aGUgc2lnbmVkIGRpdmlzaW9uIHdpbGwKLQkgKiB3b3JrLiBBZnRlcndhcmRzIHRoZSBxdW90aWVudCBhbmQgdGhlIHJlbWFpbmRlciBhcmUgZG91YmxlZC4KLQkgKiBJZiB0aGUgbGFzdCBiaXQgb2YgdGhlIGRpdmlkZW5kIGhhcyBiZWVuIG9uZSB0aGUgcmVtYWluZGVyCi0JICogaXMgaW5jcmVhc2VkIGJ5IG9uZSB0aGVuIGNoZWNrZWQgYWdhaW5zdCB0aGUgYmFzZS4gSWYgdGhlCi0JICogcmVtYWluZGVyIGhhcyBvdmVyZmxvd24gc3VidHJhY3QgYmFzZSBhbmQgaW5jcmVhc2UgdGhlCi0JICogcXVvdGllbnQuIFNpbXBsZSwgbm8gPwotCSAqLwotCWFzbSB2b2xhdGlsZSgKLQkJIglucgklMiwlMVxuIgotCQkiCXNyZGwJJTAsMVxuIgotCQkiCWRyCSUwLCUzXG4iCi0JCSIJYWxyCSUwLCUwXG4iCi0JCSIJYWxyCSUxLCUxXG4iCi0JCSIJYWxyCSUwLCUyXG4iCi0JCSIJY2xyCSUwLCUzXG4iCi0JCSIJamwJMGZcbiIKLQkJIglzbHIJJTAsJTNcbiIKLQkJIglhaGkJJTEsMVxuIgotCQkiMDpcbiIKLQkJOiAiK2QiIChyZWcyKSwgIitkIiAocmVnMyksICI9ZCIgKHRtcCkKLQkJOiAiZCIgKGJhc2UpLCAiMiIgKDFVTCkgOiAiY2MiICk7Ci0Jd29yZHNbMV0gPSByZWczOwotCXJldHVybiByZWcyOwotfQotCi0vKgotICogRnVuY3Rpb24gdG8gZGl2aWRlIGFuIHVuc2lnbmVkIDY0IGJpdCBpbnRlZ2VyIGJ5IGFuIHVuc2lnbmVkCi0gKiAzMiBiaXQgaW50ZWdlciB1c2luZyB0aGUgdW5zaWduZWQgNjQvMzEgYml0IGRpdmlzaW9uLgotICovCi11aW50MzJfdCBfX2RpdjY0XzMyKHVpbnQ2NF90ICpuLCB1aW50MzJfdCBiYXNlKQotewotCXVpbnQzMl90IHI7Ci0KLQkvKgotCSAqIElmIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBiYXNlIGlzIHNldCwgZGl2aWRlIG4gYnkKLQkgKiAoYmFzZS8yKS4gVGhhdCBhbGxvd3MgdG8gdXNlIDY0LzMxIGJpdCBkaXZpc2lvbiBhbmQgZ2l2ZXMgYQotCSAqIGdvb2QgYXBwcm94aW1hdGlvbiBvZiB0aGUgcmVzdWx0OiBuID0gKGJhc2UvMikqcSArIHIuIFRoZQotCSAqIHJlc3VsdCBuZWVkcyB0byBiZSBjb3JyZWN0ZWQgd2l0aCB0d28gc2ltcGxlIHRyYW5zZm9ybWF0aW9ucy4KLQkgKiBJZiBiYXNlIGlzIGFscmVhZHkgPCAyXjMxLTEgX19kaXY2NF8zMSBjYW4gYmUgdXNlZCBkaXJlY3RseS4KLQkgKi8KLQlyID0gX19kaXY2NF8zMShuLCAoKHNpZ25lZCkgYmFzZSA8IDApID8gKGJhc2UvMikgOiBiYXNlKTsKLQlpZiAoKHNpZ25lZCkgYmFzZSA8IDApIHsKLQkJdWludDY0X3QgcSA9ICpuOwotCQkvKgotCQkgKiBGaXJzdCB0cmFuc2Zvcm1hdGlvbjoKLQkJICogbiA9IChiYXNlLzIpKnEgKyByCi0JCSAqICAgPSAoKGJhc2UvMikqMikqKHEvMikgKyAoKHEmMSkgPyAoYmFzZS8yKSA6IDApICsgcgotCQkgKiBTaW5jZSByIDwgKGJhc2UvMiksIHIgKyAoYmFzZS8yKSA8IGJhc2UuCi0JCSAqIFdpdGggcTEgPSAocS8yKSBhbmQgcjEgPSByICsgKChxJjEpID8gKGJhc2UvMikgOiAwKQotCQkgKiBuID0gKChiYXNlLzIpKjIpKnExICsgcjEgd2l0aCByMSA8IGJhc2UuCi0JCSAqLwotCQlpZiAocSAmIDEpCi0JCQlyICs9IGJhc2UvMjsKLQkJcSA+Pj0gMTsKLQkJLyoKLQkJICogU2Vjb25kIHRyYW5zZm9ybWF0aW9uLiAoKGJhc2UvMikqMikgY291bGQgaGF2ZSBsb3N0IHRoZQotCQkgKiBsYXN0IGJpdC4KLQkJICogbiA9ICgoYmFzZS8yKSoyKSpxMSArIHIxCi0JCSAqICAgPSBiYXNlKnExIC0gKChiYXNlJjEpID8gcTEgOiAwKSArIHIxCi0JCSAqLwotCQlpZiAoYmFzZSAmIDEpIHsKLQkJCWludDY0X3QgcnggPSByIC0gcTsKLQkJCS8qCi0JCQkgKiBiYXNlIGlzID49IDJeMzEuIFRoZSB3b3JzdCBjYXNlIGZvciB0aGUgd2hpbGUKLQkJCSAqIGxvb3AgaXMgbj0yXjY0LTEgYmFzZT0yXjMxKzEuIFRoYXQgZ2l2ZXMgYQotCQkJICogbWF4aW11bSBmb3IgcT0oMl42NC0xKS8yXjMxID0gMHgxZmZmZmZmZmYuIFNpbmNlCi0JCQkgKiBiYXNlID49IDJeMzEgdGhlIGxvb3AgaXMgZmluaXNoZWQgYWZ0ZXIgYSBtYXhpbXVtCi0JCQkgKiBvZiB0aHJlZSBpdGVyYXRpb25zLgotCQkJICovCi0JCQl3aGlsZSAocnggPCAwKSB7Ci0JCQkJcnggKz0gYmFzZTsKLQkJCQlxLS07Ci0JCQl9Ci0JCQlyID0gcng7Ci0JCX0KLQkJKm4gPSBxOwotCX0KLQlyZXR1cm4gcjsKLX0KLQotI2Vsc2UgLyogTUFSQ0hfRzUgKi8KLQotdWludDMyX3QgX19kaXY2NF8zMih1aW50NjRfdCAqbiwgdWludDMyX3QgYmFzZSkKLXsKLQlyZWdpc3RlciB1aW50MzJfdCByZWcyIGFzbSgiMiIpOwotCXJlZ2lzdGVyIHVpbnQzMl90IHJlZzMgYXNtKCIzIik7Ci0JdWludDMyX3QgKndvcmRzID0gKHVpbnQzMl90ICopIG47Ci0KLQlyZWcyID0gMFVMOwotCXJlZzMgPSB3b3Jkc1swXTsKLQlhc20gdm9sYXRpbGUoCi0JCSIJZGxyCSUwLCUyXG4iCi0JCTogIitkIiAocmVnMiksICIrZCIgKHJlZzMpIDogImQiIChiYXNlKSA6ICJjYyIgKTsKLQl3b3Jkc1swXSA9IHJlZzM7Ci0JcmVnMyA9IHdvcmRzWzFdOwotCWFzbSB2b2xhdGlsZSgKLQkJIglkbHIJJTAsJTJcbiIKLQkJOiAiK2QiIChyZWcyKSwgIitkIiAocmVnMykgOiAiZCIgKGJhc2UpIDogImNjIiApOwotCXdvcmRzWzFdID0gcmVnMzsKLQlyZXR1cm4gcmVnMjsKLX0KLQotI2VuZGlmIC8qIE1BUkNIX0c1ICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL21lbTY0LlMgYi9hcmNoL3MzOTAvbGliL21lbS5TCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBhcmNoL3MzOTAvbGliL21lbTY0LlMKcmVuYW1lIHRvIGFyY2gvczM5MC9saWIvbWVtLlMKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvbWVtMzIuUyBiL2FyY2gvczM5MC9saWIvbWVtMzIuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjYTkyNC4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAvbGliL21lbTMyLlMKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogU3RyaW5nIGhhbmRsaW5nIGZ1bmN0aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMTIKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotCi0vKgotICogbWVtc2V0IGltcGxlbWVudGF0aW9uCi0gKgotICogVGhpcyBjb2RlIGNvcnJlc3BvbmRzIHRvIHRoZSBDIGNvbnN0cnVjdCBiZWxvdy4gV2UgZG8gZGlzdGluZ3Vpc2gKLSAqIGJldHdlZW4gY2xlYXJpbmcgKGMgPT0gMCkgYW5kIHNldHRpbmcgYSBtZW1vcnkgYXJyYXkgKGMgIT0gMCkgc2ltcGx5Ci0gKiBiZWNhdXNlIG5lYXJseSBhbGwgbWVtc2V0IGludm9jYXRpb25zIGluIHRoZSBrZXJuZWwgY2xlYXIgbWVtb3J5IGFuZAotICogdGhlIHhjIGluc3RydWN0aW9uIGlzIHByZWZlcnJlZCBpbiBzdWNoIGNhc2VzLgotICoKLSAqIHZvaWQgKm1lbXNldCh2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pCi0gKiB7Ci0gKglpZiAobGlrZWx5KGMgPT0gMCkpCi0gKgkJcmV0dXJuIF9fYnVpbHRpbl9tZW1zZXQocywgMCwgbik7Ci0gKglyZXR1cm4gX19idWlsdGluX21lbXNldChzLCBjLCBuKTsKLSAqIH0KLSAqLwotRU5UUlkobWVtc2V0KQotCWJhc3IJJXI1LCVyMAotLkxtZW1zZXRfYmFzZToKLQlsdHIJJXI0LCVyNAotCWJ6cgklcjE0Ci0JbHRyCSVyMywlcjMKLQlqbnoJLkxtZW1zZXRfZmlsbAotCWFoaQklcjQsLTEKLQlscgklcjMsJXI0Ci0Jc3JsCSVyMyw4Ci0JbHRyCSVyMywlcjMKLQlscgklcjEsJXIyCi0JamUJLkxtZW1zZXRfY2xlYXJfcmVzdAotLkxtZW1zZXRfY2xlYXJfbG9vcDoKLQl4YwkwKDI1NiwlcjEpLDAoJXIxKQotCWxhCSVyMSwyNTYoJXIxKQotCWJyY3QJJXIzLC5MbWVtc2V0X2NsZWFyX2xvb3AKLS5MbWVtc2V0X2NsZWFyX3Jlc3Q6Ci0JZXgJJXI0LC5MbWVtc2V0X3hjLS5MbWVtc2V0X2Jhc2UoJXI1KQotCWJyCSVyMTQKLS5MbWVtc2V0X2ZpbGw6Ci0Jc3RjCSVyMywwKCVyMikKLQljaGkJJXI0LDEKLQlscgklcjEsJXIyCi0JYmVyCSVyMTQKLQlhaGkJJXI0LC0yCi0JbHIJJXIzLCVyNAotCXNybAklcjMsOAotCWx0cgklcjMsJXIzCi0JamUJLkxtZW1zZXRfZmlsbF9yZXN0Ci0uTG1lbXNldF9maWxsX2xvb3A6Ci0JbXZjCTEoMjU2LCVyMSksMCglcjEpCi0JbGEJJXIxLDI1NiglcjEpCi0JYnJjdAklcjMsLkxtZW1zZXRfZmlsbF9sb29wCi0uTG1lbXNldF9maWxsX3Jlc3Q6Ci0JZXgJJXI0LC5MbWVtc2V0X212Yy0uTG1lbXNldF9iYXNlKCVyNSkKLQlicgklcjE0Ci0uTG1lbXNldF94YzoKLQl4YwkwKDEsJXIxKSwwKCVyMSkKLS5MbWVtc2V0X212YzoKLQltdmMJMSgxLCVyMSksMCglcjEpCi0KLS8qCi0gKiBtZW1jcHkgaW1wbGVtZW50YXRpb24KLSAqCi0gKiB2b2lkICptZW1jcHkodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgbikKLSAqLwotRU5UUlkobWVtY3B5KQotCWJhc3IJJXI1LCVyMAotLkxtZW1jcHlfYmFzZToKLQlsdHIJJXI0LCVyNAotCWJ6cgklcjE0Ci0JYWhpCSVyNCwtMQotCWxyCSVyMCwlcjQKLQlzcmwJJXIwLDgKLQlsdHIJJXIwLCVyMAotCWxyCSVyMSwlcjIKLQlqbnoJLkxtZW1jcHlfbG9vcAotLkxtZW1jcHlfcmVzdDoKLQlleAklcjQsLkxtZW1jcHlfbXZjLS5MbWVtY3B5X2Jhc2UoJXI1KQotCWJyCSVyMTQKLS5MbWVtY3B5X2xvb3A6Ci0JbXZjCTAoMjU2LCVyMSksMCglcjMpCi0JbGEJJXIxLDI1NiglcjEpCi0JbGEJJXIzLDI1NiglcjMpCi0JYnJjdAklcjAsLkxtZW1jcHlfbG9vcAotCWoJLkxtZW1jcHlfcmVzdAotLkxtZW1jcHlfbXZjOgotCW12YwkwKDEsJXIxKSwwKCVyMykKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9saWIvcXJubmQuUyBiL2FyY2gvczM5MC9saWIvcXJubmQuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyMTMyOS4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAvbGliL3Fybm5kLlMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jIFMvMzkwIF9fdWRpdl9xcm5uZAotCi0jaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotCi0jIHIyIDogJl9fcgotIyByMyA6IHVwcGVyIGhhbGYgb2YgNjQgYml0IHdvcmQgbgotIyByNCA6IGxvd2VyIGhhbGYgb2YgNjQgYml0IHdvcmQgbgotIyByNSA6IGRpdmlzb3IgZAotIyB0aGUgcmVtaW5kZXIgciBvZiB0aGUgZGl2aXNpb24gaXMgdG8gYmUgc3RvcmVkIHRvICZfX3IgYW5kCi0jIHRoZSBxdW90aWVudCBxIGlzIHRvIGJlIHJldHVybmVkCi0KLQkudGV4dAotRU5UUlkoX191ZGl2X3Fybm5kKQotCXN0ICAgICVyMiwyNCglcjE1KQkgICMgc3RvcmUgcG9pbnRlciB0byByZW1pbmRlciBmb3IgbGF0ZXIKLQlsciAgICAlcjAsJXIzCQkgICMgcmVsb2FkIG4KLQlsciAgICAlcjEsJXI0Ci0JbHRyICAgJXIyLCVyNQkJICAjIHJlbG9hZCBhbmQgdGVzdCBkaXZpc29yCi0JanAgICAgNWYKLQkjIGRpdmlzb3IgPj0gMHg4MDAwMDAwMAotCXNyZGwgICVyMCwyCQkgICMgbi80Ci0Jc3JsICAgJXIyLDEJCSAgIyBkLzIKLQlzbHIgICAlcjEsJXIyCQkgICMgc3BlY2lhbCBjYXNlIGlmIGxhc3QgYml0IG9mIGQgaXMgc2V0Ci0JYnJjICAgMywwZgkJICAjICAobi80KSBkaXYgKG4vMikgY2FuIG92ZXJmbG93IGJ5IDEKLQlhaGkgICAlcjAsLTEJCSAgIyAgdHJpY2s6IHN1YnRyYWN0IG4vMiwgdGhlbiBkaXZpZGUKLTA6CWRyICAgICVyMCwlcjIJCSAgIyBzaWduZWQgZGl2aXNpb24KLQlhaGkgICAlcjEsMQkJICAjICB0cmljayBwYXJ0IDI6IGFkZCAxIHRvIHRoZSBxdW90aWVudAotCSMgbm93IChuID4+IDIpID0gKGQgPj4gMSkgKiAlcjEgKyAlcjAKLQlsaGkgICAlcjMsMQotCW5yICAgICVyMywlcjEJCSAgIyB0ZXN0IGxhc3QgYml0IG9mIHEKLQlqeiAgICAxZgotCWFsciAgICVyMCwlcjIJCSAgIyBhZGQgKGQ+PjEpIHRvIHIKLTE6CXNybCAgICVyMSwxCQkgICMgcSA+Pj0gMQotCSMgbm93IChuID4+IDIpID0gKGQmLTIpICogJXIxICsgJXIwCi0JbGhpICAgJXIzLDEKLQluciAgICAlcjMsJXI1CQkgICMgdGVzdCBsYXN0IGJpdCBvZiBkCi0JanogICAgMmYKLQlzbHIgICAlcjAsJXIxCQkgICMgciAtPSBxCi0JYnJjICAgMywyZgkJICAjIGJvcnJvdyA/Ci0JYWxyICAgJXIwLCVyNQkJICAjIHIgKz0gZAotCWFoaSAgICVyMSwtMQotMjoJIyBub3cgKG4gPj4gMikgPSBkICogJXIxICsgJXIwCi0JYWxyICAgJXIxLCVyMQkJICAjIHEgPDw9IDEKLQlhbHIgICAlcjAsJXIwCQkgICMgciA8PD0gMQotCWJyYyAgIDEyLDNmCQkgICMgb3ZlcmZsb3cgb24gciA/Ci0Jc2xyICAgJXIwLCVyNQkJICAjIHIgLT0gZAotCWFoaSAgICVyMSwxCQkgICMgcSArPSAxCi0zOglsaGkgICAlcjMsMgotCW5yICAgICVyMywlcjQJCSAgIyB0ZXN0IG5leHQgdG8gbGFzdCBiaXQgb2YgbgotCWp6ICAgIDRmCi0JYWhpICAgJXIwLDEJCSAgIyByICs9IDEKLTQ6CWNsciAgICVyMCwlcjUJCSAgIyByID49IGQgPwotCWpsICAgIDZmCi0Jc2xyICAgJXIwLCVyNQkJICAjIHIgLT0gZAotCWFoaSAgICVyMSwxCQkgICMgcSArPSAxCi0JIyBub3cgKG4gPj4gMSkgPSBkICogJXIxICsgJXIwCi0JaiAgICAgNmYKLTU6CSMgZGl2aXNvciA8IDB4ODAwMDAwMDAKLQlzcmRsICAlcjAsMQotCWRyICAgICVyMCwlcjIJCSAgIyBzaWduZWQgZGl2aXNpb24KLQkjIG5vdyAobiA+PiAxKSA9IGQgKiAlcjEgKyAlcjAKLTY6CWFsciAgICVyMSwlcjEJCSAgIyBxIDw8PSAxCi0JYWxyICAgJXIwLCVyMAkJICAjIHIgPDw9IDEKLQlicmMgICAxMiw3ZgkJICAjIG92ZXJmbG93IG9uIHIgPwotCXNsciAgICVyMCwlcjUJCSAgIyByIC09IGQKLQlhaGkgICAlcjEsMQkJICAjIHEgKz0gMQotNzoJbGhpICAgJXIzLDEKLQluciAgICAlcjMsJXI0CQkgICMgaXNvbGF0ZSBsYXN0IGJpdCBvZiBuCi0JYWxyICAgJXIwLCVyMwkJICAjIHIgKz0gKG4gJiAxKQotCWNsciAgICVyMCwlcjUJCSAgIyByID49IGQgPwotCWpsICAgIDhmCi0Jc2xyICAgJXIwLCVyNQkJICAjIHIgLT0gZAotCWFoaSAgICVyMSwxCQkgICMgcSArPSAxCi04OgkjIG5vdyBuID0gZCAqICVyMSArICVyMAotCWwgICAgICVyMiwyNCglcjE1KQotCXN0ICAgICVyMCwwKCVyMikKLQlsciAgICAlcjIsJXIxCi0JYnIgICAgJXIxNAotCS5lbmQJX191ZGl2X3Fybm5kCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbGliL3VhY2Nlc3MuYyBiL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5jCmluZGV4IDUzZGQ1ZDcuLjQ2MTRkNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5jCisrKyBiL2FyY2gvczM5MC9saWIvdWFjY2Vzcy5jCkBAIC0xNSwyMCArMTUsNiBAQAogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgogI2luY2x1ZGUgPGFzbS9mYWNpbGl0eS5oPgogCi0jaWZuZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBBSEkJImFoaSIKLSNkZWZpbmUgQUxSCSJhbHIiCi0jZGVmaW5lIENMUgkiY2xyIgotI2RlZmluZSBMSEkJImxoaSIKLSNkZWZpbmUgU0xSCSJzbHIiCi0jZWxzZQotI2RlZmluZSBBSEkJImFnaGkiCi0jZGVmaW5lIEFMUgkiYWxnciIKLSNkZWZpbmUgQ0xSCSJjbGdyIgotI2RlZmluZSBMSEkJImxnaGkiCi0jZGVmaW5lIFNMUgkic2xnciIKLSNlbmRpZgotCiBzdGF0aWMgc3RydWN0IHN0YXRpY19rZXkgaGF2ZV9tdmNvcyA9IFNUQVRJQ19LRVlfSU5JVF9GQUxTRTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNvcHlfZnJvbV91c2VyX212Y29zKHZvaWQgKngsIGNvbnN0IHZvaWQgX191c2VyICpwdHIsCkBAIC00MSwyOSArMjcsMjkgQEAKIAlhc20gdm9sYXRpbGUoCiAJCSIwOiAuaW5zbiBzcywweGM4MDAwMDAwMDAwMCwwKCUwLCUyKSwwKCUxKSwwXG4iCiAJCSI5OiBqeiAgICA3ZlxuIgotCQkiMToiQUxSIiAgJTAsJTNcbiIKLQkJIiAgIlNMUiIgICUxLCUzXG4iCi0JCSIgICJTTFIiICAlMiwlM1xuIgorCQkiMTogYWxnciAgJTAsJTNcbiIKKwkJIiAgIHNsZ3IgICUxLCUzXG4iCisJCSIgICBzbGdyICAlMiwlM1xuIgogCQkiICAgaiAgICAgMGJcbiIKIAkJIjI6IGxhICAgICU0LDQwOTUoJTEpXG4iLyogJTQgPSBwdHIgKyA0MDk1ICovCiAJCSIgICBuciAgICAlNCwlM1xuIgkvKiAlNCA9IChwdHIgKyA0MDk1KSAmIC00MDk2ICovCi0JCSIgICJTTFIiICAlNCwlMVxuIgotCQkiICAiQ0xSIiAgJTAsJTRcbiIJLyogY29weSBjcm9zc2VzIG5leHQgcGFnZSBib3VuZGFyeT8gKi8KKwkJIiAgIHNsZ3IgICU0LCUxXG4iCisJCSIgICBjbGdyICAlMCwlNFxuIgkvKiBjb3B5IGNyb3NzZXMgbmV4dCBwYWdlIGJvdW5kYXJ5PyAqLwogCQkiICAgam5oICAgNGZcbiIKIAkJIjM6IC5pbnNuIHNzLDB4YzgwMDAwMDAwMDAwLDAoJTQsJTIpLDAoJTEpLDBcbiIKLQkJIjEwOiJTTFIiICAlMCwlNFxuIgotCQkiICAiQUxSIiAgJTIsJTRcbiIKLQkJIjQ6IkxISSIgICU0LC0xXG4iCi0JCSIgICJBTFIiICAlNCwlMFxuIgkvKiBjb3B5IHJlbWFpbmluZyBzaXplLCBzdWJ0cmFjdCAxICovCisJCSIxMDpzbGdyICAlMCwlNFxuIgorCQkiICAgYWxnciAgJTIsJTRcbiIKKwkJIjQ6IGxnaGkgICU0LC0xXG4iCisJCSIgICBhbGdyICAlNCwlMFxuIgkvKiBjb3B5IHJlbWFpbmluZyBzaXplLCBzdWJ0cmFjdCAxICovCiAJCSIgICBicmFzICAlMyw2ZlxuIgkvKiBtZW1zZXQgbG9vcCAqLwogCQkiICAgeGMgICAgMCgxLCUyKSwwKCUyKVxuIgogCQkiNTogeGMgICAgMCgyNTYsJTIpLDAoJTIpXG4iCiAJCSIgICBsYSAgICAlMiwyNTYoJTIpXG4iCi0JCSI2OiJBSEkiICAlNCwtMjU2XG4iCisJCSI2OiBhZ2hpICAlNCwtMjU2XG4iCiAJCSIgICBqbm0gICA1YlxuIgogCQkiICAgZXggICAgJTQsMCglMylcbiIKIAkJIiAgIGogICAgIDhmXG4iCi0JCSI3OiJTTFIiICAlMCwlMFxuIgorCQkiNzpzbGdyICAlMCwlMFxuIgogCQkiODpcbiIKIAkJRVhfVEFCTEUoMGIsMmIpIEVYX1RBQkxFKDNiLDRiKSBFWF9UQUJMRSg5YiwyYikgRVhfVEFCTEUoMTBiLDRiKQogCQk6ICIrYSIgKHNpemUpLCAiK2EiIChwdHIpLCAiK2EiICh4KSwgIithIiAodG1wMSksICI9YSIgKHRtcDIpCkBAIC04MiwzMiArNjgsMzIgQEAKIAkJIiAgIHNhY2YgIDBcbiIKIAkJIjA6IG12Y3AgIDAoJTAsJTIpLDAoJTEpLCUzXG4iCiAJCSIxMDpqeiAgICA4ZlxuIgotCQkiMToiQUxSIiAgJTAsJTNcbiIKKwkJIjE6IGFsZ3IgICUwLCUzXG4iCiAJCSIgICBsYSAgICAlMSwyNTYoJTEpXG4iCiAJCSIgICBsYSAgICAlMiwyNTYoJTIpXG4iCiAJCSIyOiBtdmNwICAwKCUwLCUyKSwwKCUxKSwlM1xuIgogCQkiMTE6am56ICAgMWJcbiIKIAkJIiAgIGogICAgIDhmXG4iCiAJCSIzOiBsYSAgICAlNCwyNTUoJTEpXG4iCS8qICU0ID0gcHRyICsgMjU1ICovCi0JCSIgICJMSEkiICAlMywtNDA5NlxuIgorCQkiICAgbGdoaSAgJTMsLTQwOTZcbiIKIAkJIiAgIG5yICAgICU0LCUzXG4iCS8qICU0ID0gKHB0ciArIDI1NSkgJiAtNDA5NiAqLwotCQkiICAiU0xSIiAgJTQsJTFcbiIKLQkJIiAgIkNMUiIgICUwLCU0XG4iCS8qIGNvcHkgY3Jvc3NlcyBuZXh0IHBhZ2UgYm91bmRhcnk/ICovCisJCSIgICBzbGdyICAlNCwlMVxuIgorCQkiICAgY2xnciAgJTAsJTRcbiIJLyogY29weSBjcm9zc2VzIG5leHQgcGFnZSBib3VuZGFyeT8gKi8KIAkJIiAgIGpuaCAgIDVmXG4iCiAJCSI0OiBtdmNwICAwKCU0LCUyKSwwKCUxKSwlM1xuIgotCQkiMTI6IlNMUiIgICUwLCU0XG4iCi0JCSIgICJBTFIiICAlMiwlNFxuIgotCQkiNToiTEhJIiAgJTQsLTFcbiIKLQkJIiAgIkFMUiIgICU0LCUwXG4iCS8qIGNvcHkgcmVtYWluaW5nIHNpemUsIHN1YnRyYWN0IDEgKi8KKwkJIjEyOnNsZ3IgICUwLCU0XG4iCisJCSIgICBhbGdyICAlMiwlNFxuIgorCQkiNTogbGdoaSAgJTQsLTFcbiIKKwkJIiAgIGFsZ3IgICU0LCUwXG4iCS8qIGNvcHkgcmVtYWluaW5nIHNpemUsIHN1YnRyYWN0IDEgKi8KIAkJIiAgIGJyYXMgICUzLDdmXG4iCS8qIG1lbXNldCBsb29wICovCiAJCSIgICB4YyAgICAwKDEsJTIpLDAoJTIpXG4iCiAJCSI2OiB4YyAgICAwKDI1NiwlMiksMCglMilcbiIKIAkJIiAgIGxhICAgICUyLDI1NiglMilcbiIKLQkJIjc6IkFISSIgICU0LC0yNTZcbiIKKwkJIjc6IGFnaGkgICU0LC0yNTZcbiIKIAkJIiAgIGpubSAgIDZiXG4iCiAJCSIgICBleCAgICAlNCwwKCUzKVxuIgogCQkiICAgaiAgICAgOWZcbiIKLQkJIjg6IlNMUiIgICUwLCUwXG4iCisJCSI4OnNsZ3IgICUwLCUwXG4iCiAJCSI5OiBzYWNmICA3NjhcbiIKIAkJRVhfVEFCTEUoMGIsM2IpIEVYX1RBQkxFKDJiLDNiKSBFWF9UQUJMRSg0Yiw1YikKIAkJRVhfVEFCTEUoMTBiLDNiKSBFWF9UQUJMRSgxMWIsM2IpIEVYX1RBQkxFKDEyYiw1YikKQEAgLTEzNCwxOSArMTIwLDE5IEBACiAJYXNtIHZvbGF0aWxlKAogCQkiMDogLmluc24gc3MsMHhjODAwMDAwMDAwMDAsMCglMCwlMSksMCglMiksMFxuIgogCQkiNjoganogICAgNGZcbiIKLQkJIjE6IkFMUiIgICUwLCUzXG4iCi0JCSIgICJTTFIiICAlMSwlM1xuIgotCQkiICAiU0xSIiAgJTIsJTNcbiIKKwkJIjE6IGFsZ3IgICUwLCUzXG4iCisJCSIgICBzbGdyICAlMSwlM1xuIgorCQkiICAgc2xnciAgJTIsJTNcbiIKIAkJIiAgIGogICAgIDBiXG4iCiAJCSIyOiBsYSAgICAlNCw0MDk1KCUxKVxuIi8qICU0ID0gcHRyICsgNDA5NSAqLwogCQkiICAgbnIgICAgJTQsJTNcbiIJLyogJTQgPSAocHRyICsgNDA5NSkgJiAtNDA5NiAqLwotCQkiICAiU0xSIiAgJTQsJTFcbiIKLQkJIiAgIkNMUiIgICUwLCU0XG4iCS8qIGNvcHkgY3Jvc3NlcyBuZXh0IHBhZ2UgYm91bmRhcnk/ICovCisJCSIgICBzbGdyICAlNCwlMVxuIgorCQkiICAgY2xnciAgJTAsJTRcbiIJLyogY29weSBjcm9zc2VzIG5leHQgcGFnZSBib3VuZGFyeT8gKi8KIAkJIiAgIGpuaCAgIDVmXG4iCiAJCSIzOiAuaW5zbiBzcywweGM4MDAwMDAwMDAwMCwwKCU0LCUxKSwwKCUyKSwwXG4iCi0JCSI3OiJTTFIiICAlMCwlNFxuIgorCQkiNzogc2xnciAgJTAsJTRcbiIKIAkJIiAgIGogICAgIDVmXG4iCi0JCSI0OiJTTFIiICAlMCwlMFxuIgorCQkiNDogc2xnciAgJTAsJTBcbiIKIAkJIjU6XG4iCiAJCUVYX1RBQkxFKDBiLDJiKSBFWF9UQUJMRSgzYiw1YikgRVhfVEFCTEUoNmIsMmIpIEVYX1RBQkxFKDdiLDViKQogCQk6ICIrYSIgKHNpemUpLCAiK2EiIChwdHIpLCAiK2EiICh4KSwgIithIiAodG1wMSksICI9YSIgKHRtcDIpCkBAIC0xNjUsMjIgKzE1MSwyMiBAQAogCQkiICAgc2FjZiAgMFxuIgogCQkiMDogbXZjcyAgMCglMCwlMSksMCglMiksJTNcbiIKIAkJIjc6IGp6ICAgIDVmXG4iCi0JCSIxOiJBTFIiICAlMCwlM1xuIgorCQkiMTogYWxnciAgJTAsJTNcbiIKIAkJIiAgIGxhICAgICUxLDI1NiglMSlcbiIKIAkJIiAgIGxhICAgICUyLDI1NiglMilcbiIKIAkJIjI6IG12Y3MgIDAoJTAsJTEpLDAoJTIpLCUzXG4iCiAJCSI4OiBqbnogICAxYlxuIgogCQkiICAgaiAgICAgNWZcbiIKIAkJIjM6IGxhICAgICU0LDI1NSglMSlcbiIgLyogJTQgPSBwdHIgKyAyNTUgKi8KLQkJIiAgIkxISSIgICUzLC00MDk2XG4iCisJCSIgICBsZ2hpICAlMywtNDA5NlxuIgogCQkiICAgbnIgICAgJTQsJTNcbiIJLyogJTQgPSAocHRyICsgMjU1KSAmIC00MDk2ICovCi0JCSIgICJTTFIiICAlNCwlMVxuIgotCQkiICAiQ0xSIiAgJTAsJTRcbiIJLyogY29weSBjcm9zc2VzIG5leHQgcGFnZSBib3VuZGFyeT8gKi8KKwkJIiAgIHNsZ3IgICU0LCUxXG4iCisJCSIgICBjbGdyICAlMCwlNFxuIgkvKiBjb3B5IGNyb3NzZXMgbmV4dCBwYWdlIGJvdW5kYXJ5PyAqLwogCQkiICAgam5oICAgNmZcbiIKIAkJIjQ6IG12Y3MgIDAoJTQsJTEpLDAoJTIpLCUzXG4iCi0JCSI5OiJTTFIiICAlMCwlNFxuIgorCQkiOTogc2xnciAgJTAsJTRcbiIKIAkJIiAgIGogICAgIDZmXG4iCi0JCSI1OiJTTFIiICAlMCwlMFxuIgorCQkiNTogc2xnciAgJTAsJTBcbiIKIAkJIjY6IHNhY2YgIDc2OFxuIgogCQlFWF9UQUJMRSgwYiwzYikgRVhfVEFCTEUoMmIsM2IpIEVYX1RBQkxFKDRiLDZiKQogCQlFWF9UQUJMRSg3YiwzYikgRVhfVEFCTEUoOGIsM2IpIEVYX1RBQkxFKDliLDZiKQpAQCAtMjA4LDExICsxOTQsMTEgQEAKIAlhc20gdm9sYXRpbGUoCiAJCSIwOiAuaW5zbiBzcywweGM4MDAwMDAwMDAwMCwwKCUwLCUxKSwwKCUyKSwwXG4iCiAJCSIgICBqegkgIDJmXG4iCi0JCSIxOiJBTFIiICAlMCwlM1xuIgotCQkiICAiU0xSIiAgJTEsJTNcbiIKLQkJIiAgIlNMUiIgICUyLCUzXG4iCisJCSIxOiBhbGdyICAlMCwlM1xuIgorCQkiICAgc2xnciAgJTEsJTNcbiIKKwkJIiAgIHNsZ3IgICUyLCUzXG4iCiAJCSIgICBqCSAgMGJcbiIKLQkJIjI6IlNMUiIgICUwLCUwXG4iCisJCSIyOnNsZ3IgICUwLCUwXG4iCiAJCSIzOiBcbiIKIAkJRVhfVEFCTEUoMGIsM2IpCiAJCTogIithIiAoc2l6ZSksICIrYSIgKHRvKSwgIithIiAoZnJvbSksICIrYSIgKHRtcDEpLCAiPWEiICh0bXAyKQpAQCAtMjI4LDIzICsyMTQsMjMgQEAKIAlsb2FkX2tlcm5lbF9hc2NlKCk7CiAJYXNtIHZvbGF0aWxlKAogCQkiICAgc2FjZiAgMjU2XG4iCi0JCSIgICJBSEkiICAlMCwtMVxuIgorCQkiICAgYWdoaSAgJTAsLTFcbiIKIAkJIiAgIGpvCSAgNWZcbiIKIAkJIiAgIGJyYXMgICUzLDNmXG4iCi0JCSIwOiJBSEkiICAlMCwyNTdcbiIKKwkJIjA6IGFnaGkgICUwLDI1N1xuIgogCQkiMTogbXZjCSAgMCgxLCUxKSwwKCUyKVxuIgogCQkiICAgbGEJICAlMSwxKCUxKVxuIgogCQkiICAgbGEJICAlMiwxKCUyKVxuIgotCQkiICAiQUhJIiAgJTAsLTFcbiIKKwkJIiAgIGFnaGkgICUwLC0xXG4iCiAJCSIgICBqbnoJICAxYlxuIgogCQkiICAgagkgIDVmXG4iCiAJCSIyOiBtdmMJICAwKDI1NiwlMSksMCglMilcbiIKIAkJIiAgIGxhCSAgJTEsMjU2KCUxKVxuIgogCQkiICAgbGEJICAlMiwyNTYoJTIpXG4iCi0JCSIzOiJBSEkiICAlMCwtMjU2XG4iCisJCSIzOiBhZ2hpICAlMCwtMjU2XG4iCiAJCSIgICBqbm0JICAyYlxuIgogCQkiNDogZXgJICAlMCwxYi0wYiglMylcbiIKLQkJIjU6ICJTTFIiICAlMCwlMFxuIgorCQkiNTogc2xnciAgJTAsJTBcbiIKIAkJIjY6IHNhY2YgIDc2OFxuIgogCQlFWF9UQUJMRSgxYiw2YikgRVhfVEFCTEUoMmIsMGIpIEVYX1RBQkxFKDRiLDBiKQogCQk6ICIrYSIgKHNpemUpLCAiK2EiICh0byksICIrYSIgKGZyb20pLCAiPWEiICh0bXAxKQpAQCAtMjY5LDE4ICsyNTUsMTggQEAKIAlhc20gdm9sYXRpbGUoCiAJCSIwOiAuaW5zbiBzcywweGM4MDAwMDAwMDAwMCwwKCUwLCUxKSwwKCU0KSwwXG4iCiAJCSIgICBqegkgIDRmXG4iCi0JCSIxOiJBTFIiICAlMCwlMlxuIgotCQkiICAiU0xSIiAgJTEsJTJcbiIKKwkJIjE6IGFsZ3IgICUwLCUyXG4iCisJCSIgICBzbGdyICAlMSwlMlxuIgogCQkiICAgagkgIDBiXG4iCiAJCSIyOiBsYQkgICUzLDQwOTUoJTEpXG4iLyogJTQgPSB0byArIDQwOTUgKi8KIAkJIiAgIG5yCSAgJTMsJTJcbiIJLyogJTQgPSAodG8gKyA0MDk1KSAmIC00MDk2ICovCi0JCSIgICJTTFIiICAlMywlMVxuIgotCQkiICAiQ0xSIiAgJTAsJTNcbiIJLyogY29weSBjcm9zc2VzIG5leHQgcGFnZSBib3VuZGFyeT8gKi8KKwkJIiAgIHNsZ3IgICUzLCUxXG4iCisJCSIgICBjbGdyICAlMCwlM1xuIgkvKiBjb3B5IGNyb3NzZXMgbmV4dCBwYWdlIGJvdW5kYXJ5PyAqLwogCQkiICAgam5oCSAgNWZcbiIKIAkJIjM6IC5pbnNuIHNzLDB4YzgwMDAwMDAwMDAwLDAoJTMsJTEpLDAoJTQpLDBcbiIKLQkJIiAgIlNMUiIgICUwLCUzXG4iCisJCSIgICBzbGdyICAlMCwlM1xuIgogCQkiICAgagkgIDVmXG4iCi0JCSI0OiJTTFIiICAlMCwlMFxuIgorCQkiNDpzbGdyICAlMCwlMFxuIgogCQkiNTpcbiIKIAkJRVhfVEFCTEUoMGIsMmIpIEVYX1RBQkxFKDNiLDViKQogCQk6ICIrYSIgKHNpemUpLCAiK2EiICh0byksICIrYSIgKHRtcDEpLCAiPWEiICh0bXAyKQpAQCAtMjk1LDI4ICsyODEsMjggQEAKIAlsb2FkX2tlcm5lbF9hc2NlKCk7CiAJYXNtIHZvbGF0aWxlKAogCQkiICAgc2FjZiAgMjU2XG4iCi0JCSIgICJBSEkiICAlMCwtMVxuIgorCQkiICAgYWdoaSAgJTAsLTFcbiIKIAkJIiAgIGpvICAgIDVmXG4iCiAJCSIgICBicmFzICAlMywzZlxuIgogCQkiICAgeGMgICAgMCgxLCUxKSwwKCUxKVxuIgotCQkiMDoiQUhJIiAgJTAsMjU3XG4iCisJCSIwOiBhZ2hpICAlMCwyNTdcbiIKIAkJIiAgIGxhICAgICUyLDI1NSglMSlcbiIgLyogJTIgPSBwdHIgKyAyNTUgKi8KIAkJIiAgIHNybCAgICUyLDEyXG4iCiAJCSIgICBzbGwgICAlMiwxMlxuIgkvKiAlMiA9IChwdHIgKyAyNTUpICYgLTQwOTYgKi8KLQkJIiAgIlNMUiIgICUyLCUxXG4iCi0JCSIgICJDTFIiICAlMCwlMlxuIgkvKiBjbGVhciBjcm9zc2VzIG5leHQgcGFnZSBib3VuZGFyeT8gKi8KKwkJIiAgIHNsZ3IgICUyLCUxXG4iCisJCSIgICBjbGdyICAlMCwlMlxuIgkvKiBjbGVhciBjcm9zc2VzIG5leHQgcGFnZSBib3VuZGFyeT8gKi8KIAkJIiAgIGpuaCAgIDVmXG4iCi0JCSIgICJBSEkiICAlMiwtMVxuIgorCQkiICAgYWdoaSAgJTIsLTFcbiIKIAkJIjE6IGV4ICAgICUyLDAoJTMpXG4iCi0JCSIgICJBSEkiICAlMiwxXG4iCi0JCSIgICJTTFIiICAlMCwlMlxuIgorCQkiICAgYWdoaSAgJTIsMVxuIgorCQkiICAgc2xnciAgJTAsJTJcbiIKIAkJIiAgIGogICAgIDVmXG4iCiAJCSIyOiB4YyAgICAwKDI1NiwlMSksMCglMSlcbiIKIAkJIiAgIGxhICAgICUxLDI1NiglMSlcbiIKLQkJIjM6IkFISSIgICUwLC0yNTZcbiIKKwkJIjM6IGFnaGkgICUwLC0yNTZcbiIKIAkJIiAgIGpubSAgIDJiXG4iCiAJCSI0OiBleCAgICAlMCwwKCUzKVxuIgotCQkiNTogIlNMUiIgICUwLCUwXG4iCisJCSI1OiBzbGdyICAlMCwlMFxuIgogCQkiNjogc2FjZiAgNzY4XG4iCiAJCUVYX1RBQkxFKDFiLDZiKSBFWF9UQUJMRSgyYiwwYikgRVhfVEFCTEUoNGIsMGIpCiAJCTogIithIiAoc2l6ZSksICIrYSIgKHRvKSwgIj1hIiAodG1wMSksICI9YSIgKHRtcDIpCkBAIC0zNDEsMTIgKzMyNywxMiBAQAogCWFzbSB2b2xhdGlsZSgKIAkJIiAgIGxhICAgICUyLDAoJTEpXG4iCiAJCSIgICBsYSAgICAlMywwKCUwLCUxKVxuIgotCQkiICAiU0xSIiAgJTAsJTBcbiIKKwkJIiAgIHNsZ3IgICUwLCUwXG4iCiAJCSIgICBzYWNmICAyNTZcbiIKIAkJIjA6IHNyc3QgICUzLCUyXG4iCiAJCSIgICBqbyAgICAwYlxuIgogCQkiICAgbGEgICAgJTAsMSglMylcbiIJLyogc3Rybmxlbl91c2VyIHJlc3VsdHMgaW5jbHVkZXMgXDAgKi8KLQkJIiAgIlNMUiIgICUwLCUxXG4iCisJCSIgICBzbGdyICAlMCwlMVxuIgogCQkiMTogc2FjZiAgNzY4XG4iCiAJCUVYX1RBQkxFKDBiLDFiKQogCQk6ICIrYSIgKHNpemUpLCAiK2EiIChzcmMpLCAiPWEiICh0bXAxKSwgIj1hIiAodG1wMikKQEAgLTM5OSw3ICszODUsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB1YWNjZXNzX2luaXQodm9pZCkKIHsKLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfNjRCSVQpICYmICF1YWNjZXNzX3ByaW1hcnkgJiYgdGVzdF9mYWNpbGl0eSgyNykpCisJaWYgKCF1YWNjZXNzX3ByaW1hcnkgJiYgdGVzdF9mYWNpbGl0eSgyNykpCiAJCXN0YXRpY19rZXlfc2xvd19pbmMoJmhhdmVfbXZjb3MpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2xpYi91Y21wZGkyLmMgYi9hcmNoL3MzOTAvbGliL3VjbXBkaTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UwNWZmNS4uMDAwMDAwMAotLS0gYS9hcmNoL3MzOTAvbGliL3VjbXBkaTIuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQotdW5pb24gdWxsX3VuaW9uIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdWxsOwotCXN0cnVjdCB7Ci0JCXVuc2lnbmVkIGludCBoaWdoOwotCQl1bnNpZ25lZCBpbnQgbG93OwotCX0gdWk7Ci19OwotCi1pbnQgX191Y21wZGkyKHVuc2lnbmVkIGxvbmcgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGxvbmcgYikKLXsKLQl1bmlvbiB1bGxfdW5pb24gYXUgPSB7LnVsbCA9IGF9OwotCXVuaW9uIHVsbF91bmlvbiBidSA9IHsudWxsID0gYn07Ci0KLQlpZiAoYXUudWkuaGlnaCA8IGJ1LnVpLmhpZ2gpCi0JCXJldHVybiAwOwotCWVsc2UgaWYgKGF1LnVpLmhpZ2ggPiBidS51aS5oaWdoKQotCQlyZXR1cm4gMjsKLQlpZiAoYXUudWkubG93IDwgYnUudWkubG93KQotCQlyZXR1cm4gMDsKLQllbHNlIGlmIChhdS51aS5sb3cgPiBidS51aS5sb3cpCi0JCXJldHVybiAyOwotCXJldHVybiAxOwotfQotRVhQT1JUX1NZTUJPTChfX3VjbXBkaTIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21hdGgtZW11L01ha2VmaWxlIGIvYXJjaC9zMzkwL21hdGgtZW11L01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWQzOTk1Li4wMDAwMDAwCi0tLSBhL2FyY2gvczM5MC9tYXRoLWVtdS9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIEZQVSBpbnN0cnVjdGlvbiBlbXVsYXRpb24uCi0jCi0KLW9iai0kKENPTkZJR19NQVRIRU1VKSA6PSBtYXRoLm8KLQotY2NmbGFncy15IDo9IC1JJChzcmMpIC1JaW5jbHVkZS9tYXRoLWVtdSAtdwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21hdGgtZW11L21hdGguYyBiL2FyY2gvczM5MC9tYXRoLWVtdS9tYXRoLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YmEwZDcuLjAwMDAwMDAKLS0tIGEvYXJjaC9zMzkwL21hdGgtZW11L21hdGguYworKysgL2Rldi9udWxsCkBAIC0xLDIyNTUgKzAsMCBAQAotLyoKLSAqICBTMzkwIHZlcnNpb24KLSAqICAgIENvcHlyaWdodCBJQk0gQ29ycC4gMTk5OSwgMjAwMQotICogICAgQXV0aG9yKHMpOiBNYXJ0aW4gU2Nod2lkZWZza3kgKHNjaHdpZGVmc2t5QGRlLmlibS5jb20pLAotICoKLSAqICdtYXRoLmMnIGVtdWxhdGVzIElFRUUgaW5zdHJ1Y3Rpb25zIG9uIGEgUzM5MCBwcm9jZXNzb3IKLSAqICAgICAgICAgIHRoYXQgZG9lcyBub3QgaGF2ZSB0aGUgSUVFRSBmcHUgKGFsbCBwcm9jZXNzb3JzIGJlZm9yZSBHNSkuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2xvd2NvcmUuaD4KLQotI2luY2x1ZGUgPGFzbS9zZnAtdXRpbC5oPgotI2luY2x1ZGUgPG1hdGgtZW11L3NvZnQtZnAuaD4KLSNpbmNsdWRlIDxtYXRoLWVtdS9zaW5nbGUuaD4KLSNpbmNsdWRlIDxtYXRoLWVtdS9kb3VibGUuaD4KLSNpbmNsdWRlIDxtYXRoLWVtdS9xdWFkLmg+Ci0KLSNkZWZpbmUgRlBDX1ZBTElEX01BU0sJCTB4RjhGOEZGMDMKLQotLyoKLSAqIEkgbWlzcyBhIG1hY3JvIHRvIHJvdW5kIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRvIHRoZQotICogbmVhcmVzdCBpbnRlZ2VyIGluIHRoZSBzYW1lIGZsb2F0aW5nIHBvaW50IGZvcm1hdC4KLSAqLwotI2RlZmluZSBfRlBfVE9fRlBJTlRfUk9VTkQoZnMsIHdjLCBYKQkJCQkJXAotICBkbyB7CQkJCQkJCQkJXAotICAgIHN3aXRjaCAoWCMjX2MpCQkJCQkJCVwKLSAgICAgIHsJCQkJCQkJCQlcCi0gICAgICBjYXNlIEZQX0NMU19OT1JNQUw6CQkJCQkJXAotICAgICAgICBpZiAoWCMjX2UgPiBfRlBfRlJBQ0JJVFNfIyNmcyArIF9GUF9FWFBCSUFTXyMjZnMpCQlcCi0gICAgICAgICAgeyAvKiBmbG9hdGluZyBwb2ludCBudW1iZXIgaGFzIG5vIGJpdHMgYWZ0ZXIgdGhlIGRvdC4gKi8JXAotICAgICAgICAgIH0JCQkJCQkJCVwKLSAgICAgICAgZWxzZSBpZiAoWCMjX2UgPD0gX0ZQX0ZSQUNCSVRTXyMjZnMgKyBfRlBfRVhQQklBU18jI2ZzICYmCVwKLSAgICAgICAgICAgICAgICAgWCMjX2UgPiBfRlBfRVhQQklBU18jI2ZzKQkJCQlcCi0JICB7IC8qIHNvbWUgYml0cyBiZWZvcmUgdGhlIGRvdCwgc29tZSBhZnRlciBpdC4gKi8JCVwKLSAgICAgICAgICAgIF9GUF9GUkFDX1NSU18jI3djKFgsIF9GUF9XRlJBQ0JJVFNfIyNmcywJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYIyNfZSAtIF9GUF9FWFBCSUFTXyMjZnMJCQlcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9GUF9GUkFDQklUU18jI2ZzKTsJCQlcCi0JICAgIF9GUF9ST1VORCh3YywgWCk7CQkJCQkJXAotCSAgICBfRlBfRlJBQ19TTExfIyN3YyhYLCBYIyNfZSAtIF9GUF9FWFBCSUFTXyMjZnMJCVwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgX0ZQX0ZSQUNCSVRTXyMjZnMpOwkJCVwKLSAgICAgICAgICB9CQkJCQkJCQlcCi0gICAgICAgIGVsc2UJCQkJCQkJCVwKLSAgICAgICAgICB7IC8qIGFsbCBiaXRzIGFmdGVyIHRoZSBkb3QuICovCQkJCVwKLQkgICAgRlBfU0VUX0VYQ0VQVElPTihGUF9FWF9JTkVYQUNUKTsJCQkJXAotICAgICAgICAgICAgWCMjX2MgPSBGUF9DTFNfWkVSTzsJCQkJCVwKLQkgIH0JCQkJCQkJCVwKLSAgICAgICAgYnJlYWs7CQkJCQkJCQlcCi0gICAgICBjYXNlIEZQX0NMU19OQU46CQkJCQkJCVwKLSAgICAgIGNhc2UgRlBfQ0xTX0lORjoJCQkJCQkJXAotICAgICAgY2FzZSBGUF9DTFNfWkVSTzoJCQkJCQkJXAotICAgICAgICBicmVhazsJCQkJCQkJCVwKLSAgICAgIH0JCQkJCQkJCQlcCi0gIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgRlBfVE9fRlBJTlRfUk9VTkRfUyhYKQlfRlBfVE9fRlBJTlRfUk9VTkQoUywxLFgpCi0jZGVmaW5lIEZQX1RPX0ZQSU5UX1JPVU5EX0QoWCkJX0ZQX1RPX0ZQSU5UX1JPVU5EKEQsMixYKQotI2RlZmluZSBGUF9UT19GUElOVF9ST1VORF9RKFgpCV9GUF9UT19GUElOVF9ST1VORChRLDQsWCkKLQotdHlwZWRlZiB1bmlvbiB7Ci0gICAgICAgIGxvbmcgZG91YmxlIGxkOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgICAgIF9fdTY0IGhpZ2g7Ci0gICAgICAgICAgICAgICAgX191NjQgbG93OwotICAgICAgICB9IHc7Ci19IG1hdGhlbXVfbGRjdjsKLQotI2lmZGVmIENPTkZJR19TWVNDVEwKLWludCBzeXNjdGxfaWVlZV9lbXVsYXRpb25fd2FybmluZ3M9MTsKLSNlbmRpZgotCi0jZGVmaW5lIG1hdGhlbXVfcHV0X3VzZXIoeCwgcCkgXAotICAgICAgICBkbyB7IFwKLSAgICAgICAgICAgICAgICBpZiAocHV0X3VzZXIoKHgpLChwKSkpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTSUdTRUdWOyBcCi0gICAgICAgIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgbWF0aGVtdV9nZXRfdXNlcih4LCBwKSBcCi0gICAgICAgIGRvIHsgXAotICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcigoeCksKHApKSkgXAotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNJR1NFR1Y7IFwKLSAgICAgICAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBtYXRoZW11X2NvcHlfZnJvbV91c2VyKGQsIHMsIG4pXAotICAgICAgICBkbyB7IFwKLSAgICAgICAgICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIoKGQpLChzKSwobikpICE9IDApIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTSUdTRUdWOyBcCi0gICAgICAgIH0gd2hpbGUgKDApCi0KLSNkZWZpbmUgbWF0aGVtdV9jb3B5X3RvX3VzZXIoZCwgcywgbikgXAotICAgICAgICBkbyB7IFwKLSAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKChkKSwocyksKG4pKSAhPSAwKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0lHU0VHVjsgXAotICAgICAgICB9IHdoaWxlICgwKQotCi1zdGF0aWMgdm9pZCBkaXNwbGF5X2VtdWxhdGlvbl9ub3RfaW1wbGVtZW50ZWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGNoYXIgKmluc3RyKQotewotICAgICAgICBfX3UxNiAqbG9jYXRpb247Ci0gICAgICAgIAotI2lmZGVmIENPTkZJR19TWVNDVEwKLSAgICAgICAgaWYoc3lzY3RsX2llZWVfZW11bGF0aW9uX3dhcm5pbmdzKQotI2VuZGlmCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IChfX3UxNiAqKShyZWdzLT5wc3cuYWRkci1TMzkwX2xvd2NvcmUucGdtX2lsYyk7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKCIlcyBpZWVlIGZwdSBpbnN0cnVjdGlvbiBub3QgZW11bGF0ZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAicHJvY2VzcyBuYW1lOiAlcyBwaWQ6ICVkIFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW5zdHIsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRrKCIlcydzIFBTVzogICAgJTA4bHggJTA4bHhcbiIsIGluc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgcmVncy0+cHN3Lm1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBsb2NhdGlvbik7Ci0gICAgICAgIH0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGVtdV9zZXRfQ0MgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY2MpCi17Ci0gICAgICAgIHJlZ3MtPnBzdy5tYXNrID0gKHJlZ3MtPnBzdy5tYXNrICYgMHhGRkZGQ0ZGRikgfCAoKGNjJjMpIDw8IDEyKTsKLX0KLQotLyoKLSAqIFNldCB0aGUgY29uZGl0aW9uIGNvZGUgaW4gdGhlIHVzZXIgcHN3LgotICogIDAgOiBSZXN1bHQgaXMgemVybwotICogIDEgOiBSZXN1bHQgaXMgbGVzcyB0aGFuIHplcm8KLSAqICAyIDogUmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiB6ZXJvCi0gKiAgMyA6IFJlc3VsdCBpcyBOYU4gb3IgSU5GCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbXVfc2V0X0NDX2NzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgY2xhc3MsIGludCBzaWduKQotewotICAgICAgICBzd2l0Y2ggKGNsYXNzKSB7Ci0gICAgICAgIGNhc2UgRlBfQ0xTX05PUk1BTDoKLSAgICAgICAgY2FzZSBGUF9DTFNfSU5GOgotICAgICAgICAgICAgICAgIGVtdV9zZXRfQ0MocmVncywgc2lnbiA/IDEgOiAyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGUF9DTFNfWkVSTzoKLSAgICAgICAgICAgICAgICBlbXVfc2V0X0NDKHJlZ3MsIDApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZQX0NMU19OQU46Ci0gICAgICAgICAgICAgICAgZW11X3NldF9DQyhyZWdzLCAzKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotfQotCi0vKiBBZGQgbG9uZyBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2F4YnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX1EoUUEpOyBGUF9ERUNMX1EoUUIpOyBGUF9ERUNMX1EoUVIpOwotICAgICAgICBGUF9ERUNMX0VYOwotCW1hdGhlbXVfbGRjdiBjdnQ7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIGN2dC53LmhpZ2ggPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS51aTsKLSAgICAgICAgY3Z0LncubG93ID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeCsyXS51aTsKLSAgICAgICAgRlBfVU5QQUNLX1FQKFFBLCAmY3Z0LmxkKTsKLSAgICAgICAgY3Z0LncuaGlnaCA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLnVpOwotICAgICAgICBjdnQudy5sb3cgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5KzJdLnVpOwotICAgICAgICBGUF9VTlBBQ0tfUVAoUUIsICZjdnQubGQpOwotICAgICAgICBGUF9BRERfUShRUiwgUUEsIFFCKTsKLSAgICAgICAgRlBfUEFDS19RUCgmY3Z0LmxkLCBRUik7Ci0gICAgICAgIGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpID0gY3Z0LncuaGlnaDsKLSAgICAgICAgY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeCsyXS51aSA9IGN2dC53LmxvdzsKLSAgICAgICAgZW11X3NldF9DQ19jcyhyZWdzLCBRUl9jLCBRUl9zKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIEFkZCBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2FkYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX0QoREEpOyBGUF9ERUNMX0QoREIpOyBGUF9ERUNMX0QoRFIpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kKTsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERCLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0uZCk7Ci0gICAgICAgIEZQX0FERF9EKERSLCBEQSwgREIpOwotCUZQX1BBQ0tfRFAoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmQsIERSKTsKLSAgICAgICAgZW11X3NldF9DQ19jcyhyZWdzLCBEUl9jLCBEUl9zKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIEFkZCBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2FkYiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgZG91YmxlICp2YWwpIHsKLSAgICAgICAgRlBfREVDTF9EKERBKTsgRlBfREVDTF9EKERCKTsgRlBfREVDTF9EKERSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERBLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZCk7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQiwgdmFsKTsKLSAgICAgICAgRlBfQUREX0QoRFIsIERBLCBEQik7Ci0JRlBfUEFDS19EUCgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZCwgRFIpOwotICAgICAgICBlbXVfc2V0X0NDX2NzKHJlZ3MsIERSX2MsIERSX3MpOwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogQWRkIGZsb2F0ICovCi1zdGF0aWMgaW50IGVtdV9hZWJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9TKFNCKTsgRlBfREVDTF9TKFNSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgRlBfVU5QQUNLX1NQKFNBLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZik7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQiwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmYpOwotICAgICAgICBGUF9BRERfUyhTUiwgU0EsIFNCKTsKLQlGUF9QQUNLX1NQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mLCBTUik7Ci0gICAgICAgIGVtdV9zZXRfQ0NfY3MocmVncywgU1JfYywgU1Jfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBBZGQgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2FlYiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgZmxvYXQgKnZhbCkgewotICAgICAgICBGUF9ERUNMX1MoU0EpOyBGUF9ERUNMX1MoU0IpOyBGUF9ERUNMX1MoU1IpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mKTsKLSAgICAgICAgRlBfVU5QQUNLX1NQKFNCLCB2YWwpOwotICAgICAgICBGUF9BRERfUyhTUiwgU0EsIFNCKTsKLQlGUF9QQUNLX1NQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mLCBTUik7Ci0gICAgICAgIGVtdV9zZXRfQ0NfY3MocmVncywgU1JfYywgU1Jfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBDb21wYXJlIGxvbmcgZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV9jeGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9RKFFBKTsgRlBfREVDTF9RKFFCKTsKLQltYXRoZW11X2xkY3YgY3Z0OwotICAgICAgICBpbnQgSVI7Ci0KLSAgICAgICAgY3Z0LncuaGlnaCA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpOwotICAgICAgICBjdnQudy5sb3cgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpOwotICAgICAgICBGUF9VTlBBQ0tfUkFXX1FQKFFBLCAmY3Z0LmxkKTsKLSAgICAgICAgY3Z0LncuaGlnaCA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLnVpOwotICAgICAgICBjdnQudy5sb3cgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5KzJdLnVpOwotICAgICAgICBGUF9VTlBBQ0tfUkFXX1FQKFFCLCAmY3Z0LmxkKTsKLSAgICAgICAgRlBfQ01QX1EoSVIsIFFBLCBRQiwgMyk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElSID09IC0xIGlmIERBIDwgREIsIElSID09IDAgaWYgREEgPT0gREIsCi0gICAgICAgICAqIElSID09IDEgaWYgREEgPiBEQiBhbmQgSVIgPT0gMyBpZiB1bm9yZGVyZGVkCi0gICAgICAgICAqLwotICAgICAgICBlbXVfc2V0X0NDKHJlZ3MsIChJUiA9PSAtMSkgPyAxIDogKElSID09IDEpID8gMiA6IElSKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbXBhcmUgZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV9jZGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9EKERBKTsgRlBfREVDTF9EKERCKTsKLSAgICAgICAgaW50IElSOwotCi0gICAgICAgIEZQX1VOUEFDS19SQVdfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kKTsKLSAgICAgICAgRlBfVU5QQUNLX1JBV19EUChEQiwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmQpOwotICAgICAgICBGUF9DTVBfRChJUiwgREEsIERCLCAzKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogSVIgPT0gLTEgaWYgREEgPCBEQiwgSVIgPT0gMCBpZiBEQSA9PSBEQiwKLSAgICAgICAgICogSVIgPT0gMSBpZiBEQSA+IERCIGFuZCBJUiA9PSAzIGlmIHVub3JkZXJkZWQKLSAgICAgICAgICovCi0gICAgICAgIGVtdV9zZXRfQ0MocmVncywgKElSID09IC0xKSA/IDEgOiAoSVIgPT0gMSkgPyAyIDogSVIpOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotLyogQ29tcGFyZSBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2NkYiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgZG91YmxlICp2YWwpIHsKLSAgICAgICAgRlBfREVDTF9EKERBKTsgRlBfREVDTF9EKERCKTsKLSAgICAgICAgaW50IElSOwotCi0gICAgICAgIEZQX1VOUEFDS19SQVdfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kKTsKLSAgICAgICAgRlBfVU5QQUNLX1JBV19EUChEQiwgdmFsKTsKLSAgICAgICAgRlBfQ01QX0QoSVIsIERBLCBEQiwgMyk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElSID09IC0xIGlmIERBIDwgREIsIElSID09IDAgaWYgREEgPT0gREIsCi0gICAgICAgICAqIElSID09IDEgaWYgREEgPiBEQiBhbmQgSVIgPT0gMyBpZiB1bm9yZGVyZGVkCi0gICAgICAgICAqLwotICAgICAgICBlbXVfc2V0X0NDKHJlZ3MsIChJUiA9PSAtMSkgPyAxIDogKElSID09IDEpID8gMiA6IElSKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbXBhcmUgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2NlYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX1MoU0EpOyBGUF9ERUNMX1MoU0IpOwotICAgICAgICBpbnQgSVI7Ci0KLSAgICAgICAgRlBfVU5QQUNLX1JBV19TUChTQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmYpOwotICAgICAgICBGUF9VTlBBQ0tfUkFXX1NQKFNCLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0uZik7Ci0gICAgICAgIEZQX0NNUF9TKElSLCBTQSwgU0IsIDMpOwotICAgICAgICAvKgotICAgICAgICAgKiBJUiA9PSAtMSBpZiBEQSA8IERCLCBJUiA9PSAwIGlmIERBID09IERCLAotICAgICAgICAgKiBJUiA9PSAxIGlmIERBID4gREIgYW5kIElSID09IDMgaWYgdW5vcmRlcmRlZAotICAgICAgICAgKi8KLSAgICAgICAgZW11X3NldF9DQyhyZWdzLCAoSVIgPT0gLTEpID8gMSA6IChJUiA9PSAxKSA/IDIgOiBJUik7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0vKiBDb21wYXJlIGZsb2F0ICovCi1zdGF0aWMgaW50IGVtdV9jZWIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGZsb2F0ICp2YWwpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9TKFNCKTsKLSAgICAgICAgaW50IElSOwotCi0gICAgICAgIEZQX1VOUEFDS19SQVdfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mKTsKLSAgICAgICAgRlBfVU5QQUNLX1JBV19TUChTQiwgdmFsKTsKLSAgICAgICAgRlBfQ01QX1MoSVIsIFNBLCBTQiwgMyk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElSID09IC0xIGlmIERBIDwgREIsIElSID09IDAgaWYgREEgPT0gREIsCi0gICAgICAgICAqIElSID09IDEgaWYgREEgPiBEQiBhbmQgSVIgPT0gMyBpZiB1bm9yZGVyZGVkCi0gICAgICAgICAqLwotICAgICAgICBlbXVfc2V0X0NDKHJlZ3MsIChJUiA9PSAtMSkgPyAxIDogKElSID09IDEpID8gMiA6IElSKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8qIENvbXBhcmUgYW5kIHNpZ25hbCBsb25nIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfa3hiciAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgaW50IHJ5KSB7Ci0gICAgICAgIEZQX0RFQ0xfUShRQSk7IEZQX0RFQ0xfUShRQik7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0JbWF0aGVtdV9sZGN2IGN2dDsKLSAgICAgICAgaW50IElSOwotCi0gICAgICAgIGN2dC53LmhpZ2ggPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS51aTsKLSAgICAgICAgY3Z0LncubG93ID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeCsyXS51aTsKLSAgICAgICAgRlBfVU5QQUNLX1JBV19RUChRQSwgJmN2dC5sZCk7Ci0gICAgICAgIGN2dC53LmhpZ2ggPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS51aTsKLSAgICAgICAgY3Z0LncubG93ID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeSsyXS51aTsKLSAgICAgICAgRlBfVU5QQUNLX1FQKFFCLCAmY3Z0LmxkKTsKLSAgICAgICAgRlBfQ01QX1EoSVIsIFFBLCBRQiwgMyk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElSID09IC0xIGlmIERBIDwgREIsIElSID09IDAgaWYgREEgPT0gREIsCi0gICAgICAgICAqIElSID09IDEgaWYgREEgPiBEQiBhbmQgSVIgPT0gMyBpZiB1bm9yZGVyZGVkCi0gICAgICAgICAqLwotICAgICAgICBlbXVfc2V0X0NDKHJlZ3MsIChJUiA9PSAtMSkgPyAxIDogKElSID09IDEpID8gMiA6IElSKTsKLSAgICAgICAgaWYgKElSID09IDMpCi0gICAgICAgICAgICAgICAgRlBfU0VUX0VYQ0VQVElPTiAoRlBfRVhfSU5WQUxJRCk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBDb21wYXJlIGFuZCBzaWduYWwgZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV9rZGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9EKERBKTsgRlBfREVDTF9EKERCKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgaW50IElSOwotCi0gICAgICAgIEZQX1VOUEFDS19SQVdfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kKTsKLSAgICAgICAgRlBfVU5QQUNLX1JBV19EUChEQiwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmQpOwotICAgICAgICBGUF9DTVBfRChJUiwgREEsIERCLCAzKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogSVIgPT0gLTEgaWYgREEgPCBEQiwgSVIgPT0gMCBpZiBEQSA9PSBEQiwKLSAgICAgICAgICogSVIgPT0gMSBpZiBEQSA+IERCIGFuZCBJUiA9PSAzIGlmIHVub3JkZXJkZWQKLSAgICAgICAgICovCi0gICAgICAgIGVtdV9zZXRfQ0MocmVncywgKElSID09IC0xKSA/IDEgOiAoSVIgPT0gMSkgPyAyIDogSVIpOwotICAgICAgICBpZiAoSVIgPT0gMykKLSAgICAgICAgICAgICAgICBGUF9TRVRfRVhDRVBUSU9OIChGUF9FWF9JTlZBTElEKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIENvbXBhcmUgYW5kIHNpZ25hbCBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2tkYiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgZG91YmxlICp2YWwpIHsKLSAgICAgICAgRlBfREVDTF9EKERBKTsgRlBfREVDTF9EKERCKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgaW50IElSOwotCi0gICAgICAgIEZQX1VOUEFDS19SQVdfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kKTsKLSAgICAgICAgRlBfVU5QQUNLX1JBV19EUChEQiwgdmFsKTsKLSAgICAgICAgRlBfQ01QX0QoSVIsIERBLCBEQiwgMyk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElSID09IC0xIGlmIERBIDwgREIsIElSID09IDAgaWYgREEgPT0gREIsCi0gICAgICAgICAqIElSID09IDEgaWYgREEgPiBEQiBhbmQgSVIgPT0gMyBpZiB1bm9yZGVyZGVkCi0gICAgICAgICAqLwotICAgICAgICBlbXVfc2V0X0NDKHJlZ3MsIChJUiA9PSAtMSkgPyAxIDogKElSID09IDEpID8gMiA6IElSKTsKLSAgICAgICAgaWYgKElSID09IDMpCi0gICAgICAgICAgICAgICAgRlBfU0VUX0VYQ0VQVElPTiAoRlBfRVhfSU5WQUxJRCk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBDb21wYXJlIGFuZCBzaWduYWwgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2tlYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX1MoU0EpOyBGUF9ERUNMX1MoU0IpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgSVI7Ci0KLSAgICAgICAgRlBfVU5QQUNLX1JBV19TUChTQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmYpOwotICAgICAgICBGUF9VTlBBQ0tfUkFXX1NQKFNCLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0uZik7Ci0gICAgICAgIEZQX0NNUF9TKElSLCBTQSwgU0IsIDMpOwotICAgICAgICAvKgotICAgICAgICAgKiBJUiA9PSAtMSBpZiBEQSA8IERCLCBJUiA9PSAwIGlmIERBID09IERCLAotICAgICAgICAgKiBJUiA9PSAxIGlmIERBID4gREIgYW5kIElSID09IDMgaWYgdW5vcmRlcmRlZAotICAgICAgICAgKi8KLSAgICAgICAgZW11X3NldF9DQyhyZWdzLCAoSVIgPT0gLTEpID8gMSA6IChJUiA9PSAxKSA/IDIgOiBJUik7Ci0gICAgICAgIGlmIChJUiA9PSAzKQotICAgICAgICAgICAgICAgIEZQX1NFVF9FWENFUFRJT04gKEZQX0VYX0lOVkFMSUQpOwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogQ29tcGFyZSBhbmQgc2lnbmFsIGZsb2F0ICovCi1zdGF0aWMgaW50IGVtdV9rZWIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGZsb2F0ICp2YWwpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9TKFNCKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgaW50IElSOwotCi0gICAgICAgIEZQX1VOUEFDS19SQVdfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mKTsKLSAgICAgICAgRlBfVU5QQUNLX1JBV19TUChTQiwgdmFsKTsKLSAgICAgICAgRlBfQ01QX1MoSVIsIFNBLCBTQiwgMyk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIElSID09IC0xIGlmIERBIDwgREIsIElSID09IDAgaWYgREEgPT0gREIsCi0gICAgICAgICAqIElSID09IDEgaWYgREEgPiBEQiBhbmQgSVIgPT0gMyBpZiB1bm9yZGVyZGVkCi0gICAgICAgICAqLwotICAgICAgICBlbXVfc2V0X0NDKHJlZ3MsIChJUiA9PSAtMSkgPyAxIDogKElSID09IDEpID8gMiA6IElSKTsKLSAgICAgICAgaWYgKElSID09IDMpCi0gICAgICAgICAgICAgICAgRlBfU0VUX0VYQ0VQVElPTiAoRlBfRVhfSU5WQUxJRCk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBDb252ZXJ0IGZyb20gZml4ZWQgbG9uZyBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2N4ZmJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9RKFFSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLQltYXRoZW11X2xkY3YgY3Z0OwotICAgICAgICBfX3MzMiBzaTsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgc2kgPSByZWdzLT5ncHJzW3J5XTsKLSAgICAgICAgRlBfRlJPTV9JTlRfUShRUiwgc2ksIDMyLCBpbnQpOwotICAgICAgICBGUF9QQUNLX1FQKCZjdnQubGQsIFFSKTsKLSAgICAgICAgY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0udWkgPSBjdnQudy5oaWdoOwotICAgICAgICBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpID0gY3Z0LncubG93OwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogQ29udmVydCBmcm9tIGZpeGVkIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfY2RmYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX0QoRFIpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBfX3MzMiBzaTsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgc2kgPSByZWdzLT5ncHJzW3J5XTsKLSAgICAgICAgRlBfRlJPTV9JTlRfRChEUiwgc2ksIDMyLCBpbnQpOwotICAgICAgICBGUF9QQUNLX0RQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kLCBEUik7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBDb252ZXJ0IGZyb20gZml4ZWQgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2NlZmJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9TKFNSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgX19zMzIgc2k7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIHNpID0gcmVncy0+Z3Byc1tyeV07Ci0gICAgICAgIEZQX0ZST01fSU5UX1MoU1IsIHNpLCAzMiwgaW50KTsKLSAgICAgICAgRlBfUEFDS19TUCgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZiwgU1IpOwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogQ29udmVydCB0byBmaXhlZCBsb25nIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfY2Z4YnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSwgaW50IG1hc2spIHsKLSAgICAgICAgRlBfREVDTF9RKFFBKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLQltYXRoZW11X2xkY3YgY3Z0OwotICAgICAgICBfX3MzMiBzaTsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQlpZiAobWFzayA9PSAwKQotCQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLQllbHNlIGlmIChtYXNrID09IDEpCi0JCW1vZGUgPSBGUF9STkRfTkVBUkVTVDsKLQllbHNlCi0JCW1vZGUgPSBtYXNrIC0gNDsKLSAgICAgICAgY3Z0LncuaGlnaCA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLnVpOwotICAgICAgICBjdnQudy5sb3cgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5KzJdLnVpOwotICAgICAgICBGUF9VTlBBQ0tfUVAoUUEsICZjdnQubGQpOwotICAgICAgICBGUF9UT19JTlRfUk9VTkRfUShzaSwgUUEsIDMyLCAxKTsKLSAgICAgICAgcmVncy0+Z3Byc1tyeF0gPSBzaTsKLSAgICAgICAgZW11X3NldF9DQ19jcyhyZWdzLCBRQV9jLCBRQV9zKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIENvbnZlcnQgdG8gZml4ZWQgZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV9jZmRiciAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgaW50IHJ5LCBpbnQgbWFzaykgewotICAgICAgICBGUF9ERUNMX0QoREEpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBfX3MzMiBzaTsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQlpZiAobWFzayA9PSAwKQotCQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLQllbHNlIGlmIChtYXNrID09IDEpCi0JCW1vZGUgPSBGUF9STkRfTkVBUkVTVDsKLQllbHNlCi0JCW1vZGUgPSBtYXNrIC0gNDsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERBLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0uZCk7Ci0gICAgICAgIEZQX1RPX0lOVF9ST1VORF9EKHNpLCBEQSwgMzIsIDEpOwotICAgICAgICByZWdzLT5ncHJzW3J4XSA9IHNpOwotICAgICAgICBlbXVfc2V0X0NDX2NzKHJlZ3MsIERBX2MsIERBX3MpOwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogQ29udmVydCB0byBmaXhlZCBmbG9hdCAqLwotc3RhdGljIGludCBlbXVfY2ZlYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSwgaW50IG1hc2spIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgX19zMzIgc2k7Ci0gICAgICAgIGludCBtb2RlOwotCi0JaWYgKG1hc2sgPT0gMCkKLQkJbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0JZWxzZSBpZiAobWFzayA9PSAxKQotCQltb2RlID0gRlBfUk5EX05FQVJFU1Q7Ci0JZWxzZQotCQltb2RlID0gbWFzayAtIDQ7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmYpOwotICAgICAgICBGUF9UT19JTlRfUk9VTkRfUyhzaSwgU0EsIDMyLCAxKTsKLSAgICAgICAgcmVncy0+Z3Byc1tyeF0gPSBzaTsKLSAgICAgICAgZW11X3NldF9DQ19jcyhyZWdzLCBTQV9jLCBTQV9zKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIERpdmlkZSBsb25nIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfZHhiciAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgaW50IHJ5KSB7Ci0gICAgICAgIEZQX0RFQ0xfUShRQSk7IEZQX0RFQ0xfUShRQik7IEZQX0RFQ0xfUShRUik7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0JbWF0aGVtdV9sZGN2IGN2dDsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgY3Z0LncuaGlnaCA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpOwotICAgICAgICBjdnQudy5sb3cgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpOwotICAgICAgICBGUF9VTlBBQ0tfUVAoUUEsICZjdnQubGQpOwotICAgICAgICBjdnQudy5oaWdoID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0udWk7Ci0gICAgICAgIGN2dC53LmxvdyA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnkrMl0udWk7Ci0gICAgICAgIEZQX1VOUEFDS19RUChRQiwgJmN2dC5sZCk7Ci0gICAgICAgIEZQX0RJVl9RKFFSLCBRQSwgUUIpOwotICAgICAgICBGUF9QQUNLX1FQKCZjdnQubGQsIFFSKTsKLSAgICAgICAgY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0udWkgPSBjdnQudy5oaWdoOwotICAgICAgICBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpID0gY3Z0LncubG93OwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogRGl2aWRlIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfZGRiciAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgaW50IHJ5KSB7Ci0gICAgICAgIEZQX0RFQ0xfRChEQSk7IEZQX0RFQ0xfRChEQik7IEZQX0RFQ0xfRChEUik7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmQpOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREIsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS5kKTsKLSAgICAgICAgRlBfRElWX0QoRFIsIERBLCBEQik7Ci0JRlBfUEFDS19EUCgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZCwgRFIpOwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogRGl2aWRlIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfZGRiIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBkb3VibGUgKnZhbCkgewotICAgICAgICBGUF9ERUNMX0QoREEpOyBGUF9ERUNMX0QoREIpOyBGUF9ERUNMX0QoRFIpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kKTsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERCLCB2YWwpOwotICAgICAgICBGUF9ESVZfRChEUiwgREEsIERCKTsKLQlGUF9QQUNLX0RQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kLCBEUik7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBEaXZpZGUgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2RlYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX1MoU0EpOyBGUF9ERUNMX1MoU0IpOyBGUF9ERUNMX1MoU1IpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mKTsKLSAgICAgICAgRlBfVU5QQUNLX1NQKFNCLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0uZik7Ci0gICAgICAgIEZQX0RJVl9TKFNSLCBTQSwgU0IpOwotCUZQX1BBQ0tfU1AoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmYsIFNSKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIERpdmlkZSBmbG9hdCAqLwotc3RhdGljIGludCBlbXVfZGViIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBmbG9hdCAqdmFsKSB7Ci0gICAgICAgIEZQX0RFQ0xfUyhTQSk7IEZQX0RFQ0xfUyhTQik7IEZQX0RFQ0xfUyhTUik7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmYpOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0IsIHZhbCk7Ci0gICAgICAgIEZQX0RJVl9TKFNSLCBTQSwgU0IpOwotCUZQX1BBQ0tfU1AoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmYsIFNSKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIERpdmlkZSB0byBpbnRlZ2VyIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfZGlkYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSwgaW50IG1hc2spIHsKLSAgICAgICAgZGlzcGxheV9lbXVsYXRpb25fbm90X2ltcGxlbWVudGVkKHJlZ3MsICJkaWRiciIpOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotLyogRGl2aWRlIHRvIGludGVnZXIgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2RpZWJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnksIGludCBtYXNrKSB7Ci0gICAgICAgIGRpc3BsYXlfZW11bGF0aW9uX25vdF9pbXBsZW1lbnRlZChyZWdzLCAiZGllYnIiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEV4dHJhY3QgZnBjICovCi1zdGF0aWMgaW50IGVtdV9lZnBjIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgcmVncy0+Z3Byc1tyeF0gPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGM7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0vKiBMb2FkIGFuZCB0ZXN0IGxvbmcgZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV9sdHhiciAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgaW50IHJ5KSB7Ci0gICAgICAgIHMzOTBfZnBfcmVncyAqZnBfcmVncyA9ICZjdXJyZW50LT50aHJlYWQuZnBfcmVnczsKLQltYXRoZW11X2xkY3YgY3Z0OwotICAgICAgICBGUF9ERUNMX1EoUUEpOwotICAgICAgICBGUF9ERUNMX0VYOwotCi0gICAgICAgIGN2dC53LmhpZ2ggPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS51aTsKLSAgICAgICAgY3Z0LncubG93ID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeSsyXS51aTsKLSAgICAgICAgRlBfVU5QQUNLX1FQKFFBLCAmY3Z0LmxkKTsKLSAgICAgICAgZnBfcmVncy0+ZnByc1tyeF0udWkgPSBmcF9yZWdzLT5mcHJzW3J5XS51aTsKLSAgICAgICAgZnBfcmVncy0+ZnByc1tyeCsyXS51aSA9IGZwX3JlZ3MtPmZwcnNbcnkrMl0udWk7Ci0gICAgICAgIGVtdV9zZXRfQ0NfY3MocmVncywgUUFfYywgUUFfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIGFuZCB0ZXN0IGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfbHRkYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBzMzkwX2ZwX3JlZ3MgKmZwX3JlZ3MgPSAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3M7Ci0gICAgICAgIEZQX0RFQ0xfRChEQSk7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0KLSAgICAgICAgRlBfVU5QQUNLX0RQKERBLCAmZnBfcmVncy0+ZnByc1tyeV0uZCk7Ci0gICAgICAgIGZwX3JlZ3MtPmZwcnNbcnhdLnVpID0gZnBfcmVncy0+ZnByc1tyeV0udWk7Ci0gICAgICAgIGVtdV9zZXRfQ0NfY3MocmVncywgREFfYywgREFfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIGFuZCB0ZXN0IGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfbHRlYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBzMzkwX2ZwX3JlZ3MgKmZwX3JlZ3MgPSAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3M7Ci0gICAgICAgIEZQX0RFQ0xfUyhTQSk7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0KLSAgICAgICAgRlBfVU5QQUNLX1NQKFNBLCAmZnBfcmVncy0+ZnByc1tyeV0uZik7Ci0gICAgICAgIGZwX3JlZ3MtPmZwcnNbcnhdLnVpID0gZnBfcmVncy0+ZnByc1tyeV0udWk7Ci0gICAgICAgIGVtdV9zZXRfQ0NfY3MocmVncywgU0FfYywgU0Ffcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIGNvbXBsZW1lbnQgbG9uZyBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2xjeGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9RKFFBKTsgRlBfREVDTF9RKFFSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLQltYXRoZW11X2xkY3YgY3Z0OwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBjdnQudy5oaWdoID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0udWk7Ci0gICAgICAgIGN2dC53LmxvdyA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnkrMl0udWk7Ci0gICAgICAgIEZQX1VOUEFDS19RUChRQSwgJmN2dC5sZCk7Ci0JRlBfTkVHX1EoUVIsIFFBKTsKLSAgICAgICAgRlBfUEFDS19RUCgmY3Z0LmxkLCBRUik7Ci0gICAgICAgIGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpID0gY3Z0LncuaGlnaDsKLSAgICAgICAgY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeCsyXS51aSA9IGN2dC53LmxvdzsKLSAgICAgICAgZW11X3NldF9DQ19jcyhyZWdzLCBRUl9jLCBRUl9zKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIExvYWQgY29tcGxlbWVudCBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2xjZGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9EKERBKTsgRlBfREVDTF9EKERSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERBLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0uZCk7Ci0JRlBfTkVHX0QoRFIsIERBKTsKLQlGUF9QQUNLX0RQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kLCBEUik7Ci0gICAgICAgIGVtdV9zZXRfQ0NfY3MocmVncywgRFJfYywgRFJfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIGNvbXBsZW1lbnQgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2xjZWJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9TKFNSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgRlBfVU5QQUNLX1NQKFNBLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0uZik7Ci0JRlBfTkVHX1MoU1IsIFNBKTsKLQlGUF9QQUNLX1NQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mLCBTUik7Ci0gICAgICAgIGVtdV9zZXRfQ0NfY3MocmVncywgU1JfYywgU1Jfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIGZsb2F0aW5nIHBvaW50IGludGVnZXIgbG9uZyBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2ZpeGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnksIGludCBtYXNrKSB7Ci0gICAgICAgIHMzOTBfZnBfcmVncyAqZnBfcmVncyA9ICZjdXJyZW50LT50aHJlYWQuZnBfcmVnczsKLSAgICAgICAgRlBfREVDTF9RKFFBKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLQltYXRoZW11X2xkY3YgY3Z0OwotICAgICAgICBfX3MzMiBzaTsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQlpZiAobWFzayA9PSAwKQotCQltb2RlID0gZnBfcmVncy0+ZnBjICYgMzsKLQllbHNlIGlmIChtYXNrID09IDEpCi0JCW1vZGUgPSBGUF9STkRfTkVBUkVTVDsKLQllbHNlCi0JCW1vZGUgPSBtYXNrIC0gNDsKLSAgICAgICAgY3Z0LncuaGlnaCA9IGZwX3JlZ3MtPmZwcnNbcnldLnVpOwotICAgICAgICBjdnQudy5sb3cgPSBmcF9yZWdzLT5mcHJzW3J5KzJdLnVpOwotICAgICAgICBGUF9VTlBBQ0tfUVAoUUEsICZjdnQubGQpOwotCUZQX1RPX0ZQSU5UX1JPVU5EX1EoUUEpOwotCUZQX1BBQ0tfUVAoJmN2dC5sZCwgUUEpOwotCWZwX3JlZ3MtPmZwcnNbcnhdLnVpID0gY3Z0LncuaGlnaDsKLQlmcF9yZWdzLT5mcHJzW3J4KzJdLnVpID0gY3Z0LncubG93OwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogTG9hZCBmbG9hdGluZyBwb2ludCBpbnRlZ2VyIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfZmlkYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSwgaW50IG1hc2spIHsKLQkvKiBGSVhNRTogcm91bmRpbmcgbW9kZSAhISAqLwotICAgICAgICBzMzkwX2ZwX3JlZ3MgKmZwX3JlZ3MgPSAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3M7Ci0gICAgICAgIEZQX0RFQ0xfRChEQSk7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0gICAgICAgIF9fczMyIHNpOwotICAgICAgICBpbnQgbW9kZTsKLQotCWlmIChtYXNrID09IDApCi0JCW1vZGUgPSBmcF9yZWdzLT5mcGMgJiAzOwotCWVsc2UgaWYgKG1hc2sgPT0gMSkKLQkJbW9kZSA9IEZQX1JORF9ORUFSRVNUOwotCWVsc2UKLQkJbW9kZSA9IG1hc2sgLSA0OwotICAgICAgICBGUF9VTlBBQ0tfRFAoREEsICZmcF9yZWdzLT5mcHJzW3J5XS5kKTsKLQlGUF9UT19GUElOVF9ST1VORF9EKERBKTsKLQlGUF9QQUNLX0RQKCZmcF9yZWdzLT5mcHJzW3J4XS5kLCBEQSk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIGZsb2F0aW5nIHBvaW50IGludGVnZXIgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2ZpZWJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnksIGludCBtYXNrKSB7Ci0gICAgICAgIHMzOTBfZnBfcmVncyAqZnBfcmVncyA9ICZjdXJyZW50LT50aHJlYWQuZnBfcmVnczsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgX19zMzIgc2k7Ci0gICAgICAgIGludCBtb2RlOwotCi0JaWYgKG1hc2sgPT0gMCkKLQkJbW9kZSA9IGZwX3JlZ3MtPmZwYyAmIDM7Ci0JZWxzZSBpZiAobWFzayA9PSAxKQotCQltb2RlID0gRlBfUk5EX05FQVJFU1Q7Ci0JZWxzZQotCQltb2RlID0gbWFzayAtIDQ7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQSwgJmZwX3JlZ3MtPmZwcnNbcnldLmYpOwotCUZQX1RPX0ZQSU5UX1JPVU5EX1MoU0EpOwotCUZQX1BBQ0tfU1AoJmZwX3JlZ3MtPmZwcnNbcnhdLmYsIFNBKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIExvYWQgbGVuZ3RoZW5lZCBkb3VibGUgdG8gbG9uZyBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2x4ZGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9EKERBKTsgRlBfREVDTF9RKFFSKTsKLQlGUF9ERUNMX0VYOwotCW1hdGhlbXVfbGRjdiBjdnQ7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmQpOwotCUZQX0NPTlYgKFEsIEQsIDQsIDIsIFFSLCBEQSk7Ci0gICAgICAgIEZQX1BBQ0tfUVAoJmN2dC5sZCwgUVIpOwotICAgICAgICBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS51aSA9IGN2dC53LmhpZ2g7Ci0gICAgICAgIGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcngrMl0udWkgPSBjdnQudy5sb3c7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIGxlbmd0aGVuZWQgZG91YmxlIHRvIGxvbmcgZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV9seGRiIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBkb3VibGUgKnZhbCkgewotICAgICAgICBGUF9ERUNMX0QoREEpOyBGUF9ERUNMX1EoUVIpOwotCUZQX0RFQ0xfRVg7Ci0JbWF0aGVtdV9sZGN2IGN2dDsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERBLCB2YWwpOwotCUZQX0NPTlYgKFEsIEQsIDQsIDIsIFFSLCBEQSk7Ci0gICAgICAgIEZQX1BBQ0tfUVAoJmN2dC5sZCwgUVIpOwotICAgICAgICBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS51aSA9IGN2dC53LmhpZ2g7Ci0gICAgICAgIGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcngrMl0udWkgPSBjdnQudy5sb3c7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIGxlbmd0aGVuZWQgZmxvYXQgdG8gbG9uZyBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2x4ZWJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9RKFFSKTsKLQlGUF9ERUNMX0VYOwotCW1hdGhlbXVfbGRjdiBjdnQ7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmYpOwotCUZQX0NPTlYgKFEsIFMsIDQsIDEsIFFSLCBTQSk7Ci0gICAgICAgIEZQX1BBQ0tfUVAoJmN2dC5sZCwgUVIpOwotICAgICAgICBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS51aSA9IGN2dC53LmhpZ2g7Ci0gICAgICAgIGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcngrMl0udWkgPSBjdnQudy5sb3c7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIGxlbmd0aGVuZWQgZmxvYXQgdG8gbG9uZyBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2x4ZWIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGZsb2F0ICp2YWwpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9RKFFSKTsKLQlGUF9ERUNMX0VYOwotCW1hdGhlbXVfbGRjdiBjdnQ7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQSwgdmFsKTsKLQlGUF9DT05WIChRLCBTLCA0LCAxLCBRUiwgU0EpOwotICAgICAgICBGUF9QQUNLX1FQKCZjdnQubGQsIFFSKTsKLSAgICAgICAgY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0udWkgPSBjdnQudy5oaWdoOwotICAgICAgICBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpID0gY3Z0LncubG93OwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogTG9hZCBsZW5ndGhlbmVkIGZsb2F0IHRvIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfbGRlYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX1MoU0EpOyBGUF9ERUNMX0QoRFIpOwotCUZQX0RFQ0xfRVg7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmYpOwotCUZQX0NPTlYgKEQsIFMsIDIsIDEsIERSLCBTQSk7Ci0JRlBfUEFDS19EUCgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZCwgRFIpOwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogTG9hZCBsZW5ndGhlbmVkIGZsb2F0IHRvIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfbGRlYiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgZmxvYXQgKnZhbCkgewotICAgICAgICBGUF9ERUNMX1MoU0EpOyBGUF9ERUNMX0QoRFIpOwotCUZQX0RFQ0xfRVg7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQSwgdmFsKTsKLQlGUF9DT05WIChELCBTLCAyLCAxLCBEUiwgU0EpOwotCUZQX1BBQ0tfRFAoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmQsIERSKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIExvYWQgbmVnYXRpdmUgbG9uZyBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X2xueGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9RKFFBKTsgRlBfREVDTF9RKFFSKTsKLQlGUF9ERUNMX0VYOwotCW1hdGhlbXVfbGRjdiBjdnQ7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIGN2dC53LmhpZ2ggPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS51aTsKLSAgICAgICAgY3Z0LncubG93ID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeSsyXS51aTsKLSAgICAgICAgRlBfVU5QQUNLX1FQKFFBLCAmY3Z0LmxkKTsKLSAgICAgICAgaWYgKFFBX3MgPT0gMCkgewotCQlGUF9ORUdfUShRUiwgUUEpOwotCQlGUF9QQUNLX1FQKCZjdnQubGQsIFFSKTsKLQkJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0udWkgPSBjdnQudy5oaWdoOwotCQljdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpID0gY3Z0LncubG93OwotCX0gZWxzZSB7Ci0JCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpID0KLQkJCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLnVpOwotCQljdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpID0KLQkJCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnkrMl0udWk7Ci0JfQotCWVtdV9zZXRfQ0NfY3MocmVncywgUVJfYywgUVJfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIG5lZ2F0aXZlIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfbG5kYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX0QoREEpOyBGUF9ERUNMX0QoRFIpOwotCUZQX0RFQ0xfRVg7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmQpOwotICAgICAgICBpZiAoREFfcyA9PSAwKSB7Ci0JCUZQX05FR19EKERSLCBEQSk7Ci0JCUZQX1BBQ0tfRFAoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmQsIERSKTsKLQl9IGVsc2UKLQkJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0udWkgPQotCQkJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0udWk7Ci0JZW11X3NldF9DQ19jcyhyZWdzLCBEUl9jLCBEUl9zKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIExvYWQgbmVnYXRpdmUgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2xuZWJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9TKFNSKTsKLQlGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS5mKTsKLSAgICAgICAgaWYgKFNBX3MgPT0gMCkgewotCQlGUF9ORUdfUyhTUiwgU0EpOwotCQlGUF9QQUNLX1NQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mLCBTUik7Ci0JfSBlbHNlCi0JCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpID0KLQkJCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLnVpOwotCWVtdV9zZXRfQ0NfY3MocmVncywgU1JfYywgU1Jfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIHBvc2l0aXZlIGxvbmcgZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV9scHhiciAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgaW50IHJ5KSB7Ci0gICAgICAgIEZQX0RFQ0xfUShRQSk7IEZQX0RFQ0xfUShRUik7Ci0JRlBfREVDTF9FWDsKLQltYXRoZW11X2xkY3YgY3Z0OwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBjdnQudy5oaWdoID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0udWk7Ci0gICAgICAgIGN2dC53LmxvdyA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnkrMl0udWk7Ci0gICAgICAgIEZQX1VOUEFDS19RUChRQSwgJmN2dC5sZCk7Ci0gICAgICAgIGlmIChRQV9zICE9IDApIHsKLQkJRlBfTkVHX1EoUVIsIFFBKTsKLQkJRlBfUEFDS19RUCgmY3Z0LmxkLCBRUik7Ci0JCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpID0gY3Z0LncuaGlnaDsKLQkJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeCsyXS51aSA9IGN2dC53LmxvdzsKLQl9IGVsc2V7Ci0JCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpID0KLQkJCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLnVpOwotCQljdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpID0KLQkJCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnkrMl0udWk7Ci0JfQotCWVtdV9zZXRfQ0NfY3MocmVncywgUVJfYywgUVJfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIHBvc2l0aXZlIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfbHBkYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX0QoREEpOyBGUF9ERUNMX0QoRFIpOwotCUZQX0RFQ0xfRVg7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmQpOwotICAgICAgICBpZiAoREFfcyAhPSAwKSB7Ci0JCUZQX05FR19EKERSLCBEQSk7Ci0JCUZQX1BBQ0tfRFAoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmQsIERSKTsKLQl9IGVsc2UKLQkJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0udWkgPQotCQkJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0udWk7Ci0JZW11X3NldF9DQ19jcyhyZWdzLCBEUl9jLCBEUl9zKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIExvYWQgcG9zaXRpdmUgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2xwZWJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9TKFNSKTsKLQlGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS5mKTsKLSAgICAgICAgaWYgKFNBX3MgIT0gMCkgewotCQlGUF9ORUdfUyhTUiwgU0EpOwotCQlGUF9QQUNLX1NQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mLCBTUik7Ci0JfSBlbHNlCi0JCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpID0KLQkJCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLnVpOwotCWVtdV9zZXRfQ0NfY3MocmVncywgU1JfYywgU1Jfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIHJvdW5kZWQgbG9uZyBkb3VibGUgdG8gZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV9sZHhiciAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgaW50IHJ5KSB7Ci0gICAgICAgIEZQX0RFQ0xfUShRQSk7IEZQX0RFQ0xfRChEUik7Ci0JRlBfREVDTF9FWDsKLQltYXRoZW11X2xkY3YgY3Z0OwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBjdnQudy5oaWdoID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0udWk7Ci0gICAgICAgIGN2dC53LmxvdyA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnkrMl0udWk7Ci0gICAgICAgIEZQX1VOUEFDS19RUChRQSwgJmN2dC5sZCk7Ci0JRlBfQ09OViAoRCwgUSwgMiwgNCwgRFIsIFFBKTsKLQlGUF9QQUNLX0RQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mLCBEUik7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBMb2FkIHJvdW5kZWQgbG9uZyBkb3VibGUgdG8gZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2xleGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9RKFFBKTsgRlBfREVDTF9TKFNSKTsKLQlGUF9ERUNMX0VYOwotCW1hdGhlbXVfbGRjdiBjdnQ7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIGN2dC53LmhpZ2ggPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS51aTsKLSAgICAgICAgY3Z0LncubG93ID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeSsyXS51aTsKLSAgICAgICAgRlBfVU5QQUNLX1FQKFFBLCAmY3Z0LmxkKTsKLQlGUF9DT05WIChTLCBRLCAxLCA0LCBTUiwgUUEpOwotCUZQX1BBQ0tfU1AoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmYsIFNSKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIExvYWQgcm91bmRlZCBkb3VibGUgdG8gZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X2xlZGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9EKERBKTsgRlBfREVDTF9TKFNSKTsKLQlGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS5kKTsKLQlGUF9DT05WIChTLCBELCAxLCAyLCBTUiwgREEpOwotCUZQX1BBQ0tfU1AoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmYsIFNSKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIE11bHRpcGx5IGxvbmcgZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV9teGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9RKFFBKTsgRlBfREVDTF9RKFFCKTsgRlBfREVDTF9RKFFSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLQltYXRoZW11X2xkY3YgY3Z0OwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBjdnQudy5oaWdoID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0udWk7Ci0gICAgICAgIGN2dC53LmxvdyA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcngrMl0udWk7Ci0gICAgICAgIEZQX1VOUEFDS19RUChRQSwgJmN2dC5sZCk7Ci0gICAgICAgIGN2dC53LmhpZ2ggPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS51aTsKLSAgICAgICAgY3Z0LncubG93ID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeSsyXS51aTsKLSAgICAgICAgRlBfVU5QQUNLX1FQKFFCLCAmY3Z0LmxkKTsKLSAgICAgICAgRlBfTVVMX1EoUVIsIFFBLCBRQik7Ci0gICAgICAgIEZQX1BBQ0tfUVAoJmN2dC5sZCwgUVIpOwotICAgICAgICBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS51aSA9IGN2dC53LmhpZ2g7Ci0gICAgICAgIGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcngrMl0udWkgPSBjdnQudy5sb3c7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBNdWx0aXBseSBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X21kYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX0QoREEpOyBGUF9ERUNMX0QoREIpOyBGUF9ERUNMX0QoRFIpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kKTsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERCLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0uZCk7Ci0gICAgICAgIEZQX01VTF9EKERSLCBEQSwgREIpOwotCUZQX1BBQ0tfRFAoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmQsIERSKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIE11bHRpcGx5IGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfbWRiIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBkb3VibGUgKnZhbCkgewotICAgICAgICBGUF9ERUNMX0QoREEpOyBGUF9ERUNMX0QoREIpOyBGUF9ERUNMX0QoRFIpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kKTsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERCLCB2YWwpOwotICAgICAgICBGUF9NVUxfRChEUiwgREEsIERCKTsKLQlGUF9QQUNLX0RQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kLCBEUik7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBNdWx0aXBseSBkb3VibGUgdG8gbG9uZyBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X214ZGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9EKERBKTsgRlBfREVDTF9RKFFBKTsgRlBfREVDTF9RKFFCKTsgRlBfREVDTF9RKFFSKTsKLQlGUF9ERUNMX0VYOwotCW1hdGhlbXVfbGRjdiBjdnQ7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmQpOwotCUZQX0NPTlYgKFEsIEQsIDQsIDIsIFFBLCBEQSk7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmQpOwotCUZQX0NPTlYgKFEsIEQsIDQsIDIsIFFCLCBEQSk7Ci0gICAgICAgIEZQX01VTF9RKFFSLCBRQSwgUUIpOwotICAgICAgICBGUF9QQUNLX1FQKCZjdnQubGQsIFFSKTsKLSAgICAgICAgY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0udWkgPSBjdnQudy5oaWdoOwotICAgICAgICBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpID0gY3Z0LncubG93OwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogTXVsdGlwbHkgZG91YmxlIHRvIGxvbmcgZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV9teGRiIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBsb25nIGRvdWJsZSAqdmFsKSB7Ci0gICAgICAgIEZQX0RFQ0xfUShRQSk7IEZQX0RFQ0xfUShRQik7IEZQX0RFQ0xfUShRUik7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0JbWF0aGVtdV9sZGN2IGN2dDsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgY3Z0LncuaGlnaCA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpOwotICAgICAgICBjdnQudy5sb3cgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpOwotICAgICAgICBGUF9VTlBBQ0tfUVAoUUEsICZjdnQubGQpOwotICAgICAgICBGUF9VTlBBQ0tfUVAoUUIsIHZhbCk7Ci0gICAgICAgIEZQX01VTF9RKFFSLCBRQSwgUUIpOwotICAgICAgICBGUF9QQUNLX1FQKCZjdnQubGQsIFFSKTsKLSAgICAgICAgY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0udWkgPSBjdnQudy5oaWdoOwotICAgICAgICBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpID0gY3Z0LncubG93OwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogTXVsdGlwbHkgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X21lZWJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9TKFNCKTsgRlBfREVDTF9TKFNSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgRlBfVU5QQUNLX1NQKFNBLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZik7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQiwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmYpOwotICAgICAgICBGUF9NVUxfUyhTUiwgU0EsIFNCKTsKLQlGUF9QQUNLX1NQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mLCBTUik7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBNdWx0aXBseSBmbG9hdCAqLwotc3RhdGljIGludCBlbXVfbWVlYiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgZmxvYXQgKnZhbCkgewotICAgICAgICBGUF9ERUNMX1MoU0EpOyBGUF9ERUNMX1MoU0IpOyBGUF9ERUNMX1MoU1IpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mKTsKLSAgICAgICAgRlBfVU5QQUNLX1NQKFNCLCB2YWwpOwotICAgICAgICBGUF9NVUxfUyhTUiwgU0EsIFNCKTsKLQlGUF9QQUNLX1NQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mLCBTUik7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBNdWx0aXBseSBmbG9hdCB0byBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X21kZWJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9EKERBKTsgRlBfREVDTF9EKERCKTsgRlBfREVDTF9EKERSKTsKLQlGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mKTsKLQlGUF9DT05WIChELCBTLCAyLCAxLCBEQSwgU0EpOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS5mKTsKLQlGUF9DT05WIChELCBTLCAyLCAxLCBEQiwgU0EpOwotICAgICAgICBGUF9NVUxfRChEUiwgREEsIERCKTsKLQlGUF9QQUNLX0RQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kLCBEUik7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBNdWx0aXBseSBmbG9hdCB0byBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X21kZWIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGZsb2F0ICp2YWwpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9EKERBKTsgRlBfREVDTF9EKERCKTsgRlBfREVDTF9EKERSKTsKLQlGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mKTsKLQlGUF9DT05WIChELCBTLCAyLCAxLCBEQSwgU0EpOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsIHZhbCk7Ci0JRlBfQ09OViAoRCwgUywgMiwgMSwgREIsIFNBKTsKLSAgICAgICAgRlBfTVVMX0QoRFIsIERBLCBEQik7Ci0JRlBfUEFDS19EUCgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZCwgRFIpOwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogTXVsdGlwbHkgYW5kIGFkZCBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X21hZGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnksIGludCByeikgewotICAgICAgICBGUF9ERUNMX0QoREEpOyBGUF9ERUNMX0QoREIpOyBGUF9ERUNMX0QoREMpOyBGUF9ERUNMX0QoRFIpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kKTsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERCLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0uZCk7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQywgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnpdLmQpOwotICAgICAgICBGUF9NVUxfRChEUiwgREEsIERCKTsKLSAgICAgICAgRlBfQUREX0QoRFIsIERSLCBEQyk7Ci0JRlBfUEFDS19EUCgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyel0uZCwgRFIpOwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogTXVsdGlwbHkgYW5kIGFkZCBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X21hZGIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGRvdWJsZSAqdmFsLCBpbnQgcnopIHsKLSAgICAgICAgRlBfREVDTF9EKERBKTsgRlBfREVDTF9EKERCKTsgRlBfREVDTF9EKERDKTsgRlBfREVDTF9EKERSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERBLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZCk7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQiwgdmFsKTsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERDLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyel0uZCk7Ci0gICAgICAgIEZQX01VTF9EKERSLCBEQSwgREIpOwotICAgICAgICBGUF9BRERfRChEUiwgRFIsIERDKTsKLQlGUF9QQUNLX0RQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J6XS5kLCBEUik7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBNdWx0aXBseSBhbmQgYWRkIGZsb2F0ICovCi1zdGF0aWMgaW50IGVtdV9tYWViciAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgaW50IHJ5LCBpbnQgcnopIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9TKFNCKTsgRlBfREVDTF9TKFNDKTsgRlBfREVDTF9TKFNSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgRlBfVU5QQUNLX1NQKFNBLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZik7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQiwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmYpOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0MsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J6XS5mKTsKLSAgICAgICAgRlBfTVVMX1MoU1IsIFNBLCBTQik7Ci0gICAgICAgIEZQX0FERF9TKFNSLCBTUiwgU0MpOwotCUZQX1BBQ0tfU1AoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnpdLmYsIFNSKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIE11bHRpcGx5IGFuZCBhZGQgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X21hZWIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGZsb2F0ICp2YWwsIGludCByeikgewotICAgICAgICBGUF9ERUNMX1MoU0EpOyBGUF9ERUNMX1MoU0IpOyBGUF9ERUNMX1MoU0MpOyBGUF9ERUNMX1MoU1IpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mKTsKLSAgICAgICAgRlBfVU5QQUNLX1NQKFNCLCB2YWwpOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0MsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J6XS5mKTsKLSAgICAgICAgRlBfTVVMX1MoU1IsIFNBLCBTQik7Ci0gICAgICAgIEZQX0FERF9TKFNSLCBTUiwgU0MpOwotCUZQX1BBQ0tfU1AoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnpdLmYsIFNSKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIE11bHRpcGx5IGFuZCBzdWJ0cmFjdCBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X21zZGJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnksIGludCByeikgewotICAgICAgICBGUF9ERUNMX0QoREEpOyBGUF9ERUNMX0QoREIpOyBGUF9ERUNMX0QoREMpOyBGUF9ERUNMX0QoRFIpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kKTsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERCLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeV0uZCk7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQywgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnpdLmQpOwotICAgICAgICBGUF9NVUxfRChEUiwgREEsIERCKTsKLSAgICAgICAgRlBfU1VCX0QoRFIsIERSLCBEQyk7Ci0JRlBfUEFDS19EUCgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyel0uZCwgRFIpOwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogTXVsdGlwbHkgYW5kIHN1YnRyYWN0IGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfbXNkYiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgZG91YmxlICp2YWwsIGludCByeikgewotICAgICAgICBGUF9ERUNMX0QoREEpOyBGUF9ERUNMX0QoREIpOyBGUF9ERUNMX0QoREMpOyBGUF9ERUNMX0QoRFIpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kKTsKLSAgICAgICAgRlBfVU5QQUNLX0RQKERCLCB2YWwpOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREMsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J6XS5kKTsKLSAgICAgICAgRlBfTVVMX0QoRFIsIERBLCBEQik7Ci0gICAgICAgIEZQX1NVQl9EKERSLCBEUiwgREMpOwotCUZQX1BBQ0tfRFAoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnpdLmQsIERSKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIE11bHRpcGx5IGFuZCBzdWJ0cmFjdCBmbG9hdCAqLwotc3RhdGljIGludCBlbXVfbXNlYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSwgaW50IHJ6KSB7Ci0gICAgICAgIEZQX0RFQ0xfUyhTQSk7IEZQX0RFQ0xfUyhTQik7IEZQX0RFQ0xfUyhTQyk7IEZQX0RFQ0xfUyhTUik7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmYpOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0IsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS5mKTsKLSAgICAgICAgRlBfVU5QQUNLX1NQKFNDLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyel0uZik7Ci0gICAgICAgIEZQX01VTF9TKFNSLCBTQSwgU0IpOwotICAgICAgICBGUF9TVUJfUyhTUiwgU1IsIFNDKTsKLQlGUF9QQUNLX1NQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J6XS5mLCBTUik7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBNdWx0aXBseSBhbmQgc3VidHJhY3QgZmxvYXQgKi8KLXN0YXRpYyBpbnQgZW11X21zZWIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGZsb2F0ICp2YWwsIGludCByeikgewotICAgICAgICBGUF9ERUNMX1MoU0EpOyBGUF9ERUNMX1MoU0IpOyBGUF9ERUNMX1MoU0MpOyBGUF9ERUNMX1MoU1IpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mKTsKLSAgICAgICAgRlBfVU5QQUNLX1NQKFNCLCB2YWwpOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0MsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J6XS5mKTsKLSAgICAgICAgRlBfTVVMX1MoU1IsIFNBLCBTQik7Ci0gICAgICAgIEZQX1NVQl9TKFNSLCBTUiwgU0MpOwotCUZQX1BBQ0tfU1AoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnpdLmYsIFNSKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIFNldCBmbG9hdGluZyBwb2ludCBjb250cm9sIHdvcmQgKi8KLXN0YXRpYyBpbnQgZW11X3NmcGMgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBfX3UzMiB0ZW1wOwotCi0gICAgICAgIHRlbXAgPSByZWdzLT5ncHJzW3J4XTsKLSAgICAgICAgaWYgKCh0ZW1wICYgfkZQQ19WQUxJRF9NQVNLKSAhPSAwKQotCQlyZXR1cm4gU0lHSUxMOwotCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyA9IHRlbXA7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0vKiBTcXVhcmUgcm9vdCBsb25nIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfc3F4YnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX1EoUUEpOyBGUF9ERUNMX1EoUVIpOwotICAgICAgICBGUF9ERUNMX0VYOwotCW1hdGhlbXVfbGRjdiBjdnQ7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIGN2dC53LmhpZ2ggPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS51aTsKLSAgICAgICAgY3Z0LncubG93ID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeSsyXS51aTsKLSAgICAgICAgRlBfVU5QQUNLX1FQKFFBLCAmY3Z0LmxkKTsKLQlGUF9TUVJUX1EoUVIsIFFBKTsKLSAgICAgICAgRlBfUEFDS19RUCgmY3Z0LmxkLCBRUik7Ci0gICAgICAgIGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpID0gY3Z0LncuaGlnaDsKLSAgICAgICAgY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeCsyXS51aSA9IGN2dC53LmxvdzsKLSAgICAgICAgZW11X3NldF9DQ19jcyhyZWdzLCBRUl9jLCBRUl9zKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIFNxdWFyZSByb290IGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfc3FkYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX0QoREEpOyBGUF9ERUNMX0QoRFIpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREEsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS5kKTsKLQlGUF9TUVJUX0QoRFIsIERBKTsKLQlGUF9QQUNLX0RQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kLCBEUik7Ci0gICAgICAgIGVtdV9zZXRfQ0NfY3MocmVncywgRFJfYywgRFJfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBTcXVhcmUgcm9vdCBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X3NxZGIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGRvdWJsZSAqdmFsKSB7Ci0gICAgICAgIEZQX0RFQ0xfRChEQSk7IEZQX0RFQ0xfRChEUik7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQSwgdmFsKTsKLQlGUF9TUVJUX0QoRFIsIERBKTsKLQlGUF9QQUNLX0RQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5kLCBEUik7Ci0gICAgICAgIGVtdV9zZXRfQ0NfY3MocmVncywgRFJfYywgRFJfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBTcXVhcmUgcm9vdCBmbG9hdCAqLwotc3RhdGljIGludCBlbXVfc3FlYnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX1MoU0EpOyBGUF9ERUNMX1MoU1IpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS5mKTsKLQlGUF9TUVJUX1MoU1IsIFNBKTsKLQlGUF9QQUNLX1NQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mLCBTUik7Ci0gICAgICAgIGVtdV9zZXRfQ0NfY3MocmVncywgU1JfYywgU1Jfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBTcXVhcmUgcm9vdCBmbG9hdCAqLwotc3RhdGljIGludCBlbXVfc3FlYiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgZmxvYXQgKnZhbCkgewotICAgICAgICBGUF9ERUNMX1MoU0EpOyBGUF9ERUNMX1MoU1IpOwotICAgICAgICBGUF9ERUNMX0VYOwotICAgICAgICBpbnQgbW9kZTsKLQotCW1vZGUgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAzOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0EsIHZhbCk7Ci0JRlBfU1FSVF9TKFNSLCBTQSk7Ci0JRlBfUEFDS19TUCgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZiwgU1IpOwotICAgICAgICBlbXVfc2V0X0NDX2NzKHJlZ3MsIFNSX2MsIFNSX3MpOwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogU3VidHJhY3QgbG9uZyBkb3VibGUgKi8KLXN0YXRpYyBpbnQgZW11X3N4YnIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByeSkgewotICAgICAgICBGUF9ERUNMX1EoUUEpOyBGUF9ERUNMX1EoUUIpOyBGUF9ERUNMX1EoUVIpOwotICAgICAgICBGUF9ERUNMX0VYOwotCW1hdGhlbXVfbGRjdiBjdnQ7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIGN2dC53LmhpZ2ggPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS51aTsKLSAgICAgICAgY3Z0LncubG93ID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeCsyXS51aTsKLSAgICAgICAgRlBfVU5QQUNLX1FQKFFBLCAmY3Z0LmxkKTsKLSAgICAgICAgY3Z0LncuaGlnaCA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLnVpOwotICAgICAgICBjdnQudy5sb3cgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5KzJdLnVpOwotICAgICAgICBGUF9VTlBBQ0tfUVAoUUIsICZjdnQubGQpOwotICAgICAgICBGUF9TVUJfUShRUiwgUUEsIFFCKTsKLSAgICAgICAgRlBfUEFDS19RUCgmY3Z0LmxkLCBRUik7Ci0gICAgICAgIGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpID0gY3Z0LncuaGlnaDsKLSAgICAgICAgY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeCsyXS51aSA9IGN2dC53LmxvdzsKLSAgICAgICAgZW11X3NldF9DQ19jcyhyZWdzLCBRUl9jLCBRUl9zKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIFN1YnRyYWN0IGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfc2RiciAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgaW50IHJ5KSB7Ci0gICAgICAgIEZQX0RFQ0xfRChEQSk7IEZQX0RFQ0xfRChEQik7IEZQX0RFQ0xfRChEUik7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmQpOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREIsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J5XS5kKTsKLSAgICAgICAgRlBfU1VCX0QoRFIsIERBLCBEQik7Ci0JRlBfUEFDS19EUCgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZCwgRFIpOwotICAgICAgICBlbXVfc2V0X0NDX2NzKHJlZ3MsIERSX2MsIERSX3MpOwotICAgICAgICByZXR1cm4gX2ZleDsKLX0KLQotLyogU3VidHJhY3QgZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV9zZGIgKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGRvdWJsZSAqdmFsKSB7Ci0gICAgICAgIEZQX0RFQ0xfRChEQSk7IEZQX0RFQ0xfRChEQik7IEZQX0RFQ0xfRChEUik7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19EUChEQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmQpOwotICAgICAgICBGUF9VTlBBQ0tfRFAoREIsIHZhbCk7Ci0gICAgICAgIEZQX1NVQl9EKERSLCBEQSwgREIpOwotCUZQX1BBQ0tfRFAoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmQsIERSKTsKLSAgICAgICAgZW11X3NldF9DQ19jcyhyZWdzLCBEUl9jLCBEUl9zKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIFN1YnRyYWN0IGZsb2F0ICovCi1zdGF0aWMgaW50IGVtdV9zZWJyIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBpbnQgcnkpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsgRlBfREVDTF9TKFNCKTsgRlBfREVDTF9TKFNSKTsKLSAgICAgICAgRlBfREVDTF9FWDsKLSAgICAgICAgaW50IG1vZGU7Ci0KLQltb2RlID0gY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgMzsKLSAgICAgICAgRlBfVU5QQUNLX1NQKFNBLCAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyeF0uZik7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQiwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnldLmYpOwotICAgICAgICBGUF9TVUJfUyhTUiwgU0EsIFNCKTsKLQlGUF9QQUNLX1NQKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mLCBTUik7Ci0gICAgICAgIGVtdV9zZXRfQ0NfY3MocmVncywgU1JfYywgU1Jfcyk7Ci0gICAgICAgIHJldHVybiBfZmV4OwotfQotCi0vKiBTdWJ0cmFjdCBmbG9hdCAqLwotc3RhdGljIGludCBlbXVfc2ViIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBmbG9hdCAqdmFsKSB7Ci0gICAgICAgIEZQX0RFQ0xfUyhTQSk7IEZQX0RFQ0xfUyhTQik7IEZQX0RFQ0xfUyhTUik7Ci0gICAgICAgIEZQX0RFQ0xfRVg7Ci0gICAgICAgIGludCBtb2RlOwotCi0JbW9kZSA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyAmIDM7Ci0gICAgICAgIEZQX1VOUEFDS19TUChTQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmYpOwotICAgICAgICBGUF9VTlBBQ0tfU1AoU0IsIHZhbCk7Ci0gICAgICAgIEZQX1NVQl9TKFNSLCBTQSwgU0IpOwotCUZQX1BBQ0tfU1AoJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmYsIFNSKTsKLSAgICAgICAgZW11X3NldF9DQ19jcyhyZWdzLCBTUl9jLCBTUl9zKTsKLSAgICAgICAgcmV0dXJuIF9mZXg7Ci19Ci0KLS8qIFRlc3QgZGF0YSBjbGFzcyBsb25nIGRvdWJsZSAqLwotc3RhdGljIGludCBlbXVfdGN4YiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgbG9uZyB2YWwpIHsKLSAgICAgICAgRlBfREVDTF9RKFFBKTsKLQltYXRoZW11X2xkY3YgY3Z0OwotCWludCBiaXQ7Ci0KLSAgICAgICAgY3Z0LncuaGlnaCA9IGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLnVpOwotICAgICAgICBjdnQudy5sb3cgPSBjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4KzJdLnVpOwotICAgICAgICBGUF9VTlBBQ0tfUkFXX1FQKFFBLCAmY3Z0LmxkKTsKLQlzd2l0Y2ggKFFBX2UpIHsKLQlkZWZhdWx0OgotCQliaXQgPSA4OwkJLyogbm9ybWFsaXplZCBudW1iZXIgKi8KLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQlpZiAoX0ZQX0ZSQUNfWkVST1BfNChRQSkpCi0JCQliaXQgPSAxMDsJLyogemVybyAqLwotCQllbHNlCi0JCQliaXQgPSA2OwkvKiBkZW5vcm1hbGl6ZWQgbnVtYmVyICovCi0JCWJyZWFrOwotCWNhc2UgX0ZQX0VYUE1BWF9ROgotCQlpZiAoX0ZQX0ZSQUNfWkVST1BfNChRQSkpCi0JCQliaXQgPSA0OwkvKiBpbmZpbml0eSAqLwotCQllbHNlIGlmIChfRlBfRlJBQ19ISUdIX1JBV19RKFFBKSAmIF9GUF9RTkFOQklUX1EpCi0JCQliaXQgPSAyOwkvKiBxdWlldCBOQU4gKi8KLQkJZWxzZQotCQkJYml0ID0gMDsJLyogc2lnbmFsaW5nIE5BTiAqLwotCQlicmVhazsKLQl9Ci0JaWYgKCFRQV9zKQotCQliaXQrKzsKLQllbXVfc2V0X0NDKHJlZ3MsICgoX191MzIpIHZhbCA+PiBiaXQpICYgMSk7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0vKiBUZXN0IGRhdGEgY2xhc3MgZG91YmxlICovCi1zdGF0aWMgaW50IGVtdV90Y2RiIChzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHJ4LCBsb25nIHZhbCkgewotICAgICAgICBGUF9ERUNMX0QoREEpOwotCWludCBiaXQ7Ci0KLSAgICAgICAgRlBfVU5QQUNLX1JBV19EUChEQSwgJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwcnNbcnhdLmQpOwotCXN3aXRjaCAoREFfZSkgewotCWRlZmF1bHQ6Ci0JCWJpdCA9IDg7CQkvKiBub3JtYWxpemVkIG51bWJlciAqLwotCQlicmVhazsKLQljYXNlIDA6Ci0JCWlmIChfRlBfRlJBQ19aRVJPUF8yKERBKSkKLQkJCWJpdCA9IDEwOwkvKiB6ZXJvICovCi0JCWVsc2UKLQkJCWJpdCA9IDY7CS8qIGRlbm9ybWFsaXplZCBudW1iZXIgKi8KLQkJYnJlYWs7Ci0JY2FzZSBfRlBfRVhQTUFYX0Q6Ci0JCWlmIChfRlBfRlJBQ19aRVJPUF8yKERBKSkKLQkJCWJpdCA9IDQ7CS8qIGluZmluaXR5ICovCi0JCWVsc2UgaWYgKF9GUF9GUkFDX0hJR0hfUkFXX0QoREEpICYgX0ZQX1FOQU5CSVRfRCkKLQkJCWJpdCA9IDI7CS8qIHF1aWV0IE5BTiAqLwotCQllbHNlCi0JCQliaXQgPSAwOwkvKiBzaWduYWxpbmcgTkFOICovCi0JCWJyZWFrOwotCX0KLQlpZiAoIURBX3MpCi0JCWJpdCsrOwotCWVtdV9zZXRfQ0MocmVncywgKChfX3UzMikgdmFsID4+IGJpdCkgJiAxKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8qIFRlc3QgZGF0YSBjbGFzcyBmbG9hdCAqLwotc3RhdGljIGludCBlbXVfdGNlYiAoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIGludCByeCwgbG9uZyB2YWwpIHsKLSAgICAgICAgRlBfREVDTF9TKFNBKTsKLQlpbnQgYml0OwotCi0gICAgICAgIEZQX1VOUEFDS19SQVdfU1AoU0EsICZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3J4XS5mKTsKLQlzd2l0Y2ggKFNBX2UpIHsKLQlkZWZhdWx0OgotCQliaXQgPSA4OwkJLyogbm9ybWFsaXplZCBudW1iZXIgKi8KLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQlpZiAoX0ZQX0ZSQUNfWkVST1BfMShTQSkpCi0JCQliaXQgPSAxMDsJLyogemVybyAqLwotCQllbHNlCi0JCQliaXQgPSA2OwkvKiBkZW5vcm1hbGl6ZWQgbnVtYmVyICovCi0JCWJyZWFrOwotCWNhc2UgX0ZQX0VYUE1BWF9TOgotCQlpZiAoX0ZQX0ZSQUNfWkVST1BfMShTQSkpCi0JCQliaXQgPSA0OwkvKiBpbmZpbml0eSAqLwotCQllbHNlIGlmIChfRlBfRlJBQ19ISUdIX1JBV19TKFNBKSAmIF9GUF9RTkFOQklUX1MpCi0JCQliaXQgPSAyOwkvKiBxdWlldCBOQU4gKi8KLQkJZWxzZQotCQkJYml0ID0gMDsJLyogc2lnbmFsaW5nIE5BTiAqLwotCQlicmVhazsKLQl9Ci0JaWYgKCFTQV9zKQotCQliaXQrKzsKLQllbXVfc2V0X0NDKHJlZ3MsICgoX191MzIpIHZhbCA+PiBiaXQpICYgMSk7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZW11X2xvYWRfcmVnZChpbnQgcmVnKSB7Ci0JaWYgKChyZWcmOSkgIT0gMCkJLyogdGVzdCBpZiByZWcgaW4gezAsMiw0LDZ9ICovCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCWFzbSB2b2xhdGlsZSgJCS8qIGxvYWQgcmVnIGZyb20gZnBfcmVncy5mcHJzW3JlZ10gKi8KLQkJIglicmFzCTEsMGZcbiIKLQkJIglsZAkwLDAoJTEpXG4iCi0JCSIwOglleAklMCwwKDEpIgotCQk6IC8qIG5vIG91dHB1dCAqLwotCQk6ICJhIiAocmVnPDw0KSwiYSIgKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3JlZ10uZCkKLQkJOiAiMSIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZW11X2xvYWRfcmVnZShpbnQgcmVnKSB7Ci0JaWYgKChyZWcmOSkgIT0gMCkJLyogdGVzdCBpZiByZWcgaW4gezAsMiw0LDZ9ICovCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCWFzbSB2b2xhdGlsZSgJCS8qIGxvYWQgcmVnIGZyb20gZnBfcmVncy5mcHJzW3JlZ10gKi8KLQkJIglicmFzCTEsMGZcbiIKLQkJIglsZQkwLDAoJTEpXG4iCi0JCSIwOglleAklMCwwKDEpIgotCQk6IC8qIG5vIG91dHB1dCAqLwotCQk6ICJhIiAocmVnPDw0KSwgImEiICgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyZWddLmYpCi0JCTogIjEiKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGVtdV9zdG9yZV9yZWdkKGludCByZWcpIHsKLQlpZiAoKHJlZyY5KSAhPSAwKQkvKiB0ZXN0IGlmIHJlZyBpbiB7MCwyLDQsNn0gKi8KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0JYXNtIHZvbGF0aWxlKAkJLyogc3RvcmUgcmVnIHRvIGZwX3JlZ3MuZnByc1tyZWddICovCi0JCSIJYnJhcwkxLDBmXG4iCi0JCSIJc3RkCTAsMCglMSlcbiIKLQkJIjA6CWV4CSUwLDAoMSkiCi0JCTogLyogbm8gb3V0cHV0ICovCi0JCTogImEiIChyZWc8PDQpLCAiYSIgKCZjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcHJzW3JlZ10uZCkKLQkJOiAiMSIpOwotfQotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbXVfc3RvcmVfcmVnZShpbnQgcmVnKSB7Ci0JaWYgKChyZWcmOSkgIT0gMCkJLyogdGVzdCBpZiByZWcgaW4gezAsMiw0LDZ9ICovCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCWFzbSB2b2xhdGlsZSgJCS8qIHN0b3JlIHJlZyB0byBmcF9yZWdzLmZwcnNbcmVnXSAqLwotCQkiCWJyYXMJMSwwZlxuIgotCQkiCXN0ZQkwLDAoJTEpXG4iCi0JCSIwOglleAklMCwwKDEpIgotCQk6IC8qIG5vIG91dHB1dCAqLwotCQk6ICJhIiAocmVnPDw0KSwgImEiICgmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnByc1tyZWddLmYpCi0JCTogIjEiKTsKLX0KLQotaW50IG1hdGhfZW11X2IzKF9fdTggKm9wY29kZSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKSB7Ci0gICAgICAgIGludCBfZmV4ID0gMDsKLSAgICAgICAgc3RhdGljIGNvbnN0IF9fdTggZm9ybWF0X3RhYmxlWzI1Nl0gPSB7Ci0gICAgICAgICAgICAgICAgWzB4MDBdID0gMHgwMyxbMHgwMV0gPSAweDAzLFsweDAyXSA9IDB4MDMsWzB4MDNdID0gMHgwMywKLQkJWzB4MDRdID0gMHgwZixbMHgwNV0gPSAweDBkLFsweDA2XSA9IDB4MGUsWzB4MDddID0gMHgwZCwKLQkJWzB4MDhdID0gMHgwMyxbMHgwOV0gPSAweDAzLFsweDBhXSA9IDB4MDMsWzB4MGJdID0gMHgwMywKLSAgICAgICAgICAgICAgICBbMHgwY10gPSAweDBmLFsweDBkXSA9IDB4MDMsWzB4MGVdID0gMHgwNixbMHgwZl0gPSAweDA2LAotCQlbMHgxMF0gPSAweDAyLFsweDExXSA9IDB4MDIsWzB4MTJdID0gMHgwMixbMHgxM10gPSAweDAyLAotCQlbMHgxNF0gPSAweDAzLFsweDE1XSA9IDB4MDIsWzB4MTZdID0gMHgwMSxbMHgxN10gPSAweDAzLAotICAgICAgICAgICAgICAgIFsweDE4XSA9IDB4MDIsWzB4MTldID0gMHgwMixbMHgxYV0gPSAweDAyLFsweDFiXSA9IDB4MDIsCi0JCVsweDFjXSA9IDB4MDIsWzB4MWRdID0gMHgwMixbMHgxZV0gPSAweDA1LFsweDFmXSA9IDB4MDUsCi0JCVsweDQwXSA9IDB4MDEsWzB4NDFdID0gMHgwMSxbMHg0Ml0gPSAweDAxLFsweDQzXSA9IDB4MDEsCi0gICAgICAgICAgICAgICAgWzB4NDRdID0gMHgxMixbMHg0NV0gPSAweDBkLFsweDQ2XSA9IDB4MTEsWzB4NDddID0gMHgwNCwKLQkJWzB4NDhdID0gMHgwMSxbMHg0OV0gPSAweDAxLFsweDRhXSA9IDB4MDEsWzB4NGJdID0gMHgwMSwKLQkJWzB4NGNdID0gMHgwMSxbMHg0ZF0gPSAweDAxLFsweDUzXSA9IDB4MDYsWzB4NTddID0gMHgwNiwKLSAgICAgICAgICAgICAgICBbMHg1Yl0gPSAweDA1LFsweDVmXSA9IDB4MDUsWzB4ODRdID0gMHgxMyxbMHg4Y10gPSAweDEzLAotCQlbMHg5NF0gPSAweDA5LFsweDk1XSA9IDB4MDgsWzB4OTZdID0gMHgwNyxbMHg5OF0gPSAweDBjLAotCQlbMHg5OV0gPSAweDBiLFsweDlhXSA9IDB4MGEKLSAgICAgICAgfTsKLSAgICAgICAgc3RhdGljIGNvbnN0IHZvaWQgKmp1bXBfdGFibGVbMjU2XT0gewotICAgICAgICAgICAgICAgIFsweDAwXSA9IGVtdV9scGVicixbMHgwMV0gPSBlbXVfbG5lYnIsWzB4MDJdID0gZW11X2x0ZWJyLAotICAgICAgICAgICAgICAgIFsweDAzXSA9IGVtdV9sY2VicixbMHgwNF0gPSBlbXVfbGRlYnIsWzB4MDVdID0gZW11X2x4ZGJyLAotICAgICAgICAgICAgICAgIFsweDA2XSA9IGVtdV9seGVicixbMHgwN10gPSBlbXVfbXhkYnIsWzB4MDhdID0gZW11X2tlYnIsCi0gICAgICAgICAgICAgICAgWzB4MDldID0gZW11X2NlYnIsIFsweDBhXSA9IGVtdV9hZWJyLCBbMHgwYl0gPSBlbXVfc2ViciwKLSAgICAgICAgICAgICAgICBbMHgwY10gPSBlbXVfbWRlYnIsWzB4MGRdID0gZW11X2RlYnIsIFsweDBlXSA9IGVtdV9tYWViciwKLSAgICAgICAgICAgICAgICBbMHgwZl0gPSBlbXVfbXNlYnIsWzB4MTBdID0gZW11X2xwZGJyLFsweDExXSA9IGVtdV9sbmRiciwgCi0gICAgICAgICAgICAgICAgWzB4MTJdID0gZW11X2x0ZGJyLFsweDEzXSA9IGVtdV9sY2RicixbMHgxNF0gPSBlbXVfc3FlYnIsCi0gICAgICAgICAgICAgICAgWzB4MTVdID0gZW11X3NxZGJyLFsweDE2XSA9IGVtdV9zcXhicixbMHgxN10gPSBlbXVfbWVlYnIsCi0gICAgICAgICAgICAgICAgWzB4MThdID0gZW11X2tkYnIsIFsweDE5XSA9IGVtdV9jZGJyLCBbMHgxYV0gPSBlbXVfYWRiciwKLSAgICAgICAgICAgICAgICBbMHgxYl0gPSBlbXVfc2RiciwgWzB4MWNdID0gZW11X21kYnIsIFsweDFkXSA9IGVtdV9kZGJyLCAgCi0gICAgICAgICAgICAgICAgWzB4MWVdID0gZW11X21hZGJyLFsweDFmXSA9IGVtdV9tc2RicixbMHg0MF0gPSBlbXVfbHB4YnIsCi0gICAgICAgICAgICAgICAgWzB4NDFdID0gZW11X2xueGJyLFsweDQyXSA9IGVtdV9sdHhicixbMHg0M10gPSBlbXVfbGN4YnIsCi0gICAgICAgICAgICAgICAgWzB4NDRdID0gZW11X2xlZGJyLFsweDQ1XSA9IGVtdV9sZHhicixbMHg0Nl0gPSBlbXVfbGV4YnIsCi0gICAgICAgICAgICAgICAgWzB4NDddID0gZW11X2ZpeGJyLFsweDQ4XSA9IGVtdV9reGJyLCBbMHg0OV0gPSBlbXVfY3hiciwgIAotICAgICAgICAgICAgICAgIFsweDRhXSA9IGVtdV9heGJyLCBbMHg0Yl0gPSBlbXVfc3hiciwgWzB4NGNdID0gZW11X214YnIsCi0gICAgICAgICAgICAgICAgWzB4NGRdID0gZW11X2R4YnIsIFsweDUzXSA9IGVtdV9kaWVicixbMHg1N10gPSBlbXVfZmllYnIsCi0gICAgICAgICAgICAgICAgWzB4NWJdID0gZW11X2RpZGJyLFsweDVmXSA9IGVtdV9maWRicixbMHg4NF0gPSBlbXVfc2ZwYywKLSAgICAgICAgICAgICAgICBbMHg4Y10gPSBlbXVfZWZwYywgWzB4OTRdID0gZW11X2NlZmJyLFsweDk1XSA9IGVtdV9jZGZiciwgCi0gICAgICAgICAgICAgICAgWzB4OTZdID0gZW11X2N4ZmJyLFsweDk4XSA9IGVtdV9jZmVicixbMHg5OV0gPSBlbXVfY2ZkYnIsCi0gICAgICAgICAgICAgICAgWzB4OWFdID0gZW11X2NmeGJyCi0gICAgICAgIH07Ci0KLSAgICAgICAgc3dpdGNoIChmb3JtYXRfdGFibGVbb3Bjb2RlWzFdXSkgewotICAgICAgICBjYXNlIDE6IC8qIFJSRSBmb3JtYXQsIGxvbmcgZG91YmxlIG9wZXJhdGlvbiAqLwotICAgICAgICAgICAgICAgIGlmIChvcGNvZGVbM10gJiAweDIyKQotCQkJcmV0dXJuIFNJR0lMTDsKLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZCgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdkKCgob3Bjb2RlWzNdID4+IDQpICYgMTUpICsgMik7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2Qob3Bjb2RlWzNdICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdkKChvcGNvZGVbM10gJiAxNSkgKyAyKTsKLSAgICAgICAgICAgICAgICAvKiBjYWxsIHRoZSBlbXVsYXRpb24gZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICBfZmV4ID0gKChpbnQgKCopKHN0cnVjdCBwdF9yZWdzICosaW50LCBpbnQpKQotCQkJanVtcF90YWJsZVtvcGNvZGVbMV1dKQotICAgICAgICAgICAgICAgICAgICAgICAgKHJlZ3MsIG9wY29kZVszXSA+PiA0LCBvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZCgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9sb2FkX3JlZ2QoKChvcGNvZGVbM10gPj4gNCkgJiAxNSkgKyAyKTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdkKG9wY29kZVszXSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdkKChvcGNvZGVbM10gJiAxNSkgKyAyKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogLyogUlJFIGZvcm1hdCwgZG91YmxlIG9wZXJhdGlvbiAqLwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdkKChvcGNvZGVbM10gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2Qob3Bjb2RlWzNdICYgMTUpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQpKQotCQkJanVtcF90YWJsZVtvcGNvZGVbMV1dKQotICAgICAgICAgICAgICAgICAgICAgICAgKHJlZ3MsIG9wY29kZVszXSA+PiA0LCBvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZCgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9sb2FkX3JlZ2Qob3Bjb2RlWzNdICYgMTUpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSAzOiAvKiBSUkUgZm9ybWF0LCBmbG9hdCBvcGVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZSgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdlKG9wY29kZVszXSAmIDE1KTsKLSAgICAgICAgICAgICAgICAvKiBjYWxsIHRoZSBlbXVsYXRpb24gZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICBfZmV4ID0gKChpbnQgKCopKHN0cnVjdCBwdF9yZWdzICosIGludCwgaW50KSkKLQkJCWp1bXBfdGFibGVbb3Bjb2RlWzFdXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWdzLCBvcGNvZGVbM10gPj4gNCwgb3Bjb2RlWzNdICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9sb2FkX3JlZ2UoKG9wY29kZVszXSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdlKG9wY29kZVszXSAmIDE1KTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgNDogLyogUlJGIGZvcm1hdCwgbG9uZyBkb3VibGUgb3BlcmF0aW9uICovCi0gICAgICAgICAgICAgICAgaWYgKG9wY29kZVszXSAmIDB4MjIpCi0JCQlyZXR1cm4gU0lHSUxMOwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdkKChvcGNvZGVbM10gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2QoKChvcGNvZGVbM10gPj4gNCkgJiAxNSkgKyAyKTsKLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZChvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2QoKG9wY29kZVszXSAmIDE1KSArIDIpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQsIGludCkpCi0JCQlqdW1wX3RhYmxlW29wY29kZVsxXV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAocmVncywgb3Bjb2RlWzNdID4+IDQsIG9wY29kZVszXSAmIDE1LCBvcGNvZGVbMl0gPj4gNCk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZCgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9sb2FkX3JlZ2QoKChvcGNvZGVbM10gPj4gNCkgJiAxNSkgKyAyKTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdkKG9wY29kZVszXSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdkKChvcGNvZGVbM10gJiAxNSkgKyAyKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogLyogUlJGIGZvcm1hdCwgZG91YmxlIG9wZXJhdGlvbiAqLwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdkKChvcGNvZGVbMl0gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2QoKG9wY29kZVszXSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZChvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgLyogY2FsbCB0aGUgZW11bGF0aW9uIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgX2ZleCA9ICgoaW50ICgqKShzdHJ1Y3QgcHRfcmVncyAqLCBpbnQsIGludCwgaW50KSkKLQkJCWp1bXBfdGFibGVbb3Bjb2RlWzFdXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWdzLCBvcGNvZGVbM10gPj4gNCwgb3Bjb2RlWzNdICYgMTUsIG9wY29kZVsyXSA+PiA0KTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdkKChvcGNvZGVbMl0gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZCgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9sb2FkX3JlZ2Qob3Bjb2RlWzNdICYgMTUpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSA2OiAvKiBSUkYgZm9ybWF0LCBmbG9hdCBvcGVyYXRpb24gKi8KLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZSgob3Bjb2RlWzJdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdlKChvcGNvZGVbM10gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2Uob3Bjb2RlWzNdICYgMTUpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQsIGludCkpCi0JCQlqdW1wX3RhYmxlW29wY29kZVsxXV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAocmVncywgb3Bjb2RlWzNdID4+IDQsIG9wY29kZVszXSAmIDE1LCBvcGNvZGVbMl0gPj4gNCk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZSgob3Bjb2RlWzJdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9sb2FkX3JlZ2UoKG9wY29kZVszXSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdlKG9wY29kZVszXSAmIDE1KTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgNzogLyogUlJFIGZvcm1hdCwgY3hmYnIgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgICAgICAgICAgICAvKiBjYWxsIHRoZSBlbXVsYXRpb24gZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICBpZiAob3Bjb2RlWzNdICYgMHgyMCkKLQkJCXJldHVybiBTSUdJTEw7Ci0gICAgICAgICAgICAgICAgX2ZleCA9ICgoaW50ICgqKShzdHJ1Y3QgcHRfcmVncyAqLCBpbnQsIGludCkpCi0JCQlqdW1wX3RhYmxlW29wY29kZVsxXV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAocmVncywgb3Bjb2RlWzNdID4+IDQsIG9wY29kZVszXSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdkKChvcGNvZGVbM10gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZCgoKG9wY29kZVszXSA+PiA0KSAmIDE1KSArIDIpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSA4OiAvKiBSUkUgZm9ybWF0LCBjZGZiciBpbnN0cnVjdGlvbiAqLwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQpKQotCQkJanVtcF90YWJsZVtvcGNvZGVbMV1dKQotICAgICAgICAgICAgICAgICAgICAgICAgKHJlZ3MsIG9wY29kZVszXSA+PiA0LCBvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZCgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSA5OiAvKiBSUkUgZm9ybWF0LCBjZWZiciBpbnN0cnVjdGlvbiAqLwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQpKQotCQkJanVtcF90YWJsZVtvcGNvZGVbMV1dKQotICAgICAgICAgICAgICAgICAgICAgICAgKHJlZ3MsIG9wY29kZVszXSA+PiA0LCBvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZSgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotCQlicmVhazsKLSAgICAgICAgY2FzZSAxMDogLyogUlJGIGZvcm1hdCwgY2Z4YnIgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgICAgICAgICAgICBpZiAoKG9wY29kZVsyXSAmIDEyOCkgPT0gMTI4IHx8IChvcGNvZGVbMl0gJiA5NikgPT0gMzIpCi0JCQkvKiBtYXNrIG9mIHsgMiwzLDgtMTUgfSBpcyBpbnZhbGlkICovCi0JCQlyZXR1cm4gU0lHSUxMOwotICAgICAgICAgICAgICAgIGlmIChvcGNvZGVbM10gJiAyKQotCQkJcmV0dXJuIFNJR0lMTDsKLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZChvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2QoKG9wY29kZVszXSAmIDE1KSArIDIpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQsIGludCkpCi0JCQlqdW1wX3RhYmxlW29wY29kZVsxXV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAocmVncywgb3Bjb2RlWzNdID4+IDQsIG9wY29kZVszXSAmIDE1LCBvcGNvZGVbMl0gPj4gNCk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIDExOiAvKiBSUkYgZm9ybWF0LCBjZmRiciBpbnN0cnVjdGlvbiAqLwotICAgICAgICAgICAgICAgIGlmICgob3Bjb2RlWzJdICYgMTI4KSA9PSAxMjggfHwgKG9wY29kZVsyXSAmIDk2KSA9PSAzMikKLQkJCS8qIG1hc2sgb2YgeyAyLDMsOC0xNSB9IGlzIGludmFsaWQgKi8KLQkJCXJldHVybiBTSUdJTEw7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2Qob3Bjb2RlWzNdICYgMTUpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQsIGludCkpCi0JCQlqdW1wX3RhYmxlW29wY29kZVsxXV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAocmVncywgb3Bjb2RlWzNdID4+IDQsIG9wY29kZVszXSAmIDE1LCBvcGNvZGVbMl0gPj4gNCk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIDEyOiAvKiBSUkYgZm9ybWF0LCBjZmViciBpbnN0cnVjdGlvbiAqLwotICAgICAgICAgICAgICAgIGlmICgob3Bjb2RlWzJdICYgMTI4KSA9PSAxMjggfHwgKG9wY29kZVsyXSAmIDk2KSA9PSAzMikKLQkJCS8qIG1hc2sgb2YgeyAyLDMsOC0xNSB9IGlzIGludmFsaWQgKi8KLQkJCXJldHVybiBTSUdJTEw7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2Uob3Bjb2RlWzNdICYgMTUpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQsIGludCkpCi0JCQlqdW1wX3RhYmxlW29wY29kZVsxXV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAocmVncywgb3Bjb2RlWzNdID4+IDQsIG9wY29kZVszXSAmIDE1LCBvcGNvZGVbMl0gPj4gNCk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIDEzOiAvKiBSUkUgZm9ybWF0LCBsZHhiciAmIG1keGJyIGluc3RydWN0aW9uICovCi0gICAgICAgICAgICAgICAgLyogZG91YmxlIHN0b3JlIGJ1dCBsb25nIGRvdWJsZSBsb2FkICovCi0gICAgICAgICAgICAgICAgaWYgKG9wY29kZVszXSAmIDB4MjApCi0JCQlyZXR1cm4gU0lHSUxMOwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdkKChvcGNvZGVbM10gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2Qob3Bjb2RlWzNdICAmIDE1KTsKLSAgICAgICAgICAgICAgICAvKiBjYWxsIHRoZSBlbXVsYXRpb24gZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICBfZmV4ID0gKChpbnQgKCopKHN0cnVjdCBwdF9yZWdzICosIGludCwgaW50KSkKLQkJCWp1bXBfdGFibGVbb3Bjb2RlWzFdXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWdzLCBvcGNvZGVbM10gPj4gNCwgb3Bjb2RlWzNdICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9sb2FkX3JlZ2QoKG9wY29kZVszXSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdkKCgob3Bjb2RlWzNdID4+IDQpICYgMTUpICsgMik7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIDE0OiAvKiBSUkUgZm9ybWF0LCBsZHhiciAmIG1keGJyIGluc3RydWN0aW9uICovCi0gICAgICAgICAgICAgICAgLyogZmxvYXQgc3RvcmUgYnV0IGxvbmcgZG91YmxlIGxvYWQgKi8KLSAgICAgICAgICAgICAgICBpZiAob3Bjb2RlWzNdICYgMHgyMCkKLQkJCXJldHVybiBTSUdJTEw7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2UoKG9wY29kZVszXSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZShvcGNvZGVbM10gICYgMTUpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQpKQotCQkJanVtcF90YWJsZVtvcGNvZGVbMV1dKQotICAgICAgICAgICAgICAgICAgICAgICAgKHJlZ3MsIG9wY29kZVszXSA+PiA0LCBvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZCgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9sb2FkX3JlZ2QoKChvcGNvZGVbM10gPj4gNCkgJiAxNSkgKyAyKTsKLQkJYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IC8qIFJSRSBmb3JtYXQsIGxkZWJyICYgbWRlYnIgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgICAgICAgICAgICAvKiBmbG9hdCBzdG9yZSBidXQgZG91YmxlIGxvYWQgKi8KLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZSgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdlKG9wY29kZVszXSAgJiAxNSk7Ci0gICAgICAgICAgICAgICAgLyogY2FsbCB0aGUgZW11bGF0aW9uIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgX2ZleCA9ICgoaW50ICgqKShzdHJ1Y3QgcHRfcmVncyAqLCBpbnQsIGludCkpCi0JCQlqdW1wX3RhYmxlW29wY29kZVsxXV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAocmVncywgb3Bjb2RlWzNdID4+IDQsIG9wY29kZVszXSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdkKChvcGNvZGVbM10gPj4gNCkgJiAxNSk7Ci0JCWJyZWFrOwotICAgICAgICBjYXNlIDE2OiAvKiBSUkUgZm9ybWF0LCBsZHhiciBpbnN0cnVjdGlvbiAqLwotICAgICAgICAgICAgICAgIC8qIGxvbmcgZG91YmxlIHN0b3JlIGJ1dCBkb3VibGUgbG9hZCAqLwotICAgICAgICAgICAgICAgIGlmIChvcGNvZGVbM10gJiAyKQotCQkJcmV0dXJuIFNJR0lMTDsKLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZChvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2QoKG9wY29kZVszXSAmIDE1KSArIDIpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQpKQotCQkJanVtcF90YWJsZVtvcGNvZGVbMV1dKQotICAgICAgICAgICAgICAgICAgICAgICAgKHJlZ3MsIG9wY29kZVszXSA+PiA0LCBvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZCgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE3OiAvKiBSUkUgZm9ybWF0LCBsZHhiciBpbnN0cnVjdGlvbiAqLwotICAgICAgICAgICAgICAgIC8qIGxvbmcgZG91YmxlIHN0b3JlIGJ1dCBmbG9hdCBsb2FkICovCi0gICAgICAgICAgICAgICAgaWYgKG9wY29kZVszXSAmIDIpCi0JCQlyZXR1cm4gU0lHSUxMOwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdkKG9wY29kZVszXSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZCgob3Bjb2RlWzNdICYgMTUpICsgMik7Ci0gICAgICAgICAgICAgICAgLyogY2FsbCB0aGUgZW11bGF0aW9uIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgX2ZleCA9ICgoaW50ICgqKShzdHJ1Y3QgcHRfcmVncyAqLCBpbnQsIGludCkpCi0JCQlqdW1wX3RhYmxlW29wY29kZVsxXV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAocmVncywgb3Bjb2RlWzNdID4+IDQsIG9wY29kZVszXSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdlKChvcGNvZGVbM10gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IC8qIFJSRSBmb3JtYXQsIGxlZGJyIGluc3RydWN0aW9uICovCi0gICAgICAgICAgICAgICAgLyogZG91YmxlIHN0b3JlIGJ1dCBmbG9hdCBsb2FkICovCi0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2Qob3Bjb2RlWzNdICYgMTUpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQpKQotCQkJanVtcF90YWJsZVtvcGNvZGVbMV1dKQotICAgICAgICAgICAgICAgICAgICAgICAgKHJlZ3MsIG9wY29kZVszXSA+PiA0LCBvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZSgob3Bjb2RlWzNdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAvKiBSUkUgZm9ybWF0LCBlZnBjICYgc2ZwYyBpbnN0cnVjdGlvbiAqLwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBpbnQpKQotCQkJanVtcF90YWJsZVtvcGNvZGVbMV1dKQotICAgICAgICAgICAgICAgICAgICAgICAgKHJlZ3MsIG9wY29kZVszXSA+PiA0LCBvcGNvZGVbM10gJiAxNSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IC8qIGludmFsaWQgb3BlcmF0aW9uICovCi0gICAgICAgICAgICAgICAgcmV0dXJuIFNJR0lMTDsKLSAgICAgICAgfQotCWlmIChfZmV4ICE9IDApIHsKLQkJY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjIHw9IF9mZXg7Ci0JCWlmIChjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJiAoX2ZleCA8PCA4KSkKLQkJCXJldHVybiBTSUdGUEU7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCogY2FsY19hZGRyKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgcngsIGludCByYiwgaW50IGRpc3ApCi17Ci0gICAgICAgIGFkZHJfdCBhZGRyOwotCi0gICAgICAgIHJ4ICY9IDE1OwotICAgICAgICByYiAmPSAxNTsKLSAgICAgICAgYWRkciA9IGRpc3AgJiAweGZmZjsKLSAgICAgICAgYWRkciArPSAocnggIT0gMCkgPyByZWdzLT5ncHJzW3J4XSA6IDA7ICAvKiArIGluZGV4ICovCi0gICAgICAgIGFkZHIgKz0gKHJiICE9IDApID8gcmVncy0+Z3Byc1tyYl0gOiAwOyAgLyogKyBiYXNlICAqLwotICAgICAgICByZXR1cm4gKHZvaWQqKSBhZGRyOwotfQotICAgIAotaW50IG1hdGhfZW11X2VkKF9fdTggKm9wY29kZSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKSB7Ci0gICAgICAgIGludCBfZmV4ID0gMDsKLQotICAgICAgICBzdGF0aWMgY29uc3QgX191OCBmb3JtYXRfdGFibGVbMjU2XSA9IHsKLSAgICAgICAgICAgICAgICBbMHgwNF0gPSAweDA2LFsweDA1XSA9IDB4MDUsWzB4MDZdID0gMHgwNyxbMHgwN10gPSAweDA1LAotCQlbMHgwOF0gPSAweDAyLFsweDA5XSA9IDB4MDIsWzB4MGFdID0gMHgwMixbMHgwYl0gPSAweDAyLAotCQlbMHgwY10gPSAweDA2LFsweDBkXSA9IDB4MDIsWzB4MGVdID0gMHgwNCxbMHgwZl0gPSAweDA0LAotICAgICAgICAgICAgICAgIFsweDEwXSA9IDB4MDgsWzB4MTFdID0gMHgwOSxbMHgxMl0gPSAweDBhLFsweDE0XSA9IDB4MDIsCi0JCVsweDE1XSA9IDB4MDEsWzB4MTddID0gMHgwMixbMHgxOF0gPSAweDAxLFsweDE5XSA9IDB4MDEsCi0JCVsweDFhXSA9IDB4MDEsWzB4MWJdID0gMHgwMSxbMHgxY10gPSAweDAxLFsweDFkXSA9IDB4MDEsCi0gICAgICAgICAgICAgICAgWzB4MWVdID0gMHgwMyxbMHgxZl0gPSAweDAzLAotICAgICAgICB9OwotICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCAqanVtcF90YWJsZVtdPSB7Ci0gICAgICAgICAgICAgICAgWzB4MDRdID0gZW11X2xkZWIsWzB4MDVdID0gZW11X2x4ZGIsWzB4MDZdID0gZW11X2x4ZWIsCi0gICAgICAgICAgICAgICAgWzB4MDddID0gZW11X214ZGIsWzB4MDhdID0gZW11X2tlYiwgWzB4MDldID0gZW11X2NlYiwKLSAgICAgICAgICAgICAgICBbMHgwYV0gPSBlbXVfYWViLCBbMHgwYl0gPSBlbXVfc2ViLCBbMHgwY10gPSBlbXVfbWRlYiwKLSAgICAgICAgICAgICAgICBbMHgwZF0gPSBlbXVfZGViLCBbMHgwZV0gPSBlbXVfbWFlYixbMHgwZl0gPSBlbXVfbXNlYiwKLSAgICAgICAgICAgICAgICBbMHgxMF0gPSBlbXVfdGNlYixbMHgxMV0gPSBlbXVfdGNkYixbMHgxMl0gPSBlbXVfdGN4YiwKLSAgICAgICAgICAgICAgICBbMHgxNF0gPSBlbXVfc3FlYixbMHgxNV0gPSBlbXVfc3FkYixbMHgxN10gPSBlbXVfbWVlYiwKLSAgICAgICAgICAgICAgICBbMHgxOF0gPSBlbXVfa2RiLCBbMHgxOV0gPSBlbXVfY2RiLCBbMHgxYV0gPSBlbXVfYWRiLAotICAgICAgICAgICAgICAgIFsweDFiXSA9IGVtdV9zZGIsIFsweDFjXSA9IGVtdV9tZGIsIFsweDFkXSA9IGVtdV9kZGIsCi0gICAgICAgICAgICAgICAgWzB4MWVdID0gZW11X21hZGIsWzB4MWZdID0gZW11X21zZGIKLSAgICAgICAgfTsKLQotICAgICAgICBzd2l0Y2ggKGZvcm1hdF90YWJsZVtvcGNvZGVbNV1dKSB7Ci0gICAgICAgIGNhc2UgMTogLyogUlhFIGZvcm1hdCwgZG91YmxlIGNvbnN0YW50ICovIHsKLSAgICAgICAgICAgICAgICBfX3U2NCAqZHhiLCB0ZW1wOwotICAgICAgICAgICAgICAgIF9fdTMyIG9wYzsKLQotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdkKChvcGNvZGVbMV0gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgb3BjID0gKigoX191MzIgKikgb3Bjb2RlKTsKLSAgICAgICAgICAgICAgICBkeGIgPSAoX191NjQgKikgY2FsY19hZGRyKHJlZ3MsIG9wYyA+PiAxNiwgb3BjID4+IDEyLCBvcGMpOwotICAgICAgICAgICAgICAgIG1hdGhlbXVfY29weV9mcm9tX3VzZXIoJnRlbXAsIGR4YiwgOCk7Ci0gICAgICAgICAgICAgICAgLyogY2FsbCB0aGUgZW11bGF0aW9uIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgX2ZleCA9ICgoaW50ICgqKShzdHJ1Y3QgcHRfcmVncyAqLCBpbnQsIGRvdWJsZSAqKSkKLQkJCWp1bXBfdGFibGVbb3Bjb2RlWzVdXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWdzLCBvcGNvZGVbMV0gPj4gNCwgKGRvdWJsZSAqKSAmdGVtcCk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZCgob3Bjb2RlWzFdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjogLyogUlhFIGZvcm1hdCwgZmxvYXQgY29uc3RhbnQgKi8gewotICAgICAgICAgICAgICAgIF9fdTMyICpkeGIsIHRlbXA7Ci0gICAgICAgICAgICAgICAgX191MzIgb3BjOwotCi0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2UoKG9wY29kZVsxXSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBvcGMgPSAqKChfX3UzMiAqKSBvcGNvZGUpOwotICAgICAgICAgICAgICAgIGR4YiA9IChfX3UzMiAqKSBjYWxjX2FkZHIocmVncywgb3BjID4+IDE2LCBvcGMgPj4gMTIsIG9wYyk7Ci0gICAgICAgICAgICAgICAgbWF0aGVtdV9nZXRfdXNlcih0ZW1wLCBkeGIpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBmbG9hdCAqKSkKLQkJCWp1bXBfdGFibGVbb3Bjb2RlWzVdXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWdzLCBvcGNvZGVbMV0gPj4gNCwgKGZsb2F0ICopICZ0ZW1wKTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdlKChvcGNvZGVbMV0gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAzOiAvKiBSWEYgZm9ybWF0LCBkb3VibGUgY29uc3RhbnQgKi8gewotICAgICAgICAgICAgICAgIF9fdTY0ICpkeGIsIHRlbXA7Ci0gICAgICAgICAgICAgICAgX191MzIgb3BjOwotCi0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2QoKG9wY29kZVsxXSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZCgob3Bjb2RlWzRdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIG9wYyA9ICooKF9fdTMyICopIG9wY29kZSk7Ci0gICAgICAgICAgICAgICAgZHhiID0gKF9fdTY0ICopIGNhbGNfYWRkcihyZWdzLCBvcGMgPj4gMTYsIG9wYyA+PiAxMiwgb3BjKTsKLSAgICAgICAgICAgICAgICBtYXRoZW11X2NvcHlfZnJvbV91c2VyKCZ0ZW1wLCBkeGIsIDgpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBkb3VibGUgKiwgaW50KSkKLQkJCWp1bXBfdGFibGVbb3Bjb2RlWzVdXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWdzLCBvcGNvZGVbMV0gPj4gNCwgKGRvdWJsZSAqKSAmdGVtcCwgb3Bjb2RlWzRdID4+IDQpOwotICAgICAgICAgICAgICAgIGVtdV9sb2FkX3JlZ2QoKG9wY29kZVsxXSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIDQ6IC8qIFJYRiBmb3JtYXQsIGZsb2F0IGNvbnN0YW50ICovIHsKLSAgICAgICAgICAgICAgICBfX3UzMiAqZHhiLCB0ZW1wOwotICAgICAgICAgICAgICAgIF9fdTMyIG9wYzsKLQotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdlKChvcGNvZGVbMV0gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2UoKG9wY29kZVs0XSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBvcGMgPSAqKChfX3UzMiAqKSBvcGNvZGUpOwotICAgICAgICAgICAgICAgIGR4YiA9IChfX3UzMiAqKSBjYWxjX2FkZHIocmVncywgb3BjID4+IDE2LCBvcGMgPj4gMTIsIG9wYyk7Ci0gICAgICAgICAgICAgICAgbWF0aGVtdV9nZXRfdXNlcih0ZW1wLCBkeGIpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBmbG9hdCAqLCBpbnQpKQotCQkJanVtcF90YWJsZVtvcGNvZGVbNV1dKQotICAgICAgICAgICAgICAgICAgICAgICAgKHJlZ3MsIG9wY29kZVsxXSA+PiA0LCAoZmxvYXQgKikgJnRlbXAsIG9wY29kZVs0XSA+PiA0KTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdlKChvcGNvZGVbNF0gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSA1OiAvKiBSWEUgZm9ybWF0LCBkb3VibGUgY29uc3RhbnQgKi8KLSAgICAgICAgICAgICAgICAvKiBzdG9yZSBkb3VibGUgYW5kIGxvYWQgbG9uZyBkb3VibGUgKi8gCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBfX3U2NCAqZHhiLCB0ZW1wOwotICAgICAgICAgICAgICAgIF9fdTMyIG9wYzsKLSAgICAgICAgICAgICAgICBpZiAoKG9wY29kZVsxXSA+PiA0KSAmIDB4MjApCi0JCQlyZXR1cm4gU0lHSUxMOwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdkKChvcGNvZGVbMV0gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgb3BjID0gKigoX191MzIgKikgb3Bjb2RlKTsKLSAgICAgICAgICAgICAgICBkeGIgPSAoX191NjQgKikgY2FsY19hZGRyKHJlZ3MsIG9wYyA+PiAxNiwgb3BjID4+IDEyLCBvcGMpOwotICAgICAgICAgICAgICAgIG1hdGhlbXVfY29weV9mcm9tX3VzZXIoJnRlbXAsIGR4YiwgOCk7Ci0gICAgICAgICAgICAgICAgLyogY2FsbCB0aGUgZW11bGF0aW9uIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgX2ZleCA9ICgoaW50ICgqKShzdHJ1Y3QgcHRfcmVncyAqLCBpbnQsIGRvdWJsZSAqKSkKLQkJCWp1bXBfdGFibGVbb3Bjb2RlWzVdXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWdzLCBvcGNvZGVbMV0gPj4gNCwgKGRvdWJsZSAqKSAmdGVtcCk7Ci0gICAgICAgICAgICAgICAgZW11X2xvYWRfcmVnZCgob3Bjb2RlWzFdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIGVtdV9sb2FkX3JlZ2QoKChvcGNvZGVbMV0gPj4gNCkgJiAxNSkgKyAyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIDY6IC8qIFJYRSBmb3JtYXQsIGZsb2F0IGNvbnN0YW50ICovCi0gICAgICAgICAgICAgICAgLyogc3RvcmUgZmxvYXQgYW5kIGxvYWQgZG91YmxlICovIAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX191MzIgKmR4YiwgdGVtcDsKLSAgICAgICAgICAgICAgICBfX3UzMiBvcGM7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2UoKG9wY29kZVsxXSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBvcGMgPSAqKChfX3UzMiAqKSBvcGNvZGUpOwotICAgICAgICAgICAgICAgIGR4YiA9IChfX3UzMiAqKSBjYWxjX2FkZHIocmVncywgb3BjID4+IDE2LCBvcGMgPj4gMTIsIG9wYyk7Ci0gICAgICAgICAgICAgICAgbWF0aGVtdV9nZXRfdXNlcih0ZW1wLCBkeGIpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBmbG9hdCAqKSkKLQkJCWp1bXBfdGFibGVbb3Bjb2RlWzVdXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWdzLCBvcGNvZGVbMV0gPj4gNCwgKGZsb2F0ICopICZ0ZW1wKTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdkKChvcGNvZGVbMV0gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSA3OiAvKiBSWEUgZm9ybWF0LCBmbG9hdCBjb25zdGFudCAqLwotICAgICAgICAgICAgICAgIC8qIHN0b3JlIGZsb2F0IGFuZCBsb2FkIGxvbmcgZG91YmxlICovIAotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX191MzIgKmR4YiwgdGVtcDsKLSAgICAgICAgICAgICAgICBfX3UzMiBvcGM7Ci0gICAgICAgICAgICAgICAgaWYgKChvcGNvZGVbMV0gPj4gNCkgJiAweDIwKQotCQkJcmV0dXJuIFNJR0lMTDsKLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZSgob3Bjb2RlWzFdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIG9wYyA9ICooKF9fdTMyICopIG9wY29kZSk7Ci0gICAgICAgICAgICAgICAgZHhiID0gKF9fdTMyICopIGNhbGNfYWRkcihyZWdzLCBvcGMgPj4gMTYsIG9wYyA+PiAxMiwgb3BjKTsKLSAgICAgICAgICAgICAgICBtYXRoZW11X2dldF91c2VyKHRlbXAsIGR4Yik7Ci0gICAgICAgICAgICAgICAgLyogY2FsbCB0aGUgZW11bGF0aW9uIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgX2ZleCA9ICgoaW50ICgqKShzdHJ1Y3QgcHRfcmVncyAqLCBpbnQsIGZsb2F0ICopKQotCQkJanVtcF90YWJsZVtvcGNvZGVbNV1dKQotICAgICAgICAgICAgICAgICAgICAgICAgKHJlZ3MsIG9wY29kZVsxXSA+PiA0LCAoZmxvYXQgKikgJnRlbXApOwotICAgICAgICAgICAgICAgIGVtdV9sb2FkX3JlZ2QoKG9wY29kZVsxXSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBlbXVfbG9hZF9yZWdkKCgob3Bjb2RlWzFdID4+IDQpICYgMTUpICsgMik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSA4OiAvKiBSWEUgZm9ybWF0LCBSWCBhZGRyZXNzIHVzZWQgYXMgaW50IHZhbHVlICovIHsKLSAgICAgICAgICAgICAgICBfX3U2NCBkeGI7Ci0gICAgICAgICAgICAgICAgX191MzIgb3BjOwotCi0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2UoKG9wY29kZVsxXSA+PiA0KSAmIDE1KTsKLSAgICAgICAgICAgICAgICBvcGMgPSAqKChfX3UzMiAqKSBvcGNvZGUpOwotICAgICAgICAgICAgICAgIGR4YiA9IChfX3U2NCkgY2FsY19hZGRyKHJlZ3MsIG9wYyA+PiAxNiwgb3BjID4+IDEyLCBvcGMpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBsb25nKSkKLQkJCWp1bXBfdGFibGVbb3Bjb2RlWzVdXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWdzLCBvcGNvZGVbMV0gPj4gNCwgZHhiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIDk6IC8qIFJYRSBmb3JtYXQsIFJYIGFkZHJlc3MgdXNlZCBhcyBpbnQgdmFsdWUgKi8gewotICAgICAgICAgICAgICAgIF9fdTY0IGR4YjsKLSAgICAgICAgICAgICAgICBfX3UzMiBvcGM7Ci0KLSAgICAgICAgICAgICAgICBlbXVfc3RvcmVfcmVnZCgob3Bjb2RlWzFdID4+IDQpICYgMTUpOwotICAgICAgICAgICAgICAgIG9wYyA9ICooKF9fdTMyICopIG9wY29kZSk7Ci0gICAgICAgICAgICAgICAgZHhiID0gKF9fdTY0KSBjYWxjX2FkZHIocmVncywgb3BjID4+IDE2LCBvcGMgPj4gMTIsIG9wYyk7Ci0gICAgICAgICAgICAgICAgLyogY2FsbCB0aGUgZW11bGF0aW9uIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgX2ZleCA9ICgoaW50ICgqKShzdHJ1Y3QgcHRfcmVncyAqLCBpbnQsIGxvbmcpKQotCQkJanVtcF90YWJsZVtvcGNvZGVbNV1dKQotICAgICAgICAgICAgICAgICAgICAgICAgKHJlZ3MsIG9wY29kZVsxXSA+PiA0LCBkeGIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTA6IC8qIFJYRSBmb3JtYXQsIFJYIGFkZHJlc3MgdXNlZCBhcyBpbnQgdmFsdWUgKi8gewotICAgICAgICAgICAgICAgIF9fdTY0IGR4YjsKLSAgICAgICAgICAgICAgICBfX3UzMiBvcGM7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKG9wY29kZVsxXSA+PiA0KSAmIDIpCi0JCQlyZXR1cm4gU0lHSUxMOwotICAgICAgICAgICAgICAgIGVtdV9zdG9yZV9yZWdkKChvcGNvZGVbMV0gPj4gNCkgJiAxNSk7Ci0gICAgICAgICAgICAgICAgZW11X3N0b3JlX3JlZ2QoKChvcGNvZGVbMV0gPj4gNCkgJiAxNSkgKyAyKTsKLSAgICAgICAgICAgICAgICBvcGMgPSAqKChfX3UzMiAqKSBvcGNvZGUpOwotICAgICAgICAgICAgICAgIGR4YiA9IChfX3U2NCkgY2FsY19hZGRyKHJlZ3MsIG9wYyA+PiAxNiwgb3BjID4+IDEyLCBvcGMpOwotICAgICAgICAgICAgICAgIC8qIGNhbGwgdGhlIGVtdWxhdGlvbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgIF9mZXggPSAoKGludCAoKikoc3RydWN0IHB0X3JlZ3MgKiwgaW50LCBsb25nKSkKLQkJCWp1bXBfdGFibGVbb3Bjb2RlWzVdXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChyZWdzLCBvcGNvZGVbMV0gPj4gNCwgZHhiKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OiAvKiBpbnZhbGlkIG9wZXJhdGlvbiAqLwotICAgICAgICAgICAgICAgIHJldHVybiBTSUdJTEw7Ci0gICAgICAgIH0KLQlpZiAoX2ZleCAhPSAwKSB7Ci0JCWN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyB8PSBfZmV4OwotCQlpZiAoY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjICYgKF9mZXggPDwgOCkpCi0JCQlyZXR1cm4gU0lHRlBFOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVtdWxhdGUgTERSIFJ4LFJ5IHdpdGggUnggb3IgUnkgbm90IGluIHswLCAyLCA0LCA2fQotICovCi1pbnQgbWF0aF9lbXVfbGRyKF9fdTggKm9wY29kZSkgewotICAgICAgICBzMzkwX2ZwX3JlZ3MgKmZwX3JlZ3MgPSAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3M7Ci0gICAgICAgIF9fdTE2IG9wYyA9ICooKF9fdTE2ICopIG9wY29kZSk7Ci0KLSAgICAgICAgaWYgKChvcGMgJiAweDkwKSA9PSAwKSB7ICAgICAgICAgICAvKiB0ZXN0IGlmIHJ4IGluIHswLDIsNCw2fSAqLwotICAgICAgICAgICAgICAgIC8qIHdlIGdvdCBhbiBleGNlcHRpb24gdGhlcmVmb3JlIHJ5IGNhbid0IGJlIGluIHswLDIsNCw2fSAqLwotCQlhc20gdm9sYXRpbGUoCQkvKiBsb2FkIHJ4IGZyb20gZnBfcmVncy5mcHJzW3J5XSAqLwotCQkJIglicmFzCTEsMGZcbiIKLQkJCSIJbGQJMCwwKCUxKVxuIgotCQkJIjA6CWV4CSUwLDAoMSkiCi0JCQk6IC8qIG5vIG91dHB1dCAqLwotCQkJOiAiYSIgKG9wYyAmIDB4ZjApLCAiYSIgKCZmcF9yZWdzLT5mcHJzW29wYyAmIDB4Zl0uZCkKLQkJCTogIjEiKTsKLSAgICAgICAgfSBlbHNlIGlmICgob3BjICYgMHg5KSA9PSAwKSB7ICAgICAvKiB0ZXN0IGlmIHJ5IGluIHswLDIsNCw2fSAqLwotCQlhc20gdm9sYXRpbGUgKAkJLyogc3RvcmUgcnkgdG8gZnBfcmVncy5mcHJzW3J4XSAqLwotCQkJIglicmFzCTEsMGZcbiIKLQkJCSIJc3RkCTAsMCglMSlcbiIKLQkJCSIwOglleAklMCwwKDEpIgotCQkJOiAvKiBubyBvdXRwdXQgKi8KLQkJCTogImEiICgob3BjICYgMHhmKSA8PCA0KSwKLQkJCSAgImEiICgmZnBfcmVncy0+ZnByc1sob3BjICYgMHhmMCk+PjRdLmQpCi0JCQk6ICIxIik7Ci0gICAgICAgIH0gZWxzZSAgLyogbW92ZSBmcF9yZWdzLmZwcnNbcnldIHRvIGZwX3JlZ3MuZnByc1tyeF0gKi8KLSAgICAgICAgICAgICAgICBmcF9yZWdzLT5mcHJzWyhvcGMgJiAweGYwKSA+PiA0XSA9IGZwX3JlZ3MtPmZwcnNbb3BjICYgMHhmXTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVtdWxhdGUgTEVSIFJ4LFJ5IHdpdGggUnggb3IgUnkgbm90IGluIHswLCAyLCA0LCA2fQotICovCi1pbnQgbWF0aF9lbXVfbGVyKF9fdTggKm9wY29kZSkgewotICAgICAgICBzMzkwX2ZwX3JlZ3MgKmZwX3JlZ3MgPSAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3M7Ci0gICAgICAgIF9fdTE2IG9wYyA9ICooKF9fdTE2ICopIG9wY29kZSk7Ci0KLSAgICAgICAgaWYgKChvcGMgJiAweDkwKSA9PSAwKSB7ICAgICAgICAgICAvKiB0ZXN0IGlmIHJ4IGluIHswLDIsNCw2fSAqLwotICAgICAgICAgICAgICAgIC8qIHdlIGdvdCBhbiBleGNlcHRpb24gdGhlcmVmb3JlIHJ5IGNhbid0IGJlIGluIHswLDIsNCw2fSAqLwotCQlhc20gdm9sYXRpbGUoCQkvKiBsb2FkIHJ4IGZyb20gZnBfcmVncy5mcHJzW3J5XSAqLwotCQkJIglicmFzCTEsMGZcbiIKLQkJCSIJbGUJMCwwKCUxKVxuIgotCQkJIjA6CWV4CSUwLDAoMSkiCi0JCQk6IC8qIG5vIG91dHB1dCAqLwotCQkJOiAiYSIgKG9wYyAmIDB4ZjApLCAiYSIgKCZmcF9yZWdzLT5mcHJzW29wYyAmIDB4Zl0uZikKLQkJCTogIjEiKTsKLSAgICAgICAgfSBlbHNlIGlmICgob3BjICYgMHg5KSA9PSAwKSB7ICAgICAvKiB0ZXN0IGlmIHJ5IGluIHswLDIsNCw2fSAqLwotCQlhc20gdm9sYXRpbGUoCQkvKiBzdG9yZSByeSB0byBmcF9yZWdzLmZwcnNbcnhdICovCi0JCQkiCWJyYXMJMSwwZlxuIgotCQkJIglzdGUJMCwwKCUxKVxuIgotCQkJIjA6CWV4CSUwLDAoMSkiCi0JCQk6IC8qIG5vIG91dHB1dCAqLwotCQkJOiAiYSIgKChvcGMgJiAweGYpIDw8IDQpLAotCQkJICAiYSIgKCZmcF9yZWdzLT5mcHJzWyhvcGMgJiAweGYwKSA+PiA0XS5mKQotCQkJOiAiMSIpOwotICAgICAgICB9IGVsc2UgIC8qIG1vdmUgZnBfcmVncy5mcHJzW3J5XSB0byBmcF9yZWdzLmZwcnNbcnhdICovCi0gICAgICAgICAgICAgICAgZnBfcmVncy0+ZnByc1sob3BjICYgMHhmMCkgPj4gNF0gPSBmcF9yZWdzLT5mcHJzW29wYyAmIDB4Zl07Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbXVsYXRlIExEIFIsRChYLEIpIHdpdGggUiBub3QgaW4gezAsIDIsIDQsIDZ9Ci0gKi8KLWludCBtYXRoX2VtdV9sZChfX3U4ICpvcGNvZGUsIHN0cnVjdCBwdF9yZWdzICogcmVncykgewotICAgICAgICBzMzkwX2ZwX3JlZ3MgKmZwX3JlZ3MgPSAmY3VycmVudC0+dGhyZWFkLmZwX3JlZ3M7Ci0gICAgICAgIF9fdTMyIG9wYyA9ICooKF9fdTMyICopIG9wY29kZSk7Ci0gICAgICAgIF9fdTY0ICpkeGI7Ci0KLSAgICAgICAgZHhiID0gKF9fdTY0ICopIGNhbGNfYWRkcihyZWdzLCBvcGMgPj4gMTYsIG9wYyA+PiAxMiwgb3BjKTsKLSAgICAgICAgbWF0aGVtdV9jb3B5X2Zyb21fdXNlcigmZnBfcmVncy0+ZnByc1sob3BjID4+IDIwKSAmIDB4Zl0uZCwgZHhiLCA4KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVtdWxhdGUgTEUgUixEKFgsQikgd2l0aCBSIG5vdCBpbiB7MCwgMiwgNCwgNn0KLSAqLwotaW50IG1hdGhfZW11X2xlKF9fdTggKm9wY29kZSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKSB7Ci0gICAgICAgIHMzOTBfZnBfcmVncyAqZnBfcmVncyA9ICZjdXJyZW50LT50aHJlYWQuZnBfcmVnczsKLSAgICAgICAgX191MzIgb3BjID0gKigoX191MzIgKikgb3Bjb2RlKTsKLSAgICAgICAgX191MzIgKm1lbSwgKmR4YjsKLQotICAgICAgICBkeGIgPSAoX191MzIgKikgY2FsY19hZGRyKHJlZ3MsIG9wYyA+PiAxNiwgb3BjID4+IDEyLCBvcGMpOwotICAgICAgICBtZW0gPSAoX191MzIgKikgKCZmcF9yZWdzLT5mcHJzWyhvcGMgPj4gMjApICYgMHhmXS5mKTsKLSAgICAgICAgbWF0aGVtdV9nZXRfdXNlcihtZW1bMF0sIGR4Yik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbXVsYXRlIFNURCBSLEQoWCxCKSB3aXRoIFIgbm90IGluIHswLCAyLCA0LCA2fQotICovCi1pbnQgbWF0aF9lbXVfc3RkKF9fdTggKm9wY29kZSwgc3RydWN0IHB0X3JlZ3MgKiByZWdzKSB7Ci0gICAgICAgIHMzOTBfZnBfcmVncyAqZnBfcmVncyA9ICZjdXJyZW50LT50aHJlYWQuZnBfcmVnczsKLSAgICAgICAgX191MzIgb3BjID0gKigoX191MzIgKikgb3Bjb2RlKTsKLSAgICAgICAgX191NjQgKmR4YjsKLQotICAgICAgICBkeGIgPSAoX191NjQgKikgY2FsY19hZGRyKHJlZ3MsIG9wYyA+PiAxNiwgb3BjID4+IDEyLCBvcGMpOwotICAgICAgICBtYXRoZW11X2NvcHlfdG9fdXNlcihkeGIsICZmcF9yZWdzLT5mcHJzWyhvcGMgPj4gMjApICYgMHhmXS5kLCA4KTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVtdWxhdGUgU1RFIFIsRChYLEIpIHdpdGggUiBub3QgaW4gezAsIDIsIDQsIDZ9Ci0gKi8KLWludCBtYXRoX2VtdV9zdGUoX191OCAqb3Bjb2RlLCBzdHJ1Y3QgcHRfcmVncyAqIHJlZ3MpIHsKLSAgICAgICAgczM5MF9mcF9yZWdzICpmcF9yZWdzID0gJmN1cnJlbnQtPnRocmVhZC5mcF9yZWdzOwotICAgICAgICBfX3UzMiBvcGMgPSAqKChfX3UzMiAqKSBvcGNvZGUpOwotICAgICAgICBfX3UzMiAqbWVtLCAqZHhiOwotCi0gICAgICAgIGR4YiA9IChfX3UzMiAqKSBjYWxjX2FkZHIocmVncywgb3BjID4+IDE2LCBvcGMgPj4gMTIsIG9wYyk7Ci0gICAgICAgIG1lbSA9IChfX3UzMiAqKSAoJmZwX3JlZ3MtPmZwcnNbKG9wYyA+PiAyMCkgJiAweGZdLmYpOwotICAgICAgICBtYXRoZW11X3B1dF91c2VyKG1lbVswXSwgZHhiKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIEVtdWxhdGUgTEZQQyBEKEIpCi0gKi8KLWludCBtYXRoX2VtdV9sZnBjKF9fdTggKm9wY29kZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIHsKLSAgICAgICAgX191MzIgb3BjID0gKigoX191MzIgKikgb3Bjb2RlKTsKLSAgICAgICAgX191MzIgKmR4YiwgdGVtcDsKLQotICAgICAgICBkeGI9IChfX3UzMiAqKSBjYWxjX2FkZHIocmVncywgMCwgb3BjPj4xMiwgb3BjKTsKLSAgICAgICAgbWF0aGVtdV9nZXRfdXNlcih0ZW1wLCBkeGIpOwotICAgICAgICBpZiAoKHRlbXAgJiB+RlBDX1ZBTElEX01BU0spICE9IDApCi0JCXJldHVybiBTSUdJTEw7Ci0JY3VycmVudC0+dGhyZWFkLmZwX3JlZ3MuZnBjID0gdGVtcDsKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBFbXVsYXRlIFNURlBDIEQoQikKLSAqLwotaW50IG1hdGhfZW11X3N0ZnBjKF9fdTggKm9wY29kZSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpIHsKLSAgICAgICAgX191MzIgb3BjID0gKigoX191MzIgKikgb3Bjb2RlKTsKLSAgICAgICAgX191MzIgKmR4YjsKLQotICAgICAgICBkeGI9IChfX3UzMiAqKSBjYWxjX2FkZHIocmVncywgMCwgb3BjPj4xMiwgb3BjKTsKLSAgICAgICAgbWF0aGVtdV9wdXRfdXNlcihjdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMsIGR4Yik7Ci0gICAgICAgIHJldHVybiAwOwotfQotCi0vKgotICogRW11bGF0ZSBTUk5NIEQoQikKLSAqLwotaW50IG1hdGhfZW11X3Nybm0oX191OCAqb3Bjb2RlLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykgewotICAgICAgICBfX3UzMiBvcGMgPSAqKChfX3UzMiAqKSBvcGNvZGUpOwotICAgICAgICBfX3UzMiB0ZW1wOwotCi0gICAgICAgIHRlbXAgPSBjYWxjX2FkZHIocmVncywgMCwgb3BjPj4xMiwgb3BjKTsKLQljdXJyZW50LT50aHJlYWQuZnBfcmVncy5mcGMgJj0gfjM7Ci0gICAgICAgIGN1cnJlbnQtPnRocmVhZC5mcF9yZWdzLmZwYyB8PSAodGVtcCAmIDMpOwotICAgICAgICByZXR1cm4gMDsKLX0KLQotLyogYnJva2VuIGNvbXBpbGVyIC4uLiAqLwotbG9uZyBsb25nCi1fX25lZ2RpMiAobG9uZyBsb25nIHUpCi17Ci0KLSAgdW5pb24gbGxsIHsKLSAgICBsb25nIGxvbmcgbGw7Ci0gICAgbG9uZyBzWzJdOwotICB9OwotCi0gIHVuaW9uIGxsbCB3LHV1OwotCi0gIHV1LmxsID0gdTsKLQotICB3LnNbMV0gPSAtdXUuc1sxXTsKLSAgdy5zWzBdID0gLXV1LnNbMF0gLSAoKGludCkgdy5zWzFdICE9IDApOwotCi0gIHJldHVybiB3LmxsOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2R1bXBfcGFnZXRhYmxlcy5jIGIvYXJjaC9zMzkwL21tL2R1bXBfcGFnZXRhYmxlcy5jCmluZGV4IGQ0NmNhZGUuLjg1NTZkNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9kdW1wX3BhZ2V0YWJsZXMuYworKysgYi9hcmNoL3MzOTAvbW0vZHVtcF9wYWdldGFibGVzLmMKQEAgLTE4LDkgKzE4LDcgQEAKIAlLRVJORUxfRU5EX05SLAogCVZNRU1NQVBfTlIsCiAJVk1BTExPQ19OUiwKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlNT0RVTEVTX05SLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgc3RydWN0IGFkZHJfbWFya2VyIGFkZHJlc3NfbWFya2Vyc1tdID0gewpAQCAtMjksOSArMjcsNyBAQAogCVtLRVJORUxfRU5EX05SXQkgID0geyh1bnNpZ25lZCBsb25nKSZfZW5kLCAiS2VybmVsIEltYWdlIEVuZCJ9LAogCVtWTUVNTUFQX05SXQkgID0gezAsICJ2bWVtbWFwIEFyZWEifSwKIAlbVk1BTExPQ19OUl0JICA9IHswLCAidm1hbGxvYyBBcmVhIn0sCi0jaWZkZWYgQ09ORklHXzY0QklUCiAJW01PRFVMRVNfTlJdCSAgPSB7MCwgIk1vZHVsZXMgQXJlYSJ9LAotI2VuZGlmCiAJeyAtMSwgTlVMTCB9CiB9OwogCkBAIC0xMjcsMTIgKzEyMyw2IEBACiAJfQogfQogCi0jaWZkZWYgQ09ORklHXzY0QklUCi0jZGVmaW5lIF9QTURfUFJPVF9NQVNLIF9TRUdNRU5UX0VOVFJZX1BST1RFQ1QKLSNlbHNlCi0jZGVmaW5lIF9QTURfUFJPVF9NQVNLIDAKLSNlbmRpZgotCiBzdGF0aWMgdm9pZCB3YWxrX3BtZF9sZXZlbChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBwZ19zdGF0ZSAqc3QsCiAJCQkgICBwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIGFkZHIpCiB7CkBAIC0xNDUsNyArMTM1LDcgQEAKIAkJcG1kID0gcG1kX29mZnNldChwdWQsIGFkZHIpOwogCQlpZiAoIXBtZF9ub25lKCpwbWQpKSB7CiAJCQlpZiAocG1kX2xhcmdlKCpwbWQpKSB7Ci0JCQkJcHJvdCA9IHBtZF92YWwoKnBtZCkgJiBfUE1EX1BST1RfTUFTSzsKKwkJCQlwcm90ID0gcG1kX3ZhbCgqcG1kKSAmIF9TRUdNRU5UX0VOVFJZX1BST1RFQ1Q7CiAJCQkJbm90ZV9wYWdlKG0sIHN0LCBwcm90LCAzKTsKIAkJCX0gZWxzZQogCQkJCXdhbGtfcHRlX2xldmVsKG0sIHN0LCBwbWQsIGFkZHIpOwpAQCAtMTU1LDEyICsxNDUsNiBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBfUFVEX1BST1RfTUFTSyBfUkVHSU9OM19FTlRSWV9STwotI2Vsc2UKLSNkZWZpbmUgX1BVRF9QUk9UX01BU0sgMAotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIHdhbGtfcHVkX2xldmVsKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBnX3N0YXRlICpzdCwKIAkJCSAgIHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKQEAgLTE3Myw3ICsxNTcsNyBAQAogCQlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7CiAJCWlmICghcHVkX25vbmUoKnB1ZCkpCiAJCQlpZiAocHVkX2xhcmdlKCpwdWQpKSB7Ci0JCQkJcHJvdCA9IHB1ZF92YWwoKnB1ZCkgJiBfUFVEX1BST1RfTUFTSzsKKwkJCQlwcm90ID0gcHVkX3ZhbCgqcHVkKSAmIF9SRUdJT04zX0VOVFJZX1JPOwogCQkJCW5vdGVfcGFnZShtLCBzdCwgcHJvdCwgMik7CiAJCQl9IGVsc2UKIAkJCQl3YWxrX3BtZF9sZXZlbChtLCBzdCwgcHVkLCBhZGRyKTsKQEAgLTIzMCwxMyArMjE0LDkgQEAKIAkgKiBrZXJuZWwgQVNDRS4gV2UgbmVlZCB0aGlzIHRvIGtlZXAgdGhlIHBhZ2UgdGFibGUgd2Fsa2VyIGZ1bmN0aW9ucwogCSAqIGZyb20gYWNjZXNzaW5nIG5vbi1leGlzdGVudCBlbnRyaWVzLgogCSAqLwotI2lmZGVmIENPTkZJR18zMkJJVAotCW1heF9hZGRyID0gMVVMIDw8IDMxOwotI2Vsc2UKIAltYXhfYWRkciA9IChTMzkwX2xvd2NvcmUua2VybmVsX2FzY2UgJiBfUkVHSU9OX0VOVFJZX1RZUEVfTUFTSykgPj4gMjsKIAltYXhfYWRkciA9IDFVTCA8PCAobWF4X2FkZHIgKiAxMSArIDMxKTsKIAlhZGRyZXNzX21hcmtlcnNbTU9EVUxFU19OUl0uc3RhcnRfYWRkcmVzcyA9IE1PRFVMRVNfVkFERFI7Ci0jZW5kaWYKIAlhZGRyZXNzX21hcmtlcnNbVk1FTU1BUF9OUl0uc3RhcnRfYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKSB2bWVtbWFwOwogCWFkZHJlc3NfbWFya2Vyc1tWTUFMTE9DX05SXS5zdGFydF9hZGRyZXNzID0gVk1BTExPQ19TVEFSVDsKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJrZXJuZWxfcGFnZV90YWJsZXMiLCAwNDAwLCBOVUxMLCBOVUxMLCAmcHRkdW1wX2ZvcHMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2V4dG1lbS5jIGIvYXJjaC9zMzkwL21tL2V4dG1lbS5jCmluZGV4IDUxOWJiYTcuLjIzYzQ5NjkgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9leHRtZW0uYworKysgYi9hcmNoL3MzOTAvbW0vZXh0bWVtLmMKQEAgLTUxLDcgKzUxLDYgQEAKIAlzdHJ1Y3QgcXJhbmdlIHJhbmdlWzZdOwogfTsKIAotI2lmZGVmIENPTkZJR182NEJJVAogc3RydWN0IHFyYW5nZV9vbGQgewogCXVuc2lnbmVkIGludCBzdGFydDsgLyogbGFzdCBieXRlIHR5cGUgKi8KIAl1bnNpZ25lZCBpbnQgZW5kOyAgIC8qIGxhc3QgYnl0ZSByZXNlcnZlZCAqLwpAQCAtNjUsNyArNjQsNiBAQAogCWludCBzZWdyY250OwogCXN0cnVjdCBxcmFuZ2Vfb2xkIHJhbmdlWzZdOwogfTsKLSNlbmRpZgogCiBzdHJ1Y3QgcWluNjQgewogCWNoYXIgcW9wY29kZTsKQEAgLTEwMyw3ICsxMDEsNiBAQAogc3RhdGljIGludAogZGNzc19zZXRfc3ViY29kZXModm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAljaGFyICpuYW1lID0ga21hbGxvYyg4ICogc2l6ZW9mKGNoYXIpLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJdW5zaWduZWQgbG9uZyByeCwgcnk7CiAJaW50IHJjOwpAQCAtMTM1LDcgKzEzMiw2IEBACiAJCXNlZ2V4dF9zY29kZSA9IERDU1NfU0VHRVhUWDsKIAkJcmV0dXJuIDA7CiAJfQotI2VuZGlmCiAJLyogRGlhZyB4JzY0JyBuZXcgc3ViY29kZXMgYXJlIG5vdCBzdXBwb3J0ZWQsIHNldCB0byBvbGQgc3ViY29kZXMgKi8KIAlsb2Fkc2hyX3Njb2RlID0gRENTU19MT0FETk9MWTsKIAlsb2FkbnNyX3Njb2RlID0gRENTU19MT0FETlNSOwpAQCAtMjA4LDcgKzIwNCw2IEBACiAJcnggPSAodW5zaWduZWQgbG9uZykgcGFyYW1ldGVyOwogCXJ5ID0gKHVuc2lnbmVkIGxvbmcpICpmdW5jOwogCi0jaWZkZWYgQ09ORklHXzY0QklUCiAJLyogNjQtYml0IERpYWcgeCc2NCcgbmV3IHN1YmNvZGUsIGtlZXAgaW4gNjQtYml0IGFkZHJlc3NpbmcgbW9kZSAqLwogCWlmICgqZnVuYyA+IERDU1NfU0VHRVhUKQogCQlhc20gdm9sYXRpbGUoCkBAIC0yMjUsMTMgKzIyMCw2IEBACiAJCQkiCWlwbQklMlxuIgogCQkJIglzcmwJJTIsMjhcbiIKIAkJCTogIitkIiAocngpLCAiK2QiIChyeSksICI9ZCIgKHJjKSA6IDogImNjIik7Ci0jZWxzZQotCWFzbSB2b2xhdGlsZSgKLQkJIglkaWFnCSUwLCUxLDB4NjRcbiIKLQkJIglpcG0JJTJcbiIKLQkJIglzcmwJJTIsMjhcbiIKLQkJOiAiK2QiIChyeCksICIrZCIgKHJ5KSwgIj1kIiAocmMpIDogOiAiY2MiKTsKLSNlbmRpZgogCSpyZXQxID0gcng7CiAJKnJldDIgPSByeTsKIAlyZXR1cm4gcmM7CkBAIC0yODEsNyArMjY5LDYgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAkvKiBPbmx5IG9sZCBmb3JtYXQgb2Ygb3V0cHV0IGFyZWEgb2YgRGlhZ25vc2UgeCc2NCcgaXMgc3VwcG9ydGVkLAogCSAgIGNvcHkgZGF0YSBmb3IgdGhlIG5ldyBmb3JtYXQuICovCiAJaWYgKHNlZ2V4dF9zY29kZSA9PSBEQ1NTX1NFR0VYVCkgewpAQCAtMzA3LDcgKzI5NCw2IEBACiAJCX0KIAkJa2ZyZWUocW91dF9vbGQpOwogCX0KLSNlbmRpZgogCWlmIChxb3V0LT5zZWdjbnQgPiA2KSB7CiAJCXJjID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gb3V0X2ZyZWU7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vZmF1bHQuYyBiL2FyY2gvczM5MC9tbS9mYXVsdC5jCmluZGV4IDNmZjg2NTMuLjc2NTE1YmMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvczM5MC9tbS9mYXVsdC5jCkBAIC0zNiwxNSArMzYsOSBAQAogI2luY2x1ZGUgPGFzbS9mYWNpbGl0eS5oPgogI2luY2x1ZGUgIi4uL2tlcm5lbC9lbnRyeS5oIgogCi0jaWZuZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBfX0ZBSUxfQUREUl9NQVNLIDB4N2ZmZmYwMDAKLSNkZWZpbmUgX19TVUJDT0RFX01BU0sgMHgwMjAwCi0jZGVmaW5lIF9fUEZfUkVTX0ZJRUxEIDBVTEwKLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwogI2RlZmluZSBfX0ZBSUxfQUREUl9NQVNLIC00MDk2TAogI2RlZmluZSBfX1NVQkNPREVfTUFTSyAweDA2MDAKICNkZWZpbmUgX19QRl9SRVNfRklFTEQgMHg4MDAwMDAwMDAwMDAwMDAwVUxMCi0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAKICNkZWZpbmUgVk1fRkFVTFRfQkFEQ09OVEVYVAkweDAxMDAwMAogI2RlZmluZSBWTV9GQVVMVF9CQURNQVAJCTB4MDIwMDAwCkBAIC01NCw3ICs0OCw2IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHN0b3JlX2luZGljYXRpb24gX19yZWFkX21vc3RseTsKIAotI2lmZGVmIENPTkZJR182NEJJVAogc3RhdGljIGludCBfX2luaXQgZmF1bHRfaW5pdCh2b2lkKQogewogCWlmICh0ZXN0X2ZhY2lsaXR5KDc1KSkKQEAgLTYyLDcgKzU1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIGVhcmx5X2luaXRjYWxsKGZhdWx0X2luaXQpOwotI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgaW50IG5vdGlmeV9wYWdlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtMTMzLDcgKzEyNSw2IEBACiAJcmV0dXJuIHByb2JlX2tlcm5lbF9hZGRyZXNzKCh1bnNpZ25lZCBsb25nICopcCwgZHVtbXkpOwogfQogCi0jaWZkZWYgQ09ORklHXzY0QklUCiBzdGF0aWMgdm9pZCBkdW1wX3BhZ2V0YWJsZSh1bnNpZ25lZCBsb25nIGFzY2UsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAl1bnNpZ25lZCBsb25nICp0YWJsZSA9IF9fdmEoYXNjZSAmIFBBR0VfTUFTSyk7CkBAIC0xODcsMzMgKzE3OCw2IEBACiAJcHJfY29udCgiQkFEXG4iKTsKIH0KIAotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCi0KLXN0YXRpYyB2b2lkIGR1bXBfcGFnZXRhYmxlKHVuc2lnbmVkIGxvbmcgYXNjZSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQotewotCXVuc2lnbmVkIGxvbmcgKnRhYmxlID0gX192YShhc2NlICYgUEFHRV9NQVNLKTsKLQotCXByX2FsZXJ0KCJBUzolMDhseCAiLCBhc2NlKTsKLQl0YWJsZSA9IHRhYmxlICsgKChhZGRyZXNzID4+IDIwKSAmIDB4N2ZmKTsKLQlpZiAoYmFkX2FkZHJlc3ModGFibGUpKQotCQlnb3RvIGJhZDsKLQlwcl9jb250KCJTOiUwOGx4ICIsICp0YWJsZSk7Ci0JaWYgKCp0YWJsZSAmIF9TRUdNRU5UX0VOVFJZX0lOVkFMSUQpCi0JCWdvdG8gb3V0OwotCXRhYmxlID0gKHVuc2lnbmVkIGxvbmcgKikoKnRhYmxlICYgX1NFR01FTlRfRU5UUllfT1JJR0lOKTsKLQl0YWJsZSA9IHRhYmxlICsgKChhZGRyZXNzID4+IDEyKSAmIDB4ZmYpOwotCWlmIChiYWRfYWRkcmVzcyh0YWJsZSkpCi0JCWdvdG8gYmFkOwotCXByX2NvbnQoIlA6JTA4bHggIiwgKnRhYmxlKTsKLW91dDoKLQlwcl9jb250KCJcbiIpOwotCXJldHVybjsKLWJhZDoKLQlwcl9jb250KCJCQURcbiIpOwotfQotCi0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCi0KIHN0YXRpYyB2b2lkIGR1bXBfZmF1bHRfaW5mbyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAl1bnNpZ25lZCBsb25nIGFzY2U7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vZ3VwLmMgYi9hcmNoL3MzOTAvbW0vZ3VwLmMKaW5kZXggNWM1ODZjNy4uMWViNDFiYiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2d1cC5jCisrKyBiL2FyY2gvczM5MC9tbS9ndXAuYwpAQCAtMTA2LDExICsxMDYsOSBAQAogCXBtZF90ICpwbWRwLCBwbWQ7CiAKIAlwbWRwID0gKHBtZF90ICopIHB1ZHA7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJaWYgKChwdWRfdmFsKHB1ZCkgJiBfUkVHSU9OX0VOVFJZX1RZUEVfTUFTSykgPT0gX1JFR0lPTl9FTlRSWV9UWVBFX1IzKQogCQlwbWRwID0gKHBtZF90ICopIHB1ZF9kZXJlZihwdWQpOwogCXBtZHAgKz0gcG1kX2luZGV4KGFkZHIpOwotI2VuZGlmCiAJZG8gewogCQlwbWQgPSAqcG1kcDsKIAkJYmFycmllcigpOwpAQCAtMTQ1LDExICsxNDMsOSBAQAogCXB1ZF90ICpwdWRwLCBwdWQ7CiAKIAlwdWRwID0gKHB1ZF90ICopIHBnZHA7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJaWYgKChwZ2RfdmFsKHBnZCkgJiBfUkVHSU9OX0VOVFJZX1RZUEVfTUFTSykgPT0gX1JFR0lPTl9FTlRSWV9UWVBFX1IyKQogCQlwdWRwID0gKHB1ZF90ICopIHBnZF9kZXJlZihwZ2QpOwogCXB1ZHAgKz0gcHVkX2luZGV4KGFkZHIpOwotI2VuZGlmCiAJZG8gewogCQlwdWQgPSAqcHVkcDsKIAkJYmFycmllcigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL21tL2luaXQuYyBiL2FyY2gvczM5MC9tbS9pbml0LmMKaW5kZXggZDM1YjE1MS4uODA4NzVjNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL2luaXQuYworKysgYi9hcmNoL3MzOTAvbW0vaW5pdC5jCkBAIC0xMDUsNyArMTA1LDYgQEAKIAl1bnNpZ25lZCBsb25nIHBnZF90eXBlLCBhc2NlX2JpdHM7CiAKIAlpbml0X21tLnBnZCA9IHN3YXBwZXJfcGdfZGlyOwotI2lmZGVmIENPTkZJR182NEJJVAogCWlmIChWTUFMTE9DX0VORCA+ICgxVUwgPDwgNDIpKSB7CiAJCWFzY2VfYml0cyA9IF9BU0NFX1RZUEVfUkVHSU9OMiB8IF9BU0NFX1RBQkxFX0xFTkdUSDsKIAkJcGdkX3R5cGUgPSBfUkVHSU9OMl9FTlRSWV9FTVBUWTsKQEAgLTExMywxMCArMTEyLDYgQEAKIAkJYXNjZV9iaXRzID0gX0FTQ0VfVFlQRV9SRUdJT04zIHwgX0FTQ0VfVEFCTEVfTEVOR1RIOwogCQlwZ2RfdHlwZSA9IF9SRUdJT04zX0VOVFJZX0VNUFRZOwogCX0KLSNlbHNlCi0JYXNjZV9iaXRzID0gX0FTQ0VfVEFCTEVfTEVOR1RIOwotCXBnZF90eXBlID0gX1NFR01FTlRfRU5UUllfRU1QVFk7Ci0jZW5kaWYKIAlTMzkwX2xvd2NvcmUua2VybmVsX2FzY2UgPSAoX19wYShpbml0X21tLnBnZCkgJiBQQUdFX01BU0spIHwgYXNjZV9iaXRzOwogCWNsZWFyX3RhYmxlKCh1bnNpZ25lZCBsb25nICopIGluaXRfbW0ucGdkLCBwZ2RfdHlwZSwKIAkJICAgIHNpemVvZih1bnNpZ25lZCBsb25nKSoyMDQ4KTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMgYi9hcmNoL3MzOTAvbW0vbWFjY2Vzcy5jCmluZGV4IDJlYjM0YmQuLjhhOTkzYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMKKysrIGIvYXJjaC9zMzkwL21tL21hY2Nlc3MuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBBY2Nlc3Mga2VybmVsIG1lbW9yeSB3aXRob3V0IGZhdWx0aW5nIC0tIHMzOTAgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCiAgKgotICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA5CisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDksIDIwMTUKICAqCiAgKiAgIEF1dGhvcihzKTogSGVpa28gQ2Fyc3RlbnMgPGhlaWtvLmNhcnN0ZW5zQGRlLmlibS5jb20+LAogICoKQEAgLTE2LDUxICsxNiw1NSBAQAogI2luY2x1ZGUgPGFzbS9jdGxfcmVnLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0byBrZXJuZWwgbWVtb3J5IGJ5cGFzc2luZyBEQVQgYW5kIHBvc3NpYmxlCi0gKiB3cml0ZSBwcm90ZWN0aW9uLiBJdCBjb3BpZXMgb25lIHRvIGZvdXIgYnl0ZXMgZnJvbSBzcmMgdG8gZHN0Ci0gKiB1c2luZyB0aGUgc3R1cmEgaW5zdHJ1Y3Rpb24uCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIG9yIC1FRkFVTFQuCi0gKi8KLXN0YXRpYyBsb25nIHByb2JlX2tlcm5lbF93cml0ZV9vZGQodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzaXplKQorc3RhdGljIG5vdHJhY2UgbG9uZyBzMzkwX2tlcm5lbF93cml0ZV9vZGQodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzaXplKQogewotCXVuc2lnbmVkIGxvbmcgY291bnQsIGFsaWduZWQ7Ci0JaW50IG9mZnNldCwgbWFzazsKLQlpbnQgcmMgPSAtRUZBVUxUOworCXVuc2lnbmVkIGxvbmcgYWxpZ25lZCwgb2Zmc2V0LCBjb3VudDsKKwljaGFyIHRtcFs4XTsKIAotCWFsaWduZWQgPSAodW5zaWduZWQgbG9uZykgZHN0ICYgfjNVTDsKLQlvZmZzZXQgPSAodW5zaWduZWQgbG9uZykgZHN0ICYgMzsKLQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIDQgLSBvZmZzZXQsIHNpemUpOwotCW1hc2sgPSAoMHhmIDw8ICg0IC0gY291bnQpKSAmIDB4ZjsKLQltYXNrID4+PSBvZmZzZXQ7CisJYWxpZ25lZCA9ICh1bnNpZ25lZCBsb25nKSBkc3QgJiB+N1VMOworCW9mZnNldCA9ICh1bnNpZ25lZCBsb25nKSBkc3QgJiA3VUw7CisJc2l6ZSA9IG1pbig4VUwgLSBvZmZzZXQsIHNpemUpOworCWNvdW50ID0gc2l6ZSAtIDE7CiAJYXNtIHZvbGF0aWxlKAogCQkiCWJyYXMJMSwwZlxuIgotCQkiCWljbQkwLDAsMCglMylcbiIKLQkJIjA6CWwJMCwwKCUxKVxuIgotCQkiCWxyYQklMSwwKCUxKVxuIgotCQkiMToJZXgJJTIsMCgxKVxuIgotCQkiMjoJc3R1cmEJMCwlMVxuIgotCQkiCWxhCSUwLDBcbiIKLQkJIjM6XG4iCi0JCUVYX1RBQkxFKDBiLDNiKSBFWF9UQUJMRSgxYiwzYikgRVhfVEFCTEUoMmIsM2IpCi0JCTogIitkIiAocmMpLCAiK2EiIChhbGlnbmVkKQotCQk6ICJhIiAobWFzayksICJhIiAoc3JjKSA6ICJjYyIsICJtZW1vcnkiLCAiMCIsICIxIik7Ci0JcmV0dXJuIHJjID8gcmMgOiBjb3VudDsKKwkJIgltdmMJMCgxLCU0KSwwKCU1KVxuIgorCQkiMDoJbXZjCTAoOCwlMyksMCglMClcbiIKKwkJIglleAklMSwwKDEpXG4iCisJCSIJbGcJJTEsMCglMylcbiIKKwkJIglscmEJJTAsMCglMClcbiIKKwkJIglzdHVyZwklMSwlMFxuIgorCQk6ICIrJmEiIChhbGlnbmVkKSwgIismYSIgKGNvdW50KSwgIj1tIiAodG1wKQorCQk6ICJhIiAoJnRtcCksICJhIiAoJnRtcFtvZmZzZXRdKSwgImEiIChzcmMpCisJCTogImNjIiwgIm1lbW9yeSIsICIxIik7CisJcmV0dXJuIHNpemU7CiB9CiAKLWxvbmcgcHJvYmVfa2VybmVsX3dyaXRlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc2l6ZSkKKy8qCisgKiBzMzkwX2tlcm5lbF93cml0ZSAtIHdyaXRlIHRvIGtlcm5lbCBtZW1vcnkgYnlwYXNzaW5nIERBVAorICogQGRzdDogZGVzdGluYXRpb24gYWRkcmVzcworICogQHNyYzogc291cmNlIGFkZHJlc3MKKyAqIEBzaXplOiBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICoKKyAqIFRoaXMgZnVuY3Rpb24gd3JpdGVzIHRvIGtlcm5lbCBtZW1vcnkgYnlwYXNzaW5nIERBVCBhbmQgcG9zc2libGUgcGFnZSB0YWJsZQorICogd3JpdGUgcHJvdGVjdGlvbi4gSXQgd3JpdGVzIHRvIHRoZSBkZXN0aW5hdGlvbiB1c2luZyB0aGUgc3R1cmcgaW5zdHJ1Y3Rpb24uCisgKiBUaGVyZWZvcmUgd2UgaGF2ZSBhIHJlYWQtbW9kaWZ5LXdyaXRlIHNlcXVlbmNlOiB0aGUgZnVuY3Rpb24gcmVhZHMgZWlnaHQKKyAqIGJ5dGVzIGZyb20gZGVzdGluYXRpb24gYXQgYW4gZWlnaHQgYnl0ZSBib3VuZGFyeSwgbW9kaWZpZXMgdGhlIGJ5dGVzCisgKiByZXF1ZXN0ZWQgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgaW4gYSBsb29wLgorICoKKyAqIE5vdGU6IHRoaXMgbWVhbnMgdGhhdCB0aGlzIGZ1bmN0aW9uIG1heSBub3QgYmUgY2FsbGVkIGNvbmN1cnJlbnRseSBvbgorICoJIHNldmVyYWwgY3B1cyB3aXRoIG92ZXJsYXBwaW5nIHdvcmRzLCBzaW5jZSB0aGlzIG1heSBwb3RlbnRpYWxseQorICoJIGNhdXNlIGRhdGEgY29ycnVwdGlvbi4KKyAqLwordm9pZCBub3RyYWNlIHMzOTBfa2VybmVsX3dyaXRlKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc2l6ZSkKIHsKLQlsb25nIGNvcGllZCA9IDA7CisJbG9uZyBjb3BpZWQ7CiAKIAl3aGlsZSAoc2l6ZSkgewotCQljb3BpZWQgPSBwcm9iZV9rZXJuZWxfd3JpdGVfb2RkKGRzdCwgc3JjLCBzaXplKTsKLQkJaWYgKGNvcGllZCA8IDApCi0JCQlicmVhazsKKwkJY29waWVkID0gczM5MF9rZXJuZWxfd3JpdGVfb2RkKGRzdCwgc3JjLCBzaXplKTsKIAkJZHN0ICs9IGNvcGllZDsKIAkJc3JjICs9IGNvcGllZDsKIAkJc2l6ZSAtPSBjb3BpZWQ7CiAJfQotCXJldHVybiBjb3BpZWQgPCAwID8gLUVGQVVMVCA6IDA7CiB9CiAKIHN0YXRpYyBpbnQgX19tZW1jcHlfcmVhbCh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCkKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9tZW1fZGV0ZWN0LmMgYi9hcmNoL3MzOTAvbW0vbWVtX2RldGVjdC5jCmluZGV4IDU1MzVjZmUuLjBmMzYwNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9tZW1fZGV0ZWN0LmMKKysrIGIvYXJjaC9zMzkwL21tL21lbV9kZXRlY3QuYwpAQCAtMzYsMTAgKzM2LDYgQEAKIAltZW1zaXplID0gcnptICogcm5tYXg7CiAJaWYgKCFyem0pCiAJCXJ6bSA9IDFVTEwgPDwgMTc7Ci0JaWYgKElTX0VOQUJMRUQoQ09ORklHXzMyQklUKSkgewotCQlyem0gPSBtaW4oQUREUjJHLCByem0pOwotCQltZW1zaXplID0gbWluKEFERFIyRywgbWVtc2l6ZSk7Ci0JfQogCW1heF9waHlzbWVtX2VuZCA9IG1lbXNpemU7CiAJYWRkciA9IDA7CiAJLyoga2VlcCBtZW1ibG9jayBsaXN0cyBjbG9zZSB0byB0aGUga2VybmVsICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vbW1hcC5jIGIvYXJjaC9zMzkwL21tL21tYXAuYwppbmRleCAxNzlhMmMyLi42ZTU1MmFmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vbW1hcC5jCisrKyBiL2FyY2gvczM5MC9tbS9tbWFwLmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogCiB1bnNpZ25lZCBsb25nIG1tYXBfcm5kX21hc2s7Ci11bnNpZ25lZCBsb25nIG1tYXBfYWxpZ25fbWFzazsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1tYXBfYWxpZ25fbWFzazsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RhY2tfbWF4cmFuZG9tX3NpemUodm9pZCkKIHsKQEAgLTYwLDIyICs2MCwyMCBAQAogCXJldHVybiBzeXNjdGxfbGVnYWN5X3ZhX2xheW91dDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbW1hcF9ybmQodm9pZCkKK3Vuc2lnbmVkIGxvbmcgYXJjaF9tbWFwX3JuZCh2b2lkKQogewotCWlmICghKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKSkKLQkJcmV0dXJuIDA7CiAJaWYgKGlzXzMyYml0X3Rhc2soKSkKIAkJcmV0dXJuIChnZXRfcmFuZG9tX2ludCgpICYgMHg3ZmYpIDw8IFBBR0VfU0hJRlQ7CiAJZWxzZQogCQlyZXR1cm4gKGdldF9yYW5kb21faW50KCkgJiBtbWFwX3JuZF9tYXNrKSA8PCBQQUdFX1NISUZUOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtbWFwX2Jhc2VfbGVnYWN5KHZvaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtbWFwX2Jhc2VfbGVnYWN5KHVuc2lnbmVkIGxvbmcgcm5kKQogewotCXJldHVybiBUQVNLX1VOTUFQUEVEX0JBU0UgKyBtbWFwX3JuZCgpOworCXJldHVybiBUQVNLX1VOTUFQUEVEX0JBU0UgKyBybmQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbWFwX2Jhc2Uodm9pZCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBtbWFwX2Jhc2UodW5zaWduZWQgbG9uZyBybmQpCiB7CiAJdW5zaWduZWQgbG9uZyBnYXAgPSBybGltaXQoUkxJTUlUX1NUQUNLKTsKIApAQCAtODQsNyArODIsNyBAQAogCWVsc2UgaWYgKGdhcCA+IE1BWF9HQVApCiAJCWdhcCA9IE1BWF9HQVA7CiAJZ2FwICY9IFBBR0VfTUFTSzsKLQlyZXR1cm4gU1RBQ0tfVE9QIC0gc3RhY2tfbWF4cmFuZG9tX3NpemUoKSAtIG1tYXBfcm5kKCkgLSBnYXA7CisJcmV0dXJuIFNUQUNLX1RPUCAtIHN0YWNrX21heHJhbmRvbV9zaXplKCkgLSBybmQgLSBnYXA7CiB9CiAKIHVuc2lnbmVkIGxvbmcKQEAgLTE3OSw0MCArMTc3LDYgQEAKIAlyZXR1cm4gYWRkcjsKIH0KIAotdW5zaWduZWQgbG9uZyByYW5kb21pemVfZXRfZHluKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBiYXNlOwotCi0JYmFzZSA9IFNUQUNLX1RPUCAvIDMgKiAyOwotCWlmICghaXNfMzJiaXRfdGFzaygpKQotCQkvKiBBbGlnbiB0byA0R0IgKi8KLQkJYmFzZSAmPSB+KCgxVUwgPDwgMzIpIC0gMSk7Ci0JcmV0dXJuIGJhc2UgKyBtbWFwX3JuZCgpOwotfQotCi0jaWZuZGVmIENPTkZJR182NEJJVAotCi0vKgotICogVGhpcyBmdW5jdGlvbiwgY2FsbGVkIHZlcnkgZWFybHkgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiBhIG5ldwotICogcHJvY2VzcyBWTSBpbWFnZSwgc2V0cyB1cCB3aGljaCBWTSBsYXlvdXQgZnVuY3Rpb24gdG8gdXNlOgotICovCi12b2lkIGFyY2hfcGlja19tbWFwX2xheW91dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLQkvKgotCSAqIEZhbGwgYmFjayB0byB0aGUgc3RhbmRhcmQgbGF5b3V0IGlmIHRoZSBwZXJzb25hbGl0eQotCSAqIGJpdCBpcyBzZXQsIG9yIGlmIHRoZSBleHBlY3RlZCBzdGFjayBncm93dGggaXMgdW5saW1pdGVkOgotCSAqLwotCWlmIChtbWFwX2lzX2xlZ2FjeSgpKSB7Ci0JCW1tLT5tbWFwX2Jhc2UgPSBtbWFwX2Jhc2VfbGVnYWN5KCk7Ci0JCW1tLT5nZXRfdW5tYXBwZWRfYXJlYSA9IGFyY2hfZ2V0X3VubWFwcGVkX2FyZWE7Ci0JfSBlbHNlIHsKLQkJbW0tPm1tYXBfYmFzZSA9IG1tYXBfYmFzZSgpOwotCQltbS0+Z2V0X3VubWFwcGVkX2FyZWEgPSBhcmNoX2dldF91bm1hcHBlZF9hcmVhX3RvcGRvd247Ci0JfQotfQotCi0jZWxzZQotCiBpbnQgczM5MF9tbWFwX2NoZWNrKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CiAJaWYgKGlzX2NvbXBhdF90YXNrKCkgfHwgKFRBU0tfU0laRSA+PSAoMVVMIDw8IDUzKSkpCkBAIC0yNzMsMTUgKzIzNywyMCBAQAogICovCiB2b2lkIGFyY2hfcGlja19tbWFwX2xheW91dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKKwl1bnNpZ25lZCBsb25nIHJhbmRvbV9mYWN0b3IgPSAwVUw7CisKKwlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9SQU5ET01JWkUpCisJCXJhbmRvbV9mYWN0b3IgPSBhcmNoX21tYXBfcm5kKCk7CisKIAkvKgogCSAqIEZhbGwgYmFjayB0byB0aGUgc3RhbmRhcmQgbGF5b3V0IGlmIHRoZSBwZXJzb25hbGl0eQogCSAqIGJpdCBpcyBzZXQsIG9yIGlmIHRoZSBleHBlY3RlZCBzdGFjayBncm93dGggaXMgdW5saW1pdGVkOgogCSAqLwogCWlmIChtbWFwX2lzX2xlZ2FjeSgpKSB7Ci0JCW1tLT5tbWFwX2Jhc2UgPSBtbWFwX2Jhc2VfbGVnYWN5KCk7CisJCW1tLT5tbWFwX2Jhc2UgPSBtbWFwX2Jhc2VfbGVnYWN5KHJhbmRvbV9mYWN0b3IpOwogCQltbS0+Z2V0X3VubWFwcGVkX2FyZWEgPSBzMzkwX2dldF91bm1hcHBlZF9hcmVhOwogCX0gZWxzZSB7Ci0JCW1tLT5tbWFwX2Jhc2UgPSBtbWFwX2Jhc2UoKTsKKwkJbW0tPm1tYXBfYmFzZSA9IG1tYXBfYmFzZShyYW5kb21fZmFjdG9yKTsKIAkJbW0tPmdldF91bm1hcHBlZF9hcmVhID0gczM5MF9nZXRfdW5tYXBwZWRfYXJlYV90b3Bkb3duOwogCX0KIH0KQEAgLTMxNyw1ICsyODYsMyBAQAogCXJldHVybiAwOwogfQogZWFybHlfaW5pdGNhbGwoc2V0dXBfbW1hcF9ybmQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9wYWdlYXR0ci5jIGIvYXJjaC9zMzkwL21tL3BhZ2VhdHRyLmMKaW5kZXggNDI2YzlkNC4uNzQ5Yzk4NCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL21tL3BhZ2VhdHRyLmMKKysrIGIvYXJjaC9zMzkwL21tL3BhZ2VhdHRyLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogewogCWludCBpOwogCi0JaWYgKHRlc3RfZmFjaWxpdHkoMTMpICYmIElTX0VOQUJMRUQoQ09ORklHXzY0QklUKSkgeworCWlmICh0ZXN0X2ZhY2lsaXR5KDEzKSkgewogCQlfX3B0ZXBfaXB0ZV9yYW5nZShhZGRyZXNzLCBuciAtIDEsIHB0ZSk7CiAJCXJldHVybjsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwppbmRleCBiMmMxNTQyLi4zM2Y1ODk0IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKQEAgLTI3LDE0ICsyNyw4IEBACiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAKLSNpZm5kZWYgQ09ORklHXzY0QklUCi0jZGVmaW5lIEFMTE9DX09SREVSCTEKLSNkZWZpbmUgRlJBR19NQVNLCTB4MGYKLSNlbHNlCiAjZGVmaW5lIEFMTE9DX09SREVSCTIKICNkZWZpbmUgRlJBR19NQVNLCTB4MDMKLSNlbmRpZgotCiAKIHVuc2lnbmVkIGxvbmcgKmNyc3RfdGFibGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CkBAIC01MCw3ICs0NCw2IEBACiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdGFibGUsIEFMTE9DX09SREVSKTsKIH0KIAotI2lmZGVmIENPTkZJR182NEJJVAogc3RhdGljIHZvaWQgX19jcnN0X3RhYmxlX3VwZ3JhZGUodm9pZCAqYXJnKQogewogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gYXJnOwpAQCAtMTQwLDcgKzEzMyw2IEBACiAJaWYgKGN1cnJlbnQtPmFjdGl2ZV9tbSA9PSBtbSkKIAkJc2V0X3VzZXJfYXNjZShtbSk7CiB9Ci0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19QR1NURQogCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vdm1lbS5jIGIvYXJjaC9zMzkwL21tL3ZtZW0uYwppbmRleCBiMTU5M2MyLi5lZjdkNmM4IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vdm1lbS5jCisrKyBiL2FyY2gvczM5MC9tbS92bWVtLmMKQEAgLTM4LDEyICszOCwxMCBAQAogewogCXB1ZF90ICpwdWQgPSBOVUxMOwogCi0jaWZkZWYgQ09ORklHXzY0QklUCiAJcHVkID0gdm1lbV9hbGxvY19wYWdlcygyKTsKIAlpZiAoIXB1ZCkKIAkJcmV0dXJuIE5VTEw7CiAJY2xlYXJfdGFibGUoKHVuc2lnbmVkIGxvbmcgKikgcHVkLCBfUkVHSU9OM19FTlRSWV9FTVBUWSwgUEFHRV9TSVpFICogNCk7Ci0jZW5kaWYKIAlyZXR1cm4gcHVkOwogfQogCkBAIC01MSwxMiArNDksMTAgQEAKIHsKIAlwbWRfdCAqcG1kID0gTlVMTDsKIAotI2lmZGVmIENPTkZJR182NEJJVAogCXBtZCA9IHZtZW1fYWxsb2NfcGFnZXMoMik7CiAJaWYgKCFwbWQpCiAJCXJldHVybiBOVUxMOwogCWNsZWFyX3RhYmxlKCh1bnNpZ25lZCBsb25nICopIHBtZCwgX1NFR01FTlRfRU5UUllfRU1QVFksIFBBR0VfU0laRSAqIDQpOwotI2VuZGlmCiAJcmV0dXJuIHBtZDsKIH0KIApAQCAtOTgsNyArOTQsNyBAQAogCQkJcGdkX3BvcHVsYXRlKCZpbml0X21tLCBwZ19kaXIsIHB1X2Rpcik7CiAJCX0KIAkJcHVfZGlyID0gcHVkX29mZnNldChwZ19kaXIsIGFkZHJlc3MpOwotI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKSAmJiAhZGVmaW5lZChDT05GSUdfREVCVUdfUEFHRUFMTE9DKQorI2lmbmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCiAJCWlmIChNQUNISU5FX0hBU19FREFUMiAmJiBwdWRfbm9uZSgqcHVfZGlyKSAmJiBhZGRyZXNzICYmCiAJCSAgICAhKGFkZHJlc3MgJiB+UFVEX01BU0spICYmIChhZGRyZXNzICsgUFVEX1NJWkUgPD0gZW5kKSkgewogCQkJcHVkX3ZhbCgqcHVfZGlyKSA9IF9fcGEoYWRkcmVzcykgfApAQCAtMTE1LDcgKzExMSw3IEBACiAJCQlwdWRfcG9wdWxhdGUoJmluaXRfbW0sIHB1X2RpciwgcG1fZGlyKTsKIAkJfQogCQlwbV9kaXIgPSBwbWRfb2Zmc2V0KHB1X2RpciwgYWRkcmVzcyk7Ci0jaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpICYmICFkZWZpbmVkKENPTkZJR19ERUJVR19QQUdFQUxMT0MpCisjaWZuZGVmIENPTkZJR19ERUJVR19QQUdFQUxMT0MKIAkJaWYgKE1BQ0hJTkVfSEFTX0VEQVQxICYmIHBtZF9ub25lKCpwbV9kaXIpICYmIGFkZHJlc3MgJiYKIAkJICAgICEoYWRkcmVzcyAmIH5QTURfTUFTSykgJiYgKGFkZHJlc3MgKyBQTURfU0laRSA8PSBlbmQpKSB7CiAJCQlwbWRfdmFsKCpwbV9kaXIpID0gX19wYShhZGRyZXNzKSB8CkBAIC0yMjIsNyArMjE4LDYgQEAKIAogCQlwbV9kaXIgPSBwbWRfb2Zmc2V0KHB1X2RpciwgYWRkcmVzcyk7CiAJCWlmIChwbWRfbm9uZSgqcG1fZGlyKSkgewotI2lmZGVmIENPTkZJR182NEJJVAogCQkJLyogVXNlIDFNQiBmcmFtZXMgZm9yIHZtZW1tYXAgaWYgYXZhaWxhYmxlLiBXZSBhbHdheXMKIAkJCSAqIHVzZSBsYXJnZSBmcmFtZXMgZXZlbiBpZiB0aGV5IGFyZSBvbmx5IHBhcnRpYWxseQogCQkJICogdXNlZC4KQEAgLTI0MCw3ICsyMzUsNiBAQAogCQkJCWFkZHJlc3MgPSAoYWRkcmVzcyArIFBNRF9TSVpFKSAmIFBNRF9NQVNLOwogCQkJCWNvbnRpbnVlOwogCQkJfQotI2VuZGlmCiAJCQlwdF9kaXIgPSB2bWVtX3B0ZV9hbGxvYyhhZGRyZXNzKTsKIAkJCWlmICghcHRfZGlyKQogCQkJCWdvdG8gb3V0OwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL29wcm9maWxlL01ha2VmaWxlIGIvYXJjaC9zMzkwL29wcm9maWxlL01ha2VmaWxlCmluZGV4IDUyNGM0YjYuLjFiZDIzMDEgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9vcHJvZmlsZS9NYWtlZmlsZQorKysgYi9hcmNoL3MzOTAvb3Byb2ZpbGUvTWFrZWZpbGUKQEAgLTcsNCArNyw0IEBACiAJCXRpbWVyX2ludC5vICkKIAogb3Byb2ZpbGUteSA6PQkkKERSSVZFUl9PQkpTKSBpbml0Lm8gYmFja3RyYWNlLm8KLW9wcm9maWxlLSQoQ09ORklHXzY0QklUKQkrPSBod3NhbXBsZXIubworb3Byb2ZpbGUteSArPQlod3NhbXBsZXIubwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL29wcm9maWxlL2luaXQuYyBiL2FyY2gvczM5MC9vcHJvZmlsZS9pbml0LmMKaW5kZXggOWZmZTY0NS4uYmM5MjdhMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL29wcm9maWxlL2luaXQuYworKysgYi9hcmNoL3MzOTAvb3Byb2ZpbGUvaW5pdC5jCkBAIC0yMSw4ICsyMSw2IEBACiAKIGV4dGVybiB2b2lkIHMzOTBfYmFja3RyYWNlKHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywgdW5zaWduZWQgaW50IGRlcHRoKTsKIAotI2lmZGVmIENPTkZJR182NEJJVAotCiAjaW5jbHVkZSAiaHdzYW1wbGVyLmgiCiAjaW5jbHVkZSAib3BfY291bnRlci5oIgogCkBAIC00OTUsMTQgKzQ5MywxMCBAQAogCWh3c2FtcGxlcl9zaHV0ZG93bigpOwogfQogCi0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCi0KIGludCBfX2luaXQgb3Byb2ZpbGVfYXJjaF9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpCiB7CiAJb3BzLT5iYWNrdHJhY2UgPSBzMzkwX2JhY2t0cmFjZTsKIAotI2lmZGVmIENPTkZJR182NEJJVAotCiAJLyoKIAkgKiAtRU5PREVWIGlzIG5vdCByZXBvcnRlZCB0byB0aGUgY2FsbGVyLiAgVGhlIG1vZHVsZSBpdHNlbGYKICAgICAgICAgICogd2lsbCB1c2UgdGhlIHRpbWVyIG1vZGUgc2FtcGxpbmcgYXMgZmFsbGJhY2sgYW5kIHRoaXMgaXMKQEAgLTUxMSwxNCArNTA1LDkgQEAKIAlod3NhbXBsZXJfYXZhaWxhYmxlID0gb3Byb2ZpbGVfaHdzYW1wbGVyX2luaXQob3BzKSA9PSAwOwogCiAJcmV0dXJuIDA7Ci0jZWxzZQotCXJldHVybiAtRU5PREVWOwotI2VuZGlmCiB9CiAKIHZvaWQgb3Byb2ZpbGVfYXJjaF9leGl0KHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJb3Byb2ZpbGVfaHdzYW1wbGVyX2V4aXQoKTsKLSNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL3BjaS9wY2kuYyBiL2FyY2gvczM5MC9wY2kvcGNpLmMKaW5kZXggZjBiODU0NC4uOTgzMzYyMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL3BjaS9wY2kuYworKysgYi9hcmNoL3MzOTAvcGNpL3BjaS5jCkBAIC03ODAsOCArNzgwLDggQEAKIAkJenBjaV9jbGVhbnVwX2J1c19yZXNvdXJjZXMoemRldik7CiAJCXJldHVybiAtRUlPOwogCX0KLQogCXpkZXYtPmJ1cy0+bWF4X2J1c19zcGVlZCA9IHpkZXYtPm1heF9idXNfc3BlZWQ7CisJcGNpX2J1c19hZGRfZGV2aWNlcyh6ZGV2LT5idXMpOwogCXJldHVybiAwOwogfQogCkBAIC05MTMsOCArOTEzLDcgQEAKIAlpZiAoIXMzOTBfcGNpX3Byb2JlKQogCQlyZXR1cm4gMDsKIAotCWlmICghdGVzdF9mYWNpbGl0eSgyKSB8fCAhdGVzdF9mYWNpbGl0eSg2OSkKLQkgICAgfHwgIXRlc3RfZmFjaWxpdHkoNzEpIHx8ICF0ZXN0X2ZhY2lsaXR5KDcyKSkKKwlpZiAoIXRlc3RfZmFjaWxpdHkoNjkpIHx8ICF0ZXN0X2ZhY2lsaXR5KDcxKSB8fCAhdGVzdF9mYWNpbGl0eSg3MikpCiAJCXJldHVybiAwOwogCiAJcmMgPSB6cGNpX2RlYnVnX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9wY2kvcGNpX2RlYnVnLmMgYi9hcmNoL3MzOTAvcGNpL3BjaV9kZWJ1Zy5jCmluZGV4IDMyMjlhMmUuLmMyMmQ0NDAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9wY2kvcGNpX2RlYnVnLmMKKysrIGIvYXJjaC9zMzkwL3BjaS9wY2lfZGVidWcuYwpAQCAtNDUsOCArNDUsMTAgQEAKIAogCWlmICghemRldikKIAkJcmV0dXJuIDA7Ci0JaWYgKCF6ZGV2LT5mbWIpCi0JCXJldHVybiBzZXFfcHJpbnRmKG0sICJGTUIgc3RhdGlzdGljcyBkaXNhYmxlZFxuIik7CisJaWYgKCF6ZGV2LT5mbWIpIHsKKwkJc2VxX3B1dHMobSwgIkZNQiBzdGF0aXN0aWNzIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQogCiAJLyogaGVhZGVyICovCiAJc2VxX3ByaW50ZihtLCAiRk1CIEAgJXBcbiIsIHpkZXYtPmZtYik7CmRpZmYgLS1naXQgYS9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3Njb3JlL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggMzM4NjRmYS4uN2Q5ZmZiMSAxMDA2NDQKLS0tIGEvYXJjaC9zY29yZS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvc2NvcmUvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMjgsNyArMjgsNiBAQAogICovCiBzdHJ1Y3QgdGhyZWFkX2luZm8gewogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KIAl1bnNpZ25lZCBsb25nCQl0cF92YWx1ZTsJLyogdGhyZWFkIHBvaW50ZXIgKi8KIAlfX3UzMgkJCWNwdTsJCS8qIGN1cnJlbnQgQ1BVICovCkBAIC01Myw3ICs1Miw2IEBACiAjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKIHsJCQkJCQlcCiAJLnRhc2sJCT0gJnRzaywJCQlcCi0JLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKIAkuY3B1CQk9IDAsCQkJXAogCS5wcmVlbXB0X2NvdW50CT0gMSwJCQlcCiAJLmFkZHJfbGltaXQJPSBLRVJORUxfRFMsCQlcCmRpZmYgLS1naXQgYS9hcmNoL3Njb3JlL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9zY29yZS9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCBiNGQ1MjE0Li41Mjc5NGY5IDEwMDY0NAotLS0gYS9hcmNoL3Njb3JlL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvc2NvcmUva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTEwMCw3ICsxMDAsNiBAQAogewogCUNPTU1FTlQoIlNDT1JFIHRocmVhZF9pbmZvIG9mZnNldHMuIik7CiAJT0ZGU0VUKFRJX1RBU0ssIHRocmVhZF9pbmZvLCB0YXNrKTsKLQlPRkZTRVQoVElfRVhFQ19ET01BSU4sIHRocmVhZF9pbmZvLCBleGVjX2RvbWFpbik7CiAJT0ZGU0VUKFRJX0ZMQUdTLCB0aHJlYWRfaW5mbywgZmxhZ3MpOwogCU9GRlNFVChUSV9UUF9WQUxVRSwgdGhyZWFkX2luZm8sIHRwX3ZhbHVlKTsKIAlPRkZTRVQoVElfQ1BVLCB0aHJlYWRfaW5mbywgY3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCBlYjRlZjI3Li41MDA1N2ZlIDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC0xNjIsNiArMTYyLDEwIEBACiBjb25maWcgTkVFRF9TR19ETUFfTEVOR1RICiAJZGVmX2Jvb2wgeQogCitjb25maWcgUEdUQUJMRV9MRVZFTFMKKwlkZWZhdWx0IDMgaWYgWDJUTEIKKwlkZWZhdWx0IDIKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAia2VybmVsL0tjb25maWcuZnJlZXplciIKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDFiYzA5ZWUuLmQ1NDYyYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtNTgsMjAgKzU4LDIzIEBACiAKIAluZWVkX2RvbWFpbl9pbmZvID0gbmVlZF9kb21haW5faW5mbyB8fCBob3NlLT5pbmRleDsKIAlob3NlLT5uZWVkX2RvbWFpbl9pbmZvID0gbmVlZF9kb21haW5faW5mbzsKLQlpZiAoYnVzKSB7Ci0JCW5leHRfYnVzbm8gPSBidXMtPmJ1c25fcmVzLmVuZCArIDE7Ci0JCS8qIERvbid0IGFsbG93IDgtYml0IGJ1cyBudW1iZXIgb3ZlcmZsb3cgaW5zaWRlIHRoZSBob3NlIC0KLQkJICAgcmVzZXJ2ZSBzb21lIHNwYWNlIGZvciBicmlkZ2VzLiAqLwotCQlpZiAobmV4dF9idXNubyA+IDIyNCkgewotCQkJbmV4dF9idXNubyA9IDA7Ci0JCQluZWVkX2RvbWFpbl9pbmZvID0gMTsKLQkJfQogCi0JCXBjaV9idXNfc2l6ZV9icmlkZ2VzKGJ1cyk7Ci0JCXBjaV9idXNfYXNzaWduX3Jlc291cmNlcyhidXMpOwotCX0gZWxzZSB7CisJaWYgKCFidXMpIHsKIAkJcGNpX2ZyZWVfcmVzb3VyY2VfbGlzdCgmcmVzb3VyY2VzKTsKKwkJcmV0dXJuOwogCX0KKworCW5leHRfYnVzbm8gPSBidXMtPmJ1c25fcmVzLmVuZCArIDE7CisJLyogRG9uJ3QgYWxsb3cgOC1iaXQgYnVzIG51bWJlciBvdmVyZmxvdyBpbnNpZGUgdGhlIGhvc2UgLQorCSAgIHJlc2VydmUgc29tZSBzcGFjZSBmb3IgYnJpZGdlcy4gKi8KKwlpZiAobmV4dF9idXNubyA+IDIyNCkgeworCQluZXh0X2J1c25vID0gMDsKKwkJbmVlZF9kb21haW5faW5mbyA9IDE7CisJfQorCisJcGNpX2J1c19zaXplX2JyaWRnZXMoYnVzKTsKKwlwY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoYnVzKTsKKwlwY2lfYnVzX2FkZF9kZXZpY2VzKGJ1cyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3NoL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3NoL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggNjU3YzAzOS4uMmFmYTMyMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvc2gvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMjcsNyArMjcsNiBAQAogCiBzdHJ1Y3QgdGhyZWFkX2luZm8gewogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KIAlfX3UzMgkJCXN0YXR1czsJCS8qIHRocmVhZCBzeW5jaHJvbm91cyBmbGFncyAqLwogCV9fdTMyCQkJY3B1OwpAQCAtNTYsNyArNTUsNiBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQlcCiB7CQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJXAotCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAlcCiAJLmZsYWdzCQk9IDAsCQkJXAogCS5zdGF0dXMJCT0gMCwJCQlcCiAJLmNwdQkJPSAwLAkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3NoL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDU0MjIyNWYuLjRiZDQ0ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMjEsNyArMjEsNiBAQAogewogCS8qIG9mZnNldHMgaW50byB0aGUgdGhyZWFkX2luZm8gc3RydWN0ICovCiAJREVGSU5FKFRJX1RBU0ssCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHRhc2spKTsKLQlERUZJTkUoVElfRVhFQ19ET01BSU4sCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZXhlY19kb21haW4pKTsKIAlERUZJTkUoVElfRkxBR1MsCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZmxhZ3MpKTsKIAlERUZJTkUoVElfQ1BVLAkJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBjcHUpKTsKIAlERUZJTkUoVElfUFJFX0NPVU5ULAlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHByZWVtcHRfY291bnQpKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2R3YXJmLmMgYi9hcmNoL3NoL2tlcm5lbC9kd2FyZi5jCmluZGV4IDY3YTA0OWUuLjlkMjA5YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2R3YXJmLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvZHdhcmYuYwpAQCAtOTkzLDcgKzk5Myw3IEBACiAJLnJhdGluZyA9IDE1MCwKIH07CiAKLXN0YXRpYyB2b2lkIGR3YXJmX3Vud2luZGVyX2NsZWFudXAodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBkd2FyZl91bndpbmRlcl9jbGVhbnVwKHZvaWQpCiB7CiAJc3RydWN0IGR3YXJmX2ZkZSAqZmRlLCAqbmV4dF9mZGU7CiAJc3RydWN0IGR3YXJmX2NpZSAqY2llLCAqbmV4dF9jaWU7CkBAIC0xMDA5LDYgKzEwMDksMTAgQEAKIAlyYnRyZWVfcG9zdG9yZGVyX2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2llLCBuZXh0X2NpZSwgJmNpZV9yb290LCBub2RlKQogCQlrZnJlZShjaWUpOwogCisJaWYgKGR3YXJmX3JlZ19wb29sKQorCQltZW1wb29sX2Rlc3Ryb3koZHdhcmZfcmVnX3Bvb2wpOworCWlmIChkd2FyZl9mcmFtZV9wb29sKQorCQltZW1wb29sX2Rlc3Ryb3koZHdhcmZfZnJhbWVfcG9vbCk7CiAJa21lbV9jYWNoZV9kZXN0cm95KGR3YXJmX3JlZ19jYWNoZXApOwogCWttZW1fY2FjaGVfZGVzdHJveShkd2FyZl9mcmFtZV9jYWNoZXApOwogfQpAQCAtMTE3NiwxNyArMTE4MCwxMyBAQAogCQkJc2l6ZW9mKHN0cnVjdCBkd2FyZl9yZWcpLCAwLAogCQkJU0xBQl9QQU5JQyB8IFNMQUJfSFdDQUNIRV9BTElHTiB8IFNMQUJfTk9UUkFDSywgTlVMTCk7CiAKLQlkd2FyZl9mcmFtZV9wb29sID0gbWVtcG9vbF9jcmVhdGUoRFdBUkZfRlJBTUVfTUlOX1JFUSwKLQkJCQkJICBtZW1wb29sX2FsbG9jX3NsYWIsCi0JCQkJCSAgbWVtcG9vbF9mcmVlX3NsYWIsCi0JCQkJCSAgZHdhcmZfZnJhbWVfY2FjaGVwKTsKKwlkd2FyZl9mcmFtZV9wb29sID0gbWVtcG9vbF9jcmVhdGVfc2xhYl9wb29sKERXQVJGX0ZSQU1FX01JTl9SRVEsCisJCQkJCQkgICAgZHdhcmZfZnJhbWVfY2FjaGVwKTsKIAlpZiAoIWR3YXJmX2ZyYW1lX3Bvb2wpCiAJCWdvdG8gb3V0OwogCi0JZHdhcmZfcmVnX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZShEV0FSRl9SRUdfTUlOX1JFUSwKLQkJCQkJIG1lbXBvb2xfYWxsb2Nfc2xhYiwKLQkJCQkJIG1lbXBvb2xfZnJlZV9zbGFiLAotCQkJCQkgZHdhcmZfcmVnX2NhY2hlcCk7CisJZHdhcmZfcmVnX3Bvb2wgPSBtZW1wb29sX2NyZWF0ZV9zbGFiX3Bvb2woRFdBUkZfUkVHX01JTl9SRVEsCisJCQkJCQkgIGR3YXJmX3JlZ19jYWNoZXApOwogCWlmICghZHdhcmZfcmVnX3Bvb2wpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9pcnEuYyBiL2FyY2gvc2gva2VybmVsL2lycS5jCmluZGV4IDY1YTFlY2QuLmViMTBmZjggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2lycS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2lycS5jCkBAIC0xMjQsNyArMTI0LDYgQEAKIAogCWlycWN0eCA9ICh1bmlvbiBpcnFfY3R4ICopJmhhcmRpcnFfc3RhY2tbY3B1ICogVEhSRUFEX1NJWkVdOwogCWlycWN0eC0+dGluZm8udGFzawkJPSBOVUxMOwotCWlycWN0eC0+dGluZm8uZXhlY19kb21haW4JPSBOVUxMOwogCWlycWN0eC0+dGluZm8uY3B1CQk9IGNwdTsKIAlpcnFjdHgtPnRpbmZvLnByZWVtcHRfY291bnQJPSBIQVJESVJRX09GRlNFVDsKIAlpcnFjdHgtPnRpbmZvLmFkZHJfbGltaXQJPSBNQUtFX01NX1NFRygwKTsKQEAgLTEzMyw3ICsxMzIsNiBAQAogCiAJaXJxY3R4ID0gKHVuaW9uIGlycV9jdHggKikmc29mdGlycV9zdGFja1tjcHUgKiBUSFJFQURfU0laRV07CiAJaXJxY3R4LT50aW5mby50YXNrCQk9IE5VTEw7Ci0JaXJxY3R4LT50aW5mby5leGVjX2RvbWFpbgk9IE5VTEw7CiAJaXJxY3R4LT50aW5mby5jcHUJCT0gY3B1OwogCWlycWN0eC0+dGluZm8ucHJlZW1wdF9jb3VudAk9IDA7CiAJaXJxY3R4LT50aW5mby5hZGRyX2xpbWl0CT0gTUFLRV9NTV9TRUcoMCk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaWduYWxfMzIuYyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbF8zMi5jCmluZGV4IDBiMzRmMmEuLmY3YzNkNWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NpZ25hbF8zMi5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbF8zMi5jCkBAIC0yNjcsMTkgKzI2NywxMiBAQAogewogCXN0cnVjdCBzaWdmcmFtZSBfX3VzZXIgKmZyYW1lOwogCWludCBlcnIgPSAwLCBzaWcgPSBrc2lnLT5zaWc7Ci0JaW50IHNpZ25hbDsKIAogCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKCZrc2lnLT5rYSwgcmVncy0+cmVnc1sxNV0sIHNpemVvZigqZnJhbWUpKTsKIAogCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlzaWduYWwgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCi0JCSYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKLQkJJiYgc2lnIDwgMzIKLQkJPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ10KLQkJOiBzaWc7Ci0KIAllcnIgfD0gc2V0dXBfc2lnY29udGV4dCgmZnJhbWUtPnNjLCByZWdzLCBzZXQtPnNpZ1swXSk7CiAKIAlpZiAoX05TSUdfV09SRFMgPiAxKQpAQCAtMzEzLDcgKzMwNiw3IEBACiAKIAkvKiBTZXQgdXAgcmVnaXN0ZXJzIGZvciBzaWduYWwgaGFuZGxlciAqLwogCXJlZ3MtPnJlZ3NbMTVdID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOwotCXJlZ3MtPnJlZ3NbNF0gPSBzaWduYWw7IC8qIEFyZyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwlyZWdzLT5yZWdzWzRdID0gc2lnOyAvKiBBcmcgZm9yIHNpZ25hbCBoYW5kbGVyICovCiAJcmVncy0+cmVnc1s1XSA9IDA7CiAJcmVncy0+cmVnc1s2XSA9ICh1bnNpZ25lZCBsb25nKSAmZnJhbWUtPnNjOwogCkBAIC0zMjksOCArMzIyLDYgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXNldF9mcyhVU0VSX0RTKTsKLQogCXByX2RlYnVnKCJTSUcgZGVsaXZlciAoJXM6JWQpOiBzcD0lcCBwYz0lMDhseCBwcj0lMDhseFxuIiwKIAkJIGN1cnJlbnQtPmNvbW0sIHRhc2tfcGlkX25yKGN1cnJlbnQpLCBmcmFtZSwgcmVncy0+cGMsIHJlZ3MtPnByKTsKIApAQCAtMzQyLDE5ICszMzMsMTIgQEAKIHsKIAlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKIAlpbnQgZXJyID0gMCwgc2lnID0ga3NpZy0+c2lnOwotCWludCBzaWduYWw7CiAKIAlmcmFtZSA9IGdldF9zaWdmcmFtZSgma3NpZy0+a2EsIHJlZ3MtPnJlZ3NbMTVdLCBzaXplb2YoKmZyYW1lKSk7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGZyYW1lLCBzaXplb2YoKmZyYW1lKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0Jc2lnbmFsID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbgotCQkmJiBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwCi0JCSYmIHNpZyA8IDMyCi0JCT8gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddCi0JCTogc2lnOwotCiAJZXJyIHw9IGNvcHlfc2lnaW5mb190b191c2VyKCZmcmFtZS0+aW5mbywgJmtzaWctPmluZm8pOwogCiAJLyogQ3JlYXRlIHRoZSB1Y29udGV4dC4gICovCkBAIC0zOTIsNyArMzc2LDcgQEAKIAogCS8qIFNldCB1cCByZWdpc3RlcnMgZm9yIHNpZ25hbCBoYW5kbGVyICovCiAJcmVncy0+cmVnc1sxNV0gPSAodW5zaWduZWQgbG9uZykgZnJhbWU7Ci0JcmVncy0+cmVnc1s0XSA9IHNpZ25hbDsgLyogQXJnIGZvciBzaWduYWwgaGFuZGxlciAqLworCXJlZ3MtPnJlZ3NbNF0gPSBzaWc7IC8qIEFyZyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KIAlyZWdzLT5yZWdzWzVdID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+aW5mbzsKIAlyZWdzLT5yZWdzWzZdID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+dWM7CiAKQEAgLTQwOCw4ICszOTIsNiBAQAogCWlmIChlcnIpCiAJCXJldHVybiAtRUZBVUxUOwogCi0Jc2V0X2ZzKFVTRVJfRFMpOwotCiAJcHJfZGVidWcoIlNJRyBkZWxpdmVyICglczolZCk6IHNwPSVwIHBjPSUwOGx4IHByPSUwOGx4XG4iLAogCQkgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCksIGZyYW1lLCByZWdzLT5wYywgcmVncy0+cHIpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zaWduYWxfNjQuYyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbF82NC5jCmluZGV4IDcxOTkzYzYuLmQ4YTNmMGQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NpZ25hbF82NC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NpZ25hbF82NC5jCkBAIC0zODUsMTIgKzM4NSw2IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXNpZ25hbCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4KLQkJJiYgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcAotCQkmJiBzaWcgPCAzMgotCQk/IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXBbc2lnXQotCQk6IHNpZzsKLQogCWVyciB8PSBzZXR1cF9zaWdjb250ZXh0KCZmcmFtZS0+c2MsIHJlZ3MsIHNldC0+c2lnWzBdKTsKIAogCS8qIEdpdmUgdXAgZWFybGllciBhcyBpMzg2LCBpbiBjYXNlICovCkBAIC00NDEsNyArNDM1LDcgQEAKIAkgKiBBbGwgZWRpdGVkIHBvaW50ZXJzIGFyZSBzdWJqZWN0IHRvIE5FRkYuCiAJICovCiAJcmVncy0+cmVnc1tSRUdfU1BdID0gbmVmZl9zaWduX2V4dGVuZCgodW5zaWduZWQgbG9uZylmcmFtZSk7Ci0JcmVncy0+cmVnc1tSRUdfQVJHMV0gPSBzaWduYWw7IC8qIEFyZyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KKwlyZWdzLT5yZWdzW1JFR19BUkcxXSA9IHNpZzsgLyogQXJnIGZvciBzaWduYWwgaGFuZGxlciAqLwogCiAgICAgICAgIC8qIEZJWE1FOgogICAgICAgICAgICBUaGUgZ2xpYmMgcHJvZmlsaW5nIHN1cHBvcnQgZm9yIFNILTUgbmVlZHMgdG8gYmUgcGFzc2VkIGEgc2lnY29udGV4dApAQCAtNDU3LDExICs0NTEsOSBAQAogCiAJcmVncy0+cGMgPSBuZWZmX3NpZ25fZXh0ZW5kKCh1bnNpZ25lZCBsb25nKWtzaWctPmthLnNhLnNhX2hhbmRsZXIpOwogCi0Jc2V0X2ZzKFVTRVJfRFMpOwotCiAJLyogQnJva2VuICUwMTZMeCAqLwogCXByX2RlYnVnKCJTSUcgZGVsaXZlciAoIyVkLCVzOiVkKTogc3A9JXAgcGM9JTA4THglMDhMeCBsaW5rPSUwOEx4JTA4THhcbiIsCi0JCSBzaWduYWwsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZnJhbWUsCisJCSBzaWcsIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgZnJhbWUsCiAJCSByZWdzLT5wYyA+PiAzMiwgcmVncy0+cGMgJiAweGZmZmZmZmZmLAogCQkgREVSRUZfUkVHX1BSID4+IDMyLCBERVJFRl9SRUdfUFIgJiAweGZmZmZmZmZmKTsKIApAQCAtNDczLDE5ICs0NjUsMTIgQEAKIHsKIAlzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKIAlpbnQgZXJyID0gMCwgc2lnID0ga3NpZy0+c2lnOwotCWludCBzaWduYWw7CiAKIAlmcmFtZSA9IGdldF9zaWdmcmFtZSgma3NpZy0+a2EsIHJlZ3MtPnJlZ3NbUkVHX1NQXSwgc2l6ZW9mKCpmcmFtZSkpOwogCiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCXNpZ25hbCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4KLQkJJiYgY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcAotCQkmJiBzaWcgPCAzMgotCQk/IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXBbc2lnXQotCQk6IHNpZzsKLQogCWVyciB8PSBfX3B1dF91c2VyKCZmcmFtZS0+aW5mbywgJmZyYW1lLT5waW5mbyk7CiAJZXJyIHw9IF9fcHV0X3VzZXIoJmZyYW1lLT51YywgJmZyYW1lLT5wdWMpOwogCWVyciB8PSBjb3B5X3NpZ2luZm9fdG9fdXNlcigmZnJhbWUtPmluZm8sICZrc2lnLT5pbmZvKTsKQEAgLTU0MiwxNSArNTI3LDEzIEBACiAJICogQWxsIGVkaXRlZCBwb2ludGVycyBhcmUgc3ViamVjdCB0byBORUZGLgogCSAqLwogCXJlZ3MtPnJlZ3NbUkVHX1NQXSA9IG5lZmZfc2lnbl9leHRlbmQoKHVuc2lnbmVkIGxvbmcpZnJhbWUpOwotCXJlZ3MtPnJlZ3NbUkVHX0FSRzFdID0gc2lnbmFsOyAvKiBBcmcgZm9yIHNpZ25hbCBoYW5kbGVyICovCisJcmVncy0+cmVnc1tSRUdfQVJHMV0gPSBzaWc7IC8qIEFyZyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KIAlyZWdzLT5yZWdzW1JFR19BUkcyXSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpKHVuc2lnbmVkIGxvbmcpKHNpZ25lZCBsb25nKSZmcmFtZS0+aW5mbzsKIAlyZWdzLT5yZWdzW1JFR19BUkczXSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpKHVuc2lnbmVkIGxvbmcpKHNpZ25lZCBsb25nKSZmcmFtZS0+dWMudWNfbWNvbnRleHQ7CiAJcmVncy0+cGMgPSBuZWZmX3NpZ25fZXh0ZW5kKCh1bnNpZ25lZCBsb25nKWtzaWctPmthLnNhLnNhX2hhbmRsZXIpOwogCi0Jc2V0X2ZzKFVTRVJfRFMpOwotCiAJcHJfZGVidWcoIlNJRyBkZWxpdmVyICgjJWQsJXM6JWQpOiBzcD0lcCBwYz0lMDhMeCUwOEx4IGxpbms9JTA4THglMDhMeFxuIiwKLQkJIHNpZ25hbCwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwKKwkJIHNpZywgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBmcmFtZSwKIAkJIHJlZ3MtPnBjID4+IDMyLCByZWdzLT5wYyAmIDB4ZmZmZmZmZmYsCiAJCSBERVJFRl9SRUdfUFIgPj4gMzIsIERFUkVGX1JFR19QUiAmIDB4ZmZmZmZmZmYpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL0tjb25maWcgYi9hcmNoL3NwYXJjL0tjb25maWcKaW5kZXggOTZhYzY5Yy4uZTQ5NTAyYSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9LY29uZmlnCisrKyBiL2FyY2gvc3BhcmMvS2NvbmZpZwpAQCAtODYsNiArODYsOSBAQAogCWRlZmF1bHQgImFyY2gvc3BhcmMvY29uZmlncy9zcGFyYzMyX2RlZmNvbmZpZyIgaWYgU1BBUkMzMgogCWRlZmF1bHQgImFyY2gvc3BhcmMvY29uZmlncy9zcGFyYzY0X2RlZmNvbmZpZyIgaWYgU1BBUkM2NAogCitjb25maWcgQVJDSF9QUk9DX0tDT1JFX1RFWFQKKwlkZWZfYm9vbCB5CisKIGNvbmZpZyBJT01NVV9IRUxQRVIKIAlib29sCiAJZGVmYXVsdCB5IGlmIFNQQVJDNjQKQEAgLTE0Myw2ICsxNDYsMTAgQEAKIGNvbmZpZyBBUkNIX1NVUFBPUlRTX0RFQlVHX1BBR0VBTExPQwogCWRlZl9ib29sIHkgaWYgU1BBUkM2NAogCitjb25maWcgUEdUQUJMRV9MRVZFTFMKKwlkZWZhdWx0IDQgaWYgNjRCSVQKKwlkZWZhdWx0IDMKKwogc291cmNlICJpbml0L0tjb25maWciCiAKIHNvdXJjZSAia2VybmVsL0tjb25maWcuZnJlZXplciIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaHlwZXJ2aXNvci5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKaW5kZXggNGY2NzI1Zi4uZjViNjUzNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9oeXBlcnZpc29yLmgKQEAgLTI5NTcsNiArMjk1NywxNyBAQAogCQkJCSAgIHVuc2lnbmVkIGxvbmcgcmVnX3ZhbCk7CiAjZW5kaWYKIAorCisjZGVmaW5lIEhWX0ZBU1RfTTdfR0VUX1BFUkZSRUcJMHg0MworI2RlZmluZSBIVl9GQVNUX003X1NFVF9QRVJGUkVHCTB4NDQKKworI2lmbmRlZglfX0FTU0VNQkxZX18KK3Vuc2lnbmVkIGxvbmcgc3VuNHZfbTdfZ2V0X3BlcmZyZWcodW5zaWduZWQgbG9uZyByZWdfbnVtLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKnJlZ192YWwpOwordW5zaWduZWQgbG9uZyBzdW40dl9tN19zZXRfcGVyZnJlZyh1bnNpZ25lZCBsb25nIHJlZ19udW0sCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyByZWdfdmFsKTsKKyNlbmRpZgorCiAvKiBGdW5jdGlvbiBudW1iZXJzIGZvciBIVl9DT1JFX1RSQVAuICAqLwogI2RlZmluZSBIVl9DT1JFX1NFVF9WRVIJCQkweDAwCiAjZGVmaW5lIEhWX0NPUkVfUFVUQ0hBUgkJCTB4MDEKQEAgLTI5ODEsNiArMjk5Miw3IEBACiAjZGVmaW5lIEhWX0dSUF9TRElPCQkJMHgwMTA4CiAjZGVmaW5lIEhWX0dSUF9TRElPX0VSUgkJCTB4MDEwOQogI2RlZmluZSBIVl9HUlBfUkVCT09UX0RBVEEJCTB4MDExMAorI2RlZmluZSBIVl9HUlBfTTdfUEVSRgkJCTB4MDExNAogI2RlZmluZSBIVl9HUlBfTklBR19QRVJGCQkweDAyMDAKICNkZWZpbmUgSFZfR1JQX0ZJUkVfUEVSRgkJMHgwMjAxCiAjZGVmaW5lIEhWX0dSUF9OMl9DUFUJCQkweDAyMDIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaW9fNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vaW9fNjQuaAppbmRleCA5YjY3MmJlLi41MGQ0ODQwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2lvXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9pb182NC5oCkBAIC00MDcsMTYgKzQwNywxNiBAQAogewogfQogCi0jZGVmaW5lIGlvcmVhZDgoWCkJCQlyZWFkYihYKQotI2RlZmluZSBpb3JlYWQxNihYKQkJCXJlYWR3KFgpCi0jZGVmaW5lIGlvcmVhZDE2YmUoWCkJCQlfX3Jhd19yZWFkdyhYKQotI2RlZmluZSBpb3JlYWQzMihYKQkJCXJlYWRsKFgpCi0jZGVmaW5lIGlvcmVhZDMyYmUoWCkJCQlfX3Jhd19yZWFkbChYKQotI2RlZmluZSBpb3dyaXRlOCh2YWwsWCkJCQl3cml0ZWIodmFsLFgpCi0jZGVmaW5lIGlvd3JpdGUxNih2YWwsWCkJCXdyaXRldyh2YWwsWCkKLSNkZWZpbmUgaW93cml0ZTE2YmUodmFsLFgpCQlfX3Jhd193cml0ZXcodmFsLFgpCi0jZGVmaW5lIGlvd3JpdGUzMih2YWwsWCkJCXdyaXRlbCh2YWwsWCkKLSNkZWZpbmUgaW93cml0ZTMyYmUodmFsLFgpCQlfX3Jhd193cml0ZWwodmFsLFgpCisjZGVmaW5lIGlvcmVhZDgJCQlyZWFkYgorI2RlZmluZSBpb3JlYWQxNgkJcmVhZHcKKyNkZWZpbmUgaW9yZWFkMTZiZQkJX19yYXdfcmVhZHcKKyNkZWZpbmUgaW9yZWFkMzIJCXJlYWRsCisjZGVmaW5lIGlvcmVhZDMyYmUJCV9fcmF3X3JlYWRsCisjZGVmaW5lIGlvd3JpdGU4CQl3cml0ZWIKKyNkZWZpbmUgaW93cml0ZTE2CQl3cml0ZXcKKyNkZWZpbmUgaW93cml0ZTE2YmUJCV9fcmF3X3dyaXRldworI2RlZmluZSBpb3dyaXRlMzIJCXdyaXRlbAorI2RlZmluZSBpb3dyaXRlMzJiZQkJX19yYXdfd3JpdGVsCiAKIC8qIENyZWF0ZSBhIHZpcnR1YWwgbWFwcGluZyBjb29raWUgZm9yIGFuIElPIHBvcnQgcmFuZ2UgKi8KIHZvaWQgX19pb21lbSAqaW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBucik7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oCmluZGV4IGVjMmUyZTIuLmNjOWIwNGEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oCkBAIC0xLDcgKzEsNyBAQAogI2lmbmRlZiBfQVNNX1NQQVJDX0pVTVBfTEFCRUxfSAogI2RlZmluZSBfQVNNX1NQQVJDX0pVTVBfTEFCRUxfSAogCi0jaWZkZWYgX19LRVJORUxfXworI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKQEAgLTIyLDggKzIyLDYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQogdHlwZWRlZiB1MzIganVtcF9sYWJlbF90OwogCiBzdHJ1Y3QganVtcF9lbnRyeSB7CkBAIC0zMiw0ICszMCw1IEBACiAJanVtcF9sYWJlbF90IGtleTsKIH07CiAKKyNlbmRpZiAgLyogX19BU1NFTUJMWV9fICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3RhcmZpcmUuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc3RhcmZpcmUuaAppbmRleCBjMTAwZGMyLi4xNzZmYTBhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3N0YXJmaXJlLmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zdGFyZmlyZS5oCkBAIC0xMiw3ICsxMiw2IEBACiBleHRlcm4gaW50IHRoaXNfaXNfc3RhcmZpcmU7CiAKIHZvaWQgY2hlY2tfaWZfc3RhcmZpcmUodm9pZCk7Ci1pbnQgc3RhcmZpcmVfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpOwogdm9pZCBzdGFyZmlyZV9ob29rdXAoaW50KTsKIHVuc2lnbmVkIGludCBzdGFyZmlyZV90cmFuc2xhdGUodW5zaWduZWQgbG9uZyBpbWFwLCB1bnNpZ25lZCBpbnQgdXBhaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvXzMyLmggYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvXzMyLmgKaW5kZXggZmQ3YmQwYS4uMjI5NDc1ZiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mb18zMi5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm9fMzIuaApAQCAtMjcsNyArMjcsNiBAQAogc3RydWN0IHRocmVhZF9pbmZvIHsKIAl1bnNpZ25lZCBsb25nCQl1d2lubWFzazsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CQkvKiBtYWluIHRhc2sgc3RydWN0dXJlICovCi0Jc3RydWN0IGV4ZWNfZG9tYWluCSpleGVjX2RvbWFpbjsJLyogZXhlY3V0aW9uIGRvbWFpbiAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogbG93IGxldmVsIGZsYWdzICovCiAJaW50CQkJY3B1OwkJLyogY3B1IHdlJ3JlIG9uICovCiAJaW50CQkJcHJlZW1wdF9jb3VudDsJLyogMCA9PiBwcmVlbXB0YWJsZSwKQEAgLTM1LDYgKzM0LDggQEAKIAlpbnQJCQlzb2Z0aXJxX2NvdW50OwogCWludAkJCWhhcmRpcnFfY291bnQ7CiAKKwl1MzIgX191bnVzZWQ7CisKIAkvKiBDb250ZXh0IHN3aXRjaCBzYXZlZCBrZXJuZWwgc3RhdGUuICovCiAJdW5zaWduZWQgbG9uZyBrc3A7CS8qIC4uLiBrc3AgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDgpKSk7ICovCiAJdW5zaWduZWQgbG9uZyBrcGM7CkBAIC01Niw3ICs1Nyw2IEBACiB7CQkJCQkJCVwKIAkudXdpbm1hc2sJPQkwLAkJCVwKIAkudGFzawkJPQkmdHNrLAkJCVwKLQkuZXhlY19kb21haW4JPQkmZGVmYXVsdF9leGVjX2RvbWFpbiwJXAogCS5mbGFncwkJPQkwLAkJCVwKIAkuY3B1CQk9CTAsCQkJXAogCS5wcmVlbXB0X2NvdW50CT0JSU5JVF9QUkVFTVBUX0NPVU5ULAlcCkBAIC04NSwxMiArODUsMTEgQEAKICAqLwogI2RlZmluZSBUSV9VV0lOTUFTSwkweDAwCS8qIHV3aW5tYXNrICovCiAjZGVmaW5lIFRJX1RBU0sJCTB4MDQKLSNkZWZpbmUgVElfRVhFQ0RPTUFJTgkweDA4CS8qIGV4ZWNfZG9tYWluICovCi0jZGVmaW5lIFRJX0ZMQUdTCTB4MGMKLSNkZWZpbmUgVElfQ1BVCQkweDEwCi0jZGVmaW5lIFRJX1BSRUVNUFQJMHgxNAkvKiBwcmVlbXB0X2NvdW50ICovCi0jZGVmaW5lIFRJX1NPRlRJUlEJMHgxOAkvKiBzb2Z0aXJxX2NvdW50ICovCi0jZGVmaW5lIFRJX0hBUkRJUlEJMHgxYwkvKiBoYXJkaXJxX2NvdW50ICovCisjZGVmaW5lIFRJX0ZMQUdTCTB4MDgKKyNkZWZpbmUgVElfQ1BVCQkweDBjCisjZGVmaW5lIFRJX1BSRUVNUFQJMHgxMAkvKiBwcmVlbXB0X2NvdW50ICovCisjZGVmaW5lIFRJX1NPRlRJUlEJMHgxNAkvKiBzb2Z0aXJxX2NvdW50ICovCisjZGVmaW5lIFRJX0hBUkRJUlEJMHgxOAkvKiBoYXJkaXJxX2NvdW50ICovCiAjZGVmaW5lIFRJX0tTUAkJMHgyMAkvKiBrc3AgKi8KICNkZWZpbmUgVElfS1BDCQkweDI0CS8qIGtwYyAobGRkJ2VkIHdpdGgga3BjKSAqLwogI2RlZmluZSBUSV9LUFNSCQkweDI4CS8qIGtwc3IgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm9fNjQuaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm9fNjQuaAppbmRleCBmZjQ1NTE2Li5iZGU1OTgyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvXzY0LmgKKysrIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mb182NC5oCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKLXN0cnVjdCBleGVjX2RvbWFpbjsKIAogc3RydWN0IHRocmVhZF9pbmZvIHsKIAkvKiBEJCBsaW5lIDEgKi8KQEAgLTQ0LDcgKzQzLDYgQEAKIAkvKiBEJCBsaW5lIDIgKi8KIAl1bnNpZ25lZCBsb25nCQlmYXVsdF9hZGRyZXNzOwogCXN0cnVjdCBwdF9yZWdzCQkqa3JlZ3M7Ci0Jc3RydWN0IGV4ZWNfZG9tYWluCSpleGVjX2RvbWFpbjsKIAlpbnQJCQlwcmVlbXB0X2NvdW50OwkvKiAwID0+IHByZWVtcHRhYmxlLCA8MCA9PiBCVUcgKi8KIAlfX3U4CQkJbmV3X2NoaWxkOwogCV9fdTgJCQljdXJyZW50X2RzOwpAQCAtODAsMTggKzc4LDE3IEBACiAjZGVmaW5lIFRJX0tTUAkJMHgwMDAwMDAxOAogI2RlZmluZSBUSV9GQVVMVF9BRERSCTB4MDAwMDAwMjAKICNkZWZpbmUgVElfS1JFR1MJMHgwMDAwMDAyOAotI2RlZmluZSBUSV9FWEVDX0RPTUFJTgkweDAwMDAwMDMwCi0jZGVmaW5lIFRJX1BSRV9DT1VOVAkweDAwMDAwMDM4Ci0jZGVmaW5lIFRJX05FV19DSElMRAkweDAwMDAwMDNjCi0jZGVmaW5lIFRJX0NVUlJFTlRfRFMJMHgwMDAwMDAzZAotI2RlZmluZSBUSV9DUFUJCTB4MDAwMDAwM2UKLSNkZWZpbmUgVElfVVRSQVBTCTB4MDAwMDAwNDAKLSNkZWZpbmUgVElfUkVHX1dJTkRPVwkweDAwMDAwMDQ4Ci0jZGVmaW5lIFRJX1JXSU5fU1BUUlMJMHgwMDAwMDNjOAotI2RlZmluZSBUSV9HU1IJCTB4MDAwMDA0MDAKLSNkZWZpbmUgVElfWEZTUgkJMHgwMDAwMDQzOAotI2RlZmluZSBUSV9LVU5BX1JFR1MJMHgwMDAwMDQ3MAotI2RlZmluZSBUSV9LVU5BX0lOU04JMHgwMDAwMDQ3OAorI2RlZmluZSBUSV9QUkVfQ09VTlQJMHgwMDAwMDAzMAorI2RlZmluZSBUSV9ORVdfQ0hJTEQJMHgwMDAwMDAzNAorI2RlZmluZSBUSV9DVVJSRU5UX0RTCTB4MDAwMDAwMzUKKyNkZWZpbmUgVElfQ1BVCQkweDAwMDAwMDM2CisjZGVmaW5lIFRJX1VUUkFQUwkweDAwMDAwMDM4CisjZGVmaW5lIFRJX1JFR19XSU5ET1cJMHgwMDAwMDA0MAorI2RlZmluZSBUSV9SV0lOX1NQVFJTCTB4MDAwMDAzYzAKKyNkZWZpbmUgVElfR1NSCQkweDAwMDAwM2Y4CisjZGVmaW5lIFRJX1hGU1IJCTB4MDAwMDA0MzAKKyNkZWZpbmUgVElfS1VOQV9SRUdTCTB4MDAwMDA0NjgKKyNkZWZpbmUgVElfS1VOQV9JTlNOCTB4MDAwMDA0NzAKICNkZWZpbmUgVElfRlBSRUdTCTB4MDAwMDA0ODAKIAogLyogV2UgZW1iZWQgdGhpcyBpbiB0aGUgdXBwZXJtb3N0IGJ5dGUgb2YgdGhyZWFkX2luZm8tPmZsYWdzICovCkBAIC0xMTksNyArMTE2LDYgQEAKIHsJCQkJCQkJXAogCS50YXNrCQk9CSZ0c2ssCQkJXAogCS5jdXJyZW50X2RzCT0JQVNJX1AsCQkJXAotCS5leGVjX2RvbWFpbgk9CSZkZWZhdWx0X2V4ZWNfZG9tYWluLAlcCiAJLnByZWVtcHRfY291bnQJPQlJTklUX1BSRUVNUFRfQ09VTlQsCVwKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuaCBiL2FyY2gvc3BhcmMva2VybmVsL2VudHJ5LmgKaW5kZXggODhkMzIyYi4uMDdjYzQ5ZSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvZW50cnkuaAorKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9lbnRyeS5oCkBAIC05OCwxMSArOTgsNyBAQAogdm9pZCBkb19wcml2b3Aoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogdm9pZCBkb19wcml2YWN0KHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHZvaWQgZG9fY2VlKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKLXZvaWQgZG9fY2VlX3RsMShzdHJ1Y3QgcHRfcmVncyAqcmVncyk7Ci12b2lkIGRvX2RhZV90bDEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotdm9pZCBkb19pYWVfdGwxKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHZvaWQgZG9fZGl2MF90bDEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwotdm9pZCBkb19mcGRpc190bDEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogdm9pZCBkb19mcGllZWVfdGwxKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIHZvaWQgZG9fZnBvdGhlcl90bDEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOwogdm9pZCBkb19pbGxfdGwxKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2h2YXBpLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9odmFwaS5jCmluZGV4IDVjNTUxNDUuLjY2MjUwMGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2h2YXBpLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaHZhcGkuYwpAQCAtNDgsNiArNDgsNyBAQAogCXsgLmdyb3VwID0gSFZfR1JQX1ZUX0NQVSwJCQkJfSwKIAl7IC5ncm91cCA9IEhWX0dSUF9UNV9DUFUsCQkJCX0sCiAJeyAuZ3JvdXAgPSBIVl9HUlBfRElBRywJCS5mbGFncyA9IEZMQUdfUFJFX0FQSQl9LAorCXsgLmdyb3VwID0gSFZfR1JQX003X1BFUkYsCQkJCX0sCiB9OwogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGh2YXBpX2xvY2spOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvaHZjYWxscy5TIGIvYXJjaC9zcGFyYy9rZXJuZWwvaHZjYWxscy5TCmluZGV4IGNhZWRmODMuLmFmYmFiYTUgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2h2Y2FsbHMuUworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9odmNhbGxzLlMKQEAgLTgzNywzICs4MzcsMTkgQEAKIAlyZXRsCiAJIG5vcAogRU5EUFJPQyhzdW40dl90NV9zZXRfcGVyZnJlZykKKworRU5UUlkoc3VuNHZfbTdfZ2V0X3BlcmZyZWcpCisJbW92CSVvMSwgJW80CisJbW92CUhWX0ZBU1RfTTdfR0VUX1BFUkZSRUcsICVvNQorCXRhCUhWX0ZBU1RfVFJBUAorCXN0eAklbzEsIFslbzRdCisJcmV0bAorCW5vcAorRU5EUFJPQyhzdW40dl9tN19nZXRfcGVyZnJlZykKKworRU5UUlkoc3VuNHZfbTdfc2V0X3BlcmZyZWcpCisJbW92CUhWX0ZBU1RfTTdfU0VUX1BFUkZSRUcsICVvNQorCXRhCUhWX0ZBU1RfVFJBUAorCXJldGwKKwlub3AKK0VORFBST0Moc3VuNHZfbTdfc2V0X3BlcmZyZWcpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaS5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2kuYwppbmRleCA4OTliNzIwLi40MzcxZjcyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2xlb25fcGNpLmMKQEAgLTM0LDE1ICszNCwxNyBAQAogCiAJcm9vdF9idXMgPSBwY2lfc2Nhbl9yb290X2J1cygmb2ZkZXYtPmRldiwgMCwgaW5mby0+b3BzLCBpbmZvLAogCQkJCSAgICAgJnJlc291cmNlcyk7Ci0JaWYgKHJvb3RfYnVzKSB7Ci0JCS8qIFNldHVwIElSUXMgb2YgYWxsIGRldmljZXMgdXNpbmcgY3VzdG9tIHJvdXRpbmVzICovCi0JCXBjaV9maXh1cF9pcnFzKHBjaV9jb21tb25fc3dpenpsZSwgaW5mby0+bWFwX2lycSk7Ci0KLQkJLyogQXNzaWduIGRldmljZXMgd2l0aCByZXNvdXJjZXMgKi8KLQkJcGNpX2Fzc2lnbl91bmFzc2lnbmVkX3Jlc291cmNlcygpOwotCX0gZWxzZSB7CisJaWYgKCFyb290X2J1cykgewogCQlwY2lfZnJlZV9yZXNvdXJjZV9saXN0KCZyZXNvdXJjZXMpOworCQlyZXR1cm47CiAJfQorCisJLyogU2V0dXAgSVJRcyBvZiBhbGwgZGV2aWNlcyB1c2luZyBjdXN0b20gcm91dGluZXMgKi8KKwlwY2lfZml4dXBfaXJxcyhwY2lfY29tbW9uX3N3aXp6bGUsIGluZm8tPm1hcF9pcnEpOworCisJLyogQXNzaWduIGRldmljZXMgd2l0aCByZXNvdXJjZXMgKi8KKwlwY2lfYXNzaWduX3VuYXNzaWduZWRfcmVzb3VyY2VzKCk7CisJcGNpX2J1c19hZGRfZGV2aWNlcyhyb290X2J1cyk7CiB9CiAKIHZvaWQgcGNpYmlvc19maXh1cF9idXMoc3RydWN0IHBjaV9idXMgKnBidXMpCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvbWRlc2MuYwppbmRleCA5OTYzMmE4Li4yNmM4MGUxIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9tZGVzYy5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL21kZXNjLmMKQEAgLTEzMCwyNiArMTMwLDI2IEBACiBzdGF0aWMgc3RydWN0IG1kZXNjX2hhbmRsZSAqbWRlc2Nfa21hbGxvYyh1bnNpZ25lZCBpbnQgbWRlc2Nfc2l6ZSkKIHsKIAl1bnNpZ25lZCBpbnQgaGFuZGxlX3NpemU7CisJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7CisJdW5zaWduZWQgbG9uZyBhZGRyOwogCXZvaWQgKmJhc2U7CiAKIAloYW5kbGVfc2l6ZSA9IChzaXplb2Yoc3RydWN0IG1kZXNjX2hhbmRsZSkgLQogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtZGVzY19oZHIpICsKIAkJICAgICAgIG1kZXNjX3NpemUpOwogCisJLyoKKwkgKiBBbGxvY2F0aW9uIGhhcyB0byBzdWNjZWVkIGJlY2F1c2UgbWRlc2MgdXBkYXRlIHdvdWxkIGJlIG1pc3NlZAorCSAqIGFuZCBzdWNoIGV2ZW50cyBhcmUgbm90IHJldHJhbnNtaXR0ZWQuCisJICovCiAJYmFzZSA9IGttYWxsb2MoaGFuZGxlX3NpemUgKyAxNSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PRkFJTCk7Ci0JaWYgKGJhc2UpIHsKLQkJc3RydWN0IG1kZXNjX2hhbmRsZSAqaHA7Ci0JCXVuc2lnbmVkIGxvbmcgYWRkcjsKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKKwlhZGRyID0gKGFkZHIgKyAxNVVMKSAmIH4xNVVMOworCWhwID0gKHN0cnVjdCBtZGVzY19oYW5kbGUgKikgYWRkcjsKIAotCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpYmFzZTsKLQkJYWRkciA9IChhZGRyICsgMTVVTCkgJiB+MTVVTDsKLQkJaHAgPSAoc3RydWN0IG1kZXNjX2hhbmRsZSAqKSBhZGRyOworCW1kZXNjX2hhbmRsZV9pbml0KGhwLCBoYW5kbGVfc2l6ZSwgYmFzZSk7CiAKLQkJbWRlc2NfaGFuZGxlX2luaXQoaHAsIGhhbmRsZV9zaXplLCBiYXNlKTsKLQkJcmV0dXJuIGhwOwotCX0KLQotCXJldHVybiBOVUxMOworCXJldHVybiBocDsKIH0KIAogc3RhdGljIHZvaWQgbWRlc2Nfa2ZyZWUoc3RydWN0IG1kZXNjX2hhbmRsZSAqaHApCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wY2kuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jCmluZGV4IDljZTVhZmUuLjZmNzI1MWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3BjaS5jCkBAIC02MzksMTAgKzYzOSw3IEBACiAJCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpci0+ZW5kLAogCQkJCSAgICAgICAodW5zaWduZWQgaW50KXItPmZsYWdzKTsKIAotCQkJaWYgKHBjaV9jbGFpbV9yZXNvdXJjZShkZXYsIGkpID09IDApCi0JCQkJY29udGludWU7Ci0KLQkJCXBjaV9jbGFpbV9icmlkZ2VfcmVzb3VyY2UoZGV2LCBpKTsKKwkJCXBjaV9jbGFpbV9yZXNvdXJjZShkZXYsIGkpOwogCQl9CiAJfQogCkBAIC02NzcsMTEgKzY3NCwxMCBAQAogCX0KIAogCXBjaV9vZl9zY2FuX2J1cyhwYm0sIG5vZGUsIGJ1cyk7Ci0JcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOwogCXBjaV9idXNfcmVnaXN0ZXJfb2Zfc3lzZnMoYnVzKTsKIAogCXBjaV9jbGFpbV9idXNfcmVzb3VyY2VzKGJ1cyk7Ci0KKwlwY2lfYnVzX2FkZF9kZXZpY2VzKGJ1cyk7CiAJcmV0dXJuIGJ1czsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpYy5jCmluZGV4IDZjYzc4YzIuLjI0Mzg0ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3BjaWMuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wY2ljLmMKQEAgLTM5MSwxMiArMzkxLDE2IEBACiAJc3RydWN0IGxpbnV4X3BibV9pbmZvICpwYm0gPSAmcGNpYy0+cGJtOwogCiAJcGJtLT5wY2lfYnVzID0gcGNpX3NjYW5fYnVzKHBibS0+cGNpX2ZpcnN0X2J1c25vLCAmcGNpY19vcHMsIHBibSk7CisJaWYgKCFwYm0tPnBjaV9idXMpCisJCXJldHVybjsKKwogI2lmIDAgLyogZGVhZHdvb2QgdHJhbnNwbGFudGVkIGZyb20gc3BhcmM2NCAqLwogCXBjaV9maWxsX2luX3BibV9jb29raWVzKHBibS0+cGNpX2J1cywgcGJtLCBwYm0tPnByb21fbm9kZSk7CiAJcGNpX3JlY29yZF9hc3NpZ25tZW50cyhwYm0sIHBibS0+cGNpX2J1cyk7CiAJcGNpX2Fzc2lnbl91bmFzc2lnbmVkKHBibSwgcGJtLT5wY2lfYnVzKTsKIAlwY2lfZml4dXBfaXJxKHBibSwgcGJtLT5wY2lfYnVzKTsKICNlbmRpZgorCXBjaV9idXNfYWRkX2RldmljZXMocGJtLT5wY2lfYnVzKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3Bjci5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNyLmMKaW5kZXggN2U5NjdjOC4uZWI5NzhjNyAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNyLmMKQEAgLTIxNyw2ICsyMTcsMzEgQEAKIAkucGNyX25taV9kaXNhYmxlCT0gUENSX040X1BJQ05QVCwKIH07CiAKK3N0YXRpYyB1NjQgbTdfcGNyX3JlYWQodW5zaWduZWQgbG9uZyByZWdfbnVtKQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJKHZvaWQpIHN1bjR2X203X2dldF9wZXJmcmVnKHJlZ19udW0sICZ2YWwpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgbTdfcGNyX3dyaXRlKHVuc2lnbmVkIGxvbmcgcmVnX251bSwgdTY0IHZhbCkKK3sKKwkodm9pZCkgc3VuNHZfbTdfc2V0X3BlcmZyZWcocmVnX251bSwgdmFsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY3Jfb3BzIG03X3Bjcl9vcHMgPSB7CisJLnJlYWRfcGNyCQk9IG03X3Bjcl9yZWFkLAorCS53cml0ZV9wY3IJCT0gbTdfcGNyX3dyaXRlLAorCS5yZWFkX3BpYwkJPSBuNF9waWNfcmVhZCwKKwkud3JpdGVfcGljCQk9IG40X3BpY193cml0ZSwKKwkubm1pX3BpY2xfdmFsdWUJCT0gbjRfcGljbF92YWx1ZSwKKwkucGNyX25taV9lbmFibGUJCT0gKFBDUl9ONF9QSUNOUFQgfCBQQ1JfTjRfU1RSQUNFIHwKKwkJCQkgICBQQ1JfTjRfVVRSQUNFIHwgUENSX040X1RPRSB8CisJCQkJICAgKDI2IDw8IFBDUl9ONF9TTF9TSElGVCkpLAorCS5wY3Jfbm1pX2Rpc2FibGUJPSBQQ1JfTjRfUElDTlBULAorfTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyZl9oc3ZjX2dyb3VwOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyZl9oc3ZjX21ham9yOwpAQCAtMjQ4LDYgKzI3MywxMCBAQAogCQkJcGVyZl9oc3ZjX2dyb3VwID0gSFZfR1JQX1Q1X0NQVTsKIAkJCWJyZWFrOwogCisJCWNhc2UgU1VONFZfQ0hJUF9TUEFSQ19NNzoKKwkJCXBlcmZfaHN2Y19ncm91cCA9IEhWX0dSUF9NN19QRVJGOworCQkJYnJlYWs7CisKIAkJZGVmYXVsdDoKIAkJCXJldHVybiAtRU5PREVWOwogCQl9CkBAIC0yOTMsNiArMzIyLDEwIEBACiAJCXBjcl9vcHMgPSAmbjVfcGNyX29wczsKIAkJYnJlYWs7CiAKKwljYXNlIFNVTjRWX0NISVBfU1BBUkNfTTc6CisJCXBjcl9vcHMgPSAmbTdfcGNyX29wczsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlyZXQgPSAtRU5PREVWOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BlcmZfZXZlbnQuYyBiL2FyY2gvc3BhcmMva2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCA0NmE1ZTQ1Li44NmVlYmZhIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9wZXJmX2V2ZW50LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGVyZl9ldmVudC5jCkBAIC03OTIsNiArNzkyLDQyIEBACiAJLm51bV9waWNfcmVncwk9IDQsCiB9OwogCitzdGF0aWMgdm9pZCBzcGFyY19tN193cml0ZV9wbWMoaW50IGlkeCwgdTY0IHZhbCkKK3sKKwl1NjQgcGNyOworCisJcGNyID0gcGNyX29wcy0+cmVhZF9wY3IoaWR4KTsKKwkvKiBlbnN1cmUgb3YgYW5kIG50YyBhcmUgcmVzZXQgKi8KKwlwY3IgJj0gfihQQ1JfTjRfT1YgfCBQQ1JfTjRfTlRDKTsKKworCXBjcl9vcHMtPndyaXRlX3BpYyhpZHgsIHZhbCAmIDB4ZmZmZmZmZmYpOworCisJcGNyX29wcy0+d3JpdGVfcGNyKGlkeCwgcGNyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGFyY19wbXUgc3BhcmNfbTdfcG11ID0geworCS5ldmVudF9tYXAJPSBuaWFnYXJhNF9ldmVudF9tYXAsCisJLmNhY2hlX21hcAk9ICZuaWFnYXJhNF9jYWNoZV9tYXAsCisJLm1heF9ldmVudHMJPSBBUlJBWV9TSVpFKG5pYWdhcmE0X3BlcmZtb25fZXZlbnRfbWFwKSwKKwkucmVhZF9wbWMJPSBzcGFyY192dF9yZWFkX3BtYywKKwkud3JpdGVfcG1jCT0gc3BhcmNfbTdfd3JpdGVfcG1jLAorCS51cHBlcl9zaGlmdAk9IDUsCisJLmxvd2VyX3NoaWZ0CT0gNSwKKwkuZXZlbnRfbWFzawk9IDB4N2ZmLAorCS51c2VyX2JpdAk9IFBDUl9ONF9VVFJBQ0UsCisJLnByaXZfYml0CT0gUENSX040X1NUUkFDRSwKKworCS8qIFdlIGV4cGxpY2l0bHkgZG9uJ3Qgc3VwcG9ydCBoeXBlcnZpc29yIHRyYWNpbmcuICovCisJLmh2X2JpdAkJPSAwLAorCisJLmlycV9iaXQJPSBQQ1JfTjRfVE9FLAorCS51cHBlcl9ub3AJPSAwLAorCS5sb3dlcl9ub3AJPSAwLAorCS5mbGFncwkJPSAwLAorCS5tYXhfaHdfZXZlbnRzCT0gNCwKKwkubnVtX3BjcnMJPSA0LAorCS5udW1fcGljX3JlZ3MJPSA0LAorfTsKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3BhcmNfcG11ICpzcGFyY19wbXUgX19yZWFkX21vc3RseTsKIAogc3RhdGljIHU2NCBldmVudF9lbmNvZGluZyh1NjQgZXZlbnRfaWQsIGludCBpZHgpCkBAIC05NjAsNiArOTk2LDggQEAKIAljcHVjLT5wY3JbMF0gfD0gY3B1Yy0+ZXZlbnRbMF0tPmh3LmNvbmZpZ19iYXNlOwogfQogCitzdGF0aWMgdm9pZCBzcGFyY19wbXVfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgZmxhZ3MpOworCiAvKiBPbiB0aGlzIFBNVSBlYWNoIFBJQyBoYXMgaXQncyBvd24gUENSIGNvbnRyb2wgcmVnaXN0ZXIuICAqLwogc3RhdGljIHZvaWQgY2FsY3VsYXRlX211bHRpcGxlX3BjcnMoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMpCiB7CkBAIC05NzIsMjAgKzEwMTAsMTMgQEAKIAkJc3RydWN0IHBlcmZfZXZlbnQgKmNwID0gY3B1Yy0+ZXZlbnRbaV07CiAJCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2MgPSAmY3AtPmh3OwogCQlpbnQgaWR4ID0gaHdjLT5pZHg7Ci0JCXU2NCBlbmM7CiAKIAkJaWYgKGNwdWMtPmN1cnJlbnRfaWR4W2ldICE9IFBJQ19OT19JTkRFWCkKIAkJCWNvbnRpbnVlOwogCi0JCXNwYXJjX3BlcmZfZXZlbnRfc2V0X3BlcmlvZChjcCwgaHdjLCBpZHgpOwogCQljcHVjLT5jdXJyZW50X2lkeFtpXSA9IGlkeDsKIAotCQllbmMgPSBwZXJmX2V2ZW50X2dldF9lbmMoY3B1Yy0+ZXZlbnRzW2ldKTsKLQkJY3B1Yy0+cGNyW2lkeF0gJj0gfm1hc2tfZm9yX2luZGV4KGlkeCk7Ci0JCWlmIChod2MtPnN0YXRlICYgUEVSRl9IRVNfU1RPUFBFRCkKLQkJCWNwdWMtPnBjcltpZHhdIHw9IG5vcF9mb3JfaW5kZXgoaWR4KTsKLQkJZWxzZQotCQkJY3B1Yy0+cGNyW2lkeF0gfD0gZXZlbnRfZW5jb2RpbmcoZW5jLCBpZHgpOworCQlzcGFyY19wbXVfc3RhcnQoY3AsIFBFUkZfRUZfUkVMT0FEKTsKIAl9CiBvdXQ6CiAJZm9yIChpID0gMDsgaSA8IGNwdWMtPm5fZXZlbnRzOyBpKyspIHsKQEAgLTExMDEsNyArMTEzMiw2IEBACiAJaW50IGk7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcGVyZl9wbXVfZGlzYWJsZShldmVudC0+cG11KTsKIAogCWZvciAoaSA9IDA7IGkgPCBjcHVjLT5uX2V2ZW50czsgaSsrKSB7CiAJCWlmIChldmVudCA9PSBjcHVjLT5ldmVudFtpXSkgewpAQCAtMTEyNyw3ICsxMTU3LDYgQEAKIAkJfQogCX0KIAotCXBlcmZfcG11X2VuYWJsZShldmVudC0+cG11KTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKQEAgLTEzNjEsNyArMTM5MCw2IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlwZXJmX3BtdV9kaXNhYmxlKGV2ZW50LT5wbXUpOwogCiAJbjAgPSBjcHVjLT5uX2V2ZW50czsKIAlpZiAobjAgPj0gc3BhcmNfcG11LT5tYXhfaHdfZXZlbnRzKQpAQCAtMTM5NCw3ICsxNDIyLDYgQEAKIAogCXJldCA9IDA7CiBvdXQ6Ci0JcGVyZl9wbXVfZW5hYmxlKGV2ZW50LT5wbXUpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTY2Nyw2ICsxNjk0LDEwIEBACiAJCXNwYXJjX3BtdSA9ICZuaWFnYXJhNF9wbXU7CiAJCXJldHVybiB0cnVlOwogCX0KKwlpZiAoIXN0cmNtcChzcGFyY19wbXVfdHlwZSwgInNwYXJjLW03IikpIHsKKwkJc3BhcmNfcG11ID0gJnNwYXJjX203X3BtdTsKKwkJcmV0dXJuIHRydWU7CisJfQogCXJldHVybiBmYWxzZTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IDBiZTdiZjkuLjQ2YTU5NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTI4Nyw2ICsyODcsOCBAQAogCQkJcHJpbnRrKCIgICAgICAgICAgICAgVFBDWyVseF0gTzdbJWx4XSBJN1slbHhdIFJQQ1slbHhdXG4iLAogCQkJICAgICAgIGdwLT50cGMsIGdwLT5vNywgZ3AtPmk3LCBncC0+cnBjKTsKIAkJfQorCisJCXRvdWNoX25taV93YXRjaGRvZygpOwogCX0KIAogCW1lbXNldChnbG9iYWxfY3B1X3NuYXBzaG90LCAwLCBzaXplb2YoZ2xvYmFsX2NwdV9zbmFwc2hvdCkpOwpAQCAtMzYyLDYgKzM2NCw4IEBACiAJCSAgICAgICAoY3B1ID09IHRoaXNfY3B1ID8gJyonIDogJyAnKSwgY3B1LAogCQkgICAgICAgcHAtPnBjclswXSwgcHAtPnBjclsxXSwgcHAtPnBjclsyXSwgcHAtPnBjclszXSwKIAkJICAgICAgIHBwLT5waWNbMF0sIHBwLT5waWNbMV0sIHBwLT5waWNbMl0sIHBwLT5waWNbM10pOworCisJCXRvdWNoX25taV93YXRjaGRvZygpOwogCX0KIAogCW1lbXNldChnbG9iYWxfY3B1X3NuYXBzaG90LCAwLCBzaXplb2YoZ2xvYmFsX2NwdV9zbmFwc2hvdCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc21wXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwppbmRleCBkYTZmMWE3Li42MTEzOWQ5IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zbXBfNjQuYwpAQCAtMTQwNiwxMSArMTQwNiwzMiBAQAogCXNjaGVkdWxlcl9pcGkoKTsKIH0KIAotLyogVGhpcyBpcyBhIG5vcCBiZWNhdXNlIHdlIGNhcHR1cmUgYWxsIG90aGVyIGNwdXMKLSAqIGFueXdheXMgd2hlbiBtYWtpbmcgdGhlIFBST00gYWN0aXZlLgotICovCitzdGF0aWMgdm9pZCBzdG9wX3RoaXNfY3B1KHZvaWQgKmR1bW15KQoreworCXByb21fc3RvcHNlbGYoKTsKK30KKwogdm9pZCBzbXBfc2VuZF9zdG9wKHZvaWQpCiB7CisJaW50IGNwdTsKKworCWlmICh0bGJfdHlwZSA9PSBoeXBlcnZpc29yKSB7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCQlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJCQljb250aW51ZTsKKyNpZmRlZiBDT05GSUdfU1VOX0xET01TCisJCQlpZiAobGRvbV9kb21haW5pbmdfZW5hYmxlZCkgeworCQkJCXVuc2lnbmVkIGxvbmcgaHZfZXJyOworCQkJCWh2X2VyciA9IHN1bjR2X2NwdV9zdG9wKGNwdSk7CisJCQkJaWYgKGh2X2VycikKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJzdW40dl9jcHVfc3RvcCgpICIKKwkJCQkJICAgICAgICJmYWlsZWQgZXJyPSVsdVxuIiwgaHZfZXJyKTsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQkJcHJvbV9zdG9wY3B1X2NwdWlkKGNwdSk7CisJCX0KKwl9IGVsc2UKKwkJc21wX2NhbGxfZnVuY3Rpb24oc3RvcF90aGlzX2NwdSwgTlVMTCwgMCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc3RhcmZpcmUuYyBiL2FyY2gvc3BhcmMva2VybmVsL3N0YXJmaXJlLmMKaW5kZXggODIyODFhNS4uMTY3ZmRmZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3RhcmZpcmUuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zdGFyZmlyZS5jCkBAIC0yOCwxMSArMjgsNiBAQAogCQl0aGlzX2lzX3N0YXJmaXJlID0gMTsKIH0KIAotaW50IHN0YXJmaXJlX2hhcmRfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKQotewotCXJldHVybiB1cGFfcmVhZGwoMHgxZmZmNDAwMDBkMFVMKTsKLX0KLQogLyoKICAqIEVhY2ggU3RhcmZpcmUgYm9hcmQgaGFzIDMyIHJlZ2lzdGVycyB3aGljaCBwZXJmb3JtIHRyYW5zbGF0aW9uCiAgKiBhbmQgZGVsaXZlcnkgb2YgdHJhZGl0aW9uYWwgaW50ZXJydXB0IHBhY2tldHMgaW50byB0aGUgZXh0ZW5kZWQKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKaW5kZXggYzg1NDAzZC4uMzBlN2RkYiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKQEAgLTMzMyw3ICszMzMsNyBAQAogCWxvbmcgZXJyOwogCiAJLyogTm8gbmVlZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gV2UgY2FuIHN0YXJ0IGZyZXNoLi4uICovCi0JaWYgKGNhbGwgPD0gU0VNQ1RMKSB7CisJaWYgKGNhbGwgPD0gU0VNVElNRURPUCkgewogCQlzd2l0Y2ggKGNhbGwpIHsKIAkJY2FzZSBTRU1PUDoKIAkJCWVyciA9IHN5c19zZW10aW1lZG9wKGZpcnN0LCBwdHIsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90aW1lXzMyLmMKaW5kZXggMmY4MGQyMy4uMTgxNDdhNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvdGltZV8zMi5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RpbWVfMzIuYwpAQCAtMTgxLDE3ICsxODEsMTMgQEAKIAkucmF0aW5nCT0gMTAwLAogCS5yZWFkCT0gdGltZXJfY3NfcmVhZCwKIAkubWFzawk9IENMT0NLU09VUkNFX01BU0soNjQpLAotCS5zaGlmdAk9IDIsCiAJLmZsYWdzCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiBzdGF0aWMgX19pbml0IGludCBzZXR1cF90aW1lcl9jcyh2b2lkKQogewogCXRpbWVyX2NzX2VuYWJsZWQgPSAxOwotCXRpbWVyX2NzLm11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KHNwYXJjX2NvbmZpZy5jbG9ja19yYXRlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyX2NzLnNoaWZ0KTsKLQotCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmdGltZXJfY3MpOworCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmdGltZXJfY3MsIHNwYXJjX2NvbmZpZy5jbG9ja19yYXRlKTsKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzMyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc18zMi5jCmluZGV4IDZmZDM4NmMuLjRmMjFkZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzMyLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfMzIuYwpAQCAtNDMzLDcgKzQzMyw2IEBACiAJLyogRm9yY2UgbGlua2VyIHRvIGJhcmYgaWYgbWlzbWF0Y2hlZCAqLwogCWlmIChUSV9VV0lOTUFTSyAgICAhPSBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHV3aW5tYXNrKSB8fAogCSAgICBUSV9UQVNLICAgICAgICAhPSBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHRhc2spIHx8Ci0JICAgIFRJX0VYRUNET01BSU4gICE9IG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZXhlY19kb21haW4pIHx8CiAJICAgIFRJX0ZMQUdTICAgICAgICE9IG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgZmxhZ3MpIHx8CiAJICAgIFRJX0NQVSAgICAgICAgICE9IG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgY3B1KSB8fAogCSAgICBUSV9QUkVFTVBUICAgICAhPSBvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHByZWVtcHRfY291bnQpIHx8CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvdHJhcHNfNjQuYwppbmRleCBhMjc2NTFlLi5kMjFjZDYyIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC90cmFwc182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3RyYXBzXzY0LmMKQEAgLTI0MjcsNiArMjQyNyw4IEBACiAJCX0KIAkJdXNlcl9pbnN0cnVjdGlvbl9kdW1wICgodW5zaWduZWQgaW50IF9fdXNlciAqKSByZWdzLT50cGMpOwogCX0KKwlpZiAocGFuaWNfb25fb29wcykKKwkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiIpOwogCWlmIChyZWdzLT50c3RhdGUgJiBUU1RBVEVfUFJJVikKIAkJZG9fZXhpdChTSUdLSUxMKTsKIAlkb19leGl0KFNJR1NFR1YpOwpAQCAtMjU2NCwyNyArMjU2Niw2IEBACiAJZGllX2lmX2tlcm5lbCgiVEwwOiBDYWNoZSBFcnJvciBFeGNlcHRpb24iLCByZWdzKTsKIH0KIAotdm9pZCBkb19jZWVfdGwxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWV4Y2VwdGlvbl9lbnRlcigpOwotCWR1bXBfdGwxX3RyYXBsb2coKHN0cnVjdCB0bDFfdHJhcGxvZyAqKShyZWdzICsgMSkpOwotCWRpZV9pZl9rZXJuZWwoIlRMMTogQ2FjaGUgRXJyb3IgRXhjZXB0aW9uIiwgcmVncyk7Ci19Ci0KLXZvaWQgZG9fZGFlX3RsMShzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlleGNlcHRpb25fZW50ZXIoKTsKLQlkdW1wX3RsMV90cmFwbG9nKChzdHJ1Y3QgdGwxX3RyYXBsb2cgKikocmVncyArIDEpKTsKLQlkaWVfaWZfa2VybmVsKCJUTDE6IERhdGEgQWNjZXNzIEV4Y2VwdGlvbiIsIHJlZ3MpOwotfQotCi12b2lkIGRvX2lhZV90bDEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JZXhjZXB0aW9uX2VudGVyKCk7Ci0JZHVtcF90bDFfdHJhcGxvZygoc3RydWN0IHRsMV90cmFwbG9nICopKHJlZ3MgKyAxKSk7Ci0JZGllX2lmX2tlcm5lbCgiVEwxOiBJbnN0cnVjdGlvbiBBY2Nlc3MgRXhjZXB0aW9uIiwgcmVncyk7Ci19Ci0KIHZvaWQgZG9fZGl2MF90bDEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJZXhjZXB0aW9uX2VudGVyKCk7CkBAIC0yNTkyLDEzICsyNTczLDYgQEAKIAlkaWVfaWZfa2VybmVsKCJUTDE6IERJVjAgRXhjZXB0aW9uIiwgcmVncyk7CiB9CiAKLXZvaWQgZG9fZnBkaXNfdGwxKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCWV4Y2VwdGlvbl9lbnRlcigpOwotCWR1bXBfdGwxX3RyYXBsb2coKHN0cnVjdCB0bDFfdHJhcGxvZyAqKShyZWdzICsgMSkpOwotCWRpZV9pZl9rZXJuZWwoIlRMMTogRlBVIERpc2FibGVkIiwgcmVncyk7Ci19Ci0KIHZvaWQgZG9fZnBpZWVlX3RsMShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlleGNlcHRpb25fZW50ZXIoKTsKQEAgLTI3MTcsOCArMjY5MSw2IEBACiAJCQkJCSAgICAgICBmYXVsdF9hZGRyZXNzKSB8fAogCQkgICAgIFRJX0tSRUdTICE9IG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywga3JlZ3MpIHx8CiAJCSAgICAgVElfVVRSQVBTICE9IG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdXRyYXBzKSB8fAotCQkgICAgIFRJX0VYRUNfRE9NQUlOICE9IG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywKLQkJCQkJCWV4ZWNfZG9tYWluKSB8fAogCQkgICAgIFRJX1JFR19XSU5ET1cgIT0gb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLAogCQkJCQkgICAgICAgcmVnX3dpbmRvdykgfHwKIAkJICAgICBUSV9SV0lOX1NQVFJTICE9IG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvbGliL21lbW1vdmUuUyBiL2FyY2gvc3BhcmMvbGliL21lbW1vdmUuUwppbmRleCBiN2Y2MzM0Li44NTdhZDRmIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2xpYi9tZW1tb3ZlLlMKKysrIGIvYXJjaC9zcGFyYy9saWIvbWVtbW92ZS5TCkBAIC04LDkgKzgsMTEgQEAKIAogCS50ZXh0CiBFTlRSWShtZW1tb3ZlKSAvKiBvMD1kc3QgbzE9c3JjIG8yPWxlbiAqLwotCW1vdgkJJW8wLCAlZzEKKwlicnoscG4JCSVvMiwgOTlmCisJIG1vdgkJJW8wLCAlZzEKKwogCWNtcAkJJW8wLCAlbzEKLQlibGV1LHB0CQkleGNjLCBtZW1jcHkKKwlibGV1LHB0CQkleGNjLCAyZgogCSBhZGQJCSVvMSwgJW8yLCAlZzcKIAljbXAJCSVnNywgJW8wCiAJYmxldSxwdAkJJXhjYywgbWVtY3B5CkBAIC0yNCw3ICsyNiwzNCBAQAogCXN0YgkJJWc3LCBbJW8wXQogCWJuZSxwdAkJJWljYywgMWIKIAkgc3ViCQklbzAsIDEsICVvMAotCis5OToKIAlyZXRsCiAJIG1vdgkJJWcxLCAlbzAKKworCS8qIFdlIGNhbid0IGp1c3QgY2FsbCBtZW1jcHkgZm9yIHRoZXNlIG1lbW1vdmUgY2FzZXMuICBPbiBzb21lCisJICogY2hpcHMgdGhlIG1lbWNweSB1c2VzIGNhY2hlIGluaXRpYWxpemluZyBzdG9yZXMgYW5kIHdoZW4gZHN0CisJICogYW5kIHNyYyBhcmUgY2xvc2UgZW5vdWdoLCB0aG9zZSBjYW4gY2xvYmJlciB0aGUgc291cmNlIGRhdGEKKwkgKiBiZWZvcmUgd2UndmUgbG9hZGVkIGl0IGluLgorCSAqLworMjoJb3IJCSVvMCwgJW8xLCAlZzcKKwlvcgkJJW8yLCAlZzcsICVnNworCWFuZGNjCQklZzcsIDB4NywgJWcwCisJYm5lLHBuCQkleGNjLCA0ZgorCSBub3AKKworMzoJbGR4CQlbJW8xXSwgJWc3CisJYWRkCQklbzEsIDgsICVvMQorCXN1YmNjCQklbzIsIDgsICVvMgorCWFkZAkJJW8wLCA4LCAlbzAKKwlibmUscHQJCSVpY2MsIDNiCisJIHN0eAkJJWc3LCBbJW8wIC0gMHg4XQorCWJhLGEscHQJCSV4Y2MsIDk5YgorCis0OglsZHViCQlbJW8xXSwgJWc3CisJYWRkCQklbzEsIDEsICVvMQorCXN1YmNjCQklbzIsIDEsICVvMgorCWFkZAkJJW8wLCAxLCAlbzAKKwlibmUscHQJCSVpY2MsIDRiCisJIHN0YgkJJWc3LCBbJW8wIC0gMHgxXQorCWJhLGEscHQJCSV4Y2MsIDk5YgogRU5EUFJPQyhtZW1tb3ZlKQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9tbS9pbml0XzY0LmMgYi9hcmNoL3NwYXJjL21tL2luaXRfNjQuYwppbmRleCAzZWEyNjdjLi40Y2EwZDZiIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL21tL2luaXRfNjQuYworKysgYi9hcmNoL3NwYXJjL21tL2luaXRfNjQuYwpAQCAtMjgyMCw3ICsyODIwLDcgQEAKIAogCXJldHVybiAwOwogfQotZGV2aWNlX2luaXRjYWxsKHJlcG9ydF9tZW1vcnkpOworYXJjaF9pbml0Y2FsbChyZXBvcnRfbWVtb3J5KTsKIAogI2lmZGVmIENPTkZJR19TTVAKICNkZWZpbmUgZG9fZmx1c2hfdGxiX2tlcm5lbF9yYW5nZQlzbXBfZmx1c2hfdGxiX2tlcm5lbF9yYW5nZQpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL0tjb25maWcgYi9hcmNoL3RpbGUvS2NvbmZpZwppbmRleCA3Y2NhNDE4Li4wMTQyZDU3IDEwMDY0NAotLS0gYS9hcmNoL3RpbGUvS2NvbmZpZworKysgYi9hcmNoL3RpbGUvS2NvbmZpZwpAQCAtMTQ3LDYgKzE0NywxMSBAQAogCWRlZmF1bHQgImFyY2gvdGlsZS9jb25maWdzL3RpbGVwcm9fZGVmY29uZmlnIiBpZiAhVElMRUdYCiAJZGVmYXVsdCAiYXJjaC90aWxlL2NvbmZpZ3MvdGlsZWd4X2RlZmNvbmZpZyIgaWYgVElMRUdYCiAKK2NvbmZpZyBQR1RBQkxFX0xFVkVMUworCWludAorCWRlZmF1bHQgMyBpZiA2NEJJVAorCWRlZmF1bHQgMgorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIAogc291cmNlICJrZXJuZWwvS2NvbmZpZy5mcmVlemVyIgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2d4aW8vbXBpcGUuYyBiL2FyY2gvdGlsZS9neGlvL21waXBlLmMKaW5kZXggNmYwMGU5ODUuLmVlMTg2ZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9neGlvL21waXBlLmMKKysrIGIvYXJjaC90aWxlL2d4aW8vbXBpcGUuYwpAQCAtNDU2LDcgKzQ1Niw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChneGlvX21waXBlX2VxdWV1ZV9pbml0KTsKIAogaW50IGd4aW9fbXBpcGVfc2V0X3RpbWVzdGFtcChneGlvX21waXBlX2NvbnRleHRfdCAqY29udGV4dCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cykKKwkJCSAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCWN5Y2xlc190IGN5Y2xlcyA9IGdldF9jeWNsZXMoKTsKIAlyZXR1cm4gZ3hpb19tcGlwZV9zZXRfdGltZXN0YW1wX2F1eChjb250ZXh0LCAodWludDY0X3QpdHMtPnR2X3NlYywKQEAgLTQ2Niw3ICs0NjYsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZ3hpb19tcGlwZV9zZXRfdGltZXN0YW1wKTsKIAogaW50IGd4aW9fbXBpcGVfZ2V0X3RpbWVzdGFtcChneGlvX21waXBlX2NvbnRleHRfdCAqY29udGV4dCwKLQkJCSAgICAgc3RydWN0IHRpbWVzcGVjICp0cykKKwkJCSAgICAgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCWludCByZXQ7CiAJY3ljbGVzX3QgY3ljbGVzX3ByZXYsIGN5Y2xlc19ub3csIGNsb2NrX3JhdGU7CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDk2YzE0YzEuLjk4ZWUxMGEgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0yNiw3ICsyNiw2IEBACiAgKi8KIHN0cnVjdCB0aHJlYWRfaW5mbyB7CiAJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogbWFpbiB0YXNrIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBleGVjX2RvbWFpbgkqZXhlY19kb21haW47CS8qIGV4ZWN1dGlvbiBkb21haW4gKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGxvdyBsZXZlbCBmbGFncyAqLwogCXVuc2lnbmVkIGxvbmcJCXN0YXR1czsJCS8qIHRocmVhZC1zeW5jaHJvbm91cyBmbGFncyAqLwogCV9fdTMyCQkJaG9tZWNhY2hlX2NwdTsJLyogQ1BVIHdlIGFyZSBob21lY2FjaGVkIG9uICovCkBAIC01MSw3ICs1MCw2IEBACiAjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKIHsJCQkJCQlcCiAJLnRhc2sJCT0gJnRzaywJCQlcCi0JLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKIAkuZmxhZ3MJCT0gMCwJCQlcCiAJLmNwdQkJPSAwLAkJCVwKIAkucHJlZW1wdF9jb3VudAk9IElOSVRfUFJFRU1QVF9DT1VOVCwJXApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvZ3hpby9tcGlwZS5oIGIvYXJjaC90aWxlL2luY2x1ZGUvZ3hpby9tcGlwZS5oCmluZGV4IGUzN2NmNGYuLjczZTgzYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2d4aW8vbXBpcGUuaAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9neGlvL21waXBlLmgKQEAgLTE4MzAsNyArMTgzMCw3IEBACiAgKiAgY29kZS4KICAqLwogZXh0ZXJuIGludCBneGlvX21waXBlX2dldF90aW1lc3RhbXAoZ3hpb19tcGlwZV9jb250ZXh0X3QgKmNvbnRleHQsCi0JCQkJICAgIHN0cnVjdCB0aW1lc3BlYyAqdHMpOworCQkJCSAgICBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpOwogCiAvKiBTZXQgdGhlIHRpbWVzdGFtcCBvZiBtUElQRS4KICAqCkBAIC0xODQwLDcgKzE4NDAsNyBAQAogICogIGNvZGUuCiAgKi8KIGV4dGVybiBpbnQgZ3hpb19tcGlwZV9zZXRfdGltZXN0YW1wKGd4aW9fbXBpcGVfY29udGV4dF90ICpjb250ZXh0LAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKKwkJCQkgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjNjQgKnRzKTsKIAogLyogQWRqdXN0IHRoZSB0aW1lc3RhbXAgb2YgbVBJUEUuCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9jb21wYXRfc2lnbmFsLmMgYi9hcmNoL3RpbGUva2VybmVsL2NvbXBhdF9zaWduYWwuYwppbmRleCA4YzVhYmYyLi41Y2JjODY0IDEwMDY0NAotLS0gYS9hcmNoL3RpbGUva2VybmVsL2NvbXBhdF9zaWduYWwuYworKysgYi9hcmNoL3RpbGUva2VybmVsL2NvbXBhdF9zaWduYWwuYwpAQCAtMTk2LDE5ICsxOTYsMTIgQEAKIAl1bnNpZ25lZCBsb25nIHJlc3RvcmVyOwogCXN0cnVjdCBjb21wYXRfcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZTsKIAlpbnQgZXJyID0gMCwgc2lnID0ga3NpZy0+c2lnOwotCWludCB1c2lnOwogCiAJZnJhbWUgPSBjb21wYXRfZ2V0X3NpZ2ZyYW1lKCZrc2lnLT5rYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkpOwogCiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQogCQlnb3RvIGVycjsKIAotCXVzaWcgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCi0JCSYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKLQkJJiYgc2lnIDwgMzIKLQkJPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ10KLQkJOiBzaWc7Ci0KIAkvKiBBbHdheXMgd3JpdGUgYXQgbGVhc3QgdGhlIHNpZ25hbCBudW1iZXIgZm9yIHRoZSBzdGFjayBiYWNrdHJhY2VyLiAqLwogCWlmIChrc2lnLT5rYS5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pIHsKIAkJLyogQXQgc2lncmV0dXJuIHRpbWUsIHJlc3RvcmUgdGhlIGNhbGxlZS1zYXZlIHJlZ2lzdGVycyB0b28uICovCkBAIC0yNDMsNyArMjM2LDcgQEAKIAlyZWdzLT5leDEgPSBQTF9JQ1NfRVgxKFVTRVJfUEwsIDEpOyAvKiBzZXQgY3JpdCBzZWMgaW4gaGFuZGxlciAqLwogCXJlZ3MtPnNwID0gcHRyX3RvX2NvbXBhdF9yZWcoZnJhbWUpOwogCXJlZ3MtPmxyID0gcmVzdG9yZXI7Ci0JcmVncy0+cmVnc1swXSA9ICh1bnNpZ25lZCBsb25nKSB1c2lnOworCXJlZ3MtPnJlZ3NbMF0gPSAodW5zaWduZWQgbG9uZykgc2lnOwogCXJlZ3MtPnJlZ3NbMV0gPSBwdHJfdG9fY29tcGF0X3JlZygmZnJhbWUtPmluZm8pOwogCXJlZ3MtPnJlZ3NbMl0gPSBwdHJfdG9fY29tcGF0X3JlZygmZnJhbWUtPnVjKTsKIAlyZWdzLT5mbGFncyB8PSBQVF9GTEFHU19DQUxMRVJfU0FWRVM7CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL3BjaS5jIGIvYXJjaC90aWxlL2tlcm5lbC9wY2kuYwppbmRleCAzMjVkZjQ3Li45NDc1YTc0IDEwMDY0NAotLS0gYS9hcmNoL3RpbGUva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvcGNpLmMKQEAgLTMzOSw2ICszMzksOCBAQAogCQkJc3RydWN0IHBjaV9idXMgKm5leHRfYnVzOwogCQkJc3RydWN0IHBjaV9kZXYgKmRldjsKIAorCQkJcGNpX2J1c19hZGRfZGV2aWNlcyhyb290X2J1cyk7CisKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcm9vdF9idXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCQkJLyoKIAkJCQkgKiBGaW5kIHRoZSBQQ0kgaG9zdCBjb250cm9sbGVyLCBpZS4gdGhlIDFzdApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9wY2lfZ3guYyBiL2FyY2gvdGlsZS9rZXJuZWwvcGNpX2d4LmMKaW5kZXggMmM5NWYzNy4uYjFkZjg0NyAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC9wY2lfZ3guYworKysgYi9hcmNoL3RpbGUva2VybmVsL3BjaV9neC5jCkBAIC0xMDMwLDYgKzEwMzAsOCBAQAogYWxsb2NfbWVtX21hcF9mYWlsZWQ6CiAJCQlicmVhazsKIAkJfQorCisJCXBjaV9idXNfYWRkX2RldmljZXMocm9vdF9idXMpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvdGlsZS9rZXJuZWwvc2lnbmFsLmMKaW5kZXggOGE1MjRlMy4uODcyOTlhNiAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3RpbGUva2VybmVsL3NpZ25hbC5jCkBAIC0xNTEsMTkgKzE1MSwxMiBAQAogCXVuc2lnbmVkIGxvbmcgcmVzdG9yZXI7CiAJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7CiAJaW50IGVyciA9IDAsIHNpZyA9IGtzaWctPnNpZzsKLQlpbnQgdXNpZzsKIAogCWZyYW1lID0gZ2V0X3NpZ2ZyYW1lKCZrc2lnLT5rYSwgcmVncywgc2l6ZW9mKCpmcmFtZSkpOwogCiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBmcmFtZSwgc2l6ZW9mKCpmcmFtZSkpKQogCQlnb3RvIGVycjsKIAotCXVzaWcgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluCi0JCSYmIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXAKLQkJJiYgc2lnIDwgMzIKLQkJPyBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ10KLQkJOiBzaWc7Ci0KIAkvKiBBbHdheXMgd3JpdGUgYXQgbGVhc3QgdGhlIHNpZ25hbCBudW1iZXIgZm9yIHRoZSBzdGFjayBiYWNrdHJhY2VyLiAqLwogCWlmIChrc2lnLT5rYS5zYS5zYV9mbGFncyAmIFNBX1NJR0lORk8pIHsKIAkJLyogQXQgc2lncmV0dXJuIHRpbWUsIHJlc3RvcmUgdGhlIGNhbGxlZS1zYXZlIHJlZ2lzdGVycyB0b28uICovCkBAIC0xOTgsNyArMTkxLDcgQEAKIAlyZWdzLT5leDEgPSBQTF9JQ1NfRVgxKFVTRVJfUEwsIDEpOyAvKiBzZXQgY3JpdCBzZWMgaW4gaGFuZGxlciAqLwogCXJlZ3MtPnNwID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOwogCXJlZ3MtPmxyID0gcmVzdG9yZXI7Ci0JcmVncy0+cmVnc1swXSA9ICh1bnNpZ25lZCBsb25nKSB1c2lnOworCXJlZ3MtPnJlZ3NbMF0gPSAodW5zaWduZWQgbG9uZykgc2lnOwogCXJlZ3MtPnJlZ3NbMV0gPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT5pbmZvOwogCXJlZ3MtPnJlZ3NbMl0gPSAodW5zaWduZWQgbG9uZykgJmZyYW1lLT51YzsKIAlyZWdzLT5mbGFncyB8PSBQVF9GTEFHU19DQUxMRVJfU0FWRVM7CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL3RpbWUuYyBiL2FyY2gvdGlsZS9rZXJuZWwvdGltZS5jCmluZGV4IGQ0MTJiMDguLjAwMTc4ZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvdGltZS5jCkBAIC0yNTcsMzQgKzI1NywzNCBAQAogCiB2b2lkIHVwZGF0ZV92c3lzY2FsbChzdHJ1Y3QgdGltZWtlZXBlciAqdGspCiB7Ci0JaWYgKHRrLT50a3IuY2xvY2sgIT0gJmN5Y2xlX2NvdW50ZXJfY3MpCisJaWYgKHRrLT50a3JfbW9uby5jbG9jayAhPSAmY3ljbGVfY291bnRlcl9jcykKIAkJcmV0dXJuOwogCiAJd3JpdGVfc2VxY291bnRfYmVnaW4oJnZkc29fZGF0YS0+dGJfc2VxKTsKIAotCXZkc29fZGF0YS0+Y3ljbGVfbGFzdAkJPSB0ay0+dGtyLmN5Y2xlX2xhc3Q7Ci0JdmRzb19kYXRhLT5tYXNrCQkJPSB0ay0+dGtyLm1hc2s7Ci0JdmRzb19kYXRhLT5tdWx0CQkJPSB0ay0+dGtyLm11bHQ7Ci0JdmRzb19kYXRhLT5zaGlmdAkJPSB0ay0+dGtyLnNoaWZ0OworCXZkc29fZGF0YS0+Y3ljbGVfbGFzdAkJPSB0ay0+dGtyX21vbm8uY3ljbGVfbGFzdDsKKwl2ZHNvX2RhdGEtPm1hc2sJCQk9IHRrLT50a3JfbW9uby5tYXNrOworCXZkc29fZGF0YS0+bXVsdAkJCT0gdGstPnRrcl9tb25vLm11bHQ7CisJdmRzb19kYXRhLT5zaGlmdAkJPSB0ay0+dGtyX21vbm8uc2hpZnQ7CiAKIAl2ZHNvX2RhdGEtPndhbGxfdGltZV9zZWMJPSB0ay0+eHRpbWVfc2VjOwotCXZkc29fZGF0YS0+d2FsbF90aW1lX3Nuc2VjCT0gdGstPnRrci54dGltZV9uc2VjOworCXZkc29fZGF0YS0+d2FsbF90aW1lX3Nuc2VjCT0gdGstPnRrcl9tb25vLnh0aW1lX25zZWM7CiAKIAl2ZHNvX2RhdGEtPm1vbm90b25pY190aW1lX3NlYwk9IHRrLT54dGltZV9zZWMKIAkJCQkJKyB0ay0+d2FsbF90b19tb25vdG9uaWMudHZfc2VjOwotCXZkc29fZGF0YS0+bW9ub3RvbmljX3RpbWVfc25zZWMJPSB0ay0+dGtyLnh0aW1lX25zZWMKKwl2ZHNvX2RhdGEtPm1vbm90b25pY190aW1lX3Nuc2VjCT0gdGstPnRrcl9tb25vLnh0aW1lX25zZWMKIAkJCQkJKyAoKHU2NCl0ay0+d2FsbF90b19tb25vdG9uaWMudHZfbnNlYwotCQkJCQkJPDwgdGstPnRrci5zaGlmdCk7CisJCQkJCQk8PCB0ay0+dGtyX21vbm8uc2hpZnQpOwogCXdoaWxlICh2ZHNvX2RhdGEtPm1vbm90b25pY190aW1lX3Nuc2VjID49Ci0JCQkJCSgoKHU2NClOU0VDX1BFUl9TRUMpIDw8IHRrLT50a3Iuc2hpZnQpKSB7CisJCQkJCSgoKHU2NClOU0VDX1BFUl9TRUMpIDw8IHRrLT50a3JfbW9uby5zaGlmdCkpIHsKIAkJdmRzb19kYXRhLT5tb25vdG9uaWNfdGltZV9zbnNlYyAtPQotCQkJCQkoKHU2NClOU0VDX1BFUl9TRUMpIDw8IHRrLT50a3Iuc2hpZnQ7CisJCQkJCSgodTY0KU5TRUNfUEVSX1NFQykgPDwgdGstPnRrcl9tb25vLnNoaWZ0OwogCQl2ZHNvX2RhdGEtPm1vbm90b25pY190aW1lX3NlYysrOwogCX0KIAogCXZkc29fZGF0YS0+d2FsbF90aW1lX2NvYXJzZV9zZWMJPSB0ay0+eHRpbWVfc2VjOwotCXZkc29fZGF0YS0+d2FsbF90aW1lX2NvYXJzZV9uc2VjID0gKGxvbmcpKHRrLT50a3IueHRpbWVfbnNlYyA+PgotCQkJCQkJIHRrLT50a3Iuc2hpZnQpOworCXZkc29fZGF0YS0+d2FsbF90aW1lX2NvYXJzZV9uc2VjID0gKGxvbmcpKHRrLT50a3JfbW9uby54dGltZV9uc2VjID4+CisJCQkJCQkgdGstPnRrcl9tb25vLnNoaWZ0KTsKIAogCXZkc29fZGF0YS0+bW9ub3RvbmljX3RpbWVfY29hcnNlX3NlYyA9CiAJCXZkc29fZGF0YS0+d2FsbF90aW1lX2NvYXJzZV9zZWMgKyB0ay0+d2FsbF90b19tb25vdG9uaWMudHZfc2VjOwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9LY29uZmlnLnVtIGIvYXJjaC91bS9LY29uZmlnLnVtCmluZGV4IGE3NTIwYzkuLjZlNjc4NDcgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vS2NvbmZpZy51bQorKysgYi9hcmNoL3VtL0tjb25maWcudW0KQEAgLTk1LDQ4ICs5NSw2IEBACiAJICBUaGUga2V5cyBhcmUgZG9jdW1lbnRlZCBpbiA8ZmlsZTpEb2N1bWVudGF0aW9uL3N5c3JxLnR4dD4uIERvbid0IHNheSBZCiAJICB1bmxlc3MgeW91IHJlYWxseSBrbm93IHdoYXQgdGhpcyBoYWNrIGRvZXMuCiAKLWNvbmZpZyBTTVAKLQlib29sICJTeW1tZXRyaWMgbXVsdGktcHJvY2Vzc2luZyBzdXBwb3J0IgotCWRlZmF1bHQgbgotCWRlcGVuZHMgb24gQlJPS0VOCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBVTUwgU01QIHN1cHBvcnQuCi0JICBJdCBpcyBOT1QgcmVsYXRlZCB0byBoYXZpbmcgYSByZWFsIFNNUCBib3guIE5vdCBkaXJlY3RseSwgYXQgbGVhc3QuCi0KLQkgIFVNTCBpbXBsZW1lbnRzIHZpcnR1YWwgU01QIGJ5IGFsbG93aW5nIGFzIG1hbnkgcHJvY2Vzc2VzIHRvIHJ1bgotCSAgc2ltdWx0YW5lb3VzbHkgb24gdGhlIGhvc3QgYXMgdGhlcmUgYXJlIHZpcnR1YWwgcHJvY2Vzc29ycyBjb25maWd1cmVkLgotCi0JICBPYnZpb3VzbHksIGlmIHRoZSBob3N0IGlzIGEgdW5pcHJvY2Vzc29yLCB0aG9zZSBwcm9jZXNzZXMgd2lsbAotCSAgdGltZXNoYXJlLCBidXQsIGluc2lkZSBVTUwsIHdpbGwgYXBwZWFyIHRvIGJlIHJ1bm5pbmcgc2ltdWx0YW5lb3VzbHkuCi0JICBJZiB0aGUgaG9zdCBpcyBhIG11bHRpcHJvY2Vzc29yLCB0aGVuIFVNTCBwcm9jZXNzZXMgbWF5IHJ1bgotCSAgc2ltdWx0YW5lb3VzbHksIGRlcGVuZGluZyBvbiB0aGUgaG9zdCBzY2hlZHVsZXIuCi0KLQkgIFRoaXMsIGhvd2V2ZXIsIGlzIHN1cHBvcnRlZCBvbmx5IGluIFRUIG1vZGUuIFNvLCBpZiB5b3UgdXNlIHRoZSBTS0FTCi0JICBwYXRjaCBvbiB5b3VyIGhvc3QsIHN3aXRjaGluZyB0byBUVCBtb2RlIGFuZCBlbmFibGluZyBTTVAgdXN1YWxseQotCSAgZ2l2ZXMJeW91IHdvcnNlIHBlcmZvcm1hbmNlcy4KLQkgIEFsc28sIHNpbmNlIHRoZSBzdXBwb3J0IGZvciBTTVAgaGFzIGJlZW4gdW5kZXItZGV2ZWxvcGVkLCB0aGVyZSBjb3VsZAotCSAgYmUgc29tZSBidWdzIGJlaW5nIGV4cG9zZWQgYnkgZW5hYmxpbmcgU01QLgotCi0JICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvLCBzYXkgTi4KLQotY29uZmlnIE5SX0NQVVMKLQlpbnQgIk1heGltdW0gbnVtYmVyIG9mIENQVXMgKDItMzIpIgotCXJhbmdlIDIgMzIKLQlkZXBlbmRzIG9uIFNNUAotCWRlZmF1bHQgIjMyIgotCi1jb25maWcgSElHSE1FTQotCWJvb2wgIkhpZ2htZW0gc3VwcG9ydCIKLQlkZXBlbmRzIG9uICE2NEJJVCAmJiBCUk9LRU4KLQlkZWZhdWx0IG4KLQloZWxwCi0JICBUaGlzIHdhcyB1c2VkIHRvIGFsbG93IFVNTCB0byBydW4gd2l0aCBiaWcgYW1vdW50cyBvZiBtZW1vcnkuCi0JICBDdXJyZW50bHkgaXQgaXMgdW5zdGFibGUsIHNvIGlmIHVuc3VyZSBzYXkgTi4KLQotCSAgVG8gdXNlIGJpZyBhbW91bnRzIG9mIG1lbW9yeSwgaXQgaXMgcmVjb21tZW5kZWQgZW5hYmxlIHN0YXRpYwotCSAgbGlua2luZyAoaS5lLiBDT05GSUdfU1RBVElDX0xJTkspIC0gdGhpcyBzaG91bGQgYWxsb3cgdGhlCi0JICBndWVzdCB0byB1c2UgdXAgdG8gMi43NUcgb2YgbWVtb3J5LgotCiBjb25maWcgS0VSTkVMX1NUQUNLX09SREVSCiAJaW50ICJLZXJuZWwgc3RhY2sgc2l6ZSBvcmRlciIKIAlkZWZhdWx0IDEgaWYgNjRCSVQKQEAgLTE1NSwzICsxMTMsOCBAQAogCiBjb25maWcgTk9fRE1BCiAJZGVmX2Jvb2wgeQorCitjb25maWcgUEdUQUJMRV9MRVZFTFMKKwlpbnQKKwlkZWZhdWx0IDMgaWYgM19MRVZFTF9QR1RBQkxFUworCWRlZmF1bHQgMgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZSBiL2FyY2gvdW0vTWFrZWZpbGUKaW5kZXggZTRiMWE5Ni4uMTdkNDQ2MCAxMDA2NDQKLS0tIGEvYXJjaC91bS9NYWtlZmlsZQorKysgYi9hcmNoL3VtL01ha2VmaWxlCkBAIC00Myw4ICs0Myw4IEBACiAKIEhPU1RfRElSIDo9IGFyY2gvJChIRUFERVJfQVJDSCkKIAotaW5jbHVkZSAkKHNyY3RyZWUpLyQoQVJDSF9ESVIpL01ha2VmaWxlLXNrYXMKLWluY2x1ZGUgJChzcmN0cmVlKS8kKEhPU1RfRElSKS9NYWtlZmlsZS51bQoraW5jbHVkZSAkKEFSQ0hfRElSKS9NYWtlZmlsZS1za2FzCitpbmNsdWRlICQoSE9TVF9ESVIpL01ha2VmaWxlLnVtCiAKIGNvcmUteSArPSAkKEhPU1RfRElSKS91bS8KIApAQCAtNzMsNyArNzMsNyBAQAogCSQoZmlsdGVyIC1JJSwkKENGTEFHUykpIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgLWlkaXJhZnRlciBpbmNsdWRlCiAKICNUaGlzIHdpbGwgYWRqdXN0ICpGTEFHUyBhY2NvcmRpbmdseSB0byB0aGUgcGxhdGZvcm0uCi1pbmNsdWRlICQoc3JjdHJlZSkvJChBUkNIX0RJUikvTWFrZWZpbGUtb3MtJChPUykKK2luY2x1ZGUgJChBUkNIX0RJUikvTWFrZWZpbGUtb3MtJChPUykKIAogS0JVSUxEX0NQUEZMQUdTICs9IC1JJChzcmN0cmVlKS8kKEhPU1RfRElSKS9pbmNsdWRlIFwKIAkJICAgLUkkKHNyY3RyZWUpLyQoSE9TVF9ESVIpL2luY2x1ZGUvdWFwaSBcCmRpZmYgLS1naXQgYS9hcmNoL3VtL01ha2VmaWxlLWlhNjQgYi9hcmNoL3VtL01ha2VmaWxlLWlhNjQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NGRjMjMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9NYWtlZmlsZS1pYTY0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotU1RBUlRfQUREUiA9IDB4MTAwMDAwMDAwMDAwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC91bS9NYWtlZmlsZS1wcGMgYi9hcmNoL3VtL01ha2VmaWxlLXBwYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZmZDIwMC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL01ha2VmaWxlLXBwYworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotaWZlcSAoJChDT05GSUdfSE9TVF8yR18yRyksIHkpCi1TVEFSVF9BRERSID0gMHg4MDAwMDAwMAotZWxzZQotU1RBUlRfQUREUiA9IDB4YzAwMDAwMDAKLWVuZGlmCi1BUkNIX0NGTEFHUyA9IC1VX19wb3dlcnBjX18gLURfX1VNX1BQQ19fCi0KLSMgVGhlIGFyY2ggaXMgcHBjLCBidXQgdGhlIGVsZjMyIG5hbWUgaXMgcG93ZXJwYwotRUxGX1NVQkFSQ0ggPSBwb3dlcnBjCmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvYXNtL2ZpeG1hcC5oIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9maXhtYXAuaAppbmRleCAzMDk0ZWEzYy4uMTc2MWZkNyAxMDA2NDQKLS0tIGEvYXJjaC91bS9pbmNsdWRlL2FzbS9maXhtYXAuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCkBAIC0zMywxMCArMzMsNiBAQAogICogZml4LW1hcHBlZD8KICAqLwogZW51bSBmaXhlZF9hZGRyZXNzZXMgewotI2lmZGVmIENPTkZJR19ISUdITUVNCi0JRklYX0tNQVBfQkVHSU4sCS8qIHJlc2VydmVkIHB0ZSdzIGZvciB0ZW1wb3Jhcnkga2VybmVsIG1hcHBpbmdzICovCi0JRklYX0tNQVBfRU5EID0gRklYX0tNQVBfQkVHSU4rKEtNX1RZUEVfTlIqTlJfQ1BVUyktMSwKLSNlbmRpZgogCV9fZW5kX29mX2ZpeGVkX2FkZHJlc3NlcwogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCAyMzI0YjYyLi4xOGViOTkyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtNDcsMTEgKzQ3LDcgQEAKICNkZWZpbmUgVk1BTExPQ19PRkZTRVQJKF9fdmFfc3BhY2UpCiAjZGVmaW5lIFZNQUxMT0NfU1RBUlQgKChlbmRfaW9tZW0gKyBWTUFMTE9DX09GRlNFVCkgJiB+KFZNQUxMT0NfT0ZGU0VULTEpKQogI2RlZmluZSBQS01BUF9CQVNFICgoRklYQUREUl9TVEFSVCAtIExBU1RfUEtNQVAgKiBQQUdFX1NJWkUpICYgUE1EX01BU0spCi0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLSMgZGVmaW5lIFZNQUxMT0NfRU5ECShQS01BUF9CQVNFLTIqUEFHRV9TSVpFKQotI2Vsc2UKLSMgZGVmaW5lIFZNQUxMT0NfRU5ECShGSVhBRERSX1NUQVJULTIqUEFHRV9TSVpFKQotI2VuZGlmCisjZGVmaW5lIFZNQUxMT0NfRU5ECShGSVhBRERSX1NUQVJULTIqUEFHRV9TSVpFKQogI2RlZmluZSBNT0RVTEVTX1ZBRERSCVZNQUxMT0NfU1RBUlQKICNkZWZpbmUgTU9EVUxFU19FTkQJVk1BTExPQ19FTkQKICNkZWZpbmUgTU9EVUxFU19MRU4JKE1PRFVMRVNfVkFERFIgLSBNT0RVTEVTX0VORCkKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vcHJvY2Vzc29yLWdlbmVyaWMuaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vcHJvY2Vzc29yLWdlbmVyaWMuaAppbmRleCBjYmM1ZWRkLi4yZDFlMGRkIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci1nZW5lcmljLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9wcm9jZXNzb3ItZ2VuZXJpYy5oCkBAIC05OCwxNiArOTgsOCBAQAogCiBleHRlcm4gc3RydWN0IGNwdWluZm9fdW0gYm9vdF9jcHVfZGF0YTsKIAotI2RlZmluZSBteV9jcHVfZGF0YQkJY3B1X2RhdGFbc21wX3Byb2Nlc3Nvcl9pZCgpXQotCi0jaWZkZWYgQ09ORklHX1NNUAotZXh0ZXJuIHN0cnVjdCBjcHVpbmZvX3VtIGNwdV9kYXRhW107Ci0jZGVmaW5lIGN1cnJlbnRfY3B1X2RhdGEgY3B1X2RhdGFbc21wX3Byb2Nlc3Nvcl9pZCgpXQotI2Vsc2UKICNkZWZpbmUgY3B1X2RhdGEgKCZib290X2NwdV9kYXRhKQogI2RlZmluZSBjdXJyZW50X2NwdV9kYXRhIGJvb3RfY3B1X2RhdGEKLSNlbmRpZgotCiAKICNkZWZpbmUgS1NUS19SRUcodHNrLCByZWcpIGdldF90aHJlYWRfcmVnKHJlZywgJnRzay0+dGhyZWFkLnN3aXRjaF9idWYpCiBleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfd2NoYW4oc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3VtL2luY2x1ZGUvYXNtL3NtcC5oCmluZGV4IGU0NTA3OTMuLjljM2JlMzUgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMSwzMiArMSw2IEBACiAjaWZuZGVmIF9fVU1fU01QX0gKICNkZWZpbmUgX19VTV9TTVBfSAogCi0jaWZkZWYgQ09ORklHX1NNUAotCi0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+Ci0KLSNkZWZpbmUgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSAoY3VycmVudF90aHJlYWQtPmNwdSkKLQotI2RlZmluZSBjcHVfbG9naWNhbF9tYXAobikgKG4pCi0jZGVmaW5lIGNwdV9udW1iZXJfbWFwKG4pIChuKQotZXh0ZXJuIGludCBoYXJkX3NtcF9wcm9jZXNzb3JfaWQodm9pZCk7Ci0jZGVmaW5lIE5PX1BST0NfSUQgLTEKLQotZXh0ZXJuIGludCBuY3B1czsKLQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc21wX2NwdXNfZG9uZSh1bnNpZ25lZCBpbnQgbWF4Y3B1cykKLXsKLX0KLQotZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZV90aHJlYWRzW05SX0NQVVNdOwotCi0jZWxzZQotCiAjZGVmaW5lIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpCQkwCiAKICNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaCBiL2FyY2gvdW0vaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCBlMDQxMTRjLi5iMzBjODViIDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCkBAIC0xNCw3ICsxNCw2IEBACiAKIHN0cnVjdCB0aHJlYWRfaW5mbyB7CiAJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogbWFpbiB0YXNrIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBleGVjX2RvbWFpbgkqZXhlY19kb21haW47CS8qIGV4ZWN1dGlvbiBkb21haW4gKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsJCS8qIGxvdyBsZXZlbCBmbGFncyAqLwogCV9fdTMyCQkJY3B1OwkJLyogY3VycmVudCBDUFUgKi8KIAlpbnQJCQlwcmVlbXB0X2NvdW50OyAgLyogMCA9PiBwcmVlbXB0YWJsZSwKQEAgLTI4LDcgKzI3LDYgQEAKICNkZWZpbmUgSU5JVF9USFJFQURfSU5GTyh0c2spCQkJXAogewkJCQkJCVwKIAkudGFzayA9CQkmdHNrLAkJCVwKLQkuZXhlY19kb21haW4gPQkmZGVmYXVsdF9leGVjX2RvbWFpbiwJXAogCS5mbGFncyA9CQkwLAkJXAogCS5jcHUgPQkJMCwJCQlcCiAJLnByZWVtcHRfY291bnQgPSBJTklUX1BSRUVNUFRfQ09VTlQsCVwKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvYXMtbGF5b3V0LmggYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL2FzLWxheW91dC5oCmluZGV4IDQxYzhjNzcuLmNhMTg0M2UgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvYXMtbGF5b3V0LmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9hcy1sYXlvdXQuaApAQCAtNTYsNiArNTYsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaG9zdF90YXNrX3NpemU7CiAKIGV4dGVybiBpbnQgbGludXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworZXh0ZXJuIHZvaWQgdW1sX2ZpbmlzaHNldHVwKHZvaWQpOwogCiBzdHJ1Y3Qgc2lnaW5mbzsKIGV4dGVybiB2b2lkICgqc2lnX2luZm9bXSkoaW50LCBzdHJ1Y3Qgc2lnaW5mbyAqc2ksIHN0cnVjdCB1bWxfcHRfcmVncyAqKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvb3MuaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvb3MuaAppbmRleCAwOGVlYzBiLi5kODI0NTI4IDEwMDY0NAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL29zLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9vcy5oCkBAIC0xNzQsNyArMTc0LDYgQEAKIAogLyogc3RhcnRfdXAuYyAqLwogZXh0ZXJuIHZvaWQgb3NfZWFybHlfY2hlY2tzKHZvaWQpOwotZXh0ZXJuIHZvaWQgY2FuX2RvX3NrYXModm9pZCk7CiBleHRlcm4gdm9pZCBvc19jaGVja19idWdzKHZvaWQpOwogZXh0ZXJuIHZvaWQgY2hlY2tfaG9zdF9zdXBwb3J0c190bHMoaW50ICpzdXBwb3J0c190bHMsIGludCAqdGxzX21pbik7CiAKQEAgLTE4Nyw3ICsxODYsNiBAQAogZXh0ZXJuIHZvaWQgb3Nfc3RvcF9wcm9jZXNzKGludCBwaWQpOwogZXh0ZXJuIHZvaWQgb3Nfa2lsbF9wcm9jZXNzKGludCBwaWQsIGludCByZWFwX2NoaWxkKTsKIGV4dGVybiB2b2lkIG9zX2tpbGxfcHRyYWNlZF9wcm9jZXNzKGludCBwaWQsIGludCByZWFwX2NoaWxkKTsKLWV4dGVybiBsb25nIG9zX3B0cmFjZV9sZHQobG9uZyBwaWQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKTsKIAogZXh0ZXJuIGludCBvc19nZXRwaWQodm9pZCk7CiBleHRlcm4gaW50IG9zX2dldHBncnAodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3NrYXMvcHJvY19tbS5oIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9za2FzL3Byb2NfbW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyODA5Mi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3NrYXMvcHJvY19tbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NLQVNfUFJPQ19NTV9ICi0jZGVmaW5lIF9fU0tBU19QUk9DX01NX0gKLQotI2RlZmluZSBNTV9NTUFQIDU0Ci0jZGVmaW5lIE1NX01VTk1BUCA1NQotI2RlZmluZSBNTV9NUFJPVEVDVCA1NgotI2RlZmluZSBNTV9DT1BZX1NFR01FTlRTIDU3Ci0KLXN0cnVjdCBtbV9tbWFwIHsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0JdW5zaWduZWQgbG9uZyBsZW47Ci0JdW5zaWduZWQgbG9uZyBwcm90OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBmZDsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLX07Ci0KLXN0cnVjdCBtbV9tdW5tYXAgewotCXVuc2lnbmVkIGxvbmcgYWRkcjsKLQl1bnNpZ25lZCBsb25nIGxlbjsKLX07Ci0KLXN0cnVjdCBtbV9tcHJvdGVjdCB7Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCXVuc2lnbmVkIGxvbmcgbGVuOwotCXVuc2lnbmVkIGludCBwcm90OwotfTsKLQotc3RydWN0IHByb2NfbW1fb3AgewotCWludCBvcDsKLQl1bmlvbiB7Ci0JCXN0cnVjdCBtbV9tbWFwIG1tYXA7Ci0JCXN0cnVjdCBtbV9tdW5tYXAgbXVubWFwOwotCSAgICAgICAgc3RydWN0IG1tX21wcm90ZWN0IG1wcm90ZWN0OwotCQlpbnQgY29weV9zZWdtZW50czsKLQl9IHU7Ci19OwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvc2thcy9za2FzLmggYi9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3NrYXMvc2thcy5oCmluZGV4IGM0NWRmOTYuLjkxMWYzYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvc2thcy9za2FzLmgKKysrIGIvYXJjaC91bS9pbmNsdWRlL3NoYXJlZC9za2FzL3NrYXMuaApAQCAtOSwxMyArOSwxMCBAQAogI2luY2x1ZGUgPHN5c2RlcC9wdHJhY2UuaD4KIAogZXh0ZXJuIGludCB1c2Vyc3BhY2VfcGlkW107Ci1leHRlcm4gaW50IHByb2NfbW0sIHB0cmFjZV9mYXVsdGluZm8sIHB0cmFjZV9sZHQ7Ci1leHRlcm4gaW50IHNrYXNfbmVlZHNfc3R1YjsKIAogZXh0ZXJuIGludCB1c2VyX3RocmVhZCh1bnNpZ25lZCBsb25nIHN0YWNrLCBpbnQgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgbmV3X3RocmVhZF9oYW5kbGVyKHZvaWQpOwogZXh0ZXJuIHZvaWQgaGFuZGxlX3N5c2NhbGwoc3RydWN0IHVtbF9wdF9yZWdzICpyZWdzKTsKLWV4dGVybiBpbnQgbmV3X21tKHVuc2lnbmVkIGxvbmcgc3RhY2spOwogZXh0ZXJuIGxvbmcgZXhlY3V0ZV9zeXNjYWxsX3NrYXModm9pZCAqcik7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBjdXJyZW50X3N0dWJfc3RhY2sodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvc2thc19wdHJhY2UuaCBiL2FyY2gvdW0vaW5jbHVkZS9zaGFyZWQvc2thc19wdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwYTljOS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL2luY2x1ZGUvc2hhcmVkL3NrYXNfcHRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCAtIDIwMDcgSmVmZiBEaWtlIChqZGlrZUB7YWRkdG9pdCxsaW51eC5pbnRlbH0uY29tKQotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TS0FTX1BUUkFDRV9ICi0jZGVmaW5lIF9fU0tBU19QVFJBQ0VfSAotCi0jZGVmaW5lIFBUUkFDRV9GQVVMVElORk8gNTIKLSNkZWZpbmUgUFRSQUNFX1NXSVRDSF9NTSA1NQotCi0jaW5jbHVkZSA8c3lzZGVwL3NrYXNfcHRyYWNlLmg+Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3VtL2tlcm5lbC9NYWtlZmlsZQppbmRleCAyZDg0MGEwLi5hNmE1ZTQyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL3VtL2tlcm5lbC9NYWtlZmlsZQpAQCAtMTIsOCArMTIsOCBAQAogCiBvYmoteSA9IGNvbmZpZy5vIGV4ZWMubyBleGl0Y29kZS5vIGlycS5vIGtzeW1zLm8gbWVtLm8gXAogCXBoeXNtZW0ubyBwcm9jZXNzLm8gcHRyYWNlLm8gcmVib290Lm8gc2lnaW8ubyBcCi0Jc2lnbmFsLm8gc21wLm8gc3lzY2FsbC5vIHN5c3JxLm8gdGltZS5vIHRsYi5vIHRyYXAubyBcCi0JdW1fYXJjaC5vIHVtaWQubyBtYWNjZXNzLm8gc2thcy8KKwlzaWduYWwubyBzeXNjYWxsLm8gc3lzcnEubyB0aW1lLm8gdGxiLm8gdHJhcC5vIFwKKwl1bV9hcmNoLm8gdW1pZC5vIG1hY2Nlc3MubyBrbXNnX2R1bXAubyBza2FzLwogCiBvYmotJChDT05GSUdfQkxLX0RFVl9JTklUUkQpICs9IGluaXRyZC5vCiBvYmotJChDT05GSUdfR1BST0YpCSs9IGdwcm9mX3N5bXMubwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvaXJxLmMgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwppbmRleCAxZDg1MDViLi4yM2NiOTM1IDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3VtL2tlcm5lbC9pcnEuYwpAQCAtMzUsOSArMzUsNiBAQAogCXN0cnVjdCBpcnFfZmQgKmlycV9mZDsKIAlpbnQgbjsKIAotCWlmIChzbXBfc2lnaW9faGFuZGxlcigpKQotCQlyZXR1cm47Ci0KIAl3aGlsZSAoMSkgewogCQluID0gb3Nfd2FpdGluZ19mb3JfZXZlbnRzKGFjdGl2ZV9mZHMpOwogCQlpZiAobiA8PSAwKSB7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9rbXNnX2R1bXAuYyBiL2FyY2gvdW0va2VybmVsL2ttc2dfZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwN2Q0OTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3VtL2tlcm5lbC9rbXNnX2R1bXAuYwpAQCAtMCwwICsxLDQzIEBACisjaW5jbHVkZSA8bGludXgva21zZ19kdW1wLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPHNoYXJlZC9pbml0Lmg+CisjaW5jbHVkZSA8c2hhcmVkL2tlcm4uaD4KKyNpbmNsdWRlIDxvcy5oPgorCitzdGF0aWMgdm9pZCBrbXNnX2R1bXBlcl9zdGRvdXQoc3RydWN0IGttc2dfZHVtcGVyICpkdW1wZXIsCisJCQkJZW51bSBrbXNnX2R1bXBfcmVhc29uIHJlYXNvbikKK3sKKwlzdGF0aWMgY2hhciBsaW5lWzEwMjRdOworCisJc2l6ZV90IGxlbiA9IDA7CisJYm9vbCBjb25fYXZhaWxhYmxlID0gZmFsc2U7CisKKwkvKiBvbmx5IGR1bXAga21zZyB3aGVuIG5vIGNvbnNvbGUgaXMgYXZhaWxhYmxlICovCisJaWYgKCFjb25zb2xlX3RyeWxvY2soKSkKKwkJcmV0dXJuOworCisJaWYgKGNvbnNvbGVfZHJpdmVycyAhPSBOVUxMKQorCQljb25fYXZhaWxhYmxlID0gdHJ1ZTsKKworCWNvbnNvbGVfdW5sb2NrKCk7CisKKwlpZiAoY29uX2F2YWlsYWJsZSA9PSB0cnVlKQorCQlyZXR1cm47CisKKwlwcmludGYoImttc2dfZHVtcDpcbiIpOworCXdoaWxlIChrbXNnX2R1bXBfZ2V0X2xpbmUoZHVtcGVyLCB0cnVlLCBsaW5lLCBzaXplb2YobGluZSksICZsZW4pKSB7CisJCWxpbmVbbGVuXSA9ICdcMCc7CisJCXByaW50ZigiJXMiLCBsaW5lKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga21zZ19kdW1wZXIga21zZ19kdW1wZXIgPSB7CisJLmR1bXAgPSBrbXNnX2R1bXBlcl9zdGRvdXQKK307CisKK2ludCBfX2luaXQga21zZ19kdW1wZXJfc3Rkb3V0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4ga21zZ19kdW1wX3JlZ2lzdGVyKCZrbXNnX2R1bXBlcik7Cit9CisKK19fdW1sX3Bvc3RzZXR1cChrbXNnX2R1bXBlcl9zdGRvdXRfaW5pdCk7CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9tZW0uYyBiL2FyY2gvdW0va2VybmVsL21lbS5jCmluZGV4IDg2MzZlOTAuLmIyYTJkZmYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL21lbS5jCisrKyBiL2FyY2gvdW0va2VybmVsL21lbS5jCkBAIC0zOCwxOSArMzgsNiBAQAogLyogVXNlZCBkdXJpbmcgZWFybHkgYm9vdCAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgYnJrX2VuZDsKIAotI2lmZGVmIENPTkZJR19ISUdITUVNCi1zdGF0aWMgdm9pZCBzZXR1cF9oaWdobWVtKHVuc2lnbmVkIGxvbmcgaGlnaG1lbV9zdGFydCwKLQkJCSAgdW5zaWduZWQgbG9uZyBoaWdobWVtX2xlbikKLXsKLQl1bnNpZ25lZCBsb25nIGhpZ2htZW1fcGZuOwotCWludCBpOwotCi0JaGlnaG1lbV9wZm4gPSBfX3BhKGhpZ2htZW1fc3RhcnQpID4+IFBBR0VfU0hJRlQ7Ci0JZm9yIChpID0gMDsgaSA8IGhpZ2htZW1fbGVuID4+IFBBR0VfU0hJRlQ7IGkrKykKLQkJZnJlZV9oaWdobWVtX3BhZ2UoJm1lbV9tYXBbaGlnaG1lbV9wZm4gKyBpXSk7Ci19Ci0jZW5kaWYKLQogdm9pZCBfX2luaXQgbWVtX2luaXQodm9pZCkKIHsKIAkvKiBjbGVhciB0aGUgemVyby1wYWdlICovCkBAIC02Nyw5ICs1NCw2IEBACiAJLyogdGhpcyB3aWxsIHB1dCBhbGwgbG93IG1lbW9yeSBvbnRvIHRoZSBmcmVlbGlzdHMgKi8KIAlmcmVlX2FsbF9ib290bWVtKCk7CiAJbWF4X2xvd19wZm4gPSB0b3RhbHJhbV9wYWdlczsKLSNpZmRlZiBDT05GSUdfSElHSE1FTQotCXNldHVwX2hpZ2htZW0oZW5kX2lvbWVtLCBoaWdobWVtKTsKLSNlbmRpZgogCW1heF9wZm4gPSB0b3RhbHJhbV9wYWdlczsKIAltZW1faW5pdF9wcmludF9pbmZvKE5VTEwpOwogCWttYWxsb2Nfb2sgPSAxOwpAQCAtMTI3LDQ5ICsxMTEsNiBAQAogCX0KIH0KIAotI2lmZGVmIENPTkZJR19ISUdITUVNCi1wdGVfdCAqa21hcF9wdGU7Ci1wZ3Byb3RfdCBrbWFwX3Byb3Q7Ci0KLSNkZWZpbmUga21hcF9nZXRfZml4bWFwX3B0ZSh2YWRkcikJCQkJCVwKLQlwdGVfb2Zmc2V0X2tlcm5lbChwbWRfb2Zmc2V0KHB1ZF9vZmZzZXQocGdkX29mZnNldF9rKHZhZGRyKSwgKHZhZGRyKSksXAotCQkJCSAgICAgKHZhZGRyKSksICh2YWRkcikpCi0KLXN0YXRpYyB2b2lkIF9faW5pdCBrbWFwX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGttYXBfdnN0YXJ0OwotCi0JLyogY2FjaGUgdGhlIGZpcnN0IGttYXAgcHRlICovCi0Ja21hcF92c3RhcnQgPSBfX2ZpeF90b192aXJ0KEZJWF9LTUFQX0JFR0lOKTsKLQlrbWFwX3B0ZSA9IGttYXBfZ2V0X2ZpeG1hcF9wdGUoa21hcF92c3RhcnQpOwotCi0Ja21hcF9wcm90ID0gUEFHRV9LRVJORUw7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2hpZ2htZW0odm9pZCkKLXsKLQlwZ2RfdCAqcGdkOwotCXB1ZF90ICpwdWQ7Ci0JcG1kX3QgKnBtZDsKLQlwdGVfdCAqcHRlOwotCXVuc2lnbmVkIGxvbmcgdmFkZHI7Ci0KLQkvKgotCSAqIFBlcm1hbmVudCBrbWFwczoKLQkgKi8KLQl2YWRkciA9IFBLTUFQX0JBU0U7Ci0JZml4cmFuZ2VfaW5pdCh2YWRkciwgdmFkZHIgKyBQQUdFX1NJWkUqTEFTVF9QS01BUCwgc3dhcHBlcl9wZ19kaXIpOwotCi0JcGdkID0gc3dhcHBlcl9wZ19kaXIgKyBwZ2RfaW5kZXgodmFkZHIpOwotCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCB2YWRkcik7Ci0JcG1kID0gcG1kX29mZnNldChwdWQsIHZhZGRyKTsKLQlwdGUgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIHZhZGRyKTsKLQlwa21hcF9wYWdlX3RhYmxlID0gcHRlOwotCi0Ja21hcF9pbml0KCk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0hJR0hNRU0gKi8KLQogc3RhdGljIHZvaWQgX19pbml0IGZpeGFkZHJfdXNlcl9pbml0KCB2b2lkKQogewogI2lmZGVmIENPTkZJR19BUkNIX1JFVVNFX0hPU1RfVlNZU0NBTExfQVJFQQpAQCAtMjExLDkgKzE1Miw2IEBACiAKIAl6b25lc19zaXplW1pPTkVfTk9STUFMXSA9IChlbmRfaW9tZW0gPj4gUEFHRV9TSElGVCkgLQogCQkodW1sX3BoeXNtZW0gPj4gUEFHRV9TSElGVCk7Ci0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLQl6b25lc19zaXplW1pPTkVfSElHSE1FTV0gPSBoaWdobWVtID4+IFBBR0VfU0hJRlQ7Ci0jZW5kaWYKIAlmcmVlX2FyZWFfaW5pdCh6b25lc19zaXplKTsKIAogCS8qCkBAIC0yMjQsMTAgKzE2Miw2IEBACiAJZml4cmFuZ2VfaW5pdCh2YWRkciwgRklYQUREUl9UT1AsIHN3YXBwZXJfcGdfZGlyKTsKIAogCWZpeGFkZHJfdXNlcl9pbml0KCk7Ci0KLSNpZmRlZiBDT05GSUdfSElHSE1FTQotCWluaXRfaGlnaG1lbSgpOwotI2VuZGlmCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMgYi9hcmNoL3VtL2tlcm5lbC9waHlzbWVtLmMKaW5kZXggNTQ5ZWNmMy4uOTAzNGZjOCAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvcGh5c21lbS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3BoeXNtZW0uYwpAQCAtNTcsMjIgKzU3LDUxIEBACiAKIGV4dGVybiBpbnQgX19zeXNjYWxsX3N0dWJfc3RhcnQ7CiAKKy8qKgorICogc2V0dXBfcGh5c21lbSgpIC0gU2V0dXAgcGh5c2ljYWwgbWVtb3J5IGZvciBVTUwKKyAqIEBzdGFydDoJU3RhcnQgYWRkcmVzcyBvZiB0aGUgcGh5c2ljYWwga2VybmVsIG1lbW9yeSwKKyAqCQlpLmUgc3RhcnQgYWRkcmVzcyBvZiB0aGUgZXhlY3V0YWJsZSBpbWFnZS4KKyAqIEByZXNlcnZlX2VuZDoJZW5kIGFkZHJlc3Mgb2YgdGhlIHBoeXNpY2FsIGtlcm5lbCBtZW1vcnkuCisgKiBAbGVuOglMZW5ndGggb2YgdG90YWwgcGh5c2ljYWwgbWVtb3J5IHRoYXQgc2hvdWxkIGJlIG1hcHBlZC9tYWRlCisgKgkJYXZhaWxhYmxlLCBpbiBieXRlcy4KKyAqIEBoaWdobWVtOglOdW1iZXIgb2YgaGlnaG1lbSBieXRlcyB0aGF0IHNob3VsZCBiZSBtYXBwZWQvbWFkZSBhdmFpbGFibGUuCisgKgorICogQ3JlYXRlcyBhbiB1bmxpbmtlZCB0ZW1wb3JhcnkgZmlsZSBvZiBzaXplIChsZW4gKyBoaWdobWVtKSBhbmQgbWVtb3J5IG1hcHMKKyAqIGl0IG9uIHRoZSBsYXN0IGV4ZWN1dGFibGUgaW1hZ2UgYWRkcmVzcyAodW1sX3Jlc2VydmVkKS4KKyAqCisgKiBUaGUgb2Zmc2V0IGlzIG5lZWRlZCBhcyB0aGUgbGVuZ3RoIG9mIHRoZSB0b3RhbCBwaHlzaWNhbCBtZW1vcnkKKyAqIChsZW4gKyBoaWdobWVtKSBpbmNsdWRlcyB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IHVzZWQgYmUgdGhlIGV4ZWN1dGFibGUgaW1hZ2UsCisgKiBidXQgdGhlIG1hcHBlZC10byBhZGRyZXNzIGlzIHRoZSBsYXN0IGFkZHJlc3Mgb2YgdGhlIGV4ZWN1dGFibGUgaW1hZ2UKKyAqICh1bWxfcmVzZXJ2ZWQgPT0gZW5kIGFkZHJlc3Mgb2YgZXhlY3V0YWJsZSBpbWFnZSkuCisgKgorICogVGhlIG1lbW9yeSBtYXBwZWQgbWVtb3J5IG9mIHRoZSB0ZW1wb3JhcnkgZmlsZSBpcyB1c2VkIGFzIGJhY2tpbmcgbWVtb3J5CisgKiBvZiBhbGwgdXNlciBzcGFjZSBwcm9jZXNzZXMva2VybmVsIHRhc2tzLgorICovCiB2b2lkIF9faW5pdCBzZXR1cF9waHlzbWVtKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgcmVzZXJ2ZV9lbmQsCiAJCQkgIHVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIGxvbmcgaGlnaG1lbSkKIHsKIAl1bnNpZ25lZCBsb25nIHJlc2VydmUgPSByZXNlcnZlX2VuZCAtIHN0YXJ0OwotCWludCBwZm4gPSBQRk5fVVAoX19wYShyZXNlcnZlX2VuZCkpOwotCWludCBkZWx0YSA9IChsZW4gLSByZXNlcnZlKSA+PiBQQUdFX1NISUZUOwotCWludCBlcnIsIG9mZnNldCwgYm9vdG1hcF9zaXplOworCXVuc2lnbmVkIGxvbmcgcGZuID0gUEZOX1VQKF9fcGEocmVzZXJ2ZV9lbmQpKTsKKwl1bnNpZ25lZCBsb25nIGRlbHRhID0gKGxlbiAtIHJlc2VydmUpID4+IFBBR0VfU0hJRlQ7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIGJvb3RtYXBfc2l6ZTsKKwlsb25nIG1hcF9zaXplOworCWludCBlcnI7CisKKwlvZmZzZXQgPSB1bWxfcmVzZXJ2ZWQgLSB1bWxfcGh5c21lbTsKKwltYXBfc2l6ZSA9IGxlbiAtIG9mZnNldDsKKwlpZihtYXBfc2l6ZSA8PSAwKSB7CisJCXByaW50ZigiVG9vIGZldyBwaHlzaWNhbCBtZW1vcnkhIE5lZWRlZD0lZCwgZ2l2ZW49JWRcbiIsCisJCSAgICAgICBvZmZzZXQsIGxlbik7CisJCWV4aXQoMSk7CisJfQogCiAJcGh5c21lbV9mZCA9IGNyZWF0ZV9tZW1fZmlsZShsZW4gKyBoaWdobWVtKTsKIAotCW9mZnNldCA9IHVtbF9yZXNlcnZlZCAtIHVtbF9waHlzbWVtOwogCWVyciA9IG9zX21hcF9tZW1vcnkoKHZvaWQgKikgdW1sX3Jlc2VydmVkLCBwaHlzbWVtX2ZkLCBvZmZzZXQsCi0JCQkgICAgbGVuIC0gb2Zmc2V0LCAxLCAxLCAxKTsKKwkJCSAgICBtYXBfc2l6ZSwgMSwgMSwgMSk7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJpbnRmKCJzZXR1cF9waHlzbWVtIC0gbWFwcGluZyAlbGQgYnl0ZXMgb2YgbWVtb3J5IGF0IDB4JXAgIgotCQkgICAgICAgImZhaWxlZCAtIGVycm5vID0gJWRcbiIsIGxlbiAtIG9mZnNldCwKKwkJICAgICAgICJmYWlsZWQgLSBlcnJubyA9ICVkXG4iLCBtYXBfc2l6ZSwKIAkJICAgICAgICh2b2lkICopIHVtbF9yZXNlcnZlZCwgZXJyKTsKIAkJZXhpdCgxKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZjE3YmNhOC4uNjhiOTExOSAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYwpAQCAtMjU5LDE3ICsyNTksNiBAQAogCXJldHVybiBzdHJsZW5fdXNlcihzdHIpOwogfQogCi1pbnQgc21wX3NpZ2lvX2hhbmRsZXIodm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JaW50IGNwdSA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1OwotCUlQSV9oYW5kbGVyKGNwdSk7Ci0JaWYgKGNwdSAhPSAwKQotCQlyZXR1cm4gMTsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCiBpbnQgY3B1KHZvaWQpCiB7CiAJcmV0dXJuIGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+Y3B1OwpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcHRyYWNlLmMgYi9hcmNoL3VtL2tlcm5lbC9wdHJhY2UuYwppbmRleCA2MjQzNWVmLi4xNzRlZTUwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3VtL2tlcm5lbC9wdHJhY2UuYwpAQCAtOCw5ICs4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8c2thc19wdHJhY2UuaD4KLQotCiAKIHZvaWQgdXNlcl9lbmFibGVfc2luZ2xlX3N0ZXAoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKQEAgLTEwNCwzNSArMTAxLDYgQEAKIAkJcmV0ID0gcHRyYWNlX3NldF90aHJlYWRfYXJlYShjaGlsZCwgYWRkciwgdnApOwogCQlicmVhazsKIAotCWNhc2UgUFRSQUNFX0ZBVUxUSU5GTzogewotCQkvKgotCQkgKiBUYWtlIHRoZSBpbmZvIGZyb20gdGhyZWFkLT5hcmNoLT5mYXVsdGluZm8sCi0JCSAqIGJ1dCB0cmFuc2ZlciBtYXguIHNpemVvZihzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbykuCi0JCSAqIE9uIGkzODYsIHB0cmFjZV9mYXVsdGluZm8gaXMgc21hbGxlciEKLQkJICovCi0JCXJldCA9IGNvcHlfdG9fdXNlcihwLCAmY2hpbGQtPnRocmVhZC5hcmNoLmZhdWx0aW5mbywKLQkJCQkgICBzaXplb2Yoc3RydWN0IHB0cmFjZV9mYXVsdGluZm8pKSA/Ci0JCQktRUlPIDogMDsKLQkJYnJlYWs7Ci0JfQotCi0jaWZkZWYgUFRSQUNFX0xEVAotCWNhc2UgUFRSQUNFX0xEVDogewotCQlzdHJ1Y3QgcHRyYWNlX2xkdCBsZHQ7Ci0KLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZsZHQsIHAsIHNpemVvZihsZHQpKSkgewotCQkJcmV0ID0gLUVJTzsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyoKLQkJICogVGhpcyBvbmUgaXMgY29uZnVzaW5nLCBzbyBqdXN0IHB1bnQgYW5kIHJldHVybiAtRUlPIGZvcgotCQkgKiBub3cKLQkJICovCi0JCXJldCA9IC1FSU87Ci0JCWJyZWFrOwotCX0KLSNlbmRpZgogCWRlZmF1bHQ6CiAJCXJldCA9IHB0cmFjZV9yZXF1ZXN0KGNoaWxkLCByZXF1ZXN0LCBhZGRyLCBkYXRhKTsKIAkJaWYgKHJldCA9PSAtRUlPKQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvcmVib290LmMgYi9hcmNoL3VtL2tlcm5lbC9yZWJvb3QuYwppbmRleCBjZWQ4OTAzLi45YmRmNjdhIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9yZWJvb3QuYworKysgYi9hcmNoL3VtL2tlcm5lbC9yZWJvb3QuYwpAQCAtMTUsMjggKzE1LDIxIEBACiAKIHN0YXRpYyB2b2lkIGtpbGxfb2ZmX3Byb2Nlc3Nlcyh2b2lkKQogewotCWlmIChwcm9jX21tKQotCQkvKgotCQkgKiBGSVhNRTogbmVlZCB0byBsb29wIG92ZXIgdXNlcnNwYWNlX3BpZHMKLQkJICovCi0JCW9zX2tpbGxfcHRyYWNlZF9wcm9jZXNzKHVzZXJzcGFjZV9waWRbMF0sIDEpOwotCWVsc2UgewotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7Ci0JCWludCBwaWQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCWludCBwaWQ7CiAKLQkJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKLQkJZm9yX2VhY2hfcHJvY2VzcyhwKSB7Ci0JCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQ7CisJcmVhZF9sb2NrKCZ0YXNrbGlzdF9sb2NrKTsKKwlmb3JfZWFjaF9wcm9jZXNzKHApIHsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICp0OwogCi0JCQl0ID0gZmluZF9sb2NrX3Rhc2tfbW0ocCk7Ci0JCQlpZiAoIXQpCi0JCQkJY29udGludWU7Ci0JCQlwaWQgPSB0LT5tbS0+Y29udGV4dC5pZC51LnBpZDsKLQkJCXRhc2tfdW5sb2NrKHQpOwotCQkJb3Nfa2lsbF9wdHJhY2VkX3Byb2Nlc3MocGlkLCAxKTsKLQkJfQotCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CisJCXQgPSBmaW5kX2xvY2tfdGFza19tbShwKTsKKwkJaWYgKCF0KQorCQkJY29udGludWU7CisJCXBpZCA9IHQtPm1tLT5jb250ZXh0LmlkLnUucGlkOworCQl0YXNrX3VubG9jayh0KTsKKwkJb3Nfa2lsbF9wdHJhY2VkX3Byb2Nlc3MocGlkLCAxKTsKIAl9CisJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwogfQogCiB2b2lkIHVtbF9jbGVhbnVwKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jIGIvYXJjaC91bS9rZXJuZWwvc2thcy9tbXUuYwppbmRleCAwMDdkNTUwLi45NGFiZGNjIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9za2FzL21tdS5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvbW11LmMKQEAgLTU0LDM1ICs1NCwyMiBAQAogCXVuc2lnbmVkIGxvbmcgc3RhY2sgPSAwOwogCWludCByZXQgPSAtRU5PTUVNOwogCi0JaWYgKHNrYXNfbmVlZHNfc3R1YikgewotCQlzdGFjayA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQkJaWYgKHN0YWNrID09IDApCi0JCQlnb3RvIG91dDsKLQl9CisJc3RhY2sgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKHN0YWNrID09IDApCisJCWdvdG8gb3V0OwogCiAJdG9fbW0tPmlkLnN0YWNrID0gc3RhY2s7CiAJaWYgKGN1cnJlbnQtPm1tICE9IE5VTEwgJiYgY3VycmVudC0+bW0gIT0gJmluaXRfbW0pCiAJCWZyb21fbW0gPSAmY3VycmVudC0+bW0tPmNvbnRleHQ7CiAKLQlpZiAocHJvY19tbSkgewotCQlyZXQgPSBuZXdfbW0oc3RhY2spOwotCQlpZiAocmV0IDwgMCkgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpbml0X25ld19jb250ZXh0X3NrYXMgLSAiCi0JCQkgICAgICAgIm5ld19tbSBmYWlsZWQsIGVycm5vID0gJWRcbiIsIHJldCk7Ci0JCQlnb3RvIG91dF9mcmVlOwotCQl9Ci0JCXRvX21tLT5pZC51Lm1tX2ZkID0gcmV0OwotCX0KLQllbHNlIHsKLQkJaWYgKGZyb21fbW0pCi0JCQl0b19tbS0+aWQudS5waWQgPSBjb3B5X2NvbnRleHRfc2thczAoc3RhY2ssCi0JCQkJCQkJICAgICBmcm9tX21tLT5pZC51LnBpZCk7Ci0JCWVsc2UgdG9fbW0tPmlkLnUucGlkID0gc3RhcnRfdXNlcnNwYWNlKHN0YWNrKTsKKwlpZiAoZnJvbV9tbSkKKwkJdG9fbW0tPmlkLnUucGlkID0gY29weV9jb250ZXh0X3NrYXMwKHN0YWNrLAorCQkJCQkJICAgICBmcm9tX21tLT5pZC51LnBpZCk7CisJZWxzZSB0b19tbS0+aWQudS5waWQgPSBzdGFydF91c2Vyc3BhY2Uoc3RhY2spOwogCi0JCWlmICh0b19tbS0+aWQudS5waWQgPCAwKSB7Ci0JCQlyZXQgPSB0b19tbS0+aWQudS5waWQ7Ci0JCQlnb3RvIG91dF9mcmVlOwotCQl9CisJaWYgKHRvX21tLT5pZC51LnBpZCA8IDApIHsKKwkJcmV0ID0gdG9fbW0tPmlkLnUucGlkOworCQlnb3RvIG91dF9mcmVlOwogCX0KIAogCXJldCA9IGluaXRfbmV3X2xkdCh0b19tbSwgZnJvbV9tbSk7CkBAIC0xMDUsOSArOTIsNiBAQAogewogCWludCBlcnIsIHJldDsKIAotCWlmICghc2thc19uZWVkc19zdHViKQotCQlyZXR1cm47Ci0KIAlyZXQgPSBpbml0X3N0dWJfcHRlKG1tLCBTVFVCX0NPREUsCiAJCQkgICAgKHVuc2lnbmVkIGxvbmcpICZfX3N5c2NhbGxfc3R1Yl9zdGFydCk7CiAJaWYgKHJldCkKQEAgLTE1NCwyNSArMTM4LDE5IEBACiB7CiAJc3RydWN0IG1tX2NvbnRleHQgKm1tdSA9ICZtbS0+Y29udGV4dDsKIAotCWlmIChwcm9jX21tKQotCQlvc19jbG9zZV9maWxlKG1tdS0+aWQudS5tbV9mZCk7Ci0JZWxzZSB7Ci0JCS8qCi0JCSAqIElmIGluaXRfbmV3X2NvbnRleHQgd2Fzbid0IGNhbGxlZCwgdGhpcyB3aWxsIGJlCi0JCSAqIHplcm8sIHJlc3VsdGluZyBpbiBhIGtpbGwoMCksIHdoaWNoIHdpbGwgcmVzdWx0IGluIHRoZQotCQkgKiB3aG9sZSBVTUwgc3VkZGVubHkgZHlpbmcuICBBbHNvLCBjb3ZlciBuZWdhdGl2ZSBhbmQKLQkJICogMSBjYXNlcywgc2luY2UgdGhleSBzaG91bGRuJ3QgaGFwcGVuIGVpdGhlci4KLQkJICovCi0JCWlmIChtbXUtPmlkLnUucGlkIDwgMikgewotCQkJcHJpbnRrKEtFUk5fRVJSICJjb3JydXB0IG1tX2NvbnRleHQgLSBwaWQgPSAlZFxuIiwKLQkJCSAgICAgICBtbXUtPmlkLnUucGlkKTsKLQkJCXJldHVybjsKLQkJfQotCQlvc19raWxsX3B0cmFjZWRfcHJvY2VzcyhtbXUtPmlkLnUucGlkLCAxKTsKKwkvKgorCSAqIElmIGluaXRfbmV3X2NvbnRleHQgd2Fzbid0IGNhbGxlZCwgdGhpcyB3aWxsIGJlCisJICogemVybywgcmVzdWx0aW5nIGluIGEga2lsbCgwKSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gdGhlCisJICogd2hvbGUgVU1MIHN1ZGRlbmx5IGR5aW5nLiAgQWxzbywgY292ZXIgbmVnYXRpdmUgYW5kCisJICogMSBjYXNlcywgc2luY2UgdGhleSBzaG91bGRuJ3QgaGFwcGVuIGVpdGhlci4KKwkgKi8KKwlpZiAobW11LT5pZC51LnBpZCA8IDIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjb3JydXB0IG1tX2NvbnRleHQgLSBwaWQgPSAlZFxuIiwKKwkJICAgICAgIG1tdS0+aWQudS5waWQpOworCQlyZXR1cm47CiAJfQorCW9zX2tpbGxfcHRyYWNlZF9wcm9jZXNzKG1tdS0+aWQudS5waWQsIDEpOwogCi0JaWYgKHNrYXNfbmVlZHNfc3R1YikKLQkJZnJlZV9wYWdlKG1tdS0+aWQuc3RhY2spOwotCisJZnJlZV9wYWdlKG1tdS0+aWQuc3RhY2spOwogCWZyZWVfbGR0KG1tdSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9za2FzL3Byb2Nlc3MuYyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCmluZGV4IDRkYTExYjMuLjUyN2ZhNTggMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdW0va2VybmVsL3NrYXMvcHJvY2Vzcy5jCkBAIC0xMCwyNSArMTAsNiBAQAogI2luY2x1ZGUgPG9zLmg+CiAjaW5jbHVkZSA8c2thcy5oPgogCi1pbnQgbmV3X21tKHVuc2lnbmVkIGxvbmcgc3RhY2spCi17Ci0JaW50IGZkLCBlcnI7Ci0KLQlmZCA9IG9zX29wZW5fZmlsZSgiL3Byb2MvbW0iLCBvZl9jbG9leGVjKG9mX3dyaXRlKE9QRU5GTEFHUygpKSksIDApOwotCWlmIChmZCA8IDApCi0JCXJldHVybiBmZDsKLQotCWlmIChza2FzX25lZWRzX3N0dWIpIHsKLQkJZXJyID0gbWFwX3N0dWJfcGFnZXMoZmQsIFNUVUJfQ09ERSwgU1RVQl9EQVRBLCBzdGFjayk7Ci0JCWlmIChlcnIpIHsKLQkJCW9zX2Nsb3NlX2ZpbGUoZmQpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KLQotCXJldHVybiBmZDsKLX0KLQogZXh0ZXJuIHZvaWQgc3RhcnRfa2VybmVsKHZvaWQpOwogCiBzdGF0aWMgaW50IF9faW5pdCBzdGFydF9rZXJuZWxfcHJvYyh2b2lkICp1bnVzZWQpCkBAIC00MCw5ICsyMSw3IEBACiAKIAljcHVfdGFza3NbMF0ucGlkID0gcGlkOwogCWNwdV90YXNrc1swXS50YXNrID0gY3VycmVudDsKLSNpZmRlZiBDT05GSUdfU01QCi0JaW5pdF9jcHVfb25saW5lKGdldF9jcHVfbWFzaygwKSk7Ci0jZW5kaWYKKwogCXN0YXJ0X2tlcm5lbCgpOwogCXJldHVybiAwOwogfQpAQCAtNTUsMTQgKzM0LDYgQEAKIHsKIAlzdGFja19wcm90ZWN0aW9ucygodW5zaWduZWQgbG9uZykgJmNwdTBfaXJxc3RhY2spOwogCXNldF9zaWdzdGFjayhjcHUwX2lycXN0YWNrLCBUSFJFQURfU0laRSk7Ci0JaWYgKHByb2NfbW0pIHsKLQkJdXNlcnNwYWNlX3BpZFswXSA9IHN0YXJ0X3VzZXJzcGFjZSgwKTsKLQkJaWYgKHVzZXJzcGFjZV9waWRbMF0gPCAwKSB7Ci0JCQlwcmludGYoInN0YXJ0X3VtbCAtIHN0YXJ0X3VzZXJzcGFjZSByZXR1cm5lZCAlZFxuIiwKLQkJCSAgICAgICB1c2Vyc3BhY2VfcGlkWzBdKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQl9CiAKIAlpbml0X25ld190aHJlYWRfc2lnbmFscygpOwogCmRpZmYgLS1naXQgYS9hcmNoL3VtL2tlcm5lbC9zbXAuYyBiL2FyY2gvdW0va2VybmVsL3NtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzhjM2VhLi4wMDAwMDAwCi0tLSBhL2FyY2gvdW0va2VybmVsL3NtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgLSAyMDA3IEplZmYgRGlrZSAoamRpa2VAe2FkZHRvaXQsbGludXguaW50ZWx9LmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+Ci0jaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KLSNpbmNsdWRlIDxhc20vdGxiLmg+Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnIuaD4KLSNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3NtcC5oPgotI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxhc20vc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxrZXJuLmg+Ci0jaW5jbHVkZSA8aXJxX3VzZXIuaD4KLSNpbmNsdWRlIDxvcy5oPgotCi0vKiBQZXIgQ1BVIGJvZ29taXBzIGFuZCBvdGhlciBwYXJhbWV0ZXJzCi0gKiBUaGUgb25seSBwaWVjZSB1c2VkIGhlcmUgaXMgdGhlIGlwaSBwaXBlLCB3aGljaCBpcyBzZXQgYmVmb3JlIFNNUCBpcwotICogc3RhcnRlZCBhbmQgbmV2ZXIgY2hhbmdlZC4KLSAqLwotc3RydWN0IGNwdWluZm9fdW0gY3B1X2RhdGFbTlJfQ1BVU107Ci0KLS8qIEEgc3RhdGlzdGljLCBjYW4gYmUgYSBsaXR0bGUgb2ZmICovCi1pbnQgbnVtX3Jlc2NoZWR1bGVzX3NlbnQgPSAwOwotCi0vKiBOb3QgY2hhbmdlZCBhZnRlciBib290ICovCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGVfdGhyZWFkc1tOUl9DUFVTXTsKLQotdm9pZCBzbXBfc2VuZF9yZXNjaGVkdWxlKGludCBjcHUpCi17Ci0Jb3Nfd3JpdGVfZmlsZShjcHVfZGF0YVtjcHVdLmlwaV9waXBlWzFdLCAiUiIsIDEpOwotCW51bV9yZXNjaGVkdWxlc19zZW50Kys7Ci19Ci0KLXZvaWQgc21wX3NlbmRfc3RvcCh2b2lkKQotewotCWludCBpOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiU3RvcHBpbmcgYWxsIENQVXMuLi4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX29ubGluZV9jcHVzKCk7IGkrKykgewotCQlpZiAoaSA9PSBjdXJyZW50X3RocmVhZC0+Y3B1KQotCQkJY29udGludWU7Ci0JCW9zX3dyaXRlX2ZpbGUoY3B1X2RhdGFbaV0uaXBpX3BpcGVbMV0sICJTIiwgMSk7Ci0JfQotCXByaW50ayhLRVJOX0NPTlQgImRvbmVcbiIpOwotfQotCi1zdGF0aWMgY3B1bWFza190IHNtcF9jb21tZW5jZWRfbWFzayA9IENQVV9NQVNLX05PTkU7Ci1zdGF0aWMgY3B1bWFza190IGNwdV9jYWxsaW5fbWFwID0gQ1BVX01BU0tfTk9ORTsKLQotc3RhdGljIGludCBpZGxlX3Byb2Modm9pZCAqY3B1cCkKLXsKLQlpbnQgY3B1ID0gKGludCkgY3B1cCwgZXJyOwotCi0JZXJyID0gb3NfcGlwZShjcHVfZGF0YVtjcHVdLmlwaV9waXBlLCAxLCAxKTsKLQlpZiAoZXJyIDwgMCkKLQkJcGFuaWMoIkNQVSMlZCBmYWlsZWQgdG8gY3JlYXRlIElQSSBwaXBlLCBlcnIgPSAlZCIsIGNwdSwgLWVycik7Ci0KLQlvc19zZXRfZmRfYXN5bmMoY3B1X2RhdGFbY3B1XS5pcGlfcGlwZVswXSk7Ci0KLQl3bWIoKTsKLQlpZiAoY3B1X3Rlc3RfYW5kX3NldChjcHUsIGNwdV9jYWxsaW5fbWFwKSkgewotCQlwcmludGsoS0VSTl9FUlIgImh1aCwgQ1BVIyVkIGFscmVhZHkgcHJlc2VudD8/XG4iLCBjcHUpOwotCQlCVUcoKTsKLQl9Ci0KLQl3aGlsZSAoIWNwdV9pc3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzaykpCi0JCWNwdV9yZWxheCgpOwotCi0Jbm90aWZ5X2NwdV9zdGFydGluZyhjcHUpOwotCXNldF9jcHVfb25saW5lKGNwdSwgdHJ1ZSk7Ci0JZGVmYXVsdF9pZGxlKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGVfdGhyZWFkKGludCBjcHUpCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICpuZXdfdGFzazsKLQotCWN1cnJlbnQtPnRocmVhZC5yZXF1ZXN0LnUudGhyZWFkLnByb2MgPSBpZGxlX3Byb2M7Ci0JY3VycmVudC0+dGhyZWFkLnJlcXVlc3QudS50aHJlYWQuYXJnID0gKHZvaWQgKikgY3B1OwotCW5ld190YXNrID0gZm9ya19pZGxlKGNwdSk7Ci0JaWYgKElTX0VSUihuZXdfdGFzaykpCi0JCXBhbmljKCJjb3B5X3Byb2Nlc3MgZmFpbGVkIGluIGlkbGVfdGhyZWFkLCBlcnJvciA9ICVsZCIsCi0JCSAgICAgIFBUUl9FUlIobmV3X3Rhc2spKTsKLQotCWNwdV90YXNrc1tjcHVdID0gKChzdHJ1Y3QgY3B1X3Rhc2spCi0JCSAgICAgICAgICB7IC5waWQgPSAJbmV3X3Rhc2stPnRocmVhZC5tb2RlLnR0LmV4dGVybl9waWQsCi0JCQkgICAgLnRhc2sgPSAJbmV3X3Rhc2sgfSApOwotCWlkbGVfdGhyZWFkc1tjcHVdID0gbmV3X3Rhc2s7Ci0JcGFuaWMoInNrYXMgbW9kZSBkb2Vzbid0IHN1cHBvcnQgU01QIik7Ci0JcmV0dXJuIG5ld190YXNrOwotfQotCi12b2lkIHNtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heGNwdXMpCi17Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOwotCXVuc2lnbmVkIGxvbmcgd2FpdHRpbWU7Ci0JaW50IGVyciwgY3B1LCBtZSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBuY3B1czsgKytpKQotCQlzZXRfY3B1X3Bvc3NpYmxlKGksIHRydWUpOwotCi0Jc2V0X2NwdV9vbmxpbmUobWUsIHRydWUpOwotCWNwdV9zZXQobWUsIGNwdV9jYWxsaW5fbWFwKTsKLQotCWVyciA9IG9zX3BpcGUoY3B1X2RhdGFbbWVdLmlwaV9waXBlLCAxLCAxKTsKLQlpZiAoZXJyIDwgMCkKLQkJcGFuaWMoIkNQVSMwIGZhaWxlZCB0byBjcmVhdGUgSVBJIHBpcGUsIGVycm5vID0gJWQiLCAtZXJyKTsKLQotCW9zX3NldF9mZF9hc3luYyhjcHVfZGF0YVttZV0uaXBpX3BpcGVbMF0pOwotCi0JZm9yIChjcHUgPSAxOyBjcHUgPCBuY3B1czsgY3B1KyspIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQm9vdGluZyBwcm9jZXNzb3IgJWQuLi5cbiIsIGNwdSk7Ci0KLQkJaWRsZSA9IGlkbGVfdGhyZWFkKGNwdSk7Ci0KLQkJaW5pdF9pZGxlKGlkbGUsIGNwdSk7Ci0KLQkJd2FpdHRpbWUgPSAyMDAwMDAwMDA7Ci0JCXdoaWxlICh3YWl0dGltZS0tICYmICFjcHVfaXNzZXQoY3B1LCBjcHVfY2FsbGluX21hcCkpCi0JCQljcHVfcmVsYXgoKTsKLQotCQlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwKLQkJICAgICAgIGNwdV9pc3NldChjcHUsIGNwdV9jYWxsaW5nX21hcCkgPyAiZG9uZSIgOiAiZmFpbGVkIik7Ci0JfQotfQotCi12b2lkIHNtcF9wcmVwYXJlX2Jvb3RfY3B1KHZvaWQpCi17Ci0Jc2V0X2NwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpLCB0cnVlKTsKLX0KLQotaW50IF9fY3B1X3VwKHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGlkbGUpCi17Ci0JY3B1X3NldChjcHUsIHNtcF9jb21tZW5jZWRfbWFzayk7Ci0Jd2hpbGUgKCFjcHVfb25saW5lKGNwdSkpCi0JCW1iKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCi17Ci0JcHJpbnRrKEtFUk5fSU5GTyAic2V0dXBfcHJvZmlsaW5nX3RpbWVyXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBzbXBfY2FsbF9mdW5jdGlvbl9zbGF2ZShpbnQgY3B1KTsKLQotdm9pZCBJUElfaGFuZGxlcihpbnQgY3B1KQotewotCXVuc2lnbmVkIGNoYXIgYzsKLQlpbnQgZmQ7Ci0KLQlmZCA9IGNwdV9kYXRhW2NwdV0uaXBpX3BpcGVbMF07Ci0Jd2hpbGUgKG9zX3JlYWRfZmlsZShmZCwgJmMsIDEpID09IDEpIHsKLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgJ0MnOgotCQkJc21wX2NhbGxfZnVuY3Rpb25fc2xhdmUoY3B1KTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgJ1InOgotCQkJc2NoZWR1bGVyX2lwaSgpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnUyc6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJDUFUjJWQgc3RvcHBpbmdcbiIsIGNwdSk7Ci0JCQl3aGlsZSAoMSkKLQkJCQlwYXVzZSgpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiAiQ1BVIyVkIHJlY2VpdmVkIHVua25vd24gSVBJIFslY10hXG4iLAotCQkJICAgICAgIGNwdSwgYyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotaW50IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCh2b2lkKQotewotCXJldHVybiBwaWRfdG9fcHJvY2Vzc29yX2lkKG9zX2dldHBpZCgpKTsKLX0KLQotc3RhdGljIERFRklORV9TUElOTE9DSyhjYWxsX2xvY2spOwotc3RhdGljIGF0b21pY190IHNjZl9zdGFydGVkOwotc3RhdGljIGF0b21pY190IHNjZl9maW5pc2hlZDsKLXN0YXRpYyB2b2lkICgqZnVuYykodm9pZCAqaW5mbyk7Ci1zdGF0aWMgdm9pZCAqaW5mbzsKLQotdm9pZCBzbXBfY2FsbF9mdW5jdGlvbl9zbGF2ZShpbnQgY3B1KQotewotCWF0b21pY19pbmMoJnNjZl9zdGFydGVkKTsKLQkoKmZ1bmMpKGluZm8pOwotCWF0b21pY19pbmMoJnNjZl9maW5pc2hlZCk7Ci19Ci0KLWludCBzbXBfY2FsbF9mdW5jdGlvbih2b2lkICgqX2Z1bmMpKHZvaWQgKmluZm8pLCB2b2lkICpfaW5mbywgaW50IHdhaXQpCi17Ci0JaW50IGNwdXMgPSBudW1fb25saW5lX2NwdXMoKSAtIDE7Ci0JaW50IGk7Ci0KLQlpZiAoIWNwdXMpCi0JCXJldHVybiAwOwotCi0JLyogQ2FuIGRlYWRsb2NrIHdoZW4gY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAqLwotCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKLQotCXNwaW5fbG9ja19iaCgmY2FsbF9sb2NrKTsKLQlhdG9taWNfc2V0KCZzY2Zfc3RhcnRlZCwgMCk7Ci0JYXRvbWljX3NldCgmc2NmX2ZpbmlzaGVkLCAwKTsKLQlmdW5jID0gX2Z1bmM7Ci0JaW5mbyA9IF9pbmZvOwotCi0JZm9yX2VhY2hfb25saW5lX2NwdShpKQotCQlvc193cml0ZV9maWxlKGNwdV9kYXRhW2ldLmlwaV9waXBlWzFdLCAiQyIsIDEpOwotCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZzY2Zfc3RhcnRlZCkgIT0gY3B1cykKLQkJYmFycmllcigpOwotCi0JaWYgKHdhaXQpCi0JCXdoaWxlIChhdG9taWNfcmVhZCgmc2NmX2ZpbmlzaGVkKSAhPSBjcHVzKQotCQkJYmFycmllcigpOwotCi0Jc3Bpbl91bmxvY2tfYmgoJmNhbGxfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvc3lzcnEuYyBiL2FyY2gvdW0va2VybmVsL3N5c3JxLmMKaW5kZXggODk0YzhkMy4uYWExYjU2ZiAxMDA2NDQKLS0tIGEvYXJjaC91bS9rZXJuZWwvc3lzcnEuYworKysgYi9hcmNoL3VtL2tlcm5lbC9zeXNycS5jCkBAIC0yOSw3ICsyOSw3IEBACiAKIHZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKnN0YWNrKQogewotCXVuc2lnbmVkIGxvbmcgKnNwID0gc3RhY2ssIGJwID0gMDsKKwl1bnNpZ25lZCBsb25nICpzcCA9IHN0YWNrOwogCXN0cnVjdCBwdF9yZWdzICpzZWd2X3JlZ3MgPSBjdXJyZW50LT50aHJlYWQuc2Vndl9yZWdzOwogCWludCBpOwogCkBAIC0zOSwxMCArMzksNiBAQAogCQlyZXR1cm47CiAJfQogCi0jaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKLQlicCA9IGdldF9mcmFtZV9wb2ludGVyKHRhc2ssIHNlZ3ZfcmVncyk7Ci0jZW5kaWYKLQogCWlmICghc3RhY2spCiAJCXNwID0gZ2V0X3N0YWNrX3BvaW50ZXIodGFzaywgc2Vndl9yZWdzKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdHJhcC5jIGIvYXJjaC91bS9rZXJuZWwvdHJhcC5jCmluZGV4IDIwOTYxNzMuLjhlNGRhZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3RyYXAuYworKysgYi9hcmNoL3VtL2tlcm5lbC90cmFwLmMKQEAgLTIyMCw3ICsyMjAsNyBAQAogCQlwYW5pYygiU2VnZmF1bHQgd2l0aCBubyBtbSIpOwogCX0KIAotCWlmIChTRUdWX0lTX0ZJWEFCTEUoJmZpKSB8fCBTRUdWX01BWUJFX0ZJWEFCTEUoJmZpKSkKKwlpZiAoU0VHVl9JU19GSVhBQkxFKCZmaSkpCiAJCWVyciA9IGhhbmRsZV9wYWdlX2ZhdWx0KGFkZHJlc3MsIGlwLCBpc193cml0ZSwgaXNfdXNlciwKIAkJCQkJJnNpLnNpX2NvZGUpOwogCWVsc2UgewpkaWZmIC0tZ2l0IGEvYXJjaC91bS9rZXJuZWwvdW1fYXJjaC5jIGIvYXJjaC91bS9rZXJuZWwvdW1fYXJjaC5jCmluZGV4IDkyNzRlYWUuLjA3Zjc5OGYgMTAwNjQ0Ci0tLSBhL2FyY2gvdW0va2VybmVsL3VtX2FyY2guYworKysgYi9hcmNoL3VtL2tlcm5lbC91bV9hcmNoLmMKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rbXNnX2R1bXAuaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KQEAgLTY2LDEyICs2Nyw2IEBACiB7CiAJaW50IGluZGV4ID0gMDsKIAotI2lmZGVmIENPTkZJR19TTVAKLQlpbmRleCA9IChzdHJ1Y3QgY3B1aW5mb191bSAqKSB2IC0gY3B1X2RhdGE7Ci0JaWYgKCFjcHVfb25saW5lKGluZGV4KSkKLQkJcmV0dXJuIDA7Ci0jZW5kaWYKLQogCXNlcV9wcmludGYobSwgInByb2Nlc3Nvclx0OiAlZFxuIiwgaW5kZXgpOwogCXNlcV9wcmludGYobSwgInZlbmRvcl9pZFx0OiBVc2VyIE1vZGUgTGludXhcbiIpOwogCXNlcV9wcmludGYobSwgIm1vZGVsIG5hbWVcdDogVU1MXG4iKTsKQEAgLTE2OCwyMyArMTYzLDYgQEAKICIgICAgdGhpcyBmbGFnIGlzIG5vdCBuZWVkZWQgdG8gcnVuIGdkYiBvbiBVTUwgaW4gc2thcyBtb2RlXG5cbiIKICk7CiAKLSNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgaW50IF9faW5pdCB1bWxfbmNwdXNfc2V0dXAoY2hhciAqbGluZSwgaW50ICphZGQpCi17Ci0JaWYgKCFzc2NhbmYobGluZSwgIiVkIiwgJm5jcHVzKSkgewotCQlwcmludGYoIkNvdWxkbid0IHBhcnNlIFslc11cbiIsIGxpbmUpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLV9fdW1sX3NldHVwKCJuY3B1cz0iLCB1bWxfbmNwdXNfc2V0dXAsCi0ibmNwdXM9PCMgb2YgZGVzaXJlZCBDUFVzPlxuIgotIiAgICBUaGlzIHRlbGxzIGFuIFNNUCBrZXJuZWwgaG93IG1hbnkgdmlydHVhbCBwcm9jZXNzb3JzIHRvIHN0YXJ0LlxuXG4iCi0pOwotI2VuZGlmCi0KIHN0YXRpYyBpbnQgX19pbml0IFVzYWdlKGNoYXIgKmxpbmUsIGludCAqYWRkKQogewogCWNvbnN0IGNoYXIgKipwOwpAQCAtMjM0LDYgKzIxMiw3IEBACiBzdGF0aWMgaW50IHBhbmljX2V4aXQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLCB1bnNpZ25lZCBsb25nIHVudXNlZDEsCiAJCSAgICAgIHZvaWQgKnVudXNlZDIpCiB7CisJa21zZ19kdW1wKEtNU0dfRFVNUF9QQU5JQyk7CiAJYnVzdF9zcGlubG9ja3MoMSk7CiAJYnVzdF9zcGlubG9ja3MoMCk7CiAJdW1sX2V4aXRjb2RlID0gMTsKQEAgLTI0Nyw2ICsyMjYsMTYgQEAKIAkucHJpb3JpdHkgCQk9IDAKIH07CiAKK3ZvaWQgdW1sX2ZpbmlzaHNldHVwKHZvaWQpCit7CisJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LAorCQkJCSAgICAgICAmcGFuaWNfZXhpdF9ub3RpZmllcik7CisKKwl1bWxfcG9zdHNldHVwKCk7CisKKwluZXdfdGhyZWFkX2hhbmRsZXIoKTsKK30KKwogLyogU2V0IGR1cmluZyBlYXJseSBib290ICovCiB1bnNpZ25lZCBsb25nIHRhc2tfc2l6ZTsKIEVYUE9SVF9TWU1CT0wodGFza19zaXplKTsKQEAgLTI2OCw3ICsyNTcsNiBAQAogCXVuc2lnbmVkIGxvbmcgc3RhY2s7CiAJdW5zaWduZWQgaW50IGk7CiAJaW50IGFkZDsKLQljaGFyICogbW9kZTsKIAogCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKIAkJaWYgKChpID09IDEpICYmIChhcmd2W2ldWzBdID09ICcgJykpCkBAIC0yOTEsMTUgKzI3OSw2IEBACiAJLyogT1Mgc2FuaXR5IGNoZWNrcyB0aGF0IG5lZWQgdG8gaGFwcGVuIGJlZm9yZSB0aGUga2VybmVsIHJ1bnMgKi8KIAlvc19lYXJseV9jaGVja3MoKTsKIAotCWNhbl9kb19za2FzKCk7Ci0KLQlpZiAocHJvY19tbSAmJiBwdHJhY2VfZmF1bHRpbmZvKQotCQltb2RlID0gIlNLQVMzIjsKLQllbHNlCi0JCW1vZGUgPSAiU0tBUzAiOwotCi0JcHJpbnRmKCJVTUwgcnVubmluZyBpbiAlcyBtb2RlXG4iLCBtb2RlKTsKLQogCWJya19zdGFydCA9ICh1bnNpZ25lZCBsb25nKSBzYnJrKDApOwogCiAJLyoKQEAgLTMzNCwxMSArMzEzLDYgQEAKIAlpZiAocGh5c21lbV9zaXplICsgaW9tZW1fc2l6ZSA+IG1heF9waHlzbWVtKSB7CiAJCWhpZ2htZW0gPSBwaHlzbWVtX3NpemUgKyBpb21lbV9zaXplIC0gbWF4X3BoeXNtZW07CiAJCXBoeXNtZW1fc2l6ZSAtPSBoaWdobWVtOwotI2lmbmRlZiBDT05GSUdfSElHSE1FTQotCQloaWdobWVtID0gMDsKLQkJcHJpbnRmKCJDT05GSUdfSElHSE1FTSBub3QgZW5hYmxlZCAtIHBoeXNpY2FsIG1lbW9yeSBzaHJ1bmsgIgotCQkgICAgICAgInRvICVMdSBieXRlc1xuIiwgcGh5c21lbV9zaXplKTsKLSNlbmRpZgogCX0KIAogCWhpZ2hfcGh5c21lbSA9IHVtbF9waHlzbWVtICsgcGh5c21lbV9zaXplOwpAQCAtMzYyLDExICszMzYsNiBAQAogCQlwcmludGYoIktlcm5lbCB2aXJ0dWFsIG1lbW9yeSBzaXplIHNocnVuayB0byAlbHUgYnl0ZXNcbiIsCiAJCSAgICAgICB2aXJ0bWVtX3NpemUpOwogCi0JYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LAotCQkJCSAgICAgICAmcGFuaWNfZXhpdF9ub3RpZmllcik7Ci0KLQl1bWxfcG9zdHNldHVwKCk7Ci0KIAlzdGFja19wcm90ZWN0aW9ucygodW5zaWduZWQgbG9uZykgJmluaXRfdGhyZWFkX2luZm8pOwogCW9zX2ZsdXNoX3N0ZG91dCgpOwogCkBAIC0zOTAsMTUgKzM1OSwzIEBACiB2b2lkIGFwcGx5X2FsdGVybmF0aXZlcyhzdHJ1Y3QgYWx0X2luc3RyICpzdGFydCwgc3RydWN0IGFsdF9pbnN0ciAqZW5kKQogewogfQotCi0jaWZkZWYgQ09ORklHX1NNUAotdm9pZCBhbHRlcm5hdGl2ZXNfc21wX21vZHVsZV9hZGQoc3RydWN0IG1vZHVsZSAqbW9kLCBjaGFyICpuYW1lLAotCQkJCSB2b2lkICpsb2Nrcywgdm9pZCAqbG9ja3NfZW5kLAotCQkJCSB2b2lkICp0ZXh0LCAgdm9pZCAqdGV4dF9lbmQpCi17Ci19Ci0KLXZvaWQgYWx0ZXJuYXRpdmVzX3NtcF9tb2R1bGVfZGVsKHN0cnVjdCBtb2R1bGUgKm1vZCkKLXsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9wcm9jZXNzLmMgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwppbmRleCAzMzQ5NmZlLi44NDA4YWJhIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3Byb2Nlc3MuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPGluaXQuaD4KICNpbmNsdWRlIDxsb25nam1wLmg+CiAjaW5jbHVkZSA8b3MuaD4KLSNpbmNsdWRlIDxza2FzX3B0cmFjZS5oPgogCiAjZGVmaW5lIEFSQklUUkFSWV9BRERSIC0xCiAjZGVmaW5lIEZBSUxVUkVfUElEICAgIC0xCkBAIC0xMDIsMjEgKzEwMSw2IEBACiAJCUNBVENIX0VJTlRSKHdhaXRwaWQocGlkLCBOVUxMLCBfX1dBTEwpKTsKIH0KIAotLyogVGhpcyBpcyBoZXJlIHVuaXF1ZWx5IHRvIGhhdmUgYWNjZXNzIHRvIHRoZSB1c2Vyc3BhY2UgZXJybm8sIGkuZS4gdGhlIG9uZQotICogdXNlZCBieSBwdHJhY2UgaW4gY2FzZSBvZiBlcnJvci4KLSAqLwotCi1sb25nIG9zX3B0cmFjZV9sZHQobG9uZyBwaWQsIGxvbmcgYWRkciwgbG9uZyBkYXRhKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBwdHJhY2UoUFRSQUNFX0xEVCwgcGlkLCBhZGRyLCBkYXRhKTsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLWVycm5vOwotCXJldHVybiByZXQ7Ci19Ci0KIC8qIEtpbGwgb2ZmIGEgcHRyYWNlZCBjaGlsZCBieSBhbGwgbWVhbnMgYXZhaWxhYmxlLiAga2lsbCBpdCBub3JtYWxseSBmaXJzdCwKICAqIHRoZW4gUFRSQUNFX0tJTEwgaXQsIHRoZW4gUFRSQUNFX0NPTlQgaXQgaW4gY2FzZSBpdCdzIGluIGEgcnVuIHN0YXRlIGZyb20KICAqIHdoaWNoIGl0IGNhbid0IGV4aXQgZGlyZWN0bHkuCmRpZmYgLS1naXQgYS9hcmNoL3VtL29zLUxpbnV4L3NrYXMvbWVtLmMgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvbWVtLmMKaW5kZXggNjg5YjE4ZC4uZTdmOGM5NCAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9za2FzL21lbS5jCisrKyBiL2FyY2gvdW0vb3MtTGludXgvc2thcy9tZW0uYwpAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgPGFzLWxheW91dC5oPgogI2luY2x1ZGUgPG1tX2lkLmg+CiAjaW5jbHVkZSA8b3MuaD4KLSNpbmNsdWRlIDxwcm9jX21tLmg+CiAjaW5jbHVkZSA8cHRyYWNlX3VzZXIuaD4KICNpbmNsdWRlIDxyZWdpc3RlcnMuaD4KICNpbmNsdWRlIDxza2FzLmg+CkBAIC00Niw4ICs0NSw2IEBACiAKIF9faW5pdGNhbGwoaW5pdF9zeXNjYWxsX3JlZ3MpOwogCi1leHRlcm4gaW50IHByb2NfbW07Ci0KIHN0YXRpYyBpbmxpbmUgbG9uZyBkb19zeXNjYWxsX3N0dWIoc3RydWN0IG1tX2lkICogbW1faWRwLCB2b2lkICoqYWRkcikKIHsKIAlpbnQgbiwgaTsKQEAgLTU2LDEwICs1Myw2IEBACiAJdW5zaWduZWQgbG9uZyAqIHN5c2NhbGw7CiAJaW50IGVyciwgcGlkID0gbW1faWRwLT51LnBpZDsKIAotCWlmIChwcm9jX21tKQotCQkvKiBGSVhNRTogTmVlZCB0byBsb29rIHVwIHVzZXJzcGFjZV9waWQgYnkgY3B1ICovCi0JCXBpZCA9IHVzZXJzcGFjZV9waWRbMF07Ci0KIAluID0gcHRyYWNlX3NldHJlZ3MocGlkLCBzeXNjYWxsX3JlZ3MpOwogCWlmIChuIDwgMCkgewogCQlwcmludGsoVU1fS0VSTl9FUlIgIlJlZ2lzdGVycyAtIFxuIik7CkBAIC0xNzgsMzggKzE3MSwxMiBAQAogCWludCBwaHlzX2ZkLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCBpbnQgZG9uZSwgdm9pZCAqKmRhdGEpCiB7CiAJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgdmlydCwgbGVuLCBwcm90LAorCQkJCSBNQVBfU0hBUkVEIHwgTUFQX0ZJWEVELCBwaHlzX2ZkLAorCQkJCSBNTUFQX09GRlNFVChvZmZzZXQpIH07CiAKLQlpZiAocHJvY19tbSkgewotCQlzdHJ1Y3QgcHJvY19tbV9vcCBtYXA7Ci0JCWludCBmZCA9IG1tX2lkcC0+dS5tbV9mZDsKLQotCQltYXAgPSAoKHN0cnVjdCBwcm9jX21tX29wKSB7IC5vcAk9IE1NX01NQVAsCi0JCQkJICAgICAgIC51CQk9Ci0JCQkJICAgICAgIHsgLm1tYXAJPQotCQkJCQkgeyAuYWRkcgk9IHZpcnQsCi0JCQkJCSAgIC5sZW4JPSBsZW4sCi0JCQkJCSAgIC5wcm90CT0gcHJvdCwKLQkJCQkJICAgLmZsYWdzCT0gTUFQX1NIQVJFRCB8Ci0JCQkJCSAgIE1BUF9GSVhFRCwKLQkJCQkJICAgLmZkCT0gcGh5c19mZCwKLQkJCQkJICAgLm9mZnNldD0gb2Zmc2V0Ci0JCQkJCSB9IH0gfSApOwotCQlDQVRDSF9FSU5UUihyZXQgPSB3cml0ZShmZCwgJm1hcCwgc2l6ZW9mKG1hcCkpKTsKLQkJaWYgKHJldCAhPSBzaXplb2YobWFwKSkgewotCQkJcmV0ID0gLWVycm5vOwotCQkJcHJpbnRrKFVNX0tFUk5fRVJSICJtYXAgOiAvcHJvYy9tbSBtYXAgZmFpbGVkLCAiCi0JCQkgICAgICAgImVyciA9ICVkXG4iLCAtcmV0KTsKLQkJfQotCQllbHNlIHJldCA9IDA7Ci0JfQotCWVsc2UgewotCQl1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgdmlydCwgbGVuLCBwcm90LAotCQkJCQkgTUFQX1NIQVJFRCB8IE1BUF9GSVhFRCwgcGh5c19mZCwKLQkJCQkJIE1NQVBfT0ZGU0VUKG9mZnNldCkgfTsKLQotCQlyZXQgPSBydW5fc3lzY2FsbF9zdHViKG1tX2lkcCwgU1RVQl9NTUFQX05SLCBhcmdzLCB2aXJ0LAotCQkJCSAgICAgICBkYXRhLCBkb25lKTsKLQl9CisJcmV0ID0gcnVuX3N5c2NhbGxfc3R1YihtbV9pZHAsIFNUVUJfTU1BUF9OUiwgYXJncywgdmlydCwKKwkJCSAgICAgICBkYXRhLCBkb25lKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMTgsMzIgKzE4NSwxMSBAQAogCSAgaW50IGRvbmUsIHZvaWQgKipkYXRhKQogewogCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBhcmdzW10gPSB7ICh1bnNpZ25lZCBsb25nKSBhZGRyLCBsZW4sIDAsIDAsIDAsCisJCQkJIDAgfTsKIAotCWlmIChwcm9jX21tKSB7Ci0JCXN0cnVjdCBwcm9jX21tX29wIHVubWFwOwotCQlpbnQgZmQgPSBtbV9pZHAtPnUubW1fZmQ7Ci0KLQkJdW5tYXAgPSAoKHN0cnVjdCBwcm9jX21tX29wKSB7IC5vcAk9IE1NX01VTk1BUCwKLQkJCQkJIC51CT0KLQkJCQkJIHsgLm11bm1hcAk9Ci0JCQkJCSAgIHsgLmFkZHIJPQotCQkJCQkgICAgICh1bnNpZ25lZCBsb25nKSBhZGRyLAotCQkJCQkgICAgIC5sZW4JCT0gbGVuIH0gfSB9ICk7Ci0JCUNBVENIX0VJTlRSKHJldCA9IHdyaXRlKGZkLCAmdW5tYXAsIHNpemVvZih1bm1hcCkpKTsKLQkJaWYgKHJldCAhPSBzaXplb2YodW5tYXApKSB7Ci0JCQlyZXQgPSAtZXJybm87Ci0JCQlwcmludGsoVU1fS0VSTl9FUlIgInVubWFwIC0gcHJvY19tbSB3cml0ZSByZXR1cm5lZCAiCi0JCQkgICAgICAgIiVkXG4iLCByZXQpOwotCQl9Ci0JCWVsc2UgcmV0ID0gMDsKLQl9Ci0JZWxzZSB7Ci0JCXVuc2lnbmVkIGxvbmcgYXJnc1tdID0geyAodW5zaWduZWQgbG9uZykgYWRkciwgbGVuLCAwLCAwLCAwLAotCQkJCQkgMCB9OwotCi0JCXJldCA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX211bm1hcCwgYXJncywgMCwKLQkJCQkgICAgICAgZGF0YSwgZG9uZSk7Ci0JfQorCXJldCA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX211bm1hcCwgYXJncywgMCwKKwkJCSAgICAgICBkYXRhLCBkb25lKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNTEsMzMgKzE5NywxMSBAQAogaW50IHByb3RlY3Qoc3RydWN0IG1tX2lkICogbW1faWRwLCB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLAogCSAgICB1bnNpZ25lZCBpbnQgcHJvdCwgaW50IGRvbmUsIHZvaWQgKipkYXRhKQogewotCXN0cnVjdCBwcm9jX21tX29wIHByb3RlY3Q7CiAJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgYWRkciwgbGVuLCBwcm90LCAwLCAwLCAwIH07CiAKLQlpZiAocHJvY19tbSkgewotCQlpbnQgZmQgPSBtbV9pZHAtPnUubW1fZmQ7Ci0KLQkJcHJvdGVjdCA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wCT0gTU1fTVBST1RFQ1QsCi0JCQkJCSAgIC51CT0KLQkJCQkJICAgeyAubXByb3RlY3QJPQotCQkJCQkgICAgIHsgLmFkZHIJPQotCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGFkZHIsCi0JCQkJCSAgICAgICAubGVuCT0gbGVuLAotCQkJCQkgICAgICAgLnByb3QJPSBwcm90IH0gfSB9ICk7Ci0KLQkJQ0FUQ0hfRUlOVFIocmV0ID0gd3JpdGUoZmQsICZwcm90ZWN0LCBzaXplb2YocHJvdGVjdCkpKTsKLQkJaWYgKHJldCAhPSBzaXplb2YocHJvdGVjdCkpIHsKLQkJCXJldCA9IC1lcnJubzsKLQkJCXByaW50ayhVTV9LRVJOX0VSUiAicHJvdGVjdCBmYWlsZWQsIGVyciA9ICVkIiwgLXJldCk7Ci0JCX0KLQkJZWxzZSByZXQgPSAwOwotCX0KLQllbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBhcmdzW10gPSB7IGFkZHIsIGxlbiwgcHJvdCwgMCwgMCwgMCB9OwotCi0JCXJldCA9IHJ1bl9zeXNjYWxsX3N0dWIobW1faWRwLCBfX05SX21wcm90ZWN0LCBhcmdzLCAwLAotCQkJCSAgICAgICBkYXRhLCBkb25lKTsKLQl9CisJcmV0ID0gcnVuX3N5c2NhbGxfc3R1YihtbV9pZHAsIF9fTlJfbXByb3RlY3QsIGFyZ3MsIDAsCisJCQkgICAgICAgZGF0YSwgZG9uZSk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYyBiL2FyY2gvdW0vb3MtTGludXgvc2thcy9wcm9jZXNzLmMKaW5kZXggOTA4NTc5Zi4uN2E5Nzc3NSAxMDA2NDQKLS0tIGEvYXJjaC91bS9vcy1MaW51eC9za2FzL3Byb2Nlc3MuYworKysgYi9hcmNoL3VtL29zLUxpbnV4L3NrYXMvcHJvY2Vzcy5jCkBAIC0xNiwxMSArMTYsOSBAQAogI2luY2x1ZGUgPGtlcm5fdXRpbC5oPgogI2luY2x1ZGUgPG1lbS5oPgogI2luY2x1ZGUgPG9zLmg+Ci0jaW5jbHVkZSA8cHJvY19tbS5oPgogI2luY2x1ZGUgPHB0cmFjZV91c2VyLmg+CiAjaW5jbHVkZSA8cmVnaXN0ZXJzLmg+CiAjaW5jbHVkZSA8c2thcy5oPgotI2luY2x1ZGUgPHNrYXNfcHRyYWNlLmg+CiAjaW5jbHVkZSA8c3lzZGVwL3N0dWIuaD4KIAogaW50IGlzX3NrYXNfd2luY2goaW50IHBpZCwgaW50IGZkLCB2b2lkICpkYXRhKQpAQCAtOTEsNTAgKzg5LDMzIEBACiBzdGF0aWMgdm9pZCBnZXRfc2thc19mYXVsdGluZm8oaW50IHBpZCwgc3RydWN0IGZhdWx0aW5mbyAqZmkpCiB7CiAJaW50IGVycjsKKwl1bnNpZ25lZCBsb25nIGZwcmVnc1tGUF9TSVpFXTsKIAotCWlmIChwdHJhY2VfZmF1bHRpbmZvKSB7Ci0JCWVyciA9IHB0cmFjZShQVFJBQ0VfRkFVTFRJTkZPLCBwaWQsIDAsIGZpKTsKLQkJaWYgKGVycikgewotCQkJcHJpbnRrKFVNX0tFUk5fRVJSICJnZXRfc2thc19mYXVsdGluZm8gLSAiCi0JCQkgICAgICAgIlBUUkFDRV9GQVVMVElORk8gZmFpbGVkLCBlcnJubyA9ICVkXG4iLCBlcnJubyk7Ci0JCQlmYXRhbF9zaWdzZWd2KCk7Ci0JCX0KLQotCQkvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBpMzg2LCB3aGljaCBoYXMgZGlmZmVyZW50IHN0cnVjdHMgKi8KLQkJaWYgKHNpemVvZihzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbykgPCBzaXplb2Yoc3RydWN0IGZhdWx0aW5mbykpCi0JCQltZW1zZXQoKGNoYXIgKilmaSArIHNpemVvZihzdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbyksIDAsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmYXVsdGluZm8pIC0KLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IHB0cmFjZV9mYXVsdGluZm8pKTsKKwllcnIgPSBnZXRfZnBfcmVnaXN0ZXJzKHBpZCwgZnByZWdzKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoVU1fS0VSTl9FUlIgInNhdmVfZnBfcmVnaXN0ZXJzIHJldHVybmVkICVkXG4iLAorCQkgICAgICAgZXJyKTsKKwkJZmF0YWxfc2lnc2VndigpOwogCX0KLQllbHNlIHsKLQkJdW5zaWduZWQgbG9uZyBmcHJlZ3NbRlBfU0laRV07CisJZXJyID0gcHRyYWNlKFBUUkFDRV9DT05ULCBwaWQsIDAsIFNJR1NFR1YpOworCWlmIChlcnIpIHsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJGYWlsZWQgdG8gY29udGludWUgc3R1YiwgcGlkID0gJWQsICIKKwkJICAgICAgICJlcnJubyA9ICVkXG4iLCBwaWQsIGVycm5vKTsKKwkJZmF0YWxfc2lnc2VndigpOworCX0KKwl3YWl0X3N0dWJfZG9uZShwaWQpOwogCi0JCWVyciA9IGdldF9mcF9yZWdpc3RlcnMocGlkLCBmcHJlZ3MpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJcHJpbnRrKFVNX0tFUk5fRVJSICJzYXZlX2ZwX3JlZ2lzdGVycyByZXR1cm5lZCAlZFxuIiwKLQkJCSAgICAgICBlcnIpOwotCQkJZmF0YWxfc2lnc2VndigpOwotCQl9Ci0JCWVyciA9IHB0cmFjZShQVFJBQ0VfQ09OVCwgcGlkLCAwLCBTSUdTRUdWKTsKLQkJaWYgKGVycikgewotCQkJcHJpbnRrKFVNX0tFUk5fRVJSICJGYWlsZWQgdG8gY29udGludWUgc3R1YiwgcGlkID0gJWQsICIKLQkJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgcGlkLCBlcnJubyk7Ci0JCQlmYXRhbF9zaWdzZWd2KCk7Ci0JCX0KLQkJd2FpdF9zdHViX2RvbmUocGlkKTsKKwkvKgorCSAqIGZhdWx0aW5mbyBpcyBwcmVwYXJlZCBieSB0aGUgc3R1Yi1zZWd2LWhhbmRsZXIgYXQgc3RhcnQgb2YKKwkgKiB0aGUgc3R1YiBzdGFjayBwYWdlLiBXZSBqdXN0IGhhdmUgdG8gY29weSBpdC4KKwkgKi8KKwltZW1jcHkoZmksICh2b2lkICopY3VycmVudF9zdHViX3N0YWNrKCksIHNpemVvZigqZmkpKTsKIAotCQkvKgotCQkgKiBmYXVsdGluZm8gaXMgcHJlcGFyZWQgYnkgdGhlIHN0dWItc2Vndi1oYW5kbGVyIGF0IHN0YXJ0IG9mCi0JCSAqIHRoZSBzdHViIHN0YWNrIHBhZ2UuIFdlIGp1c3QgaGF2ZSB0byBjb3B5IGl0LgotCQkgKi8KLQkJbWVtY3B5KGZpLCAodm9pZCAqKWN1cnJlbnRfc3R1Yl9zdGFjaygpLCBzaXplb2YoKmZpKSk7Ci0KLQkJZXJyID0gcHV0X2ZwX3JlZ2lzdGVycyhwaWQsIGZwcmVncyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlwcmludGsoVU1fS0VSTl9FUlIgInB1dF9mcF9yZWdpc3RlcnMgcmV0dXJuZWQgJWRcbiIsCi0JCQkgICAgICAgZXJyKTsKLQkJCWZhdGFsX3NpZ3NlZ3YoKTsKLQkJfQorCWVyciA9IHB1dF9mcF9yZWdpc3RlcnMocGlkLCBmcHJlZ3MpOworCWlmIChlcnIgPCAwKSB7CisJCXByaW50ayhVTV9LRVJOX0VSUiAicHV0X2ZwX3JlZ2lzdGVycyByZXR1cm5lZCAlZFxuIiwKKwkJICAgICAgIGVycik7CisJCWZhdGFsX3NpZ3NlZ3YoKTsKIAl9CiB9CiAKQEAgLTE5OCw3ICsxNzksOCBAQAogc3RhdGljIGludCB1c2Vyc3BhY2VfdHJhbXAodm9pZCAqc3RhY2spCiB7CiAJdm9pZCAqYWRkcjsKLQlpbnQgZXJyOworCWludCBlcnIsIGZkOworCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQ7CiAKIAlwdHJhY2UoUFRSQUNFX1RSQUNFTUUsIDAsIDAsIDApOwogCkBAIC0yMTEsMzYgKzE5MywzMiBAQAogCQlleGl0KDEpOwogCX0KIAotCWlmICghcHJvY19tbSkgewotCQkvKgotCQkgKiBUaGlzIGhhcyBhIHB0ZSwgYnV0IGl0IGNhbid0IGJlIG1hcHBlZCBpbiB3aXRoIHRoZSB1c3VhbAotCQkgKiB0bGJfZmx1c2ggbWVjaGFuaXNtIGJlY2F1c2UgdGhpcyBpcyBwYXJ0IG9mIHRoYXQgbWVjaGFuaXNtCi0JCSAqLwotCQlpbnQgZmQ7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyBvZmZzZXQ7Ci0JCWZkID0gcGh5c19tYXBwaW5nKHRvX3BoeXMoJl9fc3lzY2FsbF9zdHViX3N0YXJ0KSwgJm9mZnNldCk7Ci0JCWFkZHIgPSBtbWFwNjQoKHZvaWQgKikgU1RVQl9DT0RFLCBVTV9LRVJOX1BBR0VfU0laRSwKLQkJCSAgICAgIFBST1RfRVhFQywgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsIGZkLCBvZmZzZXQpOworCS8qCisJICogVGhpcyBoYXMgYSBwdGUsIGJ1dCBpdCBjYW4ndCBiZSBtYXBwZWQgaW4gd2l0aCB0aGUgdXN1YWwKKwkgKiB0bGJfZmx1c2ggbWVjaGFuaXNtIGJlY2F1c2UgdGhpcyBpcyBwYXJ0IG9mIHRoYXQgbWVjaGFuaXNtCisJICovCisJZmQgPSBwaHlzX21hcHBpbmcodG9fcGh5cygmX19zeXNjYWxsX3N0dWJfc3RhcnQpLCAmb2Zmc2V0KTsKKwlhZGRyID0gbW1hcDY0KCh2b2lkICopIFNUVUJfQ09ERSwgVU1fS0VSTl9QQUdFX1NJWkUsCisJCSAgICAgIFBST1RfRVhFQywgTUFQX0ZJWEVEIHwgTUFQX1BSSVZBVEUsIGZkLCBvZmZzZXQpOworCWlmIChhZGRyID09IE1BUF9GQUlMRUQpIHsKKwkJcHJpbnRrKFVNX0tFUk5fRVJSICJtYXBwaW5nIG1tYXAgc3R1YiBhdCAweCVseCBmYWlsZWQsICIKKwkJICAgICAgICJlcnJubyA9ICVkXG4iLCBTVFVCX0NPREUsIGVycm5vKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlpZiAoc3RhY2sgIT0gTlVMTCkgeworCQlmZCA9IHBoeXNfbWFwcGluZyh0b19waHlzKHN0YWNrKSwgJm9mZnNldCk7CisJCWFkZHIgPSBtbWFwKCh2b2lkICopIFNUVUJfREFUQSwKKwkJCSAgICBVTV9LRVJOX1BBR0VfU0laRSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCSAgICBNQVBfRklYRUQgfCBNQVBfU0hBUkVELCBmZCwgb2Zmc2V0KTsKIAkJaWYgKGFkZHIgPT0gTUFQX0ZBSUxFRCkgewotCQkJcHJpbnRrKFVNX0tFUk5fRVJSICJtYXBwaW5nIG1tYXAgc3R1YiBhdCAweCVseCBmYWlsZWQsICIKLQkJCSAgICAgICAiZXJybm8gPSAlZFxuIiwgU1RVQl9DT0RFLCBlcnJubyk7CisJCQlwcmludGsoVU1fS0VSTl9FUlIgIm1hcHBpbmcgc2VnZmF1bHQgc3RhY2sgIgorCQkJICAgICAgICJhdCAweCVseCBmYWlsZWQsIGVycm5vID0gJWRcbiIsCisJCQkgICAgICAgU1RVQl9EQVRBLCBlcnJubyk7CiAJCQlleGl0KDEpOwogCQl9Ci0KLQkJaWYgKHN0YWNrICE9IE5VTEwpIHsKLQkJCWZkID0gcGh5c19tYXBwaW5nKHRvX3BoeXMoc3RhY2spLCAmb2Zmc2V0KTsKLQkJCWFkZHIgPSBtbWFwKCh2b2lkICopIFNUVUJfREFUQSwKLQkJCQkgICAgVU1fS0VSTl9QQUdFX1NJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCi0JCQkJICAgIE1BUF9GSVhFRCB8IE1BUF9TSEFSRUQsIGZkLCBvZmZzZXQpOwotCQkJaWYgKGFkZHIgPT0gTUFQX0ZBSUxFRCkgewotCQkJCXByaW50ayhVTV9LRVJOX0VSUiAibWFwcGluZyBzZWdmYXVsdCBzdGFjayAiCi0JCQkJICAgICAgICJhdCAweCVseCBmYWlsZWQsIGVycm5vID0gJWRcbiIsCi0JCQkJICAgICAgIFNUVUJfREFUQSwgZXJybm8pOwotCQkJCWV4aXQoMSk7Ci0JCQl9Ci0JCX0KIAl9Ci0JaWYgKCFwdHJhY2VfZmF1bHRpbmZvICYmIChzdGFjayAhPSBOVUxMKSkgeworCWlmIChzdGFjayAhPSBOVUxMKSB7CiAJCXN0cnVjdCBzaWdhY3Rpb24gc2E7CiAKIAkJdW5zaWduZWQgbG9uZyB2ID0gU1RVQl9DT0RFICsKQEAgLTI4NiwxMSArMjY0LDcgQEAKIAogCXNwID0gKHVuc2lnbmVkIGxvbmcpIHN0YWNrICsgVU1fS0VSTl9QQUdFX1NJWkUgLSBzaXplb2Yodm9pZCAqKTsKIAotCWZsYWdzID0gQ0xPTkVfRklMRVM7Ci0JaWYgKHByb2NfbW0pCi0JCWZsYWdzIHw9IENMT05FX1ZNOwotCWVsc2UKLQkJZmxhZ3MgfD0gU0lHQ0hMRDsKKwlmbGFncyA9IENMT05FX0ZJTEVTIHwgU0lHQ0hMRDsKIAogCXBpZCA9IGNsb25lKHVzZXJzcGFjZV90cmFtcCwgKHZvaWQgKikgc3AsIGZsYWdzLCAodm9pZCAqKSBzdHViX3N0YWNrKTsKIAlpZiAocGlkIDwgMCkgewpAQCAtNDEzLDggKzM4Nyw3IEBACiAKIAkJCXN3aXRjaCAoc2lnKSB7CiAJCQljYXNlIFNJR1NFR1Y6Ci0JCQkJaWYgKFBUUkFDRV9GVUxMX0ZBVUxUSU5GTyB8fAotCQkJCSAgICAhcHRyYWNlX2ZhdWx0aW5mbykgeworCQkJCWlmIChQVFJBQ0VfRlVMTF9GQVVMVElORk8pIHsKIAkJCQkJZ2V0X3NrYXNfZmF1bHRpbmZvKHBpZCwKIAkJCQkJCQkgICAmcmVncy0+ZmF1bHRpbmZvKTsKIAkJCQkJKCpzaWdfaW5mb1tTSUdTRUdWXSkoU0lHU0VHViwgKHN0cnVjdCBzaWdpbmZvICopJnNpLApAQCAtNTcxLDY3ICs1NDQsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qCi0gKiBUaGlzIGlzIHVzZWQgb25seSwgaWYgc3R1YiBwYWdlcyBhcmUgbmVlZGVkLCB3aGlsZSBwcm9jX21tIGlzCi0gKiBhdmFpbGFibGUuIE9wZW5pbmcgL3Byb2MvbW0gY3JlYXRlcyBhIG5ldyBtbV9jb250ZXh0LCB3aGljaCBsYWNrcwotICogdGhlIHN0dWItcGFnZXMuIFRodXMsIHdlIG1hcCB0aGVtIHVzaW5nIC9wcm9jL21tLWZkCi0gKi8KLWludCBtYXBfc3R1Yl9wYWdlcyhpbnQgZmQsIHVuc2lnbmVkIGxvbmcgY29kZSwgdW5zaWduZWQgbG9uZyBkYXRhLAotCQkgICB1bnNpZ25lZCBsb25nIHN0YWNrKQotewotCXN0cnVjdCBwcm9jX21tX29wIG1tb3A7Ci0JaW50IG47Ci0JdW5zaWduZWQgbG9uZyBsb25nIGNvZGVfb2Zmc2V0OwotCWludCBjb2RlX2ZkID0gcGh5c19tYXBwaW5nKHRvX3BoeXMoKHZvaWQgKikgJl9fc3lzY2FsbF9zdHViX3N0YXJ0KSwKLQkJCQkgICAmY29kZV9vZmZzZXQpOwotCi0JbW1vcCA9ICgoc3RydWN0IHByb2NfbW1fb3ApIHsgLm9wICAgICAgICA9IE1NX01NQVAsCi0JCQkJICAgICAgLnUgICAgICAgICA9Ci0JCQkJICAgICAgeyAubW1hcCAgICA9Ci0JCQkJCXsgLmFkZHIgICAgPSBjb2RlLAotCQkJCQkgIC5sZW4gICAgID0gVU1fS0VSTl9QQUdFX1NJWkUsCi0JCQkJCSAgLnByb3QgICAgPSBQUk9UX0VYRUMsCi0JCQkJCSAgLmZsYWdzICAgPSBNQVBfRklYRUQgfCBNQVBfUFJJVkFURSwKLQkJCQkJICAuZmQgICAgICA9IGNvZGVfZmQsCi0JCQkJCSAgLm9mZnNldCAgPSBjb2RlX29mZnNldAotCX0gfSB9KTsKLQlDQVRDSF9FSU5UUihuID0gd3JpdGUoZmQsICZtbW9wLCBzaXplb2YobW1vcCkpKTsKLQlpZiAobiAhPSBzaXplb2YobW1vcCkpIHsKLQkJbiA9IGVycm5vOwotCQlwcmludGsoVU1fS0VSTl9FUlIgIm1tYXAgYXJncyAtIGFkZHIgPSAweCVseCwgZmQgPSAlZCwgIgotCQkgICAgICAgIm9mZnNldCA9ICVsbHhcbiIsIGNvZGUsIGNvZGVfZmQsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBjb2RlX29mZnNldCk7Ci0JCXByaW50ayhVTV9LRVJOX0VSUiAibWFwX3N0dWJfcGFnZXMgOiAvcHJvYy9tbSBtYXAgZm9yIGNvZGUgIgotCQkgICAgICAgImZhaWxlZCwgZXJyID0gJWRcbiIsIG4pOwotCQlyZXR1cm4gLW47Ci0JfQotCi0JaWYgKHN0YWNrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgbG9uZyBtYXBfb2Zmc2V0OwotCQlpbnQgbWFwX2ZkID0gcGh5c19tYXBwaW5nKHRvX3BoeXMoKHZvaWQgKilzdGFjayksICZtYXBfb2Zmc2V0KTsKLQkJbW1vcCA9ICgoc3RydWN0IHByb2NfbW1fb3ApCi0JCQkJeyAub3AgICAgICAgID0gTU1fTU1BUCwKLQkJCQkgIC51ICAgICAgICAgPQotCQkJCSAgeyAubW1hcCAgICA9Ci0JCQkJICAgIHsgLmFkZHIgICAgPSBkYXRhLAotCQkJCSAgICAgIC5sZW4gICAgID0gVU1fS0VSTl9QQUdFX1NJWkUsCi0JCQkJICAgICAgLnByb3QgICAgPSBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAotCQkJCSAgICAgIC5mbGFncyAgID0gTUFQX0ZJWEVEIHwgTUFQX1NIQVJFRCwKLQkJCQkgICAgICAuZmQgICAgICA9IG1hcF9mZCwKLQkJCQkgICAgICAub2Zmc2V0ICA9IG1hcF9vZmZzZXQKLQkJfSB9IH0pOwotCQlDQVRDSF9FSU5UUihuID0gd3JpdGUoZmQsICZtbW9wLCBzaXplb2YobW1vcCkpKTsKLQkJaWYgKG4gIT0gc2l6ZW9mKG1tb3ApKSB7Ci0JCQluID0gZXJybm87Ci0JCQlwcmludGsoVU1fS0VSTl9FUlIgIm1hcF9zdHViX3BhZ2VzIDogL3Byb2MvbW0gbWFwIGZvciAiCi0JCQkgICAgICAgImRhdGEgZmFpbGVkLCBlcnIgPSAlZFxuIiwgbik7Ci0JCQlyZXR1cm4gLW47Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogdm9pZCBuZXdfdGhyZWFkKHZvaWQgKnN0YWNrLCBqbXBfYnVmICpidWYsIHZvaWQgKCpoYW5kbGVyKSh2b2lkKSkKIHsKIAkoKmJ1ZilbMF0uSkJfSVAgPSAodW5zaWduZWQgbG9uZykgaGFuZGxlcjsKQEAgLTY3NCw3ICs1ODYsNyBAQAogCW4gPSBzZXRqbXAoaW5pdGlhbF9qbXBidWYpOwogCXN3aXRjaCAobikgewogCWNhc2UgSU5JVF9KTVBfTkVXX1RIUkVBRDoKLQkJKCpzd2l0Y2hfYnVmKVswXS5KQl9JUCA9ICh1bnNpZ25lZCBsb25nKSBuZXdfdGhyZWFkX2hhbmRsZXI7CisJCSgqc3dpdGNoX2J1ZilbMF0uSkJfSVAgPSAodW5zaWduZWQgbG9uZykgdW1sX2ZpbmlzaHNldHVwOwogCQkoKnN3aXRjaF9idWYpWzBdLkpCX1NQID0gKHVuc2lnbmVkIGxvbmcpIHN0YWNrICsKIAkJCVVNX1RIUkVBRF9TSVpFIC0gc2l6ZW9mKHZvaWQgKik7CiAJCWJyZWFrOwpAQCAtNzI4LDE3ICs2NDAsNSBAQAogCiB2b2lkIF9fc3dpdGNoX21tKHN0cnVjdCBtbV9pZCAqbW1faWRwKQogewotCWludCBlcnI7Ci0KLQkvKiBGSVhNRTogbmVlZCBjcHUgcGlkIGluIF9fc3dpdGNoX21tICovCi0JaWYgKHByb2NfbW0pIHsKLQkJZXJyID0gcHRyYWNlKFBUUkFDRV9TV0lUQ0hfTU0sIHVzZXJzcGFjZV9waWRbMF0sIDAsCi0JCQkgICAgIG1tX2lkcC0+dS5tbV9mZCk7Ci0JCWlmIChlcnIpIHsKLQkJCXByaW50ayhVTV9LRVJOX0VSUiAiX19zd2l0Y2hfbW0gLSBQVFJBQ0VfU1dJVENIX01NICIKLQkJCSAgICAgICAiZmFpbGVkLCBlcnJubyA9ICVkXG4iLCBlcnJubyk7Ci0JCQlmYXRhbF9zaWdzZWd2KCk7Ci0JCX0KLQl9Ci0JZWxzZSB1c2Vyc3BhY2VfcGlkWzBdID0gbW1faWRwLT51LnBpZDsKKwl1c2Vyc3BhY2VfcGlkWzBdID0gbW1faWRwLT51LnBpZDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc3RhcnRfdXAuYyBiL2FyY2gvdW0vb3MtTGludXgvc3RhcnRfdXAuYwppbmRleCAzMzc1MThjLi40N2YxZmYwIDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3N0YXJ0X3VwLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zdGFydF91cC5jCkBAIC0yNCw3ICsyNCw2IEBACiAjaW5jbHVkZSA8cHRyYWNlX3VzZXIuaD4KICNpbmNsdWRlIDxyZWdpc3RlcnMuaD4KICNpbmNsdWRlIDxza2FzLmg+Ci0jaW5jbHVkZSA8c2thc19wdHJhY2UuaD4KIAogc3RhdGljIHZvaWQgcHRyYWNlX2NoaWxkKHZvaWQpCiB7CkBAIC0xNDMsNDQgKzE0Miw2IEBACiB9CiAKIC8qIENoYW5nZWQgb25seSBkdXJpbmcgZWFybHkgYm9vdCAqLwotaW50IHB0cmFjZV9mYXVsdGluZm87Ci1zdGF0aWMgaW50IGRpc2FibGVfcHRyYWNlX2ZhdWx0aW5mbzsKLQotaW50IHB0cmFjZV9sZHQ7Ci1zdGF0aWMgaW50IGRpc2FibGVfcHRyYWNlX2xkdDsKLQotaW50IHByb2NfbW07Ci1zdGF0aWMgaW50IGRpc2FibGVfcHJvY19tbTsKLQotaW50IGhhdmVfc3dpdGNoX21tOwotc3RhdGljIGludCBkaXNhYmxlX3N3aXRjaF9tbTsKLQotaW50IHNrYXNfbmVlZHNfc3R1YjsKLQotc3RhdGljIGludCBfX2luaXQgc2thczBfY21kX3BhcmFtKGNoYXIgKnN0ciwgaW50KiBhZGQpCi17Ci0JZGlzYWJsZV9wdHJhY2VfZmF1bHRpbmZvID0gMTsKLQlkaXNhYmxlX3B0cmFjZV9sZHQgPSAxOwotCWRpc2FibGVfcHJvY19tbSA9IDE7Ci0JZGlzYWJsZV9zd2l0Y2hfbW0gPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFRoZSB0d28gX191bWxfc2V0dXAgd291bGQgY29uZmxpY3QsIHdpdGhvdXQgdGhpcyBzdHVwaWQgYWxpYXMuICovCi0KLXN0YXRpYyBpbnQgX19pbml0IG1vZGVfc2thczBfY21kX3BhcmFtKGNoYXIgKnN0ciwgaW50KiBhZGQpCi0JX19hdHRyaWJ1dGVfXygoYWxpYXMoInNrYXMwX2NtZF9wYXJhbSIpKSk7Ci0KLV9fdW1sX3NldHVwKCJza2FzMCIsIHNrYXMwX2NtZF9wYXJhbSwKLSJza2FzMFxuIgotIiAgICBEaXNhYmxlcyBTS0FTMyBhbmQgU0tBUzQgdXNhZ2UsIHNvIHRoYXQgU0tBUzAgaXMgdXNlZFxuXG4iKTsKLQotX191bWxfc2V0dXAoIm1vZGU9c2thczAiLCBtb2RlX3NrYXMwX2NtZF9wYXJhbSwKLSJtb2RlPXNrYXMwXG4iCi0iICAgIERpc2FibGVzIFNLQVMzIGFuZCBTS0FTNCB1c2FnZSwgc28gdGhhdCBTS0FTMCBpcyB1c2VkLlxuXG4iKTsKLQotLyogQ2hhbmdlZCBvbmx5IGR1cmluZyBlYXJseSBib290ICovCiBzdGF0aWMgaW50IGZvcmNlX3N5c2VtdV9kaXNhYmxlZCA9IDA7CiAKIHN0YXRpYyBpbnQgX19pbml0IG5vc3lzZW11X2NtZF9wYXJhbShjaGFyICpzdHIsIGludCogYWRkKQpAQCAtMzc2LDEyMSArMzM3LDYgQEAKIAlzdG9wX3B0cmFjZWRfY2hpbGQocGlkLCAxLCAxKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgbm9wcm9jbW1fY21kX3BhcmFtKGNoYXIgKnN0ciwgaW50KiBhZGQpCi17Ci0JZGlzYWJsZV9wcm9jX21tID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotX191bWxfc2V0dXAoIm5vcHJvY21tIiwgbm9wcm9jbW1fY21kX3BhcmFtLAotIm5vcHJvY21tXG4iCi0iICAgIFR1cm5zIG9mZiB1c2FnZSBvZiAvcHJvYy9tbSwgZXZlbiBpZiBob3N0IHN1cHBvcnRzIGl0LlxuIgotIiAgICBUbyBzdXBwb3J0IC9wcm9jL21tLCB0aGUgaG9zdCBuZWVkcyB0byBiZSBwYXRjaGVkIHVzaW5nXG4iCi0iICAgIHRoZSBjdXJyZW50IHNrYXMzIHBhdGNoLlxuXG4iKTsKLQotc3RhdGljIGludCBfX2luaXQgbm9wdHJhY2VmYXVsdGluZm9fY21kX3BhcmFtKGNoYXIgKnN0ciwgaW50KiBhZGQpCi17Ci0JZGlzYWJsZV9wdHJhY2VfZmF1bHRpbmZvID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotX191bWxfc2V0dXAoIm5vcHRyYWNlZmF1bHRpbmZvIiwgbm9wdHJhY2VmYXVsdGluZm9fY21kX3BhcmFtLAotIm5vcHRyYWNlZmF1bHRpbmZvXG4iCi0iICAgIFR1cm5zIG9mZiB1c2FnZSBvZiBQVFJBQ0VfRkFVTFRJTkZPLCBldmVuIGlmIGhvc3Qgc3VwcG9ydHNcbiIKLSIgICAgaXQuIFRvIHN1cHBvcnQgUFRSQUNFX0ZBVUxUSU5GTywgdGhlIGhvc3QgbmVlZHMgdG8gYmUgcGF0Y2hlZFxuIgotIiAgICB1c2luZyB0aGUgY3VycmVudCBza2FzMyBwYXRjaC5cblxuIik7Ci0KLXN0YXRpYyBpbnQgX19pbml0IG5vcHRyYWNlbGR0X2NtZF9wYXJhbShjaGFyICpzdHIsIGludCogYWRkKQotewotCWRpc2FibGVfcHRyYWNlX2xkdCA9IDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLV9fdW1sX3NldHVwKCJub3B0cmFjZWxkdCIsIG5vcHRyYWNlbGR0X2NtZF9wYXJhbSwKLSJub3B0cmFjZWxkdFxuIgotIiAgICBUdXJucyBvZmYgdXNhZ2Ugb2YgUFRSQUNFX0xEVCwgZXZlbiBpZiBob3N0IHN1cHBvcnRzIGl0LlxuIgotIiAgICBUbyBzdXBwb3J0IFBUUkFDRV9MRFQsIHRoZSBob3N0IG5lZWRzIHRvIGJlIHBhdGNoZWQgdXNpbmdcbiIKLSIgICAgdGhlIGN1cnJlbnQgc2thczMgcGF0Y2guXG5cbiIpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfc2thczNfcHRyYWNlX2ZhdWx0aW5mbyh2b2lkKQotewotCXN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvIGZpOwotCWludCBwaWQsIG47Ci0KLQlub25fZmF0YWwoIiAgLSBQVFJBQ0VfRkFVTFRJTkZPLi4uIik7Ci0JcGlkID0gc3RhcnRfcHRyYWNlZF9jaGlsZCgpOwotCi0JbiA9IHB0cmFjZShQVFJBQ0VfRkFVTFRJTkZPLCBwaWQsIDAsICZmaSk7Ci0JaWYgKG4gPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFSU8pCi0JCQlub25fZmF0YWwoIm5vdCBmb3VuZFxuIik7Ci0JCWVsc2UKLQkJCXBlcnJvcigibm90IGZvdW5kIik7Ci0JfSBlbHNlIGlmIChkaXNhYmxlX3B0cmFjZV9mYXVsdGluZm8pCi0JCW5vbl9mYXRhbCgiZm91bmQgYnV0IGRpc2FibGVkIG9uIGNvbW1hbmQgbGluZVxuIik7Ci0JZWxzZSB7Ci0JCXB0cmFjZV9mYXVsdGluZm8gPSAxOwotCQlub25fZmF0YWwoImZvdW5kXG4iKTsKLQl9Ci0KLQlzdG9wX3B0cmFjZWRfY2hpbGQocGlkLCAxLCAxKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3NrYXMzX3B0cmFjZV9sZHQodm9pZCkKLXsKLSNpZmRlZiBQVFJBQ0VfTERUCi0JaW50IHBpZCwgbjsKLQl1bnNpZ25lZCBjaGFyIGxkdGJ1Zls0MF07Ci0Jc3RydWN0IHB0cmFjZV9sZHQgbGR0X29wID0gKHN0cnVjdCBwdHJhY2VfbGR0KSB7Ci0JCS5mdW5jID0gMiwgLyogcmVhZCBkZWZhdWx0IGxkdCAqLwotCQkucHRyID0gbGR0YnVmLAotCQkuYnl0ZWNvdW50ID0gc2l6ZW9mKGxkdGJ1Zil9OwotCi0Jbm9uX2ZhdGFsKCIgIC0gUFRSQUNFX0xEVC4uLiIpOwotCXBpZCA9IHN0YXJ0X3B0cmFjZWRfY2hpbGQoKTsKLQotCW4gPSBwdHJhY2UoUFRSQUNFX0xEVCwgcGlkLCAwLCAodW5zaWduZWQgbG9uZykgJmxkdF9vcCk7Ci0JaWYgKG4gPCAwKSB7Ci0JCWlmIChlcnJubyA9PSBFSU8pCi0JCQlub25fZmF0YWwoIm5vdCBmb3VuZFxuIik7Ci0JCWVsc2UKLQkJCXBlcnJvcigibm90IGZvdW5kIik7Ci0JfSBlbHNlIGlmIChkaXNhYmxlX3B0cmFjZV9sZHQpCi0JCW5vbl9mYXRhbCgiZm91bmQsIGJ1dCB1c2UgaXMgZGlzYWJsZWRcbiIpOwotCWVsc2UgewotCQlwdHJhY2VfbGR0ID0gMTsKLQkJbm9uX2ZhdGFsKCJmb3VuZFxuIik7Ci0JfQotCi0Jc3RvcF9wdHJhY2VkX2NoaWxkKHBpZCwgMSwgMSk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX3NrYXMzX3Byb2NfbW0odm9pZCkKLXsKLQlub25fZmF0YWwoIiAgLSAvcHJvYy9tbS4uLiIpOwotCWlmIChhY2Nlc3MoIi9wcm9jL21tIiwgV19PSykgPCAwKQotCQlwZXJyb3IoIm5vdCBmb3VuZCIpOwotCWVsc2UgaWYgKGRpc2FibGVfcHJvY19tbSkKLQkJbm9uX2ZhdGFsKCJmb3VuZCBidXQgZGlzYWJsZWQgb24gY29tbWFuZCBsaW5lXG4iKTsKLQllbHNlIHsKLQkJcHJvY19tbSA9IDE7Ci0JCW5vbl9mYXRhbCgiZm91bmRcbiIpOwotCX0KLX0KLQotdm9pZCBjYW5fZG9fc2thcyh2b2lkKQotewotCW5vbl9mYXRhbCgiQ2hlY2tpbmcgZm9yIHRoZSBza2FzMyBwYXRjaCBpbiB0aGUgaG9zdDpcbiIpOwotCi0JY2hlY2tfc2thczNfcHJvY19tbSgpOwotCWNoZWNrX3NrYXMzX3B0cmFjZV9mYXVsdGluZm8oKTsKLQljaGVja19za2FzM19wdHJhY2VfbGR0KCk7Ci0KLQlpZiAoIXByb2NfbW0gfHwgIXB0cmFjZV9mYXVsdGluZm8gfHwgIXB0cmFjZV9sZHQpCi0JCXNrYXNfbmVlZHNfc3R1YiA9IDE7Ci19Ci0KIGludCBfX2luaXQgcGFyc2VfaW9tZW0oY2hhciAqc3RyLCBpbnQgKmFkZCkKIHsKIAlzdHJ1Y3QgaW9tZW1fcmVnaW9uICpuZXc7CmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pYTY0L01ha2VmaWxlIGIvYXJjaC91bS9zeXMtaWE2NC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAyZjRjMi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pYTY0L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotT0JKID0gYnVpbHQtaW4ubwotCi1PQkpTID0KLQotYWxsOiAkKE9CSikKLQotJChPQkopOiAkKE9CSlMpCi0Jcm0gLWYgJEAKLQkkKExEKSAkKExJTktGTEFHUykgLS1zdGFydC1ncm91cCAkXiAtLWVuZC1ncm91cCAtbyAkQAotCi1jbGVhbi1maWxlcyA6PSAkKE9CSlMpIGxpbmsubGQKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLWlhNjQvc3lzZGVwL3B0cmFjZS5oIGIvYXJjaC91bS9zeXMtaWE2NC9zeXNkZXAvcHRyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMGY0ZTYuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaWE2NC9zeXNkZXAvcHRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9JQTY0X1BUUkFDRV9ICi0jZGVmaW5lIF9fU1lTREVQX0lBNjRfUFRSQUNFX0gKLQotc3RydWN0IHN5c19wdF9yZWdzIHsKLSAgaW50IGZvbzsKLX07Ci0KLSNkZWZpbmUgRU1QVFlfUkVHUyB7IDAgfQotCi0jZW5kaWYKLQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaWE2NC9zeXNkZXAvc2lnY29udGV4dC5oIGIvYXJjaC91bS9zeXMtaWE2NC9zeXNkZXAvc2lnY29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmI0MzE2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLWlhNjQvc3lzZGVwL3NpZ2NvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAwIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU1lTREVQX0lBNjRfU0lHQ09OVEVYVF9ICi0jZGVmaW5lIF9fU1lTREVQX0lBNjRfU0lHQ09OVEVYVF9ICi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1pYTY0L3N5c2RlcC9za2FzX3B0cmFjZS5oIGIvYXJjaC91bS9zeXMtaWE2NC9zeXNkZXAvc2thc19wdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjVhMzhlNy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1pYTY0L3N5c2RlcC9za2FzX3B0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9JQTY0X1NLQVNfUFRSQUNFX0gKLSNkZWZpbmUgX19TWVNERVBfSUE2NF9TS0FTX1BUUkFDRV9ICi0KLXN0cnVjdCBwdHJhY2VfZmF1bHRpbmZvIHsKLSAgICAgICAgaW50IGlzX3dyaXRlOwotICAgICAgICB1bnNpZ25lZCBsb25nIGFkZHI7Ci19OwotCi1zdHJ1Y3QgcHRyYWNlX2xkdCB7Ci0gICAgICAgIGludCBmdW5jOwotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYnl0ZWNvdW50OwotfTsKLQotI2RlZmluZSBQVFJBQ0VfTERUIDU0Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtaWE2NC9zeXNkZXAvc3lzY2FsbHMuaCBiL2FyY2gvdW0vc3lzLWlhNjQvc3lzZGVwL3N5c2NhbGxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjcwMGMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtaWE2NC9zeXNkZXAvc3lzY2FsbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAwIEplZmYgRGlrZSAoamRpa2VAa2FyYXlhLmNvbSkKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwKLSAqLwotCi0jaWZuZGVmIF9fU1lTREVQX0lBNjRfU1lTQ0FMTFNfSAotI2RlZmluZSBfX1NZU0RFUF9JQTY0X1NZU0NBTExTX0gKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXBwYy9NYWtlZmlsZSBiL2FyY2gvdW0vc3lzLXBwYy9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMzYzYi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1wcGMvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi1PQkogPSBidWlsdC1pbi5vCi0KLS5TLm86Ci0JJChDQykgJChLQlVJTERfQUZMQUdTKSAtRF9fQVNTRU1CTFlfXyAtRF9fVU1fUFBDX18gLWMgJDwgLW8gJCoubwotCi1PQkpTID0gcHRyYWNlLm8gc2lnY29udGV4dC5vIGNoZWNrc3VtLm8gbWlzY3RoaW5ncy5vIG1pc2MubyBcCi0JcHRyYWNlX3VzZXIubyBzeXNycS5vCi0KLWFzZmxhZ3MteSA6PSAtRENPTkZJR19QUEMzMiAtSS4gLUkkKHNyY3RyZWUpL2FyY2gvcHBjL2tlcm5lbAotCi1hbGw6ICQoT0JKKQotCi0kKE9CSik6ICQoT0JKUykKLQlybSAtZiAkQAotCSQoTEQpICQoTElOS0ZMQUdTKSAtLXN0YXJ0LWdyb3VwICReIC0tZW5kLWdyb3VwIC1vICRACi0KLXB0cmFjZV91c2VyLm86IHB0cmFjZV91c2VyLmMKLQkkKENDKSAtRF9fS0VSTkVMX18gJChVU0VSX0NGTEFHUykgJChjY2ZsYWdzLXkpIC1jIC1vICRAICQ8Ci0KLXNpZ2NvbnRleHQubzogc2lnY29udGV4dC5jCi0JJChDQykgJChVU0VSX0NGTEFHUykgJChjY2ZsYWdzLXkpIC1jIC1vICRAICQ8Ci0KLWNoZWNrc3VtLlM6Ci0Jcm0gLWYgJEAKLQlsbiAtcyAkKHNyY3RyZWUpL2FyY2gvcHBjL2xpYi8kQCAkQAotCi1ta19kZWZzLmM6Ci0Jcm0gLWYgJEAKLQlsbiAtcyAkKHNyY3RyZWUpL2FyY2gvcHBjL2tlcm5lbC8kQCAkQAotCi1wcGNfZGVmcy5oZWFkOgotCXJtIC1mICRACi0JbG4gLXMgJChzcmN0cmVlKS9hcmNoL3BwYy9rZXJuZWwvJEAgJEAKLQotcHBjX2RlZnMuaDogbWtfZGVmcy5jIHBwY19kZWZzLmhlYWQgXAotCQkkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLXBwYy9tbXUuaCBcCi0JCSQoc3JjdHJlZSkvaW5jbHVkZS9hc20tcHBjL3Byb2Nlc3Nvci5oIFwKLQkJJChzcmN0cmVlKS9pbmNsdWRlL2FzbS1wcGMvcGd0YWJsZS5oIFwKLQkJJChzcmN0cmVlKS9pbmNsdWRlL2FzbS1wcGMvcHRyYWNlLmgKLSMJJChDQykgJChDRkxBR1MpIC1TIG1rX2RlZnMuYwotCWNwIHBwY19kZWZzLmhlYWQgcHBjX2RlZnMuaAotIyBmb3IgYmssIHRoaXMgd2F5IHdlIGNhbiB3cml0ZSB0byB0aGUgZmlsZSBldmVuIGlmIGl0J3Mgbm90IGNoZWNrZWQgb3V0Ci0JZWNobyAnI2RlZmluZSBUSFJFQUQgNjA4JyA+PiBwcGNfZGVmcy5oCi0JZWNobyAnI2RlZmluZSBQVF9SRUdTIDgnID4+IHBwY19kZWZzLmgKLQllY2hvICcjZGVmaW5lIENMT05FX1ZNIDI1NicgPj4gcHBjX2RlZnMuaAotIwljaG1vZCB1K3cgcHBjX2RlZnMuaAotIwlncmVwICdeI2RlZmluZScgbWtfZGVmcy5zID4+IHBwY19kZWZzLmgKLSMJcm0gbWtfZGVmcy5zCi0KLSMgdGhlIGFzbSBsaW5rIGlzIGhvcnJpYmxlLCBhbmQgYnJlYWtzIHRoZSBvdGhlciB0YXJnZXRzLiAgVGhpcyBpcyBhbHNvCi0jIG5vdCBnb2luZyB0byB3b3JrIHdpdGggcGFyYWxsZWwgbWFrZXMuCi0KLWNoZWNrc3VtLm86IGNoZWNrc3VtLlMKLQlybSAtZiBhc20KLQlsbiAtcyAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLXBwYyBhc20KLQkkKENDKSAkKGFzZmxhZ3MteSkgJChLQlVJTERfQUZMQUdTKSAtRF9fQVNTRU1CTFlfXyAtRF9fVU1fUFBDX18gLWMgJDwgLW8gJCoubwotCXJtIC1mIGFzbQotCi1taXNjLm86IG1pc2MuUyBwcGNfZGVmcy5oCi0Jcm0gLWYgYXNtCi0JbG4gLXMgJChzcmN0cmVlKS9pbmNsdWRlL2FzbS1wcGMgYXNtCi0JJChDQykgJChhc2ZsYWdzLXkpICQoS0JVSUxEX0FGTEFHUykgLURfX0FTU0VNQkxZX18gLURfX1VNX1BQQ19fIC1jICQ8IC1vICQqLm8KLQlybSAtZiBhc20KLQotY2xlYW4tZmlsZXMgOj0gJChPQkpTKSBwcGNfZGVmcy5oIGNoZWNrc3VtLlMgbWtfZGVmcy5jCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1wcGMvYXNtL2FyY2hwYXJhbS5oIGIvYXJjaC91bS9zeXMtcHBjL2FzbS9hcmNocGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2OWQ4YS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1wcGMvYXNtL2FyY2hwYXJhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaWZuZGVmIF9fVU1fQVJDSFBBUkFNX1BQQ19ICi0jZGVmaW5lIF9fVU1fQVJDSFBBUkFNX1BQQ19ICi0KLS8qKioqKioqKiogQml0cyBmb3IgYXNtLXVtL3N0cmluZy5oICoqKioqKioqKiovCi0KLSNkZWZpbmUgX19IQVZFX0FSQ0hfU1RSUkNIUgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXBwYy9hc20vZWxmLmggYi9hcmNoL3VtL3N5cy1wcGMvYXNtL2VsZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWFjYWY1Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXBwYy9hc20vZWxmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0jaWZuZGVmIF9fVU1fRUxGX1BQQ19ICi0jZGVmaW5lIF9fVU1fRUxGX1BQQ19ICi0KLQotZXh0ZXJuIGxvbmcgZWxmX2F1eF9od2NhcDsKLSNkZWZpbmUgRUxGX0hXQ0FQIChlbGZfYXV4X2h3Y2FwKQotCi0jZGVmaW5lIFNFVF9QRVJTT05BTElUWShleCkgZG8gOyB3aGlsZSgwKQotCi0jZGVmaW5lIEVMRl9FWEVDX1BBR0VTSVpFIDQwOTYKLQotI2RlZmluZSBlbGZfY2hlY2tfYXJjaCh4KSAoMSkKLQotI2lmZGVmIENPTkZJR182NEJJVAotI2RlZmluZSBFTEZfQ0xBU1MgRUxGQ0xBU1M2NAotI2Vsc2UKLSNkZWZpbmUgRUxGX0NMQVNTIEVMRkNMQVNTMzIKLSNlbmRpZgotCi0jZGVmaW5lIFJfMzg2X05PTkUJMAotI2RlZmluZSBSXzM4Nl8zMgkxCi0jZGVmaW5lIFJfMzg2X1BDMzIJMgotI2RlZmluZSBSXzM4Nl9HT1QzMgkzCi0jZGVmaW5lIFJfMzg2X1BMVDMyCTQKLSNkZWZpbmUgUl8zODZfQ09QWQk1Ci0jZGVmaW5lIFJfMzg2X0dMT0JfREFUCTYKLSNkZWZpbmUgUl8zODZfSk1QX1NMT1QJNwotI2RlZmluZSBSXzM4Nl9SRUxBVElWRQk4Ci0jZGVmaW5lIFJfMzg2X0dPVE9GRgk5Ci0jZGVmaW5lIFJfMzg2X0dPVFBDCTEwCi0jZGVmaW5lIFJfMzg2X05VTQkxMQotCi0jZGVmaW5lIEVMRl9QTEFURk9STSAoMCkKLQotI2RlZmluZSBFTEZfRVRfRFlOX0JBU0UgKDB4MDgwMDAwMDApCi0KLS8qIHRoZSBmb2xsb3dpbmcgc3RvbGVuIGZyb20gYXNtLXBwYy9lbGYuaCAqLwotI2RlZmluZSBFTEZfTkdSRUcJNDgJLyogaW5jbHVkZXMgbmlwLCBtc3IsIGxyLCBldGMuICovCi0jZGVmaW5lIEVMRl9ORlBSRUcJMzMJLyogaW5jbHVkZXMgZnBzY3IgKi8KLS8qIEdlbmVyYWwgcmVnaXN0ZXJzICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgZWxmX2dyZWdfdDsKLXR5cGVkZWYgZWxmX2dyZWdfdCBlbGZfZ3JlZ3NldF90W0VMRl9OR1JFR107Ci0KLS8qIEZsb2F0aW5nIHBvaW50IHJlZ2lzdGVycyAqLwotdHlwZWRlZiBkb3VibGUgZWxmX2ZwcmVnX3Q7Ci10eXBlZGVmIGVsZl9mcHJlZ190IGVsZl9mcHJlZ3NldF90W0VMRl9ORlBSRUddOwotCi0jZGVmaW5lIEVMRl9EQVRBICAgICAgICBFTEZEQVRBMk1TQgotI2RlZmluZSBFTEZfQVJDSAlFTV9QUEMKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1wcGMvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC91bS9zeXMtcHBjL2FzbS9wcm9jZXNzb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5MzIzMS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1wcGMvYXNtL3Byb2Nlc3Nvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI2lmbmRlZiBfX1VNX1BST0NFU1NPUl9QUENfSAotI2RlZmluZSBfX1VNX1BST0NFU1NPUl9QUENfSAotCi0jaWYgZGVmaW5lZChfX0FTU0VNQkxZX18pCi0KLSNkZWZpbmUgQ09ORklHX1BQQ19NVUxUSVBMQVRGT1JNCi0jaW5jbHVkZSAiYXJjaC9wcm9jZXNzb3IuaCIKLQotI2Vsc2UKLQotI2luY2x1ZGUgImFzbS9wcm9jZXNzb3ItZ2VuZXJpYy5oIgotCi0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1wcGMvbWlzYy5TIGIvYXJjaC91bS9zeXMtcHBjL21pc2MuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2NGI3ZC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1wcGMvbWlzYy5TCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgbWlzY2VsbGFuZW91cyBsb3ctbGV2ZWwgZnVuY3Rpb25zLgotICogICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgR2FyeSBUaG9tYXMgKGdkdEBsaW51eHBwYy5vcmcpCi0gKgotICogTGFyZ2VseSByZXdyaXR0ZW4gYnkgQ29ydCBEb3VnYW4gKGNvcnRAY3Mubm10LmVkdSkKLSAqIGFuZCBQYXVsIE1hY2tlcnJhcy4KLSAqCi0gKiBBIGNvdXBsZSBvZiBmdW5jdGlvbnMgc3RvbGVuIGZyb20gYXJjaC9wcGMva2VybmVsL21pc2MuUyBmb3IgVU1MCi0gKiBieSBDaHJpcyBFbWVyc29uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICovCi0KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSAicHBjX2FzbS5oIgotCi0jaWYgZGVmaW5lZChDT05GSUdfNHh4KSB8fCBkZWZpbmVkKENPTkZJR184eHgpCi0jZGVmaW5lIENBQ0hFX0xJTkVfU0laRQkJMTYKLSNkZWZpbmUgTEdfQ0FDSEVfTElORV9TSVpFCTQKLSNkZWZpbmUgTUFYX0NPUFlfUFJFRkVUQ0gJMQotI2Vsc2UKLSNkZWZpbmUgQ0FDSEVfTElORV9TSVpFCQkzMgotI2RlZmluZSBMR19DQUNIRV9MSU5FX1NJWkUJNQotI2RlZmluZSBNQVhfQ09QWV9QUkVGRVRDSAk0Ci0jZW5kaWYgLyogQ09ORklHXzR4eCB8fCBDT05GSUdfOHh4ICovCi0KLQkudGV4dAotCi0vKgotICogQ2xlYXIgYSBwYWdlIHVzaW5nIHRoZSBkY2J6IGluc3RydWN0aW9uLCB3aGljaCBkb2Vzbid0IGNhdXNlIGFueQotICogbWVtb3J5IHRyYWZmaWMgKGV4Y2VwdCB0byB3cml0ZSBvdXQgYW55IGNhY2hlIGxpbmVzIHdoaWNoIGdldAotICogZGlzcGxhY2VkKS4gIFRoaXMgb25seSB3b3JrcyBvbiBjYWNoZWFibGUgbWVtb3J5LgotICovCi1fR0xPQkFMKGNsZWFyX3BhZ2UpCi0JbGkJcjAsNDA5Ni9DQUNIRV9MSU5FX1NJWkUKLQltdGN0cglyMAotI2lmZGVmIENPTkZJR184eHgKLQlsaQlyNCwgMAotMToJc3R3CXI0LCAwKHIzKQotCXN0dwlyNCwgNChyMykKLQlzdHcJcjQsIDgocjMpCi0Jc3R3CXI0LCAxMihyMykKLSNlbHNlCi0xOglkY2J6CTAscjMKLSNlbmRpZgotCWFkZGkJcjMscjMsQ0FDSEVfTElORV9TSVpFCi0JYmRuegkxYgotCWJscgotCi0vKgotICogQ29weSBhIHdob2xlIHBhZ2UuICBXZSB1c2UgdGhlIGRjYnogaW5zdHJ1Y3Rpb24gb24gdGhlIGRlc3RpbmF0aW9uCi0gKiB0byByZWR1Y2UgbWVtb3J5IHRyYWZmaWMgKGl0IGVsaW1pbmF0ZXMgdGhlIHVubmVjZXNzYXJ5IHJlYWRzIG9mCi0gKiB0aGUgZGVzdGluYXRpb24gaW50byBjYWNoZSkuICBUaGlzIHJlcXVpcmVzIHRoYXQgdGhlIGRlc3RpbmF0aW9uCi0gKiBpcyBjYWNoZWFibGUuCi0gKi8KLSNkZWZpbmUgQ09QWV8xNl9CWVRFUwkJXAotCWx3eglyNiw0KHI0KTsJXAotCWx3eglyNyw4KHI0KTsJXAotCWx3eglyOCwxMihyNCk7CVwKLQlsd3p1CXI5LDE2KHI0KTsJXAotCXN0dwlyNiw0KHIzKTsJXAotCXN0dwlyNyw4KHIzKTsJXAotCXN0dwlyOCwxMihyMyk7CVwKLQlzdHd1CXI5LDE2KHIzKQotCi1fR0xPQkFMKGNvcHlfcGFnZSkKLQlhZGRpCXIzLHIzLC00Ci0JYWRkaQlyNCxyNCwtNAotCWxpCXI1LDQKLQotI2lmbmRlZiBDT05GSUdfOHh4Ci0jaWYgTUFYX0NPUFlfUFJFRkVUQ0ggPiAxCi0JbGkJcjAsTUFYX0NPUFlfUFJFRkVUQ0gKLQlsaQlyMTEsNAotCW10Y3RyCXIwCi0xMToJZGNidAlyMTEscjQKLQlhZGRpCXIxMSxyMTEsQ0FDSEVfTElORV9TSVpFCi0JYmRuegkxMWIKLSNlbHNlIC8qIE1BWF9DT1BZX1BSRUZFVENIID09IDEgKi8KLQlkY2J0CXI1LHI0Ci0JbGkJcjExLENBQ0hFX0xJTkVfU0laRSs0Ci0jZW5kaWYgLyogTUFYX0NPUFlfUFJFRkVUQ0ggKi8KLSNlbmRpZiAvKiBDT05GSUdfOHh4ICovCi0KLQlsaQlyMCw0MDk2L0NBQ0hFX0xJTkVfU0laRQotCW10Y3RyCXIwCi0xOgotI2lmbmRlZiBDT05GSUdfOHh4Ci0JZGNidAlyMTEscjQKLQlkY2J6CXI1LHIzCi0jZW5kaWYKLQlDT1BZXzE2X0JZVEVTCi0jaWYgQ0FDSEVfTElORV9TSVpFID49IDMyCi0JQ09QWV8xNl9CWVRFUwotI2lmIENBQ0hFX0xJTkVfU0laRSA+PSA2NAotCUNPUFlfMTZfQllURVMKLQlDT1BZXzE2X0JZVEVTCi0jaWYgQ0FDSEVfTElORV9TSVpFID49IDEyOAotCUNPUFlfMTZfQllURVMKLQlDT1BZXzE2X0JZVEVTCi0JQ09QWV8xNl9CWVRFUwotCUNPUFlfMTZfQllURVMKLSNlbmRpZgotI2VuZGlmCi0jZW5kaWYKLQliZG56CTFiCi0JYmxyCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1wcGMvbWlzY3RoaW5ncy5jIGIvYXJjaC91bS9zeXMtcHBjL21pc2N0aGluZ3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5MDhkMi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1wcGMvbWlzY3RoaW5ncy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4gIC8vIGZvciBOVUxMCi0jaW5jbHVkZSA8bGludXgvZWxmLmg+ICAvLyBmb3IgQVRfTlVMTAotCi0vKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIG5pY2tlZCBmcm9tIGFyY2gvcHBjL2tlcm5lbC9wcm9jZXNzLmMgYW5kCi0gKiBhZGFwdGVkIHNsaWdodGx5ICovCi0vKgotICogWFhYIGxkLnNvIGV4cGVjdHMgdGhlIGF1eGlsaWFyeSB0YWJsZSB0byBzdGFydCBvbgotICogYSAxNi1ieXRlIGJvdW5kYXJ5LCBzbyB3ZSBoYXZlIHRvIGZpbmQgaXQgYW5kCi0gKiBtb3ZlIGl0IHVwLiA6LSgKLSAqLwotdm9pZCBzaG92ZV9hdXhfdGFibGUodW5zaWduZWQgbG9uZyBzcCkKLXsKLQlpbnQgYXJnYzsKLQljaGFyICpwOwotCXVuc2lnbmVkIGxvbmcgZTsKLQl1bnNpZ25lZCBsb25nIGF1eF9zdGFydCwgb2Zmc2V0OwotCi0JYXJnYyA9ICooaW50ICopc3A7Ci0Jc3AgKz0gc2l6ZW9mKGludCkgKyAoYXJnYyArIDEpICogc2l6ZW9mKGNoYXIgKik7Ci0JLyogc2tpcCBvdmVyIHRoZSBlbnZpcm9ubWVudCBwb2ludGVycyAqLwotCWRvIHsKLQkJcCA9ICooY2hhciAqKilzcDsKLQkJc3AgKz0gc2l6ZW9mKGNoYXIgKik7Ci0JfSB3aGlsZSAocCAhPSBOVUxMKTsKLQlhdXhfc3RhcnQgPSBzcDsKLQkvKiBza2lwIHRvIHRoZSBlbmQgb2YgdGhlIGF1eGlsaWFyeSB0YWJsZSAqLwotCWRvIHsKLQkJZSA9ICoodW5zaWduZWQgbG9uZyAqKXNwOwotCQlzcCArPSAyICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotCX0gd2hpbGUgKGUgIT0gQVRfTlVMTCk7Ci0Jb2Zmc2V0ID0gKChhdXhfc3RhcnQgKyAxNSkgJiB+MTUpIC0gYXV4X3N0YXJ0OwotCWlmIChvZmZzZXQgIT0gMCkgewotCQlkbyB7Ci0JCQlzcCAtPSBzaXplb2YodW5zaWduZWQgbG9uZyk7Ci0JCQllID0gKih1bnNpZ25lZCBsb25nICopc3A7Ci0JCQkqKHVuc2lnbmVkIGxvbmcgKikoc3AgKyBvZmZzZXQpID0gZTsKLQkJfSB3aGlsZSAoc3AgPiBhdXhfc3RhcnQpOwotCX0KLX0KLS8qIEVORCBzdHVmZiB0YWtlbiBmcm9tIGFyY2gvcHBjL2tlcm5lbC9wcm9jZXNzLmMgKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtcHBjL3B0cmFjZS5jIGIvYXJjaC91bS9zeXMtcHBjL3B0cmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjQ1ZGY0Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXBwYy9wdHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgImFzbS9wdHJhY2UuaCIKLQotaW50IHB1dHJlZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCB1bnNpZ25lZCBsb25nIHJlZ25vLCAKLQkJICB1bnNpZ25lZCBsb25nIHZhbHVlKQotewotCWNoaWxkLT50aHJlYWQucHJvY2Vzc19yZWdzLnJlZ3NbcmVnbm8gPj4gMl0gPSB2YWx1ZTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHBva2VfdXNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKLXsKLQlpZiAoKGFkZHIgJiAzKSB8fCBhZGRyIDwgMCkKLQkJcmV0dXJuIC1FSU87Ci0KLQlpZiAoYWRkciA8IE1BWF9SRUdfT0ZGU0VUKQotCQlyZXR1cm4gcHV0cmVnKGNoaWxkLCBhZGRyLCBkYXRhKTsKLQotCWVsc2UgaWYoKGFkZHIgPj0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pKSAmJgotCQkoYWRkciA8PSBvZmZzZXRvZihzdHJ1Y3QgdXNlciwgdV9kZWJ1Z3JlZ1s3XSkpKXsKLQkJICBhZGRyIC09IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzBdKTsKLQkJICBhZGRyID0gYWRkciA+PiAyOwotCQkgIGlmKChhZGRyID09IDQpIHx8IChhZGRyID09IDUpKSByZXR1cm4gLUVJTzsKLQkJICBjaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdID0gZGF0YTsKLQkJICByZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLXVuc2lnbmVkIGxvbmcgZ2V0cmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHVuc2lnbmVkIGxvbmcgcmVnbm8pCi17Ci0JdW5zaWduZWQgbG9uZyByZXR2YWwgPSB+MFVMOwotCi0JcmV0dmFsICY9IGNoaWxkLT50aHJlYWQucHJvY2Vzc19yZWdzLnJlZ3NbcmVnbm8gPj4gMl07Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotaW50IHBlZWtfdXNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCBsb25nIGFkZHIsIGxvbmcgZGF0YSkKLXsKLQkvKiByZWFkIHRoZSB3b3JkIGF0IGxvY2F0aW9uIGFkZHIgaW4gdGhlIFVTRVIgYXJlYS4gKi8KLQl1bnNpZ25lZCBsb25nIHRtcDsKLQotCWlmICgoYWRkciAmIDMpIHx8IGFkZHIgPCAwKQotCQlyZXR1cm4gLUVJTzsKLQotCXRtcCA9IDA7ICAvKiBEZWZhdWx0IHJldHVybiBjb25kaXRpb24gKi8KLQlpZihhZGRyIDwgTUFYX1JFR19PRkZTRVQpewotCQl0bXAgPSBnZXRyZWcoY2hpbGQsIGFkZHIpOwotCX0KLQllbHNlIGlmKChhZGRyID49IG9mZnNldG9mKHN0cnVjdCB1c2VyLCB1X2RlYnVncmVnWzBdKSkgJiYKLQkJKGFkZHIgPD0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbN10pKSl7Ci0JCWFkZHIgLT0gb2Zmc2V0b2Yoc3RydWN0IHVzZXIsIHVfZGVidWdyZWdbMF0pOwotCQlhZGRyID0gYWRkciA+PiAyOwotCQl0bXAgPSBjaGlsZC0+dGhyZWFkLmFyY2guZGVidWdyZWdzW2FkZHJdOwotCX0KLQlyZXR1cm4gcHV0X3VzZXIodG1wLCAodW5zaWduZWQgbG9uZyAqKSBkYXRhKTsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtcHBjL3B0cmFjZV91c2VyLmMgYi9hcmNoL3VtL3N5cy1wcGMvcHRyYWNlX3VzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMWI5Mi4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1wcGMvcHRyYWNlX3VzZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLSNpbmNsdWRlIDxzeXNkZXAvcHRyYWNlLmg+Ci0KLWludCBwdHJhY2VfZ2V0cmVncyhsb25nIHBpZCwgdW5zaWduZWQgbG9uZyAqcmVnc19vdXQpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpPTA7IGkgPCBzaXplb2Yoc3RydWN0IHN5c19wdF9yZWdzKS9zaXplb2YoUFBDX1JFRyk7ICsraSkgewotCWVycm5vID0gMDsKLQlyZWdzX291dC0+cmVnc1tpXSA9IHB0cmFjZShQVFJBQ0VfUEVFS1VTUiwgcGlkLCBpKjQsIDApOwotCWlmIChlcnJubykgewotCSAgICByZXR1cm4gLWVycm5vOwotCX0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBwdHJhY2Vfc2V0cmVncyhsb25nIHBpZCwgdW5zaWduZWQgbG9uZyAqcmVnc19pbikKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGk9MDsgaSA8IHNpemVvZihzdHJ1Y3Qgc3lzX3B0X3JlZ3MpL3NpemVvZihQUENfUkVHKTsgKytpKSB7Ci0JaWYgKGkgIT0gMzQgLyogRklYTUU6IFBUX09SSUdfUjMgKi8gJiYgaSA8PSBQVF9NUSkgewotCSAgICBpZiAocHRyYWNlKFBUUkFDRV9QT0tFVVNSLCBwaWQsIGkqNCwgcmVnc19pbi0+cmVnc1tpXSkgPCAwKSB7Ci0JCXJldHVybiAtZXJybm87Ci0JICAgIH0KLQl9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtcHBjL3NoYXJlZC9zeXNkZXAvcHRyYWNlLmggYi9hcmNoL3VtL3N5cy1wcGMvc2hhcmVkL3N5c2RlcC9wdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZlMGMxYS4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1wcGMvc2hhcmVkL3N5c2RlcC9wdHJhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qIAotICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTAotICovCi0KLSNpZm5kZWYgX19TWVNfUFRSQUNFX1BQQ19ICi0jZGVmaW5lIF9fU1lTX1BUUkFDRV9QUENfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotLyogdGhlIGZvbGxvd2luZyB0YWtlbiBmcm9tIDxhc20tcHBjL3B0cmFjZS5oPiAqLwotCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0jZGVmaW5lIFBQQ19SRUcgdW5zaWduZWQgbG9uZyAvKmxvbmcqLwotI2Vsc2UKLSNkZWZpbmUgUFBDX1JFRyB1bnNpZ25lZCBsb25nCi0jZW5kaWYKLXN0cnVjdCBzeXNfcHRfcmVnc19zIHsKLQlQUENfUkVHIGdwclszMl07Ci0JUFBDX1JFRyBuaXA7Ci0JUFBDX1JFRyBtc3I7Ci0JUFBDX1JFRyBvcmlnX2dwcjM7CS8qIFVzZWQgZm9yIHJlc3RhcnRpbmcgc3lzdGVtIGNhbGxzICovCi0JUFBDX1JFRyBjdHI7Ci0JUFBDX1JFRyBsaW5rOwotCVBQQ19SRUcgeGVyOwotCVBQQ19SRUcgY2NyOwotCVBQQ19SRUcgbXE7CQkvKiA2MDEgb25seSAobm90IHVzZWQgYXQgcHJlc2VudCkgKi8KLQkJCQkvKiBVc2VkIG9uIEFQVVMgdG8gaG9sZCBJUEwgdmFsdWUuICovCi0JUFBDX1JFRyB0cmFwOwkJLyogUmVhc29uIGZvciBiZWluZyBoZXJlICovCi0JUFBDX1JFRyBkYXI7CQkvKiBGYXVsdCByZWdpc3RlcnMgKi8KLQlQUENfUkVHIGRzaXNyOwotCVBQQ19SRUcgcmVzdWx0OyAJLyogUmVzdWx0IG9mIGEgc3lzdGVtIGNhbGwgKi8KLX07Ci0KLSNkZWZpbmUgTlVNX1JFR1MgKHNpemVvZihzdHJ1Y3Qgc3lzX3B0X3JlZ3NfcykgLyBzaXplb2YoUFBDX1JFRykpCi0KLXN0cnVjdCBzeXNfcHRfcmVncyB7Ci0gICAgUFBDX1JFRyByZWdzW3NpemVvZihzdHJ1Y3Qgc3lzX3B0X3JlZ3NfcykgLyBzaXplb2YoUFBDX1JFRyldOwotfTsKLQotI2RlZmluZSBVTV9NQVhfUkVHIChQVF9GUFIwKQotI2RlZmluZSBVTV9NQVhfUkVHX09GRlNFVCAoVU1fTUFYX1JFRyAqIHNpemVvZihQUENfUkVHKSkKLQotI2RlZmluZSBFTVBUWV9SRUdTIHsgeyBbIDAgLi4uIE5VTV9SRUdTIC0gMV0gPSAwIH0gfQotCi0jZGVmaW5lIFVNX1JFRyhyLCBuKSAoKHIpLT5yZWdzW25dKQotCi0jZGVmaW5lIFVNX1NZU0NBTExfUkVUKHIpIFVNX1JFRyhyLCBQVF9SMykKLSNkZWZpbmUgVU1fU1AocikgVU1fUkVHKHIsIFBUX1IxKQotI2RlZmluZSBVTV9JUChyKSBVTV9SRUcociwgUFRfTklQKQotI2RlZmluZSBVTV9FTEZfWkVSTyhyKSBVTV9SRUcociwgUFRfRlBTQ1IpCi0jZGVmaW5lIFVNX1NZU0NBTExfTlIocikgVU1fUkVHKHIsIFBUX1IwKQotI2RlZmluZSBVTV9TWVNDQUxMX0FSRzEocikgVU1fUkVHKHIsIFBUX09SSUdfUjMpCi0jZGVmaW5lIFVNX1NZU0NBTExfQVJHMihyKSBVTV9SRUcociwgUFRfUjQpCi0jZGVmaW5lIFVNX1NZU0NBTExfQVJHMyhyKSBVTV9SRUcociwgUFRfUjUpCi0jZGVmaW5lIFVNX1NZU0NBTExfQVJHNChyKSBVTV9SRUcociwgUFRfUjYpCi0jZGVmaW5lIFVNX1NZU0NBTExfQVJHNShyKSBVTV9SRUcociwgUFRfUjcpCi0jZGVmaW5lIFVNX1NZU0NBTExfQVJHNihyKSBVTV9SRUcociwgUFRfUjgpCi0KLSNkZWZpbmUgVU1fU1lTQ0FMTF9OUl9PRkZTRVQgKFBUX1IwICogc2l6ZW9mKFBQQ19SRUcpKQotI2RlZmluZSBVTV9TWVNDQUxMX1JFVF9PRkZTRVQgKFBUX1IzICogc2l6ZW9mKFBQQ19SRUcpKQotI2RlZmluZSBVTV9TWVNDQUxMX0FSRzFfT0ZGU0VUIChQVF9SMyAqIHNpemVvZihQUENfUkVHKSkKLSNkZWZpbmUgVU1fU1lTQ0FMTF9BUkcyX09GRlNFVCAoUFRfUjQgKiBzaXplb2YoUFBDX1JFRykpCi0jZGVmaW5lIFVNX1NZU0NBTExfQVJHM19PRkZTRVQgKFBUX1I1ICogc2l6ZW9mKFBQQ19SRUcpKQotI2RlZmluZSBVTV9TWVNDQUxMX0FSRzRfT0ZGU0VUIChQVF9SNiAqIHNpemVvZihQUENfUkVHKSkKLSNkZWZpbmUgVU1fU1lTQ0FMTF9BUkc1X09GRlNFVCAoUFRfUjcgKiBzaXplb2YoUFBDX1JFRykpCi0jZGVmaW5lIFVNX1NZU0NBTExfQVJHNl9PRkZTRVQgKFBUX1I4ICogc2l6ZW9mKFBQQ19SRUcpKQotI2RlZmluZSBVTV9TUF9PRkZTRVQgKFBUX1IxICogc2l6ZW9mKFBQQ19SRUcpKQotI2RlZmluZSBVTV9JUF9PRkZTRVQgKFBUX05JUCAqIHNpemVvZihQUENfUkVHKSkKLSNkZWZpbmUgVU1fRUxGX1pFUk9fT0ZGU0VUIChQVF9SMyAqIHNpemVvZihQUENfUkVHKSkKLQotI2RlZmluZSBVTV9TRVRfU1lTQ0FMTF9SRVRVUk4oX3JlZ3MsIHJlc3VsdCkJICAgICAgICBcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsJCQkJXAotCQkoX3JlZ3MpLT5yZWdzW1BUX0NDUl0gfD0gMHgxMDAwMDAwMDsJXAotCQlVTV9TWVNDQUxMX1JFVCgoX3JlZ3MpKSA9IC1yZXN1bHQ7CVwKLSAgICAgICAgfSBlbHNlIHsJCQkJCVwKLQkJVU1fU1lTQ0FMTF9SRVQoKF9yZWdzKSkgPSByZXN1bHQ7CVwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSgwKQotCi1leHRlcm4gdm9pZCBzaG92ZV9hdXhfdGFibGUodW5zaWduZWQgbG9uZyBzcCk7Ci0jZGVmaW5lIFVNX0ZJWF9FWEVDX1NUQUNLKHNwKSBzaG92ZV9hdXhfdGFibGUoc3ApOwotCi0vKiBUaGVzZSBhcmVuJ3QgYWN0dWFsbHkgZGVmaW5lZC4gIFRoZSB1bmRlZnMgYXJlIGp1c3QgdG8gbWFrZSBzdXJlCi0gKiBldmVyeW9uZSdzIGNsZWFyIG9uIHRoZSBjb25jZXB0LgotICovCi0jdW5kZWYgVU1MX0hBVkVfR0VUUkVHUwotI3VuZGVmIFVNTF9IQVZFX0dFVEZQUkVHUwotI3VuZGVmIFVNTF9IQVZFX1NFVFJFR1MKLSN1bmRlZiBVTUxfSEFWRV9TRVRGUFJFR1MKLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXBwYy9zaGFyZWQvc3lzZGVwL3NpZ2NvbnRleHQuaCBiL2FyY2gvdW0vc3lzLXBwYy9zaGFyZWQvc3lzZGVwL3NpZ2NvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcyODZmMC4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1wcGMvc2hhcmVkL3N5c2RlcC9zaWdjb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU19TSUdDT05URVhUX1BQQ19ICi0jZGVmaW5lIF9fU1lTX1NJR0NPTlRFWFRfUFBDX0gKLQotI2RlZmluZSBEU0lTUl9XUklURSAweDAyMDAwMDAwCi0KLSNkZWZpbmUgU0NfRkFVTFRfQUREUihzYykgKHsgXAotCQlzdHJ1Y3Qgc2lnY29udGV4dCAqX3NjID0gKHNjKTsgXAotCQlsb25nIHJldHZhbCA9IC0xOyBcCi0JCXN3aXRjaCAoX3NjLT5yZWdzLT50cmFwKSB7IFwKLQkJY2FzZSAweDMwMDogXAotCQkJLyogZGF0YSBleGNlcHRpb24gKi8gXAotCQkJcmV0dmFsID0gX3NjLT5yZWdzLT5kYXI7IFwKLQkJCWJyZWFrOyBcCi0JCWNhc2UgMHg0MDA6IFwKLQkJCS8qIGluc3RydWN0aW9uIGV4Y2VwdGlvbiAqLyBcCi0JCQlyZXR2YWwgPSBfc2MtPnJlZ3MtPm5pcDsgXAotCQkJYnJlYWs7IFwKLQkJZGVmYXVsdDogXAotCQkJcGFuaWMoIlNDX0ZBVUxUX0FERFI6IHVuaGFuZGxlZCB0cmFwIHR5cGVcbiIpOyBcCi0JCX0gXAotCQlyZXR2YWw7IFwKLQl9KQotCi0jZGVmaW5lIFNDX0ZBVUxUX1dSSVRFKHNjKSAoeyBcCi0JCXN0cnVjdCBzaWdjb250ZXh0ICpfc2MgPSAoc2MpOyBcCi0JCWxvbmcgcmV0dmFsID0gLTE7IFwKLQkJc3dpdGNoIChfc2MtPnJlZ3MtPnRyYXApIHsgXAotCQljYXNlIDB4MzAwOiBcCi0JCQkvKiBkYXRhIGV4Y2VwdGlvbiAqLyBcCi0JCQlyZXR2YWwgPSAhIShfc2MtPnJlZ3MtPmRzaXNyICYgRFNJU1JfV1JJVEUpOyBcCi0JCQlicmVhazsgXAotCQljYXNlIDB4NDAwOiBcCi0JCQkvKiBpbnN0cnVjdGlvbiBleGNlcHRpb246IG5vdCBhIHdyaXRlICovIFwKLQkJCXJldHZhbCA9IDA7IFwKLQkJCWJyZWFrOyBcCi0JCWRlZmF1bHQ6IFwKLQkJCXBhbmljKCJTQ19GQVVMVF9BRERSOiB1bmhhbmRsZWQgdHJhcCB0eXBlXG4iKTsgXAotCQl9IFwKLQkJcmV0dmFsOyBcCi0JfSkKLQotI2RlZmluZSBTQ19JUChzYykgKChzYyktPnJlZ3MtPm5pcCkKLSNkZWZpbmUgU0NfU1Aoc2MpICgoc2MpLT5yZWdzLT5ncHJbMV0pCi0jZGVmaW5lIFNFR1ZfSVNfRklYQUJMRShzYykgKDEpCi0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9hcmNoL3VtL3N5cy1wcGMvc2hhcmVkL3N5c2RlcC9za2FzX3B0cmFjZS5oIGIvYXJjaC91bS9zeXMtcHBjL3NoYXJlZC9zeXNkZXAvc2thc19wdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmYmJhYy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1wcGMvc2hhcmVkL3N5c2RlcC9za2FzX3B0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9QUENfU0tBU19QVFJBQ0VfSAotI2RlZmluZSBfX1NZU0RFUF9QUENfU0tBU19QVFJBQ0VfSAotCi1zdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbyB7Ci0gICAgICAgIGludCBpc193cml0ZTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyOwotfTsKLQotc3RydWN0IHB0cmFjZV9sZHQgewotICAgICAgICBpbnQgZnVuYzsKLSAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudDsKLX07Ci0KLSNkZWZpbmUgUFRSQUNFX0xEVCA1NAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvdW0vc3lzLXBwYy9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzLmggYi9hcmNoL3VtL3N5cy1wcGMvc2hhcmVkL3N5c2RlcC9zeXNjYWxscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmY4MTU1Li4wMDAwMDAwCi0tLSBhL2FyY2gvdW0vc3lzLXBwYy9zaGFyZWQvc3lzZGVwL3N5c2NhbGxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiAKLSAqIENvcHlyaWdodCAoQykgMjAwMCBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotdHlwZWRlZiBsb25nIHN5c2NhbGxfaGFuZGxlcl90KHVuc2lnbmVkIGxvbmcgYXJnMSwgdW5zaWduZWQgbG9uZyBhcmcyLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnMywgdW5zaWduZWQgbG9uZyBhcmc0LAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnNSwgdW5zaWduZWQgbG9uZyBhcmc2KTsKLQotI2RlZmluZSBFWEVDVVRFX1NZU0NBTEwoc3lzY2FsbCwgcmVncykgXAotICAgICAgICAoKnN5c19jYWxsX3RhYmxlW3N5c2NhbGxdKShVTV9TWVNDQUxMX0FSRzEoJnJlZ3MpLCBcCi0JCQkgICAgICAgICAgIFVNX1NZU0NBTExfQVJHMigmcmVncyksIFwKLQkJCQkgICBVTV9TWVNDQUxMX0FSRzMoJnJlZ3MpLCBcCi0JCQkJICAgVU1fU1lTQ0FMTF9BUkc0KCZyZWdzKSwgXAotCQkJCSAgIFVNX1NZU0NBTExfQVJHNSgmcmVncyksIFwKLQkJCQkgICBVTV9TWVNDQUxMX0FSRzYoJnJlZ3MpKQotCi1leHRlcm4gc3lzY2FsbF9oYW5kbGVyX3Qgc3lzX21pbmNvcmU7Ci1leHRlcm4gc3lzY2FsbF9oYW5kbGVyX3Qgc3lzX21hZHZpc2U7Ci0KLS8qIG9sZF9tbWFwIG5lZWRzIHRoZSBjb3JyZWN0IHByb3RvdHlwZSBzaW5jZSBzeXNjYWxsX2tlcm4uYyBpbmNsdWRlcwotICogdGhpcyBmaWxlLgotICovCi1pbnQgb2xkX21tYXAodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKLQkgICAgIHVuc2lnbmVkIGxvbmcgcHJvdCwgdW5zaWduZWQgbG9uZyBmbGFncywKLQkgICAgIHVuc2lnbmVkIGxvbmcgZmQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLQotI2RlZmluZSBBUkNIX1NZU0NBTExTIFwKLQlbIF9fTlJfbW9kaWZ5X2xkdCBdID0gc3lzX25pX3N5c2NhbGwsIFwKLQlbIF9fTlJfcGNpY29uZmlnX3JlYWQgXSA9IHN5c19uaV9zeXNjYWxsLCBcCi0JWyBfX05SX3BjaWNvbmZpZ193cml0ZSBdID0gc3lzX25pX3N5c2NhbGwsIFwKLQlbIF9fTlJfcGNpY29uZmlnX2lvYmFzZSBdID0gc3lzX25pX3N5c2NhbGwsIFwKLQlbIF9fTlJfcGl2b3Rfcm9vdCBdID0gc3lzX25pX3N5c2NhbGwsIFwKLQlbIF9fTlJfbXVsdGlwbGV4ZXIgXSA9IHN5c19uaV9zeXNjYWxsLCBcCi0JWyBfX05SX21tYXAgXSA9IG9sZF9tbWFwLCBcCi0JWyBfX05SX21hZHZpc2UgXSA9IHN5c19tYWR2aXNlLCBcCi0JWyBfX05SX21pbmNvcmUgXSA9IHN5c19taW5jb3JlLCBcCi0JWyBfX05SX2lvcGwgXSA9IChzeXNjYWxsX2hhbmRsZXJfdCAqKSBzeXNfbmlfc3lzY2FsbCwgXAotCVsgX19OUl91dGltZXMgXSA9IChzeXNjYWxsX2hhbmRsZXJfdCAqKSBzeXNfdXRpbWVzLCBcCi0JWyBfX05SX2ZhZHZpc2U2NCBdID0gKHN5c2NhbGxfaGFuZGxlcl90ICopIHN5c19mYWR2aXNlNjQsCi0KLSNkZWZpbmUgTEFTVF9BUkNIX1NZU0NBTEwgX19OUl9mYWR2aXNlNjQKLQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtcHBjL3NpZ2NvbnRleHQuYyBiL2FyY2gvdW0vc3lzLXBwYy9zaWdjb250ZXh0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzZjODMuLjAwMDAwMDAKLS0tIGEvYXJjaC91bS9zeXMtcHBjL3NpZ2NvbnRleHQuYworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI2luY2x1ZGUgImFzbS9wdHJhY2UuaCIKLSNpbmNsdWRlICJhc20vc2lnY29udGV4dC5oIgotI2luY2x1ZGUgPHN5c2RlcC9wdHJhY2UuaD4KLQpkaWZmIC0tZ2l0IGEvYXJjaC91bS9zeXMtcHBjL3N5c3JxLmMgYi9hcmNoL3VtL3N5cy1wcGMvc3lzcnEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmMWFkNy4uMDAwMDAwMAotLS0gYS9hcmNoL3VtL3N5cy1wcGMvc3lzcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qIAotICogQ29weXJpZ2h0IChDKSAyMDAxIENocmlzIEVtZXJzb24gKGNlbWVyc29uQGNoaWFyay5ncmVlbmVuZC5vcmcudWspCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgImFzbS9wdHJhY2UuaCIKLSNpbmNsdWRlICJzeXNycS5oIgotCi12b2lkIHNob3dfcmVncyhzdHJ1Y3QgcHRfcmVnc19zdWJhcmNoICpyZWdzKQotewotCXByaW50aygiXG4iKTsKLQlzaG93X3JlZ3NfcHJpbnRfaW5mbyhLRVJOX0RFRkFVTFQpOwotCi0JcHJpbnRrKCJzaG93X3JlZ3MoKTogaW5zZXJ0IHJlZ3MgaGVyZS5cbiIpOwotI2lmIDAKLSAgICAgICAgcHJpbnRrKCJcbiIpOwotICAgICAgICBwcmludGsoIkVJUDogJTA0eDpbPCUwOGx4Pl0gQ1BVOiAlZCIsMHhmZmZmICYgcmVncy0+eGNzLCByZWdzLT5laXAsCi0JICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0gICAgICAgIGlmIChyZWdzLT54Y3MgJiAzKQotICAgICAgICAgICAgICAgIHByaW50aygiIEVTUDogJTA0eDolMDhseCIsMHhmZmZmICYgcmVncy0+eHNzLCByZWdzLT5lc3ApOwotICAgICAgICBwcmludGsoIiBFRkxBR1M6ICUwOGx4XG4iLCByZWdzLT5lZmxhZ3MpOwotICAgICAgICBwcmludGsoIkVBWDogJTA4bHggRUJYOiAlMDhseCBFQ1g6ICUwOGx4IEVEWDogJTA4bHhcbiIsCi0gICAgICAgICAgICAgICAgcmVncy0+ZWF4LCByZWdzLT5lYngsIHJlZ3MtPmVjeCwgcmVncy0+ZWR4KTsKLSAgICAgICAgcHJpbnRrKCJFU0k6ICUwOGx4IEVESTogJTA4bHggRUJQOiAlMDhseCIsCi0gICAgICAgICAgICAgICAgcmVncy0+ZXNpLCByZWdzLT5lZGksIHJlZ3MtPmVicCk7Ci0gICAgICAgIHByaW50aygiIERTOiAlMDR4IEVTOiAlMDR4XG4iLAotICAgICAgICAgICAgICAgIDB4ZmZmZiAmIHJlZ3MtPnhkcywgMHhmZmZmICYgcmVncy0+eGVzKTsKLSNlbmRpZgotCi0gICAgICAgIHNob3dfdHJhY2UoY3VycmVudCwgJnJlZ3MtPmdwclsxXSk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC91bmljb3JlMzIvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCA2M2UyODM5Li5lNzlhZDZkIDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gvdW5pY29yZTMyL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTI0LDcgKzI0LDYgQEAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIHN0cnVjdCB0YXNrX3N0cnVjdDsKLXN0cnVjdCBleGVjX2RvbWFpbjsKIAogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogCkBAIC03MSw3ICs3MCw2IEBACiAJCQkJCQkvKiA8MCA9PiBidWcgKi8KIAltbV9zZWdtZW50X3QJCWFkZHJfbGltaXQ7CS8qIGFkZHJlc3MgbGltaXQgKi8KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CQkvKiBtYWluIHRhc2sgc3RydWN0dXJlICovCi0Jc3RydWN0IGV4ZWNfZG9tYWluCSpleGVjX2RvbWFpbjsJLyogZXhlY3V0aW9uIGRvbWFpbiAqLwogCV9fdTMyCQkJY3B1OwkJLyogY3B1ICovCiAJc3RydWN0IGNwdV9jb250ZXh0X3NhdmUJY3B1X2NvbnRleHQ7CS8qIGNwdSBjb250ZXh0ICovCiAJX191MzIJCQlzeXNjYWxsOwkvKiBzeXNjYWxsIG51bWJlciAqLwpAQCAtODQsNyArODIsNiBAQAogI2RlZmluZSBJTklUX1RIUkVBRF9JTkZPKHRzaykJCQkJCQlcCiB7CQkJCQkJCQkJXAogCS50YXNrCQk9ICZ0c2ssCQkJCQkJXAotCS5leGVjX2RvbWFpbgk9ICZkZWZhdWx0X2V4ZWNfZG9tYWluLAkJCQlcCiAJLmZsYWdzCQk9IDAsCQkJCQkJXAogCS5wcmVlbXB0X2NvdW50CT0gSU5JVF9QUkVFTVBUX0NPVU5ULAkJCQlcCiAJLmFkZHJfbGltaXQJPSBLRVJORUxfRFMsCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IGZmY2JlNzUuLjgwZDUwYzQgMTAwNjQ0Ci0tLSBhL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC00Miw3ICs0Miw2IEBACiAJREVGSU5FKFRJX1BSRUVNUFQsCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgcHJlZW1wdF9jb3VudCkpOwogCURFRklORShUSV9BRERSX0xJTUlULAlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGFkZHJfbGltaXQpKTsKIAlERUZJTkUoVElfVEFTSywJCW9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdGFzaykpOwotCURFRklORShUSV9FWEVDX0RPTUFJTiwJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBleGVjX2RvbWFpbikpOwogCURFRklORShUSV9DUFUsCQlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIGNwdSkpOwogCURFRklORShUSV9DUFVfU0FWRSwJb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBjcHVfY29udGV4dCkpOwogCURFRklORShUSV9VU0VEX0NQLAlvZmZzZXRvZihzdHJ1Y3QgdGhyZWFkX2luZm8sIHVzZWRfY3ApKTsKZGlmZiAtLWdpdCBhL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9wY2kuYyBiL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9wY2kuYwppbmRleCAzNzRhMDU1Li5kNDVmYTVmIDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC91bmljb3JlMzIva2VybmVsL3BjaS5jCkBAIC0yNjYsMTcgKzI2NiwxMCBAQAogCXBjaV9maXh1cF9pcnFzKHBjaV9jb21tb25fc3dpenpsZSwgcGNpX3B1djNfbWFwX2lycSk7CiAKIAlpZiAoIXBjaV9oYXNfZmxhZyhQQ0lfUFJPQkVfT05MWSkpIHsKLQkJLyoKLQkJICogU2l6ZSB0aGUgYnJpZGdlIHdpbmRvd3MuCi0JCSAqLwogCQlwY2lfYnVzX3NpemVfYnJpZGdlcyhwdXYzX2J1cyk7Ci0KLQkJLyoKLQkJICogQXNzaWduIHJlc291cmNlcy4KLQkJICovCiAJCXBjaV9idXNfYXNzaWduX3Jlc291cmNlcyhwdXYzX2J1cyk7CiAJfQotCisJcGNpX2J1c19hZGRfZGV2aWNlcyhwdXYzX2J1cyk7CiAJcmV0dXJuIDA7CiB9CiBzdWJzeXNfaW5pdGNhbGwocGNpX2NvbW1vbl9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9zaWduYWwuYwppbmRleCBkMzI5Zjg1Li40YWU1MWNmIDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC91bmljb3JlMzIva2VybmVsL3NpZ25hbC5jCkBAIC0zMzAsMTMgKzMzMCw2IEBACiAJfQogCiAJLyoKLQkgKiB0cmFuc2xhdGUgdGhlIHNpZ25hbAotCSAqLwotCWlmICh1c2lnIDwgMzIgJiYgdGhyZWFkLT5leGVjX2RvbWFpbgotCQkJJiYgdGhyZWFkLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcCkKLQkJdXNpZyA9IHRocmVhZC0+ZXhlY19kb21haW4tPnNpZ25hbF9pbnZtYXBbdXNpZ107Ci0KLQkvKgogCSAqIFNldCB1cCB0aGUgc3RhY2sgZnJhbWUKIAkgKi8KIAlpZiAoa3NpZy0+a2Euc2Euc2FfZmxhZ3MgJiBTQV9TSUdJTkZPKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZyBiL2FyY2gveDg2L0tjb25maWcKaW5kZXggYjdkMzFjYS4uZDQzZTdlMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZworKysgYi9hcmNoL3g4Ni9LY29uZmlnCkBAIC04Nyw3ICs4Nyw3IEBACiAJc2VsZWN0IEhBVkVfQVJDSF9LTUVNQ0hFQ0sKIAlzZWxlY3QgSEFWRV9BUkNIX0tBU0FOIGlmIFg4Nl82NCAmJiBTUEFSU0VNRU1fVk1FTU1BUAogCXNlbGVjdCBIQVZFX1VTRVJfUkVUVVJOX05PVElGSUVSCi0Jc2VsZWN0IEFSQ0hfQklORk1UX0VMRl9SQU5ET01JWkVfUElFCisJc2VsZWN0IEFSQ0hfSEFTX0VMRl9SQU5ET01JWkUKIAlzZWxlY3QgSEFWRV9BUkNIX0pVTVBfTEFCRUwKIAlzZWxlY3QgQVJDSF9IQVNfQVRPTUlDNjRfREVDX0lGX1BPU0lUSVZFCiAJc2VsZWN0IFNQQVJTRV9JUlEKQEAgLTk5LDYgKzk5LDcgQEAKIAlzZWxlY3QgSVJRX0ZPUkNFRF9USFJFQURJTkcKIAlzZWxlY3QgSEFWRV9CUEZfSklUIGlmIFg4Nl82NAogCXNlbGVjdCBIQVZFX0FSQ0hfVFJBTlNQQVJFTlRfSFVHRVBBR0UKKwlzZWxlY3QgSEFWRV9BUkNIX0hVR0VfVk1BUCBpZiBYODZfNjQgfHwgKFg4Nl8zMiAmJiBYODZfUEFFKQogCXNlbGVjdCBBUkNIX0hBU19TR19DSEFJTgogCXNlbGVjdCBDTEtFVlRfSTgyNTMKIAlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKQEAgLTIzNSwxMiArMjM2LDEwIEBACiAJZGVmX2Jvb2wgeQogCiBjb25maWcgWk9ORV9ETUEzMgotCWJvb2wKLQlkZWZhdWx0IFg4Nl82NAorCWRlZl9ib29sIHkgaWYgWDg2XzY0CiAKIGNvbmZpZyBBVURJVF9BUkNICi0JYm9vbAotCWRlZmF1bHQgWDg2XzY0CisJZGVmX2Jvb2wgeSBpZiBYODZfNjQKIAogY29uZmlnIEFSQ0hfU1VQUE9SVFNfT1BUSU1JWkVEX0lOTElOSU5HCiAJZGVmX2Jvb2wgeQpAQCAtMjc5LDYgKzI3OCwxMiBAQAogY29uZmlnIEZJWF9FQVJMWUNPTl9NRU0KIAlkZWZfYm9vbCB5CiAKK2NvbmZpZyBQR1RBQkxFX0xFVkVMUworCWludAorCWRlZmF1bHQgNCBpZiBYODZfNjQKKwlkZWZhdWx0IDMgaWYgWDg2X1BBRQorCWRlZmF1bHQgMgorCiBzb3VyY2UgImluaXQvS2NvbmZpZyIKIHNvdXJjZSAia2VybmVsL0tjb25maWcuZnJlZXplciIKIApAQCAtNzE2LDE3ICs3MjEsNiBAQAogY29uZmlnIE5PX0JPT1RNRU0KIAlkZWZfYm9vbCB5CiAKLWNvbmZpZyBNRU1URVNUCi0JYm9vbCAiTWVtdGVzdCIKLQktLS1oZWxwLS0tCi0JICBUaGlzIG9wdGlvbiBhZGRzIGEga2VybmVsIHBhcmFtZXRlciAnbWVtdGVzdCcsIHdoaWNoIGFsbG93cyBtZW10ZXN0Ci0JICB0byBiZSBzZXQuCi0JICAgICAgICBtZW10ZXN0PTAsIG1lYW4gZGlzYWJsZWQ7IC0tIGRlZmF1bHQKLQkgICAgICAgIG1lbXRlc3Q9MSwgbWVhbiBkbyAxIHRlc3QgcGF0dGVybjsKLQkgICAgICAgIC4uLgotCSAgICAgICAgbWVtdGVzdD00LCBtZWFuIGRvIDQgdGVzdCBwYXR0ZXJucy4KLQkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5zd2VyIE4uCi0KIHNvdXJjZSAiYXJjaC94ODYvS2NvbmZpZy5jcHUiCiAKIGNvbmZpZyBIUEVUX1RJTUVSCkBAIC04OTEsNyArODg1LDggQEAKICAgICAgICBkZXBlbmRzIG9uICFTTVAgJiYgWDg2X0xPQ0FMX0FQSUMKIAogY29uZmlnIFg4Nl9VUF9BUElDCi0JYm9vbCAiTG9jYWwgQVBJQyBzdXBwb3J0IG9uIHVuaXByb2Nlc3NvcnMiCisJYm9vbCAiTG9jYWwgQVBJQyBzdXBwb3J0IG9uIHVuaXByb2Nlc3NvcnMiIGlmICFQQ0lfTVNJCisJZGVmYXVsdCBQQ0lfTVNJCiAJZGVwZW5kcyBvbiBYODZfMzIgJiYgIVNNUCAmJiAhWDg2XzMyX05PTl9TVEFOREFSRAogCS0tLWhlbHAtLS0KIAkgIEEgbG9jYWwgQVBJQyAoQWR2YW5jZWQgUHJvZ3JhbW1hYmxlIEludGVycnVwdCBDb250cm9sbGVyKSBpcyBhbgpAQCAtOTAzLDEwICs4OTgsNiBAQAogCSAgcGVyZm9ybWFuY2UgY291bnRlcnMpLCBhbmQgdGhlIE5NSSB3YXRjaGRvZyB3aGljaCBkZXRlY3RzIGhhcmQKIAkgIGxvY2t1cHMuCiAKLWNvbmZpZyBYODZfVVBfQVBJQ19NU0kKLQlkZWZfYm9vbCB5Ci0Jc2VsZWN0IFg4Nl9VUF9BUElDIGlmIFg4Nl8zMiAmJiAhU01QICYmICFYODZfMzJfTk9OX1NUQU5EQVJEICYmIFBDSV9NU0kKLQogY29uZmlnIFg4Nl9VUF9JT0FQSUMKIAlib29sICJJTy1BUElDIHN1cHBvcnQgb24gdW5pcHJvY2Vzc29ycyIKIAlkZXBlbmRzIG9uIFg4Nl9VUF9BUElDCkBAIC05MjUsOCArOTE2LDggQEAKIAlzZWxlY3QgR0VORVJJQ19JUlFfTEVHQUNZX0FMTE9DX0hXSVJRCiAKIGNvbmZpZyBYODZfSU9fQVBJQwotCWRlZl9ib29sIFg4Nl82NCB8fCBTTVAgfHwgWDg2XzMyX05PTl9TVEFOREFSRCB8fCBYODZfVVBfSU9BUElDCi0JZGVwZW5kcyBvbiBYODZfTE9DQUxfQVBJQworCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIFg4Nl9MT0NBTF9BUElDIHx8IFg4Nl9VUF9JT0FQSUMKIAlzZWxlY3QgSVJRX0RPTUFJTgogCiBjb25maWcgWDg2X1JFUk9VVEVfRk9SX0JST0tFTl9CT09UX0lSUVMKQEAgLTExNDUsMTAgKzExMzYsMTAgQEAKIAlkZXBlbmRzIG9uIE1JQ1JPQ09ERQogCiBjb25maWcgTUlDUk9DT0RFX0lOVEVMX0VBUkxZCi0JZGVmX2Jvb2wgbgorCWJvb2wKIAogY29uZmlnIE1JQ1JPQ09ERV9BTURfRUFSTFkKLQlkZWZfYm9vbCBuCisJYm9vbAogCiBjb25maWcgTUlDUk9DT0RFX0VBUkxZCiAJYm9vbCAiRWFybHkgbG9hZCBtaWNyb2NvZGUiCkBAIC0xMzAwLDE0ICsxMjkxLDE0IEBACiAJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gWDg2XzY0IHx8IEhJR0hNRU02NEcKIAotY29uZmlnIERJUkVDVF9HQlBBR0VTCi0JYm9vbCAiRW5hYmxlIDFHQiBwYWdlcyBmb3Iga2VybmVsIHBhZ2V0YWJsZXMiIGlmIEVYUEVSVAotCWRlZmF1bHQgeQotCWRlcGVuZHMgb24gWDg2XzY0Citjb25maWcgWDg2X0RJUkVDVF9HQlBBR0VTCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gWDg2XzY0ICYmICFERUJVR19QQUdFQUxMT0MgJiYgIUtNRU1DSEVDSwogCS0tLWhlbHAtLS0KLQkgIEFsbG93IHRoZSBrZXJuZWwgbGluZWFyIG1hcHBpbmcgdG8gdXNlIDFHQiBwYWdlcyBvbiBDUFVzIHRoYXQKLQkgIHN1cHBvcnQgaXQuIFRoaXMgY2FuIGltcHJvdmUgdGhlIGtlcm5lbCdzIHBlcmZvcm1hbmNlIGEgdGlueSBiaXQgYnkKLQkgIHJlZHVjaW5nIFRMQiBwcmVzc3VyZS4gSWYgaW4gZG91YnQsIHNheSAiWSIuCisJICBDZXJ0YWluIGtlcm5lbCBmZWF0dXJlcyBlZmZlY3RpdmVseSBkaXNhYmxlIGtlcm5lbAorCSAgbGluZWFyIDEgR0IgbWFwcGluZ3MgKGV2ZW4gaWYgdGhlIENQVSBvdGhlcndpc2UKKwkgIHN1cHBvcnRzIHRoZW0pLCBzbyBkb24ndCBjb25mdXNlIHRoZSB1c2VyIGJ5IHByaW50aW5nCisJICB0aGF0IHdlIGhhdmUgdGhlbSBlbmFibGVkLgogCiAjIENvbW1vbiBOVU1BIEZlYXR1cmVzCiBjb25maWcgTlVNQQpAQCAtMTc0NywxNCArMTczOCwxMSBAQAogCWRlcGVuZHMgb24gS0VYRUNfRklMRQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIG1ha2VzIGtlcm5lbCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIG1hbmRhdG9yeSBmb3IKLQkgIGtleGVjX2ZpbGVfbG9hZCgpIHN5c2NhbGwuIElmIGtlcm5lbCBpcyBzaWduYXR1cmUgY2FuIG5vdCBiZQotCSAgdmVyaWZpZWQsIGtleGVjX2ZpbGVfbG9hZCgpIHdpbGwgZmFpbC4KKwkgIHRoZSBrZXhlY19maWxlX2xvYWQoKSBzeXNjYWxsLgogCi0JICBUaGlzIG9wdGlvbiBlbmZvcmNlcyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGF0IGdlbmVyaWMgbGV2ZWwuCi0JICBPbmUgbmVlZHMgdG8gZW5hYmxlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZm9yIHR5cGUgb2Yga2VybmVsCi0JICBpbWFnZSBiZWluZyBsb2FkZWQgdG8gbWFrZSBzdXJlIGl0IHdvcmtzLiBGb3IgZXhhbXBsZSwgZW5hYmxlCi0JICBiekltYWdlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gb3B0aW9uIHRvIGJlIGFibGUgdG8gbG9hZCBhbmQKLQkgIHZlcmlmeSBzaWduYXR1cmVzIG9mIGJ6SW1hZ2UuIE90aGVyd2lzZSBrZXJuZWwgbG9hZGluZyB3aWxsIGZhaWwuCisJICBJbiBhZGRpdGlvbiB0byB0aGF0IG9wdGlvbiwgeW91IG5lZWQgdG8gZW5hYmxlIHNpZ25hdHVyZQorCSAgdmVyaWZpY2F0aW9uIGZvciB0aGUgY29ycmVzcG9uZGluZyBrZXJuZWwgaW1hZ2UgdHlwZSBiZWluZworCSAgbG9hZGVkIGluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmsuCiAKIGNvbmZpZyBLRVhFQ19CWklNQUdFX1ZFUklGWV9TSUcKIAlib29sICJFbmFibGUgYnpJbWFnZSBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHN1cHBvcnQiCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9NYWtlZmlsZSBiL2FyY2gveDg2L01ha2VmaWxlCmluZGV4IDViYTJkOWMuLjJmZGEwMDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L01ha2VmaWxlCisrKyBiL2FyY2gveDg2L01ha2VmaWxlCkBAIC02Myw3ICs2Myw3IEBACiAJCQkJJChjYWxsIGNjLW9wdGlvbiwtZm5vLXVuaXQtYXQtYS10aW1lKSkKIAogICAgICAgICAjIENQVS1zcGVjaWZpYyB0dW5pbmcuIEFueXRoaW5nIHdoaWNoIGNhbiBiZSBzaGFyZWQgd2l0aCBVTUwgc2hvdWxkIGdvIGhlcmUuCi0gICAgICAgIGluY2x1ZGUgJChzcmN0cmVlKS9hcmNoL3g4Ni9NYWtlZmlsZV8zMi5jcHUKKyAgICAgICAgaW5jbHVkZSBhcmNoL3g4Ni9NYWtlZmlsZV8zMi5jcHUKICAgICAgICAgS0JVSUxEX0NGTEFHUyArPSAkKGNmbGFncy15KQogCiAgICAgICAgICMgdGVtcG9yYXJ5IHVudGlsIHN0cmluZy5oIGlzIGZpeGVkCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9NYWtlZmlsZS51bSBiL2FyY2gveDg2L01ha2VmaWxlLnVtCmluZGV4IDk1ZWJhNTUuLjViN2U4OTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L01ha2VmaWxlLnVtCisrKyBiL2FyY2gveDg2L01ha2VmaWxlLnVtCkBAIC0xOCw3ICsxOCw3IEBACiBleHBvcnQgTERTX0VYVFJBCiAKICMgRmlyc3Qgb2YgYWxsLCB0dW5lIENGTEFHUyBmb3IgdGhlIHNwZWNpZmljIENQVS4gVGhpcyBhY3R1YWxseSBzZXRzIGNmbGFncy15LgotaW5jbHVkZSAkKHNyY3RyZWUpL2FyY2gveDg2L01ha2VmaWxlXzMyLmNwdQoraW5jbHVkZSBhcmNoL3g4Ni9NYWtlZmlsZV8zMi5jcHUKIAogIyBwcmV2ZW50IGdjYyBmcm9tIGtlZXBpbmcgdGhlIHN0YWNrIDE2IGJ5dGUgYWxpZ25lZC4gVGFrZW4gZnJvbSBpMzg2LgogY2ZsYWdzLXkgKz0gJChjYWxsIGNjLW9wdGlvbiwtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2FzbHIuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9hc2xyLmMKaW5kZXggNzA4M2MxNi4uZDdiMWY2NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2FzbHIuYworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvYXNsci5jCkBAIC0xNCwxMyArMTQsNiBAQAogc3RhdGljIGNvbnN0IGNoYXIgYnVpbGRfc3RyW10gPSBVVFNfUkVMRUFTRSAiICgiIExJTlVYX0NPTVBJTEVfQlkgIkAiCiAJCUxJTlVYX0NPTVBJTEVfSE9TVCAiKSAoIiBMSU5VWF9DT01QSUxFUiAiKSAiIFVUU19WRVJTSU9OOwogCi1zdHJ1Y3Qga2FzbHJfc2V0dXBfZGF0YSB7Ci0JX191NjQgbmV4dDsKLQlfX3UzMiB0eXBlOwotCV9fdTMyIGxlbjsKLQlfX3U4IGRhdGFbMV07Ci19IGthc2xyX3NldHVwX2RhdGE7Ci0KICNkZWZpbmUgSTgyNTRfUE9SVF9DT05UUk9MCTB4NDMKICNkZWZpbmUgSTgyNTRfUE9SVF9DT1VOVEVSMAkweDQwCiAjZGVmaW5lIEk4MjU0X0NNRF9SRUFEQkFDSwkweEMwCkBAIC0zMDIsMjggKzI5NSw3IEBACiAJcmV0dXJuIHNsb3RzX2ZldGNoX3JhbmRvbSgpOwogfQogCi1zdGF0aWMgdm9pZCBhZGRfa2FzbHJfc2V0dXBfZGF0YShzdHJ1Y3QgYm9vdF9wYXJhbXMgKnBhcmFtcywgX191OCBlbmFibGVkKQotewotCXN0cnVjdCBzZXR1cF9kYXRhICpkYXRhOwotCi0Ja2FzbHJfc2V0dXBfZGF0YS50eXBlID0gU0VUVVBfS0FTTFI7Ci0Ja2FzbHJfc2V0dXBfZGF0YS5sZW4gPSAxOwotCWthc2xyX3NldHVwX2RhdGEubmV4dCA9IDA7Ci0Ja2FzbHJfc2V0dXBfZGF0YS5kYXRhWzBdID0gZW5hYmxlZDsKLQotCWRhdGEgPSAoc3RydWN0IHNldHVwX2RhdGEgKikodW5zaWduZWQgbG9uZylwYXJhbXMtPmhkci5zZXR1cF9kYXRhOwotCi0Jd2hpbGUgKGRhdGEgJiYgZGF0YS0+bmV4dCkKLQkJZGF0YSA9IChzdHJ1Y3Qgc2V0dXBfZGF0YSAqKSh1bnNpZ25lZCBsb25nKWRhdGEtPm5leHQ7Ci0KLQlpZiAoZGF0YSkKLQkJZGF0YS0+bmV4dCA9ICh1bnNpZ25lZCBsb25nKSZrYXNscl9zZXR1cF9kYXRhOwotCWVsc2UKLQkJcGFyYW1zLT5oZHIuc2V0dXBfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZrYXNscl9zZXR1cF9kYXRhOwotCi19Ci0KLXVuc2lnbmVkIGNoYXIgKmNob29zZV9rZXJuZWxfbG9jYXRpb24oc3RydWN0IGJvb3RfcGFyYW1zICpwYXJhbXMsCit1bnNpZ25lZCBjaGFyICpjaG9vc2Vfa2VybmVsX2xvY2F0aW9uKHN0cnVjdCBib290X3BhcmFtcyAqYm9vdF9wYXJhbXMsCiAJCQkJICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbnB1dF9zaXplLAogCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwKQEAgLTMzNSwxNyArMzA3LDE2IEBACiAjaWZkZWYgQ09ORklHX0hJQkVSTkFUSU9OCiAJaWYgKCFjbWRsaW5lX2ZpbmRfb3B0aW9uX2Jvb2woImthc2xyIikpIHsKIAkJZGVidWdfcHV0c3RyKCJLQVNMUiBkaXNhYmxlZCBieSBkZWZhdWx0Li4uXG4iKTsKLQkJYWRkX2thc2xyX3NldHVwX2RhdGEocGFyYW1zLCAwKTsKIAkJZ290byBvdXQ7CiAJfQogI2Vsc2UKIAlpZiAoY21kbGluZV9maW5kX29wdGlvbl9ib29sKCJub2thc2xyIikpIHsKIAkJZGVidWdfcHV0c3RyKCJLQVNMUiBkaXNhYmxlZCBieSBjbWRsaW5lLi4uXG4iKTsKLQkJYWRkX2thc2xyX3NldHVwX2RhdGEocGFyYW1zLCAwKTsKIAkJZ290byBvdXQ7CiAJfQogI2VuZGlmCi0JYWRkX2thc2xyX3NldHVwX2RhdGEocGFyYW1zLCAxKTsKKworCWJvb3RfcGFyYW1zLT5oZHIubG9hZGZsYWdzIHw9IEtBU0xSX0ZMQUc7CiAKIAkvKiBSZWNvcmQgdGhlIHZhcmlvdXMga25vd24gdW5zYWZlIG1lbW9yeSByYW5nZXMuICovCiAJbWVtX2F2b2lkX2luaXQoKHVuc2lnbmVkIGxvbmcpaW5wdXQsIGlucHV0X3NpemUsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUwppbmRleCAxZDdmYmJjLi44ZWY5NjRkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9ib290Lmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgogCiAJX19IRUFECiBFTlRSWShzdGFydHVwXzMyKQpAQCAtMTAyLDcgKzEwMyw3IEBACiAJICogVGVzdCBLRUVQX1NFR01FTlRTIGZsYWcgdG8gc2VlIGlmIHRoZSBib290bG9hZGVyIGlzIGFza2luZwogCSAqIHVzIHRvIG5vdCByZWxvYWQgc2VnbWVudHMKIAkgKi8KLQl0ZXN0YgkkKDE8PDYpLCBCUF9sb2FkZmxhZ3MoJWVzaSkKKwl0ZXN0YgkkS0VFUF9TRUdNRU5UUywgQlBfbG9hZGZsYWdzKCVlc2kpCiAJam56CTFmCiAKIAljbGkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TCmluZGV4IDZiMTc2NmMuLmIwYzBkMTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGFzbS9tc3IuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL2Jvb3RwYXJhbS5oPgogCiAJX19IRUFECiAJLmNvZGUzMgpAQCAtNDYsNyArNDcsNyBAQAogCSAqIFRlc3QgS0VFUF9TRUdNRU5UUyBmbGFnIHRvIHNlZSBpZiB0aGUgYm9vdGxvYWRlciBpcyBhc2tpbmcKIAkgKiB1cyB0byBub3QgcmVsb2FkIHNlZ21lbnRzCiAJICovCi0JdGVzdGIgJCgxPDw2KSwgQlBfbG9hZGZsYWdzKCVlc2kpCisJdGVzdGIgJEtFRVBfU0VHTUVOVFMsIEJQX2xvYWRmbGFncyglZXNpKQogCWpueiAxZgogCiAJY2xpCkBAIC0xNjQsNyArMTY1LDcgQEAKIAkvKiBBZnRlciBnZHQgaXMgbG9hZGVkICovCiAJeG9ybAklZWF4LCAlZWF4CiAJbGxkdAklYXgKLQltb3ZsICAgICQweDIwLCAlZWF4CisJbW92bCAgICAkX19CT09UX1RTUywgJWVheAogCWx0cgklYXgKIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYwppbmRleCA1OTAzMDg5Li5hMTA3YjkzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKQEAgLTM3Nyw2ICszNzcsOSBAQAogCiAJcmVhbF9tb2RlID0gcm1vZGU7CiAKKwkvKiBDbGVhciBpdCBmb3Igc29sZWx5IGluLWtlcm5lbCB1c2UgKi8KKwlyZWFsX21vZGUtPmhkci5sb2FkZmxhZ3MgJj0gfktBU0xSX0ZMQUc7CisKIAlzYW5pdGl6ZV9ib290X3BhcmFtcyhyZWFsX21vZGUpOwogCiAJaWYgKHJlYWxfbW9kZS0+c2NyZWVuX2luZm8ub3JpZ192aWRlb19tb2RlID09IDcpIHsKQEAgLTQwMSw4ICs0MDQsNyBAQAogCSAqIHRoZSBlbnRpcmUgZGVjb21wcmVzc2VkIGtlcm5lbCBwbHVzIHJlbG9jYXRpb24gdGFibGUsIG9yIHRoZQogCSAqIGVudGlyZSBkZWNvbXByZXNzZWQga2VybmVsIHBsdXMgLmJzcyBhbmQgLmJyayBzZWN0aW9ucy4KIAkgKi8KLQlvdXRwdXQgPSBjaG9vc2Vfa2VybmVsX2xvY2F0aW9uKHJlYWxfbW9kZSwgaW5wdXRfZGF0YSwgaW5wdXRfbGVuLAotCQkJCQlvdXRwdXQsCisJb3V0cHV0ID0gY2hvb3NlX2tlcm5lbF9sb2NhdGlvbihyZWFsX21vZGUsIGlucHV0X2RhdGEsIGlucHV0X2xlbiwgb3V0cHV0LAogCQkJCQlvdXRwdXRfbGVuID4gcnVuX3NpemUgPyBvdXRwdXRfbGVuCiAJCQkJCQkJICAgICAgOiBydW5fc2l6ZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmggYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5oCmluZGV4IGVlMzU3NmIuLjg5ZGQwZDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmgKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuaApAQCAtNTcsNyArNTcsNyBAQAogCiAjaWYgQ09ORklHX1JBTkRPTUlaRV9CQVNFCiAvKiBhc2xyLmMgKi8KLXVuc2lnbmVkIGNoYXIgKmNob29zZV9rZXJuZWxfbG9jYXRpb24oc3RydWN0IGJvb3RfcGFyYW1zICpwYXJhbXMsCit1bnNpZ25lZCBjaGFyICpjaG9vc2Vfa2VybmVsX2xvY2F0aW9uKHN0cnVjdCBib290X3BhcmFtcyAqYm9vdF9wYXJhbXMsCiAJCQkJICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbnB1dF9zaXplLAogCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwKQEAgLTY2LDcgKzY2LDcgQEAKIGJvb2wgaGFzX2NwdWZsYWcoaW50IGZsYWcpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUKLXVuc2lnbmVkIGNoYXIgKmNob29zZV9rZXJuZWxfbG9jYXRpb24oc3RydWN0IGJvb3RfcGFyYW1zICpwYXJhbXMsCit1bnNpZ25lZCBjaGFyICpjaG9vc2Vfa2VybmVsX2xvY2F0aW9uKHN0cnVjdCBib290X3BhcmFtcyAqYm9vdF9wYXJhbXMsCiAJCQkJICAgICAgdW5zaWduZWQgY2hhciAqaW5wdXQsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpbnB1dF9zaXplLAogCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmMgYi9hcmNoL3g4Ni9ib290L3N0cmluZy5jCmluZGV4IDQ5M2YzZmQuLjMxOGI4NDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3Qvc3RyaW5nLmMKKysrIGIvYXJjaC94ODYvYm9vdC9zdHJpbmcuYwpAQCAtMzAsNyArMzAsNyBAQAogCWludCBkZWx0YSA9IDA7CiAKIAl3aGlsZSAoKnMxIHx8ICpzMikgewotCQlkZWx0YSA9ICpzMiAtICpzMTsKKwkJZGVsdGEgPSAqczEgLSAqczI7CiAJCWlmIChkZWx0YSkKIAkJCXJldHVybiBkZWx0YTsKIAkJczErKzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvdmlkZW8tbW9kZS5jIGIvYXJjaC94ODYvYm9vdC92aWRlby1tb2RlLmMKaW5kZXggNzQ4ZThkMC4uYWE4YTk2YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC92aWRlby1tb2RlLmMKKysrIGIvYXJjaC94ODYvYm9vdC92aWRlby1tb2RlLmMKQEAgLTIyLDEwICsyMiw4IEBACiAvKgogICogQ29tbW9uIHZhcmlhYmxlcwogICovCi1pbnQgYWRhcHRlcjsJCQkvKiAwPUNHQS9NREEvSEdDLCAxPUVHQSwgMj1WR0ErICovCi11MTYgdmlkZW9fc2VnbWVudDsKK2ludCBhZGFwdGVyOwkJLyogMD1DR0EvTURBL0hHQywgMT1FR0EsIDI9VkdBKyAqLwogaW50IGZvcmNlX3gsIGZvcmNlX3k7CS8qIERvbid0IHF1ZXJ5IHRoZSBCSU9TIGZvciBjb2xzL3Jvd3MgKi8KLQogaW50IGRvX3Jlc3RvcmU7CQkvKiBTY3JlZW4gY29udGVudHMgY2hhbmdlZCBkdXJpbmcgbW9kZSBmbGlwICovCiBpbnQgZ3JhcGhpY19tb2RlOwkvKiBHcmFwaGljIG1vZGUgd2l0aCBsaW5lYXIgZnJhbWUgYnVmZmVyICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvdmlkZW8uYyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8uYwppbmRleCA0M2VkYTI4Li4wNTExMWJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L3ZpZGVvLmMKKysrIGIvYXJjaC94ODYvYm9vdC92aWRlby5jCkBAIC0xNyw2ICsxNyw4IEBACiAjaW5jbHVkZSAidmlkZW8uaCIKICNpbmNsdWRlICJ2ZXNhLmgiCiAKK3N0YXRpYyB1MTYgdmlkZW9fc2VnbWVudDsKKwogc3RhdGljIHZvaWQgc3RvcmVfY3Vyc29yX3Bvc2l0aW9uKHZvaWQpCiB7CiAJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3ZpZGVvLmggYi9hcmNoL3g4Ni9ib290L3ZpZGVvLmgKaW5kZXggMGJiMjU0OS4uYjU0ZTAzMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC92aWRlby5oCisrKyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8uaApAQCAtOTEsNyArOTEsNiBAQAogI2RlZmluZSBBREFQVEVSX1ZHQQkyCiAKIGV4dGVybiBpbnQgYWRhcHRlcjsKLWV4dGVybiB1MTYgdmlkZW9fc2VnbWVudDsKIGV4dGVybiBpbnQgZm9yY2VfeCwgZm9yY2VfeTsJLyogRG9uJ3QgcXVlcnkgdGhlIEJJT1MgZm9yIGNvbHMvcm93cyAqLwogZXh0ZXJuIGludCBkb19yZXN0b3JlOwkJLyogUmVzdG9yZSBzY3JlZW4gY29udGVudHMgKi8KIGV4dGVybiBpbnQgZ3JhcGhpY19tb2RlOwkvKiBHcmFwaGljcyBtb2RlIHdpdGggbGluZWFyIGZyYW1lIGJ1ZmZlciAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY29uZmlncy9pMzg2X2RlZmNvbmZpZyBiL2FyY2gveDg2L2NvbmZpZ3MvaTM4Nl9kZWZjb25maWcKaW5kZXggNDE5ODE5ZC4uYWFhMTExOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY29uZmlncy9pMzg2X2RlZmNvbmZpZworKysgYi9hcmNoL3g4Ni9jb25maWdzL2kzODZfZGVmY29uZmlnCkBAIC0yNDgsNyArMjQ4LDcgQEAKIENPTkZJR19VU0JfQU5OT1VOQ0VfTkVXX0RFVklDRVM9eQogQ09ORklHX1VTQl9NT049eQogQ09ORklHX1VTQl9FSENJX0hDRD15Ci0jIENPTkZJR19VU0JfRUhDSV9UVF9ORVdTQ0hFRCBpcyBub3Qgc2V0CitDT05GSUdfVVNCX0VIQ0lfVFRfTkVXU0NIRUQ9eQogQ09ORklHX1VTQl9PSENJX0hDRD15CiBDT05GSUdfVVNCX1VIQ0lfSENEPXkKIENPTkZJR19VU0JfUFJJTlRFUj15CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWcgYi9hcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWcKaW5kZXggNGMzMTFkZC4uMzE1Yjg2MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY29uZmlncy94ODZfNjRfZGVmY29uZmlnCisrKyBiL2FyY2gveDg2L2NvbmZpZ3MveDg2XzY0X2RlZmNvbmZpZwpAQCAtMjQzLDcgKzI0Myw3IEBACiBDT05GSUdfVVNCX0FOTk9VTkNFX05FV19ERVZJQ0VTPXkKIENPTkZJR19VU0JfTU9OPXkKIENPTkZJR19VU0JfRUhDSV9IQ0Q9eQotIyBDT05GSUdfVVNCX0VIQ0lfVFRfTkVXU0NIRUQgaXMgbm90IHNldAorQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEPXkKIENPTkZJR19VU0JfT0hDSV9IQ0Q9eQogQ09ORklHX1VTQl9VSENJX0hDRD15CiBDT05GSUdfVVNCX1BSSU5URVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL2Flc25pLWludGVsX2dsdWUuYyBiL2FyY2gveDg2L2NyeXB0by9hZXNuaS1pbnRlbF9nbHVlLmMKaW5kZXggOTQ3YzZiZi4uMTEyY2VmYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL2Flc25pLWludGVsX2dsdWUuYworKysgYi9hcmNoL3g4Ni9jcnlwdG8vYWVzbmktaW50ZWxfZ2x1ZS5jCkBAIC03OTcsNyArNzk3LDkgQEAKIAkJUFRSX0FMSUdOKCh1OCAqKWNyeXB0b190Zm1fY3R4KHRmbSksIEFFU05JX0FMSUdOKTsKIAlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmNyeXB0ZF9jaGlsZDsKIAlzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4ICpjaGlsZF9jdHg7Ci0JY3J5cHRkX3RmbSA9IGNyeXB0ZF9hbGxvY19hZWFkKCJfX2RyaXZlci1nY20tYWVzLWFlc25pIiwgMCwgMCk7CisJY3J5cHRkX3RmbSA9IGNyeXB0ZF9hbGxvY19hZWFkKCJfX2RyaXZlci1nY20tYWVzLWFlc25pIiwKKwkJCQkgICAgICAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKKwkJCQkgICAgICAgQ1JZUFRPX0FMR19JTlRFUk5BTCk7CiAJaWYgKElTX0VSUihjcnlwdGRfdGZtKSkKIAkJcmV0dXJuIFBUUl9FUlIoY3J5cHRkX3RmbSk7CiAKQEAgLTg5MCwxNSArODkyLDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCByZmM0MTA2X3NldF9rZXkoc3RydWN0IGNyeXB0b19hZWFkICpwYXJlbnQsIGNvbnN0IHU4ICprZXksCi0JCQkJCQkgICB1bnNpZ25lZCBpbnQga2V5X2xlbikKK3N0YXRpYyBpbnQgY29tbW9uX3JmYzQxMDZfc2V0X2tleShzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQsIGNvbnN0IHU4ICprZXksCisJCQkJICB1bnNpZ25lZCBpbnQga2V5X2xlbikKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtID0gY3J5cHRvX2FlYWRfdGZtKHBhcmVudCk7Ci0Jc3RydWN0IGFlc25pX3JmYzQxMDZfZ2NtX2N0eCAqY3R4ID0gYWVzbmlfcmZjNDEwNl9nY21fY3R4X2dldChwYXJlbnQpOwotCXN0cnVjdCBjcnlwdG9fYWVhZCAqY3J5cHRkX2NoaWxkID0gY3J5cHRkX2FlYWRfY2hpbGQoY3R4LT5jcnlwdGRfdGZtKTsKLQlzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4ICpjaGlsZF9jdHggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVzbmlfcmZjNDEwNl9nY21fY3R4X2dldChjcnlwdGRfY2hpbGQpOworCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0gPSBjcnlwdG9fYWVhZF90Zm0oYWVhZCk7CisJc3RydWN0IGFlc25pX3JmYzQxMDZfZ2NtX2N0eCAqY3R4ID0gYWVzbmlfcmZjNDEwNl9nY21fY3R4X2dldChhZWFkKTsKIAl1OCAqbmV3X2tleV9hbGlnbiwgKm5ld19rZXlfbWVtID0gTlVMTDsKIAogCWlmIChrZXlfbGVuIDwgNCkgewpAQCAtOTQzLDIwICs5NDIsMzEgQEAKIAkJZ290byBleGl0OwogCX0KIAlyZXQgPSByZmM0MTA2X3NldF9oYXNoX3N1YmtleShjdHgtPmhhc2hfc3Via2V5LCBrZXksIGtleV9sZW4pOwotCW1lbWNweShjaGlsZF9jdHgsIGN0eCwgc2l6ZW9mKCpjdHgpKTsKIGV4aXQ6CiAJa2ZyZWUobmV3X2tleV9tZW0pOwogCXJldHVybiByZXQ7CiB9CiAKLS8qIFRoaXMgaXMgdGhlIEludGVncml0eSBDaGVjayBWYWx1ZSAoYWthIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcgbGVuZ3RoIGFuZCBjYW4KLSAqIGJlIDgsIDEyIG9yIDE2IGJ5dGVzIGxvbmcuICovCi1zdGF0aWMgaW50IHJmYzQxMDZfc2V0X2F1dGhzaXplKHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LAotCQkJCXVuc2lnbmVkIGludCBhdXRoc2l6ZSkKK3N0YXRpYyBpbnQgcmZjNDEwNl9zZXRfa2V5KHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LCBjb25zdCB1OCAqa2V5LAorCQkJICAgdW5zaWduZWQgaW50IGtleV9sZW4pCiB7CiAJc3RydWN0IGFlc25pX3JmYzQxMDZfZ2NtX2N0eCAqY3R4ID0gYWVzbmlfcmZjNDEwNl9nY21fY3R4X2dldChwYXJlbnQpOwotCXN0cnVjdCBjcnlwdG9fYWVhZCAqY3J5cHRkX2NoaWxkID0gY3J5cHRkX2FlYWRfY2hpbGQoY3R4LT5jcnlwdGRfdGZtKTsKKwlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmNoaWxkID0gY3J5cHRkX2FlYWRfY2hpbGQoY3R4LT5jcnlwdGRfdGZtKTsKKwlzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4ICpjX2N0eCA9IGFlc25pX3JmYzQxMDZfZ2NtX2N0eF9nZXQoY2hpbGQpOworCXN0cnVjdCBjcnlwdGRfYWVhZCAqY3J5cHRkX3RmbSA9IGN0eC0+Y3J5cHRkX3RmbTsKKwlpbnQgcmV0OwogCisJcmV0ID0gY3J5cHRvX2FlYWRfc2V0a2V5KGNoaWxkLCBrZXksIGtleV9sZW4pOworCWlmICghcmV0KSB7CisJCW1lbWNweShjdHgsIGNfY3R4LCBzaXplb2YoKmN0eCkpOworCQljdHgtPmNyeXB0ZF90Zm0gPSBjcnlwdGRfdGZtOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbW1vbl9yZmM0MTA2X3NldF9hdXRoc2l6ZShzdHJ1Y3QgY3J5cHRvX2FlYWQgKmFlYWQsCisJCQkJICAgICAgIHVuc2lnbmVkIGludCBhdXRoc2l6ZSkKK3sKIAlzd2l0Y2ggKGF1dGhzaXplKSB7CiAJY2FzZSA4OgogCWNhc2UgMTI6CkBAIC05NjUsNTEgKzk3NSwyMyBAQAogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQljcnlwdG9fYWVhZF9jcnQocGFyZW50KS0+YXV0aHNpemUgPSBhdXRoc2l6ZTsKLQljcnlwdG9fYWVhZF9jcnQoY3J5cHRkX2NoaWxkKS0+YXV0aHNpemUgPSBhdXRoc2l6ZTsKKwljcnlwdG9fYWVhZF9jcnQoYWVhZCktPmF1dGhzaXplID0gYXV0aHNpemU7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmZjNDEwNl9lbmNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKKy8qIFRoaXMgaXMgdGhlIEludGVncml0eSBDaGVjayBWYWx1ZSAoYWthIHRoZSBhdXRoZW50aWNhdGlvbiB0YWcgbGVuZ3RoIGFuZCBjYW4KKyAqIGJlIDgsIDEyIG9yIDE2IGJ5dGVzIGxvbmcuICovCitzdGF0aWMgaW50IHJmYzQxMDZfc2V0X2F1dGhzaXplKHN0cnVjdCBjcnlwdG9fYWVhZCAqcGFyZW50LAorCQkJCXVuc2lnbmVkIGludCBhdXRoc2l6ZSkKIHsKKwlzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4ICpjdHggPSBhZXNuaV9yZmM0MTA2X2djbV9jdHhfZ2V0KHBhcmVudCk7CisJc3RydWN0IGNyeXB0b19hZWFkICpjaGlsZCA9IGNyeXB0ZF9hZWFkX2NoaWxkKGN0eC0+Y3J5cHRkX3RmbSk7CiAJaW50IHJldDsKLQlzdHJ1Y3QgY3J5cHRvX2FlYWQgKnRmbSA9IGNyeXB0b19hZWFkX3JlcXRmbShyZXEpOwotCXN0cnVjdCBhZXNuaV9yZmM0MTA2X2djbV9jdHggKmN0eCA9IGFlc25pX3JmYzQxMDZfZ2NtX2N0eF9nZXQodGZtKTsKIAotCWlmICghaXJxX2ZwdV91c2FibGUoKSkgewotCQlzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICpjcnlwdGRfcmVxID0KLQkJCShzdHJ1Y3QgYWVhZF9yZXF1ZXN0ICopIGFlYWRfcmVxdWVzdF9jdHgocmVxKTsKLQkJbWVtY3B5KGNyeXB0ZF9yZXEsIHJlcSwgc2l6ZW9mKCpyZXEpKTsKLQkJYWVhZF9yZXF1ZXN0X3NldF90Zm0oY3J5cHRkX3JlcSwgJmN0eC0+Y3J5cHRkX3RmbS0+YmFzZSk7Ci0JCXJldHVybiBjcnlwdG9fYWVhZF9lbmNyeXB0KGNyeXB0ZF9yZXEpOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBjcnlwdG9fYWVhZCAqY3J5cHRkX2NoaWxkID0gY3J5cHRkX2FlYWRfY2hpbGQoY3R4LT5jcnlwdGRfdGZtKTsKLQkJa2VybmVsX2ZwdV9iZWdpbigpOwotCQlyZXQgPSBjcnlwdGRfY2hpbGQtPmJhc2UuY3J0X2FlYWQuZW5jcnlwdChyZXEpOwotCQlrZXJuZWxfZnB1X2VuZCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLX0KLQotc3RhdGljIGludCByZmM0MTA2X2RlY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGNyeXB0b19hZWFkICp0Zm0gPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKLQlzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4ICpjdHggPSBhZXNuaV9yZmM0MTA2X2djbV9jdHhfZ2V0KHRmbSk7Ci0KLQlpZiAoIWlycV9mcHVfdXNhYmxlKCkpIHsKLQkJc3RydWN0IGFlYWRfcmVxdWVzdCAqY3J5cHRkX3JlcSA9Ci0JCQkoc3RydWN0IGFlYWRfcmVxdWVzdCAqKSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7Ci0JCW1lbWNweShjcnlwdGRfcmVxLCByZXEsIHNpemVvZigqcmVxKSk7Ci0JCWFlYWRfcmVxdWVzdF9zZXRfdGZtKGNyeXB0ZF9yZXEsICZjdHgtPmNyeXB0ZF90Zm0tPmJhc2UpOwotCQlyZXR1cm4gY3J5cHRvX2FlYWRfZGVjcnlwdChjcnlwdGRfcmVxKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgY3J5cHRvX2FlYWQgKmNyeXB0ZF9jaGlsZCA9IGNyeXB0ZF9hZWFkX2NoaWxkKGN0eC0+Y3J5cHRkX3RmbSk7Ci0JCWtlcm5lbF9mcHVfYmVnaW4oKTsKLQkJcmV0ID0gY3J5cHRkX2NoaWxkLT5iYXNlLmNydF9hZWFkLmRlY3J5cHQocmVxKTsKLQkJa2VybmVsX2ZwdV9lbmQoKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJcmV0ID0gY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUoY2hpbGQsIGF1dGhzaXplKTsKKwlpZiAoIXJldCkKKwkJY3J5cHRvX2FlYWRfY3J0KHBhcmVudCktPmF1dGhzaXplID0gYXV0aHNpemU7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX2RyaXZlcl9yZmM0MTA2X2VuY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKQpAQCAtMTE1NSw3ICsxMTM3LDcgQEAKIAkJc3JjID0ga21hbGxvYyhyZXEtPmNyeXB0bGVuICsgcmVxLT5hc3NvY2xlbiwgR0ZQX0FUT01JQyk7CiAJCWlmICghc3JjKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWFzc29jID0gKHNyYyArIHJlcS0+Y3J5cHRsZW4gKyBhdXRoX3RhZ19sZW4pOworCQlhc3NvYyA9IChzcmMgKyByZXEtPmNyeXB0bGVuKTsKIAkJc2NhdHRlcndhbGtfbWFwX2FuZF9jb3B5KHNyYywgcmVxLT5zcmMsIDAsIHJlcS0+Y3J5cHRsZW4sIDApOwogCQlzY2F0dGVyd2Fsa19tYXBfYW5kX2NvcHkoYXNzb2MsIHJlcS0+YXNzb2MsIDAsCiAJCQlyZXEtPmFzc29jbGVuLCAwKTsKQEAgLTExODAsMTEgKzExNjIsODMgQEAKIAkJc2NhdHRlcndhbGtfZG9uZSgmc3JjX3NnX3dhbGssIDAsIDApOwogCQlzY2F0dGVyd2Fsa19kb25lKCZhc3NvY19zZ193YWxrLCAwLCAwKTsKIAl9IGVsc2UgewotCQlzY2F0dGVyd2Fsa19tYXBfYW5kX2NvcHkoZHN0LCByZXEtPmRzdCwgMCwgcmVxLT5jcnlwdGxlbiwgMSk7CisJCXNjYXR0ZXJ3YWxrX21hcF9hbmRfY29weShkc3QsIHJlcS0+ZHN0LCAwLCB0ZW1wQ2lwaGVyTGVuLCAxKTsKIAkJa2ZyZWUoc3JjKTsKIAl9CiAJcmV0dXJuIHJldHZhbDsKIH0KKworc3RhdGljIGludCByZmM0MTA2X2VuY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKQoreworCWludCByZXQ7CisJc3RydWN0IGNyeXB0b19hZWFkICp0Zm0gPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4ICpjdHggPSBhZXNuaV9yZmM0MTA2X2djbV9jdHhfZ2V0KHRmbSk7CisKKwlpZiAoIWlycV9mcHVfdXNhYmxlKCkpIHsKKwkJc3RydWN0IGFlYWRfcmVxdWVzdCAqY3J5cHRkX3JlcSA9CisJCQkoc3RydWN0IGFlYWRfcmVxdWVzdCAqKSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7CisKKwkJbWVtY3B5KGNyeXB0ZF9yZXEsIHJlcSwgc2l6ZW9mKCpyZXEpKTsKKwkJYWVhZF9yZXF1ZXN0X3NldF90Zm0oY3J5cHRkX3JlcSwgJmN0eC0+Y3J5cHRkX3RmbS0+YmFzZSk7CisJCXJldCA9IGNyeXB0b19hZWFkX2VuY3J5cHQoY3J5cHRkX3JlcSk7CisJfSBlbHNlIHsKKwkJa2VybmVsX2ZwdV9iZWdpbigpOworCQlyZXQgPSBfX2RyaXZlcl9yZmM0MTA2X2VuY3J5cHQocmVxKTsKKwkJa2VybmVsX2ZwdV9lbmQoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZmM0MTA2X2RlY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKQoreworCWludCByZXQ7CisJc3RydWN0IGNyeXB0b19hZWFkICp0Zm0gPSBjcnlwdG9fYWVhZF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgYWVzbmlfcmZjNDEwNl9nY21fY3R4ICpjdHggPSBhZXNuaV9yZmM0MTA2X2djbV9jdHhfZ2V0KHRmbSk7CisKKwlpZiAoIWlycV9mcHVfdXNhYmxlKCkpIHsKKwkJc3RydWN0IGFlYWRfcmVxdWVzdCAqY3J5cHRkX3JlcSA9CisJCQkoc3RydWN0IGFlYWRfcmVxdWVzdCAqKSBhZWFkX3JlcXVlc3RfY3R4KHJlcSk7CisKKwkJbWVtY3B5KGNyeXB0ZF9yZXEsIHJlcSwgc2l6ZW9mKCpyZXEpKTsKKwkJYWVhZF9yZXF1ZXN0X3NldF90Zm0oY3J5cHRkX3JlcSwgJmN0eC0+Y3J5cHRkX3RmbS0+YmFzZSk7CisJCXJldCA9IGNyeXB0b19hZWFkX2RlY3J5cHQoY3J5cHRkX3JlcSk7CisJfSBlbHNlIHsKKwkJa2VybmVsX2ZwdV9iZWdpbigpOworCQlyZXQgPSBfX2RyaXZlcl9yZmM0MTA2X2RlY3J5cHQocmVxKTsKKwkJa2VybmVsX2ZwdV9lbmQoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoZWxwZXJfcmZjNDEwNl9lbmNyeXB0KHN0cnVjdCBhZWFkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmV0OworCisJaWYgKHVubGlrZWx5KCFpcnFfZnB1X3VzYWJsZSgpKSkgeworCQlXQVJOX09OQ0UoMSwgIl9fZ2NtLWFlcy1hZXNuaSBhbGcgdXNlZCBpbiBpbnZhbGlkIGNvbnRleHQiKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlrZXJuZWxfZnB1X2JlZ2luKCk7CisJCXJldCA9IF9fZHJpdmVyX3JmYzQxMDZfZW5jcnlwdChyZXEpOworCQlrZXJuZWxfZnB1X2VuZCgpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhlbHBlcl9yZmM0MTA2X2RlY3J5cHQoc3RydWN0IGFlYWRfcmVxdWVzdCAqcmVxKQoreworCWludCByZXQ7CisKKwlpZiAodW5saWtlbHkoIWlycV9mcHVfdXNhYmxlKCkpKSB7CisJCVdBUk5fT05DRSgxLCAiX19nY20tYWVzLWFlc25pIGFsZyB1c2VkIGluIGludmFsaWQgY29udGV4dCIpOworCQlyZXQgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCWtlcm5lbF9mcHVfYmVnaW4oKTsKKwkJcmV0ID0gX19kcml2ZXJfcmZjNDEwNl9kZWNyeXB0KHJlcSk7CisJCWtlcm5lbF9mcHVfZW5kKCk7CisJfQorCXJldHVybiByZXQ7Cit9CiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnIGFlc25pX2FsZ3NbXSA9IHsgewpAQCAtMTIxMCw3ICsxMjY0LDcgQEAKIAkuY3JhX25hbWUJCT0gIl9fYWVzLWFlc25pIiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWFlcy1hZXNuaSIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIgfCBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IEFFU19CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IGNyeXB0b19hZXNfY3R4KSArCiAJCQkJICBBRVNOSV9BTElHTiAtIDEsCkBAIC0xMjI5LDcgKzEyODMsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19lY2ItYWVzLWFlc25pIiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWVjYi1hZXMtYWVzbmkiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gQUVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgY3J5cHRvX2Flc19jdHgpICsKIAkJCQkgIEFFU05JX0FMSUdOIC0gMSwKQEAgLTEyNDksNyArMTMwNCw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX2NiYy1hZXMtYWVzbmkiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY2JjLWFlcy1hZXNuaSIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSBBRVNfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjcnlwdG9fYWVzX2N0eCkgKwogCQkJCSAgQUVTTklfQUxJR04gLSAxLApAQCAtMTMxMyw3ICsxMzY5LDggQEAKIAkuY3JhX25hbWUJCT0gIl9fY3RyLWFlcy1hZXNuaSIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1jdHItYWVzLWFlc25pIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IDEsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgY3J5cHRvX2Flc19jdHgpICsKIAkJCQkgIEFFU05JX0FMSUdOIC0gMSwKQEAgLTEzNTcsNyArMTQxNCw3IEBACiAJLmNyYV9uYW1lCQk9ICJfX2djbS1hZXMtYWVzbmkiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItZ2NtLWFlcy1hZXNuaSIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0FFQUQsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQUVBRCB8IENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gMSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBhZXNuaV9yZmM0MTA2X2djbV9jdHgpICsKIAkJCQkgIEFFU05JX0FMSUdOLApAQCAtMTM2Niw4ICsxNDIzLDEyIEBACiAJLmNyYV9tb2R1bGUJCT0gVEhJU19NT0RVTEUsCiAJLmNyYV91ID0gewogCQkuYWVhZCA9IHsKLQkJCS5lbmNyeXB0CT0gX19kcml2ZXJfcmZjNDEwNl9lbmNyeXB0LAotCQkJLmRlY3J5cHQJPSBfX2RyaXZlcl9yZmM0MTA2X2RlY3J5cHQsCisJCQkuc2V0a2V5CQk9IGNvbW1vbl9yZmM0MTA2X3NldF9rZXksCisJCQkuc2V0YXV0aHNpemUJPSBjb21tb25fcmZjNDEwNl9zZXRfYXV0aHNpemUsCisJCQkuZW5jcnlwdAk9IGhlbHBlcl9yZmM0MTA2X2VuY3J5cHQsCisJCQkuZGVjcnlwdAk9IGhlbHBlcl9yZmM0MTA2X2RlY3J5cHQsCisJCQkuaXZzaXplCQk9IDgsCisJCQkubWF4YXV0aHNpemUJPSAxNiwKIAkJfSwKIAl9LAogfSwgewpAQCAtMTQyMyw3ICsxNDg0LDggQEAKIAkuY3JhX25hbWUJCT0gIl9fbHJ3LWFlcy1hZXNuaSIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1scnctYWVzLWFlc25pIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IEFFU19CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IGFlc25pX2xyd19jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC0xNDQ0LDcgKzE1MDYsOCBAQAogCS5jcmFfbmFtZQkJPSAiX194dHMtYWVzLWFlc25pIiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLXh0cy1hZXMtYWVzbmkiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gQUVTX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgYWVzbmlfeHRzX2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9jYW1lbGxpYV9hZXNuaV9hdngyX2dsdWUuYyBiL2FyY2gveDg2L2NyeXB0by9jYW1lbGxpYV9hZXNuaV9hdngyX2dsdWUuYwppbmRleCA5YTA3ZmFmLi5iYWYwYWMyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vY2FtZWxsaWFfYWVzbmlfYXZ4Ml9nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL2NhbWVsbGlhX2Flc25pX2F2eDJfZ2x1ZS5jCkBAIC0zNDMsNyArMzQzLDggQEAKIAkuY3JhX25hbWUJCT0gIl9fZWNiLWNhbWVsbGlhLWFlc25pLWF2eDIiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItZWNiLWNhbWVsbGlhLWFlc25pLWF2eDIiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gQ0FNRUxMSUFfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjYW1lbGxpYV9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC0zNjIsNyArMzYzLDggQEAKIAkuY3JhX25hbWUJCT0gIl9fY2JjLWNhbWVsbGlhLWFlc25pLWF2eDIiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY2JjLWNhbWVsbGlhLWFlc25pLWF2eDIiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gQ0FNRUxMSUFfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjYW1lbGxpYV9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC0zODEsNyArMzgzLDggQEAKIAkuY3JhX25hbWUJCT0gIl9fY3RyLWNhbWVsbGlhLWFlc25pLWF2eDIiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY3RyLWNhbWVsbGlhLWFlc25pLWF2eDIiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gMSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjYW1lbGxpYV9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC00MDEsNyArNDA0LDggQEAKIAkuY3JhX25hbWUJCT0gIl9fbHJ3LWNhbWVsbGlhLWFlc25pLWF2eDIiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItbHJ3LWNhbWVsbGlhLWFlc25pLWF2eDIiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gQ0FNRUxMSUFfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjYW1lbGxpYV9scndfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSAwLApAQCAtNDI0LDcgKzQyOCw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX3h0cy1jYW1lbGxpYS1hZXNuaS1hdngyIiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLXh0cy1jYW1lbGxpYS1hZXNuaS1hdngyIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IENBTUVMTElBX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgY2FtZWxsaWFfeHRzX2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9jYW1lbGxpYV9hZXNuaV9hdnhfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL2NhbWVsbGlhX2Flc25pX2F2eF9nbHVlLmMKaW5kZXggZWQzOGQ5NS4uNzg4MThhMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL2NhbWVsbGlhX2Flc25pX2F2eF9nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL2NhbWVsbGlhX2Flc25pX2F2eF9nbHVlLmMKQEAgLTMzNSw3ICszMzUsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19lY2ItY2FtZWxsaWEtYWVzbmkiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItZWNiLWNhbWVsbGlhLWFlc25pIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IENBTUVMTElBX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgY2FtZWxsaWFfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSAwLApAQCAtMzU0LDcgKzM1NSw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX2NiYy1jYW1lbGxpYS1hZXNuaSIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1jYmMtY2FtZWxsaWEtYWVzbmkiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gQ0FNRUxMSUFfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjYW1lbGxpYV9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC0zNzMsNyArMzc1LDggQEAKIAkuY3JhX25hbWUJCT0gIl9fY3RyLWNhbWVsbGlhLWFlc25pIiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWN0ci1jYW1lbGxpYS1hZXNuaSIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSAxLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IGNhbWVsbGlhX2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKQEAgLTM5Myw3ICszOTYsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19scnctY2FtZWxsaWEtYWVzbmkiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItbHJ3LWNhbWVsbGlhLWFlc25pIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IENBTUVMTElBX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgY2FtZWxsaWFfbHJ3X2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKQEAgLTQxNiw3ICs0MjAsOCBAQAogCS5jcmFfbmFtZQkJPSAiX194dHMtY2FtZWxsaWEtYWVzbmkiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXIteHRzLWNhbWVsbGlhLWFlc25pIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IENBTUVMTElBX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgY2FtZWxsaWFfeHRzX2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9jYXN0NV9hdnhfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL2Nhc3Q1X2F2eF9nbHVlLmMKaW5kZXggNjBhZGE2Ny4uMjM2YzgwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL2Nhc3Q1X2F2eF9nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL2Nhc3Q1X2F2eF9nbHVlLmMKQEAgLTM0MSw3ICszNDEsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19lY2ItY2FzdDUtYXZ4IiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWVjYi1jYXN0NS1hdngiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gQ0FTVDVfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjYXN0NV9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC0zNjAsNyArMzYxLDggQEAKIAkuY3JhX25hbWUJCT0gIl9fY2JjLWNhc3Q1LWF2eCIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1jYmMtY2FzdDUtYXZ4IiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IENBU1Q1X0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgY2FzdDVfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSAwLApAQCAtMzc5LDcgKzM4MSw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX2N0ci1jYXN0NS1hdngiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY3RyLWNhc3Q1LWF2eCIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSAxLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IGNhc3Q1X2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9jYXN0Nl9hdnhfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL2Nhc3Q2X2F2eF9nbHVlLmMKaW5kZXggMDE2MGY2OC4uZjQ0ODgxMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL2Nhc3Q2X2F2eF9nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL2Nhc3Q2X2F2eF9nbHVlLmMKQEAgLTM3Miw3ICszNzIsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19lY2ItY2FzdDYtYXZ4IiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWVjYi1jYXN0Ni1hdngiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gQ0FTVDZfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjYXN0Nl9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC0zOTEsNyArMzkyLDggQEAKIAkuY3JhX25hbWUJCT0gIl9fY2JjLWNhc3Q2LWF2eCIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1jYmMtY2FzdDYtYXZ4IiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IENBU1Q2X0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgY2FzdDZfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSAwLApAQCAtNDEwLDcgKzQxMiw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX2N0ci1jYXN0Ni1hdngiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY3RyLWNhc3Q2LWF2eCIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSAxLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IGNhc3Q2X2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKQEAgLTQzMCw3ICs0MzMsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19scnctY2FzdDYtYXZ4IiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWxydy1jYXN0Ni1hdngiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gQ0FTVDZfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBjYXN0Nl9scndfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSAwLApAQCAtNDUzLDcgKzQ1Nyw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX3h0cy1jYXN0Ni1hdngiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXIteHRzLWNhc3Q2LWF2eCIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSBDQVNUNl9CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IGNhc3Q2X3h0c19jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vY3JjMzJjLXBjbC1pbnRlbC1hc21fNjQuUyBiL2FyY2gveDg2L2NyeXB0by9jcmMzMmMtcGNsLWludGVsLWFzbV82NC5TCmluZGV4IDI2ZDQ5ZWIuLjIyNWJlMDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9jcmMzMmMtcGNsLWludGVsLWFzbV82NC5TCisrKyBiL2FyY2gveDg2L2NyeXB0by9jcmMzMmMtcGNsLWludGVsLWFzbV82NC5TCkBAIC0xNzgsNyArMTc4LDcgQEAKIAkjIyAyYSkgUFJPQ0VTUyBGVUxMIEJMT0NLUzoKIAkjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBmdWxsX2Jsb2NrOgotCW1vdnEgICAgJDEyOCwlcmF4CisJbW92bCAgICAkMTI4LCVlYXgKIAlsZWEgICAgIDEyOCo4KjIoYmxvY2tfMCksIGJsb2NrXzEKIAlsZWEgICAgIDEyOCo4KjMoYmxvY2tfMCksIGJsb2NrXzIKIAlhZGQgICAgICQxMjgqOCoxLCBibG9ja18wCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vZ2hhc2gtY2xtdWxuaS1pbnRlbF9nbHVlLmMgYi9hcmNoL3g4Ni9jcnlwdG8vZ2hhc2gtY2xtdWxuaS1pbnRlbF9nbHVlLmMKaW5kZXggODI1M2Q4NS4uMjA3OWJhZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL2doYXNoLWNsbXVsbmktaW50ZWxfZ2x1ZS5jCisrKyBiL2FyY2gveDg2L2NyeXB0by9naGFzaC1jbG11bG5pLWludGVsX2dsdWUuYwpAQCAtMTU0LDcgKzE1NCw4IEBACiAJCS5jcmFfbmFtZQkJPSAiX19naGFzaCIsCiAJCS5jcmFfZHJpdmVyX25hbWUJPSAiX19naGFzaC1wY2xtdWxxZHFuaSIsCiAJCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfU0hBU0gsCisJCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX1NIQVNIIHwKKwkJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCQkuY3JhX2Jsb2Nrc2l6ZQkJPSBHSEFTSF9CTE9DS19TSVpFLAogCQkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBnaGFzaF9jdHgpLAogCQkuY3JhX21vZHVsZQkJPSBUSElTX01PRFVMRSwKQEAgLTI2MSw3ICsyNjIsOSBAQAogCXN0cnVjdCBjcnlwdGRfYWhhc2ggKmNyeXB0ZF90Zm07CiAJc3RydWN0IGdoYXNoX2FzeW5jX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAotCWNyeXB0ZF90Zm0gPSBjcnlwdGRfYWxsb2NfYWhhc2goIl9fZ2hhc2gtcGNsbXVscWRxbmkiLCAwLCAwKTsKKwljcnlwdGRfdGZtID0gY3J5cHRkX2FsbG9jX2FoYXNoKCJfX2doYXNoLXBjbG11bHFkcW5pIiwKKwkJCQkJQ1JZUFRPX0FMR19JTlRFUk5BTCwKKwkJCQkJQ1JZUFRPX0FMR19JTlRFUk5BTCk7CiAJaWYgKElTX0VSUihjcnlwdGRfdGZtKSkKIAkJcmV0dXJuIFBUUl9FUlIoY3J5cHRkX3RmbSk7CiAJY3R4LT5jcnlwdGRfdGZtID0gY3J5cHRkX3RmbTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9nbHVlX2hlbHBlci5jIGIvYXJjaC94ODYvY3J5cHRvL2dsdWVfaGVscGVyLmMKaW5kZXggNDMyZjFkNzYuLjZhODU1OTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9nbHVlX2hlbHBlci5jCisrKyBiL2FyY2gveDg2L2NyeXB0by9nbHVlX2hlbHBlci5jCkBAIC0yMzIsNyArMjMyLDYgQEAKIAogCWxlMTI4X3RvX2JlMTI4KChiZTEyOCAqKXdhbGstPml2LCAmY3RyYmxrKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGdsdWVfY3RyX2NyeXB0X2ZpbmFsXzEyOGJpdCk7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19nbHVlX2N0cl9jcnlwdF8xMjhiaXQoY29uc3Qgc3RydWN0IGNvbW1vbl9nbHVlX2N0eCAqZ2N0eCwKIAkJCQkJICAgIHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9zZXJwZW50X2F2eDJfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL3NlcnBlbnRfYXZ4Ml9nbHVlLmMKaW5kZXggNDM3ZTQ3YS4uMmY2M2RjOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL3NlcnBlbnRfYXZ4Ml9nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL3NlcnBlbnRfYXZ4Ml9nbHVlLmMKQEAgLTMwOSw3ICszMDksOCBAQAogCS5jcmFfbmFtZQkJPSAiX19lY2Itc2VycGVudC1hdngyIiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWVjYi1zZXJwZW50LWF2eDIiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gU0VSUEVOVF9CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IHNlcnBlbnRfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSAwLApAQCAtMzI5LDcgKzMzMCw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX2NiYy1zZXJwZW50LWF2eDIiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY2JjLXNlcnBlbnQtYXZ4MiIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSBTRVJQRU5UX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3Qgc2VycGVudF9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC0zNDksNyArMzUxLDggQEAKIAkuY3JhX25hbWUJCT0gIl9fY3RyLXNlcnBlbnQtYXZ4MiIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1jdHItc2VycGVudC1hdngyIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IDEsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3Qgc2VycGVudF9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC0zNzAsNyArMzczLDggQEAKIAkuY3JhX25hbWUJCT0gIl9fbHJ3LXNlcnBlbnQtYXZ4MiIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1scnctc2VycGVudC1hdngyIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IFNFUlBFTlRfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBzZXJwZW50X2xyd19jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC0zOTQsNyArMzk4LDggQEAKIAkuY3JhX25hbWUJCT0gIl9feHRzLXNlcnBlbnQtYXZ4MiIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci14dHMtc2VycGVudC1hdngyIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IFNFUlBFTlRfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBzZXJwZW50X3h0c19jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vc2VycGVudF9hdnhfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL3NlcnBlbnRfYXZ4X2dsdWUuYwppbmRleCA3ZTIxNzM5Li5jOGQ0NzhhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vc2VycGVudF9hdnhfZ2x1ZS5jCisrKyBiL2FyY2gveDg2L2NyeXB0by9zZXJwZW50X2F2eF9nbHVlLmMKQEAgLTM3OCw3ICszNzgsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19lY2Itc2VycGVudC1hdngiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItZWNiLXNlcnBlbnQtYXZ4IiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IFNFUlBFTlRfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBzZXJwZW50X2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKQEAgLTM5Nyw3ICszOTgsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19jYmMtc2VycGVudC1hdngiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY2JjLXNlcnBlbnQtYXZ4IiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IFNFUlBFTlRfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBzZXJwZW50X2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKQEAgLTQxNiw3ICs0MTgsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19jdHItc2VycGVudC1hdngiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY3RyLXNlcnBlbnQtYXZ4IiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IDEsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3Qgc2VycGVudF9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC00MzYsNyArNDM5LDggQEAKIAkuY3JhX25hbWUJCT0gIl9fbHJ3LXNlcnBlbnQtYXZ4IiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWxydy1zZXJwZW50LWF2eCIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSBTRVJQRU5UX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3Qgc2VycGVudF9scndfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSAwLApAQCAtNDU5LDcgKzQ2Myw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX3h0cy1zZXJwZW50LWF2eCIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci14dHMtc2VycGVudC1hdngiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gU0VSUEVOVF9CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IHNlcnBlbnRfeHRzX2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9zZXJwZW50X3NzZTJfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL3NlcnBlbnRfc3NlMl9nbHVlLmMKaW5kZXggYmYwMjVhZC4uMzY0M2RkNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL3NlcnBlbnRfc3NlMl9nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL3NlcnBlbnRfc3NlMl9nbHVlLmMKQEAgLTM4Nyw3ICszODcsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19lY2Itc2VycGVudC1zc2UyIiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWVjYi1zZXJwZW50LXNzZTIiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gU0VSUEVOVF9CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IHNlcnBlbnRfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSAwLApAQCAtNDA2LDcgKzQwNyw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX2NiYy1zZXJwZW50LXNzZTIiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY2JjLXNlcnBlbnQtc3NlMiIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSBTRVJQRU5UX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3Qgc2VycGVudF9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC00MjUsNyArNDI3LDggQEAKIAkuY3JhX25hbWUJCT0gIl9fY3RyLXNlcnBlbnQtc3NlMiIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1jdHItc2VycGVudC1zc2UyIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IDEsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3Qgc2VycGVudF9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC00NDUsNyArNDQ4LDggQEAKIAkuY3JhX25hbWUJCT0gIl9fbHJ3LXNlcnBlbnQtc3NlMiIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1scnctc2VycGVudC1zc2UyIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IFNFUlBFTlRfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBzZXJwZW50X2xyd19jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC00NjgsNyArNDcyLDggQEAKIAkuY3JhX25hbWUJCT0gIl9feHRzLXNlcnBlbnQtc3NlMiIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci14dHMtc2VycGVudC1zc2UyIiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IFNFUlBFTlRfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCBzZXJwZW50X3h0c19jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vc2hhLW1iL3NoYTFfbWIuYyBiL2FyY2gveDg2L2NyeXB0by9zaGEtbWIvc2hhMV9tYi5jCmluZGV4IGZkOWY2YjAuLmU1MTBiMWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9zaGEtbWIvc2hhMV9tYi5jCisrKyBiL2FyY2gveDg2L2NyeXB0by9zaGEtbWIvc2hhMV9tYi5jCkBAIC02OTQsNyArNjk0LDggQEAKIAkJICogdXNlIEFTWU5DIGZsYWcgYXMgc29tZSBidWZmZXJzIGluIG11bHRpLWJ1ZmZlcgogCQkgKiBhbGdvIG1heSBub3QgaGF2ZSBjb21wbGV0ZWQgYmVmb3JlIGhhc2hpbmcgdGhyZWFkIHNsZWVwCiAJCSAqLwotCQkuY3JhX2ZsYWdzCSA9IENSWVBUT19BTEdfVFlQRV9TSEFTSCB8IENSWVBUT19BTEdfQVNZTkMsCisJCS5jcmFfZmxhZ3MJID0gQ1JZUFRPX0FMR19UWVBFX1NIQVNIIHwgQ1JZUFRPX0FMR19BU1lOQyB8CisJCQkJICAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkJLmNyYV9ibG9ja3NpemUJID0gU0hBMV9CTE9DS19TSVpFLAogCQkuY3JhX21vZHVsZQkgPSBUSElTX01PRFVMRSwKIAkJLmNyYV9saXN0CSA9IExJU1RfSEVBRF9JTklUKHNoYTFfbWJfc2hhc2hfYWxnLmJhc2UuY3JhX2xpc3QpLApAQCAtNzcwLDcgKzc3MSw5IEBACiAJc3RydWN0IHNoYTFfbWJfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOwogCXN0cnVjdCBtY3J5cHRkX2hhc2hfY3R4ICptY3R4OwogCi0JbWNyeXB0ZF90Zm0gPSBtY3J5cHRkX2FsbG9jX2FoYXNoKCJfX2ludGVsX3NoYTEtbWIiLCAwLCAwKTsKKwltY3J5cHRkX3RmbSA9IG1jcnlwdGRfYWxsb2NfYWhhc2goIl9faW50ZWxfc2hhMS1tYiIsCisJCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKKwkJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMKTsKIAlpZiAoSVNfRVJSKG1jcnlwdGRfdGZtKSkKIAkJcmV0dXJuIFBUUl9FUlIobWNyeXB0ZF90Zm0pOwogCW1jdHggPSBjcnlwdG9fYWhhc2hfY3R4KCZtY3J5cHRkX3RmbS0+YmFzZSk7CkBAIC04MjgsNyArODMxLDcgQEAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmNzdGF0ZS0+d29ya19saXN0KSkgewogCQlyY3R4ID0gbGlzdF9lbnRyeShjc3RhdGUtPndvcmtfbGlzdC5uZXh0LAogCQkJCXN0cnVjdCBtY3J5cHRkX2hhc2hfcmVxdWVzdF9jdHgsIHdhaXRlcik7Ci0JCWlmIHRpbWVfYmVmb3JlKGN1cl90aW1lLCByY3R4LT50YWcuZXhwaXJlKQorCQlpZiAodGltZV9iZWZvcmUoY3VyX3RpbWUsIHJjdHgtPnRhZy5leHBpcmUpKQogCQkJYnJlYWs7CiAJCWtlcm5lbF9mcHVfYmVnaW4oKTsKIAkJc2hhX2N0eCA9IChzdHJ1Y3Qgc2hhMV9oYXNoX2N0eCAqKSBzaGExX2N0eF9tZ3JfZmx1c2goY3N0YXRlLT5tZ3IpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3NoYS1tYi9zaGExX21iX21ncl9pbml0X2F2eDIuYyBiL2FyY2gveDg2L2NyeXB0by9zaGEtbWIvc2hhMV9tYl9tZ3JfaW5pdF9hdngyLmMKaW5kZXggNGNhN2UxNi4uODIyYWNiNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL3NoYS1tYi9zaGExX21iX21ncl9pbml0X2F2eDIuYworKysgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhLW1iL3NoYTFfbWJfbWdyX2luaXRfYXZ4Mi5jCkBAIC01Niw3ICs1Niw3IEBACiB2b2lkIHNoYTFfbWJfbWdyX2luaXRfYXZ4MihzdHJ1Y3Qgc2hhMV9tYl9tZ3IgKnN0YXRlKQogewogCXVuc2lnbmVkIGludCBqOwotCXN0YXRlLT51bnVzZWRfbGFuZXMgPSAweEY3NjU0MzIxMDsKKwlzdGF0ZS0+dW51c2VkX2xhbmVzID0gMHhGNzY1NDMyMTBVTEw7CiAJZm9yIChqID0gMDsgaiA8IDg7IGorKykgewogCQlzdGF0ZS0+bGVuc1tqXSA9IDB4RkZGRkZGRkY7CiAJCXN0YXRlLT5sZGF0YVtqXS5qb2JfaW5fbGFuZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vc2hhMV9zc3NlM19nbHVlLmMgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMV9zc3NlM19nbHVlLmMKaW5kZXggNmMyMGZlMC4uMzNkMWI5ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL3NoYTFfc3NzZTNfZ2x1ZS5jCisrKyBiL2FyY2gveDg2L2NyeXB0by9zaGExX3Nzc2UzX2dsdWUuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYTFfYmFzZS5oPgogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CiAjaW5jbHVkZSA8YXNtL3hjci5oPgogI2luY2x1ZGUgPGFzbS94c2F2ZS5oPgpAQCAtNDQsMTMyICs0NCw1MSBAQAogI2RlZmluZSBTSEExX0FWWDJfQkxPQ0tfT1BUU0laRQk0CS8qIG9wdGltYWwgNCo2NCBieXRlcyBvZiBTSEExIGJsb2NrcyAqLwogCiBhc21saW5rYWdlIHZvaWQgc2hhMV90cmFuc2Zvcm1fYXZ4Mih1MzIgKmRpZ2VzdCwgY29uc3QgY2hhciAqZGF0YSwKLQkJCQl1bnNpZ25lZCBpbnQgcm91bmRzKTsKKwkJCQkgICAgdW5zaWduZWQgaW50IHJvdW5kcyk7CiAjZW5kaWYKIAotc3RhdGljIGFzbWxpbmthZ2Ugdm9pZCAoKnNoYTFfdHJhbnNmb3JtX2FzbSkodTMyICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50KTsKLQotCi1zdGF0aWMgaW50IHNoYTFfc3NzZTNfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCi0JKnNjdHggPSAoc3RydWN0IHNoYTFfc3RhdGUpewotCQkuc3RhdGUgPSB7IFNIQTFfSDAsIFNIQTFfSDEsIFNIQTFfSDIsIFNIQTFfSDMsIFNIQTFfSDQgfSwKLQl9OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19zaGExX3Nzc2UzX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IHBhcnRpYWwpCi17Ci0Jc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQl1bnNpZ25lZCBpbnQgZG9uZSA9IDA7Ci0KLQlzY3R4LT5jb3VudCArPSBsZW47Ci0KLQlpZiAocGFydGlhbCkgewotCQlkb25lID0gU0hBMV9CTE9DS19TSVpFIC0gcGFydGlhbDsKLQkJbWVtY3B5KHNjdHgtPmJ1ZmZlciArIHBhcnRpYWwsIGRhdGEsIGRvbmUpOwotCQlzaGExX3RyYW5zZm9ybV9hc20oc2N0eC0+c3RhdGUsIHNjdHgtPmJ1ZmZlciwgMSk7Ci0JfQotCi0JaWYgKGxlbiAtIGRvbmUgPj0gU0hBMV9CTE9DS19TSVpFKSB7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCByb3VuZHMgPSAobGVuIC0gZG9uZSkgLyBTSEExX0JMT0NLX1NJWkU7Ci0KLQkJc2hhMV90cmFuc2Zvcm1fYXNtKHNjdHgtPnN0YXRlLCBkYXRhICsgZG9uZSwgcm91bmRzKTsKLQkJZG9uZSArPSByb3VuZHMgKiBTSEExX0JMT0NLX1NJWkU7Ci0JfQotCi0JbWVtY3B5KHNjdHgtPmJ1ZmZlciwgZGF0YSArIGRvbmUsIGxlbiAtIGRvbmUpOwotCi0JcmV0dXJuIDA7Ci19CitzdGF0aWMgdm9pZCAoKnNoYTFfdHJhbnNmb3JtX2FzbSkodTMyICosIGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50KTsKIAogc3RhdGljIGludCBzaGExX3Nzc2UzX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCiAJCQkgICAgIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQl1bnNpZ25lZCBpbnQgcGFydGlhbCA9IHNjdHgtPmNvdW50ICUgU0hBMV9CTE9DS19TSVpFOwotCWludCByZXM7CiAKLQkvKiBIYW5kbGUgdGhlIGZhc3QgY2FzZSByaWdodCBoZXJlICovCi0JaWYgKHBhcnRpYWwgKyBsZW4gPCBTSEExX0JMT0NLX1NJWkUpIHsKLQkJc2N0eC0+Y291bnQgKz0gbGVuOwotCQltZW1jcHkoc2N0eC0+YnVmZmVyICsgcGFydGlhbCwgZGF0YSwgbGVuKTsKKwlpZiAoIWlycV9mcHVfdXNhYmxlKCkgfHwKKwkgICAgKHNjdHgtPmNvdW50ICUgU0hBMV9CTE9DS19TSVpFKSArIGxlbiA8IFNIQTFfQkxPQ0tfU0laRSkKKwkJcmV0dXJuIGNyeXB0b19zaGExX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4pOwogCi0JCXJldHVybiAwOwotCX0KKwkvKiBtYWtlIHN1cmUgY2FzdGluZyB0byBzaGExX2Jsb2NrX2ZuKCkgaXMgc2FmZSAqLworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3Qgc2hhMV9zdGF0ZSwgc3RhdGUpICE9IDApOwogCi0JaWYgKCFpcnFfZnB1X3VzYWJsZSgpKSB7Ci0JCXJlcyA9IGNyeXB0b19zaGExX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4pOwotCX0gZWxzZSB7Ci0JCWtlcm5lbF9mcHVfYmVnaW4oKTsKLQkJcmVzID0gX19zaGExX3Nzc2UzX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sIHBhcnRpYWwpOwotCQlrZXJuZWxfZnB1X2VuZCgpOwotCX0KKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisJc2hhMV9iYXNlX2RvX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sCisJCQkgICAgKHNoYTFfYmxvY2tfZm4gKilzaGExX3RyYW5zZm9ybV9hc20pOworCWtlcm5lbF9mcHVfZW5kKCk7CiAKLQlyZXR1cm4gcmVzOworCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNoYTFfc3NzZTNfZmludXAoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJICAgICAgdW5zaWduZWQgaW50IGxlbiwgdTggKm91dCkKK3sKKwlpZiAoIWlycV9mcHVfdXNhYmxlKCkpCisJCXJldHVybiBjcnlwdG9fc2hhMV9maW51cChkZXNjLCBkYXRhLCBsZW4sIG91dCk7CisKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisJaWYgKGxlbikKKwkJc2hhMV9iYXNlX2RvX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sCisJCQkJICAgIChzaGExX2Jsb2NrX2ZuICopc2hhMV90cmFuc2Zvcm1fYXNtKTsKKwlzaGExX2Jhc2VfZG9fZmluYWxpemUoZGVzYywgKHNoYTFfYmxvY2tfZm4gKilzaGExX3RyYW5zZm9ybV9hc20pOworCWtlcm5lbF9mcHVfZW5kKCk7CisKKwlyZXR1cm4gc2hhMV9iYXNlX2ZpbmlzaChkZXNjLCBvdXQpOworfQogCiAvKiBBZGQgcGFkZGluZyBhbmQgcmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdC4gKi8KIHN0YXRpYyBpbnQgc2hhMV9zc3NlM19maW5hbChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKIHsKLQlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCXVuc2lnbmVkIGludCBpLCBpbmRleCwgcGFkbGVuOwotCV9fYmUzMiAqZHN0ID0gKF9fYmUzMiAqKW91dDsKLQlfX2JlNjQgYml0czsKLQlzdGF0aWMgY29uc3QgdTggcGFkZGluZ1tTSEExX0JMT0NLX1NJWkVdID0geyAweDgwLCB9OwotCi0JYml0cyA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50IDw8IDMpOwotCi0JLyogUGFkIG91dCB0byA1NiBtb2QgNjQgYW5kIGFwcGVuZCBsZW5ndGggKi8KLQlpbmRleCA9IHNjdHgtPmNvdW50ICUgU0hBMV9CTE9DS19TSVpFOwotCXBhZGxlbiA9IChpbmRleCA8IDU2KSA/ICg1NiAtIGluZGV4KSA6ICgoU0hBMV9CTE9DS19TSVpFKzU2KSAtIGluZGV4KTsKLQlpZiAoIWlycV9mcHVfdXNhYmxlKCkpIHsKLQkJY3J5cHRvX3NoYTFfdXBkYXRlKGRlc2MsIHBhZGRpbmcsIHBhZGxlbik7Ci0JCWNyeXB0b19zaGExX3VwZGF0ZShkZXNjLCAoY29uc3QgdTggKikmYml0cywgc2l6ZW9mKGJpdHMpKTsKLQl9IGVsc2UgewotCQlrZXJuZWxfZnB1X2JlZ2luKCk7Ci0JCS8qIFdlIG5lZWQgdG8gZmlsbCBhIHdob2xlIGJsb2NrIGZvciBfX3NoYTFfc3NzZTNfdXBkYXRlKCkgKi8KLQkJaWYgKHBhZGxlbiA8PSA1NikgewotCQkJc2N0eC0+Y291bnQgKz0gcGFkbGVuOwotCQkJbWVtY3B5KHNjdHgtPmJ1ZmZlciArIGluZGV4LCBwYWRkaW5nLCBwYWRsZW4pOwotCQl9IGVsc2UgewotCQkJX19zaGExX3Nzc2UzX3VwZGF0ZShkZXNjLCBwYWRkaW5nLCBwYWRsZW4sIGluZGV4KTsKLQkJfQotCQlfX3NoYTFfc3NzZTNfdXBkYXRlKGRlc2MsIChjb25zdCB1OCAqKSZiaXRzLCBzaXplb2YoYml0cyksIDU2KTsKLQkJa2VybmVsX2ZwdV9lbmQoKTsKLQl9Ci0KLQkvKiBTdG9yZSBzdGF0ZSBpbiBkaWdlc3QgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQotCQlkc3RbaV0gPSBjcHVfdG9fYmUzMihzY3R4LT5zdGF0ZVtpXSk7Ci0KLQkvKiBXaXBlIGNvbnRleHQgKi8KLQltZW1zZXQoc2N0eCwgMCwgc2l6ZW9mKCpzY3R4KSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzaGExX3Nzc2UzX2V4cG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdm9pZCAqb3V0KQotewotCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0KLQltZW1jcHkob3V0LCBzY3R4LCBzaXplb2YoKnNjdHgpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNoYTFfc3NzZTNfaW1wb3J0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB2b2lkICppbikKLXsKLQlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCi0JbWVtY3B5KHNjdHgsIGluLCBzaXplb2YoKnNjdHgpKTsKLQotCXJldHVybiAwOworCXJldHVybiBzaGExX3Nzc2UzX2ZpbnVwKGRlc2MsIE5VTEwsIDAsIG91dCk7CiB9CiAKICNpZmRlZiBDT05GSUdfQVNfQVZYMgpAQCAtMTg2LDEzICsxMDUsMTEgQEAKIAogc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgYWxnID0gewogCS5kaWdlc3RzaXplCT0JU0hBMV9ESUdFU1RfU0laRSwKLQkuaW5pdAkJPQlzaGExX3Nzc2UzX2luaXQsCisJLmluaXQJCT0Jc2hhMV9iYXNlX2luaXQsCiAJLnVwZGF0ZQkJPQlzaGExX3Nzc2UzX3VwZGF0ZSwKIAkuZmluYWwJCT0Jc2hhMV9zc3NlM19maW5hbCwKLQkuZXhwb3J0CQk9CXNoYTFfc3NzZTNfZXhwb3J0LAotCS5pbXBvcnQJCT0Jc2hhMV9zc3NlM19pbXBvcnQsCisJLmZpbnVwCQk9CXNoYTFfc3NzZTNfZmludXAsCiAJLmRlc2NzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGExX3N0YXRlKSwKLQkuc3RhdGVzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGExX3N0YXRlKSwKIAkuYmFzZQkJPQl7CiAJCS5jcmFfbmFtZQk9CSJzaGExIiwKIAkJLmNyYV9kcml2ZXJfbmFtZT0JInNoYTEtc3NzZTMiLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3NoYTI1Ni1hdngtYXNtLlMgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2LWF2eC1hc20uUwppbmRleCA2NDJmMTU2Li45MmIzYjVkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2LWF2eC1hc20uUworKysgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2LWF2eC1hc20uUwpAQCAtOTYsMTAgKzk2LDEwIEBACiBCWVRFX0ZMSVBfTUFTSyA9ICV4bW0xMwogCiBOVU1fQkxLUyA9ICVyZHggICAjIDNyZCBhcmcKLUNUWCA9ICVyc2kgICAgICAgICMgMm5kIGFyZwotSU5QID0gJXJkaSAgICAgICAgIyAxc3QgYXJnCitJTlAgPSAlcnNpICAgICAgICAjIDJuZCBhcmcKK0NUWCA9ICVyZGkgICAgICAgICMgMXN0IGFyZwogCi1TUk5EID0gJXJkaSAgICAgICAjIGNsb2JiZXJzIElOUAorU1JORCA9ICVyc2kgICAgICAgIyBjbG9iYmVycyBJTlAKIGMgPSAlZWN4CiBkID0gJXI4ZAogZSA9ICVlZHgKQEAgLTM0Miw4ICszNDIsOCBAQAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIHZvaWQgc2hhMjU2X3RyYW5zZm9ybV9hdngodm9pZCAqaW5wdXRfZGF0YSwgVUlOVDMyIGRpZ2VzdFs4XSwgVUlOVDY0IG51bV9ibGtzKQotIyMgYXJnIDEgOiBwb2ludGVyIHRvIGlucHV0IGRhdGEKLSMjIGFyZyAyIDogcG9pbnRlciB0byBkaWdlc3QKKyMjIGFyZyAxIDogcG9pbnRlciB0byBkaWdlc3QKKyMjIGFyZyAyIDogcG9pbnRlciB0byBpbnB1dCBkYXRhCiAjIyBhcmcgMyA6IE51bSBibG9ja3MKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogLnRleHQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9zaGEyNTYtYXZ4Mi1hc20uUyBiL2FyY2gveDg2L2NyeXB0by9zaGEyNTYtYXZ4Mi1hc20uUwppbmRleCA5ZTg2OTQ0Li41NzBlYzVlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2LWF2eDItYXNtLlMKKysrIGIvYXJjaC94ODYvY3J5cHRvL3NoYTI1Ni1hdngyLWFzbS5TCkBAIC05MSwxMiArOTEsMTIgQEAKIFhfQllURV9GTElQX01BU0sgPSAleG1tMTMgIyBYTU0gdmVyc2lvbiBvZiBCWVRFX0ZMSVBfTUFTSwogCiBOVU1fQkxLUyA9ICVyZHgJIyAzcmQgYXJnCi1DVFgJPSAlcnNpICAjIDJuZCBhcmcKLUlOUAk9ICVyZGkJIyAxc3QgYXJnCitJTlAJPSAlcnNpICAjIDJuZCBhcmcKK0NUWAk9ICVyZGkJIyAxc3QgYXJnCiBjCT0gJWVjeAogZAk9ICVyOGQKIGUgICAgICAgPSAlZWR4CSMgY2xvYmJlcnMgTlVNX0JMS1MKLXkzCT0gJWVkaQkjIGNsb2JiZXJzIElOUAoreTMJPSAlZXNpCSMgY2xvYmJlcnMgSU5QCiAKIAogVEJMCT0gJXJicApAQCAtNTIzLDggKzUyMyw4IEBACiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgdm9pZCBzaGEyNTZfdHJhbnNmb3JtX3Jvcngodm9pZCAqaW5wdXRfZGF0YSwgVUlOVDMyIGRpZ2VzdFs4XSwgVUlOVDY0IG51bV9ibGtzKQotIyMgYXJnIDEgOiBwb2ludGVyIHRvIGlucHV0IGRhdGEKLSMjIGFyZyAyIDogcG9pbnRlciB0byBkaWdlc3QKKyMjIGFyZyAxIDogcG9pbnRlciB0byBkaWdlc3QKKyMjIGFyZyAyIDogcG9pbnRlciB0byBpbnB1dCBkYXRhCiAjIyBhcmcgMyA6IE51bSBibG9ja3MKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogLnRleHQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9zaGEyNTYtc3NzZTMtYXNtLlMgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2LXNzc2UzLWFzbS5TCmluZGV4IGY4MzNiNzQuLjJjZWRjNDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9zaGEyNTYtc3NzZTMtYXNtLlMKKysrIGIvYXJjaC94ODYvY3J5cHRvL3NoYTI1Ni1zc3NlMy1hc20uUwpAQCAtODgsMTAgKzg4LDEwIEBACiBCWVRFX0ZMSVBfTUFTSyA9ICV4bW0xMgogCiBOVU1fQkxLUyA9ICVyZHggICAjIDNyZCBhcmcKLUNUWCA9ICVyc2kgICAgICAgICMgMm5kIGFyZwotSU5QID0gJXJkaSAgICAgICAgIyAxc3QgYXJnCitJTlAgPSAlcnNpICAgICAgICAjIDJuZCBhcmcKK0NUWCA9ICVyZGkgICAgICAgICMgMXN0IGFyZwogCi1TUk5EID0gJXJkaSAgICAgICAjIGNsb2JiZXJzIElOUAorU1JORCA9ICVyc2kgICAgICAgIyBjbG9iYmVycyBJTlAKIGMgPSAlZWN4CiBkID0gJXI4ZAogZSA9ICVlZHgKQEAgLTM0OCw4ICszNDgsOCBAQAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMjIHZvaWQgc2hhMjU2X3RyYW5zZm9ybV9zc3NlMyh2b2lkICppbnB1dF9kYXRhLCBVSU5UMzIgZGlnZXN0WzhdLCBVSU5UNjQgbnVtX2Jsa3MpCi0jIyBhcmcgMSA6IHBvaW50ZXIgdG8gaW5wdXQgZGF0YQotIyMgYXJnIDIgOiBwb2ludGVyIHRvIGRpZ2VzdAorIyMgYXJnIDEgOiBwb2ludGVyIHRvIGRpZ2VzdAorIyMgYXJnIDIgOiBwb2ludGVyIHRvIGlucHV0IGRhdGEKICMjIGFyZyAzIDogTnVtIGJsb2NrcwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAudGV4dApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3NoYTI1Nl9zc3NlM19nbHVlLmMgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2X3Nzc2UzX2dsdWUuYwppbmRleCA4ZmFkNzJmLi5jY2MzMzg4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2X3Nzc2UzX2dsdWUuYworKysgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhMjU2X3Nzc2UzX2dsdWUuYwpAQCAtMzYsMTk1ICszNiw3NCBAQAogI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KLSNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NoYTI1Nl9iYXNlLmg+CiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KICNpbmNsdWRlIDxhc20veGNyLmg+CiAjaW5jbHVkZSA8YXNtL3hzYXZlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKLWFzbWxpbmthZ2Ugdm9pZCBzaGEyNTZfdHJhbnNmb3JtX3Nzc2UzKGNvbnN0IGNoYXIgKmRhdGEsIHUzMiAqZGlnZXN0LAotCQkJCSAgICAgdTY0IHJvdW5kcyk7Cithc21saW5rYWdlIHZvaWQgc2hhMjU2X3RyYW5zZm9ybV9zc3NlMyh1MzIgKmRpZ2VzdCwgY29uc3QgY2hhciAqZGF0YSwKKwkJCQkgICAgICAgdTY0IHJvdW5kcyk7CiAjaWZkZWYgQ09ORklHX0FTX0FWWAotYXNtbGlua2FnZSB2b2lkIHNoYTI1Nl90cmFuc2Zvcm1fYXZ4KGNvbnN0IGNoYXIgKmRhdGEsIHUzMiAqZGlnZXN0LAorYXNtbGlua2FnZSB2b2lkIHNoYTI1Nl90cmFuc2Zvcm1fYXZ4KHUzMiAqZGlnZXN0LCBjb25zdCBjaGFyICpkYXRhLAogCQkJCSAgICAgdTY0IHJvdW5kcyk7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVNfQVZYMgotYXNtbGlua2FnZSB2b2lkIHNoYTI1Nl90cmFuc2Zvcm1fcm9yeChjb25zdCBjaGFyICpkYXRhLCB1MzIgKmRpZ2VzdCwKLQkJCQkgICAgIHU2NCByb3VuZHMpOworYXNtbGlua2FnZSB2b2lkIHNoYTI1Nl90cmFuc2Zvcm1fcm9yeCh1MzIgKmRpZ2VzdCwgY29uc3QgY2hhciAqZGF0YSwKKwkJCQkgICAgICB1NjQgcm91bmRzKTsKICNlbmRpZgogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkICgqc2hhMjU2X3RyYW5zZm9ybV9hc20pKGNvbnN0IGNoYXIgKiwgdTMyICosIHU2NCk7Ci0KLQotc3RhdGljIGludCBzaGEyNTZfc3NzZTNfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0KLQlzY3R4LT5zdGF0ZVswXSA9IFNIQTI1Nl9IMDsKLQlzY3R4LT5zdGF0ZVsxXSA9IFNIQTI1Nl9IMTsKLQlzY3R4LT5zdGF0ZVsyXSA9IFNIQTI1Nl9IMjsKLQlzY3R4LT5zdGF0ZVszXSA9IFNIQTI1Nl9IMzsKLQlzY3R4LT5zdGF0ZVs0XSA9IFNIQTI1Nl9INDsKLQlzY3R4LT5zdGF0ZVs1XSA9IFNIQTI1Nl9INTsKLQlzY3R4LT5zdGF0ZVs2XSA9IFNIQTI1Nl9INjsKLQlzY3R4LT5zdGF0ZVs3XSA9IFNIQTI1Nl9INzsKLQlzY3R4LT5jb3VudCA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX3NoYTI1Nl9zc3NlM191cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBwYXJ0aWFsKQotewotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQl1bnNpZ25lZCBpbnQgZG9uZSA9IDA7Ci0KLQlzY3R4LT5jb3VudCArPSBsZW47Ci0KLQlpZiAocGFydGlhbCkgewotCQlkb25lID0gU0hBMjU2X0JMT0NLX1NJWkUgLSBwYXJ0aWFsOwotCQltZW1jcHkoc2N0eC0+YnVmICsgcGFydGlhbCwgZGF0YSwgZG9uZSk7Ci0JCXNoYTI1Nl90cmFuc2Zvcm1fYXNtKHNjdHgtPmJ1Ziwgc2N0eC0+c3RhdGUsIDEpOwotCX0KLQotCWlmIChsZW4gLSBkb25lID49IFNIQTI1Nl9CTE9DS19TSVpFKSB7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCByb3VuZHMgPSAobGVuIC0gZG9uZSkgLyBTSEEyNTZfQkxPQ0tfU0laRTsKLQotCQlzaGEyNTZfdHJhbnNmb3JtX2FzbShkYXRhICsgZG9uZSwgc2N0eC0+c3RhdGUsICh1NjQpIHJvdW5kcyk7Ci0KLQkJZG9uZSArPSByb3VuZHMgKiBTSEEyNTZfQkxPQ0tfU0laRTsKLQl9Ci0KLQltZW1jcHkoc2N0eC0+YnVmLCBkYXRhICsgZG9uZSwgbGVuIC0gZG9uZSk7Ci0KLQlyZXR1cm4gMDsKLX0KK3N0YXRpYyB2b2lkICgqc2hhMjU2X3RyYW5zZm9ybV9hc20pKHUzMiAqLCBjb25zdCBjaGFyICosIHU2NCk7CiAKIHN0YXRpYyBpbnQgc2hhMjU2X3Nzc2UzX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCiAJCQkgICAgIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCXVuc2lnbmVkIGludCBwYXJ0aWFsID0gc2N0eC0+Y291bnQgJSBTSEEyNTZfQkxPQ0tfU0laRTsKLQlpbnQgcmVzOwogCi0JLyogSGFuZGxlIHRoZSBmYXN0IGNhc2UgcmlnaHQgaGVyZSAqLwotCWlmIChwYXJ0aWFsICsgbGVuIDwgU0hBMjU2X0JMT0NLX1NJWkUpIHsKLQkJc2N0eC0+Y291bnQgKz0gbGVuOwotCQltZW1jcHkoc2N0eC0+YnVmICsgcGFydGlhbCwgZGF0YSwgbGVuKTsKKwlpZiAoIWlycV9mcHVfdXNhYmxlKCkgfHwKKwkgICAgKHNjdHgtPmNvdW50ICUgU0hBMjU2X0JMT0NLX1NJWkUpICsgbGVuIDwgU0hBMjU2X0JMT0NLX1NJWkUpCisJCXJldHVybiBjcnlwdG9fc2hhMjU2X3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4pOwogCi0JCXJldHVybiAwOwotCX0KKwkvKiBtYWtlIHN1cmUgY2FzdGluZyB0byBzaGEyNTZfYmxvY2tfZm4oKSBpcyBzYWZlICovCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBzaGEyNTZfc3RhdGUsIHN0YXRlKSAhPSAwKTsKIAotCWlmICghaXJxX2ZwdV91c2FibGUoKSkgewotCQlyZXMgPSBjcnlwdG9fc2hhMjU2X3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4pOwotCX0gZWxzZSB7Ci0JCWtlcm5lbF9mcHVfYmVnaW4oKTsKLQkJcmVzID0gX19zaGEyNTZfc3NzZTNfdXBkYXRlKGRlc2MsIGRhdGEsIGxlbiwgcGFydGlhbCk7Ci0JCWtlcm5lbF9mcHVfZW5kKCk7Ci0JfQorCWtlcm5lbF9mcHVfYmVnaW4oKTsKKwlzaGEyNTZfYmFzZV9kb191cGRhdGUoZGVzYywgZGF0YSwgbGVuLAorCQkJICAgICAgKHNoYTI1Nl9ibG9ja19mbiAqKXNoYTI1Nl90cmFuc2Zvcm1fYXNtKTsKKwlrZXJuZWxfZnB1X2VuZCgpOwogCi0JcmV0dXJuIHJlczsKKwlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBzaGEyNTZfc3NzZTNfZmludXAoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJICAgICAgdW5zaWduZWQgaW50IGxlbiwgdTggKm91dCkKK3sKKwlpZiAoIWlycV9mcHVfdXNhYmxlKCkpCisJCXJldHVybiBjcnlwdG9fc2hhMjU2X2ZpbnVwKGRlc2MsIGRhdGEsIGxlbiwgb3V0KTsKKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKwlpZiAobGVuKQorCQlzaGEyNTZfYmFzZV9kb191cGRhdGUoZGVzYywgZGF0YSwgbGVuLAorCQkJCSAgICAgIChzaGEyNTZfYmxvY2tfZm4gKilzaGEyNTZfdHJhbnNmb3JtX2FzbSk7CisJc2hhMjU2X2Jhc2VfZG9fZmluYWxpemUoZGVzYywgKHNoYTI1Nl9ibG9ja19mbiAqKXNoYTI1Nl90cmFuc2Zvcm1fYXNtKTsKKwlrZXJuZWxfZnB1X2VuZCgpOworCisJcmV0dXJuIHNoYTI1Nl9iYXNlX2ZpbmlzaChkZXNjLCBvdXQpOworfQogCiAvKiBBZGQgcGFkZGluZyBhbmQgcmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdC4gKi8KIHN0YXRpYyBpbnQgc2hhMjU2X3Nzc2UzX2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KQogewotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQl1bnNpZ25lZCBpbnQgaSwgaW5kZXgsIHBhZGxlbjsKLQlfX2JlMzIgKmRzdCA9IChfX2JlMzIgKilvdXQ7Ci0JX19iZTY0IGJpdHM7Ci0Jc3RhdGljIGNvbnN0IHU4IHBhZGRpbmdbU0hBMjU2X0JMT0NLX1NJWkVdID0geyAweDgwLCB9OwotCi0JYml0cyA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50IDw8IDMpOwotCi0JLyogUGFkIG91dCB0byA1NiBtb2QgNjQgYW5kIGFwcGVuZCBsZW5ndGggKi8KLQlpbmRleCA9IHNjdHgtPmNvdW50ICUgU0hBMjU2X0JMT0NLX1NJWkU7Ci0JcGFkbGVuID0gKGluZGV4IDwgNTYpID8gKDU2IC0gaW5kZXgpIDogKChTSEEyNTZfQkxPQ0tfU0laRSs1NiktaW5kZXgpOwotCi0JaWYgKCFpcnFfZnB1X3VzYWJsZSgpKSB7Ci0JCWNyeXB0b19zaGEyNTZfdXBkYXRlKGRlc2MsIHBhZGRpbmcsIHBhZGxlbik7Ci0JCWNyeXB0b19zaGEyNTZfdXBkYXRlKGRlc2MsIChjb25zdCB1OCAqKSZiaXRzLCBzaXplb2YoYml0cykpOwotCX0gZWxzZSB7Ci0JCWtlcm5lbF9mcHVfYmVnaW4oKTsKLQkJLyogV2UgbmVlZCB0byBmaWxsIGEgd2hvbGUgYmxvY2sgZm9yIF9fc2hhMjU2X3Nzc2UzX3VwZGF0ZSgpICovCi0JCWlmIChwYWRsZW4gPD0gNTYpIHsKLQkJCXNjdHgtPmNvdW50ICs9IHBhZGxlbjsKLQkJCW1lbWNweShzY3R4LT5idWYgKyBpbmRleCwgcGFkZGluZywgcGFkbGVuKTsKLQkJfSBlbHNlIHsKLQkJCV9fc2hhMjU2X3Nzc2UzX3VwZGF0ZShkZXNjLCBwYWRkaW5nLCBwYWRsZW4sIGluZGV4KTsKLQkJfQotCQlfX3NoYTI1Nl9zc3NlM191cGRhdGUoZGVzYywgKGNvbnN0IHU4ICopJmJpdHMsCi0JCQkJCXNpemVvZihiaXRzKSwgNTYpOwotCQlrZXJuZWxfZnB1X2VuZCgpOwotCX0KLQotCS8qIFN0b3JlIHN0YXRlIGluIGRpZ2VzdCAqLwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCWRzdFtpXSA9IGNwdV90b19iZTMyKHNjdHgtPnN0YXRlW2ldKTsKLQotCS8qIFdpcGUgY29udGV4dCAqLwotCW1lbXNldChzY3R4LCAwLCBzaXplb2YoKnNjdHgpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNoYTI1Nl9zc3NlM19leHBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHZvaWQgKm91dCkKLXsKLQlzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0KLQltZW1jcHkob3V0LCBzY3R4LCBzaXplb2YoKnNjdHgpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNoYTI1Nl9zc3NlM19pbXBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHZvaWQgKmluKQotewotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQotCW1lbWNweShzY3R4LCBpbiwgc2l6ZW9mKCpzY3R4KSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzaGEyMjRfc3NzZTNfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0KLQlzY3R4LT5zdGF0ZVswXSA9IFNIQTIyNF9IMDsKLQlzY3R4LT5zdGF0ZVsxXSA9IFNIQTIyNF9IMTsKLQlzY3R4LT5zdGF0ZVsyXSA9IFNIQTIyNF9IMjsKLQlzY3R4LT5zdGF0ZVszXSA9IFNIQTIyNF9IMzsKLQlzY3R4LT5zdGF0ZVs0XSA9IFNIQTIyNF9INDsKLQlzY3R4LT5zdGF0ZVs1XSA9IFNIQTIyNF9INTsKLQlzY3R4LT5zdGF0ZVs2XSA9IFNIQTIyNF9INjsKLQlzY3R4LT5zdGF0ZVs3XSA9IFNIQTIyNF9INzsKLQlzY3R4LT5jb3VudCA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzaGEyMjRfc3NzZTNfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpoYXNoKQotewotCXU4IERbU0hBMjU2X0RJR0VTVF9TSVpFXTsKLQotCXNoYTI1Nl9zc3NlM19maW5hbChkZXNjLCBEKTsKLQotCW1lbWNweShoYXNoLCBELCBTSEEyMjRfRElHRVNUX1NJWkUpOwotCW1lbXplcm9fZXhwbGljaXQoRCwgU0hBMjU2X0RJR0VTVF9TSVpFKTsKLQotCXJldHVybiAwOworCXJldHVybiBzaGEyNTZfc3NzZTNfZmludXAoZGVzYywgTlVMTCwgMCwgb3V0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgYWxnc1tdID0geyB7CiAJLmRpZ2VzdHNpemUJPQlTSEEyNTZfRElHRVNUX1NJWkUsCi0JLmluaXQJCT0Jc2hhMjU2X3Nzc2UzX2luaXQsCisJLmluaXQJCT0Jc2hhMjU2X2Jhc2VfaW5pdCwKIAkudXBkYXRlCQk9CXNoYTI1Nl9zc3NlM191cGRhdGUsCiAJLmZpbmFsCQk9CXNoYTI1Nl9zc3NlM19maW5hbCwKLQkuZXhwb3J0CQk9CXNoYTI1Nl9zc3NlM19leHBvcnQsCi0JLmltcG9ydAkJPQlzaGEyNTZfc3NzZTNfaW1wb3J0LAorCS5maW51cAkJPQlzaGEyNTZfc3NzZTNfZmludXAsCiAJLmRlc2NzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGEyNTZfc3RhdGUpLAotCS5zdGF0ZXNpemUJPQlzaXplb2Yoc3RydWN0IHNoYTI1Nl9zdGF0ZSksCiAJLmJhc2UJCT0JewogCQkuY3JhX25hbWUJPQkic2hhMjU2IiwKIAkJLmNyYV9kcml2ZXJfbmFtZSA9CSJzaGEyNTYtc3NzZTMiLApAQCAtMjM1LDEzICsxMTQsMTEgQEAKIAl9CiB9LCB7CiAJLmRpZ2VzdHNpemUJPQlTSEEyMjRfRElHRVNUX1NJWkUsCi0JLmluaXQJCT0Jc2hhMjI0X3Nzc2UzX2luaXQsCisJLmluaXQJCT0Jc2hhMjI0X2Jhc2VfaW5pdCwKIAkudXBkYXRlCQk9CXNoYTI1Nl9zc3NlM191cGRhdGUsCi0JLmZpbmFsCQk9CXNoYTIyNF9zc3NlM19maW5hbCwKLQkuZXhwb3J0CQk9CXNoYTI1Nl9zc3NlM19leHBvcnQsCi0JLmltcG9ydAkJPQlzaGEyNTZfc3NzZTNfaW1wb3J0LAorCS5maW5hbAkJPQlzaGEyNTZfc3NzZTNfZmluYWwsCisJLmZpbnVwCQk9CXNoYTI1Nl9zc3NlM19maW51cCwKIAkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTI1Nl9zdGF0ZSksCi0JLnN0YXRlc2l6ZQk9CXNpemVvZihzdHJ1Y3Qgc2hhMjU2X3N0YXRlKSwKIAkuYmFzZQkJPQl7CiAJCS5jcmFfbmFtZQk9CSJzaGEyMjQiLAogCQkuY3JhX2RyaXZlcl9uYW1lID0JInNoYTIyNC1zc3NlMyIsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jcnlwdG8vc2hhNTEyLWF2eC1hc20uUyBiL2FyY2gveDg2L2NyeXB0by9zaGE1MTItYXZ4LWFzbS5TCmluZGV4IDk3NGRkZTkuLjU2NTI3NGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9zaGE1MTItYXZ4LWFzbS5TCisrKyBiL2FyY2gveDg2L2NyeXB0by9zaGE1MTItYXZ4LWFzbS5TCkBAIC01NCw5ICs1NCw5IEBACiAKICMgVmlydHVhbCBSZWdpc3RlcnMKICMgQVJHMQotbXNnCT0gJXJkaQorZGlnZXN0CT0gJXJkaQogIyBBUkcyCi1kaWdlc3QJPSAlcnNpCittc2cJPSAlcnNpCiAjIEFSRzMKIG1zZ2xlbgk9ICVyZHgKIFQxCT0gJXJjeApAQCAtMjcxLDcgKzI3MSw3IEBACiAuZW5kbQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgdm9pZCBzaGE1MTJfdHJhbnNmb3JtX2F2eChjb25zdCB2b2lkKiBNLCB2b2lkKiBELCB1NjQgTCkKKyMgdm9pZCBzaGE1MTJfdHJhbnNmb3JtX2F2eCh2b2lkKiBELCBjb25zdCB2b2lkKiBNLCB1NjQgTCkKICMgUHVycG9zZTogVXBkYXRlcyB0aGUgU0hBNTEyIGRpZ2VzdCBzdG9yZWQgYXQgRCB3aXRoIHRoZSBtZXNzYWdlIHN0b3JlZCBpbiBNLgogIyBUaGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBwb2ludGVkIHRvIGJ5IE0gbXVzdCBiZSBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIFNIQTUxMgogIyBtZXNzYWdlIGJsb2Nrcy4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9zaGE1MTItYXZ4Mi1hc20uUyBiL2FyY2gveDg2L2NyeXB0by9zaGE1MTItYXZ4Mi1hc20uUwppbmRleCA1NjhiOTYxLi5hNDc3MWRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jcnlwdG8vc2hhNTEyLWF2eDItYXNtLlMKKysrIGIvYXJjaC94ODYvY3J5cHRvL3NoYTUxMi1hdngyLWFzbS5TCkBAIC03MCw5ICs3MCw5IEBACiBCWVRFX0ZMSVBfTUFTSyAgPSAleW1tOQogCiAjIDFzdCBhcmcKLUlOUCAgICAgICAgID0gJXJkaQorQ1RYICAgICAgICAgPSAlcmRpCiAjIDJuZCBhcmcKLUNUWCAgICAgICAgID0gJXJzaQorSU5QICAgICAgICAgPSAlcnNpCiAjIDNyZCBhcmcKIE5VTV9CTEtTICAgID0gJXJkeAogCkBAIC01NjIsNyArNTYyLDcgQEAKIC5lbmRtCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyB2b2lkIHNoYTUxMl90cmFuc2Zvcm1fcm9yeChjb25zdCB2b2lkKiBNLCB2b2lkKiBELCB1aW50NjRfdCBMKSMKKyMgdm9pZCBzaGE1MTJfdHJhbnNmb3JtX3Jvcngodm9pZCogRCwgY29uc3Qgdm9pZCogTSwgdWludDY0X3QgTCkjCiAjIFB1cnBvc2U6IFVwZGF0ZXMgdGhlIFNIQTUxMiBkaWdlc3Qgc3RvcmVkIGF0IEQgd2l0aCB0aGUgbWVzc2FnZSBzdG9yZWQgaW4gTS4KICMgVGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgcG9pbnRlZCB0byBieSBNIG11c3QgYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiBTSEE1MTIKICMgICBtZXNzYWdlIGJsb2Nrcy4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9zaGE1MTItc3NzZTMtYXNtLlMgYi9hcmNoL3g4Ni9jcnlwdG8vc2hhNTEyLXNzc2UzLWFzbS5TCmluZGV4IGZiNTY4NTUuLmU2MTBlMjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by9zaGE1MTItc3NzZTMtYXNtLlMKKysrIGIvYXJjaC94ODYvY3J5cHRvL3NoYTUxMi1zc3NlMy1hc20uUwpAQCAtNTMsOSArNTMsOSBAQAogCiAjIFZpcnR1YWwgUmVnaXN0ZXJzCiAjIEFSRzEKLW1zZyA9CQklcmRpCitkaWdlc3QgPQklcmRpCiAjIEFSRzIKLWRpZ2VzdCA9CSVyc2kKK21zZyA9CQklcnNpCiAjIEFSRzMKIG1zZ2xlbiA9CSVyZHgKIFQxID0JCSVyY3gKQEAgLTI2OSw3ICsyNjksNyBAQAogLmVuZG0KIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIHZvaWQgc2hhNTEyX3RyYW5zZm9ybV9zc3NlMyhjb25zdCB2b2lkKiBNLCB2b2lkKiBELCB1NjQgTCkjCisjIHZvaWQgc2hhNTEyX3RyYW5zZm9ybV9zc3NlMyh2b2lkKiBELCBjb25zdCB2b2lkKiBNLCB1NjQgTCkjCiAjIFB1cnBvc2U6IFVwZGF0ZXMgdGhlIFNIQTUxMiBkaWdlc3Qgc3RvcmVkIGF0IEQgd2l0aCB0aGUgbWVzc2FnZSBzdG9yZWQgaW4gTS4KICMgVGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgcG9pbnRlZCB0byBieSBNIG11c3QgYmUgYW4gaW50ZWdlciBtdWx0aXBsZSBvZiBTSEE1MTIKICMgICBtZXNzYWdlIGJsb2Nrcy4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by9zaGE1MTJfc3NzZTNfZ2x1ZS5jIGIvYXJjaC94ODYvY3J5cHRvL3NoYTUxMl9zc3NlM19nbHVlLmMKaW5kZXggMGI2YWYyNi4uZDlmYTRjMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvY3J5cHRvL3NoYTUxMl9zc3NlM19nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL3NoYTUxMl9zc3NlM19nbHVlLmMKQEAgLTM0LDIwNSArMzQsNzUgQEAKICNpbmNsdWRlIDxsaW51eC9jcnlwdG9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+Ci0jaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGNyeXB0by9zaGE1MTJfYmFzZS5oPgogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CiAjaW5jbHVkZSA8YXNtL3hjci5oPgogI2luY2x1ZGUgPGFzbS94c2F2ZS5oPgogCiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKLWFzbWxpbmthZ2Ugdm9pZCBzaGE1MTJfdHJhbnNmb3JtX3Nzc2UzKGNvbnN0IGNoYXIgKmRhdGEsIHU2NCAqZGlnZXN0LAotCQkJCSAgICAgdTY0IHJvdW5kcyk7Cithc21saW5rYWdlIHZvaWQgc2hhNTEyX3RyYW5zZm9ybV9zc3NlMyh1NjQgKmRpZ2VzdCwgY29uc3QgY2hhciAqZGF0YSwKKwkJCQkgICAgICAgdTY0IHJvdW5kcyk7CiAjaWZkZWYgQ09ORklHX0FTX0FWWAotYXNtbGlua2FnZSB2b2lkIHNoYTUxMl90cmFuc2Zvcm1fYXZ4KGNvbnN0IGNoYXIgKmRhdGEsIHU2NCAqZGlnZXN0LAorYXNtbGlua2FnZSB2b2lkIHNoYTUxMl90cmFuc2Zvcm1fYXZ4KHU2NCAqZGlnZXN0LCBjb25zdCBjaGFyICpkYXRhLAogCQkJCSAgICAgdTY0IHJvdW5kcyk7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfQVNfQVZYMgotYXNtbGlua2FnZSB2b2lkIHNoYTUxMl90cmFuc2Zvcm1fcm9yeChjb25zdCBjaGFyICpkYXRhLCB1NjQgKmRpZ2VzdCwKLQkJCQkgICAgIHU2NCByb3VuZHMpOworYXNtbGlua2FnZSB2b2lkIHNoYTUxMl90cmFuc2Zvcm1fcm9yeCh1NjQgKmRpZ2VzdCwgY29uc3QgY2hhciAqZGF0YSwKKwkJCQkgICAgICB1NjQgcm91bmRzKTsKICNlbmRpZgogCi1zdGF0aWMgYXNtbGlua2FnZSB2b2lkICgqc2hhNTEyX3RyYW5zZm9ybV9hc20pKGNvbnN0IGNoYXIgKiwgdTY0ICosIHU2NCk7Ci0KLQotc3RhdGljIGludCBzaGE1MTJfc3NzZTNfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3Qgc2hhNTEyX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0KLQlzY3R4LT5zdGF0ZVswXSA9IFNIQTUxMl9IMDsKLQlzY3R4LT5zdGF0ZVsxXSA9IFNIQTUxMl9IMTsKLQlzY3R4LT5zdGF0ZVsyXSA9IFNIQTUxMl9IMjsKLQlzY3R4LT5zdGF0ZVszXSA9IFNIQTUxMl9IMzsKLQlzY3R4LT5zdGF0ZVs0XSA9IFNIQTUxMl9INDsKLQlzY3R4LT5zdGF0ZVs1XSA9IFNIQTUxMl9INTsKLQlzY3R4LT5zdGF0ZVs2XSA9IFNIQTUxMl9INjsKLQlzY3R4LT5zdGF0ZVs3XSA9IFNIQTUxMl9INzsKLQlzY3R4LT5jb3VudFswXSA9IHNjdHgtPmNvdW50WzFdID0gMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fc2hhNTEyX3Nzc2UzX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IHBhcnRpYWwpCi17Ci0Jc3RydWN0IHNoYTUxMl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCXVuc2lnbmVkIGludCBkb25lID0gMDsKLQotCXNjdHgtPmNvdW50WzBdICs9IGxlbjsKLQlpZiAoc2N0eC0+Y291bnRbMF0gPCBsZW4pCi0JCXNjdHgtPmNvdW50WzFdKys7Ci0KLQlpZiAocGFydGlhbCkgewotCQlkb25lID0gU0hBNTEyX0JMT0NLX1NJWkUgLSBwYXJ0aWFsOwotCQltZW1jcHkoc2N0eC0+YnVmICsgcGFydGlhbCwgZGF0YSwgZG9uZSk7Ci0JCXNoYTUxMl90cmFuc2Zvcm1fYXNtKHNjdHgtPmJ1Ziwgc2N0eC0+c3RhdGUsIDEpOwotCX0KLQotCWlmIChsZW4gLSBkb25lID49IFNIQTUxMl9CTE9DS19TSVpFKSB7Ci0JCWNvbnN0IHVuc2lnbmVkIGludCByb3VuZHMgPSAobGVuIC0gZG9uZSkgLyBTSEE1MTJfQkxPQ0tfU0laRTsKLQotCQlzaGE1MTJfdHJhbnNmb3JtX2FzbShkYXRhICsgZG9uZSwgc2N0eC0+c3RhdGUsICh1NjQpIHJvdW5kcyk7Ci0KLQkJZG9uZSArPSByb3VuZHMgKiBTSEE1MTJfQkxPQ0tfU0laRTsKLQl9Ci0KLQltZW1jcHkoc2N0eC0+YnVmLCBkYXRhICsgZG9uZSwgbGVuIC0gZG9uZSk7Ci0KLQlyZXR1cm4gMDsKLX0KK3N0YXRpYyB2b2lkICgqc2hhNTEyX3RyYW5zZm9ybV9hc20pKHU2NCAqLCBjb25zdCBjaGFyICosIHU2NCk7CiAKIHN0YXRpYyBpbnQgc2hhNTEyX3Nzc2UzX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCi0JCQkgICAgIHVuc2lnbmVkIGludCBsZW4pCisJCQkgICAgICAgdW5zaWduZWQgaW50IGxlbikKIHsKIAlzdHJ1Y3Qgc2hhNTEyX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0JdW5zaWduZWQgaW50IHBhcnRpYWwgPSBzY3R4LT5jb3VudFswXSAlIFNIQTUxMl9CTE9DS19TSVpFOwotCWludCByZXM7CiAKLQkvKiBIYW5kbGUgdGhlIGZhc3QgY2FzZSByaWdodCBoZXJlICovCi0JaWYgKHBhcnRpYWwgKyBsZW4gPCBTSEE1MTJfQkxPQ0tfU0laRSkgewotCQlzY3R4LT5jb3VudFswXSArPSBsZW47Ci0JCWlmIChzY3R4LT5jb3VudFswXSA8IGxlbikKLQkJCXNjdHgtPmNvdW50WzFdKys7Ci0JCW1lbWNweShzY3R4LT5idWYgKyBwYXJ0aWFsLCBkYXRhLCBsZW4pOworCWlmICghaXJxX2ZwdV91c2FibGUoKSB8fAorCSAgICAoc2N0eC0+Y291bnRbMF0gJSBTSEE1MTJfQkxPQ0tfU0laRSkgKyBsZW4gPCBTSEE1MTJfQkxPQ0tfU0laRSkKKwkJcmV0dXJuIGNyeXB0b19zaGE1MTJfdXBkYXRlKGRlc2MsIGRhdGEsIGxlbik7CiAKLQkJcmV0dXJuIDA7Ci0JfQorCS8qIG1ha2Ugc3VyZSBjYXN0aW5nIHRvIHNoYTUxMl9ibG9ja19mbigpIGlzIHNhZmUgKi8KKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IHNoYTUxMl9zdGF0ZSwgc3RhdGUpICE9IDApOwogCi0JaWYgKCFpcnFfZnB1X3VzYWJsZSgpKSB7Ci0JCXJlcyA9IGNyeXB0b19zaGE1MTJfdXBkYXRlKGRlc2MsIGRhdGEsIGxlbik7Ci0JfSBlbHNlIHsKLQkJa2VybmVsX2ZwdV9iZWdpbigpOwotCQlyZXMgPSBfX3NoYTUxMl9zc3NlM191cGRhdGUoZGVzYywgZGF0YSwgbGVuLCBwYXJ0aWFsKTsKLQkJa2VybmVsX2ZwdV9lbmQoKTsKLQl9CisJa2VybmVsX2ZwdV9iZWdpbigpOworCXNoYTUxMl9iYXNlX2RvX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sCisJCQkgICAgICAoc2hhNTEyX2Jsb2NrX2ZuICopc2hhNTEyX3RyYW5zZm9ybV9hc20pOworCWtlcm5lbF9mcHVfZW5kKCk7CiAKLQlyZXR1cm4gcmVzOworCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHNoYTUxMl9zc3NlM19maW51cChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuLCB1OCAqb3V0KQoreworCWlmICghaXJxX2ZwdV91c2FibGUoKSkKKwkJcmV0dXJuIGNyeXB0b19zaGE1MTJfZmludXAoZGVzYywgZGF0YSwgbGVuLCBvdXQpOworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCWlmIChsZW4pCisJCXNoYTUxMl9iYXNlX2RvX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sCisJCQkJICAgICAgKHNoYTUxMl9ibG9ja19mbiAqKXNoYTUxMl90cmFuc2Zvcm1fYXNtKTsKKwlzaGE1MTJfYmFzZV9kb19maW5hbGl6ZShkZXNjLCAoc2hhNTEyX2Jsb2NrX2ZuICopc2hhNTEyX3RyYW5zZm9ybV9hc20pOworCWtlcm5lbF9mcHVfZW5kKCk7CisKKwlyZXR1cm4gc2hhNTEyX2Jhc2VfZmluaXNoKGRlc2MsIG91dCk7Cit9CiAKIC8qIEFkZCBwYWRkaW5nIGFuZCByZXR1cm4gdGhlIG1lc3NhZ2UgZGlnZXN0LiAqLwogc3RhdGljIGludCBzaGE1MTJfc3NzZTNfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IHNoYTUxMl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCXVuc2lnbmVkIGludCBpLCBpbmRleCwgcGFkbGVuOwotCV9fYmU2NCAqZHN0ID0gKF9fYmU2NCAqKW91dDsKLQlfX2JlNjQgYml0c1syXTsKLQlzdGF0aWMgY29uc3QgdTggcGFkZGluZ1tTSEE1MTJfQkxPQ0tfU0laRV0gPSB7IDB4ODAsIH07Ci0KLQkvKiBzYXZlIG51bWJlciBvZiBiaXRzICovCi0JYml0c1sxXSA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50WzBdIDw8IDMpOwotCWJpdHNbMF0gPSBjcHVfdG9fYmU2NChzY3R4LT5jb3VudFsxXSA8PCAzIHwgc2N0eC0+Y291bnRbMF0gPj4gNjEpOwotCi0JLyogUGFkIG91dCB0byAxMTIgbW9kIDEyOCBhbmQgYXBwZW5kIGxlbmd0aCAqLwotCWluZGV4ID0gc2N0eC0+Y291bnRbMF0gJiAweDdmOwotCXBhZGxlbiA9IChpbmRleCA8IDExMikgPyAoMTEyIC0gaW5kZXgpIDogKCgxMjgrMTEyKSAtIGluZGV4KTsKLQotCWlmICghaXJxX2ZwdV91c2FibGUoKSkgewotCQljcnlwdG9fc2hhNTEyX3VwZGF0ZShkZXNjLCBwYWRkaW5nLCBwYWRsZW4pOwotCQljcnlwdG9fc2hhNTEyX3VwZGF0ZShkZXNjLCAoY29uc3QgdTggKikmYml0cywgc2l6ZW9mKGJpdHMpKTsKLQl9IGVsc2UgewotCQlrZXJuZWxfZnB1X2JlZ2luKCk7Ci0JCS8qIFdlIG5lZWQgdG8gZmlsbCBhIHdob2xlIGJsb2NrIGZvciBfX3NoYTUxMl9zc3NlM191cGRhdGUoKSAqLwotCQlpZiAocGFkbGVuIDw9IDExMikgewotCQkJc2N0eC0+Y291bnRbMF0gKz0gcGFkbGVuOwotCQkJaWYgKHNjdHgtPmNvdW50WzBdIDwgcGFkbGVuKQotCQkJCXNjdHgtPmNvdW50WzFdKys7Ci0JCQltZW1jcHkoc2N0eC0+YnVmICsgaW5kZXgsIHBhZGRpbmcsIHBhZGxlbik7Ci0JCX0gZWxzZSB7Ci0JCQlfX3NoYTUxMl9zc3NlM191cGRhdGUoZGVzYywgcGFkZGluZywgcGFkbGVuLCBpbmRleCk7Ci0JCX0KLQkJX19zaGE1MTJfc3NzZTNfdXBkYXRlKGRlc2MsIChjb25zdCB1OCAqKSZiaXRzLAotCQkJCQlzaXplb2YoYml0cyksIDExMik7Ci0JCWtlcm5lbF9mcHVfZW5kKCk7Ci0JfQotCi0JLyogU3RvcmUgc3RhdGUgaW4gZGlnZXN0ICovCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJZHN0W2ldID0gY3B1X3RvX2JlNjQoc2N0eC0+c3RhdGVbaV0pOwotCi0JLyogV2lwZSBjb250ZXh0ICovCi0JbWVtc2V0KHNjdHgsIDAsIHNpemVvZigqc2N0eCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhNTEyX3Nzc2UzX2V4cG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdm9pZCAqb3V0KQotewotCXN0cnVjdCBzaGE1MTJfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQotCW1lbWNweShvdXQsIHNjdHgsIHNpemVvZigqc2N0eCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2hhNTEyX3Nzc2UzX2ltcG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3Qgdm9pZCAqaW4pCi17Ci0Jc3RydWN0IHNoYTUxMl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCi0JbWVtY3B5KHNjdHgsIGluLCBzaXplb2YoKnNjdHgpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNoYTM4NF9zc3NlM19pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQotewotCXN0cnVjdCBzaGE1MTJfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQotCXNjdHgtPnN0YXRlWzBdID0gU0hBMzg0X0gwOwotCXNjdHgtPnN0YXRlWzFdID0gU0hBMzg0X0gxOwotCXNjdHgtPnN0YXRlWzJdID0gU0hBMzg0X0gyOwotCXNjdHgtPnN0YXRlWzNdID0gU0hBMzg0X0gzOwotCXNjdHgtPnN0YXRlWzRdID0gU0hBMzg0X0g0OwotCXNjdHgtPnN0YXRlWzVdID0gU0hBMzg0X0g1OwotCXNjdHgtPnN0YXRlWzZdID0gU0hBMzg0X0g2OwotCXNjdHgtPnN0YXRlWzddID0gU0hBMzg0X0g3OwotCi0Jc2N0eC0+Y291bnRbMF0gPSBzY3R4LT5jb3VudFsxXSA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzaGEzODRfc3NzZTNfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpoYXNoKQotewotCXU4IERbU0hBNTEyX0RJR0VTVF9TSVpFXTsKLQotCXNoYTUxMl9zc3NlM19maW5hbChkZXNjLCBEKTsKLQotCW1lbWNweShoYXNoLCBELCBTSEEzODRfRElHRVNUX1NJWkUpOwotCW1lbXplcm9fZXhwbGljaXQoRCwgU0hBNTEyX0RJR0VTVF9TSVpFKTsKLQotCXJldHVybiAwOworCXJldHVybiBzaGE1MTJfc3NzZTNfZmludXAoZGVzYywgTlVMTCwgMCwgb3V0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgYWxnc1tdID0geyB7CiAJLmRpZ2VzdHNpemUJPQlTSEE1MTJfRElHRVNUX1NJWkUsCi0JLmluaXQJCT0Jc2hhNTEyX3Nzc2UzX2luaXQsCisJLmluaXQJCT0Jc2hhNTEyX2Jhc2VfaW5pdCwKIAkudXBkYXRlCQk9CXNoYTUxMl9zc3NlM191cGRhdGUsCiAJLmZpbmFsCQk9CXNoYTUxMl9zc3NlM19maW5hbCwKLQkuZXhwb3J0CQk9CXNoYTUxMl9zc3NlM19leHBvcnQsCi0JLmltcG9ydAkJPQlzaGE1MTJfc3NzZTNfaW1wb3J0LAorCS5maW51cAkJPQlzaGE1MTJfc3NzZTNfZmludXAsCiAJLmRlc2NzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGE1MTJfc3RhdGUpLAotCS5zdGF0ZXNpemUJPQlzaXplb2Yoc3RydWN0IHNoYTUxMl9zdGF0ZSksCiAJLmJhc2UJCT0JewogCQkuY3JhX25hbWUJPQkic2hhNTEyIiwKIAkJLmNyYV9kcml2ZXJfbmFtZSA9CSJzaGE1MTItc3NzZTMiLApAQCAtMjQzLDEzICsxMTMsMTEgQEAKIAl9CiB9LCAgewogCS5kaWdlc3RzaXplCT0JU0hBMzg0X0RJR0VTVF9TSVpFLAotCS5pbml0CQk9CXNoYTM4NF9zc3NlM19pbml0LAorCS5pbml0CQk9CXNoYTM4NF9iYXNlX2luaXQsCiAJLnVwZGF0ZQkJPQlzaGE1MTJfc3NzZTNfdXBkYXRlLAotCS5maW5hbAkJPQlzaGEzODRfc3NzZTNfZmluYWwsCi0JLmV4cG9ydAkJPQlzaGE1MTJfc3NzZTNfZXhwb3J0LAotCS5pbXBvcnQJCT0Jc2hhNTEyX3Nzc2UzX2ltcG9ydCwKKwkuZmluYWwJCT0Jc2hhNTEyX3Nzc2UzX2ZpbmFsLAorCS5maW51cAkJPQlzaGE1MTJfc3NzZTNfZmludXAsCiAJLmRlc2NzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGE1MTJfc3RhdGUpLAotCS5zdGF0ZXNpemUJPQlzaXplb2Yoc3RydWN0IHNoYTUxMl9zdGF0ZSksCiAJLmJhc2UJCT0JewogCQkuY3JhX25hbWUJPQkic2hhMzg0IiwKIAkJLmNyYV9kcml2ZXJfbmFtZSA9CSJzaGEzODQtc3NzZTMiLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2gteDg2XzY0LWFzbV82NC5TIGIvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2gteDg2XzY0LWFzbV82NC5TCmluZGV4IGEwMzlkMjEuLmEzNTBjOTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by90d29maXNoLXg4Nl82NC1hc21fNjQuUworKysgYi9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaC14ODZfNjQtYXNtXzY0LlMKQEAgLTI2NCw3ICsyNjQsNyBAQAogCW1vdnEJUjEsCTgoJXJzaSkKIAogCXBvcHEJUjEKLQltb3ZxCSQxLCVyYXgKKwltb3ZsCSQxLCVlYXgKIAlyZXQKIEVORFBST0ModHdvZmlzaF9lbmNfYmxrKQogCkBAIC0zMTYsNiArMzE2LDYgQEAKIAltb3ZxCVIxLAk4KCVyc2kpCiAKIAlwb3BxCVIxCi0JbW92cQkkMSwlcmF4CisJbW92bAkkMSwlZWF4CiAJcmV0CiBFTkRQUk9DKHR3b2Zpc2hfZGVjX2JsaykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NyeXB0by90d29maXNoX2F2eF9nbHVlLmMgYi9hcmNoL3g4Ni9jcnlwdG8vdHdvZmlzaF9hdnhfZ2x1ZS5jCmluZGV4IDFhYzUzMWUuLmI1ZTJkNTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2NyeXB0by90d29maXNoX2F2eF9nbHVlLmMKKysrIGIvYXJjaC94ODYvY3J5cHRvL3R3b2Zpc2hfYXZ4X2dsdWUuYwpAQCAtMzQwLDcgKzM0MCw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX2VjYi10d29maXNoLWF2eCIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1lY2ItdHdvZmlzaC1hdngiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gVEZfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCB0d29maXNoX2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKQEAgLTM1OSw3ICszNjAsOCBAQAogCS5jcmFfbmFtZQkJPSAiX19jYmMtdHdvZmlzaC1hdngiLAogCS5jcmFfZHJpdmVyX25hbWUJPSAiX19kcml2ZXItY2JjLXR3b2Zpc2gtYXZ4IiwKIAkuY3JhX3ByaW9yaXR5CQk9IDAsCi0JLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAorCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8CisJCQkJICBDUllQVE9fQUxHX0lOVEVSTkFMLAogCS5jcmFfYmxvY2tzaXplCQk9IFRGX0JMT0NLX1NJWkUsCiAJLmNyYV9jdHhzaXplCQk9IHNpemVvZihzdHJ1Y3QgdHdvZmlzaF9jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC0zNzgsNyArMzgwLDggQEAKIAkuY3JhX25hbWUJCT0gIl9fY3RyLXR3b2Zpc2gtYXZ4IiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLWN0ci10d29maXNoLWF2eCIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSAxLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IHR3b2Zpc2hfY3R4KSwKIAkuY3JhX2FsaWdubWFzawkJPSAwLApAQCAtMzk4LDcgKzQwMSw4IEBACiAJLmNyYV9uYW1lCQk9ICJfX2xydy10d29maXNoLWF2eCIsCiAJLmNyYV9kcml2ZXJfbmFtZQk9ICJfX2RyaXZlci1scnctdHdvZmlzaC1hdngiLAogCS5jcmFfcHJpb3JpdHkJCT0gMCwKLQkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIsCisJLmNyYV9mbGFncwkJPSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSIHwKKwkJCQkgIENSWVBUT19BTEdfSU5URVJOQUwsCiAJLmNyYV9ibG9ja3NpemUJCT0gVEZfQkxPQ0tfU0laRSwKIAkuY3JhX2N0eHNpemUJCT0gc2l6ZW9mKHN0cnVjdCB0d29maXNoX2xyd19jdHgpLAogCS5jcmFfYWxpZ25tYXNrCQk9IDAsCkBAIC00MjEsNyArNDI1LDggQEAKIAkuY3JhX25hbWUJCT0gIl9feHRzLXR3b2Zpc2gtYXZ4IiwKIAkuY3JhX2RyaXZlcl9uYW1lCT0gIl9fZHJpdmVyLXh0cy10d29maXNoLWF2eCIsCiAJLmNyYV9wcmlvcml0eQkJPSAwLAotCS5jcmFfZmxhZ3MJCT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiwKKwkuY3JhX2ZsYWdzCQk9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfAorCQkJCSAgQ1JZUFRPX0FMR19JTlRFUk5BTCwKIAkuY3JhX2Jsb2Nrc2l6ZQkJPSBURl9CTE9DS19TSVpFLAogCS5jcmFfY3R4c2l6ZQkJPSBzaXplb2Yoc3RydWN0IHR3b2Zpc2hfeHRzX2N0eCksCiAJLmNyYV9hbGlnbm1hc2sJCT0gMCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2lhMzIvTWFrZWZpbGUgYi9hcmNoL3g4Ni9pYTMyL01ha2VmaWxlCmluZGV4IGU3ODViNDIuLmJiNjM1YzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2lhMzIvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvaWEzMi9NYWtlZmlsZQpAQCAtMyw3ICszLDYgQEAKICMKIAogb2JqLSQoQ09ORklHX0lBMzJfRU1VTEFUSU9OKSA6PSBpYTMyZW50cnkubyBzeXNfaWEzMi5vIGlhMzJfc2lnbmFsLm8KLW9iai0kKENPTkZJR19JQTMyX0VNVUxBVElPTikgKz0gbm9zeXNjYWxsLm8gc3lzY2FsbF9pYTMyLm8KIAogb2JqLSQoQ09ORklHX0lBMzJfQU9VVCkgKz0gaWEzMl9hb3V0Lm8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaWEzMi9pYTMyX3NpZ25hbC5jIGIvYXJjaC94ODYvaWEzMi9pYTMyX3NpZ25hbC5jCmluZGV4IGQwMTY1YzkuLmM4MWQzNWU2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pYTMyL2lhMzJfc2lnbmFsLmMKKysrIGIvYXJjaC94ODYvaWEzMi9pYTMyX3NpZ25hbC5jCkBAIC0xNjEsOCArMTYxLDcgQEAKIH0KIAogc3RhdGljIGludCBpYTMyX3Jlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywKLQkJCQkgICBzdHJ1Y3Qgc2lnY29udGV4dF9pYTMyIF9fdXNlciAqc2MsCi0JCQkJICAgdW5zaWduZWQgaW50ICpwYXgpCisJCQkJICAgc3RydWN0IHNpZ2NvbnRleHRfaWEzMiBfX3VzZXIgKnNjKQogewogCXVuc2lnbmVkIGludCB0bXBmbGFncywgZXJyID0gMDsKIAl2b2lkIF9fdXNlciAqYnVmOwpAQCAtMTg0LDcgKzE4Myw3IEBACiAJCVJFTE9BRF9TRUcoZXMpOwogCiAJCUNPUFkoZGkpOyBDT1BZKHNpKTsgQ09QWShicCk7IENPUFkoc3ApOyBDT1BZKGJ4KTsKLQkJQ09QWShkeCk7IENPUFkoY3gpOyBDT1BZKGlwKTsKKwkJQ09QWShkeCk7IENPUFkoY3gpOyBDT1BZKGlwKTsgQ09QWShheCk7CiAJCS8qIERvbid0IHRvdWNoIGV4dGVuZGVkIHJlZ2lzdGVycyAqLwogCiAJCUNPUFlfU0VHX0NQTDMoY3MpOwpAQCAtMTk3LDEyICsxOTYsMTIgQEAKIAogCQlnZXRfdXNlcl9leCh0bXAsICZzYy0+ZnBzdGF0ZSk7CiAJCWJ1ZiA9IGNvbXBhdF9wdHIodG1wKTsKLQotCQlnZXRfdXNlcl9leCgqcGF4LCAmc2MtPmF4KTsKIAl9IGdldF91c2VyX2NhdGNoKGVycik7CiAKIAllcnIgfD0gcmVzdG9yZV94c3RhdGVfc2lnKGJ1ZiwgMSk7CiAKKwlmb3JjZV9pcmV0KCk7CisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMTEsNyArMjEwLDYgQEAKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGN1cnJlbnRfcHRfcmVncygpOwogCXN0cnVjdCBzaWdmcmFtZV9pYTMyIF9fdXNlciAqZnJhbWUgPSAoc3RydWN0IHNpZ2ZyYW1lX2lhMzIgX191c2VyICopKHJlZ3MtPnNwLTgpOwogCXNpZ3NldF90IHNldDsKLQl1bnNpZ25lZCBpbnQgYXg7CiAKIAlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJhbWUsIHNpemVvZigqZnJhbWUpKSkKIAkJZ290byBiYWRmcmFtZTsKQEAgLTIyNCw5ICsyMjIsOSBAQAogCiAJc2V0X2N1cnJlbnRfYmxvY2tlZCgmc2V0KTsKIAotCWlmIChpYTMyX3Jlc3RvcmVfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnNjLCAmYXgpKQorCWlmIChpYTMyX3Jlc3RvcmVfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnNjKSkKIAkJZ290byBiYWRmcmFtZTsKLQlyZXR1cm4gYXg7CisJcmV0dXJuIHJlZ3MtPmF4OwogCiBiYWRmcmFtZToKIAlzaWduYWxfZmF1bHQocmVncywgZnJhbWUsICIzMmJpdCBzaWdyZXR1cm4iKTsKQEAgLTIzOCw3ICsyMzYsNiBAQAogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gY3VycmVudF9wdF9yZWdzKCk7CiAJc3RydWN0IHJ0X3NpZ2ZyYW1lX2lhMzIgX191c2VyICpmcmFtZTsKIAlzaWdzZXRfdCBzZXQ7Ci0JdW5zaWduZWQgaW50IGF4OwogCiAJZnJhbWUgPSAoc3RydWN0IHJ0X3NpZ2ZyYW1lX2lhMzIgX191c2VyICopKHJlZ3MtPnNwIC0gNCk7CiAKQEAgLTI0OSwxMyArMjQ2LDEzIEBACiAKIAlzZXRfY3VycmVudF9ibG9ja2VkKCZzZXQpOwogCi0JaWYgKGlhMzJfcmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQsICZheCkpCisJaWYgKGlhMzJfcmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQpKQogCQlnb3RvIGJhZGZyYW1lOwogCiAJaWYgKGNvbXBhdF9yZXN0b3JlX2FsdHN0YWNrKCZmcmFtZS0+dWMudWNfc3RhY2spKQogCQlnb3RvIGJhZGZyYW1lOwogCi0JcmV0dXJuIGF4OworCXJldHVybiByZWdzLT5heDsKIAogYmFkZnJhbWU6CiAJc2lnbmFsX2ZhdWx0KHJlZ3MsIGZyYW1lLCAiMzJiaXQgcnQgc2lncmV0dXJuIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TIGIvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUwppbmRleCAxNTZlYmNhLi5hODIxYjFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TCisrKyBiL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKQEAgLTMwLDI0ICszMCwxMyBAQAogCiAJLnNlY3Rpb24gLmVudHJ5LnRleHQsICJheCIKIAotCS5tYWNybyBJQTMyX0FSR19GSVhVUCBub2VicD0wCi0JbW92bAklZWRpLCVyOGQKLQkuaWYgXG5vZWJwCi0JLmVsc2UKLQltb3ZsCSVlYnAsJXI5ZAotCS5lbmRpZgotCXhjaGcJJWVjeCwlZXNpCi0JbW92bAklZWJ4LCVlZGkKLQltb3ZsCSVlZHgsJWVkeAkvKiB6ZXJvIGV4dGVuc2lvbiAqLwotCS5lbmRtIAotCi0JLyogY2xvYmJlcnMgJWVheCAqLwkKLQkubWFjcm8gIENMRUFSX1JSRUdTIG9mZnNldD0wLCBfcjk9cmF4CisJLyogY2xvYmJlcnMgJXJheCAqLworCS5tYWNybyAgQ0xFQVJfUlJFR1MgX3I5PXJheAogCXhvcmwgCSVlYXgsJWVheAotCW1vdnEJJXJheCxcb2Zmc2V0K1IxMSglcnNwKQotCW1vdnEJJXJheCxcb2Zmc2V0K1IxMCglcnNwKQotCW1vdnEJJVxfcjksXG9mZnNldCtSOSglcnNwKQotCW1vdnEJJXJheCxcb2Zmc2V0K1I4KCVyc3ApCisJbW92cQklcmF4LFIxMSglcnNwKQorCW1vdnEJJXJheCxSMTAoJXJzcCkKKwltb3ZxCSVcX3I5LFI5KCVyc3ApCisJbW92cQklcmF4LFI4KCVyc3ApCiAJLmVuZG0KIAogCS8qCkBAIC02MCwxNCArNDksMTQgQEAKIAkgKiBJZiBpdCdzIC0xIHRvIG1ha2UgdXMgcHVudCB0aGUgc3lzY2FsbCwgdGhlbiAodTMyKS0xIGlzIHN0aWxsCiAJICogYW4gYXBwcm9wcmlhdGVseSBpbnZhbGlkIHZhbHVlLgogCSAqLwotCS5tYWNybyBMT0FEX0FSR1MzMiBvZmZzZXQsIF9yOT0wCisJLm1hY3JvIExPQURfQVJHUzMyIF9yOT0wCiAJLmlmIFxfcjkKLQltb3ZsIFxvZmZzZXQrMTYoJXJzcCksJXI5ZAorCW1vdmwgUjkoJXJzcCksJXI5ZAogCS5lbmRpZgotCW1vdmwgXG9mZnNldCs0MCglcnNwKSwlZWN4Ci0JbW92bCBcb2Zmc2V0KzQ4KCVyc3ApLCVlZHgKLQltb3ZsIFxvZmZzZXQrNTYoJXJzcCksJWVzaQotCW1vdmwgXG9mZnNldCs2NCglcnNwKSwlZWRpCisJbW92bCBSQ1goJXJzcCksJWVjeAorCW1vdmwgUkRYKCVyc3ApLCVlZHgKKwltb3ZsIFJTSSglcnNwKSwlZXNpCisJbW92bCBSREkoJXJzcCksJWVkaQogCW1vdmwgJWVheCwlZWF4CQkJLyogemVybyBleHRlbnNpb24gKi8KIAkuZW5kbQogCQpAQCAtOTksNTQgKzg4LDY5IEBACiAvKgogICogMzJiaXQgU1lTRU5URVIgaW5zdHJ1Y3Rpb24gZW50cnkuCiAgKgorICogU1lTRU5URVIgbG9hZHMgc3MsIHJzcCwgY3MsIGFuZCByaXAgZnJvbSBwcmV2aW91c2x5IHByb2dyYW1tZWQgTVNScy4KKyAqIElGIGFuZCBWTSBpbiByZmxhZ3MgYXJlIGNsZWFyZWQgKElPVzogaW50ZXJydXB0cyBhcmUgb2ZmKS4KKyAqIFNZU0VOVEVSIGRvZXMgbm90IHNhdmUgYW55dGhpbmcgb24gdGhlIHN0YWNrLAorICogYW5kIGRvZXMgbm90IHNhdmUgb2xkIHJpcCAoISEhKSBhbmQgcmZsYWdzLgorICoKICAqIEFyZ3VtZW50czoKLSAqICVlYXgJU3lzdGVtIGNhbGwgbnVtYmVyLgotICogJWVieCBBcmcxCi0gKiAlZWN4IEFyZzIKLSAqICVlZHggQXJnMwotICogJWVzaSBBcmc0Ci0gKiAlZWRpIEFyZzUKLSAqICVlYnAgdXNlciBzdGFjawotICogMCglZWJwKSBBcmc2CQotICogCQotICogSW50ZXJydXB0cyBvZmYuCi0gKgkKKyAqIGVheCAgc3lzdGVtIGNhbGwgbnVtYmVyCisgKiBlYnggIGFyZzEKKyAqIGVjeCAgYXJnMgorICogZWR4ICBhcmczCisgKiBlc2kgIGFyZzQKKyAqIGVkaSAgYXJnNQorICogZWJwICB1c2VyIHN0YWNrCisgKiAwKCVlYnApIGFyZzYKKyAqCiAgKiBUaGlzIGlzIHB1cmVseSBhIGZhc3QgcGF0aC4gRm9yIGFueXRoaW5nIGNvbXBsaWNhdGVkIHdlIHVzZSB0aGUgaW50IDB4ODAKLSAqIHBhdGggYmVsb3cuCVNldCB1cCBhIGNvbXBsZXRlIGhhcmR3YXJlIHN0YWNrIGZyYW1lIHRvIHNoYXJlIGNvZGUKKyAqIHBhdGggYmVsb3cuIFdlIHNldCB1cCBhIGNvbXBsZXRlIGhhcmR3YXJlIHN0YWNrIGZyYW1lIHRvIHNoYXJlIGNvZGUKICAqIHdpdGggdGhlIGludCAweDgwIHBhdGguCi0gKi8gCQorICovCiBFTlRSWShpYTMyX3N5c2VudGVyX3RhcmdldCkKIAlDRklfU1RBUlRQUk9DMzIJc2ltcGxlCiAJQ0ZJX1NJR05BTF9GUkFNRQogCUNGSV9ERUZfQ0ZBCXJzcCwwCiAJQ0ZJX1JFR0lTVEVSCXJzcCxyYnAKLQlTV0FQR1NfVU5TQUZFX1NUQUNLCi0JbW92cQlQRVJfQ1BVX1ZBUihrZXJuZWxfc3RhY2spLCAlcnNwCi0JYWRkcQkkKEtFUk5FTF9TVEFDS19PRkZTRVQpLCVyc3AKKwogCS8qCi0JICogTm8gbmVlZCB0byBmb2xsb3cgdGhpcyBpcnFzIG9uL29mZiBzZWN0aW9uOiB0aGUgc3lzY2FsbAotCSAqIGRpc2FibGVkIGlycXMsIGhlcmUgd2UgZW5hYmxlIGl0IHN0cmFpZ2h0IGFmdGVyIGVudHJ5OgorCSAqIEludGVycnVwdHMgYXJlIG9mZiBvbiBlbnRyeS4KKwkgKiBXZSBkbyBub3QgZnJhbWUgdGhpcyB0aW55IGlycS1vZmYgYmxvY2sgd2l0aCBUUkFDRV9JUlFTX09GRi9PTiwKKwkgKiBpdCBpcyB0b28gc21hbGwgdG8gZXZlciBjYXVzZSBub3RpY2VhYmxlIGlycSBsYXRlbmN5LgogCSAqLworCVNXQVBHU19VTlNBRkVfU1RBQ0sKKwltb3ZxCVBFUl9DUFVfVkFSKGNwdV90c3MgKyBUU1Nfc3AwKSwgJXJzcAogCUVOQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKLSAJbW92bAklZWJwLCVlYnAJCS8qIHplcm8gZXh0ZW5zaW9uICovCi0JcHVzaHFfY2ZpICRfX1VTRVIzMl9EUwotCS8qQ0ZJX1JFTF9PRkZTRVQgc3MsMCovCi0JcHVzaHFfY2ZpICVyYnAKLQlDRklfUkVMX09GRlNFVCByc3AsMAotCXB1c2hmcV9jZmkKLQkvKkNGSV9SRUxfT0ZGU0VUIHJmbGFncywwKi8KLQltb3ZsCVRJX3N5c2VudGVyX3JldHVybitUSFJFQURfSU5GTyglcnNwLDMqOC1LRVJORUxfU1RBQ0tfT0ZGU0VUKSwlcjEwZAotCUNGSV9SRUdJU1RFUiByaXAscjEwCi0JcHVzaHFfY2ZpICRfX1VTRVIzMl9DUwotCS8qQ0ZJX1JFTF9PRkZTRVQgY3MsMCovCisKKwkvKiBaZXJvLWV4dGVuZGluZyAzMi1iaXQgcmVncywgZG8gbm90IHJlbW92ZSAqLworCW1vdmwJJWVicCwgJWVicAogCW1vdmwJJWVheCwgJWVheAotCXB1c2hxX2NmaSAlcjEwCi0JQ0ZJX1JFTF9PRkZTRVQgcmlwLDAKLQlwdXNocV9jZmkgJXJheAorCisJbW92bAlBU01fVEhSRUFEX0lORk8oVElfc3lzZW50ZXJfcmV0dXJuLCAlcnNwLCAwKSwgJXIxMGQKKwlDRklfUkVHSVNURVIgcmlwLHIxMAorCisJLyogQ29uc3RydWN0IHN0cnVjdCBwdF9yZWdzIG9uIHN0YWNrICovCisJcHVzaHFfY2ZpCSRfX1VTRVIzMl9EUwkJLyogcHRfcmVncy0+c3MgKi8KKwlwdXNocV9jZmkJJXJicAkJCS8qIHB0X3JlZ3MtPnNwICovCisJQ0ZJX1JFTF9PRkZTRVQJcnNwLDAKKwlwdXNoZnFfY2ZpCQkJCS8qIHB0X3JlZ3MtPmZsYWdzICovCisJcHVzaHFfY2ZpCSRfX1VTRVIzMl9DUwkJLyogcHRfcmVncy0+Y3MgKi8KKwlwdXNocV9jZmkJJXIxMCAvKiBwdF9yZWdzLT5pcCA9IHRocmVhZF9pbmZvLT5zeXNlbnRlcl9yZXR1cm4gKi8KKwlDRklfUkVMX09GRlNFVAlyaXAsMAorCXB1c2hxX2NmaV9yZWcJcmF4CQkJLyogcHRfcmVncy0+b3JpZ19heCAqLworCXB1c2hxX2NmaV9yZWcJcmRpCQkJLyogcHRfcmVncy0+ZGkgKi8KKwlwdXNocV9jZmlfcmVnCXJzaQkJCS8qIHB0X3JlZ3MtPnNpICovCisJcHVzaHFfY2ZpX3JlZwlyZHgJCQkvKiBwdF9yZWdzLT5keCAqLworCXB1c2hxX2NmaV9yZWcJcmN4CQkJLyogcHRfcmVncy0+Y3ggKi8KKwlwdXNocV9jZmlfcmVnCXJheAkJCS8qIHB0X3JlZ3MtPmF4ICovCiAJY2xkCi0JU0FWRV9BUkdTIDAsMSwwCi0gCS8qIG5vIG5lZWQgdG8gZG8gYW4gYWNjZXNzX29rIGNoZWNrIGhlcmUgYmVjYXVzZSByYnAgaGFzIGJlZW4KLSAJICAgMzJiaXQgemVybyBleHRlbmRlZCAqLyAKKwlzdWIJJCgxMCo4KSwlcnNwIC8qIHB0X3JlZ3MtPnI4LTExLGJwLGJ4LHIxMi0xNSBub3Qgc2F2ZWQgKi8KKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgMTAqOAorCisJLyoKKwkgKiBubyBuZWVkIHRvIGRvIGFuIGFjY2Vzc19vayBjaGVjayBoZXJlIGJlY2F1c2UgcmJwIGhhcyBiZWVuCisJICogMzJiaXQgemVybyBleHRlbmRlZAorCSAqLwogCUFTTV9TVEFDCiAxOgltb3ZsCSglcmJwKSwlZWJwCiAJX0FTTV9FWFRBQkxFKDFiLGlhMzJfYmFkYXJnKQpAQCAtMTU3LDQyICsxNjEsODAgQEAKIAkgKiBvdXJzZWx2ZXMuICBUbyBzYXZlIGEgZmV3IGN5Y2xlcywgd2UgY2FuIGNoZWNrIHdoZXRoZXIKIAkgKiBOVCB3YXMgc2V0IGluc3RlYWQgb2YgZG9pbmcgYW4gdW5jb25kaXRpb25hbCBwb3BmcS4KIAkgKi8KLQl0ZXN0bCAkWDg2X0VGTEFHU19OVCxFRkxBR1MtQVJHT0ZGU0VUKCVyc3ApCisJdGVzdGwgJFg4Nl9FRkxBR1NfTlQsRUZMQUdTKCVyc3ApCiAJam56IHN5c2VudGVyX2ZpeF9mbGFncwogc3lzZW50ZXJfZmxhZ3NfZml4ZWQ6CiAKLQlvcmwgICAgICRUU19DT01QQVQsVElfc3RhdHVzK1RIUkVBRF9JTkZPKCVyc3AsUklQLUFSR09GRlNFVCkKLQl0ZXN0bCAgICRfVElGX1dPUktfU1lTQ0FMTF9FTlRSWSxUSV9mbGFncytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCisJb3JsICAgICAkVFNfQ09NUEFULCBBU01fVEhSRUFEX0lORk8oVElfc3RhdHVzLCAlcnNwLCBTSVpFT0ZfUFRSRUdTKQorCXRlc3RsICAgJF9USUZfV09SS19TWVNDQUxMX0VOVFJZLCBBU01fVEhSRUFEX0lORk8oVElfZmxhZ3MsICVyc3AsIFNJWkVPRl9QVFJFR1MpCiAJQ0ZJX1JFTUVNQkVSX1NUQVRFCiAJam56ICBzeXNlbnRlcl90cmFjZXN5cwogCWNtcHEJJChJQTMyX05SX3N5c2NhbGxzLTEpLCVyYXgKIAlqYQlpYTMyX2JhZHN5cwogc3lzZW50ZXJfZG9fY2FsbDoKLQlJQTMyX0FSR19GSVhVUAorCS8qIDMyYml0IHN5c2NhbGwgLT4gNjRiaXQgQyBBQkkgYXJndW1lbnQgY29udmVyc2lvbiAqLworCW1vdmwJJWVkaSwlcjhkCS8qIGFyZzUgKi8KKwltb3ZsCSVlYnAsJXI5ZAkvKiBhcmc2ICovCisJeGNoZwklZWN4LCVlc2kJLyogcnNpOmFyZzIsIHJjeDphcmc0ICovCisJbW92bAklZWJ4LCVlZGkJLyogYXJnMSAqLworCW1vdmwJJWVkeCwlZWR4CS8qIGFyZzMgKHplcm8gZXh0ZW5zaW9uKSAqLwogc3lzZW50ZXJfZGlzcGF0Y2g6CiAJY2FsbAkqaWEzMl9zeXNfY2FsbF90YWJsZSgsJXJheCw4KQotCW1vdnEJJXJheCxSQVgtQVJHT0ZGU0VUKCVyc3ApCisJbW92cQklcmF4LFJBWCglcnNwKQogCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCiAJVFJBQ0VfSVJRU19PRkYKLQl0ZXN0bAkkX1RJRl9BTExXT1JLX01BU0ssVElfZmxhZ3MrVEhSRUFEX0lORk8oJXJzcCxSSVAtQVJHT0ZGU0VUKQorCXRlc3RsCSRfVElGX0FMTFdPUktfTUFTSywgQVNNX1RIUkVBRF9JTkZPKFRJX2ZsYWdzLCAlcnNwLCBTSVpFT0ZfUFRSRUdTKQogCWpueglzeXNleGl0X2F1ZGl0CiBzeXNleGl0X2Zyb21fc3lzX2NhbGw6Ci0JYW5kbCAgICAkflRTX0NPTVBBVCxUSV9zdGF0dXMrVEhSRUFEX0lORk8oJXJzcCxSSVAtQVJHT0ZGU0VUKQotCS8qIGNsZWFyIElGLCB0aGF0IHBvcGZxIGRvZXNuJ3QgZW5hYmxlIGludGVycnVwdHMgZWFybHkgKi8KLQlhbmRsCSR+MHgyMDAsRUZMQUdTLUFSR09GRlNFVCglcnNwKQotCW1vdmwJUklQLUFSR09GRlNFVCglcnNwKSwlZWR4CQkvKiBVc2VyICVlaXAgKi8KLQlDRklfUkVHSVNURVIgcmlwLHJkeAotCVJFU1RPUkVfQVJHUyAwLDI0LDAsMCwwLDAKKwkvKgorCSAqIE5COiBTWVNFWElUIGlzIG5vdCBvYnZpb3VzbHkgc2FmZSBmb3IgNjQtYml0IGtlcm5lbHMgLS0gYW4KKwkgKiBOTUkgYmV0d2VlbiBTVEkgYW5kIFNZU0VYSVQgaGFzIHBvb3JseSBzcGVjaWZpZWQgYmVoYXZpb3IsCisJICogYW5kIGFuZCBOTUkgZm9sbG93ZWQgYnkgYW4gSVJRIHdpdGggdXNlcmdzIGlzIGZhdGFsLiAgU28KKwkgKiB3ZSBqdXN0IHByZXRlbmQgd2UncmUgdXNpbmcgU1lTRVhJVCBidXQgd2UgcmVhbGx5IHVzZQorCSAqIFNZU1JFVEwgaW5zdGVhZC4KKwkgKgorCSAqIFRoaXMgY29kZSBwYXRoIGlzIHN0aWxsIGNhbGxlZCAnc3lzZXhpdCcgYmVjYXVzZSBpdCBwYWlycworCSAqIHdpdGggJ3N5c2VudGVyJyBhbmQgaXQgdXNlcyB0aGUgU1lTRU5URVIgY2FsbGluZyBjb252ZW50aW9uLgorCSAqLworCWFuZGwgICAgJH5UU19DT01QQVQsQVNNX1RIUkVBRF9JTkZPKFRJX3N0YXR1cywgJXJzcCwgU0laRU9GX1BUUkVHUykKKwltb3ZsCVJJUCglcnNwKSwlZWN4CQkvKiBVc2VyICVlaXAgKi8KKwlDRklfUkVHSVNURVIgcmlwLHJjeAorCVJFU1RPUkVfUlNJX1JESQorCXhvcmwJJWVkeCwlZWR4CQkvKiBhdm9pZCBpbmZvIGxlYWtzICovCiAJeG9ycQklcjgsJXI4CiAJeG9ycQklcjksJXI5CiAJeG9ycQklcjEwLCVyMTAKLQl4b3JxCSVyMTEsJXIxMQotCXBvcGZxX2NmaQorCW1vdmwJRUZMQUdTKCVyc3ApLCVyMTFkCS8qIFVzZXIgZWZsYWdzICovCiAJLypDRklfUkVTVE9SRSByZmxhZ3MqLwotCXBvcHFfY2ZpICVyY3gJCQkJLyogVXNlciAlZXNwICovCi0JQ0ZJX1JFR0lTVEVSIHJzcCxyY3gKIAlUUkFDRV9JUlFTX09OCi0JRU5BQkxFX0lOVEVSUlVQVFNfU1lTRVhJVDMyCisKKwkvKgorCSAqIFNZU1JFVEwgd29ya3MgZXZlbiBvbiBJbnRlbCBDUFVzLiAgVXNlIGl0IGluIHByZWZlcmVuY2UgdG8gU1lTRVhJVCwKKwkgKiBzaW5jZSBpdCBhdm9pZHMgYSBkaWNleSB3aW5kb3cgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuCisJICovCisJbW92bAlSU1AoJXJzcCksJWVzcAorCisJLyoKKwkgKiBVU0VSR1NfU1lTUkVUMzIgZG9lczoKKwkgKiAgZ3NiYXNlID0gdXNlcidzIGdzIGJhc2UKKwkgKiAgZWlwID0gZWN4CisJICogIHJmbGFncyA9IHIxMQorCSAqICBjcyA9IF9fVVNFUjMyX0NTCisJICogIHNzID0gX19VU0VSX0RTCisJICoKKwkgKiBUaGUgcHJvbG9ndWUgc2V0IFJJUCglcnNwKSB0byBWRFNPMzJfU1lTRU5URVJfUkVUVVJOLCB3aGljaCBkb2VzOgorCSAqCisJICogIHBvcCAlZWJwCisJICogIHBvcCAlZWR4CisJICogIHBvcCAlZWN4CisJICoKKwkgKiBUaGVyZWZvcmUsIHdlIGludm9rZSBTWVNSRVRMIHdpdGggRURYIGFuZCBSOC1SMTAgemVyb2VkIHRvCisJICogYXZvaWQgaW5mbyBsZWFrcy4gIFIxMSBlbmRzIHVwIHdpdGggVkRTTzMyX1NZU0VOVEVSX1JFVFVSTidzCisJICogYWRkcmVzcyAoYWxyZWFkeSBrbm93biB0byB1c2VyIGNvZGUpLCBhbmQgUjEyLVIxNSBhcmUKKwkgKiBjYWxsZWUtc2F2ZWQgYW5kIHRoZXJlZm9yZSBkb24ndCBjb250YWluIGFueSBpbnRlcmVzdGluZworCSAqIGtlcm5lbCBkYXRhLgorCSAqLworCVVTRVJHU19TWVNSRVQzMgogCiAJQ0ZJX1JFU1RPUkVfU1RBVEUKIApAQCAtMjA1LDE4ICsyNDcsMTggQEAKIAltb3ZsICVlYngsJWVzaQkJCS8qIDJuZCBhcmc6IDFzdCBzeXNjYWxsIGFyZyAqLwogCW1vdmwgJWVheCwlZWRpCQkJLyogMXN0IGFyZzogc3lzY2FsbCBudW1iZXIgKi8KIAljYWxsIF9fYXVkaXRfc3lzY2FsbF9lbnRyeQotCW1vdmwgUkFYLUFSR09GRlNFVCglcnNwKSwlZWF4CS8qIHJlbG9hZCBzeXNjYWxsIG51bWJlciAqLworCW1vdmwgUkFYKCVyc3ApLCVlYXgJLyogcmVsb2FkIHN5c2NhbGwgbnVtYmVyICovCiAJY21wcSAkKElBMzJfTlJfc3lzY2FsbHMtMSksJXJheAogCWphIGlhMzJfYmFkc3lzCiAJbW92bCAlZWJ4LCVlZGkJCQkvKiByZWxvYWQgMXN0IHN5c2NhbGwgYXJnICovCi0JbW92bCBSQ1gtQVJHT0ZGU0VUKCVyc3ApLCVlc2kJLyogcmVsb2FkIDJuZCBzeXNjYWxsIGFyZyAqLwotCW1vdmwgUkRYLUFSR09GRlNFVCglcnNwKSwlZWR4CS8qIHJlbG9hZCAzcmQgc3lzY2FsbCBhcmcgKi8KLQltb3ZsIFJTSS1BUkdPRkZTRVQoJXJzcCksJWVjeAkvKiByZWxvYWQgNHRoIHN5c2NhbGwgYXJnICovCi0JbW92bCBSREktQVJHT0ZGU0VUKCVyc3ApLCVyOGQJLyogcmVsb2FkIDV0aCBzeXNjYWxsIGFyZyAqLworCW1vdmwgUkNYKCVyc3ApLCVlc2kJLyogcmVsb2FkIDJuZCBzeXNjYWxsIGFyZyAqLworCW1vdmwgUkRYKCVyc3ApLCVlZHgJLyogcmVsb2FkIDNyZCBzeXNjYWxsIGFyZyAqLworCW1vdmwgUlNJKCVyc3ApLCVlY3gJLyogcmVsb2FkIDR0aCBzeXNjYWxsIGFyZyAqLworCW1vdmwgUkRJKCVyc3ApLCVyOGQJLyogcmVsb2FkIDV0aCBzeXNjYWxsIGFyZyAqLwogCS5lbmRtCiAKIAkubWFjcm8gYXVkaXRzeXNfZXhpdCBleGl0Ci0JdGVzdGwgJChfVElGX0FMTFdPUktfTUFTSyAmIH5fVElGX1NZU0NBTExfQVVESVQpLFRJX2ZsYWdzK1RIUkVBRF9JTkZPKCVyc3AsUklQLUFSR09GRlNFVCkKKwl0ZXN0bCAkKF9USUZfQUxMV09SS19NQVNLICYgfl9USUZfU1lTQ0FMTF9BVURJVCksIEFTTV9USFJFQURfSU5GTyhUSV9mbGFncywgJXJzcCwgU0laRU9GX1BUUkVHUykKIAlqbnogaWEzMl9yZXRfZnJvbV9zeXNfY2FsbAogCVRSQUNFX0lSUVNfT04KIAlFTkFCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCkBAIC0yMjcsMTMgKzI2OSwxMyBAQAogMToJc2V0YmUgJWFsCQkvKiAxIGlmIGVycm9yLCAwIGlmIG5vdCAqLwogCW1vdnpibCAlYWwsJWVkaQkJLyogemVyby1leHRlbmQgdGhhdCBpbnRvICVlZGkgKi8KIAljYWxsIF9fYXVkaXRfc3lzY2FsbF9leGl0Ci0JbW92cSBSQVgtQVJHT0ZGU0VUKCVyc3ApLCVyYXgJLyogcmVsb2FkIHN5c2NhbGwgcmV0dXJuIHZhbHVlICovCisJbW92cSBSQVgoJXJzcCksJXJheAkvKiByZWxvYWQgc3lzY2FsbCByZXR1cm4gdmFsdWUgKi8KIAltb3ZsICQoX1RJRl9BTExXT1JLX01BU0sgJiB+X1RJRl9TWVNDQUxMX0FVRElUKSwlZWRpCiAJRElTQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKIAlUUkFDRV9JUlFTX09GRgotCXRlc3RsICVlZGksVElfZmxhZ3MrVEhSRUFEX0lORk8oJXJzcCxSSVAtQVJHT0ZGU0VUKQorCXRlc3RsICVlZGksIEFTTV9USFJFQURfSU5GTyhUSV9mbGFncywgJXJzcCwgU0laRU9GX1BUUkVHUykKIAlqeiBcZXhpdAotCUNMRUFSX1JSRUdTIC1BUkdPRkZTRVQKKwlDTEVBUl9SUkVHUwogCWptcCBpbnRfd2l0aF9jaGVjawogCS5lbmRtCiAKQEAgLTI1MywxNiArMjk1LDE2IEBACiAKIHN5c2VudGVyX3RyYWNlc3lzOgogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKLQl0ZXN0bAkkKF9USUZfV09SS19TWVNDQUxMX0VOVFJZICYgfl9USUZfU1lTQ0FMTF9BVURJVCksVElfZmxhZ3MrVEhSRUFEX0lORk8oJXJzcCxSSVAtQVJHT0ZGU0VUKQorCXRlc3RsCSQoX1RJRl9XT1JLX1NZU0NBTExfRU5UUlkgJiB+X1RJRl9TWVNDQUxMX0FVRElUKSwgQVNNX1RIUkVBRF9JTkZPKFRJX2ZsYWdzLCAlcnNwLCBTSVpFT0ZfUFRSRUdTKQogCWp6CXN5c2VudGVyX2F1ZGl0c3lzCiAjZW5kaWYKLQlTQVZFX1JFU1QKKwlTQVZFX0VYVFJBX1JFR1MKIAlDTEVBUl9SUkVHUwogCW1vdnEJJC1FTk9TWVMsUkFYKCVyc3ApLyogcHRyYWNlIGNhbiBjaGFuZ2UgdGhpcyBmb3IgYSBiYWQgc3lzY2FsbCAqLwogCW1vdnEJJXJzcCwlcmRpICAgICAgICAvKiAmcHRfcmVncyAtPiBhcmcxICovCiAJY2FsbAlzeXNjYWxsX3RyYWNlX2VudGVyCi0JTE9BRF9BUkdTMzIgQVJHT0ZGU0VUICAvKiByZWxvYWQgYXJncyBmcm9tIHN0YWNrIGluIGNhc2UgcHRyYWNlIGNoYW5nZWQgaXQgKi8KLQlSRVNUT1JFX1JFU1QKKwlMT0FEX0FSR1MzMiAgLyogcmVsb2FkIGFyZ3MgZnJvbSBzdGFjayBpbiBjYXNlIHB0cmFjZSBjaGFuZ2VkIGl0ICovCisJUkVTVE9SRV9FWFRSQV9SRUdTCiAJY21wcQkkKElBMzJfTlJfc3lzY2FsbHMtMSksJXJheAogCWphCWludF9yZXRfZnJvbV9zeXNfY2FsbCAvKiBzeXNlbnRlcl90cmFjZXN5cyBoYXMgc2V0IFJBWCglcnNwKSAqLwogCWptcAlzeXNlbnRlcl9kb19jYWxsCkBAIC0yNzIsOTQgKzMxNCwxMjggQEAKIC8qCiAgKiAzMmJpdCBTWVNDQUxMIGluc3RydWN0aW9uIGVudHJ5LgogICoKKyAqIDMyYml0IFNZU0NBTEwgc2F2ZXMgcmlwIHRvIHJjeCwgY2xlYXJzIHJmbGFncy5SRiwgdGhlbiBzYXZlcyByZmxhZ3MgdG8gcjExLAorICogdGhlbiBsb2FkcyBuZXcgc3MsIGNzLCBhbmQgcmlwIGZyb20gcHJldmlvdXNseSBwcm9ncmFtbWVkIE1TUnMuCisgKiByZmxhZ3MgZ2V0cyBtYXNrZWQgYnkgYSB2YWx1ZSBmcm9tIGFub3RoZXIgTVNSIChzbyBDTEQgYW5kIENMQUMKKyAqIGFyZSBub3QgbmVlZGVkKS4gU1lTQ0FMTCBkb2VzIG5vdCBzYXZlIGFueXRoaW5nIG9uIHRoZSBzdGFjaworICogYW5kIGRvZXMgbm90IGNoYW5nZSByc3AuCisgKgorICogTm90ZTogcmZsYWdzIHNhdmluZyttYXNraW5nLXdpdGgtTVNSIGhhcHBlbnMgb25seSBpbiBMb25nIG1vZGUKKyAqIChpbiBsZWdhY3kgMzJiaXQgbW9kZSwgSUYsIFJGIGFuZCBWTSBiaXRzIGFyZSBjbGVhcmVkIGFuZCB0aGF0J3MgaXQpLgorICogRG9uJ3QgZ2V0IGNvbmZ1c2VkOiByZmxhZ3Mgc2F2aW5nK21hc2tpbmcgZGVwZW5kcyBvbiBMb25nIE1vZGUgQWN0aXZlIGJpdAorICogKEVGRVIuTE1BPTEpLCBOT1Qgb24gYml0bmVzcyBvZiB1c2Vyc3BhY2Ugd2hlcmUgU1lTQ0FMTCBleGVjdXRlcworICogb3IgdGFyZ2V0IENTIGRlc2NyaXB0b3IncyBMIGJpdCAoU1lTQ0FMTCBkb2VzIG5vdCByZWFkIHNlZ21lbnQgZGVzY3JpcHRvcnMpLgorICoKICAqIEFyZ3VtZW50czoKLSAqICVlYXgJU3lzdGVtIGNhbGwgbnVtYmVyLgotICogJWVieCBBcmcxCi0gKiAlZWN4IHJldHVybiBFSVAgCi0gKiAlZWR4IEFyZzMKLSAqICVlc2kgQXJnNAotICogJWVkaSBBcmc1Ci0gKiAlZWJwIEFyZzIgICAgW25vdGU6IG5vdCBzYXZlZCBpbiB0aGUgc3RhY2sgZnJhbWUsIHNob3VsZCBub3QgYmUgdG91Y2hlZF0KLSAqICVlc3AgdXNlciBzdGFjayAKLSAqIDAoJWVzcCkgQXJnNgotICogCQotICogSW50ZXJydXB0cyBvZmYuCi0gKgkKKyAqIGVheCAgc3lzdGVtIGNhbGwgbnVtYmVyCisgKiBlY3ggIHJldHVybiBhZGRyZXNzCisgKiBlYnggIGFyZzEKKyAqIGVicCAgYXJnMgkobm90ZTogbm90IHNhdmVkIGluIHRoZSBzdGFjayBmcmFtZSwgc2hvdWxkIG5vdCBiZSB0b3VjaGVkKQorICogZWR4ICBhcmczCisgKiBlc2kgIGFyZzQKKyAqIGVkaSAgYXJnNQorICogZXNwICB1c2VyIHN0YWNrCisgKiAwKCVlc3ApIGFyZzYKKyAqCiAgKiBUaGlzIGlzIHB1cmVseSBhIGZhc3QgcGF0aC4gRm9yIGFueXRoaW5nIGNvbXBsaWNhdGVkIHdlIHVzZSB0aGUgaW50IDB4ODAKLSAqIHBhdGggYmVsb3cuCVNldCB1cCBhIGNvbXBsZXRlIGhhcmR3YXJlIHN0YWNrIGZyYW1lIHRvIHNoYXJlIGNvZGUKLSAqIHdpdGggdGhlIGludCAweDgwIHBhdGguCQotICovIAkKKyAqIHBhdGggYmVsb3cuIFdlIHNldCB1cCBhIGNvbXBsZXRlIGhhcmR3YXJlIHN0YWNrIGZyYW1lIHRvIHNoYXJlIGNvZGUKKyAqIHdpdGggdGhlIGludCAweDgwIHBhdGguCisgKi8KIEVOVFJZKGlhMzJfY3N0YXJfdGFyZ2V0KQogCUNGSV9TVEFSVFBST0MzMglzaW1wbGUKIAlDRklfU0lHTkFMX0ZSQU1FCi0JQ0ZJX0RFRl9DRkEJcnNwLEtFUk5FTF9TVEFDS19PRkZTRVQKKwlDRklfREVGX0NGQQlyc3AsMAogCUNGSV9SRUdJU1RFUglyaXAscmN4CiAJLypDRklfUkVHSVNURVIJcmZsYWdzLHIxMSovCisKKwkvKgorCSAqIEludGVycnVwdHMgYXJlIG9mZiBvbiBlbnRyeS4KKwkgKiBXZSBkbyBub3QgZnJhbWUgdGhpcyB0aW55IGlycS1vZmYgYmxvY2sgd2l0aCBUUkFDRV9JUlFTX09GRi9PTiwKKwkgKiBpdCBpcyB0b28gc21hbGwgdG8gZXZlciBjYXVzZSBub3RpY2VhYmxlIGlycSBsYXRlbmN5LgorCSAqLwogCVNXQVBHU19VTlNBRkVfU1RBQ0sKIAltb3ZsCSVlc3AsJXI4ZAogCUNGSV9SRUdJU1RFUglyc3AscjgKIAltb3ZxCVBFUl9DUFVfVkFSKGtlcm5lbF9zdGFjayksJXJzcAotCS8qCi0JICogTm8gbmVlZCB0byBmb2xsb3cgdGhpcyBpcnFzIG9uL29mZiBzZWN0aW9uOiB0aGUgc3lzY2FsbAotCSAqIGRpc2FibGVkIGlycXMgYW5kIGhlcmUgd2UgZW5hYmxlIGl0IHN0cmFpZ2h0IGFmdGVyIGVudHJ5OgotCSAqLwogCUVOQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKLQlTQVZFX0FSR1MgOCwwLDAKLQltb3ZsIAklZWF4LCVlYXgJLyogemVybyBleHRlbnNpb24gKi8KLQltb3ZxCSVyYXgsT1JJR19SQVgtQVJHT0ZGU0VUKCVyc3ApCi0JbW92cQklcmN4LFJJUC1BUkdPRkZTRVQoJXJzcCkKLQlDRklfUkVMX09GRlNFVCByaXAsUklQLUFSR09GRlNFVAotCW1vdnEJJXJicCxSQ1gtQVJHT0ZGU0VUKCVyc3ApIC8qIHRoaXMgbGllcyBzbGlnaHRseSB0byBwdHJhY2UgKi8KKworCS8qIFplcm8tZXh0ZW5kaW5nIDMyLWJpdCByZWdzLCBkbyBub3QgcmVtb3ZlICovCisJbW92bAklZWF4LCVlYXgKKworCS8qIENvbnN0cnVjdCBzdHJ1Y3QgcHRfcmVncyBvbiBzdGFjayAqLworCXB1c2hxX2NmaQkkX19VU0VSMzJfRFMJCS8qIHB0X3JlZ3MtPnNzICovCisJcHVzaHFfY2ZpCSVyOAkJCS8qIHB0X3JlZ3MtPnNwICovCisJQ0ZJX1JFTF9PRkZTRVQgcnNwLDAKKwlwdXNocV9jZmkJJXIxMQkJCS8qIHB0X3JlZ3MtPmZsYWdzICovCisJcHVzaHFfY2ZpCSRfX1VTRVIzMl9DUwkJLyogcHRfcmVncy0+Y3MgKi8KKwlwdXNocV9jZmkJJXJjeAkJCS8qIHB0X3JlZ3MtPmlwICovCisJQ0ZJX1JFTF9PRkZTRVQgcmlwLDAKKwlwdXNocV9jZmlfcmVnCXJheAkJCS8qIHB0X3JlZ3MtPm9yaWdfYXggKi8KKwlwdXNocV9jZmlfcmVnCXJkaQkJCS8qIHB0X3JlZ3MtPmRpICovCisJcHVzaHFfY2ZpX3JlZwlyc2kJCQkvKiBwdF9yZWdzLT5zaSAqLworCXB1c2hxX2NmaV9yZWcJcmR4CQkJLyogcHRfcmVncy0+ZHggKi8KKwlwdXNocV9jZmlfcmVnCXJicAkJCS8qIHB0X3JlZ3MtPmN4ICovCiAJbW92bAklZWJwLCVlY3gKLQltb3ZxCSRfX1VTRVIzMl9DUyxDUy1BUkdPRkZTRVQoJXJzcCkKLQltb3ZxCSRfX1VTRVIzMl9EUyxTUy1BUkdPRkZTRVQoJXJzcCkKLQltb3ZxCSVyMTEsRUZMQUdTLUFSR09GRlNFVCglcnNwKQotCS8qQ0ZJX1JFTF9PRkZTRVQgcmZsYWdzLEVGTEFHUy1BUkdPRkZTRVQqLwotCW1vdnEJJXI4LFJTUC1BUkdPRkZTRVQoJXJzcCkJCi0JQ0ZJX1JFTF9PRkZTRVQgcnNwLFJTUC1BUkdPRkZTRVQKLQkvKiBubyBuZWVkIHRvIGRvIGFuIGFjY2Vzc19vayBjaGVjayBoZXJlIGJlY2F1c2UgcjggaGFzIGJlZW4KLQkgICAzMmJpdCB6ZXJvIGV4dGVuZGVkICovIAotCS8qIGhhcmR3YXJlIHN0YWNrIGZyYW1lIGlzIGNvbXBsZXRlIG5vdyAqLwkKKwlwdXNocV9jZmlfcmVnCXJheAkJCS8qIHB0X3JlZ3MtPmF4ICovCisJc3ViCSQoMTAqOCksJXJzcCAvKiBwdF9yZWdzLT5yOC0xMSxicCxieCxyMTItMTUgbm90IHNhdmVkICovCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDEwKjgKKworCS8qCisJICogbm8gbmVlZCB0byBkbyBhbiBhY2Nlc3Nfb2sgY2hlY2sgaGVyZSBiZWNhdXNlIHI4IGhhcyBiZWVuCisJICogMzJiaXQgemVybyBleHRlbmRlZAorCSAqLwogCUFTTV9TVEFDCiAxOgltb3ZsCSglcjgpLCVyOWQKIAlfQVNNX0VYVEFCTEUoMWIsaWEzMl9iYWRhcmcpCiAJQVNNX0NMQUMKLQlvcmwgICAgICRUU19DT01QQVQsVElfc3RhdHVzK1RIUkVBRF9JTkZPKCVyc3AsUklQLUFSR09GRlNFVCkKLQl0ZXN0bCAgICRfVElGX1dPUktfU1lTQ0FMTF9FTlRSWSxUSV9mbGFncytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCisJb3JsICAgICAkVFNfQ09NUEFULCBBU01fVEhSRUFEX0lORk8oVElfc3RhdHVzLCAlcnNwLCBTSVpFT0ZfUFRSRUdTKQorCXRlc3RsICAgJF9USUZfV09SS19TWVNDQUxMX0VOVFJZLCBBU01fVEhSRUFEX0lORk8oVElfZmxhZ3MsICVyc3AsIFNJWkVPRl9QVFJFR1MpCiAJQ0ZJX1JFTUVNQkVSX1NUQVRFCiAJam56ICAgY3N0YXJfdHJhY2VzeXMKIAljbXBxICRJQTMyX05SX3N5c2NhbGxzLTEsJXJheAogCWphICBpYTMyX2JhZHN5cwogY3N0YXJfZG9fY2FsbDoKLQlJQTMyX0FSR19GSVhVUCAxCisJLyogMzJiaXQgc3lzY2FsbCAtPiA2NGJpdCBDIEFCSSBhcmd1bWVudCBjb252ZXJzaW9uICovCisJbW92bAklZWRpLCVyOGQJLyogYXJnNSAqLworCS8qIHI5IGFscmVhZHkgbG9hZGVkICovCS8qIGFyZzYgKi8KKwl4Y2hnCSVlY3gsJWVzaQkvKiByc2k6YXJnMiwgcmN4OmFyZzQgKi8KKwltb3ZsCSVlYngsJWVkaQkvKiBhcmcxICovCisJbW92bAklZWR4LCVlZHgJLyogYXJnMyAoemVybyBleHRlbnNpb24pICovCiBjc3Rhcl9kaXNwYXRjaDoKIAljYWxsICppYTMyX3N5c19jYWxsX3RhYmxlKCwlcmF4LDgpCi0JbW92cSAlcmF4LFJBWC1BUkdPRkZTRVQoJXJzcCkKKwltb3ZxICVyYXgsUkFYKCVyc3ApCiAJRElTQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKIAlUUkFDRV9JUlFTX09GRgotCXRlc3RsICRfVElGX0FMTFdPUktfTUFTSyxUSV9mbGFncytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCisJdGVzdGwgJF9USUZfQUxMV09SS19NQVNLLCBBU01fVEhSRUFEX0lORk8oVElfZmxhZ3MsICVyc3AsIFNJWkVPRl9QVFJFR1MpCiAJam56IHN5c3JldGxfYXVkaXQKIHN5c3JldGxfZnJvbV9zeXNfY2FsbDoKLQlhbmRsICR+VFNfQ09NUEFULFRJX3N0YXR1cytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCi0JUkVTVE9SRV9BUkdTIDAsLUFSR19TS0lQLDAsMCwwCi0JbW92bCBSSVAtQVJHT0ZGU0VUKCVyc3ApLCVlY3gKKwlhbmRsICR+VFNfQ09NUEFULCBBU01fVEhSRUFEX0lORk8oVElfc3RhdHVzLCAlcnNwLCBTSVpFT0ZfUFRSRUdTKQorCVJFU1RPUkVfUlNJX1JESV9SRFgKKwltb3ZsIFJJUCglcnNwKSwlZWN4CiAJQ0ZJX1JFR0lTVEVSIHJpcCxyY3gKLQltb3ZsIEVGTEFHUy1BUkdPRkZTRVQoJXJzcCksJXIxMWQJCisJbW92bCBFRkxBR1MoJXJzcCksJXIxMWQKIAkvKkNGSV9SRUdJU1RFUiByZmxhZ3MscjExKi8KIAl4b3JxCSVyMTAsJXIxMAogCXhvcnEJJXI5LCVyOQogCXhvcnEJJXI4LCVyOAogCVRSQUNFX0lSUVNfT04KLQltb3ZsIFJTUC1BUkdPRkZTRVQoJXJzcCksJWVzcAorCW1vdmwgUlNQKCVyc3ApLCVlc3AKIAlDRklfUkVTVE9SRSByc3AKKwkvKgorCSAqIDY0Yml0LT4zMmJpdCBTWVNSRVQgcmVzdG9yZXMgZWlwIGZyb20gZWN4LAorCSAqIGVmbGFncyBmcm9tIHIxMSAoYnV0IFJGIGFuZCBWTSBiaXRzIGFyZSBmb3JjZWQgdG8gMCksCisJICogY3MgYW5kIHNzIGFyZSBsb2FkZWQgZnJvbSBNU1JzLgorCSAqIChOb3RlOiAzMmJpdC0+MzJiaXQgU1lTUkVUIGlzIGRpZmZlcmVudDogc2luY2UgcjExCisJICogZG9lcyBub3QgZXhpc3QsIGl0IG1lcmVseSBzZXRzIGVmbGFncy5JRj0xKS4KKwkgKi8KIAlVU0VSR1NfU1lTUkVUMzIKLQkKKwogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKIGNzdGFyX2F1ZGl0c3lzOgogCUNGSV9SRVNUT1JFX1NUQVRFCi0JbW92bCAlcjlkLFI5LUFSR09GRlNFVCglcnNwKQkvKiByZWdpc3RlciB0byBiZSBjbG9iYmVyZWQgYnkgY2FsbCAqLworCW1vdmwgJXI5ZCxSOSglcnNwKQkvKiByZWdpc3RlciB0byBiZSBjbG9iYmVyZWQgYnkgY2FsbCAqLwogCWF1ZGl0c3lzX2VudHJ5X2NvbW1vbgotCW1vdmwgUjktQVJHT0ZGU0VUKCVyc3ApLCVyOWQJLyogcmVsb2FkIDZ0aCBzeXNjYWxsIGFyZyAqLworCW1vdmwgUjkoJXJzcCksJXI5ZAkvKiByZWxvYWQgNnRoIHN5c2NhbGwgYXJnICovCiAJam1wIGNzdGFyX2Rpc3BhdGNoCiAKIHN5c3JldGxfYXVkaXQ6CkBAIC0zNjgsMTcgKzQ0NCwxNyBAQAogCiBjc3Rhcl90cmFjZXN5czoKICNpZmRlZiBDT05GSUdfQVVESVRTWVNDQUxMCi0JdGVzdGwgJChfVElGX1dPUktfU1lTQ0FMTF9FTlRSWSAmIH5fVElGX1NZU0NBTExfQVVESVQpLFRJX2ZsYWdzK1RIUkVBRF9JTkZPKCVyc3AsUklQLUFSR09GRlNFVCkKKwl0ZXN0bCAkKF9USUZfV09SS19TWVNDQUxMX0VOVFJZICYgfl9USUZfU1lTQ0FMTF9BVURJVCksIEFTTV9USFJFQURfSU5GTyhUSV9mbGFncywgJXJzcCwgU0laRU9GX1BUUkVHUykKIAlqeiBjc3Rhcl9hdWRpdHN5cwogI2VuZGlmCiAJeGNoZ2wgJXI5ZCwlZWJwCi0JU0FWRV9SRVNUCi0JQ0xFQVJfUlJFR1MgMCwgcjkKKwlTQVZFX0VYVFJBX1JFR1MKKwlDTEVBUl9SUkVHUyByOQogCW1vdnEgJC1FTk9TWVMsUkFYKCVyc3ApCS8qIHB0cmFjZSBjYW4gY2hhbmdlIHRoaXMgZm9yIGEgYmFkIHN5c2NhbGwgKi8KIAltb3ZxICVyc3AsJXJkaSAgICAgICAgLyogJnB0X3JlZ3MgLT4gYXJnMSAqLwogCWNhbGwgc3lzY2FsbF90cmFjZV9lbnRlcgotCUxPQURfQVJHUzMyIEFSR09GRlNFVCwgMSAgLyogcmVsb2FkIGFyZ3MgZnJvbSBzdGFjayBpbiBjYXNlIHB0cmFjZSBjaGFuZ2VkIGl0ICovCi0JUkVTVE9SRV9SRVNUCisJTE9BRF9BUkdTMzIgMQkvKiByZWxvYWQgYXJncyBmcm9tIHN0YWNrIGluIGNhc2UgcHRyYWNlIGNoYW5nZWQgaXQgKi8KKwlSRVNUT1JFX0VYVFJBX1JFR1MKIAl4Y2hnbCAlZWJwLCVyOWQKIAljbXBxICQoSUEzMl9OUl9zeXNjYWxscy0xKSwlcmF4CiAJamEgaW50X3JldF9mcm9tX3N5c19jYWxsIC8qIGNzdGFyX3RyYWNlc3lzIGhhcyBzZXQgUkFYKCVyc3ApICovCkBAIC0zOTEsNzggKzQ2Nyw5NCBAQAogCWptcCBpYTMyX3N5c3JldAogCUNGSV9FTkRQUk9DCiAKLS8qIAotICogRW11bGF0ZWQgSUEzMiBzeXN0ZW0gY2FsbHMgdmlhIGludCAweDgwLiAKKy8qCisgKiBFbXVsYXRlZCBJQTMyIHN5c3RlbSBjYWxscyB2aWEgaW50IDB4ODAuCiAgKgotICogQXJndW1lbnRzOgkgCi0gKiAlZWF4CVN5c3RlbSBjYWxsIG51bWJlci4KLSAqICVlYnggQXJnMQotICogJWVjeCBBcmcyCi0gKiAlZWR4IEFyZzMKLSAqICVlc2kgQXJnNAotICogJWVkaSBBcmc1Ci0gKiAlZWJwIEFyZzYgICAgW25vdGU6IG5vdCBzYXZlZCBpbiB0aGUgc3RhY2sgZnJhbWUsIHNob3VsZCBub3QgYmUgdG91Y2hlZF0KKyAqIEFyZ3VtZW50czoKKyAqIGVheCAgc3lzdGVtIGNhbGwgbnVtYmVyCisgKiBlYnggIGFyZzEKKyAqIGVjeCAgYXJnMgorICogZWR4ICBhcmczCisgKiBlc2kgIGFyZzQKKyAqIGVkaSAgYXJnNQorICogZWJwICBhcmc2CShub3RlOiBub3Qgc2F2ZWQgaW4gdGhlIHN0YWNrIGZyYW1lLCBzaG91bGQgbm90IGJlIHRvdWNoZWQpCiAgKgogICogTm90ZXM6Ci0gKiBVc2VzIHRoZSBzYW1lIHN0YWNrIGZyYW1lIGFzIHRoZSB4ODYtNjQgdmVyc2lvbi4JCi0gKiBBbGwgcmVnaXN0ZXJzIGV4Y2VwdCAlZWF4IG11c3QgYmUgc2F2ZWQgKGJ1dCBwdHJhY2UgbWF5IHZpb2xhdGUgdGhhdCkKKyAqIFVzZXMgdGhlIHNhbWUgc3RhY2sgZnJhbWUgYXMgdGhlIHg4Ni02NCB2ZXJzaW9uLgorICogQWxsIHJlZ2lzdGVycyBleGNlcHQgZWF4IG11c3QgYmUgc2F2ZWQgKGJ1dCBwdHJhY2UgbWF5IHZpb2xhdGUgdGhhdCkuCiAgKiBBcmd1bWVudHMgYXJlIHplcm8gZXh0ZW5kZWQuIEZvciBzeXN0ZW0gY2FsbHMgdGhhdCB3YW50IHNpZ24gZXh0ZW5zaW9uIGFuZAogICogdGFrZSBsb25nIGFyZ3VtZW50cyBhIHdyYXBwZXIgaXMgbmVlZGVkLiBNb3N0IGNhbGxzIGNhbiBqdXN0IGJlIGNhbGxlZAogICogZGlyZWN0bHkuCi0gKiBBc3N1bWVzIGl0IGlzIG9ubHkgY2FsbGVkIGZyb20gdXNlciBzcGFjZSBhbmQgZW50ZXJlZCB3aXRoIGludGVycnVwdHMgb2ZmLgkKLSAqLyAJCQkJCisgKiBBc3N1bWVzIGl0IGlzIG9ubHkgY2FsbGVkIGZyb20gdXNlciBzcGFjZSBhbmQgZW50ZXJlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCiAKIEVOVFJZKGlhMzJfc3lzY2FsbCkKIAlDRklfU1RBUlRQUk9DMzIJc2ltcGxlCiAJQ0ZJX1NJR05BTF9GUkFNRQotCUNGSV9ERUZfQ0ZBCXJzcCxTUys4LVJJUAotCS8qQ0ZJX1JFTF9PRkZTRVQJc3MsU1MtUklQKi8KLQlDRklfUkVMX09GRlNFVAlyc3AsUlNQLVJJUAotCS8qQ0ZJX1JFTF9PRkZTRVQJcmZsYWdzLEVGTEFHUy1SSVAqLwotCS8qQ0ZJX1JFTF9PRkZTRVQJY3MsQ1MtUklQKi8KLQlDRklfUkVMX09GRlNFVAlyaXAsUklQLVJJUAorCUNGSV9ERUZfQ0ZBCXJzcCw1KjgKKwkvKkNGSV9SRUxfT0ZGU0VUCXNzLDQqOCAqLworCUNGSV9SRUxfT0ZGU0VUCXJzcCwzKjgKKwkvKkNGSV9SRUxfT0ZGU0VUCXJmbGFncywyKjggKi8KKwkvKkNGSV9SRUxfT0ZGU0VUCWNzLDEqOCAqLworCUNGSV9SRUxfT0ZGU0VUCXJpcCwwKjgKKworCS8qCisJICogSW50ZXJydXB0cyBhcmUgb2ZmIG9uIGVudHJ5LgorCSAqIFdlIGRvIG5vdCBmcmFtZSB0aGlzIHRpbnkgaXJxLW9mZiBibG9jayB3aXRoIFRSQUNFX0lSUVNfT0ZGL09OLAorCSAqIGl0IGlzIHRvbyBzbWFsbCB0byBldmVyIGNhdXNlIG5vdGljZWFibGUgaXJxIGxhdGVuY3kuCisJICovCiAJUEFSQVZJUlRfQURKVVNUX0VYQ0VQVElPTl9GUkFNRQogCVNXQVBHUwotCS8qCi0JICogTm8gbmVlZCB0byBmb2xsb3cgdGhpcyBpcnFzIG9uL29mZiBzZWN0aW9uOiB0aGUgc3lzY2FsbAotCSAqIGRpc2FibGVkIGlycXMgYW5kIGhlcmUgd2UgZW5hYmxlIGl0IHN0cmFpZ2h0IGFmdGVyIGVudHJ5OgotCSAqLwogCUVOQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKLQltb3ZsICVlYXgsJWVheAotCXB1c2hxX2NmaSAlcmF4CisKKwkvKiBaZXJvLWV4dGVuZGluZyAzMi1iaXQgcmVncywgZG8gbm90IHJlbW92ZSAqLworCW1vdmwJJWVheCwlZWF4CisKKwkvKiBDb25zdHJ1Y3Qgc3RydWN0IHB0X3JlZ3Mgb24gc3RhY2sgKGlyZXQgZnJhbWUgaXMgYWxyZWFkeSBvbiBzdGFjaykgKi8KKwlwdXNocV9jZmlfcmVnCXJheAkJCS8qIHB0X3JlZ3MtPm9yaWdfYXggKi8KKwlwdXNocV9jZmlfcmVnCXJkaQkJCS8qIHB0X3JlZ3MtPmRpICovCisJcHVzaHFfY2ZpX3JlZwlyc2kJCQkvKiBwdF9yZWdzLT5zaSAqLworCXB1c2hxX2NmaV9yZWcJcmR4CQkJLyogcHRfcmVncy0+ZHggKi8KKwlwdXNocV9jZmlfcmVnCXJjeAkJCS8qIHB0X3JlZ3MtPmN4ICovCisJcHVzaHFfY2ZpX3JlZwlyYXgJCQkvKiBwdF9yZWdzLT5heCAqLwogCWNsZAotCS8qIG5vdGUgdGhlIHJlZ2lzdGVycyBhcmUgbm90IHplcm8gZXh0ZW5kZWQgdG8gdGhlIHNmLgotCSAgIHRoaXMgY291bGQgYmUgYSBwcm9ibGVtLiAqLwotCVNBVkVfQVJHUyAwLDEsMAotCW9ybCAkVFNfQ09NUEFULFRJX3N0YXR1cytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCi0JdGVzdGwgJF9USUZfV09SS19TWVNDQUxMX0VOVFJZLFRJX2ZsYWdzK1RIUkVBRF9JTkZPKCVyc3AsUklQLUFSR09GRlNFVCkKKwlzdWIJJCgxMCo4KSwlcnNwIC8qIHB0X3JlZ3MtPnI4LTExLGJwLGJ4LHIxMi0xNSBub3Qgc2F2ZWQgKi8KKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgMTAqOAorCisJb3JsICRUU19DT01QQVQsIEFTTV9USFJFQURfSU5GTyhUSV9zdGF0dXMsICVyc3AsIFNJWkVPRl9QVFJFR1MpCisJdGVzdGwgJF9USUZfV09SS19TWVNDQUxMX0VOVFJZLCBBU01fVEhSRUFEX0lORk8oVElfZmxhZ3MsICVyc3AsIFNJWkVPRl9QVFJFR1MpCiAJam56IGlhMzJfdHJhY2VzeXMKIAljbXBxICQoSUEzMl9OUl9zeXNjYWxscy0xKSwlcmF4CiAJamEgaWEzMl9iYWRzeXMKIGlhMzJfZG9fY2FsbDoKLQlJQTMyX0FSR19GSVhVUAorCS8qIDMyYml0IHN5c2NhbGwgLT4gNjRiaXQgQyBBQkkgYXJndW1lbnQgY29udmVyc2lvbiAqLworCW1vdmwgJWVkaSwlcjhkCS8qIGFyZzUgKi8KKwltb3ZsICVlYnAsJXI5ZAkvKiBhcmc2ICovCisJeGNoZyAlZWN4LCVlc2kJLyogcnNpOmFyZzIsIHJjeDphcmc0ICovCisJbW92bCAlZWJ4LCVlZGkJLyogYXJnMSAqLworCW1vdmwgJWVkeCwlZWR4CS8qIGFyZzMgKHplcm8gZXh0ZW5zaW9uKSAqLwogCWNhbGwgKmlhMzJfc3lzX2NhbGxfdGFibGUoLCVyYXgsOCkgIyB4eHg6IHJpcCByZWxhdGl2ZQogaWEzMl9zeXNyZXQ6Ci0JbW92cSAlcmF4LFJBWC1BUkdPRkZTRVQoJXJzcCkKKwltb3ZxICVyYXgsUkFYKCVyc3ApCiBpYTMyX3JldF9mcm9tX3N5c19jYWxsOgotCUNMRUFSX1JSRUdTIC1BUkdPRkZTRVQKLQlqbXAgaW50X3JldF9mcm9tX3N5c19jYWxsIAorCUNMRUFSX1JSRUdTCisJam1wIGludF9yZXRfZnJvbV9zeXNfY2FsbAogCi1pYTMyX3RyYWNlc3lzOgkJCSAKLQlTQVZFX1JFU1QKK2lhMzJfdHJhY2VzeXM6CisJU0FWRV9FWFRSQV9SRUdTCiAJQ0xFQVJfUlJFR1MKIAltb3ZxICQtRU5PU1lTLFJBWCglcnNwKQkvKiBwdHJhY2UgY2FuIGNoYW5nZSB0aGlzIGZvciBhIGJhZCBzeXNjYWxsICovCiAJbW92cSAlcnNwLCVyZGkgICAgICAgIC8qICZwdF9yZWdzIC0+IGFyZzEgKi8KIAljYWxsIHN5c2NhbGxfdHJhY2VfZW50ZXIKLQlMT0FEX0FSR1MzMiBBUkdPRkZTRVQgIC8qIHJlbG9hZCBhcmdzIGZyb20gc3RhY2sgaW4gY2FzZSBwdHJhY2UgY2hhbmdlZCBpdCAqLwotCVJFU1RPUkVfUkVTVAorCUxPQURfQVJHUzMyCS8qIHJlbG9hZCBhcmdzIGZyb20gc3RhY2sgaW4gY2FzZSBwdHJhY2UgY2hhbmdlZCBpdCAqLworCVJFU1RPUkVfRVhUUkFfUkVHUwogCWNtcHEgJChJQTMyX05SX3N5c2NhbGxzLTEpLCVyYXgKIAlqYSAgaW50X3JldF9mcm9tX3N5c19jYWxsCS8qIGlhMzJfdHJhY2VzeXMgaGFzIHNldCBSQVgoJXJzcCkgKi8KIAlqbXAgaWEzMl9kb19jYWxsCiBFTkQoaWEzMl9zeXNjYWxsKQogCiBpYTMyX2JhZHN5czoKLQltb3ZxICQwLE9SSUdfUkFYLUFSR09GRlNFVCglcnNwKQorCW1vdnEgJDAsT1JJR19SQVgoJXJzcCkKIAltb3ZxICQtRU5PU1lTLCVyYXgKIAlqbXAgaWEzMl9zeXNyZXQKIApAQCAtNDc5LDggKzU3MSw2IEBACiAKIAlQVFJFR1NDQUxMIHN0dWIzMl9ydF9zaWdyZXR1cm4sIHN5czMyX3J0X3NpZ3JldHVybgogCVBUUkVHU0NBTEwgc3R1YjMyX3NpZ3JldHVybiwgc3lzMzJfc2lncmV0dXJuCi0JUFRSRUdTQ0FMTCBzdHViMzJfZXhlY3ZlLCBjb21wYXRfc3lzX2V4ZWN2ZQotCVBUUkVHU0NBTEwgc3R1YjMyX2V4ZWN2ZWF0LCBjb21wYXRfc3lzX2V4ZWN2ZWF0CiAJUFRSRUdTQ0FMTCBzdHViMzJfZm9yaywgc3lzX2ZvcmsKIAlQVFJFR1NDQUxMIHN0dWIzMl92Zm9yaywgc3lzX3Zmb3JrCiAKQEAgLTQ5MiwyNCArNTgyLDIzIEBACiAKIAlBTElHTgogaWEzMl9wdHJlZ3NfY29tbW9uOgotCXBvcHEgJXIxMQogCUNGSV9FTkRQUk9DCiAJQ0ZJX1NUQVJUUFJPQzMyCXNpbXBsZQogCUNGSV9TSUdOQUxfRlJBTUUKLQlDRklfREVGX0NGQQlyc3AsU1MrOC1BUkdPRkZTRVQKLQlDRklfUkVMX09GRlNFVAlyYXgsUkFYLUFSR09GRlNFVAotCUNGSV9SRUxfT0ZGU0VUCXJjeCxSQ1gtQVJHT0ZGU0VUCi0JQ0ZJX1JFTF9PRkZTRVQJcmR4LFJEWC1BUkdPRkZTRVQKLQlDRklfUkVMX09GRlNFVAlyc2ksUlNJLUFSR09GRlNFVAotCUNGSV9SRUxfT0ZGU0VUCXJkaSxSREktQVJHT0ZGU0VUCi0JQ0ZJX1JFTF9PRkZTRVQJcmlwLFJJUC1BUkdPRkZTRVQKLS8qCUNGSV9SRUxfT0ZGU0VUCWNzLENTLUFSR09GRlNFVCovCi0vKglDRklfUkVMX09GRlNFVAlyZmxhZ3MsRUZMQUdTLUFSR09GRlNFVCovCi0JQ0ZJX1JFTF9PRkZTRVQJcnNwLFJTUC1BUkdPRkZTRVQKLS8qCUNGSV9SRUxfT0ZGU0VUCXNzLFNTLUFSR09GRlNFVCovCi0JU0FWRV9SRVNUCisJQ0ZJX0RFRl9DRkEJcnNwLFNJWkVPRl9QVFJFR1MKKwlDRklfUkVMX09GRlNFVAlyYXgsUkFYCisJQ0ZJX1JFTF9PRkZTRVQJcmN4LFJDWAorCUNGSV9SRUxfT0ZGU0VUCXJkeCxSRFgKKwlDRklfUkVMX09GRlNFVAlyc2ksUlNJCisJQ0ZJX1JFTF9PRkZTRVQJcmRpLFJESQorCUNGSV9SRUxfT0ZGU0VUCXJpcCxSSVAKKy8qCUNGSV9SRUxfT0ZGU0VUCWNzLENTKi8KKy8qCUNGSV9SRUxfT0ZGU0VUCXJmbGFncyxFRkxBR1MqLworCUNGSV9SRUxfT0ZGU0VUCXJzcCxSU1AKKy8qCUNGSV9SRUxfT0ZGU0VUCXNzLFNTKi8KKwlTQVZFX0VYVFJBX1JFR1MgOAogCWNhbGwgKiVyYXgKLQlSRVNUT1JFX1JFU1QKLQlqbXAgIGlhMzJfc3lzcmV0CS8qIG1pc2JhbGFuY2VzIHRoZSByZXR1cm4gY2FjaGUgKi8KKwlSRVNUT1JFX0VYVFJBX1JFR1MgOAorCXJldAogCUNGSV9FTkRQUk9DCiBFTkQoaWEzMl9wdHJlZ3NfY29tbW9uKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaWEzMi9ub3N5c2NhbGwuYyBiL2FyY2gveDg2L2lhMzIvbm9zeXNjYWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZWNkNWIuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaWEzMi9ub3N5c2NhbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0KLWxvbmcgY29tcGF0X25pX3N5c2NhbGwodm9pZCkKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2lhMzIvc3lzX2lhMzIuYyBiL2FyY2gveDg2L2lhMzIvc3lzX2lhMzIuYwppbmRleCA4ZTBjZWVjLi43MTljZDcwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pYTMyL3N5c19pYTMyLmMKKysrIGIvYXJjaC94ODYvaWEzMi9zeXNfaWEzMi5jCkBAIC0yMDEsMjAgKzIwMSw2IEBACiAJCQkJYWR2aWNlKTsKIH0KIAotbG9uZyBzeXMzMl92bTg2X3dhcm5pbmcodm9pZCkKLXsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm1lID0gY3VycmVudDsKLQlzdGF0aWMgY2hhciBsYXN0Y29tbVtzaXplb2YobWUtPmNvbW0pXTsKLQotCWlmIChzdHJuY21wKGxhc3Rjb21tLCBtZS0+Y29tbSwgc2l6ZW9mKGxhc3Rjb21tKSkpIHsKLQkJY29tcGF0X3ByaW50ayhLRVJOX0lORk8KLQkJCSAgICAgICIlczogdm04NiBtb2RlIG5vdCBzdXBwb3J0ZWQgb24gNjQgYml0IGtlcm5lbFxuIiwKLQkJCSAgICAgIG1lLT5jb21tKTsKLQkJc3RybmNweShsYXN0Y29tbSwgbWUtPmNvbW0sIHNpemVvZihsYXN0Y29tbSkpOwotCX0KLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQogYXNtbGlua2FnZSBzc2l6ZV90IHN5czMyX3JlYWRhaGVhZChpbnQgZmQsIHVuc2lnbmVkIG9mZl9sbywgdW5zaWduZWQgb2ZmX2hpLAogCQkJCSAgIHNpemVfdCBjb3VudCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2lhMzIvc3lzY2FsbF9pYTMyLmMgYi9hcmNoL3g4Ni9pYTMyL3N5c2NhbGxfaWEzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzU0YmEwLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2lhMzIvc3lzY2FsbF9pYTMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKiBTeXN0ZW0gY2FsbCB0YWJsZSBmb3IgaWEzMiBlbXVsYXRpb24uICovCi0KLSNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KLSNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLQotI2RlZmluZSBfX1NZU0NBTExfSTM4Nihuciwgc3ltLCBjb21wYXQpIGV4dGVybiBhc21saW5rYWdlIHZvaWQgY29tcGF0KHZvaWQpIDsKLSNpbmNsdWRlIDxhc20vc3lzY2FsbHNfMzIuaD4KLSN1bmRlZiBfX1NZU0NBTExfSTM4NgotCi0jZGVmaW5lIF9fU1lTQ0FMTF9JMzg2KG5yLCBzeW0sIGNvbXBhdCkgW25yXSA9IGNvbXBhdCwKLQotdHlwZWRlZiB2b2lkICgqc3lzX2NhbGxfcHRyX3QpKHZvaWQpOwotCi1leHRlcm4gdm9pZCBjb21wYXRfbmlfc3lzY2FsbCh2b2lkKTsKLQotY29uc3Qgc3lzX2NhbGxfcHRyX3QgaWEzMl9zeXNfY2FsbF90YWJsZVtfX05SX2lhMzJfc3lzY2FsbF9tYXgrMV0gPSB7Ci0JLyoKLQkgKiBTbWVsbHMgbGlrZSBhIGNvbXBpbGVyIGJ1ZyAtLSBpdCBkb2Vzbid0IHdvcmsKLQkgKiB3aGVuIHRoZSAmIGJlbG93IGlzIHJlbW92ZWQuCi0JICovCi0JWzAgLi4uIF9fTlJfaWEzMl9zeXNjYWxsX21heF0gPSAmY29tcGF0X25pX3N5c2NhbGwsCi0jaW5jbHVkZSA8YXNtL3N5c2NhbGxzXzMyLmg+Ci19OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUtYXNtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaAppbmRleCAzNzIyMzFjLi5iZGYwMmVlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaApAQCAtMTgsMTIgKzE4LDYzIEBACiAJLmVuZG0KICNlbmRpZgogCi0ubWFjcm8gYWx0aW5zdHJ1Y3Rpb25fZW50cnkgb3JpZyBhbHQgZmVhdHVyZSBvcmlnX2xlbiBhbHRfbGVuCisubWFjcm8gYWx0aW5zdHJ1Y3Rpb25fZW50cnkgb3JpZyBhbHQgZmVhdHVyZSBvcmlnX2xlbiBhbHRfbGVuIHBhZF9sZW4KIAkubG9uZyBcb3JpZyAtIC4KIAkubG9uZyBcYWx0IC0gLgogCS53b3JkIFxmZWF0dXJlCiAJLmJ5dGUgXG9yaWdfbGVuCiAJLmJ5dGUgXGFsdF9sZW4KKwkuYnl0ZSBccGFkX2xlbgorLmVuZG0KKworLm1hY3JvIEFMVEVSTkFUSVZFIG9sZGluc3RyLCBuZXdpbnN0ciwgZmVhdHVyZQorMTQwOgorCVxvbGRpbnN0cgorMTQxOgorCS5za2lwIC0oKCgxNDRmLTE0M2YpLSgxNDFiLTE0MGIpKSA+IDApICogKCgxNDRmLTE0M2YpLSgxNDFiLTE0MGIpKSwweDkwCisxNDI6CisKKwkucHVzaHNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywiYSIKKwlhbHRpbnN0cnVjdGlvbl9lbnRyeSAxNDBiLDE0M2YsXGZlYXR1cmUsMTQyYi0xNDBiLDE0NGYtMTQzZiwxNDJiLTE0MWIKKwkucG9wc2VjdGlvbgorCisJLnB1c2hzZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwiYXgiCisxNDM6CisJXG5ld2luc3RyCisxNDQ6CisJLnBvcHNlY3Rpb24KKy5lbmRtCisKKyNkZWZpbmUgb2xkX2xlbgkJCTE0MWItMTQwYgorI2RlZmluZSBuZXdfbGVuMQkJMTQ0Zi0xNDNmCisjZGVmaW5lIG5ld19sZW4yCQkxNDVmLTE0NGYKKworLyoKKyAqIG1heCB3aXRob3V0IGNvbmRpdGlvbmFscy4gSWRlYSBhZGFwdGVkIGZyb206CisgKiBodHRwOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L35zZWFuZGVyL2JpdGhhY2tzLmh0bWwjSW50ZWdlck1pbk9yTWF4CisgKi8KKyNkZWZpbmUgYWx0X21heF9zaG9ydChhLCBiKQkoKGEpIF4gKCgoYSkgXiAoYikpICYgLSgtKChhKSA8IChiKSkpKSkKKworLm1hY3JvIEFMVEVSTkFUSVZFXzIgb2xkaW5zdHIsIG5ld2luc3RyMSwgZmVhdHVyZTEsIG5ld2luc3RyMiwgZmVhdHVyZTIKKzE0MDoKKwlcb2xkaW5zdHIKKzE0MToKKwkuc2tpcCAtKChhbHRfbWF4X3Nob3J0KG5ld19sZW4xLCBuZXdfbGVuMikgLSAob2xkX2xlbikpID4gMCkgKiBcCisJCShhbHRfbWF4X3Nob3J0KG5ld19sZW4xLCBuZXdfbGVuMikgLSAob2xkX2xlbikpLDB4OTAKKzE0MjoKKworCS5wdXNoc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCJhIgorCWFsdGluc3RydWN0aW9uX2VudHJ5IDE0MGIsMTQzZixcZmVhdHVyZTEsMTQyYi0xNDBiLDE0NGYtMTQzZiwxNDJiLTE0MWIKKwlhbHRpbnN0cnVjdGlvbl9lbnRyeSAxNDBiLDE0NGYsXGZlYXR1cmUyLDE0MmItMTQwYiwxNDVmLTE0NGYsMTQyYi0xNDFiCisJLnBvcHNlY3Rpb24KKworCS5wdXNoc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsImF4IgorMTQzOgorCVxuZXdpbnN0cjEKKzE0NDoKKwlcbmV3aW5zdHIyCisxNDU6CisJLnBvcHNlY3Rpb24KIC5lbmRtCiAKICNlbmRpZiAgLyogIF9fQVNTRU1CTFlfXyAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oCmluZGV4IDQ3M2JkYmUuLmJhMzJhZjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaApAQCAtNDgsOCArNDgsOSBAQAogCXMzMiByZXBsX29mZnNldDsJLyogb2Zmc2V0IHRvIHJlcGxhY2VtZW50IGluc3RydWN0aW9uICovCiAJdTE2IGNwdWlkOwkJLyogY3B1aWQgYml0IHNldCBmb3IgcmVwbGFjZW1lbnQgKi8KIAl1OCAgaW5zdHJsZW47CQkvKiBsZW5ndGggb2Ygb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gKi8KLQl1OCAgcmVwbGFjZW1lbnRsZW47CS8qIGxlbmd0aCBvZiBuZXcgaW5zdHJ1Y3Rpb24sIDw9IGluc3RybGVuICovCi19OworCXU4ICByZXBsYWNlbWVudGxlbjsJLyogbGVuZ3RoIG9mIG5ldyBpbnN0cnVjdGlvbiAqLworCXU4ICBwYWRsZW47CQkvKiBsZW5ndGggb2YgYnVpbGQtdGltZSBwYWRkaW5nICovCit9IF9fcGFja2VkOwogCiBleHRlcm4gdm9pZCBhbHRlcm5hdGl2ZV9pbnN0cnVjdGlvbnModm9pZCk7CiBleHRlcm4gdm9pZCBhcHBseV9hbHRlcm5hdGl2ZXMoc3RydWN0IGFsdF9pbnN0ciAqc3RhcnQsIHN0cnVjdCBhbHRfaW5zdHIgKmVuZCk7CkBAIC03Niw1MCArNzcsNjkgQEAKIH0KICNlbmRpZgkvKiBDT05GSUdfU01QICovCiAKLSNkZWZpbmUgT0xESU5TVFIob2xkaW5zdHIpCSI2NjE6XG5cdCIgb2xkaW5zdHIgIlxuNjYyOlxuIgorI2RlZmluZSBiX3JlcGxhY2VtZW50KG51bSkJIjY2NCIjbnVtCisjZGVmaW5lIGVfcmVwbGFjZW1lbnQobnVtKQkiNjY1IiNudW0KIAotI2RlZmluZSBiX3JlcGxhY2VtZW50KG51bWJlcikJIjY2MyIjbnVtYmVyCi0jZGVmaW5lIGVfcmVwbGFjZW1lbnQobnVtYmVyKQkiNjY0IiNudW1iZXIKKyNkZWZpbmUgYWx0X2VuZF9tYXJrZXIJCSI2NjMiCisjZGVmaW5lIGFsdF9zbGVuCQkiNjYyYi02NjFiIgorI2RlZmluZSBhbHRfcGFkX2xlbgkJYWx0X2VuZF9tYXJrZXIiYi02NjJiIgorI2RlZmluZSBhbHRfdG90YWxfc2xlbgkJYWx0X2VuZF9tYXJrZXIiYi02NjFiIgorI2RlZmluZSBhbHRfcmxlbihudW0pCQllX3JlcGxhY2VtZW50KG51bSkiZi0iYl9yZXBsYWNlbWVudChudW0pImYiCiAKLSNkZWZpbmUgYWx0X3NsZW4gIjY2MmItNjYxYiIKLSNkZWZpbmUgYWx0X3JsZW4obnVtYmVyKSBlX3JlcGxhY2VtZW50KG51bWJlcikiZi0iYl9yZXBsYWNlbWVudChudW1iZXIpImYiCisjZGVmaW5lIF9fT0xESU5TVFIob2xkaW5zdHIsIG51bSkJCQkJCVwKKwkiNjYxOlxuXHQiIG9sZGluc3RyICJcbjY2MjpcbiIJCQkJCVwKKwkiLnNraXAgLSgoKCIgYWx0X3JsZW4obnVtKSAiKS0oIiBhbHRfc2xlbiAiKSkgPiAwKSAqICIJCVwKKwkJIigoIiBhbHRfcmxlbihudW0pICIpLSgiIGFsdF9zbGVuICIpKSwweDkwXG4iCiAKLSNkZWZpbmUgQUxUSU5TVFJfRU5UUlkoZmVhdHVyZSwgbnVtYmVyKQkJCQkJICAgICAgXAorI2RlZmluZSBPTERJTlNUUihvbGRpbnN0ciwgbnVtKQkJCQkJCVwKKwlfX09MRElOU1RSKG9sZGluc3RyLCBudW0pCQkJCQlcCisJYWx0X2VuZF9tYXJrZXIgIjpcbiIKKworLyoKKyAqIG1heCB3aXRob3V0IGNvbmRpdGlvbmFscy4gSWRlYSBhZGFwdGVkIGZyb206CisgKiBodHRwOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L35zZWFuZGVyL2JpdGhhY2tzLmh0bWwjSW50ZWdlck1pbk9yTWF4CisgKgorICogVGhlIGFkZGl0aW9uYWwgIi0iIGlzIG5lZWRlZCBiZWNhdXNlIGdhcyB3b3JrcyB3aXRoIHMzMnMuCisgKi8KKyNkZWZpbmUgYWx0X21heF9zaG9ydChhLCBiKQkiKCgiIGEgIikgXiAoKCgiIGEgIikgXiAoIiBiICIpKSAmIC0oLSgoIiBhICIpIC0gKCIgYiAiKSkpKSkiCisKKy8qCisgKiBQYWQgdGhlIHNlY29uZCByZXBsYWNlbWVudCBhbHRlcm5hdGl2ZSB3aXRoIGFkZGl0aW9uYWwgTk9QcyBpZiBpdCBpcworICogYWRkaXRpb25hbGx5IGxvbmdlciB0aGFuIHRoZSBmaXJzdCByZXBsYWNlbWVudCBhbHRlcm5hdGl2ZS4KKyAqLworI2RlZmluZSBPTERJTlNUUl8yKG9sZGluc3RyLCBudW0xLCBudW0yKSBcCisJIjY2MTpcblx0IiBvbGRpbnN0ciAiXG42NjI6XG4iCQkJCQkJCQlcCisJIi5za2lwIC0oKCIgYWx0X21heF9zaG9ydChhbHRfcmxlbihudW0xKSwgYWx0X3JsZW4obnVtMikpICIgLSAoIiBhbHRfc2xlbiAiKSkgPiAwKSAqICIJXAorCQkiKCIgYWx0X21heF9zaG9ydChhbHRfcmxlbihudW0xKSwgYWx0X3JsZW4obnVtMikpICIgLSAoIiBhbHRfc2xlbiAiKSksIDB4OTBcbiIJXAorCWFsdF9lbmRfbWFya2VyICI6XG4iCisKKyNkZWZpbmUgQUxUSU5TVFJfRU5UUlkoZmVhdHVyZSwgbnVtKQkJCQkJICAgICAgXAogCSIgLmxvbmcgNjYxYiAtIC5cbiIJCQkJLyogbGFiZWwgICAgICAgICAgICovIFwKLQkiIC5sb25nICIgYl9yZXBsYWNlbWVudChudW1iZXIpImYgLSAuXG4iCS8qIG5ldyBpbnN0cnVjdGlvbiAqLyBcCisJIiAubG9uZyAiIGJfcmVwbGFjZW1lbnQobnVtKSJmIC0gLlxuIgkJLyogbmV3IGluc3RydWN0aW9uICovIFwKIAkiIC53b3JkICIgX19zdHJpbmdpZnkoZmVhdHVyZSkgIlxuIgkJLyogZmVhdHVyZSBiaXQgICAgICovIFwKLQkiIC5ieXRlICIgYWx0X3NsZW4gIlxuIgkJCQkvKiBzb3VyY2UgbGVuICAgICAgKi8gXAotCSIgLmJ5dGUgIiBhbHRfcmxlbihudW1iZXIpICJcbiIJCQkvKiByZXBsYWNlbWVudCBsZW4gKi8KKwkiIC5ieXRlICIgYWx0X3RvdGFsX3NsZW4gIlxuIgkJCS8qIHNvdXJjZSBsZW4gICAgICAqLyBcCisJIiAuYnl0ZSAiIGFsdF9ybGVuKG51bSkgIlxuIgkJCS8qIHJlcGxhY2VtZW50IGxlbiAqLyBcCisJIiAuYnl0ZSAiIGFsdF9wYWRfbGVuICJcbiIJCQkvKiBwYWQgbGVuICovCiAKLSNkZWZpbmUgRElTQ0FSRF9FTlRSWShudW1iZXIpCQkJCS8qIHJsZW4gPD0gc2xlbiAqLyAgICBcCi0JIiAuYnl0ZSAweGZmICsgKCIgYWx0X3JsZW4obnVtYmVyKSAiKSAtICgiIGFsdF9zbGVuICIpXG4iCi0KLSNkZWZpbmUgQUxUSU5TVFJfUkVQTEFDRU1FTlQobmV3aW5zdHIsIGZlYXR1cmUsIG51bWJlcikJLyogcmVwbGFjZW1lbnQgKi8gICAgIFwKLQliX3JlcGxhY2VtZW50KG51bWJlcikiOlxuXHQiIG5ld2luc3RyICJcbiIgZV9yZXBsYWNlbWVudChudW1iZXIpICI6XG5cdCIKKyNkZWZpbmUgQUxUSU5TVFJfUkVQTEFDRU1FTlQobmV3aW5zdHIsIGZlYXR1cmUsIG51bSkJLyogcmVwbGFjZW1lbnQgKi8gICAgIFwKKwliX3JlcGxhY2VtZW50KG51bSkiOlxuXHQiIG5ld2luc3RyICJcbiIgZV9yZXBsYWNlbWVudChudW0pICI6XG5cdCIKIAogLyogYWx0ZXJuYXRpdmUgYXNzZW1ibHkgcHJpbWl0aXZlOiAqLwogI2RlZmluZSBBTFRFUk5BVElWRShvbGRpbnN0ciwgbmV3aW5zdHIsIGZlYXR1cmUpCQkJXAotCU9MRElOU1RSKG9sZGluc3RyKQkJCQkJCVwKKwlPTERJTlNUUihvbGRpbnN0ciwgMSkJCQkJCQlcCiAJIi5wdXNoc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLFwiYVwiXG4iCQkJCVwKIAlBTFRJTlNUUl9FTlRSWShmZWF0dXJlLCAxKQkJCQkJXAogCSIucG9wc2VjdGlvblxuIgkJCQkJCQlcCi0JIi5wdXNoc2VjdGlvbiAuZGlzY2FyZCxcImF3XCIsQHByb2diaXRzXG4iCQkJXAotCURJU0NBUkRfRU5UUlkoMSkJCQkJCQlcCi0JIi5wb3BzZWN0aW9uXG4iCQkJCQkJCVwKIAkiLnB1c2hzZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwgXCJheFwiXG4iCQkJXAogCUFMVElOU1RSX1JFUExBQ0VNRU5UKG5ld2luc3RyLCBmZWF0dXJlLCAxKQkJCVwKIAkiLnBvcHNlY3Rpb24iCiAKICNkZWZpbmUgQUxURVJOQVRJVkVfMihvbGRpbnN0ciwgbmV3aW5zdHIxLCBmZWF0dXJlMSwgbmV3aW5zdHIyLCBmZWF0dXJlMilcCi0JT0xESU5TVFIob2xkaW5zdHIpCQkJCQkJXAorCU9MRElOU1RSXzIob2xkaW5zdHIsIDEsIDIpCQkJCQlcCiAJIi5wdXNoc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLFwiYVwiXG4iCQkJCVwKIAlBTFRJTlNUUl9FTlRSWShmZWF0dXJlMSwgMSkJCQkJCVwKIAlBTFRJTlNUUl9FTlRSWShmZWF0dXJlMiwgMikJCQkJCVwKIAkiLnBvcHNlY3Rpb25cbiIJCQkJCQkJXAotCSIucHVzaHNlY3Rpb24gLmRpc2NhcmQsXCJhd1wiLEBwcm9nYml0c1xuIgkJCVwKLQlESVNDQVJEX0VOVFJZKDEpCQkJCQkJXAotCURJU0NBUkRfRU5UUlkoMikJCQkJCQlcCi0JIi5wb3BzZWN0aW9uXG4iCQkJCQkJCVwKIAkiLnB1c2hzZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwgXCJheFwiXG4iCQkJXAogCUFMVElOU1RSX1JFUExBQ0VNRU5UKG5ld2luc3RyMSwgZmVhdHVyZTEsIDEpCQkJXAogCUFMVElOU1RSX1JFUExBQ0VNRU5UKG5ld2luc3RyMiwgZmVhdHVyZTIsIDIpCQkJXApAQCAtMTQ2LDYgKzE2Niw5IEBACiAjZGVmaW5lIGFsdGVybmF0aXZlKG9sZGluc3RyLCBuZXdpbnN0ciwgZmVhdHVyZSkJCQlcCiAJYXNtIHZvbGF0aWxlIChBTFRFUk5BVElWRShvbGRpbnN0ciwgbmV3aW5zdHIsIGZlYXR1cmUpIDogOiA6ICJtZW1vcnkiKQogCisjZGVmaW5lIGFsdGVybmF0aXZlXzIob2xkaW5zdHIsIG5ld2luc3RyMSwgZmVhdHVyZTEsIG5ld2luc3RyMiwgZmVhdHVyZTIpIFwKKwlhc20gdm9sYXRpbGUoQUxURVJOQVRJVkVfMihvbGRpbnN0ciwgbmV3aW5zdHIxLCBmZWF0dXJlMSwgbmV3aW5zdHIyLCBmZWF0dXJlMikgOjo6ICJtZW1vcnkiKQorCiAvKgogICogQWx0ZXJuYXRpdmUgaW5saW5lIGFzc2VtYmx5IHdpdGggaW5wdXQuCiAgKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oCmluZGV4IGVmYzNiMjIuLjk3NmI4NmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmgKQEAgLTkxLDcgKzkxLDcgQEAKIHsKIAl2b2xhdGlsZSB1MzIgKmFkZHIgPSAodm9sYXRpbGUgdTMyICopKEFQSUNfQkFTRSArIHJlZyk7CiAKLQlhbHRlcm5hdGl2ZV9pbygibW92bCAlMCwgJTEiLCAieGNoZ2wgJTAsICUxIiwgWDg2X0JVR18xMUFQLAorCWFsdGVybmF0aXZlX2lvKCJtb3ZsICUwLCAlUDEiLCAieGNoZ2wgJTAsICVQMSIsIFg4Nl9CVUdfMTFBUCwKIAkJICAgICAgIEFTTV9PVVRQVVQyKCI9ciIgKHYpLCAiPW0iICgqYWRkcikpLAogCQkgICAgICAgQVNNX09VVFBVVDIoIjAiICh2KSwgIm0iICgqYWRkcikpKTsKIH0KQEAgLTIwNCw3ICsyMDQsNiBAQAogZXh0ZXJuIHZvaWQgZGlzY29ubmVjdF9ic3BfQVBJQyhpbnQgdmlydF93aXJlX3NldHVwKTsKIGV4dGVybiB2b2lkIGRpc2FibGVfbG9jYWxfQVBJQyh2b2lkKTsKIGV4dGVybiB2b2lkIGxhcGljX3NodXRkb3duKHZvaWQpOwotZXh0ZXJuIGludCB2ZXJpZnlfbG9jYWxfQVBJQyh2b2lkKTsKIGV4dGVybiB2b2lkIHN5bmNfQXJiX0lEcyh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRfYnNwX0FQSUModm9pZCk7CiBleHRlcm4gdm9pZCBzZXR1cF9sb2NhbF9BUElDKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYmFycmllci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYmFycmllci5oCmluZGV4IDJhYjFlYjMuLjk1OWU0NWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2JhcnJpZXIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9iYXJyaWVyLmgKQEAgLTk1LDEzICs5NSwxMSBAQAogICogU3RvcCBSRFRTQyBzcGVjdWxhdGlvbi4gVGhpcyBpcyBuZWVkZWQgd2hlbiB5b3UgbmVlZCB0byB1c2UgUkRUU0MKICAqIChvciBnZXRfY3ljbGVzIG9yIHZyZWFkIHRoYXQgcG9zc2libHkgYWNjZXNzZXMgdGhlIFRTQykgaW4gYSBkZWZpbmVkCiAgKiBjb2RlIHJlZ2lvbi4KLSAqCi0gKiAoQ291bGQgdXNlIGFuIGFsdGVybmF0aXZlIHRocmVlIHdheSBmb3IgdGhpcyBpZiB0aGVyZSB3YXMgb25lLikKICAqLwogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHJkdHNjX2JhcnJpZXIodm9pZCkKIHsKLQlhbHRlcm5hdGl2ZShBU01fTk9QMywgIm1mZW5jZSIsIFg4Nl9GRUFUVVJFX01GRU5DRV9SRFRTQyk7Ci0JYWx0ZXJuYXRpdmUoQVNNX05PUDMsICJsZmVuY2UiLCBYODZfRkVBVFVSRV9MRkVOQ0VfUkRUU0MpOworCWFsdGVybmF0aXZlXzIoIiIsICJtZmVuY2UiLCBYODZfRkVBVFVSRV9NRkVOQ0VfUkRUU0MsCisJCQkgICJsZmVuY2UiLCBYODZfRkVBVFVSRV9MRkVOQ0VfUkRUU0MpOwogfQogCiAjZW5kaWYgLyogX0FTTV9YODZfQkFSUklFUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jYWxsaW5nLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jYWxsaW5nLmgKaW5kZXggMWYxMjk3Yi4uMWM4YjUwZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY2FsbGluZy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NhbGxpbmcuaApAQCAtNTUsMTQzICs1NSwxNTcgQEAKICAqIGZvciBhc3NlbWJseSBjb2RlOgogICovCiAKLSNkZWZpbmUgUjE1CQkgIDAKLSNkZWZpbmUgUjE0CQkgIDgKLSNkZWZpbmUgUjEzCQkgMTYKLSNkZWZpbmUgUjEyCQkgMjQKLSNkZWZpbmUgUkJQCQkgMzIKLSNkZWZpbmUgUkJYCQkgNDAKKy8qIFRoZSBsYXlvdXQgZm9ybXMgdGhlICJzdHJ1Y3QgcHRfcmVncyIgb24gdGhlIHN0YWNrOiAqLworLyoKKyAqIEMgQUJJIHNheXMgdGhlc2UgcmVncyBhcmUgY2FsbGVlLXByZXNlcnZlZC4gVGhleSBhcmVuJ3Qgc2F2ZWQgb24ga2VybmVsIGVudHJ5CisgKiB1bmxlc3Mgc3lzY2FsbCBuZWVkcyBhIGNvbXBsZXRlLCBmdWxseSBmaWxsZWQgInN0cnVjdCBwdF9yZWdzIi4KKyAqLworI2RlZmluZSBSMTUJCTAqOAorI2RlZmluZSBSMTQJCTEqOAorI2RlZmluZSBSMTMJCTIqOAorI2RlZmluZSBSMTIJCTMqOAorI2RlZmluZSBSQlAJCTQqOAorI2RlZmluZSBSQlgJCTUqOAorLyogVGhlc2UgcmVncyBhcmUgY2FsbGVlLWNsb2JiZXJlZC4gQWx3YXlzIHNhdmVkIG9uIGtlcm5lbCBlbnRyeS4gKi8KKyNkZWZpbmUgUjExCQk2KjgKKyNkZWZpbmUgUjEwCQk3KjgKKyNkZWZpbmUgUjkJCTgqOAorI2RlZmluZSBSOAkJOSo4CisjZGVmaW5lIFJBWAkJMTAqOAorI2RlZmluZSBSQ1gJCTExKjgKKyNkZWZpbmUgUkRYCQkxMio4CisjZGVmaW5lIFJTSQkJMTMqOAorI2RlZmluZSBSREkJCTE0KjgKKy8qCisgKiBPbiBzeXNjYWxsIGVudHJ5LCB0aGlzIGlzIHN5c2NhbGwjLiBPbiBDUFUgZXhjZXB0aW9uLCB0aGlzIGlzIGVycm9yIGNvZGUuCisgKiBPbiBodyBpbnRlcnJ1cHQsIGl0J3MgSVJRIG51bWJlcjoKKyAqLworI2RlZmluZSBPUklHX1JBWAkxNSo4CisvKiBSZXR1cm4gZnJhbWUgZm9yIGlyZXRxICovCisjZGVmaW5lIFJJUAkJMTYqOAorI2RlZmluZSBDUwkJMTcqOAorI2RlZmluZSBFRkxBR1MJCTE4KjgKKyNkZWZpbmUgUlNQCQkxOSo4CisjZGVmaW5lIFNTCQkyMCo4CiAKLS8qIGFyZ3VtZW50czogaW50ZXJydXB0cy9ub24gdHJhY2luZyBzeXNjYWxscyBvbmx5IHNhdmUgdXAgdG8gaGVyZTogKi8KLSNkZWZpbmUgUjExCQkgNDgKLSNkZWZpbmUgUjEwCQkgNTYKLSNkZWZpbmUgUjkJCSA2NAotI2RlZmluZSBSOAkJIDcyCi0jZGVmaW5lIFJBWAkJIDgwCi0jZGVmaW5lIFJDWAkJIDg4Ci0jZGVmaW5lIFJEWAkJIDk2Ci0jZGVmaW5lIFJTSQkJMTA0Ci0jZGVmaW5lIFJESQkJMTEyCi0jZGVmaW5lIE9SSUdfUkFYCTEyMCAgICAgICAvKiArIGVycm9yX2NvZGUgKi8KLS8qIGVuZCBvZiBhcmd1bWVudHMgKi8KKyNkZWZpbmUgU0laRU9GX1BUUkVHUwkyMSo4CiAKLS8qIGNwdSBleGNlcHRpb24gZnJhbWUgb3IgdW5kZWZpbmVkIGluIGNhc2Ugb2YgZmFzdCBzeXNjYWxsOiAqLwotI2RlZmluZSBSSVAJCTEyOAotI2RlZmluZSBDUwkJMTM2Ci0jZGVmaW5lIEVGTEFHUwkJMTQ0Ci0jZGVmaW5lIFJTUAkJMTUyCi0jZGVmaW5lIFNTCQkxNjAKLQotI2RlZmluZSBBUkdPRkZTRVQJUjExCi0KLQkubWFjcm8gU0FWRV9BUkdTIGFkZHNraXA9MCwgc2F2ZV9yY3g9MSwgc2F2ZV9yODkxMDExPTEsIHJheF9lbm9zeXM9MAotCXN1YnEgICQ5KjgrXGFkZHNraXAsICVyc3AKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQJOSo4K1xhZGRza2lwCi0JbW92cV9jZmkgcmRpLCA4KjgKLQltb3ZxX2NmaSByc2ksIDcqOAotCW1vdnFfY2ZpIHJkeCwgNio4Ci0KLQkuaWYgXHNhdmVfcmN4Ci0JbW92cV9jZmkgcmN4LCA1KjgKLQkuZW5kaWYKLQotCS5pZiBccmF4X2Vub3N5cwotCW1vdnEgJC1FTk9TWVMsIDQqOCglcnNwKQotCS5lbHNlCi0JbW92cV9jZmkgcmF4LCA0KjgKLQkuZW5kaWYKLQotCS5pZiBcc2F2ZV9yODkxMDExCi0JbW92cV9jZmkgcjgsICAzKjgKLQltb3ZxX2NmaSByOSwgIDIqOAotCW1vdnFfY2ZpIHIxMCwgMSo4Ci0JbW92cV9jZmkgcjExLCAwKjgKLQkuZW5kaWYKLQorCS5tYWNybyBBTExPQ19QVF9HUFJFR1NfT05fU1RBQ0sgYWRkc2tpcD0wCisJc3VicQkkMTUqOCtcYWRkc2tpcCwgJXJzcAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAxNSo4K1xhZGRza2lwCiAJLmVuZG0KIAotI2RlZmluZSBBUkdfU0tJUAkoOSo4KQorCS5tYWNybyBTQVZFX0NfUkVHU19IRUxQRVIgb2Zmc2V0PTAgcmF4PTEgcmN4PTEgcjg5MTA9MSByMTE9MQorCS5pZiBccjExCisJbW92cV9jZmkgcjExLCA2KjgrXG9mZnNldAorCS5lbmRpZgorCS5pZiBccjg5MTAKKwltb3ZxX2NmaSByMTAsIDcqOCtcb2Zmc2V0CisJbW92cV9jZmkgcjksICA4KjgrXG9mZnNldAorCW1vdnFfY2ZpIHI4LCAgOSo4K1xvZmZzZXQKKwkuZW5kaWYKKwkuaWYgXHJheAorCW1vdnFfY2ZpIHJheCwgMTAqOCtcb2Zmc2V0CisJLmVuZGlmCisJLmlmIFxyY3gKKwltb3ZxX2NmaSByY3gsIDExKjgrXG9mZnNldAorCS5lbmRpZgorCW1vdnFfY2ZpIHJkeCwgMTIqOCtcb2Zmc2V0CisJbW92cV9jZmkgcnNpLCAxMyo4K1xvZmZzZXQKKwltb3ZxX2NmaSByZGksIDE0KjgrXG9mZnNldAorCS5lbmRtCisJLm1hY3JvIFNBVkVfQ19SRUdTIG9mZnNldD0wCisJU0FWRV9DX1JFR1NfSEVMUEVSIFxvZmZzZXQsIDEsIDEsIDEsIDEKKwkuZW5kbQorCS5tYWNybyBTQVZFX0NfUkVHU19FWENFUFRfUkFYX1JDWCBvZmZzZXQ9MAorCVNBVkVfQ19SRUdTX0hFTFBFUiBcb2Zmc2V0LCAwLCAwLCAxLCAxCisJLmVuZG0KKwkubWFjcm8gU0FWRV9DX1JFR1NfRVhDRVBUX1I4OTEwMTEKKwlTQVZFX0NfUkVHU19IRUxQRVIgMCwgMSwgMSwgMCwgMAorCS5lbmRtCisJLm1hY3JvIFNBVkVfQ19SRUdTX0VYQ0VQVF9SQ1hfUjg5MTAxMQorCVNBVkVfQ19SRUdTX0hFTFBFUiAwLCAxLCAwLCAwLCAwCisJLmVuZG0KKwkubWFjcm8gU0FWRV9DX1JFR1NfRVhDRVBUX1JBWF9SQ1hfUjExCisJU0FWRV9DX1JFR1NfSEVMUEVSIDAsIDAsIDAsIDEsIDAKKwkuZW5kbQogCi0JLm1hY3JvIFJFU1RPUkVfQVJHUyByc3Rvcl9yYXg9MSwgYWRkc2tpcD0wLCByc3Rvcl9yY3g9MSwgcnN0b3JfcjExPTEsIFwKLQkJCSAgICByc3Rvcl9yODkxMD0xLCByc3Rvcl9yZHg9MQorCS5tYWNybyBTQVZFX0VYVFJBX1JFR1Mgb2Zmc2V0PTAKKwltb3ZxX2NmaSByMTUsIDAqOCtcb2Zmc2V0CisJbW92cV9jZmkgcjE0LCAxKjgrXG9mZnNldAorCW1vdnFfY2ZpIHIxMywgMio4K1xvZmZzZXQKKwltb3ZxX2NmaSByMTIsIDMqOCtcb2Zmc2V0CisJbW92cV9jZmkgcmJwLCA0KjgrXG9mZnNldAorCW1vdnFfY2ZpIHJieCwgNSo4K1xvZmZzZXQKKwkuZW5kbQorCS5tYWNybyBTQVZFX0VYVFJBX1JFR1NfUkJQIG9mZnNldD0wCisJbW92cV9jZmkgcmJwLCA0KjgrXG9mZnNldAorCS5lbmRtCisKKwkubWFjcm8gUkVTVE9SRV9FWFRSQV9SRUdTIG9mZnNldD0wCisJbW92cV9jZmlfcmVzdG9yZSAwKjgrXG9mZnNldCwgcjE1CisJbW92cV9jZmlfcmVzdG9yZSAxKjgrXG9mZnNldCwgcjE0CisJbW92cV9jZmlfcmVzdG9yZSAyKjgrXG9mZnNldCwgcjEzCisJbW92cV9jZmlfcmVzdG9yZSAzKjgrXG9mZnNldCwgcjEyCisJbW92cV9jZmlfcmVzdG9yZSA0KjgrXG9mZnNldCwgcmJwCisJbW92cV9jZmlfcmVzdG9yZSA1KjgrXG9mZnNldCwgcmJ4CisJLmVuZG0KKworCS5tYWNybyBaRVJPX0VYVFJBX1JFR1MKKwl4b3JsCSVyMTVkLCAlcjE1ZAorCXhvcmwJJXIxNGQsICVyMTRkCisJeG9ybAklcjEzZCwgJXIxM2QKKwl4b3JsCSVyMTJkLCAlcjEyZAorCXhvcmwJJWVicCwgJWVicAorCXhvcmwJJWVieCwgJWVieAorCS5lbmRtCisKKwkubWFjcm8gUkVTVE9SRV9DX1JFR1NfSEVMUEVSIHJzdG9yX3JheD0xLCByc3Rvcl9yY3g9MSwgcnN0b3JfcjExPTEsIHJzdG9yX3I4OTEwPTEsIHJzdG9yX3JkeD0xCiAJLmlmIFxyc3Rvcl9yMTEKLQltb3ZxX2NmaV9yZXN0b3JlIDAqOCwgcjExCisJbW92cV9jZmlfcmVzdG9yZSA2KjgsIHIxMQogCS5lbmRpZgotCiAJLmlmIFxyc3Rvcl9yODkxMAotCW1vdnFfY2ZpX3Jlc3RvcmUgMSo4LCByMTAKLQltb3ZxX2NmaV9yZXN0b3JlIDIqOCwgcjkKLQltb3ZxX2NmaV9yZXN0b3JlIDMqOCwgcjgKKwltb3ZxX2NmaV9yZXN0b3JlIDcqOCwgcjEwCisJbW92cV9jZmlfcmVzdG9yZSA4KjgsIHI5CisJbW92cV9jZmlfcmVzdG9yZSA5KjgsIHI4CiAJLmVuZGlmCi0KIAkuaWYgXHJzdG9yX3JheAotCW1vdnFfY2ZpX3Jlc3RvcmUgNCo4LCByYXgKKwltb3ZxX2NmaV9yZXN0b3JlIDEwKjgsIHJheAogCS5lbmRpZgotCiAJLmlmIFxyc3Rvcl9yY3gKLQltb3ZxX2NmaV9yZXN0b3JlIDUqOCwgcmN4CisJbW92cV9jZmlfcmVzdG9yZSAxMSo4LCByY3gKIAkuZW5kaWYKLQogCS5pZiBccnN0b3JfcmR4Ci0JbW92cV9jZmlfcmVzdG9yZSA2KjgsIHJkeAorCW1vdnFfY2ZpX3Jlc3RvcmUgMTIqOCwgcmR4CiAJLmVuZGlmCi0KLQltb3ZxX2NmaV9yZXN0b3JlIDcqOCwgcnNpCi0JbW92cV9jZmlfcmVzdG9yZSA4KjgsIHJkaQotCi0JLmlmIEFSR19TS0lQK1xhZGRza2lwID4gMAotCWFkZHEgJEFSR19TS0lQK1xhZGRza2lwLCAlcnNwCi0JQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUCS0oQVJHX1NLSVArXGFkZHNraXApCi0JLmVuZGlmCisJbW92cV9jZmlfcmVzdG9yZSAxMyo4LCByc2kKKwltb3ZxX2NmaV9yZXN0b3JlIDE0KjgsIHJkaQorCS5lbmRtCisJLm1hY3JvIFJFU1RPUkVfQ19SRUdTCisJUkVTVE9SRV9DX1JFR1NfSEVMUEVSIDEsMSwxLDEsMQorCS5lbmRtCisJLm1hY3JvIFJFU1RPUkVfQ19SRUdTX0VYQ0VQVF9SQVgKKwlSRVNUT1JFX0NfUkVHU19IRUxQRVIgMCwxLDEsMSwxCisJLmVuZG0KKwkubWFjcm8gUkVTVE9SRV9DX1JFR1NfRVhDRVBUX1JDWAorCVJFU1RPUkVfQ19SRUdTX0hFTFBFUiAxLDAsMSwxLDEKKwkuZW5kbQorCS5tYWNybyBSRVNUT1JFX0NfUkVHU19FWENFUFRfUjExCisJUkVTVE9SRV9DX1JFR1NfSEVMUEVSIDEsMSwwLDEsMQorCS5lbmRtCisJLm1hY3JvIFJFU1RPUkVfQ19SRUdTX0VYQ0VQVF9SQ1hfUjExCisJUkVTVE9SRV9DX1JFR1NfSEVMUEVSIDEsMCwwLDEsMQorCS5lbmRtCisJLm1hY3JvIFJFU1RPUkVfUlNJX1JESQorCVJFU1RPUkVfQ19SRUdTX0hFTFBFUiAwLDAsMCwwLDAKKwkuZW5kbQorCS5tYWNybyBSRVNUT1JFX1JTSV9SRElfUkRYCisJUkVTVE9SRV9DX1JFR1NfSEVMUEVSIDAsMCwwLDAsMQogCS5lbmRtCiAKLQkubWFjcm8gTE9BRF9BUkdTIG9mZnNldCwgc2tpcHJheD0wCi0JbW92cSBcb2Zmc2V0KCVyc3ApLCAgICAlcjExCi0JbW92cSBcb2Zmc2V0KzgoJXJzcCksICAlcjEwCi0JbW92cSBcb2Zmc2V0KzE2KCVyc3ApLCAlcjkKLQltb3ZxIFxvZmZzZXQrMjQoJXJzcCksICVyOAotCW1vdnEgXG9mZnNldCs0MCglcnNwKSwgJXJjeAotCW1vdnEgXG9mZnNldCs0OCglcnNwKSwgJXJkeAotCW1vdnEgXG9mZnNldCs1NiglcnNwKSwgJXJzaQotCW1vdnEgXG9mZnNldCs2NCglcnNwKSwgJXJkaQotCS5pZiBcc2tpcHJheAotCS5lbHNlCi0JbW92cSBcb2Zmc2V0KzcyKCVyc3ApLCAlcmF4Ci0JLmVuZGlmCi0JLmVuZG0KLQotI2RlZmluZSBSRVNUX1NLSVAJKDYqOCkKLQotCS5tYWNybyBTQVZFX1JFU1QKLQlzdWJxICRSRVNUX1NLSVAsICVyc3AKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQJUkVTVF9TS0lQCi0JbW92cV9jZmkgcmJ4LCA1KjgKLQltb3ZxX2NmaSByYnAsIDQqOAotCW1vdnFfY2ZpIHIxMiwgMyo4Ci0JbW92cV9jZmkgcjEzLCAyKjgKLQltb3ZxX2NmaSByMTQsIDEqOAotCW1vdnFfY2ZpIHIxNSwgMCo4Ci0JLmVuZG0KLQotCS5tYWNybyBSRVNUT1JFX1JFU1QKLQltb3ZxX2NmaV9yZXN0b3JlIDAqOCwgcjE1Ci0JbW92cV9jZmlfcmVzdG9yZSAxKjgsIHIxNAotCW1vdnFfY2ZpX3Jlc3RvcmUgMio4LCByMTMKLQltb3ZxX2NmaV9yZXN0b3JlIDMqOCwgcjEyCi0JbW92cV9jZmlfcmVzdG9yZSA0KjgsIHJicAotCW1vdnFfY2ZpX3Jlc3RvcmUgNSo4LCByYngKLQlhZGRxICRSRVNUX1NLSVAsICVyc3AKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQJLShSRVNUX1NLSVApCi0JLmVuZG0KLQotCS5tYWNybyBTQVZFX0FMTAotCVNBVkVfQVJHUwotCVNBVkVfUkVTVAotCS5lbmRtCi0KLQkubWFjcm8gUkVTVE9SRV9BTEwgYWRkc2tpcD0wCi0JUkVTVE9SRV9SRVNUCi0JUkVTVE9SRV9BUkdTIDEsIFxhZGRza2lwCisJLm1hY3JvIFJFTU9WRV9QVF9HUFJFR1NfRlJPTV9TVEFDSyBhZGRza2lwPTAKKwlhZGRxICQxNSo4K1xhZGRza2lwLCAlcnNwCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC0oMTUqOCtcYWRkc2tpcCkKIAkuZW5kbQogCiAJLm1hY3JvIGljZWJwCkBAIC0yMTAsMzcgKzIyNCwyMyBAQAogICovCiAKIAkubWFjcm8gU0FWRV9BTEwKLQlwdXNobF9jZmkgJWVheAotCUNGSV9SRUxfT0ZGU0VUIGVheCwgMAotCXB1c2hsX2NmaSAlZWJwCi0JQ0ZJX1JFTF9PRkZTRVQgZWJwLCAwCi0JcHVzaGxfY2ZpICVlZGkKLQlDRklfUkVMX09GRlNFVCBlZGksIDAKLQlwdXNobF9jZmkgJWVzaQotCUNGSV9SRUxfT0ZGU0VUIGVzaSwgMAotCXB1c2hsX2NmaSAlZWR4Ci0JQ0ZJX1JFTF9PRkZTRVQgZWR4LCAwCi0JcHVzaGxfY2ZpICVlY3gKLQlDRklfUkVMX09GRlNFVCBlY3gsIDAKLQlwdXNobF9jZmkgJWVieAotCUNGSV9SRUxfT0ZGU0VUIGVieCwgMAorCXB1c2hsX2NmaV9yZWcgZWF4CisJcHVzaGxfY2ZpX3JlZyBlYnAKKwlwdXNobF9jZmlfcmVnIGVkaQorCXB1c2hsX2NmaV9yZWcgZXNpCisJcHVzaGxfY2ZpX3JlZyBlZHgKKwlwdXNobF9jZmlfcmVnIGVjeAorCXB1c2hsX2NmaV9yZWcgZWJ4CiAJLmVuZG0KIAogCS5tYWNybyBSRVNUT1JFX0FMTAotCXBvcGxfY2ZpICVlYngKLQlDRklfUkVTVE9SRSBlYngKLQlwb3BsX2NmaSAlZWN4Ci0JQ0ZJX1JFU1RPUkUgZWN4Ci0JcG9wbF9jZmkgJWVkeAotCUNGSV9SRVNUT1JFIGVkeAotCXBvcGxfY2ZpICVlc2kKLQlDRklfUkVTVE9SRSBlc2kKLQlwb3BsX2NmaSAlZWRpCi0JQ0ZJX1JFU1RPUkUgZWRpCi0JcG9wbF9jZmkgJWVicAotCUNGSV9SRVNUT1JFIGVicAotCXBvcGxfY2ZpICVlYXgKLQlDRklfUkVTVE9SRSBlYXgKKwlwb3BsX2NmaV9yZWcgZWJ4CisJcG9wbF9jZmlfcmVnIGVjeAorCXBvcGxfY2ZpX3JlZyBlZHgKKwlwb3BsX2NmaV9yZWcgZXNpCisJcG9wbF9jZmlfcmVnIGVkaQorCXBvcGxfY2ZpX3JlZyBlYnAKKwlwb3BsX2NmaV9yZWcgZWF4CiAJLmVuZG0KIAogI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NvbXBhdC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY29tcGF0LmgKaW5kZXggNTljNmM0MC4uYWNkZWUwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY29tcGF0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY29tcGF0LmgKQEAgLTMwMSw3ICszMDEsNyBAQAogCQlzcCA9IHRhc2tfcHRfcmVncyhjdXJyZW50KS0+c3A7CiAJfSBlbHNlIHsKIAkJLyogLTEyOCBmb3IgdGhlIHgzMiBBQkkgcmVkem9uZSAqLwotCQlzcCA9IHRoaXNfY3B1X3JlYWQob2xkX3JzcCkgLSAxMjg7CisJCXNwID0gdGFza19wdF9yZWdzKGN1cnJlbnQpLT5zcCAtIDEyODsKIAl9CiAKIAlyZXR1cm4gKHZvaWQgX191c2VyICopcm91bmRfZG93bihzcCAtIGxlbiwgMTYpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHUuaAppbmRleCBkMmIxMjk4Li5iZjJjYWExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHUuaApAQCAtMzQsOCArMzQsNiBAQAogI2VuZGlmCiAjZW5kaWYKIAotREVDTEFSRV9QRVJfQ1BVKGludCwgY3B1X3N0YXRlKTsKLQogaW50IG13YWl0X3VzYWJsZShjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKik7CiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9DUFVfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCmluZGV4IDkwYTU0ODUuLjdlZTliOTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxhc20vZGlzYWJsZWQtZmVhdHVyZXMuaD4KICNlbmRpZgogCi0jZGVmaW5lIE5DQVBJTlRTCTExCS8qIE4gMzItYml0IHdvcmRzIHdvcnRoIG9mIGluZm8gKi8KKyNkZWZpbmUgTkNBUElOVFMJMTMJLyogTiAzMi1iaXQgd29yZHMgd29ydGggb2YgaW5mbyAqLwogI2RlZmluZSBOQlVHSU5UUwkxCS8qIE4gMzItYml0IGJ1ZyBmbGFncyAqLwogCiAvKgpAQCAtMTk1LDYgKzE5NSw3IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0hXUF9BQ1RfV0lORE9XICggNyozMisgMTIpIC8qIEludGVsIEhXUF9BQ1RfV0lORE9XICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0hXUF9FUFAJKCA3KjMyKzEzKSAvKiBJbnRlbCBIV1BfRVBQICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0hXUF9QS0dfUkVRICggNyozMisxNCkgLyogSW50ZWwgSFdQX1BLR19SRVEgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfSU5URUxfUFQJKCA3KjMyKzE1KSAvKiBJbnRlbCBQcm9jZXNzb3IgVHJhY2UgKi8KIAogLyogVmlydHVhbGl6YXRpb24gZmxhZ3M6IExpbnV4IGRlZmluZWQsIHdvcmQgOCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9UUFJfU0hBRE9XICAoIDgqMzIrIDApIC8qIEludGVsIFRQUiBTaGFkb3cgKi8KQEAgLTIyNiwxMiArMjI3LDE1IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0VSTVMJKCA5KjMyKyA5KSAvKiBFbmhhbmNlZCBSRVAgTU9WU0IvU1RPU0IgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfSU5WUENJRAkoIDkqMzIrMTApIC8qIEludmFsaWRhdGUgUHJvY2Vzc29yIENvbnRleHQgSUQgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfUlRNCQkoIDkqMzIrMTEpIC8qIFJlc3RyaWN0ZWQgVHJhbnNhY3Rpb25hbCBNZW1vcnkgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ1FNCQkoIDkqMzIrMTIpIC8qIENhY2hlIFFvUyBNb25pdG9yaW5nICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX01QWAkJKCA5KjMyKzE0KSAvKiBNZW1vcnkgUHJvdGVjdGlvbiBFeHRlbnNpb24gKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQVZYNTEyRgkoIDkqMzIrMTYpIC8qIEFWWC01MTIgRm91bmRhdGlvbiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9SRFNFRUQJKCA5KjMyKzE4KSAvKiBUaGUgUkRTRUVEIGluc3RydWN0aW9uICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FEWAkJKCA5KjMyKzE5KSAvKiBUaGUgQURDWCBhbmQgQURPWCBpbnN0cnVjdGlvbnMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfU01BUAkoIDkqMzIrMjApIC8qIFN1cGVydmlzb3IgTW9kZSBBY2Nlc3MgUHJldmVudGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9QQ09NTUlUCSggOSozMisyMikgLyogUENPTU1JVCBpbnN0cnVjdGlvbiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9DTEZMVVNIT1BUCSggOSozMisyMykgLyogQ0xGTFVTSE9QVCBpbnN0cnVjdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DTFdCCSggOSozMisyNCkgLyogQ0xXQiBpbnN0cnVjdGlvbiAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9BVlg1MTJQRgkoIDkqMzIrMjYpIC8qIEFWWC01MTIgUHJlZmV0Y2ggKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfQVZYNTEyRVIJKCA5KjMyKzI3KSAvKiBBVlgtNTEyIEV4cG9uZW50aWFsIGFuZCBSZWNpcHJvY2FsICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FWWDUxMkNECSggOSozMisyOCkgLyogQVZYLTUxMiBDb25mbGljdCBEZXRlY3Rpb24gKi8KQEAgLTI0Miw2ICsyNDYsMTIgQEAKICNkZWZpbmUgWDg2X0ZFQVRVUkVfWEdFVEJWMQkoMTAqMzIrIDIpIC8qIFhHRVRCViB3aXRoIEVDWCA9IDEgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfWFNBVkVTCSgxMCozMisgMykgLyogWFNBVkVTL1hSU1RPUlMgKi8KIAorLyogSW50ZWwtZGVmaW5lZCBDUFUgUW9TIFN1Yi1sZWFmLCBDUFVJRCBsZXZlbCAweDAwMDAwMDBGOjAgKGVkeCksIHdvcmQgMTEgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ1FNX0xMQwkoMTEqMzIrIDEpIC8qIExMQyBRb1MgaWYgMSAqLworCisvKiBJbnRlbC1kZWZpbmVkIENQVSBRb1MgU3ViLWxlYWYsIENQVUlEIGxldmVsIDB4MDAwMDAwMEY6MSAoZWR4KSwgd29yZCAxMiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9DUU1fT0NDVVBfTExDICgxMiozMisgMCkgLyogTExDIG9jY3VwYW5jeSBtb25pdG9yaW5nIGlmIDEgKi8KKwogLyoKICAqIEJVRyB3b3JkKHMpCiAgKi8KQEAgLTQxOCw2ICs0MjgsNyBAQAogCQkJICIgLndvcmQgJVAwXG4iCQkvKiAxOiBkbyByZXBsYWNlICovCiAJCQkgIiAuYnl0ZSAyYiAtIDFiXG4iCS8qIHNvdXJjZSBsZW4gKi8KIAkJCSAiIC5ieXRlIDBcbiIJCS8qIHJlcGxhY2VtZW50IGxlbiAqLworCQkJICIgLmJ5dGUgMFxuIgkJLyogcGFkIGxlbiAqLwogCQkJICIucHJldmlvdXNcbiIKIAkJCSAvKiBza2lwcGluZyBzaXplIGNoZWNrIHNpbmNlIHJlcGxhY2VtZW50IHNpemUgPSAwICovCiAJCQkgOiA6ICJpIiAoWDg2X0ZFQVRVUkVfQUxXQVlTKSA6IDogdF93YXJuKTsKQEAgLTQzMiw2ICs0NDMsNyBAQAogCQkJICIgLndvcmQgJVAwXG4iCQkvKiBmZWF0dXJlIGJpdCAqLwogCQkJICIgLmJ5dGUgMmIgLSAxYlxuIgkvKiBzb3VyY2UgbGVuICovCiAJCQkgIiAuYnl0ZSAwXG4iCQkvKiByZXBsYWNlbWVudCBsZW4gKi8KKwkJCSAiIC5ieXRlIDBcbiIJCS8qIHBhZCBsZW4gKi8KIAkJCSAiLnByZXZpb3VzXG4iCiAJCQkgLyogc2tpcHBpbmcgc2l6ZSBjaGVjayBzaW5jZSByZXBsYWNlbWVudCBzaXplID0gMCAqLwogCQkJIDogOiAiaSIgKGJpdCkgOiA6IHRfbm8pOwpAQCAtNDU3LDYgKzQ2OSw3IEBACiAJCQkgICAgICIgLndvcmQgJVAxXG4iCQkvKiBmZWF0dXJlIGJpdCAqLwogCQkJICAgICAiIC5ieXRlIDJiIC0gMWJcbiIJCS8qIHNvdXJjZSBsZW4gKi8KIAkJCSAgICAgIiAuYnl0ZSA0ZiAtIDNmXG4iCQkvKiByZXBsYWNlbWVudCBsZW4gKi8KKwkJCSAgICAgIiAuYnl0ZSAwXG4iCQkvKiBwYWQgbGVuICovCiAJCQkgICAgICIucHJldmlvdXNcbiIKIAkJCSAgICAgIi5zZWN0aW9uIC5kaXNjYXJkLFwiYXdcIixAcHJvZ2JpdHNcbiIKIAkJCSAgICAgIiAuYnl0ZSAweGZmICsgKDRmLTNmKSAtICgyYi0xYilcbiIgLyogc2l6ZSBjaGVjayAqLwpAQCAtNDgzLDMxICs0OTYsMzAgQEAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgX19wdXJlIGJvb2wgX3N0YXRpY19jcHVfaGFzX3NhZmUodTE2IGJpdCkKIHsKICNpZmRlZiBDQ19IQVZFX0FTTV9HT1RPCi0vKgotICogV2UgbmVlZCB0byBzcGVsbCB0aGUganVtcHMgdG8gdGhlIGNvbXBpbGVyIGJlY2F1c2UsIGRlcGVuZGluZyBvbiB0aGUgb2Zmc2V0LAotICogdGhlIHJlcGxhY2VtZW50IGp1bXAgY2FuIGJlIGJpZ2dlciB0aGFuIHRoZSBvcmlnaW5hbCBqdW1wLCBhbmQgdGhpcyB3ZSBjYW5ub3QKLSAqIGhhdmUuIFRodXMsIHdlIGZvcmNlIHRoZSBqdW1wIHRvIHRoZSB3aWRlc3QsIDQtYnl0ZSwgc2lnbmVkIHJlbGF0aXZlCi0gKiBvZmZzZXQgZXZlbiB0aG91Z2ggdGhlIGxhc3Qgd291bGQgb2Z0ZW4gZml0IGluIGxlc3MgYnl0ZXMuCi0gKi8KLQkJYXNtX3ZvbGF0aWxlX2dvdG8oIjE6IC5ieXRlIDB4ZTlcbiAubG9uZyAlbFt0X2R5bmFtaWNdIC0gMmZcbiIKKwkJYXNtX3ZvbGF0aWxlX2dvdG8oIjE6IGptcCAlbFt0X2R5bmFtaWNdXG4iCiAJCQkgIjI6XG4iCisJCQkgIi5za2lwIC0oKCg1Zi00ZikgLSAoMmItMWIpKSA+IDApICogIgorCQkJICAgICAgICAgIigoNWYtNGYpIC0gKDJiLTFiKSksMHg5MFxuIgorCQkJICIzOlxuIgogCQkJICIuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLFwiYVwiXG4iCiAJCQkgIiAubG9uZyAxYiAtIC5cbiIJCS8qIHNyYyBvZmZzZXQgKi8KLQkJCSAiIC5sb25nIDNmIC0gLlxuIgkJLyogcmVwbCBvZmZzZXQgKi8KKwkJCSAiIC5sb25nIDRmIC0gLlxuIgkJLyogcmVwbCBvZmZzZXQgKi8KIAkJCSAiIC53b3JkICVQMVxuIgkJCS8qIGFsd2F5cyByZXBsYWNlICovCi0JCQkgIiAuYnl0ZSAyYiAtIDFiXG4iCQkvKiBzcmMgbGVuICovCi0JCQkgIiAuYnl0ZSA0ZiAtIDNmXG4iCQkvKiByZXBsIGxlbiAqLworCQkJICIgLmJ5dGUgM2IgLSAxYlxuIgkJLyogc3JjIGxlbiAqLworCQkJICIgLmJ5dGUgNWYgLSA0ZlxuIgkJLyogcmVwbCBsZW4gKi8KKwkJCSAiIC5ieXRlIDNiIC0gMmJcbiIJCS8qIHBhZCBsZW4gKi8KIAkJCSAiLnByZXZpb3VzXG4iCiAJCQkgIi5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCxcImF4XCJcbiIKLQkJCSAiMzogLmJ5dGUgMHhlOVxuIC5sb25nICVsW3Rfbm9dIC0gMmJcbiIKLQkJCSAiNDpcbiIKKwkJCSAiNDogam1wICVsW3Rfbm9dXG4iCisJCQkgIjU6XG4iCiAJCQkgIi5wcmV2aW91c1xuIgogCQkJICIuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLFwiYVwiXG4iCiAJCQkgIiAubG9uZyAxYiAtIC5cbiIJCS8qIHNyYyBvZmZzZXQgKi8KIAkJCSAiIC5sb25nIDBcbiIJCQkvKiBubyByZXBsYWNlbWVudCAqLwogCQkJICIgLndvcmQgJVAwXG4iCQkJLyogZmVhdHVyZSBiaXQgKi8KLQkJCSAiIC5ieXRlIDJiIC0gMWJcbiIJCS8qIHNyYyBsZW4gKi8KKwkJCSAiIC5ieXRlIDNiIC0gMWJcbiIJCS8qIHNyYyBsZW4gKi8KIAkJCSAiIC5ieXRlIDBcbiIJCQkvKiByZXBsIGxlbiAqLworCQkJICIgLmJ5dGUgMFxuIgkJCS8qIHBhZCBsZW4gKi8KIAkJCSAiLnByZXZpb3VzXG4iCiAJCQkgOiA6ICJpIiAoYml0KSwgImkiIChYODZfRkVBVFVSRV9BTFdBWVMpCiAJCQkgOiA6IHRfZHluYW1pYywgdF9ubyk7CkBAIC01MjcsNiArNTM5LDcgQEAKIAkJCSAgICAgIiAud29yZCAlUDJcbiIJCS8qIGFsd2F5cyByZXBsYWNlICovCiAJCQkgICAgICIgLmJ5dGUgMmIgLSAxYlxuIgkJLyogc291cmNlIGxlbiAqLwogCQkJICAgICAiIC5ieXRlIDRmIC0gM2ZcbiIJCS8qIHJlcGxhY2VtZW50IGxlbiAqLworCQkJICAgICAiIC5ieXRlIDBcbiIJCS8qIHBhZCBsZW4gKi8KIAkJCSAgICAgIi5wcmV2aW91c1xuIgogCQkJICAgICAiLnNlY3Rpb24gLmRpc2NhcmQsXCJhd1wiLEBwcm9nYml0c1xuIgogCQkJICAgICAiIC5ieXRlIDB4ZmYgKyAoNGYtM2YpIC0gKDJiLTFiKVxuIiAvKiBzaXplIGNoZWNrICovCkBAIC01NDEsNiArNTU0LDcgQEAKIAkJCSAgICAgIiAud29yZCAlUDFcbiIJCS8qIGZlYXR1cmUgYml0ICovCiAJCQkgICAgICIgLmJ5dGUgNGIgLSAzYlxuIgkJLyogc3JjIGxlbiAqLwogCQkJICAgICAiIC5ieXRlIDZmIC0gNWZcbiIJCS8qIHJlcGwgbGVuICovCisJCQkgICAgICIgLmJ5dGUgMFxuIgkJLyogcGFkIGxlbiAqLwogCQkJICAgICAiLnByZXZpb3VzXG4iCiAJCQkgICAgICIuc2VjdGlvbiAuZGlzY2FyZCxcImF3XCIsQHByb2diaXRzXG4iCiAJCQkgICAgICIgLmJ5dGUgMHhmZiArICg2Zi01ZikgLSAoNGItM2IpXG4iIC8qIHNpemUgY2hlY2sgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Rlc2MuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Rlc2MuaAppbmRleCBhOTRiODJlLi5hMGJmODlmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kZXNjLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZGVzYy5oCkBAIC0zNzYsMTEgKzM3NiwxNiBAQAogICogUGVudGl1bSBGMCAwRiBidWdmaXggY2FuIGhhdmUgcmVzdWx0ZWQgaW4gdGhlIG1hcHBlZAogICogSURUIGJlaW5nIHdyaXRlLXByb3RlY3RlZC4KICAqLwotI2RlZmluZSBzZXRfaW50cl9nYXRlKG4sIGFkZHIpCQkJCQkJXAorI2RlZmluZSBzZXRfaW50cl9nYXRlX25vdHJhY2UobiwgYWRkcikJCQkJCVwKIAlkbyB7CQkJCQkJCQlcCiAJCUJVR19PTigodW5zaWduZWQpbiA+IDB4RkYpOwkJCQlcCiAJCV9zZXRfZ2F0ZShuLCBHQVRFX0lOVEVSUlVQVCwgKHZvaWQgKilhZGRyLCAwLCAwLAlcCiAJCQkgIF9fS0VSTkVMX0NTKTsJCQkJCVwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIHNldF9pbnRyX2dhdGUobiwgYWRkcikJCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlzZXRfaW50cl9nYXRlX25vdHJhY2UobiwgYWRkcik7CQkJCVwKIAkJX3RyYWNlX3NldF9nYXRlKG4sIEdBVEVfSU5URVJSVVBULCAodm9pZCAqKXRyYWNlXyMjYWRkcixcCiAJCQkJMCwgMCwgX19LRVJORUxfQ1MpOwkJCVwKIAl9IHdoaWxlICgwKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZHdhcmYyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kd2FyZjIuaAppbmRleCBmNmYxNTk4Li5kZTFjZGFmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kd2FyZjIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kd2FyZjIuaApAQCAtODYsMTEgKzg2LDIzIEBACiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDgKIAkuZW5kbQogCisJLm1hY3JvIHB1c2hxX2NmaV9yZWcgcmVnCisJcHVzaHEgJVxyZWcKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgOAorCUNGSV9SRUxfT0ZGU0VUIFxyZWcsIDAKKwkuZW5kbQorCiAJLm1hY3JvIHBvcHFfY2ZpIHJlZwogCXBvcHEgXHJlZwogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtOAogCS5lbmRtCiAKKwkubWFjcm8gcG9wcV9jZmlfcmVnIHJlZworCXBvcHEgJVxyZWcKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTgKKwlDRklfUkVTVE9SRSBccmVnCisJLmVuZG0KKwogCS5tYWNybyBwdXNoZnFfY2ZpCiAJcHVzaGZxCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDgKQEAgLTExNiwxMSArMTI4LDIzIEBACiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKIAkuZW5kbQogCisJLm1hY3JvIHB1c2hsX2NmaV9yZWcgcmVnCisJcHVzaGwgJVxyZWcKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNAorCUNGSV9SRUxfT0ZGU0VUIFxyZWcsIDAKKwkuZW5kbQorCiAJLm1hY3JvIHBvcGxfY2ZpIHJlZwogCXBvcGwgXHJlZwogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAogCS5lbmRtCiAKKwkubWFjcm8gcG9wbF9jZmlfcmVnIHJlZworCXBvcGwgJVxyZWcKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTQKKwlDRklfUkVTVE9SRSBccmVnCisJLmVuZG0KKwogCS5tYWNybyBwdXNoZmxfY2ZpCiAJcHVzaGZsCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2U4MjAuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2U4MjAuaAppbmRleCA3NzljMmVmLi4zYWIwNTM3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lODIwLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZTgyMC5oCkBAIC00MCwxNCArNDAsNiBAQAogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTUVNVEVTVAotZXh0ZXJuIHZvaWQgZWFybHlfbWVtdGVzdCh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGVhcmx5X21lbXRlc3QodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17Ci19Ci0jZW5kaWYKLQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZTgyMF9lbmRfb2ZfcmFtX3Bmbih2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGU4MjBfZW5kX29mX2xvd19yYW1fcGZuKHZvaWQpOwogZXh0ZXJuIHU2NCBlYXJseV9yZXNlcnZlX2U4MjAodTY0IHNpemV0LCB1NjQgYWxpZ24pOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZWZpLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lZmkuaAppbmRleCAyNWJjZTQ1Li4zNzM4YjEzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lZmkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lZmkuaApAQCAtMiw2ICsyLDggQEAKICNkZWZpbmUgX0FTTV9YODZfRUZJX0gKIAogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKwogLyoKICAqIFdlIG1hcCB0aGUgRUZJIHJlZ2lvbnMgbmVlZGVkIGZvciBydW50aW1lIHNlcnZpY2VzIG5vbi1jb250aWd1b3VzbHksCiAgKiB3aXRoIHByZXNlcnZlZCBhbGlnbm1lbnQgb24gdmlydHVhbCBhZGRyZXNzZXMgc3RhcnRpbmcgZnJvbSAtNEcgZG93bgpAQCAtODksOCArOTEsOCBAQAogZXh0ZXJuIHN0cnVjdCBlZmlfc2NyYXRjaCBlZmlfc2NyYXRjaDsKIGV4dGVybiB2b2lkIF9faW5pdCBlZmlfc2V0X2V4ZWN1dGFibGUoZWZpX21lbW9yeV9kZXNjX3QgKm1kLCBib29sIGV4ZWN1dGFibGUpOwogZXh0ZXJuIGludCBfX2luaXQgZWZpX21lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9jYWxsX3BoeXNfcHJvbG9nKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9jYWxsX3BoeXNfZXBpbG9nKHZvaWQpOworZXh0ZXJuIHBnZF90ICogX19pbml0IGVmaV9jYWxsX3BoeXNfcHJvbG9nKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9jYWxsX3BoeXNfZXBpbG9nKHBnZF90ICpzYXZlX3BnZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgZWZpX3VubWFwX21lbW1hcCh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBlZmlfbWVtb3J5X3VjKHU2NCBhZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpOwogZXh0ZXJuIHZvaWQgX19pbml0IGVmaV9tYXBfcmVnaW9uKGVmaV9tZW1vcnlfZGVzY190ICptZCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VsZi5oCmluZGV4IGNhMzM0N2EuLmYxNjFjMTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VsZi5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VsZi5oCkBAIC0xNzEsMTAgKzE3MSwxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIGVsZl9jb21tb25faW5pdChzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwKIAkJCQkgICBzdHJ1Y3QgcHRfcmVncyAqcmVncywgY29uc3QgdTE2IGRzKQogewotCXJlZ3MtPmF4ID0gcmVncy0+YnggPSByZWdzLT5jeCA9IHJlZ3MtPmR4ID0gMDsKLQlyZWdzLT5zaSA9IHJlZ3MtPmRpID0gcmVncy0+YnAgPSAwOworCS8qIENvbW1lbnRlZC1vdXQgcmVnaXN0ZXJzIGFyZSBjbGVhcmVkIGluIHN0dWJfZXhlY3ZlICovCisJLypyZWdzLT5heCA9IHJlZ3MtPmJ4ID0qLyByZWdzLT5jeCA9IHJlZ3MtPmR4ID0gMDsKKwlyZWdzLT5zaSA9IHJlZ3MtPmRpIC8qPSByZWdzLT5icCovID0gMDsKIAlyZWdzLT5yOCA9IHJlZ3MtPnI5ID0gcmVncy0+cjEwID0gcmVncy0+cjExID0gMDsKLQlyZWdzLT5yMTIgPSByZWdzLT5yMTMgPSByZWdzLT5yMTQgPSByZWdzLT5yMTUgPSAwOworCS8qcmVncy0+cjEyID0gcmVncy0+cjEzID0gcmVncy0+cjE0ID0gcmVncy0+cjE1ID0gMDsqLwogCXQtPmZzID0gdC0+Z3MgPSAwOwogCXQtPmZzaW5kZXggPSB0LT5nc2luZGV4ID0gMDsKIAl0LT5kcyA9IHQtPmVzID0gZHM7CkBAIC0zMzgsOSArMzM5LDYgQEAKIAkJCQkJICAgICAgaW50IHVzZXNfaW50ZXJwKTsKICNkZWZpbmUgY29tcGF0X2FyY2hfc2V0dXBfYWRkaXRpb25hbF9wYWdlcyBjb21wYXRfYXJjaF9zZXR1cF9hZGRpdGlvbmFsX3BhZ2VzCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfcmFuZG9taXplX2JyayhzdHJ1Y3QgbW1fc3RydWN0ICptbSk7Ci0jZGVmaW5lIGFyY2hfcmFuZG9taXplX2JyayBhcmNoX3JhbmRvbWl6ZV9icmsKLQogLyoKICAqIFRydWUgb24gWDg2XzMyIG9yIHdoZW4gZW11bGF0aW5nIElBMzIgb24gWDg2XzY0CiAgKi8KQEAgLTM2NSw2ICszNjMsNyBAQAogc3RydWN0IHZhX2FsaWdubWVudCB7CiAJaW50IGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgbWFzazsKKwl1bnNpZ25lZCBsb25nIGJpdHM7CiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAogZXh0ZXJuIHN0cnVjdCB2YV9hbGlnbm1lbnQgdmFfYWxpZ247CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9mcHUtaW50ZXJuYWwuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZwdS1pbnRlcm5hbC5oCmluZGV4IDBkYmMwODIuLmRhNWU5NjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZwdS1pbnRlcm5hbC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ZwdS1pbnRlcm5hbC5oCkBAIC02Nyw2ICs2NywzNCBAQAogc3RhdGljIGlubGluZSB2b2lkIGZpbml0X3NvZnRfZnB1KHN0cnVjdCBpMzg3X3NvZnRfc3RydWN0ICpzb2Z0KSB7fQogI2VuZGlmCiAKKy8qCisgKiBNdXN0IGJlIHJ1biB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQ6IHRoaXMgY2xlYXJzIHRoZSBmcHVfb3duZXJfdGFzaywKKyAqIG9uIHRoaXMgQ1BVLgorICoKKyAqIFRoaXMgd2lsbCBkaXNhYmxlIGFueSBsYXp5IEZQVSBzdGF0ZSByZXN0b3JlIG9mIHRoZSBjdXJyZW50IEZQVSBzdGF0ZSwKKyAqIGJ1dCBpZiB0aGUgY3VycmVudCB0aHJlYWQgb3ducyB0aGUgRlBVLCBpdCB3aWxsIHN0aWxsIGJlIHNhdmVkIGJ5LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19jcHVfZGlzYWJsZV9sYXp5X3Jlc3RvcmUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlwZXJfY3B1KGZwdV9vd25lcl90YXNrLCBjcHUpID0gTlVMTDsKK30KKworLyoKKyAqIFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgRlBVIHN0YXRlIGluIG1lbW9yeSBpcyBuZXdlciB0aGFuIHRoZSBGUFUKKyAqIHN0YXRlIGluIHJlZ2lzdGVycywgYW5kIHRoZSBGUFUgc3RhdGUgc2hvdWxkIGJlIHJlbG9hZGVkIG5leHQgdGltZSB0aGUKKyAqIHRhc2sgaXMgcnVuLiBPbmx5IHNhZmUgb24gdGhlIGN1cnJlbnQgdGFzaywgb3Igbm9uLXJ1bm5pbmcgdGFza3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX2Rpc2FibGVfbGF6eV9mcHVfcmVzdG9yZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwl0c2stPnRocmVhZC5mcHUubGFzdF9jcHUgPSB+MDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZnB1X2xhenlfcmVzdG9yZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldywgdW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gbmV3ID09IHRoaXNfY3B1X3JlYWRfc3RhYmxlKGZwdV9vd25lcl90YXNrKSAmJgorCQljcHUgPT0gbmV3LT50aHJlYWQuZnB1Lmxhc3RfY3B1OworfQorCiBzdGF0aWMgaW5saW5lIGludCBpc19pYTMyX2NvbXBhdF9mcmFtZSh2b2lkKQogewogCXJldHVybiBjb25maWdfZW5hYmxlZChDT05GSUdfSUEzMl9FTVVMQVRJT04pICYmCkBAIC0xMDcsNyArMTM1LDYgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGZ4X2Zpbml0KHN0cnVjdCBpMzg3X2Z4c2F2ZV9zdHJ1Y3QgKmZ4KQogewotCW1lbXNldChmeCwgMCwgeHN0YXRlX3NpemUpOwogCWZ4LT5jd2QgPSAweDM3ZjsKIAlmeC0+bXhjc3IgPSBNWENTUl9ERUZBVUxUOwogfQpAQCAtMzUxLDE3ICszNzgsNiBAQAogCV9fdGhyZWFkX3NldF9oYXNfZnB1KHRzayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2Ryb3BfZnB1KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQotewotCWlmIChfX3RocmVhZF9oYXNfZnB1KHRzaykpIHsKLQkJLyogSWdub3JlIGRlbGF5ZWQgZXhjZXB0aW9ucyBmcm9tIHVzZXIgc3BhY2UgKi8KLQkJYXNtIHZvbGF0aWxlKCIxOiBmd2FpdFxuIgotCQkJICAgICAiMjpcbiIKLQkJCSAgICAgX0FTTV9FWFRBQkxFKDFiLCAyYikpOwotCQlfX3RocmVhZF9mcHVfZW5kKHRzayk7Ci0JfQotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJvcF9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7CiAJLyoKQEAgLTM2OSwyMSArMzg1LDM3IEBACiAJICovCiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJdHNrLT50aHJlYWQuZnB1X2NvdW50ZXIgPSAwOwotCV9fZHJvcF9mcHUodHNrKTsKLQljbGVhcl91c2VkX21hdGgoKTsKKworCWlmIChfX3RocmVhZF9oYXNfZnB1KHRzaykpIHsKKwkJLyogSWdub3JlIGRlbGF5ZWQgZXhjZXB0aW9ucyBmcm9tIHVzZXIgc3BhY2UgKi8KKwkJYXNtIHZvbGF0aWxlKCIxOiBmd2FpdFxuIgorCQkJICAgICAiMjpcbiIKKwkJCSAgICAgX0FTTV9FWFRBQkxFKDFiLCAyYikpOworCQlfX3RocmVhZF9mcHVfZW5kKHRzayk7CisJfQorCisJY2xlYXJfc3RvcHBlZF9jaGlsZF91c2VkX21hdGgodHNrKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHJvcF9pbml0X2ZwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXN0b3JlX2luaXRfeHN0YXRlKHZvaWQpCit7CisJaWYgKHVzZV94c2F2ZSgpKQorCQl4cnN0b3Jfc3RhdGUoaW5pdF94c3RhdGVfYnVmLCAtMSk7CisJZWxzZQorCQlmeHJzdG9yX2NoZWNraW5nKCZpbml0X3hzdGF0ZV9idWYtPmkzODcpOworfQorCisvKgorICogUmVzZXQgdGhlIEZQVSBzdGF0ZSBpbiB0aGUgZWFnZXIgY2FzZSBhbmQgZHJvcCBpdCBpbiB0aGUgbGF6eSBjYXNlIChsYXRlciB1c2UKKyAqIHdpbGwgcmVpbml0IGl0KS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZwdV9yZXNldF9zdGF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKIAlpZiAoIXVzZV9lYWdlcl9mcHUoKSkKIAkJZHJvcF9mcHUodHNrKTsKLQllbHNlIHsKLQkJaWYgKHVzZV94c2F2ZSgpKQotCQkJeHJzdG9yX3N0YXRlKGluaXRfeHN0YXRlX2J1ZiwgLTEpOwotCQllbHNlCi0JCQlmeHJzdG9yX2NoZWNraW5nKCZpbml0X3hzdGF0ZV9idWYtPmkzODcpOwotCX0KKwllbHNlCisJCXJlc3RvcmVfaW5pdF94c3RhdGUoKTsKIH0KIAogLyoKQEAgLTQwMCwyNCArNDMyLDYgQEAKICAqLwogdHlwZWRlZiBzdHJ1Y3QgeyBpbnQgcHJlbG9hZDsgfSBmcHVfc3dpdGNoX3Q7CiAKLS8qCi0gKiBNdXN0IGJlIHJ1biB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQ6IHRoaXMgY2xlYXJzIHRoZSBmcHVfb3duZXJfdGFzaywKLSAqIG9uIHRoaXMgQ1BVLgotICoKLSAqIFRoaXMgd2lsbCBkaXNhYmxlIGFueSBsYXp5IEZQVSBzdGF0ZSByZXN0b3JlIG9mIHRoZSBjdXJyZW50IEZQVSBzdGF0ZSwKLSAqIGJ1dCBpZiB0aGUgY3VycmVudCB0aHJlYWQgb3ducyB0aGUgRlBVLCBpdCB3aWxsIHN0aWxsIGJlIHNhdmVkIGJ5LgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jcHVfZGlzYWJsZV9sYXp5X3Jlc3RvcmUodW5zaWduZWQgaW50IGNwdSkKLXsKLQlwZXJfY3B1KGZwdV9vd25lcl90YXNrLCBjcHUpID0gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZnB1X2xhenlfcmVzdG9yZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5ldywgdW5zaWduZWQgaW50IGNwdSkKLXsKLQlyZXR1cm4gbmV3ID09IHRoaXNfY3B1X3JlYWRfc3RhYmxlKGZwdV9vd25lcl90YXNrKSAmJgotCQljcHUgPT0gbmV3LT50aHJlYWQuZnB1Lmxhc3RfY3B1OwotfQotCiBzdGF0aWMgaW5saW5lIGZwdV9zd2l0Y2hfdCBzd2l0Y2hfZnB1X3ByZXBhcmUoc3RydWN0IHRhc2tfc3RydWN0ICpvbGQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3LCBpbnQgY3B1KQogewogCWZwdV9zd2l0Y2hfdCBmcHU7CkBAIC00MjYsMTMgKzQ0MCwxNyBAQAogCSAqIElmIHRoZSB0YXNrIGhhcyB1c2VkIHRoZSBtYXRoLCBwcmUtbG9hZCB0aGUgRlBVIG9uIHhzYXZlIHByb2Nlc3NvcnMKIAkgKiBvciBpZiB0aGUgcGFzdCA1IGNvbnNlY3V0aXZlIGNvbnRleHQtc3dpdGNoZXMgdXNlZCBtYXRoLgogCSAqLwotCWZwdS5wcmVsb2FkID0gdHNrX3VzZWRfbWF0aChuZXcpICYmICh1c2VfZWFnZXJfZnB1KCkgfHwKLQkJCQkJICAgICBuZXctPnRocmVhZC5mcHVfY291bnRlciA+IDUpOworCWZwdS5wcmVsb2FkID0gdHNrX3VzZWRfbWF0aChuZXcpICYmCisJCSAgICAgICh1c2VfZWFnZXJfZnB1KCkgfHwgbmV3LT50aHJlYWQuZnB1X2NvdW50ZXIgPiA1KTsKKwogCWlmIChfX3RocmVhZF9oYXNfZnB1KG9sZCkpIHsKIAkJaWYgKCFfX3NhdmVfaW5pdF9mcHUob2xkKSkKLQkJCWNwdSA9IH4wOwotCQlvbGQtPnRocmVhZC5mcHUubGFzdF9jcHUgPSBjcHU7Ci0JCW9sZC0+dGhyZWFkLmZwdS5oYXNfZnB1ID0gMDsJLyogQnV0IGxlYXZlIGZwdV9vd25lcl90YXNrISAqLworCQkJdGFza19kaXNhYmxlX2xhenlfZnB1X3Jlc3RvcmUob2xkKTsKKwkJZWxzZQorCQkJb2xkLT50aHJlYWQuZnB1Lmxhc3RfY3B1ID0gY3B1OworCisJCS8qIEJ1dCBsZWF2ZSBmcHVfb3duZXJfdGFzayEgKi8KKwkJb2xkLT50aHJlYWQuZnB1Lmhhc19mcHUgPSAwOwogCiAJCS8qIERvbid0IGNoYW5nZSBDUjAuVFMgaWYgd2UganVzdCBzd2l0Y2ghICovCiAJCWlmIChmcHUucHJlbG9hZCkgewpAQCAtNDQzLDEwICs0NjEsMTAgQEAKIAkJCXN0dHMoKTsKIAl9IGVsc2UgewogCQlvbGQtPnRocmVhZC5mcHVfY291bnRlciA9IDA7Ci0JCW9sZC0+dGhyZWFkLmZwdS5sYXN0X2NwdSA9IH4wOworCQl0YXNrX2Rpc2FibGVfbGF6eV9mcHVfcmVzdG9yZShvbGQpOwogCQlpZiAoZnB1LnByZWxvYWQpIHsKIAkJCW5ldy0+dGhyZWFkLmZwdV9jb3VudGVyKys7Ci0JCQlpZiAoIXVzZV9lYWdlcl9mcHUoKSAmJiBmcHVfbGF6eV9yZXN0b3JlKG5ldywgY3B1KSkKKwkJCWlmIChmcHVfbGF6eV9yZXN0b3JlKG5ldywgY3B1KSkKIAkJCQlmcHUucHJlbG9hZCA9IDA7CiAJCQllbHNlCiAJCQkJcHJlZmV0Y2gobmV3LT50aHJlYWQuZnB1LnN0YXRlKTsKQEAgLTQ2Niw3ICs0ODQsNyBAQAogewogCWlmIChmcHUucHJlbG9hZCkgewogCQlpZiAodW5saWtlbHkocmVzdG9yZV9mcHVfY2hlY2tpbmcobmV3KSkpCi0JCQlkcm9wX2luaXRfZnB1KG5ldyk7CisJCQlmcHVfcmVzZXRfc3RhdGUobmV3KTsKIAl9CiB9CiAKQEAgLTQ5NSwxMCArNTEzLDEyIEBACiB9CiAKIC8qCi0gKiBOZWVkIHRvIGJlIHByZWVtcHRpb24tc2FmZS4KKyAqIE5lZWRzIHRvIGJlIHByZWVtcHRpb24tc2FmZS4KICAqCiAgKiBOT1RFISB1c2VyX2ZwdV9iZWdpbigpIG11c3QgYmUgdXNlZCBvbmx5IGltbWVkaWF0ZWx5IGJlZm9yZSByZXN0b3JpbmcKLSAqIGl0LiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGRvIGFueSBzYXZlL3Jlc3RvcmUgb24gdGhlaXIgb3duLgorICogdGhlIHNhdmUgc3RhdGUuIEl0IGRvZXMgbm90IGRvIGFueSBzYXZpbmcvcmVzdG9yaW5nIG9uIGl0cyBvd24uIEluCisgKiBsYXp5IEZQVSBtb2RlLCBpdCBpcyBqdXN0IGFuIG9wdGltaXphdGlvbiB0byBhdm9pZCBhICNOTSBleGNlcHRpb24sCisgKiB0aGUgdGFzayBjYW4gbG9zZSB0aGUgRlBVIHJpZ2h0IGFmdGVyIHByZWVtcHRfZW5hYmxlKCkuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2VyX2ZwdV9iZWdpbih2b2lkKQogewpAQCAtNTIwLDI0ICs1NDAsNiBAQAogfQogCiAvKgotICogVGhlc2UgZGlzYWJsZSBwcmVlbXB0aW9uIG9uIHRoZWlyIG93biBhbmQgYXJlIHNhZmUKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHNhdmVfaW5pdF9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JV0FSTl9PTl9PTkNFKCFfX3RocmVhZF9oYXNfZnB1KHRzaykpOwotCi0JaWYgKHVzZV9lYWdlcl9mcHUoKSkgewotCQlfX3NhdmVfZnB1KHRzayk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcmVlbXB0X2Rpc2FibGUoKTsKLQlfX3NhdmVfaW5pdF9mcHUodHNrKTsKLQlfX3RocmVhZF9mcHVfZW5kKHRzayk7Ci0JcHJlZW1wdF9lbmFibGUoKTsKLX0KLQotLyoKICAqIGkzODcgc3RhdGUgaW50ZXJhY3Rpb24KICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBnZXRfZnB1X2N3ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h3X2lycS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaHdfaXJxLmgKaW5kZXggOTY2MjI5MC4uZTk1NzFkZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaHdfaXJxLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaHdfaXJxLmgKQEAgLTE4MSwxMCArMTgxLDkgQEAKIGV4dGVybiBfX3Zpc2libGUgdm9pZCBzbXBfaW52YWxpZGF0ZV9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKik7CiAjZW5kaWYKIAotZXh0ZXJuIHZvaWQgKCpfX2luaXRjb25zdCBpbnRlcnJ1cHRbRklSU1RfU1lTVEVNX1ZFQ1RPUgotCQkJCSAgICAtIEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUl0pKHZvaWQpOworZXh0ZXJuIGNoYXIgaXJxX2VudHJpZXNfc3RhcnRbXTsKICNpZmRlZiBDT05GSUdfVFJBQ0lORwotI2RlZmluZSB0cmFjZV9pbnRlcnJ1cHQgaW50ZXJydXB0CisjZGVmaW5lIHRyYWNlX2lycV9lbnRyaWVzX3N0YXJ0IGlycV9lbnRyaWVzX3N0YXJ0CiAjZW5kaWYKIAogI2RlZmluZSBWRUNUT1JfVU5ERUZJTkVECSgtMSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2luc24uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2luc24uaAppbmRleCA0N2YyOWIxLi5lNzgxNGI3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnNuLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW5zbi5oCkBAIC02OSw3ICs2OSw3IEBACiAJY29uc3QgaW5zbl9ieXRlX3QgKm5leHRfYnl0ZTsKIH07CiAKLSNkZWZpbmUgTUFYX0lOU05fU0laRQkxNgorI2RlZmluZSBNQVhfSU5TTl9TSVpFCTE1CiAKICNkZWZpbmUgWDg2X01PRFJNX01PRChtb2RybSkgKCgobW9kcm0pICYgMHhjMCkgPj4gNikKICNkZWZpbmUgWDg2X01PRFJNX1JFRyhtb2RybSkgKCgobW9kcm0pICYgMHgzOCkgPj4gMykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvbW11X3RhYmxlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pb21tdV90YWJsZS5oCmluZGV4IGY0MmEwNDcuLmUzN2Q2YjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvbW11X3RhYmxlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW9tbXVfdGFibGUuaApAQCAtNzksMTEgKzc5LDEyIEBACiAgKiAgZCkuIFNpbWlsYXIgdG8gdGhlICdpbml0JywgZXhjZXB0IHRoYXQgdGhpcyBnZXRzIGNhbGxlZCBmcm9tIHBjaV9pb21tdV9pbml0CiAgKiAgICAgIHdoZXJlIHdlIGRvIGhhdmUgYSBtZW1vcnkgYWxsb2NhdG9yLgogICoKLSAqIFRoZSBzdGFuZGFyZCB2cyB0aGUgX0ZJTklTSCBkaWZmZXJzIGluIHRoYXQgdGhlIF9GSU5JU0ggdmFyaWFudCB3aWxsCi0gKiBjb250aW51ZSBkZXRlY3Rpbmcgb3RoZXIgSU9NTVVzIGluIHRoZSBjYWxsIGxpc3QgYWZ0ZXIgdGhlCi0gKiB0aGUgZGV0ZWN0aW9uIHJvdXRpbmUgcmV0dXJucyBhIHBvc2l0aXZlIG51bWJlci4gVGhlIF9GSU5JU0ggd2lsbAotICogc3RvcCB0aGUgZXhlY3V0aW9uIGNoYWluLiBCb3RoIHdpbGwgc3RpbGwgY2FsbCB0aGUgJ2luaXQnIGFuZAotICogJ2xhdGVfaW5pdCcgZnVuY3Rpb25zIGlmIHRoZXkgYXJlIHNldC4KKyAqIFRoZSBzdGFuZGFyZCBJT01NVV9JTklUIGRpZmZlcnMgZnJvbSB0aGUgSU9NTVVfSU5JVF9GSU5JU0ggdmFyaWFudAorICogaW4gdGhhdCB0aGUgZm9ybWVyIHdpbGwgY29udGludWUgZGV0ZWN0aW5nIG90aGVyIElPTU1VcyBpbiB0aGUgY2FsbAorICogbGlzdCBhZnRlciB0aGUgZGV0ZWN0aW9uIHJvdXRpbmUgcmV0dXJucyBhIHBvc2l0aXZlIG51bWJlciwgd2hpbGUgdGhlCisgKiBsYXR0ZXIgd2lsbCBzdG9wIHRoZSBleGVjdXRpb24gY2hhaW4gdXBvbiBmaXJzdCBzdWNjZXNzZnVsIGRldGVjdGlvbi4KKyAqIEJvdGggdmFyaWFudHMgd2lsbCBzdGlsbCBjYWxsIHRoZSAnaW5pdCcgYW5kICdsYXRlX2luaXQnIGZ1bmN0aW9ucyBpZgorICogdGhleSBhcmUgc2V0LgogICovCiAjZGVmaW5lIElPTU1VX0lOSVRfRklOSVNIKF9kZXRlY3QsIF9kZXBlbmQsIF9pbml0LCBfbGF0ZV9pbml0KQkJXAogCV9fSU9NTVVfSU5JVChfZGV0ZWN0LCBfZGVwZW5kLCBfaW5pdCwgX2xhdGVfaW5pdCwgMSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycWZsYWdzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFmbGFncy5oCmluZGV4IDBhOGI1MTkuLmI3N2Y1ZWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycWZsYWdzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxZmxhZ3MuaApAQCAtMTM2LDEwICsxMzYsNiBAQAogI2RlZmluZSBVU0VSR1NfU1lTUkVUMzIJCQkJXAogCXN3YXBnczsJCQkJCVwKIAlzeXNyZXRsCi0jZGVmaW5lIEVOQUJMRV9JTlRFUlJVUFRTX1NZU0VYSVQzMgkJXAotCXN3YXBnczsJCQkJCVwKLQlzdGk7CQkJCQlcCi0Jc3lzZXhpdAogCiAjZWxzZQogI2RlZmluZSBJTlRFUlJVUFRfUkVUVVJOCQlpcmV0CkBAIC0xNjMsMzMgKzE1OSw5IEBACiAKIAlyZXR1cm4gYXJjaF9pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKTsKIH0KKyNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKLSNlbHNlCi0KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0jZGVmaW5lIEFSQ0hfTE9DS0RFUF9TWVNfRVhJVAkJY2FsbCBsb2NrZGVwX3N5c19leGl0X3RodW5rCi0jZGVmaW5lIEFSQ0hfTE9DS0RFUF9TWVNfRVhJVF9JUlEJXAotCVRSQUNFX0lSUVNfT047IFwKLQlzdGk7IFwKLQlTQVZFX1JFU1Q7IFwKLQlMT0NLREVQX1NZU19FWElUOyBcCi0JUkVTVE9SRV9SRVNUOyBcCi0JY2xpOyBcCi0JVFJBQ0VfSVJRU19PRkY7Ci0KLSNlbHNlCi0jZGVmaW5lIEFSQ0hfTE9DS0RFUF9TWVNfRVhJVAkJCVwKLQlwdXNobCAlZWF4OwkJCQlcCi0JcHVzaGwgJWVjeDsJCQkJXAotCXB1c2hsICVlZHg7CQkJCVwKLQljYWxsIGxvY2tkZXBfc3lzX2V4aXQ7CQkJXAotCXBvcGwgJWVkeDsJCQkJXAotCXBvcGwgJWVjeDsJCQkJXAotCXBvcGwgJWVheDsKLQotI2RlZmluZSBBUkNIX0xPQ0tERVBfU1lTX0VYSVRfSVJRCi0jZW5kaWYKLQorI2lmZGVmIF9fQVNTRU1CTFlfXwogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwogIyAgZGVmaW5lIFRSQUNFX0lSUVNfT04JCWNhbGwgdHJhY2VfaGFyZGlycXNfb25fdGh1bms7CiAjICBkZWZpbmUgVFJBQ0VfSVJRU19PRkYJY2FsbCB0cmFjZV9oYXJkaXJxc19vZmZfdGh1bms7CkBAIC0xOTgsMTIgKzE3MCwyOSBAQAogIyAgZGVmaW5lIFRSQUNFX0lSUVNfT0ZGCiAjZW5kaWYKICNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQwotIyAgZGVmaW5lIExPQ0tERVBfU1lTX0VYSVQJQVJDSF9MT0NLREVQX1NZU19FWElUCi0jICBkZWZpbmUgTE9DS0RFUF9TWVNfRVhJVF9JUlEJQVJDSF9MT0NLREVQX1NZU19FWElUX0lSUQotIyBlbHNlCisjICBpZmRlZiBDT05GSUdfWDg2XzY0CisjICAgIGRlZmluZSBMT0NLREVQX1NZU19FWElUCQljYWxsIGxvY2tkZXBfc3lzX2V4aXRfdGh1bmsKKyMgICAgZGVmaW5lIExPQ0tERVBfU1lTX0VYSVRfSVJRIFwKKwlUUkFDRV9JUlFTX09OOyBcCisJc3RpOyBcCisJY2FsbCBsb2NrZGVwX3N5c19leGl0X3RodW5rOyBcCisJY2xpOyBcCisJVFJBQ0VfSVJRU19PRkY7CisjICBlbHNlCisjICAgIGRlZmluZSBMT0NLREVQX1NZU19FWElUIFwKKwlwdXNobCAlZWF4OwkJCQlcCisJcHVzaGwgJWVjeDsJCQkJXAorCXB1c2hsICVlZHg7CQkJCVwKKwljYWxsIGxvY2tkZXBfc3lzX2V4aXQ7CQkJXAorCXBvcGwgJWVkeDsJCQkJXAorCXBvcGwgJWVjeDsJCQkJXAorCXBvcGwgJWVheDsKKyMgICAgZGVmaW5lIExPQ0tERVBfU1lTX0VYSVRfSVJRCisjICBlbmRpZgorI2Vsc2UKICMgIGRlZmluZSBMT0NLREVQX1NZU19FWElUCiAjICBkZWZpbmUgTE9DS0RFUF9TWVNfRVhJVF9JUlEKLSMgZW5kaWYKLQorI2VuZGlmCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vanVtcF9sYWJlbC5oCmluZGV4IDZhMmNlZmIuLmE0YzFjZjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2p1bXBfbGFiZWwuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9qdW1wX2xhYmVsLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9BU01fWDg2X0pVTVBfTEFCRUxfSAogI2RlZmluZSBfQVNNX1g4Nl9KVU1QX0xBQkVMX0gKIAotI2lmZGVmIF9fS0VSTkVMX18KKyNpZm5kZWYgX19BU1NFTUJMWV9fCiAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMzAsOCArMzAsNiBAQAogCXJldHVybiB0cnVlOwogfQogCi0jZW5kaWYgLyogX19LRVJORUxfXyAqLwotCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogdHlwZWRlZiB1NjQganVtcF9sYWJlbF90OwogI2Vsc2UKQEAgLTQ0LDQgKzQyLDUgQEAKIAlqdW1wX2xhYmVsX3Qga2V5OwogfTsKIAorI2VuZGlmICAvKiBfX0FTU0VNQkxZX18gKi8KICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKaW5kZXggYTIzNmUzOS4uZGVhMmU3ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX2hvc3QuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1faG9zdC5oCkBAIC04MSwxMSArODEsNiBAQAogCQkoYmFzZV9nZm4gPj4gS1ZNX0hQQUdFX0dGTl9TSElGVChsZXZlbCkpOwogfQogCi0jZGVmaW5lIFNFTEVDVE9SX1RJX01BU0sgKDEgPDwgMikKLSNkZWZpbmUgU0VMRUNUT1JfUlBMX01BU0sgMHgwMwotCi0jZGVmaW5lIElPUExfU0hJRlQgMTIKLQogI2RlZmluZSBLVk1fUEVSTUlMTEVfTU1VX1BBR0VTIDIwCiAjZGVmaW5lIEtWTV9NSU5fQUxMT0NfTU1VX1BBR0VTIDY0CiAjZGVmaW5lIEtWTV9NTVVfSEFTSF9TSElGVCAxMApAQCAtMzQ1LDYgKzM0MCw3IEBACiBlbnVtIHsKIAlLVk1fREVCVUdSRUdfQlBfRU5BQkxFRCA9IDEsCiAJS1ZNX0RFQlVHUkVHX1dPTlRfRVhJVCA9IDIsCisJS1ZNX0RFQlVHUkVHX1JFTE9BRCA9IDQsCiB9OwogCiBzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCB7CkBAIC00MzEsNiArNDI3LDkgQEAKIAogCWludCBjcHVpZF9uZW50OwogCXN0cnVjdCBrdm1fY3B1aWRfZW50cnkyIGNwdWlkX2VudHJpZXNbS1ZNX01BWF9DUFVJRF9FTlRSSUVTXTsKKworCWludCBtYXhwaHlhZGRyOworCiAJLyogZW11bGF0ZSBjb250ZXh0ICovCiAKIAlzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCBlbXVsYXRlX2N0eHQ7CkBAIC01NTAsMTEgKzU0OSwyMCBAQAogCXN0cnVjdCBrdm1fbHBhZ2VfaW5mbyAqbHBhZ2VfaW5mb1tLVk1fTlJfUEFHRV9TSVpFUyAtIDFdOwogfTsKIAorLyoKKyAqIFdlIHVzZSBhcyB0aGUgbW9kZSB0aGUgbnVtYmVyIG9mIGJpdHMgYWxsb2NhdGVkIGluIHRoZSBMRFIgZm9yIHRoZQorICogbG9naWNhbCBwcm9jZXNzb3IgSUQuICBJdCBoYXBwZW5zIHRoYXQgdGhlc2UgYXJlIGFsbCBwb3dlcnMgb2YgdHdvLgorICogVGhpcyBtYWtlcyBpdCBpcyB2ZXJ5IGVhc3kgdG8gZGV0ZWN0IGNhc2VzIHdoZXJlIHRoZSBBUElDcyBhcmUKKyAqIGNvbmZpZ3VyZWQgZm9yIG11bHRpcGxlIG1vZGVzOyBpbiB0aGF0IGNhc2UsIHdlIGNhbm5vdCB1c2UgdGhlIG1hcCBhbmQKKyAqIGhlbmNlIGNhbm5vdCB1c2Uga3ZtX2lycV9kZWxpdmVyeV90b19hcGljX2Zhc3QgZWl0aGVyLgorICovCisjZGVmaW5lIEtWTV9BUElDX01PREVfWEFQSUNfQ0xVU1RFUiAgICAgICAgICA0CisjZGVmaW5lIEtWTV9BUElDX01PREVfWEFQSUNfRkxBVCAgICAgICAgICAgICA4CisjZGVmaW5lIEtWTV9BUElDX01PREVfWDJBUElDICAgICAgICAgICAgICAgIDE2CisKIHN0cnVjdCBrdm1fYXBpY19tYXAgewogCXN0cnVjdCByY3VfaGVhZCByY3U7Ci0JdTggbGRyX2JpdHM7Ci0JLyogZmllbGRzIGJlbGxvdyBhcmUgdXNlZCB0byBkZWNvZGUgbGRyIHZhbHVlcyBpbiBkaWZmZXJlbnQgbW9kZXMgKi8KLQl1MzIgY2lkX3NoaWZ0LCBjaWRfbWFzaywgbGlkX21hc2ssIGJyb2FkY2FzdDsKKwl1OCBtb2RlOwogCXN0cnVjdCBrdm1fbGFwaWMgKnBoeXNfbWFwWzI1Nl07CiAJLyogZmlyc3QgaW5kZXggaXMgY2x1c3RlciBpZCBzZWNvbmQgaXMgY3B1IGlkIGluIGEgY2x1c3RlciAqLwogCXN0cnVjdCBrdm1fbGFwaWMgKmxvZ2ljYWxfbWFwWzE2XVsxNl07CkBAIC04NTksNiArODY3LDggQEAKIHZvaWQga3ZtX21tdV9yZXNldF9jb250ZXh0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiB2b2lkIGt2bV9tbXVfc2xvdF9yZW1vdmVfd3JpdGVfYWNjZXNzKHN0cnVjdCBrdm0gKmt2bSwKIAkJCQkgICAgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90KTsKK3ZvaWQga3ZtX21tdV96YXBfY29sbGFwc2libGVfc3B0ZXMoc3RydWN0IGt2bSAqa3ZtLAorCQkJCQlzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90KTsKIHZvaWQga3ZtX21tdV9zbG90X2xlYWZfY2xlYXJfZGlydHkoc3RydWN0IGt2bSAqa3ZtLAogCQkJCSAgIHN0cnVjdCBrdm1fbWVtb3J5X3Nsb3QgKm1lbXNsb3QpOwogdm9pZCBrdm1fbW11X3Nsb3RfbGFyZ2VwYWdlX3JlbW92ZV93cml0ZV9hY2Nlc3Moc3RydWN0IGt2bSAqa3ZtLApAQCAtOTMzLDYgKzk0Myw3IEBACiBpbnQga3ZtX2Zhc3RfcGlvX291dChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBzaXplLCB1bnNpZ25lZCBzaG9ydCBwb3J0KTsKIHZvaWQga3ZtX2VtdWxhdGVfY3B1aWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGludCBrdm1fZW11bGF0ZV9oYWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CitpbnQga3ZtX3ZjcHVfaGFsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogaW50IGt2bV9lbXVsYXRlX3diaW52ZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCiB2b2lkIGt2bV9nZXRfc2VnbWVudChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fc2VnbWVudCAqdmFyLCBpbnQgc2VnKTsKQEAgLTExMjgsNyArMTEzOSw2IEBACiBpbnQga3ZtX2FnZV9odmEoc3RydWN0IGt2bSAqa3ZtLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiBpbnQga3ZtX3Rlc3RfYWdlX2h2YShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgaHZhKTsKIHZvaWQga3ZtX3NldF9zcHRlX2h2YShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgaHZhLCBwdGVfdCBwdGUpOwotaW50IGNwdWlkX21heHBoeWFkZHIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGludCBrdm1fY3B1X2hhc19pbmplY3RhYmxlX2ludHIoc3RydWN0IGt2bV92Y3B1ICp2KTsKIGludCBrdm1fY3B1X2hhc19pbnRlcnJ1cHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIGludCBrdm1fYXJjaF9pbnRlcnJ1cHRfYWxsb3dlZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX3BhcmEuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2t2bV9wYXJhLmgKaW5kZXggZTYyY2Y4OS4uYzFhZGYzMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20va3ZtX3BhcmEuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rdm1fcGFyYS5oCkBAIC0xMTUsNyArMTE1LDcgQEAKIAogc3RhdGljIGlubGluZSBib29sIGt2bV9wYXJhX2F2YWlsYWJsZSh2b2lkKQogewotCXJldHVybiAwOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQga3ZtX2FyY2hfcGFyYV9mZWF0dXJlcyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbGl2ZXBhdGNoLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9saXZlcGF0Y2guaAppbmRleCBhNDU1YTUzLi4yZDI5MTk3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9saXZlcGF0Y2guaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9saXZlcGF0Y2guaApAQCAtMzIsOCArMzIsOCBAQAogI2VuZGlmCiAJcmV0dXJuIDA7CiB9Ci1leHRlcm4gaW50IGtscF93cml0ZV9tb2R1bGVfcmVsb2Moc3RydWN0IG1vZHVsZSAqbW9kLCB1bnNpZ25lZCBsb25nIHR5cGUsCi0JCQkJICB1bnNpZ25lZCBsb25nIGxvYywgdW5zaWduZWQgbG9uZyB2YWx1ZSk7CitpbnQga2xwX3dyaXRlX21vZHVsZV9yZWxvYyhzdHJ1Y3QgbW9kdWxlICptb2QsIHVuc2lnbmVkIGxvbmcgdHlwZSwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgbG9jLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGtscF9hcmNoX3NldF9wYyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgdW5zaWduZWQgbG9uZyBpcCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21jZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmgKaW5kZXggOWIzZGU5OS4uMWY1YTg2ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmgKQEAgLTExNiw2ICsxMTYsMTIgQEAKIAl1MzIgcmlwX21zcjsKIH07CiAKK3N0cnVjdCBtY2VfdmVuZG9yX2ZsYWdzIHsKKwlfX3U2NAkJb3ZlcmZsb3dfcmVjb3YJOiAxLCAvKiBjcHVpZF9lYngoODAwMDAwMDcpICovCisJCQlfX3Jlc2VydmVkXzAJOiA2MzsKK307CitleHRlcm4gc3RydWN0IG1jZV92ZW5kb3JfZmxhZ3MgbWNlX2ZsYWdzOworCiBleHRlcm4gc3RydWN0IG1jYV9jb25maWcgbWNhX2NmZzsKIGV4dGVybiB2b2lkIG1jZV9yZWdpc3Rlcl9kZWNvZGVfY2hhaW4oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiBleHRlcm4gdm9pZCBtY2VfdW5yZWdpc3Rlcl9kZWNvZGVfY2hhaW4oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CkBAIC0xMjgsOSArMTM0LDExIEBACiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKIGludCBtY2hlY2tfaW5pdCh2b2lkKTsKIHZvaWQgbWNoZWNrX2NwdV9pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7Cit2b2lkIG1jaGVja192ZW5kb3JfaW5pdF9zZXZlcml0eSh2b2lkKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBtY2hlY2tfaW5pdCh2b2lkKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgbWNoZWNrX2NwdV9pbml0KHN0cnVjdCBjcHVpbmZvX3g4NiAqYykge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtY2hlY2tfdmVuZG9yX2luaXRfc2V2ZXJpdHkodm9pZCkge30KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl9BTkNJRU5UX01DRQpAQCAtMTgzLDExICsxOTEsMTEgQEAKIERFQ0xBUkVfUEVSX0NQVShtY2VfYmFua3NfdCwgbWNlX3BvbGxfYmFua3MpOwogCiBlbnVtIG1jcF9mbGFncyB7Ci0JTUNQX1RJTUVTVEFNUCA9ICgxIDw8IDApLAkvKiBsb2cgdGltZSBzdGFtcCAqLwotCU1DUF9VQyA9ICgxIDw8IDEpLAkJLyogbG9nIHVuY29ycmVjdGVkIGVycm9ycyAqLwotCU1DUF9ET05UTE9HID0gKDEgPDwgMiksCQkvKiBvbmx5IGNsZWFyLCBkb24ndCBsb2cgKi8KKwlNQ1BfVElNRVNUQU1QCT0gQklUKDApLAkvKiBsb2cgdGltZSBzdGFtcCAqLworCU1DUF9VQwkJPSBCSVQoMSksCS8qIGxvZyB1bmNvcnJlY3RlZCBlcnJvcnMgKi8KKwlNQ1BfRE9OVExPRwk9IEJJVCgyKSwJLyogb25seSBjbGVhciwgZG9uJ3QgbG9nICovCiB9Owotdm9pZCBtYWNoaW5lX2NoZWNrX3BvbGwoZW51bSBtY3BfZmxhZ3MgZmxhZ3MsIG1jZV9iYW5rc190ICpiKTsKK2Jvb2wgbWFjaGluZV9jaGVja19wb2xsKGVudW0gbWNwX2ZsYWdzIGZsYWdzLCBtY2VfYmFua3NfdCAqYik7CiAKIGludCBtY2Vfbm90aWZ5X2lycSh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWljcm9jb2RlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9taWNyb2NvZGUuaAppbmRleCAyMDFiNTIwLi4yZmIyMGQ2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9taWNyb2NvZGUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9taWNyb2NvZGUuaApAQCAtNzUsNiArNzUsNzkgQEAKIAogI2lmZGVmIENPTkZJR19NSUNST0NPREVfRUFSTFkKICNkZWZpbmUgTUFYX1VDT0RFX0NPVU5UIDEyOAorCisjZGVmaW5lIFFDSEFSKGEsIGIsIGMsIGQpICgoYSkgKyAoKGIpIDw8IDgpICsgKChjKSA8PCAxNikgKyAoKGQpIDw8IDI0KSkKKyNkZWZpbmUgQ1BVSURfSU5URUwxIFFDSEFSKCdHJywgJ2UnLCAnbicsICd1JykKKyNkZWZpbmUgQ1BVSURfSU5URUwyIFFDSEFSKCdpJywgJ24nLCAnZScsICdJJykKKyNkZWZpbmUgQ1BVSURfSU5URUwzIFFDSEFSKCduJywgJ3QnLCAnZScsICdsJykKKyNkZWZpbmUgQ1BVSURfQU1EMSBRQ0hBUignQScsICd1JywgJ3QnLCAnaCcpCisjZGVmaW5lIENQVUlEX0FNRDIgUUNIQVIoJ2UnLCAnbicsICd0JywgJ2knKQorI2RlZmluZSBDUFVJRF9BTUQzIFFDSEFSKCdjJywgJ0EnLCAnTScsICdEJykKKworI2RlZmluZSBDUFVJRF9JUyhhLCBiLCBjLCBlYngsIGVjeCwgZWR4KQlcCisJCSghKChlYnggXiAoYSkpfChlZHggXiAoYikpfChlY3ggXiAoYykpKSkKKworLyoKKyAqIEluIGVhcmx5IGxvYWRpbmcgbWljcm9jb2RlIHBoYXNlIG9uIEJTUCwgYm9vdF9jcHVfZGF0YSBpcyBub3Qgc2V0IHVwIHlldC4KKyAqIHg4Nl92ZW5kb3IoKSBnZXRzIHZlbmRvciBpZCBmb3IgQlNQLgorICoKKyAqIEluIDMyIGJpdCBBUCBjYXNlLCBhY2Nlc3NpbmcgYm9vdF9jcHVfZGF0YSBuZWVkcyBsaW5lYXIgYWRkcmVzcy4gVG8gc2ltcGxpZnkKKyAqIGNvZGluZywgd2Ugc3RpbGwgdXNlIHg4Nl92ZW5kb3IoKSB0byBnZXQgdmVuZG9yIGlkIGZvciBBUC4KKyAqCisgKiB4ODZfdmVuZG9yKCkgZ2V0cyB2ZW5kb3IgaW5mb3JtYXRpb24gZGlyZWN0bHkgZnJvbSBDUFVJRC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgeDg2X3ZlbmRvcih2b2lkKQoreworCXUzMiBlYXggPSAweDAwMDAwMDAwOworCXUzMiBlYngsIGVjeCA9IDAsIGVkeDsKKworCW5hdGl2ZV9jcHVpZCgmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKworCWlmIChDUFVJRF9JUyhDUFVJRF9JTlRFTDEsIENQVUlEX0lOVEVMMiwgQ1BVSURfSU5URUwzLCBlYngsIGVjeCwgZWR4KSkKKwkJcmV0dXJuIFg4Nl9WRU5ET1JfSU5URUw7CisKKwlpZiAoQ1BVSURfSVMoQ1BVSURfQU1EMSwgQ1BVSURfQU1EMiwgQ1BVSURfQU1EMywgZWJ4LCBlY3gsIGVkeCkpCisJCXJldHVybiBYODZfVkVORE9SX0FNRDsKKworCXJldHVybiBYODZfVkVORE9SX1VOS05PV047Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IF9feDg2X2ZhbWlseSh1bnNpZ25lZCBpbnQgc2lnKQoreworCXVuc2lnbmVkIGludCB4ODY7CisKKwl4ODYgPSAoc2lnID4+IDgpICYgMHhmOworCisJaWYgKHg4NiA9PSAweGYpCisJCXg4NiArPSAoc2lnID4+IDIwKSAmIDB4ZmY7CisKKwlyZXR1cm4geDg2OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB4ODZfZmFtaWx5KHZvaWQpCit7CisJdTMyIGVheCA9IDB4MDAwMDAwMDE7CisJdTMyIGVieCwgZWN4ID0gMCwgZWR4OworCisJbmF0aXZlX2NwdWlkKCZlYXgsICZlYngsICZlY3gsICZlZHgpOworCisJcmV0dXJuIF9feDg2X2ZhbWlseShlYXgpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB4ODZfbW9kZWwodW5zaWduZWQgaW50IHNpZykKK3sKKwl1bnNpZ25lZCBpbnQgeDg2LCBtb2RlbDsKKworCXg4NiA9IF9feDg2X2ZhbWlseShzaWcpOworCisJbW9kZWwgPSAoc2lnID4+IDQpICYgMHhmOworCisJaWYgKHg4NiA9PSAweDYgfHwgeDg2ID09IDB4ZikKKwkJbW9kZWwgKz0gKChzaWcgPj4gMTYpICYgMHhmKSA8PCA0OworCisJcmV0dXJuIG1vZGVsOworfQorCiBleHRlcm4gdm9pZCBfX2luaXQgbG9hZF91Y29kZV9ic3Aodm9pZCk7CiBleHRlcm4gdm9pZCBsb2FkX3Vjb2RlX2FwKHZvaWQpOwogZXh0ZXJuIGludCBfX2luaXQgc2F2ZV9taWNyb2NvZGVfaW5faW5pdHJkKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWljcm9jb2RlX2ludGVsLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9taWNyb2NvZGVfaW50ZWwuaAppbmRleCBkZDRjMjAwLi4yYjkyMDljIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9taWNyb2NvZGVfaW50ZWwuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9taWNyb2NvZGVfaW50ZWwuaApAQCAtNTYsMTIgKzU2LDE1IEBACiAKICNkZWZpbmUgZXh0dGFibGVfc2l6ZShldCkgKChldCktPmNvdW50ICogRVhUX1NJR05BVFVSRV9TSVpFICsgRVhUX0hFQURFUl9TSVpFKQogCi1leHRlcm4gaW50Ci1nZXRfbWF0Y2hpbmdfbWljcm9jb2RlKHVuc2lnbmVkIGludCBjc2lnLCBpbnQgY3BmLCB2b2lkICptYywgaW50IHJldik7CitleHRlcm4gaW50IGdldF9tYXRjaGluZ19taWNyb2NvZGUodW5zaWduZWQgaW50IGNzaWcsIGludCBjcGYsIGludCByZXYsIHZvaWQgKm1jKTsKIGV4dGVybiBpbnQgbWljcm9jb2RlX3Nhbml0eV9jaGVjayh2b2lkICptYywgaW50IHByaW50X2Vycik7Ci1leHRlcm4gaW50IGdldF9tYXRjaGluZ19zaWcodW5zaWduZWQgaW50IGNzaWcsIGludCBjcGYsIHZvaWQgKm1jLCBpbnQgcmV2KTsKLWV4dGVybiBpbnQKLXVwZGF0ZV9tYXRjaF9yZXZpc2lvbihzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9pbnRlbCAqbWNfaGVhZGVyLCBpbnQgcmV2KTsKK2V4dGVybiBpbnQgZ2V0X21hdGNoaW5nX3NpZyh1bnNpZ25lZCBpbnQgY3NpZywgaW50IGNwZiwgaW50IHJldiwgdm9pZCAqbWMpOworCitzdGF0aWMgaW5saW5lIGludAorcmV2aXNpb25faXNfbmV3ZXIoc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfaW50ZWwgKm1jX2hlYWRlciwgaW50IHJldikKK3sKKwlyZXR1cm4gKG1jX2hlYWRlci0+cmV2IDw9IHJldikgPyAwIDogMTsKK30KIAogI2lmZGVmIENPTkZJR19NSUNST0NPREVfSU5URUxfRUFSTFkKIGV4dGVybiB2b2lkIF9faW5pdCBsb2FkX3Vjb2RlX2ludGVsX2JzcCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL213YWl0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9td2FpdC5oCmluZGV4IGExNDEwZGIuLjY1M2RmYTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL213YWl0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbXdhaXQuaApAQCAtMzAsNiArMzAsMTQgQEAKIAkJICAgICA6OiAiYSIgKGVheCksICJjIiAoZWN4KSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N0aV9td2FpdCh1bnNpZ25lZCBsb25nIGVheCwgdW5zaWduZWQgbG9uZyBlY3gpCit7CisJdHJhY2VfaGFyZGlycXNfb24oKTsKKwkvKiAibXdhaXQgJWVheCwgJWVjeDsiICovCisJYXNtIHZvbGF0aWxlKCJzdGk7IC5ieXRlIDB4MGYsIDB4MDEsIDB4Yzk7IgorCQkgICAgIDo6ICJhIiAoZWF4KSwgImMiIChlY3gpKTsKK30KKwogLyoKICAqIFRoaXMgdXNlcyBuZXcgTU9OSVRPUi9NV0FJVCBpbnN0cnVjdGlvbnMgb24gUDQgcHJvY2Vzc29ycyB3aXRoIFBOSSwKICAqIHdoaWNoIGNhbiBvYnZpYXRlIElQSSB0byB0cmlnZ2VyIGNoZWNraW5nIG9mIG5lZWRfcmVzY2hlZC4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhZ2VfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhZ2VfdHlwZXMuaAppbmRleCA5NWUxMWY3Li5jN2M3MTJmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYWdlX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFnZV90eXBlcy5oCkBAIC00MCw4ICs0MCwxMCBAQAogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogI2luY2x1ZGUgPGFzbS9wYWdlXzY0X3R5cGVzLmg+CisjZGVmaW5lIElPUkVNQVBfTUFYX09SREVSICAgICAgIChQVURfU0hJRlQpCiAjZWxzZQogI2luY2x1ZGUgPGFzbS9wYWdlXzMyX3R5cGVzLmg+CisjZGVmaW5lIElPUkVNQVBfTUFYX09SREVSICAgICAgIChQTURfU0hJRlQpCiAjZW5kaWYJLyogQ09ORklHX1g4Nl82NCAqLwogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwpAQCAtNTEsOCArNTMsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWF4X2xvd19wZm5fbWFwcGVkOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWF4X3Bmbl9tYXBwZWQ7CiAKLWV4dGVybiBib29sIGthc2xyX2VuYWJsZWQ7Ci0KIHN0YXRpYyBpbmxpbmUgcGh5c19hZGRyX3QgZ2V0X21heF9tYXBwZWQodm9pZCkKIHsKIAlyZXR1cm4gKHBoeXNfYWRkcl90KW1heF9wZm5fbWFwcGVkIDw8IFBBR0VfU0hJRlQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaAppbmRleCA5NjVjNDdkLi44OTU3ODEwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKQEAgLTU0NSw3ICs1NDUsNyBAQAogCQlQVk9QX1ZDQUxMMihwdl9tbXVfb3BzLnNldF9wbWQsIHBtZHAsIHZhbCk7CiB9CiAKLSNpZiBQQUdFVEFCTEVfTEVWRUxTID49IDMKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPj0gMwogc3RhdGljIGlubGluZSBwbWRfdCBfX3BtZChwbWR2YWxfdCB2YWwpCiB7CiAJcG1kdmFsX3QgcmV0OwpAQCAtNTg1LDcgKzU4NSw3IEBACiAJCVBWT1BfVkNBTEwyKHB2X21tdV9vcHMuc2V0X3B1ZCwgcHVkcCwKIAkJCSAgICB2YWwpOwogfQotI2lmIFBBR0VUQUJMRV9MRVZFTFMgPT0gNAorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0CiBzdGF0aWMgaW5saW5lIHB1ZF90IF9fcHVkKHB1ZHZhbF90IHZhbCkKIHsKIAlwdWR2YWxfdCByZXQ7CkBAIC02MzYsOSArNjM2LDkgQEAKIAlzZXRfcHVkKHB1ZHAsIF9fcHVkKDApKTsKIH0KIAotI2VuZGlmCS8qIFBBR0VUQUJMRV9MRVZFTFMgPT0gNCAqLworI2VuZGlmCS8qIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0ICovCiAKLSNlbmRpZgkvKiBQQUdFVEFCTEVfTEVWRUxTID49IDMgKi8KKyNlbmRpZgkvKiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPj0gMyAqLwogCiAjaWZkZWYgQ09ORklHX1g4Nl9QQUUKIC8qIFNwZWNpYWwtY2FzZSBwdGUtc2V0dGluZyBvcGVyYXRpb25zIGZvciBQQUUsIHdoaWNoIGNhbid0IHVwZGF0ZSBhCkBAIC05NzYsMTEgKzk3Niw2IEBACiAJUEFSQV9TSVRFKFBBUkFfUEFUQ0gocHZfY3B1X29wcywgUFZfQ1BVX3VzZXJnc19zeXNyZXQ2NCksCVwKIAkJICBDTEJSX05PTkUsCQkJCQkJXAogCQkgIGptcCBQQVJBX0lORElSRUNUKHB2X2NwdV9vcHMrUFZfQ1BVX3VzZXJnc19zeXNyZXQ2NCkpCi0KLSNkZWZpbmUgRU5BQkxFX0lOVEVSUlVQVFNfU1lTRVhJVDMyCQkJCQlcCi0JUEFSQV9TSVRFKFBBUkFfUEFUQ0gocHZfY3B1X29wcywgUFZfQ1BVX2lycV9lbmFibGVfc3lzZXhpdCksCVwKLQkJICBDTEJSX05PTkUsCQkJCQkJXAotCQkgIGptcCBQQVJBX0lORElSRUNUKHB2X2NwdV9vcHMrUFZfQ1BVX2lycV9lbmFibGVfc3lzZXhpdCkpCiAjZW5kaWYJLyogQ09ORklHX1g4Nl8zMiAqLwogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnRfdHlwZXMuaAppbmRleCA3NTQ5YjhiLi5mN2IwYjVjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydF90eXBlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0X3R5cGVzLmgKQEAgLTI5NCw3ICsyOTQsNyBAQAogCXN0cnVjdCBwYXJhdmlydF9jYWxsZWVfc2F2ZSBwZ2RfdmFsOwogCXN0cnVjdCBwYXJhdmlydF9jYWxsZWVfc2F2ZSBtYWtlX3BnZDsKIAotI2lmIFBBR0VUQUJMRV9MRVZFTFMgPj0gMworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+PSAzCiAjaWZkZWYgQ09ORklHX1g4Nl9QQUUKIAl2b2lkICgqc2V0X3B0ZV9hdG9taWMpKHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpOwogCXZvaWQgKCpwdGVfY2xlYXIpKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCkBAIC0zMDgsMTMgKzMwOCwxMyBAQAogCXN0cnVjdCBwYXJhdmlydF9jYWxsZWVfc2F2ZSBwbWRfdmFsOwogCXN0cnVjdCBwYXJhdmlydF9jYWxsZWVfc2F2ZSBtYWtlX3BtZDsKIAotI2lmIFBBR0VUQUJMRV9MRVZFTFMgPT0gNAorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0CiAJc3RydWN0IHBhcmF2aXJ0X2NhbGxlZV9zYXZlIHB1ZF92YWw7CiAJc3RydWN0IHBhcmF2aXJ0X2NhbGxlZV9zYXZlIG1ha2VfcHVkOwogCiAJdm9pZCAoKnNldF9wZ2QpKHBnZF90ICpwdWRwLCBwZ2RfdCBwZ2R2YWwpOwotI2VuZGlmCS8qIFBBR0VUQUJMRV9MRVZFTFMgPT0gNCAqLwotI2VuZGlmCS8qIFBBR0VUQUJMRV9MRVZFTFMgPj0gMyAqLworI2VuZGlmCS8qIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0ICovCisjZW5kaWYJLyogQ09ORklHX1BHVEFCTEVfTEVWRUxTID49IDMgKi8KIAogCXN0cnVjdCBwdl9sYXp5X29wcyBsYXp5X21vZGU7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV94ODYuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BjaV94ODYuaAppbmRleCBmYTExOTVkLi4xNjRlM2Y4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wY2lfeDg2LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGNpX3g4Ni5oCkBAIC05Myw2ICs5Myw4IEBACiBleHRlcm4gaW50ICgqcGNpYmlvc19lbmFibGVfaXJxKShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiB2b2lkICgqcGNpYmlvc19kaXNhYmxlX2lycSkoc3RydWN0IHBjaV9kZXYgKmRldik7CiAKK2V4dGVybiBib29sIG1wX3Nob3VsZF9rZWVwX2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCiBzdHJ1Y3QgcGNpX3Jhd19vcHMgewogCWludCAoKnJlYWQpKHVuc2lnbmVkIGludCBkb21haW4sIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKIAkJCQkJCWludCByZWcsIGludCBsZW4sIHUzMiAqdmFsKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BnYWxsb2MuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BnYWxsb2MuaAppbmRleCBjNDQxMmU5Li5iZjdmOGI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGdhbGxvYy5oCkBAIC03Nyw3ICs3Nyw3IEBACiAKICNkZWZpbmUgcG1kX3BndGFibGUocG1kKSBwbWRfcGFnZShwbWQpCiAKLSNpZiBQQUdFVEFCTEVfTEVWRUxTID4gMgorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDIKIHN0YXRpYyBpbmxpbmUgcG1kX3QgKnBtZF9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTExNiw3ICsxMTYsNyBAQAogfQogI2VuZGlmCS8qIENPTkZJR19YODZfUEFFICovCiAKLSNpZiBQQUdFVEFCTEVfTEVWRUxTID4gMworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDMKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZ2RfcG9wdWxhdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QsIHB1ZF90ICpwdWQpCiB7CiAJcGFyYXZpcnRfYWxsb2NfcHVkKG1tLCBfX3BhKHB1ZCkgPj4gUEFHRV9TSElGVCk7CkBAIC0xNDIsNyArMTQyLDcgQEAKIAlfX19wdWRfZnJlZV90bGIodGxiLCBwdWQpOwogfQogCi0jZW5kaWYJLyogUEFHRVRBQkxFX0xFVkVMUyA+IDMgKi8KLSNlbmRpZgkvKiBQQUdFVEFCTEVfTEVWRUxTID4gMiAqLworI2VuZGlmCS8qIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDMgKi8KKyNlbmRpZgkvKiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPiAyICovCiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9QR0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUtMmxldmVsX3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLTJsZXZlbF90eXBlcy5oCmluZGV4IGRhYWNjMjMuLjM5MjU3NjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUtMmxldmVsX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS0ybGV2ZWxfdHlwZXMuaApAQCAtMTcsNyArMTcsNiBAQAogI2VuZGlmCS8qICFfX0FTU0VNQkxZX18gKi8KIAogI2RlZmluZSBTSEFSRURfS0VSTkVMX1BNRAkwCi0jZGVmaW5lIFBBR0VUQUJMRV9MRVZFTFMJMgogCiAvKgogICogdHJhZGl0aW9uYWwgaTM4NiB0d28tbGV2ZWwgcGFnaW5nIHN0cnVjdHVyZToKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUtM2xldmVsX3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLTNsZXZlbF90eXBlcy5oCmluZGV4IDFiZDU4NzYuLmJjYzg5NjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUtM2xldmVsX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS0zbGV2ZWxfdHlwZXMuaApAQCAtMjQsOCArMjQsNiBAQAogI2RlZmluZSBTSEFSRURfS0VSTkVMX1BNRAkxCiAjZW5kaWYKIAotI2RlZmluZSBQQUdFVEFCTEVfTEVWRUxTCTMKLQogLyoKICAqIFBHRElSX1NISUZUIGRldGVybWluZXMgd2hhdCBhIHRvcC1sZXZlbCBwYWdlIHRhYmxlIGVudHJ5IGNhbiBtYXAKICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IGEwYzM1YmYuLmZlNTdlN2EgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTU1MSw3ICs1NTEsNyBAQAogCXJldHVybiBucGcgPj4gKDIwIC0gUEFHRV9TSElGVCk7CiB9CiAKLSNpZiBQQUdFVEFCTEVfTEVWRUxTID4gMgorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDIKIHN0YXRpYyBpbmxpbmUgaW50IHB1ZF9ub25lKHB1ZF90IHB1ZCkKIHsKIAlyZXR1cm4gbmF0aXZlX3B1ZF92YWwocHVkKSA9PSAwOwpAQCAtNTk0LDkgKzU5NCw5IEBACiB7CiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYJLyogUEFHRVRBQkxFX0xFVkVMUyA+IDIgKi8KKyNlbmRpZgkvKiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPiAyICovCiAKLSNpZiBQQUdFVEFCTEVfTEVWRUxTID4gMworI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDMKIHN0YXRpYyBpbmxpbmUgaW50IHBnZF9wcmVzZW50KHBnZF90IHBnZCkKIHsKIAlyZXR1cm4gcGdkX2ZsYWdzKHBnZCkgJiBfUEFHRV9QUkVTRU5UOwpAQCAtNjMzLDcgKzYzMyw3IEBACiB7CiAJcmV0dXJuICFuYXRpdmVfcGdkX3ZhbChwZ2QpOwogfQotI2VuZGlmCS8qIFBBR0VUQUJMRV9MRVZFTFMgPiAzICovCisjZW5kaWYJLyogQ09ORklHX1BHVEFCTEVfTEVWRUxTID4gMyAqLwogCiAjZW5kaWYJLyogX19BU1NFTUJMWV9fICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjRfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjRfdHlwZXMuaAppbmRleCA2MDJiNjAyLi5lNjg0NGRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0X3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NF90eXBlcy5oCkBAIC0yMCw3ICsyMCw2IEBACiAjZW5kaWYJLyogIV9fQVNTRU1CTFlfXyAqLwogCiAjZGVmaW5lIFNIQVJFRF9LRVJORUxfUE1ECTAKLSNkZWZpbmUgUEFHRVRBQkxFX0xFVkVMUwk0CiAKIC8qCiAgKiBQR0RJUl9TSElGVCBkZXRlcm1pbmVzIHdoYXQgYSB0b3AtbGV2ZWwgcGFnZSB0YWJsZSBlbnRyeSBjYW4gbWFwCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmgKaW5kZXggOGM3YzEwOC4uNzhmMGM4YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaApAQCAtMjM0LDcgKzIzNCw3IEBACiAJcmV0dXJuIG5hdGl2ZV9wZ2RfdmFsKHBnZCkgJiBQVEVfRkxBR1NfTUFTSzsKIH0KIAotI2lmIFBBR0VUQUJMRV9MRVZFTFMgPiAzCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID4gMwogdHlwZWRlZiBzdHJ1Y3QgeyBwdWR2YWxfdCBwdWQ7IH0gcHVkX3Q7CiAKIHN0YXRpYyBpbmxpbmUgcHVkX3QgbmF0aXZlX21ha2VfcHVkKHBtZHZhbF90IHZhbCkKQEAgLTI1NSw3ICsyNTUsNyBAQAogfQogI2VuZGlmCiAKLSNpZiBQQUdFVEFCTEVfTEVWRUxTID4gMgorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDIKIHR5cGVkZWYgc3RydWN0IHsgcG1kdmFsX3QgcG1kOyB9IHBtZF90OwogCiBzdGF0aWMgaW5saW5lIHBtZF90IG5hdGl2ZV9tYWtlX3BtZChwbWR2YWxfdCB2YWwpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wbS10cmFjZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcG0tdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjdhYzQyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcG0tdHJhY2UuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9BU01fWDg2X1BNX1RSQUNFX0gKKyNkZWZpbmUgX0FTTV9YODZfUE1fVFJBQ0VfSAorCisjaW5jbHVkZSA8YXNtL2FzbS5oPgorCisjZGVmaW5lIFRSQUNFX1JFU1VNRSh1c2VyKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmIChwbV90cmFjZV9lbmFibGVkKSB7CQkJCQlcCisJCWNvbnN0IHZvaWQgKnRyYWNlZGF0YTsJCQkJXAorCQlhc20gdm9sYXRpbGUoX0FTTV9NT1YgIiAkMWYsJTBcbiIJCVwKKwkJCSAgICAgIi5zZWN0aW9uIC50cmFjZWRhdGEsXCJhXCJcbiIJXAorCQkJICAgICAiMTpcdC53b3JkICVjMVxuXHQiCQlcCisJCQkgICAgIF9BU01fUFRSICIgJWMyXG4iCQkJXAorCQkJICAgICAiLnByZXZpb3VzIgkJCVwKKwkJCSAgICAgOiI9ciIgKHRyYWNlZGF0YSkJCQlcCisJCQkgICAgIDogImkiIChfX0xJTkVfXyksICJpIiAoX19GSUxFX18pKTsJXAorCQlnZW5lcmF0ZV9wbV90cmFjZSh0cmFjZWRhdGEsIHVzZXIpOwkJXAorCX0JCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUkFDRV9TVVNQRU5EKHVzZXIpCVRSQUNFX1JFU1VNRSh1c2VyKQorCisjZW5kaWYgLyogX0FTTV9YODZfUE1fVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBlYzFjOTM1Li4yM2JhNjc2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtMTA5LDYgKzEwOSw5IEBACiAJLyogaW4gS0IgLSB2YWxpZCBmb3IgQ1BVUyB3aGljaCBzdXBwb3J0IHRoaXMgY2FsbDogKi8KIAlpbnQJCQl4ODZfY2FjaGVfc2l6ZTsKIAlpbnQJCQl4ODZfY2FjaGVfYWxpZ25tZW50OwkvKiBJbiBieXRlcyAqLworCS8qIENhY2hlIFFvUyBhcmNoaXRlY3R1cmFsIHZhbHVlczogKi8KKwlpbnQJCQl4ODZfY2FjaGVfbWF4X3JtaWQ7CS8qIG1heCBpbmRleCAqLworCWludAkJCXg4Nl9jYWNoZV9vY2Nfc2NhbGU7CS8qIHNjYWxlIHRvIGJ5dGVzICovCiAJaW50CQkJeDg2X3Bvd2VyOwogCXVuc2lnbmVkIGxvbmcJCWxvb3BzX3Blcl9qaWZmeTsKIAkvKiBjcHVpZCByZXR1cm5lZCBtYXggY29yZXMgdmFsdWU6ICovCkBAIC0yMTAsOCArMjEzLDIzIEBACiAJdW5zaWduZWQgbG9uZwkJc3AwOwogCXVuc2lnbmVkIHNob3J0CQlzczAsIF9fc3MwaDsKIAl1bnNpZ25lZCBsb25nCQlzcDE7Ci0JLyogc3MxIGNhY2hlcyBNU1JfSUEzMl9TWVNFTlRFUl9DUzogKi8KLQl1bnNpZ25lZCBzaG9ydAkJc3MxLCBfX3NzMWg7CisKKwkvKgorCSAqIFdlIGRvbid0IHVzZSByaW5nIDEsIHNvIHNzMSBpcyBhIGNvbnZlbmllbnQgc2NyYXRjaCBzcGFjZSBpbgorCSAqIHRoZSBzYW1lIGNhY2hlbGluZSBhcyBzcDAuICBXZSB1c2Ugc3MxIHRvIGNhY2hlIHRoZSB2YWx1ZSBpbgorCSAqIE1TUl9JQTMyX1NZU0VOVEVSX0NTLiAgV2hlbiB3ZSBjb250ZXh0IHN3aXRjaAorCSAqIE1TUl9JQTMyX1NZU0VOVEVSX0NTLCB3ZSBmaXJzdCBjaGVjayBpZiB0aGUgbmV3IHZhbHVlIGJlaW5nCisJICogd3JpdHRlbiBtYXRjaGVzIHNzMSwgYW5kLCBpZiBpdCdzIG5vdCwgdGhlbiB3ZSB3cm1zciB0aGUgbmV3CisJICogdmFsdWUgYW5kIHVwZGF0ZSBzczEuCisJICoKKwkgKiBUaGUgb25seSByZWFzb24gd2UgY29udGV4dCBzd2l0Y2ggTVNSX0lBMzJfU1lTRU5URVJfQ1MgaXMKKwkgKiB0aGF0IHdlIHNldCBpdCB0byB6ZXJvIGluIHZtODYgdGFza3MgdG8gYXZvaWQgY29ycnVwdGluZyB0aGUKKwkgKiBzdGFjayBpZiB3ZSB3ZXJlIHRvIGdvIHRocm91Z2ggdGhlIHN5c2VudGVyIHBhdGggZnJvbSB2bTg2CisJICogbW9kZS4KKwkgKi8KKwl1bnNpZ25lZCBzaG9ydAkJc3MxOwkvKiBNU1JfSUEzMl9TWVNFTlRFUl9DUyAqLworCisJdW5zaWduZWQgc2hvcnQJCV9fc3MxaDsKIAl1bnNpZ25lZCBsb25nCQlzcDI7CiAJdW5zaWduZWQgc2hvcnQJCXNzMiwgX19zczJoOwogCXVuc2lnbmVkIGxvbmcJCV9fY3IzOwpAQCAtMjc2LDEzICsyOTQsMTcgQEAKIAl1bnNpZ25lZCBsb25nCQlpb19iaXRtYXBbSU9fQklUTUFQX0xPTkdTICsgMV07CiAKIAkvKgotCSAqIC4uIGFuZCB0aGVuIGFub3RoZXIgMHgxMDAgYnl0ZXMgZm9yIHRoZSBlbWVyZ2VuY3kga2VybmVsIHN0YWNrOgorCSAqIFNwYWNlIGZvciB0aGUgdGVtcG9yYXJ5IFNZU0VOVEVSIHN0YWNrOgogCSAqLwotCXVuc2lnbmVkIGxvbmcJCXN0YWNrWzY0XTsKKwl1bnNpZ25lZCBsb25nCQlTWVNFTlRFUl9zdGFja1s2NF07CiAKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCi1ERUNMQVJFX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoc3RydWN0IHRzc19zdHJ1Y3QsIGluaXRfdHNzKTsKK0RFQ0xBUkVfUEVSX0NQVV9TSEFSRURfQUxJR05FRChzdHJ1Y3QgdHNzX3N0cnVjdCwgY3B1X3Rzcyk7CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCitERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgbG9uZywgY3B1X2N1cnJlbnRfdG9wX29mX3N0YWNrKTsKKyNlbmRpZgogCiAvKgogICogU2F2ZSB0aGUgb3JpZ2luYWwgaXN0IHZhbHVlcyBmb3IgY2hlY2tpbmcgc3RhY2sgcG9pbnRlcnMgZHVyaW5nIGRlYnVnZ2luZwpAQCAtNDc0LDcgKzQ5Niw2IEBACiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCXVuc2lnbmVkIGxvbmcJCXN5c2VudGVyX2NzOwogI2Vsc2UKLQl1bnNpZ25lZCBsb25nCQl1c2Vyc3A7CS8qIENvcHkgZnJvbSBQREEgKi8KIAl1bnNpZ25lZCBzaG9ydAkJZXM7CiAJdW5zaWduZWQgc2hvcnQJCWRzOwogCXVuc2lnbmVkIHNob3J0CQlmc2luZGV4OwpAQCAtNTY0LDYgKzU4NSwxNiBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjdXJyZW50X3RvcF9vZl9zdGFjayh2b2lkKQoreworI2lmZGVmIENPTkZJR19YODZfNjQKKwlyZXR1cm4gdGhpc19jcHVfcmVhZF9zdGFibGUoY3B1X3Rzcy54ODZfdHNzLnNwMCk7CisjZWxzZQorCS8qIHNwMCBvbiB4ODZfMzIgaXMgc3BlY2lhbCBpbiBhbmQgYXJvdW5kIHZtODYgbW9kZS4gKi8KKwlyZXR1cm4gdGhpc19jcHVfcmVhZF9zdGFibGUoY3B1X2N1cnJlbnRfdG9wX29mX3N0YWNrKTsKKyNlbmRpZgorfQorCiAjaWZkZWYgQ09ORklHX1BBUkFWSVJUCiAjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CiAjZWxzZQpAQCAtNzYxLDEwICs3OTIsMTAgQEAKICNkZWZpbmUgQVJDSF9IQVNfU1BJTkxPQ0tfUFJFRkVUQ0gKIAogI2lmZGVmIENPTkZJR19YODZfMzIKLSMgZGVmaW5lIEJBU0VfUFJFRkVUQ0gJCUFTTV9OT1A0CisjIGRlZmluZSBCQVNFX1BSRUZFVENICQkiIgogIyBkZWZpbmUgQVJDSF9IQVNfUFJFRkVUQ0gKICNlbHNlCi0jIGRlZmluZSBCQVNFX1BSRUZFVENICQkicHJlZmV0Y2h0MCAoJTEpIgorIyBkZWZpbmUgQkFTRV9QUkVGRVRDSAkJInByZWZldGNodDAgJVAxIgogI2VuZGlmCiAKIC8qCkBAIC03NzUsMTAgKzgwNiw5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmVmZXRjaChjb25zdCB2b2lkICp4KQogewotCWFsdGVybmF0aXZlX2lucHV0KEJBU0VfUFJFRkVUQ0gsCi0JCQkgICJwcmVmZXRjaG50YSAoJTEpIiwKKwlhbHRlcm5hdGl2ZV9pbnB1dChCQVNFX1BSRUZFVENILCAicHJlZmV0Y2hudGEgJVAxIiwKIAkJCSAgWDg2X0ZFQVRVUkVfWE1NLAotCQkJICAiciIgKHgpKTsKKwkJCSAgIm0iICgqKGNvbnN0IGNoYXIgKil4KSk7CiB9CiAKIC8qCkBAIC03ODgsMTAgKzgxOCw5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmVmZXRjaHcoY29uc3Qgdm9pZCAqeCkKIHsKLQlhbHRlcm5hdGl2ZV9pbnB1dChCQVNFX1BSRUZFVENILAotCQkJICAicHJlZmV0Y2h3ICglMSkiLAotCQkJICBYODZfRkVBVFVSRV8zRE5PVywKLQkJCSAgInIiICh4KSk7CisJYWx0ZXJuYXRpdmVfaW5wdXQoQkFTRV9QUkVGRVRDSCwgInByZWZldGNodyAlUDEiLAorCQkJICBYODZfRkVBVFVSRV8zRE5PV1BSRUZFVENILAorCQkJICAibSIgKCooY29uc3QgY2hhciAqKXgpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHNwaW5fbG9ja19wcmVmZXRjaChjb25zdCB2b2lkICp4KQpAQCAtNzk5LDYgKzgyOCw5IEBACiAJcHJlZmV0Y2h3KHgpOwogfQogCisjZGVmaW5lIFRPUF9PRl9JTklUX1NUQUNLICgodW5zaWduZWQgbG9uZykmaW5pdF9zdGFjayArIHNpemVvZihpbml0X3N0YWNrKSAtIFwKKwkJCSAgIFRPUF9PRl9LRVJORUxfU1RBQ0tfUEFERElORykKKwogI2lmZGVmIENPTkZJR19YODZfMzIKIC8qCiAgKiBVc2VyIHNwYWNlIHByb2Nlc3Mgc2l6ZTogM0dCIChkZWZhdWx0KS4KQEAgLTgwOSwzOSArODQxLDE2IEBACiAjZGVmaW5lIFNUQUNLX1RPUF9NQVgJCVNUQUNLX1RPUAogCiAjZGVmaW5lIElOSVRfVEhSRUFEICB7CQkJCQkJCSAgXAotCS5zcDAJCQk9IHNpemVvZihpbml0X3N0YWNrKSArIChsb25nKSZpbml0X3N0YWNrLCBcCisJLnNwMAkJCT0gVE9QX09GX0lOSVRfU1RBQ0ssCQkJICBcCiAJLnZtODZfaW5mbwkJPSBOVUxMLAkJCQkJICBcCiAJLnN5c2VudGVyX2NzCQk9IF9fS0VSTkVMX0NTLAkJCQkgIFwKIAkuaW9fYml0bWFwX3B0cgkJPSBOVUxMLAkJCQkJICBcCiB9CiAKLS8qCi0gKiBOb3RlIHRoYXQgdGhlIC5pb19iaXRtYXAgbWVtYmVyIG11c3QgYmUgZXh0cmEtYmlnLiBUaGlzIGlzIGJlY2F1c2UKLSAqIHRoZSBDUFUgd2lsbCBhY2Nlc3MgYW4gYWRkaXRpb25hbCBieXRlIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBJTwotICogcGVybWlzc2lvbiBiaXRtYXAuIFRoZSBleHRyYSBieXRlIG11c3QgYmUgYWxsIDEgYml0cywgYW5kIG11c3QKLSAqIGJlIHdpdGhpbiB0aGUgbGltaXQuCi0gKi8KLSNkZWZpbmUgSU5JVF9UU1MgIHsJCQkJCQkJICBcCi0JLng4Nl90c3MgPSB7CQkJCQkJCSAgXAotCQkuc3AwCQk9IHNpemVvZihpbml0X3N0YWNrKSArIChsb25nKSZpbml0X3N0YWNrLCBcCi0JCS5zczAJCT0gX19LRVJORUxfRFMsCQkJCSAgXAotCQkuc3MxCQk9IF9fS0VSTkVMX0NTLAkJCQkgIFwKLQkJLmlvX2JpdG1hcF9iYXNlCT0gSU5WQUxJRF9JT19CSVRNQVBfT0ZGU0VULAkJICBcCi0JIH0sCQkJCQkJCQkgIFwKLQkuaW9fYml0bWFwCQk9IHsgWzAgLi4uIElPX0JJVE1BUF9MT05HU10gPSB+MCB9LAkgIFwKLX0KLQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdGhyZWFkX3NhdmVkX3BjKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIAotI2RlZmluZSBUSFJFQURfU0laRV9MT05HUyAgICAgIChUSFJFQURfU0laRS9zaXplb2YodW5zaWduZWQgbG9uZykpCi0jZGVmaW5lIEtTVEtfVE9QKGluZm8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHVuc2lnbmVkIGxvbmcgKl9fcHRyID0gKHVuc2lnbmVkIGxvbmcgKikoaW5mbyk7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgKHVuc2lnbmVkIGxvbmcpKCZfX3B0cltUSFJFQURfU0laRV9MT05HU10pOyAgICAgICAgICAgICAgICAgICAgIFwKLX0pCi0KIC8qCi0gKiBUaGUgYmVsb3cgLTggaXMgdG8gcmVzZXJ2ZSA4IGJ5dGVzIG9uIHRvcCBvZiB0aGUgcmluZzAgc3RhY2suCisgKiBUT1BfT0ZfS0VSTkVMX1NUQUNLX1BBRERJTkcgcmVzZXJ2ZXMgOCBieXRlcyBvbiB0b3Agb2YgdGhlIHJpbmcwIHN0YWNrLgogICogVGhpcyBpcyBuZWNlc3NhcnkgdG8gZ3VhcmFudGVlIHRoYXQgdGhlIGVudGlyZSAic3RydWN0IHB0X3JlZ3MiCiAgKiBpcyBhY2Nlc3NpYmxlIGV2ZW4gaWYgdGhlIENQVSBoYXZlbid0IHN0b3JlZCB0aGUgU1MvRVNQIHJlZ2lzdGVycwogICogb24gdGhlIHN0YWNrIChpbnRlcnJ1cHQgZ2F0ZSBkb2VzIG5vdCBzYXZlIHRoZXNlIHJlZ2lzdGVycwpAQCAtODUwLDExICs4NTksMTEgQEAKICAqICJzdHJ1Y3QgcHRfcmVncyIgaXMgcG9zc2libGUsIGJ1dCB0aGV5IG1heSBjb250YWluIHRoZQogICogY29tcGxldGVseSB3cm9uZyB2YWx1ZXMuCiAgKi8KLSNkZWZpbmUgdGFza19wdF9yZWdzKHRhc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgc3RydWN0IHB0X3JlZ3MgKl9fcmVnc19fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBfX3JlZ3NfXyA9IChzdHJ1Y3QgcHRfcmVncyAqKShLU1RLX1RPUCh0YXNrX3N0YWNrX3BhZ2UodGFzaykpLTgpOyBcCi0gICAgICAgX19yZWdzX18gLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgdGFza19wdF9yZWdzKHRhc2spIFwKKyh7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgX19wdHIgPSAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UodGFzayk7CVwKKwlfX3B0ciArPSBUSFJFQURfU0laRSAtIFRPUF9PRl9LRVJORUxfU1RBQ0tfUEFERElORzsJCVwKKwkoKHN0cnVjdCBwdF9yZWdzICopX19wdHIpIC0gMTsJCQkJCVwKIH0pCiAKICNkZWZpbmUgS1NUS19FU1AodGFzaykJCSh0YXNrX3B0X3JlZ3ModGFzayktPnNwKQpAQCAtODg2LDExICs4OTUsNyBAQAogI2RlZmluZSBTVEFDS19UT1BfTUFYCQlUQVNLX1NJWkVfTUFYCiAKICNkZWZpbmUgSU5JVF9USFJFQUQgIHsgXAotCS5zcDAgPSAodW5zaWduZWQgbG9uZykmaW5pdF9zdGFjayArIHNpemVvZihpbml0X3N0YWNrKSBcCi19Ci0KLSNkZWZpbmUgSU5JVF9UU1MgIHsgXAotCS54ODZfdHNzLnNwMCA9ICh1bnNpZ25lZCBsb25nKSZpbml0X3N0YWNrICsgc2l6ZW9mKGluaXRfc3RhY2spIFwKKwkuc3AwID0gVE9QX09GX0lOSVRfU1RBQ0sgXAogfQogCiAvKgpAQCAtOTAyLDExICs5MDcsNiBAQAogI2RlZmluZSB0YXNrX3B0X3JlZ3ModHNrKQkoKHN0cnVjdCBwdF9yZWdzICopKHRzayktPnRocmVhZC5zcDAgLSAxKQogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgS1NUS19FU1Aoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKIAotLyoKLSAqIFVzZXIgc3BhY2UgUlNQIHdoaWxlIGluc2lkZSB0aGUgU1lTQ0FMTCBmYXN0IHBhdGgKLSAqLwotREVDTEFSRV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG9sZF9yc3ApOwotCiAjZW5kaWYgLyogQ09ORklHX1g4Nl82NCAqLwogCiBleHRlcm4gdm9pZCBzdGFydF90aHJlYWQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgbmV3X2lwLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHRyYWNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdHJhY2UuaAppbmRleCA4NmZjMmJiLi4xOTUwN2ZmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdHJhY2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdHJhY2UuaApAQCAtMzEsMTMgKzMxLDE3IEBACiAjZWxzZSAvKiBfX2kzODZfXyAqLwogCiBzdHJ1Y3QgcHRfcmVncyB7CisvKgorICogQyBBQkkgc2F5cyB0aGVzZSByZWdzIGFyZSBjYWxsZWUtcHJlc2VydmVkLiBUaGV5IGFyZW4ndCBzYXZlZCBvbiBrZXJuZWwgZW50cnkKKyAqIHVubGVzcyBzeXNjYWxsIG5lZWRzIGEgY29tcGxldGUsIGZ1bGx5IGZpbGxlZCAic3RydWN0IHB0X3JlZ3MiLgorICovCiAJdW5zaWduZWQgbG9uZyByMTU7CiAJdW5zaWduZWQgbG9uZyByMTQ7CiAJdW5zaWduZWQgbG9uZyByMTM7CiAJdW5zaWduZWQgbG9uZyByMTI7CiAJdW5zaWduZWQgbG9uZyBicDsKIAl1bnNpZ25lZCBsb25nIGJ4OwotLyogYXJndW1lbnRzOiBub24gaW50ZXJydXB0cy9ub24gdHJhY2luZyBzeXNjYWxscyBvbmx5IHNhdmUgdXAgdG8gaGVyZSovCisvKiBUaGVzZSByZWdzIGFyZSBjYWxsZWUtY2xvYmJlcmVkLiBBbHdheXMgc2F2ZWQgb24ga2VybmVsIGVudHJ5LiAqLwogCXVuc2lnbmVkIGxvbmcgcjExOwogCXVuc2lnbmVkIGxvbmcgcjEwOwogCXVuc2lnbmVkIGxvbmcgcjk7CkBAIC00Nyw5ICs1MSwxMiBAQAogCXVuc2lnbmVkIGxvbmcgZHg7CiAJdW5zaWduZWQgbG9uZyBzaTsKIAl1bnNpZ25lZCBsb25nIGRpOworLyoKKyAqIE9uIHN5c2NhbGwgZW50cnksIHRoaXMgaXMgc3lzY2FsbCMuIE9uIENQVSBleGNlcHRpb24sIHRoaXMgaXMgZXJyb3IgY29kZS4KKyAqIE9uIGh3IGludGVycnVwdCwgaXQncyBJUlEgbnVtYmVyOgorICovCiAJdW5zaWduZWQgbG9uZyBvcmlnX2F4OwotLyogZW5kIG9mIGFyZ3VtZW50cyAqLwotLyogY3B1IGV4Y2VwdGlvbiBmcmFtZSBvciB1bmRlZmluZWQgKi8KKy8qIFJldHVybiBmcmFtZSBmb3IgaXJldHEgKi8KIAl1bnNpZ25lZCBsb25nIGlwOwogCXVuc2lnbmVkIGxvbmcgY3M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTg5LDExICs5NiwxMyBAQAogfQogCiAvKgotICogdXNlcl9tb2RlX3ZtKHJlZ3MpIGRldGVybWluZXMgd2hldGhlciBhIHJlZ2lzdGVyIHNldCBjYW1lIGZyb20gdXNlciBtb2RlLgotICogVGhpcyBpcyB0cnVlIGlmIFY4MDg2IG1vZGUgd2FzIGVuYWJsZWQgT1IgaWYgdGhlIHJlZ2lzdGVyIHNldCB3YXMgZnJvbQotICogcHJvdGVjdGVkIG1vZGUgd2l0aCBSUEwtMyBDUyB2YWx1ZS4gIFRoaXMgdHJpY2t5IHRlc3QgY2hlY2tzIHRoYXQgd2l0aAotICogb25lIGNvbXBhcmlzb24uICBNYW55IHBsYWNlcyBpbiB0aGUga2VybmVsIGNhbiBieXBhc3MgdGhpcyBmdWxsIGNoZWNrCi0gKiBpZiB0aGV5IGhhdmUgYWxyZWFkeSBydWxlZCBvdXQgVjgwODYgbW9kZSwgc28gdXNlcl9tb2RlKHJlZ3MpIGNhbiBiZSB1c2VkLgorICogdXNlcl9tb2RlKHJlZ3MpIGRldGVybWluZXMgd2hldGhlciBhIHJlZ2lzdGVyIHNldCBjYW1lIGZyb20gdXNlcgorICogbW9kZS4gIE9uIHg4Nl8zMiwgdGhpcyBpcyB0cnVlIGlmIFY4MDg2IG1vZGUgd2FzIGVuYWJsZWQgT1IgaWYgdGhlCisgKiByZWdpc3RlciBzZXQgd2FzIGZyb20gcHJvdGVjdGVkIG1vZGUgd2l0aCBSUEwtMyBDUyB2YWx1ZS4gIFRoaXMKKyAqIHRyaWNreSB0ZXN0IGNoZWNrcyB0aGF0IHdpdGggb25lIGNvbXBhcmlzb24uCisgKgorICogT24geDg2XzY0LCB2bTg2IG1vZGUgaXMgbWVyY2lmdWxseSBub25leGlzdGVudCwgYW5kIHdlIGRvbid0IG5lZWQKKyAqIHRoZSBleHRyYSBjaGVjay4KICAqLwogc3RhdGljIGlubGluZSBpbnQgdXNlcl9tb2RlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewpAQCAtMTA0LDE2ICsxMTMsNiBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHVzZXJfbW9kZV92bShzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JcmV0dXJuICgocmVncy0+Y3MgJiBTRUdNRU5UX1JQTF9NQVNLKSB8IChyZWdzLT5mbGFncyAmIFg4Nl9WTV9NQVNLKSkgPj0KLQkJVVNFUl9SUEw7Ci0jZWxzZQotCXJldHVybiB1c2VyX21vZGUocmVncyk7Ci0jZW5kaWYKLX0KLQogc3RhdGljIGlubGluZSBpbnQgdjgwODZfbW9kZShzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKICNpZmRlZiBDT05GSUdfWDg2XzMyCkBAIC0xMzgsMTIgKzEzNyw4IEBACiAjZW5kaWYKIH0KIAotI2RlZmluZSBjdXJyZW50X3VzZXJfc3RhY2tfcG9pbnRlcigpCXRoaXNfY3B1X3JlYWQob2xkX3JzcCkKLS8qIGlhMzIgdnMuIHgzMiBkaWZmZXJlbmNlICovCi0jZGVmaW5lIGNvbXBhdF91c2VyX3N0YWNrX3BvaW50ZXIoKQlcCi0JKHRlc3RfdGhyZWFkX2ZsYWcoVElGX0lBMzIpIAlcCi0JID8gY3VycmVudF9wdF9yZWdzKCktPnNwIAlcCi0JIDogdGhpc19jcHVfcmVhZChvbGRfcnNwKSkKKyNkZWZpbmUgY3VycmVudF91c2VyX3N0YWNrX3BvaW50ZXIoKQljdXJyZW50X3B0X3JlZ3MoKS0+c3AKKyNkZWZpbmUgY29tcGF0X3VzZXJfc3RhY2tfcG9pbnRlcigpCWN1cnJlbnRfcHRfcmVncygpLT5zcAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCkBAIC0yNDgsNyArMjQzLDcgQEAKICAqLwogI2RlZmluZSBhcmNoX3B0cmFjZV9zdG9wX25lZWRlZChjb2RlLCBpbmZvKQkJCQlcCiAoewkJCQkJCQkJCVwKLQlzZXRfdGhyZWFkX2ZsYWcoVElGX05PVElGWV9SRVNVTUUpOwkJCQlcCisJZm9yY2VfaXJldCgpOwkJCQkJCQlcCiAJZmFsc2U7CQkJCQkJCQlcCiB9KQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdmNsb2NrLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdmNsb2NrLmgKaW5kZXggZDZiMDc4ZS4uMjViMWNjMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHZjbG9jay5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B2Y2xvY2suaApAQCAtOTUsNiArOTUsNyBAQAogCiBzdHJ1Y3QgcHZjbG9ja192c3lzY2FsbF90aW1lX2luZm8gewogCXN0cnVjdCBwdmNsb2NrX3ZjcHVfdGltZV9pbmZvIHB2dGk7CisJdTMyIG1pZ3JhdGVfY291bnQ7CiB9IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKFNNUF9DQUNIRV9CWVRFUykpKTsKIAogI2RlZmluZSBQVlRJX1NJWkUgc2l6ZW9mKHN0cnVjdCBwdmNsb2NrX3ZzeXNjYWxsX3RpbWVfaW5mbykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Jlc3VtZS10cmFjZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcmVzdW1lLXRyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZjFjMmMuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcmVzdW1lLXRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0jaWZuZGVmIF9BU01fWDg2X1JFU1VNRV9UUkFDRV9ICi0jZGVmaW5lIF9BU01fWDg2X1JFU1VNRV9UUkFDRV9ICi0KLSNpbmNsdWRlIDxhc20vYXNtLmg+Ci0KLSNkZWZpbmUgVFJBQ0VfUkVTVU1FKHVzZXIpCQkJCQlcCi1kbyB7CQkJCQkJCQlcCi0JaWYgKHBtX3RyYWNlX2VuYWJsZWQpIHsJCQkJCVwKLQkJY29uc3Qgdm9pZCAqdHJhY2VkYXRhOwkJCQlcCi0JCWFzbSB2b2xhdGlsZShfQVNNX01PViAiICQxZiwlMFxuIgkJXAotCQkJICAgICAiLnNlY3Rpb24gLnRyYWNlZGF0YSxcImFcIlxuIglcCi0JCQkgICAgICIxOlx0LndvcmQgJWMxXG5cdCIJCVwKLQkJCSAgICAgX0FTTV9QVFIgIiAlYzJcbiIJCQlcCi0JCQkgICAgICIucHJldmlvdXMiCQkJXAotCQkJICAgICA6Ij1yIiAodHJhY2VkYXRhKQkJCVwKLQkJCSAgICAgOiAiaSIgKF9fTElORV9fKSwgImkiIChfX0ZJTEVfXykpOwlcCi0JCWdlbmVyYXRlX3Jlc3VtZV90cmFjZSh0cmFjZWRhdGEsIHVzZXIpOwkJXAotCX0JCQkJCQkJXAotfSB3aGlsZSAoMCkKLQotI2VuZGlmIC8qIF9BU01fWDg2X1JFU1VNRV9UUkFDRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZWdtZW50LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZWdtZW50LmgKaW5kZXggZGIyNTdhNS4uNWE5ODU2ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2VnbWVudC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NlZ21lbnQuaApAQCAtMyw4ICszLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC9jb25zdC5oPgogCi0vKiBDb25zdHJ1Y3RvciBmb3IgYSBjb252ZW50aW9uYWwgc2VnbWVudCBHRFQgKG9yIExEVCkgZW50cnkgKi8KLS8qIFRoaXMgaXMgYSBtYWNybyBzbyBpdCBjYW4gYmUgdXNlZCBpbiBpbml0aWFsaXplcnMgKi8KKy8qCisgKiBDb25zdHJ1Y3RvciBmb3IgYSBjb252ZW50aW9uYWwgc2VnbWVudCBHRFQgKG9yIExEVCkgZW50cnkuCisgKiBUaGlzIGlzIGEgbWFjcm8gc28gaXQgY2FuIGJlIHVzZWQgaW4gaW5pdGlhbGl6ZXJzLgorICovCiAjZGVmaW5lIEdEVF9FTlRSWShmbGFncywgYmFzZSwgbGltaXQpCQkJXAogCSgoKChiYXNlKSAgJiBfQUMoMHhmZjAwMDAwMCxVTEwpKSA8PCAoNTYtMjQpKSB8CVwKIAkgKCgoZmxhZ3MpICYgX0FDKDB4MDAwMGYwZmYsVUxMKSkgPDwgNDApIHwJXApAQCAtMTIsMTk4ICsxNCwyMjggQEAKIAkgKCgoYmFzZSkgICYgX0FDKDB4MDBmZmZmZmYsVUxMKSkgPDwgMTYpIHwJXAogCSAoKChsaW1pdCkgJiBfQUMoMHgwMDAwZmZmZixVTEwpKSkpCiAKLS8qIFNpbXBsZSBhbmQgc21hbGwgR0RUIGVudHJpZXMgZm9yIGJvb3Rpbmcgb25seSAqLworLyogU2ltcGxlIGFuZCBzbWFsbCBHRFQgZW50cmllcyBmb3IgYm9vdGluZyBvbmx5OiAqLwogCiAjZGVmaW5lIEdEVF9FTlRSWV9CT09UX0NTCTIKLSNkZWZpbmUgX19CT09UX0NTCQkoR0RUX0VOVFJZX0JPT1RfQ1MgKiA4KQorI2RlZmluZSBHRFRfRU5UUllfQk9PVF9EUwkzCisjZGVmaW5lIEdEVF9FTlRSWV9CT09UX1RTUwk0CisjZGVmaW5lIF9fQk9PVF9DUwkJKEdEVF9FTlRSWV9CT09UX0NTKjgpCisjZGVmaW5lIF9fQk9PVF9EUwkJKEdEVF9FTlRSWV9CT09UX0RTKjgpCisjZGVmaW5lIF9fQk9PVF9UU1MJCShHRFRfRU5UUllfQk9PVF9UU1MqOCkKIAotI2RlZmluZSBHRFRfRU5UUllfQk9PVF9EUwkoR0RUX0VOVFJZX0JPT1RfQ1MgKyAxKQotI2RlZmluZSBfX0JPT1RfRFMJCShHRFRfRU5UUllfQk9PVF9EUyAqIDgpCisvKgorICogQm90dG9tIHR3byBiaXRzIG9mIHNlbGVjdG9yIGdpdmUgdGhlIHJpbmcKKyAqIHByaXZpbGVnZSBsZXZlbAorICovCisjZGVmaW5lIFNFR01FTlRfUlBMX01BU0sJMHgzCiAKLSNkZWZpbmUgR0RUX0VOVFJZX0JPT1RfVFNTCShHRFRfRU5UUllfQk9PVF9DUyArIDIpCi0jZGVmaW5lIF9fQk9PVF9UU1MJCShHRFRfRU5UUllfQk9PVF9UU1MgKiA4KQorLyogVXNlciBtb2RlIGlzIHByaXZpbGVnZSBsZXZlbCAzOiAqLworI2RlZmluZSBVU0VSX1JQTAkJMHgzCiAKLSNkZWZpbmUgU0VHTUVOVF9SUExfTUFTSwkweDMgLyoKLQkJCQkgICAgICogQm90dG9tIHR3byBiaXRzIG9mIHNlbGVjdG9yIGdpdmUgdGhlIHJpbmcKLQkJCQkgICAgICogcHJpdmlsZWdlIGxldmVsCi0JCQkJICAgICAqLwotI2RlZmluZSBTRUdNRU5UX1RJX01BU0sJCTB4NCAvKiBCaXQgMiBpcyB0YWJsZSBpbmRpY2F0b3IgKExEVC9HRFQpICovCi0jZGVmaW5lIFVTRVJfUlBMCQkweDMgLyogVXNlciBtb2RlIGlzIHByaXZpbGVnZSBsZXZlbCAzICovCi0jZGVmaW5lIFNFR01FTlRfTERUCQkweDQgLyogTERUIHNlZ21lbnQgaGFzIFRJIHNldC4uLiAqLwotI2RlZmluZSBTRUdNRU5UX0dEVAkJMHgwIC8qIC4uLiBHRFQgaGFzIGl0IGNsZWFyZWQgKi8KKy8qIEJpdCAyIGlzIFRhYmxlIEluZGljYXRvciAoVEkpOiBzZWxlY3RzIGJldHdlZW4gTERUIG9yIEdEVCAqLworI2RlZmluZSBTRUdNRU5UX1RJX01BU0sJCTB4NAorLyogTERUIHNlZ21lbnQgaGFzIFRJIHNldCAuLi4gKi8KKyNkZWZpbmUgU0VHTUVOVF9MRFQJCTB4NAorLyogLi4uIEdEVCBoYXMgaXQgY2xlYXJlZCAqLworI2RlZmluZSBTRUdNRU5UX0dEVAkJMHgwCisKKyNkZWZpbmUgR0RUX0VOVFJZX0lOVkFMSURfU0VHCTAKIAogI2lmZGVmIENPTkZJR19YODZfMzIKIC8qCiAgKiBUaGUgbGF5b3V0IG9mIHRoZSBwZXItQ1BVIEdEVCB1bmRlciBMaW51eDoKICAqCi0gKiAgIDAgLSBudWxsCisgKiAgIDAgLSBudWxsCQkJCQkJCQk8PT09IGNhY2hlbGluZSAjMQogICogICAxIC0gcmVzZXJ2ZWQKICAqICAgMiAtIHJlc2VydmVkCiAgKiAgIDMgLSByZXNlcnZlZAogICoKLSAqICAgNCAtIHVudXNlZAkJCTw9PT09IG5ldyBjYWNoZWxpbmUKKyAqICAgNCAtIHVudXNlZAkJCQkJCQkJPD09PSBjYWNoZWxpbmUgIzIKICAqICAgNSAtIHVudXNlZAogICoKICAqICAtLS0tLS0tIHN0YXJ0IG9mIFRMUyAoVGhyZWFkLUxvY2FsIFN0b3JhZ2UpIHNlZ21lbnRzOgogICoKICAqICAgNiAtIFRMUyBzZWdtZW50ICMxCQkJWyBnbGliYydzIFRMUyBzZWdtZW50IF0KICAqICAgNyAtIFRMUyBzZWdtZW50ICMyCQkJWyBXaW5lJ3MgJWZzIFdpbjMyIHNlZ21lbnQgXQotICogICA4IC0gVExTIHNlZ21lbnQgIzMKKyAqICAgOCAtIFRMUyBzZWdtZW50ICMzCQkJCQkJCTw9PT0gY2FjaGVsaW5lICMzCiAgKiAgIDkgLSByZXNlcnZlZAogICogIDEwIC0gcmVzZXJ2ZWQKICAqICAxMSAtIHJlc2VydmVkCiAgKgogICogIC0tLS0tLS0gc3RhcnQgb2Yga2VybmVsIHNlZ21lbnRzOgogICoKLSAqICAxMiAtIGtlcm5lbCBjb2RlIHNlZ21lbnQJCTw9PT09IG5ldyBjYWNoZWxpbmUKKyAqICAxMiAtIGtlcm5lbCBjb2RlIHNlZ21lbnQJCQkJCQk8PT09IGNhY2hlbGluZSAjNAogICogIDEzIC0ga2VybmVsIGRhdGEgc2VnbWVudAogICogIDE0IC0gZGVmYXVsdCB1c2VyIENTCiAgKiAgMTUgLSBkZWZhdWx0IHVzZXIgRFMKLSAqICAxNiAtIFRTUworICogIDE2IC0gVFNTCQkJCQkJCQk8PT09IGNhY2hlbGluZSAjNQogICogIDE3IC0gTERUCiAgKiAgMTggLSBQTlBCSU9TIHN1cHBvcnQgKDE2LT4zMiBnYXRlKQogICogIDE5IC0gUE5QQklPUyBzdXBwb3J0Ci0gKiAgMjAgLSBQTlBCSU9TIHN1cHBvcnQKKyAqICAyMCAtIFBOUEJJT1Mgc3VwcG9ydAkJCQkJCTw9PT0gY2FjaGVsaW5lICM2CiAgKiAgMjEgLSBQTlBCSU9TIHN1cHBvcnQKICAqICAyMiAtIFBOUEJJT1Mgc3VwcG9ydAogICogIDIzIC0gQVBNIEJJT1Mgc3VwcG9ydAotICogIDI0IC0gQVBNIEJJT1Mgc3VwcG9ydAorICogIDI0IC0gQVBNIEJJT1Mgc3VwcG9ydAkJCQkJCTw9PT0gY2FjaGVsaW5lICM3CiAgKiAgMjUgLSBBUE0gQklPUyBzdXBwb3J0CiAgKgogICogIDI2IC0gRVNQRklYIHNtYWxsIFNTCiAgKiAgMjcgLSBwZXItY3B1CQkJWyBvZmZzZXQgdG8gcGVyLWNwdSBkYXRhIGFyZWEgXQotICogIDI4IC0gc3RhY2tfY2FuYXJ5LTIwCQlbIGZvciBzdGFjayBwcm90ZWN0b3IgXQorICogIDI4IC0gc3RhY2tfY2FuYXJ5LTIwCQlbIGZvciBzdGFjayBwcm90ZWN0b3IgXQkJPD09PSBjYWNoZWxpbmUgIzgKICAqICAyOSAtIHVudXNlZAogICogIDMwIC0gdW51c2VkCiAgKiAgMzEgLSBUU1MgZm9yIGRvdWJsZSBmYXVsdCBoYW5kbGVyCiAgKi8KLSNkZWZpbmUgR0RUX0VOVFJZX1RMU19NSU4JNgotI2RlZmluZSBHRFRfRU5UUllfVExTX01BWCAJKEdEVF9FTlRSWV9UTFNfTUlOICsgR0RUX0VOVFJZX1RMU19FTlRSSUVTIC0gMSkKKyNkZWZpbmUgR0RUX0VOVFJZX1RMU19NSU4JCTYKKyNkZWZpbmUgR0RUX0VOVFJZX1RMU19NQVggCQkoR0RUX0VOVFJZX1RMU19NSU4gKyBHRFRfRU5UUllfVExTX0VOVFJJRVMgLSAxKQogCisjZGVmaW5lIEdEVF9FTlRSWV9LRVJORUxfQ1MJCTEyCisjZGVmaW5lIEdEVF9FTlRSWV9LRVJORUxfRFMJCTEzCiAjZGVmaW5lIEdEVF9FTlRSWV9ERUZBVUxUX1VTRVJfQ1MJMTQKLQogI2RlZmluZSBHRFRfRU5UUllfREVGQVVMVF9VU0VSX0RTCTE1CisjZGVmaW5lIEdEVF9FTlRSWV9UU1MJCQkxNgorI2RlZmluZSBHRFRfRU5UUllfTERUCQkJMTcKKyNkZWZpbmUgR0RUX0VOVFJZX1BOUEJJT1NfQ1MzMgkJMTgKKyNkZWZpbmUgR0RUX0VOVFJZX1BOUEJJT1NfQ1MxNgkJMTkKKyNkZWZpbmUgR0RUX0VOVFJZX1BOUEJJT1NfRFMJCTIwCisjZGVmaW5lIEdEVF9FTlRSWV9QTlBCSU9TX1RTMQkJMjEKKyNkZWZpbmUgR0RUX0VOVFJZX1BOUEJJT1NfVFMyCQkyMgorI2RlZmluZSBHRFRfRU5UUllfQVBNQklPU19CQVNFCQkyMwogCi0jZGVmaW5lIEdEVF9FTlRSWV9LRVJORUxfQkFTRQkJKDEyKQotCi0jZGVmaW5lIEdEVF9FTlRSWV9LRVJORUxfQ1MJCShHRFRfRU5UUllfS0VSTkVMX0JBU0UrMCkKLQotI2RlZmluZSBHRFRfRU5UUllfS0VSTkVMX0RTCQkoR0RUX0VOVFJZX0tFUk5FTF9CQVNFKzEpCi0KLSNkZWZpbmUgR0RUX0VOVFJZX1RTUwkJCShHRFRfRU5UUllfS0VSTkVMX0JBU0UrNCkKLSNkZWZpbmUgR0RUX0VOVFJZX0xEVAkJCShHRFRfRU5UUllfS0VSTkVMX0JBU0UrNSkKLQotI2RlZmluZSBHRFRfRU5UUllfUE5QQklPU19CQVNFCQkoR0RUX0VOVFJZX0tFUk5FTF9CQVNFKzYpCi0jZGVmaW5lIEdEVF9FTlRSWV9BUE1CSU9TX0JBU0UJCShHRFRfRU5UUllfS0VSTkVMX0JBU0UrMTEpCi0KLSNkZWZpbmUgR0RUX0VOVFJZX0VTUEZJWF9TUwkJKEdEVF9FTlRSWV9LRVJORUxfQkFTRSsxNCkKLSNkZWZpbmUgX19FU1BGSVhfU1MJCQkoR0RUX0VOVFJZX0VTUEZJWF9TUyo4KQotCi0jZGVmaW5lIEdEVF9FTlRSWV9QRVJDUFUJCShHRFRfRU5UUllfS0VSTkVMX0JBU0UrMTUpCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBfX0tFUk5FTF9QRVJDUFUgKEdEVF9FTlRSWV9QRVJDUFUgKiA4KQotI2Vsc2UKLSNkZWZpbmUgX19LRVJORUxfUEVSQ1BVIDAKLSNlbmRpZgotCi0jZGVmaW5lIEdEVF9FTlRSWV9TVEFDS19DQU5BUlkJCShHRFRfRU5UUllfS0VSTkVMX0JBU0UrMTYpCi0jaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCi0jZGVmaW5lIF9fS0VSTkVMX1NUQUNLX0NBTkFSWQkJKEdEVF9FTlRSWV9TVEFDS19DQU5BUlkqOCkKLSNlbHNlCi0jZGVmaW5lIF9fS0VSTkVMX1NUQUNLX0NBTkFSWQkJMAotI2VuZGlmCisjZGVmaW5lIEdEVF9FTlRSWV9FU1BGSVhfU1MJCTI2CisjZGVmaW5lIEdEVF9FTlRSWV9QRVJDUFUJCTI3CisjZGVmaW5lIEdEVF9FTlRSWV9TVEFDS19DQU5BUlkJCTI4CiAKICNkZWZpbmUgR0RUX0VOVFJZX0RPVUJMRUZBVUxUX1RTUwkzMQogCiAvKgotICogVGhlIEdEVCBoYXMgMzIgZW50cmllcworICogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIEdEVCB0YWJsZToKICAqLwotI2RlZmluZSBHRFRfRU5UUklFUyAzMgotCi0vKiBUaGUgUG5QIEJJT1MgZW50cmllcyBpbiB0aGUgR0RUICovCi0jZGVmaW5lIEdEVF9FTlRSWV9QTlBCSU9TX0NTMzIJCShHRFRfRU5UUllfUE5QQklPU19CQVNFICsgMCkKLSNkZWZpbmUgR0RUX0VOVFJZX1BOUEJJT1NfQ1MxNgkJKEdEVF9FTlRSWV9QTlBCSU9TX0JBU0UgKyAxKQotI2RlZmluZSBHRFRfRU5UUllfUE5QQklPU19EUwkJKEdEVF9FTlRSWV9QTlBCSU9TX0JBU0UgKyAyKQotI2RlZmluZSBHRFRfRU5UUllfUE5QQklPU19UUzEJCShHRFRfRU5UUllfUE5QQklPU19CQVNFICsgMykKLSNkZWZpbmUgR0RUX0VOVFJZX1BOUEJJT1NfVFMyCQkoR0RUX0VOVFJZX1BOUEJJT1NfQkFTRSArIDQpCi0KLS8qIFRoZSBQblAgQklPUyBzZWxlY3RvcnMgKi8KLSNkZWZpbmUgUE5QX0NTMzIgICAoR0RUX0VOVFJZX1BOUEJJT1NfQ1MzMiAqIDgpCS8qIHNlZ21lbnQgZm9yIGNhbGxpbmcgZm4gKi8KLSNkZWZpbmUgUE5QX0NTMTYgICAoR0RUX0VOVFJZX1BOUEJJT1NfQ1MxNiAqIDgpCS8qIGNvZGUgc2VnbWVudCBmb3IgQklPUyAqLwotI2RlZmluZSBQTlBfRFMgICAgIChHRFRfRU5UUllfUE5QQklPU19EUyAqIDgpCS8qIGRhdGEgc2VnbWVudCBmb3IgQklPUyAqLwotI2RlZmluZSBQTlBfVFMxICAgIChHRFRfRU5UUllfUE5QQklPU19UUzEgKiA4KQkvKiB0cmFuc2ZlciBkYXRhIHNlZ21lbnQgKi8KLSNkZWZpbmUgUE5QX1RTMiAgICAoR0RUX0VOVFJZX1BOUEJJT1NfVFMyICogOCkJLyogYW5vdGhlciBkYXRhIHNlZ21lbnQgKi8KLQorI2RlZmluZSBHRFRfRU5UUklFUwkJCTMyCiAKIC8qCi0gKiBNYXRjaGluZyBydWxlcyBmb3IgY2VydGFpbiB0eXBlcyBvZiBzZWdtZW50cy4KKyAqIFNlZ21lbnQgc2VsZWN0b3IgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFib3ZlIGVudHJpZXM6CiAgKi8KIAotLyogTWF0Y2hlcyBQTlBfQ1MzMiBhbmQgUE5QX0NTMTYgKHRoZXkgbXVzdCBiZSBjb25zZWN1dGl2ZSkgKi8KLSNkZWZpbmUgU0VHTUVOVF9JU19QTlBfQ09ERSh4KSAgICgoKHgpICYgMHhmNCkgPT0gR0RUX0VOVFJZX1BOUEJJT1NfQkFTRSAqIDgpCisjZGVmaW5lIF9fS0VSTkVMX0NTCQkJKEdEVF9FTlRSWV9LRVJORUxfQ1MqOCkKKyNkZWZpbmUgX19LRVJORUxfRFMJCQkoR0RUX0VOVFJZX0tFUk5FTF9EUyo4KQorI2RlZmluZSBfX1VTRVJfRFMJCQkoR0RUX0VOVFJZX0RFRkFVTFRfVVNFUl9EUyo4ICsgMykKKyNkZWZpbmUgX19VU0VSX0NTCQkJKEdEVF9FTlRSWV9ERUZBVUxUX1VTRVJfQ1MqOCArIDMpCisjZGVmaW5lIF9fRVNQRklYX1NTCQkJKEdEVF9FTlRSWV9FU1BGSVhfU1MqOCkKIAorLyogc2VnbWVudCBmb3IgY2FsbGluZyBmbjogKi8KKyNkZWZpbmUgUE5QX0NTMzIJCQkoR0RUX0VOVFJZX1BOUEJJT1NfQ1MzMio4KQorLyogY29kZSBzZWdtZW50IGZvciBCSU9TOiAqLworI2RlZmluZSBQTlBfQ1MxNgkJCShHRFRfRU5UUllfUE5QQklPU19DUzE2KjgpCiAKKy8qICJJcyB0aGlzIFBOUCBjb2RlIHNlbGVjdG9yIChQTlBfQ1MzMiBvciBQTlBfQ1MxNik/IiAqLworI2RlZmluZSBTRUdNRU5UX0lTX1BOUF9DT0RFKHgpCQkoKCh4KSAmIDB4ZjQpID09IFBOUF9DUzMyKQorCisvKiBkYXRhIHNlZ21lbnQgZm9yIEJJT1M6ICovCisjZGVmaW5lIFBOUF9EUwkJCQkoR0RUX0VOVFJZX1BOUEJJT1NfRFMqOCkKKy8qIHRyYW5zZmVyIGRhdGEgc2VnbWVudDogKi8KKyNkZWZpbmUgUE5QX1RTMQkJCQkoR0RUX0VOVFJZX1BOUEJJT1NfVFMxKjgpCisvKiBhbm90aGVyIGRhdGEgc2VnbWVudDogKi8KKyNkZWZpbmUgUE5QX1RTMgkJCQkoR0RUX0VOVFJZX1BOUEJJT1NfVFMyKjgpCisKKyNpZmRlZiBDT05GSUdfU01QCisjIGRlZmluZSBfX0tFUk5FTF9QRVJDUFUJCShHRFRfRU5UUllfUEVSQ1BVKjgpCiAjZWxzZQorIyBkZWZpbmUgX19LRVJORUxfUEVSQ1BVCQkwCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19DQ19TVEFDS1BST1RFQ1RPUgorIyBkZWZpbmUgX19LRVJORUxfU1RBQ0tfQ0FOQVJZCQkoR0RUX0VOVFJZX1NUQUNLX0NBTkFSWSo4KQorI2Vsc2UKKyMgZGVmaW5lIF9fS0VSTkVMX1NUQUNLX0NBTkFSWQkJMAorI2VuZGlmCisKKyNlbHNlIC8qIDY0LWJpdDogKi8KKwogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgogCi0jZGVmaW5lIEdEVF9FTlRSWV9LRVJORUwzMl9DUyAxCi0jZGVmaW5lIEdEVF9FTlRSWV9LRVJORUxfQ1MgMgotI2RlZmluZSBHRFRfRU5UUllfS0VSTkVMX0RTIDMKLQotI2RlZmluZSBfX0tFUk5FTDMyX0NTICAgKEdEVF9FTlRSWV9LRVJORUwzMl9DUyAqIDgpCisjZGVmaW5lIEdEVF9FTlRSWV9LRVJORUwzMl9DUwkJMQorI2RlZmluZSBHRFRfRU5UUllfS0VSTkVMX0NTCQkyCisjZGVmaW5lIEdEVF9FTlRSWV9LRVJORUxfRFMJCTMKIAogLyoKLSAqIHdlIGNhbm5vdCB1c2UgdGhlIHNhbWUgY29kZSBzZWdtZW50IGRlc2NyaXB0b3IgZm9yIHVzZXIgYW5kIGtlcm5lbAotICogLS0gbm90IGV2ZW4gaW4gdGhlIGxvbmcgZmxhdCBtb2RlLCBiZWNhdXNlIG9mIGRpZmZlcmVudCBEUEwgL2trZWlsCi0gKiBUaGUgc2VnbWVudCBvZmZzZXQgbmVlZHMgdG8gY29udGFpbiBhIFJQTC4gR3JyLiAtQUsKLSAqIEdEVCBsYXlvdXQgdG8gZ2V0IDY0Yml0IHN5c2NhbGwgcmlnaHQgKHN5c3JldCBoYXJkY29kZXMgZ2R0IG9mZnNldHMpCisgKiBXZSBjYW5ub3QgdXNlIHRoZSBzYW1lIGNvZGUgc2VnbWVudCBkZXNjcmlwdG9yIGZvciB1c2VyIGFuZCBrZXJuZWwgbW9kZSwKKyAqIG5vdCBldmVuIGluIGxvbmcgZmxhdCBtb2RlLCBiZWNhdXNlIG9mIGRpZmZlcmVudCBEUEwuCisgKgorICogR0RUIGxheW91dCB0byBnZXQgNjQtYml0IFNZU0NBTEwvU1lTUkVUIHN1cHBvcnQgcmlnaHQuIFNZU1JFVCBoYXJkY29kZXMKKyAqIHNlbGVjdG9yczoKKyAqCisgKiAgIGlmIHJldHVybmluZyB0byAzMi1iaXQgdXNlcnNwYWNlOiBjcyA9IFNUQVIuU1lTUkVUX0NTLAorICogICBpZiByZXR1cm5pbmcgdG8gNjQtYml0IHVzZXJzcGFjZTogY3MgPSBTVEFSLlNZU1JFVF9DUysxNiwKKyAqCisgKiBzcyA9IFNUQVIuU1lTUkVUX0NTKzggKGluIGVpdGhlciBjYXNlKQorICoKKyAqIHRodXMgVVNFUl9EUyBzaG91bGQgYmUgYmV0d2VlbiAzMi1iaXQgYW5kIDY0LWJpdCBjb2RlIHNlbGVjdG9yczoKICAqLwotI2RlZmluZSBHRFRfRU5UUllfREVGQVVMVF9VU0VSMzJfQ1MgNAotI2RlZmluZSBHRFRfRU5UUllfREVGQVVMVF9VU0VSX0RTIDUKLSNkZWZpbmUgR0RUX0VOVFJZX0RFRkFVTFRfVVNFUl9DUyA2Ci0jZGVmaW5lIF9fVVNFUjMyX0NTICAgKEdEVF9FTlRSWV9ERUZBVUxUX1VTRVIzMl9DUyo4KzMpCi0jZGVmaW5lIF9fVVNFUjMyX0RTCV9fVVNFUl9EUworI2RlZmluZSBHRFRfRU5UUllfREVGQVVMVF9VU0VSMzJfQ1MJNAorI2RlZmluZSBHRFRfRU5UUllfREVGQVVMVF9VU0VSX0RTCTUKKyNkZWZpbmUgR0RUX0VOVFJZX0RFRkFVTFRfVVNFUl9DUwk2CiAKLSNkZWZpbmUgR0RUX0VOVFJZX1RTUyA4CS8qIG5lZWRzIHR3byBlbnRyaWVzICovCi0jZGVmaW5lIEdEVF9FTlRSWV9MRFQgMTAgLyogbmVlZHMgdHdvIGVudHJpZXMgKi8KLSNkZWZpbmUgR0RUX0VOVFJZX1RMU19NSU4gMTIKLSNkZWZpbmUgR0RUX0VOVFJZX1RMU19NQVggMTQKKy8qIE5lZWRzIHR3byBlbnRyaWVzICovCisjZGVmaW5lIEdEVF9FTlRSWV9UU1MJCQk4CisvKiBOZWVkcyB0d28gZW50cmllcyAqLworI2RlZmluZSBHRFRfRU5UUllfTERUCQkJMTAKIAotI2RlZmluZSBHRFRfRU5UUllfUEVSX0NQVSAxNQkvKiBBYnVzZWQgdG8gbG9hZCBwZXIgQ1BVIGRhdGEgZnJvbSBsaW1pdCAqLwotI2RlZmluZSBfX1BFUl9DUFVfU0VHCShHRFRfRU5UUllfUEVSX0NQVSAqIDggKyAzKQorI2RlZmluZSBHRFRfRU5UUllfVExTX01JTgkJMTIKKyNkZWZpbmUgR0RUX0VOVFJZX1RMU19NQVgJCTE0CiAKLS8qIFRMUyBpbmRleGVzIGZvciA2NGJpdCAtIGhhcmRjb2RlZCBpbiBhcmNoX3ByY3RsICovCi0jZGVmaW5lIEZTX1RMUyAwCi0jZGVmaW5lIEdTX1RMUyAxCisvKiBBYnVzZWQgdG8gbG9hZCBwZXIgQ1BVIGRhdGEgZnJvbSBsaW1pdCAqLworI2RlZmluZSBHRFRfRU5UUllfUEVSX0NQVQkJMTUKIAotI2RlZmluZSBHU19UTFNfU0VMICgoR0RUX0VOVFJZX1RMU19NSU4rR1NfVExTKSo4ICsgMykKLSNkZWZpbmUgRlNfVExTX1NFTCAoKEdEVF9FTlRSWV9UTFNfTUlOK0ZTX1RMUykqOCArIDMpCisvKgorICogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIEdEVCB0YWJsZToKKyAqLworI2RlZmluZSBHRFRfRU5UUklFUwkJCTE2CiAKLSNkZWZpbmUgR0RUX0VOVFJJRVMgMTYKKy8qCisgKiBTZWdtZW50IHNlbGVjdG9yIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBhYm92ZSBlbnRyaWVzOgorICoKKyAqIE5vdGUsIHNlbGVjdG9ycyBhbHNvIG5lZWQgdG8gaGF2ZSBhIGNvcnJlY3QgUlBMLAorICogZXhwcmVzc2VkIHdpdGggdGhlICszIHZhbHVlIGZvciB1c2VyLXNwYWNlIHNlbGVjdG9yczoKKyAqLworI2RlZmluZSBfX0tFUk5FTDMyX0NTCQkJKEdEVF9FTlRSWV9LRVJORUwzMl9DUyo4KQorI2RlZmluZSBfX0tFUk5FTF9DUwkJCShHRFRfRU5UUllfS0VSTkVMX0NTKjgpCisjZGVmaW5lIF9fS0VSTkVMX0RTCQkJKEdEVF9FTlRSWV9LRVJORUxfRFMqOCkKKyNkZWZpbmUgX19VU0VSMzJfQ1MJCQkoR0RUX0VOVFJZX0RFRkFVTFRfVVNFUjMyX0NTKjggKyAzKQorI2RlZmluZSBfX1VTRVJfRFMJCQkoR0RUX0VOVFJZX0RFRkFVTFRfVVNFUl9EUyo4ICsgMykKKyNkZWZpbmUgX19VU0VSMzJfRFMJCQlfX1VTRVJfRFMKKyNkZWZpbmUgX19VU0VSX0NTCQkJKEdEVF9FTlRSWV9ERUZBVUxUX1VTRVJfQ1MqOCArIDMpCisjZGVmaW5lIF9fUEVSX0NQVV9TRUcJCQkoR0RUX0VOVFJZX1BFUl9DUFUqOCArIDMpCisKKy8qIFRMUyBpbmRleGVzIGZvciA2NC1iaXQgLSBoYXJkY29kZWQgaW4gYXJjaF9wcmN0bCgpOiAqLworI2RlZmluZSBGU19UTFMJCQkJMAorI2RlZmluZSBHU19UTFMJCQkJMQorCisjZGVmaW5lIEdTX1RMU19TRUwJCQkoKEdEVF9FTlRSWV9UTFNfTUlOK0dTX1RMUykqOCArIDMpCisjZGVmaW5lIEZTX1RMU19TRUwJCQkoKEdEVF9FTlRSWV9UTFNfTUlOK0ZTX1RMUykqOCArIDMpCiAKICNlbmRpZgogCi0jZGVmaW5lIF9fS0VSTkVMX0NTCShHRFRfRU5UUllfS0VSTkVMX0NTKjgpCi0jZGVmaW5lIF9fS0VSTkVMX0RTCShHRFRfRU5UUllfS0VSTkVMX0RTKjgpCi0jZGVmaW5lIF9fVVNFUl9EUwkoR0RUX0VOVFJZX0RFRkFVTFRfVVNFUl9EUyo4KzMpCi0jZGVmaW5lIF9fVVNFUl9DUwkoR0RUX0VOVFJZX0RFRkFVTFRfVVNFUl9DUyo4KzMpCiAjaWZuZGVmIENPTkZJR19QQVJBVklSVAotI2RlZmluZSBnZXRfa2VybmVsX3JwbCgpICAwCisjIGRlZmluZSBnZXRfa2VybmVsX3JwbCgpCQkwCiAjZW5kaWYKIAotI2RlZmluZSBJRFRfRU5UUklFUyAyNTYKLSNkZWZpbmUgTlVNX0VYQ0VQVElPTl9WRUNUT1JTIDMyCi0vKiBCaXRtYXNrIG9mIGV4Y2VwdGlvbiB2ZWN0b3JzIHdoaWNoIHB1c2ggYW4gZXJyb3IgY29kZSBvbiB0aGUgc3RhY2sgKi8KLSNkZWZpbmUgRVhDRVBUSU9OX0VSUkNPREVfTUFTSyAgMHgwMDAyN2QwMAotI2RlZmluZSBHRFRfU0laRSAoR0RUX0VOVFJJRVMgKiA4KQotI2RlZmluZSBHRFRfRU5UUllfVExTX0VOVFJJRVMgMwotI2RlZmluZSBUTFNfU0laRSAoR0RUX0VOVFJZX1RMU19FTlRSSUVTICogOCkKKyNkZWZpbmUgSURUX0VOVFJJRVMJCQkyNTYKKyNkZWZpbmUgTlVNX0VYQ0VQVElPTl9WRUNUT1JTCQkzMgorCisvKiBCaXRtYXNrIG9mIGV4Y2VwdGlvbiB2ZWN0b3JzIHdoaWNoIHB1c2ggYW4gZXJyb3IgY29kZSBvbiB0aGUgc3RhY2s6ICovCisjZGVmaW5lIEVYQ0VQVElPTl9FUlJDT0RFX01BU0sJCTB4MDAwMjdkMDAKKworI2RlZmluZSBHRFRfU0laRQkJCShHRFRfRU5UUklFUyo4KQorI2RlZmluZSBHRFRfRU5UUllfVExTX0VOVFJJRVMJCTMKKyNkZWZpbmUgVExTX1NJWkUJCQkoR0RUX0VOVFJZX1RMU19FTlRSSUVTKiA4KQogCiAjaWZkZWYgX19LRVJORUxfXwogI2lmbmRlZiBfX0FTU0VNQkxZX18KKwogZXh0ZXJuIGNvbnN0IGNoYXIgZWFybHlfaWR0X2hhbmRsZXJzW05VTV9FWENFUFRJT05fVkVDVE9SU11bMisyKzVdOwogI2lmZGVmIENPTkZJR19UUkFDSU5HCi0jZGVmaW5lIHRyYWNlX2Vhcmx5X2lkdF9oYW5kbGVycyBlYXJseV9pZHRfaGFuZGxlcnMKKyMgZGVmaW5lIHRyYWNlX2Vhcmx5X2lkdF9oYW5kbGVycyBlYXJseV9pZHRfaGFuZGxlcnMKICNlbmRpZgogCiAvKgpAQCAtMjI4LDM3ICsyNjAsMzAgQEAKIH0gd2hpbGUgKDApCiAKIC8qCi0gKiBTYXZlIGEgc2VnbWVudCByZWdpc3RlciBhd2F5CisgKiBTYXZlIGEgc2VnbWVudCByZWdpc3RlciBhd2F5OgogICovCiAjZGVmaW5lIHNhdmVzZWdtZW50KHNlZywgdmFsdWUpCQkJCVwKIAlhc20oIm1vdiAlJSIgI3NlZyAiLCUwIjoiPXIiICh2YWx1ZSkgOiA6ICJtZW1vcnkiKQogCiAvKgotICogeDg2XzMyIHVzZXIgZ3MgYWNjZXNzb3JzLgorICogeDg2LTMyIHVzZXIgR1MgYWNjZXNzb3JzOgogICovCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgotI2lmZGVmIENPTkZJR19YODZfMzJfTEFaWV9HUwotI2RlZmluZSBnZXRfdXNlcl9ncyhyZWdzKQkodTE2KSh7dW5zaWduZWQgbG9uZyB2OyBzYXZlc2VnbWVudChncywgdik7IHY7fSkKLSNkZWZpbmUgc2V0X3VzZXJfZ3MocmVncywgdikJbG9hZHNlZ21lbnQoZ3MsICh1bnNpZ25lZCBsb25nKSh2KSkKLSNkZWZpbmUgdGFza191c2VyX2dzKHRzaykJKCh0c2spLT50aHJlYWQuZ3MpCi0jZGVmaW5lIGxhenlfc2F2ZV9ncyh2KQkJc2F2ZXNlZ21lbnQoZ3MsICh2KSkKLSNkZWZpbmUgbGF6eV9sb2FkX2dzKHYpCQlsb2Fkc2VnbWVudChncywgKHYpKQotI2Vsc2UJLyogWDg2XzMyX0xBWllfR1MgKi8KLSNkZWZpbmUgZ2V0X3VzZXJfZ3MocmVncykJKHUxNikoKHJlZ3MpLT5ncykKLSNkZWZpbmUgc2V0X3VzZXJfZ3MocmVncywgdikJZG8geyAocmVncyktPmdzID0gKHYpOyB9IHdoaWxlICgwKQotI2RlZmluZSB0YXNrX3VzZXJfZ3ModHNrKQkodGFza19wdF9yZWdzKHRzayktPmdzKQotI2RlZmluZSBsYXp5X3NhdmVfZ3ModikJCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbGF6eV9sb2FkX2dzKHYpCQlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYJLyogWDg2XzMyX0xBWllfR1MgKi8KKyMgaWZkZWYgQ09ORklHX1g4Nl8zMl9MQVpZX0dTCisjICBkZWZpbmUgZ2V0X3VzZXJfZ3MocmVncykJCSh1MTYpKHsgdW5zaWduZWQgbG9uZyB2OyBzYXZlc2VnbWVudChncywgdik7IHY7IH0pCisjICBkZWZpbmUgc2V0X3VzZXJfZ3MocmVncywgdikJCWxvYWRzZWdtZW50KGdzLCAodW5zaWduZWQgbG9uZykodikpCisjICBkZWZpbmUgdGFza191c2VyX2dzKHRzaykJCSgodHNrKS0+dGhyZWFkLmdzKQorIyAgZGVmaW5lIGxhenlfc2F2ZV9ncyh2KQkJc2F2ZXNlZ21lbnQoZ3MsICh2KSkKKyMgIGRlZmluZSBsYXp5X2xvYWRfZ3ModikJCWxvYWRzZWdtZW50KGdzLCAodikpCisjIGVsc2UJLyogWDg2XzMyX0xBWllfR1MgKi8KKyMgIGRlZmluZSBnZXRfdXNlcl9ncyhyZWdzKQkJKHUxNikoKHJlZ3MpLT5ncykKKyMgIGRlZmluZSBzZXRfdXNlcl9ncyhyZWdzLCB2KQkJZG8geyAocmVncyktPmdzID0gKHYpOyB9IHdoaWxlICgwKQorIyAgZGVmaW5lIHRhc2tfdXNlcl9ncyh0c2spCQkodGFza19wdF9yZWdzKHRzayktPmdzKQorIyAgZGVmaW5lIGxhenlfc2F2ZV9ncyh2KQkJZG8geyB9IHdoaWxlICgwKQorIyAgZGVmaW5lIGxhenlfbG9hZF9ncyh2KQkJZG8geyB9IHdoaWxlICgwKQorIyBlbmRpZgkvKiBYODZfMzJfTEFaWV9HUyAqLwogI2VuZGlmCS8qIFg4Nl8zMiAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2xpbWl0KHVuc2lnbmVkIGxvbmcgc2VnbWVudCkKLXsKLQl1bnNpZ25lZCBsb25nIF9fbGltaXQ7Ci0JYXNtKCJsc2xsICUxLCUwIiA6ICI9ciIgKF9fbGltaXQpIDogInIiIChzZWdtZW50KSk7Ci0JcmV0dXJuIF9fbGltaXQgKyAxOwotfQotCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0dXAuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmgKaW5kZXggZmY0ZTdiMi4uZjY5ZTA2YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0dXAuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oCkBAIC02Niw2ICs2NiwxMSBAQAogICovCiBleHRlcm4gc3RydWN0IGJvb3RfcGFyYW1zIGJvb3RfcGFyYW1zOwogCitzdGF0aWMgaW5saW5lIGJvb2wga2FzbHJfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiAhIShib290X3BhcmFtcy5oZHIubG9hZGZsYWdzICYgS0FTTFJfRkxBRyk7Cit9CisKIC8qCiAgKiBEbyBOT1QgRVZFUiBsb29rIGF0IHRoZSBCSU9TIG1lbW9yeSBzaXplIGxvY2F0aW9uLgogICogSXQgZG9lcyBub3Qgd29yayBvbiBtYW55IG1hY2hpbmVzLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCmluZGV4IDlkZmNlNGUuLjZmZTZiMTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKQEAgLTU3LDkgKzU3LDkgQEAKIAl1bnNpZ25lZCBsb25nIGlwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgc2hvcnQgY3M7Ci0JdW5zaWduZWQgc2hvcnQgZ3M7Ci0JdW5zaWduZWQgc2hvcnQgZnM7Ci0JdW5zaWduZWQgc2hvcnQgX19wYWQwOworCXVuc2lnbmVkIHNob3J0IF9fcGFkMjsJLyogV2FzIGNhbGxlZCBncywgYnV0IHdhcyBhbHdheXMgemVyby4gKi8KKwl1bnNpZ25lZCBzaG9ydCBfX3BhZDE7CS8qIFdhcyBjYWxsZWQgZnMsIGJ1dCB3YXMgYWx3YXlzIHplcm8uICovCisJdW5zaWduZWQgc2hvcnQgc3M7CiAJdW5zaWduZWQgbG9uZyBlcnI7CiAJdW5zaWduZWQgbG9uZyB0cmFwbm87CiAJdW5zaWduZWQgbG9uZyBvbGRtYXNrOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2lnaGFuZGxpbmcuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NpZ2hhbmRsaW5nLmgKaW5kZXggN2E5NTgxNi4uODlkYjQ2NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc2lnaGFuZGxpbmcuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zaWdoYW5kbGluZy5oCkBAIC0xMyw5ICsxMyw3IEBACiAJCQkgWDg2X0VGTEFHU19DRiB8IFg4Nl9FRkxBR1NfUkYpCiAKIHZvaWQgc2lnbmFsX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB2b2lkIF9fdXNlciAqZnJhbWUsIGNoYXIgKndoZXJlKTsKLQotaW50IHJlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnBheCk7CitpbnQgcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3Qgc2lnY29udGV4dCBfX3VzZXIgKnNjKTsKIGludCBzZXR1cF9zaWdjb250ZXh0KHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MsIHZvaWQgX191c2VyICpmcHN0YXRlLAogCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIG1hc2spOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbWFwLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbWFwLmgKaW5kZXggOGQzMTIwZi4uYmE2NjVlYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc21hcC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NtYXAuaApAQCAtMjcsMjMgKzI3LDExIEBACiAKICNpZmRlZiBDT05GSUdfWDg2X1NNQVAKIAotI2RlZmluZSBBU01fQ0xBQwkJCQkJCQlcCi0JNjYxOiBBU01fTk9QMyA7CQkJCQkJCVwKLQkucHVzaHNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCAiYXgiIDsJCQlcCi0JNjYyOiBfX0FTTV9DTEFDIDsJCQkJCQlcCi0JLnBvcHNlY3Rpb24gOwkJCQkJCQlcCi0JLnB1c2hzZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsICJhIiA7CQkJCVwKLQlhbHRpbnN0cnVjdGlvbl9lbnRyeSA2NjFiLCA2NjJiLCBYODZfRkVBVFVSRV9TTUFQLCAzLCAzIDsJXAotCS5wb3BzZWN0aW9uCisjZGVmaW5lIEFTTV9DTEFDIFwKKwlBTFRFUk5BVElWRSAiIiwgX19zdHJpbmdpZnkoX19BU01fQ0xBQyksIFg4Nl9GRUFUVVJFX1NNQVAKIAotI2RlZmluZSBBU01fU1RBQwkJCQkJCQlcCi0JNjYxOiBBU01fTk9QMyA7CQkJCQkJCVwKLQkucHVzaHNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCAiYXgiIDsJCQlcCi0JNjYyOiBfX0FTTV9TVEFDIDsJCQkJCQlcCi0JLnBvcHNlY3Rpb24gOwkJCQkJCQlcCi0JLnB1c2hzZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsICJhIiA7CQkJCVwKLQlhbHRpbnN0cnVjdGlvbl9lbnRyeSA2NjFiLCA2NjJiLCBYODZfRkVBVFVSRV9TTUFQLCAzLCAzIDsJXAotCS5wb3BzZWN0aW9uCisjZGVmaW5lIEFTTV9TVEFDIFwKKwlBTFRFUk5BVElWRSAiIiwgX19zdHJpbmdpZnkoX19BU01fU1RBQyksIFg4Nl9GRUFUVVJFX1NNQVAKIAogI2Vsc2UgLyogQ09ORklHX1g4Nl9TTUFQICovCiAKQEAgLTYxLDIwICs0OSwyMCBAQAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGNsYWModm9pZCkKIHsKIAkvKiBOb3RlOiBhIGJhcnJpZXIgaXMgaW1wbGljaXQgaW4gYWx0ZXJuYXRpdmUoKSAqLwotCWFsdGVybmF0aXZlKEFTTV9OT1AzLCBfX3N0cmluZ2lmeShfX0FTTV9DTEFDKSwgWDg2X0ZFQVRVUkVfU01BUCk7CisJYWx0ZXJuYXRpdmUoIiIsIF9fc3RyaW5naWZ5KF9fQVNNX0NMQUMpLCBYODZfRkVBVFVSRV9TTUFQKTsKIH0KIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHN0YWModm9pZCkKIHsKIAkvKiBOb3RlOiBhIGJhcnJpZXIgaXMgaW1wbGljaXQgaW4gYWx0ZXJuYXRpdmUoKSAqLwotCWFsdGVybmF0aXZlKEFTTV9OT1AzLCBfX3N0cmluZ2lmeShfX0FTTV9TVEFDKSwgWDg2X0ZFQVRVUkVfU01BUCk7CisJYWx0ZXJuYXRpdmUoIiIsIF9fc3RyaW5naWZ5KF9fQVNNX1NUQUMpLCBYODZfRkVBVFVSRV9TTUFQKTsKIH0KIAogLyogVGhlc2UgbWFjcm9zIGNhbiBiZSB1c2VkIGluIGFzbSgpIHN0YXRlbWVudHMgKi8KICNkZWZpbmUgQVNNX0NMQUMgXAotCUFMVEVSTkFUSVZFKEFTTV9OT1AzLCBfX3N0cmluZ2lmeShfX0FTTV9DTEFDKSwgWDg2X0ZFQVRVUkVfU01BUCkKKwlBTFRFUk5BVElWRSgiIiwgX19zdHJpbmdpZnkoX19BU01fQ0xBQyksIFg4Nl9GRUFUVVJFX1NNQVApCiAjZGVmaW5lIEFTTV9TVEFDIFwKLQlBTFRFUk5BVElWRShBU01fTk9QMywgX19zdHJpbmdpZnkoX19BU01fU1RBQyksIFg4Nl9GRUFUVVJFX1NNQVApCisJQUxURVJOQVRJVkUoIiIsIF9fc3RyaW5naWZ5KF9fQVNNX1NUQUMpLCBYODZfRkVBVFVSRV9TTUFQKQogCiAjZWxzZSAvKiBDT05GSUdfWDg2X1NNQVAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaAppbmRleCA4Y2QxY2MzLi4xN2E4ZGNlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zbXAuaApAQCAtMTUwLDEyICsxNTAsMTMgQEAKIH0KIAogdm9pZCBjcHVfZGlzYWJsZV9jb21tb24odm9pZCk7Ci12b2lkIGNwdV9kaWVfY29tbW9uKHVuc2lnbmVkIGludCBjcHUpOwogdm9pZCBuYXRpdmVfc21wX3ByZXBhcmVfYm9vdF9jcHUodm9pZCk7CiB2b2lkIG5hdGl2ZV9zbXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cyk7CiB2b2lkIG5hdGl2ZV9zbXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cyk7Cit2b2lkIGNvbW1vbl9jcHVfdXAodW5zaWduZWQgaW50IGNwdW51bSwgc3RydWN0IHRhc2tfc3RydWN0ICp0aWRsZSk7CiBpbnQgbmF0aXZlX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1bnVtLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRpZGxlKTsKIGludCBuYXRpdmVfY3B1X2Rpc2FibGUodm9pZCk7CitpbnQgY29tbW9uX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSk7CiB2b2lkIG5hdGl2ZV9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpOwogdm9pZCBuYXRpdmVfcGxheV9kZWFkKHZvaWQpOwogdm9pZCBwbGF5X2RlYWRfY29tbW9uKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BlY2lhbF9pbnNucy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BlY2lhbF9pbnNucy5oCmluZGV4IDZhNGIwMGYuLmFlYjQ2NjZlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGVjaWFsX2luc25zLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BlY2lhbF9pbnNucy5oCkBAIC00LDYgKzQsOCBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCisjaW5jbHVkZSA8YXNtL25vcHMuaD4KKwogc3RhdGljIGlubGluZSB2b2lkIG5hdGl2ZV9jbHRzKHZvaWQpCiB7CiAJYXNtIHZvbGF0aWxlKCJjbHRzIik7CkBAIC0xOTksNiArMjAxLDI4IEBACiAJCSAgICAgICAiK20iICgqKHZvbGF0aWxlIGNoYXIgX19mb3JjZSAqKV9fcCkpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgY2x3Yih2b2xhdGlsZSB2b2lkICpfX3ApCit7CisJdm9sYXRpbGUgc3RydWN0IHsgY2hhciB4WzY0XTsgfSAqcCA9IF9fcDsKKworCWFzbSB2b2xhdGlsZShBTFRFUk5BVElWRV8yKAorCQkiLmJ5dGUgIiBfX3N0cmluZ2lmeShOT1BfRFNfUFJFRklYKSAiOyBjbGZsdXNoICglW3BheF0pIiwKKwkJIi5ieXRlIDB4NjY7IGNsZmx1c2ggKCVbcGF4XSkiLCAvKiBjbGZsdXNob3B0ICglJXJheCkgKi8KKwkJWDg2X0ZFQVRVUkVfQ0xGTFVTSE9QVCwKKwkJIi5ieXRlIDB4NjYsIDB4MGYsIDB4YWUsIDB4MzAiLCAgLyogY2x3YiAoJSVyYXgpICovCisJCVg4Nl9GRUFUVVJFX0NMV0IpCisJCTogW3BdICIrbSIgKCpwKQorCQk6IFtwYXhdICJhIiAocCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGNvbW1pdF9zZmVuY2Uodm9pZCkKK3sKKwlhbHRlcm5hdGl2ZShBU01fTk9QNywKKwkJICAgICIuYnl0ZSAweDY2LCAweDBmLCAweGFlLCAweGY4XG5cdCIgLyogcGNvbW1pdCAqLworCQkgICAgInNmZW5jZSIsCisJCSAgICBYODZfRkVBVFVSRV9QQ09NTUlUKTsKK30KKwogI2RlZmluZSBub3AoKSBhc20gdm9sYXRpbGUgKCJub3AiKQogCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IDFkNGU0ZjIuLmI0YmRlYzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMTMsMTkgKzEzLDQ0IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKIC8qCisgKiBUT1BfT0ZfS0VSTkVMX1NUQUNLX1BBRERJTkcgaXMgYSBudW1iZXIgb2YgdW51c2VkIGJ5dGVzIHRoYXQgd2UKKyAqIHJlc2VydmUgYXQgdGhlIHRvcCBvZiB0aGUga2VybmVsIHN0YWNrLiAgV2UgZG8gaXQgYmVjYXVzZSBvZiBhIG5hc3R5CisgKiAzMi1iaXQgY29ybmVyIGNhc2UuICBPbiB4ODZfMzIsIHRoZSBoYXJkd2FyZSBzdGFjayBmcmFtZSBpcworICogdmFyaWFibGUtbGVuZ3RoLiAgRXhjZXB0IGZvciB2bTg2IG1vZGUsIHN0cnVjdCBwdF9yZWdzIGFzc3VtZXMgYQorICogbWF4aW11bS1sZW5ndGggZnJhbWUuICBJZiB3ZSBlbnRlciBmcm9tIENQTCAwLCB0aGUgdG9wIDggYnl0ZXMgb2YKKyAqIHB0X3JlZ3MgZG9uJ3QgYWN0dWFsbHkgZXhpc3QuICBPcmRpbmFyaWx5IHRoaXMgZG9lc24ndCBtYXR0ZXIsIGJ1dCBpdAorICogZG9lcyBpbiBhdCBsZWFzdCBvbmUgY2FzZToKKyAqCisgKiBJZiB3ZSB0YWtlIGFuIE5NSSBlYXJseSBlbm91Z2ggaW4gU1lTRU5URVIsIHRoZW4gd2UgY2FuIGVuZCB1cCB3aXRoCisgKiBwdF9yZWdzIHRoYXQgZXh0ZW5kcyBhYm92ZSBzcDAuICBPbiB0aGUgd2F5IG91dCwgaW4gdGhlIGVzcGZpeCBjb2RlLAorICogd2UgY2FuIHJlYWQgdGhlIHNhdmVkIFNTIHZhbHVlLCBidXQgdGhhdCB2YWx1ZSB3aWxsIGJlIGFib3ZlIHNwMC4KKyAqIFdpdGhvdXQgdGhpcyBvZmZzZXQsIHRoYXQgY2FuIHJlc3VsdCBpbiBhIHBhZ2UgZmF1bHQuICAoV2UgYXJlCisgKiBjYXJlZnVsIHRoYXQsIGluIHRoaXMgY2FzZSwgdGhlIHZhbHVlIHdlIHJlYWQgZG9lc24ndCBtYXR0ZXIuKQorICoKKyAqIEluIHZtODYgbW9kZSwgdGhlIGhhcmR3YXJlIGZyYW1lIGlzIG11Y2ggbG9uZ2VyIHN0aWxsLCBidXQgd2UgbmVpdGhlcgorICogYWNjZXNzIHRoZSBleHRyYSBtZW1iZXJzIGZyb20gTk1JIGNvbnRleHQsIG5vciBkbyB3ZSB3cml0ZSBzdWNoIGEKKyAqIGZyYW1lIGF0IHNwMCBhdCBhbGwuCisgKgorICogeDg2XzY0IGhhcyBhIGZpeGVkLWxlbmd0aCBzdGFjayBmcmFtZS4KKyAqLworI2lmZGVmIENPTkZJR19YODZfMzIKKyMgZGVmaW5lIFRPUF9PRl9LRVJORUxfU1RBQ0tfUEFERElORyA4CisjZWxzZQorIyBkZWZpbmUgVE9QX09GX0tFUk5FTF9TVEFDS19QQURESU5HIDAKKyNlbmRpZgorCisvKgogICogbG93IGxldmVsIHRhc2sgZGF0YSB0aGF0IGVudHJ5LlMgbmVlZHMgaW1tZWRpYXRlIGFjY2VzcyB0bwogICogLSB0aGlzIHN0cnVjdCBzaG91bGQgZml0IGVudGlyZWx5IGluc2lkZSBvZiBvbmUgY2FjaGUgbGluZQogICogLSB0aGlzIHN0cnVjdCBzaGFyZXMgdGhlIHN1cGVydmlzb3Igc3RhY2sgcGFnZXMKICAqLwogI2lmbmRlZiBfX0FTU0VNQkxZX18KIHN0cnVjdCB0YXNrX3N0cnVjdDsKLXN0cnVjdCBleGVjX2RvbWFpbjsKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAKIHN0cnVjdCB0aHJlYWRfaW5mbyB7CiAJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOwkJLyogbWFpbiB0YXNrIHN0cnVjdHVyZSAqLwotCXN0cnVjdCBleGVjX2RvbWFpbgkqZXhlY19kb21haW47CS8qIGV4ZWN1dGlvbiBkb21haW4gKi8KIAlfX3UzMgkJCWZsYWdzOwkJLyogbG93IGxldmVsIGZsYWdzICovCiAJX191MzIJCQlzdGF0dXM7CQkvKiB0aHJlYWQgc3luY2hyb25vdXMgZmxhZ3MgKi8KIAlfX3UzMgkJCWNwdTsJCS8qIGN1cnJlbnQgQ1BVICovCkBAIC0zOSw3ICs2NCw2IEBACiAjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKIHsJCQkJCQlcCiAJLnRhc2sJCT0gJnRzaywJCQlcCi0JLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKIAkuZmxhZ3MJCT0gMCwJCQlcCiAJLmNwdQkJPSAwLAkJCVwKIAkuc2F2ZWRfcHJlZW1wdF9jb3VudCA9IElOSVRfUFJFRU1QVF9DT1VOVCwJXApAQCAtMTQ1LDcgKzE2OSw2IEBACiAjZGVmaW5lIF9USUZfV09SS19DVFhTV19ORVhUIChfVElGX1dPUktfQ1RYU1cpCiAKICNkZWZpbmUgU1RBQ0tfV0FSTgkJKFRIUkVBRF9TSVpFLzgpCi0jZGVmaW5lIEtFUk5FTF9TVEFDS19PRkZTRVQJKDUqKEJJVFNfUEVSX0xPTkcvOCkpCiAKIC8qCiAgKiBtYWNyb3MvZnVuY3Rpb25zIGZvciBnYWluaW5nIGFjY2VzcyB0byB0aGUgdGhyZWFkIGluZm9ybWF0aW9uIHN0cnVjdHVyZQpAQCAtMTU4LDEwICsxODEsNyBAQAogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0aHJlYWRfaW5mbyAqY3VycmVudF90aHJlYWRfaW5mbyh2b2lkKQogewotCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGk7Ci0JdGkgPSAodm9pZCAqKSh0aGlzX2NwdV9yZWFkX3N0YWJsZShrZXJuZWxfc3RhY2spICsKLQkJICAgICAgS0VSTkVMX1NUQUNLX09GRlNFVCAtIFRIUkVBRF9TSVpFKTsKLQlyZXR1cm4gdGk7CisJcmV0dXJuIChzdHJ1Y3QgdGhyZWFkX2luZm8gKikoY3VycmVudF90b3Bfb2Zfc3RhY2soKSAtIFRIUkVBRF9TSVpFKTsKIH0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGN1cnJlbnRfc3RhY2tfcG9pbnRlcih2b2lkKQpAQCAtMTc3LDE2ICsxOTcsMzcgQEAKIAogI2Vsc2UgLyogIV9fQVNTRU1CTFlfXyAqLwogCi0vKiBob3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQVNNICovCisvKiBMb2FkIHRocmVhZF9pbmZvIGFkZHJlc3MgaW50byAicmVnIiAqLwogI2RlZmluZSBHRVRfVEhSRUFEX0lORk8ocmVnKSBcCiAJX0FTTV9NT1YgUEVSX0NQVV9WQVIoa2VybmVsX3N0YWNrKSxyZWcgOyBcCi0JX0FTTV9TVUIgJChUSFJFQURfU0laRS1LRVJORUxfU1RBQ0tfT0ZGU0VUKSxyZWcgOworCV9BU01fU1VCICQoVEhSRUFEX1NJWkUpLHJlZyA7CiAKIC8qCi0gKiBTYW1lIGlmIFBFUl9DUFVfVkFSKGtlcm5lbF9zdGFjaykgaXMsIHBlcmhhcHMgd2l0aCBzb21lIG9mZnNldCwgYWxyZWFkeSBpbgotICogYSBjZXJ0YWluIHJlZ2lzdGVyICh0byBiZSB1c2VkIGluIGFzc2VtYmxlciBtZW1vcnkgb3BlcmFuZHMpLgorICogQVNNIG9wZXJhbmQgd2hpY2ggZXZhbHVhdGVzIHRvIGEgJ3RocmVhZF9pbmZvJyBhZGRyZXNzIG9mCisgKiB0aGUgY3VycmVudCB0YXNrLCBpZiBpdCBpcyBrbm93biB0aGF0ICJyZWciIGlzIGV4YWN0bHkgIm9mZiIKKyAqIGJ5dGVzIGJlbG93IHRoZSB0b3Agb2YgdGhlIHN0YWNrIGN1cnJlbnRseS4KKyAqCisgKiAoIFRoZSBrZXJuZWwgc3RhY2sncyBzaXplIGlzIGtub3duIGF0IGJ1aWxkIHRpbWUsIGl0IGlzIHVzdWFsbHkKKyAqICAgMiBvciA0IHBhZ2VzLCBhbmQgdGhlIGJvdHRvbSAgb2YgdGhlIGtlcm5lbCBzdGFjayBjb250YWlucworICogICB0aGUgdGhyZWFkX2luZm8gc3RydWN0dXJlLiBTbyB0byBhY2Nlc3MgdGhlIHRocmVhZF9pbmZvIHZlcnkKKyAqICAgcXVpY2tseSBmcm9tIGFzc2VtYmx5IGNvZGUgd2UgY2FuIGNhbGN1bGF0ZSBkb3duIGZyb20gdGhlCisgKiAgIHRvcCBvZiB0aGUga2VybmVsIHN0YWNrIHRvIHRoZSBib3R0b20sIHVzaW5nIGNvbnN0YW50LAorICogICBidWlsZC10aW1lIGNhbGN1bGF0aW9ucyBvbmx5LiApCisgKgorICogRm9yIGV4YW1wbGUsIHRvIGZldGNoIHRoZSBjdXJyZW50IHRocmVhZF9pbmZvLT5mbGFncyB2YWx1ZSBpbnRvICVlYXgKKyAqIG9uIHg4Ni02NCBkZWZjb25maWcga2VybmVscywgaW4gc3lzY2FsbCBlbnRyeSBjb2RlIHdoZXJlIFJTUCBpcworICogY3VycmVudGx5IGF0IGV4YWN0bHkgU0laRU9GX1BUUkVHUyBieXRlcyBhd2F5IGZyb20gdGhlIHRvcCBvZiB0aGUKKyAqIHN0YWNrOgorICoKKyAqICAgICAgbW92IEFTTV9USFJFQURfSU5GTyhUSV9mbGFncywgJXJzcCwgU0laRU9GX1BUUkVHUyksICVlYXgKKyAqCisgKiB3aWxsIHRyYW5zbGF0ZSB0bzoKKyAqCisgKiAgICAgIDhiIDg0IDI0IGI4IGMwIGZmIGZmICAgICAgbW92ICAgIC0weDNmNDgoJXJzcCksICVlYXgKKyAqCisgKiB3aGljaCBpcyBiZWxvdyB0aGUgY3VycmVudCBSU1AgYnkgYWxtb3N0IDE2Sy4KICAqLwotI2RlZmluZSBUSFJFQURfSU5GTyhyZWcsIG9mZikgS0VSTkVMX1NUQUNLX09GRlNFVCsob2ZmKS1USFJFQURfU0laRShyZWcpCisjZGVmaW5lIEFTTV9USFJFQURfSU5GTyhmaWVsZCwgcmVnLCBvZmYpICgoZmllbGQpKyhvZmYpLVRIUkVBRF9TSVpFKShyZWcpCiAKICNlbmRpZgogCkBAIC0yMzYsNiArMjc3LDE2IEBACiAjZW5kaWYKIAlyZXR1cm4gZmFsc2U7CiB9CisKKy8qCisgKiBGb3JjZSBzeXNjYWxsIHJldHVybiB2aWEgSVJFVCBieSBtYWtpbmcgaXQgbG9vayBhcyBpZiB0aGVyZSB3YXMKKyAqIHNvbWUgd29yayBwZW5kaW5nLiBJUkVUIGlzIG91ciBtb3N0IGNhcGFibGUgKGJ1dCBzbG93ZXN0KSBzeXNjYWxsCisgKiByZXR1cm4gcGF0aCwgd2hpY2ggaXMgYWJsZSB0byByZXN0b3JlIG1vZGlmaWVkIFNTLCBDUyBhbmQgY2VydGFpbgorICogRUZMQUdTIHZhbHVlcyB0aGF0IG90aGVyIChmYXN0KSBzeXNjYWxsIHJldHVybiBpbnN0cnVjdGlvbnMKKyAqIGFyZSBub3QgYWJsZSB0byByZXN0b3JlIHByb3Blcmx5LgorICovCisjZGVmaW5lIGZvcmNlX2lyZXQoKSBzZXRfdGhyZWFkX2ZsYWcoVElGX05PVElGWV9SRVNVTUUpCisKICNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzXzY0LmgKaW5kZXggMTJhMjZiOS4uZjJmOWIzOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzc182NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3NfNjQuaApAQCAtMjMxLDYgKzIzMSw2IEBACiB9CiAKIHVuc2lnbmVkIGxvbmcKLWNvcHlfdXNlcl9oYW5kbGVfdGFpbChjaGFyICp0bywgY2hhciAqZnJvbSwgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCB6ZXJvcmVzdCk7Citjb3B5X3VzZXJfaGFuZGxlX3RhaWwoY2hhciAqdG8sIGNoYXIgKmZyb20sIHVuc2lnbmVkIGxlbik7CiAKICNlbmRpZiAvKiBfQVNNX1g4Nl9VQUNDRVNTXzY0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vYm9vdHBhcmFtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL2Jvb3RwYXJhbS5oCmluZGV4IDQ0ZTZkZDcuLmFiNDU2ZGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vYm9vdHBhcmFtLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9ib290cGFyYW0uaApAQCAtNyw3ICs3LDYgQEAKICNkZWZpbmUgU0VUVVBfRFRCCQkJMgogI2RlZmluZSBTRVRVUF9QQ0kJCQkzCiAjZGVmaW5lIFNFVFVQX0VGSQkJCTQKLSNkZWZpbmUgU0VUVVBfS0FTTFIJCQk1CiAKIC8qIHJhbV9zaXplIGZsYWdzICovCiAjZGVmaW5lIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSwkweDA3RkYKQEAgLTE2LDYgKzE1LDcgQEAKIAogLyogbG9hZGZsYWdzICovCiAjZGVmaW5lIExPQURFRF9ISUdICSgxPDwwKQorI2RlZmluZSBLQVNMUl9GTEFHCSgxPDwxKQogI2RlZmluZSBRVUlFVF9GTEFHCSgxPDw1KQogI2RlZmluZSBLRUVQX1NFR01FTlRTCSgxPDw2KQogI2RlZmluZSBDQU5fVVNFX0hFQVAJKDE8PDcpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21zci1pbmRleC5oIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9tc3ItaW5kZXguaAppbmRleCAzY2UwNzkxLi4xYTRlYWU2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL21zci1pbmRleC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vbXNyLWluZGV4LmgKQEAgLTc0LDYgKzc0LDI0IEBACiAjZGVmaW5lIE1TUl9JQTMyX1BFUkZfQ0FQQUJJTElUSUVTCTB4MDAwMDAzNDUKICNkZWZpbmUgTVNSX1BFQlNfTERfTEFUX1RIUkVTSE9MRAkweDAwMDAwM2Y2CiAKKyNkZWZpbmUgTVNSX0lBMzJfUlRJVF9DVEwJCTB4MDAwMDA1NzAKKyNkZWZpbmUgUlRJVF9DVExfVFJBQ0VFTgkJQklUKDApCisjZGVmaW5lIFJUSVRfQ1RMX09TCQkJQklUKDIpCisjZGVmaW5lIFJUSVRfQ1RMX1VTUgkJCUJJVCgzKQorI2RlZmluZSBSVElUX0NUTF9DUjNFTgkJCUJJVCg3KQorI2RlZmluZSBSVElUX0NUTF9UT1BBCQkJQklUKDgpCisjZGVmaW5lIFJUSVRfQ1RMX1RTQ19FTgkJCUJJVCgxMCkKKyNkZWZpbmUgUlRJVF9DVExfRElTUkVUQwkJQklUKDExKQorI2RlZmluZSBSVElUX0NUTF9CUkFOQ0hfRU4JCUJJVCgxMykKKyNkZWZpbmUgTVNSX0lBMzJfUlRJVF9TVEFUVVMJCTB4MDAwMDA1NzEKKyNkZWZpbmUgUlRJVF9TVEFUVVNfQ09OVEVYVEVOCQlCSVQoMSkKKyNkZWZpbmUgUlRJVF9TVEFUVVNfVFJJR0dFUkVOCQlCSVQoMikKKyNkZWZpbmUgUlRJVF9TVEFUVVNfRVJST1IJCUJJVCg0KQorI2RlZmluZSBSVElUX1NUQVRVU19TVE9QUEVECQlCSVQoNSkKKyNkZWZpbmUgTVNSX0lBMzJfUlRJVF9DUjNfTUFUQ0gJCTB4MDAwMDA1NzIKKyNkZWZpbmUgTVNSX0lBMzJfUlRJVF9PVVRQVVRfQkFTRQkweDAwMDAwNTYwCisjZGVmaW5lIE1TUl9JQTMyX1JUSVRfT1VUUFVUX01BU0sJMHgwMDAwMDU2MQorCiAjZGVmaW5lIE1TUl9NVFJSZml4NjRLXzAwMDAwCQkweDAwMDAwMjUwCiAjZGVmaW5lIE1TUl9NVFJSZml4MTZLXzgwMDAwCQkweDAwMDAwMjU4CiAjZGVmaW5lIE1TUl9NVFJSZml4MTZLX0EwMDAwCQkweDAwMDAwMjU5CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS1hYmkuaCBiL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vcHRyYWNlLWFiaS5oCmluZGV4IDdiMGE1NWEuLjU4MGFlZTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vcHRyYWNlLWFiaS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vcHRyYWNlLWFiaS5oCkBAIC0yNSwxMyArMjUsMTcgQEAKICNlbHNlIC8qIF9faTM4Nl9fICovCiAKICNpZiBkZWZpbmVkKF9fQVNTRU1CTFlfXykgfHwgZGVmaW5lZChfX0ZSQU1FX09GRlNFVFMpCisvKgorICogQyBBQkkgc2F5cyB0aGVzZSByZWdzIGFyZSBjYWxsZWUtcHJlc2VydmVkLiBUaGV5IGFyZW4ndCBzYXZlZCBvbiBrZXJuZWwgZW50cnkKKyAqIHVubGVzcyBzeXNjYWxsIG5lZWRzIGEgY29tcGxldGUsIGZ1bGx5IGZpbGxlZCAic3RydWN0IHB0X3JlZ3MiLgorICovCiAjZGVmaW5lIFIxNSAwCiAjZGVmaW5lIFIxNCA4CiAjZGVmaW5lIFIxMyAxNgogI2RlZmluZSBSMTIgMjQKICNkZWZpbmUgUkJQIDMyCiAjZGVmaW5lIFJCWCA0MAotLyogYXJndW1lbnRzOiBpbnRlcnJ1cHRzL25vbiB0cmFjaW5nIHN5c2NhbGxzIG9ubHkgc2F2ZSB1cCB0byBoZXJlKi8KKy8qIFRoZXNlIHJlZ3MgYXJlIGNhbGxlZS1jbG9iYmVyZWQuIEFsd2F5cyBzYXZlZCBvbiBrZXJuZWwgZW50cnkuICovCiAjZGVmaW5lIFIxMSA0OAogI2RlZmluZSBSMTAgNTYKICNkZWZpbmUgUjkgNjQKQEAgLTQxLDE1ICs0NSwxNyBAQAogI2RlZmluZSBSRFggOTYKICNkZWZpbmUgUlNJIDEwNAogI2RlZmluZSBSREkgMTEyCi0jZGVmaW5lIE9SSUdfUkFYIDEyMCAgICAgICAvKiA9IEVSUk9SICovCi0vKiBlbmQgb2YgYXJndW1lbnRzICovCi0vKiBjcHUgZXhjZXB0aW9uIGZyYW1lIG9yIHVuZGVmaW5lZCBpbiBjYXNlIG9mIGZhc3Qgc3lzY2FsbC4gKi8KKy8qCisgKiBPbiBzeXNjYWxsIGVudHJ5LCB0aGlzIGlzIHN5c2NhbGwjLiBPbiBDUFUgZXhjZXB0aW9uLCB0aGlzIGlzIGVycm9yIGNvZGUuCisgKiBPbiBodyBpbnRlcnJ1cHQsIGl0J3MgSVJRIG51bWJlcjoKKyAqLworI2RlZmluZSBPUklHX1JBWCAxMjAKKy8qIFJldHVybiBmcmFtZSBmb3IgaXJldHEgKi8KICNkZWZpbmUgUklQIDEyOAogI2RlZmluZSBDUyAxMzYKICNkZWZpbmUgRUZMQUdTIDE0NAogI2RlZmluZSBSU1AgMTUyCiAjZGVmaW5lIFNTIDE2MAotI2RlZmluZSBBUkdPRkZTRVQgUjExCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAKIC8qIHRvcCBvZiBzdGFjayBwYWdlICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS5oIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS9wdHJhY2UuaAppbmRleCBhYzRiOWFhLi5iYzE2MTE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3B0cmFjZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vcHRyYWNlLmgKQEAgLTQxLDEzICs0MSwxNyBAQAogI2lmbmRlZiBfX0tFUk5FTF9fCiAKIHN0cnVjdCBwdF9yZWdzIHsKKy8qCisgKiBDIEFCSSBzYXlzIHRoZXNlIHJlZ3MgYXJlIGNhbGxlZS1wcmVzZXJ2ZWQuIFRoZXkgYXJlbid0IHNhdmVkIG9uIGtlcm5lbCBlbnRyeQorICogdW5sZXNzIHN5c2NhbGwgbmVlZHMgYSBjb21wbGV0ZSwgZnVsbHkgZmlsbGVkICJzdHJ1Y3QgcHRfcmVncyIuCisgKi8KIAl1bnNpZ25lZCBsb25nIHIxNTsKIAl1bnNpZ25lZCBsb25nIHIxNDsKIAl1bnNpZ25lZCBsb25nIHIxMzsKIAl1bnNpZ25lZCBsb25nIHIxMjsKIAl1bnNpZ25lZCBsb25nIHJicDsKIAl1bnNpZ25lZCBsb25nIHJieDsKLS8qIGFyZ3VtZW50czogbm9uIGludGVycnVwdHMvbm9uIHRyYWNpbmcgc3lzY2FsbHMgb25seSBzYXZlIHVwIHRvIGhlcmUqLworLyogVGhlc2UgcmVncyBhcmUgY2FsbGVlLWNsb2JiZXJlZC4gQWx3YXlzIHNhdmVkIG9uIGtlcm5lbCBlbnRyeS4gKi8KIAl1bnNpZ25lZCBsb25nIHIxMTsKIAl1bnNpZ25lZCBsb25nIHIxMDsKIAl1bnNpZ25lZCBsb25nIHI5OwpAQCAtNTcsOSArNjEsMTIgQEAKIAl1bnNpZ25lZCBsb25nIHJkeDsKIAl1bnNpZ25lZCBsb25nIHJzaTsKIAl1bnNpZ25lZCBsb25nIHJkaTsKKy8qCisgKiBPbiBzeXNjYWxsIGVudHJ5LCB0aGlzIGlzIHN5c2NhbGwjLiBPbiBDUFUgZXhjZXB0aW9uLCB0aGlzIGlzIGVycm9yIGNvZGUuCisgKiBPbiBodyBpbnRlcnJ1cHQsIGl0J3MgSVJRIG51bWJlcjoKKyAqLwogCXVuc2lnbmVkIGxvbmcgb3JpZ19yYXg7Ci0vKiBlbmQgb2YgYXJndW1lbnRzICovCi0vKiBjcHUgZXhjZXB0aW9uIGZyYW1lIG9yIHVuZGVmaW5lZCAqLworLyogUmV0dXJuIGZyYW1lIGZvciBpcmV0cSAqLwogCXVuc2lnbmVkIGxvbmcgcmlwOwogCXVuc2lnbmVkIGxvbmcgY3M7CiAJdW5zaWduZWQgbG9uZyBlZmxhZ3M7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3NpZ2NvbnRleHQuaCBiL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vc2lnY29udGV4dC5oCmluZGV4IGQ4YjlmOTAuLjE2ZGM0ZTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vc2lnY29udGV4dC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vc2lnY29udGV4dC5oCkBAIC0xNzcsOSArMTc3LDI0IEBACiAJX191NjQgcmlwOwogCV9fdTY0IGVmbGFnczsJCS8qIFJGTEFHUyAqLwogCV9fdTE2IGNzOwotCV9fdTE2IGdzOwotCV9fdTE2IGZzOwotCV9fdTE2IF9fcGFkMDsKKworCS8qCisJICogUHJpb3IgdG8gMi41LjY0ICgiW1BBVENIXSB4ODYtNjQgdXBkYXRlcyBmb3IgMi41LjY0LWJrMyIpLAorCSAqIExpbnV4IHNhdmVkIGFuZCByZXN0b3JlZCBmcyBhbmQgZ3MgaW4gdGhlc2Ugc2xvdHMuICBUaGlzCisJICogd2FzIGNvdW50ZXJwcm9kdWN0aXZlLCBhcyBmc2Jhc2UgYW5kIGdzYmFzZSB3ZXJlIG5ldmVyCisJICogc2F2ZWQsIHNvIGFyY2hfcHJjdGwgd2FzIHByZXN1bWFibHkgdW5yZWxpYWJsZS4KKwkgKgorCSAqIElmIHRoZXNlIHNsb3RzIGFyZSBldmVyIG5lZWRlZCBmb3IgYW55IG90aGVyIHB1cnBvc2UsIHRoZXJlCisJICogaXMgc29tZSByaXNrIHRoYXQgdmVyeSBvbGQgNjQtYml0IGJpbmFyaWVzIGNvdWxkIGdldAorCSAqIGNvbmZ1c2VkLiAgSSBkb3VidCB0aGF0IG1hbnkgc3VjaCBiaW5hcmllcyBzdGlsbCB3b3JrLAorCSAqIHRob3VnaCwgc2luY2UgdGhlIHNhbWUgcGF0Y2ggaW4gMi41LjY0IGFsc28gcmVtb3ZlZCB0aGUKKwkgKiA2NC1iaXQgc2V0X3RocmVhZF9hcmVhIHN5c2NhbGwsIHNvIGl0IGFwcGVhcnMgdGhhdCB0aGVyZSBpcworCSAqIG5vIFRMUyBBUEkgdGhhdCB3b3JrcyBpbiBib3RoIHByZS0gYW5kIHBvc3QtMi41LjY0IGtlcm5lbHMuCisJICovCisJX191MTYgX19wYWQyOwkJLyogV2FzIGdzLiAqLworCV9fdTE2IF9fcGFkMTsJCS8qIFdhcyBmcy4gKi8KKworCV9fdTE2IHNzOwogCV9fdTY0IGVycjsKIAlfX3U2NCB0cmFwbm87CiAJX191NjQgb2xkbWFzazsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vdm14LmggYi9hcmNoL3g4Ni9pbmNsdWRlL3VhcGkvYXNtL3ZteC5oCmluZGV4IGM1ZjFhMWQuLjFmZTkyMTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvdWFwaS9hc20vdm14LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS91YXBpL2FzbS92bXguaApAQCAtNjcsNiArNjcsNyBAQAogI2RlZmluZSBFWElUX1JFQVNPTl9FUFRfVklPTEFUSU9OICAgICAgIDQ4CiAjZGVmaW5lIEVYSVRfUkVBU09OX0VQVF9NSVNDT05GSUcgICAgICAgNDkKICNkZWZpbmUgRVhJVF9SRUFTT05fSU5WRVBUICAgICAgICAgICAgICA1MAorI2RlZmluZSBFWElUX1JFQVNPTl9SRFRTQ1AgICAgICAgICAgICAgIDUxCiAjZGVmaW5lIEVYSVRfUkVBU09OX1BSRUVNUFRJT05fVElNRVIgICAgNTIKICNkZWZpbmUgRVhJVF9SRUFTT05fSU5WVlBJRCAgICAgICAgICAgICA1MwogI2RlZmluZSBFWElUX1JFQVNPTl9XQklOVkQgICAgICAgICAgICAgIDU0CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKaW5kZXggY2RiMWI3MC4uYzg4N2NkOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQpAQCAtMzIsNiArMzIsNyBAQAogb2JqLSQoQ09ORklHX1g4Nl82NCkJKz0gc3lzX3g4Nl82NC5vIHg4NjY0X2tzeW1zXzY0Lm8KIG9iai0kKENPTkZJR19YODZfNjQpCSs9IG1jb3VudF82NC5vCiBvYmoteQkJCSs9IHN5c2NhbGxfJChCSVRTKS5vIHZzeXNjYWxsX2d0b2Qubworb2JqLSQoQ09ORklHX0lBMzJfRU1VTEFUSU9OKQkrPSBzeXNjYWxsXzMyLm8KIG9iai0kKENPTkZJR19YODZfVlNZU0NBTExfRU1VTEFUSU9OKQkrPSB2c3lzY2FsbF82NC5vIHZzeXNjYWxsX2VtdV82NC5vCiBvYmotJChDT05GSUdfWDg2X0VTUEZJWDY0KQkrPSBlc3BmaXhfNjQubwogb2JqLSQoQ09ORklHX1NZU0ZTKQkrPSBrc3lzZnMubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IDNkNTI1YzYuLjgwM2I2ODQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTEzMzgsNiArMTMzOCwyNiBAQAogfQogCiAvKgorICogQUNQSSBvZmZlcnMgYW4gYWx0ZXJuYXRpdmUgcGxhdGZvcm0gaW50ZXJmYWNlIG1vZGVsIHRoYXQgcmVtb3ZlcworICogQUNQSSBoYXJkd2FyZSByZXF1aXJlbWVudHMgZm9yIHBsYXRmb3JtcyB0aGF0IGRvIG5vdCBpbXBsZW1lbnQKKyAqIHRoZSBQQyBBcmNoaXRlY3R1cmUuCisgKgorICogV2UgaW5pdGlhbGl6ZSB0aGUgSGFyZHdhcmUtcmVkdWNlZCBBQ1BJIG1vZGVsIGhlcmU6CisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBhY3BpX3JlZHVjZWRfaHdfaW5pdCh2b2lkKQoreworCWlmIChhY3BpX2dibF9yZWR1Y2VkX2hhcmR3YXJlKSB7CisJCS8qCisJCSAqIE92ZXJyaWRlIHg4Nl9pbml0IGZ1bmN0aW9ucyBhbmQgYnlwYXNzIGxlZ2FjeSBwaWMKKwkJICogaW4gSGFyZHdhcmUtcmVkdWNlZCBBQ1BJIG1vZGUKKwkJICovCisJCXg4Nl9pbml0LnRpbWVycy50aW1lcl9pbml0CT0geDg2X2luaXRfbm9vcDsKKwkJeDg2X2luaXQuaXJxcy5wcmVfdmVjdG9yX2luaXQJPSB4ODZfaW5pdF9ub29wOworCQlsZWdhY3lfcGljCQkJPSAmbnVsbF9sZWdhY3lfcGljOworCX0KK30KKworLyoKICAqIElmIHlvdXIgc3lzdGVtIGlzIGJsYWNrbGlzdGVkIGhlcmUsIGJ1dCB5b3UgZmluZCB0aGF0IGFjcGk9Zm9yY2UKICAqIHdvcmtzIGZvciB5b3UsIHBsZWFzZSBjb250YWN0IGxpbnV4LWFjcGlAdmdlci5rZXJuZWwub3JnCiAgKi8KQEAgLTE1MzYsNiArMTU1NiwxMSBAQAogCSAqLwogCWVhcmx5X2FjcGlfcHJvY2Vzc19tYWR0KCk7CiAKKwkvKgorCSAqIEhhcmR3YXJlLXJlZHVjZWQgQUNQSSBtb2RlIGluaXRpYWxpemF0aW9uOgorCSAqLworCWFjcGlfcmVkdWNlZF9od19pbml0KCk7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FsdGVybmF0aXZlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYwppbmRleCA3MDMxMzBmLi5hZWY2NTMxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWx0ZXJuYXRpdmUuYwpAQCAtNTIsMTAgKzUyLDI1IEBACiBfX3NldHVwKCJub3JlcGxhY2UtcGFyYXZpcnQiLCBzZXR1cF9ub3JlcGxhY2VfcGFyYXZpcnQpOwogI2VuZGlmCiAKLSNkZWZpbmUgRFBSSU5USyhmbXQsIC4uLikJCQkJXAotZG8gewkJCQkJCQlcCi0JaWYgKGRlYnVnX2FsdGVybmF0aXZlKQkJCQlcCi0JCXByaW50ayhLRVJOX0RFQlVHIGZtdCwgIyNfX1ZBX0FSR1NfXyk7CVwKKyNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoZGVidWdfYWx0ZXJuYXRpdmUpCQkJCQkJXAorCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10ICJcbiIsIF9fZnVuY19fLCAjI2FyZ3MpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERVTVBfQllURVMoYnVmLCBsZW4sIGZtdCwgYXJncy4uLikJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAodW5saWtlbHkoZGVidWdfYWx0ZXJuYXRpdmUpKSB7CQkJCVwKKwkJaW50IGo7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwkJaWYgKCEobGVuKSkJCQkJCQlcCisJCQlicmVhazsJCQkJCQlcCisJCQkJCQkJCQlcCisJCXByaW50ayhLRVJOX0RFQlVHIGZtdCwgIyNhcmdzKTsJCQkJXAorCQlmb3IgKGogPSAwOyBqIDwgKGxlbikgLSAxOyBqKyspCQkJCVwKKwkJCXByaW50ayhLRVJOX0NPTlQgIiUwMmhoeCAiLCBidWZbal0pOwkJXAorCQlwcmludGsoS0VSTl9DT05UICIlMDJoaHhcbiIsIGJ1ZltqXSk7CQkJXAorCX0JCQkJCQkJCVwKIH0gd2hpbGUgKDApCiAKIC8qCkBAIC0yNDMsMTIgKzI1OCw4OSBAQAogZXh0ZXJuIHMzMiBfX3NtcF9sb2Nrc1tdLCBfX3NtcF9sb2Nrc19lbmRbXTsKIHZvaWQgKnRleHRfcG9rZV9lYXJseSh2b2lkICphZGRyLCBjb25zdCB2b2lkICpvcGNvZGUsIHNpemVfdCBsZW4pOwogCi0vKiBSZXBsYWNlIGluc3RydWN0aW9ucyB3aXRoIGJldHRlciBhbHRlcm5hdGl2ZXMgZm9yIHRoaXMgQ1BVIHR5cGUuCi0gICBUaGlzIHJ1bnMgYmVmb3JlIFNNUCBpcyBpbml0aWFsaXplZCB0byBhdm9pZCBTTVAgcHJvYmxlbXMgd2l0aAotICAgc2VsZiBtb2RpZnlpbmcgY29kZS4gVGhpcyBpbXBsaWVzIHRoYXQgYXN5bW1ldHJpYyBzeXN0ZW1zIHdoZXJlCi0gICBBUHMgaGF2ZSBsZXNzIGNhcGFiaWxpdGllcyB0aGFuIHRoZSBib290IHByb2Nlc3NvciBhcmUgbm90IGhhbmRsZWQuCi0gICBUb3VnaC4gTWFrZSBzdXJlIHlvdSBkaXNhYmxlIHN1Y2ggZmVhdHVyZXMgYnkgaGFuZC4gKi8KKy8qCisgKiBBcmUgd2UgbG9va2luZyBhdCBhIG5lYXIgSk1QIHdpdGggYSAxIG9yIDQtYnl0ZSBkaXNwbGFjZW1lbnQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19qbXAoY29uc3QgdTggb3Bjb2RlKQoreworCXJldHVybiBvcGNvZGUgPT0gMHhlYiB8fCBvcGNvZGUgPT0gMHhlOTsKK30KIAorc3RhdGljIHZvaWQgX19pbml0X29yX21vZHVsZQorcmVjb21wdXRlX2p1bXAoc3RydWN0IGFsdF9pbnN0ciAqYSwgdTggKm9yaWdfaW5zbiwgdTggKnJlcGxfaW5zbiwgdTggKmluc25idWYpCit7CisJdTggKm5leHRfcmlwLCAqdGd0X3JpcDsKKwlzMzIgbl9kc3BsLCBvX2RzcGw7CisJaW50IHJlcGxfbGVuOworCisJaWYgKGEtPnJlcGxhY2VtZW50bGVuICE9IDUpCisJCXJldHVybjsKKworCW9fZHNwbCA9ICooczMyICopKGluc25idWYgKyAxKTsKKworCS8qIG5leHRfcmlwIG9mIHRoZSByZXBsYWNlbWVudCBKTVAgKi8KKwluZXh0X3JpcCA9IHJlcGxfaW5zbiArIGEtPnJlcGxhY2VtZW50bGVuOworCS8qIHRhcmdldCByaXAgb2YgdGhlIHJlcGxhY2VtZW50IEpNUCAqLworCXRndF9yaXAgID0gbmV4dF9yaXAgKyBvX2RzcGw7CisJbl9kc3BsID0gdGd0X3JpcCAtIG9yaWdfaW5zbjsKKworCURQUklOVEsoInRhcmdldCBSSVA6ICVwLCBuZXdfZGlzcGw6IDB4JXgiLCB0Z3RfcmlwLCBuX2RzcGwpOworCisJaWYgKHRndF9yaXAgLSBvcmlnX2luc24gPj0gMCkgeworCQlpZiAobl9kc3BsIC0gMiA8PSAxMjcpCisJCQlnb3RvIHR3b19ieXRlX2ptcDsKKwkJZWxzZQorCQkJZ290byBmaXZlX2J5dGVfam1wOworCS8qIG5lZ2F0aXZlIG9mZnNldCAqLworCX0gZWxzZSB7CisJCWlmICgoKG5fZHNwbCAtIDIpICYgMHhmZikgPT0gKG5fZHNwbCAtIDIpKQorCQkJZ290byB0d29fYnl0ZV9qbXA7CisJCWVsc2UKKwkJCWdvdG8gZml2ZV9ieXRlX2ptcDsKKwl9CisKK3R3b19ieXRlX2ptcDoKKwluX2RzcGwgLT0gMjsKKworCWluc25idWZbMF0gPSAweGViOworCWluc25idWZbMV0gPSAoczgpbl9kc3BsOworCWFkZF9ub3BzKGluc25idWYgKyAyLCAzKTsKKworCXJlcGxfbGVuID0gMjsKKwlnb3RvIGRvbmU7CisKK2ZpdmVfYnl0ZV9qbXA6CisJbl9kc3BsIC09IDU7CisKKwlpbnNuYnVmWzBdID0gMHhlOTsKKwkqKHMzMiAqKSZpbnNuYnVmWzFdID0gbl9kc3BsOworCisJcmVwbF9sZW4gPSA1OworCitkb25lOgorCisJRFBSSU5USygiZmluYWwgZGlzcGw6IDB4JTA4eCwgSk1QIDB4JWx4IiwKKwkJbl9kc3BsLCAodW5zaWduZWQgbG9uZylvcmlnX2luc24gKyBuX2RzcGwgKyByZXBsX2xlbik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdF9vcl9tb2R1bGUgb3B0aW1pemVfbm9wcyhzdHJ1Y3QgYWx0X2luc3RyICphLCB1OCAqaW5zdHIpCit7CisJaWYgKGluc3RyWzBdICE9IDB4OTApCisJCXJldHVybjsKKworCWFkZF9ub3BzKGluc3RyICsgKGEtPmluc3RybGVuIC0gYS0+cGFkbGVuKSwgYS0+cGFkbGVuKTsKKworCURVTVBfQllURVMoaW5zdHIsIGEtPmluc3RybGVuLCAiJXA6IFslZDolZCkgb3B0aW1pemVkIE5PUHM6ICIsCisJCSAgIGluc3RyLCBhLT5pbnN0cmxlbiAtIGEtPnBhZGxlbiwgYS0+cGFkbGVuKTsKK30KKworLyoKKyAqIFJlcGxhY2UgaW5zdHJ1Y3Rpb25zIHdpdGggYmV0dGVyIGFsdGVybmF0aXZlcyBmb3IgdGhpcyBDUFUgdHlwZS4gVGhpcyBydW5zCisgKiBiZWZvcmUgU01QIGlzIGluaXRpYWxpemVkIHRvIGF2b2lkIFNNUCBwcm9ibGVtcyB3aXRoIHNlbGYgbW9kaWZ5aW5nIGNvZGUuCisgKiBUaGlzIGltcGxpZXMgdGhhdCBhc3ltbWV0cmljIHN5c3RlbXMgd2hlcmUgQVBzIGhhdmUgbGVzcyBjYXBhYmlsaXRpZXMgdGhhbgorICogdGhlIGJvb3QgcHJvY2Vzc29yIGFyZSBub3QgaGFuZGxlZC4gVG91Z2guIE1ha2Ugc3VyZSB5b3UgZGlzYWJsZSBzdWNoCisgKiBmZWF0dXJlcyBieSBoYW5kLgorICovCiB2b2lkIF9faW5pdF9vcl9tb2R1bGUgYXBwbHlfYWx0ZXJuYXRpdmVzKHN0cnVjdCBhbHRfaW5zdHIgKnN0YXJ0LAogCQkJCQkgc3RydWN0IGFsdF9pbnN0ciAqZW5kKQogewpAQCAtMjU2LDEwICszNDgsMTAgQEAKIAl1OCAqaW5zdHIsICpyZXBsYWNlbWVudDsKIAl1OCBpbnNuYnVmW01BWF9QQVRDSF9MRU5dOwogCi0JRFBSSU5USygiJXM6IGFsdCB0YWJsZSAlcCAtPiAlcFxuIiwgX19mdW5jX18sIHN0YXJ0LCBlbmQpOworCURQUklOVEsoImFsdCB0YWJsZSAlcCAtPiAlcCIsIHN0YXJ0LCBlbmQpOwogCS8qCiAJICogVGhlIHNjYW4gb3JkZXIgc2hvdWxkIGJlIGZyb20gc3RhcnQgdG8gZW5kLiBBIGxhdGVyIHNjYW5uZWQKLQkgKiBhbHRlcm5hdGl2ZSBjb2RlIGNhbiBvdmVyd3JpdGUgYSBwcmV2aW91cyBzY2FubmVkIGFsdGVybmF0aXZlIGNvZGUuCisJICogYWx0ZXJuYXRpdmUgY29kZSBjYW4gb3ZlcndyaXRlIHByZXZpb3VzbHkgc2Nhbm5lZCBhbHRlcm5hdGl2ZSBjb2RlLgogCSAqIFNvbWUga2VybmVsIGZ1bmN0aW9ucyAoZS5nLiBtZW1jcHksIG1lbXNldCwgZXRjKSB1c2UgdGhpcyBvcmRlciB0bwogCSAqIHBhdGNoIGNvZGUuCiAJICoKQEAgLTI2NywyOSArMzU5LDU0IEBACiAJICogb3JkZXIuCiAJICovCiAJZm9yIChhID0gc3RhcnQ7IGEgPCBlbmQ7IGErKykgeworCQlpbnQgaW5zbmJ1Zl9zeiA9IDA7CisKIAkJaW5zdHIgPSAodTggKikmYS0+aW5zdHJfb2Zmc2V0ICsgYS0+aW5zdHJfb2Zmc2V0OwogCQlyZXBsYWNlbWVudCA9ICh1OCAqKSZhLT5yZXBsX29mZnNldCArIGEtPnJlcGxfb2Zmc2V0OwotCQlCVUdfT04oYS0+cmVwbGFjZW1lbnRsZW4gPiBhLT5pbnN0cmxlbik7CiAJCUJVR19PTihhLT5pbnN0cmxlbiA+IHNpemVvZihpbnNuYnVmKSk7CiAJCUJVR19PTihhLT5jcHVpZCA+PSAoTkNBUElOVFMgKyBOQlVHSU5UUykgKiAzMik7Ci0JCWlmICghYm9vdF9jcHVfaGFzKGEtPmNwdWlkKSkKKwkJaWYgKCFib290X2NwdV9oYXMoYS0+Y3B1aWQpKSB7CisJCQlpZiAoYS0+cGFkbGVuID4gMSkKKwkJCQlvcHRpbWl6ZV9ub3BzKGEsIGluc3RyKTsKKwogCQkJY29udGludWU7CisJCX0KKworCQlEUFJJTlRLKCJmZWF0OiAlZCozMislZCwgb2xkOiAoJXAsIGxlbjogJWQpLCByZXBsOiAoJXAsIGxlbjogJWQpLCBwYWQ6ICVkIiwKKwkJCWEtPmNwdWlkID4+IDUsCisJCQlhLT5jcHVpZCAmIDB4MWYsCisJCQlpbnN0ciwgYS0+aW5zdHJsZW4sCisJCQlyZXBsYWNlbWVudCwgYS0+cmVwbGFjZW1lbnRsZW4sIGEtPnBhZGxlbik7CisKKwkJRFVNUF9CWVRFUyhpbnN0ciwgYS0+aW5zdHJsZW4sICIlcDogb2xkX2luc246ICIsIGluc3RyKTsKKwkJRFVNUF9CWVRFUyhyZXBsYWNlbWVudCwgYS0+cmVwbGFjZW1lbnRsZW4sICIlcDogcnBsX2luc246ICIsIHJlcGxhY2VtZW50KTsKIAogCQltZW1jcHkoaW5zbmJ1ZiwgcmVwbGFjZW1lbnQsIGEtPnJlcGxhY2VtZW50bGVuKTsKKwkJaW5zbmJ1Zl9zeiA9IGEtPnJlcGxhY2VtZW50bGVuOwogCiAJCS8qIDB4ZTggaXMgYSByZWxhdGl2ZSBqdW1wOyBmaXggdGhlIG9mZnNldC4gKi8KLQkJaWYgKCppbnNuYnVmID09IDB4ZTggJiYgYS0+cmVwbGFjZW1lbnRsZW4gPT0gNSkKLQkJICAgICooczMyICopKGluc25idWYgKyAxKSArPSByZXBsYWNlbWVudCAtIGluc3RyOworCQlpZiAoKmluc25idWYgPT0gMHhlOCAmJiBhLT5yZXBsYWNlbWVudGxlbiA9PSA1KSB7CisJCQkqKHMzMiAqKShpbnNuYnVmICsgMSkgKz0gcmVwbGFjZW1lbnQgLSBpbnN0cjsKKwkJCURQUklOVEsoIkZpeCBDQUxMIG9mZnNldDogMHgleCwgQ0FMTCAweCVseCIsCisJCQkJKihzMzIgKikoaW5zbmJ1ZiArIDEpLAorCQkJCSh1bnNpZ25lZCBsb25nKWluc3RyICsgKihzMzIgKikoaW5zbmJ1ZiArIDEpICsgNSk7CisJCX0KIAotCQlhZGRfbm9wcyhpbnNuYnVmICsgYS0+cmVwbGFjZW1lbnRsZW4sCi0JCQkgYS0+aW5zdHJsZW4gLSBhLT5yZXBsYWNlbWVudGxlbik7CisJCWlmIChhLT5yZXBsYWNlbWVudGxlbiAmJiBpc19qbXAocmVwbGFjZW1lbnRbMF0pKQorCQkJcmVjb21wdXRlX2p1bXAoYSwgaW5zdHIsIHJlcGxhY2VtZW50LCBpbnNuYnVmKTsKIAotCQl0ZXh0X3Bva2VfZWFybHkoaW5zdHIsIGluc25idWYsIGEtPmluc3RybGVuKTsKKwkJaWYgKGEtPmluc3RybGVuID4gYS0+cmVwbGFjZW1lbnRsZW4pIHsKKwkJCWFkZF9ub3BzKGluc25idWYgKyBhLT5yZXBsYWNlbWVudGxlbiwKKwkJCQkgYS0+aW5zdHJsZW4gLSBhLT5yZXBsYWNlbWVudGxlbik7CisJCQlpbnNuYnVmX3N6ICs9IGEtPmluc3RybGVuIC0gYS0+cmVwbGFjZW1lbnRsZW47CisJCX0KKwkJRFVNUF9CWVRFUyhpbnNuYnVmLCBpbnNuYnVmX3N6LCAiJXA6IGZpbmFsX2luc246ICIsIGluc3RyKTsKKworCQl0ZXh0X3Bva2VfZWFybHkoaW5zdHIsIGluc25idWYsIGluc25idWZfc3opOwogCX0KIH0KIAogI2lmZGVmIENPTkZJR19TTVAKLQogc3RhdGljIHZvaWQgYWx0ZXJuYXRpdmVzX3NtcF9sb2NrKGNvbnN0IHMzMiAqc3RhcnQsIGNvbnN0IHMzMiAqZW5kLAogCQkJCSAgdTggKnRleHQsIHU4ICp0ZXh0X2VuZCkKIHsKQEAgLTM3MSw4ICs0ODgsOCBAQAogCXNtcC0+bG9ja3NfZW5kCT0gbG9ja3NfZW5kOwogCXNtcC0+dGV4dAk9IHRleHQ7CiAJc21wLT50ZXh0X2VuZAk9IHRleHRfZW5kOwotCURQUklOVEsoIiVzOiBsb2NrcyAlcCAtPiAlcCwgdGV4dCAlcCAtPiAlcCwgbmFtZSAlc1xuIiwKLQkJX19mdW5jX18sIHNtcC0+bG9ja3MsIHNtcC0+bG9ja3NfZW5kLAorCURQUklOVEsoImxvY2tzICVwIC0+ICVwLCB0ZXh0ICVwIC0+ICVwLCBuYW1lICVzXG4iLAorCQlzbXAtPmxvY2tzLCBzbXAtPmxvY2tzX2VuZCwKIAkJc21wLT50ZXh0LCBzbXAtPnRleHRfZW5kLCBzbXAtPm5hbWUpOwogCiAJbGlzdF9hZGRfdGFpbCgmc21wLT5uZXh0LCAmc21wX2FsdF9tb2R1bGVzKTsKQEAgLTQ0MCw3ICs1NTcsNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKICNpZmRlZiBDT05GSUdfUEFSQVZJUlQKIHZvaWQgX19pbml0X29yX21vZHVsZSBhcHBseV9wYXJhdmlydChzdHJ1Y3QgcGFyYXZpcnRfcGF0Y2hfc2l0ZSAqc3RhcnQsCkBAIC02MDEsNyArNzE4LDcgQEAKIAlpZiAobGlrZWx5KCFicF9wYXRjaGluZ19pbl9wcm9ncmVzcykpCiAJCXJldHVybiAwOwogCi0JaWYgKHVzZXJfbW9kZV92bShyZWdzKSB8fCByZWdzLT5pcCAhPSAodW5zaWduZWQgbG9uZylicF9pbnQzX2FkZHIpCisJaWYgKHVzZXJfbW9kZShyZWdzKSB8fCByZWdzLT5pcCAhPSAodW5zaWduZWQgbG9uZylicF9pbnQzX2FkZHIpCiAJCXJldHVybiAwOwogCiAJLyogc2V0IHVwIHRoZSBzcGVjaWZpZWQgYnJlYWtwb2ludCBoYW5kbGVyICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKaW5kZXggYWQzNjM5YS4uZGNiNTI4NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwpAQCAtMTA4NCw2NyArMTA4NCw2IEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi0vKgotICogVGhpcyBpcyB0byB2ZXJpZnkgdGhhdCB3ZSdyZSBsb29raW5nIGF0IGEgcmVhbCBsb2NhbCBBUElDLgotICogQ2hlY2sgdGhlc2UgYWdhaW5zdCB5b3VyIGJvYXJkIGlmIHRoZSBDUFVzIGFyZW4ndCBnZXR0aW5nCi0gKiBzdGFydGVkIGZvciBubyBhcHBhcmVudCByZWFzb24uCi0gKi8KLWludCBfX2luaXQgdmVyaWZ5X2xvY2FsX0FQSUModm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgcmVnMCwgcmVnMTsKLQotCS8qCi0JICogVGhlIHZlcnNpb24gcmVnaXN0ZXIgaXMgcmVhZC1vbmx5IGluIGEgcmVhbCBBUElDLgotCSAqLwotCXJlZzAgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwotCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsICJHZXR0aW5nIFZFUlNJT046ICV4XG4iLCByZWcwKTsKLQlhcGljX3dyaXRlKEFQSUNfTFZSLCByZWcwIF4gQVBJQ19MVlJfTUFTSyk7Ci0JcmVnMSA9IGFwaWNfcmVhZChBUElDX0xWUik7Ci0JYXBpY19wcmludGsoQVBJQ19ERUJVRywgIkdldHRpbmcgVkVSU0lPTjogJXhcbiIsIHJlZzEpOwotCi0JLyoKLQkgKiBUaGUgdHdvIHZlcnNpb24gcmVhZHMgYWJvdmUgc2hvdWxkIHByaW50IHRoZSBzYW1lCi0JICogbnVtYmVycy4gIElmIHRoZSBzZWNvbmQgb25lIGlzIGRpZmZlcmVudCwgdGhlbiB3ZQotCSAqIHBva2UgYXQgYSBub24tQVBJQy4KLQkgKi8KLQlpZiAocmVnMSAhPSByZWcwKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogQ2hlY2sgaWYgdGhlIHZlcnNpb24gbG9va3MgcmVhc29uYWJseS4KLQkgKi8KLQlyZWcxID0gR0VUX0FQSUNfVkVSU0lPTihyZWcwKTsKLQlpZiAocmVnMSA9PSAweDAwIHx8IHJlZzEgPT0gMHhmZikKLQkJcmV0dXJuIDA7Ci0JcmVnMSA9IGxhcGljX2dldF9tYXhsdnQoKTsKLQlpZiAocmVnMSA8IDB4MDIgfHwgcmVnMSA9PSAweGZmKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogVGhlIElEIHJlZ2lzdGVyIGlzIHJlYWQvd3JpdGUgaW4gYSByZWFsIEFQSUMuCi0JICovCi0JcmVnMCA9IGFwaWNfcmVhZChBUElDX0lEKTsKLQlhcGljX3ByaW50ayhBUElDX0RFQlVHLCAiR2V0dGluZyBJRDogJXhcbiIsIHJlZzApOwotCWFwaWNfd3JpdGUoQVBJQ19JRCwgcmVnMCBeIGFwaWMtPmFwaWNfaWRfbWFzayk7Ci0JcmVnMSA9IGFwaWNfcmVhZChBUElDX0lEKTsKLQlhcGljX3ByaW50ayhBUElDX0RFQlVHLCAiR2V0dGluZyBJRDogJXhcbiIsIHJlZzEpOwotCWFwaWNfd3JpdGUoQVBJQ19JRCwgcmVnMCk7Ci0JaWYgKHJlZzEgIT0gKHJlZzAgXiBhcGljLT5hcGljX2lkX21hc2spKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogVGhlIG5leHQgdHdvIGFyZSBqdXN0IHRvIHNlZSBpZiB3ZSBoYXZlIHNhbmUgdmFsdWVzLgotCSAqIFRoZXkncmUgb25seSByZWFsbHkgcmVsZXZhbnQgaWYgd2UncmUgaW4gVmlydHVhbCBXaXJlCi0JICogY29tcGF0aWJpbGl0eSBtb2RlLCBidXQgbW9zdCBib3hlcyBhcmUgYW55bW9yZS4KLQkgKi8KLQlyZWcwID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7Ci0JYXBpY19wcmludGsoQVBJQ19ERUJVRywgIkdldHRpbmcgTFZUMDogJXhcbiIsIHJlZzApOwotCXJlZzEgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKLQlhcGljX3ByaW50ayhBUElDX0RFQlVHLCAiR2V0dGluZyBMVlQxOiAleFxuIiwgcmVnMSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQogLyoqCiAgKiBzeW5jX0FyYl9JRHMgLSBzeW5jaHJvbml6ZSBBUElDIGJ1cyBhcmJpdHJhdGlvbiBJRHMKICAqLwpAQCAtMjI4Myw3ICsyMjIyLDYgQEAKIAkJZGlzYWJsZV9pb2FwaWNfc3VwcG9ydCgpOwogCiAJZGVmYXVsdF9zZXR1cF9hcGljX3JvdXRpbmcoKTsKLQl2ZXJpZnlfbG9jYWxfQVBJQygpOwogCWFwaWNfYnNwX3NldHVwKHRydWUpOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19udW1hY2hpcC5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19udW1hY2hpcC5jCmluZGV4IGMyZmQyMWYuLjAxNzE0OWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbnVtYWNoaXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX251bWFjaGlwLmMKQEAgLTM3LDEwICszNywxMiBAQAogc3RhdGljIHVuc2lnbmVkIGludCBnZXRfYXBpY19pZCh1bnNpZ25lZCBsb25nIHgpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKLQl1bnNpZ25lZCBpbnQgaWQ7CisJdW5zaWduZWQgaW50IGlkID0gKHggPj4gMjQpICYgMHhmZjsKIAotCXJkbXNybChNU1JfRkFNMTBIX05PREVfSUQsIHZhbHVlKTsKLQlpZCA9ICgoeCA+PiAyNCkgJiAweGZmVSkgfCAoKHZhbHVlIDw8IDIpICYgMHhmZjAwVSk7CisJaWYgKHN0YXRpY19jcHVfaGFzX3NhZmUoWDg2X0ZFQVRVUkVfTk9ERUlEX01TUikpIHsKKwkJcmRtc3JsKE1TUl9GQU0xMEhfTk9ERV9JRCwgdmFsdWUpOworCQlpZCB8PSAodmFsdWUgPDwgMikgJiAweGZmMDA7CisJfQogCiAJcmV0dXJuIGlkOwogfQpAQCAtMTU1LDEwICsxNTcsMTggQEAKIAogc3RhdGljIHZvaWQgZml4dXBfY3B1X2lkKHN0cnVjdCBjcHVpbmZvX3g4NiAqYywgaW50IG5vZGUpCiB7Ci0JaWYgKGMtPnBoeXNfcHJvY19pZCAhPSBub2RlKSB7Ci0JCWMtPnBoeXNfcHJvY19pZCA9IG5vZGU7Ci0JCXBlcl9jcHUoY3B1X2xsY19pZCwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IG5vZGU7CisJdTY0IHZhbDsKKwl1MzIgbm9kZXMgPSAxOworCisJdGhpc19jcHVfd3JpdGUoY3B1X2xsY19pZCwgbm9kZSk7CisKKwkvKiBBY2NvdW50IGZvciBub2RlcyBwZXIgc29ja2V0IGluIG11bHRpLWNvcmUtbW9kdWxlIHByb2Nlc3NvcnMgKi8KKwlpZiAoc3RhdGljX2NwdV9oYXNfc2FmZShYODZfRkVBVFVSRV9OT0RFSURfTVNSKSkgeworCQlyZG1zcmwoTVNSX0ZBTTEwSF9OT0RFX0lELCB2YWwpOworCQlub2RlcyA9ICgodmFsID4+IDMpICYgNykgKyAxOwogCX0KKworCWMtPnBoeXNfcHJvY19pZCA9IG5vZGUgLyBub2RlczsKIH0KIAogc3RhdGljIGludCBfX2luaXQgbnVtYWNoaXBfc3lzdGVtX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19jbHVzdGVyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfY2x1c3Rlci5jCmluZGV4IGU2NThmMjEuLmQ5ZDBiZDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19jbHVzdGVyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYwpAQCAtMTM1LDEyICsxMzUsMTIgQEAKIAogCXBlcl9jcHUoeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCwgdGhpc19jcHUpID0gYXBpY19yZWFkKEFQSUNfTERSKTsKIAotCV9fY3B1X3NldCh0aGlzX2NwdSwgcGVyX2NwdShjcHVzX2luX2NsdXN0ZXIsIHRoaXNfY3B1KSk7CisJY3B1bWFza19zZXRfY3B1KHRoaXNfY3B1LCBwZXJfY3B1KGNwdXNfaW5fY2x1c3RlciwgdGhpc19jcHUpKTsKIAlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewogCQlpZiAoeDJhcGljX2NsdXN0ZXIodGhpc19jcHUpICE9IHgyYXBpY19jbHVzdGVyKGNwdSkpCiAJCQljb250aW51ZTsKLQkJX19jcHVfc2V0KHRoaXNfY3B1LCBwZXJfY3B1KGNwdXNfaW5fY2x1c3RlciwgY3B1KSk7Ci0JCV9fY3B1X3NldChjcHUsIHBlcl9jcHUoY3B1c19pbl9jbHVzdGVyLCB0aGlzX2NwdSkpOworCQljcHVtYXNrX3NldF9jcHUodGhpc19jcHUsIHBlcl9jcHUoY3B1c19pbl9jbHVzdGVyLCBjcHUpKTsKKwkJY3B1bWFza19zZXRfY3B1KGNwdSwgcGVyX2NwdShjcHVzX2luX2NsdXN0ZXIsIHRoaXNfY3B1KSk7CiAJfQogfQogCkBAIC0xOTUsNyArMTk1LDcgQEAKIAogCUJVR19PTighcGVyX2NwdShjcHVzX2luX2NsdXN0ZXIsIGNwdSkgfHwgIXBlcl9jcHUoaXBpX21hc2ssIGNwdSkpOwogCi0JX19jcHVfc2V0KGNwdSwgcGVyX2NwdShjcHVzX2luX2NsdXN0ZXIsIGNwdSkpOworCWNwdW1hc2tfc2V0X2NwdShjcHUsIHBlcl9jcHUoY3B1c19pbl9jbHVzdGVyLCBjcHUpKTsKIAlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJngyYXBpY19jcHVfbm90aWZpZXIpOwogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKaW5kZXggOGU5ZGNmZC4uYzhkOTI5NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCkBAIC0xNDQsMzMgKzE0NCw2MCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCB1dl9hY3BpX21hZHRfb2VtX2NoZWNrKGNoYXIgKm9lbV9pZCwgY2hhciAqb2VtX3RhYmxlX2lkKQogewotCWludCBwbm9kZWlkLCBpc191djEsIGlzX3V2MiwgaXNfdXYzOworCWludCBwbm9kZWlkOworCWludCB1dl9hcGljOwogCi0JaXNfdXYxID0gIXN0cmNtcChvZW1faWQsICJTR0kiKTsKLQlpc191djIgPSAhc3RyY21wKG9lbV9pZCwgIlNHSTIiKTsKLQlpc191djMgPSAhc3RybmNtcChvZW1faWQsICJTR0kzIiwgNCk7CS8qIHRoZXJlIGFyZSB2YXJpZXRpZXMgb2YgVVYzICovCi0JaWYgKGlzX3V2MSB8fCBpc191djIgfHwgaXNfdXYzKSB7Ci0JCXV2X2h1Yl9pbmZvLT5odWJfcmV2aXNpb24gPQotCQkJKGlzX3V2MSA/IFVWMV9IVUJfUkVWSVNJT05fQkFTRSA6Ci0JCQkoaXNfdXYyID8gVVYyX0hVQl9SRVZJU0lPTl9CQVNFIDoKLQkJCQkgIFVWM19IVUJfUkVWSVNJT05fQkFTRSkpOwotCQlwbm9kZWlkID0gZWFybHlfZ2V0X3Bub2RlaWQoKTsKLQkJZWFybHlfZ2V0X2FwaWNfcG5vZGVfc2hpZnQoKTsKLQkJeDg2X3BsYXRmb3JtLmlzX3VudHJhY2tlZF9wYXRfcmFuZ2UgPSAgdXZfaXNfdW50cmFja2VkX3BhdF9yYW5nZTsKLQkJeDg2X3BsYXRmb3JtLm5taV9pbml0ID0gdXZfbm1pX2luaXQ7Ci0JCWlmICghc3RyY21wKG9lbV90YWJsZV9pZCwgIlVWTCIpKQotCQkJdXZfc3lzdGVtX3R5cGUgPSBVVl9MRUdBQ1lfQVBJQzsKLQkJZWxzZSBpZiAoIXN0cmNtcChvZW1fdGFibGVfaWQsICJVVlgiKSkKLQkJCXV2X3N5c3RlbV90eXBlID0gVVZfWDJBUElDOwotCQllbHNlIGlmICghc3RyY21wKG9lbV90YWJsZV9pZCwgIlVWSCIpKSB7Ci0JCQlfX3RoaXNfY3B1X3dyaXRlKHgyYXBpY19leHRyYV9iaXRzLAotCQkJCXBub2RlaWQgPDwgdXZoX2FwaWNpZC5zLnBub2RlX3NoaWZ0KTsKLQkJCXV2X3N5c3RlbV90eXBlID0gVVZfTk9OX1VOSVFVRV9BUElDOwotCQkJdXZfc2V0X2FwaWNpZF9oaWJpdCgpOwotCQkJcmV0dXJuIDE7Ci0JCX0KKwlpZiAoc3RybmNtcChvZW1faWQsICJTR0kiLCAzKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogRGV0ZXJtaW5lIFVWIGFyY2ggdHlwZS4KKwkgKiAgIFNHSTogVVYxMDAvMTAwMAorCSAqICAgU0dJMjogVVYyMDAwLzMwMDAKKwkgKiAgIFNHSTM6IFVWMzAwICh0cnVuY2F0ZWQgdG8gNCBjaGFycyBiZWNhdXNlIG9mIGRpZmZlcmVudCB2YXJpZXRpZXMpCisJICovCisJdXZfaHViX2luZm8tPmh1Yl9yZXZpc2lvbiA9CisJCSFzdHJuY21wKG9lbV9pZCwgIlNHSTMiLCA0KSA/IFVWM19IVUJfUkVWSVNJT05fQkFTRSA6CisJCSFzdHJjbXAob2VtX2lkLCAiU0dJMiIpID8gVVYyX0hVQl9SRVZJU0lPTl9CQVNFIDoKKwkJIXN0cmNtcChvZW1faWQsICJTR0kiKSA/IFVWMV9IVUJfUkVWSVNJT05fQkFTRSA6IDA7CisKKwlpZiAodXZfaHViX2luZm8tPmh1Yl9yZXZpc2lvbiA9PSAwKQorCQlnb3RvIGJhZGJpb3M7CisKKwlwbm9kZWlkID0gZWFybHlfZ2V0X3Bub2RlaWQoKTsKKwllYXJseV9nZXRfYXBpY19wbm9kZV9zaGlmdCgpOworCXg4Nl9wbGF0Zm9ybS5pc191bnRyYWNrZWRfcGF0X3JhbmdlID0gIHV2X2lzX3VudHJhY2tlZF9wYXRfcmFuZ2U7CisJeDg2X3BsYXRmb3JtLm5taV9pbml0ID0gdXZfbm1pX2luaXQ7CisKKwlpZiAoIXN0cmNtcChvZW1fdGFibGVfaWQsICJVVlgiKSkgewkJLyogbW9zdCBjb21tb24gKi8KKwkJdXZfc3lzdGVtX3R5cGUgPSBVVl9YMkFQSUM7CisJCXV2X2FwaWMgPSAwOworCisJfSBlbHNlIGlmICghc3RyY21wKG9lbV90YWJsZV9pZCwgIlVWSCIpKSB7CS8qIG9ubHkgVVYxIHN5c3RlbXMgKi8KKwkJdXZfc3lzdGVtX3R5cGUgPSBVVl9OT05fVU5JUVVFX0FQSUM7CisJCV9fdGhpc19jcHVfd3JpdGUoeDJhcGljX2V4dHJhX2JpdHMsCisJCQlwbm9kZWlkIDw8IHV2aF9hcGljaWQucy5wbm9kZV9zaGlmdCk7CisJCXV2X3NldF9hcGljaWRfaGliaXQoKTsKKwkJdXZfYXBpYyA9IDE7CisKKwl9IGVsc2UJaWYgKCFzdHJjbXAob2VtX3RhYmxlX2lkLCAiVVZMIikpIHsJLyogb25seSB1c2VkIGZvciAqLworCQl1dl9zeXN0ZW1fdHlwZSA9IFVWX0xFR0FDWV9BUElDOwkvKiB2ZXJ5IHNtYWxsIHN5c3RlbXMgKi8KKwkJdXZfYXBpYyA9IDA7CisKKwl9IGVsc2UgeworCQlnb3RvIGJhZGJpb3M7CiAJfQotCXJldHVybiAwOworCisJcHJfaW5mbygiVVY6IE9FTSBJRHMgJXMvJXMsIFN5c3RlbS9IVUIgVHlwZXMgJWQvJWQsIHV2X2FwaWMgJWRcbiIsCisJCW9lbV9pZCwgb2VtX3RhYmxlX2lkLCB1dl9zeXN0ZW1fdHlwZSwKKwkJdXZfbWluX2h1Yl9yZXZpc2lvbl9pZCwgdXZfYXBpYyk7CisKKwlyZXR1cm4gdXZfYXBpYzsKKworYmFkYmlvczoKKwlwcl9lcnIoIlVWOiBPRU1fSUQ6JXMgT0VNX1RBQkxFX0lEOiVzXG4iLCBvZW1faWQsIG9lbV90YWJsZV9pZCk7CisJcHJfZXJyKCJDdXJyZW50IEJJT1Mgbm90IHN1cHBvcnRlZCwgdXBkYXRlIGtlcm5lbCBhbmQvb3IgQklPU1xuIik7CisJQlVHKCk7CiB9CiAKIGVudW0gdXZfc3lzdGVtX3R5cGUgZ2V0X3V2X3N5c3RlbV90eXBlKHZvaWQpCkBAIC04NTQsMTAgKzg4MSwxNCBAQAogCXVuc2lnbmVkIGxvbmcgbW1yX2Jhc2UsIHByZXNlbnQsIHBhZGRyOwogCXVuc2lnbmVkIHNob3J0IHBub2RlX21hc2s7CiAJdW5zaWduZWQgY2hhciBuX2xzaGlmdDsKLQljaGFyICpodWIgPSAoaXNfdXYxX2h1YigpID8gIlVWMSIgOgotCQkgICAgKGlzX3V2Ml9odWIoKSA/ICJVVjIiIDoKLQkJCQkgICAgIlVWMyIpKTsKKwljaGFyICpodWIgPSAoaXNfdXYxX2h1YigpID8gIlVWMTAwLzEwMDAiIDoKKwkJICAgIChpc191djJfaHViKCkgPyAiVVYyMDAwLzMwMDAiIDoKKwkJICAgIChpc191djNfaHViKCkgPyAiVVYzMDAiIDogTlVMTCkpKTsKIAorCWlmICghaHViKSB7CisJCXByX2VycigiVVY6IFVua25vd24vdW5zdXBwb3J0ZWQgVVYgaHViXG4iKTsKKwkJcmV0dXJuOworCX0KIAlwcl9pbmZvKCJVVjogRm91bmQgJXMgaHViXG4iLCBodWIpOwogCW1hcF9sb3dfbW1ycygpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c18zMi5jCmluZGV4IDNiM2I5ZDMuLjQ3NzAzYWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c18zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c18zMi5jCkBAIC02OCw3ICs2OCw3IEBACiAKIAkvKiBPZmZzZXQgZnJvbSB0aGUgc3lzZW50ZXIgc3RhY2sgdG8gdHNzLnNwMCAqLwogCURFRklORShUU1Nfc3lzZW50ZXJfc3AwLCBvZmZzZXRvZihzdHJ1Y3QgdHNzX3N0cnVjdCwgeDg2X3Rzcy5zcDApIC0KLQkJIHNpemVvZihzdHJ1Y3QgdHNzX3N0cnVjdCkpOworCSAgICAgICBvZmZzZXRvZmVuZChzdHJ1Y3QgdHNzX3N0cnVjdCwgU1lTRU5URVJfc3RhY2spKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0xHVUVTVCkgfHwgZGVmaW5lZChDT05GSUdfTEdVRVNUX0dVRVNUKSB8fCBkZWZpbmVkKENPTkZJR19MR1VFU1RfTU9EVUxFKQogCUJMQU5LKCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c182NC5jCmluZGV4IGZkY2JiNGQuLjVjZTZmMmQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hc20tb2Zmc2V0c182NC5jCkBAIC04MSw2ICs4MSw3IEBACiAjdW5kZWYgRU5UUlkKIAogCU9GRlNFVChUU1NfaXN0LCB0c3Nfc3RydWN0LCB4ODZfdHNzLmlzdCk7CisJT0ZGU0VUKFRTU19zcDAsIHRzc19zdHJ1Y3QsIHg4Nl90c3Muc3AwKTsKIAlCTEFOSygpOwogCiAJREVGSU5FKF9fTlJfc3lzY2FsbF9tYXgsIHNpemVvZihzeXNjYWxsc182NCkgLSAxKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L01ha2VmaWxlCmluZGV4IDgwMDkxYWUuLjliZmY2ODcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9NYWtlZmlsZQpAQCAtMzksNyArMzksOCBAQAogZW5kaWYKIG9iai0kKENPTkZJR19DUFVfU1VQX0lOVEVMKQkJKz0gcGVyZl9ldmVudF9wNi5vIHBlcmZfZXZlbnRfa25jLm8gcGVyZl9ldmVudF9wNC5vCiBvYmotJChDT05GSUdfQ1BVX1NVUF9JTlRFTCkJCSs9IHBlcmZfZXZlbnRfaW50ZWxfbGJyLm8gcGVyZl9ldmVudF9pbnRlbF9kcy5vIHBlcmZfZXZlbnRfaW50ZWwubwotb2JqLSQoQ09ORklHX0NQVV9TVVBfSU5URUwpCQkrPSBwZXJmX2V2ZW50X2ludGVsX3JhcGwubworb2JqLSQoQ09ORklHX0NQVV9TVVBfSU5URUwpCQkrPSBwZXJmX2V2ZW50X2ludGVsX3JhcGwubyBwZXJmX2V2ZW50X2ludGVsX2NxbS5vCitvYmotJChDT05GSUdfQ1BVX1NVUF9JTlRFTCkJCSs9IHBlcmZfZXZlbnRfaW50ZWxfcHQubyBwZXJmX2V2ZW50X2ludGVsX2J0cy5vCiAKIG9iai0kKENPTkZJR19QRVJGX0VWRU5UU19JTlRFTF9VTkNPUkUpCSs9IHBlcmZfZXZlbnRfaW50ZWxfdW5jb3JlLm8gXAogCQkJCQkgICBwZXJmX2V2ZW50X2ludGVsX3VuY29yZV9zbmIubyBcCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYwppbmRleCBhMjIwMjM5Li5mZDQ3MGViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKQEAgLTUsNiArNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2NwdS5oPgpAQCAtNDg4LDYgKzQ4OSw5IEBACiAKIAkJdmFfYWxpZ24ubWFzawkgID0gKHVwcGVyYml0IC0gMSkgJiBQQUdFX01BU0s7CiAJCXZhX2FsaWduLmZsYWdzICAgID0gQUxJR05fVkFfMzIgfCBBTElHTl9WQV82NDsKKworCQkvKiBBIHJhbmRvbSB2YWx1ZSBwZXIgYm9vdCBmb3IgYml0IHNsaWNlIFsxMjp1cHBlcl9iaXQpICovCisJCXZhX2FsaWduLmJpdHMgPSBnZXRfcmFuZG9tX2ludCgpICYgdmFfYWxpZ24ubWFzazsKIAl9CiB9CiAKQEAgLTcxMSw2ICs3MTUsMTEgQEAKIAkJc2V0X2NwdV9idWcoYywgWDg2X0JVR19BTURfQVBJQ19DMUUpOwogCiAJcmRtc3Jfc2FmZShNU1JfQU1ENjRfUEFUQ0hfTEVWRUwsICZjLT5taWNyb2NvZGUsICZkdW1teSk7CisKKwkvKiAzRE5vdyBvciBMTSBpbXBsaWVzIFBSRUZFVENIVyAqLworCWlmICghY3B1X2hhcyhjLCBYODZfRkVBVFVSRV8zRE5PV1BSRUZFVENIKSkKKwkJaWYgKGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfM0ROT1cpIHx8IGNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfTE0pKQorCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfM0ROT1dQUkVGRVRDSCk7CiB9CiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYwppbmRleCAyMzQ2Yzk1Li5hNjJjZjA0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKQEAgLTY0Niw2ICs2NDYsMzAgQEAKIAkJYy0+eDg2X2NhcGFiaWxpdHlbMTBdID0gZWF4OwogCX0KIAorCS8qIEFkZGl0aW9uYWwgSW50ZWwtZGVmaW5lZCBmbGFnczogbGV2ZWwgMHgwMDAwMDAwRiAqLworCWlmIChjLT5jcHVpZF9sZXZlbCA+PSAweDAwMDAwMDBGKSB7CisJCXUzMiBlYXgsIGVieCwgZWN4LCBlZHg7CisKKwkJLyogUW9TIHN1Yi1sZWFmLCBFQVg9MEZoLCBFQ1g9MCAqLworCQljcHVpZF9jb3VudCgweDAwMDAwMDBGLCAwLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwkJYy0+eDg2X2NhcGFiaWxpdHlbMTFdID0gZWR4OworCQlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9DUU1fTExDKSkgeworCQkJLyogd2lsbCBiZSBvdmVycmlkZGVuIGlmIG9jY3VwYW5jeSBtb25pdG9yaW5nIGV4aXN0cyAqLworCQkJYy0+eDg2X2NhY2hlX21heF9ybWlkID0gZWJ4OworCisJCQkvKiBRb1Mgc3ViLWxlYWYsIEVBWD0wRmgsIEVDWD0xICovCisJCQljcHVpZF9jb3VudCgweDAwMDAwMDBGLCAxLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKKwkJCWMtPng4Nl9jYXBhYmlsaXR5WzEyXSA9IGVkeDsKKwkJCWlmIChjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX0NRTV9PQ0NVUF9MTEMpKSB7CisJCQkJYy0+eDg2X2NhY2hlX21heF9ybWlkID0gZWN4OworCQkJCWMtPng4Nl9jYWNoZV9vY2Nfc2NhbGUgPSBlYng7CisJCQl9CisJCX0gZWxzZSB7CisJCQljLT54ODZfY2FjaGVfbWF4X3JtaWQgPSAtMTsKKwkJCWMtPng4Nl9jYWNoZV9vY2Nfc2NhbGUgPSAtMTsKKwkJfQorCX0KKwogCS8qIEFNRC1kZWZpbmVkIGZsYWdzOiBsZXZlbCAweDgwMDAwMDAxICovCiAJeGx2bCA9IGNwdWlkX2VheCgweDgwMDAwMDAwKTsKIAljLT5leHRlbmRlZF9jcHVpZF9sZXZlbCA9IHhsdmw7CkBAIC04MzQsNiArODU4LDIwIEBACiAJZGV0ZWN0X25vcGwoYyk7CiB9CiAKK3N0YXRpYyB2b2lkIHg4Nl9pbml0X2NhY2hlX3FvcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCit7CisJLyoKKwkgKiBUaGUgaGVhdnkgbGlmdGluZyBvZiBtYXhfcm1pZCBhbmQgY2FjaGVfb2NjX3NjYWxlIGFyZSBoYW5kbGVkCisJICogaW4gZ2V0X2NwdV9jYXAoKS4gIEhlcmUgd2UganVzdCBzZXQgdGhlIG1heF9ybWlkIGZvciB0aGUgYm9vdF9jcHUKKwkgKiBpbiBjYXNlIENRTSBiaXRzIHJlYWxseSBhcmVuJ3QgdGhlcmUgaW4gdGhpcyBDUFUuCisJICovCisJaWYgKGMgIT0gJmJvb3RfY3B1X2RhdGEpIHsKKwkJYm9vdF9jcHVfZGF0YS54ODZfY2FjaGVfbWF4X3JtaWQgPQorCQkJbWluKGJvb3RfY3B1X2RhdGEueDg2X2NhY2hlX21heF9ybWlkLAorCQkJICAgIGMtPng4Nl9jYWNoZV9tYXhfcm1pZCk7CisJfQorfQorCiAvKgogICogVGhpcyBkb2VzIHRoZSBoYXJkIHdvcmsgb2YgYWN0dWFsbHkgcGlja2luZyBhcGFydCB0aGUgQ1BVIHN0dWZmLi4uCiAgKi8KQEAgLTkyMyw2ICs5NjEsNyBAQAogCiAJaW5pdF9oeXBlcnZpc29yKGMpOwogCXg4Nl9pbml0X3JkcmFuZChjKTsKKwl4ODZfaW5pdF9jYWNoZV9xb3MoYyk7CiAKIAkvKgogCSAqIENsZWFyL1NldCBhbGwgZmxhZ3Mgb3ZlcnJpZGVuIGJ5IG9wdGlvbnMsIG5lZWQgZG8gaXQKQEAgLTk1OSwzOCArOTk4LDM3IEBACiAjZW5kaWYKIH0KIAotI2lmZGVmIENPTkZJR19YODZfNjQKLSNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLS8qIE1heSBub3QgYmUgX19pbml0OiBjYWxsZWQgZHVyaW5nIHJlc3VtZSAqLwotc3RhdGljIHZvaWQgc3lzY2FsbDMyX2NwdV9pbml0KHZvaWQpCi17Ci0JLyogTG9hZCB0aGVzZSBhbHdheXMgaW4gY2FzZSBzb21lIGZ1dHVyZSBBTUQgQ1BVIHN1cHBvcnRzCi0JICAgU1lTRU5URVIgZnJvbSBjb21wYXQgbW9kZSB0b28uICovCi0Jd3Jtc3JsX3NhZmUoTVNSX0lBMzJfU1lTRU5URVJfQ1MsICh1NjQpX19LRVJORUxfQ1MpOwotCXdybXNybF9zYWZlKE1TUl9JQTMyX1NZU0VOVEVSX0VTUCwgMFVMTCk7Ci0Jd3Jtc3JsX3NhZmUoTVNSX0lBMzJfU1lTRU5URVJfRUlQLCAodTY0KWlhMzJfc3lzZW50ZXJfdGFyZ2V0KTsKLQotCXdybXNybChNU1JfQ1NUQVIsIGlhMzJfY3N0YXJfdGFyZ2V0KTsKLX0KLSNlbmRpZgkJLyogQ09ORklHX0lBMzJfRU1VTEFUSU9OICovCi0jZW5kaWYJCS8qIENPTkZJR19YODZfNjQgKi8KLQorLyoKKyAqIFNldCB1cCB0aGUgQ1BVIHN0YXRlIG5lZWRlZCB0byBleGVjdXRlIFNZU0VOVEVSL1NZU0VYSVQgaW5zdHJ1Y3Rpb25zCisgKiBvbiAzMi1iaXQga2VybmVsczoKKyAqLwogI2lmZGVmIENPTkZJR19YODZfMzIKIHZvaWQgZW5hYmxlX3NlcF9jcHUodm9pZCkKIHsKLQlpbnQgY3B1ID0gZ2V0X2NwdSgpOwotCXN0cnVjdCB0c3Nfc3RydWN0ICp0c3MgPSAmcGVyX2NwdShpbml0X3RzcywgY3B1KTsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzOworCWludCBjcHU7CiAKLQlpZiAoIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9TRVApKSB7Ci0JCXB1dF9jcHUoKTsKLQkJcmV0dXJuOwotCX0KKwljcHUgPSBnZXRfY3B1KCk7CisJdHNzID0gJnBlcl9jcHUoY3B1X3RzcywgY3B1KTsKKworCWlmICghYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1NFUCkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBXZSBjYWNoZSBNU1JfSUEzMl9TWVNFTlRFUl9DUydzIHZhbHVlIGluIHRoZSBUU1MncyBzczEgZmllbGQgLS0KKwkgKiBzZWUgdGhlIGJpZyBjb21tZW50IGluIHN0cnVjdCB4ODZfaHdfdHNzJ3MgZGVmaW5pdGlvbi4KKwkgKi8KIAogCXRzcy0+eDg2X3Rzcy5zczEgPSBfX0tFUk5FTF9DUzsKLQl0c3MtPng4Nl90c3Muc3AxID0gc2l6ZW9mKHN0cnVjdCB0c3Nfc3RydWN0KSArICh1bnNpZ25lZCBsb25nKSB0c3M7Ci0Jd3Jtc3IoTVNSX0lBMzJfU1lTRU5URVJfQ1MsIF9fS0VSTkVMX0NTLCAwKTsKLQl3cm1zcihNU1JfSUEzMl9TWVNFTlRFUl9FU1AsIHRzcy0+eDg2X3Rzcy5zcDEsIDApOwotCXdybXNyKE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwgKHVuc2lnbmVkIGxvbmcpIGlhMzJfc3lzZW50ZXJfdGFyZ2V0LCAwKTsKKwl3cm1zcihNU1JfSUEzMl9TWVNFTlRFUl9DUywgdHNzLT54ODZfdHNzLnNzMSwgMCk7CisKKwl3cm1zcihNU1JfSUEzMl9TWVNFTlRFUl9FU1AsCisJICAgICAgKHVuc2lnbmVkIGxvbmcpdHNzICsgb2Zmc2V0b2ZlbmQoc3RydWN0IHRzc19zdHJ1Y3QsIFNZU0VOVEVSX3N0YWNrKSwKKwkgICAgICAwKTsKKworCXdybXNyKE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwgKHVuc2lnbmVkIGxvbmcpaWEzMl9zeXNlbnRlcl90YXJnZXQsIDApOworCitvdXQ6CiAJcHV0X2NwdSgpOwogfQogI2VuZGlmCkBAIC0xMTE4LDcgKzExNTYsNyBAQAogX19zZXR1cCgiY2xlYXJjcHVpZD0iLCBzZXR1cF9kaXNhYmxlY3B1aWQpOwogCiBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBrZXJuZWxfc3RhY2spID0KLQkodW5zaWduZWQgbG9uZykmaW5pdF90aHJlYWRfdW5pb24gLSBLRVJORUxfU1RBQ0tfT0ZGU0VUICsgVEhSRUFEX1NJWkU7CisJKHVuc2lnbmVkIGxvbmcpJmluaXRfdGhyZWFkX3VuaW9uICsgVEhSRUFEX1NJWkU7CiBFWFBPUlRfUEVSX0NQVV9TWU1CT0woa2VybmVsX3N0YWNrKTsKIAogI2lmZGVmIENPTkZJR19YODZfNjQKQEAgLTExMzAsOCArMTE2OCw4IEBACiAJCSAgICAgaXJxX3N0YWNrX3VuaW9uKSBfX2FsaWduZWQoUEFHRV9TSVpFKSBfX3Zpc2libGU7CiAKIC8qCi0gKiBUaGUgZm9sbG93aW5nIGZvdXIgcGVyY3B1IHZhcmlhYmxlcyBhcmUgaG90LiAgQWxpZ24gY3VycmVudF90YXNrIHRvCi0gKiBjYWNoZWxpbmUgc2l6ZSBzdWNoIHRoYXQgYWxsIGZvdXIgZmFsbCBpbiB0aGUgc2FtZSBjYWNoZWxpbmUuCisgKiBUaGUgZm9sbG93aW5nIHBlcmNwdSB2YXJpYWJsZXMgYXJlIGhvdC4gIEFsaWduIGN1cnJlbnRfdGFzayB0bworICogY2FjaGVsaW5lIHNpemUgc3VjaCB0aGF0IHRoZXkgZmFsbCBpbiB0aGUgc2FtZSBjYWNoZWxpbmUuCiAgKi8KIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBjdXJyZW50X3Rhc2spIF9fX19jYWNoZWxpbmVfYWxpZ25lZCA9CiAJJmluaXRfdGFzazsKQEAgLTExNzEsMTAgKzEyMDksMjMgQEAKIAkgKi8KIAl3cm1zcmwoTVNSX1NUQVIsICAoKHU2NClfX1VTRVIzMl9DUyk8PDQ4ICB8ICgodTY0KV9fS0VSTkVMX0NTKTw8MzIpOwogCXdybXNybChNU1JfTFNUQVIsIHN5c3RlbV9jYWxsKTsKLQl3cm1zcmwoTVNSX0NTVEFSLCBpZ25vcmVfc3lzcmV0KTsKIAogI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgotCXN5c2NhbGwzMl9jcHVfaW5pdCgpOworCXdybXNybChNU1JfQ1NUQVIsIGlhMzJfY3N0YXJfdGFyZ2V0KTsKKwkvKgorCSAqIFRoaXMgb25seSB3b3JrcyBvbiBJbnRlbCBDUFVzLgorCSAqIE9uIEFNRCBDUFVzIHRoZXNlIE1TUnMgYXJlIDMyLWJpdCwgQ1BVIHRydW5jYXRlcyBNU1JfSUEzMl9TWVNFTlRFUl9FSVAuCisJICogVGhpcyBkb2VzIG5vdCBjYXVzZSBTWVNFTlRFUiB0byBqdW1wIHRvIHRoZSB3cm9uZyBsb2NhdGlvbiwgYmVjYXVzZQorCSAqIEFNRCBkb2Vzbid0IGFsbG93IFNZU0VOVEVSIGluIGxvbmcgbW9kZSAoZWl0aGVyIDMyLSBvciA2NC1iaXQpLgorCSAqLworCXdybXNybF9zYWZlKE1TUl9JQTMyX1NZU0VOVEVSX0NTLCAodTY0KV9fS0VSTkVMX0NTKTsKKwl3cm1zcmxfc2FmZShNU1JfSUEzMl9TWVNFTlRFUl9FU1AsIDBVTEwpOworCXdybXNybF9zYWZlKE1TUl9JQTMyX1NZU0VOVEVSX0VJUCwgKHU2NClpYTMyX3N5c2VudGVyX3RhcmdldCk7CisjZWxzZQorCXdybXNybChNU1JfQ1NUQVIsIGlnbm9yZV9zeXNyZXQpOworCXdybXNybF9zYWZlKE1TUl9JQTMyX1NZU0VOVEVSX0NTLCAodTY0KUdEVF9FTlRSWV9JTlZBTElEX1NFRyk7CisJd3Jtc3JsX3NhZmUoTVNSX0lBMzJfU1lTRU5URVJfRVNQLCAwVUxMKTsKKwl3cm1zcmxfc2FmZShNU1JfSUEzMl9TWVNFTlRFUl9FSVAsIDBVTEwpOwogI2VuZGlmCiAKIAkvKiBGbGFncyB0byBjbGVhciBvbiBzeXNjYWxsICovCkBAIC0xMjI2LDYgKzEyNzcsMTUgQEAKIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTChfX3ByZWVtcHRfY291bnQpOwogREVGSU5FX1BFUl9DUFUoc3RydWN0IHRhc2tfc3RydWN0ICosIGZwdV9vd25lcl90YXNrKTsKIAorLyoKKyAqIE9uIHg4Nl8zMiwgdm04NiBtb2RpZmllcyB0c3Muc3AwLCBzbyBzcDAgaXNuJ3QgYSByZWxpYWJsZSB3YXkgdG8gZmluZAorICogdGhlIHRvcCBvZiB0aGUga2VybmVsIHN0YWNrLiAgVXNlIGFuIGV4dHJhIHBlcmNwdSB2YXJpYWJsZSB0byB0cmFjayB0aGUKKyAqIHRvcCBvZiB0aGUga2VybmVsIHN0YWNrIGRpcmVjdGx5LgorICovCitERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCBjcHVfY3VycmVudF90b3Bfb2Zfc3RhY2spID0KKwkodW5zaWduZWQgbG9uZykmaW5pdF90aHJlYWRfdW5pb24gKyBUSFJFQURfU0laRTsKK0VYUE9SVF9QRVJfQ1BVX1NZTUJPTChjcHVfY3VycmVudF90b3Bfb2Zfc3RhY2spOworCiAjaWZkZWYgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SCiBERUZJTkVfUEVSX0NQVV9BTElHTkVEKHN0cnVjdCBzdGFja19jYW5hcnksIHN0YWNrX2NhbmFyeSk7CiAjZW5kaWYKQEAgLTEzMDcsNyArMTM2Nyw3IEBACiAJICovCiAJbG9hZF91Y29kZV9hcCgpOwogCi0JdCA9ICZwZXJfY3B1KGluaXRfdHNzLCBjcHUpOworCXQgPSAmcGVyX2NwdShjcHVfdHNzLCBjcHUpOwogCW9pc3QgPSAmcGVyX2NwdShvcmlnX2lzdCwgY3B1KTsKIAogI2lmZGVmIENPTkZJR19OVU1BCkBAIC0xMzkxLDcgKzE0NTEsNyBAQAogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyID0gY3VycmVudDsKLQlzdHJ1Y3QgdHNzX3N0cnVjdCAqdCA9ICZwZXJfY3B1KGluaXRfdHNzLCBjcHUpOworCXN0cnVjdCB0c3Nfc3RydWN0ICp0ID0gJnBlcl9jcHUoY3B1X3RzcywgY3B1KTsKIAlzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdGhyZWFkID0gJmN1cnItPnRocmVhZDsKIAogCXdhaXRfZm9yX21hc3Rlcl9jcHUoY3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCmluZGV4IDY1OTY0MzMuLmVkY2IwZTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYwpAQCAtNywxNiArNywxNCBAQAogICoJQW5kaSBLbGVlbiAvIEFuZHJlYXMgSGVycm1hbm4JOiBDUFVJRDQgZW11bGF0aW9uIG9uIEFNRC4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlaW5mby5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KICNpbmNsdWRlIDxhc20vYW1kX25iLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogCkBAIC0xMTYsMTAgKzExNCwxMCBAQAogCiAKIGVudW0gX2NhY2hlX3R5cGUgewotCUNBQ0hFX1RZUEVfTlVMTAk9IDAsCi0JQ0FDSEVfVFlQRV9EQVRBID0gMSwKLQlDQUNIRV9UWVBFX0lOU1QgPSAyLAotCUNBQ0hFX1RZUEVfVU5JRklFRCA9IDMKKwlDVFlQRV9OVUxMID0gMCwKKwlDVFlQRV9EQVRBID0gMSwKKwlDVFlQRV9JTlNUID0gMiwKKwlDVFlQRV9VTklGSUVEID0gMwogfTsKIAogdW5pb24gX2NwdWlkNF9sZWFmX2VheCB7CkBAIC0xNTksMTEgKzE1Nyw2IEBACiAJc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmI7CiB9OwogCi1zdHJ1Y3QgX2NwdWlkNF9pbmZvIHsKLQlzdHJ1Y3QgX2NwdWlkNF9pbmZvX3JlZ3MgYmFzZTsKLQlERUNMQVJFX0JJVE1BUChzaGFyZWRfY3B1X21hcCwgTlJfQ1BVUyk7Ci19OwotCiB1bnNpZ25lZCBzaG9ydAkJCW51bV9jYWNoZV9sZWF2ZXM7CiAKIC8qIEFNRCBkb2Vzbid0IGhhdmUgQ1BVSUQ0LiBFbXVsYXRlIGl0IGhlcmUgdG8gcmVwb3J0IHRoZSBzYW1lCkBAIC0yMjAsNiArMjEzLDEzIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBsZXZlbHNbXSA9IHsgMSwgMSwgMiwgMyB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdHlwZXNbXSA9IHsgMSwgMiwgMywgMyB9OwogCitzdGF0aWMgY29uc3QgZW51bSBjYWNoZV90eXBlIGNhY2hlX3R5cGVfbWFwW10gPSB7CisJW0NUWVBFX05VTExdID0gQ0FDSEVfVFlQRV9OT0NBQ0hFLAorCVtDVFlQRV9EQVRBXSA9IENBQ0hFX1RZUEVfREFUQSwKKwlbQ1RZUEVfSU5TVF0gPSBDQUNIRV9UWVBFX0lOU1QsCisJW0NUWVBFX1VOSUZJRURdID0gQ0FDSEVfVFlQRV9VTklGSUVELAorfTsKKwogc3RhdGljIHZvaWQKIGFtZF9jcHVpZDQoaW50IGxlYWYsIHVuaW9uIF9jcHVpZDRfbGVhZl9lYXggKmVheCwKIAkJICAgICB1bmlvbiBfY3B1aWQ0X2xlYWZfZWJ4ICplYngsCkBAIC0yOTEsMTQgKzI5MSw4IEBACiAJCShlYngtPnNwbGl0LndheXNfb2ZfYXNzb2NpYXRpdml0eSArIDEpIC0gMTsKIH0KIAotc3RydWN0IF9jYWNoZV9hdHRyIHsKLQlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7Ci0Jc3NpemVfdCAoKnNob3cpKHN0cnVjdCBfY3B1aWQ0X2luZm8gKiwgY2hhciAqLCB1bnNpZ25lZCBpbnQpOwotCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IF9jcHVpZDRfaW5mbyAqLCBjb25zdCBjaGFyICosIHNpemVfdCBjb3VudCwKLQkJCSB1bnNpZ25lZCBpbnQpOwotfTsKLQogI2lmIGRlZmluZWQoQ09ORklHX0FNRF9OQikgJiYgZGVmaW5lZChDT05GSUdfU1lTRlMpCisKIC8qCiAgKiBMMyBjYWNoZSBkZXNjcmlwdG9ycwogICovCkBAIC0zMjUsMjAgKzMxOSw2IEBACiAJbDMtPmluZGljZXMgPSAobWF4KG1heDMoc2MwLCBzYzEsIHNjMiksIHNjMykgPDwgMTApIC0gMTsKIH0KIAotc3RhdGljIHZvaWQgYW1kX2luaXRfbDNfY2FjaGUoc3RydWN0IF9jcHVpZDRfaW5mb19yZWdzICp0aGlzX2xlYWYsIGludCBpbmRleCkKLXsKLQlpbnQgbm9kZTsKLQotCS8qIG9ubHkgZm9yIEwzLCBhbmQgbm90IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyAqLwotCWlmIChpbmRleCA8IDMpCi0JCXJldHVybjsKLQotCW5vZGUgPSBhbWRfZ2V0X25iX2lkKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JdGhpc19sZWFmLT5uYiA9IG5vZGVfdG9fYW1kX25iKG5vZGUpOwotCWlmICh0aGlzX2xlYWYtPm5iICYmICF0aGlzX2xlYWYtPm5iLT5sM19jYWNoZS5pbmRpY2VzKQotCQlhbWRfY2FsY19sM19pbmRpY2VzKHRoaXNfbGVhZi0+bmIpOwotfQotCiAvKgogICogY2hlY2sgd2hldGhlciBhIHNsb3QgdXNlZCBmb3IgZGlzYWJsaW5nIGFuIEwzIGluZGV4IGlzIG9jY3VwaWVkLgogICogQGwzOiBMMyBjYWNoZSBkZXNjcmlwdG9yCkBAIC0zNTksMTUgKzMzOSwxMyBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIHNzaXplX3Qgc2hvd19jYWNoZV9kaXNhYmxlKHN0cnVjdCBfY3B1aWQ0X2luZm8gKnRoaXNfbGVhZiwgY2hhciAqYnVmLAorc3RhdGljIHNzaXplX3Qgc2hvd19jYWNoZV9kaXNhYmxlKHN0cnVjdCBjYWNoZWluZm8gKnRoaXNfbGVhZiwgY2hhciAqYnVmLAogCQkJCSAgdW5zaWduZWQgaW50IHNsb3QpCiB7CiAJaW50IGluZGV4OworCXN0cnVjdCBhbWRfbm9ydGhicmlkZ2UgKm5iID0gdGhpc19sZWFmLT5wcml2OwogCi0JaWYgKCF0aGlzX2xlYWYtPmJhc2UubmIgfHwgIWFtZF9uYl9oYXNfZmVhdHVyZShBTURfTkJfTDNfSU5ERVhfRElTQUJMRSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaW5kZXggPSBhbWRfZ2V0X2wzX2Rpc2FibGVfc2xvdCh0aGlzX2xlYWYtPmJhc2UubmIsIHNsb3QpOworCWluZGV4ID0gYW1kX2dldF9sM19kaXNhYmxlX3Nsb3QobmIsIHNsb3QpOwogCWlmIChpbmRleCA+PSAwKQogCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaW5kZXgpOwogCkBAIC0zNzYsOSArMzU0LDEwIEBACiAKICNkZWZpbmUgU0hPV19DQUNIRV9ESVNBQkxFKHNsb3QpCQkJCQlcCiBzdGF0aWMgc3NpemVfdAkJCQkJCQkJXAotc2hvd19jYWNoZV9kaXNhYmxlXyMjc2xvdChzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZiwJXAotCQkJICB1bnNpZ25lZCBpbnQgY3B1KQkJCQlcCitjYWNoZV9kaXNhYmxlXyMjc2xvdCMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJCQlcCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikJXAogewkJCQkJCQkJCVwKKwlzdHJ1Y3QgY2FjaGVpbmZvICp0aGlzX2xlYWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKIAlyZXR1cm4gc2hvd19jYWNoZV9kaXNhYmxlKHRoaXNfbGVhZiwgYnVmLCBzbG90KTsJCVwKIH0KIFNIT1dfQ0FDSEVfRElTQUJMRSgwKQpAQCAtNDQ2LDI1ICs0MjUsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc3RvcmVfY2FjaGVfZGlzYWJsZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsCi0JCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCQkgIHVuc2lnbmVkIGludCBzbG90KQorc3RhdGljIHNzaXplX3Qgc3RvcmVfY2FjaGVfZGlzYWJsZShzdHJ1Y3QgY2FjaGVpbmZvICp0aGlzX2xlYWYsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkJICAgdW5zaWduZWQgaW50IHNsb3QpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWwgPSAwOwogCWludCBjcHUsIGVyciA9IDA7CisJc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmIgPSB0aGlzX2xlYWYtPnByaXY7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlpZiAoIXRoaXNfbGVhZi0+YmFzZS5uYiB8fCAhYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19JTkRFWF9ESVNBQkxFKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljcHUgPSBjcHVtYXNrX2ZpcnN0KHRvX2NwdW1hc2sodGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCkpOworCWNwdSA9IGNwdW1hc2tfZmlyc3QoJnRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApOwogCiAJaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllcnIgPSBhbWRfc2V0X2wzX2Rpc2FibGVfc2xvdCh0aGlzX2xlYWYtPmJhc2UubmIsIGNwdSwgc2xvdCwgdmFsKTsKKwllcnIgPSBhbWRfc2V0X2wzX2Rpc2FibGVfc2xvdChuYiwgY3B1LCBzbG90LCB2YWwpOwogCWlmIChlcnIpIHsKIAkJaWYgKGVyciA9PSAtRUVYSVNUKQogCQkJcHJfd2FybmluZygiTDMgc2xvdCAlZCBpbiB1c2UvaW5kZXggYWxyZWFkeSBkaXNhYmxlZCFcbiIsCkBAIC00NzYsNDEgKzQ1MywzNiBAQAogCiAjZGVmaW5lIFNUT1JFX0NBQ0hFX0RJU0FCTEUoc2xvdCkJCQkJCVwKIHN0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCi1zdG9yZV9jYWNoZV9kaXNhYmxlXyMjc2xvdChzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsCQlcCi0JCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwJCVwKLQkJCSAgIHVuc2lnbmVkIGludCBjcHUpCQkJCVwKK2NhY2hlX2Rpc2FibGVfIyNzbG90IyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKKwkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCQlcCisJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQkJXAogewkJCQkJCQkJCVwKKwlzdHJ1Y3QgY2FjaGVpbmZvICp0aGlzX2xlYWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsJCVwKIAlyZXR1cm4gc3RvcmVfY2FjaGVfZGlzYWJsZSh0aGlzX2xlYWYsIGJ1ZiwgY291bnQsIHNsb3QpOwlcCiB9CiBTVE9SRV9DQUNIRV9ESVNBQkxFKDApCiBTVE9SRV9DQUNIRV9ESVNBQkxFKDEpCiAKLXN0YXRpYyBzdHJ1Y3QgX2NhY2hlX2F0dHIgY2FjaGVfZGlzYWJsZV8wID0gX19BVFRSKGNhY2hlX2Rpc2FibGVfMCwgMDY0NCwKLQkJc2hvd19jYWNoZV9kaXNhYmxlXzAsIHN0b3JlX2NhY2hlX2Rpc2FibGVfMCk7Ci1zdGF0aWMgc3RydWN0IF9jYWNoZV9hdHRyIGNhY2hlX2Rpc2FibGVfMSA9IF9fQVRUUihjYWNoZV9kaXNhYmxlXzEsIDA2NDQsCi0JCXNob3dfY2FjaGVfZGlzYWJsZV8xLCBzdG9yZV9jYWNoZV9kaXNhYmxlXzEpOwotCi1zdGF0aWMgc3NpemVfdAotc2hvd19zdWJjYWNoZXMoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBjcHUpCitzdGF0aWMgc3NpemVfdCBzdWJjYWNoZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCWlmICghdGhpc19sZWFmLT5iYXNlLm5iIHx8ICFhbWRfbmJfaGFzX2ZlYXR1cmUoQU1EX05CX0wzX1BBUlRJVElPTklORykpCi0JCXJldHVybiAtRUlOVkFMOworCXN0cnVjdCBjYWNoZWluZm8gKnRoaXNfbGVhZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBjcHUgPSBjcHVtYXNrX2ZpcnN0KCZ0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKTsKIAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV4XG4iLCBhbWRfZ2V0X3N1YmNhY2hlcyhjcHUpKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLXN0b3JlX3N1YmNhY2hlcyhzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAotCQl1bnNpZ25lZCBpbnQgY3B1KQorc3RhdGljIHNzaXplX3Qgc3ViY2FjaGVzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKKwlzdHJ1Y3QgY2FjaGVpbmZvICp0aGlzX2xlYWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgY3B1ID0gY3B1bWFza19maXJzdCgmdGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCk7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlpZiAoIXRoaXNfbGVhZi0+YmFzZS5uYiB8fCAhYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19QQVJUSVRJT05JTkcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWlmIChrc3RydG91bChidWYsIDE2LCAmdmFsKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC01MjAsOSArNDkyLDkyIEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3RydWN0IF9jYWNoZV9hdHRyIHN1YmNhY2hlcyA9Ci0JX19BVFRSKHN1YmNhY2hlcywgMDY0NCwgc2hvd19zdWJjYWNoZXMsIHN0b3JlX3N1YmNhY2hlcyk7CitzdGF0aWMgREVWSUNFX0FUVFJfUlcoY2FjaGVfZGlzYWJsZV8wKTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyhjYWNoZV9kaXNhYmxlXzEpOworc3RhdGljIERFVklDRV9BVFRSX1JXKHN1YmNhY2hlcyk7CiAKK3N0YXRpYyB1bW9kZV90CitjYWNoZV9wcml2YXRlX2F0dHJzX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgaW50IHVudXNlZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBrb2JqX3RvX2Rldihrb2JqKTsKKwlzdHJ1Y3QgY2FjaGVpbmZvICp0aGlzX2xlYWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bW9kZV90IG1vZGUgPSBhdHRyLT5tb2RlOworCisJaWYgKCF0aGlzX2xlYWYtPnByaXYpCisJCXJldHVybiAwOworCisJaWYgKChhdHRyID09ICZkZXZfYXR0cl9zdWJjYWNoZXMuYXR0cikgJiYKKwkgICAgYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19QQVJUSVRJT05JTkcpKQorCQlyZXR1cm4gbW9kZTsKKworCWlmICgoYXR0ciA9PSAmZGV2X2F0dHJfY2FjaGVfZGlzYWJsZV8wLmF0dHIgfHwKKwkgICAgIGF0dHIgPT0gJmRldl9hdHRyX2NhY2hlX2Rpc2FibGVfMS5hdHRyKSAmJgorCSAgICBhbWRfbmJfaGFzX2ZlYXR1cmUoQU1EX05CX0wzX0lOREVYX0RJU0FCTEUpKQorCQlyZXR1cm4gbW9kZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjYWNoZV9wcml2YXRlX2dyb3VwID0geworCS5pc192aXNpYmxlID0gY2FjaGVfcHJpdmF0ZV9hdHRyc19pc192aXNpYmxlLAorfTsKKworc3RhdGljIHZvaWQgaW5pdF9hbWRfbDNfYXR0cnModm9pZCkKK3sKKwlpbnQgbiA9IDE7CisJc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKiphbWRfbDNfYXR0cnM7CisKKwlpZiAoYW1kX2wzX2F0dHJzKSAvKiBhbHJlYWR5IGluaXRpYWxpemVkICovCisJCXJldHVybjsKKworCWlmIChhbWRfbmJfaGFzX2ZlYXR1cmUoQU1EX05CX0wzX0lOREVYX0RJU0FCTEUpKQorCQluICs9IDI7CisJaWYgKGFtZF9uYl9oYXNfZmVhdHVyZShBTURfTkJfTDNfUEFSVElUSU9OSU5HKSkKKwkJbiArPSAxOworCisJYW1kX2wzX2F0dHJzID0ga2NhbGxvYyhuLCBzaXplb2YoKmFtZF9sM19hdHRycyksIEdGUF9LRVJORUwpOworCWlmICghYW1kX2wzX2F0dHJzKQorCQlyZXR1cm47CisKKwluID0gMDsKKwlpZiAoYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19JTkRFWF9ESVNBQkxFKSkgeworCQlhbWRfbDNfYXR0cnNbbisrXSA9ICZkZXZfYXR0cl9jYWNoZV9kaXNhYmxlXzAuYXR0cjsKKwkJYW1kX2wzX2F0dHJzW24rK10gPSAmZGV2X2F0dHJfY2FjaGVfZGlzYWJsZV8xLmF0dHI7CisJfQorCWlmIChhbWRfbmJfaGFzX2ZlYXR1cmUoQU1EX05CX0wzX1BBUlRJVElPTklORykpCisJCWFtZF9sM19hdHRyc1tuKytdID0gJmRldl9hdHRyX3N1YmNhY2hlcy5hdHRyOworCisJY2FjaGVfcHJpdmF0ZV9ncm91cC5hdHRycyA9IGFtZF9sM19hdHRyczsKK30KKworY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqCitjYWNoZV9nZXRfcHJpdl9ncm91cChzdHJ1Y3QgY2FjaGVpbmZvICp0aGlzX2xlYWYpCit7CisJc3RydWN0IGFtZF9ub3J0aGJyaWRnZSAqbmIgPSB0aGlzX2xlYWYtPnByaXY7CisKKwlpZiAodGhpc19sZWFmLT5sZXZlbCA8IDMgfHwgIW5iKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChuYiAmJiBuYi0+bDNfY2FjaGUuaW5kaWNlcykKKwkJaW5pdF9hbWRfbDNfYXR0cnMoKTsKKworCXJldHVybiAmY2FjaGVfcHJpdmF0ZV9ncm91cDsKK30KKworc3RhdGljIHZvaWQgYW1kX2luaXRfbDNfY2FjaGUoc3RydWN0IF9jcHVpZDRfaW5mb19yZWdzICp0aGlzX2xlYWYsIGludCBpbmRleCkKK3sKKwlpbnQgbm9kZTsKKworCS8qIG9ubHkgZm9yIEwzLCBhbmQgbm90IGluIHZpcnR1YWxpemVkIGVudmlyb25tZW50cyAqLworCWlmIChpbmRleCA8IDMpCisJCXJldHVybjsKKworCW5vZGUgPSBhbWRfZ2V0X25iX2lkKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJdGhpc19sZWFmLT5uYiA9IG5vZGVfdG9fYW1kX25iKG5vZGUpOworCWlmICh0aGlzX2xlYWYtPm5iICYmICF0aGlzX2xlYWYtPm5iLT5sM19jYWNoZS5pbmRpY2VzKQorCQlhbWRfY2FsY19sM19pbmRpY2VzKHRoaXNfbGVhZi0+bmIpOworfQogI2Vsc2UKICNkZWZpbmUgYW1kX2luaXRfbDNfY2FjaGUoeCwgeSkKICNlbmRpZiAgLyogQ09ORklHX0FNRF9OQiAmJiBDT05GSUdfU1lTRlMgKi8KQEAgLTU0Niw3ICs2MDEsNyBAQAogCQljcHVpZF9jb3VudCg0LCBpbmRleCwgJmVheC5mdWxsLCAmZWJ4LmZ1bGwsICZlY3guZnVsbCwgJmVkeCk7CiAJfQogCi0JaWYgKGVheC5zcGxpdC50eXBlID09IENBQ0hFX1RZUEVfTlVMTCkKKwlpZiAoZWF4LnNwbGl0LnR5cGUgPT0gQ1RZUEVfTlVMTCkKIAkJcmV0dXJuIC1FSU87IC8qIGJldHRlciBlcnJvciA/ICovCiAKIAl0aGlzX2xlYWYtPmVheCA9IGVheDsKQEAgLTU3NSw3ICs2MzAsNyBAQAogCQkvKiBEbyBjcHVpZChvcCkgbG9vcCB0byBmaW5kIG91dCBudW1fY2FjaGVfbGVhdmVzICovCiAJCWNwdWlkX2NvdW50KG9wLCBpLCAmZWF4LCAmZWJ4LCAmZWN4LCAmZWR4KTsKIAkJY2FjaGVfZWF4LmZ1bGwgPSBlYXg7Ci0JfSB3aGlsZSAoY2FjaGVfZWF4LnNwbGl0LnR5cGUgIT0gQ0FDSEVfVFlQRV9OVUxMKTsKKwl9IHdoaWxlIChjYWNoZV9lYXguc3BsaXQudHlwZSAhPSBDVFlQRV9OVUxMKTsKIAlyZXR1cm4gaTsKIH0KIApAQCAtNjI2LDkgKzY4MSw5IEBACiAKIAkJCXN3aXRjaCAodGhpc19sZWFmLmVheC5zcGxpdC5sZXZlbCkgewogCQkJY2FzZSAxOgotCQkJCWlmICh0aGlzX2xlYWYuZWF4LnNwbGl0LnR5cGUgPT0gQ0FDSEVfVFlQRV9EQVRBKQorCQkJCWlmICh0aGlzX2xlYWYuZWF4LnNwbGl0LnR5cGUgPT0gQ1RZUEVfREFUQSkKIAkJCQkJbmV3X2wxZCA9IHRoaXNfbGVhZi5zaXplLzEwMjQ7Ci0JCQkJZWxzZSBpZiAodGhpc19sZWFmLmVheC5zcGxpdC50eXBlID09IENBQ0hFX1RZUEVfSU5TVCkKKwkJCQllbHNlIGlmICh0aGlzX2xlYWYuZWF4LnNwbGl0LnR5cGUgPT0gQ1RZUEVfSU5TVCkKIAkJCQkJbmV3X2wxaSA9IHRoaXNfbGVhZi5zaXplLzEwMjQ7CiAJCQkJYnJlYWs7CiAJCQljYXNlIDI6CkBAIC03NDcsNTUgKzgwMiw1MiBAQAogCXJldHVybiBsMjsKIH0KIAotI2lmZGVmIENPTkZJR19TWVNGUwotCi0vKiBwb2ludGVyIHRvIF9jcHVpZDRfaW5mbyBhcnJheSAoZm9yIGVhY2ggY2FjaGUgbGVhZikgKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgX2NwdWlkNF9pbmZvICosIGljaV9jcHVpZDRfaW5mbyk7Ci0jZGVmaW5lIENQVUlENF9JTkZPX0lEWCh4LCB5KQkoJigocGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIHgpKVt5XSkpCi0KLSNpZmRlZiBDT05GSUdfU01QCi0KLXN0YXRpYyBpbnQgY2FjaGVfc2hhcmVkX2FtZF9jcHVfbWFwX3NldHVwKHVuc2lnbmVkIGludCBjcHUsIGludCBpbmRleCkKK3N0YXRpYyBpbnQgX19jYWNoZV9hbWRfY3B1bWFwX3NldHVwKHVuc2lnbmVkIGludCBjcHUsIGludCBpbmRleCwKKwkJCQkgICAgc3RydWN0IF9jcHVpZDRfaW5mb19yZWdzICpiYXNlKQogewotCXN0cnVjdCBfY3B1aWQ0X2luZm8gKnRoaXNfbGVhZjsKKwlzdHJ1Y3QgY3B1X2NhY2hlaW5mbyAqdGhpc19jcHVfY2kgPSBnZXRfY3B1X2NhY2hlaW5mbyhjcHUpOworCXN0cnVjdCBjYWNoZWluZm8gKnRoaXNfbGVhZjsKIAlpbnQgaSwgc2libGluZzsKIAogCWlmIChjcHVfaGFzX3RvcG9leHQpIHsKIAkJdW5zaWduZWQgaW50IGFwaWNpZCwgbnNoYXJlZCwgZmlyc3QsIGxhc3Q7CiAKLQkJaWYgKCFwZXJfY3B1KGljaV9jcHVpZDRfaW5mbywgY3B1KSkKLQkJCXJldHVybiAwOwotCi0JCXRoaXNfbGVhZiA9IENQVUlENF9JTkZPX0lEWChjcHUsIGluZGV4KTsKLQkJbnNoYXJlZCA9IHRoaXNfbGVhZi0+YmFzZS5lYXguc3BsaXQubnVtX3RocmVhZHNfc2hhcmluZyArIDE7CisJCXRoaXNfbGVhZiA9IHRoaXNfY3B1X2NpLT5pbmZvX2xpc3QgKyBpbmRleDsKKwkJbnNoYXJlZCA9IGJhc2UtPmVheC5zcGxpdC5udW1fdGhyZWFkc19zaGFyaW5nICsgMTsKIAkJYXBpY2lkID0gY3B1X2RhdGEoY3B1KS5hcGljaWQ7CiAJCWZpcnN0ID0gYXBpY2lkIC0gKGFwaWNpZCAlIG5zaGFyZWQpOwogCQlsYXN0ID0gZmlyc3QgKyBuc2hhcmVkIC0gMTsKIAogCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwkJCXRoaXNfY3B1X2NpID0gZ2V0X2NwdV9jYWNoZWluZm8oaSk7CisJCQlpZiAoIXRoaXNfY3B1X2NpLT5pbmZvX2xpc3QpCisJCQkJY29udGludWU7CisKIAkJCWFwaWNpZCA9IGNwdV9kYXRhKGkpLmFwaWNpZDsKIAkJCWlmICgoYXBpY2lkIDwgZmlyc3QpIHx8IChhcGljaWQgPiBsYXN0KSkKIAkJCQljb250aW51ZTsKLQkJCWlmICghcGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGkpKQotCQkJCWNvbnRpbnVlOwotCQkJdGhpc19sZWFmID0gQ1BVSUQ0X0lORk9fSURYKGksIGluZGV4KTsKKworCQkJdGhpc19sZWFmID0gdGhpc19jcHVfY2ktPmluZm9fbGlzdCArIGluZGV4OwogCiAJCQlmb3JfZWFjaF9vbmxpbmVfY3B1KHNpYmxpbmcpIHsKIAkJCQlhcGljaWQgPSBjcHVfZGF0YShzaWJsaW5nKS5hcGljaWQ7CiAJCQkJaWYgKChhcGljaWQgPCBmaXJzdCkgfHwgKGFwaWNpZCA+IGxhc3QpKQogCQkJCQljb250aW51ZTsKLQkJCQlzZXRfYml0KHNpYmxpbmcsIHRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApOworCQkJCWNwdW1hc2tfc2V0X2NwdShzaWJsaW5nLAorCQkJCQkJJnRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApOwogCQkJfQogCQl9CiAJfSBlbHNlIGlmIChpbmRleCA9PSAzKSB7CiAJCWZvcl9lYWNoX2NwdShpLCBjcHVfbGxjX3NoYXJlZF9tYXNrKGNwdSkpIHsKLQkJCWlmICghcGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGkpKQorCQkJdGhpc19jcHVfY2kgPSBnZXRfY3B1X2NhY2hlaW5mbyhpKTsKKwkJCWlmICghdGhpc19jcHVfY2ktPmluZm9fbGlzdCkKIAkJCQljb250aW51ZTsKLQkJCXRoaXNfbGVhZiA9IENQVUlENF9JTkZPX0lEWChpLCBpbmRleCk7CisJCQl0aGlzX2xlYWYgPSB0aGlzX2NwdV9jaS0+aW5mb19saXN0ICsgaW5kZXg7CiAJCQlmb3JfZWFjaF9jcHUoc2libGluZywgY3B1X2xsY19zaGFyZWRfbWFzayhjcHUpKSB7CiAJCQkJaWYgKCFjcHVfb25saW5lKHNpYmxpbmcpKQogCQkJCQljb250aW51ZTsKLQkJCQlzZXRfYml0KHNpYmxpbmcsIHRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApOworCQkJCWNwdW1hc2tfc2V0X2NwdShzaWJsaW5nLAorCQkJCQkJJnRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApOwogCQkJfQogCQl9CiAJfSBlbHNlCkBAIC04MDQsNDU3ICs4NTYsODYgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgY2FjaGVfc2hhcmVkX2NwdV9tYXBfc2V0dXAodW5zaWduZWQgaW50IGNwdSwgaW50IGluZGV4KQorc3RhdGljIHZvaWQgX19jYWNoZV9jcHVtYXBfc2V0dXAodW5zaWduZWQgaW50IGNwdSwgaW50IGluZGV4LAorCQkJCSBzdHJ1Y3QgX2NwdWlkNF9pbmZvX3JlZ3MgKmJhc2UpCiB7Ci0Jc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLCAqc2libGluZ19sZWFmOworCXN0cnVjdCBjcHVfY2FjaGVpbmZvICp0aGlzX2NwdV9jaSA9IGdldF9jcHVfY2FjaGVpbmZvKGNwdSk7CisJc3RydWN0IGNhY2hlaW5mbyAqdGhpc19sZWFmLCAqc2libGluZ19sZWFmOwogCXVuc2lnbmVkIGxvbmcgbnVtX3RocmVhZHNfc2hhcmluZzsKIAlpbnQgaW5kZXhfbXNiLCBpOwogCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHUpOwogCiAJaWYgKGMtPng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpIHsKLQkJaWYgKGNhY2hlX3NoYXJlZF9hbWRfY3B1X21hcF9zZXR1cChjcHUsIGluZGV4KSkKKwkJaWYgKF9fY2FjaGVfYW1kX2NwdW1hcF9zZXR1cChjcHUsIGluZGV4LCBiYXNlKSkKIAkJCXJldHVybjsKIAl9CiAKLQl0aGlzX2xlYWYgPSBDUFVJRDRfSU5GT19JRFgoY3B1LCBpbmRleCk7Ci0JbnVtX3RocmVhZHNfc2hhcmluZyA9IDEgKyB0aGlzX2xlYWYtPmJhc2UuZWF4LnNwbGl0Lm51bV90aHJlYWRzX3NoYXJpbmc7CisJdGhpc19sZWFmID0gdGhpc19jcHVfY2ktPmluZm9fbGlzdCArIGluZGV4OworCW51bV90aHJlYWRzX3NoYXJpbmcgPSAxICsgYmFzZS0+ZWF4LnNwbGl0Lm51bV90aHJlYWRzX3NoYXJpbmc7CiAKKwljcHVtYXNrX3NldF9jcHUoY3B1LCAmdGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCk7CiAJaWYgKG51bV90aHJlYWRzX3NoYXJpbmcgPT0gMSkKLQkJY3B1bWFza19zZXRfY3B1KGNwdSwgdG9fY3B1bWFzayh0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7Ci0JZWxzZSB7Ci0JCWluZGV4X21zYiA9IGdldF9jb3VudF9vcmRlcihudW1fdGhyZWFkc19zaGFyaW5nKTsKKwkJcmV0dXJuOwogCi0JCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewotCQkJaWYgKGNwdV9kYXRhKGkpLmFwaWNpZCA+PiBpbmRleF9tc2IgPT0KLQkJCSAgICBjLT5hcGljaWQgPj4gaW5kZXhfbXNiKSB7Ci0JCQkJY3B1bWFza19zZXRfY3B1KGksCi0JCQkJCXRvX2NwdW1hc2sodGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCkpOwotCQkJCWlmIChpICE9IGNwdSAmJiBwZXJfY3B1KGljaV9jcHVpZDRfaW5mbywgaSkpICB7Ci0JCQkJCXNpYmxpbmdfbGVhZiA9Ci0JCQkJCQlDUFVJRDRfSU5GT19JRFgoaSwgaW5kZXgpOwotCQkJCQljcHVtYXNrX3NldF9jcHUoY3B1LCB0b19jcHVtYXNrKAotCQkJCQkJc2libGluZ19sZWFmLT5zaGFyZWRfY3B1X21hcCkpOwotCQkJCX0KLQkJCX0KKwlpbmRleF9tc2IgPSBnZXRfY291bnRfb3JkZXIobnVtX3RocmVhZHNfc2hhcmluZyk7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpCisJCWlmIChjcHVfZGF0YShpKS5hcGljaWQgPj4gaW5kZXhfbXNiID09IGMtPmFwaWNpZCA+PiBpbmRleF9tc2IpIHsKKwkJCXN0cnVjdCBjcHVfY2FjaGVpbmZvICpzaWJfY3B1X2NpID0gZ2V0X2NwdV9jYWNoZWluZm8oaSk7CisKKwkJCWlmIChpID09IGNwdSB8fCAhc2liX2NwdV9jaS0+aW5mb19saXN0KQorCQkJCWNvbnRpbnVlOy8qIHNraXAgaWYgaXRzZWxmIG9yIG5vIGNhY2hlaW5mbyAqLworCQkJc2libGluZ19sZWFmID0gc2liX2NwdV9jaS0+aW5mb19saXN0ICsgaW5kZXg7CisJCQljcHVtYXNrX3NldF9jcHUoaSwgJnRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApOworCQkJY3B1bWFza19zZXRfY3B1KGNwdSwgJnNpYmxpbmdfbGVhZi0+c2hhcmVkX2NwdV9tYXApOwogCQl9Ci0JfQotfQotc3RhdGljIHZvaWQgY2FjaGVfcmVtb3ZlX3NoYXJlZF9jcHVfbWFwKHVuc2lnbmVkIGludCBjcHUsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgX2NwdWlkNF9pbmZvCSp0aGlzX2xlYWYsICpzaWJsaW5nX2xlYWY7Ci0JaW50IHNpYmxpbmc7Ci0KLQl0aGlzX2xlYWYgPSBDUFVJRDRfSU5GT19JRFgoY3B1LCBpbmRleCk7Ci0JZm9yX2VhY2hfY3B1KHNpYmxpbmcsIHRvX2NwdW1hc2sodGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCkpIHsKLQkJc2libGluZ19sZWFmID0gQ1BVSUQ0X0lORk9fSURYKHNpYmxpbmcsIGluZGV4KTsKLQkJY3B1bWFza19jbGVhcl9jcHUoY3B1LAotCQkJCSAgdG9fY3B1bWFzayhzaWJsaW5nX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7Ci0JfQotfQotI2Vsc2UKLXN0YXRpYyB2b2lkIGNhY2hlX3NoYXJlZF9jcHVfbWFwX3NldHVwKHVuc2lnbmVkIGludCBjcHUsIGludCBpbmRleCkKLXsKIH0KIAotc3RhdGljIHZvaWQgY2FjaGVfcmVtb3ZlX3NoYXJlZF9jcHVfbWFwKHVuc2lnbmVkIGludCBjcHUsIGludCBpbmRleCkKK3N0YXRpYyB2b2lkIGNpX2xlYWZfaW5pdChzdHJ1Y3QgY2FjaGVpbmZvICp0aGlzX2xlYWYsCisJCQkgc3RydWN0IF9jcHVpZDRfaW5mb19yZWdzICpiYXNlKQogewotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGZyZWVfY2FjaGVfYXR0cmlidXRlcyh1bnNpZ25lZCBpbnQgY3B1KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9jYWNoZV9sZWF2ZXM7IGkrKykKLQkJY2FjaGVfcmVtb3ZlX3NoYXJlZF9jcHVfbWFwKGNwdSwgaSk7Ci0KLQlrZnJlZShwZXJfY3B1KGljaV9jcHVpZDRfaW5mbywgY3B1KSk7Ci0JcGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGNwdSkgPSBOVUxMOworCXRoaXNfbGVhZi0+bGV2ZWwgPSBiYXNlLT5lYXguc3BsaXQubGV2ZWw7CisJdGhpc19sZWFmLT50eXBlID0gY2FjaGVfdHlwZV9tYXBbYmFzZS0+ZWF4LnNwbGl0LnR5cGVdOworCXRoaXNfbGVhZi0+Y29oZXJlbmN5X2xpbmVfc2l6ZSA9CisJCQkJYmFzZS0+ZWJ4LnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUgKyAxOworCXRoaXNfbGVhZi0+d2F5c19vZl9hc3NvY2lhdGl2aXR5ID0KKwkJCQliYXNlLT5lYnguc3BsaXQud2F5c19vZl9hc3NvY2lhdGl2aXR5ICsgMTsKKwl0aGlzX2xlYWYtPnNpemUgPSBiYXNlLT5zaXplOworCXRoaXNfbGVhZi0+bnVtYmVyX29mX3NldHMgPSBiYXNlLT5lY3guc3BsaXQubnVtYmVyX29mX3NldHMgKyAxOworCXRoaXNfbGVhZi0+cGh5c2ljYWxfbGluZV9wYXJ0aXRpb24gPQorCQkJCWJhc2UtPmVieC5zcGxpdC5waHlzaWNhbF9saW5lX3BhcnRpdGlvbiArIDE7CisJdGhpc19sZWFmLT5wcml2ID0gYmFzZS0+bmI7CiB9CiAKLXN0YXRpYyB2b2lkIGdldF9jcHVfbGVhdmVzKHZvaWQgKl9yZXR2YWwpCitzdGF0aWMgaW50IF9faW5pdF9jYWNoZV9sZXZlbCh1bnNpZ25lZCBpbnQgY3B1KQogewotCWludCBqLCAqcmV0dmFsID0gX3JldHZhbCwgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBjcHVfY2FjaGVpbmZvICp0aGlzX2NwdV9jaSA9IGdldF9jcHVfY2FjaGVpbmZvKGNwdSk7CiAKLQkvKiBEbyBjcHVpZCBhbmQgc3RvcmUgdGhlIHJlc3VsdHMgKi8KLQlmb3IgKGogPSAwOyBqIDwgbnVtX2NhY2hlX2xlYXZlczsgaisrKSB7Ci0JCXN0cnVjdCBfY3B1aWQ0X2luZm8gKnRoaXNfbGVhZiA9IENQVUlENF9JTkZPX0lEWChjcHUsIGopOwotCi0JCSpyZXR2YWwgPSBjcHVpZDRfY2FjaGVfbG9va3VwX3JlZ3MoaiwgJnRoaXNfbGVhZi0+YmFzZSk7Ci0JCWlmICh1bmxpa2VseSgqcmV0dmFsIDwgMCkpIHsKLQkJCWludCBpOwotCi0JCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKQotCQkJCWNhY2hlX3JlbW92ZV9zaGFyZWRfY3B1X21hcChjcHUsIGkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJY2FjaGVfc2hhcmVkX2NwdV9tYXBfc2V0dXAoY3B1LCBqKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgZGV0ZWN0X2NhY2hlX2F0dHJpYnV0ZXModW5zaWduZWQgaW50IGNwdSkKLXsKLQlpbnQJCQlyZXR2YWw7Ci0KLQlpZiAobnVtX2NhY2hlX2xlYXZlcyA9PSAwKQorCWlmICghbnVtX2NhY2hlX2xlYXZlcykKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQlwZXJfY3B1KGljaV9jcHVpZDRfaW5mbywgY3B1KSA9IGt6YWxsb2MoCi0JICAgIHNpemVvZihzdHJ1Y3QgX2NwdWlkNF9pbmZvKSAqIG51bV9jYWNoZV9sZWF2ZXMsIEdGUF9LRVJORUwpOwotCWlmIChwZXJfY3B1KGljaV9jcHVpZDRfaW5mbywgY3B1KSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGdldF9jcHVfbGVhdmVzLCAmcmV0dmFsLCB0cnVlKTsKLQlpZiAocmV0dmFsKSB7Ci0JCWtmcmVlKHBlcl9jcHUoaWNpX2NwdWlkNF9pbmZvLCBjcHUpKTsKLQkJcGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGNwdSkgPSBOVUxMOwotCX0KLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLSNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLQotLyogcG9pbnRlciB0byBrb2JqZWN0IGZvciBjcHVYL2NhY2hlICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGtvYmplY3QgKiwgaWNpX2NhY2hlX2tvYmplY3QpOwotCi1zdHJ1Y3QgX2luZGV4X2tvYmplY3QgewotCXN0cnVjdCBrb2JqZWN0IGtvYmo7Ci0JdW5zaWduZWQgaW50IGNwdTsKLQl1bnNpZ25lZCBzaG9ydCBpbmRleDsKLX07Ci0KLS8qIHBvaW50ZXIgdG8gYXJyYXkgb2Yga29iamVjdHMgZm9yIGNwdVgvY2FjaGUvaW5kZXhZICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IF9pbmRleF9rb2JqZWN0ICosIGljaV9pbmRleF9rb2JqZWN0KTsKLSNkZWZpbmUgSU5ERVhfS09CSkVDVF9QVFIoeCwgeSkJCSgmKChwZXJfY3B1KGljaV9pbmRleF9rb2JqZWN0LCB4KSlbeV0pKQotCi0jZGVmaW5lIHNob3dfb25lX3BsdXMoZmlsZV9uYW1lLCBvYmplY3QsIHZhbCkJCQkJXAotc3RhdGljIHNzaXplX3Qgc2hvd18jI2ZpbGVfbmFtZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZiwgXAotCQkJCXVuc2lnbmVkIGludCBjcHUpCQkJXAotewkJCQkJCQkJCVwKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsICh1bnNpZ25lZCBsb25nKXRoaXNfbGVhZi0+b2JqZWN0ICsgdmFsKTsgXAotfQotCi1zaG93X29uZV9wbHVzKGxldmVsLCBiYXNlLmVheC5zcGxpdC5sZXZlbCwgMCk7Ci1zaG93X29uZV9wbHVzKGNvaGVyZW5jeV9saW5lX3NpemUsIGJhc2UuZWJ4LnNwbGl0LmNvaGVyZW5jeV9saW5lX3NpemUsIDEpOwotc2hvd19vbmVfcGx1cyhwaHlzaWNhbF9saW5lX3BhcnRpdGlvbiwgYmFzZS5lYnguc3BsaXQucGh5c2ljYWxfbGluZV9wYXJ0aXRpb24sIDEpOwotc2hvd19vbmVfcGx1cyh3YXlzX29mX2Fzc29jaWF0aXZpdHksIGJhc2UuZWJ4LnNwbGl0LndheXNfb2ZfYXNzb2NpYXRpdml0eSwgMSk7Ci1zaG93X29uZV9wbHVzKG51bWJlcl9vZl9zZXRzLCBiYXNlLmVjeC5zcGxpdC5udW1iZXJfb2Zfc2V0cywgMSk7Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfc2l6ZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZiwKLQkJCSB1bnNpZ25lZCBpbnQgY3B1KQotewotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdUtcbiIsIHRoaXNfbGVhZi0+YmFzZS5zaXplIC8gMTAyNCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfc2hhcmVkX2NwdV9tYXBfZnVuYyhzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsCi0JCQkJCWludCB0eXBlLCBjaGFyICpidWYpCi17Ci0JY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2sgPSB0b19jcHVtYXNrKHRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApOwotCWludCByZXQ7Ci0KLQlpZiAodHlwZSkKLQkJcmV0ID0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiUqcGJsIiwKLQkJCQljcHVtYXNrX3ByX2FyZ3MobWFzaykpOwotCWVsc2UKLQkJcmV0ID0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiUqcGIiLAotCQkJCWNwdW1hc2tfcHJfYXJncyhtYXNrKSk7Ci0JYnVmW3JldCsrXSA9ICdcbic7Ci0JYnVmW3JldF0gPSAnXDAnOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3NpemVfdCBzaG93X3NoYXJlZF9jcHVfbWFwKHN0cnVjdCBfY3B1aWQ0X2luZm8gKmxlYWYsIGNoYXIgKmJ1ZiwKLQkJCQkJICB1bnNpZ25lZCBpbnQgY3B1KQotewotCXJldHVybiBzaG93X3NoYXJlZF9jcHVfbWFwX2Z1bmMobGVhZiwgMCwgYnVmKTsKLX0KLQotc3RhdGljIGlubGluZSBzc2l6ZV90IHNob3dfc2hhcmVkX2NwdV9saXN0KHN0cnVjdCBfY3B1aWQ0X2luZm8gKmxlYWYsIGNoYXIgKmJ1ZiwKLQkJCQkJICAgdW5zaWduZWQgaW50IGNwdSkKLXsKLQlyZXR1cm4gc2hvd19zaGFyZWRfY3B1X21hcF9mdW5jKGxlYWYsIDEsIGJ1Zik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHNob3dfdHlwZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZiwKLQkJCSB1bnNpZ25lZCBpbnQgY3B1KQotewotCXN3aXRjaCAodGhpc19sZWFmLT5iYXNlLmVheC5zcGxpdC50eXBlKSB7Ci0JY2FzZSBDQUNIRV9UWVBFX0RBVEE6Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkRhdGFcbiIpOwotCWNhc2UgQ0FDSEVfVFlQRV9JTlNUOgotCQlyZXR1cm4gc3ByaW50ZihidWYsICJJbnN0cnVjdGlvblxuIik7Ci0JY2FzZSBDQUNIRV9UWVBFX1VOSUZJRUQ6Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlVuaWZpZWRcbiIpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIlVua25vd25cbiIpOwotCX0KLX0KLQotI2RlZmluZSB0b19vYmplY3QoaykJY29udGFpbmVyX29mKGssIHN0cnVjdCBfaW5kZXhfa29iamVjdCwga29iaikKLSNkZWZpbmUgdG9fYXR0cihhKQljb250YWluZXJfb2YoYSwgc3RydWN0IF9jYWNoZV9hdHRyLCBhdHRyKQotCi0jZGVmaW5lIGRlZmluZV9vbmVfcm8oX25hbWUpIFwKLXN0YXRpYyBzdHJ1Y3QgX2NhY2hlX2F0dHIgX25hbWUgPSBcCi0JX19BVFRSKF9uYW1lLCAwNDQ0LCBzaG93XyMjX25hbWUsIE5VTEwpCi0KLWRlZmluZV9vbmVfcm8obGV2ZWwpOwotZGVmaW5lX29uZV9ybyh0eXBlKTsKLWRlZmluZV9vbmVfcm8oY29oZXJlbmN5X2xpbmVfc2l6ZSk7Ci1kZWZpbmVfb25lX3JvKHBoeXNpY2FsX2xpbmVfcGFydGl0aW9uKTsKLWRlZmluZV9vbmVfcm8od2F5c19vZl9hc3NvY2lhdGl2aXR5KTsKLWRlZmluZV9vbmVfcm8obnVtYmVyX29mX3NldHMpOwotZGVmaW5lX29uZV9ybyhzaXplKTsKLWRlZmluZV9vbmVfcm8oc2hhcmVkX2NwdV9tYXApOwotZGVmaW5lX29uZV9ybyhzaGFyZWRfY3B1X2xpc3QpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZGVmYXVsdF9hdHRyc1tdID0gewotCSZ0eXBlLmF0dHIsCi0JJmxldmVsLmF0dHIsCi0JJmNvaGVyZW5jeV9saW5lX3NpemUuYXR0ciwKLQkmcGh5c2ljYWxfbGluZV9wYXJ0aXRpb24uYXR0ciwKLQkmd2F5c19vZl9hc3NvY2lhdGl2aXR5LmF0dHIsCi0JJm51bWJlcl9vZl9zZXRzLmF0dHIsCi0JJnNpemUuYXR0ciwKLQkmc2hhcmVkX2NwdV9tYXAuYXR0ciwKLQkmc2hhcmVkX2NwdV9saXN0LmF0dHIsCi0JTlVMTAotfTsKLQotI2lmZGVmIENPTkZJR19BTURfTkIKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICoqYW1kX2wzX2F0dHJzKHZvaWQpCi17Ci0Jc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKiphdHRyczsKLQlpbnQgbjsKLQotCWlmIChhdHRycykKLQkJcmV0dXJuIGF0dHJzOwotCi0JbiA9IEFSUkFZX1NJWkUoZGVmYXVsdF9hdHRycyk7Ci0KLQlpZiAoYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19JTkRFWF9ESVNBQkxFKSkKLQkJbiArPSAyOwotCi0JaWYgKGFtZF9uYl9oYXNfZmVhdHVyZShBTURfTkJfTDNfUEFSVElUSU9OSU5HKSkKLQkJbiArPSAxOwotCi0JYXR0cnMgPSBremFsbG9jKG4gKiBzaXplb2YgKHN0cnVjdCBhdHRyaWJ1dGUgKiksIEdGUF9LRVJORUwpOwotCWlmIChhdHRycyA9PSBOVUxMKQotCQlyZXR1cm4gYXR0cnMgPSBkZWZhdWx0X2F0dHJzOwotCi0JZm9yIChuID0gMDsgZGVmYXVsdF9hdHRyc1tuXTsgbisrKQotCQlhdHRyc1tuXSA9IGRlZmF1bHRfYXR0cnNbbl07Ci0KLQlpZiAoYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19JTkRFWF9ESVNBQkxFKSkgewotCQlhdHRyc1tuKytdID0gJmNhY2hlX2Rpc2FibGVfMC5hdHRyOwotCQlhdHRyc1tuKytdID0gJmNhY2hlX2Rpc2FibGVfMS5hdHRyOwotCX0KLQotCWlmIChhbWRfbmJfaGFzX2ZlYXR1cmUoQU1EX05CX0wzX1BBUlRJVElPTklORykpCi0JCWF0dHJzW24rK10gPSAmc3ViY2FjaGVzLmF0dHI7Ci0KLQlyZXR1cm4gYXR0cnM7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHNzaXplX3Qgc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBfY2FjaGVfYXR0ciAqZmF0dHIgPSB0b19hdHRyKGF0dHIpOwotCXN0cnVjdCBfaW5kZXhfa29iamVjdCAqdGhpc19sZWFmID0gdG9fb2JqZWN0KGtvYmopOwotCXNzaXplX3QgcmV0OwotCi0JcmV0ID0gZmF0dHItPnNob3cgPwotCQlmYXR0ci0+c2hvdyhDUFVJRDRfSU5GT19JRFgodGhpc19sZWFmLT5jcHUsIHRoaXNfbGVhZi0+aW5kZXgpLAotCQkJYnVmLCB0aGlzX2xlYWYtPmNwdSkgOgotCQkwOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHN0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBfY2FjaGVfYXR0ciAqZmF0dHIgPSB0b19hdHRyKGF0dHIpOwotCXN0cnVjdCBfaW5kZXhfa29iamVjdCAqdGhpc19sZWFmID0gdG9fb2JqZWN0KGtvYmopOwotCXNzaXplX3QgcmV0OwotCi0JcmV0ID0gZmF0dHItPnN0b3JlID8KLQkJZmF0dHItPnN0b3JlKENQVUlENF9JTkZPX0lEWCh0aGlzX2xlYWYtPmNwdSwgdGhpc19sZWFmLT5pbmRleCksCi0JCQlidWYsIGNvdW50LCB0aGlzX2xlYWYtPmNwdSkgOgotCQkwOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNfb3BzIHN5c2ZzX29wcyA9IHsKLQkuc2hvdyAgID0gc2hvdywKLQkuc3RvcmUgID0gc3RvcmUsCi19OwotCi1zdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9jYWNoZSA9IHsKLQkuc3lzZnNfb3BzCT0gJnN5c2ZzX29wcywKLQkuZGVmYXVsdF9hdHRycwk9IGRlZmF1bHRfYXR0cnMsCi19OwotCi1zdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrdHlwZV9wZXJjcHVfZW50cnkgPSB7Ci0JLnN5c2ZzX29wcwk9ICZzeXNmc19vcHMsCi19OwotCi1zdGF0aWMgdm9pZCBjcHVpZDRfY2FjaGVfc3lzZnNfZXhpdCh1bnNpZ25lZCBpbnQgY3B1KQotewotCWtmcmVlKHBlcl9jcHUoaWNpX2NhY2hlX2tvYmplY3QsIGNwdSkpOwotCWtmcmVlKHBlcl9jcHUoaWNpX2luZGV4X2tvYmplY3QsIGNwdSkpOwotCXBlcl9jcHUoaWNpX2NhY2hlX2tvYmplY3QsIGNwdSkgPSBOVUxMOwotCXBlcl9jcHUoaWNpX2luZGV4X2tvYmplY3QsIGNwdSkgPSBOVUxMOwotCWZyZWVfY2FjaGVfYXR0cmlidXRlcyhjcHUpOwotfQotCi1zdGF0aWMgaW50IGNwdWlkNF9jYWNoZV9zeXNmc19pbml0KHVuc2lnbmVkIGludCBjcHUpCi17Ci0JaW50IGVycjsKLQotCWlmIChudW1fY2FjaGVfbGVhdmVzID09IDApCi0JCXJldHVybiAtRU5PRU5UOwotCi0JZXJyID0gZGV0ZWN0X2NhY2hlX2F0dHJpYnV0ZXMoY3B1KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JLyogQWxsb2NhdGUgYWxsIHJlcXVpcmVkIG1lbW9yeSAqLwotCXBlcl9jcHUoaWNpX2NhY2hlX2tvYmplY3QsIGNwdSkgPQotCQlremFsbG9jKHNpemVvZihzdHJ1Y3Qga29iamVjdCksIEdGUF9LRVJORUwpOwotCWlmICh1bmxpa2VseShwZXJfY3B1KGljaV9jYWNoZV9rb2JqZWN0LCBjcHUpID09IE5VTEwpKQotCQlnb3RvIGVycl9vdXQ7Ci0KLQlwZXJfY3B1KGljaV9pbmRleF9rb2JqZWN0LCBjcHUpID0ga3phbGxvYygKLQkgICAgc2l6ZW9mKHN0cnVjdCBfaW5kZXhfa29iamVjdCkgKiBudW1fY2FjaGVfbGVhdmVzLCBHRlBfS0VSTkVMKTsKLQlpZiAodW5saWtlbHkocGVyX2NwdShpY2lfaW5kZXhfa29iamVjdCwgY3B1KSA9PSBOVUxMKSkKLQkJZ290byBlcnJfb3V0OwotCi0JcmV0dXJuIDA7Ci0KLWVycl9vdXQ6Ci0JY3B1aWQ0X2NhY2hlX3N5c2ZzX2V4aXQoY3B1KTsKLQlyZXR1cm4gLUVOT01FTTsKLX0KLQotc3RhdGljIERFQ0xBUkVfQklUTUFQKGNhY2hlX2Rldl9tYXAsIE5SX0NQVVMpOwotCi0vKiBBZGQvUmVtb3ZlIGNhY2hlIGludGVyZmFjZSBmb3IgQ1BVIGRldmljZSAqLwotc3RhdGljIGludCBjYWNoZV9hZGRfZGV2KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gZGV2LT5pZDsKLQl1bnNpZ25lZCBsb25nIGksIGo7Ci0Jc3RydWN0IF9pbmRleF9rb2JqZWN0ICp0aGlzX29iamVjdDsKLQlzdHJ1Y3QgX2NwdWlkNF9pbmZvICAgKnRoaXNfbGVhZjsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gY3B1aWQ0X2NhY2hlX3N5c2ZzX2luaXQoY3B1KTsKLQlpZiAodW5saWtlbHkocmV0dmFsIDwgMCkpCi0JCXJldHVybiByZXR2YWw7Ci0KLQlyZXR2YWwgPSBrb2JqZWN0X2luaXRfYW5kX2FkZChwZXJfY3B1KGljaV9jYWNoZV9rb2JqZWN0LCBjcHUpLAotCQkJCSAgICAgICZrdHlwZV9wZXJjcHVfZW50cnksCi0JCQkJICAgICAgJmRldi0+a29iaiwgIiVzIiwgImNhY2hlIik7Ci0JaWYgKHJldHZhbCA8IDApIHsKLQkJY3B1aWQ0X2NhY2hlX3N5c2ZzX2V4aXQoY3B1KTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NhY2hlX2xlYXZlczsgaSsrKSB7Ci0JCXRoaXNfb2JqZWN0ID0gSU5ERVhfS09CSkVDVF9QVFIoY3B1LCBpKTsKLQkJdGhpc19vYmplY3QtPmNwdSA9IGNwdTsKLQkJdGhpc19vYmplY3QtPmluZGV4ID0gaTsKLQotCQl0aGlzX2xlYWYgPSBDUFVJRDRfSU5GT19JRFgoY3B1LCBpKTsKLQotCQlrdHlwZV9jYWNoZS5kZWZhdWx0X2F0dHJzID0gZGVmYXVsdF9hdHRyczsKLSNpZmRlZiBDT05GSUdfQU1EX05CCi0JCWlmICh0aGlzX2xlYWYtPmJhc2UubmIpCi0JCQlrdHlwZV9jYWNoZS5kZWZhdWx0X2F0dHJzID0gYW1kX2wzX2F0dHJzKCk7Ci0jZW5kaWYKLQkJcmV0dmFsID0ga29iamVjdF9pbml0X2FuZF9hZGQoJih0aGlzX29iamVjdC0+a29iaiksCi0JCQkJCSAgICAgICZrdHlwZV9jYWNoZSwKLQkJCQkJICAgICAgcGVyX2NwdShpY2lfY2FjaGVfa29iamVjdCwgY3B1KSwKLQkJCQkJICAgICAgImluZGV4JTFsdSIsIGkpOwotCQlpZiAodW5saWtlbHkocmV0dmFsKSkgewotCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKLQkJCQlrb2JqZWN0X3B1dCgmKElOREVYX0tPQkpFQ1RfUFRSKGNwdSwgaiktPmtvYmopKTsKLQkJCWtvYmplY3RfcHV0KHBlcl9jcHUoaWNpX2NhY2hlX2tvYmplY3QsIGNwdSkpOwotCQkJY3B1aWQ0X2NhY2hlX3N5c2ZzX2V4aXQoY3B1KTsKLQkJCXJldHVybiByZXR2YWw7Ci0JCX0KLQkJa29iamVjdF91ZXZlbnQoJih0aGlzX29iamVjdC0+a29iaiksIEtPQkpfQUREKTsKLQl9Ci0JY3B1bWFza19zZXRfY3B1KGNwdSwgdG9fY3B1bWFzayhjYWNoZV9kZXZfbWFwKSk7Ci0KLQlrb2JqZWN0X3VldmVudChwZXJfY3B1KGljaV9jYWNoZV9rb2JqZWN0LCBjcHUpLCBLT0JKX0FERCk7CisJaWYgKCF0aGlzX2NwdV9jaSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdGhpc19jcHVfY2ktPm51bV9sZXZlbHMgPSAzOworCXRoaXNfY3B1X2NpLT5udW1fbGVhdmVzID0gbnVtX2NhY2hlX2xlYXZlczsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2FjaGVfcmVtb3ZlX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fcG9wdWxhdGVfY2FjaGVfbGVhdmVzKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9IGRldi0+aWQ7Ci0JdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGludCBpZHgsIHJldDsKKwlzdHJ1Y3QgY3B1X2NhY2hlaW5mbyAqdGhpc19jcHVfY2kgPSBnZXRfY3B1X2NhY2hlaW5mbyhjcHUpOworCXN0cnVjdCBjYWNoZWluZm8gKnRoaXNfbGVhZiA9IHRoaXNfY3B1X2NpLT5pbmZvX2xpc3Q7CisJc3RydWN0IF9jcHVpZDRfaW5mb19yZWdzIGlkNF9yZWdzID0ge307CiAKLQlpZiAocGVyX2NwdShpY2lfY3B1aWQ0X2luZm8sIGNwdSkgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIHRvX2NwdW1hc2soY2FjaGVfZGV2X21hcCkpKQotCQlyZXR1cm47Ci0JY3B1bWFza19jbGVhcl9jcHUoY3B1LCB0b19jcHVtYXNrKGNhY2hlX2Rldl9tYXApKTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fY2FjaGVfbGVhdmVzOyBpKyspCi0JCWtvYmplY3RfcHV0KCYoSU5ERVhfS09CSkVDVF9QVFIoY3B1LCBpKS0+a29iaikpOwotCWtvYmplY3RfcHV0KHBlcl9jcHUoaWNpX2NhY2hlX2tvYmplY3QsIGNwdSkpOwotCWNwdWlkNF9jYWNoZV9zeXNmc19leGl0KGNwdSk7Ci19Ci0KLXN0YXRpYyBpbnQgY2FjaGVpbmZvX2NwdV9jYWxsYmFjayhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQotewotCXVuc2lnbmVkIGludCBjcHUgPSAodW5zaWduZWQgbG9uZyloY3B1OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQotCWRldiA9IGdldF9jcHVfZGV2aWNlKGNwdSk7Ci0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfT05MSU5FX0ZST1pFTjoKLQkJY2FjaGVfYWRkX2RldihkZXYpOwotCQlicmVhazsKLQljYXNlIENQVV9ERUFEOgotCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgotCQljYWNoZV9yZW1vdmVfZGV2KGRldik7Ci0JCWJyZWFrOworCWZvciAoaWR4ID0gMDsgaWR4IDwgdGhpc19jcHVfY2ktPm51bV9sZWF2ZXM7IGlkeCsrKSB7CisJCXJldCA9IGNwdWlkNF9jYWNoZV9sb29rdXBfcmVncyhpZHgsICZpZDRfcmVncyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQljaV9sZWFmX2luaXQodGhpc19sZWFmKyssICZpZDRfcmVncyk7CisJCV9fY2FjaGVfY3B1bWFwX3NldHVwKGNwdSwgaWR4LCAmaWQ0X3JlZ3MpOwogCX0KLQlyZXR1cm4gTk9USUZZX09LOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNhY2hlaW5mb19jcHVfbm90aWZpZXIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBjYWNoZWluZm9fY3B1X2NhbGxiYWNrLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgY2FjaGVfc3lzZnNfaW5pdCh2b2lkKQotewotCWludCBpLCBlcnIgPSAwOwotCi0JaWYgKG51bV9jYWNoZV9sZWF2ZXMgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQljcHVfbm90aWZpZXJfcmVnaXN0ZXJfYmVnaW4oKTsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJc3RydWN0IGRldmljZSAqZGV2ID0gZ2V0X2NwdV9kZXZpY2UoaSk7Ci0KLQkJZXJyID0gY2FjaGVfYWRkX2RldihkZXYpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7Ci0JfQotCV9fcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZjYWNoZWluZm9fY3B1X25vdGlmaWVyKTsKLQotb3V0OgotCWNwdV9ub3RpZmllcl9yZWdpc3Rlcl9kb25lKCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotZGV2aWNlX2luaXRjYWxsKGNhY2hlX3N5c2ZzX2luaXQpOwotCi0jZW5kaWYKK0RFRklORV9TTVBfQ0FMTF9DQUNIRV9GVU5DVElPTihpbml0X2NhY2hlX2xldmVsKQorREVGSU5FX1NNUF9DQUxMX0NBQ0hFX0ZVTkNUSU9OKHBvcHVsYXRlX2NhY2hlX2xlYXZlcykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfcHQuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzMzOGIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9wdC5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogSW50ZWwoUikgUHJvY2Vzc29yIFRyYWNlIFBNVSBkcml2ZXIgZm9yIHBlcmYKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogSW50ZWwgUFQgaXMgc3BlY2lmaWVkIGluIHRoZSBJbnRlbCBBcmNoaXRlY3R1cmUgSW5zdHJ1Y3Rpb24gU2V0IEV4dGVuc2lvbnMKKyAqIFByb2dyYW1taW5nIFJlZmVyZW5jZToKKyAqIGh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvaW50ZWwtaXNhLWV4dGVuc2lvbnMKKyAqLworCisjaWZuZGVmIF9fSU5URUxfUFRfSF9fCisjZGVmaW5lIF9fSU5URUxfUFRfSF9fCisKKy8qCisgKiBTaW5nbGUtZW50cnkgVG9QQTogd2hlbiB0aGlzIGNsb3NlIHRvIHJlZ2lvbiBib3VuZGFyeSwgc3dpdGNoCisgKiBidWZmZXJzIHRvIGF2b2lkIGxvc2luZyBkYXRhLgorICovCisjZGVmaW5lIFRPUEFfUE1JX01BUkdJTiA1MTIKKworLyoKKyAqIFRhYmxlIG9mIFBoeXNpY2FsIEFkZHJlc3NlcyBiaXRzCisgKi8KK2VudW0gdG9wYV9zeiB7CisJVE9QQV80Swk9IDAsCisJVE9QQV84SywKKwlUT1BBXzE2SywKKwlUT1BBXzMySywKKwlUT1BBXzY0SywKKwlUT1BBXzEyOEssCisJVE9QQV8yNTZLLAorCVRPUEFfNTEySywKKwlUT1BBXzFNQiwKKwlUT1BBXzJNQiwKKwlUT1BBXzRNQiwKKwlUT1BBXzhNQiwKKwlUT1BBXzE2TUIsCisJVE9QQV8zMk1CLAorCVRPUEFfNjRNQiwKKwlUT1BBXzEyOE1CLAorCVRPUEFfU1pfRU5ELAorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2l6ZXMoZW51bSB0b3BhX3N6IHRzeikKK3sKKwlyZXR1cm4gMSA8PCAodHN6ICsgMTIpOworfTsKKworc3RydWN0IHRvcGFfZW50cnkgeworCXU2NAllbmQJOiAxOworCXU2NAlyc3ZkMAk6IDE7CisJdTY0CWludHIJOiAxOworCXU2NAlyc3ZkMQk6IDE7CisJdTY0CXN0b3AJOiAxOworCXU2NAlyc3ZkMgk6IDE7CisJdTY0CXNpemUJOiA0OworCXU2NAlyc3ZkMwk6IDI7CisJdTY0CWJhc2UJOiAzNjsKKwl1NjQJcnN2ZDQJOiAxNjsKK307CisKKyNkZWZpbmUgVE9QQV9TSElGVCAxMgorI2RlZmluZSBQVF9DUFVJRF9MRUFWRVMgMgorCitlbnVtIHB0X2NhcGFiaWxpdGllcyB7CisJUFRfQ0FQX21heF9zdWJsZWFmID0gMCwKKwlQVF9DQVBfY3IzX2ZpbHRlcmluZywKKwlQVF9DQVBfdG9wYV9vdXRwdXQsCisJUFRfQ0FQX3RvcGFfbXVsdGlwbGVfZW50cmllcywKKwlQVF9DQVBfcGF5bG9hZHNfbGlwLAorfTsKKworc3RydWN0IHB0X3BtdSB7CisJc3RydWN0IHBtdQkJcG11OworCXUzMgkJCWNhcHNbNCAqIFBUX0NQVUlEX0xFQVZFU107Cit9OworCisvKioKKyAqIHN0cnVjdCBwdF9idWZmZXIgLSBidWZmZXIgY29uZmlndXJhdGlvbjsgb25lIGJ1ZmZlciBwZXIgdGFza19zdHJ1Y3Qgb3IKKyAqCQljcHUsIGRlcGVuZGluZyBvbiBwZXJmIGV2ZW50IGNvbmZpZ3VyYXRpb24KKyAqIEBjcHU6CWNwdSBmb3IgcGVyLWNwdSBhbGxvY2F0aW9uCisgKiBAdGFibGVzOglsaXN0IG9mIFRvUEEgdGFibGVzIGluIHRoaXMgYnVmZmVyCisgKiBAZmlyc3Q6CXNob3J0aGFuZCBmb3IgZmlyc3QgdG9wYSB0YWJsZQorICogQGxhc3Q6CXNob3J0aGFuZCBmb3IgbGFzdCB0b3BhIHRhYmxlCisgKiBAY3VyOgljdXJyZW50IHRvcGEgdGFibGUKKyAqIEBucl9wYWdlczoJYnVmZmVyIHNpemUgaW4gcGFnZXMKKyAqIEBjdXJfaWR4OgljdXJyZW50IG91dHB1dCByZWdpb24ncyBpbmRleCB3aXRoaW4gQGN1ciB0YWJsZQorICogQG91dHB1dF9vZmY6CW9mZnNldCB3aXRoaW4gdGhlIGN1cnJlbnQgb3V0cHV0IHJlZ2lvbgorICogQGRhdGFfc2l6ZToJcnVubmluZyB0b3RhbCBvZiB0aGUgYW1vdW50IG9mIGRhdGEgaW4gdGhpcyBidWZmZXIKKyAqIEBsb3N0OglpZiBkYXRhIHdhcyBsb3N0L3RydW5jYXRlZAorICogQGhlYWQ6CWxvZ2ljYWwgd3JpdGUgb2Zmc2V0IGluc2lkZSB0aGUgYnVmZmVyCisgKiBAc25hcHNob3Q6CWlmIHRoaXMgaXMgZm9yIGEgc25hcHNob3Qvb3ZlcndyaXRlIGNvdW50ZXIKKyAqIEBzdG9wX3BvczoJU1RPUCB0b3BhIGVudHJ5IGluIHRoZSBidWZmZXIKKyAqIEBpbnRyX3BvczoJSU5UIHRvcGEgZW50cnkgaW4gdGhlIGJ1ZmZlcgorICogQGRhdGFfcGFnZXM6CWFycmF5IG9mIHBhZ2VzIGZyb20gcGVyZgorICogQHRvcGFfaW5kZXg6CXRhYmxlIG9mIHRvcGEgZW50cmllcyBpbmRleGVkIGJ5IHBhZ2Ugb2Zmc2V0CisgKi8KK3N0cnVjdCBwdF9idWZmZXIgeworCWludAkJCWNwdTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXRhYmxlczsKKwlzdHJ1Y3QgdG9wYQkJKmZpcnN0LCAqbGFzdCwgKmN1cjsKKwl1bnNpZ25lZCBpbnQJCWN1cl9pZHg7CisJc2l6ZV90CQkJb3V0cHV0X29mZjsKKwl1bnNpZ25lZCBsb25nCQlucl9wYWdlczsKKwlsb2NhbF90CQkJZGF0YV9zaXplOworCWxvY2FsX3QJCQlsb3N0OworCWxvY2FsNjRfdAkJaGVhZDsKKwlib29sCQkJc25hcHNob3Q7CisJdW5zaWduZWQgbG9uZwkJc3RvcF9wb3MsIGludHJfcG9zOworCXZvaWQJCQkqKmRhdGFfcGFnZXM7CisJc3RydWN0IHRvcGFfZW50cnkJKnRvcGFfaW5kZXhbMF07Cit9OworCisvKioKKyAqIHN0cnVjdCBwdCAtIHBlci1jcHUgcHQgY29udGV4dAorICogQGhhbmRsZToJcGVyZiBvdXRwdXQgaGFuZGxlCisgKiBAaGFuZGxlX25taToJZG8gaGFuZGxlIFBUIFBNSSBvbiB0aGlzIGNwdSwgdGhlcmUncyBhbiBhY3RpdmUgZXZlbnQKKyAqLworc3RydWN0IHB0IHsKKwlzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlIGhhbmRsZTsKKwlpbnQJCQloYW5kbGVfbm1pOworfTsKKworI2VuZGlmIC8qIF9fSU5URUxfUFRfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UtaW50ZXJuYWwuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1pbnRlcm5hbC5oCmluZGV4IDEwYjQ2OTAuLmZlMzIwNzQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1pbnRlcm5hbC5oCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1pbnRlcm5hbC5oCkBAIC0xNCw2ICsxNCw3IEBACiB9OwogCiAjZGVmaW5lIEFUVFJfTEVOCQkxNgorI2RlZmluZSBJTklUSUFMX0NIRUNLX0lOVEVSVkFMCTUgKiA2MCAvKiA1IG1pbnV0ZXMgKi8KIAogLyogT25lIG9iamVjdCBmb3IgZWFjaCBNQ0UgYmFuaywgc2hhcmVkIGJ5IGFsbCBDUFVzICovCiBzdHJ1Y3QgbWNlX2JhbmsgewpAQCAtMjMsMjAgKzI0LDIwIEBACiAJY2hhcgkJCWF0dHJuYW1lW0FUVFJfTEVOXTsJLyogYXR0cmlidXRlIG5hbWUgKi8KIH07CiAKLWludCBtY2Vfc2V2ZXJpdHkoc3RydWN0IG1jZSAqYSwgaW50IHRvbGVyYW50LCBjaGFyICoqbXNnLCBib29sIGlzX2V4Y3ApOworZXh0ZXJuIGludCAoKm1jZV9zZXZlcml0eSkoc3RydWN0IG1jZSAqYSwgaW50IHRvbGVyYW50LCBjaGFyICoqbXNnLCBib29sIGlzX2V4Y3ApOwogc3RydWN0IGRlbnRyeSAqbWNlX2dldF9kZWJ1Z2ZzX2Rpcih2b2lkKTsKIAogZXh0ZXJuIHN0cnVjdCBtY2VfYmFuayAqbWNlX2JhbmtzOwogZXh0ZXJuIG1jZV9iYW5rc190IG1jZV9iYW5rc19jZV9kaXNhYmxlZDsKIAogI2lmZGVmIENPTkZJR19YODZfTUNFX0lOVEVMCi11bnNpZ25lZCBsb25nIG1jZV9pbnRlbF9hZGp1c3RfdGltZXIodW5zaWduZWQgbG9uZyBpbnRlcnZhbCk7Ci12b2lkIG1jZV9pbnRlbF9jbWNpX3BvbGwodm9pZCk7Cit1bnNpZ25lZCBsb25nIGNtY2lfaW50ZWxfYWRqdXN0X3RpbWVyKHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpOworYm9vbCBtY2VfaW50ZWxfY21jaV9wb2xsKHZvaWQpOwogdm9pZCBtY2VfaW50ZWxfaGNwdV91cGRhdGUodW5zaWduZWQgbG9uZyBjcHUpOwogdm9pZCBjbWNpX2Rpc2FibGVfYmFuayhpbnQgYmFuayk7CiAjZWxzZQotIyBkZWZpbmUgbWNlX2ludGVsX2FkanVzdF90aW1lciBtY2VfYWRqdXN0X3RpbWVyX2RlZmF1bHQKLXN0YXRpYyBpbmxpbmUgdm9pZCBtY2VfaW50ZWxfY21jaV9wb2xsKHZvaWQpIHsgfQorIyBkZWZpbmUgY21jaV9pbnRlbF9hZGp1c3RfdGltZXIgbWNlX2FkanVzdF90aW1lcl9kZWZhdWx0CitzdGF0aWMgaW5saW5lIGJvb2wgbWNlX2ludGVsX2NtY2lfcG9sbCh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQogc3RhdGljIGlubGluZSB2b2lkIG1jZV9pbnRlbF9oY3B1X3VwZGF0ZSh1bnNpZ25lZCBsb25nIGNwdSkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgY21jaV9kaXNhYmxlX2JhbmsoaW50IGJhbmspIHsgfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2Utc2V2ZXJpdHkuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1zZXZlcml0eS5jCmluZGV4IDhiYjQzMzAuLjljNjgyYzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1zZXZlcml0eS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1zZXZlcml0eS5jCkBAIC0xODYsNyArMTg2LDYxIEBACiAJcmV0dXJuICgobS0+Y3MgJiAzKSA9PSAzKSA/IElOX1VTRVIgOiBJTl9LRVJORUw7CiB9CiAKLWludCBtY2Vfc2V2ZXJpdHkoc3RydWN0IG1jZSAqbSwgaW50IHRvbGVyYW50LCBjaGFyICoqbXNnLCBib29sIGlzX2V4Y3ApCisvKgorICogU2VlIEFNRCBFcnJvciBTY29wZSBIaWVyYXJjaHkgdGFibGUgaW4gYSBuZXdlciBCS0RHLiBGb3IgZXhhbXBsZQorICogNDkxMjVfMTVoX01vZGVsc18zMGgtM0ZoX0JLREcucGRmLCBzZWN0aW9uICJSQVMgRmVhdHVyZXMiCisgKi8KK3N0YXRpYyBpbnQgbWNlX3NldmVyaXR5X2FtZChzdHJ1Y3QgbWNlICptLCBpbnQgdG9sZXJhbnQsIGNoYXIgKiptc2csIGJvb2wgaXNfZXhjcCkKK3sKKwllbnVtIGNvbnRleHQgY3R4ID0gZXJyb3JfY29udGV4dChtKTsKKworCS8qIFByb2Nlc3NvciBDb250ZXh0IENvcnJ1cHQsIG5vIG5lZWQgdG8gZnVtYmxlIHRvbyBtdWNoLCBkaWUhICovCisJaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfUENDKQorCQlyZXR1cm4gTUNFX1BBTklDX1NFVkVSSVRZOworCisJaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfVUMpIHsKKworCQkvKgorCQkgKiBPbiBvbGRlciBzeXN0ZW1zIHdoZXJlIG92ZXJmbG93X3JlY292IGZsYWcgaXMgbm90IHByZXNlbnQsIHdlCisJCSAqIHNob3VsZCBzaW1wbHkgcGFuaWMgaWYgYW4gZXJyb3Igb3ZlcmZsb3cgb2NjdXJzLiBJZgorCQkgKiBvdmVyZmxvd19yZWNvdiBmbGFnIGlzIHByZXNlbnQgYW5kIHNldCwgdGhlbiBzb2Z0d2FyZSBjYW4gdHJ5CisJCSAqIHRvIGF0IGxlYXN0IGtpbGwgcHJvY2VzcyB0byBwcm9sb25nIHN5c3RlbSBvcGVyYXRpb24uCisJCSAqLworCQlpZiAobWNlX2ZsYWdzLm92ZXJmbG93X3JlY292KSB7CisJCQkvKiBzb2Z0d2FyZSBjYW4gdHJ5IHRvIGNvbnRhaW4gKi8KKwkJCWlmICghKG0tPm1jZ3N0YXR1cyAmIE1DR19TVEFUVVNfUklQVikgJiYgKGN0eCA9PSBJTl9LRVJORUwpKQorCQkJCXJldHVybiBNQ0VfUEFOSUNfU0VWRVJJVFk7CisKKwkJCS8qIGtpbGwgY3VycmVudCBwcm9jZXNzICovCisJCQlyZXR1cm4gTUNFX0FSX1NFVkVSSVRZOworCQl9IGVsc2UgeworCQkJLyogYXQgbGVhc3Qgb25lIGVycm9yIHdhcyBub3QgbG9nZ2VkICovCisJCQlpZiAobS0+c3RhdHVzICYgTUNJX1NUQVRVU19PVkVSKQorCQkJCXJldHVybiBNQ0VfUEFOSUNfU0VWRVJJVFk7CisJCX0KKworCQkvKgorCQkgKiBGb3IgYW55IG90aGVyIGNhc2UsIHJldHVybiBNQ0VfVUNfU0VWRVJJVFkgc28gdGhhdCB3ZSBsb2cgdGhlCisJCSAqIGVycm9yIGFuZCBleGl0ICNNQyBoYW5kbGVyLgorCQkgKi8KKwkJcmV0dXJuIE1DRV9VQ19TRVZFUklUWTsKKwl9CisKKwkvKgorCSAqIGRlZmVycmVkIGVycm9yOiBwb2xsIGhhbmRsZXIgY2F0Y2hlcyB0aGVzZSBhbmQgYWRkcyB0byBtY2VfcmluZyBzbworCSAqIG1lbW9yeS1mYWlsdXJlIGNhbiB0YWtlIHJlY292ZXJ5IGFjdGlvbnMuCisJICovCisJaWYgKG0tPnN0YXR1cyAmIE1DSV9TVEFUVVNfREVGRVJSRUQpCisJCXJldHVybiBNQ0VfREVGRVJSRURfU0VWRVJJVFk7CisKKwkvKgorCSAqIGNvcnJlY3RlZCBlcnJvcjogcG9sbCBoYW5kbGVyIGNhdGNoZXMgdGhlc2UgYW5kIHBhc3NlcyByZXNwb25zaWJpbGl0eQorCSAqIG9mIGRlY29kaW5nIHRoZSBlcnJvciB0byBFREFDCisJICovCisJcmV0dXJuIE1DRV9LRUVQX1NFVkVSSVRZOworfQorCitzdGF0aWMgaW50IG1jZV9zZXZlcml0eV9pbnRlbChzdHJ1Y3QgbWNlICptLCBpbnQgdG9sZXJhbnQsIGNoYXIgKiptc2csIGJvb2wgaXNfZXhjcCkKIHsKIAllbnVtIGV4Y2VwdGlvbiBleGNwID0gKGlzX2V4Y3AgPyBFWENQX0NPTlRFWFQgOiBOT19FWENQKTsKIAllbnVtIGNvbnRleHQgY3R4ID0gZXJyb3JfY29udGV4dChtKTsKQEAgLTIxNiw2ICsyNzAsMTYgQEAKIAl9CiB9CiAKKy8qIERlZmF1bHQgdG8gbWNlX3NldmVyaXR5X2ludGVsICovCitpbnQgKCptY2Vfc2V2ZXJpdHkpKHN0cnVjdCBtY2UgKm0sIGludCB0b2xlcmFudCwgY2hhciAqKm1zZywgYm9vbCBpc19leGNwKSA9CisJCSAgICBtY2Vfc2V2ZXJpdHlfaW50ZWw7CisKK3ZvaWQgX19pbml0IG1jaGVja192ZW5kb3JfaW5pdF9zZXZlcml0eSh2b2lkKQoreworCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9BTUQpCisJCW1jZV9zZXZlcml0eSA9IG1jZV9zZXZlcml0eV9hbWQ7Cit9CisKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIHN0YXRpYyB2b2lkICpzX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqZiwgbG9mZl90ICpwb3MpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCmluZGV4IDNjMDM2Y2IuLmU1MzU1MzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS5jCkBAIC02MCwxMSArNjAsMTIgQEAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9tY2UuaD4KIAotI2RlZmluZSBTUElOVU5JVCAxMDAJLyogMTAwbnMgKi8KKyNkZWZpbmUgU1BJTlVOSVQJCTEwMAkvKiAxMDBucyAqLwogCiBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCwgbWNlX2V4Y2VwdGlvbl9jb3VudCk7CiAKIHN0cnVjdCBtY2VfYmFuayAqbWNlX2JhbmtzIF9fcmVhZF9tb3N0bHk7CitzdHJ1Y3QgbWNlX3ZlbmRvcl9mbGFncyBtY2VfZmxhZ3MgX19yZWFkX21vc3RseTsKIAogc3RydWN0IG1jYV9jb25maWcgbWNhX2NmZyBfX3JlYWRfbW9zdGx5ID0gewogCS5ib290bG9nICA9IC0xLApAQCAtODksOSArOTAsNiBAQAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBtY2UsIG1jZXNfc2Vlbik7CiBzdGF0aWMgaW50CQkJY3B1X21pc3Npbmc7CiAKLS8qIENNQ0kgc3Rvcm0gZGV0ZWN0aW9uIGZpbHRlciAqLwotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG1jZV9wb2xsZWRfZXJyb3IpOwotCiAvKgogICogTUNBIGJhbmtzIHBvbGxlZCBieSB0aGUgcGVyaW9kIHBvbGxpbmcgdGltZXIgZm9yIGNvcnJlY3RlZCBldmVudHMuCiAgKiBXaXRoIEludGVsIENNQ0ksIHRoaXMgb25seSBoYXMgTUNBIGJhbmtzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IENNQ0kgKGlmIGFueSkuCkBAIC02MjIsOCArNjIwLDkgQEAKICAqIGlzIGFscmVhZHkgdG90YWxseSAqIGNvbmZ1c2VkLiBJbiB0aGlzIGNhc2UgaXQncyBsaWtlbHkgaXQgd2lsbAogICogbm90IGZ1bGx5IGV4ZWN1dGUgdGhlIG1hY2hpbmUgY2hlY2sgaGFuZGxlciBlaXRoZXIuCiAgKi8KLXZvaWQgbWFjaGluZV9jaGVja19wb2xsKGVudW0gbWNwX2ZsYWdzIGZsYWdzLCBtY2VfYmFua3NfdCAqYikKK2Jvb2wgbWFjaGluZV9jaGVja19wb2xsKGVudW0gbWNwX2ZsYWdzIGZsYWdzLCBtY2VfYmFua3NfdCAqYikKIHsKKwlib29sIGVycm9yX2xvZ2dlZCA9IGZhbHNlOwogCXN0cnVjdCBtY2UgbTsKIAlpbnQgc2V2ZXJpdHk7CiAJaW50IGk7CkBAIC02NDYsNyArNjQ1LDcgQEAKIAkJaWYgKCEobS5zdGF0dXMgJiBNQ0lfU1RBVFVTX1ZBTCkpCiAJCQljb250aW51ZTsKIAotCQl0aGlzX2NwdV93cml0ZShtY2VfcG9sbGVkX2Vycm9yLCAxKTsKKwogCQkvKgogCQkgKiBVbmNvcnJlY3RlZCBvciBzaWduYWxsZWQgZXZlbnRzIGFyZSBoYW5kbGVkIGJ5IHRoZSBleGNlcHRpb24KIAkJICogaGFuZGxlciB3aGVuIGl0IGlzIGVuYWJsZWQsIHNvIGRvbid0IHByb2Nlc3MgdGhvc2UgaGVyZS4KQEAgLTY3OSw4ICs2NzgsMTAgQEAKIAkJICogRG9uJ3QgZ2V0IHRoZSBJUCBoZXJlIGJlY2F1c2UgaXQncyB1bmxpa2VseSB0bwogCQkgKiBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGggdGhlIGFjdHVhbCBlcnJvciBsb2NhdGlvbi4KIAkJICovCi0JCWlmICghKGZsYWdzICYgTUNQX0RPTlRMT0cpICYmICFtY2FfY2ZnLmRvbnRfbG9nX2NlKQorCQlpZiAoIShmbGFncyAmIE1DUF9ET05UTE9HKSAmJiAhbWNhX2NmZy5kb250X2xvZ19jZSkgeworCQkJZXJyb3JfbG9nZ2VkID0gdHJ1ZTsKIAkJCW1jZV9sb2coJm0pOworCQl9CiAKIAkJLyoKIAkJICogQ2xlYXIgc3RhdGUgZm9yIHRoaXMgYmFuay4KQEAgLTY5NCw2ICs2OTUsOCBAQAogCSAqLwogCiAJc3luY19jb3JlKCk7CisKKwlyZXR1cm4gZXJyb3JfbG9nZ2VkOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWFjaGluZV9jaGVja19wb2xsKTsKIApAQCAtODEzLDcgKzgxNiw3IEBACiAJICogb3RoZXIgQ1BVcy4KIAkgKi8KIAlpZiAobSAmJiBnbG9iYWxfd29yc3QgPj0gTUNFX1BBTklDX1NFVkVSSVRZICYmIG1jYV9jZmcudG9sZXJhbnQgPCAzKQotCQltY2VfcGFuaWMoIkZhdGFsIE1hY2hpbmUgY2hlY2siLCBtLCBtc2cpOworCQltY2VfcGFuaWMoIkZhdGFsIG1hY2hpbmUgY2hlY2siLCBtLCBtc2cpOwogCiAJLyoKIAkgKiBGb3IgVUMgc29tZXdoZXJlIHdlIGxldCB0aGUgQ1BVIHdobyBkZXRlY3RzIGl0IGhhbmRsZSBpdC4KQEAgLTgyNiw3ICs4MjksNyBAQAogCSAqIHNvdXJjZSBvciBvbmUgQ1BVIGlzIGh1bmcuIFBhbmljLgogCSAqLwogCWlmIChnbG9iYWxfd29yc3QgPD0gTUNFX0tFRVBfU0VWRVJJVFkgJiYgbWNhX2NmZy50b2xlcmFudCA8IDMpCi0JCW1jZV9wYW5pYygiTWFjaGluZSBjaGVjayBmcm9tIHVua25vd24gc291cmNlIiwgTlVMTCwgTlVMTCk7CisJCW1jZV9wYW5pYygiRmF0YWwgbWFjaGluZSBjaGVjayBmcm9tIHVua25vd24gc291cmNlIiwgTlVMTCwgTlVMTCk7CiAKIAkvKgogCSAqIE5vdyBjbGVhciBhbGwgdGhlIG1jZXNfc2VlbiBzbyB0aGF0IHRoZXkgZG9uJ3QgcmVhcHBlYXIgb24KQEAgLTEyNTgsNyArMTI2MSw3IEBACiAgKiBwb2xsZXIgZmluZHMgYW4gTUNFLCBwb2xsIDJ4IGZhc3Rlci4gIFdoZW4gdGhlIHBvbGxlciBmaW5kcyBubyBtb3JlCiAgKiBlcnJvcnMsIHBvbGwgMnggc2xvd2VyICh1cCB0byBjaGVja19pbnRlcnZhbCBzZWNvbmRzKS4KICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hlY2tfaW50ZXJ2YWwgPSA1ICogNjA7IC8qIDUgbWludXRlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2hlY2tfaW50ZXJ2YWwgPSBJTklUSUFMX0NIRUNLX0lOVEVSVkFMOwogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgbWNlX25leHRfaW50ZXJ2YWwpOyAvKiBpbiBqaWZmaWVzICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRpbWVyX2xpc3QsIG1jZV90aW1lcik7CkBAIC0xMjY4LDU5ICsxMjcxLDE0IEBACiAJcmV0dXJuIGludGVydmFsOwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyAoKm1jZV9hZGp1c3RfdGltZXIpKHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpID0KLQltY2VfYWRqdXN0X3RpbWVyX2RlZmF1bHQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyAoKm1jZV9hZGp1c3RfdGltZXIpKHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpID0gbWNlX2FkanVzdF90aW1lcl9kZWZhdWx0OwogCi1zdGF0aWMgaW50IGNtY19lcnJvcl9zZWVuKHZvaWQpCitzdGF0aWMgdm9pZCBfX3Jlc3RhcnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnQsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCiB7Ci0JdW5zaWduZWQgbG9uZyAqdiA9IHRoaXNfY3B1X3B0cigmbWNlX3BvbGxlZF9lcnJvcik7Ci0KLQlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfYml0KDAsIHYpOwotfQotCi1zdGF0aWMgdm9pZCBtY2VfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCB0aW1lcl9saXN0ICp0ID0gdGhpc19jcHVfcHRyKCZtY2VfdGltZXIpOwotCXVuc2lnbmVkIGxvbmcgaXY7Ci0JaW50IG5vdGlmeTsKLQotCVdBUk5fT04oc21wX3Byb2Nlc3Nvcl9pZCgpICE9IGRhdGEpOwotCi0JaWYgKG1jZV9hdmFpbGFibGUodGhpc19jcHVfcHRyKCZjcHVfaW5mbykpKSB7Ci0JCW1hY2hpbmVfY2hlY2tfcG9sbChNQ1BfVElNRVNUQU1QLAotCQkJCXRoaXNfY3B1X3B0cigmbWNlX3BvbGxfYmFua3MpKTsKLQkJbWNlX2ludGVsX2NtY2lfcG9sbCgpOwotCX0KLQotCS8qCi0JICogQWxlcnQgdXNlcnNwYWNlIGlmIG5lZWRlZC4gIElmIHdlIGxvZ2dlZCBhbiBNQ0UsIHJlZHVjZSB0aGUKLQkgKiBwb2xsaW5nIGludGVydmFsLCBvdGhlcndpc2UgaW5jcmVhc2UgdGhlIHBvbGxpbmcgaW50ZXJ2YWwuCi0JICovCi0JaXYgPSBfX3RoaXNfY3B1X3JlYWQobWNlX25leHRfaW50ZXJ2YWwpOwotCW5vdGlmeSA9IG1jZV9ub3RpZnlfaXJxKCk7Ci0Jbm90aWZ5IHw9IGNtY19lcnJvcl9zZWVuKCk7Ci0JaWYgKG5vdGlmeSkgewotCQlpdiA9IG1heChpdiAvIDIsICh1bnNpZ25lZCBsb25nKSBIWi8xMDApOwotCX0gZWxzZSB7Ci0JCWl2ID0gbWluKGl2ICogMiwgcm91bmRfamlmZmllc19yZWxhdGl2ZShjaGVja19pbnRlcnZhbCAqIEhaKSk7Ci0JCWl2ID0gbWNlX2FkanVzdF90aW1lcihpdik7Ci0JfQotCV9fdGhpc19jcHVfd3JpdGUobWNlX25leHRfaW50ZXJ2YWwsIGl2KTsKLQkvKiBNaWdodCBoYXZlIGJlY29tZSAwIGFmdGVyIENNQ0kgc3Rvcm0gc3Vic2lkZWQgKi8KLQlpZiAoaXYpIHsKLQkJdC0+ZXhwaXJlcyA9IGppZmZpZXMgKyBpdjsKLQkJYWRkX3RpbWVyX29uKHQsIHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JfQotfQotCi0vKgotICogRW5zdXJlIHRoYXQgdGhlIHRpbWVyIGlzIGZpcmluZyBpbiBAaW50ZXJ2YWwgZnJvbSBub3cuCi0gKi8KLXZvaWQgbWNlX3RpbWVyX2tpY2sodW5zaWduZWQgbG9uZyBpbnRlcnZhbCkKLXsKLQlzdHJ1Y3QgdGltZXJfbGlzdCAqdCA9IHRoaXNfY3B1X3B0cigmbWNlX3RpbWVyKTsKIAl1bnNpZ25lZCBsb25nIHdoZW4gPSBqaWZmaWVzICsgaW50ZXJ2YWw7Ci0JdW5zaWduZWQgbG9uZyBpdiA9IF9fdGhpc19jcHVfcmVhZChtY2VfbmV4dF9pbnRlcnZhbCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAogCWlmICh0aW1lcl9wZW5kaW5nKHQpKSB7CiAJCWlmICh0aW1lX2JlZm9yZSh3aGVuLCB0LT5leHBpcmVzKSkKQEAgLTEzMjksNiArMTI4Nyw1MyBAQAogCQl0LT5leHBpcmVzID0gcm91bmRfamlmZmllcyh3aGVuKTsKIAkJYWRkX3RpbWVyX29uKHQsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CiAJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBtY2VfdGltZXJfZm4odW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCB0aW1lcl9saXN0ICp0ID0gdGhpc19jcHVfcHRyKCZtY2VfdGltZXIpOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgbG9uZyBpdjsKKworCVdBUk5fT04oY3B1ICE9IGRhdGEpOworCisJaXYgPSBfX3RoaXNfY3B1X3JlYWQobWNlX25leHRfaW50ZXJ2YWwpOworCisJaWYgKG1jZV9hdmFpbGFibGUodGhpc19jcHVfcHRyKCZjcHVfaW5mbykpKSB7CisJCW1hY2hpbmVfY2hlY2tfcG9sbChNQ1BfVElNRVNUQU1QLCB0aGlzX2NwdV9wdHIoJm1jZV9wb2xsX2JhbmtzKSk7CisKKwkJaWYgKG1jZV9pbnRlbF9jbWNpX3BvbGwoKSkgeworCQkJaXYgPSBtY2VfYWRqdXN0X3RpbWVyKGl2KTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCS8qCisJICogQWxlcnQgdXNlcnNwYWNlIGlmIG5lZWRlZC4gSWYgd2UgbG9nZ2VkIGFuIE1DRSwgcmVkdWNlIHRoZSBwb2xsaW5nCisJICogaW50ZXJ2YWwsIG90aGVyd2lzZSBpbmNyZWFzZSB0aGUgcG9sbGluZyBpbnRlcnZhbC4KKwkgKi8KKwlpZiAobWNlX25vdGlmeV9pcnEoKSkKKwkJaXYgPSBtYXgoaXYgLyAyLCAodW5zaWduZWQgbG9uZykgSFovMTAwKTsKKwllbHNlCisJCWl2ID0gbWluKGl2ICogMiwgcm91bmRfamlmZmllc19yZWxhdGl2ZShjaGVja19pbnRlcnZhbCAqIEhaKSk7CisKK2RvbmU6CisJX190aGlzX2NwdV93cml0ZShtY2VfbmV4dF9pbnRlcnZhbCwgaXYpOworCV9fcmVzdGFydF90aW1lcih0LCBpdik7Cit9CisKKy8qCisgKiBFbnN1cmUgdGhhdCB0aGUgdGltZXIgaXMgZmlyaW5nIGluIEBpbnRlcnZhbCBmcm9tIG5vdy4KKyAqLwordm9pZCBtY2VfdGltZXJfa2ljayh1bnNpZ25lZCBsb25nIGludGVydmFsKQoreworCXN0cnVjdCB0aW1lcl9saXN0ICp0ID0gdGhpc19jcHVfcHRyKCZtY2VfdGltZXIpOworCXVuc2lnbmVkIGxvbmcgaXYgPSBfX3RoaXNfY3B1X3JlYWQobWNlX25leHRfaW50ZXJ2YWwpOworCisJX19yZXN0YXJ0X3RpbWVyKHQsIGludGVydmFsKTsKKwogCWlmIChpbnRlcnZhbCA8IGl2KQogCQlfX3RoaXNfY3B1X3dyaXRlKG1jZV9uZXh0X2ludGVydmFsLCBpbnRlcnZhbCk7CiB9CkBAIC0xNTI1LDQ1ICsxNTMwLDQ2IEBACiAJCSAqIFZhcmlvdXMgSzdzIHdpdGggYnJva2VuIGJhbmsgMCBhcm91bmQuIEFsd2F5cyBkaXNhYmxlCiAJCSAqIGJ5IGRlZmF1bHQuCiAJCSAqLwotCQkgaWYgKGMtPng4NiA9PSA2ICYmIGNmZy0+YmFua3MgPiAwKQorCQlpZiAoYy0+eDg2ID09IDYgJiYgY2ZnLT5iYW5rcyA+IDApCiAJCQltY2VfYmFua3NbMF0uY3RsID0gMDsKIAotCQkgLyoKLQkJICAqIFR1cm4gb2ZmIE1DNF9NSVNDIHRocmVzaG9sZGluZyBiYW5rcyBvbiB0aG9zZSBtb2RlbHMgc2luY2UKLQkJICAqIHRoZXkncmUgbm90IHN1cHBvcnRlZCB0aGVyZS4KLQkJICAqLwotCQkgaWYgKGMtPng4NiA9PSAweDE1ICYmCi0JCSAgICAgKGMtPng4Nl9tb2RlbCA+PSAweDEwICYmIGMtPng4Nl9tb2RlbCA8PSAweDFmKSkgewotCQkJIGludCBpOwotCQkJIHU2NCB2YWwsIGh3Y3I7Ci0JCQkgYm9vbCBuZWVkX3RvZ2dsZTsKLQkJCSB1MzIgbXNyc1tdID0geworCQkvKgorCQkgKiBvdmVyZmxvd19yZWNvdiBpcyBzdXBwb3J0ZWQgZm9yIEYxNWggTW9kZWxzIDAwaC0wZmgKKwkJICogZXZlbiB0aG91Z2ggd2UgZG9uJ3QgaGF2ZSBhIENQVUlEIGJpdCBmb3IgaXQuCisJCSAqLworCQlpZiAoYy0+eDg2ID09IDB4MTUgJiYgYy0+eDg2X21vZGVsIDw9IDB4ZikKKwkJCW1jZV9mbGFncy5vdmVyZmxvd19yZWNvdiA9IDE7CisKKwkJLyoKKwkJICogVHVybiBvZmYgTUM0X01JU0MgdGhyZXNob2xkaW5nIGJhbmtzIG9uIHRob3NlIG1vZGVscyBzaW5jZQorCQkgKiB0aGV5J3JlIG5vdCBzdXBwb3J0ZWQgdGhlcmUuCisJCSAqLworCQlpZiAoYy0+eDg2ID09IDB4MTUgJiYKKwkJICAgIChjLT54ODZfbW9kZWwgPj0gMHgxMCAmJiBjLT54ODZfbW9kZWwgPD0gMHgxZikpIHsKKwkJCWludCBpOworCQkJdTY0IGh3Y3I7CisJCQlib29sIG5lZWRfdG9nZ2xlOworCQkJdTMyIG1zcnNbXSA9IHsKIAkJCQkweDAwMDAwNDEzLCAvKiBNQzRfTUlTQzAgKi8KIAkJCQkweGMwMDAwNDA4LCAvKiBNQzRfTUlTQzEgKi8KLQkJCSB9OworCQkJfTsKIAotCQkJIHJkbXNybChNU1JfSzdfSFdDUiwgaHdjcik7CisJCQlyZG1zcmwoTVNSX0s3X0hXQ1IsIGh3Y3IpOwogCi0JCQkgLyogTWNTdGF0dXNXckVuIGhhcyB0byBiZSBzZXQgKi8KLQkJCSBuZWVkX3RvZ2dsZSA9ICEoaHdjciAmIEJJVCgxOCkpOworCQkJLyogTWNTdGF0dXNXckVuIGhhcyB0byBiZSBzZXQgKi8KKwkJCW5lZWRfdG9nZ2xlID0gIShod2NyICYgQklUKDE4KSk7CiAKLQkJCSBpZiAobmVlZF90b2dnbGUpCi0JCQkJIHdybXNybChNU1JfSzdfSFdDUiwgaHdjciB8IEJJVCgxOCkpOworCQkJaWYgKG5lZWRfdG9nZ2xlKQorCQkJCXdybXNybChNU1JfSzdfSFdDUiwgaHdjciB8IEJJVCgxOCkpOwogCi0JCQkgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNycyk7IGkrKykgewotCQkJCSByZG1zcmwobXNyc1tpXSwgdmFsKTsKKwkJCS8qIENsZWFyIENudFAgYml0IHNhZmVseSAqLworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNycyk7IGkrKykKKwkJCQltc3JfY2xlYXJfYml0KG1zcnNbaV0sIDYyKTsKIAotCQkJCSAvKiBDbnRQIGJpdCBzZXQ/ICovCi0JCQkJIGlmICh2YWwgJiBCSVRfNjQoNjIpKSB7Ci0JCQkJCXZhbCAmPSB+QklUXzY0KDYyKTsKLQkJCQkJd3Jtc3JsKG1zcnNbaV0sIHZhbCk7Ci0JCQkJIH0KLQkJCSB9Ci0KLQkJCSAvKiByZXN0b3JlIG9sZCBzZXR0aW5ncyAqLwotCQkJIGlmIChuZWVkX3RvZ2dsZSkKLQkJCQkgd3Jtc3JsKE1TUl9LN19IV0NSLCBod2NyKTsKLQkJIH0KKwkJCS8qIHJlc3RvcmUgb2xkIHNldHRpbmdzICovCisJCQlpZiAobmVlZF90b2dnbGUpCisJCQkJd3Jtc3JsKE1TUl9LN19IV0NSLCBod2NyKTsKKwkJfQogCX0KIAogCWlmIChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpIHsKQEAgLTE2MjksMTAgKzE2MzUsMTEgQEAKIAlzd2l0Y2ggKGMtPng4Nl92ZW5kb3IpIHsKIAljYXNlIFg4Nl9WRU5ET1JfSU5URUw6CiAJCW1jZV9pbnRlbF9mZWF0dXJlX2luaXQoYyk7Ci0JCW1jZV9hZGp1c3RfdGltZXIgPSBtY2VfaW50ZWxfYWRqdXN0X3RpbWVyOworCQltY2VfYWRqdXN0X3RpbWVyID0gY21jaV9pbnRlbF9hZGp1c3RfdGltZXI7CiAJCWJyZWFrOwogCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CiAJCW1jZV9hbWRfZmVhdHVyZV9pbml0KGMpOworCQltY2VfZmxhZ3Mub3ZlcmZsb3dfcmVjb3YgPSBjcHVpZF9lYngoMHg4MDAwMDAwNykgJiAweDE7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMjAxNyw2ICsyMDI0LDcgQEAKIGludCBfX2luaXQgbWNoZWNrX2luaXQodm9pZCkKIHsKIAltY2hlY2tfaW50ZWxfdGhlcm1faW5pdCgpOworCW1jaGVja192ZW5kb3JfaW5pdF9zZXZlcml0eSgpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kLmMKaW5kZXggZjFjMzc2OS4uNTVhZDliMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9hbWQuYwpAQCAtNzksNyArNzksNyBAQAogCXJldHVybiAoYmFuayA9PSA0KTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiYW5rNF9uYW1lcyhzdHJ1Y3QgdGhyZXNob2xkX2Jsb2NrICpiKQorc3RhdGljIGNvbnN0IGNoYXIgKmJhbms0X25hbWVzKGNvbnN0IHN0cnVjdCB0aHJlc2hvbGRfYmxvY2sgKmIpCiB7CiAJc3dpdGNoIChiLT5hZGRyZXNzKSB7CiAJLyogTVNSNF9NSVNDMCAqLwpAQCAtMjUwLDYgKzI1MCw3IEBACiAJCQlpZiAoIWIuaW50ZXJydXB0X2NhcGFibGUpCiAJCQkJZ290byBpbml0OwogCisJCQliLmludGVycnVwdF9lbmFibGUgPSAxOwogCQkJbmV3CT0gKGhpZ2ggJiBNQVNLX0xWVE9GRl9ISSkgPj4gMjA7CiAJCQlvZmZzZXQgID0gc2V0dXBfQVBJQ19tY2Uob2Zmc2V0LCBuZXcpOwogCkBAIC0zMjIsNiArMzIzLDggQEAKIGxvZzoKIAltY2Vfc2V0dXAoJm0pOwogCXJkbXNybChNU1JfSUEzMl9NQ3hfU1RBVFVTKGJhbmspLCBtLnN0YXR1cyk7CisJaWYgKCEobS5zdGF0dXMgJiBNQ0lfU1RBVFVTX1ZBTCkpCisJCXJldHVybjsKIAltLm1pc2MgPSAoKHU2NCloaWdoIDw8IDMyKSB8IGxvdzsKIAltLmJhbmsgPSBiYW5rOwogCW1jZV9sb2coJm0pOwpAQCAtNDk3LDEwICs1MDAsMTIgQEAKIAliLT5pbnRlcnJ1cHRfY2FwYWJsZQk9IGx2dF9pbnRlcnJ1cHRfc3VwcG9ydGVkKGJhbmssIGhpZ2gpOwogCWItPnRocmVzaG9sZF9saW1pdAk9IFRIUkVTSE9MRF9NQVg7CiAKLQlpZiAoYi0+aW50ZXJydXB0X2NhcGFibGUpCisJaWYgKGItPmludGVycnVwdF9jYXBhYmxlKSB7CiAJCXRocmVzaG9sZF9rdHlwZS5kZWZhdWx0X2F0dHJzWzJdID0gJmludGVycnVwdF9lbmFibGUuYXR0cjsKLQllbHNlCisJCWItPmludGVycnVwdF9lbmFibGUgPSAxOworCX0gZWxzZSB7CiAJCXRocmVzaG9sZF9rdHlwZS5kZWZhdWx0X2F0dHJzWzJdID0gTlVMTDsKKwl9CiAKIAlJTklUX0xJU1RfSEVBRCgmYi0+bWlzY2opOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfaW50ZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9pbnRlbC5jCmluZGV4IGIzYzk3YmEuLmI0YTQxY2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9pbnRlbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9pbnRlbC5jCkBAIC0zOSw2ICszOSwxNSBAQAogc3RhdGljIERFRklORV9QRVJfQ1BVKG1jZV9iYW5rc190LCBtY2VfYmFua3Nfb3duZWQpOwogCiAvKgorICogQ01DSSBzdG9ybSBkZXRlY3Rpb24gYmFja29mZiBjb3VudGVyCisgKgorICogRHVyaW5nIHN0b3JtLCB3ZSByZXNldCB0aGlzIGNvdW50ZXIgdG8gSU5JVElBTF9DSEVDS19JTlRFUlZBTCBpbiBjYXNlIHdlJ3ZlCisgKiBlbmNvdW50ZXJlZCBhbiBlcnJvci4gSWYgbm90LCB3ZSBkZWNyZW1lbnQgaXQgYnkgb25lLiBXZSBzaWduYWwgdGhlIGVuZCBvZgorICogdGhlIENNQ0kgc3Rvcm0gd2hlbiBpdCByZWFjaGVzIDAuCisgKi8KK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGNtY2lfYmFja29mZl9jbnQpOworCisvKgogICogY21jaV9kaXNjb3Zlcl9sb2NrIHByb3RlY3RzIGFnYWluc3QgcGFyYWxsZWwgZGlzY292ZXJ5IGF0dGVtcHRzCiAgKiB3aGljaCBjb3VsZCByYWNlIGFnYWluc3QgZWFjaCBvdGhlci4KICAqLwpAQCAtNDYsNyArNTUsNyBAQAogCiAjZGVmaW5lIENNQ0lfVEhSRVNIT0xECQkxCiAjZGVmaW5lIENNQ0lfUE9MTF9JTlRFUlZBTAkoMzAgKiBIWikKLSNkZWZpbmUgQ01DSV9TVE9STV9JTlRFUlZBTAkoMSAqIEhaKQorI2RlZmluZSBDTUNJX1NUT1JNX0lOVEVSVkFMCShIWikKICNkZWZpbmUgQ01DSV9TVE9STV9USFJFU0hPTEQJMTUKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIGNtY2lfdGltZV9zdGFtcCk7CkBAIC04MiwxMSArOTEsMjEgQEAKIAlyZXR1cm4gISEoY2FwICYgTUNHX0NNQ0lfUCk7CiB9CiAKLXZvaWQgbWNlX2ludGVsX2NtY2lfcG9sbCh2b2lkKQorYm9vbCBtY2VfaW50ZWxfY21jaV9wb2xsKHZvaWQpCiB7CiAJaWYgKF9fdGhpc19jcHVfcmVhZChjbWNpX3N0b3JtX3N0YXRlKSA9PSBDTUNJX1NUT1JNX05PTkUpCi0JCXJldHVybjsKLQltYWNoaW5lX2NoZWNrX3BvbGwoTUNQX1RJTUVTVEFNUCwgdGhpc19jcHVfcHRyKCZtY2VfYmFua3Nfb3duZWQpKTsKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBSZXNldCB0aGUgY291bnRlciBpZiB3ZSd2ZSBsb2dnZWQgYW4gZXJyb3IgaW4gdGhlIGxhc3QgcG9sbAorCSAqIGR1cmluZyB0aGUgc3Rvcm0uCisJICovCisJaWYgKG1hY2hpbmVfY2hlY2tfcG9sbChNQ1BfVElNRVNUQU1QLCB0aGlzX2NwdV9wdHIoJm1jZV9iYW5rc19vd25lZCkpKQorCQl0aGlzX2NwdV93cml0ZShjbWNpX2JhY2tvZmZfY250LCBJTklUSUFMX0NIRUNLX0lOVEVSVkFMKTsKKwllbHNlCisJCXRoaXNfY3B1X2RlYyhjbWNpX2JhY2tvZmZfY250KTsKKworCXJldHVybiB0cnVlOwogfQogCiB2b2lkIG1jZV9pbnRlbF9oY3B1X3VwZGF0ZSh1bnNpZ25lZCBsb25nIGNwdSkKQEAgLTk3LDMxICsxMTYsMzIgQEAKIAlwZXJfY3B1KGNtY2lfc3Rvcm1fc3RhdGUsIGNwdSkgPSBDTUNJX1NUT1JNX05PTkU7CiB9CiAKLXVuc2lnbmVkIGxvbmcgbWNlX2ludGVsX2FkanVzdF90aW1lcih1bnNpZ25lZCBsb25nIGludGVydmFsKQordW5zaWduZWQgbG9uZyBjbWNpX2ludGVsX2FkanVzdF90aW1lcih1bnNpZ25lZCBsb25nIGludGVydmFsKQogewotCWludCByOwotCi0JaWYgKGludGVydmFsIDwgQ01DSV9QT0xMX0lOVEVSVkFMKQotCQlyZXR1cm4gaW50ZXJ2YWw7CisJaWYgKCh0aGlzX2NwdV9yZWFkKGNtY2lfYmFja29mZl9jbnQpID4gMCkgJiYKKwkgICAgKF9fdGhpc19jcHVfcmVhZChjbWNpX3N0b3JtX3N0YXRlKSA9PSBDTUNJX1NUT1JNX0FDVElWRSkpIHsKKwkJbWNlX25vdGlmeV9pcnEoKTsKKwkJcmV0dXJuIENNQ0lfU1RPUk1fSU5URVJWQUw7CisJfQogCiAJc3dpdGNoIChfX3RoaXNfY3B1X3JlYWQoY21jaV9zdG9ybV9zdGF0ZSkpIHsKIAljYXNlIENNQ0lfU1RPUk1fQUNUSVZFOgorCiAJCS8qCiAJCSAqIFdlIHN3aXRjaCBiYWNrIHRvIGludGVycnVwdCBtb2RlIG9uY2UgdGhlIHBvbGwgdGltZXIgaGFzCi0JCSAqIHNpbGVuY2VkIGl0c2VsZi4gVGhhdCBtZWFucyBubyBldmVudHMgcmVjb3JkZWQgYW5kIHRoZQotCQkgKiB0aW1lciBpbnRlcnZhbCBpcyBiYWNrIHRvIG91ciBwb2xsIGludGVydmFsLgorCQkgKiBzaWxlbmNlZCBpdHNlbGYuIFRoYXQgbWVhbnMgbm8gZXZlbnRzIHJlY29yZGVkIGFuZCB0aGUgdGltZXIKKwkJICogaW50ZXJ2YWwgaXMgYmFjayB0byBvdXIgcG9sbCBpbnRlcnZhbC4KIAkJICovCiAJCV9fdGhpc19jcHVfd3JpdGUoY21jaV9zdG9ybV9zdGF0ZSwgQ01DSV9TVE9STV9TVUJTSURFRCk7Ci0JCXIgPSBhdG9taWNfc3ViX3JldHVybigxLCAmY21jaV9zdG9ybV9vbl9jcHVzKTsKLQkJaWYgKHIgPT0gMCkKKwkJaWYgKCFhdG9taWNfc3ViX3JldHVybigxLCAmY21jaV9zdG9ybV9vbl9jcHVzKSkKIAkJCXByX25vdGljZSgiQ01DSSBzdG9ybSBzdWJzaWRlZDogc3dpdGNoaW5nIHRvIGludGVycnVwdCBtb2RlXG4iKTsKKwogCQkvKiBGQUxMVEhST1VHSCAqLwogCiAJY2FzZSBDTUNJX1NUT1JNX1NVQlNJREVEOgogCQkvKgotCQkgKiBXZSB3YWl0IGZvciBhbGwgY3B1cyB0byBnbyBiYWNrIHRvIFNVQlNJREVECi0JCSAqIHN0YXRlLiBXaGVuIHRoYXQgaGFwcGVucyB3ZSBzd2l0Y2ggYmFjayB0bwotCQkgKiBpbnRlcnJ1cHQgbW9kZS4KKwkJICogV2Ugd2FpdCBmb3IgYWxsIENQVXMgdG8gZ28gYmFjayB0byBTVUJTSURFRCBzdGF0ZS4gV2hlbiB0aGF0CisJCSAqIGhhcHBlbnMgd2Ugc3dpdGNoIGJhY2sgdG8gaW50ZXJydXB0IG1vZGUuCiAJCSAqLwogCQlpZiAoIWF0b21pY19yZWFkKCZjbWNpX3N0b3JtX29uX2NwdXMpKSB7CiAJCQlfX3RoaXNfY3B1X3dyaXRlKGNtY2lfc3Rvcm1fc3RhdGUsIENNQ0lfU1RPUk1fTk9ORSk7CkBAIC0xMzAsMTAgKzE1MCw4IEBACiAJCX0KIAkJcmV0dXJuIENNQ0lfUE9MTF9JTlRFUlZBTDsKIAlkZWZhdWx0OgotCQkvKgotCQkgKiBXZSBoYXZlIHNoaW55IHdlYXRoZXIuIExldCB0aGUgcG9sbCBkbyB3aGF0ZXZlciBpdAotCQkgKiB0aGlua3MuCi0JCSAqLworCisJCS8qIFdlIGhhdmUgc2hpbnkgd2VhdGhlci4gTGV0IHRoZSBwb2xsIGRvIHdoYXRldmVyIGl0IHRoaW5rcy4gKi8KIAkJcmV0dXJuIGludGVydmFsOwogCX0KIH0KQEAgLTE3OCw3ICsxOTYsOCBAQAogCWNtY2lfc3Rvcm1fZGlzYWJsZV9iYW5rcygpOwogCV9fdGhpc19jcHVfd3JpdGUoY21jaV9zdG9ybV9zdGF0ZSwgQ01DSV9TVE9STV9BQ1RJVkUpOwogCXIgPSBhdG9taWNfYWRkX3JldHVybigxLCAmY21jaV9zdG9ybV9vbl9jcHVzKTsKLQltY2VfdGltZXJfa2ljayhDTUNJX1BPTExfSU5URVJWQUwpOworCW1jZV90aW1lcl9raWNrKENNQ0lfU1RPUk1fSU5URVJWQUwpOworCXRoaXNfY3B1X3dyaXRlKGNtY2lfYmFja29mZl9jbnQsIElOSVRJQUxfQ0hFQ0tfSU5URVJWQUwpOwogCiAJaWYgKHIgPT0gMSkKIAkJcHJfbm90aWNlKCJDTUNJIHN0b3JtIGRldGVjdGVkOiBzd2l0Y2hpbmcgdG8gcG9sbCBtb2RlXG4iKTsKQEAgLTE5NSw2ICsyMTQsNyBAQAogewogCWlmIChjbWNpX3N0b3JtX2RldGVjdCgpKQogCQlyZXR1cm47CisKIAltYWNoaW5lX2NoZWNrX3BvbGwoTUNQX1RJTUVTVEFNUCwgdGhpc19jcHVfcHRyKCZtY2VfYmFua3Nfb3duZWQpKTsKIAltY2Vfbm90aWZ5X2lycSgpOwogfQpAQCAtMjg2LDYgKzMwNiw3IEBACiAKIAlpZiAoIW1jZV9hdmFpbGFibGUocmF3X2NwdV9wdHIoJmNwdV9pbmZvKSkgfHwgIWNtY2lfc3VwcG9ydGVkKCZiYW5rcykpCiAJCXJldHVybjsKKwogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAltYWNoaW5lX2NoZWNrX3BvbGwoTUNQX1RJTUVTVEFNUCwgdGhpc19jcHVfcHRyKCZtY2VfYmFua3Nfb3duZWQpKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21pY3JvY29kZS9hbWQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZC5jCmluZGV4IGJmYmJlNjEuLjEyODI5YzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2FtZC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaV9pZHMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvY29yZV9lYXJseS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvY29yZV9lYXJseS5jCmluZGV4IGQ0NWRmNGJkLi5hNDEzYTY5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21pY3JvY29kZS9jb3JlX2Vhcmx5LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvY29yZV9lYXJseS5jCkBAIC0yMyw1NyArMjMsNiBAQAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vY21kbGluZS5oPgogCi0jZGVmaW5lIFFDSEFSKGEsIGIsIGMsIGQpICgoYSkgKyAoKGIpIDw8IDgpICsgKChjKSA8PCAxNikgKyAoKGQpIDw8IDI0KSkKLSNkZWZpbmUgQ1BVSURfSU5URUwxIFFDSEFSKCdHJywgJ2UnLCAnbicsICd1JykKLSNkZWZpbmUgQ1BVSURfSU5URUwyIFFDSEFSKCdpJywgJ24nLCAnZScsICdJJykKLSNkZWZpbmUgQ1BVSURfSU5URUwzIFFDSEFSKCduJywgJ3QnLCAnZScsICdsJykKLSNkZWZpbmUgQ1BVSURfQU1EMSBRQ0hBUignQScsICd1JywgJ3QnLCAnaCcpCi0jZGVmaW5lIENQVUlEX0FNRDIgUUNIQVIoJ2UnLCAnbicsICd0JywgJ2knKQotI2RlZmluZSBDUFVJRF9BTUQzIFFDSEFSKCdjJywgJ0EnLCAnTScsICdEJykKLQotI2RlZmluZSBDUFVJRF9JUyhhLCBiLCBjLCBlYngsIGVjeCwgZWR4KQlcCi0JCSghKChlYnggXiAoYSkpfChlZHggXiAoYikpfChlY3ggXiAoYykpKSkKLQotLyoKLSAqIEluIGVhcmx5IGxvYWRpbmcgbWljcm9jb2RlIHBoYXNlIG9uIEJTUCwgYm9vdF9jcHVfZGF0YSBpcyBub3Qgc2V0IHVwIHlldC4KLSAqIHg4Nl92ZW5kb3IoKSBnZXRzIHZlbmRvciBpZCBmb3IgQlNQLgotICoKLSAqIEluIDMyIGJpdCBBUCBjYXNlLCBhY2Nlc3NpbmcgYm9vdF9jcHVfZGF0YSBuZWVkcyBsaW5lYXIgYWRkcmVzcy4gVG8gc2ltcGxpZnkKLSAqIGNvZGluZywgd2Ugc3RpbGwgdXNlIHg4Nl92ZW5kb3IoKSB0byBnZXQgdmVuZG9yIGlkIGZvciBBUC4KLSAqCi0gKiB4ODZfdmVuZG9yKCkgZ2V0cyB2ZW5kb3IgaW5mb3JtYXRpb24gZGlyZWN0bHkgdGhyb3VnaCBjcHVpZC4KLSAqLwotc3RhdGljIGludCB4ODZfdmVuZG9yKHZvaWQpCi17Ci0JdTMyIGVheCA9IDB4MDAwMDAwMDA7Ci0JdTMyIGVieCwgZWN4ID0gMCwgZWR4OwotCi0JbmF0aXZlX2NwdWlkKCZlYXgsICZlYngsICZlY3gsICZlZHgpOwotCi0JaWYgKENQVUlEX0lTKENQVUlEX0lOVEVMMSwgQ1BVSURfSU5URUwyLCBDUFVJRF9JTlRFTDMsIGVieCwgZWN4LCBlZHgpKQotCQlyZXR1cm4gWDg2X1ZFTkRPUl9JTlRFTDsKLQotCWlmIChDUFVJRF9JUyhDUFVJRF9BTUQxLCBDUFVJRF9BTUQyLCBDUFVJRF9BTUQzLCBlYngsIGVjeCwgZWR4KSkKLQkJcmV0dXJuIFg4Nl9WRU5ET1JfQU1EOwotCi0JcmV0dXJuIFg4Nl9WRU5ET1JfVU5LTk9XTjsKLX0KLQotc3RhdGljIGludCB4ODZfZmFtaWx5KHZvaWQpCi17Ci0JdTMyIGVheCA9IDB4MDAwMDAwMDE7Ci0JdTMyIGVieCwgZWN4ID0gMCwgZWR4OwotCWludCB4ODY7Ci0KLQluYXRpdmVfY3B1aWQoJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7Ci0KLQl4ODYgPSAoZWF4ID4+IDgpICYgMHhmOwotCWlmICh4ODYgPT0gMTUpCi0JCXg4NiArPSAoZWF4ID4+IDIwKSAmIDB4ZmY7Ci0KLQlyZXR1cm4geDg2OwotfQotCiBzdGF0aWMgYm9vbCBfX2luaXQgY2hlY2tfbG9hZGVyX2Rpc2FibGVkX2JzcCh2b2lkKQogewogI2lmZGVmIENPTkZJR19YODZfMzIKQEAgLTk2LDcgKzQ1LDcgQEAKIAogdm9pZCBfX2luaXQgbG9hZF91Y29kZV9ic3Aodm9pZCkKIHsKLQlpbnQgdmVuZG9yLCB4ODY7CisJaW50IHZlbmRvciwgZmFtaWx5OwogCiAJaWYgKGNoZWNrX2xvYWRlcl9kaXNhYmxlZF9ic3AoKSkKIAkJcmV0dXJuOwpAQCAtMTA1LDE1ICs1NCwxNSBAQAogCQlyZXR1cm47CiAKIAl2ZW5kb3IgPSB4ODZfdmVuZG9yKCk7Ci0JeDg2ID0geDg2X2ZhbWlseSgpOworCWZhbWlseSA9IHg4Nl9mYW1pbHkoKTsKIAogCXN3aXRjaCAodmVuZG9yKSB7CiAJY2FzZSBYODZfVkVORE9SX0lOVEVMOgotCQlpZiAoeDg2ID49IDYpCisJCWlmIChmYW1pbHkgPj0gNikKIAkJCWxvYWRfdWNvZGVfaW50ZWxfYnNwKCk7CiAJCWJyZWFrOwogCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6Ci0JCWlmICh4ODYgPj0gMHgxMCkKKwkJaWYgKGZhbWlseSA+PSAweDEwKQogCQkJbG9hZF91Y29kZV9hbWRfYnNwKCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xMzIsNyArODEsNyBAQAogCiB2b2lkIGxvYWRfdWNvZGVfYXAodm9pZCkKIHsKLQlpbnQgdmVuZG9yLCB4ODY7CisJaW50IHZlbmRvciwgZmFtaWx5OwogCiAJaWYgKGNoZWNrX2xvYWRlcl9kaXNhYmxlZF9hcCgpKQogCQlyZXR1cm47CkBAIC0xNDEsMTUgKzkwLDE1IEBACiAJCXJldHVybjsKIAogCXZlbmRvciA9IHg4Nl92ZW5kb3IoKTsKLQl4ODYgPSB4ODZfZmFtaWx5KCk7CisJZmFtaWx5ID0geDg2X2ZhbWlseSgpOwogCiAJc3dpdGNoICh2ZW5kb3IpIHsKIAljYXNlIFg4Nl9WRU5ET1JfSU5URUw6Ci0JCWlmICh4ODYgPj0gNikKKwkJaWYgKGZhbWlseSA+PSA2KQogCQkJbG9hZF91Y29kZV9pbnRlbF9hcCgpOwogCQlicmVhazsKIAljYXNlIFg4Nl9WRU5ET1JfQU1EOgotCQlpZiAoeDg2ID49IDB4MTApCisJCWlmIChmYW1pbHkgPj0gMHgxMCkKIAkJCWxvYWRfdWNvZGVfYW1kX2FwKCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNzksMTggKzEyOCwxOCBAQAogCiB2b2lkIHJlbG9hZF9lYXJseV9taWNyb2NvZGUodm9pZCkKIHsKLQlpbnQgdmVuZG9yLCB4ODY7CisJaW50IHZlbmRvciwgZmFtaWx5OwogCiAJdmVuZG9yID0geDg2X3ZlbmRvcigpOwotCXg4NiA9IHg4Nl9mYW1pbHkoKTsKKwlmYW1pbHkgPSB4ODZfZmFtaWx5KCk7CiAKIAlzd2l0Y2ggKHZlbmRvcikgewogCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKLQkJaWYgKHg4NiA+PSA2KQorCQlpZiAoZmFtaWx5ID49IDYpCiAJCQlyZWxvYWRfdWNvZGVfaW50ZWwoKTsKIAkJYnJlYWs7CiAJY2FzZSBYODZfVkVORE9SX0FNRDoKLQkJaWYgKHg4NiA+PSAweDEwKQorCQlpZiAoZmFtaWx5ID49IDB4MTApCiAJCQlyZWxvYWRfdWNvZGVfYW1kKCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21pY3JvY29kZS9pbnRlbC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvaW50ZWwuYwppbmRleCA3NDZlN2ZkLi5hNDFiZWFkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21pY3JvY29kZS9pbnRlbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2ludGVsLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCWNwZiA9IGNwdV9zaWcucGY7CiAJY3JldiA9IGNwdV9zaWcucmV2OwogCi0JcmV0dXJuIGdldF9tYXRjaGluZ19taWNyb2NvZGUoY3NpZywgY3BmLCBtY19pbnRlbCwgY3Jldik7CisJcmV0dXJuIGdldF9tYXRjaGluZ19taWNyb2NvZGUoY3NpZywgY3BmLCBjcmV2LCBtY19pbnRlbCk7CiB9CiAKIHN0YXRpYyBpbnQgYXBwbHlfbWljcm9jb2RlX2ludGVsKGludCBjcHUpCkBAIC0yMjYsNyArMjI2LDcgQEAKIAogCQljc2lnID0gdWNpLT5jcHVfc2lnLnNpZzsKIAkJY3BmID0gdWNpLT5jcHVfc2lnLnBmOwotCQlpZiAoZ2V0X21hdGNoaW5nX21pY3JvY29kZShjc2lnLCBjcGYsIG1jLCBuZXdfcmV2KSkgeworCQlpZiAoZ2V0X21hdGNoaW5nX21pY3JvY29kZShjc2lnLCBjcGYsIG5ld19yZXYsIG1jKSkgewogCQkJdmZyZWUobmV3X21jKTsKIAkJCW5ld19yZXYgPSBtY19oZWFkZXIucmV2OwogCQkJbmV3X21jICA9IG1jOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvaW50ZWxfZWFybHkuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2ludGVsX2Vhcmx5LmMKaW5kZXggNDIwZWI5My4uMmY0OWFiNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvaW50ZWxfZWFybHkuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21pY3JvY29kZS9pbnRlbF9lYXJseS5jCkBAIC0xNiw2ICsxNiwxNCBAQAogICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCisKKy8qCisgKiBUaGlzIG5lZWRzIHRvIGJlIGJlZm9yZSBhbGwgaGVhZGVycyBzbyB0aGF0IHByX2RlYnVnIGluIHByaW50ay5oIGRvZXNuJ3QgdHVybgorICogcHJpbnRrIGNhbGxzIGludG8gbm9fcHJpbnRrKCkuCisgKgorICojZGVmaW5lIERFQlVHCisgKi8KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMjgsNiArMzYsOSBAQAogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogCisjdW5kZWYgcHJfZm10CisjZGVmaW5lIHByX2ZtdChmbXQpCSJtaWNyb2NvZGU6ICIgZm10CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIG1jX3NhdmVkX2luX2luaXRyZFtNQVhfVUNPREVfQ09VTlRdOwogc3RhdGljIHN0cnVjdCBtY19zYXZlZF9kYXRhIHsKIAl1bnNpZ25lZCBpbnQgbWNfc2F2ZWRfY291bnQ7CkBAIC0zNSw1MCArNDYsNDUgQEAKIH0gbWNfc2F2ZWRfZGF0YTsKIAogc3RhdGljIGVudW0gdWNvZGVfc3RhdGUKLWdlbmVyaWNfbG9hZF9taWNyb2NvZGVfZWFybHkoc3RydWN0IG1pY3JvY29kZV9pbnRlbCAqKm1jX3NhdmVkX3AsCi0JCQkgICAgIHVuc2lnbmVkIGludCBtY19zYXZlZF9jb3VudCwKLQkJCSAgICAgc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kpCitsb2FkX21pY3JvY29kZV9lYXJseShzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICoqc2F2ZWQsCisJCSAgICAgdW5zaWduZWQgaW50IG51bV9zYXZlZCwgc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kpCiB7CiAJc3RydWN0IG1pY3JvY29kZV9pbnRlbCAqdWNvZGVfcHRyLCAqbmV3X21jID0gTlVMTDsKLQlpbnQgbmV3X3JldiA9IHVjaS0+Y3B1X3NpZy5yZXY7Ci0JZW51bSB1Y29kZV9zdGF0ZSBzdGF0ZSA9IFVDT0RFX09LOwotCXVuc2lnbmVkIGludCBtY19zaXplOwotCXN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2ludGVsICptY19oZWFkZXI7Ci0JdW5zaWduZWQgaW50IGNzaWcgPSB1Y2ktPmNwdV9zaWcuc2lnOwotCXVuc2lnbmVkIGludCBjcGYgPSB1Y2ktPmNwdV9zaWcucGY7Ci0JaW50IGk7CisJc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfaW50ZWwgKm1jX2hkcjsKKwlpbnQgbmV3X3JldiwgcmV0LCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG1jX3NhdmVkX2NvdW50OyBpKyspIHsKLQkJdWNvZGVfcHRyID0gbWNfc2F2ZWRfcFtpXTsKKwluZXdfcmV2ID0gdWNpLT5jcHVfc2lnLnJldjsKIAotCQltY19oZWFkZXIgPSAoc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfaW50ZWwgKil1Y29kZV9wdHI7Ci0JCW1jX3NpemUgPSBnZXRfdG90YWxzaXplKG1jX2hlYWRlcik7Ci0JCWlmIChnZXRfbWF0Y2hpbmdfbWljcm9jb2RlKGNzaWcsIGNwZiwgdWNvZGVfcHRyLCBuZXdfcmV2KSkgewotCQkJbmV3X3JldiA9IG1jX2hlYWRlci0+cmV2OwotCQkJbmV3X21jICA9IHVjb2RlX3B0cjsKLQkJfQorCWZvciAoaSA9IDA7IGkgPCBudW1fc2F2ZWQ7IGkrKykgeworCQl1Y29kZV9wdHIgPSBzYXZlZFtpXTsKKwkJbWNfaGRyCSAgPSAoc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfaW50ZWwgKil1Y29kZV9wdHI7CisKKwkJcmV0ID0gZ2V0X21hdGNoaW5nX21pY3JvY29kZSh1Y2ktPmNwdV9zaWcuc2lnLAorCQkJCQkgICAgIHVjaS0+Y3B1X3NpZy5wZiwKKwkJCQkJICAgICBuZXdfcmV2LAorCQkJCQkgICAgIHVjb2RlX3B0cik7CisJCWlmICghcmV0KQorCQkJY29udGludWU7CisKKwkJbmV3X3JldiA9IG1jX2hkci0+cmV2OworCQluZXdfbWMgID0gdWNvZGVfcHRyOwogCX0KIAotCWlmICghbmV3X21jKSB7Ci0JCXN0YXRlID0gVUNPREVfTkZPVU5EOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFuZXdfbWMpCisJCXJldHVybiBVQ09ERV9ORk9VTkQ7CiAKIAl1Y2ktPm1jID0gKHN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKiluZXdfbWM7Ci1vdXQ6Ci0JcmV0dXJuIHN0YXRlOworCXJldHVybiBVQ09ERV9PSzsKIH0KIAotc3RhdGljIHZvaWQKLW1pY3JvY29kZV9wb2ludGVyKHN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKiptY19zYXZlZCwKLQkJICB1bnNpZ25lZCBsb25nICptY19zYXZlZF9pbl9pbml0cmQsCi0JCSAgdW5zaWduZWQgbG9uZyBpbml0cmRfc3RhcnQsIGludCBtY19zYXZlZF9jb3VudCkKK3N0YXRpYyBpbmxpbmUgdm9pZAorY29weV9pbml0cmRfcHRycyhzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICoqbWNfc2F2ZWQsIHVuc2lnbmVkIGxvbmcgKmluaXRyZCwKKwkJICB1bnNpZ25lZCBsb25nIG9mZiwgaW50IG51bV9zYXZlZCkKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBtY19zYXZlZF9jb3VudDsgaSsrKQotCQltY19zYXZlZFtpXSA9IChzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICopCi0JCQkgICAgICAobWNfc2F2ZWRfaW5faW5pdHJkW2ldICsgaW5pdHJkX3N0YXJ0KTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3NhdmVkOyBpKyspCisJCW1jX3NhdmVkW2ldID0gKHN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKikoaW5pdHJkW2ldICsgb2ZmKTsKIH0KIAogI2lmZGVmIENPTkZJR19YODZfMzIKQEAgLTEwMiw1NSArMTA4LDI3IEBACiAjZW5kaWYKIAogc3RhdGljIGVudW0gdWNvZGVfc3RhdGUKLWxvYWRfbWljcm9jb2RlKHN0cnVjdCBtY19zYXZlZF9kYXRhICptY19zYXZlZF9kYXRhLAotCSAgICAgICB1bnNpZ25lZCBsb25nICptY19zYXZlZF9pbl9pbml0cmQsCi0JICAgICAgIHVuc2lnbmVkIGxvbmcgaW5pdHJkX3N0YXJ0LAotCSAgICAgICBzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSkKK2xvYWRfbWljcm9jb2RlKHN0cnVjdCBtY19zYXZlZF9kYXRhICptY19zYXZlZF9kYXRhLCB1bnNpZ25lZCBsb25nICppbml0cmQsCisJICAgICAgIHVuc2lnbmVkIGxvbmcgaW5pdHJkX3N0YXJ0LCBzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSkKIHsKIAlzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICptY19zYXZlZF90bXBbTUFYX1VDT0RFX0NPVU5UXTsKIAl1bnNpZ25lZCBpbnQgY291bnQgPSBtY19zYXZlZF9kYXRhLT5tY19zYXZlZF9jb3VudDsKIAogCWlmICghbWNfc2F2ZWRfZGF0YS0+bWNfc2F2ZWQpIHsKLQkJbWljcm9jb2RlX3BvaW50ZXIobWNfc2F2ZWRfdG1wLCBtY19zYXZlZF9pbl9pbml0cmQsCi0JCQkJICBpbml0cmRfc3RhcnQsIGNvdW50KTsKKwkJY29weV9pbml0cmRfcHRycyhtY19zYXZlZF90bXAsIGluaXRyZCwgaW5pdHJkX3N0YXJ0LCBjb3VudCk7CiAKLQkJcmV0dXJuIGdlbmVyaWNfbG9hZF9taWNyb2NvZGVfZWFybHkobWNfc2F2ZWRfdG1wLCBjb3VudCwgdWNpKTsKKwkJcmV0dXJuIGxvYWRfbWljcm9jb2RlX2Vhcmx5KG1jX3NhdmVkX3RtcCwgY291bnQsIHVjaSk7CiAJfSBlbHNlIHsKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJCW1pY3JvY29kZV9waHlzKG1jX3NhdmVkX3RtcCwgbWNfc2F2ZWRfZGF0YSk7Ci0JCXJldHVybiBnZW5lcmljX2xvYWRfbWljcm9jb2RlX2Vhcmx5KG1jX3NhdmVkX3RtcCwgY291bnQsIHVjaSk7CisJCXJldHVybiBsb2FkX21pY3JvY29kZV9lYXJseShtY19zYXZlZF90bXAsIGNvdW50LCB1Y2kpOwogI2Vsc2UKLQkJcmV0dXJuIGdlbmVyaWNfbG9hZF9taWNyb2NvZGVfZWFybHkobWNfc2F2ZWRfZGF0YS0+bWNfc2F2ZWQsCisJCXJldHVybiBsb2FkX21pY3JvY29kZV9lYXJseShtY19zYXZlZF9kYXRhLT5tY19zYXZlZCwKIAkJCQkJCSAgICBjb3VudCwgdWNpKTsKICNlbmRpZgogCX0KIH0KIAotc3RhdGljIHU4IGdldF94ODZfZmFtaWx5KHVuc2lnbmVkIGxvbmcgc2lnKQotewotCXU4IHg4NjsKLQotCXg4NiA9IChzaWcgPj4gOCkgJiAweGY7Ci0KLQlpZiAoeDg2ID09IDB4ZikKLQkJeDg2ICs9IChzaWcgPj4gMjApICYgMHhmZjsKLQotCXJldHVybiB4ODY7Ci19Ci0KLXN0YXRpYyB1OCBnZXRfeDg2X21vZGVsKHVuc2lnbmVkIGxvbmcgc2lnKQotewotCXU4IHg4NiwgeDg2X21vZGVsOwotCi0JeDg2ID0gZ2V0X3g4Nl9mYW1pbHkoc2lnKTsKLQl4ODZfbW9kZWwgPSAoc2lnID4+IDQpICYgMHhmOwotCi0JaWYgKHg4NiA9PSAweDYgfHwgeDg2ID09IDB4ZikKLQkJeDg2X21vZGVsICs9ICgoc2lnID4+IDE2KSAmIDB4ZikgPDwgNDsKLQotCXJldHVybiB4ODZfbW9kZWw7Ci19Ci0KIC8qCiAgKiBHaXZlbiBDUFUgc2lnbmF0dXJlIGFuZCBhIG1pY3JvY29kZSBwYXRjaCwgdGhpcyBmdW5jdGlvbiBmaW5kcyBpZiB0aGUKICAqIG1pY3JvY29kZSBwYXRjaCBoYXMgbWF0Y2hpbmcgZmFtaWx5IGFuZCBtb2RlbCB3aXRoIHRoZSBDUFUuCkBAIC0xNTksNDIgKzEzNyw0MCBAQAogbWF0Y2hpbmdfbW9kZWxfbWljcm9jb2RlKHN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2ludGVsICptY19oZWFkZXIsCiAJCQl1bnNpZ25lZCBsb25nIHNpZykKIHsKLQl1OCB4ODYsIHg4Nl9tb2RlbDsKLQl1OCB4ODZfdWNvZGUsIHg4Nl9tb2RlbF91Y29kZTsKKwl1bnNpZ25lZCBpbnQgZmFtLCBtb2RlbDsKKwl1bnNpZ25lZCBpbnQgZmFtX3Vjb2RlLCBtb2RlbF91Y29kZTsKIAlzdHJ1Y3QgZXh0ZW5kZWRfc2lndGFibGUgKmV4dF9oZWFkZXI7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplID0gZ2V0X3RvdGFsc2l6ZShtY19oZWFkZXIpOwogCXVuc2lnbmVkIGxvbmcgZGF0YV9zaXplID0gZ2V0X2RhdGFzaXplKG1jX2hlYWRlcik7CiAJaW50IGV4dF9zaWdjb3VudCwgaTsKIAlzdHJ1Y3QgZXh0ZW5kZWRfc2lnbmF0dXJlICpleHRfc2lnOwogCi0JeDg2ID0gZ2V0X3g4Nl9mYW1pbHkoc2lnKTsKLQl4ODZfbW9kZWwgPSBnZXRfeDg2X21vZGVsKHNpZyk7CisJZmFtICAgPSBfX3g4Nl9mYW1pbHkoc2lnKTsKKwltb2RlbCA9IHg4Nl9tb2RlbChzaWcpOwogCi0JeDg2X3Vjb2RlID0gZ2V0X3g4Nl9mYW1pbHkobWNfaGVhZGVyLT5zaWcpOwotCXg4Nl9tb2RlbF91Y29kZSA9IGdldF94ODZfbW9kZWwobWNfaGVhZGVyLT5zaWcpOworCWZhbV91Y29kZSAgID0gX194ODZfZmFtaWx5KG1jX2hlYWRlci0+c2lnKTsKKwltb2RlbF91Y29kZSA9IHg4Nl9tb2RlbChtY19oZWFkZXItPnNpZyk7CiAKLQlpZiAoeDg2ID09IHg4Nl91Y29kZSAmJiB4ODZfbW9kZWwgPT0geDg2X21vZGVsX3Vjb2RlKQorCWlmIChmYW0gPT0gZmFtX3Vjb2RlICYmIG1vZGVsID09IG1vZGVsX3Vjb2RlKQogCQlyZXR1cm4gVUNPREVfT0s7CiAKIAkvKiBMb29rIGZvciBleHQuIGhlYWRlcnM6ICovCiAJaWYgKHRvdGFsX3NpemUgPD0gZGF0YV9zaXplICsgTUNfSEVBREVSX1NJWkUpCiAJCXJldHVybiBVQ09ERV9ORk9VTkQ7CiAKLQlleHRfaGVhZGVyID0gKHN0cnVjdCBleHRlbmRlZF9zaWd0YWJsZSAqKQotCQkgICAgIG1jX2hlYWRlciArIGRhdGFfc2l6ZSArIE1DX0hFQURFUl9TSVpFOworCWV4dF9oZWFkZXIgICA9ICh2b2lkICopIG1jX2hlYWRlciArIGRhdGFfc2l6ZSArIE1DX0hFQURFUl9TSVpFOworCWV4dF9zaWcgICAgICA9ICh2b2lkICopZXh0X2hlYWRlciArIEVYVF9IRUFERVJfU0laRTsKIAlleHRfc2lnY291bnQgPSBleHRfaGVhZGVyLT5jb3VudDsKLQlleHRfc2lnID0gKHZvaWQgKilleHRfaGVhZGVyICsgRVhUX0hFQURFUl9TSVpFOwogCiAJZm9yIChpID0gMDsgaSA8IGV4dF9zaWdjb3VudDsgaSsrKSB7Ci0JCXg4Nl91Y29kZSA9IGdldF94ODZfZmFtaWx5KGV4dF9zaWctPnNpZyk7Ci0JCXg4Nl9tb2RlbF91Y29kZSA9IGdldF94ODZfbW9kZWwoZXh0X3NpZy0+c2lnKTsKKwkJZmFtX3Vjb2RlICAgPSBfX3g4Nl9mYW1pbHkoZXh0X3NpZy0+c2lnKTsKKwkJbW9kZWxfdWNvZGUgPSB4ODZfbW9kZWwoZXh0X3NpZy0+c2lnKTsKIAotCQlpZiAoeDg2ID09IHg4Nl91Y29kZSAmJiB4ODZfbW9kZWwgPT0geDg2X21vZGVsX3Vjb2RlKQorCQlpZiAoZmFtID09IGZhbV91Y29kZSAmJiBtb2RlbCA9PSBtb2RlbF91Y29kZSkKIAkJCXJldHVybiBVQ09ERV9PSzsKIAogCQlleHRfc2lnKys7CiAJfQotCiAJcmV0dXJuIFVDT0RFX05GT1VORDsKIH0KIApAQCAtMjA0LDcgKzE4MCw3IEBACiAJICAgICAgIHVuc2lnbmVkIGludCBtY19zYXZlZF9jb3VudCkKIHsKIAlpbnQgaSwgajsKLQlzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICoqbWNfc2F2ZWRfcDsKKwlzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICoqc2F2ZWRfcHRyOwogCWludCByZXQ7CiAKIAlpZiAoIW1jX3NhdmVkX2NvdW50KQpAQCAtMjEzLDM5ICsxODksNDUgQEAKIAkvKgogCSAqIENvcHkgbmV3IG1pY3JvY29kZSBkYXRhLgogCSAqLwotCW1jX3NhdmVkX3AgPSBrbWFsbG9jKG1jX3NhdmVkX2NvdW50KnNpemVvZihzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICopLAotCQkJICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIW1jX3NhdmVkX3ApCisJc2F2ZWRfcHRyID0ga2NhbGxvYyhtY19zYXZlZF9jb3VudCwgc2l6ZW9mKHN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKiksIEdGUF9LRVJORUwpOworCWlmICghc2F2ZWRfcHRyKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWZvciAoaSA9IDA7IGkgPCBtY19zYXZlZF9jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKm1jID0gbWNfc2F2ZWRfc3JjW2ldOwotCQlzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9pbnRlbCAqbWNfaGVhZGVyID0gJm1jLT5oZHI7Ci0JCXVuc2lnbmVkIGxvbmcgbWNfc2l6ZSA9IGdldF90b3RhbHNpemUobWNfaGVhZGVyKTsKLQkJbWNfc2F2ZWRfcFtpXSA9IGttYWxsb2MobWNfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbWNfc2F2ZWRfcFtpXSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXJyOwotCQl9CisJCXN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2ludGVsICptY19oZHI7CisJCXN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKm1jOworCQl1bnNpZ25lZCBsb25nIHNpemU7CisKIAkJaWYgKCFtY19zYXZlZF9zcmNbaV0pIHsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycjsKIAkJfQotCQltZW1jcHkobWNfc2F2ZWRfcFtpXSwgbWMsIG1jX3NpemUpOworCisJCW1jICAgICA9IG1jX3NhdmVkX3NyY1tpXTsKKwkJbWNfaGRyID0gJm1jLT5oZHI7CisJCXNpemUgICA9IGdldF90b3RhbHNpemUobWNfaGRyKTsKKworCQlzYXZlZF9wdHJbaV0gPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXNhdmVkX3B0cltpXSkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJbWVtY3B5KHNhdmVkX3B0cltpXSwgbWMsIHNpemUpOwogCX0KIAogCS8qCiAJICogUG9pbnQgdG8gbmV3bHkgc2F2ZWQgbWljcm9jb2RlLgogCSAqLwotCW1jX3NhdmVkX2RhdGEtPm1jX3NhdmVkID0gbWNfc2F2ZWRfcDsKKwltY19zYXZlZF9kYXRhLT5tY19zYXZlZCA9IHNhdmVkX3B0cjsKIAltY19zYXZlZF9kYXRhLT5tY19zYXZlZF9jb3VudCA9IG1jX3NhdmVkX2NvdW50OwogCiAJcmV0dXJuIDA7CiAKIGVycjoKIAlmb3IgKGogPSAwOyBqIDw9IGk7IGorKykKLQkJa2ZyZWUobWNfc2F2ZWRfcFtqXSk7Ci0Ja2ZyZWUobWNfc2F2ZWRfcCk7CisJCWtmcmVlKHNhdmVkX3B0cltqXSk7CisJa2ZyZWUoc2F2ZWRfcHRyKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yNTcsNDggKzIzOSw0NSBAQAogICogLSBvciBpZiBpdCBpcyBhIG5ld2x5IGRpc2NvdmVyZWQgbWljcm9jb2RlIHBhdGNoLgogICoKICAqIFRoZSBtaWNyb2NvZGUgcGF0Y2ggc2hvdWxkIGhhdmUgbWF0Y2hpbmcgbW9kZWwgd2l0aCBDUFUuCisgKgorICogUmV0dXJuczogVGhlIHVwZGF0ZWQgbnVtYmVyIEBudW1fc2F2ZWQgb2Ygc2F2ZWQgbWljcm9jb2RlIHBhdGNoZXMuCiAgKi8KLXN0YXRpYyB2b2lkIF9zYXZlX21jKHN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKiptY19zYXZlZCwgdTggKnVjb2RlX3B0ciwKLQkJICAgICB1bnNpZ25lZCBpbnQgKm1jX3NhdmVkX2NvdW50X3ApCitzdGF0aWMgdW5zaWduZWQgaW50IF9zYXZlX21jKHN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKiptY19zYXZlZCwKKwkJCSAgICAgdTggKnVjb2RlX3B0ciwgdW5zaWduZWQgaW50IG51bV9zYXZlZCkKIHsKLQlpbnQgaTsKLQlpbnQgZm91bmQgPSAwOwotCXVuc2lnbmVkIGludCBtY19zYXZlZF9jb3VudCA9ICptY19zYXZlZF9jb3VudF9wOwotCXN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2ludGVsICptY19oZWFkZXI7CisJc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfaW50ZWwgKm1jX2hkciwgKm1jX3NhdmVkX2hkcjsKKwl1bnNpZ25lZCBpbnQgc2lnLCBwZiwgbmV3X3JldjsKKwlpbnQgZm91bmQgPSAwLCBpOwogCi0JbWNfaGVhZGVyID0gKHN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2ludGVsICopdWNvZGVfcHRyOwotCWZvciAoaSA9IDA7IGkgPCBtY19zYXZlZF9jb3VudDsgaSsrKSB7Ci0JCXVuc2lnbmVkIGludCBzaWcsIHBmOwotCQl1bnNpZ25lZCBpbnQgbmV3X3JldjsKLQkJc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfaW50ZWwgKm1jX3NhdmVkX2hlYWRlciA9Ci0JCQkgICAgIChzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9pbnRlbCAqKW1jX3NhdmVkW2ldOwotCQlzaWcgPSBtY19zYXZlZF9oZWFkZXItPnNpZzsKLQkJcGYgPSBtY19zYXZlZF9oZWFkZXItPnBmOwotCQluZXdfcmV2ID0gbWNfaGVhZGVyLT5yZXY7CisJbWNfaGRyID0gKHN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2ludGVsICopdWNvZGVfcHRyOwogCi0JCWlmIChnZXRfbWF0Y2hpbmdfc2lnKHNpZywgcGYsIHVjb2RlX3B0ciwgbmV3X3JldikpIHsKLQkJCWZvdW5kID0gMTsKLQkJCWlmICh1cGRhdGVfbWF0Y2hfcmV2aXNpb24obWNfaGVhZGVyLCBuZXdfcmV2KSkgewotCQkJCS8qCi0JCQkJICogRm91bmQgYW4gb2xkZXIgdWNvZGUgc2F2ZWQgYmVmb3JlLgotCQkJCSAqIFJlcGxhY2UgdGhlIG9sZGVyIG9uZSB3aXRoIHRoaXMgbmV3ZXIKLQkJCQkgKiBvbmUuCi0JCQkJICovCi0JCQkJbWNfc2F2ZWRbaV0gPQotCQkJCQkoc3RydWN0IG1pY3JvY29kZV9pbnRlbCAqKXVjb2RlX3B0cjsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQlpZiAoaSA+PSBtY19zYXZlZF9jb3VudCAmJiAhZm91bmQpCisJZm9yIChpID0gMDsgaSA8IG51bV9zYXZlZDsgaSsrKSB7CisJCW1jX3NhdmVkX2hkciA9IChzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9pbnRlbCAqKW1jX3NhdmVkW2ldOworCQlzaWcJICAgICA9IG1jX3NhdmVkX2hkci0+c2lnOworCQlwZgkgICAgID0gbWNfc2F2ZWRfaGRyLT5wZjsKKwkJbmV3X3JldgkgICAgID0gbWNfaGRyLT5yZXY7CisKKwkJaWYgKCFnZXRfbWF0Y2hpbmdfc2lnKHNpZywgcGYsIG5ld19yZXYsIHVjb2RlX3B0cikpCisJCQljb250aW51ZTsKKworCQlmb3VuZCA9IDE7CisKKwkJaWYgKCFyZXZpc2lvbl9pc19uZXdlcihtY19oZHIsIG5ld19yZXYpKQorCQkJY29udGludWU7CisKIAkJLyoKLQkJICogVGhpcyB1Y29kZSBpcyBmaXJzdCB0aW1lIGRpc2NvdmVyZWQgaW4gdWNvZGUgZmlsZS4KLQkJICogU2F2ZSBpdCB0byBtZW1vcnkuCisJCSAqIEZvdW5kIGFuIG9sZGVyIHVjb2RlIHNhdmVkIGVhcmxpZXIuIFJlcGxhY2UgaXQgd2l0aAorCQkgKiB0aGlzIG5ld2VyIG9uZS4KIAkJICovCi0JCW1jX3NhdmVkW21jX3NhdmVkX2NvdW50KytdID0KLQkJCQkgKHN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKil1Y29kZV9wdHI7CisJCW1jX3NhdmVkW2ldID0gKHN0cnVjdCBtaWNyb2NvZGVfaW50ZWwgKil1Y29kZV9wdHI7CisJCWJyZWFrOworCX0KIAotCSptY19zYXZlZF9jb3VudF9wID0gbWNfc2F2ZWRfY291bnQ7CisJLyogTmV3bHkgZGV0ZWN0ZWQgbWljcm9jb2RlLCBzYXZlIGl0IHRvIG1lbW9yeS4gKi8KKwlpZiAoaSA+PSBudW1fc2F2ZWQgJiYgIWZvdW5kKQorCQltY19zYXZlZFtudW1fc2F2ZWQrK10gPSAoc3RydWN0IG1pY3JvY29kZV9pbnRlbCAqKXVjb2RlX3B0cjsKKworCXJldHVybiBudW1fc2F2ZWQ7CiB9CiAKIC8qCkBAIC0zNDYsNyArMzI1LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJX3NhdmVfbWMobWNfc2F2ZWRfdG1wLCB1Y29kZV9wdHIsICZtY19zYXZlZF9jb3VudCk7CisJCW1jX3NhdmVkX2NvdW50ID0gX3NhdmVfbWMobWNfc2F2ZWRfdG1wLCB1Y29kZV9wdHIsIG1jX3NhdmVkX2NvdW50KTsKIAogCQl1Y29kZV9wdHIgKz0gbWNfc2l6ZTsKIAl9CkBAIC0zNzIsNyArMzUxLDcgQEAKIHN0YXRpYyBpbnQgY29sbGVjdF9jcHVfaW5mb19lYXJseShzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSkKIHsKIAl1bnNpZ25lZCBpbnQgdmFsWzJdOwotCXU4IHg4NiwgeDg2X21vZGVsOworCXVuc2lnbmVkIGludCBmYW1pbHksIG1vZGVsOwogCXN0cnVjdCBjcHVfc2lnbmF0dXJlIGNzaWc7CiAJdW5zaWduZWQgaW50IGVheCwgZWJ4LCBlY3gsIGVkeDsKIApAQCAtMzg3LDEwICszNjYsMTAgQEAKIAluYXRpdmVfY3B1aWQoJmVheCwgJmVieCwgJmVjeCwgJmVkeCk7CiAJY3NpZy5zaWcgPSBlYXg7CiAKLQl4ODYgPSBnZXRfeDg2X2ZhbWlseShjc2lnLnNpZyk7Ci0JeDg2X21vZGVsID0gZ2V0X3g4Nl9tb2RlbChjc2lnLnNpZyk7CisJZmFtaWx5ID0gX194ODZfZmFtaWx5KGNzaWcuc2lnKTsKKwltb2RlbCAgPSB4ODZfbW9kZWwoY3NpZy5zaWcpOwogCi0JaWYgKCh4ODZfbW9kZWwgPj0gNSkgfHwgKHg4NiA+IDYpKSB7CisJaWYgKChtb2RlbCA+PSA1KSB8fCAoZmFtaWx5ID4gNikpIHsKIAkJLyogZ2V0IHByb2Nlc3NvciBmbGFncyBmcm9tIE1TUiAweDE3ICovCiAJCW5hdGl2ZV9yZG1zcihNU1JfSUEzMl9QTEFURk9STV9JRCwgdmFsWzBdLCB2YWxbMV0pOwogCQljc2lnLnBmID0gMSA8PCAoKHZhbFsxXSA+PiAxOCkgJiA3KTsKQEAgLTQyOSw4ICs0MDgsNyBAQAogCXNpZyA9IHVjaS5jcHVfc2lnLnNpZzsKIAlwZiA9IHVjaS5jcHVfc2lnLnBmOwogCXJldiA9IHVjaS5jcHVfc2lnLnJldjsKLQlwcl9kZWJ1ZygiQ1BVJWQ6IHNpZz0weCV4LCBwZj0weCV4LCByZXY9MHgleFxuIiwKLQkJIHNtcF9wcm9jZXNzb3JfaWQoKSwgc2lnLCBwZiwgcmV2KTsKKwlwcl9kZWJ1ZygiQ1BVOiBzaWc9MHgleCwgcGY9MHgleCwgcmV2PTB4JXhcbiIsIHNpZywgcGYsIHJldik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbWNfc2F2ZWRfZGF0YS5tY19zYXZlZF9jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2ludGVsICptY19zYXZlZF9oZWFkZXI7CkBAIC00NTcsOCArNDM1LDcgQEAKIAkJaWYgKHRvdGFsX3NpemUgPD0gZGF0YV9zaXplICsgTUNfSEVBREVSX1NJWkUpCiAJCQljb250aW51ZTsKIAotCQlleHRfaGVhZGVyID0gKHN0cnVjdCBleHRlbmRlZF9zaWd0YWJsZSAqKQotCQkJICAgICBtY19zYXZlZF9oZWFkZXIgKyBkYXRhX3NpemUgKyBNQ19IRUFERVJfU0laRTsKKwkJZXh0X2hlYWRlciA9ICh2b2lkICopIG1jX3NhdmVkX2hlYWRlciArIGRhdGFfc2l6ZSArIE1DX0hFQURFUl9TSVpFOwogCQlleHRfc2lnY291bnQgPSBleHRfaGVhZGVyLT5jb3VudDsKIAkJZXh0X3NpZyA9ICh2b2lkICopZXh0X2hlYWRlciArIEVYVF9IRUFERVJfU0laRTsKIApAQCAtNTE1LDggKzQ5Miw3IEBACiAJICogU2F2ZSB0aGUgbWljcm9jb2RlIHBhdGNoIG1jIGluIG1jX3NhdmVfdG1wIHN0cnVjdHVyZSBpZiBpdCdzIGEgbmV3ZXIKIAkgKiB2ZXJzaW9uLgogCSAqLwotCi0JX3NhdmVfbWMobWNfc2F2ZWRfdG1wLCBtYywgJm1jX3NhdmVkX2NvdW50KTsKKwltY19zYXZlZF9jb3VudCA9IF9zYXZlX21jKG1jX3NhdmVkX3RtcCwgbWMsIG1jX3NhdmVkX2NvdW50KTsKIAogCS8qCiAJICogU2F2ZSB0aGUgbWNfc2F2ZV90bXAgaW4gZ2xvYmFsIG1jX3NhdmVkX2RhdGEuCkBAIC01NDgsMTIgKzUyNCwxMCBAQAogCiBzdGF0aWMgX19pbml0ZGF0YSBjaGFyIHVjb2RlX25hbWVbXSA9ICJrZXJuZWwveDg2L21pY3JvY29kZS9HZW51aW5lSW50ZWwuYmluIjsKIHN0YXRpYyBfX2luaXQgZW51bSB1Y29kZV9zdGF0ZQotc2Nhbl9taWNyb2NvZGUodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCi0JCXN0cnVjdCBtY19zYXZlZF9kYXRhICptY19zYXZlZF9kYXRhLAotCQl1bnNpZ25lZCBsb25nICptY19zYXZlZF9pbl9pbml0cmQsCi0JCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpKQorc2Nhbl9taWNyb2NvZGUoc3RydWN0IG1jX3NhdmVkX2RhdGEgKm1jX3NhdmVkX2RhdGEsIHVuc2lnbmVkIGxvbmcgKmluaXRyZCwKKwkgICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplLAorCSAgICAgICBzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSkKIHsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKIAlzdHJ1Y3QgY3Bpb19kYXRhIGNkOwogCWxvbmcgb2Zmc2V0ID0gMDsKICNpZmRlZiBDT05GSUdfWDg2XzMyCkBAIC01NjksMTAgKzU0Myw4IEBACiAJaWYgKCFjZC5kYXRhKQogCQlyZXR1cm4gVUNPREVfRVJST1I7CiAKLQogCXJldHVybiBnZXRfbWF0Y2hpbmdfbW9kZWxfbWljcm9jb2RlKDAsIHN0YXJ0LCBjZC5kYXRhLCBjZC5zaXplLAotCQkJCQkgICAgbWNfc2F2ZWRfZGF0YSwgbWNfc2F2ZWRfaW5faW5pdHJkLAotCQkJCQkgICAgdWNpKTsKKwkJCQkJICAgIG1jX3NhdmVkX2RhdGEsIGluaXRyZCwgdWNpKTsKIH0KIAogLyoKQEAgLTcwNCw3ICs2NzYsNyBAQAogCWlmIChjb3VudCA9PSAwKQogCQlyZXR1cm4gcmV0OwogCi0JbWljcm9jb2RlX3BvaW50ZXIobWNfc2F2ZWQsIG1jX3NhdmVkX2luX2luaXRyZCwgaW5pdHJkX3N0YXJ0LCBjb3VudCk7CisJY29weV9pbml0cmRfcHRycyhtY19zYXZlZCwgbWNfc2F2ZWRfaW5faW5pdHJkLCBpbml0cmRfc3RhcnQsIGNvdW50KTsKIAlyZXQgPSBzYXZlX21pY3JvY29kZSgmbWNfc2F2ZWRfZGF0YSwgbWNfc2F2ZWQsIGNvdW50KTsKIAlpZiAocmV0KQogCQlwcl9lcnIoIkNhbm5vdCBzYXZlIG1pY3JvY29kZSBwYXRjaGVzIGZyb20gaW5pdHJkLlxuIik7CkBAIC03MTYsNTIgKzY4OCw0NCBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQKIF9sb2FkX3Vjb2RlX2ludGVsX2JzcChzdHJ1Y3QgbWNfc2F2ZWRfZGF0YSAqbWNfc2F2ZWRfZGF0YSwKLQkJICAgICAgdW5zaWduZWQgbG9uZyAqbWNfc2F2ZWRfaW5faW5pdHJkLAotCQkgICAgICB1bnNpZ25lZCBsb25nIGluaXRyZF9zdGFydF9lYXJseSwKLQkJICAgICAgdW5zaWduZWQgbG9uZyBpbml0cmRfZW5kX2Vhcmx5LAotCQkgICAgICBzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSkKKwkJICAgICAgdW5zaWduZWQgbG9uZyAqaW5pdHJkLAorCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpCiB7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvIHVjaTsKIAllbnVtIHVjb2RlX3N0YXRlIHJldDsKIAotCWNvbGxlY3RfY3B1X2luZm9fZWFybHkodWNpKTsKLQlzY2FuX21pY3JvY29kZShpbml0cmRfc3RhcnRfZWFybHksIGluaXRyZF9lbmRfZWFybHksIG1jX3NhdmVkX2RhdGEsCi0JCSAgICAgICBtY19zYXZlZF9pbl9pbml0cmQsIHVjaSk7CisJY29sbGVjdF9jcHVfaW5mb19lYXJseSgmdWNpKTsKIAotCXJldCA9IGxvYWRfbWljcm9jb2RlKG1jX3NhdmVkX2RhdGEsIG1jX3NhdmVkX2luX2luaXRyZCwKLQkJCSAgICAgaW5pdHJkX3N0YXJ0X2Vhcmx5LCB1Y2kpOworCXJldCA9IHNjYW5fbWljcm9jb2RlKG1jX3NhdmVkX2RhdGEsIGluaXRyZCwgc3RhcnQsIHNpemUsICZ1Y2kpOworCWlmIChyZXQgIT0gVUNPREVfT0spCisJCXJldHVybjsKIAotCWlmIChyZXQgPT0gVUNPREVfT0spCi0JCWFwcGx5X21pY3JvY29kZV9lYXJseSh1Y2ksIHRydWUpOworCXJldCA9IGxvYWRfbWljcm9jb2RlKG1jX3NhdmVkX2RhdGEsIGluaXRyZCwgc3RhcnQsICZ1Y2kpOworCWlmIChyZXQgIT0gVUNPREVfT0spCisJCXJldHVybjsKKworCWFwcGx5X21pY3JvY29kZV9lYXJseSgmdWNpLCB0cnVlKTsKIH0KIAotdm9pZCBfX2luaXQKLWxvYWRfdWNvZGVfaW50ZWxfYnNwKHZvaWQpCit2b2lkIF9faW5pdCBsb2FkX3Vjb2RlX2ludGVsX2JzcCh2b2lkKQogewotCXU2NCByYW1kaXNrX2ltYWdlLCByYW1kaXNrX3NpemU7Ci0JdW5zaWduZWQgbG9uZyBpbml0cmRfc3RhcnRfZWFybHksIGluaXRyZF9lbmRfZWFybHk7Ci0Jc3RydWN0IHVjb2RlX2NwdV9pbmZvIHVjaTsKKwl1NjQgc3RhcnQsIHNpemU7CiAjaWZkZWYgQ09ORklHX1g4Nl8zMgotCXN0cnVjdCBib290X3BhcmFtcyAqYm9vdF9wYXJhbXNfcDsKKwlzdHJ1Y3QgYm9vdF9wYXJhbXMgKnA7CiAKLQlib290X3BhcmFtc19wID0gKHN0cnVjdCBib290X3BhcmFtcyAqKV9fcGFfbm9kZWJ1ZygmYm9vdF9wYXJhbXMpOwotCXJhbWRpc2tfaW1hZ2UgPSBib290X3BhcmFtc19wLT5oZHIucmFtZGlza19pbWFnZTsKLQlyYW1kaXNrX3NpemUgID0gYm9vdF9wYXJhbXNfcC0+aGRyLnJhbWRpc2tfc2l6ZTsKLQlpbml0cmRfc3RhcnRfZWFybHkgPSByYW1kaXNrX2ltYWdlOwotCWluaXRyZF9lbmRfZWFybHkgPSBpbml0cmRfc3RhcnRfZWFybHkgKyByYW1kaXNrX3NpemU7CisJcAk9IChzdHJ1Y3QgYm9vdF9wYXJhbXMgKilfX3BhX25vZGVidWcoJmJvb3RfcGFyYW1zKTsKKwlzdGFydAk9IHAtPmhkci5yYW1kaXNrX2ltYWdlOworCXNpemUJPSBwLT5oZHIucmFtZGlza19zaXplOwogCiAJX2xvYWRfdWNvZGVfaW50ZWxfYnNwKAotCQkoc3RydWN0IG1jX3NhdmVkX2RhdGEgKilfX3BhX25vZGVidWcoJm1jX3NhdmVkX2RhdGEpLAotCQkodW5zaWduZWQgbG9uZyAqKV9fcGFfbm9kZWJ1ZygmbWNfc2F2ZWRfaW5faW5pdHJkKSwKLQkJaW5pdHJkX3N0YXJ0X2Vhcmx5LCBpbml0cmRfZW5kX2Vhcmx5LCAmdWNpKTsKKwkJCShzdHJ1Y3QgbWNfc2F2ZWRfZGF0YSAqKV9fcGFfbm9kZWJ1ZygmbWNfc2F2ZWRfZGF0YSksCisJCQkodW5zaWduZWQgbG9uZyAqKV9fcGFfbm9kZWJ1ZygmbWNfc2F2ZWRfaW5faW5pdHJkKSwKKwkJCXN0YXJ0LCBzaXplKTsKICNlbHNlCi0JcmFtZGlza19pbWFnZSA9IGJvb3RfcGFyYW1zLmhkci5yYW1kaXNrX2ltYWdlOwotCXJhbWRpc2tfc2l6ZSAgPSBib290X3BhcmFtcy5oZHIucmFtZGlza19zaXplOwotCWluaXRyZF9zdGFydF9lYXJseSA9IHJhbWRpc2tfaW1hZ2UgKyBQQUdFX09GRlNFVDsKLQlpbml0cmRfZW5kX2Vhcmx5ID0gaW5pdHJkX3N0YXJ0X2Vhcmx5ICsgcmFtZGlza19zaXplOworCXN0YXJ0CT0gYm9vdF9wYXJhbXMuaGRyLnJhbWRpc2tfaW1hZ2UgKyBQQUdFX09GRlNFVDsKKwlzaXplCT0gYm9vdF9wYXJhbXMuaGRyLnJhbWRpc2tfc2l6ZTsKIAotCV9sb2FkX3Vjb2RlX2ludGVsX2JzcCgmbWNfc2F2ZWRfZGF0YSwgbWNfc2F2ZWRfaW5faW5pdHJkLAotCQkJICAgICAgaW5pdHJkX3N0YXJ0X2Vhcmx5LCBpbml0cmRfZW5kX2Vhcmx5LAotCQkJICAgICAgJnVjaSk7CisJX2xvYWRfdWNvZGVfaW50ZWxfYnNwKCZtY19zYXZlZF9kYXRhLCBtY19zYXZlZF9pbl9pbml0cmQsIHN0YXJ0LCBzaXplKTsKICNlbmRpZgogfQogCkBAIC03NzEsNiArNzM1LDcgQEAKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gdWNpOwogCXVuc2lnbmVkIGxvbmcgKm1jX3NhdmVkX2luX2luaXRyZF9wOwogCXVuc2lnbmVkIGxvbmcgaW5pdHJkX3N0YXJ0X2FkZHI7CisJZW51bSB1Y29kZV9zdGF0ZSByZXQ7CiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCXVuc2lnbmVkIGxvbmcgKmluaXRyZF9zdGFydF9wOwogCkBAIC03OTMsOCArNzU4LDEyIEBACiAJCXJldHVybjsKIAogCWNvbGxlY3RfY3B1X2luZm9fZWFybHkoJnVjaSk7Ci0JbG9hZF9taWNyb2NvZGUobWNfc2F2ZWRfZGF0YV9wLCBtY19zYXZlZF9pbl9pbml0cmRfcCwKLQkJICAgICAgIGluaXRyZF9zdGFydF9hZGRyLCAmdWNpKTsKKwlyZXQgPSBsb2FkX21pY3JvY29kZShtY19zYXZlZF9kYXRhX3AsIG1jX3NhdmVkX2luX2luaXRyZF9wLAorCQkJICAgICBpbml0cmRfc3RhcnRfYWRkciwgJnVjaSk7CisKKwlpZiAocmV0ICE9IFVDT0RFX09LKQorCQlyZXR1cm47CisKIAlhcHBseV9taWNyb2NvZGVfZWFybHkoJnVjaSwgdHJ1ZSk7CiB9CiAKQEAgLTgwOCw4ICs3NzcsOCBAQAogCiAJY29sbGVjdF9jcHVfaW5mb19lYXJseSgmdWNpKTsKIAotCXJldCA9IGdlbmVyaWNfbG9hZF9taWNyb2NvZGVfZWFybHkobWNfc2F2ZWRfZGF0YS5tY19zYXZlZCwKLQkJCQkJICAgbWNfc2F2ZWRfZGF0YS5tY19zYXZlZF9jb3VudCwgJnVjaSk7CisJcmV0ID0gbG9hZF9taWNyb2NvZGVfZWFybHkobWNfc2F2ZWRfZGF0YS5tY19zYXZlZCwKKwkJCQkgICBtY19zYXZlZF9kYXRhLm1jX3NhdmVkX2NvdW50LCAmdWNpKTsKIAlpZiAocmV0ICE9IFVDT0RFX09LKQogCQlyZXR1cm47CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWljcm9jb2RlL2ludGVsX2xpYi5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvaW50ZWxfbGliLmMKaW5kZXggY2U2OTMyMC4uY2Q0N2E1MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvaW50ZWxfbGliLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9taWNyb2NvZGUvaW50ZWxfbGliLmMKQEAgLTM4LDEyICszOCw2IEBACiAJcmV0dXJuICghc2lnbWF0Y2goc2lnLCBjc2lnLCBwZiwgY3BmKSkgPyAwIDogMTsKIH0KIAotaW50Ci11cGRhdGVfbWF0Y2hfcmV2aXNpb24oc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfaW50ZWwgKm1jX2hlYWRlciwgaW50IHJldikKLXsKLQlyZXR1cm4gKG1jX2hlYWRlci0+cmV2IDw9IHJldikgPyAwIDogMTsKLX0KLQogaW50IG1pY3JvY29kZV9zYW5pdHlfY2hlY2sodm9pZCAqbWMsIGludCBwcmludF9lcnIpCiB7CiAJdW5zaWduZWQgbG9uZyB0b3RhbF9zaXplLCBkYXRhX3NpemUsIGV4dF90YWJsZV9zaXplOwpAQCAtMTI4LDEwICsxMjIsOSBAQAogRVhQT1JUX1NZTUJPTF9HUEwobWljcm9jb2RlX3Nhbml0eV9jaGVjayk7CiAKIC8qCi0gKiByZXR1cm4gMCAtIG5vIHVwZGF0ZSBmb3VuZAotICogcmV0dXJuIDEgLSBmb3VuZCB1cGRhdGUKKyAqIFJldHVybnMgMSBpZiB1cGRhdGUgaGFzIGJlZW4gZm91bmQsIDAgb3RoZXJ3aXNlLgogICovCi1pbnQgZ2V0X21hdGNoaW5nX3NpZyh1bnNpZ25lZCBpbnQgY3NpZywgaW50IGNwZiwgdm9pZCAqbWMsIGludCByZXYpCitpbnQgZ2V0X21hdGNoaW5nX3NpZyh1bnNpZ25lZCBpbnQgY3NpZywgaW50IGNwZiwgaW50IHJldiwgdm9pZCAqbWMpCiB7CiAJc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfaW50ZWwgKm1jX2hlYWRlciA9IG1jOwogCXN0cnVjdCBleHRlbmRlZF9zaWd0YWJsZSAqZXh0X2hlYWRlcjsKQEAgLTE1OSwxNiArMTUyLDE1IEBACiB9CiAKIC8qCi0gKiByZXR1cm4gMCAtIG5vIHVwZGF0ZSBmb3VuZAotICogcmV0dXJuIDEgLSBmb3VuZCB1cGRhdGUKKyAqIFJldHVybnMgMSBpZiB1cGRhdGUgaGFzIGJlZW4gZm91bmQsIDAgb3RoZXJ3aXNlLgogICovCi1pbnQgZ2V0X21hdGNoaW5nX21pY3JvY29kZSh1bnNpZ25lZCBpbnQgY3NpZywgaW50IGNwZiwgdm9pZCAqbWMsIGludCByZXYpCitpbnQgZ2V0X21hdGNoaW5nX21pY3JvY29kZSh1bnNpZ25lZCBpbnQgY3NpZywgaW50IGNwZiwgaW50IHJldiwgdm9pZCAqbWMpCiB7Ci0Jc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfaW50ZWwgKm1jX2hlYWRlciA9IG1jOworCXN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2ludGVsICptY19oZHIgPSBtYzsKIAotCWlmICghdXBkYXRlX21hdGNoX3JldmlzaW9uKG1jX2hlYWRlciwgcmV2KSkKKwlpZiAoIXJldmlzaW9uX2lzX25ld2VyKG1jX2hkciwgcmV2KSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gZ2V0X21hdGNoaW5nX3NpZyhjc2lnLCBjcGYsIG1jLCByZXYpOworCXJldHVybiBnZXRfbWF0Y2hpbmdfc2lnKGNzaWcsIGNwZiwgcmV2LCBtYyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChnZXRfbWF0Y2hpbmdfbWljcm9jb2RlKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWtjYXBmbGFncy5zaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWtjYXBmbGFncy5zaAppbmRleCAzNmQ5OWEzLi4zZjIwNzEwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21rY2FwZmxhZ3Muc2gKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9ta2NhcGZsYWdzLnNoCkBAIC02LDcgKzYsNyBAQAogSU49JDEKIE9VVD0kMgogCi1mdW5jdGlvbiBkdW1wX2FycmF5KCkKK2R1bXBfYXJyYXkoKQogewogCUFSUkFZPSQxCiAJU0laRT0kMgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2lmLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvaWYuYwppbmRleCBhMDQxZTA5Li5kNzZmMTNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvaWYuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvaWYuYwpAQCAtNDA0LDExICs0MDQsMTAgQEAKIHN0YXRpYyBpbnQgbXRycl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogewogCWNoYXIgZmFjdG9yOwotCWludCBpLCBtYXgsIGxlbjsKKwlpbnQgaSwgbWF4OwogCW10cnJfdHlwZSB0eXBlOwogCXVuc2lnbmVkIGxvbmcgYmFzZSwgc2l6ZTsKIAotCWxlbiA9IDA7CiAJbWF4ID0gbnVtX3Zhcl9yYW5nZXM7CiAJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CiAJCW10cnJfaWYtPmdldChpLCAmYmFzZSwgJnNpemUsICZ0eXBlKTsKQEAgLTQyNSwxMSArNDI0LDEwIEBACiAJCQlzaXplID4+PSAyMCAtIFBBR0VfU0hJRlQ7CiAJCX0KIAkJLyogQmFzZSBjYW4gYmUgPiAzMmJpdCAqLwotCQlsZW4gKz0gc2VxX3ByaW50ZihzZXEsICJyZWclMDJpOiBiYXNlPTB4JTA2bHgwMDAgIgotCQkJIiglNWx1TUIpLCBzaXplPSU1bHUlY0IsIGNvdW50PSVkOiAlc1xuIiwKLQkJCWksIGJhc2UsIGJhc2UgPj4gKDIwIC0gUEFHRV9TSElGVCksIHNpemUsCi0JCQlmYWN0b3IsIG10cnJfdXNhZ2VfdGFibGVbaV0sCi0JCQltdHJyX2F0dHJpYl90b19zdHIodHlwZSkpOworCQlzZXFfcHJpbnRmKHNlcSwgInJlZyUwMmk6IGJhc2U9MHglMDZseDAwMCAoJTVsdU1CKSwgc2l6ZT0lNWx1JWNCLCBjb3VudD0lZDogJXNcbiIsCisJCQkgICBpLCBiYXNlLCBiYXNlID4+ICgyMCAtIFBBR0VfU0hJRlQpLAorCQkJICAgc2l6ZSwgZmFjdG9yLAorCQkJICAgbXRycl91c2FnZV90YWJsZVtpXSwgbXRycl9hdHRyaWJfdG9fc3RyKHR5cGUpKTsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCmluZGV4IGI3MWE3ZjguLjg3ODQ4ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCkBAIC0yNjMsNiArMjYzLDE0IEBACiAJfQogfQogCit2b2lkIGh3X3BlcmZfbGJyX2V2ZW50X2Rlc3Ryb3koc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCWh3X3BlcmZfZXZlbnRfZGVzdHJveShldmVudCk7CisKKwkvKiB1bmRvIHRoZSBsYnIvYnRzIGV2ZW50IGFjY291bnRpbmcgKi8KKwl4ODZfZGVsX2V4Y2x1c2l2ZSh4ODZfbGJyX2V4Y2x1c2l2ZV9sYnIpOworfQorCiBzdGF0aWMgaW5saW5lIGludCB4ODZfcG11X2luaXRpYWxpemVkKHZvaWQpCiB7CiAJcmV0dXJuIHg4Nl9wbXUuaGFuZGxlX2lycSAhPSBOVUxMOwpAQCAtMzAyLDYgKzMxMCwzNSBAQAogCXJldHVybiB4ODZfcG11X2V4dHJhX3JlZ3ModmFsLCBldmVudCk7CiB9CiAKKy8qCisgKiBDaGVjayBpZiB3ZSBjYW4gY3JlYXRlIGV2ZW50IG9mIGEgY2VydGFpbiB0eXBlICh0aGF0IG5vIGNvbmZsaWN0aW5nIGV2ZW50cworICogYXJlIHByZXNlbnQpLgorICovCitpbnQgeDg2X2FkZF9leGNsdXNpdmUodW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJldCA9IC1FQlVTWSwgaTsKKworCWlmIChhdG9taWNfaW5jX25vdF96ZXJvKCZ4ODZfcG11Lmxicl9leGNsdXNpdmVbd2hhdF0pKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJnBtY19yZXNlcnZlX211dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh4ODZfcG11Lmxicl9leGNsdXNpdmUpOyBpKyspCisJCWlmIChpICE9IHdoYXQgJiYgYXRvbWljX3JlYWQoJng4Nl9wbXUubGJyX2V4Y2x1c2l2ZVtpXSkpCisJCQlnb3RvIG91dDsKKworCWF0b21pY19pbmMoJng4Nl9wbXUubGJyX2V4Y2x1c2l2ZVt3aGF0XSk7CisJcmV0ID0gMDsKKworb3V0OgorCW11dGV4X3VubG9jaygmcG1jX3Jlc2VydmVfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgeDg2X2RlbF9leGNsdXNpdmUodW5zaWduZWQgaW50IHdoYXQpCit7CisJYXRvbWljX2RlYygmeDg2X3BtdS5sYnJfZXhjbHVzaXZlW3doYXRdKTsKK30KKwogaW50IHg4Nl9zZXR1cF9wZXJmY3RyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyID0gJmV2ZW50LT5hdHRyOwpAQCAtMzQ2LDYgKzM4MywxMiBAQAogCQkvKiBCVFMgaXMgY3VycmVudGx5IG9ubHkgYWxsb3dlZCBmb3IgdXNlci1tb2RlLiAqLwogCQlpZiAoIWF0dHItPmV4Y2x1ZGVfa2VybmVsKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCS8qIGRpc2FsbG93IGJ0cyBpZiBjb25mbGljdGluZyBldmVudHMgYXJlIHByZXNlbnQgKi8KKwkJaWYgKHg4Nl9hZGRfZXhjbHVzaXZlKHg4Nl9sYnJfZXhjbHVzaXZlX2xicikpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWV2ZW50LT5kZXN0cm95ID0gaHdfcGVyZl9sYnJfZXZlbnRfZGVzdHJveTsKIAl9CiAKIAlod2MtPmNvbmZpZyB8PSBjb25maWc7CkBAIC0zOTksMzkgKzQ0Miw0MSBAQAogCiAJCWlmIChldmVudC0+YXR0ci5wcmVjaXNlX2lwID4gcHJlY2lzZSkKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQkJLyoKLQkJICogY2hlY2sgdGhhdCBQRUJTIExCUiBjb3JyZWN0aW9uIGRvZXMgbm90IGNvbmZsaWN0IHdpdGgKLQkJICogd2hhdGV2ZXIgdGhlIHVzZXIgaXMgYXNraW5nIHdpdGggYXR0ci0+YnJhbmNoX3NhbXBsZV90eXBlCi0JCSAqLwotCQlpZiAoZXZlbnQtPmF0dHIucHJlY2lzZV9pcCA+IDEgJiYKLQkJICAgIHg4Nl9wbXUuaW50ZWxfY2FwLnBlYnNfZm9ybWF0IDwgMikgewotCQkJdTY0ICpicl90eXBlID0gJmV2ZW50LT5hdHRyLmJyYW5jaF9zYW1wbGVfdHlwZTsKKwl9CisJLyoKKwkgKiBjaGVjayB0aGF0IFBFQlMgTEJSIGNvcnJlY3Rpb24gZG9lcyBub3QgY29uZmxpY3Qgd2l0aAorCSAqIHdoYXRldmVyIHRoZSB1c2VyIGlzIGFza2luZyB3aXRoIGF0dHItPmJyYW5jaF9zYW1wbGVfdHlwZQorCSAqLworCWlmIChldmVudC0+YXR0ci5wcmVjaXNlX2lwID4gMSAmJiB4ODZfcG11LmludGVsX2NhcC5wZWJzX2Zvcm1hdCA8IDIpIHsKKwkJdTY0ICpicl90eXBlID0gJmV2ZW50LT5hdHRyLmJyYW5jaF9zYW1wbGVfdHlwZTsKIAotCQkJaWYgKGhhc19icmFuY2hfc3RhY2soZXZlbnQpKSB7Ci0JCQkJaWYgKCFwcmVjaXNlX2JyX2NvbXBhdChldmVudCkpCi0JCQkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJaWYgKGhhc19icmFuY2hfc3RhY2soZXZlbnQpKSB7CisJCQlpZiAoIXByZWNpc2VfYnJfY29tcGF0KGV2ZW50KSkKKwkJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQkJCQkvKiBicmFuY2hfc2FtcGxlX3R5cGUgaXMgY29tcGF0aWJsZSAqLworCQkJLyogYnJhbmNoX3NhbXBsZV90eXBlIGlzIGNvbXBhdGlibGUgKi8KIAotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIHVzZXIgZGlkIG5vdCBzcGVjaWZ5ICBicmFuY2hfc2FtcGxlX3R5cGUKLQkJCQkgKgotCQkJCSAqIEZvciBQRUJTIGZpeHVwcywgd2UgY2FwdHVyZSBhbGwKLQkJCQkgKiB0aGUgYnJhbmNoZXMgYXQgdGhlIHByaXYgbGV2ZWwgb2YgdGhlCi0JCQkJICogZXZlbnQuCi0JCQkJICovCi0JCQkJKmJyX3R5cGUgPSBQRVJGX1NBTVBMRV9CUkFOQ0hfQU5ZOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIHVzZXIgZGlkIG5vdCBzcGVjaWZ5ICBicmFuY2hfc2FtcGxlX3R5cGUKKwkJCSAqCisJCQkgKiBGb3IgUEVCUyBmaXh1cHMsIHdlIGNhcHR1cmUgYWxsCisJCQkgKiB0aGUgYnJhbmNoZXMgYXQgdGhlIHByaXYgbGV2ZWwgb2YgdGhlCisJCQkgKiBldmVudC4KKwkJCSAqLworCQkJKmJyX3R5cGUgPSBQRVJGX1NBTVBMRV9CUkFOQ0hfQU5ZOwogCi0JCQkJaWYgKCFldmVudC0+YXR0ci5leGNsdWRlX3VzZXIpCi0JCQkJCSpicl90eXBlIHw9IFBFUkZfU0FNUExFX0JSQU5DSF9VU0VSOworCQkJaWYgKCFldmVudC0+YXR0ci5leGNsdWRlX3VzZXIpCisJCQkJKmJyX3R5cGUgfD0gUEVSRl9TQU1QTEVfQlJBTkNIX1VTRVI7CiAKLQkJCQlpZiAoIWV2ZW50LT5hdHRyLmV4Y2x1ZGVfa2VybmVsKQotCQkJCQkqYnJfdHlwZSB8PSBQRVJGX1NBTVBMRV9CUkFOQ0hfS0VSTkVMOwotCQkJfQorCQkJaWYgKCFldmVudC0+YXR0ci5leGNsdWRlX2tlcm5lbCkKKwkJCQkqYnJfdHlwZSB8PSBQRVJGX1NBTVBMRV9CUkFOQ0hfS0VSTkVMOwogCQl9CiAJfQogCisJaWYgKGV2ZW50LT5hdHRyLmJyYW5jaF9zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0JSQU5DSF9DQUxMX1NUQUNLKQorCQlldmVudC0+YXR0YWNoX3N0YXRlIHw9IFBFUkZfQVRUQUNIX1RBU0tfREFUQTsKKwogCS8qCiAJICogR2VuZXJhdGUgUE1DIElSUXM6CiAJICogKGtlZXAgJ2VuYWJsZWQnIGJpdCBjbGVhciBmb3Igbm93KQpAQCAtNDQ5LDYgKzQ5NCwxMiBAQAogCWlmIChldmVudC0+YXR0ci50eXBlID09IFBFUkZfVFlQRV9SQVcpCiAJCWV2ZW50LT5ody5jb25maWcgfD0gZXZlbnQtPmF0dHIuY29uZmlnICYgWDg2X1JBV19FVkVOVF9NQVNLOwogCisJaWYgKGV2ZW50LT5hdHRyLnNhbXBsZV9wZXJpb2QgJiYgeDg2X3BtdS5saW1pdF9wZXJpb2QpIHsKKwkJaWYgKHg4Nl9wbXUubGltaXRfcGVyaW9kKGV2ZW50LCBldmVudC0+YXR0ci5zYW1wbGVfcGVyaW9kKSA+CisJCQkJZXZlbnQtPmF0dHIuc2FtcGxlX3BlcmlvZCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXJldHVybiB4ODZfc2V0dXBfcGVyZmN0cihldmVudCk7CiB9CiAKQEAgLTcyOCwxNCArNzc5LDE3IEBACiAJc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKmM7CiAJdW5zaWduZWQgbG9uZyB1c2VkX21hc2tbQklUU19UT19MT05HUyhYODZfUE1DX0lEWF9NQVgpXTsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZTsKLQlpbnQgaSwgd21pbiwgd21heCwgbnVtID0gMDsKKwlpbnQgaSwgd21pbiwgd21heCwgdW5zY2hlZCA9IDA7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YzsKIAogCWJpdG1hcF96ZXJvKHVzZWRfbWFzaywgWDg2X1BNQ19JRFhfTUFYKTsKIAorCWlmICh4ODZfcG11LnN0YXJ0X3NjaGVkdWxpbmcpCisJCXg4Nl9wbXUuc3RhcnRfc2NoZWR1bGluZyhjcHVjKTsKKwogCWZvciAoaSA9IDAsIHdtaW4gPSBYODZfUE1DX0lEWF9NQVgsIHdtYXggPSAwOyBpIDwgbjsgaSsrKSB7CiAJCWh3YyA9ICZjcHVjLT5ldmVudF9saXN0W2ldLT5odzsKLQkJYyA9IHg4Nl9wbXUuZ2V0X2V2ZW50X2NvbnN0cmFpbnRzKGNwdWMsIGNwdWMtPmV2ZW50X2xpc3RbaV0pOworCQljID0geDg2X3BtdS5nZXRfZXZlbnRfY29uc3RyYWludHMoY3B1YywgaSwgY3B1Yy0+ZXZlbnRfbGlzdFtpXSk7CiAJCWh3Yy0+Y29uc3RyYWludCA9IGM7CiAKIAkJd21pbiA9IG1pbih3bWluLCBjLT53ZWlnaHQpOwpAQCAtNzY4LDI0ICs4MjIsMzAgQEAKIAogCS8qIHNsb3cgcGF0aCAqLwogCWlmIChpICE9IG4pCi0JCW51bSA9IHBlcmZfYXNzaWduX2V2ZW50cyhjcHVjLT5ldmVudF9saXN0LCBuLCB3bWluLAotCQkJCQkgd21heCwgYXNzaWduKTsKKwkJdW5zY2hlZCA9IHBlcmZfYXNzaWduX2V2ZW50cyhjcHVjLT5ldmVudF9saXN0LCBuLCB3bWluLAorCQkJCQkgICAgIHdtYXgsIGFzc2lnbik7CiAKIAkvKgotCSAqIE1hcmsgdGhlIGV2ZW50IGFzIGNvbW1pdHRlZCwgc28gd2UgZG8gbm90IHB1dF9jb25zdHJhaW50KCkKLQkgKiBpbiBjYXNlIG5ldyBldmVudHMgYXJlIGFkZGVkIGFuZCBmYWlsIHNjaGVkdWxpbmcuCisJICogSW4gY2FzZSBvZiBzdWNjZXNzICh1bnNjaGVkID0gMCksIG1hcmsgZXZlbnRzIGFzIGNvbW1pdHRlZCwKKwkgKiBzbyB3ZSBkbyBub3QgcHV0X2NvbnN0cmFpbnQoKSBpbiBjYXNlIG5ldyBldmVudHMgYXJlIGFkZGVkCisJICogYW5kIGZhaWwgdG8gYmUgc2NoZWR1bGVkCisJICoKKwkgKiBXZSBpbnZva2UgdGhlIGxvd2VyIGxldmVsIGNvbW1pdCBjYWxsYmFjayB0byBsb2NrIHRoZSByZXNvdXJjZQorCSAqCisJICogV2UgZG8gbm90IG5lZWQgdG8gZG8gYWxsIG9mIHRoaXMgaW4gY2FzZSB3ZSBhcmUgY2FsbGVkIHRvCisJICogdmFsaWRhdGUgYW4gZXZlbnQgZ3JvdXAgKGFzc2lnbiA9PSBOVUxMKQogCSAqLwotCWlmICghbnVtICYmIGFzc2lnbikgeworCWlmICghdW5zY2hlZCAmJiBhc3NpZ24pIHsKIAkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogCQkJZSA9IGNwdWMtPmV2ZW50X2xpc3RbaV07CiAJCQllLT5ody5mbGFncyB8PSBQRVJGX1g4Nl9FVkVOVF9DT01NSVRURUQ7CisJCQlpZiAoeDg2X3BtdS5jb21taXRfc2NoZWR1bGluZykKKwkJCQl4ODZfcG11LmNvbW1pdF9zY2hlZHVsaW5nKGNwdWMsIGUsIGFzc2lnbltpXSk7CiAJCX0KIAl9Ci0JLyoKLQkgKiBzY2hlZHVsaW5nIGZhaWxlZCBvciBpcyBqdXN0IGEgc2ltdWxhdGlvbiwKLQkgKiBmcmVlIHJlc291cmNlcyBpZiBuZWNlc3NhcnkKLQkgKi8KLQlpZiAoIWFzc2lnbiB8fCBudW0pIHsKKworCWlmICghYXNzaWduIHx8IHVuc2NoZWQpIHsKKwogCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAJCQllID0gY3B1Yy0+ZXZlbnRfbGlzdFtpXTsKIAkJCS8qCkBAIC03OTUsMTEgKzg1NSwxOCBAQAogCQkJaWYgKChlLT5ody5mbGFncyAmIFBFUkZfWDg2X0VWRU5UX0NPTU1JVFRFRCkpCiAJCQkJY29udGludWU7CiAKKwkJCS8qCisJCQkgKiByZWxlYXNlIGV2ZW50cyB0aGF0IGZhaWxlZCBzY2hlZHVsaW5nCisJCQkgKi8KIAkJCWlmICh4ODZfcG11LnB1dF9ldmVudF9jb25zdHJhaW50cykKIAkJCQl4ODZfcG11LnB1dF9ldmVudF9jb25zdHJhaW50cyhjcHVjLCBlKTsKIAkJfQogCX0KLQlyZXR1cm4gbnVtID8gLUVJTlZBTCA6IDA7CisKKwlpZiAoeDg2X3BtdS5zdG9wX3NjaGVkdWxpbmcpCisJCXg4Nl9wbXUuc3RvcF9zY2hlZHVsaW5nKGNwdWMpOworCisJcmV0dXJuIHVuc2NoZWQgPyAtRUlOVkFMIDogMDsKIH0KIAogLyoKQEAgLTk4Niw2ICsxMDUzLDkgQEAKIAlpZiAobGVmdCA+IHg4Nl9wbXUubWF4X3BlcmlvZCkKIAkJbGVmdCA9IHg4Nl9wbXUubWF4X3BlcmlvZDsKIAorCWlmICh4ODZfcG11LmxpbWl0X3BlcmlvZCkKKwkJbGVmdCA9IHg4Nl9wbXUubGltaXRfcGVyaW9kKGV2ZW50LCBsZWZ0KTsKKwogCXBlcl9jcHUocG1jX3ByZXZfbGVmdFtpZHhdLCBzbXBfcHJvY2Vzc29yX2lkKCkpID0gbGVmdDsKIAogCS8qCkBAIC0xMDMzLDcgKzExMDMsNiBAQAogCiAJaHdjID0gJmV2ZW50LT5odzsKIAotCXBlcmZfcG11X2Rpc2FibGUoZXZlbnQtPnBtdSk7CiAJbjAgPSBjcHVjLT5uX2V2ZW50czsKIAlyZXQgPSBuID0gY29sbGVjdF9ldmVudHMoY3B1YywgZXZlbnQsIGZhbHNlKTsKIAlpZiAocmV0IDwgMCkKQEAgLTEwNzEsNyArMTE0MCw2IEBACiAKIAlyZXQgPSAwOwogb3V0OgotCXBlcmZfcG11X2VuYWJsZShldmVudC0+cG11KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMTAzLDcgKzExNzEsNyBAQAogdm9pZCBwZXJmX2V2ZW50X3ByaW50X2RlYnVnKHZvaWQpCiB7CiAJdTY0IGN0cmwsIHN0YXR1cywgb3ZlcmZsb3csIHBtY19jdHJsLCBwbWNfY291bnQsIHByZXZfbGVmdCwgZml4ZWQ7Ci0JdTY0IHBlYnM7CisJdTY0IHBlYnMsIGRlYnVnY3RsOwogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGNwdSwgaWR4OwpAQCAtMTEyMSwxNCArMTE4OSwyMCBAQAogCQlyZG1zcmwoTVNSX0NPUkVfUEVSRl9HTE9CQUxfU1RBVFVTLCBzdGF0dXMpOwogCQlyZG1zcmwoTVNSX0NPUkVfUEVSRl9HTE9CQUxfT1ZGX0NUUkwsIG92ZXJmbG93KTsKIAkJcmRtc3JsKE1TUl9BUkNIX1BFUkZNT05fRklYRURfQ1RSX0NUUkwsIGZpeGVkKTsKLQkJcmRtc3JsKE1TUl9JQTMyX1BFQlNfRU5BQkxFLCBwZWJzKTsKIAogCQlwcl9pbmZvKCJcbiIpOwogCQlwcl9pbmZvKCJDUFUjJWQ6IGN0cmw6ICAgICAgICUwMTZsbHhcbiIsIGNwdSwgY3RybCk7CiAJCXByX2luZm8oIkNQVSMlZDogc3RhdHVzOiAgICAgJTAxNmxseFxuIiwgY3B1LCBzdGF0dXMpOwogCQlwcl9pbmZvKCJDUFUjJWQ6IG92ZXJmbG93OiAgICUwMTZsbHhcbiIsIGNwdSwgb3ZlcmZsb3cpOwogCQlwcl9pbmZvKCJDUFUjJWQ6IGZpeGVkOiAgICAgICUwMTZsbHhcbiIsIGNwdSwgZml4ZWQpOwotCQlwcl9pbmZvKCJDUFUjJWQ6IHBlYnM6ICAgICAgICUwMTZsbHhcbiIsIGNwdSwgcGVicyk7CisJCWlmICh4ODZfcG11LnBlYnNfY29uc3RyYWludHMpIHsKKwkJCXJkbXNybChNU1JfSUEzMl9QRUJTX0VOQUJMRSwgcGVicyk7CisJCQlwcl9pbmZvKCJDUFUjJWQ6IHBlYnM6ICAgICAgICUwMTZsbHhcbiIsIGNwdSwgcGVicyk7CisJCX0KKwkJaWYgKHg4Nl9wbXUubGJyX25yKSB7CisJCQlyZG1zcmwoTVNSX0lBMzJfREVCVUdDVExNU1IsIGRlYnVnY3RsKTsKKwkJCXByX2luZm8oIkNQVSMlZDogZGVidWdjdGw6ICAgJTAxNmxseFxuIiwgY3B1LCBkZWJ1Z2N0bCk7CisJCX0KIAl9CiAJcHJfaW5mbygiQ1BVIyVkOiBhY3RpdmU6ICAgICAlMDE2bGx4XG4iLCBjcHUsICoodTY0ICopY3B1Yy0+YWN0aXZlX21hc2spOwogCkBAIC0xMzIxLDExICsxMzk1LDEyIEBACiB7CiAJdW5zaWduZWQgaW50IGNwdSA9IChsb25nKWhjcHU7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSAmcGVyX2NwdShjcHVfaHdfZXZlbnRzLCBjcHUpOwotCWludCByZXQgPSBOT1RJRllfT0s7CisJaW50IGksIHJldCA9IE5PVElGWV9PSzsKIAogCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKIAljYXNlIENQVV9VUF9QUkVQQVJFOgotCQljcHVjLT5rZnJlZV9vbl9vbmxpbmUgPSBOVUxMOworCQlmb3IgKGkgPSAwIDsgaSA8IFg4Nl9QRVJGX0tGUkVFX01BWDsgaSsrKQorCQkJY3B1Yy0+a2ZyZWVfb25fb25saW5lW2ldID0gTlVMTDsKIAkJaWYgKHg4Nl9wbXUuY3B1X3ByZXBhcmUpCiAJCQlyZXQgPSB4ODZfcG11LmNwdV9wcmVwYXJlKGNwdSk7CiAJCWJyZWFrOwpAQCAtMTMzNiw3ICsxNDExLDEwIEBACiAJCWJyZWFrOwogCiAJY2FzZSBDUFVfT05MSU5FOgotCQlrZnJlZShjcHVjLT5rZnJlZV9vbl9vbmxpbmUpOworCQlmb3IgKGkgPSAwIDsgaSA8IFg4Nl9QRVJGX0tGUkVFX01BWDsgaSsrKSB7CisJCQlrZnJlZShjcHVjLT5rZnJlZV9vbl9vbmxpbmVbaV0pOworCQkJY3B1Yy0+a2ZyZWVfb25fb25saW5lW2ldID0gTlVMTDsKKwkJfQogCQlicmVhazsKIAogCWNhc2UgQ1BVX0RZSU5HOgpAQCAtMTcxMiw3ICsxNzkwLDcgQEAKIAlpZiAoSVNfRVJSKGZha2VfY3B1YykpCiAJCXJldHVybiBQVFJfRVJSKGZha2VfY3B1Yyk7CiAKLQljID0geDg2X3BtdS5nZXRfZXZlbnRfY29uc3RyYWludHMoZmFrZV9jcHVjLCBldmVudCk7CisJYyA9IHg4Nl9wbXUuZ2V0X2V2ZW50X2NvbnN0cmFpbnRzKGZha2VfY3B1YywgLTEsIGV2ZW50KTsKIAogCWlmICghYyB8fCAhYy0+d2VpZ2h0KQogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMTkxNCwxMCArMTk5MiwxMCBAQAogCU5VTEwsCiB9OwogCi1zdGF0aWMgdm9pZCB4ODZfcG11X2ZsdXNoX2JyYW5jaF9zdGFjayh2b2lkKQorc3RhdGljIHZvaWQgeDg2X3BtdV9zY2hlZF90YXNrKHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCwgYm9vbCBzY2hlZF9pbikKIHsKLQlpZiAoeDg2X3BtdS5mbHVzaF9icmFuY2hfc3RhY2spCi0JCXg4Nl9wbXUuZmx1c2hfYnJhbmNoX3N0YWNrKCk7CisJaWYgKHg4Nl9wbXUuc2NoZWRfdGFzaykKKwkJeDg2X3BtdS5zY2hlZF90YXNrKGN0eCwgc2NoZWRfaW4pOwogfQogCiB2b2lkIHBlcmZfY2hlY2tfbWljcm9jb2RlKHZvaWQpCkBAIC0xOTQ5LDcgKzIwMjcsOCBAQAogCS5jb21taXRfdHhuCQk9IHg4Nl9wbXVfY29tbWl0X3R4biwKIAogCS5ldmVudF9pZHgJCT0geDg2X3BtdV9ldmVudF9pZHgsCi0JLmZsdXNoX2JyYW5jaF9zdGFjawk9IHg4Nl9wbXVfZmx1c2hfYnJhbmNoX3N0YWNrLAorCS5zY2hlZF90YXNrCQk9IHg4Nl9wbXVfc2NoZWRfdGFzaywKKwkudGFza19jdHhfc2l6ZSAgICAgICAgICA9IHNpemVvZihzdHJ1Y3QgeDg2X3BlcmZfdGFza19jb250ZXh0KSwKIH07CiAKIHZvaWQgYXJjaF9wZXJmX3VwZGF0ZV91c2VycGFnZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCkBAIC0xOTY4LDEzICsyMDQ3LDIzIEBACiAKIAlkYXRhID0gY3ljMm5zX3JlYWRfYmVnaW4oKTsKIAorCS8qCisJICogSW50ZXJuYWwgdGltZWtlZXBpbmcgZm9yIGVuYWJsZWQvcnVubmluZy9zdG9wcGVkIHRpbWVzCisJICogaXMgYWx3YXlzIGluIHRoZSBsb2NhbF9jbG9jayBkb21haW4uCisJICovCiAJdXNlcnBnLT5jYXBfdXNlcl90aW1lID0gMTsKIAl1c2VycGctPnRpbWVfbXVsdCA9IGRhdGEtPmN5YzJuc19tdWw7CiAJdXNlcnBnLT50aW1lX3NoaWZ0ID0gZGF0YS0+Y3ljMm5zX3NoaWZ0OwogCXVzZXJwZy0+dGltZV9vZmZzZXQgPSBkYXRhLT5jeWMybnNfb2Zmc2V0IC0gbm93OwogCi0JdXNlcnBnLT5jYXBfdXNlcl90aW1lX3plcm8gPSAxOwotCXVzZXJwZy0+dGltZV96ZXJvID0gZGF0YS0+Y3ljMm5zX29mZnNldDsKKwkvKgorCSAqIGNhcF91c2VyX3RpbWVfemVybyBkb2Vzbid0IG1ha2Ugc2Vuc2Ugd2hlbiB3ZSdyZSB1c2luZyBhIGRpZmZlcmVudAorCSAqIHRpbWUgYmFzZSBmb3IgdGhlIHJlY29yZHMuCisJICovCisJaWYgKGV2ZW50LT5jbG9jayA9PSAmbG9jYWxfY2xvY2spIHsKKwkJdXNlcnBnLT5jYXBfdXNlcl90aW1lX3plcm8gPSAxOworCQl1c2VycGctPnRpbWVfemVybyA9IGRhdGEtPmN5YzJuc19vZmZzZXQ7CisJfQogCiAJY3ljMm5zX3JlYWRfZW5kKGRhdGEpOwogfQpAQCAtMjE0NywyNCArMjIzNiwyNCBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY29kZV9zZWdtZW50X2Jhc2Uoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJLyoKKwkgKiBGb3IgSUEzMiB3ZSBsb29rIGF0IHRoZSBHRFQvTERUIHNlZ21lbnQgYmFzZSB0byBjb252ZXJ0IHRoZQorCSAqIGVmZmVjdGl2ZSBJUCB0byBhIGxpbmVhciBhZGRyZXNzLgorCSAqLworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCS8qCiAJICogSWYgd2UgYXJlIGluIFZNODYgbW9kZSwgYWRkIHRoZSBzZWdtZW50IG9mZnNldCB0byBjb252ZXJ0IHRvIGEKIAkgKiBsaW5lYXIgYWRkcmVzcy4KIAkgKi8KIAlpZiAocmVncy0+ZmxhZ3MgJiBYODZfVk1fTUFTSykKIAkJcmV0dXJuIDB4MTAgKiByZWdzLT5jczsKIAotCS8qCi0JICogRm9yIElBMzIgd2UgbG9vayBhdCB0aGUgR0RUL0xEVCBzZWdtZW50IGJhc2UgdG8gY29udmVydCB0aGUKLQkgKiBlZmZlY3RpdmUgSVAgdG8gYSBsaW5lYXIgYWRkcmVzcy4KLQkgKi8KLSNpZmRlZiBDT05GSUdfWDg2XzMyCiAJaWYgKHVzZXJfbW9kZShyZWdzKSAmJiByZWdzLT5jcyAhPSBfX1VTRVJfQ1MpCiAJCXJldHVybiBnZXRfc2VnbWVudF9iYXNlKHJlZ3MtPmNzKTsKICNlbHNlCi0JaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGX0lBMzIpKSB7Ci0JCWlmICh1c2VyX21vZGUocmVncykgJiYgcmVncy0+Y3MgIT0gX19VU0VSMzJfQ1MpCi0JCQlyZXR1cm4gZ2V0X3NlZ21lbnRfYmFzZShyZWdzLT5jcyk7Ci0JfQorCWlmICh1c2VyX21vZGUocmVncykgJiYgIXVzZXJfNjRiaXRfbW9kZShyZWdzKSAmJgorCSAgICByZWdzLT5jcyAhPSBfX1VTRVIzMl9DUykKKwkJcmV0dXJuIGdldF9zZWdtZW50X2Jhc2UocmVncy0+Y3MpOwogI2VuZGlmCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5oCmluZGV4IGRmNTI1ZDIuLjMyOWYwMzUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5oCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5oCkBAIC03MSw2ICs3MSw4IEBACiAjZGVmaW5lIFBFUkZfWDg2X0VWRU5UX0NPTU1JVFRFRAkweDggLyogZXZlbnQgcGFzc2VkIGNvbW1pdF90eG4gKi8KICNkZWZpbmUgUEVSRl9YODZfRVZFTlRfUEVCU19MRF9IU1cJMHgxMCAvKiBoYXN3ZWxsIHN0eWxlIGRhdGFsYSwgbG9hZCAqLwogI2RlZmluZSBQRVJGX1g4Nl9FVkVOVF9QRUJTX05BX0hTVwkweDIwIC8qIGhhc3dlbGwgc3R5bGUgZGF0YWxhLCB1bmtub3duICovCisjZGVmaW5lIFBFUkZfWDg2X0VWRU5UX0VYQ0wJCTB4NDAgLyogSFQgZXhjbHVzaXZpdHkgb24gY291bnRlciAqLworI2RlZmluZSBQRVJGX1g4Nl9FVkVOVF9EWU5BTUlDCQkweDgwIC8qIGR5bmFtaWMgYWxsb2MnZCBjb25zdHJhaW50ICovCiAjZGVmaW5lIFBFUkZfWDg2X0VWRU5UX1JEUE1DX0FMTE9XRUQJMHg0MCAvKiBncmFudCByZHBtYyBwZXJtaXNzaW9uICovCiAKIApAQCAtMTIzLDggKzEyNSwzNyBAQAogCXVuc2lnbmVkICAgICAgICAgICAgICAgIGNvcmVfaWQ7CS8qIHBlci1jb3JlOiBjb3JlIGlkICovCiB9OwogCitlbnVtIGludGVsX2V4Y2xfc3RhdGVfdHlwZSB7CisJSU5URUxfRVhDTF9VTlVTRUQgICAgPSAwLCAvKiBjb3VudGVyIGlzIHVudXNlZCAqLworCUlOVEVMX0VYQ0xfU0hBUkVEICAgID0gMSwgLyogY291bnRlciBjYW4gYmUgdXNlZCBieSBib3RoIHRocmVhZHMgKi8KKwlJTlRFTF9FWENMX0VYQ0xVU0lWRSA9IDIsIC8qIGNvdW50ZXIgY2FuIGJlIHVzZWQgYnkgb25lIHRocmVhZCBvbmx5ICovCit9OworCitzdHJ1Y3QgaW50ZWxfZXhjbF9zdGF0ZXMgeworCWVudW0gaW50ZWxfZXhjbF9zdGF0ZV90eXBlIGluaXRfc3RhdGVbWDg2X1BNQ19JRFhfTUFYXTsKKwllbnVtIGludGVsX2V4Y2xfc3RhdGVfdHlwZSBzdGF0ZVtYODZfUE1DX0lEWF9NQVhdOworCWludCAgbnVtX2FsbG9jX2NudHJzOy8qICNjb3VudGVycyBhbGxvY2F0ZWQgKi8KKwlpbnQgIG1heF9hbGxvY19jbnRyczsvKiBtYXggI2NvdW50ZXJzIGFsbG93ZWQgKi8KKwlib29sIHNjaGVkX3N0YXJ0ZWQ7IC8qIHRydWUgaWYgc2NoZWR1bGluZyBoYXMgc3RhcnRlZCAqLworfTsKKworc3RydWN0IGludGVsX2V4Y2xfY250cnMgeworCXJhd19zcGlubG9ja190CWxvY2s7CisKKwlzdHJ1Y3QgaW50ZWxfZXhjbF9zdGF0ZXMgc3RhdGVzWzJdOworCisJaW50CQlyZWZjbnQ7CQkvKiBwZXItY29yZTogI0hUIHRocmVhZHMgKi8KKwl1bnNpZ25lZAljb3JlX2lkOwkvKiBwZXItY29yZTogY29yZSBpZCAqLworfTsKKwogI2RlZmluZSBNQVhfTEJSX0VOVFJJRVMJCTE2CiAKK2VudW0geworCVg4Nl9QRVJGX0tGUkVFX1NIQVJFRCA9IDAsCisJWDg2X1BFUkZfS0ZSRUVfRVhDTCAgID0gMSwKKwlYODZfUEVSRl9LRlJFRV9NQVgKK307CisKIHN0cnVjdCBjcHVfaHdfZXZlbnRzIHsKIAkvKgogCSAqIEdlbmVyaWMgeDg2IFBNQyBiaXRzCkBAIC0xNzksNiArMjEwLDEyIEBACiAJICogdXNlZCBvbiBJbnRlbCBOSE0vV1NNL1NOQgogCSAqLwogCXN0cnVjdCBpbnRlbF9zaGFyZWRfcmVncwkqc2hhcmVkX3JlZ3M7CisJLyoKKwkgKiBtYW5hZ2UgZXhjbHVzaXZlIGNvdW50ZXIgYWNjZXNzIGJldHdlZW4gaHlwZXJ0aHJlYWQKKwkgKi8KKwlzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqY29uc3RyYWludF9saXN0OyAvKiBpbiBlbmFibGUgb3JkZXIgKi8KKwlzdHJ1Y3QgaW50ZWxfZXhjbF9jbnRycwkJKmV4Y2xfY250cnM7CisJaW50IGV4Y2xfdGhyZWFkX2lkOyAvKiAwIG9yIDEgKi8KIAogCS8qCiAJICogQU1EIHNwZWNpZmljIGJpdHMKQEAgLTE4Nyw3ICsyMjQsNyBAQAogCS8qIEludmVydGVkIG1hc2sgb2YgYml0cyB0byBjbGVhciBpbiB0aGUgcGVyZl9jdHIgY3RybCByZWdpc3RlcnMgKi8KIAl1NjQJCQkJcGVyZl9jdHJfdmlydF9tYXNrOwogCi0Jdm9pZAkJCQkqa2ZyZWVfb25fb25saW5lOworCXZvaWQJCQkJKmtmcmVlX29uX29ubGluZVtYODZfUEVSRl9LRlJFRV9NQVhdOwogfTsKIAogI2RlZmluZSBfX0VWRU5UX0NPTlNUUkFJTlQoYywgbiwgbSwgdywgbywgZikge1wKQEAgLTIwMiw2ICsyMzksMTAgQEAKICNkZWZpbmUgRVZFTlRfQ09OU1RSQUlOVChjLCBuLCBtKQlcCiAJX19FVkVOVF9DT05TVFJBSU5UKGMsIG4sIG0sIEhXRUlHSFQobiksIDAsIDApCiAKKyNkZWZpbmUgSU5URUxfRVhDTEVWVF9DT05TVFJBSU5UKGMsIG4pCVwKKwlfX0VWRU5UX0NPTlNUUkFJTlQoYywgbiwgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX0VWRU5ULCBIV0VJR0hUKG4pLFwKKwkJCSAgIDAsIFBFUkZfWDg2X0VWRU5UX0VYQ0wpCisKIC8qCiAgKiBUaGUgb3ZlcmxhcCBmbGFnIG1hcmtzIGV2ZW50IGNvbnN0cmFpbnRzIHdpdGggb3ZlcmxhcHBpbmcgY291bnRlcgogICogbWFza3MuIFRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIGNvdW50ZXIgbWFzayBvZiBzdWNoIGFuIGV2ZW50IGlzIG5vdApAQCAtMjU5LDYgKzMwMCwxMCBAQAogI2RlZmluZSBJTlRFTF9GTEFHU19VRVZFTlRfQ09OU1RSQUlOVChjLCBuKQlcCiAJRVZFTlRfQ09OU1RSQUlOVChjLCBuLCBJTlRFTF9BUkNIX0VWRU5UX01BU0t8WDg2X0FMTF9FVkVOVF9GTEFHUykKIAorI2RlZmluZSBJTlRFTF9FWENMVUVWVF9DT05TVFJBSU5UKGMsIG4pCVwKKwlfX0VWRU5UX0NPTlNUUkFJTlQoYywgbiwgSU5URUxfQVJDSF9FVkVOVF9NQVNLLCBcCisJCQkgICBIV0VJR0hUKG4pLCAwLCBQRVJGX1g4Nl9FVkVOVF9FWENMKQorCiAjZGVmaW5lIElOVEVMX1BMRF9DT05TVFJBSU5UKGMsIG4pCVwKIAlfX0VWRU5UX0NPTlNUUkFJTlQoYywgbiwgSU5URUxfQVJDSF9FVkVOVF9NQVNLfFg4Nl9BTExfRVZFTlRfRkxBR1MsIFwKIAkJCSAgIEhXRUlHSFQobiksIDAsIFBFUkZfWDg2X0VWRU5UX1BFQlNfTERMQVQpCkBAIC0yODMsMjIgKzMyOCw0MCBAQAogCiAvKiBDaGVjayBmbGFncyBhbmQgZXZlbnQgY29kZSwgYW5kIHNldCB0aGUgSFNXIGxvYWQgZmxhZyAqLwogI2RlZmluZSBJTlRFTF9GTEFHU19FVkVOVF9DT05TVFJBSU5UX0RBVEFMQV9MRChjb2RlLCBuKSBcCi0JX19FVkVOVF9DT05TVFJBSU5UKGNvZGUsIG4sIAkJCVwKKwlfX0VWRU5UX0NPTlNUUkFJTlQoY29kZSwgbiwJCQlcCiAJCQkgIEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9FVkVOVHxYODZfQUxMX0VWRU5UX0ZMQUdTLCBcCiAJCQkgIEhXRUlHSFQobiksIDAsIFBFUkZfWDg2X0VWRU5UX1BFQlNfTERfSFNXKQogCisjZGVmaW5lIElOVEVMX0ZMQUdTX0VWRU5UX0NPTlNUUkFJTlRfREFUQUxBX1hMRChjb2RlLCBuKSBcCisJX19FVkVOVF9DT05TVFJBSU5UKGNvZGUsIG4sCQkJXAorCQkJICBBUkNIX1BFUkZNT05fRVZFTlRTRUxfRVZFTlR8WDg2X0FMTF9FVkVOVF9GTEFHUywgXAorCQkJICBIV0VJR0hUKG4pLCAwLCBcCisJCQkgIFBFUkZfWDg2X0VWRU5UX1BFQlNfTERfSFNXfFBFUkZfWDg2X0VWRU5UX0VYQ0wpCisKIC8qIENoZWNrIGZsYWdzIGFuZCBldmVudCBjb2RlL3VtYXNrLCBhbmQgc2V0IHRoZSBIU1cgc3RvcmUgZmxhZyAqLwogI2RlZmluZSBJTlRFTF9GTEFHU19VRVZFTlRfQ09OU1RSQUlOVF9EQVRBTEFfU1QoY29kZSwgbikgXAogCV9fRVZFTlRfQ09OU1RSQUlOVChjb2RlLCBuLCAJCQlcCiAJCQkgIElOVEVMX0FSQ0hfRVZFTlRfTUFTS3xYODZfQUxMX0VWRU5UX0ZMQUdTLCBcCiAJCQkgIEhXRUlHSFQobiksIDAsIFBFUkZfWDg2X0VWRU5UX1BFQlNfU1RfSFNXKQogCisjZGVmaW5lIElOVEVMX0ZMQUdTX1VFVkVOVF9DT05TVFJBSU5UX0RBVEFMQV9YU1QoY29kZSwgbikgXAorCV9fRVZFTlRfQ09OU1RSQUlOVChjb2RlLCBuLAkJCVwKKwkJCSAgSU5URUxfQVJDSF9FVkVOVF9NQVNLfFg4Nl9BTExfRVZFTlRfRkxBR1MsIFwKKwkJCSAgSFdFSUdIVChuKSwgMCwgXAorCQkJICBQRVJGX1g4Nl9FVkVOVF9QRUJTX1NUX0hTV3xQRVJGX1g4Nl9FVkVOVF9FWENMKQorCiAvKiBDaGVjayBmbGFncyBhbmQgZXZlbnQgY29kZS91bWFzaywgYW5kIHNldCB0aGUgSFNXIGxvYWQgZmxhZyAqLwogI2RlZmluZSBJTlRFTF9GTEFHU19VRVZFTlRfQ09OU1RSQUlOVF9EQVRBTEFfTEQoY29kZSwgbikgXAogCV9fRVZFTlRfQ09OU1RSQUlOVChjb2RlLCBuLCAJCQlcCiAJCQkgIElOVEVMX0FSQ0hfRVZFTlRfTUFTS3xYODZfQUxMX0VWRU5UX0ZMQUdTLCBcCiAJCQkgIEhXRUlHSFQobiksIDAsIFBFUkZfWDg2X0VWRU5UX1BFQlNfTERfSFNXKQogCisjZGVmaW5lIElOVEVMX0ZMQUdTX1VFVkVOVF9DT05TVFJBSU5UX0RBVEFMQV9YTEQoY29kZSwgbikgXAorCV9fRVZFTlRfQ09OU1RSQUlOVChjb2RlLCBuLAkJCVwKKwkJCSAgSU5URUxfQVJDSF9FVkVOVF9NQVNLfFg4Nl9BTExfRVZFTlRfRkxBR1MsIFwKKwkJCSAgSFdFSUdIVChuKSwgMCwgXAorCQkJICBQRVJGX1g4Nl9FVkVOVF9QRUJTX0xEX0hTV3xQRVJGX1g4Nl9FVkVOVF9FWENMKQorCiAvKiBDaGVjayBmbGFncyBhbmQgZXZlbnQgY29kZS91bWFzaywgYW5kIHNldCB0aGUgSFNXIE4vQSBmbGFnICovCiAjZGVmaW5lIElOVEVMX0ZMQUdTX1VFVkVOVF9DT05TVFJBSU5UX0RBVEFMQV9OQShjb2RlLCBuKSBcCiAJX19FVkVOVF9DT05TVFJBSU5UKGNvZGUsIG4sIAkJCVwKQEAgLTQwOCw2ICs0NzEsMTMgQEAKIAogI2RlZmluZSBYODZfQ09ORklHKGFyZ3MuLi4pICgodW5pb24geDg2X3BtdV9jb25maWcpey5iaXRzID0ge2FyZ3N9fSkudmFsdWUKIAorZW51bSB7CisJeDg2X2xicl9leGNsdXNpdmVfbGJyLAorCXg4Nl9sYnJfZXhjbHVzaXZlX2J0cywKKwl4ODZfbGJyX2V4Y2x1c2l2ZV9wdCwKKwl4ODZfbGJyX2V4Y2x1c2l2ZV9tYXgsCit9OworCiAvKgogICogc3RydWN0IHg4Nl9wbXUgLSBnZW5lcmljIHg4NiBwbXUKICAqLwpAQCAtNDQzLDE0ICs1MTMsMjUgQEAKIAl1NjQJCW1heF9wZXJpb2Q7CiAJc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKgogCQkJKCpnZXRfZXZlbnRfY29uc3RyYWludHMpKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAorCQkJCQkJIGludCBpZHgsCiAJCQkJCQkgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAogCXZvaWQJCSgqcHV0X2V2ZW50X2NvbnN0cmFpbnRzKShzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywKIAkJCQkJCSBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOworCisJdm9pZAkJKCpjb21taXRfc2NoZWR1bGluZykoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCisJCQkJCSAgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJCQkgICAgIGludCBjbnRyKTsKKworCXZvaWQJCSgqc3RhcnRfc2NoZWR1bGluZykoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMpOworCisJdm9pZAkJKCpzdG9wX3NjaGVkdWxpbmcpKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjKTsKKwogCXN0cnVjdCBldmVudF9jb25zdHJhaW50ICpldmVudF9jb25zdHJhaW50czsKIAlzdHJ1Y3QgeDg2X3BtdV9xdWlyayAqcXVpcmtzOwogCWludAkJcGVyZmN0cl9zZWNvbmRfd3JpdGU7CiAJYm9vbAkJbGF0ZV9hY2s7CisJdW5zaWduZWQJKCpsaW1pdF9wZXJpb2QpKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdW5zaWduZWQgbCk7CiAKIAkvKgogCSAqIHN5c2ZzIGF0dHJzCkBAIC00NzIsNyArNTUzLDggQEAKIAl2b2lkCQkoKmNwdV9kZWFkKShpbnQgY3B1KTsKIAogCXZvaWQJCSgqY2hlY2tfbWljcm9jb2RlKSh2b2lkKTsKLQl2b2lkCQkoKmZsdXNoX2JyYW5jaF9zdGFjaykodm9pZCk7CisJdm9pZAkJKCpzY2hlZF90YXNrKShzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgsCisJCQkJICAgICAgYm9vbCBzY2hlZF9pbik7CiAKIAkvKgogCSAqIEludGVsIEFyY2ggUGVyZm1vbiB2MisKQEAgLTUwNCwxMCArNTg2LDE1IEBACiAJYm9vbAkJbGJyX2RvdWJsZV9hYm9ydDsJICAgLyogZHVwbGljYXRlZCBsYnIgYWJvcnRzICovCiAKIAkvKgorCSAqIEludGVsIFBUL0xCUi9CVFMgYXJlIGV4Y2x1c2l2ZQorCSAqLworCWF0b21pY190CWxicl9leGNsdXNpdmVbeDg2X2xicl9leGNsdXNpdmVfbWF4XTsKKworCS8qCiAJICogRXh0cmEgcmVnaXN0ZXJzIGZvciBldmVudHMKIAkgKi8KIAlzdHJ1Y3QgZXh0cmFfcmVnICpleHRyYV9yZWdzOwotCXVuc2lnbmVkIGludCBlcl9mbGFnczsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAKIAkvKgogCSAqIEludGVsIGhvc3QvZ3Vlc3Qgc3VwcG9ydCAoS1ZNKQpAQCAtNTE1LDYgKzYwMiwxMyBAQAogCXN0cnVjdCBwZXJmX2d1ZXN0X3N3aXRjaF9tc3IgKigqZ3Vlc3RfZ2V0X21zcnMpKGludCAqbnIpOwogfTsKIAorc3RydWN0IHg4Nl9wZXJmX3Rhc2tfY29udGV4dCB7CisJdTY0IGxicl9mcm9tW01BWF9MQlJfRU5UUklFU107CisJdTY0IGxicl90b1tNQVhfTEJSX0VOVFJJRVNdOworCWludCBsYnJfY2FsbHN0YWNrX3VzZXJzOworCWludCBsYnJfc3RhY2tfc3RhdGU7Cit9OworCiAjZGVmaW5lIHg4Nl9hZGRfcXVpcmsoZnVuY18pCQkJCQkJXAogZG8gewkJCQkJCQkJCVwKIAlzdGF0aWMgc3RydWN0IHg4Nl9wbXVfcXVpcmsgX19xdWlyayBfX2luaXRkYXRhID0gewkJXApAQCAtNTI0LDggKzYxOCwxMyBAQAogCXg4Nl9wbXUucXVpcmtzID0gJl9fcXVpcms7CQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIEVSRl9OT19IVF9TSEFSSU5HCTEKLSNkZWZpbmUgRVJGX0hBU19SU1BfMQkJMgorLyoKKyAqIHg4Nl9wbXUgZmxhZ3MKKyAqLworI2RlZmluZSBQTVVfRkxfTk9fSFRfU0hBUklORwkweDEgLyogbm8gaHlwZXItdGhyZWFkaW5nIHJlc291cmNlIHNoYXJpbmcgKi8KKyNkZWZpbmUgUE1VX0ZMX0hBU19SU1BfMQkweDIgLyogaGFzIDIgZXF1aXZhbGVudCBvZmZjb3JlX3JzcCByZWdzICAgKi8KKyNkZWZpbmUgUE1VX0ZMX0VYQ0xfQ05UUlMJMHg0IC8qIGhhcyBleGNsdXNpdmUgY291bnRlciByZXF1aXJlbWVudHMgICovCisjZGVmaW5lIFBNVV9GTF9FWENMX0VOQUJMRUQJMHg4IC8qIGV4Y2x1c2l2ZSBjb3VudGVyIGFjdGl2ZSAqLwogCiAjZGVmaW5lIEVWRU5UX1ZBUihfaWQpICBldmVudF9hdHRyXyMjX2lkCiAjZGVmaW5lIEVWRU5UX1BUUihfaWQpICZldmVudF9hdHRyXyMjX2lkLmF0dHIuYXR0cgpAQCAtNTQ2LDYgKzY0NSwxMiBAQAogCiBleHRlcm4gc3RydWN0IHg4Nl9wbXUgeDg2X3BtdSBfX3JlYWRfbW9zdGx5OwogCitzdGF0aWMgaW5saW5lIGJvb2wgeDg2X3BtdV9oYXNfbGJyX2NhbGxzdGFjayh2b2lkKQoreworCXJldHVybiAgeDg2X3BtdS5sYnJfc2VsX21hcCAmJgorCQl4ODZfcG11Lmxicl9zZWxfbWFwW1BFUkZfU0FNUExFX0JSQU5DSF9DQUxMX1NUQUNLX1NISUZUXSA+IDA7Cit9CisKIERFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgY3B1X2h3X2V2ZW50cywgY3B1X2h3X2V2ZW50cyk7CiAKIGludCB4ODZfcGVyZl9ldmVudF9zZXRfcGVyaW9kKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CkBAIC01ODgsNiArNjkzLDEyIEBACiAJcmV0dXJuIHg4Nl9wbXUucmRwbWNfaW5kZXggPyB4ODZfcG11LnJkcG1jX2luZGV4KGluZGV4KSA6IGluZGV4OwogfQogCitpbnQgeDg2X2FkZF9leGNsdXNpdmUodW5zaWduZWQgaW50IHdoYXQpOworCit2b2lkIHg4Nl9kZWxfZXhjbHVzaXZlKHVuc2lnbmVkIGludCB3aGF0KTsKKwordm9pZCBod19wZXJmX2xicl9ldmVudF9kZXN0cm95KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CisKIGludCB4ODZfc2V0dXBfcGVyZmN0cihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwogCiBpbnQgeDg2X3BtdV9od19jb25maWcoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKQEAgLTY3NCwxMCArNzg1LDM0IEBACiAKICNpZmRlZiBDT05GSUdfQ1BVX1NVUF9JTlRFTAogCitzdGF0aWMgaW5saW5lIGJvb2wgaW50ZWxfcG11X25lZWRzX2xicl9zbXBsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwkvKiB1c2VyIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJyYW5jaCBzYW1wbGluZyAqLworCWlmIChoYXNfYnJhbmNoX3N0YWNrKGV2ZW50KSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBpbXBsaWNpdCBicmFuY2ggc2FtcGxpbmcgdG8gY29ycmVjdCBQRUJTIHNraWQgKi8KKwlpZiAoeDg2X3BtdS5pbnRlbF9jYXAucGVic190cmFwICYmIGV2ZW50LT5hdHRyLnByZWNpc2VfaXAgPiAxICYmCisJICAgIHg4Nl9wbXUuaW50ZWxfY2FwLnBlYnNfZm9ybWF0IDwgMikKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpbnRlbF9wbXVfaGFzX2J0cyhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJaWYgKGV2ZW50LT5hdHRyLmNvbmZpZyA9PSBQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlMgJiYKKwkgICAgIWV2ZW50LT5hdHRyLmZyZXEgJiYgZXZlbnQtPmh3LnNhbXBsZV9wZXJpb2QgPT0gMSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIGludCBpbnRlbF9wbXVfc2F2ZV9hbmRfcmVzdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOwogCiBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqCi14ODZfZ2V0X2V2ZW50X2NvbnN0cmFpbnRzKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLCBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOworeDg2X2dldF9ldmVudF9jb25zdHJhaW50cyhzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywgaW50IGlkeCwKKwkJCSAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAogc3RydWN0IGludGVsX3NoYXJlZF9yZWdzICphbGxvY2F0ZV9zaGFyZWRfcmVncyhpbnQgY3B1KTsKIApAQCAtNzI3LDEzICs4NjIsMTUgQEAKIAogdm9pZCBpbnRlbF9kc19pbml0KHZvaWQpOwogCit2b2lkIGludGVsX3BtdV9sYnJfc2NoZWRfdGFzayhzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgsIGJvb2wgc2NoZWRfaW4pOworCiB2b2lkIGludGVsX3BtdV9sYnJfcmVzZXQodm9pZCk7CiAKIHZvaWQgaW50ZWxfcG11X2xicl9lbmFibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAogdm9pZCBpbnRlbF9wbXVfbGJyX2Rpc2FibGUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAotdm9pZCBpbnRlbF9wbXVfbGJyX2VuYWJsZV9hbGwodm9pZCk7Cit2b2lkIGludGVsX3BtdV9sYnJfZW5hYmxlX2FsbChib29sIHBtaSk7CiAKIHZvaWQgaW50ZWxfcG11X2xicl9kaXNhYmxlX2FsbCh2b2lkKTsKIApAQCAtNzQ3LDggKzg4NCwxOCBAQAogCiB2b2lkIGludGVsX3BtdV9sYnJfaW5pdF9zbmIodm9pZCk7CiAKK3ZvaWQgaW50ZWxfcG11X2xicl9pbml0X2hzdyh2b2lkKTsKKwogaW50IGludGVsX3BtdV9zZXR1cF9sYnJfZmlsdGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAKK3ZvaWQgaW50ZWxfcHRfaW50ZXJydXB0KHZvaWQpOworCitpbnQgaW50ZWxfYnRzX2ludGVycnVwdCh2b2lkKTsKKwordm9pZCBpbnRlbF9idHNfZW5hYmxlX2xvY2FsKHZvaWQpOworCit2b2lkIGludGVsX2J0c19kaXNhYmxlX2xvY2FsKHZvaWQpOworCiBpbnQgcDRfcG11X2luaXQodm9pZCk7CiAKIGludCBwNl9wbXVfaW5pdCh2b2lkKTsKQEAgLTc1OCw2ICs5MDUsMTAgQEAKIHNzaXplX3QgZXZlbnRzX3N5c2ZzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgY2hhciAqcGFnZSk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2h0X3dvcmthcm91bmRfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiAhISh4ODZfcG11LmZsYWdzICYgUE1VX0ZMX0VYQ0xfRU5BQkxFRCk7Cit9CiAjZWxzZSAvKiBDT05GSUdfQ1BVX1NVUF9JTlRFTCAqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXJ2ZV9kc19idWZmZXJzKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfYW1kLmMKaW5kZXggMjg5MjYzMS4uMWNlZTVkMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9hbWQuYwpAQCAtMzgyLDYgKzM4Miw3IEBACiBzdGF0aWMgdm9pZCBhbWRfcG11X2NwdV9zdGFydGluZyhpbnQgY3B1KQogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJnBlcl9jcHUoY3B1X2h3X2V2ZW50cywgY3B1KTsKKwl2b2lkICoqb25sbiA9ICZjcHVjLT5rZnJlZV9vbl9vbmxpbmVbWDg2X1BFUkZfS0ZSRUVfU0hBUkVEXTsKIAlzdHJ1Y3QgYW1kX25iICpuYjsKIAlpbnQgaSwgbmJfaWQ7CiAKQEAgLTM5OSw3ICs0MDAsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKG5iLT5uYl9pZCA9PSBuYl9pZCkgewotCQkJY3B1Yy0+a2ZyZWVfb25fb25saW5lID0gY3B1Yy0+YW1kX25iOworCQkJKm9ubG4gPSBjcHVjLT5hbWRfbmI7CiAJCQljcHVjLT5hbWRfbmIgPSBuYjsKIAkJCWJyZWFrOwogCQl9CkBAIC00MjksNyArNDMwLDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50ICoKLWFtZF9nZXRfZXZlbnRfY29uc3RyYWludHMoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK2FtZF9nZXRfZXZlbnRfY29uc3RyYWludHMoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsIGludCBpZHgsCisJCQkgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAkvKgogCSAqIGlmIG5vdCBOQiBldmVudCBvciBubyBOQiwgdGhlbiBubyBjb25zdHJhaW50cwpAQCAtNTM3LDcgKzUzOSw4IEBACiBzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgYW1kX2YxNV9QTUM1MyA9IEVWRU5UX0NPTlNUUkFJTlQoMCwgMHgzOCwgMCk7CiAKIHN0YXRpYyBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqCi1hbWRfZ2V0X2V2ZW50X2NvbnN0cmFpbnRzX2YxNWgoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK2FtZF9nZXRfZXZlbnRfY29uc3RyYWludHNfZjE1aChzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywgaW50IGlkeCwKKwkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CiAJdW5zaWduZWQgaW50IGV2ZW50X2NvZGUgPSBhbWRfZ2V0X2V2ZW50X2NvZGUoaHdjKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9hbWRfaWJzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfYW1kX2licy5jCmluZGV4IGE2MWY1YzYuLjk4OWQzYzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9hbWRfaWJzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2FtZF9pYnMuYwpAQCAtNzk2LDcgKzc5Niw3IEBACiAgKiB0aGUgSUJTIGludGVycnVwdCB2ZWN0b3IgaXMgaGFuZGxlZCBieSBwZXJmX2lic19jcHVfbm90aWZpZXIgdGhhdAogICogaXMgdXNpbmcgdGhlIG5ldyBvZmZzZXQuCiAgKi8KLXN0YXRpYyBpbnQgZm9yY2VfaWJzX2VpbHZ0X3NldHVwKHZvaWQpCitzdGF0aWMgdm9pZCBmb3JjZV9pYnNfZWlsdnRfc2V0dXAodm9pZCkKIHsKIAlpbnQgb2Zmc2V0OwogCWludCByZXQ7CkBAIC04MTEsMjYgKzgxMSwyNCBAQAogCiAJaWYgKG9mZnNldCA9PSBBUElDX0VJTFZUX05SX01BWCkgewogCQlwcmludGsoS0VSTl9ERUJVRyAiTm8gRUlMVlQgZW50cnkgYXZhaWxhYmxlXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0dXJuOwogCX0KIAogCXJldCA9IHNldHVwX2lic19jdGwob2Zmc2V0KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCWlmICghaWJzX2VpbHZ0X3ZhbGlkKCkpIHsKLQkJcmV0ID0gLUVGQVVMVDsKKwlpZiAoIWlic19laWx2dF92YWxpZCgpKQogCQlnb3RvIG91dDsKLQl9CiAKIAlwcl9pbmZvKCJJQlM6IExWVCBvZmZzZXQgJWQgYXNzaWduZWRcbiIsIG9mZnNldCk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm47CiBvdXQ6CiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJcHV0X2VpbHZ0KG9mZnNldCk7CiAJcHJlZW1wdF9lbmFibGUoKTsKLQlyZXR1cm4gcmV0OworCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgaWJzX2VpbHZ0X3NldHVwKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbC5jCmluZGV4IDQ5OGI2ZDkuLjlkYTI0MDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbC5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPgogCiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KICNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgpAQCAtMTEzLDYgKzExNCwxMiBAQAogCUlOVEVMX0VWRU5UX0NPTlNUUkFJTlQoMHhjZCwgMHg4KSwgLyogTUVNX1RSQU5TX1JFVElSRUQuTE9BRF9MQVRFTkNZICovCiAJSU5URUxfVUVWRU5UX0NPTlNUUkFJTlQoMHgwNGEzLCAweGYpLCAvKiBDWUNMRV9BQ1RJVklUWS5DWUNMRVNfTk9fRElTUEFUQ0ggKi8KIAlJTlRFTF9VRVZFTlRfQ09OU1RSQUlOVCgweDAyYTMsIDB4NCksIC8qIENZQ0xFX0FDVElWSVRZLkNZQ0xFU19MMURfUEVORElORyAqLworCisJSU5URUxfRVhDTEVWVF9DT05TVFJBSU5UKDB4ZDAsIDB4ZiksIC8qIE1FTV9VT1BTX1JFVElSRUQuKiAqLworCUlOVEVMX0VYQ0xFVlRfQ09OU1RSQUlOVCgweGQxLCAweGYpLCAvKiBNRU1fTE9BRF9VT1BTX1JFVElSRUQuKiAqLworCUlOVEVMX0VYQ0xFVlRfQ09OU1RSQUlOVCgweGQyLCAweGYpLCAvKiBNRU1fTE9BRF9VT1BTX0xMQ19ISVRfUkVUSVJFRC4qICovCisJSU5URUxfRVhDTEVWVF9DT05TVFJBSU5UKDB4ZDMsIDB4ZiksIC8qIE1FTV9MT0FEX1VPUFNfTExDX01JU1NfUkVUSVJFRC4qICovCisKIAlFVkVOVF9DT05TVFJBSU5UX0VORAogfTsKIApAQCAtMTMxLDE1ICsxMzgsMTIgQEAKIAlJTlRFTF9VRVZFTlRfQ09OU1RSQUlOVCgweDA4YTMsIDB4NCksIC8qIENZQ0xFX0FDVElWSVRZLkNZQ0xFU19MMURfUEVORElORyAqLwogCUlOVEVMX1VFVkVOVF9DT05TVFJBSU5UKDB4MGNhMywgMHg0KSwgLyogQ1lDTEVfQUNUSVZJVFkuU1RBTExTX0wxRF9QRU5ESU5HICovCiAJSU5URUxfVUVWRU5UX0NPTlNUUkFJTlQoMHgwMWMwLCAweDIpLCAvKiBJTlNUX1JFVElSRUQuUFJFQ19ESVNUICovCi0JLyoKLQkgKiBFcnJhdGEgQlY5OCAtLSBNRU1fKl9SRVRJUkVEIGV2ZW50cyBjYW4gbGVhayBiZXR3ZWVuIGNvdW50ZXJzIG9mIFNNVAotCSAqIHNpYmxpbmdzOyBkaXNhYmxlIHRoZXNlIGV2ZW50cyBiZWNhdXNlIHRoZXkgY2FuIGNvcnJ1cHQgdW5yZWxhdGVkCi0JICogY291bnRlcnMuCi0JICovCi0JSU5URUxfRVZFTlRfQ09OU1RSQUlOVCgweGQwLCAweDApLCAvKiBNRU1fVU9QU19SRVRJUkVELiogKi8KLQlJTlRFTF9FVkVOVF9DT05TVFJBSU5UKDB4ZDEsIDB4MCksIC8qIE1FTV9MT0FEX1VPUFNfUkVUSVJFRC4qICovCi0JSU5URUxfRVZFTlRfQ09OU1RSQUlOVCgweGQyLCAweDApLCAvKiBNRU1fTE9BRF9VT1BTX0xMQ19ISVRfUkVUSVJFRC4qICovCi0JSU5URUxfRVZFTlRfQ09OU1RSQUlOVCgweGQzLCAweDApLCAvKiBNRU1fTE9BRF9VT1BTX0xMQ19NSVNTX1JFVElSRUQuKiAqLworCisJSU5URUxfRVhDTEVWVF9DT05TVFJBSU5UKDB4ZDAsIDB4ZiksIC8qIE1FTV9VT1BTX1JFVElSRUQuKiAqLworCUlOVEVMX0VYQ0xFVlRfQ09OU1RSQUlOVCgweGQxLCAweGYpLCAvKiBNRU1fTE9BRF9VT1BTX1JFVElSRUQuKiAqLworCUlOVEVMX0VYQ0xFVlRfQ09OU1RSQUlOVCgweGQyLCAweGYpLCAvKiBNRU1fTE9BRF9VT1BTX0xMQ19ISVRfUkVUSVJFRC4qICovCisJSU5URUxfRVhDTEVWVF9DT05TVFJBSU5UKDB4ZDMsIDB4ZiksIC8qIE1FTV9MT0FEX1VPUFNfTExDX01JU1NfUkVUSVJFRC4qICovCisKIAlFVkVOVF9DT05TVFJBSU5UX0VORAogfTsKIApAQCAtMjEyLDExICsyMTYsMjYgQEAKIAlJTlRFTF9VRVZFTlRfQ09OU1RSQUlOVCgweDAxYzAsIDB4MiksIC8qIElOU1RfUkVUSVJFRC5QUkVDX0RJU1QgKi8KIAlJTlRFTF9FVkVOVF9DT05TVFJBSU5UKDB4Y2QsIDB4OCksIC8qIE1FTV9UUkFOU19SRVRJUkVELkxPQURfTEFURU5DWSAqLwogCS8qIENZQ0xFX0FDVElWSVRZLkNZQ0xFU19MMURfUEVORElORyAqLwotCUlOVEVMX0VWRU5UX0NPTlNUUkFJTlQoMHgwOGEzLCAweDQpLAorCUlOVEVMX1VFVkVOVF9DT05TVFJBSU5UKDB4MDhhMywgMHg0KSwKIAkvKiBDWUNMRV9BQ1RJVklUWS5TVEFMTFNfTDFEX1BFTkRJTkcgKi8KLQlJTlRFTF9FVkVOVF9DT05TVFJBSU5UKDB4MGNhMywgMHg0KSwKKwlJTlRFTF9VRVZFTlRfQ09OU1RSQUlOVCgweDBjYTMsIDB4NCksCiAJLyogQ1lDTEVfQUNUSVZJVFkuQ1lDTEVTX05PX0VYRUNVVEUgKi8KLQlJTlRFTF9FVkVOVF9DT05TVFJBSU5UKDB4MDRhMywgMHhmKSwKKwlJTlRFTF9VRVZFTlRfQ09OU1RSQUlOVCgweDA0YTMsIDB4ZiksCisKKwlJTlRFTF9FWENMRVZUX0NPTlNUUkFJTlQoMHhkMCwgMHhmKSwgLyogTUVNX1VPUFNfUkVUSVJFRC4qICovCisJSU5URUxfRVhDTEVWVF9DT05TVFJBSU5UKDB4ZDEsIDB4ZiksIC8qIE1FTV9MT0FEX1VPUFNfUkVUSVJFRC4qICovCisJSU5URUxfRVhDTEVWVF9DT05TVFJBSU5UKDB4ZDIsIDB4ZiksIC8qIE1FTV9MT0FEX1VPUFNfTExDX0hJVF9SRVRJUkVELiogKi8KKwlJTlRFTF9FWENMRVZUX0NPTlNUUkFJTlQoMHhkMywgMHhmKSwgLyogTUVNX0xPQURfVU9QU19MTENfTUlTU19SRVRJUkVELiogKi8KKworCUVWRU5UX0NPTlNUUkFJTlRfRU5ECit9OworCitzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCBpbnRlbF9iZHdfZXZlbnRfY29uc3RyYWludHNbXSA9IHsKKwlGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDBjMCwgMCksCS8qIElOU1RfUkVUSVJFRC5BTlkgKi8KKwlGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDAzYywgMSksCS8qIENQVV9DTEtfVU5IQUxURUQuQ09SRSAqLworCUZJWEVEX0VWRU5UX0NPTlNUUkFJTlQoMHgwMzAwLCAyKSwJLyogQ1BVX0NMS19VTkhBTFRFRC5SRUYgKi8KKwlJTlRFTF9VRVZFTlRfQ09OU1RSQUlOVCgweDE0OCwgMHg0KSwJLyogTDFEX1BFTkRfTUlTUy5QRU5ESU5HICovCisJSU5URUxfRVZFTlRfQ09OU1RSQUlOVCgweGEzLCAweDQpLAkvKiBDWUNMRV9BQ1RJVklUWS4qICovCiAJRVZFTlRfQ09OU1RSQUlOVF9FTkQKIH07CiAKQEAgLTQxNSw2ICs0MzQsMjAyIEBACiAKIH07CiAKKy8qCisgKiBOb3RlcyBvbiB0aGUgZXZlbnRzOgorICogLSBkYXRhIHJlYWRzIGRvIG5vdCBpbmNsdWRlIGNvZGUgcmVhZHMgKGNvbXBhcmFibGUgdG8gZWFybGllciB0YWJsZXMpCisgKiAtIGRhdGEgY291bnRzIGluY2x1ZGUgc3BlY3VsYXRpdmUgZXhlY3V0aW9uIChleGNlcHQgTDEgd3JpdGUsIGR0bGIsIGJwdSkKKyAqIC0gcmVtb3RlIG5vZGUgYWNjZXNzIGluY2x1ZGVzIHJlbW90ZSBtZW1vcnksIHJlbW90ZSBjYWNoZSwgcmVtb3RlIG1taW8uCisgKiAtIHByZWZldGNoZXMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgY291bnRzIGJlY2F1c2UgdGhleSBhcmUgbm90CisgKiAgIHJlbGlhYmx5IGNvdW50ZWQuCisgKi8KKworI2RlZmluZSBIU1dfREVNQU5EX0RBVEFfUkQJCUJJVF9VTEwoMCkKKyNkZWZpbmUgSFNXX0RFTUFORF9SRk8JCQlCSVRfVUxMKDEpCisjZGVmaW5lIEhTV19BTllfUkVTUE9OU0UJCUJJVF9VTEwoMTYpCisjZGVmaW5lIEhTV19TVVBQTElFUl9OT05FCQlCSVRfVUxMKDE3KQorI2RlZmluZSBIU1dfTDNfTUlTU19MT0NBTF9EUkFNCQlCSVRfVUxMKDIyKQorI2RlZmluZSBIU1dfTDNfTUlTU19SRU1PVEVfSE9QMAkJQklUX1VMTCgyNykKKyNkZWZpbmUgSFNXX0wzX01JU1NfUkVNT1RFX0hPUDEJCUJJVF9VTEwoMjgpCisjZGVmaW5lIEhTV19MM19NSVNTX1JFTU9URV9IT1AyUAlCSVRfVUxMKDI5KQorI2RlZmluZSBIU1dfTDNfTUlTUwkJCShIU1dfTDNfTUlTU19MT0NBTF9EUkFNfCBcCisJCQkJCSBIU1dfTDNfTUlTU19SRU1PVEVfSE9QMHxIU1dfTDNfTUlTU19SRU1PVEVfSE9QMXwgXAorCQkJCQkgSFNXX0wzX01JU1NfUkVNT1RFX0hPUDJQKQorI2RlZmluZSBIU1dfU05PT1BfTk9ORQkJCUJJVF9VTEwoMzEpCisjZGVmaW5lIEhTV19TTk9PUF9OT1RfTkVFREVECQlCSVRfVUxMKDMyKQorI2RlZmluZSBIU1dfU05PT1BfTUlTUwkJCUJJVF9VTEwoMzMpCisjZGVmaW5lIEhTV19TTk9PUF9ISVRfTk9fRldECQlCSVRfVUxMKDM0KQorI2RlZmluZSBIU1dfU05PT1BfSElUX1dJVEhfRldECQlCSVRfVUxMKDM1KQorI2RlZmluZSBIU1dfU05PT1BfSElUTQkJCUJJVF9VTEwoMzYpCisjZGVmaW5lIEhTV19TTk9PUF9OT05fRFJBTQkJQklUX1VMTCgzNykKKyNkZWZpbmUgSFNXX0FOWV9TTk9PUAkJCShIU1dfU05PT1BfTk9ORXwgXAorCQkJCQkgSFNXX1NOT09QX05PVF9ORUVERUR8SFNXX1NOT09QX01JU1N8IFwKKwkJCQkJIEhTV19TTk9PUF9ISVRfTk9fRldEfEhTV19TTk9PUF9ISVRfV0lUSF9GV0R8IFwKKwkJCQkJIEhTV19TTk9PUF9ISVRNfEhTV19TTk9PUF9OT05fRFJBTSkKKyNkZWZpbmUgSFNXX1NOT09QX0RSQU0JCQkoSFNXX0FOWV9TTk9PUCAmIH5IU1dfU05PT1BfTk9OX0RSQU0pCisjZGVmaW5lIEhTV19ERU1BTkRfUkVBRAkJCUhTV19ERU1BTkRfREFUQV9SRAorI2RlZmluZSBIU1dfREVNQU5EX1dSSVRFCQlIU1dfREVNQU5EX1JGTworI2RlZmluZSBIU1dfTDNfTUlTU19SRU1PVEUJCShIU1dfTDNfTUlTU19SRU1PVEVfSE9QMHxcCisJCQkJCSBIU1dfTDNfTUlTU19SRU1PVEVfSE9QMXxIU1dfTDNfTUlTU19SRU1PVEVfSE9QMlApCisjZGVmaW5lIEhTV19MTENfQUNDRVNTCQkJSFNXX0FOWV9SRVNQT05TRQorCisjZGVmaW5lIEJEV19MM19NSVNTX0xPQ0FMCQlCSVQoMjYpCisjZGVmaW5lIEJEV19MM19NSVNTCQkJKEJEV19MM19NSVNTX0xPQ0FMfCBcCisJCQkJCSBIU1dfTDNfTUlTU19SRU1PVEVfSE9QMHxIU1dfTDNfTUlTU19SRU1PVEVfSE9QMXwgXAorCQkJCQkgSFNXX0wzX01JU1NfUkVNT1RFX0hPUDJQKQorCisKK3N0YXRpYyBfX2luaXRjb25zdCBjb25zdCB1NjQgaHN3X2h3X2NhY2hlX2V2ZW50X2lkcworCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWF0KKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF0gPQoreworIFsgQyhMMUQgKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4ODFkMCwJLyogTUVNX1VPUFNfUkVUSVJFRC5BTExfTE9BRFMgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDE1MSwJLyogTDFELlJFUExBQ0VNRU5UICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHg4MmQwLAkvKiBNRU1fVU9QU19SRVRJUkVELkFMTF9TVE9SRVMgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MCwKKwl9LAorIH0sCisgWyBDKEwxSSApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MjgwLAkvKiBJQ0FDSEUuTUlTU0VTICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MCwKKwl9LAorIH0sCisgWyBDKExMICApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgxYjcsCS8qIE9GRkNPUkVfUkVTUE9OU0UgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDFiNywJLyogT0ZGQ09SRV9SRVNQT05TRSAqLworCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MWI3LAkvKiBPRkZDT1JFX1JFU1BPTlNFICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgxYjcsCS8qIE9GRkNPUkVfUkVTUE9OU0UgKi8KKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwLAorCX0sCisgfSwKKyBbIEMoRFRMQikgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDgxZDAsCS8qIE1FTV9VT1BTX1JFVElSRUQuQUxMX0xPQURTICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgxMDgsCS8qIERUTEJfTE9BRF9NSVNTRVMuTUlTU19DQVVTRVNfQV9XQUxLICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHg4MmQwLAkvKiBNRU1fVU9QU19SRVRJUkVELkFMTF9TVE9SRVMgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDE0OSwJLyogRFRMQl9TVE9SRV9NSVNTRVMuTUlTU19DQVVTRVNfQV9XQUxLICovCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MCwKKwl9LAorIH0sCisgWyBDKElUTEIpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHg2MDg1LAkvKiBJVExCX01JU1NFUy5TVExCX0hJVCAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MTg1LAkvKiBJVExCX01JU1NFUy5NSVNTX0NBVVNFU19BX1dBTEsgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorIH0sCisgWyBDKEJQVSApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHhjNCwJLyogQlJfSU5TVF9SRVRJUkVELkFMTF9CUkFOQ0hFUyAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4YzUsCS8qIEJSX01JU1BfUkVUSVJFRC5BTExfQlJBTkNIRVMgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorIH0sCisgWyBDKE5PREUpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgxYjcsCS8qIE9GRkNPUkVfUkVTUE9OU0UgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDFiNywJLyogT0ZGQ09SRV9SRVNQT05TRSAqLworCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MWI3LAkvKiBPRkZDT1JFX1JFU1BPTlNFICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgxYjcsCS8qIE9GRkNPUkVfUkVTUE9OU0UgKi8KKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwLAorCX0sCisgfSwKK307CisKK3N0YXRpYyBfX2luaXRjb25zdCBjb25zdCB1NjQgaHN3X2h3X2NhY2hlX2V4dHJhX3JlZ3MKKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdID0KK3sKKyBbIEMoTEwgICkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSBIU1dfREVNQU5EX1JFQUR8CisJCQkJICAgICAgIEhTV19MTENfQUNDRVNTLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IEhTV19ERU1BTkRfUkVBRHwKKwkJCQkgICAgICAgSFNXX0wzX01JU1N8SFNXX0FOWV9TTk9PUCwKKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSBIU1dfREVNQU5EX1dSSVRFfAorCQkJCSAgICAgICBIU1dfTExDX0FDQ0VTUywKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSBIU1dfREVNQU5EX1dSSVRFfAorCQkJCSAgICAgICBIU1dfTDNfTUlTU3xIU1dfQU5ZX1NOT09QLAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MCwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAsCisJfSwKKyB9LAorIFsgQyhOT0RFKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IEhTV19ERU1BTkRfUkVBRHwKKwkJCQkgICAgICAgSFNXX0wzX01JU1NfTE9DQUxfRFJBTXwKKwkJCQkgICAgICAgSFNXX1NOT09QX0RSQU0sCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gSFNXX0RFTUFORF9SRUFEfAorCQkJCSAgICAgICBIU1dfTDNfTUlTU19SRU1PVEV8CisJCQkJICAgICAgIEhTV19TTk9PUF9EUkFNLAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IEhTV19ERU1BTkRfV1JJVEV8CisJCQkJICAgICAgIEhTV19MM19NSVNTX0xPQ0FMX0RSQU18CisJCQkJICAgICAgIEhTV19TTk9PUF9EUkFNLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IEhTV19ERU1BTkRfV1JJVEV8CisJCQkJICAgICAgIEhTV19MM19NSVNTX1JFTU9URXwKKwkJCQkgICAgICAgSFNXX1NOT09QX0RSQU0sCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MCwKKwl9LAorIH0sCit9OworCiBzdGF0aWMgX19pbml0Y29uc3QgY29uc3QgdTY0IHdlc3RtZXJlX2h3X2NhY2hlX2V2ZW50X2lkcwogCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWF0KIAkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCkBAIC0xMDI5LDIxICsxMjQ0LDEwIEBACiAgfSwKIH07CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBpbnRlbF9wbXVfbmVlZHNfbGJyX3NtcGwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQotewotCS8qIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnJhbmNoIHNhbXBsaW5nICovCi0JaWYgKGhhc19icmFuY2hfc3RhY2soZXZlbnQpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCS8qIGltcGxpY2l0IGJyYW5jaCBzYW1wbGluZyB0byBjb3JyZWN0IFBFQlMgc2tpZCAqLwotCWlmICh4ODZfcG11LmludGVsX2NhcC5wZWJzX3RyYXAgJiYgZXZlbnQtPmF0dHIucHJlY2lzZV9pcCA+IDEgJiYKLQkgICAgeDg2X3BtdS5pbnRlbF9jYXAucGVic19mb3JtYXQgPCAyKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHZvaWQgaW50ZWxfcG11X2Rpc2FibGVfYWxsKHZvaWQpCisvKgorICogVXNlIGZyb20gUE1JcyB3aGVyZSB0aGUgTEJScyBhcmUgYWxyZWFkeSBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgX19pbnRlbF9wbXVfZGlzYWJsZV9hbGwodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9IHRoaXNfY3B1X3B0cigmY3B1X2h3X2V2ZW50cyk7CiAKQEAgLTEwNTEsMTcgKzEyNTUsMjQgQEAKIAogCWlmICh0ZXN0X2JpdChJTlRFTF9QTUNfSURYX0ZJWEVEX0JUUywgY3B1Yy0+YWN0aXZlX21hc2spKQogCQlpbnRlbF9wbXVfZGlzYWJsZV9idHMoKTsKKwllbHNlCisJCWludGVsX2J0c19kaXNhYmxlX2xvY2FsKCk7CiAKIAlpbnRlbF9wbXVfcGVic19kaXNhYmxlX2FsbCgpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9wbXVfZGlzYWJsZV9hbGwodm9pZCkKK3sKKwlfX2ludGVsX3BtdV9kaXNhYmxlX2FsbCgpOwogCWludGVsX3BtdV9sYnJfZGlzYWJsZV9hbGwoKTsKIH0KIAotc3RhdGljIHZvaWQgaW50ZWxfcG11X2VuYWJsZV9hbGwoaW50IGFkZGVkKQorc3RhdGljIHZvaWQgX19pbnRlbF9wbXVfZW5hYmxlX2FsbChpbnQgYWRkZWQsIGJvb2wgcG1pKQogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKIAogCWludGVsX3BtdV9wZWJzX2VuYWJsZV9hbGwoKTsKLQlpbnRlbF9wbXVfbGJyX2VuYWJsZV9hbGwoKTsKKwlpbnRlbF9wbXVfbGJyX2VuYWJsZV9hbGwocG1pKTsKIAl3cm1zcmwoTVNSX0NPUkVfUEVSRl9HTE9CQUxfQ1RSTCwKIAkJCXg4Nl9wbXUuaW50ZWxfY3RybCAmIH5jcHVjLT5pbnRlbF9jdHJsX2d1ZXN0X21hc2spOwogCkBAIC0xMDczLDcgKzEyODQsMTMgQEAKIAkJCXJldHVybjsKIAogCQlpbnRlbF9wbXVfZW5hYmxlX2J0cyhldmVudC0+aHcuY29uZmlnKTsKLQl9CisJfSBlbHNlCisJCWludGVsX2J0c19lbmFibGVfbG9jYWwoKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfcG11X2VuYWJsZV9hbGwoaW50IGFkZGVkKQoreworCV9faW50ZWxfcG11X2VuYWJsZV9hbGwoYWRkZWQsIGZhbHNlKTsKIH0KIAogLyoKQEAgLTEyMDcsNyArMTQyNCw3IEBACiAJICogbXVzdCBkaXNhYmxlIGJlZm9yZSBhbnkgYWN0dWFsIGV2ZW50CiAJICogYmVjYXVzZSBhbnkgZXZlbnQgbWF5IGJlIGNvbWJpbmVkIHdpdGggTEJSCiAJICovCi0JaWYgKGludGVsX3BtdV9uZWVkc19sYnJfc21wbChldmVudCkpCisJaWYgKG5lZWRzX2JyYW5jaF9zdGFjayhldmVudCkpCiAJCWludGVsX3BtdV9sYnJfZGlzYWJsZShldmVudCk7CiAKIAlpZiAodW5saWtlbHkoaHdjLT5jb25maWdfYmFzZSA9PSBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUl9DVFJMKSkgewpAQCAtMTI2OCw3ICsxNDg1LDcgQEAKIAkgKiBtdXN0IGVuYWJsZWQgYmVmb3JlIGFueSBhY3R1YWwgZXZlbnQKIAkgKiBiZWNhdXNlIGFueSBldmVudCBtYXkgYmUgY29tYmluZWQgd2l0aCBMQlIKIAkgKi8KLQlpZiAoaW50ZWxfcG11X25lZWRzX2xicl9zbXBsKGV2ZW50KSkKKwlpZiAobmVlZHNfYnJhbmNoX3N0YWNrKGV2ZW50KSkKIAkJaW50ZWxfcG11X2xicl9lbmFibGUoZXZlbnQpOwogCiAJaWYgKGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaG9zdCkKQEAgLTEzMzQsNiArMTU1MSwxOCBAQAogCWlmIChkcykKIAkJZHMtPmJ0c19pbmRleCA9IGRzLT5idHNfYnVmZmVyX2Jhc2U7CiAKKwkvKiBBY2sgYWxsIG92ZXJmbG93cyBhbmQgZGlzYWJsZSBmaXhlZCBjb3VudGVycyAqLworCWlmICh4ODZfcG11LnZlcnNpb24gPj0gMikgeworCQlpbnRlbF9wbXVfYWNrX3N0YXR1cyhpbnRlbF9wbXVfZ2V0X3N0YXR1cygpKTsKKwkJd3Jtc3JsKE1TUl9DT1JFX1BFUkZfR0xPQkFMX0NUUkwsIDApOworCX0KKworCS8qIFJlc2V0IExCUnMgYW5kIExCUiBmcmVlemluZyAqLworCWlmICh4ODZfcG11Lmxicl9ucikgeworCQl1cGRhdGVfZGVidWdjdGxtc3IoZ2V0X2RlYnVnY3RsbXNyKCkgJgorCQkJfihERUJVR0NUTE1TUl9GUkVFWkVfTEJSU19PTl9QTUl8REVCVUdDVExNU1JfTEJSKSk7CisJfQorCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCkBAIC0xMzU3LDggKzE1ODYsOSBAQAogCSAqLwogCWlmICgheDg2X3BtdS5sYXRlX2FjaykKIAkJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7Ci0JaW50ZWxfcG11X2Rpc2FibGVfYWxsKCk7CisJX19pbnRlbF9wbXVfZGlzYWJsZV9hbGwoKTsKIAloYW5kbGVkID0gaW50ZWxfcG11X2RyYWluX2J0c19idWZmZXIoKTsKKwloYW5kbGVkICs9IGludGVsX2J0c19pbnRlcnJ1cHQoKTsKIAlzdGF0dXMgPSBpbnRlbF9wbXVfZ2V0X3N0YXR1cygpOwogCWlmICghc3RhdHVzKQogCQlnb3RvIGRvbmU7CkBAIC0xMzk5LDYgKzE2MjksMTQgQEAKIAl9CiAKIAkvKgorCSAqIEludGVsIFBUCisJICovCisJaWYgKF9fdGVzdF9hbmRfY2xlYXJfYml0KDU1LCAodW5zaWduZWQgbG9uZyAqKSZzdGF0dXMpKSB7CisJCWhhbmRsZWQrKzsKKwkJaW50ZWxfcHRfaW50ZXJydXB0KCk7CisJfQorCisJLyoKIAkgKiBDaGVja3BvaW50ZWQgY291bnRlcnMgY2FuIGxlYWQgdG8gJ3NwdXJpb3VzJyBQTUlzIGJlY2F1c2UgdGhlCiAJICogcm9sbGJhY2sgY2F1c2VkIGJ5IHRoZSBQTUkgd2lsbCBoYXZlIGNsZWFyZWQgdGhlIG92ZXJmbG93IHN0YXR1cwogCSAqIGJpdC4gVGhlcmVmb3JlIGFsd2F5cyBmb3JjZSBwcm9iZSB0aGVzZSBjb3VudGVycy4KQEAgLTE0MzMsNyArMTY3MSw3IEBACiAJCWdvdG8gYWdhaW47CiAKIGRvbmU6Ci0JaW50ZWxfcG11X2VuYWJsZV9hbGwoMCk7CisJX19pbnRlbF9wbXVfZW5hYmxlX2FsbCgwLCB0cnVlKTsKIAkvKgogCSAqIE9ubHkgdW5tYXNrIHRoZSBOTUkgYWZ0ZXIgdGhlIG92ZXJmbG93IGNvdW50ZXJzCiAJICogaGF2ZSBiZWVuIHJlc2V0LiBUaGlzIGF2b2lkcyBzcHVyaW91cyBOTUlzIG9uCkBAIC0xNDY0LDcgKzE3MDIsNyBAQAogCiBzdGF0aWMgaW50IGludGVsX2FsdF9lcihpbnQgaWR4KQogewotCWlmICghKHg4Nl9wbXUuZXJfZmxhZ3MgJiBFUkZfSEFTX1JTUF8xKSkKKwlpZiAoISh4ODZfcG11LmZsYWdzICYgUE1VX0ZMX0hBU19SU1BfMSkpCiAJCXJldHVybiBpZHg7CiAKIAlpZiAoaWR4ID09IEVYVFJBX1JFR19SU1BfMCkKQEAgLTE2MjQsNyArMTg2Miw4IEBACiB9CiAKIHN0cnVjdCBldmVudF9jb25zdHJhaW50ICoKLXg4Nl9nZXRfZXZlbnRfY29uc3RyYWludHMoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3g4Nl9nZXRfZXZlbnRfY29uc3RyYWludHMoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsIGludCBpZHgsCisJCQkgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqYzsKIApAQCAtMTY0MSw3ICsxODgwLDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50ICoKLWludGVsX2dldF9ldmVudF9jb25zdHJhaW50cyhzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1Yywgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQorX19pbnRlbF9nZXRfZXZlbnRfY29uc3RyYWludHMoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsIGludCBpZHgsCisJCQkgICAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBldmVudF9jb25zdHJhaW50ICpjOwogCkBAIC0xNjQ5LDE1ICsxODg5LDI4NiBAQAogCWlmIChjKQogCQlyZXR1cm4gYzsKIAotCWMgPSBpbnRlbF9wZWJzX2NvbnN0cmFpbnRzKGV2ZW50KTsKLQlpZiAoYykKLQkJcmV0dXJuIGM7Ci0KIAljID0gaW50ZWxfc2hhcmVkX3JlZ3NfY29uc3RyYWludHMoY3B1YywgZXZlbnQpOwogCWlmIChjKQogCQlyZXR1cm4gYzsKIAotCXJldHVybiB4ODZfZ2V0X2V2ZW50X2NvbnN0cmFpbnRzKGNwdWMsIGV2ZW50KTsKKwljID0gaW50ZWxfcGVic19jb25zdHJhaW50cyhldmVudCk7CisJaWYgKGMpCisJCXJldHVybiBjOworCisJcmV0dXJuIHg4Nl9nZXRfZXZlbnRfY29uc3RyYWludHMoY3B1YywgaWR4LCBldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlbF9zdGFydF9zY2hlZHVsaW5nKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjKQoreworCXN0cnVjdCBpbnRlbF9leGNsX2NudHJzICpleGNsX2NudHJzID0gY3B1Yy0+ZXhjbF9jbnRyczsKKwlzdHJ1Y3QgaW50ZWxfZXhjbF9zdGF0ZXMgKnhsLCAqeGxvOworCWludCB0aWQgPSBjcHVjLT5leGNsX3RocmVhZF9pZDsKKwlpbnQgb190aWQgPSAxIC0gdGlkOyAvKiBzaWJsaW5nIHRocmVhZCAqLworCisJLyoKKwkgKiBub3RoaW5nIG5lZWRlZCBpZiBpbiBncm91cCB2YWxpZGF0aW9uIG1vZGUKKwkgKi8KKwlpZiAoY3B1Yy0+aXNfZmFrZSB8fCAhaXNfaHRfd29ya2Fyb3VuZF9lbmFibGVkKCkpCisJCXJldHVybjsKKworCS8qCisJICogbm8gZXhjbHVzaW9uIG5lZWRlZAorCSAqLworCWlmICghZXhjbF9jbnRycykKKwkJcmV0dXJuOworCisJeGxvID0gJmV4Y2xfY250cnMtPnN0YXRlc1tvX3RpZF07CisJeGwgPSAmZXhjbF9jbnRycy0+c3RhdGVzW3RpZF07CisKKwl4bC0+c2NoZWRfc3RhcnRlZCA9IHRydWU7CisJeGwtPm51bV9hbGxvY19jbnRycyA9IDA7CisJLyoKKwkgKiBsb2NrIHNoYXJlZCBzdGF0ZSB1bnRpbCB3ZSBhcmUgZG9uZSBzY2hlZHVsaW5nCisJICogaW4gc3RvcF9ldmVudF9zY2hlZHVsaW5nKCkKKwkgKiBtYWtlcyBzY2hlZHVsaW5nIGFwcGVhciBhcyBhIHRyYW5zYWN0aW9uCisJICovCisJV0FSTl9PTl9PTkNFKCFpcnFzX2Rpc2FibGVkKCkpOworCXJhd19zcGluX2xvY2soJmV4Y2xfY250cnMtPmxvY2spOworCisJLyoKKwkgKiBzYXZlIGluaXRpYWwgc3RhdGUgb2Ygc2libGluZyB0aHJlYWQKKwkgKi8KKwltZW1jcHkoeGxvLT5pbml0X3N0YXRlLCB4bG8tPnN0YXRlLCBzaXplb2YoeGxvLT5pbml0X3N0YXRlKSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbnRlbF9zdG9wX3NjaGVkdWxpbmcoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMpCit7CisJc3RydWN0IGludGVsX2V4Y2xfY250cnMgKmV4Y2xfY250cnMgPSBjcHVjLT5leGNsX2NudHJzOworCXN0cnVjdCBpbnRlbF9leGNsX3N0YXRlcyAqeGwsICp4bG87CisJaW50IHRpZCA9IGNwdWMtPmV4Y2xfdGhyZWFkX2lkOworCWludCBvX3RpZCA9IDEgLSB0aWQ7IC8qIHNpYmxpbmcgdGhyZWFkICovCisKKwkvKgorCSAqIG5vdGhpbmcgbmVlZGVkIGlmIGluIGdyb3VwIHZhbGlkYXRpb24gbW9kZQorCSAqLworCWlmIChjcHVjLT5pc19mYWtlIHx8ICFpc19odF93b3JrYXJvdW5kX2VuYWJsZWQoKSkKKwkJcmV0dXJuOworCS8qCisJICogbm8gZXhjbHVzaW9uIG5lZWRlZAorCSAqLworCWlmICghZXhjbF9jbnRycykKKwkJcmV0dXJuOworCisJeGxvID0gJmV4Y2xfY250cnMtPnN0YXRlc1tvX3RpZF07CisJeGwgPSAmZXhjbF9jbnRycy0+c3RhdGVzW3RpZF07CisKKwkvKgorCSAqIG1ha2UgbmV3IHNpYmxpbmcgdGhyZWFkIHN0YXRlIHZpc2libGUKKwkgKi8KKwltZW1jcHkoeGxvLT5zdGF0ZSwgeGxvLT5pbml0X3N0YXRlLCBzaXplb2YoeGxvLT5zdGF0ZSkpOworCisJeGwtPnNjaGVkX3N0YXJ0ZWQgPSBmYWxzZTsKKwkvKgorCSAqIHJlbGVhc2Ugc2hhcmVkIHN0YXRlIGxvY2sgKGFjcXVpcmVkIGluIGludGVsX3N0YXJ0X3NjaGVkdWxpbmcoKSkKKwkgKi8KKwlyYXdfc3Bpbl91bmxvY2soJmV4Y2xfY250cnMtPmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKgoraW50ZWxfZ2V0X2V4Y2xfY29uc3RyYWludHMoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCSAgIGludCBpZHgsIHN0cnVjdCBldmVudF9jb25zdHJhaW50ICpjKQoreworCXN0cnVjdCBldmVudF9jb25zdHJhaW50ICpjeDsKKwlzdHJ1Y3QgaW50ZWxfZXhjbF9jbnRycyAqZXhjbF9jbnRycyA9IGNwdWMtPmV4Y2xfY250cnM7CisJc3RydWN0IGludGVsX2V4Y2xfc3RhdGVzICp4bCwgKnhsbzsKKwlpbnQgaXNfZXhjbCwgaTsKKwlpbnQgdGlkID0gY3B1Yy0+ZXhjbF90aHJlYWRfaWQ7CisJaW50IG9fdGlkID0gMSAtIHRpZDsgLyogYWx0ZXJuYXRlICovCisKKwkvKgorCSAqIHZhbGlkYXRpbmcgYSBncm91cCBkb2VzIG5vdCByZXF1aXJlCisJICogZW5mb3JjaW5nIGNyb3NzLXRocmVhZCAgZXhjbHVzaW9uCisJICovCisJaWYgKGNwdWMtPmlzX2Zha2UgfHwgIWlzX2h0X3dvcmthcm91bmRfZW5hYmxlZCgpKQorCQlyZXR1cm4gYzsKKworCS8qCisJICogbm8gZXhjbHVzaW9uIG5lZWRlZAorCSAqLworCWlmICghZXhjbF9jbnRycykKKwkJcmV0dXJuIGM7CisJLyoKKwkgKiBldmVudCByZXF1aXJlcyBleGNsdXNpdmUgY291bnRlciBhY2Nlc3MKKwkgKiBhY3Jvc3MgSFQgdGhyZWFkcworCSAqLworCWlzX2V4Y2wgPSBjLT5mbGFncyAmIFBFUkZfWDg2X0VWRU5UX0VYQ0w7CisKKwkvKgorCSAqIHhsID0gc3RhdGUgb2YgY3VycmVudCBIVAorCSAqIHhsbyA9IHN0YXRlIG9mIHNpYmxpbmcgSFQKKwkgKi8KKwl4bCA9ICZleGNsX2NudHJzLT5zdGF0ZXNbdGlkXTsKKwl4bG8gPSAmZXhjbF9jbnRycy0+c3RhdGVzW29fdGlkXTsKKworCS8qCisJICogZG8gbm90IGFsbG93IHNjaGVkdWxpbmcgb2YgbW9yZSB0aGFuIG1heF9hbGxvY19jbnRycworCSAqIHdoaWNoIGlzIHNldCB0byBoYWxmIHRoZSBhdmFpbGFibGUgZ2VuZXJpYyBjb3VudGVycy4KKwkgKiB0aGlzIGhlbHBzIGF2b2lkIGNvdW50ZXIgc3RhcnZhdGlvbiBvZiBzaWJsaW5nIHRocmVhZAorCSAqIGJ5IGVuc3VyaW5nIGF0IG1vc3QgaGFsZiB0aGUgY291bnRlcnMgY2Fubm90IGJlIGluCisJICogZXhjbHVzaXZlIG1vZGUuIFRoZXJlIGlzIG5vdCBkZXNpZ25hdGVkIGNvdW50ZXJzIGZvciB0aGUKKwkgKiBsaW1pdHMuIEFueSBOLzIgY291bnRlcnMgY2FuIGJlIHVzZWQuIFRoaXMgaGVscHMgd2l0aAorCSAqIGV2ZW50cyB3aXRoIHNwZWNpZml4IGNvdW50ZXIgY29uc3RyYWludHMKKwkgKi8KKwlpZiAoeGwtPm51bV9hbGxvY19jbnRycysrID09IHhsLT5tYXhfYWxsb2NfY250cnMpCisJCXJldHVybiAmZW1wdHljb25zdHJhaW50OworCisJY3ggPSBjOworCisJLyoKKwkgKiBiZWNhdXNlIHdlIG1vZGlmeSB0aGUgY29uc3RyYWludCwgd2UgbmVlZAorCSAqIHRvIG1ha2UgYSBjb3B5LiBTdGF0aWMgY29uc3RyYWludHMgY29tZQorCSAqIGZyb20gc3RhdGljIGNvbnN0IHRhYmxlcy4KKwkgKgorCSAqIG9ubHkgbmVlZGVkIHdoZW4gY29uc3RyYWludCBoYXMgbm90IHlldAorCSAqIGJlZW4gY2xvbmVkIChtYXJrZWQgZHluYW1pYykKKwkgKi8KKwlpZiAoIShjLT5mbGFncyAmIFBFUkZfWDg2X0VWRU5UX0RZTkFNSUMpKSB7CisKKwkJLyogc2FuaXR5IGNoZWNrICovCisJCWlmIChpZHggPCAwKQorCQkJcmV0dXJuICZlbXB0eWNvbnN0cmFpbnQ7CisKKwkJLyoKKwkJICogZ3JhYiBwcmUtYWxsb2NhdGVkIGNvbnN0cmFpbnQgZW50cnkKKwkJICovCisJCWN4ID0gJmNwdWMtPmNvbnN0cmFpbnRfbGlzdFtpZHhdOworCisJCS8qCisJCSAqIGluaXRpYWxpemUgZHluYW1pYyBjb25zdHJhaW50CisJCSAqIHdpdGggc3RhdGljIGNvbnN0cmFpbnQKKwkJICovCisJCW1lbWNweShjeCwgYywgc2l6ZW9mKCpjeCkpOworCisJCS8qCisJCSAqIG1hcmsgY29uc3RyYWludCBhcyBkeW5hbWljLCBzbyB3ZQorCQkgKiBjYW4gZnJlZSBpdCBsYXRlciBvbgorCQkgKi8KKwkJY3gtPmZsYWdzIHw9IFBFUkZfWDg2X0VWRU5UX0RZTkFNSUM7CisJfQorCisJLyoKKwkgKiBGcm9tIGhlcmUgb24sIHRoZSBjb25zdHJhaW50IGlzIGR5bmFtaWMuCisJICogRWl0aGVyIGl0IHdhcyBqdXN0IGFsbG9jYXRlZCBhYm92ZSwgb3IgaXQKKwkgKiB3YXMgYWxsb2NhdGVkIGR1cmluZyBhIGVhcmxpZXIgaW52b2NhdGlvbgorCSAqIG9mIHRoaXMgZnVuY3Rpb24KKwkgKi8KKworCS8qCisJICogTW9kaWZ5IHN0YXRpYyBjb25zdHJhaW50IHdpdGggY3VycmVudCBkeW5hbWljCisJICogc3RhdGUgb2YgdGhyZWFkCisJICoKKwkgKiBFWENMVVNJVkU6IHNpYmxpbmcgY291bnRlciBtZWFzdXJpbmcgZXhjbHVzaXZlIGV2ZW50CisJICogU0hBUkVEICAgOiBzaWJsaW5nIGNvdW50ZXIgbWVhc3VyaW5nIG5vbi1leGNsdXNpdmUgZXZlbnQKKwkgKiBVTlVTRUQgICA6IHNpYmxpbmcgY291bnRlciB1bnVzZWQKKwkgKi8KKwlmb3JfZWFjaF9zZXRfYml0KGksIGN4LT5pZHhtc2ssIFg4Nl9QTUNfSURYX01BWCkgeworCQkvKgorCQkgKiBleGNsdXNpdmUgZXZlbnQgaW4gc2libGluZyBjb3VudGVyCisJCSAqIG91ciBjb3JyZXNwb25kaW5nIGNvdW50ZXIgY2Fubm90IGJlIHVzZWQKKwkJICogcmVnYXJkbGVzcyBvZiBvdXIgZXZlbnQKKwkJICovCisJCWlmICh4bC0+c3RhdGVbaV0gPT0gSU5URUxfRVhDTF9FWENMVVNJVkUpCisJCQlfX2NsZWFyX2JpdChpLCBjeC0+aWR4bXNrKTsKKwkJLyoKKwkJICogaWYgbWVhc3VyaW5nIGFuIGV4Y2x1c2l2ZSBldmVudCwgc2libGluZworCQkgKiBtZWFzdXJpbmcgbm9uLWV4Y2x1c2l2ZSwgdGhlbiBjb3VudGVyIGNhbm5vdAorCQkgKiBiZSB1c2VkCisJCSAqLworCQlpZiAoaXNfZXhjbCAmJiB4bC0+c3RhdGVbaV0gPT0gSU5URUxfRVhDTF9TSEFSRUQpCisJCQlfX2NsZWFyX2JpdChpLCBjeC0+aWR4bXNrKTsKKwl9CisKKwkvKgorCSAqIHJlY29tcHV0ZSBhY3R1YWwgYml0IHdlaWdodCBmb3Igc2NoZWR1bGluZyBhbGdvcml0aG0KKwkgKi8KKwljeC0+d2VpZ2h0ID0gaHdlaWdodDY0KGN4LT5pZHhtc2s2NCk7CisKKwkvKgorCSAqIGlmIHdlIHJldHVybiBhbiBlbXB0eSBtYXNrLCB0aGVuIHN3aXRjaAorCSAqIGJhY2sgdG8gc3RhdGljIGVtcHR5IGNvbnN0cmFpbnQgdG8gYXZvaWQKKwkgKiB0aGUgY29zdCBvZiBmcmVlaW5nIGxhdGVyIG9uCisJICovCisJaWYgKGN4LT53ZWlnaHQgPT0gMCkKKwkJY3ggPSAmZW1wdHljb25zdHJhaW50OworCisJcmV0dXJuIGN4OworfQorCitzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKgoraW50ZWxfZ2V0X2V2ZW50X2NvbnN0cmFpbnRzKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLCBpbnQgaWR4LAorCQkJICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqYzEgPSBldmVudC0+aHcuY29uc3RyYWludDsKKwlzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqYzI7CisKKwkvKgorCSAqIGZpcnN0IHRpbWUgb25seQorCSAqIC0gc3RhdGljIGNvbnN0cmFpbnQ6IG5vIGNoYW5nZSBhY3Jvc3MgaW5jcmVtZW50YWwgc2NoZWR1bGluZyBjYWxscworCSAqIC0gZHluYW1pYyBjb25zdHJhaW50OiBoYW5kbGVkIGJ5IGludGVsX2dldF9leGNsX2NvbnN0cmFpbnRzKCkKKwkgKi8KKwljMiA9IF9faW50ZWxfZ2V0X2V2ZW50X2NvbnN0cmFpbnRzKGNwdWMsIGlkeCwgZXZlbnQpOworCWlmIChjMSAmJiAoYzEtPmZsYWdzICYgUEVSRl9YODZfRVZFTlRfRFlOQU1JQykpIHsKKwkJYml0bWFwX2NvcHkoYzEtPmlkeG1zaywgYzItPmlkeG1zaywgWDg2X1BNQ19JRFhfTUFYKTsKKwkJYzEtPndlaWdodCA9IGMyLT53ZWlnaHQ7CisJCWMyID0gYzE7CisJfQorCisJaWYgKGNwdWMtPmV4Y2xfY250cnMpCisJCXJldHVybiBpbnRlbF9nZXRfZXhjbF9jb25zdHJhaW50cyhjcHVjLCBldmVudCwgaWR4LCBjMik7CisKKwlyZXR1cm4gYzI7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3B1dF9leGNsX2NvbnN0cmFpbnRzKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAorCQlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CisJc3RydWN0IGludGVsX2V4Y2xfY250cnMgKmV4Y2xfY250cnMgPSBjcHVjLT5leGNsX2NudHJzOworCXN0cnVjdCBpbnRlbF9leGNsX3N0YXRlcyAqeGxvLCAqeGw7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7IC8qIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KKwlpbnQgdGlkID0gY3B1Yy0+ZXhjbF90aHJlYWRfaWQ7CisJaW50IG9fdGlkID0gMSAtIHRpZDsKKworCS8qCisJICogbm90aGluZyBuZWVkZWQgaWYgaW4gZ3JvdXAgdmFsaWRhdGlvbiBtb2RlCisJICovCisJaWYgKGNwdWMtPmlzX2Zha2UpCisJCXJldHVybjsKKworCVdBUk5fT05fT05DRSghZXhjbF9jbnRycyk7CisKKwlpZiAoIWV4Y2xfY250cnMpCisJCXJldHVybjsKKworCXhsID0gJmV4Y2xfY250cnMtPnN0YXRlc1t0aWRdOworCXhsbyA9ICZleGNsX2NudHJzLT5zdGF0ZXNbb190aWRdOworCisJLyoKKwkgKiBwdXRfY29uc3RyYWludCBtYXkgYmUgY2FsbGVkIGZyb20geDg2X3NjaGVkdWxlX2V2ZW50cygpCisJICogd2hpY2ggYWxyZWFkeSBoYXMgdGhlIGxvY2sgaGVsZCBzbyBoZXJlIG1ha2UgbG9ja2luZworCSAqIGNvbmRpdGlvbmFsCisJICovCisJaWYgKCF4bC0+c2NoZWRfc3RhcnRlZCkKKwkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZleGNsX2NudHJzLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIGlmIGV2ZW50IHdhcyBhY3R1YWxseSBhc3NpZ25lZCwgdGhlbiBtYXJrIHRoZQorCSAqIGNvdW50ZXIgc3RhdGUgYXMgdW51c2VkIG5vdworCSAqLworCWlmIChod2MtPmlkeCA+PSAwKQorCQl4bG8tPnN0YXRlW2h3Yy0+aWR4XSA9IElOVEVMX0VYQ0xfVU5VU0VEOworCisJaWYgKCF4bC0+c2NoZWRfc3RhcnRlZCkKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmV4Y2xfY250cnMtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTE2NzgsNyArMjE4OSw1NyBAQAogc3RhdGljIHZvaWQgaW50ZWxfcHV0X2V2ZW50X2NvbnN0cmFpbnRzKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAogCQkJCQlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CisJc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKmMgPSBldmVudC0+aHcuY29uc3RyYWludDsKKwogCWludGVsX3B1dF9zaGFyZWRfcmVnc19ldmVudF9jb25zdHJhaW50cyhjcHVjLCBldmVudCk7CisKKwkvKgorCSAqIGlzIFBNVSBoYXMgZXhjbHVzaXZlIGNvdW50ZXIgcmVzdHJpY3Rpb25zLCB0aGVuCisJICogYWxsIGV2ZW50cyBhcmUgc3ViamVjdCB0byBhbmQgbXVzdCBjYWxsIHRoZQorCSAqIHB1dF9leGNsX2NvbnN0cmFpbnRzKCkgcm91dGluZQorCSAqLworCWlmIChjICYmIGNwdWMtPmV4Y2xfY250cnMpCisJCWludGVsX3B1dF9leGNsX2NvbnN0cmFpbnRzKGNwdWMsIGV2ZW50KTsKKworCS8qIGNsZWFudXAgZHluYW1pYyBjb25zdHJhaW50ICovCisJaWYgKGMgJiYgKGMtPmZsYWdzICYgUEVSRl9YODZfRVZFTlRfRFlOQU1JQykpCisJCWV2ZW50LT5ody5jb25zdHJhaW50ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfY29tbWl0X3NjaGVkdWxpbmcoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMsCisJCQkJICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGNudHIpCit7CisJc3RydWN0IGludGVsX2V4Y2xfY250cnMgKmV4Y2xfY250cnMgPSBjcHVjLT5leGNsX2NudHJzOworCXN0cnVjdCBldmVudF9jb25zdHJhaW50ICpjID0gZXZlbnQtPmh3LmNvbnN0cmFpbnQ7CisJc3RydWN0IGludGVsX2V4Y2xfc3RhdGVzICp4bG8sICp4bDsKKwlpbnQgdGlkID0gY3B1Yy0+ZXhjbF90aHJlYWRfaWQ7CisJaW50IG9fdGlkID0gMSAtIHRpZDsKKwlpbnQgaXNfZXhjbDsKKworCWlmIChjcHVjLT5pc19mYWtlIHx8ICFjKQorCQlyZXR1cm47CisKKwlpc19leGNsID0gYy0+ZmxhZ3MgJiBQRVJGX1g4Nl9FVkVOVF9FWENMOworCisJaWYgKCEoYy0+ZmxhZ3MgJiBQRVJGX1g4Nl9FVkVOVF9EWU5BTUlDKSkKKwkJcmV0dXJuOworCisJV0FSTl9PTl9PTkNFKCFleGNsX2NudHJzKTsKKworCWlmICghZXhjbF9jbnRycykKKwkJcmV0dXJuOworCisJeGwgPSAmZXhjbF9jbnRycy0+c3RhdGVzW3RpZF07CisJeGxvID0gJmV4Y2xfY250cnMtPnN0YXRlc1tvX3RpZF07CisKKwlXQVJOX09OX09OQ0UoIXJhd19zcGluX2lzX2xvY2tlZCgmZXhjbF9jbnRycy0+bG9jaykpOworCisJaWYgKGNudHIgPj0gMCkgeworCQlpZiAoaXNfZXhjbCkKKwkJCXhsby0+aW5pdF9zdGF0ZVtjbnRyXSA9IElOVEVMX0VYQ0xfRVhDTFVTSVZFOworCQllbHNlCisJCQl4bG8tPmluaXRfc3RhdGVbY250cl0gPSBJTlRFTF9FWENMX1NIQVJFRDsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGludGVsX3BlYnNfYWxpYXNlc19jb3JlMihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCkBAIC0xNzQ3LDEwICsyMzA4LDIxIEBACiAJaWYgKGV2ZW50LT5hdHRyLnByZWNpc2VfaXAgJiYgeDg2X3BtdS5wZWJzX2FsaWFzZXMpCiAJCXg4Nl9wbXUucGVic19hbGlhc2VzKGV2ZW50KTsKIAotCWlmIChpbnRlbF9wbXVfbmVlZHNfbGJyX3NtcGwoZXZlbnQpKSB7CisJaWYgKG5lZWRzX2JyYW5jaF9zdGFjayhldmVudCkpIHsKIAkJcmV0ID0gaW50ZWxfcG11X3NldHVwX2xicl9maWx0ZXIoZXZlbnQpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKKworCQkvKgorCQkgKiBCVFMgaXMgc2V0IHVwIGVhcmxpZXIgaW4gdGhpcyBwYXRoLCBzbyBkb24ndCBhY2NvdW50IHR3aWNlCisJCSAqLworCQlpZiAoIWludGVsX3BtdV9oYXNfYnRzKGV2ZW50KSkgeworCQkJLyogZGlzYWxsb3cgbGJyIGlmIGNvbmZsaWN0aW5nIGV2ZW50cyBhcmUgcHJlc2VudCAqLworCQkJaWYgKHg4Nl9hZGRfZXhjbHVzaXZlKHg4Nl9sYnJfZXhjbHVzaXZlX2xicikpCisJCQkJcmV0dXJuIC1FQlVTWTsKKworCQkJZXZlbnQtPmRlc3Ryb3kgPSBod19wZXJmX2xicl9ldmVudF9kZXN0cm95OworCQl9CiAJfQogCiAJaWYgKGV2ZW50LT5hdHRyLnR5cGUgIT0gUEVSRl9UWVBFX1JBVykKQEAgLTE4OTEsOSArMjQ2MywxMiBAQAogCQkJRVZFTlRfQ09OU1RSQUlOVCgwLCAweDQsIDApOwogCiBzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKgotaHN3X2dldF9ldmVudF9jb25zdHJhaW50cyhzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1Yywgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoraHN3X2dldF9ldmVudF9jb25zdHJhaW50cyhzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywgaW50IGlkeCwKKwkJCSAgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewotCXN0cnVjdCBldmVudF9jb25zdHJhaW50ICpjID0gaW50ZWxfZ2V0X2V2ZW50X2NvbnN0cmFpbnRzKGNwdWMsIGV2ZW50KTsKKwlzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqYzsKKworCWMgPSBpbnRlbF9nZXRfZXZlbnRfY29uc3RyYWludHMoY3B1YywgaWR4LCBldmVudCk7CiAKIAkvKiBIYW5kbGUgc3BlY2lhbCBxdWlyayBvbiBpbl90eF9jaGVja3BvaW50ZWQgb25seSBpbiBjb3VudGVyIDIgKi8KIAlpZiAoZXZlbnQtPmh3LmNvbmZpZyAmIEhTV19JTl9UWF9DSEVDS1BPSU5URUQpIHsKQEAgLTE5MDUsNiArMjQ4MCwzMiBAQAogCXJldHVybiBjOwogfQogCisvKgorICogQnJvYWR3ZWxsOgorICoKKyAqIFRoZSBJTlNUX1JFVElSRUQuQUxMIHBlcmlvZCBhbHdheXMgbmVlZHMgdG8gaGF2ZSBsb3dlc3QgNiBiaXRzIGNsZWFyZWQKKyAqIChCRE01NSkgYW5kIGl0IG11c3Qgbm90IHVzZSBhIHBlcmlvZCBzbWFsbGVyIHRoYW4gMTAwIChCRE0xMSkuIFdlIGNvbWJpbmUKKyAqIHRoZSB0d28gdG8gZW5mb3JjZSBhIG1pbmltdW0gcGVyaW9kIG9mIDEyOCAodGhlIHNtYWxsZXN0IHZhbHVlIHRoYXQgaGFzIGJpdHMKKyAqIDAtNSBjbGVhcmVkIGFuZCA+PSAxMDApLgorICoKKyAqIEJlY2F1c2Ugb2YgaG93IHRoZSBjb2RlIGluIHg4Nl9wZXJmX2V2ZW50X3NldF9wZXJpb2QoKSB3b3JrcywgdGhlIHRydW5jYXRpb24KKyAqIG9mIHRoZSBsb3dlciA2IGJpdHMgaXMgJ2hhcm1sZXNzJyBhcyB3ZSdsbCBvY2Nhc2lvbmFsbHkgYWRkIGEgbG9uZ2VyIHBlcmlvZAorICogdG8gbWFrZSB1cCBmb3IgdGhlICdsb3N0JyBldmVudHMgZHVlIHRvIGNhcnJ5aW5nIHRoZSAnZXJyb3InIGluIHBlcmlvZF9sZWZ0LgorICoKKyAqIFRoZXJlZm9yZSB0aGUgZWZmZWN0aXZlIChhdmVyYWdlKSBwZXJpb2QgbWF0Y2hlcyB0aGUgcmVxdWVzdGVkIHBlcmlvZCwKKyAqIGRlc3BpdGUgY29hcnNlciBoYXJkd2FyZSBncmFudWxhcml0eS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGJkd19saW1pdF9wZXJpb2Qoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1bnNpZ25lZCBsZWZ0KQoreworCWlmICgoZXZlbnQtPmh3LmNvbmZpZyAmIElOVEVMX0FSQ0hfRVZFTlRfTUFTSykgPT0KKwkJCVg4Nl9DT05GSUcoLmV2ZW50PTB4YzAsIC51bWFzaz0weDAxKSkgeworCQlpZiAobGVmdCA8IDEyOCkKKwkJCWxlZnQgPSAxMjg7CisJCWxlZnQgJj0gfjB4M2Z1OworCX0KKwlyZXR1cm4gbGVmdDsKK30KKwogUE1VX0ZPUk1BVF9BVFRSKGV2ZW50LAkiY29uZmlnOjAtNyIJKTsKIFBNVV9GT1JNQVRfQVRUUih1bWFzaywJImNvbmZpZzo4LTE1IgkpOwogUE1VX0ZPUk1BVF9BVFRSKGVkZ2UsCSJjb25maWc6MTgiCSk7CkBAIC0xOTc5LDE2ICsyNTgwLDUyIEBACiAJcmV0dXJuIHJlZ3M7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfZXhjbF9jbnRycyAqYWxsb2NhdGVfZXhjbF9jbnRycyhpbnQgY3B1KQoreworCXN0cnVjdCBpbnRlbF9leGNsX2NudHJzICpjOworCWludCBpOworCisJYyA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGludGVsX2V4Y2xfY250cnMpLAorCQkJIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGNwdSkpOworCWlmIChjKSB7CisJCXJhd19zcGluX2xvY2tfaW5pdCgmYy0+bG9jayk7CisJCWZvciAoaSA9IDA7IGkgPCBYODZfUE1DX0lEWF9NQVg7IGkrKykgeworCQkJYy0+c3RhdGVzWzBdLnN0YXRlW2ldID0gSU5URUxfRVhDTF9VTlVTRUQ7CisJCQljLT5zdGF0ZXNbMF0uaW5pdF9zdGF0ZVtpXSA9IElOVEVMX0VYQ0xfVU5VU0VEOworCisJCQljLT5zdGF0ZXNbMV0uc3RhdGVbaV0gPSBJTlRFTF9FWENMX1VOVVNFRDsKKwkJCWMtPnN0YXRlc1sxXS5pbml0X3N0YXRlW2ldID0gSU5URUxfRVhDTF9VTlVTRUQ7CisJCX0KKwkJYy0+Y29yZV9pZCA9IC0xOworCX0KKwlyZXR1cm4gYzsKK30KKwogc3RhdGljIGludCBpbnRlbF9wbXVfY3B1X3ByZXBhcmUoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9ICZwZXJfY3B1KGNwdV9od19ldmVudHMsIGNwdSk7CiAKLQlpZiAoISh4ODZfcG11LmV4dHJhX3JlZ3MgfHwgeDg2X3BtdS5sYnJfc2VsX21hcCkpCi0JCXJldHVybiBOT1RJRllfT0s7CisJaWYgKHg4Nl9wbXUuZXh0cmFfcmVncyB8fCB4ODZfcG11Lmxicl9zZWxfbWFwKSB7CisJCWNwdWMtPnNoYXJlZF9yZWdzID0gYWxsb2NhdGVfc2hhcmVkX3JlZ3MoY3B1KTsKKwkJaWYgKCFjcHVjLT5zaGFyZWRfcmVncykKKwkJCXJldHVybiBOT1RJRllfQkFEOworCX0KIAotCWNwdWMtPnNoYXJlZF9yZWdzID0gYWxsb2NhdGVfc2hhcmVkX3JlZ3MoY3B1KTsKLQlpZiAoIWNwdWMtPnNoYXJlZF9yZWdzKQotCQlyZXR1cm4gTk9USUZZX0JBRDsKKwlpZiAoeDg2X3BtdS5mbGFncyAmIFBNVV9GTF9FWENMX0NOVFJTKSB7CisJCXNpemVfdCBzeiA9IFg4Nl9QTUNfSURYX01BWCAqIHNpemVvZihzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCk7CisKKwkJY3B1Yy0+Y29uc3RyYWludF9saXN0ID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJCWlmICghY3B1Yy0+Y29uc3RyYWludF9saXN0KQorCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisKKwkJY3B1Yy0+ZXhjbF9jbnRycyA9IGFsbG9jYXRlX2V4Y2xfY250cnMoY3B1KTsKKwkJaWYgKCFjcHVjLT5leGNsX2NudHJzKSB7CisJCQlrZnJlZShjcHVjLT5jb25zdHJhaW50X2xpc3QpOworCQkJa2ZyZWUoY3B1Yy0+c2hhcmVkX3JlZ3MpOworCQkJcmV0dXJuIE5PVElGWV9CQUQ7CisJCX0KKwkJY3B1Yy0+ZXhjbF90aHJlYWRfaWQgPSAwOworCX0KIAogCXJldHVybiBOT1RJRllfT0s7CiB9CkBAIC0yMDEwLDEzICsyNjQ3LDE1IEBACiAJaWYgKCFjcHVjLT5zaGFyZWRfcmVncykKIAkJcmV0dXJuOwogCi0JaWYgKCEoeDg2X3BtdS5lcl9mbGFncyAmIEVSRl9OT19IVF9TSEFSSU5HKSkgeworCWlmICghKHg4Nl9wbXUuZmxhZ3MgJiBQTVVfRkxfTk9fSFRfU0hBUklORykpIHsKKwkJdm9pZCAqKm9ubG4gPSAmY3B1Yy0+a2ZyZWVfb25fb25saW5lW1g4Nl9QRVJGX0tGUkVFX1NIQVJFRF07CisKIAkJZm9yX2VhY2hfY3B1KGksIHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKGNwdSkpIHsKIAkJCXN0cnVjdCBpbnRlbF9zaGFyZWRfcmVncyAqcGM7CiAKIAkJCXBjID0gcGVyX2NwdShjcHVfaHdfZXZlbnRzLCBpKS5zaGFyZWRfcmVnczsKIAkJCWlmIChwYyAmJiBwYy0+Y29yZV9pZCA9PSBjb3JlX2lkKSB7Ci0JCQkJY3B1Yy0+a2ZyZWVfb25fb25saW5lID0gY3B1Yy0+c2hhcmVkX3JlZ3M7CisJCQkJKm9ubG4gPSBjcHVjLT5zaGFyZWRfcmVnczsKIAkJCQljcHVjLT5zaGFyZWRfcmVncyA9IHBjOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjAyNyw2ICsyNjY2LDQ0IEBACiAKIAlpZiAoeDg2X3BtdS5sYnJfc2VsX21hcCkKIAkJY3B1Yy0+bGJyX3NlbCA9ICZjcHVjLT5zaGFyZWRfcmVncy0+cmVnc1tFWFRSQV9SRUdfTEJSXTsKKworCWlmICh4ODZfcG11LmZsYWdzICYgUE1VX0ZMX0VYQ0xfQ05UUlMpIHsKKwkJaW50IGggPSB4ODZfcG11Lm51bV9jb3VudGVycyA+PiAxOworCisJCWZvcl9lYWNoX2NwdShpLCB0b3BvbG9neV90aHJlYWRfY3B1bWFzayhjcHUpKSB7CisJCQlzdHJ1Y3QgaW50ZWxfZXhjbF9jbnRycyAqYzsKKworCQkJYyA9IHBlcl9jcHUoY3B1X2h3X2V2ZW50cywgaSkuZXhjbF9jbnRyczsKKwkJCWlmIChjICYmIGMtPmNvcmVfaWQgPT0gY29yZV9pZCkgeworCQkJCWNwdWMtPmtmcmVlX29uX29ubGluZVsxXSA9IGNwdWMtPmV4Y2xfY250cnM7CisJCQkJY3B1Yy0+ZXhjbF9jbnRycyA9IGM7CisJCQkJY3B1Yy0+ZXhjbF90aHJlYWRfaWQgPSAxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWNwdWMtPmV4Y2xfY250cnMtPmNvcmVfaWQgPSBjb3JlX2lkOworCQljcHVjLT5leGNsX2NudHJzLT5yZWZjbnQrKzsKKwkJLyoKKwkJICogc2V0IGhhcmQgbGltaXQgdG8gaGFsZiB0aGUgbnVtYmVyIG9mIGdlbmVyaWMgY291bnRlcnMKKwkJICovCisJCWNwdWMtPmV4Y2xfY250cnMtPnN0YXRlc1swXS5tYXhfYWxsb2NfY250cnMgPSBoOworCQljcHVjLT5leGNsX2NudHJzLT5zdGF0ZXNbMV0ubWF4X2FsbG9jX2NudHJzID0gaDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfZXhjbF9jbnRycyhpbnQgY3B1KQoreworCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gJnBlcl9jcHUoY3B1X2h3X2V2ZW50cywgY3B1KTsKKwlzdHJ1Y3QgaW50ZWxfZXhjbF9jbnRycyAqYzsKKworCWMgPSBjcHVjLT5leGNsX2NudHJzOworCWlmIChjKSB7CisJCWlmIChjLT5jb3JlX2lkID09IC0xIHx8IC0tYy0+cmVmY250ID09IDApCisJCQlrZnJlZShjKTsKKwkJY3B1Yy0+ZXhjbF9jbnRycyA9IE5VTEw7CisJCWtmcmVlKGNwdWMtPmNvbnN0cmFpbnRfbGlzdCk7CisJCWNwdWMtPmNvbnN0cmFpbnRfbGlzdCA9IE5VTEw7CisJfQogfQogCiBzdGF0aWMgdm9pZCBpbnRlbF9wbXVfY3B1X2R5aW5nKGludCBjcHUpCkBAIC0yMDQxLDE5ICsyNzE4LDkgQEAKIAkJY3B1Yy0+c2hhcmVkX3JlZ3MgPSBOVUxMOwogCX0KIAotCWZpbmlfZGVidWdfc3RvcmVfb25fY3B1KGNwdSk7Ci19CisJZnJlZV9leGNsX2NudHJzKGNwdSk7CiAKLXN0YXRpYyB2b2lkIGludGVsX3BtdV9mbHVzaF9icmFuY2hfc3RhY2sodm9pZCkKLXsKLQkvKgotCSAqIEludGVsIExCUiBkb2VzIG5vdCB0YWcgZW50cmllcyB3aXRoIHRoZQotCSAqIFBJRCBvZiB0aGUgY3VycmVudCB0YXNrLCB0aGVuIHdlIG5lZWQgdG8KLQkgKiBmbHVzaCBpdCBvbiBjdHhzdwotCSAqIEZvciBub3csIHdlIHNpbXBseSByZXNldCBpdAotCSAqLwotCWlmICh4ODZfcG11Lmxicl9ucikKLQkJaW50ZWxfcG11X2xicl9yZXNldCgpOworCWZpbmlfZGVidWdfc3RvcmVfb25fY3B1KGNwdSk7CiB9CiAKIFBNVV9GT1JNQVRfQVRUUihvZmZjb3JlX3JzcCwgImNvbmZpZzE6MC02MyIpOwpAQCAtMjEwNyw3ICsyNzc0LDcgQEAKIAkuY3B1X3N0YXJ0aW5nCQk9IGludGVsX3BtdV9jcHVfc3RhcnRpbmcsCiAJLmNwdV9keWluZwkJPSBpbnRlbF9wbXVfY3B1X2R5aW5nLAogCS5ndWVzdF9nZXRfbXNycwkJPSBpbnRlbF9ndWVzdF9nZXRfbXNycywKLQkuZmx1c2hfYnJhbmNoX3N0YWNrCT0gaW50ZWxfcG11X2ZsdXNoX2JyYW5jaF9zdGFjaywKKwkuc2NoZWRfdGFzawkJPSBpbnRlbF9wbXVfbGJyX3NjaGVkX3Rhc2ssCiB9OwogCiBzdGF0aWMgX19pbml0IHZvaWQgaW50ZWxfY2xvdmVydG93bl9xdWlyayh2b2lkKQpAQCAtMjI2NCw2ICsyOTMxLDI3IEBACiAJfQogfQogCisvKgorICogZW5hYmxlIHNvZnR3YXJlIHdvcmthcm91bmQgZm9yIGVycmF0YToKKyAqIFNOQjogQkoxMjIKKyAqIElWQjogQlY5OAorICogSFNXOiBIU0QyOQorICoKKyAqIE9ubHkgbmVlZGVkIHdoZW4gSFQgaXMgZW5hYmxlZC4gSG93ZXZlciBkZXRlY3RpbmcKKyAqIGlmIEhUIGlzIGVuYWJsZWQgaXMgZGlmZmljdWx0IChtb2RlbCBzcGVjaWZpYykuIFNvIGluc3RlYWQsCisgKiB3ZSBlbmFibGUgdGhlIHdvcmthcm91bmQgaW4gdGhlIGVhcmx5IGJvb3QsIGFuZCB2ZXJpZnkgaWYKKyAqIGl0IGlzIG5lZWRlZCBpbiBhIGxhdGVyIGluaXRjYWxsIHBoYXNlIG9uY2Ugd2UgaGF2ZSB2YWxpZAorICogdG9wb2xvZ3kgaW5mb3JtYXRpb24gdG8gY2hlY2sgaWYgSFQgaXMgYWN0dWFsbHkgZW5hYmxlZAorICovCitzdGF0aWMgX19pbml0IHZvaWQgaW50ZWxfaHRfYnVnKHZvaWQpCit7CisJeDg2X3BtdS5mbGFncyB8PSBQTVVfRkxfRVhDTF9DTlRSUyB8IFBNVV9GTF9FWENMX0VOQUJMRUQ7CisKKwl4ODZfcG11LmNvbW1pdF9zY2hlZHVsaW5nID0gaW50ZWxfY29tbWl0X3NjaGVkdWxpbmc7CisJeDg2X3BtdS5zdGFydF9zY2hlZHVsaW5nID0gaW50ZWxfc3RhcnRfc2NoZWR1bGluZzsKKwl4ODZfcG11LnN0b3Bfc2NoZWR1bGluZyA9IGludGVsX3N0b3Bfc2NoZWR1bGluZzsKK30KKwogRVZFTlRfQVRUUl9TVFIobWVtLWxvYWRzLAltZW1fbGRfaHN3LAkiZXZlbnQ9MHhjZCx1bWFzaz0weDEsbGRsYXQ9MyIpOwogRVZFTlRfQVRUUl9TVFIobWVtLXN0b3JlcywJbWVtX3N0X2hzdywJImV2ZW50PTB4ZDAsdW1hc2s9MHg4MiIpCiAKQEAgLTI0NDMsNyArMzEzMSw3IEBACiAJCXg4Nl9wbXUuZXZlbnRfY29uc3RyYWludHMgPSBpbnRlbF9zbG1fZXZlbnRfY29uc3RyYWludHM7CiAJCXg4Nl9wbXUucGVic19jb25zdHJhaW50cyA9IGludGVsX3NsbV9wZWJzX2V2ZW50X2NvbnN0cmFpbnRzOwogCQl4ODZfcG11LmV4dHJhX3JlZ3MgPSBpbnRlbF9zbG1fZXh0cmFfcmVnczsKLQkJeDg2X3BtdS5lcl9mbGFncyB8PSBFUkZfSEFTX1JTUF8xOworCQl4ODZfcG11LmZsYWdzIHw9IFBNVV9GTF9IQVNfUlNQXzE7CiAJCXByX2NvbnQoIlNpbHZlcm1vbnQgZXZlbnRzLCAiKTsKIAkJYnJlYWs7CiAKQEAgLTI0NjEsNyArMzE0OSw3IEBACiAJCXg4Nl9wbXUuZW5hYmxlX2FsbCA9IGludGVsX3BtdV9uaG1fZW5hYmxlX2FsbDsKIAkJeDg2X3BtdS5wZWJzX2NvbnN0cmFpbnRzID0gaW50ZWxfd2VzdG1lcmVfcGVic19ldmVudF9jb25zdHJhaW50czsKIAkJeDg2X3BtdS5leHRyYV9yZWdzID0gaW50ZWxfd2VzdG1lcmVfZXh0cmFfcmVnczsKLQkJeDg2X3BtdS5lcl9mbGFncyB8PSBFUkZfSEFTX1JTUF8xOworCQl4ODZfcG11LmZsYWdzIHw9IFBNVV9GTF9IQVNfUlNQXzE7CiAKIAkJeDg2X3BtdS5jcHVfZXZlbnRzID0gbmhtX2V2ZW50c19hdHRyczsKIApAQCAtMjQ3OCw2ICszMTY2LDcgQEAKIAljYXNlIDQyOiAvKiAzMm5tIFNhbmR5QnJpZGdlICAgICAgICAgKi8KIAljYXNlIDQ1OiAvKiAzMm5tIFNhbmR5QnJpZGdlLUUvRU4vRVAgKi8KIAkJeDg2X2FkZF9xdWlyayhpbnRlbF9zYW5keWJyaWRnZV9xdWlyayk7CisJCXg4Nl9hZGRfcXVpcmsoaW50ZWxfaHRfYnVnKTsKIAkJbWVtY3B5KGh3X2NhY2hlX2V2ZW50X2lkcywgc25iX2h3X2NhY2hlX2V2ZW50X2lkcywKIAkJICAgICAgIHNpemVvZihod19jYWNoZV9ldmVudF9pZHMpKTsKIAkJbWVtY3B5KGh3X2NhY2hlX2V4dHJhX3JlZ3MsIHNuYl9od19jYWNoZV9leHRyYV9yZWdzLApAQCAtMjQ5Miw5ICszMTgxLDExIEBACiAJCQl4ODZfcG11LmV4dHJhX3JlZ3MgPSBpbnRlbF9zbmJlcF9leHRyYV9yZWdzOwogCQllbHNlCiAJCQl4ODZfcG11LmV4dHJhX3JlZ3MgPSBpbnRlbF9zbmJfZXh0cmFfcmVnczsKKworCiAJCS8qIGFsbCBleHRyYSByZWdzIGFyZSBwZXItY3B1IHdoZW4gSFQgaXMgb24gKi8KLQkJeDg2X3BtdS5lcl9mbGFncyB8PSBFUkZfSEFTX1JTUF8xOwotCQl4ODZfcG11LmVyX2ZsYWdzIHw9IEVSRl9OT19IVF9TSEFSSU5HOworCQl4ODZfcG11LmZsYWdzIHw9IFBNVV9GTF9IQVNfUlNQXzE7CisJCXg4Nl9wbXUuZmxhZ3MgfD0gUE1VX0ZMX05PX0hUX1NIQVJJTkc7CiAKIAkJeDg2X3BtdS5jcHVfZXZlbnRzID0gc25iX2V2ZW50c19hdHRyczsKIApAQCAtMjUxMCw2ICszMjAxLDcgQEAKIAogCWNhc2UgNTg6IC8qIDIybm0gSXZ5QnJpZGdlICAgICAgICovCiAJY2FzZSA2MjogLyogMjJubSBJdnlCcmlkZ2UtRVAvRVggKi8KKwkJeDg2X2FkZF9xdWlyayhpbnRlbF9odF9idWcpOwogCQltZW1jcHkoaHdfY2FjaGVfZXZlbnRfaWRzLCBzbmJfaHdfY2FjaGVfZXZlbnRfaWRzLAogCQkgICAgICAgc2l6ZW9mKGh3X2NhY2hlX2V2ZW50X2lkcykpOwogCQkvKiBkVExCLWxvYWQtbWlzc2VzIG9uIElWQiBpcyBkaWZmZXJlbnQgdGhhbiBTTkIgKi8KQEAgLTI1MjgsOCArMzIyMCw4IEBACiAJCWVsc2UKIAkJCXg4Nl9wbXUuZXh0cmFfcmVncyA9IGludGVsX3NuYl9leHRyYV9yZWdzOwogCQkvKiBhbGwgZXh0cmEgcmVncyBhcmUgcGVyLWNwdSB3aGVuIEhUIGlzIG9uICovCi0JCXg4Nl9wbXUuZXJfZmxhZ3MgfD0gRVJGX0hBU19SU1BfMTsKLQkJeDg2X3BtdS5lcl9mbGFncyB8PSBFUkZfTk9fSFRfU0hBUklORzsKKwkJeDg2X3BtdS5mbGFncyB8PSBQTVVfRkxfSEFTX1JTUF8xOworCQl4ODZfcG11LmZsYWdzIHw9IFBNVV9GTF9OT19IVF9TSEFSSU5HOwogCiAJCXg4Nl9wbXUuY3B1X2V2ZW50cyA9IHNuYl9ldmVudHNfYXR0cnM7CiAKQEAgLTI1NDUsMTkgKzMyMzcsMjAgQEAKIAljYXNlIDYzOiAvKiAyMm5tIEhhc3dlbGwgU2VydmVyICovCiAJY2FzZSA2OTogLyogMjJubSBIYXN3ZWxsIFVMVCAqLwogCWNhc2UgNzA6IC8qIDIybm0gSGFzd2VsbCArIEdUM2UgKEludGVsIElyaXMgUHJvIGdyYXBoaWNzKSAqLworCQl4ODZfYWRkX3F1aXJrKGludGVsX2h0X2J1Zyk7CiAJCXg4Nl9wbXUubGF0ZV9hY2sgPSB0cnVlOwotCQltZW1jcHkoaHdfY2FjaGVfZXZlbnRfaWRzLCBzbmJfaHdfY2FjaGVfZXZlbnRfaWRzLCBzaXplb2YoaHdfY2FjaGVfZXZlbnRfaWRzKSk7Ci0JCW1lbWNweShod19jYWNoZV9leHRyYV9yZWdzLCBzbmJfaHdfY2FjaGVfZXh0cmFfcmVncywgc2l6ZW9mKGh3X2NhY2hlX2V4dHJhX3JlZ3MpKTsKKwkJbWVtY3B5KGh3X2NhY2hlX2V2ZW50X2lkcywgaHN3X2h3X2NhY2hlX2V2ZW50X2lkcywgc2l6ZW9mKGh3X2NhY2hlX2V2ZW50X2lkcykpOworCQltZW1jcHkoaHdfY2FjaGVfZXh0cmFfcmVncywgaHN3X2h3X2NhY2hlX2V4dHJhX3JlZ3MsIHNpemVvZihod19jYWNoZV9leHRyYV9yZWdzKSk7CiAKLQkJaW50ZWxfcG11X2xicl9pbml0X3NuYigpOworCQlpbnRlbF9wbXVfbGJyX2luaXRfaHN3KCk7CiAKIAkJeDg2X3BtdS5ldmVudF9jb25zdHJhaW50cyA9IGludGVsX2hzd19ldmVudF9jb25zdHJhaW50czsKIAkJeDg2X3BtdS5wZWJzX2NvbnN0cmFpbnRzID0gaW50ZWxfaHN3X3BlYnNfZXZlbnRfY29uc3RyYWludHM7CiAJCXg4Nl9wbXUuZXh0cmFfcmVncyA9IGludGVsX3NuYmVwX2V4dHJhX3JlZ3M7CiAJCXg4Nl9wbXUucGVic19hbGlhc2VzID0gaW50ZWxfcGVic19hbGlhc2VzX3NuYjsKIAkJLyogYWxsIGV4dHJhIHJlZ3MgYXJlIHBlci1jcHUgd2hlbiBIVCBpcyBvbiAqLwotCQl4ODZfcG11LmVyX2ZsYWdzIHw9IEVSRl9IQVNfUlNQXzE7Ci0JCXg4Nl9wbXUuZXJfZmxhZ3MgfD0gRVJGX05PX0hUX1NIQVJJTkc7CisJCXg4Nl9wbXUuZmxhZ3MgfD0gUE1VX0ZMX0hBU19SU1BfMTsKKwkJeDg2X3BtdS5mbGFncyB8PSBQTVVfRkxfTk9fSFRfU0hBUklORzsKIAogCQl4ODZfcG11Lmh3X2NvbmZpZyA9IGhzd19od19jb25maWc7CiAJCXg4Nl9wbXUuZ2V0X2V2ZW50X2NvbnN0cmFpbnRzID0gaHN3X2dldF9ldmVudF9jb25zdHJhaW50czsKQEAgLTI1NjYsNiArMzI1OSwzOSBAQAogCQlwcl9jb250KCJIYXN3ZWxsIGV2ZW50cywgIik7CiAJCWJyZWFrOwogCisJY2FzZSA2MTogLyogMTRubSBCcm9hZHdlbGwgQ29yZS1NICovCisJY2FzZSA4NjogLyogMTRubSBCcm9hZHdlbGwgWGVvbiBEICovCisJCXg4Nl9wbXUubGF0ZV9hY2sgPSB0cnVlOworCQltZW1jcHkoaHdfY2FjaGVfZXZlbnRfaWRzLCBoc3dfaHdfY2FjaGVfZXZlbnRfaWRzLCBzaXplb2YoaHdfY2FjaGVfZXZlbnRfaWRzKSk7CisJCW1lbWNweShod19jYWNoZV9leHRyYV9yZWdzLCBoc3dfaHdfY2FjaGVfZXh0cmFfcmVncywgc2l6ZW9mKGh3X2NhY2hlX2V4dHJhX3JlZ3MpKTsKKworCQkvKiBMM19NSVNTX0xPQ0FMX0RSQU0gaXMgQklUKDI2KSBpbiBCcm9hZHdlbGwgKi8KKwkJaHdfY2FjaGVfZXh0cmFfcmVnc1tDKExMKV1bQyhPUF9SRUFEKV1bQyhSRVNVTFRfTUlTUyldID0gSFNXX0RFTUFORF9SRUFEIHwKKwkJCQkJCQkJCSBCRFdfTDNfTUlTU3xIU1dfU05PT1BfRFJBTTsKKwkJaHdfY2FjaGVfZXh0cmFfcmVnc1tDKExMKV1bQyhPUF9XUklURSldW0MoUkVTVUxUX01JU1MpXSA9IEhTV19ERU1BTkRfV1JJVEV8QkRXX0wzX01JU1N8CisJCQkJCQkJCQkgIEhTV19TTk9PUF9EUkFNOworCQlod19jYWNoZV9leHRyYV9yZWdzW0MoTk9ERSldW0MoT1BfUkVBRCldW0MoUkVTVUxUX0FDQ0VTUyldID0gSFNXX0RFTUFORF9SRUFEfAorCQkJCQkJCQkJICAgICBCRFdfTDNfTUlTU19MT0NBTHxIU1dfU05PT1BfRFJBTTsKKwkJaHdfY2FjaGVfZXh0cmFfcmVnc1tDKE5PREUpXVtDKE9QX1dSSVRFKV1bQyhSRVNVTFRfQUNDRVNTKV0gPSBIU1dfREVNQU5EX1dSSVRFfAorCQkJCQkJCQkJICAgICAgQkRXX0wzX01JU1NfTE9DQUx8SFNXX1NOT09QX0RSQU07CisKKwkJaW50ZWxfcG11X2xicl9pbml0X3NuYigpOworCisJCXg4Nl9wbXUuZXZlbnRfY29uc3RyYWludHMgPSBpbnRlbF9iZHdfZXZlbnRfY29uc3RyYWludHM7CisJCXg4Nl9wbXUucGVic19jb25zdHJhaW50cyA9IGludGVsX2hzd19wZWJzX2V2ZW50X2NvbnN0cmFpbnRzOworCQl4ODZfcG11LmV4dHJhX3JlZ3MgPSBpbnRlbF9zbmJlcF9leHRyYV9yZWdzOworCQl4ODZfcG11LnBlYnNfYWxpYXNlcyA9IGludGVsX3BlYnNfYWxpYXNlc19zbmI7CisJCS8qIGFsbCBleHRyYSByZWdzIGFyZSBwZXItY3B1IHdoZW4gSFQgaXMgb24gKi8KKwkJeDg2X3BtdS5mbGFncyB8PSBQTVVfRkxfSEFTX1JTUF8xOworCQl4ODZfcG11LmZsYWdzIHw9IFBNVV9GTF9OT19IVF9TSEFSSU5HOworCisJCXg4Nl9wbXUuaHdfY29uZmlnID0gaHN3X2h3X2NvbmZpZzsKKwkJeDg2X3BtdS5nZXRfZXZlbnRfY29uc3RyYWludHMgPSBoc3dfZ2V0X2V2ZW50X2NvbnN0cmFpbnRzOworCQl4ODZfcG11LmNwdV9ldmVudHMgPSBoc3dfZXZlbnRzX2F0dHJzOworCQl4ODZfcG11LmxpbWl0X3BlcmlvZCA9IGJkd19saW1pdF9wZXJpb2Q7CisJCXByX2NvbnQoIkJyb2Fkd2VsbCBldmVudHMsICIpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXN3aXRjaCAoeDg2X3BtdS52ZXJzaW9uKSB7CiAJCWNhc2UgMToKQEAgLTI2NTEsMyArMzM3Nyw0NyBAQAogCiAJcmV0dXJuIDA7CiB9CisKKy8qCisgKiBIVCBidWc6IHBoYXNlIDIgaW5pdAorICogQ2FsbGVkIG9uY2Ugd2UgaGF2ZSB2YWxpZCB0b3BvbG9neSBpbmZvcm1hdGlvbiB0byBjaGVjaworICogd2hldGhlciBvciBub3QgSFQgaXMgZW5hYmxlZAorICogSWYgSFQgaXMgb2ZmLCB0aGVuIHdlIGRpc2FibGUgdGhlIHdvcmthcm91bmQKKyAqLworc3RhdGljIF9faW5pdCBpbnQgZml4dXBfaHRfYnVnKHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpbnQgdywgYzsKKwkvKgorCSAqIHByb2JsZW0gbm90IHByZXNlbnQgb24gdGhpcyBDUFUgbW9kZWwsIG5vdGhpbmcgdG8gZG8KKwkgKi8KKwlpZiAoISh4ODZfcG11LmZsYWdzICYgUE1VX0ZMX0VYQ0xfRU5BQkxFRCkpCisJCXJldHVybiAwOworCisJdyA9IGNwdW1hc2tfd2VpZ2h0KHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKGNwdSkpOworCWlmICh3ID4gMSkgeworCQlwcl9pbmZvKCJQTVUgZXJyYXR1bSBCSjEyMiwgQlY5OCwgSFNEMjkgd29ya2VkIGFyb3VuZCwgSFQgaXMgb25cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl3YXRjaGRvZ19ubWlfZGlzYWJsZV9hbGwoKTsKKworCXg4Nl9wbXUuZmxhZ3MgJj0gfihQTVVfRkxfRVhDTF9DTlRSUyB8IFBNVV9GTF9FWENMX0VOQUJMRUQpOworCisJeDg2X3BtdS5jb21taXRfc2NoZWR1bGluZyA9IE5VTEw7CisJeDg2X3BtdS5zdGFydF9zY2hlZHVsaW5nID0gTlVMTDsKKwl4ODZfcG11LnN0b3Bfc2NoZWR1bGluZyA9IE5VTEw7CisKKwl3YXRjaGRvZ19ubWlfZW5hYmxlX2FsbCgpOworCisJZ2V0X29ubGluZV9jcHVzKCk7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGMpIHsKKwkJZnJlZV9leGNsX2NudHJzKGMpOworCX0KKworCXB1dF9vbmxpbmVfY3B1cygpOworCXByX2luZm8oIlBNVSBlcnJhdHVtIEJKMTIyLCBCVjk4LCBIU0QyOSB3b3JrYXJvdW5kIGRpc2FibGVkLCBIVCBvZmZcbiIpOworCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKGZpeHVwX2h0X2J1ZykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF9idHMuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF9idHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzFmMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2J0cy5jCkBAIC0wLDAgKzEsNTI1IEBACisvKgorICogQlRTIFBNVSBkcml2ZXIgZm9yIHBlcmYKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI3VuZGVmIERFQlVHCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jb3JlZHVtcC5oPgorCisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2l6ZXMuaD4KKyNpbmNsdWRlIDxhc20vcGVyZl9ldmVudC5oPgorCisjaW5jbHVkZSAicGVyZl9ldmVudC5oIgorCitzdHJ1Y3QgYnRzX2N0eCB7CisJc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZQloYW5kbGU7CisJc3RydWN0IGRlYnVnX3N0b3JlCQlkc19iYWNrOworCWludAkJCQlzdGFydGVkOworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBidHNfY3R4LCBidHNfY3R4KTsKKworI2RlZmluZSBCVFNfUkVDT1JEX1NJWkUJCTI0CisjZGVmaW5lIEJUU19TQUZFVFlfTUFSR0lOCTQwODAKKworc3RydWN0IGJ0c19waHlzIHsKKwlzdHJ1Y3QgcGFnZQkqcGFnZTsKKwl1bnNpZ25lZCBsb25nCXNpemU7CisJdW5zaWduZWQgbG9uZwlvZmZzZXQ7CisJdW5zaWduZWQgbG9uZwlkaXNwbGFjZW1lbnQ7Cit9OworCitzdHJ1Y3QgYnRzX2J1ZmZlciB7CisJc2l6ZV90CQlyZWFsX3NpemU7CS8qIG11bHRpcGxlIG9mIEJUU19SRUNPUkRfU0laRSAqLworCXVuc2lnbmVkIGludAlucl9wYWdlczsKKwl1bnNpZ25lZCBpbnQJbnJfYnVmczsKKwl1bnNpZ25lZCBpbnQJY3VyX2J1ZjsKKwlib29sCQlzbmFwc2hvdDsKKwlsb2NhbF90CQlkYXRhX3NpemU7CisJbG9jYWxfdAkJbG9zdDsKKwlsb2NhbF90CQloZWFkOworCXVuc2lnbmVkIGxvbmcJZW5kOworCXZvaWQJCSoqZGF0YV9wYWdlczsKKwlzdHJ1Y3QgYnRzX3BoeXMJYnVmWzBdOworfTsKKworc3RydWN0IHBtdSBidHNfcG11OworCit2b2lkIGludGVsX3BtdV9lbmFibGVfYnRzKHU2NCBjb25maWcpOwordm9pZCBpbnRlbF9wbXVfZGlzYWJsZV9idHModm9pZCk7CisKK3N0YXRpYyBzaXplX3QgYnVmX3NpemUoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIDEgPDwgKFBBR0VfU0hJRlQgKyBwYWdlX3ByaXZhdGUocGFnZSkpOworfQorCitzdGF0aWMgdm9pZCAqCitidHNfYnVmZmVyX3NldHVwX2F1eChpbnQgY3B1LCB2b2lkICoqcGFnZXMsIGludCBucl9wYWdlcywgYm9vbCBvdmVyd3JpdGUpCit7CisJc3RydWN0IGJ0c19idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgbm9kZSA9IChjcHUgPT0gLTEpID8gY3B1IDogY3B1X3RvX25vZGUoY3B1KTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzaXplX3Qgc2l6ZSA9IG5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQ7CisJaW50IHBnLCBuYnVmLCBwYWQ7CisKKwkvKiBjb3VudCBhbGwgdGhlIGhpZ2ggb3JkZXIgYnVmZmVycyAqLworCWZvciAocGcgPSAwLCBuYnVmID0gMDsgcGcgPCBucl9wYWdlczspIHsKKwkJcGFnZSA9IHZpcnRfdG9fcGFnZShwYWdlc1twZ10pOworCQlpZiAoV0FSTl9PTl9PTkNFKCFQYWdlUHJpdmF0ZShwYWdlKSAmJiBucl9wYWdlcyA+IDEpKQorCQkJcmV0dXJuIE5VTEw7CisJCXBnICs9IDEgPDwgcGFnZV9wcml2YXRlKHBhZ2UpOworCQluYnVmKys7CisJfQorCisJLyoKKwkgKiB0byBhdm9pZCBpbnRlcnJ1cHRzIGluIG92ZXJ3cml0ZSBtb2RlLCBvbmx5IGFsbG93IG9uZSBwaHlzaWNhbAorCSAqLworCWlmIChvdmVyd3JpdGUgJiYgbmJ1ZiA+IDEpCisJCXJldHVybiBOVUxMOworCisJYnVmID0ga3phbGxvY19ub2RlKG9mZnNldG9mKHN0cnVjdCBidHNfYnVmZmVyLCBidWZbbmJ1Zl0pLCBHRlBfS0VSTkVMLCBub2RlKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIE5VTEw7CisKKwlidWYtPm5yX3BhZ2VzID0gbnJfcGFnZXM7CisJYnVmLT5ucl9idWZzID0gbmJ1ZjsKKwlidWYtPnNuYXBzaG90ID0gb3ZlcndyaXRlOworCWJ1Zi0+ZGF0YV9wYWdlcyA9IHBhZ2VzOworCWJ1Zi0+cmVhbF9zaXplID0gc2l6ZSAtIHNpemUgJSBCVFNfUkVDT1JEX1NJWkU7CisKKwlmb3IgKHBnID0gMCwgbmJ1ZiA9IDAsIG9mZnNldCA9IDAsIHBhZCA9IDA7IG5idWYgPCBidWYtPm5yX2J1ZnM7IG5idWYrKykgeworCQl1bnNpZ25lZCBpbnQgX19ucl9wYWdlczsKKworCQlwYWdlID0gdmlydF90b19wYWdlKHBhZ2VzW3BnXSk7CisJCV9fbnJfcGFnZXMgPSBQYWdlUHJpdmF0ZShwYWdlKSA/IDEgPDwgcGFnZV9wcml2YXRlKHBhZ2UpIDogMTsKKwkJYnVmLT5idWZbbmJ1Zl0ucGFnZSA9IHBhZ2U7CisJCWJ1Zi0+YnVmW25idWZdLm9mZnNldCA9IG9mZnNldDsKKwkJYnVmLT5idWZbbmJ1Zl0uZGlzcGxhY2VtZW50ID0gKHBhZCA/IEJUU19SRUNPUkRfU0laRSAtIHBhZCA6IDApOworCQlidWYtPmJ1ZltuYnVmXS5zaXplID0gYnVmX3NpemUocGFnZSkgLSBidWYtPmJ1ZltuYnVmXS5kaXNwbGFjZW1lbnQ7CisJCXBhZCA9IGJ1Zi0+YnVmW25idWZdLnNpemUgJSBCVFNfUkVDT1JEX1NJWkU7CisJCWJ1Zi0+YnVmW25idWZdLnNpemUgLT0gcGFkOworCisJCXBnICs9IF9fbnJfcGFnZXM7CisJCW9mZnNldCArPSBfX25yX3BhZ2VzIDw8IFBBR0VfU0hJRlQ7CisJfQorCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIHZvaWQgYnRzX2J1ZmZlcl9mcmVlX2F1eCh2b2lkICpkYXRhKQoreworCWtmcmVlKGRhdGEpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBidHNfYnVmZmVyX29mZnNldChzdHJ1Y3QgYnRzX2J1ZmZlciAqYnVmLCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXJldHVybiBidWYtPmJ1ZltpZHhdLm9mZnNldCArIGJ1Zi0+YnVmW2lkeF0uZGlzcGxhY2VtZW50OworfQorCitzdGF0aWMgdm9pZAorYnRzX2NvbmZpZ19idWZmZXIoc3RydWN0IGJ0c19idWZmZXIgKmJ1ZikKK3sKKwlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgZGVidWdfc3RvcmUgKmRzID0gcGVyX2NwdShjcHVfaHdfZXZlbnRzLCBjcHUpLmRzOworCXN0cnVjdCBidHNfcGh5cyAqcGh5cyA9ICZidWYtPmJ1ZltidWYtPmN1cl9idWZdOworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHRocmVzaCA9IDAsIGVuZCA9IHBoeXMtPnNpemU7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwaHlzLT5wYWdlOworCisJaW5kZXggPSBsb2NhbF9yZWFkKCZidWYtPmhlYWQpOworCisJaWYgKCFidWYtPnNuYXBzaG90KSB7CisJCWlmIChidWYtPmVuZCA8IHBoeXMtPm9mZnNldCArIGJ1Zl9zaXplKHBhZ2UpKQorCQkJZW5kID0gYnVmLT5lbmQgLSBwaHlzLT5vZmZzZXQgLSBwaHlzLT5kaXNwbGFjZW1lbnQ7CisKKwkJaW5kZXggLT0gcGh5cy0+b2Zmc2V0ICsgcGh5cy0+ZGlzcGxhY2VtZW50OworCisJCWlmIChlbmQgLSBpbmRleCA+IEJUU19TQUZFVFlfTUFSR0lOKQorCQkJdGhyZXNoID0gZW5kIC0gQlRTX1NBRkVUWV9NQVJHSU47CisJCWVsc2UgaWYgKGVuZCAtIGluZGV4ID4gQlRTX1JFQ09SRF9TSVpFKQorCQkJdGhyZXNoID0gZW5kIC0gQlRTX1JFQ09SRF9TSVpFOworCQllbHNlCisJCQl0aHJlc2ggPSBlbmQ7CisJfQorCisJZHMtPmJ0c19idWZmZXJfYmFzZSA9ICh1NjQpKGxvbmcpcGFnZV9hZGRyZXNzKHBhZ2UpICsgcGh5cy0+ZGlzcGxhY2VtZW50OworCWRzLT5idHNfaW5kZXggPSBkcy0+YnRzX2J1ZmZlcl9iYXNlICsgaW5kZXg7CisJZHMtPmJ0c19hYnNvbHV0ZV9tYXhpbXVtID0gZHMtPmJ0c19idWZmZXJfYmFzZSArIGVuZDsKKwlkcy0+YnRzX2ludGVycnVwdF90aHJlc2hvbGQgPSAhYnVmLT5zbmFwc2hvdAorCQk/IGRzLT5idHNfYnVmZmVyX2Jhc2UgKyB0aHJlc2gKKwkJOiBkcy0+YnRzX2Fic29sdXRlX21heGltdW0gKyBCVFNfUkVDT1JEX1NJWkU7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19idWZmZXJfcGFkX291dChzdHJ1Y3QgYnRzX3BoeXMgKnBoeXMsIHVuc2lnbmVkIGxvbmcgaGVhZCkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gaGVhZCAtIHBoeXMtPm9mZnNldDsKKworCW1lbXNldChwYWdlX2FkZHJlc3MocGh5cy0+cGFnZSkgKyBpbmRleCwgMCwgcGh5cy0+c2l6ZSAtIGluZGV4KTsKK30KKworc3RhdGljIGJvb2wgYnRzX2J1ZmZlcl9pc19mdWxsKHN0cnVjdCBidHNfYnVmZmVyICpidWYsIHN0cnVjdCBidHNfY3R4ICpidHMpCit7CisJaWYgKGJ1Zi0+c25hcHNob3QpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChsb2NhbF9yZWFkKCZidWYtPmRhdGFfc2l6ZSkgPj0gYnRzLT5oYW5kbGUuc2l6ZSB8fAorCSAgICBidHMtPmhhbmRsZS5zaXplIC0gbG9jYWxfcmVhZCgmYnVmLT5kYXRhX3NpemUpIDwgQlRTX1JFQ09SRF9TSVpFKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgYnRzX3VwZGF0ZShzdHJ1Y3QgYnRzX2N0eCAqYnRzKQoreworCWludCBjcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCBkZWJ1Z19zdG9yZSAqZHMgPSBwZXJfY3B1KGNwdV9od19ldmVudHMsIGNwdSkuZHM7CisJc3RydWN0IGJ0c19idWZmZXIgKmJ1ZiA9IHBlcmZfZ2V0X2F1eCgmYnRzLT5oYW5kbGUpOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBkcy0+YnRzX2luZGV4IC0gZHMtPmJ0c19idWZmZXJfYmFzZSwgb2xkLCBoZWFkOworCisJaWYgKCFidWYpCisJCXJldHVybjsKKworCWhlYWQgPSBpbmRleCArIGJ0c19idWZmZXJfb2Zmc2V0KGJ1ZiwgYnVmLT5jdXJfYnVmKTsKKwlvbGQgPSBsb2NhbF94Y2hnKCZidWYtPmhlYWQsIGhlYWQpOworCisJaWYgKCFidWYtPnNuYXBzaG90KSB7CisJCWlmIChvbGQgPT0gaGVhZCkKKwkJCXJldHVybjsKKworCQlpZiAoZHMtPmJ0c19pbmRleCA+PSBkcy0+YnRzX2Fic29sdXRlX21heGltdW0pCisJCQlsb2NhbF9pbmMoJmJ1Zi0+bG9zdCk7CisKKwkJLyoKKwkJICogb2xkIGFuZCBoZWFkIGFyZSBhbHdheXMgaW4gdGhlIHNhbWUgcGh5c2ljYWwgYnVmZmVyLCBzbyB3ZQorCQkgKiBjYW4gc3VidHJhY3QgdGhlbSB0byBnZXQgdGhlIGRhdGEgc2l6ZS4KKwkJICovCisJCWxvY2FsX2FkZChoZWFkIC0gb2xkLCAmYnVmLT5kYXRhX3NpemUpOworCX0gZWxzZSB7CisJCWxvY2FsX3NldCgmYnVmLT5kYXRhX3NpemUsIGhlYWQpOworCX0KK30KKworc3RhdGljIHZvaWQgX19idHNfZXZlbnRfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBidHNfY3R4ICpidHMgPSB0aGlzX2NwdV9wdHIoJmJ0c19jdHgpOworCXN0cnVjdCBidHNfYnVmZmVyICpidWYgPSBwZXJmX2dldF9hdXgoJmJ0cy0+aGFuZGxlKTsKKwl1NjQgY29uZmlnID0gMDsKKworCWlmICghYnVmIHx8IGJ0c19idWZmZXJfaXNfZnVsbChidWYsIGJ0cykpCisJCXJldHVybjsKKworCWV2ZW50LT5ody5zdGF0ZSA9IDA7CisKKwlpZiAoIWJ1Zi0+c25hcHNob3QpCisJCWNvbmZpZyB8PSBBUkNIX1BFUkZNT05fRVZFTlRTRUxfSU5UOworCWlmICghZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWwpCisJCWNvbmZpZyB8PSBBUkNIX1BFUkZNT05fRVZFTlRTRUxfT1M7CisJaWYgKCFldmVudC0+YXR0ci5leGNsdWRlX3VzZXIpCisJCWNvbmZpZyB8PSBBUkNIX1BFUkZNT05fRVZFTlRTRUxfVVNSOworCisJYnRzX2NvbmZpZ19idWZmZXIoYnVmKTsKKworCS8qCisJICogbG9jYWwgYmFycmllciB0byBtYWtlIHN1cmUgdGhhdCBkcyBjb25maWd1cmF0aW9uIG1hZGUgaXQKKwkgKiBiZWZvcmUgd2UgZW5hYmxlIEJUUworCSAqLworCXdtYigpOworCisJaW50ZWxfcG11X2VuYWJsZV9idHMoY29uZmlnKTsKK30KKworc3RhdGljIHZvaWQgYnRzX2V2ZW50X3N0YXJ0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBidHNfY3R4ICpidHMgPSB0aGlzX2NwdV9wdHIoJmJ0c19jdHgpOworCisJX19idHNfZXZlbnRfc3RhcnQoZXZlbnQpOworCisJLyogUE1JIGhhbmRsZXI6IHRoaXMgY291bnRlciBpcyBydW5uaW5nIGFuZCBsaWtlbHkgZ2VuZXJhdGluZyBQTUlzICovCisJQUNDRVNTX09OQ0UoYnRzLT5zdGFydGVkKSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIF9fYnRzX2V2ZW50X3N0b3Aoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCS8qCisJICogTm8gZXh0cmEgc3luY2hyb25pemF0aW9uIGlzIG1hbmRhdGVkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHRvIGhhdmUKKwkgKiBCVFMgZGF0YSBzdG9yZXMgZ2xvYmFsbHkgdmlzaWJsZS4KKwkgKi8KKwlpbnRlbF9wbXVfZGlzYWJsZV9idHMoKTsKKworCWlmIChldmVudC0+aHcuc3RhdGUgJiBQRVJGX0hFU19TVE9QUEVEKQorCQlyZXR1cm47CisKKwlBQ0NFU1NfT05DRShldmVudC0+aHcuc3RhdGUpIHw9IFBFUkZfSEVTX1NUT1BQRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19ldmVudF9zdG9wKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBidHNfY3R4ICpidHMgPSB0aGlzX2NwdV9wdHIoJmJ0c19jdHgpOworCisJLyogUE1JIGhhbmRsZXI6IGRvbid0IHJlc3RhcnQgdGhpcyBjb3VudGVyICovCisJQUNDRVNTX09OQ0UoYnRzLT5zdGFydGVkKSA9IDA7CisKKwlfX2J0c19ldmVudF9zdG9wKGV2ZW50KTsKKworCWlmIChmbGFncyAmIFBFUkZfRUZfVVBEQVRFKQorCQlidHNfdXBkYXRlKGJ0cyk7Cit9CisKK3ZvaWQgaW50ZWxfYnRzX2VuYWJsZV9sb2NhbCh2b2lkKQoreworCXN0cnVjdCBidHNfY3R4ICpidHMgPSB0aGlzX2NwdV9wdHIoJmJ0c19jdHgpOworCisJaWYgKGJ0cy0+aGFuZGxlLmV2ZW50ICYmIGJ0cy0+c3RhcnRlZCkKKwkJX19idHNfZXZlbnRfc3RhcnQoYnRzLT5oYW5kbGUuZXZlbnQpOworfQorCit2b2lkIGludGVsX2J0c19kaXNhYmxlX2xvY2FsKHZvaWQpCit7CisJc3RydWN0IGJ0c19jdHggKmJ0cyA9IHRoaXNfY3B1X3B0cigmYnRzX2N0eCk7CisKKwlpZiAoYnRzLT5oYW5kbGUuZXZlbnQpCisJCV9fYnRzX2V2ZW50X3N0b3AoYnRzLT5oYW5kbGUuZXZlbnQpOworfQorCitzdGF0aWMgaW50CitidHNfYnVmZmVyX3Jlc2V0KHN0cnVjdCBidHNfYnVmZmVyICpidWYsIHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGhlYWQsIHNwYWNlLCBuZXh0X3NwYWNlLCBwYWQsIGdhcCwgc2tpcCwgd2FrZXVwOworCXVuc2lnbmVkIGludCBuZXh0X2J1ZjsKKwlzdHJ1Y3QgYnRzX3BoeXMgKnBoeXMsICpuZXh0X3BoeXM7CisJaW50IHJldDsKKworCWlmIChidWYtPnNuYXBzaG90KQorCQlyZXR1cm4gMDsKKworCWhlYWQgPSBoYW5kbGUtPmhlYWQgJiAoKGJ1Zi0+bnJfcGFnZXMgPDwgUEFHRV9TSElGVCkgLSAxKTsKKwlpZiAoV0FSTl9PTl9PTkNFKGhlYWQgIT0gbG9jYWxfcmVhZCgmYnVmLT5oZWFkKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcGh5cyA9ICZidWYtPmJ1ZltidWYtPmN1cl9idWZdOworCXNwYWNlID0gcGh5cy0+b2Zmc2V0ICsgcGh5cy0+ZGlzcGxhY2VtZW50ICsgcGh5cy0+c2l6ZSAtIGhlYWQ7CisJcGFkID0gc3BhY2U7CisJaWYgKHNwYWNlID4gaGFuZGxlLT5zaXplKSB7CisJCXNwYWNlID0gaGFuZGxlLT5zaXplOworCQlzcGFjZSAtPSBzcGFjZSAlIEJUU19SRUNPUkRfU0laRTsKKwl9CisJaWYgKHNwYWNlIDw9IEJUU19TQUZFVFlfTUFSR0lOKSB7CisJCS8qIFNlZSBpZiBuZXh0IHBoeXMgYnVmZmVyIGhhcyBtb3JlIHNwYWNlICovCisJCW5leHRfYnVmID0gYnVmLT5jdXJfYnVmICsgMTsKKwkJaWYgKG5leHRfYnVmID49IGJ1Zi0+bnJfYnVmcykKKwkJCW5leHRfYnVmID0gMDsKKwkJbmV4dF9waHlzID0gJmJ1Zi0+YnVmW25leHRfYnVmXTsKKwkJZ2FwID0gYnVmX3NpemUocGh5cy0+cGFnZSkgLSBwaHlzLT5kaXNwbGFjZW1lbnQgLSBwaHlzLT5zaXplICsKKwkJICAgICAgbmV4dF9waHlzLT5kaXNwbGFjZW1lbnQ7CisJCXNraXAgPSBwYWQgKyBnYXA7CisJCWlmIChoYW5kbGUtPnNpemUgPj0gc2tpcCkgeworCQkJbmV4dF9zcGFjZSA9IG5leHRfcGh5cy0+c2l6ZTsKKwkJCWlmIChuZXh0X3NwYWNlICsgc2tpcCA+IGhhbmRsZS0+c2l6ZSkgeworCQkJCW5leHRfc3BhY2UgPSBoYW5kbGUtPnNpemUgLSBza2lwOworCQkJCW5leHRfc3BhY2UgLT0gbmV4dF9zcGFjZSAlIEJUU19SRUNPUkRfU0laRTsKKwkJCX0KKwkJCWlmIChuZXh0X3NwYWNlID4gc3BhY2UgfHwgIXNwYWNlKSB7CisJCQkJaWYgKHBhZCkKKwkJCQkJYnRzX2J1ZmZlcl9wYWRfb3V0KHBoeXMsIGhlYWQpOworCQkJCXJldCA9IHBlcmZfYXV4X291dHB1dF9za2lwKGhhbmRsZSwgc2tpcCk7CisJCQkJaWYgKHJldCkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQkvKiBBZHZhbmNlIHRvIG5leHQgcGh5cyBidWZmZXIgKi8KKwkJCQlwaHlzID0gbmV4dF9waHlzOworCQkJCXNwYWNlID0gbmV4dF9zcGFjZTsKKwkJCQloZWFkID0gcGh5cy0+b2Zmc2V0ICsgcGh5cy0+ZGlzcGxhY2VtZW50OworCQkJCS8qCisJCQkJICogQWZ0ZXIgdGhpcywgY3VyX2J1ZiBhbmQgaGVhZCB3b24ndCBtYXRjaCBkcworCQkJCSAqIGFueW1vcmUsIHNvIHdlIG11c3Qgbm90IGJlIHJhY2luZyB3aXRoCisJCQkJICogYnRzX3VwZGF0ZSgpLgorCQkJCSAqLworCQkJCWJ1Zi0+Y3VyX2J1ZiA9IG5leHRfYnVmOworCQkJCWxvY2FsX3NldCgmYnVmLT5oZWFkLCBoZWFkKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIERvbid0IGdvIGZhciBiZXlvbmQgd2FrZXVwIHdhdGVybWFyayAqLworCXdha2V1cCA9IEJUU19TQUZFVFlfTUFSR0lOICsgQlRTX1JFQ09SRF9TSVpFICsgaGFuZGxlLT53YWtldXAgLQorCQkgaGFuZGxlLT5oZWFkOworCWlmIChzcGFjZSA+IHdha2V1cCkgeworCQlzcGFjZSA9IHdha2V1cDsKKwkJc3BhY2UgLT0gc3BhY2UgJSBCVFNfUkVDT1JEX1NJWkU7CisJfQorCisJYnVmLT5lbmQgPSBoZWFkICsgc3BhY2U7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgbm8gc3BhY2UsIHRoZSBsb3N0IG5vdGlmaWNhdGlvbiB3b3VsZCBoYXZlIGJlZW4gc2VudCB3aGVuCisJICogd2UgaGl0IGFic29sdXRlX21heGltdW0gLSBzZWUgYnRzX3VwZGF0ZSgpCisJICovCisJaWYgKCFzcGFjZSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGludGVsX2J0c19pbnRlcnJ1cHQodm9pZCkKK3sKKwlzdHJ1Y3QgYnRzX2N0eCAqYnRzID0gdGhpc19jcHVfcHRyKCZidHNfY3R4KTsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQgPSBidHMtPmhhbmRsZS5ldmVudDsKKwlzdHJ1Y3QgYnRzX2J1ZmZlciAqYnVmOworCXM2NCBvbGRfaGVhZDsKKwlpbnQgZXJyOworCisJaWYgKCFldmVudCB8fCAhYnRzLT5zdGFydGVkKQorCQlyZXR1cm4gMDsKKworCWJ1ZiA9IHBlcmZfZ2V0X2F1eCgmYnRzLT5oYW5kbGUpOworCS8qCisJICogU2tpcCBzbmFwc2hvdCBjb3VudGVyczogdGhleSBkb24ndCB1c2UgdGhlIGludGVycnVwdCwgYnV0CisJICogdGhlcmUncyBubyBvdGhlciB3YXkgb2YgdGVsbGluZywgYmVjYXVzZSB0aGUgcG9pbnRlciB3aWxsCisJICoga2VlcCBtb3ZpbmcKKwkgKi8KKwlpZiAoIWJ1ZiB8fCBidWYtPnNuYXBzaG90KQorCQlyZXR1cm4gMDsKKworCW9sZF9oZWFkID0gbG9jYWxfcmVhZCgmYnVmLT5oZWFkKTsKKwlidHNfdXBkYXRlKGJ0cyk7CisKKwkvKiBubyBuZXcgZGF0YSAqLworCWlmIChvbGRfaGVhZCA9PSBsb2NhbF9yZWFkKCZidWYtPmhlYWQpKQorCQlyZXR1cm4gMDsKKworCXBlcmZfYXV4X291dHB1dF9lbmQoJmJ0cy0+aGFuZGxlLCBsb2NhbF94Y2hnKCZidWYtPmRhdGFfc2l6ZSwgMCksCisJCQkgICAgISFsb2NhbF94Y2hnKCZidWYtPmxvc3QsIDApKTsKKworCWJ1ZiA9IHBlcmZfYXV4X291dHB1dF9iZWdpbigmYnRzLT5oYW5kbGUsIGV2ZW50KTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIDE7CisKKwllcnIgPSBidHNfYnVmZmVyX3Jlc2V0KGJ1ZiwgJmJ0cy0+aGFuZGxlKTsKKwlpZiAoZXJyKQorCQlwZXJmX2F1eF9vdXRwdXRfZW5kKCZidHMtPmhhbmRsZSwgMCwgZmFsc2UpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19ldmVudF9kZWwoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9IHRoaXNfY3B1X3B0cigmY3B1X2h3X2V2ZW50cyk7CisJc3RydWN0IGJ0c19jdHggKmJ0cyA9IHRoaXNfY3B1X3B0cigmYnRzX2N0eCk7CisJc3RydWN0IGJ0c19idWZmZXIgKmJ1ZiA9IHBlcmZfZ2V0X2F1eCgmYnRzLT5oYW5kbGUpOworCisJYnRzX2V2ZW50X3N0b3AoZXZlbnQsIFBFUkZfRUZfVVBEQVRFKTsKKworCWlmIChidWYpIHsKKwkJaWYgKGJ1Zi0+c25hcHNob3QpCisJCQlidHMtPmhhbmRsZS5oZWFkID0KKwkJCQlsb2NhbF94Y2hnKCZidWYtPmRhdGFfc2l6ZSwKKwkJCQkJICAgYnVmLT5ucl9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKwkJcGVyZl9hdXhfb3V0cHV0X2VuZCgmYnRzLT5oYW5kbGUsIGxvY2FsX3hjaGcoJmJ1Zi0+ZGF0YV9zaXplLCAwKSwKKwkJCQkgICAgISFsb2NhbF94Y2hnKCZidWYtPmxvc3QsIDApKTsKKwl9CisKKwljcHVjLT5kcy0+YnRzX2luZGV4ID0gYnRzLT5kc19iYWNrLmJ0c19idWZmZXJfYmFzZTsKKwljcHVjLT5kcy0+YnRzX2J1ZmZlcl9iYXNlID0gYnRzLT5kc19iYWNrLmJ0c19idWZmZXJfYmFzZTsKKwljcHVjLT5kcy0+YnRzX2Fic29sdXRlX21heGltdW0gPSBidHMtPmRzX2JhY2suYnRzX2Fic29sdXRlX21heGltdW07CisJY3B1Yy0+ZHMtPmJ0c19pbnRlcnJ1cHRfdGhyZXNob2xkID0gYnRzLT5kc19iYWNrLmJ0c19pbnRlcnJ1cHRfdGhyZXNob2xkOworfQorCitzdGF0aWMgaW50IGJ0c19ldmVudF9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYnRzX2J1ZmZlciAqYnVmOworCXN0cnVjdCBidHNfY3R4ICpidHMgPSB0aGlzX2NwdV9wdHIoJmJ0c19jdHgpOworCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwlpbnQgcmV0ID0gLUVCVVNZOworCisJZXZlbnQtPmh3LnN0YXRlID0gUEVSRl9IRVNfU1RPUFBFRDsKKworCWlmICh0ZXN0X2JpdChJTlRFTF9QTUNfSURYX0ZJWEVEX0JUUywgY3B1Yy0+YWN0aXZlX21hc2spKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKGJ0cy0+aGFuZGxlLmV2ZW50KQorCQlyZXR1cm4gLUVCVVNZOworCisJYnVmID0gcGVyZl9hdXhfb3V0cHV0X2JlZ2luKCZidHMtPmhhbmRsZSwgZXZlbnQpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IGJ0c19idWZmZXJfcmVzZXQoYnVmLCAmYnRzLT5oYW5kbGUpOworCWlmIChyZXQpIHsKKwkJcGVyZl9hdXhfb3V0cHV0X2VuZCgmYnRzLT5oYW5kbGUsIDAsIGZhbHNlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlidHMtPmRzX2JhY2suYnRzX2J1ZmZlcl9iYXNlID0gY3B1Yy0+ZHMtPmJ0c19idWZmZXJfYmFzZTsKKwlidHMtPmRzX2JhY2suYnRzX2Fic29sdXRlX21heGltdW0gPSBjcHVjLT5kcy0+YnRzX2Fic29sdXRlX21heGltdW07CisJYnRzLT5kc19iYWNrLmJ0c19pbnRlcnJ1cHRfdGhyZXNob2xkID0gY3B1Yy0+ZHMtPmJ0c19pbnRlcnJ1cHRfdGhyZXNob2xkOworCisJaWYgKG1vZGUgJiBQRVJGX0VGX1NUQVJUKSB7CisJCWJ0c19ldmVudF9zdGFydChldmVudCwgMCk7CisJCWlmIChod2MtPnN0YXRlICYgUEVSRl9IRVNfU1RPUFBFRCkgeworCQkJYnRzX2V2ZW50X2RlbChldmVudCwgMCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19ldmVudF9kZXN0cm95KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwl4ODZfZGVsX2V4Y2x1c2l2ZSh4ODZfbGJyX2V4Y2x1c2l2ZV9idHMpOworfQorCitzdGF0aWMgaW50IGJ0c19ldmVudF9pbml0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlpZiAoZXZlbnQtPmF0dHIudHlwZSAhPSBidHNfcG11LnR5cGUpCisJCXJldHVybiAtRU5PRU5UOworCisJaWYgKHg4Nl9hZGRfZXhjbHVzaXZlKHg4Nl9sYnJfZXhjbHVzaXZlX2J0cykpCisJCXJldHVybiAtRUJVU1k7CisKKwlldmVudC0+ZGVzdHJveSA9IGJ0c19ldmVudF9kZXN0cm95OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19ldmVudF9yZWFkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKK30KKworc3RhdGljIF9faW5pdCBpbnQgYnRzX2luaXQodm9pZCkKK3sKKwlpZiAoIWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9EVEVTNjQpIHx8ICF4ODZfcG11LmJ0cykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlidHNfcG11LmNhcGFiaWxpdGllcwk9IFBFUkZfUE1VX0NBUF9BVVhfTk9fU0cgfCBQRVJGX1BNVV9DQVBfSVRSQUNFOworCWJ0c19wbXUudGFza19jdHhfbnIJPSBwZXJmX3N3X2NvbnRleHQ7CisJYnRzX3BtdS5ldmVudF9pbml0CT0gYnRzX2V2ZW50X2luaXQ7CisJYnRzX3BtdS5hZGQJCT0gYnRzX2V2ZW50X2FkZDsKKwlidHNfcG11LmRlbAkJPSBidHNfZXZlbnRfZGVsOworCWJ0c19wbXUuc3RhcnQJCT0gYnRzX2V2ZW50X3N0YXJ0OworCWJ0c19wbXUuc3RvcAkJPSBidHNfZXZlbnRfc3RvcDsKKwlidHNfcG11LnJlYWQJCT0gYnRzX2V2ZW50X3JlYWQ7CisJYnRzX3BtdS5zZXR1cF9hdXgJPSBidHNfYnVmZmVyX3NldHVwX2F1eDsKKwlidHNfcG11LmZyZWVfYXV4CT0gYnRzX2J1ZmZlcl9mcmVlX2F1eDsKKworCXJldHVybiBwZXJmX3BtdV9yZWdpc3RlcigmYnRzX3BtdSwgImludGVsX2J0cyIsIC0xKTsKK30KKworbW9kdWxlX2luaXQoYnRzX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2NxbS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2NxbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDFiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfY3FtLmMKQEAgLTAsMCArMSwxMzc5IEBACisvKgorICogSW50ZWwgQ2FjaGUgUXVhbGl0eS1vZi1TZXJ2aWNlIE1vbml0b3JpbmcgKENRTSkgc3VwcG9ydC4KKyAqCisgKiBCYXNlZCB2ZXJ5LCB2ZXJ5IGhlYXZpbHkgb24gd29yayBieSBQZXRlciBaaWpsc3RyYS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxhc20vY3B1X2RldmljZV9pZC5oPgorI2luY2x1ZGUgInBlcmZfZXZlbnQuaCIKKworI2RlZmluZSBNU1JfSUEzMl9QUVJfQVNTT0MJMHgwYzhmCisjZGVmaW5lIE1TUl9JQTMyX1FNX0NUUgkJMHgwYzhlCisjZGVmaW5lIE1TUl9JQTMyX1FNX0VWVFNFTAkweDBjOGQKKworc3RhdGljIHVuc2lnbmVkIGludCBjcW1fbWF4X3JtaWQgPSAtMTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3FtX2wzX3NjYWxlOyAvKiBzdXBwb3NlZGx5IGNhY2hlbGluZSBzaXplICovCisKK3N0cnVjdCBpbnRlbF9jcW1fc3RhdGUgeworCXJhd19zcGlubG9ja190CQlsb2NrOworCWludAkJCXJtaWQ7CisJaW50CQkJY250OworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBpbnRlbF9jcW1fc3RhdGUsIGNxbV9zdGF0ZSk7CisKKy8qCisgKiBQcm90ZWN0cyBjYWNoZV9jZ3JvdXBzIGFuZCBjcW1fcm1pZF9mcmVlX2xydSBhbmQgY3FtX3JtaWRfbGltYm9fbHJ1LgorICogQWxzbyBwcm90ZWN0cyBldmVudC0+aHcuY3FtX3JtaWQKKyAqCisgKiBIb2xkIGVpdGhlciBmb3Igc3RhYmlsaXR5LCBib3RoIGZvciBtb2RpZmljYXRpb24gb2YgLT5ody5jcW1fcm1pZC4KKyAqLworc3RhdGljIERFRklORV9NVVRFWChjYWNoZV9tdXRleCk7CitzdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhjYWNoZV9sb2NrKTsKKworLyoKKyAqIEdyb3VwcyBvZiBldmVudHMgdGhhdCBoYXZlIHRoZSBzYW1lIHRhcmdldChzKSwgb25lIFJNSUQgcGVyIGdyb3VwLgorICovCitzdGF0aWMgTElTVF9IRUFEKGNhY2hlX2dyb3Vwcyk7CisKKy8qCisgKiBNYXNrIG9mIENQVXMgZm9yIHJlYWRpbmcgQ1FNIHZhbHVlcy4gV2Ugb25seSBuZWVkIG9uZSBwZXItc29ja2V0LgorICovCitzdGF0aWMgY3B1bWFza190IGNxbV9jcHVtYXNrOworCisjZGVmaW5lIFJNSURfVkFMX0VSUk9SCQkoMVVMTCA8PCA2MykKKyNkZWZpbmUgUk1JRF9WQUxfVU5BVkFJTAkoMVVMTCA8PCA2MikKKworI2RlZmluZSBRT1NfTDNfT0NDVVBfRVZFTlRfSUQJKDEgPDwgMCkKKworI2RlZmluZSBRT1NfRVZFTlRfTUFTSwlRT1NfTDNfT0NDVVBfRVZFTlRfSUQKKworLyoKKyAqIFRoaXMgaXMgY2VudHJhbCB0byB0aGUgcm90YXRpb24gYWxnb3JpdGhtIGluIF9faW50ZWxfY3FtX3JtaWRfcm90YXRlKCkuCisgKgorICogVGhpcyBybWlkIGlzIGFsd2F5cyBmcmVlIGFuZCBpcyBndWFyYW50ZWVkIHRvIGhhdmUgYW4gYXNzb2NpYXRlZAorICogbmVhci16ZXJvIG9jY3VwYW5jeSB2YWx1ZSwgaS5lLiBubyBjYWNoZWxpbmVzIGFyZSB0YWdnZWQgd2l0aCB0aGlzCisgKiBSTUlELCBvbmNlIF9faW50ZWxfY3FtX3JtaWRfcm90YXRlKCkgcmV0dXJucy4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBpbnRlbF9jcW1fcm90YXRpb25fcm1pZDsKKworI2RlZmluZSBJTlZBTElEX1JNSUQJCSgtMSkKKworLyoKKyAqIElzIEBybWlkIHZhbGlkIGZvciBwcm9ncmFtbWluZyB0aGUgaGFyZHdhcmU/CisgKgorICogcm1pZCAwIGlzIHJlc2VydmVkIGJ5IHRoZSBoYXJkd2FyZSBmb3IgYWxsIG5vbi1tb25pdG9yZWQgdGFza3MsIHdoaWNoCisgKiBtZWFucyB0aGF0IHdlIHNob3VsZCBuZXZlciBjb21lIGFjcm9zcyBhbiBybWlkIHdpdGggdGhhdCB2YWx1ZS4KKyAqIExpa2V3aXNlLCBhbiBybWlkIHZhbHVlIG9mIC0xIGlzIHVzZWQgdG8gaW5kaWNhdGUgIm5vIHJtaWQgY3VycmVudGx5CisgKiBhc3NpZ25lZCIgYW5kIGlzIHVzZWQgYXMgcGFydCBvZiB0aGUgcm90YXRpb24gY29kZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIF9fcm1pZF92YWxpZCh1bnNpZ25lZCBpbnQgcm1pZCkKK3sKKwlpZiAoIXJtaWQgfHwgcm1pZCA9PSBJTlZBTElEX1JNSUQpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdTY0IF9fcm1pZF9yZWFkKHVuc2lnbmVkIGludCBybWlkKQoreworCXU2NCB2YWw7CisKKwkvKgorCSAqIElnbm9yZSB0aGUgU0RNLCB0aGlzIHRoaW5nIGlzIF9OT1RISU5HXyBsaWtlIGEgcmVndWxhciBwZXJmY250LAorCSAqIGl0IGp1c3Qgc2F5cyB0aGF0IHRvIGluY3JlYXNlIGNvbmZ1c2lvbi4KKwkgKi8KKwl3cm1zcihNU1JfSUEzMl9RTV9FVlRTRUwsIFFPU19MM19PQ0NVUF9FVkVOVF9JRCwgcm1pZCk7CisJcmRtc3JsKE1TUl9JQTMyX1FNX0NUUiwgdmFsKTsKKworCS8qCisJICogQXNpZGUgZnJvbSB0aGUgRVJST1IgYW5kIFVOQVZBSUwgYml0cywgYXNzdW1lIHRoaXMgdGhpbmcgcmV0dXJucworCSAqIHRoZSBudW1iZXIgb2YgY2FjaGVsaW5lcyB0YWdnZWQgd2l0aCBAcm1pZC4KKwkgKi8KKwlyZXR1cm4gdmFsOworfQorCitlbnVtIHJtaWRfcmVjeWNsZV9zdGF0ZSB7CisJUk1JRF9ZT1VORyA9IDAsCisJUk1JRF9BVkFJTEFCTEUsCisJUk1JRF9ESVJUWSwKK307CisKK3N0cnVjdCBjcW1fcm1pZF9lbnRyeSB7CisJdW5zaWduZWQgaW50IHJtaWQ7CisJZW51bSBybWlkX3JlY3ljbGVfc3RhdGUgc3RhdGU7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGxvbmcgcXVldWVfdGltZTsKK307CisKKy8qCisgKiBjcW1fcm1pZF9mcmVlX2xydSAtIEEgbGVhc3QgcmVjZW50bHkgdXNlZCBsaXN0IG9mIFJNSURzLgorICoKKyAqIE9sZGVzdCBlbnRyeSBhdCB0aGUgaGVhZCwgbmV3ZXN0IChtb3N0IHJlY2VudGx5IHVzZWQpIGVudHJ5IGF0IHRoZQorICogdGFpbC4gVGhpcyBsaXN0IGlzIG5ldmVyIHRyYXZlcnNlZCwgaXQncyBvbmx5IHVzZWQgdG8ga2VlcCB0cmFjayBvZgorICogdGhlIGxydSBvcmRlci4gVGhhdCBpcywgd2Ugb25seSBwaWNrIGVudHJpZXMgb2YgdGhlIGhlYWQgb3IgaW5zZXJ0CisgKiB0aGVtIG9uIHRoZSB0YWlsLgorICoKKyAqIEFsbCBlbnRyaWVzIG9uIHRoZSBsaXN0IGFyZSAnZnJlZScsIGFuZCB0aGVpciBSTUlEcyBhcmUgbm90IGN1cnJlbnRseQorICogaW4gdXNlLiBUbyBtYXJrIGFuIFJNSUQgYXMgaW4gdXNlLCByZW1vdmUgaXRzIGVudHJ5IGZyb20gdGhlIGxydQorICogbGlzdC4KKyAqCisgKgorICogY3FtX3JtaWRfbGltYm9fbHJ1IC0gbGlzdCBvZiBjdXJyZW50bHkgdW51c2VkIGJ1dCAocG90ZW50aWFsbHkpIGRpcnR5IFJNSURzLgorICoKKyAqIFRoaXMgbGlzdCBpcyBjb250YWlucyBSTUlEcyB0aGF0IG5vIG9uZSBpcyBjdXJyZW50bHkgdXNpbmcgYnV0IHRoYXQKKyAqIG1heSBoYXZlIGEgbm9uLXplcm8gb2NjdXBhbmN5IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGVtLiBUaGUKKyAqIHJvdGF0aW9uIHdvcmtlciBtb3ZlcyBSTUlEcyBmcm9tIHRoZSBsaW1ibyBsaXN0IHRvIHRoZSBmcmVlIGxpc3Qgb25jZQorICogdGhlIG9jY3VwYW5jeSB2YWx1ZSBkcm9wcyBiZWxvdyBfX2ludGVsX2NxbV90aHJlc2hvbGQuCisgKgorICogQm90aCBsaXN0cyBhcmUgcHJvdGVjdGVkIGJ5IGNhY2hlX211dGV4LgorICovCitzdGF0aWMgTElTVF9IRUFEKGNxbV9ybWlkX2ZyZWVfbHJ1KTsKK3N0YXRpYyBMSVNUX0hFQUQoY3FtX3JtaWRfbGltYm9fbHJ1KTsKKworLyoKKyAqIFdlIHVzZSBhIHNpbXBsZSBhcnJheSBvZiBwb2ludGVycyBzbyB0aGF0IHdlIGNhbiBsb29rdXAgYSBzdHJ1Y3QKKyAqIGNxbV9ybWlkX2VudHJ5IGluIE8oMSkuIFRoaXMgYWxsZXZpYXRlcyB0aGUgY2FsbGVycyBvZiBfX2dldF9ybWlkKCkKKyAqIGFuZCBfX3B1dF9ybWlkKCkgZnJvbSBoYXZpbmcgdG8gd29ycnkgYWJvdXQgZGVhbGluZyB3aXRoIHN0cnVjdAorICogY3FtX3JtaWRfZW50cnkgLSB0aGV5IGp1c3QgZGVhbCB3aXRoIHJtaWRzLCBpLmUuIGludGVnZXJzLgorICoKKyAqIE9uY2UgdGhpcyBhcnJheSBpcyBpbml0aWFsaXplZCBpdCBpcyByZWFkLW9ubHkuIE5vIGxvY2tzIGFyZSByZXF1aXJlZAorICogdG8gYWNjZXNzIGl0LgorICoKKyAqIEFsbCBlbnRyaWVzIGZvciBhbGwgUk1JRHMgY2FuIGJlIGxvb2tlZCB1cCBpbiB0aGUgdGhpcyBhcnJheSBhdCBhbGwKKyAqIHRpbWVzLgorICovCitzdGF0aWMgc3RydWN0IGNxbV9ybWlkX2VudHJ5ICoqY3FtX3JtaWRfcHRyczsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgY3FtX3JtaWRfZW50cnkgKl9fcm1pZF9lbnRyeShpbnQgcm1pZCkKK3sKKwlzdHJ1Y3QgY3FtX3JtaWRfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSBjcW1fcm1pZF9wdHJzW3JtaWRdOworCVdBUk5fT04oZW50cnktPnJtaWQgIT0gcm1pZCk7CisKKwlyZXR1cm4gZW50cnk7Cit9CisKKy8qCisgKiBSZXR1cm5zIDwgMCBvbiBmYWlsLgorICoKKyAqIFdlIGV4cGVjdCB0byBiZSBjYWxsZWQgd2l0aCBjYWNoZV9tdXRleCBoZWxkLgorICovCitzdGF0aWMgaW50IF9fZ2V0X3JtaWQodm9pZCkKK3sKKwlzdHJ1Y3QgY3FtX3JtaWRfZW50cnkgKmVudHJ5OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmY2FjaGVfbXV0ZXgpOworCisJaWYgKGxpc3RfZW1wdHkoJmNxbV9ybWlkX2ZyZWVfbHJ1KSkKKwkJcmV0dXJuIElOVkFMSURfUk1JRDsKKworCWVudHJ5ID0gbGlzdF9maXJzdF9lbnRyeSgmY3FtX3JtaWRfZnJlZV9scnUsIHN0cnVjdCBjcW1fcm1pZF9lbnRyeSwgbGlzdCk7CisJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKworCXJldHVybiBlbnRyeS0+cm1pZDsKK30KKworc3RhdGljIHZvaWQgX19wdXRfcm1pZCh1bnNpZ25lZCBpbnQgcm1pZCkKK3sKKwlzdHJ1Y3QgY3FtX3JtaWRfZW50cnkgKmVudHJ5OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmY2FjaGVfbXV0ZXgpOworCisJV0FSTl9PTighX19ybWlkX3ZhbGlkKHJtaWQpKTsKKwllbnRyeSA9IF9fcm1pZF9lbnRyeShybWlkKTsKKworCWVudHJ5LT5xdWV1ZV90aW1lID0gamlmZmllczsKKwllbnRyeS0+c3RhdGUgPSBSTUlEX1lPVU5HOworCisJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZjcW1fcm1pZF9saW1ib19scnUpOworfQorCitzdGF0aWMgaW50IGludGVsX2NxbV9zZXR1cF9ybWlkX2NhY2hlKHZvaWQpCit7CisJc3RydWN0IGNxbV9ybWlkX2VudHJ5ICplbnRyeTsKKwl1bnNpZ25lZCBpbnQgbnJfcm1pZHM7CisJaW50IHIgPSAwOworCisJbnJfcm1pZHMgPSBjcW1fbWF4X3JtaWQgKyAxOworCWNxbV9ybWlkX3B0cnMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3FtX3JtaWRfZW50cnkgKikgKgorCQkJCW5yX3JtaWRzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNxbV9ybWlkX3B0cnMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yICg7IHIgPD0gY3FtX21heF9ybWlkOyByKyspIHsKKwkJc3RydWN0IGNxbV9ybWlkX2VudHJ5ICplbnRyeTsKKworCQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9LRVJORUwpOworCQlpZiAoIWVudHJ5KQorCQkJZ290byBmYWlsOworCisJCUlOSVRfTElTVF9IRUFEKCZlbnRyeS0+bGlzdCk7CisJCWVudHJ5LT5ybWlkID0gcjsKKwkJY3FtX3JtaWRfcHRyc1tyXSA9IGVudHJ5OworCisJCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCAmY3FtX3JtaWRfZnJlZV9scnUpOworCX0KKworCS8qCisJICogUk1JRCAwIGlzIHNwZWNpYWwgYW5kIGlzIGFsd2F5cyBhbGxvY2F0ZWQuIEl0J3MgdXNlZCBmb3IgYWxsCisJICogdGFza3MgdGhhdCBhcmUgbm90IG1vbml0b3JlZC4KKwkgKi8KKwllbnRyeSA9IF9fcm1pZF9lbnRyeSgwKTsKKwlsaXN0X2RlbCgmZW50cnktPmxpc3QpOworCisJbXV0ZXhfbG9jaygmY2FjaGVfbXV0ZXgpOworCWludGVsX2NxbV9yb3RhdGlvbl9ybWlkID0gX19nZXRfcm1pZCgpOworCW11dGV4X3VubG9jaygmY2FjaGVfbXV0ZXgpOworCisJcmV0dXJuIDA7CitmYWlsOgorCXdoaWxlIChyLS0pCisJCWtmcmVlKGNxbV9ybWlkX3B0cnNbcl0pOworCisJa2ZyZWUoY3FtX3JtaWRfcHRycyk7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgaWYgQGEgYW5kIEBiIG1lYXN1cmUgdGhlIHNhbWUgc2V0IG9mIHRhc2tzLgorICoKKyAqIElmIEBhIGFuZCBAYiBtZWFzdXJlIHRoZSBzYW1lIHNldCBvZiB0YXNrcyB0aGVuIHdlIHdhbnQgdG8gc2hhcmUgYQorICogc2luZ2xlIFJNSUQuCisgKi8KK3N0YXRpYyBib29sIF9fbWF0Y2hfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmEsIHN0cnVjdCBwZXJmX2V2ZW50ICpiKQoreworCS8qIFBlci1jcHUgYW5kIHRhc2sgZXZlbnRzIGRvbid0IG1peCAqLworCWlmICgoYS0+YXR0YWNoX3N0YXRlICYgUEVSRl9BVFRBQ0hfVEFTSykgIT0KKwkgICAgKGItPmF0dGFjaF9zdGF0ZSAmIFBFUkZfQVRUQUNIX1RBU0spKQorCQlyZXR1cm4gZmFsc2U7CisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX1BFUkYKKwlpZiAoYS0+Y2dycCAhPSBiLT5jZ3JwKQorCQlyZXR1cm4gZmFsc2U7CisjZW5kaWYKKworCS8qIElmIG5vdCB0YXNrIGV2ZW50LCB3ZSdyZSBtYWNoaW5lIHdpZGUgKi8KKwlpZiAoIShiLT5hdHRhY2hfc3RhdGUgJiBQRVJGX0FUVEFDSF9UQVNLKSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKgorCSAqIEV2ZW50cyB0aGF0IHRhcmdldCBzYW1lIHRhc2sgYXJlIHBsYWNlZCBpbnRvIHRoZSBzYW1lIGNhY2hlIGdyb3VwLgorCSAqLworCWlmIChhLT5ody50YXJnZXQgPT0gYi0+aHcudGFyZ2V0KQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qCisJICogQXJlIHdlIGFuIGluaGVyaXRlZCBldmVudD8KKwkgKi8KKwlpZiAoYi0+cGFyZW50ID09IGEpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisjaWZkZWYgQ09ORklHX0NHUk9VUF9QRVJGCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwZXJmX2Nncm91cCAqZXZlbnRfdG9fY2dyb3VwKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlpZiAoZXZlbnQtPmF0dGFjaF9zdGF0ZSAmIFBFUkZfQVRUQUNIX1RBU0spCisJCXJldHVybiBwZXJmX2Nncm91cF9mcm9tX3Rhc2soZXZlbnQtPmh3LnRhcmdldCk7CisKKwlyZXR1cm4gZXZlbnQtPmNncnA7Cit9CisjZW5kaWYKKworLyoKKyAqIERldGVybWluZSBpZiBAYSdzIHRhc2tzIGludGVyc2VjdCB3aXRoIEBiJ3MgdGFza3MKKyAqCisgKiBUaGVyZSBhcmUgY29tYmluYXRpb25zIG9mIGV2ZW50cyB0aGF0IHdlIGV4cGxpY2l0bHkgcHJvaGliaXQsCisgKgorICoJCSAgIFBST0hJQklUUworICogICAgIHN5c3RlbS13aWRlICAgIC0+IAljZ3JvdXAgYW5kIHRhc2sKKyAqICAgICBjZ3JvdXAgCSAgICAgIC0+CXN5c3RlbS13aWRlCisgKiAgICAgCQkgICAgICAtPgl0YXNrIGluIGNncm91cAorICogICAgIHRhc2sgCSAgICAgIC0+IAlzeXN0ZW0td2lkZQorICogICAgIAkJICAgICAgLT4JdGFzayBpbiBjZ3JvdXAKKyAqCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGFsbG9jYXRpbmcgYW4gUk1JRC4KKyAqLworc3RhdGljIGJvb2wgX19jb25mbGljdF9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqYSwgc3RydWN0IHBlcmZfZXZlbnQgKmIpCit7CisjaWZkZWYgQ09ORklHX0NHUk9VUF9QRVJGCisJLyoKKwkgKiBXZSBjYW4gaGF2ZSBhbnkgbnVtYmVyIG9mIGNncm91cHMgYnV0IG9ubHkgb25lIHN5c3RlbS13aWRlCisJICogZXZlbnQgYXQgYSB0aW1lLgorCSAqLworCWlmIChhLT5jZ3JwICYmIGItPmNncnApIHsKKwkJc3RydWN0IHBlcmZfY2dyb3VwICphYyA9IGEtPmNncnA7CisJCXN0cnVjdCBwZXJmX2Nncm91cCAqYmMgPSBiLT5jZ3JwOworCisJCS8qCisJCSAqIFRoaXMgY29uZGl0aW9uIHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGluCisJCSAqIF9fbWF0Y2hfZXZlbnQoKSBhbmQgd2Ugc2hvdWxkIGJlIHNoYXJpbmcgYW4gUk1JRC4KKwkJICovCisJCVdBUk5fT05fT05DRShhYyA9PSBiYyk7CisKKwkJaWYgKGNncm91cF9pc19kZXNjZW5kYW50KGFjLT5jc3MuY2dyb3VwLCBiYy0+Y3NzLmNncm91cCkgfHwKKwkJICAgIGNncm91cF9pc19kZXNjZW5kYW50KGJjLT5jc3MuY2dyb3VwLCBhYy0+Y3NzLmNncm91cCkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGEtPmNncnAgfHwgYi0+Y2dycCkgeworCQlzdHJ1Y3QgcGVyZl9jZ3JvdXAgKmFjLCAqYmM7CisKKwkJLyoKKwkJICogY2dyb3VwIGFuZCBzeXN0ZW0td2lkZSBldmVudHMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZQorCQkgKi8KKwkJaWYgKChhLT5jZ3JwICYmICEoYi0+YXR0YWNoX3N0YXRlICYgUEVSRl9BVFRBQ0hfVEFTSykpIHx8CisJCSAgICAoYi0+Y2dycCAmJiAhKGEtPmF0dGFjaF9zdGF0ZSAmIFBFUkZfQVRUQUNIX1RBU0spKSkKKwkJCXJldHVybiB0cnVlOworCisJCS8qCisJCSAqIEVuc3VyZSBuZWl0aGVyIGV2ZW50IGlzIHBhcnQgb2YgdGhlIG90aGVyJ3MgY2dyb3VwCisJCSAqLworCQlhYyA9IGV2ZW50X3RvX2Nncm91cChhKTsKKwkJYmMgPSBldmVudF90b19jZ3JvdXAoYik7CisJCWlmIChhYyA9PSBiYykKKwkJCXJldHVybiB0cnVlOworCisJCS8qCisJCSAqIE11c3QgaGF2ZSBjZ3JvdXAgYW5kIG5vbi1pbnRlcnNlY3RpbmcgdGFzayBldmVudHMuCisJCSAqLworCQlpZiAoIWFjIHx8ICFiYykKKwkJCXJldHVybiBmYWxzZTsKKworCQkvKgorCQkgKiBXZSBoYXZlIGNncm91cCBhbmQgdGFzayBldmVudHMsIGFuZCB0aGUgdGFzayBiZWxvbmdzCisJCSAqIHRvIGEgY2dyb3VwLiBDaGVjayBmb3IgZm9yIG92ZXJsYXAuCisJCSAqLworCQlpZiAoY2dyb3VwX2lzX2Rlc2NlbmRhbnQoYWMtPmNzcy5jZ3JvdXAsIGJjLT5jc3MuY2dyb3VwKSB8fAorCQkgICAgY2dyb3VwX2lzX2Rlc2NlbmRhbnQoYmMtPmNzcy5jZ3JvdXAsIGFjLT5jc3MuY2dyb3VwKSkKKwkJCXJldHVybiB0cnVlOworCisJCXJldHVybiBmYWxzZTsKKwl9CisjZW5kaWYKKwkvKgorCSAqIElmIG9uZSBvZiB0aGVtIGlzIG5vdCBhIHRhc2ssIHNhbWUgc3RvcnkgYXMgYWJvdmUgd2l0aCBjZ3JvdXBzLgorCSAqLworCWlmICghKGEtPmF0dGFjaF9zdGF0ZSAmIFBFUkZfQVRUQUNIX1RBU0spIHx8CisJICAgICEoYi0+YXR0YWNoX3N0YXRlICYgUEVSRl9BVFRBQ0hfVEFTSykpCisJCXJldHVybiB0cnVlOworCisJLyoKKwkgKiBNdXN0IGJlIG5vbi1vdmVybGFwcGluZy4KKwkgKi8KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0cnVjdCBybWlkX3JlYWQgeworCXVuc2lnbmVkIGludCBybWlkOworCWF0b21pYzY0X3QgdmFsdWU7Cit9OworCitzdGF0aWMgdm9pZCBfX2ludGVsX2NxbV9ldmVudF9jb3VudCh2b2lkICppbmZvKTsKKworLyoKKyAqIEV4Y2hhbmdlIHRoZSBSTUlEIG9mIGEgZ3JvdXAgb2YgZXZlbnRzLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50CitpbnRlbF9jcW1feGNoZ19ybWlkKHN0cnVjdCBwZXJmX2V2ZW50ICpncm91cCwgdW5zaWduZWQgaW50IHJtaWQpCit7CisJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50OworCXVuc2lnbmVkIGludCBvbGRfcm1pZCA9IGdyb3VwLT5ody5jcW1fcm1pZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmdyb3VwLT5ody5jcW1fZ3JvdXBfZW50cnk7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjYWNoZV9tdXRleCk7CisKKwkvKgorCSAqIElmIG91ciBSTUlEIGlzIGJlaW5nIGRlYWxsb2NhdGVkLCBwZXJmb3JtIGEgcmVhZCBub3cuCisJICovCisJaWYgKF9fcm1pZF92YWxpZChvbGRfcm1pZCkgJiYgIV9fcm1pZF92YWxpZChybWlkKSkgeworCQlzdHJ1Y3Qgcm1pZF9yZWFkIHJyID0geworCQkJLnZhbHVlID0gQVRPTUlDNjRfSU5JVCgwKSwKKwkJCS5ybWlkID0gb2xkX3JtaWQsCisJCX07CisKKwkJb25fZWFjaF9jcHVfbWFzaygmY3FtX2NwdW1hc2ssIF9faW50ZWxfY3FtX2V2ZW50X2NvdW50LAorCQkJCSAmcnIsIDEpOworCQlsb2NhbDY0X3NldCgmZ3JvdXAtPmNvdW50LCBhdG9taWM2NF9yZWFkKCZyci52YWx1ZSkpOworCX0KKworCXJhd19zcGluX2xvY2tfaXJxKCZjYWNoZV9sb2NrKTsKKworCWdyb3VwLT5ody5jcW1fcm1pZCA9IHJtaWQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudCwgaGVhZCwgaHcuY3FtX2dyb3VwX2VudHJ5KQorCQlldmVudC0+aHcuY3FtX3JtaWQgPSBybWlkOworCisJcmF3X3NwaW5fdW5sb2NrX2lycSgmY2FjaGVfbG9jayk7CisKKwlyZXR1cm4gb2xkX3JtaWQ7Cit9CisKKy8qCisgKiBJZiB3ZSBmYWlsIHRvIGFzc2lnbiBhIG5ldyBSTUlEIGZvciBpbnRlbF9jcW1fcm90YXRpb25fcm1pZCBiZWNhdXNlCisgKiBjYWNoZWxpbmVzIGFyZSBzdGlsbCB0YWdnZWQgd2l0aCBSTUlEcyBpbiBsaW1ibywgd2UgcHJvZ3Jlc3NpdmVseQorICogaW5jcmVtZW50IHRoZSB0aHJlc2hvbGQgdW50aWwgd2UgZmluZCBhbiBSTUlEIGluIGxpbWJvIHdpdGggPD0KKyAqIF9faW50ZWxfY3FtX3RocmVzaG9sZCBsaW5lcyB0YWdnZWQuIFRoaXMgaXMgZGVzaWduZWQgdG8gbWl0aWdhdGUgdGhlCisgKiBwcm9ibGVtIHdoZXJlIGNhY2hlbGluZXMgdGFnZ2VkIHdpdGggYW4gUk1JRCBhcmUgbm90IHN0ZWFkaWx5IGJlaW5nCisgKiBldmljdGVkLgorICoKKyAqIE9uIHN1Y2Nlc3NmdWwgcm90YXRpb25zIHdlIGRlY3JlYXNlIHRoZSB0aHJlc2hvbGQgYmFjayB0b3dhcmRzIHplcm8uCisgKgorICogX19pbnRlbF9jcW1fbWF4X3RocmVzaG9sZCBwcm92aWRlcyBhbiB1cHBlciBib3VuZCBvbiB0aGUgdGhyZXNob2xkLAorICogYW5kIGlzIG1lYXN1cmVkIGluIGJ5dGVzIGJlY2F1c2UgaXQncyBleHBvc2VkIHRvIHVzZXJsYW5kLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IF9faW50ZWxfY3FtX3RocmVzaG9sZDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pbnRlbF9jcW1fbWF4X3RocmVzaG9sZDsKKworLyoKKyAqIFRlc3Qgd2hldGhlciBhbiBSTUlEIGhhcyBhIHplcm8gb2NjdXBhbmN5IHZhbHVlIG9uIHRoaXMgY3B1LgorICovCitzdGF0aWMgdm9pZCBpbnRlbF9jcW1fc3RhYmxlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgY3FtX3JtaWRfZW50cnkgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmNxbV9ybWlkX2xpbWJvX2xydSwgbGlzdCkgeworCQlpZiAoZW50cnktPnN0YXRlICE9IFJNSURfQVZBSUxBQkxFKQorCQkJYnJlYWs7CisKKwkJaWYgKF9fcm1pZF9yZWFkKGVudHJ5LT5ybWlkKSA+IF9faW50ZWxfY3FtX3RocmVzaG9sZCkKKwkJCWVudHJ5LT5zdGF0ZSA9IFJNSURfRElSVFk7CisJfQorfQorCisvKgorICogSWYgd2UgaGF2ZSBncm91cCBldmVudHMgd2FpdGluZyBmb3IgYW4gUk1JRCB0aGF0IGRvbid0IGNvbmZsaWN0IHdpdGgKKyAqIGV2ZW50cyBhbHJlYWR5IHJ1bm5pbmcsIGFzc2lnbiBAcm1pZC4KKyAqLworc3RhdGljIGJvb2wgaW50ZWxfY3FtX3NjaGVkX2luX2V2ZW50KHVuc2lnbmVkIGludCBybWlkKQoreworCXN0cnVjdCBwZXJmX2V2ZW50ICpsZWFkZXIsICpldmVudDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNhY2hlX211dGV4KTsKKworCWxlYWRlciA9IGxpc3RfZmlyc3RfZW50cnkoJmNhY2hlX2dyb3Vwcywgc3RydWN0IHBlcmZfZXZlbnQsCisJCQkJICBody5jcW1fZ3JvdXBzX2VudHJ5KTsKKwlldmVudCA9IGxlYWRlcjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUoZXZlbnQsICZjYWNoZV9ncm91cHMsCisJCQkJICAgICBody5jcW1fZ3JvdXBzX2VudHJ5KSB7CisJCWlmIChfX3JtaWRfdmFsaWQoZXZlbnQtPmh3LmNxbV9ybWlkKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChfX2NvbmZsaWN0X2V2ZW50KGV2ZW50LCBsZWFkZXIpKQorCQkJY29udGludWU7CisKKwkJaW50ZWxfY3FtX3hjaGdfcm1pZChldmVudCwgcm1pZCk7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEluaXRpYWxseSB1c2UgdGhpcyBjb25zdGFudCBmb3IgYm90aCB0aGUgbGltYm8gcXVldWUgdGltZSBhbmQgdGhlCisgKiByb3RhdGlvbiB0aW1lciBpbnRlcnZhbCwgcG11OjpocnRpbWVyX2ludGVydmFsX21zLgorICoKKyAqIFRoZXkgZG9uJ3QgbmVlZCB0byBiZSB0aGUgc2FtZSwgYnV0IHRoZSB0d28gYXJlIHJlbGF0ZWQgc2luY2UgaWYgeW91CisgKiByb3RhdGUgZmFzdGVyIHRoYW4geW91IHJlY3ljbGUgUk1JRHMsIHlvdSBtYXkgcnVuIG91dCBvZiBhdmFpbGFibGUKKyAqIFJNSURzLgorICovCisjZGVmaW5lIFJNSURfREVGQVVMVF9RVUVVRV9USU1FIDI1MAkvKiBtcyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IF9fcm1pZF9xdWV1ZV90aW1lX21zID0gUk1JRF9ERUZBVUxUX1FVRVVFX1RJTUU7CisKKy8qCisgKiBpbnRlbF9jcW1fcm1pZF9zdGFiaWxpemUgLSBtb3ZlIFJNSURzIGZyb20gbGltYm8gdG8gZnJlZSBsaXN0CisgKiBAbnJfYXZhaWxhYmxlOiBudW1iZXIgb2YgZnJlZWFibGUgUk1JRHMgb24gdGhlIGxpbWJvIGxpc3QKKyAqCisgKiBRdWllc2NlbnQgc3RhdGU7IHdhaXQgZm9yIGFsbCAnZnJlZWQnIFJNSURzIHRvIGJlY29tZSB1bnVzZWQsIGkuZS4gbm8KKyAqIGNhY2hlbGluZXMgYXJlIHRhZ2dlZCB3aXRoIHRob3NlIFJNSURzLiBBZnRlciB0aGlzIHdlIGNhbiByZXVzZSB0aGVtCisgKiBhbmQga25vdyB0aGF0IHRoZSBjdXJyZW50IHNldCBvZiBhY3RpdmUgUk1JRHMgaXMgc3RhYmxlLgorICoKKyAqIFJldHVybiAldHJ1ZSBvciAlZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgc3RhYmlsaXphdGlvbiBuZWVkcyB0byBiZQorICogcmVhdHRlbXB0ZWQuCisgKgorICogSWYgd2UgcmV0dXJuICV0cnVlIHRoZW4gQG5yX2F2YWlsYWJsZSBpcyB1cGRhdGVkIHRvIGluZGljYXRlIHRoZQorICogbnVtYmVyIG9mIFJNSURzIG9uIHRoZSBsaW1ibyBsaXN0IHRoYXQgaGF2ZSBiZWVuIHF1ZXVlZCBmb3IgdGhlCisgKiBtaW5pbXVtIHF1ZXVlIHRpbWUgKFJNSURfQVZBSUxBQkxFKSwgYnV0IHdob3NlIGRhdGEgb2NjdXBhbmN5IHZhbHVlcworICogYXJlIGFib3ZlIF9faW50ZWxfY3FtX3RocmVzaG9sZC4KKyAqLworc3RhdGljIGJvb2wgaW50ZWxfY3FtX3JtaWRfc3RhYmlsaXplKHVuc2lnbmVkIGludCAqYXZhaWxhYmxlKQoreworCXN0cnVjdCBjcW1fcm1pZF9lbnRyeSAqZW50cnksICp0bXA7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZjYWNoZV9tdXRleCk7CisKKwkqYXZhaWxhYmxlID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCAmY3FtX3JtaWRfbGltYm9fbHJ1LCBsaXN0KSB7CisJCXVuc2lnbmVkIGxvbmcgbWluX3F1ZXVlX3RpbWU7CisJCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKKworCQkvKgorCQkgKiBXZSBob2xkIFJNSURzIHBsYWNlZCBpbnRvIGxpbWJvIGZvciBhIG1pbmltdW0gcXVldWUKKwkJICogdGltZS4gQmVmb3JlIHRoZSBtaW5pbXVtIHF1ZXVlIHRpbWUgaGFzIGVsYXBzZWQgd2UgZG8KKwkJICogbm90IHJlY3ljbGUgUk1JRHMuCisJCSAqCisJCSAqIFRoZSByZWFzb25pbmcgaXMgdGhhdCB1bnRpbCBhIHN1ZmZpY2llbnQgdGltZSBoYXMKKwkJICogcGFzc2VkIHNpbmNlIHdlIHN0b3BwZWQgdXNpbmcgYW4gUk1JRCwgYW55IFJNSUQKKwkJICogcGxhY2VkIG9udG8gdGhlIGxpbWJvIGxpc3Qgd2lsbCBsaWtlbHkgc3RpbGwgaGF2ZQorCQkgKiBkYXRhIHRhZ2dlZCBpbiB0aGUgY2FjaGUsIHdoaWNoIG1lYW5zIHdlJ2xsIHByb2JhYmx5CisJCSAqIGZhaWwgdG8gcmVjeWNsZSBpdCBhbnl3YXkuCisJCSAqCisJCSAqIFdlIGNhbiBzYXZlIG91cnNlbHZlcyBhbiBleHBlbnNpdmUgSVBJIGJ5IHNraXBwaW5nCisJCSAqIGFueSBSTUlEcyB0aGF0IGhhdmUgbm90IGJlZW4gcXVldWVkIGZvciB0aGUgbWluaW11bQorCQkgKiB0aW1lLgorCQkgKi8KKwkJbWluX3F1ZXVlX3RpbWUgPSBlbnRyeS0+cXVldWVfdGltZSArCisJCQltc2Vjc190b19qaWZmaWVzKF9fcm1pZF9xdWV1ZV90aW1lX21zKTsKKworCQlpZiAodGltZV9hZnRlcihtaW5fcXVldWVfdGltZSwgbm93KSkKKwkJCWJyZWFrOworCisJCWVudHJ5LT5zdGF0ZSA9IFJNSURfQVZBSUxBQkxFOworCQkoKmF2YWlsYWJsZSkrKzsKKwl9CisKKwkvKgorCSAqIEZhc3QgcmV0dXJuIGlmIG5vbmUgb2YgdGhlIFJNSURzIG9uIHRoZSBsaW1ibyBsaXN0IGhhdmUgYmVlbgorCSAqIHNpdHRpbmcgb24gdGhlIHF1ZXVlIGZvciB0aGUgbWluaW11bSBxdWV1ZSB0aW1lLgorCSAqLworCWlmICghKmF2YWlsYWJsZSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBUZXN0IHdoZXRoZXIgYW4gUk1JRCBpcyBmcmVlIGZvciBlYWNoIHBhY2thZ2UuCisJICovCisJb25fZWFjaF9jcHVfbWFzaygmY3FtX2NwdW1hc2ssIGludGVsX2NxbV9zdGFibGUsIE5VTEwsIHRydWUpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVudHJ5LCB0bXAsICZjcW1fcm1pZF9saW1ib19scnUsIGxpc3QpIHsKKwkJLyoKKwkJICogRXhoYXVzdGVkIGFsbCBSTUlEcyB0aGF0IGhhdmUgd2FpdGVkIG1pbiBxdWV1ZSB0aW1lLgorCQkgKi8KKwkJaWYgKGVudHJ5LT5zdGF0ZSA9PSBSTUlEX1lPVU5HKQorCQkJYnJlYWs7CisKKwkJaWYgKGVudHJ5LT5zdGF0ZSA9PSBSTUlEX0RJUlRZKQorCQkJY29udGludWU7CisKKwkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsJLyogcmVtb3ZlIGZyb20gbGltYm8gKi8KKworCQkvKgorCQkgKiBUaGUgcm90YXRpb24gUk1JRCBnZXRzIHByaW9yaXR5IGlmIGl0J3MKKwkJICogY3VycmVudGx5IGludmFsaWQuIEluIHdoaWNoIGNhc2UsIHNraXAgYWRkaW5nCisJCSAqIHRoZSBSTUlEIHRvIHRoZSB0aGUgZnJlZSBscnUuCisJCSAqLworCQlpZiAoIV9fcm1pZF92YWxpZChpbnRlbF9jcW1fcm90YXRpb25fcm1pZCkpIHsKKwkJCWludGVsX2NxbV9yb3RhdGlvbl9ybWlkID0gZW50cnktPnJtaWQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIElmIHdlIGhhdmUgZ3JvdXBzIHdhaXRpbmcgZm9yIFJNSURzLCBoYW5kCisJCSAqIHRoZW0gb25lIG5vdyBwcm92aWRlZCB0aGV5IGRvbid0IGNvbmZsaWN0LgorCQkgKi8KKwkJaWYgKGludGVsX2NxbV9zY2hlZF9pbl9ldmVudChlbnRyeS0+cm1pZCkpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBPdGhlcndpc2UgcGxhY2UgaXQgb250byB0aGUgZnJlZSBsaXN0LgorCQkgKi8KKwkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZjcW1fcm1pZF9mcmVlX2xydSk7CisJfQorCisKKwlyZXR1cm4gX19ybWlkX3ZhbGlkKGludGVsX2NxbV9yb3RhdGlvbl9ybWlkKTsKK30KKworLyoKKyAqIFBpY2sgYSB2aWN0aW0gZ3JvdXAgYW5kIG1vdmUgaXQgdG8gdGhlIHRhaWwgb2YgdGhlIGdyb3VwIGxpc3QuCisgKiBAbmV4dDogVGhlIGZpcnN0IGdyb3VwIHdpdGhvdXQgYW4gUk1JRAorICovCitzdGF0aWMgdm9pZCBfX2ludGVsX2NxbV9waWNrX2FuZF9yb3RhdGUoc3RydWN0IHBlcmZfZXZlbnQgKm5leHQpCit7CisJc3RydWN0IHBlcmZfZXZlbnQgKnJvdG9yOworCXVuc2lnbmVkIGludCBybWlkOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmY2FjaGVfbXV0ZXgpOworCisJcm90b3IgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjYWNoZV9ncm91cHMsIHN0cnVjdCBwZXJmX2V2ZW50LAorCQkJCSBody5jcW1fZ3JvdXBzX2VudHJ5KTsKKworCS8qCisJICogVGhlIGdyb3VwIGF0IHRoZSBmcm9udCBvZiB0aGUgbGlzdCBzaG91bGQgYWx3YXlzIGhhdmUgYSB2YWxpZAorCSAqIFJNSUQuIElmIGl0IGRvZXNuJ3QgdGhlbiBubyBncm91cHMgaGF2ZSBSTUlEcyBhc3NpZ25lZCBhbmQgd2UKKwkgKiBkb24ndCBuZWVkIHRvIHJvdGF0ZSB0aGUgbGlzdC4KKwkgKi8KKwlpZiAobmV4dCA9PSByb3RvcikKKwkJcmV0dXJuOworCisJcm1pZCA9IGludGVsX2NxbV94Y2hnX3JtaWQocm90b3IsIElOVkFMSURfUk1JRCk7CisJX19wdXRfcm1pZChybWlkKTsKKworCWxpc3Rfcm90YXRlX2xlZnQoJmNhY2hlX2dyb3Vwcyk7Cit9CisKKy8qCisgKiBEZWFsbG9jYXRlIHRoZSBSTUlEcyBmcm9tIGFueSBldmVudHMgdGhhdCBjb25mbGljdCB3aXRoIEBldmVudCwgYW5kCisgKiBwbGFjZSB0aGVtIG9uIHRoZSBiYWNrIG9mIHRoZSBncm91cCBsaXN0LgorICovCitzdGF0aWMgdm9pZCBpbnRlbF9jcW1fc2NoZWRfb3V0X2NvbmZsaWN0aW5nX2V2ZW50cyhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHBlcmZfZXZlbnQgKmdyb3VwLCAqZzsKKwl1bnNpZ25lZCBpbnQgcm1pZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNhY2hlX211dGV4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShncm91cCwgZywgJmNhY2hlX2dyb3VwcywgaHcuY3FtX2dyb3Vwc19lbnRyeSkgeworCQlpZiAoZ3JvdXAgPT0gZXZlbnQpCisJCQljb250aW51ZTsKKworCQlybWlkID0gZ3JvdXAtPmh3LmNxbV9ybWlkOworCisJCS8qCisJCSAqIFNraXAgZXZlbnRzIHRoYXQgZG9uJ3QgaGF2ZSBhIHZhbGlkIFJNSUQuCisJCSAqLworCQlpZiAoIV9fcm1pZF92YWxpZChybWlkKSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIE5vIGNvbmZsaWN0PyBObyBwcm9ibGVtISBMZWF2ZSB0aGUgZXZlbnQgYWxvbmUuCisJCSAqLworCQlpZiAoIV9fY29uZmxpY3RfZXZlbnQoZ3JvdXAsIGV2ZW50KSkKKwkJCWNvbnRpbnVlOworCisJCWludGVsX2NxbV94Y2hnX3JtaWQoZ3JvdXAsIElOVkFMSURfUk1JRCk7CisJCV9fcHV0X3JtaWQocm1pZCk7CisJfQorfQorCisvKgorICogQXR0ZW1wdCB0byByb3RhdGUgdGhlIGdyb3VwcyBhbmQgYXNzaWduIG5ldyBSTUlEcy4KKyAqCisgKiBXZSByb3RhdGUgZm9yIHR3byByZWFzb25zLAorICogICAxLiBUbyBoYW5kbGUgdGhlIHNjaGVkdWxpbmcgb2YgY29uZmxpY3RpbmcgZXZlbnRzCisgKiAgIDIuIFRvIHJlY3ljbGUgUk1JRHMKKyAqCisgKiBSb3RhdGluZyBSTUlEcyBpcyBjb21wbGljYXRlZCBiZWNhdXNlIHRoZSBoYXJkd2FyZSBkb2Vzbid0IGdpdmUgdXMKKyAqIGFueSBjbHVlcy4KKyAqCisgKiBUaGVyZSdzIHByb2JsZW1zIHdpdGggdGhlIGhhcmR3YXJlIGludGVyZmFjZTsgd2hlbiB5b3UgY2hhbmdlIHRoZQorICogdGFzazpSTUlEIG1hcCBjYWNoZWxpbmVzIHJldGFpbiB0aGVpciAnb2xkJyB0YWdzLCBnaXZpbmcgYSBza2V3ZWQKKyAqIHBpY3R1cmUuIEluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHRoaXMsIHdlIG11c3QgYWx3YXlzIGtlZXAgb25lIGZyZWUKKyAqIFJNSUQgLSBpbnRlbF9jcW1fcm90YXRpb25fcm1pZC4KKyAqCisgKiBSb3RhdGlvbiB3b3JrcyBieSB0YWtpbmcgYXdheSBhbiBSTUlEIGZyb20gYSBncm91cCAodGhlIG9sZCBSTUlEKSwKKyAqIGFuZCBhc3NpZ25pbmcgdGhlIGZyZWUgUk1JRCB0byBhbm90aGVyIGdyb3VwICh0aGUgbmV3IFJNSUQpLiBXZSBtdXN0CisgKiB0aGVuIHdhaXQgZm9yIHRoZSBvbGQgUk1JRCB0byBub3QgYmUgdXNlZCAobm8gY2FjaGVsaW5lcyB0YWdnZWQpLgorICogVGhpcyBlbnN1cmUgdGhhdCBhbGwgY2FjaGVsaW5lcyBhcmUgdGFnZ2VkIHdpdGggJ2FjdGl2ZScgUk1JRHMuIEF0CisgKiB0aGlzIHBvaW50IHdlIGNhbiBzdGFydCByZWFkaW5nIHZhbHVlcyBmb3IgdGhlIG5ldyBSTUlEIGFuZCB0cmVhdCB0aGUKKyAqIG9sZCBSTUlEIGFzIHRoZSBmcmVlIFJNSUQgZm9yIHRoZSBuZXh0IHJvdGF0aW9uLgorICoKKyAqIFJldHVybiAldHJ1ZSBvciAlZmFsc2UgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgZGlkIGFueSByb3RhdGluZy4KKyAqLworc3RhdGljIGJvb2wgX19pbnRlbF9jcW1fcm1pZF9yb3RhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqZ3JvdXAsICpzdGFydCA9IE5VTEw7CisJdW5zaWduZWQgaW50IHRocmVzaG9sZF9saW1pdDsKKwl1bnNpZ25lZCBpbnQgbnJfbmVlZGVkID0gMDsKKwl1bnNpZ25lZCBpbnQgbnJfYXZhaWxhYmxlOworCWJvb2wgcm90YXRlZCA9IGZhbHNlOworCisJbXV0ZXhfbG9jaygmY2FjaGVfbXV0ZXgpOworCithZ2FpbjoKKwkvKgorCSAqIEZhc3QgcGF0aCB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gaWYgdGhlcmUgYXJlIG5vIGdyb3VwcyBhbmQgbm8KKwkgKiBSTUlEcyB0aGF0IG5lZWQgY2xlYW5pbmcuCisJICovCisJaWYgKGxpc3RfZW1wdHkoJmNhY2hlX2dyb3VwcykgJiYgbGlzdF9lbXB0eSgmY3FtX3JtaWRfbGltYm9fbHJ1KSkKKwkJZ290byBvdXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdyb3VwLCAmY2FjaGVfZ3JvdXBzLCBody5jcW1fZ3JvdXBzX2VudHJ5KSB7CisJCWlmICghX19ybWlkX3ZhbGlkKGdyb3VwLT5ody5jcW1fcm1pZCkpIHsKKwkJCWlmICghc3RhcnQpCisJCQkJc3RhcnQgPSBncm91cDsKKwkJCW5yX25lZWRlZCsrOworCQl9CisJfQorCisJLyoKKwkgKiBXZSBoYXZlIHNvbWUgZXZlbnQgZ3JvdXBzLCBidXQgdGhleSBhbGwgaGF2ZSBSTUlEcyBhc3NpZ25lZAorCSAqIGFuZCBubyBSTUlEcyBuZWVkIGNsZWFuaW5nLgorCSAqLworCWlmICghbnJfbmVlZGVkICYmIGxpc3RfZW1wdHkoJmNxbV9ybWlkX2xpbWJvX2xydSkpCisJCWdvdG8gb3V0OworCisJaWYgKCFucl9uZWVkZWQpCisJCWdvdG8gc3RhYmlsaXplOworCisJLyoKKwkgKiBXZSBoYXZlIG1vcmUgZXZlbnQgZ3JvdXBzIHdpdGhvdXQgUk1JRHMgdGhhbiBhdmFpbGFibGUgUk1JRHMsCisJICogb3Igd2UgaGF2ZSBldmVudCBncm91cHMgdGhhdCBjb25mbGljdCB3aXRoIHRoZSBvbmVzIGN1cnJlbnRseQorCSAqIHNjaGVkdWxlZC4KKwkgKgorCSAqIFdlIGZvcmNlIGRlYWxsb2NhdGUgdGhlIHJtaWQgb2YgdGhlIGdyb3VwIGF0IHRoZSBoZWFkIG9mCisJICogY2FjaGVfZ3JvdXBzLiBUaGUgZmlyc3QgZXZlbnQgZ3JvdXAgd2l0aG91dCBhbiBSTUlEIHRoZW4gZ2V0cworCSAqIGFzc2lnbmVkIGludGVsX2NxbV9yb3RhdGlvbl9ybWlkLiBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIG1ha2UKKwkgKiBmb3J3YXJkIHByb2dyZXNzLgorCSAqCisJICogUm90YXRlIHRoZSBjYWNoZV9ncm91cHMgbGlzdCBzbyB0aGUgcHJldmlvdXMgaGVhZCBpcyBub3cgdGhlCisJICogdGFpbC4KKwkgKi8KKwlfX2ludGVsX2NxbV9waWNrX2FuZF9yb3RhdGUoc3RhcnQpOworCisJLyoKKwkgKiBJZiB0aGUgcm90YXRpb24gaXMgZ29pbmcgdG8gc3VjY2VlZCwgcmVkdWNlIHRoZSB0aHJlc2hvbGQgc28KKwkgKiB0aGF0IHdlIGRvbid0IG5lZWRsZXNzbHkgcmV1c2UgZGlydHkgUk1JRHMuCisJICovCisJaWYgKF9fcm1pZF92YWxpZChpbnRlbF9jcW1fcm90YXRpb25fcm1pZCkpIHsKKwkJaW50ZWxfY3FtX3hjaGdfcm1pZChzdGFydCwgaW50ZWxfY3FtX3JvdGF0aW9uX3JtaWQpOworCQlpbnRlbF9jcW1fcm90YXRpb25fcm1pZCA9IF9fZ2V0X3JtaWQoKTsKKworCQlpbnRlbF9jcW1fc2NoZWRfb3V0X2NvbmZsaWN0aW5nX2V2ZW50cyhzdGFydCk7CisKKwkJaWYgKF9faW50ZWxfY3FtX3RocmVzaG9sZCkKKwkJCV9faW50ZWxfY3FtX3RocmVzaG9sZC0tOworCX0KKworCXJvdGF0ZWQgPSB0cnVlOworCitzdGFiaWxpemU6CisJLyoKKwkgKiBXZSBub3cgbmVlZCB0byBzdGFibGl6ZSB0aGUgUk1JRCB3ZSBmcmVlZCBhYm92ZSAoaWYgYW55KSB0bworCSAqIGVuc3VyZSB0aGF0IHRoZSBuZXh0IHRpbWUgd2Ugcm90YXRlIHdlIGhhdmUgYW4gUk1JRCB3aXRoIHplcm8KKwkgKiBvY2N1cGFuY3kgdmFsdWUuCisJICoKKwkgKiBBbHRlcm5hdGl2ZWx5LCBpZiB3ZSBkaWRuJ3QgbmVlZCB0byBwZXJmb3JtIGFueSByb3RhdGlvbiwKKwkgKiB3ZSdsbCBoYXZlIGEgYnVuY2ggb2YgUk1JRHMgaW4gbGltYm8gdGhhdCBuZWVkIHN0YWJpbGl6aW5nLgorCSAqLworCXRocmVzaG9sZF9saW1pdCA9IF9faW50ZWxfY3FtX21heF90aHJlc2hvbGQgLyBjcW1fbDNfc2NhbGU7CisKKwl3aGlsZSAoaW50ZWxfY3FtX3JtaWRfc3RhYmlsaXplKCZucl9hdmFpbGFibGUpICYmCisJICAgICAgIF9faW50ZWxfY3FtX3RocmVzaG9sZCA8IHRocmVzaG9sZF9saW1pdCkgeworCQl1bnNpZ25lZCBpbnQgc3RlYWxfbGltaXQ7CisKKwkJLyoKKwkJICogRG9uJ3Qgc3BpbiBpZiBub2JvZHkgaXMgYWN0aXZlbHkgd2FpdGluZyBmb3IgYW4gUk1JRCwKKwkJICogdGhlIHJvdGF0aW9uIHdvcmtlciB3aWxsIGJlIGtpY2tlZCBhcyBzb29uIGFzIGFuCisJCSAqIGV2ZW50IG5lZWRzIGFuIFJNSUQgYW55d2F5LgorCQkgKi8KKwkJaWYgKCFucl9uZWVkZWQpCisJCQlicmVhazsKKworCQkvKiBBbGxvdyBtYXggMjUlIG9mIFJNSURzIHRvIGJlIGluIGxpbWJvLiAqLworCQlzdGVhbF9saW1pdCA9IChjcW1fbWF4X3JtaWQgKyAxKSAvIDQ7CisKKwkJLyoKKwkJICogV2UgZmFpbGVkIHRvIHN0YWJpbGl6ZSBhbnkgUk1JRHMgc28gb3VyIHJvdGF0aW9uCisJCSAqIGxvZ2ljIGlzIG5vdyBzdHVjay4gSW4gb3JkZXIgdG8gbWFrZSBmb3J3YXJkIHByb2dyZXNzCisJCSAqIHdlIGhhdmUgYSBmZXcgb3B0aW9uczoKKwkJICoKKwkJICogICAxLiByb3RhdGUgKCJzdGVhbCIpIGFub3RoZXIgUk1JRAorCQkgKiAgIDIuIGluY3JlYXNlIHRoZSB0aHJlc2hvbGQKKwkJICogICAzLiBkbyBub3RoaW5nCisJCSAqCisJCSAqIFdlIGRvIGJvdGggb2YgMS4gYW5kIDIuIHVudGlsIHdlIGhpdCB0aGUgc3RlYWwgbGltaXQuCisJCSAqCisJCSAqIFRoZSBzdGVhbCBsaW1pdCBwcmV2ZW50cyBhbGwgUk1JRHMgZW5kaW5nIHVwIG9uIHRoZQorCQkgKiBsaW1ibyBsaXN0LiBUaGlzIGNhbiBoYXBwZW4gaWYgZXZlcnkgUk1JRCBoYXMgYQorCQkgKiBub24temVybyBvY2N1cGFuY3kgYWJvdmUgdGhyZXNob2xkX2xpbWl0LCBhbmQgdGhlCisJCSAqIG9jY3VwYW5jeSB2YWx1ZXMgYXJlbid0IGRyb3BwaW5nIGZhc3QgZW5vdWdoLgorCQkgKgorCQkgKiBOb3RlIHRoYXQgdGhlcmUgaXMgcHJpb3JpdGlzYXRpb24gYXQgd29yayBoZXJlIC0gd2UnZAorCQkgKiByYXRoZXIgaW5jcmVhc2UgdGhlIG51bWJlciBvZiBSTUlEcyBvbiB0aGUgbGltYm8gbGlzdAorCQkgKiB0aGFuIGluY3JlYXNlIHRoZSB0aHJlc2hvbGQsIGJlY2F1c2UgaW5jcmVhc2luZyB0aGUKKwkJICogdGhyZXNob2xkIHNrZXdzIHRoZSBldmVudCBkYXRhIChiZWNhdXNlIHdlIHJldXNlCisJCSAqIGRpcnR5IFJNSURzKSAtIHRocmVzaG9sZCBidW1wcyBhcmUgYSBsYXN0IHJlc29ydC4KKwkJICovCisJCWlmIChucl9hdmFpbGFibGUgPCBzdGVhbF9saW1pdCkKKwkJCWdvdG8gYWdhaW47CisKKwkJX19pbnRlbF9jcW1fdGhyZXNob2xkKys7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjYWNoZV9tdXRleCk7CisJcmV0dXJuIHJvdGF0ZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2NxbV9ybWlkX3JvdGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworCitzdGF0aWMgREVDTEFSRV9ERUxBWUVEX1dPUksoaW50ZWxfY3FtX3JtaWRfd29yaywgaW50ZWxfY3FtX3JtaWRfcm90YXRlKTsKKworc3RhdGljIHN0cnVjdCBwbXUgaW50ZWxfY3FtX3BtdTsKKworc3RhdGljIHZvaWQgaW50ZWxfY3FtX3JtaWRfcm90YXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwl1bnNpZ25lZCBsb25nIGRlbGF5OworCisJX19pbnRlbF9jcW1fcm1pZF9yb3RhdGUoKTsKKworCWRlbGF5ID0gbXNlY3NfdG9famlmZmllcyhpbnRlbF9jcW1fcG11LmhydGltZXJfaW50ZXJ2YWxfbXMpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW50ZWxfY3FtX3JtaWRfd29yaywgZGVsYXkpOworfQorCisvKgorICogRmluZCBhIGdyb3VwIGFuZCBzZXR1cCBSTUlELgorICoKKyAqIElmIHdlJ3JlIHBhcnQgb2YgYSBncm91cCwgd2UgdXNlIHRoZSBncm91cCdzIFJNSUQuCisgKi8KK3N0YXRpYyB2b2lkIGludGVsX2NxbV9zZXR1cF9ldmVudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQkJICBzdHJ1Y3QgcGVyZl9ldmVudCAqKmdyb3VwKQoreworCXN0cnVjdCBwZXJmX2V2ZW50ICppdGVyOworCXVuc2lnbmVkIGludCBybWlkOworCWJvb2wgY29uZmxpY3QgPSBmYWxzZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRlciwgJmNhY2hlX2dyb3VwcywgaHcuY3FtX2dyb3Vwc19lbnRyeSkgeworCQlybWlkID0gaXRlci0+aHcuY3FtX3JtaWQ7CisKKwkJaWYgKF9fbWF0Y2hfZXZlbnQoaXRlciwgZXZlbnQpKSB7CisJCQkvKiBBbGwgdGFza3MgaW4gYSBncm91cCBzaGFyZSBhbiBSTUlEICovCisJCQlldmVudC0+aHcuY3FtX3JtaWQgPSBybWlkOworCQkJKmdyb3VwID0gaXRlcjsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qCisJCSAqIFdlIG9ubHkgY2FyZSBhYm91dCBjb25mbGljdHMgZm9yIGV2ZW50cyB0aGF0IGFyZQorCQkgKiBhY3R1YWxseSBzY2hlZHVsZWQgaW4gKGFuZCBoZW5jZSBoYXZlIGEgdmFsaWQgUk1JRCkuCisJCSAqLworCQlpZiAoX19jb25mbGljdF9ldmVudChpdGVyLCBldmVudCkgJiYgX19ybWlkX3ZhbGlkKHJtaWQpKQorCQkJY29uZmxpY3QgPSB0cnVlOworCX0KKworCWlmIChjb25mbGljdCkKKwkJcm1pZCA9IElOVkFMSURfUk1JRDsKKwllbHNlCisJCXJtaWQgPSBfX2dldF9ybWlkKCk7CisKKwlldmVudC0+aHcuY3FtX3JtaWQgPSBybWlkOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jcW1fZXZlbnRfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcm1pZDsKKwl1NjQgdmFsOworCisJLyoKKwkgKiBUYXNrIGV2ZW50cyBhcmUgaGFuZGxlZCBieSBpbnRlbF9jcW1fZXZlbnRfY291bnQoKS4KKwkgKi8KKwlpZiAoZXZlbnQtPmNwdSA9PSAtMSkKKwkJcmV0dXJuOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZjYWNoZV9sb2NrLCBmbGFncyk7CisJcm1pZCA9IGV2ZW50LT5ody5jcW1fcm1pZDsKKworCWlmICghX19ybWlkX3ZhbGlkKHJtaWQpKQorCQlnb3RvIG91dDsKKworCXZhbCA9IF9fcm1pZF9yZWFkKHJtaWQpOworCisJLyoKKwkgKiBJZ25vcmUgdGhpcyByZWFkaW5nIG9uIGVycm9yIHN0YXRlcyBhbmQgZG8gbm90IHVwZGF0ZSB0aGUgdmFsdWUuCisJICovCisJaWYgKHZhbCAmIChSTUlEX1ZBTF9FUlJPUiB8IFJNSURfVkFMX1VOQVZBSUwpKQorCQlnb3RvIG91dDsKKworCWxvY2FsNjRfc2V0KCZldmVudC0+Y291bnQsIHZhbCk7CitvdXQ6CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhY2hlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgX19pbnRlbF9jcW1fZXZlbnRfY291bnQodm9pZCAqaW5mbykKK3sKKwlzdHJ1Y3Qgcm1pZF9yZWFkICpyciA9IGluZm87CisJdTY0IHZhbDsKKworCXZhbCA9IF9fcm1pZF9yZWFkKHJyLT5ybWlkKTsKKworCWlmICh2YWwgJiAoUk1JRF9WQUxfRVJST1IgfCBSTUlEX1ZBTF9VTkFWQUlMKSkKKwkJcmV0dXJuOworCisJYXRvbWljNjRfYWRkKHZhbCwgJnJyLT52YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjcW1fZ3JvdXBfbGVhZGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlyZXR1cm4gIWxpc3RfZW1wdHkoJmV2ZW50LT5ody5jcW1fZ3JvdXBzX2VudHJ5KTsKK30KKworc3RhdGljIHU2NCBpbnRlbF9jcW1fZXZlbnRfY291bnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJtaWRfcmVhZCByciA9IHsKKwkJLnZhbHVlID0gQVRPTUlDNjRfSU5JVCgwKSwKKwl9OworCisJLyoKKwkgKiBXZSBvbmx5IG5lZWQgdG8gd29ycnkgYWJvdXQgdGFzayBldmVudHMuIFN5c3RlbS13aWRlIGV2ZW50cworCSAqIGFyZSBoYW5kbGVkIGxpa2UgdXN1YWwsIGkuZS4gZW50aXJlbHkgd2l0aAorCSAqIGludGVsX2NxbV9ldmVudF9yZWFkKCkuCisJICovCisJaWYgKGV2ZW50LT5jcHUgIT0gLTEpCisJCXJldHVybiBfX3BlcmZfZXZlbnRfY291bnQoZXZlbnQpOworCisJLyoKKwkgKiBPbmx5IHRoZSBncm91cCBsZWFkZXIgZ2V0cyB0byByZXBvcnQgdmFsdWVzLiBUaGlzIHN0b3BzIHVzCisJICogcmVwb3J0aW5nIGR1cGxpY2F0ZSB2YWx1ZXMgdG8gdXNlcnNwYWNlLCBhbmQgZ2l2ZXMgdXMgYSBjbGVhcgorCSAqIHJ1bGUgZm9yIHdoaWNoIHRhc2sgZ2V0cyB0byByZXBvcnQgdGhlIHZhbHVlcy4KKwkgKgorCSAqIE5vdGUgdGhhdCBpdCBpcyBpbXBvc3NpYmxlIHRvIGF0dHJpYnV0ZSB0aGVzZSB2YWx1ZXMgdG8KKwkgKiBzcGVjaWZpYyBwYWNrYWdlcyAtIHdlIGZvcmZlaXQgdGhhdCBhYmlsaXR5IHdoZW4gd2UgY3JlYXRlCisJICogdGFzayBldmVudHMuCisJICovCisJaWYgKCFjcW1fZ3JvdXBfbGVhZGVyKGV2ZW50KSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIE5vdGljZSB0aGF0IHdlIGRvbid0IHBlcmZvcm0gdGhlIHJlYWRpbmcgb2YgYW4gUk1JRAorCSAqIGF0b21pY2FsbHksIGJlY2F1c2Ugd2UgY2FuJ3QgaG9sZCBhIHNwaW4gbG9jayBhY3Jvc3MgdGhlCisJICogSVBJcy4KKwkgKgorCSAqIFNwZWN1bGF0aXZlbHkgcGVyZm9ybSB0aGUgcmVhZCwgc2luY2UgQGV2ZW50IG1pZ2h0IGJlCisJICogYXNzaWduZWQgYSBkaWZmZXJlbnQgKHBvc3NpYmx5IGludmFsaWQpIFJNSUQgd2hpbGUgd2UncmUKKwkgKiBidXN5aW5nIHBlcmZvcm1pbmcgdGhlIElQSSBjYWxscy4gSXQncyB0aGVyZWZvcmUgbmVjZXNzYXJ5IHRvCisJICogY2hlY2sgQGV2ZW50J3MgUk1JRCBhZnRlcndhcmRzLCBhbmQgaWYgaXQgaGFzIGNoYW5nZWQsCisJICogZGlzY2FyZCB0aGUgcmVzdWx0IG9mIHRoZSByZWFkLgorCSAqLworCXJyLnJtaWQgPSBBQ0NFU1NfT05DRShldmVudC0+aHcuY3FtX3JtaWQpOworCisJaWYgKCFfX3JtaWRfdmFsaWQocnIucm1pZCkpCisJCWdvdG8gb3V0OworCisJb25fZWFjaF9jcHVfbWFzaygmY3FtX2NwdW1hc2ssIF9faW50ZWxfY3FtX2V2ZW50X2NvdW50LCAmcnIsIDEpOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZjYWNoZV9sb2NrLCBmbGFncyk7CisJaWYgKGV2ZW50LT5ody5jcW1fcm1pZCA9PSByci5ybWlkKQorCQlsb2NhbDY0X3NldCgmZXZlbnQtPmNvdW50LCBhdG9taWM2NF9yZWFkKCZyci52YWx1ZSkpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYWNoZV9sb2NrLCBmbGFncyk7CitvdXQ6CisJcmV0dXJuIF9fcGVyZl9ldmVudF9jb3VudChldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2NxbV9ldmVudF9zdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBtb2RlKQoreworCXN0cnVjdCBpbnRlbF9jcW1fc3RhdGUgKnN0YXRlID0gdGhpc19jcHVfcHRyKCZjcW1fc3RhdGUpOworCXVuc2lnbmVkIGludCBybWlkID0gZXZlbnQtPmh3LmNxbV9ybWlkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIShldmVudC0+aHcuY3FtX3N0YXRlICYgUEVSRl9IRVNfU1RPUFBFRCkpCisJCXJldHVybjsKKworCWV2ZW50LT5ody5jcW1fc3RhdGUgJj0gflBFUkZfSEVTX1NUT1BQRUQ7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoc3RhdGUtPmNudCsrKQorCQlXQVJOX09OX09OQ0Uoc3RhdGUtPnJtaWQgIT0gcm1pZCk7CisJZWxzZQorCQlXQVJOX09OX09OQ0Uoc3RhdGUtPnJtaWQpOworCisJc3RhdGUtPnJtaWQgPSBybWlkOworCXdybXNybChNU1JfSUEzMl9QUVJfQVNTT0MsIHN0YXRlLT5ybWlkKTsKKworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jcW1fZXZlbnRfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBtb2RlKQoreworCXN0cnVjdCBpbnRlbF9jcW1fc3RhdGUgKnN0YXRlID0gdGhpc19jcHVfcHRyKCZjcW1fc3RhdGUpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZXZlbnQtPmh3LmNxbV9zdGF0ZSAmIFBFUkZfSEVTX1NUT1BQRUQpCisJCXJldHVybjsKKworCWV2ZW50LT5ody5jcW1fc3RhdGUgfD0gUEVSRl9IRVNfU1RPUFBFRDsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmxvY2ssIGZsYWdzKTsKKwlpbnRlbF9jcW1fZXZlbnRfcmVhZChldmVudCk7CisKKwlpZiAoIS0tc3RhdGUtPmNudCkgeworCQlzdGF0ZS0+cm1pZCA9IDA7CisJCXdybXNybChNU1JfSUEzMl9QUVJfQVNTT0MsIDApOworCX0gZWxzZSB7CisJCVdBUk5fT05fT05DRSghc3RhdGUtPnJtaWQpOworCX0KKworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGludGVsX2NxbV9ldmVudF9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbW9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBybWlkOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZjYWNoZV9sb2NrLCBmbGFncyk7CisKKwlldmVudC0+aHcuY3FtX3N0YXRlID0gUEVSRl9IRVNfU1RPUFBFRDsKKwlybWlkID0gZXZlbnQtPmh3LmNxbV9ybWlkOworCisJaWYgKF9fcm1pZF92YWxpZChybWlkKSAmJiAobW9kZSAmIFBFUkZfRUZfU1RBUlQpKQorCQlpbnRlbF9jcW1fZXZlbnRfc3RhcnQoZXZlbnQsIG1vZGUpOworCisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhY2hlX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jcW1fZXZlbnRfZGVsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IG1vZGUpCit7CisJaW50ZWxfY3FtX2V2ZW50X3N0b3AoZXZlbnQsIG1vZGUpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jcW1fZXZlbnRfZGVzdHJveShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHBlcmZfZXZlbnQgKmdyb3VwX290aGVyID0gTlVMTDsKKworCW11dGV4X2xvY2soJmNhY2hlX211dGV4KTsKKworCS8qCisJICogSWYgdGhlcmUncyBhbm90aGVyIGV2ZW50IGluIHRoaXMgZ3JvdXAuLi4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmV2ZW50LT5ody5jcW1fZ3JvdXBfZW50cnkpKSB7CisJCWdyb3VwX290aGVyID0gbGlzdF9maXJzdF9lbnRyeSgmZXZlbnQtPmh3LmNxbV9ncm91cF9lbnRyeSwKKwkJCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2ZW50LAorCQkJCQkgICAgICAgaHcuY3FtX2dyb3VwX2VudHJ5KTsKKwkJbGlzdF9kZWwoJmV2ZW50LT5ody5jcW1fZ3JvdXBfZW50cnkpOworCX0KKworCS8qCisJICogQW5kIHdlJ3JlIHRoZSBncm91cCBsZWFkZXIuLgorCSAqLworCWlmIChjcW1fZ3JvdXBfbGVhZGVyKGV2ZW50KSkgeworCQkvKgorCQkgKiBJZiB0aGVyZSB3YXMgYSBncm91cF9vdGhlciwgbWFrZSB0aGF0IGxlYWRlciwgb3RoZXJ3aXNlCisJCSAqIGRlc3Ryb3kgdGhlIGdyb3VwIGFuZCByZXR1cm4gdGhlIFJNSUQuCisJCSAqLworCQlpZiAoZ3JvdXBfb3RoZXIpIHsKKwkJCWxpc3RfcmVwbGFjZSgmZXZlbnQtPmh3LmNxbV9ncm91cHNfZW50cnksCisJCQkJICAgICAmZ3JvdXBfb3RoZXItPmh3LmNxbV9ncm91cHNfZW50cnkpOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgaW50IHJtaWQgPSBldmVudC0+aHcuY3FtX3JtaWQ7CisKKwkJCWlmIChfX3JtaWRfdmFsaWQocm1pZCkpCisJCQkJX19wdXRfcm1pZChybWlkKTsKKwkJCWxpc3RfZGVsKCZldmVudC0+aHcuY3FtX2dyb3Vwc19lbnRyeSk7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJmNhY2hlX211dGV4KTsKK30KKworc3RhdGljIGludCBpbnRlbF9jcW1fZXZlbnRfaW5pdChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHBlcmZfZXZlbnQgKmdyb3VwID0gTlVMTDsKKwlib29sIHJvdGF0ZSA9IGZhbHNlOworCisJaWYgKGV2ZW50LT5hdHRyLnR5cGUgIT0gaW50ZWxfY3FtX3BtdS50eXBlKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmIChldmVudC0+YXR0ci5jb25maWcgJiB+UU9TX0VWRU5UX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJLyogdW5zdXBwb3J0ZWQgbW9kZXMgYW5kIGZpbHRlcnMgKi8KKwlpZiAoZXZlbnQtPmF0dHIuZXhjbHVkZV91c2VyICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9rZXJuZWwgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9odiAgICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9pZGxlICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9ob3N0ICAgfHwKKwkgICAgZXZlbnQtPmF0dHIuZXhjbHVkZV9ndWVzdCAgfHwKKwkgICAgZXZlbnQtPmF0dHIuc2FtcGxlX3BlcmlvZCkgLyogbm8gc2FtcGxpbmcgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlJTklUX0xJU1RfSEVBRCgmZXZlbnQtPmh3LmNxbV9ncm91cF9lbnRyeSk7CisJSU5JVF9MSVNUX0hFQUQoJmV2ZW50LT5ody5jcW1fZ3JvdXBzX2VudHJ5KTsKKworCWV2ZW50LT5kZXN0cm95ID0gaW50ZWxfY3FtX2V2ZW50X2Rlc3Ryb3k7CisKKwltdXRleF9sb2NrKCZjYWNoZV9tdXRleCk7CisKKwkvKiBXaWxsIGFsc28gc2V0IHJtaWQgKi8KKwlpbnRlbF9jcW1fc2V0dXBfZXZlbnQoZXZlbnQsICZncm91cCk7CisKKwlpZiAoZ3JvdXApIHsKKwkJbGlzdF9hZGRfdGFpbCgmZXZlbnQtPmh3LmNxbV9ncm91cF9lbnRyeSwKKwkJCSAgICAgICZncm91cC0+aHcuY3FtX2dyb3VwX2VudHJ5KTsKKwl9IGVsc2UgeworCQlsaXN0X2FkZF90YWlsKCZldmVudC0+aHcuY3FtX2dyb3Vwc19lbnRyeSwKKwkJCSAgICAgICZjYWNoZV9ncm91cHMpOworCisJCS8qCisJCSAqIEFsbCBSTUlEcyBhcmUgZWl0aGVyIGluIHVzZSBvciBoYXZlIHJlY2VudGx5IGJlZW4KKwkJICogdXNlZC4gS2ljayB0aGUgcm90YXRpb24gd29ya2VyIHRvIGNsZWFuL2ZyZWUgc29tZS4KKwkJICoKKwkJICogV2Ugb25seSBkbyB0aGlzIGZvciB0aGUgZ3JvdXAgbGVhZGVyLCByYXRoZXIgdGhhbiBmb3IKKwkJICogZXZlcnkgZXZlbnQgaW4gYSBncm91cCB0byBzYXZlIG9uIG5lZWRsZXNzIHdvcmsuCisJCSAqLworCQlpZiAoIV9fcm1pZF92YWxpZChldmVudC0+aHcuY3FtX3JtaWQpKQorCQkJcm90YXRlID0gdHJ1ZTsKKwl9CisKKwltdXRleF91bmxvY2soJmNhY2hlX211dGV4KTsKKworCWlmIChyb3RhdGUpCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW50ZWxfY3FtX3JtaWRfd29yaywgMCk7CisKKwlyZXR1cm4gMDsKK30KKworRVZFTlRfQVRUUl9TVFIobGxjX29jY3VwYW5jeSwgaW50ZWxfY3FtX2xsYywgImV2ZW50PTB4MDEiKTsKK0VWRU5UX0FUVFJfU1RSKGxsY19vY2N1cGFuY3kucGVyLXBrZywgaW50ZWxfY3FtX2xsY19wa2csICIxIik7CitFVkVOVF9BVFRSX1NUUihsbGNfb2NjdXBhbmN5LnVuaXQsIGludGVsX2NxbV9sbGNfdW5pdCwgIkJ5dGVzIik7CitFVkVOVF9BVFRSX1NUUihsbGNfb2NjdXBhbmN5LnNjYWxlLCBpbnRlbF9jcW1fbGxjX3NjYWxlLCBOVUxMKTsKK0VWRU5UX0FUVFJfU1RSKGxsY19vY2N1cGFuY3kuc25hcHNob3QsIGludGVsX2NxbV9sbGNfc25hcHNob3QsICIxIik7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppbnRlbF9jcW1fZXZlbnRzX2F0dHJbXSA9IHsKKwlFVkVOVF9QVFIoaW50ZWxfY3FtX2xsYyksCisJRVZFTlRfUFRSKGludGVsX2NxbV9sbGNfcGtnKSwKKwlFVkVOVF9QVFIoaW50ZWxfY3FtX2xsY191bml0KSwKKwlFVkVOVF9QVFIoaW50ZWxfY3FtX2xsY19zY2FsZSksCisJRVZFTlRfUFRSKGludGVsX2NxbV9sbGNfc25hcHNob3QpLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpbnRlbF9jcW1fZXZlbnRzX2dyb3VwID0geworCS5uYW1lID0gImV2ZW50cyIsCisJLmF0dHJzID0gaW50ZWxfY3FtX2V2ZW50c19hdHRyLAorfTsKKworUE1VX0ZPUk1BVF9BVFRSKGV2ZW50LCAiY29uZmlnOjAtNyIpOworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmludGVsX2NxbV9mb3JtYXRzX2F0dHJbXSA9IHsKKwkmZm9ybWF0X2F0dHJfZXZlbnQuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaW50ZWxfY3FtX2Zvcm1hdF9ncm91cCA9IHsKKwkubmFtZSA9ICJmb3JtYXQiLAorCS5hdHRycyA9IGludGVsX2NxbV9mb3JtYXRzX2F0dHIsCit9OworCitzdGF0aWMgc3NpemVfdAorbWF4X3JlY3ljbGVfdGhyZXNob2xkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNoYXIgKnBhZ2UpCit7CisJc3NpemVfdCBydjsKKworCW11dGV4X2xvY2soJmNhY2hlX211dGV4KTsKKwlydiA9IHNucHJpbnRmKHBhZ2UsIFBBR0VfU0laRS0xLCAiJXVcbiIsIF9faW50ZWxfY3FtX21heF90aHJlc2hvbGQpOworCW11dGV4X3VubG9jaygmY2FjaGVfbXV0ZXgpOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgc3NpemVfdAorbWF4X3JlY3ljbGVfdGhyZXNob2xkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZXMsIGNhY2hlbGluZXM7CisJaW50IHJldDsKKworCXJldCA9IGtzdHJ0b3VpbnQoYnVmLCAwLCAmYnl0ZXMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZjYWNoZV9tdXRleCk7CisKKwlfX2ludGVsX2NxbV9tYXhfdGhyZXNob2xkID0gYnl0ZXM7CisJY2FjaGVsaW5lcyA9IGJ5dGVzIC8gY3FtX2wzX3NjYWxlOworCisJLyoKKwkgKiBUaGUgbmV3IG1heGltdW0gdGFrZXMgZWZmZWN0IGltbWVkaWF0ZWx5LgorCSAqLworCWlmIChfX2ludGVsX2NxbV90aHJlc2hvbGQgPiBjYWNoZWxpbmVzKQorCQlfX2ludGVsX2NxbV90aHJlc2hvbGQgPSBjYWNoZWxpbmVzOworCisJbXV0ZXhfdW5sb2NrKCZjYWNoZV9tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUl9SVyhtYXhfcmVjeWNsZV90aHJlc2hvbGQpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaW50ZWxfY3FtX2F0dHJzW10gPSB7CisJJmRldl9hdHRyX21heF9yZWN5Y2xlX3RocmVzaG9sZC5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpbnRlbF9jcW1fZ3JvdXAgPSB7CisJLmF0dHJzID0gaW50ZWxfY3FtX2F0dHJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmludGVsX2NxbV9hdHRyX2dyb3Vwc1tdID0geworCSZpbnRlbF9jcW1fZXZlbnRzX2dyb3VwLAorCSZpbnRlbF9jcW1fZm9ybWF0X2dyb3VwLAorCSZpbnRlbF9jcW1fZ3JvdXAsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcG11IGludGVsX2NxbV9wbXUgPSB7CisJLmhydGltZXJfaW50ZXJ2YWxfbXMgPSBSTUlEX0RFRkFVTFRfUVVFVUVfVElNRSwKKwkuYXR0cl9ncm91cHMJICAgICA9IGludGVsX2NxbV9hdHRyX2dyb3VwcywKKwkudGFza19jdHhfbnIJICAgICA9IHBlcmZfc3dfY29udGV4dCwKKwkuZXZlbnRfaW5pdAkgICAgID0gaW50ZWxfY3FtX2V2ZW50X2luaXQsCisJLmFkZAkJICAgICA9IGludGVsX2NxbV9ldmVudF9hZGQsCisJLmRlbAkJICAgICA9IGludGVsX2NxbV9ldmVudF9kZWwsCisJLnN0YXJ0CQkgICAgID0gaW50ZWxfY3FtX2V2ZW50X3N0YXJ0LAorCS5zdG9wCQkgICAgID0gaW50ZWxfY3FtX2V2ZW50X3N0b3AsCisJLnJlYWQJCSAgICAgPSBpbnRlbF9jcW1fZXZlbnRfcmVhZCwKKwkuY291bnQJCSAgICAgPSBpbnRlbF9jcW1fZXZlbnRfY291bnQsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgY3FtX3BpY2tfZXZlbnRfcmVhZGVyKGludCBjcHUpCit7CisJaW50IHBoeXNfaWQgPSB0b3BvbG9neV9waHlzaWNhbF9wYWNrYWdlX2lkKGNwdSk7CisJaW50IGk7CisKKwlmb3JfZWFjaF9jcHUoaSwgJmNxbV9jcHVtYXNrKSB7CisJCWlmIChwaHlzX2lkID09IHRvcG9sb2d5X3BoeXNpY2FsX3BhY2thZ2VfaWQoaSkpCisJCQlyZXR1cm47CS8qIGFscmVhZHkgZ290IHJlYWRlciBmb3IgdGhpcyBzb2NrZXQgKi8KKwl9CisKKwljcHVtYXNrX3NldF9jcHUoY3B1LCAmY3FtX2NwdW1hc2spOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jcW1fY3B1X3ByZXBhcmUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgaW50ZWxfY3FtX3N0YXRlICpzdGF0ZSA9ICZwZXJfY3B1KGNxbV9zdGF0ZSwgY3B1KTsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKKworCXJhd19zcGluX2xvY2tfaW5pdCgmc3RhdGUtPmxvY2spOworCXN0YXRlLT5ybWlkID0gMDsKKwlzdGF0ZS0+Y250ICA9IDA7CisKKwlXQVJOX09OKGMtPng4Nl9jYWNoZV9tYXhfcm1pZCAhPSBjcW1fbWF4X3JtaWQpOworCVdBUk5fT04oYy0+eDg2X2NhY2hlX29jY19zY2FsZSAhPSBjcW1fbDNfc2NhbGUpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9jcW1fY3B1X2V4aXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpbnQgcGh5c19pZCA9IHRvcG9sb2d5X3BoeXNpY2FsX3BhY2thZ2VfaWQoY3B1KTsKKwlpbnQgaTsKKworCS8qCisJICogSXMgQGNwdSBhIGRlc2lnbmF0ZWQgY3FtIHJlYWRlcj8KKwkgKi8KKwlpZiAoIWNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgJmNxbV9jcHVtYXNrKSkKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfb25saW5lX2NwdShpKSB7CisJCWlmIChpID09IGNwdSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwaHlzX2lkID09IHRvcG9sb2d5X3BoeXNpY2FsX3BhY2thZ2VfaWQoaSkpIHsKKwkJCWNwdW1hc2tfc2V0X2NwdShpLCAmY3FtX2NwdW1hc2spOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfY3FtX2NwdV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdSAgPSAodW5zaWduZWQgbG9uZyloY3B1OworCisJc3dpdGNoIChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgeworCWNhc2UgQ1BVX1VQX1BSRVBBUkU6CisJCWludGVsX2NxbV9jcHVfcHJlcGFyZShjcHUpOworCQlicmVhazsKKwljYXNlIENQVV9ET1dOX1BSRVBBUkU6CisJCWludGVsX2NxbV9jcHVfZXhpdChjcHUpOworCQlicmVhazsKKwljYXNlIENQVV9TVEFSVElORzoKKwkJY3FtX3BpY2tfZXZlbnRfcmVhZGVyKGNwdSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCBpbnRlbF9jcW1fbWF0Y2hbXSA9IHsKKwl7IC52ZW5kb3IgPSBYODZfVkVORE9SX0lOVEVMLCAuZmVhdHVyZSA9IFg4Nl9GRUFUVVJFX0NRTV9PQ0NVUF9MTEMgfSwKKwl7fQorfTsKKworc3RhdGljIGludCBfX2luaXQgaW50ZWxfY3FtX2luaXQodm9pZCkKK3sKKwljaGFyICpzdHIsIHNjYWxlWzIwXTsKKwlpbnQgaSwgY3B1LCByZXQ7CisKKwlpZiAoIXg4Nl9tYXRjaF9jcHUoaW50ZWxfY3FtX21hdGNoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljcW1fbDNfc2NhbGUgPSBib290X2NwdV9kYXRhLng4Nl9jYWNoZV9vY2Nfc2NhbGU7CisKKwkvKgorCSAqIEl0J3MgcG9zc2libGUgdGhhdCBub3QgYWxsIHJlc291cmNlcyBzdXBwb3J0IHRoZSBzYW1lIG51bWJlcgorCSAqIG9mIFJNSURzLiBJbnN0ZWFkIG9mIG1ha2luZyBzY2hlZHVsaW5nIG11Y2ggbW9yZSBjb21wbGljYXRlZAorCSAqICh3aGVyZSB3ZSBoYXZlIHRvIG1hdGNoIGEgdGFzaydzIFJNSUQgdG8gYSBjcHUgdGhhdCBzdXBwb3J0cworCSAqIHRoYXQgbWFueSBSTUlEcykganVzdCBmaW5kIHRoZSBtaW5pbXVtIFJNSURzIHN1cHBvcnRlZCBhY3Jvc3MKKwkgKiBhbGwgY3B1cy4KKwkgKgorCSAqIEFsc28sIGNoZWNrIHRoYXQgdGhlIHNjYWxlcyBtYXRjaCBvbiBhbGwgY3B1cy4KKwkgKi8KKwljcHVfbm90aWZpZXJfcmVnaXN0ZXJfYmVnaW4oKTsKKworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHUpOworCisJCWlmIChjLT54ODZfY2FjaGVfbWF4X3JtaWQgPCBjcW1fbWF4X3JtaWQpCisJCQljcW1fbWF4X3JtaWQgPSBjLT54ODZfY2FjaGVfbWF4X3JtaWQ7CisKKwkJaWYgKGMtPng4Nl9jYWNoZV9vY2Nfc2NhbGUgIT0gY3FtX2wzX3NjYWxlKSB7CisJCQlwcl9lcnIoIk11bHRpcGxlIExMQyBzY2FsZSB2YWx1ZXMsIGRpc2FibGluZ1xuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKgorCSAqIEEgcmVhc29uYWJsZSB1cHBlciBsaW1pdCBvbiB0aGUgbWF4IHRocmVzaG9sZCBpcyB0aGUgbnVtYmVyCisJICogb2YgbGluZXMgdGFnZ2VkIHBlciBSTUlEIGlmIGFsbCBSTUlEcyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZgorCSAqIGxpbmVzIHRhZ2dlZCBpbiB0aGUgTExDLgorCSAqCisJICogRm9yIGEgMzVNQiBMTEMgYW5kIDU2IFJNSURzLCB0aGlzIGlzIH4xLjglIG9mIHRoZSBMTEMuCisJICovCisJX19pbnRlbF9jcW1fbWF4X3RocmVzaG9sZCA9CisJCWJvb3RfY3B1X2RhdGEueDg2X2NhY2hlX3NpemUgKiAxMDI0IC8gKGNxbV9tYXhfcm1pZCArIDEpOworCisJc25wcmludGYoc2NhbGUsIHNpemVvZihzY2FsZSksICIldSIsIGNxbV9sM19zY2FsZSk7CisJc3RyID0ga3N0cmR1cChzY2FsZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdHIpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZXZlbnRfYXR0cl9pbnRlbF9jcW1fbGxjX3NjYWxlLmV2ZW50X3N0ciA9IHN0cjsKKworCXJldCA9IGludGVsX2NxbV9zZXR1cF9ybWlkX2NhY2hlKCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKKwkJaW50ZWxfY3FtX2NwdV9wcmVwYXJlKGkpOworCQljcW1fcGlja19ldmVudF9yZWFkZXIoaSk7CisJfQorCisJX19wZXJmX2NwdV9ub3RpZmllcihpbnRlbF9jcW1fY3B1X25vdGlmaWVyKTsKKworCXJldCA9IHBlcmZfcG11X3JlZ2lzdGVyKCZpbnRlbF9jcW1fcG11LCAiaW50ZWxfY3FtIiwgLTEpOworCWlmIChyZXQpCisJCXByX2VycigiSW50ZWwgQ1FNIHBlcmYgcmVnaXN0cmF0aW9uIGZhaWxlZDogJWRcbiIsIHJldCk7CisJZWxzZQorCQlwcl9pbmZvKCJJbnRlbCBDUU0gbW9uaXRvcmluZyBlbmFibGVkXG4iKTsKKworb3V0OgorCWNwdV9ub3RpZmllcl9yZWdpc3Rlcl9kb25lKCk7CisKKwlyZXR1cm4gcmV0OworfQorZGV2aWNlX2luaXRjYWxsKGludGVsX2NxbV9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF9kcy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2RzLmMKaW5kZXggMDczOTgzMy4uY2E2OWVhNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2RzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2RzLmMKQEAgLTQ2MSw3ICs0NjEsOCBAQAogCiAJZGVidWdjdGxtc3IgfD0gREVCVUdDVExNU1JfVFI7CiAJZGVidWdjdGxtc3IgfD0gREVCVUdDVExNU1JfQlRTOwotCWRlYnVnY3RsbXNyIHw9IERFQlVHQ1RMTVNSX0JUSU5UOworCWlmIChjb25maWcgJiBBUkNIX1BFUkZNT05fRVZFTlRTRUxfSU5UKQorCQlkZWJ1Z2N0bG1zciB8PSBERUJVR0NUTE1TUl9CVElOVDsKIAogCWlmICghKGNvbmZpZyAmIEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9PUykpCiAJCWRlYnVnY3RsbXNyIHw9IERFQlVHQ1RMTVNSX0JUU19PRkZfT1M7CkBAIC02MTEsNiArNjEyLDEwIEBACiAJSU5URUxfUFNUX0NPTlNUUkFJTlQoMHgwMmNkLCAweDgpLCAgICAvKiBNRU1fVFJBTlNfUkVUSVJFRC5QUkVDSVNFX1NUT1JFUyAqLwogCS8qIFVPUFNfUkVUSVJFRC5BTEwsIGludj0xLCBjbWFzaz0xNiAoY3ljbGVzOnApLiAqLwogCUlOVEVMX0ZMQUdTX0VWRU5UX0NPTlNUUkFJTlQoMHgxMDgwMDFjMiwgMHhmKSwKKyAgICAgICAgSU5URUxfRVhDTEVWVF9DT05TVFJBSU5UKDB4ZDAsIDB4ZiksICAgIC8qIE1FTV9VT1BfUkVUSVJFRC4qICovCisgICAgICAgIElOVEVMX0VYQ0xFVlRfQ09OU1RSQUlOVCgweGQxLCAweGYpLCAgICAvKiBNRU1fTE9BRF9VT1BTX1JFVElSRUQuKiAqLworICAgICAgICBJTlRFTF9FWENMRVZUX0NPTlNUUkFJTlQoMHhkMiwgMHhmKSwgICAgLyogTUVNX0xPQURfVU9QU19MTENfSElUX1JFVElSRUQuKiAqLworICAgICAgICBJTlRFTF9FWENMRVZUX0NPTlNUUkFJTlQoMHhkMywgMHhmKSwgICAgLyogTUVNX0xPQURfVU9QU19MTENfTUlTU19SRVRJUkVELiogKi8KIAkvKiBBbGxvdyBhbGwgZXZlbnRzIGFzIFBFQlMgd2l0aCBubyBmbGFncyAqLwogCUlOVEVMX0FMTF9FVkVOVF9DT05TVFJBSU5UKDAsIDB4ZiksCiAJRVZFTlRfQ09OU1RSQUlOVF9FTkQKQEAgLTYyMiw2ICs2MjcsMTAgQEAKIAlJTlRFTF9QU1RfQ09OU1RSQUlOVCgweDAyY2QsIDB4OCksICAgIC8qIE1FTV9UUkFOU19SRVRJUkVELlBSRUNJU0VfU1RPUkVTICovCiAJLyogVU9QU19SRVRJUkVELkFMTCwgaW52PTEsIGNtYXNrPTE2IChjeWNsZXM6cCkuICovCiAJSU5URUxfRkxBR1NfRVZFTlRfQ09OU1RSQUlOVCgweDEwODAwMWMyLCAweGYpLAorCUlOVEVMX0VYQ0xFVlRfQ09OU1RSQUlOVCgweGQwLCAweGYpLCAgICAvKiBNRU1fVU9QX1JFVElSRUQuKiAqLworCUlOVEVMX0VYQ0xFVlRfQ09OU1RSQUlOVCgweGQxLCAweGYpLCAgICAvKiBNRU1fTE9BRF9VT1BTX1JFVElSRUQuKiAqLworCUlOVEVMX0VYQ0xFVlRfQ09OU1RSQUlOVCgweGQyLCAweGYpLCAgICAvKiBNRU1fTE9BRF9VT1BTX0xMQ19ISVRfUkVUSVJFRC4qICovCisJSU5URUxfRVhDTEVWVF9DT05TVFJBSU5UKDB4ZDMsIDB4ZiksICAgIC8qIE1FTV9MT0FEX1VPUFNfTExDX01JU1NfUkVUSVJFRC4qICovCiAJLyogQWxsb3cgYWxsIGV2ZW50cyBhcyBQRUJTIHdpdGggbm8gZmxhZ3MgKi8KIAlJTlRFTF9BTExfRVZFTlRfQ09OU1RSQUlOVCgwLCAweGYpLAogICAgICAgICBFVkVOVF9DT05TVFJBSU5UX0VORApAQCAtNjMzLDE2ICs2NDIsMTYgQEAKIAkvKiBVT1BTX1JFVElSRUQuQUxMLCBpbnY9MSwgY21hc2s9MTYgKGN5Y2xlczpwKS4gKi8KIAlJTlRFTF9GTEFHU19FVkVOVF9DT05TVFJBSU5UKDB4MTA4MDAxYzIsIDB4ZiksCiAJSU5URUxfRkxBR1NfVUVWRU5UX0NPTlNUUkFJTlRfREFUQUxBX05BKDB4MDFjMiwgMHhmKSwgLyogVU9QU19SRVRJUkVELkFMTCAqLwotCUlOVEVMX0ZMQUdTX1VFVkVOVF9DT05TVFJBSU5UX0RBVEFMQV9MRCgweDExZDAsIDB4ZiksIC8qIE1FTV9VT1BTX1JFVElSRUQuU1RMQl9NSVNTX0xPQURTICovCi0JSU5URUxfRkxBR1NfVUVWRU5UX0NPTlNUUkFJTlRfREFUQUxBX0xEKDB4MjFkMCwgMHhmKSwgLyogTUVNX1VPUFNfUkVUSVJFRC5MT0NLX0xPQURTICovCi0JSU5URUxfRkxBR1NfVUVWRU5UX0NPTlNUUkFJTlRfREFUQUxBX0xEKDB4NDFkMCwgMHhmKSwgLyogTUVNX1VPUFNfUkVUSVJFRC5TUExJVF9MT0FEUyAqLwotCUlOVEVMX0ZMQUdTX1VFVkVOVF9DT05TVFJBSU5UX0RBVEFMQV9MRCgweDgxZDAsIDB4ZiksIC8qIE1FTV9VT1BTX1JFVElSRUQuQUxMX0xPQURTICovCi0JSU5URUxfRkxBR1NfVUVWRU5UX0NPTlNUUkFJTlRfREFUQUxBX1NUKDB4MTJkMCwgMHhmKSwgLyogTUVNX1VPUFNfUkVUSVJFRC5TVExCX01JU1NfU1RPUkVTICovCi0JSU5URUxfRkxBR1NfVUVWRU5UX0NPTlNUUkFJTlRfREFUQUxBX1NUKDB4NDJkMCwgMHhmKSwgLyogTUVNX1VPUFNfUkVUSVJFRC5TUExJVF9TVE9SRVMgKi8KLQlJTlRFTF9GTEFHU19VRVZFTlRfQ09OU1RSQUlOVF9EQVRBTEFfU1QoMHg4MmQwLCAweGYpLCAvKiBNRU1fVU9QU19SRVRJUkVELkFMTF9TVE9SRVMgKi8KLQlJTlRFTF9GTEFHU19FVkVOVF9DT05TVFJBSU5UX0RBVEFMQV9MRCgweGQxLCAweGYpLCAgICAvKiBNRU1fTE9BRF9VT1BTX1JFVElSRUQuKiAqLwotCUlOVEVMX0ZMQUdTX0VWRU5UX0NPTlNUUkFJTlRfREFUQUxBX0xEKDB4ZDIsIDB4ZiksICAgIC8qIE1FTV9MT0FEX1VPUFNfTDNfSElUX1JFVElSRUQuKiAqLwotCUlOVEVMX0ZMQUdTX0VWRU5UX0NPTlNUUkFJTlRfREFUQUxBX0xEKDB4ZDMsIDB4ZiksICAgIC8qIE1FTV9MT0FEX1VPUFNfTDNfTUlTU19SRVRJUkVELiogKi8KKwlJTlRFTF9GTEFHU19VRVZFTlRfQ09OU1RSQUlOVF9EQVRBTEFfWExEKDB4MTFkMCwgMHhmKSwgLyogTUVNX1VPUFNfUkVUSVJFRC5TVExCX01JU1NfTE9BRFMgKi8KKwlJTlRFTF9GTEFHU19VRVZFTlRfQ09OU1RSQUlOVF9EQVRBTEFfWExEKDB4MjFkMCwgMHhmKSwgLyogTUVNX1VPUFNfUkVUSVJFRC5MT0NLX0xPQURTICovCisJSU5URUxfRkxBR1NfVUVWRU5UX0NPTlNUUkFJTlRfREFUQUxBX1hMRCgweDQxZDAsIDB4ZiksIC8qIE1FTV9VT1BTX1JFVElSRUQuU1BMSVRfTE9BRFMgKi8KKwlJTlRFTF9GTEFHU19VRVZFTlRfQ09OU1RSQUlOVF9EQVRBTEFfWExEKDB4ODFkMCwgMHhmKSwgLyogTUVNX1VPUFNfUkVUSVJFRC5BTExfTE9BRFMgKi8KKwlJTlRFTF9GTEFHU19VRVZFTlRfQ09OU1RSQUlOVF9EQVRBTEFfWFNUKDB4MTJkMCwgMHhmKSwgLyogTUVNX1VPUFNfUkVUSVJFRC5TVExCX01JU1NfU1RPUkVTICovCisJSU5URUxfRkxBR1NfVUVWRU5UX0NPTlNUUkFJTlRfREFUQUxBX1hTVCgweDQyZDAsIDB4ZiksIC8qIE1FTV9VT1BTX1JFVElSRUQuU1BMSVRfU1RPUkVTICovCisJSU5URUxfRkxBR1NfVUVWRU5UX0NPTlNUUkFJTlRfREFUQUxBX1hTVCgweDgyZDAsIDB4ZiksIC8qIE1FTV9VT1BTX1JFVElSRUQuQUxMX1NUT1JFUyAqLworCUlOVEVMX0ZMQUdTX0VWRU5UX0NPTlNUUkFJTlRfREFUQUxBX1hMRCgweGQxLCAweGYpLCAgICAvKiBNRU1fTE9BRF9VT1BTX1JFVElSRUQuKiAqLworCUlOVEVMX0ZMQUdTX0VWRU5UX0NPTlNUUkFJTlRfREFUQUxBX1hMRCgweGQyLCAweGYpLCAgICAvKiBNRU1fTE9BRF9VT1BTX0wzX0hJVF9SRVRJUkVELiogKi8KKwlJTlRFTF9GTEFHU19FVkVOVF9DT05TVFJBSU5UX0RBVEFMQV9YTEQoMHhkMywgMHhmKSwgICAgLyogTUVNX0xPQURfVU9QU19MM19NSVNTX1JFVElSRUQuKiAqLwogCS8qIEFsbG93IGFsbCBldmVudHMgYXMgUEVCUyB3aXRoIG5vIGZsYWdzICovCiAJSU5URUxfQUxMX0VWRU5UX0NPTlNUUkFJTlQoMCwgMHhmKSwKIAlFVkVOVF9DT05TVFJBSU5UX0VORApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2xici5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2xici5jCmluZGV4IDU4ZjFhOTQuLjk0ZTViNTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF9sYnIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfbGJyLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNkZWZpbmUgTEJSX0lORF9KTVBfQklUCQk2IC8qIGRvIG5vdCBjYXB0dXJlIGluZGlyZWN0IGp1bXBzICovCiAjZGVmaW5lIExCUl9SRUxfSk1QX0JJVAkJNyAvKiBkbyBub3QgY2FwdHVyZSByZWxhdGl2ZSBqdW1wcyAqLwogI2RlZmluZSBMQlJfRkFSX0JJVAkJOCAvKiBkbyBub3QgY2FwdHVyZSBmYXIgYnJhbmNoZXMgKi8KKyNkZWZpbmUgTEJSX0NBTExfU1RBQ0tfQklUCTkgLyogZW5hYmxlIGNhbGwgc3RhY2sgKi8KIAogI2RlZmluZSBMQlJfS0VSTkVMCSgxIDw8IExCUl9LRVJORUxfQklUKQogI2RlZmluZSBMQlJfVVNFUgkoMSA8PCBMQlJfVVNFUl9CSVQpCkBAIC00OSw2ICs1MCw3IEBACiAjZGVmaW5lIExCUl9SRUxfSk1QCSgxIDw8IExCUl9SRUxfSk1QX0JJVCkKICNkZWZpbmUgTEJSX0lORF9KTVAJKDEgPDwgTEJSX0lORF9KTVBfQklUKQogI2RlZmluZSBMQlJfRkFSCQkoMSA8PCBMQlJfRkFSX0JJVCkKKyNkZWZpbmUgTEJSX0NBTExfU1RBQ0sJKDEgPDwgTEJSX0NBTExfU1RBQ0tfQklUKQogCiAjZGVmaW5lIExCUl9QTE0gKExCUl9LRVJORUwgfCBMQlJfVVNFUikKIApAQCAtNjksMzMgKzcxLDMxIEBACiAjZGVmaW5lIExCUl9GUk9NX0ZMQUdfSU5fVFggICAgKDFVTEwgPDwgNjIpCiAjZGVmaW5lIExCUl9GUk9NX0ZMQUdfQUJPUlQgICAgKDFVTEwgPDwgNjEpCiAKLSNkZWZpbmUgZm9yX2VhY2hfYnJhbmNoX3NhbXBsZV90eXBlKHgpIFwKLQlmb3IgKCh4KSA9IFBFUkZfU0FNUExFX0JSQU5DSF9VU0VSOyBcCi0JICAgICAoeCkgPCBQRVJGX1NBTVBMRV9CUkFOQ0hfTUFYOyAoeCkgPDw9IDEpCi0KIC8qCiAgKiB4ODZjb250cm9sIGZsb3cgY2hhbmdlIGNsYXNzaWZpY2F0aW9uCiAgKiB4ODZjb250cm9sIGZsb3cgY2hhbmdlcyBpbmNsdWRlIGJyYW5jaGVzLCBpbnRlcnJ1cHRzLCB0cmFwcywgZmF1bHRzCiAgKi8KIGVudW0gewotCVg4Nl9CUl9OT05FICAgICA9IDAsICAgICAgLyogdW5rbm93biAqLworCVg4Nl9CUl9OT05FCQk9IDAsICAgICAgLyogdW5rbm93biAqLwogCi0JWDg2X0JSX1VTRVIgICAgID0gMSA8PCAwLCAvKiBicmFuY2ggdGFyZ2V0IGlzIHVzZXIgKi8KLQlYODZfQlJfS0VSTkVMICAgPSAxIDw8IDEsIC8qIGJyYW5jaCB0YXJnZXQgaXMga2VybmVsICovCisJWDg2X0JSX1VTRVIJCT0gMSA8PCAwLCAvKiBicmFuY2ggdGFyZ2V0IGlzIHVzZXIgKi8KKwlYODZfQlJfS0VSTkVMCQk9IDEgPDwgMSwgLyogYnJhbmNoIHRhcmdldCBpcyBrZXJuZWwgKi8KIAotCVg4Nl9CUl9DQUxMICAgICA9IDEgPDwgMiwgLyogY2FsbCAqLwotCVg4Nl9CUl9SRVQgICAgICA9IDEgPDwgMywgLyogcmV0dXJuICovCi0JWDg2X0JSX1NZU0NBTEwgID0gMSA8PCA0LCAvKiBzeXNjYWxsICovCi0JWDg2X0JSX1NZU1JFVCAgID0gMSA8PCA1LCAvKiBzeXNjYWxsIHJldHVybiAqLwotCVg4Nl9CUl9JTlQgICAgICA9IDEgPDwgNiwgLyogc3cgaW50ZXJydXB0ICovCi0JWDg2X0JSX0lSRVQgICAgID0gMSA8PCA3LCAvKiByZXR1cm4gZnJvbSBpbnRlcnJ1cHQgKi8KLQlYODZfQlJfSkNDICAgICAgPSAxIDw8IDgsIC8qIGNvbmRpdGlvbmFsICovCi0JWDg2X0JSX0pNUCAgICAgID0gMSA8PCA5LCAvKiBqdW1wICovCi0JWDg2X0JSX0lSUSAgICAgID0gMSA8PCAxMCwvKiBodyBpbnRlcnJ1cHQgb3IgdHJhcCBvciBmYXVsdCAqLwotCVg4Nl9CUl9JTkRfQ0FMTCA9IDEgPDwgMTEsLyogaW5kaXJlY3QgY2FsbHMgKi8KLQlYODZfQlJfQUJPUlQgICAgPSAxIDw8IDEyLC8qIHRyYW5zYWN0aW9uIGFib3J0ICovCi0JWDg2X0JSX0lOX1RYICAgID0gMSA8PCAxMywvKiBpbiB0cmFuc2FjdGlvbiAqLwotCVg4Nl9CUl9OT19UWCAgICA9IDEgPDwgMTQsLyogbm90IGluIHRyYW5zYWN0aW9uICovCisJWDg2X0JSX0NBTEwJCT0gMSA8PCAyLCAvKiBjYWxsICovCisJWDg2X0JSX1JFVAkJPSAxIDw8IDMsIC8qIHJldHVybiAqLworCVg4Nl9CUl9TWVNDQUxMCQk9IDEgPDwgNCwgLyogc3lzY2FsbCAqLworCVg4Nl9CUl9TWVNSRVQJCT0gMSA8PCA1LCAvKiBzeXNjYWxsIHJldHVybiAqLworCVg4Nl9CUl9JTlQJCT0gMSA8PCA2LCAvKiBzdyBpbnRlcnJ1cHQgKi8KKwlYODZfQlJfSVJFVAkJPSAxIDw8IDcsIC8qIHJldHVybiBmcm9tIGludGVycnVwdCAqLworCVg4Nl9CUl9KQ0MJCT0gMSA8PCA4LCAvKiBjb25kaXRpb25hbCAqLworCVg4Nl9CUl9KTVAJCT0gMSA8PCA5LCAvKiBqdW1wICovCisJWDg2X0JSX0lSUQkJPSAxIDw8IDEwLC8qIGh3IGludGVycnVwdCBvciB0cmFwIG9yIGZhdWx0ICovCisJWDg2X0JSX0lORF9DQUxMCQk9IDEgPDwgMTEsLyogaW5kaXJlY3QgY2FsbHMgKi8KKwlYODZfQlJfQUJPUlQJCT0gMSA8PCAxMiwvKiB0cmFuc2FjdGlvbiBhYm9ydCAqLworCVg4Nl9CUl9JTl9UWAkJPSAxIDw8IDEzLC8qIGluIHRyYW5zYWN0aW9uICovCisJWDg2X0JSX05PX1RYCQk9IDEgPDwgMTQsLyogbm90IGluIHRyYW5zYWN0aW9uICovCisJWDg2X0JSX1pFUk9fQ0FMTAk9IDEgPDwgMTUsLyogemVybyBsZW5ndGggY2FsbCAqLworCVg4Nl9CUl9DQUxMX1NUQUNLCT0gMSA8PCAxNiwvKiBjYWxsIHN0YWNrICovCiB9OwogCiAjZGVmaW5lIFg4Nl9CUl9QTE0gKFg4Nl9CUl9VU0VSIHwgWDg2X0JSX0tFUk5FTCkKQEAgLTExMiwxMyArMTEyLDE1IEBACiAJIFg4Nl9CUl9KTVAJIHxcCiAJIFg4Nl9CUl9JUlEJIHxcCiAJIFg4Nl9CUl9BQk9SVAkgfFwKLQkgWDg2X0JSX0lORF9DQUxMKQorCSBYODZfQlJfSU5EX0NBTEwgfFwKKwkgWDg2X0JSX1pFUk9fQ0FMTCkKIAogI2RlZmluZSBYODZfQlJfQUxMIChYODZfQlJfUExNIHwgWDg2X0JSX0FOWSkKIAogI2RlZmluZSBYODZfQlJfQU5ZX0NBTEwJCSBcCiAJKFg4Nl9CUl9DQUxMCQl8XAogCSBYODZfQlJfSU5EX0NBTEwJfFwKKwkgWDg2X0JSX1pFUk9fQ0FMTAl8XAogCSBYODZfQlJfU1lTQ0FMTAkJfFwKIAkgWDg2X0JSX0lSUQkJfFwKIAkgWDg2X0JSX0lOVCkKQEAgLTEzMCwxNyArMTMyLDMyIEBACiAgKiBvdGhlcndpc2UgaXQgYmVjb21lcyBuZWFyIGltcG9zc2libGUgdG8gZ2V0IGEgcmVsaWFibGUgc3RhY2suCiAgKi8KIAotc3RhdGljIHZvaWQgX19pbnRlbF9wbXVfbGJyX2VuYWJsZSh2b2lkKQorc3RhdGljIHZvaWQgX19pbnRlbF9wbXVfbGJyX2VuYWJsZShib29sIHBtaSkKIHsKLQl1NjQgZGVidWdjdGw7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOworCXU2NCBkZWJ1Z2N0bCwgbGJyX3NlbGVjdCA9IDAsIG9yaWdfZGVidWdjdGw7CiAKLQlpZiAoY3B1Yy0+bGJyX3NlbCkKLQkJd3Jtc3JsKE1TUl9MQlJfU0VMRUNULCBjcHVjLT5sYnJfc2VsLT5jb25maWcpOworCS8qCisJICogTm8gbmVlZCB0byByZXByb2dyYW0gTEJSX1NFTEVDVCBpbiBhIFBNSSwgYXMgaXQKKwkgKiBkaWQgbm90IGNoYW5nZS4KKwkgKi8KKwlpZiAoY3B1Yy0+bGJyX3NlbCAmJiAhcG1pKSB7CisJCWxicl9zZWxlY3QgPSBjcHVjLT5sYnJfc2VsLT5jb25maWc7CisJCXdybXNybChNU1JfTEJSX1NFTEVDVCwgbGJyX3NlbGVjdCk7CisJfQogCiAJcmRtc3JsKE1TUl9JQTMyX0RFQlVHQ1RMTVNSLCBkZWJ1Z2N0bCk7Ci0JZGVidWdjdGwgfD0gKERFQlVHQ1RMTVNSX0xCUiB8IERFQlVHQ1RMTVNSX0ZSRUVaRV9MQlJTX09OX1BNSSk7Ci0Jd3Jtc3JsKE1TUl9JQTMyX0RFQlVHQ1RMTVNSLCBkZWJ1Z2N0bCk7CisJb3JpZ19kZWJ1Z2N0bCA9IGRlYnVnY3RsOworCWRlYnVnY3RsIHw9IERFQlVHQ1RMTVNSX0xCUjsKKwkvKgorCSAqIExCUiBjYWxsc3RhY2sgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggRlJFRVpFX0xCUlNfT05fUE1JLgorCSAqIElmIEZSRUVaRV9MQlJTX09OX1BNSSBpcyBzZXQsIFBNSSBuZWFyIGNhbGwvcmV0dXJuIGluc3RydWN0aW9ucworCSAqIG1heSBjYXVzZSBzdXBlcmZsdW91cyBpbmNyZWFzZS9kZWNyZWFzZSBvZiBMQlJfVE9TLgorCSAqLworCWlmICghKGxicl9zZWxlY3QgJiBMQlJfQ0FMTF9TVEFDSykpCisJCWRlYnVnY3RsIHw9IERFQlVHQ1RMTVNSX0ZSRUVaRV9MQlJTX09OX1BNSTsKKwlpZiAob3JpZ19kZWJ1Z2N0bCAhPSBkZWJ1Z2N0bCkKKwkJd3Jtc3JsKE1TUl9JQTMyX0RFQlVHQ1RMTVNSLCBkZWJ1Z2N0bCk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW50ZWxfcG11X2xicl9kaXNhYmxlKHZvaWQpCkBAIC0xODEsOSArMTk4LDExNiBAQAogCQlpbnRlbF9wbXVfbGJyX3Jlc2V0XzY0KCk7CiB9CiAKKy8qCisgKiBUT1MgPSBtb3N0IHJlY2VudGx5IHJlY29yZGVkIGJyYW5jaAorICovCitzdGF0aWMgaW5saW5lIHU2NCBpbnRlbF9wbXVfbGJyX3Rvcyh2b2lkKQoreworCXU2NCB0b3M7CisKKwlyZG1zcmwoeDg2X3BtdS5sYnJfdG9zLCB0b3MpOworCXJldHVybiB0b3M7Cit9CisKK2VudW0geworCUxCUl9OT05FLAorCUxCUl9WQUxJRCwKK307CisKK3N0YXRpYyB2b2lkIF9faW50ZWxfcG11X2xicl9yZXN0b3JlKHN0cnVjdCB4ODZfcGVyZl90YXNrX2NvbnRleHQgKnRhc2tfY3R4KQoreworCWludCBpOworCXVuc2lnbmVkIGxicl9pZHgsIG1hc2s7CisJdTY0IHRvczsKKworCWlmICh0YXNrX2N0eC0+bGJyX2NhbGxzdGFja191c2VycyA9PSAwIHx8CisJICAgIHRhc2tfY3R4LT5sYnJfc3RhY2tfc3RhdGUgPT0gTEJSX05PTkUpIHsKKwkJaW50ZWxfcG11X2xicl9yZXNldCgpOworCQlyZXR1cm47CisJfQorCisJbWFzayA9IHg4Nl9wbXUubGJyX25yIC0gMTsKKwl0b3MgPSBpbnRlbF9wbXVfbGJyX3RvcygpOworCWZvciAoaSA9IDA7IGkgPCB4ODZfcG11Lmxicl9ucjsgaSsrKSB7CisJCWxicl9pZHggPSAodG9zIC0gaSkgJiBtYXNrOworCQl3cm1zcmwoeDg2X3BtdS5sYnJfZnJvbSArIGxicl9pZHgsIHRhc2tfY3R4LT5sYnJfZnJvbVtpXSk7CisJCXdybXNybCh4ODZfcG11Lmxicl90byArIGxicl9pZHgsIHRhc2tfY3R4LT5sYnJfdG9baV0pOworCX0KKwl0YXNrX2N0eC0+bGJyX3N0YWNrX3N0YXRlID0gTEJSX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkIF9faW50ZWxfcG11X2xicl9zYXZlKHN0cnVjdCB4ODZfcGVyZl90YXNrX2NvbnRleHQgKnRhc2tfY3R4KQoreworCWludCBpOworCXVuc2lnbmVkIGxicl9pZHgsIG1hc2s7CisJdTY0IHRvczsKKworCWlmICh0YXNrX2N0eC0+bGJyX2NhbGxzdGFja191c2VycyA9PSAwKSB7CisJCXRhc2tfY3R4LT5sYnJfc3RhY2tfc3RhdGUgPSBMQlJfTk9ORTsKKwkJcmV0dXJuOworCX0KKworCW1hc2sgPSB4ODZfcG11Lmxicl9uciAtIDE7CisJdG9zID0gaW50ZWxfcG11X2xicl90b3MoKTsKKwlmb3IgKGkgPSAwOyBpIDwgeDg2X3BtdS5sYnJfbnI7IGkrKykgeworCQlsYnJfaWR4ID0gKHRvcyAtIGkpICYgbWFzazsKKwkJcmRtc3JsKHg4Nl9wbXUubGJyX2Zyb20gKyBsYnJfaWR4LCB0YXNrX2N0eC0+bGJyX2Zyb21baV0pOworCQlyZG1zcmwoeDg2X3BtdS5sYnJfdG8gKyBsYnJfaWR4LCB0YXNrX2N0eC0+bGJyX3RvW2ldKTsKKwl9CisJdGFza19jdHgtPmxicl9zdGFja19zdGF0ZSA9IExCUl9WQUxJRDsKK30KKwordm9pZCBpbnRlbF9wbXVfbGJyX3NjaGVkX3Rhc2soc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4LCBib29sIHNjaGVkX2luKQoreworCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKKwlzdHJ1Y3QgeDg2X3BlcmZfdGFza19jb250ZXh0ICp0YXNrX2N0eDsKKworCWlmICgheDg2X3BtdS5sYnJfbnIpCisJCXJldHVybjsKKworCS8qCisJICogSWYgTEJSIGNhbGxzdGFjayBmZWF0dXJlIGlzIGVuYWJsZWQgYW5kIHRoZSBzdGFjayB3YXMgc2F2ZWQgd2hlbgorCSAqIHRoZSB0YXNrIHdhcyBzY2hlZHVsZWQgb3V0LCByZXN0b3JlIHRoZSBzdGFjay4gT3RoZXJ3aXNlIGZsdXNoCisJICogdGhlIExCUiBzdGFjay4KKwkgKi8KKwl0YXNrX2N0eCA9IGN0eCA/IGN0eC0+dGFza19jdHhfZGF0YSA6IE5VTEw7CisJaWYgKHRhc2tfY3R4KSB7CisJCWlmIChzY2hlZF9pbikgeworCQkJX19pbnRlbF9wbXVfbGJyX3Jlc3RvcmUodGFza19jdHgpOworCQkJY3B1Yy0+bGJyX2NvbnRleHQgPSBjdHg7CisJCX0gZWxzZSB7CisJCQlfX2ludGVsX3BtdV9sYnJfc2F2ZSh0YXNrX2N0eCk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2hlbiBzYW1wbGluZyB0aGUgYnJhbmNrIHN0YWNrIGluIHN5c3RlbS13aWRlLCBpdCBtYXkgYmUKKwkgKiBuZWNlc3NhcnkgdG8gZmx1c2ggdGhlIHN0YWNrIG9uIGNvbnRleHQgc3dpdGNoLiBUaGlzIGhhcHBlbnMKKwkgKiB3aGVuIHRoZSBicmFuY2ggc3RhY2sgZG9lcyBub3QgdGFnIGl0cyBlbnRyaWVzIHdpdGggdGhlIHBpZAorCSAqIG9mIHRoZSBjdXJyZW50IHRhc2suIE90aGVyd2lzZSBpdCBiZWNvbWVzIGltcG9zc2libGUgdG8KKwkgKiBhc3NvY2lhdGUgYSBicmFuY2ggZW50cnkgd2l0aCBhIHRhc2suIFRoaXMgYW1iaWd1aXR5IGlzIG1vcmUKKwkgKiBsaWtlbHkgdG8gYXBwZWFyIHdoZW4gdGhlIGJyYW5jaCBzdGFjayBzdXBwb3J0cyBwcml2IGxldmVsCisJICogZmlsdGVyaW5nIGFuZCB0aGUgdXNlciBzZXRzIGl0IHRvIG1vbml0b3Igb25seSBhdCB0aGUgdXNlcgorCSAqIGxldmVsICh3aGljaCBjb3VsZCBiZSBhIHVzZWZ1bCBtZWFzdXJlbWVudCBpbiBzeXN0ZW0td2lkZQorCSAqIG1vZGUpLiBJbiB0aGF0IGNhc2UsIHRoZSByaXNrIGlzIGhpZ2ggb2YgaGF2aW5nIGEgYnJhbmNoCisJICogc3RhY2sgd2l0aCBicmFuY2ggZnJvbSBtdWx0aXBsZSB0YXNrcy4KKyAJICovCisJaWYgKHNjaGVkX2luKSB7CisJCWludGVsX3BtdV9sYnJfcmVzZXQoKTsKKwkJY3B1Yy0+bGJyX2NvbnRleHQgPSBjdHg7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYnJhbmNoX3VzZXJfY2FsbHN0YWNrKHVuc2lnbmVkIGJyX3NlbCkKK3sKKwlyZXR1cm4gKGJyX3NlbCAmIFg4Nl9CUl9VU0VSKSAmJiAoYnJfc2VsICYgWDg2X0JSX0NBTExfU1RBQ0spOworfQorCiB2b2lkIGludGVsX3BtdV9sYnJfZW5hYmxlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YyA9IHRoaXNfY3B1X3B0cigmY3B1X2h3X2V2ZW50cyk7CisJc3RydWN0IHg4Nl9wZXJmX3Rhc2tfY29udGV4dCAqdGFza19jdHg7CiAKIAlpZiAoIXg4Nl9wbXUubGJyX25yKQogCQlyZXR1cm47CkBAIC0xOTgsMTggKzMyMiwzMyBAQAogCX0KIAljcHVjLT5icl9zZWwgPSBldmVudC0+aHcuYnJhbmNoX3JlZy5yZWc7CiAKKwlpZiAoYnJhbmNoX3VzZXJfY2FsbHN0YWNrKGNwdWMtPmJyX3NlbCkgJiYgZXZlbnQtPmN0eCAmJgorCQkJCQlldmVudC0+Y3R4LT50YXNrX2N0eF9kYXRhKSB7CisJCXRhc2tfY3R4ID0gZXZlbnQtPmN0eC0+dGFza19jdHhfZGF0YTsKKwkJdGFza19jdHgtPmxicl9jYWxsc3RhY2tfdXNlcnMrKzsKKwl9CisKIAljcHVjLT5sYnJfdXNlcnMrKzsKKwlwZXJmX3NjaGVkX2NiX2luYyhldmVudC0+Y3R4LT5wbXUpOwogfQogCiB2b2lkIGludGVsX3BtdV9sYnJfZGlzYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMgPSB0aGlzX2NwdV9wdHIoJmNwdV9od19ldmVudHMpOworCXN0cnVjdCB4ODZfcGVyZl90YXNrX2NvbnRleHQgKnRhc2tfY3R4OwogCiAJaWYgKCF4ODZfcG11Lmxicl9ucikKIAkJcmV0dXJuOwogCisJaWYgKGJyYW5jaF91c2VyX2NhbGxzdGFjayhjcHVjLT5icl9zZWwpICYmIGV2ZW50LT5jdHggJiYKKwkJCQkJZXZlbnQtPmN0eC0+dGFza19jdHhfZGF0YSkgeworCQl0YXNrX2N0eCA9IGV2ZW50LT5jdHgtPnRhc2tfY3R4X2RhdGE7CisJCXRhc2tfY3R4LT5sYnJfY2FsbHN0YWNrX3VzZXJzLS07CisJfQorCiAJY3B1Yy0+bGJyX3VzZXJzLS07CiAJV0FSTl9PTl9PTkNFKGNwdWMtPmxicl91c2VycyA8IDApOworCXBlcmZfc2NoZWRfY2JfZGVjKGV2ZW50LT5jdHgtPnBtdSk7CiAKIAlpZiAoY3B1Yy0+ZW5hYmxlZCAmJiAhY3B1Yy0+bGJyX3VzZXJzKSB7CiAJCV9faW50ZWxfcG11X2xicl9kaXNhYmxlKCk7CkBAIC0yMTgsMTIgKzM1NywxMiBAQAogCX0KIH0KIAotdm9pZCBpbnRlbF9wbXVfbGJyX2VuYWJsZV9hbGwodm9pZCkKK3ZvaWQgaW50ZWxfcG11X2xicl9lbmFibGVfYWxsKGJvb2wgcG1pKQogewogCXN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjID0gdGhpc19jcHVfcHRyKCZjcHVfaHdfZXZlbnRzKTsKIAogCWlmIChjcHVjLT5sYnJfdXNlcnMpCi0JCV9faW50ZWxfcG11X2xicl9lbmFibGUoKTsKKwkJX19pbnRlbF9wbXVfbGJyX2VuYWJsZShwbWkpOwogfQogCiB2b2lkIGludGVsX3BtdV9sYnJfZGlzYWJsZV9hbGwodm9pZCkKQEAgLTIzNCwxOCArMzczLDYgQEAKIAkJX19pbnRlbF9wbXVfbGJyX2Rpc2FibGUoKTsKIH0KIAotLyoKLSAqIFRPUyA9IG1vc3QgcmVjZW50bHkgcmVjb3JkZWQgYnJhbmNoCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTY0IGludGVsX3BtdV9sYnJfdG9zKHZvaWQpCi17Ci0JdTY0IHRvczsKLQotCXJkbXNybCh4ODZfcG11Lmxicl90b3MsIHRvcyk7Ci0KLQlyZXR1cm4gdG9zOwotfQotCiBzdGF0aWMgdm9pZCBpbnRlbF9wbXVfbGJyX3JlYWRfMzIoc3RydWN0IGNwdV9od19ldmVudHMgKmNwdWMpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXNrID0geDg2X3BtdS5sYnJfbnIgLSAxOwpAQCAtMzUwLDcgKzQ3Nyw3IEBACiAgKiAtIGluIGNhc2UgdGhlcmUgaXMgbm8gSFcgZmlsdGVyCiAgKiAtIGluIGNhc2UgdGhlIEhXIGZpbHRlciBoYXMgZXJyYXRhIG9yIGxpbWl0YXRpb25zCiAgKi8KLXN0YXRpYyB2b2lkIGludGVsX3BtdV9zZXR1cF9zd19sYnJfZmlsdGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3N0YXRpYyBpbnQgaW50ZWxfcG11X3NldHVwX3N3X2xicl9maWx0ZXIoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXU2NCBicl90eXBlID0gZXZlbnQtPmF0dHIuYnJhbmNoX3NhbXBsZV90eXBlOwogCWludCBtYXNrID0gMDsKQEAgLTM4NywxMSArNTE0LDIxIEBACiAJaWYgKGJyX3R5cGUgJiBQRVJGX1NBTVBMRV9CUkFOQ0hfQ09ORCkKIAkJbWFzayB8PSBYODZfQlJfSkNDOwogCisJaWYgKGJyX3R5cGUgJiBQRVJGX1NBTVBMRV9CUkFOQ0hfQ0FMTF9TVEFDSykgeworCQlpZiAoIXg4Nl9wbXVfaGFzX2xicl9jYWxsc3RhY2soKSkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJaWYgKG1hc2sgJiB+KFg4Nl9CUl9VU0VSIHwgWDg2X0JSX0tFUk5FTCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbWFzayB8PSBYODZfQlJfQ0FMTCB8IFg4Nl9CUl9JTkRfQ0FMTCB8IFg4Nl9CUl9SRVQgfAorCQkJWDg2X0JSX0NBTExfU1RBQ0s7CisJfQorCiAJLyoKIAkgKiBzdGFzaCBhY3R1YWwgdXNlciByZXF1ZXN0IGludG8gcmVnLCBpdCBtYXkKIAkgKiBiZSB1c2VkIGJ5IGZpeHVwIGNvZGUgZm9yIHNvbWUgQ1BVCiAJICovCiAJZXZlbnQtPmh3LmJyYW5jaF9yZWcucmVnID0gbWFzazsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQwMywxNCArNTQwLDE0IEBACiB7CiAJc3RydWN0IGh3X3BlcmZfZXZlbnRfZXh0cmEgKnJlZzsKIAl1NjQgYnJfdHlwZSA9IGV2ZW50LT5hdHRyLmJyYW5jaF9zYW1wbGVfdHlwZTsKLQl1NjQgbWFzayA9IDAsIG07Ci0JdTY0IHY7CisJdTY0IG1hc2sgPSAwLCB2OworCWludCBpOwogCi0JZm9yX2VhY2hfYnJhbmNoX3NhbXBsZV90eXBlKG0pIHsKLQkJaWYgKCEoYnJfdHlwZSAmIG0pKQorCWZvciAoaSA9IDA7IGkgPCBQRVJGX1NBTVBMRV9CUkFOQ0hfTUFYX1NISUZUOyBpKyspIHsKKwkJaWYgKCEoYnJfdHlwZSAmICgxVUxMIDw8IGkpKSkKIAkJCWNvbnRpbnVlOwogCi0JCXYgPSB4ODZfcG11Lmxicl9zZWxfbWFwW21dOworCQl2ID0geDg2X3BtdS5sYnJfc2VsX21hcFtpXTsKIAkJaWYgKHYgPT0gTEJSX05PVF9TVVBQKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCkBAIC00MjAsOCArNTU3LDEyIEBACiAJcmVnID0gJmV2ZW50LT5ody5icmFuY2hfcmVnOwogCXJlZy0+aWR4ID0gRVhUUkFfUkVHX0xCUjsKIAotCS8qIExCUl9TRUxFQ1Qgb3BlcmF0ZXMgaW4gc3VwcHJlc3MgbW9kZSBzbyBpbnZlcnQgbWFzayAqLwotCXJlZy0+Y29uZmlnID0gfm1hc2sgJiB4ODZfcG11Lmxicl9zZWxfbWFzazsKKwkvKgorCSAqIFRoZSBmaXJzdCA5IGJpdHMgKExCUl9TRUxfTUFTSykgaW4gTEJSX1NFTEVDVCBvcGVyYXRlCisJICogaW4gc3VwcHJlc3MgbW9kZS4gU28gTEJSX1NFTEVDVCBzaG91bGQgYmUgc2V0IHRvCisJICogKH5tYXNrICYgTEJSX1NFTF9NQVNLKSB8IChtYXNrICYgfkxCUl9TRUxfTUFTSykKKwkgKi8KKwlyZWctPmNvbmZpZyA9IG1hc2sgXiB4ODZfcG11Lmxicl9zZWxfbWFzazsKIAogCXJldHVybiAwOwogfQpAQCAtNDM5LDcgKzU4MCw5IEBACiAJLyoKIAkgKiBzZXR1cCBTVyBMQlIgZmlsdGVyCiAJICovCi0JaW50ZWxfcG11X3NldHVwX3N3X2xicl9maWx0ZXIoZXZlbnQpOworCXJldCA9IGludGVsX3BtdV9zZXR1cF9zd19sYnJfZmlsdGVyKGV2ZW50KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJLyoKIAkgKiBzZXR1cCBIVyBMQlIgZmlsdGVyLCBpZiBhbnkKQEAgLTU2OCw2ICs3MTEsMTIgQEAKIAkJcmV0ID0gWDg2X0JSX0lOVDsKIAkJYnJlYWs7CiAJY2FzZSAweGU4OiAvKiBjYWxsIG5lYXIgcmVsICovCisJCWluc25fZ2V0X2ltbWVkaWF0ZSgmaW5zbik7CisJCWlmIChpbnNuLmltbWVkaWF0ZTEudmFsdWUgPT0gMCkgeworCQkJLyogemVybyBsZW5ndGggY2FsbCAqLworCQkJcmV0ID0gWDg2X0JSX1pFUk9fQ0FMTDsKKwkJCWJyZWFrOworCQl9CiAJY2FzZSAweDlhOiAvKiBjYWxsIGZhciBhYnNvbHV0ZSAqLwogCQlyZXQgPSBYODZfQlJfQ0FMTDsKIAkJYnJlYWs7CkBAIC02NzgsMzUgKzgyNyw0OSBAQAogLyoKICAqIE1hcCBpbnRlcmZhY2UgYnJhbmNoIGZpbHRlcnMgb250byBMQlIgZmlsdGVycwogICovCi1zdGF0aWMgY29uc3QgaW50IG5obV9sYnJfc2VsX21hcFtQRVJGX1NBTVBMRV9CUkFOQ0hfTUFYXSA9IHsKLQlbUEVSRl9TQU1QTEVfQlJBTkNIX0FOWV0JPSBMQlJfQU5ZLAotCVtQRVJGX1NBTVBMRV9CUkFOQ0hfVVNFUl0JPSBMQlJfVVNFUiwKLQlbUEVSRl9TQU1QTEVfQlJBTkNIX0tFUk5FTF0JPSBMQlJfS0VSTkVMLAotCVtQRVJGX1NBTVBMRV9CUkFOQ0hfSFZdCQk9IExCUl9JR04sCi0JW1BFUkZfU0FNUExFX0JSQU5DSF9BTllfUkVUVVJOXQk9IExCUl9SRVRVUk4gfCBMQlJfUkVMX0pNUAotCQkJCQl8IExCUl9JTkRfSk1QIHwgTEJSX0ZBUiwKK3N0YXRpYyBjb25zdCBpbnQgbmhtX2xicl9zZWxfbWFwW1BFUkZfU0FNUExFX0JSQU5DSF9NQVhfU0hJRlRdID0geworCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQU5ZX1NISUZUXQkJPSBMQlJfQU5ZLAorCVtQRVJGX1NBTVBMRV9CUkFOQ0hfVVNFUl9TSElGVF0JCT0gTEJSX1VTRVIsCisJW1BFUkZfU0FNUExFX0JSQU5DSF9LRVJORUxfU0hJRlRdCT0gTEJSX0tFUk5FTCwKKwlbUEVSRl9TQU1QTEVfQlJBTkNIX0hWX1NISUZUXQkJPSBMQlJfSUdOLAorCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQU5ZX1JFVFVSTl9TSElGVF0JPSBMQlJfUkVUVVJOIHwgTEJSX1JFTF9KTVAKKwkJCQkJCXwgTEJSX0lORF9KTVAgfCBMQlJfRkFSLAogCS8qCiAJICogTkhNL1dTTSBlcnJhdHVtOiBtdXN0IGluY2x1ZGUgUkVMX0pNUCtJTkRfSk1QIHRvIGdldCBDQUxMIGJyYW5jaGVzCiAJICovCi0JW1BFUkZfU0FNUExFX0JSQU5DSF9BTllfQ0FMTF0gPQorCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQU5ZX0NBTExfU0hJRlRdID0KIAkgTEJSX1JFTF9DQUxMIHwgTEJSX0lORF9DQUxMIHwgTEJSX1JFTF9KTVAgfCBMQlJfSU5EX0pNUCB8IExCUl9GQVIsCiAJLyoKIAkgKiBOSE0vV1NNIGVycmF0dW06IG11c3QgaW5jbHVkZSBJTkRfSk1QIHRvIGNhcHR1cmUgSU5EX0NBTEwKIAkgKi8KLQlbUEVSRl9TQU1QTEVfQlJBTkNIX0lORF9DQUxMXSA9IExCUl9JTkRfQ0FMTCB8IExCUl9JTkRfSk1QLAotCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQ09ORF0gICAgID0gTEJSX0pDQywKKwlbUEVSRl9TQU1QTEVfQlJBTkNIX0lORF9DQUxMX1NISUZUXSA9IExCUl9JTkRfQ0FMTCB8IExCUl9JTkRfSk1QLAorCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQ09ORF9TSElGVF0gICAgID0gTEJSX0pDQywKIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgc25iX2xicl9zZWxfbWFwW1BFUkZfU0FNUExFX0JSQU5DSF9NQVhdID0gewotCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQU5ZXQk9IExCUl9BTlksCi0JW1BFUkZfU0FNUExFX0JSQU5DSF9VU0VSXQk9IExCUl9VU0VSLAotCVtQRVJGX1NBTVBMRV9CUkFOQ0hfS0VSTkVMXQk9IExCUl9LRVJORUwsCi0JW1BFUkZfU0FNUExFX0JSQU5DSF9IVl0JCT0gTEJSX0lHTiwKLQlbUEVSRl9TQU1QTEVfQlJBTkNIX0FOWV9SRVRVUk5dCT0gTEJSX1JFVFVSTiB8IExCUl9GQVIsCi0JW1BFUkZfU0FNUExFX0JSQU5DSF9BTllfQ0FMTF0JPSBMQlJfUkVMX0NBTEwgfCBMQlJfSU5EX0NBTEwKLQkJCQkJfCBMQlJfRkFSLAotCVtQRVJGX1NBTVBMRV9CUkFOQ0hfSU5EX0NBTExdCT0gTEJSX0lORF9DQUxMLAotCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQ09ORF0gICAgICAgPSBMQlJfSkNDLAorc3RhdGljIGNvbnN0IGludCBzbmJfbGJyX3NlbF9tYXBbUEVSRl9TQU1QTEVfQlJBTkNIX01BWF9TSElGVF0gPSB7CisJW1BFUkZfU0FNUExFX0JSQU5DSF9BTllfU0hJRlRdCQk9IExCUl9BTlksCisJW1BFUkZfU0FNUExFX0JSQU5DSF9VU0VSX1NISUZUXQkJPSBMQlJfVVNFUiwKKwlbUEVSRl9TQU1QTEVfQlJBTkNIX0tFUk5FTF9TSElGVF0JPSBMQlJfS0VSTkVMLAorCVtQRVJGX1NBTVBMRV9CUkFOQ0hfSFZfU0hJRlRdCQk9IExCUl9JR04sCisJW1BFUkZfU0FNUExFX0JSQU5DSF9BTllfUkVUVVJOX1NISUZUXQk9IExCUl9SRVRVUk4gfCBMQlJfRkFSLAorCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQU5ZX0NBTExfU0hJRlRdCT0gTEJSX1JFTF9DQUxMIHwgTEJSX0lORF9DQUxMCisJCQkJCQl8IExCUl9GQVIsCisJW1BFUkZfU0FNUExFX0JSQU5DSF9JTkRfQ0FMTF9TSElGVF0JPSBMQlJfSU5EX0NBTEwsCisJW1BFUkZfU0FNUExFX0JSQU5DSF9DT05EX1NISUZUXQkJPSBMQlJfSkNDLAorfTsKKworc3RhdGljIGNvbnN0IGludCBoc3dfbGJyX3NlbF9tYXBbUEVSRl9TQU1QTEVfQlJBTkNIX01BWF9TSElGVF0gPSB7CisJW1BFUkZfU0FNUExFX0JSQU5DSF9BTllfU0hJRlRdCQk9IExCUl9BTlksCisJW1BFUkZfU0FNUExFX0JSQU5DSF9VU0VSX1NISUZUXQkJPSBMQlJfVVNFUiwKKwlbUEVSRl9TQU1QTEVfQlJBTkNIX0tFUk5FTF9TSElGVF0JPSBMQlJfS0VSTkVMLAorCVtQRVJGX1NBTVBMRV9CUkFOQ0hfSFZfU0hJRlRdCQk9IExCUl9JR04sCisJW1BFUkZfU0FNUExFX0JSQU5DSF9BTllfUkVUVVJOX1NISUZUXQk9IExCUl9SRVRVUk4gfCBMQlJfRkFSLAorCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQU5ZX0NBTExfU0hJRlRdCT0gTEJSX1JFTF9DQUxMIHwgTEJSX0lORF9DQUxMCisJCQkJCQl8IExCUl9GQVIsCisJW1BFUkZfU0FNUExFX0JSQU5DSF9JTkRfQ0FMTF9TSElGVF0JPSBMQlJfSU5EX0NBTEwsCisJW1BFUkZfU0FNUExFX0JSQU5DSF9DT05EX1NISUZUXQkJPSBMQlJfSkNDLAorCVtQRVJGX1NBTVBMRV9CUkFOQ0hfQ0FMTF9TVEFDS19TSElGVF0JPSBMQlJfUkVMX0NBTEwgfCBMQlJfSU5EX0NBTEwKKwkJCQkJCXwgTEJSX1JFVFVSTiB8IExCUl9DQUxMX1NUQUNLLAogfTsKIAogLyogY29yZSAqLwpAQCAtNzY1LDYgKzkyOCwyMCBAQAogCXByX2NvbnQoIjE2LWRlZXAgTEJSLCAiKTsKIH0KIAorLyogaGFzd2VsbCAqLwordm9pZCBpbnRlbF9wbXVfbGJyX2luaXRfaHN3KHZvaWQpCit7CisJeDg2X3BtdS5sYnJfbnIJID0gMTY7CisJeDg2X3BtdS5sYnJfdG9zCSA9IE1TUl9MQlJfVE9TOworCXg4Nl9wbXUubGJyX2Zyb20gPSBNU1JfTEJSX05ITV9GUk9NOworCXg4Nl9wbXUubGJyX3RvICAgPSBNU1JfTEJSX05ITV9UTzsKKworCXg4Nl9wbXUubGJyX3NlbF9tYXNrID0gTEJSX1NFTF9NQVNLOworCXg4Nl9wbXUubGJyX3NlbF9tYXAgID0gaHN3X2xicl9zZWxfbWFwOworCisJcHJfY29udCgiMTYtZGVlcCBMQlIsICIpOworfQorCiAvKiBhdG9tICovCiB2b2lkIF9faW5pdCBpbnRlbF9wbXVfbGJyX2luaXRfYXRvbSh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX3B0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjc3MDY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX3B0LmMKQEAgLTAsMCArMSwxMTAzIEBACisvKgorICogSW50ZWwoUikgUHJvY2Vzc29yIFRyYWNlIFBNVSBkcml2ZXIgZm9yIHBlcmYKKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogSW50ZWwgUFQgaXMgc3BlY2lmaWVkIGluIHRoZSBJbnRlbCBBcmNoaXRlY3R1cmUgSW5zdHJ1Y3Rpb24gU2V0IEV4dGVuc2lvbnMKKyAqIFByb2dyYW1taW5nIFJlZmVyZW5jZToKKyAqIGh0dHA6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvaW50ZWwtaXNhLWV4dGVuc2lvbnMKKyAqLworCisjdW5kZWYgREVCVUcKKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxhc20vcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGFzbS9pbnNuLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisKKyNpbmNsdWRlICJwZXJmX2V2ZW50LmgiCisjaW5jbHVkZSAiaW50ZWxfcHQuaCIKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwdCwgcHRfY3R4KTsKKworc3RhdGljIHN0cnVjdCBwdF9wbXUgcHRfcG11OworCitlbnVtIGNwdWlkX3JlZ3MgeworCUNSX0VBWCA9IDAsCisJQ1JfRUNYLAorCUNSX0VEWCwKKwlDUl9FQlgKK307CisKKy8qCisgKiBDYXBhYmlsaXRpZXMgb2YgSW50ZWwgUFQgaGFyZHdhcmUsIHN1Y2ggYXMgbnVtYmVyIG9mIGFkZHJlc3MgYml0cyBvcgorICogc3VwcG9ydGVkIG91dHB1dCBzY2hlbWVzLCBhcmUgY2FjaGVkIGFuZCBleHBvcnRlZCB0byB1c2Vyc3BhY2UgYXMgImNhcHMiCisgKiBhdHRyaWJ1dGUgZ3JvdXAgb2YgcHQgcG11IGRldmljZQorICogKC9zeXMvYnVzL2V2ZW50X3NvdXJjZS9kZXZpY2VzL2ludGVsX3B0L2NhcHMvKSBzbyB0aGF0IHVzZXJzcGFjZSBjYW4gc3RvcmUKKyAqIHJlbGV2YW50IGJpdHMgdG9nZXRoZXIgd2l0aCBpbnRlbF9wdCB0cmFjZXMuCisgKgorICogVGhlc2UgYXJlIG5lY2Vzc2FyeSBmb3IgYm90aCB0cmFjZSBkZWNvZGluZyAocGF5bG9hZHNfbGlwLCBjb250YWlucyBhZGRyZXNzCisgKiB3aWR0aCBlbmNvZGVkIGluIElQLXJlbGF0ZWQgcGFja2V0cyksIGFuZCBldmVudCBjb25maWd1cmF0aW9uIChiaXRtYXNrcyB3aXRoCisgKiBwZXJtaXR0ZWQgdmFsdWVzIGZvciBjZXJ0YWluIGJpdCBmaWVsZHMpLgorICovCisjZGVmaW5lIFBUX0NBUChfbiwgX2wsIF9yLCBfbSkJCQkJCQlcCisJW1BUX0NBUF8gIyMgX25dID0geyAubmFtZSA9IF9fc3RyaW5naWZ5KF9uKSwgLmxlYWYgPSBfbCwJXAorCQkJICAgIC5yZWcgPSBfciwgLm1hc2sgPSBfbSB9CisKK3N0YXRpYyBzdHJ1Y3QgcHRfY2FwX2Rlc2MgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJdTMyCQlsZWFmOworCXU4CQlyZWc7CisJdTMyCQltYXNrOworfSBwdF9jYXBzW10gPSB7CisJUFRfQ0FQKG1heF9zdWJsZWFmLAkJMCwgQ1JfRUFYLCAweGZmZmZmZmZmKSwKKwlQVF9DQVAoY3IzX2ZpbHRlcmluZywJCTAsIENSX0VCWCwgQklUKDApKSwKKwlQVF9DQVAodG9wYV9vdXRwdXQsCQkwLCBDUl9FQ1gsIEJJVCgwKSksCisJUFRfQ0FQKHRvcGFfbXVsdGlwbGVfZW50cmllcywJMCwgQ1JfRUNYLCBCSVQoMSkpLAorCVBUX0NBUChwYXlsb2Fkc19saXAsCQkwLCBDUl9FQ1gsIEJJVCgzMSkpLAorfTsKKworc3RhdGljIHUzMiBwdF9jYXBfZ2V0KGVudW0gcHRfY2FwYWJpbGl0aWVzIGNhcCkKK3sKKwlzdHJ1Y3QgcHRfY2FwX2Rlc2MgKmNkID0gJnB0X2NhcHNbY2FwXTsKKwl1MzIgYyA9IHB0X3BtdS5jYXBzW2NkLT5sZWFmICogNCArIGNkLT5yZWddOworCXVuc2lnbmVkIGludCBzaGlmdCA9IF9fZmZzKGNkLT5tYXNrKTsKKworCXJldHVybiAoYyAmIGNkLT5tYXNrKSA+PiBzaGlmdDsKK30KKworc3RhdGljIHNzaXplX3QgcHRfY2FwX3Nob3coc3RydWN0IGRldmljZSAqY2RldiwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBkZXZfZXh0X2F0dHJpYnV0ZSAqZWEgPQorCQljb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGRldl9leHRfYXR0cmlidXRlLCBhdHRyKTsKKwllbnVtIHB0X2NhcGFiaWxpdGllcyBjYXAgPSAobG9uZyllYS0+dmFyOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXhcbiIsIHB0X2NhcF9nZXQoY2FwKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHB0X2NhcF9ncm91cCA9IHsKKwkubmFtZQk9ICJjYXBzIiwKK307CisKK1BNVV9GT1JNQVRfQVRUUih0c2MsCQkiY29uZmlnOjEwIgkpOworUE1VX0ZPUk1BVF9BVFRSKG5vcmV0Y29tcCwJImNvbmZpZzoxMSIJKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnB0X2Zvcm1hdHNfYXR0cltdID0geworCSZmb3JtYXRfYXR0cl90c2MuYXR0ciwKKwkmZm9ybWF0X2F0dHJfbm9yZXRjb21wLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHB0X2Zvcm1hdF9ncm91cCA9IHsKKwkubmFtZQk9ICJmb3JtYXQiLAorCS5hdHRycwk9IHB0X2Zvcm1hdHNfYXR0ciwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpwdF9hdHRyX2dyb3Vwc1tdID0geworCSZwdF9jYXBfZ3JvdXAsCisJJnB0X2Zvcm1hdF9ncm91cCwKKwlOVUxMLAorfTsKKworc3RhdGljIGludCBfX2luaXQgcHRfcG11X2h3X2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2X2V4dF9hdHRyaWJ1dGUgKmRlX2F0dHJzOworCXN0cnVjdCBhdHRyaWJ1dGUgKiphdHRyczsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgcmV0OworCWxvbmcgaTsKKworCWF0dHJzID0gTlVMTDsKKwlyZXQgPSAtRU5PREVWOworCWlmICghdGVzdF9jcHVfY2FwKCZib290X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9JTlRFTF9QVCkpCisJCWdvdG8gZmFpbDsKKworCWZvciAoaSA9IDA7IGkgPCBQVF9DUFVJRF9MRUFWRVM7IGkrKykgeworCQljcHVpZF9jb3VudCgyMCwgaSwKKwkJCSAgICAmcHRfcG11LmNhcHNbQ1JfRUFYICsgaSo0XSwKKwkJCSAgICAmcHRfcG11LmNhcHNbQ1JfRUJYICsgaSo0XSwKKwkJCSAgICAmcHRfcG11LmNhcHNbQ1JfRUNYICsgaSo0XSwKKwkJCSAgICAmcHRfcG11LmNhcHNbQ1JfRURYICsgaSo0XSk7CisJfQorCisJcmV0ID0gLUVOT01FTTsKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBhdHRyaWJ1dGUgKikgKiAoQVJSQVlfU0laRShwdF9jYXBzKSsxKTsKKwlhdHRycyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhdHRycykKKwkJZ290byBmYWlsOworCisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGV2X2V4dF9hdHRyaWJ1dGUpICogKEFSUkFZX1NJWkUocHRfY2FwcykrMSk7CisJZGVfYXR0cnMgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghZGVfYXR0cnMpCisJCWdvdG8gZmFpbDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHB0X2NhcHMpOyBpKyspIHsKKwkJc3RydWN0IGRldl9leHRfYXR0cmlidXRlICpkZV9hdHRyID0gZGVfYXR0cnMgKyBpOworCisJCWRlX2F0dHItPmF0dHIuYXR0ci5uYW1lID0gcHRfY2Fwc1tpXS5uYW1lOworCisJCXN5c2ZzX2F0dHJfaW5pdCgmZGVfYXR0cnMtPmF0dHIuYXR0cik7CisKKwkJZGVfYXR0ci0+YXR0ci5hdHRyLm1vZGUJCT0gU19JUlVHTzsKKwkJZGVfYXR0ci0+YXR0ci5zaG93CQk9IHB0X2NhcF9zaG93OworCQlkZV9hdHRyLT52YXIJCQk9ICh2b2lkICopaTsKKworCQlhdHRyc1tpXSA9ICZkZV9hdHRyLT5hdHRyLmF0dHI7CisJfQorCisJcHRfY2FwX2dyb3VwLmF0dHJzID0gYXR0cnM7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlrZnJlZShhdHRycyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFBUX0NPTkZJR19NQVNLIChSVElUX0NUTF9UU0NfRU4gfCBSVElUX0NUTF9ESVNSRVRDKQorCitzdGF0aWMgYm9vbCBwdF9ldmVudF92YWxpZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJdTY0IGNvbmZpZyA9IGV2ZW50LT5hdHRyLmNvbmZpZzsKKworCWlmICgoY29uZmlnICYgUFRfQ09ORklHX01BU0spICE9IGNvbmZpZykKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBQVCBjb25maWd1cmF0aW9uIGhlbHBlcnMKKyAqIFRoZXNlIGFsbCBhcmUgY3B1IGFmZmluZSBhbmQgb3BlcmF0ZSBvbiBhIGxvY2FsIFBUCisgKi8KKworc3RhdGljIGJvb2wgcHRfaXNfcnVubmluZyh2b2lkKQoreworCXU2NCBjdGw7CisKKwlyZG1zcmwoTVNSX0lBMzJfUlRJVF9DVEwsIGN0bCk7CisKKwlyZXR1cm4gISEoY3RsICYgUlRJVF9DVExfVFJBQ0VFTik7Cit9CisKK3N0YXRpYyB2b2lkIHB0X2NvbmZpZyhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJdTY0IHJlZzsKKworCXJlZyA9IFJUSVRfQ1RMX1RPUEEgfCBSVElUX0NUTF9CUkFOQ0hfRU4gfCBSVElUX0NUTF9UUkFDRUVOOworCisJaWYgKCFldmVudC0+YXR0ci5leGNsdWRlX2tlcm5lbCkKKwkJcmVnIHw9IFJUSVRfQ1RMX09TOworCWlmICghZXZlbnQtPmF0dHIuZXhjbHVkZV91c2VyKQorCQlyZWcgfD0gUlRJVF9DVExfVVNSOworCisJcmVnIHw9IChldmVudC0+YXR0ci5jb25maWcgJiBQVF9DT05GSUdfTUFTSyk7CisKKwl3cm1zcmwoTVNSX0lBMzJfUlRJVF9DVEwsIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHB0X2NvbmZpZ19zdGFydChib29sIHN0YXJ0KQoreworCXU2NCBjdGw7CisKKwlyZG1zcmwoTVNSX0lBMzJfUlRJVF9DVEwsIGN0bCk7CisJaWYgKHN0YXJ0KQorCQljdGwgfD0gUlRJVF9DVExfVFJBQ0VFTjsKKwllbHNlCisJCWN0bCAmPSB+UlRJVF9DVExfVFJBQ0VFTjsKKwl3cm1zcmwoTVNSX0lBMzJfUlRJVF9DVEwsIGN0bCk7CisKKwkvKgorCSAqIEEgd3Jtc3IgdGhhdCBkaXNhYmxlcyB0cmFjZSBnZW5lcmF0aW9uIHNlcmlhbGl6ZXMgb3RoZXIgUFQKKwkgKiByZWdpc3RlcnMgYW5kIGNhdXNlcyBhbGwgZGF0YSBwYWNrZXRzIHRvIGJlIHdyaXR0ZW4gdG8gbWVtb3J5LAorCSAqIGJ1dCBhIGZlbmNlIGlzIHJlcXVpcmVkIGZvciB0aGUgZGF0YSB0byBiZWNvbWUgZ2xvYmFsbHkgdmlzaWJsZS4KKwkgKgorCSAqIFRoZSBiZWxvdyBXTUIsIHNlcGFyYXRpbmcgZGF0YSBzdG9yZSBhbmQgYXV4X2hlYWQgc3RvcmUgbWF0Y2hlcworCSAqIHRoZSBjb25zdW1lcidzIFJNQiB0aGF0IHNlcGFyYXRlcyBhdXhfaGVhZCBsb2FkIGFuZCBkYXRhIGxvYWQuCisJICovCisJaWYgKCFzdGFydCkKKwkJd21iKCk7Cit9CisKK3N0YXRpYyB2b2lkIHB0X2NvbmZpZ19idWZmZXIodm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgdG9wYV9pZHgsCisJCQkgICAgIHVuc2lnbmVkIGludCBvdXRwdXRfb2ZmKQoreworCXU2NCByZWc7CisKKwl3cm1zcmwoTVNSX0lBMzJfUlRJVF9PVVRQVVRfQkFTRSwgdmlydF90b19waHlzKGJ1ZikpOworCisJcmVnID0gMHg3ZiB8ICgodTY0KXRvcGFfaWR4IDw8IDcpIHwgKCh1NjQpb3V0cHV0X29mZiA8PCAzMik7CisKKwl3cm1zcmwoTVNSX0lBMzJfUlRJVF9PVVRQVVRfTUFTSywgcmVnKTsKK30KKworLyoKKyAqIEtlZXAgVG9QQSB0YWJsZS1yZWxhdGVkIG1ldGFkYXRhIG9uIHRoZSBzYW1lIHBhZ2UgYXMgdGhlIGFjdHVhbCB0YWJsZSwKKyAqIHRha2luZyB1cCBhIGZldyB3b3JkcyBmcm9tIHRoZSB0b3AKKyAqLworCisjZGVmaW5lIFRFTlRTX1BFUl9QQUdFICgoKFBBR0VfU0laRSAtIDQwKSAvIHNpemVvZihzdHJ1Y3QgdG9wYV9lbnRyeSkpIC0gMSkKKworLyoqCisgKiBzdHJ1Y3QgdG9wYSAtIHBhZ2Utc2l6ZWQgVG9QQSB0YWJsZSB3aXRoIG1ldGFkYXRhIGF0IHRoZSB0b3AKKyAqIEB0YWJsZToJYWN0dWFsIFRvUEEgdGFibGUgZW50cmllcywgYXMgdW5kZXJzdG9vZCBieSBQVCBoYXJkd2FyZQorICogQGxpc3Q6CWxpbmthZ2UgdG8gc3RydWN0IHB0X2J1ZmZlcidzIGxpc3Qgb2YgdGFibGVzCisgKiBAcGh5czoJcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGlzIHBhZ2UKKyAqIEBvZmZzZXQ6CW9mZnNldCBvZiB0aGUgZmlyc3QgZW50cnkgaW4gdGhpcyB0YWJsZSBpbiB0aGUgYnVmZmVyCisgKiBAc2l6ZToJdG90YWwgc2l6ZSBvZiBhbGwgZW50cmllcyBpbiB0aGlzIHRhYmxlCisgKiBAbGFzdDoJaW5kZXggb2YgdGhlIGxhc3QgaW5pdGlhbGl6ZWQgZW50cnkgaW4gdGhpcyB0YWJsZQorICovCitzdHJ1Y3QgdG9wYSB7CisJc3RydWN0IHRvcGFfZW50cnkJdGFibGVbVEVOVFNfUEVSX1BBR0VdOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwl1NjQJCQlwaHlzOworCXU2NAkJCW9mZnNldDsKKwlzaXplX3QJCQlzaXplOworCWludAkJCWxhc3Q7Cit9OworCisvKiBtYWtlIC0xIHN0YW5kIGZvciB0aGUgbGFzdCB0YWJsZSBlbnRyeSAqLworI2RlZmluZSBUT1BBX0VOVFJZKHQsIGkpICgoaSkgPT0gLTEgPyAmKHQpLT50YWJsZVsodCktPmxhc3RdIDogJih0KS0+dGFibGVbKGkpXSkKKworLyoqCisgKiB0b3BhX2FsbG9jKCkgLSBhbGxvY2F0ZSBwYWdlLXNpemVkIFRvUEEgdGFibGUKKyAqIEBjcHU6CUNQVSBvbiB3aGljaCB0byBhbGxvY2F0ZS4KKyAqIEBnZnA6CUFsbG9jYXRpb24gZmxhZ3MuCisgKgorICogUmV0dXJuOglPbiBzdWNjZXNzLCByZXR1cm4gdGhlIHBvaW50ZXIgdG8gVG9QQSB0YWJsZSBwYWdlLgorICovCitzdGF0aWMgc3RydWN0IHRvcGEgKnRvcGFfYWxsb2MoaW50IGNwdSwgZ2ZwX3QgZ2ZwKQoreworCWludCBub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKKwlzdHJ1Y3QgdG9wYSAqdG9wYTsKKwlzdHJ1Y3QgcGFnZSAqcDsKKworCXAgPSBhbGxvY19wYWdlc19ub2RlKG5vZGUsIGdmcCB8IF9fR0ZQX1pFUk8sIDApOworCWlmICghcCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0b3BhID0gcGFnZV9hZGRyZXNzKHApOworCXRvcGEtPmxhc3QgPSAwOworCXRvcGEtPnBoeXMgPSBwYWdlX3RvX3BoeXMocCk7CisKKwkvKgorCSAqIEluIGNhc2Ugb2Ygc2luZ2UtZW50cnkgVG9QQSwgYWx3YXlzIHB1dCB0aGUgc2VsZi1yZWZlcmVuY2luZyBFTkQKKwkgKiBsaW5rIGFzIHRoZSAybmQgZW50cnkgaW4gdGhlIHRhYmxlCisJICovCisJaWYgKCFwdF9jYXBfZ2V0KFBUX0NBUF90b3BhX211bHRpcGxlX2VudHJpZXMpKSB7CisJCVRPUEFfRU5UUlkodG9wYSwgMSktPmJhc2UgPSB0b3BhLT5waHlzID4+IFRPUEFfU0hJRlQ7CisJCVRPUEFfRU5UUlkodG9wYSwgMSktPmVuZCA9IDE7CisJfQorCisJcmV0dXJuIHRvcGE7Cit9CisKKy8qKgorICogdG9wYV9mcmVlKCkgLSBmcmVlIGEgcGFnZS1zaXplZCBUb1BBIHRhYmxlCisgKiBAdG9wYToJVGFibGUgdG8gZGVhbGxvY2F0ZS4KKyAqLworc3RhdGljIHZvaWQgdG9wYV9mcmVlKHN0cnVjdCB0b3BhICp0b3BhKQoreworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl0b3BhKTsKK30KKworLyoqCisgKiB0b3BhX2luc2VydF90YWJsZSgpIC0gaW5zZXJ0IGEgVG9QQSB0YWJsZSBpbnRvIGEgYnVmZmVyCisgKiBAYnVmOgkgUFQgYnVmZmVyIHRoYXQncyBiZWluZyBleHRlbmRlZC4KKyAqIEB0b3BhOgkgTmV3IHRvcGEgdGFibGUgdG8gYmUgaW5zZXJ0ZWQuCisgKgorICogSWYgaXQncyB0aGUgZmlyc3QgdGFibGUgaW4gdGhpcyBidWZmZXIsIHNldCB1cCBidWZmZXIncyBwb2ludGVycworICogYWNjb3JkaW5nbHk7IG90aGVyd2lzZSwgYWRkIGEgRU5EPTEgbGluayBlbnRyeSB0byBAdG9wYSB0byB0aGUgY3VycmVudAorICogImxhc3QiIHRhYmxlIGFuZCBhZGp1c3QgdGhlIGxhc3QgdGFibGUgcG9pbnRlciB0byBAdG9wYS4KKyAqLworc3RhdGljIHZvaWQgdG9wYV9pbnNlcnRfdGFibGUoc3RydWN0IHB0X2J1ZmZlciAqYnVmLCBzdHJ1Y3QgdG9wYSAqdG9wYSkKK3sKKwlzdHJ1Y3QgdG9wYSAqbGFzdCA9IGJ1Zi0+bGFzdDsKKworCWxpc3RfYWRkX3RhaWwoJnRvcGEtPmxpc3QsICZidWYtPnRhYmxlcyk7CisKKwlpZiAoIWJ1Zi0+Zmlyc3QpIHsKKwkJYnVmLT5maXJzdCA9IGJ1Zi0+bGFzdCA9IGJ1Zi0+Y3VyID0gdG9wYTsKKwkJcmV0dXJuOworCX0KKworCXRvcGEtPm9mZnNldCA9IGxhc3QtPm9mZnNldCArIGxhc3QtPnNpemU7CisJYnVmLT5sYXN0ID0gdG9wYTsKKworCWlmICghcHRfY2FwX2dldChQVF9DQVBfdG9wYV9tdWx0aXBsZV9lbnRyaWVzKSkKKwkJcmV0dXJuOworCisJQlVHX09OKGxhc3QtPmxhc3QgIT0gVEVOVFNfUEVSX1BBR0UgLSAxKTsKKworCVRPUEFfRU5UUlkobGFzdCwgLTEpLT5iYXNlID0gdG9wYS0+cGh5cyA+PiBUT1BBX1NISUZUOworCVRPUEFfRU5UUlkobGFzdCwgLTEpLT5lbmQgPSAxOworfQorCisvKioKKyAqIHRvcGFfdGFibGVfZnVsbCgpIC0gY2hlY2sgaWYgYSBUb1BBIHRhYmxlIGlzIGZpbGxlZCB1cAorICogQHRvcGE6CVRvUEEgdGFibGUuCisgKi8KK3N0YXRpYyBib29sIHRvcGFfdGFibGVfZnVsbChzdHJ1Y3QgdG9wYSAqdG9wYSkKK3sKKwkvKiBzaW5nbGUtZW50cnkgVG9QQSBpcyBhIHNwZWNpYWwgY2FzZSAqLworCWlmICghcHRfY2FwX2dldChQVF9DQVBfdG9wYV9tdWx0aXBsZV9lbnRyaWVzKSkKKwkJcmV0dXJuICEhdG9wYS0+bGFzdDsKKworCXJldHVybiB0b3BhLT5sYXN0ID09IFRFTlRTX1BFUl9QQUdFIC0gMTsKK30KKworLyoqCisgKiB0b3BhX2luc2VydF9wYWdlcygpIC0gY3JlYXRlIGEgbGlzdCBvZiBUb1BBIHRhYmxlcworICogQGJ1ZjoJUFQgYnVmZmVyIGJlaW5nIGluaXRpYWxpemVkLgorICogQGdmcDoJQWxsb2NhdGlvbiBmbGFncy4KKyAqCisgKiBUaGlzIGluaXRpYWxpemVzIGEgbGlzdCBvZiBUb1BBIHRhYmxlcyB3aXRoIGVudHJpZXMgZnJvbQorICogdGhlIGRhdGFfcGFnZXMgcHJvdmlkZWQgYnkgcmJfYWxsb2NfYXV4KCkuCisgKgorICogUmV0dXJuOgkwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCB0b3BhX2luc2VydF9wYWdlcyhzdHJ1Y3QgcHRfYnVmZmVyICpidWYsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgdG9wYSAqdG9wYSA9IGJ1Zi0+bGFzdDsKKwlpbnQgb3JkZXIgPSAwOworCXN0cnVjdCBwYWdlICpwOworCisJcCA9IHZpcnRfdG9fcGFnZShidWYtPmRhdGFfcGFnZXNbYnVmLT5ucl9wYWdlc10pOworCWlmIChQYWdlUHJpdmF0ZShwKSkKKwkJb3JkZXIgPSBwYWdlX3ByaXZhdGUocCk7CisKKwlpZiAodG9wYV90YWJsZV9mdWxsKHRvcGEpKSB7CisJCXRvcGEgPSB0b3BhX2FsbG9jKGJ1Zi0+Y3B1LCBnZnApOworCQlpZiAoIXRvcGEpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQl0b3BhX2luc2VydF90YWJsZShidWYsIHRvcGEpOworCX0KKworCVRPUEFfRU5UUlkodG9wYSwgLTEpLT5iYXNlID0gcGFnZV90b19waHlzKHApID4+IFRPUEFfU0hJRlQ7CisJVE9QQV9FTlRSWSh0b3BhLCAtMSktPnNpemUgPSBvcmRlcjsKKwlpZiAoIWJ1Zi0+c25hcHNob3QgJiYgIXB0X2NhcF9nZXQoUFRfQ0FQX3RvcGFfbXVsdGlwbGVfZW50cmllcykpIHsKKwkJVE9QQV9FTlRSWSh0b3BhLCAtMSktPmludHIgPSAxOworCQlUT1BBX0VOVFJZKHRvcGEsIC0xKS0+c3RvcCA9IDE7CisJfQorCisJdG9wYS0+bGFzdCsrOworCXRvcGEtPnNpemUgKz0gc2l6ZXMob3JkZXIpOworCisJYnVmLT5ucl9wYWdlcyArPSAxdWwgPDwgb3JkZXI7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBwdF90b3BhX2R1bXAoKSAtIHByaW50IFRvUEEgdGFibGVzIGFuZCB0aGVpciBlbnRyaWVzCisgKiBAYnVmOglQVCBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIHB0X3RvcGFfZHVtcChzdHJ1Y3QgcHRfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHRvcGEgKnRvcGE7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRvcGEsICZidWYtPnRhYmxlcywgbGlzdCkgeworCQlpbnQgaTsKKworCQlwcl9kZWJ1ZygiIyB0YWJsZSBAJXAgKCUwMTZMeCksIG9mZiAlbGx4IHNpemUgJXp4XG4iLCB0b3BhLT50YWJsZSwKKwkJCSB0b3BhLT5waHlzLCB0b3BhLT5vZmZzZXQsIHRvcGEtPnNpemUpOworCQlmb3IgKGkgPSAwOyBpIDwgVEVOVFNfUEVSX1BBR0U7IGkrKykgeworCQkJcHJfZGVidWcoIiMgZW50cnkgQCVwICglbHggc3ogJXUgJWMlYyVjKSByYXc9JTE2bGx4XG4iLAorCQkJCSAmdG9wYS0+dGFibGVbaV0sCisJCQkJICh1bnNpZ25lZCBsb25nKXRvcGEtPnRhYmxlW2ldLmJhc2UgPDwgVE9QQV9TSElGVCwKKwkJCQkgc2l6ZXModG9wYS0+dGFibGVbaV0uc2l6ZSksCisJCQkJIHRvcGEtPnRhYmxlW2ldLmVuZCA/ICAnRScgOiAnICcsCisJCQkJIHRvcGEtPnRhYmxlW2ldLmludHIgPyAnSScgOiAnICcsCisJCQkJIHRvcGEtPnRhYmxlW2ldLnN0b3AgPyAnUycgOiAnICcsCisJCQkJICoodTY0ICopJnRvcGEtPnRhYmxlW2ldKTsKKwkJCWlmICgocHRfY2FwX2dldChQVF9DQVBfdG9wYV9tdWx0aXBsZV9lbnRyaWVzKSAmJgorCQkJICAgICB0b3BhLT50YWJsZVtpXS5zdG9wKSB8fAorCQkJICAgIHRvcGEtPnRhYmxlW2ldLmVuZCkKKwkJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqCisgKiBwdF9idWZmZXJfYWR2YW5jZSgpIC0gYWR2YW5jZSB0byB0aGUgbmV4dCBvdXRwdXQgcmVnaW9uCisgKiBAYnVmOglQVCBidWZmZXIuCisgKgorICogQWR2YW5jZSB0aGUgY3VycmVudCBwb2ludGVycyBpbiB0aGUgYnVmZmVyIHRvIHRoZSBuZXh0IFRvUEEgZW50cnkuCisgKi8KK3N0YXRpYyB2b2lkIHB0X2J1ZmZlcl9hZHZhbmNlKHN0cnVjdCBwdF9idWZmZXIgKmJ1ZikKK3sKKwlidWYtPm91dHB1dF9vZmYgPSAwOworCWJ1Zi0+Y3VyX2lkeCsrOworCisJaWYgKGJ1Zi0+Y3VyX2lkeCA9PSBidWYtPmN1ci0+bGFzdCkgeworCQlpZiAoYnVmLT5jdXIgPT0gYnVmLT5sYXN0KQorCQkJYnVmLT5jdXIgPSBidWYtPmZpcnN0OworCQllbHNlCisJCQlidWYtPmN1ciA9IGxpc3RfZW50cnkoYnVmLT5jdXItPmxpc3QubmV4dCwgc3RydWN0IHRvcGEsCisJCQkJCSAgICAgIGxpc3QpOworCQlidWYtPmN1cl9pZHggPSAwOworCX0KK30KKworLyoqCisgKiBwdF91cGRhdGVfaGVhZCgpIC0gY2FsY3VsYXRlIGN1cnJlbnQgb2Zmc2V0cyBhbmQgc2l6ZXMKKyAqIEBwdDoJCVBlci1jcHUgcHQgY29udGV4dC4KKyAqCisgKiBVcGRhdGUgYnVmZmVyJ3MgY3VycmVudCB3cml0ZSBwb2ludGVyIHBvc2l0aW9uIGFuZCBkYXRhIHNpemUuCisgKi8KK3N0YXRpYyB2b2lkIHB0X3VwZGF0ZV9oZWFkKHN0cnVjdCBwdCAqcHQpCit7CisJc3RydWN0IHB0X2J1ZmZlciAqYnVmID0gcGVyZl9nZXRfYXV4KCZwdC0+aGFuZGxlKTsKKwl1NjQgdG9wYV9pZHgsIGJhc2UsIG9sZDsKKworCS8qIG9mZnNldCBvZiB0aGUgZmlyc3QgcmVnaW9uIGluIHRoaXMgdGFibGUgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGJ1ZiAqLworCWJhc2UgPSBidWYtPmN1ci0+b2Zmc2V0ICsgYnVmLT5vdXRwdXRfb2ZmOworCisJLyogb2Zmc2V0IG9mIHRoZSBjdXJyZW50IG91dHB1dCByZWdpb24gd2l0aGluIHRoaXMgdGFibGUgKi8KKwlmb3IgKHRvcGFfaWR4ID0gMDsgdG9wYV9pZHggPCBidWYtPmN1cl9pZHg7IHRvcGFfaWR4KyspCisJCWJhc2UgKz0gc2l6ZXMoYnVmLT5jdXItPnRhYmxlW3RvcGFfaWR4XS5zaXplKTsKKworCWlmIChidWYtPnNuYXBzaG90KSB7CisJCWxvY2FsX3NldCgmYnVmLT5kYXRhX3NpemUsIGJhc2UpOworCX0gZWxzZSB7CisJCW9sZCA9IChsb2NhbDY0X3hjaGcoJmJ1Zi0+aGVhZCwgYmFzZSkgJgorCQkgICAgICAgKChidWYtPm5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQpIC0gMSkpOworCQlpZiAoYmFzZSA8IG9sZCkKKwkJCWJhc2UgKz0gYnVmLT5ucl9wYWdlcyA8PCBQQUdFX1NISUZUOworCisJCWxvY2FsX2FkZChiYXNlIC0gb2xkLCAmYnVmLT5kYXRhX3NpemUpOworCX0KK30KKworLyoqCisgKiBwdF9idWZmZXJfcmVnaW9uKCkgLSBvYnRhaW4gY3VycmVudCBvdXRwdXQgcmVnaW9uJ3MgYWRkcmVzcworICogQGJ1ZjoJUFQgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCAqcHRfYnVmZmVyX3JlZ2lvbihzdHJ1Y3QgcHRfYnVmZmVyICpidWYpCit7CisJcmV0dXJuIHBoeXNfdG9fdmlydChidWYtPmN1ci0+dGFibGVbYnVmLT5jdXJfaWR4XS5iYXNlIDw8IFRPUEFfU0hJRlQpOworfQorCisvKioKKyAqIHB0X2J1ZmZlcl9yZWdpb25fc2l6ZSgpIC0gb2J0YWluIGN1cnJlbnQgb3V0cHV0IHJlZ2lvbidzIHNpemUKKyAqIEBidWY6CVBUIGJ1ZmZlci4KKyAqLworc3RhdGljIHNpemVfdCBwdF9idWZmZXJfcmVnaW9uX3NpemUoc3RydWN0IHB0X2J1ZmZlciAqYnVmKQoreworCXJldHVybiBzaXplcyhidWYtPmN1ci0+dGFibGVbYnVmLT5jdXJfaWR4XS5zaXplKTsKK30KKworLyoqCisgKiBwdF9oYW5kbGVfc3RhdHVzKCkgLSB0YWtlIGNhcmUgb2YgcG9zc2libGUgc3RhdHVzIGNvbmRpdGlvbnMKKyAqIEBwdDoJCVBlci1jcHUgcHQgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQgcHRfaGFuZGxlX3N0YXR1cyhzdHJ1Y3QgcHQgKnB0KQoreworCXN0cnVjdCBwdF9idWZmZXIgKmJ1ZiA9IHBlcmZfZ2V0X2F1eCgmcHQtPmhhbmRsZSk7CisJaW50IGFkdmFuY2UgPSAwOworCXU2NCBzdGF0dXM7CisKKwlyZG1zcmwoTVNSX0lBMzJfUlRJVF9TVEFUVVMsIHN0YXR1cyk7CisKKwlpZiAoc3RhdHVzICYgUlRJVF9TVEFUVVNfRVJST1IpIHsKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJUb1BBIEVSUk9SIGVuY291bnRlcmVkLCB0cnlpbmcgdG8gcmVjb3ZlclxuIik7CisJCXB0X3RvcGFfZHVtcChidWYpOworCQlzdGF0dXMgJj0gflJUSVRfU1RBVFVTX0VSUk9SOworCX0KKworCWlmIChzdGF0dXMgJiBSVElUX1NUQVRVU19TVE9QUEVEKSB7CisJCXN0YXR1cyAmPSB+UlRJVF9TVEFUVVNfU1RPUFBFRDsKKworCQkvKgorCQkgKiBPbiBzeXN0ZW1zIHRoYXQgb25seSBkbyBzaW5nbGUtZW50cnkgVG9QQSwgaGl0dGluZyBTVE9QCisJCSAqIG1lYW5zIHdlIGFyZSBhbHJlYWR5IGxvc2luZyBkYXRhOyBuZWVkIHRvIGxldCB0aGUgZGVjb2RlcgorCQkgKiBrbm93LgorCQkgKi8KKwkJaWYgKCFwdF9jYXBfZ2V0KFBUX0NBUF90b3BhX211bHRpcGxlX2VudHJpZXMpIHx8CisJCSAgICBidWYtPm91dHB1dF9vZmYgPT0gc2l6ZXMoVE9QQV9FTlRSWShidWYtPmN1ciwgYnVmLT5jdXJfaWR4KS0+c2l6ZSkpIHsKKwkJCWxvY2FsX2luYygmYnVmLT5sb3N0KTsKKwkJCWFkdmFuY2UrKzsKKwkJfQorCX0KKworCS8qCisJICogQWxzbyBvbiBzaW5nbGUtZW50cnkgVG9QQSBpbXBsZW1lbnRhdGlvbnMsIGludGVycnVwdCB3aWxsIGNvbWUKKwkgKiBiZWZvcmUgdGhlIG91dHB1dCByZWFjaGVzIGl0cyBvdXRwdXQgcmVnaW9uJ3MgYm91bmRhcnkuCisJICovCisJaWYgKCFwdF9jYXBfZ2V0KFBUX0NBUF90b3BhX211bHRpcGxlX2VudHJpZXMpICYmICFidWYtPnNuYXBzaG90ICYmCisJICAgIHB0X2J1ZmZlcl9yZWdpb25fc2l6ZShidWYpIC0gYnVmLT5vdXRwdXRfb2ZmIDw9IFRPUEFfUE1JX01BUkdJTikgeworCQl2b2lkICpoZWFkID0gcHRfYnVmZmVyX3JlZ2lvbihidWYpOworCisJCS8qIGV2ZXJ5dGhpbmcgd2l0aGluIHRoaXMgbWFyZ2luIG5lZWRzIHRvIGJlIHplcm9lZCBvdXQgKi8KKwkJbWVtc2V0KGhlYWQgKyBidWYtPm91dHB1dF9vZmYsIDAsCisJCSAgICAgICBwdF9idWZmZXJfcmVnaW9uX3NpemUoYnVmKSAtCisJCSAgICAgICBidWYtPm91dHB1dF9vZmYpOworCQlhZHZhbmNlKys7CisJfQorCisJaWYgKGFkdmFuY2UpCisJCXB0X2J1ZmZlcl9hZHZhbmNlKGJ1Zik7CisKKwl3cm1zcmwoTVNSX0lBMzJfUlRJVF9TVEFUVVMsIHN0YXR1cyk7Cit9CisKKy8qKgorICogcHRfcmVhZF9vZmZzZXQoKSAtIHRyYW5zbGF0ZSByZWdpc3RlcnMgaW50byBidWZmZXIgcG9pbnRlcnMKKyAqIEBidWY6CVBUIGJ1ZmZlci4KKyAqCisgKiBTZXQgYnVmZmVyJ3Mgb3V0cHV0IHBvaW50ZXJzIGZyb20gTVNSIHZhbHVlcy4KKyAqLworc3RhdGljIHZvaWQgcHRfcmVhZF9vZmZzZXQoc3RydWN0IHB0X2J1ZmZlciAqYnVmKQoreworCXU2NCBvZmZzZXQsIGJhc2VfdG9wYTsKKworCXJkbXNybChNU1JfSUEzMl9SVElUX09VVFBVVF9CQVNFLCBiYXNlX3RvcGEpOworCWJ1Zi0+Y3VyID0gcGh5c190b192aXJ0KGJhc2VfdG9wYSk7CisKKwlyZG1zcmwoTVNSX0lBMzJfUlRJVF9PVVRQVVRfTUFTSywgb2Zmc2V0KTsKKwkvKiBvZmZzZXQgd2l0aGluIGN1cnJlbnQgb3V0cHV0IHJlZ2lvbiAqLworCWJ1Zi0+b3V0cHV0X29mZiA9IG9mZnNldCA+PiAzMjsKKwkvKiBpbmRleCBvZiBjdXJyZW50IG91dHB1dCByZWdpb24gd2l0aGluIHRoaXMgdGFibGUgKi8KKwlidWYtPmN1cl9pZHggPSAob2Zmc2V0ICYgMHhmZmZmZmY4MCkgPj4gNzsKK30KKworLyoqCisgKiBwdF90b3BhX25leHRfZW50cnkoKSAtIG9idGFpbiBpbmRleCBvZiB0aGUgZmlyc3QgcGFnZSBpbiB0aGUgbmV4dCBUb1BBIGVudHJ5CisgKiBAYnVmOglQVCBidWZmZXIuCisgKiBAcGc6CQlQYWdlIG9mZnNldCBpbiB0aGUgYnVmZmVyLgorICoKKyAqIFdoZW4gYWR2YW5jaW5nIHRvIHRoZSBuZXh0IG91dHB1dCByZWdpb24gKFRvUEEgZW50cnkpLCBnaXZlbiBhIHBhZ2Ugb2Zmc2V0CisgKiBpbnRvIHRoZSBidWZmZXIsIHdlIG5lZWQgdG8gZmluZCB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBwYWdlIGluIHRoZSBuZXh0CisgKiByZWdpb24uCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcHRfdG9wYV9uZXh0X2VudHJ5KHN0cnVjdCBwdF9idWZmZXIgKmJ1ZiwgdW5zaWduZWQgaW50IHBnKQoreworCXN0cnVjdCB0b3BhX2VudHJ5ICp0ZSA9IGJ1Zi0+dG9wYV9pbmRleFtwZ107CisKKwkvKiBvbmUgcmVnaW9uICovCisJaWYgKGJ1Zi0+Zmlyc3QgPT0gYnVmLT5sYXN0ICYmIGJ1Zi0+Zmlyc3QtPmxhc3QgPT0gMSkKKwkJcmV0dXJuIHBnOworCisJZG8geworCQlwZysrOworCQlwZyAmPSBidWYtPm5yX3BhZ2VzIC0gMTsKKwl9IHdoaWxlIChidWYtPnRvcGFfaW5kZXhbcGddID09IHRlKTsKKworCXJldHVybiBwZzsKK30KKworLyoqCisgKiBwdF9idWZmZXJfcmVzZXRfbWFya2VycygpIC0gcGxhY2UgaW50ZXJydXB0IGFuZCBzdG9wIGJpdHMgaW4gdGhlIGJ1ZmZlcgorICogQGJ1ZjoJUFQgYnVmZmVyLgorICogQGhhbmRsZToJQ3VycmVudCBvdXRwdXQgaGFuZGxlLgorICoKKyAqIFBsYWNlIElOVCBhbmQgU1RPUCBtYXJrcyB0byBwcmV2ZW50IG92ZXJ3cml0aW5nIG9sZCBkYXRhIHRoYXQgdGhlIGNvbnN1bWVyCisgKiBoYXNuJ3QgeWV0IGNvbGxlY3RlZC4KKyAqLworc3RhdGljIGludCBwdF9idWZmZXJfcmVzZXRfbWFya2VycyhzdHJ1Y3QgcHRfYnVmZmVyICpidWYsCisJCQkJICAgc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlKQorCit7CisJdW5zaWduZWQgbG9uZyBpZHgsIG5wYWdlcywgZW5kOworCisJaWYgKGJ1Zi0+c25hcHNob3QpCisJCXJldHVybiAwOworCisJLyogY2FuJ3Qgc3RvcCBpbiB0aGUgbWlkZGxlIG9mIGFuIG91dHB1dCByZWdpb24gKi8KKwlpZiAoYnVmLT5vdXRwdXRfb2ZmICsgaGFuZGxlLT5zaXplICsgMSA8CisJICAgIHNpemVzKFRPUEFfRU5UUlkoYnVmLT5jdXIsIGJ1Zi0+Y3VyX2lkeCktPnNpemUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCisJLyogc2luZ2xlIGVudHJ5IFRvUEEgaXMgaGFuZGxlZCBieSBtYXJraW5nIGFsbCByZWdpb25zIFNUT1A9MSBJTlQ9MSAqLworCWlmICghcHRfY2FwX2dldChQVF9DQVBfdG9wYV9tdWx0aXBsZV9lbnRyaWVzKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBjbGVhciBTVE9QIGFuZCBJTlQgZnJvbSBjdXJyZW50IGVudHJ5ICovCisJYnVmLT50b3BhX2luZGV4W2J1Zi0+c3RvcF9wb3NdLT5zdG9wID0gMDsKKwlidWYtPnRvcGFfaW5kZXhbYnVmLT5pbnRyX3Bvc10tPmludHIgPSAwOworCisJaWYgKHB0X2NhcF9nZXQoUFRfQ0FQX3RvcGFfbXVsdGlwbGVfZW50cmllcykpIHsKKwkJbnBhZ2VzID0gKGhhbmRsZS0+c2l6ZSArIDEpID4+IFBBR0VfU0hJRlQ7CisJCWVuZCA9IChsb2NhbDY0X3JlYWQoJmJ1Zi0+aGVhZCkgPj4gUEFHRV9TSElGVCkgKyBucGFnZXM7CisJCS8qaWYgKGVuZCA+IGhhbmRsZS0+d2FrZXVwID4+IFBBR0VfU0hJRlQpCisJCSAgZW5kID0gaGFuZGxlLT53YWtldXAgPj4gUEFHRV9TSElGVDsqLworCQlpZHggPSBlbmQgJiAoYnVmLT5ucl9wYWdlcyAtIDEpOworCQlidWYtPnN0b3BfcG9zID0gaWR4OworCQlpZHggPSAobG9jYWw2NF9yZWFkKCZidWYtPmhlYWQpID4+IFBBR0VfU0hJRlQpICsgbnBhZ2VzIC0gMTsKKwkJaWR4ICY9IGJ1Zi0+bnJfcGFnZXMgLSAxOworCQlidWYtPmludHJfcG9zID0gaWR4OworCX0KKworCWJ1Zi0+dG9wYV9pbmRleFtidWYtPnN0b3BfcG9zXS0+c3RvcCA9IDE7CisJYnVmLT50b3BhX2luZGV4W2J1Zi0+aW50cl9wb3NdLT5pbnRyID0gMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHB0X2J1ZmZlcl9zZXR1cF90b3BhX2luZGV4KCkgLSBidWlsZCB0b3BhX2luZGV4W10gdGFibGUgb2YgcmVnaW9ucworICogQGJ1ZjoJUFQgYnVmZmVyLgorICoKKyAqIHRvcGFfaW5kZXhbXSByZWZlcmVuY2VzIG91dHB1dCByZWdpb25zIGluZGV4ZWQgYnkgb2Zmc2V0IGludG8gdGhlCisgKiBidWZmZXIgZm9yIHB1cnBvc2VzIG9mIHF1aWNrIHJldmVyc2UgbG9va3VwLgorICovCitzdGF0aWMgdm9pZCBwdF9idWZmZXJfc2V0dXBfdG9wYV9pbmRleChzdHJ1Y3QgcHRfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHRvcGEgKmN1ciA9IGJ1Zi0+Zmlyc3QsICpwcmV2ID0gYnVmLT5sYXN0OworCXN0cnVjdCB0b3BhX2VudHJ5ICp0ZV9jdXIgPSBUT1BBX0VOVFJZKGN1ciwgMCksCisJCSp0ZV9wcmV2ID0gVE9QQV9FTlRSWShwcmV2LCBwcmV2LT5sYXN0IC0gMSk7CisJaW50IHBnID0gMCwgaWR4ID0gMCwgbnRvcGEgPSAwOworCisJd2hpbGUgKHBnIDwgYnVmLT5ucl9wYWdlcykgeworCQlpbnQgdGlkeDsKKworCQkvKiBwYWdlcyB3aXRoaW4gb25lIHRvcGEgZW50cnkgKi8KKwkJZm9yICh0aWR4ID0gMDsgdGlkeCA8IDEgPDwgdGVfY3VyLT5zaXplOyB0aWR4KyssIHBnKyspCisJCQlidWYtPnRvcGFfaW5kZXhbcGddID0gdGVfcHJldjsKKworCQl0ZV9wcmV2ID0gdGVfY3VyOworCisJCWlmIChpZHggPT0gY3VyLT5sYXN0IC0gMSkgeworCQkJLyogYWR2YW5jZSB0byBuZXh0IHRvcGEgdGFibGUgKi8KKwkJCWlkeCA9IDA7CisJCQljdXIgPSBsaXN0X2VudHJ5KGN1ci0+bGlzdC5uZXh0LCBzdHJ1Y3QgdG9wYSwgbGlzdCk7CisJCQludG9wYSsrOworCQl9IGVsc2UKKwkJCWlkeCsrOworCQl0ZV9jdXIgPSBUT1BBX0VOVFJZKGN1ciwgaWR4KTsKKwl9CisKK30KKworLyoqCisgKiBwdF9idWZmZXJfcmVzZXRfb2Zmc2V0cygpIC0gYWRqdXN0IGJ1ZmZlcidzIHdyaXRlIHBvaW50ZXJzIGZyb20gYXV4X2hlYWQKKyAqIEBidWY6CVBUIGJ1ZmZlci4KKyAqIEBoZWFkOglXcml0ZSBwb2ludGVyIChhdXhfaGVhZCkgZnJvbSBBVVggYnVmZmVyLgorICoKKyAqIEZpbmQgdGhlIFRvUEEgdGFibGUgYW5kIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gZ2l2ZW4gQGhlYWQgYW5kIHNldCBidWZmZXIncworICogImN1cnJlbnQiIHBvaW50ZXJzIGFjY29yZGluZ2x5LgorICovCitzdGF0aWMgdm9pZCBwdF9idWZmZXJfcmVzZXRfb2Zmc2V0cyhzdHJ1Y3QgcHRfYnVmZmVyICpidWYsIHVuc2lnbmVkIGxvbmcgaGVhZCkKK3sKKwlpbnQgcGc7CisKKwlpZiAoYnVmLT5zbmFwc2hvdCkKKwkJaGVhZCAmPSAoYnVmLT5ucl9wYWdlcyA8PCBQQUdFX1NISUZUKSAtIDE7CisKKwlwZyA9IChoZWFkID4+IFBBR0VfU0hJRlQpICYgKGJ1Zi0+bnJfcGFnZXMgLSAxKTsKKwlwZyA9IHB0X3RvcGFfbmV4dF9lbnRyeShidWYsIHBnKTsKKworCWJ1Zi0+Y3VyID0gKHN0cnVjdCB0b3BhICopKCh1bnNpZ25lZCBsb25nKWJ1Zi0+dG9wYV9pbmRleFtwZ10gJiBQQUdFX01BU0spOworCWJ1Zi0+Y3VyX2lkeCA9ICgodW5zaWduZWQgbG9uZylidWYtPnRvcGFfaW5kZXhbcGddIC0KKwkJCSh1bnNpZ25lZCBsb25nKWJ1Zi0+Y3VyKSAvIHNpemVvZihzdHJ1Y3QgdG9wYV9lbnRyeSk7CisJYnVmLT5vdXRwdXRfb2ZmID0gaGVhZCAmIChzaXplcyhidWYtPmN1ci0+dGFibGVbYnVmLT5jdXJfaWR4XS5zaXplKSAtIDEpOworCisJbG9jYWw2NF9zZXQoJmJ1Zi0+aGVhZCwgaGVhZCk7CisJbG9jYWxfc2V0KCZidWYtPmRhdGFfc2l6ZSwgMCk7Cit9CisKKy8qKgorICogcHRfYnVmZmVyX2ZpbmlfdG9wYSgpIC0gZGVhbGxvY2F0ZSBUb1BBIHN0cnVjdHVyZSBvZiBhIGJ1ZmZlcgorICogQGJ1ZjoJUFQgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBwdF9idWZmZXJfZmluaV90b3BhKHN0cnVjdCBwdF9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdG9wYSAqdG9wYSwgKml0ZXI7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodG9wYSwgaXRlciwgJmJ1Zi0+dGFibGVzLCBsaXN0KSB7CisJCS8qCisJCSAqIHJpZ2h0IG5vdywgdGhpcyBpcyBpbiBmcmVlX2F1eCgpIHBhdGggb25seSwgc28KKwkJICogbm8gbmVlZCB0byB1bmxpbmsgdGhpcyB0YWJsZSBmcm9tIHRoZSBsaXN0CisJCSAqLworCQl0b3BhX2ZyZWUodG9wYSk7CisJfQorfQorCisvKioKKyAqIHB0X2J1ZmZlcl9pbml0X3RvcGEoKSAtIGluaXRpYWxpemUgVG9QQSB0YWJsZSBmb3IgcHQgYnVmZmVyCisgKiBAYnVmOglQVCBidWZmZXIuCisgKiBAc2l6ZToJVG90YWwgc2l6ZSBvZiBhbGwgcmVnaW9ucyB3aXRoaW4gdGhpcyBUb1BBLgorICogQGdmcDoJQWxsb2NhdGlvbiBmbGFncy4KKyAqLworc3RhdGljIGludCBwdF9idWZmZXJfaW5pdF90b3BhKHN0cnVjdCBwdF9idWZmZXIgKmJ1ZiwgdW5zaWduZWQgbG9uZyBucl9wYWdlcywKKwkJCSAgICAgICBnZnBfdCBnZnApCit7CisJc3RydWN0IHRvcGEgKnRvcGE7CisJaW50IGVycjsKKworCXRvcGEgPSB0b3BhX2FsbG9jKGJ1Zi0+Y3B1LCBnZnApOworCWlmICghdG9wYSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0b3BhX2luc2VydF90YWJsZShidWYsIHRvcGEpOworCisJd2hpbGUgKGJ1Zi0+bnJfcGFnZXMgPCBucl9wYWdlcykgeworCQllcnIgPSB0b3BhX2luc2VydF9wYWdlcyhidWYsIGdmcCk7CisJCWlmIChlcnIpIHsKKwkJCXB0X2J1ZmZlcl9maW5pX3RvcGEoYnVmKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCisJcHRfYnVmZmVyX3NldHVwX3RvcGFfaW5kZXgoYnVmKTsKKworCS8qIGxpbmsgbGFzdCB0YWJsZSB0byB0aGUgZmlyc3Qgb25lLCB1bmxlc3Mgd2UncmUgZG91YmxlIGJ1ZmZlcmluZyAqLworCWlmIChwdF9jYXBfZ2V0KFBUX0NBUF90b3BhX211bHRpcGxlX2VudHJpZXMpKSB7CisJCVRPUEFfRU5UUlkoYnVmLT5sYXN0LCAtMSktPmJhc2UgPSBidWYtPmZpcnN0LT5waHlzID4+IFRPUEFfU0hJRlQ7CisJCVRPUEFfRU5UUlkoYnVmLT5sYXN0LCAtMSktPmVuZCA9IDE7CisJfQorCisJcHRfdG9wYV9kdW1wKGJ1Zik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogcHRfYnVmZmVyX3NldHVwX2F1eCgpIC0gc2V0IHVwIHRvcGEgdGFibGVzIGZvciBhIFBUIGJ1ZmZlcgorICogQGNwdToJQ3B1IG9uIHdoaWNoIHRvIGFsbG9jYXRlLCAtMSBtZWFucyBjdXJyZW50LgorICogQHBhZ2VzOglBcnJheSBvZiBwb2ludGVycyB0byBidWZmZXIgcGFnZXMgcGFzc2VkIGZyb20gcGVyZiBjb3JlLgorICogQG5yX3BhZ2VzOglOdW1iZXIgb2YgcGFnZXMgaW4gdGhlIGJ1ZmZlci4KKyAqIEBzbmFwc2hvdDoJSWYgdGhpcyBpcyBhIHNuYXBzaG90L292ZXJ3cml0ZSBjb3VudGVyLgorICoKKyAqIFRoaXMgaXMgYSBwbXU6OnNldHVwX2F1eCBjYWxsYmFjayB0aGF0IHNldHMgdXAgVG9QQSB0YWJsZXMgYW5kIGFsbCB0aGUKKyAqIGJvb2trZWVwaW5nIGZvciBhbiBBVVggYnVmZmVyLgorICoKKyAqIFJldHVybjoJT3VyIHByaXZhdGUgUFQgYnVmZmVyIHN0cnVjdHVyZS4KKyAqLworc3RhdGljIHZvaWQgKgorcHRfYnVmZmVyX3NldHVwX2F1eChpbnQgY3B1LCB2b2lkICoqcGFnZXMsIGludCBucl9wYWdlcywgYm9vbCBzbmFwc2hvdCkKK3sKKwlzdHJ1Y3QgcHRfYnVmZmVyICpidWY7CisJaW50IG5vZGUsIHJldDsKKworCWlmICghbnJfcGFnZXMpCisJCXJldHVybiBOVUxMOworCisJaWYgKGNwdSA9PSAtMSkKKwkJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKKworCWJ1ZiA9IGt6YWxsb2Nfbm9kZShvZmZzZXRvZihzdHJ1Y3QgcHRfYnVmZmVyLCB0b3BhX2luZGV4W25yX3BhZ2VzXSksCisJCQkgICBHRlBfS0VSTkVMLCBub2RlKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIE5VTEw7CisKKwlidWYtPmNwdSA9IGNwdTsKKwlidWYtPnNuYXBzaG90ID0gc25hcHNob3Q7CisJYnVmLT5kYXRhX3BhZ2VzID0gcGFnZXM7CisKKwlJTklUX0xJU1RfSEVBRCgmYnVmLT50YWJsZXMpOworCisJcmV0ID0gcHRfYnVmZmVyX2luaXRfdG9wYShidWYsIG5yX3BhZ2VzLCBHRlBfS0VSTkVMKTsKKwlpZiAocmV0KSB7CisJCWtmcmVlKGJ1Zik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBidWY7Cit9CisKKy8qKgorICogcHRfYnVmZmVyX2ZyZWVfYXV4KCkgLSBwZXJmIEFVWCBkZWFsbG9jYXRpb24gcGF0aCBjYWxsYmFjaworICogQGRhdGE6CVBUIGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgcHRfYnVmZmVyX2ZyZWVfYXV4KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHB0X2J1ZmZlciAqYnVmID0gZGF0YTsKKworCXB0X2J1ZmZlcl9maW5pX3RvcGEoYnVmKTsKKwlrZnJlZShidWYpOworfQorCisvKioKKyAqIHB0X2J1ZmZlcl9pc19mdWxsKCkgLSBjaGVjayBpZiB0aGUgYnVmZmVyIGlzIGZ1bGwKKyAqIEBidWY6CVBUIGJ1ZmZlci4KKyAqIEBwdDoJCVBlci1jcHUgcHQgaGFuZGxlLgorICoKKyAqIElmIHRoZSB1c2VyIGhhc24ndCByZWFkIGRhdGEgZnJvbSB0aGUgb3V0cHV0IHJlZ2lvbiB0aGF0IGF1eF9oZWFkCisgKiBwb2ludHMgdG8sIHRoZSBidWZmZXIgaXMgY29uc2lkZXJlZCBmdWxsOiB0aGUgdXNlciBuZWVkcyB0byByZWFkIGF0CisgKiBsZWFzdCB0aGlzIHJlZ2lvbiBhbmQgdXBkYXRlIGF1eF90YWlsIHRvIHBvaW50IHBhc3QgaXQuCisgKi8KK3N0YXRpYyBib29sIHB0X2J1ZmZlcl9pc19mdWxsKHN0cnVjdCBwdF9idWZmZXIgKmJ1Ziwgc3RydWN0IHB0ICpwdCkKK3sKKwlpZiAoYnVmLT5zbmFwc2hvdCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKGxvY2FsX3JlYWQoJmJ1Zi0+ZGF0YV9zaXplKSA+PSBwdC0+aGFuZGxlLnNpemUpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIGludGVsX3B0X2ludGVycnVwdCgpIC0gUFQgUE1JIGhhbmRsZXIKKyAqLwordm9pZCBpbnRlbF9wdF9pbnRlcnJ1cHQodm9pZCkKK3sKKwlzdHJ1Y3QgcHQgKnB0ID0gdGhpc19jcHVfcHRyKCZwdF9jdHgpOworCXN0cnVjdCBwdF9idWZmZXIgKmJ1ZjsKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQgPSBwdC0+aGFuZGxlLmV2ZW50OworCisJLyoKKwkgKiBUaGVyZSBtYXkgYmUgYSBkYW5nbGluZyBQVCBiaXQgaW4gdGhlIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIKKwkgKiBhZnRlciBQVCBoYXMgYmVlbiBkaXNhYmxlZCBieSBwdF9ldmVudF9zdG9wKCkuIE1ha2Ugc3VyZSB3ZSBkb24ndAorCSAqIGRvIGFueXRoaW5nIChwYXJ0aWN1bGFybHksIHJlLWVuYWJsZSkgZm9yIHRoaXMgZXZlbnQgaGVyZS4KKwkgKi8KKwlpZiAoIUFDQ0VTU19PTkNFKHB0LT5oYW5kbGVfbm1pKSkKKwkJcmV0dXJuOworCisJcHRfY29uZmlnX3N0YXJ0KGZhbHNlKTsKKworCWlmICghZXZlbnQpCisJCXJldHVybjsKKworCWJ1ZiA9IHBlcmZfZ2V0X2F1eCgmcHQtPmhhbmRsZSk7CisJaWYgKCFidWYpCisJCXJldHVybjsKKworCXB0X3JlYWRfb2Zmc2V0KGJ1Zik7CisKKwlwdF9oYW5kbGVfc3RhdHVzKHB0KTsKKworCXB0X3VwZGF0ZV9oZWFkKHB0KTsKKworCXBlcmZfYXV4X291dHB1dF9lbmQoJnB0LT5oYW5kbGUsIGxvY2FsX3hjaGcoJmJ1Zi0+ZGF0YV9zaXplLCAwKSwKKwkJCSAgICBsb2NhbF94Y2hnKCZidWYtPmxvc3QsIDApKTsKKworCWlmICghZXZlbnQtPmh3LnN0YXRlKSB7CisJCWludCByZXQ7CisKKwkJYnVmID0gcGVyZl9hdXhfb3V0cHV0X2JlZ2luKCZwdC0+aGFuZGxlLCBldmVudCk7CisJCWlmICghYnVmKSB7CisJCQlldmVudC0+aHcuc3RhdGUgPSBQRVJGX0hFU19TVE9QUEVEOworCQkJcmV0dXJuOworCQl9CisKKwkJcHRfYnVmZmVyX3Jlc2V0X29mZnNldHMoYnVmLCBwdC0+aGFuZGxlLmhlYWQpOworCQlyZXQgPSBwdF9idWZmZXJfcmVzZXRfbWFya2VycyhidWYsICZwdC0+aGFuZGxlKTsKKwkJaWYgKHJldCkgeworCQkJcGVyZl9hdXhfb3V0cHV0X2VuZCgmcHQtPmhhbmRsZSwgMCwgdHJ1ZSk7CisJCQlyZXR1cm47CisJCX0KKworCQlwdF9jb25maWdfYnVmZmVyKGJ1Zi0+Y3VyLT50YWJsZSwgYnVmLT5jdXJfaWR4LAorCQkJCSBidWYtPm91dHB1dF9vZmYpOworCQl3cm1zcmwoTVNSX0lBMzJfUlRJVF9TVEFUVVMsIDApOworCQlwdF9jb25maWcoZXZlbnQpOworCX0KK30KKworLyoKKyAqIFBNVSBjYWxsYmFja3MKKyAqLworCitzdGF0aWMgdm9pZCBwdF9ldmVudF9zdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBtb2RlKQoreworCXN0cnVjdCBwdCAqcHQgPSB0aGlzX2NwdV9wdHIoJnB0X2N0eCk7CisJc3RydWN0IHB0X2J1ZmZlciAqYnVmID0gcGVyZl9nZXRfYXV4KCZwdC0+aGFuZGxlKTsKKworCWlmIChwdF9pc19ydW5uaW5nKCkgfHwgIWJ1ZiB8fCBwdF9idWZmZXJfaXNfZnVsbChidWYsIHB0KSkgeworCQlldmVudC0+aHcuc3RhdGUgPSBQRVJGX0hFU19TVE9QUEVEOworCQlyZXR1cm47CisJfQorCisJQUNDRVNTX09OQ0UocHQtPmhhbmRsZV9ubWkpID0gMTsKKwlldmVudC0+aHcuc3RhdGUgPSAwOworCisJcHRfY29uZmlnX2J1ZmZlcihidWYtPmN1ci0+dGFibGUsIGJ1Zi0+Y3VyX2lkeCwKKwkJCSBidWYtPm91dHB1dF9vZmYpOworCXdybXNybChNU1JfSUEzMl9SVElUX1NUQVRVUywgMCk7CisJcHRfY29uZmlnKGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQgcHRfZXZlbnRfc3RvcChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBtb2RlKQoreworCXN0cnVjdCBwdCAqcHQgPSB0aGlzX2NwdV9wdHIoJnB0X2N0eCk7CisKKwkvKgorCSAqIFByb3RlY3QgYWdhaW5zdCB0aGUgUE1JIHJhY2luZyB3aXRoIGRpc2FibGluZyB3cm1zciwKKwkgKiBzZWUgY29tbWVudCBpbiBpbnRlbF9wdF9pbnRlcnJ1cHQoKS4KKwkgKi8KKwlBQ0NFU1NfT05DRShwdC0+aGFuZGxlX25taSkgPSAwOworCXB0X2NvbmZpZ19zdGFydChmYWxzZSk7CisKKwlpZiAoZXZlbnQtPmh3LnN0YXRlID09IFBFUkZfSEVTX1NUT1BQRUQpCisJCXJldHVybjsKKworCWV2ZW50LT5ody5zdGF0ZSA9IFBFUkZfSEVTX1NUT1BQRUQ7CisKKwlpZiAobW9kZSAmIFBFUkZfRUZfVVBEQVRFKSB7CisJCXN0cnVjdCBwdCAqcHQgPSB0aGlzX2NwdV9wdHIoJnB0X2N0eCk7CisJCXN0cnVjdCBwdF9idWZmZXIgKmJ1ZiA9IHBlcmZfZ2V0X2F1eCgmcHQtPmhhbmRsZSk7CisKKwkJaWYgKCFidWYpCisJCQlyZXR1cm47CisKKwkJaWYgKFdBUk5fT05fT05DRShwdC0+aGFuZGxlLmV2ZW50ICE9IGV2ZW50KSkKKwkJCXJldHVybjsKKworCQlwdF9yZWFkX29mZnNldChidWYpOworCisJCXB0X2hhbmRsZV9zdGF0dXMocHQpOworCisJCXB0X3VwZGF0ZV9oZWFkKHB0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHB0X2V2ZW50X2RlbChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBtb2RlKQoreworCXN0cnVjdCBwdCAqcHQgPSB0aGlzX2NwdV9wdHIoJnB0X2N0eCk7CisJc3RydWN0IHB0X2J1ZmZlciAqYnVmOworCisJcHRfZXZlbnRfc3RvcChldmVudCwgUEVSRl9FRl9VUERBVEUpOworCisJYnVmID0gcGVyZl9nZXRfYXV4KCZwdC0+aGFuZGxlKTsKKworCWlmIChidWYpIHsKKwkJaWYgKGJ1Zi0+c25hcHNob3QpCisJCQlwdC0+aGFuZGxlLmhlYWQgPQorCQkJCWxvY2FsX3hjaGcoJmJ1Zi0+ZGF0YV9zaXplLAorCQkJCQkgICBidWYtPm5yX3BhZ2VzIDw8IFBBR0VfU0hJRlQpOworCQlwZXJmX2F1eF9vdXRwdXRfZW5kKCZwdC0+aGFuZGxlLCBsb2NhbF94Y2hnKCZidWYtPmRhdGFfc2l6ZSwgMCksCisJCQkJICAgIGxvY2FsX3hjaGcoJmJ1Zi0+bG9zdCwgMCkpOworCX0KK30KKworc3RhdGljIGludCBwdF9ldmVudF9hZGQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgcHRfYnVmZmVyICpidWY7CisJc3RydWN0IHB0ICpwdCA9IHRoaXNfY3B1X3B0cigmcHRfY3R4KTsKKwlzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKKwlpbnQgcmV0ID0gLUVCVVNZOworCisJaWYgKHB0LT5oYW5kbGUuZXZlbnQpCisJCWdvdG8gb3V0OworCisJYnVmID0gcGVyZl9hdXhfb3V0cHV0X2JlZ2luKCZwdC0+aGFuZGxlLCBldmVudCk7CisJaWYgKCFidWYpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcHRfYnVmZmVyX3Jlc2V0X29mZnNldHMoYnVmLCBwdC0+aGFuZGxlLmhlYWQpOworCWlmICghYnVmLT5zbmFwc2hvdCkgeworCQlyZXQgPSBwdF9idWZmZXJfcmVzZXRfbWFya2VycyhidWYsICZwdC0+aGFuZGxlKTsKKwkJaWYgKHJldCkgeworCQkJcGVyZl9hdXhfb3V0cHV0X2VuZCgmcHQtPmhhbmRsZSwgMCwgdHJ1ZSk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWlmIChtb2RlICYgUEVSRl9FRl9TVEFSVCkgeworCQlwdF9ldmVudF9zdGFydChldmVudCwgMCk7CisJCWlmIChod2MtPnN0YXRlID09IFBFUkZfSEVTX1NUT1BQRUQpIHsKKwkJCXB0X2V2ZW50X2RlbChldmVudCwgMCk7CisJCQlyZXQgPSAtRUJVU1k7CisJCX0KKwl9IGVsc2UgeworCQlod2MtPnN0YXRlID0gUEVSRl9IRVNfU1RPUFBFRDsKKwl9CisKKwlyZXQgPSAwOworb3V0OgorCisJaWYgKHJldCkKKwkJaHdjLT5zdGF0ZSA9IFBFUkZfSEVTX1NUT1BQRUQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwdF9ldmVudF9yZWFkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKK30KKworc3RhdGljIHZvaWQgcHRfZXZlbnRfZGVzdHJveShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJeDg2X2RlbF9leGNsdXNpdmUoeDg2X2xicl9leGNsdXNpdmVfcHQpOworfQorCitzdGF0aWMgaW50IHB0X2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCWlmIChldmVudC0+YXR0ci50eXBlICE9IHB0X3BtdS5wbXUudHlwZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAoIXB0X2V2ZW50X3ZhbGlkKGV2ZW50KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoeDg2X2FkZF9leGNsdXNpdmUoeDg2X2xicl9leGNsdXNpdmVfcHQpKQorCQlyZXR1cm4gLUVCVVNZOworCisJZXZlbnQtPmRlc3Ryb3kgPSBwdF9ldmVudF9kZXN0cm95OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHB0X2luaXQodm9pZCkKK3sKKwlpbnQgcmV0LCBjcHUsIHByaW9yX3dhcm4gPSAwOworCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgdG9wYSkgPiBQQUdFX1NJWkUpOworCWdldF9vbmxpbmVfY3B1cygpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCXU2NCBjdGw7CisKKwkJcmV0ID0gcmRtc3JsX3NhZmVfb25fY3B1KGNwdSwgTVNSX0lBMzJfUlRJVF9DVEwsICZjdGwpOworCQlpZiAoIXJldCAmJiAoY3RsICYgUlRJVF9DVExfVFJBQ0VFTikpCisJCQlwcmlvcl93YXJuKys7CisJfQorCXB1dF9vbmxpbmVfY3B1cygpOworCisJaWYgKHByaW9yX3dhcm4pIHsKKwkJeDg2X2FkZF9leGNsdXNpdmUoeDg2X2xicl9leGNsdXNpdmVfcHQpOworCQlwcl93YXJuKCJQVCBpcyBlbmFibGVkIGF0IGJvb3QgdGltZSwgZG9pbmcgbm90aGluZ1xuIik7CisKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXQgPSBwdF9wbXVfaHdfaW5pdCgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIXB0X2NhcF9nZXQoUFRfQ0FQX3RvcGFfb3V0cHV0KSkgeworCQlwcl93YXJuKCJUb1BBIG91dHB1dCBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgQ1BVXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCFwdF9jYXBfZ2V0KFBUX0NBUF90b3BhX211bHRpcGxlX2VudHJpZXMpKQorCQlwdF9wbXUucG11LmNhcGFiaWxpdGllcyA9CisJCQlQRVJGX1BNVV9DQVBfQVVYX05PX1NHIHwgUEVSRl9QTVVfQ0FQX0FVWF9TV19ET1VCTEVCVUY7CisKKwlwdF9wbXUucG11LmNhcGFiaWxpdGllcwl8PSBQRVJGX1BNVV9DQVBfRVhDTFVTSVZFIHwgUEVSRl9QTVVfQ0FQX0lUUkFDRTsKKwlwdF9wbXUucG11LmF0dHJfZ3JvdXBzCT0gcHRfYXR0cl9ncm91cHM7CisJcHRfcG11LnBtdS50YXNrX2N0eF9ucgk9IHBlcmZfc3dfY29udGV4dDsKKwlwdF9wbXUucG11LmV2ZW50X2luaXQJPSBwdF9ldmVudF9pbml0OworCXB0X3BtdS5wbXUuYWRkCQk9IHB0X2V2ZW50X2FkZDsKKwlwdF9wbXUucG11LmRlbAkJPSBwdF9ldmVudF9kZWw7CisJcHRfcG11LnBtdS5zdGFydAk9IHB0X2V2ZW50X3N0YXJ0OworCXB0X3BtdS5wbXUuc3RvcAkJPSBwdF9ldmVudF9zdG9wOworCXB0X3BtdS5wbXUucmVhZAkJPSBwdF9ldmVudF9yZWFkOworCXB0X3BtdS5wbXUuc2V0dXBfYXV4CT0gcHRfYnVmZmVyX3NldHVwX2F1eDsKKwlwdF9wbXUucG11LmZyZWVfYXV4CT0gcHRfYnVmZmVyX2ZyZWVfYXV4OworCXJldCA9IHBlcmZfcG11X3JlZ2lzdGVyKCZwdF9wbXUucG11LCAiaW50ZWxfcHQiLCAtMSk7CisKKwlyZXR1cm4gcmV0OworfQorCittb2R1bGVfaW5pdChwdF9pbml0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF91bmNvcmVfc25iZXAuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF91bmNvcmVfc25iZXAuYwppbmRleCAyMWFmNjE0OWUuLjEyZDk1NDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF91bmNvcmVfc25iZXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWxfdW5jb3JlX3NuYmVwLmMKQEAgLTExMzIsOCArMTEzMiw3IEBACiAJCX0KIAl9CiAKLQlpZiAodWJveF9kZXYpCi0JCXBjaV9kZXZfcHV0KHVib3hfZGV2KTsKKwlwY2lfZGV2X3B1dCh1Ym94X2Rldik7CiAKIAlyZXR1cm4gZXJyID8gcGNpYmlvc19lcnJfdG9fZXJybm8oZXJyKSA6IDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3NjYXR0ZXJlZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9zY2F0dGVyZWQuYwppbmRleCA2MDYzOTA5Li4zZDQyM2ExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3NjYXR0ZXJlZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvc2NhdHRlcmVkLmMKQEAgLTQxLDYgKzQxLDcgQEAKIAkJeyBYODZfRkVBVFVSRV9IV1BfQUNUX1dJTkRPVywJQ1JfRUFYLCA5LCAweDAwMDAwMDA2LCAwIH0sCiAJCXsgWDg2X0ZFQVRVUkVfSFdQX0VQUCwJCUNSX0VBWCwxMCwgMHgwMDAwMDAwNiwgMCB9LAogCQl7IFg4Nl9GRUFUVVJFX0hXUF9QS0dfUkVRLAlDUl9FQVgsMTEsIDB4MDAwMDAwMDYsIDAgfSwKKwkJeyBYODZfRkVBVFVSRV9JTlRFTF9QVCwJCUNSX0VCWCwyNSwgMHgwMDAwMDAwNywgMCB9LAogCQl7IFg4Nl9GRUFUVVJFX0FQRVJGTVBFUkYsCUNSX0VDWCwgMCwgMHgwMDAwMDAwNiwgMCB9LAogCQl7IFg4Nl9GRUFUVVJFX0VQQiwJCUNSX0VDWCwgMywgMHgwMDAwMDAwNiwgMCB9LAogCQl7IFg4Nl9GRUFUVVJFX0hXX1BTVEFURSwJQ1JfRURYLCA3LCAweDgwMDAwMDA3LCAwIH0sCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3Jhc2guYyBiL2FyY2gveDg2L2tlcm5lbC9jcmFzaC5jCmluZGV4IGFjZWIyZjkuLmM3NmQzZTMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcmFzaC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcmFzaC5jCkBAIC0xMDUsNyArMTA1LDcgQEAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJc3RydWN0IHB0X3JlZ3MgZml4ZWRfcmVnczsKIAotCWlmICghdXNlcl9tb2RlX3ZtKHJlZ3MpKSB7CisJaWYgKCF1c2VyX21vZGUocmVncykpIHsKIAkJY3Jhc2hfZml4dXBfc3NfZXNwKCZmaXhlZF9yZWdzLCByZWdzKTsKIAkJcmVncyA9ICZmaXhlZF9yZWdzOwogCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kZXZpY2V0cmVlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZGV2aWNldHJlZS5jCmluZGV4IDNkMzUwMzMuLjYzNjdhNzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kZXZpY2V0cmVlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2RldmljZXRyZWUuYwpAQCAtMjg2LDEzICsyODYsMTMgQEAKIAlpbml0aWFsX2Jvb3RfcGFyYW1zID0gZHQgPSBlYXJseV9tZW1yZW1hcChpbml0aWFsX2R0YiwgbWFwX2xlbik7CiAJc2l6ZSA9IG9mX2dldF9mbGF0X2R0X3NpemUoKTsKIAlpZiAobWFwX2xlbiA8IHNpemUpIHsKLQkJZWFybHlfaW91bm1hcChkdCwgbWFwX2xlbik7CisJCWVhcmx5X21lbXVubWFwKGR0LCBtYXBfbGVuKTsKIAkJaW5pdGlhbF9ib290X3BhcmFtcyA9IGR0ID0gZWFybHlfbWVtcmVtYXAoaW5pdGlhbF9kdGIsIHNpemUpOwogCQltYXBfbGVuID0gc2l6ZTsKIAl9CiAKIAl1bmZsYXR0ZW5fYW5kX2NvcHlfZGV2aWNlX3RyZWUoKTsKLQllYXJseV9pb3VubWFwKGR0LCBtYXBfbGVuKTsKKwllYXJseV9tZW11bm1hcChkdCwgbWFwX2xlbik7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHg4Nl9mbGF0dHJlZV9nZXRfY29uZmlnKHZvaWQpIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFjay5jCmluZGV4IGNmM2RmMWQuLjljMzBhY2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmMKQEAgLTI1LDEwICsyNSwxMiBAQAogaW50IGtzdGFja19kZXB0aF90b19wcmludCA9IDMgKiBTVEFDS1NMT1RTX1BFUl9MSU5FOwogc3RhdGljIGludCBkaWVfY291bnRlcjsKIAotc3RhdGljIHZvaWQgcHJpbnRrX3N0YWNrX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgcmVsaWFibGUpCitzdGF0aWMgdm9pZCBwcmludGtfc3RhY2tfYWRkcmVzcyh1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCByZWxpYWJsZSwKKwkJdm9pZCAqZGF0YSkKIHsKLQlwcl9jb250KCIgWzwlcD5dICVzJXBCXG4iLAotCQkodm9pZCAqKWFkZHJlc3MsIHJlbGlhYmxlID8gIiIgOiAiPyAiLCAodm9pZCAqKWFkZHJlc3MpOworCXByaW50aygiJXMgWzwlcD5dICVzJXBCXG4iLAorCQkoY2hhciAqKWRhdGEsICh2b2lkICopYWRkcmVzcywgcmVsaWFibGUgPyAiIiA6ICI/ICIsCisJCSh2b2lkICopYWRkcmVzcyk7CiB9CiAKIHZvaWQgcHJpbnRrX2FkZHJlc3ModW5zaWduZWQgbG9uZyBhZGRyZXNzKQpAQCAtMTU1LDggKzE1Nyw3IEBACiBzdGF0aWMgdm9pZCBwcmludF90cmFjZV9hZGRyZXNzKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHJlbGlhYmxlKQogewogCXRvdWNoX25taV93YXRjaGRvZygpOwotCXByaW50ayhkYXRhKTsKLQlwcmludGtfc3RhY2tfYWRkcmVzcyhhZGRyLCByZWxpYWJsZSk7CisJcHJpbnRrX3N0YWNrX2FkZHJlc3MoYWRkciwgcmVsaWFibGUsIGRhdGEpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHN0YWNrdHJhY2Vfb3BzIHByaW50X3RyYWNlX29wcyA9IHsKQEAgLTI3OCw3ICsyNzksNyBAQAogCXByaW50X21vZHVsZXMoKTsKIAlzaG93X3JlZ3MocmVncyk7CiAjaWZkZWYgQ09ORklHX1g4Nl8zMgotCWlmICh1c2VyX21vZGVfdm0ocmVncykpIHsKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CiAJCXNwID0gcmVncy0+c3A7CiAJCXNzID0gcmVncy0+c3MgJiAweGZmZmY7CiAJfSBlbHNlIHsKQEAgLTMwNyw3ICszMDgsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBvb3BzX2JlZ2luKCk7CiAJaW50IHNpZyA9IFNJR1NFR1Y7CiAKLQlpZiAoIXVzZXJfbW9kZV92bShyZWdzKSkKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkKIAkJcmVwb3J0X2J1ZyhyZWdzLT5pcCwgcmVncyk7CiAKIAlpZiAoX19kaWUoc3RyLCByZWdzLCBlcnIpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jCmluZGV4IDVhYmQ0Y2QuLjQ2NGZmZDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMKQEAgLTEwOCw5ICsxMDgsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwga3N0YWNrX2RlcHRoX3RvX3ByaW50OyBpKyspIHsKIAkJaWYgKGtzdGFja19lbmQoc3RhY2spKQogCQkJYnJlYWs7Ci0JCWlmIChpICYmICgoaSAlIFNUQUNLU0xPVFNfUEVSX0xJTkUpID09IDApKQotCQkJcHJfY29udCgiXG4iKTsKLQkJcHJfY29udCgiICUwOGx4IiwgKnN0YWNrKyspOworCQlpZiAoKGkgJSBTVEFDS1NMT1RTX1BFUl9MSU5FKSA9PSAwKSB7CisJCQlpZiAoaSAhPSAwKQorCQkJCXByX2NvbnQoIlxuIik7CisJCQlwcmludGsoIiVzICUwOGx4IiwgbG9nX2x2bCwgKnN0YWNrKyspOworCQl9IGVsc2UKKwkJCXByX2NvbnQoIiAlMDhseCIsICpzdGFjaysrKTsKIAkJdG91Y2hfbm1pX3dhdGNoZG9nKCk7CiAJfQogCXByX2NvbnQoIlxuIik7CkBAIC0xMjMsMTMgKzEyNiwxMyBAQAogCWludCBpOwogCiAJc2hvd19yZWdzX3ByaW50X2luZm8oS0VSTl9FTUVSRyk7Ci0JX19zaG93X3JlZ3MocmVncywgIXVzZXJfbW9kZV92bShyZWdzKSk7CisJX19zaG93X3JlZ3MocmVncywgIXVzZXJfbW9kZShyZWdzKSk7CiAKIAkvKgogCSAqIFdoZW4gaW4ta2VybmVsLCB3ZSBhbHNvIHByaW50IG91dCB0aGUgc3RhY2sgYW5kIGNvZGUgYXQgdGhlCiAJICogdGltZSBvZiB0aGUgZmF1bHQuLgogCSAqLwotCWlmICghdXNlcl9tb2RlX3ZtKHJlZ3MpKSB7CisJaWYgKCF1c2VyX21vZGUocmVncykpIHsKIAkJdW5zaWduZWQgaW50IGNvZGVfcHJvbG9ndWUgPSBjb2RlX2J5dGVzICogNDMgLyA2NDsKIAkJdW5zaWduZWQgaW50IGNvZGVfbGVuID0gY29kZV9ieXRlczsKIAkJdW5zaWduZWQgY2hhciBjOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCmluZGV4IGZmODZmMTkuLjVmMWM2MjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKQEAgLTI4MCwxMiArMjgwLDE1IEBACiAJCQkJcHJfY29udCgiIDxFT0k+ICIpOwogCQkJfQogCQl9IGVsc2UgewotCQlpZiAoKChsb25nKSBzdGFjayAmIChUSFJFQURfU0laRS0xKSkgPT0gMCkKKwkJaWYgKGtzdGFja19lbmQoc3RhY2spKQogCQkJYnJlYWs7CiAJCX0KLQkJaWYgKGkgJiYgKChpICUgU1RBQ0tTTE9UU19QRVJfTElORSkgPT0gMCkpCi0JCQlwcl9jb250KCJcbiIpOwotCQlwcl9jb250KCIgJTAxNmx4IiwgKnN0YWNrKyspOworCQlpZiAoKGkgJSBTVEFDS1NMT1RTX1BFUl9MSU5FKSA9PSAwKSB7CisJCQlpZiAoaSAhPSAwKQorCQkJCXByX2NvbnQoIlxuIik7CisJCQlwcmludGsoIiVzICUwMTZseCIsIGxvZ19sdmwsICpzdGFjaysrKTsKKwkJfSBlbHNlCisJCQlwcl9jb250KCIgJTAxNmx4IiwgKnN0YWNrKyspOwogCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKIAl9CiAJcHJlZW1wdF9lbmFibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lODIwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCmluZGV4IDQ2MjAxZGUuLjdkNDZiYjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2U4MjAuYwpAQCAtNjYxLDcgKzY2MSw3IEBACiAJZXh0bWFwID0gKHN0cnVjdCBlODIwZW50cnkgKikoc2RhdGEtPmRhdGEpOwogCV9fYXBwZW5kX2U4MjBfbWFwKGV4dG1hcCwgZW50cmllcyk7CiAJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC5tYXAsIEFSUkFZX1NJWkUoZTgyMC5tYXApLCAmZTgyMC5ucl9tYXApOwotCWVhcmx5X2lvdW5tYXAoc2RhdGEsIGRhdGFfbGVuKTsKKwllYXJseV9tZW11bm1hcChzZGF0YSwgZGF0YV9sZW4pOwogCXByaW50ayhLRVJOX0lORk8gImU4MjA6IGV4dGVuZGVkIHBoeXNpY2FsIFJBTSBtYXA6XG4iKTsKIAllODIwX3ByaW50X21hcCgiZXh0ZW5kZWQiKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lYXJseV9wcmludGsuYyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseV9wcmludGsuYwppbmRleCBhNjI1MzZhLi40OWZmNTVlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHlfcHJpbnRrLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2Vhcmx5X3ByaW50ay5jCkBAIC05NSwyMCArOTUsNiBAQAogI2RlZmluZSBETEwgICAgICAgICAgICAgMCAgICAgICAvKiAgRGl2aXNvciBMYXRjaCBMb3cgICAgICAgICAqLwogI2RlZmluZSBETEggICAgICAgICAgICAgMSAgICAgICAvKiAgRGl2aXNvciBsYXRjaCBIaWdoICAgICAgICAqLwogCi1zdGF0aWMgdm9pZCBtZW0zMl9zZXJpYWxfb3V0KHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG9mZnNldCwgaW50IHZhbHVlKQotewotCXVpbnQzMl90ICp2YWRkciA9ICh1aW50MzJfdCAqKWFkZHI7Ci0JLyogc2hpZnQgaW1wbGllZCBieSBwb2ludGVyIHR5cGUgKi8KLQl3cml0ZWwodmFsdWUsIHZhZGRyICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBtZW0zMl9zZXJpYWxfaW4odW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgb2Zmc2V0KQotewotCXVpbnQzMl90ICp2YWRkciA9ICh1aW50MzJfdCAqKWFkZHI7Ci0JLyogc2hpZnQgaW1wbGllZCBieSBwb2ludGVyIHR5cGUgKi8KLQlyZXR1cm4gcmVhZGwodmFkZHIgKyBvZmZzZXQpOwotfQotCiBzdGF0aWMgdW5zaWduZWQgaW50IGlvX3NlcmlhbF9pbih1bnNpZ25lZCBsb25nIGFkZHIsIGludCBvZmZzZXQpCiB7CiAJcmV0dXJuIGluYihhZGRyICsgb2Zmc2V0KTsKQEAgLTIwNSw2ICsxOTEsMjAgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QQ0kKK3N0YXRpYyB2b2lkIG1lbTMyX3NlcmlhbF9vdXQodW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJdTMyICp2YWRkciA9ICh1MzIgKilhZGRyOworCS8qIHNoaWZ0IGltcGxpZWQgYnkgcG9pbnRlciB0eXBlICovCisJd3JpdGVsKHZhbHVlLCB2YWRkciArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWVtMzJfc2VyaWFsX2luKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG9mZnNldCkKK3sKKwl1MzIgKnZhZGRyID0gKHUzMiAqKWFkZHI7CisJLyogc2hpZnQgaW1wbGllZCBieSBwb2ludGVyIHR5cGUgKi8KKwlyZXR1cm4gcmVhZGwodmFkZHIgKyBvZmZzZXQpOworfQorCiAvKgogICogZWFybHlfcGNpX3NlcmlhbF9pbml0KCkKICAqCkBAIC0yMTcsOCArMjE3LDggQEAKIAl1bnNpZ25lZCBkaXZpc29yOwogCXVuc2lnbmVkIGxvbmcgYmF1ZCA9IERFRkFVTFRfQkFVRDsKIAl1OCBidXMsIHNsb3QsIGZ1bmM7Ci0JdWludDMyX3QgY2xhc3Njb2RlLCBiYXIwOwotCXVpbnQxNl90IGNtZHJlZzsKKwl1MzIgY2xhc3Njb2RlLCBiYXIwOworCXUxNiBjbWRyZWc7CiAJY2hhciAqZTsKIAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCmluZGV4IDMxZTJkNWIuLjFjMzA5NzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lbnRyeV8zMi5TCkBAIC0zOTUsMTAgKzM5NSwxMyBAQAogCS8qQ0ZJX1JFTF9PRkZTRVQgY3MsIDAqLwogCS8qCiAJICogUHVzaCBjdXJyZW50X3RocmVhZF9pbmZvKCktPnN5c2VudGVyX3JldHVybiB0byB0aGUgc3RhY2suCi0JICogQSB0aW55IGJpdCBvZiBvZmZzZXQgZml4dXAgaXMgbmVjZXNzYXJ5IC0gNCo0IG1lYW5zIHRoZSA0IHdvcmRzCi0JICogcHVzaGVkIGFib3ZlOyArOCBjb3JyZXNwb25kcyB0byBjb3B5X3RocmVhZCdzIGVzcDAgc2V0dGluZy4KKwkgKiBBIHRpbnkgYml0IG9mIG9mZnNldCBmaXh1cCBpcyBuZWNlc3Nhcnk6IFRJX3N5c2VudGVyX3JldHVybgorCSAqIGlzIHJlbGF0aXZlIHRvIHRocmVhZF9pbmZvLCB3aGljaCBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZQorCSAqIGtlcm5lbCBzdGFjayBwYWdlLiAgNCo0IG1lYW5zIHRoZSA0IHdvcmRzIHB1c2hlZCBhYm92ZTsKKwkgKiBUT1BfT0ZfS0VSTkVMX1NUQUNLX1BBRERJTkcgdGFrZXMgdXMgdG8gdGhlIHRvcCBvZiB0aGUgc3RhY2s7CisJICogYW5kIFRIUkVBRF9TSVpFIHRha2VzIHVzIHRvIHRoZSBib3R0b20uCiAJICovCi0JcHVzaGxfY2ZpICgoVElfc3lzZW50ZXJfcmV0dXJuKS1USFJFQURfU0laRSs4KzQqNCkoJWVzcCkKKwlwdXNobF9jZmkgKChUSV9zeXNlbnRlcl9yZXR1cm4pIC0gVEhSRUFEX1NJWkUgKyBUT1BfT0ZfS0VSTkVMX1NUQUNLX1BBRERJTkcgKyA0KjQpKCVlc3ApCiAJQ0ZJX1JFTF9PRkZTRVQgZWlwLCAwCiAKIAlwdXNobF9jZmkgJWVheApAQCAtNDMyLDcgKzQzNSw3IEBACiAJVFJBQ0VfSVJRU19PRkYKIAltb3ZsIFRJX2ZsYWdzKCVlYnApLCAlZWN4CiAJdGVzdGwgJF9USUZfQUxMV09SS19NQVNLLCAlZWN4Ci0Jam5lIHN5c2V4aXRfYXVkaXQKKwlqbnogc3lzZXhpdF9hdWRpdAogc3lzZW50ZXJfZXhpdDoKIC8qIGlmIHNvbWV0aGluZyBtb2RpZmllcyByZWdpc3RlcnMgaXQgbXVzdCBhbHNvIGRpc2FibGUgc3lzZXhpdCAqLwogCW1vdmwgUFRfRUlQKCVlc3ApLCAlZWR4CkBAIC00NjAsNyArNDYzLDcgQEAKIAogc3lzZXhpdF9hdWRpdDoKIAl0ZXN0bCAkKF9USUZfQUxMV09SS19NQVNLICYgfl9USUZfU1lTQ0FMTF9BVURJVCksICVlY3gKLQlqbmUgc3lzY2FsbF9leGl0X3dvcmsKKwlqbnogc3lzY2FsbF9leGl0X3dvcmsKIAlUUkFDRV9JUlFTX09OCiAJRU5BQkxFX0lOVEVSUlVQVFMoQ0xCUl9BTlkpCiAJbW92bCAlZWF4LCVlZHgJCS8qIHNlY29uZCBhcmcsIHN5c2NhbGwgcmV0dXJuIHZhbHVlICovCkBAIC00NzIsNyArNDc1LDcgQEAKIAlUUkFDRV9JUlFTX09GRgogCW1vdmwgVElfZmxhZ3MoJWVicCksICVlY3gKIAl0ZXN0bCAkKF9USUZfQUxMV09SS19NQVNLICYgfl9USUZfU1lTQ0FMTF9BVURJVCksICVlY3gKLQlqbmUgc3lzY2FsbF9leGl0X3dvcmsKKwlqbnogc3lzY2FsbF9leGl0X3dvcmsKIAltb3ZsIFBUX0VBWCglZXNwKSwlZWF4CS8qIHJlbG9hZCBzeXNjYWxsIHJldHVybiB2YWx1ZSAqLwogCWptcCBzeXNlbnRlcl9leGl0CiAjZW5kaWYKQEAgLTUxMCw3ICs1MTMsNyBAQAogCVRSQUNFX0lSUVNfT0ZGCiAJbW92bCBUSV9mbGFncyglZWJwKSwgJWVjeAogCXRlc3RsICRfVElGX0FMTFdPUktfTUFTSywgJWVjeAkjIGN1cnJlbnQtPndvcmsKLQlqbmUgc3lzY2FsbF9leGl0X3dvcmsKKwlqbnogc3lzY2FsbF9leGl0X3dvcmsKIAogcmVzdG9yZV9hbGw6CiAJVFJBQ0VfSVJRU19JUkVUCkBAIC02MTIsNyArNjE1LDcgQEAKICNpZmRlZiBDT05GSUdfVk04NgogCXRlc3RsICRYODZfRUZMQUdTX1ZNLCBQVF9FRkxBR1MoJWVzcCkKIAltb3ZsICVlc3AsICVlYXgKLQlqbmUgd29ya19ub3RpZnlzaWdfdjg2CQkjIHJldHVybmluZyB0byBrZXJuZWwtc3BhY2Ugb3IKKwlqbnogd29ya19ub3RpZnlzaWdfdjg2CQkjIHJldHVybmluZyB0byBrZXJuZWwtc3BhY2Ugb3IKIAkJCQkJIyB2bTg2LXNwYWNlCiAxOgogI2Vsc2UKQEAgLTcyMCw0MyArNzIzLDIyIEBACiAuZW5kbQogCiAvKgotICogQnVpbGQgdGhlIGVudHJ5IHN0dWJzIGFuZCBwb2ludGVyIHRhYmxlIHdpdGggc29tZSBhc3NlbWJsZXIgbWFnaWMuCi0gKiBXZSBwYWNrIDcgc3R1YnMgaW50byBhIHNpbmdsZSAzMi1ieXRlIGNodW5rLCB3aGljaCB3aWxsIGZpdCBpbiBhCi0gKiBzaW5nbGUgY2FjaGUgbGluZSBvbiBhbGwgbW9kZXJuIHg4NiBpbXBsZW1lbnRhdGlvbnMuCisgKiBCdWlsZCB0aGUgZW50cnkgc3R1YnMgd2l0aCBzb21lIGFzc2VtYmxlciBtYWdpYy4KKyAqIFdlIHBhY2sgMSBzdHViIGludG8gZXZlcnkgOC1ieXRlIGJsb2NrLgogICovCi0uc2VjdGlvbiAuaW5pdC5yb2RhdGEsImEiCi1FTlRSWShpbnRlcnJ1cHQpCi0uc2VjdGlvbiAuZW50cnkudGV4dCwgImF4IgotCS5wMmFsaWduIDUKLQkucDJhbGlnbiBDT05GSUdfWDg2X0wxX0NBQ0hFX1NISUZUCisJLmFsaWduIDgKIEVOVFJZKGlycV9lbnRyaWVzX3N0YXJ0KQogCVJJTkcwX0lOVF9GUkFNRQotdmVjdG9yPUZJUlNUX0VYVEVSTkFMX1ZFQ1RPUgotLnJlcHQgKEZJUlNUX1NZU1RFTV9WRUNUT1ItRklSU1RfRVhURVJOQUxfVkVDVE9SKzYpLzcKLQkuYmFsaWduIDMyCi0gIC5yZXB0CTcKLSAgICAuaWYgdmVjdG9yIDwgRklSU1RfU1lTVEVNX1ZFQ1RPUgotICAgICAgLmlmIHZlY3RvciA8PiBGSVJTVF9FWFRFUk5BTF9WRUNUT1IKKyAgICB2ZWN0b3I9RklSU1RfRVhURVJOQUxfVkVDVE9SCisgICAgLnJlcHQgKEZJUlNUX1NZU1RFTV9WRUNUT1IgLSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IpCisJcHVzaGxfY2ZpICQofnZlY3RvcisweDgwKQkvKiBOb3RlOiBhbHdheXMgaW4gc2lnbmVkIGJ5dGUgcmFuZ2UgKi8KKyAgICB2ZWN0b3I9dmVjdG9yKzEKKwlqbXAJY29tbW9uX2ludGVycnVwdAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtNAotICAgICAgLmVuZGlmCi0xOglwdXNobF9jZmkgJCh+dmVjdG9yKzB4ODApCS8qIE5vdGU6IGFsd2F5cyBpbiBzaWduZWQgYnl0ZSByYW5nZSAqLwotICAgICAgLmlmICgodmVjdG9yLUZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiklNykgPD4gNgotCWptcCAyZgotICAgICAgLmVuZGlmCi0gICAgICAucHJldmlvdXMKLQkubG9uZyAxYgotICAgICAgLnNlY3Rpb24gLmVudHJ5LnRleHQsICJheCIKLXZlY3Rvcj12ZWN0b3IrMQotICAgIC5lbmRpZgotICAuZW5kcgotMjoJam1wIGNvbW1vbl9pbnRlcnJ1cHQKLS5lbmRyCisJLmFsaWduCTgKKyAgICAuZW5kcgogRU5EKGlycV9lbnRyaWVzX3N0YXJ0KQogCi0ucHJldmlvdXMKLUVORChpbnRlcnJ1cHQpCi0ucHJldmlvdXMKLQogLyoKICAqIHRoZSBDUFUgYXV0b21hdGljYWxseSBkaXNhYmxlcyBpbnRlcnJ1cHRzIHdoZW4gZXhlY3V0aW5nIGFuIElSUSB2ZWN0b3IsCiAgKiBzbyBJUlEtZmxhZ3MgdHJhY2luZyBoYXMgdG8gZm9sbG93IHRoYXQ6CkBAIC04MTYsMTUgKzc5OCw5IEBACiAJcHVzaGxfY2ZpICQwCiAjaWZkZWYgQ09ORklHX1g4Nl9JTlZEX0JVRwogCS8qIEFNRCA0ODYgYnVnOiBpbnZkIGZyb20gdXNlcnNwYWNlIGNhbGxzIGV4Y2VwdGlvbiAxOSBpbnN0ZWFkIG9mICNHUCAqLwotNjYxOglwdXNobF9jZmkgJGRvX2dlbmVyYWxfcHJvdGVjdGlvbgotNjYyOgotLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywiYSIKLQlhbHRpbnN0cnVjdGlvbl9lbnRyeSA2NjFiLCA2NjNmLCBYODZfRkVBVFVSRV9YTU0sIDY2MmItNjYxYiwgNjY0Zi02NjNmCi0ucHJldmlvdXMKLS5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwiYXgiCi02NjM6CXB1c2hsICRkb19zaW1kX2NvcHJvY2Vzc29yX2Vycm9yCi02NjQ6Ci0ucHJldmlvdXMKKwlBTFRFUk5BVElWRSAicHVzaGxfY2ZpICRkb19nZW5lcmFsX3Byb3RlY3Rpb24iLAlcCisJCSAgICAicHVzaGwgJGRvX3NpbWRfY29wcm9jZXNzb3JfZXJyb3IiLCBcCisJCSAgICBYODZfRkVBVFVSRV9YTU0KICNlbHNlCiAJcHVzaGxfY2ZpICRkb19zaW1kX2NvcHJvY2Vzc29yX2Vycm9yCiAjZW5kaWYKQEAgLTEyNDAsMjAgKzEyMTYsMTMgQEAKIAkvKkNGSV9SRUxfT0ZGU0VUIGVzLCAwKi8KIAlwdXNobF9jZmkgJWRzCiAJLypDRklfUkVMX09GRlNFVCBkcywgMCovCi0JcHVzaGxfY2ZpICVlYXgKLQlDRklfUkVMX09GRlNFVCBlYXgsIDAKLQlwdXNobF9jZmkgJWVicAotCUNGSV9SRUxfT0ZGU0VUIGVicCwgMAotCXB1c2hsX2NmaSAlZWRpCi0JQ0ZJX1JFTF9PRkZTRVQgZWRpLCAwCi0JcHVzaGxfY2ZpICVlc2kKLQlDRklfUkVMX09GRlNFVCBlc2ksIDAKLQlwdXNobF9jZmkgJWVkeAotCUNGSV9SRUxfT0ZGU0VUIGVkeCwgMAotCXB1c2hsX2NmaSAlZWN4Ci0JQ0ZJX1JFTF9PRkZTRVQgZWN4LCAwCi0JcHVzaGxfY2ZpICVlYngKLQlDRklfUkVMX09GRlNFVCBlYngsIDAKKwlwdXNobF9jZmlfcmVnIGVheAorCXB1c2hsX2NmaV9yZWcgZWJwCisJcHVzaGxfY2ZpX3JlZyBlZGkKKwlwdXNobF9jZmlfcmVnIGVzaQorCXB1c2hsX2NmaV9yZWcgZWR4CisJcHVzaGxfY2ZpX3JlZyBlY3gKKwlwdXNobF9jZmlfcmVnIGVieAogCWNsZAogCW1vdmwgJChfX0tFUk5FTF9QRVJDUFUpLCAlZWN4CiAJbW92bCAlZWN4LCAlZnMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TIGIvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKaW5kZXggMWQ3NGQxNi4uYzdiMjM4NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKKysrIGIvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKQEAgLTE0LDI3ICsxNCwxNCBAQAogICogTk9URTogVGhpcyBjb2RlIGhhbmRsZXMgc2lnbmFsLXJlY29nbml0aW9uLCB3aGljaCBoYXBwZW5zIGV2ZXJ5IHRpbWUKICAqIGFmdGVyIGFuIGludGVycnVwdCBhbmQgYWZ0ZXIgZWFjaCBzeXN0ZW0gY2FsbC4KICAqCi0gKiBOb3JtYWwgc3lzY2FsbHMgYW5kIGludGVycnVwdHMgZG9uJ3Qgc2F2ZSBhIGZ1bGwgc3RhY2sgZnJhbWUsIHRoaXMgaXMKLSAqIG9ubHkgZG9uZSBmb3Igc3lzY2FsbCB0cmFjaW5nLCBzaWduYWxzIG9yIGZvcmsvZXhlYyBldC5hbC4KLSAqCiAgKiBBIG5vdGUgb24gdGVybWlub2xvZ3k6Ci0gKiAtIHRvcCBvZiBzdGFjazogQXJjaGl0ZWN0dXJlIGRlZmluZWQgaW50ZXJydXB0IGZyYW1lIGZyb20gU1MgdG8gUklQCisgKiAtIGlyZXQgZnJhbWU6IEFyY2hpdGVjdHVyZSBkZWZpbmVkIGludGVycnVwdCBmcmFtZSBmcm9tIFNTIHRvIFJJUAogICogYXQgdGhlIHRvcCBvZiB0aGUga2VybmVsIHByb2Nlc3Mgc3RhY2suCi0gKiAtIHBhcnRpYWwgc3RhY2sgZnJhbWU6IHBhcnRpYWxseSBzYXZlZCByZWdpc3RlcnMgdXAgdG8gUjExLgotICogLSBmdWxsIHN0YWNrIGZyYW1lOiBMaWtlIHBhcnRpYWwgc3RhY2sgZnJhbWUsIGJ1dCBhbGwgcmVnaXN0ZXIgc2F2ZWQuCiAgKgogICogU29tZSBtYWNybyB1c2FnZToKICAqIC0gQ0ZJIG1hY3JvcyBhcmUgdXNlZCB0byBnZW5lcmF0ZSBkd2FyZjIgdW53aW5kIGluZm9ybWF0aW9uIGZvciBiZXR0ZXIKICAqIGJhY2t0cmFjZXMuIFRoZXkgZG9uJ3QgY2hhbmdlIGFueSBjb2RlLgotICogLSBTQVZFX0FMTC9SRVNUT1JFX0FMTCAtIFNhdmUvcmVzdG9yZSBhbGwgcmVnaXN0ZXJzCi0gKiAtIFNBVkVfQVJHUy9SRVNUT1JFX0FSR1MgLSBTYXZlL3Jlc3RvcmUgcmVnaXN0ZXJzIHRoYXQgQyBmdW5jdGlvbnMgbW9kaWZ5LgotICogVGhlcmUgYXJlIHVuZm9ydHVuYXRlbHkgbG90cyBvZiBzcGVjaWFsIGNhc2VzIHdoZXJlIHNvbWUgcmVnaXN0ZXJzCi0gKiBub3QgdG91Y2hlZC4gVGhlIG1hY3JvIGlzIGEgYmlnIG1lc3MgdGhhdCBzaG91bGQgYmUgY2xlYW5lZCB1cC4KLSAqIC0gU0FWRV9SRVNUL1JFU1RPUkVfUkVTVCAtIEhhbmRsZSB0aGUgcmVnaXN0ZXJzIG5vdCBzYXZlZCBieSBTQVZFX0FSR1MuCi0gKiBHaXZlcyBhIGZ1bGwgc3RhY2sgZnJhbWUuCiAgKiAtIEVOVFJZL0VORCBEZWZpbmUgZnVuY3Rpb25zIGluIHRoZSBzeW1ib2wgdGFibGUuCi0gKiAtIEZJWFVQX1RPUF9PRl9TVEFDSy9SRVNUT1JFX1RPUF9PRl9TVEFDSyAtIEZpeCB1cCB0aGUgaGFyZHdhcmUgc3RhY2sKLSAqIGZyYW1lIHRoYXQgaXMgb3RoZXJ3aXNlIHVuZGVmaW5lZCBhZnRlciBhIFNZU0NBTEwKICAqIC0gVFJBQ0VfSVJRXyogLSBUcmFjZSBoYXJkIGludGVycnVwdCBzdGF0ZSBmb3IgbG9jayBkZWJ1Z2dpbmcuCiAgKiAtIGlkdGVudHJ5IC0gRGVmaW5lIGV4Y2VwdGlvbiBlbnRyeSBwb2ludHMuCiAgKi8KQEAgLTcwLDEwICs1Nyw2IEBACiAJLnNlY3Rpb24gLmVudHJ5LnRleHQsICJheCIKIAogCi0jaWZuZGVmIENPTkZJR19QUkVFTVBUCi0jZGVmaW5lIHJldGludF9rZXJuZWwgcmV0aW50X3Jlc3RvcmVfYXJncwotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfUEFSQVZJUlQKIEVOVFJZKG5hdGl2ZV91c2VyZ3Nfc3lzcmV0NjQpCiAJc3dhcGdzCkBAIC04Miw5ICs2NSw5IEBACiAjZW5kaWYgLyogQ09ORklHX1BBUkFWSVJUICovCiAKIAotLm1hY3JvIFRSQUNFX0lSUVNfSVJFVFEgb2Zmc2V0PUFSR09GRlNFVAorLm1hY3JvIFRSQUNFX0lSUVNfSVJFVFEKICNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKLQlidCAgICQ5LEVGTEFHUy1cb2Zmc2V0KCVyc3ApCS8qIGludGVycnVwdHMgb2ZmPyAqLworCWJ0ICAgJDksRUZMQUdTKCVyc3ApCS8qIGludGVycnVwdHMgb2ZmPyAqLwogCWpuYyAgMWYKIAlUUkFDRV9JUlFTX09OCiAxOgpAQCAtMTE2LDggKzk5LDggQEAKIAljYWxsIGRlYnVnX3N0YWNrX3Jlc2V0CiAuZW5kbQogCi0ubWFjcm8gVFJBQ0VfSVJRU19JUkVUUV9ERUJVRyBvZmZzZXQ9QVJHT0ZGU0VUCi0JYnQgICAkOSxFRkxBR1MtXG9mZnNldCglcnNwKQkvKiBpbnRlcnJ1cHRzIG9mZj8gKi8KKy5tYWNybyBUUkFDRV9JUlFTX0lSRVRRX0RFQlVHCisJYnQgICAkOSxFRkxBR1MoJXJzcCkJLyogaW50ZXJydXB0cyBvZmY/ICovCiAJam5jICAxZgogCVRSQUNFX0lSUVNfT05fREVCVUcKIDE6CkBAIC0xMzAsMzQgKzExMyw3IEBACiAjZW5kaWYKIAogLyoKLSAqIEMgY29kZSBpcyBub3Qgc3VwcG9zZWQgdG8ga25vdyBhYm91dCB1bmRlZmluZWQgdG9wIG9mIHN0YWNrLiBFdmVyeSB0aW1lCi0gKiBhIEMgZnVuY3Rpb24gd2l0aCBhbiBwdF9yZWdzIGFyZ3VtZW50IGlzIGNhbGxlZCBmcm9tIHRoZSBTWVNDQUxMIGJhc2VkCi0gKiBmYXN0IHBhdGggRklYVVBfVE9QX09GX1NUQUNLIGlzIG5lZWRlZC4KLSAqIFJFU1RPUkVfVE9QX09GX1NUQUNLIHN5bmNzIHRoZSBzeXNjYWxsIHN0YXRlIGFmdGVyIGFueSBwb3NzaWJsZSBwdHJlZ3MKLSAqIG1hbmlwdWxhdGlvbi4KLSAqLwotCi0JLyogJXJzcDphdCBGUkFNRUVORCAqLwotCS5tYWNybyBGSVhVUF9UT1BfT0ZfU1RBQ0sgdG1wIG9mZnNldD0wCi0JbW92cSBQRVJfQ1BVX1ZBUihvbGRfcnNwKSxcdG1wCi0JbW92cSBcdG1wLFJTUCtcb2Zmc2V0KCVyc3ApCi0JbW92cSAkX19VU0VSX0RTLFNTK1xvZmZzZXQoJXJzcCkKLQltb3ZxICRfX1VTRVJfQ1MsQ1MrXG9mZnNldCglcnNwKQotCW1vdnEgUklQK1xvZmZzZXQoJXJzcCksXHRtcCAgLyogZ2V0IHJpcCAqLwotCW1vdnEgXHRtcCxSQ1grXG9mZnNldCglcnNwKSAgLyogY29weSBpdCB0byByY3ggYXMgc3lzcmV0IHdvdWxkIGRvICovCi0JbW92cSBSMTErXG9mZnNldCglcnNwKSxcdG1wICAvKiBnZXQgZWZsYWdzICovCi0JbW92cSBcdG1wLEVGTEFHUytcb2Zmc2V0KCVyc3ApCi0JLmVuZG0KLQotCS5tYWNybyBSRVNUT1JFX1RPUF9PRl9TVEFDSyB0bXAgb2Zmc2V0PTAKLQltb3ZxIFJTUCtcb2Zmc2V0KCVyc3ApLFx0bXAKLQltb3ZxIFx0bXAsUEVSX0NQVV9WQVIob2xkX3JzcCkKLQltb3ZxIEVGTEFHUytcb2Zmc2V0KCVyc3ApLFx0bXAKLQltb3ZxIFx0bXAsUjExK1xvZmZzZXQoJXJzcCkKLQkuZW5kbQotCi0vKgotICogaW5pdGlhbCBmcmFtZSBzdGF0ZSBmb3IgaW50ZXJydXB0cyAoYW5kIGV4Y2VwdGlvbnMgd2l0aG91dCBlcnJvciBjb2RlKQorICogZW1wdHkgZnJhbWUKICAqLwogCS5tYWNybyBFTVBUWV9GUkFNRSBzdGFydD0xIG9mZnNldD0wCiAJLmlmIFxzdGFydApAQCAtMTczLDEyICsxMjksMTIgQEAKICAqIGluaXRpYWwgZnJhbWUgc3RhdGUgZm9yIGludGVycnVwdHMgKGFuZCBleGNlcHRpb25zIHdpdGhvdXQgZXJyb3IgY29kZSkKICAqLwogCS5tYWNybyBJTlRSX0ZSQU1FIHN0YXJ0PTEgb2Zmc2V0PTAKLQlFTVBUWV9GUkFNRSBcc3RhcnQsIFNTKzgrXG9mZnNldC1SSVAKLQkvKkNGSV9SRUxfT0ZGU0VUIHNzLCBTUytcb2Zmc2V0LVJJUCovCi0JQ0ZJX1JFTF9PRkZTRVQgcnNwLCBSU1ArXG9mZnNldC1SSVAKLQkvKkNGSV9SRUxfT0ZGU0VUIHJmbGFncywgRUZMQUdTK1xvZmZzZXQtUklQKi8KLQkvKkNGSV9SRUxfT0ZGU0VUIGNzLCBDUytcb2Zmc2V0LVJJUCovCi0JQ0ZJX1JFTF9PRkZTRVQgcmlwLCBSSVArXG9mZnNldC1SSVAKKwlFTVBUWV9GUkFNRSBcc3RhcnQsIDUqOCtcb2Zmc2V0CisJLypDRklfUkVMX09GRlNFVCBzcywgNCo4K1xvZmZzZXQqLworCUNGSV9SRUxfT0ZGU0VUIHJzcCwgMyo4K1xvZmZzZXQKKwkvKkNGSV9SRUxfT0ZGU0VUIHJmbGFncywgMio4K1xvZmZzZXQqLworCS8qQ0ZJX1JFTF9PRkZTRVQgY3MsIDEqOCtcb2Zmc2V0Ki8KKwlDRklfUkVMX09GRlNFVCByaXAsIDAqOCtcb2Zmc2V0CiAJLmVuZG0KIAogLyoKQEAgLTE4NiwzMCArMTQyLDIzIEBACiAgKiB3aXRoIHZlY3RvciBhbHJlYWR5IHB1c2hlZCkKICAqLwogCS5tYWNybyBYQ1BUX0ZSQU1FIHN0YXJ0PTEgb2Zmc2V0PTAKLQlJTlRSX0ZSQU1FIFxzdGFydCwgUklQK1xvZmZzZXQtT1JJR19SQVgKLQkuZW5kbQotCi0vKgotICogZnJhbWUgdGhhdCBlbmFibGVzIGNhbGxpbmcgaW50byBDLgotICovCi0JLm1hY3JvIFBBUlRJQUxfRlJBTUUgc3RhcnQ9MSBvZmZzZXQ9MAotCVhDUFRfRlJBTUUgXHN0YXJ0LCBPUklHX1JBWCtcb2Zmc2V0LUFSR09GRlNFVAotCUNGSV9SRUxfT0ZGU0VUIHJkaSwgUkRJK1xvZmZzZXQtQVJHT0ZGU0VUCi0JQ0ZJX1JFTF9PRkZTRVQgcnNpLCBSU0krXG9mZnNldC1BUkdPRkZTRVQKLQlDRklfUkVMX09GRlNFVCByZHgsIFJEWCtcb2Zmc2V0LUFSR09GRlNFVAotCUNGSV9SRUxfT0ZGU0VUIHJjeCwgUkNYK1xvZmZzZXQtQVJHT0ZGU0VUCi0JQ0ZJX1JFTF9PRkZTRVQgcmF4LCBSQVgrXG9mZnNldC1BUkdPRkZTRVQKLQlDRklfUkVMX09GRlNFVCByOCwgUjgrXG9mZnNldC1BUkdPRkZTRVQKLQlDRklfUkVMX09GRlNFVCByOSwgUjkrXG9mZnNldC1BUkdPRkZTRVQKLQlDRklfUkVMX09GRlNFVCByMTAsIFIxMCtcb2Zmc2V0LUFSR09GRlNFVAotCUNGSV9SRUxfT0ZGU0VUIHIxMSwgUjExK1xvZmZzZXQtQVJHT0ZGU0VUCisJSU5UUl9GUkFNRSBcc3RhcnQsIDEqOCtcb2Zmc2V0CiAJLmVuZG0KIAogLyoKICAqIGZyYW1lIHRoYXQgZW5hYmxlcyBwYXNzaW5nIGEgY29tcGxldGUgcHRfcmVncyB0byBhIEMgZnVuY3Rpb24uCiAgKi8KIAkubWFjcm8gREVGQVVMVF9GUkFNRSBzdGFydD0xIG9mZnNldD0wCi0JUEFSVElBTF9GUkFNRSBcc3RhcnQsIFIxMStcb2Zmc2V0LVIxNQorCVhDUFRfRlJBTUUgXHN0YXJ0LCBPUklHX1JBWCtcb2Zmc2V0CisJQ0ZJX1JFTF9PRkZTRVQgcmRpLCBSREkrXG9mZnNldAorCUNGSV9SRUxfT0ZGU0VUIHJzaSwgUlNJK1xvZmZzZXQKKwlDRklfUkVMX09GRlNFVCByZHgsIFJEWCtcb2Zmc2V0CisJQ0ZJX1JFTF9PRkZTRVQgcmN4LCBSQ1grXG9mZnNldAorCUNGSV9SRUxfT0ZGU0VUIHJheCwgUkFYK1xvZmZzZXQKKwlDRklfUkVMX09GRlNFVCByOCwgUjgrXG9mZnNldAorCUNGSV9SRUxfT0ZGU0VUIHI5LCBSOStcb2Zmc2V0CisJQ0ZJX1JFTF9PRkZTRVQgcjEwLCBSMTArXG9mZnNldAorCUNGSV9SRUxfT0ZGU0VUIHIxMSwgUjExK1xvZmZzZXQKIAlDRklfUkVMX09GRlNFVCByYngsIFJCWCtcb2Zmc2V0CiAJQ0ZJX1JFTF9PRkZTRVQgcmJwLCBSQlArXG9mZnNldAogCUNGSV9SRUxfT0ZGU0VUIHIxMiwgUjEyK1xvZmZzZXQKQEAgLTIxOCwxMDUgKzE2NywzMCBAQAogCUNGSV9SRUxfT0ZGU0VUIHIxNSwgUjE1K1xvZmZzZXQKIAkuZW5kbQogCi1FTlRSWShzYXZlX3BhcmFub2lkKQotCVhDUFRfRlJBTUUgMSBSREkrOAotCWNsZAotCW1vdnEgJXJkaSwgUkRJKzgoJXJzcCkKLQltb3ZxICVyc2ksIFJTSSs4KCVyc3ApCi0JbW92cV9jZmkgcmR4LCBSRFgrOAotCW1vdnFfY2ZpIHJjeCwgUkNYKzgKLQltb3ZxX2NmaSByYXgsIFJBWCs4Ci0JbW92cSAlcjgsIFI4KzgoJXJzcCkKLQltb3ZxICVyOSwgUjkrOCglcnNwKQotCW1vdnEgJXIxMCwgUjEwKzgoJXJzcCkKLQltb3ZxICVyMTEsIFIxMSs4KCVyc3ApCi0JbW92cV9jZmkgcmJ4LCBSQlgrOAotCW1vdnEgJXJicCwgUkJQKzgoJXJzcCkKLQltb3ZxICVyMTIsIFIxMis4KCVyc3ApCi0JbW92cSAlcjEzLCBSMTMrOCglcnNwKQotCW1vdnEgJXIxNCwgUjE0KzgoJXJzcCkKLQltb3ZxICVyMTUsIFIxNSs4KCVyc3ApCi0JbW92bCAkMSwlZWJ4Ci0JbW92bCAkTVNSX0dTX0JBU0UsJWVjeAotCXJkbXNyCi0JdGVzdGwgJWVkeCwlZWR4Ci0JanMgMWYJLyogbmVnYXRpdmUgLT4gaW4ga2VybmVsICovCi0JU1dBUEdTCi0JeG9ybCAlZWJ4LCVlYngKLTE6CXJldAotCUNGSV9FTkRQUk9DCi1FTkQoc2F2ZV9wYXJhbm9pZCkKLQogLyoKLSAqIEEgbmV3bHkgZm9ya2VkIHByb2Nlc3MgZGlyZWN0bHkgY29udGV4dCBzd2l0Y2hlcyBpbnRvIHRoaXMgYWRkcmVzcy4KKyAqIDY0Yml0IFNZU0NBTEwgaW5zdHJ1Y3Rpb24gZW50cnkuIFVwIHRvIDYgYXJndW1lbnRzIGluIHJlZ2lzdGVycy4KICAqCi0gKiByZGk6IHByZXYgdGFzayB3ZSBzd2l0Y2hlZCBmcm9tCi0gKi8KLUVOVFJZKHJldF9mcm9tX2ZvcmspCi0JREVGQVVMVF9GUkFNRQotCi0JTE9DSyA7IGJ0ciAkVElGX0ZPUkssVElfZmxhZ3MoJXI4KQotCi0JcHVzaHFfY2ZpICQweDAwMDIKLQlwb3BmcV9jZmkJCQkJIyByZXNldCBrZXJuZWwgZWZsYWdzCi0KLQljYWxsIHNjaGVkdWxlX3RhaWwJCQkjIHJkaTogJ3ByZXYnIHRhc2sgcGFyYW1ldGVyCi0KLQlHRVRfVEhSRUFEX0lORk8oJXJjeCkKLQotCVJFU1RPUkVfUkVTVAotCi0JdGVzdGwgJDMsIENTLUFSR09GRlNFVCglcnNwKQkJIyBmcm9tIGtlcm5lbF90aHJlYWQ/Ci0JanogICAxZgotCi0JLyoKLQkgKiBCeSB0aGUgdGltZSB3ZSBnZXQgaGVyZSwgd2UgaGF2ZSBubyBpZGVhIHdoZXRoZXIgb3VyIHB0X3JlZ3MsCi0JICogdGkgZmxhZ3MsIGFuZCB0aSBzdGF0dXMgY2FtZSBmcm9tIHRoZSA2NC1iaXQgU1lTQ0FMTCBmYXN0IHBhdGgsCi0JICogdGhlIHNsb3cgcGF0aCwgb3Igb25lIG9mIHRoZSBpYTMyZW50cnkgcGF0aHMuCi0JICogVXNlIGludF9yZXRfZnJvbV9zeXNfY2FsbCB0byByZXR1cm4sIHNpbmNlIGl0IGNhbiBzYWZlbHkgaGFuZGxlCi0JICogYWxsIG9mIHRoZSBhYm92ZS4KLQkgKi8KLQlqbXAgIGludF9yZXRfZnJvbV9zeXNfY2FsbAotCi0xOgotCXN1YnEgJFJFU1RfU0tJUCwgJXJzcAkjIGxlYXZlIHNwYWNlIGZvciB2b2xhdGlsZXMKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQJUkVTVF9TS0lQCi0JbW92cSAlcmJwLCAlcmRpCi0JY2FsbCAqJXJieAotCW1vdmwgJDAsIFJBWCglcnNwKQotCVJFU1RPUkVfUkVTVAotCWptcCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKLQlDRklfRU5EUFJPQwotRU5EKHJldF9mcm9tX2ZvcmspCi0KLS8qCi0gKiBTeXN0ZW0gY2FsbCBlbnRyeS4gVXAgdG8gNiBhcmd1bWVudHMgaW4gcmVnaXN0ZXJzIGFyZSBzdXBwb3J0ZWQuCisgKiA2NGJpdCBTWVNDQUxMIHNhdmVzIHJpcCB0byByY3gsIGNsZWFycyByZmxhZ3MuUkYsIHRoZW4gc2F2ZXMgcmZsYWdzIHRvIHIxMSwKKyAqIHRoZW4gbG9hZHMgbmV3IHNzLCBjcywgYW5kIHJpcCBmcm9tIHByZXZpb3VzbHkgcHJvZ3JhbW1lZCBNU1JzLgorICogcmZsYWdzIGdldHMgbWFza2VkIGJ5IGEgdmFsdWUgZnJvbSBhbm90aGVyIE1TUiAoc28gQ0xEIGFuZCBDTEFDCisgKiBhcmUgbm90IG5lZWRlZCkuIFNZU0NBTEwgZG9lcyBub3Qgc2F2ZSBhbnl0aGluZyBvbiB0aGUgc3RhY2sKKyAqIGFuZCBkb2VzIG5vdCBjaGFuZ2UgcnNwLgogICoKLSAqIFNZU0NBTEwgZG9lcyBub3Qgc2F2ZSBhbnl0aGluZyBvbiB0aGUgc3RhY2sgYW5kIGRvZXMgbm90IGNoYW5nZSB0aGUKLSAqIHN0YWNrIHBvaW50ZXIuICBIb3dldmVyLCBpdCBkb2VzIG1hc2sgdGhlIGZsYWdzIHJlZ2lzdGVyIGZvciB1cywgc28KLSAqIENMRCBhbmQgQ0xBQyBhcmUgbm90IG5lZWRlZC4KLSAqLwotCi0vKgotICogUmVnaXN0ZXIgc2V0dXA6CisgKiBSZWdpc3RlcnMgb24gZW50cnk6CiAgKiByYXggIHN5c3RlbSBjYWxsIG51bWJlcgorICogcmN4ICByZXR1cm4gYWRkcmVzcworICogcjExICBzYXZlZCByZmxhZ3MgKG5vdGU6IHIxMSBpcyBjYWxsZWUtY2xvYmJlcmVkIHJlZ2lzdGVyIGluIEMgQUJJKQogICogcmRpICBhcmcwCi0gKiByY3ggIHJldHVybiBhZGRyZXNzIGZvciBzeXNjYWxsL3N5c3JldCwgQyBhcmczCiAgKiByc2kgIGFyZzEKICAqIHJkeCAgYXJnMgotICogcjEwICBhcmczIAkoLS0+IG1vdmVkIHRvIHJjeCBmb3IgQykKKyAqIHIxMCAgYXJnMyAobmVlZHMgdG8gYmUgbW92ZWQgdG8gcmN4IHRvIGNvbmZvcm0gdG8gQyBBQkkpCiAgKiByOCAgIGFyZzQKICAqIHI5ICAgYXJnNQotICogcjExICBlZmxhZ3MgZm9yIHN5c2NhbGwvc3lzcmV0LCB0ZW1wb3JhcnkgZm9yIEMKLSAqIHIxMi1yMTUscmJwLHJieCBzYXZlZCBieSBDIGNvZGUsIG5vdCB0b3VjaGVkLgorICogKG5vdGU6IHIxMi1yMTUscmJwLHJieCBhcmUgY2FsbGVlLXByZXNlcnZlZCBpbiBDIEFCSSkKICAqCi0gKiBJbnRlcnJ1cHRzIGFyZSBvZmYgb24gZW50cnkuCiAgKiBPbmx5IGNhbGxlZCBmcm9tIHVzZXIgc3BhY2UuCiAgKgotICogWFhYCWlmIHdlIGhhZCBhIGZyZWUgc2NyYXRjaCByZWdpc3RlciB3ZSBjb3VsZCBzYXZlIHRoZSBSU1AgaW50byB0aGUgc3RhY2sgZnJhbWUKLSAqICAgICAgYW5kIHJlcG9ydCBpdCBwcm9wZXJseSBpbiBwcy4gVW5mb3J0dW5hdGVseSB3ZSBoYXZlbid0LgotICoKLSAqIFdoZW4gdXNlciBjYW4gY2hhbmdlIHRoZSBmcmFtZXMgYWx3YXlzIGZvcmNlIElSRVQuIFRoYXQgaXMgYmVjYXVzZQorICogV2hlbiB1c2VyIGNhbiBjaGFuZ2UgcHRfcmVncy0+Zm9vIGFsd2F5cyBmb3JjZSBJUkVULiBUaGF0IGlzIGJlY2F1c2UKICAqIGl0IGRlYWxzIHdpdGggdW5jYW5vbmljYWwgYWRkcmVzc2VzIGJldHRlci4gU1lTUkVUIGhhcyB0cm91YmxlCiAgKiB3aXRoIHRoZW0gZHVlIHRvIGJ1Z3MgaW4gYm90aCBBTUQgYW5kIEludGVsIENQVXMuCiAgKi8KQEAgLTMyNCw5ICsxOTgsMTUgQEAKIEVOVFJZKHN5c3RlbV9jYWxsKQogCUNGSV9TVEFSVFBST0MJc2ltcGxlCiAJQ0ZJX1NJR05BTF9GUkFNRQotCUNGSV9ERUZfQ0ZBCXJzcCxLRVJORUxfU1RBQ0tfT0ZGU0VUCisJQ0ZJX0RFRl9DRkEJcnNwLDAKIAlDRklfUkVHSVNURVIJcmlwLHJjeAogCS8qQ0ZJX1JFR0lTVEVSCXJmbGFncyxyMTEqLworCisJLyoKKwkgKiBJbnRlcnJ1cHRzIGFyZSBvZmYgb24gZW50cnkuCisJICogV2UgZG8gbm90IGZyYW1lIHRoaXMgdGlueSBpcnEtb2ZmIGJsb2NrIHdpdGggVFJBQ0VfSVJRU19PRkYvT04sCisJICogaXQgaXMgdG9vIHNtYWxsIHRvIGV2ZXIgY2F1c2Ugbm90aWNlYWJsZSBpcnEgbGF0ZW5jeS4KKwkgKi8KIAlTV0FQR1NfVU5TQUZFX1NUQUNLCiAJLyoKIAkgKiBBIGh5cGVydmlzb3IgaW1wbGVtZW50YXRpb24gbWlnaHQgd2FudCB0byB1c2UgYSBsYWJlbApAQCAtMzM1LDE4ICsyMTUsMzggQEAKIAkgKi8KIEdMT0JBTChzeXN0ZW1fY2FsbF9hZnRlcl9zd2FwZ3MpCiAKLQltb3ZxCSVyc3AsUEVSX0NQVV9WQVIob2xkX3JzcCkKKwltb3ZxCSVyc3AsUEVSX0NQVV9WQVIocnNwX3NjcmF0Y2gpCiAJbW92cQlQRVJfQ1BVX1ZBUihrZXJuZWxfc3RhY2spLCVyc3AKKworCS8qIENvbnN0cnVjdCBzdHJ1Y3QgcHRfcmVncyBvbiBzdGFjayAqLworCXB1c2hxX2NmaSAkX19VU0VSX0RTCQkJLyogcHRfcmVncy0+c3MgKi8KKwlwdXNocV9jZmkgUEVSX0NQVV9WQVIocnNwX3NjcmF0Y2gpCS8qIHB0X3JlZ3MtPnNwICovCiAJLyoKLQkgKiBObyBuZWVkIHRvIGZvbGxvdyB0aGlzIGlycXMgb2ZmL29uIHNlY3Rpb24gLSBpdCdzIHN0cmFpZ2h0Ci0JICogYW5kIHNob3J0OgorCSAqIFJlLWVuYWJsZSBpbnRlcnJ1cHRzLgorCSAqIFdlIHVzZSAncnNwX3NjcmF0Y2gnIGFzIGEgc2NyYXRjaCBzcGFjZSwgaGVuY2UgaXJxLW9mZiBibG9jayBhYm92ZQorCSAqIG11c3QgZXhlY3V0ZSBhdG9taWNhbGx5IGluIHRoZSBmYWNlIG9mIHBvc3NpYmxlIGludGVycnVwdC1kcml2ZW4KKwkgKiB0YXNrIHByZWVtcHRpb24uIFdlIG11c3QgZW5hYmxlIGludGVycnVwdHMgb25seSBhZnRlciB3ZSdyZSBkb25lCisJICogd2l0aCB1c2luZyByc3Bfc2NyYXRjaDoKIAkgKi8KIAlFTkFCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCi0JU0FWRV9BUkdTIDgsIDAsIHJheF9lbm9zeXM9MQotCW1vdnFfY2ZpIHJheCwoT1JJR19SQVgtQVJHT0ZGU0VUKQotCW1vdnEgICVyY3gsUklQLUFSR09GRlNFVCglcnNwKQotCUNGSV9SRUxfT0ZGU0VUIHJpcCxSSVAtQVJHT0ZGU0VUCi0JdGVzdGwgJF9USUZfV09SS19TWVNDQUxMX0VOVFJZLFRJX2ZsYWdzK1RIUkVBRF9JTkZPKCVyc3AsUklQLUFSR09GRlNFVCkKKwlwdXNocV9jZmkJJXIxMQkJCS8qIHB0X3JlZ3MtPmZsYWdzICovCisJcHVzaHFfY2ZpCSRfX1VTRVJfQ1MJCS8qIHB0X3JlZ3MtPmNzICovCisJcHVzaHFfY2ZpCSVyY3gJCQkvKiBwdF9yZWdzLT5pcCAqLworCUNGSV9SRUxfT0ZGU0VUIHJpcCwwCisJcHVzaHFfY2ZpX3JlZwlyYXgJCQkvKiBwdF9yZWdzLT5vcmlnX2F4ICovCisJcHVzaHFfY2ZpX3JlZwlyZGkJCQkvKiBwdF9yZWdzLT5kaSAqLworCXB1c2hxX2NmaV9yZWcJcnNpCQkJLyogcHRfcmVncy0+c2kgKi8KKwlwdXNocV9jZmlfcmVnCXJkeAkJCS8qIHB0X3JlZ3MtPmR4ICovCisJcHVzaHFfY2ZpX3JlZwlyY3gJCQkvKiBwdF9yZWdzLT5jeCAqLworCXB1c2hxX2NmaQkkLUVOT1NZUwkJLyogcHRfcmVncy0+YXggKi8KKwlwdXNocV9jZmlfcmVnCXI4CQkJLyogcHRfcmVncy0+cjggKi8KKwlwdXNocV9jZmlfcmVnCXI5CQkJLyogcHRfcmVncy0+cjkgKi8KKwlwdXNocV9jZmlfcmVnCXIxMAkJCS8qIHB0X3JlZ3MtPnIxMCAqLworCXB1c2hxX2NmaV9yZWcJcjExCQkJLyogcHRfcmVncy0+cjExICovCisJc3ViCSQoNio4KSwlcnNwIC8qIHB0X3JlZ3MtPmJwLGJ4LHIxMi0xNSBub3Qgc2F2ZWQgKi8KKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgNio4CisKKwl0ZXN0bCAkX1RJRl9XT1JLX1NZU0NBTExfRU5UUlksIEFTTV9USFJFQURfSU5GTyhUSV9mbGFncywgJXJzcCwgU0laRU9GX1BUUkVHUykKIAlqbnogdHJhY2VzeXMKIHN5c3RlbV9jYWxsX2Zhc3RwYXRoOgogI2lmIF9fU1lTQ0FMTF9NQVNLID09IH4wCkBAIC0zNTUsODIgKzI1NSw5NiBAQAogCWFuZGwgJF9fU1lTQ0FMTF9NQVNLLCVlYXgKIAljbXBsICRfX05SX3N5c2NhbGxfbWF4LCVlYXgKICNlbmRpZgotCWphIHJldF9mcm9tX3N5c19jYWxsICAvKiBhbmQgcmV0dXJuIHJlZ3MtPmF4ICovCisJamEJMWYJLyogcmV0dXJuIC1FTk9TWVMgKGFscmVhZHkgaW4gcHRfcmVncy0+YXgpICovCiAJbW92cSAlcjEwLCVyY3gKLQljYWxsICpzeXNfY2FsbF90YWJsZSgsJXJheCw4KSAgIyBYWFg6CSByaXAgcmVsYXRpdmUKLQltb3ZxICVyYXgsUkFYLUFSR09GRlNFVCglcnNwKQorCWNhbGwgKnN5c19jYWxsX3RhYmxlKCwlcmF4LDgpCisJbW92cSAlcmF4LFJBWCglcnNwKQorMToKIC8qCi0gKiBTeXNjYWxsIHJldHVybiBwYXRoIGVuZGluZyB3aXRoIFNZU1JFVCAoZmFzdCBwYXRoKQotICogSGFzIGluY29tcGxldGUgc3RhY2sgZnJhbWUgYW5kIHVuZGVmaW5lZCB0b3Agb2Ygc3RhY2suCisgKiBTeXNjYWxsIHJldHVybiBwYXRoIGVuZGluZyB3aXRoIFNZU1JFVCAoZmFzdCBwYXRoKS4KKyAqIEhhcyBpbmNvbXBsZXRlbHkgZmlsbGVkIHB0X3JlZ3MuCiAgKi8KLXJldF9mcm9tX3N5c19jYWxsOgotCXRlc3RsICRfVElGX0FMTFdPUktfTUFTSyxUSV9mbGFncytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCi0Jam56IGludF9yZXRfZnJvbV9zeXNfY2FsbF9maXh1cAkvKiBHbyB0aGUgdGhlIHNsb3cgcGF0aCAqLwotCiAJTE9DS0RFUF9TWVNfRVhJVAotCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCi0JVFJBQ0VfSVJRU19PRkYKLQlDRklfUkVNRU1CRVJfU1RBVEUKIAkvKgotCSAqIHN5c3JldHEgd2lsbCByZS1lbmFibGUgaW50ZXJydXB0czoKKwkgKiBXZSBkbyBub3QgZnJhbWUgdGhpcyB0aW55IGlycS1vZmYgYmxvY2sgd2l0aCBUUkFDRV9JUlFTX09GRi9PTiwKKwkgKiBpdCBpcyB0b28gc21hbGwgdG8gZXZlciBjYXVzZSBub3RpY2VhYmxlIGlycSBsYXRlbmN5LgogCSAqLwotCVRSQUNFX0lSUVNfT04KLQltb3ZxIFJJUC1BUkdPRkZTRVQoJXJzcCksJXJjeAorCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCisKKwkvKgorCSAqIFdlIG11c3QgY2hlY2sgdGkgZmxhZ3Mgd2l0aCBpbnRlcnJ1cHRzIChvciBhdCBsZWFzdCBwcmVlbXB0aW9uKQorCSAqIG9mZiBiZWNhdXNlIHdlIG11c3QgKm5ldmVyKiByZXR1cm4gdG8gdXNlcnNwYWNlIHdpdGhvdXQKKwkgKiBwcm9jZXNzaW5nIGV4aXQgd29yayB0aGF0IGlzIGVucXVldWVkIGlmIHdlJ3JlIHByZWVtcHRlZCBoZXJlLgorCSAqIEluIHBhcnRpY3VsYXIsIHJldHVybmluZyB0byB1c2Vyc3BhY2Ugd2l0aCBhbnkgb2YgdGhlIG9uZS1zaG90CisJICogZmxhZ3MgKFRJRl9OT1RJRllfUkVTVU1FLCBUSUZfVVNFUl9SRVRVUk5fTk9USUZZLCBldGMpIHNldCBpcworCSAqIHZlcnkgYmFkLgorCSAqLworCXRlc3RsICRfVElGX0FMTFdPUktfTUFTSywgQVNNX1RIUkVBRF9JTkZPKFRJX2ZsYWdzLCAlcnNwLCBTSVpFT0ZfUFRSRUdTKQorCWpueiBpbnRfcmV0X2Zyb21fc3lzX2NhbGxfaXJxc19vZmYJLyogR28gdG8gdGhlIHNsb3cgcGF0aCAqLworCisJQ0ZJX1JFTUVNQkVSX1NUQVRFCisKKwlSRVNUT1JFX0NfUkVHU19FWENFUFRfUkNYX1IxMQorCW1vdnEJUklQKCVyc3ApLCVyY3gKIAlDRklfUkVHSVNURVIJcmlwLHJjeAotCVJFU1RPUkVfQVJHUyAxLC1BUkdfU0tJUCwwCisJbW92cQlFRkxBR1MoJXJzcCksJXIxMQogCS8qQ0ZJX1JFR0lTVEVSCXJmbGFncyxyMTEqLwotCW1vdnEJUEVSX0NQVV9WQVIob2xkX3JzcCksICVyc3AKKwltb3ZxCVJTUCglcnNwKSwlcnNwCisJLyoKKwkgKiA2NGJpdCBTWVNSRVQgcmVzdG9yZXMgcmlwIGZyb20gcmN4LAorCSAqIHJmbGFncyBmcm9tIHIxMSAoYnV0IFJGIGFuZCBWTSBiaXRzIGFyZSBmb3JjZWQgdG8gMCksCisJICogY3MgYW5kIHNzIGFyZSBsb2FkZWQgZnJvbSBNU1JzLgorCSAqIFJlc3RvcmF0aW9uIG9mIHJmbGFncyByZS1lbmFibGVzIGludGVycnVwdHMuCisJICovCiAJVVNFUkdTX1NZU1JFVDY0CiAKIAlDRklfUkVTVE9SRV9TVEFURQogCi1pbnRfcmV0X2Zyb21fc3lzX2NhbGxfZml4dXA6Ci0JRklYVVBfVE9QX09GX1NUQUNLICVyMTEsIC1BUkdPRkZTRVQKLQlqbXAgaW50X3JldF9mcm9tX3N5c19jYWxsCi0KLQkvKiBEbyBzeXNjYWxsIHRyYWNpbmcgKi8KKwkvKiBEbyBzeXNjYWxsIGVudHJ5IHRyYWNpbmcgKi8KIHRyYWNlc3lzOgotCWxlYXEgLVJFU1RfU0tJUCglcnNwKSwgJXJkaQotCW1vdnEgJEFVRElUX0FSQ0hfWDg2XzY0LCAlcnNpCisJbW92cSAlcnNwLCAlcmRpCisJbW92bCAkQVVESVRfQVJDSF9YODZfNjQsICVlc2kKIAljYWxsIHN5c2NhbGxfdHJhY2VfZW50ZXJfcGhhc2UxCiAJdGVzdCAlcmF4LCAlcmF4CiAJam56IHRyYWNlc3lzX3BoYXNlMgkJLyogaWYgbmVlZGVkLCBydW4gdGhlIHNsb3cgcGF0aCAqLwotCUxPQURfQVJHUyAwCQkJLyogZWxzZSByZXN0b3JlIGNsb2JiZXJlZCByZWdzICovCisJUkVTVE9SRV9DX1JFR1NfRVhDRVBUX1JBWAkvKiBlbHNlIHJlc3RvcmUgY2xvYmJlcmVkIHJlZ3MgKi8KKwltb3ZxIE9SSUdfUkFYKCVyc3ApLCAlcmF4CiAJam1wIHN5c3RlbV9jYWxsX2Zhc3RwYXRoCS8qICAgICAgYW5kIHJldHVybiB0byB0aGUgZmFzdCBwYXRoICovCiAKIHRyYWNlc3lzX3BoYXNlMjoKLQlTQVZFX1JFU1QKLQlGSVhVUF9UT1BfT0ZfU1RBQ0sgJXJkaQorCVNBVkVfRVhUUkFfUkVHUwogCW1vdnEgJXJzcCwgJXJkaQotCW1vdnEgJEFVRElUX0FSQ0hfWDg2XzY0LCAlcnNpCisJbW92bCAkQVVESVRfQVJDSF9YODZfNjQsICVlc2kKIAltb3ZxICVyYXgsJXJkeAogCWNhbGwgc3lzY2FsbF90cmFjZV9lbnRlcl9waGFzZTIKIAogCS8qCi0JICogUmVsb2FkIGFyZyByZWdpc3RlcnMgZnJvbSBzdGFjayBpbiBjYXNlIHB0cmFjZSBjaGFuZ2VkIHRoZW0uCisJICogUmVsb2FkIHJlZ2lzdGVycyBmcm9tIHN0YWNrIGluIGNhc2UgcHRyYWNlIGNoYW5nZWQgdGhlbS4KIAkgKiBXZSBkb24ndCByZWxvYWQgJXJheCBiZWNhdXNlIHN5c2NhbGxfdHJhY2VfZW50cnlfcGhhc2UyKCkgcmV0dXJuZWQKIAkgKiB0aGUgdmFsdWUgaXQgd2FudHMgdXMgdG8gdXNlIGluIHRoZSB0YWJsZSBsb29rdXAuCiAJICovCi0JTE9BRF9BUkdTIEFSR09GRlNFVCwgMQotCVJFU1RPUkVfUkVTVAorCVJFU1RPUkVfQ19SRUdTX0VYQ0VQVF9SQVgKKwlSRVNUT1JFX0VYVFJBX1JFR1MKICNpZiBfX1NZU0NBTExfTUFTSyA9PSB+MAogCWNtcHEgJF9fTlJfc3lzY2FsbF9tYXgsJXJheAogI2Vsc2UKIAlhbmRsICRfX1NZU0NBTExfTUFTSywlZWF4CiAJY21wbCAkX19OUl9zeXNjYWxsX21heCwlZWF4CiAjZW5kaWYKLQlqYSAgIGludF9yZXRfZnJvbV9zeXNfY2FsbAkvKiBSQVgoJXJzcCkgaXMgYWxyZWFkeSBzZXQgKi8KKwlqYQkxZgkvKiByZXR1cm4gLUVOT1NZUyAoYWxyZWFkeSBpbiBwdF9yZWdzLT5heCkgKi8KIAltb3ZxICVyMTAsJXJjeAkvKiBmaXh1cCBmb3IgQyAqLwogCWNhbGwgKnN5c19jYWxsX3RhYmxlKCwlcmF4LDgpCi0JbW92cSAlcmF4LFJBWC1BUkdPRkZTRVQoJXJzcCkKLQkvKiBVc2UgSVJFVCBiZWNhdXNlIHVzZXIgY291bGQgaGF2ZSBjaGFuZ2VkIGZyYW1lICovCisJbW92cSAlcmF4LFJBWCglcnNwKQorMToKKwkvKiBVc2UgSVJFVCBiZWNhdXNlIHVzZXIgY291bGQgaGF2ZSBjaGFuZ2VkIHB0X3JlZ3MtPmZvbyAqLwogCiAvKgogICogU3lzY2FsbCByZXR1cm4gcGF0aCBlbmRpbmcgd2l0aCBJUkVULgotICogSGFzIGNvcnJlY3QgdG9wIG9mIHN0YWNrLCBidXQgcGFydGlhbCBzdGFjayBmcmFtZS4KKyAqIEhhcyBjb3JyZWN0IGlyZXQgZnJhbWUuCiAgKi8KIEdMT0JBTChpbnRfcmV0X2Zyb21fc3lzX2NhbGwpCiAJRElTQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKK2ludF9yZXRfZnJvbV9zeXNfY2FsbF9pcnFzX29mZjogLyoganVtcHMgY29tZSBoZXJlIGZyb20gdGhlIGlycXMtb2ZmIFNZU1JFVCBwYXRoICovCiAJVFJBQ0VfSVJRU19PRkYKIAltb3ZsICRfVElGX0FMTFdPUktfTUFTSywlZWRpCiAJLyogZWRpOgltYXNrIHRvIGNoZWNrICovCkBAIC00NDAsOCArMzU0LDggQEAKIAltb3ZsIFRJX2ZsYWdzKCVyY3gpLCVlZHgKIAlhbmRsICVlZGksJWVkeAogCWpueiAgIGludF9jYXJlZnVsCi0JYW5kbCAgICAkflRTX0NPTVBBVCxUSV9zdGF0dXMoJXJjeCkKLQlqbXAgICByZXRpbnRfc3dhcGdzCisJYW5kbAkkflRTX0NPTVBBVCxUSV9zdGF0dXMoJXJjeCkKKwlqbXAJc3lzY2FsbF9yZXR1cm4KIAogCS8qIEVpdGhlciByZXNjaGVkdWxlIG9yIHNpZ25hbCBvciBzeXNjYWxsIGV4aXQgdHJhY2tpbmcgbmVlZGVkLiAqLwogCS8qIEZpcnN0IGRvIGEgcmVzY2hlZHVsZSB0ZXN0LiAqLwpAQCAtNDU4LDEyICszNzIsMTEgQEAKIAlUUkFDRV9JUlFTX09GRgogCWptcCBpbnRfd2l0aF9jaGVjawogCi0JLyogaGFuZGxlIHNpZ25hbHMgYW5kIHRyYWNpbmcgLS0gYm90aCByZXF1aXJlIGEgZnVsbCBzdGFjayBmcmFtZSAqLworCS8qIGhhbmRsZSBzaWduYWxzIGFuZCB0cmFjaW5nIC0tIGJvdGggcmVxdWlyZSBhIGZ1bGwgcHRfcmVncyAqLwogaW50X3ZlcnlfY2FyZWZ1bDoKIAlUUkFDRV9JUlFTX09OCiAJRU5BQkxFX0lOVEVSUlVQVFMoQ0xCUl9OT05FKQotaW50X2NoZWNrX3N5c2NhbGxfZXhpdF93b3JrOgotCVNBVkVfUkVTVAorCVNBVkVfRVhUUkFfUkVHUwogCS8qIENoZWNrIGZvciBzeXNjYWxsIGV4aXQgdHJhY2UgKi8KIAl0ZXN0bCAkX1RJRl9XT1JLX1NZU0NBTExfRVhJVCwlZWR4CiAJanogaW50X3NpZ25hbApAQCAtNDgyLDg2ICszOTUsMTkyIEBACiAJY2FsbCBkb19ub3RpZnlfcmVzdW1lCiAxOgltb3ZsICRfVElGX1dPUktfTUFTSywlZWRpCiBpbnRfcmVzdG9yZV9yZXN0OgotCVJFU1RPUkVfUkVTVAorCVJFU1RPUkVfRVhUUkFfUkVHUwogCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCiAJVFJBQ0VfSVJRU19PRkYKIAlqbXAgaW50X3dpdGhfY2hlY2sKKworc3lzY2FsbF9yZXR1cm46CisJLyogVGhlIElSRVRRIGNvdWxkIHJlLWVuYWJsZSBpbnRlcnJ1cHRzOiAqLworCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX0FOWSkKKwlUUkFDRV9JUlFTX0lSRVRRCisKKwkvKgorCSAqIFRyeSB0byB1c2UgU1lTUkVUIGluc3RlYWQgb2YgSVJFVCBpZiB3ZSdyZSByZXR1cm5pbmcgdG8KKwkgKiBhIGNvbXBsZXRlbHkgY2xlYW4gNjQtYml0IHVzZXJzcGFjZSBjb250ZXh0LgorCSAqLworCW1vdnEgUkNYKCVyc3ApLCVyY3gKKwljbXBxICVyY3gsUklQKCVyc3ApCQkvKiBSQ1ggPT0gUklQICovCisJam5lIG9wcG9ydHVuaXN0aWNfc3lzcmV0X2ZhaWxlZAorCisJLyoKKwkgKiBPbiBJbnRlbCBDUFVzLCBTWVNSRVQgd2l0aCBub24tY2Fub25pY2FsIFJDWC9SSVAgd2lsbCAjR1AKKwkgKiBpbiBrZXJuZWwgc3BhY2UuICBUaGlzIGVzc2VudGlhbGx5IGxldHMgdGhlIHVzZXIgdGFrZSBvdmVyCisJICogdGhlIGtlcm5lbCwgc2luY2UgdXNlcnNwYWNlIGNvbnRyb2xzIFJTUC4gIEl0J3Mgbm90IHdvcnRoCisJICogdGVzdGluZyBmb3IgY2Fub25pY2FsbmVzcyBleGFjdGx5IC0tIHRoaXMgY2hlY2sgZGV0ZWN0cyBhbnkKKwkgKiBvZiB0aGUgMTcgaGlnaCBiaXRzIHNldCwgd2hpY2ggaXMgdHJ1ZSBmb3Igbm9uLWNhbm9uaWNhbAorCSAqIG9yIGtlcm5lbCBhZGRyZXNzZXMuICAoVGhpcyB3aWxsIHBlc3NpbWl6ZSB2c3lzY2FsbD1uYXRpdmUuCisJICogQmlnIGRlYWwuKQorCSAqCisJICogSWYgdmlydHVhbCBhZGRyZXNzZXMgZXZlciBiZWNvbWUgd2lkZXIsIHRoaXMgd2lsbCBuZWVkCisJICogdG8gYmUgdXBkYXRlZCB0byByZW1haW4gY29ycmVjdCBvbiBib3RoIG9sZCBhbmQgbmV3IENQVXMuCisJICovCisJLmlmbmUgX19WSVJUVUFMX01BU0tfU0hJRlQgLSA0NworCS5lcnJvciAidmlydHVhbCBhZGRyZXNzIHdpZHRoIGNoYW5nZWQgLS0gU1lTUkVUIGNoZWNrcyBuZWVkIHVwZGF0ZSIKKwkuZW5kaWYKKwlzaHIgJF9fVklSVFVBTF9NQVNLX1NISUZULCAlcmN4CisJam56IG9wcG9ydHVuaXN0aWNfc3lzcmV0X2ZhaWxlZAorCisJY21wcSAkX19VU0VSX0NTLENTKCVyc3ApCS8qIENTIG11c3QgbWF0Y2ggU1lTUkVUICovCisJam5lIG9wcG9ydHVuaXN0aWNfc3lzcmV0X2ZhaWxlZAorCisJbW92cSBSMTEoJXJzcCksJXIxMQorCWNtcHEgJXIxMSxFRkxBR1MoJXJzcCkJCS8qIFIxMSA9PSBSRkxBR1MgKi8KKwlqbmUgb3Bwb3J0dW5pc3RpY19zeXNyZXRfZmFpbGVkCisKKwkvKgorCSAqIFNZU1JFVCBjYW4ndCByZXN0b3JlIFJGLiAgU1lTUkVUIGNhbiByZXN0b3JlIFRGLCBidXQgdW5saWtlIElSRVQsCisJICogcmVzdG9yaW5nIFRGIHJlc3VsdHMgaW4gYSB0cmFwIGZyb20gdXNlcnNwYWNlIGltbWVkaWF0ZWx5IGFmdGVyCisJICogU1lTUkVULiAgVGhpcyB3b3VsZCBjYXVzZSBhbiBpbmZpbml0ZSBsb29wIHdoZW5ldmVyICNEQiBoYXBwZW5zCisJICogd2l0aCByZWdpc3RlciBzdGF0ZSB0aGF0IHNhdGlzZmllcyB0aGUgb3Bwb3J0dW5pc3RpYyBTWVNSRVQKKwkgKiBjb25kaXRpb25zLiAgRm9yIGV4YW1wbGUsIHNpbmdsZS1zdGVwcGluZyB0aGlzIHVzZXIgY29kZToKKwkgKgorCSAqICAgICAgICAgICBtb3ZxICRzdHVja19oZXJlLCVyY3gKKwkgKiAgICAgICAgICAgcHVzaGZxCisJICogICAgICAgICAgIHBvcHEgJXIxMQorCSAqICAgc3R1Y2tfaGVyZToKKwkgKgorCSAqIHdvdWxkIG5ldmVyIGdldCBwYXN0ICdzdHVja19oZXJlJy4KKwkgKi8KKwl0ZXN0cSAkKFg4Nl9FRkxBR1NfUkZ8WDg2X0VGTEFHU19URiksICVyMTEKKwlqbnogb3Bwb3J0dW5pc3RpY19zeXNyZXRfZmFpbGVkCisKKwkvKiBub3RoaW5nIHRvIGNoZWNrIGZvciBSU1AgKi8KKworCWNtcHEgJF9fVVNFUl9EUyxTUyglcnNwKQkvKiBTUyBtdXN0IG1hdGNoIFNZU1JFVCAqLworCWpuZSBvcHBvcnR1bmlzdGljX3N5c3JldF9mYWlsZWQKKworCS8qCisJICogV2Ugd2luISAgVGhpcyBsYWJlbCBpcyBoZXJlIGp1c3QgZm9yIGVhc2Ugb2YgdW5kZXJzdGFuZGluZworCSAqIHBlcmYgcHJvZmlsZXMuICBOb3RoaW5nIGp1bXBzIGhlcmUuCisJICovCitzeXNjYWxsX3JldHVybl92aWFfc3lzcmV0OgorCUNGSV9SRU1FTUJFUl9TVEFURQorCS8qIHIxMSBpcyBhbHJlYWR5IHJlc3RvcmVkIChzZWUgY29kZSBhYm92ZSkgKi8KKwlSRVNUT1JFX0NfUkVHU19FWENFUFRfUjExCisJbW92cSBSU1AoJXJzcCksJXJzcAorCVVTRVJHU19TWVNSRVQ2NAorCUNGSV9SRVNUT1JFX1NUQVRFCisKK29wcG9ydHVuaXN0aWNfc3lzcmV0X2ZhaWxlZDoKKwlTV0FQR1MKKwlqbXAJcmVzdG9yZV9jX3JlZ3NfYW5kX2lyZXQKIAlDRklfRU5EUFJPQwogRU5EKHN5c3RlbV9jYWxsKQogCisKIAkubWFjcm8gRk9SS19MSUtFIGZ1bmMKIEVOVFJZKHN0dWJfXGZ1bmMpCiAJQ0ZJX1NUQVJUUFJPQwotCXBvcHEJJXIxMQkJCS8qIHNhdmUgcmV0dXJuIGFkZHJlc3MgKi8KLQlQQVJUSUFMX0ZSQU1FIDAKLQlTQVZFX1JFU1QKLQlwdXNocQklcjExCQkJLyogcHV0IGl0IGJhY2sgb24gc3RhY2sgKi8KLQlGSVhVUF9UT1BfT0ZfU1RBQ0sgJXIxMSwgOAotCURFRkFVTFRfRlJBTUUgMCA4CQkvKiBvZmZzZXQgODogcmV0dXJuIGFkZHJlc3MgKi8KLQljYWxsIHN5c19cZnVuYwotCVJFU1RPUkVfVE9QX09GX1NUQUNLICVyMTEsIDgKLQlyZXQgJFJFU1RfU0tJUAkJLyogcG9wIGV4dGVuZGVkIHJlZ2lzdGVycyAqLworCURFRkFVTFRfRlJBTUUgMCwgOAkJLyogb2Zmc2V0IDg6IHJldHVybiBhZGRyZXNzICovCisJU0FWRV9FWFRSQV9SRUdTIDgKKwlqbXAgc3lzX1xmdW5jCiAJQ0ZJX0VORFBST0MKIEVORChzdHViX1xmdW5jKQogCS5lbmRtCiAKLQkubWFjcm8gRklYRURfRlJBTUUgbGFiZWwsZnVuYwotRU5UUlkoXGxhYmVsKQotCUNGSV9TVEFSVFBST0MKLQlQQVJUSUFMX0ZSQU1FIDAgOAkJLyogb2Zmc2V0IDg6IHJldHVybiBhZGRyZXNzICovCi0JRklYVVBfVE9QX09GX1NUQUNLICVyMTEsIDgtQVJHT0ZGU0VUCi0JY2FsbCBcZnVuYwotCVJFU1RPUkVfVE9QX09GX1NUQUNLICVyMTEsIDgtQVJHT0ZGU0VUCi0JcmV0Ci0JQ0ZJX0VORFBST0MKLUVORChcbGFiZWwpCi0JLmVuZG0KLQogCUZPUktfTElLRSAgY2xvbmUKIAlGT1JLX0xJS0UgIGZvcmsKIAlGT1JLX0xJS0UgIHZmb3JrCi0JRklYRURfRlJBTUUgc3R1Yl9pb3BsLCBzeXNfaW9wbAogCiBFTlRSWShzdHViX2V4ZWN2ZSkKIAlDRklfU1RBUlRQUk9DCi0JYWRkcSAkOCwgJXJzcAotCVBBUlRJQUxfRlJBTUUgMAotCVNBVkVfUkVTVAotCUZJWFVQX1RPUF9PRl9TVEFDSyAlcjExCi0JY2FsbCBzeXNfZXhlY3ZlCi0JbW92cSAlcmF4LFJBWCglcnNwKQotCVJFU1RPUkVfUkVTVAotCWptcCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKKwlERUZBVUxUX0ZSQU1FIDAsIDgKKwljYWxsCXN5c19leGVjdmUKK3JldHVybl9mcm9tX2V4ZWN2ZToKKwl0ZXN0bAklZWF4LCAlZWF4CisJanoJMWYKKwkvKiBleGVjIGZhaWxlZCwgY2FuIHVzZSBmYXN0IFNZU1JFVCBjb2RlIHBhdGggaW4gdGhpcyBjYXNlICovCisJcmV0CisxOgorCS8qIG11c3QgdXNlIElSRVQgY29kZSBwYXRoIChwdF9yZWdzLT5jcyBtYXkgaGF2ZSBjaGFuZ2VkKSAqLworCWFkZHEJJDgsICVyc3AKKwlDRklfQURKVVNUX0NGQV9PRkZTRVQgLTgKKwlaRVJPX0VYVFJBX1JFR1MKKwltb3ZxCSVyYXgsUkFYKCVyc3ApCisJam1wCWludF9yZXRfZnJvbV9zeXNfY2FsbAogCUNGSV9FTkRQUk9DCiBFTkQoc3R1Yl9leGVjdmUpCi0KLUVOVFJZKHN0dWJfZXhlY3ZlYXQpCisvKgorICogUmVtYWluaW5nIGV4ZWN2ZSBzdHVicyBhcmUgb25seSA3IGJ5dGVzIGxvbmcuCisgKiBFTlRSWSgpIG9mdGVuIGFsaWducyB0byAxNiBieXRlcywgd2hpY2ggaW4gdGhpcyBjYXNlIGhhcyBubyBiZW5lZml0cy4KKyAqLworCS5hbGlnbgk4CitHTE9CQUwoc3R1Yl9leGVjdmVhdCkKIAlDRklfU1RBUlRQUk9DCi0JYWRkcSAkOCwgJXJzcAotCVBBUlRJQUxfRlJBTUUgMAotCVNBVkVfUkVTVAotCUZJWFVQX1RPUF9PRl9TVEFDSyAlcjExCi0JY2FsbCBzeXNfZXhlY3ZlYXQKLQlSRVNUT1JFX1RPUF9PRl9TVEFDSyAlcjExCi0JbW92cSAlcmF4LFJBWCglcnNwKQotCVJFU1RPUkVfUkVTVAotCWptcCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKKwlERUZBVUxUX0ZSQU1FIDAsIDgKKwljYWxsCXN5c19leGVjdmVhdAorCWptcAlyZXR1cm5fZnJvbV9leGVjdmUKIAlDRklfRU5EUFJPQwogRU5EKHN0dWJfZXhlY3ZlYXQpCiAKKyNpZmRlZiBDT05GSUdfWDg2X1gzMl9BQkkKKwkuYWxpZ24JOAorR0xPQkFMKHN0dWJfeDMyX2V4ZWN2ZSkKKwlDRklfU1RBUlRQUk9DCisJREVGQVVMVF9GUkFNRSAwLCA4CisJY2FsbAljb21wYXRfc3lzX2V4ZWN2ZQorCWptcAlyZXR1cm5fZnJvbV9leGVjdmUKKwlDRklfRU5EUFJPQworRU5EKHN0dWJfeDMyX2V4ZWN2ZSkKKwkuYWxpZ24JOAorR0xPQkFMKHN0dWJfeDMyX2V4ZWN2ZWF0KQorCUNGSV9TVEFSVFBST0MKKwlERUZBVUxUX0ZSQU1FIDAsIDgKKwljYWxsCWNvbXBhdF9zeXNfZXhlY3ZlYXQKKwlqbXAJcmV0dXJuX2Zyb21fZXhlY3ZlCisJQ0ZJX0VORFBST0MKK0VORChzdHViX3gzMl9leGVjdmVhdCkKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0lBMzJfRU1VTEFUSU9OCisJLmFsaWduCTgKK0dMT0JBTChzdHViMzJfZXhlY3ZlKQorCUNGSV9TVEFSVFBST0MKKwljYWxsCWNvbXBhdF9zeXNfZXhlY3ZlCisJam1wCXJldHVybl9mcm9tX2V4ZWN2ZQorCUNGSV9FTkRQUk9DCitFTkQoc3R1YjMyX2V4ZWN2ZSkKKwkuYWxpZ24JOAorR0xPQkFMKHN0dWIzMl9leGVjdmVhdCkKKwlDRklfU1RBUlRQUk9DCisJY2FsbAljb21wYXRfc3lzX2V4ZWN2ZWF0CisJam1wCXJldHVybl9mcm9tX2V4ZWN2ZQorCUNGSV9FTkRQUk9DCitFTkQoc3R1YjMyX2V4ZWN2ZWF0KQorI2VuZGlmCisKIC8qCiAgKiBzaWdyZXR1cm4gaXMgc3BlY2lhbCBiZWNhdXNlIGl0IG5lZWRzIHRvIHJlc3RvcmUgYWxsIHJlZ2lzdGVycyBvbiByZXR1cm4uCiAgKiBUaGlzIGNhbm5vdCBiZSBkb25lIHdpdGggU1lTUkVULCBzbyB1c2UgdGhlIElSRVQgcmV0dXJuIHBhdGggaW5zdGVhZC4KICAqLwogRU5UUlkoc3R1Yl9ydF9zaWdyZXR1cm4pCiAJQ0ZJX1NUQVJUUFJPQwotCWFkZHEgJDgsICVyc3AKLQlQQVJUSUFMX0ZSQU1FIDAKLQlTQVZFX1JFU1QKLQlGSVhVUF9UT1BfT0ZfU1RBQ0sgJXIxMQorCURFRkFVTFRfRlJBTUUgMCwgOAorCS8qCisJICogU0FWRV9FWFRSQV9SRUdTIHJlc3VsdCBpcyBub3Qgbm9ybWFsbHkgbmVlZGVkOgorCSAqIHNpZ3JldHVybiBvdmVyd3JpdGVzIGFsbCBwdF9yZWdzLT5HUFJFR1MuCisJICogQnV0IHNpZ3JldHVybiBjYW4gZmFpbCAoISksIGFuZCB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBkZXRlY3QgdGhhdC4KKwkgKiBUbyBtYWtlIHN1cmUgUkVTVE9SRV9FWFRSQV9SRUdTIGRvZXNuJ3QgcmVzdG9yZSBnYXJiYWdlIG9uIGVycm9yLAorCSAqIHdlIFNBVkVfRVhUUkFfUkVHUyBoZXJlLgorCSAqLworCVNBVkVfRVhUUkFfUkVHUyA4CiAJY2FsbCBzeXNfcnRfc2lncmV0dXJuCi0JbW92cSAlcmF4LFJBWCglcnNwKSAjIGZpeG1lLCB0aGlzIGNvdWxkIGJlIGRvbmUgYXQgdGhlIGhpZ2hlciBsYXllcgotCVJFU1RPUkVfUkVTVAorcmV0dXJuX2Zyb21fc3R1YjoKKwlhZGRxCSQ4LCAlcnNwCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC04CisJUkVTVE9SRV9FWFRSQV9SRUdTCisJbW92cSAlcmF4LFJBWCglcnNwKQogCWptcCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKIAlDRklfRU5EUFJPQwogRU5EKHN0dWJfcnRfc2lncmV0dXJuKQpAQCAtNTY5LDg2ICs1ODgsNzAgQEAKICNpZmRlZiBDT05GSUdfWDg2X1gzMl9BQkkKIEVOVFJZKHN0dWJfeDMyX3J0X3NpZ3JldHVybikKIAlDRklfU1RBUlRQUk9DCi0JYWRkcSAkOCwgJXJzcAotCVBBUlRJQUxfRlJBTUUgMAotCVNBVkVfUkVTVAotCUZJWFVQX1RPUF9PRl9TVEFDSyAlcjExCisJREVGQVVMVF9GUkFNRSAwLCA4CisJU0FWRV9FWFRSQV9SRUdTIDgKIAljYWxsIHN5czMyX3gzMl9ydF9zaWdyZXR1cm4KLQltb3ZxICVyYXgsUkFYKCVyc3ApICMgZml4bWUsIHRoaXMgY291bGQgYmUgZG9uZSBhdCB0aGUgaGlnaGVyIGxheWVyCi0JUkVTVE9SRV9SRVNUCi0Jam1wIGludF9yZXRfZnJvbV9zeXNfY2FsbAorCWptcCAgcmV0dXJuX2Zyb21fc3R1YgogCUNGSV9FTkRQUk9DCiBFTkQoc3R1Yl94MzJfcnRfc2lncmV0dXJuKQotCi1FTlRSWShzdHViX3gzMl9leGVjdmUpCi0JQ0ZJX1NUQVJUUFJPQwotCWFkZHEgJDgsICVyc3AKLQlQQVJUSUFMX0ZSQU1FIDAKLQlTQVZFX1JFU1QKLQlGSVhVUF9UT1BfT0ZfU1RBQ0sgJXIxMQotCWNhbGwgY29tcGF0X3N5c19leGVjdmUKLQlSRVNUT1JFX1RPUF9PRl9TVEFDSyAlcjExCi0JbW92cSAlcmF4LFJBWCglcnNwKQotCVJFU1RPUkVfUkVTVAotCWptcCBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKLQlDRklfRU5EUFJPQwotRU5EKHN0dWJfeDMyX2V4ZWN2ZSkKLQotRU5UUlkoc3R1Yl94MzJfZXhlY3ZlYXQpCi0JQ0ZJX1NUQVJUUFJPQwotCWFkZHEgJDgsICVyc3AKLQlQQVJUSUFMX0ZSQU1FIDAKLQlTQVZFX1JFU1QKLQlGSVhVUF9UT1BfT0ZfU1RBQ0sgJXIxMQotCWNhbGwgY29tcGF0X3N5c19leGVjdmVhdAotCVJFU1RPUkVfVE9QX09GX1NUQUNLICVyMTEKLQltb3ZxICVyYXgsUkFYKCVyc3ApCi0JUkVTVE9SRV9SRVNUCi0Jam1wIGludF9yZXRfZnJvbV9zeXNfY2FsbAotCUNGSV9FTkRQUk9DCi1FTkQoc3R1Yl94MzJfZXhlY3ZlYXQpCi0KICNlbmRpZgogCiAvKgotICogQnVpbGQgdGhlIGVudHJ5IHN0dWJzIGFuZCBwb2ludGVyIHRhYmxlIHdpdGggc29tZSBhc3NlbWJsZXIgbWFnaWMuCi0gKiBXZSBwYWNrIDcgc3R1YnMgaW50byBhIHNpbmdsZSAzMi1ieXRlIGNodW5rLCB3aGljaCB3aWxsIGZpdCBpbiBhCi0gKiBzaW5nbGUgY2FjaGUgbGluZSBvbiBhbGwgbW9kZXJuIHg4NiBpbXBsZW1lbnRhdGlvbnMuCisgKiBBIG5ld2x5IGZvcmtlZCBwcm9jZXNzIGRpcmVjdGx5IGNvbnRleHQgc3dpdGNoZXMgaW50byB0aGlzIGFkZHJlc3MuCisgKgorICogcmRpOiBwcmV2IHRhc2sgd2Ugc3dpdGNoZWQgZnJvbQogICovCi0JLnNlY3Rpb24gLmluaXQucm9kYXRhLCJhIgotRU5UUlkoaW50ZXJydXB0KQotCS5zZWN0aW9uIC5lbnRyeS50ZXh0Ci0JLnAyYWxpZ24gNQotCS5wMmFsaWduIENPTkZJR19YODZfTDFfQ0FDSEVfU0hJRlQKK0VOVFJZKHJldF9mcm9tX2ZvcmspCisJREVGQVVMVF9GUkFNRQorCisJTE9DSyA7IGJ0ciAkVElGX0ZPUkssVElfZmxhZ3MoJXI4KQorCisJcHVzaHFfY2ZpICQweDAwMDIKKwlwb3BmcV9jZmkJCQkJIyByZXNldCBrZXJuZWwgZWZsYWdzCisKKwljYWxsIHNjaGVkdWxlX3RhaWwJCQkjIHJkaTogJ3ByZXYnIHRhc2sgcGFyYW1ldGVyCisKKwlSRVNUT1JFX0VYVFJBX1JFR1MKKworCXRlc3RsICQzLENTKCVyc3ApCQkJIyBmcm9tIGtlcm5lbF90aHJlYWQ/CisKKwkvKgorCSAqIEJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlLCB3ZSBoYXZlIG5vIGlkZWEgd2hldGhlciBvdXIgcHRfcmVncywKKwkgKiB0aSBmbGFncywgYW5kIHRpIHN0YXR1cyBjYW1lIGZyb20gdGhlIDY0LWJpdCBTWVNDQUxMIGZhc3QgcGF0aCwKKwkgKiB0aGUgc2xvdyBwYXRoLCBvciBvbmUgb2YgdGhlIGlhMzJlbnRyeSBwYXRocy4KKwkgKiBVc2UgSVJFVCBjb2RlIHBhdGggdG8gcmV0dXJuLCBzaW5jZSBpdCBjYW4gc2FmZWx5IGhhbmRsZQorCSAqIGFsbCBvZiB0aGUgYWJvdmUuCisJICovCisJam56CWludF9yZXRfZnJvbV9zeXNfY2FsbAorCisJLyogV2UgY2FtZSBmcm9tIGtlcm5lbF90aHJlYWQgKi8KKwkvKiBuYjogd2UgZGVwZW5kIG9uIFJFU1RPUkVfRVhUUkFfUkVHUyBhYm92ZSAqLworCW1vdnEgJXJicCwgJXJkaQorCWNhbGwgKiVyYngKKwltb3ZsICQwLCBSQVgoJXJzcCkKKwlSRVNUT1JFX0VYVFJBX1JFR1MKKwlqbXAgaW50X3JldF9mcm9tX3N5c19jYWxsCisJQ0ZJX0VORFBST0MKK0VORChyZXRfZnJvbV9mb3JrKQorCisvKgorICogQnVpbGQgdGhlIGVudHJ5IHN0dWJzIHdpdGggc29tZSBhc3NlbWJsZXIgbWFnaWMuCisgKiBXZSBwYWNrIDEgc3R1YiBpbnRvIGV2ZXJ5IDgtYnl0ZSBibG9jay4KKyAqLworCS5hbGlnbiA4CiBFTlRSWShpcnFfZW50cmllc19zdGFydCkKIAlJTlRSX0ZSQU1FCi12ZWN0b3I9RklSU1RfRVhURVJOQUxfVkVDVE9SCi0ucmVwdCAoRklSU1RfU1lTVEVNX1ZFQ1RPUi1GSVJTVF9FWFRFUk5BTF9WRUNUT1IrNikvNwotCS5iYWxpZ24gMzIKLSAgLnJlcHQJNwotICAgIC5pZiB2ZWN0b3IgPCBGSVJTVF9TWVNURU1fVkVDVE9SCi0gICAgICAuaWYgdmVjdG9yIDw+IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUgorICAgIHZlY3Rvcj1GSVJTVF9FWFRFUk5BTF9WRUNUT1IKKyAgICAucmVwdCAoRklSU1RfU1lTVEVNX1ZFQ1RPUiAtIEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUikKKwlwdXNocV9jZmkgJCh+dmVjdG9yKzB4ODApCS8qIE5vdGU6IGFsd2F5cyBpbiBzaWduZWQgYnl0ZSByYW5nZSAqLworICAgIHZlY3Rvcj12ZWN0b3IrMQorCWptcAljb21tb25faW50ZXJydXB0CiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC04Ci0gICAgICAuZW5kaWYKLTE6CXB1c2hxX2NmaSAkKH52ZWN0b3IrMHg4MCkJLyogTm90ZTogYWx3YXlzIGluIHNpZ25lZCBieXRlIHJhbmdlICovCi0gICAgICAuaWYgKCh2ZWN0b3ItRklSU1RfRVhURVJOQUxfVkVDVE9SKSU3KSA8PiA2Ci0Jam1wIDJmCi0gICAgICAuZW5kaWYKLSAgICAgIC5wcmV2aW91cwotCS5xdWFkIDFiCi0gICAgICAuc2VjdGlvbiAuZW50cnkudGV4dAotdmVjdG9yPXZlY3RvcisxCi0gICAgLmVuZGlmCi0gIC5lbmRyCi0yOglqbXAgY29tbW9uX2ludGVycnVwdAotLmVuZHIKKwkuYWxpZ24JOAorICAgIC5lbmRyCiAJQ0ZJX0VORFBST0MKIEVORChpcnFfZW50cmllc19zdGFydCkKIAotLnByZXZpb3VzCi1FTkQoaW50ZXJydXB0KQotLnByZXZpb3VzCi0KIC8qCiAgKiBJbnRlcnJ1cHQgZW50cnkvZXhpdC4KICAqCkBAIC02NTksNDcgKzY2Miw0NSBAQAogCiAvKiAwKCVyc3ApOiB+KGludGVycnVwdCBudW1iZXIpICovCiAJLm1hY3JvIGludGVycnVwdCBmdW5jCi0JLyogcmVzZXJ2ZSBwdF9yZWdzIGZvciBzY3JhdGNoIHJlZ3MgYW5kIHJicCAqLwotCXN1YnEgJE9SSUdfUkFYLVJCUCwgJXJzcAotCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCBPUklHX1JBWC1SQlAKIAljbGQKLQkvKiBzdGFydCBmcm9tIHJicCBpbiBwdF9yZWdzIGFuZCBqdW1wIG92ZXIgKi8KLQltb3ZxX2NmaSByZGksIChSREktUkJQKQotCW1vdnFfY2ZpIHJzaSwgKFJTSS1SQlApCi0JbW92cV9jZmkgcmR4LCAoUkRYLVJCUCkKLQltb3ZxX2NmaSByY3gsIChSQ1gtUkJQKQotCW1vdnFfY2ZpIHJheCwgKFJBWC1SQlApCi0JbW92cV9jZmkgIHI4LCAgKFI4LVJCUCkKLQltb3ZxX2NmaSAgcjksICAoUjktUkJQKQotCW1vdnFfY2ZpIHIxMCwgKFIxMC1SQlApCi0JbW92cV9jZmkgcjExLCAoUjExLVJCUCkKKwkvKgorCSAqIFNpbmNlIG5vdGhpbmcgaW4gaW50ZXJydXB0IGhhbmRsaW5nIGNvZGUgdG91Y2hlcyByMTIuLi5yMTUgbWVtYmVycworCSAqIG9mICJzdHJ1Y3QgcHRfcmVncyIsIGFuZCBzaW5jZSBpbnRlcnJ1cHRzIGNhbiBuZXN0LCB3ZSBjYW4gc2F2ZQorCSAqIGZvdXIgc3RhY2sgc2xvdHMgYW5kIHNpbXVsdGFuZW91c2x5IHByb3ZpZGUKKwkgKiBhbiB1bndpbmQtZnJpZW5kbHkgc3RhY2sgbGF5b3V0IGJ5IHNhdmluZyAidHJ1bmNhdGVkIiBwdF9yZWdzCisJICogZXhhY3RseSB1cCB0byByYnAgc2xvdCwgd2l0aG91dCB0aGVzZSBtZW1iZXJzLgorCSAqLworCUFMTE9DX1BUX0dQUkVHU19PTl9TVEFDSyAtUkJQCisJU0FWRV9DX1JFR1MgLVJCUAorCS8qIHRoaXMgZ29lcyB0byAwKCVyc3ApIGZvciB1bndpbmRlciwgbm90IGZvciBzYXZpbmcgdGhlIHZhbHVlOiAqLworCVNBVkVfRVhUUkFfUkVHU19SQlAgLVJCUAogCi0JLyogU2F2ZSByYnAgc28gdGhhdCB3ZSBjYW4gdW53aW5kIGZyb20gZ2V0X2lycV9yZWdzKCkgKi8KLQltb3ZxX2NmaSByYnAsIDAKKwlsZWFxIC1SQlAoJXJzcCksJXJkaQkvKiBhcmcxIGZvciBcZnVuYyAocG9pbnRlciB0byBwdF9yZWdzKSAqLwogCi0JLyogU2F2ZSBwcmV2aW91cyBzdGFjayB2YWx1ZSAqLwotCW1vdnEgJXJzcCwgJXJzaQotCi0JbGVhcSAtUkJQKCVyc3ApLCVyZGkJLyogYXJnMSBmb3IgaGFuZGxlciAqLwotCXRlc3RsICQzLCBDUy1SQlAoJXJzaSkKKwl0ZXN0bCAkMywgQ1MtUkJQKCVyc3ApCiAJamUgMWYKIAlTV0FQR1MKKzE6CiAJLyoKKwkgKiBTYXZlIHByZXZpb3VzIHN0YWNrIHBvaW50ZXIsIG9wdGlvbmFsbHkgc3dpdGNoIHRvIGludGVycnVwdCBzdGFjay4KIAkgKiBpcnFfY291bnQgaXMgdXNlZCB0byBjaGVjayBpZiBhIENQVSBpcyBhbHJlYWR5IG9uIGFuIGludGVycnVwdCBzdGFjawogCSAqIG9yIG5vdC4gV2hpbGUgdGhpcyBpcyBlc3NlbnRpYWxseSByZWR1bmRhbnQgd2l0aCBwcmVlbXB0X2NvdW50IGl0IGlzCiAJICogYSBsaXR0bGUgY2hlYXBlciB0byB1c2UgYSBzZXBhcmF0ZSBjb3VudGVyIGluIHRoZSBQREEgKHNob3J0IG9mCiAJICogbW92aW5nIGlycV9lbnRlciBpbnRvIGFzc2VtYmx5LCB3aGljaCB3b3VsZCBiZSB0b28gbXVjaCB3b3JrKQogCSAqLwotMToJaW5jbCBQRVJfQ1BVX1ZBUihpcnFfY291bnQpCisJbW92cSAlcnNwLCAlcnNpCisJaW5jbCBQRVJfQ1BVX1ZBUihpcnFfY291bnQpCiAJY21vdnpxIFBFUl9DUFVfVkFSKGlycV9zdGFja19wdHIpLCVyc3AKIAlDRklfREVGX0NGQV9SRUdJU1RFUglyc2kKLQotCS8qIFN0b3JlIHByZXZpb3VzIHN0YWNrIHZhbHVlICovCiAJcHVzaHEgJXJzaQorCS8qCisJICogRm9yIGRlYnVnZ2VyOgorCSAqICJDRkEgKEN1cnJlbnQgRnJhbWUgQWRkcmVzcykgaXMgdGhlIHZhbHVlIG9uIHN0YWNrICsgb2Zmc2V0IgorCSAqLwogCUNGSV9FU0NBUEUJMHgwZiAvKiBEV19DRkFfZGVmX2NmYV9leHByZXNzaW9uICovLCA2LCBcCi0JCQkweDc3IC8qIERXX09QX2JyZWc3ICovLCAwLCBcCisJCQkweDc3IC8qIERXX09QX2JyZWc3IChyc3ApICovLCAwLCBcCiAJCQkweDA2IC8qIERXX09QX2RlcmVmICovLCBcCi0JCQkweDA4IC8qIERXX09QX2NvbnN0MXUgKi8sIFNTKzgtUkJQLCBcCisJCQkweDA4IC8qIERXX09QX2NvbnN0MXUgKi8sIFNJWkVPRl9QVFJFR1MtUkJQLCBcCiAJCQkweDIyIC8qIERXX09QX3BsdXMgKi8KIAkvKiBXZSBlbnRlcmVkIGFuIGludGVycnVwdCBjb250ZXh0IC0gaXJxcyBhcmUgb2ZmOiAqLwogCVRSQUNFX0lSUVNfT0ZGCkBAIC03MTcsNyArNzE4LDcgQEAKIAlBU01fQ0xBQwogCWFkZHEgJC0weDgwLCglcnNwKQkJLyogQWRqdXN0IHZlY3RvciB0byBbLTI1NiwtMV0gcmFuZ2UgKi8KIAlpbnRlcnJ1cHQgZG9fSVJRCi0JLyogMCglcnNwKTogb2xkX3JzcC1BUkdPRkZTRVQgKi8KKwkvKiAwKCVyc3ApOiBvbGQgUlNQICovCiByZXRfZnJvbV9pbnRyOgogCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCiAJVFJBQ0VfSVJRU19PRkYKQEAgLTcyNSwxOSArNzI2LDE4IEBACiAKIAkvKiBSZXN0b3JlIHNhdmVkIHByZXZpb3VzIHN0YWNrICovCiAJcG9wcSAlcnNpCi0JQ0ZJX0RFRl9DRkEgcnNpLFNTKzgtUkJQCS8qIHJlZy9vZmYgcmVzZXQgYWZ0ZXIgZGVmX2NmYV9leHByICovCi0JbGVhcSBBUkdPRkZTRVQtUkJQKCVyc2kpLCAlcnNwCisJQ0ZJX0RFRl9DRkEgcnNpLFNJWkVPRl9QVFJFR1MtUkJQIC8qIHJlZy9vZmYgcmVzZXQgYWZ0ZXIgZGVmX2NmYV9leHByICovCisJLyogcmV0dXJuIGNvZGUgZXhwZWN0cyBjb21wbGV0ZSBwdF9yZWdzIC0gYWRqdXN0IHJzcCBhY2NvcmRpbmdseTogKi8KKwlsZWFxIC1SQlAoJXJzaSksJXJzcAogCUNGSV9ERUZfQ0ZBX1JFR0lTVEVSCXJzcAotCUNGSV9BREpVU1RfQ0ZBX09GRlNFVAlSQlAtQVJHT0ZGU0VUCisJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUCVJCUAogCi1leGl0X2ludHI6Ci0JR0VUX1RIUkVBRF9JTkZPKCVyY3gpCi0JdGVzdGwgJDMsQ1MtQVJHT0ZGU0VUKCVyc3ApCisJdGVzdGwgJDMsQ1MoJXJzcCkKIAlqZSByZXRpbnRfa2VybmVsCi0KIAkvKiBJbnRlcnJ1cHQgY2FtZSBmcm9tIHVzZXIgc3BhY2UgKi8KKworCUdFVF9USFJFQURfSU5GTyglcmN4KQogCS8qCi0JICogSGFzIGEgY29ycmVjdCB0b3Agb2Ygc3RhY2ssIGJ1dCBhIHBhcnRpYWwgc3RhY2sgZnJhbWUKIAkgKiAlcmN4OiB0aHJlYWQgaW5mby4gSW50ZXJydXB0cyBvZmYuCiAJICovCiByZXRpbnRfd2l0aF9yZXNjaGVkdWxlOgpAQCAtNzU2LDcwICs3NTYsMzQgQEAKIAlESVNBQkxFX0lOVEVSUlVQVFMoQ0xCUl9BTlkpCiAJVFJBQ0VfSVJRU19JUkVUUQogCi0JLyoKLQkgKiBUcnkgdG8gdXNlIFNZU1JFVCBpbnN0ZWFkIG9mIElSRVQgaWYgd2UncmUgcmV0dXJuaW5nIHRvCi0JICogYSBjb21wbGV0ZWx5IGNsZWFuIDY0LWJpdCB1c2Vyc3BhY2UgY29udGV4dC4KLQkgKi8KLQltb3ZxIChSQ1gtUjExKSglcnNwKSwgJXJjeAotCWNtcHEgJXJjeCwoUklQLVIxMSkoJXJzcCkJCS8qIFJDWCA9PSBSSVAgKi8KLQlqbmUgb3Bwb3J0dW5pc3RpY19zeXNyZXRfZmFpbGVkCi0KLQkvKgotCSAqIE9uIEludGVsIENQVXMsIHN5c3JldCB3aXRoIG5vbi1jYW5vbmljYWwgUkNYL1JJUCB3aWxsICNHUAotCSAqIGluIGtlcm5lbCBzcGFjZS4gIFRoaXMgZXNzZW50aWFsbHkgbGV0cyB0aGUgdXNlciB0YWtlIG92ZXIKLQkgKiB0aGUga2VybmVsLCBzaW5jZSB1c2Vyc3BhY2UgY29udHJvbHMgUlNQLiAgSXQncyBub3Qgd29ydGgKLQkgKiB0ZXN0aW5nIGZvciBjYW5vbmljYWxuZXNzIGV4YWN0bHkgLS0gdGhpcyBjaGVjayBkZXRlY3RzIGFueQotCSAqIG9mIHRoZSAxNyBoaWdoIGJpdHMgc2V0LCB3aGljaCBpcyB0cnVlIGZvciBub24tY2Fub25pY2FsCi0JICogb3Iga2VybmVsIGFkZHJlc3Nlcy4gIChUaGlzIHdpbGwgcGVzc2ltaXplIHZzeXNjYWxsPW5hdGl2ZS4KLQkgKiBCaWcgZGVhbC4pCi0JICoKLQkgKiBJZiB2aXJ0dWFsIGFkZHJlc3NlcyBldmVyIGJlY29tZSB3aWRlciwgdGhpcyB3aWxsIG5lZWQKLQkgKiB0byBiZSB1cGRhdGVkIHRvIHJlbWFpbiBjb3JyZWN0IG9uIGJvdGggb2xkIGFuZCBuZXcgQ1BVcy4KLQkgKi8KLQkuaWZuZSBfX1ZJUlRVQUxfTUFTS19TSElGVCAtIDQ3Ci0JLmVycm9yICJ2aXJ0dWFsIGFkZHJlc3Mgd2lkdGggY2hhbmdlZCAtLSBzeXNyZXQgY2hlY2tzIG5lZWQgdXBkYXRlIgotCS5lbmRpZgotCXNociAkX19WSVJUVUFMX01BU0tfU0hJRlQsICVyY3gKLQlqbnogb3Bwb3J0dW5pc3RpY19zeXNyZXRfZmFpbGVkCi0KLQljbXBxICRfX1VTRVJfQ1MsKENTLVIxMSkoJXJzcCkJCS8qIENTIG11c3QgbWF0Y2ggU1lTUkVUICovCi0Jam5lIG9wcG9ydHVuaXN0aWNfc3lzcmV0X2ZhaWxlZAotCi0JbW92cSAoUjExLUFSR09GRlNFVCkoJXJzcCksICVyMTEKLQljbXBxICVyMTEsKEVGTEFHUy1BUkdPRkZTRVQpKCVyc3ApCS8qIFIxMSA9PSBSRkxBR1MgKi8KLQlqbmUgb3Bwb3J0dW5pc3RpY19zeXNyZXRfZmFpbGVkCi0KLQl0ZXN0cSAkWDg2X0VGTEFHU19SRiwlcjExCQkvKiBzeXNyZXQgY2FuJ3QgcmVzdG9yZSBSRiAqLwotCWpueiBvcHBvcnR1bmlzdGljX3N5c3JldF9mYWlsZWQKLQotCS8qIG5vdGhpbmcgdG8gY2hlY2sgZm9yIFJTUCAqLwotCi0JY21wcSAkX19VU0VSX0RTLChTUy1BUkdPRkZTRVQpKCVyc3ApCS8qIFNTIG11c3QgbWF0Y2ggU1lTUkVUICovCi0Jam5lIG9wcG9ydHVuaXN0aWNfc3lzcmV0X2ZhaWxlZAotCi0JLyoKLQkgKiBXZSB3aW4hICBUaGlzIGxhYmVsIGlzIGhlcmUganVzdCBmb3IgZWFzZSBvZiB1bmRlcnN0YW5kaW5nCi0JICogcGVyZiBwcm9maWxlcy4gIE5vdGhpbmcganVtcHMgaGVyZS4KLQkgKi8KLWlycV9yZXR1cm5fdmlhX3N5c3JldDoKLQlDRklfUkVNRU1CRVJfU1RBVEUKLQlSRVNUT1JFX0FSR1MgMSw4LDEKLQltb3ZxIChSU1AtUklQKSglcnNwKSwlcnNwCi0JVVNFUkdTX1NZU1JFVDY0Ci0JQ0ZJX1JFU1RPUkVfU1RBVEUKLQotb3Bwb3J0dW5pc3RpY19zeXNyZXRfZmFpbGVkOgogCVNXQVBHUwotCWptcCByZXN0b3JlX2FyZ3MKKwlqbXAJcmVzdG9yZV9jX3JlZ3NfYW5kX2lyZXQKIAotcmV0aW50X3Jlc3RvcmVfYXJnczoJLyogcmV0dXJuIHRvIGtlcm5lbCBzcGFjZSAqLwotCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX0FOWSkKKy8qIFJldHVybmluZyB0byBrZXJuZWwgc3BhY2UgKi8KK3JldGludF9rZXJuZWw6CisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKwkvKiBJbnRlcnJ1cHRzIGFyZSBvZmYgKi8KKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHByZWVtcHRpb24gKi8KKwlidAkkOSxFRkxBR1MoJXJzcCkJLyogaW50ZXJydXB0cyB3ZXJlIG9mZj8gKi8KKwlqbmMJMWYKKzA6CWNtcGwJJDAsUEVSX0NQVV9WQVIoX19wcmVlbXB0X2NvdW50KQorCWpuegkxZgorCWNhbGwJcHJlZW1wdF9zY2hlZHVsZV9pcnEKKwlqbXAJMGIKKzE6CisjZW5kaWYKIAkvKgogCSAqIFRoZSBpcmV0cSBjb3VsZCByZS1lbmFibGUgaW50ZXJydXB0czoKIAkgKi8KIAlUUkFDRV9JUlFTX0lSRVRRCi1yZXN0b3JlX2FyZ3M6Ci0JUkVTVE9SRV9BUkdTIDEsOCwxCisKKy8qCisgKiBBdCB0aGlzIGxhYmVsLCBjb2RlIHBhdGhzIHdoaWNoIHJldHVybiB0byBrZXJuZWwgYW5kIHRvIHVzZXIsCisgKiB3aGljaCBjb21lIGZyb20gaW50ZXJydXB0cy9leGNlcHRpb24gYW5kIGZyb20gc3lzY2FsbHMsIG1lcmdlLgorICovCityZXN0b3JlX2NfcmVnc19hbmRfaXJldDoKKwlSRVNUT1JFX0NfUkVHUworCVJFTU9WRV9QVF9HUFJFR1NfRlJPTV9TVEFDSyA4CiAKIGlycV9yZXR1cm46CiAJSU5URVJSVVBUX1JFVFVSTgpAQCAtODkwLDI4ICs4NTQsMTcgQEAKIAlqeiAgICByZXRpbnRfc3dhcGdzCiAJVFJBQ0VfSVJRU19PTgogCUVOQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKLQlTQVZFX1JFU1QKKwlTQVZFX0VYVFJBX1JFR1MKIAltb3ZxICQtMSxPUklHX1JBWCglcnNwKQogCXhvcmwgJWVzaSwlZXNpCQkjIG9sZHNldAogCW1vdnEgJXJzcCwlcmRpCQkjICZwdF9yZWdzCiAJY2FsbCBkb19ub3RpZnlfcmVzdW1lCi0JUkVTVE9SRV9SRVNUCisJUkVTVE9SRV9FWFRSQV9SRUdTCiAJRElTQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKIAlUUkFDRV9JUlFTX09GRgogCUdFVF9USFJFQURfSU5GTyglcmN4KQogCWptcCByZXRpbnRfd2l0aF9yZXNjaGVkdWxlCiAKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCS8qIFJldHVybmluZyB0byBrZXJuZWwgc3BhY2UuIENoZWNrIGlmIHdlIG5lZWQgcHJlZW1wdGlvbiAqLwotCS8qIHJjeDoJIHRocmVhZGluZm8uIGludGVycnVwdHMgb2ZmLiAqLwotRU5UUlkocmV0aW50X2tlcm5lbCkKLQljbXBsICQwLFBFUl9DUFVfVkFSKF9fcHJlZW1wdF9jb3VudCkKLQlqbnogIHJldGludF9yZXN0b3JlX2FyZ3MKLQlidCAgICQ5LEVGTEFHUy1BUkdPRkZTRVQoJXJzcCkJLyogaW50ZXJydXB0cyBvZmY/ICovCi0Jam5jICByZXRpbnRfcmVzdG9yZV9hcmdzCi0JY2FsbCBwcmVlbXB0X3NjaGVkdWxlX2lycQotCWptcCBleGl0X2ludHIKLSNlbmRpZgogCUNGSV9FTkRQUk9DCiBFTkQoY29tbW9uX2ludGVycnVwdCkKIApAQCAtMTAwMCw3ICs5NTMsNyBAQAogLyoKICAqIEV4Y2VwdGlvbiBlbnRyeSBwb2ludHMuCiAgKi8KLSNkZWZpbmUgSU5JVF9UU1NfSVNUKHgpIFBFUl9DUFVfVkFSKGluaXRfdHNzKSArIChUU1NfaXN0ICsgKCh4KSAtIDEpICogOCkKKyNkZWZpbmUgQ1BVX1RTU19JU1QoeCkgUEVSX0NQVV9WQVIoY3B1X3RzcykgKyAoVFNTX2lzdCArICgoeCkgLSAxKSAqIDgpCiAKIC5tYWNybyBpZHRlbnRyeSBzeW0gZG9fc3ltIGhhc19lcnJvcl9jb2RlOnJlcSBwYXJhbm9pZD0wIHNoaWZ0X2lzdD0tMQogRU5UUlkoXHN5bSkKQEAgLTEwMjIsOCArOTc1LDcgQEAKIAlwdXNocV9jZmkgJC0xCQkJLyogT1JJR19SQVg6IG5vIHN5c2NhbGwgdG8gcmVzdGFydCAqLwogCS5lbmRpZgogCi0Jc3VicSAkT1JJR19SQVgtUjE1LCAlcnNwCi0JQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIE9SSUdfUkFYLVIxNQorCUFMTE9DX1BUX0dQUkVHU19PTl9TVEFDSwogCiAJLmlmIFxwYXJhbm9pZAogCS5pZiBccGFyYW5vaWQgPT0gMQpAQCAtMTAzMSwxMCArOTgzLDExIEBACiAJdGVzdGwgJDMsIENTKCVyc3ApCQkvKiBJZiBjb21pbmcgZnJvbSB1c2Vyc3BhY2UsIHN3aXRjaCAqLwogCWpueiAxZgkJCQkvKiBzdGFja3MuICovCiAJLmVuZGlmCi0JY2FsbCBzYXZlX3BhcmFub2lkCisJY2FsbCBwYXJhbm9pZF9lbnRyeQogCS5lbHNlCiAJY2FsbCBlcnJvcl9lbnRyeQogCS5lbmRpZgorCS8qIHJldHVybmVkIGZsYWc6IGVieD0wOiBuZWVkIHN3YXBncyBvbiBleGl0LCBlYng9MTogZG9uJ3QgbmVlZCBpdCAqLwogCiAJREVGQVVMVF9GUkFNRSAwCiAKQEAgLTEwNTYsMTkgKzEwMDksMjAgQEAKIAkuZW5kaWYKIAogCS5pZiBcc2hpZnRfaXN0ICE9IC0xCi0Jc3VicSAkRVhDRVBUSU9OX1NUS1NaLCBJTklUX1RTU19JU1QoXHNoaWZ0X2lzdCkKKwlzdWJxICRFWENFUFRJT05fU1RLU1osIENQVV9UU1NfSVNUKFxzaGlmdF9pc3QpCiAJLmVuZGlmCiAKIAljYWxsIFxkb19zeW0KIAogCS5pZiBcc2hpZnRfaXN0ICE9IC0xCi0JYWRkcSAkRVhDRVBUSU9OX1NUS1NaLCBJTklUX1RTU19JU1QoXHNoaWZ0X2lzdCkKKwlhZGRxICRFWENFUFRJT05fU1RLU1osIENQVV9UU1NfSVNUKFxzaGlmdF9pc3QpCiAJLmVuZGlmCiAKKwkvKiB0aGVzZSBwcm9jZWR1cmVzIGV4cGVjdCAibm8gc3dhcGdzIiBmbGFnIGluIGVieCAqLwogCS5pZiBccGFyYW5vaWQKLQlqbXAgcGFyYW5vaWRfZXhpdAkJLyogJWVieDogbm8gc3dhcGdzIGZsYWcgKi8KKwlqbXAgcGFyYW5vaWRfZXhpdAogCS5lbHNlCi0Jam1wIGVycm9yX2V4aXQJCQkvKiAlZWJ4OiBubyBzd2FwZ3MgZmxhZyAqLworCWptcCBlcnJvcl9leGl0CiAJLmVuZGlmCiAKIAkuaWYgXHBhcmFub2lkID09IDEKQEAgLTEyNzIsNyArMTIyNiw5IEBACiAJYWRkcSAkMHgzMCwlcnNwCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC0weDMwCiAJcHVzaHFfY2ZpICQtMSAvKiBvcmlnX2F4ID0gLTEgPT4gbm90IGEgc3lzdGVtIGNhbGwgKi8KLQlTQVZFX0FMTAorCUFMTE9DX1BUX0dQUkVHU19PTl9TVEFDSworCVNBVkVfQ19SRUdTCisJU0FWRV9FWFRSQV9SRUdTCiAJam1wIGVycm9yX2V4aXQKIAlDRklfRU5EUFJPQwogRU5EKHhlbl9mYWlsc2FmZV9jYWxsYmFjaykKQEAgLTEzMDQsNTkgKzEyNjAsNjYgQEAKIGlkdGVudHJ5IG1hY2hpbmVfY2hlY2sgaGFzX2Vycm9yX2NvZGU9MCBwYXJhbm9pZD0xIGRvX3N5bT0qbWFjaGluZV9jaGVja192ZWN0b3IoJXJpcCkKICNlbmRpZgogCi0JLyoKLQkgKiAiUGFyYW5vaWQiIGV4aXQgcGF0aCBmcm9tIGV4Y2VwdGlvbiBzdGFjay4gIFRoaXMgaXMgaW52b2tlZAotCSAqIG9ubHkgb24gcmV0dXJuIGZyb20gbm9uLU5NSSBJU1QgaW50ZXJydXB0cyB0aGF0IGNhbWUKLQkgKiBmcm9tIGtlcm5lbCBzcGFjZS4KLQkgKgotCSAqIFdlIG1heSBiZSByZXR1cm5pbmcgdG8gdmVyeSBzdHJhbmdlIGNvbnRleHRzIChlLmcuIHZlcnkgZWFybHkKLQkgKiBpbiBzeXNjYWxsIGVudHJ5KSwgc28gY2hlY2tpbmcgZm9yIHByZWVtcHRpb24gaGVyZSB3b3VsZAotCSAqIGJlIGNvbXBsaWNhdGVkLiAgRm9ydHVuYXRlbHksIHdlIHRoZXJlJ3Mgbm8gZ29vZCByZWFzb24KLQkgKiB0byB0cnkgdG8gaGFuZGxlIHByZWVtcHRpb24gaGVyZS4KLQkgKi8KKy8qCisgKiBTYXZlIGFsbCByZWdpc3RlcnMgaW4gcHRfcmVncywgYW5kIHN3aXRjaCBncyBpZiBuZWVkZWQuCisgKiBVc2Ugc2xvdywgYnV0IHN1cmVmaXJlICJhcmUgd2UgaW4ga2VybmVsPyIgY2hlY2suCisgKiBSZXR1cm46IGVieD0wOiBuZWVkIHN3YXBncyBvbiBleGl0LCBlYng9MTogb3RoZXJ3aXNlCisgKi8KK0VOVFJZKHBhcmFub2lkX2VudHJ5KQorCVhDUFRfRlJBTUUgMSAxNSo4CisJY2xkCisJU0FWRV9DX1JFR1MgOAorCVNBVkVfRVhUUkFfUkVHUyA4CisJbW92bCAkMSwlZWJ4CisJbW92bCAkTVNSX0dTX0JBU0UsJWVjeAorCXJkbXNyCisJdGVzdGwgJWVkeCwlZWR4CisJanMgMWYJLyogbmVnYXRpdmUgLT4gaW4ga2VybmVsICovCisJU1dBUEdTCisJeG9ybCAlZWJ4LCVlYngKKzE6CXJldAorCUNGSV9FTkRQUk9DCitFTkQocGFyYW5vaWRfZW50cnkpCiAKLQkvKiBlYng6CW5vIHN3YXBncyBmbGFnICovCisvKgorICogIlBhcmFub2lkIiBleGl0IHBhdGggZnJvbSBleGNlcHRpb24gc3RhY2suICBUaGlzIGlzIGludm9rZWQKKyAqIG9ubHkgb24gcmV0dXJuIGZyb20gbm9uLU5NSSBJU1QgaW50ZXJydXB0cyB0aGF0IGNhbWUKKyAqIGZyb20ga2VybmVsIHNwYWNlLgorICoKKyAqIFdlIG1heSBiZSByZXR1cm5pbmcgdG8gdmVyeSBzdHJhbmdlIGNvbnRleHRzIChlLmcuIHZlcnkgZWFybHkKKyAqIGluIHN5c2NhbGwgZW50cnkpLCBzbyBjaGVja2luZyBmb3IgcHJlZW1wdGlvbiBoZXJlIHdvdWxkCisgKiBiZSBjb21wbGljYXRlZC4gIEZvcnR1bmF0ZWx5LCB3ZSB0aGVyZSdzIG5vIGdvb2QgcmVhc29uCisgKiB0byB0cnkgdG8gaGFuZGxlIHByZWVtcHRpb24gaGVyZS4KKyAqLworLyogT24gZW50cnksIGVieCBpcyAibm8gc3dhcGdzIiBmbGFnICgxOiBkb24ndCBuZWVkIHN3YXBncywgMDogbmVlZCBpdCkgKi8KIEVOVFJZKHBhcmFub2lkX2V4aXQpCiAJREVGQVVMVF9GUkFNRQogCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCiAJVFJBQ0VfSVJRU19PRkZfREVCVUcKIAl0ZXN0bCAlZWJ4LCVlYngJCQkJLyogc3dhcGdzIG5lZWRlZD8gKi8KLQlqbnogcGFyYW5vaWRfcmVzdG9yZQotCVRSQUNFX0lSUVNfSVJFVFEgMAorCWpueiBwYXJhbm9pZF9leGl0X25vX3N3YXBncworCVRSQUNFX0lSUVNfSVJFVFEKIAlTV0FQR1NfVU5TQUZFX1NUQUNLCi0JUkVTVE9SRV9BTEwgOAotCUlOVEVSUlVQVF9SRVRVUk4KLXBhcmFub2lkX3Jlc3RvcmU6Ci0JVFJBQ0VfSVJRU19JUkVUUV9ERUJVRyAwCi0JUkVTVE9SRV9BTEwgOAorCWptcCBwYXJhbm9pZF9leGl0X3Jlc3RvcmUKK3BhcmFub2lkX2V4aXRfbm9fc3dhcGdzOgorCVRSQUNFX0lSUVNfSVJFVFFfREVCVUcKK3BhcmFub2lkX2V4aXRfcmVzdG9yZToKKwlSRVNUT1JFX0VYVFJBX1JFR1MKKwlSRVNUT1JFX0NfUkVHUworCVJFTU9WRV9QVF9HUFJFR1NfRlJPTV9TVEFDSyA4CiAJSU5URVJSVVBUX1JFVFVSTgogCUNGSV9FTkRQUk9DCiBFTkQocGFyYW5vaWRfZXhpdCkKIAogLyoKLSAqIEV4Y2VwdGlvbiBlbnRyeSBwb2ludC4gVGhpcyBleHBlY3RzIGFuIGVycm9yIGNvZGUvb3JpZ19yYXggb24gdGhlIHN0YWNrLgotICogcmV0dXJucyBpbiAibm8gc3dhcGdzIGZsYWciIGluICVlYnguCisgKiBTYXZlIGFsbCByZWdpc3RlcnMgaW4gcHRfcmVncywgYW5kIHN3aXRjaCBncyBpZiBuZWVkZWQuCisgKiBSZXR1cm46IGVieD0wOiBuZWVkIHN3YXBncyBvbiBleGl0LCBlYng9MTogb3RoZXJ3aXNlCiAgKi8KIEVOVFJZKGVycm9yX2VudHJ5KQotCVhDUFRfRlJBTUUKLQlDRklfQURKVVNUX0NGQV9PRkZTRVQgMTUqOAotCS8qIG9sZHJheCBjb250YWlucyBlcnJvciBjb2RlICovCisJWENQVF9GUkFNRSAxIDE1KjgKIAljbGQKLQltb3ZxICVyZGksIFJESSs4KCVyc3ApCi0JbW92cSAlcnNpLCBSU0krOCglcnNwKQotCW1vdnEgJXJkeCwgUkRYKzgoJXJzcCkKLQltb3ZxICVyY3gsIFJDWCs4KCVyc3ApCi0JbW92cSAlcmF4LCBSQVgrOCglcnNwKQotCW1vdnEgICVyOCwgIFI4KzgoJXJzcCkKLQltb3ZxICAlcjksICBSOSs4KCVyc3ApCi0JbW92cSAlcjEwLCBSMTArOCglcnNwKQotCW1vdnEgJXIxMSwgUjExKzgoJXJzcCkKLQltb3ZxX2NmaSByYngsIFJCWCs4Ci0JbW92cSAlcmJwLCBSQlArOCglcnNwKQotCW1vdnEgJXIxMiwgUjEyKzgoJXJzcCkKLQltb3ZxICVyMTMsIFIxMys4KCVyc3ApCi0JbW92cSAlcjE0LCBSMTQrOCglcnNwKQotCW1vdnEgJXIxNSwgUjE1KzgoJXJzcCkKKwlTQVZFX0NfUkVHUyA4CisJU0FWRV9FWFRSQV9SRUdTIDgKIAl4b3JsICVlYngsJWVieAogCXRlc3RsICQzLENTKzgoJXJzcCkKIAlqZSBlcnJvcl9rZXJuZWxzcGFjZQpAQCAtMTM2NiwxMiArMTMyOSwxMiBAQAogCVRSQUNFX0lSUVNfT0ZGCiAJcmV0CiAKLS8qCi0gKiBUaGVyZSBhcmUgdHdvIHBsYWNlcyBpbiB0aGUga2VybmVsIHRoYXQgY2FuIHBvdGVudGlhbGx5IGZhdWx0IHdpdGgKLSAqIHVzZXJncy4gSGFuZGxlIHRoZW0gaGVyZS4gIEIgc3RlcHBpbmcgSzhzIHNvbWV0aW1lcyByZXBvcnQgYQotICogdHJ1bmNhdGVkIFJJUCBmb3IgSVJFVCBleGNlcHRpb25zIHJldHVybmluZyB0byBjb21wYXQgbW9kZS4gQ2hlY2sKLSAqIGZvciB0aGVzZSBoZXJlIHRvby4KLSAqLworCS8qCisJICogVGhlcmUgYXJlIHR3byBwbGFjZXMgaW4gdGhlIGtlcm5lbCB0aGF0IGNhbiBwb3RlbnRpYWxseSBmYXVsdCB3aXRoCisJICogdXNlcmdzLiBIYW5kbGUgdGhlbSBoZXJlLiAgQiBzdGVwcGluZyBLOHMgc29tZXRpbWVzIHJlcG9ydCBhCisJICogdHJ1bmNhdGVkIFJJUCBmb3IgSVJFVCBleGNlcHRpb25zIHJldHVybmluZyB0byBjb21wYXQgbW9kZS4gQ2hlY2sKKwkgKiBmb3IgdGhlc2UgaGVyZSB0b28uCisJICovCiBlcnJvcl9rZXJuZWxzcGFjZToKIAlDRklfUkVMX09GRlNFVCByY3gsIFJDWCs4CiAJaW5jbCAlZWJ4CkBAIC0xNDAxLDExICsxMzY0LDExIEBACiBFTkQoZXJyb3JfZW50cnkpCiAKIAotLyogZWJ4OglubyBzd2FwZ3MgZmxhZyAoMTogZG9uJ3QgbmVlZCBzd2FwZ3MsIDA6IG5lZWQgaXQpICovCisvKiBPbiBlbnRyeSwgZWJ4IGlzICJubyBzd2FwZ3MiIGZsYWcgKDE6IGRvbid0IG5lZWQgc3dhcGdzLCAwOiBuZWVkIGl0KSAqLwogRU5UUlkoZXJyb3JfZXhpdCkKIAlERUZBVUxUX0ZSQU1FCiAJbW92bCAlZWJ4LCVlYXgKLQlSRVNUT1JFX1JFU1QKKwlSRVNUT1JFX0VYVFJBX1JFR1MKIAlESVNBQkxFX0lOVEVSUlVQVFMoQ0xCUl9OT05FKQogCVRSQUNFX0lSUVNfT0ZGCiAJR0VUX1RIUkVBRF9JTkZPKCVyY3gpCkBAIC0xNDIwLDE5ICsxMzgzLDcgQEAKIAlDRklfRU5EUFJPQwogRU5EKGVycm9yX2V4aXQpCiAKLS8qCi0gKiBUZXN0IGlmIGEgZ2l2ZW4gc3RhY2sgaXMgYW4gTk1JIHN0YWNrIG9yIG5vdC4KLSAqLwotCS5tYWNybyB0ZXN0X2luX25taSByZWcgc3RhY2sgbm1pX3JldCBub3JtYWxfcmV0Ci0JY21wcSAlXHJlZywgXHN0YWNrCi0JamEgXG5vcm1hbF9yZXQKLQlzdWJxICRFWENFUFRJT05fU1RLU1osICVccmVnCi0JY21wcSAlXHJlZywgXHN0YWNrCi0JamIgXG5vcm1hbF9yZXQKLQlqbXAgXG5taV9yZXQKLQkuZW5kbQotCi0JLyogcnVucyBvbiBleGNlcHRpb24gc3RhY2sgKi8KKy8qIFJ1bnMgb24gZXhjZXB0aW9uIHN0YWNrICovCiBFTlRSWShubWkpCiAJSU5UUl9GUkFNRQogCVBBUkFWSVJUX0FESlVTVF9FWENFUFRJT05fRlJBTUUKQEAgLTE0NjgsNyArMTQxOSw3IEBACiAJICogTk1JLgogCSAqLwogCi0JLyogVXNlICVyZHggYXMgb3V0IHRlbXAgdmFyaWFibGUgdGhyb3VnaG91dCAqLworCS8qIFVzZSAlcmR4IGFzIG91ciB0ZW1wIHZhcmlhYmxlIHRocm91Z2hvdXQgKi8KIAlwdXNocV9jZmkgJXJkeAogCUNGSV9SRUxfT0ZGU0VUIHJkeCwgMAogCkBAIC0xNDkzLDggKzE0NDQsMTcgQEAKIAkgKiBXZSBjaGVjayB0aGUgdmFyaWFibGUgYmVjYXVzZSB0aGUgZmlyc3QgTk1JIGNvdWxkIGJlIGluIGEKIAkgKiBicmVha3BvaW50IHJvdXRpbmUgdXNpbmcgYSBicmVha3BvaW50IHN0YWNrLgogCSAqLwotCWxlYSA2KjgoJXJzcCksICVyZHgKLQl0ZXN0X2luX25taSByZHgsIDQqOCglcnNwKSwgbmVzdGVkX25taSwgZmlyc3Rfbm1pCisJbGVhCTYqOCglcnNwKSwgJXJkeAorCS8qIENvbXBhcmUgdGhlIE5NSSBzdGFjayAocmR4KSB3aXRoIHRoZSBzdGFjayB3ZSBjYW1lIGZyb20gKDQqOCglcnNwKSkgKi8KKwljbXBxCSVyZHgsIDQqOCglcnNwKQorCS8qIElmIHRoZSBzdGFjayBwb2ludGVyIGlzIGFib3ZlIHRoZSBOTUkgc3RhY2ssIHRoaXMgaXMgYSBub3JtYWwgTk1JICovCisJamEJZmlyc3Rfbm1pCisJc3VicQkkRVhDRVBUSU9OX1NUS1NaLCAlcmR4CisJY21wcQklcmR4LCA0KjgoJXJzcCkKKwkvKiBJZiBpdCBpcyBiZWxvdyB0aGUgTk1JIHN0YWNrLCBpdCBpcyBhIG5vcm1hbCBOTUkgKi8KKwlqYglmaXJzdF9ubWkKKwkvKiBBaCwgaXQgaXMgd2l0aGluIHRoZSBOTUkgc3RhY2ssIHRyZWF0IGl0IGFzIG5lc3RlZCAqLworCiAJQ0ZJX1JFTUVNQkVSX1NUQVRFCiAKIG5lc3RlZF9ubWk6CkBAIC0xNTg3LDcgKzE1NDcsNyBAQAogCS5yZXB0IDUKIAlwdXNocV9jZmkgMTEqOCglcnNwKQogCS5lbmRyCi0JQ0ZJX0RFRl9DRkFfT0ZGU0VUIFNTKzgtUklQCisJQ0ZJX0RFRl9DRkFfT0ZGU0VUIDUqOAogCiAJLyogRXZlcnl0aGluZyB1cCB0byBoZXJlIGlzIHNhZmUgZnJvbSBuZXN0ZWQgTk1JcyAqLwogCkBAIC0xNjE1LDcgKzE1NzUsNyBAQAogCXB1c2hxX2NmaSAtNio4KCVyc3ApCiAJLmVuZHIKIAlzdWJxICQoNSo4KSwgJXJzcAotCUNGSV9ERUZfQ0ZBX09GRlNFVCBTUys4LVJJUAorCUNGSV9ERUZfQ0ZBX09GRlNFVCA1KjgKIGVuZF9yZXBlYXRfbm1pOgogCiAJLyoKQEAgLTE2MjQsMTYgKzE1ODQsMTYgQEAKIAkgKiBzbyB0aGF0IHdlIHJlcGVhdCBhbm90aGVyIE5NSS4KIAkgKi8KIAlwdXNocV9jZmkgJC0xCQkvKiBPUklHX1JBWDogbm8gc3lzY2FsbCB0byByZXN0YXJ0ICovCi0Jc3VicSAkT1JJR19SQVgtUjE1LCAlcnNwCi0JQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIE9SSUdfUkFYLVIxNQorCUFMTE9DX1BUX0dQUkVHU19PTl9TVEFDSworCiAJLyoKLQkgKiBVc2Ugc2F2ZV9wYXJhbm9pZCB0byBoYW5kbGUgU1dBUEdTLCBidXQgbm8gbmVlZCB0byB1c2UgcGFyYW5vaWRfZXhpdAorCSAqIFVzZSBwYXJhbm9pZF9lbnRyeSB0byBoYW5kbGUgU1dBUEdTLCBidXQgbm8gbmVlZCB0byB1c2UgcGFyYW5vaWRfZXhpdAogCSAqIGFzIHdlIHNob3VsZCBub3QgYmUgY2FsbGluZyBzY2hlZHVsZSBpbiBOTUkgY29udGV4dC4KIAkgKiBFdmVuIHdpdGggbm9ybWFsIGludGVycnVwdHMgZW5hYmxlZC4gQW4gTk1JIHNob3VsZCBub3QgYmUKIAkgKiBzZXR0aW5nIE5FRURfUkVTQ0hFRCBvciBhbnl0aGluZyB0aGF0IG5vcm1hbCBpbnRlcnJ1cHRzIGFuZAogCSAqIGV4Y2VwdGlvbnMgbWlnaHQgZG8uCiAJICovCi0JY2FsbCBzYXZlX3BhcmFub2lkCisJY2FsbCBwYXJhbm9pZF9lbnRyeQogCURFRkFVTFRfRlJBTUUgMAogCiAJLyoKQEAgLTE2NjQsOCArMTYyNCwxMCBAQAogbm1pX3N3YXBnczoKIAlTV0FQR1NfVU5TQUZFX1NUQUNLCiBubWlfcmVzdG9yZToKKwlSRVNUT1JFX0VYVFJBX1JFR1MKKwlSRVNUT1JFX0NfUkVHUwogCS8qIFBvcCB0aGUgZXh0cmEgaXJldCBmcmFtZSBhdCBvbmNlICovCi0JUkVTVE9SRV9BTEwgNio4CisJUkVNT1ZFX1BUX0dQUkVHU19GUk9NX1NUQUNLIDYqOAogCiAJLyogQ2xlYXIgdGhlIE5NSSBleGVjdXRpbmcgc3RhY2sgdmFyaWFibGUgKi8KIAltb3ZxICQwLCA1KjgoJXJzcCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9oZWFkNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkNjQuYwppbmRleCBjNGY4ZDQ2Li4yYjU1ZWU2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZDY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hlYWQ2NC5jCkBAIC0xNzcsOSArMTc3LDYgQEAKIAkgKi8KIAlsb2FkX3Vjb2RlX2JzcCgpOwogCi0JaWYgKGNvbnNvbGVfbG9nbGV2ZWwgPj0gQ09OU09MRV9MT0dMRVZFTF9ERUJVRykKLQkJZWFybHlfcHJpbnRrKCJLZXJuZWwgYWxpdmVcbiIpOwotCiAJY2xlYXJfcGFnZShpbml0X2xldmVsNF9wZ3QpOwogCS8qIHNldCBpbml0X2xldmVsNF9wZ3Qga2VybmVsIGhpZ2ggbWFwcGluZyovCiAJaW5pdF9sZXZlbDRfcGd0WzUxMV0gPSBlYXJseV9sZXZlbDRfcGd0WzUxMV07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUwppbmRleCBmMzZiZDQyLi5kMDMxYmFkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9wZXJjcHUuaD4KICNpbmNsdWRlIDxhc20vbm9wcy5oPgorI2luY2x1ZGUgPGFzbS9ib290cGFyYW0uaD4KIAogLyogUGh5c2ljYWwgYWRkcmVzcyAqLwogI2RlZmluZSBwYShYKSAoKFgpIC0gX19QQUdFX09GRlNFVCkKQEAgLTkwLDcgKzkxLDcgQEAKIAkKIAkvKiB0ZXN0IEtFRVBfU0VHTUVOVFMgZmxhZyB0byBzZWUgaWYgdGhlIGJvb3Rsb2FkZXIgaXMgYXNraW5nCiAJCXVzIHRvIG5vdCByZWxvYWQgc2VnbWVudHMgKi8KLQl0ZXN0YiAkKDE8PDYpLCBCUF9sb2FkZmxhZ3MoJWVzaSkKKwl0ZXN0YiAkS0VFUF9TRUdNRU5UUywgQlBfbG9hZGZsYWdzKCVlc2kpCiAJam56IDJmCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TIGIvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUwppbmRleCA2ZmQ1MTRkOS4uYWU2NTg4YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2hlYWRfNjQuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICBsaW51eC9hcmNoL3g4Nl82NC9rZXJuZWwvaGVhZC5TIC0tIHN0YXJ0IGluIDMyYml0IGFuZCBzd2l0Y2ggdG8gNjRiaXQKKyAqICBsaW51eC9hcmNoL3g4Ni9rZXJuZWwvaGVhZF82NC5TIC0tIHN0YXJ0IGluIDMyYml0IGFuZCBzd2l0Y2ggdG8gNjRiaXQKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAwIEFuZHJlYSBBcmNhbmdlbGkgPGFuZHJlYUBzdXNlLmRlPiBTdVNFCiAgKiAgQ29weXJpZ2h0IChDKSAyMDAwIFBhdmVsIE1hY2hlayA8cGF2ZWxAc3VzZS5jej4KQEAgLTU2LDcgKzU2LDcgQEAKIAkgKiAlcnNpIGhvbGRzIGEgcGh5c2ljYWwgcG9pbnRlciB0byByZWFsX21vZGVfZGF0YS4KIAkgKgogCSAqIFdlIGNvbWUgaGVyZSBlaXRoZXIgZGlyZWN0bHkgZnJvbSBhIDY0Yml0IGJvb3Rsb2FkZXIsIG9yIGZyb20KLQkgKiBhcmNoL3g4Nl82NC9ib290L2NvbXByZXNzZWQvaGVhZC5TLgorCSAqIGFyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMuCiAJICoKIAkgKiBXZSBvbmx5IGNvbWUgaGVyZSBpbml0aWFsbHkgYXQgYm9vdCBub3RoaW5nIGVsc2UgY29tZXMgaGVyZS4KIAkgKgpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJbGVhcQlsZXZlbDJfa2VybmVsX3BndCglcmlwKSwgJXJkaQogCWxlYXEJNDA5NiglcmRpKSwgJXI4CiAJLyogU2VlIGlmIGl0IGlzIGEgdmFsaWQgcGFnZSB0YWJsZSBlbnRyeSAqLwotMToJdGVzdHEJJDEsIDAoJXJkaSkKKzE6CXRlc3RiCSQxLCAwKCVyZGkpCiAJanoJMmYKIAlhZGRxCSVyYnAsIDAoJXJkaSkKIAkvKiBHbyB0byB0aGUgbmV4dCBwYWdlICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaTM4Ny5jIGIvYXJjaC94ODYva2VybmVsL2kzODcuYwppbmRleCBkNTY1MWZjLi4zNjdmMzlkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaTM4Ny5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pMzg3LmMKQEAgLTQyLDggKzQyLDggQEAKICAqIGJlIHNldCAoc28gdGhhdCB0aGUgY2x0cy9zdHRzIHBhaXIgZG9lcyBub3RoaW5nIHRoYXQgaXMKICAqIHZpc2libGUgaW4gdGhlIGludGVycnVwdGVkIGtlcm5lbCB0aHJlYWQpLgogICoKLSAqIEV4Y2VwdCBmb3IgdGhlIGVhZ2VyZnB1IGNhc2Ugd2hlbiB3ZSByZXR1cm4gMSB1bmxlc3Mgd2UndmUgYWxyZWFkeQotICogYmVlbiBlYWdlciBhbmQgc2F2ZWQgdGhlIHN0YXRlIGluIGtlcm5lbF9mcHVfYmVnaW4oKS4KKyAqIEV4Y2VwdCBmb3IgdGhlIGVhZ2VyZnB1IGNhc2Ugd2hlbiB3ZSByZXR1cm4gdHJ1ZTsgaW4gdGhlIGxpa2VseSBjYXNlCisgKiB0aGUgdGhyZWFkIGhhcyBGUFUgYnV0IHdlIGFyZSBub3QgZ29pbmcgdG8gc2V0L2NsZWFyIFRTLgogICovCiBzdGF0aWMgaW5saW5lIGJvb2wgaW50ZXJydXB0ZWRfa2VybmVsX2ZwdV9pZGxlKHZvaWQpCiB7CkBAIC01MSw3ICs1MSw3IEBACiAJCXJldHVybiBmYWxzZTsKIAogCWlmICh1c2VfZWFnZXJfZnB1KCkpCi0JCXJldHVybiBfX3RocmVhZF9oYXNfZnB1KGN1cnJlbnQpOworCQlyZXR1cm4gdHJ1ZTsKIAogCXJldHVybiAhX190aHJlYWRfaGFzX2ZwdShjdXJyZW50KSAmJgogCQkocmVhZF9jcjAoKSAmIFg4Nl9DUjBfVFMpOwpAQCAtNjgsNyArNjgsNyBAQAogc3RhdGljIGlubGluZSBib29sIGludGVycnVwdGVkX3VzZXJfbW9kZSh2b2lkKQogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gZ2V0X2lycV9yZWdzKCk7Ci0JcmV0dXJuIHJlZ3MgJiYgdXNlcl9tb2RlX3ZtKHJlZ3MpOworCXJldHVybiByZWdzICYmIHVzZXJfbW9kZShyZWdzKTsKIH0KIAogLyoKQEAgLTk0LDkgKzk0LDEwIEBACiAKIAlpZiAoX190aHJlYWRfaGFzX2ZwdShtZSkpIHsKIAkJX19zYXZlX2luaXRfZnB1KG1lKTsKLQl9IGVsc2UgaWYgKCF1c2VfZWFnZXJfZnB1KCkpIHsKKwl9IGVsc2UgewogCQl0aGlzX2NwdV93cml0ZShmcHVfb3duZXJfdGFzaywgTlVMTCk7Ci0JCWNsdHMoKTsKKwkJaWYgKCF1c2VfZWFnZXJfZnB1KCkpCisJCQljbHRzKCk7CiAJfQogfQogRVhQT1JUX1NZTUJPTChfX2tlcm5lbF9mcHVfYmVnaW4pOwpAQCAtMTA3LDcgKzEwOCw3IEBACiAKIAlpZiAoX190aHJlYWRfaGFzX2ZwdShtZSkpIHsKIAkJaWYgKFdBUk5fT04ocmVzdG9yZV9mcHVfY2hlY2tpbmcobWUpKSkKLQkJCWRyb3BfaW5pdF9mcHUobWUpOworCQkJZnB1X3Jlc2V0X3N0YXRlKG1lKTsKIAl9IGVsc2UgaWYgKCF1c2VfZWFnZXJfZnB1KCkpIHsKIAkJc3R0cygpOwogCX0KQEAgLTEyMCwxMCArMTIxLDEzIEBACiB7CiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJaWYgKF9fdGhyZWFkX2hhc19mcHUodHNrKSkgewotCQlfX3NhdmVfaW5pdF9mcHUodHNrKTsKLQkJX190aHJlYWRfZnB1X2VuZCh0c2spOwotCX0gZWxzZQotCQl0c2stPnRocmVhZC5mcHVfY291bnRlciA9IDA7CisJCWlmICh1c2VfZWFnZXJfZnB1KCkpIHsKKwkJCV9fc2F2ZV9mcHUodHNrKTsKKwkJfSBlbHNlIHsKKwkJCV9fc2F2ZV9pbml0X2ZwdSh0c2spOworCQkJX190aHJlYWRfZnB1X2VuZCh0c2spOworCQl9CisJfQogCXByZWVtcHRfZW5hYmxlKCk7CiB9CiBFWFBPUlRfU1lNQk9MKHVubGF6eV9mcHUpOwpAQCAtMjIxLDExICsyMjUsMTIgQEAKIAkJcmV0dXJuOwogCX0KIAorCW1lbXNldChmcHUtPnN0YXRlLCAwLCB4c3RhdGVfc2l6ZSk7CisKIAlpZiAoY3B1X2hhc19meHNyKSB7CiAJCWZ4X2Zpbml0KCZmcHUtPnN0YXRlLT5meHNhdmUpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBpMzg3X2ZzYXZlX3N0cnVjdCAqZnAgPSAmZnB1LT5zdGF0ZS0+ZnNhdmU7Ci0JCW1lbXNldChmcCwgMCwgeHN0YXRlX3NpemUpOwogCQlmcC0+Y3dkID0gMHhmZmZmMDM3ZnU7CiAJCWZwLT5zd2QgPSAweGZmZmYwMDAwdTsKIAkJZnAtPnR3ZCA9IDB4ZmZmZmZmZmZ1OwpAQCAtMjQ3LDcgKzI1Miw3IEBACiAJaWYgKHRza191c2VkX21hdGgodHNrKSkgewogCQlpZiAoY3B1X2hhc19mcHUgJiYgdHNrID09IGN1cnJlbnQpCiAJCQl1bmxhenlfZnB1KHRzayk7Ci0JCXRzay0+dGhyZWFkLmZwdS5sYXN0X2NwdSA9IH4wOworCQl0YXNrX2Rpc2FibGVfbGF6eV9mcHVfcmVzdG9yZSh0c2spOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTMzNiw2ICszNDEsNyBAQAogCQl1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgY291bnQsCiAJCXZvaWQgKmtidWYsIHZvaWQgX191c2VyICp1YnVmKQogeworCXN0cnVjdCB4c2F2ZV9zdHJ1Y3QgKnhzYXZlID0gJnRhcmdldC0+dGhyZWFkLmZwdS5zdGF0ZS0+eHNhdmU7CiAJaW50IHJldDsKIAogCWlmICghY3B1X2hhc194c2F2ZSkKQEAgLTM1MCwxNCArMzU2LDEyIEBACiAJICogbWVtb3J5IGxheW91dCBpbiB0aGUgdGhyZWFkIHN0cnVjdCwgc28gdGhhdCB3ZSBjYW4gY29weSB0aGUgZW50aXJlCiAJICogeHN0YXRlcmVncyB0byB0aGUgdXNlciB1c2luZyBvbmUgdXNlcl9yZWdzZXRfY29weW91dCgpLgogCSAqLwotCW1lbWNweSgmdGFyZ2V0LT50aHJlYWQuZnB1LnN0YXRlLT5meHNhdmUuc3dfcmVzZXJ2ZWQsCi0JICAgICAgIHhzdGF0ZV9meF9zd19ieXRlcywgc2l6ZW9mKHhzdGF0ZV9meF9zd19ieXRlcykpOwotCisJbWVtY3B5KCZ4c2F2ZS0+aTM4Ny5zd19yZXNlcnZlZCwKKwkJeHN0YXRlX2Z4X3N3X2J5dGVzLCBzaXplb2YoeHN0YXRlX2Z4X3N3X2J5dGVzKSk7CiAJLyoKIAkgKiBDb3B5IHRoZSB4c3RhdGUgbWVtb3J5IGxheW91dC4KIAkgKi8KLQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLAotCQkJCSAgJnRhcmdldC0+dGhyZWFkLmZwdS5zdGF0ZS0+eHNhdmUsIDAsIC0xKTsKKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5b3V0KCZwb3MsICZjb3VudCwgJmtidWYsICZ1YnVmLCB4c2F2ZSwgMCwgLTEpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTM2NSw4ICszNjksOCBAQAogCQkgIHVuc2lnbmVkIGludCBwb3MsIHVuc2lnbmVkIGludCBjb3VudCwKIAkJICBjb25zdCB2b2lkICprYnVmLCBjb25zdCB2b2lkIF9fdXNlciAqdWJ1ZikKIHsKKwlzdHJ1Y3QgeHNhdmVfc3RydWN0ICp4c2F2ZSA9ICZ0YXJnZXQtPnRocmVhZC5mcHUuc3RhdGUtPnhzYXZlOwogCWludCByZXQ7Ci0Jc3RydWN0IHhzYXZlX2hkcl9zdHJ1Y3QgKnhzYXZlX2hkcjsKIAogCWlmICghY3B1X2hhc194c2F2ZSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0zNzUsMjIgKzM3OSwxNiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsCi0JCQkJICZ0YXJnZXQtPnRocmVhZC5mcHUuc3RhdGUtPnhzYXZlLCAwLCAtMSk7Ci0KKwlyZXQgPSB1c2VyX3JlZ3NldF9jb3B5aW4oJnBvcywgJmNvdW50LCAma2J1ZiwgJnVidWYsIHhzYXZlLCAwLCAtMSk7CiAJLyoKIAkgKiBteGNzciByZXNlcnZlZCBiaXRzIG11c3QgYmUgbWFza2VkIHRvIHplcm8gZm9yIHNlY3VyaXR5IHJlYXNvbnMuCiAJICovCi0JdGFyZ2V0LT50aHJlYWQuZnB1LnN0YXRlLT5meHNhdmUubXhjc3IgJj0gbXhjc3JfZmVhdHVyZV9tYXNrOwotCi0JeHNhdmVfaGRyID0gJnRhcmdldC0+dGhyZWFkLmZwdS5zdGF0ZS0+eHNhdmUueHNhdmVfaGRyOwotCi0JeHNhdmVfaGRyLT54c3RhdGVfYnYgJj0gcGNudHh0X21hc2s7CisJeHNhdmUtPmkzODcubXhjc3IgJj0gbXhjc3JfZmVhdHVyZV9tYXNrOworCXhzYXZlLT54c2F2ZV9oZHIueHN0YXRlX2J2ICY9IHBjbnR4dF9tYXNrOwogCS8qCiAJICogVGhlc2UgYml0cyBtdXN0IGJlIHplcm8uCiAJICovCi0JbWVtc2V0KHhzYXZlX2hkci0+cmVzZXJ2ZWQsIDAsIDQ4KTsKLQorCW1lbXNldCgmeHNhdmUtPnhzYXZlX2hkci5yZXNlcnZlZCwgMCwgNDgpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pb3BvcnQuYyBiL2FyY2gveDg2L2tlcm5lbC9pb3BvcnQuYwppbmRleCA0ZGRhZjY2Li4zN2RhZTc5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaW9wb3J0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lvcG9ydC5jCkBAIC01NCw3ICs1NCw3IEBACiAJICogYmVjYXVzZSB0aGUgLT5pb19iaXRtYXBfbWF4IHZhbHVlIG11c3QgbWF0Y2ggdGhlIGJpdG1hcAogCSAqIGNvbnRlbnRzOgogCSAqLwotCXRzcyA9ICZwZXJfY3B1KGluaXRfdHNzLCBnZXRfY3B1KCkpOworCXRzcyA9ICZwZXJfY3B1KGNwdV90c3MsIGdldF9jcHUoKSk7CiAKIAlpZiAodHVybl9vbikKIAkJYml0bWFwX2NsZWFyKHQtPmlvX2JpdG1hcF9wdHIsIGZyb20sIG51bSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKaW5kZXggNjdiMWNiZS4uZTU5NTJjMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnEuYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAKIAl0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAljcHVtYXNrX2NvcHkoJm9ubGluZV9uZXcsIGNwdV9vbmxpbmVfbWFzayk7Ci0JY3B1X2NsZWFyKHRoaXNfY3B1LCBvbmxpbmVfbmV3KTsKKwljcHVtYXNrX2NsZWFyX2NwdSh0aGlzX2NwdSwgJm9ubGluZV9uZXcpOwogCiAJdGhpc19jb3VudCA9IDA7CiAJZm9yICh2ZWN0b3IgPSBGSVJTVF9FWFRFUk5BTF9WRUNUT1I7IHZlY3RvciA8IE5SX1ZFQ1RPUlM7IHZlY3RvcisrKSB7CkBAIC0zMDcsNyArMzA3LDcgQEAKIAogCQkJZGF0YSA9IGlycV9kZXNjX2dldF9pcnFfZGF0YShkZXNjKTsKIAkJCWNwdW1hc2tfY29weSgmYWZmaW5pdHlfbmV3LCBkYXRhLT5hZmZpbml0eSk7Ci0JCQljcHVfY2xlYXIodGhpc19jcHUsIGFmZmluaXR5X25ldyk7CisJCQljcHVtYXNrX2NsZWFyX2NwdSh0aGlzX2NwdSwgJmFmZmluaXR5X25ldyk7CiAKIAkJCS8qIERvIG5vdCBjb3VudCBpbmFjdGl2ZSBvciBwZXItY3B1IGlycXMuICovCiAJCQlpZiAoIWlycV9oYXNfYWN0aW9uKGlycSkgfHwgaXJxZF9pc19wZXJfY3B1KGRhdGEpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycV8zMi5jIGIvYXJjaC94ODYva2VybmVsL2lycV8zMi5jCmluZGV4IDI4ZDI4ZjUuLmY5ZmQ4NmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxXzMyLmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogCWlmICh1bmxpa2VseSghZGVzYykpCiAJCXJldHVybiBmYWxzZTsKIAotCWlmICh1c2VyX21vZGVfdm0ocmVncykgfHwgIWV4ZWN1dGVfb25faXJxX3N0YWNrKG92ZXJmbG93LCBkZXNjLCBpcnEpKSB7CisJaWYgKHVzZXJfbW9kZShyZWdzKSB8fCAhZXhlY3V0ZV9vbl9pcnFfc3RhY2sob3ZlcmZsb3csIGRlc2MsIGlycSkpIHsKIAkJaWYgKHVubGlrZWx5KG92ZXJmbG93KSkKIAkJCXByaW50X3N0YWNrX292ZXJmbG93KCk7CiAJCWRlc2MtPmhhbmRsZV9pcnEoaXJxLCBkZXNjKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9pcnFfNjQuYwppbmRleCBlNGI1MDNkLi4zOTRlNjQzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycV82NC5jCkBAIC00NCw3ICs0NCw3IEBACiAJdTY0IGVzdGFja190b3AsIGVzdGFja19ib3R0b207CiAJdTY0IGN1cmJhc2UgPSAodTY0KXRhc2tfc3RhY2tfcGFnZShjdXJyZW50KTsKIAotCWlmICh1c2VyX21vZGVfdm0ocmVncykpCisJaWYgKHVzZXJfbW9kZShyZWdzKSkKIAkJcmV0dXJuOwogCiAJaWYgKHJlZ3MtPnNwID49IGN1cmJhc2UgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSArCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdC5jIGIvYXJjaC94ODYva2VybmVsL2lycWluaXQuYwppbmRleCA3MGUxODFlLi5jZDEwYTY0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0LmMKQEAgLTE3OCw3ICsxNzgsOCBAQAogI2VuZGlmCiAJZm9yX2VhY2hfY2xlYXJfYml0X2Zyb20oaSwgdXNlZF92ZWN0b3JzLCBmaXJzdF9zeXN0ZW1fdmVjdG9yKSB7CiAJCS8qIElBMzJfU1lTQ0FMTF9WRUNUT1IgY291bGQgYmUgdXNlZCBpbiB0cmFwX2luaXQgYWxyZWFkeS4gKi8KLQkJc2V0X2ludHJfZ2F0ZShpLCBpbnRlcnJ1cHRbaSAtIEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUl0pOworCQlzZXRfaW50cl9nYXRlKGksIGlycV9lbnRyaWVzX3N0YXJ0ICsKKwkJCQk4ICogKGkgLSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IpKTsKIAl9CiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJZm9yX2VhY2hfY2xlYXJfYml0X2Zyb20oaSwgdXNlZF92ZWN0b3JzLCBOUl9WRUNUT1JTKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tnZGIuYyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKaW5kZXggN2VjMWQ1Zi4uZDYxNzhkOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2tnZGIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jCkBAIC03Miw3ICs3Miw3IEBACiAJeyAiYngiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgYngpIH0sCiAJeyAiY3giLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgY3gpIH0sCiAJeyAiZHgiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZHgpIH0sCi0JeyAic2kiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZHgpIH0sCisJeyAic2kiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgc2kpIH0sCiAJeyAiZGkiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgZGkpIH0sCiAJeyAiYnAiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgYnApIH0sCiAJeyAic3AiLCA4LCBvZmZzZXRvZihzdHJ1Y3QgcHRfcmVncywgc3ApIH0sCkBAIC0xMjYsMTEgKzEyNiwxMSBAQAogI2lmZGVmIENPTkZJR19YODZfMzIKIAlzd2l0Y2ggKHJlZ25vKSB7CiAJY2FzZSBHREJfU1M6Ci0JCWlmICghdXNlcl9tb2RlX3ZtKHJlZ3MpKQorCQlpZiAoIXVzZXJfbW9kZShyZWdzKSkKIAkJCSoodW5zaWduZWQgbG9uZyAqKW1lbSA9IF9fS0VSTkVMX0RTOwogCQlicmVhazsKIAljYXNlIEdEQl9TUDoKLQkJaWYgKCF1c2VyX21vZGVfdm0ocmVncykpCisJCWlmICghdXNlcl9tb2RlKHJlZ3MpKQogCQkJKih1bnNpZ25lZCBsb25nICopbWVtID0ga2VybmVsX3N0YWNrX3BvaW50ZXIocmVncyk7CiAJCWJyZWFrOwogCWNhc2UgR0RCX0dTOgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2twcm9iZXMvY29yZS5jIGIvYXJjaC94ODYva2VybmVsL2twcm9iZXMvY29yZS5jCmluZGV4IDRlM2Q1YTkuLjFkZWZmZTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9rcHJvYmVzL2NvcmUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva3Byb2Jlcy9jb3JlLmMKQEAgLTM1NCw2ICszNTQsNyBAQAogewogCXN0cnVjdCBpbnNuIGluc247CiAJa3Byb2JlX29wY29kZV90IGJ1ZltNQVhfSU5TTl9TSVpFXTsKKwlpbnQgbGVuZ3RoOwogCXVuc2lnbmVkIGxvbmcgcmVjb3ZlcmVkX2luc24gPQogCQlyZWNvdmVyX3Byb2JlZF9pbnN0cnVjdGlvbihidWYsICh1bnNpZ25lZCBsb25nKXNyYyk7CiAKQEAgLTM2MSwxNiArMzYyLDE4IEBACiAJCXJldHVybiAwOwogCWtlcm5lbF9pbnNuX2luaXQoJmluc24sICh2b2lkICopcmVjb3ZlcmVkX2luc24sIE1BWF9JTlNOX1NJWkUpOwogCWluc25fZ2V0X2xlbmd0aCgmaW5zbik7CisJbGVuZ3RoID0gaW5zbi5sZW5ndGg7CisKIAkvKiBBbm90aGVyIHN1YnN5c3RlbSBwdXRzIGEgYnJlYWtwb2ludCwgZmFpbGVkIHRvIHJlY292ZXIgKi8KIAlpZiAoaW5zbi5vcGNvZGUuYnl0ZXNbMF0gPT0gQlJFQUtQT0lOVF9JTlNUUlVDVElPTikKIAkJcmV0dXJuIDA7Ci0JbWVtY3B5KGRlc3QsIGluc24ua2FkZHIsIGluc24ubGVuZ3RoKTsKKwltZW1jcHkoZGVzdCwgaW5zbi5rYWRkciwgbGVuZ3RoKTsKIAogI2lmZGVmIENPTkZJR19YODZfNjQKIAlpZiAoaW5zbl9yaXBfcmVsYXRpdmUoJmluc24pKSB7CiAJCXM2NCBuZXdkaXNwOwogCQl1OCAqZGlzcDsKLQkJa2VybmVsX2luc25faW5pdCgmaW5zbiwgZGVzdCwgaW5zbi5sZW5ndGgpOworCQlrZXJuZWxfaW5zbl9pbml0KCZpbnNuLCBkZXN0LCBsZW5ndGgpOwogCQlpbnNuX2dldF9kaXNwbGFjZW1lbnQoJmluc24pOwogCQkvKgogCQkgKiBUaGUgY29waWVkIGluc3RydWN0aW9uIHVzZXMgdGhlICVyaXAtcmVsYXRpdmUgYWRkcmVzc2luZwpAQCAtMzk0LDcgKzM5Nyw3IEBACiAJCSooczMyICopIGRpc3AgPSAoczMyKSBuZXdkaXNwOwogCX0KICNlbmRpZgotCXJldHVybiBpbnNuLmxlbmd0aDsKKwlyZXR1cm4gbGVuZ3RoOwogfQogCiBzdGF0aWMgaW50IGFyY2hfY29weV9rcHJvYmUoc3RydWN0IGtwcm9iZSAqcCkKQEAgLTYwMiw3ICs2MDUsNyBAQAogCXN0cnVjdCBrcHJvYmUgKnA7CiAJc3RydWN0IGtwcm9iZV9jdGxibGsgKmtjYjsKIAotCWlmICh1c2VyX21vZGVfdm0ocmVncykpCisJaWYgKHVzZXJfbW9kZShyZWdzKSkKIAkJcmV0dXJuIDA7CiAKIAlhZGRyID0gKGtwcm9iZV9vcGNvZGVfdCAqKShyZWdzLT5pcCAtIHNpemVvZihrcHJvYmVfb3Bjb2RlX3QpKTsKQEAgLTEwMDcsNyArMTAxMCw3IEBACiAJc3RydWN0IGRpZV9hcmdzICphcmdzID0gZGF0YTsKIAlpbnQgcmV0ID0gTk9USUZZX0RPTkU7CiAKLQlpZiAoYXJncy0+cmVncyAmJiB1c2VyX21vZGVfdm0oYXJncy0+cmVncykpCisJaWYgKGFyZ3MtPnJlZ3MgJiYgdXNlcl9tb2RlKGFyZ3MtPnJlZ3MpKQogCQlyZXR1cm4gcmV0OwogCiAJaWYgKHZhbCA9PSBESUVfR1BGKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKaW5kZXggZTM1NGNjNi4uOTQzNTYyMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2t2bS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rdm0uYwpAQCAtNTEzLDcgKzUxMyw3IEBACiAJICogY2FuIGdldCBmYWxzZSBwb3NpdGl2ZXMgdG9vIGVhc2lseSwgZm9yIGV4YW1wbGUgaWYgdGhlIGhvc3QgaXMKIAkgKiBvdmVyY29tbWl0dGVkLgogCSAqLwotCXdhdGNoZG9nX2VuYWJsZV9oYXJkbG9ja3VwX2RldGVjdG9yKGZhbHNlKTsKKwloYXJkbG9ja3VwX2RldGVjdG9yX2Rpc2FibGUoKTsKIH0KIAogc3RhdGljIG5vaW5saW5lIHVpbnQzMl90IF9fa3ZtX2NwdWlkX2Jhc2Uodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUuYyBiL2FyY2gveDg2L2tlcm5lbC9tb2R1bGUuYwppbmRleCA5YmJiOWIzLi4wMDVjMDNlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbW9kdWxlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21vZHVsZS5jCkBAIC0zMyw2ICszMyw3IEBACiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAKICNpZiAwCiAjZGVmaW5lIERFQlVHUChmbXQsIC4uLikJCQkJXApAQCAtNTMsNyArNTQsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnQgZ2V0X21vZHVsZV9sb2FkX29mZnNldCh2b2lkKQogewotCWlmIChrYXNscl9lbmFibGVkKSB7CisJaWYgKGthc2xyX2VuYWJsZWQoKSkgewogCQltdXRleF9sb2NrKCZtb2R1bGVfa2FzbHJfbXV0ZXgpOwogCQkvKgogCQkgKiBDYWxjdWxhdGUgdGhlIG1vZHVsZV9sb2FkX29mZnNldCB0aGUgZmlyc3QgdGltZSB0aGlzCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQuYyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCmluZGV4IDU0OGQyNWYuLmM2MTRkZDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jCkBAIC00NDMsNyArNDQzLDcgQEAKIAkucHRlcF9tb2RpZnlfcHJvdF9zdGFydCA9IF9fcHRlcF9tb2RpZnlfcHJvdF9zdGFydCwKIAkucHRlcF9tb2RpZnlfcHJvdF9jb21taXQgPSBfX3B0ZXBfbW9kaWZ5X3Byb3RfY29tbWl0LAogCi0jaWYgUEFHRVRBQkxFX0xFVkVMUyA+PSAzCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID49IDMKICNpZmRlZiBDT05GSUdfWDg2X1BBRQogCS5zZXRfcHRlX2F0b21pYyA9IG5hdGl2ZV9zZXRfcHRlX2F0b21pYywKIAkucHRlX2NsZWFyID0gbmF0aXZlX3B0ZV9jbGVhciwKQEAgLTQ1NCwxMyArNDU0LDEzIEBACiAJLnBtZF92YWwgPSBQVEVfSURFTlQsCiAJLm1ha2VfcG1kID0gUFRFX0lERU5ULAogCi0jaWYgUEFHRVRBQkxFX0xFVkVMUyA9PSA0CisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKIAkucHVkX3ZhbCA9IFBURV9JREVOVCwKIAkubWFrZV9wdWQgPSBQVEVfSURFTlQsCiAKIAkuc2V0X3BnZCA9IG5hdGl2ZV9zZXRfcGdkLAogI2VuZGlmCi0jZW5kaWYgLyogUEFHRVRBQkxFX0xFVkVMUyA+PSAzICovCisjZW5kaWYgLyogQ09ORklHX1BHVEFCTEVfTEVWRUxTID49IDMgKi8KIAogCS5wdGVfdmFsID0gUFRFX0lERU5ULAogCS5wZ2RfdmFsID0gUFRFX0lERU5ULApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BlcmZfcmVncy5jIGIvYXJjaC94ODYva2VybmVsL3BlcmZfcmVncy5jCmluZGV4IDc4MTg2MWMuLmRhOGNiOTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wZXJmX3JlZ3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGVyZl9yZWdzLmMKQEAgLTEzMSwxMCArMTMxLDExIEBACiAJfQogCiAJLyoKLQkgKiBSSVAsIGZsYWdzLCBhbmQgdGhlIGFyZ3VtZW50IHJlZ2lzdGVycyBhcmUgdXN1YWxseSBzYXZlZC4KLQkgKiBvcmlnX2F4IGlzIHByb2JhYmx5IG9rYXksIHRvby4KKwkgKiBUaGVzZSByZWdpc3RlcnMgYXJlIGFsd2F5cyBzYXZlZCBvbiA2NC1iaXQgc3lzY2FsbCBlbnRyeS4KKwkgKiBPbiAzMi1iaXQgZW50cnkgcG9pbnRzLCB0aGV5IGFyZSBzYXZlZCB0b28gZXhjZXB0IHI4Li5yMTEuCiAJICovCiAJcmVnc191c2VyX2NvcHktPmlwID0gdXNlcl9yZWdzLT5pcDsKKwlyZWdzX3VzZXJfY29weS0+YXggPSB1c2VyX3JlZ3MtPmF4OwogCXJlZ3NfdXNlcl9jb3B5LT5jeCA9IHVzZXJfcmVncy0+Y3g7CiAJcmVnc191c2VyX2NvcHktPmR4ID0gdXNlcl9yZWdzLT5keDsKIAlyZWdzX3VzZXJfY29weS0+c2kgPSB1c2VyX3JlZ3MtPnNpOwpAQCAtMTQ1LDkgKzE0NiwxMiBAQAogCXJlZ3NfdXNlcl9jb3B5LT5yMTEgPSB1c2VyX3JlZ3MtPnIxMTsKIAlyZWdzX3VzZXJfY29weS0+b3JpZ19heCA9IHVzZXJfcmVncy0+b3JpZ19heDsKIAlyZWdzX3VzZXJfY29weS0+ZmxhZ3MgPSB1c2VyX3JlZ3MtPmZsYWdzOworCXJlZ3NfdXNlcl9jb3B5LT5zcCA9IHVzZXJfcmVncy0+c3A7CisJcmVnc191c2VyX2NvcHktPmNzID0gdXNlcl9yZWdzLT5jczsKKwlyZWdzX3VzZXJfY29weS0+c3MgPSB1c2VyX3JlZ3MtPnNzOwogCiAJLyoKLQkgKiBEb24ndCBldmVuIHRyeSB0byByZXBvcnQgdGhlICJyZXN0IiByZWdzLgorCSAqIE1vc3Qgc3lzdGVtIGNhbGxzIGRvbid0IHNhdmUgdGhlc2UgcmVnaXN0ZXJzLCBkb24ndCByZXBvcnQgdGhlbS4KIAkgKi8KIAlyZWdzX3VzZXJfY29weS0+YnggPSAtMTsKIAlyZWdzX3VzZXJfY29weS0+YnAgPSAtMTsKQEAgLTE1OCwzNyArMTYyLDEzIEBACiAKIAkvKgogCSAqIEZvciB0aGlzIHRvIGJlIGF0IGFsbCB1c2VmdWwsIHdlIG5lZWQgYSByZWFzb25hYmxlIGd1ZXNzIGZvcgotCSAqIHNwIGFuZCB0aGUgQUJJLiAgQmUgY2FyZWZ1bDogd2UncmUgaW4gTk1JIGNvbnRleHQsIGFuZCB3ZSdyZQorCSAqIHRoZSBBQkkuICBCZSBjYXJlZnVsOiB3ZSdyZSBpbiBOTUkgY29udGV4dCwgYW5kIHdlJ3JlCiAJICogY29uc2lkZXJpbmcgY3VycmVudCB0byBiZSB0aGUgY3VycmVudCB0YXNrLCBzbyB3ZSBzaG91bGQKIAkgKiBiZSBjYXJlZnVsIG5vdCB0byBsb29rIGF0IGFueSBvdGhlciBwZXJjcHUgdmFyaWFibGVzIHRoYXQgbWlnaHQKIAkgKiBjaGFuZ2UgZHVyaW5nIGNvbnRleHQgc3dpdGNoZXMuCiAJICovCi0JaWYgKElTX0VOQUJMRUQoQ09ORklHX0lBMzJfRU1VTEFUSU9OKSAmJgotCSAgICB0YXNrX3RocmVhZF9pbmZvKGN1cnJlbnQpLT5zdGF0dXMgJiBUU19DT01QQVQpIHsKLQkJLyogRWFzeSBjYXNlOiB3ZSdyZSBpbiBhIGNvbXBhdCBzeXNjYWxsLiAqLwotCQlyZWdzX3VzZXItPmFiaSA9IFBFUkZfU0FNUExFX1JFR1NfQUJJXzMyOwotCQlyZWdzX3VzZXJfY29weS0+c3AgPSB1c2VyX3JlZ3MtPnNwOwotCQlyZWdzX3VzZXJfY29weS0+Y3MgPSB1c2VyX3JlZ3MtPmNzOwotCQlyZWdzX3VzZXJfY29weS0+c3MgPSB1c2VyX3JlZ3MtPnNzOwotCX0gZWxzZSBpZiAodXNlcl9yZWdzLT5vcmlnX2F4ICE9IC0xKSB7Ci0JCS8qCi0JCSAqIFdlJ3JlIHByb2JhYmx5IGluIGEgNjQtYml0IHN5c2NhbGwuCi0JCSAqIFdhcm5pbmc6IHRoaXMgY29kZSBpcyBzZXZlcmVseSByYWN5LiAgQXQgbGVhc3QgaXQncyBiZXR0ZXIKLQkJICogdGhhbiBqdXN0IGJsaW5kbHkgY29weWluZyB1c2VyX3JlZ3MuCi0JCSAqLwotCQlyZWdzX3VzZXItPmFiaSA9IFBFUkZfU0FNUExFX1JFR1NfQUJJXzY0OwotCQlyZWdzX3VzZXJfY29weS0+c3AgPSB0aGlzX2NwdV9yZWFkKG9sZF9yc3ApOwotCQlyZWdzX3VzZXJfY29weS0+Y3MgPSBfX1VTRVJfQ1M7Ci0JCXJlZ3NfdXNlcl9jb3B5LT5zcyA9IF9fVVNFUl9EUzsKLQkJcmVnc191c2VyX2NvcHktPmN4ID0gLTE7ICAvKiB1c3VhbGx5IGNvbnRhaW5zIGdhcmJhZ2UgKi8KLQl9IGVsc2UgewotCQkvKiBXZSdyZSBwcm9iYWJseSBpbiBhbiBpbnRlcnJ1cHQgb3IgZXhjZXB0aW9uLiAqLwotCQlyZWdzX3VzZXItPmFiaSA9IHVzZXJfNjRiaXRfbW9kZSh1c2VyX3JlZ3MpID8KLQkJCVBFUkZfU0FNUExFX1JFR1NfQUJJXzY0IDogUEVSRl9TQU1QTEVfUkVHU19BQklfMzI7Ci0JCXJlZ3NfdXNlcl9jb3B5LT5zcCA9IHVzZXJfcmVncy0+c3A7Ci0JCXJlZ3NfdXNlcl9jb3B5LT5jcyA9IHVzZXJfcmVncy0+Y3M7Ci0JCXJlZ3NfdXNlcl9jb3B5LT5zcyA9IHVzZXJfcmVncy0+c3M7Ci0JfQorCXJlZ3NfdXNlci0+YWJpID0gdXNlcl82NGJpdF9tb2RlKHVzZXJfcmVncykgPworCQlQRVJGX1NBTVBMRV9SRUdTX0FCSV82NCA6IFBFUkZfU0FNUExFX1JFR1NfQUJJXzMyOwogCiAJcmVnc191c2VyLT5yZWdzID0gcmVnc191c2VyX2NvcHk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwppbmRleCAwNDZlMmQ2Li44MjEzZGE2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlci1yZXR1cm4tbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxhc20vc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxhc20vaWRsZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL213YWl0Lmg+CiAjaW5jbHVkZSA8YXNtL2kzODcuaD4KICNpbmNsdWRlIDxhc20vZnB1LWludGVybmFsLmg+CiAjaW5jbHVkZSA8YXNtL2RlYnVncmVnLmg+CkBAIC0zNyw3ICszOCwyNiBAQAogICogc2VjdGlvbi4gU2luY2UgVFNTJ3MgYXJlIGNvbXBsZXRlbHkgQ1BVLWxvY2FsLCB3ZSB3YW50IHRoZW0KICAqIG9uIGV4YWN0IGNhY2hlbGluZSBib3VuZGFyaWVzLCB0byBlbGltaW5hdGUgY2FjaGVsaW5lIHBpbmctcG9uZy4KICAqLwotX192aXNpYmxlIERFRklORV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCB0c3Nfc3RydWN0LCBpbml0X3RzcykgPSBJTklUX1RTUzsKK19fdmlzaWJsZSBERUZJTkVfUEVSX0NQVV9TSEFSRURfQUxJR05FRChzdHJ1Y3QgdHNzX3N0cnVjdCwgY3B1X3RzcykgPSB7CisJLng4Nl90c3MgPSB7CisJCS5zcDAgPSBUT1BfT0ZfSU5JVF9TVEFDSywKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJCS5zczAgPSBfX0tFUk5FTF9EUywKKwkJLnNzMSA9IF9fS0VSTkVMX0NTLAorCQkuaW9fYml0bWFwX2Jhc2UJPSBJTlZBTElEX0lPX0JJVE1BUF9PRkZTRVQsCisjZW5kaWYKKwkgfSwKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJIC8qCisJICAqIE5vdGUgdGhhdCB0aGUgLmlvX2JpdG1hcCBtZW1iZXIgbXVzdCBiZSBleHRyYS1iaWcuIFRoaXMgaXMgYmVjYXVzZQorCSAgKiB0aGUgQ1BVIHdpbGwgYWNjZXNzIGFuIGFkZGl0aW9uYWwgYnl0ZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgSU8KKwkgICogcGVybWlzc2lvbiBiaXRtYXAuIFRoZSBleHRyYSBieXRlIG11c3QgYmUgYWxsIDEgYml0cywgYW5kIG11c3QKKwkgICogYmUgd2l0aGluIHRoZSBsaW1pdC4KKwkgICovCisJLmlvX2JpdG1hcAkJPSB7IFswIC4uLiBJT19CSVRNQVBfTE9OR1NdID0gfjAgfSwKKyNlbmRpZgorfTsKK0VYUE9SVF9QRVJfQ1BVX1NZTUJPTF9HUEwoY3B1X3Rzcyk7CiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgY2hhciwgaXNfaWRsZSk7CkBAIC02OSw4ICs4OSw4IEBACiAKIAlkc3QtPnRocmVhZC5mcHVfY291bnRlciA9IDA7CiAJZHN0LT50aHJlYWQuZnB1Lmhhc19mcHUgPSAwOwotCWRzdC0+dGhyZWFkLmZwdS5sYXN0X2NwdSA9IH4wOwogCWRzdC0+dGhyZWFkLmZwdS5zdGF0ZSA9IE5VTEw7CisJdGFza19kaXNhYmxlX2xhenlfZnB1X3Jlc3RvcmUoZHN0KTsKIAlpZiAodHNrX3VzZWRfbWF0aChzcmMpKSB7CiAJCWludCBlcnIgPSBmcHVfYWxsb2MoJmRzdC0+dGhyZWFkLmZwdSk7CiAJCWlmIChlcnIpCkBAIC0xMDksNyArMTI5LDcgQEAKIAl1bnNpZ25lZCBsb25nICpicCA9IHQtPmlvX2JpdG1hcF9wdHI7CiAKIAlpZiAoYnApIHsKLQkJc3RydWN0IHRzc19zdHJ1Y3QgKnRzcyA9ICZwZXJfY3B1KGluaXRfdHNzLCBnZXRfY3B1KCkpOworCQlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoY3B1X3RzcywgZ2V0X2NwdSgpKTsKIAogCQl0LT5pb19iaXRtYXBfcHRyID0gTlVMTDsKIAkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX0lPX0JJVE1BUCk7CkBAIC0xMzEsMTMgKzE1MSwxOCBAQAogCiAJZmx1c2hfcHRyYWNlX2h3X2JyZWFrcG9pbnQodHNrKTsKIAltZW1zZXQodHNrLT50aHJlYWQudGxzX2FycmF5LCAwLCBzaXplb2YodHNrLT50aHJlYWQudGxzX2FycmF5KSk7Ci0JZHJvcF9pbml0X2ZwdSh0c2spOwotCS8qCi0JICogRnJlZSB0aGUgRlBVIHN0YXRlIGZvciBub24geHNhdmUgcGxhdGZvcm1zLiBUaGV5IGdldCByZWFsbG9jYXRlZAotCSAqIGxhemlseSBhdCB0aGUgZmlyc3QgdXNlLgotCSAqLwotCWlmICghdXNlX2VhZ2VyX2ZwdSgpKQorCisJaWYgKCF1c2VfZWFnZXJfZnB1KCkpIHsKKwkJLyogRlBVIHN0YXRlIHdpbGwgYmUgcmVhbGxvY2F0ZWQgbGF6aWx5IGF0IHRoZSBmaXJzdCB1c2UuICovCisJCWRyb3BfZnB1KHRzayk7CiAJCWZyZWVfdGhyZWFkX3hzdGF0ZSh0c2spOworCX0gZWxzZSBpZiAoIXVzZWRfbWF0aCgpKSB7CisJCS8qIGt0aHJlYWQgZXhlY3MuIFRPRE86IGNsZWFudXAgdGhpcyBob3Jyb3IuICovCisJCWlmIChXQVJOX09OKGluaXRfZnB1KHRzaykpKQorCQkJZm9yY2Vfc2lnKFNJR0tJTEwsIHRzayk7CisJCXVzZXJfZnB1X2JlZ2luKCk7CisJCXJlc3RvcmVfaW5pdF94c3RhdGUoKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGhhcmRfZGlzYWJsZV9UU0Modm9pZCkKQEAgLTM3NywxNCArNDAyLDExIEBACiAKIAkJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgYW1kX2U0MDBfYzFlX21hc2spKSB7CiAJCQljcHVtYXNrX3NldF9jcHUoY3B1LCBhbWRfZTQwMF9jMWVfbWFzayk7Ci0JCQkvKgotCQkJICogRm9yY2UgYnJvYWRjYXN0IHNvIEFDUEkgY2FuIG5vdCBpbnRlcmZlcmUuCi0JCQkgKi8KLQkJCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9GT1JDRSwKLQkJCQkJICAgJmNwdSk7CisJCQkvKiBGb3JjZSBicm9hZGNhc3Qgc28gQUNQSSBjYW4gbm90IGludGVyZmVyZS4gKi8KKwkJCXRpY2tfYnJvYWRjYXN0X2ZvcmNlKCk7CiAJCQlwcl9pbmZvKCJTd2l0Y2ggdG8gYnJvYWRjYXN0IG1vZGUgb24gQ1BVJWRcbiIsIGNwdSk7CiAJCX0KLQkJY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VOVEVSLCAmY3B1KTsKKwkJdGlja19icm9hZGNhc3RfZW50ZXIoKTsKIAogCQlkZWZhdWx0X2lkbGUoKTsKIApAQCAtMzkzLDEyICs0MTUsNTkgQEAKIAkJICogY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KIAkJICovCiAJCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0JCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElULCAmY3B1KTsKKwkJdGlja19icm9hZGNhc3RfZXhpdCgpOwogCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJfSBlbHNlCiAJCWRlZmF1bHRfaWRsZSgpOwogfQogCisvKgorICogSW50ZWwgQ29yZTIgYW5kIG9sZGVyIG1hY2hpbmVzIHByZWZlciBNV0FJVCBvdmVyIEhBTFQgZm9yIEMxLgorICogV2UgY2FuJ3QgcmVseSBvbiBjcHVpZGxlIGluc3RhbGxpbmcgTVdBSVQsIGJlY2F1c2UgaXQgd2lsbCBub3QgbG9hZAorICogb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgb25seSBDMSAtLSBzbyB0aGUgYm9vdCBkZWZhdWx0IG11c3QgYmUgTVdBSVQuCisgKgorICogU29tZSBBTUQgbWFjaGluZXMgYXJlIHRoZSBvcHBvc2l0ZSwgdGhleSBkZXBlbmQgb24gdXNpbmcgSEFMVC4KKyAqCisgKiBTbyBmb3IgZGVmYXVsdCBDMSwgd2hpY2ggaXMgdXNlZCBkdXJpbmcgYm9vdCB1bnRpbCBjcHVpZGxlIGxvYWRzLAorICogdXNlIE1XQUlULUMxIG9uIEludGVsIEhXIHRoYXQgaGFzIGl0LCBlbHNlIHVzZSBIQUxULgorICovCitzdGF0aWMgaW50IHByZWZlcl9td2FpdF9jMV9vdmVyX2hhbHQoY29uc3Qgc3RydWN0IGNwdWluZm9feDg2ICpjKQoreworCWlmIChjLT54ODZfdmVuZG9yICE9IFg4Nl9WRU5ET1JfSU5URUwpCisJCXJldHVybiAwOworCisJaWYgKCFjcHVfaGFzKGMsIFg4Nl9GRUFUVVJFX01XQUlUKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIE1PTklUT1IvTVdBSVQgd2l0aCBubyBoaW50cywgdXNlZCBmb3IgZGVmYXVsdCBkZWZhdWx0IEMxIHN0YXRlLgorICogVGhpcyBpbnZva2VzIE1XQUlUIHdpdGggaW50ZXJydXRwcyBlbmFibGVkIGFuZCBubyBmbGFncywKKyAqIHdoaWNoIGlzIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggdGhlIG9yaWdpbmFsIE1XQUlUIGltcGxlbWVudGF0aW9uLgorICovCisKK3N0YXRpYyB2b2lkIG13YWl0X2lkbGUodm9pZCkKK3sKKwlpZiAoIWN1cnJlbnRfc2V0X3BvbGxpbmdfYW5kX3Rlc3QoKSkgeworCQlpZiAodGhpc19jcHVfaGFzKFg4Nl9CVUdfQ0xGTFVTSF9NT05JVE9SKSkgeworCQkJc21wX21iKCk7IC8qIHF1aXJrICovCisJCQljbGZsdXNoKCh2b2lkICopJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MpOworCQkJc21wX21iKCk7IC8qIHF1aXJrICovCisJCX0KKworCQlfX21vbml0b3IoKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncywgMCwgMCk7CisJCWlmICghbmVlZF9yZXNjaGVkKCkpCisJCQlfX3N0aV9td2FpdCgwLCAwKTsKKwkJZWxzZQorCQkJbG9jYWxfaXJxX2VuYWJsZSgpOworCX0gZWxzZSB7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwl9CisJX19jdXJyZW50X2Nscl9wb2xsaW5nKCk7Cit9CisKIHZvaWQgc2VsZWN0X2lkbGVfcm91dGluZShjb25zdCBzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAjaWZkZWYgQ09ORklHX1NNUApAQCAtNDEyLDYgKzQ4MSw5IEBACiAJCS8qIEU0MDA6IEFQSUMgdGltZXIgaW50ZXJydXB0IGRvZXMgbm90IHdha2UgdXAgQ1BVIGZyb20gQzFlICovCiAJCXByX2luZm8oInVzaW5nIEFNRCBFNDAwIGF3YXJlIGlkbGUgcm91dGluZVxuIik7CiAJCXg4Nl9pZGxlID0gYW1kX2U0MDBfaWRsZTsKKwl9IGVsc2UgaWYgKHByZWZlcl9td2FpdF9jMV9vdmVyX2hhbHQoYykpIHsKKwkJcHJfaW5mbygidXNpbmcgbXdhaXQgaW4gaWRsZSB0aHJlYWRzXG4iKTsKKwkJeDg2X2lkbGUgPSBtd2FpdF9pZGxlOwogCX0gZWxzZQogCQl4ODZfaWRsZSA9IGRlZmF1bHRfaWRsZTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IDYwM2M0ZjkuLjhlZDIxMDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwpAQCAtNzMsNyArNzMsNyBAQAogCXVuc2lnbmVkIGxvbmcgc3A7CiAJdW5zaWduZWQgc2hvcnQgc3MsIGdzOwogCi0JaWYgKHVzZXJfbW9kZV92bShyZWdzKSkgeworCWlmICh1c2VyX21vZGUocmVncykpIHsKIAkJc3AgPSByZWdzLT5zcDsKIAkJc3MgPSByZWdzLT5zcyAmIDB4ZmZmZjsKIAkJZ3MgPSBnZXRfdXNlcl9ncyhyZWdzKTsKQEAgLTIwNiwxMSArMjA2LDcgQEAKIAlyZWdzLT5pcAkJPSBuZXdfaXA7CiAJcmVncy0+c3AJCT0gbmV3X3NwOwogCXJlZ3MtPmZsYWdzCQk9IFg4Nl9FRkxBR1NfSUY7Ci0JLyoKLQkgKiBmb3JjZSBpdCB0byB0aGUgaXJldCByZXR1cm4gcGF0aCBieSBtYWtpbmcgaXQgbG9vayBhcyBpZiB0aGVyZSB3YXMKLQkgKiBzb21lIHdvcmsgcGVuZGluZy4KLQkgKi8KLQlzZXRfdGhyZWFkX2ZsYWcoVElGX05PVElGWV9SRVNVTUUpOworCWZvcmNlX2lyZXQoKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHN0YXJ0X3RocmVhZCk7CiAKQEAgLTI0OCw3ICsyNDQsNyBAQAogCXN0cnVjdCB0aHJlYWRfc3RydWN0ICpwcmV2ID0gJnByZXZfcC0+dGhyZWFkLAogCQkJCSAqbmV4dCA9ICZuZXh0X3AtPnRocmVhZDsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXN0cnVjdCB0c3Nfc3RydWN0ICp0c3MgPSAmcGVyX2NwdShpbml0X3RzcywgY3B1KTsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoY3B1X3RzcywgY3B1KTsKIAlmcHVfc3dpdGNoX3QgZnB1OwogCiAJLyogbmV2ZXIgcHV0IGEgcHJpbnRrIGluIF9fc3dpdGNoX3RvLi4uIHByaW50aygpIGNhbGxzIHdha2VfdXAqKCkgaW5kaXJlY3RseSAqLwpAQCAtMjU2LDExICsyNTIsNiBAQAogCWZwdSA9IHN3aXRjaF9mcHVfcHJlcGFyZShwcmV2X3AsIG5leHRfcCwgY3B1KTsKIAogCS8qCi0JICogUmVsb2FkIGVzcDAuCi0JICovCi0JbG9hZF9zcDAodHNzLCBuZXh0KTsKLQotCS8qCiAJICogU2F2ZSBhd2F5ICVncy4gTm8gbmVlZCB0byBzYXZlICVmcywgYXMgaXQgd2FzIHNhdmVkIG9uIHRoZQogCSAqIHN0YWNrIG9uIGVudHJ5LiAgTm8gbmVlZCB0byBzYXZlICVlcyBhbmQgJWRzLCBhcyB0aG9zZSBhcmUKIAkgKiBhbHdheXMga2VybmVsIHNlZ21lbnRzIHdoaWxlIGluc2lkZSB0aGUga2VybmVsLiAgRG9pbmcgdGhpcwpAQCAtMzEwLDkgKzMwMSwxNyBAQAogCSAqLwogCWFyY2hfZW5kX2NvbnRleHRfc3dpdGNoKG5leHRfcCk7CiAKKwkvKgorCSAqIFJlbG9hZCBlc3AwLCBrZXJuZWxfc3RhY2ssIGFuZCBjdXJyZW50X3RvcF9vZl9zdGFjay4gIFRoaXMgY2hhbmdlcworCSAqIGN1cnJlbnRfdGhyZWFkX2luZm8oKS4KKwkgKi8KKwlsb2FkX3NwMCh0c3MsIG5leHQpOwogCXRoaXNfY3B1X3dyaXRlKGtlcm5lbF9zdGFjaywKLQkJICAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UobmV4dF9wKSArCi0JCSAgVEhSRUFEX1NJWkUgLSBLRVJORUxfU1RBQ0tfT0ZGU0VUKTsKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShuZXh0X3ApICsKKwkJICAgICAgIFRIUkVBRF9TSVpFKTsKKwl0aGlzX2NwdV93cml0ZShjcHVfY3VycmVudF90b3Bfb2Zfc3RhY2ssCisJCSAgICAgICAodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UobmV4dF9wKSArCisJCSAgICAgICBUSFJFQURfU0laRSk7CiAKIAkvKgogCSAqIFJlc3RvcmUgJWdzIGlmIG5lZWRlZCAod2hpY2ggaXMgY29tbW9uKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKaW5kZXggNjdmY2M0My4uNGJhYWE5NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCkBAIC01Miw3ICs1Miw3IEBACiAKIGFzbWxpbmthZ2UgZXh0ZXJuIHZvaWQgcmV0X2Zyb21fZm9yayh2b2lkKTsKIAotX192aXNpYmxlIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIG9sZF9yc3ApOworX192aXNpYmxlIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIHJzcF9zY3JhdGNoKTsKIAogLyogUHJpbnRzIGFsc28gc29tZSBzdGF0ZSB0aGF0IGlzbid0IHNhdmVkIGluIHRoZSBwdF9yZWdzICovCiB2b2lkIF9fc2hvd19yZWdzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgYWxsKQpAQCAtMTYxLDcgKzE2MSw2IEBACiAJcC0+dGhyZWFkLnNwMCA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFOwogCWNoaWxkcmVncyA9IHRhc2tfcHRfcmVncyhwKTsKIAlwLT50aHJlYWQuc3AgPSAodW5zaWduZWQgbG9uZykgY2hpbGRyZWdzOwotCXAtPnRocmVhZC51c2Vyc3AgPSBtZS0+dGhyZWFkLnVzZXJzcDsKIAlzZXRfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9GT1JLKTsKIAlwLT50aHJlYWQuaW9fYml0bWFwX3B0ciA9IE5VTEw7CiAKQEAgLTIwNyw3ICsyMDYsNyBAQAogCSAqLwogCWlmIChjbG9uZV9mbGFncyAmIENMT05FX1NFVFRMUykgewogI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgotCQlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfSUEzMikpCisJCWlmIChpc19pYTMyX3Rhc2soKSkKIAkJCWVyciA9IGRvX3NldF90aHJlYWRfYXJlYShwLCAtMSwKIAkJCQkoc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKiljaGlsZHJlZ3MtPnNpLCAwKTsKIAkJZWxzZQpAQCAtMjM1LDEzICsyMzQsMTIgQEAKIAlsb2Fkc2VnbWVudChlcywgX2RzKTsKIAlsb2Fkc2VnbWVudChkcywgX2RzKTsKIAlsb2FkX2dzX2luZGV4KDApOwotCWN1cnJlbnQtPnRocmVhZC51c2Vyc3AJPSBuZXdfc3A7CiAJcmVncy0+aXAJCT0gbmV3X2lwOwogCXJlZ3MtPnNwCQk9IG5ld19zcDsKLQl0aGlzX2NwdV93cml0ZShvbGRfcnNwLCBuZXdfc3ApOwogCXJlZ3MtPmNzCQk9IF9jczsKIAlyZWdzLT5zcwkJPSBfc3M7CiAJcmVncy0+ZmxhZ3MJCT0gWDg2X0VGTEFHU19JRjsKKwlmb3JjZV9pcmV0KCk7CiB9CiAKIHZvaWQKQEAgLTI3NywxNSArMjc1LDEyIEBACiAJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnByZXYgPSAmcHJldl9wLT50aHJlYWQ7CiAJc3RydWN0IHRocmVhZF9zdHJ1Y3QgKm5leHQgPSAmbmV4dF9wLT50aHJlYWQ7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGNwdSk7CisJc3RydWN0IHRzc19zdHJ1Y3QgKnRzcyA9ICZwZXJfY3B1KGNwdV90c3MsIGNwdSk7CiAJdW5zaWduZWQgZnNpbmRleCwgZ3NpbmRleDsKIAlmcHVfc3dpdGNoX3QgZnB1OwogCiAJZnB1ID0gc3dpdGNoX2ZwdV9wcmVwYXJlKHByZXZfcCwgbmV4dF9wLCBjcHUpOwogCi0JLyogUmVsb2FkIGVzcDAgYW5kIHNzMS4gKi8KLQlsb2FkX3NwMCh0c3MsIG5leHQpOwotCiAJLyogV2UgbXVzdCBzYXZlICVmcyBhbmQgJWdzIGJlZm9yZSBsb2FkX1RMUygpIGJlY2F1c2UKIAkgKiAlZnMgYW5kICVncyBtYXkgYmUgY2xlYXJlZCBieSBsb2FkX1RMUygpLgogCSAqCkBAIC00MDEsOCArMzk2LDYgQEAKIAkvKgogCSAqIFN3aXRjaCB0aGUgUERBIGFuZCBGUFUgY29udGV4dHMuCiAJICovCi0JcHJldi0+dXNlcnNwID0gdGhpc19jcHVfcmVhZChvbGRfcnNwKTsKLQl0aGlzX2NwdV93cml0ZShvbGRfcnNwLCBuZXh0LT51c2Vyc3ApOwogCXRoaXNfY3B1X3dyaXRlKGN1cnJlbnRfdGFzaywgbmV4dF9wKTsKIAogCS8qCkBAIC00MTMsOSArNDA2LDExIEBACiAJdGFza190aHJlYWRfaW5mbyhwcmV2X3ApLT5zYXZlZF9wcmVlbXB0X2NvdW50ID0gdGhpc19jcHVfcmVhZChfX3ByZWVtcHRfY291bnQpOwogCXRoaXNfY3B1X3dyaXRlKF9fcHJlZW1wdF9jb3VudCwgdGFza190aHJlYWRfaW5mbyhuZXh0X3ApLT5zYXZlZF9wcmVlbXB0X2NvdW50KTsKIAorCS8qIFJlbG9hZCBlc3AwIGFuZCBzczEuICBUaGlzIGNoYW5nZXMgY3VycmVudF90aHJlYWRfaW5mbygpLiAqLworCWxvYWRfc3AwKHRzcywgbmV4dCk7CisKIAl0aGlzX2NwdV93cml0ZShrZXJuZWxfc3RhY2ssCi0JCSAgKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKG5leHRfcCkgKwotCQkgIFRIUkVBRF9TSVpFIC0gS0VSTkVMX1NUQUNLX09GRlNFVCk7CisJCSh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShuZXh0X3ApICsgVEhSRUFEX1NJWkUpOwogCiAJLyoKIAkgKiBOb3cgbWF5YmUgcmVsb2FkIHRoZSBkZWJ1ZyByZWdpc3RlcnMgYW5kIGhhbmRsZSBJL08gYml0bWFwcwpAQCAtNjAyLDYgKzU5Nyw1IEBACiAKIHVuc2lnbmVkIGxvbmcgS1NUS19FU1Aoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewotCXJldHVybiAodGVzdF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX0lBMzIpKSA/Ci0JCQkodGFza19wdF9yZWdzKHRhc2spLT5zcCkgOiAoKHRhc2spLT50aHJlYWQudXNlcnNwKTsKKwlyZXR1cm4gdGFza19wdF9yZWdzKHRhc2spLT5zcDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYwppbmRleCBlNTEwNjE4Li5hN2JjNzk0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCkBAIC0zNjQsMTggKzM2NCwxMiBAQAogCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3QsY3MpOgogCQlpZiAodW5saWtlbHkodmFsdWUgPT0gMCkpCiAJCQlyZXR1cm4gLUVJTzsKLSNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLQkJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9JQTMyKSkKLQkJCXRhc2tfcHRfcmVncyh0YXNrKS0+Y3MgPSB2YWx1ZTsKLSNlbmRpZgorCQl0YXNrX3B0X3JlZ3ModGFzayktPmNzID0gdmFsdWU7CiAJCWJyZWFrOwogCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IHVzZXJfcmVnc19zdHJ1Y3Qsc3MpOgogCQlpZiAodW5saWtlbHkodmFsdWUgPT0gMCkpCiAJCQlyZXR1cm4gLUVJTzsKLSNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KLQkJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9JQTMyKSkKLQkJCXRhc2tfcHRfcmVncyh0YXNrKS0+c3MgPSB2YWx1ZTsKLSNlbmRpZgorCQl0YXNrX3B0X3JlZ3ModGFzayktPnNzID0gdmFsdWU7CiAJCWJyZWFrOwogCX0KIApAQCAtMTQyMSw3ICsxNDE1LDcgQEAKIAltZW1zZXQoaW5mbywgMCwgc2l6ZW9mKCppbmZvKSk7CiAJaW5mby0+c2lfc2lnbm8gPSBTSUdUUkFQOwogCWluZm8tPnNpX2NvZGUgPSBzaV9jb2RlOwotCWluZm8tPnNpX2FkZHIgPSB1c2VyX21vZGVfdm0ocmVncykgPyAodm9pZCBfX3VzZXIgKilyZWdzLT5pcCA6IE5VTEw7CisJaW5mby0+c2lfYWRkciA9IHVzZXJfbW9kZShyZWdzKSA/ICh2b2lkIF9fdXNlciAqKXJlZ3MtPmlwIDogTlVMTDsKIH0KIAogdm9pZCB1c2VyX3NpbmdsZV9zdGVwX3NpZ2luZm8oc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHZjbG9jay5jIGIvYXJjaC94ODYva2VybmVsL3B2Y2xvY2suYwppbmRleCAyZjM1NWQyLi5lNWVjZDIwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHZjbG9jay5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wdmNsb2NrLmMKQEAgLTE0MSw3ICsxNDEsNDYgQEAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYyh0cywgbm93LnR2X3NlYywgbm93LnR2X25zZWMpOwogfQogCitzdGF0aWMgc3RydWN0IHB2Y2xvY2tfdnN5c2NhbGxfdGltZV9pbmZvICpwdmNsb2NrX3Zkc29faW5mbzsKKworc3RhdGljIHN0cnVjdCBwdmNsb2NrX3ZzeXNjYWxsX3RpbWVfaW5mbyAqCitwdmNsb2NrX2dldF92c3lzY2FsbF91c2VyX3RpbWVfaW5mbyhpbnQgY3B1KQoreworCWlmICghcHZjbG9ja192ZHNvX2luZm8pIHsKKwkJQlVHKCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAmcHZjbG9ja192ZHNvX2luZm9bY3B1XTsKK30KKworc3RydWN0IHB2Y2xvY2tfdmNwdV90aW1lX2luZm8gKnB2Y2xvY2tfZ2V0X3ZzeXNjYWxsX3RpbWVfaW5mbyhpbnQgY3B1KQoreworCXJldHVybiAmcHZjbG9ja19nZXRfdnN5c2NhbGxfdXNlcl90aW1lX2luZm8oY3B1KS0+cHZ0aTsKK30KKwogI2lmZGVmIENPTkZJR19YODZfNjQKK3N0YXRpYyBpbnQgcHZjbG9ja190YXNrX21pZ3JhdGUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBsLAorCQkJICAgICAgICB2b2lkICp2KQoreworCXN0cnVjdCB0YXNrX21pZ3JhdGlvbl9ub3RpZmllciAqbW4gPSB2OworCXN0cnVjdCBwdmNsb2NrX3ZzeXNjYWxsX3RpbWVfaW5mbyAqcHZ0aTsKKworCXB2dGkgPSBwdmNsb2NrX2dldF92c3lzY2FsbF91c2VyX3RpbWVfaW5mbyhtbi0+ZnJvbV9jcHUpOworCisJLyogdGhpcyBpcyBOVUxMIHdoZW4gcHZjbG9jayB2c3lzY2FsbCBpcyBub3QgaW5pdGlhbGl6ZWQgKi8KKwlpZiAodW5saWtlbHkocHZ0aSA9PSBOVUxMKSkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJcHZ0aS0+bWlncmF0ZV9jb3VudCsrOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHB2Y2xvY2tfbWlncmF0ZSA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHB2Y2xvY2tfdGFza19taWdyYXRlLAorfTsKKwogLyoKICAqIEluaXRpYWxpemUgdGhlIGdlbmVyaWMgcHZjbG9jayB2c3lzY2FsbCBzdGF0ZS4gIFRoaXMgd2lsbCBhbGxvY2F0ZQogICogYS9zb21lIHBhZ2UocykgZm9yIHRoZSBwZXItdmNwdSBwdmNsb2NrIGluZm9ybWF0aW9uLCBzZXQgdXAgYQpAQCAtMTU1LDEyICsxOTQsMTcgQEAKIAogCVdBUk5fT04gKHNpemUgIT0gUFZDTE9DS19WU1lTQ0FMTF9OUl9QQUdFUypQQUdFX1NJWkUpOwogCisJcHZjbG9ja192ZHNvX2luZm8gPSBpOworCiAJZm9yIChpZHggPSAwOyBpZHggPD0gKFBWQ0xPQ0tfRklYTUFQX0VORC1QVkNMT0NLX0ZJWE1BUF9CRUdJTik7IGlkeCsrKSB7CiAJCV9fc2V0X2ZpeG1hcChQVkNMT0NLX0ZJWE1BUF9CRUdJTiArIGlkeCwKIAkJCSAgICAgX19wYShpKSArIChpZHgqUEFHRV9TSVpFKSwKIAkJCSAgICAgUEFHRV9LRVJORUxfVlZBUik7CiAJfQogCisKKwlyZWdpc3Rlcl90YXNrX21pZ3JhdGlvbl9ub3RpZmllcigmcHZjbG9ja19taWdyYXRlKTsKKwogCXJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggYmFlNmM2MC4uODZkYjRiYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtMTgzLDYgKzE4MywxNiBAQAogCQl9LAogCX0sCiAKKwkvKiBBU1JvY2sgKi8KKwl7CS8qIEhhbmRsZSBwcm9ibGVtcyB3aXRoIHJlYm9vdGluZyBvbiBBU1JvY2sgUTE5MDBEQy1JVFggKi8KKwkJLmNhbGxiYWNrID0gc2V0X3BjaV9yZWJvb3QsCisJCS5pZGVudCA9ICJBU1JvY2sgUTE5MDBEQy1JVFgiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNSb2NrIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJRMTkwMERDLUlUWCIpLAorCQl9LAorCX0sCisKIAkvKiBBU1VTICovCiAJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gQVNVUyBQNFM4MDAgKi8KIAkJLmNhbGxiYWNrID0gc2V0X2Jpb3NfcmVib290LApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3JlbG9jYXRlX2tlcm5lbF8zMi5TIGIvYXJjaC94ODYva2VybmVsL3JlbG9jYXRlX2tlcm5lbF8zMi5TCmluZGV4IGUxM2Y4ZTcuLjc3NjMwZDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWxfMzIuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcmVsb2NhdGVfa2VybmVsXzMyLlMKQEAgLTIyNiwyMyArMjI2LDIzIEBACiAJbW92bAkoJWVieCksICVlY3gKIAlhZGRsCSQ0LCAlZWJ4CiAxOgotCXRlc3RsCSQweDEsICAgJWVjeCAgLyogaXMgaXQgYSBkZXN0aW5hdGlvbiBwYWdlICovCisJdGVzdGIJJDB4MSwgJWNsICAgICAvKiBpcyBpdCBhIGRlc3RpbmF0aW9uIHBhZ2UgKi8KIAlqegkyZgogCW1vdmwJJWVjeCwJJWVkaQogCWFuZGwJJDB4ZmZmZmYwMDAsICVlZGkKIAlqbXAgICAgIDBiCiAyOgotCXRlc3RsCSQweDIsCSVlY3ggIC8qIGlzIGl0IGFuIGluZGlyZWN0aW9uIHBhZ2UgKi8KKwl0ZXN0YgkkMHgyLCAlY2wgICAgLyogaXMgaXQgYW4gaW5kaXJlY3Rpb24gcGFnZSAqLwogCWp6CTJmCiAJbW92bAklZWN4LAklZWJ4CiAJYW5kbAkkMHhmZmZmZjAwMCwgJWVieAogCWptcCAgICAgMGIKIDI6Ci0JdGVzdGwgICAkMHg0LCAgICVlY3ggLyogaXMgaXQgdGhlIGRvbmUgaW5kaWNhdG9yICovCisJdGVzdGIgICAkMHg0LCAlY2wgICAgLyogaXMgaXQgdGhlIGRvbmUgaW5kaWNhdG9yICovCiAJanogICAgICAyZgogCWptcCAgICAgM2YKIDI6Ci0JdGVzdGwgICAkMHg4LCAgICVlY3ggLyogaXMgaXQgdGhlIHNvdXJjZSBpbmRpY2F0b3IgKi8KKwl0ZXN0YiAgICQweDgsICVjbCAgICAvKiBpcyBpdCB0aGUgc291cmNlIGluZGljYXRvciAqLwogCWp6ICAgICAgMGIJICAgICAvKiBJZ25vcmUgaXQgb3RoZXJ3aXNlICovCiAJbW92bCAgICAlZWN4LCAgICVlc2kgLyogRm9yIGV2ZXJ5IHNvdXJjZSBwYWdlIGRvIGEgY29weSAqLwogCWFuZGwgICAgJDB4ZmZmZmYwMDAsICVlc2kKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWxfNjQuUyBiL2FyY2gveDg2L2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWxfNjQuUwppbmRleCAzZmQyYzY5Li45ODExMWIzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcmVsb2NhdGVfa2VybmVsXzY0LlMKKysrIGIvYXJjaC94ODYva2VybmVsL3JlbG9jYXRlX2tlcm5lbF82NC5TCkBAIC0xMjMsNyArMTIzLDcgQEAKIAkgKiBTZXQgY3I0IHRvIGEga25vd24gc3RhdGU6CiAJICogIC0gcGh5c2ljYWwgYWRkcmVzcyBleHRlbnNpb24gZW5hYmxlZAogCSAqLwotCW1vdnEJJFg4Nl9DUjRfUEFFLCAlcmF4CisJbW92bAkkWDg2X0NSNF9QQUUsICVlYXgKIAltb3ZxCSVyYXgsICVjcjQKIAogCWptcCAxZgpAQCAtMjIxLDIzICsyMjEsMjMgQEAKIAltb3ZxCSglcmJ4KSwgJXJjeAogCWFkZHEJJDgsCSVyYngKIDE6Ci0JdGVzdHEJJDB4MSwJJXJjeCAgLyogaXMgaXQgYSBkZXN0aW5hdGlvbiBwYWdlPyAqLworCXRlc3RiCSQweDEsCSVjbCAgIC8qIGlzIGl0IGEgZGVzdGluYXRpb24gcGFnZT8gKi8KIAlqegkyZgogCW1vdnEJJXJjeCwJJXJkaQogCWFuZHEJJDB4ZmZmZmZmZmZmZmZmZjAwMCwgJXJkaQogCWptcAkwYgogMjoKLQl0ZXN0cQkkMHgyLAklcmN4ICAvKiBpcyBpdCBhbiBpbmRpcmVjdGlvbiBwYWdlPyAqLworCXRlc3RiCSQweDIsCSVjbCAgIC8qIGlzIGl0IGFuIGluZGlyZWN0aW9uIHBhZ2U/ICovCiAJanoJMmYKIAltb3ZxCSVyY3gsICAgJXJieAogCWFuZHEJJDB4ZmZmZmZmZmZmZmZmZjAwMCwgJXJieAogCWptcAkwYgogMjoKLQl0ZXN0cQkkMHg0LAklcmN4ICAvKiBpcyBpdCB0aGUgZG9uZSBpbmRpY2F0b3I/ICovCisJdGVzdGIJJDB4NCwJJWNsICAgLyogaXMgaXQgdGhlIGRvbmUgaW5kaWNhdG9yPyAqLwogCWp6CTJmCiAJam1wCTNmCiAyOgotCXRlc3RxCSQweDgsCSVyY3ggIC8qIGlzIGl0IHRoZSBzb3VyY2UgaW5kaWNhdG9yPyAqLworCXRlc3RiCSQweDgsCSVjbCAgIC8qIGlzIGl0IHRoZSBzb3VyY2UgaW5kaWNhdG9yPyAqLwogCWp6CTBiCSAgICAgIC8qIElnbm9yZSBpdCBvdGhlcndpc2UgKi8KIAltb3ZxCSVyY3gsICAgJXJzaSAgLyogRm9yIGV2ZXIgc291cmNlIHBhZ2UgZG8gYSBjb3B5ICovCiAJYW5kcQkkMHhmZmZmZmZmZmZmZmZmMDAwLCAlcnNpCkBAIC0yNDYsMTcgKzI0NiwxNyBAQAogCW1vdnEJJXJzaSwgJXJheAogCiAJbW92cQklcjEwLCAlcmRpCi0JbW92cQkkNTEyLCAgICVyY3gKKwltb3ZsCSQ1MTIsICVlY3gKIAlyZXAgOyBtb3ZzcQogCiAJbW92cQklcmF4LCAlcmRpCiAJbW92cQklcmR4LCAlcnNpCi0JbW92cQkkNTEyLCAgICVyY3gKKwltb3ZsCSQ1MTIsICVlY3gKIAlyZXAgOyBtb3ZzcQogCiAJbW92cQklcmR4LCAlcmRpCiAJbW92cQklcjEwLCAlcnNpCi0JbW92cQkkNTEyLCAgICVyY3gKKwltb3ZsCSQ1MTIsICVlY3gKIAlyZXAgOyBtb3ZzcQogCiAJbGVhCVBBR0VfU0laRSglcmF4KSwgJXJzaQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NldHVwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYwppbmRleCA5OGRjOTMxLi5kNzRhYzMzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYwpAQCAtMTIyLDggKzEyMiw2IEBACiB1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuX21hcHBlZDsKIHVuc2lnbmVkIGxvbmcgbWF4X3Bmbl9tYXBwZWQ7CiAKLWJvb2wgX19yZWFkX21vc3RseSBrYXNscl9lbmFibGVkID0gZmFsc2U7Ci0KICNpZmRlZiBDT05GSUdfRE1JCiBSRVNFUlZFX0JSSyhkbWlfYWxsb2MsIDY1NTM2KTsKICNlbmRpZgpAQCAtMzU2LDcgKzM1NCw3IEBACiAJCW1hcGFkZHIgPSByYW1kaXNrX2ltYWdlICYgUEFHRV9NQVNLOwogCQlwID0gZWFybHlfbWVtcmVtYXAobWFwYWRkciwgY2xlbitzbG9wKTsKIAkJbWVtY3B5KHEsIHArc2xvcCwgY2xlbik7Ci0JCWVhcmx5X2lvdW5tYXAocCwgY2xlbitzbG9wKTsKKwkJZWFybHlfbWVtdW5tYXAocCwgY2xlbitzbG9wKTsKIAkJcSArPSBjbGVuOwogCQlyYW1kaXNrX2ltYWdlICs9IGNsZW47CiAJCXJhbWRpc2tfc2l6ZSAgLT0gY2xlbjsKQEAgLTQyNywxMSArNDI1LDYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfQkxLX0RFVl9JTklUUkQgKi8KIAotc3RhdGljIHZvaWQgX19pbml0IHBhcnNlX2thc2xyX3NldHVwKHU2NCBwYV9kYXRhLCB1MzIgZGF0YV9sZW4pCi17Ci0Ja2FzbHJfZW5hYmxlZCA9IChib29sKShwYV9kYXRhICsgc2l6ZW9mKHN0cnVjdCBzZXR1cF9kYXRhKSk7Ci19Ci0KIHN0YXRpYyB2b2lkIF9faW5pdCBwYXJzZV9zZXR1cF9kYXRhKHZvaWQpCiB7CiAJc3RydWN0IHNldHVwX2RhdGEgKmRhdGE7CkBAIC00NDUsNyArNDM4LDcgQEAKIAkJZGF0YV9sZW4gPSBkYXRhLT5sZW4gKyBzaXplb2Yoc3RydWN0IHNldHVwX2RhdGEpOwogCQlkYXRhX3R5cGUgPSBkYXRhLT50eXBlOwogCQlwYV9uZXh0ID0gZGF0YS0+bmV4dDsKLQkJZWFybHlfaW91bm1hcChkYXRhLCBzaXplb2YoKmRhdGEpKTsKKwkJZWFybHlfbWVtdW5tYXAoZGF0YSwgc2l6ZW9mKCpkYXRhKSk7CiAKIAkJc3dpdGNoIChkYXRhX3R5cGUpIHsKIAkJY2FzZSBTRVRVUF9FODIwX0VYVDoKQEAgLTQ1Nyw5ICs0NTAsNiBAQAogCQljYXNlIFNFVFVQX0VGSToKIAkJCXBhcnNlX2VmaV9zZXR1cChwYV9kYXRhLCBkYXRhX2xlbik7CiAJCQlicmVhazsKLQkJY2FzZSBTRVRVUF9LQVNMUjoKLQkJCXBhcnNlX2thc2xyX3NldHVwKHBhX2RhdGEsIGRhdGFfbGVuKTsKLQkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KQEAgLTQ4MCw3ICs0NzAsNyBAQAogCQkJIEU4MjBfUkFNLCBFODIwX1JFU0VSVkVEX0tFUk4pOwogCQlmb3VuZCA9IDE7CiAJCXBhX2RhdGEgPSBkYXRhLT5uZXh0OwotCQllYXJseV9pb3VubWFwKGRhdGEsIHNpemVvZigqZGF0YSkpOworCQllYXJseV9tZW11bm1hcChkYXRhLCBzaXplb2YoKmRhdGEpKTsKIAl9CiAJaWYgKCFmb3VuZCkKIAkJcmV0dXJuOwpAQCAtNTAxLDcgKzQ5MSw3IEBACiAJCWRhdGEgPSBlYXJseV9tZW1yZW1hcChwYV9kYXRhLCBzaXplb2YoKmRhdGEpKTsKIAkJbWVtYmxvY2tfcmVzZXJ2ZShwYV9kYXRhLCBzaXplb2YoKmRhdGEpICsgZGF0YS0+bGVuKTsKIAkJcGFfZGF0YSA9IGRhdGEtPm5leHQ7Ci0JCWVhcmx5X2lvdW5tYXAoZGF0YSwgc2l6ZW9mKCpkYXRhKSk7CisJCWVhcmx5X21lbXVubWFwKGRhdGEsIHNpemVvZigqZGF0YSkpOwogCX0KIH0KIApAQCAtODQyLDE0ICs4MzIsMTUgQEAKIHN0YXRpYyBpbnQKIGR1bXBfa2VybmVsX29mZnNldChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsIHVuc2lnbmVkIGxvbmcgdiwgdm9pZCAqcCkKIHsKLQlpZiAoa2FzbHJfZW5hYmxlZCkKKwlpZiAoa2FzbHJfZW5hYmxlZCgpKSB7CiAJCXByX2VtZXJnKCJLZXJuZWwgT2Zmc2V0OiAweCVseCBmcm9tIDB4JWx4IChyZWxvY2F0aW9uIHJhbmdlOiAweCVseC0weCVseClcbiIsCiAJCQkgKHVuc2lnbmVkIGxvbmcpJl90ZXh0IC0gX19TVEFSVF9LRVJORUwsCiAJCQkgX19TVEFSVF9LRVJORUwsCiAJCQkgX19TVEFSVF9LRVJORUxfbWFwLAogCQkJIE1PRFVMRVNfVkFERFItMSk7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCXByX2VtZXJnKCJLZXJuZWwgT2Zmc2V0OiBkaXNhYmxlZFxuIik7CisJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMKaW5kZXggZTUwNDI0Ni4uZjk4MDQwOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zaWduYWwuYwpAQCAtNjEsOCArNjEsNyBAQAogCXJlZ3MtPnNlZyA9IEdFVF9TRUcoc2VnKSB8IDM7CQkJXAogfSB3aGlsZSAoMCkKIAotaW50IHJlc3RvcmVfc2lnY29udGV4dChzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHNpZ2NvbnRleHQgX191c2VyICpzYywKLQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKnBheCkKK2ludCByZXN0b3JlX3NpZ2NvbnRleHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHN0cnVjdCBzaWdjb250ZXh0IF9fdXNlciAqc2MpCiB7CiAJdm9pZCBfX3VzZXIgKmJ1ZjsKIAl1bnNpZ25lZCBpbnQgdG1wZmxhZ3M7CkBAIC04MSw3ICs4MCw3IEBACiAjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwogCiAJCUNPUFkoZGkpOyBDT1BZKHNpKTsgQ09QWShicCk7IENPUFkoc3ApOyBDT1BZKGJ4KTsKLQkJQ09QWShkeCk7IENPUFkoY3gpOyBDT1BZKGlwKTsKKwkJQ09QWShkeCk7IENPUFkoY3gpOyBDT1BZKGlwKTsgQ09QWShheCk7CiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CiAJCUNPUFkocjgpOwpAQCAtOTQsMjcgKzkzLDIwIEBACiAJCUNPUFkocjE1KTsKICNlbmRpZiAvKiBDT05GSUdfWDg2XzY0ICovCiAKLSNpZmRlZiBDT05GSUdfWDg2XzMyCiAJCUNPUFlfU0VHX0NQTDMoY3MpOwogCQlDT1BZX1NFR19DUEwzKHNzKTsKLSNlbHNlIC8qICFDT05GSUdfWDg2XzMyICovCi0JCS8qIEtlcm5lbCBzYXZlcyBhbmQgcmVzdG9yZXMgb25seSB0aGUgQ1Mgc2VnbWVudCByZWdpc3RlciBvbiBzaWduYWxzLAotCQkgKiB3aGljaCBpcyB0aGUgYmFyZSBtaW5pbXVtIG5lZWRlZCB0byBhbGxvdyBtaXhlZCAzMi82NC1iaXQgY29kZS4KLQkJICogQXBwJ3Mgc2lnbmFsIGhhbmRsZXIgY2FuIHNhdmUvcmVzdG9yZSBvdGhlciBzZWdtZW50cyBpZiBuZWVkZWQuICovCi0JCUNPUFlfU0VHX0NQTDMoY3MpOwotI2VuZGlmIC8qIENPTkZJR19YODZfMzIgKi8KIAogCQlnZXRfdXNlcl9leCh0bXBmbGFncywgJnNjLT5mbGFncyk7CiAJCXJlZ3MtPmZsYWdzID0gKHJlZ3MtPmZsYWdzICYgfkZJWF9FRkxBR1MpIHwgKHRtcGZsYWdzICYgRklYX0VGTEFHUyk7CiAJCXJlZ3MtPm9yaWdfYXggPSAtMTsJCS8qIGRpc2FibGUgc3lzY2FsbCBjaGVja3MgKi8KIAogCQlnZXRfdXNlcl9leChidWYsICZzYy0+ZnBzdGF0ZSk7Ci0KLQkJZ2V0X3VzZXJfZXgoKnBheCwgJnNjLT5heCk7CiAJfSBnZXRfdXNlcl9jYXRjaChlcnIpOwogCiAJZXJyIHw9IHJlc3RvcmVfeHN0YXRlX3NpZyhidWYsIGNvbmZpZ19lbmFibGVkKENPTkZJR19YODZfMzIpKTsKIAorCWZvcmNlX2lyZXQoKTsKKwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE2Miw4ICsxNTQsOSBAQAogI2Vsc2UgLyogIUNPTkZJR19YODZfMzIgKi8KIAkJcHV0X3VzZXJfZXgocmVncy0+ZmxhZ3MsICZzYy0+ZmxhZ3MpOwogCQlwdXRfdXNlcl9leChyZWdzLT5jcywgJnNjLT5jcyk7Ci0JCXB1dF91c2VyX2V4KDAsICZzYy0+Z3MpOwotCQlwdXRfdXNlcl9leCgwLCAmc2MtPmZzKTsKKwkJcHV0X3VzZXJfZXgoMCwgJnNjLT5fX3BhZDIpOworCQlwdXRfdXNlcl9leCgwLCAmc2MtPl9fcGFkMSk7CisJCXB1dF91c2VyX2V4KHJlZ3MtPnNzLCAmc2MtPnNzKTsKICNlbmRpZiAvKiBDT05GSUdfWDg2XzMyICovCiAKIAkJcHV0X3VzZXJfZXgoZnBzdGF0ZSwgJnNjLT5mcHN0YXRlKTsKQEAgLTQ1Nyw5ICs0NTAsMTkgQEAKIAogCXJlZ3MtPnNwID0gKHVuc2lnbmVkIGxvbmcpZnJhbWU7CiAKLQkvKiBTZXQgdXAgdGhlIENTIHJlZ2lzdGVyIHRvIHJ1biBzaWduYWwgaGFuZGxlcnMgaW4gNjQtYml0IG1vZGUsCi0JICAgZXZlbiBpZiB0aGUgaGFuZGxlciBoYXBwZW5zIHRvIGJlIGludGVycnVwdGluZyAzMi1iaXQgY29kZS4gKi8KKwkvKgorCSAqIFNldCB1cCB0aGUgQ1MgYW5kIFNTIHJlZ2lzdGVycyB0byBydW4gc2lnbmFsIGhhbmRsZXJzIGluCisJICogNjQtYml0IG1vZGUsIGV2ZW4gaWYgdGhlIGhhbmRsZXIgaGFwcGVucyB0byBiZSBpbnRlcnJ1cHRpbmcKKwkgKiAzMi1iaXQgb3IgMTYtYml0IGNvZGUuCisJICoKKwkgKiBTUyBpcyBzdWJ0bGUuICBJbiA2NC1iaXQgbW9kZSwgd2UgZG9uJ3QgbmVlZCBhbnkgcGFydGljdWxhcgorCSAqIFNTIGRlc2NyaXB0b3IsIGJ1dCB3ZSBkbyBuZWVkIFNTIHRvIGJlIHZhbGlkLiAgSXQncyBwb3NzaWJsZQorCSAqIHRoYXQgdGhlIG9sZCBTUyBpcyBlbnRpcmVseSBib2d1cyAtLSB0aGlzIGNhbiBoYXBwZW4gaWYgdGhlCisJICogc2lnbmFsIHdlJ3JlIHRyeWluZyB0byBkZWxpdmVyIGlzICNHUCBvciAjU1MgY2F1c2VkIGJ5IGEgYmFkCisJICogU1MgdmFsdWUuCisJICovCiAJcmVncy0+Y3MgPSBfX1VTRVJfQ1M7CisJcmVncy0+c3MgPSBfX1VTRVJfRFM7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUzOSw3ICs1NDIsNiBAQAogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gY3VycmVudF9wdF9yZWdzKCk7CiAJc3RydWN0IHNpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBheDsKIAlzaWdzZXRfdCBzZXQ7CiAKIAlmcmFtZSA9IChzdHJ1Y3Qgc2lnZnJhbWUgX191c2VyICopKHJlZ3MtPnNwIC0gOCk7CkBAIC01NTMsOSArNTU1LDkgQEAKIAogCXNldF9jdXJyZW50X2Jsb2NrZWQoJnNldCk7CiAKLQlpZiAocmVzdG9yZV9zaWdjb250ZXh0KHJlZ3MsICZmcmFtZS0+c2MsICZheCkpCisJaWYgKHJlc3RvcmVfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnNjKSkKIAkJZ290byBiYWRmcmFtZTsKLQlyZXR1cm4gYXg7CisJcmV0dXJuIHJlZ3MtPmF4OwogCiBiYWRmcmFtZToKIAlzaWduYWxfZmF1bHQocmVncywgZnJhbWUsICJzaWdyZXR1cm4iKTsKQEAgLTU2OCw3ICs1NzAsNiBAQAogewogCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gY3VycmVudF9wdF9yZWdzKCk7CiAJc3RydWN0IHJ0X3NpZ2ZyYW1lIF9fdXNlciAqZnJhbWU7Ci0JdW5zaWduZWQgbG9uZyBheDsKIAlzaWdzZXRfdCBzZXQ7CiAKIAlmcmFtZSA9IChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICopKHJlZ3MtPnNwIC0gc2l6ZW9mKGxvbmcpKTsKQEAgLTU3OSwzNyArNTgwLDIzIEBACiAKIAlzZXRfY3VycmVudF9ibG9ja2VkKCZzZXQpOwogCi0JaWYgKHJlc3RvcmVfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnVjLnVjX21jb250ZXh0LCAmYXgpKQorCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKIAlpZiAocmVzdG9yZV9hbHRzdGFjaygmZnJhbWUtPnVjLnVjX3N0YWNrKSkKIAkJZ290byBiYWRmcmFtZTsKIAotCXJldHVybiBheDsKKwlyZXR1cm4gcmVncy0+YXg7CiAKIGJhZGZyYW1lOgogCXNpZ25hbF9mYXVsdChyZWdzLCBmcmFtZSwgInJ0X3NpZ3JldHVybiIpOwogCXJldHVybiAwOwogfQogCi0vKgotICogT0ssIHdlJ3JlIGludm9raW5nIGEgaGFuZGxlcjoKLSAqLwotc3RhdGljIGludCBzaWducl9jb252ZXJ0KGludCBzaWcpCi17Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCXN0cnVjdCB0aHJlYWRfaW5mbyAqaW5mbyA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKTsKLQotCWlmIChpbmZvLT5leGVjX2RvbWFpbiAmJiBpbmZvLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcCAmJiBzaWcgPCAzMikKLQkJcmV0dXJuIGluZm8tPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwW3NpZ107Ci0jZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwotCXJldHVybiBzaWc7Ci19Ci0KIHN0YXRpYyBpbnQKIHNldHVwX3J0X2ZyYW1lKHN0cnVjdCBrc2lnbmFsICprc2lnLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKLQlpbnQgdXNpZyA9IHNpZ25yX2NvbnZlcnQoa3NpZy0+c2lnKTsKKwlpbnQgdXNpZyA9IGtzaWctPnNpZzsKIAlzaWdzZXRfdCAqc2V0ID0gc2lnbWFza190b19zYXZlKCk7CiAJY29tcGF0X3NpZ3NldF90ICpjc2V0ID0gKGNvbXBhdF9zaWdzZXRfdCAqKSBzZXQ7CiAKQEAgLTY3OSw3ICs2NjYsNyBAQAogCQkgKiBFbnN1cmUgdGhlIHNpZ25hbCBoYW5kbGVyIHN0YXJ0cyB3aXRoIHRoZSBuZXcgZnB1IHN0YXRlLgogCQkgKi8KIAkJaWYgKHVzZWRfbWF0aCgpKQotCQkJZHJvcF9pbml0X2ZwdShjdXJyZW50KTsKKwkJCWZwdV9yZXNldF9zdGF0ZShjdXJyZW50KTsKIAl9CiAJc2lnbmFsX3NldHVwX2RvbmUoZmFpbGVkLCBrc2lnLCB0ZXN0X3RocmVhZF9mbGFnKFRJRl9TSU5HTEVTVEVQKSk7CiB9CkBAIC03ODAsNyArNzY3LDYgQEAKIAlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGN1cnJlbnRfcHRfcmVncygpOwogCXN0cnVjdCBydF9zaWdmcmFtZV94MzIgX191c2VyICpmcmFtZTsKIAlzaWdzZXRfdCBzZXQ7Ci0JdW5zaWduZWQgbG9uZyBheDsKIAogCWZyYW1lID0gKHN0cnVjdCBydF9zaWdmcmFtZV94MzIgX191c2VyICopKHJlZ3MtPnNwIC0gOCk7CiAKQEAgLTc5MSwxMyArNzc3LDEzIEBACiAKIAlzZXRfY3VycmVudF9ibG9ja2VkKCZzZXQpOwogCi0JaWYgKHJlc3RvcmVfc2lnY29udGV4dChyZWdzLCAmZnJhbWUtPnVjLnVjX21jb250ZXh0LCAmYXgpKQorCWlmIChyZXN0b3JlX3NpZ2NvbnRleHQocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAKIAlpZiAoY29tcGF0X3Jlc3RvcmVfYWx0c3RhY2soJmZyYW1lLT51Yy51Y19zdGFjaykpCiAJCWdvdG8gYmFkZnJhbWU7CiAKLQlyZXR1cm4gYXg7CisJcmV0dXJuIHJlZ3MtPmF4OwogCiBiYWRmcmFtZToKIAlzaWduYWxfZmF1bHQocmVncywgZnJhbWUsICJ4MzIgcnRfc2lncmV0dXJuIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwppbmRleCBmZWJjNmFhLi41MGU1NDdlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKQEAgLTc3LDkgKzc3LDYgQEAKICNpbmNsdWRlIDxhc20vcmVhbG1vZGUuaD4KICNpbmNsdWRlIDxhc20vbWlzYy5oPgogCi0vKiBTdGF0ZSBvZiBlYWNoIENQVSAqLwotREVGSU5FX1BFUl9DUFUoaW50LCBjcHVfc3RhdGUpID0geyAwIH07Ci0KIC8qIE51bWJlciBvZiBzaWJsaW5ncyBwZXIgQ1BVIHBhY2thZ2UgKi8KIGludCBzbXBfbnVtX3NpYmxpbmdzID0gMTsKIEVYUE9SVF9TWU1CT0woc21wX251bV9zaWJsaW5ncyk7CkBAIC0yNTcsNyArMjU0LDcgQEAKIAlsb2NrX3ZlY3Rvcl9sb2NrKCk7CiAJc2V0X2NwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpLCB0cnVlKTsKIAl1bmxvY2tfdmVjdG9yX2xvY2soKTsKLQlwZXJfY3B1KGNwdV9zdGF0ZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSA9IENQVV9PTkxJTkU7CisJY3B1X3NldF9zdGF0ZV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAl4ODZfcGxhdGZvcm0ubm1pX2luaXQoKTsKIAogCS8qIGVuYWJsZSBsb2NhbCBpbnRlcnJ1cHRzICovCkBAIC03NzksNiArNzc2LDI2IEBACiAJcmV0dXJuIGJvb3RfZXJyb3I7CiB9CiAKK3ZvaWQgY29tbW9uX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCit7CisJLyogSnVzdCBpbiBjYXNlIHdlIGJvb3RlZCB3aXRoIGEgc2luZ2xlIENQVS4gKi8KKwlhbHRlcm5hdGl2ZXNfZW5hYmxlX3NtcCgpOworCisJcGVyX2NwdShjdXJyZW50X3Rhc2ssIGNwdSkgPSBpZGxlOworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCS8qIFN0YWNrIGZvciBzdGFydHVwXzMyIGNhbiBiZSBqdXN0IGFzIGZvciBzdGFydF9zZWNvbmRhcnkgb253YXJkcyAqLworCWlycV9jdHhfaW5pdChjcHUpOworCXBlcl9jcHUoY3B1X2N1cnJlbnRfdG9wX29mX3N0YWNrLCBjcHUpID0KKwkJKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKGlkbGUpICsgVEhSRUFEX1NJWkU7CisjZWxzZQorCWNsZWFyX3Rza190aHJlYWRfZmxhZyhpZGxlLCBUSUZfRk9SSyk7CisJaW5pdGlhbF9ncyA9IHBlcl9jcHVfb2Zmc2V0KGNwdSk7CisjZW5kaWYKKwlwZXJfY3B1KGtlcm5lbF9zdGFjaywgY3B1KSA9CisJCSh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShpZGxlKSArIFRIUkVBRF9TSVpFOworfQorCiAvKgogICogTk9URSAtIG9uIG1vc3Qgc3lzdGVtcyB0aGlzIGlzIGEgUEhZU0lDQUwgYXBpYyBJRCwgYnV0IG9uIG11bHRpcXVhZAogICogKGllIGNsdXN0ZXJlZCBhcGljIGFkZHJlc3NpbmcgbW9kZSksIHRoaXMgaXMgYSBMT0dJQ0FMIGFwaWMgSUQuCkBAIC03OTYsMjMgKzgxMyw5IEBACiAJaW50IGNwdTBfbm1pX3JlZ2lzdGVyZWQgPSAwOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAotCS8qIEp1c3QgaW4gY2FzZSB3ZSBib290ZWQgd2l0aCBhIHNpbmdsZSBDUFUuICovCi0JYWx0ZXJuYXRpdmVzX2VuYWJsZV9zbXAoKTsKLQogCWlkbGUtPnRocmVhZC5zcCA9ICh1bnNpZ25lZCBsb25nKSAoKChzdHJ1Y3QgcHRfcmVncyAqKQogCQkJICAoVEhSRUFEX1NJWkUgKyAgdGFza19zdGFja19wYWdlKGlkbGUpKSkgLSAxKTsKLQlwZXJfY3B1KGN1cnJlbnRfdGFzaywgY3B1KSA9IGlkbGU7CiAKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JLyogU3RhY2sgZm9yIHN0YXJ0dXBfMzIgY2FuIGJlIGp1c3QgYXMgZm9yIHN0YXJ0X3NlY29uZGFyeSBvbndhcmRzICovCi0JaXJxX2N0eF9pbml0KGNwdSk7Ci0jZWxzZQotCWNsZWFyX3Rza190aHJlYWRfZmxhZyhpZGxlLCBUSUZfRk9SSyk7Ci0JaW5pdGlhbF9ncyA9IHBlcl9jcHVfb2Zmc2V0KGNwdSk7Ci0jZW5kaWYKLQlwZXJfY3B1KGtlcm5lbF9zdGFjaywgY3B1KSA9Ci0JCSh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShpZGxlKSAtCi0JCUtFUk5FTF9TVEFDS19PRkZTRVQgKyBUSFJFQURfU0laRTsKIAllYXJseV9nZHRfZGVzY3IuYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWdldF9jcHVfZ2R0X3RhYmxlKGNwdSk7CiAJaW5pdGlhbF9jb2RlID0gKHVuc2lnbmVkIGxvbmcpc3RhcnRfc2Vjb25kYXJ5OwogCXN0YWNrX3N0YXJ0ICA9IGlkbGUtPnRocmVhZC5zcDsKQEAgLTk0OCwxMSArOTUxLDE2IEBACiAJICovCiAJbXRycl9zYXZlX3N0YXRlKCk7CiAKLQlwZXJfY3B1KGNwdV9zdGF0ZSwgY3B1KSA9IENQVV9VUF9QUkVQQVJFOworCS8qIHg4NiBDUFVzIHRha2UgdGhlbXNlbHZlcyBvZmZsaW5lLCBzbyBkZWxheWVkIG9mZmxpbmUgaXMgT0suICovCisJZXJyID0gY3B1X2NoZWNrX3VwX3ByZXBhcmUoY3B1KTsKKwlpZiAoZXJyICYmIGVyciAhPSAtRUJVU1kpCisJCXJldHVybiBlcnI7CiAKIAkvKiB0aGUgRlBVIGNvbnRleHQgaXMgYmxhbmssIG5vYm9keSBjYW4gb3duIGl0ICovCiAJX19jcHVfZGlzYWJsZV9sYXp5X3Jlc3RvcmUoY3B1KTsKIAorCWNvbW1vbl9jcHVfdXAoY3B1LCB0aWRsZSk7CisKIAllcnIgPSBkb19ib290X2NwdShhcGljaWQsIGNwdSwgdGlkbGUpOwogCWlmIChlcnIpIHsKIAkJcHJfZXJyKCJkb19ib290X2NwdSBmYWlsZWQoJWQpIHRvIHdha2V1cCBDUFUjJXVcbiIsIGVyciwgY3B1KTsKQEAgLTEwODYsOCArMTA5NCw2IEBACiAJCXJldHVybiBTTVBfTk9fQVBJQzsKIAl9CiAKLQl2ZXJpZnlfbG9jYWxfQVBJQygpOwotCiAJLyoKIAkgKiBJZiBTTVAgc2hvdWxkIGJlIGRpc2FibGVkLCB0aGVuIHJlYWxseSBkaXNhYmxlIGl0IQogCSAqLwpAQCAtMTE5MSw3ICsxMTk3LDcgQEAKIAlzd2l0Y2hfdG9fbmV3X2dkdChtZSk7CiAJLyogYWxyZWFkeSBzZXQgbWUgaW4gY3B1X29ubGluZV9tYXNrIGluIGJvb3RfY3B1X2luaXQoKSAqLwogCWNwdW1hc2tfc2V0X2NwdShtZSwgY3B1X2NhbGxvdXRfbWFzayk7Ci0JcGVyX2NwdShjcHVfc3RhdGUsIG1lKSA9IENQVV9PTkxJTkU7CisJY3B1X3NldF9zdGF0ZV9vbmxpbmUobWUpOwogfQogCiB2b2lkIF9faW5pdCBuYXRpdmVfc21wX2NwdXNfZG9uZSh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCkBAIC0xMzE4LDE0ICsxMzI0LDEwIEBACiAJbnVtYV9yZW1vdmVfY3B1KGNwdSk7CiB9CiAKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY29tcGxldGlvbiwgZGllX2NvbXBsZXRlKTsKLQogdm9pZCBjcHVfZGlzYWJsZV9jb21tb24odm9pZCkKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0JaW5pdF9jb21wbGV0aW9uKCZwZXJfY3B1KGRpZV9jb21wbGV0ZSwgc21wX3Byb2Nlc3Nvcl9pZCgpKSk7Ci0KIAlyZW1vdmVfc2libGluZ2luZm8oY3B1KTsKIAogCS8qIEl0J3Mgbm93IHNhZmUgdG8gcmVtb3ZlIHRoaXMgcHJvY2Vzc29yIGZyb20gdGhlIG9ubGluZSBtYXAgKi8KQEAgLTEzNDksMjQgKzEzNTEsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBjcHVfZGllX2NvbW1vbih1bnNpZ25lZCBpbnQgY3B1KQoraW50IGNvbW1vbl9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCiB7Ci0Jd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwZXJfY3B1KGRpZV9jb21wbGV0ZSwgY3B1KSwgSFopOwotfQorCWludCByZXQgPSAwOwogCi12b2lkIG5hdGl2ZV9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCi17CiAJLyogV2UgZG9uJ3QgZG8gYW55dGhpbmcgaGVyZTogaWRsZSB0YXNrIGlzIGZha2luZyBkZWF0aCBpdHNlbGYuICovCiAKLQljcHVfZGllX2NvbW1vbihjcHUpOwotCiAJLyogVGhleSBhY2sgdGhpcyBpbiBwbGF5X2RlYWQoKSBieSBzZXR0aW5nIENQVV9ERUFEICovCi0JaWYgKHBlcl9jcHUoY3B1X3N0YXRlLCBjcHUpID09IENQVV9ERUFEKSB7CisJaWYgKGNwdV93YWl0X2RlYXRoKGNwdSwgNSkpIHsKIAkJaWYgKHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykKIAkJCXByX2luZm8oIkNQVSAldSBpcyBub3cgb2ZmbGluZVxuIiwgY3B1KTsKIAl9IGVsc2UgewogCQlwcl9lcnIoIkNQVSAldSBkaWRuJ3QgZGllLi4uXG4iLCBjcHUpOworCQlyZXQgPSAtMTsKIAl9CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG5hdGl2ZV9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJY29tbW9uX2NwdV9kaWUoY3B1KTsKIH0KIAogdm9pZCBwbGF5X2RlYWRfY29tbW9uKHZvaWQpCkBAIC0xMzc1LDEwICsxMzgwLDggQEAKIAlyZXNldF9sYXp5X3RsYnN0YXRlKCk7CiAJYW1kX2U0MDBfcmVtb3ZlX2NwdShyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAotCW1iKCk7CiAJLyogQWNrIGl0ICovCi0JX190aGlzX2NwdV93cml0ZShjcHVfc3RhdGUsIENQVV9ERUFEKTsKLQljb21wbGV0ZSgmcGVyX2NwdShkaWVfY29tcGxldGUsIHNtcF9wcm9jZXNzb3JfaWQoKSkpOworCSh2b2lkKWNwdV9yZXBvcnRfZGVhdGgoKTsKIAogCS8qCiAJICogV2l0aCBwaHlzaWNhbCBDUFUgaG90cGx1Zywgd2Ugc2hvdWxkIGhhbHQgdGhlIGNwdQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N5c194ODZfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9zeXNfeDg2XzY0LmMKaW5kZXggMzAyNzdlMi4uMTBlMDI3MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N5c194ODZfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3lzX3g4Nl82NC5jCkBAIC0zNCwxMCArMzQsMjYgQEAKIAlyZXR1cm4gdmFfYWxpZ24ubWFzazsKIH0KIAorLyoKKyAqIFRvIGF2b2lkIGFsaWFzaW5nIGluIHRoZSBJJCBvbiBBTUQgRjE1aCwgdGhlIGJpdHMgZGVmaW5lZCBieSB0aGUKKyAqIHZhX2FsaWduLmJpdHMsIFsxMjp1cHBlcl9iaXQpLCBhcmUgc2V0IHRvIGEgcmFuZG9tIHZhbHVlIGluc3RlYWQgb2YKKyAqIHplcm9pbmcgdGhlbS4gVGhpcyByYW5kb20gdmFsdWUgaXMgY29tcHV0ZWQgb25jZSBwZXIgYm9vdC4gVGhpcyBmb3JtCisgKiBvZiBBU0xSIGlzIGtub3duIGFzICJwZXItYm9vdCBBU0xSIi4KKyAqCisgKiBUbyBhY2hpZXZlIHRoaXMsIHRoZSByYW5kb20gdmFsdWUgaXMgYWRkZWQgdG8gdGhlIGluZm8uYWxpZ25fb2Zmc2V0CisgKiB2YWx1ZSBiZWZvcmUgY2FsbGluZyB2bV91bm1hcHBlZF9hcmVhKCkgb3IgT1JlZCBkaXJlY3RseSB0byB0aGUKKyAqIGFkZHJlc3MuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9hbGlnbl9iaXRzKHZvaWQpCit7CisJcmV0dXJuIHZhX2FsaWduLmJpdHMgJiBnZXRfYWxpZ25fbWFzaygpOworfQorCiB1bnNpZ25lZCBsb25nIGFsaWduX3Zkc29fYWRkcih1bnNpZ25lZCBsb25nIGFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBhbGlnbl9tYXNrID0gZ2V0X2FsaWduX21hc2soKTsKLQlyZXR1cm4gKGFkZHIgKyBhbGlnbl9tYXNrKSAmIH5hbGlnbl9tYXNrOworCWFkZHIgPSAoYWRkciArIGFsaWduX21hc2spICYgfmFsaWduX21hc2s7CisJcmV0dXJuIGFkZHIgfCBnZXRfYWxpZ25fYml0cygpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBjb250cm9sX3ZhX2FkZHJfYWxpZ25tZW50KGNoYXIgKnN0cikKQEAgLTEzNSw4ICsxNTEsMTIgQEAKIAlpbmZvLmxlbmd0aCA9IGxlbjsKIAlpbmZvLmxvd19saW1pdCA9IGJlZ2luOwogCWluZm8uaGlnaF9saW1pdCA9IGVuZDsKLQlpbmZvLmFsaWduX21hc2sgPSBmaWxwID8gZ2V0X2FsaWduX21hc2soKSA6IDA7CisJaW5mby5hbGlnbl9tYXNrID0gMDsKIAlpbmZvLmFsaWduX29mZnNldCA9IHBnb2ZmIDw8IFBBR0VfU0hJRlQ7CisJaWYgKGZpbHApIHsKKwkJaW5mby5hbGlnbl9tYXNrID0gZ2V0X2FsaWduX21hc2soKTsKKwkJaW5mby5hbGlnbl9vZmZzZXQgKz0gZ2V0X2FsaWduX2JpdHMoKTsKKwl9CiAJcmV0dXJuIHZtX3VubWFwcGVkX2FyZWEoJmluZm8pOwogfQogCkBAIC0xNzQsOCArMTk0LDEyIEBACiAJaW5mby5sZW5ndGggPSBsZW47CiAJaW5mby5sb3dfbGltaXQgPSBQQUdFX1NJWkU7CiAJaW5mby5oaWdoX2xpbWl0ID0gbW0tPm1tYXBfYmFzZTsKLQlpbmZvLmFsaWduX21hc2sgPSBmaWxwID8gZ2V0X2FsaWduX21hc2soKSA6IDA7CisJaW5mby5hbGlnbl9tYXNrID0gMDsKIAlpbmZvLmFsaWduX29mZnNldCA9IHBnb2ZmIDw8IFBBR0VfU0hJRlQ7CisJaWYgKGZpbHApIHsKKwkJaW5mby5hbGlnbl9tYXNrID0gZ2V0X2FsaWduX21hc2soKTsKKwkJaW5mby5hbGlnbl9vZmZzZXQgKz0gZ2V0X2FsaWduX2JpdHMoKTsKKwl9CiAJYWRkciA9IHZtX3VubWFwcGVkX2FyZWEoJmluZm8pOwogCWlmICghKGFkZHIgJiB+UEFHRV9NQVNLKSkKIAkJcmV0dXJuIGFkZHI7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF8zMi5jIGIvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfMzIuYwppbmRleCBlOWJjZDU3Li4zNzc3MTg5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF8zMi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zeXNjYWxsXzMyLmMKQEAgLTUsMjEgKzUsMjkgQEAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCi0jZGVmaW5lIF9fU1lTQ0FMTF9JMzg2KG5yLCBzeW0sIGNvbXBhdCkgZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBzeW0odm9pZCkgOworI2lmZGVmIENPTkZJR19JQTMyX0VNVUxBVElPTgorI2RlZmluZSBTWU0oc3ltLCBjb21wYXQpIGNvbXBhdAorI2Vsc2UKKyNkZWZpbmUgU1lNKHN5bSwgY29tcGF0KSBzeW0KKyNkZWZpbmUgaWEzMl9zeXNfY2FsbF90YWJsZSBzeXNfY2FsbF90YWJsZQorI2RlZmluZSBfX05SX2lhMzJfc3lzY2FsbF9tYXggX19OUl9zeXNjYWxsX21heAorI2VuZGlmCisKKyNkZWZpbmUgX19TWVNDQUxMX0kzODYobnIsIHN5bSwgY29tcGF0KSBleHRlcm4gYXNtbGlua2FnZSB2b2lkIFNZTShzeW0sIGNvbXBhdCkodm9pZCkgOwogI2luY2x1ZGUgPGFzbS9zeXNjYWxsc18zMi5oPgogI3VuZGVmIF9fU1lTQ0FMTF9JMzg2CiAKLSNkZWZpbmUgX19TWVNDQUxMX0kzODYobnIsIHN5bSwgY29tcGF0KSBbbnJdID0gc3ltLAorI2RlZmluZSBfX1NZU0NBTExfSTM4Nihuciwgc3ltLCBjb21wYXQpIFtucl0gPSBTWU0oc3ltLCBjb21wYXQpLAogCiB0eXBlZGVmIGFzbWxpbmthZ2Ugdm9pZCAoKnN5c19jYWxsX3B0cl90KSh2b2lkKTsKIAogZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCBzeXNfbmlfc3lzY2FsbCh2b2lkKTsKIAotX192aXNpYmxlIGNvbnN0IHN5c19jYWxsX3B0cl90IHN5c19jYWxsX3RhYmxlW19fTlJfc3lzY2FsbF9tYXgrMV0gPSB7CitfX3Zpc2libGUgY29uc3Qgc3lzX2NhbGxfcHRyX3QgaWEzMl9zeXNfY2FsbF90YWJsZVtfX05SX2lhMzJfc3lzY2FsbF9tYXgrMV0gPSB7CiAJLyoKIAkgKiBTbWVsbHMgbGlrZSBhIGNvbXBpbGVyIGJ1ZyAtLSBpdCBkb2Vzbid0IHdvcmsKIAkgKiB3aGVuIHRoZSAmIGJlbG93IGlzIHJlbW92ZWQuCiAJICovCi0JWzAgLi4uIF9fTlJfc3lzY2FsbF9tYXhdID0gJnN5c19uaV9zeXNjYWxsLAorCVswIC4uLiBfX05SX2lhMzJfc3lzY2FsbF9tYXhdID0gJnN5c19uaV9zeXNjYWxsLAogI2luY2x1ZGUgPGFzbS9zeXNjYWxsc18zMi5oPgogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90ZXN0X3JvZGF0YS5jIGIvYXJjaC94ODYva2VybmVsL3Rlc3Rfcm9kYXRhLmMKaW5kZXggYjc5MTMzYS4uNWVjYmZlNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Rlc3Rfcm9kYXRhLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Rlc3Rfcm9kYXRhLmMKQEAgLTU3LDcgKzU3LDcgQEAKIAkvKiB0ZXN0IDM6IGNoZWNrIHRoZSB2YWx1ZSBoYXNuJ3QgY2hhbmdlZCAqLwogCS8qIElmIHRoaXMgdGVzdCBmYWlscywgd2UgbWFuYWdlZCB0byBvdmVyd3JpdGUgdGhlIGRhdGEgKi8KIAlpZiAoIXJvZGF0YV90ZXN0X2RhdGEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJyb2RhdGFfdGVzdDogVGVzdCAzIGZhaWxlcyAoZW5kIGRhdGEpXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJyb2RhdGFfdGVzdDogVGVzdCAzIGZhaWxzIChlbmQgZGF0YSlcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJLyogdGVzdCA0OiBjaGVjayBpZiB0aGUgcm9kYXRhIHNlY3Rpb24gaXMgNEtiIGFsaWduZWQgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90aW1lLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdGltZS5jCmluZGV4IDI1YWRjMGUuLmQzOWMwOTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RpbWUuYwpAQCAtMzAsNyArMzAsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgcGMgPSBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpOwogCi0JaWYgKCF1c2VyX21vZGVfdm0ocmVncykgJiYgaW5fbG9ja19mdW5jdGlvbnMocGMpKSB7CisJaWYgKCF1c2VyX21vZGUocmVncykgJiYgaW5fbG9ja19mdW5jdGlvbnMocGMpKSB7CiAjaWZkZWYgQ09ORklHX0ZSQU1FX1BPSU5URVIKIAkJcmV0dXJuICoodW5zaWduZWQgbG9uZyAqKShyZWdzLT5icCArIHNpemVvZihsb25nKSk7CiAjZWxzZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYwppbmRleCA5ZDIwNzNlLi4zMjRhYjUyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYwpAQCAtMTEyLDcgKzExMiw3IEBACiB7CiAJZW51bSBjdHhfc3RhdGUgcHJldl9zdGF0ZTsKIAotCWlmICh1c2VyX21vZGVfdm0ocmVncykpIHsKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CiAJCS8qIE90aGVyIHRoYW4gdGhhdCwgd2UncmUganVzdCBhbiBleGNlcHRpb24uICovCiAJCXByZXZfc3RhdGUgPSBleGNlcHRpb25fZW50ZXIoKTsKIAl9IGVsc2UgewpAQCAtMTIzLDcgKzEyMyw3IEBACiAJCSAqIGJ1dCB3ZSBuZWVkIHRvIG5vdGlmeSBSQ1UuCiAJCSAqLwogCQlyY3Vfbm1pX2VudGVyKCk7Ci0JCXByZXZfc3RhdGUgPSBJTl9LRVJORUw7ICAvKiB0aGUgdmFsdWUgaXMgaXJyZWxldmFudC4gKi8KKwkJcHJldl9zdGF0ZSA9IENPTlRFWFRfS0VSTkVMOyAgLyogdGhlIHZhbHVlIGlzIGlycmVsZXZhbnQuICovCiAJfQogCiAJLyoKQEAgLTE0Niw3ICsxNDYsNyBAQAogCS8qIE11c3QgYmUgYmVmb3JlIGV4Y2VwdGlvbl9leGl0LiAqLwogCXByZWVtcHRfY291bnRfc3ViKEhBUkRJUlFfT0ZGU0VUKTsKIAotCWlmICh1c2VyX21vZGVfdm0ocmVncykpCisJaWYgKHVzZXJfbW9kZShyZWdzKSkKIAkJcmV0dXJuIGV4Y2VwdGlvbl9leGl0KHByZXZfc3RhdGUpOwogCWVsc2UKIAkJcmN1X25taV9leGl0KCk7CkBAIC0xNTgsNyArMTU4LDcgQEAKICAqCiAgKiBJU1QgZXhjZXB0aW9uIGhhbmRsZXJzIG5vcm1hbGx5IGNhbm5vdCBzY2hlZHVsZS4gIEFzIGEgc3BlY2lhbAogICogZXhjZXB0aW9uLCBpZiB0aGUgZXhjZXB0aW9uIGludGVycnVwdGVkIHVzZXJzcGFjZSBjb2RlIChpLmUuCi0gKiB1c2VyX21vZGVfdm0ocmVncykgd291bGQgcmV0dXJuIHRydWUpIGFuZCB0aGUgZXhjZXB0aW9uIHdhcyBub3QKKyAqIHVzZXJfbW9kZShyZWdzKSB3b3VsZCByZXR1cm4gdHJ1ZSkgYW5kIHRoZSBleGNlcHRpb24gd2FzIG5vdAogICogYSBkb3VibGUgZmF1bHQsIGl0IGNhbiBiZSBzYWZlIHRvIHNjaGVkdWxlLiAgaXN0X2JlZ2luX25vbl9hdG9taWMoKQogICogYmVnaW5zIGEgbm9uLWF0b21pYyBzZWN0aW9uIHdpdGhpbiBhbiBpc3RfZW50ZXIoKS9pc3RfZXhpdCgpIHJlZ2lvbi4KICAqIENhbGxlcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyBpbnRlcnJ1cHRzIHRoZW1zZWx2ZXMgaW5zaWRlCkBAIC0xNjcsMTUgKzE2NywxNSBAQAogICovCiB2b2lkIGlzdF9iZWdpbl9ub25fYXRvbWljKHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCUJVR19PTighdXNlcl9tb2RlX3ZtKHJlZ3MpKTsKKwlCVUdfT04oIXVzZXJfbW9kZShyZWdzKSk7CiAKIAkvKgogCSAqIFNhbml0eSBjaGVjazogd2UgbmVlZCB0byBiZSBvbiB0aGUgbm9ybWFsIHRocmVhZCBzdGFjay4gIFRoaXMKIAkgKiB3aWxsIGNhdGNoIGFzbSBidWdzIGFuZCBhbnkgYXR0ZW1wdCB0byB1c2UgaXN0X3ByZWVtcHRfZW5hYmxlCiAJICogZnJvbSBkb3VibGVfZmF1bHQuCiAJICovCi0JQlVHX09OKCgoY3VycmVudF9zdGFja19wb2ludGVyKCkgXiB0aGlzX2NwdV9yZWFkX3N0YWJsZShrZXJuZWxfc3RhY2spKQotCQkmIH4oVEhSRUFEX1NJWkUgLSAxKSkgIT0gMCk7CisJQlVHX09OKCh1bnNpZ25lZCBsb25nKShjdXJyZW50X3RvcF9vZl9zdGFjaygpIC0KKwkJCSAgICAgICBjdXJyZW50X3N0YWNrX3BvaW50ZXIoKSkgPj0gVEhSRUFEX1NJWkUpOwogCiAJcHJlZW1wdF9jb3VudF9zdWIoSEFSRElSUV9PRkZTRVQpOwogfQpAQCAtMTk0LDggKzE5NCw3IEBACiBkb190cmFwX25vX3NpZ25hbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IHRyYXBuciwgY2hhciAqc3RyLAogCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzLAlsb25nIGVycm9yX2NvZGUpCiB7Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCWlmIChyZWdzLT5mbGFncyAmIFg4Nl9WTV9NQVNLKSB7CisJaWYgKHY4MDg2X21vZGUocmVncykpIHsKIAkJLyoKIAkJICogVHJhcHMgMCwgMSwgMywgNCwgYW5kIDUgc2hvdWxkIGJlIGZvcndhcmRlZCB0byB2bTg2LgogCQkgKiBPbiBubWkgKGludGVycnVwdCAyKSwgZG9fdHJhcCBzaG91bGQgbm90IGJlIGNhbGxlZC4KQEAgLTIwNyw3ICsyMDYsNyBAQAogCQl9CiAJCXJldHVybiAtMTsKIAl9Ci0jZW5kaWYKKwogCWlmICghdXNlcl9tb2RlKHJlZ3MpKSB7CiAJCWlmICghZml4dXBfZXhjZXB0aW9uKHJlZ3MpKSB7CiAJCQl0c2stPnRocmVhZC5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsKQEAgLTQ2MiwxMyArNDYxLDExIEBACiAJcHJldl9zdGF0ZSA9IGV4Y2VwdGlvbl9lbnRlcigpOwogCWNvbmRpdGlvbmFsX3N0aShyZWdzKTsKIAotI2lmZGVmIENPTkZJR19YODZfMzIKLQlpZiAocmVncy0+ZmxhZ3MgJiBYODZfVk1fTUFTSykgeworCWlmICh2ODA4Nl9tb2RlKHJlZ3MpKSB7CiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJaGFuZGxlX3ZtODZfZmF1bHQoKHN0cnVjdCBrZXJuZWxfdm04Nl9yZWdzICopIHJlZ3MsIGVycm9yX2NvZGUpOwogCQlnb3RvIGV4aXQ7CiAJfQotI2VuZGlmCiAKIAl0c2sgPSBjdXJyZW50OwogCWlmICghdXNlcl9tb2RlKHJlZ3MpKSB7CkBAIC01ODcsNyArNTg0LDcgQEAKIAkvKiBDb3B5IHRoZSByZW1haW5kZXIgb2YgdGhlIHN0YWNrIGZyb20gdGhlIGN1cnJlbnQgc3RhY2suICovCiAJbWVtbW92ZShuZXdfc3RhY2ssIHMsIG9mZnNldG9mKHN0cnVjdCBiYWRfaXJldF9zdGFjaywgcmVncy5pcCkpOwogCi0JQlVHX09OKCF1c2VyX21vZGVfdm0oJm5ld19zdGFjay0+cmVncykpOworCUJVR19PTighdXNlcl9tb2RlKCZuZXdfc3RhY2stPnJlZ3MpKTsKIAlyZXR1cm4gbmV3X3N0YWNrOwogfQogTk9LUFJPQkVfU1lNQk9MKGZpeHVwX2JhZF9pcmV0KTsKQEAgLTY3Myw3ICs2NzAsNyBAQAogCS8qIEl0J3Mgc2FmZSB0byBhbGxvdyBpcnEncyBhZnRlciBEUjYgaGFzIGJlZW4gc2F2ZWQgKi8KIAlwcmVlbXB0X2NvbmRpdGlvbmFsX3N0aShyZWdzKTsKIAotCWlmIChyZWdzLT5mbGFncyAmIFg4Nl9WTV9NQVNLKSB7CisJaWYgKHY4MDg2X21vZGUocmVncykpIHsKIAkJaGFuZGxlX3ZtODZfdHJhcCgoc3RydWN0IGtlcm5lbF92bTg2X3JlZ3MgKikgcmVncywgZXJyb3JfY29kZSwKIAkJCQkJWDg2X1RSQVBfREIpOwogCQlwcmVlbXB0X2NvbmRpdGlvbmFsX2NsaShyZWdzKTsKQEAgLTcyMSw3ICs3MTgsNyBAQAogCQlyZXR1cm47CiAJY29uZGl0aW9uYWxfc3RpKHJlZ3MpOwogCi0JaWYgKCF1c2VyX21vZGVfdm0ocmVncykpCisJaWYgKCF1c2VyX21vZGUocmVncykpCiAJewogCQlpZiAoIWZpeHVwX2V4Y2VwdGlvbihyZWdzKSkgewogCQkJdGFzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwpAQCAtNzM0LDcgKzczMSw3IEBACiAJLyoKIAkgKiBTYXZlIHRoZSBpbmZvIGZvciB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgYW5kIGNsZWFyIHRoZSBlcnJvci4KIAkgKi8KLQlzYXZlX2luaXRfZnB1KHRhc2spOworCXVubGF6eV9mcHUodGFzayk7CiAJdGFzay0+dGhyZWFkLnRyYXBfbnIgPSB0cmFwbnI7CiAJdGFzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlOwogCWluZm8uc2lfc2lnbm8gPSBTSUdGUEU7CkBAIC04NjMsNyArODYwLDcgQEAKIAlrZXJuZWxfZnB1X2Rpc2FibGUoKTsKIAlfX3RocmVhZF9mcHVfYmVnaW4odHNrKTsKIAlpZiAodW5saWtlbHkocmVzdG9yZV9mcHVfY2hlY2tpbmcodHNrKSkpIHsKLQkJZHJvcF9pbml0X2ZwdSh0c2spOworCQlmcHVfcmVzZXRfc3RhdGUodHNrKTsKIAkJZm9yY2Vfc2lnX2luZm8oU0lHU0VHViwgU0VORF9TSUdfUFJJViwgdHNrKTsKIAl9IGVsc2UgewogCQl0c2stPnRocmVhZC5mcHVfY291bnRlcisrOwpAQCAtOTI1LDkgKzkyMiwyMSBAQAogLyogU2V0IG9mIHRyYXBzIG5lZWRlZCBmb3IgZWFybHkgZGVidWdnaW5nLiAqLwogdm9pZCBfX2luaXQgZWFybHlfdHJhcF9pbml0KHZvaWQpCiB7Ci0Jc2V0X2ludHJfZ2F0ZV9pc3QoWDg2X1RSQVBfREIsICZkZWJ1ZywgREVCVUdfU1RBQ0spOworCS8qCisJICogRG9uJ3QgdXNlIElTVCB0byBzZXQgREVCVUdfU1RBQ0sgYXMgaXQgZG9lc24ndCB3b3JrIHVudGlsIFRTUworCSAqIGlzIHJlYWR5IGluIGNwdV9pbml0KCkgPC0tIHRyYXBfaW5pdCgpLiBCZWZvcmUgdHJhcF9pbml0KCksCisJICogQ1BVIHJ1bnMgYXQgcmluZyAwIHNvIGl0IGlzIGltcG9zc2libGUgdG8gaGl0IGFuIGludmFsaWQKKwkgKiBzdGFjay4gIFVzaW5nIHRoZSBvcmlnaW5hbCBzdGFjayB3b3JrcyB3ZWxsIGVub3VnaCBhdCB0aGlzCisJICogZWFybHkgc3RhZ2UuIERFQlVHX1NUQUNLIHdpbGwgYmUgZXF1aXBwZWQgYWZ0ZXIgY3B1X2luaXQoKSBpbgorCSAqIHRyYXBfaW5pdCgpLgorCSAqCisJICogV2UgZG9uJ3QgbmVlZCB0byBzZXQgdHJhY2VfaWR0X3RhYmxlIGxpa2Ugc2V0X2ludHJfZ2F0ZSgpLAorCSAqIHNpbmNlIHdlIGRvbid0IGhhdmUgdHJhY2VfZGVidWcgYW5kIGl0IHdpbGwgYmUgcmVzZXQgdG8KKwkgKiAnZGVidWcnIGluIHRyYXBfaW5pdCgpIGJ5IHNldF9pbnRyX2dhdGVfaXN0KCkuCisJICovCisJc2V0X2ludHJfZ2F0ZV9ub3RyYWNlKFg4Nl9UUkFQX0RCLCBkZWJ1Zyk7CiAJLyogaW50MyBjYW4gYmUgY2FsbGVkIGZyb20gYWxsICovCi0Jc2V0X3N5c3RlbV9pbnRyX2dhdGVfaXN0KFg4Nl9UUkFQX0JQLCAmaW50MywgREVCVUdfU1RBQ0spOworCXNldF9zeXN0ZW1faW50cl9nYXRlKFg4Nl9UUkFQX0JQLCAmaW50Myk7CiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCXNldF9pbnRyX2dhdGUoWDg2X1RSQVBfUEYsIHBhZ2VfZmF1bHQpOwogI2VuZGlmCkBAIC0xMDA1LDYgKzEwMTQsMTUgQEAKIAkgKi8KIAljcHVfaW5pdCgpOwogCisJLyoKKwkgKiBYODZfVFJBUF9EQiBhbmQgWDg2X1RSQVBfQlAgaGF2ZSBiZWVuIHNldAorCSAqIGluIGVhcmx5X3RyYXBfaW5pdCgpLiBIb3dldmVyLCBJVFMgd29ya3Mgb25seSBhZnRlcgorCSAqIGNwdV9pbml0KCkgbG9hZHMgVFNTLiBTZWUgY29tbWVudHMgaW4gZWFybHlfdHJhcF9pbml0KCkuCisJICovCisJc2V0X2ludHJfZ2F0ZV9pc3QoWDg2X1RSQVBfREIsICZkZWJ1ZywgREVCVUdfU1RBQ0spOworCS8qIGludDMgY2FuIGJlIGNhbGxlZCBmcm9tIGFsbCAqLworCXNldF9zeXN0ZW1faW50cl9nYXRlX2lzdChYODZfVFJBUF9CUCwgJmludDMsIERFQlVHX1NUQUNLKTsKKwogCXg4Nl9pbml0LmlycXMudHJhcF9pbml0KCk7CiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdXByb2Jlcy5jIGIvYXJjaC94ODYva2VybmVsL3Vwcm9iZXMuYwppbmRleCA4MWY4YWRiMC4uMGI4MWFkNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Vwcm9iZXMuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdXByb2Jlcy5jCkBAIC05MTIsNyArOTEyLDcgQEAKIAlpbnQgcmV0ID0gTk9USUZZX0RPTkU7CiAKIAkvKiBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHVzZXJzcGFjZSB0cmFwcyAqLwotCWlmIChyZWdzICYmICF1c2VyX21vZGVfdm0ocmVncykpCisJaWYgKHJlZ3MgJiYgIXVzZXJfbW9kZShyZWdzKSkKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJc3dpdGNoICh2YWwpIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92bTg2XzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdm04Nl8zMi5jCmluZGV4IGU4ZWRjZjUuLmZjOWRiNmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC92bTg2XzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3ZtODZfMzIuYwpAQCAtMTUwLDcgKzE1MCw3IEBACiAJCWRvX2V4aXQoU0lHU0VHVik7CiAJfQogCi0JdHNzID0gJnBlcl9jcHUoaW5pdF90c3MsIGdldF9jcHUoKSk7CisJdHNzID0gJnBlcl9jcHUoY3B1X3RzcywgZ2V0X2NwdSgpKTsKIAljdXJyZW50LT50aHJlYWQuc3AwID0gY3VycmVudC0+dGhyZWFkLnNhdmVkX3NwMDsKIAljdXJyZW50LT50aHJlYWQuc3lzZW50ZXJfY3MgPSBfX0tFUk5FTF9DUzsKIAlsb2FkX3NwMCh0c3MsICZjdXJyZW50LT50aHJlYWQpOwpAQCAtMzE4LDcgKzMxOCw3IEBACiAJdHNrLT50aHJlYWQuc2F2ZWRfZnMgPSBpbmZvLT5yZWdzMzItPmZzOwogCXRzay0+dGhyZWFkLnNhdmVkX2dzID0gZ2V0X3VzZXJfZ3MoaW5mby0+cmVnczMyKTsKIAotCXRzcyA9ICZwZXJfY3B1KGluaXRfdHNzLCBnZXRfY3B1KCkpOworCXRzcyA9ICZwZXJfY3B1KGNwdV90c3MsIGdldF9jcHUoKSk7CiAJdHNrLT50aHJlYWQuc3AwID0gKHVuc2lnbmVkIGxvbmcpICZpbmZvLT5WTTg2X1RTU19FU1AwOwogCWlmIChjcHVfaGFzX3NlcCkKIAkJdHNrLT50aHJlYWQuc3lzZW50ZXJfY3MgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsX2d0b2QuYyBiL2FyY2gveDg2L2tlcm5lbC92c3lzY2FsbF9ndG9kLmMKaW5kZXggYzdkNzkxZi4uNTFlMzMwNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsX2d0b2QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfZ3RvZC5jCkBAIC0zMSwzMCArMzEsMzAgQEAKIAlndG9kX3dyaXRlX2JlZ2luKHZkYXRhKTsKIAogCS8qIGNvcHkgdnN5c2NhbGwgZGF0YSAqLwotCXZkYXRhLT52Y2xvY2tfbW9kZQk9IHRrLT50a3IuY2xvY2stPmFyY2hkYXRhLnZjbG9ja19tb2RlOwotCXZkYXRhLT5jeWNsZV9sYXN0CT0gdGstPnRrci5jeWNsZV9sYXN0OwotCXZkYXRhLT5tYXNrCQk9IHRrLT50a3IubWFzazsKLQl2ZGF0YS0+bXVsdAkJPSB0ay0+dGtyLm11bHQ7Ci0JdmRhdGEtPnNoaWZ0CQk9IHRrLT50a3Iuc2hpZnQ7CisJdmRhdGEtPnZjbG9ja19tb2RlCT0gdGstPnRrcl9tb25vLmNsb2NrLT5hcmNoZGF0YS52Y2xvY2tfbW9kZTsKKwl2ZGF0YS0+Y3ljbGVfbGFzdAk9IHRrLT50a3JfbW9uby5jeWNsZV9sYXN0OworCXZkYXRhLT5tYXNrCQk9IHRrLT50a3JfbW9uby5tYXNrOworCXZkYXRhLT5tdWx0CQk9IHRrLT50a3JfbW9uby5tdWx0OworCXZkYXRhLT5zaGlmdAkJPSB0ay0+dGtyX21vbm8uc2hpZnQ7CiAKIAl2ZGF0YS0+d2FsbF90aW1lX3NlYwkJPSB0ay0+eHRpbWVfc2VjOwotCXZkYXRhLT53YWxsX3RpbWVfc25zZWMJCT0gdGstPnRrci54dGltZV9uc2VjOworCXZkYXRhLT53YWxsX3RpbWVfc25zZWMJCT0gdGstPnRrcl9tb25vLnh0aW1lX25zZWM7CiAKIAl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc2VjCT0gdGstPnh0aW1lX3NlYwogCQkJCQkrIHRrLT53YWxsX3RvX21vbm90b25pYy50dl9zZWM7Ci0JdmRhdGEtPm1vbm90b25pY190aW1lX3Nuc2VjCT0gdGstPnRrci54dGltZV9uc2VjCisJdmRhdGEtPm1vbm90b25pY190aW1lX3Nuc2VjCT0gdGstPnRrcl9tb25vLnh0aW1lX25zZWMKIAkJCQkJKyAoKHU2NCl0ay0+d2FsbF90b19tb25vdG9uaWMudHZfbnNlYwotCQkJCQkJPDwgdGstPnRrci5zaGlmdCk7CisJCQkJCQk8PCB0ay0+dGtyX21vbm8uc2hpZnQpOwogCXdoaWxlICh2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc25zZWMgPj0KLQkJCQkJKCgodTY0KU5TRUNfUEVSX1NFQykgPDwgdGstPnRrci5zaGlmdCkpIHsKKwkJCQkJKCgodTY0KU5TRUNfUEVSX1NFQykgPDwgdGstPnRrcl9tb25vLnNoaWZ0KSkgewogCQl2ZGF0YS0+bW9ub3RvbmljX3RpbWVfc25zZWMgLT0KLQkJCQkJKCh1NjQpTlNFQ19QRVJfU0VDKSA8PCB0ay0+dGtyLnNoaWZ0OworCQkJCQkoKHU2NClOU0VDX1BFUl9TRUMpIDw8IHRrLT50a3JfbW9uby5zaGlmdDsKIAkJdmRhdGEtPm1vbm90b25pY190aW1lX3NlYysrOwogCX0KIAogCXZkYXRhLT53YWxsX3RpbWVfY29hcnNlX3NlYwk9IHRrLT54dGltZV9zZWM7Ci0JdmRhdGEtPndhbGxfdGltZV9jb2Fyc2VfbnNlYwk9IChsb25nKSh0ay0+dGtyLnh0aW1lX25zZWMgPj4KLQkJCQkJCSB0ay0+dGtyLnNoaWZ0KTsKKwl2ZGF0YS0+d2FsbF90aW1lX2NvYXJzZV9uc2VjCT0gKGxvbmcpKHRrLT50a3JfbW9uby54dGltZV9uc2VjID4+CisJCQkJCQkgdGstPnRrcl9tb25vLnNoaWZ0KTsKIAogCXZkYXRhLT5tb25vdG9uaWNfdGltZV9jb2Fyc2Vfc2VjID0KIAkJdmRhdGEtPndhbGxfdGltZV9jb2Fyc2Vfc2VjICsgdGstPndhbGxfdG9fbW9ub3RvbmljLnR2X3NlYzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC94c2F2ZS5jIGIvYXJjaC94ODYva2VybmVsL3hzYXZlLmMKaW5kZXggMzRmNjZlNS4uODdhODE1YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3hzYXZlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3hzYXZlLmMKQEAgLTM0Miw3ICszNDIsNyBAQAogCQkJIGNvbmZpZ19lbmFibGVkKENPTkZJR19JQTMyX0VNVUxBVElPTikpOwogCiAJaWYgKCFidWYpIHsKLQkJZHJvcF9pbml0X2ZwdSh0c2spOworCQlmcHVfcmVzZXRfc3RhdGUodHNrKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNzksNyArMzc5LDcgQEAKIAkJICogdGhyZWFkJ3MgZnB1IHN0YXRlLCByZWNvbnN0cnVjdCBmeHN0YXRlIGZyb20gdGhlIGZzYXZlCiAJCSAqIGhlYWRlci4gU2FuaXRpemUgdGhlIGNvcGllZCBzdGF0ZSBldGMuCiAJCSAqLwotCQlzdHJ1Y3QgeHNhdmVfc3RydWN0ICp4c2F2ZSA9ICZ0c2stPnRocmVhZC5mcHUuc3RhdGUtPnhzYXZlOworCQlzdHJ1Y3QgZnB1ICpmcHUgPSAmdHNrLT50aHJlYWQuZnB1OwogCQlzdHJ1Y3QgdXNlcl9pMzg3X2lhMzJfc3RydWN0IGVudjsKIAkJaW50IGVyciA9IDA7CiAKQEAgLTM5MywxNCArMzkzLDE1IEBACiAJCSAqLwogCQlkcm9wX2ZwdSh0c2spOwogCi0JCWlmIChfX2NvcHlfZnJvbV91c2VyKHhzYXZlLCBidWZfZngsIHN0YXRlX3NpemUpIHx8CisJCWlmIChfX2NvcHlfZnJvbV91c2VyKCZmcHUtPnN0YXRlLT54c2F2ZSwgYnVmX2Z4LCBzdGF0ZV9zaXplKSB8fAogCQkgICAgX19jb3B5X2Zyb21fdXNlcigmZW52LCBidWYsIHNpemVvZihlbnYpKSkgeworCQkJZnB1X2Zpbml0KGZwdSk7CiAJCQllcnIgPSAtMTsKIAkJfSBlbHNlIHsKIAkJCXNhbml0aXplX3Jlc3RvcmVkX3hzdGF0ZSh0c2ssICZlbnYsIHhzdGF0ZV9idiwgZnhfb25seSk7Ci0JCQlzZXRfdXNlZF9tYXRoKCk7CiAJCX0KIAorCQlzZXRfdXNlZF9tYXRoKCk7CiAJCWlmICh1c2VfZWFnZXJfZnB1KCkpIHsKIAkJCXByZWVtcHRfZGlzYWJsZSgpOwogCQkJbWF0aF9zdGF0ZV9yZXN0b3JlKCk7CkBAIC00MTUsNyArNDE2LDcgQEAKIAkJICovCiAJCXVzZXJfZnB1X2JlZ2luKCk7CiAJCWlmIChyZXN0b3JlX3VzZXJfeHN0YXRlKGJ1Zl9meCwgeHN0YXRlX2J2LCBmeF9vbmx5KSkgewotCQkJZHJvcF9pbml0X2ZwdSh0c2spOworCQkJZnB1X3Jlc2V0X3N0YXRlKHRzayk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC02NzcsMTkgKzY3OCwxMyBAQAogCXRoaXNfZnVuYygpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IGVhZ2VyX2ZwdV9pbml0X2JwKHZvaWQpCisvKgorICogc2V0dXBfaW5pdF9mcHVfYnVmKCkgaXMgX19pbml0IGFuZCBpdCBpcyBPSyB0byBjYWxsIGl0IGhlcmUgYmVjYXVzZQorICogaW5pdF94c3RhdGVfYnVmIHdpbGwgYmUgdW5zZXQgb25seSBvbmNlIGR1cmluZyBib290LgorICovCit2b2lkIF9faW5pdF9yZWZvayBlYWdlcl9mcHVfaW5pdCh2b2lkKQogewotCWN1cnJlbnQtPnRocmVhZC5mcHUuc3RhdGUgPQotCSAgICBhbGxvY19ib290bWVtX2FsaWduKHhzdGF0ZV9zaXplLCBfX2FsaWdub2ZfXyhzdHJ1Y3QgeHNhdmVfc3RydWN0KSk7Ci0JaWYgKCFpbml0X3hzdGF0ZV9idWYpCi0JCXNldHVwX2luaXRfZnB1X2J1ZigpOwotfQotCi12b2lkIGVhZ2VyX2ZwdV9pbml0KHZvaWQpCi17Ci0Jc3RhdGljIF9fcmVmZGF0YSB2b2lkICgqYm9vdF9mdW5jKSh2b2lkKSA9IGVhZ2VyX2ZwdV9pbml0X2JwOwotCi0JY2xlYXJfdXNlZF9tYXRoKCk7CisJV0FSTl9PTih1c2VkX21hdGgoKSk7CiAJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgPSAwOwogCiAJaWYgKGVhZ2VyZnB1ID09IEVOQUJMRSkKQEAgLTcwMCwyMSArNjk1LDggQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChib290X2Z1bmMpIHsKLQkJYm9vdF9mdW5jKCk7Ci0JCWJvb3RfZnVuYyA9IE5VTEw7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIHNhbWUgYXMgbWF0aF9zdGF0ZV9yZXN0b3JlKCkuIEJ1dCB1c2VfeHNhdmUoKSBpcwotCSAqIG5vdCB5ZXQgcGF0Y2hlZCB0byB1c2UgbWF0aF9zdGF0ZV9yZXN0b3JlKCkuCi0JICovCi0JaW5pdF9mcHUoY3VycmVudCk7Ci0JX190aHJlYWRfZnB1X2JlZ2luKGN1cnJlbnQpOwotCWlmIChjcHVfaGFzX3hzYXZlKQotCQl4cnN0b3Jfc3RhdGUoaW5pdF94c3RhdGVfYnVmLCAtMSk7Ci0JZWxzZQotCQlmeHJzdG9yX2NoZWNraW5nKCZpbml0X3hzdGF0ZV9idWYtPmkzODcpOworCWlmICghaW5pdF94c3RhdGVfYnVmKQorCQlzZXR1cF9pbml0X2ZwdV9idWYoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9NYWtlZmlsZSBiL2FyY2gveDg2L2t2bS9NYWtlZmlsZQppbmRleCAwOGY3OTBkLi4xNmU4Zjk2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva3ZtL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogCi1jY2ZsYWdzLXkgKz0gLUl2aXJ0L2t2bSAtSWFyY2gveDg2L2t2bQorY2NmbGFncy15ICs9IC1JYXJjaC94ODYva3ZtCiAKIENGTEFHU194ODYubyA6PSAtSS4KIENGTEFHU19zdm0ubyA6PSAtSS4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9jcHVpZC5jIGIvYXJjaC94ODYva3ZtL2NwdWlkLmMKaW5kZXggOGE4MDczNy4uNTliNjlmNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2NwdWlkLmMKKysrIGIvYXJjaC94ODYva3ZtL2NwdWlkLmMKQEAgLTEwNCw2ICsxMDQsOSBAQAogCQkoKGJlc3QtPmVheCAmIDB4ZmYwMCkgPj4gOCkgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBVcGRhdGUgcGh5c2ljYWwtYWRkcmVzcyB3aWR0aCAqLworCXZjcHUtPmFyY2gubWF4cGh5YWRkciA9IGNwdWlkX3F1ZXJ5X21heHBoeWFkZHIodmNwdSk7CisKIAlrdm1fcG11X2NwdWlkX3VwZGF0ZSh2Y3B1KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEzNSw2ICsxMzgsMjEgQEAKIAl9CiB9CiAKK2ludCBjcHVpZF9xdWVyeV9tYXhwaHlhZGRyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiAqYmVzdDsKKworCWJlc3QgPSBrdm1fZmluZF9jcHVpZF9lbnRyeSh2Y3B1LCAweDgwMDAwMDAwLCAwKTsKKwlpZiAoIWJlc3QgfHwgYmVzdC0+ZWF4IDwgMHg4MDAwMDAwOCkKKwkJZ290byBub3RfZm91bmQ7CisJYmVzdCA9IGt2bV9maW5kX2NwdWlkX2VudHJ5KHZjcHUsIDB4ODAwMDAwMDgsIDApOworCWlmIChiZXN0KQorCQlyZXR1cm4gYmVzdC0+ZWF4ICYgMHhmZjsKK25vdF9mb3VuZDoKKwlyZXR1cm4gMzY7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjcHVpZF9xdWVyeV9tYXhwaHlhZGRyKTsKKwogLyogd2hlbiBhbiBvbGQgdXNlcnNwYWNlIHByb2Nlc3MgZmlsbHMgYSBuZXcga2VybmVsIG1vZHVsZSAqLwogaW50IGt2bV92Y3B1X2lvY3RsX3NldF9jcHVpZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkgICAgIHN0cnVjdCBrdm1fY3B1aWQgKmNwdWlkLApAQCAtNzU3LDIxICs3NzUsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2ZpbmRfY3B1aWRfZW50cnkpOwogCi1pbnQgY3B1aWRfbWF4cGh5YWRkcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCi17Ci0Jc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgKmJlc3Q7Ci0KLQliZXN0ID0ga3ZtX2ZpbmRfY3B1aWRfZW50cnkodmNwdSwgMHg4MDAwMDAwMCwgMCk7Ci0JaWYgKCFiZXN0IHx8IGJlc3QtPmVheCA8IDB4ODAwMDAwMDgpCi0JCWdvdG8gbm90X2ZvdW5kOwotCWJlc3QgPSBrdm1fZmluZF9jcHVpZF9lbnRyeSh2Y3B1LCAweDgwMDAwMDA4LCAwKTsKLQlpZiAoYmVzdCkKLQkJcmV0dXJuIGJlc3QtPmVheCAmIDB4ZmY7Ci1ub3RfZm91bmQ6Ci0JcmV0dXJuIDM2OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoY3B1aWRfbWF4cGh5YWRkcik7Ci0KIC8qCiAgKiBJZiBubyBtYXRjaCBpcyBmb3VuZCwgY2hlY2sgd2hldGhlciB3ZSBleGNlZWQgdGhlIHZDUFUncyBsaW1pdAogICogYW5kIHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgaGlnaGVzdCB2YWxpZCBfc3RhbmRhcmRfIGxlYWYgaW5zdGVhZC4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9jcHVpZC5oIGIvYXJjaC94ODYva3ZtL2NwdWlkLmgKaW5kZXggNDQ1MmVlZC4uYzNiMWFkOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2NwdWlkLmgKKysrIGIvYXJjaC94ODYva3ZtL2NwdWlkLmgKQEAgLTIwLDEzICsyMCwxOSBAQAogCQkJICAgICAgc3RydWN0IGt2bV9jcHVpZF9lbnRyeTIgX191c2VyICplbnRyaWVzKTsKIHZvaWQga3ZtX2NwdWlkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTMyICplYXgsIHUzMiAqZWJ4LCB1MzIgKmVjeCwgdTMyICplZHgpOwogCitpbnQgY3B1aWRfcXVlcnlfbWF4cGh5YWRkcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCitzdGF0aWMgaW5saW5lIGludCBjcHVpZF9tYXhwaHlhZGRyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlyZXR1cm4gdmNwdS0+YXJjaC5tYXhwaHlhZGRyOworfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgZ3Vlc3RfY3B1aWRfaGFzX3hzYXZlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlzdHJ1Y3Qga3ZtX2NwdWlkX2VudHJ5MiAqYmVzdDsKIAogCWlmICghc3RhdGljX2NwdV9oYXMoWDg2X0ZFQVRVUkVfWFNBVkUpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCiAJYmVzdCA9IGt2bV9maW5kX2NwdWlkX2VudHJ5KHZjcHUsIDEsIDApOwogCXJldHVybiBiZXN0ICYmIChiZXN0LT5lY3ggJiBiaXQoWDg2X0ZFQVRVUkVfWFNBVkUpKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9lbXVsYXRlLmMgYi9hcmNoL3g4Ni9rdm0vZW11bGF0ZS5jCmluZGV4IDEwNmMwMTUuLjYzMGJjYjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9lbXVsYXRlLmMKKysrIGIvYXJjaC94ODYva3ZtL2VtdWxhdGUuYwpAQCAtMjQ4LDI3ICsyNDgsNyBAQAogCXN0cnVjdCBvcGNvZGUgbW9kZTY0OwogfTsKIAotLyogRUZMQUdTIGJpdCBkZWZpbml0aW9ucy4gKi8KLSNkZWZpbmUgRUZMR19JRCAoMTw8MjEpCi0jZGVmaW5lIEVGTEdfVklQICgxPDwyMCkKLSNkZWZpbmUgRUZMR19WSUYgKDE8PDE5KQotI2RlZmluZSBFRkxHX0FDICgxPDwxOCkKLSNkZWZpbmUgRUZMR19WTSAoMTw8MTcpCi0jZGVmaW5lIEVGTEdfUkYgKDE8PDE2KQotI2RlZmluZSBFRkxHX0lPUEwgKDM8PDEyKQotI2RlZmluZSBFRkxHX05UICgxPDwxNCkKLSNkZWZpbmUgRUZMR19PRiAoMTw8MTEpCi0jZGVmaW5lIEVGTEdfREYgKDE8PDEwKQotI2RlZmluZSBFRkxHX0lGICgxPDw5KQotI2RlZmluZSBFRkxHX1RGICgxPDw4KQotI2RlZmluZSBFRkxHX1NGICgxPDw3KQotI2RlZmluZSBFRkxHX1pGICgxPDw2KQotI2RlZmluZSBFRkxHX0FGICgxPDw0KQotI2RlZmluZSBFRkxHX1BGICgxPDwyKQotI2RlZmluZSBFRkxHX0NGICgxPDwwKQotCiAjZGVmaW5lIEVGTEdfUkVTRVJWRURfWkVST1NfTUFTSyAweGZmYzA4MDJhCi0jZGVmaW5lIEVGTEdfUkVTRVJWRURfT05FX01BU0sgMgogCiBlbnVtIHg4Nl90cmFuc2Zlcl90eXBlIHsKIAlYODZfVFJBTlNGRVJfTk9ORSwKQEAgLTMxNyw3ICsyOTcsOCBAQAogICogVGhlc2UgRUZMQUdTIGJpdHMgYXJlIHJlc3RvcmVkIGZyb20gc2F2ZWQgdmFsdWUgZHVyaW5nIGVtdWxhdGlvbiwgYW5kCiAgKiBhbnkgY2hhbmdlcyBhcmUgd3JpdHRlbiBiYWNrIHRvIHRoZSBzYXZlZCB2YWx1ZSBhZnRlciBlbXVsYXRpb24uCiAgKi8KLSNkZWZpbmUgRUZMQUdTX01BU0sgKEVGTEdfT0Z8RUZMR19TRnxFRkxHX1pGfEVGTEdfQUZ8RUZMR19QRnxFRkxHX0NGKQorI2RlZmluZSBFRkxBR1NfTUFTSyAoWDg2X0VGTEFHU19PRnxYODZfRUZMQUdTX1NGfFg4Nl9FRkxBR1NfWkZ8WDg2X0VGTEFHU19BRnxcCisJCSAgICAgWDg2X0VGTEFHU19QRnxYODZfRUZMQUdTX0NGKQogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogI2RlZmluZSBPTjY0KHgpIHgKQEAgLTQ3OCw2ICs0NTksMjUgQEAKIAkqZGVzdCA9ICgqZGVzdCAmIH5tYXNrKSB8IChzcmMgJiBtYXNrKTsKIH0KIAorc3RhdGljIHZvaWQgYXNzaWduX3JlZ2lzdGVyKHVuc2lnbmVkIGxvbmcgKnJlZywgdTY0IHZhbCwgaW50IGJ5dGVzKQoreworCS8qIFRoZSA0LWJ5dGUgY2FzZSAqaXMqIGNvcnJlY3Q6IGluIDY0LWJpdCBtb2RlIHdlIHplcm8tZXh0ZW5kLiAqLworCXN3aXRjaCAoYnl0ZXMpIHsKKwljYXNlIDE6CisJCSoodTggKilyZWcgPSAodTgpdmFsOworCQlicmVhazsKKwljYXNlIDI6CisJCSoodTE2ICopcmVnID0gKHUxNil2YWw7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJKnJlZyA9ICh1MzIpdmFsOworCQlicmVhazsJLyogNjRiOiB6ZXJvLWV4dGVuZCAqLworCWNhc2UgODoKKwkJKnJlZyA9IHZhbDsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYWRfbWFzayhzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKIAlyZXR1cm4gKDFVTCA8PCAoY3R4dC0+YWRfYnl0ZXMgPDwgMykpIC0gMTsKQEAgLTk0Myw2ICs5NDMsMjIgQEAKIAogRkFTVE9QMlIoY21wLCBjbXBfcik7CiAKK3N0YXRpYyBpbnQgZW1fYnNmX2Moc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCit7CisJLyogSWYgc3JjIGlzIHplcm8sIGRvIG5vdCB3cml0ZWJhY2ssIGJ1dCB1cGRhdGUgZmxhZ3MgKi8KKwlpZiAoY3R4dC0+c3JjLnZhbCA9PSAwKQorCQljdHh0LT5kc3QudHlwZSA9IE9QX05PTkU7CisJcmV0dXJuIGZhc3RvcChjdHh0LCBlbV9ic2YpOworfQorCitzdGF0aWMgaW50IGVtX2Jzcl9jKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0KQoreworCS8qIElmIHNyYyBpcyB6ZXJvLCBkbyBub3Qgd3JpdGViYWNrLCBidXQgdXBkYXRlIGZsYWdzICovCisJaWYgKGN0eHQtPnNyYy52YWwgPT0gMCkKKwkJY3R4dC0+ZHN0LnR5cGUgPSBPUF9OT05FOworCXJldHVybiBmYXN0b3AoY3R4dCwgZW1fYnNyKTsKK30KKwogc3RhdGljIHU4IHRlc3RfY2ModW5zaWduZWQgaW50IGNvbmRpdGlvbiwgdW5zaWduZWQgbG9uZyBmbGFncykKIHsKIAl1OCByYzsKQEAgLTEzOTksNyArMTQxNSw3IEBACiAJCXVuc2lnbmVkIGludCBpbl9wYWdlLCBuOwogCQl1bnNpZ25lZCBpbnQgY291bnQgPSBjdHh0LT5yZXBfcHJlZml4ID8KIAkJCWFkZHJlc3NfbWFzayhjdHh0LCByZWdfcmVhZChjdHh0LCBWQ1BVX1JFR1NfUkNYKSkgOiAxOwotCQlpbl9wYWdlID0gKGN0eHQtPmVmbGFncyAmIEVGTEdfREYpID8KKwkJaW5fcGFnZSA9IChjdHh0LT5lZmxhZ3MgJiBYODZfRUZMQUdTX0RGKSA/CiAJCQlvZmZzZXRfaW5fcGFnZShyZWdfcmVhZChjdHh0LCBWQ1BVX1JFR1NfUkRJKSkgOgogCQkJUEFHRV9TSVpFIC0gb2Zmc2V0X2luX3BhZ2UocmVnX3JlYWQoY3R4dCwgVkNQVV9SRUdTX1JESSkpOwogCQluID0gbWluMyhpbl9wYWdlLCAodW5zaWduZWQgaW50KXNpemVvZihyYy0+ZGF0YSkgLyBzaXplLCBjb3VudCk7CkBAIC0xNDEyLDcgKzE0MjgsNyBAQAogCX0KIAogCWlmIChjdHh0LT5yZXBfcHJlZml4ICYmIChjdHh0LT5kICYgU3RyaW5nKSAmJgotCSAgICAhKGN0eHQtPmVmbGFncyAmIEVGTEdfREYpKSB7CisJICAgICEoY3R4dC0+ZWZsYWdzICYgWDg2X0VGTEFHU19ERikpIHsKIAkJY3R4dC0+ZHN0LmRhdGEgPSByYy0+ZGF0YSArIHJjLT5wb3M7CiAJCWN0eHQtPmRzdC50eXBlID0gT1BfTUVNX1NUUjsKIAkJY3R4dC0+ZHN0LmNvdW50ID0gKHJjLT5lbmQgLSByYy0+cG9zKSAvIHNpemU7CkBAIC0xNjkxLDIxICsxNzA3LDcgQEAKIAogc3RhdGljIHZvaWQgd3JpdGVfcmVnaXN0ZXJfb3BlcmFuZChzdHJ1Y3Qgb3BlcmFuZCAqb3ApCiB7Ci0JLyogVGhlIDQtYnl0ZSBjYXNlICppcyogY29ycmVjdDogaW4gNjQtYml0IG1vZGUgd2UgemVyby1leHRlbmQuICovCi0Jc3dpdGNoIChvcC0+Ynl0ZXMpIHsKLQljYXNlIDE6Ci0JCSoodTggKilvcC0+YWRkci5yZWcgPSAodTgpb3AtPnZhbDsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQkqKHUxNiAqKW9wLT5hZGRyLnJlZyA9ICh1MTYpb3AtPnZhbDsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQkqb3AtPmFkZHIucmVnID0gKHUzMilvcC0+dmFsOwotCQlicmVhazsJLyogNjRiOiB6ZXJvLWV4dGVuZCAqLwotCWNhc2UgODoKLQkJKm9wLT5hZGRyLnJlZyA9IG9wLT52YWw7Ci0JCWJyZWFrOwotCX0KKwlyZXR1cm4gYXNzaWduX3JlZ2lzdGVyKG9wLT5hZGRyLnJlZywgb3AtPnZhbCwgb3AtPmJ5dGVzKTsKIH0KIAogc3RhdGljIGludCB3cml0ZWJhY2soc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIHN0cnVjdCBvcGVyYW5kICpvcCkKQEAgLTE3OTIsMzIgKzE3OTQsMzQgQEAKIHsKIAlpbnQgcmM7CiAJdW5zaWduZWQgbG9uZyB2YWwsIGNoYW5nZV9tYXNrOwotCWludCBpb3BsID0gKGN0eHQtPmVmbGFncyAmIFg4Nl9FRkxBR1NfSU9QTCkgPj4gSU9QTF9TSElGVDsKKwlpbnQgaW9wbCA9IChjdHh0LT5lZmxhZ3MgJiBYODZfRUZMQUdTX0lPUEwpID4+IFg4Nl9FRkxBR1NfSU9QTF9CSVQ7CiAJaW50IGNwbCA9IGN0eHQtPm9wcy0+Y3BsKGN0eHQpOwogCiAJcmMgPSBlbXVsYXRlX3BvcChjdHh0LCAmdmFsLCBsZW4pOwogCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQlyZXR1cm4gcmM7CiAKLQljaGFuZ2VfbWFzayA9IEVGTEdfQ0YgfCBFRkxHX1BGIHwgRUZMR19BRiB8IEVGTEdfWkYgfCBFRkxHX1NGIHwgRUZMR19PRgotCQl8IEVGTEdfVEYgfCBFRkxHX0RGIHwgRUZMR19OVCB8IEVGTEdfQUMgfCBFRkxHX0lEOworCWNoYW5nZV9tYXNrID0gWDg2X0VGTEFHU19DRiB8IFg4Nl9FRkxBR1NfUEYgfCBYODZfRUZMQUdTX0FGIHwKKwkJICAgICAgWDg2X0VGTEFHU19aRiB8IFg4Nl9FRkxBR1NfU0YgfCBYODZfRUZMQUdTX09GIHwKKwkJICAgICAgWDg2X0VGTEFHU19URiB8IFg4Nl9FRkxBR1NfREYgfCBYODZfRUZMQUdTX05UIHwKKwkJICAgICAgWDg2X0VGTEFHU19BQyB8IFg4Nl9FRkxBR1NfSUQ7CiAKIAlzd2l0Y2goY3R4dC0+bW9kZSkgewogCWNhc2UgWDg2RU1VTF9NT0RFX1BST1Q2NDoKIAljYXNlIFg4NkVNVUxfTU9ERV9QUk9UMzI6CiAJY2FzZSBYODZFTVVMX01PREVfUFJPVDE2OgogCQlpZiAoY3BsID09IDApCi0JCQljaGFuZ2VfbWFzayB8PSBFRkxHX0lPUEw7CisJCQljaGFuZ2VfbWFzayB8PSBYODZfRUZMQUdTX0lPUEw7CiAJCWlmIChjcGwgPD0gaW9wbCkKLQkJCWNoYW5nZV9tYXNrIHw9IEVGTEdfSUY7CisJCQljaGFuZ2VfbWFzayB8PSBYODZfRUZMQUdTX0lGOwogCQlicmVhazsKIAljYXNlIFg4NkVNVUxfTU9ERV9WTTg2OgogCQlpZiAoaW9wbCA8IDMpCiAJCQlyZXR1cm4gZW11bGF0ZV9ncChjdHh0LCAwKTsKLQkJY2hhbmdlX21hc2sgfD0gRUZMR19JRjsKKwkJY2hhbmdlX21hc2sgfD0gWDg2X0VGTEFHU19JRjsKIAkJYnJlYWs7CiAJZGVmYXVsdDogLyogcmVhbCBtb2RlICovCi0JCWNoYW5nZV9tYXNrIHw9IChFRkxHX0lPUEwgfCBFRkxHX0lGKTsKKwkJY2hhbmdlX21hc2sgfD0gKFg4Nl9FRkxBR1NfSU9QTCB8IFg4Nl9FRkxBR1NfSUYpOwogCQlicmVhazsKIAl9CiAKQEAgLTE5MTgsNyArMTkyMiw3IEBACiAKIHN0YXRpYyBpbnQgZW1fcHVzaGYoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCiB7Ci0JY3R4dC0+c3JjLnZhbCA9ICh1bnNpZ25lZCBsb25nKWN0eHQtPmVmbGFncyAmIH5FRkxHX1ZNOworCWN0eHQtPnNyYy52YWwgPSAodW5zaWduZWQgbG9uZyljdHh0LT5lZmxhZ3MgJiB+WDg2X0VGTEFHU19WTTsKIAlyZXR1cm4gZW1fcHVzaChjdHh0KTsKIH0KIApAQCAtMTkyNiw2ICsxOTMwLDcgQEAKIHsKIAlpbnQgcmMgPSBYODZFTVVMX0NPTlRJTlVFOwogCWludCByZWcgPSBWQ1BVX1JFR1NfUkRJOworCXUzMiB2YWw7CiAKIAl3aGlsZSAocmVnID49IFZDUFVfUkVHU19SQVgpIHsKIAkJaWYgKHJlZyA9PSBWQ1BVX1JFR1NfUlNQKSB7CkBAIC0xOTMzLDkgKzE5MzgsMTAgQEAKIAkJCS0tcmVnOwogCQl9CiAKLQkJcmMgPSBlbXVsYXRlX3BvcChjdHh0LCByZWdfcm13KGN0eHQsIHJlZyksIGN0eHQtPm9wX2J5dGVzKTsKKwkJcmMgPSBlbXVsYXRlX3BvcChjdHh0LCAmdmFsLCBjdHh0LT5vcF9ieXRlcyk7CiAJCWlmIChyYyAhPSBYODZFTVVMX0NPTlRJTlVFKQogCQkJYnJlYWs7CisJCWFzc2lnbl9yZWdpc3RlcihyZWdfcm13KGN0eHQsIHJlZyksIHZhbCwgY3R4dC0+b3BfYnl0ZXMpOwogCQktLXJlZzsKIAl9CiAJcmV0dXJuIHJjOwpAQCAtMTk1Niw3ICsxOTYyLDcgQEAKIAlpZiAocmMgIT0gWDg2RU1VTF9DT05USU5VRSkKIAkJcmV0dXJuIHJjOwogCi0JY3R4dC0+ZWZsYWdzICY9IH4oRUZMR19JRiB8IEVGTEdfVEYgfCBFRkxHX0FDKTsKKwljdHh0LT5lZmxhZ3MgJj0gfihYODZfRUZMQUdTX0lGIHwgWDg2X0VGTEFHU19URiB8IFg4Nl9FRkxBR1NfQUMpOwogCiAJY3R4dC0+c3JjLnZhbCA9IGdldF9zZWdtZW50X3NlbGVjdG9yKGN0eHQsIFZDUFVfU1JFR19DUyk7CiAJcmMgPSBlbV9wdXNoKGN0eHQpOwpAQCAtMjAyMiwxMCArMjAyOCwxNCBAQAogCXVuc2lnbmVkIGxvbmcgdGVtcF9laXAgPSAwOwogCXVuc2lnbmVkIGxvbmcgdGVtcF9lZmxhZ3MgPSAwOwogCXVuc2lnbmVkIGxvbmcgY3MgPSAwOwotCXVuc2lnbmVkIGxvbmcgbWFzayA9IEVGTEdfQ0YgfCBFRkxHX1BGIHwgRUZMR19BRiB8IEVGTEdfWkYgfCBFRkxHX1NGIHwgRUZMR19URiB8Ci0JCQkgICAgIEVGTEdfSUYgfCBFRkxHX0RGIHwgRUZMR19PRiB8IEVGTEdfSU9QTCB8IEVGTEdfTlQgfCBFRkxHX1JGIHwKLQkJCSAgICAgRUZMR19BQyB8IEVGTEdfSUQgfCAoMSA8PCAxKTsgLyogTGFzdCBvbmUgaXMgdGhlIHJlc2VydmVkIGJpdCAqLwotCXVuc2lnbmVkIGxvbmcgdm04Nl9tYXNrID0gRUZMR19WTSB8IEVGTEdfVklGIHwgRUZMR19WSVA7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gWDg2X0VGTEFHU19DRiB8IFg4Nl9FRkxBR1NfUEYgfCBYODZfRUZMQUdTX0FGIHwKKwkJCSAgICAgWDg2X0VGTEFHU19aRiB8IFg4Nl9FRkxBR1NfU0YgfCBYODZfRUZMQUdTX1RGIHwKKwkJCSAgICAgWDg2X0VGTEFHU19JRiB8IFg4Nl9FRkxBR1NfREYgfCBYODZfRUZMQUdTX09GIHwKKwkJCSAgICAgWDg2X0VGTEFHU19JT1BMIHwgWDg2X0VGTEFHU19OVCB8IFg4Nl9FRkxBR1NfUkYgfAorCQkJICAgICBYODZfRUZMQUdTX0FDIHwgWDg2X0VGTEFHU19JRCB8CisJCQkgICAgIFg4Nl9FRkxBR1NfRklYRUQ7CisJdW5zaWduZWQgbG9uZyB2bTg2X21hc2sgPSBYODZfRUZMQUdTX1ZNIHwgWDg2X0VGTEFHU19WSUYgfAorCQkJCSAgWDg2X0VGTEFHU19WSVA7CiAKIAkvKiBUT0RPOiBBZGQgc3RhY2sgbGltaXQgY2hlY2sgKi8KIApAQCAtMjA1NCw3ICsyMDY0LDYgQEAKIAogCWN0eHQtPl9laXAgPSB0ZW1wX2VpcDsKIAotCiAJaWYgKGN0eHQtPm9wX2J5dGVzID09IDQpCiAJCWN0eHQtPmVmbGFncyA9ICgodGVtcF9lZmxhZ3MgJiBtYXNrKSB8IChjdHh0LT5lZmxhZ3MgJiB2bTg2X21hc2spKTsKIAllbHNlIGlmIChjdHh0LT5vcF9ieXRlcyA9PSAyKSB7CkBAIC0yMDYzLDcgKzIwNzIsNyBAQAogCX0KIAogCWN0eHQtPmVmbGFncyAmPSB+RUZMR19SRVNFUlZFRF9aRVJPU19NQVNLOyAvKiBDbGVhciByZXNlcnZlZCB6ZXJvcyAqLwotCWN0eHQtPmVmbGFncyB8PSBFRkxHX1JFU0VSVkVEX09ORV9NQVNLOworCWN0eHQtPmVmbGFncyB8PSBYODZfRUZMQUdTX0ZJWEVEOwogCWN0eHQtPm9wcy0+c2V0X25taV9tYXNrKGN0eHQsIGZhbHNlKTsKIAogCXJldHVybiByYzsKQEAgLTIxNDUsMTIgKzIxNTQsMTIgQEAKIAkgICAgKCh1MzIpIChvbGQgPj4gMzIpICE9ICh1MzIpIHJlZ19yZWFkKGN0eHQsIFZDUFVfUkVHU19SRFgpKSkgewogCQkqcmVnX3dyaXRlKGN0eHQsIFZDUFVfUkVHU19SQVgpID0gKHUzMikgKG9sZCA+PiAwKTsKIAkJKnJlZ193cml0ZShjdHh0LCBWQ1BVX1JFR1NfUkRYKSA9ICh1MzIpIChvbGQgPj4gMzIpOwotCQljdHh0LT5lZmxhZ3MgJj0gfkVGTEdfWkY7CisJCWN0eHQtPmVmbGFncyAmPSB+WDg2X0VGTEFHU19aRjsKIAl9IGVsc2UgewogCQljdHh0LT5kc3QudmFsNjQgPSAoKHU2NClyZWdfcmVhZChjdHh0LCBWQ1BVX1JFR1NfUkNYKSA8PCAzMikgfAogCQkJKHUzMikgcmVnX3JlYWQoY3R4dCwgVkNQVV9SRUdTX1JCWCk7CiAKLQkJY3R4dC0+ZWZsYWdzIHw9IEVGTEdfWkY7CisJCWN0eHQtPmVmbGFncyB8PSBYODZfRUZMQUdTX1pGOwogCX0KIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KQEAgLTIyMjIsNyArMjIzMSw3IEBACiAJY3R4dC0+c3JjLnZhbCA9IGN0eHQtPmRzdC5vcmlnX3ZhbDsKIAlmYXN0b3AoY3R4dCwgZW1fY21wKTsKIAotCWlmIChjdHh0LT5lZmxhZ3MgJiBFRkxHX1pGKSB7CisJaWYgKGN0eHQtPmVmbGFncyAmIFg4Nl9FRkxBR1NfWkYpIHsKIAkJLyogU3VjY2Vzczogd3JpdGUgYmFjayB0byBtZW1vcnk7IG5vIHVwZGF0ZSBvZiBFQVggKi8KIAkJY3R4dC0+c3JjLnR5cGUgPSBPUF9OT05FOwogCQljdHh0LT5kc3QudmFsID0gY3R4dC0+c3JjLm9yaWdfdmFsOwpAQCAtMjM4MSwxNCArMjM5MCwxNCBAQAogCiAJCW9wcy0+Z2V0X21zcihjdHh0LCBNU1JfU1lTQ0FMTF9NQVNLLCAmbXNyX2RhdGEpOwogCQljdHh0LT5lZmxhZ3MgJj0gfm1zcl9kYXRhOwotCQljdHh0LT5lZmxhZ3MgfD0gRUZMR19SRVNFUlZFRF9PTkVfTUFTSzsKKwkJY3R4dC0+ZWZsYWdzIHw9IFg4Nl9FRkxBR1NfRklYRUQ7CiAjZW5kaWYKIAl9IGVsc2UgewogCQkvKiBsZWdhY3kgbW9kZSAqLwogCQlvcHMtPmdldF9tc3IoY3R4dCwgTVNSX1NUQVIsICZtc3JfZGF0YSk7CiAJCWN0eHQtPl9laXAgPSAodTMyKW1zcl9kYXRhOwogCi0JCWN0eHQtPmVmbGFncyAmPSB+KEVGTEdfVk0gfCBFRkxHX0lGKTsKKwkJY3R4dC0+ZWZsYWdzICY9IH4oWDg2X0VGTEFHU19WTSB8IFg4Nl9FRkxBR1NfSUYpOwogCX0KIAogCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOwpAQCAtMjQyNSw4ICsyNDM0LDggQEAKIAlpZiAoKG1zcl9kYXRhICYgMHhmZmZjKSA9PSAweDApCiAJCXJldHVybiBlbXVsYXRlX2dwKGN0eHQsIDApOwogCi0JY3R4dC0+ZWZsYWdzICY9IH4oRUZMR19WTSB8IEVGTEdfSUYpOwotCWNzX3NlbCA9ICh1MTYpbXNyX2RhdGEgJiB+U0VMRUNUT1JfUlBMX01BU0s7CisJY3R4dC0+ZWZsYWdzICY9IH4oWDg2X0VGTEFHU19WTSB8IFg4Nl9FRkxBR1NfSUYpOworCWNzX3NlbCA9ICh1MTYpbXNyX2RhdGEgJiB+U0VHTUVOVF9SUExfTUFTSzsKIAlzc19zZWwgPSBjc19zZWwgKyA4OwogCWlmIChlZmVyICYgRUZFUl9MTUEpIHsKIAkJY3MuZCA9IDA7CkBAIC0yNDkzLDggKzI1MDIsOCBAQAogCQkJcmV0dXJuIGVtdWxhdGVfZ3AoY3R4dCwgMCk7CiAJCWJyZWFrOwogCX0KLQljc19zZWwgfD0gU0VMRUNUT1JfUlBMX01BU0s7Ci0Jc3Nfc2VsIHw9IFNFTEVDVE9SX1JQTF9NQVNLOworCWNzX3NlbCB8PSBTRUdNRU5UX1JQTF9NQVNLOworCXNzX3NlbCB8PSBTRUdNRU5UX1JQTF9NQVNLOwogCiAJb3BzLT5zZXRfc2VnbWVudChjdHh0LCBjc19zZWwsICZjcywgMCwgVkNQVV9TUkVHX0NTKTsKIAlvcHMtPnNldF9zZWdtZW50KGN0eHQsIHNzX3NlbCwgJnNzLCAwLCBWQ1BVX1NSRUdfU1MpOwpAQCAtMjUxMiw3ICsyNTIxLDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCWlmIChjdHh0LT5tb2RlID09IFg4NkVNVUxfTU9ERV9WTTg2KQogCQlyZXR1cm4gdHJ1ZTsKLQlpb3BsID0gKGN0eHQtPmVmbGFncyAmIFg4Nl9FRkxBR1NfSU9QTCkgPj4gSU9QTF9TSElGVDsKKwlpb3BsID0gKGN0eHQtPmVmbGFncyAmIFg4Nl9FRkxBR1NfSU9QTCkgPj4gWDg2X0VGTEFHU19JT1BMX0JJVDsKIAlyZXR1cm4gY3R4dC0+b3BzLT5jcGwoY3R4dCkgPiBpb3BsOwogfQogCkBAIC0yNzgyLDEwICsyNzkxLDggQEAKIAkJcmV0dXJuIHJldDsKIAlyZXQgPSBfX2xvYWRfc2VnbWVudF9kZXNjcmlwdG9yKGN0eHQsIHRzcy0+Z3MsIFZDUFVfU1JFR19HUywgY3BsLAogCQkJCQlYODZfVFJBTlNGRVJfVEFTS19TV0lUQ0gsIE5VTEwpOwotCWlmIChyZXQgIT0gWDg2RU1VTF9DT05USU5VRSkKLQkJcmV0dXJuIHJldDsKIAotCXJldHVybiBYODZFTVVMX0NPTlRJTlVFOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgdGFza19zd2l0Y2hfMzIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCkBAIC0yOTU0LDcgKzI5NjEsNyBAQAogc3RhdGljIHZvaWQgc3RyaW5nX2FkZHJfaW5jKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgcmVnLAogCQlzdHJ1Y3Qgb3BlcmFuZCAqb3ApCiB7Ci0JaW50IGRmID0gKGN0eHQtPmVmbGFncyAmIEVGTEdfREYpID8gLW9wLT5jb3VudCA6IG9wLT5jb3VudDsKKwlpbnQgZGYgPSAoY3R4dC0+ZWZsYWdzICYgWDg2X0VGTEFHU19ERikgPyAtb3AtPmNvdW50IDogb3AtPmNvdW50OwogCiAJcmVnaXN0ZXJfYWRkcmVzc19pbmNyZW1lbnQoY3R4dCwgcmVnLCBkZiAqIG9wLT5ieXRlcyk7CiAJb3AtPmFkZHIubWVtLmVhID0gcmVnaXN0ZXJfYWRkcmVzcyhjdHh0LCByZWcpOwpAQCAtMzMyMyw3ICszMzMwLDcgQEAKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAotc3RhdGljIGludCBlbV92bWNhbGwoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQpCitzdGF0aWMgaW50IGVtX2h5cGVyY2FsbChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKIAlpbnQgcmMgPSBjdHh0LT5vcHMtPmZpeF9oeXBlcmNhbGwoY3R4dCk7CiAKQEAgLTMzOTUsMTcgKzM0MDIsNiBAQAogCXJldHVybiBlbV9sZ2R0X2xpZHQoY3R4dCwgdHJ1ZSk7CiB9CiAKLXN0YXRpYyBpbnQgZW1fdm1tY2FsbChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKLXsKLQlpbnQgcmM7Ci0KLQlyYyA9IGN0eHQtPm9wcy0+Zml4X2h5cGVyY2FsbChjdHh0KTsKLQotCS8qIERpc2FibGUgd3JpdGViYWNrLiAqLwotCWN0eHQtPmRzdC50eXBlID0gT1BfTk9ORTsKLQlyZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyBpbnQgZW1fbGlkdChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKIAlyZXR1cm4gZW1fbGdkdF9saWR0KGN0eHQsIGZhbHNlKTsKQEAgLTM1MDQsNyArMzUwMCw4IEBACiB7CiAJdTMyIGZsYWdzOwogCi0JZmxhZ3MgPSBFRkxHX0NGIHwgRUZMR19QRiB8IEVGTEdfQUYgfCBFRkxHX1pGIHwgRUZMR19TRjsKKwlmbGFncyA9IFg4Nl9FRkxBR1NfQ0YgfCBYODZfRUZMQUdTX1BGIHwgWDg2X0VGTEFHU19BRiB8IFg4Nl9FRkxBR1NfWkYgfAorCQlYODZfRUZMQUdTX1NGOwogCWZsYWdzICY9ICpyZWdfcm13KGN0eHQsIFZDUFVfUkVHU19SQVgpID4+IDg7CiAKIAljdHh0LT5lZmxhZ3MgJj0gfjB4ZmZVTDsKQEAgLTM3NjksNyArMzc2Niw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Bjb2RlIGdyb3VwN19ybTBbXSA9IHsKIAlOLAotCUkoU3JjTm9uZSB8IFByaXYgfCBFbXVsYXRlT25VRCwJZW1fdm1jYWxsKSwKKwlJKFNyY05vbmUgfCBQcml2IHwgRW11bGF0ZU9uVUQsCWVtX2h5cGVyY2FsbCksCiAJTiwgTiwgTiwgTiwgTiwgTiwKIH07CiAKQEAgLTM3ODEsNyArMzc3OCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Bjb2RlIGdyb3VwN19ybTNbXSA9IHsKIAlESVAoU3JjTm9uZSB8IFByb3QgfCBQcml2LAkJdm1ydW4sCQljaGVja19zdm1lX3BhKSwKLQlJSShTcmNOb25lICB8IFByb3QgfCBFbXVsYXRlT25VRCwJZW1fdm1tY2FsbCwJdm1tY2FsbCksCisJSUkoU3JjTm9uZSAgfCBQcm90IHwgRW11bGF0ZU9uVUQsCWVtX2h5cGVyY2FsbCwJdm1tY2FsbCksCiAJRElQKFNyY05vbmUgfCBQcm90IHwgUHJpdiwJCXZtbG9hZCwJCWNoZWNrX3N2bWVfcGEpLAogCURJUChTcmNOb25lIHwgUHJvdCB8IFByaXYsCQl2bXNhdmUsCQljaGVja19zdm1lX3BhKSwKIAlESVAoU3JjTm9uZSB8IFByb3QgfCBQcml2LAkJc3RnaSwJCWNoZWNrX3N2bWUpLApAQCAtNDE5Miw3ICs0MTg5LDggQEAKIAlOLCBOLAogCUcoQml0T3AsIGdyb3VwOCksCiAJRihEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSB8IEJpdE9wIHwgTG9jayB8IFBhZ2VUYWJsZSwgZW1fYnRjKSwKLQlGKERzdFJlZyB8IFNyY01lbSB8IE1vZFJNLCBlbV9ic2YpLCBGKERzdFJlZyB8IFNyY01lbSB8IE1vZFJNLCBlbV9ic3IpLAorCUkoRHN0UmVnIHwgU3JjTWVtIHwgTW9kUk0sIGVtX2JzZl9jKSwKKwlJKERzdFJlZyB8IFNyY01lbSB8IE1vZFJNLCBlbV9ic3JfYyksCiAJRChEc3RSZWcgfCBTcmNNZW04IHwgTW9kUk0gfCBNb3YpLCBEKERzdFJlZyB8IFNyY01lbTE2IHwgTW9kUk0gfCBNb3YpLAogCS8qIDB4QzAgLSAweEM3ICovCiAJRjJidihEc3RNZW0gfCBTcmNSZWcgfCBNb2RSTSB8IFNyY1dyaXRlIHwgTG9jaywgZW1feGFkZCksCkBAIC00NzU5LDkgKzQ3NTcsOSBAQAogCWlmICgoKGN0eHQtPmIgPT0gMHhhNikgfHwgKGN0eHQtPmIgPT0gMHhhNykgfHwKIAkgICAgIChjdHh0LT5iID09IDB4YWUpIHx8IChjdHh0LT5iID09IDB4YWYpKQogCSAgICAmJiAoKChjdHh0LT5yZXBfcHJlZml4ID09IFJFUEVfUFJFRklYKSAmJgotCQkgKChjdHh0LT5lZmxhZ3MgJiBFRkxHX1pGKSA9PSAwKSkKKwkJICgoY3R4dC0+ZWZsYWdzICYgWDg2X0VGTEFHU19aRikgPT0gMCkpCiAJCXx8ICgoY3R4dC0+cmVwX3ByZWZpeCA9PSBSRVBORV9QUkVGSVgpICYmCi0JCSAgICAoKGN0eHQtPmVmbGFncyAmIEVGTEdfWkYpID09IEVGTEdfWkYpKSkpCisJCSAgICAoKGN0eHQtPmVmbGFncyAmIFg4Nl9FRkxBR1NfWkYpID09IFg4Nl9FRkxBR1NfWkYpKSkpCiAJCXJldHVybiB0cnVlOwogCiAJcmV0dXJuIGZhbHNlOwpAQCAtNDkxMyw3ICs0OTExLDcgQEAKIAkJCS8qIEFsbCBSRVAgcHJlZml4ZXMgaGF2ZSB0aGUgc2FtZSBmaXJzdCB0ZXJtaW5hdGlvbiBjb25kaXRpb24gKi8KIAkJCWlmIChhZGRyZXNzX21hc2soY3R4dCwgcmVnX3JlYWQoY3R4dCwgVkNQVV9SRUdTX1JDWCkpID09IDApIHsKIAkJCQljdHh0LT5laXAgPSBjdHh0LT5fZWlwOwotCQkJCWN0eHQtPmVmbGFncyAmPSB+RUZMR19SRjsKKwkJCQljdHh0LT5lZmxhZ3MgJj0gflg4Nl9FRkxBR1NfUkY7CiAJCQkJZ290byBkb25lOwogCQkJfQogCQl9CkBAIC00OTYzLDkgKzQ5NjEsOSBAQAogCX0KIAogCWlmIChjdHh0LT5yZXBfcHJlZml4ICYmIChjdHh0LT5kICYgU3RyaW5nKSkKLQkJY3R4dC0+ZWZsYWdzIHw9IEVGTEdfUkY7CisJCWN0eHQtPmVmbGFncyB8PSBYODZfRUZMQUdTX1JGOwogCWVsc2UKLQkJY3R4dC0+ZWZsYWdzICY9IH5FRkxHX1JGOworCQljdHh0LT5lZmxhZ3MgJj0gflg4Nl9FRkxBR1NfUkY7CiAKIAlpZiAoY3R4dC0+ZXhlY3V0ZSkgewogCQlpZiAoY3R4dC0+ZCAmIEZhc3RvcCkgewpAQCAtNTAxNCw3ICs1MDEyLDcgQEAKIAkJcmMgPSBlbXVsYXRlX2ludChjdHh0LCBjdHh0LT5zcmMudmFsKTsKIAkJYnJlYWs7CiAJY2FzZSAweGNlOgkJLyogaW50byAqLwotCQlpZiAoY3R4dC0+ZWZsYWdzICYgRUZMR19PRikKKwkJaWYgKGN0eHQtPmVmbGFncyAmIFg4Nl9FRkxBR1NfT0YpCiAJCQlyYyA9IGVtdWxhdGVfaW50KGN0eHQsIDQpOwogCQlicmVhazsKIAljYXNlIDB4ZTk6IC8qIGptcCByZWwgKi8KQEAgLTUwMjcsMTkgKzUwMjUsMTkgQEAKIAkJYnJlYWs7CiAJY2FzZSAweGY1OgkvKiBjbWMgKi8KIAkJLyogY29tcGxlbWVudCBjYXJyeSBmbGFnIGZyb20gZWZsYWdzIHJlZyAqLwotCQljdHh0LT5lZmxhZ3MgXj0gRUZMR19DRjsKKwkJY3R4dC0+ZWZsYWdzIF49IFg4Nl9FRkxBR1NfQ0Y7CiAJCWJyZWFrOwogCWNhc2UgMHhmODogLyogY2xjICovCi0JCWN0eHQtPmVmbGFncyAmPSB+RUZMR19DRjsKKwkJY3R4dC0+ZWZsYWdzICY9IH5YODZfRUZMQUdTX0NGOwogCQlicmVhazsKIAljYXNlIDB4Zjk6IC8qIHN0YyAqLwotCQljdHh0LT5lZmxhZ3MgfD0gRUZMR19DRjsKKwkJY3R4dC0+ZWZsYWdzIHw9IFg4Nl9FRkxBR1NfQ0Y7CiAJCWJyZWFrOwogCWNhc2UgMHhmYzogLyogY2xkICovCi0JCWN0eHQtPmVmbGFncyAmPSB+RUZMR19ERjsKKwkJY3R4dC0+ZWZsYWdzICY9IH5YODZfRUZMQUdTX0RGOwogCQlicmVhazsKIAljYXNlIDB4ZmQ6IC8qIHN0ZCAqLwotCQljdHh0LT5lZmxhZ3MgfD0gRUZMR19ERjsKKwkJY3R4dC0+ZWZsYWdzIHw9IFg4Nl9FRkxBR1NfREY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWdvdG8gY2Fubm90X2VtdWxhdGU7CkBAIC01MTAwLDcgKzUwOTgsNyBAQAogCQkJfQogCQkJZ290byBkb25lOyAvKiBza2lwIHJpcCB3cml0ZWJhY2sgKi8KIAkJfQotCQljdHh0LT5lZmxhZ3MgJj0gfkVGTEdfUkY7CisJCWN0eHQtPmVmbGFncyAmPSB+WDg2X0VGTEFHU19SRjsKIAl9CiAKIAljdHh0LT5laXAgPSBjdHh0LT5fZWlwOwpAQCAtNTEzNyw4ICs1MTM1LDcgQEAKIAljYXNlIDB4NDAgLi4uIDB4NGY6CS8qIGNtb3YgKi8KIAkJaWYgKHRlc3RfY2MoY3R4dC0+YiwgY3R4dC0+ZWZsYWdzKSkKIAkJCWN0eHQtPmRzdC52YWwgPSBjdHh0LT5zcmMudmFsOwotCQllbHNlIGlmIChjdHh0LT5tb2RlICE9IFg4NkVNVUxfTU9ERV9QUk9UNjQgfHwKLQkJCSBjdHh0LT5vcF9ieXRlcyAhPSA0KQorCQllbHNlIGlmIChjdHh0LT5vcF9ieXRlcyAhPSA0KQogCQkJY3R4dC0+ZHN0LnR5cGUgPSBPUF9OT05FOyAvKiBubyB3cml0ZWJhY2sgKi8KIAkJYnJlYWs7CiAJY2FzZSAweDgwIC4uLiAweDhmOiAvKiBqbnogcmVsLCBldGMqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2k4MjU0LmMgYi9hcmNoL3g4Ni9rdm0vaTgyNTQuYwppbmRleCAyOTg3ODFkLi40ZGNlNmY4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vaTgyNTQuYworKysgYi9hcmNoL3g4Ni9rdm0vaTgyNTQuYwpAQCAtNDQzLDcgKzQ0Myw4IEBACiAJCShhZGRyIDwgS1ZNX1BJVF9CQVNFX0FERFJFU1MgKyBLVk1fUElUX01FTV9MRU5HVEgpKTsKIH0KIAotc3RhdGljIGludCBwaXRfaW9wb3J0X3dyaXRlKHN0cnVjdCBrdm1faW9fZGV2aWNlICp0aGlzLAorc3RhdGljIGludCBwaXRfaW9wb3J0X3dyaXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQlzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKIAkJCSAgICBncGFfdCBhZGRyLCBpbnQgbGVuLCBjb25zdCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBrdm1fcGl0ICpwaXQgPSBkZXZfdG9fcGl0KHRoaXMpOwpAQCAtNTE5LDcgKzUyMCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGl0X2lvcG9ydF9yZWFkKHN0cnVjdCBrdm1faW9fZGV2aWNlICp0aGlzLAorc3RhdGljIGludCBwaXRfaW9wb3J0X3JlYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJICAgc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsCiAJCQkgICBncGFfdCBhZGRyLCBpbnQgbGVuLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBrdm1fcGl0ICpwaXQgPSBkZXZfdG9fcGl0KHRoaXMpOwpAQCAtNTg5LDcgKzU5MSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc3BlYWtlcl9pb3BvcnRfd3JpdGUoc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsCitzdGF0aWMgaW50IHNwZWFrZXJfaW9wb3J0X3dyaXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQlzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKIAkJCQlncGFfdCBhZGRyLCBpbnQgbGVuLCBjb25zdCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBrdm1fcGl0ICpwaXQgPSBzcGVha2VyX3RvX3BpdCh0aGlzKTsKQEAgLTYwNiw4ICs2MDksOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNwZWFrZXJfaW9wb3J0X3JlYWQoc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsCi0JCQkgICAgICAgZ3BhX3QgYWRkciwgaW50IGxlbiwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgc3BlYWtlcl9pb3BvcnRfcmVhZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJICAgc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsCisJCQkJICAgZ3BhX3QgYWRkciwgaW50IGxlbiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qga3ZtX3BpdCAqcGl0ID0gc3BlYWtlcl90b19waXQodGhpcyk7CiAJc3RydWN0IGt2bV9rcGl0X3N0YXRlICpwaXRfc3RhdGUgPSAmcGl0LT5waXRfc3RhdGU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaTgyNTQuaCBiL2FyY2gveDg2L2t2bS9pODI1NC5oCmluZGV4IGRkMWIxNmIuLmM4NDk5MGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9pODI1NC5oCisrKyBiL2FyY2gveDg2L2t2bS9pODI1NC5oCkBAIC0zLDcgKzMsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogCi0jaW5jbHVkZSAiaW9kZXYuaCIKKyNpbmNsdWRlIDxrdm0vaW9kZXYuaD4KIAogc3RydWN0IGt2bV9rcGl0X2NoYW5uZWxfc3RhdGUgewogCXUzMiBjb3VudDsgLyogY2FuIGJlIDY1NTM2ICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaTgyNTkuYyBiL2FyY2gveDg2L2t2bS9pODI1OS5jCmluZGV4IGNjMzFmN2MuLmZlZjkyMmYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9pODI1OS5jCisrKyBiL2FyY2gveDg2L2t2bS9pODI1OS5jCkBAIC01MDcsNiArNTA3LDcgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJaWYgKGxlbiAhPSAxKSB7CisJCW1lbXNldCh2YWwsIDAsIGxlbik7CiAJCXByX3BpY191bmltcGwoIm5vbiBieXRlIHJlYWRcbiIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC01MjgsNDIgKzUyOSw0MiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBpY2Rldl9tYXN0ZXJfd3JpdGUoc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcGljZGV2X21hc3Rlcl93cml0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYsCiAJCQkgICAgICAgZ3BhX3QgYWRkciwgaW50IGxlbiwgY29uc3Qgdm9pZCAqdmFsKQogewogCXJldHVybiBwaWNkZXZfd3JpdGUoY29udGFpbmVyX29mKGRldiwgc3RydWN0IGt2bV9waWMsIGRldl9tYXN0ZXIpLAogCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKIH0KIAotc3RhdGljIGludCBwaWNkZXZfbWFzdGVyX3JlYWQoc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcGljZGV2X21hc3Rlcl9yZWFkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKIAkJCSAgICAgIGdwYV90IGFkZHIsIGludCBsZW4sIHZvaWQgKnZhbCkKIHsKIAlyZXR1cm4gcGljZGV2X3JlYWQoY29udGFpbmVyX29mKGRldiwgc3RydWN0IGt2bV9waWMsIGRldl9tYXN0ZXIpLAogCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKIH0KIAotc3RhdGljIGludCBwaWNkZXZfc2xhdmVfd3JpdGUoc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKK3N0YXRpYyBpbnQgcGljZGV2X3NsYXZlX3dyaXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKIAkJCSAgICAgIGdwYV90IGFkZHIsIGludCBsZW4sIGNvbnN0IHZvaWQgKnZhbCkKIHsKIAlyZXR1cm4gcGljZGV2X3dyaXRlKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBrdm1fcGljLCBkZXZfc2xhdmUpLAogCQkJICAgIGFkZHIsIGxlbiwgdmFsKTsKIH0KIAotc3RhdGljIGludCBwaWNkZXZfc2xhdmVfcmVhZChzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2LAorc3RhdGljIGludCBwaWNkZXZfc2xhdmVfcmVhZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYsCiAJCQkgICAgIGdwYV90IGFkZHIsIGludCBsZW4sIHZvaWQgKnZhbCkKIHsKIAlyZXR1cm4gcGljZGV2X3JlYWQoY29udGFpbmVyX29mKGRldiwgc3RydWN0IGt2bV9waWMsIGRldl9zbGF2ZSksCiAJCQkgICAgYWRkciwgbGVuLCB2YWwpOwogfQogCi1zdGF0aWMgaW50IHBpY2Rldl9lY2xyX3dyaXRlKHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYsCitzdGF0aWMgaW50IHBpY2Rldl9lY2xyX3dyaXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKIAkJCSAgICAgZ3BhX3QgYWRkciwgaW50IGxlbiwgY29uc3Qgdm9pZCAqdmFsKQogewogCXJldHVybiBwaWNkZXZfd3JpdGUoY29udGFpbmVyX29mKGRldiwgc3RydWN0IGt2bV9waWMsIGRldl9lY2xyKSwKIAkJCSAgICBhZGRyLCBsZW4sIHZhbCk7CiB9CiAKLXN0YXRpYyBpbnQgcGljZGV2X2VjbHJfcmVhZChzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2LAorc3RhdGljIGludCBwaWNkZXZfZWNscl9yZWFkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKIAkJCSAgICBncGFfdCBhZGRyLCBpbnQgbGVuLCB2b2lkICp2YWwpCiB7CiAJcmV0dXJuIHBpY2Rldl9yZWFkKGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBrdm1fcGljLCBkZXZfZWNsciksCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vaW9hcGljLmMgYi9hcmNoL3g4Ni9rdm0vaW9hcGljLmMKaW5kZXggYjE5NDdlMC4uMjgxNDZmMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2lvYXBpYy5jCisrKyBiL2FyY2gveDg2L2t2bS9pb2FwaWMuYwpAQCAtMjA2LDYgKzIwNiw4IEBACiAKIAlvbGRfaXJyID0gaW9hcGljLT5pcnI7CiAJaW9hcGljLT5pcnIgfD0gbWFzazsKKwlpZiAoZWRnZSkKKwkJaW9hcGljLT5pcnJfZGVsaXZlcmVkICY9IH5tYXNrOwogCWlmICgoZWRnZSAmJiBvbGRfaXJyID09IGlvYXBpYy0+aXJyKSB8fAogCSAgICAoIWVkZ2UgJiYgZW50cnkuZmllbGRzLnJlbW90ZV9pcnIpKSB7CiAJCXJldCA9IDA7CkBAIC0zNDksNyArMzUxLDcgQEAKIAlpcnFlLnNob3J0aGFuZCA9IDA7CiAKIAlpZiAoaXJxZS50cmlnX21vZGUgPT0gSU9BUElDX0VER0VfVFJJRykKLQkJaW9hcGljLT5pcnIgJj0gfigxIDw8IGlycSk7CisJCWlvYXBpYy0+aXJyX2RlbGl2ZXJlZCB8PSAxIDw8IGlycTsKIAogCWlmIChpcnEgPT0gUlRDX0dTSSAmJiBsaW5lX3N0YXR1cykgewogCQkvKgpAQCAtNDIyLDYgKzQyNCw3IEBACiAJCQlzdHJ1Y3Qga3ZtX2lvYXBpYyAqaW9hcGljLCBpbnQgdmVjdG9yLCBpbnQgdHJpZ2dlcl9tb2RlKQogewogCWludCBpOworCXN0cnVjdCBrdm1fbGFwaWMgKmFwaWMgPSB2Y3B1LT5hcmNoLmFwaWM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSU9BUElDX05VTV9QSU5TOyBpKyspIHsKIAkJdW5pb24ga3ZtX2lvYXBpY19yZWRpcmVjdF9lbnRyeSAqZW50ID0gJmlvYXBpYy0+cmVkaXJ0YmxbaV07CkBAIC00NDMsNyArNDQ2LDggQEAKIAkJa3ZtX25vdGlmeV9hY2tlZF9pcnEoaW9hcGljLT5rdm0sIEtWTV9JUlFDSElQX0lPQVBJQywgaSk7CiAJCXNwaW5fbG9jaygmaW9hcGljLT5sb2NrKTsKIAotCQlpZiAodHJpZ2dlcl9tb2RlICE9IElPQVBJQ19MRVZFTF9UUklHKQorCQlpZiAodHJpZ2dlcl9tb2RlICE9IElPQVBJQ19MRVZFTF9UUklHIHx8CisJCSAgICBrdm1fYXBpY19nZXRfcmVnKGFwaWMsIEFQSUNfU1BJVikgJiBBUElDX1NQSVZfRElSRUNURURfRU9JKQogCQkJY29udGludWU7CiAKIAkJQVNTRVJUKGVudC0+ZmllbGRzLnRyaWdfbW9kZSA9PSBJT0FQSUNfTEVWRUxfVFJJRyk7CkBAIC00NzEsMTMgKzQ3NSw2IEBACiAJfQogfQogCi1ib29sIGt2bV9pb2FwaWNfaGFuZGxlc192ZWN0b3Ioc3RydWN0IGt2bSAqa3ZtLCBpbnQgdmVjdG9yKQotewotCXN0cnVjdCBrdm1faW9hcGljICppb2FwaWMgPSBrdm0tPmFyY2gudmlvYXBpYzsKLQlzbXBfcm1iKCk7Ci0JcmV0dXJuIHRlc3RfYml0KHZlY3RvciwgaW9hcGljLT5oYW5kbGVkX3ZlY3RvcnMpOwotfQotCiB2b2lkIGt2bV9pb2FwaWNfdXBkYXRlX2VvaShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCB2ZWN0b3IsIGludCB0cmlnZ2VyX21vZGUpCiB7CiAJc3RydWN0IGt2bV9pb2FwaWMgKmlvYXBpYyA9IHZjcHUtPmt2bS0+YXJjaC52aW9hcGljOwpAQCAtNDk4LDggKzQ5NSw4IEBACiAJCSAoYWRkciA8IGlvYXBpYy0+YmFzZV9hZGRyZXNzICsgSU9BUElDX01FTV9MRU5HVEgpKSk7CiB9CiAKLXN0YXRpYyBpbnQgaW9hcGljX21taW9fcmVhZChzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywgZ3BhX3QgYWRkciwgaW50IGxlbiwKLQkJCSAgICB2b2lkICp2YWwpCitzdGF0aWMgaW50IGlvYXBpY19tbWlvX3JlYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKKwkJCQlncGFfdCBhZGRyLCBpbnQgbGVuLCB2b2lkICp2YWwpCiB7CiAJc3RydWN0IGt2bV9pb2FwaWMgKmlvYXBpYyA9IHRvX2lvYXBpYyh0aGlzKTsKIAl1MzIgcmVzdWx0OwpAQCAtNTQxLDggKzUzOCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaW9hcGljX21taW9fd3JpdGUoc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsIGdwYV90IGFkZHIsIGludCBsZW4sCi0JCQkgICAgIGNvbnN0IHZvaWQgKnZhbCkKK3N0YXRpYyBpbnQgaW9hcGljX21taW9fd3JpdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKKwkJCQkgZ3BhX3QgYWRkciwgaW50IGxlbiwgY29uc3Qgdm9pZCAqdmFsKQogewogCXN0cnVjdCBrdm1faW9hcGljICppb2FwaWMgPSB0b19pb2FwaWModGhpcyk7CiAJdTMyIGRhdGE7CkBAIC01OTcsNiArNTk0LDcgQEAKIAlpb2FwaWMtPmJhc2VfYWRkcmVzcyA9IElPQVBJQ19ERUZBVUxUX0JBU0VfQUREUkVTUzsKIAlpb2FwaWMtPmlvcmVnc2VsID0gMDsKIAlpb2FwaWMtPmlyciA9IDA7CisJaW9hcGljLT5pcnJfZGVsaXZlcmVkID0gMDsKIAlpb2FwaWMtPmlkID0gMDsKIAltZW1zZXQoaW9hcGljLT5pcnFfZW9pLCAweDAwLCBJT0FQSUNfTlVNX1BJTlMpOwogCXJ0Y19pcnFfZW9pX3RyYWNraW5nX3Jlc2V0KGlvYXBpYyk7CkBAIC02NTQsNiArNjUyLDcgQEAKIAogCXNwaW5fbG9jaygmaW9hcGljLT5sb2NrKTsKIAltZW1jcHkoc3RhdGUsIGlvYXBpYywgc2l6ZW9mKHN0cnVjdCBrdm1faW9hcGljX3N0YXRlKSk7CisJc3RhdGUtPmlyciAmPSB+aW9hcGljLT5pcnJfZGVsaXZlcmVkOwogCXNwaW5fdW5sb2NrKCZpb2FwaWMtPmxvY2spOwogCXJldHVybiAwOwogfQpAQCAtNjY3LDYgKzY2Niw3IEBACiAJc3Bpbl9sb2NrKCZpb2FwaWMtPmxvY2spOwogCW1lbWNweShpb2FwaWMsIHN0YXRlLCBzaXplb2Yoc3RydWN0IGt2bV9pb2FwaWNfc3RhdGUpKTsKIAlpb2FwaWMtPmlyciA9IDA7CisJaW9hcGljLT5pcnJfZGVsaXZlcmVkID0gMDsKIAl1cGRhdGVfaGFuZGxlZF92ZWN0b3JzKGlvYXBpYyk7CiAJa3ZtX3ZjcHVfcmVxdWVzdF9zY2FuX2lvYXBpYyhrdm0pOwogCWt2bV9pb2FwaWNfaW5qZWN0X2FsbChpb2FwaWMsIHN0YXRlLT5pcnIpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2lvYXBpYy5oIGIvYXJjaC94ODYva3ZtL2lvYXBpYy5oCmluZGV4IGMyZTM2ZDkuLmNhMGIwYjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9pb2FwaWMuaAorKysgYi9hcmNoL3g4Ni9rdm0vaW9hcGljLmgKQEAgLTMsNyArMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogCi0jaW5jbHVkZSAiaW9kZXYuaCIKKyNpbmNsdWRlIDxrdm0vaW9kZXYuaD4KIAogc3RydWN0IGt2bTsKIHN0cnVjdCBrdm1fdmNwdTsKQEAgLTc3LDYgKzc3LDcgQEAKIAlzdHJ1Y3QgcnRjX3N0YXR1cyBydGNfc3RhdHVzOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgZW9pX2luamVjdDsKIAl1MzIgaXJxX2VvaVtJT0FQSUNfTlVNX1BJTlNdOworCXUzMiBpcnJfZGVsaXZlcmVkOwogfTsKIAogI2lmZGVmIERFQlVHCkBAIC05NywxMyArOTgsMTkgQEAKIAlyZXR1cm4ga3ZtLT5hcmNoLnZpb2FwaWM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1faW9hcGljX2hhbmRsZXNfdmVjdG9yKHN0cnVjdCBrdm0gKmt2bSwgaW50IHZlY3RvcikKK3sKKwlzdHJ1Y3Qga3ZtX2lvYXBpYyAqaW9hcGljID0ga3ZtLT5hcmNoLnZpb2FwaWM7CisJc21wX3JtYigpOworCXJldHVybiB0ZXN0X2JpdCh2ZWN0b3IsIGlvYXBpYy0+aGFuZGxlZF92ZWN0b3JzKTsKK30KKwogdm9pZCBrdm1fcnRjX2VvaV90cmFja2luZ19yZXN0b3JlX29uZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogYm9vbCBrdm1fYXBpY19tYXRjaF9kZXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9sYXBpYyAqc291cmNlLAogCQlpbnQgc2hvcnRfaGFuZCwgdW5zaWduZWQgaW50IGRlc3QsIGludCBkZXN0X21vZGUpOwogaW50IGt2bV9hcGljX2NvbXBhcmVfcHJpbyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUxLCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUyKTsKIHZvaWQga3ZtX2lvYXBpY191cGRhdGVfZW9pKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IHZlY3RvciwKIAkJCWludCB0cmlnZ2VyX21vZGUpOwotYm9vbCBrdm1faW9hcGljX2hhbmRsZXNfdmVjdG9yKHN0cnVjdCBrdm0gKmt2bSwgaW50IHZlY3Rvcik7CiBpbnQga3ZtX2lvYXBpY19pbml0KHN0cnVjdCBrdm0gKmt2bSk7CiB2b2lkIGt2bV9pb2FwaWNfZGVzdHJveShzdHJ1Y3Qga3ZtICprdm0pOwogaW50IGt2bV9pb2FwaWNfc2V0X2lycShzdHJ1Y3Qga3ZtX2lvYXBpYyAqaW9hcGljLCBpbnQgaXJxLCBpbnQgaXJxX3NvdXJjZV9pZCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9pcnEuaCBiL2FyY2gveDg2L2t2bS9pcnEuaAppbmRleCAyZDAzNTY4Li5hZDY4YzczIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vaXJxLmgKKysrIGIvYXJjaC94ODYva3ZtL2lycS5oCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogCi0jaW5jbHVkZSAiaW9kZXYuaCIKKyNpbmNsdWRlIDxrdm0vaW9kZXYuaD4KICNpbmNsdWRlICJpb2FwaWMuaCIKICNpbmNsdWRlICJsYXBpYy5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rdm0vbGFwaWMuYyBiL2FyY2gveDg2L2t2bS9sYXBpYy5jCmluZGV4IGJkNGUzNGQuLmQ2NzIwNmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9sYXBpYy5jCisrKyBiL2FyY2gveDg2L2t2bS9sYXBpYy5jCkBAIC0xMzMsNiArMTMzLDI4IEBACiAJcmV0dXJuIChrdm1fYXBpY19nZXRfcmVnKGFwaWMsIEFQSUNfSUQpID4+IDI0KSAmIDB4ZmY7CiB9CiAKKy8qIFRoZSBsb2dpY2FsIG1hcCBpcyBkZWZpbml0ZWx5IHdyb25nIGlmIHdlIGhhdmUgbXVsdGlwbGUKKyAqIG1vZGVzIGF0IHRoZSBzYW1lIHRpbWUuICAoUGh5c2ljYWwgbWFwIGlzIGFsd2F5cyByaWdodC4pCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1fYXBpY19sb2dpY2FsX21hcF92YWxpZChzdHJ1Y3Qga3ZtX2FwaWNfbWFwICptYXApCit7CisJcmV0dXJuICEobWFwLT5tb2RlICYgKG1hcC0+bW9kZSAtIDEpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCithcGljX2xvZ2ljYWxfaWQoc3RydWN0IGt2bV9hcGljX21hcCAqbWFwLCB1MzIgZGVzdF9pZCwgdTE2ICpjaWQsIHUxNiAqbGlkKQoreworCXVuc2lnbmVkIGxpZF9iaXRzOworCisJQlVJTERfQlVHX09OKEtWTV9BUElDX01PREVfWEFQSUNfQ0xVU1RFUiAhPSAgNCk7CisJQlVJTERfQlVHX09OKEtWTV9BUElDX01PREVfWEFQSUNfRkxBVCAgICAhPSAgOCk7CisJQlVJTERfQlVHX09OKEtWTV9BUElDX01PREVfWDJBUElDICAgICAgICAhPSAxNik7CisJbGlkX2JpdHMgPSBtYXAtPm1vZGU7CisKKwkqY2lkID0gZGVzdF9pZCA+PiBsaWRfYml0czsKKwkqbGlkID0gZGVzdF9pZCAmICgoMSA8PCBsaWRfYml0cykgLSAxKTsKK30KKwogc3RhdGljIHZvaWQgcmVjYWxjdWxhdGVfYXBpY19tYXAoc3RydWN0IGt2bSAqa3ZtKQogewogCXN0cnVjdCBrdm1fYXBpY19tYXAgKm5ldywgKm9sZCA9IE5VTEw7CkBAIC0xNDYsNDggKzE2OCw2IEBACiAJaWYgKCFuZXcpCiAJCWdvdG8gb3V0OwogCi0JbmV3LT5sZHJfYml0cyA9IDg7Ci0JLyogZmxhdCBtb2RlIGlzIGRlZmF1bHQgKi8KLQluZXctPmNpZF9zaGlmdCA9IDg7Ci0JbmV3LT5jaWRfbWFzayA9IDA7Ci0JbmV3LT5saWRfbWFzayA9IDB4ZmY7Ci0JbmV3LT5icm9hZGNhc3QgPSBBUElDX0JST0FEQ0FTVDsKLQotCWt2bV9mb3JfZWFjaF92Y3B1KGksIHZjcHUsIGt2bSkgewotCQlzdHJ1Y3Qga3ZtX2xhcGljICphcGljID0gdmNwdS0+YXJjaC5hcGljOwotCi0JCWlmICgha3ZtX2FwaWNfcHJlc2VudCh2Y3B1KSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChhcGljX3gyYXBpY19tb2RlKGFwaWMpKSB7Ci0JCQluZXctPmxkcl9iaXRzID0gMzI7Ci0JCQluZXctPmNpZF9zaGlmdCA9IDE2OwotCQkJbmV3LT5jaWRfbWFzayA9IG5ldy0+bGlkX21hc2sgPSAweGZmZmY7Ci0JCQluZXctPmJyb2FkY2FzdCA9IFgyQVBJQ19CUk9BRENBU1Q7Ci0JCX0gZWxzZSBpZiAoa3ZtX2FwaWNfZ2V0X3JlZyhhcGljLCBBUElDX0xEUikpIHsKLQkJCWlmIChrdm1fYXBpY19nZXRfcmVnKGFwaWMsIEFQSUNfREZSKSA9PQotCQkJCQkJCUFQSUNfREZSX0NMVVNURVIpIHsKLQkJCQluZXctPmNpZF9zaGlmdCA9IDQ7Ci0JCQkJbmV3LT5jaWRfbWFzayA9IDB4ZjsKLQkJCQluZXctPmxpZF9tYXNrID0gMHhmOwotCQkJfSBlbHNlIHsKLQkJCQluZXctPmNpZF9zaGlmdCA9IDg7Ci0JCQkJbmV3LT5jaWRfbWFzayA9IDA7Ci0JCQkJbmV3LT5saWRfbWFzayA9IDB4ZmY7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBBbGwgQVBJQ3MgaGF2ZSB0byBiZSBjb25maWd1cmVkIGluIHRoZSBzYW1lIG1vZGUgYnkgYW4gT1MuCi0JCSAqIFdlIHRha2UgYWR2YXRhZ2Ugb2YgdGhpcyB3aGlsZSBidWlsZGluZyBsb2dpY2FsIGlkIGxvb2NrdXAKLQkJICogdGFibGUuIEFmdGVyIHJlc2V0IEFQSUNzIGFyZSBpbiBzb2Z0d2FyZSBkaXNhYmxlZCBtb2RlLCBzbyBpZgotCQkgKiB3ZSBmaW5kIGFwaWMgd2l0aCBkaWZmZXJlbnQgc2V0dGluZyB3ZSBhc3N1bWUgdGhpcyBpcyB0aGUgbW9kZQotCQkgKiBPUyB3YW50cyBhbGwgYXBpY3MgdG8gYmUgaW47IGJ1aWxkIGxvb2t1cCB0YWJsZSBhY2NvcmRpbmdseS4KLQkJICovCi0JCWlmIChrdm1fYXBpY19zd19lbmFibGVkKGFwaWMpKQotCQkJYnJlYWs7Ci0JfQotCiAJa3ZtX2Zvcl9lYWNoX3ZjcHUoaSwgdmNwdSwga3ZtKSB7CiAJCXN0cnVjdCBrdm1fbGFwaWMgKmFwaWMgPSB2Y3B1LT5hcmNoLmFwaWM7CiAJCXUxNiBjaWQsIGxpZDsKQEAgLTE5OCwxMSArMTc4LDI1IEBACiAKIAkJYWlkID0ga3ZtX2FwaWNfaWQoYXBpYyk7CiAJCWxkciA9IGt2bV9hcGljX2dldF9yZWcoYXBpYywgQVBJQ19MRFIpOwotCQljaWQgPSBhcGljX2NsdXN0ZXJfaWQobmV3LCBsZHIpOwotCQlsaWQgPSBhcGljX2xvZ2ljYWxfaWQobmV3LCBsZHIpOwogCiAJCWlmIChhaWQgPCBBUlJBWV9TSVpFKG5ldy0+cGh5c19tYXApKQogCQkJbmV3LT5waHlzX21hcFthaWRdID0gYXBpYzsKKworCQlpZiAoYXBpY194MmFwaWNfbW9kZShhcGljKSkgeworCQkJbmV3LT5tb2RlIHw9IEtWTV9BUElDX01PREVfWDJBUElDOworCQl9IGVsc2UgaWYgKGxkcikgeworCQkJbGRyID0gR0VUX0FQSUNfTE9HSUNBTF9JRChsZHIpOworCQkJaWYgKGt2bV9hcGljX2dldF9yZWcoYXBpYywgQVBJQ19ERlIpID09IEFQSUNfREZSX0ZMQVQpCisJCQkJbmV3LT5tb2RlIHw9IEtWTV9BUElDX01PREVfWEFQSUNfRkxBVDsKKwkJCWVsc2UKKwkJCQluZXctPm1vZGUgfD0gS1ZNX0FQSUNfTU9ERV9YQVBJQ19DTFVTVEVSOworCQl9CisKKwkJaWYgKCFrdm1fYXBpY19sb2dpY2FsX21hcF92YWxpZChuZXcpKQorCQkJY29udGludWU7CisKKwkJYXBpY19sb2dpY2FsX2lkKG5ldywgbGRyLCAmY2lkLCAmbGlkKTsKKwogCQlpZiAobGlkICYmIGNpZCA8IEFSUkFZX1NJWkUobmV3LT5sb2dpY2FsX21hcCkpCiAJCQluZXctPmxvZ2ljYWxfbWFwW2NpZF1bZmZzKGxpZCkgLSAxXSA9IGFwaWM7CiAJfQpAQCAtNTg4LDE1ICs1ODIsMjMgQEAKIAlhcGljX3VwZGF0ZV9wcHIoYXBpYyk7CiB9CiAKLXN0YXRpYyBib29sIGt2bV9hcGljX2Jyb2FkY2FzdChzdHJ1Y3Qga3ZtX2xhcGljICphcGljLCB1MzIgZGVzdCkKK3N0YXRpYyBib29sIGt2bV9hcGljX2Jyb2FkY2FzdChzdHJ1Y3Qga3ZtX2xhcGljICphcGljLCB1MzIgbWRhKQogewotCXJldHVybiBkZXN0ID09IChhcGljX3gyYXBpY19tb2RlKGFwaWMpID8KLQkJCVgyQVBJQ19CUk9BRENBU1QgOiBBUElDX0JST0FEQ0FTVCk7CisJaWYgKGFwaWNfeDJhcGljX21vZGUoYXBpYykpCisJCXJldHVybiBtZGEgPT0gWDJBUElDX0JST0FEQ0FTVDsKKworCXJldHVybiBHRVRfQVBJQ19ERVNUX0ZJRUxEKG1kYSkgPT0gQVBJQ19CUk9BRENBU1Q7CiB9CiAKLXN0YXRpYyBib29sIGt2bV9hcGljX21hdGNoX3BoeXNpY2FsX2FkZHIoc3RydWN0IGt2bV9sYXBpYyAqYXBpYywgdTMyIGRlc3QpCitzdGF0aWMgYm9vbCBrdm1fYXBpY19tYXRjaF9waHlzaWNhbF9hZGRyKHN0cnVjdCBrdm1fbGFwaWMgKmFwaWMsIHUzMiBtZGEpCiB7Ci0JcmV0dXJuIGt2bV9hcGljX2lkKGFwaWMpID09IGRlc3QgfHwga3ZtX2FwaWNfYnJvYWRjYXN0KGFwaWMsIGRlc3QpOworCWlmIChrdm1fYXBpY19icm9hZGNhc3QoYXBpYywgbWRhKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoYXBpY194MmFwaWNfbW9kZShhcGljKSkKKwkJcmV0dXJuIG1kYSA9PSBrdm1fYXBpY19pZChhcGljKTsKKworCXJldHVybiBtZGEgPT0gU0VUX0FQSUNfREVTVF9GSUVMRChrdm1fYXBpY19pZChhcGljKSk7CiB9CiAKIHN0YXRpYyBib29sIGt2bV9hcGljX21hdGNoX2xvZ2ljYWxfYWRkcihzdHJ1Y3Qga3ZtX2xhcGljICphcGljLCB1MzIgbWRhKQpAQCAtNjEzLDYgKzYxNSw3IEBACiAJCSAgICAgICAmJiAobG9naWNhbF9pZCAmIG1kYSAmIDB4ZmZmZikgIT0gMDsKIAogCWxvZ2ljYWxfaWQgPSBHRVRfQVBJQ19MT0dJQ0FMX0lEKGxvZ2ljYWxfaWQpOworCW1kYSA9IEdFVF9BUElDX0RFU1RfRklFTEQobWRhKTsKIAogCXN3aXRjaCAoa3ZtX2FwaWNfZ2V0X3JlZyhhcGljLCBBUElDX0RGUikpIHsKIAljYXNlIEFQSUNfREZSX0ZMQVQ6CkBAIC02MjcsMTAgKzYzMCwyNyBAQAogCX0KIH0KIAorLyogS1ZNIEFQSUMgaW1wbGVtZW50YXRpb24gaGFzIHR3byBxdWlya3MKKyAqICAtIGRlc3QgYWx3YXlzIGJlZ2lucyBhdCAwIHdoaWxlIHhBUElDIE1EQSBoYXMgb2Zmc2V0IDI0LAorICogIC0gSU94QVBJQyBtZXNzYWdlcyBoYXZlIHRvIGJlIGRlbGl2ZXJlZCAoZGlyZWN0bHkpIHRvIHgyQVBJQy4KKyAqLworc3RhdGljIHUzMiBrdm1fYXBpY19tZGEodW5zaWduZWQgaW50IGRlc3RfaWQsIHN0cnVjdCBrdm1fbGFwaWMgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga3ZtX2xhcGljICp0YXJnZXQpCit7CisJYm9vbCBpcGkgPSBzb3VyY2UgIT0gTlVMTDsKKwlib29sIHgyYXBpY19tZGEgPSBhcGljX3gyYXBpY19tb2RlKGlwaSA/IHNvdXJjZSA6IHRhcmdldCk7CisKKwlpZiAoIWlwaSAmJiBkZXN0X2lkID09IEFQSUNfQlJPQURDQVNUICYmIHgyYXBpY19tZGEpCisJCXJldHVybiBYMkFQSUNfQlJPQURDQVNUOworCisJcmV0dXJuIHgyYXBpY19tZGEgPyBkZXN0X2lkIDogU0VUX0FQSUNfREVTVF9GSUVMRChkZXN0X2lkKTsKK30KKwogYm9vbCBrdm1fYXBpY19tYXRjaF9kZXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9sYXBpYyAqc291cmNlLAogCQkJICAgaW50IHNob3J0X2hhbmQsIHVuc2lnbmVkIGludCBkZXN0LCBpbnQgZGVzdF9tb2RlKQogewogCXN0cnVjdCBrdm1fbGFwaWMgKnRhcmdldCA9IHZjcHUtPmFyY2guYXBpYzsKKwl1MzIgbWRhID0ga3ZtX2FwaWNfbWRhKGRlc3QsIHNvdXJjZSwgdGFyZ2V0KTsKIAogCWFwaWNfZGVidWcoInRhcmdldCAlcCwgc291cmNlICVwLCBkZXN0IDB4JXgsICIKIAkJICAgImRlc3RfbW9kZSAweCV4LCBzaG9ydF9oYW5kIDB4JXhcbiIsCkBAIC02NDAsOSArNjYwLDkgQEAKIAlzd2l0Y2ggKHNob3J0X2hhbmQpIHsKIAljYXNlIEFQSUNfREVTVF9OT1NIT1JUOgogCQlpZiAoZGVzdF9tb2RlID09IEFQSUNfREVTVF9QSFlTSUNBTCkKLQkJCXJldHVybiBrdm1fYXBpY19tYXRjaF9waHlzaWNhbF9hZGRyKHRhcmdldCwgZGVzdCk7CisJCQlyZXR1cm4ga3ZtX2FwaWNfbWF0Y2hfcGh5c2ljYWxfYWRkcih0YXJnZXQsIG1kYSk7CiAJCWVsc2UKLQkJCXJldHVybiBrdm1fYXBpY19tYXRjaF9sb2dpY2FsX2FkZHIodGFyZ2V0LCBkZXN0KTsKKwkJCXJldHVybiBrdm1fYXBpY19tYXRjaF9sb2dpY2FsX2FkZHIodGFyZ2V0LCBtZGEpOwogCWNhc2UgQVBJQ19ERVNUX1NFTEY6CiAJCXJldHVybiB0YXJnZXQgPT0gc291cmNlOwogCWNhc2UgQVBJQ19ERVNUX0FMTElOQzoKQEAgLTY2NCw2ICs2ODQsNyBAQAogCXN0cnVjdCBrdm1fbGFwaWMgKipkc3Q7CiAJaW50IGk7CiAJYm9vbCByZXQgPSBmYWxzZTsKKwlib29sIHgyYXBpY19pcGkgPSBzcmMgJiYgYXBpY194MmFwaWNfbW9kZShzcmMpOwogCiAJKnIgPSAtMTsKIApAQCAtNjc1LDE1ICs2OTYsMTUgQEAKIAlpZiAoaXJxLT5zaG9ydGhhbmQpCiAJCXJldHVybiBmYWxzZTsKIAorCWlmIChpcnEtPmRlc3RfaWQgPT0gKHgyYXBpY19pcGkgPyBYMkFQSUNfQlJPQURDQVNUIDogQVBJQ19CUk9BRENBU1QpKQorCQlyZXR1cm4gZmFsc2U7CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAJbWFwID0gcmN1X2RlcmVmZXJlbmNlKGt2bS0+YXJjaC5hcGljX21hcCk7CiAKIAlpZiAoIW1hcCkKIAkJZ290byBvdXQ7CiAKLQlpZiAoaXJxLT5kZXN0X2lkID09IG1hcC0+YnJvYWRjYXN0KQotCQlnb3RvIG91dDsKLQogCXJldCA9IHRydWU7CiAKIAlpZiAoaXJxLT5kZXN0X21vZGUgPT0gQVBJQ19ERVNUX1BIWVNJQ0FMKSB7CkBAIC02OTIsMTYgKzcxMywyMCBAQAogCiAJCWRzdCA9ICZtYXAtPnBoeXNfbWFwW2lycS0+ZGVzdF9pZF07CiAJfSBlbHNlIHsKLQkJdTMyIG1kYSA9IGlycS0+ZGVzdF9pZCA8PCAoMzIgLSBtYXAtPmxkcl9iaXRzKTsKLQkJdTE2IGNpZCA9IGFwaWNfY2x1c3Rlcl9pZChtYXAsIG1kYSk7CisJCXUxNiBjaWQ7CisKKwkJaWYgKCFrdm1fYXBpY19sb2dpY2FsX21hcF92YWxpZChtYXApKSB7CisJCQlyZXQgPSBmYWxzZTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJYXBpY19sb2dpY2FsX2lkKG1hcCwgaXJxLT5kZXN0X2lkLCAmY2lkLCAodTE2ICopJmJpdG1hcCk7CiAKIAkJaWYgKGNpZCA+PSBBUlJBWV9TSVpFKG1hcC0+bG9naWNhbF9tYXApKQogCQkJZ290byBvdXQ7CiAKIAkJZHN0ID0gbWFwLT5sb2dpY2FsX21hcFtjaWRdOwogCi0JCWJpdG1hcCA9IGFwaWNfbG9naWNhbF9pZChtYXAsIG1kYSk7Ci0KIAkJaWYgKGlycS0+ZGVsaXZlcnlfbW9kZSA9PSBBUElDX0RNX0xPV0VTVCkgewogCQkJaW50IGwgPSAtMTsKIAkJCWZvcl9lYWNoX3NldF9iaXQoaSwgJmJpdG1hcCwgMTYpIHsKQEAgLTgzMyw4ICs4NTgsNyBAQAogCiBzdGF0aWMgdm9pZCBrdm1faW9hcGljX3NlbmRfZW9pKHN0cnVjdCBrdm1fbGFwaWMgKmFwaWMsIGludCB2ZWN0b3IpCiB7Ci0JaWYgKCEoa3ZtX2FwaWNfZ2V0X3JlZyhhcGljLCBBUElDX1NQSVYpICYgQVBJQ19TUElWX0RJUkVDVEVEX0VPSSkgJiYKLQkgICAga3ZtX2lvYXBpY19oYW5kbGVzX3ZlY3RvcihhcGljLT52Y3B1LT5rdm0sIHZlY3RvcikpIHsKKwlpZiAoa3ZtX2lvYXBpY19oYW5kbGVzX3ZlY3RvcihhcGljLT52Y3B1LT5rdm0sIHZlY3RvcikpIHsKIAkJaW50IHRyaWdnZXJfbW9kZTsKIAkJaWYgKGFwaWNfdGVzdF92ZWN0b3IodmVjdG9yLCBhcGljLT5yZWdzICsgQVBJQ19UTVIpKQogCQkJdHJpZ2dlcl9tb2RlID0gSU9BUElDX0xFVkVMX1RSSUc7CkBAIC0xMDM4LDcgKzEwNjIsNyBAQAogCSAgICBhZGRyIDwgYXBpYy0+YmFzZV9hZGRyZXNzICsgTEFQSUNfTU1JT19MRU5HVEg7CiB9CiAKLXN0YXRpYyBpbnQgYXBpY19tbWlvX3JlYWQoc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsCitzdGF0aWMgaW50IGFwaWNfbW1pb19yZWFkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsCiAJCQkgICBncGFfdCBhZGRyZXNzLCBpbnQgbGVuLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBrdm1fbGFwaWMgKmFwaWMgPSB0b19sYXBpYyh0aGlzKTsKQEAgLTEzNTgsNyArMTM4Miw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhcGljX21taW9fd3JpdGUoc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsCitzdGF0aWMgaW50IGFwaWNfbW1pb193cml0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1faW9fZGV2aWNlICp0aGlzLAogCQkJICAgIGdwYV90IGFkZHJlc3MsIGludCBsZW4sIGNvbnN0IHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGt2bV9sYXBpYyAqYXBpYyA9IHRvX2xhcGljKHRoaXMpOwpAQCAtMTQ5OCw4ICsxNTIyLDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICgha3ZtX3ZjcHVfaXNfYnNwKGFwaWMtPnZjcHUpKQotCQl2YWx1ZSAmPSB+TVNSX0lBMzJfQVBJQ0JBU0VfQlNQOwogCXZjcHUtPmFyY2guYXBpY19iYXNlID0gdmFsdWU7CiAKIAkvKiB1cGRhdGUganVtcCBsYWJlbCBpZiBlbmFibGUgYml0IGNoYW5nZXMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9sYXBpYy5oIGIvYXJjaC94ODYva3ZtL2xhcGljLmgKaW5kZXggMGJjNmM2NS4uOWQyODM4MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva3ZtL2xhcGljLmgKKysrIGIvYXJjaC94ODYva3ZtL2xhcGljLmgKQEAgLTEsNyArMSw3IEBACiAjaWZuZGVmIF9fS1ZNX1g4Nl9MQVBJQ19ICiAjZGVmaW5lIF9fS1ZNX1g4Nl9MQVBJQ19ICiAKLSNpbmNsdWRlICJpb2Rldi5oIgorI2luY2x1ZGUgPGt2bS9pb2Rldi5oPgogCiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KIApAQCAtMTQ4LDIxICsxNDgsNiBAQAogCXJldHVybiBrdm1feDg2X29wcy0+dm1faGFzX2FwaWN2KGt2bSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTE2IGFwaWNfY2x1c3Rlcl9pZChzdHJ1Y3Qga3ZtX2FwaWNfbWFwICptYXAsIHUzMiBsZHIpCi17Ci0JdTE2IGNpZDsKLQlsZHIgPj49IDMyIC0gbWFwLT5sZHJfYml0czsKLQljaWQgPSAobGRyID4+IG1hcC0+Y2lkX3NoaWZ0KSAmIG1hcC0+Y2lkX21hc2s7Ci0KLQlyZXR1cm4gY2lkOwotfQotCi1zdGF0aWMgaW5saW5lIHUxNiBhcGljX2xvZ2ljYWxfaWQoc3RydWN0IGt2bV9hcGljX21hcCAqbWFwLCB1MzIgbGRyKQotewotCWxkciA+Pj0gKDMyIC0gbWFwLT5sZHJfYml0cyk7Ci0JcmV0dXJuIGxkciAmIG1hcC0+bGlkX21hc2s7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fYXBpY19oYXNfZXZlbnRzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlyZXR1cm4gdmNwdS0+YXJjaC5hcGljLT5wZW5kaW5nX2V2ZW50czsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2t2bS9tbXUuYyBiL2FyY2gveDg2L2t2bS9tbXUuYwppbmRleCBjZWU3NTkyLi4xNDZmMjk1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vbW11LmMKKysrIGIvYXJjaC94ODYva3ZtL21tdS5jCkBAIC00NDY1LDYgKzQ0NjUsNzkgQEAKIAkJa3ZtX2ZsdXNoX3JlbW90ZV90bGJzKGt2bSk7CiB9CiAKK3N0YXRpYyBib29sIGt2bV9tbXVfemFwX2NvbGxhcHNpYmxlX3NwdGUoc3RydWN0IGt2bSAqa3ZtLAorCQl1bnNpZ25lZCBsb25nICpybWFwcCkKK3sKKwl1NjQgKnNwdGVwOworCXN0cnVjdCBybWFwX2l0ZXJhdG9yIGl0ZXI7CisJaW50IG5lZWRfdGxiX2ZsdXNoID0gMDsKKwlwZm5fdCBwZm47CisJc3RydWN0IGt2bV9tbXVfcGFnZSAqc3A7CisKKwlmb3IgKHNwdGVwID0gcm1hcF9nZXRfZmlyc3QoKnJtYXBwLCAmaXRlcik7IHNwdGVwOykgeworCQlCVUdfT04oISgqc3B0ZXAgJiBQVF9QUkVTRU5UX01BU0spKTsKKworCQlzcCA9IHBhZ2VfaGVhZGVyKF9fcGEoc3B0ZXApKTsKKwkJcGZuID0gc3B0ZV90b19wZm4oKnNwdGVwKTsKKworCQkvKgorCQkgKiBPbmx5IEVQVCBzdXBwb3J0ZWQgZm9yIG5vdzsgb3RoZXJ3aXNlLCBvbmUgd291bGQgbmVlZCB0bworCQkgKiBmaW5kIG91dCBlZmZpY2llbnRseSB3aGV0aGVyIHRoZSBndWVzdCBwYWdlIHRhYmxlcyBhcmUKKwkJICogYWxzbyB1c2luZyBodWdlIHBhZ2VzLgorCQkgKi8KKwkJaWYgKHNwLT5yb2xlLmRpcmVjdCAmJgorCQkJIWt2bV9pc19yZXNlcnZlZF9wZm4ocGZuKSAmJgorCQkJUGFnZVRyYW5zQ29tcG91bmQocGZuX3RvX3BhZ2UocGZuKSkpIHsKKwkJCWRyb3Bfc3B0ZShrdm0sIHNwdGVwKTsKKwkJCXNwdGVwID0gcm1hcF9nZXRfZmlyc3QoKnJtYXBwLCAmaXRlcik7CisJCQluZWVkX3RsYl9mbHVzaCA9IDE7CisJCX0gZWxzZQorCQkJc3B0ZXAgPSBybWFwX2dldF9uZXh0KCZpdGVyKTsKKwl9CisKKwlyZXR1cm4gbmVlZF90bGJfZmx1c2g7Cit9CisKK3ZvaWQga3ZtX21tdV96YXBfY29sbGFwc2libGVfc3B0ZXMoc3RydWN0IGt2bSAqa3ZtLAorCQkJc3RydWN0IGt2bV9tZW1vcnlfc2xvdCAqbWVtc2xvdCkKK3sKKwlib29sIGZsdXNoID0gZmFsc2U7CisJdW5zaWduZWQgbG9uZyAqcm1hcHA7CisJdW5zaWduZWQgbG9uZyBsYXN0X2luZGV4LCBpbmRleDsKKwlnZm5fdCBnZm5fc3RhcnQsIGdmbl9lbmQ7CisKKwlzcGluX2xvY2soJmt2bS0+bW11X2xvY2spOworCisJZ2ZuX3N0YXJ0ID0gbWVtc2xvdC0+YmFzZV9nZm47CisJZ2ZuX2VuZCA9IG1lbXNsb3QtPmJhc2VfZ2ZuICsgbWVtc2xvdC0+bnBhZ2VzIC0gMTsKKworCWlmIChnZm5fc3RhcnQgPj0gZ2ZuX2VuZCkKKwkJZ290byBvdXQ7CisKKwlybWFwcCA9IG1lbXNsb3QtPmFyY2gucm1hcFswXTsKKwlsYXN0X2luZGV4ID0gZ2ZuX3RvX2luZGV4KGdmbl9lbmQsIG1lbXNsb3QtPmJhc2VfZ2ZuLAorCQkJCQlQVF9QQUdFX1RBQkxFX0xFVkVMKTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8PSBsYXN0X2luZGV4OyArK2luZGV4LCArK3JtYXBwKSB7CisJCWlmICgqcm1hcHApCisJCQlmbHVzaCB8PSBrdm1fbW11X3phcF9jb2xsYXBzaWJsZV9zcHRlKGt2bSwgcm1hcHApOworCisJCWlmIChuZWVkX3Jlc2NoZWQoKSB8fCBzcGluX25lZWRicmVhaygma3ZtLT5tbXVfbG9jaykpIHsKKwkJCWlmIChmbHVzaCkgeworCQkJCWt2bV9mbHVzaF9yZW1vdGVfdGxicyhrdm0pOworCQkJCWZsdXNoID0gZmFsc2U7CisJCQl9CisJCQljb25kX3Jlc2NoZWRfbG9jaygma3ZtLT5tbXVfbG9jayk7CisJCX0KKwl9CisKKwlpZiAoZmx1c2gpCisJCWt2bV9mbHVzaF9yZW1vdGVfdGxicyhrdm0pOworCitvdXQ6CisJc3Bpbl91bmxvY2soJmt2bS0+bW11X2xvY2spOworfQorCiB2b2lkIGt2bV9tbXVfc2xvdF9sZWFmX2NsZWFyX2RpcnR5KHN0cnVjdCBrdm0gKmt2bSwKIAkJCQkgICBzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90KQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3BtdS5jIGIvYXJjaC94ODYva3ZtL3BtdS5jCmluZGV4IDhlNmI3ZDguLjI5ZmJmOWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9wbXUuYworKysgYi9hcmNoL3g4Ni9rdm0vcG11LmMKQEAgLTM4LDcgKzM4LDcgQEAKIH07CiAKIC8qIG1hcHBpbmcgYmV0d2VlbiBmaXhlZCBwbWMgaW5kZXggYW5kIGFyY2hfZXZlbnRzIGFycmF5ICovCi1pbnQgZml4ZWRfcG1jX2V2ZW50c1tdID0gezEsIDAsIDd9Oworc3RhdGljIGludCBmaXhlZF9wbWNfZXZlbnRzW10gPSB7MSwgMCwgN307CiAKIHN0YXRpYyBib29sIHBtY19pc19ncChzdHJ1Y3Qga3ZtX3BtYyAqcG1jKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3N2bS5jIGIvYXJjaC94ODYva3ZtL3N2bS5jCmluZGV4IGNjNjE4YzguLmNlNzQxYjggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS9zdm0uYworKysgYi9hcmNoL3g4Ni9rdm0vc3ZtLmMKQEAgLTEyNjEsNyArMTI2MSw3IEBACiAKIAlzdm0tPnZjcHUuYXJjaC5hcGljX2Jhc2UgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFIHwKIAkJCQkgICBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEU7Ci0JaWYgKGt2bV92Y3B1X2lzX2JzcCgmc3ZtLT52Y3B1KSkKKwlpZiAoa3ZtX3ZjcHVfaXNfcmVzZXRfYnNwKCZzdm0tPnZjcHUpKQogCQlzdm0tPnZjcHUuYXJjaC5hcGljX2Jhc2UgfD0gTVNSX0lBMzJfQVBJQ0JBU0VfQlNQOwogCiAJc3ZtX2luaXRfb3N2dygmc3ZtLT52Y3B1KTsKQEAgLTE5MjksMTQgKzE5MjksMTIgQEAKIHN0YXRpYyBpbnQgaGFsdF9pbnRlcmNlcHRpb24oc3RydWN0IHZjcHVfc3ZtICpzdm0pCiB7CiAJc3ZtLT5uZXh0X3JpcCA9IGt2bV9yaXBfcmVhZCgmc3ZtLT52Y3B1KSArIDE7Ci0Jc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbigmc3ZtLT52Y3B1KTsKIAlyZXR1cm4ga3ZtX2VtdWxhdGVfaGFsdCgmc3ZtLT52Y3B1KTsKIH0KIAogc3RhdGljIGludCB2bW1jYWxsX2ludGVyY2VwdGlvbihzdHJ1Y3QgdmNwdV9zdm0gKnN2bSkKIHsKIAlzdm0tPm5leHRfcmlwID0ga3ZtX3JpcF9yZWFkKCZzdm0tPnZjcHUpICsgMzsKLQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKCZzdm0tPnZjcHUpOwogCWt2bV9lbXVsYXRlX2h5cGVyY2FsbCgmc3ZtLT52Y3B1KTsKIAlyZXR1cm4gMTsKIH0KQEAgLTI3NTcsMTEgKzI3NTUsMTEgQEAKIHsKIAlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSAmc3ZtLT52Y3B1OwogCi0JdHJhY2Vfa3ZtX2ludmxwZ2Eoc3ZtLT52bWNiLT5zYXZlLnJpcCwgdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQ1hdLAotCQkJICB2Y3B1LT5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JBWF0pOworCXRyYWNlX2t2bV9pbnZscGdhKHN2bS0+dm1jYi0+c2F2ZS5yaXAsIGt2bV9yZWdpc3Rlcl9yZWFkKCZzdm0tPnZjcHUsIFZDUFVfUkVHU19SQ1gpLAorCQkJICBrdm1fcmVnaXN0ZXJfcmVhZCgmc3ZtLT52Y3B1LCBWQ1BVX1JFR1NfUkFYKSk7CiAKIAkvKiBMZXQncyB0cmVhdCBJTlZMUEdBIHRoZSBzYW1lIGFzIElOVkxQRyAoY2FuIGJlIG9wdGltaXplZCEpICovCi0Ja3ZtX21tdV9pbnZscGcodmNwdSwgdmNwdS0+YXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdKTsKKwlrdm1fbW11X2ludmxwZyh2Y3B1LCBrdm1fcmVnaXN0ZXJfcmVhZCgmc3ZtLT52Y3B1LCBWQ1BVX1JFR1NfUkFYKSk7CiAKIAlzdm0tPm5leHRfcmlwID0ga3ZtX3JpcF9yZWFkKCZzdm0tPnZjcHUpICsgMzsKIAlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKCZzdm0tPnZjcHUpOwpAQCAtMjc3MCwxMiArMjc2OCwxOCBAQAogCiBzdGF0aWMgaW50IHNraW5pdF9pbnRlcmNlcHRpb24oc3RydWN0IHZjcHVfc3ZtICpzdm0pCiB7Ci0JdHJhY2Vfa3ZtX3NraW5pdChzdm0tPnZtY2ItPnNhdmUucmlwLCBzdm0tPnZjcHUuYXJjaC5yZWdzW1ZDUFVfUkVHU19SQVhdKTsKKwl0cmFjZV9rdm1fc2tpbml0KHN2bS0+dm1jYi0+c2F2ZS5yaXAsIGt2bV9yZWdpc3Rlcl9yZWFkKCZzdm0tPnZjcHUsIFZDUFVfUkVHU19SQVgpKTsKIAogCWt2bV9xdWV1ZV9leGNlcHRpb24oJnN2bS0+dmNwdSwgVURfVkVDVE9SKTsKIAlyZXR1cm4gMTsKIH0KIAorc3RhdGljIGludCB3YmludmRfaW50ZXJjZXB0aW9uKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQoreworCWt2bV9lbXVsYXRlX3diaW52ZCgmc3ZtLT52Y3B1KTsKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIGludCB4c2V0YnZfaW50ZXJjZXB0aW9uKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQogewogCXU2NCBuZXdfYnYgPSBrdm1fcmVhZF9lZHhfZWF4KCZzdm0tPnZjcHUpOwpAQCAtMjkwMiw3ICsyOTA2LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotYm9vbCBjaGVja19zZWxlY3RpdmVfY3IwX2ludGVyY2VwdGVkKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtLCB1bnNpZ25lZCBsb25nIHZhbCkKK3N0YXRpYyBib29sIGNoZWNrX3NlbGVjdGl2ZV9jcjBfaW50ZXJjZXB0ZWQoc3RydWN0IHZjcHVfc3ZtICpzdm0sCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHZhbCkKIHsKIAl1bnNpZ25lZCBsb25nIGNyMCA9IHN2bS0+dmNwdS5hcmNoLmNyMDsKIAlib29sIHJldCA9IGZhbHNlOwpAQCAtMjk0MCw3ICsyOTQ1LDEwIEBACiAJCXJldHVybiBlbXVsYXRlX29uX2ludGVyY2VwdGlvbihzdm0pOwogCiAJcmVnID0gc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfaW5mb18xICYgU1ZNX0VYSVRJTkZPX1JFR19NQVNLOwotCWNyID0gc3ZtLT52bWNiLT5jb250cm9sLmV4aXRfY29kZSAtIFNWTV9FWElUX1JFQURfQ1IwOworCWlmIChzdm0tPnZtY2ItPmNvbnRyb2wuZXhpdF9jb2RlID09IFNWTV9FWElUX0NSMF9TRUxfV1JJVEUpCisJCWNyID0gU1ZNX0VYSVRfV1JJVEVfQ1IwIC0gU1ZNX0VYSVRfUkVBRF9DUjA7CisJZWxzZQorCQljciA9IHN2bS0+dm1jYi0+Y29udHJvbC5leGl0X2NvZGUgLSBTVk1fRVhJVF9SRUFEX0NSMDsKIAogCWVyciA9IDA7CiAJaWYgKGNyID49IDE2KSB7IC8qIG1vdiB0byBjciAqLwpAQCAtMzEzMyw3ICszMTQxLDcgQEAKIAogc3RhdGljIGludCByZG1zcl9pbnRlcmNlcHRpb24oc3RydWN0IHZjcHVfc3ZtICpzdm0pCiB7Ci0JdTMyIGVjeCA9IHN2bS0+dmNwdS5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JDWF07CisJdTMyIGVjeCA9IGt2bV9yZWdpc3Rlcl9yZWFkKCZzdm0tPnZjcHUsIFZDUFVfUkVHU19SQ1gpOwogCXU2NCBkYXRhOwogCiAJaWYgKHN2bV9nZXRfbXNyKCZzdm0tPnZjcHUsIGVjeCwgJmRhdGEpKSB7CkBAIC0zMTQyLDggKzMxNTAsOCBAQAogCX0gZWxzZSB7CiAJCXRyYWNlX2t2bV9tc3JfcmVhZChlY3gsIGRhdGEpOwogCi0JCXN2bS0+dmNwdS5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JBWF0gPSBkYXRhICYgMHhmZmZmZmZmZjsKLQkJc3ZtLT52Y3B1LmFyY2gucmVnc1tWQ1BVX1JFR1NfUkRYXSA9IGRhdGEgPj4gMzI7CisJCWt2bV9yZWdpc3Rlcl93cml0ZSgmc3ZtLT52Y3B1LCBWQ1BVX1JFR1NfUkFYLCBkYXRhICYgMHhmZmZmZmZmZik7CisJCWt2bV9yZWdpc3Rlcl93cml0ZSgmc3ZtLT52Y3B1LCBWQ1BVX1JFR1NfUkRYLCBkYXRhID4+IDMyKTsKIAkJc3ZtLT5uZXh0X3JpcCA9IGt2bV9yaXBfcmVhZCgmc3ZtLT52Y3B1KSArIDI7CiAJCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24oJnN2bS0+dmNwdSk7CiAJfQpAQCAtMzI0Niw5ICszMjU0LDggQEAKIHN0YXRpYyBpbnQgd3Jtc3JfaW50ZXJjZXB0aW9uKHN0cnVjdCB2Y3B1X3N2bSAqc3ZtKQogewogCXN0cnVjdCBtc3JfZGF0YSBtc3I7Ci0JdTMyIGVjeCA9IHN2bS0+dmNwdS5hcmNoLnJlZ3NbVkNQVV9SRUdTX1JDWF07Ci0JdTY0IGRhdGEgPSAoc3ZtLT52Y3B1LmFyY2gucmVnc1tWQ1BVX1JFR1NfUkFYXSAmIC0xdSkKLQkJfCAoKHU2NCkoc3ZtLT52Y3B1LmFyY2gucmVnc1tWQ1BVX1JFR1NfUkRYXSAmIC0xdSkgPDwgMzIpOworCXUzMiBlY3ggPSBrdm1fcmVnaXN0ZXJfcmVhZCgmc3ZtLT52Y3B1LCBWQ1BVX1JFR1NfUkNYKTsKKwl1NjQgZGF0YSA9IGt2bV9yZWFkX2VkeF9lYXgoJnN2bS0+dmNwdSk7CiAKIAltc3IuZGF0YSA9IGRhdGE7CiAJbXNyLmluZGV4ID0gZWN4OwpAQCAtMzMyNSw3ICszMzMyLDcgQEAKIAlbU1ZNX0VYSVRfUkVBRF9DUjNdCQkJPSBjcl9pbnRlcmNlcHRpb24sCiAJW1NWTV9FWElUX1JFQURfQ1I0XQkJCT0gY3JfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9SRUFEX0NSOF0JCQk9IGNyX2ludGVyY2VwdGlvbiwKLQlbU1ZNX0VYSVRfQ1IwX1NFTF9XUklURV0JCT0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX0NSMF9TRUxfV1JJVEVdCQk9IGNyX2ludGVyY2VwdGlvbiwKIAlbU1ZNX0VYSVRfV1JJVEVfQ1IwXQkJCT0gY3JfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9XUklURV9DUjNdCQkJPSBjcl9pbnRlcmNlcHRpb24sCiAJW1NWTV9FWElUX1dSSVRFX0NSNF0JCQk9IGNyX2ludGVyY2VwdGlvbiwKQEAgLTMzNzYsNyArMzM4Myw3IEBACiAJW1NWTV9FWElUX1NUR0ldCQkJCT0gc3RnaV9pbnRlcmNlcHRpb24sCiAJW1NWTV9FWElUX0NMR0ldCQkJCT0gY2xnaV9pbnRlcmNlcHRpb24sCiAJW1NWTV9FWElUX1NLSU5JVF0JCQk9IHNraW5pdF9pbnRlcmNlcHRpb24sCi0JW1NWTV9FWElUX1dCSU5WRF0gICAgICAgICAgICAgICAgICAgICAgID0gZW11bGF0ZV9vbl9pbnRlcmNlcHRpb24sCisJW1NWTV9FWElUX1dCSU5WRF0gICAgICAgICAgICAgICAgICAgICAgID0gd2JpbnZkX2ludGVyY2VwdGlvbiwKIAlbU1ZNX0VYSVRfTU9OSVRPUl0JCQk9IG1vbml0b3JfaW50ZXJjZXB0aW9uLAogCVtTVk1fRVhJVF9NV0FJVF0JCQk9IG13YWl0X2ludGVyY2VwdGlvbiwKIAlbU1ZNX0VYSVRfWFNFVEJWXQkJCT0geHNldGJ2X2ludGVyY2VwdGlvbiwKQEAgLTM1NTUsNyArMzU2Miw3IEBACiAKIAlpZiAoZXhpdF9jb2RlID49IEFSUkFZX1NJWkUoc3ZtX2V4aXRfaGFuZGxlcnMpCiAJICAgIHx8ICFzdm1fZXhpdF9oYW5kbGVyc1tleGl0X2NvZGVdKSB7Ci0JCVdBUk5fT05DRSgxLCAidm14OiB1bmV4cGVjdGVkIGV4aXQgcmVhc29uIDB4JXhcbiIsIGV4aXRfY29kZSk7CisJCVdBUk5fT05DRSgxLCAic3ZtOiB1bmV4cGVjdGVkIGV4aXQgcmVhc29uIDB4JXhcbiIsIGV4aXRfY29kZSk7CiAJCWt2bV9xdWV1ZV9leGNlcHRpb24odmNwdSwgVURfVkVDVE9SKTsKIAkJcmV0dXJuIDE7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3ZteC5jIGIvYXJjaC94ODYva3ZtL3ZteC5jCmluZGV4IGY3YjIwYjQuLmY1ZThkY2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS92bXguYworKysgYi9hcmNoL3g4Ni9rdm0vdm14LmMKQEAgLTIxNjgsNyArMjE2OCwxMCBAQAogewogCXVuc2lnbmVkIGxvbmcgKm1zcl9iaXRtYXA7CiAKLQlpZiAoaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSAmJiBhcGljX3gyYXBpY19tb2RlKHZjcHUtPmFyY2guYXBpYykpIHsKKwlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkKKwkJbXNyX2JpdG1hcCA9IHZteF9tc3JfYml0bWFwX25lc3RlZDsKKwllbHNlIGlmIChpcnFjaGlwX2luX2tlcm5lbCh2Y3B1LT5rdm0pICYmCisJCWFwaWNfeDJhcGljX21vZGUodmNwdS0+YXJjaC5hcGljKSkgewogCQlpZiAoaXNfbG9uZ19tb2RlKHZjcHUpKQogCQkJbXNyX2JpdG1hcCA9IHZteF9tc3JfYml0bWFwX2xvbmdtb2RlX3gyYXBpYzsKIAkJZWxzZQpAQCAtMjQ2Nyw2ICsyNDcwLDcgQEAKIAl2bXgtPm5lc3RlZC5uZXN0ZWRfdm14X3NlY29uZGFyeV9jdGxzX2xvdyA9IDA7CiAJdm14LT5uZXN0ZWQubmVzdGVkX3ZteF9zZWNvbmRhcnlfY3Rsc19oaWdoICY9CiAJCVNFQ09OREFSWV9FWEVDX1ZJUlRVQUxJWkVfQVBJQ19BQ0NFU1NFUyB8CisJCVNFQ09OREFSWV9FWEVDX1JEVFNDUCB8CiAJCVNFQ09OREFSWV9FWEVDX1ZJUlRVQUxJWkVfWDJBUElDX01PREUgfAogCQlTRUNPTkRBUllfRVhFQ19BUElDX1JFR0lTVEVSX1ZJUlQgfAogCQlTRUNPTkRBUllfRVhFQ19WSVJUVUFMX0lOVFJfREVMSVZFUlkgfApAQCAtMjQ3Niw4ICsyNDgwLDcgQEAKIAlpZiAoZW5hYmxlX2VwdCkgewogCQkvKiBuZXN0ZWQgRVBUOiBlbXVsYXRlIEVQVCBhbHNvIHRvIEwxICovCiAJCXZteC0+bmVzdGVkLm5lc3RlZF92bXhfc2Vjb25kYXJ5X2N0bHNfaGlnaCB8PQotCQkJU0VDT05EQVJZX0VYRUNfRU5BQkxFX0VQVCB8Ci0JCQlTRUNPTkRBUllfRVhFQ19VTlJFU1RSSUNURURfR1VFU1Q7CisJCQlTRUNPTkRBUllfRVhFQ19FTkFCTEVfRVBUOwogCQl2bXgtPm5lc3RlZC5uZXN0ZWRfdm14X2VwdF9jYXBzID0gVk1YX0VQVF9QQUdFX1dBTEtfNF9CSVQgfAogCQkJIFZNWF9FUFRQX1dCX0JJVCB8IFZNWF9FUFRfMk1CX1BBR0VfQklUIHwKIAkJCSBWTVhfRVBUX0lOVkVQVF9CSVQ7CkBAIC0yNDkxLDYgKzI0OTQsMTAgQEAKIAl9IGVsc2UKIAkJdm14LT5uZXN0ZWQubmVzdGVkX3ZteF9lcHRfY2FwcyA9IDA7CiAKKwlpZiAoZW5hYmxlX3VucmVzdHJpY3RlZF9ndWVzdCkKKwkJdm14LT5uZXN0ZWQubmVzdGVkX3ZteF9zZWNvbmRhcnlfY3Rsc19oaWdoIHw9CisJCQlTRUNPTkRBUllfRVhFQ19VTlJFU1RSSUNURURfR1VFU1Q7CisKIAkvKiBtaXNjZWxsYW5lb3VzIGRhdGEgKi8KIAlyZG1zcihNU1JfSUEzMl9WTVhfTUlTQywKIAkJdm14LT5uZXN0ZWQubmVzdGVkX3ZteF9taXNjX2xvdywKQEAgLTMyNjIsOCArMzI2OSw4IEBACiAJCSAqIGRlZmF1bHQgdmFsdWUuCiAJCSAqLwogCQlpZiAoc2VnID09IFZDUFVfU1JFR19DUyB8fCBzZWcgPT0gVkNQVV9TUkVHX1NTKQotCQkJc2F2ZS0+c2VsZWN0b3IgJj0gflNFTEVDVE9SX1JQTF9NQVNLOwotCQlzYXZlLT5kcGwgPSBzYXZlLT5zZWxlY3RvciAmIFNFTEVDVE9SX1JQTF9NQVNLOworCQkJc2F2ZS0+c2VsZWN0b3IgJj0gflNFR01FTlRfUlBMX01BU0s7CisJCXNhdmUtPmRwbCA9IHNhdmUtPnNlbGVjdG9yICYgU0VHTUVOVF9SUExfTUFTSzsKIAkJc2F2ZS0+cyA9IDE7CiAJfQogCXZteF9zZXRfc2VnbWVudCh2Y3B1LCBzYXZlLCBzZWcpOwpAQCAtMzgzNiw3ICszODQzLDcgQEAKIAl1bnNpZ25lZCBpbnQgY3NfcnBsOwogCiAJdm14X2dldF9zZWdtZW50KHZjcHUsICZjcywgVkNQVV9TUkVHX0NTKTsKLQljc19ycGwgPSBjcy5zZWxlY3RvciAmIFNFTEVDVE9SX1JQTF9NQVNLOworCWNzX3JwbCA9IGNzLnNlbGVjdG9yICYgU0VHTUVOVF9SUExfTUFTSzsKIAogCWlmIChjcy51bnVzYWJsZSkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMzg2NCw3ICszODcxLDcgQEAKIAl1bnNpZ25lZCBpbnQgc3NfcnBsOwogCiAJdm14X2dldF9zZWdtZW50KHZjcHUsICZzcywgVkNQVV9TUkVHX1NTKTsKLQlzc19ycGwgPSBzcy5zZWxlY3RvciAmIFNFTEVDVE9SX1JQTF9NQVNLOworCXNzX3JwbCA9IHNzLnNlbGVjdG9yICYgU0VHTUVOVF9SUExfTUFTSzsKIAogCWlmIChzcy51bnVzYWJsZSkKIAkJcmV0dXJuIHRydWU7CkBAIC0zODg2LDcgKzM4OTMsNyBAQAogCXVuc2lnbmVkIGludCBycGw7CiAKIAl2bXhfZ2V0X3NlZ21lbnQodmNwdSwgJnZhciwgc2VnKTsKLQlycGwgPSB2YXIuc2VsZWN0b3IgJiBTRUxFQ1RPUl9SUExfTUFTSzsKKwlycGwgPSB2YXIuc2VsZWN0b3IgJiBTRUdNRU5UX1JQTF9NQVNLOwogCiAJaWYgKHZhci51bnVzYWJsZSkKIAkJcmV0dXJuIHRydWU7CkBAIC0zOTEzLDcgKzM5MjAsNyBAQAogCiAJaWYgKHRyLnVudXNhYmxlKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHRyLnNlbGVjdG9yICYgU0VMRUNUT1JfVElfTUFTSykJLyogVEkgPSAxICovCisJaWYgKHRyLnNlbGVjdG9yICYgU0VHTUVOVF9USV9NQVNLKQkvKiBUSSA9IDEgKi8KIAkJcmV0dXJuIGZhbHNlOwogCWlmICh0ci50eXBlICE9IDMgJiYgdHIudHlwZSAhPSAxMSkgLyogVE9ETzogQ2hlY2sgaWYgZ3Vlc3QgaXMgaW4gSUEzMmUgbW9kZSAqLwogCQlyZXR1cm4gZmFsc2U7CkBAIC0zOTMxLDcgKzM5MzgsNyBAQAogCiAJaWYgKGxkdHIudW51c2FibGUpCiAJCXJldHVybiB0cnVlOwotCWlmIChsZHRyLnNlbGVjdG9yICYgU0VMRUNUT1JfVElfTUFTSykJLyogVEkgPSAxICovCisJaWYgKGxkdHIuc2VsZWN0b3IgJiBTRUdNRU5UX1RJX01BU0spCS8qIFRJID0gMSAqLwogCQlyZXR1cm4gZmFsc2U7CiAJaWYgKGxkdHIudHlwZSAhPSAyKQogCQlyZXR1cm4gZmFsc2U7CkBAIC0zOTQ4LDggKzM5NTUsOCBAQAogCXZteF9nZXRfc2VnbWVudCh2Y3B1LCAmY3MsIFZDUFVfU1JFR19DUyk7CiAJdm14X2dldF9zZWdtZW50KHZjcHUsICZzcywgVkNQVV9TUkVHX1NTKTsKIAotCXJldHVybiAoKGNzLnNlbGVjdG9yICYgU0VMRUNUT1JfUlBMX01BU0spID09Ci0JCSAoc3Muc2VsZWN0b3IgJiBTRUxFQ1RPUl9SUExfTUFTSykpOworCXJldHVybiAoKGNzLnNlbGVjdG9yICYgU0VHTUVOVF9SUExfTUFTSykgPT0KKwkJIChzcy5zZWxlY3RvciAmIFNFR01FTlRfUlBMX01BU0spKTsKIH0KIAogLyoKQEAgLTQ3MDUsNyArNDcxMiw3IEBACiAJdm14LT52Y3B1LmFyY2gucmVnc1tWQ1BVX1JFR1NfUkRYXSA9IGdldF9yZHhfaW5pdF92YWwoKTsKIAlrdm1fc2V0X2NyOCgmdm14LT52Y3B1LCAwKTsKIAlhcGljX2Jhc2VfbXNyLmRhdGEgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFIHwgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFOwotCWlmIChrdm1fdmNwdV9pc19ic3AoJnZteC0+dmNwdSkpCisJaWYgKGt2bV92Y3B1X2lzX3Jlc2V0X2JzcCgmdm14LT52Y3B1KSkKIAkJYXBpY19iYXNlX21zci5kYXRhIHw9IE1TUl9JQTMyX0FQSUNCQVNFX0JTUDsKIAlhcGljX2Jhc2VfbXNyLmhvc3RfaW5pdGlhdGVkID0gdHJ1ZTsKIAlrdm1fc2V0X2FwaWNfYmFzZSgmdm14LT52Y3B1LCAmYXBpY19iYXNlX21zcik7CkBAIC01MDAwLDcgKzUwMDcsNyBAQAogCQlpZiAoZW11bGF0ZV9pbnN0cnVjdGlvbih2Y3B1LCAwKSA9PSBFTVVMQVRFX0RPTkUpIHsKIAkJCWlmICh2Y3B1LT5hcmNoLmhhbHRfcmVxdWVzdCkgewogCQkJCXZjcHUtPmFyY2guaGFsdF9yZXF1ZXN0ID0gMDsKLQkJCQlyZXR1cm4ga3ZtX2VtdWxhdGVfaGFsdCh2Y3B1KTsKKwkJCQlyZXR1cm4ga3ZtX3ZjcHVfaGFsdCh2Y3B1KTsKIAkJCX0KIAkJCXJldHVybiAxOwogCQl9CkBAIC01MDY1LDYgKzUwNzIsMTAgQEAKIAl9CiAKIAlpZiAoaXNfaW52YWxpZF9vcGNvZGUoaW50cl9pbmZvKSkgeworCQlpZiAoaXNfZ3Vlc3RfbW9kZSh2Y3B1KSkgeworCQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbih2Y3B1LCBVRF9WRUNUT1IpOworCQkJcmV0dXJuIDE7CisJCX0KIAkJZXIgPSBlbXVsYXRlX2luc3RydWN0aW9uKHZjcHUsIEVNVUxUWVBFX1RSQVBfVUQpOwogCQlpZiAoZXIgIT0gRU1VTEFURV9ET05FKQogCQkJa3ZtX3F1ZXVlX2V4Y2VwdGlvbih2Y3B1LCBVRF9WRUNUT1IpOwpAQCAtNTA4NCw5ICs1MDk1LDEwIEBACiAJICAgICEoaXNfcGFnZV9mYXVsdChpbnRyX2luZm8pICYmICEoZXJyb3JfY29kZSAmIFBGRVJSX1JTVkRfTUFTSykpKSB7CiAJCXZjcHUtPnJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRFUk5BTF9FUlJPUjsKIAkJdmNwdS0+cnVuLT5pbnRlcm5hbC5zdWJlcnJvciA9IEtWTV9JTlRFUk5BTF9FUlJPUl9TSU1VTF9FWDsKLQkJdmNwdS0+cnVuLT5pbnRlcm5hbC5uZGF0YSA9IDI7CisJCXZjcHUtPnJ1bi0+aW50ZXJuYWwubmRhdGEgPSAzOwogCQl2Y3B1LT5ydW4tPmludGVybmFsLmRhdGFbMF0gPSB2ZWN0X2luZm87CiAJCXZjcHUtPnJ1bi0+aW50ZXJuYWwuZGF0YVsxXSA9IGludHJfaW5mbzsKKwkJdmNwdS0+cnVuLT5pbnRlcm5hbC5kYXRhWzJdID0gZXJyb3JfY29kZTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC01NTI3LDEzICs1NTM5LDExIEBACiAKIHN0YXRpYyBpbnQgaGFuZGxlX2hhbHQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CiAJcmV0dXJuIGt2bV9lbXVsYXRlX2hhbHQodmNwdSk7CiB9CiAKIHN0YXRpYyBpbnQgaGFuZGxlX3ZtY2FsbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Jc2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKIAlrdm1fZW11bGF0ZV9oeXBlcmNhbGwodmNwdSk7CiAJcmV0dXJuIDE7CiB9CkBAIC01NTY0LDcgKzU1NzQsNiBAQAogCiBzdGF0aWMgaW50IGhhbmRsZV93YmludmQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewotCXNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CiAJa3ZtX2VtdWxhdGVfd2JpbnZkKHZjcHUpOwogCXJldHVybiAxOwogfQpAQCAtNTgyMiw3ICs1ODMxLDcgQEAKIAlncGFfdCBncGE7CiAKIAlncGEgPSB2bWNzX3JlYWQ2NChHVUVTVF9QSFlTSUNBTF9BRERSRVNTKTsKLQlpZiAoIWt2bV9pb19idXNfd3JpdGUodmNwdS0+a3ZtLCBLVk1fRkFTVF9NTUlPX0JVUywgZ3BhLCAwLCBOVUxMKSkgeworCWlmICgha3ZtX2lvX2J1c193cml0ZSh2Y3B1LCBLVk1fRkFTVF9NTUlPX0JVUywgZ3BhLCAwLCBOVUxMKSkgewogCQlza2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC01OTAzLDcgKzU5MTIsNyBAQAogCiAJCWlmICh2Y3B1LT5hcmNoLmhhbHRfcmVxdWVzdCkgewogCQkJdmNwdS0+YXJjaC5oYWx0X3JlcXVlc3QgPSAwOwotCQkJcmV0ID0ga3ZtX2VtdWxhdGVfaGFsdCh2Y3B1KTsKKwkJCXJldCA9IGt2bV92Y3B1X2hhbHQodmNwdSk7CiAJCQlnb3RvIG91dDsKIAkJfQogCkBAIC03MzEyLDIxICs3MzIxLDIxIEBACiAJCWVsc2UgaWYgKHBvcnQgPCAweDEwMDAwKQogCQkJYml0bWFwID0gdm1jczEyLT5pb19iaXRtYXBfYjsKIAkJZWxzZQotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gdHJ1ZTsKIAkJYml0bWFwICs9IChwb3J0ICYgMHg3ZmZmKSAvIDg7CiAKIAkJaWYgKGxhc3RfYml0bWFwICE9IGJpdG1hcCkKIAkJCWlmIChrdm1fcmVhZF9ndWVzdCh2Y3B1LT5rdm0sIGJpdG1hcCwgJmIsIDEpKQotCQkJCXJldHVybiAxOworCQkJCXJldHVybiB0cnVlOwogCQlpZiAoYiAmICgxIDw8IChwb3J0ICYgNykpKQotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gdHJ1ZTsKIAogCQlwb3J0Kys7CiAJCXNpemUtLTsKIAkJbGFzdF9iaXRtYXAgPSBiaXRtYXA7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKgpAQCAtNzM0Miw3ICs3MzUxLDcgQEAKIAlncGFfdCBiaXRtYXA7CiAKIAlpZiAoIW5lc3RlZF9jcHVfaGFzKHZtY3MxMiwgQ1BVX0JBU0VEX1VTRV9NU1JfQklUTUFQUykpCi0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAogCS8qCiAJICogVGhlIE1TUl9CSVRNQVAgcGFnZSBpcyBkaXZpZGVkIGludG8gZm91ciAxMDI0LWJ5dGUgYml0bWFwcywKQEAgLTczNjEsMTAgKzczNzAsMTAgQEAKIAlpZiAobXNyX2luZGV4IDwgMTAyNCo4KSB7CiAJCXVuc2lnbmVkIGNoYXIgYjsKIAkJaWYgKGt2bV9yZWFkX2d1ZXN0KHZjcHUtPmt2bSwgYml0bWFwICsgbXNyX2luZGV4LzgsICZiLCAxKSkKLQkJCXJldHVybiAxOworCQkJcmV0dXJuIHRydWU7CiAJCXJldHVybiAxICYgKGIgPj4gKG1zcl9pbmRleCAmIDcpKTsKIAl9IGVsc2UKLQkJcmV0dXJuIDE7IC8qIGxldCBMMSBoYW5kbGUgdGhlIHdyb25nIHBhcmFtZXRlciAqLworCQlyZXR1cm4gdHJ1ZTsgLyogbGV0IEwxIGhhbmRsZSB0aGUgd3JvbmcgcGFyYW1ldGVyICovCiB9CiAKIC8qCkBAIC03Mzg2LDcgKzczOTUsNyBAQAogCQljYXNlIDA6CiAJCQlpZiAodm1jczEyLT5jcjBfZ3Vlc3RfaG9zdF9tYXNrICYKIAkJCSAgICAodmFsIF4gdm1jczEyLT5jcjBfcmVhZF9zaGFkb3cpKQotCQkJCXJldHVybiAxOworCQkJCXJldHVybiB0cnVlOwogCQkJYnJlYWs7CiAJCWNhc2UgMzoKIAkJCWlmICgodm1jczEyLT5jcjNfdGFyZ2V0X2NvdW50ID49IDEgJiYKQEAgLTczOTcsMzcgKzc0MDYsMzcgQEAKIAkJCQkJdm1jczEyLT5jcjNfdGFyZ2V0X3ZhbHVlMiA9PSB2YWwpIHx8CiAJCQkJKHZtY3MxMi0+Y3IzX3RhcmdldF9jb3VudCA+PSA0ICYmCiAJCQkJCXZtY3MxMi0+Y3IzX3RhcmdldF92YWx1ZTMgPT0gdmFsKSkKLQkJCQlyZXR1cm4gMDsKKwkJCQlyZXR1cm4gZmFsc2U7CiAJCQlpZiAobmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfQ1IzX0xPQURfRVhJVElORykpCi0JCQkJcmV0dXJuIDE7CisJCQkJcmV0dXJuIHRydWU7CiAJCQlicmVhazsKIAkJY2FzZSA0OgogCQkJaWYgKHZtY3MxMi0+Y3I0X2d1ZXN0X2hvc3RfbWFzayAmCiAJCQkgICAgKHZtY3MxMi0+Y3I0X3JlYWRfc2hhZG93IF4gdmFsKSkKLQkJCQlyZXR1cm4gMTsKKwkJCQlyZXR1cm4gdHJ1ZTsKIAkJCWJyZWFrOwogCQljYXNlIDg6CiAJCQlpZiAobmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfQ1I4X0xPQURfRVhJVElORykpCi0JCQkJcmV0dXJuIDE7CisJCQkJcmV0dXJuIHRydWU7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAljYXNlIDI6IC8qIGNsdHMgKi8KIAkJaWYgKCh2bWNzMTItPmNyMF9ndWVzdF9ob3N0X21hc2sgJiBYODZfQ1IwX1RTKSAmJgogCQkgICAgKHZtY3MxMi0+Y3IwX3JlYWRfc2hhZG93ICYgWDg2X0NSMF9UUykpCi0JCQlyZXR1cm4gMTsKKwkJCXJldHVybiB0cnVlOwogCQlicmVhazsKIAljYXNlIDE6IC8qIG1vdiBmcm9tIGNyICovCiAJCXN3aXRjaCAoY3IpIHsKIAkJY2FzZSAzOgogCQkJaWYgKHZtY3MxMi0+Y3B1X2Jhc2VkX3ZtX2V4ZWNfY29udHJvbCAmCiAJCQkgICAgQ1BVX0JBU0VEX0NSM19TVE9SRV9FWElUSU5HKQotCQkJCXJldHVybiAxOworCQkJCXJldHVybiB0cnVlOwogCQkJYnJlYWs7CiAJCWNhc2UgODoKIAkJCWlmICh2bWNzMTItPmNwdV9iYXNlZF92bV9leGVjX2NvbnRyb2wgJgogCQkJICAgIENQVV9CQVNFRF9DUjhfU1RPUkVfRVhJVElORykKLQkJCQlyZXR1cm4gMTsKKwkJCQlyZXR1cm4gdHJ1ZTsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtNzQzOCwxNCArNzQ0NywxNCBAQAogCQkgKi8KIAkJaWYgKHZtY3MxMi0+Y3IwX2d1ZXN0X2hvc3RfbWFzayAmIDB4ZSAmCiAJCSAgICAodmFsIF4gdm1jczEyLT5jcjBfcmVhZF9zaGFkb3cpKQotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gdHJ1ZTsKIAkJaWYgKCh2bWNzMTItPmNyMF9ndWVzdF9ob3N0X21hc2sgJiAweDEpICYmCiAJCSAgICAhKHZtY3MxMi0+Y3IwX3JlYWRfc2hhZG93ICYgMHgxKSAmJgogCQkgICAgKHZhbCAmIDB4MSkpCi0JCQlyZXR1cm4gMTsKKwkJCXJldHVybiB0cnVlOwogCQlicmVhazsKIAl9Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKgpAQCAtNzQ2OCw0OCArNzQ3Nyw0OCBAQAogCQkJCUtWTV9JU0FfVk1YKTsKIAogCWlmICh2bXgtPm5lc3RlZC5uZXN0ZWRfcnVuX3BlbmRpbmcpCi0JCXJldHVybiAwOworCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAodW5saWtlbHkodm14LT5mYWlsKSkgewogCQlwcl9pbmZvX3JhdGVsaW1pdGVkKCIlcyBmYWlsZWQgdm0gZW50cnkgJXhcbiIsIF9fZnVuY19fLAogCQkJCSAgICB2bWNzX3JlYWQzMihWTV9JTlNUUlVDVElPTl9FUlJPUikpOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJc3dpdGNoIChleGl0X3JlYXNvbikgewogCWNhc2UgRVhJVF9SRUFTT05fRVhDRVBUSU9OX05NSToKIAkJaWYgKCFpc19leGNlcHRpb24oaW50cl9pbmZvKSkKLQkJCXJldHVybiAwOworCQkJcmV0dXJuIGZhbHNlOwogCQllbHNlIGlmIChpc19wYWdlX2ZhdWx0KGludHJfaW5mbykpCiAJCQlyZXR1cm4gZW5hYmxlX2VwdDsKIAkJZWxzZSBpZiAoaXNfbm9fZGV2aWNlKGludHJfaW5mbykgJiYKIAkJCSAhKHZtY3MxMi0+Z3Vlc3RfY3IwICYgWDg2X0NSMF9UUykpCi0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIHZtY3MxMi0+ZXhjZXB0aW9uX2JpdG1hcCAmCiAJCQkJKDF1IDw8IChpbnRyX2luZm8gJiBJTlRSX0lORk9fVkVDVE9SX01BU0spKTsKIAljYXNlIEVYSVRfUkVBU09OX0VYVEVSTkFMX0lOVEVSUlVQVDoKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAljYXNlIEVYSVRfUkVBU09OX1RSSVBMRV9GQVVMVDoKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCWNhc2UgRVhJVF9SRUFTT05fUEVORElOR19JTlRFUlJVUFQ6CiAJCXJldHVybiBuZXN0ZWRfY3B1X2hhcyh2bWNzMTIsIENQVV9CQVNFRF9WSVJUVUFMX0lOVFJfUEVORElORyk7CiAJY2FzZSBFWElUX1JFQVNPTl9OTUlfV0lORE9XOgogCQlyZXR1cm4gbmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfVklSVFVBTF9OTUlfUEVORElORyk7CiAJY2FzZSBFWElUX1JFQVNPTl9UQVNLX1NXSVRDSDoKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCWNhc2UgRVhJVF9SRUFTT05fQ1BVSUQ6CiAJCWlmIChrdm1fcmVnaXN0ZXJfcmVhZCh2Y3B1LCBWQ1BVX1JFR1NfUkFYKSA9PSAweGEpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gZmFsc2U7CisJCXJldHVybiB0cnVlOwogCWNhc2UgRVhJVF9SRUFTT05fSExUOgogCQlyZXR1cm4gbmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfSExUX0VYSVRJTkcpOwogCWNhc2UgRVhJVF9SRUFTT05fSU5WRDoKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCWNhc2UgRVhJVF9SRUFTT05fSU5WTFBHOgogCQlyZXR1cm4gbmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfSU5WTFBHX0VYSVRJTkcpOwogCWNhc2UgRVhJVF9SRUFTT05fUkRQTUM6CiAJCXJldHVybiBuZXN0ZWRfY3B1X2hhcyh2bWNzMTIsIENQVV9CQVNFRF9SRFBNQ19FWElUSU5HKTsKLQljYXNlIEVYSVRfUkVBU09OX1JEVFNDOgorCWNhc2UgRVhJVF9SRUFTT05fUkRUU0M6IGNhc2UgRVhJVF9SRUFTT05fUkRUU0NQOgogCQlyZXR1cm4gbmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfUkRUU0NfRVhJVElORyk7CiAJY2FzZSBFWElUX1JFQVNPTl9WTUNBTEw6IGNhc2UgRVhJVF9SRUFTT05fVk1DTEVBUjoKIAljYXNlIEVYSVRfUkVBU09OX1ZNTEFVTkNIOiBjYXNlIEVYSVRfUkVBU09OX1ZNUFRSTEQ6CkBAIC03NTIxLDcgKzc1MzAsNyBAQAogCQkgKiBWTVggaW5zdHJ1Y3Rpb25zIHRyYXAgdW5jb25kaXRpb25hbGx5LiBUaGlzIGFsbG93cyBMMSB0bwogCQkgKiBlbXVsYXRlIHRoZW0gZm9yIGl0cyBMMiBndWVzdCwgaS5lLiwgYWxsb3dzIDMtbGV2ZWwgbmVzdGluZyEKIAkJICovCi0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAljYXNlIEVYSVRfUkVBU09OX0NSX0FDQ0VTUzoKIAkJcmV0dXJuIG5lc3RlZF92bXhfZXhpdF9oYW5kbGVkX2NyKHZjcHUsIHZtY3MxMik7CiAJY2FzZSBFWElUX1JFQVNPTl9EUl9BQ0NFU1M6CkBAIC03NTMyLDcgKzc1NDEsNyBAQAogCWNhc2UgRVhJVF9SRUFTT05fTVNSX1dSSVRFOgogCQlyZXR1cm4gbmVzdGVkX3ZteF9leGl0X2hhbmRsZWRfbXNyKHZjcHUsIHZtY3MxMiwgZXhpdF9yZWFzb24pOwogCWNhc2UgRVhJVF9SRUFTT05fSU5WQUxJRF9TVEFURToKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCWNhc2UgRVhJVF9SRUFTT05fTVdBSVRfSU5TVFJVQ1RJT046CiAJCXJldHVybiBuZXN0ZWRfY3B1X2hhcyh2bWNzMTIsIENQVV9CQVNFRF9NV0FJVF9FWElUSU5HKTsKIAljYXNlIEVYSVRfUkVBU09OX01PTklUT1JfSU5TVFJVQ1RJT046CkBAIC03NTQyLDcgKzc1NTEsNyBAQAogCQkJbmVzdGVkX2NwdV9oYXMyKHZtY3MxMiwKIAkJCQlTRUNPTkRBUllfRVhFQ19QQVVTRV9MT09QX0VYSVRJTkcpOwogCWNhc2UgRVhJVF9SRUFTT05fTUNFX0RVUklOR19WTUVOVFJZOgotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCWNhc2UgRVhJVF9SRUFTT05fVFBSX0JFTE9XX1RIUkVTSE9MRDoKIAkJcmV0dXJuIG5lc3RlZF9jcHVfaGFzKHZtY3MxMiwgQ1BVX0JBU0VEX1RQUl9TSEFET1cpOwogCWNhc2UgRVhJVF9SRUFTT05fQVBJQ19BQ0NFU1M6CkBAIC03NTUxLDcgKzc1NjAsNyBAQAogCWNhc2UgRVhJVF9SRUFTT05fQVBJQ19XUklURToKIAljYXNlIEVYSVRfUkVBU09OX0VPSV9JTkRVQ0VEOgogCQkvKiBhcGljX3dyaXRlIGFuZCBlb2lfaW5kdWNlZCBzaG91bGQgZXhpdCB1bmNvbmRpdGlvbmFsbHkuICovCi0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAljYXNlIEVYSVRfUkVBU09OX0VQVF9WSU9MQVRJT046CiAJCS8qCiAJCSAqIEwwIGFsd2F5cyBkZWFscyB3aXRoIHRoZSBFUFQgdmlvbGF0aW9uLiBJZiBuZXN0ZWQgRVBUIGlzCkBAIC03NTU5LDcgKzc1NjgsNyBAQAogCQkgKiBtaXNzaW5nIGluIHRoZSBndWVzdCBFUFQgdGFibGUgKEVQVDEyKSwgdGhlIEVQVCB2aW9sYXRpb24KIAkJICogd2lsbCBiZSBpbmplY3RlZCB3aXRoIG5lc3RlZF9lcHRfaW5qZWN0X3BhZ2VfZmF1bHQoKQogCQkgKi8KLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAljYXNlIEVYSVRfUkVBU09OX0VQVF9NSVNDT05GSUc6CiAJCS8qCiAJCSAqIEwyIG5ldmVyIHVzZXMgZGlyZWN0bHkgTDEncyBFUFQsIGJ1dCByYXRoZXIgTDAncyBvd24gRVBUCkBAIC03NTY3LDExICs3NTc2LDExIEBACiAJCSAqIChFUFQgb24gRVBUKS4gU28gYW55IHByb2JsZW1zIHdpdGggdGhlIHN0cnVjdHVyZSBvZiB0aGUKIAkJICogdGFibGUgaXMgTDAncyBmYXVsdC4KIAkJICovCi0JCXJldHVybiAwOworCQlyZXR1cm4gZmFsc2U7CiAJY2FzZSBFWElUX1JFQVNPTl9XQklOVkQ6CiAJCXJldHVybiBuZXN0ZWRfY3B1X2hhczIodm1jczEyLCBTRUNPTkRBUllfRVhFQ19XQklOVkRfRVhJVElORyk7CiAJY2FzZSBFWElUX1JFQVNPTl9YU0VUQlY6Ci0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAljYXNlIEVYSVRfUkVBU09OX1hTQVZFUzogY2FzZSBFWElUX1JFQVNPTl9YUlNUT1JTOgogCQkvKgogCQkgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIHNpbmNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0bwpAQCAtNzU4MSw3ICs3NTkwLDcgQEAKIAkJICovCiAJCXJldHVybiBuZXN0ZWRfY3B1X2hhczIodm1jczEyLCBTRUNPTkRBUllfRVhFQ19YU0FWRVMpOwogCWRlZmF1bHQ6Ci0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAl9CiB9CiAKQEAgLTg1MTYsNiArODUyNSw5IEBACiAJCQkJCQlleGVjX2NvbnRyb2wpOwogCQkJfQogCQl9CisJCWlmIChuZXN0ZWQgJiYgIXZteC0+cmR0c2NwX2VuYWJsZWQpCisJCQl2bXgtPm5lc3RlZC5uZXN0ZWRfdm14X3NlY29uZGFyeV9jdGxzX2hpZ2ggJj0KKwkJCQl+U0VDT05EQVJZX0VYRUNfUkRUU0NQOwogCX0KIAogCS8qIEV4cG9zaW5nIElOVlBDSUQgb25seSB3aGVuIFBDSUQgaXMgZXhwb3NlZCAqLwpAQCAtODYxNiwxMCArODYyOCwxMSBAQAogCQkJCQlzdHJ1Y3Qgdm1jczEyICp2bWNzMTIpCiB7CiAJc3RydWN0IHZjcHVfdm14ICp2bXggPSB0b192bXgodmNwdSk7CisJaW50IG1heHBoeWFkZHIgPSBjcHVpZF9tYXhwaHlhZGRyKHZjcHUpOwogCiAJaWYgKG5lc3RlZF9jcHVfaGFzMih2bWNzMTIsIFNFQ09OREFSWV9FWEVDX1ZJUlRVQUxJWkVfQVBJQ19BQ0NFU1NFUykpIHsKLQkJLyogVE9ETzogQWxzbyB2ZXJpZnkgYml0cyBiZXlvbmQgcGh5c2ljYWwgYWRkcmVzcyB3aWR0aCBhcmUgMCAqLwotCQlpZiAoIVBBR0VfQUxJR05FRCh2bWNzMTItPmFwaWNfYWNjZXNzX2FkZHIpKQorCQlpZiAoIVBBR0VfQUxJR05FRCh2bWNzMTItPmFwaWNfYWNjZXNzX2FkZHIpIHx8CisJCSAgICB2bWNzMTItPmFwaWNfYWNjZXNzX2FkZHIgPj4gbWF4cGh5YWRkcikKIAkJCXJldHVybiBmYWxzZTsKIAogCQkvKgpAQCAtODYzNSw4ICs4NjQ4LDggQEAKIAl9CiAKIAlpZiAobmVzdGVkX2NwdV9oYXModm1jczEyLCBDUFVfQkFTRURfVFBSX1NIQURPVykpIHsKLQkJLyogVE9ETzogQWxzbyB2ZXJpZnkgYml0cyBiZXlvbmQgcGh5c2ljYWwgYWRkcmVzcyB3aWR0aCBhcmUgMCAqLwotCQlpZiAoIVBBR0VfQUxJR05FRCh2bWNzMTItPnZpcnR1YWxfYXBpY19wYWdlX2FkZHIpKQorCQlpZiAoIVBBR0VfQUxJR05FRCh2bWNzMTItPnZpcnR1YWxfYXBpY19wYWdlX2FkZHIpIHx8CisJCSAgICB2bWNzMTItPnZpcnR1YWxfYXBpY19wYWdlX2FkZHIgPj4gbWF4cGh5YWRkcikKIAkJCXJldHVybiBmYWxzZTsKIAogCQlpZiAodm14LT5uZXN0ZWQudmlydHVhbF9hcGljX3BhZ2UpIC8qIHNob3VsZG4ndCBoYXBwZW4gKi8KQEAgLTg2NTksNyArODY3Miw4IEBACiAJfQogCiAJaWYgKG5lc3RlZF9jcHVfaGFzX3Bvc3RlZF9pbnRyKHZtY3MxMikpIHsKLQkJaWYgKCFJU19BTElHTkVEKHZtY3MxMi0+cG9zdGVkX2ludHJfZGVzY19hZGRyLCA2NCkpCisJCWlmICghSVNfQUxJR05FRCh2bWNzMTItPnBvc3RlZF9pbnRyX2Rlc2NfYWRkciwgNjQpIHx8CisJCSAgICB2bWNzMTItPnBvc3RlZF9pbnRyX2Rlc2NfYWRkciA+PiBtYXhwaHlhZGRyKQogCQkJcmV0dXJuIGZhbHNlOwogCiAJCWlmICh2bXgtPm5lc3RlZC5waV9kZXNjX3BhZ2UpIHsgLyogc2hvdWxkbid0IGhhcHBlbiAqLwpAQCAtODg1OCw5ICs4ODcyLDkgQEAKIAogc3RhdGljIGludCBuZXN0ZWRfdm14X2NoZWNrX21zcl9zd2l0Y2goc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50X2ZpZWxkLAotCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJfZmllbGQsCi0JCQkJICAgICAgIGludCBtYXhwaHlhZGRyKQorCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGFkZHJfZmllbGQpCiB7CisJaW50IG1heHBoeWFkZHI7CiAJdTY0IGNvdW50LCBhZGRyOwogCiAJaWYgKHZtY3MxMl9yZWFkX2FueSh2Y3B1LCBjb3VudF9maWVsZCwgJmNvdW50KSB8fApAQCAtODg3MCw2ICs4ODg0LDcgQEAKIAl9CiAJaWYgKGNvdW50ID09IDApCiAJCXJldHVybiAwOworCW1heHBoeWFkZHIgPSBjcHVpZF9tYXhwaHlhZGRyKHZjcHUpOwogCWlmICghSVNfQUxJR05FRChhZGRyLCAxNikgfHwgYWRkciA+PiBtYXhwaHlhZGRyIHx8CiAJICAgIChhZGRyICsgY291bnQgKiBzaXplb2Yoc3RydWN0IHZteF9tc3JfZW50cnkpIC0gMSkgPj4gbWF4cGh5YWRkcikgewogCQlwcl93YXJuX3JhdGVsaW1pdGVkKApAQCAtODg4MywxOSArODg5OCwxNiBAQAogc3RhdGljIGludCBuZXN0ZWRfdm14X2NoZWNrX21zcl9zd2l0Y2hfY29udHJvbHMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJCQkJc3RydWN0IHZtY3MxMiAqdm1jczEyKQogewotCWludCBtYXhwaHlhZGRyOwotCiAJaWYgKHZtY3MxMi0+dm1fZXhpdF9tc3JfbG9hZF9jb3VudCA9PSAwICYmCiAJICAgIHZtY3MxMi0+dm1fZXhpdF9tc3Jfc3RvcmVfY291bnQgPT0gMCAmJgogCSAgICB2bWNzMTItPnZtX2VudHJ5X21zcl9sb2FkX2NvdW50ID09IDApCiAJCXJldHVybiAwOyAvKiBGYXN0IHBhdGggKi8KLQltYXhwaHlhZGRyID0gY3B1aWRfbWF4cGh5YWRkcih2Y3B1KTsKIAlpZiAobmVzdGVkX3ZteF9jaGVja19tc3Jfc3dpdGNoKHZjcHUsIFZNX0VYSVRfTVNSX0xPQURfQ09VTlQsCi0JCQkJCVZNX0VYSVRfTVNSX0xPQURfQUREUiwgbWF4cGh5YWRkcikgfHwKKwkJCQkJVk1fRVhJVF9NU1JfTE9BRF9BRERSKSB8fAogCSAgICBuZXN0ZWRfdm14X2NoZWNrX21zcl9zd2l0Y2godmNwdSwgVk1fRVhJVF9NU1JfU1RPUkVfQ09VTlQsCi0JCQkJCVZNX0VYSVRfTVNSX1NUT1JFX0FERFIsIG1heHBoeWFkZHIpIHx8CisJCQkJCVZNX0VYSVRfTVNSX1NUT1JFX0FERFIpIHx8CiAJICAgIG5lc3RlZF92bXhfY2hlY2tfbXNyX3N3aXRjaCh2Y3B1LCBWTV9FTlRSWV9NU1JfTE9BRF9DT1VOVCwKLQkJCQkJVk1fRU5UUllfTVNSX0xPQURfQUREUiwgbWF4cGh5YWRkcikpCisJCQkJCVZNX0VOVFJZX01TUl9MT0FEX0FERFIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlyZXR1cm4gMDsKIH0KQEAgLTkxNDUsOCArOTE1Nyw5IEBACiAJCQlleGVjX2NvbnRyb2wgJj0gflNFQ09OREFSWV9FWEVDX1JEVFNDUDsKIAkJLyogVGFrZSB0aGUgZm9sbG93aW5nIGZpZWxkcyBvbmx5IGZyb20gdm1jczEyICovCiAJCWV4ZWNfY29udHJvbCAmPSB+KFNFQ09OREFSWV9FWEVDX1ZJUlRVQUxJWkVfQVBJQ19BQ0NFU1NFUyB8CisJCQkJICBTRUNPTkRBUllfRVhFQ19SRFRTQ1AgfAogCQkJCSAgU0VDT05EQVJZX0VYRUNfVklSVFVBTF9JTlRSX0RFTElWRVJZIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNPTkRBUllfRVhFQ19BUElDX1JFR0lTVEVSX1ZJUlQpOworCQkJCSAgU0VDT05EQVJZX0VYRUNfQVBJQ19SRUdJU1RFUl9WSVJUKTsKIAkJaWYgKG5lc3RlZF9jcHVfaGFzKHZtY3MxMiwKIAkJCQlDUFVfQkFTRURfQUNUSVZBVEVfU0VDT05EQVJZX0NPTlRST0xTKSkKIAkJCWV4ZWNfY29udHJvbCB8PSB2bWNzMTItPnNlY29uZGFyeV92bV9leGVjX2NvbnRyb2w7CkBAIC05MjE4LDkgKzkyMzEsOSBAQAogCX0KIAogCWlmIChjcHVfaGFzX3ZteF9tc3JfYml0bWFwKCkgJiYKLQkgICAgZXhlY19jb250cm9sICYgQ1BVX0JBU0VEX1VTRV9NU1JfQklUTUFQUyAmJgotCSAgICBuZXN0ZWRfdm14X21lcmdlX21zcl9iaXRtYXAodmNwdSwgdm1jczEyKSkgewotCQl2bWNzX3dyaXRlNjQoTVNSX0JJVE1BUCwgX19wYSh2bXhfbXNyX2JpdG1hcF9uZXN0ZWQpKTsKKwkgICAgZXhlY19jb250cm9sICYgQ1BVX0JBU0VEX1VTRV9NU1JfQklUTUFQUykgeworCQluZXN0ZWRfdm14X21lcmdlX21zcl9iaXRtYXAodmNwdSwgdm1jczEyKTsKKwkJLyogTVNSX0JJVE1BUCB3aWxsIGJlIHNldCBieSBmb2xsb3dpbmcgdm14X3NldF9lZmVyLiAqLwogCX0gZWxzZQogCQlleGVjX2NvbnRyb2wgJj0gfkNQVV9CQVNFRF9VU0VfTVNSX0JJVE1BUFM7CiAKQEAgLTkzNzksNyArOTM5Miw2IEBACiAJfQogCiAJaWYgKCFuZXN0ZWRfZ2V0X3ZtY3MxMl9wYWdlcyh2Y3B1LCB2bWNzMTIpKSB7Ci0JCS8qVE9ETzogQWxzbyB2ZXJpZnkgYml0cyBiZXlvbmQgcGh5c2ljYWwgYWRkcmVzcyB3aWR0aCBhcmUgMCovCiAJCW5lc3RlZF92bXhfZmFpbFZhbGlkKHZjcHUsIFZNWEVSUl9FTlRSWV9JTlZBTElEX0NPTlRST0xfRklFTEQpOwogCQlyZXR1cm4gMTsKIAl9CkBAIC05NTE4LDcgKzk1MzAsNyBAQAogCXZtY3MxMi0+bGF1bmNoX3N0YXRlID0gMTsKIAogCWlmICh2bWNzMTItPmd1ZXN0X2FjdGl2aXR5X3N0YXRlID09IEdVRVNUX0FDVElWSVRZX0hMVCkKLQkJcmV0dXJuIGt2bV9lbXVsYXRlX2hhbHQodmNwdSk7CisJCXJldHVybiBrdm1fdmNwdV9oYWx0KHZjcHUpOwogCiAJdm14LT5uZXN0ZWQubmVzdGVkX3J1bl9wZW5kaW5nID0gMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3g4Ni5jIGIvYXJjaC94ODYva3ZtL3g4Ni5jCmluZGV4IGJkN2E3MGIuLmUxYTgxMjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS94ODYuYworKysgYi9hcmNoL3g4Ni9rdm0veDg2LmMKQEAgLTgwMSw2ICs4MDEsMTcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9nZXRfY3I4KTsKIAorc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9kcjAxMjMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWludCBpOworCisJaWYgKCEodmNwdS0+Z3Vlc3RfZGVidWcgJiBLVk1fR1VFU1REQkdfVVNFX0hXX0JQKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgS1ZNX05SX0RCX1JFR1M7IGkrKykKKwkJCXZjcHUtPmFyY2guZWZmX2RiW2ldID0gdmNwdS0+YXJjaC5kYltpXTsKKwkJdmNwdS0+YXJjaC5zd2l0Y2hfZGJfcmVncyB8PSBLVk1fREVCVUdSRUdfUkVMT0FEOworCX0KK30KKwogc3RhdGljIHZvaWQga3ZtX3VwZGF0ZV9kcjYoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewogCWlmICghKHZjcHUtPmd1ZXN0X2RlYnVnICYgS1ZNX0dVRVNUREJHX1VTRV9IV19CUCkpCkBAIC0xMDcwLDE5ICsxMDgxLDE5IEBACiAJc3RydWN0IHB2Y2xvY2tfZ3RvZF9kYXRhICp2ZGF0YSA9ICZwdmNsb2NrX2d0b2RfZGF0YTsKIAl1NjQgYm9vdF9uczsKIAotCWJvb3RfbnMgPSBrdGltZV90b19ucyhrdGltZV9hZGQodGstPnRrci5iYXNlX21vbm8sIHRrLT5vZmZzX2Jvb3QpKTsKKwlib290X25zID0ga3RpbWVfdG9fbnMoa3RpbWVfYWRkKHRrLT50a3JfbW9uby5iYXNlLCB0ay0+b2Zmc19ib290KSk7CiAKIAl3cml0ZV9zZXFjb3VudF9iZWdpbigmdmRhdGEtPnNlcSk7CiAKIAkvKiBjb3B5IHB2Y2xvY2sgZ3RvZCBkYXRhICovCi0JdmRhdGEtPmNsb2NrLnZjbG9ja19tb2RlCT0gdGstPnRrci5jbG9jay0+YXJjaGRhdGEudmNsb2NrX21vZGU7Ci0JdmRhdGEtPmNsb2NrLmN5Y2xlX2xhc3QJCT0gdGstPnRrci5jeWNsZV9sYXN0OwotCXZkYXRhLT5jbG9jay5tYXNrCQk9IHRrLT50a3IubWFzazsKLQl2ZGF0YS0+Y2xvY2subXVsdAkJPSB0ay0+dGtyLm11bHQ7Ci0JdmRhdGEtPmNsb2NrLnNoaWZ0CQk9IHRrLT50a3Iuc2hpZnQ7CisJdmRhdGEtPmNsb2NrLnZjbG9ja19tb2RlCT0gdGstPnRrcl9tb25vLmNsb2NrLT5hcmNoZGF0YS52Y2xvY2tfbW9kZTsKKwl2ZGF0YS0+Y2xvY2suY3ljbGVfbGFzdAkJPSB0ay0+dGtyX21vbm8uY3ljbGVfbGFzdDsKKwl2ZGF0YS0+Y2xvY2subWFzawkJPSB0ay0+dGtyX21vbm8ubWFzazsKKwl2ZGF0YS0+Y2xvY2subXVsdAkJPSB0ay0+dGtyX21vbm8ubXVsdDsKKwl2ZGF0YS0+Y2xvY2suc2hpZnQJCT0gdGstPnRrcl9tb25vLnNoaWZ0OwogCiAJdmRhdGEtPmJvb3RfbnMJCQk9IGJvb3RfbnM7Ci0JdmRhdGEtPm5zZWNfYmFzZQkJPSB0ay0+dGtyLnh0aW1lX25zZWM7CisJdmRhdGEtPm5zZWNfYmFzZQkJPSB0ay0+dGtyX21vbm8ueHRpbWVfbnNlYzsKIAogCXdyaXRlX3NlcWNvdW50X2VuZCgmdmRhdGEtPnNlcSk7CiB9CkBAIC0yNzQ0LDcgKzI3NTUsNiBAQAogCWNhc2UgS1ZNX0NBUF9VU0VSX05NSToKIAljYXNlIEtWTV9DQVBfUkVJTkpFQ1RfQ09OVFJPTDoKIAljYXNlIEtWTV9DQVBfSVJRX0lOSkVDVF9TVEFUVVM6Ci0JY2FzZSBLVk1fQ0FQX0lSUUZEOgogCWNhc2UgS1ZNX0NBUF9JT0VWRU5URkQ6CiAJY2FzZSBLVk1fQ0FQX0lPRVZFTlRGRF9OT19MRU5HVEg6CiAJY2FzZSBLVk1fQ0FQX1BJVDI6CkBAIC0zMTUwLDYgKzMxNjAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW1lbWNweSh2Y3B1LT5hcmNoLmRiLCBkYmdyZWdzLT5kYiwgc2l6ZW9mKHZjcHUtPmFyY2guZGIpKTsKKwlrdm1fdXBkYXRlX2RyMDEyMyh2Y3B1KTsKIAl2Y3B1LT5hcmNoLmRyNiA9IGRiZ3JlZ3MtPmRyNjsKIAlrdm1fdXBkYXRlX2RyNih2Y3B1KTsKIAl2Y3B1LT5hcmNoLmRyNyA9IGRiZ3JlZ3MtPmRyNzsKQEAgLTQxMTUsOCArNDEyNiw4IEBACiAJZG8gewogCQluID0gbWluKGxlbiwgOCk7CiAJCWlmICghKHZjcHUtPmFyY2guYXBpYyAmJgotCQkgICAgICAha3ZtX2lvZGV2aWNlX3dyaXRlKCZ2Y3B1LT5hcmNoLmFwaWMtPmRldiwgYWRkciwgbiwgdikpCi0JCSAgICAmJiBrdm1faW9fYnVzX3dyaXRlKHZjcHUtPmt2bSwgS1ZNX01NSU9fQlVTLCBhZGRyLCBuLCB2KSkKKwkJICAgICAgIWt2bV9pb2RldmljZV93cml0ZSh2Y3B1LCAmdmNwdS0+YXJjaC5hcGljLT5kZXYsIGFkZHIsIG4sIHYpKQorCQkgICAgJiYga3ZtX2lvX2J1c193cml0ZSh2Y3B1LCBLVk1fTU1JT19CVVMsIGFkZHIsIG4sIHYpKQogCQkJYnJlYWs7CiAJCWhhbmRsZWQgKz0gbjsKIAkJYWRkciArPSBuOwpAQCAtNDEzNSw4ICs0MTQ2LDkgQEAKIAlkbyB7CiAJCW4gPSBtaW4obGVuLCA4KTsKIAkJaWYgKCEodmNwdS0+YXJjaC5hcGljICYmCi0JCSAgICAgICFrdm1faW9kZXZpY2VfcmVhZCgmdmNwdS0+YXJjaC5hcGljLT5kZXYsIGFkZHIsIG4sIHYpKQotCQkgICAgJiYga3ZtX2lvX2J1c19yZWFkKHZjcHUtPmt2bSwgS1ZNX01NSU9fQlVTLCBhZGRyLCBuLCB2KSkKKwkJICAgICAgIWt2bV9pb2RldmljZV9yZWFkKHZjcHUsICZ2Y3B1LT5hcmNoLmFwaWMtPmRldiwKKwkJCQkJIGFkZHIsIG4sIHYpKQorCQkgICAgJiYga3ZtX2lvX2J1c19yZWFkKHZjcHUsIEtWTV9NTUlPX0JVUywgYWRkciwgbiwgdikpCiAJCQlicmVhazsKIAkJdHJhY2Vfa3ZtX21taW8oS1ZNX1RSQUNFX01NSU9fUkVBRCwgbiwgYWRkciwgKih1NjQgKil2KTsKIAkJaGFuZGxlZCArPSBuOwpAQCAtNDQ3Niw3ICs0NDg4LDggQEAKIAlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKIH0KIAotaW50IGVtdWxhdG9yX3JlYWRfd3JpdGUoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIHVuc2lnbmVkIGxvbmcgYWRkciwKK3N0YXRpYyBpbnQgZW11bGF0b3JfcmVhZF93cml0ZShzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwKKwkJCXVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCXZvaWQgKnZhbCwgdW5zaWduZWQgaW50IGJ5dGVzLAogCQkJc3RydWN0IHg4Nl9leGNlcHRpb24gKmV4Y2VwdGlvbiwKIAkJCWNvbnN0IHN0cnVjdCByZWFkX3dyaXRlX2VtdWxhdG9yX29wcyAqb3BzKQpAQCAtNDUzOSw3ICs0NTUyLDcgQEAKIAkJCQkgICBleGNlcHRpb24sICZyZWFkX2VtdWx0b3IpOwogfQogCi1pbnQgZW11bGF0b3Jfd3JpdGVfZW11bGF0ZWQoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsCitzdGF0aWMgaW50IGVtdWxhdG9yX3dyaXRlX2VtdWxhdGVkKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LAogCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJCSAgICBjb25zdCB2b2lkICp2YWwsCiAJCQkgICAgdW5zaWduZWQgaW50IGJ5dGVzLApAQCAtNDYzMCwxMCArNDY0MywxMCBAQAogCWludCByOwogCiAJaWYgKHZjcHUtPmFyY2gucGlvLmluKQotCQlyID0ga3ZtX2lvX2J1c19yZWFkKHZjcHUtPmt2bSwgS1ZNX1BJT19CVVMsIHZjcHUtPmFyY2gucGlvLnBvcnQsCisJCXIgPSBrdm1faW9fYnVzX3JlYWQodmNwdSwgS1ZNX1BJT19CVVMsIHZjcHUtPmFyY2gucGlvLnBvcnQsCiAJCQkJICAgIHZjcHUtPmFyY2gucGlvLnNpemUsIHBkKTsKIAllbHNlCi0JCXIgPSBrdm1faW9fYnVzX3dyaXRlKHZjcHUtPmt2bSwgS1ZNX1BJT19CVVMsCisJCXIgPSBrdm1faW9fYnVzX3dyaXRlKHZjcHUsIEtWTV9QSU9fQlVTLAogCQkJCSAgICAgdmNwdS0+YXJjaC5waW8ucG9ydCwgdmNwdS0+YXJjaC5waW8uc2l6ZSwKIAkJCQkgICAgIHBkKTsKIAlyZXR1cm4gcjsKQEAgLTQ3MDYsNyArNDcxOSw3IEBACiAJa3ZtX21tdV9pbnZscGcoZW11bF90b192Y3B1KGN0eHQpLCBhZGRyZXNzKTsKIH0KIAotaW50IGt2bV9lbXVsYXRlX3diaW52ZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCitpbnQga3ZtX2VtdWxhdGVfd2JpbnZkX25vc2tpcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJaWYgKCFuZWVkX2VtdWxhdGVfd2JpbnZkKHZjcHUpKQogCQlyZXR1cm4gWDg2RU1VTF9DT05USU5VRTsKQEAgLTQ3MjMsMTkgKzQ3MzYsMjkgQEAKIAkJd2JpbnZkKCk7CiAJcmV0dXJuIFg4NkVNVUxfQ09OVElOVUU7CiB9CisKK2ludCBrdm1fZW11bGF0ZV93YmludmQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCWt2bV94ODZfb3BzLT5za2lwX2VtdWxhdGVkX2luc3RydWN0aW9uKHZjcHUpOworCXJldHVybiBrdm1fZW11bGF0ZV93YmludmRfbm9za2lwKHZjcHUpOworfQogRVhQT1JUX1NZTUJPTF9HUEwoa3ZtX2VtdWxhdGVfd2JpbnZkKTsKIAorCisKIHN0YXRpYyB2b2lkIGVtdWxhdG9yX3diaW52ZChzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCkKIHsKLQlrdm1fZW11bGF0ZV93YmludmQoZW11bF90b192Y3B1KGN0eHQpKTsKKwlrdm1fZW11bGF0ZV93YmludmRfbm9za2lwKGVtdWxfdG9fdmNwdShjdHh0KSk7CiB9CiAKLWludCBlbXVsYXRvcl9nZXRfZHIoc3RydWN0IHg4Nl9lbXVsYXRlX2N0eHQgKmN0eHQsIGludCBkciwgdW5zaWduZWQgbG9uZyAqZGVzdCkKK3N0YXRpYyBpbnQgZW11bGF0b3JfZ2V0X2RyKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgZHIsCisJCQkgICB1bnNpZ25lZCBsb25nICpkZXN0KQogewogCXJldHVybiBrdm1fZ2V0X2RyKGVtdWxfdG9fdmNwdShjdHh0KSwgZHIsIGRlc3QpOwogfQogCi1pbnQgZW11bGF0b3Jfc2V0X2RyKHN0cnVjdCB4ODZfZW11bGF0ZV9jdHh0ICpjdHh0LCBpbnQgZHIsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCitzdGF0aWMgaW50IGVtdWxhdG9yX3NldF9kcihzdHJ1Y3QgeDg2X2VtdWxhdGVfY3R4dCAqY3R4dCwgaW50IGRyLAorCQkJICAgdW5zaWduZWQgbG9uZyB2YWx1ZSkKIHsKIAogCXJldHVybiBfX2t2bV9zZXRfZHIoZW11bF90b192Y3B1KGN0eHQpLCBkciwgdmFsdWUpOwpAQCAtNTgxNyw3ICs1ODQwLDcgQEAKIAlmcmVlX3BlcmNwdShzaGFyZWRfbXNycyk7CiB9CiAKLWludCBrdm1fZW11bGF0ZV9oYWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK2ludCBrdm1fdmNwdV9oYWx0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAkrK3ZjcHUtPnN0YXQuaGFsdF9leGl0czsKIAlpZiAoaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSkgewpAQCAtNTgyOCw2ICs1ODUxLDEzIEBACiAJCXJldHVybiAwOwogCX0KIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGt2bV92Y3B1X2hhbHQpOworCitpbnQga3ZtX2VtdWxhdGVfaGFsdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJa3ZtX3g4Nl9vcHMtPnNraXBfZW11bGF0ZWRfaW5zdHJ1Y3Rpb24odmNwdSk7CisJcmV0dXJuIGt2bV92Y3B1X2hhbHQodmNwdSk7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChrdm1fZW11bGF0ZV9oYWx0KTsKIAogaW50IGt2bV9odl9oeXBlcmNhbGwoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQpAQCAtNTkwNCw3ICs1OTM0LDcgQEAKIAlsYXBpY19pcnEuZGVzdF9pZCA9IGFwaWNpZDsKIAogCWxhcGljX2lycS5kZWxpdmVyeV9tb2RlID0gQVBJQ19ETV9SRU1SRDsKLQlrdm1faXJxX2RlbGl2ZXJ5X3RvX2FwaWMoa3ZtLCAwLCAmbGFwaWNfaXJxLCBOVUxMKTsKKwlrdm1faXJxX2RlbGl2ZXJ5X3RvX2FwaWMoa3ZtLCBOVUxMLCAmbGFwaWNfaXJxLCBOVUxMKTsKIH0KIAogaW50IGt2bV9lbXVsYXRlX2h5cGVyY2FsbChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCkBAIC01OTEyLDYgKzU5NDIsOCBAQAogCXVuc2lnbmVkIGxvbmcgbnIsIGEwLCBhMSwgYTIsIGEzLCByZXQ7CiAJaW50IG9wXzY0X2JpdCwgciA9IDE7CiAKKwlrdm1feDg2X29wcy0+c2tpcF9lbXVsYXRlZF9pbnN0cnVjdGlvbih2Y3B1KTsKKwogCWlmIChrdm1faHZfaHlwZXJjYWxsX2VuYWJsZWQodmNwdS0+a3ZtKSkKIAkJcmV0dXJuIGt2bV9odl9oeXBlcmNhbGwodmNwdSk7CiAKQEAgLTYxNjUsNyArNjE5Nyw3IEBACiB9CiAKIC8qCi0gKiBSZXR1cm5zIDEgdG8gbGV0IF9fdmNwdV9ydW4oKSBjb250aW51ZSB0aGUgZ3Vlc3QgZXhlY3V0aW9uIGxvb3Agd2l0aG91dAorICogUmV0dXJucyAxIHRvIGxldCB2Y3B1X3J1bigpIGNvbnRpbnVlIHRoZSBndWVzdCBleGVjdXRpb24gbG9vcCB3aXRob3V0CiAgKiBleGl0aW5nIHRvIHRoZSB1c2Vyc3BhY2UuICBPdGhlcndpc2UsIHRoZSB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIHRvIHRoZQogICogdXNlcnNwYWNlLgogICovCkBAIC02MzAyLDYgKzYzMzQsNyBAQAogCQlzZXRfZGVidWdyZWcodmNwdS0+YXJjaC5lZmZfZGJbMl0sIDIpOwogCQlzZXRfZGVidWdyZWcodmNwdS0+YXJjaC5lZmZfZGJbM10sIDMpOwogCQlzZXRfZGVidWdyZWcodmNwdS0+YXJjaC5kcjYsIDYpOworCQl2Y3B1LT5hcmNoLnN3aXRjaF9kYl9yZWdzICY9IH5LVk1fREVCVUdSRUdfUkVMT0FEOwogCX0KIAogCXRyYWNlX2t2bV9lbnRyeSh2Y3B1LT52Y3B1X2lkKTsKQEAgLTYzODMsNDIgKzY0MTYsNDcgQEAKIAlyZXR1cm4gcjsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgdmNwdV9ibG9jayhzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlpZiAoIWt2bV9hcmNoX3ZjcHVfcnVubmFibGUodmNwdSkpIHsKKwkJc3JjdV9yZWFkX3VubG9jaygma3ZtLT5zcmN1LCB2Y3B1LT5zcmN1X2lkeCk7CisJCWt2bV92Y3B1X2Jsb2NrKHZjcHUpOworCQl2Y3B1LT5zcmN1X2lkeCA9IHNyY3VfcmVhZF9sb2NrKCZrdm0tPnNyY3UpOworCQlpZiAoIWt2bV9jaGVja19yZXF1ZXN0KEtWTV9SRVFfVU5IQUxULCB2Y3B1KSkKKwkJCXJldHVybiAxOworCX0KIAotc3RhdGljIGludCBfX3ZjcHVfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKKwlrdm1fYXBpY19hY2NlcHRfZXZlbnRzKHZjcHUpOworCXN3aXRjaCh2Y3B1LT5hcmNoLm1wX3N0YXRlKSB7CisJY2FzZSBLVk1fTVBfU1RBVEVfSEFMVEVEOgorCQl2Y3B1LT5hcmNoLnB2LnB2X3VuaGFsdGVkID0gZmFsc2U7CisJCXZjcHUtPmFyY2gubXBfc3RhdGUgPQorCQkJS1ZNX01QX1NUQVRFX1JVTk5BQkxFOworCWNhc2UgS1ZNX01QX1NUQVRFX1JVTk5BQkxFOgorCQl2Y3B1LT5hcmNoLmFwZi5oYWx0ZWQgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSBLVk1fTVBfU1RBVEVfSU5JVF9SRUNFSVZFRDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5UUjsKKwkJYnJlYWs7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHZjcHVfcnVuKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlpbnQgcjsKIAlzdHJ1Y3Qga3ZtICprdm0gPSB2Y3B1LT5rdm07CiAKIAl2Y3B1LT5zcmN1X2lkeCA9IHNyY3VfcmVhZF9sb2NrKCZrdm0tPnNyY3UpOwogCi0JciA9IDE7Ci0Jd2hpbGUgKHIgPiAwKSB7CisJZm9yICg7OykgewogCQlpZiAodmNwdS0+YXJjaC5tcF9zdGF0ZSA9PSBLVk1fTVBfU1RBVEVfUlVOTkFCTEUgJiYKIAkJICAgICF2Y3B1LT5hcmNoLmFwZi5oYWx0ZWQpCiAJCQlyID0gdmNwdV9lbnRlcl9ndWVzdCh2Y3B1KTsKLQkJZWxzZSB7Ci0JCQlzcmN1X3JlYWRfdW5sb2NrKCZrdm0tPnNyY3UsIHZjcHUtPnNyY3VfaWR4KTsKLQkJCWt2bV92Y3B1X2Jsb2NrKHZjcHUpOwotCQkJdmNwdS0+c3JjdV9pZHggPSBzcmN1X3JlYWRfbG9jaygma3ZtLT5zcmN1KTsKLQkJCWlmIChrdm1fY2hlY2tfcmVxdWVzdChLVk1fUkVRX1VOSEFMVCwgdmNwdSkpIHsKLQkJCQlrdm1fYXBpY19hY2NlcHRfZXZlbnRzKHZjcHUpOwotCQkJCXN3aXRjaCh2Y3B1LT5hcmNoLm1wX3N0YXRlKSB7Ci0JCQkJY2FzZSBLVk1fTVBfU1RBVEVfSEFMVEVEOgotCQkJCQl2Y3B1LT5hcmNoLnB2LnB2X3VuaGFsdGVkID0gZmFsc2U7Ci0JCQkJCXZjcHUtPmFyY2gubXBfc3RhdGUgPQotCQkJCQkJS1ZNX01QX1NUQVRFX1JVTk5BQkxFOwotCQkJCWNhc2UgS1ZNX01QX1NUQVRFX1JVTk5BQkxFOgotCQkJCQl2Y3B1LT5hcmNoLmFwZi5oYWx0ZWQgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBLVk1fTVBfU1RBVEVfSU5JVF9SRUNFSVZFRDoKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJciA9IC1FSU5UUjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KKwkJZWxzZQorCQkJciA9IHZjcHVfYmxvY2soa3ZtLCB2Y3B1KTsKIAkJaWYgKHIgPD0gMCkKIAkJCWJyZWFrOwogCkBAIC02NDMwLDYgKzY0NjgsNyBAQAogCQkJciA9IC1FSU5UUjsKIAkJCXZjcHUtPnJ1bi0+ZXhpdF9yZWFzb24gPSBLVk1fRVhJVF9JTlRSOwogCQkJKyt2Y3B1LT5zdGF0LnJlcXVlc3RfaXJxX2V4aXRzOworCQkJYnJlYWs7CiAJCX0KIAogCQlrdm1fY2hlY2tfYXN5bmNfcGZfY29tcGxldGlvbih2Y3B1KTsKQEAgLTY0MzgsNiArNjQ3Nyw3IEBACiAJCQlyID0gLUVJTlRSOwogCQkJdmNwdS0+cnVuLT5leGl0X3JlYXNvbiA9IEtWTV9FWElUX0lOVFI7CiAJCQkrK3ZjcHUtPnN0YXQuc2lnbmFsX2V4aXRzOworCQkJYnJlYWs7CiAJCX0KIAkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CiAJCQlzcmN1X3JlYWRfdW5sb2NrKCZrdm0tPnNyY3UsIHZjcHUtPnNyY3VfaWR4KTsKQEAgLTY1NjksNyArNjYwOSw3IEBACiAJfSBlbHNlCiAJCVdBUk5fT04odmNwdS0+YXJjaC5waW8uY291bnQgfHwgdmNwdS0+bW1pb19uZWVkZWQpOwogCi0JciA9IF9fdmNwdV9ydW4odmNwdSk7CisJciA9IHZjcHVfcnVuKHZjcHUpOwogCiBvdXQ6CiAJcG9zdF9rdm1fcnVuX3NhdmUodmNwdSk7CkBAIC03MDc2LDExICs3MTE2LDE0IEBACiAJa3ZtX2NsZWFyX2V4Y2VwdGlvbl9xdWV1ZSh2Y3B1KTsKIAogCW1lbXNldCh2Y3B1LT5hcmNoLmRiLCAwLCBzaXplb2YodmNwdS0+YXJjaC5kYikpOworCWt2bV91cGRhdGVfZHIwMTIzKHZjcHUpOwogCXZjcHUtPmFyY2guZHI2ID0gRFI2X0lOSVQ7CiAJa3ZtX3VwZGF0ZV9kcjYodmNwdSk7CiAJdmNwdS0+YXJjaC5kcjcgPSBEUjdfRklYRURfMTsKIAlrdm1fdXBkYXRlX2RyNyh2Y3B1KTsKIAorCXZjcHUtPmFyY2guY3IyID0gMDsKKwogCWt2bV9tYWtlX3JlcXVlc3QoS1ZNX1JFUV9FVkVOVCwgdmNwdSk7CiAJdmNwdS0+YXJjaC5hcGYubXNyX3ZhbCA9IDA7CiAJdmNwdS0+YXJjaC5zdC5tc3JfdmFsID0gMDsKQEAgLTcyNDEsNyArNzI4NCw3IEBACiAKIAl2Y3B1LT5hcmNoLnB2LnB2X3VuaGFsdGVkID0gZmFsc2U7CiAJdmNwdS0+YXJjaC5lbXVsYXRlX2N0eHQub3BzID0gJmVtdWxhdGVfb3BzOwotCWlmICghaXJxY2hpcF9pbl9rZXJuZWwoa3ZtKSB8fCBrdm1fdmNwdV9pc19ic3AodmNwdSkpCisJaWYgKCFpcnFjaGlwX2luX2tlcm5lbChrdm0pIHx8IGt2bV92Y3B1X2lzX3Jlc2V0X2JzcCh2Y3B1KSkKIAkJdmNwdS0+YXJjaC5tcF9zdGF0ZSA9IEtWTV9NUF9TVEFURV9SVU5OQUJMRTsKIAllbHNlCiAJCXZjcHUtPmFyY2gubXBfc3RhdGUgPSBLVk1fTVBfU1RBVEVfVU5JTklUSUFMSVpFRDsKQEAgLTcyODksNiArNzMzMiw4IEBACiAJdmNwdS0+YXJjaC5ndWVzdF9zdXBwb3J0ZWRfeGNyMCA9IDA7CiAJdmNwdS0+YXJjaC5ndWVzdF94c3RhdGVfc2l6ZSA9IFhTQVZFX0hEUl9TSVpFICsgWFNBVkVfSERSX09GRlNFVDsKIAorCXZjcHUtPmFyY2gubWF4cGh5YWRkciA9IGNwdWlkX3F1ZXJ5X21heHBoeWFkZHIodmNwdSk7CisKIAlrdm1fYXN5bmNfcGZfaGFzaF9yZXNldCh2Y3B1KTsKIAlrdm1fcG11X2luaXQodmNwdSk7CiAKQEAgLTc0MjksNyArNzQ3NCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgS1ZNX05SX1BBR0VfU0laRVM7ICsraSkgewogCQlpZiAoIWRvbnQgfHwgZnJlZS0+YXJjaC5ybWFwW2ldICE9IGRvbnQtPmFyY2gucm1hcFtpXSkgewotCQkJa3ZtX2t2ZnJlZShmcmVlLT5hcmNoLnJtYXBbaV0pOworCQkJa3ZmcmVlKGZyZWUtPmFyY2gucm1hcFtpXSk7CiAJCQlmcmVlLT5hcmNoLnJtYXBbaV0gPSBOVUxMOwogCQl9CiAJCWlmIChpID09IDApCkBAIC03NDM3LDcgKzc0ODIsNyBAQAogCiAJCWlmICghZG9udCB8fCBmcmVlLT5hcmNoLmxwYWdlX2luZm9baSAtIDFdICE9CiAJCQkgICAgIGRvbnQtPmFyY2gubHBhZ2VfaW5mb1tpIC0gMV0pIHsKLQkJCWt2bV9rdmZyZWUoZnJlZS0+YXJjaC5scGFnZV9pbmZvW2kgLSAxXSk7CisJCQlrdmZyZWUoZnJlZS0+YXJjaC5scGFnZV9pbmZvW2kgLSAxXSk7CiAJCQlmcmVlLT5hcmNoLmxwYWdlX2luZm9baSAtIDFdID0gTlVMTDsKIAkJfQogCX0KQEAgLTc0OTEsMTIgKzc1MzYsMTIgQEAKIAogb3V0X2ZyZWU6CiAJZm9yIChpID0gMDsgaSA8IEtWTV9OUl9QQUdFX1NJWkVTOyArK2kpIHsKLQkJa3ZtX2t2ZnJlZShzbG90LT5hcmNoLnJtYXBbaV0pOworCQlrdmZyZWUoc2xvdC0+YXJjaC5ybWFwW2ldKTsKIAkJc2xvdC0+YXJjaC5ybWFwW2ldID0gTlVMTDsKIAkJaWYgKGkgPT0gMCkKIAkJCWNvbnRpbnVlOwogCi0JCWt2bV9rdmZyZWUoc2xvdC0+YXJjaC5scGFnZV9pbmZvW2kgLSAxXSk7CisJCWt2ZnJlZShzbG90LT5hcmNoLmxwYWdlX2luZm9baSAtIDFdKTsKIAkJc2xvdC0+YXJjaC5scGFnZV9pbmZvW2kgLSAxXSA9IE5VTEw7CiAJfQogCXJldHVybiAtRU5PTUVNOwpAQCAtNzYxOSw2ICs3NjY0LDIzIEBACiAJbmV3ID0gaWRfdG9fbWVtc2xvdChrdm0tPm1lbXNsb3RzLCBtZW0tPnNsb3QpOwogCiAJLyoKKwkgKiBEaXJ0eSBsb2dnaW5nIHRyYWNrcyBzcHRlcyBpbiA0ayBncmFudWxhcml0eSwgbWVhbmluZyB0aGF0IGxhcmdlCisJICogc3B0ZXMgaGF2ZSB0byBiZSBzcGxpdC4gIElmIGxpdmUgbWlncmF0aW9uIGlzIHN1Y2Nlc3NmdWwsIHRoZSBndWVzdAorCSAqIGluIHRoZSBzb3VyY2UgbWFjaGluZSB3aWxsIGJlIGRlc3Ryb3llZCBhbmQgbGFyZ2Ugc3B0ZXMgd2lsbCBiZQorCSAqIGNyZWF0ZWQgaW4gdGhlIGRlc3RpbmF0aW9uLiBIb3dldmVyLCBpZiB0aGUgZ3Vlc3QgY29udGludWVzIHRvIHJ1bgorCSAqIGluIHRoZSBzb3VyY2UgbWFjaGluZSAoZm9yIGV4YW1wbGUgaWYgbGl2ZSBtaWdyYXRpb24gZmFpbHMpLCBzbWFsbAorCSAqIHNwdGVzIHdpbGwgcmVtYWluIGFyb3VuZCBhbmQgY2F1c2UgYmFkIHBlcmZvcm1hbmNlLgorCSAqCisJICogU2NhbiBzcHRlcyBpZiBkaXJ0eSBsb2dnaW5nIGhhcyBiZWVuIHN0b3BwZWQsIGRyb3BwaW5nIHRob3NlCisJICogd2hpY2ggY2FuIGJlIGNvbGxhcHNlZCBpbnRvIGEgc2luZ2xlIGxhcmdlLXBhZ2Ugc3B0ZS4gIExhdGVyCisJICogcGFnZSBmYXVsdHMgd2lsbCBjcmVhdGUgdGhlIGxhcmdlLXBhZ2Ugc3B0ZXMuCisJICovCisJaWYgKChjaGFuZ2UgIT0gS1ZNX01SX0RFTEVURSkgJiYKKwkJKG9sZC0+ZmxhZ3MgJiBLVk1fTUVNX0xPR19ESVJUWV9QQUdFUykgJiYKKwkJIShuZXctPmZsYWdzICYgS1ZNX01FTV9MT0dfRElSVFlfUEFHRVMpKQorCQlrdm1fbW11X3phcF9jb2xsYXBzaWJsZV9zcHRlcyhrdm0sIG5ldyk7CisKKwkvKgogCSAqIFNldCB1cCB3cml0ZSBwcm90ZWN0aW9uIGFuZC9vciBkaXJ0eSBsb2dnaW5nIGZvciB0aGUgbmV3IHNsb3QuCiAJICoKIAkgKiBGb3IgS1ZNX01SX0RFTEVURSBhbmQgS1ZNX01SX01PVkUsIHRoZSBzaGFkb3cgcGFnZXMgb2Ygb2xkIHNsb3QgaGF2ZQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYyBiL2FyY2gveDg2L2xndWVzdC9ib290LmMKaW5kZXggYWM0NDUzZC4uNzE3OTA4YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYworKysgYi9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCkBAIC04NjgsNyArODY4LDggQEAKIAkJLyogU29tZSBzeXN0ZW1zIG1hcCAidmVjdG9ycyIgdG8gaW50ZXJydXB0cyB3ZWlyZGx5LiAgTm90IHVzISAqLwogCQlfX3RoaXNfY3B1X3dyaXRlKHZlY3Rvcl9pcnFbaV0sIGkgLSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IpOwogCQlpZiAoaSAhPSBTWVNDQUxMX1ZFQ1RPUikKLQkJCXNldF9pbnRyX2dhdGUoaSwgaW50ZXJydXB0W2kgLSBGSVJTVF9FWFRFUk5BTF9WRUNUT1JdKTsKKwkJCXNldF9pbnRyX2dhdGUoaSwgaXJxX2VudHJpZXNfc3RhcnQgKworCQkJCQk4ICogKGkgLSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IpKTsKIAl9CiAKIAkvKgpAQCAtMTA3Niw2ICsxMDc3LDcgQEAKIHsKIAlsYXp5X2hjYWxsMyhMSENBTExfU0VUX1NUQUNLLCBfX0tFUk5FTF9EUyB8IDB4MSwgdGhyZWFkLT5zcDAsCiAJCSAgIFRIUkVBRF9TSVpFIC8gUEFHRV9TSVpFKTsKKwl0c3MtPng4Nl90c3Muc3AwID0gdGhyZWFkLT5zcDA7CiB9CiAKIC8qIExldCdzIGp1c3Qgc2F5LCBJIHdvdWxkbid0IGRvIGRlYnVnZ2luZyB1bmRlciBhIEd1ZXN0LiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL2F0b21pYzY0X2N4OF8zMi5TIGIvYXJjaC94ODYvbGliL2F0b21pYzY0X2N4OF8zMi5TCmluZGV4IGY1Y2M5ZWIuLjA4MmE4NTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9hdG9taWM2NF9jeDhfMzIuUworKysgYi9hcmNoL3g4Ni9saWIvYXRvbWljNjRfY3g4XzMyLlMKQEAgLTEzLDE2ICsxMyw2IEBACiAjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLWFzbS5oPgogI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KIAotLm1hY3JvIFNBVkUgcmVnCi0JcHVzaGxfY2ZpICVccmVnCi0JQ0ZJX1JFTF9PRkZTRVQgXHJlZywgMAotLmVuZG0KLQotLm1hY3JvIFJFU1RPUkUgcmVnCi0JcG9wbF9jZmkgJVxyZWcKLQlDRklfUkVTVE9SRSBccmVnCi0uZW5kbQotCiAubWFjcm8gcmVhZDY0IHJlZwogCW1vdmwgJWVieCwgJWVheAogCW1vdmwgJWVjeCwgJWVkeApAQCAtNjcsMTAgKzU3LDEwIEBACiAubWFjcm8gYWRkc3ViX3JldHVybiBmdW5jIGlucyBpbnNjCiBFTlRSWShhdG9taWM2NF9cZnVuY1woKV9yZXR1cm5fY3g4KQogCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVicAotCVNBVkUgZWJ4Ci0JU0FWRSBlc2kKLQlTQVZFIGVkaQorCXB1c2hsX2NmaV9yZWcgZWJwCisJcHVzaGxfY2ZpX3JlZyBlYngKKwlwdXNobF9jZmlfcmVnIGVzaQorCXB1c2hsX2NmaV9yZWcgZWRpCiAKIAltb3ZsICVlYXgsICVlc2kKIAltb3ZsICVlZHgsICVlZGkKQEAgLTg5LDEwICs3OSwxMCBAQAogMTA6CiAJbW92bCAlZWJ4LCAlZWF4CiAJbW92bCAlZWN4LCAlZWR4Ci0JUkVTVE9SRSBlZGkKLQlSRVNUT1JFIGVzaQotCVJFU1RPUkUgZWJ4Ci0JUkVTVE9SRSBlYnAKKwlwb3BsX2NmaV9yZWcgZWRpCisJcG9wbF9jZmlfcmVnIGVzaQorCXBvcGxfY2ZpX3JlZyBlYngKKwlwb3BsX2NmaV9yZWcgZWJwCiAJcmV0CiAJQ0ZJX0VORFBST0MKIEVORFBST0MoYXRvbWljNjRfXGZ1bmNcKClfcmV0dXJuX2N4OCkKQEAgLTEwNCw3ICs5NCw3IEBACiAubWFjcm8gaW5jZGVjX3JldHVybiBmdW5jIGlucyBpbnNjCiBFTlRSWShhdG9taWM2NF9cZnVuY1woKV9yZXR1cm5fY3g4KQogCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVieAorCXB1c2hsX2NmaV9yZWcgZWJ4CiAKIAlyZWFkNjQgJWVzaQogMToKQEAgLTExOSw3ICsxMDksNyBAQAogMTA6CiAJbW92bCAlZWJ4LCAlZWF4CiAJbW92bCAlZWN4LCAlZWR4Ci0JUkVTVE9SRSBlYngKKwlwb3BsX2NmaV9yZWcgZWJ4CiAJcmV0CiAJQ0ZJX0VORFBST0MKIEVORFBST0MoYXRvbWljNjRfXGZ1bmNcKClfcmV0dXJuX2N4OCkKQEAgLTEzMCw3ICsxMjAsNyBAQAogCiBFTlRSWShhdG9taWM2NF9kZWNfaWZfcG9zaXRpdmVfY3g4KQogCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVieAorCXB1c2hsX2NmaV9yZWcgZWJ4CiAKIAlyZWFkNjQgJWVzaQogMToKQEAgLTE0NiwxOCArMTM2LDE4IEBACiAyOgogCW1vdmwgJWVieCwgJWVheAogCW1vdmwgJWVjeCwgJWVkeAotCVJFU1RPUkUgZWJ4CisJcG9wbF9jZmlfcmVnIGVieAogCXJldAogCUNGSV9FTkRQUk9DCiBFTkRQUk9DKGF0b21pYzY0X2RlY19pZl9wb3NpdGl2ZV9jeDgpCiAKIEVOVFJZKGF0b21pYzY0X2FkZF91bmxlc3NfY3g4KQogCUNGSV9TVEFSVFBST0MKLQlTQVZFIGVicAotCVNBVkUgZWJ4CisJcHVzaGxfY2ZpX3JlZyBlYnAKKwlwdXNobF9jZmlfcmVnIGVieAogLyogdGhlc2UganVzdCBwdXNoIHRoZXNlIHR3byBwYXJhbWV0ZXJzIG9uIHRoZSBzdGFjayAqLwotCVNBVkUgZWRpCi0JU0FWRSBlY3gKKwlwdXNobF9jZmlfcmVnIGVkaQorCXB1c2hsX2NmaV9yZWcgZWN4CiAKIAltb3ZsICVlYXgsICVlYnAKIAltb3ZsICVlZHgsICVlZGkKQEAgLTE3OSw4ICsxNjksOCBAQAogMzoKIAlhZGRsICQ4LCAlZXNwCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC04Ci0JUkVTVE9SRSBlYngKLQlSRVNUT1JFIGVicAorCXBvcGxfY2ZpX3JlZyBlYngKKwlwb3BsX2NmaV9yZWcgZWJwCiAJcmV0CiA0OgogCWNtcGwgJWVkeCwgNCglZXNwKQpAQCAtMTkyLDcgKzE4Miw3IEBACiAKIEVOVFJZKGF0b21pYzY0X2luY19ub3RfemVyb19jeDgpCiAJQ0ZJX1NUQVJUUFJPQwotCVNBVkUgZWJ4CisJcHVzaGxfY2ZpX3JlZyBlYngKIAogCXJlYWQ2NCAlZXNpCiAxOgpAQCAtMjA5LDcgKzE5OSw3IEBACiAKIAltb3ZsICQxLCAlZWF4CiAzOgotCVJFU1RPUkUgZWJ4CisJcG9wbF9jZmlfcmVnIGVieAogCXJldAogCUNGSV9FTkRQUk9DCiBFTkRQUk9DKGF0b21pYzY0X2luY19ub3RfemVyb19jeDgpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvY2hlY2tzdW1fMzIuUyBiL2FyY2gveDg2L2xpYi9jaGVja3N1bV8zMi5TCmluZGV4IGU3OGI4ZWUuLjliYzk0NGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9jaGVja3N1bV8zMi5TCisrKyBiL2FyY2gveDg2L2xpYi9jaGVja3N1bV8zMi5TCkBAIC01MSwxMCArNTEsOCBAQAogCSAgICovCQkKIEVOVFJZKGNzdW1fcGFydGlhbCkKIAlDRklfU1RBUlRQUk9DCi0JcHVzaGxfY2ZpICVlc2kKLQlDRklfUkVMX09GRlNFVCBlc2ksIDAKLQlwdXNobF9jZmkgJWVieAotCUNGSV9SRUxfT0ZGU0VUIGVieCwgMAorCXB1c2hsX2NmaV9yZWcgZXNpCisJcHVzaGxfY2ZpX3JlZyBlYngKIAltb3ZsIDIwKCVlc3ApLCVlYXgJIyBGdW5jdGlvbiBhcmc6IHVuc2lnbmVkIGludCBzdW0KIAltb3ZsIDE2KCVlc3ApLCVlY3gJIyBGdW5jdGlvbiBhcmc6IGludCBsZW4KIAltb3ZsIDEyKCVlc3ApLCVlc2kJIyBGdW5jdGlvbiBhcmc6IHVuc2lnbmVkIGNoYXIgKmJ1ZmYKQEAgLTEyNywxNCArMTI1LDEyIEBACiA2OglhZGRsICVlY3gsJWVheAogCWFkY2wgJDAsICVlYXggCiA3OgkKLQl0ZXN0bCAkMSwgMTIoJWVzcCkKKwl0ZXN0YiAkMSwgMTIoJWVzcCkKIAlqeiA4ZgogCXJvbGwgJDgsICVlYXgKIDg6Ci0JcG9wbF9jZmkgJWVieAotCUNGSV9SRVNUT1JFIGVieAotCXBvcGxfY2ZpICVlc2kKLQlDRklfUkVTVE9SRSBlc2kKKwlwb3BsX2NmaV9yZWcgZWJ4CisJcG9wbF9jZmlfcmVnIGVzaQogCXJldAogCUNGSV9FTkRQUk9DCiBFTkRQUk9DKGNzdW1fcGFydGlhbCkKQEAgLTE0NSwxMCArMTQxLDggQEAKIAogRU5UUlkoY3N1bV9wYXJ0aWFsKQogCUNGSV9TVEFSVFBST0MKLQlwdXNobF9jZmkgJWVzaQotCUNGSV9SRUxfT0ZGU0VUIGVzaSwgMAotCXB1c2hsX2NmaSAlZWJ4Ci0JQ0ZJX1JFTF9PRkZTRVQgZWJ4LCAwCisJcHVzaGxfY2ZpX3JlZyBlc2kKKwlwdXNobF9jZmlfcmVnIGVieAogCW1vdmwgMjAoJWVzcCksJWVheAkjIEZ1bmN0aW9uIGFyZzogdW5zaWduZWQgaW50IHN1bQogCW1vdmwgMTYoJWVzcCksJWVjeAkjIEZ1bmN0aW9uIGFyZzogaW50IGxlbgogCW1vdmwgMTIoJWVzcCksJWVzaQkjIEZ1bmN0aW9uIGFyZzoJY29uc3QgdW5zaWduZWQgY2hhciAqYnVmCkBAIC0yNTEsMTQgKzI0NSwxMiBAQAogCWFkZGwgJWVieCwlZWF4CiAJYWRjbCAkMCwlZWF4CiA4MDogCi0JdGVzdGwgJDEsIDEyKCVlc3ApCisJdGVzdGIgJDEsIDEyKCVlc3ApCiAJanogOTBmCiAJcm9sbCAkOCwgJWVheAogOTA6IAotCXBvcGxfY2ZpICVlYngKLQlDRklfUkVTVE9SRSBlYngKLQlwb3BsX2NmaSAlZXNpCi0JQ0ZJX1JFU1RPUkUgZXNpCisJcG9wbF9jZmlfcmVnIGVieAorCXBvcGxfY2ZpX3JlZyBlc2kKIAlyZXQKIAlDRklfRU5EUFJPQwogRU5EUFJPQyhjc3VtX3BhcnRpYWwpCkBAIC0yOTgsMTIgKzI5MCw5IEBACiAJQ0ZJX1NUQVJUUFJPQwogCXN1YmwgICQ0LCVlc3AJCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIDQKLQlwdXNobF9jZmkgJWVkaQotCUNGSV9SRUxfT0ZGU0VUIGVkaSwgMAotCXB1c2hsX2NmaSAlZXNpCi0JQ0ZJX1JFTF9PRkZTRVQgZXNpLCAwCi0JcHVzaGxfY2ZpICVlYngKLQlDRklfUkVMX09GRlNFVCBlYngsIDAKKwlwdXNobF9jZmlfcmVnIGVkaQorCXB1c2hsX2NmaV9yZWcgZXNpCisJcHVzaGxfY2ZpX3JlZyBlYngKIAltb3ZsIEFSR0JBU0UrMTYoJWVzcCksJWVheAkjIHN1bQogCW1vdmwgQVJHQkFTRSsxMiglZXNwKSwlZWN4CSMgbGVuCiAJbW92bCBBUkdCQVNFKzQoJWVzcCksJWVzaQkjIHNyYwpAQCAtNDEyLDEyICs0MDEsOSBAQAogCiAucHJldmlvdXMKIAotCXBvcGxfY2ZpICVlYngKLQlDRklfUkVTVE9SRSBlYngKLQlwb3BsX2NmaSAlZXNpCi0JQ0ZJX1JFU1RPUkUgZXNpCi0JcG9wbF9jZmkgJWVkaQotCUNGSV9SRVNUT1JFIGVkaQorCXBvcGxfY2ZpX3JlZyBlYngKKwlwb3BsX2NmaV9yZWcgZXNpCisJcG9wbF9jZmlfcmVnIGVkaQogCXBvcGxfY2ZpICVlY3gJCQkjIGVxdWl2YWxlbnQgdG8gYWRkbCAkNCwlZXNwCiAJcmV0CQogCUNGSV9FTkRQUk9DCkBAIC00NDEsMTIgKzQyNyw5IEBACiAJCQogRU5UUlkoY3N1bV9wYXJ0aWFsX2NvcHlfZ2VuZXJpYykKIAlDRklfU1RBUlRQUk9DCi0JcHVzaGxfY2ZpICVlYngKLQlDRklfUkVMX09GRlNFVCBlYngsIDAKLQlwdXNobF9jZmkgJWVkaQotCUNGSV9SRUxfT0ZGU0VUIGVkaSwgMAotCXB1c2hsX2NmaSAlZXNpCi0JQ0ZJX1JFTF9PRkZTRVQgZXNpLCAwCisJcHVzaGxfY2ZpX3JlZyBlYngKKwlwdXNobF9jZmlfcmVnIGVkaQorCXB1c2hsX2NmaV9yZWcgZXNpCiAJbW92bCBBUkdCQVNFKzQoJWVzcCksJWVzaQkjc3JjCiAJbW92bCBBUkdCQVNFKzgoJWVzcCksJWVkaQkjZHN0CQogCW1vdmwgQVJHQkFTRSsxMiglZXNwKSwlZWN4CSNsZW4KQEAgLTUwNiwxMiArNDg5LDkgQEAKIAlqbXAgIDdiCQkJCiAucHJldmlvdXMJCQkJCiAKLQlwb3BsX2NmaSAlZXNpCi0JQ0ZJX1JFU1RPUkUgZXNpCi0JcG9wbF9jZmkgJWVkaQotCUNGSV9SRVNUT1JFIGVkaQotCXBvcGxfY2ZpICVlYngKLQlDRklfUkVTVE9SRSBlYngKKwlwb3BsX2NmaV9yZWcgZXNpCisJcG9wbF9jZmlfcmVnIGVkaQorCXBvcGxfY2ZpX3JlZyBlYngKIAlyZXQKIAlDRklfRU5EUFJPQwogRU5EUFJPQyhjc3VtX3BhcnRpYWxfY29weV9nZW5lcmljKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL2NsZWFyX3BhZ2VfNjQuUyBiL2FyY2gveDg2L2xpYi9jbGVhcl9wYWdlXzY0LlMKaW5kZXggZjIxNDVjZi4uZTY3ZTU3OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL2NsZWFyX3BhZ2VfNjQuUworKysgYi9hcmNoL3g4Ni9saWIvY2xlYXJfcGFnZV82NC5TCkBAIC0xLDMxICsxLDM1IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS1hc20uaD4KIAogLyoKLSAqIFplcm8gYSBwYWdlLiAJCi0gKiByZGkJcGFnZQotICovCQkJCi1FTlRSWShjbGVhcl9wYWdlX2MpCisgKiBNb3N0IENQVXMgc3VwcG9ydCBlbmhhbmNlZCBSRVAgTU9WU0IvU1RPU0IgaW5zdHJ1Y3Rpb25zLiBJdCBpcworICogcmVjb21tZW5kZWQgdG8gdXNlIHRoaXMgd2hlbiBwb3NzaWJsZSBhbmQgd2UgZG8gdXNlIHRoZW0gYnkgZGVmYXVsdC4KKyAqIElmIGVuaGFuY2VkIFJFUCBNT1ZTQi9TVE9TQiBpcyBub3QgYXZhaWxhYmxlLCB0cnkgdG8gdXNlIGZhc3Qgc3RyaW5nLgorICogT3RoZXJ3aXNlLCB1c2Ugb3JpZ2luYWwuCisgKi8KKworLyoKKyAqIFplcm8gYSBwYWdlLgorICogJXJkaQktIHBhZ2UKKyAqLworRU5UUlkoY2xlYXJfcGFnZSkKIAlDRklfU1RBUlRQUk9DCisKKwlBTFRFUk5BVElWRV8yICJqbXAgY2xlYXJfcGFnZV9vcmlnIiwgIiIsIFg4Nl9GRUFUVVJFX1JFUF9HT09ELCBcCisJCSAgICAgICJqbXAgY2xlYXJfcGFnZV9jX2UiLCBYODZfRkVBVFVSRV9FUk1TCisKIAltb3ZsICQ0MDk2LzgsJWVjeAogCXhvcmwgJWVheCwlZWF4CiAJcmVwIHN0b3NxCiAJcmV0CiAJQ0ZJX0VORFBST0MKLUVORFBST0MoY2xlYXJfcGFnZV9jKQorRU5EUFJPQyhjbGVhcl9wYWdlKQogCi1FTlRSWShjbGVhcl9wYWdlX2NfZSkKK0VOVFJZKGNsZWFyX3BhZ2Vfb3JpZykKIAlDRklfU1RBUlRQUk9DCi0JbW92bCAkNDA5NiwlZWN4Ci0JeG9ybCAlZWF4LCVlYXgKLQlyZXAgc3Rvc2IKLQlyZXQKLQlDRklfRU5EUFJPQwotRU5EUFJPQyhjbGVhcl9wYWdlX2NfZSkKIAotRU5UUlkoY2xlYXJfcGFnZSkKLQlDRklfU1RBUlRQUk9DCiAJeG9ybCAgICVlYXgsJWVheAogCW1vdmwgICAkNDA5Ni82NCwlZWN4CiAJLnAyYWxpZ24gNApAQCAtNDUsMjkgKzQ5LDEzIEBACiAJbm9wCiAJcmV0CiAJQ0ZJX0VORFBST0MKLS5MY2xlYXJfcGFnZV9lbmQ6Ci1FTkRQUk9DKGNsZWFyX3BhZ2UpCitFTkRQUk9DKGNsZWFyX3BhZ2Vfb3JpZykKIAotCS8qCi0JICogU29tZSBDUFVzIHN1cHBvcnQgZW5oYW5jZWQgUkVQIE1PVlNCL1NUT1NCIGluc3RydWN0aW9ucy4KLQkgKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyB3aGVuIHBvc3NpYmxlLgotCSAqIElmIGVuaGFuY2VkIFJFUCBNT1ZTQi9TVE9TQiBpcyBub3QgYXZhaWxhYmxlLCB0cnkgdG8gdXNlIGZhc3Qgc3RyaW5nLgotCSAqIE90aGVyd2lzZSwgdXNlIG9yaWdpbmFsIGZ1bmN0aW9uLgotCSAqCi0JICovCi0KLSNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgotCi0JLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCJheCIKLTE6CS5ieXRlIDB4ZWIJCQkJCS8qIGptcCA8ZGlzcDg+ICovCi0JLmJ5dGUgKGNsZWFyX3BhZ2VfYyAtIGNsZWFyX3BhZ2UpIC0gKDJmIC0gMWIpCS8qIG9mZnNldCAqLwotMjoJLmJ5dGUgMHhlYgkJCQkJLyogam1wIDxkaXNwOD4gKi8KLQkuYnl0ZSAoY2xlYXJfcGFnZV9jX2UgLSBjbGVhcl9wYWdlKSAtICgzZiAtIDJiKQkvKiBvZmZzZXQgKi8KLTM6Ci0JLnByZXZpb3VzCi0JLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywiYSIKLQlhbHRpbnN0cnVjdGlvbl9lbnRyeSBjbGVhcl9wYWdlLDFiLFg4Nl9GRUFUVVJFX1JFUF9HT09ELFwKLQkJCSAgICAgLkxjbGVhcl9wYWdlX2VuZC1jbGVhcl9wYWdlLCAyYi0xYgotCWFsdGluc3RydWN0aW9uX2VudHJ5IGNsZWFyX3BhZ2UsMmIsWDg2X0ZFQVRVUkVfRVJNUywgICBcCi0JCQkgICAgIC5MY2xlYXJfcGFnZV9lbmQtY2xlYXJfcGFnZSwzYi0yYgotCS5wcmV2aW91cworRU5UUlkoY2xlYXJfcGFnZV9jX2UpCisJQ0ZJX1NUQVJUUFJPQworCW1vdmwgJDQwOTYsJWVjeAorCXhvcmwgJWVheCwlZWF4CisJcmVwIHN0b3NiCisJcmV0CisJQ0ZJX0VORFBST0MKK0VORFBST0MoY2xlYXJfcGFnZV9jX2UpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvY29weV9wYWdlXzY0LlMgYi9hcmNoL3g4Ni9saWIvY29weV9wYWdlXzY0LlMKaW5kZXggMTc2Y2NhNi4uODIzOWRiYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL2NvcHlfcGFnZV82NC5TCisrKyBiL2FyY2gveDg2L2xpYi9jb3B5X3BhZ2VfNjQuUwpAQCAtMiwyMyArMiwyNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KKyNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS1hc20uaD4KIAorLyoKKyAqIFNvbWUgQ1BVcyBydW4gZmFzdGVyIHVzaW5nIHRoZSBzdHJpbmcgY29weSBpbnN0cnVjdGlvbnMgKHNhbmUgbWljcm9jb2RlKS4KKyAqIEl0IGlzIGFsc28gYSBsb3Qgc2ltcGxlci4gVXNlIHRoaXMgd2hlbiBwb3NzaWJsZS4gQnV0LCBkb24ndCB1c2Ugc3RyZWFtaW5nCisgKiBjb3B5IHVubGVzcyB0aGUgQ1BVIGluZGljYXRlcyBYODZfRkVBVFVSRV9SRVBfR09PRC4gQ291bGQgdmFyeSB0aGUKKyAqIHByZWZldGNoIGRpc3RhbmNlIGJhc2VkIG9uIFNNUC9VUC4KKyAqLwogCUFMSUdOCi1jb3B5X3BhZ2VfcmVwOgorRU5UUlkoY29weV9wYWdlKQogCUNGSV9TVEFSVFBST0MKKwlBTFRFUk5BVElWRSAiam1wIGNvcHlfcGFnZV9yZWdzIiwgIiIsIFg4Nl9GRUFUVVJFX1JFUF9HT09ECiAJbW92bAkkNDA5Ni84LCAlZWN4CiAJcmVwCW1vdnNxCiAJcmV0CiAJQ0ZJX0VORFBST0MKLUVORFBST0MoY29weV9wYWdlX3JlcCkKK0VORFBST0MoY29weV9wYWdlKQogCi0vKgotICogIERvbid0IHVzZSBzdHJlYW1pbmcgY29weSB1bmxlc3MgdGhlIENQVSBpbmRpY2F0ZXMgWDg2X0ZFQVRVUkVfUkVQX0dPT0QuCi0gKiAgQ291bGQgdmFyeSB0aGUgcHJlZmV0Y2ggZGlzdGFuY2UgYmFzZWQgb24gU01QL1VQLgotKi8KLQotRU5UUlkoY29weV9wYWdlKQorRU5UUlkoY29weV9wYWdlX3JlZ3MpCiAJQ0ZJX1NUQVJUUFJPQwogCXN1YnEJJDIqOCwJJXJzcAogCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAyKjgKQEAgLTkwLDIxICs5Myw1IEBACiAJYWRkcQkkMio4LCAlcnNwCiAJQ0ZJX0FESlVTVF9DRkFfT0ZGU0VUIC0yKjgKIAlyZXQKLS5MY29weV9wYWdlX2VuZDoKIAlDRklfRU5EUFJPQwotRU5EUFJPQyhjb3B5X3BhZ2UpCi0KLQkvKiBTb21lIENQVXMgcnVuIGZhc3RlciB1c2luZyB0aGUgc3RyaW5nIGNvcHkgaW5zdHJ1Y3Rpb25zLgotCSAgIEl0IGlzIGFsc28gYSBsb3Qgc2ltcGxlci4gVXNlIHRoaXMgd2hlbiBwb3NzaWJsZSAqLwotCi0jaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KLQotCS5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwiYXgiCi0xOgkuYnl0ZSAweGViCQkJCQkvKiBqbXAgPGRpc3A4PiAqLwotCS5ieXRlIChjb3B5X3BhZ2VfcmVwIC0gY29weV9wYWdlKSAtICgyZiAtIDFiKQkvKiBvZmZzZXQgKi8KLTI6Ci0JLnByZXZpb3VzCi0JLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucywiYSIKLQlhbHRpbnN0cnVjdGlvbl9lbnRyeSBjb3B5X3BhZ2UsIDFiLCBYODZfRkVBVFVSRV9SRVBfR09PRCwJXAotCQkuTGNvcHlfcGFnZV9lbmQtY29weV9wYWdlLCAyYi0xYgotCS5wcmV2aW91cworRU5EUFJPQyhjb3B5X3BhZ2VfcmVncykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9jb3B5X3VzZXJfNjQuUyBiL2FyY2gveDg2L2xpYi9jb3B5X3VzZXJfNjQuUwppbmRleCBkZWU5NDVkLi5mYTk5N2RmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvY29weV91c2VyXzY0LlMKKysrIGIvYXJjaC94ODYvbGliL2NvcHlfdXNlcl82NC5TCkBAIC04LDkgKzgsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9kd2FyZjIuaD4KLQotI2RlZmluZSBGSVhfQUxJR05NRU5UIDEKLQogI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CkBAIC0xOSwzMyArMTYsNyBAQAogI2luY2x1ZGUgPGFzbS9hc20uaD4KICNpbmNsdWRlIDxhc20vc21hcC5oPgogCi0vKgotICogQnkgcGxhY2luZyBmZWF0dXJlMiBhZnRlciBmZWF0dXJlMSBpbiBhbHRpbnN0cnVjdGlvbnMgc2VjdGlvbiwgd2UgbG9naWNhbGx5Ci0gKiBpbXBsZW1lbnQ6Ci0gKiBJZiBDUFUgaGFzIGZlYXR1cmUyLCBqbXAgdG8gYWx0MiBpcyB1c2VkCi0gKiBlbHNlIGlmIENQVSBoYXMgZmVhdHVyZTEsIGptcCB0byBhbHQxIGlzIHVzZWQKLSAqIGVsc2Ugam1wIHRvIG9yaWcgaXMgdXNlZC4KLSAqLwotCS5tYWNybyBBTFRFUk5BVElWRV9KVU1QIGZlYXR1cmUxLGZlYXR1cmUyLG9yaWcsYWx0MSxhbHQyCi0wOgotCS5ieXRlIDB4ZTkJLyogMzJiaXQganVtcCAqLwotCS5sb25nIFxvcmlnLTFmCS8qIGJ5IGRlZmF1bHQganVtcCB0byBvcmlnICovCi0xOgotCS5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwiYXgiCi0yOgkuYnl0ZSAweGU5CQkJLyogbmVhciBqdW1wIHdpdGggMzJiaXQgaW1tZWRpYXRlICovCi0JLmxvbmcgXGFsdDEtMWIgLyogb2Zmc2V0ICovICAgLyogb3IgYWx0ZXJuYXRpdmVseSB0byBhbHQxICovCi0zOgkuYnl0ZSAweGU5CQkJLyogbmVhciBqdW1wIHdpdGggMzJiaXQgaW1tZWRpYXRlICovCi0JLmxvbmcgXGFsdDItMWIgLyogb2Zmc2V0ICovICAgLyogb3IgYWx0ZXJuYXRpdmVseSB0byBhbHQyICovCi0JLnByZXZpb3VzCi0KLQkuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCJhIgotCWFsdGluc3RydWN0aW9uX2VudHJ5IDBiLDJiLFxmZWF0dXJlMSw1LDUKLQlhbHRpbnN0cnVjdGlvbl9lbnRyeSAwYiwzYixcZmVhdHVyZTIsNSw1Ci0JLnByZXZpb3VzCi0JLmVuZG0KLQogCS5tYWNybyBBTElHTl9ERVNUSU5BVElPTgotI2lmZGVmIEZJWF9BTElHTk1FTlQKIAkvKiBjaGVjayBmb3IgYmFkIGFsaWdubWVudCBvZiBkZXN0aW5hdGlvbiAqLwogCW1vdmwgJWVkaSwlZWN4CiAJYW5kbCAkNywlZWN4CkBAIC02Nyw3ICszOCw2IEBACiAKIAlfQVNNX0VYVEFCTEUoMTAwYiwxMDNiKQogCV9BU01fRVhUQUJMRSgxMDFiLDEwM2IpCi0jZW5kaWYKIAkuZW5kbQogCiAvKiBTdGFuZGFyZCBjb3B5X3RvX3VzZXIgd2l0aCBzZWdtZW50IGxpbWl0IGNoZWNraW5nICovCkBAIC03OSw5ICs0OSwxMSBAQAogCWpjIGJhZF90b191c2VyCiAJY21wcSBUSV9hZGRyX2xpbWl0KCVyYXgpLCVyY3gKIAlqYSBiYWRfdG9fdXNlcgotCUFMVEVSTkFUSVZFX0pVTVAgWDg2X0ZFQVRVUkVfUkVQX0dPT0QsWDg2X0ZFQVRVUkVfRVJNUywJXAotCQljb3B5X3VzZXJfZ2VuZXJpY191bnJvbGxlZCxjb3B5X3VzZXJfZ2VuZXJpY19zdHJpbmcsCVwKLQkJY29weV91c2VyX2VuaGFuY2VkX2Zhc3Rfc3RyaW5nCisJQUxURVJOQVRJVkVfMiAiam1wIGNvcHlfdXNlcl9nZW5lcmljX3Vucm9sbGVkIiwJCVwKKwkJICAgICAgImptcCBjb3B5X3VzZXJfZ2VuZXJpY19zdHJpbmciLAkJXAorCQkgICAgICBYODZfRkVBVFVSRV9SRVBfR09PRCwJCQlcCisJCSAgICAgICJqbXAgY29weV91c2VyX2VuaGFuY2VkX2Zhc3Rfc3RyaW5nIiwJXAorCQkgICAgICBYODZfRkVBVFVSRV9FUk1TCiAJQ0ZJX0VORFBST0MKIEVORFBST0MoX2NvcHlfdG9fdXNlcikKIApAQCAtOTQsOSArNjYsMTEgQEAKIAlqYyBiYWRfZnJvbV91c2VyCiAJY21wcSBUSV9hZGRyX2xpbWl0KCVyYXgpLCVyY3gKIAlqYSBiYWRfZnJvbV91c2VyCi0JQUxURVJOQVRJVkVfSlVNUCBYODZfRkVBVFVSRV9SRVBfR09PRCxYODZfRkVBVFVSRV9FUk1TLAlcCi0JCWNvcHlfdXNlcl9nZW5lcmljX3Vucm9sbGVkLGNvcHlfdXNlcl9nZW5lcmljX3N0cmluZywJXAotCQljb3B5X3VzZXJfZW5oYW5jZWRfZmFzdF9zdHJpbmcKKwlBTFRFUk5BVElWRV8yICJqbXAgY29weV91c2VyX2dlbmVyaWNfdW5yb2xsZWQiLAkJXAorCQkgICAgICAiam1wIGNvcHlfdXNlcl9nZW5lcmljX3N0cmluZyIsCQlcCisJCSAgICAgIFg4Nl9GRUFUVVJFX1JFUF9HT09ELAkJCVwKKwkJICAgICAgImptcCBjb3B5X3VzZXJfZW5oYW5jZWRfZmFzdF9zdHJpbmciLAlcCisJCSAgICAgIFg4Nl9GRUFUVVJFX0VSTVMKIAlDRklfRU5EUFJPQwogRU5EUFJPQyhfY29weV9mcm9tX3VzZXIpCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9jc3VtLWNvcHlfNjQuUyBiL2FyY2gveDg2L2xpYi9jc3VtLWNvcHlfNjQuUwppbmRleCAyNDE5ZDVmLi45NzM0MTgyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvY3N1bS1jb3B5XzY0LlMKKysrIGIvYXJjaC94ODYvbGliL2NzdW0tY29weV82NC5TCkBAIC0xOTYsNyArMTk2LDcgQEAKIAogCS8qIGhhbmRsZSBsYXN0IG9kZCBieXRlICovCiAuTGhhbmRsZV8xOgotCXRlc3RsICQxLCAlcjEwZAorCXRlc3RiICQxLCAlcjEwYgogCWp6ICAgIC5MZW5kZQogCXhvcmwgICVlYngsICVlYngKIAlzb3VyY2UKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9pbnNuLmMgYi9hcmNoL3g4Ni9saWIvaW5zbi5jCmluZGV4IDEzMTNhZTYuLjhmNzJiMzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9pbnNuLmMKKysrIGIvYXJjaC94ODYvbGliL2luc24uYwpAQCAtNTIsNiArNTIsMTMgQEAKICAqLwogdm9pZCBpbnNuX2luaXQoc3RydWN0IGluc24gKmluc24sIGNvbnN0IHZvaWQgKmthZGRyLCBpbnQgYnVmX2xlbiwgaW50IHg4Nl82NCkKIHsKKwkvKgorCSAqIEluc3RydWN0aW9ucyBsb25nZXIgdGhhbiBNQVhfSU5TTl9TSVpFICgxNSBieXRlcykgYXJlIGludmFsaWQKKwkgKiBldmVuIGlmIHRoZSBpbnB1dCBidWZmZXIgaXMgbG9uZyBlbm91Z2ggdG8gaG9sZCB0aGVtLgorCSAqLworCWlmIChidWZfbGVuID4gTUFYX0lOU05fU0laRSkKKwkJYnVmX2xlbiA9IE1BWF9JTlNOX1NJWkU7CisKIAltZW1zZXQoaW5zbiwgMCwgc2l6ZW9mKCppbnNuKSk7CiAJaW5zbi0+a2FkZHIgPSBrYWRkcjsKIAlpbnNuLT5lbmRfa2FkZHIgPSBrYWRkciArIGJ1Zl9sZW47CkBAIC0xNjQsNiArMTcxLDEyIEBACiAJCQkJLyogVkVYLlcgb3ZlcnJpZGVzIG9wbmRfc2l6ZSAqLwogCQkJCWluc24tPm9wbmRfYnl0ZXMgPSA4OwogCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEZvciBWRVgyLCBmYWtlIFZFWDMtbGlrZSBieXRlIzIuCisJCQkgKiBNYWtlcyBpdCBlYXNpZXIgdG8gZGVjb2RlIHZleC5XLCB2ZXgudnZ2diwKKwkJCSAqIHZleC5MIGFuZCB2ZXgucHAuIE1hc2tpbmcgd2l0aCAweDdmIHNldHMgdmV4LlcgPT0gMC4KKwkJCSAqLworCQkJaW5zbi0+dmV4X3ByZWZpeC5ieXRlc1syXSA9IGIyICYgMHg3ZjsKIAkJCWluc24tPnZleF9wcmVmaXgubmJ5dGVzID0gMjsKIAkJCWluc24tPm5leHRfYnl0ZSArPSAyOwogCQl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvbWVtY3B5XzY0LlMgYi9hcmNoL3g4Ni9saWIvbWVtY3B5XzY0LlMKaW5kZXggODliNTNjOS4uYjA0NjY2NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL21lbWNweV82NC5TCisrKyBiL2FyY2gveDg2L2xpYi9tZW1jcHlfNjQuUwpAQCAtMSwxMiArMSwyMCBAQAogLyogQ29weXJpZ2h0IDIwMDIgQW5kaSBLbGVlbiAqLwogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotCiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KICNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CiAjaW5jbHVkZSA8YXNtL2FsdGVybmF0aXZlLWFzbS5oPgogCiAvKgorICogV2UgYnVpbGQgYSBqdW1wIHRvIG1lbWNweV9vcmlnIGJ5IGRlZmF1bHQgd2hpY2ggZ2V0cyBOT1BwZWQgb3V0IG9uCisgKiB0aGUgbWFqb3JpdHkgb2YgeDg2IENQVXMgd2hpY2ggc2V0IFJFUF9HT09ELiBJbiBhZGRpdGlvbiwgQ1BVcyB3aGljaAorICogaGF2ZSB0aGUgZW5oYW5jZWQgUkVQIE1PVlNCL1NUT1NCIGZlYXR1cmUgKEVSTVMpLCBjaGFuZ2UgdGhvc2UgTk9QcworICogdG8gYSBqbXAgdG8gbWVtY3B5X2VybXMgd2hpY2ggZG9lcyB0aGUgUkVQOyBNT1ZTQiBtZW0gY29weS4KKyAqLworCisud2VhayBtZW1jcHkKKworLyoKICAqIG1lbWNweSAtIENvcHkgYSBtZW1vcnkgYmxvY2suCiAgKgogICogSW5wdXQ6CkBAIC0xNywxNSArMjUsMTEgQEAKICAqIE91dHB1dDoKICAqIHJheCBvcmlnaW5hbCBkZXN0aW5hdGlvbgogICovCitFTlRSWShfX21lbWNweSkKK0VOVFJZKG1lbWNweSkKKwlBTFRFUk5BVElWRV8yICJqbXAgbWVtY3B5X29yaWciLCAiIiwgWDg2X0ZFQVRVUkVfUkVQX0dPT0QsIFwKKwkJICAgICAgImptcCBtZW1jcHlfZXJtcyIsIFg4Nl9GRUFUVVJFX0VSTVMKIAotLyoKLSAqIG1lbWNweV9jKCkgLSBmYXN0IHN0cmluZyBvcHMgKFJFUCBNT1ZTUSkgYmFzZWQgdmFyaWFudC4KLSAqCi0gKiBUaGlzIGdldHMgcGF0Y2hlZCBvdmVyIHRoZSB1bnJvbGxlZCB2YXJpYW50IChiZWxvdykgdmlhIHRoZQotICogYWx0ZXJuYXRpdmUgaW5zdHJ1Y3Rpb25zIGZyYW1ld29yazoKLSAqLwotCS5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwgImF4IiwgQHByb2diaXRzCi0uTG1lbWNweV9jOgogCW1vdnEgJXJkaSwgJXJheAogCW1vdnEgJXJkeCwgJXJjeAogCXNocnEgJDMsICVyY3gKQEAgLTM0LDI5ICszOCwyMSBAQAogCW1vdmwgJWVkeCwgJWVjeAogCXJlcCBtb3ZzYgogCXJldAotLkxtZW1jcHlfZToKLQkucHJldmlvdXMKK0VORFBST0MobWVtY3B5KQorRU5EUFJPQyhfX21lbWNweSkKIAogLyoKLSAqIG1lbWNweV9jX2UoKSAtIGVuaGFuY2VkIGZhc3Qgc3RyaW5nIG1lbWNweS4gVGhpcyBpcyBmYXN0ZXIgYW5kIHNpbXBsZXIgdGhhbgotICogbWVtY3B5X2MuIFVzZSBtZW1jcHlfY19lIHdoZW4gcG9zc2libGUuCi0gKgotICogVGhpcyBnZXRzIHBhdGNoZWQgb3ZlciB0aGUgdW5yb2xsZWQgdmFyaWFudCAoYmVsb3cpIHZpYSB0aGUKLSAqIGFsdGVybmF0aXZlIGluc3RydWN0aW9ucyBmcmFtZXdvcms6CisgKiBtZW1jcHlfZXJtcygpIC0gZW5oYW5jZWQgZmFzdCBzdHJpbmcgbWVtY3B5LiBUaGlzIGlzIGZhc3RlciBhbmQKKyAqIHNpbXBsZXIgdGhhbiBtZW1jcHkuIFVzZSBtZW1jcHlfZXJtcyB3aGVuIHBvc3NpYmxlLgogICovCi0JLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCAiYXgiLCBAcHJvZ2JpdHMKLS5MbWVtY3B5X2NfZToKK0VOVFJZKG1lbWNweV9lcm1zKQogCW1vdnEgJXJkaSwgJXJheAogCW1vdnEgJXJkeCwgJXJjeAogCXJlcCBtb3ZzYgogCXJldAotLkxtZW1jcHlfZV9lOgotCS5wcmV2aW91cworRU5EUFJPQyhtZW1jcHlfZXJtcykKIAotLndlYWsgbWVtY3B5Ci0KLUVOVFJZKF9fbWVtY3B5KQotRU5UUlkobWVtY3B5KQorRU5UUlkobWVtY3B5X29yaWcpCiAJQ0ZJX1NUQVJUUFJPQwogCW1vdnEgJXJkaSwgJXJheAogCkBAIC0xODMsMjYgKzE3OSw0IEBACiAuTGVuZDoKIAlyZXRxCiAJQ0ZJX0VORFBST0MKLUVORFBST0MobWVtY3B5KQotRU5EUFJPQyhfX21lbWNweSkKLQotCS8qCi0JICogU29tZSBDUFVzIGFyZSBhZGRpbmcgZW5oYW5jZWQgUkVQIE1PVlNCL1NUT1NCIGZlYXR1cmUKLQkgKiBJZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQsIG1lbWNweV9jX2UoKSBpcyB0aGUgZmlyc3QgY2hvaWNlLgotCSAqIElmIGVuaGFuY2VkIHJlcCBtb3ZzYiBjb3B5IGlzIG5vdCBhdmFpbGFibGUsIHVzZSBmYXN0IHN0cmluZyBjb3B5Ci0JICogbWVtY3B5X2MoKSB3aGVuIHBvc3NpYmxlLiBUaGlzIGlzIGZhc3RlciBhbmQgY29kZSBpcyBzaW1wbGVyIHRoYW4KLQkgKiBvcmlnaW5hbCBtZW1jcHkoKS4KLQkgKiBPdGhlcndpc2UsIG9yaWdpbmFsIG1lbWNweSgpIGlzIHVzZWQuCi0JICogSW4gLmFsdGluc3RydWN0aW9ucyBzZWN0aW9uLCBFUk1TIGZlYXR1cmUgaXMgcGxhY2VkIGFmdGVyIFJFR19HT09ECi0gICAgICAgICAqIGZlYXR1cmUgdG8gaW1wbGVtZW50IHRoZSByaWdodCBwYXRjaCBvcmRlci4KLQkgKgotCSAqIFJlcGxhY2Ugb25seSBiZWdpbm5pbmcsIG1lbWNweSBpcyB1c2VkIHRvIGFwcGx5IGFsdGVybmF0aXZlcywKLQkgKiBzbyBpdCBpcyBzaWxseSB0byBvdmVyd3JpdGUgaXRzZWxmIHdpdGggbm9wcyAtIHJlYm9vdCBpcyB0aGUKLQkgKiBvbmx5IG91dGNvbWUuLi4KLQkgKi8KLQkuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCAiYSIKLQlhbHRpbnN0cnVjdGlvbl9lbnRyeSBfX21lbWNweSwuTG1lbWNweV9jLFg4Nl9GRUFUVVJFX1JFUF9HT09ELFwKLQkJCSAgICAgLkxtZW1jcHlfZS0uTG1lbWNweV9jLC5MbWVtY3B5X2UtLkxtZW1jcHlfYwotCWFsdGluc3RydWN0aW9uX2VudHJ5IF9fbWVtY3B5LC5MbWVtY3B5X2NfZSxYODZfRkVBVFVSRV9FUk1TLCBcCi0JCQkgICAgIC5MbWVtY3B5X2VfZS0uTG1lbWNweV9jX2UsLkxtZW1jcHlfZV9lLS5MbWVtY3B5X2NfZQotCS5wcmV2aW91cworRU5EUFJPQyhtZW1jcHlfb3JpZykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9tZW1tb3ZlXzY0LlMgYi9hcmNoL3g4Ni9saWIvbWVtbW92ZV82NC5TCmluZGV4IDljNGI1MzAuLjBmOGEwZDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9tZW1tb3ZlXzY0LlMKKysrIGIvYXJjaC94ODYvbGliL21lbW1vdmVfNjQuUwpAQCAtNSw3ICs1LDYgQEAKICAqIFRoaXMgYXNzZW1ibHkgZmlsZSBpcyByZS13cml0dGVuIGZyb20gbWVtbW92ZV82NC5jIGZpbGUuCiAgKgktIENvcHlyaWdodCAyMDExIEZlbmdodWEgWXUgPGZlbmdodWEueXVAaW50ZWwuY29tPgogICovCi0jZGVmaW5lIF9TVFJJTkdfQwogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vZHdhcmYyLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4KQEAgLTQ0LDYgKzQzLDggQEAKIAlqZyAyZgogCiAuTG1lbW1vdmVfYmVnaW5fZm9yd2FyZDoKKwlBTFRFUk5BVElWRSAiIiwgIm1vdnEgJXJkeCwgJXJjeDsgcmVwIG1vdnNiOyByZXRxIiwgWDg2X0ZFQVRVUkVfRVJNUworCiAJLyoKIAkgKiBtb3ZzcSBpbnN0cnVjdGlvbiBoYXZlIG1hbnkgc3RhcnR1cCBsYXRlbmN5CiAJICogc28gd2UgaGFuZGxlIHNtYWxsIHNpemUgYnkgZ2VuZXJhbCByZWdpc3Rlci4KQEAgLTIwNywyMSArMjA4LDUgQEAKIDEzOgogCXJldHEKIAlDRklfRU5EUFJPQwotCi0JLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCJheCIKLS5MbWVtbW92ZV9iZWdpbl9mb3J3YXJkX2VmczoKLQkvKiBGb3J3YXJkIG1vdmluZyBkYXRhLiAqLwotCW1vdnEgJXJkeCwgJXJjeAotCXJlcCBtb3ZzYgotCXJldHEKLS5MbWVtbW92ZV9lbmRfZm9yd2FyZF9lZnM6Ci0JLnByZXZpb3VzCi0KLQkuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCJhIgotCWFsdGluc3RydWN0aW9uX2VudHJ5IC5MbWVtbW92ZV9iZWdpbl9mb3J3YXJkLAkJXAotCQkuTG1lbW1vdmVfYmVnaW5fZm9yd2FyZF9lZnMsWDg2X0ZFQVRVUkVfRVJNUywJXAotCQkuTG1lbW1vdmVfZW5kX2ZvcndhcmQtLkxtZW1tb3ZlX2JlZ2luX2ZvcndhcmQsCVwKLQkJLkxtZW1tb3ZlX2VuZF9mb3J3YXJkX2Vmcy0uTG1lbW1vdmVfYmVnaW5fZm9yd2FyZF9lZnMKLQkucHJldmlvdXMKIEVORFBST0MoX19tZW1tb3ZlKQogRU5EUFJPQyhtZW1tb3ZlKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL21lbXNldF82NC5TIGIvYXJjaC94ODYvbGliL21lbXNldF82NC5TCmluZGV4IDZmNDQ5MzUuLjkzMTE4ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9tZW1zZXRfNjQuUworKysgYi9hcmNoL3g4Ni9saWIvbWVtc2V0XzY0LlMKQEAgLTUsMTkgKzUsMzAgQEAKICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgogI2luY2x1ZGUgPGFzbS9hbHRlcm5hdGl2ZS1hc20uaD4KIAorLndlYWsgbWVtc2V0CisKIC8qCiAgKiBJU08gQyBtZW1zZXQgLSBzZXQgYSBtZW1vcnkgYmxvY2sgdG8gYSBieXRlIHZhbHVlLiBUaGlzIGZ1bmN0aW9uIHVzZXMgZmFzdAogICogc3RyaW5nIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uIFRoZSBjb2RlIGlzCiAgKiBzaW1wbGVyIGFuZCBzaG9ydGVyIHRoYW4gdGhlIG9yaWduYWwgZnVuY3Rpb24gYXMgd2VsbC4KLSAqCQorICoKICAqIHJkaSAgIGRlc3RpbmF0aW9uCi0gKiByc2kgICB2YWx1ZSAoY2hhcikgCi0gKiByZHggICBjb3VudCAoYnl0ZXMpIAotICogCisgKiByc2kgICB2YWx1ZSAoY2hhcikKKyAqIHJkeCAgIGNvdW50IChieXRlcykKKyAqCiAgKiByYXggICBvcmlnaW5hbCBkZXN0aW5hdGlvbgotICovCQotCS5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwgImF4IiwgQHByb2diaXRzCi0uTG1lbXNldF9jOgorICovCitFTlRSWShtZW1zZXQpCitFTlRSWShfX21lbXNldCkKKwkvKgorCSAqIFNvbWUgQ1BVcyBzdXBwb3J0IGVuaGFuY2VkIFJFUCBNT1ZTQi9TVE9TQiBmZWF0dXJlLiBJdCBpcyByZWNvbW1lbmRlZAorCSAqIHRvIHVzZSBpdCB3aGVuIHBvc3NpYmxlLiBJZiBub3QgYXZhaWxhYmxlLCB1c2UgZmFzdCBzdHJpbmcgaW5zdHJ1Y3Rpb25zLgorCSAqCisJICogT3RoZXJ3aXNlLCB1c2Ugb3JpZ2luYWwgbWVtc2V0IGZ1bmN0aW9uLgorCSAqLworCUFMVEVSTkFUSVZFXzIgImptcCBtZW1zZXRfb3JpZyIsICIiLCBYODZfRkVBVFVSRV9SRVBfR09PRCwgXAorCQkgICAgICAiam1wIG1lbXNldF9lcm1zIiwgWDg2X0ZFQVRVUkVfRVJNUworCiAJbW92cSAlcmRpLCVyOQogCW1vdnEgJXJkeCwlcmN4CiAJYW5kbCAkNywlZWR4CkBAIC0zMSw4ICs0Miw4IEBACiAJcmVwIHN0b3NiCiAJbW92cSAlcjksJXJheAogCXJldAotLkxtZW1zZXRfZToKLQkucHJldmlvdXMKK0VORFBST0MobWVtc2V0KQorRU5EUFJPQyhfX21lbXNldCkKIAogLyoKICAqIElTTyBDIG1lbXNldCAtIHNldCBhIG1lbW9yeSBibG9jayB0byBhIGJ5dGUgdmFsdWUuIFRoaXMgZnVuY3Rpb24gdXNlcwpAQCAtNDUsMjEgKzU2LDE2IEBACiAgKgogICogcmF4ICAgb3JpZ2luYWwgZGVzdGluYXRpb24KICAqLwotCS5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCwgImF4IiwgQHByb2diaXRzCi0uTG1lbXNldF9jX2U6CitFTlRSWShtZW1zZXRfZXJtcykKIAltb3ZxICVyZGksJXI5CiAJbW92YiAlc2lsLCVhbAogCW1vdnEgJXJkeCwlcmN4CiAJcmVwIHN0b3NiCiAJbW92cSAlcjksJXJheAogCXJldAotLkxtZW1zZXRfZV9lOgotCS5wcmV2aW91cworRU5EUFJPQyhtZW1zZXRfZXJtcykKIAotLndlYWsgbWVtc2V0Ci0KLUVOVFJZKG1lbXNldCkKLUVOVFJZKF9fbWVtc2V0KQorRU5UUlkobWVtc2V0X29yaWcpCiAJQ0ZJX1NUQVJUUFJPQwogCW1vdnEgJXJkaSwlcjEwCiAKQEAgLTEzNCwyMyArMTQwLDQgQEAKIAlqbXAgLkxhZnRlcl9iYWRfYWxpZ25tZW50CiAuTGZpbmFsOgogCUNGSV9FTkRQUk9DCi1FTkRQUk9DKG1lbXNldCkKLUVORFBST0MoX19tZW1zZXQpCi0KLQkvKiBTb21lIENQVXMgc3VwcG9ydCBlbmhhbmNlZCBSRVAgTU9WU0IvU1RPU0IgZmVhdHVyZS4KLQkgKiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgdGhpcyB3aGVuIHBvc3NpYmxlLgotCSAqCi0JICogSWYgZW5oYW5jZWQgUkVQIE1PVlNCL1NUT1NCIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZSwgdXNlIGZhc3Qgc3RyaW5nCi0JICogaW5zdHJ1Y3Rpb25zLgotCSAqCi0JICogT3RoZXJ3aXNlLCB1c2Ugb3JpZ2luYWwgbWVtc2V0IGZ1bmN0aW9uLgotCSAqCi0JICogSW4gLmFsdGluc3RydWN0aW9ucyBzZWN0aW9uLCBFUk1TIGZlYXR1cmUgaXMgcGxhY2VkIGFmdGVyIFJFR19HT09ECi0gICAgICAgICAqIGZlYXR1cmUgdG8gaW1wbGVtZW50IHRoZSByaWdodCBwYXRjaCBvcmRlci4KLQkgKi8KLQkuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLCJhIgotCWFsdGluc3RydWN0aW9uX2VudHJ5IF9fbWVtc2V0LC5MbWVtc2V0X2MsWDg2X0ZFQVRVUkVfUkVQX0dPT0QsXAotCQkJICAgICAuTGZpbmFsLV9fbWVtc2V0LC5MbWVtc2V0X2UtLkxtZW1zZXRfYwotCWFsdGluc3RydWN0aW9uX2VudHJ5IF9fbWVtc2V0LC5MbWVtc2V0X2NfZSxYODZfRkVBVFVSRV9FUk1TLCBcCi0JCQkgICAgIC5MZmluYWwtX19tZW1zZXQsLkxtZW1zZXRfZV9lLS5MbWVtc2V0X2NfZQotCS5wcmV2aW91cworRU5EUFJPQyhtZW1zZXRfb3JpZykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9tc3ItcmVnLlMgYi9hcmNoL3g4Ni9saWIvbXNyLXJlZy5TCmluZGV4IGY2ZDEzZWUuLjNjYTUyMTggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9tc3ItcmVnLlMKKysrIGIvYXJjaC94ODYvbGliL21zci1yZWcuUwpAQCAtMTQsOCArMTQsOCBAQAogLm1hY3JvIG9wX3NhZmVfcmVncyBvcAogRU5UUlkoXG9wXCgpX3NhZmVfcmVncykKIAlDRklfU1RBUlRQUk9DCi0JcHVzaHFfY2ZpICVyYngKLQlwdXNocV9jZmkgJXJicAorCXB1c2hxX2NmaV9yZWcgcmJ4CisJcHVzaHFfY2ZpX3JlZyByYnAKIAltb3ZxCSVyZGksICVyMTAJLyogU2F2ZSBwb2ludGVyICovCiAJeG9ybAklcjExZCwgJXIxMWQJLyogUmV0dXJuIHZhbHVlICovCiAJbW92bCAgICAoJXJkaSksICVlYXgKQEAgLTM1LDggKzM1LDggQEAKIAltb3ZsICAgICVlYnAsIDIwKCVyMTApCiAJbW92bCAgICAlZXNpLCAyNCglcjEwKQogCW1vdmwgICAgJWVkaSwgMjgoJXIxMCkKLQlwb3BxX2NmaSAlcmJwCi0JcG9wcV9jZmkgJXJieAorCXBvcHFfY2ZpX3JlZyByYnAKKwlwb3BxX2NmaV9yZWcgcmJ4CiAJcmV0CiAzOgogCUNGSV9SRVNUT1JFX1NUQVRFCkBAIC01MywxMCArNTMsMTAgQEAKIC5tYWNybyBvcF9zYWZlX3JlZ3Mgb3AKIEVOVFJZKFxvcFwoKV9zYWZlX3JlZ3MpCiAJQ0ZJX1NUQVJUUFJPQwotCXB1c2hsX2NmaSAlZWJ4Ci0JcHVzaGxfY2ZpICVlYnAKLQlwdXNobF9jZmkgJWVzaQotCXB1c2hsX2NmaSAlZWRpCisJcHVzaGxfY2ZpX3JlZyBlYngKKwlwdXNobF9jZmlfcmVnIGVicAorCXB1c2hsX2NmaV9yZWcgZXNpCisJcHVzaGxfY2ZpX3JlZyBlZGkKIAlwdXNobF9jZmkgJDAgICAgICAgICAgICAgIC8qIFJldHVybiB2YWx1ZSAqLwogCXB1c2hsX2NmaSAlZWF4CiAJbW92bCAgICA0KCVlYXgpLCAlZWN4CkBAIC04MCwxMCArODAsMTAgQEAKIAltb3ZsICAgICVlc2ksIDI0KCVlYXgpCiAJbW92bCAgICAlZWRpLCAyOCglZWF4KQogCXBvcGxfY2ZpICVlYXgKLQlwb3BsX2NmaSAlZWRpCi0JcG9wbF9jZmkgJWVzaQotCXBvcGxfY2ZpICVlYnAKLQlwb3BsX2NmaSAlZWJ4CisJcG9wbF9jZmlfcmVnIGVkaQorCXBvcGxfY2ZpX3JlZyBlc2kKKwlwb3BsX2NmaV9yZWcgZWJwCisJcG9wbF9jZmlfcmVnIGVieAogCXJldAogMzoKIAlDRklfUkVTVE9SRV9TVEFURQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL3J3c2VtLlMgYi9hcmNoL3g4Ni9saWIvcndzZW0uUwppbmRleCA1ZGZmNWYwLi4yMzIyYWJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvcndzZW0uUworKysgYi9hcmNoL3g4Ni9saWIvcndzZW0uUwpAQCAtMzQsMTAgKzM0LDEwIEBACiAgKi8KIAogI2RlZmluZSBzYXZlX2NvbW1vbl9yZWdzIFwKLQlwdXNobF9jZmkgJWVjeDsgQ0ZJX1JFTF9PRkZTRVQgZWN4LCAwCisJcHVzaGxfY2ZpX3JlZyBlY3gKIAogI2RlZmluZSByZXN0b3JlX2NvbW1vbl9yZWdzIFwKLQlwb3BsX2NmaSAlZWN4OyBDRklfUkVTVE9SRSBlY3gKKwlwb3BsX2NmaV9yZWcgZWN4CiAKIAkvKiBBdm9pZCB1Z2xpZnlpbmcgdGhlIGFyZ3VtZW50IGNvcHlpbmcgeDg2LTY0IG5lZWRzIHRvIGRvLiAqLwogCS5tYWNybyBtb3ZxIHNyYywgZHN0CkBAIC02NCwyMiArNjQsMjIgQEAKICAqLwogCiAjZGVmaW5lIHNhdmVfY29tbW9uX3JlZ3MgXAotCXB1c2hxX2NmaSAlcmRpOyBDRklfUkVMX09GRlNFVCByZGksIDA7IFwKLQlwdXNocV9jZmkgJXJzaTsgQ0ZJX1JFTF9PRkZTRVQgcnNpLCAwOyBcCi0JcHVzaHFfY2ZpICVyY3g7IENGSV9SRUxfT0ZGU0VUIHJjeCwgMDsgXAotCXB1c2hxX2NmaSAlcjg7ICBDRklfUkVMX09GRlNFVCByOCwgIDA7IFwKLQlwdXNocV9jZmkgJXI5OyAgQ0ZJX1JFTF9PRkZTRVQgcjksICAwOyBcCi0JcHVzaHFfY2ZpICVyMTA7IENGSV9SRUxfT0ZGU0VUIHIxMCwgMDsgXAotCXB1c2hxX2NmaSAlcjExOyBDRklfUkVMX09GRlNFVCByMTEsIDAKKwlwdXNocV9jZmlfcmVnIHJkaTsgXAorCXB1c2hxX2NmaV9yZWcgcnNpOyBcCisJcHVzaHFfY2ZpX3JlZyByY3g7IFwKKwlwdXNocV9jZmlfcmVnIHI4OyAgXAorCXB1c2hxX2NmaV9yZWcgcjk7ICBcCisJcHVzaHFfY2ZpX3JlZyByMTA7IFwKKwlwdXNocV9jZmlfcmVnIHIxMQogCiAjZGVmaW5lIHJlc3RvcmVfY29tbW9uX3JlZ3MgXAotCXBvcHFfY2ZpICVyMTE7IENGSV9SRVNUT1JFIHIxMTsgXAotCXBvcHFfY2ZpICVyMTA7IENGSV9SRVNUT1JFIHIxMDsgXAotCXBvcHFfY2ZpICVyOTsgIENGSV9SRVNUT1JFIHI5OyBcCi0JcG9wcV9jZmkgJXI4OyAgQ0ZJX1JFU1RPUkUgcjg7IFwKLQlwb3BxX2NmaSAlcmN4OyBDRklfUkVTVE9SRSByY3g7IFwKLQlwb3BxX2NmaSAlcnNpOyBDRklfUkVTVE9SRSByc2k7IFwKLQlwb3BxX2NmaSAlcmRpOyBDRklfUkVTVE9SRSByZGkKKwlwb3BxX2NmaV9yZWcgcjExOyBcCisJcG9wcV9jZmlfcmVnIHIxMDsgXAorCXBvcHFfY2ZpX3JlZyByOTsgXAorCXBvcHFfY2ZpX3JlZyByODsgXAorCXBvcHFfY2ZpX3JlZyByY3g7IFwKKwlwb3BxX2NmaV9yZWcgcnNpOyBcCisJcG9wcV9jZmlfcmVnIHJkaQogCiAjZW5kaWYKIApAQCAtODcsMTIgKzg3LDEwIEBACiBFTlRSWShjYWxsX3J3c2VtX2Rvd25fcmVhZF9mYWlsZWQpCiAJQ0ZJX1NUQVJUUFJPQwogCXNhdmVfY29tbW9uX3JlZ3MKLQlfX0FTTV9TSVpFKHB1c2gsX2NmaSkgJV9fQVNNX1JFRyhkeCkKLQlDRklfUkVMX09GRlNFVCBfX0FTTV9SRUcoZHgpLCAwCisJX19BU01fU0laRShwdXNoLF9jZmlfcmVnKSBfX0FTTV9SRUcoZHgpCiAJbW92cSAlcmF4LCVyZGkKIAljYWxsIHJ3c2VtX2Rvd25fcmVhZF9mYWlsZWQKLQlfX0FTTV9TSVpFKHBvcCxfY2ZpKSAlX19BU01fUkVHKGR4KQotCUNGSV9SRVNUT1JFIF9fQVNNX1JFRyhkeCkKKwlfX0FTTV9TSVpFKHBvcCxfY2ZpX3JlZykgX19BU01fUkVHKGR4KQogCXJlc3RvcmVfY29tbW9uX3JlZ3MKIAlyZXQKIAlDRklfRU5EUFJPQwpAQCAtMTI0LDEyICsxMjIsMTAgQEAKIEVOVFJZKGNhbGxfcndzZW1fZG93bmdyYWRlX3dha2UpCiAJQ0ZJX1NUQVJUUFJPQwogCXNhdmVfY29tbW9uX3JlZ3MKLQlfX0FTTV9TSVpFKHB1c2gsX2NmaSkgJV9fQVNNX1JFRyhkeCkKLQlDRklfUkVMX09GRlNFVCBfX0FTTV9SRUcoZHgpLCAwCisJX19BU01fU0laRShwdXNoLF9jZmlfcmVnKSBfX0FTTV9SRUcoZHgpCiAJbW92cSAlcmF4LCVyZGkKIAljYWxsIHJ3c2VtX2Rvd25ncmFkZV93YWtlCi0JX19BU01fU0laRShwb3AsX2NmaSkgJV9fQVNNX1JFRyhkeCkKLQlDRklfUkVTVE9SRSBfX0FTTV9SRUcoZHgpCisJX19BU01fU0laRShwb3AsX2NmaV9yZWcpIF9fQVNNX1JFRyhkeCkKIAlyZXN0b3JlX2NvbW1vbl9yZWdzCiAJcmV0CiAJQ0ZJX0VORFBST0MKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi90aHVua18zMi5TIGIvYXJjaC94ODYvbGliL3RodW5rXzMyLlMKaW5kZXggZTI4Y2RhZi4uNWViNzE1MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL3RodW5rXzMyLlMKKysrIGIvYXJjaC94ODYvbGliL3RodW5rXzMyLlMKQEAgLTEzLDEyICsxMyw5IEBACiAJLmdsb2JsIFxuYW1lCiBcbmFtZToKIAlDRklfU1RBUlRQUk9DCi0JcHVzaGxfY2ZpICVlYXgKLQlDRklfUkVMX09GRlNFVCBlYXgsIDAKLQlwdXNobF9jZmkgJWVjeAotCUNGSV9SRUxfT0ZGU0VUIGVjeCwgMAotCXB1c2hsX2NmaSAlZWR4Ci0JQ0ZJX1JFTF9PRkZTRVQgZWR4LCAwCisJcHVzaGxfY2ZpX3JlZyBlYXgKKwlwdXNobF9jZmlfcmVnIGVjeAorCXB1c2hsX2NmaV9yZWcgZWR4CiAKIAkuaWYgXHB1dF9yZXRfYWRkcl9pbl9lYXgKIAkvKiBQbGFjZSBFSVAgaW4gdGhlIGFyZzEgKi8KQEAgLTI2LDEyICsyMyw5IEBACiAJLmVuZGlmCiAKIAljYWxsIFxmdW5jCi0JcG9wbF9jZmkgJWVkeAotCUNGSV9SRVNUT1JFIGVkeAotCXBvcGxfY2ZpICVlY3gKLQlDRklfUkVTVE9SRSBlY3gKLQlwb3BsX2NmaSAlZWF4Ci0JQ0ZJX1JFU1RPUkUgZWF4CisJcG9wbF9jZmlfcmVnIGVkeAorCXBvcGxfY2ZpX3JlZyBlY3gKKwlwb3BsX2NmaV9yZWcgZWF4CiAJcmV0CiAJQ0ZJX0VORFBST0MKIAlfQVNNX05PS1BST0JFKFxuYW1lKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGliL3RodW5rXzY0LlMgYi9hcmNoL3g4Ni9saWIvdGh1bmtfNjQuUwppbmRleCBiMzBiNWViLi5mODliYTRlOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL3RodW5rXzY0LlMKKysrIGIvYXJjaC94ODYvbGliL3RodW5rXzY0LlMKQEAgLTE3LDkgKzE3LDE4IEBACiAJQ0ZJX1NUQVJUUFJPQwogCiAJLyogdGhpcyBvbmUgcHVzaGVzIDkgZWxlbXMsIHRoZSBuZXh0IG9uZSB3b3VsZCBiZSAlcklQICovCi0JU0FWRV9BUkdTCisJcHVzaHFfY2ZpX3JlZyByZGkKKwlwdXNocV9jZmlfcmVnIHJzaQorCXB1c2hxX2NmaV9yZWcgcmR4CisJcHVzaHFfY2ZpX3JlZyByY3gKKwlwdXNocV9jZmlfcmVnIHJheAorCXB1c2hxX2NmaV9yZWcgcjgKKwlwdXNocV9jZmlfcmVnIHI5CisJcHVzaHFfY2ZpX3JlZyByMTAKKwlwdXNocV9jZmlfcmVnIHIxMQogCiAJLmlmIFxwdXRfcmV0X2FkZHJfaW5fcmRpCisJLyogOSo4KCVyc3ApIGlzIHJldHVybiBhZGRyIG9uIHN0YWNrICovCiAJbW92cV9jZmlfcmVzdG9yZSA5KjgsIHJkaQogCS5lbmRpZgogCkBAIC00NSwxMSArNTQsMjIgQEAKICNlbmRpZgogI2VuZGlmCiAKLQkvKiBTQVZFX0FSR1MgYmVsb3cgaXMgdXNlZCBvbmx5IGZvciB0aGUgLmNmaSBkaXJlY3RpdmVzIGl0IGNvbnRhaW5zLiAqLworI2lmIGRlZmluZWQoQ09ORklHX1RSQUNFX0lSUUZMQUdTKSBcCisgfHwgZGVmaW5lZChDT05GSUdfREVCVUdfTE9DS19BTExPQykgXAorIHx8IGRlZmluZWQoQ09ORklHX1BSRUVNUFQpCiAJQ0ZJX1NUQVJUUFJPQwotCVNBVkVfQVJHUworCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCA5KjgKIHJlc3RvcmU6Ci0JUkVTVE9SRV9BUkdTCisJcG9wcV9jZmlfcmVnIHIxMQorCXBvcHFfY2ZpX3JlZyByMTAKKwlwb3BxX2NmaV9yZWcgcjkKKwlwb3BxX2NmaV9yZWcgcjgKKwlwb3BxX2NmaV9yZWcgcmF4CisJcG9wcV9jZmlfcmVnIHJjeAorCXBvcHFfY2ZpX3JlZyByZHgKKwlwb3BxX2NmaV9yZWcgcnNpCisJcG9wcV9jZmlfcmVnIHJkaQogCXJldAogCUNGSV9FTkRQUk9DCiAJX0FTTV9OT0tQUk9CRShyZXN0b3JlKQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvdXNlcmNvcHlfNjQuYyBiL2FyY2gveDg2L2xpYi91c2VyY29weV82NC5jCmluZGV4IGM5MDVlODkuLjFmMzNiM2QgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi91c2VyY29weV82NC5jCisrKyBiL2FyY2gveDg2L2xpYi91c2VyY29weV82NC5jCkBAIC02OSwyMSArNjksMjAgQEAKICAqIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gb3B0aW1pemUgdGFpbCBoYW5kbGluZy4KICAqLwogX192aXNpYmxlIHVuc2lnbmVkIGxvbmcKLWNvcHlfdXNlcl9oYW5kbGVfdGFpbChjaGFyICp0bywgY2hhciAqZnJvbSwgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCB6ZXJvcmVzdCkKK2NvcHlfdXNlcl9oYW5kbGVfdGFpbChjaGFyICp0bywgY2hhciAqZnJvbSwgdW5zaWduZWQgbGVuKQogewotCWNoYXIgYzsKLQl1bnNpZ25lZCB6ZXJvX2xlbjsKLQogCWZvciAoOyBsZW47IC0tbGVuLCB0bysrKSB7CisJCWNoYXIgYzsKKwogCQlpZiAoX19nZXRfdXNlcl9ub2NoZWNrKGMsIGZyb20rKywgc2l6ZW9mKGNoYXIpKSkKIAkJCWJyZWFrOwogCQlpZiAoX19wdXRfdXNlcl9ub2NoZWNrKGMsIHRvLCBzaXplb2YoY2hhcikpKQogCQkJYnJlYWs7CiAJfQotCi0JZm9yIChjID0gMCwgemVyb19sZW4gPSBsZW47IHplcm9yZXN0ICYmIHplcm9fbGVuOyAtLXplcm9fbGVuKQotCQlpZiAoX19wdXRfdXNlcl9ub2NoZWNrKGMsIHRvKyssIHNpemVvZihjaGFyKSkpCi0JCQlicmVhazsKIAljbGFjKCk7CisKKwkvKiBJZiB0aGUgZGVzdGluYXRpb24gaXMgYSBrZXJuZWwgYnVmZmVyLCB3ZSBhbHdheXMgY2xlYXIgdGhlIGVuZCAqLworCWlmICgodW5zaWduZWQgbG9uZyl0byA+PSBUQVNLX1NJWkVfTUFYKQorCQltZW1zZXQodG8sIDAsIGxlbik7CiAJcmV0dXJuIGxlbjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi94ODYtb3Bjb2RlLW1hcC50eHQgYi9hcmNoL3g4Ni9saWIveDg2LW9wY29kZS1tYXAudHh0CmluZGV4IDFhMmJlN2MuLjgxNjQ4OGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi94ODYtb3Bjb2RlLW1hcC50eHQKKysrIGIvYXJjaC94ODYvbGliL3g4Ni1vcGNvZGUtbWFwLnR4dApAQCAtMjczLDYgKzI3Myw5IEBACiBkZTogRVNDCiBkZjogRVNDCiAjIDB4ZTAgLSAweGVmCisjIE5vdGU6ICJmb3JjZWQ2NCIgaXMgSW50ZWwgQ1BVIGJlaGF2aW9yOiB0aGV5IGlnbm9yZSAweDY2IHByZWZpeAorIyBpbiA2NC1iaXQgbW9kZS4gQU1EIENQVXMgYWNjZXB0IDB4NjYgcHJlZml4LCBpdCBjYXVzZXMgUklQIHRydW5jYXRpb24KKyMgdG8gMTYgYml0cy4gSW4gMzItYml0IG1vZGUsIDB4NjYgaXMgYWNjZXB0ZWQgYnkgYm90aCBJbnRlbCBhbmQgQU1ELgogZTA6IExPT1BORS9MT09QTlogSmIgKGY2NCkKIGUxOiBMT09QRS9MT09QWiBKYiAoZjY0KQogZTI6IExPT1AgSmIgKGY2NCkKQEAgLTI4MSw2ICsyODQsMTAgQEAKIGU1OiBJTiBlQVgsSWIKIGU2OiBPVVQgSWIsQUwKIGU3OiBPVVQgSWIsZUFYCisjIFdpdGggMHg2NiBwcmVmaXggaW4gNjQtYml0IG1vZGUsIGZvciBBTUQgQ1BVcyBpbW1lZGlhdGUgb2Zmc2V0CisjIGluICJuZWFyIiBqdW1wcyBhbmQgY2FsbHMgaXMgMTYtYml0LiBGb3IgQ0FMTCwKKyMgcHVzaCBvZiByZXR1cm4gYWRkcmVzcyBpcyAxNi1iaXQgd2lkZSwgUlNQIGlzIGRlY3JlbWVudGVkIGJ5IDIKKyMgYnV0IGlzIG5vdCB0cnVuY2F0ZWQgdG8gMTYgYml0cywgdW5saWtlIFJJUC4KIGU4OiBDQUxMIEp6IChmNjQpCiBlOTogSk1QLW5lYXIgSnogKGY2NCkKIGVhOiBKTVAtZmFyIEFwIChpNjQpCkBAIC00NTYsNiArNDYzLDcgQEAKIDdlOiBtb3ZkL3EgRXksUGQgfCB2bW92ZC9xIEV5LFZ5ICg2NiksKHYxKSB8IHZtb3ZxIFZxLFdxIChGMyksKHYxKQogN2Y6IG1vdnEgUXEsUHEgfCB2bW92ZHFhIFd4LFZ4ICg2NikgfCB2bW92ZHF1IFd4LFZ4IChGMykKICMgMHgwZiAweDgwLTB4OGYKKyMgTm90ZTogImZvcmNlZDY0IiBpcyBJbnRlbCBDUFUgYmVoYXZpb3IgKHNlZSBjb21tZW50IGFib3V0IENBTEwgaW5zbikuCiA4MDogSk8gSnogKGY2NCkKIDgxOiBKTk8gSnogKGY2NCkKIDgyOiBKQi9KQy9KTkFFIEp6IChmNjQpCkBAIC04NDIsNiArODUwLDcgQEAKIEdycFRhYmxlOiBHcnA1CiAwOiBJTkMgRXYKIDE6IERFQyBFdgorIyBOb3RlOiAiZm9yY2VkNjQiIGlzIEludGVsIENQVSBiZWhhdmlvciAoc2VlIGNvbW1lbnQgYWJvdXQgQ0FMTCBpbnNuKS4KIDI6IENBTExOIEV2IChmNjQpCiAzOiBDQUxMRiBFcAogNDogSk1QTiBFdiAoZjY0KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vTWFrZWZpbGUgYi9hcmNoL3g4Ni9tbS9NYWtlZmlsZQppbmRleCBjNGNjNzQwLi5hNDgyZDEwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9tbS9NYWtlZmlsZQpAQCAtMzIsNiArMzIsNCBAQAogb2JqLSQoQ09ORklHX0FDUElfTlVNQSkJCSs9IHNyYXQubwogb2JqLSQoQ09ORklHX05VTUFfRU1VKQkJKz0gbnVtYV9lbXVsYXRpb24ubwogCi1vYmotJChDT05GSUdfTUVNVEVTVCkJCSs9IG1lbXRlc3QubwotCiBvYmotJChDT05GSUdfWDg2X0lOVEVMX01QWCkJKz0gbXB4Lm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2ZhdWx0LmMgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCmluZGV4IGVkZTAyNWYuLjE4MWM1M2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2ZhdWx0LmMKKysrIGIvYXJjaC94ODYvbW0vZmF1bHQuYwpAQCAtNTksNyArNTksNyBAQAogCWludCByZXQgPSAwOwogCiAJLyoga3Byb2JlX3J1bm5pbmcoKSBuZWVkcyBzbXBfcHJvY2Vzc29yX2lkKCkgKi8KLQlpZiAoa3Byb2Jlc19idWlsdF9pbigpICYmICF1c2VyX21vZGVfdm0ocmVncykpIHsKKwlpZiAoa3Byb2Jlc19idWlsdF9pbigpICYmICF1c2VyX21vZGUocmVncykpIHsKIAkJcHJlZW1wdF9kaXNhYmxlKCk7CiAJCWlmIChrcHJvYmVfcnVubmluZygpICYmIGtwcm9iZV9mYXVsdF9oYW5kbGVyKHJlZ3MsIDE0KSkKIAkJCXJldCA9IDE7CkBAIC0xNDgsNyArMTQ4LDcgQEAKIAlpbnN0ciA9ICh2b2lkICopY29udmVydF9pcF90b19saW5lYXIoY3VycmVudCwgcmVncyk7CiAJbWF4X2luc3RyID0gaW5zdHIgKyAxNTsKIAotCWlmICh1c2VyX21vZGUocmVncykgJiYgaW5zdHIgPj0gKHVuc2lnbmVkIGNoYXIgKilUQVNLX1NJWkUpCisJaWYgKHVzZXJfbW9kZShyZWdzKSAmJiBpbnN0ciA+PSAodW5zaWduZWQgY2hhciAqKVRBU0tfU0laRV9NQVgpCiAJCXJldHVybiAwOwogCiAJd2hpbGUgKGluc3RyIDwgbWF4X2luc3RyKSB7CkBAIC0xMDM1LDcgKzEwMzUsNyBAQAogCWlmIChlcnJvcl9jb2RlICYgUEZfVVNFUikKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKCF1c2VyX21vZGVfdm0ocmVncykgJiYgKHJlZ3MtPmZsYWdzICYgWDg2X0VGTEFHU19BQykpCisJaWYgKCF1c2VyX21vZGUocmVncykgJiYgKHJlZ3MtPmZsYWdzICYgWDg2X0VGTEFHU19BQykpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiB0cnVlOwpAQCAtMTE0MCw3ICsxMTQwLDcgQEAKIAkgKiBVc2VyLW1vZGUgcmVnaXN0ZXJzIGNvdW50IGFzIGEgdXNlciBhY2Nlc3MgZXZlbiBmb3IgYW55CiAJICogcG90ZW50aWFsIHN5c3RlbSBmYXVsdCBvciBDUFUgYnVnbGV0OgogCSAqLwotCWlmICh1c2VyX21vZGVfdm0ocmVncykpIHsKKwlpZiAodXNlcl9tb2RlKHJlZ3MpKSB7CiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJZXJyb3JfY29kZSB8PSBQRl9VU0VSOwogCQlmbGFncyB8PSBGQVVMVF9GTEFHX1VTRVI7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pbml0LmMgYi9hcmNoL3g4Ni9tbS9pbml0LmMKaW5kZXggYTExMGVmYy4uMWQ1NTMxOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdC5jCisrKyBiL2FyY2gveDg2L21tL2luaXQuYwpAQCAtMjksMjkgKzI5LDMzIEBACiAKIC8qCiAgKiBUYWJsZXMgdHJhbnNsYXRpbmcgYmV0d2VlbiBwYWdlX2NhY2hlX3R5cGVfdCBhbmQgcHRlIGVuY29kaW5nLgotICogTWluaW1hbCBzdXBwb3J0ZWQgbW9kZXMgYXJlIGRlZmluZWQgc3RhdGljYWxseSwgbW9kaWZpZWQgaWYgbW9yZSBzdXBwb3J0ZWQKLSAqIGNhY2hlIG1vZGVzIGFyZSBhdmFpbGFibGUuCi0gKiBJbmRleCBpbnRvIF9fY2FjaGVtb2RlMnB0ZV90YmwgaXMgdGhlIGNhY2hlbW9kZS4KLSAqIEluZGV4IGludG8gX19wdGUyY2FjaGVtb2RlX3RibCBhcmUgdGhlIGNhY2hpbmcgYXR0cmlidXRlIGJpdHMgb2YgdGhlIHB0ZQotICogKF9QQUdFX1BXVCwgX1BBR0VfUENELCBfUEFHRV9QQVQpIGF0IGluZGV4IGJpdCBwb3NpdGlvbnMgMCwgMSwgMi4KKyAqCisgKiBNaW5pbWFsIHN1cHBvcnRlZCBtb2RlcyBhcmUgZGVmaW5lZCBzdGF0aWNhbGx5LCB0aGV5IGFyZSBtb2RpZmllZAorICogZHVyaW5nIGJvb3R1cCBpZiBtb3JlIHN1cHBvcnRlZCBjYWNoZSBtb2RlcyBhcmUgYXZhaWxhYmxlLgorICoKKyAqICAgSW5kZXggaW50byBfX2NhY2hlbW9kZTJwdGVfdGJsW10gaXMgdGhlIGNhY2hlbW9kZS4KKyAqCisgKiAgIEluZGV4IGludG8gX19wdGUyY2FjaGVtb2RlX3RibFtdIGFyZSB0aGUgY2FjaGluZyBhdHRyaWJ1dGUgYml0cyBvZiB0aGUgcHRlCisgKiAgIChfUEFHRV9QV1QsIF9QQUdFX1BDRCwgX1BBR0VfUEFUKSBhdCBpbmRleCBiaXQgcG9zaXRpb25zIDAsIDEsIDIuCiAgKi8KIHVpbnQxNl90IF9fY2FjaGVtb2RlMnB0ZV90YmxbX1BBR0VfQ0FDSEVfTU9ERV9OVU1dID0gewotCVtfUEFHRV9DQUNIRV9NT0RFX1dCXQkJPSAwLAotCVtfUEFHRV9DQUNIRV9NT0RFX1dDXQkJPSBfUEFHRV9QV1QsCi0JW19QQUdFX0NBQ0hFX01PREVfVUNfTUlOVVNdCT0gX1BBR0VfUENELAotCVtfUEFHRV9DQUNIRV9NT0RFX1VDXQkJPSBfUEFHRV9QQ0QgfCBfUEFHRV9QV1QsCi0JW19QQUdFX0NBQ0hFX01PREVfV1RdCQk9IF9QQUdFX1BDRCwKLQlbX1BBR0VfQ0FDSEVfTU9ERV9XUF0JCT0gX1BBR0VfUENELAorCVtfUEFHRV9DQUNIRV9NT0RFX1dCICAgICAgXQk9IDAgICAgICAgICB8IDAgICAgICAgICwKKwlbX1BBR0VfQ0FDSEVfTU9ERV9XQyAgICAgIF0JPSBfUEFHRV9QV1QgfCAwICAgICAgICAsCisJW19QQUdFX0NBQ0hFX01PREVfVUNfTUlOVVNdCT0gMCAgICAgICAgIHwgX1BBR0VfUENELAorCVtfUEFHRV9DQUNIRV9NT0RFX1VDICAgICAgXQk9IF9QQUdFX1BXVCB8IF9QQUdFX1BDRCwKKwlbX1BBR0VfQ0FDSEVfTU9ERV9XVCAgICAgIF0JPSAwICAgICAgICAgfCBfUEFHRV9QQ0QsCisJW19QQUdFX0NBQ0hFX01PREVfV1AgICAgICBdCT0gMCAgICAgICAgIHwgX1BBR0VfUENELAogfTsKIEVYUE9SVF9TWU1CT0woX19jYWNoZW1vZGUycHRlX3RibCk7CisKIHVpbnQ4X3QgX19wdGUyY2FjaGVtb2RlX3RibFs4XSA9IHsKLQlbX19wdGUyY21faWR4KDApXSA9IF9QQUdFX0NBQ0hFX01PREVfV0IsCi0JW19fcHRlMmNtX2lkeChfUEFHRV9QV1QpXSA9IF9QQUdFX0NBQ0hFX01PREVfV0MsCi0JW19fcHRlMmNtX2lkeChfUEFHRV9QQ0QpXSA9IF9QQUdFX0NBQ0hFX01PREVfVUNfTUlOVVMsCi0JW19fcHRlMmNtX2lkeChfUEFHRV9QV1QgfCBfUEFHRV9QQ0QpXSA9IF9QQUdFX0NBQ0hFX01PREVfVUMsCi0JW19fcHRlMmNtX2lkeChfUEFHRV9QQVQpXSA9IF9QQUdFX0NBQ0hFX01PREVfV0IsCi0JW19fcHRlMmNtX2lkeChfUEFHRV9QV1QgfCBfUEFHRV9QQVQpXSA9IF9QQUdFX0NBQ0hFX01PREVfV0MsCi0JW19fcHRlMmNtX2lkeChfUEFHRV9QQ0QgfCBfUEFHRV9QQVQpXSA9IF9QQUdFX0NBQ0hFX01PREVfVUNfTUlOVVMsCisJW19fcHRlMmNtX2lkeCggMCAgICAgICAgfCAwICAgICAgICAgfCAwICAgICAgICApXSA9IF9QQUdFX0NBQ0hFX01PREVfV0IsCisJW19fcHRlMmNtX2lkeChfUEFHRV9QV1QgfCAwICAgICAgICAgfCAwICAgICAgICApXSA9IF9QQUdFX0NBQ0hFX01PREVfV0MsCisJW19fcHRlMmNtX2lkeCggMCAgICAgICAgfCBfUEFHRV9QQ0QgfCAwICAgICAgICApXSA9IF9QQUdFX0NBQ0hFX01PREVfVUNfTUlOVVMsCisJW19fcHRlMmNtX2lkeChfUEFHRV9QV1QgfCBfUEFHRV9QQ0QgfCAwICAgICAgICApXSA9IF9QQUdFX0NBQ0hFX01PREVfVUMsCisJW19fcHRlMmNtX2lkeCggMCAgICAgICAgfCAwICAgICAgICAgfCBfUEFHRV9QQVQpXSA9IF9QQUdFX0NBQ0hFX01PREVfV0IsCisJW19fcHRlMmNtX2lkeChfUEFHRV9QV1QgfCAwICAgICAgICAgfCBfUEFHRV9QQVQpXSA9IF9QQUdFX0NBQ0hFX01PREVfV0MsCisJW19fcHRlMmNtX2lkeCgwICAgICAgICAgfCBfUEFHRV9QQ0QgfCBfUEFHRV9QQVQpXSA9IF9QQUdFX0NBQ0hFX01PREVfVUNfTUlOVVMsCiAJW19fcHRlMmNtX2lkeChfUEFHRV9QV1QgfCBfUEFHRV9QQ0QgfCBfUEFHRV9QQVQpXSA9IF9QQUdFX0NBQ0hFX01PREVfVUMsCiB9OwogRVhQT1JUX1NZTUJPTChfX3B0ZTJjYWNoZW1vZGVfdGJsKTsKQEAgLTEzMSwyMSArMTM1LDcgQEAKIAogaW50IGFmdGVyX2Jvb3RtZW07CiAKLWludCBkaXJlY3RfZ2JwYWdlcwotI2lmZGVmIENPTkZJR19ESVJFQ1RfR0JQQUdFUwotCQkJCT0gMQotI2VuZGlmCi07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBpbml0X2dicGFnZXModm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JaWYgKGRpcmVjdF9nYnBhZ2VzICYmIGNwdV9oYXNfZ2JwYWdlcykKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgR0IgcGFnZXMgZm9yIGRpcmVjdCBtYXBwaW5nXG4iKTsKLQllbHNlCi0JCWRpcmVjdF9nYnBhZ2VzID0gMDsKLSNlbmRpZgotfQorZWFybHlfcGFyYW1fb25fb2ZmKCJnYnBhZ2VzIiwgIm5vZ2JwYWdlcyIsIGRpcmVjdF9nYnBhZ2VzLCBDT05GSUdfWDg2X0RJUkVDVF9HQlBBR0VTKTsKIAogc3RydWN0IG1hcF9yYW5nZSB7CiAJdW5zaWduZWQgbG9uZyBzdGFydDsKQEAgLTE1NywxNiArMTQ3LDEyIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBwcm9iZV9wYWdlX3NpemVfbWFzayh2b2lkKQogewotCWluaXRfZ2JwYWdlcygpOwotCiAjaWYgIWRlZmluZWQoQ09ORklHX0RFQlVHX1BBR0VBTExPQykgJiYgIWRlZmluZWQoQ09ORklHX0tNRU1DSEVDSykKIAkvKgogCSAqIEZvciBDT05GSUdfREVCVUdfUEFHRUFMTE9DLCBpZGVudGl0eSBtYXBwaW5nIHdpbGwgdXNlIHNtYWxsIHBhZ2VzLgogCSAqIFRoaXMgd2lsbCBzaW1wbGlmeSBjcGEoKSwgd2hpY2ggb3RoZXJ3aXNlIG5lZWRzIHRvIHN1cHBvcnQgc3BsaXR0aW5nCiAJICogbGFyZ2UgcGFnZXMgaW50byBzbWFsbCBpbiBpbnRlcnJ1cHQgY29udGV4dCwgZXRjLgogCSAqLwotCWlmIChkaXJlY3RfZ2JwYWdlcykKLQkJcGFnZV9zaXplX21hc2sgfD0gMSA8PCBQR19MRVZFTF8xRzsKIAlpZiAoY3B1X2hhc19wc2UpCiAJCXBhZ2Vfc2l6ZV9tYXNrIHw9IDEgPDwgUEdfTEVWRUxfMk07CiAjZW5kaWYKQEAgLTE3OSw2ICsxNjUsMTUgQEAKIAlpZiAoY3B1X2hhc19wZ2UpIHsKIAkJY3I0X3NldF9iaXRzX2FuZF91cGRhdGVfYm9vdChYODZfQ1I0X1BHRSk7CiAJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrIHw9IF9QQUdFX0dMT0JBTDsKKwl9IGVsc2UKKwkJX19zdXBwb3J0ZWRfcHRlX21hc2sgJj0gfl9QQUdFX0dMT0JBTDsKKworCS8qIEVuYWJsZSAxIEdCIGxpbmVhciBrZXJuZWwgbWFwcGluZ3MgaWYgYXZhaWxhYmxlOiAqLworCWlmIChkaXJlY3RfZ2JwYWdlcyAmJiBjcHVfaGFzX2dicGFnZXMpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiVXNpbmcgR0IgcGFnZXMgZm9yIGRpcmVjdCBtYXBwaW5nXG4iKTsKKwkJcGFnZV9zaXplX21hc2sgfD0gMSA8PCBQR19MRVZFTF8xRzsKKwl9IGVsc2UgeworCQlkaXJlY3RfZ2JwYWdlcyA9IDA7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9pbml0XzY0LmMgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKaW5kZXggMzBlYjA1YS4uM2ZiYTYyMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gveDg2L21tL2luaXRfNjQuYwpAQCAtMTMwLDIwICsxMzAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV9kaXJlY3RfZ2JwYWdlc19vZmYoY2hhciAqYXJnKQotewotCWRpcmVjdF9nYnBhZ2VzID0gMDsKLQlyZXR1cm4gMDsKLX0KLWVhcmx5X3BhcmFtKCJub2dicGFnZXMiLCBwYXJzZV9kaXJlY3RfZ2JwYWdlc19vZmYpOwotCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV9kaXJlY3RfZ2JwYWdlc19vbihjaGFyICphcmcpCi17Ci0JZGlyZWN0X2dicGFnZXMgPSAxOwotCXJldHVybiAwOwotfQotZWFybHlfcGFyYW0oImdicGFnZXMiLCBwYXJzZV9kaXJlY3RfZ2JwYWdlc19vbik7Ci0KIC8qCiAgKiBOT1RFOiBwYWdldGFibGVfaW5pdCBhbGxvYyBhbGwgdGhlIGZpeG1hcCBwYWdldGFibGVzIGNvbnRpZ3VvdXMgb24gdGhlCiAgKiBwaHlzaWNhbCBzcGFjZSBzbyB3ZSBjYW4gY2FjaGUgdGhlIHBsYWNlIG9mIHRoZSBmaXJzdCBvbmUgYW5kIG1vdmUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2lvcmVtYXAuYyBiL2FyY2gveDg2L21tL2lvcmVtYXAuYwppbmRleCBmZGY2MTdjLi41ZWFkNGQ2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC94ODYvbW0vaW9yZW1hcC5jCkBAIC02Nyw4ICs2NywxMyBAQAogCiAvKgogICogUmVtYXAgYW4gYXJiaXRyYXJ5IHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgaW50byB0aGUga2VybmVsIHZpcnR1YWwKLSAqIGFkZHJlc3Mgc3BhY2UuIE5lZWRlZCB3aGVuIHRoZSBrZXJuZWwgd2FudHMgdG8gYWNjZXNzIGhpZ2ggYWRkcmVzc2VzCi0gKiBkaXJlY3RseS4KKyAqIGFkZHJlc3Mgc3BhY2UuIEl0IHRyYW5zcGFyZW50bHkgY3JlYXRlcyBrZXJuZWwgaHVnZSBJL08gbWFwcGluZyB3aGVuCisgKiB0aGUgcGh5c2ljYWwgYWRkcmVzcyBpcyBhbGlnbmVkIGJ5IGEgaHVnZSBwYWdlIHNpemUgKDFHQiBvciAyTUIpIGFuZAorICogdGhlIHJlcXVlc3RlZCBzaXplIGlzIGF0IGxlYXN0IHRoZSBodWdlIHBhZ2Ugc2l6ZS4KKyAqCisgKiBOT1RFOiBNVFJScyBjYW4gb3ZlcnJpZGUgUEFUIG1lbW9yeSB0eXBlcyB3aXRoIGEgNEtCIGdyYW51bGFyaXR5LgorICogVGhlcmVmb3JlLCB0aGUgbWFwcGluZyBjb2RlIGZhbGxzIGJhY2sgdG8gdXNlIGEgc21hbGxlciBwYWdlIHRvd2FyZCA0S0IKKyAqIHdoZW4gYSBtYXBwaW5nIHJhbmdlIGlzIGNvdmVyZWQgYnkgbm9uLVdCIHR5cGUgb2YgTVRSUnMuCiAgKgogICogTk9URSEgV2UgbmVlZCB0byBhbGxvdyBub24tcGFnZS1hbGlnbmVkIG1hcHBpbmdzIHRvbzogd2Ugd2lsbCBvYnZpb3VzbHkKICAqIGhhdmUgdG8gY29udmVydCB0aGVtIGludG8gYW4gb2Zmc2V0IGluIGEgcGFnZS1hbGlnbmVkIG1hcHBpbmcsIGJ1dCB0aGUKQEAgLTMyNiw2ICszMzEsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0woaW91bm1hcCk7CiAKK2ludCBhcmNoX2lvcmVtYXBfcHVkX3N1cHBvcnRlZCh2b2lkKQoreworI2lmZGVmIENPTkZJR19YODZfNjQKKwlyZXR1cm4gY3B1X2hhc19nYnBhZ2VzOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQgYXJjaF9pb3JlbWFwX3BtZF9zdXBwb3J0ZWQodm9pZCkKK3sKKwlyZXR1cm4gY3B1X2hhc19wc2U7Cit9CisKIC8qCiAgKiBDb252ZXJ0IGEgcGh5c2ljYWwgcG9pbnRlciB0byBhIHZpcnR1YWwga2VybmVsIHBvaW50ZXIgZm9yIC9kZXYvbWVtCiAgKiBhY2Nlc3MKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL21lbXRlc3QuYyBiL2FyY2gveDg2L21tL21lbXRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU5ZGE3OS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9tbS9tZW10ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wZm4uaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgotCi1zdGF0aWMgdTY0IHBhdHRlcm5zW10gX19pbml0ZGF0YSA9IHsKLQkvKiBUaGUgZmlyc3QgZW50cnkgaGFzIHRvIGJlIDAgdG8gbGVhdmUgbWVtdGVzdCB3aXRoIHplcm9lZCBtZW1vcnkgKi8KLQkwLAotCTB4ZmZmZmZmZmZmZmZmZmZmZlVMTCwKLQkweDU1NTU1NTU1NTU1NTU1NTVVTEwsCi0JMHhhYWFhYWFhYWFhYWFhYWFhVUxMLAotCTB4MTExMTExMTExMTExMTExMVVMTCwKLQkweDIyMjIyMjIyMjIyMjIyMjJVTEwsCi0JMHg0NDQ0NDQ0NDQ0NDQ0NDQ0VUxMLAotCTB4ODg4ODg4ODg4ODg4ODg4OFVMTCwKLQkweDMzMzMzMzMzMzMzMzMzMzNVTEwsCi0JMHg2NjY2NjY2NjY2NjY2NjY2VUxMLAotCTB4OTk5OTk5OTk5OTk5OTk5OVVMTCwKLQkweGNjY2NjY2NjY2NjY2NjY2NVTEwsCi0JMHg3Nzc3Nzc3Nzc3Nzc3Nzc3VUxMLAotCTB4YmJiYmJiYmJiYmJiYmJiYlVMTCwKLQkweGRkZGRkZGRkZGRkZGRkZGRVTEwsCi0JMHhlZWVlZWVlZWVlZWVlZWVlVUxMLAotCTB4N2E2YzcyNTg1NTRlNDk0Y1VMTCwgLyogeWVhaCA7LSkgKi8KLX07Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCByZXNlcnZlX2JhZF9tZW0odTY0IHBhdHRlcm4sIHU2NCBzdGFydF9iYWQsIHU2NCBlbmRfYmFkKQotewotCXByaW50ayhLRVJOX0lORk8gIiAgJTAxNmxseCBiYWQgbWVtIGFkZHIgJTAxMGxseCAtICUwMTBsbHggcmVzZXJ2ZWRcbiIsCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBhdHRlcm4sCi0JICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXJ0X2JhZCwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZW5kX2JhZCk7Ci0JbWVtYmxvY2tfcmVzZXJ2ZShzdGFydF9iYWQsIGVuZF9iYWQgLSBzdGFydF9iYWQpOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgbWVtdGVzdCh1NjQgcGF0dGVybiwgdTY0IHN0YXJ0X3BoeXMsIHU2NCBzaXplKQotewotCXU2NCAqcCwgKnN0YXJ0LCAqZW5kOwotCXU2NCBzdGFydF9iYWQsIGxhc3RfYmFkOwotCXU2NCBzdGFydF9waHlzX2FsaWduZWQ7Ci0JY29uc3Qgc2l6ZV90IGluY3IgPSBzaXplb2YocGF0dGVybik7Ci0KLQlzdGFydF9waHlzX2FsaWduZWQgPSBBTElHTihzdGFydF9waHlzLCBpbmNyKTsKLQlzdGFydCA9IF9fdmEoc3RhcnRfcGh5c19hbGlnbmVkKTsKLQllbmQgPSBzdGFydCArIChzaXplIC0gKHN0YXJ0X3BoeXNfYWxpZ25lZCAtIHN0YXJ0X3BoeXMpKSAvIGluY3I7Ci0Jc3RhcnRfYmFkID0gMDsKLQlsYXN0X2JhZCA9IDA7Ci0KLQlmb3IgKHAgPSBzdGFydDsgcCA8IGVuZDsgcCsrKQotCQkqcCA9IHBhdHRlcm47Ci0KLQlmb3IgKHAgPSBzdGFydDsgcCA8IGVuZDsgcCsrLCBzdGFydF9waHlzX2FsaWduZWQgKz0gaW5jcikgewotCQlpZiAoKnAgPT0gcGF0dGVybikKLQkJCWNvbnRpbnVlOwotCQlpZiAoc3RhcnRfcGh5c19hbGlnbmVkID09IGxhc3RfYmFkICsgaW5jcikgewotCQkJbGFzdF9iYWQgKz0gaW5jcjsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChzdGFydF9iYWQpCi0JCQlyZXNlcnZlX2JhZF9tZW0ocGF0dGVybiwgc3RhcnRfYmFkLCBsYXN0X2JhZCArIGluY3IpOwotCQlzdGFydF9iYWQgPSBsYXN0X2JhZCA9IHN0YXJ0X3BoeXNfYWxpZ25lZDsKLQl9Ci0JaWYgKHN0YXJ0X2JhZCkKLQkJcmVzZXJ2ZV9iYWRfbWVtKHBhdHRlcm4sIHN0YXJ0X2JhZCwgbGFzdF9iYWQgKyBpbmNyKTsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IGRvX29uZV9wYXNzKHU2NCBwYXR0ZXJuLCB1NjQgc3RhcnQsIHU2NCBlbmQpCi17Ci0JdTY0IGk7Ci0JcGh5c19hZGRyX3QgdGhpc19zdGFydCwgdGhpc19lbmQ7Ci0KLQlmb3JfZWFjaF9mcmVlX21lbV9yYW5nZShpLCBOVU1BX05PX05PREUsICZ0aGlzX3N0YXJ0LCAmdGhpc19lbmQsIE5VTEwpIHsKLQkJdGhpc19zdGFydCA9IGNsYW1wX3QocGh5c19hZGRyX3QsIHRoaXNfc3RhcnQsIHN0YXJ0LCBlbmQpOwotCQl0aGlzX2VuZCA9IGNsYW1wX3QocGh5c19hZGRyX3QsIHRoaXNfZW5kLCBzdGFydCwgZW5kKTsKLQkJaWYgKHRoaXNfc3RhcnQgPCB0aGlzX2VuZCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiICAlMDEwbGx4IC0gJTAxMGxseCBwYXR0ZXJuICUwMTZsbHhcbiIsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0aGlzX3N0YXJ0LAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdGhpc19lbmQsCi0JCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyljcHVfdG9fYmU2NChwYXR0ZXJuKSk7Ci0JCQltZW10ZXN0KHBhdHRlcm4sIHRoaXNfc3RhcnQsIHRoaXNfZW5kIC0gdGhpc19zdGFydCk7Ci0JCX0KLQl9Ci19Ci0KLS8qIGRlZmF1bHQgaXMgZGlzYWJsZWQgKi8KLXN0YXRpYyBpbnQgbWVtdGVzdF9wYXR0ZXJuIF9faW5pdGRhdGE7Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX21lbXRlc3QoY2hhciAqYXJnKQotewotCWlmIChhcmcpCi0JCW1lbXRlc3RfcGF0dGVybiA9IHNpbXBsZV9zdHJ0b3VsKGFyZywgTlVMTCwgMCk7Ci0JZWxzZQotCQltZW10ZXN0X3BhdHRlcm4gPSBBUlJBWV9TSVpFKHBhdHRlcm5zKTsKLQotCXJldHVybiAwOwotfQotCi1lYXJseV9wYXJhbSgibWVtdGVzdCIsIHBhcnNlX21lbXRlc3QpOwotCi12b2lkIF9faW5pdCBlYXJseV9tZW10ZXN0KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQotewotCXVuc2lnbmVkIGludCBpOwotCXVuc2lnbmVkIGludCBpZHggPSAwOwotCi0JaWYgKCFtZW10ZXN0X3BhdHRlcm4pCi0JCXJldHVybjsKLQotCXByaW50ayhLRVJOX0lORk8gImVhcmx5X21lbXRlc3Q6ICMgb2YgdGVzdHM6ICVkXG4iLCBtZW10ZXN0X3BhdHRlcm4pOwotCWZvciAoaSA9IG1lbXRlc3RfcGF0dGVybi0xOyBpIDwgVUlOVF9NQVg7IC0taSkgewotCQlpZHggPSBpICUgQVJSQVlfU0laRShwYXR0ZXJucyk7Ci0JCWRvX29uZV9wYXNzKHBhdHRlcm5zW2lkeF0sIHN0YXJ0LCBlbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL21tYXAuYyBiL2FyY2gveDg2L21tL21tYXAuYwppbmRleCBkZjQ1NTJiLi45ZDUxOGQ2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9tbWFwLmMKKysrIGIvYXJjaC94ODYvbW0vbW1hcC5jCkBAIC02NSwyNCArNjUsMjMgQEAKIAlyZXR1cm4gc3lzY3RsX2xlZ2FjeV92YV9sYXlvdXQ7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIG1tYXBfcm5kKHZvaWQpCit1bnNpZ25lZCBsb25nIGFyY2hfbW1hcF9ybmQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIHJuZCA9IDA7CisJdW5zaWduZWQgbG9uZyBybmQ7CiAKIAkvKgotCSogIDggYml0cyBvZiByYW5kb21uZXNzIGluIDMyYml0IG1tYXBzLCAyMCBhZGRyZXNzIHNwYWNlIGJpdHMKLQkqIDI4IGJpdHMgb2YgcmFuZG9tbmVzcyBpbiA2NGJpdCBtbWFwcywgNDAgYWRkcmVzcyBzcGFjZSBiaXRzCi0JKi8KLQlpZiAoY3VycmVudC0+ZmxhZ3MgJiBQRl9SQU5ET01JWkUpIHsKLQkJaWYgKG1tYXBfaXNfaWEzMigpKQotCQkJcm5kID0gZ2V0X3JhbmRvbV9pbnQoKSAlICgxPDw4KTsKLQkJZWxzZQotCQkJcm5kID0gZ2V0X3JhbmRvbV9pbnQoKSAlICgxPDwyOCk7Ci0JfQorCSAqICA4IGJpdHMgb2YgcmFuZG9tbmVzcyBpbiAzMmJpdCBtbWFwcywgMjAgYWRkcmVzcyBzcGFjZSBiaXRzCisJICogMjggYml0cyBvZiByYW5kb21uZXNzIGluIDY0Yml0IG1tYXBzLCA0MCBhZGRyZXNzIHNwYWNlIGJpdHMKKwkgKi8KKwlpZiAobW1hcF9pc19pYTMyKCkpCisJCXJuZCA9ICh1bnNpZ25lZCBsb25nKWdldF9yYW5kb21faW50KCkgJSAoMTw8OCk7CisJZWxzZQorCQlybmQgPSAodW5zaWduZWQgbG9uZylnZXRfcmFuZG9tX2ludCgpICUgKDE8PDI4KTsKKwogCXJldHVybiBybmQgPDwgUEFHRV9TSElGVDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgbW1hcF9iYXNlKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtbWFwX2Jhc2UodW5zaWduZWQgbG9uZyBybmQpCiB7CiAJdW5zaWduZWQgbG9uZyBnYXAgPSBybGltaXQoUkxJTUlUX1NUQUNLKTsKIApAQCAtOTEsMTkgKzkwLDE5IEBACiAJZWxzZSBpZiAoZ2FwID4gTUFYX0dBUCkKIAkJZ2FwID0gTUFYX0dBUDsKIAotCXJldHVybiBQQUdFX0FMSUdOKFRBU0tfU0laRSAtIGdhcCAtIG1tYXBfcm5kKCkpOworCXJldHVybiBQQUdFX0FMSUdOKFRBU0tfU0laRSAtIGdhcCAtIHJuZCk7CiB9CiAKIC8qCiAgKiBCb3R0b20tdXAgKGxlZ2FjeSkgbGF5b3V0IG9uIFg4Nl8zMiBkaWQgbm90IHN1cHBvcnQgcmFuZG9taXphdGlvbiwgWDg2XzY0CiAgKiBkb2VzLCBidXQgbm90IHdoZW4gZW11bGF0aW5nIFg4Nl8zMgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBtbWFwX2xlZ2FjeV9iYXNlKHZvaWQpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtbWFwX2xlZ2FjeV9iYXNlKHVuc2lnbmVkIGxvbmcgcm5kKQogewogCWlmIChtbWFwX2lzX2lhMzIoKSkKIAkJcmV0dXJuIFRBU0tfVU5NQVBQRURfQkFTRTsKIAllbHNlCi0JCXJldHVybiBUQVNLX1VOTUFQUEVEX0JBU0UgKyBtbWFwX3JuZCgpOworCQlyZXR1cm4gVEFTS19VTk1BUFBFRF9CQVNFICsgcm5kOwogfQogCiAvKgpAQCAtMTEyLDEzICsxMTEsMTggQEAKICAqLwogdm9pZCBhcmNoX3BpY2tfbW1hcF9sYXlvdXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JbW0tPm1tYXBfbGVnYWN5X2Jhc2UgPSBtbWFwX2xlZ2FjeV9iYXNlKCk7Ci0JbW0tPm1tYXBfYmFzZSA9IG1tYXBfYmFzZSgpOworCXVuc2lnbmVkIGxvbmcgcmFuZG9tX2ZhY3RvciA9IDBVTDsKKworCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkKKwkJcmFuZG9tX2ZhY3RvciA9IGFyY2hfbW1hcF9ybmQoKTsKKworCW1tLT5tbWFwX2xlZ2FjeV9iYXNlID0gbW1hcF9sZWdhY3lfYmFzZShyYW5kb21fZmFjdG9yKTsKIAogCWlmIChtbWFwX2lzX2xlZ2FjeSgpKSB7CiAJCW1tLT5tbWFwX2Jhc2UgPSBtbS0+bW1hcF9sZWdhY3lfYmFzZTsKIAkJbW0tPmdldF91bm1hcHBlZF9hcmVhID0gYXJjaF9nZXRfdW5tYXBwZWRfYXJlYTsKIAl9IGVsc2UgeworCQltbS0+bW1hcF9iYXNlID0gbW1hcF9iYXNlKHJhbmRvbV9mYWN0b3IpOwogCQltbS0+Z2V0X3VubWFwcGVkX2FyZWEgPSBhcmNoX2dldF91bm1hcHBlZF9hcmVhX3RvcGRvd247CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vbnVtYS5jIGIvYXJjaC94ODYvbW0vbnVtYS5jCmluZGV4IGNkNDc4NWIuLjQwNTNiYjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL251bWEuYworKysgYi9hcmNoL3g4Ni9tbS9udW1hLmMKQEAgLTQ4Miw5ICs0ODIsMTYgQEAKIAkJCQkgICZtZW1ibG9jay5yZXNlcnZlZCwgbWItPm5pZCk7CiAJfQogCi0JLyogTWFyayBhbGwga2VybmVsIG5vZGVzLiAqLworCS8qCisJICogTWFyayBhbGwga2VybmVsIG5vZGVzLgorCSAqCisJICogV2hlbiBib290aW5nIHdpdGggbWVtPW5uW2tNR10gb3IgaW4gYSBrZHVtcCBrZXJuZWwsIG51bWFfbWVtaW5mbworCSAqIG1heSBub3QgaW5jbHVkZSBhbGwgdGhlIG1lbWJsb2NrLnJlc2VydmVkIG1lbW9yeSByYW5nZXMgYmVjYXVzZQorCSAqIHRyaW1fc25iX21lbW9yeSgpIHJlc2VydmVzIHNwZWNpZmljIHBhZ2VzIGZvciBTYW5keSBCcmlkZ2UgZ3JhcGhpY3MuCisJICovCiAJZm9yX2VhY2hfbWVtYmxvY2socmVzZXJ2ZWQsIHIpCi0JCW5vZGVfc2V0KHItPm5pZCwgbnVtYV9rZXJuZWxfbm9kZXMpOworCQlpZiAoci0+bmlkICE9IE1BWF9OVU1OT0RFUykKKwkJCW5vZGVfc2V0KHItPm5pZCwgbnVtYV9rZXJuZWxfbm9kZXMpOwogCiAJLyogQ2xlYXIgTUVNQkxPQ0tfSE9UUExVRyBmbGFnIGZvciBtZW1vcnkgaW4ga2VybmVsIG5vZGVzLiAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1hX21lbWluZm8ubnJfYmxrczsgaSsrKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jIGIvYXJjaC94ODYvbW0vcGFnZWF0dHIuYwppbmRleCA1MzZlYTJmLi44OWFmMjg4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCisrKyBiL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKQEAgLTgxLDExICs4MSw5IEBACiAJc2VxX3ByaW50ZihtLCAiRGlyZWN0TWFwNE06ICAgICU4bHUga0JcbiIsCiAJCQlkaXJlY3RfcGFnZXNfY291bnRbUEdfTEVWRUxfMk1dIDw8IDEyKTsKICNlbmRpZgotI2lmZGVmIENPTkZJR19YODZfNjQKIAlpZiAoZGlyZWN0X2dicGFnZXMpCiAJCXNlcV9wcmludGYobSwgIkRpcmVjdE1hcDFHOiAgICAlOGx1IGtCXG4iLAogCQkJZGlyZWN0X3BhZ2VzX2NvdW50W1BHX0xFVkVMXzFHXSA8PCAyMCk7Ci0jZW5kaWYKIH0KICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgc3BsaXRfcGFnZV9jb3VudChpbnQgbGV2ZWwpIHsgfQpAQCAtMTY1NCwxMyArMTY1MiwxMSBAQAogewogCXJldHVybiBjaGFuZ2VfcGFnZV9hdHRyX2NsZWFyKCZhZGRyLCBudW1wYWdlcywgX19wZ3Byb3QoX1BBR0VfUlcpLCAwKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHNldF9tZW1vcnlfcm8pOwogCiBpbnQgc2V0X21lbW9yeV9ydyh1bnNpZ25lZCBsb25nIGFkZHIsIGludCBudW1wYWdlcykKIHsKIAlyZXR1cm4gY2hhbmdlX3BhZ2VfYXR0cl9zZXQoJmFkZHIsIG51bXBhZ2VzLCBfX3BncHJvdChfUEFHRV9SVyksIDApOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc2V0X21lbW9yeV9ydyk7CiAKIGludCBzZXRfbWVtb3J5X25wKHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IG51bXBhZ2VzKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGF0LmMgYi9hcmNoL3g4Ni9tbS9wYXQuYwppbmRleCA3YWM2ODY5Li4zNWFmNjc3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wYXQuYworKysgYi9hcmNoL3g4Ni9tbS9wYXQuYwpAQCAtNjEwLDcgKzYxMCw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU1RSSUNUX0RFVk1FTQotLyogVGhpcyBjaGVjayBpcyBkb25lIGluIGRyaXZlcnMvY2hhci9tZW0uYyBpbiBjYXNlIG9mIFNUUklDVF9ERVZNRU0qLworLyogVGhpcyBjaGVjayBpcyBkb25lIGluIGRyaXZlcnMvY2hhci9tZW0uYyBpbiBjYXNlIG9mIFNUUklDVF9ERVZNRU0gKi8KIHN0YXRpYyBpbmxpbmUgaW50IHJhbmdlX2lzX2FsbG93ZWQodW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlyZXR1cm4gMTsKQEAgLTYyOCw4ICs2MjgsOCBAQAogCiAJd2hpbGUgKGN1cnNvciA8IHRvKSB7CiAJCWlmICghZGV2bWVtX2lzX2FsbG93ZWQocGZuKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUHJvZ3JhbSAlcyB0cmllZCB0byBhY2Nlc3MgL2Rldi9tZW0gYmV0d2VlbiBbbWVtICUjMDEwTHgtJSMwMTBMeF1cbiIsCi0JCQkJY3VycmVudC0+Y29tbSwgZnJvbSwgdG8gLSAxKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIlByb2dyYW0gJXMgdHJpZWQgdG8gYWNjZXNzIC9kZXYvbWVtIGJldHdlZW4gW21lbSAlIzAxMEx4LSUjMDEwTHhdLCBQQVQgcHJldmVudHMgaXRcbiIsCisJCQkgICAgICAgY3VycmVudC0+Y29tbSwgZnJvbSwgdG8gLSAxKTsKIAkJCXJldHVybiAwOwogCQl9CiAJCWN1cnNvciArPSBQQUdFX1NJWkU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9wZ3RhYmxlLmMgYi9hcmNoL3g4Ni9tbS9wZ3RhYmxlLmMKaW5kZXggN2IyMmFkYS4uMGI5N2QyYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGd0YWJsZS5jCisrKyBiL2FyY2gveDg2L21tL3BndGFibGUuYwpAQCAtNCw2ICs0LDcgQEAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CisjaW5jbHVkZSA8YXNtL210cnIuaD4KIAogI2RlZmluZSBQR0FMTE9DX0dGUCBHRlBfS0VSTkVMIHwgX19HRlBfTk9UUkFDSyB8IF9fR0ZQX1JFUEVBVCB8IF9fR0ZQX1pFUk8KIApAQCAtNTgsNyArNTksNyBAQAogCXRsYl9yZW1vdmVfcGFnZSh0bGIsIHB0ZSk7CiB9CiAKLSNpZiBQQUdFVEFCTEVfTEVWRUxTID4gMgorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDIKIHZvaWQgX19fcG1kX2ZyZWVfdGxiKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHBtZF90ICpwbWQpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocG1kKTsKQEAgLTc0LDE0ICs3NSwxNCBAQAogCXRsYl9yZW1vdmVfcGFnZSh0bGIsIHBhZ2UpOwogfQogCi0jaWYgUEFHRVRBQkxFX0xFVkVMUyA+IDMKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPiAzCiB2b2lkIF9fX3B1ZF9mcmVlX3RsYihzdHJ1Y3QgbW11X2dhdGhlciAqdGxiLCBwdWRfdCAqcHVkKQogewogCXBhcmF2aXJ0X3JlbGVhc2VfcHVkKF9fcGEocHVkKSA+PiBQQUdFX1NISUZUKTsKIAl0bGJfcmVtb3ZlX3BhZ2UodGxiLCB2aXJ0X3RvX3BhZ2UocHVkKSk7CiB9Ci0jZW5kaWYJLyogUEFHRVRBQkxFX0xFVkVMUyA+IDMgKi8KLSNlbmRpZgkvKiBQQUdFVEFCTEVfTEVWRUxTID4gMiAqLworI2VuZGlmCS8qIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+IDMgKi8KKyNlbmRpZgkvKiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPiAyICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZ2RfbGlzdF9hZGQocGdkX3QgKnBnZCkKIHsKQEAgLTExNyw5ICsxMTgsOSBAQAogCS8qIElmIHRoZSBwZ2QgcG9pbnRzIHRvIGEgc2hhcmVkIHBhZ2V0YWJsZSBsZXZlbCAoZWl0aGVyIHRoZQogCSAgIHB0ZXMgaW4gbm9uLVBBRSwgb3Igc2hhcmVkIFBNRCBpbiBQQUUpLCB0aGVuIGp1c3QgY29weSB0aGUKIAkgICByZWZlcmVuY2VzIGZyb20gc3dhcHBlcl9wZ19kaXIuICovCi0JaWYgKFBBR0VUQUJMRV9MRVZFTFMgPT0gMiB8fAotCSAgICAoUEFHRVRBQkxFX0xFVkVMUyA9PSAzICYmIFNIQVJFRF9LRVJORUxfUE1EKSB8fAotCSAgICBQQUdFVEFCTEVfTEVWRUxTID09IDQpIHsKKwlpZiAoQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDIgfHwKKwkgICAgKENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSAzICYmIFNIQVJFRF9LRVJORUxfUE1EKSB8fAorCSAgICBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gNCkgewogCQljbG9uZV9wZ2RfcmFuZ2UocGdkICsgS0VSTkVMX1BHRF9CT1VOREFSWSwKIAkJCQlzd2FwcGVyX3BnX2RpciArIEtFUk5FTF9QR0RfQk9VTkRBUlksCiAJCQkJS0VSTkVMX1BHRF9QVFJTKTsKQEAgLTI3NSwxMiArMjc2LDg3IEBACiAJfQogfQogCisvKgorICogWGVuIHBhcmF2aXJ0IGFzc3VtZXMgcGdkIHRhYmxlIHNob3VsZCBiZSBpbiBvbmUgcGFnZS4gNjQgYml0IGtlcm5lbCBhbHNvCisgKiBhc3N1bWVzIHRoYXQgcGdkIHNob3VsZCBiZSBpbiBvbmUgcGFnZS4KKyAqCisgKiBCdXQga2VybmVsIHdpdGggUEFFIHBhZ2luZyB0aGF0IGlzIG5vdCBydW5uaW5nIGFzIGEgWGVuIGRvbWFpbgorICogb25seSBuZWVkcyB0byBhbGxvY2F0ZSAzMiBieXRlcyBmb3IgcGdkIGluc3RlYWQgb2Ygb25lIHBhZ2UuCisgKi8KKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIFBHRF9TSVpFCShQVFJTX1BFUl9QR0QgKiBzaXplb2YocGdkX3QpKQorI2RlZmluZSBQR0RfQUxJR04JMzIKKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpwZ2RfY2FjaGU7CisKK3N0YXRpYyBpbnQgX19pbml0IHBnZF9jYWNoZV9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBXaGVuIFBBRSBrZXJuZWwgaXMgcnVubmluZyBhcyBhIFhlbiBkb21haW4sIGl0IGRvZXMgbm90IHVzZQorCSAqIHNoYXJlZCBrZXJuZWwgcG1kLiBBbmQgdGhpcyByZXF1aXJlcyBhIHdob2xlIHBhZ2UgZm9yIHBnZC4KKwkgKi8KKwlpZiAoIVNIQVJFRF9LRVJORUxfUE1EKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogd2hlbiBQQUUga2VybmVsIGlzIG5vdCBydW5uaW5nIGFzIGEgWGVuIGRvbWFpbiwgaXQgdXNlcworCSAqIHNoYXJlZCBrZXJuZWwgcG1kLiBTaGFyZWQga2VybmVsIHBtZCBkb2VzIG5vdCByZXF1aXJlIGEgd2hvbGUKKwkgKiBwYWdlIGZvciBwZ2QuIFdlIGFyZSBhYmxlIHRvIGp1c3QgYWxsb2NhdGUgYSAzMi1ieXRlIGZvciBwZ2QuCisJICogRHVyaW5nIGJvb3QgdGltZSwgd2UgY3JlYXRlIGEgMzItYnl0ZSBzbGFiIGZvciBwZ2QgdGFibGUgYWxsb2NhdGlvbi4KKwkgKi8KKwlwZ2RfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicGdkX2NhY2hlIiwgUEdEX1NJWkUsIFBHRF9BTElHTiwKKwkJCQkgICAgICBTTEFCX1BBTklDLCBOVUxMKTsKKwlpZiAoIXBnZF9jYWNoZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KK2NvcmVfaW5pdGNhbGwocGdkX2NhY2hlX2luaXQpOworCitzdGF0aWMgaW5saW5lIHBnZF90ICpfcGdkX2FsbG9jKHZvaWQpCit7CisJLyoKKwkgKiBJZiBubyBTSEFSRURfS0VSTkVMX1BNRCwgUEFFIGtlcm5lbCBpcyBydW5uaW5nIGFzIGEgWGVuIGRvbWFpbi4KKwkgKiBXZSBhbGxvY2F0ZSBvbmUgcGFnZSBmb3IgcGdkLgorCSAqLworCWlmICghU0hBUkVEX0tFUk5FTF9QTUQpCisJCXJldHVybiAocGdkX3QgKilfX2dldF9mcmVlX3BhZ2UoUEdBTExPQ19HRlApOworCisJLyoKKwkgKiBOb3cgUEFFIGtlcm5lbCBpcyBub3QgcnVubmluZyBhcyBhIFhlbiBkb21haW4uIFdlIGNhbiBhbGxvY2F0ZQorCSAqIGEgMzItYnl0ZSBzbGFiIGZvciBwZ2QgdG8gc2F2ZSBtZW1vcnkgc3BhY2UuCisJICovCisJcmV0dXJuIGttZW1fY2FjaGVfYWxsb2MocGdkX2NhY2hlLCBQR0FMTE9DX0dGUCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfcGdkX2ZyZWUocGdkX3QgKnBnZCkKK3sKKwlpZiAoIVNIQVJFRF9LRVJORUxfUE1EKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGdkKTsKKwllbHNlCisJCWttZW1fY2FjaGVfZnJlZShwZ2RfY2FjaGUsIHBnZCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBwZ2RfdCAqX3BnZF9hbGxvYyh2b2lkKQoreworCXJldHVybiAocGdkX3QgKilfX2dldF9mcmVlX3BhZ2UoUEdBTExPQ19HRlApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX3BnZF9mcmVlKHBnZF90ICpwZ2QpCit7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBnZCk7Cit9CisjZW5kaWYgLyogQ09ORklHX1g4Nl9QQUUgKi8KKwogcGdkX3QgKnBnZF9hbGxvYyhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKIHsKIAlwZ2RfdCAqcGdkOwogCXBtZF90ICpwbWRzW1BSRUFMTE9DQVRFRF9QTURTXTsKIAotCXBnZCA9IChwZ2RfdCAqKV9fZ2V0X2ZyZWVfcGFnZShQR0FMTE9DX0dGUCk7CisJcGdkID0gX3BnZF9hbGxvYygpOwogCiAJaWYgKHBnZCA9PSBOVUxMKQogCQlnb3RvIG91dDsKQEAgLTMxMCw3ICszODYsNyBAQAogb3V0X2ZyZWVfcG1kczoKIAlmcmVlX3BtZHMobW0sIHBtZHMpOwogb3V0X2ZyZWVfcGdkOgotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylwZ2QpOworCV9wZ2RfZnJlZShwZ2QpOwogb3V0OgogCXJldHVybiBOVUxMOwogfQpAQCAtMzIwLDcgKzM5Niw3IEBACiAJcGdkX21vcF91cF9wbWRzKG1tLCBwZ2QpOwogCXBnZF9kdG9yKHBnZCk7CiAJcGFyYXZpcnRfcGdkX2ZyZWUobW0sIHBnZCk7Ci0JZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBnZCk7CisJX3BnZF9mcmVlKHBnZCk7CiB9CiAKIC8qCkBAIC00ODUsMyArNTYxLDY3IEBACiB7CiAJX19uYXRpdmVfc2V0X2ZpeG1hcChpZHgsIHBmbl9wdGUocGh5cyA+PiBQQUdFX1NISUZULCBmbGFncykpOwogfQorCisjaWZkZWYgQ09ORklHX0hBVkVfQVJDSF9IVUdFX1ZNQVAKK2ludCBwdWRfc2V0X2h1Z2UocHVkX3QgKnB1ZCwgcGh5c19hZGRyX3QgYWRkciwgcGdwcm90X3QgcHJvdCkKK3sKKwl1OCBtdHJyOworCisJLyoKKwkgKiBEbyBub3QgdXNlIGEgaHVnZSBwYWdlIHdoZW4gdGhlIHJhbmdlIGlzIGNvdmVyZWQgYnkgbm9uLVdCIHR5cGUKKwkgKiBvZiBNVFJScy4KKwkgKi8KKwltdHJyID0gbXRycl90eXBlX2xvb2t1cChhZGRyLCBhZGRyICsgUFVEX1NJWkUpOworCWlmICgobXRyciAhPSBNVFJSX1RZUEVfV1JCQUNLKSAmJiAobXRyciAhPSAweEZGKSkKKwkJcmV0dXJuIDA7CisKKwlwcm90ID0gcGdwcm90XzRrXzJfbGFyZ2UocHJvdCk7CisKKwlzZXRfcHRlKChwdGVfdCAqKXB1ZCwgcGZuX3B0ZSgKKwkJKHU2NClhZGRyID4+IFBBR0VfU0hJRlQsCisJCV9fcGdwcm90KHBncHJvdF92YWwocHJvdCkgfCBfUEFHRV9QU0UpKSk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHBtZF9zZXRfaHVnZShwbWRfdCAqcG1kLCBwaHlzX2FkZHJfdCBhZGRyLCBwZ3Byb3RfdCBwcm90KQoreworCXU4IG10cnI7CisKKwkvKgorCSAqIERvIG5vdCB1c2UgYSBodWdlIHBhZ2Ugd2hlbiB0aGUgcmFuZ2UgaXMgY292ZXJlZCBieSBub24tV0IgdHlwZQorCSAqIG9mIE1UUlJzLgorCSAqLworCW10cnIgPSBtdHJyX3R5cGVfbG9va3VwKGFkZHIsIGFkZHIgKyBQTURfU0laRSk7CisJaWYgKChtdHJyICE9IE1UUlJfVFlQRV9XUkJBQ0spICYmIChtdHJyICE9IDB4RkYpKQorCQlyZXR1cm4gMDsKKworCXByb3QgPSBwZ3Byb3RfNGtfMl9sYXJnZShwcm90KTsKKworCXNldF9wdGUoKHB0ZV90ICopcG1kLCBwZm5fcHRlKAorCQkodTY0KWFkZHIgPj4gUEFHRV9TSElGVCwKKwkJX19wZ3Byb3QocGdwcm90X3ZhbChwcm90KSB8IF9QQUdFX1BTRSkpKTsKKworCXJldHVybiAxOworfQorCitpbnQgcHVkX2NsZWFyX2h1Z2UocHVkX3QgKnB1ZCkKK3sKKwlpZiAocHVkX2xhcmdlKCpwdWQpKSB7CisJCXB1ZF9jbGVhcihwdWQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBtZF9jbGVhcl9odWdlKHBtZF90ICpwbWQpCit7CisJaWYgKHBtZF9sYXJnZSgqcG1kKSkgeworCQlwbWRfY2xlYXIocG1kKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYJLyogQ09ORklHX0hBVkVfQVJDSF9IVUdFX1ZNQVAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L29wcm9maWxlL2JhY2t0cmFjZS5jIGIvYXJjaC94ODYvb3Byb2ZpbGUvYmFja3RyYWNlLmMKaW5kZXggNWQwNGJlNS4uNGU2NjRiZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvb3Byb2ZpbGUvYmFja3RyYWNlLmMKKysrIGIvYXJjaC94ODYvb3Byb2ZpbGUvYmFja3RyYWNlLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogewogCXN0cnVjdCBzdGFja19mcmFtZSAqaGVhZCA9IChzdHJ1Y3Qgc3RhY2tfZnJhbWUgKilmcmFtZV9wb2ludGVyKHJlZ3MpOwogCi0JaWYgKCF1c2VyX21vZGVfdm0ocmVncykpIHsKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkgewogCQl1bnNpZ25lZCBsb25nIHN0YWNrID0ga2VybmVsX3N0YWNrX3BvaW50ZXIocmVncyk7CiAJCWlmIChkZXB0aCkKIAkJCWR1bXBfdHJhY2UoTlVMTCwgcmVncywgKHVuc2lnbmVkIGxvbmcgKilzdGFjaywgMCwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9jb21tb24uYyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwppbmRleCAzZDI2MTJiLi44ZmQ2ZjQ0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKKysrIGIvYXJjaC94ODYvcGNpL2NvbW1vbi5jCkBAIC00OTAsNyArNDkwLDkgQEAKIAlpZiAoIWJ1cykgewogCQlwY2lfZnJlZV9yZXNvdXJjZV9saXN0KCZyZXNvdXJjZXMpOwogCQlrZnJlZShzZCk7CisJCXJldHVybjsKIAl9CisJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOwogfQogCiB2b2lkIF9faW5pdCBwY2liaW9zX3NldF9jYWNoZV9saW5lX3NpemUodm9pZCkKQEAgLTUxMywzMSArNTE1LDYgQEAKIAl9CiB9CiAKLS8qCi0gKiBTb21lIGRldmljZSBkcml2ZXJzIGFzc3VtZSBkZXYtPmlycSB3b24ndCBjaGFuZ2UgYWZ0ZXIgY2FsbGluZwotICogcGNpX2Rpc2FibGVfZGV2aWNlKCkuIFNvIGRlbGF5IHJlbGVhc2luZyBvZiBJUlEgcmVzb3VyY2UgdG8gZHJpdmVyCi0gKiB1bmJpbmRpbmcgdGltZS4gT3RoZXJ3aXNlIGl0IHdpbGwgYnJlYWsgUE0gc3Vic3lzdGVtIGFuZCBkcml2ZXJzCi0gKiBsaWtlIHhlbi1wY2liYWNrIGV0Yy4KLSAqLwotc3RhdGljIGludCBwY2lfaXJxX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAotCQkJICAgIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoZGF0YSk7Ci0KLQlpZiAoYWN0aW9uICE9IEJVU19OT1RJRllfVU5CT1VORF9EUklWRVIpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQotCWlmIChwY2liaW9zX2Rpc2FibGVfaXJxKQotCQlwY2liaW9zX2Rpc2FibGVfaXJxKGRldik7Ci0KLQlyZXR1cm4gTk9USUZZX09LOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBjaV9pcnFfbmIgPSB7Ci0JLm5vdGlmaWVyX2NhbGwgPSBwY2lfaXJxX25vdGlmaWVyLAotCS5wcmlvcml0eSA9IElOVF9NSU4sCi19OwotCiBpbnQgX19pbml0IHBjaWJpb3NfaW5pdCh2b2lkKQogewogCWlmICghcmF3X3BjaV9vcHMpIHsKQEAgLTU1MCw5ICs1MjcsNiBAQAogCiAJaWYgKHBjaV9iZl9zb3J0ID49IHBjaV9mb3JjZV9iZikKIAkJcGNpX3NvcnRfYnJlYWR0aGZpcnN0KCk7Ci0KLQlidXNfcmVnaXN0ZXJfbm90aWZpZXIoJnBjaV9idXNfdHlwZSwgJnBjaV9pcnFfbmIpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcxMSw2ICs2ODUsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCBwY2liaW9zX2Rpc2FibGVfZGV2aWNlIChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmICghcGNpX2Rldl9tc2lfZW5hYmxlZChkZXYpICYmIHBjaWJpb3NfZGlzYWJsZV9pcnEpCisJCXBjaWJpb3NfZGlzYWJsZV9pcnEoZGV2KTsKK30KKwogaW50IHBjaV9leHRfY2ZnX2F2YWlsKHZvaWQpCiB7CiAJaWYgKHJhd19wY2lfZXh0X29wcykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9pbnRlbF9taWRfcGNpLmMgYi9hcmNoL3g4Ni9wY2kvaW50ZWxfbWlkX3BjaS5jCmluZGV4IGVmYjg0OTMuLjg1MmFhNGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9pbnRlbF9taWRfcGNpLmMKKysrIGIvYXJjaC94ODYvcGNpL2ludGVsX21pZF9wY2kuYwpAQCAtMjM0LDEwICsyMzQsMTAgQEAKIAogc3RhdGljIHZvaWQgaW50ZWxfbWlkX3BjaV9pcnFfZGlzYWJsZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWlmIChkZXYtPmlycV9tYW5hZ2VkICYmIGRldi0+aXJxID4gMCkgeworCWlmICghbXBfc2hvdWxkX2tlZXBfaXJxKCZkZXYtPmRldikgJiYgZGV2LT5pcnFfbWFuYWdlZCAmJgorCSAgICBkZXYtPmlycSA+IDApIHsKIAkJbXBfdW5tYXBfaXJxKGRldi0+aXJxKTsKIAkJZGV2LT5pcnFfbWFuYWdlZCA9IDA7Ci0JCWRldi0+aXJxID0gMDsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9pcnEuYyBiL2FyY2gveDg2L3BjaS9pcnEuYwppbmRleCBlNzFiM2RiLi41ZGM2Y2E1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvaXJxLmMKKysrIGIvYXJjaC94ODYvcGNpL2lycS5jCkBAIC0xMjU2LDkgKzEyNTYsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorYm9vbCBtcF9zaG91bGRfa2VlcF9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChkZXYtPnBvd2VyLmlzX3ByZXBhcmVkKQorCQlyZXR1cm4gdHJ1ZTsKKyNpZmRlZiBDT05GSUdfUE0KKwlpZiAoZGV2LT5wb3dlci5ydW50aW1lX3N0YXR1cyA9PSBSUE1fU1VTUEVORElORykKKwkJcmV0dXJuIHRydWU7CisjZW5kaWYKKworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIHZvaWQgcGlycV9kaXNhYmxlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewotCWlmIChpb19hcGljX2Fzc2lnbl9wY2lfaXJxcyAmJiBkZXYtPmlycV9tYW5hZ2VkICYmIGRldi0+aXJxKSB7CisJaWYgKGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzICYmICFtcF9zaG91bGRfa2VlcF9pcnEoJmRldi0+ZGV2KSAmJgorCSAgICBkZXYtPmlycV9tYW5hZ2VkICYmIGRldi0+aXJxKSB7CiAJCW1wX3VubWFwX2lycShkZXYtPmlycSk7CiAJCWRldi0+aXJxID0gMDsKIAkJZGV2LT5pcnFfbWFuYWdlZCA9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLWJncnQuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCmluZGV4IGQxNDNkMjEuLmQ3Zjk5N2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmktYmdydC5jCkBAIC02Nyw3ICs2Nyw3IEBACiAKIAlpbWFnZSA9IGVmaV9sb29rdXBfbWFwcGVkX2FkZHIoYmdydF90YWItPmltYWdlX2FkZHJlc3MpOwogCWlmICghaW1hZ2UpIHsKLQkJaW1hZ2UgPSBlYXJseV9tZW1yZW1hcChiZ3J0X3RhYi0+aW1hZ2VfYWRkcmVzcywKKwkJaW1hZ2UgPSBlYXJseV9pb3JlbWFwKGJncnRfdGFiLT5pbWFnZV9hZGRyZXNzLAogCQkJCSAgICAgICBzaXplb2YoYm1wX2hlYWRlcikpOwogCQlpb3JlbWFwcGVkID0gdHJ1ZTsKIAkJaWYgKCFpbWFnZSkgewpAQCAtODksNyArODksNyBAQAogCX0KIAogCWlmIChpb3JlbWFwcGVkKSB7Ci0JCWltYWdlID0gZWFybHlfbWVtcmVtYXAoYmdydF90YWItPmltYWdlX2FkZHJlc3MsCisJCWltYWdlID0gZWFybHlfaW9yZW1hcChiZ3J0X3RhYi0+aW1hZ2VfYWRkcmVzcywKIAkJCQkgICAgICAgYm1wX2hlYWRlci5zaXplKTsKIAkJaWYgKCFpbWFnZSkgewogCQkJcHJfZXJyKCJJZ25vcmluZyBCR1JUOiBmYWlsZWQgdG8gbWFwIGltYWdlIG1lbW9yeVxuIik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKaW5kZXggZGJjODYyNy4uMDI3NDRkZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYwpAQCAtODUsMTIgKzg1LDIwIEBACiAJZWZpX21lbW9yeV9kZXNjX3QgKnZpcnR1YWxfbWFwKQogewogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlwZ2RfdCAqc2F2ZV9wZ2Q7CiAKLQllZmlfY2FsbF9waHlzX3Byb2xvZygpOworCXNhdmVfcGdkID0gZWZpX2NhbGxfcGh5c19wcm9sb2coKTsKKworCS8qIERpc2FibGUgaW50ZXJydXB0cyBhcm91bmQgRUZJIGNhbGxzOiAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlzdGF0dXMgPSBlZmlfY2FsbF9waHlzKGVmaV9waHlzLnNldF92aXJ0dWFsX2FkZHJlc3NfbWFwLAogCQkJICAgICAgIG1lbW9yeV9tYXBfc2l6ZSwgZGVzY3JpcHRvcl9zaXplLAogCQkJICAgICAgIGRlc2NyaXB0b3JfdmVyc2lvbiwgdmlydHVhbF9tYXApOwotCWVmaV9jYWxsX3BoeXNfZXBpbG9nKCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJZWZpX2NhbGxfcGh5c19lcGlsb2coc2F2ZV9wZ2QpOworCiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNDkxLDcgKzQ5OSw4IEBACiAJaWYgKGVmaV9tZW1tYXBfaW5pdCgpKQogCQlyZXR1cm47CiAKLQlwcmludF9lZmlfbWVtbWFwKCk7CisJaWYgKGVmaV9lbmFibGVkKEVGSV9EQkcpKQorCQlwcmludF9lZmlfbWVtbWFwKCk7CiB9CiAKIHZvaWQgX19pbml0IGVmaV9sYXRlX2luaXQodm9pZCkKQEAgLTkzOSw2ICs5NDgsOCBAQAogewogCWlmIChwYXJzZV9vcHRpb25fc3RyKHN0ciwgIm9sZF9tYXAiKSkKIAkJc2V0X2JpdChFRklfT0xEX01FTU1BUCwgJmVmaS5mbGFncyk7CisJaWYgKHBhcnNlX29wdGlvbl9zdHIoc3RyLCAiZGVidWciKSkKKwkJc2V0X2JpdChFRklfREJHLCAmZWZpLmZsYWdzKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV8zMi5jIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV8zMi5jCmluZGV4IDQwZTdjZGEuLmVkNWI2NzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfMzIuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzMyLmMKQEAgLTMzLDExICszMywxMCBAQAogCiAvKgogICogVG8gbWFrZSBFRkkgY2FsbCBFRkkgcnVudGltZSBzZXJ2aWNlIGluIHBoeXNpY2FsIGFkZHJlc3NpbmcgbW9kZSB3ZSBuZWVkCi0gKiBwcm9sb2cvZXBpbG9nIGJlZm9yZS9hZnRlciB0aGUgaW52b2NhdGlvbiB0byBkaXNhYmxlIGludGVycnVwdCwgdG8KLSAqIGNsYWltIEVGSSBydW50aW1lIHNlcnZpY2UgaGFuZGxlciBleGNsdXNpdmVseSBhbmQgdG8gZHVwbGljYXRlIGEgbWVtb3J5IGluCi0gKiBsb3cgbWVtb3J5IHNwYWNlIHNheSAwIC0gM0cuCisgKiBwcm9sb2cvZXBpbG9nIGJlZm9yZS9hZnRlciB0aGUgaW52b2NhdGlvbiB0byBjbGFpbSB0aGUgRUZJIHJ1bnRpbWUgc2VydmljZQorICogaGFuZGxlciBleGNsdXNpdmVseSBhbmQgdG8gZHVwbGljYXRlIGEgbWVtb3J5IG1hcHBpbmcgaW4gbG93IG1lbW9yeSBzcGFjZSwKKyAqIHNheSAwIC0gM0cuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGVmaV9ydF9lZmxhZ3M7CiAKIHZvaWQgZWZpX3N5bmNfbG93X2tlcm5lbF9tYXBwaW5ncyh2b2lkKSB7fQogdm9pZCBfX2luaXQgZWZpX2R1bXBfcGFnZXRhYmxlKHZvaWQpIHt9CkBAIC01NywyMSArNTYsMjQgQEAKIHZvaWQgX19pbml0IGVmaV9tYXBfcmVnaW9uX2ZpeGVkKGVmaV9tZW1vcnlfZGVzY190ICptZCkge30KIHZvaWQgX19pbml0IHBhcnNlX2VmaV9zZXR1cCh1NjQgcGh5c19hZGRyLCB1MzIgZGF0YV9sZW4pIHt9CiAKLXZvaWQgX19pbml0IGVmaV9jYWxsX3BoeXNfcHJvbG9nKHZvaWQpCitwZ2RfdCAqIF9faW5pdCBlZmlfY2FsbF9waHlzX3Byb2xvZyh2b2lkKQogewogCXN0cnVjdCBkZXNjX3B0ciBnZHRfZGVzY3I7CisJcGdkX3QgKnNhdmVfcGdkOwogCi0JbG9jYWxfaXJxX3NhdmUoZWZpX3J0X2VmbGFncyk7Ci0KKwkvKiBDdXJyZW50IHBnZCBpcyBzd2FwcGVyX3BnX2Rpciwgd2UnbGwgcmVzdG9yZSBpdCBsYXRlcjogKi8KKwlzYXZlX3BnZCA9IHN3YXBwZXJfcGdfZGlyOwogCWxvYWRfY3IzKGluaXRpYWxfcGFnZV90YWJsZSk7CiAJX19mbHVzaF90bGJfYWxsKCk7CiAKIAlnZHRfZGVzY3IuYWRkcmVzcyA9IF9fcGEoZ2V0X2NwdV9nZHRfdGFibGUoMCkpOwogCWdkdF9kZXNjci5zaXplID0gR0RUX1NJWkUgLSAxOwogCWxvYWRfZ2R0KCZnZHRfZGVzY3IpOworCisJcmV0dXJuIHNhdmVfcGdkOwogfQogCi12b2lkIF9faW5pdCBlZmlfY2FsbF9waHlzX2VwaWxvZyh2b2lkKQordm9pZCBfX2luaXQgZWZpX2NhbGxfcGh5c19lcGlsb2cocGdkX3QgKnNhdmVfcGdkKQogewogCXN0cnVjdCBkZXNjX3B0ciBnZHRfZGVzY3I7CiAKQEAgLTc5LDEwICs4MSw4IEBACiAJZ2R0X2Rlc2NyLnNpemUgPSBHRFRfU0laRSAtIDE7CiAJbG9hZF9nZHQoJmdkdF9kZXNjcik7CiAKLQlsb2FkX2NyMyhzd2FwcGVyX3BnX2Rpcik7CisJbG9hZF9jcjMoc2F2ZV9wZ2QpOwogCV9fZmx1c2hfdGxiX2FsbCgpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZWZpX3J0X2VmbGFncyk7CiB9CiAKIHZvaWQgX19pbml0IGVmaV9ydW50aW1lX21rZXhlYyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV82NC5jIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV82NC5jCmluZGV4IDE3ZTgwZDguLmEwYWMwZjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfNjQuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzY0LmMKQEAgLTQxLDkgKzQxLDYgQEAKICNpbmNsdWRlIDxhc20vcmVhbG1vZGUuaD4KICNpbmNsdWRlIDxhc20vdGltZS5oPgogCi1zdGF0aWMgcGdkX3QgKnNhdmVfcGdkIF9faW5pdGRhdGE7Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBlZmlfZmxhZ3MgX19pbml0ZGF0YTsKLQogLyoKICAqIFdlIGFsbG9jYXRlIHJ1bnRpbWUgc2VydmljZXMgcmVnaW9ucyBib3R0b20tdXAsIHN0YXJ0aW5nIGZyb20gLTRHLCBpLmUuCiAgKiAweGZmZmZfZmZmZl8wMDAwXzAwMDAgYW5kIGxpbWl0IEVGSSBWQSBtYXBwaW5nIHNwYWNlIHRvIDY0Ry4KQEAgLTc4LDE3ICs3NSwxOCBAQAogCX0KIH0KIAotdm9pZCBfX2luaXQgZWZpX2NhbGxfcGh5c19wcm9sb2codm9pZCkKK3BnZF90ICogX19pbml0IGVmaV9jYWxsX3BoeXNfcHJvbG9nKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWRkcmVzczsKKwlwZ2RfdCAqc2F2ZV9wZ2Q7CisKIAlpbnQgcGdkOwogCWludCBuX3BnZHM7CiAKIAlpZiAoIWVmaV9lbmFibGVkKEVGSV9PTERfTUVNTUFQKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gTlVMTDsKIAogCWVhcmx5X2NvZGVfbWFwcGluZ19zZXRfZXhlYygxKTsKLQlsb2NhbF9pcnFfc2F2ZShlZmlfZmxhZ3MpOwogCiAJbl9wZ2RzID0gRElWX1JPVU5EX1VQKChtYXhfcGZuIDw8IFBBR0VfU0hJRlQpLCBQR0RJUl9TSVpFKTsKIAlzYXZlX3BnZCA9IGttYWxsb2Mobl9wZ2RzICogc2l6ZW9mKHBnZF90KSwgR0ZQX0tFUk5FTCk7CkBAIC05OSwyNCArOTcsMjkgQEAKIAkJc2V0X3BnZChwZ2Rfb2Zmc2V0X2socGdkICogUEdESVJfU0laRSksICpwZ2Rfb2Zmc2V0X2sodmFkZHJlc3MpKTsKIAl9CiAJX19mbHVzaF90bGJfYWxsKCk7CisKKwlyZXR1cm4gc2F2ZV9wZ2Q7CiB9CiAKLXZvaWQgX19pbml0IGVmaV9jYWxsX3BoeXNfZXBpbG9nKHZvaWQpCit2b2lkIF9faW5pdCBlZmlfY2FsbF9waHlzX2VwaWxvZyhwZ2RfdCAqc2F2ZV9wZ2QpCiB7CiAJLyoKIAkgKiBBZnRlciB0aGUgbG9jayBpcyByZWxlYXNlZCwgdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGUgaXMgcmVzdG9yZWQuCiAJICovCi0JaW50IHBnZDsKLQlpbnQgbl9wZ2RzID0gRElWX1JPVU5EX1VQKChtYXhfcGZuIDw8IFBBR0VfU0hJRlQpICwgUEdESVJfU0laRSk7CisJaW50IHBnZF9pZHg7CisJaW50IG5yX3BnZHM7CiAKLQlpZiAoIWVmaV9lbmFibGVkKEVGSV9PTERfTUVNTUFQKSkKKwlpZiAoIXNhdmVfcGdkKQogCQlyZXR1cm47CiAKLQlmb3IgKHBnZCA9IDA7IHBnZCA8IG5fcGdkczsgcGdkKyspCi0JCXNldF9wZ2QocGdkX29mZnNldF9rKHBnZCAqIFBHRElSX1NJWkUpLCBzYXZlX3BnZFtwZ2RdKTsKKwlucl9wZ2RzID0gRElWX1JPVU5EX1VQKChtYXhfcGZuIDw8IFBBR0VfU0hJRlQpICwgUEdESVJfU0laRSk7CisKKwlmb3IgKHBnZF9pZHggPSAwOyBwZ2RfaWR4IDwgbnJfcGdkczsgcGdkX2lkeCsrKQorCQlzZXRfcGdkKHBnZF9vZmZzZXRfayhwZ2RfaWR4ICogUEdESVJfU0laRSksIHNhdmVfcGdkW3BnZF9pZHhdKTsKKwogCWtmcmVlKHNhdmVfcGdkKTsKKwogCV9fZmx1c2hfdGxiX2FsbCgpOwotCWxvY2FsX2lycV9yZXN0b3JlKGVmaV9mbGFncyk7CiAJZWFybHlfY29kZV9tYXBwaW5nX3NldF9leGVjKDApOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9pbnRlbC1xdWFyay9pbXJfc2VsZnRlc3QuYyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLXF1YXJrL2ltcl9zZWxmdGVzdC5jCmluZGV4IGM5YTA4MzguLjI3OGU0ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLXF1YXJrL2ltcl9zZWxmdGVzdC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2ludGVsLXF1YXJrL2ltcl9zZWxmdGVzdC5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL2NwdV9kZXZpY2VfaWQuaD4KICNpbmNsdWRlIDxhc20vaW1yLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC0xMDEsNiArMTAyLDEyIEBACiAJfQogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgaW1yX2lkc1tdIF9faW5pdGNvbnN0ID0geworCXsgWDg2X1ZFTkRPUl9JTlRFTCwgNSwgOSB9LAkvKiBJbnRlbCBRdWFyayBTb0MgWDEwMDAuICovCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHg4NmNwdSwgaW1yX2lkcyk7CisKIC8qKgogICogaW1yX3NlbGZfdGVzdF9pbml0IC0gZW50cnkgcG9pbnQgZm9yIElNUiBkcml2ZXIuCiAgKgpAQCAtMTA4LDcgKzExNSw4IEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IGltcl9zZWxmX3Rlc3RfaW5pdCh2b2lkKQogewotCWltcl9zZWxmX3Rlc3QoKTsKKwlpZiAoeDg2X21hdGNoX2NwdShpbXJfaWRzKSkKKwkJaW1yX3NlbGZfdGVzdCgpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGMteG8xLXNjaS5jIGIvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9vbHBjLXhvMS1zY2kuYwppbmRleCA5YTJlNTkwLi43ZmE4YjNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9vbHBjL29scGMteG8xLXNjaS5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL29scGMvb2xwYy14bzEtc2NpLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAogCWlmIChwc3kpIHsKIAkJcG93ZXJfc3VwcGx5X2NoYW5nZWQocHN5KTsKLQkJcHV0X2RldmljZShwc3ktPmRldik7CisJCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIAl9CiB9CiAKQEAgLTcxLDcgKzcxLDcgQEAKIAogCWlmIChwc3kpIHsKIAkJcG93ZXJfc3VwcGx5X2NoYW5nZWQocHN5KTsKLQkJcHV0X2RldmljZShwc3ktPmRldik7CisJCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL29scGMvb2xwYy14bzE1LXNjaS5jIGIvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9vbHBjLXhvMTUtc2NpLmMKaW5kZXggMDhlMzUwZS4uNTUxMzA4NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9vbHBjLXhvMTUtc2NpLmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vb2xwYy9vbHBjLXhvMTUtc2NpLmMKQEAgLTgzLDcgKzgzLDcgQEAKIAogCWlmIChwc3kpIHsKIAkJcG93ZXJfc3VwcGx5X2NoYW5nZWQocHN5KTsKLQkJcHV0X2RldmljZShwc3ktPmRldik7CisJCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIAl9CiB9CiAKQEAgLTkzLDcgKzkzLDcgQEAKIAogCWlmIChwc3kpIHsKIAkJcG93ZXJfc3VwcGx5X2NoYW5nZWQocHN5KTsKLQkJcHV0X2RldmljZShwc3ktPmRldik7CisJCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL3V2L3RsYl91di5jIGIvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKaW5kZXggOTk0Nzk4NS4uM2I2ZWM0MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKKysrIGIvYXJjaC94ODYvcGxhdGZvcm0vdXYvdGxiX3V2LmMKQEAgLTQxNSw3ICs0MTUsNyBAQAogCXN0cnVjdCByZXNldF9hcmdzIHJlc2V0X2FyZ3M7CiAKIAlyZXNldF9hcmdzLnNlbmRlciA9IHNlbmRlcjsKLQljcHVzX2NsZWFyKCptYXNrKTsKKwljcHVtYXNrX2NsZWFyKG1hc2spOwogCS8qIGZpbmQgYSBzaW5nbGUgY3B1IGZvciBlYWNoIHV2aHViIGluIHRoaXMgZGlzdHJpYnV0aW9uIG1hc2sgKi8KIAltYXNrYml0cyA9IHNpemVvZihzdHJ1Y3QgcG5tYXNrKSAqIEJJVFNQRVJCWVRFOwogCS8qIGVhY2ggYml0IGlzIGEgcG5vZGUgcmVsYXRpdmUgdG8gdGhlIHBhcnRpdGlvbiBiYXNlIHBub2RlICovCkBAIC00MjUsNyArNDI1LDcgQEAKIAkJCWNvbnRpbnVlOwogCQlhcG5vZGUgPSBwbm9kZSArIGJjcC0+cGFydGl0aW9uX2Jhc2VfcG5vZGU7CiAJCWNwdSA9IHBub2RlX3RvX2ZpcnN0X2NwdShhcG5vZGUsIHNtYXN0ZXIpOwotCQljcHVfc2V0KGNwdSwgKm1hc2spOworCQljcHVtYXNrX3NldF9jcHUoY3B1LCBtYXNrKTsKIAl9CiAKIAkvKiBJUEkgYWxsIGNwdXM7IHByZWVtcHRpb24gaXMgYWxyZWFkeSBkaXNhYmxlZCAqLwpAQCAtMTEyNiw3ICsxMTI2LDcgQEAKIAkvKiBkb24ndCBhY3R1YWxseSBkbyBhIHNob290ZG93biBvZiB0aGUgbG9jYWwgY3B1ICovCiAJY3B1bWFza19hbmRub3QoZmx1c2hfbWFzaywgY3B1bWFzaywgY3B1bWFza19vZihjcHUpKTsKIAotCWlmIChjcHVfaXNzZXQoY3B1LCAqY3B1bWFzaykpCisJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHVtYXNrKSkKIAkJc3RhdC0+c19udGFyZ3NlbGYrKzsKIAogCWJhdV9kZXNjID0gYmNwLT5kZXNjcmlwdG9yX2Jhc2U7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wb3dlci9jcHUuYyBiL2FyY2gveDg2L3Bvd2VyL2NwdS5jCmluZGV4IDNlMzJlZDUuLjc1NzY3OGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Bvd2VyL2NwdS5jCisrKyBiL2FyY2gveDg2L3Bvd2VyL2NwdS5jCkBAIC0xMzQsNyArMTM0LDcgQEAKIHN0YXRpYyB2b2lkIGZpeF9wcm9jZXNzb3JfY29udGV4dCh2b2lkKQogewogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0Jc3RydWN0IHRzc19zdHJ1Y3QgKnQgPSAmcGVyX2NwdShpbml0X3RzcywgY3B1KTsKKwlzdHJ1Y3QgdHNzX3N0cnVjdCAqdCA9ICZwZXJfY3B1KGNwdV90c3MsIGNwdSk7CiAjaWZkZWYgQ09ORklHX1g4Nl82NAogCXN0cnVjdCBkZXNjX3N0cnVjdCAqZGVzYyA9IGdldF9jcHVfZ2R0X3RhYmxlKGNwdSk7CiAJdHNzX2Rlc2MgdHNzOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvc3lzY2FsbHMvc3lzY2FsbF8zMi50YmwgYi9hcmNoL3g4Ni9zeXNjYWxscy9zeXNjYWxsXzMyLnRibAppbmRleCBiMzU2MGVjLi5lZjgxODdmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9zeXNjYWxscy9zeXNjYWxsXzMyLnRibAorKysgYi9hcmNoL3g4Ni9zeXNjYWxscy9zeXNjYWxsXzMyLnRibApAQCAtMTE5LDcgKzExOSw3IEBACiAxMTAJaTM4Nglpb3BsCQkJc3lzX2lvcGwKIDExMQlpMzg2CXZoYW5ndXAJCQlzeXNfdmhhbmd1cAogMTEyCWkzODYJaWRsZQotMTEzCWkzODYJdm04Nm9sZAkJCXN5c192bTg2b2xkCQkJc3lzMzJfdm04Nl93YXJuaW5nCisxMTMJaTM4Ngl2bTg2b2xkCQkJc3lzX3ZtODZvbGQJCQlzeXNfbmlfc3lzY2FsbAogMTE0CWkzODYJd2FpdDQJCQlzeXNfd2FpdDQJCQljb21wYXRfc3lzX3dhaXQ0CiAxMTUJaTM4Nglzd2Fwb2ZmCQkJc3lzX3N3YXBvZmYKIDExNglpMzg2CXN5c2luZm8JCQlzeXNfc3lzaW5mbwkJCWNvbXBhdF9zeXNfc3lzaW5mbwpAQCAtMTcyLDcgKzE3Miw3IEBACiAxNjMJaTM4NgltcmVtYXAJCQlzeXNfbXJlbWFwCiAxNjQJaTM4NglzZXRyZXN1aWQJCXN5c19zZXRyZXN1aWQxNgogMTY1CWkzODYJZ2V0cmVzdWlkCQlzeXNfZ2V0cmVzdWlkMTYKLTE2NglpMzg2CXZtODYJCQlzeXNfdm04NgkJCXN5czMyX3ZtODZfd2FybmluZworMTY2CWkzODYJdm04NgkJCXN5c192bTg2CQkJc3lzX25pX3N5c2NhbGwKIDE2NwlpMzg2CXF1ZXJ5X21vZHVsZQogMTY4CWkzODYJcG9sbAkJCXN5c19wb2xsCiAxNjkJaTM4NgluZnNzZXJ2Y3RsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9zeXNjYWxscy9zeXNjYWxsXzY0LnRibCBiL2FyY2gveDg2L3N5c2NhbGxzL3N5c2NhbGxfNjQudGJsCmluZGV4IDhkNjU2ZmIuLjllZjMyZDUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3N5c2NhbGxzL3N5c2NhbGxfNjQudGJsCisrKyBiL2FyY2gveDg2L3N5c2NhbGxzL3N5c2NhbGxfNjQudGJsCkBAIC0xNzgsNyArMTc4LDcgQEAKIDE2OQljb21tb24JcmVib290CQkJc3lzX3JlYm9vdAogMTcwCWNvbW1vbglzZXRob3N0bmFtZQkJc3lzX3NldGhvc3RuYW1lCiAxNzEJY29tbW9uCXNldGRvbWFpbm5hbWUJCXN5c19zZXRkb21haW5uYW1lCi0xNzIJY29tbW9uCWlvcGwJCQlzdHViX2lvcGwKKzE3Mgljb21tb24JaW9wbAkJCXN5c19pb3BsCiAxNzMJY29tbW9uCWlvcGVybQkJCXN5c19pb3Blcm0KIDE3NAk2NAljcmVhdGVfbW9kdWxlCiAxNzUJY29tbW9uCWluaXRfbW9kdWxlCQlzeXNfaW5pdF9tb2R1bGUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL01ha2VmaWxlIGIvYXJjaC94ODYvdW0vTWFrZWZpbGUKaW5kZXggZWFmYTMyNC4uYWNiMzg0ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdW0vTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvdW0vTWFrZWZpbGUKQEAgLTIxLDcgKzIxLDYgQEAKIAogc3ViYXJjaC15ID0gLi4vbGliL3N0cmluZ18zMi5vIC4uL2xpYi9hdG9taWM2NF8zMi5vIC4uL2xpYi9hdG9taWM2NF9jeDhfMzIubwogc3ViYXJjaC0kKENPTkZJR19SV1NFTV9YQ0hHQUREX0FMR09SSVRITSkgKz0gLi4vbGliL3J3c2VtLm8KLXN1YmFyY2gtJChDT05GSUdfSElHSE1FTSkgKz0gLi4vbW0vaGlnaG1lbV8zMi5vCiAKIGVsc2UKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vYXNtL2JhcnJpZXIuaCBiL2FyY2gveDg2L3VtL2FzbS9iYXJyaWVyLmgKaW5kZXggMmQ3ZDlhMS4uN2U4YTFhNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdW0vYXNtL2JhcnJpZXIuaAorKysgYi9hcmNoL3g4Ni91bS9hc20vYmFycmllci5oCkBAIC0zNiwyMiArMzYsMTEgQEAKICNlbmRpZiAvKiBDT05GSUdfWDg2X1BQUk9fRkVOQ0UgKi8KICNkZWZpbmUgZG1hX3dtYigpCWJhcnJpZXIoKQogCi0jaWZkZWYgQ09ORklHX1NNUAotCi0jZGVmaW5lIHNtcF9tYigpCW1iKCkKLSNkZWZpbmUgc21wX3JtYigpCWRtYV9ybWIoKQotI2RlZmluZSBzbXBfd21iKCkJYmFycmllcigpCi0jZGVmaW5lIHNldF9tYih2YXIsIHZhbHVlKSBkbyB7ICh2b2lkKXhjaGcoJnZhciwgdmFsdWUpOyB9IHdoaWxlICgwKQotCi0jZWxzZSAvKiBDT05GSUdfU01QICovCi0KICNkZWZpbmUgc21wX21iKCkJYmFycmllcigpCiAjZGVmaW5lIHNtcF9ybWIoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX3dtYigpCWJhcnJpZXIoKQogI2RlZmluZSBzZXRfbWIodmFyLCB2YWx1ZSkgZG8geyB2YXIgPSB2YWx1ZTsgYmFycmllcigpOyB9IHdoaWxlICgwKQogCi0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCiAjZGVmaW5lIHJlYWRfYmFycmllcl9kZXBlbmRzKCkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkJZG8geyB9IHdoaWxlICgwKQogCkBAIC02NCw4ICs1Myw4IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCByZHRzY19iYXJyaWVyKHZvaWQpCiB7Ci0JYWx0ZXJuYXRpdmUoQVNNX05PUDMsICJtZmVuY2UiLCBYODZfRkVBVFVSRV9NRkVOQ0VfUkRUU0MpOwotCWFsdGVybmF0aXZlKEFTTV9OT1AzLCAibGZlbmNlIiwgWDg2X0ZFQVRVUkVfTEZFTkNFX1JEVFNDKTsKKwlhbHRlcm5hdGl2ZV8yKCIiLCAibWZlbmNlIiwgWDg2X0ZFQVRVUkVfTUZFTkNFX1JEVFNDLAorCQkJICAibGZlbmNlIiwgWDg2X0ZFQVRVUkVfTEZFTkNFX1JEVFNDKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9hc20vZWxmLmggYi9hcmNoL3g4Ni91bS9hc20vZWxmLmgKaW5kZXggMjVhMTAyMi4uMGE2NTZiNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdW0vYXNtL2VsZi5oCisrKyBiL2FyY2gveDg2L3VtL2FzbS9lbGYuaApAQCAtMjEwLDcgKzIxMCw3IEBACiAKICNkZWZpbmUgRUxGX0VYRUNfUEFHRVNJWkUgNDA5NgogCi0jZGVmaW5lIEVMRl9FVF9EWU5fQkFTRSAoMiAqIFRBU0tfU0laRSAvIDMpCisjZGVmaW5lIEVMRl9FVF9EWU5fQkFTRSAoVEFTS19TSVpFIC8gMyAqIDIpCiAKIGV4dGVybiBsb25nIGVsZl9hdXhfaHdjYXA7CiAjZGVmaW5lIEVMRl9IV0NBUCAoZWxmX2F1eF9od2NhcCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL2xkdC5jIGIvYXJjaC94ODYvdW0vbGR0LmMKaW5kZXggOGUwODE3Ni4uNWMwYjcxMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdW0vbGR0LmMKKysrIGIvYXJjaC94ODYvdW0vbGR0LmMKQEAgLTgsOSArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxvcy5oPgotI2luY2x1ZGUgPHByb2NfbW0uaD4KICNpbmNsdWRlIDxza2FzLmg+Ci0jaW5jbHVkZSA8c2thc19wdHJhY2UuaD4KICNpbmNsdWRlIDxzeXNkZXAvdGxzLmg+CiAKIGV4dGVybiBpbnQgbW9kaWZ5X2xkdChpbnQgZnVuYywgdm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCk7CkBAIC0xOSwxMDUgKzE3LDIwIEBACiAJCSAgICAgc3RydWN0IHVzZXJfZGVzYyAqZGVzYywgdm9pZCAqKmFkZHIsIGludCBkb25lKQogewogCWxvbmcgcmVzOwotCi0JaWYgKHByb2NfbW0pIHsKLQkJLyoKLQkJICogVGhpcyBpcyBhIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBjYXNlLCB0aGF0IHRoZSBtbSB0bwotCQkgKiBtb2RpZnkgaXNuJ3QgY3VycmVudC0+YWN0aXZlX21tLgotCQkgKiBJZiB0aGlzIGlzIGNhbGxlZCBkaXJlY3RseSBieSBtb2RpZnlfbGR0LAotCQkgKiAgICAgKGN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dC5za2FzLnUgPT0gbW1faWRwKQotCQkgKiB3aWxsIGJlIHRydWUuIFNvIG5vIGNhbGwgdG8gX19zd2l0Y2hfbW0obW1faWRwKSBpcyBkb25lLgotCQkgKiBJZiB0aGlzIGlzIGNhbGxlZCBpbiBjYXNlIG9mIGluaXRfbmV3X2xkdCBvciBQVFJBQ0VfTERULAotCQkgKiBtbV9pZHAgd29uJ3QgYmVsb25nIHRvIGN1cnJlbnQtPmFjdGl2ZV9tbSwgYnV0IGNoaWxkLT5tbS4KLQkJICogU28gd2UgbmVlZCB0byBzd2l0Y2ggY2hpbGQncyBtbSBpbnRvIG91ciB1c2Vyc3BhY2UsIHRoZW4KLQkJICogbGF0ZXIgc3dpdGNoIGJhY2suCi0JCSAqCi0JCSAqIE5vdGU6IEknbSB1bnN1cmU6IHNob3VsZCBpbnRlcnJ1cHRzIGJlIGRpc2FibGVkIGhlcmU/Ci0JCSAqLwotCQlpZiAoIWN1cnJlbnQtPmFjdGl2ZV9tbSB8fCBjdXJyZW50LT5hY3RpdmVfbW0gPT0gJmluaXRfbW0gfHwKLQkJICAgIG1tX2lkcCAhPSAmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LmlkKQotCQkJX19zd2l0Y2hfbW0obW1faWRwKTsKKwl2b2lkICpzdHViX2FkZHI7CisJcmVzID0gc3lzY2FsbF9zdHViX2RhdGEobW1faWRwLCAodW5zaWduZWQgbG9uZyAqKWRlc2MsCisJCQkJKHNpemVvZigqZGVzYykgKyBzaXplb2YobG9uZykgLSAxKSAmCisJCQkJICAgIH4oc2l6ZW9mKGxvbmcpIC0gMSksCisJCQkJYWRkciwgJnN0dWJfYWRkcik7CisJaWYgKCFyZXMpIHsKKwkJdW5zaWduZWQgbG9uZyBhcmdzW10gPSB7IGZ1bmMsCisJCQkJCSAodW5zaWduZWQgbG9uZylzdHViX2FkZHIsCisJCQkJCSBzaXplb2YoKmRlc2MpLAorCQkJCQkgMCwgMCwgMCB9OworCQlyZXMgPSBydW5fc3lzY2FsbF9zdHViKG1tX2lkcCwgX19OUl9tb2RpZnlfbGR0LCBhcmdzLAorCQkJCSAgICAgICAwLCBhZGRyLCBkb25lKTsKIAl9CiAKLQlpZiAocHRyYWNlX2xkdCkgewotCQlzdHJ1Y3QgcHRyYWNlX2xkdCBsZHRfb3AgPSAoc3RydWN0IHB0cmFjZV9sZHQpIHsKLQkJCS5mdW5jID0gZnVuYywKLQkJCS5wdHIgPSBkZXNjLAotCQkJLmJ5dGVjb3VudCA9IHNpemVvZigqZGVzYyl9OwotCQl1MzIgY3B1OwotCQlpbnQgcGlkOwotCi0JCWlmICghcHJvY19tbSkKLQkJCXBpZCA9IG1tX2lkcC0+dS5waWQ7Ci0JCWVsc2UgewotCQkJY3B1ID0gZ2V0X2NwdSgpOwotCQkJcGlkID0gdXNlcnNwYWNlX3BpZFtjcHVdOwotCQl9Ci0KLQkJcmVzID0gb3NfcHRyYWNlX2xkdChwaWQsIDAsICh1bnNpZ25lZCBsb25nKSAmbGR0X29wKTsKLQotCQlpZiAocHJvY19tbSkKLQkJCXB1dF9jcHUoKTsKLQl9Ci0JZWxzZSB7Ci0JCXZvaWQgKnN0dWJfYWRkcjsKLQkJcmVzID0gc3lzY2FsbF9zdHViX2RhdGEobW1faWRwLCAodW5zaWduZWQgbG9uZyAqKWRlc2MsCi0JCQkJCShzaXplb2YoKmRlc2MpICsgc2l6ZW9mKGxvbmcpIC0gMSkgJgotCQkJCQkgICAgfihzaXplb2YobG9uZykgLSAxKSwKLQkJCQkJYWRkciwgJnN0dWJfYWRkcik7Ci0JCWlmICghcmVzKSB7Ci0JCQl1bnNpZ25lZCBsb25nIGFyZ3NbXSA9IHsgZnVuYywKLQkJCQkJCSAodW5zaWduZWQgbG9uZylzdHViX2FkZHIsCi0JCQkJCQkgc2l6ZW9mKCpkZXNjKSwKLQkJCQkJCSAwLCAwLCAwIH07Ci0JCQlyZXMgPSBydW5fc3lzY2FsbF9zdHViKG1tX2lkcCwgX19OUl9tb2RpZnlfbGR0LCBhcmdzLAotCQkJCQkgICAgICAgMCwgYWRkciwgZG9uZSk7Ci0JCX0KLQl9Ci0KLQlpZiAocHJvY19tbSkgewotCQkvKgotCQkgKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFydCBvZiBzcGVjaWFsIGhhbmRsaW5nLCB0aGF0IG1ha2VzCi0JCSAqIFBUUkFDRV9MRFQgcG9zc2libGUgdG8gaW1wbGVtZW50LgotCQkgKi8KLQkJaWYgKGN1cnJlbnQtPmFjdGl2ZV9tbSAmJiBjdXJyZW50LT5hY3RpdmVfbW0gIT0gJmluaXRfbW0gJiYKLQkJICAgIG1tX2lkcCAhPSAmY3VycmVudC0+YWN0aXZlX21tLT5jb250ZXh0LmlkKQotCQkJX19zd2l0Y2hfbW0oJmN1cnJlbnQtPmFjdGl2ZV9tbS0+Y29udGV4dC5pZCk7Ci0JfQotCi0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGxvbmcgcmVhZF9sZHRfZnJvbV9ob3N0KHZvaWQgX191c2VyICogcHRyLCB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudCkKLXsKLQlpbnQgcmVzLCBuOwotCXN0cnVjdCBwdHJhY2VfbGR0IHB0cmFjZV9sZHQgPSAoc3RydWN0IHB0cmFjZV9sZHQpIHsKLQkJCS5mdW5jID0gMCwKLQkJCS5ieXRlY291bnQgPSBieXRlY291bnQsCi0JCQkucHRyID0ga21hbGxvYyhieXRlY291bnQsIEdGUF9LRVJORUwpfTsKLQl1MzIgY3B1OwotCi0JaWYgKHB0cmFjZV9sZHQucHRyID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyoKLQkgKiBUaGlzIGlzIGNhbGxlZCBmcm9tIHN5c19tb2RpZnlfbGR0IG9ubHksIHNvIHVzZXJzcGFjZV9waWQgZ2l2ZXMKLQkgKiB1cyB0aGUgcmlnaHQgbnVtYmVyCi0JICovCi0KLQljcHUgPSBnZXRfY3B1KCk7Ci0JcmVzID0gb3NfcHRyYWNlX2xkdCh1c2Vyc3BhY2VfcGlkW2NwdV0sIDAsICh1bnNpZ25lZCBsb25nKSAmcHRyYWNlX2xkdCk7Ci0JcHV0X2NwdSgpOwotCWlmIChyZXMgPCAwKQotCQlnb3RvIG91dDsKLQotCW4gPSBjb3B5X3RvX3VzZXIocHRyLCBwdHJhY2VfbGR0LnB0ciwgcmVzKTsKLQlpZiAobiAhPSAwKQotCQlyZXMgPSAtRUZBVUxUOwotCi0gIG91dDoKLQlrZnJlZShwdHJhY2VfbGR0LnB0cik7Ci0KIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xNDUsOSArNTgsNiBAQAogCQlieXRlY291bnQgPSBMRFRfRU5UUllfU0laRSpMRFRfRU5UUklFUzsKIAllcnIgPSBieXRlY291bnQ7CiAKLQlpZiAocHRyYWNlX2xkdCkKLQkJcmV0dXJuIHJlYWRfbGR0X2Zyb21faG9zdChwdHIsIGJ5dGVjb3VudCk7Ci0KIAltdXRleF9sb2NrKCZsZHQtPmxvY2spOwogCWlmIChsZHQtPmVudHJ5X2NvdW50IDw9IExEVF9ESVJFQ1RfRU5UUklFUykgewogCQlzaXplID0gTERUX0VOVFJZX1NJWkUqTERUX0RJUkVDVF9FTlRSSUVTOwpAQCAtMjI5LDE3ICsxMzksMTEgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAotCWlmICghcHRyYWNlX2xkdCkKLQkJbXV0ZXhfbG9jaygmbGR0LT5sb2NrKTsKKwltdXRleF9sb2NrKCZsZHQtPmxvY2spOwogCiAJZXJyID0gd3JpdGVfbGR0X2VudHJ5KG1tX2lkcCwgZnVuYywgJmxkdF9pbmZvLCAmYWRkciwgMSk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfdW5sb2NrOwotCWVsc2UgaWYgKHB0cmFjZV9sZHQpIHsKLQkJLyogV2l0aCBQVFJBQ0VfTERUIGF2YWlsYWJsZSwgdGhpcyBpcyB1c2VkIGFzIGEgZmxhZyBvbmx5ICovCi0JCWxkdC0+ZW50cnlfY291bnQgPSAxOwotCQlnb3RvIG91dDsKLQl9CiAKIAlpZiAobGR0X2luZm8uZW50cnlfbnVtYmVyID49IGxkdC0+ZW50cnlfY291bnQgJiYKIAkgICAgbGR0X2luZm8uZW50cnlfbnVtYmVyID49IExEVF9ESVJFQ1RfRU5UUklFUykgewpAQCAtMzkzLDkxICsyOTcsNTYgQEAKIAlpbnQgaTsKIAlsb25nIHBhZ2UsIGVycj0wOwogCXZvaWQgKmFkZHIgPSBOVUxMOwotCXN0cnVjdCBwcm9jX21tX29wIGNvcHk7CiAKIAotCWlmICghcHRyYWNlX2xkdCkKLQkJbXV0ZXhfaW5pdCgmbmV3X21tLT5hcmNoLmxkdC5sb2NrKTsKKwltdXRleF9pbml0KCZuZXdfbW0tPmFyY2gubGR0LmxvY2spOwogCiAJaWYgKCFmcm9tX21tKSB7CiAJCW1lbXNldCgmZGVzYywgMCwgc2l6ZW9mKGRlc2MpKTsKIAkJLyoKLQkJICogV2UgaGF2ZSB0byBpbml0aWFsaXplIGEgY2xlYW4gbGR0LgorCQkgKiBOb3cgd2UgdHJ5IHRvIHJldHJpZXZlIGluZm8gYWJvdXQgdGhlIGxkdCwgd2UKKwkJICogaW5oZXJpdGVkIGZyb20gdGhlIGhvc3QuIEFsbCBsZHQtZW50cmllcyBmb3VuZAorCQkgKiB3aWxsIGJlIHJlc2V0IGluIHRoZSBmb2xsb3dpbmcgbG9vcAogCQkgKi8KLQkJaWYgKHByb2NfbW0pIHsKLQkJCS8qCi0JCQkgKiBJZiB0aGUgbmV3IG1tIHdhcyBjcmVhdGVkIHVzaW5nIHByb2NfbW0sIGhvc3QncwotCQkJICogZGVmYXVsdC1sZHQgY3VycmVudGx5IGlzIGFzc2lnbmVkLCB3aGljaCBub3JtYWxseQotCQkJICogY29udGFpbnMgdGhlIGNhbGwtZ2F0ZXMgZm9yIGxjYWxsNyBhbmQgbGNhbGwyNy4KLQkJCSAqIFRvIHJlbW92ZSB0aGVzZSBnYXRlcywgd2Ugc2ltcGx5IHdyaXRlIGFuIGVtcHR5Ci0JCQkgKiBlbnRyeSBhcyBudW1iZXIgMCB0byB0aGUgaG9zdC4KLQkJCSAqLwotCQkJZXJyID0gd3JpdGVfbGR0X2VudHJ5KCZuZXdfbW0tPmlkLCAxLCAmZGVzYywgJmFkZHIsIDEpOwotCQl9Ci0JCWVsc2V7Ci0JCQkvKgotCQkJICogTm93IHdlIHRyeSB0byByZXRyaWV2ZSBpbmZvIGFib3V0IHRoZSBsZHQsIHdlCi0JCQkgKiBpbmhlcml0ZWQgZnJvbSB0aGUgaG9zdC4gQWxsIGxkdC1lbnRyaWVzIGZvdW5kCi0JCQkgKiB3aWxsIGJlIHJlc2V0IGluIHRoZSBmb2xsb3dpbmcgbG9vcAotCQkJICovCi0JCQlsZHRfZ2V0X2hvc3RfaW5mbygpOwotCQkJZm9yIChudW1fcD1ob3N0X2xkdF9lbnRyaWVzOyAqbnVtX3AgIT0gLTE7IG51bV9wKyspIHsKLQkJCQlkZXNjLmVudHJ5X251bWJlciA9ICpudW1fcDsKLQkJCQllcnIgPSB3cml0ZV9sZHRfZW50cnkoJm5ld19tbS0+aWQsIDEsICZkZXNjLAotCQkJCQkJICAgICAgJmFkZHIsICoobnVtX3AgKyAxKSA9PSAtMSk7Ci0JCQkJaWYgKGVycikKLQkJCQkJYnJlYWs7Ci0JCQl9CisJCWxkdF9nZXRfaG9zdF9pbmZvKCk7CisJCWZvciAobnVtX3A9aG9zdF9sZHRfZW50cmllczsgKm51bV9wICE9IC0xOyBudW1fcCsrKSB7CisJCQlkZXNjLmVudHJ5X251bWJlciA9ICpudW1fcDsKKwkJCWVyciA9IHdyaXRlX2xkdF9lbnRyeSgmbmV3X21tLT5pZCwgMSwgJmRlc2MsCisJCQkJCSAgICAgICZhZGRyLCAqKG51bV9wICsgMSkgPT0gLTEpOworCQkJaWYgKGVycikKKwkJCQlicmVhazsKIAkJfQogCQluZXdfbW0tPmFyY2gubGR0LmVudHJ5X2NvdW50ID0gMDsKIAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAocHJvY19tbSkgewotCQkvKgotCQkgKiBXZSBoYXZlIGEgdmFsaWQgZnJvbV9tbSwgc28gd2Ugbm93IGhhdmUgdG8gY29weSB0aGUgTERUIG9mCi0JCSAqIGZyb21fbW0gdG8gbmV3X21tLCBiZWNhdXNlIHVzaW5nIHByb2NfbW0gYW4gbmV3IG1tIHdpdGgKLQkJICogYW4gZW1wdHkvZGVmYXVsdCBMRFQgd2FzIGNyZWF0ZWQgaW4gbmV3X21tKCkKLQkJICovCi0JCWNvcHkgPSAoKHN0cnVjdCBwcm9jX21tX29wKSB7IC5vcCAJPSBNTV9DT1BZX1NFR01FTlRTLAotCQkJCQkgICAgICAudSAJPQotCQkJCQkgICAgICB7IC5jb3B5X3NlZ21lbnRzID0KLQkJCQkJCQlmcm9tX21tLT5pZC51Lm1tX2ZkIH0gfSApOwotCQlpID0gb3Nfd3JpdGVfZmlsZShuZXdfbW0tPmlkLnUubW1fZmQsICZjb3B5LCBzaXplb2YoY29weSkpOwotCQlpZiAoaSAhPSBzaXplb2YoY29weSkpCi0JCQlwcmludGsoS0VSTl9FUlIgIm5ld19tbSA6IC9wcm9jL21tIGNvcHlfc2VnbWVudHMgIgotCQkJICAgICAgICJmYWlsZWQsIGVyciA9ICVkXG4iLCAtaSk7Ci0JfQotCi0JaWYgKCFwdHJhY2VfbGR0KSB7Ci0JCS8qCi0JCSAqIE91ciBsb2NhbCBMRFQgaXMgdXNlZCB0byBzdXBwbHkgdGhlIGRhdGEgZm9yCi0JCSAqIG1vZGlmeV9sZHQoUkVBRExEVCksIGlmIFBUUkFDRV9MRFQgaXNuJ3QgYXZhaWxhYmxlLAotCQkgKiBpLmUuLCB3ZSBoYXZlIHRvIHVzZSB0aGUgc3R1YiBmb3IgbW9kaWZ5X2xkdCwgd2hpY2gKLQkJICogY2FuJ3QgaGFuZGxlIHRoZSBiaWcgcmVhZCBidWZmZXIgb2YgdXAgdG8gNjRrQi4KLQkJICovCi0JCW11dGV4X2xvY2soJmZyb21fbW0tPmFyY2gubGR0LmxvY2spOwotCQlpZiAoZnJvbV9tbS0+YXJjaC5sZHQuZW50cnlfY291bnQgPD0gTERUX0RJUkVDVF9FTlRSSUVTKQotCQkJbWVtY3B5KG5ld19tbS0+YXJjaC5sZHQudS5lbnRyaWVzLCBmcm9tX21tLT5hcmNoLmxkdC51LmVudHJpZXMsCi0JCQkgICAgICAgc2l6ZW9mKG5ld19tbS0+YXJjaC5sZHQudS5lbnRyaWVzKSk7Ci0JCWVsc2UgewotCQkJaSA9IGZyb21fbW0tPmFyY2gubGR0LmVudHJ5X2NvdW50IC8gTERUX0VOVFJJRVNfUEVSX1BBR0U7Ci0JCQl3aGlsZSAoaS0tPjApIHsKLQkJCQlwYWdlID0gX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUx8X19HRlBfWkVSTyk7Ci0JCQkJaWYgKCFwYWdlKSB7Ci0JCQkJCWVyciA9IC1FTk9NRU07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQluZXdfbW0tPmFyY2gubGR0LnUucGFnZXNbaV0gPQotCQkJCQkoc3RydWN0IGxkdF9lbnRyeSAqKSBwYWdlOwotCQkJCW1lbWNweShuZXdfbW0tPmFyY2gubGR0LnUucGFnZXNbaV0sCi0JCQkJICAgICAgIGZyb21fbW0tPmFyY2gubGR0LnUucGFnZXNbaV0sIFBBR0VfU0laRSk7CisJLyoKKwkgKiBPdXIgbG9jYWwgTERUIGlzIHVzZWQgdG8gc3VwcGx5IHRoZSBkYXRhIGZvcgorCSAqIG1vZGlmeV9sZHQoUkVBRExEVCksIGlmIFBUUkFDRV9MRFQgaXNuJ3QgYXZhaWxhYmxlLAorCSAqIGkuZS4sIHdlIGhhdmUgdG8gdXNlIHRoZSBzdHViIGZvciBtb2RpZnlfbGR0LCB3aGljaAorCSAqIGNhbid0IGhhbmRsZSB0aGUgYmlnIHJlYWQgYnVmZmVyIG9mIHVwIHRvIDY0a0IuCisJICovCisJbXV0ZXhfbG9jaygmZnJvbV9tbS0+YXJjaC5sZHQubG9jayk7CisJaWYgKGZyb21fbW0tPmFyY2gubGR0LmVudHJ5X2NvdW50IDw9IExEVF9ESVJFQ1RfRU5UUklFUykKKwkJbWVtY3B5KG5ld19tbS0+YXJjaC5sZHQudS5lbnRyaWVzLCBmcm9tX21tLT5hcmNoLmxkdC51LmVudHJpZXMsCisJCSAgICAgICBzaXplb2YobmV3X21tLT5hcmNoLmxkdC51LmVudHJpZXMpKTsKKwllbHNlIHsKKwkJaSA9IGZyb21fbW0tPmFyY2gubGR0LmVudHJ5X2NvdW50IC8gTERUX0VOVFJJRVNfUEVSX1BBR0U7CisJCXdoaWxlIChpLS0+MCkgeworCQkJcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMfF9fR0ZQX1pFUk8pOworCQkJaWYgKCFwYWdlKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlicmVhazsKIAkJCX0KKwkJCW5ld19tbS0+YXJjaC5sZHQudS5wYWdlc1tpXSA9CisJCQkJKHN0cnVjdCBsZHRfZW50cnkgKikgcGFnZTsKKwkJCW1lbWNweShuZXdfbW0tPmFyY2gubGR0LnUucGFnZXNbaV0sCisJCQkgICAgICAgZnJvbV9tbS0+YXJjaC5sZHQudS5wYWdlc1tpXSwgUEFHRV9TSVpFKTsKIAkJfQotCQluZXdfbW0tPmFyY2gubGR0LmVudHJ5X2NvdW50ID0gZnJvbV9tbS0+YXJjaC5sZHQuZW50cnlfY291bnQ7Ci0JCW11dGV4X3VubG9jaygmZnJvbV9tbS0+YXJjaC5sZHQubG9jayk7CiAJfQorCW5ld19tbS0+YXJjaC5sZHQuZW50cnlfY291bnQgPSBmcm9tX21tLT5hcmNoLmxkdC5lbnRyeV9jb3VudDsKKwltdXRleF91bmxvY2soJmZyb21fbW0tPmFyY2gubGR0LmxvY2spOwogCiAgICAgb3V0OgogCXJldHVybiBlcnI7CkBAIC00ODgsNyArMzU3LDcgQEAKIHsKIAlpbnQgaTsKIAotCWlmICghcHRyYWNlX2xkdCAmJiBtbS0+YXJjaC5sZHQuZW50cnlfY291bnQgPiBMRFRfRElSRUNUX0VOVFJJRVMpIHsKKwlpZiAobW0tPmFyY2gubGR0LmVudHJ5X2NvdW50ID4gTERUX0RJUkVDVF9FTlRSSUVTKSB7CiAJCWkgPSBtbS0+YXJjaC5sZHQuZW50cnlfY291bnQgLyBMRFRfRU5UUklFU19QRVJfUEFHRTsKIAkJd2hpbGUgKGktLSA+IDApCiAJCQlmcmVlX3BhZ2UoKGxvbmcpIG1tLT5hcmNoLmxkdC51LnBhZ2VzW2ldKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvXzMyLmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2ZhdWx0aW5mb18zMi5oCmluZGV4IGEyNjA4NmIuLmI2ZjI0MzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvXzMyLmgKKysrIGIvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9mYXVsdGluZm9fMzIuaApAQCAtMjcsOSArMjcsNiBAQAogLyogVGhpcyBpcyBQYWdlIEZhdWx0ICovCiAjZGVmaW5lIFNFR1ZfSVNfRklYQUJMRShmaSkJKChmaSktPnRyYXBfbm8gPT0gMTQpCiAKLS8qIFNLQVMzIGhhcyBubyB0cmFwX25vIG9uIGkzODYsIGJ1dCBnZXRfc2thc19mYXVsdGluZm8oKSBzZXRzIGl0IHRvIDAuICovCi0jZGVmaW5lIFNFR1ZfTUFZQkVfRklYQUJMRShmaSkJKChmaSktPnRyYXBfbm8gPT0gMCAmJiBwdHJhY2VfZmF1bHRpbmZvKQotCiAjZGVmaW5lIFBUUkFDRV9GVUxMX0ZBVUxUSU5GTyAwCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9mYXVsdGluZm9fNjQuaCBiL2FyY2gveDg2L3VtL3NoYXJlZC9zeXNkZXAvZmF1bHRpbmZvXzY0LmgKaW5kZXggZjgxMWNiZS4uZWU4OGY4OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9mYXVsdGluZm9fNjQuaAorKysgYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL2ZhdWx0aW5mb182NC5oCkBAIC0yNyw5ICsyNyw2IEBACiAvKiBUaGlzIGlzIFBhZ2UgRmF1bHQgKi8KICNkZWZpbmUgU0VHVl9JU19GSVhBQkxFKGZpKQkoKGZpKS0+dHJhcF9ubyA9PSAxNCkKIAotLyogTm8gYnJva2VuIFNLQVMgQVBJLCB3aGljaCBkb2Vzbid0IHBhc3MgdHJhcF9ubywgaGVyZS4gKi8KLSNkZWZpbmUgU0VHVl9NQVlCRV9GSVhBQkxFKGZpKQkwCi0KICNkZWZpbmUgUFRSQUNFX0ZVTExfRkFVTFRJTkZPIDEKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3NrYXNfcHRyYWNlLmggYi9hcmNoL3g4Ni91bS9zaGFyZWQvc3lzZGVwL3NrYXNfcHRyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1M2ZlYmUuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvdW0vc2hhcmVkL3N5c2RlcC9za2FzX3B0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMSwgMjAwMiBKZWZmIERpa2UgKGpkaWtlQGthcmF5YS5jb20pCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgR1BMCi0gKi8KLQotI2lmbmRlZiBfX1NZU0RFUF9YODZfU0tBU19QVFJBQ0VfSAotI2RlZmluZSBfX1NZU0RFUF9YODZfU0tBU19QVFJBQ0VfSAotCi1zdHJ1Y3QgcHRyYWNlX2ZhdWx0aW5mbyB7Ci0gICAgICAgIGludCBpc193cml0ZTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBhZGRyOwotfTsKLQotc3RydWN0IHB0cmFjZV9sZHQgewotICAgICAgICBpbnQgZnVuYzsKLSAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICB1bnNpZ25lZCBsb25nIGJ5dGVjb3VudDsKLX07Ci0KLSNkZWZpbmUgUFRSQUNFX0xEVCA1NAotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3VtL3NpZ25hbC5jIGIvYXJjaC94ODYvdW0vc2lnbmFsLmMKaW5kZXggMGM4YzMyYi4uNTkyNDkxZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdW0vc2lnbmFsLmMKKysrIGIvYXJjaC94ODYvdW0vc2lnbmFsLmMKQEAgLTU0OSwxMyArNTQ5LDYgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JLyogU2V0IHVwIHJlZ2lzdGVycyBmb3Igc2lnbmFsIGhhbmRsZXIgKi8KLQl7Ci0JCXN0cnVjdCBleGVjX2RvbWFpbiAqZWQgPSBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluOwotCQlpZiAodW5saWtlbHkoZWQgJiYgZWQtPnNpZ25hbF9pbnZtYXAgJiYgc2lnIDwgMzIpKQotCQkJc2lnID0gZWQtPnNpZ25hbF9pbnZtYXBbc2lnXTsKLQl9Ci0KIAlQVF9SRUdTX1NQKHJlZ3MpID0gKHVuc2lnbmVkIGxvbmcpIGZyYW1lOwogCVBUX1JFR1NfREkocmVncykgPSBzaWc7CiAJLyogSW4gY2FzZSB0aGUgc2lnbmFsIGhhbmRsZXIgd2FzIGRlY2xhcmVkIHdpdGhvdXQgcHJvdG90eXBlcyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdW0vc3lzX2NhbGxfdGFibGVfNjQuYyBiL2FyY2gveDg2L3VtL3N5c19jYWxsX3RhYmxlXzY0LmMKaW5kZXggNWNkZmE5ZC4uYTc1ZDg3MDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3VtL3N5c19jYWxsX3RhYmxlXzY0LmMKKysrIGIvYXJjaC94ODYvdW0vc3lzX2NhbGxfdGFibGVfNjQuYwpAQCAtMTYsNyArMTYsNyBAQAogICovCiAKIC8qIE5vdCBnb2luZyB0byBiZSBpbXBsZW1lbnRlZCBieSBVTUwsIHNpbmNlIHdlIGhhdmUgbm8gaGFyZHdhcmUuICovCi0jZGVmaW5lIHN0dWJfaW9wbCBzeXNfbmlfc3lzY2FsbAorI2RlZmluZSBzeXNfaW9wbCBzeXNfbmlfc3lzY2FsbAogI2RlZmluZSBzeXNfaW9wZXJtIHN5c19uaV9zeXNjYWxsCiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL01ha2VmaWxlIGIvYXJjaC94ODYvdmRzby9NYWtlZmlsZQppbmRleCA3YjliZTk4Li4yNzVhM2E4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3Zkc28vTWFrZWZpbGUKQEAgLTUxLDcgKzUxLDcgQEAKICQob2JqKS92ZHNvNjQuc28uZGJnOiAkKHNyYykvdmRzby5sZHMgJCh2b2JqcykgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCx2ZHNvKQogCi1IT1NUX0VYVFJBQ0ZMQUdTICs9IC1JJChzcmN0cmVlKS90b29scy9pbmNsdWRlCitIT1NUX0VYVFJBQ0ZMQUdTICs9IC1JJChzcmN0cmVlKS90b29scy9pbmNsdWRlIC1JJChzcmN0cmVlKS9pbmNsdWRlL3VhcGkKIGhvc3Rwcm9ncy15CQkJKz0gdmRzbzJjCiAKIHF1aWV0X2NtZF92ZHNvMmMgPSBWRFNPMkMgICRACkBAIC0yMDYsNCArMjA2LDQgQEAKIFBIT05ZICs9IHZkc29faW5zdGFsbCAkKHZkc29faW1nX2luc3R0YXJnZXRzKQogdmRzb19pbnN0YWxsOiAkKHZkc29faW1nX2luc3R0YXJnZXRzKSBGT1JDRQogCi1jbGVhbi1maWxlcyA6PSB2ZHNvMzItc3lzY2FsbCogdmRzbzMyLXN5c2VudGVyKiB2ZHNvMzItaW50ODAqIHZkc282NCoKK2NsZWFuLWZpbGVzIDo9IHZkc28zMi1zeXNjYWxsKiB2ZHNvMzItc3lzZW50ZXIqIHZkc28zMi1pbnQ4MCogdmRzbzY0KiB2ZHNvLWltYWdlLSouYyB2ZHNveDMyLnNvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92Y2xvY2tfZ2V0dGltZS5jIGIvYXJjaC94ODYvdmRzby92Y2xvY2tfZ2V0dGltZS5jCmluZGV4IDk3OTMzMjIuLjQwZDI0NzMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vdmNsb2NrX2dldHRpbWUuYworKysgYi9hcmNoL3g4Ni92ZHNvL3ZjbG9ja19nZXR0aW1lLmMKQEAgLTgyLDE4ICs4MiwxNSBAQAogCWN5Y2xlX3QgcmV0OwogCXU2NCBsYXN0OwogCXUzMiB2ZXJzaW9uOworCXUzMiBtaWdyYXRlX2NvdW50OwogCXU4IGZsYWdzOwogCXVuc2lnbmVkIGNwdSwgY3B1MTsKIAogCiAJLyoKLQkgKiBOb3RlOiBoeXBlcnZpc29yIG11c3QgZ3VhcmFudGVlIHRoYXQ6Ci0JICogMS4gY3B1IElEIG51bWJlciBtYXBzIDE6MSB0byBwZXItQ1BVIHB2Y2xvY2sgdGltZSBpbmZvLgotCSAqIDIuIHRoYXQgcGVyLUNQVSBwdmNsb2NrIHRpbWUgaW5mbyBpcyB1cGRhdGVkIGlmIHRoZQotCSAqICAgIHVuZGVybHlpbmcgQ1BVIGNoYW5nZXMuCi0JICogMy4gdGhhdCB2ZXJzaW9uIGlzIGluY3JlYXNlZCB3aGVuZXZlciB1bmRlcmx5aW5nIENQVQotCSAqICAgIGNoYW5nZXMuCi0JICoKKwkgKiBXaGVuIGxvb3BpbmcgdG8gZ2V0IGEgY29uc2lzdGVudCAodGltZS1pbmZvLCB0c2MpIHBhaXIsIHdlCisJICogYWxzbyBuZWVkIHRvIGRlYWwgd2l0aCB0aGUgcG9zc2liaWxpdHkgd2UgY2FuIHN3aXRjaCB2Y3B1cywKKwkgKiBzbyBtYWtlIHN1cmUgd2UgYWx3YXlzIHJlLWZldGNoIHRpbWUtaW5mbyBmb3IgdGhlIGN1cnJlbnQgdmNwdS4KIAkgKi8KIAlkbyB7CiAJCWNwdSA9IF9fZ2V0Y3B1KCkgJiBWR0VUQ1BVX0NQVV9NQVNLOwpAQCAtMTAyLDIwICs5OSwyNyBAQAogCQkgKiBfX2dldGNwdSgpIGNhbGxzIChHbGViKS4KIAkJICovCiAKLQkJcHZ0aSA9IGdldF9wdnRpKGNwdSk7CisJCS8qIE1ha2Ugc3VyZSBtaWdyYXRlX2NvdW50IHdpbGwgY2hhbmdlIGlmIHdlIGxlYXZlIHRoZSBWQ1BVLiAqLworCQlkbyB7CisJCQlwdnRpID0gZ2V0X3B2dGkoY3B1KTsKKwkJCW1pZ3JhdGVfY291bnQgPSBwdnRpLT5taWdyYXRlX2NvdW50OworCisJCQljcHUxID0gY3B1OworCQkJY3B1ID0gX19nZXRjcHUoKSAmIFZHRVRDUFVfQ1BVX01BU0s7CisJCX0gd2hpbGUgKHVubGlrZWx5KGNwdSAhPSBjcHUxKSk7CiAKIAkJdmVyc2lvbiA9IF9fcHZjbG9ja19yZWFkX2N5Y2xlcygmcHZ0aS0+cHZ0aSwgJnJldCwgJmZsYWdzKTsKIAogCQkvKgogCQkgKiBUZXN0IHdlJ3JlIHN0aWxsIG9uIHRoZSBjcHUgYXMgd2VsbCBhcyB0aGUgdmVyc2lvbi4KLQkJICogV2UgY291bGQgaGF2ZSBiZWVuIG1pZ3JhdGVkIGp1c3QgYWZ0ZXIgdGhlIGZpcnN0Ci0JCSAqIHZnZXRjcHUgYnV0IGJlZm9yZSBmZXRjaGluZyB0aGUgdmVyc2lvbiwgc28gd2UKLQkJICogd291bGRuJ3Qgbm90aWNlIGEgdmVyc2lvbiBjaGFuZ2UuCisJCSAqIC0gV2UgbXVzdCByZWFkIFRTQyBvZiBwdnRpJ3MgVkNQVS4KKwkJICogLSBLVk0gZG9lc24ndCBmb2xsb3cgdGhlIHZlcnNpb25pbmcgcHJvdG9jb2wsIHNvIGRhdGEgY291bGQKKwkJICogICBjaGFuZ2UgYmVmb3JlIHZlcnNpb24gaWYgd2UgbGVmdCB0aGUgVkNQVS4KIAkJICovCi0JCWNwdTEgPSBfX2dldGNwdSgpICYgVkdFVENQVV9DUFVfTUFTSzsKLQl9IHdoaWxlICh1bmxpa2VseShjcHUgIT0gY3B1MSB8fAotCQkJICAocHZ0aS0+cHZ0aS52ZXJzaW9uICYgMSkgfHwKLQkJCSAgcHZ0aS0+cHZ0aS52ZXJzaW9uICE9IHZlcnNpb24pKTsKKwkJc21wX3JtYigpOworCX0gd2hpbGUgKHVubGlrZWx5KChwdnRpLT5wdnRpLnZlcnNpb24gJiAxKSB8fAorCQkJICBwdnRpLT5wdnRpLnZlcnNpb24gIT0gdmVyc2lvbiB8fAorCQkJICBwdnRpLT5taWdyYXRlX2NvdW50ICE9IG1pZ3JhdGVfY291bnQpKTsKIAogCWlmICh1bmxpa2VseSghKGZsYWdzICYgUFZDTE9DS19UU0NfU1RBQkxFX0JJVCkpKQogCQkqbW9kZSA9IFZDTE9DS19OT05FOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvdmRzby92ZHNvMzIvc2lncmV0dXJuLlMgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi9zaWdyZXR1cm4uUwppbmRleCAzMTc3NmQwLi5kN2VjNGUyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3Zkc28zMi9zaWdyZXR1cm4uUworKysgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi9zaWdyZXR1cm4uUwpAQCAtMTcsNiArMTcsNyBAQAogCS50ZXh0CiAJLmdsb2JsIF9fa2VybmVsX3NpZ3JldHVybgogCS50eXBlIF9fa2VybmVsX3NpZ3JldHVybixAZnVuY3Rpb24KKwlub3AgLyogdGhpcyBndXkgaXMgbmVlZGVkIGZvciAuTFNUQVJURkRFRExTSTEgYmVsb3cgKHdhdGNoIGZvciBIQUNLKSAqLwogCUFMSUdOCiBfX2tlcm5lbF9zaWdyZXR1cm46CiAuTFNUQVJUX3NpZ3JldHVybjoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdmRzbzMyL3N5c2NhbGwuUyBiL2FyY2gveDg2L3Zkc28vdmRzbzMyL3N5c2NhbGwuUwppbmRleCA1NDE1YjU2Li42YjI4NmJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3Zkc28zMi9zeXNjYWxsLlMKKysrIGIvYXJjaC94ODYvdmRzby92ZHNvMzIvc3lzY2FsbC5TCkBAIC0xOSw4ICsxOSw2IEBACiAuTHB1c2hfZWJwOgogCW1vdmwJJWVjeCwgJWVicAogCXN5c2NhbGwKLQltb3ZsCSRfX1VTRVIzMl9EUywgJWVjeAotCW1vdmwJJWVjeCwgJXNzCiAJbW92bAklZWJwLCAlZWN4CiAJcG9wbAklZWJwCiAuTHBvcF9lYnA6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKaW5kZXggNTI0MGY1Ni4uODE2NjVjOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCisrKyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwpAQCAtOTEyLDYgKzkxMiw3IEBACiAJbWNzID0geGVuX21jX2VudHJ5KDApOwogCU1VTFRJX3N0YWNrX3N3aXRjaChtY3MubWMsIF9fS0VSTkVMX0RTLCB0aHJlYWQtPnNwMCk7CiAJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfQ1BVKTsKKwl0c3MtPng4Nl90c3Muc3AwID0gdGhyZWFkLT5zcDA7CiB9CiAKIHN0YXRpYyB2b2lkIHhlbl9zZXRfaW9wbF9tYXNrKHVuc2lnbmVkIG1hc2spCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vbW11LmMgYi9hcmNoL3g4Ni94ZW4vbW11LmMKaW5kZXggYWRjYTllMi4uNjUwODNhZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL21tdS5jCisrKyBiL2FyY2gveDg2L3hlbi9tbXUuYwpAQCAtNTAyLDcgKzUwMiw3IEBACiB9CiBQVl9DQUxMRUVfU0FWRV9SRUdTX1RIVU5LKHhlbl9tYWtlX3BtZCk7CiAKLSNpZiBQQUdFVEFCTEVfTEVWRUxTID09IDQKKyNpZiBDT05GSUdfUEdUQUJMRV9MRVZFTFMgPT0gNAogX192aXNpYmxlIHB1ZHZhbF90IHhlbl9wdWRfdmFsKHB1ZF90IHB1ZCkKIHsKIAlyZXR1cm4gcHRlX21mbl90b19wZm4ocHVkLnB1ZCk7CkBAIC01ODksNyArNTg5LDcgQEAKIAogCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX01NVSk7CiB9Ci0jZW5kaWYJLyogUEFHRVRBQkxFX0xFVkVMUyA9PSA0ICovCisjZW5kaWYJLyogQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQgKi8KIAogLyoKICAqIChZZXQgYW5vdGhlcikgcGFnZXRhYmxlIHdhbGtlci4gIFRoaXMgb25lIGlzIGludGVuZGVkIGZvciBwaW5uaW5nIGEKQEAgLTE2MjgsNyArMTYyOCw3IEBACiAJeGVuX3JlbGVhc2VfcHRwYWdlKHBmbiwgUFRfUE1EKTsKIH0KIAotI2lmIFBBR0VUQUJMRV9MRVZFTFMgPT0gNAorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0CiBzdGF0aWMgdm9pZCB4ZW5fYWxsb2NfcHVkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIHBmbikKIHsKIAl4ZW5fYWxsb2NfcHRwYWdlKG1tLCBwZm4sIFBUX1BVRCk7CkBAIC0yMDQ2LDcgKzIwNDYsNyBAQAogCXB2X21tdV9vcHMuc2V0X3B0ZSA9IHhlbl9zZXRfcHRlOwogCXB2X21tdV9vcHMuc2V0X3BtZCA9IHhlbl9zZXRfcG1kOwogCXB2X21tdV9vcHMuc2V0X3B1ZCA9IHhlbl9zZXRfcHVkOwotI2lmIFBBR0VUQUJMRV9MRVZFTFMgPT0gNAorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0CiAJcHZfbW11X29wcy5zZXRfcGdkID0geGVuX3NldF9wZ2Q7CiAjZW5kaWYKIApAQCAtMjA1Niw3ICsyMDU2LDcgQEAKIAlwdl9tbXVfb3BzLmFsbG9jX3BtZCA9IHhlbl9hbGxvY19wbWQ7CiAJcHZfbW11X29wcy5yZWxlYXNlX3B0ZSA9IHhlbl9yZWxlYXNlX3B0ZTsKIAlwdl9tbXVfb3BzLnJlbGVhc2VfcG1kID0geGVuX3JlbGVhc2VfcG1kOwotI2lmIFBBR0VUQUJMRV9MRVZFTFMgPT0gNAorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0CiAJcHZfbW11X29wcy5hbGxvY19wdWQgPSB4ZW5fYWxsb2NfcHVkOwogCXB2X21tdV9vcHMucmVsZWFzZV9wdWQgPSB4ZW5fcmVsZWFzZV9wdWQ7CiAjZW5kaWYKQEAgLTIxMjIsMTQgKzIxMjIsMTQgQEAKIAkubWFrZV9wbWQgPSBQVl9DQUxMRUVfU0FWRSh4ZW5fbWFrZV9wbWQpLAogCS5wbWRfdmFsID0gUFZfQ0FMTEVFX1NBVkUoeGVuX3BtZF92YWwpLAogCi0jaWYgUEFHRVRBQkxFX0xFVkVMUyA9PSA0CisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID09IDQKIAkucHVkX3ZhbCA9IFBWX0NBTExFRV9TQVZFKHhlbl9wdWRfdmFsKSwKIAkubWFrZV9wdWQgPSBQVl9DQUxMRUVfU0FWRSh4ZW5fbWFrZV9wdWQpLAogCS5zZXRfcGdkID0geGVuX3NldF9wZ2RfaHlwZXIsCiAKIAkuYWxsb2NfcHVkID0geGVuX2FsbG9jX3BtZF9pbml0LAogCS5yZWxlYXNlX3B1ZCA9IHhlbl9yZWxlYXNlX3BtZF9pbml0LAotI2VuZGlmCS8qIFBBR0VUQUJMRV9MRVZFTFMgPT0gNCAqLworI2VuZGlmCS8qIENPTkZJR19QR1RBQkxFX0xFVkVMUyA9PSA0ICovCiAKIAkuYWN0aXZhdGVfbW0gPSB4ZW5fYWN0aXZhdGVfbW0sCiAJLmR1cF9tbWFwID0geGVuX2R1cF9tbWFwLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3AybS5jIGIvYXJjaC94ODYveGVuL3AybS5jCmluZGV4IDlmOTNhZjUuLmI0NzEyNGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9wMm0uYworKysgYi9hcmNoL3g4Ni94ZW4vcDJtLmMKQEAgLTkxLDYgKzkxLDEyIEBACiB1bnNpZ25lZCBsb25nIHhlbl9tYXhfcDJtX3BmbiBfX3JlYWRfbW9zdGx5OwogRVhQT1JUX1NZTUJPTF9HUEwoeGVuX21heF9wMm1fcGZuKTsKIAorI2lmZGVmIENPTkZJR19YRU5fQkFMTE9PTl9NRU1PUllfSE9UUExVR19MSU1JVAorI2RlZmluZSBQMk1fTElNSVQgQ09ORklHX1hFTl9CQUxMT09OX01FTU9SWV9IT1RQTFVHX0xJTUlUCisjZWxzZQorI2RlZmluZSBQMk1fTElNSVQgMAorI2VuZGlmCisKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socDJtX3VwZGF0ZV9sb2NrKTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgKnAybV9taWRfbWlzc2luZ19tZm47CkBAIC0zODUsOSArMzkxLDExIEBACiB2b2lkIF9faW5pdCB4ZW5fdm1hbGxvY19wMm1fdHJlZSh2b2lkKQogewogCXN0YXRpYyBzdHJ1Y3Qgdm1fc3RydWN0IHZtOworCXVuc2lnbmVkIGxvbmcgcDJtX2xpbWl0OwogCisJcDJtX2xpbWl0ID0gKHBoeXNfYWRkcl90KVAyTV9MSU1JVCAqIDEwMjQgKiAxMDI0ICogMTAyNCAvIFBBR0VfU0laRTsKIAl2bS5mbGFncyA9IFZNX0FMTE9DOwotCXZtLnNpemUgPSBBTElHTihzaXplb2YodW5zaWduZWQgbG9uZykgKiB4ZW5fbWF4X3AybV9wZm4sCisJdm0uc2l6ZSA9IEFMSUdOKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIG1heCh4ZW5fbWF4X3AybV9wZm4sIHAybV9saW1pdCksCiAJCQlQTURfU0laRSAqIFBNRFNfUEVSX01JRF9QQUdFKTsKIAl2bV9hcmVhX3JlZ2lzdGVyX2Vhcmx5KCZ2bSwgUE1EX1NJWkUgKiBQTURTX1BFUl9NSURfUEFHRSk7CiAJcHJfbm90aWNlKCJwMm0gdmlydHVhbCBhcmVhIGF0ICVwLCBzaXplIGlzICVseFxuIiwgdm0uYWRkciwgdm0uc2l6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc21wLmMgYi9hcmNoL3g4Ni94ZW4vc21wLmMKaW5kZXggMDhlODQ4OS4uODY0ODQzOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL3NtcC5jCisrKyBiL2FyY2gveDg2L3hlbi9zbXAuYwpAQCAtOTAsMTQgKzkwLDEwIEBACiAKIAlzZXRfY3B1X29ubGluZShjcHUsIHRydWUpOwogCi0JdGhpc19jcHVfd3JpdGUoY3B1X3N0YXRlLCBDUFVfT05MSU5FKTsKLQotCXdtYigpOworCWNwdV9zZXRfc3RhdGVfb25saW5lKGNwdSk7ICAvKiBJbXBsaWVzIGZ1bGwgbWVtb3J5IGJhcnJpZXIuICovCiAKIAkvKiBXZSBjYW4gdGFrZSBpbnRlcnJ1cHRzIG5vdzogd2UncmUgb2ZmaWNpYWxseSAidXAiLiAqLwogCWxvY2FsX2lycV9lbmFibGUoKTsKLQotCXdtYigpOwkJCS8qIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIG91dCAqLwogfQogCiAvKgpAQCAtNDQ1LDIxICs0NDEsMTkgQEAKIHsKIAlpbnQgcmM7CiAKLQlwZXJfY3B1KGN1cnJlbnRfdGFzaywgY3B1KSA9IGlkbGU7Ci0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCWlycV9jdHhfaW5pdChjcHUpOwotI2Vsc2UKLQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoaWRsZSwgVElGX0ZPUkspOwotI2VuZGlmCi0JcGVyX2NwdShrZXJuZWxfc3RhY2ssIGNwdSkgPQotCQkodW5zaWduZWQgbG9uZyl0YXNrX3N0YWNrX3BhZ2UoaWRsZSkgLQotCQlLRVJORUxfU1RBQ0tfT0ZGU0VUICsgVEhSRUFEX1NJWkU7CisJY29tbW9uX2NwdV91cChjcHUsIGlkbGUpOwogCiAJeGVuX3NldHVwX3J1bnN0YXRlX2luZm8oY3B1KTsKIAl4ZW5fc2V0dXBfdGltZXIoY3B1KTsKIAl4ZW5faW5pdF9sb2NrX2NwdShjcHUpOwogCi0JcGVyX2NwdShjcHVfc3RhdGUsIGNwdSkgPSBDUFVfVVBfUFJFUEFSRTsKKwkvKgorCSAqIFBWIFZDUFVzIGFyZSBhbHdheXMgc3VjY2Vzc2Z1bGx5IHRha2VuIGRvd24gKHNlZSAnd2hpbGUnIGxvb3AKKwkgKiBpbiB4ZW5fY3B1X2RpZSgpKSwgc28gLUVCVVNZIGlzIGFuIGVycm9yLgorCSAqLworCXJjID0gY3B1X2NoZWNrX3VwX3ByZXBhcmUoY3B1KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAogCS8qIG1ha2Ugc3VyZSBpbnRlcnJ1cHRzIHN0YXJ0IGJsb2NrZWQgKi8KIAlwZXJfY3B1KHhlbl92Y3B1LCBjcHUpLT5ldnRjaG5fdXBjYWxsX21hc2sgPSAxOwpAQCAtNDY4LDEwICs0NjIsNiBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JaWYgKG51bV9vbmxpbmVfY3B1cygpID09IDEpCi0JCS8qIEp1c3QgaW4gY2FzZSB3ZSBib290ZWQgd2l0aCBhIHNpbmdsZSBDUFUuICovCi0JCWFsdGVybmF0aXZlc19lbmFibGVfc21wKCk7Ci0KIAlyYyA9IHhlbl9zbXBfaW50cl9pbml0KGNwdSk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CkBAIC00NzksMTAgKzQ2OSw4IEBACiAJcmMgPSBIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX3VwLCBjcHUsIE5VTEwpOwogCUJVR19PTihyYyk7CiAKLQl3aGlsZShwZXJfY3B1KGNwdV9zdGF0ZSwgY3B1KSAhPSBDUFVfT05MSU5FKSB7CisJd2hpbGUgKGNwdV9yZXBvcnRfc3RhdGUoY3B1KSAhPSBDUFVfT05MSU5FKQogCQlIWVBFUlZJU09SX3NjaGVkX29wKFNDSEVET1BfeWllbGQsIE5VTEwpOwotCQliYXJyaWVyKCk7Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC01MTEsMTEgKzQ5OSwxMSBAQAogCQlzY2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKIAl9CiAKLQljcHVfZGllX2NvbW1vbihjcHUpOwotCi0JeGVuX3NtcF9pbnRyX2ZyZWUoY3B1KTsKLQl4ZW5fdW5pbml0X2xvY2tfY3B1KGNwdSk7Ci0JeGVuX3RlYXJkb3duX3RpbWVyKGNwdSk7CisJaWYgKGNvbW1vbl9jcHVfZGllKGNwdSkgPT0gMCkgeworCQl4ZW5fc21wX2ludHJfZnJlZShjcHUpOworCQl4ZW5fdW5pbml0X2xvY2tfY3B1KGNwdSk7CisJCXhlbl90ZWFyZG93bl90aW1lcihjcHUpOworCX0KIH0KIAogc3RhdGljIHZvaWQgeGVuX3BsYXlfZGVhZCh2b2lkKSAvKiB1c2VkIG9ubHkgd2l0aCBIT1RQTFVHX0NQVSAqLwpAQCAtNzQ3LDYgKzczNSwxNiBAQAogc3RhdGljIGludCB4ZW5faHZtX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRpZGxlKQogewogCWludCByYzsKKworCS8qCisJICogVGhpcyBjYW4gaGFwcGVuIGlmIENQVSB3YXMgb2ZmbGluZWQgZWFybGllciBhbmQKKwkgKiBvZmZsaW5pbmcgdGltZWQgb3V0IGluIGNvbW1vbl9jcHVfZGllKCkuCisJICovCisJaWYgKGNwdV9yZXBvcnRfc3RhdGUoY3B1KSA9PSBDUFVfREVBRF9GUk9aRU4pIHsKKwkJeGVuX3NtcF9pbnRyX2ZyZWUoY3B1KTsKKwkJeGVuX3VuaW5pdF9sb2NrX2NwdShjcHUpOworCX0KKwogCS8qCiAJICogeGVuX3NtcF9pbnRyX2luaXQoKSBuZWVkcyB0byBydW4gYmVmb3JlIG5hdGl2ZV9jcHVfdXAoKQogCSAqIHNvIHRoYXQgSVBJIHZlY3RvcnMgYXJlIHNldCB1cCBvbiB0aGUgYm9vdGluZyBDUFUgYmVmb3JlCkBAIC03NjgsMTIgKzc2Niw2IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgdm9pZCB4ZW5faHZtX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKLXsKLQl4ZW5fY3B1X2RpZShjcHUpOwotCW5hdGl2ZV9jcHVfZGllKGNwdSk7Ci19Ci0KIHZvaWQgX19pbml0IHhlbl9odm1fc21wX2luaXQodm9pZCkKIHsKIAlpZiAoIXhlbl9oYXZlX3ZlY3Rvcl9jYWxsYmFjaykKQEAgLTc4MSw3ICs3NzMsNyBAQAogCXNtcF9vcHMuc21wX3ByZXBhcmVfY3B1cyA9IHhlbl9odm1fc21wX3ByZXBhcmVfY3B1czsKIAlzbXBfb3BzLnNtcF9zZW5kX3Jlc2NoZWR1bGUgPSB4ZW5fc21wX3NlbmRfcmVzY2hlZHVsZTsKIAlzbXBfb3BzLmNwdV91cCA9IHhlbl9odm1fY3B1X3VwOwotCXNtcF9vcHMuY3B1X2RpZSA9IHhlbl9odm1fY3B1X2RpZTsKKwlzbXBfb3BzLmNwdV9kaWUgPSB4ZW5fY3B1X2RpZTsKIAlzbXBfb3BzLnNlbmRfY2FsbF9mdW5jX2lwaSA9IHhlbl9zbXBfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaTsKIAlzbXBfb3BzLnNlbmRfY2FsbF9mdW5jX3NpbmdsZV9pcGkgPSB4ZW5fc21wX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpOwogCXNtcF9vcHMuc21wX3ByZXBhcmVfYm9vdF9jcHUgPSB4ZW5fc21wX3ByZXBhcmVfYm9vdF9jcHU7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc3VzcGVuZC5jIGIvYXJjaC94ODYveGVuL3N1c3BlbmQuYwppbmRleCBjNGRmOWRiLi5kOTQ5NzY5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc3VzcGVuZC5jCisrKyBiL2FyY2gveDg2L3hlbi9zdXNwZW5kLmMKQEAgLTEsNSArMSw1IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgogCiAjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KICNpbmNsdWRlIDx4ZW4vZ3JhbnRfdGFibGUuaD4KQEAgLTgxLDE3ICs4MSwxNCBAQAogCiBzdGF0aWMgdm9pZCB4ZW5fdmNwdV9ub3RpZnlfcmVzdG9yZSh2b2lkICpkYXRhKQogewotCXVuc2lnbmVkIGxvbmcgcmVhc29uID0gKHVuc2lnbmVkIGxvbmcpZGF0YTsKLQogCS8qIEJvb3QgcHJvY2Vzc29yIG5vdGlmaWVkIHZpYSBnZW5lcmljIHRpbWVrZWVwaW5nX3Jlc3VtZSgpICovCi0JaWYgKCBzbXBfcHJvY2Vzc29yX2lkKCkgPT0gMCkKKwlpZiAoc21wX3Byb2Nlc3Nvcl9pZCgpID09IDApCiAJCXJldHVybjsKIAotCWNsb2NrZXZlbnRzX25vdGlmeShyZWFzb24sIE5VTEwpOworCXRpY2tfcmVzdW1lX2xvY2FsKCk7CiB9CiAKIHZvaWQgeGVuX2FyY2hfcmVzdW1lKHZvaWQpCiB7Ci0Jb25fZWFjaF9jcHUoeGVuX3ZjcHVfbm90aWZ5X3Jlc3RvcmUsCi0JCSAgICAodm9pZCAqKUNMT0NLX0VWVF9OT1RJRllfUkVTVU1FLCAxKTsKKwlvbl9lYWNoX2NwdSh4ZW5fdmNwdV9ub3RpZnlfcmVzdG9yZSwgTlVMTCwgMSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4veGVuLWFzbV82NC5TIGIvYXJjaC94ODYveGVuL3hlbi1hc21fNjQuUwppbmRleCA1M2FkZWZkLi45ODVmYzNlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4veGVuLWFzbV82NC5TCisrKyBiL2FyY2gveDg2L3hlbi94ZW4tYXNtXzY0LlMKQEAgLTY4LDExICs2OCwxMSBAQAogCSAqIFdlJ3JlIGFscmVhZHkgb24gdGhlIHVzZXJtb2RlIHN0YWNrIGF0IHRoaXMgcG9pbnQsIGJ1dAogCSAqIHN0aWxsIHdpdGggdGhlIGtlcm5lbCBncywgc28gd2UgY2FuIGVhc2lseSBzd2l0Y2ggYmFjawogCSAqLwotCW1vdnEgJXJzcCwgUEVSX0NQVV9WQVIob2xkX3JzcCkKKwltb3ZxICVyc3AsIFBFUl9DUFVfVkFSKHJzcF9zY3JhdGNoKQogCW1vdnEgUEVSX0NQVV9WQVIoa2VybmVsX3N0YWNrKSwgJXJzcAogCiAJcHVzaHEgJF9fVVNFUl9EUwotCXB1c2hxIFBFUl9DUFVfVkFSKG9sZF9yc3ApCisJcHVzaHEgUEVSX0NQVV9WQVIocnNwX3NjcmF0Y2gpCiAJcHVzaHEgJXIxMQogCXB1c2hxICRfX1VTRVJfQ1MKIAlwdXNocSAlcmN4CkBAIC04NywxMSArODcsMTEgQEAKIAkgKiBXZSdyZSBhbHJlYWR5IG9uIHRoZSB1c2VybW9kZSBzdGFjayBhdCB0aGlzIHBvaW50LCBidXQKIAkgKiBzdGlsbCB3aXRoIHRoZSBrZXJuZWwgZ3MsIHNvIHdlIGNhbiBlYXNpbHkgc3dpdGNoIGJhY2sKIAkgKi8KLQltb3ZxICVyc3AsIFBFUl9DUFVfVkFSKG9sZF9yc3ApCisJbW92cSAlcnNwLCBQRVJfQ1BVX1ZBUihyc3Bfc2NyYXRjaCkKIAltb3ZxIFBFUl9DUFVfVkFSKGtlcm5lbF9zdGFjayksICVyc3AKIAogCXB1c2hxICRfX1VTRVIzMl9EUwotCXB1c2hxIFBFUl9DUFVfVkFSKG9sZF9yc3ApCisJcHVzaHEgUEVSX0NQVV9WQVIocnNwX3NjcmF0Y2gpCiAJcHVzaHEgJXIxMQogCXB1c2hxICRfX1VTRVIzMl9DUwogCXB1c2hxICVyY3gKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCmluZGV4IGE5YjVkM2IuLjlhZDEyYzYgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtNDQsNyArNDQsNiBAQAogCiBzdHJ1Y3QgdGhyZWFkX2luZm8gewogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCiAJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CQkvKiBsb3cgbGV2ZWwgZmxhZ3MgKi8KIAl1bnNpZ25lZCBsb25nCQlzdGF0dXM7CQkvKiB0aHJlYWQtc3luY2hyb25vdXMgZmxhZ3MgKi8KIAlfX3UzMgkJCWNwdTsJCS8qIGN1cnJlbnQgQ1BVICovCkBAIC02MSwxNyArNjAsNiBAQAogCXh0cmVnc191c2VyX3QJCXh0cmVnc191c2VyOwogfTsKIAotI2Vsc2UgLyogIV9fQVNTRU1CTFlfXyAqLwotCi0vKiBvZmZzZXRzIGludG8gdGhlIHRocmVhZF9pbmZvIHN0cnVjdCBmb3IgYXNzZW1ibHkgY29kZSBhY2Nlc3MgKi8KLSNkZWZpbmUgVElfVEFTSwkJIDB4MDAwMDAwMDAKLSNkZWZpbmUgVElfRVhFQ19ET01BSU4JIDB4MDAwMDAwMDQKLSNkZWZpbmUgVElfRkxBR1MJIDB4MDAwMDAwMDgKLSNkZWZpbmUgVElfU1RBVFVTCSAweDAwMDAwMDBDCi0jZGVmaW5lIFRJX0NQVQkJIDB4MDAwMDAwMTAKLSNkZWZpbmUgVElfUFJFX0NPVU5UCSAweDAwMDAwMDE0Ci0jZGVmaW5lIFRJX0FERFJfTElNSVQJIDB4MDAwMDAwMTgKLQogI2VuZGlmCiAKIC8qCkBAIC04Myw3ICs3MSw2IEBACiAjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKIHsJCQkJCQlcCiAJLnRhc2sJCT0gJnRzaywJCQlcCi0JLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKIAkuZmxhZ3MJCT0gMCwJCQlcCiAJLmNwdQkJPSAwLAkJCVwKIAkucHJlZW1wdF9jb3VudAk9IElOSVRfUFJFRU1QVF9DT1VOVCwJXApkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAxOTE1YzdjLi5iMTIzYWNlIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtNzcsNiArNzcsMTQgQEAKIAlERUZJTkUoVEFTS19USFJFQURfSU5GTywgb2Zmc2V0b2YgKHN0cnVjdCB0YXNrX3N0cnVjdCwgc3RhY2spKTsKIAlERUZJTkUoVEFTS19TVFJVQ1RfU0laRSwgc2l6ZW9mIChzdHJ1Y3QgdGFza19zdHJ1Y3QpKTsKIAorCS8qIG9mZnNldHMgaW4gdGhyZWFkX2luZm8gc3RydWN0ICovCisJT0ZGU0VUKFRJX1RBU0ssIHRocmVhZF9pbmZvLCB0YXNrKTsKKwlPRkZTRVQoVElfRkxBR1MsIHRocmVhZF9pbmZvLCBmbGFncyk7CisJT0ZGU0VUKFRJX1NUU1RVUywgdGhyZWFkX2luZm8sIHN0YXR1cyk7CisJT0ZGU0VUKFRJX0NQVSwgdGhyZWFkX2luZm8sIGNwdSk7CisJT0ZGU0VUKFRJX1BSRV9DT1VOVCwgdGhyZWFkX2luZm8sIHByZWVtcHRfY291bnQpOworCU9GRlNFVChUSV9BRERSX0xJTUlULCB0aHJlYWRfaW5mbywgYWRkcl9saW1pdCk7CisKIAkvKiBzdHJ1Y3QgdGhyZWFkX2luZm8gKG9mZnNldCBmcm9tIHN0YXJ0X3N0cnVjdCkgKi8KIAlERUZJTkUoVEhSRUFEX1JBLCBvZmZzZXRvZiAoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQucmEpKTsKIAlERUZJTkUoVEhSRUFEX1NQLCBvZmZzZXRvZiAoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQuc3ApKTsKZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2tlcm5lbC9wY2kuYyBiL2FyY2gveHRlbnNhL2tlcm5lbC9wY2kuYwppbmRleCA1YjM0MDMzLi5iODQ4Y2MzIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvcGNpLmMKKysrIGIvYXJjaC94dGVuc2Eva2VybmVsL3BjaS5jCkBAIC0xNzQsNyArMTc0LDcgQEAKIAlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKnBjaV9jdHJsOwogCXN0cnVjdCBsaXN0X2hlYWQgcmVzb3VyY2VzOwogCXN0cnVjdCBwY2lfYnVzICpidXM7Ci0JaW50IG5leHRfYnVzbm8gPSAwOworCWludCBuZXh0X2J1c25vID0gMCwgcmV0OwogCiAJcHJpbnRrKCJQQ0k6IFByb2JpbmcgUENJIGhhcmR3YXJlXG4iKTsKIApAQCAtMTg1LDE0ICsxODUsMjUgQEAKIAkJcGNpX2NvbnRyb2xsZXJfYXBlcnR1cmVzKHBjaV9jdHJsLCAmcmVzb3VyY2VzKTsKIAkJYnVzID0gcGNpX3NjYW5fcm9vdF9idXMoTlVMTCwgcGNpX2N0cmwtPmZpcnN0X2J1c25vLAogCQkJCQlwY2lfY3RybC0+b3BzLCBwY2lfY3RybCwgJnJlc291cmNlcyk7CisJCWlmICghYnVzKQorCQkJY29udGludWU7CisKIAkJcGNpX2N0cmwtPmJ1cyA9IGJ1czsKIAkJcGNpX2N0cmwtPmxhc3RfYnVzbm8gPSBidXMtPmJ1c25fcmVzLmVuZDsKIAkJaWYgKG5leHRfYnVzbm8gPD0gcGNpX2N0cmwtPmxhc3RfYnVzbm8pCiAJCQluZXh0X2J1c25vID0gcGNpX2N0cmwtPmxhc3RfYnVzbm8rMTsKIAl9CiAJcGNpX2J1c19jb3VudCA9IG5leHRfYnVzbm87CisJcmV0ID0gcGxhdGZvcm1fcGNpYmlvc19maXh1cCgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gcGxhdGZvcm1fcGNpYmlvc19maXh1cCgpOworCWZvciAocGNpX2N0cmwgPSBwY2lfY3RybF9oZWFkOyBwY2lfY3RybDsgcGNpX2N0cmwgPSBwY2lfY3RybC0+bmV4dCkgeworCQlpZiAocGNpX2N0cmwtPmJ1cykKKwkJCXBjaV9idXNfYWRkX2RldmljZXMocGNpX2N0cmwtPmJ1cyk7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN1YnN5c19pbml0Y2FsbChwY2liaW9zX2luaXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94dGVuc2Eva2VybmVsL3NpZ25hbC5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3NpZ25hbC5jCmluZGV4IDNkNzMzYmEuLmU4N2FkYWEgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3h0ZW5zYS9rZXJuZWwvc2lnbmFsLmMKQEAgLTMzNiw3ICszMzYsNiBAQAogewogCXN0cnVjdCBydF9zaWdmcmFtZSAqZnJhbWU7CiAJaW50IGVyciA9IDAsIHNpZyA9IGtzaWctPnNpZzsKLQlpbnQgc2lnbmFsOwogCXVuc2lnbmVkIGxvbmcgc3AsIHJhLCB0cDsKIAogCXNwID0gcmVncy0+YXJlZ1sxXTsKQEAgLTM1NCwxMiArMzUzLDYgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCi0Jc2lnbmFsID0gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbgotCQkmJiBjdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5zaWduYWxfaW52bWFwCi0JCSYmIHNpZyA8IDMyCi0JCT8gY3VycmVudF90aHJlYWRfaW5mbygpLT5leGVjX2RvbWFpbi0+c2lnbmFsX2ludm1hcFtzaWddCi0JCTogc2lnOwotCiAJaWYgKGtzaWctPmthLnNhLnNhX2ZsYWdzICYgU0FfU0lHSU5GTykgewogCQllcnIgfD0gY29weV9zaWdpbmZvX3RvX3VzZXIoJmZyYW1lLT5pbmZvLCAma3NpZy0+aW5mbyk7CiAJfQpAQCAtNDAwLDE5ICszOTMsMTQgQEAKIAkgKiBOb3RlOiBQUy5DQUxMSU5DIGlzIHNldCB0byBvbmUgYnkgc3RhcnRfdGhyZWFkCiAJICovCiAJcmVncy0+YXJlZ1s0XSA9ICgoKHVuc2lnbmVkIGxvbmcpIHJhKSAmIDB4M2ZmZmZmZmYpIHwgMHg0MDAwMDAwMDsKLQlyZWdzLT5hcmVnWzZdID0gKHVuc2lnbmVkIGxvbmcpIHNpZ25hbDsKKwlyZWdzLT5hcmVnWzZdID0gKHVuc2lnbmVkIGxvbmcpIHNpZzsKIAlyZWdzLT5hcmVnWzddID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+aW5mbzsKIAlyZWdzLT5hcmVnWzhdID0gKHVuc2lnbmVkIGxvbmcpICZmcmFtZS0+dWM7CiAJcmVncy0+dGhyZWFkcHRyID0gdHA7CiAKLQkvKiBTZXQgYWNjZXNzIG1vZGUgdG8gVVNFUl9EUy4gIE5vbWVuY2xhdHVyZSBpcyBvdXRkYXRlZCwgYnV0Ci0JICogZnVuY3Rpb25hbGl0eSBpcyB1c2VkIGluIHVhY2Nlc3MuaAotCSAqLwotCXNldF9mcyhVU0VSX0RTKTsKLQogI2lmIERFQlVHX1NJRwogCXByaW50aygiU0lHIHJ0IGRlbGl2ZXIgKCVzOiVkKTogc2lnbmFsPSVkIHNwPSVwIHBjPSUwOHhcbiIsCi0JCWN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc2lnbmFsLCBmcmFtZSwgcmVncy0+cGMpOworCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsIHNpZywgZnJhbWUsIHJlZ3MtPnBjKTsKICNlbmRpZgogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstbWFwLmMgYi9ibG9jay9ibGstbWFwLmMKaW5kZXggYjhkMjcyNS4uZGEzMTBhMSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1hcC5jCisrKyBiL2Jsb2NrL2Jsay1tYXAuYwpAQCAtMTI0LDEwICsxMjQsMTAgQEAKIHsKIAlzdHJ1Y3QgaW92ZWMgaW92OwogCXN0cnVjdCBpb3ZfaXRlciBpOworCWludCByZXQgPSBpbXBvcnRfc2luZ2xlX3JhbmdlKHJxX2RhdGFfZGlyKHJxKSwgdWJ1ZiwgbGVuLCAmaW92LCAmaSk7CiAKLQlpb3YuaW92X2Jhc2UgPSB1YnVmOwotCWlvdi5pb3ZfbGVuID0gbGVuOwotCWlvdl9pdGVyX2luaXQoJmksIHJxX2RhdGFfZGlyKHJxKSwgJmlvdiwgMSwgbGVuKTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gYmxrX3JxX21hcF91c2VyX2lvdihxLCBycSwgbWFwX2RhdGEsICZpLCBnZnBfbWFzayk7CiB9CmRpZmYgLS1naXQgYS9ibG9jay9ibGstbWVyZ2UuYyBiL2Jsb2NrL2Jsay1tZXJnZS5jCmluZGV4IGZjMWZmM2IuLmZkM2ZlZTggMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tZXJnZS5jCisrKyBiL2Jsb2NrL2Jsay1tZXJnZS5jCkBAIC01OTIsNyArNTkyLDcgQEAKIAlpZiAocS0+cXVldWVfZmxhZ3MgJiAoMSA8PCBRVUVVRV9GTEFHX1NHX0dBUFMpKSB7CiAJCXN0cnVjdCBiaW9fdmVjICpicHJldjsKIAotCQlicHJldiA9ICZycS0+YmlvdGFpbC0+YmlfaW9fdmVjW2Jpby0+YmlfdmNudCAtIDFdOworCQlicHJldiA9ICZycS0+YmlvdGFpbC0+YmlfaW9fdmVjW3JxLT5iaW90YWlsLT5iaV92Y250IC0gMV07CiAJCWlmIChidmVjX2dhcF90b19wcmV2KGJwcmV2LCBiaW8tPmJpX2lvX3ZlY1swXS5idl9vZmZzZXQpKQogCQkJcmV0dXJuIGZhbHNlOwogCX0KZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS10YWcuYyBiL2Jsb2NrL2Jsay1tcS10YWcuYwppbmRleCBkNTNhNzY0Li5iZTMyOTBjIDEwMDY0NAotLS0gYS9ibG9jay9ibGstbXEtdGFnLmMKKysrIGIvYmxvY2svYmxrLW1xLXRhZy5jCkBAIC0yNzgsOSArMjc4LDExIEBACiAJCS8qCiAJCSAqIFdlJ3JlIG91dCBvZiB0YWdzIG9uIHRoaXMgaGFyZHdhcmUgcXVldWUsIGtpY2sgYW55CiAJCSAqIHBlbmRpbmcgSU8gc3VibWl0cyBiZWZvcmUgZ29pbmcgdG8gc2xlZXAgd2FpdGluZyBmb3IKLQkJICogc29tZSB0byBjb21wbGV0ZS4KKwkJICogc29tZSB0byBjb21wbGV0ZS4gTm90ZSB0aGF0IGhjdHggY2FuIGJlIE5VTEwgaGVyZSBmb3IKKwkJICogcmVzZXJ2ZWQgdGFnIGFsbG9jYXRpb24uCiAJCSAqLwotCQlibGtfbXFfcnVuX2h3X3F1ZXVlKGhjdHgsIGZhbHNlKTsKKwkJaWYgKGhjdHgpCisJCQlibGtfbXFfcnVuX2h3X3F1ZXVlKGhjdHgsIGZhbHNlKTsKIAogCQkvKgogCQkgKiBSZXRyeSB0YWcgYWxsb2NhdGlvbiBhZnRlciBydW5uaW5nIHRoZSBoYXJkd2FyZSBxdWV1ZSwKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS5jIGIvYmxvY2svYmxrLW1xLmMKaW5kZXggNGY0YmVhMi4uMzNjNDI4NSAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1xLmMKKysrIGIvYmxvY2svYmxrLW1xLmMKQEAgLTE0NTcsNyArMTQ1Nyw3IEBACiAKIAkJZG8gewogCQkJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUoc2V0LT5udW1hX25vZGUsCi0JCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlksCisJCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkgfCBfX0dGUF9aRVJPLAogCQkJCXRoaXNfb3JkZXIpOwogCQkJaWYgKHBhZ2UpCiAJCQkJYnJlYWs7CkBAIC0xNDc5LDggKzE0NzksNiBAQAogCQlsZWZ0IC09IHRvX2RvICogcnFfc2l6ZTsKIAkJZm9yIChqID0gMDsgaiA8IHRvX2RvOyBqKyspIHsKIAkJCXRhZ3MtPnJxc1tpXSA9IHA7Ci0JCQl0YWdzLT5ycXNbaV0tPmF0b21pY19mbGFncyA9IDA7Ci0JCQl0YWdzLT5ycXNbaV0tPmNtZF9mbGFncyA9IDA7CiAJCQlpZiAoc2V0LT5vcHMtPmluaXRfcmVxdWVzdCkgewogCQkJCWlmIChzZXQtPm9wcy0+aW5pdF9yZXF1ZXN0KHNldC0+ZHJpdmVyX2RhdGEsCiAJCQkJCQl0YWdzLT5ycXNbaV0sIGhjdHhfaWR4LCBpLApAQCAtMTkzOCw3ICsxOTM2LDcgQEAKIAkgKi8KIAlpZiAocGVyY3B1X3JlZl9pbml0KCZxLT5tcV91c2FnZV9jb3VudGVyLCBibGtfbXFfdXNhZ2VfY291bnRlcl9yZWxlYXNlLAogCQkJICAgIFBFUkNQVV9SRUZfSU5JVF9BVE9NSUMsIEdGUF9LRVJORUwpKQotCQlnb3RvIGVycl9tYXA7CisJCWdvdG8gZXJyX21xX3VzYWdlOwogCiAJc2V0dXBfdGltZXIoJnEtPnRpbWVvdXQsIGJsa19tcV9ycV90aW1lciwgKHVuc2lnbmVkIGxvbmcpIHEpOwogCWJsa19xdWV1ZV9ycV90aW1lb3V0KHEsIDMwMDAwKTsKQEAgLTE5ODEsNyArMTk3OSw3IEBACiAJYmxrX21xX2luaXRfY3B1X3F1ZXVlcyhxLCBzZXQtPm5yX2h3X3F1ZXVlcyk7CiAKIAlpZiAoYmxrX21xX2luaXRfaHdfcXVldWVzKHEsIHNldCkpCi0JCWdvdG8gZXJyX2h3OworCQlnb3RvIGVycl9tcV91c2FnZTsKIAogCW11dGV4X2xvY2soJmFsbF9xX211dGV4KTsKIAlsaXN0X2FkZF90YWlsKCZxLT5hbGxfcV9ub2RlLCAmYWxsX3FfbGlzdCk7CkBAIC0xOTkzLDcgKzE5OTEsNyBAQAogCiAJcmV0dXJuIHE7CiAKLWVycl9odzoKK2Vycl9tcV91c2FnZToKIAlibGtfY2xlYW51cF9xdWV1ZShxKTsKIGVycl9oY3R4czoKIAlrZnJlZShtYXApOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXNldHRpbmdzLmMgYi9ibG9jay9ibGstc2V0dGluZ3MuYwppbmRleCA2ZWQyY2JlLi4xMjYwMGJmIDEwMDY0NAotLS0gYS9ibG9jay9ibGstc2V0dGluZ3MuYworKysgYi9ibG9jay9ibGstc2V0dGluZ3MuYwpAQCAtNTg1LDcgKzU4NSw3IEBACiAJCQkJICAgICBiLT5waHlzaWNhbF9ibG9ja19zaXplKTsKIAogCXQtPmlvX21pbiA9IG1heCh0LT5pb19taW4sIGItPmlvX21pbik7Ci0JdC0+aW9fb3B0ID0gbGNtKHQtPmlvX29wdCwgYi0+aW9fb3B0KTsKKwl0LT5pb19vcHQgPSBsY21fbm90X3plcm8odC0+aW9fb3B0LCBiLT5pb19vcHQpOwogCiAJdC0+Y2x1c3RlciAmPSBiLT5jbHVzdGVyOwogCXQtPmRpc2NhcmRfemVyb2VzX2RhdGEgJj0gYi0+ZGlzY2FyZF96ZXJvZXNfZGF0YTsKQEAgLTYxNiw3ICs2MTYsNyBAQAogCQkgICAgYi0+cmFpZF9wYXJ0aWFsX3N0cmlwZXNfZXhwZW5zaXZlKTsKIAogCS8qIEZpbmQgbG93ZXN0IGNvbW1vbiBhbGlnbm1lbnRfb2Zmc2V0ICovCi0JdC0+YWxpZ25tZW50X29mZnNldCA9IGxjbSh0LT5hbGlnbm1lbnRfb2Zmc2V0LCBhbGlnbm1lbnQpCisJdC0+YWxpZ25tZW50X29mZnNldCA9IGxjbV9ub3RfemVybyh0LT5hbGlnbm1lbnRfb2Zmc2V0LCBhbGlnbm1lbnQpCiAJCSUgbWF4KHQtPnBoeXNpY2FsX2Jsb2NrX3NpemUsIHQtPmlvX21pbik7CiAKIAkvKiBWZXJpZnkgdGhhdCBuZXcgYWxpZ25tZW50X29mZnNldCBpcyBvbiBhIGxvZ2ljYWwgYmxvY2sgYm91bmRhcnkgKi8KQEAgLTY0Myw3ICs2NDMsNyBAQAogCQkJCQkJICAgICAgYi0+bWF4X2Rpc2NhcmRfc2VjdG9ycyk7CiAJCXQtPmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSBtYXgodC0+ZGlzY2FyZF9ncmFudWxhcml0eSwKIAkJCQkJICAgICBiLT5kaXNjYXJkX2dyYW51bGFyaXR5KTsKLQkJdC0+ZGlzY2FyZF9hbGlnbm1lbnQgPSBsY20odC0+ZGlzY2FyZF9hbGlnbm1lbnQsIGFsaWdubWVudCkgJQorCQl0LT5kaXNjYXJkX2FsaWdubWVudCA9IGxjbV9ub3RfemVybyh0LT5kaXNjYXJkX2FsaWdubWVudCwgYWxpZ25tZW50KSAlCiAJCQl0LT5kaXNjYXJkX2dyYW51bGFyaXR5OwogCX0KIApkaWZmIC0tZ2l0IGEvYmxvY2svc2NzaV9pb2N0bC5jIGIvYmxvY2svc2NzaV9pb2N0bC5jCmluZGV4IGUxZjcxYzMuLjU1YjZmMTUgMTAwNjQ0Ci0tLSBhL2Jsb2NrL3Njc2lfaW9jdGwuYworKysgYi9ibG9jay9zY3NpX2lvY3RsLmMKQEAgLTMzNSwxNiArMzM1LDE0IEBACiAJCXN0cnVjdCBpb3ZfaXRlciBpOwogCQlzdHJ1Y3QgaW92ZWMgKmlvdiA9IE5VTEw7CiAKLQkJcmV0ID0gcndfY29weV9jaGVja191dmVjdG9yKC0xLCBoZHItPmR4ZmVycCwgaGRyLT5pb3ZlY19jb3VudCwKLQkJCQkJICAgIDAsIE5VTEwsICZpb3YpOwotCQlpZiAocmV0IDwgMCkgewotCQkJa2ZyZWUoaW92KTsKKwkJcmV0ID0gaW1wb3J0X2lvdmVjKHJxX2RhdGFfZGlyKHJxKSwKKwkJCQkgICBoZHItPmR4ZmVycCwgaGRyLT5pb3ZlY19jb3VudCwKKwkJCQkgICAwLCAmaW92LCAmaSk7CisJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXRfZnJlZV9jZGI7Ci0JCX0KIAogCQkvKiBTR19JTyBob3d0byBzYXlzIHRoYXQgdGhlIHNob3J0ZXIgb2YgdGhlIHR3byB3aW5zICovCi0JCWlvdl9pdGVyX2luaXQoJmksIHJxX2RhdGFfZGlyKHJxKSwgaW92LCBoZHItPmlvdmVjX2NvdW50LAotCQkJICAgICAgbWluX3QodW5zaWduZWQsIHJldCwgaGRyLT5keGZlcl9sZW4pKTsKKwkJaW92X2l0ZXJfdHJ1bmNhdGUoJmksIGhkci0+ZHhmZXJfbGVuKTsKIAogCQlyZXQgPSBibGtfcnFfbWFwX3VzZXJfaW92KHEsIHJxLCBOVUxMLCAmaSwgR0ZQX0tFUk5FTCk7CiAJCWtmcmVlKGlvdik7CmRpZmYgLS1naXQgYS9jcnlwdG8vS2NvbmZpZyBiL2NyeXB0by9LY29uZmlnCmluZGV4IDUwZjRkYTQuLjhhYWYyOTggMTAwNjQ0Ci0tLSBhL2NyeXB0by9LY29uZmlnCisrKyBiL2NyeXB0by9LY29uZmlnCkBAIC00MzYsNiArNDM2LDE0IEBACiAJICBNRDUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIChSRkMxMzIxKSBpbXBsZW1lbnRlZAogCSAgdXNpbmcgT0NURU9OIGNyeXB0byBpbnN0cnVjdGlvbnMsIHdoZW4gYXZhaWxhYmxlLgogCitjb25maWcgQ1JZUFRPX01ENV9QUEMKKwl0cmlzdGF0ZSAiTUQ1IGRpZ2VzdCBhbGdvcml0aG0gKFBQQykiCisJZGVwZW5kcyBvbiBQUEMKKwlzZWxlY3QgQ1JZUFRPX0hBU0gKKwloZWxwCisJICBNRDUgbWVzc2FnZSBkaWdlc3QgYWxnb3JpdGhtIChSRkMxMzIxKSBpbXBsZW1lbnRlZAorCSAgaW4gUFBDIGFzc2VtYmxlci4KKwogY29uZmlnIENSWVBUT19NRDVfU1BBUkM2NAogCXRyaXN0YXRlICJNRDUgZGlnZXN0IGFsZ29yaXRobSAoU1BBUkM2NCkiCiAJZGVwZW5kcyBvbiBTUEFSQzY0CkBAIC01NDYsNiArNTU0LDE1IEBACiAJICBFeHRlbnNpb25zIHZlcnNpb24gMSAoQVZYMSksIG9yIEFkdmFuY2VkIFZlY3RvciBFeHRlbnNpb25zCiAJICB2ZXJzaW9uIDIgKEFWWDIpIGluc3RydWN0aW9ucywgd2hlbiBhdmFpbGFibGUuCiAKK2NvbmZpZyBDUllQVE9fU0hBMV9PQ1RFT04KKwl0cmlzdGF0ZSAiU0hBMSBkaWdlc3QgYWxnb3JpdGhtIChPQ1RFT04pIgorCWRlcGVuZHMgb24gQ1BVX0NBVklVTV9PQ1RFT04KKwlzZWxlY3QgQ1JZUFRPX1NIQTEKKwlzZWxlY3QgQ1JZUFRPX0hBU0gKKwloZWxwCisJICBTSEEtMSBzZWN1cmUgaGFzaCBzdGFuZGFyZCAoRklQUyAxODAtMS9ERklQUyAxODAtMikgaW1wbGVtZW50ZWQKKwkgIHVzaW5nIE9DVEVPTiBjcnlwdG8gaW5zdHJ1Y3Rpb25zLCB3aGVuIGF2YWlsYWJsZS4KKwogY29uZmlnIENSWVBUT19TSEExX1NQQVJDNjQKIAl0cmlzdGF0ZSAiU0hBMSBkaWdlc3QgYWxnb3JpdGhtIChTUEFSQzY0KSIKIAlkZXBlbmRzIG9uIFNQQVJDNjQKQEAgLTU1NSwyNiArNTcyLDYgQEAKIAkgIFNIQS0xIHNlY3VyZSBoYXNoIHN0YW5kYXJkIChGSVBTIDE4MC0xL0RGSVBTIDE4MC0yKSBpbXBsZW1lbnRlZAogCSAgdXNpbmcgc3BhcmM2NCBjcnlwdG8gaW5zdHJ1Y3Rpb25zLCB3aGVuIGF2YWlsYWJsZS4KIAotY29uZmlnIENSWVBUT19TSEExX0FSTQotCXRyaXN0YXRlICJTSEExIGRpZ2VzdCBhbGdvcml0aG0gKEFSTS1hc20pIgotCWRlcGVuZHMgb24gQVJNCi0Jc2VsZWN0IENSWVBUT19TSEExCi0Jc2VsZWN0IENSWVBUT19IQVNICi0JaGVscAotCSAgU0hBLTEgc2VjdXJlIGhhc2ggc3RhbmRhcmQgKEZJUFMgMTgwLTEvREZJUFMgMTgwLTIpIGltcGxlbWVudGVkCi0JICB1c2luZyBvcHRpbWl6ZWQgQVJNIGFzc2VtYmxlci4KLQotY29uZmlnIENSWVBUT19TSEExX0FSTV9ORU9OCi0JdHJpc3RhdGUgIlNIQTEgZGlnZXN0IGFsZ29yaXRobSAoQVJNIE5FT04pIgotCWRlcGVuZHMgb24gQVJNICYmIEtFUk5FTF9NT0RFX05FT04KLQlzZWxlY3QgQ1JZUFRPX1NIQTFfQVJNCi0Jc2VsZWN0IENSWVBUT19TSEExCi0Jc2VsZWN0IENSWVBUT19IQVNICi0JaGVscAotCSAgU0hBLTEgc2VjdXJlIGhhc2ggc3RhbmRhcmQgKEZJUFMgMTgwLTEvREZJUFMgMTgwLTIpIGltcGxlbWVudGVkCi0JICB1c2luZyBvcHRpbWl6ZWQgQVJNIE5FT04gYXNzZW1ibHksIHdoZW4gTkVPTiBpbnN0cnVjdGlvbnMgYXJlCi0JICBhdmFpbGFibGUuCi0KIGNvbmZpZyBDUllQVE9fU0hBMV9QUEMKIAl0cmlzdGF0ZSAiU0hBMSBkaWdlc3QgYWxnb3JpdGhtIChwb3dlcnBjKSIKIAlkZXBlbmRzIG9uIFBQQwpAQCAtNTgyLDYgKzU3OSwxMyBAQAogCSAgVGhpcyBpcyB0aGUgcG93ZXJwYyBoYXJkd2FyZSBhY2NlbGVyYXRlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKIAkgIFNIQS0xIHNlY3VyZSBoYXNoIHN0YW5kYXJkIChGSVBTIDE4MC0xL0RGSVBTIDE4MC0yKS4KIAorY29uZmlnIENSWVBUT19TSEExX1BQQ19TUEUKKwl0cmlzdGF0ZSAiU0hBMSBkaWdlc3QgYWxnb3JpdGhtIChQUEMgU1BFKSIKKwlkZXBlbmRzIG9uIFBQQyAmJiBTUEUKKwloZWxwCisJICBTSEEtMSBzZWN1cmUgaGFzaCBzdGFuZGFyZCAoREZJUFMgMTgwLTQpIGltcGxlbWVudGVkCisJICB1c2luZyBwb3dlcnBjIFNQRSBTSU1EIGluc3RydWN0aW9uIHNldC4KKwogY29uZmlnIENSWVBUT19TSEExX01CCiAJdHJpc3RhdGUgIlNIQTEgZGlnZXN0IGFsZ29yaXRobSAoeDg2XzY0IE11bHRpLUJ1ZmZlciwgRXhwZXJpbWVudGFsKSIKIAlkZXBlbmRzIG9uIFg4NiAmJiA2NEJJVApAQCAtNjEwLDYgKzYxNCwyNCBAQAogCSAgVGhpcyBjb2RlIGFsc28gaW5jbHVkZXMgU0hBLTIyNCwgYSAyMjQgYml0IGhhc2ggd2l0aCAxMTIgYml0cwogCSAgb2Ygc2VjdXJpdHkgYWdhaW5zdCBjb2xsaXNpb24gYXR0YWNrcy4KIAorY29uZmlnIENSWVBUT19TSEEyNTZfUFBDX1NQRQorCXRyaXN0YXRlICJTSEEyMjQgYW5kIFNIQTI1NiBkaWdlc3QgYWxnb3JpdGhtIChQUEMgU1BFKSIKKwlkZXBlbmRzIG9uIFBQQyAmJiBTUEUKKwlzZWxlY3QgQ1JZUFRPX1NIQTI1NgorCXNlbGVjdCBDUllQVE9fSEFTSAorCWhlbHAKKwkgIFNIQTIyNCBhbmQgU0hBMjU2IHNlY3VyZSBoYXNoIHN0YW5kYXJkIChERklQUyAxODAtMikKKwkgIGltcGxlbWVudGVkIHVzaW5nIHBvd2VycGMgU1BFIFNJTUQgaW5zdHJ1Y3Rpb24gc2V0LgorCitjb25maWcgQ1JZUFRPX1NIQTI1Nl9PQ1RFT04KKwl0cmlzdGF0ZSAiU0hBMjI0IGFuZCBTSEEyNTYgZGlnZXN0IGFsZ29yaXRobSAoT0NURU9OKSIKKwlkZXBlbmRzIG9uIENQVV9DQVZJVU1fT0NURU9OCisJc2VsZWN0IENSWVBUT19TSEEyNTYKKwlzZWxlY3QgQ1JZUFRPX0hBU0gKKwloZWxwCisJICBTSEEtMjU2IHNlY3VyZSBoYXNoIHN0YW5kYXJkIChERklQUyAxODAtMikgaW1wbGVtZW50ZWQKKwkgIHVzaW5nIE9DVEVPTiBjcnlwdG8gaW5zdHJ1Y3Rpb25zLCB3aGVuIGF2YWlsYWJsZS4KKwogY29uZmlnIENSWVBUT19TSEEyNTZfU1BBUkM2NAogCXRyaXN0YXRlICJTSEEyMjQgYW5kIFNIQTI1NiBkaWdlc3QgYWxnb3JpdGhtIChTUEFSQzY0KSIKIAlkZXBlbmRzIG9uIFNQQVJDNjQKQEAgLTYzMSw2ICs2NTMsMTUgQEAKIAkgIFRoaXMgY29kZSBhbHNvIGluY2x1ZGVzIFNIQS0zODQsIGEgMzg0IGJpdCBoYXNoIHdpdGggMTkyIGJpdHMKIAkgIG9mIHNlY3VyaXR5IGFnYWluc3QgY29sbGlzaW9uIGF0dGFja3MuCiAKK2NvbmZpZyBDUllQVE9fU0hBNTEyX09DVEVPTgorCXRyaXN0YXRlICJTSEEzODQgYW5kIFNIQTUxMiBkaWdlc3QgYWxnb3JpdGhtcyAoT0NURU9OKSIKKwlkZXBlbmRzIG9uIENQVV9DQVZJVU1fT0NURU9OCisJc2VsZWN0IENSWVBUT19TSEE1MTIKKwlzZWxlY3QgQ1JZUFRPX0hBU0gKKwloZWxwCisJICBTSEEtNTEyIHNlY3VyZSBoYXNoIHN0YW5kYXJkIChERklQUyAxODAtMikgaW1wbGVtZW50ZWQKKwkgIHVzaW5nIE9DVEVPTiBjcnlwdG8gaW5zdHJ1Y3Rpb25zLCB3aGVuIGF2YWlsYWJsZS4KKwogY29uZmlnIENSWVBUT19TSEE1MTJfU1BBUkM2NAogCXRyaXN0YXRlICJTSEEzODQgYW5kIFNIQTUxMiBkaWdlc3QgYWxnb3JpdGhtIChTUEFSQzY0KSIKIAlkZXBlbmRzIG9uIFNQQVJDNjQKQEAgLTY0MCwyMSArNjcxLDYgQEAKIAkgIFNIQS01MTIgc2VjdXJlIGhhc2ggc3RhbmRhcmQgKERGSVBTIDE4MC0yKSBpbXBsZW1lbnRlZAogCSAgdXNpbmcgc3BhcmM2NCBjcnlwdG8gaW5zdHJ1Y3Rpb25zLCB3aGVuIGF2YWlsYWJsZS4KIAotY29uZmlnIENSWVBUT19TSEE1MTJfQVJNX05FT04KLQl0cmlzdGF0ZSAiU0hBMzg0IGFuZCBTSEE1MTIgZGlnZXN0IGFsZ29yaXRobSAoQVJNIE5FT04pIgotCWRlcGVuZHMgb24gQVJNICYmIEtFUk5FTF9NT0RFX05FT04KLQlzZWxlY3QgQ1JZUFRPX1NIQTUxMgotCXNlbGVjdCBDUllQVE9fSEFTSAotCWhlbHAKLQkgIFNIQS01MTIgc2VjdXJlIGhhc2ggc3RhbmRhcmQgKERGSVBTIDE4MC0yKSBpbXBsZW1lbnRlZAotCSAgdXNpbmcgQVJNIE5FT04gaW5zdHJ1Y3Rpb25zLCB3aGVuIGF2YWlsYWJsZS4KLQotCSAgVGhpcyB2ZXJzaW9uIG9mIFNIQSBpbXBsZW1lbnRzIGEgNTEyIGJpdCBoYXNoIHdpdGggMjU2IGJpdHMgb2YKLQkgIHNlY3VyaXR5IGFnYWluc3QgY29sbGlzaW9uIGF0dGFja3MuCi0KLQkgIFRoaXMgY29kZSBhbHNvIGluY2x1ZGVzIFNIQS0zODQsIGEgMzg0IGJpdCBoYXNoIHdpdGggMTkyIGJpdHMKLQkgIG9mIHNlY3VyaXR5IGFnYWluc3QgY29sbGlzaW9uIGF0dGFja3MuCi0KIGNvbmZpZyBDUllQVE9fVEdSMTkyCiAJdHJpc3RhdGUgIlRpZ2VyIGRpZ2VzdCBhbGdvcml0aG1zIgogCXNlbGVjdCBDUllQVE9fSEFTSApAQCAtODE3LDQ1ICs4MzMsMTggQEAKIAkgIGZvciBzb21lIHBvcHVsYXIgYmxvY2sgY2lwaGVyIG1vZGUgaXMgc3VwcG9ydGVkIHRvbywgaW5jbHVkaW5nCiAJICBFQ0IgYW5kIENCQy4KIAotY29uZmlnIENSWVBUT19BRVNfQVJNCi0JdHJpc3RhdGUgIkFFUyBjaXBoZXIgYWxnb3JpdGhtcyAoQVJNLWFzbSkiCi0JZGVwZW5kcyBvbiBBUk0KLQlzZWxlY3QgQ1JZUFRPX0FMR0FQSQotCXNlbGVjdCBDUllQVE9fQUVTCitjb25maWcgQ1JZUFRPX0FFU19QUENfU1BFCisJdHJpc3RhdGUgIkFFUyBjaXBoZXIgYWxnb3JpdGhtcyAoUFBDIFNQRSkiCisJZGVwZW5kcyBvbiBQUEMgJiYgU1BFCiAJaGVscAotCSAgVXNlIG9wdGltaXplZCBBRVMgYXNzZW1ibGVyIHJvdXRpbmVzIGZvciBBUk0gcGxhdGZvcm1zLgotCi0JICBBRVMgY2lwaGVyIGFsZ29yaXRobXMgKEZJUFMtMTk3KS4gQUVTIHVzZXMgdGhlIFJpam5kYWVsCi0JICBhbGdvcml0aG0uCi0KLQkgIFJpam5kYWVsIGFwcGVhcnMgdG8gYmUgY29uc2lzdGVudGx5IGEgdmVyeSBnb29kIHBlcmZvcm1lciBpbgotCSAgYm90aCBoYXJkd2FyZSBhbmQgc29mdHdhcmUgYWNyb3NzIGEgd2lkZSByYW5nZSBvZiBjb21wdXRpbmcKLQkgIGVudmlyb25tZW50cyByZWdhcmRsZXNzIG9mIGl0cyB1c2UgaW4gZmVlZGJhY2sgb3Igbm9uLWZlZWRiYWNrCi0JICBtb2Rlcy4gSXRzIGtleSBzZXR1cCB0aW1lIGlzIGV4Y2VsbGVudCwgYW5kIGl0cyBrZXkgYWdpbGl0eSBpcwotCSAgZ29vZC4gUmlqbmRhZWwncyB2ZXJ5IGxvdyBtZW1vcnkgcmVxdWlyZW1lbnRzIG1ha2UgaXQgdmVyeSB3ZWxsCi0JICBzdWl0ZWQgZm9yIHJlc3RyaWN0ZWQtc3BhY2UgZW52aXJvbm1lbnRzLCBpbiB3aGljaCBpdCBhbHNvCi0JICBkZW1vbnN0cmF0ZXMgZXhjZWxsZW50IHBlcmZvcm1hbmNlLiBSaWpuZGFlbCdzIG9wZXJhdGlvbnMgYXJlCi0JICBhbW9uZyB0aGUgZWFzaWVzdCB0byBkZWZlbmQgYWdhaW5zdCBwb3dlciBhbmQgdGltaW5nIGF0dGFja3MuCi0KLQkgIFRoZSBBRVMgc3BlY2lmaWVzIHRocmVlIGtleSBzaXplczogMTI4LCAxOTIgYW5kIDI1NiBiaXRzCi0KLQkgIFNlZSA8aHR0cDovL2NzcmMubmlzdC5nb3YvZW5jcnlwdGlvbi9hZXMvPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotY29uZmlnIENSWVBUT19BRVNfQVJNX0JTCi0JdHJpc3RhdGUgIkJpdCBzbGljZWQgQUVTIHVzaW5nIE5FT04gaW5zdHJ1Y3Rpb25zIgotCWRlcGVuZHMgb24gQVJNICYmIEtFUk5FTF9NT0RFX05FT04KLQlzZWxlY3QgQ1JZUFRPX0FMR0FQSQotCXNlbGVjdCBDUllQVE9fQUVTX0FSTQotCXNlbGVjdCBDUllQVE9fQUJMS19IRUxQRVIKLQloZWxwCi0JICBVc2UgYSBmYXN0ZXIgYW5kIG1vcmUgc2VjdXJlIE5FT04gYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgQUVTIGluIENCQywKLQkgIENUUiBhbmQgWFRTIG1vZGVzCi0KLQkgIEJpdCBzbGljZWQgQUVTIGdpdmVzIGFyb3VuZCA0NSUgc3BlZWR1cCBvbiBDb3J0ZXgtQTE1IGZvciBDVFIgbW9kZQotCSAgYW5kIGZvciBYVFMgbW9kZSBlbmNyeXB0aW9uLCBDQkMgYW5kIFhUUyBtb2RlIGRlY3J5cHRpb24gc3BlZWR1cCBpcwotCSAgYXJvdW5kIDI1JS4gKENCQyBlbmNyeXB0aW9uIHNwZWVkIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzIGRyaXZlci4pCi0JICBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHJlbHkgb24gYW55IGxvb2t1cCB0YWJsZXMgc28gaXQgaXMKLQkgIGJlbGlldmVkIHRvIGJlIGludnVsbmVyYWJsZSB0byBjYWNoZSB0aW1pbmcgYXR0YWNrcy4KKwkgIEFFUyBjaXBoZXIgYWxnb3JpdGhtcyAoRklQUy0xOTcpLiBBZGRpdGlvbmFsbHkgdGhlIGFjY2VsZXJhdGlvbgorCSAgZm9yIHBvcHVsYXIgYmxvY2sgY2lwaGVyIG1vZGVzIEVDQiwgQ0JDLCBDVFIgYW5kIFhUUyBpcyBzdXBwb3J0ZWQuCisJICBUaGlzIG1vZHVsZSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBsb3cgcG93ZXIgKHJvdXRlcikgZGV2aWNlcworCSAgd2l0aG91dCBoYXJkd2FyZSBBRVMgYWNjZWxlcmF0aW9uIChlLmcuIGNhYW0gY3J5cHRvKS4gSXQgcmVkdWNlcyB0aGUKKwkgIHNpemUgb2YgdGhlIEFFUyB0YWJsZXMgZnJvbSAxNktCIHRvIDhLQiArIDI1NiBieXRlcyBhbmQgbWl0aWdhdGVzCisJICB0aW1pbmluZyBhdHRhY2tzLiBOZXZlcnRoZWxlc3MgaXQgbWlnaHQgYmUgbm90IGFzIHNlY3VyZSBhcyBvdGhlcgorCSAgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3b3JrIG9uIDFLQgorCSAgdGFibGVzIG9yIDI1NiBieXRlcyBTLWJveGVzLgogCiBjb25maWcgQ1JZUFRPX0FOVUJJUwogCXRyaXN0YXRlICJBbnViaXMgY2lwaGVyIGFsZ29yaXRobSIKQEAgLTExOTksNyArMTE4OCw3IEBACiAJICBLZXlzIGFyZSBhbGxvd2VkIHRvIGJlIGZyb20gMCB0byAyNTYgYml0cyBpbiBsZW5ndGgsIGluIHN0ZXBzCiAJICBvZiA4IGJpdHMuCiAKLQkgIFRoaXMgbW9kdWxlIHByb3ZpZGVzIFNlcnBlbnQgY2lwaGVyIGFsZ29yaXRobSB0aGF0IHByb2Nlc3NlcyBlaWd0aAorCSAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgU2VycGVudCBjaXBoZXIgYWxnb3JpdGhtIHRoYXQgcHJvY2Vzc2VzIGVpZ2h0CiAJICBibG9ja3MgcGFyYWxsZWwgdXNpbmcgU1NFMiBpbnN0cnVjdGlvbiBzZXQuCiAKIAkgIFNlZSBhbHNvOgpAQCAtMTUyMyw2ICsxNTEyLDE1IEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSB1c2VyLXNwYWNlcyBpbnRlcmZhY2UgZm9yIHJhbmRvbQogCSAgbnVtYmVyIGdlbmVyYXRvciBhbGdvcml0aG1zLgogCitjb25maWcgQ1JZUFRPX1VTRVJfQVBJX0FFQUQKKwl0cmlzdGF0ZSAiVXNlci1zcGFjZSBpbnRlcmZhY2UgZm9yIEFFQUQgY2lwaGVyIGFsZ29yaXRobXMiCisJZGVwZW5kcyBvbiBORVQKKwlzZWxlY3QgQ1JZUFRPX0FFQUQKKwlzZWxlY3QgQ1JZUFRPX1VTRVJfQVBJCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgdXNlci1zcGFjZXMgaW50ZXJmYWNlIGZvciBBRUFECisJICBjaXBoZXIgYWxnb3JpdGhtcy4KKwogY29uZmlnIENSWVBUT19IQVNIX0lORk8KIAlib29sCiAKZGlmZiAtLWdpdCBhL2NyeXB0by9NYWtlZmlsZSBiL2NyeXB0by9NYWtlZmlsZQppbmRleCBiYTE5NDY1Li45N2I3ZDNhIDEwMDY0NAotLS0gYS9jcnlwdG8vTWFrZWZpbGUKKysrIGIvY3J5cHRvL01ha2VmaWxlCkBAIC0xMDAsNiArMTAwLDcgQEAKIG9iai0kKENPTkZJR19DUllQVE9fVVNFUl9BUElfSEFTSCkgKz0gYWxnaWZfaGFzaC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1NLQ0lQSEVSKSArPSBhbGdpZl9za2NpcGhlci5vCiBvYmotJChDT05GSUdfQ1JZUFRPX1VTRVJfQVBJX1JORykgKz0gYWxnaWZfcm5nLm8KK29iai0kKENPTkZJR19DUllQVE9fVVNFUl9BUElfQUVBRCkgKz0gYWxnaWZfYWVhZC5vCiAKICMKICMgZ2VuZXJpYyBhbGdvcml0aG1zIGFuZCB0aGUgYXN5bmNfdHggYXBpCmRpZmYgLS1naXQgYS9jcnlwdG8vYWJsa19oZWxwZXIuYyBiL2NyeXB0by9hYmxrX2hlbHBlci5jCmluZGV4IGZmZTcyNzguLmUxZmNmNTMgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hYmxrX2hlbHBlci5jCisrKyBiL2NyeXB0by9hYmxrX2hlbHBlci5jCkBAIC0xMjQsNyArMTI0LDggQEAKIAlzdHJ1Y3QgYXN5bmNfaGVscGVyX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKIAlzdHJ1Y3QgY3J5cHRkX2FibGtjaXBoZXIgKmNyeXB0ZF90Zm07CiAKLQljcnlwdGRfdGZtID0gY3J5cHRkX2FsbG9jX2FibGtjaXBoZXIoZHJ2X25hbWUsIDAsIDApOworCWNyeXB0ZF90Zm0gPSBjcnlwdGRfYWxsb2NfYWJsa2NpcGhlcihkcnZfbmFtZSwgQ1JZUFRPX0FMR19JTlRFUk5BTCwKKwkJCQkJICAgICBDUllQVE9fQUxHX0lOVEVSTkFMKTsKIAlpZiAoSVNfRVJSKGNyeXB0ZF90Zm0pKQogCQlyZXR1cm4gUFRSX0VSUihjcnlwdGRfdGZtKTsKIApkaWZmIC0tZ2l0IGEvY3J5cHRvL2FmX2FsZy5jIGIvY3J5cHRvL2FmX2FsZy5jCmluZGV4IDdmOGI3ZWRjLi5mMjJjYzU2IDEwMDY0NAotLS0gYS9jcnlwdG8vYWZfYWxnLmMKKysrIGIvY3J5cHRvL2FmX2FsZy5jCkBAIC0zNTgsOCArMzU4LDggQEAKIAlucGFnZXMgPSAob2ZmICsgbiArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CiAJaWYgKFdBUk5fT04obnBhZ2VzID09IDApKQogCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNnX2luaXRfdGFibGUoc2dsLT5zZywgbnBhZ2VzKTsKKwkvKiBBZGQgb25lIGV4dHJhIGZvciBsaW5raW5nICovCisJc2dfaW5pdF90YWJsZShzZ2wtPnNnLCBucGFnZXMgKyAxKTsKIAogCWZvciAoaSA9IDAsIGxlbiA9IG47IGkgPCBucGFnZXM7IGkrKykgewogCQlpbnQgcGxlbiA9IG1pbl90KGludCwgbGVuLCBQQUdFX1NJWkUgLSBvZmYpOwpAQCAtMzY5LDE4ICszNjksMjYgQEAKIAkJb2ZmID0gMDsKIAkJbGVuIC09IHBsZW47CiAJfQorCXNnX21hcmtfZW5kKHNnbC0+c2cgKyBucGFnZXMgLSAxKTsKKwlzZ2wtPm5wYWdlcyA9IG5wYWdlczsKKwogCXJldHVybiBuOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWZfYWxnX21ha2Vfc2cpOwogCit2b2lkIGFmX2FsZ19saW5rX3NnKHN0cnVjdCBhZl9hbGdfc2dsICpzZ2xfcHJldiwgc3RydWN0IGFmX2FsZ19zZ2wgKnNnbF9uZXcpCit7CisJc2dfdW5tYXJrX2VuZChzZ2xfcHJldi0+c2cgKyBzZ2xfcHJldi0+bnBhZ2VzIC0gMSk7CisJc2dfY2hhaW4oc2dsX3ByZXYtPnNnLCBzZ2xfcHJldi0+bnBhZ2VzICsgMSwgc2dsX25ldy0+c2cpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWZfYWxnX2xpbmtfc2cpOworCiB2b2lkIGFmX2FsZ19mcmVlX3NnKHN0cnVjdCBhZl9hbGdfc2dsICpzZ2wpCiB7CiAJaW50IGk7CiAKLQlpID0gMDsKLQlkbyB7CisJZm9yIChpID0gMDsgaSA8IHNnbC0+bnBhZ2VzOyBpKyspCiAJCXB1dF9wYWdlKHNnbC0+cGFnZXNbaV0pOwotCX0gd2hpbGUgKCFzZ19pc19sYXN0KHNnbC0+c2cgKyAoaSsrKSkpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWZfYWxnX2ZyZWVfc2cpOwogCmRpZmYgLS1naXQgYS9jcnlwdG8vYWxnYXBpLmMgYi9jcnlwdG8vYWxnYXBpLmMKaW5kZXggODNiMDRlMC4uZDI2MjdhMyAxMDA2NDQKLS0tIGEvY3J5cHRvL2FsZ2FwaS5jCisrKyBiL2NyeXB0by9hbGdhcGkuYwpAQCAtNjQsNiArNjQsOCBAQAogCWlmIChhbGctPmNyYV9wcmlvcml0eSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCisJYXRvbWljX3NldCgmYWxnLT5jcmFfcmVmY250LCAxKTsKKwogCXJldHVybiBjcnlwdG9fc2V0X2RyaXZlcl9uYW1lKGFsZyk7CiB9CiAKQEAgLTk5LDEwICsxMDEsOSBAQAogCXJldHVybiAmbi0+bGlzdCA9PSBzdGFjayA/IHRvcCA6ICZuLT5pbnN0LT5hbGcuY3JhX3VzZXJzOwogfQogCi1zdGF0aWMgdm9pZCBjcnlwdG9fcmVtb3ZlX3NwYXduKHN0cnVjdCBjcnlwdG9fc3Bhd24gKnNwYXduLAotCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCitzdGF0aWMgdm9pZCBjcnlwdG9fcmVtb3ZlX2luc3RhbmNlKHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QsCisJCQkJICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKIHsKLQlzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0ID0gc3Bhd24tPmluc3Q7CiAJc3RydWN0IGNyeXB0b190ZW1wbGF0ZSAqdG1wbCA9IGluc3QtPnRtcGw7CiAKIAlpZiAoY3J5cHRvX2lzX2RlYWQoJmluc3QtPmFsZykpCkBAIC0xNjcsNyArMTY4LDcgQEAKIAkJaWYgKHNwYXduLT5hbGcpCiAJCQlsaXN0X21vdmUoJnNwYXduLT5saXN0LCAmc3Bhd24tPmFsZy0+Y3JhX3VzZXJzKTsKIAkJZWxzZQotCQkJY3J5cHRvX3JlbW92ZV9zcGF3bihzcGF3biwgbGlzdCk7CisJCQljcnlwdG9fcmVtb3ZlX2luc3RhbmNlKHNwYXduLT5pbnN0LCBsaXN0KTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcnlwdG9fcmVtb3ZlX3NwYXducyk7CkBAIC0xODgsNyArMTg5LDYgQEAKIAogCXJldCA9IC1FRVhJU1Q7CiAKLQlhdG9taWNfc2V0KCZhbGctPmNyYV9yZWZjbnQsIDEpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkocSwgJmNyeXB0b19hbGdfbGlzdCwgY3JhX2xpc3QpIHsKIAkJaWYgKHEgPT0gYWxnKQogCQkJZ290byBlcnI7CkBAIC01MjMsMTEgKzUyMywxNCBAQAogCiAJZXJyID0gY3J5cHRvX2NoZWNrX2FsZygmaW5zdC0+YWxnKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycjsKKwkJcmV0dXJuIGVycjsKIAogCWluc3QtPmFsZy5jcmFfbW9kdWxlID0gdG1wbC0+bW9kdWxlOwogCWluc3QtPmFsZy5jcmFfZmxhZ3MgfD0gQ1JZUFRPX0FMR19JTlNUQU5DRTsKIAorCWlmICh1bmxpa2VseSghY3J5cHRvX21vZF9nZXQoJmluc3QtPmFsZykpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwogCWRvd25fd3JpdGUoJmNyeXB0b19hbGdfc2VtKTsKIAogCWxhcnZhbCA9IF9fY3J5cHRvX3JlZ2lzdGVyX2FsZygmaW5zdC0+YWxnKTsKQEAgLTU0NSwzNyArNTQ4LDMwIEBACiAJCWdvdG8gZXJyOwogCiAJY3J5cHRvX3dhaXRfZm9yX3Rlc3QobGFydmFsKTsKKworCS8qIFJlbW92ZSBpbnN0YW5jZSBpZiB0ZXN0IGZhaWxlZCAqLworCWlmICghKGluc3QtPmFsZy5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX1RFU1RFRCkpCisJCWNyeXB0b191bnJlZ2lzdGVyX2luc3RhbmNlKGluc3QpOwogCWVyciA9IDA7CiAKIGVycjoKKwljcnlwdG9fbW9kX3B1dCgmaW5zdC0+YWxnKTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3J5cHRvX3JlZ2lzdGVyX2luc3RhbmNlKTsKIAotaW50IGNyeXB0b191bnJlZ2lzdGVyX2luc3RhbmNlKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpCitpbnQgY3J5cHRvX3VucmVnaXN0ZXJfaW5zdGFuY2Uoc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdCkKIHsKLQlpbnQgZXJyOwotCXN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QgPSAodm9pZCAqKWFsZzsKLQlzdHJ1Y3QgY3J5cHRvX3RlbXBsYXRlICp0bXBsID0gaW5zdC0+dG1wbDsKLQlMSVNUX0hFQUQodXNlcnMpOwotCi0JaWYgKCEoYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX0lOU1RBTkNFKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlCVUdfT04oYXRvbWljX3JlYWQoJmFsZy0+Y3JhX3JlZmNudCkgIT0gMSk7CisJTElTVF9IRUFEKGxpc3QpOwogCiAJZG93bl93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOwogCi0JaGxpc3RfZGVsX2luaXQoJmluc3QtPmxpc3QpOwotCWVyciA9IGNyeXB0b19yZW1vdmVfYWxnKGFsZywgJnVzZXJzKTsKKwljcnlwdG9fcmVtb3ZlX3NwYXducygmaW5zdC0+YWxnLCAmbGlzdCwgTlVMTCk7CisJY3J5cHRvX3JlbW92ZV9pbnN0YW5jZShpbnN0LCAmbGlzdCk7CiAKIAl1cF93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOwogCi0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCXRtcGwtPmZyZWUoaW5zdCk7Ci0JY3J5cHRvX3JlbW92ZV9maW5hbCgmdXNlcnMpOworCWNyeXB0b19yZW1vdmVfZmluYWwoJmxpc3QpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9jcnlwdG8vYWxnaWZfYWVhZC5jIGIvY3J5cHRvL2FsZ2lmX2FlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGE2ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvY3J5cHRvL2FsZ2lmX2FlYWQuYwpAQCAtMCwwICsxLDY2NCBAQAorLyoKKyAqIGFsZ2lmX2FlYWQ6IFVzZXItc3BhY2UgaW50ZXJmYWNlIGZvciBBRUFEIGFsZ29yaXRobXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQsIFN0ZXBoYW4gTXVlbGxlciA8c211ZWxsZXJAY2hyb25veC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIHVzZXItc3BhY2UgQVBJIGZvciBBRUFEIGNpcGhlcnMuCisgKgorICogVGhpcyBmaWxlIGlzIGRlcml2ZWQgZnJvbSBhbGdpZl9za2NpcGhlci5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGNyeXB0by9zY2F0dGVyd2Fsay5oPgorI2luY2x1ZGUgPGNyeXB0by9pZl9hbGcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKworc3RydWN0IGFlYWRfc2dfbGlzdCB7CisJdW5zaWduZWQgaW50IGN1cjsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbQUxHX01BWF9QQUdFU107Cit9OworCitzdHJ1Y3QgYWVhZF9jdHggeworCXN0cnVjdCBhZWFkX3NnX2xpc3QgdHNnbDsKKwkvKgorCSAqIFJTR0xfTUFYX0VOVFJJRVMgaXMgYW4gYXJ0aWZpY2lhbCBsaW1pdCB3aGVyZSB1c2VyIHNwYWNlIGF0IG1heGltdW0KKwkgKiBjYW4gY2F1c2UgdGhlIGtlcm5lbCB0byBhbGxvY2F0ZSBSU0dMX01BWF9FTlRSSUVTICogQUxHX01BWF9QQUdFUworCSAqIGJ5dGVzCisJICovCisjZGVmaW5lIFJTR0xfTUFYX0VOVFJJRVMgQUxHX01BWF9QQUdFUworCXN0cnVjdCBhZl9hbGdfc2dsIHJzZ2xbUlNHTF9NQVhfRU5UUklFU107CisKKwl2b2lkICppdjsKKworCXN0cnVjdCBhZl9hbGdfY29tcGxldGlvbiBjb21wbGV0aW9uOworCisJdW5zaWduZWQgbG9uZyB1c2VkOworCisJdW5zaWduZWQgaW50IGxlbjsKKwlib29sIG1vcmU7CisJYm9vbCBtZXJnZTsKKwlib29sIGVuYzsKKworCXNpemVfdCBhZWFkX2Fzc29jbGVuOworCXN0cnVjdCBhZWFkX3JlcXVlc3QgYWVhZF9yZXE7Cit9OworCitzdGF0aWMgaW5saW5lIGludCBhZWFkX3NuZGJ1ZihzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCXN0cnVjdCBhZWFkX2N0eCAqY3R4ID0gYXNrLT5wcml2YXRlOworCisJcmV0dXJuIG1heF90KGludCwgbWF4X3QoaW50LCBzay0+c2tfc25kYnVmICYgUEFHRV9NQVNLLCBQQUdFX1NJWkUpIC0KKwkJCSAgY3R4LT51c2VkLCAwKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGFlYWRfd3JpdGFibGUoc3RydWN0IHNvY2sgKnNrKQoreworCXJldHVybiBQQUdFX1NJWkUgPD0gYWVhZF9zbmRidWYoc2spOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYWVhZF9zdWZmaWNpZW50X2RhdGEoc3RydWN0IGFlYWRfY3R4ICpjdHgpCit7CisJdW5zaWduZWQgYXMgPSBjcnlwdG9fYWVhZF9hdXRoc2l6ZShjcnlwdG9fYWVhZF9yZXF0Zm0oJmN0eC0+YWVhZF9yZXEpKTsKKworCXJldHVybiAoY3R4LT51c2VkID49IChjdHgtPmFlYWRfYXNzb2NsZW4gKyAoY3R4LT5lbmMgPyAwIDogYXMpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGFlYWRfcHV0X3NnbChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCXN0cnVjdCBhZWFkX2N0eCAqY3R4ID0gYXNrLT5wcml2YXRlOworCXN0cnVjdCBhZWFkX3NnX2xpc3QgKnNnbCA9ICZjdHgtPnRzZ2w7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNnbC0+c2c7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2dsLT5jdXI7IGkrKykgeworCQlpZiAoIXNnX3BhZ2Uoc2cgKyBpKSkKKwkJCWNvbnRpbnVlOworCisJCXB1dF9wYWdlKHNnX3BhZ2Uoc2cgKyBpKSk7CisJCXNnX2Fzc2lnbl9wYWdlKHNnICsgaSwgTlVMTCk7CisJfQorCXNnbC0+Y3VyID0gMDsKKwljdHgtPnVzZWQgPSAwOworCWN0eC0+bW9yZSA9IDA7CisJY3R4LT5tZXJnZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGFlYWRfd21lbV93YWtldXAoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBzb2NrZXRfd3EgKndxOworCisJaWYgKCFhZWFkX3dyaXRhYmxlKHNrKSkKKwkJcmV0dXJuOworCisJcmN1X3JlYWRfbG9jaygpOworCXdxID0gcmN1X2RlcmVmZXJlbmNlKHNrLT5za193cSk7CisJaWYgKHdxX2hhc19zbGVlcGVyKHdxKSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3N5bmNfcG9sbCgmd3EtPndhaXQsIFBPTExJTiB8CisJCQkJCQkJICAgUE9MTFJETk9STSB8CisJCQkJCQkJICAgUE9MTFJEQkFORCk7CisJc2tfd2FrZV9hc3luYyhzaywgU09DS19XQUtFX1dBSVRELCBQT0xMX0lOKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIGludCBhZWFkX3dhaXRfZm9yX2RhdGEoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBmbGFncykKK3sKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IGFlYWRfY3R4ICpjdHggPSBhc2stPnByaXZhdGU7CisJbG9uZyB0aW1lb3V0OworCURFRklORV9XQUlUKHdhaXQpOworCWludCBlcnIgPSAtRVJFU1RBUlRTWVM7CisKKwlpZiAoZmxhZ3MgJiBNU0dfRE9OVFdBSVQpCisJCXJldHVybiAtRUFHQUlOOworCisJc2V0X2JpdChTT0NLX0FTWU5DX1dBSVREQVRBLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCisJZm9yICg7OykgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKKwkJcHJlcGFyZV90b193YWl0KHNrX3NsZWVwKHNrKSwgJndhaXQsIFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXRpbWVvdXQgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwkJaWYgKHNrX3dhaXRfZXZlbnQoc2ssICZ0aW1lb3V0LCAhY3R4LT5tb3JlKSkgeworCQkJZXJyID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWZpbmlzaF93YWl0KHNrX3NsZWVwKHNrKSwgJndhaXQpOworCisJY2xlYXJfYml0KFNPQ0tfQVNZTkNfV0FJVERBVEEsICZzay0+c2tfc29ja2V0LT5mbGFncyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBhZWFkX2RhdGFfd2FrZXVwKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IGFlYWRfY3R4ICpjdHggPSBhc2stPnByaXZhdGU7CisJc3RydWN0IHNvY2tldF93cSAqd3E7CisKKwlpZiAoY3R4LT5tb3JlKQorCQlyZXR1cm47CisJaWYgKCFjdHgtPnVzZWQpCisJCXJldHVybjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwl3cSA9IHJjdV9kZXJlZmVyZW5jZShzay0+c2tfd3EpOworCWlmICh3cV9oYXNfc2xlZXBlcih3cSkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jX3BvbGwoJndxLT53YWl0LCBQT0xMT1VUIHwKKwkJCQkJCQkgICBQT0xMUkROT1JNIHwKKwkJCQkJCQkgICBQT0xMUkRCQU5EKTsKKwlza193YWtlX2FzeW5jKHNrLCBTT0NLX1dBS0VfU1BBQ0UsIFBPTExfT1VUKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIGludCBhZWFkX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IGFlYWRfY3R4ICpjdHggPSBhc2stPnByaXZhdGU7CisJdW5zaWduZWQgaXZzaXplID0KKwkJY3J5cHRvX2FlYWRfaXZzaXplKGNyeXB0b19hZWFkX3JlcXRmbSgmY3R4LT5hZWFkX3JlcSkpOworCXN0cnVjdCBhZWFkX3NnX2xpc3QgKnNnbCA9ICZjdHgtPnRzZ2w7CisJc3RydWN0IGFmX2FsZ19jb250cm9sIGNvbiA9IHt9OworCWxvbmcgY29waWVkID0gMDsKKwlib29sIGVuYyA9IDA7CisJYm9vbCBpbml0ID0gMDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWlmIChtc2ctPm1zZ19jb250cm9sbGVuKSB7CisJCWVyciA9IGFmX2FsZ19jbXNnX3NlbmQobXNnLCAmY29uKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJaW5pdCA9IDE7CisJCXN3aXRjaCAoY29uLm9wKSB7CisJCWNhc2UgQUxHX09QX0VOQ1JZUFQ6CisJCQllbmMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgQUxHX09QX0RFQ1JZUFQ6CisJCQllbmMgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChjb24uaXYgJiYgY29uLml2LT5pdmxlbiAhPSBpdnNpemUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsb2NrX3NvY2soc2spOworCWlmICghY3R4LT5tb3JlICYmIGN0eC0+dXNlZCkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAoaW5pdCkgeworCQljdHgtPmVuYyA9IGVuYzsKKwkJaWYgKGNvbi5pdikKKwkJCW1lbWNweShjdHgtPml2LCBjb24uaXYtPml2LCBpdnNpemUpOworCisJCWN0eC0+YWVhZF9hc3NvY2xlbiA9IGNvbi5hZWFkX2Fzc29jbGVuOworCX0KKworCXdoaWxlIChzaXplKSB7CisJCXVuc2lnbmVkIGxvbmcgbGVuID0gc2l6ZTsKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7CisKKwkJLyogdXNlIHRoZSBleGlzdGluZyBtZW1vcnkgaW4gYW4gYWxsb2NhdGVkIHBhZ2UgKi8KKwkJaWYgKGN0eC0+bWVyZ2UpIHsKKwkJCXNnID0gc2dsLT5zZyArIHNnbC0+Y3VyIC0gMTsKKwkJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIGxlbiwKKwkJCQkgICAgUEFHRV9TSVpFIC0gc2ctPm9mZnNldCAtIHNnLT5sZW5ndGgpOworCQkJZXJyID0gbWVtY3B5X2Zyb21fbXNnKHBhZ2VfYWRkcmVzcyhzZ19wYWdlKHNnKSkgKworCQkJCQkgICAgICBzZy0+b2Zmc2V0ICsgc2ctPmxlbmd0aCwKKwkJCQkJICAgICAgbXNnLCBsZW4pOworCQkJaWYgKGVycikKKwkJCQlnb3RvIHVubG9jazsKKworCQkJc2ctPmxlbmd0aCArPSBsZW47CisJCQljdHgtPm1lcmdlID0gKHNnLT5vZmZzZXQgKyBzZy0+bGVuZ3RoKSAmCisJCQkJICAgICAoUEFHRV9TSVpFIC0gMSk7CisKKwkJCWN0eC0+dXNlZCArPSBsZW47CisJCQljb3BpZWQgKz0gbGVuOworCQkJc2l6ZSAtPSBsZW47CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghYWVhZF93cml0YWJsZShzaykpIHsKKwkJCS8qIHVzZXIgc3BhY2Ugc2VudCB0b28gbXVjaCBkYXRhICovCisJCQlhZWFkX3B1dF9zZ2woc2spOworCQkJZXJyID0gLUVNU0dTSVpFOworCQkJZ290byB1bmxvY2s7CisJCX0KKworCQkvKiBhbGxvY2F0ZSBhIG5ldyBwYWdlICovCisJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHNpemUsIGFlYWRfc25kYnVmKHNrKSk7CisJCXdoaWxlIChsZW4pIHsKKwkJCWludCBwbGVuID0gMDsKKworCQkJaWYgKHNnbC0+Y3VyID49IEFMR19NQVhfUEFHRVMpIHsKKwkJCQlhZWFkX3B1dF9zZ2woc2spOworCQkJCWVyciA9IC1FMkJJRzsKKwkJCQlnb3RvIHVubG9jazsKKwkJCX0KKworCQkJc2cgPSBzZ2wtPnNnICsgc2dsLT5jdXI7CisJCQlwbGVuID0gbWluX3QoaW50LCBsZW4sIFBBR0VfU0laRSk7CisKKwkJCXNnX2Fzc2lnbl9wYWdlKHNnLCBhbGxvY19wYWdlKEdGUF9LRVJORUwpKTsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlpZiAoIXNnX3BhZ2Uoc2cpKQorCQkJCWdvdG8gdW5sb2NrOworCisJCQllcnIgPSBtZW1jcHlfZnJvbV9tc2cocGFnZV9hZGRyZXNzKHNnX3BhZ2Uoc2cpKSwKKwkJCQkJICAgICAgbXNnLCBwbGVuKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlfX2ZyZWVfcGFnZShzZ19wYWdlKHNnKSk7CisJCQkJc2dfYXNzaWduX3BhZ2Uoc2csIE5VTEwpOworCQkJCWdvdG8gdW5sb2NrOworCQkJfQorCisJCQlzZy0+b2Zmc2V0ID0gMDsKKwkJCXNnLT5sZW5ndGggPSBwbGVuOworCQkJbGVuIC09IHBsZW47CisJCQljdHgtPnVzZWQgKz0gcGxlbjsKKwkJCWNvcGllZCArPSBwbGVuOworCQkJc2dsLT5jdXIrKzsKKwkJCXNpemUgLT0gcGxlbjsKKwkJCWN0eC0+bWVyZ2UgPSBwbGVuICYgKFBBR0VfU0laRSAtIDEpOworCQl9CisJfQorCisJZXJyID0gMDsKKworCWN0eC0+bW9yZSA9IG1zZy0+bXNnX2ZsYWdzICYgTVNHX01PUkU7CisJaWYgKCFjdHgtPm1vcmUgJiYgIWFlYWRfc3VmZmljaWVudF9kYXRhKGN0eCkpIHsKKwkJYWVhZF9wdXRfc2dsKHNrKTsKKwkJZXJyID0gLUVNU0dTSVpFOworCX0KKwordW5sb2NrOgorCWFlYWRfZGF0YV93YWtldXAoc2spOworCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gZXJyID86IGNvcGllZDsKK30KKworc3RhdGljIHNzaXplX3QgYWVhZF9zZW5kcGFnZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJCSAgICAgaW50IG9mZnNldCwgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IGFlYWRfY3R4ICpjdHggPSBhc2stPnByaXZhdGU7CisJc3RydWN0IGFlYWRfc2dfbGlzdCAqc2dsID0gJmN0eC0+dHNnbDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWlmIChmbGFncyAmIE1TR19TRU5EUEFHRV9OT1RMQVNUKQorCQlmbGFncyB8PSBNU0dfTU9SRTsKKworCWlmIChzZ2wtPmN1ciA+PSBBTEdfTUFYX1BBR0VTKQorCQlyZXR1cm4gLUUyQklHOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoIWN0eC0+bW9yZSAmJiBjdHgtPnVzZWQpCisJCWdvdG8gdW5sb2NrOworCisJaWYgKCFzaXplKQorCQlnb3RvIGRvbmU7CisKKwlpZiAoIWFlYWRfd3JpdGFibGUoc2spKSB7CisJCS8qIHVzZXIgc3BhY2Ugc2VudCB0b28gbXVjaCBkYXRhICovCisJCWFlYWRfcHV0X3NnbChzayk7CisJCWVyciA9IC1FTVNHU0laRTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJY3R4LT5tZXJnZSA9IDA7CisKKwlnZXRfcGFnZShwYWdlKTsKKwlzZ19zZXRfcGFnZShzZ2wtPnNnICsgc2dsLT5jdXIsIHBhZ2UsIHNpemUsIG9mZnNldCk7CisJc2dsLT5jdXIrKzsKKwljdHgtPnVzZWQgKz0gc2l6ZTsKKworCWVyciA9IDA7CisKK2RvbmU6CisJY3R4LT5tb3JlID0gZmxhZ3MgJiBNU0dfTU9SRTsKKwlpZiAoIWN0eC0+bW9yZSAmJiAhYWVhZF9zdWZmaWNpZW50X2RhdGEoY3R4KSkgeworCQlhZWFkX3B1dF9zZ2woc2spOworCQllcnIgPSAtRU1TR1NJWkU7CisJfQorCit1bmxvY2s6CisJYWVhZF9kYXRhX3dha2V1cChzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiBlcnIgPzogc2l6ZTsKK30KKworc3RhdGljIGludCBhZWFkX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgaWdub3JlZCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKKwlzdHJ1Y3QgYWVhZF9jdHggKmN0eCA9IGFzay0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBicyA9IGNyeXB0b19hZWFkX2Jsb2Nrc2l6ZShjcnlwdG9fYWVhZF9yZXF0Zm0oJmN0eC0+YWVhZF9yZXEpKTsKKwl1bnNpZ25lZCBhcyA9IGNyeXB0b19hZWFkX2F1dGhzaXplKGNyeXB0b19hZWFkX3JlcXRmbSgmY3R4LT5hZWFkX3JlcSkpOworCXN0cnVjdCBhZWFkX3NnX2xpc3QgKnNnbCA9ICZjdHgtPnRzZ2w7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IE5VTEw7CisJc3RydWN0IHNjYXR0ZXJsaXN0IGFzc29jW0FMR19NQVhfUEFHRVNdOworCXNpemVfdCBhc3NvY2xlbiA9IDA7CisJdW5zaWduZWQgaW50IGkgPSAwOworCWludCBlcnIgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgdXNlZCA9IDA7CisJc2l6ZV90IG91dGxlbiA9IDA7CisJc2l6ZV90IHVzZWRwYWdlcyA9IDA7CisJdW5zaWduZWQgaW50IGNudCA9IDA7CisKKwkvKiBMaW1pdCBudW1iZXIgb2YgSU9WIGJsb2NrcyB0byBiZSBhY2Nlc3NlZCBiZWxvdyAqLworCWlmIChtc2ctPm1zZ19pdGVyLm5yX3NlZ3MgPiBSU0dMX01BWF9FTlRSSUVTKQorCQlyZXR1cm4gLUVOT01TRzsKKworCWxvY2tfc29jayhzayk7CisKKwkvKgorCSAqIEFFQUQgbWVtb3J5IHN0cnVjdHVyZTogRm9yIGVuY3J5cHRpb24sIHRoZSB0YWcgaXMgYXBwZW5kZWQgdG8gdGhlCisJICogY2lwaGVydGV4dCB3aGljaCBpbXBsaWVzIHRoYXQgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBjaXBoZXJ0ZXh0CisJICogbXVzdCBiZSBpbmNyZWFzZWQgYnkgdGhlIHRhZyBsZW5ndGguIEZvciBkZWNyeXB0aW9uLCB0aGUgdGFnCisJICogaXMgZXhwZWN0ZWQgdG8gYmUgY29uY2F0ZW5hdGVkIHRvIHRoZSBjaXBoZXJ0ZXh0LiBUaGUgcGxhaW50ZXh0CisJICogdGhlcmVmb3JlIGhhcyBhIG1lbW9yeSBzaXplIG9mIHRoZSBjaXBoZXJ0ZXh0IG1pbnVzIHRoZSB0YWcgbGVuZ3RoLgorCSAqCisJICogVGhlIG1lbW9yeSBzdHJ1Y3R1cmUgZm9yIGNpcGhlciBvcGVyYXRpb24gaGFzIHRoZSBmb2xsb3dpbmcKKwkgKiBzdHJ1Y3R1cmU6CisJICoJQUVBRCBlbmNyeXB0aW9uIGlucHV0OiAgYXNzb2MgZGF0YSB8fCBwbGFpbnRleHQKKwkgKglBRUFEIGVuY3J5cHRpb24gb3V0cHV0OiBjaXBoZXJudGV4dCB8fCBhdXRoIHRhZworCSAqCUFFQUQgZGVjcnlwdGlvbiBpbnB1dDogIGFzc29jIGRhdGEgfHwgY2lwaGVydGV4dCB8fCBhdXRoIHRhZworCSAqCUFFQUQgZGVjcnlwdGlvbiBvdXRwdXQ6IHBsYWludGV4dAorCSAqLworCisJaWYgKGN0eC0+bW9yZSkgeworCQllcnIgPSBhZWFkX3dhaXRfZm9yX2RhdGEoc2ssIGZsYWdzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdW5sb2NrOworCX0KKworCXVzZWQgPSBjdHgtPnVzZWQ7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBzdWZmaWNpZW50IGRhdGEgaXMgcHJlc2VudCAtLSBub3RlLCB0aGUgc2FtZSBjaGVjayBpcworCSAqIGlzIGFsc28gcHJlc2VudCBpbiBzZW5kbXNnL3NlbmRwYWdlLiBUaGUgY2hlY2tzIGluIHNlbmRwYWdlL3NlbmRtc2cKKwkgKiBzaGFsbCBwcm92aWRlIGFuIGluZm9ybWF0aW9uIHRvIHRoZSBkYXRhIHNlbmRlciB0aGF0IHNvbWV0aGluZyBpcworCSAqIHdyb25nLCBidXQgdGhleSBhcmUgaXJyZWxldmFudCB0byBtYWludGFpbiB0aGUga2VybmVsIGludGVncml0eS4KKwkgKiBXZSBuZWVkIHRoaXMgY2hlY2sgaGVyZSB0b28gaW4gY2FzZSB1c2VyIHNwYWNlIGRlY2lkZXMgdG8gbm90IGhvbm9yCisJICogdGhlIGVycm9yIG1lc3NhZ2UgaW4gc2VuZG1zZy9zZW5kcGFnZSBhbmQgc3RpbGwgY2FsbCByZWN2bXNnLiBUaGlzCisJICogY2hlY2sgaGVyZSBwcm90ZWN0cyB0aGUga2VybmVsIGludGVncml0eS4KKwkgKi8KKwlpZiAoIWFlYWRfc3VmZmljaWVudF9kYXRhKGN0eCkpCisJCWdvdG8gdW5sb2NrOworCisJLyoKKwkgKiBUaGUgY2lwaGVyIG9wZXJhdGlvbiBpbnB1dCBkYXRhIGlzIHJlZHVjZWQgYnkgdGhlIGFzc29jaWF0ZWQgZGF0YQorCSAqIGxlbmd0aCBhcyB0aGlzIGRhdGEgaXMgcHJvY2Vzc2VkIHNlcGFyYXRlbHkgbGF0ZXIgb24uCisJICovCisJdXNlZCAtPSBjdHgtPmFlYWRfYXNzb2NsZW47CisKKwlpZiAoY3R4LT5lbmMpIHsKKwkJLyogcm91bmQgdXAgb3V0cHV0IGJ1ZmZlciB0byBtdWx0aXBsZSBvZiBibG9jayBzaXplICovCisJCW91dGxlbiA9ICgodXNlZCArIGJzIC0gMSkgLyBicyAqIGJzKTsKKwkJLyogYWRkIHRoZSBzaXplIG5lZWRlZCBmb3IgdGhlIGF1dGggdGFnIHRvIGJlIGNyZWF0ZWQgKi8KKwkJb3V0bGVuICs9IGFzOworCX0gZWxzZSB7CisJCS8qIG91dHB1dCBkYXRhIHNpemUgaXMgaW5wdXQgd2l0aG91dCB0aGUgYXV0aGVudGljYXRpb24gdGFnICovCisJCW91dGxlbiA9IHVzZWQgLSBhczsKKwkJLyogcm91bmQgdXAgb3V0cHV0IGJ1ZmZlciB0byBtdWx0aXBsZSBvZiBibG9jayBzaXplICovCisJCW91dGxlbiA9ICgob3V0bGVuICsgYnMgLSAxKSAvIGJzICogYnMpOworCX0KKworCS8qIGNvbnZlcnQgaW92ZWNzIG9mIG91dHB1dCBidWZmZXJzIGludG8gc2NhdHRlcmxpc3RzICovCisJd2hpbGUgKGlvdl9pdGVyX2NvdW50KCZtc2ctPm1zZ19pdGVyKSkgeworCQlzaXplX3Qgc2VnbGVuID0gbWluX3Qoc2l6ZV90LCBpb3ZfaXRlcl9jb3VudCgmbXNnLT5tc2dfaXRlciksCisJCQkJICAgICAgKG91dGxlbiAtIHVzZWRwYWdlcykpOworCisJCS8qIG1ha2Ugb25lIGlvdmVjIGF2YWlsYWJsZSBhcyBzY2F0dGVybGlzdCAqLworCQllcnIgPSBhZl9hbGdfbWFrZV9zZygmY3R4LT5yc2dsW2NudF0sICZtc2ctPm1zZ19pdGVyLAorCQkJCSAgICAgc2VnbGVuKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIHVubG9jazsKKwkJdXNlZHBhZ2VzICs9IGVycjsKKwkJLyogY2hhaW4gdGhlIG5ldyBzY2F0dGVybGlzdCB3aXRoIGluaXRpYWwgbGlzdCAqLworCQlpZiAoY250KQorCQkJc2NhdHRlcndhbGtfY3J5cHRvX2NoYWluKGN0eC0+cnNnbFswXS5zZywKKwkJCQkJY3R4LT5yc2dsW2NudF0uc2csIDEsCisJCQkJCXNnX25lbnRzKGN0eC0+cnNnbFtjbnQtMV0uc2cpKTsKKwkJLyogd2UgZG8gbm90IG5lZWQgbW9yZSBpb3ZlY3MgYXMgd2UgaGF2ZSBzdWZmaWNpZW50IG1lbW9yeSAqLworCQlpZiAob3V0bGVuIDw9IHVzZWRwYWdlcykKKwkJCWJyZWFrOworCQlpb3ZfaXRlcl9hZHZhbmNlKCZtc2ctPm1zZ19pdGVyLCBlcnIpOworCQljbnQrKzsKKwl9CisKKwllcnIgPSAtRUlOVkFMOworCS8qIGVuc3VyZSBvdXRwdXQgYnVmZmVyIGlzIHN1ZmZpY2llbnRseSBsYXJnZSAqLworCWlmICh1c2VkcGFnZXMgPCBvdXRsZW4pCisJCWdvdG8gdW5sb2NrOworCisJc2dfaW5pdF90YWJsZShhc3NvYywgQUxHX01BWF9QQUdFUyk7CisJYXNzb2NsZW4gPSBjdHgtPmFlYWRfYXNzb2NsZW47CisJLyoKKwkgKiBTcGxpdCBzY2F0dGVybGlzdCBpbnRvIHR3bzogZmlyc3QgcGFydCBiZWNvbWVzIEFELCBzZWNvbmQgcGFydAorCSAqIGlzIHBsYWludGV4dCAvIGNpcGhlcnRleHQuIFRoZSBmaXJzdCBwYXJ0IGlzIGFzc2lnbmVkIHRvIGFzc29jCisJICogc2NhdHRlcmxpc3QuIFdoZW4gdGhpcyBsb29wIGZpbmlzaGVzLCBzZyBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZQorCSAqIHBsYWludGV4dCAvIGNpcGhlcnRleHQuCisJICovCisJZm9yIChpID0gMDsgaSA8IGN0eC0+dHNnbC5jdXI7IGkrKykgeworCQlzZyA9IHNnbC0+c2cgKyBpOworCQlpZiAoc2ctPmxlbmd0aCA8PSBhc3NvY2xlbikgeworCQkJLyogQUQgaXMgbGFyZ2VyIHRoYW4gb25lIHBhZ2UgKi8KKwkJCXNnX3NldF9wYWdlKGFzc29jICsgaSwgc2dfcGFnZShzZyksCisJCQkJICAgIHNnLT5sZW5ndGgsIHNnLT5vZmZzZXQpOworCQkJYXNzb2NsZW4gLT0gc2ctPmxlbmd0aDsKKwkJCWlmIChpID49IGN0eC0+dHNnbC5jdXIpCisJCQkJZ290byB1bmxvY2s7CisJCX0gZWxzZSBpZiAoIWFzc29jbGVuKSB7CisJCQkvKiBjdXJyZW50IHBhZ2UgaXMgdG8gc3RhcnQgb2YgcGxhaW50ZXh0IC8gY2lwaGVydGV4dCAqLworCQkJaWYgKGkpCisJCQkJLyogQUQgdGVybWluYXRlcyBhdCBwYWdlIGJvdW5kYXJ5ICovCisJCQkJc2dfbWFya19lbmQoYXNzb2MgKyBpIC0gMSk7CisJCQllbHNlCisJCQkJLyogQUQgc2l6ZSBpcyB6ZXJvICovCisJCQkJc2dfbWFya19lbmQoYXNzb2MpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQkvKiBBRCBkb2VzIG5vdCB0ZXJtaW5hdGUgYXQgcGFnZSBib3VuZGFyeSAqLworCQkJc2dfc2V0X3BhZ2UoYXNzb2MgKyBpLCBzZ19wYWdlKHNnKSwKKwkJCQkgICAgYXNzb2NsZW4sIHNnLT5vZmZzZXQpOworCQkJc2dfbWFya19lbmQoYXNzb2MgKyBpKTsKKwkJCS8qIHBsYWludGV4dCAvIGNpcGhlcnRleHQgc3RhcnRzIGFmdGVyIEFEICovCisJCQlzZy0+bGVuZ3RoIC09IGFzc29jbGVuOworCQkJc2ctPm9mZnNldCArPSBhc3NvY2xlbjsKKwkJCWJyZWFrOworCQl9CisJfQorCisJYWVhZF9yZXF1ZXN0X3NldF9hc3NvYygmY3R4LT5hZWFkX3JlcSwgYXNzb2MsIGN0eC0+YWVhZF9hc3NvY2xlbik7CisJYWVhZF9yZXF1ZXN0X3NldF9jcnlwdCgmY3R4LT5hZWFkX3JlcSwgc2csIGN0eC0+cnNnbFswXS5zZywgdXNlZCwKKwkJCSAgICAgICBjdHgtPml2KTsKKworCWVyciA9IGFmX2FsZ193YWl0X2Zvcl9jb21wbGV0aW9uKGN0eC0+ZW5jID8KKwkJCQkJIGNyeXB0b19hZWFkX2VuY3J5cHQoJmN0eC0+YWVhZF9yZXEpIDoKKwkJCQkJIGNyeXB0b19hZWFkX2RlY3J5cHQoJmN0eC0+YWVhZF9yZXEpLAorCQkJCQkgJmN0eC0+Y29tcGxldGlvbik7CisKKwlpZiAoZXJyKSB7CisJCS8qIEVCQURNU0cgaW1wbGllcyBhIHZhbGlkIGNpcGhlciBvcGVyYXRpb24gdG9vayBwbGFjZSAqLworCQlpZiAoZXJyID09IC1FQkFETVNHKQorCQkJYWVhZF9wdXRfc2dsKHNrKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJYWVhZF9wdXRfc2dsKHNrKTsKKworCWVyciA9IDA7CisKK3VubG9jazoKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspCisJCWFmX2FsZ19mcmVlX3NnKCZjdHgtPnJzZ2xbaV0pOworCisJYWVhZF93bWVtX3dha2V1cChzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiBlcnIgPyBlcnIgOiBvdXRsZW47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWVhZF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJICAgICAgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CisJc3RydWN0IGFlYWRfY3R4ICpjdHggPSBhc2stPnByaXZhdGU7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwlzb2NrX3BvbGxfd2FpdChmaWxlLCBza19zbGVlcChzayksIHdhaXQpOworCW1hc2sgPSAwOworCisJaWYgKCFjdHgtPm1vcmUpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCWlmIChhZWFkX3dyaXRhYmxlKHNrKSkKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STSB8IFBPTExXUkJBTkQ7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIHN0cnVjdCBwcm90b19vcHMgYWxnaWZfYWVhZF9vcHMgPSB7CisJLmZhbWlseQkJPQlQRl9BTEcsCisKKwkuY29ubmVjdAk9CXNvY2tfbm9fY29ubmVjdCwKKwkuc29ja2V0cGFpcgk9CXNvY2tfbm9fc29ja2V0cGFpciwKKwkuZ2V0bmFtZQk9CXNvY2tfbm9fZ2V0bmFtZSwKKwkuaW9jdGwJCT0Jc29ja19ub19pb2N0bCwKKwkubGlzdGVuCQk9CXNvY2tfbm9fbGlzdGVuLAorCS5zaHV0ZG93bgk9CXNvY2tfbm9fc2h1dGRvd24sCisJLmdldHNvY2tvcHQJPQlzb2NrX25vX2dldHNvY2tvcHQsCisJLm1tYXAJCT0Jc29ja19ub19tbWFwLAorCS5iaW5kCQk9CXNvY2tfbm9fYmluZCwKKwkuYWNjZXB0CQk9CXNvY2tfbm9fYWNjZXB0LAorCS5zZXRzb2Nrb3B0CT0Jc29ja19ub19zZXRzb2Nrb3B0LAorCisJLnJlbGVhc2UJPQlhZl9hbGdfcmVsZWFzZSwKKwkuc2VuZG1zZwk9CWFlYWRfc2VuZG1zZywKKwkuc2VuZHBhZ2UJPQlhZWFkX3NlbmRwYWdlLAorCS5yZWN2bXNnCT0JYWVhZF9yZWN2bXNnLAorCS5wb2xsCQk9CWFlYWRfcG9sbCwKK307CisKK3N0YXRpYyB2b2lkICphZWFkX2JpbmQoY29uc3QgY2hhciAqbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKQoreworCXJldHVybiBjcnlwdG9fYWxsb2NfYWVhZChuYW1lLCB0eXBlLCBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgYWVhZF9yZWxlYXNlKHZvaWQgKnByaXZhdGUpCit7CisJY3J5cHRvX2ZyZWVfYWVhZChwcml2YXRlKTsKK30KKworc3RhdGljIGludCBhZWFkX3NldGF1dGhzaXplKHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGludCBhdXRoc2l6ZSkKK3sKKwlyZXR1cm4gY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUocHJpdmF0ZSwgYXV0aHNpemUpOworfQorCitzdGF0aWMgaW50IGFlYWRfc2V0a2V5KHZvaWQgKnByaXZhdGUsIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCit7CisJcmV0dXJuIGNyeXB0b19hZWFkX3NldGtleShwcml2YXRlLCBrZXksIGtleWxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGFlYWRfc29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCXN0cnVjdCBhZWFkX2N0eCAqY3R4ID0gYXNrLT5wcml2YXRlOworCXVuc2lnbmVkIGludCBpdmxlbiA9IGNyeXB0b19hZWFkX2l2c2l6ZSgKKwkJCQljcnlwdG9fYWVhZF9yZXF0Zm0oJmN0eC0+YWVhZF9yZXEpKTsKKworCWFlYWRfcHV0X3NnbChzayk7CisJc29ja19remZyZWVfcyhzaywgY3R4LT5pdiwgaXZsZW4pOworCXNvY2tfa2ZyZWVfcyhzaywgY3R4LCBjdHgtPmxlbik7CisJYWZfYWxnX3JlbGVhc2VfcGFyZW50KHNrKTsKK30KKworc3RhdGljIGludCBhZWFkX2FjY2VwdF9wYXJlbnQodm9pZCAqcHJpdmF0ZSwgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBhZWFkX2N0eCAqY3R4OworCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKKwl1bnNpZ25lZCBpbnQgbGVuID0gc2l6ZW9mKCpjdHgpICsgY3J5cHRvX2FlYWRfcmVxc2l6ZShwcml2YXRlKTsKKwl1bnNpZ25lZCBpbnQgaXZsZW4gPSBjcnlwdG9fYWVhZF9pdnNpemUocHJpdmF0ZSk7CisKKwljdHggPSBzb2NrX2ttYWxsb2Moc2ssIGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChjdHgsIDAsIGxlbik7CisKKwljdHgtPml2ID0gc29ja19rbWFsbG9jKHNrLCBpdmxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgtPml2KSB7CisJCXNvY2tfa2ZyZWVfcyhzaywgY3R4LCBsZW4pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGN0eC0+aXYsIDAsIGl2bGVuKTsKKworCWN0eC0+bGVuID0gbGVuOworCWN0eC0+dXNlZCA9IDA7CisJY3R4LT5tb3JlID0gMDsKKwljdHgtPm1lcmdlID0gMDsKKwljdHgtPmVuYyA9IDA7CisJY3R4LT50c2dsLmN1ciA9IDA7CisJY3R4LT5hZWFkX2Fzc29jbGVuID0gMDsKKwlhZl9hbGdfaW5pdF9jb21wbGV0aW9uKCZjdHgtPmNvbXBsZXRpb24pOworCXNnX2luaXRfdGFibGUoY3R4LT50c2dsLnNnLCBBTEdfTUFYX1BBR0VTKTsKKworCWFzay0+cHJpdmF0ZSA9IGN0eDsKKworCWFlYWRfcmVxdWVzdF9zZXRfdGZtKCZjdHgtPmFlYWRfcmVxLCBwcml2YXRlKTsKKwlhZWFkX3JlcXVlc3Rfc2V0X2NhbGxiYWNrKCZjdHgtPmFlYWRfcmVxLCBDUllQVE9fVEZNX1JFUV9NQVlfQkFDS0xPRywKKwkJCQkgIGFmX2FsZ19jb21wbGV0ZSwgJmN0eC0+Y29tcGxldGlvbik7CisKKwlzay0+c2tfZGVzdHJ1Y3QgPSBhZWFkX3NvY2tfZGVzdHJ1Y3Q7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZl9hbGdfdHlwZSBhbGdpZl90eXBlX2FlYWQgPSB7CisJLmJpbmQJCT0JYWVhZF9iaW5kLAorCS5yZWxlYXNlCT0JYWVhZF9yZWxlYXNlLAorCS5zZXRrZXkJCT0JYWVhZF9zZXRrZXksCisJLnNldGF1dGhzaXplCT0JYWVhZF9zZXRhdXRoc2l6ZSwKKwkuYWNjZXB0CQk9CWFlYWRfYWNjZXB0X3BhcmVudCwKKwkub3BzCQk9CSZhbGdpZl9hZWFkX29wcywKKwkubmFtZQkJPQkiYWVhZCIsCisJLm93bmVyCQk9CVRISVNfTU9EVUxFCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhbGdpZl9hZWFkX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gYWZfYWxnX3JlZ2lzdGVyX3R5cGUoJmFsZ2lmX3R5cGVfYWVhZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhbGdpZl9hZWFkX2V4aXQodm9pZCkKK3sKKwlpbnQgZXJyID0gYWZfYWxnX3VucmVnaXN0ZXJfdHlwZSgmYWxnaWZfdHlwZV9hZWFkKTsKKwlCVUdfT04oZXJyKTsKK30KKworbW9kdWxlX2luaXQoYWxnaWZfYWVhZF9pbml0KTsKK21vZHVsZV9leGl0KGFsZ2lmX2FlYWRfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJTdGVwaGFuIE11ZWxsZXIgPHNtdWVsbGVyQGNocm9ub3guZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFFQUQga2VybmVsIGNyeXB0byBBUEkgdXNlciBzcGFjZSBpbnRlcmZhY2UiKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9hbGdpZl9oYXNoLmMgYi9jcnlwdG8vYWxnaWZfaGFzaC5jCmluZGV4IDAxZGEzNjAuLjEzOTZhZDAgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hbGdpZl9oYXNoLmMKKysrIGIvY3J5cHRvL2FsZ2lmX2hhc2guYwpAQCAtMzQsOCArMzQsOCBAQAogCXN0cnVjdCBhaGFzaF9yZXF1ZXN0IHJlcTsKIH07CiAKLXN0YXRpYyBpbnQgaGFzaF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqdW51c2VkLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgaWdub3JlZCkKK3N0YXRpYyBpbnQgaGFzaF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCXNpemVfdCBpZ25vcmVkKQogewogCWludCBsaW1pdCA9IEFMR19NQVhfUEFHRVMgKiBQQUdFX1NJWkU7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CkBAIC01Niw4ICs1Niw4IEBACiAKIAljdHgtPm1vcmUgPSAwOwogCi0Jd2hpbGUgKGlvdl9pdGVyX2NvdW50KCZtc2ctPm1zZ19pdGVyKSkgewotCQlpbnQgbGVuID0gaW92X2l0ZXJfY291bnQoJm1zZy0+bXNnX2l0ZXIpOworCXdoaWxlIChtc2dfZGF0YV9sZWZ0KG1zZykpIHsKKwkJaW50IGxlbiA9IG1zZ19kYXRhX2xlZnQobXNnKTsKIAogCQlpZiAobGVuID4gbGltaXQpCiAJCQlsZW4gPSBsaW1pdDsKQEAgLTEzOSw4ICsxMzksOCBAQAogCXJldHVybiBlcnIgPzogc2l6ZTsKIH0KIAotc3RhdGljIGludCBoYXNoX3JlY3Ztc2coc3RydWN0IGtpb2NiICp1bnVzZWQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK3N0YXRpYyBpbnQgaGFzaF9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCWludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgYWxnX3NvY2sgKmFzayA9IGFsZ19zayhzayk7CmRpZmYgLS1naXQgYS9jcnlwdG8vYWxnaWZfcm5nLmMgYi9jcnlwdG8vYWxnaWZfcm5nLmMKaW5kZXggNjdmNjEyYy4uODEwOWFhYSAxMDA2NDQKLS0tIGEvY3J5cHRvL2FsZ2lmX3JuZy5jCisrKyBiL2NyeXB0by9hbGdpZl9ybmcuYwpAQCAtNTUsOCArNTUsOCBAQAogCXN0cnVjdCBjcnlwdG9fcm5nICpkcm5nOwogfTsKIAotc3RhdGljIGludCBybmdfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKnVudXNlZCwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IGZsYWdzKQorc3RhdGljIGludCBybmdfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCisJCSAgICAgICBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOwpAQCAtODcsNyArODcsNyBAQAogCQlyZXR1cm4gZ2VubGVuOwogCiAJZXJyID0gbWVtY3B5X3RvX21zZyhtc2csIHJlc3VsdCwgbGVuKTsKLQltZW16ZXJvX2V4cGxpY2l0KHJlc3VsdCwgZ2VubGVuKTsKKwltZW16ZXJvX2V4cGxpY2l0KHJlc3VsdCwgbGVuKTsKIAogCXJldHVybiBlcnIgPyBlcnIgOiBsZW47CiB9CmRpZmYgLS1naXQgYS9jcnlwdG8vYWxnaWZfc2tjaXBoZXIuYyBiL2NyeXB0by9hbGdpZl9za2NpcGhlci5jCmluZGV4IDBjOGExZTUuLjk0NTA3NTIgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hbGdpZl9za2NpcGhlci5jCisrKyBiL2NyeXB0by9hbGdpZl9za2NpcGhlci5jCkBAIC0zOSw2ICszOSw3IEBACiAKIAlzdHJ1Y3QgYWZfYWxnX2NvbXBsZXRpb24gY29tcGxldGlvbjsKIAorCWF0b21pY190IGluZmxpZ2h0OwogCXVuc2lnbmVkIHVzZWQ7CiAKIAl1bnNpZ25lZCBpbnQgbGVuOwpAQCAtNDksOSArNTAsNjUgQEAKIAlzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0IHJlcTsKIH07CiAKK3N0cnVjdCBza2NpcGhlcl9hc3luY19yc2dsIHsKKwlzdHJ1Y3QgYWZfYWxnX3NnbCBzZ2w7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IHNrY2lwaGVyX2FzeW5jX3JlcSB7CisJc3RydWN0IGtpb2NiICppb2NiOworCXN0cnVjdCBza2NpcGhlcl9hc3luY19yc2dsIGZpcnN0X3NnbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICp0c2c7CisJY2hhciBpdltdOworfTsKKworI2RlZmluZSBHRVRfU1JFUShhcmVxLCBjdHgpIChzdHJ1Y3Qgc2tjaXBoZXJfYXN5bmNfcmVxICopKChjaGFyICopYXJlcSArIFwKKwljcnlwdG9fYWJsa2NpcGhlcl9yZXFzaXplKGNyeXB0b19hYmxrY2lwaGVyX3JlcXRmbSgmY3R4LT5yZXEpKSkKKworI2RlZmluZSBHRVRfUkVRX1NJWkUoY3R4KSBcCisJY3J5cHRvX2FibGtjaXBoZXJfcmVxc2l6ZShjcnlwdG9fYWJsa2NpcGhlcl9yZXF0Zm0oJmN0eC0+cmVxKSkKKworI2RlZmluZSBHRVRfSVZfU0laRShjdHgpIFwKKwljcnlwdG9fYWJsa2NpcGhlcl9pdnNpemUoY3J5cHRvX2FibGtjaXBoZXJfcmVxdGZtKCZjdHgtPnJlcSkpCisKICNkZWZpbmUgTUFYX1NHTF9FTlRTICgoNDA5NiAtIHNpemVvZihzdHJ1Y3Qgc2tjaXBoZXJfc2dfbGlzdCkpIC8gXAogCQkgICAgICBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSAtIDEpCiAKK3N0YXRpYyB2b2lkIHNrY2lwaGVyX2ZyZWVfYXN5bmNfc2dscyhzdHJ1Y3Qgc2tjaXBoZXJfYXN5bmNfcmVxICpzcmVxKQoreworCXN0cnVjdCBza2NpcGhlcl9hc3luY19yc2dsICpyc2dsLCAqdG1wOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGksIG47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnNnbCwgdG1wLCAmc3JlcS0+bGlzdCwgbGlzdCkgeworCQlhZl9hbGdfZnJlZV9zZygmcnNnbC0+c2dsKTsKKwkJaWYgKHJzZ2wgIT0gJnNyZXEtPmZpcnN0X3NnbCkKKwkJCWtmcmVlKHJzZ2wpOworCX0KKwlzZ2wgPSBzcmVxLT50c2c7CisJbiA9IHNnX25lbnRzKHNnbCk7CisJZm9yX2VhY2hfc2coc2dsLCBzZywgbiwgaSkKKwkJcHV0X3BhZ2Uoc2dfcGFnZShzZykpOworCisJa2ZyZWUoc3JlcS0+dHNnKTsKK30KKworc3RhdGljIHZvaWQgc2tjaXBoZXJfYXN5bmNfY2Ioc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpyZXEsIGludCBlcnIpCit7CisJc3RydWN0IHNvY2sgKnNrID0gcmVxLT5kYXRhOworCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKKwlzdHJ1Y3Qgc2tjaXBoZXJfY3R4ICpjdHggPSBhc2stPnByaXZhdGU7CisJc3RydWN0IHNrY2lwaGVyX2FzeW5jX3JlcSAqc3JlcSA9IEdFVF9TUkVRKHJlcSwgY3R4KTsKKwlzdHJ1Y3Qga2lvY2IgKmlvY2IgPSBzcmVxLT5pb2NiOworCisJYXRvbWljX2RlYygmY3R4LT5pbmZsaWdodCk7CisJc2tjaXBoZXJfZnJlZV9hc3luY19zZ2xzKHNyZXEpOworCWtmcmVlKHJlcSk7CisJaW9jYi0+a2lfY29tcGxldGUoaW9jYiwgZXJyLCBlcnIpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBza2NpcGhlcl9zbmRidWYoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKQEAgLTk2LDcgKzE1Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNrY2lwaGVyX3B1bGxfc2dsKHN0cnVjdCBzb2NrICpzaywgaW50IHVzZWQpCitzdGF0aWMgdm9pZCBza2NpcGhlcl9wdWxsX3NnbChzdHJ1Y3Qgc29jayAqc2ssIGludCB1c2VkLCBpbnQgcHV0KQogewogCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKIAlzdHJ1Y3Qgc2tjaXBoZXJfY3R4ICpjdHggPSBhc2stPnByaXZhdGU7CkBAIC0xMjMsOCArMTgwLDggQEAKIAogCQkJaWYgKHNnW2ldLmxlbmd0aCkKIAkJCQlyZXR1cm47Ci0KLQkJCXB1dF9wYWdlKHNnX3BhZ2Uoc2cgKyBpKSk7CisJCQlpZiAocHV0KQorCQkJCXB1dF9wYWdlKHNnX3BhZ2Uoc2cgKyBpKSk7CiAJCQlzZ19hc3NpZ25fcGFnZShzZyArIGksIE5VTEwpOwogCQl9CiAKQEAgLTE0Myw3ICsyMDAsNyBAQAogCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKIAlzdHJ1Y3Qgc2tjaXBoZXJfY3R4ICpjdHggPSBhc2stPnByaXZhdGU7CiAKLQlza2NpcGhlcl9wdWxsX3NnbChzaywgY3R4LT51c2VkKTsKKwlza2NpcGhlcl9wdWxsX3NnbChzaywgY3R4LT51c2VkLCAxKTsKIH0KIAogc3RhdGljIGludCBza2NpcGhlcl93YWl0X2Zvcl93bWVtKHN0cnVjdCBzb2NrICpzaywgdW5zaWduZWQgZmxhZ3MpCkBAIC0yMzksOCArMjk2LDggQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotc3RhdGljIGludCBza2NpcGhlcl9zZW5kbXNnKHN0cnVjdCBraW9jYiAqdW51c2VkLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCitzdGF0aWMgaW50IHNrY2lwaGVyX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJICAgIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKQEAgLTQyNCw4ICs0ODEsMTUzIEBACiAJcmV0dXJuIGVyciA/OiBzaXplOwogfQogCi1zdGF0aWMgaW50IHNrY2lwaGVyX3JlY3Ztc2coc3RydWN0IGtpb2NiICp1bnVzZWQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgaWdub3JlZCwgaW50IGZsYWdzKQorc3RhdGljIGludCBza2NpcGhlcl9hbGxfc2dfbmVudHMoc3RydWN0IHNrY2lwaGVyX2N0eCAqY3R4KQoreworCXN0cnVjdCBza2NpcGhlcl9zZ19saXN0ICpzZ2w7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgbmVudHMgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZ2wsICZjdHgtPnRzZ2wsIGxpc3QpIHsKKwkJc2cgPSBzZ2wtPnNnOworCisJCXdoaWxlICghc2ctPmxlbmd0aCkKKwkJCXNnKys7CisKKwkJbmVudHMgKz0gc2dfbmVudHMoc2cpOworCX0KKwlyZXR1cm4gbmVudHM7Cit9CisKK3N0YXRpYyBpbnQgc2tjaXBoZXJfcmVjdm1zZ19hc3luYyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkJICBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOworCXN0cnVjdCBza2NpcGhlcl9jdHggKmN0eCA9IGFzay0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc2tjaXBoZXJfc2dfbGlzdCAqc2dsOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IHNrY2lwaGVyX2FzeW5jX3JlcSAqc3JlcTsKKwlzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXE7CisJc3RydWN0IHNrY2lwaGVyX2FzeW5jX3JzZ2wgKmxhc3RfcnNnbCA9IE5VTEw7CisJdW5zaWduZWQgaW50IHR4YnVmcyA9IDAsIGxlbiA9IDAsIHR4X25lbnRzID0gc2tjaXBoZXJfYWxsX3NnX25lbnRzKGN0eCk7CisJdW5zaWduZWQgaW50IHJlcWxlbiA9IHNpemVvZihzdHJ1Y3Qgc2tjaXBoZXJfYXN5bmNfcmVxKSArCisJCQkJR0VUX1JFUV9TSVpFKGN0eCkgKyBHRVRfSVZfU0laRShjdHgpOworCWludCBlcnIgPSAtRU5PTUVNOworCWJvb2wgbWFyayA9IGZhbHNlOworCisJbG9ja19zb2NrKHNrKTsKKwlyZXEgPSBrbWFsbG9jKHJlcWxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFyZXEpKQorCQlnb3RvIHVubG9jazsKKworCXNyZXEgPSBHRVRfU1JFUShyZXEsIGN0eCk7CisJc3JlcS0+aW9jYiA9IG1zZy0+bXNnX2lvY2I7CisJbWVtc2V0KCZzcmVxLT5maXJzdF9zZ2wsICdcMCcsIHNpemVvZihzdHJ1Y3Qgc2tjaXBoZXJfYXN5bmNfcnNnbCkpOworCUlOSVRfTElTVF9IRUFEKCZzcmVxLT5saXN0KTsKKwlzcmVxLT50c2cgPSBrY2FsbG9jKHR4X25lbnRzLCBzaXplb2YoKnNnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHVubGlrZWx5KCFzcmVxLT50c2cpKSB7CisJCWtmcmVlKHJlcSk7CisJCWdvdG8gdW5sb2NrOworCX0KKwlzZ19pbml0X3RhYmxlKHNyZXEtPnRzZywgdHhfbmVudHMpOworCW1lbWNweShzcmVxLT5pdiwgY3R4LT5pdiwgR0VUX0lWX1NJWkUoY3R4KSk7CisJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF90Zm0ocmVxLCBjcnlwdG9fYWJsa2NpcGhlcl9yZXF0Zm0oJmN0eC0+cmVxKSk7CisJYWJsa2NpcGhlcl9yZXF1ZXN0X3NldF9jYWxsYmFjayhyZXEsIENSWVBUT19URk1fUkVRX01BWV9CQUNLTE9HLAorCQkJCQlza2NpcGhlcl9hc3luY19jYiwgc2spOworCisJd2hpbGUgKGlvdl9pdGVyX2NvdW50KCZtc2ctPm1zZ19pdGVyKSkgeworCQlzdHJ1Y3Qgc2tjaXBoZXJfYXN5bmNfcnNnbCAqcnNnbDsKKwkJaW50IHVzZWQ7CisKKwkJaWYgKCFjdHgtPnVzZWQpIHsKKwkJCWVyciA9IHNrY2lwaGVyX3dhaXRfZm9yX2RhdGEoc2ssIGZsYWdzKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBmcmVlOworCQl9CisJCXNnbCA9IGxpc3RfZmlyc3RfZW50cnkoJmN0eC0+dHNnbCwKKwkJCQkgICAgICAgc3RydWN0IHNrY2lwaGVyX3NnX2xpc3QsIGxpc3QpOworCQlzZyA9IHNnbC0+c2c7CisKKwkJd2hpbGUgKCFzZy0+bGVuZ3RoKQorCQkJc2crKzsKKworCQl1c2VkID0gbWluX3QodW5zaWduZWQgbG9uZywgY3R4LT51c2VkLAorCQkJICAgICBpb3ZfaXRlcl9jb3VudCgmbXNnLT5tc2dfaXRlcikpOworCQl1c2VkID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlZCwgc2ctPmxlbmd0aCk7CisKKwkJaWYgKHR4YnVmcyA9PSB0eF9uZW50cykgeworCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICp0bXA7CisJCQlpbnQgeDsKKwkJCS8qIFJhbiBvdXQgb2YgdHggc2xvdHMgaW4gYXN5bmMgcmVxdWVzdAorCQkJICogbmVlZCB0byBleHBhbmQgKi8KKwkJCXRtcCA9IGtjYWxsb2ModHhfbmVudHMgKiAyLCBzaXplb2YoKnRtcCksCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIXRtcCkKKwkJCQlnb3RvIGZyZWU7CisKKwkJCXNnX2luaXRfdGFibGUodG1wLCB0eF9uZW50cyAqIDIpOworCQkJZm9yICh4ID0gMDsgeCA8IHR4X25lbnRzOyB4KyspCisJCQkJc2dfc2V0X3BhZ2UoJnRtcFt4XSwgc2dfcGFnZSgmc3JlcS0+dHNnW3hdKSwKKwkJCQkJICAgIHNyZXEtPnRzZ1t4XS5sZW5ndGgsCisJCQkJCSAgICBzcmVxLT50c2dbeF0ub2Zmc2V0KTsKKwkJCWtmcmVlKHNyZXEtPnRzZyk7CisJCQlzcmVxLT50c2cgPSB0bXA7CisJCQl0eF9uZW50cyAqPSAyOworCQkJbWFyayA9IHRydWU7CisJCX0KKwkJLyogTmVlZCB0byB0YWtlIG92ZXIgdGhlIHR4IHNnbCBmcm9tIGN0eAorCQkgKiB0byB0aGUgYXN5bmNoIHJlcSAtIHRoZXNlIHNnbHMgd2lsbCBiZSBmcmVlZCBsYXRlciAqLworCQlzZ19zZXRfcGFnZShzcmVxLT50c2cgKyB0eGJ1ZnMrKywgc2dfcGFnZShzZyksIHNnLT5sZW5ndGgsCisJCQkgICAgc2ctPm9mZnNldCk7CisKKwkJaWYgKGxpc3RfZW1wdHkoJnNyZXEtPmxpc3QpKSB7CisJCQlyc2dsID0gJnNyZXEtPmZpcnN0X3NnbDsKKwkJCWxpc3RfYWRkX3RhaWwoJnJzZ2wtPmxpc3QsICZzcmVxLT5saXN0KTsKKwkJfSBlbHNlIHsKKwkJCXJzZ2wgPSBrbWFsbG9jKHNpemVvZigqcnNnbCksIEdGUF9LRVJORUwpOworCQkJaWYgKCFyc2dsKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIGZyZWU7CisJCQl9CisJCQlsaXN0X2FkZF90YWlsKCZyc2dsLT5saXN0LCAmc3JlcS0+bGlzdCk7CisJCX0KKworCQl1c2VkID0gYWZfYWxnX21ha2Vfc2coJnJzZ2wtPnNnbCwgJm1zZy0+bXNnX2l0ZXIsIHVzZWQpOworCQllcnIgPSB1c2VkOworCQlpZiAodXNlZCA8IDApCisJCQlnb3RvIGZyZWU7CisJCWlmIChsYXN0X3JzZ2wpCisJCQlhZl9hbGdfbGlua19zZygmbGFzdF9yc2dsLT5zZ2wsICZyc2dsLT5zZ2wpOworCisJCWxhc3RfcnNnbCA9IHJzZ2w7CisJCWxlbiArPSB1c2VkOworCQlza2NpcGhlcl9wdWxsX3NnbChzaywgdXNlZCwgMCk7CisJCWlvdl9pdGVyX2FkdmFuY2UoJm1zZy0+bXNnX2l0ZXIsIHVzZWQpOworCX0KKworCWlmIChtYXJrKQorCQlzZ19tYXJrX2VuZChzcmVxLT50c2cgKyB0eGJ1ZnMgLSAxKTsKKworCWFibGtjaXBoZXJfcmVxdWVzdF9zZXRfY3J5cHQocmVxLCBzcmVxLT50c2csIHNyZXEtPmZpcnN0X3NnbC5zZ2wuc2csCisJCQkJICAgICBsZW4sIHNyZXEtPml2KTsKKwllcnIgPSBjdHgtPmVuYyA/IGNyeXB0b19hYmxrY2lwaGVyX2VuY3J5cHQocmVxKSA6CisJCQkgY3J5cHRvX2FibGtjaXBoZXJfZGVjcnlwdChyZXEpOworCWlmIChlcnIgPT0gLUVJTlBST0dSRVNTKSB7CisJCWF0b21pY19pbmMoJmN0eC0+aW5mbGlnaHQpOworCQllcnIgPSAtRUlPQ0JRVUVVRUQ7CisJCWdvdG8gdW5sb2NrOworCX0KK2ZyZWU6CisJc2tjaXBoZXJfZnJlZV9hc3luY19zZ2xzKHNyZXEpOworCWtmcmVlKHJlcSk7Cit1bmxvY2s6CisJc2tjaXBoZXJfd21lbV93YWtldXAoc2spOworCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBza2NpcGhlcl9yZWN2bXNnX3N5bmMoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJCSBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOwpAQCAtNDM5LDcgKzY0MSw3IEBACiAJbG9uZyBjb3BpZWQgPSAwOwogCiAJbG9ja19zb2NrKHNrKTsKLQl3aGlsZSAoaW92X2l0ZXJfY291bnQoJm1zZy0+bXNnX2l0ZXIpKSB7CisJd2hpbGUgKG1zZ19kYXRhX2xlZnQobXNnKSkgewogCQlzZ2wgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjdHgtPnRzZ2wsCiAJCQkJICAgICAgIHN0cnVjdCBza2NpcGhlcl9zZ19saXN0LCBsaXN0KTsKIAkJc2cgPSBzZ2wtPnNnOwpAQCAtNDUzLDcgKzY1NSw3IEBACiAJCQkJZ290byB1bmxvY2s7CiAJCX0KIAotCQl1c2VkID0gbWluX3QodW5zaWduZWQgbG9uZywgY3R4LT51c2VkLCBpb3ZfaXRlcl9jb3VudCgmbXNnLT5tc2dfaXRlcikpOworCQl1c2VkID0gbWluX3QodW5zaWduZWQgbG9uZywgY3R4LT51c2VkLCBtc2dfZGF0YV9sZWZ0KG1zZykpOwogCiAJCXVzZWQgPSBhZl9hbGdfbWFrZV9zZygmY3R4LT5yc2dsLCAmbXNnLT5tc2dfaXRlciwgdXNlZCk7CiAJCWVyciA9IHVzZWQ7CkBAIC00ODQsNyArNjg2LDcgQEAKIAkJCWdvdG8gdW5sb2NrOwogCiAJCWNvcGllZCArPSB1c2VkOwotCQlza2NpcGhlcl9wdWxsX3NnbChzaywgdXNlZCk7CisJCXNrY2lwaGVyX3B1bGxfc2dsKHNrLCB1c2VkLCAxKTsKIAkJaW92X2l0ZXJfYWR2YW5jZSgmbXNnLT5tc2dfaXRlciwgdXNlZCk7CiAJfQogCkBAIC00OTcsNiArNjk5LDEzIEBACiAJcmV0dXJuIGNvcGllZCA/OiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgc2tjaXBoZXJfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgc2l6ZV90IGlnbm9yZWQsIGludCBmbGFncykKK3sKKwlyZXR1cm4gKG1zZy0+bXNnX2lvY2IgJiYgIWlzX3N5bmNfa2lvY2IobXNnLT5tc2dfaW9jYikpID8KKwkJc2tjaXBoZXJfcmVjdm1zZ19hc3luYyhzb2NrLCBtc2csIGZsYWdzKSA6CisJCXNrY2lwaGVyX3JlY3Ztc2dfc3luYyhzb2NrLCBtc2csIGZsYWdzKTsKK30KIAogc3RhdGljIHVuc2lnbmVkIGludCBza2NpcGhlcl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAogCQkJCSAgcG9sbF90YWJsZSAqd2FpdCkKQEAgLTU1NSwxMiArNzY0LDI1IEBACiAJcmV0dXJuIGNyeXB0b19hYmxrY2lwaGVyX3NldGtleShwcml2YXRlLCBrZXksIGtleWxlbik7CiB9CiAKK3N0YXRpYyB2b2lkIHNrY2lwaGVyX3dhaXQoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBhbGdfc29jayAqYXNrID0gYWxnX3NrKHNrKTsKKwlzdHJ1Y3Qgc2tjaXBoZXJfY3R4ICpjdHggPSBhc2stPnByaXZhdGU7CisJaW50IGN0ciA9IDA7CisKKwl3aGlsZSAoYXRvbWljX3JlYWQoJmN0eC0+aW5mbGlnaHQpICYmIGN0cisrIDwgMTAwKQorCQltc2xlZXAoMTAwKTsKK30KKwogc3RhdGljIHZvaWQgc2tjaXBoZXJfc29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCiB7CiAJc3RydWN0IGFsZ19zb2NrICphc2sgPSBhbGdfc2soc2spOwogCXN0cnVjdCBza2NpcGhlcl9jdHggKmN0eCA9IGFzay0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY3J5cHRvX2FibGtjaXBoZXIgKnRmbSA9IGNyeXB0b19hYmxrY2lwaGVyX3JlcXRmbSgmY3R4LT5yZXEpOwogCisJaWYgKGF0b21pY19yZWFkKCZjdHgtPmluZmxpZ2h0KSkKKwkJc2tjaXBoZXJfd2FpdChzayk7CisKIAlza2NpcGhlcl9mcmVlX3NnbChzayk7CiAJc29ja19remZyZWVfcyhzaywgY3R4LT5pdiwgY3J5cHRvX2FibGtjaXBoZXJfaXZzaXplKHRmbSkpOwogCXNvY2tfa2ZyZWVfcyhzaywgY3R4LCBjdHgtPmxlbik7CkBAIC01OTIsNiArODE0LDcgQEAKIAljdHgtPm1vcmUgPSAwOwogCWN0eC0+bWVyZ2UgPSAwOwogCWN0eC0+ZW5jID0gMDsKKwlhdG9taWNfc2V0KCZjdHgtPmluZmxpZ2h0LCAwKTsKIAlhZl9hbGdfaW5pdF9jb21wbGV0aW9uKCZjdHgtPmNvbXBsZXRpb24pOwogCiAJYXNrLT5wcml2YXRlID0gY3R4OwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2Fuc2lfY3BybmcuYyBiL2NyeXB0by9hbnNpX2Nwcm5nLmMKaW5kZXggNmY1YmViYy4uNzY1ZmU3NiAxMDA2NDQKLS0tIGEvY3J5cHRvL2Fuc2lfY3BybmcuYworKysgYi9jcnlwdG8vYW5zaV9jcHJuZy5jCkBAIC0yMTAsNyArMjEwLDExIEBACiAJCWJ5dGVfY291bnQgPSBERUZBVUxUX0JMS19TWjsKIAl9CiAKLQllcnIgPSBieXRlX2NvdW50OworCS8qCisJICogUmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzIGFzIG1hbmRhdGVkIGJ5IHRoZSBrZXJuZWwKKwkgKiBjcnlwdG8gQVBJIGludGVyZmFjZSBkZWZpbml0aW9uLgorCSAqLworCWVyciA9IDA7CiAKIAlkYmdwcmludChLRVJOX0NSSVQgImdldHRpbmcgJWQgcmFuZG9tIGJ5dGVzIGZvciBjb250ZXh0ICVwXG4iLAogCQlieXRlX2NvdW50LCBjdHgpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2FwaS5jIGIvY3J5cHRvL2FwaS5jCmluZGV4IDJhODFlOTguLmFmZTQ2MTAgMTAwNjQ0Ci0tLSBhL2NyeXB0by9hcGkuYworKysgYi9jcnlwdG8vYXBpLmMKQEAgLTI1Nyw2ICsyNTcsMTYgQEAKIAkJbWFzayB8PSBDUllQVE9fQUxHX1RFU1RFRDsKIAl9CiAKKwkvKgorCSAqIElmIHRoZSBpbnRlcm5hbCBmbGFnIGlzIHNldCBmb3IgYSBjaXBoZXIsIHJlcXVpcmUgYSBjYWxsZXIgdG8KKwkgKiB0byBpbnZva2UgdGhlIGNpcGhlciB3aXRoIHRoZSBpbnRlcm5hbCBmbGFnIHRvIHVzZSB0aGF0IGNpcGhlci4KKwkgKiBBbHNvLCBpZiBhIGNhbGxlciB3YW50cyB0byBhbGxvY2F0ZSBhIGNpcGhlciB0aGF0IG1heSBvciBtYXkKKwkgKiBub3QgYmUgYW4gaW50ZXJuYWwgY2lwaGVyLCB1c2UgdHlwZSB8IENSWVBUT19BTEdfSU5URVJOQUwgYW5kCisJICogIShtYXNrICYgQ1JZUFRPX0FMR19JTlRFUk5BTCkuCisJICovCisJaWYgKCEoKHR5cGUgfCBtYXNrKSAmIENSWVBUT19BTEdfSU5URVJOQUwpKQorCQltYXNrIHw9IENSWVBUT19BTEdfSU5URVJOQUw7CisKIAlsYXJ2YWwgPSBjcnlwdG9fbGFydmFsX2xvb2t1cChuYW1lLCB0eXBlLCBtYXNrKTsKIAlpZiAoSVNfRVJSKGxhcnZhbCkgfHwgIWNyeXB0b19pc19sYXJ2YWwobGFydmFsKSkKIAkJcmV0dXJuIGxhcnZhbDsKZGlmZiAtLWdpdCBhL2NyeXB0by9jcnlwdGQuYyBiL2NyeXB0by9jcnlwdGQuYwppbmRleCA2NTBhZmFjMS4uYjA2MDJiYSAxMDA2NDQKLS0tIGEvY3J5cHRvL2NyeXB0ZC5jCisrKyBiL2NyeXB0by9jcnlwdGQuYwpAQCAtMTY4LDYgKzE2OCwyMCBAQAogCXJldHVybiBpY3R4LT5xdWV1ZTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGNyeXB0ZF9jaGVja19pbnRlcm5hbChzdHJ1Y3QgcnRhdHRyICoqdGIsIHUzMiAqdHlwZSwKKwkJCQkJIHUzMiAqbWFzaykKK3sKKwlzdHJ1Y3QgY3J5cHRvX2F0dHJfdHlwZSAqYWxndDsKKworCWFsZ3QgPSBjcnlwdG9fZ2V0X2F0dHJfdHlwZSh0Yik7CisJaWYgKElTX0VSUihhbGd0KSkKKwkJcmV0dXJuOworCWlmICgoYWxndC0+dHlwZSAmIENSWVBUT19BTEdfSU5URVJOQUwpKQorCQkqdHlwZSB8PSBDUllQVE9fQUxHX0lOVEVSTkFMOworCWlmICgoYWxndC0+bWFzayAmIENSWVBUT19BTEdfSU5URVJOQUwpKQorCQkqbWFzayB8PSBDUllQVE9fQUxHX0lOVEVSTkFMOworfQorCiBzdGF0aWMgaW50IGNyeXB0ZF9ibGtjaXBoZXJfc2V0a2V5KHN0cnVjdCBjcnlwdG9fYWJsa2NpcGhlciAqcGFyZW50LAogCQkJCSAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pCiB7CkBAIC0zMjEsMTAgKzMzNSwxMyBAQAogCXN0cnVjdCBjcnlwdGRfaW5zdGFuY2VfY3R4ICpjdHg7CiAJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdDsKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCXUzMiB0eXBlID0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUjsKKwl1MzIgbWFzayA9IENSWVBUT19BTEdfVFlQRV9NQVNLOwogCWludCBlcnI7CiAKLQlhbGcgPSBjcnlwdG9fZ2V0X2F0dHJfYWxnKHRiLCBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSLAotCQkJCSAgQ1JZUFRPX0FMR19UWVBFX01BU0spOworCWNyeXB0ZF9jaGVja19pbnRlcm5hbCh0YiwgJnR5cGUsICZtYXNrKTsKKworCWFsZyA9IGNyeXB0b19nZXRfYXR0cl9hbGcodGIsIHR5cGUsIG1hc2spOwogCWlmIChJU19FUlIoYWxnKSkKIAkJcmV0dXJuIFBUUl9FUlIoYWxnKTsKIApAQCAtMzQxLDcgKzM1OCwxMCBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZyZWVfaW5zdDsKIAotCWluc3QtPmFsZy5jcmFfZmxhZ3MgPSBDUllQVE9fQUxHX1RZUEVfQUJMS0NJUEhFUiB8IENSWVBUT19BTEdfQVNZTkM7CisJdHlwZSA9IENSWVBUT19BTEdfVFlQRV9BQkxLQ0lQSEVSIHwgQ1JZUFRPX0FMR19BU1lOQzsKKwlpZiAoYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX0lOVEVSTkFMKQorCQl0eXBlIHw9IENSWVBUT19BTEdfSU5URVJOQUw7CisJaW5zdC0+YWxnLmNyYV9mbGFncyA9IHR5cGU7CiAJaW5zdC0+YWxnLmNyYV90eXBlID0gJmNyeXB0b19hYmxrY2lwaGVyX3R5cGU7CiAKIAlpbnN0LT5hbGcuY3JhX2FibGtjaXBoZXIuaXZzaXplID0gYWxnLT5jcmFfYmxrY2lwaGVyLml2c2l6ZTsKQEAgLTU3Nyw5ICs1OTcsMTMgQEAKIAlzdHJ1Y3QgYWhhc2hfaW5zdGFuY2UgKmluc3Q7CiAJc3RydWN0IHNoYXNoX2FsZyAqc2FsZzsKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCXUzMiB0eXBlID0gMDsKKwl1MzIgbWFzayA9IDA7CiAJaW50IGVycjsKIAotCXNhbGcgPSBzaGFzaF9hdHRyX2FsZyh0YlsxXSwgMCwgMCk7CisJY3J5cHRkX2NoZWNrX2ludGVybmFsKHRiLCAmdHlwZSwgJm1hc2spOworCisJc2FsZyA9IHNoYXNoX2F0dHJfYWxnKHRiWzFdLCB0eXBlLCBtYXNrKTsKIAlpZiAoSVNfRVJSKHNhbGcpKQogCQlyZXR1cm4gUFRSX0VSUihzYWxnKTsKIApAQCAtNTk4LDcgKzYyMiwxMCBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZyZWVfaW5zdDsKIAotCWluc3QtPmFsZy5oYWxnLmJhc2UuY3JhX2ZsYWdzID0gQ1JZUFRPX0FMR19BU1lOQzsKKwl0eXBlID0gQ1JZUFRPX0FMR19BU1lOQzsKKwlpZiAoYWxnLT5jcmFfZmxhZ3MgJiBDUllQVE9fQUxHX0lOVEVSTkFMKQorCQl0eXBlIHw9IENSWVBUT19BTEdfSU5URVJOQUw7CisJaW5zdC0+YWxnLmhhbGcuYmFzZS5jcmFfZmxhZ3MgPSB0eXBlOwogCiAJaW5zdC0+YWxnLmhhbGcuZGlnZXN0c2l6ZSA9IHNhbGctPmRpZ2VzdHNpemU7CiAJaW5zdC0+YWxnLmhhbGcuYmFzZS5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgY3J5cHRkX2hhc2hfY3R4KTsKQEAgLTcxOSwxMCArNzQ2LDEzIEBACiAJc3RydWN0IGFlYWRfaW5zdGFuY2VfY3R4ICpjdHg7CiAJc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqaW5zdDsKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCXUzMiB0eXBlID0gQ1JZUFRPX0FMR19UWVBFX0FFQUQ7CisJdTMyIG1hc2sgPSBDUllQVE9fQUxHX1RZUEVfTUFTSzsKIAlpbnQgZXJyOwogCi0JYWxnID0gY3J5cHRvX2dldF9hdHRyX2FsZyh0YiwgQ1JZUFRPX0FMR19UWVBFX0FFQUQsCi0JCQkJQ1JZUFRPX0FMR19UWVBFX01BU0spOworCWNyeXB0ZF9jaGVja19pbnRlcm5hbCh0YiwgJnR5cGUsICZtYXNrKTsKKworCWFsZyA9IGNyeXB0b19nZXRfYXR0cl9hbGcodGIsIHR5cGUsIG1hc2spOwogICAgICAgICBpZiAoSVNfRVJSKGFsZykpCiAJCXJldHVybiBQVFJfRVJSKGFsZyk7CiAKQEAgLTczOSw3ICs3NjksMTAgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlX2luc3Q7CiAKLQlpbnN0LT5hbGcuY3JhX2ZsYWdzID0gQ1JZUFRPX0FMR19UWVBFX0FFQUQgfCBDUllQVE9fQUxHX0FTWU5DOworCXR5cGUgPSBDUllQVE9fQUxHX1RZUEVfQUVBRCB8IENSWVBUT19BTEdfQVNZTkM7CisJaWYgKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19JTlRFUk5BTCkKKwkJdHlwZSB8PSBDUllQVE9fQUxHX0lOVEVSTkFMOworCWluc3QtPmFsZy5jcmFfZmxhZ3MgPSB0eXBlOwogCWluc3QtPmFsZy5jcmFfdHlwZSA9IGFsZy0+Y3JhX3R5cGU7CiAJaW5zdC0+YWxnLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCBjcnlwdGRfYWVhZF9jdHgpOwogCWluc3QtPmFsZy5jcmFfaW5pdCA9IGNyeXB0ZF9hZWFkX2luaXRfdGZtOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL2NyeXB0b191c2VyLmMgYi9jcnlwdG8vY3J5cHRvX3VzZXIuYwppbmRleCBjNTE0OGEzLi40MWRmZTc2IDEwMDY0NAotLS0gYS9jcnlwdG8vY3J5cHRvX3VzZXIuYworKysgYi9jcnlwdG8vY3J5cHRvX3VzZXIuYwpAQCAtNjIsMTAgKzYyLDE0IEBACiAJCWVsc2UgaWYgKCFleGFjdCkKIAkJCW1hdGNoID0gIXN0cmNtcChxLT5jcmFfbmFtZSwgcC0+Y3J1X25hbWUpOwogCi0JCWlmIChtYXRjaCkgewotCQkJYWxnID0gcTsKLQkJCWJyZWFrOwotCQl9CisJCWlmICghbWF0Y2gpCisJCQljb250aW51ZTsKKworCQlpZiAodW5saWtlbHkoIWNyeXB0b19tb2RfZ2V0KHEpKSkKKwkJCWNvbnRpbnVlOworCisJCWFsZyA9IHE7CisJCWJyZWFrOwogCX0KIAogCXVwX3JlYWQoJmNyeXB0b19hbGdfc2VtKTsKQEAgLTIwNSw5ICsyMDksMTAgQEAKIAlpZiAoIWFsZykKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKKwllcnIgPSAtRU5PTUVNOwogCXNrYiA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9BVE9NSUMpOwogCWlmICghc2tiKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBkcm9wX2FsZzsKIAogCWluZm8uaW5fc2tiID0gaW5fc2tiOwogCWluZm8ub3V0X3NrYiA9IHNrYjsKQEAgLTIxNSw2ICsyMjAsMTAgQEAKIAlpbmZvLm5sbXNnX2ZsYWdzID0gMDsKIAogCWVyciA9IGNyeXB0b19yZXBvcnRfYWxnKGFsZywgJmluZm8pOworCitkcm9wX2FsZzoKKwljcnlwdG9fbW9kX3B1dChhbGcpOworCiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApAQCAtMjg0LDYgKzI5Myw3IEBACiAKIAl1cF93cml0ZSgmY3J5cHRvX2FsZ19zZW0pOwogCisJY3J5cHRvX21vZF9wdXQoYWxnKTsKIAljcnlwdG9fcmVtb3ZlX2ZpbmFsKCZsaXN0KTsKIAogCXJldHVybiAwOwpAQCAtMjk0LDYgKzMwNCw3IEBACiB7CiAJc3RydWN0IGNyeXB0b19hbGcgKmFsZzsKIAlzdHJ1Y3QgY3J5cHRvX3VzZXJfYWxnICpwID0gbmxtc2dfZGF0YShubGgpOworCWludCBlcnI7CiAKIAlpZiAoIW5ldGxpbmtfY2FwYWJsZShza2IsIENBUF9ORVRfQURNSU4pKQogCQlyZXR1cm4gLUVQRVJNOwpAQCAtMzEwLDEzICszMjEsMTkgQEAKIAkgKiBpZiB3ZSB0cnkgdG8gdW5yZWdpc3Rlci4gVW5yZWdpc3RlcmluZyBzdWNoIGFuIGFsZ29yaXRobSB3aXRob3V0CiAJICogcmVtb3ZpbmcgdGhlIG1vZHVsZSBpcyBub3QgcG9zc2libGUsIHNvIHdlIHJlc3RyaWN0IHRvIGNyeXB0bwogCSAqIGluc3RhbmNlcyB0aGF0IGFyZSBidWlsZCBmcm9tIHRlbXBsYXRlcy4gKi8KKwllcnIgPSAtRUlOVkFMOwogCWlmICghKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19JTlNUQU5DRSkpCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIGRyb3BfYWxnOwogCi0JaWYgKGF0b21pY19yZWFkKCZhbGctPmNyYV9yZWZjbnQpICE9IDEpCi0JCXJldHVybiAtRUJVU1k7CisJZXJyID0gLUVCVVNZOworCWlmIChhdG9taWNfcmVhZCgmYWxnLT5jcmFfcmVmY250KSA+IDIpCisJCWdvdG8gZHJvcF9hbGc7CiAKLQlyZXR1cm4gY3J5cHRvX3VucmVnaXN0ZXJfaW5zdGFuY2UoYWxnKTsKKwllcnIgPSBjcnlwdG9fdW5yZWdpc3Rlcl9pbnN0YW5jZSgoc3RydWN0IGNyeXB0b19pbnN0YW5jZSAqKWFsZyk7CisKK2Ryb3BfYWxnOgorCWNyeXB0b19tb2RfcHV0KGFsZyk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnICpjcnlwdG9fdXNlcl9za2NpcGhlcl9hbGcoY29uc3QgY2hhciAqbmFtZSwgdTMyIHR5cGUsCkBAIC0zOTUsOCArNDEyLDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJYWxnID0gY3J5cHRvX2FsZ19tYXRjaChwLCBleGFjdCk7Ci0JaWYgKGFsZykKKwlpZiAoYWxnKSB7CisJCWNyeXB0b19tb2RfcHV0KGFsZyk7CiAJCXJldHVybiAtRUVYSVNUOworCX0KIAogCWlmIChzdHJsZW4ocC0+Y3J1X2RyaXZlcl9uYW1lKSkKIAkJbmFtZSA9IHAtPmNydV9kcml2ZXJfbmFtZTsKZGlmZiAtLWdpdCBhL2NyeXB0by9kcmJnLmMgYi9jcnlwdG8vZHJiZy5jCmluZGV4IGQ4ZmYxNmUuLmI2OTQwOWMgMTAwNjQ0Ci0tLSBhL2NyeXB0by9kcmJnLmMKKysrIGIvY3J5cHRvL2RyYmcuYwpAQCAtMTE5LDE5ICsxMTksMTkgQEAKIAkJLnN0YXRlbGVuID0gMzIsIC8qIDI1NiBiaXRzIGFzIGRlZmluZWQgaW4gMTAuMi4xICovCiAJCS5ibG9ja2xlbl9ieXRlcyA9IDE2LAogCQkuY3JhX25hbWUgPSAiY3RyX2FlczEyOCIsCi0JCS5iYWNrZW5kX2NyYV9uYW1lID0gImVjYihhZXMpIiwKKwkJLmJhY2tlbmRfY3JhX25hbWUgPSAiYWVzIiwKIAl9LCB7CiAJCS5mbGFncyA9IERSQkdfQ1RSIHwgRFJCR19TVFJFTkdUSDE5MiwKIAkJLnN0YXRlbGVuID0gNDAsIC8qIDMyMCBiaXRzIGFzIGRlZmluZWQgaW4gMTAuMi4xICovCiAJCS5ibG9ja2xlbl9ieXRlcyA9IDE2LAogCQkuY3JhX25hbWUgPSAiY3RyX2FlczE5MiIsCi0JCS5iYWNrZW5kX2NyYV9uYW1lID0gImVjYihhZXMpIiwKKwkJLmJhY2tlbmRfY3JhX25hbWUgPSAiYWVzIiwKIAl9LCB7CiAJCS5mbGFncyA9IERSQkdfQ1RSIHwgRFJCR19TVFJFTkdUSDI1NiwKIAkJLnN0YXRlbGVuID0gNDgsIC8qIDM4NCBiaXRzIGFzIGRlZmluZWQgaW4gMTAuMi4xICovCiAJCS5ibG9ja2xlbl9ieXRlcyA9IDE2LAogCQkuY3JhX25hbWUgPSAiY3RyX2FlczI1NiIsCi0JCS5iYWNrZW5kX2NyYV9uYW1lID0gImVjYihhZXMpIiwKKwkJLmJhY2tlbmRfY3JhX25hbWUgPSAiYWVzIiwKIAl9LAogI2VuZGlmIC8qIENPTkZJR19DUllQVE9fRFJCR19DVFIgKi8KICNpZmRlZiBDT05GSUdfQ1JZUFRPX0RSQkdfSEFTSApAQCAtMzA4LDkgKzMwOCw2IEBACiAKIAlkcmJnX3N0cmluZ19maWxsKCZkYXRhLCBvdXQsIGRyYmdfYmxvY2tsZW4oZHJiZykpOwogCi0JLyogMTAuNC4zIHN0ZXAgMSAqLwotCW1lbXNldChvdXQsIDAsIGRyYmdfYmxvY2tsZW4oZHJiZykpOwotCiAJLyogMTAuNC4zIHN0ZXAgMiAvIDQgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cnIsIGluLCBsaXN0KSB7CiAJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBvcyA9IGN1cnItPmJ1ZjsKQEAgLTQwNiw3ICs0MDMsNiBAQAogCiAJbWVtc2V0KHBhZCwgMCwgZHJiZ19ibG9ja2xlbihkcmJnKSk7CiAJbWVtc2V0KGl2LCAwLCBkcmJnX2Jsb2NrbGVuKGRyYmcpKTsKLQltZW1zZXQodGVtcCwgMCwgZHJiZ19zdGF0ZWxlbihkcmJnKSk7CiAKIAkvKiAxMC40LjIgc3RlcCAxIGlzIGltcGxpY2l0IGFzIHdlIHdvcmsgYnl0ZS13aXNlICovCiAKQEAgLTUyMyw3ICs1MTksNiBAQAogCXVuc2lnbmVkIGludCBsZW4gPSAwOwogCXN0cnVjdCBkcmJnX3N0cmluZyBjaXBoZXJpbjsKIAotCW1lbXNldCh0ZW1wLCAwLCBkcmJnX3N0YXRlbGVuKGRyYmcpICsgZHJiZ19ibG9ja2xlbihkcmJnKSk7CiAJaWYgKDMgPiByZXNlZWQpCiAJCW1lbXNldChkZl9kYXRhLCAwLCBkcmJnX3N0YXRlbGVuKGRyYmcpKTsKIApAQCAtNTg1LDggKzU4MCw2IEBACiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGRyYmdfc3RyaW5nIGRhdGE7CiAKLQltZW1zZXQoZHJiZy0+c2NyYXRjaHBhZCwgMCwgZHJiZ19ibG9ja2xlbihkcmJnKSk7Ci0KIAkvKiAxMC4yLjEuNS4yIHN0ZXAgMiAqLwogCWlmIChhZGR0bCAmJiAhbGlzdF9lbXB0eShhZGR0bCkpIHsKIAkJcmV0ID0gZHJiZ19jdHJfdXBkYXRlKGRyYmcsIGFkZHRsLCAyKTsKQEAgLTc2MSw3ICs3NTQsNiBAQAogCS5nZW5lcmF0ZQk9IGRyYmdfaG1hY19nZW5lcmF0ZSwKIAkuY3J5cHRvX2luaXQJPSBkcmJnX2luaXRfaGFzaF9rZXJuZWwsCiAJLmNyeXB0b19maW5pCT0gZHJiZ19maW5pX2hhc2hfa2VybmVsLAotCiB9OwogI2VuZGlmIC8qIENPTkZJR19DUllQVE9fRFJCR19ITUFDICovCiAKQEAgLTgzOCw4ICs4MzAsNiBAQAogCXVuc2lnbmVkIGNoYXIgKnRtcCA9IGRyYmctPnNjcmF0Y2hwYWQgKyBkcmJnX3N0YXRlbGVuKGRyYmcpOwogCXN0cnVjdCBkcmJnX3N0cmluZyBkYXRhOwogCi0JbWVtc2V0KHRtcCwgMCwgZHJiZ19ibG9ja2xlbihkcmJnKSk7Ci0KIAkvKiAxMC40LjEgc3RlcCAzICovCiAJaW5wdXRbMF0gPSAxOwogCWRyYmdfY3B1X3RvX2JlMzIoKG91dGxlbiAqIDgpLCAmaW5wdXRbMV0pOwpAQCAtODc5LDcgKzg2OSw2IEBACiAJdW5zaWduZWQgY2hhciAqViA9IGRyYmctPnNjcmF0Y2hwYWQ7CiAJdW5zaWduZWQgY2hhciBwcmVmaXggPSBEUkJHX1BSRUZJWDE7CiAKLQltZW1zZXQoZHJiZy0+c2NyYXRjaHBhZCwgMCwgZHJiZ19zdGF0ZWxlbihkcmJnKSk7CiAJaWYgKCFzZWVkKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtOTIxLDkgKzkxMCw2IEBACiAJTElTVF9IRUFEKGRhdGFsaXN0KTsKIAl1bnNpZ25lZCBjaGFyIHByZWZpeCA9IERSQkdfUFJFRklYMjsKIAotCS8qIHRoaXMgaXMgdmFsdWUgdyBhcyBwZXIgZG9jdW1lbnRhdGlvbiAqLwotCW1lbXNldChkcmJnLT5zY3JhdGNocGFkLCAwLCBkcmJnX2Jsb2NrbGVuKGRyYmcpKTsKLQogCS8qIDEwLjEuMS40IHN0ZXAgMiAqLwogCWlmICghYWRkdGwgfHwgbGlzdF9lbXB0eShhZGR0bCkpCiAJCXJldHVybiAwOwpAQCAtOTU5LDkgKzk0NSw2IEBACiAJc3RydWN0IGRyYmdfc3RyaW5nIGRhdGE7CiAJTElTVF9IRUFEKGRhdGFsaXN0KTsKIAotCW1lbXNldChzcmMsIDAsIGRyYmdfc3RhdGVsZW4oZHJiZykpOwotCW1lbXNldChkc3QsIDAsIGRyYmdfYmxvY2tsZW4oZHJiZykpOwotCiAJLyogMTAuMS4xLjQgc3RlcCBoYXNoZ2VuIDIgKi8KIAltZW1jcHkoc3JjLCBkcmJnLT5WLCBkcmJnX3N0YXRlbGVuKGRyYmcpKTsKIApAQCAtMTAxOCw3ICsxMDAxLDYgQEAKIAlsZW4gPSBkcmJnX2hhc2hfaGFzaGdlbihkcmJnLCBidWYsIGJ1Zmxlbik7CiAKIAkvKiB0aGlzIGlzIHRoZSB2YWx1ZSBIIGFzIGRvY3VtZW50ZWQgaW4gMTAuMS4xLjQgKi8KLQltZW1zZXQoZHJiZy0+c2NyYXRjaHBhZCwgMCwgZHJiZ19ibG9ja2xlbihkcmJnKSk7CiAJLyogMTAuMS4xLjQgc3RlcCA0ICovCiAJZHJiZ19zdHJpbmdfZmlsbCgmZGF0YTEsICZwcmVmaXgsIDEpOwogCWxpc3RfYWRkX3RhaWwoJmRhdGExLmxpc3QsICZkYXRhbGlzdCk7CkBAIC0xMjk4LDcgKzEyODAsNyBAQAogICoJICBhcyBkZWZpbmVkIGluIFNQODAwLTkwQS4gVGhlIGFkZGl0aW9uYWwgaW5wdXQgaXMgbWl4ZWQgaW50bwogICoJICB0aGUgc3RhdGUgaW4gYWRkaXRpb24gdG8gdGhlIHB1bGxlZCBlbnRyb3B5LgogICoKLSAqIHJldHVybjogZ2VuZXJhdGVkIG51bWJlciBvZiBieXRlcworICogcmV0dXJuOiAwIHdoZW4gYWxsIGJ5dGVzIGFyZSBnZW5lcmF0ZWQ7IDwgMCBpbiBjYXNlIG9mIGFuIGVycm9yCiAgKi8KIHN0YXRpYyBpbnQgZHJiZ19nZW5lcmF0ZShzdHJ1Y3QgZHJiZ19zdGF0ZSAqZHJiZywKIAkJCSB1bnNpZ25lZCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4sCkBAIC0xNDM3LDYgKzE0MTksMTEgQEAKIAl9CiAjZW5kaWYKIAorCS8qCisJICogQWxsIG9wZXJhdGlvbnMgd2VyZSBzdWNjZXNzZnVsLCByZXR1cm4gMCBhcyBtYW5kYXRlZCBieQorCSAqIHRoZSBrZXJuZWwgY3J5cHRvIEFQSSBpbnRlcmZhY2UuCisJICovCisJbGVuID0gMDsKIGVycjoKIAlzaGFkb3ctPmRfb3BzLT5jcnlwdG9fZmluaShzaGFkb3cpOwogCWRyYmdfcmVzdG9yZV9zaGFkb3coZHJiZywgJnNoYWRvdyk7CkBAIC0xNjQ0LDI0ICsxNjMxLDI0IEBACiBzdGF0aWMgaW50IGRyYmdfaW5pdF9zeW1fa2VybmVsKHN0cnVjdCBkcmJnX3N0YXRlICpkcmJnKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm07CisJc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbTsKIAotCXRmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoZHJiZy0+Y29yZS0+YmFja2VuZF9jcmFfbmFtZSwgMCwgMCk7CisJdGZtID0gY3J5cHRvX2FsbG9jX2NpcGhlcihkcmJnLT5jb3JlLT5iYWNrZW5kX2NyYV9uYW1lLCAwLCAwKTsKIAlpZiAoSVNfRVJSKHRmbSkpIHsKIAkJcHJfaW5mbygiRFJCRzogY291bGQgbm90IGFsbG9jYXRlIGNpcGhlciBURk0gaGFuZGxlXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIodGZtKTsKIAl9Ci0JQlVHX09OKGRyYmdfYmxvY2tsZW4oZHJiZykgIT0gY3J5cHRvX2Jsa2NpcGhlcl9ibG9ja3NpemUodGZtKSk7CisJQlVHX09OKGRyYmdfYmxvY2tsZW4oZHJiZykgIT0gY3J5cHRvX2NpcGhlcl9ibG9ja3NpemUodGZtKSk7CiAJZHJiZy0+cHJpdl9kYXRhID0gdGZtOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZHJiZ19maW5pX3N5bV9rZXJuZWwoc3RydWN0IGRyYmdfc3RhdGUgKmRyYmcpCiB7Ci0Jc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSA9Ci0JCShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqKWRyYmctPnByaXZfZGF0YTsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtID0KKwkJKHN0cnVjdCBjcnlwdG9fY2lwaGVyICopZHJiZy0+cHJpdl9kYXRhOwogCWlmICh0Zm0pCi0JCWNyeXB0b19mcmVlX2Jsa2NpcGhlcih0Zm0pOworCQljcnlwdG9fZnJlZV9jaXBoZXIodGZtKTsKIAlkcmJnLT5wcml2X2RhdGEgPSBOVUxMOwogCXJldHVybiAwOwogfQpAQCAtMTY2OSwyMSArMTY1NiwxNCBAQAogc3RhdGljIGludCBkcmJnX2tjYXBpX3N5bShzdHJ1Y3QgZHJiZ19zdGF0ZSAqZHJiZywgY29uc3QgdW5zaWduZWQgY2hhciAqa2V5LAogCQkJICB1bnNpZ25lZCBjaGFyICpvdXR2YWwsIGNvbnN0IHN0cnVjdCBkcmJnX3N0cmluZyAqaW4pCiB7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0IHNnX2luLCBzZ19vdXQ7Ci0Jc3RydWN0IGJsa2NpcGhlcl9kZXNjIGRlc2M7Ci0Jc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSA9Ci0JCShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqKWRyYmctPnByaXZfZGF0YTsKKwlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtID0KKwkJKHN0cnVjdCBjcnlwdG9fY2lwaGVyICopZHJiZy0+cHJpdl9kYXRhOwogCi0JZGVzYy50Zm0gPSB0Zm07Ci0JZGVzYy5mbGFncyA9IDA7Ci0JY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGZtLCBrZXksIChkcmJnX2tleWxlbihkcmJnKSkpOworCWNyeXB0b19jaXBoZXJfc2V0a2V5KHRmbSwga2V5LCAoZHJiZ19rZXlsZW4oZHJiZykpKTsKIAkvKiB0aGVyZSBpcyBvbmx5IGNvbXBvbmVudCBpbiAqaW4gKi8KLQlzZ19pbml0X29uZSgmc2dfaW4sIGluLT5idWYsIGluLT5sZW4pOwotCXNnX2luaXRfb25lKCZzZ19vdXQsIG91dHZhbCwgZHJiZ19ibG9ja2xlbihkcmJnKSk7Ci0JcmV0ID0gY3J5cHRvX2Jsa2NpcGhlcl9lbmNyeXB0KCZkZXNjLCAmc2dfb3V0LCAmc2dfaW4sIGluLT5sZW4pOwotCi0JcmV0dXJuIHJldDsKKwlCVUdfT04oaW4tPmxlbiA8IGRyYmdfYmxvY2tsZW4oZHJiZykpOworCWNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUodGZtLCBvdXR2YWwsIGluLT5idWYpOworCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19DUllQVE9fRFJCR19DVFIgKi8KIApkaWZmIC0tZ2l0IGEvY3J5cHRvL21jcnlwdGQuYyBiL2NyeXB0by9tY3J5cHRkLmMKaW5kZXggYThlODcwNC4uZmU1YjQ5NWEgMTAwNjQ0Ci0tLSBhL2NyeXB0by9tY3J5cHRkLmMKKysrIGIvY3J5cHRvL21jcnlwdGQuYwpAQCAtMjU4LDYgKzI1OCwyMCBAQAogCWdvdG8gb3V0OwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbWNyeXB0ZF9jaGVja19pbnRlcm5hbChzdHJ1Y3QgcnRhdHRyICoqdGIsIHUzMiAqdHlwZSwKKwkJCQkJICB1MzIgKm1hc2spCit7CisJc3RydWN0IGNyeXB0b19hdHRyX3R5cGUgKmFsZ3Q7CisKKwlhbGd0ID0gY3J5cHRvX2dldF9hdHRyX3R5cGUodGIpOworCWlmIChJU19FUlIoYWxndCkpCisJCXJldHVybjsKKwlpZiAoKGFsZ3QtPnR5cGUgJiBDUllQVE9fQUxHX0lOVEVSTkFMKSkKKwkJKnR5cGUgfD0gQ1JZUFRPX0FMR19JTlRFUk5BTDsKKwlpZiAoKGFsZ3QtPm1hc2sgJiBDUllQVE9fQUxHX0lOVEVSTkFMKSkKKwkJKm1hc2sgfD0gQ1JZUFRPX0FMR19JTlRFUk5BTDsKK30KKwogc3RhdGljIGludCBtY3J5cHRkX2hhc2hfaW5pdF90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKIHsKIAlzdHJ1Y3QgY3J5cHRvX2luc3RhbmNlICppbnN0ID0gY3J5cHRvX3RmbV9hbGdfaW5zdGFuY2UodGZtKTsKQEAgLTQ4MCw5ICs0OTQsMTMgQEAKIAlzdHJ1Y3QgYWhhc2hfaW5zdGFuY2UgKmluc3Q7CiAJc3RydWN0IHNoYXNoX2FsZyAqc2FsZzsKIAlzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnOworCXUzMiB0eXBlID0gMDsKKwl1MzIgbWFzayA9IDA7CiAJaW50IGVycjsKIAotCXNhbGcgPSBzaGFzaF9hdHRyX2FsZyh0YlsxXSwgMCwgMCk7CisJbWNyeXB0ZF9jaGVja19pbnRlcm5hbCh0YiwgJnR5cGUsICZtYXNrKTsKKworCXNhbGcgPSBzaGFzaF9hdHRyX2FsZyh0YlsxXSwgdHlwZSwgbWFzayk7CiAJaWYgKElTX0VSUihzYWxnKSkKIAkJcmV0dXJuIFBUUl9FUlIoc2FsZyk7CiAKQEAgLTUwMiw3ICs1MjAsMTAgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlX2luc3Q7CiAKLQlpbnN0LT5hbGcuaGFsZy5iYXNlLmNyYV9mbGFncyA9IENSWVBUT19BTEdfQVNZTkM7CisJdHlwZSA9IENSWVBUT19BTEdfQVNZTkM7CisJaWYgKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19JTlRFUk5BTCkKKwkJdHlwZSB8PSBDUllQVE9fQUxHX0lOVEVSTkFMOworCWluc3QtPmFsZy5oYWxnLmJhc2UuY3JhX2ZsYWdzID0gdHlwZTsKIAogCWluc3QtPmFsZy5oYWxnLmRpZ2VzdHNpemUgPSBzYWxnLT5kaWdlc3RzaXplOwogCWluc3QtPmFsZy5oYWxnLmJhc2UuY3JhX2N0eHNpemUgPSBzaXplb2Yoc3RydWN0IG1jcnlwdGRfaGFzaF9jdHgpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Byb2MuYyBiL2NyeXB0by9wcm9jLmMKaW5kZXggNGEwYTdhYS4uNGZmZTczYiAxMDA2NDQKLS0tIGEvY3J5cHRvL3Byb2MuYworKysgYi9jcnlwdG8vcHJvYy5jCkBAIC04OSw2ICs4OSw5IEBACiAJc2VxX3ByaW50ZihtLCAic2VsZnRlc3QgICAgIDogJXNcbiIsCiAJCSAgIChhbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVEVTVEVEKSA/CiAJCSAgICJwYXNzZWQiIDogInVua25vd24iKTsKKwlzZXFfcHJpbnRmKG0sICJpbnRlcm5hbCAgICAgOiAlc1xuIiwKKwkJICAgKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19JTlRFUk5BTCkgPworCQkgICAieWVzIiA6ICJubyIpOwogCiAJaWYgKGFsZy0+Y3JhX2ZsYWdzICYgQ1JZUFRPX0FMR19MQVJWQUwpIHsKIAkJc2VxX3ByaW50ZihtLCAidHlwZSAgICAgICAgIDogbGFydmFsXG4iKTsKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGExX2dlbmVyaWMuYyBiL2NyeXB0by9zaGExX2dlbmVyaWMuYwppbmRleCBhM2U1MGMzLi4zOWUzYWNjIDEwMDY0NAotLS0gYS9jcnlwdG8vc2hhMV9nZW5lcmljLmMKKysrIGIvY3J5cHRvL3NoYTFfZ2VuZXJpYy5jCkBAIC0yMywxMTEgKzIzLDQ5IEBACiAjaW5jbHVkZSA8bGludXgvY3J5cHRvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgorI2luY2x1ZGUgPGNyeXB0by9zaGExX2Jhc2UuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKLXN0YXRpYyBpbnQgc2hhMV9pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQorc3RhdGljIHZvaWQgc2hhMV9nZW5lcmljX2Jsb2NrX2ZuKHN0cnVjdCBzaGExX3N0YXRlICpzc3QsIHU4IGNvbnN0ICpzcmMsCisJCQkJICBpbnQgYmxvY2tzKQogewotCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisJdTMyIHRlbXBbU0hBX1dPUktTUEFDRV9XT1JEU107CiAKLQkqc2N0eCA9IChzdHJ1Y3Qgc2hhMV9zdGF0ZSl7Ci0JCS5zdGF0ZSA9IHsgU0hBMV9IMCwgU0hBMV9IMSwgU0hBMV9IMiwgU0hBMV9IMywgU0hBMV9INCB9LAotCX07Ci0KLQlyZXR1cm4gMDsKKwl3aGlsZSAoYmxvY2tzLS0pIHsKKwkJc2hhX3RyYW5zZm9ybShzc3QtPnN0YXRlLCBzcmMsIHRlbXApOworCQlzcmMgKz0gU0hBMV9CTE9DS19TSVpFOworCX0KKwltZW16ZXJvX2V4cGxpY2l0KHRlbXAsIHNpemVvZih0ZW1wKSk7CiB9CiAKIGludCBjcnlwdG9fc2hhMV91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAotCQkJdW5zaWduZWQgaW50IGxlbikKKwkJICAgICAgIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0Jc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQl1bnNpZ25lZCBpbnQgcGFydGlhbCwgZG9uZTsKLQljb25zdCB1OCAqc3JjOwotCi0JcGFydGlhbCA9IHNjdHgtPmNvdW50ICUgU0hBMV9CTE9DS19TSVpFOwotCXNjdHgtPmNvdW50ICs9IGxlbjsKLQlkb25lID0gMDsKLQlzcmMgPSBkYXRhOwotCi0JaWYgKChwYXJ0aWFsICsgbGVuKSA+PSBTSEExX0JMT0NLX1NJWkUpIHsKLQkJdTMyIHRlbXBbU0hBX1dPUktTUEFDRV9XT1JEU107Ci0KLQkJaWYgKHBhcnRpYWwpIHsKLQkJCWRvbmUgPSAtcGFydGlhbDsKLQkJCW1lbWNweShzY3R4LT5idWZmZXIgKyBwYXJ0aWFsLCBkYXRhLAotCQkJICAgICAgIGRvbmUgKyBTSEExX0JMT0NLX1NJWkUpOwotCQkJc3JjID0gc2N0eC0+YnVmZmVyOwotCQl9Ci0KLQkJZG8gewotCQkJc2hhX3RyYW5zZm9ybShzY3R4LT5zdGF0ZSwgc3JjLCB0ZW1wKTsKLQkJCWRvbmUgKz0gU0hBMV9CTE9DS19TSVpFOwotCQkJc3JjID0gZGF0YSArIGRvbmU7Ci0JCX0gd2hpbGUgKGRvbmUgKyBTSEExX0JMT0NLX1NJWkUgPD0gbGVuKTsKLQotCQltZW16ZXJvX2V4cGxpY2l0KHRlbXAsIHNpemVvZih0ZW1wKSk7Ci0JCXBhcnRpYWwgPSAwOwotCX0KLQltZW1jcHkoc2N0eC0+YnVmZmVyICsgcGFydGlhbCwgc3JjLCBsZW4gLSBkb25lKTsKLQotCXJldHVybiAwOworCXJldHVybiBzaGExX2Jhc2VfZG9fdXBkYXRlKGRlc2MsIGRhdGEsIGxlbiwgc2hhMV9nZW5lcmljX2Jsb2NrX2ZuKTsKIH0KIEVYUE9SVF9TWU1CT0woY3J5cHRvX3NoYTFfdXBkYXRlKTsKIAotCi0vKiBBZGQgcGFkZGluZyBhbmQgcmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdC4gKi8KIHN0YXRpYyBpbnQgc2hhMV9maW5hbChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKIHsKLQlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCV9fYmUzMiAqZHN0ID0gKF9fYmUzMiAqKW91dDsKLQl1MzIgaSwgaW5kZXgsIHBhZGxlbjsKLQlfX2JlNjQgYml0czsKLQlzdGF0aWMgY29uc3QgdTggcGFkZGluZ1s2NF0gPSB7IDB4ODAsIH07Ci0KLQliaXRzID0gY3B1X3RvX2JlNjQoc2N0eC0+Y291bnQgPDwgMyk7Ci0KLQkvKiBQYWQgb3V0IHRvIDU2IG1vZCA2NCAqLwotCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOwotCXBhZGxlbiA9IChpbmRleCA8IDU2KSA/ICg1NiAtIGluZGV4KSA6ICgoNjQrNTYpIC0gaW5kZXgpOwotCWNyeXB0b19zaGExX3VwZGF0ZShkZXNjLCBwYWRkaW5nLCBwYWRsZW4pOwotCi0JLyogQXBwZW5kIGxlbmd0aCAqLwotCWNyeXB0b19zaGExX3VwZGF0ZShkZXNjLCAoY29uc3QgdTggKikmYml0cywgc2l6ZW9mKGJpdHMpKTsKLQotCS8qIFN0b3JlIHN0YXRlIGluIGRpZ2VzdCAqLwotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0JCWRzdFtpXSA9IGNwdV90b19iZTMyKHNjdHgtPnN0YXRlW2ldKTsKLQotCS8qIFdpcGUgY29udGV4dCAqLwotCW1lbXNldChzY3R4LCAwLCBzaXplb2YgKnNjdHgpOwotCi0JcmV0dXJuIDA7CisJc2hhMV9iYXNlX2RvX2ZpbmFsaXplKGRlc2MsIHNoYTFfZ2VuZXJpY19ibG9ja19mbik7CisJcmV0dXJuIHNoYTFfYmFzZV9maW5pc2goZGVzYywgb3V0KTsKIH0KIAotc3RhdGljIGludCBzaGExX2V4cG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdm9pZCAqb3V0KQoraW50IGNyeXB0b19zaGExX2ZpbnVwKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJICAgICAgdW5zaWduZWQgaW50IGxlbiwgdTggKm91dCkKIHsKLQlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCi0JbWVtY3B5KG91dCwgc2N0eCwgc2l6ZW9mKCpzY3R4KSk7Ci0JcmV0dXJuIDA7CisJc2hhMV9iYXNlX2RvX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sIHNoYTFfZ2VuZXJpY19ibG9ja19mbik7CisJcmV0dXJuIHNoYTFfZmluYWwoZGVzYywgb3V0KTsKIH0KLQotc3RhdGljIGludCBzaGExX2ltcG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3Qgdm9pZCAqaW4pCi17Ci0Jc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQotCW1lbWNweShzY3R4LCBpbiwgc2l6ZW9mKCpzY3R4KSk7Ci0JcmV0dXJuIDA7Ci19CitFWFBPUlRfU1lNQk9MKGNyeXB0b19zaGExX2ZpbnVwKTsKIAogc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgYWxnID0gewogCS5kaWdlc3RzaXplCT0JU0hBMV9ESUdFU1RfU0laRSwKLQkuaW5pdAkJPQlzaGExX2luaXQsCisJLmluaXQJCT0Jc2hhMV9iYXNlX2luaXQsCiAJLnVwZGF0ZQkJPQljcnlwdG9fc2hhMV91cGRhdGUsCiAJLmZpbmFsCQk9CXNoYTFfZmluYWwsCi0JLmV4cG9ydAkJPQlzaGExX2V4cG9ydCwKLQkuaW1wb3J0CQk9CXNoYTFfaW1wb3J0LAorCS5maW51cAkJPQljcnlwdG9fc2hhMV9maW51cCwKIAkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTFfc3RhdGUpLAotCS5zdGF0ZXNpemUJPQlzaXplb2Yoc3RydWN0IHNoYTFfc3RhdGUpLAogCS5iYXNlCQk9CXsKIAkJLmNyYV9uYW1lCT0JInNoYTEiLAogCQkuY3JhX2RyaXZlcl9uYW1lPQkic2hhMS1nZW5lcmljIiwKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGEyNTZfZ2VuZXJpYy5jIGIvY3J5cHRvL3NoYTI1Nl9nZW5lcmljLmMKaW5kZXggYjAwMWZmNS4uNzg0MzExNiAxMDA2NDQKLS0tIGEvY3J5cHRvL3NoYTI1Nl9nZW5lcmljLmMKKysrIGIvY3J5cHRvL3NoYTI1Nl9nZW5lcmljLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8Y3J5cHRvL3NoYS5oPgorI2luY2x1ZGUgPGNyeXB0by9zaGEyNTZfYmFzZS5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKQEAgLTIxNCwxMzggKzIxNSw0MyBAQAogCW1lbXplcm9fZXhwbGljaXQoVywgNjQgKiBzaXplb2YodTMyKSk7CiB9CiAKLXN0YXRpYyBpbnQgc2hhMjI0X2luaXQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCitzdGF0aWMgdm9pZCBzaGEyNTZfZ2VuZXJpY19ibG9ja19mbihzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzc3QsIHU4IGNvbnN0ICpzcmMsCisJCQkJICAgIGludCBibG9ja3MpCiB7Ci0Jc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCXNjdHgtPnN0YXRlWzBdID0gU0hBMjI0X0gwOwotCXNjdHgtPnN0YXRlWzFdID0gU0hBMjI0X0gxOwotCXNjdHgtPnN0YXRlWzJdID0gU0hBMjI0X0gyOwotCXNjdHgtPnN0YXRlWzNdID0gU0hBMjI0X0gzOwotCXNjdHgtPnN0YXRlWzRdID0gU0hBMjI0X0g0OwotCXNjdHgtPnN0YXRlWzVdID0gU0hBMjI0X0g1OwotCXNjdHgtPnN0YXRlWzZdID0gU0hBMjI0X0g2OwotCXNjdHgtPnN0YXRlWzddID0gU0hBMjI0X0g3OwotCXNjdHgtPmNvdW50ID0gMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNoYTI1Nl9pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQotewotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQlzY3R4LT5zdGF0ZVswXSA9IFNIQTI1Nl9IMDsKLQlzY3R4LT5zdGF0ZVsxXSA9IFNIQTI1Nl9IMTsKLQlzY3R4LT5zdGF0ZVsyXSA9IFNIQTI1Nl9IMjsKLQlzY3R4LT5zdGF0ZVszXSA9IFNIQTI1Nl9IMzsKLQlzY3R4LT5zdGF0ZVs0XSA9IFNIQTI1Nl9INDsKLQlzY3R4LT5zdGF0ZVs1XSA9IFNIQTI1Nl9INTsKLQlzY3R4LT5zdGF0ZVs2XSA9IFNIQTI1Nl9INjsKLQlzY3R4LT5zdGF0ZVs3XSA9IFNIQTI1Nl9INzsKLQlzY3R4LT5jb3VudCA9IDA7Ci0KLQlyZXR1cm4gMDsKKwl3aGlsZSAoYmxvY2tzLS0pIHsKKwkJc2hhMjU2X3RyYW5zZm9ybShzc3QtPnN0YXRlLCBzcmMpOworCQlzcmMgKz0gU0hBMjU2X0JMT0NLX1NJWkU7CisJfQogfQogCiBpbnQgY3J5cHRvX3NoYTI1Nl91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAogCQkJICB1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQl1bnNpZ25lZCBpbnQgcGFydGlhbCwgZG9uZTsKLQljb25zdCB1OCAqc3JjOwotCi0JcGFydGlhbCA9IHNjdHgtPmNvdW50ICYgMHgzZjsKLQlzY3R4LT5jb3VudCArPSBsZW47Ci0JZG9uZSA9IDA7Ci0Jc3JjID0gZGF0YTsKLQotCWlmICgocGFydGlhbCArIGxlbikgPiA2MykgewotCQlpZiAocGFydGlhbCkgewotCQkJZG9uZSA9IC1wYXJ0aWFsOwotCQkJbWVtY3B5KHNjdHgtPmJ1ZiArIHBhcnRpYWwsIGRhdGEsIGRvbmUgKyA2NCk7Ci0JCQlzcmMgPSBzY3R4LT5idWY7Ci0JCX0KLQotCQlkbyB7Ci0JCQlzaGEyNTZfdHJhbnNmb3JtKHNjdHgtPnN0YXRlLCBzcmMpOwotCQkJZG9uZSArPSA2NDsKLQkJCXNyYyA9IGRhdGEgKyBkb25lOwotCQl9IHdoaWxlIChkb25lICsgNjMgPCBsZW4pOwotCi0JCXBhcnRpYWwgPSAwOwotCX0KLQltZW1jcHkoc2N0eC0+YnVmICsgcGFydGlhbCwgc3JjLCBsZW4gLSBkb25lKTsKLQotCXJldHVybiAwOworCXJldHVybiBzaGEyNTZfYmFzZV9kb191cGRhdGUoZGVzYywgZGF0YSwgbGVuLCBzaGEyNTZfZ2VuZXJpY19ibG9ja19mbik7CiB9CiBFWFBPUlRfU1lNQk9MKGNyeXB0b19zaGEyNTZfdXBkYXRlKTsKIAogc3RhdGljIGludCBzaGEyNTZfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCiB7Ci0Jc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCV9fYmUzMiAqZHN0ID0gKF9fYmUzMiAqKW91dDsKLQlfX2JlNjQgYml0czsKLQl1bnNpZ25lZCBpbnQgaW5kZXgsIHBhZF9sZW47Ci0JaW50IGk7Ci0Jc3RhdGljIGNvbnN0IHU4IHBhZGRpbmdbNjRdID0geyAweDgwLCB9OwotCi0JLyogU2F2ZSBudW1iZXIgb2YgYml0cyAqLwotCWJpdHMgPSBjcHVfdG9fYmU2NChzY3R4LT5jb3VudCA8PCAzKTsKLQotCS8qIFBhZCBvdXQgdG8gNTYgbW9kIDY0LiAqLwotCWluZGV4ID0gc2N0eC0+Y291bnQgJiAweDNmOwotCXBhZF9sZW4gPSAoaW5kZXggPCA1NikgPyAoNTYgLSBpbmRleCkgOiAoKDY0KzU2KSAtIGluZGV4KTsKLQljcnlwdG9fc2hhMjU2X3VwZGF0ZShkZXNjLCBwYWRkaW5nLCBwYWRfbGVuKTsKLQotCS8qIEFwcGVuZCBsZW5ndGggKGJlZm9yZSBwYWRkaW5nKSAqLwotCWNyeXB0b19zaGEyNTZfdXBkYXRlKGRlc2MsIChjb25zdCB1OCAqKSZiaXRzLCBzaXplb2YoYml0cykpOwotCi0JLyogU3RvcmUgc3RhdGUgaW4gZGlnZXN0ICovCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJZHN0W2ldID0gY3B1X3RvX2JlMzIoc2N0eC0+c3RhdGVbaV0pOwotCi0JLyogWmVyb2l6ZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uICovCi0JbWVtc2V0KHNjdHgsIDAsIHNpemVvZigqc2N0eCkpOwotCi0JcmV0dXJuIDA7CisJc2hhMjU2X2Jhc2VfZG9fZmluYWxpemUoZGVzYywgc2hhMjU2X2dlbmVyaWNfYmxvY2tfZm4pOworCXJldHVybiBzaGEyNTZfYmFzZV9maW5pc2goZGVzYywgb3V0KTsKIH0KIAotc3RhdGljIGludCBzaGEyMjRfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpoYXNoKQoraW50IGNyeXB0b19zaGEyNTZfZmludXAoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAorCQkJdW5zaWduZWQgaW50IGxlbiwgdTggKmhhc2gpCiB7Ci0JdTggRFtTSEEyNTZfRElHRVNUX1NJWkVdOwotCi0Jc2hhMjU2X2ZpbmFsKGRlc2MsIEQpOwotCi0JbWVtY3B5KGhhc2gsIEQsIFNIQTIyNF9ESUdFU1RfU0laRSk7Ci0JbWVtemVyb19leHBsaWNpdChELCBTSEEyNTZfRElHRVNUX1NJWkUpOwotCi0JcmV0dXJuIDA7CisJc2hhMjU2X2Jhc2VfZG9fdXBkYXRlKGRlc2MsIGRhdGEsIGxlbiwgc2hhMjU2X2dlbmVyaWNfYmxvY2tfZm4pOworCXJldHVybiBzaGEyNTZfZmluYWwoZGVzYywgaGFzaCk7CiB9Ci0KLXN0YXRpYyBpbnQgc2hhMjU2X2V4cG9ydChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdm9pZCAqb3V0KQotewotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQotCW1lbWNweShvdXQsIHNjdHgsIHNpemVvZigqc2N0eCkpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNoYTI1Nl9pbXBvcnQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHZvaWQgKmluKQotewotCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQotCW1lbWNweShzY3R4LCBpbiwgc2l6ZW9mKCpzY3R4KSk7Ci0JcmV0dXJuIDA7Ci19CitFWFBPUlRfU1lNQk9MKGNyeXB0b19zaGEyNTZfZmludXApOwogCiBzdGF0aWMgc3RydWN0IHNoYXNoX2FsZyBzaGEyNTZfYWxnc1syXSA9IHsgewogCS5kaWdlc3RzaXplCT0JU0hBMjU2X0RJR0VTVF9TSVpFLAotCS5pbml0CQk9CXNoYTI1Nl9pbml0LAorCS5pbml0CQk9CXNoYTI1Nl9iYXNlX2luaXQsCiAJLnVwZGF0ZQkJPQljcnlwdG9fc2hhMjU2X3VwZGF0ZSwKIAkuZmluYWwJCT0Jc2hhMjU2X2ZpbmFsLAotCS5leHBvcnQJCT0Jc2hhMjU2X2V4cG9ydCwKLQkuaW1wb3J0CQk9CXNoYTI1Nl9pbXBvcnQsCisJLmZpbnVwCQk9CWNyeXB0b19zaGEyNTZfZmludXAsCiAJLmRlc2NzaXplCT0Jc2l6ZW9mKHN0cnVjdCBzaGEyNTZfc3RhdGUpLAotCS5zdGF0ZXNpemUJPQlzaXplb2Yoc3RydWN0IHNoYTI1Nl9zdGF0ZSksCiAJLmJhc2UJCT0JewogCQkuY3JhX25hbWUJPQkic2hhMjU2IiwKIAkJLmNyYV9kcml2ZXJfbmFtZT0JInNoYTI1Ni1nZW5lcmljIiwKQEAgLTM1NSw5ICsyNjEsMTAgQEAKIAl9CiB9LCB7CiAJLmRpZ2VzdHNpemUJPQlTSEEyMjRfRElHRVNUX1NJWkUsCi0JLmluaXQJCT0Jc2hhMjI0X2luaXQsCisJLmluaXQJCT0Jc2hhMjI0X2Jhc2VfaW5pdCwKIAkudXBkYXRlCQk9CWNyeXB0b19zaGEyNTZfdXBkYXRlLAotCS5maW5hbAkJPQlzaGEyMjRfZmluYWwsCisJLmZpbmFsCQk9CXNoYTI1Nl9maW5hbCwKKwkuZmludXAJCT0JY3J5cHRvX3NoYTI1Nl9maW51cCwKIAkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTI1Nl9zdGF0ZSksCiAJLmJhc2UJCT0JewogCQkuY3JhX25hbWUJPQkic2hhMjI0IiwKZGlmZiAtLWdpdCBhL2NyeXB0by9zaGE1MTJfZ2VuZXJpYy5jIGIvY3J5cHRvL3NoYTUxMl9nZW5lcmljLmMKaW5kZXggMWMzYzM3Ni4uZWJhOTY1ZCAxMDA2NDQKLS0tIGEvY3J5cHRvL3NoYTUxMl9nZW5lcmljLmMKKysrIGIvY3J5cHRvL3NoYTUxMl9nZW5lcmljLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhNTEyX2Jhc2UuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgpAQCAtMTMwLDEyNSArMTMxLDQyIEBACiAJYSA9IGIgPSBjID0gZCA9IGUgPSBmID0gZyA9IGggPSB0MSA9IHQyID0gMDsKIH0KIAotc3RhdGljIGludAotc2hhNTEyX2luaXQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCitzdGF0aWMgdm9pZCBzaGE1MTJfZ2VuZXJpY19ibG9ja19mbihzdHJ1Y3Qgc2hhNTEyX3N0YXRlICpzc3QsIHU4IGNvbnN0ICpzcmMsCisJCQkJICAgIGludCBibG9ja3MpCiB7Ci0Jc3RydWN0IHNoYTUxMl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOwotCXNjdHgtPnN0YXRlWzBdID0gU0hBNTEyX0gwOwotCXNjdHgtPnN0YXRlWzFdID0gU0hBNTEyX0gxOwotCXNjdHgtPnN0YXRlWzJdID0gU0hBNTEyX0gyOwotCXNjdHgtPnN0YXRlWzNdID0gU0hBNTEyX0gzOwotCXNjdHgtPnN0YXRlWzRdID0gU0hBNTEyX0g0OwotCXNjdHgtPnN0YXRlWzVdID0gU0hBNTEyX0g1OwotCXNjdHgtPnN0YXRlWzZdID0gU0hBNTEyX0g2OwotCXNjdHgtPnN0YXRlWzddID0gU0hBNTEyX0g3OwotCXNjdHgtPmNvdW50WzBdID0gc2N0eC0+Y291bnRbMV0gPSAwOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXNoYTM4NF9pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQotewotCXN0cnVjdCBzaGE1MTJfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQlzY3R4LT5zdGF0ZVswXSA9IFNIQTM4NF9IMDsKLQlzY3R4LT5zdGF0ZVsxXSA9IFNIQTM4NF9IMTsKLQlzY3R4LT5zdGF0ZVsyXSA9IFNIQTM4NF9IMjsKLQlzY3R4LT5zdGF0ZVszXSA9IFNIQTM4NF9IMzsKLQlzY3R4LT5zdGF0ZVs0XSA9IFNIQTM4NF9INDsKLQlzY3R4LT5zdGF0ZVs1XSA9IFNIQTM4NF9INTsKLQlzY3R4LT5zdGF0ZVs2XSA9IFNIQTM4NF9INjsKLQlzY3R4LT5zdGF0ZVs3XSA9IFNIQTM4NF9INzsKLQlzY3R4LT5jb3VudFswXSA9IHNjdHgtPmNvdW50WzFdID0gMDsKLQotCXJldHVybiAwOworCXdoaWxlIChibG9ja3MtLSkgeworCQlzaGE1MTJfdHJhbnNmb3JtKHNzdC0+c3RhdGUsIHNyYyk7CisJCXNyYyArPSBTSEE1MTJfQkxPQ0tfU0laRTsKKwl9CiB9CiAKIGludCBjcnlwdG9fc2hhNTEyX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCiAJCQl1bnNpZ25lZCBpbnQgbGVuKQogewotCXN0cnVjdCBzaGE1MTJfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKLQotCXVuc2lnbmVkIGludCBpLCBpbmRleCwgcGFydF9sZW47Ci0KLQkvKiBDb21wdXRlIG51bWJlciBvZiBieXRlcyBtb2QgMTI4ICovCi0JaW5kZXggPSBzY3R4LT5jb3VudFswXSAmIDB4N2Y7Ci0KLQkvKiBVcGRhdGUgbnVtYmVyIG9mIGJ5dGVzICovCi0JaWYgKChzY3R4LT5jb3VudFswXSArPSBsZW4pIDwgbGVuKQotCQlzY3R4LT5jb3VudFsxXSsrOwotCi0gICAgICAgIHBhcnRfbGVuID0gMTI4IC0gaW5kZXg7Ci0KLQkvKiBUcmFuc2Zvcm0gYXMgbWFueSB0aW1lcyBhcyBwb3NzaWJsZS4gKi8KLQlpZiAobGVuID49IHBhcnRfbGVuKSB7Ci0JCW1lbWNweSgmc2N0eC0+YnVmW2luZGV4XSwgZGF0YSwgcGFydF9sZW4pOwotCQlzaGE1MTJfdHJhbnNmb3JtKHNjdHgtPnN0YXRlLCBzY3R4LT5idWYpOwotCi0JCWZvciAoaSA9IHBhcnRfbGVuOyBpICsgMTI3IDwgbGVuOyBpKz0xMjgpCi0JCQlzaGE1MTJfdHJhbnNmb3JtKHNjdHgtPnN0YXRlLCAmZGF0YVtpXSk7Ci0KLQkJaW5kZXggPSAwOwotCX0gZWxzZSB7Ci0JCWkgPSAwOwotCX0KLQotCS8qIEJ1ZmZlciByZW1haW5pbmcgaW5wdXQgKi8KLQltZW1jcHkoJnNjdHgtPmJ1ZltpbmRleF0sICZkYXRhW2ldLCBsZW4gLSBpKTsKLQotCXJldHVybiAwOworCXJldHVybiBzaGE1MTJfYmFzZV9kb191cGRhdGUoZGVzYywgZGF0YSwgbGVuLCBzaGE1MTJfZ2VuZXJpY19ibG9ja19mbik7CiB9CiBFWFBPUlRfU1lNQk9MKGNyeXB0b19zaGE1MTJfdXBkYXRlKTsKIAotc3RhdGljIGludAotc2hhNTEyX2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB1OCAqaGFzaCkKK3N0YXRpYyBpbnQgc2hhNTEyX2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB1OCAqaGFzaCkKIHsKLQlzdHJ1Y3Qgc2hhNTEyX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7Ci0gICAgICAgIHN0YXRpYyB1OCBwYWRkaW5nWzEyOF0gPSB7IDB4ODAsIH07Ci0JX19iZTY0ICpkc3QgPSAoX19iZTY0ICopaGFzaDsKLQlfX2JlNjQgYml0c1syXTsKLQl1bnNpZ25lZCBpbnQgaW5kZXgsIHBhZF9sZW47Ci0JaW50IGk7Ci0KLQkvKiBTYXZlIG51bWJlciBvZiBiaXRzICovCi0JYml0c1sxXSA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50WzBdIDw8IDMpOwotCWJpdHNbMF0gPSBjcHVfdG9fYmU2NChzY3R4LT5jb3VudFsxXSA8PCAzIHwgc2N0eC0+Y291bnRbMF0gPj4gNjEpOwotCi0JLyogUGFkIG91dCB0byAxMTIgbW9kIDEyOC4gKi8KLQlpbmRleCA9IHNjdHgtPmNvdW50WzBdICYgMHg3ZjsKLQlwYWRfbGVuID0gKGluZGV4IDwgMTEyKSA/ICgxMTIgLSBpbmRleCkgOiAoKDEyOCsxMTIpIC0gaW5kZXgpOwotCWNyeXB0b19zaGE1MTJfdXBkYXRlKGRlc2MsIHBhZGRpbmcsIHBhZF9sZW4pOwotCi0JLyogQXBwZW5kIGxlbmd0aCAoYmVmb3JlIHBhZGRpbmcpICovCi0JY3J5cHRvX3NoYTUxMl91cGRhdGUoZGVzYywgKGNvbnN0IHU4ICopYml0cywgc2l6ZW9mKGJpdHMpKTsKLQotCS8qIFN0b3JlIHN0YXRlIGluIGRpZ2VzdCAqLwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCWRzdFtpXSA9IGNwdV90b19iZTY0KHNjdHgtPnN0YXRlW2ldKTsKLQotCS8qIFplcm9pemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAqLwotCW1lbXNldChzY3R4LCAwLCBzaXplb2Yoc3RydWN0IHNoYTUxMl9zdGF0ZSkpOwotCi0JcmV0dXJuIDA7CisJc2hhNTEyX2Jhc2VfZG9fZmluYWxpemUoZGVzYywgc2hhNTEyX2dlbmVyaWNfYmxvY2tfZm4pOworCXJldHVybiBzaGE1MTJfYmFzZV9maW5pc2goZGVzYywgaGFzaCk7CiB9CiAKLXN0YXRpYyBpbnQgc2hhMzg0X2ZpbmFsKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCB1OCAqaGFzaCkKK2ludCBjcnlwdG9fc2hhNTEyX2ZpbnVwKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCXVuc2lnbmVkIGludCBsZW4sIHU4ICpoYXNoKQogewotCXU4IERbNjRdOwotCi0Jc2hhNTEyX2ZpbmFsKGRlc2MsIEQpOwotCi0JbWVtY3B5KGhhc2gsIEQsIDQ4KTsKLQltZW16ZXJvX2V4cGxpY2l0KEQsIDY0KTsKLQotCXJldHVybiAwOworCXNoYTUxMl9iYXNlX2RvX3VwZGF0ZShkZXNjLCBkYXRhLCBsZW4sIHNoYTUxMl9nZW5lcmljX2Jsb2NrX2ZuKTsKKwlyZXR1cm4gc2hhNTEyX2ZpbmFsKGRlc2MsIGhhc2gpOwogfQorRVhQT1JUX1NZTUJPTChjcnlwdG9fc2hhNTEyX2ZpbnVwKTsKIAogc3RhdGljIHN0cnVjdCBzaGFzaF9hbGcgc2hhNTEyX2FsZ3NbMl0gPSB7IHsKIAkuZGlnZXN0c2l6ZQk9CVNIQTUxMl9ESUdFU1RfU0laRSwKLQkuaW5pdAkJPQlzaGE1MTJfaW5pdCwKKwkuaW5pdAkJPQlzaGE1MTJfYmFzZV9pbml0LAogCS51cGRhdGUJCT0JY3J5cHRvX3NoYTUxMl91cGRhdGUsCiAJLmZpbmFsCQk9CXNoYTUxMl9maW5hbCwKKwkuZmludXAJCT0JY3J5cHRvX3NoYTUxMl9maW51cCwKIAkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTUxMl9zdGF0ZSksCiAJLmJhc2UJCT0JewogCQkuY3JhX25hbWUJPQkic2hhNTEyIiwKQEAgLTI1OSw5ICsxNzcsMTAgQEAKIAl9CiB9LCB7CiAJLmRpZ2VzdHNpemUJPQlTSEEzODRfRElHRVNUX1NJWkUsCi0JLmluaXQJCT0Jc2hhMzg0X2luaXQsCisJLmluaXQJCT0Jc2hhMzg0X2Jhc2VfaW5pdCwKIAkudXBkYXRlCQk9CWNyeXB0b19zaGE1MTJfdXBkYXRlLAotCS5maW5hbAkJPQlzaGEzODRfZmluYWwsCisJLmZpbmFsCQk9CXNoYTUxMl9maW5hbCwKKwkuZmludXAJCT0JY3J5cHRvX3NoYTUxMl9maW51cCwKIAkuZGVzY3NpemUJPQlzaXplb2Yoc3RydWN0IHNoYTUxMl9zdGF0ZSksCiAJLmJhc2UJCT0JewogCQkuY3JhX25hbWUJPQkic2hhMzg0IiwKZGlmZiAtLWdpdCBhL2NyeXB0by90Y3J5cHQuYyBiL2NyeXB0by90Y3J5cHQuYwppbmRleCA0YjllMjNmLi4xYTI4MDAxIDEwMDY0NAotLS0gYS9jcnlwdG8vdGNyeXB0LmMKKysrIGIvY3J5cHRvL3RjcnlwdC5jCkBAIC0xMTU1LDkgKzExNTUsOSBAQAogCQkJCWdvdG8gb3V0X2ZyZWVfcmVxOwogCQkJfQogCi0JCQlzZ19pbml0X3RhYmxlKHNnLCBUVk1FTVNJWkUpOwotCiAJCQlrID0gKmtleXNpemUgKyAqYl9zaXplOworCQkJc2dfaW5pdF90YWJsZShzZywgRElWX1JPVU5EX1VQKGssIFBBR0VfU0laRSkpOworCiAJCQlpZiAoayA+IFBBR0VfU0laRSkgewogCQkJCXNnX3NldF9idWYoc2csIHR2bWVtWzBdICsgKmtleXNpemUsCiAJCQkJICAgUEFHRV9TSVpFIC0gKmtleXNpemUpOwpkaWZmIC0tZ2l0IGEvY3J5cHRvL3Rlc3RtZ3IuYyBiL2NyeXB0by90ZXN0bWdyLmMKaW5kZXggZjRlZDZkNC4uZjliY2UzZCAxMDA2NDQKLS0tIGEvY3J5cHRvL3Rlc3RtZ3IuYworKysgYi9jcnlwdG8vdGVzdG1nci5jCkBAIC0xNDc0LDExICsxNDc0LDExIEBACiAJCWZvciAoaiA9IDA7IGogPCB0ZW1wbGF0ZVtpXS5sb29wczsgaisrKSB7CiAJCQllcnIgPSBjcnlwdG9fcm5nX2dldF9ieXRlcyh0Zm0sIHJlc3VsdCwKIAkJCQkJCSAgIHRlbXBsYXRlW2ldLnJsZW4pOwotCQkJaWYgKGVyciAhPSB0ZW1wbGF0ZVtpXS5ybGVuKSB7CisJCQlpZiAoZXJyIDwgMCkgewogCQkJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBjcHJuZzogRmFpbGVkIHRvIG9idGFpbiAiCiAJCQkJICAgICAgICJ0aGUgY29ycmVjdCBhbW91bnQgb2YgcmFuZG9tIGRhdGEgZm9yICIKLQkJCQkgICAgICAgIiVzIChyZXF1ZXN0ZWQgJWQsIGdvdCAlZClcbiIsIGFsZ28sCi0JCQkJICAgICAgIHRlbXBsYXRlW2ldLnJsZW4sIGVycik7CisJCQkJICAgICAgICIlcyAocmVxdWVzdGVkICVkKVxuIiwgYWxnbywKKwkJCQkgICAgICAgdGVtcGxhdGVbaV0ucmxlbik7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0KQEAgLTE1MDUsNyArMTUwNSw3IEBACiAJc3RydWN0IGNyeXB0b19hZWFkICp0Zm07CiAJaW50IGVyciA9IDA7CiAKLQl0Zm0gPSBjcnlwdG9fYWxsb2NfYWVhZChkcml2ZXIsIHR5cGUsIG1hc2spOworCXRmbSA9IGNyeXB0b19hbGxvY19hZWFkKGRyaXZlciwgdHlwZSB8IENSWVBUT19BTEdfSU5URVJOQUwsIG1hc2spOwogCWlmIChJU19FUlIodGZtKSkgewogCQlwcmludGsoS0VSTl9FUlIgImFsZzogYWVhZDogRmFpbGVkIHRvIGxvYWQgdHJhbnNmb3JtIGZvciAlczogIgogCQkgICAgICAgIiVsZFxuIiwgZHJpdmVyLCBQVFJfRVJSKHRmbSkpOwpAQCAtMTUzNCw3ICsxNTM0LDcgQEAKIAlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtOwogCWludCBlcnIgPSAwOwogCi0JdGZtID0gY3J5cHRvX2FsbG9jX2NpcGhlcihkcml2ZXIsIHR5cGUsIG1hc2spOworCXRmbSA9IGNyeXB0b19hbGxvY19jaXBoZXIoZHJpdmVyLCB0eXBlIHwgQ1JZUFRPX0FMR19JTlRFUk5BTCwgbWFzayk7CiAJaWYgKElTX0VSUih0Zm0pKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBjaXBoZXI6IEZhaWxlZCB0byBsb2FkIHRyYW5zZm9ybSBmb3IgIgogCQkgICAgICAgIiVzOiAlbGRcbiIsIGRyaXZlciwgUFRSX0VSUih0Zm0pKTsKQEAgLTE1NjMsNyArMTU2Myw3IEBACiAJc3RydWN0IGNyeXB0b19hYmxrY2lwaGVyICp0Zm07CiAJaW50IGVyciA9IDA7CiAKLQl0Zm0gPSBjcnlwdG9fYWxsb2NfYWJsa2NpcGhlcihkcml2ZXIsIHR5cGUsIG1hc2spOworCXRmbSA9IGNyeXB0b19hbGxvY19hYmxrY2lwaGVyKGRyaXZlciwgdHlwZSB8IENSWVBUT19BTEdfSU5URVJOQUwsIG1hc2spOwogCWlmIChJU19FUlIodGZtKSkgewogCQlwcmludGsoS0VSTl9FUlIgImFsZzogc2tjaXBoZXI6IEZhaWxlZCB0byBsb2FkIHRyYW5zZm9ybSBmb3IgIgogCQkgICAgICAgIiVzOiAlbGRcbiIsIGRyaXZlciwgUFRSX0VSUih0Zm0pKTsKQEAgLTE2MzYsNyArMTYzNiw3IEBACiAJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtOwogCWludCBlcnI7CiAKLQl0Zm0gPSBjcnlwdG9fYWxsb2NfYWhhc2goZHJpdmVyLCB0eXBlLCBtYXNrKTsKKwl0Zm0gPSBjcnlwdG9fYWxsb2NfYWhhc2goZHJpdmVyLCB0eXBlIHwgQ1JZUFRPX0FMR19JTlRFUk5BTCwgbWFzayk7CiAJaWYgKElTX0VSUih0Zm0pKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBoYXNoOiBGYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yICVzOiAiCiAJCSAgICAgICAiJWxkXG4iLCBkcml2ZXIsIFBUUl9FUlIodGZtKSk7CkBAIC0xNjY0LDcgKzE2NjQsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JdGZtID0gY3J5cHRvX2FsbG9jX3NoYXNoKGRyaXZlciwgdHlwZSwgbWFzayk7CisJdGZtID0gY3J5cHRvX2FsbG9jX3NoYXNoKGRyaXZlciwgdHlwZSB8IENSWVBUT19BTEdfSU5URVJOQUwsIG1hc2spOwogCWlmIChJU19FUlIodGZtKSkgewogCQlwcmludGsoS0VSTl9FUlIgImFsZzogY3JjMzJjOiBGYWlsZWQgdG8gbG9hZCB0cmFuc2Zvcm0gZm9yICVzOiAiCiAJCSAgICAgICAiJWxkXG4iLCBkcml2ZXIsIFBUUl9FUlIodGZtKSk7CkBAIC0xNzA2LDcgKzE3MDYsNyBAQAogCXN0cnVjdCBjcnlwdG9fcm5nICpybmc7CiAJaW50IGVycjsKIAotCXJuZyA9IGNyeXB0b19hbGxvY19ybmcoZHJpdmVyLCB0eXBlLCBtYXNrKTsKKwlybmcgPSBjcnlwdG9fYWxsb2Nfcm5nKGRyaXZlciwgdHlwZSB8IENSWVBUT19BTEdfSU5URVJOQUwsIG1hc2spOwogCWlmIChJU19FUlIocm5nKSkgewogCQlwcmludGsoS0VSTl9FUlIgImFsZzogY3Bybmc6IEZhaWxlZCB0byBsb2FkIHRyYW5zZm9ybSBmb3IgJXM6ICIKIAkJICAgICAgICIlbGRcbiIsIGRyaXZlciwgUFRSX0VSUihybmcpKTsKQEAgLTE3MzMsNyArMTczMyw3IEBACiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZHJuZyA9IGNyeXB0b19hbGxvY19ybmcoZHJpdmVyLCB0eXBlLCBtYXNrKTsKKwlkcm5nID0gY3J5cHRvX2FsbG9jX3JuZyhkcml2ZXIsIHR5cGUgfCBDUllQVE9fQUxHX0lOVEVSTkFMLCBtYXNrKTsKIAlpZiAoSVNfRVJSKGRybmcpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiYWxnOiBkcmJnOiBjb3VsZCBub3QgYWxsb2NhdGUgRFJORyBoYW5kbGUgZm9yICIKIAkJICAgICAgICIlc1xuIiwgZHJpdmVyKTsKQEAgLTE3NTksNyArMTc1OSw3IEBACiAJCXJldCA9IGNyeXB0b19kcmJnX2dldF9ieXRlc19hZGR0bChkcm5nLAogCQkJYnVmLCB0ZXN0LT5leHBlY3RlZGxlbiwgJmFkZHRsKTsKIAl9Ci0JaWYgKHJldCA8PSAwKSB7CisJaWYgKHJldCA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJhbGc6IGRyYmc6IGNvdWxkIG5vdCBvYnRhaW4gcmFuZG9tIGRhdGEgZm9yICIKIAkJICAgICAgICJkcml2ZXIgJXNcbiIsIGRyaXZlcik7CiAJCWdvdG8gb3V0YnVmOwpAQCAtMTc3NCw3ICsxNzc0LDcgQEAKIAkJcmV0ID0gY3J5cHRvX2RyYmdfZ2V0X2J5dGVzX2FkZHRsKGRybmcsCiAJCQlidWYsIHRlc3QtPmV4cGVjdGVkbGVuLCAmYWRkdGwpOwogCX0KLQlpZiAocmV0IDw9IDApIHsKKwlpZiAocmV0IDwgMCkgewogCQlwcmludGsoS0VSTl9FUlIgImFsZzogZHJiZzogY291bGQgbm90IG9idGFpbiByYW5kb20gZGF0YSBmb3IgIgogCQkgICAgICAgImRyaXZlciAlc1xuIiwgZHJpdmVyKTsKIAkJZ290byBvdXRidWY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWMuYyBiL2RyaXZlcnMvYWNwaS9hYy5jCmluZGV4IDM2YjBlNjEuLmJiY2MyYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hYy5jCkBAIC05NSwxMyArOTUsMTQgQEAKIH07CiAKIHN0cnVjdCBhY3BpX2FjIHsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGNoYXJnZXI7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqY2hhcmdlcjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgY2hhcmdlcl9kZXNjOwogCXN0cnVjdCBhY3BpX2RldmljZSAqIGRldmljZTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgc3RhdGU7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGJhdHRlcnlfbmI7CiB9OwogCi0jZGVmaW5lIHRvX2FjcGlfYWMoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBhY3BpX2FjLCBjaGFyZ2VyKQorI2RlZmluZSB0b19hY3BpX2FjKHgpIHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YSh4KQogCiAjaWZkZWYgQ09ORklHX0FDUElfUFJPQ0ZTX1BPV0VSCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhY3BpX2FjX2ZvcHMgPSB7CkBAIC0yNzUsNyArMjc2LDcgQEAKIAkJCQkJCSAgZGV2X25hbWUoJmRldmljZS0+ZGV2KSwgZXZlbnQsCiAJCQkJCQkgICh1MzIpIGFjLT5zdGF0ZSk7CiAJCWFjcGlfbm90aWZpZXJfY2FsbF9jaGFpbihkZXZpY2UsIGV2ZW50LCAodTMyKSBhYy0+c3RhdGUpOwotCQlrb2JqZWN0X3VldmVudCgmYWMtPmNoYXJnZXIuZGV2LT5rb2JqLCBLT0JKX0NIQU5HRSk7CisJCWtvYmplY3RfdWV2ZW50KCZhYy0+Y2hhcmdlci0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFKTsKIAl9CiAKIAlyZXR1cm47CkBAIC0zMjEsNiArMzIyLDcgQEAKIAogc3RhdGljIGludCBhY3BpX2FjX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfYWMgKmFjID0gTlVMTDsKIApAQCAtMzQxLDE5ICszNDMsMjQgQEAKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKIAotCWFjLT5jaGFyZ2VyLm5hbWUgPSBhY3BpX2RldmljZV9iaWQoZGV2aWNlKTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gYWM7CisKKwlhYy0+Y2hhcmdlcl9kZXNjLm5hbWUgPSBhY3BpX2RldmljZV9iaWQoZGV2aWNlKTsKICNpZmRlZiBDT05GSUdfQUNQSV9QUk9DRlNfUE9XRVIKIAlyZXN1bHQgPSBhY3BpX2FjX2FkZF9mcyhhYyk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBlbmQ7CiAjZW5kaWYKLQlhYy0+Y2hhcmdlci50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7Ci0JYWMtPmNoYXJnZXIucHJvcGVydGllcyA9IGFjX3Byb3BzOwotCWFjLT5jaGFyZ2VyLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShhY19wcm9wcyk7Ci0JYWMtPmNoYXJnZXIuZ2V0X3Byb3BlcnR5ID0gZ2V0X2FjX3Byb3BlcnR5OwotCXJlc3VsdCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmYWMtPmRldmljZS0+ZGV2LCAmYWMtPmNoYXJnZXIpOwotCWlmIChyZXN1bHQpCisJYWMtPmNoYXJnZXJfZGVzYy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7CisJYWMtPmNoYXJnZXJfZGVzYy5wcm9wZXJ0aWVzID0gYWNfcHJvcHM7CisJYWMtPmNoYXJnZXJfZGVzYy5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoYWNfcHJvcHMpOworCWFjLT5jaGFyZ2VyX2Rlc2MuZ2V0X3Byb3BlcnR5ID0gZ2V0X2FjX3Byb3BlcnR5OworCWFjLT5jaGFyZ2VyID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZhYy0+ZGV2aWNlLT5kZXYsCisJCQkJCSAgICAmYWMtPmNoYXJnZXJfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoYWMtPmNoYXJnZXIpKSB7CisJCXJlc3VsdCA9IFBUUl9FUlIoYWMtPmNoYXJnZXIpOwogCQlnb3RvIGVuZDsKKwl9CiAKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXSAoJXMpXG4iLAogCSAgICAgICBhY3BpX2RldmljZV9uYW1lKGRldmljZSksIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLApAQCAtMzkwLDcgKzM5Nyw3IEBACiAJaWYgKGFjcGlfYWNfZ2V0X3N0YXRlKGFjKSkKIAkJcmV0dXJuIDA7CiAJaWYgKG9sZF9zdGF0ZSAhPSBhYy0+c3RhdGUpCi0JCWtvYmplY3RfdWV2ZW50KCZhYy0+Y2hhcmdlci5kZXYtPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwkJa29iamVjdF91ZXZlbnQoJmFjLT5jaGFyZ2VyLT5kZXYua29iaiwgS09CSl9DSEFOR0UpOwogCXJldHVybiAwOwogfQogI2Vsc2UKQEAgLTQwNyw4ICs0MTQsNyBAQAogCiAJYWMgPSBhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CiAKLQlpZiAoYWMtPmNoYXJnZXIuZGV2KQotCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmYWMtPmNoYXJnZXIpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGFjLT5jaGFyZ2VyKTsKIAl1bnJlZ2lzdGVyX2FjcGlfbm90aWZpZXIoJmFjLT5iYXR0ZXJ5X25iKTsKIAogI2lmZGVmIENPTkZJR19BQ1BJX1BST0NGU19QT1dFUgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGlfcGFkLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9wYWQuYwppbmRleCBjN2IxMDVjLi42YmM5Y2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaV9wYWQuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaV9wYWQuYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGFzbS9td2FpdC5oPgpAQCAtNDEsOCArNDEsNiBAQAogCiBzdGF0aWMgdW5zaWduZWQgY2hhciB0c2NfZGV0ZWN0ZWRfdW5zdGFibGU7CiBzdGF0aWMgdW5zaWduZWQgY2hhciB0c2NfbWFya2VkX3Vuc3RhYmxlOwotc3RhdGljIHVuc2lnbmVkIGNoYXIgbGFwaWNfZGV0ZWN0ZWRfdW5zdGFibGU7Ci1zdGF0aWMgdW5zaWduZWQgY2hhciBsYXBpY19tYXJrZWRfdW5zdGFibGU7CiAKIHN0YXRpYyB2b2lkIHBvd2VyX3NhdmluZ19td2FpdF9pbml0KHZvaWQpCiB7CkBAIC04MiwxMyArODAsMTAgQEAKIAkJICovCiAJCWlmICghYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX05PTlNUT1BfVFNDKSkKIAkJCXRzY19kZXRlY3RlZF91bnN0YWJsZSA9IDE7Ci0JCWlmICghYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FSQVQpKQotCQkJbGFwaWNfZGV0ZWN0ZWRfdW5zdGFibGUgPSAxOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQkvKiBUU0MgJiBMQVBJQyBjb3VsZCBoYWx0IGluIGlkbGUgKi8KKwkJLyogVFNDIGNvdWxkIGhhbHQgaW4gaWRsZSAqLwogCQl0c2NfZGV0ZWN0ZWRfdW5zdGFibGUgPSAxOwotCQlsYXBpY19kZXRlY3RlZF91bnN0YWJsZSA9IDE7CiAJfQogI2VuZGlmCiB9CkBAIC0xNTUsNyArMTUwLDYgQEAKIAlzY2hlZF9zZXRzY2hlZHVsZXIoY3VycmVudCwgU0NIRURfUlIsICZwYXJhbSk7CiAKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlpbnQgY3B1OwogCQl1bnNpZ25lZCBsb25nIGV4cGlyZV90aW1lOwogCiAJCXRyeV90b19mcmVlemUoKTsKQEAgLTE3NywyOCArMTcxLDE1IEBACiAJCQkJbWFya190c2NfdW5zdGFibGUoIlRTQyBoYWx0cyBpbiBpZGxlIik7CiAJCQkJdHNjX21hcmtlZF91bnN0YWJsZSA9IDE7CiAJCQl9Ci0JCQlpZiAobGFwaWNfZGV0ZWN0ZWRfdW5zdGFibGUgJiYgIWxhcGljX21hcmtlZF91bnN0YWJsZSkgewotCQkJCWludCBpOwotCQkJCS8qIExBUElDIGNvdWxkIGhhbHQgaW4gaWRsZSwgc28gbm90aWZ5IHVzZXJzICovCi0JCQkJZm9yX2VhY2hfb25saW5lX2NwdShpKQotCQkJCQljbG9ja2V2ZW50c19ub3RpZnkoCi0JCQkJCQlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9PTiwKLQkJCQkJCSZpKTsKLQkJCQlsYXBpY19tYXJrZWRfdW5zdGFibGUgPSAxOwotCQkJfQogCQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQkJCWlmIChsYXBpY19tYXJrZWRfdW5zdGFibGUpCi0JCQkJY2xvY2tldmVudHNfbm90aWZ5KAotCQkJCQlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FTlRFUiwgJmNwdSk7CisJCQl0aWNrX2Jyb2FkY2FzdF9lbmFibGUoKTsKKwkJCXRpY2tfYnJvYWRjYXN0X2VudGVyKCk7CiAJCQlzdG9wX2NyaXRpY2FsX3RpbWluZ3MoKTsKIAogCQkJbXdhaXRfaWRsZV93aXRoX2hpbnRzKHBvd2VyX3NhdmluZ19td2FpdF9lYXgsIDEpOwogCiAJCQlzdGFydF9jcml0aWNhbF90aW1pbmdzKCk7Ci0JCQlpZiAobGFwaWNfbWFya2VkX3Vuc3RhYmxlKQotCQkJCWNsb2NrZXZlbnRzX25vdGlmeSgKLQkJCQkJQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRVhJVCwgJmNwdSk7CisJCQl0aWNrX2Jyb2FkY2FzdF9leGl0KCk7CiAJCQlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAkJCWlmICh0aW1lX2JlZm9yZShleHBpcmVfdGltZSwgamlmZmllcykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX3BsYXRmb3JtLmMgYi9kcml2ZXJzL2FjcGkvYWNwaV9wbGF0Zm9ybS5jCmluZGV4IDEyODQxMzguLjRiZjc1NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGlfcGxhdGZvcm0uYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJcGRldmluZm8uaWQgPSAtMTsKIAlwZGV2aW5mby5yZXMgPSByZXNvdXJjZXM7CiAJcGRldmluZm8ubnVtX3JlcyA9IGNvdW50OwotCXBkZXZpbmZvLmFjcGlfbm9kZS5jb21wYW5pb24gPSBhZGV2OworCXBkZXZpbmZvLmZ3bm9kZSA9IGFjcGlfZndub2RlX2hhbmRsZShhZGV2KTsKIAlwZGV2aW5mby5kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CiAJcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9mdWxsKCZwZGV2aW5mbyk7CiAJaWYgKElTX0VSUihwZGV2KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMgYi9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCmluZGV4IGQ5OGJhNDMuLjYzZDQzNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwpAQCAtMTE3LDcgKzExNyw4IEBACiBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5IHsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlzdHJ1Y3QgbXV0ZXggc3lzZnNfbG9jazsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXQ7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGJhdF9kZXNjOwogCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlOwogCXN0cnVjdCBub3RpZmllcl9ibG9jayBwbV9uYjsKIAl1bnNpZ25lZCBsb25nIHVwZGF0ZV90aW1lOwpAQCAtMTQ5LDcgKzE1MCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIH07CiAKLSNkZWZpbmUgdG9fYWNwaV9iYXR0ZXJ5KHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5LCBiYXQpCisjZGVmaW5lIHRvX2FjcGlfYmF0dGVyeSh4KSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEoeCkKIAogc3RhdGljIGlubGluZSBpbnQgYWNwaV9iYXR0ZXJ5X3ByZXNlbnQoc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSkKIHsKQEAgLTUzMCw4ICs1MzEsOCBAQAogCQliYXR0ZXJ5LT5yYXRlX25vdyAhPSBBQ1BJX0JBVFRFUllfVkFMVUVfVU5LTk9XTiAmJgogCQkoczE2KShiYXR0ZXJ5LT5yYXRlX25vdykgPCAwKSB7CiAJCWJhdHRlcnktPnJhdGVfbm93ID0gYWJzKChzMTYpYmF0dGVyeS0+cmF0ZV9ub3cpOwotCQlwcmludGtfb25jZShLRVJOX1dBUk5JTkcgRldfQlVHICJiYXR0ZXJ5OiAoZGlzKWNoYXJnZSByYXRlIgotCQkJIiBpbnZhbGlkLlxuIik7CisJCXByaW50a19vbmNlKEtFUk5fV0FSTklORyBGV19CVUcKKwkJCSAgICAiYmF0dGVyeTogKGRpcyljaGFyZ2UgcmF0ZSBpbnZhbGlkLlxuIik7CiAJfQogCiAJaWYgKHRlc3RfYml0KEFDUElfQkFUVEVSWV9RVUlSS19QRVJDRU5UQUdFX0NBUEFDSVRZLCAmYmF0dGVyeS0+ZmxhZ3MpCkBAIC02MDgsNDAgKzYwOSw0NSBAQAogCiBzdGF0aWMgaW50IHN5c2ZzX2FkZF9iYXR0ZXJ5KHN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkpCiB7Ci0JaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0geyAuZHJ2X2RhdGEgPSBiYXR0ZXJ5LCB9OwogCiAJaWYgKGJhdHRlcnktPnBvd2VyX3VuaXQgPT0gQUNQSV9CQVRURVJZX1BPV0VSX1VOSVRfTUEpIHsKLQkJYmF0dGVyeS0+YmF0LnByb3BlcnRpZXMgPSBjaGFyZ2VfYmF0dGVyeV9wcm9wczsKLQkJYmF0dGVyeS0+YmF0Lm51bV9wcm9wZXJ0aWVzID0KKwkJYmF0dGVyeS0+YmF0X2Rlc2MucHJvcGVydGllcyA9IGNoYXJnZV9iYXR0ZXJ5X3Byb3BzOworCQliYXR0ZXJ5LT5iYXRfZGVzYy5udW1fcHJvcGVydGllcyA9CiAJCQlBUlJBWV9TSVpFKGNoYXJnZV9iYXR0ZXJ5X3Byb3BzKTsKIAl9IGVsc2UgewotCQliYXR0ZXJ5LT5iYXQucHJvcGVydGllcyA9IGVuZXJneV9iYXR0ZXJ5X3Byb3BzOwotCQliYXR0ZXJ5LT5iYXQubnVtX3Byb3BlcnRpZXMgPQorCQliYXR0ZXJ5LT5iYXRfZGVzYy5wcm9wZXJ0aWVzID0gZW5lcmd5X2JhdHRlcnlfcHJvcHM7CisJCWJhdHRlcnktPmJhdF9kZXNjLm51bV9wcm9wZXJ0aWVzID0KIAkJCUFSUkFZX1NJWkUoZW5lcmd5X2JhdHRlcnlfcHJvcHMpOwogCX0KIAotCWJhdHRlcnktPmJhdC5uYW1lID0gYWNwaV9kZXZpY2VfYmlkKGJhdHRlcnktPmRldmljZSk7Ci0JYmF0dGVyeS0+YmF0LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCWJhdHRlcnktPmJhdC5nZXRfcHJvcGVydHkgPSBhY3BpX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OworCWJhdHRlcnktPmJhdF9kZXNjLm5hbWUgPSBhY3BpX2RldmljZV9iaWQoYmF0dGVyeS0+ZGV2aWNlKTsKKwliYXR0ZXJ5LT5iYXRfZGVzYy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKKwliYXR0ZXJ5LT5iYXRfZGVzYy5nZXRfcHJvcGVydHkgPSBhY3BpX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwogCi0JcmVzdWx0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyX25vX3dzKCZiYXR0ZXJ5LT5kZXZpY2UtPmRldiwgJmJhdHRlcnktPmJhdCk7CisJYmF0dGVyeS0+YmF0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyX25vX3dzKCZiYXR0ZXJ5LT5kZXZpY2UtPmRldiwKKwkJCQkmYmF0dGVyeS0+YmF0X2Rlc2MsICZwc3lfY2ZnKTsKIAotCWlmIChyZXN1bHQpCisJaWYgKElTX0VSUihiYXR0ZXJ5LT5iYXQpKSB7CisJCWludCByZXN1bHQgPSBQVFJfRVJSKGJhdHRlcnktPmJhdCk7CisKKwkJYmF0dGVyeS0+YmF0ID0gTlVMTDsKIAkJcmV0dXJuIHJlc3VsdDsKLQlyZXR1cm4gZGV2aWNlX2NyZWF0ZV9maWxlKGJhdHRlcnktPmJhdC5kZXYsICZhbGFybV9hdHRyKTsKKwl9CisJcmV0dXJuIGRldmljZV9jcmVhdGVfZmlsZSgmYmF0dGVyeS0+YmF0LT5kZXYsICZhbGFybV9hdHRyKTsKIH0KIAogc3RhdGljIHZvaWQgc3lzZnNfcmVtb3ZlX2JhdHRlcnkoc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSkKIHsKIAltdXRleF9sb2NrKCZiYXR0ZXJ5LT5zeXNmc19sb2NrKTsKLQlpZiAoIWJhdHRlcnktPmJhdC5kZXYpIHsKKwlpZiAoIWJhdHRlcnktPmJhdCkgewogCQltdXRleF91bmxvY2soJmJhdHRlcnktPnN5c2ZzX2xvY2spOwogCQlyZXR1cm47CiAJfQogCi0JZGV2aWNlX3JlbW92ZV9maWxlKGJhdHRlcnktPmJhdC5kZXYsICZhbGFybV9hdHRyKTsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmYmF0dGVyeS0+YmF0KTsKLQliYXR0ZXJ5LT5iYXQuZGV2ID0gTlVMTDsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmJhdHRlcnktPmJhdC0+ZGV2LCAmYWxhcm1fYXR0cik7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYmF0dGVyeS0+YmF0KTsKKwliYXR0ZXJ5LT5iYXQgPSBOVUxMOwogCW11dGV4X3VubG9jaygmYmF0dGVyeS0+c3lzZnNfbG9jayk7CiB9CiAKQEAgLTczOCw3ICs3NDQsNyBAQAogCQkJcmV0dXJuIHJlc3VsdDsKIAkJYWNwaV9iYXR0ZXJ5X2luaXRfYWxhcm0oYmF0dGVyeSk7CiAJfQotCWlmICghYmF0dGVyeS0+YmF0LmRldikgeworCWlmICghYmF0dGVyeS0+YmF0KSB7CiAJCXJlc3VsdCA9IHN5c2ZzX2FkZF9iYXR0ZXJ5KGJhdHRlcnkpOwogCQlpZiAocmVzdWx0KQogCQkJcmV0dXJuIHJlc3VsdDsKQEAgLTc2NCw3ICs3NzAsNyBAQAogewogCWludCBwb3dlcl91bml0OwogCi0JaWYgKCFiYXR0ZXJ5LT5iYXQuZGV2KQorCWlmICghYmF0dGVyeS0+YmF0KQogCQlyZXR1cm47CiAKIAlwb3dlcl91bml0ID0gYmF0dGVyeS0+cG93ZXJfdW5pdDsKQEAgLTEwNjIsMTEgKzEwNjgsMTEgQEAKIHN0YXRpYyB2b2lkIGFjcGlfYmF0dGVyeV9ub3RpZnkoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIHUzMiBldmVudCkKIHsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gYWNwaV9kcml2ZXJfZGF0YShkZXZpY2UpOwotCXN0cnVjdCBkZXZpY2UgKm9sZDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpvbGQ7CiAKIAlpZiAoIWJhdHRlcnkpCiAJCXJldHVybjsKLQlvbGQgPSBiYXR0ZXJ5LT5iYXQuZGV2OworCW9sZCA9IGJhdHRlcnktPmJhdDsKIAkvKgogCSogT24gQWNlciBBc3BpcmUgVjUtNTczRyBub3RpZmljYXRpb25zIGFyZSBzb21ldGltZXMgdHJpZ2dlcmVkIHRvbwogCSogZWFybHkuIEZvciBleGFtcGxlLCB3aGVuIEFDIGlzIHVucGx1Z2dlZCBhbmQgbm90aWZpY2F0aW9uIGlzCkBAIC0xMDgzLDggKzEwODksOCBAQAogCQkJCQlhY3BpX2JhdHRlcnlfcHJlc2VudChiYXR0ZXJ5KSk7CiAJYWNwaV9ub3RpZmllcl9jYWxsX2NoYWluKGRldmljZSwgZXZlbnQsIGFjcGlfYmF0dGVyeV9wcmVzZW50KGJhdHRlcnkpKTsKIAkvKiBhY3BpX2JhdHRlcnlfdXBkYXRlIGNvdWxkIHJlbW92ZSBwb3dlcl9zdXBwbHkgb2JqZWN0ICovCi0JaWYgKG9sZCAmJiBiYXR0ZXJ5LT5iYXQuZGV2KQotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmYmF0dGVyeS0+YmF0KTsKKwlpZiAob2xkICYmIGJhdHRlcnktPmJhdCkKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoYmF0dGVyeS0+YmF0KTsKIH0KIAogc3RhdGljIGludCBiYXR0ZXJ5X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLApAQCAtMTEwMCw3ICsxMTA2LDcgQEAKIAkJaWYgKCFhY3BpX2JhdHRlcnlfcHJlc2VudChiYXR0ZXJ5KSkKIAkJCXJldHVybiAwOwogCi0JCWlmICghYmF0dGVyeS0+YmF0LmRldikgeworCQlpZiAoIWJhdHRlcnktPmJhdCkgewogCQkJcmVzdWx0ID0gYWNwaV9iYXR0ZXJ5X2dldF9pbmZvKGJhdHRlcnkpOwogCQkJaWYgKHJlc3VsdCkKIAkJCQlyZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jIGIvZHJpdmVycy9hY3BpL2JsYWNrbGlzdC5jCmluZGV4IDliNjkzZDUuLjFkMTc5MTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ibGFja2xpc3QuYworKysgYi9kcml2ZXJzL2FjcGkvYmxhY2tsaXN0LmMKQEAgLTIxNSw2ICsyMTUsMTQgQEAKIAl9LAogCXsKIAkuY2FsbGJhY2sgPSBkbWlfZGlzYWJsZV9vc2lfdmlzdGEsCisJLmlkZW50ID0gIlZHTi1TUjE5WE4iLAorCS5tYXRjaGVzID0geworCQkgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlNvbnkgQ29ycG9yYXRpb24iKSwKKwkJICAgICBETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlZHTi1TUjE5WE4iKSwKKwkJfSwKKwl9LAorCXsKKwkuY2FsbGJhY2sgPSBkbWlfZGlzYWJsZV9vc2lfdmlzdGEsCiAJLmlkZW50ID0gIlRvc2hpYmEgU2F0ZWxsaXRlIEwzNTUiLAogCS5tYXRjaGVzID0gewogCQkgICAgIERNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIlRPU0hJQkEiKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kb2NrLmMgYi9kcml2ZXJzL2FjcGkvZG9jay5jCmluZGV4IGQ5MzM5YjQuLmE2ODhhYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kb2NrLmMKKysrIGIvZHJpdmVycy9hY3BpL2RvY2suYwpAQCAtNjE1LDcgKzYxNSw3IEBACiAJbWVtc2V0KCZwZGV2aW5mbywgMCwgc2l6ZW9mKHBkZXZpbmZvKSk7CiAJcGRldmluZm8ubmFtZSA9ICJkb2NrIjsKIAlwZGV2aW5mby5pZCA9IGRvY2tfc3RhdGlvbl9jb3VudDsKLQlwZGV2aW5mby5hY3BpX25vZGUuY29tcGFuaW9uID0gYWRldjsKKwlwZGV2aW5mby5md25vZGUgPSBhY3BpX2Z3bm9kZV9oYW5kbGUoYWRldik7CiAJcGRldmluZm8uZGF0YSA9ICZkczsKIAlwZGV2aW5mby5zaXplX2RhdGEgPSBzaXplb2YoZHMpOwogCWRkID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2Z1bGwoJnBkZXZpbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9lYy5jIGIvZHJpdmVycy9hY3BpL2VjLmMKaW5kZXggYThkZDJmNy4uMjIwZDY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2VjLmMKKysrIGIvZHJpdmVycy9hY3BpL2VjLmMKQEAgLTEzNyw2ICsxMzcsNTAgQEAKIHN0YXRpYyBpbnQgRUNfRkxBR1NfUVVFUllfSEFORFNIQUtFOyAvKiBOZWVkcyBRUl9FQyBpc3N1ZWQgd2hlbiBTQ0lfRVZUIHNldCAqLwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnaW5nL0RlYnVnZ2luZworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFNwbGl0dGVycyB1c2VkIGJ5IHRoZSBkZXZlbG9wZXJzIHRvIHRyYWNrIHRoZSBib3VuZGFyeSBvZiB0aGUgRUMKKyAqIGhhbmRsaW5nIHByb2Nlc3Nlcy4KKyAqLworI2lmZGVmIERFQlVHCisjZGVmaW5lIEVDX0RCR19TRVAJIiAiCisjZGVmaW5lIEVDX0RCR19EUlYJIisrKysrIgorI2RlZmluZSBFQ19EQkdfU1RNCSI9PT09PSIKKyNkZWZpbmUgRUNfREJHX1JFUQkiKioqKioiCisjZGVmaW5lIEVDX0RCR19FVlQJIiMjIyMjIgorI2Vsc2UKKyNkZWZpbmUgRUNfREJHX1NFUAkiIgorI2RlZmluZSBFQ19EQkdfRFJWCisjZGVmaW5lIEVDX0RCR19TVE0KKyNkZWZpbmUgRUNfREJHX1JFUQorI2RlZmluZSBFQ19EQkdfRVZUCisjZW5kaWYKKworI2RlZmluZSBlY19sb2dfcmF3KGZtdCwgLi4uKSBcCisJcHJfaW5mbyhmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZWNfZGJnX3JhdyhmbXQsIC4uLikgXAorCXByX2RlYnVnKGZtdCAiXG4iLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlY19sb2coZmlsdGVyLCBmbXQsIC4uLikgXAorCWVjX2xvZ19yYXcoZmlsdGVyIEVDX0RCR19TRVAgZm10IEVDX0RCR19TRVAgZmlsdGVyLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlY19kYmcoZmlsdGVyLCBmbXQsIC4uLikgXAorCWVjX2RiZ19yYXcoZmlsdGVyIEVDX0RCR19TRVAgZm10IEVDX0RCR19TRVAgZmlsdGVyLCAjI19fVkFfQVJHU19fKQorCisjZGVmaW5lIGVjX2xvZ19kcnYoZm10LCAuLi4pIFwKKwllY19sb2coRUNfREJHX0RSViwgZm10LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlY19kYmdfZHJ2KGZtdCwgLi4uKSBcCisJZWNfZGJnKEVDX0RCR19EUlYsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZWNfZGJnX3N0bShmbXQsIC4uLikgXAorCWVjX2RiZyhFQ19EQkdfU1RNLCBmbXQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGVjX2RiZ19yZXEoZm10LCAuLi4pIFwKKwllY19kYmcoRUNfREJHX1JFUSwgZm10LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBlY19kYmdfZXZ0KGZtdCwgLi4uKSBcCisJZWNfZGJnKEVDX0RCR19FVlQsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZWNfZGJnX3JlZihlYywgZm10LCAuLi4pIFwKKwllY19kYmdfcmF3KCIlbHU6ICIgZm10LCBlYy0+cmVmZXJlbmNlX2NvdW50LCAjIyBfX1ZBX0FSR1NfXykKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlIEZsYWdzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0xNTksMTQgKzIwMywxNCBAQAogewogCXU4IHggPSBpbmIoZWMtPmNvbW1hbmRfYWRkcik7CiAKLQlwcl9kZWJ1ZygiRUNfU0MoUikgPSAweCUyLjJ4ICIKLQkJICJTQ0lfRVZUPSVkIEJVUlNUPSVkIENNRD0lZCBJQkY9JWQgT0JGPSVkXG4iLAotCQkgeCwKLQkJICEhKHggJiBBQ1BJX0VDX0ZMQUdfU0NJKSwKLQkJICEhKHggJiBBQ1BJX0VDX0ZMQUdfQlVSU1QpLAotCQkgISEoeCAmIEFDUElfRUNfRkxBR19DTUQpLAotCQkgISEoeCAmIEFDUElfRUNfRkxBR19JQkYpLAotCQkgISEoeCAmIEFDUElfRUNfRkxBR19PQkYpKTsKKwllY19kYmdfcmF3KCJFQ19TQyhSKSA9IDB4JTIuMnggIgorCQkgICAiU0NJX0VWVD0lZCBCVVJTVD0lZCBDTUQ9JWQgSUJGPSVkIE9CRj0lZCIsCisJCSAgIHgsCisJCSAgICEhKHggJiBBQ1BJX0VDX0ZMQUdfU0NJKSwKKwkJICAgISEoeCAmIEFDUElfRUNfRkxBR19CVVJTVCksCisJCSAgICEhKHggJiBBQ1BJX0VDX0ZMQUdfQ01EKSwKKwkJICAgISEoeCAmIEFDUElfRUNfRkxBR19JQkYpLAorCQkgICAhISh4ICYgQUNQSV9FQ19GTEFHX09CRikpOwogCXJldHVybiB4OwogfQogCkBAIC0xNzUsMjAgKzIxOSwyMCBAQAogCXU4IHggPSBpbmIoZWMtPmRhdGFfYWRkcik7CiAKIAllYy0+Y3Vyci0+dGltZXN0YW1wID0gamlmZmllczsKLQlwcl9kZWJ1ZygiRUNfREFUQShSKSA9IDB4JTIuMnhcbiIsIHgpOworCWVjX2RiZ19yYXcoIkVDX0RBVEEoUikgPSAweCUyLjJ4IiwgeCk7CiAJcmV0dXJuIHg7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2VjX3dyaXRlX2NtZChzdHJ1Y3QgYWNwaV9lYyAqZWMsIHU4IGNvbW1hbmQpCiB7Ci0JcHJfZGVidWcoIkVDX1NDKFcpID0gMHglMi4yeFxuIiwgY29tbWFuZCk7CisJZWNfZGJnX3JhdygiRUNfU0MoVykgPSAweCUyLjJ4IiwgY29tbWFuZCk7CiAJb3V0Yihjb21tYW5kLCBlYy0+Y29tbWFuZF9hZGRyKTsKIAllYy0+Y3Vyci0+dGltZXN0YW1wID0gamlmZmllczsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfZWNfd3JpdGVfZGF0YShzdHJ1Y3QgYWNwaV9lYyAqZWMsIHU4IGRhdGEpCiB7Ci0JcHJfZGVidWcoIkVDX0RBVEEoVykgPSAweCUyLjJ4XG4iLCBkYXRhKTsKKwllY19kYmdfcmF3KCJFQ19EQVRBKFcpID0gMHglMi4yeCIsIGRhdGEpOwogCW91dGIoZGF0YSwgZWMtPmRhdGFfYWRkcik7CiAJZWMtPmN1cnItPnRpbWVzdGFtcCA9IGppZmZpZXM7CiB9CkBAIC0yNDAsNyArMjg0LDcgQEAKIAkJICogc29mdHdhcmUgbmVlZCB0byBtYW51YWxseSB0cmlnZ2VyIGEgcHNldWRvIEdQRSBldmVudCBvbgogCQkgKiBFTj0xIHdyaXRlcy4KIAkJICovCi0JCXByX2RlYnVnKCIqKioqKiBQb2xsaW5nIHF1aXJrICoqKioqXG4iKTsKKwkJZWNfZGJnX3JhdygiUG9sbGluZyBxdWlyayIpOwogCQlhZHZhbmNlX3RyYW5zYWN0aW9uKGVjKTsKIAl9CiB9CkBAIC0yOTksNyArMzQzLDcgQEAKIHsKIAlpZiAoIXRlc3RfYml0KGZsYWcsICZlYy0+ZmxhZ3MpKSB7CiAJCWFjcGlfZWNfZGlzYWJsZV9ncGUoZWMsIGZhbHNlKTsKLQkJcHJfZGVidWcoIisrKysrIFBvbGxpbmcgZW5hYmxlZCArKysrK1xuIik7CisJCWVjX2RiZ19kcnYoIlBvbGxpbmcgZW5hYmxlZCIpOwogCQlzZXRfYml0KGZsYWcsICZlYy0+ZmxhZ3MpOwogCX0KIH0KQEAgLTMwOSw3ICszNTMsNyBAQAogCWlmICh0ZXN0X2JpdChmbGFnLCAmZWMtPmZsYWdzKSkgewogCQljbGVhcl9iaXQoZmxhZywgJmVjLT5mbGFncyk7CiAJCWFjcGlfZWNfZW5hYmxlX2dwZShlYywgZmFsc2UpOwotCQlwcl9kZWJ1ZygiKysrKysgUG9sbGluZyBkaXNhYmxlZCArKysrK1xuIik7CisJCWVjX2RiZ19kcnYoIlBvbGxpbmcgZGlzYWJsZWQiKTsKIAl9CiB9CiAKQEAgLTMzNSw3ICszNzksNyBAQAogc3RhdGljIHZvaWQgYWNwaV9lY19zdWJtaXRfcXVlcnkoc3RydWN0IGFjcGlfZWMgKmVjKQogewogCWlmICghdGVzdF9hbmRfc2V0X2JpdChFQ19GTEFHU19RVUVSWV9QRU5ESU5HLCAmZWMtPmZsYWdzKSkgewotCQlwcl9kZWJ1ZygiKioqKiogRXZlbnQgc3RhcnRlZCAqKioqKlxuIik7CisJCWVjX2RiZ19yZXEoIkV2ZW50IHN0YXJ0ZWQiKTsKIAkJc2NoZWR1bGVfd29yaygmZWMtPndvcmspOwogCX0KIH0KQEAgLTM0NCw3ICszODgsNyBAQAogewogCWlmIChlYy0+Y3Vyci0+Y29tbWFuZCA9PSBBQ1BJX0VDX0NPTU1BTkRfUVVFUlkpIHsKIAkJY2xlYXJfYml0KEVDX0ZMQUdTX1FVRVJZX1BFTkRJTkcsICZlYy0+ZmxhZ3MpOwotCQlwcl9kZWJ1ZygiKioqKiogRXZlbnQgc3RvcHBlZCAqKioqKlxuIik7CisJCWVjX2RiZ19yZXEoIkV2ZW50IHN0b3BwZWQiKTsKIAl9CiB9CiAKQEAgLTM2Niw4ICs0MTAsOCBAQAogCXU4IHN0YXR1czsKIAlib29sIHdha2V1cCA9IGZhbHNlOwogCi0JcHJfZGVidWcoIj09PT09ICVzICglZCkgPT09PT1cbiIsCi0JCSBpbl9pbnRlcnJ1cHQoKSA/ICJJUlEiIDogIlRBU0siLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCWVjX2RiZ19zdG0oIiVzICglZCkiLCBpbl9pbnRlcnJ1cHQoKSA/ICJJUlEiIDogIlRBU0siLAorCQkgICBzbXBfcHJvY2Vzc29yX2lkKCkpOwogCS8qCiAJICogQnkgYWx3YXlzIGNsZWFyaW5nIFNUUyBiZWZvcmUgaGFuZGxpbmcgYWxsIGluZGljYXRpb25zLCB3ZSBjYW4KIAkgKiBlbnN1cmUgYSBoYXJkd2FyZSBTVFMgMC0+MSBjaGFuZ2UgYWZ0ZXIgdGhpcyBjbGVhcmluZyBjYW4gYWx3YXlzCkBAIC0zOTAsOCArNDM0LDggQEAKIAkJCQlpZiAodC0+cmxlbiA9PSB0LT5yaSkgewogCQkJCQl0LT5mbGFncyB8PSBBQ1BJX0VDX0NPTU1BTkRfQ09NUExFVEU7CiAJCQkJCWlmICh0LT5jb21tYW5kID09IEFDUElfRUNfQ09NTUFORF9RVUVSWSkKLQkJCQkJCXByX2RlYnVnKCIqKioqKiBDb21tYW5kKCVzKSBoYXJkd2FyZSBjb21wbGV0aW9uICoqKioqXG4iLAotCQkJCQkJCSBhY3BpX2VjX2NtZF9zdHJpbmcodC0+Y29tbWFuZCkpOworCQkJCQkJZWNfZGJnX3JlcSgiQ29tbWFuZCglcykgaGFyZHdhcmUgY29tcGxldGlvbiIsCisJCQkJCQkJICAgYWNwaV9lY19jbWRfc3RyaW5nKHQtPmNvbW1hbmQpKTsKIAkJCQkJd2FrZXVwID0gdHJ1ZTsKIAkJCQl9CiAJCQl9IGVsc2UKQEAgLTQxMCw4ICs0NTQsOCBAQAogCQkJYWNwaV9lY19jb21wbGV0ZV9xdWVyeShlYyk7CiAJCQl0LT5yZGF0YVt0LT5yaSsrXSA9IDB4MDA7CiAJCQl0LT5mbGFncyB8PSBBQ1BJX0VDX0NPTU1BTkRfQ09NUExFVEU7Ci0JCQlwcl9kZWJ1ZygiKioqKiogQ29tbWFuZCglcykgc29mdHdhcmUgY29tcGxldGlvbiAqKioqKlxuIiwKLQkJCQkgYWNwaV9lY19jbWRfc3RyaW5nKHQtPmNvbW1hbmQpKTsKKwkJCWVjX2RiZ19yZXEoIkNvbW1hbmQoJXMpIHNvZnR3YXJlIGNvbXBsZXRpb24iLAorCQkJCSAgIGFjcGlfZWNfY21kX3N0cmluZyh0LT5jb21tYW5kKSk7CiAJCQl3YWtldXAgPSB0cnVlOwogCQl9IGVsc2UgaWYgKChzdGF0dXMgJiBBQ1BJX0VDX0ZMQUdfSUJGKSA9PSAwKSB7CiAJCQlhY3BpX2VjX3dyaXRlX2NtZChlYywgdC0+Y29tbWFuZCk7CkBAIC01MDIsMjEgKzU0NiwyMSBAQAogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIHVubG9jazsKIAl9CisJZWNfZGJnX3JlZihlYywgIkluY3JlYXNlIGNvbW1hbmQiKTsKIAkvKiBmb2xsb3dpbmcgdHdvIGFjdGlvbnMgc2hvdWxkIGJlIGtlcHQgYXRvbWljICovCiAJZWMtPmN1cnIgPSB0OwotCXByX2RlYnVnKCIqKioqKiBDb21tYW5kKCVzKSBzdGFydGVkICoqKioqXG4iLAotCQkgYWNwaV9lY19jbWRfc3RyaW5nKHQtPmNvbW1hbmQpKTsKKwllY19kYmdfcmVxKCJDb21tYW5kKCVzKSBzdGFydGVkIiwgYWNwaV9lY19jbWRfc3RyaW5nKHQtPmNvbW1hbmQpKTsKIAlzdGFydF90cmFuc2FjdGlvbihlYyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZWMtPmxvY2ssIHRtcCk7CiAJcmV0ID0gZWNfcG9sbChlYyk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmVjLT5sb2NrLCB0bXApOwogCWlmICh0LT5pcnFfY291bnQgPT0gZWNfc3Rvcm1fdGhyZXNob2xkKQogCQlhY3BpX2VjX2NsZWFyX3N0b3JtKGVjLCBFQ19GTEFHU19DT01NQU5EX1NUT1JNKTsKLQlwcl9kZWJ1ZygiKioqKiogQ29tbWFuZCglcykgc3RvcHBlZCAqKioqKlxuIiwKLQkJIGFjcGlfZWNfY21kX3N0cmluZyh0LT5jb21tYW5kKSk7CisJZWNfZGJnX3JlcSgiQ29tbWFuZCglcykgc3RvcHBlZCIsIGFjcGlfZWNfY21kX3N0cmluZyh0LT5jb21tYW5kKSk7CiAJZWMtPmN1cnIgPSBOVUxMOwogCS8qIERpc2FibGUgR1BFIGZvciBjb21tYW5kIHByb2Nlc3NpbmcgKElCRj0wL09CRj0xKSAqLwogCWFjcGlfZWNfY29tcGxldGVfcmVxdWVzdChlYyk7CisJZWNfZGJnX3JlZihlYywgIkRlY3JlYXNlIGNvbW1hbmQiKTsKIHVubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+bG9jaywgdG1wKTsKIAlyZXR1cm4gcmV0OwpAQCAtNjc2LDExICs3MjAsMTMgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+bG9jaywgZmxhZ3MpOwogCWlmICghdGVzdF9hbmRfc2V0X2JpdChFQ19GTEFHU19TVEFSVEVELCAmZWMtPmZsYWdzKSkgewotCQlwcl9kZWJ1ZygiKysrKysgU3RhcnRpbmcgRUMgKysrKytcbiIpOworCQllY19kYmdfZHJ2KCJTdGFydGluZyBFQyIpOwogCQkvKiBFbmFibGUgR1BFIGZvciBldmVudCBwcm9jZXNzaW5nIChTQ0lfRVZUPTEpICovCi0JCWlmICghcmVzdW1pbmcpCisJCWlmICghcmVzdW1pbmcpIHsKIAkJCWFjcGlfZWNfc3VibWl0X3JlcXVlc3QoZWMpOwotCQlwcl9kZWJ1ZygiRUMgc3RhcnRlZFxuIik7CisJCQllY19kYmdfcmVmKGVjLCAiSW5jcmVhc2UgZHJpdmVyIik7CisJCX0KKwkJZWNfbG9nX2RydigiRUMgc3RhcnRlZCIpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+bG9jaywgZmxhZ3MpOwogfQpAQCAtNzAyLDE3ICs3NDgsMTkgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlYy0+bG9jaywgZmxhZ3MpOwogCWlmIChhY3BpX2VjX3N0YXJ0ZWQoZWMpKSB7Ci0JCXByX2RlYnVnKCIrKysrKyBTdG9wcGluZyBFQyArKysrK1xuIik7CisJCWVjX2RiZ19kcnYoIlN0b3BwaW5nIEVDIik7CiAJCXNldF9iaXQoRUNfRkxBR1NfU1RPUFBFRCwgJmVjLT5mbGFncyk7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVjLT5sb2NrLCBmbGFncyk7CiAJCXdhaXRfZXZlbnQoZWMtPndhaXQsIGFjcGlfZWNfc3RvcHBlZChlYykpOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZWMtPmxvY2ssIGZsYWdzKTsKIAkJLyogRGlzYWJsZSBHUEUgZm9yIGV2ZW50IHByb2Nlc3NpbmcgKFNDSV9FVlQ9MSkgKi8KLQkJaWYgKCFzdXNwZW5kaW5nKQorCQlpZiAoIXN1c3BlbmRpbmcpIHsKIAkJCWFjcGlfZWNfY29tcGxldGVfcmVxdWVzdChlYyk7CisJCQllY19kYmdfcmVmKGVjLCAiRGVjcmVhc2UgZHJpdmVyIik7CisJCX0KIAkJY2xlYXJfYml0KEVDX0ZMQUdTX1NUQVJURUQsICZlYy0+ZmxhZ3MpOwogCQljbGVhcl9iaXQoRUNfRkxBR1NfU1RPUFBFRCwgJmVjLT5mbGFncyk7Ci0JCXByX2RlYnVnKCJFQyBzdG9wcGVkXG4iKTsKKwkJZWNfbG9nX2RydigiRUMgc3RvcHBlZCIpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlYy0+bG9jaywgZmxhZ3MpOwogfQpAQCAtODI0LDEyICs4NzIsMTIgQEAKIAogCWlmICghaGFuZGxlcikKIAkJcmV0dXJuOwotCXByX2RlYnVnKCIjIyMjIyBRdWVyeSgweCUwMngpIHN0YXJ0ZWQgIyMjIyNcbiIsIGhhbmRsZXItPnF1ZXJ5X2JpdCk7CisJZWNfZGJnX2V2dCgiUXVlcnkoMHglMDJ4KSBzdGFydGVkIiwgaGFuZGxlci0+cXVlcnlfYml0KTsKIAlpZiAoaGFuZGxlci0+ZnVuYykKIAkJaGFuZGxlci0+ZnVuYyhoYW5kbGVyLT5kYXRhKTsKIAllbHNlIGlmIChoYW5kbGVyLT5oYW5kbGUpCiAJCWFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZXItPmhhbmRsZSwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0JcHJfZGVidWcoIiMjIyMjIFF1ZXJ5KDB4JTAyeCkgc3RvcHBlZCAjIyMjI1xuIiwgaGFuZGxlci0+cXVlcnlfYml0KTsKKwllY19kYmdfZXZ0KCJRdWVyeSgweCUwMngpIHN0b3BwZWQiLCBoYW5kbGVyLT5xdWVyeV9iaXQpOwogCWFjcGlfZWNfcHV0X3F1ZXJ5X2hhbmRsZXIoaGFuZGxlcik7CiB9CiAKQEAgLTg2MSw4ICs5MDksOCBAQAogCQlpZiAodmFsdWUgPT0gaGFuZGxlci0+cXVlcnlfYml0KSB7CiAJCQkvKiBoYXZlIGN1c3RvbSBoYW5kbGVyIGZvciB0aGlzIGJpdCAqLwogCQkJaGFuZGxlciA9IGFjcGlfZWNfZ2V0X3F1ZXJ5X2hhbmRsZXIoaGFuZGxlcik7Ci0JCQlwcl9kZWJ1ZygiIyMjIyMgUXVlcnkoMHglMDJ4KSBzY2hlZHVsZWQgIyMjIyNcbiIsCi0JCQkJIGhhbmRsZXItPnF1ZXJ5X2JpdCk7CisJCQllY19kYmdfZXZ0KCJRdWVyeSgweCUwMngpIHNjaGVkdWxlZCIsCisJCQkJICAgaGFuZGxlci0+cXVlcnlfYml0KTsKIAkJCXN0YXR1cyA9IGFjcGlfb3NfZXhlY3V0ZSgoaGFuZGxlci0+ZnVuYykgPwogCQkJCU9TTF9OT1RJRllfSEFORExFUiA6IE9TTF9HUEVfSEFORExFUiwKIAkJCQlhY3BpX2VjX3J1biwgaGFuZGxlcik7CkBAIC0xMDk5LDYgKzExNDcsOSBAQAogCiAJcmV0ID0gZWNfaW5zdGFsbF9oYW5kbGVycyhlYyk7CiAKKwkvKiBSZXByb2JlIGRldmljZXMgZGVwZW5kaW5nIG9uIHRoZSBFQyAqLworCWFjcGlfd2Fsa19kZXBfZGV2aWNlX2xpc3QoZWMtPmhhbmRsZSk7CisKIAkvKiBFQyBpcyBmdWxseSBvcGVyYXRpb25hbCwgYWxsb3cgcXVlcmllcyAqLwogCWNsZWFyX2JpdChFQ19GTEFHU19RVUVSWV9QRU5ESU5HLCAmZWMtPmZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2dsdWUuYyBiL2RyaXZlcnMvYWNwaS9nbHVlLmMKaW5kZXggZjc3NGM2NS4uMzljNDg1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2dsdWUuYworKysgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIAl1bnNpZ25lZCBpbnQgbm9kZV9pZDsKIAlpbnQgcmV0dmFsID0gLUVJTlZBTDsKIAotCWlmIChBQ1BJX0NPTVBBTklPTihkZXYpKSB7CisJaWYgKGhhc19hY3BpX2NvbXBhbmlvbihkZXYpKSB7CiAJCWlmIChhY3BpX2RldikgewogCQkJZGV2X3dhcm4oZGV2LCAiQUNQSSBjb21wYW5pb24gYWxyZWFkeSBzZXRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjAsNyArMjIwLDcgQEAKIAlsaXN0X2FkZCgmcGh5c2ljYWxfbm9kZS0+bm9kZSwgcGh5c25vZGVfbGlzdCk7CiAJYWNwaV9kZXYtPnBoeXNpY2FsX25vZGVfY291bnQrKzsKIAotCWlmICghQUNQSV9DT01QQU5JT04oZGV2KSkKKwlpZiAoIWhhc19hY3BpX2NvbXBhbmlvbihkZXYpKQogCQlBQ1BJX0NPTVBBTklPTl9TRVQoZGV2LCBhY3BpX2Rldik7CiAKIAlhY3BpX3BoeXNub2RlX2xpbmtfbmFtZShwaHlzaWNhbF9ub2RlX25hbWUsIG5vZGVfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYyBiL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKaW5kZXggZTdmNzE4ZC4uYjFkZWY0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9pcnEuYworKysgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCkBAIC00ODUsNiArNDg1LDE0IEBACiAJaWYgKCFwaW4gfHwgIWRldi0+aXJxX21hbmFnZWQgfHwgZGV2LT5pcnEgPD0gMCkKIAkJcmV0dXJuOwogCisJLyogS2VlcCBJT0FQSUMgcGluIGNvbmZpZ3VyYXRpb24gd2hlbiBzdXNwZW5kaW5nICovCisJaWYgKGRldi0+ZGV2LnBvd2VyLmlzX3ByZXBhcmVkKQorCQlyZXR1cm47CisjaWZkZWYJQ09ORklHX1BNCisJaWYgKGRldi0+ZGV2LnBvd2VyLnJ1bnRpbWVfc3RhdHVzID09IFJQTV9TVVNQRU5ESU5HKQorCQlyZXR1cm47CisjZW5kaWYKKwogCWVudHJ5ID0gYWNwaV9wY2lfaXJxX2xvb2t1cChkZXYsIHBpbik7CiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuOwpAQCAtNTA1LDYgKzUxMyw1IEBACiAJaWYgKGdzaSA+PSAwKSB7CiAJCWFjcGlfdW5yZWdpc3Rlcl9nc2koZ3NpKTsKIAkJZGV2LT5pcnFfbWFuYWdlZCA9IDA7Ci0JCWRldi0+aXJxID0gMDsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCmluZGV4IDY4YTVmNzEuLjFiNTU2OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCkBAIC00MjMsOCArNDIzLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woYWNwaV9wY2lfb3NjX2NvbnRyb2xfc2V0KTsKIAotc3RhdGljIHZvaWQgbmVnb3RpYXRlX29zX2NvbnRyb2woc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QsIGludCAqbm9fYXNwbSwKLQkJCQkgaW50ICpjbGVhcl9hc3BtKQorc3RhdGljIHZvaWQgbmVnb3RpYXRlX29zX2NvbnRyb2woc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QsIGludCAqbm9fYXNwbSkKIHsKIAl1MzIgc3VwcG9ydCwgY29udHJvbCwgcmVxdWVzdGVkOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTQ5NSwxMCArNDk0LDEyIEBACiAJCWRlY29kZV9vc2NfY29udHJvbChyb290LCAiT1Mgbm93IGNvbnRyb2xzIiwgY29udHJvbCk7CiAJCWlmIChhY3BpX2dibF9GQURULmJvb3RfZmxhZ3MgJiBBQ1BJX0ZBRFRfTk9fQVNQTSkgewogCQkJLyoKLQkJCSAqIFdlIGhhdmUgQVNQTSBjb250cm9sLCBidXQgdGhlIEZBRFQgaW5kaWNhdGVzCi0JCQkgKiB0aGF0IGl0J3MgdW5zdXBwb3J0ZWQuIENsZWFyIGl0LgorCQkJICogV2UgaGF2ZSBBU1BNIGNvbnRyb2wsIGJ1dCB0aGUgRkFEVCBpbmRpY2F0ZXMgdGhhdAorCQkJICogaXQncyB1bnN1cHBvcnRlZC4gTGVhdmUgZXhpc3RpbmcgY29uZmlndXJhdGlvbgorCQkJICogaW50YWN0IGFuZCBwcmV2ZW50IHRoZSBPUyBmcm9tIHRvdWNoaW5nIGl0LgogCQkJICovCi0JCQkqY2xlYXJfYXNwbSA9IDE7CisJCQlkZXZfaW5mbygmZGV2aWNlLT5kZXYsICJGQURUIGluZGljYXRlcyBBU1BNIGlzIHVuc3VwcG9ydGVkLCB1c2luZyBCSU9TIGNvbmZpZ3VyYXRpb25cbiIpOworCQkJKm5vX2FzcG0gPSAxOwogCQl9CiAJfSBlbHNlIHsKIAkJZGVjb2RlX29zY19jb250cm9sKHJvb3QsICJPUyByZXF1ZXN0ZWQiLCByZXF1ZXN0ZWQpOwpAQCAtNTI1LDcgKzUyNiw3IEBACiAJaW50IHJlc3VsdDsKIAlzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdDsKIAlhY3BpX2hhbmRsZSBoYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKLQlpbnQgbm9fYXNwbSA9IDAsIGNsZWFyX2FzcG0gPSAwOworCWludCBub19hc3BtID0gMDsKIAlib29sIGhvdGFkZCA9IHN5c3RlbV9zdGF0ZSAhPSBTWVNURU1fQk9PVElORzsKIAogCXJvb3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYWNwaV9wY2lfcm9vdCksIEdGUF9LRVJORUwpOwpAQCAtNTg0LDcgKzU4NSw3IEBACiAKIAlyb290LT5tY2ZnX2FkZHIgPSBhY3BpX3BjaV9yb290X2dldF9tY2ZnX2FkZHIoaGFuZGxlKTsKIAotCW5lZ290aWF0ZV9vc19jb250cm9sKHJvb3QsICZub19hc3BtLCAmY2xlYXJfYXNwbSk7CisJbmVnb3RpYXRlX29zX2NvbnRyb2wocm9vdCwgJm5vX2FzcG0pOwogCiAJLyoKIAkgKiBUQkQ6IE5lZWQgUENJIGludGVyZmFjZSBmb3IgZW51bWVyYXRpb24vY29uZmlndXJhdGlvbiBvZiByb290cy4KQEAgLTYwNywxMCArNjA4LDYgQEAKIAkJZ290byByZW1vdmVfZG1hcjsKIAl9CiAKLQlpZiAoY2xlYXJfYXNwbSkgewotCQlkZXZfaW5mbygmZGV2aWNlLT5kZXYsICJEaXNhYmxpbmcgQVNQTSAoRkFEVCBpbmRpY2F0ZXMgaXQgaXMgdW5zdXBwb3J0ZWQpXG4iKTsKLQkJcGNpZV9jbGVhcl9hc3BtKHJvb3QtPmJ1cyk7Ci0JfQogCWlmIChub19hc3BtKQogCQlwY2llX25vX2FzcG0oKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3BtaWMvaW50ZWxfcG1pY19jcmMuYyBiL2RyaXZlcnMvYWNwaS9wbWljL2ludGVsX3BtaWNfY3JjLmMKaW5kZXggZWY3ZDhmZi4uNDJkZjQ2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BtaWMvaW50ZWxfcG1pY19jcmMuYworKysgYi9kcml2ZXJzL2FjcGkvcG1pYy9pbnRlbF9wbWljX2NyYy5jCkBAIC0yMDcsNSArMjA3LDUgQEAKIH0KIG1vZHVsZV9pbml0KGludGVsX2NyY19wbWljX29wcmVnaW9uX2RyaXZlcl9pbml0KTsKIAotTU9EVUxFX0RFU0NSSVBUSU9OKCJDcnlzdGFsQ292ZSBBQ1BJIG9wcmF0aW9uIHJlZ2lvbiBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3J5c3RhbENvdmUgQUNQSSBvcGVyYXRpb24gcmVnaW9uIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwppbmRleCBjNmJiOWYxLi4zOWUwYzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPiAgICAgICAvKiBuZWVkX3Jlc2NoZWQoKSAqLwotI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NvcmVfb3BzLmg+CiAjaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KQEAgLTE1NywxMiArMTU3LDExIEBACiBzdGF0aWMgdm9pZCBfX2xhcGljX3RpbWVyX3Byb3BhZ2F0ZV9icm9hZGNhc3Qodm9pZCAqYXJnKQogewogCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSAoc3RydWN0IGFjcGlfcHJvY2Vzc29yICopIGFyZzsKLQl1bnNpZ25lZCBsb25nIHJlYXNvbjsKIAotCXJlYXNvbiA9IHByLT5wb3dlci50aW1lcl9icm9hZGNhc3Rfb25fc3RhdGUgPCBJTlRfTUFYID8KLQkJQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfT04gOiBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9PRkY7Ci0KLQljbG9ja2V2ZW50c19ub3RpZnkocmVhc29uLCAmcHItPmlkKTsKKwlpZiAocHItPnBvd2VyLnRpbWVyX2Jyb2FkY2FzdF9vbl9zdGF0ZSA8IElOVF9NQVgpCisJCXRpY2tfYnJvYWRjYXN0X2VuYWJsZSgpOworCWVsc2UKKwkJdGlja19icm9hZGNhc3RfZGlzYWJsZSgpOwogfQogCiBzdGF0aWMgdm9pZCBsYXBpY190aW1lcl9wcm9wYWdhdGVfYnJvYWRjYXN0KHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIpCkBAIC0xNzksMTEgKzE3OCwxMCBAQAogCWludCBzdGF0ZSA9IGN4IC0gcHItPnBvd2VyLnN0YXRlczsKIAogCWlmIChzdGF0ZSA+PSBwci0+cG93ZXIudGltZXJfYnJvYWRjYXN0X29uX3N0YXRlKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcmVhc29uOwotCi0JCXJlYXNvbiA9IGJyb2FkY2FzdCA/ICBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FTlRFUiA6Ci0JCQlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElUOwotCQljbG9ja2V2ZW50c19ub3RpZnkocmVhc29uLCAmcHItPmlkKTsKKwkJaWYgKGJyb2FkY2FzdCkKKwkJCXRpY2tfYnJvYWRjYXN0X2VudGVyKCk7CisJCWVsc2UKKwkJCXRpY2tfYnJvYWRjYXN0X2V4aXQoKTsKIAl9CiB9CiAKQEAgLTkyMiw3ICs5MjAsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWRydi0+c2FmZV9zdGF0ZV9pbmRleCA9IC0xOwotCWZvciAoaSA9IDA7IGkgPCBDUFVJRExFX1NUQVRFX01BWDsgaSsrKSB7CisJZm9yIChpID0gQ1BVSURMRV9EUklWRVJfU1RBVEVfU1RBUlQ7IGkgPCBDUFVJRExFX1NUQVRFX01BWDsgaSsrKSB7CiAJCWRydi0+c3RhdGVzW2ldLm5hbWVbMF0gPSAnXDAnOwogCQlkcnYtPnN0YXRlc1tpXS5kZXNjWzBdID0gJ1wwJzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2JzLmMgYi9kcml2ZXJzL2FjcGkvc2JzLmMKaW5kZXggYTdhM2VkZC4uY2Q4Mjc2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Nicy5jCisrKyBiL2RyaXZlcnMvYWNwaS9zYnMuYwpAQCAtNzQsNyArNzQsOCBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBzYnNfZGV2aWNlX2lkcyk7CiAKIHN0cnVjdCBhY3BpX2JhdHRlcnkgewotCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYmF0X2Rlc2M7CiAJc3RydWN0IGFjcGlfc2JzICpzYnM7CiAJdW5zaWduZWQgbG9uZyB1cGRhdGVfdGltZTsKIAljaGFyIG5hbWVbOF07CkBAIC0xMDEsMTAgKzEwMiwxMCBAQAogCXU4IGhhdmVfc3lzZnNfYWxhcm06MTsKIH07CiAKLSNkZWZpbmUgdG9fYWNwaV9iYXR0ZXJ5KHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgYWNwaV9iYXR0ZXJ5LCBiYXQpCisjZGVmaW5lIHRvX2FjcGlfYmF0dGVyeSh4KSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEoeCkKIAogc3RydWN0IGFjcGlfc2JzIHsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGNoYXJnZXI7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqY2hhcmdlcjsKIAlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZTsKIAlzdHJ1Y3QgYWNwaV9zbWJfaGMgKmhjOwogCXN0cnVjdCBtdXRleCBsb2NrOwpAQCAtMTE1LDcgKzExNiw3IEBACiAJdTggY2hhcmdlcl9leGlzdHM6MTsKIH07CiAKLSNkZWZpbmUgdG9fYWNwaV9zYnMoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBhY3BpX3NicywgY2hhcmdlcikKKyNkZWZpbmUgdG9fYWNwaV9zYnMoeCkgcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHgpCiAKIHN0YXRpYyBpbnQgYWNwaV9zYnNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X2dldF9zdGF0ZShzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KTsKQEAgLTMwMyw2ICszMDQsMTMgQEAKIAlQT1dFUl9TVVBQTFlfUFJPUF9NQU5VRkFDVFVSRVIsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFjcGlfc2JzX2NoYXJnZXJfZGVzYyA9IHsKKwkubmFtZQkJPSAic2JzLWNoYXJnZXIiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TLAorCS5wcm9wZXJ0aWVzCT0gc2JzX2FjX3Byb3BzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoc2JzX2FjX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CT0gc2JzX2dldF9hY19wcm9wZXJ0eSwKK307CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hcnQgQmF0dGVyeSBTeXN0ZW0gTWFuYWdlbWVudApAQCAtNTE5LDYgKzUyNyw3IEBACiBzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9hZGQoc3RydWN0IGFjcGlfc2JzICpzYnMsIGludCBpZCkKIHsKIAlzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5ID0gJnNicy0+YmF0dGVyeVtpZF07CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHsgLmRydl9kYXRhID0gYmF0dGVyeSwgfTsKIAlpbnQgcmVzdWx0OwogCiAJYmF0dGVyeS0+aWQgPSBpZDsKQEAgLTUyOCwyMyArNTM3LDI3IEBACiAJCXJldHVybiByZXN1bHQ7CiAKIAlzcHJpbnRmKGJhdHRlcnktPm5hbWUsIEFDUElfQkFUVEVSWV9ESVJfTkFNRSwgaWQpOwotCWJhdHRlcnktPmJhdC5uYW1lID0gYmF0dGVyeS0+bmFtZTsKLQliYXR0ZXJ5LT5iYXQudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CisJYmF0dGVyeS0+YmF0X2Rlc2MubmFtZSA9IGJhdHRlcnktPm5hbWU7CisJYmF0dGVyeS0+YmF0X2Rlc2MudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CiAJaWYgKCFhY3BpX2JhdHRlcnlfbW9kZShiYXR0ZXJ5KSkgewotCQliYXR0ZXJ5LT5iYXQucHJvcGVydGllcyA9IHNic19jaGFyZ2VfYmF0dGVyeV9wcm9wczsKLQkJYmF0dGVyeS0+YmF0Lm51bV9wcm9wZXJ0aWVzID0KKwkJYmF0dGVyeS0+YmF0X2Rlc2MucHJvcGVydGllcyA9IHNic19jaGFyZ2VfYmF0dGVyeV9wcm9wczsKKwkJYmF0dGVyeS0+YmF0X2Rlc2MubnVtX3Byb3BlcnRpZXMgPQogCQkgICAgQVJSQVlfU0laRShzYnNfY2hhcmdlX2JhdHRlcnlfcHJvcHMpOwogCX0gZWxzZSB7Ci0JCWJhdHRlcnktPmJhdC5wcm9wZXJ0aWVzID0gc2JzX2VuZXJneV9iYXR0ZXJ5X3Byb3BzOwotCQliYXR0ZXJ5LT5iYXQubnVtX3Byb3BlcnRpZXMgPQorCQliYXR0ZXJ5LT5iYXRfZGVzYy5wcm9wZXJ0aWVzID0gc2JzX2VuZXJneV9iYXR0ZXJ5X3Byb3BzOworCQliYXR0ZXJ5LT5iYXRfZGVzYy5udW1fcHJvcGVydGllcyA9CiAJCSAgICBBUlJBWV9TSVpFKHNic19lbmVyZ3lfYmF0dGVyeV9wcm9wcyk7CiAJfQotCWJhdHRlcnktPmJhdC5nZXRfcHJvcGVydHkgPSBhY3BpX3Nic19iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKLQlyZXN1bHQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnNicy0+ZGV2aWNlLT5kZXYsICZiYXR0ZXJ5LT5iYXQpOwotCWlmIChyZXN1bHQpCisJYmF0dGVyeS0+YmF0X2Rlc2MuZ2V0X3Byb3BlcnR5ID0gYWNwaV9zYnNfYmF0dGVyeV9nZXRfcHJvcGVydHk7CisJYmF0dGVyeS0+YmF0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZzYnMtPmRldmljZS0+ZGV2LAorCQkJCQkmYmF0dGVyeS0+YmF0X2Rlc2MsICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGJhdHRlcnktPmJhdCkpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihiYXR0ZXJ5LT5iYXQpOworCQliYXR0ZXJ5LT5iYXQgPSBOVUxMOwogCQlnb3RvIGVuZDsKKwl9CiAKLQlyZXN1bHQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoYmF0dGVyeS0+YmF0LmRldiwgJmFsYXJtX2F0dHIpOworCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZSgmYmF0dGVyeS0+YmF0LT5kZXYsICZhbGFybV9hdHRyKTsKIAlpZiAocmVzdWx0KQogCQlnb3RvIGVuZDsKIAliYXR0ZXJ5LT5oYXZlX3N5c2ZzX2FsYXJtID0gMTsKQEAgLTU1OSwyOCArNTcyLDI5IEBACiB7CiAJc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSA9ICZzYnMtPmJhdHRlcnlbaWRdOwogCi0JaWYgKGJhdHRlcnktPmJhdC5kZXYpIHsKKwlpZiAoYmF0dGVyeS0+YmF0KSB7CiAJCWlmIChiYXR0ZXJ5LT5oYXZlX3N5c2ZzX2FsYXJtKQotCQkJZGV2aWNlX3JlbW92ZV9maWxlKGJhdHRlcnktPmJhdC5kZXYsICZhbGFybV9hdHRyKTsKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmJhdHRlcnktPmJhdCk7CisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmJhdHRlcnktPmJhdC0+ZGV2LCAmYWxhcm1fYXR0cik7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGJhdHRlcnktPmJhdCk7CiAJfQogfQogCiBzdGF0aWMgaW50IGFjcGlfY2hhcmdlcl9hZGQoc3RydWN0IGFjcGlfc2JzICpzYnMpCiB7CiAJaW50IHJlc3VsdDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0geyAuZHJ2X2RhdGEgPSBzYnMsIH07CiAKIAlyZXN1bHQgPSBhY3BpX2FjX2dldF9wcmVzZW50KHNicyk7CiAJaWYgKHJlc3VsdCkKIAkJZ290byBlbmQ7CiAKIAlzYnMtPmNoYXJnZXJfZXhpc3RzID0gMTsKLQlzYnMtPmNoYXJnZXIubmFtZSA9ICJzYnMtY2hhcmdlciI7Ci0Jc2JzLT5jaGFyZ2VyLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKLQlzYnMtPmNoYXJnZXIucHJvcGVydGllcyA9IHNic19hY19wcm9wczsKLQlzYnMtPmNoYXJnZXIubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHNic19hY19wcm9wcyk7Ci0Jc2JzLT5jaGFyZ2VyLmdldF9wcm9wZXJ0eSA9IHNic19nZXRfYWNfcHJvcGVydHk7Ci0JcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZzYnMtPmRldmljZS0+ZGV2LCAmc2JzLT5jaGFyZ2VyKTsKKwlzYnMtPmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnNicy0+ZGV2aWNlLT5kZXYsCisJCQkJCSZhY3BpX3Nic19jaGFyZ2VyX2Rlc2MsICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKHNicy0+Y2hhcmdlcikpIHsKKwkJcmVzdWx0ID0gUFRSX0VSUihzYnMtPmNoYXJnZXIpOworCQlzYnMtPmNoYXJnZXIgPSBOVUxMOworCX0KIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgWyVzXTogQUMgQWRhcHRlciBbJXNdICglcylcbiIsCiAJICAgICAgIEFDUElfU0JTX0RFVklDRV9OQU1FLCBhY3BpX2RldmljZV9iaWQoc2JzLT5kZXZpY2UpLAogCSAgICAgICBBQ1BJX0FDX0RJUl9OQU1FLCBzYnMtPmNoYXJnZXJfcHJlc2VudCA/ICJvbi1saW5lIiA6ICJvZmYtbGluZSIpOwpAQCAtNTkwLDggKzYwNCw4IEBACiAKIHN0YXRpYyB2b2lkIGFjcGlfY2hhcmdlcl9yZW1vdmUoc3RydWN0IGFjcGlfc2JzICpzYnMpCiB7Ci0JaWYgKHNicy0+Y2hhcmdlci5kZXYpCi0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZzYnMtPmNoYXJnZXIpOworCWlmIChzYnMtPmNoYXJnZXIpCisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHNicy0+Y2hhcmdlcik7CiB9CiAKIHN0YXRpYyB2b2lkIGFjcGlfc2JzX2NhbGxiYWNrKHZvaWQgKmNvbnRleHQpCkBAIC02MDUsNyArNjE5LDcgQEAKIAlpZiAoc2JzLT5jaGFyZ2VyX2V4aXN0cykgewogCQlhY3BpX2FjX2dldF9wcmVzZW50KHNicyk7CiAJCWlmIChzYnMtPmNoYXJnZXJfcHJlc2VudCAhPSBzYXZlZF9jaGFyZ2VyX3N0YXRlKQotCQkJa29iamVjdF91ZXZlbnQoJnNicy0+Y2hhcmdlci5kZXYtPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwkJCWtvYmplY3RfdWV2ZW50KCZzYnMtPmNoYXJnZXItPmRldi5rb2JqLCBLT0JKX0NIQU5HRSk7CiAJfQogCiAJaWYgKHNicy0+bWFuYWdlcl9wcmVzZW50KSB7CkBAIC02MTcsNyArNjMxLDcgQEAKIAkJCWFjcGlfYmF0dGVyeV9yZWFkKGJhdCk7CiAJCQlpZiAoc2F2ZWRfYmF0dGVyeV9zdGF0ZSA9PSBiYXQtPnByZXNlbnQpCiAJCQkJY29udGludWU7Ci0JCQlrb2JqZWN0X3VldmVudCgmYmF0LT5iYXQuZGV2LT5rb2JqLCBLT0JKX0NIQU5HRSk7CisJCQlrb2JqZWN0X3VldmVudCgmYmF0LT5iYXQtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2Nhbi5jIGIvZHJpdmVycy9hY3BpL3NjYW4uYwppbmRleCBiYmNhNzgzLi42OWJjMGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2Nhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9zY2FuLmMKQEAgLTExNCw3ICsxMTQsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKKy8qKgorICogY3JlYXRlX3BucF9tb2RhbGlhcyAtIENyZWF0ZSBoaWQvY2lkKHMpIHN0cmluZyBmb3IgbW9kYWxpYXMgYW5kIHVldmVudAorICogQGFjcGlfZGV2OiBBQ1BJIGRldmljZSBvYmplY3QuCisgKiBAbW9kYWxpYXM6IEJ1ZmZlciB0byBwcmludCBpbnRvLgorICogQHNpemU6IFNpemUgb2YgdGhlIGJ1ZmZlci4KKyAqCiAgKiBDcmVhdGVzIGhpZC9jaWQocykgc3RyaW5nIG5lZWRlZCBmb3IgbW9kYWxpYXMgYW5kIHVldmVudAogICogZS5nLiBvbiBhIGRldmljZSB3aXRoIGhpZDpJQk0wMDAxIGFuZCBjaWQ6QUNQSTAwMDEgeW91IGdldDoKICAqIGNoYXIgKm1vZGFsaWFzOiAiYWNwaTpJQk0wMDAxOkFDUEkwMDAxIgpAQCAtMTIyLDY4ICsxMjcsOTggQEAKICAqICAgICAgICAgLUVJTlZBTDogb3V0cHV0IGVycm9yCiAgKiAgICAgICAgIC1FTk9NRU06IG91dHB1dCBpcyB0cnVuY2F0ZWQKICovCi1zdGF0aWMgaW50IGNyZWF0ZV9tb2RhbGlhcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2LCBjaGFyICptb2RhbGlhcywKLQkJCSAgIGludCBzaXplKQorc3RhdGljIGludCBjcmVhdGVfcG5wX21vZGFsaWFzKHN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYsIGNoYXIgKm1vZGFsaWFzLAorCQkJICAgICAgIGludCBzaXplKQogewogCWludCBsZW47CiAJaW50IGNvdW50OwogCXN0cnVjdCBhY3BpX2hhcmR3YXJlX2lkICppZDsKIAotCWlmIChsaXN0X2VtcHR5KCZhY3BpX2Rldi0+cG5wLmlkcykpCisJLyoKKwkgKiBTaW5jZSB3ZSBza2lwIFBSUDAwMDEgZnJvbSB0aGUgbW9kYWxpYXMgYmVsb3csIDAgc2hvdWxkIGJlIHJldHVybmVkCisJICogaWYgUFJQMDAwMSBpcyB0aGUgb25seSBBQ1BJL1BOUCBJRCBpbiB0aGUgZGV2aWNlJ3MgbGlzdC4KKwkgKi8KKwljb3VudCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpZCwgJmFjcGlfZGV2LT5wbnAuaWRzLCBsaXN0KQorCQlpZiAoc3RyY21wKGlkLT5pZCwgIlBSUDAwMDEiKSkKKwkJCWNvdW50Kys7CisKKwlpZiAoIWNvdW50KQogCQlyZXR1cm4gMDsKIAotCS8qCi0JICogSWYgdGhlIGRldmljZSBoYXMgUFJQMDAwMSB3ZSBleHBvc2UgRFQgY29tcGF0aWJsZSBtb2RhbGlhcwotCSAqIGluc3RlYWQgaW4gZm9ybSBvZiBvZjpObmFtZVRDY29tcGF0aWJsZS4KLQkgKi8KLQlpZiAoYWNwaV9kZXYtPmRhdGEub2ZfY29tcGF0aWJsZSkgewotCQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVmID0geyBBQ1BJX0FMTE9DQVRFX0JVRkZFUiB9OwotCQljb25zdCB1bmlvbiBhY3BpX29iamVjdCAqb2ZfY29tcGF0aWJsZSwgKm9iajsKLQkJaW50IGksIG52YWw7Ci0JCWNoYXIgKmM7CisJbGVuID0gc25wcmludGYobW9kYWxpYXMsIHNpemUsICJhY3BpOiIpOworCWlmIChsZW4gPD0gMCkKKwkJcmV0dXJuIGxlbjsKIAotCQlhY3BpX2dldF9uYW1lKGFjcGlfZGV2LT5oYW5kbGUsIEFDUElfU0lOR0xFX05BTUUsICZidWYpOwotCQkvKiBEVCBzdHJpbmdzIGFyZSBhbGwgaW4gbG93ZXIgY2FzZSAqLwotCQlmb3IgKGMgPSBidWYucG9pbnRlcjsgKmMgIT0gJ1wwJzsgYysrKQotCQkJKmMgPSB0b2xvd2VyKCpjKTsKKwlzaXplIC09IGxlbjsKIAotCQlsZW4gPSBzbnByaW50Zihtb2RhbGlhcywgc2l6ZSwgIm9mOk4lc1QiLCAoY2hhciAqKWJ1Zi5wb2ludGVyKTsKLQkJQUNQSV9GUkVFKGJ1Zi5wb2ludGVyKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlkLCAmYWNwaV9kZXYtPnBucC5pZHMsIGxpc3QpIHsKKwkJaWYgKCFzdHJjbXAoaWQtPmlkLCAiUFJQMDAwMSIpKQorCQkJY29udGludWU7CiAKLQkJb2ZfY29tcGF0aWJsZSA9IGFjcGlfZGV2LT5kYXRhLm9mX2NvbXBhdGlibGU7Ci0JCWlmIChvZl9jb21wYXRpYmxlLT50eXBlID09IEFDUElfVFlQRV9QQUNLQUdFKSB7Ci0JCQludmFsID0gb2ZfY29tcGF0aWJsZS0+cGFja2FnZS5jb3VudDsKLQkJCW9iaiA9IG9mX2NvbXBhdGlibGUtPnBhY2thZ2UuZWxlbWVudHM7Ci0JCX0gZWxzZSB7IC8qIE11c3QgYmUgQUNQSV9UWVBFX1NUUklORy4gKi8KLQkJCW52YWwgPSAxOwotCQkJb2JqID0gb2ZfY29tcGF0aWJsZTsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgbnZhbDsgaSsrLCBvYmorKykgewotCQkJY291bnQgPSBzbnByaW50ZigmbW9kYWxpYXNbbGVuXSwgc2l6ZSwgIkMlcyIsCi0JCQkJCSBvYmotPnN0cmluZy5wb2ludGVyKTsKLQkJCWlmIChjb3VudCA8IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoY291bnQgPj0gc2l6ZSkKLQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJY291bnQgPSBzbnByaW50ZigmbW9kYWxpYXNbbGVuXSwgc2l6ZSwgIiVzOiIsIGlkLT5pZCk7CisJCWlmIChjb3VudCA8IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQkJbGVuICs9IGNvdW50OwotCQkJc2l6ZSAtPSBjb3VudDsKLQkJfQotCX0gZWxzZSB7Ci0JCWxlbiA9IHNucHJpbnRmKG1vZGFsaWFzLCBzaXplLCAiYWNwaToiKTsKLQkJc2l6ZSAtPSBsZW47CisJCWlmIChjb3VudCA+PSBzaXplKQorCQkJcmV0dXJuIC1FTk9NRU07CiAKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShpZCwgJmFjcGlfZGV2LT5wbnAuaWRzLCBsaXN0KSB7Ci0JCQljb3VudCA9IHNucHJpbnRmKCZtb2RhbGlhc1tsZW5dLCBzaXplLCAiJXM6IiwgaWQtPmlkKTsKLQkJCWlmIChjb3VudCA8IDApCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpZiAoY291bnQgPj0gc2l6ZSkKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCWxlbiArPSBjb3VudDsKLQkJCXNpemUgLT0gY291bnQ7Ci0JCX0KKwkJbGVuICs9IGNvdW50OworCQlzaXplIC09IGNvdW50OwogCX0KKwltb2RhbGlhc1tsZW5dID0gJ1wwJzsKKwlyZXR1cm4gbGVuOworfQogCisvKioKKyAqIGNyZWF0ZV9vZl9tb2RhbGlhcyAtIENyZWF0ZXMgRFQgY29tcGF0aWJsZSBzdHJpbmcgZm9yIG1vZGFsaWFzIGFuZCB1ZXZlbnQKKyAqIEBhY3BpX2RldjogQUNQSSBkZXZpY2Ugb2JqZWN0LgorICogQG1vZGFsaWFzOiBCdWZmZXIgdG8gcHJpbnQgaW50by4KKyAqIEBzaXplOiBTaXplIG9mIHRoZSBidWZmZXIuCisgKgorICogRXhwb3NlIERUIGNvbXBhdGlibGUgbW9kYWxpYXMgYXMgb2Y6Tm5hbWVUQ2NvbXBhdGlibGUuICBUaGlzIGZ1bmN0aW9uIHNob3VsZAorICogb25seSBiZSBjYWxsZWQgZm9yIGRldmljZXMgaGF2aW5nIFBSUDAwMDEgaW4gdGhlaXIgbGlzdCBvZiBBQ1BJL1BOUCBJRHMuCisgKi8KK3N0YXRpYyBpbnQgY3JlYXRlX29mX21vZGFsaWFzKHN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9kZXYsIGNoYXIgKm1vZGFsaWFzLAorCQkJICAgICAgaW50IHNpemUpCit7CisJc3RydWN0IGFjcGlfYnVmZmVyIGJ1ZiA9IHsgQUNQSV9BTExPQ0FURV9CVUZGRVIgfTsKKwljb25zdCB1bmlvbiBhY3BpX29iamVjdCAqb2ZfY29tcGF0aWJsZSwgKm9iajsKKwlpbnQgbGVuLCBjb3VudDsKKwlpbnQgaSwgbnZhbDsKKwljaGFyICpjOworCisJYWNwaV9nZXRfbmFtZShhY3BpX2Rldi0+aGFuZGxlLCBBQ1BJX1NJTkdMRV9OQU1FLCAmYnVmKTsKKwkvKiBEVCBzdHJpbmdzIGFyZSBhbGwgaW4gbG93ZXIgY2FzZSAqLworCWZvciAoYyA9IGJ1Zi5wb2ludGVyOyAqYyAhPSAnXDAnOyBjKyspCisJCSpjID0gdG9sb3dlcigqYyk7CisKKwlsZW4gPSBzbnByaW50Zihtb2RhbGlhcywgc2l6ZSwgIm9mOk4lc1QiLCAoY2hhciAqKWJ1Zi5wb2ludGVyKTsKKwlBQ1BJX0ZSRUUoYnVmLnBvaW50ZXIpOworCisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4gbGVuOworCisJb2ZfY29tcGF0aWJsZSA9IGFjcGlfZGV2LT5kYXRhLm9mX2NvbXBhdGlibGU7CisJaWYgKG9mX2NvbXBhdGlibGUtPnR5cGUgPT0gQUNQSV9UWVBFX1BBQ0tBR0UpIHsKKwkJbnZhbCA9IG9mX2NvbXBhdGlibGUtPnBhY2thZ2UuY291bnQ7CisJCW9iaiA9IG9mX2NvbXBhdGlibGUtPnBhY2thZ2UuZWxlbWVudHM7CisJfSBlbHNlIHsgLyogTXVzdCBiZSBBQ1BJX1RZUEVfU1RSSU5HLiAqLworCQludmFsID0gMTsKKwkJb2JqID0gb2ZfY29tcGF0aWJsZTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG52YWw7IGkrKywgb2JqKyspIHsKKwkJY291bnQgPSBzbnByaW50ZigmbW9kYWxpYXNbbGVuXSwgc2l6ZSwgIkMlcyIsCisJCQkJIG9iai0+c3RyaW5nLnBvaW50ZXIpOworCQlpZiAoY291bnQgPCAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNvdW50ID49IHNpemUpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlsZW4gKz0gY291bnQ7CisJCXNpemUgLT0gY291bnQ7CisJfQogCW1vZGFsaWFzW2xlbl0gPSAnXDAnOwogCXJldHVybiBsZW47CiB9CkBAIC0xOTQsNyArMjI5LDggQEAKICAqCiAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZGV2aWNlIGhhcyBhbiBBQ1BJIGNvbXBhbmlvbiBhbmQgaWYgdGhhdCBjb21wYW5pb24gaGFzCiAgKiBhIHZhbGlkIGxpc3Qgb2YgUE5QIElEcywgYW5kIGlmIHRoZSBkZXZpY2UgaXMgdGhlIGZpcnN0IChwcmltYXJ5KSBwaHlzaWNhbAotICogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqIGRldmljZSBhc3NvY2lhdGVkIHdpdGggaXQuICBSZXR1cm4gdGhlIGNvbXBhbmlvbiBwb2ludGVyIGlmIHRoYXQncyB0aGUgY2FzZQorICogb3IgTlVMTCBvdGhlcndpc2UuCiAgKgogICogSWYgbXVsdGlwbGUgcGh5c2ljYWwgZGV2aWNlcyBhcmUgYXR0YWNoZWQgdG8gYSBzaW5nbGUgQUNQSSBjb21wYW5pb24sIHdlIG5lZWQKICAqIHRvIGJlIGNhcmVmdWwuICBUaGUgdXNhZ2Ugc2NlbmFyaW8gZm9yIHRoaXMga2luZCBvZiByZWxhdGlvbnNoaXAgaXMgdGhhdCBhbGwKQEAgLTIwOCwzMSArMjQ0LDY5IEBACiAgKiByZXNvdXJjZXMgYXZhaWxhYmxlIGZyb20gaXQgYnV0IHRoZXkgd2lsbCBiZSBtYXRjaGVkIG5vcm1hbGx5IHVzaW5nIGZ1bmN0aW9ucwogICogcHJvdmlkZWQgYnkgdGhlaXIgYnVzIHR5cGVzIChhbmQgYW5hbG9nb3VzbHkgZm9yIHRoZWlyIG1vZGFsaWFzKS4KICAqLwotc3RhdGljIGJvb2wgYWNwaV9jb21wYW5pb25fbWF0Y2goY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIHN0cnVjdCBhY3BpX2RldmljZSAqYWNwaV9jb21wYW5pb25fbWF0Y2goY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldjsKLQlib29sIHJldDsKKwlzdHJ1Y3QgbXV0ZXggKnBoeXNpY2FsX25vZGVfbG9jazsKIAogCWFkZXYgPSBBQ1BJX0NPTVBBTklPTihkZXYpOwogCWlmICghYWRldikKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gTlVMTDsKIAogCWlmIChsaXN0X2VtcHR5KCZhZGV2LT5wbnAuaWRzKSkKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gTlVMTDsKIAotCW11dGV4X2xvY2soJmFkZXYtPnBoeXNpY2FsX25vZGVfbG9jayk7CisJcGh5c2ljYWxfbm9kZV9sb2NrID0gJmFkZXYtPnBoeXNpY2FsX25vZGVfbG9jazsKKwltdXRleF9sb2NrKHBoeXNpY2FsX25vZGVfbG9jayk7CiAJaWYgKGxpc3RfZW1wdHkoJmFkZXYtPnBoeXNpY2FsX25vZGVfbGlzdCkpIHsKLQkJcmV0ID0gZmFsc2U7CisJCWFkZXYgPSBOVUxMOwogCX0gZWxzZSB7CiAJCWNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9waHlzaWNhbF9ub2RlICpub2RlOwogCiAJCW5vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZhZGV2LT5waHlzaWNhbF9ub2RlX2xpc3QsCiAJCQkJCXN0cnVjdCBhY3BpX2RldmljZV9waHlzaWNhbF9ub2RlLCBub2RlKTsKLQkJcmV0ID0gbm9kZS0+ZGV2ID09IGRldjsKKwkJaWYgKG5vZGUtPmRldiAhPSBkZXYpCisJCQlhZGV2ID0gTlVMTDsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZhZGV2LT5waHlzaWNhbF9ub2RlX2xvY2spOworCW11dGV4X3VubG9jayhwaHlzaWNhbF9ub2RlX2xvY2spOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gYWRldjsKK30KKworc3RhdGljIGludCBfX2FjcGlfZGV2aWNlX3VldmVudF9tb2RhbGlhcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCisJCQkJCSBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCit7CisJaW50IGxlbjsKKworCWlmICghYWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAobGlzdF9lbXB0eSgmYWRldi0+cG5wLmlkcykpCisJCXJldHVybiAwOworCisJaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPSIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IGNyZWF0ZV9wbnBfbW9kYWxpYXMoYWRldiwgJmVudi0+YnVmW2Vudi0+YnVmbGVuIC0gMV0sCisJCQkJICBzaXplb2YoZW52LT5idWYpIC0gZW52LT5idWZsZW4pOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gbGVuOworCisJZW52LT5idWZsZW4gKz0gbGVuOworCWlmICghYWRldi0+ZGF0YS5vZl9jb21wYXRpYmxlKQorCQlyZXR1cm4gMDsKKworCWlmIChsZW4gPiAwICYmIGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPSIpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IGNyZWF0ZV9vZl9tb2RhbGlhcyhhZGV2LCAmZW52LT5idWZbZW52LT5idWZsZW4gLSAxXSwKKwkJCQkgc2l6ZW9mKGVudi0+YnVmKSAtIGVudi0+YnVmbGVuKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIGxlbjsKKworCWVudi0+YnVmbGVuICs9IGxlbjsKKworCXJldHVybiAwOwogfQogCiAvKgpAQCAtMjQzLDIyICszMTcsNDEgQEAKICAqLwogaW50IGFjcGlfZGV2aWNlX3VldmVudF9tb2RhbGlhcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudikKIHsKLQlpbnQgbGVuOwotCi0JaWYgKCFhY3BpX2NvbXBhbmlvbl9tYXRjaChkZXYpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmIChhZGRfdWV2ZW50X3ZhcihlbnYsICJNT0RBTElBUz0iKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JbGVuID0gY3JlYXRlX21vZGFsaWFzKEFDUElfQ09NUEFOSU9OKGRldiksICZlbnYtPmJ1ZltlbnYtPmJ1ZmxlbiAtIDFdLAotCQkJCXNpemVvZihlbnYtPmJ1ZikgLSBlbnYtPmJ1Zmxlbik7Ci0JaWYgKGxlbiA8PSAwKQotCQlyZXR1cm4gbGVuOwotCWVudi0+YnVmbGVuICs9IGxlbjsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gX19hY3BpX2RldmljZV91ZXZlbnRfbW9kYWxpYXMoYWNwaV9jb21wYW5pb25fbWF0Y2goZGV2KSwgZW52KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFjcGlfZGV2aWNlX3VldmVudF9tb2RhbGlhcyk7CiAKK3N0YXRpYyBpbnQgX19hY3BpX2RldmljZV9tb2RhbGlhcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisJaW50IGxlbiwgY291bnQ7CisKKwlpZiAoIWFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGxpc3RfZW1wdHkoJmFkZXYtPnBucC5pZHMpKQorCQlyZXR1cm4gMDsKKworCWxlbiA9IGNyZWF0ZV9wbnBfbW9kYWxpYXMoYWRldiwgYnVmLCBzaXplIC0gMSk7CisJaWYgKGxlbiA8IDApIHsKKwkJcmV0dXJuIGxlbjsKKwl9IGVsc2UgaWYgKGxlbiA+IDApIHsKKwkJYnVmW2xlbisrXSA9ICdcbic7CisJCXNpemUgLT0gbGVuOworCX0KKwlpZiAoIWFkZXYtPmRhdGEub2ZfY29tcGF0aWJsZSkKKwkJcmV0dXJuIGxlbjsKKworCWNvdW50ID0gY3JlYXRlX29mX21vZGFsaWFzKGFkZXYsIGJ1ZiArIGxlbiwgc2l6ZSAtIDEpOworCWlmIChjb3VudCA8IDApIHsKKwkJcmV0dXJuIGNvdW50OworCX0gZWxzZSBpZiAoY291bnQgPiAwKSB7CisJCWxlbiArPSBjb3VudDsKKwkJYnVmW2xlbisrXSA9ICdcbic7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKwogLyoKICAqIENyZWF0ZXMgbW9kYWxpYXMgc3lzZnMgYXR0cmlidXRlIGZvciBBQ1BJIGVudW1lcmF0ZWQgZGV2aWNlcy4KICAqIEJlY2F1c2UgdGhlIG90aGVyIGJ1c2VzIGRvZXMgbm90IHN1cHBvcnQgQUNQSSBISURzICYgQ0lEcy4KQEAgLTI2NywyOSArMzYwLDEzIEBACiAgKi8KIGludCBhY3BpX2RldmljZV9tb2RhbGlhcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZiwgaW50IHNpemUpCiB7Ci0JaW50IGxlbjsKLQotCWlmICghYWNwaV9jb21wYW5pb25fbWF0Y2goZGV2KSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlsZW4gPSBjcmVhdGVfbW9kYWxpYXMoQUNQSV9DT01QQU5JT04oZGV2KSwgYnVmLCBzaXplIC0xKTsKLQlpZiAobGVuIDw9IDApCi0JCXJldHVybiBsZW47Ci0JYnVmW2xlbisrXSA9ICdcbic7Ci0JcmV0dXJuIGxlbjsKKwlyZXR1cm4gX19hY3BpX2RldmljZV9tb2RhbGlhcyhhY3BpX2NvbXBhbmlvbl9tYXRjaChkZXYpLCBidWYsIHNpemUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYWNwaV9kZXZpY2VfbW9kYWxpYXMpOwogCiBzdGF0aWMgc3NpemVfdAogYWNwaV9kZXZpY2VfbW9kYWxpYXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFjcGlfZGV2ID0gdG9fYWNwaV9kZXZpY2UoZGV2KTsKLQlpbnQgbGVuOwotCi0JbGVuID0gY3JlYXRlX21vZGFsaWFzKGFjcGlfZGV2LCBidWYsIDEwMjQpOwotCWlmIChsZW4gPD0gMCkKLQkJcmV0dXJuIGxlbjsKLQlidWZbbGVuKytdID0gJ1xuJzsKLQlyZXR1cm4gbGVuOworCXJldHVybiBfX2FjcGlfZGV2aWNlX21vZGFsaWFzKHRvX2FjcGlfZGV2aWNlKGRldiksIGJ1ZiwgMTAyNCk7CiB9CiBzdGF0aWMgREVWSUNFX0FUVFIobW9kYWxpYXMsIDA0NDQsIGFjcGlfZGV2aWNlX21vZGFsaWFzX3Nob3csIE5VTEwpOwogCkBAIC04OTQsOCArOTcxLDUxIEBACiAJCQlBQ1BJIEJ1cyBvcGVyYXRpb25zCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCisvKioKKyAqIGFjcGlfb2ZfbWF0Y2hfZGV2aWNlIC0gTWF0Y2ggZGV2aWNlIG9iamVjdCB1c2luZyB0aGUgImNvbXBhdGlibGUiIHByb3BlcnR5LgorICogQGFkZXY6IEFDUEkgZGV2aWNlIG9iamVjdCB0byBtYXRjaC4KKyAqIEBvZl9tYXRjaF90YWJsZTogTGlzdCBvZiBkZXZpY2UgSURzIHRvIG1hdGNoIGFnYWluc3QuCisgKgorICogSWYgQGRldiBoYXMgYW4gQUNQSSBjb21wYW5pb24gd2hpY2ggaGFzIHRoZSBzcGVjaWFsIFBSUDAwMDEgZGV2aWNlIElEIGluIGl0cworICogbGlzdCBvZiBpZGVudGlmaWVycyBhbmQgYSBfRFNEIG9iamVjdCB3aXRoIHRoZSAiY29tcGF0aWJsZSIgcHJvcGVydHksIHVzZQorICogdGhhdCBwcm9wZXJ0eSB0byBtYXRjaCBhZ2FpbnN0IHRoZSBnaXZlbiBsaXN0IG9mIGlkZW50aWZpZXJzLgorICovCitzdGF0aWMgYm9vbCBhY3BpX29mX21hdGNoX2RldmljZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCisJCQkJIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX21hdGNoX3RhYmxlKQoreworCWNvbnN0IHVuaW9uIGFjcGlfb2JqZWN0ICpvZl9jb21wYXRpYmxlLCAqb2JqOworCWludCBpLCBudmFsOworCisJaWYgKCFhZGV2KQorCQlyZXR1cm4gZmFsc2U7CisKKwlvZl9jb21wYXRpYmxlID0gYWRldi0+ZGF0YS5vZl9jb21wYXRpYmxlOworCWlmICghb2ZfbWF0Y2hfdGFibGUgfHwgIW9mX2NvbXBhdGlibGUpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChvZl9jb21wYXRpYmxlLT50eXBlID09IEFDUElfVFlQRV9QQUNLQUdFKSB7CisJCW52YWwgPSBvZl9jb21wYXRpYmxlLT5wYWNrYWdlLmNvdW50OworCQlvYmogPSBvZl9jb21wYXRpYmxlLT5wYWNrYWdlLmVsZW1lbnRzOworCX0gZWxzZSB7IC8qIE11c3QgYmUgQUNQSV9UWVBFX1NUUklORy4gKi8KKwkJbnZhbCA9IDE7CisJCW9iaiA9IG9mX2NvbXBhdGlibGU7CisJfQorCS8qIE5vdyB3ZSBjYW4gbG9vayBmb3IgdGhlIGRyaXZlciBEVCBjb21wYXRpYmxlIHN0cmluZ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnZhbDsgaSsrLCBvYmorKykgeworCQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICppZDsKKworCQlmb3IgKGlkID0gb2ZfbWF0Y2hfdGFibGU7IGlkLT5jb21wYXRpYmxlWzBdOyBpZCsrKQorCQkJaWYgKCFzdHJjYXNlY21wKG9iai0+c3RyaW5nLnBvaW50ZXIsIGlkLT5jb21wYXRpYmxlKSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKl9fYWNwaV9tYXRjaF9kZXZpY2UoCi0Jc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaWRzKQorCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLAorCWNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaWRzLAorCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkcykKIHsKIAljb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmlkOwogCXN0cnVjdCBhY3BpX2hhcmR3YXJlX2lkICpod2lkOwpAQCAtOTA0LDE0ICsxMDI0LDI3IEBACiAJICogSWYgdGhlIGRldmljZSBpcyBub3QgcHJlc2VudCwgaXQgaXMgdW5uZWNlc3NhcnkgdG8gbG9hZCBkZXZpY2UKIAkgKiBkcml2ZXIgZm9yIGl0LgogCSAqLwotCWlmICghZGV2aWNlLT5zdGF0dXMucHJlc2VudCkKKwlpZiAoIWRldmljZSB8fCAhZGV2aWNlLT5zdGF0dXMucHJlc2VudCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlmb3IgKGlkID0gaWRzOyBpZC0+aWRbMF07IGlkKyspCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkoaHdpZCwgJmRldmljZS0+cG5wLmlkcywgbGlzdCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGh3aWQsICZkZXZpY2UtPnBucC5pZHMsIGxpc3QpIHsKKwkJLyogRmlyc3QsIGNoZWNrIHRoZSBBQ1BJL1BOUCBJRHMgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4gKi8KKwkJZm9yIChpZCA9IGlkczsgaWQtPmlkWzBdOyBpZCsrKQogCQkJaWYgKCFzdHJjbXAoKGNoYXIgKikgaWQtPmlkLCBod2lkLT5pZCkpCiAJCQkJcmV0dXJuIGlkOwogCisJCS8qCisJCSAqIE5leHQsIGNoZWNrIHRoZSBzcGVjaWFsICJQUlAwMDAxIiBJRCBhbmQgdHJ5IHRvIG1hdGNoIHRoZQorCQkgKiAiY29tcGF0aWJsZSIgcHJvcGVydHkgaWYgZm91bmQuCisJCSAqCisJCSAqIFRoZSBpZCByZXR1cm5lZCBieSB0aGUgYmVsb3cgaXMgbm90IHZhbGlkLCBidXQgdGhlIG9ubHkKKwkJICogY2FsbGVyIHBhc3Npbmcgbm9uLU5VTEwgb2ZfaWRzIGhlcmUgaXMgb25seSBpbnRlcmVzdGVkIGluCisJCSAqIHdoZXRoZXIgb3Igbm90IHRoZSByZXR1cm4gdmFsdWUgaXMgTlVMTC4KKwkJICovCisJCWlmICghc3RyY21wKCJQUlAwMDAxIiwgaHdpZC0+aWQpCisJCSAgICAmJiBhY3BpX29mX21hdGNoX2RldmljZShkZXZpY2UsIG9mX2lkcykpCisJCQlyZXR1cm4gaWQ7CisJfQogCXJldHVybiBOVUxMOwogfQogCkBAIC05MjksNjggKzEwNjIsMjYgQEAKIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqYWNwaV9tYXRjaF9kZXZpY2UoY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZHMsCiAJCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphZGV2OwotCWFjcGlfaGFuZGxlIGhhbmRsZSA9IEFDUElfSEFORExFKGRldik7Ci0KLQlpZiAoIWlkcyB8fCAhaGFuZGxlIHx8IGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmYWRldikpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKCFhY3BpX2NvbXBhbmlvbl9tYXRjaChkZXYpKQotCQlyZXR1cm4gTlVMTDsKLQotCXJldHVybiBfX2FjcGlfbWF0Y2hfZGV2aWNlKGFkZXYsIGlkcyk7CisJcmV0dXJuIF9fYWNwaV9tYXRjaF9kZXZpY2UoYWNwaV9jb21wYW5pb25fbWF0Y2goZGV2KSwgaWRzLCBOVUxMKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFjcGlfbWF0Y2hfZGV2aWNlKTsKIAogaW50IGFjcGlfbWF0Y2hfZGV2aWNlX2lkcyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwKIAkJCSAgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZHMpCiB7Ci0JcmV0dXJuIF9fYWNwaV9tYXRjaF9kZXZpY2UoZGV2aWNlLCBpZHMpID8gMCA6IC1FTk9FTlQ7CisJcmV0dXJuIF9fYWNwaV9tYXRjaF9kZXZpY2UoZGV2aWNlLCBpZHMsIE5VTEwpID8gMCA6IC1FTk9FTlQ7CiB9CiBFWFBPUlRfU1lNQk9MKGFjcGlfbWF0Y2hfZGV2aWNlX2lkcyk7CiAKLS8qIFBlcmZvcm1zIG1hdGNoIGFnYWluc3Qgc3BlY2lhbCAiUFJQMDAwMSIgc2hvZWhvcm4gQUNQSSBJRCAqLwotc3RhdGljIGJvb2wgYWNwaV9vZl9kcml2ZXJfbWF0Y2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJY29uc3Qgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKLXsKLQljb25zdCB1bmlvbiBhY3BpX29iamVjdCAqb2ZfY29tcGF0aWJsZSwgKm9iajsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXY7Ci0JaW50IGksIG52YWw7Ci0KLQlhZGV2ID0gQUNQSV9DT01QQU5JT04oZGV2KTsKLQlpZiAoIWFkZXYpCi0JCXJldHVybiBmYWxzZTsKLQotCW9mX2NvbXBhdGlibGUgPSBhZGV2LT5kYXRhLm9mX2NvbXBhdGlibGU7Ci0JaWYgKCFkcnYtPm9mX21hdGNoX3RhYmxlIHx8ICFvZl9jb21wYXRpYmxlKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlpZiAob2ZfY29tcGF0aWJsZS0+dHlwZSA9PSBBQ1BJX1RZUEVfUEFDS0FHRSkgewotCQludmFsID0gb2ZfY29tcGF0aWJsZS0+cGFja2FnZS5jb3VudDsKLQkJb2JqID0gb2ZfY29tcGF0aWJsZS0+cGFja2FnZS5lbGVtZW50czsKLQl9IGVsc2UgeyAvKiBNdXN0IGJlIEFDUElfVFlQRV9TVFJJTkcuICovCi0JCW52YWwgPSAxOwotCQlvYmogPSBvZl9jb21wYXRpYmxlOwotCX0KLQkvKiBOb3cgd2UgY2FuIGxvb2sgZm9yIHRoZSBkcml2ZXIgRFQgY29tcGF0aWJsZSBzdHJpbmdzICovCi0JZm9yIChpID0gMDsgaSA8IG52YWw7IGkrKywgb2JqKyspIHsKLQkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqaWQ7Ci0KLQkJZm9yIChpZCA9IGRydi0+b2ZfbWF0Y2hfdGFibGU7IGlkLT5jb21wYXRpYmxlWzBdOyBpZCsrKQotCQkJaWYgKCFzdHJjYXNlY21wKG9iai0+c3RyaW5nLnBvaW50ZXIsIGlkLT5jb21wYXRpYmxlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KIGJvb2wgYWNwaV9kcml2ZXJfbWF0Y2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCiB7CiAJaWYgKCFkcnYtPmFjcGlfbWF0Y2hfdGFibGUpCi0JCXJldHVybiBhY3BpX29mX2RyaXZlcl9tYXRjaF9kZXZpY2UoZGV2LCBkcnYpOworCQlyZXR1cm4gYWNwaV9vZl9tYXRjaF9kZXZpY2UoQUNQSV9DT01QQU5JT04oZGV2KSwKKwkJCQkJICAgIGRydi0+b2ZfbWF0Y2hfdGFibGUpOwogCi0JcmV0dXJuICEhYWNwaV9tYXRjaF9kZXZpY2UoZHJ2LT5hY3BpX21hdGNoX3RhYmxlLCBkZXYpOworCXJldHVybiAhIV9fYWNwaV9tYXRjaF9kZXZpY2UoYWNwaV9jb21wYW5pb25fbWF0Y2goZGV2KSwKKwkJCQkgICAgIGRydi0+YWNwaV9tYXRjaF90YWJsZSwgZHJ2LT5vZl9tYXRjaF90YWJsZSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhY3BpX2RyaXZlcl9tYXRjaF9kZXZpY2UpOwogCkBAIC0xMDMxLDIwICsxMTIyLDcgQEAKIAogc3RhdGljIGludCBhY3BpX2RldmljZV91ZXZlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYpCiB7Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX2RldiA9IHRvX2FjcGlfZGV2aWNlKGRldik7Ci0JaW50IGxlbjsKLQotCWlmIChsaXN0X2VtcHR5KCZhY3BpX2Rldi0+cG5wLmlkcykpCi0JCXJldHVybiAwOwotCi0JaWYgKGFkZF91ZXZlbnRfdmFyKGVudiwgIk1PREFMSUFTPSIpKQotCQlyZXR1cm4gLUVOT01FTTsKLQlsZW4gPSBjcmVhdGVfbW9kYWxpYXMoYWNwaV9kZXYsICZlbnYtPmJ1ZltlbnYtPmJ1ZmxlbiAtIDFdLAotCQkJICAgICAgc2l6ZW9mKGVudi0+YnVmKSAtIGVudi0+YnVmbGVuKTsKLQlpZiAobGVuIDw9IDApCi0JCXJldHVybiBsZW47Ci0JZW52LT5idWZsZW4gKz0gbGVuOwotCXJldHVybiAwOworCXJldHVybiBfX2FjcGlfZGV2aWNlX3VldmVudF9tb2RhbGlhcyh0b19hY3BpX2RldmljZShkZXYpLCBlbnYpOwogfQogCiBzdGF0aWMgdm9pZCBhY3BpX2RldmljZV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpCkBAIC0xMDYyLDEwICsxMTQwLDEwIEBACiAJYWNwaV9kZXZpY2Vfbm90aWZ5KE5VTEwsIEFDUElfRklYRURfSEFSRFdBUkVfRVZFTlQsIGRldmljZSk7CiB9CiAKLXN0YXRpYyBhY3BpX3N0YXR1cyBhY3BpX2RldmljZV9maXhlZF9ldmVudCh2b2lkICpkYXRhKQorc3RhdGljIHUzMiBhY3BpX2RldmljZV9maXhlZF9ldmVudCh2b2lkICpkYXRhKQogewogCWFjcGlfb3NfZXhlY3V0ZShPU0xfTk9USUZZX0hBTkRMRVIsIGFjcGlfZGV2aWNlX25vdGlmeV9maXhlZCwgZGF0YSk7Ci0JcmV0dXJuIEFFX09LOworCXJldHVybiBBQ1BJX0lOVEVSUlVQVF9IQU5ETEVEOwogfQogCiBzdGF0aWMgaW50IGFjcGlfZGV2aWNlX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC5jCmluZGV4IDdmMjUxZGQuLjJmMGQ0ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC5jCkBAIC02MjksNiArNjI5LDcgQEAKIAogc3RhdGljIGludCBhY3BpX2ZyZWV6ZV9wcmVwYXJlKHZvaWQpCiB7CisJYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZXMoQUNQSV9TVEFURV9TMCk7CiAJYWNwaV9lbmFibGVfYWxsX3dha2V1cF9ncGVzKCk7CiAJYWNwaV9vc193YWl0X2V2ZW50c19jb21wbGV0ZSgpOwogCWVuYWJsZV9pcnFfd2FrZShhY3BpX2dibF9GQURULnNjaV9pbnRlcnJ1cHQpOwpAQCAtNjM3LDYgKzYzOCw3IEBACiAKIHN0YXRpYyB2b2lkIGFjcGlfZnJlZXplX3Jlc3RvcmUodm9pZCkKIHsKKwlhY3BpX2Rpc2FibGVfd2FrZXVwX2RldmljZXMoQUNQSV9TVEFURV9TMCk7CiAJZGlzYWJsZV9pcnFfd2FrZShhY3BpX2dibF9GQURULnNjaV9pbnRlcnJ1cHQpOwogCWFjcGlfZW5hYmxlX2FsbF9ydW50aW1lX2dwZXMoKTsKIH0KQEAgLTgwNiwyMSArODA4LDYgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3NsZWVwX2hpYmVybmF0ZV9zZXR1cCh2b2lkKSB7fQogI2VuZGlmIC8qICFDT05GSUdfSElCRVJOQVRJT04gKi8KIAotaW50IGFjcGlfc3VzcGVuZCh1MzIgYWNwaV9zdGF0ZSkKLXsKLQlzdXNwZW5kX3N0YXRlX3Qgc3RhdGVzW10gPSB7Ci0JCVsxXSA9IFBNX1NVU1BFTkRfU1RBTkRCWSwKLQkJWzNdID0gUE1fU1VTUEVORF9NRU0sCi0JCVs1XSA9IFBNX1NVU1BFTkRfTUFYCi0JfTsKLQotCWlmIChhY3BpX3N0YXRlIDwgNiAmJiBzdGF0ZXNbYWNwaV9zdGF0ZV0pCi0JCXJldHVybiBwbV9zdXNwZW5kKHN0YXRlc1thY3BpX3N0YXRlXSk7Ci0JaWYgKGFjcGlfc3RhdGUgPT0gNCkKLQkJcmV0dXJuIGhpYmVybmF0ZSgpOwotCXJldHVybiAtRUlOVkFMOwotfQotCiBzdGF0aWMgdm9pZCBhY3BpX3Bvd2VyX29mZl9wcmVwYXJlKHZvaWQpCiB7CiAJLyogUHJlcGFyZSB0byBwb3dlciBvZmYgdGhlIHN5c3RlbSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3NsZWVwLmggYi9kcml2ZXJzL2FjcGkvc2xlZXAuaAppbmRleCAwMTQzNTQwLi5jNzk3ZmZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2xlZXAuaAorKysgYi9kcml2ZXJzL2FjcGkvc2xlZXAuaApAQCAtMSw2ICsxLDQgQEAKIAotZXh0ZXJuIGludCBhY3BpX3N1c3BlbmQodTMyIHN0YXRlKTsKLQogZXh0ZXJuIHZvaWQgYWNwaV9lbmFibGVfd2FrZXVwX2RldmljZXModTggc2xlZXBfc3RhdGUpOwogZXh0ZXJuIHZvaWQgYWNwaV9kaXNhYmxlX3dha2V1cF9kZXZpY2VzKHU4IHNsZWVwX3N0YXRlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMgYi9kcml2ZXJzL2FjcGkvc3lzZnMuYwppbmRleCAxM2U1NzdjLi4wODc2ZDc3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9hY3BpL3N5c2ZzLmMKQEAgLTUyNyw3ICs1MjcsNyBAQAogCSAgICBhY3BpX2lycV9ub3RfaGFuZGxlZDsKIAlhbGxfY291bnRlcnNbbnVtX2dwZXMgKyBBQ1BJX05VTV9GSVhFRF9FVkVOVFMgKyBDT1VOVF9HUEVdLmNvdW50ID0KIAkgICAgYWNwaV9ncGVfY291bnQ7Ci0Jc2l6ZSA9IHNwcmludGYoYnVmLCAiJThkIiwgYWxsX2NvdW50ZXJzW2luZGV4XS5jb3VudCk7CisJc2l6ZSA9IHNwcmludGYoYnVmLCAiJTh1IiwgYWxsX2NvdW50ZXJzW2luZGV4XS5jb3VudCk7CiAKIAkvKiAiZ3BlX2FsbCIgb3IgInNjaSIgKi8KIAlpZiAoaW5kZXggPj0gbnVtX2dwZXMgKyBBQ1BJX05VTV9GSVhFRF9FVkVOVFMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdmlkZW8uYyBiL2RyaXZlcnMvYWNwaS92aWRlby5jCmluZGV4IDI2ZWI3MGMuLmNjNzlkM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS92aWRlby5jCisrKyBiL2RyaXZlcnMvYWNwaS92aWRlby5jCkBAIC04Miw5ICs4MiwxNSBAQAogICogRm9yIFdpbmRvd3MgOCBzeXN0ZW1zOiB1c2VkIHRvIGRlY2lkZSBpZiB2aWRlbyBtb2R1bGUKICAqIHNob3VsZCBza2lwIHJlZ2lzdGVyaW5nIGJhY2tsaWdodCBpbnRlcmZhY2Ugb2YgaXRzIG93bi4KICAqLwotc3RhdGljIGludCB1c2VfbmF0aXZlX2JhY2tsaWdodF9wYXJhbSA9IC0xOworZW51bSB7CisJTkFUSVZFX0JBQ0tMSUdIVF9OT1RfU0VUID0gLTEsCisJTkFUSVZFX0JBQ0tMSUdIVF9PRkYsCisJTkFUSVZFX0JBQ0tMSUdIVF9PTiwKK307CisKK3N0YXRpYyBpbnQgdXNlX25hdGl2ZV9iYWNrbGlnaHRfcGFyYW0gPSBOQVRJVkVfQkFDS0xJR0hUX05PVF9TRVQ7CiBtb2R1bGVfcGFyYW1fbmFtZWQodXNlX25hdGl2ZV9iYWNrbGlnaHQsIHVzZV9uYXRpdmVfYmFja2xpZ2h0X3BhcmFtLCBpbnQsIDA0NDQpOwotc3RhdGljIGJvb2wgdXNlX25hdGl2ZV9iYWNrbGlnaHRfZG1pID0gdHJ1ZTsKK3N0YXRpYyBpbnQgdXNlX25hdGl2ZV9iYWNrbGlnaHRfZG1pID0gTkFUSVZFX0JBQ0tMSUdIVF9OT1RfU0VUOwogCiBzdGF0aWMgaW50IHJlZ2lzdGVyX2NvdW50Owogc3RhdGljIHN0cnVjdCBtdXRleCB2aWRlb19saXN0X2xvY2s7CkBAIC0yMzcsMTUgKzI0MywxNiBAQAogCiBzdGF0aWMgYm9vbCBhY3BpX3ZpZGVvX3VzZV9uYXRpdmVfYmFja2xpZ2h0KHZvaWQpCiB7Ci0JaWYgKHVzZV9uYXRpdmVfYmFja2xpZ2h0X3BhcmFtICE9IC0xKQorCWlmICh1c2VfbmF0aXZlX2JhY2tsaWdodF9wYXJhbSAhPSBOQVRJVkVfQkFDS0xJR0hUX05PVF9TRVQpCiAJCXJldHVybiB1c2VfbmF0aXZlX2JhY2tsaWdodF9wYXJhbTsKLQllbHNlCisJZWxzZSBpZiAodXNlX25hdGl2ZV9iYWNrbGlnaHRfZG1pICE9IE5BVElWRV9CQUNLTElHSFRfTk9UX1NFVCkKIAkJcmV0dXJuIHVzZV9uYXRpdmVfYmFja2xpZ2h0X2RtaTsKKwlyZXR1cm4gYWNwaV9vc2lfaXNfd2luOCgpOwogfQogCiBib29sIGFjcGlfdmlkZW9fdmVyaWZ5X2JhY2tsaWdodF9zdXBwb3J0KHZvaWQpCiB7Ci0JaWYgKGFjcGlfb3NpX2lzX3dpbjgoKSAmJiBhY3BpX3ZpZGVvX3VzZV9uYXRpdmVfYmFja2xpZ2h0KCkgJiYKKwlpZiAoYWNwaV92aWRlb191c2VfbmF0aXZlX2JhY2tsaWdodCgpICYmCiAJICAgIGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXJlZChCQUNLTElHSFRfUkFXKSkKIAkJcmV0dXJuIGZhbHNlOwogCXJldHVybiBhY3BpX3ZpZGVvX2JhY2tsaWdodF9zdXBwb3J0KCk7CkBAIC00MTQsNyArNDIxLDEzIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHZpZGVvX2Rpc2FibGVfbmF0aXZlX2JhY2tsaWdodChjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqZCkKIHsKLQl1c2VfbmF0aXZlX2JhY2tsaWdodF9kbWkgPSBmYWxzZTsKKwl1c2VfbmF0aXZlX2JhY2tsaWdodF9kbWkgPSBOQVRJVkVfQkFDS0xJR0hUX09GRjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgdmlkZW9fZW5hYmxlX25hdGl2ZV9iYWNrbGlnaHQoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJdXNlX25hdGl2ZV9iYWNrbGlnaHRfZG1pID0gTkFUSVZFX0JBQ0tMSUdIVF9PTjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTU5LDYgKzU3MiwxNyBAQAogCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlhQUyBMNTIxWCIpLAogCQl9LAogCX0sCisKKwkvKiBOb24gd2luOCBtYWNoaW5lcyB3aGljaCBuZWVkIG5hdGl2ZSBiYWNrbGlnaHQgbmV2ZXJ0aGVsZXNzICovCisJeworCSAvKiBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTExODcwMDQgKi8KKwkgLmNhbGxiYWNrID0gdmlkZW9fZW5hYmxlX25hdGl2ZV9iYWNrbGlnaHQsCisJIC5pZGVudCA9ICJMZW5vdm8gSWRlYXBhZCBaNTcwIiwKKwkgLm1hdGNoZXMgPSB7CisJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkxFTk9WTyIpLAorCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIjEwMjQzNFUiKSwKKwkJfSwKKwl9LAogCXt9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMgYi9kcml2ZXJzL2FjcGkvdmlkZW9fZGV0ZWN0LmMKaW5kZXggMjdjNDM0OS4uYzQyZmViMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3ZpZGVvX2RldGVjdC5jCisrKyBiL2RyaXZlcnMvYWNwaS92aWRlb19kZXRlY3QuYwpAQCAtMTc0LDE0ICsxNzQsNiBAQAogCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkluc3Bpcm9uIDU3MzciKSwKIAkJfSwKIAl9LAotCXsKLQkuY2FsbGJhY2sgPSB2aWRlb19kZXRlY3RfZm9yY2VfdmVuZG9yLAotCS5pZGVudCA9ICJMZW5vdm8gSWRlYVBhZCBaNTcwIiwKLQkubWF0Y2hlcyA9IHsKLQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiTEVOT1ZPIiksCi0JCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiSWRlYXBhZCBaNTcwIiksCi0JCX0sCi0JfSwKIAl7IH0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FtYmEvdGVncmEtYWhiLmMgYi9kcml2ZXJzL2FtYmEvdGVncmEtYWhiLmMKaW5kZXggYzZkYzM1NC4uYjBiNjg4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hbWJhL3RlZ3JhLWFoYi5jCisrKyBiL2RyaXZlcnMvYW1iYS90ZWdyYS1haGIuYwpAQCAtMjUsNDkgKzI1LDUwIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogCiAjaW5jbHVkZSA8c29jL3RlZ3JhL2FoYi5oPgogCiAjZGVmaW5lIERSVl9OQU1FICJ0ZWdyYS1haGIiCiAKLSNkZWZpbmUgQUhCX0FSQklUUkFUSU9OX0RJU0FCTEUJCTB4MDAKLSNkZWZpbmUgQUhCX0FSQklUUkFUSU9OX1BSSU9SSVRZX0NUUkwJMHgwNAorI2RlZmluZSBBSEJfQVJCSVRSQVRJT05fRElTQUJMRQkJMHgwNAorI2RlZmluZSBBSEJfQVJCSVRSQVRJT05fUFJJT1JJVFlfQ1RSTAkweDA4CiAjZGVmaW5lICAgQUhCX1BSSU9SSVRZX1dFSUdIVCh4KQkoKCh4KSAmIDB4NykgPDwgMjkpCiAjZGVmaW5lICAgUFJJT1JJVFlfU0VMRUNUX1VTQiBCSVQoNikKICNkZWZpbmUgICBQUklPUklUWV9TRUxFQ1RfVVNCMiBCSVQoMTgpCiAjZGVmaW5lICAgUFJJT1JJVFlfU0VMRUNUX1VTQjMgQklUKDE3KQogCi0jZGVmaW5lIEFIQl9HSVpNT19BSEJfTUVNCQkweDBjCisjZGVmaW5lIEFIQl9HSVpNT19BSEJfTUVNCQkweDEwCiAjZGVmaW5lICAgRU5CX0ZBU1RfUkVBUkJJVFJBVEUgQklUKDIpCiAjZGVmaW5lICAgRE9OVF9TUExJVF9BSEJfV1IgICAgIEJJVCg3KQogCi0jZGVmaW5lIEFIQl9HSVpNT19BUEJfRE1BCQkweDEwCi0jZGVmaW5lIEFIQl9HSVpNT19JREUJCQkweDE4Ci0jZGVmaW5lIEFIQl9HSVpNT19VU0IJCQkweDFjCi0jZGVmaW5lIEFIQl9HSVpNT19BSEJfWEJBUl9CUklER0UJMHgyMAotI2RlZmluZSBBSEJfR0laTU9fQ1BVX0FIQl9CUklER0UJMHgyNAotI2RlZmluZSBBSEJfR0laTU9fQ09QX0FIQl9CUklER0UJMHgyOAotI2RlZmluZSBBSEJfR0laTU9fWEJBUl9BUEJfQ1RMUgkJMHgyYwotI2RlZmluZSBBSEJfR0laTU9fVkNQX0FIQl9CUklER0UJMHgzMAotI2RlZmluZSBBSEJfR0laTU9fTkFORAkJCTB4M2MKLSNkZWZpbmUgQUhCX0dJWk1PX1NETU1DNAkJMHg0NAotI2RlZmluZSBBSEJfR0laTU9fWElPCQkJMHg0OAotI2RlZmluZSBBSEJfR0laTU9fQlNFVgkJCTB4NjAKLSNkZWZpbmUgQUhCX0dJWk1PX0JTRUEJCQkweDcwCi0jZGVmaW5lIEFIQl9HSVpNT19OT1IJCQkweDc0Ci0jZGVmaW5lIEFIQl9HSVpNT19VU0IyCQkJMHg3OAotI2RlZmluZSBBSEJfR0laTU9fVVNCMwkJCTB4N2MKKyNkZWZpbmUgQUhCX0dJWk1PX0FQQl9ETUEJCTB4MTQKKyNkZWZpbmUgQUhCX0dJWk1PX0lERQkJCTB4MWMKKyNkZWZpbmUgQUhCX0dJWk1PX1VTQgkJCTB4MjAKKyNkZWZpbmUgQUhCX0dJWk1PX0FIQl9YQkFSX0JSSURHRQkweDI0CisjZGVmaW5lIEFIQl9HSVpNT19DUFVfQUhCX0JSSURHRQkweDI4CisjZGVmaW5lIEFIQl9HSVpNT19DT1BfQUhCX0JSSURHRQkweDJjCisjZGVmaW5lIEFIQl9HSVpNT19YQkFSX0FQQl9DVExSCQkweDMwCisjZGVmaW5lIEFIQl9HSVpNT19WQ1BfQUhCX0JSSURHRQkweDM0CisjZGVmaW5lIEFIQl9HSVpNT19OQU5ECQkJMHg0MAorI2RlZmluZSBBSEJfR0laTU9fU0RNTUM0CQkweDQ4CisjZGVmaW5lIEFIQl9HSVpNT19YSU8JCQkweDRjCisjZGVmaW5lIEFIQl9HSVpNT19CU0VWCQkJMHg2NAorI2RlZmluZSBBSEJfR0laTU9fQlNFQQkJCTB4NzQKKyNkZWZpbmUgQUhCX0dJWk1PX05PUgkJCTB4NzgKKyNkZWZpbmUgQUhCX0dJWk1PX1VTQjIJCQkweDdjCisjZGVmaW5lIEFIQl9HSVpNT19VU0IzCQkJMHg4MAogI2RlZmluZSAgIElNTUVESUFURQlCSVQoMTgpCiAKLSNkZWZpbmUgQUhCX0dJWk1PX1NETU1DMQkJMHg4MAotI2RlZmluZSBBSEJfR0laTU9fU0RNTUMyCQkweDg0Ci0jZGVmaW5lIEFIQl9HSVpNT19TRE1NQzMJCTB4ODgKLSNkZWZpbmUgQUhCX01FTV9QUkVGRVRDSF9DRkdfWAkJMHhkOAotI2RlZmluZSBBSEJfQVJCSVRSQVRJT05fWEJBUl9DVFJMCTB4ZGMKLSNkZWZpbmUgQUhCX01FTV9QUkVGRVRDSF9DRkczCQkweGUwCi0jZGVmaW5lIEFIQl9NRU1fUFJFRkVUQ0hfQ0ZHNAkJMHhlNAotI2RlZmluZSBBSEJfTUVNX1BSRUZFVENIX0NGRzEJCTB4ZWMKLSNkZWZpbmUgQUhCX01FTV9QUkVGRVRDSF9DRkcyCQkweGYwCisjZGVmaW5lIEFIQl9HSVpNT19TRE1NQzEJCTB4ODQKKyNkZWZpbmUgQUhCX0dJWk1PX1NETU1DMgkJMHg4OAorI2RlZmluZSBBSEJfR0laTU9fU0RNTUMzCQkweDhjCisjZGVmaW5lIEFIQl9NRU1fUFJFRkVUQ0hfQ0ZHX1gJCTB4ZGMKKyNkZWZpbmUgQUhCX0FSQklUUkFUSU9OX1hCQVJfQ1RSTAkweGUwCisjZGVmaW5lIEFIQl9NRU1fUFJFRkVUQ0hfQ0ZHMwkJMHhlNAorI2RlZmluZSBBSEJfTUVNX1BSRUZFVENIX0NGRzQJCTB4ZTgKKyNkZWZpbmUgQUhCX01FTV9QUkVGRVRDSF9DRkcxCQkweGYwCisjZGVmaW5lIEFIQl9NRU1fUFJFRkVUQ0hfQ0ZHMgkJMHhmNAogI2RlZmluZSAgIFBSRUZFVENIX0VOQglCSVQoMzEpCiAjZGVmaW5lICAgTVNUX0lEKHgpCSgoKHgpICYgMHgxZikgPDwgMjYpCiAjZGVmaW5lICAgQUhCRE1BX01TVF9JRAlNU1RfSUQoNSkKQEAgLTc3LDEwICs3OCwyMCBAQAogI2RlZmluZSAgIEFERFJfQk5EUlkoeCkJKCgoeCkgJiAweGYpIDw8IDIxKQogI2RlZmluZSAgIElOQUNUSVZJVFlfVElNRU9VVCh4KQkoKCh4KSAmIDB4ZmZmZikgPDwgMCkKIAotI2RlZmluZSBBSEJfQVJCSVRSQVRJT05fQUhCX01FTV9XUlFVRV9NU1RfSUQJMHhmOAorI2RlZmluZSBBSEJfQVJCSVRSQVRJT05fQUhCX01FTV9XUlFVRV9NU1RfSUQJMHhmYwogCiAjZGVmaW5lIEFIQl9BUkJJVFJBVElPTl9YQkFSX0NUUkxfU01NVV9JTklUX0RPTkUgQklUKDE3KQogCisvKgorICogSU5DT1JSRUNUX0JBU0VfQUREUl9MT1dfQllURTogTGVnYWN5IGtlcm5lbCBEVCBmaWxlcyBmb3IgVGVncmEgU29DcworICogcHJpb3IgdG8gVGVncmExMjQgZ2VuZXJhbGx5IHVzZSBhIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBlbmRpbmcgaW4KKyAqIDB4NCBmb3IgdGhlIEFIQiBJUCBibG9jay4gIEFjY29yZGluZyB0byB0aGUgVFJNLCB0aGUgbG93IGJ5dGUKKyAqIHNob3VsZCBiZSAweDAuICBEdXJpbmcgZGV2aWNlIHByb2JpbmcsIHRoaXMgbWFjcm8gaXMgdXNlZCB0byBkZXRlY3QKKyAqIHdoZXRoZXIgdGhlIHBhc3NlZC1pbiBwaHlzaWNhbCBhZGRyZXNzIGlzIGluY29ycmVjdCwgYW5kIGlmIHNvLCB0bworICogY29ycmVjdCBpdC4KKyAqLworI2RlZmluZSBJTkNPUlJFQ1RfQkFTRV9BRERSX0xPV19CWVRFCQkweDQKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfYWhiX2RyaXZlcjsKIAogc3RhdGljIGNvbnN0IHUzMiB0ZWdyYV9haGJfZ2l6bW9bXSA9IHsKQEAgLTI1Nyw2ICsyNjgsMTUgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJLyogQ29ycmVjdCB0aGUgSVAgYmxvY2sgYmFzZSBhZGRyZXNzIGlmIG5lY2Vzc2FyeSAqLworCWlmIChyZXMgJiYKKwkgICAgKHJlcy0+c3RhcnQgJiBJTkNPUlJFQ1RfQkFTRV9BRERSX0xPV19CWVRFKSA9PQorCSAgICBJTkNPUlJFQ1RfQkFTRV9BRERSX0xPV19CWVRFKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsICJpbmNvcnJlY3QgQUhCIGJhc2UgYWRkcmVzcyBpbiBEVCBkYXRhIC0gZW5hYmxpbmcgd29ya2Fyb3VuZFxuIik7CisJCXJlcy0+c3RhcnQgLT0gSU5DT1JSRUNUX0JBU0VfQUREUl9MT1dfQllURTsKKwl9CisKIAlhaGItPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKGFoYi0+cmVncykpCiAJCXJldHVybiBQVFJfRVJSKGFoYi0+cmVncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9NYWtlZmlsZSBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCmluZGV4IGFlNDExMDcuLmI2N2U5OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYXRhL01ha2VmaWxlCkBAIC0xMTEsNyArMTExLDggQEAKICMgU2hvdWxkIGJlIGxhc3QgbGliYXRhIGRyaXZlcgogb2JqLSQoQ09ORklHX1BBVEFfTEVHQUNZKQkrPSBwYXRhX2xlZ2FjeS5vCiAKLWxpYmF0YS15CTo9IGxpYmF0YS1jb3JlLm8gbGliYXRhLXNjc2kubyBsaWJhdGEtZWgubyBsaWJhdGEtdHJhbnNwb3J0Lm8KK2xpYmF0YS15CTo9IGxpYmF0YS1jb3JlLm8gbGliYXRhLXNjc2kubyBsaWJhdGEtZWgubyBcCisJbGliYXRhLXRyYW5zcG9ydC5vIGxpYmF0YS10cmFjZS5vCiBsaWJhdGEtJChDT05GSUdfQVRBX1NGRikJKz0gbGliYXRhLXNmZi5vCiBsaWJhdGEtJChDT05GSUdfU0FUQV9QTVApCSs9IGxpYmF0YS1wbXAubwogbGliYXRhLSQoQ09ORklHX0FUQV9BQ1BJKQkrPSBsaWJhdGEtYWNwaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9hY2FyZC1haGNpLmMgYi9kcml2ZXJzL2F0YS9hY2FyZC1haGNpLmMKaW5kZXggYzk2Mjg4Ni4uMTI0ODljZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWNhcmQtYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FjYXJkLWFoY2kuYwpAQCAtMTgxLDEwICsxODEsMTAgQEAKIAlpbnQgcmM7CiAKIAlpZiAodXNpbmdfZGFjICYmCi0JICAgICFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7Ci0JCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCSAgICAhZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7CisJCXJjID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpOwogCQlpZiAocmMpIHsKLQkJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQkJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCQlpZiAocmMpIHsKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJCSAgICI2NC1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwpAQCAtMTkyLDEyICsxOTIsMTIgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJcmMgPSBkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiMzItYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKIAkJCXJldHVybiByYzsKIAkJfQotCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSIzMi1iaXQgY29uc2lzdGVudCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpLmMgYi9kcml2ZXJzL2F0YS9haGNpLmMKaW5kZXggMzNiYjA2ZS4uYzdhOTJhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2kuYwpAQCAtNzM4LDEwICs3MzgsMTAgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAodXNpbmdfZGFjICYmCi0JICAgICFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7Ci0JCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCSAgICAhZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7CisJCXJjID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpOwogCQlpZiAocmMpIHsKLQkJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQkJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCQlpZiAocmMpIHsKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJCSI2NC1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwpAQCAtNzQ5LDEyICs3NDksMTIgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJcmMgPSBkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiMzItYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKIAkJCXJldHVybiByYzsKIAkJfQotCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSIzMi1iaXQgY29uc2lzdGVudCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpX3N0LmMgYi9kcml2ZXJzL2F0YS9haGNpX3N0LmMKaW5kZXggYmM5NzFhZi4uZWEwZmYwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaV9zdC5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2lfc3QuYwpAQCAtNjgsOCArNjgsNiBAQAogCQl9CiAJfQogCi0Jc3RfYWhjaV9jb25maWd1cmVfb29iKGRydl9kYXRhLT5ocHJpdi0+bW1pbyk7Ci0KIAlpZiAoZHJ2X2RhdGEtPnN3X3JzdCkgewogCQllcnIgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KGRydl9kYXRhLT5zd19yc3QpOwogCQlpZiAoZXJyKSB7CkBAIC0xNzIsNiArMTcwLDggQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCisJc3RfYWhjaV9jb25maWd1cmVfb29iKGRydl9kYXRhLT5ocHJpdi0+bW1pbyk7CisKIAllcnIgPSBhaGNpX3BsYXRmb3JtX2luaXRfaG9zdChwZGV2LCBocHJpdiwgJnN0X2FoY2lfcG9ydF9pbmZvLAogCQkJCSAgICAgICZhaGNpX3BsYXRmb3JtX3NodCk7CiAJaWYgKGVycikgewpAQCAtMjIyLDYgKzIyMiw4IEBACiAJCXJldHVybiBlcnI7CiAJfQogCisJc3RfYWhjaV9jb25maWd1cmVfb29iKGRydl9kYXRhLT5ocHJpdi0+bW1pbyk7CisKIAlyZXR1cm4gYWhjaV9wbGF0Zm9ybV9yZXN1bWVfaG9zdChkZXYpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9haGNpX3hnZW5lLmMgYi9kcml2ZXJzL2F0YS9haGNpX3hnZW5lLmMKaW5kZXggMmU4YmI2MC4uMmI3ODUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvYWhjaV94Z2VuZS5jCisrKyBiL2RyaXZlcnMvYXRhL2FoY2lfeGdlbmUuYwpAQCAtMjIsNiArMjIsNyBAQAogICogTk9URTogUE0gc3VwcG9ydCBpcyBub3QgY3VycmVudGx5IGF2YWlsYWJsZS4KICAqCiAgKi8KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvYWhjaV9wbGF0Zm9ybS5oPgpAQCAtNzE4LDYgKzcxOSwxNCBAQAogCXJldHVybiByYzsKIH0KIAorI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHhnZW5lX2FoY2lfYWNwaV9tYXRjaFtdID0geworCXsgIkFQTUMwRDBEIiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHhnZW5lX2FoY2lfYWNwaV9tYXRjaCk7CisjZW5kaWYKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgeGdlbmVfYWhjaV9vZl9tYXRjaFtdID0gewogCXsuY29tcGF0aWJsZSA9ICJhcG0seGdlbmUtYWhjaSJ9LAogCXt9LApAQCAtNzMwLDYgKzczOSw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSBEUlZfTkFNRSwKIAkJLm9mX21hdGNoX3RhYmxlID0geGdlbmVfYWhjaV9vZl9tYXRjaCwKKwkJLmFjcGlfbWF0Y2hfdGFibGUgPSBBQ1BJX1BUUih4Z2VuZV9haGNpX2FjcGlfbWF0Y2gpLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwppbmRleCA0YzM1ZjA4Li5mNmNiMWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKQEAgLTcwLDYgKzcwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9saWJhdGEuaD4KKwogI2luY2x1ZGUgImxpYmF0YS5oIgogI2luY2x1ZGUgImxpYmF0YS10cmFuc3BvcnQuaCIKIApAQCAtNjkxLDExICs2OTQsMTEgQEAKICAqCVJFVFVSTlM6CiAgKglCbG9jayBhZGRyZXNzIHJlYWQgZnJvbSBAdGYuCiAgKi8KLXU2NCBhdGFfdGZfcmVhZF9ibG9jayhzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Ziwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKK3U2NCBhdGFfdGZfcmVhZF9ibG9jayhjb25zdCBzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Ziwgc3RydWN0IGF0YV9kZXZpY2UgKmRldikKIHsKIAl1NjQgYmxvY2sgPSAwOwogCi0JaWYgKHRmLT5mbGFncyAmIEFUQV9URkxBR19MQkEpIHsKKwlpZiAoIWRldiB8fCB0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBKSB7CiAJCWlmICh0Zi0+ZmxhZ3MgJiBBVEFfVEZMQUdfTEJBNDgpIHsKIAkJCWJsb2NrIHw9ICh1NjQpdGYtPmhvYl9sYmFoIDw8IDQwOwogCQkJYmxvY2sgfD0gKHU2NCl0Zi0+aG9iX2xiYW0gPDwgMzI7CkBAIC0yMTQ0LDYgKzIxNDcsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYXRhX2Rldl9jb25maWdfc2Vuc2VfcmVwb3J0aW5nKHN0cnVjdCBhdGFfZGV2aWNlICpkZXYpCit7CisJdW5zaWduZWQgaW50IGVycl9tYXNrOworCisJaWYgKCFhdGFfaWRfaGFzX3NlbnNlX3JlcG9ydGluZyhkZXYtPmlkKSkKKwkJcmV0dXJuOworCisJaWYgKGF0YV9pZF9zZW5zZV9yZXBvcnRpbmdfZW5hYmxlZChkZXYtPmlkKSkKKwkJcmV0dXJuOworCisJZXJyX21hc2sgPSBhdGFfZGV2X3NldF9mZWF0dXJlKGRldiwgU0VURkVBVFVSRV9TRU5TRV9EQVRBLCAweDEpOworCWlmIChlcnJfbWFzaykgeworCQlhdGFfZGV2X2RiZyhkZXYsCisJCQkgICAgImZhaWxlZCB0byBlbmFibGUgU2Vuc2UgRGF0YSBSZXBvcnRpbmcsIEVtYXNrIDB4JXhcbiIsCisJCQkgICAgZXJyX21hc2spOworCX0KK30KKwogLyoqCiAgKglhdGFfZGV2X2NvbmZpZ3VyZSAtIENvbmZpZ3VyZSB0aGUgc3BlY2lmaWVkIEFUQS9BVEFQSSBkZXZpY2UKICAqCUBkZXY6IFRhcmdldCBkZXZpY2UgdG8gY29uZmlndXJlCkBAIC0yMzY2LDcgKzIzODcsNyBAQAogCQkJCQlkZXYtPmRldnNscF90aW1pbmdbaV0gPSBzYXRhX3NldHRpbmdbal07CiAJCQkJfQogCQl9Ci0KKwkJYXRhX2Rldl9jb25maWdfc2Vuc2VfcmVwb3J0aW5nKGRldik7CiAJCWRldi0+Y2RiX2xlbiA9IDE2OwogCX0KIApAQCAtNDIwNCw5ICs0MjI1LDE4IEBACiAJeyAiUElPTkVFUiBEVkQtUlcgIERWUi0yMTZEIiwJTlVMTCwJQVRBX0hPUktBR0VfTk9TRVRYRkVSIH0sCiAKIAkvKiBkZXZpY2VzIHRoYXQgZG9uJ3QgcHJvcGVybHkgaGFuZGxlIHF1ZXVlZCBUUklNIGNvbW1hbmRzICovCi0JeyAiTWljcm9uX01bNTZdKiIsCQlOVUxMLAlBVEFfSE9SS0FHRV9OT19OQ1FfVFJJTSB8CisJeyAiTWljcm9uX001MDAqIiwJCU5VTEwsCUFUQV9IT1JLQUdFX05PX05DUV9UUklNIHwKIAkJCQkJCUFUQV9IT1JLQUdFX1pFUk9fQUZURVJfVFJJTSwgfSwKLQl7ICJDcnVjaWFsX0NUKlNTRCoiLAkJTlVMTCwJQVRBX0hPUktBR0VfTk9fTkNRX1RSSU0sIH0sCisJeyAiQ3J1Y2lhbF9DVCpNNTAwKiIsCQlOVUxMLAlBVEFfSE9SS0FHRV9OT19OQ1FfVFJJTSB8CisJCQkJCQlBVEFfSE9SS0FHRV9aRVJPX0FGVEVSX1RSSU0sIH0sCisJeyAiTWljcm9uX001WzE1XTAqIiwJCSJNVTAxIiwJQVRBX0hPUktBR0VfTk9fTkNRX1RSSU0gfAorCQkJCQkJQVRBX0hPUktBR0VfWkVST19BRlRFUl9UUklNLCB9LAorCXsgIkNydWNpYWxfQ1QqTTU1MCoiLAkJIk1VMDEiLAlBVEFfSE9SS0FHRV9OT19OQ1FfVFJJTSB8CisJCQkJCQlBVEFfSE9SS0FHRV9aRVJPX0FGVEVSX1RSSU0sIH0sCisJeyAiQ3J1Y2lhbF9DVCpNWDEwMCoiLAkJIk1VMDEiLAlBVEFfSE9SS0FHRV9OT19OQ1FfVFJJTSB8CisJCQkJCQlBVEFfSE9SS0FHRV9aRVJPX0FGVEVSX1RSSU0sIH0sCisJeyAiU2Ftc3VuZyBTU0QgODUwIFBSTyoiLAlOVUxMLAlBVEFfSE9SS0FHRV9OT19OQ1FfVFJJTSB8CisJCQkJCQlBVEFfSE9SS0FHRV9aRVJPX0FGVEVSX1RSSU0sIH0sCiAKIAkvKgogCSAqIEFzIGRlZmluZWQsIHRoZSBEUkFUIChEZXRlcm1pbmlzdGljIFJlYWQgQWZ0ZXIgVHJpbSkgYW5kIFJaQVQKQEAgLTQyMjYsNiArNDI1Niw4IEBACiAJICovCiAJeyAiSU5URUwqU1NEU0MyTUgqIiwJCU5VTEwsCTAsIH0sCiAKKwl7ICJNaWNyb24qIiwJCQlOVUxMLAlBVEFfSE9SS0FHRV9aRVJPX0FGVEVSX1RSSU0sIH0sCisJeyAiQ3J1Y2lhbCoiLAkJCU5VTEwsCUFUQV9IT1JLQUdFX1pFUk9fQUZURVJfVFJJTSwgfSwKIAl7ICJJTlRFTCpTU0QqIiwgCQlOVUxMLAlBVEFfSE9SS0FHRV9aRVJPX0FGVEVSX1RSSU0sIH0sCiAJeyAiU1NEKklOVEVMKiIsCQkJTlVMTCwJQVRBX0hPUktBR0VfWkVST19BRlRFUl9UUklNLCB9LAogCXsgIlNhbXN1bmcqU1NEKiIsCQlOVUxMLAlBVEFfSE9SS0FHRV9aRVJPX0FGVEVSX1RSSU0sIH0sCkBAIC00NzM3LDcgKzQ3NjksNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCS8qIGxpYnNhcyBjYXNlICovCi0JaWYgKCFhcC0+c2NzaV9ob3N0KSB7CisJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX1NBU19IT1NUKSB7CiAJCXRhZyA9IGF0YV9zYXNfYWxsb2NhdGVfdGFnKGFwKTsKIAkJaWYgKHRhZyA8IDApCiAJCQlyZXR1cm4gTlVMTDsKQEAgLTQ3NzYsNyArNDgwOCw3IEBACiAJdGFnID0gcWMtPnRhZzsKIAlpZiAobGlrZWx5KGF0YV90YWdfdmFsaWQodGFnKSkpIHsKIAkJcWMtPnRhZyA9IEFUQV9UQUdfUE9JU09OOwotCQlpZiAoIWFwLT5zY3NpX2hvc3QpCisJCWlmIChhcC0+ZmxhZ3MgJiBBVEFfRkxBR19TQVNfSE9TVCkKIAkJCWF0YV9zYXNfZnJlZV90YWcodGFnLCBhcCk7CiAJfQogfQpAQCAtNDg4Niw2ICs0OTE4LDcgQEAKIAkJICovCiAJCWlmICh1bmxpa2VseShhdGFfdGFnX2ludGVybmFsKHFjLT50YWcpKSkgewogCQkJZmlsbF9yZXN1bHRfdGYocWMpOworCQkJdHJhY2VfYXRhX3FjX2NvbXBsZXRlX2ludGVybmFsKHFjKTsKIAkJCV9fYXRhX3FjX2NvbXBsZXRlKHFjKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtNDg5Niw2ICs0OTI5LDcgQEAKIAkJICovCiAJCWlmICh1bmxpa2VseShxYy0+ZmxhZ3MgJiBBVEFfUUNGTEFHX0ZBSUxFRCkpIHsKIAkJCWZpbGxfcmVzdWx0X3RmKHFjKTsKKwkJCXRyYWNlX2F0YV9xY19jb21wbGV0ZV9mYWlsZWQocWMpOwogCQkJYXRhX3FjX3NjaGVkdWxlX2VoKHFjKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtNDkwNiw2ICs0OTQwLDcgQEAKIAkJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfUkVTVUxUX1RGKQogCQkJZmlsbF9yZXN1bHRfdGYocWMpOwogCisJCXRyYWNlX2F0YV9xY19jb21wbGV0ZV9kb25lKHFjKTsKIAkJLyogU29tZSBjb21tYW5kcyBuZWVkIHBvc3QtcHJvY2Vzc2luZyBhZnRlciBzdWNjZXNzZnVsCiAJCSAqIGNvbXBsZXRpb24uCiAJCSAqLwpAQCAtNTA1Myw3ICs1MDg4LDcgQEAKIAl9CiAKIAlhcC0+b3BzLT5xY19wcmVwKHFjKTsKLQorCXRyYWNlX2F0YV9xY19pc3N1ZShxYyk7CiAJcWMtPmVycl9tYXNrIHw9IGFwLT5vcHMtPnFjX2lzc3VlKHFjKTsKIAlpZiAodW5saWtlbHkocWMtPmVycl9tYXNrKSkKIAkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtZWguYyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jCmluZGV4IGQyMDI5YTQuLjA3ZjQxYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1laC5jCkBAIC00Niw2ICs0Niw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KIAorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9saWJhdGEuaD4KICNpbmNsdWRlICJsaWJhdGEuaCIKIAogZW51bSB7CkBAIC0xNTEwLDEzICsxNTExLDE4IEBACiAJRFBSSU5USygicmVhZCBsb2cgcGFnZSAtIGxvZyAweCV4LCBwYWdlIDB4JXhcbiIsIGxvZywgcGFnZSk7CiAKIAlhdGFfdGZfaW5pdChkZXYsICZ0Zik7Ci0JdGYuY29tbWFuZCA9IEFUQV9DTURfUkVBRF9MT0dfRVhUOworCWlmIChkZXYtPmRtYV9tb2RlICYmIGF0YV9pZF9oYXNfcmVhZF9sb2dfZG1hX2V4dChkZXYtPmlkKSkgeworCQl0Zi5jb21tYW5kID0gQVRBX0NNRF9SRUFEX0xPR19ETUFfRVhUOworCQl0Zi5wcm90b2NvbCA9IEFUQV9QUk9UX0RNQTsKKwl9IGVsc2UgeworCQl0Zi5jb21tYW5kID0gQVRBX0NNRF9SRUFEX0xPR19FWFQ7CisJCXRmLnByb3RvY29sID0gQVRBX1BST1RfUElPOworCX0KIAl0Zi5sYmFsID0gbG9nOwogCXRmLmxiYW0gPSBwYWdlOwogCXRmLm5zZWN0ID0gc2VjdG9yczsKIAl0Zi5ob2JfbnNlY3QgPSBzZWN0b3JzID4+IDg7CiAJdGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0lTQUREUiB8IEFUQV9URkxBR19MQkE0OCB8IEFUQV9URkxBR19ERVZJQ0U7Ci0JdGYucHJvdG9jb2wgPSBBVEFfUFJPVF9QSU87CiAKIAllcnJfbWFzayA9IGF0YV9leGVjX2ludGVybmFsKGRldiwgJnRmLCBOVUxMLCBETUFfRlJPTV9ERVZJQ0UsCiAJCQkJICAgICBidWYsIHNlY3RvcnMgKiBBVEFfU0VDVF9TSVpFLCAwKTsKQEAgLTE1NzUsNiArMTU4MSw4IEBACiAJdGYtPmhvYl9sYmFoID0gYnVmWzEwXTsKIAl0Zi0+bnNlY3QgPSBidWZbMTJdOwogCXRmLT5ob2JfbnNlY3QgPSBidWZbMTNdOworCWlmIChhdGFfaWRfaGFzX25jcV9hdXRvc2Vuc2UoZGV2LT5pZCkpCisJCXRmLT5hdXhpbGlhcnkgPSBidWZbMTRdIDw8IDE2IHwgYnVmWzE1XSA8PCA4IHwgYnVmWzE2XTsKIAogCXJldHVybiAwOwogfQpAQCAtMTYxMSw2ICsxNjE5LDcwIEBACiB9CiAKIC8qKgorICoJYXRhX2VoX3JlcXVlc3Rfc2Vuc2UgLSBwZXJmb3JtIFJFUVVFU1RfU0VOU0VfREFUQV9FWFQKKyAqCUBkZXY6IGRldmljZSB0byBwZXJmb3JtIFJFUVVFU1RfU0VOU0VfU0VOU0VfREFUQV9FWFQgdG8KKyAqCUBzZW5zZV9idWY6IHJlc3VsdCBzZW5zZSBkYXRhIGJ1ZmZlciAoU0NTSV9TRU5TRV9CVUZGRVJTSVpFIGJ5dGVzIGxvbmcpCisgKglAZGZsX3NlbnNlX2tleTogZGVmYXVsdCBzZW5zZSBrZXkgdG8gdXNlCisgKgorICoJUGVyZm9ybSBSRVFVRVNUX1NFTlNFX0RBVEFfRVhUIGFmdGVyIHRoZSBkZXZpY2UgcmVwb3J0ZWQgQ0hFQ0sKKyAqCVNFTlNFLiAgVGhpcyBmdW5jdGlvbiBpcyBFSCBoZWxwZXIuCisgKgorICoJTE9DS0lORzoKKyAqCUtlcm5lbCB0aHJlYWQgY29udGV4dCAobWF5IHNsZWVwKS4KKyAqCisgKglSRVRVUk5TOgorICoJZW5jb2RlZCBzZW5zZSBkYXRhIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZSBvciBpZiBzZW5zZSBkYXRhCisgKglpcyBub3QgYXZhaWxhYmxlLgorICovCitzdGF0aWMgdTMyIGF0YV9laF9yZXF1ZXN0X3NlbnNlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMsCisJCQkJc3RydWN0IHNjc2lfY21uZCAqY21kKQoreworCXN0cnVjdCBhdGFfZGV2aWNlICpkZXYgPSBxYy0+ZGV2OworCXN0cnVjdCBhdGFfdGFza2ZpbGUgdGY7CisJdW5zaWduZWQgaW50IGVycl9tYXNrOworCisJaWYgKCFjbWQpCisJCXJldHVybiAwOworCisJRFBSSU5USygiQVRBIHJlcXVlc3Qgc2Vuc2VcbiIpOworCWF0YV9kZXZfd2FybihkZXYsICJyZXF1ZXN0IHNlbnNlXG4iKTsKKwlpZiAoIWF0YV9pZF9zZW5zZV9yZXBvcnRpbmdfZW5hYmxlZChkZXYtPmlkKSkgeworCQlhdGFfZGV2X3dhcm4ocWMtPmRldiwgInNlbnNlIGRhdGEgcmVwb3J0aW5nIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWF0YV90Zl9pbml0KGRldiwgJnRmKTsKKworCXRmLmZsYWdzIHw9IEFUQV9URkxBR19JU0FERFIgfCBBVEFfVEZMQUdfREVWSUNFOworCXRmLmZsYWdzIHw9IEFUQV9URkxBR19MQkEgfCBBVEFfVEZMQUdfTEJBNDg7CisJdGYuY29tbWFuZCA9IEFUQV9DTURfUkVRX1NFTlNFX0RBVEE7CisJdGYucHJvdG9jb2wgPSBBVEFfUFJPVF9OT0RBVEE7CisKKwllcnJfbWFzayA9IGF0YV9leGVjX2ludGVybmFsKGRldiwgJnRmLCBOVUxMLCBETUFfTk9ORSwgTlVMTCwgMCwgMCk7CisJLyoKKwkgKiBBQ1MtNCBzdGF0ZXM6CisJICogVGhlIGRldmljZSBtYXkgc2V0IHRoZSBTRU5TRSBEQVRBIEFWQUlMQUJMRSBiaXQgdG8gb25lIGluIHRoZQorCSAqIFNUQVRVUyBmaWVsZCBhbmQgY2xlYXIgdGhlIEVSUk9SIGJpdCB0byB6ZXJvIGluIHRoZSBTVEFUVVMgZmllbGQKKwkgKiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21tYW5kIHJldHVybmVkIGNvbXBsZXRpb24gd2l0aG91dCBhbiBlcnJvcgorCSAqIGFuZCB0aGUgc2Vuc2UgZGF0YSBkZXNjcmliZWQgaW4gdGFibGUgMzA2IGlzIGF2YWlsYWJsZS4KKwkgKgorCSAqIElPVyB0aGUgJ0FUQV9TRU5TRScgYml0IG1pZ2h0IG5vdCBiZSBzZXQgZXZlbiB0aG91Z2ggdmFsaWQKKwkgKiBzZW5zZSBkYXRhIGlzIGF2YWlsYWJsZS4KKwkgKiBTbyBjaGVjayBmb3IgYm90aC4KKwkgKi8KKwlpZiAoKHRmLmNvbW1hbmQgJiBBVEFfU0VOU0UpIHx8CisJCXRmLmxiYWggIT0gMCB8fCB0Zi5sYmFtICE9IDAgfHwgdGYubGJhbCAhPSAwKSB7CisJCWF0YV9zY3NpX3NldF9zZW5zZShjbWQsIHRmLmxiYWgsIHRmLmxiYW0sIHRmLmxiYWwpOworCQlxYy0+ZmxhZ3MgfD0gQVRBX1FDRkxBR19TRU5TRV9WQUxJRDsKKwkJYXRhX2Rldl93YXJuKGRldiwgInNlbnNlIGRhdGEgJTAyeC8lMDJ4LyUwMnhcbiIsCisJCQkgICAgIHRmLmxiYWgsIHRmLmxiYW0sIHRmLmxiYWwpOworCX0gZWxzZSB7CisJCWF0YV9kZXZfd2FybihkZXYsICJyZXF1ZXN0IHNlbnNlIGZhaWxlZCBzdGF0ICUwMnggZW1hc2sgJXhcbiIsCisJCQkgICAgIHRmLmNvbW1hbmQsIGVycl9tYXNrKTsKKwl9CisJcmV0dXJuIGVycl9tYXNrOworfQorCisvKioKICAqCWF0YXBpX2VoX3JlcXVlc3Rfc2Vuc2UgLSBwZXJmb3JtIEFUQVBJIFJFUVVFU1RfU0VOU0UKICAqCUBkZXY6IGRldmljZSB0byBwZXJmb3JtIFJFUVVFU1RfU0VOU0UgdG8KICAqCUBzZW5zZV9idWY6IHJlc3VsdCBzZW5zZSBkYXRhIGJ1ZmZlciAoU0NTSV9TRU5TRV9CVUZGRVJTSVpFIGJ5dGVzIGxvbmcpCkBAIC0xNzcyLDYgKzE4NDQsMTkgQEAKIAltZW1jcHkoJnFjLT5yZXN1bHRfdGYsICZ0Ziwgc2l6ZW9mKHRmKSk7CiAJcWMtPnJlc3VsdF90Zi5mbGFncyA9IEFUQV9URkxBR19JU0FERFIgfCBBVEFfVEZMQUdfTEJBIHwgQVRBX1RGTEFHX0xCQTQ4OwogCXFjLT5lcnJfbWFzayB8PSBBQ19FUlJfREVWIHwgQUNfRVJSX05DUTsKKwlpZiAocWMtPnJlc3VsdF90Zi5hdXhpbGlhcnkpIHsKKwkJY2hhciBzZW5zZV9rZXksIGFzYywgYXNjcTsKKworCQlzZW5zZV9rZXkgPSAocWMtPnJlc3VsdF90Zi5hdXhpbGlhcnkgPj4gMTYpICYgMHhmZjsKKwkJYXNjID0gKHFjLT5yZXN1bHRfdGYuYXV4aWxpYXJ5ID4+IDgpICYgMHhmZjsKKwkJYXNjcSA9IHFjLT5yZXN1bHRfdGYuYXV4aWxpYXJ5ICYgMHhmZjsKKwkJYXRhX2Rldl9kYmcoZGV2LCAiTkNRIEF1dG9zZW5zZSAlMDJ4LyUwMngvJTAyeFxuIiwKKwkJCSAgICBzZW5zZV9rZXksIGFzYywgYXNjcSk7CisJCWF0YV9zY3NpX3NldF9zZW5zZShxYy0+c2NzaWNtZCwgc2Vuc2Vfa2V5LCBhc2MsIGFzY3EpOworCQlhdGFfc2NzaV9zZXRfc2Vuc2VfaW5mb3JtYXRpb24ocWMtPnNjc2ljbWQsICZxYy0+cmVzdWx0X3RmKTsKKwkJcWMtPmZsYWdzIHw9IEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQ7CisJfQorCiAJZWhjLT5pLmVycl9tYXNrICY9IH5BQ19FUlJfREVWOwogfQogCkBAIC0xODAxLDYgKzE4ODYsMjcgQEAKIAkJcmV0dXJuIEFUQV9FSF9SRVNFVDsKIAl9CiAKKwkvKgorCSAqIFNlbnNlIGRhdGEgcmVwb3J0aW5nIGRvZXMgbm90IHdvcmsgaWYgdGhlCisJICogZGV2aWNlIGZhdWx0IGJpdCBpcyBzZXQuCisJICovCisJaWYgKChzdGF0ICYgQVRBX1NFTlNFKSAmJiAhKHN0YXQgJiBBVEFfREYpICYmCisJICAgICEocWMtPmZsYWdzICYgQVRBX1FDRkxBR19TRU5TRV9WQUxJRCkpIHsKKwkJaWYgKCEocWMtPmFwLT5wZmxhZ3MgJiBBVEFfUEZMQUdfRlJPWkVOKSkgeworCQkJdG1wID0gYXRhX2VoX3JlcXVlc3Rfc2Vuc2UocWMsIHFjLT5zY3NpY21kKTsKKwkJCWlmICh0bXApCisJCQkJcWMtPmVycl9tYXNrIHw9IHRtcDsKKwkJCWVsc2UKKwkJCQlhdGFfc2NzaV9zZXRfc2Vuc2VfaW5mb3JtYXRpb24ocWMtPnNjc2ljbWQsIHRmKTsKKwkJfSBlbHNlIHsKKwkJCWF0YV9kZXZfd2FybihxYy0+ZGV2LCAic2Vuc2UgZGF0YSBhdmFpbGFibGUgYnV0IHBvcnQgZnJvemVuXG4iKTsKKwkJfQorCX0KKworCS8qIFNldCBieSBOQ1EgYXV0b3NlbnNlIG9yIHJlcXVlc3Qgc2Vuc2UgYWJvdmUgKi8KKwlpZiAocWMtPmZsYWdzICYgQVRBX1FDRkxBR19TRU5TRV9WQUxJRCkKKwkJcmV0dXJuIDA7CisKIAlpZiAoc3RhdCAmIChBVEFfRVJSIHwgQVRBX0RGKSkKIAkJcWMtPmVycl9tYXNrIHw9IEFDX0VSUl9ERVY7CiAJZWxzZQpAQCAtMjE4Niw2ICsyMjkyLDcgQEAKIAkJYWxsX2Vycl9tYXNrIHw9IHFjLT5lcnJfbWFzazsKIAkJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfSU8pCiAJCQllZmxhZ3MgfD0gQVRBX0VGTEFHX0lTX0lPOworCQl0cmFjZV9hdGFfZWhfbGlua19hdXRvcHN5X3FjKHFjKTsKIAl9CiAKIAkvKiBlbmZvcmNlIGRlZmF1bHQgRUggYWN0aW9ucyAqLwpAQCAtMjIyMCw3ICsyMzI3LDcgQEAKIAkJCWVmbGFncyB8PSBBVEFfRUZMQUdfRFVCSU9VU19YRkVSOwogCQllaGMtPmkuYWN0aW9uIHw9IGF0YV9laF9zcGVlZF9kb3duKGRldiwgZWZsYWdzLCBhbGxfZXJyX21hc2spOwogCX0KLQorCXRyYWNlX2F0YV9laF9saW5rX2F1dG9wc3koZGV2LCBlaGMtPmkuYWN0aW9uLCBhbGxfZXJyX21hc2spOwogCURQUklOVEsoIkVYSVRcbiIpOwogfQogCkBAIC0yMjg5LDI3ICsyMzk2LDI3IEBACiAJCWNvbnN0IGNoYXIgKnRleHQ7CiAJfSBjbWRfZGVzY3JbXSA9IHsKIAkJeyBBVEFfQ01EX0RFVl9SRVNFVCwJCSJERVZJQ0UgUkVTRVQiIH0sCi0JCXsgQVRBX0NNRF9DSEtfUE9XRVIsIAkJIkNIRUNLIFBPV0VSIE1PREUiIH0sCi0JCXsgQVRBX0NNRF9TVEFOREJZLCAJCSJTVEFOREJZIiB9LAotCQl7IEFUQV9DTURfSURMRSwgCQkiSURMRSIgfSwKLQkJeyBBVEFfQ01EX0VERCwgCQkJIkVYRUNVVEUgREVWSUNFIERJQUdOT1NUSUMiIH0sCi0JCXsgQVRBX0NNRF9ET1dOTE9BRF9NSUNSTywgICAJIkRPV05MT0FEIE1JQ1JPQ09ERSIgfSwKKwkJeyBBVEFfQ01EX0NIS19QT1dFUiwJCSJDSEVDSyBQT1dFUiBNT0RFIiB9LAorCQl7IEFUQV9DTURfU1RBTkRCWSwJCSJTVEFOREJZIiB9LAorCQl7IEFUQV9DTURfSURMRSwJCQkiSURMRSIgfSwKKwkJeyBBVEFfQ01EX0VERCwJCQkiRVhFQ1VURSBERVZJQ0UgRElBR05PU1RJQyIgfSwKKwkJeyBBVEFfQ01EX0RPV05MT0FEX01JQ1JPLAkiRE9XTkxPQUQgTUlDUk9DT0RFIiB9LAogCQl7IEFUQV9DTURfRE9XTkxPQURfTUlDUk9fRE1BLAkiRE9XTkxPQUQgTUlDUk9DT0RFIERNQSIgfSwKIAkJeyBBVEFfQ01EX05PUCwJCQkiTk9QIiB9LAotCQl7IEFUQV9DTURfRkxVU0gsIAkJIkZMVVNIIENBQ0hFIiB9LAotCQl7IEFUQV9DTURfRkxVU0hfRVhULCAJCSJGTFVTSCBDQUNIRSBFWFQiIH0sCi0JCXsgQVRBX0NNRF9JRF9BVEEsICAJCSJJREVOVElGWSBERVZJQ0UiIH0sCi0JCXsgQVRBX0NNRF9JRF9BVEFQSSwgCQkiSURFTlRJRlkgUEFDS0VUIERFVklDRSIgfSwKLQkJeyBBVEFfQ01EX1NFUlZJQ0UsIAkJIlNFUlZJQ0UiIH0sCi0JCXsgQVRBX0NNRF9SRUFELCAJCSJSRUFEIERNQSIgfSwKLQkJeyBBVEFfQ01EX1JFQURfRVhULCAJCSJSRUFEIERNQSBFWFQiIH0sCi0JCXsgQVRBX0NNRF9SRUFEX1FVRVVFRCwgCQkiUkVBRCBETUEgUVVFVUVEIiB9LAotCQl7IEFUQV9DTURfUkVBRF9TVFJFQU1fRVhULCAJIlJFQUQgU1RSRUFNIEVYVCIgfSwKKwkJeyBBVEFfQ01EX0ZMVVNILAkJIkZMVVNIIENBQ0hFIiB9LAorCQl7IEFUQV9DTURfRkxVU0hfRVhULAkJIkZMVVNIIENBQ0hFIEVYVCIgfSwKKwkJeyBBVEFfQ01EX0lEX0FUQSwJCSJJREVOVElGWSBERVZJQ0UiIH0sCisJCXsgQVRBX0NNRF9JRF9BVEFQSSwJCSJJREVOVElGWSBQQUNLRVQgREVWSUNFIiB9LAorCQl7IEFUQV9DTURfU0VSVklDRSwJCSJTRVJWSUNFIiB9LAorCQl7IEFUQV9DTURfUkVBRCwJCQkiUkVBRCBETUEiIH0sCisJCXsgQVRBX0NNRF9SRUFEX0VYVCwJCSJSRUFEIERNQSBFWFQiIH0sCisJCXsgQVRBX0NNRF9SRUFEX1FVRVVFRCwJCSJSRUFEIERNQSBRVUVVRUQiIH0sCisJCXsgQVRBX0NNRF9SRUFEX1NUUkVBTV9FWFQsCSJSRUFEIFNUUkVBTSBFWFQiIH0sCiAJCXsgQVRBX0NNRF9SRUFEX1NUUkVBTV9ETUFfRVhULCAgIlJFQUQgU1RSRUFNIERNQSBFWFQiIH0sCi0JCXsgQVRBX0NNRF9XUklURSwgCQkiV1JJVEUgRE1BIiB9LAotCQl7IEFUQV9DTURfV1JJVEVfRVhULCAJCSJXUklURSBETUEgRVhUIiB9LAotCQl7IEFUQV9DTURfV1JJVEVfUVVFVUVELCAJIldSSVRFIERNQSBRVUVVRUQgRVhUIiB9LAotCQl7IEFUQV9DTURfV1JJVEVfU1RSRUFNX0VYVCwgCSJXUklURSBTVFJFQU0gRVhUIiB9LAorCQl7IEFUQV9DTURfV1JJVEUsCQkiV1JJVEUgRE1BIiB9LAorCQl7IEFUQV9DTURfV1JJVEVfRVhULAkJIldSSVRFIERNQSBFWFQiIH0sCisJCXsgQVRBX0NNRF9XUklURV9RVUVVRUQsCQkiV1JJVEUgRE1BIFFVRVVFRCBFWFQiIH0sCisJCXsgQVRBX0NNRF9XUklURV9TVFJFQU1fRVhULAkiV1JJVEUgU1RSRUFNIEVYVCIgfSwKIAkJeyBBVEFfQ01EX1dSSVRFX1NUUkVBTV9ETUFfRVhULCAiV1JJVEUgU1RSRUFNIERNQSBFWFQiIH0sCiAJCXsgQVRBX0NNRF9XUklURV9GVUFfRVhULAkiV1JJVEUgRE1BIEZVQSBFWFQiIH0sCiAJCXsgQVRBX0NNRF9XUklURV9RVUVVRURfRlVBX0VYVCwgIldSSVRFIERNQSBRVUVVRUQgRlVBIEVYVCIgfSwKQEAgLTIzMjUsNyArMjQzMiw3IEBACiAJCXsgQVRBX0NNRF9SRUFEX01VTFRJX0VYVCwJIlJFQUQgTVVMVElQTEUgRVhUIiB9LAogCQl7IEFUQV9DTURfV1JJVEVfTVVMVEksCQkiV1JJVEUgTVVMVElQTEUiIH0sCiAJCXsgQVRBX0NNRF9XUklURV9NVUxUSV9FWFQsCSJXUklURSBNVUxUSVBMRSBFWFQiIH0sCi0JCXsgQVRBX0NNRF9XUklURV9NVUxUSV9GVUFfRVhULCAJIldSSVRFIE1VTFRJUExFIEZVQSBFWFQiIH0sCisJCXsgQVRBX0NNRF9XUklURV9NVUxUSV9GVUFfRVhULAkiV1JJVEUgTVVMVElQTEUgRlVBIEVYVCIgfSwKIAkJeyBBVEFfQ01EX1NFVF9GRUFUVVJFUywJCSJTRVQgRkVBVFVSRVMiIH0sCiAJCXsgQVRBX0NNRF9TRVRfTVVMVEksCQkiU0VUIE1VTFRJUExFIE1PREUiIH0sCiAJCXsgQVRBX0NNRF9WRVJJRlksCQkiUkVBRCBWRVJJRlkgU0VDVE9SKFMpIiB9LApAQCAtMjM0MiwxMiArMjQ0OSwxMiBAQAogCQl7IEFUQV9DTURfUkVBRF9MT0dfRVhULAkJIlJFQUQgTE9HIEVYVCIgfSwKIAkJeyBBVEFfQ01EX1dSSVRFX0xPR19FWFQsCSJXUklURSBMT0cgRVhUIiB9LAogCQl7IEFUQV9DTURfUkVBRF9MT0dfRE1BX0VYVCwJIlJFQUQgTE9HIERNQSBFWFQiIH0sCi0JCXsgQVRBX0NNRF9XUklURV9MT0dfRE1BX0VYVCwgCSJXUklURSBMT0cgRE1BIEVYVCIgfSwKKwkJeyBBVEFfQ01EX1dSSVRFX0xPR19ETUFfRVhULAkiV1JJVEUgTE9HIERNQSBFWFQiIH0sCiAJCXsgQVRBX0NNRF9UUlVTVEVEX05PTkRBVEEsCSJUUlVTVEVEIE5PTi1EQVRBIiB9LAogCQl7IEFUQV9DTURfVFJVU1RFRF9SQ1YsCQkiVFJVU1RFRCBSRUNFSVZFIiB9LAotCQl7IEFUQV9DTURfVFJVU1RFRF9SQ1ZfRE1BLCAJIlRSVVNURUQgUkVDRUlWRSBETUEiIH0sCisJCXsgQVRBX0NNRF9UUlVTVEVEX1JDVl9ETUEsCSJUUlVTVEVEIFJFQ0VJVkUgRE1BIiB9LAogCQl7IEFUQV9DTURfVFJVU1RFRF9TTkQsCQkiVFJVU1RFRCBTRU5EIiB9LAotCQl7IEFUQV9DTURfVFJVU1RFRF9TTkRfRE1BLCAJIlRSVVNURUQgU0VORCBETUEiIH0sCisJCXsgQVRBX0NNRF9UUlVTVEVEX1NORF9ETUEsCSJUUlVTVEVEIFNFTkQgRE1BIiB9LAogCQl7IEFUQV9DTURfUE1QX1JFQUQsCQkiUkVBRCBCVUZGRVIiIH0sCiAJCXsgQVRBX0NNRF9QTVBfUkVBRF9ETUEsCQkiUkVBRCBCVUZGRVIgRE1BIiB9LAogCQl7IEFUQV9DTURfUE1QX1dSSVRFLAkJIldSSVRFIEJVRkZFUiIgfSwKQEAgLTIzNjQsMTIgKzI0NzEsMTIgQEAKIAkJeyBBVEFfQ01EX01FRElBX0xPQ0ssCQkiRE9PUiBMT0NLIiB9LAogCQl7IEFUQV9DTURfTUVESUFfVU5MT0NLLAkJIkRPT1IgVU5MT0NLIiB9LAogCQl7IEFUQV9DTURfRFNNLAkJCSJEQVRBIFNFVCBNQU5BR0VNRU5UIiB9LAotCQl7IEFUQV9DTURfQ0hLX01FRF9DUkRfVFlQLCAJIkNIRUNLIE1FRElBIENBUkQgVFlQRSIgfSwKLQkJeyBBVEFfQ01EX0NGQV9SRVFfRVhUX0VSUiwgCSJDRkEgUkVRVUVTVCBFWFRFTkRFRCBFUlJPUiIgfSwKKwkJeyBBVEFfQ01EX0NIS19NRURfQ1JEX1RZUCwJIkNIRUNLIE1FRElBIENBUkQgVFlQRSIgfSwKKwkJeyBBVEFfQ01EX0NGQV9SRVFfRVhUX0VSUiwJIkNGQSBSRVFVRVNUIEVYVEVOREVEIEVSUk9SIiB9LAogCQl7IEFUQV9DTURfQ0ZBX1dSSVRFX05FLAkJIkNGQSBXUklURSBTRUNUT1JTIFdJVEhPVVQgRVJBU0UiIH0sCiAJCXsgQVRBX0NNRF9DRkFfVFJBTlNfU0VDVCwJIkNGQSBUUkFOU0xBVEUgU0VDVE9SIiB9LAogCQl7IEFUQV9DTURfQ0ZBX0VSQVNFLAkJIkNGQSBFUkFTRSBTRUNUT1JTIiB9LAotCQl7IEFUQV9DTURfQ0ZBX1dSSVRFX01VTFRfTkUsIAkiQ0ZBIFdSSVRFIE1VTFRJUExFIFdJVEhPVVQgRVJBU0UiIH0sCisJCXsgQVRBX0NNRF9DRkFfV1JJVEVfTVVMVF9ORSwJIkNGQSBXUklURSBNVUxUSVBMRSBXSVRIT1VUIEVSQVNFIiB9LAogCQl7IEFUQV9DTURfUkVRX1NFTlNFX0RBVEEsCSJSRVFVRVNUIFNFTlNFIERBVEEgRVhUIiB9LAogCQl7IEFUQV9DTURfU0FOSVRJWkVfREVWSUNFLAkiU0FOSVRJWkUgREVWSUNFIiB9LAogCQl7IEFUQV9DTURfUkVBRF9MT05HLAkJIlJFQUQgTE9ORyAod2l0aCByZXRyaWVzKSIgfSwKQEAgLTI1NDMsMTQgKzI2NTAsMTUgQEAKIAogI2lmZGVmIENPTkZJR19BVEFfVkVSQk9TRV9FUlJPUgogCQlpZiAocmVzLT5jb21tYW5kICYgKEFUQV9CVVNZIHwgQVRBX0RSRFkgfCBBVEFfREYgfCBBVEFfRFJRIHwKLQkJCQkgICAgQVRBX0VSUikpIHsKKwkJCQkgICAgQVRBX1NFTlNFIHwgQVRBX0VSUikpIHsKIAkJCWlmIChyZXMtPmNvbW1hbmQgJiBBVEFfQlVTWSkKIAkJCQlhdGFfZGV2X2VycihxYy0+ZGV2LCAic3RhdHVzOiB7IEJ1c3kgfVxuIik7CiAJCQllbHNlCi0JCQkJYXRhX2Rldl9lcnIocWMtPmRldiwgInN0YXR1czogeyAlcyVzJXMlc31cbiIsCisJCQkJYXRhX2Rldl9lcnIocWMtPmRldiwgInN0YXR1czogeyAlcyVzJXMlcyVzfVxuIiwKIAkJCQkgIHJlcy0+Y29tbWFuZCAmIEFUQV9EUkRZID8gIkRSRFkgIiA6ICIiLAogCQkJCSAgcmVzLT5jb21tYW5kICYgQVRBX0RGID8gIkRGICIgOiAiIiwKIAkJCQkgIHJlcy0+Y29tbWFuZCAmIEFUQV9EUlEgPyAiRFJRICIgOiAiIiwKKwkJCQkgIHJlcy0+Y29tbWFuZCAmIEFUQV9TRU5TRSA/ICJTRU5TRSAiIDogIiIsCiAJCQkJICByZXMtPmNvbW1hbmQgJiBBVEFfRVJSID8gIkVSUiAiIDogIiIpOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2NzaS5jCmluZGV4IGIwNjFiYTIuLjMxMzFhZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1zY3NpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLXNjc2kuYwpAQCAtMjcwLDEzICsyNzAsMjggQEAKIAkgICAgYXRhX3Njc2lfcGFya19zaG93LCBhdGFfc2NzaV9wYXJrX3N0b3JlKTsKIEVYUE9SVF9TWU1CT0xfR1BMKGRldl9hdHRyX3VubG9hZF9oZWFkcyk7CiAKLXN0YXRpYyB2b2lkIGF0YV9zY3NpX3NldF9zZW5zZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHU4IHNrLCB1OCBhc2MsIHU4IGFzY3EpCit2b2lkIGF0YV9zY3NpX3NldF9zZW5zZShzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsIHU4IHNrLCB1OCBhc2MsIHU4IGFzY3EpCiB7CisJaWYgKCFjbWQpCisJCXJldHVybjsKKwogCWNtZC0+cmVzdWx0ID0gKERSSVZFUl9TRU5TRSA8PCAyNCkgfCBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAKIAlzY3NpX2J1aWxkX3NlbnNlX2J1ZmZlcigwLCBjbWQtPnNlbnNlX2J1ZmZlciwgc2ssIGFzYywgYXNjcSk7CiB9CiAKK3ZvaWQgYXRhX3Njc2lfc2V0X3NlbnNlX2luZm9ybWF0aW9uKHN0cnVjdCBzY3NpX2NtbmQgKmNtZCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCit7CisJdTY0IGluZm9ybWF0aW9uOworCisJaWYgKCFjbWQpCisJCXJldHVybjsKKworCWluZm9ybWF0aW9uID0gYXRhX3RmX3JlYWRfYmxvY2sodGYsIE5VTEwpOworCXNjc2lfc2V0X3NlbnNlX2luZm9ybWF0aW9uKGNtZC0+c2Vuc2VfYnVmZmVyLCBpbmZvcm1hdGlvbik7Cit9CisKIHN0YXRpYyBzc2l6ZV90CiBhdGFfc2NzaV9lbV9tZXNzYWdlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQpAQCAtNzk5LDI2ICs4MTQsMjcgQEAKIAlpZiAoc3RhdCAmIEFUQV9CVVNZKSB7CiAJCXByaW50aygiQnVzeSB9XG4iKTsJLyogRGF0YSBpcyBub3QgdmFsaWQgaW4gdGhpcyBjYXNlICovCiAJfSBlbHNlIHsKLQkJaWYgKHN0YXQgJiAweDQwKQlwcmludGsoIkRyaXZlUmVhZHkgIik7Ci0JCWlmIChzdGF0ICYgMHgyMCkJcHJpbnRrKCJEZXZpY2VGYXVsdCAiKTsKLQkJaWYgKHN0YXQgJiAweDEwKQlwcmludGsoIlNlZWtDb21wbGV0ZSAiKTsKLQkJaWYgKHN0YXQgJiAweDA4KQlwcmludGsoIkRhdGFSZXF1ZXN0ICIpOwotCQlpZiAoc3RhdCAmIDB4MDQpCXByaW50aygiQ29ycmVjdGVkRXJyb3IgIik7Ci0JCWlmIChzdGF0ICYgMHgwMikJcHJpbnRrKCJJbmRleCAiKTsKLQkJaWYgKHN0YXQgJiAweDAxKQlwcmludGsoIkVycm9yICIpOworCQlpZiAoc3RhdCAmIEFUQV9EUkRZKQlwcmludGsoIkRyaXZlUmVhZHkgIik7CisJCWlmIChzdGF0ICYgQVRBX0RGKQlwcmludGsoIkRldmljZUZhdWx0ICIpOworCQlpZiAoc3RhdCAmIEFUQV9EU0MpCXByaW50aygiU2Vla0NvbXBsZXRlICIpOworCQlpZiAoc3RhdCAmIEFUQV9EUlEpCXByaW50aygiRGF0YVJlcXVlc3QgIik7CisJCWlmIChzdGF0ICYgQVRBX0NPUlIpCXByaW50aygiQ29ycmVjdGVkRXJyb3IgIik7CisJCWlmIChzdGF0ICYgQVRBX1NFTlNFKQlwcmludGsoIlNlbnNlICIpOworCQlpZiAoc3RhdCAmIEFUQV9FUlIpCXByaW50aygiRXJyb3IgIik7CiAJCXByaW50aygifVxuIik7CiAKIAkJaWYgKGVycikgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXRhJXU6IGVycm9yPTB4JTAyeCB7ICIsIGlkLCBlcnIpOwotCQkJaWYgKGVyciAmIDB4MDQpCQlwcmludGsoIkRyaXZlU3RhdHVzRXJyb3IgIik7Ci0JCQlpZiAoZXJyICYgMHg4MCkgewotCQkJCWlmIChlcnIgJiAweDA0KQlwcmludGsoIkJhZENSQyAiKTsKKwkJCWlmIChlcnIgJiBBVEFfQUJPUlRFRCkJcHJpbnRrKCJEcml2ZVN0YXR1c0Vycm9yICIpOworCQkJaWYgKGVyciAmIEFUQV9JQ1JDKSB7CisJCQkJaWYgKGVyciAmIEFUQV9BQk9SVEVEKQorCQkJCQkJcHJpbnRrKCJCYWRDUkMgIik7CiAJCQkJZWxzZQkJcHJpbnRrKCJTZWN0b3IgIik7CiAJCQl9Ci0JCQlpZiAoZXJyICYgMHg0MCkJCXByaW50aygiVW5jb3JyZWN0YWJsZUVycm9yICIpOwotCQkJaWYgKGVyciAmIDB4MTApCQlwcmludGsoIlNlY3RvcklkTm90Rm91bmQgIik7Ci0JCQlpZiAoZXJyICYgMHgwMikJCXByaW50aygiVHJhY2taZXJvTm90Rm91bmQgIik7Ci0JCQlpZiAoZXJyICYgMHgwMSkJCXByaW50aygiQWRkck1hcmtOb3RGb3VuZCAiKTsKKwkJCWlmIChlcnIgJiBBVEFfVU5DKQlwcmludGsoIlVuY29ycmVjdGFibGVFcnJvciAiKTsKKwkJCWlmIChlcnIgJiBBVEFfSURORikJcHJpbnRrKCJTZWN0b3JJZE5vdEZvdW5kICIpOworCQkJaWYgKGVyciAmIEFUQV9UUkswTkYpCXByaW50aygiVHJhY2taZXJvTm90Rm91bmQgIik7CisJCQlpZiAoZXJyICYgQVRBX0FNTkYpCXByaW50aygiQWRkck1hcmtOb3RGb3VuZCAiKTsKIAkJCXByaW50aygifVxuIik7CiAJCX0KIAl9CkBAIC04NDksNDAgKzg2NSw1OSBAQAogCS8qIEJhc2VkIG9uIHRoZSAzd2FyZSBkcml2ZXIgdHJhbnNsYXRpb24gdGFibGUgKi8KIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzZW5zZV90YWJsZVtdWzRdID0gewogCQkvKiBCQkR8RUNDfElEfE1BUiAqLwotCQl7MHhkMSwgCQlBQk9SVEVEX0NPTU1BTkQsIDB4MDAsIDB4MDB9LCAJLy8gRGV2aWNlIGJ1c3kgICAgICAgICAgICAgICAgICBBYm9ydGVkIGNvbW1hbmQKKwkJezB4ZDEsCQlBQk9SVEVEX0NPTU1BTkQsIDB4MDAsIDB4MDB9LAorCQkJLy8gRGV2aWNlIGJ1c3kgICAgICAgICAgICAgICAgICBBYm9ydGVkIGNvbW1hbmQKIAkJLyogQkJEfEVDQ3xJRCAqLwotCQl7MHhkMCwgIAlBQk9SVEVEX0NPTU1BTkQsIDB4MDAsIDB4MDB9LCAJLy8gRGV2aWNlIGJ1c3kgICAgICAgICAgICAgICAgICBBYm9ydGVkIGNvbW1hbmQKKwkJezB4ZDAsCQlBQk9SVEVEX0NPTU1BTkQsIDB4MDAsIDB4MDB9LAorCQkJLy8gRGV2aWNlIGJ1c3kgICAgICAgICAgICAgICAgICBBYm9ydGVkIGNvbW1hbmQKIAkJLyogRUNDfE1DfE1BUksgKi8KLQkJezB4NjEsIAkJSEFSRFdBUkVfRVJST1IsIDB4MDAsIDB4MDB9LCAJLy8gRGV2aWNlIGZhdWx0ICAgICAgICAgICAgICAgICBIYXJkd2FyZSBlcnJvcgorCQl7MHg2MSwJCUhBUkRXQVJFX0VSUk9SLCAweDAwLCAweDAwfSwKKwkJCS8vIERldmljZSBmYXVsdCAgICAgICAgICAgICAgICAgSGFyZHdhcmUgZXJyb3IKIAkJLyogSUNSQ3xBQlJUICovCQkvKiBOQjogSUNSQyAmICFBQlJUIGlzIEJCRCAqLwotCQl7MHg4NCwgCQlBQk9SVEVEX0NPTU1BTkQsIDB4NDcsIDB4MDB9LCAJLy8gRGF0YSBDUkMgZXJyb3IgICAgICAgICAgICAgICBTQ1NJIHBhcml0eSBlcnJvcgorCQl7MHg4NCwJCUFCT1JURURfQ09NTUFORCwgMHg0NywgMHgwMH0sCisJCQkvLyBEYXRhIENSQyBlcnJvciAgICAgICAgICAgICAgIFNDU0kgcGFyaXR5IGVycm9yCiAJCS8qIE1DfElEfEFCUlR8VFJLMHxNQVJLICovCi0JCXsweDM3LCAJCU5PVF9SRUFEWSwgMHgwNCwgMHgwMH0sIAkvLyBVbml0IG9mZmxpbmUgICAgICAgICAgICAgICAgIE5vdCByZWFkeQorCQl7MHgzNywJCU5PVF9SRUFEWSwgMHgwNCwgMHgwMH0sCisJCQkvLyBVbml0IG9mZmxpbmUgICAgICAgICAgICAgICAgIE5vdCByZWFkeQogCQkvKiBNQ1J8TUFSSyAqLwotCQl7MHgwOSwgCQlOT1RfUkVBRFksIDB4MDQsIDB4MDB9LCAJLy8gVW5yZWNvdmVyZWQgZGlzayBlcnJvciAgICAgICBOb3QgcmVhZHkKKwkJezB4MDksCQlOT1RfUkVBRFksIDB4MDQsIDB4MDB9LAorCQkJLy8gVW5yZWNvdmVyZWQgZGlzayBlcnJvciAgICAgICBOb3QgcmVhZHkKIAkJLyogIEJhZCBhZGRyZXNzIG1hcmsgKi8KLQkJezB4MDEsIAkJTUVESVVNX0VSUk9SLCAweDEzLCAweDAwfSwgCS8vIEFkZHJlc3MgbWFyayBub3QgZm91bmQgICAgICAgQWRkcmVzcyBtYXJrIG5vdCBmb3VuZCBmb3IgZGF0YSBmaWVsZAotCQkvKiBUUkswICovCi0JCXsweDAyLCAJCUhBUkRXQVJFX0VSUk9SLCAweDAwLCAweDAwfSwgCS8vIFRyYWNrIDAgbm90IGZvdW5kCQlIYXJkd2FyZSBlcnJvcgorCQl7MHgwMSwJCU1FRElVTV9FUlJPUiwgMHgxMywgMHgwMH0sCisJCQkvLyBBZGRyZXNzIG1hcmsgbm90IGZvdW5kIGZvciBkYXRhIGZpZWxkCisJCS8qIFRSSzAgLSBUcmFjayAwIG5vdCBmb3VuZCAqLworCQl7MHgwMiwJCUhBUkRXQVJFX0VSUk9SLCAweDAwLCAweDAwfSwKKwkJCS8vIEhhcmR3YXJlIGVycm9yCiAJCS8qIEFib3J0OiAweDA0IGlzIG5vdCB0cmFuc2xhdGVkIGhlcmUsIHNlZSBiZWxvdyAqLwogCQkvKiBNZWRpYSBjaGFuZ2UgcmVxdWVzdCAqLwotCQl7MHgwOCwgCQlOT1RfUkVBRFksIDB4MDQsIDB4MDB9LCAJLy8gTWVkaWEgY2hhbmdlIHJlcXVlc3QJICBGSVhNRTogZmFraW5nIG9mZmxpbmUKLQkJLyogU1JWL0lETkYgKi8KLQkJezB4MTAsIAkJSUxMRUdBTF9SRVFVRVNULCAweDIxLCAweDAwfSwgCS8vIElEIG5vdCBmb3VuZCAgICAgICAgICAgICAgICAgTG9naWNhbCBhZGRyZXNzIG91dCBvZiByYW5nZQotCQkvKiBNQyAqLwotCQl7MHgyMCwgCQlVTklUX0FUVEVOVElPTiwgMHgyOCwgMHgwMH0sIAkvLyBNZWRpYSBDaGFuZ2VkCQlOb3QgcmVhZHkgdG8gcmVhZHkgY2hhbmdlLCBtZWRpdW0gbWF5IGhhdmUgY2hhbmdlZAotCQkvKiBFQ0MgKi8KLQkJezB4NDAsIAkJTUVESVVNX0VSUk9SLCAweDExLCAweDA0fSwgCS8vIFVuY29ycmVjdGFibGUgRUNDIGVycm9yICAgICAgVW5yZWNvdmVyZWQgcmVhZCBlcnJvcgorCQl7MHgwOCwJCU5PVF9SRUFEWSwgMHgwNCwgMHgwMH0sCisJCQkvLyBGSVhNRTogZmFraW5nIG9mZmxpbmUKKwkJLyogU1JWL0lETkYgLSBJRCBub3QgZm91bmQgKi8KKwkJezB4MTAsCQlJTExFR0FMX1JFUVVFU1QsIDB4MjEsIDB4MDB9LAorCQkJLy8gTG9naWNhbCBhZGRyZXNzIG91dCBvZiByYW5nZQorCQkvKiBNQyAtIE1lZGlhIENoYW5nZWQgKi8KKwkJezB4MjAsCQlVTklUX0FUVEVOVElPTiwgMHgyOCwgMHgwMH0sCisJCQkvLyBOb3QgcmVhZHkgdG8gcmVhZHkgY2hhbmdlLCBtZWRpdW0gbWF5IGhhdmUgY2hhbmdlZAorCQkvKiBFQ0MgLSBVbmNvcnJlY3RhYmxlIEVDQyBlcnJvciAqLworCQl7MHg0MCwJCU1FRElVTV9FUlJPUiwgMHgxMSwgMHgwNH0sCisJCQkvLyBVbnJlY292ZXJlZCByZWFkIGVycm9yCiAJCS8qIEJCRCAtIGJsb2NrIG1hcmtlZCBiYWQgKi8KLQkJezB4ODAsIAkJTUVESVVNX0VSUk9SLCAweDExLCAweDA0fSwgCS8vIEJsb2NrIG1hcmtlZCBiYWQJCU1lZGl1bSBlcnJvciwgdW5yZWNvdmVyZWQgcmVhZCBlcnJvcgorCQl7MHg4MCwJCU1FRElVTV9FUlJPUiwgMHgxMSwgMHgwNH0sCisJCQkvLyBCbG9jayBtYXJrZWQgYmFkCU1lZGl1bSBlcnJvciwgdW5yZWNvdmVyZWQgcmVhZCBlcnJvcgogCQl7MHhGRiwgMHhGRiwgMHhGRiwgMHhGRn0sIC8vIEVORCBtYXJrCiAJfTsKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzdGF0X3RhYmxlW11bNF0gPSB7CiAJCS8qIE11c3QgYmUgZmlyc3QgYmVjYXVzZSBCVVNZIG1lYW5zIG5vIG90aGVyIGJpdHMgdmFsaWQgKi8KLQkJezB4ODAsIAkJQUJPUlRFRF9DT01NQU5ELCAweDQ3LCAweDAwfSwJLy8gQnVzeSwgZmFrZSBwYXJpdHkgZm9yIG5vdwotCQl7MHgyMCwgCQlIQVJEV0FSRV9FUlJPUiwgIDB4NDQsIDB4MDB9LCAJLy8gRGV2aWNlIGZhdWx0LCBpbnRlcm5hbCB0YXJnZXQgZmFpbHVyZQotCQl7MHgwOCwgCQlBQk9SVEVEX0NPTU1BTkQsIDB4NDcsIDB4MDB9LAkvLyBUaW1lZCBvdXQgaW4geGZlciwgZmFrZSBwYXJpdHkgZm9yIG5vdwotCQl7MHgwNCwgCQlSRUNPVkVSRURfRVJST1IsIDB4MTEsIDB4MDB9LAkvLyBSZWNvdmVyZWQgRUNDIGVycm9yCSAgTWVkaXVtIGVycm9yLCByZWNvdmVyZWQKKwkJezB4ODAsCQlBQk9SVEVEX0NPTU1BTkQsIDB4NDcsIDB4MDB9LAorCQkvLyBCdXN5LCBmYWtlIHBhcml0eSBmb3Igbm93CisJCXsweDQwLAkJSUxMRUdBTF9SRVFVRVNULCAweDIxLCAweDA0fSwKKwkJLy8gRGV2aWNlIHJlYWR5LCB1bmFsaWduZWQgd3JpdGUgY29tbWFuZAorCQl7MHgyMCwJCUhBUkRXQVJFX0VSUk9SLCAgMHg0NCwgMHgwMH0sCisJCS8vIERldmljZSBmYXVsdCwgaW50ZXJuYWwgdGFyZ2V0IGZhaWx1cmUKKwkJezB4MDgsCQlBQk9SVEVEX0NPTU1BTkQsIDB4NDcsIDB4MDB9LAorCQkvLyBUaW1lZCBvdXQgaW4geGZlciwgZmFrZSBwYXJpdHkgZm9yIG5vdworCQl7MHgwNCwJCVJFQ09WRVJFRF9FUlJPUiwgMHgxMSwgMHgwMH0sCisJCS8vIFJlY292ZXJlZCBFQ0MgZXJyb3IJICBNZWRpdW0gZXJyb3IsIHJlY292ZXJlZAogCQl7MHhGRiwgMHhGRiwgMHhGRiwgMHhGRn0sIC8vIEVORCBtYXJrCiAJfTsKIApAQCAtMTc1Nyw3ICsxNzkyLDkgQEAKIAkgICAgKChjZGJbMl0gJiAweDIwKSB8fCBuZWVkX3NlbnNlKSkgewogCQlhdGFfZ2VuX3Bhc3N0aHJ1X3NlbnNlKHFjKTsKIAl9IGVsc2UgewotCQlpZiAoIW5lZWRfc2Vuc2UpIHsKKwkJaWYgKHFjLT5mbGFncyAmIEFUQV9RQ0ZMQUdfU0VOU0VfVkFMSUQpIHsKKwkJCWNtZC0+cmVzdWx0ID0gU0FNX1NUQVRfQ0hFQ0tfQ09ORElUSU9OOworCQl9IGVsc2UgaWYgKCFuZWVkX3NlbnNlKSB7CiAJCQljbWQtPnJlc3VsdCA9IFNBTV9TVEFUX0dPT0Q7CiAJCX0gZWxzZSB7CiAJCQkvKiBUT0RPOiBkZWNpZGUgd2hpY2ggZGVzY3JpcHRvciBmb3JtYXQgdG8gdXNlCkBAIC00MjQwLDEwICs0Mjc3LDcgQEAKIAl1bnNpZ25lZCBpbnQgaSwgdGFnOwogCiAJZm9yIChpID0gMCwgdGFnID0gYXAtPnNhc19sYXN0X3RhZyArIDE7IGkgPCBtYXhfcXVldWU7IGkrKywgdGFnKyspIHsKLQkJaWYgKGFwLT5mbGFncyAmIEFUQV9GTEFHX0xPV1RBRykKLQkJCXRhZyA9IDE7Ci0JCWVsc2UKLQkJCXRhZyA9IHRhZyA8IG1heF9xdWV1ZSA/IHRhZyA6IDA7CisJCXRhZyA9IHRhZyA8IG1heF9xdWV1ZSA/IHRhZyA6IDA7CiAKIAkJLyogdGhlIGxhc3QgdGFnIGlzIHJlc2VydmVkIGZvciBpbnRlcm5hbCBjb21tYW5kLiAqLwogCQlpZiAodGFnID09IEFUQV9UQUdfSU5URVJOQUwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtc2ZmLmMKaW5kZXggMmU4NmUzYi4uY2RmNjIxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvbGliYXRhLXNmZi5jCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS1zZmYuYwpAQCAtMzIyMCwxMSArMzIyMCwxMSBAQAogCSAqIC0+c2ZmX2lycV9jbGVhciBtZXRob2QuICBUcnkgdG8gaW5pdGlhbGl6ZSBibWRtYV9hZGRyCiAJICogcmVnYXJkbGVzcyBvZiBkbWEgbWFza3MuCiAJICovCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJcmMgPSBkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgQVRBX0RNQV9NQVNLKTsKIAlpZiAocmMpCiAJCWF0YV9ibWRtYV9ub2RtYShob3N0LCAiZmFpbGVkIHRvIHNldCBkbWEgbWFzayIpOwogCWlmICghcmMpIHsKLQkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwkJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgQVRBX0RNQV9NQVNLKTsKIAkJaWYgKHJjKQogCQkJYXRhX2JtZG1hX25vZG1hKGhvc3QsCiAJCQkJCSJmYWlsZWQgdG8gc2V0IGNvbnNpc3RlbnQgZG1hIG1hc2siKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS10cmFjZS5jIGIvZHJpdmVycy9hdGEvbGliYXRhLXRyYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzMGI4YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS10cmFjZS5jCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogbGliYXRhLXRyYWNlLmMgLSB0cmFjZSBmdW5jdGlvbnMgZm9yIGxpYmF0YQorICoKKyAqIENvcHlyaWdodCAyMDE1IEhhbm5lcyBSZWluZWNrZQorICogQ29weXJpZ2h0IDIwMTUgU1VTRSBMaW51eCBHbWJICisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisgKiAgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZV9zZXEuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvbGliYXRhLmg+CisKK2NvbnN0IGNoYXIgKgorbGliYXRhX3RyYWNlX3BhcnNlX3N0YXR1cyhzdHJ1Y3QgdHJhY2Vfc2VxICpwLCB1bnNpZ25lZCBjaGFyIHN0YXR1cykKK3sKKwljb25zdCBjaGFyICpyZXQgPSB0cmFjZV9zZXFfYnVmZmVyX3B0cihwKTsKKworCXRyYWNlX3NlcV9wcmludGYocCwgInsgIik7CisJaWYgKHN0YXR1cyAmIEFUQV9CVVNZKQorCQl0cmFjZV9zZXFfcHJpbnRmKHAsICJCVVNZICIpOworCWlmIChzdGF0dXMgJiBBVEFfRFJEWSkKKwkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiRFJEWSAiKTsKKwlpZiAoc3RhdHVzICYgQVRBX0RGKQorCQl0cmFjZV9zZXFfcHJpbnRmKHAsICJERiAiKTsKKwlpZiAoc3RhdHVzICYgQVRBX0RTQykKKwkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiRFNDICIpOworCWlmIChzdGF0dXMgJiBBVEFfRFJRKQorCQl0cmFjZV9zZXFfcHJpbnRmKHAsICJEUlEgIik7CisJaWYgKHN0YXR1cyAmIEFUQV9DT1JSKQorCQl0cmFjZV9zZXFfcHJpbnRmKHAsICJDT1JSICIpOworCWlmIChzdGF0dXMgJiBBVEFfU0VOU0UpCisJCXRyYWNlX3NlcV9wcmludGYocCwgIlNFTlNFICIpOworCWlmIChzdGF0dXMgJiBBVEFfRVJSKQorCQl0cmFjZV9zZXFfcHJpbnRmKHAsICJFUlIgIik7CisJdHJhY2Vfc2VxX3B1dGMocCwgJ30nKTsKKwl0cmFjZV9zZXFfcHV0YyhwLCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK2NvbnN0IGNoYXIgKgorbGliYXRhX3RyYWNlX3BhcnNlX2VoX2FjdGlvbihzdHJ1Y3QgdHJhY2Vfc2VxICpwLCB1bnNpZ25lZCBpbnQgZWhfYWN0aW9uKQoreworCWNvbnN0IGNoYXIgKnJldCA9IHRyYWNlX3NlcV9idWZmZXJfcHRyKHApOworCisJdHJhY2Vfc2VxX3ByaW50ZihwLCAiJXgiLCBlaF9hY3Rpb24pOworCWlmIChlaF9hY3Rpb24pIHsKKwkJdHJhY2Vfc2VxX3ByaW50ZihwLCAieyAiKTsKKwkJaWYgKGVoX2FjdGlvbiAmIEFUQV9FSF9SRVZBTElEQVRFKQorCQkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiUkVWQUxJREFURSAiKTsKKwkJaWYgKGVoX2FjdGlvbiAmIChBVEFfRUhfU09GVFJFU0VUIHwgQVRBX0VIX0hBUkRSRVNFVCkpCisJCQl0cmFjZV9zZXFfcHJpbnRmKHAsICJSRVNFVCAiKTsKKwkJZWxzZSBpZiAoZWhfYWN0aW9uICYgQVRBX0VIX1NPRlRSRVNFVCkKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIlNPRlRSRVNFVCAiKTsKKwkJZWxzZSBpZiAoZWhfYWN0aW9uICYgQVRBX0VIX0hBUkRSRVNFVCkKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIkhBUkRSRVNFVCAiKTsKKwkJaWYgKGVoX2FjdGlvbiAmIEFUQV9FSF9FTkFCTEVfTElOSykKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIkVOQUJMRV9MSU5LICIpOworCQlpZiAoZWhfYWN0aW9uICYgQVRBX0VIX1BBUkspCisJCQl0cmFjZV9zZXFfcHJpbnRmKHAsICJQQVJLICIpOworCQl0cmFjZV9zZXFfcHV0YyhwLCAnfScpOworCX0KKwl0cmFjZV9zZXFfcHV0YyhwLCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK2NvbnN0IGNoYXIgKgorbGliYXRhX3RyYWNlX3BhcnNlX2VoX2Vycl9tYXNrKHN0cnVjdCB0cmFjZV9zZXEgKnAsIHVuc2lnbmVkIGludCBlaF9lcnJfbWFzaykKK3sKKwljb25zdCBjaGFyICpyZXQgPSB0cmFjZV9zZXFfYnVmZmVyX3B0cihwKTsKKworCXRyYWNlX3NlcV9wcmludGYocCwgIiV4IiwgZWhfZXJyX21hc2spOworCWlmIChlaF9lcnJfbWFzaykgeworCQl0cmFjZV9zZXFfcHJpbnRmKHAsICJ7ICIpOworCQlpZiAoZWhfZXJyX21hc2sgJiBBQ19FUlJfREVWKQorCQkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiREVWICIpOworCQlpZiAoZWhfZXJyX21hc2sgJiBBQ19FUlJfSFNNKQorCQkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiSFNNICIpOworCQlpZiAoZWhfZXJyX21hc2sgJiBBQ19FUlJfVElNRU9VVCkKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIlRJTUVPVVQgIik7CisJCWlmIChlaF9lcnJfbWFzayAmIEFDX0VSUl9NRURJQSkKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIk1FRElBICIpOworCQlpZiAoZWhfZXJyX21hc2sgJiBBQ19FUlJfQVRBX0JVUykKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIkFUQV9CVVMgIik7CisJCWlmIChlaF9lcnJfbWFzayAmIEFDX0VSUl9IT1NUX0JVUykKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIkhPU1RfQlVTICIpOworCQlpZiAoZWhfZXJyX21hc2sgJiBBQ19FUlJfU1lTVEVNKQorCQkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiU1lTVEVNICIpOworCQlpZiAoZWhfZXJyX21hc2sgJiBBQ19FUlJfSU5WQUxJRCkKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIklOVkFMSUQgIik7CisJCWlmIChlaF9lcnJfbWFzayAmIEFDX0VSUl9PVEhFUikKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIk9USEVSICIpOworCQlpZiAoZWhfZXJyX21hc2sgJiBBQ19FUlJfTk9ERVZfSElOVCkKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIk5PREVWX0hJTlQgIik7CisJCWlmIChlaF9lcnJfbWFzayAmIEFDX0VSUl9OQ1EpCisJCQl0cmFjZV9zZXFfcHJpbnRmKHAsICJOQ1EgIik7CisJCXRyYWNlX3NlcV9wdXRjKHAsICd9Jyk7CisJfQorCXRyYWNlX3NlcV9wdXRjKHAsIDApOworCisJcmV0dXJuIHJldDsKK30KKworY29uc3QgY2hhciAqCitsaWJhdGFfdHJhY2VfcGFyc2VfcWNfZmxhZ3Moc3RydWN0IHRyYWNlX3NlcSAqcCwgdW5zaWduZWQgaW50IHFjX2ZsYWdzKQoreworCWNvbnN0IGNoYXIgKnJldCA9IHRyYWNlX3NlcV9idWZmZXJfcHRyKHApOworCisJdHJhY2Vfc2VxX3ByaW50ZihwLCAiJXgiLCBxY19mbGFncyk7CisJaWYgKHFjX2ZsYWdzKSB7CisJCXRyYWNlX3NlcV9wcmludGYocCwgInsgIik7CisJCWlmIChxY19mbGFncyAmIEFUQV9RQ0ZMQUdfQUNUSVZFKQorCQkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiQUNUSVZFICIpOworCQlpZiAocWNfZmxhZ3MgJiBBVEFfUUNGTEFHX0RNQU1BUCkKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIkRNQU1BUCAiKTsKKwkJaWYgKHFjX2ZsYWdzICYgQVRBX1FDRkxBR19JTykKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIklPICIpOworCQlpZiAocWNfZmxhZ3MgJiBBVEFfUUNGTEFHX1JFU1VMVF9URikKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIlJFU1VMVF9URiAiKTsKKwkJaWYgKHFjX2ZsYWdzICYgQVRBX1FDRkxBR19DTEVBUl9FWENMKQorCQkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiQ0xFQVJfRVhDTCAiKTsKKwkJaWYgKHFjX2ZsYWdzICYgQVRBX1FDRkxBR19RVUlFVCkKKwkJCXRyYWNlX3NlcV9wcmludGYocCwgIlFVSUVUICIpOworCQlpZiAocWNfZmxhZ3MgJiBBVEFfUUNGTEFHX1JFVFJZKQorCQkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiUkVUUlkgIik7CisJCWlmIChxY19mbGFncyAmIEFUQV9RQ0ZMQUdfRkFJTEVEKQorCQkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiRkFJTEVEICIpOworCQlpZiAocWNfZmxhZ3MgJiBBVEFfUUNGTEFHX1NFTlNFX1ZBTElEKQorCQkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiU0VOU0VfVkFMSUQgIik7CisJCWlmIChxY19mbGFncyAmIEFUQV9RQ0ZMQUdfRUhfU0NIRURVTEVEKQorCQkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiRUhfU0NIRURVTEVEICIpOworCQl0cmFjZV9zZXFfcHV0YyhwLCAnfScpOworCX0KKwl0cmFjZV9zZXFfcHV0YyhwLCAwKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9saWJhdGEuaCBiL2RyaXZlcnMvYXRhL2xpYmF0YS5oCmluZGV4IGY4NDBjYTEuLmE5OThhMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS5oCisrKyBiL2RyaXZlcnMvYXRhL2xpYmF0YS5oCkBAIC02Nyw3ICs2Nyw4IEBACiBleHRlcm4gaW50IGF0YV9idWlsZF9yd190ZihzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Ziwgc3RydWN0IGF0YV9kZXZpY2UgKmRldiwKIAkJCSAgIHU2NCBibG9jaywgdTMyIG5fYmxvY2ssIHVuc2lnbmVkIGludCB0Zl9mbGFncywKIAkJCSAgIHVuc2lnbmVkIGludCB0YWcpOwotZXh0ZXJuIHU2NCBhdGFfdGZfcmVhZF9ibG9jayhzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0Ziwgc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CitleHRlcm4gdTY0IGF0YV90Zl9yZWFkX2Jsb2NrKGNvbnN0IHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmLAorCQkJICAgICBzdHJ1Y3QgYXRhX2RldmljZSAqZGV2KTsKIGV4dGVybiB1bnNpZ25lZCBhdGFfZXhlY19pbnRlcm5hbChzdHJ1Y3QgYXRhX2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYsIGNvbnN0IHU4ICpjZGIsCiAJCQkJICBpbnQgZG1hX2Rpciwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuLApAQCAtMTM3LDYgKzEzOCw5IEBACiAJCQkgICAgICBzdHJ1Y3Qgc2NzaV9ob3N0X3RlbXBsYXRlICpzaHQpOwogZXh0ZXJuIHZvaWQgYXRhX3Njc2lfc2Nhbl9ob3N0KHN0cnVjdCBhdGFfcG9ydCAqYXAsIGludCBzeW5jKTsKIGV4dGVybiBpbnQgYXRhX3Njc2lfb2ZmbGluZV9kZXYoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBhdGFfc2NzaV9zZXRfc2Vuc2Uoc3RydWN0IHNjc2lfY21uZCAqY21kLCB1OCBzaywgdTggYXNjLCB1OCBhc2NxKTsKK2V4dGVybiB2b2lkIGF0YV9zY3NpX3NldF9zZW5zZV9pbmZvcm1hdGlvbihzdHJ1Y3Qgc2NzaV9jbW5kICpjbWQsCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKIGV4dGVybiB2b2lkIGF0YV9zY3NpX21lZGlhX2NoYW5nZV9ub3RpZnkoc3RydWN0IGF0YV9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBhdGFfc2NzaV9ob3RwbHVnKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBleHRlcm4gdm9pZCBhdGFfc2NoZWR1bGVfc2NzaV9laChzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2F0cDg2N3guYyBiL2RyaXZlcnMvYXRhL3BhdGFfYXRwODY3eC5jCmluZGV4IGE3MDVjZmMuLjNlYTUwZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfYXRwODY3eC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfYXRwODY3eC5jCkBAIC00NzUsMTEgKzQ3NSwxMSBAQAogCiAJYXRwODY3eF9maXh1cChob3N0KTsKIAotCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCXJjID0gZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIEFUQV9ETUFfTUFTSyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCXJjID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIEFUQV9ETUFfTUFTSyk7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jIGIvZHJpdmVycy9hdGEvcGF0YV9jczU1MjAuYwppbmRleCBkNjVjYjlkLi40Y2IyNDA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2NzNTUyMC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfY3M1NTIwLmMKQEAgLTE2NCwxMSArMTY0LDExIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpKSB7CisJaWYgKGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKSkgewogCQlwcmludGsoS0VSTl9FUlIgRFJWX05BTUUgIjogdW5hYmxlIHRvIGNvbmZpZ3VyZSBETUEgbWFzay5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9Ci0JaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSkgeworCWlmIChkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IHVuYWJsZSB0byBjb25maWd1cmUgY29uc2lzdGVudCBETUEgbWFzay5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jIGIvZHJpdmVycy9hdGEvcGF0YV9ocHQzeDMuYwppbmRleCBkMDE5Y2RkLi5iMmZjMDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2hwdDN4My5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaHB0M3gzLmMKQEAgLTIyMSwxMCArMjIxLDEwIEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAJaG9zdC0+aW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOwotCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCXJjID0gZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIEFUQV9ETUFfTUFTSyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlyYyA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBBVEFfRE1BX01BU0spOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX2lzYXBucC5jIGIvZHJpdmVycy9hdGEvcGF0YV9pc2FwbnAuYwppbmRleCBiMzNkMWY5Li45OTRmMTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX2lzYXBucC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfaXNhcG5wLmMKQEAgLTEyOCwyMCArMTI4LDggQEAKIAkucmVtb3ZlCQk9IGlzYXBucF9yZW1vdmVfb25lLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgaXNhcG5wX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcG5wX3JlZ2lzdGVyX2RyaXZlcigmaXNhcG5wX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpc2FwbnBfZXhpdCh2b2lkKQotewotCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmaXNhcG5wX2RyaXZlcik7Ci19Ci0KK21vZHVsZV9wbnBfZHJpdmVyKGlzYXBucF9kcml2ZXIpOwogTU9EVUxFX0FVVEhPUigiQWxhbiBDb3giKTsKIE1PRFVMRV9ERVNDUklQVElPTigibG93LWxldmVsIGRyaXZlciBmb3IgSVNBIFBuUCBBVEEiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKLQotbW9kdWxlX2luaXQoaXNhcG5wX2luaXQpOwotbW9kdWxlX2V4aXQoaXNhcG5wX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9uaW5qYTMyLmMgYi9kcml2ZXJzL2F0YS9wYXRhX25pbmphMzIuYwppbmRleCBlZmIyNzJkLi42MzNhYTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX25pbmphMzIuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX25pbmphMzIuYwpAQCAtMTIyLDEwICsxMjIsMTAgQEAKIAkJcmV0dXJuIHJjOwogCiAJaG9zdC0+aW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKGRldik7Ci0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKGRldiwgQVRBX0RNQV9NQVNLKTsKKwlyYyA9IGRtYV9zZXRfbWFzaygmZGV2LT5kZXYsIEFUQV9ETUFfTUFTSyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2soZGV2LCBBVEFfRE1BX01BU0spOworCXJjID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZkZXYtPmRldiwgQVRBX0RNQV9NQVNLKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAlwY2lfc2V0X21hc3RlcihkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jIGIvZHJpdmVycy9hdGEvcGF0YV9wZGMyMDI3eC5jCmluZGV4IGRjYTgyNTEuLmQ5ZWY5ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcGRjMjAyN3guYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX3BkYzIwMjd4LmMKQEAgLTczMCwxMSArNzMwLDExIEBACiAJCXJldHVybiByYzsKIAlob3N0LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CiAKLQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlyYyA9IGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBBVEFfRE1BX01BU0spOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlyYyA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBBVEFfRE1BX01BU0spOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jIGIvZHJpdmVycy9hdGEvcGF0YV9zY2MuYwppbmRleCA3ZjRjYjc2Li41Y2Q2MGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NjYy5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2NjLmMKQEAgLTEwMjksMTAgKzEwMjksMTAgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAotCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCXJjID0gZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIEFUQV9ETUFfTUFTSyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlyYyA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBBVEFfRE1BX01BU0spOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jIGIvZHJpdmVycy9hdGEvcGF0YV9zaWw2ODAuYwppbmRleCBmNTk3ZWRjLi5jMTQwNzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NpbDY4MC5jCisrKyBiL2RyaXZlcnMvYXRhL3BhdGFfc2lsNjgwLmMKQEAgLTM3NCwxMCArMzc0LDEwIEBACiAJaG9zdC0+aW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOwogCiAJLyogU2V0dXAgRE1BIG1hc2tzICovCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJcmMgPSBkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgQVRBX0RNQV9NQVNLKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCXJjID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIEFUQV9ETUFfTUFTSyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAJcGNpX3NldF9tYXN0ZXIocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9wZGNfYWRtYS5jIGIvZHJpdmVycy9hdGEvcGRjX2FkbWEuYwppbmRleCBmMTA2MzFiLi42NGQ2ODJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wZGNfYWRtYS5jCisrKyBiL2RyaXZlcnMvYXRhL3BkY19hZG1hLmMKQEAgLTU5MywxMiArNTkzLDEyIEBACiB7CiAJaW50IHJjOwogCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCXJjID0gZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwogCWlmIChyYykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmM7CiAJfQotCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCXJjID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwogCWlmIChyYykgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIzMi1iaXQgY29uc2lzdGVudCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfZHdjXzQ2MGV4LmMgYi9kcml2ZXJzL2F0YS9zYXRhX2R3Y180NjBleC5jCmluZGV4IGZkYjBmMjguLjkwMjAzNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfZHdjXzQ2MGV4LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9kd2NfNDYwZXguYwpAQCAtMzYsMTEgKzM2LDE2IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGliYXRhLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCiAjaW5jbHVkZSAibGliYXRhLmgiCiAKICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAKKy8qIFN1cHBvcnRlZCBETUEgZW5naW5lIGRyaXZlcnMgKi8KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2RtYS1kdy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS9kdy5oPgorCiAvKiBUaGVzZSB0d28gYXJlIGRlZmluZWQgaW4gImxpYmF0YS5oIiAqLwogI3VuZGVmCURSVl9OQU1FCiAjdW5kZWYJRFJWX1ZFUlNJT04KQEAgLTYwLDE1MyArNjUsOSBAQAogI2RlZmluZSBOT19JUlEJCTAKICNlbmRpZgogCi0vKiBTQVRBIERNQSBkcml2ZXIgR2xvYmFscyAqLwotI2RlZmluZSBETUFfTlVNX0NIQU5TCQkxCi0jZGVmaW5lIERNQV9OVU1fQ0hBTl9SRUdTCTgKLQotLyogU0FUQSBETUEgUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgQUhCX0RNQV9CUlNUX0RGTFQJNjQJLyogMTYgZGF0YSBpdGVtcyBidXJzdCBsZW5ndGgqLwogCi1zdHJ1Y3QgZG1hcmVnIHsKLQl1MzIgbG93OwkJLyogTG93IGJpdHMgMC0zMSAqLwotCXUzMiBoaWdoOwkJLyogSGlnaCBiaXRzIDMyLTYzICovCi19OwotCi0vKiBETUEgUGVyIENoYW5uZWwgcmVnaXN0ZXJzICovCi1zdHJ1Y3QgZG1hX2NoYW5fcmVncyB7Ci0Jc3RydWN0IGRtYXJlZyBzYXI7CS8qIFNvdXJjZSBBZGRyZXNzICovCi0Jc3RydWN0IGRtYXJlZyBkYXI7CS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KLQlzdHJ1Y3QgZG1hcmVnIGxscDsJLyogTGlua2VkIExpc3QgUG9pbnRlciAqLwotCXN0cnVjdCBkbWFyZWcgY3RsOwkvKiBDb250cm9sICovCi0Jc3RydWN0IGRtYXJlZyBzc3RhdDsJLyogU291cmNlIFN0YXR1cyBub3QgaW1wbGVtZW50ZWQgaW4gY29yZSAqLwotCXN0cnVjdCBkbWFyZWcgZHN0YXQ7CS8qIERlc3RpbmF0aW9uIFN0YXR1cyBub3QgaW1wbGVtZW50ZWQgaW4gY29yZSovCi0Jc3RydWN0IGRtYXJlZyBzc3RhdGFyOwkvKiBTb3VyY2UgU3RhdHVzIEFkZHJlc3Mgbm90IGltcGwgaW4gY29yZSAqLwotCXN0cnVjdCBkbWFyZWcgZHN0YXRhcjsJLyogRGVzdGluYXRpb24gU3RhdHVzIEFkZHJlc3Mgbm90IGltcGxlbWVudGUgKi8KLQlzdHJ1Y3QgZG1hcmVnIGNmZzsJLyogQ29uZmlnICovCi0Jc3RydWN0IGRtYXJlZyBzZ3I7CS8qIFNvdXJjZSBHYXRoZXIgKi8KLQlzdHJ1Y3QgZG1hcmVnIGRzcjsJLyogRGVzdGluYXRpb24gU2NhdHRlciAqLwotfTsKLQotLyogR2VuZXJpYyBJbnRlcnJ1cHQgUmVnaXN0ZXJzICovCi1zdHJ1Y3QgZG1hX2ludGVycnVwdF9yZWdzIHsKLQlzdHJ1Y3QgZG1hcmVnIHRmcjsJLyogVHJhbnNmZXIgSW50ZXJydXB0ICovCi0Jc3RydWN0IGRtYXJlZyBibG9jazsJLyogQmxvY2sgSW50ZXJydXB0ICovCi0Jc3RydWN0IGRtYXJlZyBzcmN0cmFuOwkvKiBTb3VyY2UgVHJhbnNmZXIgSW50ZXJydXB0ICovCi0Jc3RydWN0IGRtYXJlZyBkc3R0cmFuOwkvKiBEZXN0IFRyYW5zZmVyIEludGVycnVwdCAqLwotCXN0cnVjdCBkbWFyZWcgZXJyb3I7CS8qIEVycm9yICovCi19OwotCi1zdHJ1Y3QgYWhiX2RtYV9yZWdzIHsKLQlzdHJ1Y3QgZG1hX2NoYW5fcmVncwljaGFuX3JlZ3NbRE1BX05VTV9DSEFOX1JFR1NdOwotCXN0cnVjdCBkbWFfaW50ZXJydXB0X3JlZ3MgaW50ZXJydXB0X3JhdzsJLyogUmF3IEludGVycnVwdCAqLwotCXN0cnVjdCBkbWFfaW50ZXJydXB0X3JlZ3MgaW50ZXJydXB0X3N0YXR1czsJLyogSW50ZXJydXB0IFN0YXR1cyAqLwotCXN0cnVjdCBkbWFfaW50ZXJydXB0X3JlZ3MgaW50ZXJydXB0X21hc2s7CS8qIEludGVycnVwdCBNYXNrICovCi0Jc3RydWN0IGRtYV9pbnRlcnJ1cHRfcmVncyBpbnRlcnJ1cHRfY2xlYXI7CS8qIEludGVycnVwdCBDbGVhciAqLwotCXN0cnVjdCBkbWFyZWcJCXN0YXR1c0ludDsJLyogSW50ZXJydXB0IGNvbWJpbmVkKi8KLQlzdHJ1Y3QgZG1hcmVnCQlycV9zcmNyZWc7CS8qIFNyYyBUcmFucyBSZXEgKi8KLQlzdHJ1Y3QgZG1hcmVnCQlycV9kc3RyZWc7CS8qIERzdCBUcmFucyBSZXEgKi8KLQlzdHJ1Y3QgZG1hcmVnCQlycV9zZ2xfc3JjcmVnOwkvKiBTbmdsIFNyYyBUcmFucyBSZXEqLwotCXN0cnVjdCBkbWFyZWcJCXJxX3NnbF9kc3RyZWc7CS8qIFNuZ2wgRHN0IFRyYW5zIFJlcSovCi0Jc3RydWN0IGRtYXJlZwkJcnFfbHN0X3NyY3JlZzsJLyogTGFzdCBTcmMgVHJhbnMgUmVxKi8KLQlzdHJ1Y3QgZG1hcmVnCQlycV9sc3RfZHN0cmVnOwkvKiBMYXN0IERzdCBUcmFucyBSZXEqLwotCXN0cnVjdCBkbWFyZWcJCWRtYV9jZmc7CQkvKiBETUEgQ29uZmlnICovCi0Jc3RydWN0IGRtYXJlZwkJZG1hX2NoYW5fZW47CQkvKiBETUEgQ2hhbm5lbCBFbmFibGUqLwotCXN0cnVjdCBkbWFyZWcJCWRtYV9pZDsJCQkvKiBETUEgSUQgKi8KLQlzdHJ1Y3QgZG1hcmVnCQlkbWFfdGVzdDsJCS8qIERNQSBUZXN0ICovCi0Jc3RydWN0IGRtYXJlZwkJcmVzMTsJCQkvKiByZXNlcnZlZCAqLwotCXN0cnVjdCBkbWFyZWcJCXJlczI7CQkJLyogcmVzZXJ2ZWQgKi8KLQkvKgotCSAqIERNQSBDb21wIFBhcmFtcwotCSAqIFBhcmFtIDYgPSBkbWFfcGFyYW1bMF0sIFBhcmFtIDUgPSBkbWFfcGFyYW1bMV0sCi0JICogUGFyYW0gNCA9IGRtYV9wYXJhbVsyXSAuLi4KLQkgKi8KLQlzdHJ1Y3QgZG1hcmVnCQlkbWFfcGFyYW1zWzZdOwotfTsKLQotLyogRGF0YSBzdHJ1Y3R1cmUgZm9yIGxpbmtlZCBsaXN0IGl0ZW0gKi8KLXN0cnVjdCBsbGkgewotCXUzMgkJc2FyOwkJLyogU291cmNlIEFkZHJlc3MgKi8KLQl1MzIJCWRhcjsJCS8qIERlc3RpbmF0aW9uIGFkZHJlc3MgKi8KLQl1MzIJCWxscDsJCS8qIExpbmtlZCBMaXN0IFBvaW50ZXIgKi8KLQlzdHJ1Y3QgZG1hcmVnCWN0bDsJCS8qIENvbnRyb2wgKi8KLQlzdHJ1Y3QgZG1hcmVnCWRzdGF0OwkJLyogRGVzdGluYXRpb24gU3RhdHVzICovCi19OwotCiBlbnVtIHsKLQlTQVRBX0RXQ19ETUFDX0xMSV9TWiA9CShzaXplb2Yoc3RydWN0IGxsaSkpLAotCVNBVEFfRFdDX0RNQUNfTExJX05VTSA9CTI1NiwKLQlTQVRBX0RXQ19ETUFDX0xMSV9UQkxfU1ogPSAoU0FUQV9EV0NfRE1BQ19MTElfU1ogKiBcCi0JCQkJCVNBVEFfRFdDX0RNQUNfTExJX05VTSksCi0JU0FUQV9EV0NfRE1BQ19UV0lEVEhfQllURVMgPSA0LAotCVNBVEFfRFdDX0RNQUNfQ1RSTF9UU0laRV9NQVggPSAoMHgwMDAwMDgwMCAqIFwKLQkJCQkJCVNBVEFfRFdDX0RNQUNfVFdJRFRIX0JZVEVTKSwKLX07Ci0KLS8qIERNQSBSZWdpc3RlciBPcGVyYXRpb24gQml0cyAqLwotZW51bSB7Ci0JRE1BX0VOCT0JCTB4MDAwMDAwMDEsIC8qIEVuYWJsZSBBSEIgRE1BICovCi0JRE1BX0NUTF9MTFBfU1JDRU4gPQkweDEwMDAwMDAwLCAvKiBCbGsgY2hhaW4gZW5hYmxlIFNyYyAqLwotCURNQV9DVExfTExQX0RTVEVOID0JMHgwODAwMDAwMCwgLyogQmxrIGNoYWluIGVuYWJsZSBEc3QgKi8KLX07Ci0KLSNkZWZpbmUJRE1BX0NUTF9CTEtfVFMoc2l6ZSkJKChzaXplKSAmIDB4MDAwMDAwRkZGKQkvKiBCbGsgVHJhbnNmZXIgc2l6ZSAqLwotI2RlZmluZSBETUFfQ0hBTk5FTChjaCkJCSgweDAwMDAwMDAxIDw8IChjaCkpCS8qIFNlbGVjdCBjaGFubmVsICovCi0JLyogRW5hYmxlIGNoYW5uZWwgKi8KLSNkZWZpbmUJRE1BX0VOQUJMRV9DSEFOKGNoKQkoKDB4MDAwMDAwMDEgPDwgKGNoKSkgfAkJCVwKLQkJCQkgKCgweDAwMDAwMDAwMSA8PCAoY2gpKSA8PCA4KSkKLQkvKiBEaXNhYmxlIGNoYW5uZWwgKi8KLSNkZWZpbmUJRE1BX0RJU0FCTEVfQ0hBTihjaCkJKDB4MDAwMDAwMDAgfCAoKDB4MDAwMDAwMDAxIDw8IChjaCkpIDw8IDgpKQotCS8qIFRyYW5zZmVyIFR5cGUgJiBGbG93IENvbnRyb2xsZXIgKi8KLSNkZWZpbmUJRE1BX0NUTF9UVEZDKHR5cGUpCSgoKHR5cGUpICYgMHg3KSA8PCAyMCkKLSNkZWZpbmUJRE1BX0NUTF9TTVMobnVtKQkoKChudW0pICYgMHgzKSA8PCAyNSkgLyogU3JjIE1hc3RlciBTZWxlY3QgKi8KLSNkZWZpbmUJRE1BX0NUTF9ETVMobnVtKQkoKChudW0pICYgMHgzKSA8PCAyMykvKiBEc3QgTWFzdGVyIFNlbGVjdCAqLwotCS8qIFNyYyBCdXJzdCBUcmFuc2FjdGlvbiBMZW5ndGggKi8KLSNkZWZpbmUgRE1BX0NUTF9TUkNfTVNJWkUoc2l6ZSkgKCgoc2l6ZSkgJiAweDcpIDw8IDE0KQotCS8qIERzdCBCdXJzdCBUcmFuc2FjdGlvbiBMZW5ndGggKi8KLSNkZWZpbmUJRE1BX0NUTF9EU1RfTVNJWkUoc2l6ZSkgKCgoc2l6ZSkgJiAweDcpIDw8IDExKQotCS8qIFNvdXJjZSBUcmFuc2ZlciBXaWR0aCAqLwotI2RlZmluZQlETUFfQ1RMX1NSQ19UUldJRChzaXplKSAoKChzaXplKSAmIDB4NykgPDwgNCkKLQkvKiBEZXN0aW5hdGlvbiBUcmFuc2ZlciBXaWR0aCAqLwotI2RlZmluZQlETUFfQ1RMX0RTVF9UUldJRChzaXplKSAoKChzaXplKSAmIDB4NykgPDwgMSkKLQotLyogQXNzaWduIEhXIGhhbmRzaGFraW5nIGludGVyZmFjZSAoeCkgdG8gZGVzdGluYXRpb24gLyBzb3VyY2UgcGVyaXBoZXJhbCAqLwotI2RlZmluZQlETUFfQ0ZHX0hXX0hTX0RFU1QoaW50X251bSkgKCgoaW50X251bSkgJiAweEYpIDw8IDExKQotI2RlZmluZQlETUFfQ0ZHX0hXX0hTX1NSQyhpbnRfbnVtKSAoKChpbnRfbnVtKSAmIDB4RikgPDwgNykKLSNkZWZpbmUJRE1BX0NGR19IV19DSF9QUklPUihpbnRfbnVtKSAoKChpbnRfbnVtKSAmIDB4RikgPDwgNSkKLSNkZWZpbmUJRE1BX0xMUF9MTVMoYWRkciwgbWFzdGVyKSAoKChhZGRyKSAmIDB4ZmZmZmZmZmMpIHwgKG1hc3RlcikpCi0KLS8qCi0gKiBUaGlzIGRlZmluZSBpcyB1c2VkIHRvIHNldCBibG9jayBjaGFpbmluZyBkaXNhYmxlZCBpbiB0aGUgY29udHJvbCBsb3cKLSAqIHJlZ2lzdGVyLiAgSXQgaXMgYWxyZWFkeSBpbiBsaXR0bGUgZW5kaWFuIGZvcm1hdCBzbyBpdCBjYW4gYmUgJidkIGRpcmN0bHkuCi0gKiBJdCBpcyBlc3NlbnRpYWxseTogY3B1X3RvX2xlMzIofihETUFfQ1RMX0xMUF9TUkNFTiB8IERNQV9DVExfTExQX0RTVEVOKSkKLSAqLwotZW51bSB7Ci0JRE1BX0NUTF9MTFBfRElTQUJMRV9MRTMyID0gMHhmZmZmZmZlNywKLQlETUFfQ1RMX1RURkNfUDJNX0RNQUMgPQkweDAwMDAwMDAyLCAvKiBQZXIgdG8gbWVtLCBETUFDIGNudHIgKi8KLQlETUFfQ1RMX1RURkNfTTJQX1BFUiA9CTB4MDAwMDAwMDMsIC8qIE1lbSB0byBwZXIsIHBlcmlwaGVyYWwgY250ciAqLwotCURNQV9DVExfU0lOQ19JTkMgPQkweDAwMDAwMDAwLCAvKiBTb3VyY2UgQWRkcmVzcyBJbmNyZW1lbnQgKi8KLQlETUFfQ1RMX1NJTkNfREVDID0JMHgwMDAwMDIwMCwKLQlETUFfQ1RMX1NJTkNfTk9DSEFOR0UgPQkweDAwMDAwNDAwLAotCURNQV9DVExfRElOQ19JTkMgPQkweDAwMDAwMDAwLCAvKiBEZXN0aW5hdGlvbiBBZGRyZXNzIEluY3JlbWVudCAqLwotCURNQV9DVExfRElOQ19ERUMgPQkweDAwMDAwMDgwLAotCURNQV9DVExfRElOQ19OT0NIQU5HRSA9CTB4MDAwMDAxMDAsCi0JRE1BX0NUTF9JTlRfRU4gPQkweDAwMDAwMDAxLCAvKiBJbnRlcnJ1cHQgRW5hYmxlICovCi0KLS8qIENoYW5uZWwgQ29uZmlndXJhdGlvbiBSZWdpc3RlciBoaWdoIGJpdHMgKi8KLQlETUFfQ0ZHX0ZDTU9EX1JFUSA9CTB4MDAwMDAwMDEsIC8qIEZsb3cgQ29udHJvbCAtIHJlcXVlc3QgYmFzZWQgKi8KLQlETUFfQ0ZHX1BST1RDVEwJPQkoMHgwMDAwMDAwMyA8PCAyKSwvKiBQcm90ZWN0aW9uIENvbnRyb2wgKi8KLQotLyogQ2hhbm5lbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIGxvdyBiaXRzICovCi0JRE1BX0NGR19SRUxEX0RTVCA9CTB4ODAwMDAwMDAsIC8qIFJlbG9hZCBEZXN0IC8gU3JjIEFkZHIgKi8KLQlETUFfQ0ZHX1JFTERfU1JDID0JMHg0MDAwMDAwMCwKLQlETUFfQ0ZHX0hTX1NFTFNSQyA9CTB4MDAwMDA4MDAsIC8qIFNvZnR3YXJlIGhhbmRzaGFrZSBTcmMvIERlc3QgKi8KLQlETUFfQ0ZHX0hTX1NFTERTVCA9CTB4MDAwMDA0MDAsCi0JRE1BX0NGR19GSUZPRU1QVFkgPSAgICAgKDB4MDAwMDAwMDEgPDwgOSksIC8qIEZJRk8gRW1wdHkgYml0ICovCi0KLS8qIENoYW5uZWwgTGlua2VkIExpc3QgUG9pbnRlciBSZWdpc3RlciAqLwotCURNQV9MTFBfQUhCTUFTVEVSMSA9CTAsCS8qIExpc3QgTWFzdGVyIFNlbGVjdCAqLwotCURNQV9MTFBfQUhCTUFTVEVSMiA9CTEsCi0KIAlTQVRBX0RXQ19NQVhfUE9SVFMgPSAxLAogCiAJU0FUQV9EV0NfU0NSX09GRlNFVCA9IDB4MjQsCkBAIC0yODcsNyArMTQ4LDcgQEAKIAlzdHJ1Y3QgYXRhX2hvc3QJCSpob3N0OwogCXU4IF9faW9tZW0JCSpyZWdfYmFzZTsKIAlzdHJ1Y3Qgc2F0YV9kd2NfcmVncwkqc2F0YV9kd2NfcmVnczsJLyogRFcgU3lub3BzeXMgU0FUQSBzcGVjaWZpYyAqLwotCWludAkJCWlycV9kbWE7CisJc3RydWN0IGR3X2RtYV9jaGlwCSpkbWE7CiB9OwogCiAjZGVmaW5lIFNBVEFfRFdDX1FDTURfTUFYCTMyCkBAIC0yOTUsMTAgKzE1NiwxMyBAQAogc3RydWN0IHNhdGFfZHdjX2RldmljZV9wb3J0IHsKIAlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlCSpoc2RldjsKIAlpbnQJCQljbWRfaXNzdWVkW1NBVEFfRFdDX1FDTURfTUFYXTsKLQlzdHJ1Y3QgbGxpCQkqbGxpdFtTQVRBX0RXQ19RQ01EX01BWF07ICAvKiBETUEgTExJIHRhYmxlICovCi0JZG1hX2FkZHJfdAkJbGxpdF9kbWFbU0FUQV9EV0NfUUNNRF9NQVhdOwotCXUzMgkJCWRtYV9jaGFuW1NBVEFfRFdDX1FDTURfTUFYXTsKIAlpbnQJCQlkbWFfcGVuZGluZ1tTQVRBX0RXQ19RQ01EX01BWF07CisKKwkvKiBETUEgaW5mbyAqLworCXN0cnVjdCBkd19kbWFfc2xhdmUJCSpkd3M7CisJc3RydWN0IGRtYV9jaGFuCQkJKmNoYW47CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCSpkZXNjW1NBVEFfRFdDX1FDTURfTUFYXTsKKwl1MzIJCQkJZG1hX2ludGVycnVwdF9jb3VudDsKIH07CiAKIC8qCkBAIC0zMzAsMTQgKzE5NCwxNyBAQAogCXZvaWQJX19pb21lbQkgKnNjcl9hZGRyX3NzdGF0dXM7CiAJdTMyCXNhdGFfZHdjX3NhY3RpdmVfaXNzdWVkIDsKIAl1MzIJc2F0YV9kd2Nfc2FjdGl2ZV9xdWV1ZWQgOwotCXUzMglkbWFfaW50ZXJydXB0X2NvdW50OwotCXN0cnVjdAlhaGJfZG1hX3JlZ3MJKnNhdGFfZG1hX3JlZ3M7Ci0Jc3RydWN0CWRldmljZQkqZHdjX2RldjsKLQlpbnQJZG1hX2NoYW5uZWw7CiB9OwogCiBzdGF0aWMgc3RydWN0IHNhdGFfZHdjX2hvc3RfcHJpdiBob3N0X3B2dDsKIAorc3RhdGljIHN0cnVjdCBkd19kbWFfc2xhdmUgc2F0YV9kd2NfZG1hX2R3cyA9IHsKKwkuc3JjX2lkID0gMCwKKwkuZHN0X2lkID0gMCwKKwkuc3JjX21hc3RlciA9IDAsCisJLmRzdF9tYXN0ZXIgPSAxLAorfTsKKwogLyoKICAqIFByb3RvdHlwZXMKICAqLwpAQCAtMzQ3LDEyICsyMTQsNiBAQAogc3RhdGljIHZvaWQgc2F0YV9kd2NfZG1hX3hmZXJfY29tcGxldGUoc3RydWN0IGF0YV9wb3J0ICphcCwgdTMyIGNoZWNrX3N0YXR1cyk7CiBzdGF0aWMgdm9pZCBzYXRhX2R3Y19wb3J0X3N0b3Aoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBzYXRhX2R3Y19jbGVhcl9kbWFjcihzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlX3BvcnQgKmhzZGV2cCwgdTggdGFnKTsKLXN0YXRpYyBpbnQgZG1hX2R3Y19pbml0KHN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2LCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIGRtYV9kd2NfZXhpdChzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlICpoc2Rldik7Ci1zdGF0aWMgaW50IGRtYV9kd2NfeGZlcl9zZXR1cChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgbnVtX2VsZW1zLAotCQkJICAgICAgc3RydWN0IGxsaSAqbGxpLCBkbWFfYWRkcl90IGRtYV9sbGksCi0JCQkgICAgICB2b2lkIF9faW9tZW0gKmFkZHIsIGludCBkaXIpOwotc3RhdGljIHZvaWQgZG1hX2R3Y194ZmVyX3N0YXJ0KGludCBkbWFfY2gpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3Byb3RfZGVzY3JpcHQodTggcHJvdG9jb2wpCiB7CkBAIC0zOTAsOTAgKzI1MSwyMyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc2F0YV9kd2NfdGZfZHVtcChzdHJ1Y3QgYXRhX3Rhc2tmaWxlICp0ZikKK3N0YXRpYyB2b2lkIHNhdGFfZHdjX3RmX2R1bXAoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpCiB7Ci0JZGV2X3ZkYmcoaG9zdF9wdnQuZHdjX2RldiwgInRhc2tmaWxlIGNtZDogMHglMDJ4IHByb3RvY29sOiAlcyBmbGFnczoiCi0JCSIweCVseCBkZXZpY2U6ICV4XG4iLCB0Zi0+Y29tbWFuZCwKLQkJZ2V0X3Byb3RfZGVzY3JpcHQodGYtPnByb3RvY29sKSwgdGYtPmZsYWdzLCB0Zi0+ZGV2aWNlKTsKLQlkZXZfdmRiZyhob3N0X3B2dC5kd2NfZGV2LCAiZmVhdHVyZTogMHglMDJ4IG5zZWN0OiAweCV4IGxiYWw6IDB4JXggIgotCQkibGJhbTogMHgleCBsYmFoOiAweCV4XG4iLCB0Zi0+ZmVhdHVyZSwgdGYtPm5zZWN0LCB0Zi0+bGJhbCwKLQkJIHRmLT5sYmFtLCB0Zi0+bGJhaCk7Ci0JZGV2X3ZkYmcoaG9zdF9wdnQuZHdjX2RldiwgImhvYl9mZWF0dXJlOiAweCUwMnggaG9iX25zZWN0OiAweCV4ICIKLQkJImhvYl9sYmFsOiAweCV4IGhvYl9sYmFtOiAweCV4IGhvYl9sYmFoOiAweCV4XG4iLAorCWRldl92ZGJnKGFwLT5kZXYsCisJCSJ0YXNrZmlsZSBjbWQ6IDB4JTAyeCBwcm90b2NvbDogJXMgZmxhZ3M6IDB4JWx4IGRldmljZTogJXhcbiIsCisJCXRmLT5jb21tYW5kLCBnZXRfcHJvdF9kZXNjcmlwdCh0Zi0+cHJvdG9jb2wpLCB0Zi0+ZmxhZ3MsCisJCXRmLT5kZXZpY2UpOworCWRldl92ZGJnKGFwLT5kZXYsCisJCSJmZWF0dXJlOiAweCUwMnggbnNlY3Q6IDB4JXggbGJhbDogMHgleCBsYmFtOiAweCV4IGxiYWg6IDB4JXhcbiIsCisJCXRmLT5mZWF0dXJlLCB0Zi0+bnNlY3QsIHRmLT5sYmFsLCB0Zi0+bGJhbSwgdGYtPmxiYWgpOworCWRldl92ZGJnKGFwLT5kZXYsCisJCSJob2JfZmVhdHVyZTogMHglMDJ4IGhvYl9uc2VjdDogMHgleCBob2JfbGJhbDogMHgleCBob2JfbGJhbTogMHgleCBob2JfbGJhaDogMHgleFxuIiwKIAkJdGYtPmhvYl9mZWF0dXJlLCB0Zi0+aG9iX25zZWN0LCB0Zi0+aG9iX2xiYWwsIHRmLT5ob2JfbGJhbSwKIAkJdGYtPmhvYl9sYmFoKTsKIH0KIAotLyoKLSAqIEZ1bmN0aW9uOiBnZXRfYnVyc3RfbGVuZ3RoX2VuY29kZQotICogYXJndW1lbnRzOiBkYXRhbGVuZ3RoOiBsZW5ndGggaW4gYnl0ZXMgb2YgZGF0YQotICogcmV0dXJucyB2YWx1ZSB0byBiZSBwcm9ncmFtbWVkIGluIHJlZ2lzdGVyIGNvcnJlc3BvbmRpbmcgdG8gZGF0YSBsZW5ndGgKLSAqIFRoaXMgdmFsdWUgaXMgZWZmZWN0aXZlbHkgdGhlIGxvZyhiYXNlIDIpIG9mIHRoZSBsZW5ndGgKLSAqLwotc3RhdGljICBpbnQgZ2V0X2J1cnN0X2xlbmd0aF9lbmNvZGUoaW50IGRhdGFsZW5ndGgpCitzdGF0aWMgdm9pZCBkbWFfZHdjX3hmZXJfZG9uZSh2b2lkICpoc2Rldl9pbnN0YW5jZSkKIHsKLQlpbnQgaXRlbXMgPSBkYXRhbGVuZ3RoID4+IDI7CS8qIGRpdiBieSA0IHRvIGdldCBsd29yZCBjb3VudCAqLwotCi0JaWYgKGl0ZW1zID49IDY0KQotCQlyZXR1cm4gNTsKLQotCWlmIChpdGVtcyA+PSAzMikKLQkJcmV0dXJuIDQ7Ci0KLQlpZiAoaXRlbXMgPj0gMTYpCi0JCXJldHVybiAzOwotCi0JaWYgKGl0ZW1zID49IDgpCi0JCXJldHVybiAyOwotCi0JaWYgKGl0ZW1zID49IDQpCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyAgdm9pZCBjbGVhcl9jaGFuX2ludGVycnVwdHMoaW50IGMpCi17Ci0Jb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfY2xlYXIudGZyLmxvdyksCi0JCSBETUFfQ0hBTk5FTChjKSk7Ci0Jb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfY2xlYXIuYmxvY2subG93KSwKLQkJIERNQV9DSEFOTkVMKGMpKTsKLQlvdXRfbGUzMigmKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MtPmludGVycnVwdF9jbGVhci5zcmN0cmFuLmxvdyksCi0JCSBETUFfQ0hBTk5FTChjKSk7Ci0Jb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfY2xlYXIuZHN0dHJhbi5sb3cpLAotCQkgRE1BX0NIQU5ORUwoYykpOwotCW91dF9sZTMyKCYoaG9zdF9wdnQuc2F0YV9kbWFfcmVncy0+aW50ZXJydXB0X2NsZWFyLmVycm9yLmxvdyksCi0JCSBETUFfQ0hBTk5FTChjKSk7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogZG1hX3JlcXVlc3RfY2hhbm5lbAotICogYXJndW1lbnRzOiBOb25lCi0gKiByZXR1cm5zIGNoYW5uZWwgbnVtYmVyIGlmIGF2YWlsYWJsZSBlbHNlIC0xCi0gKiBUaGlzIGZ1bmN0aW9uIGFzc2lnbnMgdGhlIG5leHQgYXZhaWxhYmxlIERNQSBjaGFubmVsIGZyb20gdGhlIGxpc3QgdG8gdGhlCi0gKiByZXF1ZXN0ZXIKLSAqLwotc3RhdGljIGludCBkbWFfcmVxdWVzdF9jaGFubmVsKHZvaWQpCi17Ci0JLyogQ2hlY2sgaWYgdGhlIGNoYW5uZWwgaXMgbm90IGN1cnJlbnRseSBpbiB1c2UgKi8KLQlpZiAoIShpbl9sZTMyKCYoaG9zdF9wdnQuc2F0YV9kbWFfcmVncy0+ZG1hX2NoYW5fZW4ubG93KSkgJgotCQlETUFfQ0hBTk5FTChob3N0X3B2dC5kbWFfY2hhbm5lbCkpKQotCQlyZXR1cm4gaG9zdF9wdnQuZG1hX2NoYW5uZWw7Ci0JZGV2X2Vycihob3N0X3B2dC5kd2NfZGV2LCAiJXMgQ2hhbm5lbCAlZCBpcyBjdXJyZW50bHkgaW4gdXNlXG4iLAotCQlfX2Z1bmNfXywgaG9zdF9wdnQuZG1hX2NoYW5uZWwpOwotCXJldHVybiAtMTsKLX0KLQotLyoKLSAqIEZ1bmN0aW9uOiBkbWFfZHdjX2ludGVycnVwdAotICogYXJndW1lbnRzOiBpcnEsIGRldl9pZCwgcHRfcmVncwotICogcmV0dXJucyBjaGFubmVsIG51bWJlciBpZiBhdmFpbGFibGUgZWxzZSAtMQotICogSW50ZXJydXB0IEhhbmRsZXIgZm9yIERXIEFIQiBTQVRBIERNQQotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgZG1hX2R3Y19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqaHNkZXZfaW5zdGFuY2UpCi17Ci0JaW50IGNoYW47Ci0JdTMyIHRmcl9yZWcsIGVycl9yZWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlICpoc2RldiA9IGhzZGV2X2luc3RhbmNlOwogCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IChzdHJ1Y3QgYXRhX2hvc3QgKiloc2Rldi0+aG9zdDsKQEAgLTQ4NywzNDEgKzI4MSw2NSBAQAogCWhzZGV2cCA9IEhTREVWUF9GUk9NX0FQKGFwKTsKIAl0YWcgPSBhcC0+bGluay5hY3RpdmVfdGFnOwogCi0JdGZyX3JlZyA9IGluX2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfc3RhdHVzLnRmclwKLQkJCS5sb3cpKTsKLQllcnJfcmVnID0gaW5fbGUzMigmKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MtPmludGVycnVwdF9zdGF0dXMuZXJyb3JcCi0JCQkubG93KSk7Ci0KLQlkZXZfZGJnKGFwLT5kZXYsICJlb3Q9MHglMDh4IGVycj0weCUwOHggcGVuZGluZz0lZCBhY3RpdmUgcG9ydD0lZFxuIiwKLQkJdGZyX3JlZywgZXJyX3JlZywgaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddLCBwb3J0KTsKLQotCWNoYW4gPSBob3N0X3B2dC5kbWFfY2hhbm5lbDsKLQlpZiAoY2hhbiA+PSAwKSB7Ci0JCS8qIENoZWNrIGZvciBlbmQtb2YtdHJhbnNmZXIgaW50ZXJydXB0LiAqLwotCQlpZiAodGZyX3JlZyAmIERNQV9DSEFOTkVMKGNoYW4pKSB7Ci0JCQkvKgotCQkJICogRWFjaCBETUEgY29tbWFuZCBwcm9kdWNlcyAyIGludGVycnVwdHMuICBPbmx5Ci0JCQkgKiBjb21wbGV0ZSB0aGUgY29tbWFuZCBhZnRlciBib3RoIGludGVycnVwdHMgaGF2ZSBiZWVuCi0JCQkgKiBzZWVuLiAoU2VlIHNhdGFfZHdjX2lzcigpKQotCQkJICovCi0JCQlob3N0X3B2dC5kbWFfaW50ZXJydXB0X2NvdW50Kys7Ci0JCQlzYXRhX2R3Y19jbGVhcl9kbWFjcihoc2RldnAsIHRhZyk7Ci0KLQkJCWlmIChoc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10gPT0KLQkJCSAgICBTQVRBX0RXQ19ETUFfUEVORElOR19OT05FKSB7Ci0JCQkJZGV2X2VycihhcC0+ZGV2LCAiRE1BIG5vdCBwZW5kaW5nIGVvdD0weCUwOHggIgotCQkJCQkiZXJyPTB4JTA4eCB0YWc9MHglMDJ4IHBlbmRpbmc9JWRcbiIsCi0JCQkJCXRmcl9yZWcsIGVycl9yZWcsIHRhZywKLQkJCQkJaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddKTsKLQkJCX0KLQotCQkJaWYgKChob3N0X3B2dC5kbWFfaW50ZXJydXB0X2NvdW50ICUgMikgPT0gMCkKLQkJCQlzYXRhX2R3Y19kbWFfeGZlcl9jb21wbGV0ZShhcCwgMSk7Ci0KLQkJCS8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgKi8KLQkJCW91dF9sZTMyKCYoaG9zdF9wdnQuc2F0YV9kbWFfcmVncy0+aW50ZXJydXB0X2NsZWFyXAotCQkJCS50ZnIubG93KSwKLQkJCQkgRE1BX0NIQU5ORUwoY2hhbikpOwotCQl9Ci0KLQkJLyogQ2hlY2sgZm9yIGVycm9yIGludGVycnVwdC4gKi8KLQkJaWYgKGVycl9yZWcgJiBETUFfQ0hBTk5FTChjaGFuKSkgewotCQkJLyogVE9ETyBOZWVkIGVycm9yIGhhbmRsZXIgISAqLwotCQkJZGV2X2VycihhcC0+ZGV2LCAiZXJyb3IgaW50ZXJydXB0IGVycl9yZWc9MHglMDh4XG4iLAotCQkJCWVycl9yZWcpOwotCi0JCQkvKiBDbGVhciB0aGUgaW50ZXJydXB0LiAqLwotCQkJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfY2xlYXJcCi0JCQkJLmVycm9yLmxvdyksCi0JCQkJIERNQV9DSEFOTkVMKGNoYW4pKTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKgotICogRnVuY3Rpb246IGRtYV9yZXF1ZXN0X2ludGVycnVwdHMKLSAqIGFyZ3VtZW50czogaHNkZXYKLSAqIHJldHVybnMgc3RhdHVzCi0gKiBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBJU1IgZm9yIGEgcGFydGljdWxhciBETUEgY2hhbm5lbCBpbnRlcnJ1cHQKLSAqLwotc3RhdGljIGludCBkbWFfcmVxdWVzdF9pbnRlcnJ1cHRzKHN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2LCBpbnQgaXJxKQotewotCWludCByZXR2YWwgPSAwOwotCWludCBjaGFuID0gaG9zdF9wdnQuZG1hX2NoYW5uZWw7Ci0KLQlpZiAoY2hhbiA+PSAwKSB7Ci0JCS8qIFVubWFzayBlcnJvciBpbnRlcnJ1cHQgKi8KLQkJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzKS0+aW50ZXJydXB0X21hc2suZXJyb3IubG93LAotCQkJIERNQV9FTkFCTEVfQ0hBTihjaGFuKSk7Ci0KLQkJLyogVW5tYXNrIGVuZC1vZi10cmFuc2ZlciBpbnRlcnJ1cHQgKi8KLQkJb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzKS0+aW50ZXJydXB0X21hc2sudGZyLmxvdywKLQkJCSBETUFfRU5BQkxFX0NIQU4oY2hhbikpOwotCX0KLQotCXJldHZhbCA9IHJlcXVlc3RfaXJxKGlycSwgZG1hX2R3Y19pbnRlcnJ1cHQsIDAsICJTQVRBIERNQSIsIGhzZGV2KTsKLQlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoaG9zdF9wdnQuZHdjX2RldiwgIiVzOiBjb3VsZCBub3QgZ2V0IElSUSAlZFxuIiwKLQkJX19mdW5jX18sIGlycSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIE1hcmsgdGhpcyBpbnRlcnJ1cHQgYXMgcmVxdWVzdGVkICovCi0JaHNkZXYtPmlycV9kbWEgPSBpcnE7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogbWFwX3NnX3RvX2xsaQotICogVGhlIFN5bm9wc2lzIGRyaXZlciBoYXMgYSBjb21tZW50IHByb3Bvc2luZyB0aGF0IGJldHRlciBwZXJmb3JtYW5jZQotICogaXMgcG9zc2libGUgYnkgb25seSBlbmFibGluZyBpbnRlcnJ1cHRzIG9uIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIGxpbmtlZCBsaXN0LgotICogSG93ZXZlciwgaXQgc2VlbXMgdGhhdCBjb3VsZCBiZSBhIHByb2JsZW0gaWYgYW4gZXJyb3IgaGFwcGVuZWQgb24gb25lIG9mIHRoZQotICogZmlyc3QgaXRlbXMuICBUaGUgdHJhbnNmZXIgd291bGQgaGFsdCwgYnV0IG5vIGVycm9yIGludGVycnVwdCB3b3VsZCBvY2N1ci4KLSAqIEN1cnJlbnRseSB0aGlzIGZ1bmN0aW9uIHNldHMgaW50ZXJydXB0cyBlbmFibGVkIGZvciBlYWNoIGxpbmtlZCBsaXN0IGl0ZW06Ci0gKiBETUFfQ1RMX0lOVF9FTi4KLSAqLwotc3RhdGljIGludCBtYXBfc2dfdG9fbGxpKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGludCBudW1fZWxlbXMsCi0JCQlzdHJ1Y3QgbGxpICpsbGksIGRtYV9hZGRyX3QgZG1hX2xsaSwKLQkJCXZvaWQgX19pb21lbSAqZG1hZHJfYWRkciwgaW50IGRpcikKLXsKLQlpbnQgaSwgaWR4ID0gMDsKLQlpbnQgZmlzX2xlbiA9IDA7Ci0JZG1hX2FkZHJfdCBuZXh0X2xscDsKLQlpbnQgYmw7Ci0JaW50IHNtc192YWwsIGRtc192YWw7Ci0KLQlzbXNfdmFsID0gMDsKLQlkbXNfdmFsID0gMSArIGhvc3RfcHZ0LmRtYV9jaGFubmVsOwotCWRldl9kYmcoaG9zdF9wdnQuZHdjX2RldiwKLQkJIiVzOiBzZz0lcCBuZWxlbT0lZCBsbGk9JXAgZG1hX2xsaT0weCVwYWQgZG1hZHI9MHglcFxuIiwKLQkJX19mdW5jX18sIHNnLCBudW1fZWxlbXMsIGxsaSwgJmRtYV9sbGksIGRtYWRyX2FkZHIpOwotCi0JYmwgPSBnZXRfYnVyc3RfbGVuZ3RoX2VuY29kZShBSEJfRE1BX0JSU1RfREZMVCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2VsZW1zOyBpKyssIHNnKyspIHsKLQkJdTMyIGFkZHIsIG9mZnNldDsKLQkJdTMyIHNnX2xlbiwgbGVuOwotCi0JCWFkZHIgPSAodTMyKSBzZ19kbWFfYWRkcmVzcyhzZyk7Ci0JCXNnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOwotCi0JCWRldl9kYmcoaG9zdF9wdnQuZHdjX2RldiwgIiVzOiBlbGVtPSVkIHNnX2FkZHI9MHgleCBzZ19sZW4iCi0JCQkiPSVkXG4iLCBfX2Z1bmNfXywgaSwgYWRkciwgc2dfbGVuKTsKLQotCQl3aGlsZSAoc2dfbGVuKSB7Ci0JCQlpZiAoaWR4ID49IFNBVEFfRFdDX0RNQUNfTExJX05VTSkgewotCQkJCS8qIFRoZSBMTEkgdGFibGUgaXMgbm90IGxhcmdlIGVub3VnaC4gKi8KLQkJCQlkZXZfZXJyKGhvc3RfcHZ0LmR3Y19kZXYsICJMTEkgdGFibGUgb3ZlcnJ1biAiCi0JCQkJIihpZHg9JWQpXG4iLCBpZHgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJbGVuID0gKHNnX2xlbiA+IFNBVEFfRFdDX0RNQUNfQ1RSTF9UU0laRV9NQVgpID8KLQkJCQlTQVRBX0RXQ19ETUFDX0NUUkxfVFNJWkVfTUFYIDogc2dfbGVuOwotCi0JCQlvZmZzZXQgPSBhZGRyICYgMHhmZmZmOwotCQkJaWYgKChvZmZzZXQgKyBzZ19sZW4pID4gMHgxMDAwMCkKLQkJCQlsZW4gPSAweDEwMDAwIC0gb2Zmc2V0OwotCi0JCQkvKgotCQkJICogTWFrZSBzdXJlIGEgTExJIGJsb2NrIGlzIG5vdCBjcmVhdGVkIHRoYXQgd2lsbCBzcGFuCi0JCQkgKiA4SyBtYXggRklTIGJvdW5kYXJ5LiAgSWYgdGhlIGJsb2NrIHNwYW5zIHN1Y2ggYSBGSVMKLQkJCSAqIGJvdW5kYXJ5LCB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGEgRE1BIGJ1cnN0IHdpbGwKLQkJCSAqIGNyb3NzIHRoYXQgYm91bmRhcnkgLS0gdGhpcyByZXN1bHRzIGluIGFuIGVycm9yIGluCi0JCQkgKiB0aGUgaG9zdCBjb250cm9sbGVyLgotCQkJICovCi0JCQlpZiAoZmlzX2xlbiArIGxlbiA+IDgxOTIpIHsKLQkJCQlkZXZfZGJnKGhvc3RfcHZ0LmR3Y19kZXYsICJTUExJVFRJTkc6IGZpc19sZW49IgotCQkJCQkiJWQoMHgleCkgbGVuPSVkKDB4JXgpXG4iLCBmaXNfbGVuLAotCQkJCQkgZmlzX2xlbiwgbGVuLCBsZW4pOwotCQkJCWxlbiA9IDgxOTIgLSBmaXNfbGVuOwotCQkJCWZpc19sZW4gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlmaXNfbGVuICs9IGxlbjsKLQkJCX0KLQkJCWlmIChmaXNfbGVuID09IDgxOTIpCi0JCQkJZmlzX2xlbiA9IDA7Ci0KLQkJCS8qCi0JCQkgKiBTZXQgRE1BIGFkZHJlc3NlcyBhbmQgbG93ZXIgaGFsZiBvZiBjb250cm9sIHJlZ2lzdGVyCi0JCQkgKiBiYXNlZCBvbiBkaXJlY3Rpb24uCi0JCQkgKi8KLQkJCWlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKSB7Ci0JCQkJbGxpW2lkeF0uZGFyID0gY3B1X3RvX2xlMzIoYWRkcik7Ci0JCQkJbGxpW2lkeF0uc2FyID0gY3B1X3RvX2xlMzIoKHUzMilkbWFkcl9hZGRyKTsKLQotCQkJCWxsaVtpZHhdLmN0bC5sb3cgPSBjcHVfdG9fbGUzMigKLQkJCQkJRE1BX0NUTF9UVEZDKERNQV9DVExfVFRGQ19QMk1fRE1BQykgfAotCQkJCQlETUFfQ1RMX1NNUyhzbXNfdmFsKSB8Ci0JCQkJCURNQV9DVExfRE1TKGRtc192YWwpIHwKLQkJCQkJRE1BX0NUTF9TUkNfTVNJWkUoYmwpIHwKLQkJCQkJRE1BX0NUTF9EU1RfTVNJWkUoYmwpIHwKLQkJCQkJRE1BX0NUTF9TSU5DX05PQ0hBTkdFIHwKLQkJCQkJRE1BX0NUTF9TUkNfVFJXSUQoMikgfAotCQkJCQlETUFfQ1RMX0RTVF9UUldJRCgyKSB8Ci0JCQkJCURNQV9DVExfSU5UX0VOIHwKLQkJCQkJRE1BX0NUTF9MTFBfU1JDRU4gfAotCQkJCQlETUFfQ1RMX0xMUF9EU1RFTik7Ci0JCQl9IGVsc2UgewkvKiBETUFfVE9fREVWSUNFICovCi0JCQkJbGxpW2lkeF0uc2FyID0gY3B1X3RvX2xlMzIoYWRkcik7Ci0JCQkJbGxpW2lkeF0uZGFyID0gY3B1X3RvX2xlMzIoKHUzMilkbWFkcl9hZGRyKTsKLQotCQkJCWxsaVtpZHhdLmN0bC5sb3cgPSBjcHVfdG9fbGUzMigKLQkJCQkJRE1BX0NUTF9UVEZDKERNQV9DVExfVFRGQ19NMlBfUEVSKSB8Ci0JCQkJCURNQV9DVExfU01TKGRtc192YWwpIHwKLQkJCQkJRE1BX0NUTF9ETVMoc21zX3ZhbCkgfAotCQkJCQlETUFfQ1RMX1NSQ19NU0laRShibCkgfAotCQkJCQlETUFfQ1RMX0RTVF9NU0laRShibCkgfAotCQkJCQlETUFfQ1RMX0RJTkNfTk9DSEFOR0UgfAotCQkJCQlETUFfQ1RMX1NSQ19UUldJRCgyKSB8Ci0JCQkJCURNQV9DVExfRFNUX1RSV0lEKDIpIHwKLQkJCQkJRE1BX0NUTF9JTlRfRU4gfAotCQkJCQlETUFfQ1RMX0xMUF9TUkNFTiB8Ci0JCQkJCURNQV9DVExfTExQX0RTVEVOKTsKLQkJCX0KLQotCQkJZGV2X2RiZyhob3N0X3B2dC5kd2NfZGV2LCAiJXMgc2V0dGluZyBjdGwuaGlnaCBsZW46ICIKLQkJCQkiMHglMDh4IHZhbDogMHglMDh4XG4iLCBfX2Z1bmNfXywKLQkJCQlsZW4sIERNQV9DVExfQkxLX1RTKGxlbiAvIDQpKTsKLQotCQkJLyogUHJvZ3JhbSB0aGUgTExJIENUTCBoaWdoIHJlZ2lzdGVyICovCi0JCQlsbGlbaWR4XS5jdGwuaGlnaCA9IGNwdV90b19sZTMyKERNQV9DVExfQkxLX1RTXAotCQkJCQkJKGxlbiAvIDQpKTsKLQotCQkJLyogUHJvZ3JhbSB0aGUgbmV4dCBwb2ludGVyLiAgVGhlIG5leHQgcG9pbnRlciBtdXN0IGJlCi0JCQkgKiB0aGUgcGh5c2ljYWwgYWRkcmVzcywgbm90IHRoZSB2aXJ0dWFsIGFkZHJlc3MuCi0JCQkgKi8KLQkJCW5leHRfbGxwID0gKGRtYV9sbGkgKyAoKGlkeCArIDEpICogc2l6ZW9mKHN0cnVjdCBcCi0JCQkJCQkJbGxpKSkpOwotCi0JCQkvKiBUaGUgbGFzdCAyIGJpdHMgZW5jb2RlIHRoZSBsaXN0IG1hc3RlciBzZWxlY3QuICovCi0JCQluZXh0X2xscCA9IERNQV9MTFBfTE1TKG5leHRfbGxwLCBETUFfTExQX0FIQk1BU1RFUjIpOwotCi0JCQlsbGlbaWR4XS5sbHAgPSBjcHVfdG9fbGUzMihuZXh0X2xscCk7Ci0JCQlpZHgrKzsKLQkJCXNnX2xlbiAtPSBsZW47Ci0JCQlhZGRyICs9IGxlbjsKLQkJfQotCX0KLQogCS8qCi0JICogVGhlIGxhc3QgbmV4dCBwdHIgaGFzIHRvIGJlIHplcm8gYW5kIHRoZSBsYXN0IGNvbnRyb2wgbG93IHJlZ2lzdGVyCi0JICogaGFzIHRvIGhhdmUgTExQX1NSQ19FTiBhbmQgTExQX0RTVF9FTiAobGlua2VkIGxpc3QgcG9pbnRlciBzb3VyY2UKLQkgKiBhbmQgZGVzdGluYXRpb24gZW5hYmxlKSBzZXQgYmFjayB0byAwIChkaXNhYmxlZC4pIFRoaXMgaXMgd2hhdCB0ZWxscwotCSAqIHRoZSBjb3JlIHRoYXQgdGhpcyBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBsaW5rZWQgbGlzdC4KKwkgKiBFYWNoIERNQSBjb21tYW5kIHByb2R1Y2VzIDIgaW50ZXJydXB0cy4gIE9ubHkKKwkgKiBjb21wbGV0ZSB0aGUgY29tbWFuZCBhZnRlciBib3RoIGludGVycnVwdHMgaGF2ZSBiZWVuCisJICogc2Vlbi4gKFNlZSBzYXRhX2R3Y19pc3IoKSkKIAkgKi8KLQlpZiAoaWR4KSB7Ci0JCWxsaVtpZHgtMV0ubGxwID0gMHgwMDAwMDAwMDsKLQkJbGxpW2lkeC0xXS5jdGwubG93ICY9IERNQV9DVExfTExQX0RJU0FCTEVfTEUzMjsKKwloc2RldnAtPmRtYV9pbnRlcnJ1cHRfY291bnQrKzsKKwlzYXRhX2R3Y19jbGVhcl9kbWFjcihoc2RldnAsIHRhZyk7CiAKLQkJLyogRmx1c2ggY2FjaGUgdG8gbWVtb3J5ICovCi0JCWRtYV9jYWNoZV9zeW5jKE5VTEwsIGxsaSwgKHNpemVvZihzdHJ1Y3QgbGxpKSAqIGlkeCksCi0JCQkgICAgICAgRE1BX0JJRElSRUNUSU9OQUwpOworCWlmIChoc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10gPT0gU0FUQV9EV0NfRE1BX1BFTkRJTkdfTk9ORSkgeworCQlkZXZfZXJyKGFwLT5kZXYsICJETUEgbm90IHBlbmRpbmcgdGFnPTB4JTAyeCBwZW5kaW5nPSVkXG4iLAorCQkJdGFnLCBoc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10pOwogCX0KIAotCXJldHVybiBpZHg7CisJaWYgKChoc2RldnAtPmRtYV9pbnRlcnJ1cHRfY291bnQgJSAyKSA9PSAwKQorCQlzYXRhX2R3Y19kbWFfeGZlcl9jb21wbGV0ZShhcCwgMSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7CiB9CiAKLS8qCi0gKiBGdW5jdGlvbjogZG1hX2R3Y194ZmVyX3N0YXJ0Ci0gKiBhcmd1bWVudHM6IENoYW5uZWwgbnVtYmVyCi0gKiBSZXR1cm4gOiBOb25lCi0gKiBFbmFibGVzIHRoZSBETUEgY2hhbm5lbAotICovCi1zdGF0aWMgdm9pZCBkbWFfZHdjX3hmZXJfc3RhcnQoaW50IGRtYV9jaCkKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRtYV9kd2NfeGZlcl9zZXR1cChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKQogewotCS8qIEVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgKi8KLQlvdXRfbGUzMigmKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MtPmRtYV9jaGFuX2VuLmxvdyksCi0JCSBpbl9sZTMyKCYoaG9zdF9wdnQuc2F0YV9kbWFfcmVncy0+ZG1hX2NoYW5fZW4ubG93KSkgfAotCQkgRE1BX0VOQUJMRV9DSEFOKGRtYV9jaCkpOwotfQorCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBxYy0+YXA7CisJc3RydWN0IHNhdGFfZHdjX2RldmljZV9wb3J0ICpoc2RldnAgPSBIU0RFVlBfRlJPTV9BUChhcCk7CisJc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXYgPSBIU0RFVl9GUk9NX0FQKGFwKTsKKwlkbWFfYWRkcl90IGFkZHIgPSAoZG1hX2FkZHJfdCkmaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmRtYWRyOworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIHNjb25mOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKIAotc3RhdGljIGludCBkbWFfZHdjX3hmZXJfc2V0dXAoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgaW50IG51bV9lbGVtcywKLQkJCSAgICAgIHN0cnVjdCBsbGkgKmxsaSwgZG1hX2FkZHJfdCBkbWFfbGxpLAotCQkJICAgICAgdm9pZCBfX2lvbWVtICphZGRyLCBpbnQgZGlyKQotewotCWludCBkbWFfY2g7Ci0JaW50IG51bV9sbGk7Ci0JLyogQWNxdWlyZSBETUEgY2hhbm5lbCAqLwotCWRtYV9jaCA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwoKTsKLQlpZiAoZG1hX2NoID09IC0xKSB7Ci0JCWRldl9lcnIoaG9zdF9wdnQuZHdjX2RldiwgIiVzOiBkbWEgY2hhbm5lbCB1bmF2YWlsYWJsZVxuIiwKLQkJCSBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRUFHQUlOOworCWlmIChxYy0+ZG1hX2RpciA9PSBETUFfREVWX1RPX01FTSkgeworCQlzY29uZi5zcmNfYWRkciA9IGFkZHI7CisJCXNjb25mLmRldmljZV9mYyA9IHRydWU7CisJfSBlbHNlIHsJLyogRE1BX01FTV9UT19ERVYgKi8KKwkJc2NvbmYuZHN0X2FkZHIgPSBhZGRyOworCQlzY29uZi5kZXZpY2VfZmMgPSBmYWxzZTsKIAl9CiAKKwlzY29uZi5kaXJlY3Rpb24gPSBxYy0+ZG1hX2RpcjsKKwlzY29uZi5zcmNfbWF4YnVyc3QgPSBBSEJfRE1BX0JSU1RfREZMVDsKKwlzY29uZi5kc3RfbWF4YnVyc3QgPSBBSEJfRE1BX0JSU1RfREZMVDsKKwlzY29uZi5zcmNfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOworCXNjb25mLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7CisKKwlkbWFlbmdpbmVfc2xhdmVfY29uZmlnKGhzZGV2cC0+Y2hhbiwgJnNjb25mKTsKKwogCS8qIENvbnZlcnQgU0cgbGlzdCB0byBsaW5rZWQgbGlzdCBvZiBpdGVtcyAoTExJcykgZm9yIEFIQiBETUEgKi8KLQludW1fbGxpID0gbWFwX3NnX3RvX2xsaShzZywgbnVtX2VsZW1zLCBsbGksIGRtYV9sbGksIGFkZHIsIGRpcik7CisJZGVzYyA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NnKGhzZGV2cC0+Y2hhbiwgcWMtPnNnLCBxYy0+bl9lbGVtLAorCQkJCSAgICAgICBxYy0+ZG1hX2RpciwKKwkJCQkgICAgICAgRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLKTsKIAotCWRldl9kYmcoaG9zdF9wdnQuZHdjX2RldiwgIiVzIHNnOiAweCVwLCBjb3VudDogJWQgbGxpOiAlcCBkbWFfbGxpOiIKLQkJIiAweCUweGx4IGFkZHI6ICVwIGxsaSBjb3VudDogJWRcbiIsIF9fZnVuY19fLCBzZywgbnVtX2VsZW1zLAotCQkgbGxpLCAodTMyKWRtYV9sbGksIGFkZHIsIG51bV9sbGkpOworCWlmICghZGVzYykKKwkJcmV0dXJuIE5VTEw7CiAKLQljbGVhcl9jaGFuX2ludGVycnVwdHMoZG1hX2NoKTsKKwlkZXNjLT5jYWxsYmFjayA9IGRtYV9kd2NfeGZlcl9kb25lOworCWRlc2MtPmNhbGxiYWNrX3BhcmFtID0gaHNkZXY7CiAKLQkvKiBQcm9ncmFtIHRoZSBDRkcgcmVnaXN0ZXIuICovCi0Jb3V0X2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5jaGFuX3JlZ3NbZG1hX2NoXS5jZmcuaGlnaCksCi0JCSBETUFfQ0ZHX0hXX0hTX1NSQyhkbWFfY2gpIHwgRE1BX0NGR19IV19IU19ERVNUKGRtYV9jaCkgfAotCQkgRE1BX0NGR19QUk9UQ1RMIHwgRE1BX0NGR19GQ01PRF9SRVEpOwotCW91dF9sZTMyKCYoaG9zdF9wdnQuc2F0YV9kbWFfcmVncy0+Y2hhbl9yZWdzW2RtYV9jaF0uY2ZnLmxvdyksCi0JCSBETUFfQ0ZHX0hXX0NIX1BSSU9SKGRtYV9jaCkpOworCWRldl9kYmcoaHNkZXYtPmRldiwgIiVzIHNnOiAweCVwLCBjb3VudDogJWQgYWRkcjogJXBhZFxuIiwKKwkJX19mdW5jX18sIHFjLT5zZywgcWMtPm5fZWxlbSwgJmFkZHIpOwogCi0JLyogUHJvZ3JhbSB0aGUgYWRkcmVzcyBvZiB0aGUgbGlua2VkIGxpc3QgKi8KLQlvdXRfbGUzMigmKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MtPmNoYW5fcmVnc1tkbWFfY2hdLmxscC5sb3cpLAotCQkgRE1BX0xMUF9MTVMoZG1hX2xsaSwgRE1BX0xMUF9BSEJNQVNURVIyKSk7Ci0KLQkvKiBQcm9ncmFtIHRoZSBDVEwgcmVnaXN0ZXIgd2l0aCBzcmMgZW5hYmxlIC8gZHN0IGVuYWJsZSAqLwotCW91dF9sZTMyKCYoaG9zdF9wdnQuc2F0YV9kbWFfcmVncy0+Y2hhbl9yZWdzW2RtYV9jaF0uY3RsLmxvdyksCi0JCSBETUFfQ1RMX0xMUF9TUkNFTiB8IERNQV9DVExfTExQX0RTVEVOKTsKLQlyZXR1cm4gZG1hX2NoOwotfQotCi0vKgotICogRnVuY3Rpb246IGRtYV9kd2NfZXhpdAotICogYXJndW1lbnRzOiBOb25lCi0gKiByZXR1cm5zIHN0YXR1cwotICogVGhpcyBmdW5jdGlvbiBleGl0cyB0aGUgU0FUQSBETUEgZHJpdmVyCi0gKi8KLXN0YXRpYyB2b2lkIGRtYV9kd2NfZXhpdChzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlICpoc2RldikKLXsKLQlkZXZfZGJnKGhvc3RfcHZ0LmR3Y19kZXYsICIlczpcbiIsIF9fZnVuY19fKTsKLQlpZiAoaG9zdF9wdnQuc2F0YV9kbWFfcmVncykgewotCQlpb3VubWFwKCh2b2lkIF9faW9tZW0gKilob3N0X3B2dC5zYXRhX2RtYV9yZWdzKTsKLQkJaG9zdF9wdnQuc2F0YV9kbWFfcmVncyA9IE5VTEw7Ci0JfQotCi0JaWYgKGhzZGV2LT5pcnFfZG1hKSB7Ci0JCWZyZWVfaXJxKGhzZGV2LT5pcnFfZG1hLCBoc2Rldik7Ci0JCWhzZGV2LT5pcnFfZG1hID0gMDsKLQl9Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbjogZG1hX2R3Y19pbml0Ci0gKiBhcmd1bWVudHM6IGhzZGV2Ci0gKiByZXR1cm5zIHN0YXR1cwotICogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgU0FUQSBETUEgZHJpdmVyCi0gKi8KLXN0YXRpYyBpbnQgZG1hX2R3Y19pbml0KHN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2LCBpbnQgaXJxKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBkbWFfcmVxdWVzdF9pbnRlcnJ1cHRzKGhzZGV2LCBpcnEpOwotCWlmIChlcnIpIHsKLQkJZGV2X2Vycihob3N0X3B2dC5kd2NfZGV2LCAiJXM6IGRtYV9yZXF1ZXN0X2ludGVycnVwdHMgcmV0dXJucyIKLQkJCSIgJWRcbiIsIF9fZnVuY19fLCBlcnIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCS8qIEVuYWJlIERNQSAqLwotCW91dF9sZTMyKCYoaG9zdF9wdnQuc2F0YV9kbWFfcmVncy0+ZG1hX2NmZy5sb3cpLCBETUFfRU4pOwotCi0JZGV2X25vdGljZShob3N0X3B2dC5kd2NfZGV2LCAiRE1BIGluaXRpYWxpemVkXG4iKTsKLQlkZXZfZGJnKGhvc3RfcHZ0LmR3Y19kZXYsICJTQVRBIERNQSByZWdpc3RlcnM9MHglcFxuIiwgaG9zdF9wdnQuXAotCQlzYXRhX2RtYV9yZWdzKTsKLQotCXJldHVybiAwOworCXJldHVybiBkZXNjOwogfQogCiBzdGF0aWMgaW50IHNhdGFfZHdjX3Njcl9yZWFkKHN0cnVjdCBhdGFfbGluayAqbGluaywgdW5zaWduZWQgaW50IHNjciwgdTMyICp2YWwpCkBAIC04OTEsMjEgKzQwOSwxOCBAQAogCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7CiAJdTMyIHNlcnJvcjsKIAl1OCBzdGF0dXMsIHRhZzsKLQl1MzIgZXJyX3JlZzsKIAogCWF0YV9laGlfY2xlYXJfZGVzYyhlaGkpOwogCiAJc2Vycm9yID0gY29yZV9zY3JfcmVhZChTQ1JfRVJST1IpOwogCXN0YXR1cyA9IGFwLT5vcHMtPnNmZl9jaGVja19zdGF0dXMoYXApOwogCi0JZXJyX3JlZyA9IGluX2xlMzIoJihob3N0X3B2dC5zYXRhX2RtYV9yZWdzLT5pbnRlcnJ1cHRfc3RhdHVzLmVycm9yLlwKLQkJCWxvdykpOwogCXRhZyA9IGFwLT5saW5rLmFjdGl2ZV90YWc7CiAKLQlkZXZfZXJyKGFwLT5kZXYsICIlcyBTQ1JfRVJST1I9MHglMDh4IGludHByPTB4JTA4eCBzdGF0dXM9MHglMDh4ICIKLQkJImRtYV9pbnRwPSVkIHBlbmRpbmc9JWQgaXNzdWVkPSVkIGRtYV9lcnJfc3RhdHVzPTB4JTA4eFxuIiwKLQkJX19mdW5jX18sIHNlcnJvciwgaW50cHIsIHN0YXR1cywgaG9zdF9wdnQuZG1hX2ludGVycnVwdF9jb3VudCwKLQkJaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddLCBoc2RldnAtPmNtZF9pc3N1ZWRbdGFnXSwgZXJyX3JlZyk7CisJZGV2X2VycihhcC0+ZGV2LAorCQkiJXMgU0NSX0VSUk9SPTB4JTA4eCBpbnRwcj0weCUwOHggc3RhdHVzPTB4JTA4eCBkbWFfaW50cD0lZCBwZW5kaW5nPSVkIGlzc3VlZD0lZCIsCisJCV9fZnVuY19fLCBzZXJyb3IsIGludHByLCBzdGF0dXMsIGhzZGV2cC0+ZG1hX2ludGVycnVwdF9jb3VudCwKKwkJaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddLCBoc2RldnAtPmNtZF9pc3N1ZWRbdGFnXSk7CiAKIAkvKiBDbGVhciBlcnJvciByZWdpc3RlciBhbmQgaW50ZXJydXB0IGJpdCAqLwogCWNsZWFyX3NlcnJvcigpOwpAQCAtMTAwMyw4ICs1MTgsOSBAQAogCiAJCS8qIERFViBpbnRlcnJ1cHQgdy8gbm8gYWN0aXZlIHFjPyAqLwogCQlpZiAodW5saWtlbHkoIXFjIHx8IChxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfUE9MTElORykpKSB7Ci0JCQlkZXZfZXJyKGFwLT5kZXYsICIlcyBpbnRlcnJ1cHQgd2l0aCBubyBhY3RpdmUgcWMgIgotCQkJCSJxYz0lcFxuIiwgX19mdW5jX18sIHFjKTsKKwkJCWRldl9lcnIoYXAtPmRldiwKKwkJCQkiJXMgaW50ZXJydXB0IHdpdGggbm8gYWN0aXZlIHFjIHFjPSVwXG4iLAorCQkJCV9fZnVuY19fLCBxYyk7CiAJCQlhcC0+b3BzLT5zZmZfY2hlY2tfc3RhdHVzKGFwKTsKIAkJCWhhbmRsZWQgPSAxOwogCQkJZ290byBET05FOwpAQCAtMTAzMSwxNiArNTQ3LDE2IEBACiAJCQkgKiBvcGVyYXRpb24gZG9uZSBpbnRlcnJ1cHQuIFRoZSBjb21tYW5kIHNob3VsZCBiZQogCQkJICogY29tcGxldGVkIG9ubHkgYWZ0ZXIgYm90aCBpbnRlcnJ1cHRzIGFyZSBzZWVuLgogCQkJICovCi0JCQlob3N0X3B2dC5kbWFfaW50ZXJydXB0X2NvdW50Kys7CisJCQloc2RldnAtPmRtYV9pbnRlcnJ1cHRfY291bnQrKzsKIAkJCWlmIChoc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10gPT0gXAogCQkJCQlTQVRBX0RXQ19ETUFfUEVORElOR19OT05FKSB7Ci0JCQkJZGV2X2VycihhcC0+ZGV2LCAiJXM6IERNQSBub3QgcGVuZGluZyAiCi0JCQkJCSJpbnRwcj0weCUwOHggc3RhdHVzPTB4JTA4eCBwZW5kaW5nIgotCQkJCQkiPSVkXG4iLCBfX2Z1bmNfXywgaW50cHIsIHN0YXR1cywKKwkJCQlkZXZfZXJyKGFwLT5kZXYsCisJCQkJCSIlczogRE1BIG5vdCBwZW5kaW5nIGludHByPTB4JTA4eCBzdGF0dXM9MHglMDh4IHBlbmRpbmc9JWRcbiIsCisJCQkJCV9fZnVuY19fLCBpbnRwciwgc3RhdHVzLAogCQkJCQloc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10pOwogCQkJfQogCi0JCQlpZiAoKGhvc3RfcHZ0LmRtYV9pbnRlcnJ1cHRfY291bnQgJSAyKSA9PSAwKQorCQkJaWYgKChoc2RldnAtPmRtYV9pbnRlcnJ1cHRfY291bnQgJSAyKSA9PSAwKQogCQkJCXNhdGFfZHdjX2RtYV94ZmVyX2NvbXBsZXRlKGFwLCAxKTsKIAkJfSBlbHNlIGlmIChhdGFfaXNfcGlvKHFjLT50Zi5wcm90b2NvbCkpIHsKIAkJCWF0YV9zZmZfaHNtX21vdmUoYXAsIHFjLCBzdGF0dXMsIDApOwpAQCAtMTA2OCwxNyArNTg0LDE3IEBACiAKIAlpZiAoc2FjdGl2ZSAhPSAwIHx8IChob3N0X3B2dC5zYXRhX2R3Y19zYWN0aXZlX2lzc3VlZCkgPiAxIHx8IFwKIAkJCQkJCQl0YWdfbWFzayA+IDEpIHsKLQkJZGV2X2RiZyhhcC0+ZGV2LCAiJXMgTkNROnNhY3RpdmU9MHglMDh4ICBzYWN0aXZlX2lzc3VlZD0weCUwOHgiCi0JCQkidGFnX21hc2s9MHglMDh4XG4iLCBfX2Z1bmNfXywgc2FjdGl2ZSwKLQkJCWhvc3RfcHZ0LnNhdGFfZHdjX3NhY3RpdmVfaXNzdWVkLCB0YWdfbWFzayk7CisJCWRldl9kYmcoYXAtPmRldiwKKwkJCSIlcyBOQ1E6c2FjdGl2ZT0weCUwOHggIHNhY3RpdmVfaXNzdWVkPTB4JTA4eCB0YWdfbWFzaz0weCUwOHhcbiIsCisJCQlfX2Z1bmNfXywgc2FjdGl2ZSwgaG9zdF9wdnQuc2F0YV9kd2Nfc2FjdGl2ZV9pc3N1ZWQsCisJCQl0YWdfbWFzayk7CiAJfQogCiAJaWYgKCh0YWdfbWFzayB8IChob3N0X3B2dC5zYXRhX2R3Y19zYWN0aXZlX2lzc3VlZCkpICE9IFwKIAkJCQkJKGhvc3RfcHZ0LnNhdGFfZHdjX3NhY3RpdmVfaXNzdWVkKSkgewotCQlkZXZfd2FybihhcC0+ZGV2LCAiQmFkIHRhZyBtYXNrPyAgc2FjdGl2ZT0weCUwOHggIgotCQkJICIoaG9zdF9wdnQuc2F0YV9kd2Nfc2FjdGl2ZV9pc3N1ZWQpPTB4JTA4eCAgdGFnX21hc2siCi0JCQkgIj0weCUwOHhcbiIsIHNhY3RpdmUsIGhvc3RfcHZ0LnNhdGFfZHdjX3NhY3RpdmVfaXNzdWVkLAotCQkJICB0YWdfbWFzayk7CisJCWRldl93YXJuKGFwLT5kZXYsCisJCQkgIkJhZCB0YWcgbWFzaz8gIHNhY3RpdmU9MHglMDh4IChob3N0X3B2dC5zYXRhX2R3Y19zYWN0aXZlX2lzc3VlZCk9MHglMDh4ICB0YWdfbWFzaz0weCUwOHhcbiIsCisJCQkgc2FjdGl2ZSwgaG9zdF9wdnQuc2F0YV9kd2Nfc2FjdGl2ZV9pc3N1ZWQsIHRhZ19tYXNrKTsKIAl9CiAKIAkvKiByZWFkIGp1c3QgdG8gY2xlYXIgLi4uIG5vdCBiYWQgaWYgY3VycmVudGx5IHN0aWxsIGJ1c3kgKi8KQEAgLTExMTQsMTIgKzYzMCwxMiBAQAogCQlkZXZfZGJnKGFwLT5kZXYsICIlcyBOQ1EgY29tbWFuZCwgcHJvdG9jb2w6ICVzXG4iLCBfX2Z1bmNfXywKIAkJCWdldF9wcm90X2Rlc2NyaXB0KHFjLT50Zi5wcm90b2NvbCkpOwogCQlpZiAoYXRhX2lzX2RtYShxYy0+dGYucHJvdG9jb2wpKSB7Ci0JCQlob3N0X3B2dC5kbWFfaW50ZXJydXB0X2NvdW50Kys7CisJCQloc2RldnAtPmRtYV9pbnRlcnJ1cHRfY291bnQrKzsKIAkJCWlmIChoc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10gPT0gXAogCQkJCQlTQVRBX0RXQ19ETUFfUEVORElOR19OT05FKQogCQkJCWRldl93YXJuKGFwLT5kZXYsICIlczogRE1BIG5vdCBwZW5kaW5nP1xuIiwKIAkJCQkJX19mdW5jX18pOwotCQkJaWYgKChob3N0X3B2dC5kbWFfaW50ZXJydXB0X2NvdW50ICUgMikgPT0gMCkKKwkJCWlmICgoaHNkZXZwLT5kbWFfaW50ZXJydXB0X2NvdW50ICUgMikgPT0gMCkKIAkJCQlzYXRhX2R3Y19kbWFfeGZlcl9jb21wbGV0ZShhcCwgMSk7CiAJCX0gZWxzZSB7CiAJCQlpZiAodW5saWtlbHkoc2F0YV9kd2NfcWNfY29tcGxldGUoYXAsIHFjLCAxKSkpCkBAIC0xMTQyLDggKzY1OCw5IEBACiAJICovCiAJc2FjdGl2ZTIgPSBjb3JlX3Njcl9yZWFkKFNDUl9BQ1RJVkUpOwogCWlmIChzYWN0aXZlMiAhPSBzYWN0aXZlKSB7Ci0JCWRldl9kYmcoYXAtPmRldiwgIk1vcmUgY29tcGxldGVkIC0gc2FjdGl2ZT0weCV4IHNhY3RpdmUyIgotCQkJIj0weCV4XG4iLCBzYWN0aXZlLCBzYWN0aXZlMik7CisJCWRldl9kYmcoYXAtPmRldiwKKwkJCSJNb3JlIGNvbXBsZXRlZCAtIHNhY3RpdmU9MHgleCBzYWN0aXZlMj0weCV4XG4iLAorCQkJc2FjdGl2ZSwgc2FjdGl2ZTIpOwogCX0KIAloYW5kbGVkID0gMTsKIApAQCAtMTE2OSwxMSArNjg2LDEwIEBACiAJCSAqIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGl0IGluZGljYXRlcyB0aGUgZHJpdmVyIGlzIG91dCBvZgogCQkgKiBzeW5jLiAgSWYgaXQgZG9lcyBoYXBwZW4sIGNsZWFyIGRtYWNyIGFueXdheS4KIAkJICovCi0JCWRldl9lcnIoaG9zdF9wdnQuZHdjX2RldiwgIiVzIERNQSBwcm90b2NvbCBSWCBhbmQiCi0JCQkiVFggRE1BIG5vdCBwZW5kaW5nIHRhZz0weCUwMnggcGVuZGluZz0lZCIKLQkJCSIgZG1hY3I6IDB4JTA4eFxuIiwgX19mdW5jX18sIHRhZywKLQkJCWhzZGV2cC0+ZG1hX3BlbmRpbmdbdGFnXSwKLQkJCWluX2xlMzIoJihoc2Rldi0+c2F0YV9kd2NfcmVncy0+ZG1hY3IpKSk7CisJCWRldl9lcnIoaHNkZXYtPmRldiwKKwkJCSIlcyBETUEgcHJvdG9jb2wgUlggYW5kIFRYIERNQSBub3QgcGVuZGluZyB0YWc9MHglMDJ4IHBlbmRpbmc9JWQgZG1hY3I6IDB4JTA4eFxuIiwKKwkJCV9fZnVuY19fLCB0YWcsIGhzZGV2cC0+ZG1hX3BlbmRpbmdbdGFnXSwKKwkJCWluX2xlMzIoJmhzZGV2LT5zYXRhX2R3Y19yZWdzLT5kbWFjcikpOwogCQlvdXRfbGUzMigmKGhzZGV2LT5zYXRhX2R3Y19yZWdzLT5kbWFjciksCiAJCQlTQVRBX0RXQ19ETUFDUl9UWFJYQ0hfQ0xFQVIpOwogCX0KQEAgLTExOTUsOCArNzExLDkgQEAKIAogI2lmZGVmIERFQlVHX05DUQogCWlmICh0YWcgPiAwKSB7Ci0JCWRldl9pbmZvKGFwLT5kZXYsICIlcyB0YWc9JXUgY21kPTB4JTAyeCBkbWEgZGlyPSVzIHByb3RvPSVzICIKLQkJCSAiZG1hY3I9MHglMDh4XG4iLCBfX2Z1bmNfXywgcWMtPnRhZywgcWMtPnRmLmNvbW1hbmQsCisJCWRldl9pbmZvKGFwLT5kZXYsCisJCQkgIiVzIHRhZz0ldSBjbWQ9MHglMDJ4IGRtYSBkaXI9JXMgcHJvdG89JXMgZG1hY3I9MHglMDh4XG4iLAorCQkJIF9fZnVuY19fLCBxYy0+dGFnLCBxYy0+dGYuY29tbWFuZCwKIAkJCSBnZXRfZG1hX2Rpcl9kZXNjcmlwdChxYy0+ZG1hX2RpciksCiAJCQkgZ2V0X3Byb3RfZGVzY3JpcHQocWMtPnRmLnByb3RvY29sKSwKIAkJCSBpbl9sZTMyKCYoaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmRtYWNyKSkpOwpAQCAtMTIwNSw4ICs3MjIsOSBAQAogCiAJaWYgKGF0YV9pc19kbWEocWMtPnRmLnByb3RvY29sKSkgewogCQlpZiAoaHNkZXZwLT5kbWFfcGVuZGluZ1t0YWddID09IFNBVEFfRFdDX0RNQV9QRU5ESU5HX05PTkUpIHsKLQkJCWRldl9lcnIoYXAtPmRldiwgIiVzIERNQSBwcm90b2NvbCBSWCBhbmQgVFggRE1BIG5vdCAiCi0JCQkJInBlbmRpbmcgZG1hY3I6IDB4JTA4eFxuIiwgX19mdW5jX18sCisJCQlkZXZfZXJyKGFwLT5kZXYsCisJCQkJIiVzIERNQSBwcm90b2NvbCBSWCBhbmQgVFggRE1BIG5vdCBwZW5kaW5nIGRtYWNyOiAweCUwOHhcbiIsCisJCQkJX19mdW5jX18sCiAJCQkJaW5fbGUzMigmKGhzZGV2LT5zYXRhX2R3Y19yZWdzLT5kbWFjcikpKTsKIAkJfQogCkBAIC0xMjMyLDkgKzc1MCw5IEBACiAJCWRldl9lcnIoYXAtPmRldiwgIlRYIERNQSBQRU5ESU5HXG4iKTsKIAllbHNlIGlmIChoc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10gPT0gU0FUQV9EV0NfRE1BX1BFTkRJTkdfUlgpCiAJCWRldl9lcnIoYXAtPmRldiwgIlJYIERNQSBQRU5ESU5HXG4iKTsKLQlkZXZfZGJnKGFwLT5kZXYsICJRQyBjb21wbGV0ZSBjbWQ9MHglMDJ4IHN0YXR1cz0weCUwMnggYXRhJXU6IgotCQkiIHByb3RvY29sPSVkXG4iLCBxYy0+dGYuY29tbWFuZCwgc3RhdHVzLCBhcC0+cHJpbnRfaWQsCi0JCSBxYy0+dGYucHJvdG9jb2wpOworCWRldl9kYmcoYXAtPmRldiwKKwkJIlFDIGNvbXBsZXRlIGNtZD0weCUwMnggc3RhdHVzPTB4JTAyeCBhdGEldTogcHJvdG9jb2w9JWRcbiIsCisJCXFjLT50Zi5jb21tYW5kLCBzdGF0dXMsIGFwLT5wcmludF9pZCwgcWMtPnRmLnByb3RvY29sKTsKIAogCS8qIGNsZWFyIGFjdGl2ZSBiaXQgKi8KIAltYXNrID0gKH4ocWNtZF90YWdfdG9fbWFzayh0YWcpKSk7CkBAIC0xMjYwLDExICs3NzgsMjMgQEAKIAkgKi8KIAlvdXRfbGUzMigmaHNkZXYtPnNhdGFfZHdjX3JlZ3MtPmVycm1yLCBTQVRBX0RXQ19TRVJST1JfRVJSX0JJVFMpOwogCi0JZGV2X2RiZyhob3N0X3B2dC5kd2NfZGV2LCAiJXM6IElOVE1SID0gMHglMDh4LCBFUlJNUiA9IDB4JTA4eFxuIiwKKwlkZXZfZGJnKGhzZGV2LT5kZXYsICIlczogSU5UTVIgPSAweCUwOHgsIEVSUk1SID0gMHglMDh4XG4iLAogCQkgX19mdW5jX18sIGluX2xlMzIoJmhzZGV2LT5zYXRhX2R3Y19yZWdzLT5pbnRtciksCiAJCWluX2xlMzIoJmhzZGV2LT5zYXRhX2R3Y19yZWdzLT5lcnJtcikpOwogfQogCitzdGF0aWMgYm9vbCBzYXRhX2R3Y19kbWFfZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IHNhdGFfZHdjX2RldmljZV9wb3J0ICpoc2RldnAgPSBwYXJhbTsKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlICpkd3MgPSBoc2RldnAtPmR3czsKKworCWlmIChkd3MtPmRtYV9kZXYgIT0gY2hhbi0+ZGV2aWNlLT5kZXYpCisJCXJldHVybiBmYWxzZTsKKworCWNoYW4tPnByaXZhdGUgPSBkd3M7CisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyB2b2lkIHNhdGFfZHdjX3NldHVwX3BvcnQoc3RydWN0IGF0YV9pb3BvcnRzICpwb3J0LCB1bnNpZ25lZCBsb25nIGJhc2UpCiB7CiAJcG9ydC0+Y21kX2FkZHIgPSAodm9pZCBfX2lvbWVtICopYmFzZSArIDB4MDA7CkBAIC0xMjk5LDYgKzgyOSw3IEBACiAJc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXY7CiAJc3RydWN0IHNhdGFfZHdjX2RldmljZV9wb3J0ICpoc2RldnAgPSBOVUxMOwogCXN0cnVjdCBkZXZpY2UgKnBkZXY7CisJZG1hX2NhcF9tYXNrX3QgbWFzazsKIAlpbnQgaTsKIAogCWhzZGV2ID0gSFNERVZfRlJPTV9BUChhcCk7CkBAIC0xMzIyLDI5ICs4NTMsMjcgQEAKIAl9CiAJaHNkZXZwLT5oc2RldiA9IGhzZGV2OwogCisJaHNkZXZwLT5kd3MgPSAmc2F0YV9kd2NfZG1hX2R3czsKKwloc2RldnAtPmR3cy0+ZG1hX2RldiA9IGhzZGV2LT5kZXY7CisKKwlkbWFfY2FwX3plcm8obWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKKworCS8qIEFjcXVpcmUgRE1BIGNoYW5uZWwgKi8KKwloc2RldnAtPmNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIHNhdGFfZHdjX2RtYV9maWx0ZXIsIGhzZGV2cCk7CisJaWYgKCFoc2RldnAtPmNoYW4pIHsKKwkJZGV2X2Vycihoc2Rldi0+ZGV2LCAiJXM6IGRtYSBjaGFubmVsIHVuYXZhaWxhYmxlXG4iLAorCQkJIF9fZnVuY19fKTsKKwkJZXJyID0gLUVBR0FJTjsKKwkJZ290byBDTEVBTlVQX0FMTE9DOworCX0KKwogCWZvciAoaSA9IDA7IGkgPCBTQVRBX0RXQ19RQ01EX01BWDsgaSsrKQogCQloc2RldnAtPmNtZF9pc3N1ZWRbaV0gPSBTQVRBX0RXQ19DTURfSVNTVUVEX05PVDsKIAogCWFwLT5ibWRtYV9wcmQgPSBOVUxMOwkvKiBzZXQgdGhlc2Ugc28gbGliYXRhIGRvZXNuJ3QgdXNlIHRoZW0gKi8KIAlhcC0+Ym1kbWFfcHJkX2RtYSA9IDA7CiAKLQkvKgotCSAqIERNQSAtIEFzc2lnbiBzY2F0dGVyIGdhdGhlciBMTEkgdGFibGUuIFdlIGNhbid0IHVzZSB0aGUgbGliYXRhCi0JICogdmVyc2lvbiBzaW5jZSBpdCdzIFBSRCBpcyBJREUgUENJIHNwZWNpZmljLgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBTQVRBX0RXQ19RQ01EX01BWDsgaSsrKSB7Ci0JCWhzZGV2cC0+bGxpdFtpXSA9IGRtYV9hbGxvY19jb2hlcmVudChwZGV2LAotCQkJCQkJICAgICBTQVRBX0RXQ19ETUFDX0xMSV9UQkxfU1osCi0JCQkJCQkgICAgICYoaHNkZXZwLT5sbGl0X2RtYVtpXSksCi0JCQkJCQkgICAgIEdGUF9BVE9NSUMpOwotCQlpZiAoIWhzZGV2cC0+bGxpdFtpXSkgewotCQkJZGV2X2VycihhcC0+ZGV2LCAiJXM6IGRtYV9hbGxvY19jb2hlcmVudCBmYWlsZWRcbiIsCi0JCQkJIF9fZnVuY19fKTsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCQlnb3RvIENMRUFOVVBfQUxMT0M7Ci0JCX0KLQl9Ci0KIAlpZiAoYXAtPnBvcnRfbm8gPT0gMCkgIHsKIAkJZGV2X2RiZyhhcC0+ZGV2LCAiJXM6IGNsZWFyaW5nIFRYQ0hFTiwgUlhDSEVOIGluIERNQUNcbiIsCiAJCQlfX2Z1bmNfXyk7CkBAIC0xMzczLDIyICs5MDIsMTQgQEAKIAogc3RhdGljIHZvaWQgc2F0YV9kd2NfcG9ydF9zdG9wKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7Ci0JaW50IGk7Ci0Jc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXYgPSBIU0RFVl9GUk9NX0FQKGFwKTsKIAlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlX3BvcnQgKmhzZGV2cCA9IEhTREVWUF9GUk9NX0FQKGFwKTsKIAogCWRldl9kYmcoYXAtPmRldiwgIiVzOiBhcC0+aWQgPSAlZFxuIiwgX19mdW5jX18sIGFwLT5wcmludF9pZCk7CiAKLQlpZiAoaHNkZXZwICYmIGhzZGV2KSB7Ci0JCS8qIGRlYWxsb2NhdGUgTExJIHRhYmxlICovCi0JCWZvciAoaSA9IDA7IGkgPCBTQVRBX0RXQ19RQ01EX01BWDsgaSsrKSB7Ci0JCQlkbWFfZnJlZV9jb2hlcmVudChhcC0+aG9zdC0+ZGV2LAotCQkJCQkgIFNBVEFfRFdDX0RNQUNfTExJX1RCTF9TWiwKLQkJCQkJIGhzZGV2cC0+bGxpdFtpXSwgaHNkZXZwLT5sbGl0X2RtYVtpXSk7Ci0JCX0KKwlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChoc2RldnAtPmNoYW4pOworCWRtYV9yZWxlYXNlX2NoYW5uZWwoaHNkZXZwLT5jaGFuKTsKIAotCQlrZnJlZShoc2RldnApOwotCX0KKwlrZnJlZShoc2RldnApOwogCWFwLT5wcml2YXRlX2RhdGEgPSBOVUxMOwogfQogCkBAIC0xNDQ0LDEyICs5NjUsMTIgQEAKIHN0YXRpYyB2b2lkIHNhdGFfZHdjX2JtZG1hX3N0YXJ0X2J5X3RhZyhzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB1OCB0YWcpCiB7CiAJaW50IHN0YXJ0X2RtYTsKLQl1MzIgcmVnLCBkbWFfY2hhbjsKKwl1MzIgcmVnOwogCXN0cnVjdCBzYXRhX2R3Y19kZXZpY2UgKmhzZGV2ID0gSFNERVZfRlJPTV9RQyhxYyk7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKIAlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlX3BvcnQgKmhzZGV2cCA9IEhTREVWUF9GUk9NX0FQKGFwKTsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2MgPSBoc2RldnAtPmRlc2NbdGFnXTsKIAlpbnQgZGlyID0gcWMtPmRtYV9kaXI7Ci0JZG1hX2NoYW4gPSBoc2RldnAtPmRtYV9jaGFuW3RhZ107CiAKIAlpZiAoaHNkZXZwLT5jbWRfaXNzdWVkW3RhZ10gIT0gU0FUQV9EV0NfQ01EX0lTU1VFRF9OT1QpIHsKIAkJc3RhcnRfZG1hID0gMTsKQEAgLTE0NTgsMTYgKzk3OSwxNyBAQAogCQllbHNlCiAJCQloc2RldnAtPmRtYV9wZW5kaW5nW3RhZ10gPSBTQVRBX0RXQ19ETUFfUEVORElOR19SWDsKIAl9IGVsc2UgewotCQlkZXZfZXJyKGFwLT5kZXYsICIlczogQ29tbWFuZCBub3QgcGVuZGluZyBjbWRfaXNzdWVkPSVkICIKLQkJCSIodGFnPSVkKSBETUEgTk9UIHN0YXJ0ZWRcbiIsIF9fZnVuY19fLAotCQkJaHNkZXZwLT5jbWRfaXNzdWVkW3RhZ10sIHRhZyk7CisJCWRldl9lcnIoYXAtPmRldiwKKwkJCSIlczogQ29tbWFuZCBub3QgcGVuZGluZyBjbWRfaXNzdWVkPSVkICh0YWc9JWQpIERNQSBOT1Qgc3RhcnRlZFxuIiwKKwkJCV9fZnVuY19fLCBoc2RldnAtPmNtZF9pc3N1ZWRbdGFnXSwgdGFnKTsKIAkJc3RhcnRfZG1hID0gMDsKIAl9CiAKLQlkZXZfZGJnKGFwLT5kZXYsICIlcyBxYz0lcCB0YWc6ICV4IGNtZDogMHglMDJ4IGRtYV9kaXI6ICVzICIKLQkJInN0YXJ0X2RtYT8gJXhcbiIsIF9fZnVuY19fLCBxYywgdGFnLCBxYy0+dGYuY29tbWFuZCwKKwlkZXZfZGJnKGFwLT5kZXYsCisJCSIlcyBxYz0lcCB0YWc6ICV4IGNtZDogMHglMDJ4IGRtYV9kaXI6ICVzIHN0YXJ0X2RtYT8gJXhcbiIsCisJCV9fZnVuY19fLCBxYywgdGFnLCBxYy0+dGYuY29tbWFuZCwKIAkJZ2V0X2RtYV9kaXJfZGVzY3JpcHQocWMtPmRtYV9kaXIpLCBzdGFydF9kbWEpOwotCXNhdGFfZHdjX3RmX2R1bXAoJihxYy0+dGYpKTsKKwlzYXRhX2R3Y190Zl9kdW1wKGFwLCAmcWMtPnRmKTsKIAogCWlmIChzdGFydF9kbWEpIHsKIAkJcmVnID0gY29yZV9zY3JfcmVhZChTQ1JfRVJST1IpOwpAQCAtMTQ4NCw3ICsxMDA2LDggQEAKIAkJCQlTQVRBX0RXQ19ETUFDUl9SWENIRU4pOwogCiAJCS8qIEVuYWJsZSBBSEIgRE1BIHRyYW5zZmVyIG9uIHRoZSBzcGVjaWZpZWQgY2hhbm5lbCAqLwotCQlkbWFfZHdjX3hmZXJfc3RhcnQoZG1hX2NoYW4pOworCQlkbWFlbmdpbmVfc3VibWl0KGRlc2MpOworCQlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhoc2RldnAtPmNoYW4pOwogCX0KIH0KIApAQCAtMTUxMCwyNiArMTAzMywyMSBAQAogICovCiBzdGF0aWMgdm9pZCBzYXRhX2R3Y19xY19wcmVwX2J5X3RhZyhzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjLCB1OCB0YWcpCiB7Ci0Jc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHFjLT5zZzsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CiAJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsKLQlpbnQgZG1hX2NoYW47Ci0Jc3RydWN0IHNhdGFfZHdjX2RldmljZSAqaHNkZXYgPSBIU0RFVl9GUk9NX0FQKGFwKTsKIAlzdHJ1Y3Qgc2F0YV9kd2NfZGV2aWNlX3BvcnQgKmhzZGV2cCA9IEhTREVWUF9GUk9NX0FQKGFwKTsKIAogCWRldl9kYmcoYXAtPmRldiwgIiVzOiBwb3J0PSVkIGRtYSBkaXI9JXMgbl9lbGVtPSVkXG4iLAogCQlfX2Z1bmNfXywgYXAtPnBvcnRfbm8sIGdldF9kbWFfZGlyX2Rlc2NyaXB0KHFjLT5kbWFfZGlyKSwKIAkJIHFjLT5uX2VsZW0pOwogCi0JZG1hX2NoYW4gPSBkbWFfZHdjX3hmZXJfc2V0dXAoc2csIHFjLT5uX2VsZW0sIGhzZGV2cC0+bGxpdFt0YWddLAotCQkJCSAgICAgIGhzZGV2cC0+bGxpdF9kbWFbdGFnXSwKLQkJCQkgICAgICAodm9pZCBfX2lvbWVtICopJmhzZGV2LT5zYXRhX2R3Y19yZWdzLT5kbWFkciwKLQkJCQkgICAgICBxYy0+ZG1hX2Rpcik7Ci0JaWYgKGRtYV9jaGFuIDwgMCkgewotCQlkZXZfZXJyKGFwLT5kZXYsICIlczogZG1hX2R3Y194ZmVyX3NldHVwIHJldHVybnMgZXJyICVkXG4iLAotCQkJX19mdW5jX18sIGRtYV9jaGFuKTsKKwlkZXNjID0gZG1hX2R3Y194ZmVyX3NldHVwKHFjKTsKKwlpZiAoIWRlc2MpIHsKKwkJZGV2X2VycihhcC0+ZGV2LCAiJXM6IGRtYV9kd2NfeGZlcl9zZXR1cCByZXR1cm5zIE5VTExcbiIsCisJCQlfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9Ci0JaHNkZXZwLT5kbWFfY2hhblt0YWddID0gZG1hX2NoYW47CisJaHNkZXZwLT5kZXNjW3RhZ10gPSBkZXNjOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHNhdGFfZHdjX3FjX2lzc3VlKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCkBAIC0xNTQwLDggKzEwNTgsOCBAQAogCiAjaWZkZWYgREVCVUdfTkNRCiAJaWYgKHFjLT50YWcgPiAwIHx8IGFwLT5saW5rLnNhY3RpdmUgPiAxKQotCQlkZXZfaW5mbyhhcC0+ZGV2LCAiJXMgYXAgaWQ9JWQgY21kKDB4JTAyeCk9JXMgcWMgdGFnPSVkICIKLQkJCSAicHJvdD0lcyBhcCBhY3RpdmVfdGFnPTB4JTA4eCBhcCBzYWN0aXZlPTB4JTA4eFxuIiwKKwkJZGV2X2luZm8oYXAtPmRldiwKKwkJCSAiJXMgYXAgaWQ9JWQgY21kKDB4JTAyeCk9JXMgcWMgdGFnPSVkIHByb3Q9JXMgYXAgYWN0aXZlX3RhZz0weCUwOHggYXAgc2FjdGl2ZT0weCUwOHhcbiIsCiAJCQkgX19mdW5jX18sIGFwLT5wcmludF9pZCwgcWMtPnRmLmNvbW1hbmQsCiAJCQkgYXRhX2dldF9jbWRfZGVzY3JpcHQocWMtPnRmLmNvbW1hbmQpLAogCQkJIHFjLT50YWcsIGdldF9wcm90X2Rlc2NyaXB0KHFjLT50Zi5wcm90b2NvbCksCkBAIC0xNTU3LDkgKzEwNzUsOSBAQAogCQlzYWN0aXZlIHw9ICgweDAwMDAwMDAxIDw8IHRhZyk7CiAJCWNvcmVfc2NyX3dyaXRlKFNDUl9BQ1RJVkUsIHNhY3RpdmUpOwogCi0JCWRldl9kYmcocWMtPmFwLT5kZXYsICIlczogdGFnPSVkIGFwLT5saW5rLnNhY3RpdmUgPSAweCUwOHggIgotCQkJInNhY3RpdmU9MHglMDh4XG4iLCBfX2Z1bmNfXywgdGFnLCBxYy0+YXAtPmxpbmsuc2FjdGl2ZSwKLQkJCXNhY3RpdmUpOworCQlkZXZfZGJnKHFjLT5hcC0+ZGV2LAorCQkJIiVzOiB0YWc9JWQgYXAtPmxpbmsuc2FjdGl2ZSA9IDB4JTA4eCBzYWN0aXZlPTB4JTA4eFxuIiwKKwkJCV9fZnVuY19fLCB0YWcsIHFjLT5hcC0+bGluay5zYWN0aXZlLCBzYWN0aXZlKTsKIAogCQlhcC0+b3BzLT5zZmZfdGZfbG9hZChhcCwgJnFjLT50Zik7CiAJCXNhdGFfZHdjX2V4ZWNfY29tbWFuZF9ieV90YWcoYXAsICZxYy0+dGYsIHFjLT50YWcsCkBAIC0xNjczLDcgKzExOTEsNiBAQAogCXN0cnVjdCBhdGFfcG9ydF9pbmZvIHBpID0gc2F0YV9kd2NfcG9ydF9pbmZvWzBdOwogCWNvbnN0IHN0cnVjdCBhdGFfcG9ydF9pbmZvICpwcGlbXSA9IHsgJnBpLCBOVUxMIH07CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IG9mZGV2LT5kZXYub2Zfbm9kZTsKLQl1MzIgZG1hX2NoYW47CiAKIAkvKiBBbGxvY2F0ZSBEV0MgU0FUQSBkZXZpY2UgKi8KIAlob3N0ID0gYXRhX2hvc3RfYWxsb2NfcGluZm8oJm9mZGV2LT5kZXYsIHBwaSwgU0FUQV9EV0NfTUFYX1BPUlRTKTsKQEAgLTE2ODMsMTggKzEyMDAsMTEgQEAKIAogCWhvc3QtPnByaXZhdGVfZGF0YSA9IGhzZGV2OwogCi0JaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZG1hLWNoYW5uZWwiLCAmZG1hX2NoYW4pKSB7Ci0JCWRldl93YXJuKCZvZmRldi0+ZGV2LCAibm8gZG1hLWNoYW5uZWwgcHJvcGVydHkgc2V0LiIKLQkJCSAiIFVzZSBjaGFubmVsIDBcbiIpOwotCQlkbWFfY2hhbiA9IDA7Ci0JfQotCWhvc3RfcHZ0LmRtYV9jaGFubmVsID0gZG1hX2NoYW47Ci0KIAkvKiBJb3JlbWFwIFNBVEEgcmVnaXN0ZXJzICovCiAJYmFzZSA9IG9mX2lvbWFwKG5wLCAwKTsKIAlpZiAoIWJhc2UpIHsKLQkJZGV2X2Vycigmb2ZkZXYtPmRldiwgImlvcmVtYXAgZmFpbGVkIGZvciBTQVRBIHJlZ2lzdGVyIgotCQkJIiBhZGRyZXNzXG4iKTsKKwkJZGV2X2Vycigmb2ZkZXYtPmRldiwKKwkJCSJpb3JlbWFwIGZhaWxlZCBmb3IgU0FUQSByZWdpc3RlciBhZGRyZXNzXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWhzZGV2LT5yZWdfYmFzZSA9IGJhc2U7CkBAIC0xNzE2LDI3ICsxMjI2LDI5IEBACiAJCSAgIGlkciwgdmVyWzBdLCB2ZXJbMV0sIHZlclsyXSk7CiAKIAkvKiBHZXQgU0FUQSBETUEgaW50ZXJydXB0IG51bWJlciAqLwotCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAxKTsKLQlpZiAoaXJxID09IE5PX0lSUSkgeworCWhzZGV2LT5kbWEtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAxKTsKKwlpZiAoaHNkZXYtPmRtYS0+aXJxID09IE5PX0lSUSkgewogCQlkZXZfZXJyKCZvZmRldi0+ZGV2LCAibm8gU0FUQSBETUEgaXJxXG4iKTsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJvcl9pb21hcDsKIAl9CiAKIAkvKiBHZXQgcGh5c2ljYWwgU0FUQSBETUEgcmVnaXN0ZXIgYmFzZSBhZGRyZXNzICovCi0JaG9zdF9wdnQuc2F0YV9kbWFfcmVncyA9ICh2b2lkICopb2ZfaW9tYXAobnAsIDEpOwotCWlmICghKGhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MpKSB7Ci0JCWRldl9lcnIoJm9mZGV2LT5kZXYsICJpb3JlbWFwIGZhaWxlZCBmb3IgQUhCRE1BIHJlZ2lzdGVyIgotCQkJIiBhZGRyZXNzXG4iKTsKKwloc2Rldi0+ZG1hLT5yZWdzID0gb2ZfaW9tYXAobnAsIDEpOworCWlmICghaHNkZXYtPmRtYS0+cmVncykgeworCQlkZXZfZXJyKCZvZmRldi0+ZGV2LAorCQkJImlvcmVtYXAgZmFpbGVkIGZvciBBSEJETUEgcmVnaXN0ZXIgYWRkcmVzc1xuIik7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyb3JfaW9tYXA7CiAJfQogCiAJLyogU2F2ZSBkZXYgZm9yIGxhdGVyIHVzZSBpbiBkZXZfeHh4KCkgcm91dGluZXMgKi8KLQlob3N0X3B2dC5kd2NfZGV2ID0gJm9mZGV2LT5kZXY7CisJaHNkZXYtPmRldiA9ICZvZmRldi0+ZGV2OworCisJaHNkZXYtPmRtYS0+ZGV2ID0gJm9mZGV2LT5kZXY7CiAKIAkvKiBJbml0aWFsaXplIEFIQiBETUFDICovCi0JZXJyID0gZG1hX2R3Y19pbml0KGhzZGV2LCBpcnEpOworCWVyciA9IGR3X2RtYV9wcm9iZShoc2Rldi0+ZG1hLCBOVUxMKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycm9yX2RtYV9pb21hcDsKIApAQCAtMTc2NSw5ICsxMjc3LDkgQEAKIAogZXJyb3Jfb3V0OgogCS8qIEZyZWUgU0FUQSBETUEgcmVzb3VyY2VzICovCi0JZG1hX2R3Y19leGl0KGhzZGV2KTsKKwlkd19kbWFfcmVtb3ZlKGhzZGV2LT5kbWEpOwogZXJyb3JfZG1hX2lvbWFwOgotCWlvdW5tYXAoKHZvaWQgX19pb21lbSAqKWhvc3RfcHZ0LnNhdGFfZG1hX3JlZ3MpOworCWlvdW5tYXAoaHNkZXYtPmRtYS0+cmVncyk7CiBlcnJvcl9pb21hcDoKIAlpb3VubWFwKGJhc2UpOwogCXJldHVybiBlcnI7CkBAIC0xNzgyLDkgKzEyOTQsOSBAQAogCWF0YV9ob3N0X2RldGFjaChob3N0KTsKIAogCS8qIEZyZWUgU0FUQSBETUEgcmVzb3VyY2VzICovCi0JZG1hX2R3Y19leGl0KGhzZGV2KTsKKwlkd19kbWFfcmVtb3ZlKGhzZGV2LT5kbWEpOwogCi0JaW91bm1hcCgodm9pZCBfX2lvbWVtICopaG9zdF9wdnQuc2F0YV9kbWFfcmVncyk7CisJaW91bm1hcChoc2Rldi0+ZG1hLT5yZWdzKTsKIAlpb3VubWFwKGhzZGV2LT5yZWdfYmFzZSk7CiAJZGV2X2RiZygmb2ZkZXYtPmRldiwgImRvbmVcbiIpOwogCXJldHVybiAwOwpAQCAtMTgwOSw1ICsxMzIxLDUgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FVVEhPUigiTWFyayBNaWVzZmVsZCA8bW1pZXNmZWxkQGFtY2MuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJEZXNpZ25XYXJlIENvcmVzIFNBVEEgY29udHJvbGxlciBsb3cgbGV2ZXIgZHJpdmVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkRlc2lnbldhcmUgQ29yZXMgU0FUQSBjb250cm9sbGVyIGxvdyBsZXZlbCBkcml2ZXIiKTsKIE1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfaW5pYzE2MnguYyBiL2RyaXZlcnMvYXRhL3NhdGFfaW5pYzE2MnguYwppbmRleCAwNjk4Mjc4Li5lODFhODIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX2luaWMxNjJ4LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9pbmljMTYyeC5jCkBAIC04NTYsMTMgKzg1NiwxMyBAQAogCX0KIAogCS8qIFNldCBkbWFfbWFzay4gIFRoaXMgZGV2aWNlcyBkb2Vzbid0IHN1cHBvcnQgNjRiaXQgYWRkcmVzc2luZy4gKi8KLQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJcmMgPSBkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJaWYgKHJjKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIjMyLWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCXJldHVybiByYzsKIAl9CiAKLQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlyYyA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAocmMpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX212LmMgYi9kcml2ZXJzL2F0YS9zYXRhX212LmMKaW5kZXggZjhjMzNlMy4uYmQ3NGVlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9tdi5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfbXYuYwpAQCAtMzA2LDYgKzMwNiwxMSBAQAogCU1WNV9QSFlfQ1RMCQk9IDB4MEMsCiAJU0FUQV9JRkNGRwkJPSAweDA1MCwKIAlMUF9QSFlfQ1RMCQk9IDB4MDU4LAorCUxQX1BIWV9DVExfUElOX1BVX1BMTCAgID0gKDEgPDwgMCksCisJTFBfUEhZX0NUTF9QSU5fUFVfUlggICAgPSAoMSA8PCAxKSwKKwlMUF9QSFlfQ1RMX1BJTl9QVV9UWCAgICA9ICgxIDw8IDIpLAorCUxQX1BIWV9DVExfR0VOX1RYXzNHICAgID0gKDEgPDwgNSksCisJTFBfUEhZX0NUTF9HRU5fUlhfM0cgICAgPSAoMSA8PCA5KSwKIAogCU1WX00yX1BSRUFNUF9NQVNLCT0gMHg3ZTAsCiAKQEAgLTEzOTEsMTAgKzEzOTYsMTcgQEAKIAkJCQkvKgogCQkJCSAqIFNldCBQSFkgc3BlZWQgYWNjb3JkaW5nIHRvIFNDb250cm9sIHNwZWVkLgogCQkJCSAqLwotCQkJCWlmICgodmFsICYgMHhmMCkgPT0gMHgxMCkKLQkJCQkJd3JpdGVsZmwoMHg3LCBscF9waHlfYWRkcik7Ci0JCQkJZWxzZQotCQkJCQl3cml0ZWxmbCgweDIyNywgbHBfcGh5X2FkZHIpOworCQkJCXUzMiBscF9waHlfdmFsID0KKwkJCQkJTFBfUEhZX0NUTF9QSU5fUFVfUExMIHwKKwkJCQkJTFBfUEhZX0NUTF9QSU5fUFVfUlggIHwKKwkJCQkJTFBfUEhZX0NUTF9QSU5fUFVfVFg7CisKKwkJCQlpZiAoKHZhbCAmIDB4ZjApICE9IDB4MTApCisJCQkJCWxwX3BoeV92YWwgfD0KKwkJCQkJCUxQX1BIWV9DVExfR0VOX1RYXzNHIHwKKwkJCQkJCUxQX1BIWV9DVExfR0VOX1JYXzNHOworCisJCQkJd3JpdGVsZmwobHBfcGh5X3ZhbCwgbHBfcGh5X2FkZHIpOwogCQkJfQogCQl9CiAJCXdyaXRlbGZsKHZhbCwgYWRkcik7CkBAIC00MzA4LDEwICs0MzIwLDEwIEBACiB7CiAJaW50IHJjOwogCi0JaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7Ci0JCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCWlmICghZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7CisJCXJjID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpOwogCQlpZiAocmMpIHsKLQkJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQkJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCQlpZiAocmMpIHsKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJCSI2NC1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwpAQCAtNDMxOSwxMiArNDMzMSwxMiBAQAogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlyYyA9IGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAkJaWYgKHJjKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIzMi1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIHJjOwogCQl9Ci0JCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQlyYyA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAkJaWYgKHJjKSB7CiAJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJIjMyLWJpdCBjb25zaXN0ZW50IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYyBiL2RyaXZlcnMvYXRhL3NhdGFfbnYuYwppbmRleCAxZGI2ZjVjLi43ZWNlODVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX252LmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCkBAIC03NTYsMTAgKzc1NiwxMCBAQAogCQkJYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChzZGV2MS0+cmVxdWVzdF9xdWV1ZSwKIAkJCQkJICAgICAgIEFUQV9ETUFfTUFTSyk7CiAKLQkJcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCQlkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgQVRBX0RNQV9NQVNLKTsKIAl9IGVsc2UgewogCQkvKiogVGhpcyBzaG91bGRuJ3QgZmFpbCBhcyBpdCB3YXMgc2V0IHRvIHRoaXMgdmFsdWUgYmVmb3JlICovCi0JCXBjaV9zZXRfZG1hX21hc2socGRldiwgcHAtPmFkbWFfZG1hX21hc2spOworCQlkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgcHAtPmFkbWFfZG1hX21hc2spOwogCQlpZiAoc2RldjApCiAJCQlibGtfcXVldWVfYm91bmNlX2xpbWl0KHNkZXYwLT5yZXF1ZXN0X3F1ZXVlLAogCQkJCQkgICAgICAgcHAtPmFkbWFfZG1hX21hc2spOwpAQCAtMTEzMywxMCArMTEzMywxMCBAQAogCiAJLyogRW5zdXJlIERNQSBtYXNrIGlzIHNldCB0byAzMi1iaXQgYmVmb3JlIGFsbG9jYXRpbmcgbGVnYWN5IFBSRCBhbmQKIAkgICBwYWQgYnVmZmVycyAqLwotCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlyYyA9IGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlyYyA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtMTE2MSw4ICsxMTYxLDggQEAKIAkgICBUaGVzZSBhcmUgYWxsb3dlZCB0byBmYWlsIHNpbmNlIHdlIHN0b3JlIHRoZSB2YWx1ZSB0aGF0IGVuZHMgdXAKIAkgICBiZWluZyB1c2VkIHRvIHNldCBhcyB0aGUgYm91bmNlIGxpbWl0IGluIHNsYXZlX2NvbmZpZyBsYXRlciBpZgogCSAgIG5lZWRlZC4gKi8KLQlwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOwotCXBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soNjQpKTsKKwlkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CisJZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpOwogCXBwLT5hZG1hX2RtYV9tYXNrID0gKmRldi0+ZG1hX21hc2s7CiAKIAltZW0gPSBkbWFtX2FsbG9jX2NvaGVyZW50KGRldiwgTlZfQURNQV9QT1JUX1BSSVZfRE1BX1NaLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3Byb21pc2UuYwppbmRleCAzNjM4ODg3Li4wZmEyMTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3Byb21pc2UuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3Byb21pc2UuYwpAQCAtMTI0NiwxMCArMTI0NiwxMCBAQAogCS8qIGluaXRpYWxpemUgYWRhcHRlciAqLwogCXBkY19ob3N0X2luaXQoaG9zdCk7CiAKLQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlyYyA9IGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBBVEFfRE1BX01BU0spOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwotCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgQVRBX0RNQV9NQVNLKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9xc3Rvci5jIGIvZHJpdmVycy9hdGEvc2F0YV9xc3Rvci5jCmluZGV4IDlhNmJkNGMuLmFmOTg3YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfcXN0b3IuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3FzdG9yLmMKQEAgLTU1NywxMCArNTU3LDEwIEBACiAJaW50IHJjLCBoYXZlXzY0Yml0X2J1cyA9IChidXNfaW5mbyAmIFFTX0hQSFlfNjRCSVQpOwogCiAJaWYgKGhhdmVfNjRiaXRfYnVzICYmCi0JICAgICFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7Ci0JCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpOworCSAgICAhZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7CisJCXJjID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg2NCkpOwogCQlpZiAocmMpIHsKLQkJCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCQkJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCQlpZiAocmMpIHsKIAkJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkJCSI2NC1iaXQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwpAQCAtNTY4LDEyICs1NjgsMTIgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJcmMgPSBkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiMzItYml0IERNQSBlbmFibGUgZmFpbGVkXG4iKTsKIAkJCXJldHVybiByYzsKIAkJfQotCQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChyYykgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSIzMi1iaXQgY29uc2lzdGVudCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwuYwppbmRleCA0MGI3NmIyLi5kZWE2ZWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3NpbC5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfc2lsLmMKQEAgLTc3MCwxMCArNzcwLDEwIEBACiAJCXJldHVybiByYzsKIAlob3N0LT5pb21hcCA9IHBjaW1faW9tYXBfdGFibGUocGRldik7CiAKLQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlyYyA9IGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBBVEFfRE1BX01BU0spOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwotCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgQVRBX0RNQV9NQVNLKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jIGIvZHJpdmVycy9hdGEvc2F0YV9zaWwyNC5jCmluZGV4IGJhMjY2N2YuLjRiMTk5NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfc2lsMjQuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3NpbDI0LmMKQEAgLTI0Niw3ICsyNDYsNyBAQAogCS8qIGhvc3QgZmxhZ3MgKi8KIAlTSUwyNF9DT01NT05fRkxBR1MJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfUElPX0RNQSB8CiAJCQkJICBBVEFfRkxBR19OQ1EgfCBBVEFfRkxBR19BQ1BJX1NBVEEgfAotCQkJCSAgQVRBX0ZMQUdfQU4gfCBBVEFfRkxBR19QTVAgfCBBVEFfRkxBR19MT1dUQUcsCisJCQkJICBBVEFfRkxBR19BTiB8IEFUQV9GTEFHX1BNUCwKIAlTSUwyNF9GTEFHX1BDSVhfSVJRX1dPQwk9ICgxIDw8IDI0KSwgLyogSVJRIGxvc3MgZXJyYXRhIG9uIFBDSS1YICovCiAKIAlJUlFfU1RBVF80UE9SVFMJCT0gMHhmLApAQCAtMTMxMiwxMCArMTMxMiwxMCBAQAogCWhvc3QtPmlvbWFwID0gaW9tYXA7CiAKIAkvKiBjb25maWd1cmUgYW5kIGFjdGl2YXRlIHRoZSBkZXZpY2UgKi8KLQlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKLQkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CisJaWYgKCFkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSkpIHsKKwkJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CiAJCWlmIChyYykgewotCQkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCQlyYyA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAkJCWlmIChyYykgewogCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCQkJIjY0LWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CkBAIC0xMzIzLDEyICsxMzIzLDEyIEBACiAJCQl9CiAJCX0KIAl9IGVsc2UgewotCQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCXJjID0gZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAocmMpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgIjMyLWJpdCBETUEgZW5hYmxlIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gcmM7CiAJCX0KLQkJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCXJjID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAocmMpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCQkiMzItYml0IGNvbnNpc3RlbnQgRE1BIGVuYWJsZSBmYWlsZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zdncuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc3Z3LmMKaW5kZXggNGMwNmY2Mi4uZmY2MTRiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zdncuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3N2dy5jCkBAIC00ODcsMTAgKzQ4NywxMCBAQAogCQlhdGFfcG9ydF9wYmFyX2Rlc2MoYXAsIDUsIG9mZnNldCwgInBvcnQiKTsKIAl9CiAKLQlyYyA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlyYyA9IGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBBVEFfRE1BX01BU0spOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwotCXJjID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJcmMgPSBkbWFfc2V0X2NvaGVyZW50X21hc2soJnBkZXYtPmRldiwgQVRBX0RNQV9NQVNLKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9zeDQuYyBiL2RyaXZlcnMvYXRhL3NhdGFfc3g0LmMKaW5kZXggMzliNWRlNi4uM2ExOGE4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvc2F0YV9zeDQuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3N4NC5jCkBAIC0xNDc2LDEwICsxNDc2LDEwIEBACiAJfQogCiAJLyogY29uZmlndXJlIGFuZCBhY3RpdmF0ZSAqLwotCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCXJjID0gZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIEFUQV9ETUFfTUFTSyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgQVRBX0RNQV9NQVNLKTsKKwlyYyA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBBVEFfRE1BX01BU0spOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jIGIvZHJpdmVycy9hdGEvc2F0YV92aWEuYwppbmRleCA0N2JmODk0Li4xN2QzMWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3ZpYS5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfdmlhLmMKQEAgLTUwMiwxMCArNTAyLDEwIEBACiAJZm9yIChpID0gMDsgaSA8IGhvc3QtPm5fcG9ydHM7IGkrKykKIAkJdnQ2NDIxX2luaXRfYWRkcnMoaG9zdC0+cG9ydHNbaV0pOwogCi0JcmMgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIEFUQV9ETUFfTUFTSyk7CisJcmMgPSBkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgQVRBX0RNQV9NQVNLKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBBVEFfRE1BX01BU0spOworCXJjID0gZG1hX3NldF9jb2hlcmVudF9tYXNrKCZwZGV2LT5kZXYsIEFUQV9ETUFfTUFTSyk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3NhdGFfdnNjLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jCmluZGV4IDI5ZTg0N2EuLjE4M2ViNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfdnNjLmMKKysrIGIvZHJpdmVycy9hdGEvc2F0YV92c2MuYwpAQCAtMzg3LDEwICszODcsMTAgQEAKIAkvKgogCSAqIFVzZSAzMiBiaXQgRE1BIG1hc2ssIGJlY2F1c2UgNjQgYml0IGFkZHJlc3Mgc3VwcG9ydCBpcyBwb29yLgogCSAqLwotCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlyYyA9IGRtYV9zZXRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKLQlyYyA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlyYyA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdG0vbmljc3Rhci5jIGIvZHJpdmVycy9hdG0vbmljc3Rhci5jCmluZGV4IGI3ZTFjYzAuLmRkYzRjZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL25pY3N0YXIuYworKysgYi9kcml2ZXJzL2F0bS9uaWNzdGFyLmMKQEAgLTczLDkgKzczLDYgQEAKICN1bmRlZiBHRU5FUkFMX0RFQlVHCiAjdW5kZWYgRVhUUkFfREVCVUcKIAotI3VuZGVmIE5TX1VTRV9ERVNUUlVDVE9SUwkvKiBGb3Igbm93IGtlZXAgdGhpcyB1bmRlZmluZWQgdW5sZXNzIHlvdSBrbm93Ci0JCQkJICAgeW91J3JlIGdvaW5nIHRvIHVzZSBvbmx5IHJhdyBBVE0gKi8KLQogLyogRG8gbm90IHRvdWNoIHRoZXNlICovCiAKICNpZmRlZiBUWF9ERUJVRwpAQCAtMTM4LDExICsxMzUsNiBAQAogc3RhdGljIHZvaWQgZHJhaW5fc2NxKG5zX2RldiAqIGNhcmQsIHNjcV9pbmZvICogc2NxLCBpbnQgcG9zKTsKIHN0YXRpYyB2b2lkIHByb2Nlc3NfcnNxKG5zX2RldiAqIGNhcmQpOwogc3RhdGljIHZvaWQgZGVxdWV1ZV9yeChuc19kZXYgKiBjYXJkLCBuc19yc3FlICogcnNxZSk7Ci0jaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCi1zdGF0aWMgdm9pZCBuc19zYl9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICpzYik7Ci1zdGF0aWMgdm9pZCBuc19sYl9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICpsYik7Ci1zdGF0aWMgdm9pZCBuc19oYl9kZXN0cnVjdG9yKHN0cnVjdCBza19idWZmICpoYik7Ci0jZW5kaWYgLyogTlNfVVNFX0RFU1RSVUNUT1JTICovCiBzdGF0aWMgdm9pZCByZWN5Y2xlX3J4X2J1Zihuc19kZXYgKiBjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0YXRpYyB2b2lkIHJlY3ljbGVfaW92ZWNfcnhfYnVmcyhuc19kZXYgKiBjYXJkLCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGNvdW50KTsKIHN0YXRpYyB2b2lkIHJlY3ljbGVfaW92X2J1Zihuc19kZXYgKiBjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqaW92Yik7CkBAIC0yMTY5LDkgKzIxNjEsNiBAQAogCQkJfSBlbHNlIHsKIAkJCQlza2JfcHV0KHNrYiwgbGVuKTsKIAkJCQlkZXF1ZXVlX3NtX2J1ZihjYXJkLCBza2IpOwotI2lmZGVmIE5TX1VTRV9ERVNUUlVDVE9SUwotCQkJCXNrYi0+ZGVzdHJ1Y3RvciA9IG5zX3NiX2Rlc3RydWN0b3I7Ci0jZW5kaWYgLyogTlNfVVNFX0RFU1RSVUNUT1JTICovCiAJCQkJQVRNX1NLQihza2IpLT52Y2MgPSB2Y2M7CiAJCQkJX19uZXRfdGltZXN0YW1wKHNrYik7CiAJCQkJdmNjLT5wdXNoKHZjYywgc2tiKTsKQEAgLTIxOTAsOSArMjE3OSw2IEBACiAJCQkJfSBlbHNlIHsKIAkJCQkJc2tiX3B1dChzYiwgbGVuKTsKIAkJCQkJZGVxdWV1ZV9zbV9idWYoY2FyZCwgc2IpOwotI2lmZGVmIE5TX1VTRV9ERVNUUlVDVE9SUwotCQkJCQlzYi0+ZGVzdHJ1Y3RvciA9IG5zX3NiX2Rlc3RydWN0b3I7Ci0jZW5kaWYgLyogTlNfVVNFX0RFU1RSVUNUT1JTICovCiAJCQkJCUFUTV9TS0Ioc2IpLT52Y2MgPSB2Y2M7CiAJCQkJCV9fbmV0X3RpbWVzdGFtcChzYik7CiAJCQkJCXZjYy0+cHVzaCh2Y2MsIHNiKTsKQEAgLTIyMDgsOSArMjE5NCw2IEBACiAJCQkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4X2Ryb3ApOwogCQkJCX0gZWxzZSB7CiAJCQkJCWRlcXVldWVfbGdfYnVmKGNhcmQsIHNrYik7Ci0jaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCi0JCQkJCXNrYi0+ZGVzdHJ1Y3RvciA9IG5zX2xiX2Rlc3RydWN0b3I7Ci0jZW5kaWYgLyogTlNfVVNFX0RFU1RSVUNUT1JTICovCiAJCQkJCXNrYl9wdXNoKHNrYiwgTlNfU01CVUZTSVpFKTsKIAkJCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShzYiwgc2tiLT5kYXRhLAogCQkJCQkJCQkgIE5TX1NNQlVGU0laRSk7CkBAIC0yMzIyLDkgKzIzMDUsNiBAQAogCQkJCQkgICAgIGNhcmQtPmluZGV4KTsKICNlbmRpZiAvKiBFWFRSQV9ERUJVRyAqLwogCQkJCUFUTV9TS0IoaGIpLT52Y2MgPSB2Y2M7Ci0jaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCi0JCQkJaGItPmRlc3RydWN0b3IgPSBuc19oYl9kZXN0cnVjdG9yOwotI2VuZGlmIC8qIE5TX1VTRV9ERVNUUlVDVE9SUyAqLwogCQkJCV9fbmV0X3RpbWVzdGFtcChoYik7CiAJCQkJdmNjLT5wdXNoKHZjYywgaGIpOwogCQkJCWF0b21pY19pbmMoJnZjYy0+c3RhdHMtPnJ4KTsKQEAgLTIzMzcsNjggKzIzMTcsNiBAQAogCiB9CiAKLSNpZmRlZiBOU19VU0VfREVTVFJVQ1RPUlMKLQotc3RhdGljIHZvaWQgbnNfc2JfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc2tfYnVmZiAqc2IpCi17Ci0JbnNfZGV2ICpjYXJkOwotCXUzMiBzdGF0OwotCi0JY2FyZCA9IChuc19kZXYgKikgQVRNX1NLQihzYiktPnZjYy0+ZGV2LT5kZXZfZGF0YTsKLQlzdGF0ID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpOwotCWNhcmQtPnNiZnFjID0gbnNfc3RhdF9zZmJxY19nZXQoc3RhdCk7Ci0JY2FyZC0+bGJmcWMgPSBuc19zdGF0X2xmYnFjX2dldChzdGF0KTsKLQotCWRvIHsKLQkJc2IgPSBfX2Rldl9hbGxvY19za2IoTlNfU01TS0JTSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHNiID09IE5VTEwpCi0JCQlicmVhazsKLQkJTlNfUFJWX0JVRlRZUEUoc2IpID0gQlVGX1NNOwotCQlza2JfcXVldWVfdGFpbCgmY2FyZC0+c2Jwb29sLnF1ZXVlLCBzYik7Ci0JCXNrYl9yZXNlcnZlKHNiLCBOU19BQUwwX0hFQURFUik7Ci0JCXB1c2hfcnhidWZzKGNhcmQsIHNiKTsKLQl9IHdoaWxlIChjYXJkLT5zYmZxYyA8IGNhcmQtPnNibnIubWluKTsKLX0KLQotc3RhdGljIHZvaWQgbnNfbGJfZGVzdHJ1Y3RvcihzdHJ1Y3Qgc2tfYnVmZiAqbGIpCi17Ci0JbnNfZGV2ICpjYXJkOwotCXUzMiBzdGF0OwotCi0JY2FyZCA9IChuc19kZXYgKikgQVRNX1NLQihsYiktPnZjYy0+ZGV2LT5kZXZfZGF0YTsKLQlzdGF0ID0gcmVhZGwoY2FyZC0+bWVtYmFzZSArIFNUQVQpOwotCWNhcmQtPnNiZnFjID0gbnNfc3RhdF9zZmJxY19nZXQoc3RhdCk7Ci0JY2FyZC0+bGJmcWMgPSBuc19zdGF0X2xmYnFjX2dldChzdGF0KTsKLQotCWRvIHsKLQkJbGIgPSBfX2Rldl9hbGxvY19za2IoTlNfTEdTS0JTSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGxiID09IE5VTEwpCi0JCQlicmVhazsKLQkJTlNfUFJWX0JVRlRZUEUobGIpID0gQlVGX0xHOwotCQlza2JfcXVldWVfdGFpbCgmY2FyZC0+bGJwb29sLnF1ZXVlLCBsYik7Ci0JCXNrYl9yZXNlcnZlKGxiLCBOU19TTUJVRlNJWkUpOwotCQlwdXNoX3J4YnVmcyhjYXJkLCBsYik7Ci0JfSB3aGlsZSAoY2FyZC0+bGJmcWMgPCBjYXJkLT5sYm5yLm1pbik7Ci19Ci0KLXN0YXRpYyB2b2lkIG5zX2hiX2Rlc3RydWN0b3Ioc3RydWN0IHNrX2J1ZmYgKmhiKQotewotCW5zX2RldiAqY2FyZDsKLQotCWNhcmQgPSAobnNfZGV2ICopIEFUTV9TS0IoaGIpLT52Y2MtPmRldi0+ZGV2X2RhdGE7Ci0KLQl3aGlsZSAoY2FyZC0+aGJwb29sLmNvdW50IDwgY2FyZC0+aGJuci5pbml0KSB7Ci0JCWhiID0gX19kZXZfYWxsb2Nfc2tiKE5TX0hCVUZTSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGhiID09IE5VTEwpCi0JCQlicmVhazsKLQkJTlNfUFJWX0JVRlRZUEUoaGIpID0gQlVGX05PTkU7Ci0JCXNrYl9xdWV1ZV90YWlsKCZjYXJkLT5oYnBvb2wucXVldWUsIGhiKTsKLQkJY2FyZC0+aGJwb29sLmNvdW50Kys7Ci0JfQotfQotCi0jZW5kaWYgLyogTlNfVVNFX0RFU1RSVUNUT1JTICovCi0KIHN0YXRpYyB2b2lkIHJlY3ljbGVfcnhfYnVmKG5zX2RldiAqIGNhcmQsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKHVubGlrZWx5KE5TX1BSVl9CVUZUWVBFKHNrYikgPT0gQlVGX05PTkUpKSB7CkBAIC0yNDI3LDkgKzIzNDUsNiBAQAogc3RhdGljIHZvaWQgZGVxdWV1ZV9zbV9idWYobnNfZGV2ICogY2FyZCwgc3RydWN0IHNrX2J1ZmYgKnNiKQogewogCXNrYl91bmxpbmsoc2IsICZjYXJkLT5zYnBvb2wucXVldWUpOwotI2lmZGVmIE5TX1VTRV9ERVNUUlVDVE9SUwotCWlmIChjYXJkLT5zYmZxYyA8IGNhcmQtPnNibnIubWluKQotI2Vsc2UKIAlpZiAoY2FyZC0+c2JmcWMgPCBjYXJkLT5zYm5yLmluaXQpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKm5ld19zYjsKIAkJaWYgKChuZXdfc2IgPSBkZXZfYWxsb2Nfc2tiKE5TX1NNU0tCU0laRSkpICE9IE5VTEwpIHsKQEAgLTI0NDAsNyArMjM1NSw2IEBACiAJCX0KIAl9CiAJaWYgKGNhcmQtPnNiZnFjIDwgY2FyZC0+c2Juci5pbml0KQotI2VuZGlmIC8qIE5TX1VTRV9ERVNUUlVDVE9SUyAqLwogCXsKIAkJc3RydWN0IHNrX2J1ZmYgKm5ld19zYjsKIAkJaWYgKChuZXdfc2IgPSBkZXZfYWxsb2Nfc2tiKE5TX1NNU0tCU0laRSkpICE9IE5VTEwpIHsKQEAgLTI0NTUsOSArMjM2OSw2IEBACiBzdGF0aWMgdm9pZCBkZXF1ZXVlX2xnX2J1Zihuc19kZXYgKiBjYXJkLCBzdHJ1Y3Qgc2tfYnVmZiAqbGIpCiB7CiAJc2tiX3VubGluayhsYiwgJmNhcmQtPmxicG9vbC5xdWV1ZSk7Ci0jaWZkZWYgTlNfVVNFX0RFU1RSVUNUT1JTCi0JaWYgKGNhcmQtPmxiZnFjIDwgY2FyZC0+bGJuci5taW4pCi0jZWxzZQogCWlmIChjYXJkLT5sYmZxYyA8IGNhcmQtPmxibnIuaW5pdCkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X2xiOwogCQlpZiAoKG5ld19sYiA9IGRldl9hbGxvY19za2IoTlNfTEdTS0JTSVpFKSkgIT0gTlVMTCkgewpAQCAtMjQ2OCw3ICsyMzc5LDYgQEAKIAkJfQogCX0KIAlpZiAoY2FyZC0+bGJmcWMgPCBjYXJkLT5sYm5yLmluaXQpCi0jZW5kaWYgLyogTlNfVVNFX0RFU1RSVUNUT1JTICovCiAJewogCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X2xiOwogCQlpZiAoKG5ld19sYiA9IGRldl9hbGxvY19za2IoTlNfTEdTS0JTSVpFKSkgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYyBiL2RyaXZlcnMvYmFzZS9hdHRyaWJ1dGVfY29udGFpbmVyLmMKaW5kZXggM2VhZDNhZi4uMmJhNGNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2F0dHJpYnV0ZV9jb250YWluZXIuYworKysgYi9kcml2ZXJzL2Jhc2UvYXR0cmlidXRlX2NvbnRhaW5lci5jCkBAIC05NCw2ICs5NCw3IEBACiBhdHRyaWJ1dGVfY29udGFpbmVyX3VucmVnaXN0ZXIoc3RydWN0IGF0dHJpYnV0ZV9jb250YWluZXIgKmNvbnQpCiB7CiAJaW50IHJldHZhbCA9IC1FQlVTWTsKKwogCW11dGV4X2xvY2soJmF0dHJpYnV0ZV9jb250YWluZXJfbXV0ZXgpOwogCXNwaW5fbG9jaygmY29udC0+Y29udGFpbmVycy5rX2xvY2spOwogCWlmICghbGlzdF9lbXB0eSgmY29udC0+Y29udGFpbmVycy5rX2xpc3QpKQpAQCAtMzQ5LDYgKzM1MCw3IEBACiBhdHRyaWJ1dGVfY29udGFpbmVyX2FkZF9jbGFzc19kZXZpY2Uoc3RydWN0IGRldmljZSAqY2xhc3NkZXYpCiB7CiAJaW50IGVycm9yID0gZGV2aWNlX2FkZChjbGFzc2Rldik7CisKIAlpZiAoZXJyb3IpCiAJCXJldHVybiBlcnJvcjsKIAlyZXR1cm4gYXR0cmlidXRlX2NvbnRhaW5lcl9hZGRfYXR0cnMoY2xhc3NkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL2J1cy5jIGIvZHJpdmVycy9iYXNlL2J1cy5jCmluZGV4IDg3NmJhZTUuLjc5YmMyMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9idXMuYworKysgYi9kcml2ZXJzL2Jhc2UvYnVzLmMKQEAgLTUxNSwxMSArNTE1LDExIEBACiAJCQlnb3RvIG91dF9wdXQ7CiAJCWVycm9yID0gZGV2aWNlX2FkZF9ncm91cHMoZGV2LCBidXMtPmRldl9ncm91cHMpOwogCQlpZiAoZXJyb3IpCi0JCQlnb3RvIG91dF9ncm91cHM7CisJCQlnb3RvIG91dF9pZDsKIAkJZXJyb3IgPSBzeXNmc19jcmVhdGVfbGluaygmYnVzLT5wLT5kZXZpY2VzX2tzZXQtPmtvYmosCiAJCQkJCQkmZGV2LT5rb2JqLCBkZXZfbmFtZShkZXYpKTsKIAkJaWYgKGVycm9yKQotCQkJZ290byBvdXRfaWQ7CisJCQlnb3RvIG91dF9ncm91cHM7CiAJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwKIAkJCQkmZGV2LT5idXMtPnAtPnN1YnN5cy5rb2JqLCAic3Vic3lzdGVtIik7CiAJCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jYWNoZWluZm8uYyBiL2RyaXZlcnMvYmFzZS9jYWNoZWluZm8uYwppbmRleCA2ZTY0NTYzLi45YzJiYTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY2FjaGVpbmZvLmMKKysrIGIvZHJpdmVycy9iYXNlL2NhY2hlaW5mby5jCkBAIC02MiwxNSArNjIsMjEgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0Jd2hpbGUgKG5wICYmIGluZGV4IDwgY2FjaGVfbGVhdmVzKGNwdSkpIHsKKwl3aGlsZSAoaW5kZXggPCBjYWNoZV9sZWF2ZXMoY3B1KSkgewogCQl0aGlzX2xlYWYgPSB0aGlzX2NwdV9jaS0+aW5mb19saXN0ICsgaW5kZXg7CiAJCWlmICh0aGlzX2xlYWYtPmxldmVsICE9IDEpCiAJCQlucCA9IG9mX2ZpbmRfbmV4dF9jYWNoZV9ub2RlKG5wKTsKIAkJZWxzZQogCQkJbnAgPSBvZl9ub2RlX2dldChucCk7LyogY3B1IG5vZGUgaXRzZWxmICovCisJCWlmICghbnApCisJCQlicmVhazsKIAkJdGhpc19sZWFmLT5vZl9ub2RlID0gbnA7CiAJCWluZGV4Kys7CiAJfQorCisJaWYgKGluZGV4ICE9IGNhY2hlX2xlYXZlcyhjcHUpKSAvKiBub3QgYWxsIE9GIG5vZGVzIHBvcHVsYXRlZCAqLworCQlyZXR1cm4gLUVOT0VOVDsKKwogCXJldHVybiAwOwogfQogCkBAIC0xODksOCArMTk1LDExIEBACiAJICogd2lsbCBiZSBzZXQgdXAgaGVyZSBvbmx5IGlmIHRoZXkgYXJlIG5vdCBwb3B1bGF0ZWQgYWxyZWFkeQogCSAqLwogCXJldCA9IGNhY2hlX3NoYXJlZF9jcHVfbWFwX3NldHVwKGNwdSk7Ci0JaWYgKHJldCkKKwlpZiAocmV0KSB7CisJCXByX3dhcm4oIlVuYWJsZSB0byBkZXRlY3QgY2FjaGUgaGllcmFyY3kgZnJvbSBEVCBmb3IgQ1BVICVkXG4iLAorCQkJY3B1KTsKIAkJZ290byBmcmVlX2NpOworCX0KIAlyZXR1cm4gMDsKIAogZnJlZV9jaToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jbGFzcy5jIGIvZHJpdmVycy9iYXNlL2NsYXNzLmMKaW5kZXggZjk2ZjcwNC4uNmU4MTA4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NsYXNzLmMKKysrIGIvZHJpdmVycy9iYXNlL2NsYXNzLmMKQEAgLTkwLDYgKzkwLDcgQEAKIAkJCSBjb25zdCB2b2lkICpucykKIHsKIAlpbnQgZXJyb3I7CisKIAlpZiAoY2xzKQogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9maWxlX25zKCZjbHMtPnAtPnN1YnN5cy5rb2JqLAogCQkJCQkgICAgICZhdHRyLT5hdHRyLCBucyk7CkBAIC00ODgsNiArNDg5LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGNsYXNzX2F0dHJpYnV0ZV9zdHJpbmcgKmNzOworCiAJY3MgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGNsYXNzX2F0dHJpYnV0ZV9zdHJpbmcsIGF0dHIpOwogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVzXG4iLCBjcy0+c3RyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9jb3JlLmMgYi9kcml2ZXJzL2Jhc2UvY29yZS5jCmluZGV4IDA3MzA0YTMuLjIxZDEzMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9jb3JlLmMKKysrIGIvZHJpdmVycy9iYXNlL2NvcmUuYwpAQCAtMTIsNiArMTIsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZndub2RlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTgwNSw4ICs4MDYsMTYgQEAKIAogc3RhdGljIGludCBkZXZpY2VfYWRkX2NsYXNzX3N5bWxpbmtzKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUgPSBkZXZfb2Zfbm9kZShkZXYpOwogCWludCBlcnJvcjsKIAorCWlmIChvZl9ub2RlKSB7CisJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJm9mX25vZGUtPmtvYmosIm9mX25vZGUiKTsKKwkJaWYgKGVycm9yKQorCQkJZGV2X3dhcm4oZGV2LCAiRXJyb3IgJWQgY3JlYXRpbmcgb2Zfbm9kZSBsaW5rXG4iLGVycm9yKTsKKwkJLyogQW4gZXJyb3IgaGVyZSBkb2Vzbid0IHdhcnJhbnQgYnJpbmdpbmcgZG93biB0aGUgZGV2aWNlICovCisJfQorCiAJaWYgKCFkZXYtPmNsYXNzKQogCQlyZXR1cm4gMDsKIApAQCAtODE0LDcgKzgyMyw3IEBACiAJCQkJICAmZGV2LT5jbGFzcy0+cC0+c3Vic3lzLmtvYmosCiAJCQkJICAic3Vic3lzdGVtIik7CiAJaWYgKGVycm9yKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfZGV2bm9kZTsKIAogCWlmIChkZXYtPnBhcmVudCAmJiBkZXZpY2VfaXNfbm90X3BhcnRpdGlvbihkZXYpKSB7CiAJCWVycm9yID0gc3lzZnNfY3JlYXRlX2xpbmsoJmRldi0+a29iaiwgJmRldi0+cGFyZW50LT5rb2JqLApAQCAtODQyLDEyICs4NTEsMTYgQEAKIAogb3V0X3N1YnN5czoKIAlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAic3Vic3lzdGVtIik7Ci1vdXQ6CitvdXRfZGV2bm9kZToKKwlzeXNmc19yZW1vdmVfbGluaygmZGV2LT5rb2JqLCAib2Zfbm9kZSIpOwogCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIHZvaWQgZGV2aWNlX3JlbW92ZV9jbGFzc19zeW1saW5rcyhzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJaWYgKGRldl9vZl9ub2RlKGRldikpCisJCXN5c2ZzX3JlbW92ZV9saW5rKCZkZXYtPmtvYmosICJvZl9ub2RlIik7CisKIAlpZiAoIWRldi0+Y2xhc3MpCiAJCXJldHVybjsKIApAQCAtMTA5NSw4ICsxMTA4LDcgQEAKIAlrb2JqZWN0X2RlbCgmZGV2LT5rb2JqKTsKICBFcnJvcjoKIAljbGVhbnVwX2RldmljZV9wYXJlbnQoZGV2KTsKLQlpZiAocGFyZW50KQotCQlwdXRfZGV2aWNlKHBhcmVudCk7CisJcHV0X2RldmljZShwYXJlbnQpOwogbmFtZV9lcnJvcjoKIAlrZnJlZShkZXYtPnApOwogCWRldi0+cCA9IE5VTEw7CkBAIC0yMTMzLDMgKzIxNDUsNTMgQEAKIGRlZmluZV9kZXZfcHJpbnRrX2xldmVsKF9kZXZfaW5mbywgS0VSTl9JTkZPKTsKIAogI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBmd25vZGVfaXNfcHJpbWFyeShzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlKQoreworCXJldHVybiBmd25vZGUgJiYgIUlTX0VSUihmd25vZGUtPnNlY29uZGFyeSk7Cit9CisKKy8qKgorICogc2V0X3ByaW1hcnlfZndub2RlIC0gQ2hhbmdlIHRoZSBwcmltYXJ5IGZpcm13YXJlIG5vZGUgb2YgYSBnaXZlbiBkZXZpY2UuCisgKiBAZGV2OiBEZXZpY2UgdG8gaGFuZGxlLgorICogQGZ3bm9kZTogTmV3IHByaW1hcnkgZmlybXdhcmUgbm9kZSBvZiB0aGUgZGV2aWNlLgorICoKKyAqIFNldCB0aGUgZGV2aWNlJ3MgZmlybXdhcmUgbm9kZSBwb2ludGVyIHRvIEBmd25vZGUsIGJ1dCBpZiBhIHNlY29uZGFyeQorICogZmlybXdhcmUgbm9kZSBvZiB0aGUgZGV2aWNlIGlzIHByZXNlbnQsIHByZXNlcnZlIGl0LgorICovCit2b2lkIHNldF9wcmltYXJ5X2Z3bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUpCit7CisJaWYgKGZ3bm9kZSkgeworCQlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZm4gPSBkZXYtPmZ3bm9kZTsKKworCQlpZiAoZndub2RlX2lzX3ByaW1hcnkoZm4pKQorCQkJZm4gPSBmbi0+c2Vjb25kYXJ5OworCisJCWZ3bm9kZS0+c2Vjb25kYXJ5ID0gZm47CisJCWRldi0+Zndub2RlID0gZndub2RlOworCX0gZWxzZSB7CisJCWRldi0+Zndub2RlID0gZndub2RlX2lzX3ByaW1hcnkoZGV2LT5md25vZGUpID8KKwkJCWRldi0+Zndub2RlLT5zZWNvbmRhcnkgOiBOVUxMOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNldF9wcmltYXJ5X2Z3bm9kZSk7CisKKy8qKgorICogc2V0X3NlY29uZGFyeV9md25vZGUgLSBDaGFuZ2UgdGhlIHNlY29uZGFyeSBmaXJtd2FyZSBub2RlIG9mIGEgZ2l2ZW4gZGV2aWNlLgorICogQGRldjogRGV2aWNlIHRvIGhhbmRsZS4KKyAqIEBmd25vZGU6IE5ldyBzZWNvbmRhcnkgZmlybXdhcmUgbm9kZSBvZiB0aGUgZGV2aWNlLgorICoKKyAqIElmIGEgcHJpbWFyeSBmaXJtd2FyZSBub2RlIG9mIHRoZSBkZXZpY2UgaXMgcHJlc2VudCwgc2V0IGl0cyBzZWNvbmRhcnkKKyAqIHBvaW50ZXIgdG8gQGZ3bm9kZS4gIE90aGVyd2lzZSwgc2V0IHRoZSBkZXZpY2UncyBmaXJtd2FyZSBub2RlIHBvaW50ZXIgdG8KKyAqIEBmd25vZGUuCisgKi8KK3ZvaWQgc2V0X3NlY29uZGFyeV9md25vZGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlKQoreworCWlmIChmd25vZGUpCisJCWZ3bm9kZS0+c2Vjb25kYXJ5ID0gRVJSX1BUUigtRU5PREVWKTsKKworCWlmIChmd25vZGVfaXNfcHJpbWFyeShkZXYtPmZ3bm9kZSkpCisJCWRldi0+Zndub2RlLT5zZWNvbmRhcnkgPSBmd25vZGU7CisJZWxzZQorCQlkZXYtPmZ3bm9kZSA9IGZ3bm9kZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9kZC5jIGIvZHJpdmVycy9iYXNlL2RkLmMKaW5kZXggY2RjNzc5Yy4uZTg0M2ZkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RkLmMKKysrIGIvZHJpdmVycy9iYXNlL2RkLmMKQEAgLTI5OCw2ICsyOTgsMTIgQEAKIAkJZ290byBwcm9iZV9mYWlsZWQ7CiAJfQogCisJaWYgKGRldi0+cG1fZG9tYWluICYmIGRldi0+cG1fZG9tYWluLT5hY3RpdmF0ZSkgeworCQlyZXQgPSBkZXYtPnBtX2RvbWFpbi0+YWN0aXZhdGUoZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gcHJvYmVfZmFpbGVkOworCX0KKwogCWlmIChkZXYtPmJ1cy0+cHJvYmUpIHsKIAkJcmV0ID0gZGV2LT5idXMtPnByb2JlKGRldik7CiAJCWlmIChyZXQpCkBAIC0zMDgsNiArMzE0LDkgQEAKIAkJCWdvdG8gcHJvYmVfZmFpbGVkOwogCX0KIAorCWlmIChkZXYtPnBtX2RvbWFpbiAmJiBkZXYtPnBtX2RvbWFpbi0+c3luYykKKwkJZGV2LT5wbV9kb21haW4tPnN5bmMoZGV2KTsKKwogCWRyaXZlcl9ib3VuZChkZXYpOwogCXJldCA9IDE7CiAJcHJfZGVidWcoImJ1czogJyVzJzogJXM6IGJvdW5kIGRldmljZSAlcyB0byBkcml2ZXIgJXNcbiIsCkBAIC0zMTksMjIgKzMyOCwyOCBAQAogCWRyaXZlcl9zeXNmc19yZW1vdmUoZGV2KTsKIAlkZXYtPmRyaXZlciA9IE5VTEw7CiAJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJaWYgKGRldi0+cG1fZG9tYWluICYmIGRldi0+cG1fZG9tYWluLT5kaXNtaXNzKQorCQlkZXYtPnBtX2RvbWFpbi0+ZGlzbWlzcyhkZXYpOwogCi0JaWYgKHJldCA9PSAtRVBST0JFX0RFRkVSKSB7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIC1FUFJPQkVfREVGRVI6CiAJCS8qIERyaXZlciByZXF1ZXN0ZWQgZGVmZXJyZWQgcHJvYmluZyAqLwotCQlkZXZfaW5mbyhkZXYsICJEcml2ZXIgJXMgcmVxdWVzdHMgcHJvYmUgZGVmZXJyYWxcbiIsIGRydi0+bmFtZSk7CisJCWRldl9kYmcoZGV2LCAiRHJpdmVyICVzIHJlcXVlc3RzIHByb2JlIGRlZmVycmFsXG4iLCBkcnYtPm5hbWUpOwogCQlkcml2ZXJfZGVmZXJyZWRfcHJvYmVfYWRkKGRldik7CiAJCS8qIERpZCBhIHRyaWdnZXIgb2NjdXIgd2hpbGUgcHJvYmluZz8gTmVlZCB0byByZS10cmlnZ2VyIGlmIHllcyAqLwogCQlpZiAobG9jYWxfdHJpZ2dlcl9jb3VudCAhPSBhdG9taWNfcmVhZCgmZGVmZXJyZWRfdHJpZ2dlcl9jb3VudCkpCiAJCQlkcml2ZXJfZGVmZXJyZWRfcHJvYmVfdHJpZ2dlcigpOwotCX0gZWxzZSBpZiAocmV0ICE9IC1FTk9ERVYgJiYgcmV0ICE9IC1FTlhJTykgeworCQlicmVhazsKKwljYXNlIC1FTk9ERVY6CisJY2FzZSAtRU5YSU86CisJCXByX2RlYnVnKCIlczogcHJvYmUgb2YgJXMgcmVqZWN0cyBtYXRjaCAlZFxuIiwKKwkJCSBkcnYtPm5hbWUsIGRldl9uYW1lKGRldiksIHJldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCS8qIGRyaXZlciBtYXRjaGVkIGJ1dCB0aGUgcHJvYmUgZmFpbGVkICovCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICIlczogcHJvYmUgb2YgJXMgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCiAJCSAgICAgICBkcnYtPm5hbWUsIGRldl9uYW1lKGRldiksIHJldCk7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoIiVzOiBwcm9iZSBvZiAlcyByZWplY3RzIG1hdGNoICVkXG4iLAotCQkgICAgICAgZHJ2LT5uYW1lLCBkZXZfbmFtZShkZXYpLCByZXQpOwogCX0KIAkvKgogCSAqIElnbm9yZSBlcnJvcnMgcmV0dXJuZWQgYnkgLT5wcm9iZSBzbyB0aGF0IHRoZSBuZXh0IGRyaXZlciBjYW4gdHJ5CkBAIC01MjUsNiArNTQwLDkgQEAKIAkJZGV2cmVzX3JlbGVhc2VfYWxsKGRldik7CiAJCWRldi0+ZHJpdmVyID0gTlVMTDsKIAkJZGV2X3NldF9kcnZkYXRhKGRldiwgTlVMTCk7CisJCWlmIChkZXYtPnBtX2RvbWFpbiAmJiBkZXYtPnBtX2RvbWFpbi0+ZGlzbWlzcykKKwkJCWRldi0+cG1fZG9tYWluLT5kaXNtaXNzKGRldik7CisKIAkJa2xpc3RfcmVtb3ZlKCZkZXYtPnAtPmtub2RlX2RyaXZlcik7CiAJCWlmIChkZXYtPmJ1cykKIAkJCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJmRldi0+YnVzLT5wLT5idXNfbm90aWZpZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZG1hLW1hcHBpbmcuYyBiL2RyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jCmluZGV4IDllOGJiZGQuLmQ5NWM1OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jCisrKyBiL2RyaXZlcnMvYmFzZS9kbWEtbWFwcGluZy5jCkBAIC02Miw3ICs2Miw3IEBACiAgKiBSRVRVUk5TOgogICogUG9pbnRlciB0byBhbGxvY2F0ZWQgbWVtb3J5IG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4KICAqLwotdm9pZCAqIGRtYW1fYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKK3ZvaWQgKmRtYW1fYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKIAkJCSAgIGRtYV9hZGRyX3QgKmRtYV9oYW5kbGUsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgZG1hX2RldnJlcyAqZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMgYi9kcml2ZXJzL2Jhc2UvZHJpdmVyLmMKaW5kZXggOWUyOTk0My4uNGVhYmZlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvYmFzZS9kcml2ZXIuYwpAQCAtMTAzLDYgKzEwMyw3IEBACiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgZHJpdmVyX2F0dHJpYnV0ZSAqYXR0cikKIHsKIAlpbnQgZXJyb3I7CisKIAlpZiAoZHJ2KQogCQllcnJvciA9IHN5c2ZzX2NyZWF0ZV9maWxlKCZkcnYtPnAtPmtvYmosICZhdHRyLT5hdHRyKTsKIAllbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZmlybXdhcmVfY2xhc3MuYyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCmluZGV4IDZjNWM5ZWQuLjE3MTg0MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9maXJtd2FyZV9jbGFzcy5jCkBAIC0xODEsNyArMTgxLDcgQEAKIHsKIAlzdHJ1Y3QgZmlybXdhcmVfYnVmICpidWY7CiAKLQlidWYgPSBremFsbG9jKHNpemVvZigqYnVmKSArIHN0cmxlbihmd19uYW1lKSArIDEgLCBHRlBfQVRPTUlDKTsKKwlidWYgPSBremFsbG9jKHNpemVvZigqYnVmKSArIHN0cmxlbihmd19uYW1lKSArIDEsIEdGUF9BVE9NSUMpOwogCiAJaWYgKCFidWYpCiAJCXJldHVybiBidWY7CkBAIC04MzUsNiArODM1LDI2IEBACiAJLndyaXRlID0gZmlybXdhcmVfZGF0YV93cml0ZSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpmd19kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfbG9hZGluZy5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqZndfZGV2X2Jpbl9hdHRyc1tdID0geworCSZmaXJtd2FyZV9hdHRyX2RhdGEsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZndfZGV2X2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gZndfZGV2X2F0dHJzLAorCS5iaW5fYXR0cnMgPSBmd19kZXZfYmluX2F0dHJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmZ3X2Rldl9hdHRyX2dyb3Vwc1tdID0geworCSZmd19kZXZfYXR0cl9ncm91cCwKKwlOVUxMCit9OworCiBzdGF0aWMgc3RydWN0IGZpcm13YXJlX3ByaXYgKgogZndfY3JlYXRlX2luc3RhbmNlKHN0cnVjdCBmaXJtd2FyZSAqZmlybXdhcmUsIGNvbnN0IGNoYXIgKmZ3X25hbWUsCiAJCSAgIHN0cnVjdCBkZXZpY2UgKmRldmljZSwgdW5zaWduZWQgaW50IG9wdF9mbGFncykKQEAgLTg1Niw2ICs4NzYsNyBAQAogCWRldl9zZXRfbmFtZShmX2RldiwgIiVzIiwgZndfbmFtZSk7CiAJZl9kZXYtPnBhcmVudCA9IGRldmljZTsKIAlmX2Rldi0+Y2xhc3MgPSAmZmlybXdhcmVfY2xhc3M7CisJZl9kZXYtPmdyb3VwcyA9IGZ3X2Rldl9hdHRyX2dyb3VwczsKIGV4aXQ6CiAJcmV0dXJuIGZ3X3ByaXY7CiB9CkBAIC04NzksMjUgKzkwMCwxMCBAQAogCQlnb3RvIGVycl9wdXRfZGV2OwogCX0KIAotCXJldHZhbCA9IGRldmljZV9jcmVhdGVfYmluX2ZpbGUoZl9kZXYsICZmaXJtd2FyZV9hdHRyX2RhdGEpOwotCWlmIChyZXR2YWwpIHsKLQkJZGV2X2VycihmX2RldiwgIiVzOiBzeXNmc19jcmVhdGVfYmluX2ZpbGUgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX2RlbF9kZXY7Ci0JfQotCiAJbXV0ZXhfbG9jaygmZndfbG9jayk7CiAJbGlzdF9hZGQoJmJ1Zi0+cGVuZGluZ19saXN0LCAmcGVuZGluZ19md19oZWFkKTsKIAltdXRleF91bmxvY2soJmZ3X2xvY2spOwogCi0JcmV0dmFsID0gZGV2aWNlX2NyZWF0ZV9maWxlKGZfZGV2LCAmZGV2X2F0dHJfbG9hZGluZyk7Ci0JaWYgKHJldHZhbCkgewotCQltdXRleF9sb2NrKCZmd19sb2NrKTsKLQkJbGlzdF9kZWxfaW5pdCgmYnVmLT5wZW5kaW5nX2xpc3QpOwotCQltdXRleF91bmxvY2soJmZ3X2xvY2spOwotCQlkZXZfZXJyKGZfZGV2LCAiJXM6IGRldmljZV9jcmVhdGVfZmlsZSBmYWlsZWRcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnJfZGVsX2Jpbl9hdHRyOwotCX0KLQogCWlmIChvcHRfZmxhZ3MgJiBGV19PUFRfVUVWRU5UKSB7CiAJCWJ1Zi0+bmVlZF91ZXZlbnQgPSB0cnVlOwogCQlkZXZfc2V0X3VldmVudF9zdXBwcmVzcyhmX2RldiwgZmFsc2UpOwpAQCAtOTEzLDYgKzkxOSw4IEBACiAJCW11dGV4X2xvY2soJmZ3X2xvY2spOwogCQlmd19sb2FkX2Fib3J0KGZ3X3ByaXYpOwogCQltdXRleF91bmxvY2soJmZ3X2xvY2spOworCX0gZWxzZSBpZiAocmV0dmFsID4gMCkgeworCQlyZXR2YWwgPSAwOwogCX0KIAogCWlmIChpc19md19sb2FkX2Fib3J0ZWQoYnVmKSkKQEAgLTkyMCwxMCArOTI4LDYgQEAKIAllbHNlIGlmICghYnVmLT5kYXRhKQogCQlyZXR2YWwgPSAtRU5PTUVNOwogCi0JZGV2aWNlX3JlbW92ZV9maWxlKGZfZGV2LCAmZGV2X2F0dHJfbG9hZGluZyk7Ci1lcnJfZGVsX2Jpbl9hdHRyOgotCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoZl9kZXYsICZmaXJtd2FyZV9hdHRyX2RhdGEpOwotZXJyX2RlbF9kZXY6CiAJZGV2aWNlX2RlbChmX2Rldik7CiBlcnJfcHV0X2RldjoKIAlwdXRfZGV2aWNlKGZfZGV2KTsKQEAgLTExNjgsNyArMTE3Miw3IEBACiAgKiovCiBpbnQKIHJlcXVlc3RfZmlybXdhcmUoY29uc3Qgc3RydWN0IGZpcm13YXJlICoqZmlybXdhcmVfcCwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgc3RydWN0IGRldmljZSAqZGV2aWNlKQorCQkgc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCWludCByZXQ7CiAKQEAgLTExOTYsNiArMTIwMCw3IEBACiAJCQkgICAgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCWludCByZXQ7CisKIAlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwogCXJldCA9IF9yZXF1ZXN0X2Zpcm13YXJlKGZpcm13YXJlX3AsIG5hbWUsIGRldmljZSwKIAkJCQlGV19PUFRfVUVWRU5UIHwgRldfT1BUX05PX1dBUk4pOwpAQCAtMTI3Niw3ICsxMjgxLDcgQEAKIHsKIAlzdHJ1Y3QgZmlybXdhcmVfd29yayAqZndfd29yazsKIAotCWZ3X3dvcmsgPSBremFsbG9jKHNpemVvZiAoc3RydWN0IGZpcm13YXJlX3dvcmspLCBnZnApOworCWZ3X3dvcmsgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZmlybXdhcmVfd29yayksIGdmcCk7CiAJaWYgKCFmd193b3JrKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL21hcC5jIGIvZHJpdmVycy9iYXNlL21hcC5jCmluZGV4IGU4NzAxN2YuLmMxZDM4MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9tYXAuYworKysgYi9kcml2ZXJzL2Jhc2UvbWFwLmMKQEAgLTQxLDggKzQxLDcgQEAKIAlpZiAobiA+IDI1NSkKIAkJbiA9IDI1NTsKIAotCXAgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcHJvYmUpICogbiwgR0ZQX0tFUk5FTCk7Ci0KKwlwID0ga21hbGxvY19hcnJheShuLCBzaXplb2Yoc3RydWN0IHByb2JlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9tZW1vcnkuYyBiL2RyaXZlcnMvYmFzZS9tZW1vcnkuYwppbmRleCA4NWJlMDQwLi4yODA0YWVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvbWVtb3J5LmMKKysrIGIvZHJpdmVycy9iYXNlL21lbW9yeS5jCkBAIC01MiwxMyArNTIsMTMgQEAKIAogaW50IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQogewotICAgICAgICByZXR1cm4gYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJm1lbW9yeV9jaGFpbiwgbmIpOworCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmbWVtb3J5X2NoYWluLCBuYik7CiB9CiBFWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcik7CiAKIHZvaWQgdW5yZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKIHsKLSAgICAgICAgYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmbWVtb3J5X2NoYWluLCBuYik7CisJYmxvY2tpbmdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmbWVtb3J5X2NoYWluLCBuYik7CiB9CiBFWFBPUlRfU1lNQk9MKHVucmVnaXN0ZXJfbWVtb3J5X25vdGlmaWVyKTsKIApAQCAtMTUyLDIwICsxNTIsMjAgQEAKIAkgKiBzbyB0aGF0IHRoZXkncmUgbm90IG9wZW4tY29kZWQKIAkgKi8KIAlzd2l0Y2ggKG1lbS0+c3RhdGUpIHsKLQkJY2FzZSBNRU1fT05MSU5FOgotCQkJbGVuID0gc3ByaW50ZihidWYsICJvbmxpbmVcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUVNX09GRkxJTkU6Ci0JCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIm9mZmxpbmVcbiIpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUVNX0dPSU5HX09GRkxJTkU6Ci0JCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgImdvaW5nLW9mZmxpbmVcbiIpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIkVSUk9SLVVOS05PV04tJWxkXG4iLAotCQkJCQltZW0tPnN0YXRlKTsKLQkJCVdBUk5fT04oMSk7Ci0JCQlicmVhazsKKwljYXNlIE1FTV9PTkxJTkU6CisJCWxlbiA9IHNwcmludGYoYnVmLCAib25saW5lXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBNRU1fT0ZGTElORToKKwkJbGVuID0gc3ByaW50ZihidWYsICJvZmZsaW5lXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBNRU1fR09JTkdfT0ZGTElORToKKwkJbGVuID0gc3ByaW50ZihidWYsICJnb2luZy1vZmZsaW5lXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbGVuID0gc3ByaW50ZihidWYsICJFUlJPUi1VTktOT1dOLSVsZFxuIiwKKwkJCQltZW0tPnN0YXRlKTsKKwkJV0FSTl9PTigxKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIGxlbjsKQEAgLTIxOSw2ICsyMTksNyBAQAogLyoKICAqIE1FTU9SWV9IT1RQTFVHIGRlcGVuZHMgb24gU1BBUlNFTUVNIGluIG1tL0tjb25maWcsIHNvIGl0IGlzCiAgKiBPSyB0byBoYXZlIGRpcmVjdCByZWZlcmVuY2VzIHRvIHNwYXJzZW1lbSB2YXJpYWJsZXMgaW4gaGVyZS4KKyAqIE11c3QgYWxyZWFkeSBiZSBwcm90ZWN0ZWQgYnkgbWVtX2hvdHBsdWdfYmVnaW4oKS4KICAqLwogc3RhdGljIGludAogbWVtb3J5X2Jsb2NrX2FjdGlvbih1bnNpZ25lZCBsb25nIHBoeXNfaW5kZXgsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCBpbnQgb25saW5lX3R5cGUpCkBAIC0yMjgsMjMgKzIyOSwyMyBAQAogCXN0cnVjdCBwYWdlICpmaXJzdF9wYWdlOwogCWludCByZXQ7CiAKLQlzdGFydF9wZm4gPSBwaHlzX2luZGV4IDw8IFBGTl9TRUNUSU9OX1NISUZUOworCXN0YXJ0X3BmbiA9IHNlY3Rpb25fbnJfdG9fcGZuKHBoeXNfaW5kZXgpOwogCWZpcnN0X3BhZ2UgPSBwZm5fdG9fcGFnZShzdGFydF9wZm4pOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKLQkJY2FzZSBNRU1fT05MSU5FOgotCQkJaWYgKCFwYWdlc19jb3JyZWN0bHlfcmVzZXJ2ZWQoc3RhcnRfcGZuKSkKLQkJCQlyZXR1cm4gLUVCVVNZOworCWNhc2UgTUVNX09OTElORToKKwkJaWYgKCFwYWdlc19jb3JyZWN0bHlfcmVzZXJ2ZWQoc3RhcnRfcGZuKSkKKwkJCXJldHVybiAtRUJVU1k7CiAKLQkJCXJldCA9IG9ubGluZV9wYWdlcyhzdGFydF9wZm4sIG5yX3BhZ2VzLCBvbmxpbmVfdHlwZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBNRU1fT0ZGTElORToKLQkJCXJldCA9IG9mZmxpbmVfcGFnZXMoc3RhcnRfcGZuLCBucl9wYWdlcyk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCVdBUk4oMSwgS0VSTl9XQVJOSU5HICIlcyglbGQsICVsZCkgdW5rbm93biBhY3Rpb246ICIKLQkJCSAgICAgIiVsZFxuIiwgX19mdW5jX18sIHBoeXNfaW5kZXgsIGFjdGlvbiwgYWN0aW9uKTsKLQkJCXJldCA9IC1FSU5WQUw7CisJCXJldCA9IG9ubGluZV9wYWdlcyhzdGFydF9wZm4sIG5yX3BhZ2VzLCBvbmxpbmVfdHlwZSk7CisJCWJyZWFrOworCWNhc2UgTUVNX09GRkxJTkU6CisJCXJldCA9IG9mZmxpbmVfcGFnZXMoc3RhcnRfcGZuLCBucl9wYWdlcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk4oMSwgS0VSTl9XQVJOSU5HICIlcyglbGQsICVsZCkgdW5rbm93biBhY3Rpb246ICIKKwkJICAgICAiJWxkXG4iLCBfX2Z1bmNfXywgcGh5c19pbmRleCwgYWN0aW9uLCBhY3Rpb24pOworCQlyZXQgPSAtRUlOVkFMOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0yODYsNiArMjg3LDcgQEAKIAlpZiAobWVtLT5vbmxpbmVfdHlwZSA8IDApCiAJCW1lbS0+b25saW5lX3R5cGUgPSBNTU9QX09OTElORV9LRUVQOwogCisJLyogQWxyZWFkeSB1bmRlciBwcm90ZWN0aW9uIG9mIG1lbV9ob3RwbHVnX2JlZ2luKCkgKi8KIAlyZXQgPSBtZW1vcnlfYmxvY2tfY2hhbmdlX3N0YXRlKG1lbSwgTUVNX09OTElORSwgTUVNX09GRkxJTkUpOwogCiAJLyogY2xlYXIgb25saW5lX3R5cGUgKi8KQEAgLTMyOCwxNyArMzMwLDE5IEBACiAJCWdvdG8gZXJyOwogCX0KIAorCS8qCisJICogTWVtb3J5IGhvdHBsdWcgbmVlZHMgdG8gaG9sZCBtZW1faG90cGx1Z19iZWdpbigpIGZvciBwcm9iZSB0byBmaW5kCisJICogdGhlIGNvcnJlY3QgbWVtb3J5IGJsb2NrIHRvIG9ubGluZSBiZWZvcmUgZG9pbmcgZGV2aWNlX29ubGluZShkZXYpLAorCSAqIHdoaWNoIHdpbGwgdGFrZSBkZXYtPm11dGV4LiAgVGFrZSB0aGUgbG9jayBlYXJseSB0byBwcmV2ZW50IGFuCisJICogaW52ZXJzaW9uLCBtZW1vcnlfc3Vic3lzX29ubGluZSgpIGNhbGxiYWNrcyB3aWxsIGJlIGltcGxlbWVudGVkIGJ5CisJICogYXNzdW1pbmcgaXQncyBhbHJlYWR5IHByb3RlY3RlZC4KKwkgKi8KKwltZW1faG90cGx1Z19iZWdpbigpOworCiAJc3dpdGNoIChvbmxpbmVfdHlwZSkgewogCWNhc2UgTU1PUF9PTkxJTkVfS0VSTkVMOgogCWNhc2UgTU1PUF9PTkxJTkVfTU9WQUJMRToKIAljYXNlIE1NT1BfT05MSU5FX0tFRVA6Ci0JCS8qCi0JCSAqIG1lbS0+b25saW5lX3R5cGUgaXMgbm90IHByb3RlY3RlZCBzbyB0aGVyZSBjYW4gYmUgYQotCQkgKiByYWNlIGhlcmUuICBIb3dldmVyLCB3aGVuIHJhY2luZyBvbmxpbmUsIHRoZSBmaXJzdAotCQkgKiB3aWxsIHN1Y2NlZWQgYW5kIHRoZSBzZWNvbmQgd2lsbCBqdXN0IHJldHVybiBhcyB0aGUKLQkJICogYmxvY2sgd2lsbCBhbHJlYWR5IGJlIG9ubGluZS4gIFRoZSBvbmxpbmUgdHlwZQotCQkgKiBjb3VsZCBiZSBlaXRoZXIgb25lLCBidXQgdGhhdCBpcyBleHBlY3RlZC4KLQkJICovCiAJCW1lbS0+b25saW5lX3R5cGUgPSBvbmxpbmVfdHlwZTsKIAkJcmV0ID0gZGV2aWNlX29ubGluZSgmbWVtLT5kZXYpOwogCQlicmVhazsKQEAgLTM0OSw2ICszNTMsNyBAQAogCQlyZXQgPSAtRUlOVkFMOyAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCiAJfQogCisJbWVtX2hvdHBsdWdfZG9uZSgpOwogZXJyOgogCXVubG9ja19kZXZpY2VfaG90cGx1ZygpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2Uvbm9kZS5jIGIvZHJpdmVycy9iYXNlL25vZGUuYwppbmRleCAzNmZhYmU0My4uYTJhYTY1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL25vZGUuYworKysgYi9kcml2ZXJzL2Jhc2Uvbm9kZS5jCkBAIC0xODAsNyArMTgwLDcgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUih2bXN0YXQsIFNfSVJVR08sIG5vZGVfcmVhZF92bXN0YXQsIE5VTEwpOwogCiBzdGF0aWMgc3NpemVfdCBub2RlX3JlYWRfZGlzdGFuY2Uoc3RydWN0IGRldmljZSAqZGV2LAotCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKiBidWYpCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCWludCBuaWQgPSBkZXYtPmlkOwogCWludCBsZW4gPSAwOwpAQCAtMjAwLDYgKzIwMCwxNyBAQAogfQogc3RhdGljIERFVklDRV9BVFRSKGRpc3RhbmNlLCBTX0lSVUdPLCBub2RlX3JlYWRfZGlzdGFuY2UsIE5VTEwpOwogCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbm9kZV9kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfY3B1bWFwLmF0dHIsCisJJmRldl9hdHRyX2NwdWxpc3QuYXR0ciwKKwkmZGV2X2F0dHJfbWVtaW5mby5hdHRyLAorCSZkZXZfYXR0cl9udW1hc3RhdC5hdHRyLAorCSZkZXZfYXR0cl9kaXN0YW5jZS5hdHRyLAorCSZkZXZfYXR0cl92bXN0YXQuYXR0ciwKKwlOVUxMCit9OworQVRUUklCVVRFX0dST1VQUyhub2RlX2Rldik7CisKICNpZmRlZiBDT05GSUdfSFVHRVRMQkZTCiAvKgogICogaHVnZXRsYmZzIHBlciBub2RlIGF0dHJpYnV0ZXMgcmVnaXN0cmF0aW9uIGludGVyZmFjZToKQEAgLTI3MywxNiArMjg0LDEwIEBACiAJbm9kZS0+ZGV2LmlkID0gbnVtOwogCW5vZGUtPmRldi5idXMgPSAmbm9kZV9zdWJzeXM7CiAJbm9kZS0+ZGV2LnJlbGVhc2UgPSBub2RlX2RldmljZV9yZWxlYXNlOworCW5vZGUtPmRldi5ncm91cHMgPSBub2RlX2Rldl9ncm91cHM7CiAJZXJyb3IgPSBkZXZpY2VfcmVnaXN0ZXIoJm5vZGUtPmRldik7CiAKIAlpZiAoIWVycm9yKXsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZub2RlLT5kZXYsICZkZXZfYXR0cl9jcHVtYXApOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5vZGUtPmRldiwgJmRldl9hdHRyX2NwdWxpc3QpOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5vZGUtPmRldiwgJmRldl9hdHRyX21lbWluZm8pOwotCQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm5vZGUtPmRldiwgJmRldl9hdHRyX251bWFzdGF0KTsKLQkJZGV2aWNlX2NyZWF0ZV9maWxlKCZub2RlLT5kZXYsICZkZXZfYXR0cl9kaXN0YW5jZSk7Ci0JCWRldmljZV9jcmVhdGVfZmlsZSgmbm9kZS0+ZGV2LCAmZGV2X2F0dHJfdm1zdGF0KTsKLQogCQlodWdldGxiX3JlZ2lzdGVyX25vZGUobm9kZSk7CiAKIAkJY29tcGFjdGlvbl9yZWdpc3Rlcl9ub2RlKG5vZGUpOwpAQCAtMjk5LDEzICszMDQsNiBAQAogICovCiB2b2lkIHVucmVnaXN0ZXJfbm9kZShzdHJ1Y3Qgbm9kZSAqbm9kZSkKIHsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm5vZGUtPmRldiwgJmRldl9hdHRyX2NwdW1hcCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZub2RlLT5kZXYsICZkZXZfYXR0cl9jcHVsaXN0KTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm5vZGUtPmRldiwgJmRldl9hdHRyX21lbWluZm8pOwotCWRldmljZV9yZW1vdmVfZmlsZSgmbm9kZS0+ZGV2LCAmZGV2X2F0dHJfbnVtYXN0YXQpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmbm9kZS0+ZGV2LCAmZGV2X2F0dHJfZGlzdGFuY2UpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmbm9kZS0+ZGV2LCAmZGV2X2F0dHJfdm1zdGF0KTsKLQogCWh1Z2V0bGJfdW5yZWdpc3Rlcl9ub2RlKG5vZGUpOwkJLyogbm8tb3AsIGlmIG1lbW9yeWxlc3Mgbm9kZSAqLwogCiAJZGV2aWNlX3VucmVnaXN0ZXIoJm5vZGUtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcGxhdGZvcm0uYyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCmluZGV4IDk0MjFmZWQuLmViZjAzNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wbGF0Zm9ybS5jCkBAIC0xMDEsNiArMTAxLDE1IEBACiAJfQogCiAJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShkZXYsIElPUkVTT1VSQ0VfSVJRLCBudW0pOworCS8qCisJICogVGhlIHJlc291cmNlcyBtYXkgcGFzcyB0cmlnZ2VyIGZsYWdzIHRvIHRoZSBpcnFzIHRoYXQgbmVlZAorCSAqIHRvIGJlIHNldCB1cC4gSXQgc28gaGFwcGVucyB0aGF0IHRoZSB0cmlnZ2VyIGZsYWdzIGZvcgorCSAqIElPUkVTT1VSQ0VfQklUUyBjb3JyZXNwb25kIDEtdG8tMSB0byB0aGUgSVJRRl9UUklHR0VSKgorCSAqIHNldHRpbmdzLgorCSAqLworCWlmIChyICYmIHItPmZsYWdzICYgSU9SRVNPVVJDRV9CSVRTKQorCQlpcnFkX3NldF90cmlnZ2VyX3R5cGUoaXJxX2dldF9pcnFfZGF0YShyLT5zdGFydCksCisJCQkJICAgICAgci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JJVFMpOwogCiAJcmV0dXJuIHIgPyByLT5zdGFydCA6IC1FTlhJTzsKICNlbmRpZgpAQCAtNDU0LDcgKzQ2Myw3IEBACiAJCWdvdG8gZXJyX2FsbG9jOwogCiAJcGRldi0+ZGV2LnBhcmVudCA9IHBkZXZpbmZvLT5wYXJlbnQ7Ci0JQUNQSV9DT01QQU5JT05fU0VUKCZwZGV2LT5kZXYsIHBkZXZpbmZvLT5hY3BpX25vZGUuY29tcGFuaW9uKTsKKwlwZGV2LT5kZXYuZndub2RlID0gcGRldmluZm8tPmZ3bm9kZTsKIAogCWlmIChwZGV2aW5mby0+ZG1hX21hc2spIHsKIAkJLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYyBiL2RyaXZlcnMvYmFzZS9wb3dlci9kb21haW4uYwppbmRleCA0NTkzN2Y4Li4yMzI3NjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvZG9tYWluLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL2RvbWFpbi5jCkBAIC02OCw3ICs2OCwzNiBAQAogCXJldHVybiBnZW5wZDsKIH0KIAotc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpkZXZfdG9fZ2VucGQoc3RydWN0IGRldmljZSAqZGV2KQorLyoKKyAqIEdldCB0aGUgZ2VuZXJpYyBQTSBkb21haW4gZm9yIGEgcGFydGljdWxhciBzdHJ1Y3QgZGV2aWNlLgorICogVGhpcyB2YWxpZGF0ZXMgdGhlIHN0cnVjdCBkZXZpY2UgcG9pbnRlciwgdGhlIFBNIGRvbWFpbiBwb2ludGVyLAorICogYW5kIGNoZWNrcyB0aGF0IHRoZSBQTSBkb21haW4gcG9pbnRlciBpcyBhIHJlYWwgZ2VuZXJpYyBQTSBkb21haW4uCisgKiBBbnkgZmFpbHVyZSByZXN1bHRzIGluIE5VTEwgYmVpbmcgcmV0dXJuZWQuCisgKi8KK3N0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqcG1fZ2VucGRfbG9va3VwX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCA9IE5VTEwsICpncGQ7CisKKwlpZiAoSVNfRVJSX09SX05VTEwoZGV2KSB8fCBJU19FUlJfT1JfTlVMTChkZXYtPnBtX2RvbWFpbikpCisJCXJldHVybiBOVUxMOworCisJbXV0ZXhfbG9jaygmZ3BkX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShncGQsICZncGRfbGlzdCwgZ3BkX2xpc3Rfbm9kZSkgeworCQlpZiAoJmdwZC0+ZG9tYWluID09IGRldi0+cG1fZG9tYWluKSB7CisJCQlnZW5wZCA9IGdwZDsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZ3BkX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gZ2VucGQ7Cit9CisKKy8qCisgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlcmUgd2UgYXJlIGNlcnRhaW4gdGhhdCB0aGUgcG1fZG9tYWluCisgKiBhdHRhY2hlZCB0byB0aGUgZGV2aWNlIGlzIGEgZ2VucGQgZG9tYWluLgorICovCitzdGF0aWMgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpkZXZfdG9fZ2VucGQoc3RydWN0IGRldmljZSAqZGV2KQogewogCWlmIChJU19FUlJfT1JfTlVMTChkZXYtPnBtX2RvbWFpbikpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMTczLDggKzIwMiw4IEBACiAJZ2VucGQtPnBvd2VyX29uX2xhdGVuY3lfbnMgPSBlbGFwc2VkX25zOwogCWdlbnBkLT5tYXhfb2ZmX3RpbWVfY2hhbmdlZCA9IHRydWU7CiAJZ2VucGRfcmVjYWxjX2NwdV9leGl0X2xhdGVuY3koZ2VucGQpOwotCXByX3dhcm4oIiVzOiBQb3dlci0lcyBsYXRlbmN5IGV4Y2VlZGVkLCBuZXcgdmFsdWUgJWxsZCBuc1xuIiwKLQkJZ2VucGQtPm5hbWUsICJvbiIsIGVsYXBzZWRfbnMpOworCXByX2RlYnVnKCIlczogUG93ZXItJXMgbGF0ZW5jeSBleGNlZWRlZCwgbmV3IHZhbHVlICVsbGQgbnNcbiIsCisJCSBnZW5wZC0+bmFtZSwgIm9uIiwgZWxhcHNlZF9ucyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTk5LDggKzIyOCw4IEBACiAKIAlnZW5wZC0+cG93ZXJfb2ZmX2xhdGVuY3lfbnMgPSBlbGFwc2VkX25zOwogCWdlbnBkLT5tYXhfb2ZmX3RpbWVfY2hhbmdlZCA9IHRydWU7Ci0JcHJfd2FybigiJXM6IFBvd2VyLSVzIGxhdGVuY3kgZXhjZWVkZWQsIG5ldyB2YWx1ZSAlbGxkIG5zXG4iLAotCQlnZW5wZC0+bmFtZSwgIm9mZiIsIGVsYXBzZWRfbnMpOworCXByX2RlYnVnKCIlczogUG93ZXItJXMgbGF0ZW5jeSBleGNlZWRlZCwgbmV3IHZhbHVlICVsbGQgbnNcbiIsCisJCSBnZW5wZC0+bmFtZSwgIm9mZiIsIGVsYXBzZWRfbnMpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE1MTMsOSArMTU0Miw3IEBACiAKIAlkZXZfZGJnKGRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAotCWlmIChJU19FUlJfT1JfTlVMTChnZW5wZCkgfHwgSVNfRVJSX09SX05VTEwoZGV2KQotCSAgICB8fCAgSVNfRVJSX09SX05VTEwoZGV2LT5wbV9kb21haW4pCi0JICAgIHx8ICBwZF90b19nZW5wZChkZXYtPnBtX2RvbWFpbikgIT0gZ2VucGQpCisJaWYgKCFnZW5wZCB8fCBnZW5wZCAhPSBwbV9nZW5wZF9sb29rdXBfZGV2KGRldikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogVGhlIGFib3ZlIHZhbGlkYXRpb24gYWxzbyBtZWFucyB3ZSBoYXZlIGV4aXN0aW5nIGRvbWFpbl9kYXRhLiAqLwpAQCAtMjA5MywyMSArMjEyMCwxMCBAQAogICovCiBzdGF0aWMgdm9pZCBnZW5wZF9kZXZfcG1fZGV0YWNoKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBwb3dlcl9vZmYpCiB7Ci0Jc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwZCA9IE5VTEwsICpncGQ7CisJc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpwZDsKIAlpbnQgcmV0ID0gMDsKIAotCWlmICghZGV2LT5wbV9kb21haW4pCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJmdwZF9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZ3BkLCAmZ3BkX2xpc3QsIGdwZF9saXN0X25vZGUpIHsKLQkJaWYgKCZncGQtPmRvbWFpbiA9PSBkZXYtPnBtX2RvbWFpbikgewotCQkJcGQgPSBncGQ7Ci0JCQlicmVhazsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmdwZF9saXN0X2xvY2spOwotCisJcGQgPSBwbV9nZW5wZF9sb29rdXBfZGV2KGRldik7CiAJaWYgKCFwZCkKIAkJcmV0dXJuOwogCkBAIC0yMTMwLDYgKzIxNDYsMTcgQEAKIAlnZW5wZF9xdWV1ZV9wb3dlcl9vZmZfd29yayhwZCk7CiB9CiAKK3N0YXRpYyB2b2lkIGdlbnBkX2Rldl9wbV9zeW5jKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKnBkOworCisJcGQgPSBkZXZfdG9fZ2VucGQoZGV2KTsKKwlpZiAoSVNfRVJSKHBkKSkKKwkJcmV0dXJuOworCisJZ2VucGRfcXVldWVfcG93ZXJfb2ZmX3dvcmsocGQpOworfQorCiAvKioKICAqIGdlbnBkX2Rldl9wbV9hdHRhY2ggLSBBdHRhY2ggYSBkZXZpY2UgdG8gaXRzIFBNIGRvbWFpbiB1c2luZyBEVC4KICAqIEBkZXY6IERldmljZSB0byBhdHRhY2guCkBAIC0yMTk2LDYgKzIyMjMsNyBAQAogCX0KIAogCWRldi0+cG1fZG9tYWluLT5kZXRhY2ggPSBnZW5wZF9kZXZfcG1fZGV0YWNoOworCWRldi0+cG1fZG9tYWluLT5zeW5jID0gZ2VucGRfZGV2X3BtX3N5bmM7CiAJcG1fZ2VucGRfcG93ZXJvbihwZCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvbWFpbi5jCmluZGV4IDk3MTdkNWYuLjNkODc0ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wb3dlci9tYWluLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL21haW4uYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVzdW1lLXRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG0tdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CkBAIC0xMDE3LDYgKzEwMTcsOSBAQAogCWNoYXIgKmluZm8gPSBOVUxMOwogCWludCBlcnJvciA9IDA7CiAKKwlUUkFDRV9ERVZJQ0UoZGV2KTsKKwlUUkFDRV9TVVNQRU5EKDApOworCiAJaWYgKGFzeW5jX2Vycm9yKQogCQlnb3RvIENvbXBsZXRlOwogCkBAIC0xMDU3LDYgKzEwNjAsNyBAQAogCiBDb21wbGV0ZToKIAljb21wbGV0ZV9hbGwoJmRldi0+cG93ZXIuY29tcGxldGlvbik7CisJVFJBQ0VfU1VTUEVORChlcnJvcik7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xMDc4LDcgKzEwODIsNyBAQAogewogCXJlaW5pdF9jb21wbGV0aW9uKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOwogCi0JaWYgKHBtX2FzeW5jX2VuYWJsZWQgJiYgZGV2LT5wb3dlci5hc3luY19zdXNwZW5kKSB7CisJaWYgKGlzX2FzeW5jKGRldikpIHsKIAkJZ2V0X2RldmljZShkZXYpOwogCQlhc3luY19zY2hlZHVsZShhc3luY19zdXNwZW5kX25vaXJxLCBkZXYpOwogCQlyZXR1cm4gMDsKQEAgLTExNTcsNiArMTE2MSw5IEBACiAJY2hhciAqaW5mbyA9IE5VTEw7CiAJaW50IGVycm9yID0gMDsKIAorCVRSQUNFX0RFVklDRShkZXYpOworCVRSQUNFX1NVU1BFTkQoMCk7CisKIAlfX3BtX3J1bnRpbWVfZGlzYWJsZShkZXYsIGZhbHNlKTsKIAogCWlmIChhc3luY19lcnJvcikKQEAgLTExOTgsNiArMTIwNSw3IEBACiAJCWFzeW5jX2Vycm9yID0gZXJyb3I7CiAKIENvbXBsZXRlOgorCVRSQUNFX1NVU1BFTkQoZXJyb3IpOwogCWNvbXBsZXRlX2FsbCgmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKIAlyZXR1cm4gZXJyb3I7CiB9CkBAIC0xMjE5LDcgKzEyMjcsNyBAQAogewogCXJlaW5pdF9jb21wbGV0aW9uKCZkZXYtPnBvd2VyLmNvbXBsZXRpb24pOwogCi0JaWYgKHBtX2FzeW5jX2VuYWJsZWQgJiYgZGV2LT5wb3dlci5hc3luY19zdXNwZW5kKSB7CisJaWYgKGlzX2FzeW5jKGRldikpIHsKIAkJZ2V0X2RldmljZShkZXYpOwogCQlhc3luY19zY2hlZHVsZShhc3luY19zdXNwZW5kX2xhdGUsIGRldik7CiAJCXJldHVybiAwOwpAQCAtMTMzOCw2ICsxMzQ2LDkgQEAKIAlpbnQgZXJyb3IgPSAwOwogCURFQ0xBUkVfRFBNX1dBVENIRE9HX09OX1NUQUNLKHdkKTsKIAorCVRSQUNFX0RFVklDRShkZXYpOworCVRSQUNFX1NVU1BFTkQoMCk7CisKIAlkcG1fd2FpdF9mb3JfY2hpbGRyZW4oZGV2LCBhc3luYyk7CiAKIAlpZiAoYXN5bmNfZXJyb3IpCkBAIC0xNDQ0LDYgKzE0NTUsNyBAQAogCWlmIChlcnJvcikKIAkJYXN5bmNfZXJyb3IgPSBlcnJvcjsKIAorCVRSQUNFX1NVU1BFTkQoZXJyb3IpOwogCXJldHVybiBlcnJvcjsKIH0KIApAQCAtMTQ2NSw3ICsxNDc3LDcgQEAKIHsKIAlyZWluaXRfY29tcGxldGlvbigmZGV2LT5wb3dlci5jb21wbGV0aW9uKTsKIAotCWlmIChwbV9hc3luY19lbmFibGVkICYmIGRldi0+cG93ZXIuYXN5bmNfc3VzcGVuZCkgeworCWlmIChpc19hc3luYyhkZXYpKSB7CiAJCWdldF9kZXZpY2UoZGV2KTsKIAkJYXN5bmNfc2NoZWR1bGUoYXN5bmNfc3VzcGVuZCwgZGV2KTsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci90cmFjZS5jCmluZGV4IGQ5NGExZjUxLi5hMzExY2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYworKysgYi9kcml2ZXJzL2Jhc2UvcG93ZXIvdHJhY2UuYwpAQCAtNyw3ICs3LDcgQEAKICAqIGRldmljZXMgbWF5IGJlIHdvcmtpbmcuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3Jlc3VtZS10cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLXRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcnRjLmg+CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogICogaXQncyBub3QgYW55IGd1YXJhbnRlZSwgYnV0IGl0J3MgYSBoaWdoIF9saWtlbGlob29kXyB0aGF0CiAgKiB0aGUgbWF0Y2ggaXMgdmFsaWQpLgogICovCi12b2lkIGdlbmVyYXRlX3Jlc3VtZV90cmFjZShjb25zdCB2b2lkICp0cmFjZWRhdGEsIHVuc2lnbmVkIGludCB1c2VyKQordm9pZCBnZW5lcmF0ZV9wbV90cmFjZShjb25zdCB2b2lkICp0cmFjZWRhdGEsIHVuc2lnbmVkIGludCB1c2VyKQogewogCXVuc2lnbmVkIHNob3J0IGxpbmVubyA9ICoodW5zaWduZWQgc2hvcnQgKil0cmFjZWRhdGE7CiAJY29uc3QgY2hhciAqZmlsZSA9ICooY29uc3QgY2hhciAqKikodHJhY2VkYXRhICsgMik7CkBAIC0xNjQsNyArMTY0LDcgQEAKIAlmaWxlX2hhc2hfdmFsdWUgPSBoYXNoX3N0cmluZyhsaW5lbm8sIGZpbGUsIEZJTEVIQVNIKTsKIAlzZXRfbWFnaWNfdGltZSh1c2VyX2hhc2hfdmFsdWUsIGZpbGVfaGFzaF92YWx1ZSwgZGV2X2hhc2hfdmFsdWUpOwogfQotRVhQT1JUX1NZTUJPTChnZW5lcmF0ZV9yZXN1bWVfdHJhY2UpOworRVhQT1JUX1NZTUJPTChnZW5lcmF0ZV9wbV90cmFjZSk7CiAKIGV4dGVybiBjaGFyIF9fdHJhY2VkYXRhX3N0YXJ0LCBfX3RyYWNlZGF0YV9lbmQ7CiBzdGF0aWMgaW50IHNob3dfZmlsZV9oYXNoKHVuc2lnbmVkIGludCB2YWx1ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYyBiL2RyaXZlcnMvYmFzZS9wb3dlci93YWtldXAuYwppbmRleCBhYWI3MTU4Li43NzI2MjAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcG93ZXIvd2FrZXVwLmMKKysrIGIvZHJpdmVycy9iYXNlL3Bvd2VyL3dha2V1cC5jCkBAIC04NDMsNyArODQzLDYgQEAKIAl1bnNpZ25lZCBsb25nIGFjdGl2ZV9jb3VudDsKIAlrdGltZV90IGFjdGl2ZV90aW1lOwogCWt0aW1lX3QgcHJldmVudF9zbGVlcF90aW1lOwotCWludCByZXQ7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd3MtPmxvY2ssIGZsYWdzKTsKIApAQCAtODY2LDE3ICs4NjUsMTYgQEAKIAkJYWN0aXZlX3RpbWUgPSBrdGltZV9zZXQoMCwgMCk7CiAJfQogCi0JcmV0ID0gc2VxX3ByaW50ZihtLCAiJS0xMnNcdCVsdVx0XHQlbHVcdFx0JWx1XHRcdCVsdVx0XHQiCi0JCQkiJWxsZFx0XHQlbGxkXHRcdCVsbGRcdFx0JWxsZFx0XHQlbGxkXG4iLAotCQkJd3MtPm5hbWUsIGFjdGl2ZV9jb3VudCwgd3MtPmV2ZW50X2NvdW50LAotCQkJd3MtPndha2V1cF9jb3VudCwgd3MtPmV4cGlyZV9jb3VudCwKLQkJCWt0aW1lX3RvX21zKGFjdGl2ZV90aW1lKSwga3RpbWVfdG9fbXModG90YWxfdGltZSksCi0JCQlrdGltZV90b19tcyhtYXhfdGltZSksIGt0aW1lX3RvX21zKHdzLT5sYXN0X3RpbWUpLAotCQkJa3RpbWVfdG9fbXMocHJldmVudF9zbGVlcF90aW1lKSk7CisJc2VxX3ByaW50ZihtLCAiJS0xMnNcdCVsdVx0XHQlbHVcdFx0JWx1XHRcdCVsdVx0XHQlbGxkXHRcdCVsbGRcdFx0JWxsZFx0XHQlbGxkXHRcdCVsbGRcbiIsCisJCSAgIHdzLT5uYW1lLCBhY3RpdmVfY291bnQsIHdzLT5ldmVudF9jb3VudCwKKwkJICAgd3MtPndha2V1cF9jb3VudCwgd3MtPmV4cGlyZV9jb3VudCwKKwkJICAga3RpbWVfdG9fbXMoYWN0aXZlX3RpbWUpLCBrdGltZV90b19tcyh0b3RhbF90aW1lKSwKKwkJICAga3RpbWVfdG9fbXMobWF4X3RpbWUpLCBrdGltZV90b19tcyh3cy0+bGFzdF90aW1lKSwKKwkJICAga3RpbWVfdG9fbXMocHJldmVudF9zbGVlcF90aW1lKSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cy0+bG9jaywgZmxhZ3MpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcHJvcGVydHkuYyBiL2RyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jCmluZGV4IGM0NTg0NTguLjFkMGIxMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jCisrKyBiL2RyaXZlcnMvYmFzZS9wcm9wZXJ0eS5jCkBAIC0xMCwxMCArMTAsMTAyIEBACiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvcHJvcGVydHkuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9wZXJ0eS5oPgorCisvKioKKyAqIGRldmljZV9hZGRfcHJvcGVydHlfc2V0IC0gQWRkIGEgY29sbGVjdGlvbiBvZiBwcm9wZXJ0aWVzIHRvIGEgZGV2aWNlIG9iamVjdC4KKyAqIEBkZXY6IERldmljZSB0byBhZGQgcHJvcGVydGllcyB0by4KKyAqIEBwc2V0OiBDb2xsZWN0aW9uIG9mIHByb3BlcnRpZXMgdG8gYWRkLgorICoKKyAqIEFzc29jaWF0ZSBhIGNvbGxlY3Rpb24gb2YgZGV2aWNlIHByb3BlcnRpZXMgcmVwcmVzZW50ZWQgYnkgQHBzZXQgd2l0aCBAZGV2CisgKiBhcyBpdHMgc2Vjb25kYXJ5IGZpcm13YXJlIG5vZGUuCisgKi8KK3ZvaWQgZGV2aWNlX2FkZF9wcm9wZXJ0eV9zZXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcHJvcGVydHlfc2V0ICpwc2V0KQoreworCWlmIChwc2V0KQorCQlwc2V0LT5md25vZGUudHlwZSA9IEZXTk9ERV9QREFUQTsKKworCXNldF9zZWNvbmRhcnlfZndub2RlKGRldiwgJnBzZXQtPmZ3bm9kZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfYWRkX3Byb3BlcnR5X3NldCk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19wc2V0KHN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGUpCit7CisJcmV0dXJuIGZ3bm9kZSAmJiBmd25vZGUtPnR5cGUgPT0gRldOT0RFX1BEQVRBOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwcm9wZXJ0eV9zZXQgKnRvX3BzZXQoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSkKK3sKKwlyZXR1cm4gaXNfcHNldChmd25vZGUpID8KKwkJY29udGFpbmVyX29mKGZ3bm9kZSwgc3RydWN0IHByb3BlcnR5X3NldCwgZndub2RlKSA6IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvcGVydHlfZW50cnkgKnBzZXRfcHJvcF9nZXQoc3RydWN0IHByb3BlcnR5X3NldCAqcHNldCwKKwkJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHByb3BlcnR5X2VudHJ5ICpwcm9wOworCisJaWYgKCFwc2V0IHx8ICFwc2V0LT5wcm9wZXJ0aWVzKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAocHJvcCA9IHBzZXQtPnByb3BlcnRpZXM7IHByb3AtPm5hbWU7IHByb3ArKykKKwkJaWYgKCFzdHJjbXAobmFtZSwgcHJvcC0+bmFtZSkpCisJCQlyZXR1cm4gcHJvcDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHBzZXRfcHJvcF9yZWFkX2FycmF5KHN0cnVjdCBwcm9wZXJ0eV9zZXQgKnBzZXQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJZW51bSBkZXZfcHJvcF90eXBlIHR5cGUsIHZvaWQgKnZhbCwgc2l6ZV90IG52YWwpCit7CisJc3RydWN0IHByb3BlcnR5X2VudHJ5ICpwcm9wOworCXVuc2lnbmVkIGludCBpdGVtX3NpemU7CisKKwlwcm9wID0gcHNldF9wcm9wX2dldChwc2V0LCBuYW1lKTsKKwlpZiAoIXByb3ApCisJCXJldHVybiAtRU5PREFUQTsKKworCWlmIChwcm9wLT50eXBlICE9IHR5cGUpCisJCXJldHVybiAtRVBST1RPOworCisJaWYgKCF2YWwpCisJCXJldHVybiBwcm9wLT5udmFsOworCisJaWYgKHByb3AtPm52YWwgPCBudmFsKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgREVWX1BST1BfVTg6CisJCWl0ZW1fc2l6ZSA9IHNpemVvZih1OCk7CisJCWJyZWFrOworCWNhc2UgREVWX1BST1BfVTE2OgorCQlpdGVtX3NpemUgPSBzaXplb2YodTE2KTsKKwkJYnJlYWs7CisJY2FzZSBERVZfUFJPUF9VMzI6CisJCWl0ZW1fc2l6ZSA9IHNpemVvZih1MzIpOworCQlicmVhazsKKwljYXNlIERFVl9QUk9QX1U2NDoKKwkJaXRlbV9zaXplID0gc2l6ZW9mKHU2NCk7CisJCWJyZWFrOworCWNhc2UgREVWX1BST1BfU1RSSU5HOgorCQlpdGVtX3NpemUgPSBzaXplb2YoY29uc3QgY2hhciAqKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lbWNweSh2YWwsIHByb3AtPnZhbHVlLnJhd19kYXRhLCBudmFsICogaXRlbV9zaXplKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZGV2X2Z3bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIElTX0VOQUJMRUQoQ09ORklHX09GKSAmJiBkZXYtPm9mX25vZGUgPworCQkmZGV2LT5vZl9ub2RlLT5md25vZGUgOiBkZXYtPmZ3bm9kZTsKK30KIAogLyoqCiAgKiBkZXZpY2VfcHJvcGVydHlfcHJlc2VudCAtIGNoZWNrIGlmIGEgcHJvcGVydHkgb2YgYSBkZXZpY2UgaXMgcHJlc2VudApAQCAtMjQsMTAgKzExNiw3IEBACiAgKi8KIGJvb2wgZGV2aWNlX3Byb3BlcnR5X3ByZXNlbnQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpwcm9wbmFtZSkKIHsKLQlpZiAoSVNfRU5BQkxFRChDT05GSUdfT0YpICYmIGRldi0+b2Zfbm9kZSkKLQkJcmV0dXJuIG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsIHByb3BuYW1lKTsKLQotCXJldHVybiAhYWNwaV9kZXZfcHJvcF9nZXQoQUNQSV9DT01QQU5JT04oZGV2KSwgcHJvcG5hbWUsIE5VTEwpOworCXJldHVybiBmd25vZGVfcHJvcGVydHlfcHJlc2VudChkZXZfZndub2RlKGRldiksIHByb3BuYW1lKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGRldmljZV9wcm9wZXJ0eV9wcmVzZW50KTsKIApAQCAtNDMsMzIgKzEzMiwyMiBAQAogCWVsc2UgaWYgKGlzX2FjcGlfbm9kZShmd25vZGUpKQogCQlyZXR1cm4gIWFjcGlfZGV2X3Byb3BfZ2V0KGFjcGlfbm9kZShmd25vZGUpLCBwcm9wbmFtZSwgTlVMTCk7CiAKLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuICEhcHNldF9wcm9wX2dldCh0b19wc2V0KGZ3bm9kZSksIHByb3BuYW1lKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGZ3bm9kZV9wcm9wZXJ0eV9wcmVzZW50KTsKIAotI2RlZmluZSBPRl9ERVZfUFJPUF9SRUFEX0FSUkFZKG5vZGUsIHByb3BuYW1lLCB0eXBlLCB2YWwsIG52YWwpIFwKLQkodmFsKSA/IG9mX3Byb3BlcnR5X3JlYWRfIyN0eXBlIyNfYXJyYXkoKG5vZGUpLCAocHJvcG5hbWUpLCAodmFsKSwgKG52YWwpKSBcCi0JICAgICAgOiBvZl9wcm9wZXJ0eV9jb3VudF9lbGVtc19vZl9zaXplKChub2RlKSwgKHByb3BuYW1lKSwgc2l6ZW9mKHR5cGUpKQotCi0jZGVmaW5lIERFVl9QUk9QX1JFQURfQVJSQVkoX2Rldl8sIF9wcm9wbmFtZV8sIF90eXBlXywgX3Byb3B0eXBlXywgX3ZhbF8sIF9udmFsXykgXAotCUlTX0VOQUJMRUQoQ09ORklHX09GKSAmJiBfZGV2Xy0+b2Zfbm9kZSA/IFwKLQkJKE9GX0RFVl9QUk9QX1JFQURfQVJSQVkoX2Rldl8tPm9mX25vZGUsIF9wcm9wbmFtZV8sIF90eXBlXywgXAotCQkJCQlfdmFsXywgX252YWxfKSkgOiBcCi0JCWFjcGlfZGV2X3Byb3BfcmVhZChBQ1BJX0NPTVBBTklPTihfZGV2XyksIF9wcm9wbmFtZV8sIFwKLQkJCQkgICBfcHJvcHR5cGVfLCBfdmFsXywgX252YWxfKQotCiAvKioKICAqIGRldmljZV9wcm9wZXJ0eV9yZWFkX3U4X2FycmF5IC0gcmV0dXJuIGEgdTggYXJyYXkgcHJvcGVydHkgb2YgYSBkZXZpY2UKICAqIEBkZXY6IERldmljZSB0byBnZXQgdGhlIHByb3BlcnR5IG9mCiAgKiBAcHJvcG5hbWU6IE5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gKiBAdmFsOiBUaGUgdmFsdWVzIGFyZSBzdG9yZWQgaGVyZQorICogQHZhbDogVGhlIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUgb3IgJU5VTEwgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsdWVzCiAgKiBAbnZhbDogU2l6ZSBvZiB0aGUgQHZhbCBhcnJheQogICoKICAqIEZ1bmN0aW9uIHJlYWRzIGFuIGFycmF5IG9mIHU4IHByb3BlcnRpZXMgd2l0aCBAcHJvcG5hbWUgZnJvbSB0aGUgZGV2aWNlCiAgKiBmaXJtd2FyZSBkZXNjcmlwdGlvbiBhbmQgc3RvcmVzIHRoZW0gdG8gQHZhbCBpZiBmb3VuZC4KICAqCi0gKiBSZXR1cm46ICUwIGlmIHRoZSBwcm9wZXJ0eSB3YXMgZm91bmQgKHN1Y2Nlc3MpLAorICogUmV0dXJuOiBudW1iZXIgb2YgdmFsdWVzIGlmIEB2YWwgd2FzICVOVUxMLAorICogICAgICAgICAlMCBpZiB0aGUgcHJvcGVydHkgd2FzIGZvdW5kIChzdWNjZXNzKSwKICAqCSAgICUtRUlOVkFMIGlmIGdpdmVuIGFyZ3VtZW50cyBhcmUgbm90IHZhbGlkLAogICoJICAgJS1FTk9EQVRBIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsCiAgKgkgICAlLUVQUk9UTyBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGFuIGFycmF5IG9mIG51bWJlcnMsCkBAIC03Nyw3ICsxNTYsNyBAQAogaW50IGRldmljZV9wcm9wZXJ0eV9yZWFkX3U4X2FycmF5KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCQkJICB1OCAqdmFsLCBzaXplX3QgbnZhbCkKIHsKLQlyZXR1cm4gREVWX1BST1BfUkVBRF9BUlJBWShkZXYsIHByb3BuYW1lLCB1OCwgREVWX1BST1BfVTgsIHZhbCwgbnZhbCk7CisJcmV0dXJuIGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3U4X2FycmF5KGRldl9md25vZGUoZGV2KSwgcHJvcG5hbWUsIHZhbCwgbnZhbCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkZXZpY2VfcHJvcGVydHlfcmVhZF91OF9hcnJheSk7CiAKQEAgLTg1LDEzICsxNjQsMTQgQEAKICAqIGRldmljZV9wcm9wZXJ0eV9yZWFkX3UxNl9hcnJheSAtIHJldHVybiBhIHUxNiBhcnJheSBwcm9wZXJ0eSBvZiBhIGRldmljZQogICogQGRldjogRGV2aWNlIHRvIGdldCB0aGUgcHJvcGVydHkgb2YKICAqIEBwcm9wbmFtZTogTmFtZSBvZiB0aGUgcHJvcGVydHkKLSAqIEB2YWw6IFRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBoZXJlCisgKiBAdmFsOiBUaGUgdmFsdWVzIGFyZSBzdG9yZWQgaGVyZSBvciAlTlVMTCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB2YWx1ZXMKICAqIEBudmFsOiBTaXplIG9mIHRoZSBAdmFsIGFycmF5CiAgKgogICogRnVuY3Rpb24gcmVhZHMgYW4gYXJyYXkgb2YgdTE2IHByb3BlcnRpZXMgd2l0aCBAcHJvcG5hbWUgZnJvbSB0aGUgZGV2aWNlCiAgKiBmaXJtd2FyZSBkZXNjcmlwdGlvbiBhbmQgc3RvcmVzIHRoZW0gdG8gQHZhbCBpZiBmb3VuZC4KICAqCi0gKiBSZXR1cm46ICUwIGlmIHRoZSBwcm9wZXJ0eSB3YXMgZm91bmQgKHN1Y2Nlc3MpLAorICogUmV0dXJuOiBudW1iZXIgb2YgdmFsdWVzIGlmIEB2YWwgd2FzICVOVUxMLAorICogICAgICAgICAlMCBpZiB0aGUgcHJvcGVydHkgd2FzIGZvdW5kIChzdWNjZXNzKSwKICAqCSAgICUtRUlOVkFMIGlmIGdpdmVuIGFyZ3VtZW50cyBhcmUgbm90IHZhbGlkLAogICoJICAgJS1FTk9EQVRBIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsCiAgKgkgICAlLUVQUk9UTyBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGFuIGFycmF5IG9mIG51bWJlcnMsCkBAIC0xMDAsNyArMTgwLDcgQEAKIGludCBkZXZpY2VfcHJvcGVydHlfcmVhZF91MTZfYXJyYXkoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpwcm9wbmFtZSwKIAkJCQkgICB1MTYgKnZhbCwgc2l6ZV90IG52YWwpCiB7Ci0JcmV0dXJuIERFVl9QUk9QX1JFQURfQVJSQVkoZGV2LCBwcm9wbmFtZSwgdTE2LCBERVZfUFJPUF9VMTYsIHZhbCwgbnZhbCk7CisJcmV0dXJuIGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UxNl9hcnJheShkZXZfZndub2RlKGRldiksIHByb3BuYW1lLCB2YWwsIG52YWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTE2X2FycmF5KTsKIApAQCAtMTA4LDEzICsxODgsMTQgQEAKICAqIGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheSAtIHJldHVybiBhIHUzMiBhcnJheSBwcm9wZXJ0eSBvZiBhIGRldmljZQogICogQGRldjogRGV2aWNlIHRvIGdldCB0aGUgcHJvcGVydHkgb2YKICAqIEBwcm9wbmFtZTogTmFtZSBvZiB0aGUgcHJvcGVydHkKLSAqIEB2YWw6IFRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBoZXJlCisgKiBAdmFsOiBUaGUgdmFsdWVzIGFyZSBzdG9yZWQgaGVyZSBvciAlTlVMTCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB2YWx1ZXMKICAqIEBudmFsOiBTaXplIG9mIHRoZSBAdmFsIGFycmF5CiAgKgogICogRnVuY3Rpb24gcmVhZHMgYW4gYXJyYXkgb2YgdTMyIHByb3BlcnRpZXMgd2l0aCBAcHJvcG5hbWUgZnJvbSB0aGUgZGV2aWNlCiAgKiBmaXJtd2FyZSBkZXNjcmlwdGlvbiBhbmQgc3RvcmVzIHRoZW0gdG8gQHZhbCBpZiBmb3VuZC4KICAqCi0gKiBSZXR1cm46ICUwIGlmIHRoZSBwcm9wZXJ0eSB3YXMgZm91bmQgKHN1Y2Nlc3MpLAorICogUmV0dXJuOiBudW1iZXIgb2YgdmFsdWVzIGlmIEB2YWwgd2FzICVOVUxMLAorICogICAgICAgICAlMCBpZiB0aGUgcHJvcGVydHkgd2FzIGZvdW5kIChzdWNjZXNzKSwKICAqCSAgICUtRUlOVkFMIGlmIGdpdmVuIGFyZ3VtZW50cyBhcmUgbm90IHZhbGlkLAogICoJICAgJS1FTk9EQVRBIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsCiAgKgkgICAlLUVQUk9UTyBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGFuIGFycmF5IG9mIG51bWJlcnMsCkBAIC0xMjMsNyArMjA0LDcgQEAKIGludCBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpwcm9wbmFtZSwKIAkJCQkgICB1MzIgKnZhbCwgc2l6ZV90IG52YWwpCiB7Ci0JcmV0dXJuIERFVl9QUk9QX1JFQURfQVJSQVkoZGV2LCBwcm9wbmFtZSwgdTMyLCBERVZfUFJPUF9VMzIsIHZhbCwgbnZhbCk7CisJcmV0dXJuIGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShkZXZfZndub2RlKGRldiksIHByb3BuYW1lLCB2YWwsIG52YWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KTsKIApAQCAtMTMxLDEzICsyMTIsMTQgQEAKICAqIGRldmljZV9wcm9wZXJ0eV9yZWFkX3U2NF9hcnJheSAtIHJldHVybiBhIHU2NCBhcnJheSBwcm9wZXJ0eSBvZiBhIGRldmljZQogICogQGRldjogRGV2aWNlIHRvIGdldCB0aGUgcHJvcGVydHkgb2YKICAqIEBwcm9wbmFtZTogTmFtZSBvZiB0aGUgcHJvcGVydHkKLSAqIEB2YWw6IFRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBoZXJlCisgKiBAdmFsOiBUaGUgdmFsdWVzIGFyZSBzdG9yZWQgaGVyZSBvciAlTlVMTCB0byByZXR1cm4gdGhlIG51bWJlciBvZiB2YWx1ZXMKICAqIEBudmFsOiBTaXplIG9mIHRoZSBAdmFsIGFycmF5CiAgKgogICogRnVuY3Rpb24gcmVhZHMgYW4gYXJyYXkgb2YgdTY0IHByb3BlcnRpZXMgd2l0aCBAcHJvcG5hbWUgZnJvbSB0aGUgZGV2aWNlCiAgKiBmaXJtd2FyZSBkZXNjcmlwdGlvbiBhbmQgc3RvcmVzIHRoZW0gdG8gQHZhbCBpZiBmb3VuZC4KICAqCi0gKiBSZXR1cm46ICUwIGlmIHRoZSBwcm9wZXJ0eSB3YXMgZm91bmQgKHN1Y2Nlc3MpLAorICogUmV0dXJuOiBudW1iZXIgb2YgdmFsdWVzIGlmIEB2YWwgd2FzICVOVUxMLAorICogICAgICAgICAlMCBpZiB0aGUgcHJvcGVydHkgd2FzIGZvdW5kIChzdWNjZXNzKSwKICAqCSAgICUtRUlOVkFMIGlmIGdpdmVuIGFyZ3VtZW50cyBhcmUgbm90IHZhbGlkLAogICoJICAgJS1FTk9EQVRBIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsCiAgKgkgICAlLUVQUk9UTyBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGFuIGFycmF5IG9mIG51bWJlcnMsCkBAIC0xNDYsNyArMjI4LDcgQEAKIGludCBkZXZpY2VfcHJvcGVydHlfcmVhZF91NjRfYXJyYXkoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpwcm9wbmFtZSwKIAkJCQkgICB1NjQgKnZhbCwgc2l6ZV90IG52YWwpCiB7Ci0JcmV0dXJuIERFVl9QUk9QX1JFQURfQVJSQVkoZGV2LCBwcm9wbmFtZSwgdTY0LCBERVZfUFJPUF9VNjQsIHZhbCwgbnZhbCk7CisJcmV0dXJuIGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3U2NF9hcnJheShkZXZfZndub2RlKGRldiksIHByb3BuYW1lLCB2YWwsIG52YWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTY0X2FycmF5KTsKIApAQCAtMTU0LDEzICsyMzYsMTQgQEAKICAqIGRldmljZV9wcm9wZXJ0eV9yZWFkX3N0cmluZ19hcnJheSAtIHJldHVybiBhIHN0cmluZyBhcnJheSBwcm9wZXJ0eSBvZiBkZXZpY2UKICAqIEBkZXY6IERldmljZSB0byBnZXQgdGhlIHByb3BlcnR5IG9mCiAgKiBAcHJvcG5hbWU6IE5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gKiBAdmFsOiBUaGUgdmFsdWVzIGFyZSBzdG9yZWQgaGVyZQorICogQHZhbDogVGhlIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUgb3IgJU5VTEwgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsdWVzCiAgKiBAbnZhbDogU2l6ZSBvZiB0aGUgQHZhbCBhcnJheQogICoKICAqIEZ1bmN0aW9uIHJlYWRzIGFuIGFycmF5IG9mIHN0cmluZyBwcm9wZXJ0aWVzIHdpdGggQHByb3BuYW1lIGZyb20gdGhlIGRldmljZQogICogZmlybXdhcmUgZGVzY3JpcHRpb24gYW5kIHN0b3JlcyB0aGVtIHRvIEB2YWwgaWYgZm91bmQuCiAgKgotICogUmV0dXJuOiAlMCBpZiB0aGUgcHJvcGVydHkgd2FzIGZvdW5kIChzdWNjZXNzKSwKKyAqIFJldHVybjogbnVtYmVyIG9mIHZhbHVlcyBpZiBAdmFsIHdhcyAlTlVMTCwKKyAqICAgICAgICAgJTAgaWYgdGhlIHByb3BlcnR5IHdhcyBmb3VuZCAoc3VjY2VzcyksCiAgKgkgICAlLUVJTlZBTCBpZiBnaXZlbiBhcmd1bWVudHMgYXJlIG5vdCB2YWxpZCwKICAqCSAgICUtRU5PREFUQSBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLAogICoJICAgJS1FUFJPVE8gb3IgJS1FSUxTRVEgaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBhbiBhcnJheSBvZiBzdHJpbmdzLApAQCAtMTY5LDEwICsyNTIsNyBAQAogaW50IGRldmljZV9wcm9wZXJ0eV9yZWFkX3N0cmluZ19hcnJheShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKnByb3BuYW1lLAogCQkJCSAgICAgIGNvbnN0IGNoYXIgKip2YWwsIHNpemVfdCBudmFsKQogewotCXJldHVybiBJU19FTkFCTEVEKENPTkZJR19PRikgJiYgZGV2LT5vZl9ub2RlID8KLQkJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfYXJyYXkoZGV2LT5vZl9ub2RlLCBwcm9wbmFtZSwgdmFsLCBudmFsKSA6Ci0JCWFjcGlfZGV2X3Byb3BfcmVhZChBQ1BJX0NPTVBBTklPTihkZXYpLCBwcm9wbmFtZSwKLQkJCQkgICBERVZfUFJPUF9TVFJJTkcsIHZhbCwgbnZhbCk7CisJcmV0dXJuIGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3N0cmluZ19hcnJheShkZXZfZndub2RlKGRldiksIHByb3BuYW1lLCB2YWwsIG52YWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3Byb3BlcnR5X3JlYWRfc3RyaW5nX2FycmF5KTsKIApAQCAtMTkzLDEzICsyNzMsMTQgQEAKIGludCBkZXZpY2VfcHJvcGVydHlfcmVhZF9zdHJpbmcoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpwcm9wbmFtZSwKIAkJCQljb25zdCBjaGFyICoqdmFsKQogewotCXJldHVybiBJU19FTkFCTEVEKENPTkZJR19PRikgJiYgZGV2LT5vZl9ub2RlID8KLQkJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoZGV2LT5vZl9ub2RlLCBwcm9wbmFtZSwgdmFsKSA6Ci0JCWFjcGlfZGV2X3Byb3BfcmVhZChBQ1BJX0NPTVBBTklPTihkZXYpLCBwcm9wbmFtZSwKLQkJCQkgICBERVZfUFJPUF9TVFJJTkcsIHZhbCwgMSk7CisJcmV0dXJuIGZ3bm9kZV9wcm9wZXJ0eV9yZWFkX3N0cmluZyhkZXZfZndub2RlKGRldiksIHByb3BuYW1lLCB2YWwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZGV2aWNlX3Byb3BlcnR5X3JlYWRfc3RyaW5nKTsKIAorI2RlZmluZSBPRl9ERVZfUFJPUF9SRUFEX0FSUkFZKG5vZGUsIHByb3BuYW1lLCB0eXBlLCB2YWwsIG52YWwpIFwKKwkodmFsKSA/IG9mX3Byb3BlcnR5X3JlYWRfIyN0eXBlIyNfYXJyYXkoKG5vZGUpLCAocHJvcG5hbWUpLCAodmFsKSwgKG52YWwpKSBcCisJICAgICAgOiBvZl9wcm9wZXJ0eV9jb3VudF9lbGVtc19vZl9zaXplKChub2RlKSwgKHByb3BuYW1lKSwgc2l6ZW9mKHR5cGUpKQorCiAjZGVmaW5lIEZXTk9ERV9QUk9QX1JFQURfQVJSQVkoX2Z3bm9kZV8sIF9wcm9wbmFtZV8sIF90eXBlXywgX3Byb3B0eXBlXywgX3ZhbF8sIF9udmFsXykgXAogKHsgXAogCWludCBfcmV0XzsgXApAQCAtMjEwLDcgKzI5MSw4IEBACiAJCV9yZXRfID0gYWNwaV9kZXZfcHJvcF9yZWFkKGFjcGlfbm9kZShfZndub2RlXyksIF9wcm9wbmFtZV8sIFwKIAkJCQkJICAgX3Byb3B0eXBlXywgX3ZhbF8sIF9udmFsXyk7IFwKIAllbHNlIFwKLQkJX3JldF8gPSAtRU5YSU87IFwKKwkJX3JldF8gPSBwc2V0X3Byb3BfcmVhZF9hcnJheSh0b19wc2V0KF9md25vZGVfKSwgX3Byb3BuYW1lXywgXAorCQkJCQkgICAgIF9wcm9wdHlwZV8sIF92YWxfLCBfbnZhbF8pOyBcCiAJX3JldF87IFwKIH0pCiAKQEAgLTIxOCwxMyArMzAwLDE0IEBACiAgKiBmd25vZGVfcHJvcGVydHlfcmVhZF91OF9hcnJheSAtIHJldHVybiBhIHU4IGFycmF5IHByb3BlcnR5IG9mIGZpcm13YXJlIG5vZGUKICAqIEBmd25vZGU6IEZpcm13YXJlIG5vZGUgdG8gZ2V0IHRoZSBwcm9wZXJ0eSBvZgogICogQHByb3BuYW1lOiBOYW1lIG9mIHRoZSBwcm9wZXJ0eQotICogQHZhbDogVGhlIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUKKyAqIEB2YWw6IFRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBoZXJlIG9yICVOVUxMIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlcwogICogQG52YWw6IFNpemUgb2YgdGhlIEB2YWwgYXJyYXkKICAqCiAgKiBSZWFkIGFuIGFycmF5IG9mIHU4IHByb3BlcnRpZXMgd2l0aCBAcHJvcG5hbWUgZnJvbSBAZndub2RlIGFuZCBzdG9yZXMgdGhlbSB0bwogICogQHZhbCBpZiBmb3VuZC4KICAqCi0gKiBSZXR1cm46ICUwIGlmIHRoZSBwcm9wZXJ0eSB3YXMgZm91bmQgKHN1Y2Nlc3MpLAorICogUmV0dXJuOiBudW1iZXIgb2YgdmFsdWVzIGlmIEB2YWwgd2FzICVOVUxMLAorICogICAgICAgICAlMCBpZiB0aGUgcHJvcGVydHkgd2FzIGZvdW5kIChzdWNjZXNzKSwKICAqCSAgICUtRUlOVkFMIGlmIGdpdmVuIGFyZ3VtZW50cyBhcmUgbm90IHZhbGlkLAogICoJICAgJS1FTk9EQVRBIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsCiAgKgkgICAlLUVQUk9UTyBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGFuIGFycmF5IG9mIG51bWJlcnMsCkBAIC0yNDMsMTMgKzMyNiwxNCBAQAogICogZndub2RlX3Byb3BlcnR5X3JlYWRfdTE2X2FycmF5IC0gcmV0dXJuIGEgdTE2IGFycmF5IHByb3BlcnR5IG9mIGZpcm13YXJlIG5vZGUKICAqIEBmd25vZGU6IEZpcm13YXJlIG5vZGUgdG8gZ2V0IHRoZSBwcm9wZXJ0eSBvZgogICogQHByb3BuYW1lOiBOYW1lIG9mIHRoZSBwcm9wZXJ0eQotICogQHZhbDogVGhlIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUKKyAqIEB2YWw6IFRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBoZXJlIG9yICVOVUxMIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlcwogICogQG52YWw6IFNpemUgb2YgdGhlIEB2YWwgYXJyYXkKICAqCiAgKiBSZWFkIGFuIGFycmF5IG9mIHUxNiBwcm9wZXJ0aWVzIHdpdGggQHByb3BuYW1lIGZyb20gQGZ3bm9kZSBhbmQgc3RvcmUgdGhlbSB0bwogICogQHZhbCBpZiBmb3VuZC4KICAqCi0gKiBSZXR1cm46ICUwIGlmIHRoZSBwcm9wZXJ0eSB3YXMgZm91bmQgKHN1Y2Nlc3MpLAorICogUmV0dXJuOiBudW1iZXIgb2YgdmFsdWVzIGlmIEB2YWwgd2FzICVOVUxMLAorICogICAgICAgICAlMCBpZiB0aGUgcHJvcGVydHkgd2FzIGZvdW5kIChzdWNjZXNzKSwKICAqCSAgICUtRUlOVkFMIGlmIGdpdmVuIGFyZ3VtZW50cyBhcmUgbm90IHZhbGlkLAogICoJICAgJS1FTk9EQVRBIGlmIHRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBoYXZlIGEgdmFsdWUsCiAgKgkgICAlLUVQUk9UTyBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGFuIGFycmF5IG9mIG51bWJlcnMsCkBAIC0yNjgsMTMgKzM1MiwxNCBAQAogICogZndub2RlX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5IC0gcmV0dXJuIGEgdTMyIGFycmF5IHByb3BlcnR5IG9mIGZpcm13YXJlIG5vZGUKICAqIEBmd25vZGU6IEZpcm13YXJlIG5vZGUgdG8gZ2V0IHRoZSBwcm9wZXJ0eSBvZgogICogQHByb3BuYW1lOiBOYW1lIG9mIHRoZSBwcm9wZXJ0eQotICogQHZhbDogVGhlIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUKKyAqIEB2YWw6IFRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBoZXJlIG9yICVOVUxMIHRvIHJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlcwogICogQG52YWw6IFNpemUgb2YgdGhlIEB2YWwgYXJyYXkKICAqCiAgKiBSZWFkIGFuIGFycmF5IG9mIHUzMiBwcm9wZXJ0aWVzIHdpdGggQHByb3BuYW1lIGZyb20gQGZ3bm9kZSBzdG9yZSB0aGVtIHRvCiAgKiBAdmFsIGlmIGZvdW5kLgogICoKLSAqIFJldHVybjogJTAgaWYgdGhlIHByb3BlcnR5IHdhcyBmb3VuZCAoc3VjY2VzcyksCisgKiBSZXR1cm46IG51bWJlciBvZiB2YWx1ZXMgaWYgQHZhbCB3YXMgJU5VTEwsCisgKiAgICAgICAgICUwIGlmIHRoZSBwcm9wZXJ0eSB3YXMgZm91bmQgKHN1Y2Nlc3MpLAogICoJICAgJS1FSU5WQUwgaWYgZ2l2ZW4gYXJndW1lbnRzIGFyZSBub3QgdmFsaWQsCiAgKgkgICAlLUVOT0RBVEEgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwKICAqCSAgICUtRVBST1RPIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgYW4gYXJyYXkgb2YgbnVtYmVycywKQEAgLTI5MywxMyArMzc4LDE0IEBACiAgKiBmd25vZGVfcHJvcGVydHlfcmVhZF91NjRfYXJyYXkgLSByZXR1cm4gYSB1NjQgYXJyYXkgcHJvcGVydHkgZmlybXdhcmUgbm9kZQogICogQGZ3bm9kZTogRmlybXdhcmUgbm9kZSB0byBnZXQgdGhlIHByb3BlcnR5IG9mCiAgKiBAcHJvcG5hbWU6IE5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gKiBAdmFsOiBUaGUgdmFsdWVzIGFyZSBzdG9yZWQgaGVyZQorICogQHZhbDogVGhlIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUgb3IgJU5VTEwgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsdWVzCiAgKiBAbnZhbDogU2l6ZSBvZiB0aGUgQHZhbCBhcnJheQogICoKICAqIFJlYWQgYW4gYXJyYXkgb2YgdTY0IHByb3BlcnRpZXMgd2l0aCBAcHJvcG5hbWUgZnJvbSBAZndub2RlIGFuZCBzdG9yZSB0aGVtIHRvCiAgKiBAdmFsIGlmIGZvdW5kLgogICoKLSAqIFJldHVybjogJTAgaWYgdGhlIHByb3BlcnR5IHdhcyBmb3VuZCAoc3VjY2VzcyksCisgKiBSZXR1cm46IG51bWJlciBvZiB2YWx1ZXMgaWYgQHZhbCB3YXMgJU5VTEwsCisgKiAgICAgICAgICUwIGlmIHRoZSBwcm9wZXJ0eSB3YXMgZm91bmQgKHN1Y2Nlc3MpLAogICoJICAgJS1FSU5WQUwgaWYgZ2l2ZW4gYXJndW1lbnRzIGFyZSBub3QgdmFsaWQsCiAgKgkgICAlLUVOT0RBVEEgaWYgdGhlIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSB2YWx1ZSwKICAqCSAgICUtRVBST1RPIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgYW4gYXJyYXkgb2YgbnVtYmVycywKQEAgLTMxOCwxMyArNDA0LDE0IEBACiAgKiBmd25vZGVfcHJvcGVydHlfcmVhZF9zdHJpbmdfYXJyYXkgLSByZXR1cm4gc3RyaW5nIGFycmF5IHByb3BlcnR5IG9mIGEgbm9kZQogICogQGZ3bm9kZTogRmlybXdhcmUgbm9kZSB0byBnZXQgdGhlIHByb3BlcnR5IG9mCiAgKiBAcHJvcG5hbWU6IE5hbWUgb2YgdGhlIHByb3BlcnR5Ci0gKiBAdmFsOiBUaGUgdmFsdWVzIGFyZSBzdG9yZWQgaGVyZQorICogQHZhbDogVGhlIHZhbHVlcyBhcmUgc3RvcmVkIGhlcmUgb3IgJU5VTEwgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsdWVzCiAgKiBAbnZhbDogU2l6ZSBvZiB0aGUgQHZhbCBhcnJheQogICoKICAqIFJlYWQgYW4gc3RyaW5nIGxpc3QgcHJvcGVydHkgQHByb3BuYW1lIGZyb20gdGhlIGdpdmVuIGZpcm13YXJlIG5vZGUgYW5kIHN0b3JlCiAgKiB0aGVtIHRvIEB2YWwgaWYgZm91bmQuCiAgKgotICogUmV0dXJuOiAlMCBpZiB0aGUgcHJvcGVydHkgd2FzIGZvdW5kIChzdWNjZXNzKSwKKyAqIFJldHVybjogbnVtYmVyIG9mIHZhbHVlcyBpZiBAdmFsIHdhcyAlTlVMTCwKKyAqICAgICAgICAgJTAgaWYgdGhlIHByb3BlcnR5IHdhcyBmb3VuZCAoc3VjY2VzcyksCiAgKgkgICAlLUVJTlZBTCBpZiBnaXZlbiBhcmd1bWVudHMgYXJlIG5vdCB2YWxpZCwKICAqCSAgICUtRU5PREFUQSBpZiB0aGUgcHJvcGVydHkgZG9lcyBub3QgaGF2ZSBhIHZhbHVlLAogICoJICAgJS1FUFJPVE8gaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBhbiBhcnJheSBvZiBzdHJpbmdzLApAQCAtMzM2LDEzICs0MjMsMTYgQEAKIAkJCQkgICAgICBzaXplX3QgbnZhbCkKIHsKIAlpZiAoaXNfb2Zfbm9kZShmd25vZGUpKQotCQlyZXR1cm4gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmdfYXJyYXkob2Zfbm9kZShmd25vZGUpLCBwcm9wbmFtZSwKLQkJCQkJCSAgICAgdmFsLCBudmFsKTsKKwkJcmV0dXJuIHZhbCA/CisJCQlvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZ19hcnJheShvZl9ub2RlKGZ3bm9kZSksIHByb3BuYW1lLAorCQkJCQkJICAgICAgdmFsLCBudmFsKSA6CisJCQlvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKG9mX25vZGUoZndub2RlKSwgcHJvcG5hbWUpOwogCWVsc2UgaWYgKGlzX2FjcGlfbm9kZShmd25vZGUpKQogCQlyZXR1cm4gYWNwaV9kZXZfcHJvcF9yZWFkKGFjcGlfbm9kZShmd25vZGUpLCBwcm9wbmFtZSwKIAkJCQkJICBERVZfUFJPUF9TVFJJTkcsIHZhbCwgbnZhbCk7CiAKLQlyZXR1cm4gLUVOWElPOworCXJldHVybiBwc2V0X3Byb3BfcmVhZF9hcnJheSh0b19wc2V0KGZ3bm9kZSksIHByb3BuYW1lLAorCQkJCSAgICBERVZfUFJPUF9TVFJJTkcsIHZhbCwgbnZhbCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChmd25vZGVfcHJvcGVydHlfcmVhZF9zdHJpbmdfYXJyYXkpOwogCkBAIC0zNjUsNyArNDU1LDcgQEAKIAkJCQljb25zdCBjaGFyICpwcm9wbmFtZSwgY29uc3QgY2hhciAqKnZhbCkKIHsKIAlpZiAoaXNfb2Zfbm9kZShmd25vZGUpKQotCQlyZXR1cm4gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcob2Zfbm9kZShmd25vZGUpLHByb3BuYW1lLCB2YWwpOworCQlyZXR1cm4gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcob2Zfbm9kZShmd25vZGUpLCBwcm9wbmFtZSwgdmFsKTsKIAllbHNlIGlmIChpc19hY3BpX25vZGUoZndub2RlKSkKIAkJcmV0dXJuIGFjcGlfZGV2X3Byb3BfcmVhZChhY3BpX25vZGUoZndub2RlKSwgcHJvcG5hbWUsCiAJCQkJCSAgREVWX1BST1BfU1RSSU5HLCB2YWwsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9NYWtlZmlsZSBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvTWFrZWZpbGUKaW5kZXggMGE1MzM2NS4uNjA5ZTRjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL01ha2VmaWxlCkBAIC0xLDMgKzEsNiBAQAorIyBGb3IgaW5jbHVkZS90cmFjZS9kZWZpbmVfdHJhY2UuaCB0byBpbmNsdWRlIHRyYWNlLmgKK0NGTEFHU19yZWdtYXAubyA6PSAtSSQoc3JjKQorCiBvYmotJChDT05GSUdfUkVHTUFQKSArPSByZWdtYXAubyByZWdjYWNoZS5vCiBvYmotJChDT05GSUdfUkVHTUFQKSArPSByZWdjYWNoZS1yYnRyZWUubyByZWdjYWNoZS1sem8ubyByZWdjYWNoZS1mbGF0Lm8KIG9iai0kKENPTkZJR19ERUJVR19GUykgKz0gcmVnbWFwLWRlYnVnZnMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9pbnRlcm5hbC5oCmluZGV4IGJlYjhiMjcuLmExMzU4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL2ludGVybmFsLmgKQEAgLTI0Myw0ICsyNDMsMTIgQEAKIGV4dGVybiBzdHJ1Y3QgcmVnY2FjaGVfb3BzIHJlZ2NhY2hlX2x6b19vcHM7CiBleHRlcm4gc3RydWN0IHJlZ2NhY2hlX29wcyByZWdjYWNoZV9mbGF0X29wczsKIAorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpyZWdtYXBfbmFtZShjb25zdCBzdHJ1Y3QgcmVnbWFwICptYXApCit7CisJaWYgKG1hcC0+ZGV2KQorCQlyZXR1cm4gZGV2X25hbWUobWFwLT5kZXYpOworCisJcmV0dXJuIG1hcC0+bmFtZTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLXJidHJlZS5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS1yYnRyZWUuYwppbmRleCBkNDUzYTJjLi44MTc1MWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLXJidHJlZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUtcmJ0cmVlLmMKQEAgLTMwNyw3ICszMDcsNyBAQAogCWlmIChwb3MgPT0gMCkgewogCQltZW1tb3ZlKGJsayArIG9mZnNldCAqIG1hcC0+Y2FjaGVfd29yZF9zaXplLAogCQkJYmxrLCByYm5vZGUtPmJsa2xlbiAqIG1hcC0+Y2FjaGVfd29yZF9zaXplKTsKLQkJYml0bWFwX3NoaWZ0X3JpZ2h0KHByZXNlbnQsIHByZXNlbnQsIG9mZnNldCwgYmxrbGVuKTsKKwkJYml0bWFwX3NoaWZ0X2xlZnQocHJlc2VudCwgcHJlc2VudCwgb2Zmc2V0LCBibGtsZW4pOwogCX0KIAogCS8qIHVwZGF0ZSB0aGUgcmJub2RlIGJsb2NrLCBpdHMgc2l6ZSBhbmQgdGhlIGJhc2UgcmVnaXN0ZXIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYyBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnY2FjaGUuYwppbmRleCBmMzczYzM1Li43ZWI3YjNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ2NhY2hlLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdjYWNoZS5jCkBAIC0xNSw4ICsxNSw4IEBACiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KLSNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcmVnbWFwLmg+CiAKKyNpbmNsdWRlICJ0cmFjZS5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnY2FjaGVfb3BzICpjYWNoZV90eXBlc1tdID0gewpAQCAtMjE4LDcgKzIxOCw3IEBACiAJCXJldCA9IG1hcC0+Y2FjaGVfb3BzLT5yZWFkKG1hcCwgcmVnLCB2YWx1ZSk7CiAKIAkJaWYgKHJldCA9PSAwKQotCQkJdHJhY2VfcmVnbWFwX3JlZ19yZWFkX2NhY2hlKG1hcC0+ZGV2LCByZWcsICp2YWx1ZSk7CisJCQl0cmFjZV9yZWdtYXBfcmVnX3JlYWRfY2FjaGUobWFwLCByZWcsICp2YWx1ZSk7CiAKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0zMTEsNyArMzExLDcgQEAKIAlkZXZfZGJnKG1hcC0+ZGV2LCAiU3luY2luZyAlcyBjYWNoZVxuIiwKIAkJbWFwLT5jYWNoZV9vcHMtPm5hbWUpOwogCW5hbWUgPSBtYXAtPmNhY2hlX29wcy0+bmFtZTsKLQl0cmFjZV9yZWdjYWNoZV9zeW5jKG1hcC0+ZGV2LCBuYW1lLCAic3RhcnQiKTsKKwl0cmFjZV9yZWdjYWNoZV9zeW5jKG1hcCwgbmFtZSwgInN0YXJ0Iik7CiAKIAlpZiAoIW1hcC0+Y2FjaGVfZGlydHkpCiAJCWdvdG8gb3V0OwpAQCAtMzQ2LDcgKzM0Niw3IEBACiAKIAlyZWdtYXBfYXN5bmNfY29tcGxldGUobWFwKTsKIAotCXRyYWNlX3JlZ2NhY2hlX3N5bmMobWFwLT5kZXYsIG5hbWUsICJzdG9wIik7CisJdHJhY2VfcmVnY2FjaGVfc3luYyhtYXAsIG5hbWUsICJzdG9wIik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzgxLDcgKzM4MSw3IEBACiAJbmFtZSA9IG1hcC0+Y2FjaGVfb3BzLT5uYW1lOwogCWRldl9kYmcobWFwLT5kZXYsICJTeW5jaW5nICVzIGNhY2hlIGZyb20gJWQtJWRcbiIsIG5hbWUsIG1pbiwgbWF4KTsKIAotCXRyYWNlX3JlZ2NhY2hlX3N5bmMobWFwLT5kZXYsIG5hbWUsICJzdGFydCByZWdpb24iKTsKKwl0cmFjZV9yZWdjYWNoZV9zeW5jKG1hcCwgbmFtZSwgInN0YXJ0IHJlZ2lvbiIpOwogCiAJaWYgKCFtYXAtPmNhY2hlX2RpcnR5KQogCQlnb3RvIG91dDsKQEAgLTQwMSw3ICs0MDEsNyBAQAogCiAJcmVnbWFwX2FzeW5jX2NvbXBsZXRlKG1hcCk7CiAKLQl0cmFjZV9yZWdjYWNoZV9zeW5jKG1hcC0+ZGV2LCBuYW1lLCAic3RvcCByZWdpb24iKTsKKwl0cmFjZV9yZWdjYWNoZV9zeW5jKG1hcCwgbmFtZSwgInN0b3AgcmVnaW9uIik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDI4LDcgKzQyOCw3IEBACiAKIAltYXAtPmxvY2sobWFwLT5sb2NrX2FyZyk7CiAKLQl0cmFjZV9yZWdjYWNoZV9kcm9wX3JlZ2lvbihtYXAtPmRldiwgbWluLCBtYXgpOworCXRyYWNlX3JlZ2NhY2hlX2Ryb3BfcmVnaW9uKG1hcCwgbWluLCBtYXgpOwogCiAJcmV0ID0gbWFwLT5jYWNoZV9vcHMtPmRyb3AobWFwLCBtaW4sIG1heCk7CiAKQEAgLTQ1NSw3ICs0NTUsNyBAQAogCW1hcC0+bG9jayhtYXAtPmxvY2tfYXJnKTsKIAlXQVJOX09OKG1hcC0+Y2FjaGVfYnlwYXNzICYmIGVuYWJsZSk7CiAJbWFwLT5jYWNoZV9vbmx5ID0gZW5hYmxlOwotCXRyYWNlX3JlZ21hcF9jYWNoZV9vbmx5KG1hcC0+ZGV2LCBlbmFibGUpOworCXRyYWNlX3JlZ21hcF9jYWNoZV9vbmx5KG1hcCwgZW5hYmxlKTsKIAltYXAtPnVubG9jayhtYXAtPmxvY2tfYXJnKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ2NhY2hlX2NhY2hlX29ubHkpOwpAQCAtNDkzLDcgKzQ5Myw3IEBACiAJbWFwLT5sb2NrKG1hcC0+bG9ja19hcmcpOwogCVdBUk5fT04obWFwLT5jYWNoZV9vbmx5ICYmIGVuYWJsZSk7CiAJbWFwLT5jYWNoZV9ieXBhc3MgPSBlbmFibGU7Ci0JdHJhY2VfcmVnbWFwX2NhY2hlX2J5cGFzcyhtYXAtPmRldiwgZW5hYmxlKTsKKwl0cmFjZV9yZWdtYXBfY2FjaGVfYnlwYXNzKG1hcCwgZW5hYmxlKTsKIAltYXAtPnVubG9jayhtYXAtPmxvY2tfYXJnKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ2NhY2hlX2NhY2hlX2J5cGFzcyk7CkBAIC02MDgsNyArNjA4LDggQEAKIAlmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CiAJCXJlZ3RtcCA9IGJsb2NrX2Jhc2UgKyAoaSAqIG1hcC0+cmVnX3N0cmlkZSk7CiAKLQkJaWYgKCFyZWdjYWNoZV9yZWdfcHJlc2VudChjYWNoZV9wcmVzZW50LCBpKSkKKwkJaWYgKCFyZWdjYWNoZV9yZWdfcHJlc2VudChjYWNoZV9wcmVzZW50LCBpKSB8fAorCQkgICAgIXJlZ21hcF93cml0ZWFibGUobWFwLCByZWd0bXApKQogCQkJY29udGludWU7CiAKIAkJdmFsID0gcmVnY2FjaGVfZ2V0X3ZhbChtYXAsIGJsb2NrLCBpKTsKQEAgLTY3Nyw3ICs2NzgsOCBAQAogCWZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKIAkJcmVndG1wID0gYmxvY2tfYmFzZSArIChpICogbWFwLT5yZWdfc3RyaWRlKTsKIAotCQlpZiAoIXJlZ2NhY2hlX3JlZ19wcmVzZW50KGNhY2hlX3ByZXNlbnQsIGkpKSB7CisJCWlmICghcmVnY2FjaGVfcmVnX3ByZXNlbnQoY2FjaGVfcHJlc2VudCwgaSkgfHwKKwkJICAgICFyZWdtYXBfd3JpdGVhYmxlKG1hcCwgcmVndG1wKSkgewogCQkJcmV0ID0gcmVnY2FjaGVfc3luY19ibG9ja19yYXdfZmx1c2gobWFwLCAmZGF0YSwKIAkJCQkJCQkgICAgYmFzZSwgcmVndG1wKTsKIAkJCWlmIChyZXQgIT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLWlycS5jIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtaXJxLmMKaW5kZXggNjI5OWE1MC4uYTZjM2Y3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtaXJxLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAtaXJxLmMKQEAgLTQ5OSw3ICs0OTksOCBAQAogCQlnb3RvIGVycl9hbGxvYzsKIAl9CiAKLQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIE5VTEwsIHJlZ21hcF9pcnFfdGhyZWFkLCBpcnFfZmxhZ3MsCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaXJxLCBOVUxMLCByZWdtYXBfaXJxX3RocmVhZCwKKwkJCQkgICBpcnFfZmxhZ3MgfCBJUlFGX09ORVNIT1QsCiAJCQkJICAgY2hpcC0+bmFtZSwgZCk7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWRldl9lcnIobWFwLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJUlEgJWQgZm9yICVzOiAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLmMgYi9kcml2ZXJzL2Jhc2UvcmVnbWFwL3JlZ21hcC5jCmluZGV4IGY5OWIwOTguLjYyNzNmZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvcmVnbWFwLmMKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC9yZWdtYXAuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwotI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9yZWdtYXAuaD4KKyNpbmNsdWRlICJ0cmFjZS5oIgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtMTI4MSw3ICsxMjgxLDcgQEAKIAlpZiAobWFwLT5hc3luYyAmJiBtYXAtPmJ1cy0+YXN5bmNfd3JpdGUpIHsKIAkJc3RydWN0IHJlZ21hcF9hc3luYyAqYXN5bmM7CiAKLQkJdHJhY2VfcmVnbWFwX2FzeW5jX3dyaXRlX3N0YXJ0KG1hcC0+ZGV2LCByZWcsIHZhbF9sZW4pOworCQl0cmFjZV9yZWdtYXBfYXN5bmNfd3JpdGVfc3RhcnQobWFwLCByZWcsIHZhbF9sZW4pOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZtYXAtPmFzeW5jX2xvY2ssIGZsYWdzKTsKIAkJYXN5bmMgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJm1hcC0+YXN5bmNfZnJlZSwKQEAgLTEzMzksOCArMTMzOSw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JdHJhY2VfcmVnbWFwX2h3X3dyaXRlX3N0YXJ0KG1hcC0+ZGV2LCByZWcsCi0JCQkJICAgIHZhbF9sZW4gLyBtYXAtPmZvcm1hdC52YWxfYnl0ZXMpOworCXRyYWNlX3JlZ21hcF9od193cml0ZV9zdGFydChtYXAsIHJlZywgdmFsX2xlbiAvIG1hcC0+Zm9ybWF0LnZhbF9ieXRlcyk7CiAKIAkvKiBJZiB3ZSdyZSBkb2luZyBhIHNpbmdsZSByZWdpc3RlciB3cml0ZSB3ZSBjYW4gcHJvYmFibHkganVzdAogCSAqIHNlbmQgdGhlIHdvcmtfYnVmIGRpcmVjdGx5LCBvdGhlcndpc2UgdHJ5IHRvIGRvIGEgZ2F0aGVyCkBAIC0xMzcyLDggKzEzNzEsNyBAQAogCQlrZnJlZShidWYpOwogCX0KIAotCXRyYWNlX3JlZ21hcF9od193cml0ZV9kb25lKG1hcC0+ZGV2LCByZWcsCi0JCQkJICAgdmFsX2xlbiAvIG1hcC0+Zm9ybWF0LnZhbF9ieXRlcyk7CisJdHJhY2VfcmVnbWFwX2h3X3dyaXRlX2RvbmUobWFwLCByZWcsIHZhbF9sZW4gLyBtYXAtPmZvcm1hdC52YWxfYnl0ZXMpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0MDcsMTIgKzE0MDUsMTIgQEAKIAogCW1hcC0+Zm9ybWF0LmZvcm1hdF93cml0ZShtYXAsIHJlZywgdmFsKTsKIAotCXRyYWNlX3JlZ21hcF9od193cml0ZV9zdGFydChtYXAtPmRldiwgcmVnLCAxKTsKKwl0cmFjZV9yZWdtYXBfaHdfd3JpdGVfc3RhcnQobWFwLCByZWcsIDEpOwogCiAJcmV0ID0gbWFwLT5idXMtPndyaXRlKG1hcC0+YnVzX2NvbnRleHQsIG1hcC0+d29ya19idWYsCiAJCQkgICAgICBtYXAtPmZvcm1hdC5idWZfc2l6ZSk7CiAKLQl0cmFjZV9yZWdtYXBfaHdfd3JpdGVfZG9uZShtYXAtPmRldiwgcmVnLCAxKTsKKwl0cmFjZV9yZWdtYXBfaHdfd3JpdGVfZG9uZShtYXAsIHJlZywgMSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTQ3MCw3ICsxNDY4LDcgQEAKIAkJZGV2X2luZm8obWFwLT5kZXYsICIleCA8PSAleFxuIiwgcmVnLCB2YWwpOwogI2VuZGlmCiAKLQl0cmFjZV9yZWdtYXBfcmVnX3dyaXRlKG1hcC0+ZGV2LCByZWcsIHZhbCk7CisJdHJhY2VfcmVnbWFwX3JlZ193cml0ZShtYXAsIHJlZywgdmFsKTsKIAogCXJldHVybiBtYXAtPnJlZ193cml0ZShjb250ZXh0LCByZWcsIHZhbCk7CiB9CkBAIC0xNzczLDcgKzE3NzEsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1fcmVnczsgaSsrKSB7CiAJCWludCByZWcgPSByZWdzW2ldLnJlZzsKIAkJaW50IHZhbCA9IHJlZ3NbaV0uZGVmOwotCQl0cmFjZV9yZWdtYXBfaHdfd3JpdGVfc3RhcnQobWFwLT5kZXYsIHJlZywgMSk7CisJCXRyYWNlX3JlZ21hcF9od193cml0ZV9zdGFydChtYXAsIHJlZywgMSk7CiAJCW1hcC0+Zm9ybWF0LmZvcm1hdF9yZWcodTgsIHJlZywgbWFwLT5yZWdfc2hpZnQpOwogCQl1OCArPSByZWdfYnl0ZXMgKyBwYWRfYnl0ZXM7CiAJCW1hcC0+Zm9ybWF0LmZvcm1hdF92YWwodTgsIHZhbCwgMCk7CkBAIC0xNzg4LDcgKzE3ODYsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG51bV9yZWdzOyBpKyspIHsKIAkJaW50IHJlZyA9IHJlZ3NbaV0ucmVnOwotCQl0cmFjZV9yZWdtYXBfaHdfd3JpdGVfZG9uZShtYXAtPmRldiwgcmVnLCAxKTsKKwkJdHJhY2VfcmVnbWFwX2h3X3dyaXRlX2RvbmUobWFwLCByZWcsIDEpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMjA1OSwxNSArMjA1NywxMyBAQAogCSAqLwogCXU4WzBdIHw9IG1hcC0+cmVhZF9mbGFnX21hc2s7CiAKLQl0cmFjZV9yZWdtYXBfaHdfcmVhZF9zdGFydChtYXAtPmRldiwgcmVnLAotCQkJCSAgIHZhbF9sZW4gLyBtYXAtPmZvcm1hdC52YWxfYnl0ZXMpOworCXRyYWNlX3JlZ21hcF9od19yZWFkX3N0YXJ0KG1hcCwgcmVnLCB2YWxfbGVuIC8gbWFwLT5mb3JtYXQudmFsX2J5dGVzKTsKIAogCXJldCA9IG1hcC0+YnVzLT5yZWFkKG1hcC0+YnVzX2NvbnRleHQsIG1hcC0+d29ya19idWYsCiAJCQkgICAgIG1hcC0+Zm9ybWF0LnJlZ19ieXRlcyArIG1hcC0+Zm9ybWF0LnBhZF9ieXRlcywKIAkJCSAgICAgdmFsLCB2YWxfbGVuKTsKIAotCXRyYWNlX3JlZ21hcF9od19yZWFkX2RvbmUobWFwLT5kZXYsIHJlZywKLQkJCQkgIHZhbF9sZW4gLyBtYXAtPmZvcm1hdC52YWxfYnl0ZXMpOworCXRyYWNlX3JlZ21hcF9od19yZWFkX2RvbmUobWFwLCByZWcsIHZhbF9sZW4gLyBtYXAtPmZvcm1hdC52YWxfYnl0ZXMpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIxMjMsNyArMjExOSw3IEBACiAJCQlkZXZfaW5mbyhtYXAtPmRldiwgIiV4ID0+ICV4XG4iLCByZWcsICp2YWwpOwogI2VuZGlmCiAKLQkJdHJhY2VfcmVnbWFwX3JlZ19yZWFkKG1hcC0+ZGV2LCByZWcsICp2YWwpOworCQl0cmFjZV9yZWdtYXBfcmVnX3JlYWQobWFwLCByZWcsICp2YWwpOwogCiAJCWlmICghbWFwLT5jYWNoZV9ieXBhc3MpCiAJCQlyZWdjYWNoZV93cml0ZShtYXAsIHJlZywgKnZhbCk7CkBAIC0yNDgwLDcgKzI0NzYsNyBAQAogCXN0cnVjdCByZWdtYXAgKm1hcCA9IGFzeW5jLT5tYXA7CiAJYm9vbCB3YWtlOwogCi0JdHJhY2VfcmVnbWFwX2FzeW5jX2lvX2NvbXBsZXRlKG1hcC0+ZGV2KTsKKwl0cmFjZV9yZWdtYXBfYXN5bmNfaW9fY29tcGxldGUobWFwKTsKIAogCXNwaW5fbG9jaygmbWFwLT5hc3luY19sb2NrKTsKIAlsaXN0X21vdmUoJmFzeW5jLT5saXN0LCAmbWFwLT5hc3luY19mcmVlKTsKQEAgLTI1MjUsNyArMjUyMSw3IEBACiAJaWYgKCFtYXAtPmJ1cyB8fCAhbWFwLT5idXMtPmFzeW5jX3dyaXRlKQogCQlyZXR1cm4gMDsKIAotCXRyYWNlX3JlZ21hcF9hc3luY19jb21wbGV0ZV9zdGFydChtYXAtPmRldik7CisJdHJhY2VfcmVnbWFwX2FzeW5jX2NvbXBsZXRlX3N0YXJ0KG1hcCk7CiAKIAl3YWl0X2V2ZW50KG1hcC0+YXN5bmNfd2FpdHEsIHJlZ21hcF9hc3luY19pc19kb25lKG1hcCkpOwogCkBAIC0yNTM0LDcgKzI1MzAsNyBAQAogCW1hcC0+YXN5bmNfcmV0ID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYXAtPmFzeW5jX2xvY2ssIGZsYWdzKTsKIAotCXRyYWNlX3JlZ21hcF9hc3luY19jb21wbGV0ZV9kb25lKG1hcC0+ZGV2KTsKKwl0cmFjZV9yZWdtYXBfYXN5bmNfY29tcGxldGVfZG9uZShtYXApOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmFzZS9yZWdtYXAvdHJhY2UuaCBiL2RyaXZlcnMvYmFzZS9yZWdtYXAvdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDU4NmExCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9iYXNlL3JlZ21hcC90cmFjZS5oCkBAIC0wLDAgKzEsMjU3IEBACisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSByZWdtYXAKKworI2lmICFkZWZpbmVkKF9UUkFDRV9SRUdNQVBfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX1JFR01BUF9ICisKKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI2luY2x1ZGUgImludGVybmFsLmgiCisKKy8qCisgKiBMb2cgcmVnaXN0ZXIgZXZlbnRzCisgKi8KK0RFQ0xBUkVfRVZFTlRfQ0xBU1MocmVnbWFwX3JlZywKKworCVRQX1BST1RPKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKKwkJIHVuc2lnbmVkIGludCB2YWwpLAorCisJVFBfQVJHUyhtYXAsIHJlZywgdmFsKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKAluYW1lLAkJcmVnbWFwX25hbWUobWFwKQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJcmVnCQkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCXZhbAkJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihuYW1lLCByZWdtYXBfbmFtZShtYXApKTsKKwkJX19lbnRyeS0+cmVnID0gcmVnOworCQlfX2VudHJ5LT52YWwgPSB2YWw7CisJKSwKKworCVRQX3ByaW50aygiJXMgcmVnPSV4IHZhbD0leCIsIF9fZ2V0X3N0cihuYW1lKSwKKwkJICAodW5zaWduZWQgaW50KV9fZW50cnktPnJlZywKKwkJICAodW5zaWduZWQgaW50KV9fZW50cnktPnZhbCkKKyk7CisKK0RFRklORV9FVkVOVChyZWdtYXBfcmVnLCByZWdtYXBfcmVnX3dyaXRlLAorCisJVFBfUFJPVE8oc3RydWN0IHJlZ21hcCAqbWFwLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkgdW5zaWduZWQgaW50IHZhbCksCisKKwlUUF9BUkdTKG1hcCwgcmVnLCB2YWwpCisKKyk7CisKK0RFRklORV9FVkVOVChyZWdtYXBfcmVnLCByZWdtYXBfcmVnX3JlYWQsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsCisJCSB1bnNpZ25lZCBpbnQgdmFsKSwKKworCVRQX0FSR1MobWFwLCByZWcsIHZhbCkKKworKTsKKworREVGSU5FX0VWRU5UKHJlZ21hcF9yZWcsIHJlZ21hcF9yZWdfcmVhZF9jYWNoZSwKKworCVRQX1BST1RPKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywKKwkJIHVuc2lnbmVkIGludCB2YWwpLAorCisJVFBfQVJHUyhtYXAsIHJlZywgdmFsKQorCispOworCitERUNMQVJFX0VWRU5UX0NMQVNTKHJlZ21hcF9ibG9jaywKKworCVRQX1BST1RPKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywgaW50IGNvdW50KSwKKworCVRQX0FSR1MobWFwLCByZWcsIGNvdW50KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKAluYW1lLAkJcmVnbWFwX25hbWUobWFwKQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJcmVnCQkJKQorCQlfX2ZpZWxkKAlpbnQsCQljb3VudAkJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihuYW1lLCByZWdtYXBfbmFtZShtYXApKTsKKwkJX19lbnRyeS0+cmVnID0gcmVnOworCQlfX2VudHJ5LT5jb3VudCA9IGNvdW50OworCSksCisKKwlUUF9wcmludGsoIiVzIHJlZz0leCBjb3VudD0lZCIsIF9fZ2V0X3N0cihuYW1lKSwKKwkJICAodW5zaWduZWQgaW50KV9fZW50cnktPnJlZywKKwkJICAoaW50KV9fZW50cnktPmNvdW50KQorKTsKKworREVGSU5FX0VWRU5UKHJlZ21hcF9ibG9jaywgcmVnbWFwX2h3X3JlYWRfc3RhcnQsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsIGludCBjb3VudCksCisKKwlUUF9BUkdTKG1hcCwgcmVnLCBjb3VudCkKKyk7CisKK0RFRklORV9FVkVOVChyZWdtYXBfYmxvY2ssIHJlZ21hcF9od19yZWFkX2RvbmUsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsIGludCBjb3VudCksCisKKwlUUF9BUkdTKG1hcCwgcmVnLCBjb3VudCkKKyk7CisKK0RFRklORV9FVkVOVChyZWdtYXBfYmxvY2ssIHJlZ21hcF9od193cml0ZV9zdGFydCwKKworCVRQX1BST1RPKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywgaW50IGNvdW50KSwKKworCVRQX0FSR1MobWFwLCByZWcsIGNvdW50KQorKTsKKworREVGSU5FX0VWRU5UKHJlZ21hcF9ibG9jaywgcmVnbWFwX2h3X3dyaXRlX2RvbmUsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVnbWFwICptYXAsIHVuc2lnbmVkIGludCByZWcsIGludCBjb3VudCksCisKKwlUUF9BUkdTKG1hcCwgcmVnLCBjb3VudCkKKyk7CisKK1RSQUNFX0VWRU5UKHJlZ2NhY2hlX3N5bmMsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVnbWFwICptYXAsIGNvbnN0IGNoYXIgKnR5cGUsCisJCSBjb25zdCBjaGFyICpzdGF0dXMpLAorCisJVFBfQVJHUyhtYXAsIHR5cGUsIHN0YXR1cyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX3N0cmluZyggICAgICAgbmFtZSwgICAgICAgICAgIHJlZ21hcF9uYW1lKG1hcCkJKQorCQlfX3N0cmluZygJc3RhdHVzLAkJc3RhdHVzCQkJKQorCQlfX3N0cmluZygJdHlwZSwJCXR5cGUJCQkpCisJCV9fZmllbGQoCWludCwJCXR5cGUJCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIobmFtZSwgcmVnbWFwX25hbWUobWFwKSk7CisJCV9fYXNzaWduX3N0cihzdGF0dXMsIHN0YXR1cyk7CisJCV9fYXNzaWduX3N0cih0eXBlLCB0eXBlKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyB0eXBlPSVzIHN0YXR1cz0lcyIsIF9fZ2V0X3N0cihuYW1lKSwKKwkJICBfX2dldF9zdHIodHlwZSksIF9fZ2V0X3N0cihzdGF0dXMpKQorKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhyZWdtYXBfYm9vbCwKKworCVRQX1BST1RPKHN0cnVjdCByZWdtYXAgKm1hcCwgYm9vbCBmbGFnKSwKKworCVRQX0FSR1MobWFwLCBmbGFnKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKAluYW1lLAkJcmVnbWFwX25hbWUobWFwKQkpCisJCV9fZmllbGQoCWludCwJCWZsYWcJCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIobmFtZSwgcmVnbWFwX25hbWUobWFwKSk7CisJCV9fZW50cnktPmZsYWcgPSBmbGFnOworCSksCisKKwlUUF9wcmludGsoIiVzIGZsYWc9JWQiLCBfX2dldF9zdHIobmFtZSksCisJCSAgKGludClfX2VudHJ5LT5mbGFnKQorKTsKKworREVGSU5FX0VWRU5UKHJlZ21hcF9ib29sLCByZWdtYXBfY2FjaGVfb25seSwKKworCVRQX1BST1RPKHN0cnVjdCByZWdtYXAgKm1hcCwgYm9vbCBmbGFnKSwKKworCVRQX0FSR1MobWFwLCBmbGFnKQorCispOworCitERUZJTkVfRVZFTlQocmVnbWFwX2Jvb2wsIHJlZ21hcF9jYWNoZV9ieXBhc3MsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVnbWFwICptYXAsIGJvb2wgZmxhZyksCisKKwlUUF9BUkdTKG1hcCwgZmxhZykKKworKTsKKworREVDTEFSRV9FVkVOVF9DTEFTUyhyZWdtYXBfYXN5bmMsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVnbWFwICptYXApLAorCisJVFBfQVJHUyhtYXApLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoCW5hbWUsCQlyZWdtYXBfbmFtZShtYXApCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihuYW1lLCByZWdtYXBfbmFtZShtYXApKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyIsIF9fZ2V0X3N0cihuYW1lKSkKKyk7CisKK0RFRklORV9FVkVOVChyZWdtYXBfYmxvY2ssIHJlZ21hcF9hc3luY193cml0ZV9zdGFydCwKKworCVRQX1BST1RPKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IHJlZywgaW50IGNvdW50KSwKKworCVRQX0FSR1MobWFwLCByZWcsIGNvdW50KQorKTsKKworREVGSU5FX0VWRU5UKHJlZ21hcF9hc3luYywgcmVnbWFwX2FzeW5jX2lvX2NvbXBsZXRlLAorCisJVFBfUFJPVE8oc3RydWN0IHJlZ21hcCAqbWFwKSwKKworCVRQX0FSR1MobWFwKQorCispOworCitERUZJTkVfRVZFTlQocmVnbWFwX2FzeW5jLCByZWdtYXBfYXN5bmNfY29tcGxldGVfc3RhcnQsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVnbWFwICptYXApLAorCisJVFBfQVJHUyhtYXApCisKKyk7CisKK0RFRklORV9FVkVOVChyZWdtYXBfYXN5bmMsIHJlZ21hcF9hc3luY19jb21wbGV0ZV9kb25lLAorCisJVFBfUFJPVE8oc3RydWN0IHJlZ21hcCAqbWFwKSwKKworCVRQX0FSR1MobWFwKQorCispOworCitUUkFDRV9FVkVOVChyZWdjYWNoZV9kcm9wX3JlZ2lvbiwKKworCVRQX1BST1RPKHN0cnVjdCByZWdtYXAgKm1hcCwgdW5zaWduZWQgaW50IGZyb20sCisJCSB1bnNpZ25lZCBpbnQgdG8pLAorCisJVFBfQVJHUyhtYXAsIGZyb20sIHRvKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fc3RyaW5nKCAgICAgICBuYW1lLCAgICAgICAgICAgcmVnbWFwX25hbWUobWFwKQkpCisJCV9fZmllbGQoCXVuc2lnbmVkIGludCwJZnJvbQkJCSkKKwkJX19maWVsZCgJdW5zaWduZWQgaW50LAl0bwkJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihuYW1lLCByZWdtYXBfbmFtZShtYXApKTsKKwkJX19lbnRyeS0+ZnJvbSA9IGZyb207CisJCV9fZW50cnktPnRvID0gdG87CisJKSwKKworCVRQX3ByaW50aygiJXMgJXUtJXUiLCBfX2dldF9zdHIobmFtZSksICh1bnNpZ25lZCBpbnQpX19lbnRyeS0+ZnJvbSwKKwkJICAodW5zaWduZWQgaW50KV9fZW50cnktPnRvKQorKTsKKworI2VuZGlmIC8qIF9UUkFDRV9SRUdNQVBfSCAqLworCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuCisKKyN1bmRlZiBUUkFDRV9JTkNMVURFX0ZJTEUKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIHRyYWNlCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNlL3NvYy5jIGIvZHJpdmVycy9iYXNlL3NvYy5jCmluZGV4IDcyYjVlNzIuLjM5ZmNhMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9zb2MuYworKysgYi9kcml2ZXJzL2Jhc2Uvc29jLmMKQEAgLTQzLDggKzQzLDggQEAKIH0KIAogc3RhdGljIHVtb2RlX3Qgc29jX2F0dHJpYnV0ZV9tb2RlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkKKwkJCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJCWludCBpbmRleCkKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CiAJc3RydWN0IHNvY19kZXZpY2UgKnNvY19kZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc29jX2RldmljZSwgZGV2KTsKQEAgLTYwLDcgKzYwLDcgQEAKIAkJcmV0dXJuIGF0dHItPm1vZGU7CiAJaWYgKChhdHRyID09ICZkZXZfYXR0cl9zb2NfaWQuYXR0cikKIAkgICAgJiYgKHNvY19kZXYtPmF0dHItPnNvY19pZCAhPSBOVUxMKSkKLQkgICAgICAgIHJldHVybiBhdHRyLT5tb2RlOworCQlyZXR1cm4gYXR0ci0+bW9kZTsKIAogCS8qIFVua25vd24gb3IgdW5maWxsZWQgYXR0cmlidXRlLiAqLwogCXJldHVybiAwOwpAQCAtMTE3LDcgKzExNyw3IEBACiAKIAlzb2NfZGV2ID0ga3phbGxvYyhzaXplb2YoKnNvY19kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNvY19kZXYpIHsKLQkgICAgICAgIHJldCA9IC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0MTsKIAl9CiAKQEAgLTEzNSw3ICsxMzUsNyBAQAogCX0gd2hpbGUgKHJldCA9PSAtRUFHQUlOKTsKIAogCWlmIChyZXQpCi0JICAgICAgICAgZ290byBvdXQyOworCQlnb3RvIG91dDI7CiAKIAlzb2NfZGV2LT5hdHRyID0gc29jX2Rldl9hdHRyOwogCXNvY19kZXYtPmRldi5idXMgPSAmc29jX2J1c190eXBlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL0tjb25maWcgYi9kcml2ZXJzL2JjbWEvS2NvbmZpZwppbmRleCAwZWU0OGJlLi5mYzZmZmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvS2NvbmZpZworKysgYi9kcml2ZXJzL2JjbWEvS2NvbmZpZwpAQCAtMjYsNiArMjYsNyBAQAogY29uZmlnIEJDTUFfSE9TVF9QQ0kKIAlib29sICJTdXBwb3J0IGZvciBCQ01BIG9uIFBDSS1ob3N0IGJ1cyIKIAlkZXBlbmRzIG9uIEJDTUFfSE9TVF9QQ0lfUE9TU0lCTEUKKwlzZWxlY3QgQkNNQV9EUklWRVJfUENJCiAJZGVmYXVsdCB5CiAKIGNvbmZpZyBCQ01BX0RSSVZFUl9QQ0lfSE9TVE1PREUKQEAgLTQ0LDYgKzQ1LDIyIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4KIAorY29uZmlnIEJDTUFfRFJJVkVSX1BDSQorCWJvb2wgIkJDTUEgQnJvYWRjb20gUENJIGNvcmUgZHJpdmVyIgorCWRlcGVuZHMgb24gQkNNQSAmJiBQQ0kKKwlkZWZhdWx0IHkKKwloZWxwCisJICBCQ01BIGJ1cyBtYXkgaGF2ZSBtYW55IHZlcnNpb25zIG9mIFBDSWUgY29yZS4gVGhpcyBkcml2ZXIKKwkgIHN1cHBvcnRzOgorCSAgMSkgUENJZSBjb3JlIHdvcmtpbmcgaW4gY2xpZW50bW9kZQorCSAgMikgUENJZSBHZW4gMiBjbGllbnRtb2RlIGNvcmUKKworCSAgSW4gZ2VuZXJhbCBQQ0llIChHZW4gMikgY2xpZW50bW9kZSBjb3JlIGlzIHJlcXVpcmVkIG9uIFBDSWUKKwkgIGhvc3RlZCBidXNlcy4gSXQncyByZXNwb25zaWJsZSBmb3IgaW5pdGlhbGl6YXRpb24gYW5kIGJhc2ljCisJICBoYXJkd2FyZSBtYW5hZ2VtZW50LgorCSAgVGhpcyBkcml2ZXIgaXMgYWxzbyBwcmVyZXF1aXNpdGUgZm9yIGEgaG9zdG1vZGUgUENJZSBjb3JlCisJICBzdXBwb3J0LgorCiBjb25maWcgQkNNQV9EUklWRVJfTUlQUwogCWJvb2wgIkJDTUEgQnJvYWRjb20gTUlQUyBjb3JlIGRyaXZlciIKIAlkZXBlbmRzIG9uIEJDTUEgJiYgTUlQUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL01ha2VmaWxlIGIvZHJpdmVycy9iY21hL01ha2VmaWxlCmluZGV4IDgzOGI0YjkuLmYzMmFmOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2JjbWEvTWFrZWZpbGUKQEAgLTMsOCArMyw4IEBACiBiY21hLXkJCQkJCSs9IGRyaXZlcl9jaGlwY29tbW9uX2IubwogYmNtYS0kKENPTkZJR19CQ01BX1NGTEFTSCkJCSs9IGRyaXZlcl9jaGlwY29tbW9uX3NmbGFzaC5vCiBiY21hLSQoQ09ORklHX0JDTUFfTkZMQVNIKQkJKz0gZHJpdmVyX2NoaXBjb21tb25fbmZsYXNoLm8KLWJjbWEteQkJCQkJKz0gZHJpdmVyX3BjaS5vCi1iY21hLXkJCQkJCSs9IGRyaXZlcl9wY2llMi5vCitiY21hLSQoQ09ORklHX0JDTUFfRFJJVkVSX1BDSSkJCSs9IGRyaXZlcl9wY2kubworYmNtYS0kKENPTkZJR19CQ01BX0RSSVZFUl9QQ0kpCQkrPSBkcml2ZXJfcGNpZTIubwogYmNtYS0kKENPTkZJR19CQ01BX0RSSVZFUl9QQ0lfSE9TVE1PREUpCSs9IGRyaXZlcl9wY2lfaG9zdC5vCiBiY21hLSQoQ09ORklHX0JDTUFfRFJJVkVSX01JUFMpCQkrPSBkcml2ZXJfbWlwcy5vCiBiY21hLSQoQ09ORklHX0JDTUFfRFJJVkVSX0dNQUNfQ01OKQkrPSBkcml2ZXJfZ21hY19jbW4ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL2JjbWFfcHJpdmF0ZS5oIGIvZHJpdmVycy9iY21hL2JjbWFfcHJpdmF0ZS5oCmluZGV4IGFjNmM1ZmMuLjE1ZjJiMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtYS9iY21hX3ByaXZhdGUuaAorKysgYi9kcml2ZXJzL2JjbWEvYmNtYV9wcml2YXRlLmgKQEAgLTI2LDYgKzI2LDcgQEAKIAkJICAgICBpbnQgdGltZW91dCk7CiB2b2lkIGJjbWFfcHJlcGFyZV9jb3JlKHN0cnVjdCBiY21hX2J1cyAqYnVzLCBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUpOwogdm9pZCBiY21hX2luaXRfYnVzKHN0cnVjdCBiY21hX2J1cyAqYnVzKTsKK3ZvaWQgYmNtYV91bnJlZ2lzdGVyX2NvcmVzKHN0cnVjdCBiY21hX2J1cyAqYnVzKTsKIGludCBiY21hX2J1c19yZWdpc3RlcihzdHJ1Y3QgYmNtYV9idXMgKmJ1cyk7CiB2b2lkIGJjbWFfYnVzX3VucmVnaXN0ZXIoc3RydWN0IGJjbWFfYnVzICpidXMpOwogaW50IF9faW5pdCBiY21hX2J1c19lYXJseV9yZWdpc3RlcihzdHJ1Y3QgYmNtYV9idXMgKmJ1cyk7CkBAIC00Miw2ICs0Myw5IEBACiBpbnQgYmNtYV9zcHJvbV9nZXQoc3RydWN0IGJjbWFfYnVzICpidXMpOwogCiAvKiBkcml2ZXJfY2hpcGNvbW1vbi5jICovCit2b2lkIGJjbWFfY29yZV9jaGlwY29tbW9uX2Vhcmx5X2luaXQoc3RydWN0IGJjbWFfZHJ2X2NjICpjYyk7Cit2b2lkIGJjbWFfY29yZV9jaGlwY29tbW9uX2luaXQoc3RydWN0IGJjbWFfZHJ2X2NjICpjYyk7Cit2b2lkIGJjbWFfY2hpcGNvX2JjbTQzMzFfZXh0X3BhX2xpbmVzX2N0bChzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjLCBib29sIGVuYWJsZSk7CiAjaWZkZWYgQ09ORklHX0JDTUFfRFJJVkVSX01JUFMKIHZvaWQgYmNtYV9jaGlwY29fc2VyaWFsX2luaXQoc3RydWN0IGJjbWFfZHJ2X2NjICpjYyk7CiBleHRlcm4gc3RydWN0IHBsYXRmb3JtX2RldmljZSBiY21hX3BmbGFzaF9kZXY7CkBAIC01Miw2ICs1Niw4IEBACiB2b2lkIGJjbWFfY29yZV9jaGlwY29tbW9uX2JfZnJlZShzdHJ1Y3QgYmNtYV9kcnZfY2NfYiAqY2NiKTsKIAogLyogZHJpdmVyX2NoaXBjb21tb25fcG11LmMgKi8KK3ZvaWQgYmNtYV9wbXVfZWFybHlfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjKTsKK3ZvaWQgYmNtYV9wbXVfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjKTsKIHUzMiBiY21hX3BtdV9nZXRfYWxwX2Nsb2NrKHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpOwogdTMyIGJjbWFfcG11X2dldF9jcHVfY2xvY2soc3RydWN0IGJjbWFfZHJ2X2NjICpjYyk7CiAKQEAgLTEwMCw3ICsxMDYsMzUgQEAKICNlbmRpZiAvKiBDT05GSUdfQkNNQV9IT1NUX1NPQyAmJiBDT05GSUdfT0YgKi8KIAogLyogZHJpdmVyX3BjaS5jICovCisjaWZkZWYgQ09ORklHX0JDTUFfRFJJVkVSX1BDSQogdTMyIGJjbWFfcGNpZV9yZWFkKHN0cnVjdCBiY21hX2Rydl9wY2kgKnBjLCB1MzIgYWRkcmVzcyk7Cit2b2lkIGJjbWFfY29yZV9wY2lfZWFybHlfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfcGNpICpwYyk7Cit2b2lkIGJjbWFfY29yZV9wY2lfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfcGNpICpwYyk7Cit2b2lkIGJjbWFfY29yZV9wY2lfdXAoc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMpOwordm9pZCBiY21hX2NvcmVfcGNpX2Rvd24oc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21hX2NvcmVfcGNpX2Vhcmx5X2luaXQoc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMpCit7CisJV0FSTl9PTihwYy0+Y29yZS0+YnVzLT5ob3N0dHlwZSA9PSBCQ01BX0hPU1RUWVBFX1BDSSk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9jb3JlX3BjaV9pbml0KHN0cnVjdCBiY21hX2Rydl9wY2kgKnBjKQoreworCS8qIEluaXRpYWxpemF0aW9uIGlzIHJlcXVpcmVkIGZvciBQQ0kgaG9zdGVkIGJ1cyAqLworCVdBUk5fT04ocGMtPmNvcmUtPmJ1cy0+aG9zdHR5cGUgPT0gQkNNQV9IT1NUVFlQRV9QQ0kpOworfQorI2VuZGlmCisKKy8qIGRyaXZlcl9wY2llMi5jICovCisjaWZkZWYgQ09ORklHX0JDTUFfRFJJVkVSX1BDSQordm9pZCBiY21hX2NvcmVfcGNpZTJfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfcGNpZTIgKnBjaWUyKTsKK3ZvaWQgYmNtYV9jb3JlX3BjaWUyX3VwKHN0cnVjdCBiY21hX2Rydl9wY2llMiAqcGNpZTIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21hX2NvcmVfcGNpZTJfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfcGNpZTIgKnBjaWUyKQoreworCS8qIEluaXRpYWxpemF0aW9uIGlzIHJlcXVpcmVkIGZvciBQQ0kgaG9zdGVkIGJ1cyAqLworCVdBUk5fT04ocGNpZTItPmNvcmUtPmJ1cy0+aG9zdHR5cGUgPT0gQkNNQV9IT1NUVFlQRV9QQ0kpOworfQorI2VuZGlmCiAKIGV4dGVybiBpbnQgYmNtYV9jaGlwY29fd2F0Y2hkb2dfcmVnaXN0ZXIoc3RydWN0IGJjbWFfZHJ2X2NjICpjYyk7CiAKQEAgLTExNyw2ICsxNTEsMzkgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfQkNNQV9EUklWRVJfUENJX0hPU1RNT0RFICovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZHJpdmVyX21pcHMuYworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX0JDTUFfRFJJVkVSX01JUFMKK3Vuc2lnbmVkIGludCBiY21hX2NvcmVfbWlwc19pcnEoc3RydWN0IGJjbWFfZGV2aWNlICpkZXYpOwordm9pZCBiY21hX2NvcmVfbWlwc19lYXJseV9pbml0KHN0cnVjdCBiY21hX2Rydl9taXBzICptY29yZSk7Cit2b2lkIGJjbWFfY29yZV9taXBzX2luaXQoc3RydWN0IGJjbWFfZHJ2X21pcHMgKm1jb3JlKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiY21hX2NvcmVfbWlwc19pcnEoc3RydWN0IGJjbWFfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9jb3JlX21pcHNfZWFybHlfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfbWlwcyAqbWNvcmUpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9jb3JlX21pcHNfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfbWlwcyAqbWNvcmUpCit7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBkcml2ZXJfZ21hY19jbW4uYworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX0JDTUFfRFJJVkVSX0dNQUNfQ01OCit2b2lkIGJjbWFfY29yZV9nbWFjX2Ntbl9pbml0KHN0cnVjdCBiY21hX2Rydl9nbWFjX2NtbiAqZ2MpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21hX2NvcmVfZ21hY19jbW5faW5pdChzdHJ1Y3QgYmNtYV9kcnZfZ21hY19jbW4gKmdjKQoreworfQorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfQkNNQV9EUklWRVJfR1BJTwogLyogZHJpdmVyX2dwaW8uYyAqLwogaW50IGJjbWFfZ3Bpb19pbml0KHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL2RyaXZlcl9ncGlvLmMgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX2dwaW8uYwppbmRleCA1OThhNmNkLi43NGNjYjAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvZHJpdmVyX2dwaW8uYworKysgYi9kcml2ZXJzL2JjbWEvZHJpdmVyX2dwaW8uYwpAQCAtMTcsNiArMTcsOCBAQAogCiAjaW5jbHVkZSAiYmNtYV9wcml2YXRlLmgiCiAKKyNkZWZpbmUgQkNNQV9HUElPX01BWF9QSU5TCTMyCisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGJjbWFfZHJ2X2NjICpiY21hX2dwaW9fZ2V0X2NjKHN0cnVjdCBncGlvX2NoaXAgKmNoaXApCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgYmNtYV9kcnZfY2MsIGdwaW8pOwpAQCAtNzYsNyArNzgsNyBAQAogCWJjbWFfY2hpcGNvX2dwaW9fcHVsbHVwKGNjLCAxIDw8IGdwaW8sIDApOwogfQogCi0jaWYgSVNfQlVJTFRJTihDT05GSUdfQkNNNDdYWCkKKyNpZiBJU19CVUlMVElOKENPTkZJR19CQ000N1hYKSB8fCBJU19CVUlMVElOKENPTkZJR19BUkNIX0JDTV81MzAxWCkKIHN0YXRpYyBpbnQgYmNtYV9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBncGlvKQogewogCXN0cnVjdCBiY21hX2Rydl9jYyAqY2MgPSBiY21hX2dwaW9fZ2V0X2NjKGNoaXApOwpAQCAtMjA0LDYgKzIwNiw3IEBACiAKIGludCBiY21hX2dwaW9faW5pdChzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjKQogeworCXN0cnVjdCBiY21hX2J1cyAqYnVzID0gY2MtPmNvcmUtPmJ1czsKIAlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwID0gJmNjLT5ncGlvOwogCWludCBlcnI7CiAKQEAgLTIxNSwxNCArMjE4LDE0IEBACiAJY2hpcC0+c2V0CQk9IGJjbWFfZ3Bpb19zZXRfdmFsdWU7CiAJY2hpcC0+ZGlyZWN0aW9uX2lucHV0CT0gYmNtYV9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKIAljaGlwLT5kaXJlY3Rpb25fb3V0cHV0CT0gYmNtYV9ncGlvX2RpcmVjdGlvbl9vdXRwdXQ7Ci0jaWYgSVNfQlVJTFRJTihDT05GSUdfQkNNNDdYWCkKKyNpZiBJU19CVUlMVElOKENPTkZJR19CQ000N1hYKSB8fCBJU19CVUlMVElOKENPTkZJR19BUkNIX0JDTV81MzAxWCkKIAljaGlwLT50b19pcnEJCT0gYmNtYV9ncGlvX3RvX2lycTsKICNlbmRpZgogI2lmIElTX0JVSUxUSU4oQ09ORklHX09GKQogCWlmIChjYy0+Y29yZS0+YnVzLT5ob3N0dHlwZSA9PSBCQ01BX0hPU1RUWVBFX1NPQykKIAkJY2hpcC0+b2Zfbm9kZQk9IGNjLT5jb3JlLT5kZXYub2Zfbm9kZTsKICNlbmRpZgotCXN3aXRjaCAoY2MtPmNvcmUtPmJ1cy0+Y2hpcGluZm8uaWQpIHsKKwlzd2l0Y2ggKGJ1cy0+Y2hpcGluZm8uaWQpIHsKIAljYXNlIEJDTUFfQ0hJUF9JRF9CQ001MzU3OgogCWNhc2UgQkNNQV9DSElQX0lEX0JDTTUzNTcyOgogCQljaGlwLT5uZ3Bpbwk9IDMyOwpAQCAtMjMxLDEzICsyMzQsMTcgQEAKIAkJY2hpcC0+bmdwaW8JPSAxNjsKIAl9CiAKLQkvKiBUaGVyZSBpcyBqdXN0IG9uZSBTb0MgaW4gb25lIGRldmljZSBhbmQgaXRzIEdQSU8gYWRkcmVzc2VzIHNob3VsZCBiZQotCSAqIGRldGVybWluaXN0aWMgdG8gYWRkcmVzcyB0aGVtIG1vcmUgZWFzaWx5LiBUaGUgb3RoZXIgYnVzZXMgY291bGQgZ2V0Ci0JICogYSByYW5kb20gYmFzZSBudW1iZXIuICovCi0JaWYgKGNjLT5jb3JlLT5idXMtPmhvc3R0eXBlID09IEJDTUFfSE9TVFRZUEVfU09DKQotCQljaGlwLT5iYXNlCQk9IDA7Ci0JZWxzZQotCQljaGlwLT5iYXNlCQk9IC0xOworCS8qCisJICogT24gTUlQUyB3ZSByZWdpc3RlciBHUElPIGRldmljZXMgKExFRHMsIGJ1dHRvbnMpIHVzaW5nIGFic29sdXRlIEdQSU8KKwkgKiBwaW4gbnVtYmVycy4gV2UgZG9uJ3QgaGF2ZSBEZXZpY2UgVHJlZSB0aGVyZSBhbmQgd2UgY2FuJ3QgcmVhbGx5IHVzZQorCSAqIHJlbGF0aXZlIChwZXIgY2hpcCkgbnVtYmVycy4KKwkgKiBTbyBsZXQncyB1c2UgcHJlZGljdGFibGUgYmFzZSBmb3IgQkNNNDdYWCBhbmQgInJhbmRvbSIgZm9yIGFsbCBvdGhlci4KKwkgKi8KKyNpZiBJU19CVUlMVElOKENPTkZJR19CQ000N1hYKQorCWNoaXAtPmJhc2UJCT0gYnVzLT5udW0gKiBCQ01BX0dQSU9fTUFYX1BJTlM7CisjZWxzZQorCWNoaXAtPmJhc2UJCT0gLTE7CisjZW5kaWYKIAogCWVyciA9IGJjbWFfZ3Bpb19pcnFfZG9tYWluX2luaXQoY2MpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvZHJpdmVyX3BjaS5jIGIvZHJpdmVycy9iY21hL2RyaXZlcl9wY2kuYwppbmRleCA3ODY2NjY0Li5mNDk5YTQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvZHJpdmVyX3BjaS5jCisrKyBiL2RyaXZlcnMvYmNtYS9kcml2ZXJfcGNpLmMKQEAgLTI4MiwzOSArMjgyLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGJjbWFfY29yZV9wY2lfcG93ZXJfc2F2ZSk7CiAKLWludCBiY21hX2NvcmVfcGNpX2lycV9jdGwoc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMsIHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwKLQkJCSAgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXY7Ci0JdTMyIGNvcmVtYXNrLCB0bXA7Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAoIXBjIHx8IGNvcmUtPmJ1cy0+aG9zdHR5cGUgIT0gQkNNQV9IT1NUVFlQRV9QQ0kpIHsKLQkJLyogVGhpcyBiY21hIGRldmljZSBpcyBub3Qgb24gYSBQQ0kgaG9zdC1idXMuIFNvIHRoZSBJUlFzIGFyZQotCQkgKiBub3Qgcm91dGVkIHRocm91Z2ggdGhlIFBDSSBjb3JlLgotCQkgKiBTbyB3ZSBtdXN0IG5vdCBlbmFibGUgcm91dGluZyB0aHJvdWdoIHRoZSBQQ0kgY29yZS4gKi8KLQkJZ290byBvdXQ7Ci0JfQotCi0JcGRldiA9IHBjLT5jb3JlLT5idXMtPmhvc3RfcGNpOwotCi0JZXJyID0gcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIEJDTUFfUENJX0lSUU1BU0ssICZ0bXApOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCi0JY29yZW1hc2sgPSBCSVQoY29yZS0+Y29yZV9pbmRleCkgPDwgODsKLQlpZiAoZW5hYmxlKQotCQl0bXAgfD0gY29yZW1hc2s7Ci0JZWxzZQotCQl0bXAgJj0gfmNvcmVtYXNrOwotCi0JZXJyID0gcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBCQ01BX1BDSV9JUlFNQVNLLCB0bXApOwotCi1vdXQ6Ci0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGJjbWFfY29yZV9wY2lfaXJxX2N0bCk7Ci0KIHN0YXRpYyB2b2lkIGJjbWFfY29yZV9wY2lfZXh0ZW5kX0wxdGltZXIoc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMsIGJvb2wgZXh0ZW5kKQogewogCXUzMiB3OwpAQCAtMzI4LDI4ICsyOTUsMTIgQEAKIAliY21hX3BjaWVfcmVhZChwYywgQkNNQV9DT1JFX1BDSV9ETExQX1BNVEhSRVNIUkVHKTsKIH0KIAotdm9pZCBiY21hX2NvcmVfcGNpX3VwKHN0cnVjdCBiY21hX2J1cyAqYnVzKQordm9pZCBiY21hX2NvcmVfcGNpX3VwKHN0cnVjdCBiY21hX2Rydl9wY2kgKnBjKQogewotCXN0cnVjdCBiY21hX2Rydl9wY2kgKnBjOwotCi0JaWYgKGJ1cy0+aG9zdHR5cGUgIT0gQkNNQV9IT1NUVFlQRV9QQ0kpCi0JCXJldHVybjsKLQotCXBjID0gJmJ1cy0+ZHJ2X3BjaVswXTsKLQogCWJjbWFfY29yZV9wY2lfZXh0ZW5kX0wxdGltZXIocGMsIHRydWUpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoYmNtYV9jb3JlX3BjaV91cCk7CiAKLXZvaWQgYmNtYV9jb3JlX3BjaV9kb3duKHN0cnVjdCBiY21hX2J1cyAqYnVzKQordm9pZCBiY21hX2NvcmVfcGNpX2Rvd24oc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMpCiB7Ci0Jc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGM7Ci0KLQlpZiAoYnVzLT5ob3N0dHlwZSAhPSBCQ01BX0hPU1RUWVBFX1BDSSkKLQkJcmV0dXJuOwotCi0JcGMgPSAmYnVzLT5kcnZfcGNpWzBdOwotCiAJYmNtYV9jb3JlX3BjaV9leHRlbmRfTDF0aW1lcihwYywgZmFsc2UpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoYmNtYV9jb3JlX3BjaV9kb3duKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9kcml2ZXJfcGNpX2hvc3QuYyBiL2RyaXZlcnMvYmNtYS9kcml2ZXJfcGNpX2hvc3QuYwppbmRleCBjOGE2Yjc0Li5jNDJjZWM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvZHJpdmVyX3BjaV9ob3N0LmMKKysrIGIvZHJpdmVycy9iY21hL2RyaXZlcl9wY2lfaG9zdC5jCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlICJiY21hX3ByaXZhdGUuaCIKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hLmg+CiAjaW5jbHVkZSA8YXNtL3BhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9kcml2ZXJfcGNpZTIuYyBiL2RyaXZlcnMvYmNtYS9kcml2ZXJfcGNpZTIuYwppbmRleCBlNGJlNTM3Li5iMWE2ZTMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvZHJpdmVyX3BjaWUyLmMKKysrIGIvZHJpdmVycy9iY21hL2RyaXZlcl9wY2llMi5jCkBAIC0xMCw2ICsxMCw3IEBACiAKICNpbmNsdWRlICJiY21hX3ByaXZhdGUuaCIKICNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSL1cgb3BzLgpAQCAtMTU2LDE0ICsxNTcsMjMgQEAKIAogdm9pZCBiY21hX2NvcmVfcGNpZTJfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfcGNpZTIgKnBjaWUyKQogewotCXN0cnVjdCBiY21hX2NoaXBpbmZvICpjaSA9ICZwY2llMi0+Y29yZS0+YnVzLT5jaGlwaW5mbzsKKwlzdHJ1Y3QgYmNtYV9idXMgKmJ1cyA9IHBjaWUyLT5jb3JlLT5idXM7CisJc3RydWN0IGJjbWFfY2hpcGluZm8gKmNpID0gJmJ1cy0+Y2hpcGluZm87CiAJdTMyIHRtcDsKIAogCXRtcCA9IHBjaWUyX3JlYWQzMihwY2llMiwgQkNNQV9DT1JFX1BDSUUyX1NQUk9NKDU0KSk7CiAJaWYgKCh0bXAgJiAweGUpID4+IDEgPT0gMikKIAkJYmNtYV9jb3JlX3BjaWUyX2NmZ193cml0ZShwY2llMiwgMHg0ZTAsIDB4MTcpOwogCi0JLyogVE9ETzogRG8gd2UgbmVlZCBwY2llX3JlcXNpemU/ICovCisJc3dpdGNoIChidXMtPmNoaXBpbmZvLmlkKSB7CisJY2FzZSBCQ01BX0NISVBfSURfQkNNNDM2MDoKKwljYXNlIEJDTUFfQ0hJUF9JRF9CQ000MzUyOgorCQlwY2llMi0+cmVxc2l6ZSA9IDEwMjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBjaWUyLT5yZXFzaXplID0gMTI4OworCQlicmVhazsKKwl9CiAKIAlpZiAoY2ktPmlkID09IEJDTUFfQ0hJUF9JRF9CQ000MzYwICYmIGNpLT5yZXYgPiAzKQogCQliY21hX2NvcmVfcGNpZTJfd2FyX2RlbGF5X3BlcnN0X2VuYWIocGNpZTIsIHRydWUpOwpAQCAtMTczLDMgKzE4MywxOCBAQAogCXBjaWVkZXZfY3J3bHBjaWVnZW4yXzE4MChwY2llMik7CiAJcGNpZWRldl9jcndscGNpZWdlbjJfMTgyKHBjaWUyKTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSdW50aW1lIG9wcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBiY21hX2NvcmVfcGNpZTJfdXAoc3RydWN0IGJjbWFfZHJ2X3BjaWUyICpwY2llMikKK3sKKwlzdHJ1Y3QgYmNtYV9idXMgKmJ1cyA9IHBjaWUyLT5jb3JlLT5idXM7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGJ1cy0+aG9zdF9wY2k7CisJaW50IGVycjsKKworCWVyciA9IHBjaWVfc2V0X3JlYWRycShkZXYsIHBjaWUyLT5yZXFzaXplKTsKKwlpZiAoZXJyKQorCQliY21hX2VycihidXMsICJFcnJvciBzZXR0aW5nIFBDSV9FWFBfREVWQ1RMX1JFQURSUTogJWRcbiIsIGVycik7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JjbWEvaG9zdF9wY2kuYyBiL2RyaXZlcnMvYmNtYS9ob3N0X3BjaS5jCmluZGV4IDUzYzZhOGEuLjA4NTYxODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmNtYS9ob3N0X3BjaS5jCisrKyBiL2RyaXZlcnMvYmNtYS9ob3N0X3BjaS5jCkBAIC0yMTMsMTYgKzIxMywyNiBAQAogCS8qIEluaXRpYWxpemUgc3RydWN0LCBkZXRlY3QgY2hpcCAqLwogCWJjbWFfaW5pdF9idXMoYnVzKTsKIAorCS8qIFNjYW4gYnVzIHRvIGZpbmQgb3V0IGdlbmVyYXRpb24gb2YgUENJZSBjb3JlICovCisJZXJyID0gYmNtYV9idXNfc2NhbihidXMpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3BjaV91bm1hcF9tbWlvOworCisJaWYgKGJjbWFfZmluZF9jb3JlKGJ1cywgQkNNQV9DT1JFX1BDSUUyKSkKKwkJYnVzLT5ob3N0X2lzX3BjaWUyID0gdHJ1ZTsKKwogCS8qIFJlZ2lzdGVyICovCiAJZXJyID0gYmNtYV9idXNfcmVnaXN0ZXIoYnVzKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9wY2lfdW5tYXBfbW1pbzsKKwkJZ290byBlcnJfdW5yZWdpc3Rlcl9jb3JlczsKIAogCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIGJ1cyk7CiAKIG91dDoKIAlyZXR1cm4gZXJyOwogCitlcnJfdW5yZWdpc3Rlcl9jb3JlczoKKwliY21hX3VucmVnaXN0ZXJfY29yZXMoYnVzKTsKIGVycl9wY2lfdW5tYXBfbW1pbzoKIAlwY2lfaW91bm1hcChkZXYsIGJ1cy0+bW1pbyk7CiBlcnJfcGNpX3JlbGVhc2VfcmVnaW9uczoKQEAgLTI4Myw5ICsyOTMsMTIgQEAKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0MzU3KSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzNTgpIH0sCiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDM1OSkgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0MzYwKSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzNjUpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDNhMCkgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0M2E5KSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzYWEpIH0sCisJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDNiMSkgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0NzI3KSB9LAogCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCA0MzIyNykgfSwJLyogMHhhOGRiLCBCQ000MzIxNyAoc2ljISkgKi8KIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgNDMyMjgpIH0sCS8qIDB4YThkYyAqLwpAQCAtMzEwLDMgKzMyMyw2NSBAQAogewogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYmNtYV9wY2lfYnJpZGdlX2RyaXZlcik7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUnVudGltZSBvcHMgZm9yIGRyaXZlcnMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFNlZSBhbHNvIHBjaWNvcmVfdXAgKi8KK3ZvaWQgYmNtYV9ob3N0X3BjaV91cChzdHJ1Y3QgYmNtYV9idXMgKmJ1cykKK3sKKwlpZiAoYnVzLT5ob3N0dHlwZSAhPSBCQ01BX0hPU1RUWVBFX1BDSSkKKwkJcmV0dXJuOworCisJaWYgKGJ1cy0+aG9zdF9pc19wY2llMikKKwkJYmNtYV9jb3JlX3BjaWUyX3VwKCZidXMtPmRydl9wY2llMik7CisJZWxzZQorCQliY21hX2NvcmVfcGNpX3VwKCZidXMtPmRydl9wY2lbMF0pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYmNtYV9ob3N0X3BjaV91cCk7CisKKy8qIFNlZSBhbHNvIHBjaWNvcmVfZG93biAqLwordm9pZCBiY21hX2hvc3RfcGNpX2Rvd24oc3RydWN0IGJjbWFfYnVzICpidXMpCit7CisJaWYgKGJ1cy0+aG9zdHR5cGUgIT0gQkNNQV9IT1NUVFlQRV9QQ0kpCisJCXJldHVybjsKKworCWlmICghYnVzLT5ob3N0X2lzX3BjaWUyKQorCQliY21hX2NvcmVfcGNpX2Rvd24oJmJ1cy0+ZHJ2X3BjaVswXSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChiY21hX2hvc3RfcGNpX2Rvd24pOworCisvKiBTZWUgYWxzbyBzaV9wY2lfc2V0dXAgKi8KK2ludCBiY21hX2hvc3RfcGNpX2lycV9jdGwoc3RydWN0IGJjbWFfYnVzICpidXMsIHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwKKwkJCSAgYm9vbCBlbmFibGUpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJdTMyIGNvcmVtYXNrLCB0bXA7CisJaW50IGVyciA9IDA7CisKKwlpZiAoYnVzLT5ob3N0dHlwZSAhPSBCQ01BX0hPU1RUWVBFX1BDSSkgeworCQkvKiBUaGlzIGJjbWEgZGV2aWNlIGlzIG5vdCBvbiBhIFBDSSBob3N0LWJ1cy4gU28gdGhlIElSUXMgYXJlCisJCSAqIG5vdCByb3V0ZWQgdGhyb3VnaCB0aGUgUENJIGNvcmUuCisJCSAqIFNvIHdlIG11c3Qgbm90IGVuYWJsZSByb3V0aW5nIHRocm91Z2ggdGhlIFBDSSBjb3JlLiAqLworCQlnb3RvIG91dDsKKwl9CisKKwlwZGV2ID0gYnVzLT5ob3N0X3BjaTsKKworCWVyciA9IHBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBCQ01BX1BDSV9JUlFNQVNLLCAmdG1wKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWNvcmVtYXNrID0gQklUKGNvcmUtPmNvcmVfaW5kZXgpIDw8IDg7CisJaWYgKGVuYWJsZSkKKwkJdG1wIHw9IGNvcmVtYXNrOworCWVsc2UKKwkJdG1wICY9IH5jb3JlbWFzazsKKworCWVyciA9IHBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgQkNNQV9QQ0lfSVJRTUFTSywgdG1wKTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChiY21hX2hvc3RfcGNpX2lycV9jdGwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL21haW4uYyBiL2RyaXZlcnMvYmNtYS9tYWluLmMKaW5kZXggMzhiZGU2ZS4uOTYzNWYxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL21haW4uYworKysgYi9kcml2ZXJzL2JjbWEvbWFpbi5jCkBAIC0zNjMsNyArMzYzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYmNtYV91bnJlZ2lzdGVyX2NvcmVzKHN0cnVjdCBiY21hX2J1cyAqYnVzKQordm9pZCBiY21hX3VucmVnaXN0ZXJfY29yZXMoc3RydWN0IGJjbWFfYnVzICpidXMpCiB7CiAJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCAqdG1wOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMgYi9kcml2ZXJzL2Jsb2NrL2NwcWFycmF5LmMKaW5kZXggMmI5NDQwMy4uZjc0OWRmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jcHFhcnJheS5jCisrKyBiL2RyaXZlcnMvYmxvY2svY3BxYXJyYXkuYwpAQCAtNDA1LDggKzQwNSw4IEBACiAJCWdvdG8gRW5vbWVtNDsKIAl9CiAJaGJhW2ldLT5hY2Nlc3Muc2V0X2ludHJfbWFzayhoYmFbaV0sIDApOwotCWlmIChyZXF1ZXN0X2lycShoYmFbaV0tPmludHIsIGRvX2lkYV9pbnRyLAotCQlJUlFGX0RJU0FCTEVEfElSUUZfU0hBUkVELCBoYmFbaV0tPmRldm5hbWUsIGhiYVtpXSkpCisJaWYgKHJlcXVlc3RfaXJxKGhiYVtpXS0+aW50ciwgZG9faWRhX2ludHIsIElSUUZfU0hBUkVELAorCQkJaGJhW2ldLT5kZXZuYW1lLCBoYmFbaV0pKQogCXsKIAkJcHJpbnRrKEtFUk5fRVJSICJjcHFhcnJheTogVW5hYmxlIHRvIGdldCBpcnEgJWQgZm9yICVzXG4iLAogCQkJCWhiYVtpXS0+aW50ciwgaGJhW2ldLT5kZXZuYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbG9vcC5jIGIvZHJpdmVycy9ibG9jay9sb29wLmMKaW5kZXggZDFmMTY4Yi4uYzRmZDFlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9sb29wLmMKKysrIGIvZHJpdmVycy9ibG9jay9sb29wLmMKQEAgLTc1LDYgKzc1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgogI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9mYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlICJsb29wLmgiCiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtMjI5LDEzICsyMzAsMTQgQEAKIHN0YXRpYyBpbnQgX19kb19sb19zZW5kX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAogCQl1OCAqYnVmLCBjb25zdCBpbnQgbGVuLCBsb2ZmX3QgcG9zKQogeworCXN0cnVjdCBrdmVjIGt2ZWMgPSB7Lmlvdl9iYXNlID0gYnVmLCAuaW92X2xlbiA9IGxlbn07CisJc3RydWN0IGlvdl9pdGVyIGZyb207CiAJc3NpemVfdCBidzsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzID0gZ2V0X2ZzKCk7CisKKwlpb3ZfaXRlcl9rdmVjKCZmcm9tLCBJVEVSX0tWRUMgfCBXUklURSwgJmt2ZWMsIDEsIGxlbik7CiAKIAlmaWxlX3N0YXJ0X3dyaXRlKGZpbGUpOwotCXNldF9mcyhnZXRfZHMoKSk7Ci0JYncgPSBmaWxlLT5mX29wLT53cml0ZShmaWxlLCBidWYsIGxlbiwgJnBvcyk7Ci0Jc2V0X2ZzKG9sZF9mcyk7CisJYncgPSB2ZnNfaXRlcl93cml0ZShmaWxlLCAmZnJvbSwgJnBvcyk7CiAJZmlsZV9lbmRfd3JpdGUoZmlsZSk7CiAJaWYgKGxpa2VseShidyA9PSBsZW4pKQogCQlyZXR1cm4gMDsKQEAgLTc2Nyw3ICs3NjksNyBAQAogCQlnb3RvIG91dF9wdXRmOwogCiAJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHx8ICEobW9kZSAmIEZNT0RFX1dSSVRFKSB8fAotCSAgICAhZmlsZS0+Zl9vcC0+d3JpdGUpCisJICAgICFmaWxlLT5mX29wLT53cml0ZV9pdGVyKQogCQlsb19mbGFncyB8PSBMT19GTEFHU19SRUFEX09OTFk7CiAKIAlsb19ibG9ja3NpemUgPSBTX0lTQkxLKGlub2RlLT5pX21vZGUpID8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svbmJkLmMgYi9kcml2ZXJzL2Jsb2NrL25iZC5jCmluZGV4IDRiYzJhNWMuLmE5OGM0MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svbmJkLmMKKysrIGIvZHJpdmVycy9ibG9jay9uYmQuYwpAQCAtODAzLDEwICs4MDMsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQluYmRfZGV2ID0ga2NhbGxvYyhuYmRzX21heCwgc2l6ZW9mKCpuYmRfZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuYmRfZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQogCXBhcnRfc2hpZnQgPSAwOwogCWlmIChtYXhfcGFydCA+IDApIHsKIAkJcGFydF9zaGlmdCA9IGZscyhtYXhfcGFydCk7CkBAIC04MjgsNiArODI0LDEwIEBACiAJaWYgKG5iZHNfbWF4ID4gMVVMIDw8IChNSU5PUkJJVFMgLSBwYXJ0X3NoaWZ0KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwluYmRfZGV2ID0ga2NhbGxvYyhuYmRzX21heCwgc2l6ZW9mKCpuYmRfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYmRfZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKwogCWZvciAoaSA9IDA7IGkgPCBuYmRzX21heDsgaSsrKSB7CiAJCXN0cnVjdCBnZW5kaXNrICpkaXNrID0gYWxsb2NfZGlzaygxIDw8IHBhcnRfc2hpZnQpOwogCQlpZiAoIWRpc2spCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL252bWUtY29yZS5jIGIvZHJpdmVycy9ibG9jay9udm1lLWNvcmUuYwppbmRleCBjZWIzMmRkLi5lMjNiZTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL252bWUtY29yZS5jCisrKyBiL2RyaXZlcnMvYmxvY2svbnZtZS1jb3JlLmMKQEAgLTMwMDMsNiArMzAwMyw3IEBACiAJfQogCWdldF9kZXZpY2UoZGV2LT5kZXZpY2UpOwogCisJSU5JVF9MSVNUX0hFQUQoJmRldi0+bm9kZSk7CiAJSU5JVF9XT1JLKCZkZXYtPnByb2JlX3dvcmssIG52bWVfYXN5bmNfcHJvYmUpOwogCXNjaGVkdWxlX3dvcmsoJmRldi0+cHJvYmVfd29yayk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZy5jIGIvZHJpdmVycy9ibG9jay9wYXJpZGUvcGcuYwppbmRleCAyY2UzZGZkLi44NzZkMGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3BhcmlkZS9wZy5jCisrKyBiL2RyaXZlcnMvYmxvY2svcGFyaWRlL3BnLmMKQEAgLTEzNyw3ICsxMzcsNyBAQAogCiAqLwogCi1zdGF0aWMgYm9vbCB2ZXJib3NlID0gMDsKK3N0YXRpYyBpbnQgdmVyYm9zZTsKIHN0YXRpYyBpbnQgbWFqb3IgPSBQR19NQUpPUjsKIHN0YXRpYyBjaGFyICpuYW1lID0gUEdfTkFNRTsKIHN0YXRpYyBpbnQgZGlzYWJsZSA9IDA7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKLW1vZHVsZV9wYXJhbSh2ZXJib3NlLCBib29sLCAwNjQ0KTsKK21vZHVsZV9wYXJhbSh2ZXJib3NlLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKG1ham9yLCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKG5hbWUsIGNoYXJwLCAwKTsKIG1vZHVsZV9wYXJhbV9hcnJheShkcml2ZTAsIGludCwgTlVMTCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3pyYW0venJhbV9kcnYuYyBiL2RyaXZlcnMvYmxvY2svenJhbS96cmFtX2Rydi5jCmluZGV4IDg3MWJkMzUuLmM5NDM4NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svenJhbS96cmFtX2Rydi5jCisrKyBiL2RyaXZlcnMvYmxvY2svenJhbS96cmFtX2Rydi5jCkBAIC00MywxMSArNDMsMjIgQEAKIC8qIE1vZHVsZSBwYXJhbXMgKGRvY3VtZW50YXRpb24gYXQgZW5kKSAqLwogc3RhdGljIHVuc2lnbmVkIGludCBudW1fZGV2aWNlcyA9IDE7CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXByZWNhdGVkX2F0dHJfd2Fybihjb25zdCBjaGFyICpuYW1lKQoreworCXByX3dhcm5fb25jZSgiJWQgKCVzKSBBdHRyaWJ1dGUgJXMgKGFuZCBvdGhlcnMpIHdpbGwgYmUgcmVtb3ZlZC4gJXNcbiIsCisJCQl0YXNrX3BpZF9ucihjdXJyZW50KSwKKwkJCWN1cnJlbnQtPmNvbW0sCisJCQluYW1lLAorCQkJIlNlZSB6cmFtIGRvY3VtZW50YXRpb24uIik7Cit9CisKICNkZWZpbmUgWlJBTV9BVFRSX1JPKG5hbWUpCQkJCQkJXAogc3RhdGljIHNzaXplX3QgbmFtZSMjX3Nob3coc3RydWN0IGRldmljZSAqZCwJCVwKIAkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYikJXAogewkJCQkJCQkJCVwKIAlzdHJ1Y3QgenJhbSAqenJhbSA9IGRldl90b196cmFtKGQpOwkJCQlcCisJCQkJCQkJCQlcCisJZGVwcmVjYXRlZF9hdHRyX3dhcm4oX19zdHJpbmdpZnkobmFtZSkpOwkJCVwKIAlyZXR1cm4gc2NucHJpbnRmKGIsIFBBR0VfU0laRSwgIiVsbHVcbiIsCQkJXAogCQkodTY0KWF0b21pYzY0X3JlYWQoJnpyYW0tPnN0YXRzLm5hbWUpKTsJCQlcCiB9CQkJCQkJCQkJXApAQCAtODksNiArMTAwLDcgQEAKIHsKIAlzdHJ1Y3QgenJhbSAqenJhbSA9IGRldl90b196cmFtKGRldik7CiAKKwlkZXByZWNhdGVkX2F0dHJfd2Fybigib3JpZ19kYXRhX3NpemUiKTsKIAlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWxsdVxuIiwKIAkJKHU2NCkoYXRvbWljNjRfcmVhZCgmenJhbS0+c3RhdHMucGFnZXNfc3RvcmVkKSkgPDwgUEFHRV9TSElGVCk7CiB9CkBAIC05OSw2ICsxMTEsNyBAQAogCXU2NCB2YWwgPSAwOwogCXN0cnVjdCB6cmFtICp6cmFtID0gZGV2X3RvX3pyYW0oZGV2KTsKIAorCWRlcHJlY2F0ZWRfYXR0cl93YXJuKCJtZW1fdXNlZF90b3RhbCIpOwogCWRvd25fcmVhZCgmenJhbS0+aW5pdF9sb2NrKTsKIAlpZiAoaW5pdF9kb25lKHpyYW0pKSB7CiAJCXN0cnVjdCB6cmFtX21ldGEgKm1ldGEgPSB6cmFtLT5tZXRhOwpAQCAtMTI4LDYgKzE0MSw3IEBACiAJdTY0IHZhbDsKIAlzdHJ1Y3QgenJhbSAqenJhbSA9IGRldl90b196cmFtKGRldik7CiAKKwlkZXByZWNhdGVkX2F0dHJfd2FybigibWVtX2xpbWl0Iik7CiAJZG93bl9yZWFkKCZ6cmFtLT5pbml0X2xvY2spOwogCXZhbCA9IHpyYW0tPmxpbWl0X3BhZ2VzOwogCXVwX3JlYWQoJnpyYW0tPmluaXRfbG9jayk7CkBAIC0xNTksNiArMTczLDcgQEAKIAl1NjQgdmFsID0gMDsKIAlzdHJ1Y3QgenJhbSAqenJhbSA9IGRldl90b196cmFtKGRldik7CiAKKwlkZXByZWNhdGVkX2F0dHJfd2FybigibWVtX3VzZWRfbWF4Iik7CiAJZG93bl9yZWFkKCZ6cmFtLT5pbml0X2xvY2spOwogCWlmIChpbml0X2RvbmUoenJhbSkpCiAJCXZhbCA9IGF0b21pY19sb25nX3JlYWQoJnpyYW0tPnN0YXRzLm1heF91c2VkX3BhZ2VzKTsKQEAgLTY3MCw4ICs2ODUsMTIgQEAKIHN0YXRpYyBpbnQgenJhbV9idmVjX3J3KHN0cnVjdCB6cmFtICp6cmFtLCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywgdTMyIGluZGV4LAogCQkJaW50IG9mZnNldCwgaW50IHJ3KQogeworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSA9IGppZmZpZXM7CiAJaW50IHJldDsKIAorCWdlbmVyaWNfc3RhcnRfaW9fYWNjdChydywgYnZlYy0+YnZfbGVuID4+IFNFQ1RPUl9TSElGVCwKKwkJCSZ6cmFtLT5kaXNrLT5wYXJ0MCk7CisKIAlpZiAocncgPT0gUkVBRCkgewogCQlhdG9taWM2NF9pbmMoJnpyYW0tPnN0YXRzLm51bV9yZWFkcyk7CiAJCXJldCA9IHpyYW1fYnZlY19yZWFkKHpyYW0sIGJ2ZWMsIGluZGV4LCBvZmZzZXQpOwpAQCAtNjgwLDYgKzY5OSw4IEBACiAJCXJldCA9IHpyYW1fYnZlY193cml0ZSh6cmFtLCBidmVjLCBpbmRleCwgb2Zmc2V0KTsKIAl9CiAKKwlnZW5lcmljX2VuZF9pb19hY2N0KHJ3LCAmenJhbS0+ZGlzay0+cGFydDAsIHN0YXJ0X3RpbWUpOworCiAJaWYgKHVubGlrZWx5KHJldCkpIHsKIAkJaWYgKHJ3ID09IFJFQUQpCiAJCQlhdG9taWM2NF9pbmMoJnpyYW0tPnN0YXRzLmZhaWxlZF9yZWFkcyk7CkBAIC0xMDI3LDYgKzEwNDgsNTUgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhtYXhfY29tcF9zdHJlYW1zKTsKIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhjb21wX2FsZ29yaXRobSk7CiAKK3N0YXRpYyBzc2l6ZV90IGlvX3N0YXRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHpyYW0gKnpyYW0gPSBkZXZfdG9fenJhbShkZXYpOworCXNzaXplX3QgcmV0OworCisJZG93bl9yZWFkKCZ6cmFtLT5pbml0X2xvY2spOworCXJldCA9IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwKKwkJCSIlOGxsdSAlOGxsdSAlOGxsdSAlOGxsdVxuIiwKKwkJCSh1NjQpYXRvbWljNjRfcmVhZCgmenJhbS0+c3RhdHMuZmFpbGVkX3JlYWRzKSwKKwkJCSh1NjQpYXRvbWljNjRfcmVhZCgmenJhbS0+c3RhdHMuZmFpbGVkX3dyaXRlcyksCisJCQkodTY0KWF0b21pYzY0X3JlYWQoJnpyYW0tPnN0YXRzLmludmFsaWRfaW8pLAorCQkJKHU2NClhdG9taWM2NF9yZWFkKCZ6cmFtLT5zdGF0cy5ub3RpZnlfZnJlZSkpOworCXVwX3JlYWQoJnpyYW0tPmluaXRfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBtbV9zdGF0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB6cmFtICp6cmFtID0gZGV2X3RvX3pyYW0oZGV2KTsKKwl1NjQgb3JpZ19zaXplLCBtZW1fdXNlZCA9IDA7CisJbG9uZyBtYXhfdXNlZDsKKwlzc2l6ZV90IHJldDsKKworCWRvd25fcmVhZCgmenJhbS0+aW5pdF9sb2NrKTsKKwlpZiAoaW5pdF9kb25lKHpyYW0pKQorCQltZW1fdXNlZCA9IHpzX2dldF90b3RhbF9wYWdlcyh6cmFtLT5tZXRhLT5tZW1fcG9vbCk7CisKKwlvcmlnX3NpemUgPSBhdG9taWM2NF9yZWFkKCZ6cmFtLT5zdGF0cy5wYWdlc19zdG9yZWQpOworCW1heF91c2VkID0gYXRvbWljX2xvbmdfcmVhZCgmenJhbS0+c3RhdHMubWF4X3VzZWRfcGFnZXMpOworCisJcmV0ID0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLAorCQkJIiU4bGx1ICU4bGx1ICU4bGx1ICU4bHUgJThsZCAlOGxsdSAlOGxsdVxuIiwKKwkJCW9yaWdfc2l6ZSA8PCBQQUdFX1NISUZULAorCQkJKHU2NClhdG9taWM2NF9yZWFkKCZ6cmFtLT5zdGF0cy5jb21wcl9kYXRhX3NpemUpLAorCQkJbWVtX3VzZWQgPDwgUEFHRV9TSElGVCwKKwkJCXpyYW0tPmxpbWl0X3BhZ2VzIDw8IFBBR0VfU0hJRlQsCisJCQltYXhfdXNlZCA8PCBQQUdFX1NISUZULAorCQkJKHU2NClhdG9taWM2NF9yZWFkKCZ6cmFtLT5zdGF0cy56ZXJvX3BhZ2VzKSwKKwkJCSh1NjQpYXRvbWljNjRfcmVhZCgmenJhbS0+c3RhdHMubnVtX21pZ3JhdGVkKSk7CisJdXBfcmVhZCgmenJhbS0+aW5pdF9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhpb19zdGF0KTsKK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhtbV9zdGF0KTsKIFpSQU1fQVRUUl9STyhudW1fcmVhZHMpOwogWlJBTV9BVFRSX1JPKG51bV93cml0ZXMpOwogWlJBTV9BVFRSX1JPKGZhaWxlZF9yZWFkcyk7CkBAIC0xMDU0LDYgKzExMjQsOCBAQAogCSZkZXZfYXR0cl9tZW1fdXNlZF9tYXguYXR0ciwKIAkmZGV2X2F0dHJfbWF4X2NvbXBfc3RyZWFtcy5hdHRyLAogCSZkZXZfYXR0cl9jb21wX2FsZ29yaXRobS5hdHRyLAorCSZkZXZfYXR0cl9pb19zdGF0LmF0dHIsCisJJmRldl9hdHRyX21tX3N0YXQuYXR0ciwKIAlOVUxMLAogfTsKIApAQCAtMTA4Miw2ICsxMTU0LDcgQEAKIAlpZiAoIXpyYW0tPmRpc2spIHsKIAkJcHJfd2FybigiRXJyb3IgYWxsb2NhdGluZyBkaXNrIHN0cnVjdHVyZSBmb3IgZGV2aWNlICVkXG4iLAogCQkJZGV2aWNlX2lkKTsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXRfZnJlZV9xdWV1ZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svenJhbS96cmFtX2Rydi5oIGIvZHJpdmVycy9ibG9jay96cmFtL3pyYW1fZHJ2LmgKaW5kZXggMTcwNTZlNS4uNTcwYzU5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay96cmFtL3pyYW1fZHJ2LmgKKysrIGIvZHJpdmVycy9ibG9jay96cmFtL3pyYW1fZHJ2LmgKQEAgLTg0LDYgKzg0LDcgQEAKIAlhdG9taWM2NF90IGNvbXByX2RhdGFfc2l6ZTsJLyogY29tcHJlc3NlZCBzaXplIG9mIHBhZ2VzIHN0b3JlZCAqLwogCWF0b21pYzY0X3QgbnVtX3JlYWRzOwkvKiBmYWlsZWQgKyBzdWNjZXNzZnVsICovCiAJYXRvbWljNjRfdCBudW1fd3JpdGVzOwkvKiAtLWRvLS0gKi8KKwlhdG9taWM2NF90IG51bV9taWdyYXRlZDsJLyogbm8uIG9mIG1pZ3JhdGVkIG9iamVjdCAqLwogCWF0b21pYzY0X3QgZmFpbGVkX3JlYWRzOwkvKiBjYW4gaGFwcGVuIHdoZW4gbWVtb3J5IGlzIHRvbyBsb3cgKi8KIAlhdG9taWM2NF90IGZhaWxlZF93cml0ZXM7CS8qIGNhbiBoYXBwZW4gd2hlbiBtZW1vcnkgaXMgdG9vIGxvdyAqLwogCWF0b21pYzY0X3QgaW52YWxpZF9pbzsJLyogbm9uLXBhZ2UtYWxpZ25lZCBJL08gcmVxdWVzdHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL0tjb25maWcgYi9kcml2ZXJzL2JsdWV0b290aC9LY29uZmlnCmluZGV4IDM2NGYwODAuLmVkNWMyNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL0tjb25maWcKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvS2NvbmZpZwpAQCAtMiw5ICsyLDE3IEBACiBtZW51ICJCbHVldG9vdGggZGV2aWNlIGRyaXZlcnMiCiAJZGVwZW5kcyBvbiBCVAogCitjb25maWcgQlRfSU5URUwKKwl0cmlzdGF0ZQorCitjb25maWcgQlRfQkNNCisJdHJpc3RhdGUKKwlzZWxlY3QgRldfTE9BREVSCisKIGNvbmZpZyBCVF9IQ0lCVFVTQgogCXRyaXN0YXRlICJIQ0kgVVNCIGRyaXZlciIKIAlkZXBlbmRzIG9uIFVTQgorCXNlbGVjdCBCVF9JTlRFTAogCWhlbHAKIAkgIEJsdWV0b290aCBIQ0kgVVNCIGRyaXZlci4KIAkgIFRoaXMgZHJpdmVyIGlzIHJlcXVpcmVkIGlmIHlvdSB3YW50IHRvIHVzZSBCbHVldG9vdGggZGV2aWNlcyB3aXRoCkBAIC0xMyw2ICsyMSwxNyBAQAogCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIHN1cHBvcnQgZm9yIEJsdWV0b290aCBVU0IgZGV2aWNlcyBpbnRvIHRoZQogCSAga2VybmVsIG9yIHNheSBNIHRvIGNvbXBpbGUgaXQgYXMgbW9kdWxlIChidHVzYikuCiAKK2NvbmZpZyBCVF9IQ0lCVFVTQl9CQ00KKwlib29sICJCcm9hZGNvbSBwcm90b2NvbCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQlRfSENJQlRVU0IKKwlzZWxlY3QgQlRfQkNNCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIEJyb2FkY29tIHByb3RvY29sIHN1cHBvcnQgZW5hYmxlcyBmaXJtd2FyZSBhbmQgcGF0Y2hyYW0KKwkgIGRvd25sb2FkIHN1cHBvcnQgZm9yIEJyb2FkY29tIEJsdWV0b290aCBjb250cm9sbGVycy4KKworCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIHN1cHBvcnQgZm9yIEJyb2FkY29tIHByb3RvY29sLgorCiBjb25maWcgQlRfSENJQlRTRElPCiAJdHJpc3RhdGUgIkhDSSBTRElPIGRyaXZlciIKIAlkZXBlbmRzIG9uIE1NQwpAQCAtNjIsNiArODEsNyBAQAogY29uZmlnIEJUX0hDSVVBUlRfQVRIM0sKIAlib29sICJBdGhlcm9zIEFSMzAweCBzZXJpYWwgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEJUX0hDSVVBUlQKKwlzZWxlY3QgQlRfSENJVUFSVF9INAogCWhlbHAKIAkgIEhDSUFUSDNLIChIQ0kgQXRoZXJvcyBBUjMwMHgpIGlzIGEgc2VyaWFsIHByb3RvY29sIGZvcgogCSAgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGhvc3QgYW5kIEF0aGVyb3MgQVIzMDB4IEJsdWV0b290aCBkZXZpY2VzLgpAQCAtOTQsNiArMTE0LDI3IEBACiAKIAkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBzdXBwb3J0IGZvciBUaHJlZS13aXJlIFVBUlQgcHJvdG9jb2wuCiAKK2NvbmZpZyBCVF9IQ0lVQVJUX0lOVEVMCisJYm9vbCAiSW50ZWwgcHJvdG9jb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJUX0hDSVVBUlQKKwlzZWxlY3QgQlRfSU5URUwKKwloZWxwCisJICBUaGUgSW50ZWwgcHJvdG9jb2wgc3VwcG9ydCBlbmFibGVzIEJsdWV0b290aCBIQ0kgb3ZlciBzZXJpYWwKKwkgIHBvcnQgaW50ZXJmYWNlIGZvciBJbnRlbCBCbHVldG9vdGggY29udHJvbGxlcnMuCisKKwkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBzdXBwb3J0IGZvciBJbnRlbCBwcm90b2NvbC4KKworY29uZmlnIEJUX0hDSVVBUlRfQkNNCisJYm9vbCAiQnJvYWRjb20gcHJvdG9jb2wgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEJUX0hDSVVBUlQKKwlzZWxlY3QgQlRfSENJVUFSVF9INAorCXNlbGVjdCBCVF9CQ00KKwloZWxwCisJICBUaGUgQnJvYWRjb20gcHJvdG9jb2wgc3VwcG9ydCBlbmFibGVzIEJsdWV0b290aCBIQ0kgb3ZlciBzZXJpYWwKKwkgIHBvcnQgaW50ZXJmYWNlIGZvciBCcm9hZGNvbSBCbHVldG9vdGggY29udHJvbGxlcnMuCisKKwkgIFNheSBZIGhlcmUgdG8gY29tcGlsZSBzdXBwb3J0IGZvciBCcm9hZGNvbSBwcm90b2NvbC4KKwogY29uZmlnIEJUX0hDSUJDTTIwM1gKIAl0cmlzdGF0ZSAiSENJIEJDTTIwM3ggVVNCIGRyaXZlciIKIAlkZXBlbmRzIG9uIFVTQgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvTWFrZWZpbGUgYi9kcml2ZXJzL2JsdWV0b290aC9NYWtlZmlsZQppbmRleCA5ZmU4YTg3Li5kZDBkOWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2JsdWV0b290aC9NYWtlZmlsZQpAQCAtMTUsMTAgKzE1LDEyIEBACiBvYmotJChDT05GSUdfQlRfSENJQlRVU0IpCSs9IGJ0dXNiLm8KIG9iai0kKENPTkZJR19CVF9IQ0lCVFNESU8pCSs9IGJ0c2Rpby5vCiAKK29iai0kKENPTkZJR19CVF9JTlRFTCkJCSs9IGJ0aW50ZWwubwogb2JqLSQoQ09ORklHX0JUX0FUSDNLKQkJKz0gYXRoM2subwogb2JqLSQoQ09ORklHX0JUX01SVkwpCQkrPSBidG1ydmwubwogb2JqLSQoQ09ORklHX0JUX01SVkxfU0RJTykJKz0gYnRtcnZsX3NkaW8ubwogb2JqLSQoQ09ORklHX0JUX1dJTElOSykJCSs9IGJ0d2lsaW5rLm8KK29iai0kKENPTkZJR19CVF9CQ00pCQkrPSBidGJjbS5vCiAKIGJ0bXJ2bC15CQkJOj0gYnRtcnZsX21haW4ubwogYnRtcnZsLSQoQ09ORklHX0RFQlVHX0ZTKQkrPSBidG1ydmxfZGVidWdmcy5vCkBAIC0yOSw2ICszMSw4IEBACiBoY2lfdWFydC0kKENPTkZJR19CVF9IQ0lVQVJUX0xMKQkrPSBoY2lfbGwubwogaGNpX3VhcnQtJChDT05GSUdfQlRfSENJVUFSVF9BVEgzSykJKz0gaGNpX2F0aC5vCiBoY2lfdWFydC0kKENPTkZJR19CVF9IQ0lVQVJUXzNXSVJFKQkrPSBoY2lfaDUubworaGNpX3VhcnQtJChDT05GSUdfQlRfSENJVUFSVF9JTlRFTCkJKz0gaGNpX2ludGVsLm8KK2hjaV91YXJ0LSQoQ09ORklHX0JUX0hDSVVBUlRfQkNNKQkrPSBoY2lfYmNtLm8KIGhjaV91YXJ0LW9ianMJCQkJOj0gJChoY2lfdWFydC15KQogCiBjY2ZsYWdzLXkgKz0gLURfX0NIRUNLX0VORElBTl9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9hdGgzay5jIGIvZHJpdmVycy9ibHVldG9vdGgvYXRoM2suYwppbmRleCBkZTRjODQ5Li4yODg1NDdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9hdGgzay5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2F0aDNrLmMKQEAgLTY1LDYgKzY1LDcgQEAKIAkvKiBBdGhlcm9zIEFSMzAxMSB3aXRoIHNmbGFzaCBmaXJtd2FyZSovCiAJeyBVU0JfREVWSUNFKDB4MDQ4OSwgMHhFMDI3KSB9LAogCXsgVVNCX0RFVklDRSgweDA0ODksIDB4RTAzRCkgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNEYyLCAweEFGRjEpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDkzMCwgMHgwMjE1KSB9LAogCXsgVVNCX0RFVklDRSgweDBDRjMsIDB4MzAwMikgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwQ0YzLCAweEUwMTkpIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idGJjbS5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnRiY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDc0MWYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRiY20uYwpAQCAtMCwwICsxLDM4NyBAQAorLyoKKyAqCisgKiAgQmx1ZXRvb3RoIHN1cHBvcnQgZm9yIEJyb2FkY29tIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE1ICBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisKKyNpbmNsdWRlICJidGJjbS5oIgorCisjZGVmaW5lIFZFUlNJT04gIjAuMSIKKworI2RlZmluZSBCREFERFJfQkNNMjA3MDJBMCAoJihiZGFkZHJfdCkge3sweDAwLCAweGEwLCAweDAyLCAweDcwLCAweDIwLCAweDAwfX0pCisKK2ludCBidGJjbV9jaGVja19iZGFkZHIoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IGhjaV9ycF9yZWFkX2JkX2FkZHIgKmJkYTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gX19oY2lfY21kX3N5bmMoaGRldiwgSENJX09QX1JFQURfQkRfQUREUiwgMCwgTlVMTCwKKwkJCSAgICAgSENJX0lOSVRfVElNRU9VVCk7CisJaWYgKElTX0VSUihza2IpKSB7CisJCWludCBlcnIgPSBQVFJfRVJSKHNrYik7CisJCUJUX0VSUigiJXM6IEJDTTogUmVhZGluZyBkZXZpY2UgYWRkcmVzcyBmYWlsZWQgKCVkKSIsCisJCSAgICAgICBoZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChza2ItPmxlbiAhPSBzaXplb2YoKmJkYSkpIHsKKwkJQlRfRVJSKCIlczogQkNNOiBEZXZpY2UgYWRkcmVzcyBsZW5ndGggbWlzbWF0Y2giLCBoZGV2LT5uYW1lKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRUlPOworCX0KKworCWJkYSA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfYmRfYWRkciAqKXNrYi0+ZGF0YTsKKwlpZiAoYmRhLT5zdGF0dXMpIHsKKwkJQlRfRVJSKCIlczogQkNNOiBEZXZpY2UgYWRkcmVzcyByZXN1bHQgZmFpbGVkICglMDJ4KSIsCisJCSAgICAgICBoZGV2LT5uYW1lLCBiZGEtPnN0YXR1cyk7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLWJ0X3RvX2Vycm5vKGJkYS0+c3RhdHVzKTsKKwl9CisKKwkvKiBUaGUgYWRkcmVzcyAwMDoyMDo3MDowMjpBMDowMCBpbmRpY2F0ZXMgYSBCQ00yMDcwMkEwIGNvbnRyb2xsZXIKKwkgKiB3aXRoIG5vIGNvbmZpZ3VyZWQgYWRkcmVzcy4KKwkgKi8KKwlpZiAoIWJhY21wKCZiZGEtPmJkYWRkciwgQkRBRERSX0JDTTIwNzAyQTApKSB7CisJCUJUX0lORk8oIiVzOiBCQ006IFVzaW5nIGRlZmF1bHQgZGV2aWNlIGFkZHJlc3MgKCVwTVIpIiwKKwkJCWhkZXYtPm5hbWUsICZiZGEtPmJkYWRkcik7CisJCXNldF9iaXQoSENJX1FVSVJLX0lOVkFMSURfQkRBRERSLCAmaGRldi0+cXVpcmtzKTsKKwl9CisKKwlrZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnRiY21fY2hlY2tfYmRhZGRyKTsKKworaW50IGJ0YmNtX3NldF9iZGFkZHIoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGNvbnN0IGJkYWRkcl90ICpiZGFkZHIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZXJyOworCisJc2tiID0gX19oY2lfY21kX3N5bmMoaGRldiwgMHhmYzAxLCA2LCBiZGFkZHIsIEhDSV9JTklUX1RJTUVPVVQpOworCWlmIChJU19FUlIoc2tiKSkgeworCQllcnIgPSBQVFJfRVJSKHNrYik7CisJCUJUX0VSUigiJXM6IEJDTTogQ2hhbmdlIGFkZHJlc3MgY29tbWFuZCBmYWlsZWQgKCVkKSIsCisJCSAgICAgICBoZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwlrZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnRiY21fc2V0X2JkYWRkcik7CisKK3N0YXRpYyBpbnQgYnRiY21fcmVzZXQoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IF9faGNpX2NtZF9zeW5jKGhkZXYsIEhDSV9PUF9SRVNFVCwgMCwgTlVMTCwgSENJX0lOSVRfVElNRU9VVCk7CisJaWYgKElTX0VSUihza2IpKSB7CisJCWludCBlcnIgPSBQVFJfRVJSKHNrYik7CisJCUJUX0VSUigiJXM6IEJDTTogUmVzZXQgZmFpbGVkICglZCkiLCBoZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwlrZnJlZV9za2Ioc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmJ0YmNtX3JlYWRfbG9jYWxfdmVyc2lvbihzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJc2tiID0gX19oY2lfY21kX3N5bmMoaGRldiwgSENJX09QX1JFQURfTE9DQUxfVkVSU0lPTiwgMCwgTlVMTCwKKwkJCSAgICAgSENJX0lOSVRfVElNRU9VVCk7CisJaWYgKElTX0VSUihza2IpKSB7CisJCUJUX0VSUigiJXM6IEJDTTogUmVhZGluZyBsb2NhbCB2ZXJzaW9uIGluZm8gZmFpbGVkICglbGQpIiwKKwkJICAgICAgIGhkZXYtPm5hbWUsIFBUUl9FUlIoc2tiKSk7CisJCXJldHVybiBza2I7CisJfQorCisJaWYgKHNrYi0+bGVuICE9IHNpemVvZihzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfdmVyc2lvbikpIHsKKwkJQlRfRVJSKCIlczogQkNNOiBMb2NhbCB2ZXJzaW9uIGxlbmd0aCBtaXNtYXRjaCIsIGhkZXYtPm5hbWUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpidGJjbV9yZWFkX3ZlcmJvc2VfY29uZmlnKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCAweGZjNzksIDAsIE5VTEwsIEhDSV9JTklUX1RJTUVPVVQpOworCWlmIChJU19FUlIoc2tiKSkgeworCQlCVF9FUlIoIiVzOiBCQ006IFJlYWQgdmVyYm9zZSBjb25maWcgaW5mbyBmYWlsZWQgKCVsZCkiLAorCQkgICAgICAgaGRldi0+bmFtZSwgUFRSX0VSUihza2IpKTsKKwkJcmV0dXJuIHNrYjsKKwl9CisKKwlpZiAoc2tiLT5sZW4gIT0gNykgeworCQlCVF9FUlIoIiVzOiBCQ006IFZlcmJvc2UgY29uZmlnIGxlbmd0aCBtaXNtYXRjaCIsIGhkZXYtPm5hbWUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpidGJjbV9yZWFkX3VzYl9wcm9kdWN0KHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCAweGZjNWEsIDAsIE5VTEwsIEhDSV9JTklUX1RJTUVPVVQpOworCWlmIChJU19FUlIoc2tiKSkgeworCQlCVF9FUlIoIiVzOiBCQ006IFJlYWQgVVNCIHByb2R1Y3QgaW5mbyBmYWlsZWQgKCVsZCkiLAorCQkgICAgICAgaGRldi0+bmFtZSwgUFRSX0VSUihza2IpKTsKKwkJcmV0dXJuIHNrYjsKKwl9CisKKwlpZiAoc2tiLT5sZW4gIT0gNSkgeworCQlCVF9FUlIoIiVzOiBCQ006IFVTQiBwcm9kdWN0IGxlbmd0aCBtaXNtYXRjaCIsIGhkZXYtPm5hbWUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQorCisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdTE2IHN1YnZlcjsKKwljb25zdCBjaGFyICpuYW1lOworfSBiY21fdWFydF9zdWJ2ZXJfdGFibGVbXSA9IHsKKwl7IDB4NDEwZSwgIkJDTTQzMzQxQjAiCX0sCS8qIDAwMi4wMDEuMDE0ICovCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1MTYgc3VidmVyOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9IGJjbV91c2Jfc3VidmVyX3RhYmxlW10gPSB7CisJeyAweDIxMGIsICJCQ000MzE0MkEwIgl9LAkvKiAwMDEuMDAxLjAxMSAqLworCXsgMHgyMTEyLCAiQkNNNDMxNEEwIgl9LAkvKiAwMDEuMDAxLjAxOCAqLworCXsgMHgyMTE4LCAiQkNNMjA3MDJBMCIJfSwJLyogMDAxLjAwMS4wMjQgKi8KKwl7IDB4MjEyNiwgIkJDTTQzMzVBMCIJfSwJLyogMDAxLjAwMS4wMzggKi8KKwl7IDB4MjIwZSwgIkJDTTIwNzAyQTEiCX0sCS8qIDAwMS4wMDIuMDE0ICovCisJeyAweDIzMGYsICJCQ000MzU0QTIiCX0sCS8qIDAwMS4wMDMuMDE1ICovCisJeyAweDQxMDYsICJCQ000MzM1QjAiCX0sCS8qIDAwMi4wMDEuMDA2ICovCisJeyAweDQxMGUsICJCQ00yMDcwMkIwIgl9LAkvKiAwMDIuMDAxLjAxNCAqLworCXsgMHg2MTA5LCAiQkNNNDMzNUMwIgl9LAkvKiAwMDMuMDAxLjAwOSAqLworCXsgMHg2MTBjLCAiQkNNNDM1NCIJfSwJLyogMDAzLjAwMS4wMTIgKi8KKwl7IH0KK307CisKK2ludCBidGJjbV9zZXR1cF9wYXRjaHJhbShzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwljb25zdCBzdHJ1Y3QgaGNpX2NvbW1hbmRfaGRyICpjbWQ7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKKwljb25zdCB1OCAqZndfcHRyOworCXNpemVfdCBmd19zaXplOworCWNoYXIgZndfbmFtZVs2NF07CisJdTE2IG9wY29kZSwgc3VidmVyLCByZXYsIHBpZCwgdmlkOworCWNvbnN0IGNoYXIgKmh3X25hbWUgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGhjaV9ycF9yZWFkX2xvY2FsX3ZlcnNpb24gKnZlcjsKKwlpbnQgaSwgZXJyOworCisJLyogUmVzZXQgKi8KKwllcnIgPSBidGJjbV9yZXNldChoZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogUmVhZCBMb2NhbCBWZXJzaW9uIEluZm8gKi8KKwlza2IgPSBidGJjbV9yZWFkX2xvY2FsX3ZlcnNpb24oaGRldik7CisJaWYgKElTX0VSUihza2IpKQorCQlyZXR1cm4gUFRSX0VSUihza2IpOworCisJdmVyID0gKHN0cnVjdCBoY2lfcnBfcmVhZF9sb2NhbF92ZXJzaW9uICopc2tiLT5kYXRhOworCXJldiA9IGxlMTZfdG9fY3B1KHZlci0+aGNpX3Jldik7CisJc3VidmVyID0gbGUxNl90b19jcHUodmVyLT5sbXBfc3VidmVyKTsKKwlrZnJlZV9za2Ioc2tiKTsKKworCS8qIFJlYWQgVmVyYm9zZSBDb25maWcgVmVyc2lvbiBJbmZvICovCisJc2tiID0gYnRiY21fcmVhZF92ZXJib3NlX2NvbmZpZyhoZGV2KTsKKwlpZiAoSVNfRVJSKHNrYikpCisJCXJldHVybiBQVFJfRVJSKHNrYik7CisKKwlCVF9JTkZPKCIlczogQkNNOiBjaGlwIGlkICV1IiwgaGRldi0+bmFtZSwgc2tiLT5kYXRhWzFdKTsKKwlrZnJlZV9za2Ioc2tiKTsKKworCXN3aXRjaCAoKHJldiAmIDB4ZjAwMCkgPj4gMTIpIHsKKwljYXNlIDA6CisJCWZvciAoaSA9IDA7IGJjbV91YXJ0X3N1YnZlcl90YWJsZVtpXS5uYW1lOyBpKyspIHsKKwkJCWlmIChzdWJ2ZXIgPT0gYmNtX3VhcnRfc3VidmVyX3RhYmxlW2ldLnN1YnZlcikgeworCQkJCWh3X25hbWUgPSBiY21fdWFydF9zdWJ2ZXJfdGFibGVbaV0ubmFtZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXNucHJpbnRmKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgImJyY20vJXMuaGNkIiwKKwkJCSBod19uYW1lID8gOiAiQkNNIik7CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDI6CisJCS8qIFJlYWQgVVNCIFByb2R1Y3QgSW5mbyAqLworCQlza2IgPSBidGJjbV9yZWFkX3VzYl9wcm9kdWN0KGhkZXYpOworCQlpZiAoSVNfRVJSKHNrYikpCisJCQlyZXR1cm4gUFRSX0VSUihza2IpOworCisJCXZpZCA9IGdldF91bmFsaWduZWRfbGUxNihza2ItPmRhdGEgKyAxKTsKKwkJcGlkID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHNrYi0+ZGF0YSArIDMpOworCQlrZnJlZV9za2Ioc2tiKTsKKworCQlmb3IgKGkgPSAwOyBiY21fdXNiX3N1YnZlcl90YWJsZVtpXS5uYW1lOyBpKyspIHsKKwkJCWlmIChzdWJ2ZXIgPT0gYmNtX3VzYl9zdWJ2ZXJfdGFibGVbaV0uc3VidmVyKSB7CisJCQkJaHdfbmFtZSA9IGJjbV91c2Jfc3VidmVyX3RhYmxlW2ldLm5hbWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlzbnByaW50Zihmd19uYW1lLCBzaXplb2YoZndfbmFtZSksICJicmNtLyVzLSU0LjR4LSU0LjR4LmhjZCIsCisJCQkgaHdfbmFtZSA/IDogIkJDTSIsIHZpZCwgcGlkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJQlRfSU5GTygiJXM6ICVzICglMy4zdS4lMy4zdS4lMy4zdSkgYnVpbGQgJTQuNHUiLCBoZGV2LT5uYW1lLAorCQlod19uYW1lID8gOiAiQkNNIiwgKHN1YnZlciAmIDB4NzAwMCkgPj4gMTMsCisJCShzdWJ2ZXIgJiAweDFmMDApID4+IDgsIChzdWJ2ZXIgJiAweDAwZmYpLCByZXYgJiAweDBmZmYpOworCisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X25hbWUsICZoZGV2LT5kZXYpOworCWlmIChlcnIgPCAwKSB7CisJCUJUX0lORk8oIiVzOiBCQ006IHBhdGNoICVzIG5vdCBmb3VuZCIsIGhkZXYtPm5hbWUsIGZ3X25hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBTdGFydCBEb3dubG9hZCAqLworCXNrYiA9IF9faGNpX2NtZF9zeW5jKGhkZXYsIDB4ZmMyZSwgMCwgTlVMTCwgSENJX0lOSVRfVElNRU9VVCk7CisJaWYgKElTX0VSUihza2IpKSB7CisJCWVyciA9IFBUUl9FUlIoc2tiKTsKKwkJQlRfRVJSKCIlczogQkNNOiBEb3dubG9hZCBNaW5pZHJ2IGNvbW1hbmQgZmFpbGVkICglZCkiLAorCQkgICAgICAgaGRldi0+bmFtZSwgZXJyKTsKKwkJZ290byByZXNldDsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisKKwkvKiA1MCBtc2VjIGRlbGF5IGFmdGVyIERvd25sb2FkIE1pbmlkcnYgY29tcGxldGVzICovCisJbXNsZWVwKDUwKTsKKworCWZ3X3B0ciA9IGZ3LT5kYXRhOworCWZ3X3NpemUgPSBmdy0+c2l6ZTsKKworCXdoaWxlIChmd19zaXplID49IHNpemVvZigqY21kKSkgeworCQljb25zdCB1OCAqY21kX3BhcmFtOworCisJCWNtZCA9IChzdHJ1Y3QgaGNpX2NvbW1hbmRfaGRyICopZndfcHRyOworCQlmd19wdHIgKz0gc2l6ZW9mKCpjbWQpOworCQlmd19zaXplIC09IHNpemVvZigqY21kKTsKKworCQlpZiAoZndfc2l6ZSA8IGNtZC0+cGxlbikgeworCQkJQlRfRVJSKCIlczogQkNNOiBwYXRjaCAlcyBpcyBjb3JydXB0ZWQiLCBoZGV2LT5uYW1lLAorCQkJICAgICAgIGZ3X25hbWUpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gcmVzZXQ7CisJCX0KKworCQljbWRfcGFyYW0gPSBmd19wdHI7CisJCWZ3X3B0ciArPSBjbWQtPnBsZW47CisJCWZ3X3NpemUgLT0gY21kLT5wbGVuOworCisJCW9wY29kZSA9IGxlMTZfdG9fY3B1KGNtZC0+b3Bjb2RlKTsKKworCQlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCBvcGNvZGUsIGNtZC0+cGxlbiwgY21kX3BhcmFtLAorCQkJCSAgICAgSENJX0lOSVRfVElNRU9VVCk7CisJCWlmIChJU19FUlIoc2tiKSkgeworCQkJZXJyID0gUFRSX0VSUihza2IpOworCQkJQlRfRVJSKCIlczogQkNNOiBwYXRjaCBjb21tYW5kICUwNHggZmFpbGVkICglZCkiLAorCQkJICAgICAgIGhkZXYtPm5hbWUsIG9wY29kZSwgZXJyKTsKKwkJCWdvdG8gcmVzZXQ7CisJCX0KKwkJa2ZyZWVfc2tiKHNrYik7CisJfQorCisJLyogMjUwIG1zZWMgZGVsYXkgYWZ0ZXIgTGF1bmNoIFJhbSBjb21wbGV0ZXMgKi8KKwltc2xlZXAoMjUwKTsKKworcmVzZXQ6CisJLyogUmVzZXQgKi8KKwllcnIgPSBidGJjbV9yZXNldChoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGRvbmU7CisKKwkvKiBSZWFkIExvY2FsIFZlcnNpb24gSW5mbyAqLworCXNrYiA9IGJ0YmNtX3JlYWRfbG9jYWxfdmVyc2lvbihoZGV2KTsKKwlpZiAoSVNfRVJSKHNrYikpIHsKKwkJZXJyID0gUFRSX0VSUihza2IpOworCQlnb3RvIGRvbmU7CisJfQorCisJdmVyID0gKHN0cnVjdCBoY2lfcnBfcmVhZF9sb2NhbF92ZXJzaW9uICopc2tiLT5kYXRhOworCXJldiA9IGxlMTZfdG9fY3B1KHZlci0+aGNpX3Jldik7CisJc3VidmVyID0gbGUxNl90b19jcHUodmVyLT5sbXBfc3VidmVyKTsKKwlrZnJlZV9za2Ioc2tiKTsKKworCUJUX0lORk8oIiVzOiAlcyAoJTMuM3UuJTMuM3UuJTMuM3UpIGJ1aWxkICU0LjR1IiwgaGRldi0+bmFtZSwKKwkJaHdfbmFtZSA/IDogIkJDTSIsIChzdWJ2ZXIgJiAweDcwMDApID4+IDEzLAorCQkoc3VidmVyICYgMHgxZjAwKSA+PiA4LCAoc3VidmVyICYgMHgwMGZmKSwgcmV2ICYgMHgwZmZmKTsKKworCWJ0YmNtX2NoZWNrX2JkYWRkcihoZGV2KTsKKworCXNldF9iaXQoSENJX1FVSVJLX1NUUklDVF9EVVBMSUNBVEVfRklMVEVSLCAmaGRldi0+cXVpcmtzKTsKKworZG9uZToKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChidGJjbV9zZXR1cF9wYXRjaHJhbSk7CisKK2ludCBidGJjbV9zZXR1cF9hcHBsZShzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJLyogUmVhZCBWZXJib3NlIENvbmZpZyBWZXJzaW9uIEluZm8gKi8KKwlza2IgPSBidGJjbV9yZWFkX3ZlcmJvc2VfY29uZmlnKGhkZXYpOworCWlmIChJU19FUlIoc2tiKSkKKwkJcmV0dXJuIFBUUl9FUlIoc2tiKTsKKworCUJUX0lORk8oIiVzOiBCQ006IGNoaXAgaWQgJXUgYnVpbGQgJTQuNHUiLCBoZGV2LT5uYW1lLCBza2ItPmRhdGFbMV0sCisJCWdldF91bmFsaWduZWRfbGUxNihza2ItPmRhdGEgKyA1KSk7CisJa2ZyZWVfc2tiKHNrYik7CisKKwlzZXRfYml0KEhDSV9RVUlSS19TVFJJQ1RfRFVQTElDQVRFX0ZJTFRFUiwgJmhkZXYtPnF1aXJrcyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJ0YmNtX3NldHVwX2FwcGxlKTsKKworTU9EVUxFX0FVVEhPUigiTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCbHVldG9vdGggc3VwcG9ydCBmb3IgQnJvYWRjb20gZGV2aWNlcyB2ZXIgIiBWRVJTSU9OKTsKK01PRFVMRV9WRVJTSU9OKFZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRiY20uaCBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0YmNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyNjhhZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0YmNtLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqCisgKiAgQmx1ZXRvb3RoIHN1cHBvcnQgZm9yIEJyb2FkY29tIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE1ICBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2lmIElTX0VOQUJMRUQoQ09ORklHX0JUX0JDTSkKKworaW50IGJ0YmNtX2NoZWNrX2JkYWRkcihzdHJ1Y3QgaGNpX2RldiAqaGRldik7CitpbnQgYnRiY21fc2V0X2JkYWRkcihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgY29uc3QgYmRhZGRyX3QgKmJkYWRkcik7CisKK2ludCBidGJjbV9zZXR1cF9wYXRjaHJhbShzdHJ1Y3QgaGNpX2RldiAqaGRldik7CitpbnQgYnRiY21fc2V0dXBfYXBwbGUoc3RydWN0IGhjaV9kZXYgKmhkZXYpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBidGJjbV9jaGVja19iZGFkZHIoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW5saW5lIGludCBidGJjbV9zZXRfYmRhZGRyKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBjb25zdCBiZGFkZHJfdCAqYmRhZGRyKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYnRiY21fc2V0dXBfcGF0Y2hyYW0oc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJ0YmNtX3NldHVwX2FwcGxlKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0aW50ZWwuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0aW50ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDQzZDQyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRpbnRlbC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICoKKyAqICBCbHVldG9vdGggc3VwcG9ydCBmb3IgSW50ZWwgZGV2aWNlcworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTUgIEludGVsIENvcnBvcmF0aW9uCisgKgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKworI2luY2x1ZGUgImJ0aW50ZWwuaCIKKworI2RlZmluZSBWRVJTSU9OICIwLjEiCisKKyNkZWZpbmUgQkRBRERSX0lOVEVMICgmKGJkYWRkcl90KSB7ezB4MDAsIDB4OGIsIDB4OWUsIDB4MTksIDB4MDMsIDB4MDB9fSkKKworaW50IGJ0aW50ZWxfY2hlY2tfYmRhZGRyKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfcnBfcmVhZF9iZF9hZGRyICpiZGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IF9faGNpX2NtZF9zeW5jKGhkZXYsIEhDSV9PUF9SRUFEX0JEX0FERFIsIDAsIE5VTEwsCisJCQkgICAgIEhDSV9JTklUX1RJTUVPVVQpOworCWlmIChJU19FUlIoc2tiKSkgeworCQlpbnQgZXJyID0gUFRSX0VSUihza2IpOworCQlCVF9FUlIoIiVzOiBSZWFkaW5nIEludGVsIGRldmljZSBhZGRyZXNzIGZhaWxlZCAoJWQpIiwKKwkJICAgICAgIGhkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKHNrYi0+bGVuICE9IHNpemVvZigqYmRhKSkgeworCQlCVF9FUlIoIiVzOiBJbnRlbCBkZXZpY2UgYWRkcmVzcyBsZW5ndGggbWlzbWF0Y2giLCBoZGV2LT5uYW1lKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRUlPOworCX0KKworCWJkYSA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfYmRfYWRkciAqKXNrYi0+ZGF0YTsKKwlpZiAoYmRhLT5zdGF0dXMpIHsKKwkJQlRfRVJSKCIlczogSW50ZWwgZGV2aWNlIGFkZHJlc3MgcmVzdWx0IGZhaWxlZCAoJTAyeCkiLAorCQkgICAgICAgaGRldi0+bmFtZSwgYmRhLT5zdGF0dXMpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1idF90b19lcnJubyhiZGEtPnN0YXR1cyk7CisJfQorCisJLyogRm9yIHNvbWUgSW50ZWwgYmFzZWQgY29udHJvbGxlcnMsIHRoZSBkZWZhdWx0IEJsdWV0b290aCBkZXZpY2UKKwkgKiBhZGRyZXNzIDAwOjAzOjE5OjlFOjhCOjAwIGNhbiBiZSBmb3VuZC4gVGhlc2UgY29udHJvbGxlcnMgYXJlCisJICogZnVsbHkgb3BlcmF0aW9uYWwsIGJ1dCBoYXZlIHRoZSBkYW5nZXIgb2YgZHVwbGljYXRlIGFkZHJlc3NlcworCSAqIGFuZCB0aGF0IGluIHR1cm4gY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggQmx1ZXRvb3RoIG9wZXJhdGlvbi4KKwkgKi8KKwlpZiAoIWJhY21wKCZiZGEtPmJkYWRkciwgQkRBRERSX0lOVEVMKSkgeworCQlCVF9FUlIoIiVzOiBGb3VuZCBJbnRlbCBkZWZhdWx0IGRldmljZSBhZGRyZXNzICglcE1SKSIsCisJCSAgICAgICBoZGV2LT5uYW1lLCAmYmRhLT5iZGFkZHIpOworCQlzZXRfYml0KEhDSV9RVUlSS19JTlZBTElEX0JEQUREUiwgJmhkZXYtPnF1aXJrcyk7CisJfQorCisJa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJ0aW50ZWxfY2hlY2tfYmRhZGRyKTsKKworaW50IGJ0aW50ZWxfc2V0X2JkYWRkcihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgY29uc3QgYmRhZGRyX3QgKmJkYWRkcikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisKKwlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCAweGZjMzEsIDYsIGJkYWRkciwgSENJX0lOSVRfVElNRU9VVCk7CisJaWYgKElTX0VSUihza2IpKSB7CisJCWVyciA9IFBUUl9FUlIoc2tiKTsKKwkJQlRfRVJSKCIlczogQ2hhbmdpbmcgSW50ZWwgZGV2aWNlIGFkZHJlc3MgZmFpbGVkICglZCkiLAorCQkgICAgICAgaGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJ0aW50ZWxfc2V0X2JkYWRkcik7CisKK01PRFVMRV9BVVRIT1IoIk1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIHN1cHBvcnQgZm9yIEludGVsIGRldmljZXMgdmVyICIgVkVSU0lPTik7CitNT0RVTEVfVkVSU0lPTihWRVJTSU9OKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0aW50ZWwuaCBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0aW50ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmRhNmFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvYnRpbnRlbC5oCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKgorICogIEJsdWV0b290aCBzdXBwb3J0IGZvciBJbnRlbCBkZXZpY2VzCisgKgorICogIENvcHlyaWdodCAoQykgMjAxNSAgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKK3N0cnVjdCBpbnRlbF92ZXJzaW9uIHsKKwl1OCBzdGF0dXM7CisJdTggaHdfcGxhdGZvcm07CisJdTggaHdfdmFyaWFudDsKKwl1OCBod19yZXZpc2lvbjsKKwl1OCBmd192YXJpYW50OworCXU4IGZ3X3JldmlzaW9uOworCXU4IGZ3X2J1aWxkX251bTsKKwl1OCBmd19idWlsZF93dzsKKwl1OCBmd19idWlsZF95eTsKKwl1OCBmd19wYXRjaF9udW07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaW50ZWxfYm9vdF9wYXJhbXMgeworCV9fdTggICAgIHN0YXR1czsKKwlfX3U4ICAgICBvdHBfZm9ybWF0OworCV9fdTggICAgIG90cF9jb250ZW50OworCV9fdTggICAgIG90cF9wYXRjaDsKKwlfX2xlMTYgICBkZXZfcmV2aWQ7CisJX191OCAgICAgc2VjdXJlX2Jvb3Q7CisJX191OCAgICAga2V5X2Zyb21faGRyOworCV9fdTggICAgIGtleV90eXBlOworCV9fdTggICAgIG90cF9sb2NrOworCV9fdTggICAgIGFwaV9sb2NrOworCV9fdTggICAgIGRlYnVnX2xvY2s7CisJYmRhZGRyX3Qgb3RwX2JkYWRkcjsKKwlfX3U4ICAgICBtaW5fZndfYnVpbGRfbm47CisJX191OCAgICAgbWluX2Z3X2J1aWxkX2N3OworCV9fdTggICAgIG1pbl9md19idWlsZF95eTsKKwlfX3U4ICAgICBsaW1pdGVkX2NjZTsKKwlfX3U4ICAgICB1bmxvY2tlZF9zdGF0ZTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpbnRlbF9ib290dXAgeworCV9fdTggICAgIHplcm87CisJX191OCAgICAgbnVtX2NtZHM7CisJX191OCAgICAgc291cmNlOworCV9fdTggICAgIHJlc2V0X3R5cGU7CisJX191OCAgICAgcmVzZXRfcmVhc29uOworCV9fdTggICAgIGRkY19zdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaW50ZWxfc2VjdXJlX3NlbmRfcmVzdWx0IHsKKwlfX3U4ICAgICByZXN1bHQ7CisJX19sZTE2ICAgb3Bjb2RlOworCV9fdTggICAgIHN0YXR1czsKK30gX19wYWNrZWQ7CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19CVF9JTlRFTCkKKworaW50IGJ0aW50ZWxfY2hlY2tfYmRhZGRyKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKK2ludCBidGludGVsX3NldF9iZGFkZHIoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGNvbnN0IGJkYWRkcl90ICpiZGFkZHIpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIGludCBidGludGVsX2NoZWNrX2JkYWRkcihzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJ0aW50ZWxfc2V0X2JkYWRkcihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgY29uc3QgYmRhZGRyX3QgKmJkYWRkcikKK3sKKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2Rydi5oIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX2Rydi5oCmluZGV4IGU3NWY4ZWUuLjA4NmYwZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9kcnYuaAorKysgYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfZHJ2LmgKQEAgLTExMSw2ICsxMTEsNyBAQAogCiAvKiBWZW5kb3Igc3BlY2lmaWMgQmx1ZXRvb3RoIGNvbW1hbmRzICovCiAjZGVmaW5lIEJUX0NNRF9QU0NBTl9XSU5fUkVQT1JUX0VOQUJMRQkweEZDMDMKKyNkZWZpbmUgQlRfQ01EX1JPVVRFX1NDT19UT19IT1NUCTB4RkMxRAogI2RlZmluZSBCVF9DTURfU0VUX0JEQUREUgkJMHhGQzIyCiAjZGVmaW5lIEJUX0NNRF9BVVRPX1NMRUVQX01PREUJCTB4RkMyMwogI2RlZmluZSBCVF9DTURfSE9TVF9TTEVFUF9DT05GSUcJMHhGQzU5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfbWFpbi5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX21haW4uYwppbmRleCA0MTM1OTc3Li5kZTA1ZGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfbWFpbi5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9tYWluLmMKQEAgLTIzMCw2ICsyMzAsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGJ0bXJ2bF9zZW5kX21vZHVsZV9jZmdfY21kKTsKIAorc3RhdGljIGludCBidG1ydmxfZW5hYmxlX3Njb19yb3V0aW5nX3RvX2hvc3Qoc3RydWN0IGJ0bXJ2bF9wcml2YXRlICpwcml2KQoreworCWludCByZXQ7CisJdTggc3ViY21kID0gMDsKKworCXJldCA9IGJ0bXJ2bF9zZW5kX3N5bmNfY21kKHByaXYsIEJUX0NNRF9ST1VURV9TQ09fVE9fSE9TVCwgJnN1YmNtZCwgMSk7CisJaWYgKHJldCkKKwkJQlRfRVJSKCJCVF9DTURfUk9VVEVfU0NPX1RPX0hPU1QgY29tbWFuZCBmYWlsZWQ6ICUjeCIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCiBpbnQgYnRtcnZsX3BzY2FuX3dpbmRvd19yZXBvcnRpbmcoc3RydWN0IGJ0bXJ2bF9wcml2YXRlICpwcml2LCB1OCBzdWJjbWQpCiB7CiAJc3RydWN0IGJ0bXJ2bF9zZGlvX2NhcmQgKmNhcmQgPSBwcml2LT5idG1ydmxfZGV2LmNhcmQ7CkBAIC01NTgsNiArNTcwLDggQEAKIAogCWJ0bXJ2bF9jaGVja19kZXZpY2VfdHJlZShwcml2KTsKIAorCWJ0bXJ2bF9lbmFibGVfc2NvX3JvdXRpbmdfdG9faG9zdChwcml2KTsKKwogCWJ0bXJ2bF9wc2Nhbl93aW5kb3dfcmVwb3J0aW5nKHByaXYsIDB4MDEpOwogCiAJcHJpdi0+YnRtcnZsX2Rldi5wc21vZGUgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKaW5kZXggOGJmYzRjMi4uZGU3YjIzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCkBAIC0yOCw3ICsyOCwxMCBAQAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgogCi0jZGVmaW5lIFZFUlNJT04gIjAuNyIKKyNpbmNsdWRlICJidGludGVsLmgiCisjaW5jbHVkZSAiYnRiY20uaCIKKworI2RlZmluZSBWRVJTSU9OICIwLjgiCiAKIHN0YXRpYyBib29sIGRpc2FibGVfc2NvZml4Owogc3RhdGljIGJvb2wgZm9yY2Vfc2NvZml4OwpAQCAtNTIsNiArNTUsOCBAQAogI2RlZmluZSBCVFVTQl9TV0FWRQkJMHgxMDAwCiAjZGVmaW5lIEJUVVNCX0lOVEVMX05FVwkJMHgyMDAwCiAjZGVmaW5lIEJUVVNCX0FNUAkJMHg0MDAwCisjZGVmaW5lIEJUVVNCX1FDQV9ST01FCQkweDgwMDAKKyNkZWZpbmUgQlRVU0JfQkNNX0FQUExFCQkweDEwMDAwCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBidHVzYl90YWJsZVtdID0gewogCS8qIEdlbmVyaWMgQmx1ZXRvb3RoIFVTQiBkZXZpY2UgKi8KQEAgLTYxLDcgKzY2LDggQEAKIAl7IFVTQl9ERVZJQ0VfSU5GTygweGUwLCAweDAxLCAweDA0KSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfQU1QIH0sCiAKIAkvKiBBcHBsZS1zcGVjaWZpYyAoQnJvYWRjb20pIGRldmljZXMgKi8KLQl7IFVTQl9WRU5ET1JfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MDVhYywgMHhmZiwgMHgwMSwgMHgwMSkgfSwKKwl7IFVTQl9WRU5ET1JfQU5EX0lOVEVSRkFDRV9JTkZPKDB4MDVhYywgMHhmZiwgMHgwMSwgMHgwMSksCisJICAuZHJpdmVyX2luZm8gPSBCVFVTQl9CQ01fQVBQTEUgfSwKIAogCS8qIE1lZGlhVGVrIE1UNzZ4MEUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwZThkLCAweDc2M2YpIH0sCkBAIC0xMDcsMTMgKzExMyw3IEBACiAJeyBVU0JfREVWSUNFKDB4MGMxMCwgMHgwMDAwKSB9LAogCiAJLyogQnJvYWRjb20gQkNNMjA3MDJBMCAqLwotCXsgVVNCX0RFVklDRSgweDA0ODksIDB4ZTA0MikgfSwKLQl7IFVTQl9ERVZJQ0UoMHgwNGNhLCAweDIwMDMpIH0sCi0JeyBVU0JfREVWSUNFKDB4MGIwNSwgMHgxN2I1KSB9LAotCXsgVVNCX0RFVklDRSgweDBiMDUsIDB4MTdjYikgfSwKIAl7IFVTQl9ERVZJQ0UoMHg0MTNjLCAweDgxOTcpIH0sCi0JeyBVU0JfREVWSUNFKDB4MTNkMywgMHgzNDA0KSwKLQkgIC5kcml2ZXJfaW5mbyA9IEJUVVNCX0JDTV9QQVRDSFJBTSB9LAogCiAJLyogQnJvYWRjb20gQkNNMjA3MDJCMCAoRHluZXgvSW5zaWduaWEpICovCiAJeyBVU0JfREVWSUNFKDB4MTlmZiwgMHgwMjM5KSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfQkNNX1BBVENIUkFNIH0sCkBAIC0xMzUsMTAgKzEzNSwxMiBAQAogCSAgLmRyaXZlcl9pbmZvID0gQlRVU0JfQkNNX1BBVENIUkFNIH0sCiAKIAkvKiBCZWxraW4gRjgwNjViZiAtIEJyb2FkY29tIGJhc2VkICovCi0JeyBVU0JfVkVORE9SX0FORF9JTlRFUkZBQ0VfSU5GTygweDA1MGQsIDB4ZmYsIDB4MDEsIDB4MDEpIH0sCisJeyBVU0JfVkVORE9SX0FORF9JTlRFUkZBQ0VfSU5GTygweDA1MGQsIDB4ZmYsIDB4MDEsIDB4MDEpLAorCSAgLmRyaXZlcl9pbmZvID0gQlRVU0JfQkNNX1BBVENIUkFNIH0sCiAKIAkvKiBJTUMgTmV0d29ya3MgLSBCcm9hZGNvbSBiYXNlZCAqLwotCXsgVVNCX1ZFTkRPUl9BTkRfSU5URVJGQUNFX0lORk8oMHgxM2QzLCAweGZmLCAweDAxLCAweDAxKSB9LAorCXsgVVNCX1ZFTkRPUl9BTkRfSU5URVJGQUNFX0lORk8oMHgxM2QzLCAweGZmLCAweDAxLCAweDAxKSwKKwkgIC5kcml2ZXJfaW5mbyA9IEJUVVNCX0JDTV9QQVRDSFJBTSB9LAogCiAJLyogSW50ZWwgQmx1ZXRvb3RoIFVTQiBCb290bG9hZGVyIChSQU0gbW9kdWxlKSAqLwogCXsgVVNCX0RFVklDRSgweDgwODcsIDB4MGE1YSksCkBAIC0xNTksNiArMTYxLDcgQEAKIAkvKiBBdGhlcm9zIDMwMTEgd2l0aCBzZmxhc2ggZmlybXdhcmUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDg5LCAweGUwMjcpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9JR05PUkUgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwNDg5LCAweGUwM2QpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9JR05PUkUgfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNGYyLCAweGFmZjEpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9JR05PUkUgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwOTMwLCAweDAyMTUpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9JR05PUkUgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweDMwMDIpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9JR05PUkUgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweGUwMTkpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9JR05PUkUgfSwKQEAgLTIxMiw2ICsyMTUsMTAgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwNDg5LCAweGUwMzYpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9BVEgzMDEyIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQ4OSwgMHhlMDNjKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfQVRIMzAxMiB9LAogCisJLyogUUNBIFJPTUUgY2hpcHNldCAqLworCXsgVVNCX0RFVklDRSgweDBjZjMsIDB4ZTMwMCksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1FDQV9ST01FIH0sCisJeyBVU0JfREVWSUNFKDB4MGNmMywgMHhlMzYwKSwgLmRyaXZlcl9pbmZvID0gQlRVU0JfUUNBX1JPTUUgfSwKKwogCS8qIEJyb2FkY29tIEJDTTIwMzUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwYTVjLCAweDIwMDkpLCAuZHJpdmVyX2luZm8gPSBCVFVTQl9CQ005MjAzNSB9LAogCXsgVVNCX0RFVklDRSgweDBhNWMsIDB4MjAwYSksIC5kcml2ZXJfaW5mbyA9IEJUVVNCX1dST05HX1NDT19NVFUgfSwKQEAgLTMzNywxNyArMzQ0LDkgQEAKIAogCWludCAoKnJlY3ZfZXZlbnQpKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlpbnQgKCpyZWN2X2J1bGspKHN0cnVjdCBidHVzYl9kYXRhICpkYXRhLCB2b2lkICpidWZmZXIsIGludCBjb3VudCk7Ci19OwogCi1zdGF0aWMgaW50IGJ0dXNiX3dhaXRfb25fYml0X3RpbWVvdXQodm9pZCAqd29yZCwgaW50IGJpdCwgdW5zaWduZWQgbG9uZyB0aW1lb3V0LAotCQkJCSAgICAgdW5zaWduZWQgbW9kZSkKLXsKLQltaWdodF9zbGVlcCgpOwotCWlmICghdGVzdF9iaXQoYml0LCB3b3JkKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIG91dF9vZl9saW5lX3dhaXRfb25fYml0X3RpbWVvdXQod29yZCwgYml0LCBiaXRfd2FpdF90aW1lb3V0LAotCQkJCQkgICAgICAgbW9kZSwgdGltZW91dCk7Ci19CisJaW50ICgqc2V0dXBfb25fdXNiKShzdHJ1Y3QgaGNpX2RldiAqaGRldik7Cit9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgYnR1c2JfZnJlZV9mcmFncyhzdHJ1Y3QgYnR1c2JfZGF0YSAqZGF0YSkKIHsKQEAgLTg4OCw2ICs4ODcsMTUgQEAKIAogCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKIAorCS8qIFBhdGNoaW5nIFVTQiBmaXJtd2FyZSBmaWxlcyBwcmlvciB0byBzdGFydGluZyBhbnkgVVJCcyBvZiBIQ0kgcGF0aAorCSAqIEl0IGlzIG1vcmUgc2FmZSB0byB1c2UgVVNCIGJ1bGsgY2hhbm5lbCBmb3IgZG93bmxvYWRpbmcgVVNCIHBhdGNoCisJICovCisJaWYgKGRhdGEtPnNldHVwX29uX3VzYikgeworCQllcnIgPSBkYXRhLT5zZXR1cF9vbl91c2IoaGRldik7CisJCWlmIChlcnIgPDApCisJCQlyZXR1cm4gZXJyOworCX0KKwogCWVyciA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZShkYXRhLT5pbnRmKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKQEAgLTEyNjMsNiArMTI3MSwyOCBAQAogCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShkYXRhLT5pbnRmKTsKIH0KIAorc3RhdGljIHN0cnVjdCBza19idWZmICpidHVzYl9yZWFkX2xvY2FsX3ZlcnNpb24oc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IF9faGNpX2NtZF9zeW5jKGhkZXYsIEhDSV9PUF9SRUFEX0xPQ0FMX1ZFUlNJT04sIDAsIE5VTEwsCisJCQkgICAgIEhDSV9JTklUX1RJTUVPVVQpOworCWlmIChJU19FUlIoc2tiKSkgeworCQlCVF9FUlIoIiVzOiBIQ0lfT1BfUkVBRF9MT0NBTF9WRVJTSU9OIGZhaWxlZCAoJWxkKSIsCisJCSAgICAgICBoZGV2LT5uYW1lLCBQVFJfRVJSKHNrYikpOworCQlyZXR1cm4gc2tiOworCX0KKworCWlmIChza2ItPmxlbiAhPSBzaXplb2Yoc3RydWN0IGhjaV9ycF9yZWFkX2xvY2FsX3ZlcnNpb24pKSB7CisJCUJUX0VSUigiJXM6IEhDSV9PUF9SRUFEX0xPQ0FMX1ZFUlNJT04gZXZlbnQgbGVuZ3RoIG1pc21hdGNoIiwKKwkJICAgICAgIGhkZXYtPm5hbWUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTyk7CisJfQorCisJcmV0dXJuIHNrYjsKK30KKwogc3RhdGljIGludCBidHVzYl9zZXR1cF9iY205MjAzNShzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTI4NywxMiArMTMxNyw5IEBACiAKIAlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CiAKLQlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCBIQ0lfT1BfUkVBRF9MT0NBTF9WRVJTSU9OLCAwLCBOVUxMLAotCQkJICAgICBIQ0lfSU5JVF9USU1FT1VUKTsKLQlpZiAoSVNfRVJSKHNrYikpIHsKLQkJQlRfRVJSKCJSZWFkaW5nIGxvY2FsIHZlcnNpb24gZmFpbGVkICglbGQpIiwgLVBUUl9FUlIoc2tiKSk7CisJc2tiID0gYnR1c2JfcmVhZF9sb2NhbF92ZXJzaW9uKGhkZXYpOworCWlmIChJU19FUlIoc2tiKSkKIAkJcmV0dXJuIC1QVFJfRVJSKHNrYik7Ci0JfQogCiAJcnAgPSAoc3RydWN0IGhjaV9ycF9yZWFkX2xvY2FsX3ZlcnNpb24gKilza2ItPmRhdGE7CiAKQEAgLTEzMTgsMzkgKzEzNDUsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0cnVjdCBpbnRlbF92ZXJzaW9uIHsKLQl1OCBzdGF0dXM7Ci0JdTggaHdfcGxhdGZvcm07Ci0JdTggaHdfdmFyaWFudDsKLQl1OCBod19yZXZpc2lvbjsKLQl1OCBmd192YXJpYW50OwotCXU4IGZ3X3JldmlzaW9uOwotCXU4IGZ3X2J1aWxkX251bTsKLQl1OCBmd19idWlsZF93dzsKLQl1OCBmd19idWlsZF95eTsKLQl1OCBmd19wYXRjaF9udW07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgaW50ZWxfYm9vdF9wYXJhbXMgewotCV9fdTggICAgIHN0YXR1czsKLQlfX3U4ICAgICBvdHBfZm9ybWF0OwotCV9fdTggICAgIG90cF9jb250ZW50OwotCV9fdTggICAgIG90cF9wYXRjaDsKLQlfX2xlMTYgICBkZXZfcmV2aWQ7Ci0JX191OCAgICAgc2VjdXJlX2Jvb3Q7Ci0JX191OCAgICAga2V5X2Zyb21faGRyOwotCV9fdTggICAgIGtleV90eXBlOwotCV9fdTggICAgIG90cF9sb2NrOwotCV9fdTggICAgIGFwaV9sb2NrOwotCV9fdTggICAgIGRlYnVnX2xvY2s7Ci0JYmRhZGRyX3Qgb3RwX2JkYWRkcjsKLQlfX3U4ICAgICBtaW5fZndfYnVpbGRfbm47Ci0JX191OCAgICAgbWluX2Z3X2J1aWxkX2N3OwotCV9fdTggICAgIG1pbl9md19idWlsZF95eTsKLQlfX3U4ICAgICBsaW1pdGVkX2NjZTsKLQlfX3U4ICAgICB1bmxvY2tlZF9zdGF0ZTsKLX0gX19wYWNrZWQ7Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmJ0dXNiX3NldHVwX2ludGVsX2dldF9mdyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwKIAkJCQkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfdmVyc2lvbiAqdmVyKQogewpAQCAtMTUwNyw1MSArMTUwMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgQkRBRERSX0lOVEVMICgmKGJkYWRkcl90KSB7ezB4MDAsIDB4OGIsIDB4OWUsIDB4MTksIDB4MDMsIDB4MDB9fSkKLQotc3RhdGljIGludCBidHVzYl9jaGVja19iZGFkZHJfaW50ZWwoc3RydWN0IGhjaV9kZXYgKmhkZXYpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgaGNpX3JwX3JlYWRfYmRfYWRkciAqcnA7Ci0KLQlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCBIQ0lfT1BfUkVBRF9CRF9BRERSLCAwLCBOVUxMLAotCQkJICAgICBIQ0lfSU5JVF9USU1FT1VUKTsKLQlpZiAoSVNfRVJSKHNrYikpIHsKLQkJQlRfRVJSKCIlcyByZWFkaW5nIEludGVsIGRldmljZSBhZGRyZXNzIGZhaWxlZCAoJWxkKSIsCi0JCSAgICAgICBoZGV2LT5uYW1lLCBQVFJfRVJSKHNrYikpOwotCQlyZXR1cm4gUFRSX0VSUihza2IpOwotCX0KLQotCWlmIChza2ItPmxlbiAhPSBzaXplb2YoKnJwKSkgewotCQlCVF9FUlIoIiVzIEludGVsIGRldmljZSBhZGRyZXNzIGxlbmd0aCBtaXNtYXRjaCIsIGhkZXYtPm5hbWUpOwotCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcnAgPSAoc3RydWN0IGhjaV9ycF9yZWFkX2JkX2FkZHIgKilza2ItPmRhdGE7Ci0JaWYgKHJwLT5zdGF0dXMpIHsKLQkJQlRfRVJSKCIlcyBJbnRlbCBkZXZpY2UgYWRkcmVzcyByZXN1bHQgZmFpbGVkICglMDJ4KSIsCi0JCSAgICAgICBoZGV2LT5uYW1lLCBycC0+c3RhdHVzKTsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAtYnRfdG9fZXJybm8ocnAtPnN0YXR1cyk7Ci0JfQotCi0JLyogRm9yIHNvbWUgSW50ZWwgYmFzZWQgY29udHJvbGxlcnMsIHRoZSBkZWZhdWx0IEJsdWV0b290aCBkZXZpY2UKLQkgKiBhZGRyZXNzIDAwOjAzOjE5OjlFOjhCOjAwIGNhbiBiZSBmb3VuZC4gVGhlc2UgY29udHJvbGxlcnMgYXJlCi0JICogZnVsbHkgb3BlcmF0aW9uYWwsIGJ1dCBoYXZlIHRoZSBkYW5nZXIgb2YgZHVwbGljYXRlIGFkZHJlc3NlcwotCSAqIGFuZCB0aGF0IGluIHR1cm4gY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggQmx1ZXRvb3RoIG9wZXJhdGlvbi4KLQkgKi8KLQlpZiAoIWJhY21wKCZycC0+YmRhZGRyLCBCREFERFJfSU5URUwpKSB7Ci0JCUJUX0VSUigiJXMgZm91bmQgSW50ZWwgZGVmYXVsdCBkZXZpY2UgYWRkcmVzcyAoJXBNUikiLAotCQkgICAgICAgaGRldi0+bmFtZSwgJnJwLT5iZGFkZHIpOwotCQlzZXRfYml0KEhDSV9RVUlSS19JTlZBTElEX0JEQUREUiwgJmhkZXYtPnF1aXJrcyk7Ci0JfQotCi0Ja2ZyZWVfc2tiKHNrYik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBidHVzYl9zZXR1cF9pbnRlbChzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTYyNCw3ICsxNTczLDcgQEAKIAkJQlRfSU5GTygiJXM6IEludGVsIGRldmljZSBpcyBhbHJlYWR5IHBhdGNoZWQuIHBhdGNoIG51bTogJTAyeCIsCiAJCQloZGV2LT5uYW1lLCB2ZXItPmZ3X3BhdGNoX251bSk7CiAJCWtmcmVlX3NrYihza2IpOwotCQlidHVzYl9jaGVja19iZGFkZHJfaW50ZWwoaGRldik7CisJCWJ0aW50ZWxfY2hlY2tfYmRhZGRyKGhkZXYpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE2MzcsNyArMTU4Niw3IEBACiAJZncgPSBidHVzYl9zZXR1cF9pbnRlbF9nZXRfZncoaGRldiwgdmVyKTsKIAlpZiAoIWZ3KSB7CiAJCWtmcmVlX3NrYihza2IpOwotCQlidHVzYl9jaGVja19iZGFkZHJfaW50ZWwoaGRldik7CisJCWJ0aW50ZWxfY2hlY2tfYmRhZGRyKGhkZXYpOwogCQlyZXR1cm4gMDsKIAl9CiAJZndfcHRyID0gZnctPmRhdGE7CkBAIC0xNzE4LDcgKzE2NjcsNyBAQAogCUJUX0lORk8oIiVzOiBJbnRlbCBCbHVldG9vdGggZmlybXdhcmUgcGF0Y2ggY29tcGxldGVkIGFuZCBhY3RpdmF0ZWQiLAogCQloZGV2LT5uYW1lKTsKIAotCWJ0dXNiX2NoZWNrX2JkYWRkcl9pbnRlbChoZGV2KTsKKwlidGludGVsX2NoZWNrX2JkYWRkcihoZGV2KTsKIAlyZXR1cm4gMDsKIAogZXhpdF9tZmdfZGlzYWJsZToKQEAgLTE3MzQsNyArMTY4Myw3IEBACiAKIAlCVF9JTkZPKCIlczogSW50ZWwgQmx1ZXRvb3RoIGZpcm13YXJlIHBhdGNoIGNvbXBsZXRlZCIsIGhkZXYtPm5hbWUpOwogCi0JYnR1c2JfY2hlY2tfYmRhZGRyX2ludGVsKGhkZXYpOworCWJ0aW50ZWxfY2hlY2tfYmRhZGRyKGhkZXYpOwogCXJldHVybiAwOwogCiBleGl0X21mZ19kZWFjdGl2YXRlOgpAQCAtMTc1NSw3ICsxNzA0LDcgQEAKIAlCVF9JTkZPKCIlczogSW50ZWwgQmx1ZXRvb3RoIGZpcm13YXJlIHBhdGNoIGNvbXBsZXRlZCBhbmQgZGVhY3RpdmF0ZWQiLAogCQloZGV2LT5uYW1lKTsKIAotCWJ0dXNiX2NoZWNrX2JkYWRkcl9pbnRlbChoZGV2KTsKKwlidGludGVsX2NoZWNrX2JkYWRkcihoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc5Nyw2ICsxNzQ2LDM4IEBACiAJcmV0dXJuIGJ0dXNiX3JlY3ZfYnVsayhkYXRhLCBidWZmZXIsIGNvdW50KTsKIH0KIAorc3RhdGljIHZvaWQgYnR1c2JfaW50ZWxfYm9vdHVwKHN0cnVjdCBidHVzYl9kYXRhICpkYXRhLCBjb25zdCB2b2lkICpwdHIsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwljb25zdCBzdHJ1Y3QgaW50ZWxfYm9vdHVwICpldnQgPSBwdHI7CisKKwlpZiAobGVuICE9IHNpemVvZigqZXZ0KSkKKwkJcmV0dXJuOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCVFVTQl9CT09USU5HLCAmZGF0YS0+ZmxhZ3MpKSB7CisJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7CisJCXdha2VfdXBfYml0KCZkYXRhLT5mbGFncywgQlRVU0JfQk9PVElORyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBidHVzYl9pbnRlbF9zZWN1cmVfc2VuZF9yZXN1bHQoc3RydWN0IGJ0dXNiX2RhdGEgKmRhdGEsCisJCQkJCSAgIGNvbnN0IHZvaWQgKnB0ciwgdW5zaWduZWQgaW50IGxlbikKK3sKKwljb25zdCBzdHJ1Y3QgaW50ZWxfc2VjdXJlX3NlbmRfcmVzdWx0ICpldnQgPSBwdHI7CisKKwlpZiAobGVuICE9IHNpemVvZigqZXZ0KSkKKwkJcmV0dXJuOworCisJaWYgKGV2dC0+cmVzdWx0KQorCQlzZXRfYml0KEJUVVNCX0ZJUk1XQVJFX0ZBSUxFRCwgJmRhdGEtPmZsYWdzKTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQlRVU0JfRE9XTkxPQURJTkcsICZkYXRhLT5mbGFncykgJiYKKwkgICAgdGVzdF9iaXQoQlRVU0JfRklSTVdBUkVfTE9BREVELCAmZGF0YS0+ZmxhZ3MpKSB7CisJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7CisJCXdha2VfdXBfYml0KCZkYXRhLT5mbGFncywgQlRVU0JfRE9XTkxPQURJTkcpOworCX0KK30KKwogc3RhdGljIGludCBidHVzYl9yZWN2X2V2ZW50X2ludGVsKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBidHVzYl9kYXRhICpkYXRhID0gaGNpX2dldF9kcnZkYXRhKGhkZXYpOwpAQCAtMTgwNCwzMiArMTc4NSwyNyBAQAogCWlmICh0ZXN0X2JpdChCVFVTQl9CT09UTE9BREVSLCAmZGF0YS0+ZmxhZ3MpKSB7CiAJCXN0cnVjdCBoY2lfZXZlbnRfaGRyICpoZHIgPSAodm9pZCAqKXNrYi0+ZGF0YTsKIAotCQkvKiBXaGVuIHRoZSBmaXJtd2FyZSBsb2FkaW5nIGNvbXBsZXRlcyB0aGUgZGV2aWNlIHNlbmRzCi0JCSAqIG91dCBhIHZlbmRvciBzcGVjaWZpYyBldmVudCBpbmRpY2F0aW5nIHRoZSByZXN1bHQgb2YKLQkJICogdGhlIGZpcm13YXJlIGxvYWRpbmcuCi0JCSAqLwotCQlpZiAoc2tiLT5sZW4gPT0gNyAmJiBoZHItPmV2dCA9PSAweGZmICYmIGhkci0+cGxlbiA9PSAweDA1ICYmCi0JCSAgICBza2ItPmRhdGFbMl0gPT0gMHgwNikgewotCQkJaWYgKHNrYi0+ZGF0YVszXSAhPSAweDAwKQotCQkJCXRlc3RfYml0KEJUVVNCX0ZJUk1XQVJFX0ZBSUxFRCwgJmRhdGEtPmZsYWdzKTsKKwkJaWYgKHNrYi0+bGVuID4gSENJX0VWRU5UX0hEUl9TSVpFICYmIGhkci0+ZXZ0ID09IDB4ZmYgJiYKKwkJICAgIGhkci0+cGxlbiA+IDApIHsKKwkJCWNvbnN0IHZvaWQgKnB0ciA9IHNrYi0+ZGF0YSArIEhDSV9FVkVOVF9IRFJfU0laRSArIDE7CisJCQl1bnNpZ25lZCBpbnQgbGVuID0gc2tiLT5sZW4gLSBIQ0lfRVZFTlRfSERSX1NJWkUgLSAxOwogCi0JCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJUVVNCX0RPV05MT0FESU5HLAotCQkJCQkgICAgICAgJmRhdGEtPmZsYWdzKSAmJgotCQkJICAgIHRlc3RfYml0KEJUVVNCX0ZJUk1XQVJFX0xPQURFRCwgJmRhdGEtPmZsYWdzKSkgewotCQkJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7Ci0JCQkJd2FrZV91cF9iaXQoJmRhdGEtPmZsYWdzLCBCVFVTQl9ET1dOTE9BRElORyk7Ci0JCQl9Ci0JCX0KLQotCQkvKiBXaGVuIHN3aXRjaGluZyB0byB0aGUgb3BlcmF0aW9uYWwgZmlybXdhcmUgdGhlIGRldmljZQotCQkgKiBzZW5kcyBhIHZlbmRvciBzcGVjaWZpYyBldmVudCBpbmRpY2F0aW5nIHRoYXQgdGhlIGJvb3R1cAotCQkgKiBjb21wbGV0ZWQuCi0JCSAqLwotCQlpZiAoc2tiLT5sZW4gPT0gOSAmJiBoZHItPmV2dCA9PSAweGZmICYmIGhkci0+cGxlbiA9PSAweDA3ICYmCi0JCSAgICBza2ItPmRhdGFbMl0gPT0gMHgwMikgewotCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCVFVTQl9CT09USU5HLCAmZGF0YS0+ZmxhZ3MpKSB7Ci0JCQkJc21wX21iX19hZnRlcl9hdG9taWMoKTsKLQkJCQl3YWtlX3VwX2JpdCgmZGF0YS0+ZmxhZ3MsIEJUVVNCX0JPT1RJTkcpOworCQkJc3dpdGNoIChza2ItPmRhdGFbMl0pIHsKKwkJCWNhc2UgMHgwMjoKKwkJCQkvKiBXaGVuIHN3aXRjaGluZyB0byB0aGUgb3BlcmF0aW9uYWwgZmlybXdhcmUKKwkJCQkgKiB0aGUgZGV2aWNlIHNlbmRzIGEgdmVuZG9yIHNwZWNpZmljIGV2ZW50CisJCQkJICogaW5kaWNhdGluZyB0aGF0IHRoZSBib290dXAgY29tcGxldGVkLgorCQkJCSAqLworCQkJCWJ0dXNiX2ludGVsX2Jvb3R1cChkYXRhLCBwdHIsIGxlbik7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MDY6CisJCQkJLyogV2hlbiB0aGUgZmlybXdhcmUgbG9hZGluZyBjb21wbGV0ZXMgdGhlCisJCQkJICogZGV2aWNlIHNlbmRzIG91dCBhIHZlbmRvciBzcGVjaWZpYyBldmVudAorCQkJCSAqIGluZGljYXRpbmcgdGhlIHJlc3VsdCBvZiB0aGUgZmlybXdhcmUKKwkJCQkgKiBsb2FkaW5nLgorCQkJCSAqLworCQkJCWJ0dXNiX2ludGVsX3NlY3VyZV9zZW5kX3Jlc3VsdChkYXRhLCBwdHIsIGxlbik7CisJCQkJYnJlYWs7CiAJCQl9CiAJCX0KIAl9CkBAIC0yMDMxLDcgKzIwMDcsNyBAQAogCWlmICh2ZXItPmZ3X3ZhcmlhbnQgPT0gMHgyMykgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJY2xlYXJfYml0KEJUVVNCX0JPT1RMT0FERVIsICZkYXRhLT5mbGFncyk7Ci0JCWJ0dXNiX2NoZWNrX2JkYWRkcl9pbnRlbChoZGV2KTsKKwkJYnRpbnRlbF9jaGVja19iZGFkZHIoaGRldik7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjE5Nyw5ICsyMTczLDkgQEAKIAkgKiBhbmQgdGh1cyBqdXN0IHRpbWVvdXQgaWYgdGhhdCBoYXBwZW5zIGFuZCBmYWlsIHRoZSBzZXR1cAogCSAqIG9mIHRoaXMgZGV2aWNlLgogCSAqLwotCWVyciA9IGJ0dXNiX3dhaXRfb25fYml0X3RpbWVvdXQoJmRhdGEtPmZsYWdzLCBCVFVTQl9ET1dOTE9BRElORywKLQkJCQkJbXNlY3NfdG9famlmZmllcyg1MDAwKSwKLQkJCQkJVEFTS19JTlRFUlJVUFRJQkxFKTsKKwllcnIgPSB3YWl0X29uX2JpdF90aW1lb3V0KCZkYXRhLT5mbGFncywgQlRVU0JfRE9XTkxPQURJTkcsCisJCQkJICBUQVNLX0lOVEVSUlVQVElCTEUsCisJCQkJICBtc2Vjc190b19qaWZmaWVzKDUwMDApKTsKIAlpZiAoZXJyID09IDEpIHsKIAkJQlRfRVJSKCIlczogRmlybXdhcmUgbG9hZGluZyBpbnRlcnJ1cHRlZCIsIGhkZXYtPm5hbWUpOwogCQllcnIgPSAtRUlOVFI7CkBAIC0yMjUwLDkgKzIyMjYsOSBAQAogCSAqLwogCUJUX0lORk8oIiVzOiBXYWl0aW5nIGZvciBkZXZpY2UgdG8gYm9vdCIsIGhkZXYtPm5hbWUpOwogCi0JZXJyID0gYnR1c2Jfd2FpdF9vbl9iaXRfdGltZW91dCgmZGF0YS0+ZmxhZ3MsIEJUVVNCX0JPT1RJTkcsCi0JCQkJCW1zZWNzX3RvX2ppZmZpZXMoMTAwMCksCi0JCQkJCVRBU0tfSU5URVJSVVBUSUJMRSk7CisJZXJyID0gd2FpdF9vbl9iaXRfdGltZW91dCgmZGF0YS0+ZmxhZ3MsIEJUVVNCX0JPT1RJTkcsCisJCQkJICBUQVNLX0lOVEVSUlVQVElCTEUsCisJCQkJICBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKIAogCWlmIChlcnIgPT0gMSkgewogCQlCVF9FUlIoIiVzOiBEZXZpY2UgYm9vdCBpbnRlcnJ1cHRlZCIsIGhkZXYtPm5hbWUpOwpAQCAtMjMxNSwxNSArMjI5MSwxOSBAQAogCWtmcmVlX3NrYihza2IpOwogfQogCi1zdGF0aWMgaW50IGJ0dXNiX3NldF9iZGFkZHJfaW50ZWwoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGNvbnN0IGJkYWRkcl90ICpiZGFkZHIpCitzdGF0aWMgaW50IGJ0dXNiX3NodXRkb3duX2ludGVsKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJbG9uZyByZXQ7CiAKLQlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCAweGZjMzEsIDYsIGJkYWRkciwgSENJX0lOSVRfVElNRU9VVCk7CisJLyogU29tZSBwbGF0Zm9ybXMgaGF2ZSBhbiBpc3N1ZSB3aXRoIEJUIExFRCB3aGVuIHRoZSBpbnRlcmZhY2UgaXMKKwkgKiBkb3duIG9yIEJUIHJhZGlvIGlzIHR1cm5lZCBvZmYsIHdoaWNoIHRha2VzIDUgc2Vjb25kcyB0byBCVCBMRUQKKwkgKiBnb2VzIG9mZi4gVGhpcyBjb21tYW5kIHR1cm5zIG9mZiB0aGUgQlQgTEVEIGltbWVkaWF0ZWx5LgorCSAqLworCXNrYiA9IF9faGNpX2NtZF9zeW5jKGhkZXYsIDB4ZmMzZiwgMCwgTlVMTCwgSENJX0lOSVRfVElNRU9VVCk7CiAJaWYgKElTX0VSUihza2IpKSB7CiAJCXJldCA9IFBUUl9FUlIoc2tiKTsKLQkJQlRfRVJSKCIlczogY2hhbmdpbmcgSW50ZWwgZGV2aWNlIGFkZHJlc3MgZmFpbGVkICglbGQpIiwKKwkJQlRfRVJSKCIlczogdHVybmluZyBvZmYgSW50ZWwgZGV2aWNlIExFRCBmYWlsZWQgKCVsZCkiLAogCQkgICAgICAgaGRldi0+bmFtZSwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0yMzU1LDIxMSArMjMzNSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgQkRBRERSX0JDTTIwNzAyQTAgKCYoYmRhZGRyX3QpIHt7MHgwMCwgMHhhMCwgMHgwMiwgMHg3MCwgMHgyMCwgMHgwMH19KQotCi1zdGF0aWMgaW50IGJ0dXNiX3NldHVwX2JjbV9wYXRjaHJhbShzdHJ1Y3QgaGNpX2RldiAqaGRldikKLXsKLQlzdHJ1Y3QgYnR1c2JfZGF0YSAqZGF0YSA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGRhdGEtPnVkZXY7Ci0JY2hhciBmd19uYW1lWzY0XTsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwotCWNvbnN0IHU4ICpmd19wdHI7Ci0Jc2l6ZV90IGZ3X3NpemU7Ci0JY29uc3Qgc3RydWN0IGhjaV9jb21tYW5kX2hkciAqY21kOwotCWNvbnN0IHU4ICpjbWRfcGFyYW07Ci0JdTE2IG9wY29kZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCBoY2lfcnBfcmVhZF9sb2NhbF92ZXJzaW9uICp2ZXI7Ci0Jc3RydWN0IGhjaV9ycF9yZWFkX2JkX2FkZHIgKmJkYTsKLQlsb25nIHJldDsKLQotCXNucHJpbnRmKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgImJyY20vJXMtJTA0eC0lMDR4LmhjZCIsCi0JCSB1ZGV2LT5wcm9kdWN0ID8gdWRldi0+cHJvZHVjdCA6ICJCQ00iLAotCQkgbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCi0JCSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpOwotCi0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X25hbWUsICZoZGV2LT5kZXYpOwotCWlmIChyZXQgPCAwKSB7Ci0JCUJUX0lORk8oIiVzOiBCQ006IHBhdGNoICVzIG5vdCBmb3VuZCIsIGhkZXYtPm5hbWUsIGZ3X25hbWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBSZXNldCAqLwotCXNrYiA9IF9faGNpX2NtZF9zeW5jKGhkZXYsIEhDSV9PUF9SRVNFVCwgMCwgTlVMTCwgSENJX0lOSVRfVElNRU9VVCk7Ci0JaWYgKElTX0VSUihza2IpKSB7Ci0JCXJldCA9IFBUUl9FUlIoc2tiKTsKLQkJQlRfRVJSKCIlczogSENJX09QX1JFU0VUIGZhaWxlZCAoJWxkKSIsIGhkZXYtPm5hbWUsIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0KLQkvKiBSZWFkIExvY2FsIFZlcnNpb24gSW5mbyAqLwotCXNrYiA9IF9faGNpX2NtZF9zeW5jKGhkZXYsIEhDSV9PUF9SRUFEX0xPQ0FMX1ZFUlNJT04sIDAsIE5VTEwsCi0JCQkgICAgIEhDSV9JTklUX1RJTUVPVVQpOwotCWlmIChJU19FUlIoc2tiKSkgewotCQlyZXQgPSBQVFJfRVJSKHNrYik7Ci0JCUJUX0VSUigiJXM6IEhDSV9PUF9SRUFEX0xPQ0FMX1ZFUlNJT04gZmFpbGVkICglbGQpIiwKLQkJICAgICAgIGhkZXYtPm5hbWUsIHJldCk7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAoc2tiLT5sZW4gIT0gc2l6ZW9mKCp2ZXIpKSB7Ci0JCUJUX0VSUigiJXM6IEhDSV9PUF9SRUFEX0xPQ0FMX1ZFUlNJT04gZXZlbnQgbGVuZ3RoIG1pc21hdGNoIiwKLQkJICAgICAgIGhkZXYtPm5hbWUpOwotCQlrZnJlZV9za2Ioc2tiKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBkb25lOwotCX0KLQotCXZlciA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfdmVyc2lvbiAqKXNrYi0+ZGF0YTsKLQlCVF9JTkZPKCIlczogQkNNOiBwYXRjaGluZyBoY2lfdmVyPSUwMnggaGNpX3Jldj0lMDR4IGxtcF92ZXI9JTAyeCAiCi0JCSJsbXBfc3VidmVyPSUwNHgiLCBoZGV2LT5uYW1lLCB2ZXItPmhjaV92ZXIsIHZlci0+aGNpX3JldiwKLQkJdmVyLT5sbXBfdmVyLCB2ZXItPmxtcF9zdWJ2ZXIpOwotCWtmcmVlX3NrYihza2IpOwotCi0JLyogU3RhcnQgRG93bmxvYWQgKi8KLQlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCAweGZjMmUsIDAsIE5VTEwsIEhDSV9JTklUX1RJTUVPVVQpOwotCWlmIChJU19FUlIoc2tiKSkgewotCQlyZXQgPSBQVFJfRVJSKHNrYik7Ci0JCUJUX0VSUigiJXM6IEJDTTogRG93bmxvYWQgTWluaWRydiBjb21tYW5kIGZhaWxlZCAoJWxkKSIsCi0JCSAgICAgICBoZGV2LT5uYW1lLCByZXQpOwotCQlnb3RvIHJlc2V0X2Z3OwotCX0KLQlrZnJlZV9za2Ioc2tiKTsKLQotCS8qIDUwIG1zZWMgZGVsYXkgYWZ0ZXIgRG93bmxvYWQgTWluaWRydiBjb21wbGV0ZXMgKi8KLQltc2xlZXAoNTApOwotCi0JZndfcHRyID0gZnctPmRhdGE7Ci0JZndfc2l6ZSA9IGZ3LT5zaXplOwotCi0Jd2hpbGUgKGZ3X3NpemUgPj0gc2l6ZW9mKCpjbWQpKSB7Ci0JCWNtZCA9IChzdHJ1Y3QgaGNpX2NvbW1hbmRfaGRyICopZndfcHRyOwotCQlmd19wdHIgKz0gc2l6ZW9mKCpjbWQpOwotCQlmd19zaXplIC09IHNpemVvZigqY21kKTsKLQotCQlpZiAoZndfc2l6ZSA8IGNtZC0+cGxlbikgewotCQkJQlRfRVJSKCIlczogQkNNOiBwYXRjaCAlcyBpcyBjb3JydXB0ZWQiLAotCQkJICAgICAgIGhkZXYtPm5hbWUsIGZ3X25hbWUpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gcmVzZXRfZnc7Ci0JCX0KLQotCQljbWRfcGFyYW0gPSBmd19wdHI7Ci0JCWZ3X3B0ciArPSBjbWQtPnBsZW47Ci0JCWZ3X3NpemUgLT0gY21kLT5wbGVuOwotCi0JCW9wY29kZSA9IGxlMTZfdG9fY3B1KGNtZC0+b3Bjb2RlKTsKLQotCQlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCBvcGNvZGUsIGNtZC0+cGxlbiwgY21kX3BhcmFtLAotCQkJCSAgICAgSENJX0lOSVRfVElNRU9VVCk7Ci0JCWlmIChJU19FUlIoc2tiKSkgewotCQkJcmV0ID0gUFRSX0VSUihza2IpOwotCQkJQlRfRVJSKCIlczogQkNNOiBwYXRjaCBjb21tYW5kICUwNHggZmFpbGVkICglbGQpIiwKLQkJCSAgICAgICBoZGV2LT5uYW1lLCBvcGNvZGUsIHJldCk7Ci0JCQlnb3RvIHJlc2V0X2Z3OwotCQl9Ci0JCWtmcmVlX3NrYihza2IpOwotCX0KLQotCS8qIDI1MCBtc2VjIGRlbGF5IGFmdGVyIExhdW5jaCBSYW0gY29tcGxldGVzICovCi0JbXNsZWVwKDI1MCk7Ci0KLXJlc2V0X2Z3OgotCS8qIFJlc2V0ICovCi0Jc2tiID0gX19oY2lfY21kX3N5bmMoaGRldiwgSENJX09QX1JFU0VULCAwLCBOVUxMLCBIQ0lfSU5JVF9USU1FT1VUKTsKLQlpZiAoSVNfRVJSKHNrYikpIHsKLQkJcmV0ID0gUFRSX0VSUihza2IpOwotCQlCVF9FUlIoIiVzOiBIQ0lfT1BfUkVTRVQgZmFpbGVkICglbGQpIiwgaGRldi0+bmFtZSwgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQlrZnJlZV9za2Ioc2tiKTsKLQotCS8qIFJlYWQgTG9jYWwgVmVyc2lvbiBJbmZvICovCi0Jc2tiID0gX19oY2lfY21kX3N5bmMoaGRldiwgSENJX09QX1JFQURfTE9DQUxfVkVSU0lPTiwgMCwgTlVMTCwKLQkJCSAgICAgSENJX0lOSVRfVElNRU9VVCk7Ci0JaWYgKElTX0VSUihza2IpKSB7Ci0JCXJldCA9IFBUUl9FUlIoc2tiKTsKLQkJQlRfRVJSKCIlczogSENJX09QX1JFQURfTE9DQUxfVkVSU0lPTiBmYWlsZWQgKCVsZCkiLAotCQkgICAgICAgaGRldi0+bmFtZSwgcmV0KTsKLQkJZ290byBkb25lOwotCX0KLQotCWlmIChza2ItPmxlbiAhPSBzaXplb2YoKnZlcikpIHsKLQkJQlRfRVJSKCIlczogSENJX09QX1JFQURfTE9DQUxfVkVSU0lPTiBldmVudCBsZW5ndGggbWlzbWF0Y2giLAotCQkgICAgICAgaGRldi0+bmFtZSk7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JdmVyID0gKHN0cnVjdCBoY2lfcnBfcmVhZF9sb2NhbF92ZXJzaW9uICopc2tiLT5kYXRhOwotCUJUX0lORk8oIiVzOiBCQ006IGZpcm13YXJlIGhjaV92ZXI9JTAyeCBoY2lfcmV2PSUwNHggbG1wX3Zlcj0lMDJ4ICIKLQkJImxtcF9zdWJ2ZXI9JTA0eCIsIGhkZXYtPm5hbWUsIHZlci0+aGNpX3ZlciwgdmVyLT5oY2lfcmV2LAotCQl2ZXItPmxtcF92ZXIsIHZlci0+bG1wX3N1YnZlcik7Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0KLQkvKiBSZWFkIEJEIEFkZHJlc3MgKi8KLQlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCBIQ0lfT1BfUkVBRF9CRF9BRERSLCAwLCBOVUxMLAotCQkJICAgICBIQ0lfSU5JVF9USU1FT1VUKTsKLQlpZiAoSVNfRVJSKHNrYikpIHsKLQkJcmV0ID0gUFRSX0VSUihza2IpOwotCQlCVF9FUlIoIiVzOiBIQ0lfT1BfUkVBRF9CRF9BRERSIGZhaWxlZCAoJWxkKSIsCi0JCSAgICAgICBoZGV2LT5uYW1lLCByZXQpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKHNrYi0+bGVuICE9IHNpemVvZigqYmRhKSkgewotCQlCVF9FUlIoIiVzOiBIQ0lfT1BfUkVBRF9CRF9BRERSIGV2ZW50IGxlbmd0aCBtaXNtYXRjaCIsCi0JCSAgICAgICBoZGV2LT5uYW1lKTsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQliZGEgPSAoc3RydWN0IGhjaV9ycF9yZWFkX2JkX2FkZHIgKilza2ItPmRhdGE7Ci0JaWYgKGJkYS0+c3RhdHVzKSB7Ci0JCUJUX0VSUigiJXM6IEhDSV9PUF9SRUFEX0JEX0FERFIgZXJyb3Igc3RhdHVzICglMDJ4KSIsCi0JCSAgICAgICBoZGV2LT5uYW1lLCBiZGEtPnN0YXR1cyk7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXQgPSAtYnRfdG9fZXJybm8oYmRhLT5zdGF0dXMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogVGhlIGFkZHJlc3MgMDA6MjA6NzA6MDI6QTA6MDAgaW5kaWNhdGVzIGEgQkNNMjA3MDJBMCBjb250cm9sbGVyCi0JICogd2l0aCBubyBjb25maWd1cmVkIGFkZHJlc3MuCi0JICovCi0JaWYgKCFiYWNtcCgmYmRhLT5iZGFkZHIsIEJEQUREUl9CQ00yMDcwMkEwKSkgewotCQlCVF9JTkZPKCIlczogQkNNOiB1c2luZyBkZWZhdWx0IGRldmljZSBhZGRyZXNzICglcE1SKSIsCi0JCQloZGV2LT5uYW1lLCAmYmRhLT5iZGFkZHIpOwotCQlzZXRfYml0KEhDSV9RVUlSS19JTlZBTElEX0JEQUREUiwgJmhkZXYtPnF1aXJrcyk7Ci0JfQotCi0Ja2ZyZWVfc2tiKHNrYik7Ci0KLWRvbmU6Ci0JcmVsZWFzZV9maXJtd2FyZShmdyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGJ0dXNiX3NldF9iZGFkZHJfYmNtKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBjb25zdCBiZGFkZHJfdCAqYmRhZGRyKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0JbG9uZyByZXQ7Ci0KLQlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCAweGZjMDEsIDYsIGJkYWRkciwgSENJX0lOSVRfVElNRU9VVCk7Ci0JaWYgKElTX0VSUihza2IpKSB7Ci0JCXJldCA9IFBUUl9FUlIoc2tiKTsKLQkJQlRfRVJSKCIlczogQkNNOiBDaGFuZ2UgYWRkcmVzcyBjb21tYW5kIGZhaWxlZCAoJWxkKSIsCi0JCSAgICAgICBoZGV2LT5uYW1lLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlrZnJlZV9za2Ioc2tiKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGJ0dXNiX3NldF9iZGFkZHJfYXRoMzAxMihzdHJ1Y3QgaGNpX2RldiAqaGRldiwKIAkJCQkgICAgY29uc3QgYmRhZGRyX3QgKmJkYWRkcikKIHsKQEAgLTI1ODUsNiArMjM2MCwyNTggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBRQ0FfREZVX1BBQ0tFVF9MRU4JNDA5NgorCisjZGVmaW5lIFFDQV9HRVRfVEFSR0VUX1ZFUlNJT04JMHgwOQorI2RlZmluZSBRQ0FfQ0hFQ0tfU1RBVFVTCTB4MDUKKyNkZWZpbmUgUUNBX0RGVV9ET1dOTE9BRAkweDAxCisKKyNkZWZpbmUgUUNBX1NZU0NGR19VUERBVEVECTB4NDAKKyNkZWZpbmUgUUNBX1BBVENIX1VQREFURUQJMHg4MAorI2RlZmluZSBRQ0FfREZVX1RJTUVPVVQJCTMwMDAKKworc3RydWN0IHFjYV92ZXJzaW9uIHsKKwlfX2xlMzIJcm9tX3ZlcnNpb247CisJX19sZTMyCXBhdGNoX3ZlcnNpb247CisJX19sZTMyCXJhbV92ZXJzaW9uOworCV9fbGUzMglyZWZfY2xvY2s7CisJX191OAlyZXNlcnZlZFs0XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBxY2FfcmFtcGF0Y2hfdmVyc2lvbiB7CisJX19sZTE2CXJvbV92ZXJzaW9uOworCV9fbGUxNglwYXRjaF92ZXJzaW9uOworfSBfX3BhY2tlZDsKKworc3RydWN0IHFjYV9kZXZpY2VfaW5mbyB7CisJdTMyCXJvbV92ZXJzaW9uOworCXU4CXJhbXBhdGNoX2hkcjsJLyogbGVuZ3RoIG9mIGhlYWRlciBpbiByYW1wYXRjaCAqLworCXU4CW52bV9oZHI7CS8qIGxlbmd0aCBvZiBoZWFkZXIgaW4gTlZNICovCisJdTgJdmVyX29mZnNldDsJLyogb2Zmc2V0IG9mIHZlcnNpb24gc3RydWN0dXJlIGluIHJhbXBhdGNoICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHFjYV9kZXZpY2VfaW5mbyBxY2FfZGV2aWNlc190YWJsZVtdID0geworCXsgMHgwMDAwMDEwMCwgMjAsIDQsIDEwIH0sIC8qIFJvbWUgMS4wICovCisJeyAweDAwMDAwMTAxLCAyMCwgNCwgMTAgfSwgLyogUm9tZSAxLjEgKi8KKwl7IDB4MDAwMDAyMDEsIDI4LCA0LCAxOCB9LCAvKiBSb21lIDIuMSAqLworCXsgMHgwMDAwMDMwMCwgMjgsIDQsIDE4IH0sIC8qIFJvbWUgMy4wICovCisJeyAweDAwMDAwMzAyLCAyOCwgNCwgMTggfSwgLyogUm9tZSAzLjIgKi8KK307CisKK3N0YXRpYyBpbnQgYnR1c2JfcWNhX3NlbmRfdmVuZG9yX3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggcmVxdWVzdCwKKwkJCQkgICAgIHZvaWQgKmRhdGEsIHUxNiBzaXplKQoreworCXN0cnVjdCBidHVzYl9kYXRhICpidGRhdGEgPSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBidGRhdGEtPnVkZXY7CisJaW50IHBpcGUsIGVycjsKKwl1OCAqYnVmOworCisJYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBGb3VuZCBzb21lIG9mIFVTQiBob3N0cyBoYXZlIElPVCBpc3N1ZXMgd2l0aCBvdXJzIHNvIHRoYXQgd2Ugc2hvdWxkCisJICogbm90IHdhaXQgdW50aWwgSENJIGxheWVyIGlzIHJlYWR5LgorCSAqLworCXBpcGUgPSB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCk7CisJZXJyID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHBpcGUsIHJlcXVlc3QsIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9ESVJfSU4sCisJCQkgICAgICAwLCAwLCBidWYsIHNpemUsIFVTQl9DVFJMX1NFVF9USU1FT1VUKTsKKwlpZiAoZXJyIDwgMCkgeworCQlCVF9FUlIoIiVzOiBGYWlsZWQgdG8gYWNjZXNzIG90cCBhcmVhICglZCkiLCBoZGV2LT5uYW1lLCBlcnIpOworCQlnb3RvIGRvbmU7CisJfQorCisJbWVtY3B5KGRhdGEsIGJ1Ziwgc2l6ZSk7CisKK2RvbmU6CisJa2ZyZWUoYnVmKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYnR1c2Jfc2V0dXBfcWNhX2Rvd25sb2FkX2Z3KHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlLAorCQkJCSAgICAgICBzaXplX3QgaGRyX3NpemUpCit7CisJc3RydWN0IGJ0dXNiX2RhdGEgKmJ0ZGF0YSA9IGhjaV9nZXRfZHJ2ZGF0YShoZGV2KTsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGJ0ZGF0YS0+dWRldjsKKwlzaXplX3QgY291bnQsIHNpemUsIHNlbnQgPSAwOworCWludCBwaXBlLCBsZW4sIGVycjsKKwl1OCAqYnVmOworCisJYnVmID0ga21hbGxvYyhRQ0FfREZVX1BBQ0tFVF9MRU4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvdW50ID0gZmlybXdhcmUtPnNpemU7CisKKwlzaXplID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgaGRyX3NpemUpOworCW1lbWNweShidWYsIGZpcm13YXJlLT5kYXRhLCBzaXplKTsKKworCS8qIFVTQiBwYXRjaGVzIHNob3VsZCBnbyBkb3duIHRvIGNvbnRyb2xsZXIgdGhyb3VnaCBVU0IgcGF0aAorCSAqIGJlY2F1c2UgYmluYXJ5IGZvcm1hdCBmaXRzIHRvIGdvIGRvd24gdGhyb3VnaCBVU0IgY2hhbm5lbC4KKwkgKiBVU0IgY29udHJvbCBwYXRoIGlzIGZvciBwYXRjaGluZyBoZWFkZXJzIGFuZCBVU0IgYnVsayBpcyBmb3IKKwkgKiBwYXRjaCBib2R5LgorCSAqLworCXBpcGUgPSB1c2Jfc25kY3RybHBpcGUodWRldiwgMCk7CisJZXJyID0gdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHBpcGUsIFFDQV9ERlVfRE9XTkxPQUQsIFVTQl9UWVBFX1ZFTkRPUiwKKwkJCSAgICAgIDAsIDAsIGJ1Ziwgc2l6ZSwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCWlmIChlcnIgPCAwKSB7CisJCUJUX0VSUigiJXM6IEZhaWxlZCB0byBzZW5kIGhlYWRlcnMgKCVkKSIsIGhkZXYtPm5hbWUsIGVycik7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzZW50ICs9IHNpemU7CisJY291bnQgLT0gc2l6ZTsKKworCXdoaWxlIChjb3VudCkgeworCQlzaXplID0gbWluX3Qoc2l6ZV90LCBjb3VudCwgUUNBX0RGVV9QQUNLRVRfTEVOKTsKKworCQltZW1jcHkoYnVmLCBmaXJtd2FyZS0+ZGF0YSArIHNlbnQsIHNpemUpOworCisJCXBpcGUgPSB1c2Jfc25kYnVsa3BpcGUodWRldiwgMHgwMik7CisJCWVyciA9IHVzYl9idWxrX21zZyh1ZGV2LCBwaXBlLCBidWYsIHNpemUsICZsZW4sCisJCQkJICAgUUNBX0RGVV9USU1FT1VUKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCUJUX0VSUigiJXM6IEZhaWxlZCB0byBzZW5kIGJvZHkgYXQgJXpkIG9mICV6ZCAoJWQpIiwKKwkJCSAgICAgICBoZGV2LT5uYW1lLCBzZW50LCBmaXJtd2FyZS0+c2l6ZSwgZXJyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNpemUgIT0gbGVuKSB7CisJCQlCVF9FUlIoIiVzOiBGYWlsZWQgdG8gZ2V0IGJ1bGsgYnVmZmVyIiwgaGRldi0+bmFtZSk7CisJCQllcnIgPSAtRUlMU0VROworCQkJYnJlYWs7CisJCX0KKworCQlzZW50ICArPSBzaXplOworCQljb3VudCAtPSBzaXplOworCX0KKworZG9uZToKKwlrZnJlZShidWYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYnR1c2Jfc2V0dXBfcWNhX2xvYWRfcmFtcGF0Y2goc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkJCSBzdHJ1Y3QgcWNhX3ZlcnNpb24gKnZlciwKKwkJCQkJIGNvbnN0IHN0cnVjdCBxY2FfZGV2aWNlX2luZm8gKmluZm8pCit7CisJc3RydWN0IHFjYV9yYW1wYXRjaF92ZXJzaW9uICpydmVyOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJdTMyIHZlcl9yb20sIHZlcl9wYXRjaDsKKwl1MTYgcnZlcl9yb20sIHJ2ZXJfcGF0Y2g7CisJY2hhciBmd25hbWVbNjRdOworCWludCBlcnI7CisKKwl2ZXJfcm9tID0gbGUzMl90b19jcHUodmVyLT5yb21fdmVyc2lvbik7CisJdmVyX3BhdGNoID0gbGUzMl90b19jcHUodmVyLT5wYXRjaF92ZXJzaW9uKTsKKworCXNucHJpbnRmKGZ3bmFtZSwgc2l6ZW9mKGZ3bmFtZSksICJxY2EvcmFtcGF0Y2hfdXNiXyUwOHguYmluIiwgdmVyX3JvbSk7CisKKwllcnIgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZnduYW1lLCAmaGRldi0+ZGV2KTsKKwlpZiAoZXJyKSB7CisJCUJUX0VSUigiJXM6IGZhaWxlZCB0byByZXF1ZXN0IHJhbXBhdGNoIGZpbGU6ICVzICglZCkiLAorCQkgICAgICAgaGRldi0+bmFtZSwgZnduYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCUJUX0lORk8oIiVzOiB1c2luZyByYW1wYXRjaCBmaWxlOiAlcyIsIGhkZXYtPm5hbWUsIGZ3bmFtZSk7CisKKwlydmVyID0gKHN0cnVjdCBxY2FfcmFtcGF0Y2hfdmVyc2lvbiAqKShmdy0+ZGF0YSArIGluZm8tPnZlcl9vZmZzZXQpOworCXJ2ZXJfcm9tID0gbGUxNl90b19jcHUocnZlci0+cm9tX3ZlcnNpb24pOworCXJ2ZXJfcGF0Y2ggPSBsZTE2X3RvX2NwdShydmVyLT5wYXRjaF92ZXJzaW9uKTsKKworCUJUX0lORk8oIiVzOiBRQ0E6IHBhdGNoIHJvbWUgMHgleCBidWlsZCAweCV4LCBmaXJtd2FyZSByb21lIDB4JXggIgorCQkiYnVpbGQgMHgleCIsIGhkZXYtPm5hbWUsIHJ2ZXJfcm9tLCBydmVyX3BhdGNoLCB2ZXJfcm9tLAorCQl2ZXJfcGF0Y2gpOworCisJaWYgKHJ2ZXJfcm9tICE9IHZlcl9yb20gfHwgcnZlcl9wYXRjaCA8PSB2ZXJfcGF0Y2gpIHsKKwkJQlRfRVJSKCIlczogcmFtcGF0Y2ggZmlsZSB2ZXJzaW9uIGRpZCBub3QgbWF0Y2ggd2l0aCBmaXJtd2FyZSIsCisJCSAgICAgICBoZGV2LT5uYW1lKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWVyciA9IGJ0dXNiX3NldHVwX3FjYV9kb3dubG9hZF9mdyhoZGV2LCBmdywgaW5mby0+cmFtcGF0Y2hfaGRyKTsKKworZG9uZToKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgYnR1c2Jfc2V0dXBfcWNhX2xvYWRfbnZtKHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCSAgICBzdHJ1Y3QgcWNhX3ZlcnNpb24gKnZlciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHFjYV9kZXZpY2VfaW5mbyAqaW5mbykKK3sKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCWNoYXIgZnduYW1lWzY0XTsKKwlpbnQgZXJyOworCisJc25wcmludGYoZnduYW1lLCBzaXplb2YoZnduYW1lKSwgInFjYS9udm1fdXNiXyUwOHguYmluIiwKKwkJIGxlMzJfdG9fY3B1KHZlci0+cm9tX3ZlcnNpb24pKTsKKworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd25hbWUsICZoZGV2LT5kZXYpOworCWlmIChlcnIpIHsKKwkJQlRfRVJSKCIlczogZmFpbGVkIHRvIHJlcXVlc3QgTlZNIGZpbGU6ICVzICglZCkiLAorCQkgICAgICAgaGRldi0+bmFtZSwgZnduYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCUJUX0lORk8oIiVzOiB1c2luZyBOVk0gZmlsZTogJXMiLCBoZGV2LT5uYW1lLCBmd25hbWUpOworCisJZXJyID0gYnR1c2Jfc2V0dXBfcWNhX2Rvd25sb2FkX2Z3KGhkZXYsIGZ3LCBpbmZvLT5udm1faGRyKTsKKworCXJlbGVhc2VfZmlybXdhcmUoZncpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBidHVzYl9zZXR1cF9xY2Eoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJY29uc3Qgc3RydWN0IHFjYV9kZXZpY2VfaW5mbyAqaW5mbyA9IE5VTEw7CisJc3RydWN0IHFjYV92ZXJzaW9uIHZlcjsKKwl1MzIgdmVyX3JvbTsKKwl1OCBzdGF0dXM7CisJaW50IGksIGVycjsKKworCWVyciA9IGJ0dXNiX3FjYV9zZW5kX3ZlbmRvcl9yZXEoaGRldiwgUUNBX0dFVF9UQVJHRVRfVkVSU0lPTiwgJnZlciwKKwkJCQkgICAgICAgIHNpemVvZih2ZXIpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXZlcl9yb20gPSBsZTMyX3RvX2NwdSh2ZXIucm9tX3ZlcnNpb24pOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHFjYV9kZXZpY2VzX3RhYmxlKTsgaSsrKSB7CisJCWlmICh2ZXJfcm9tID09IHFjYV9kZXZpY2VzX3RhYmxlW2ldLnJvbV92ZXJzaW9uKQorCQkJaW5mbyA9ICZxY2FfZGV2aWNlc190YWJsZVtpXTsKKwl9CisJaWYgKCFpbmZvKSB7CisJCUJUX0VSUigiJXM6IGRvbid0IHN1cHBvcnQgZmlybXdhcmUgcm9tZSAweCV4IiwgaGRldi0+bmFtZSwKKwkJICAgICAgIHZlcl9yb20pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllcnIgPSBidHVzYl9xY2Ffc2VuZF92ZW5kb3JfcmVxKGhkZXYsIFFDQV9DSEVDS19TVEFUVVMsICZzdGF0dXMsCisJCQkJCXNpemVvZihzdGF0dXMpKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICghKHN0YXR1cyAmIFFDQV9QQVRDSF9VUERBVEVEKSkgeworCQllcnIgPSBidHVzYl9zZXR1cF9xY2FfbG9hZF9yYW1wYXRjaChoZGV2LCAmdmVyLCBpbmZvKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmICghKHN0YXR1cyAmIFFDQV9TWVNDRkdfVVBEQVRFRCkpIHsKKwkJZXJyID0gYnR1c2Jfc2V0dXBfcWNhX2xvYWRfbnZtKGhkZXYsICZ2ZXIsIGluZm8pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYnR1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCiB7CkBAIC0yNzAxLDIzICsyNzI4LDI5IEBACiAJaWYgKGlkLT5kcml2ZXJfaW5mbyAmIEJUVVNCX0JDTTkyMDM1KQogCQloZGV2LT5zZXR1cCA9IGJ0dXNiX3NldHVwX2JjbTkyMDM1OwogCisjaWZkZWYgQ09ORklHX0JUX0hDSUJUVVNCX0JDTQogCWlmIChpZC0+ZHJpdmVyX2luZm8gJiBCVFVTQl9CQ01fUEFUQ0hSQU0pIHsKLQkJaGRldi0+c2V0dXAgPSBidHVzYl9zZXR1cF9iY21fcGF0Y2hyYW07Ci0JCWhkZXYtPnNldF9iZGFkZHIgPSBidHVzYl9zZXRfYmRhZGRyX2JjbTsKLQkJc2V0X2JpdChIQ0lfUVVJUktfU1RSSUNUX0RVUExJQ0FURV9GSUxURVIsICZoZGV2LT5xdWlya3MpOworCQloZGV2LT5zZXR1cCA9IGJ0YmNtX3NldHVwX3BhdGNocmFtOworCQloZGV2LT5zZXRfYmRhZGRyID0gYnRiY21fc2V0X2JkYWRkcjsKIAl9CiAKKwlpZiAoaWQtPmRyaXZlcl9pbmZvICYgQlRVU0JfQkNNX0FQUExFKQorCQloZGV2LT5zZXR1cCA9IGJ0YmNtX3NldHVwX2FwcGxlOworI2VuZGlmCisKIAlpZiAoaWQtPmRyaXZlcl9pbmZvICYgQlRVU0JfSU5URUwpIHsKIAkJaGRldi0+c2V0dXAgPSBidHVzYl9zZXR1cF9pbnRlbDsKLQkJaGRldi0+c2V0X2JkYWRkciA9IGJ0dXNiX3NldF9iZGFkZHJfaW50ZWw7CisJCWhkZXYtPnNodXRkb3duID0gYnR1c2Jfc2h1dGRvd25faW50ZWw7CisJCWhkZXYtPnNldF9iZGFkZHIgPSBidGludGVsX3NldF9iZGFkZHI7CiAJCXNldF9iaXQoSENJX1FVSVJLX1NUUklDVF9EVVBMSUNBVEVfRklMVEVSLCAmaGRldi0+cXVpcmtzKTsKKwkJc2V0X2JpdChIQ0lfUVVJUktfU0lNVUxUQU5FT1VTX0RJU0NPVkVSWSwgJmhkZXYtPnF1aXJrcyk7CiAJfQogCiAJaWYgKGlkLT5kcml2ZXJfaW5mbyAmIEJUVVNCX0lOVEVMX05FVykgewogCQloZGV2LT5zZW5kID0gYnR1c2Jfc2VuZF9mcmFtZV9pbnRlbDsKIAkJaGRldi0+c2V0dXAgPSBidHVzYl9zZXR1cF9pbnRlbF9uZXc7CiAJCWhkZXYtPmh3X2Vycm9yID0gYnR1c2JfaHdfZXJyb3JfaW50ZWw7Ci0JCWhkZXYtPnNldF9iZGFkZHIgPSBidHVzYl9zZXRfYmRhZGRyX2ludGVsOworCQloZGV2LT5zZXRfYmRhZGRyID0gYnRpbnRlbF9zZXRfYmRhZGRyOwogCQlzZXRfYml0KEhDSV9RVUlSS19TVFJJQ1RfRFVQTElDQVRFX0ZJTFRFUiwgJmhkZXYtPnF1aXJrcyk7CiAJfQogCkBAIC0yNzM0LDkgKzI3NjcsMTUgQEAKIAogCWlmIChpZC0+ZHJpdmVyX2luZm8gJiBCVFVTQl9BVEgzMDEyKSB7CiAJCWhkZXYtPnNldF9iZGFkZHIgPSBidHVzYl9zZXRfYmRhZGRyX2F0aDMwMTI7CisJCXNldF9iaXQoSENJX1FVSVJLX1NJTVVMVEFORU9VU19ESVNDT1ZFUlksICZoZGV2LT5xdWlya3MpOwogCQlzZXRfYml0KEhDSV9RVUlSS19TVFJJQ1RfRFVQTElDQVRFX0ZJTFRFUiwgJmhkZXYtPnF1aXJrcyk7CiAJfQogCisJaWYgKGlkLT5kcml2ZXJfaW5mbyAmIEJUVVNCX1FDQV9ST01FKSB7CisJCWRhdGEtPnNldHVwX29uX3VzYiA9IGJ0dXNiX3NldHVwX3FjYTsKKwkJaGRldi0+c2V0X2JkYWRkciA9IGJ0dXNiX3NldF9iZGFkZHJfYXRoMzAxMjsKKwl9CisKIAlpZiAoaWQtPmRyaXZlcl9pbmZvICYgQlRVU0JfQU1QKSB7CiAJCS8qIEFNUCBjb250cm9sbGVycyBkbyBub3Qgc3VwcG9ydCBTQ08gcGFja2V0cyAqLwogCQlkYXRhLT5pc29jID0gTlVMTDsKQEAgLTI3NzIsNiArMjgxMSw4IEBACiAJCS8qIEZha2UgQ1NSIGRldmljZXMgd2l0aCBicm9rZW4gY29tbWFuZHMgKi8KIAkJaWYgKGJjZERldmljZSA8PSAweDEwMCkKIAkJCWhkZXYtPnNldHVwID0gYnR1c2Jfc2V0dXBfY3NyOworCisJCXNldF9iaXQoSENJX1FVSVJLX1NJTVVMVEFORU9VU19ESVNDT1ZFUlksICZoZGV2LT5xdWlya3MpOwogCX0KIAogCWlmIChpZC0+ZHJpdmVyX2luZm8gJiBCVFVTQl9TTklGRkVSKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYXRoLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfYXRoLmMKaW5kZXggOWM0ZGNmNC4uMWIzZjg2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2F0aC5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9hdGguYwpAQCAtNDUsNiArNDUsNyBAQAogCXN0cnVjdCBoY2lfdWFydCAqaHU7CiAJdW5zaWduZWQgaW50IGN1cl9zbGVlcDsKIAorCXN0cnVjdCBza19idWZmICpyeF9za2I7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eHE7CiAJc3RydWN0IHdvcmtfc3RydWN0IGN0eHRzdzsKIH07CkBAIC0xMzYsNiArMTM3LDggQEAKIAogCXNrYl9xdWV1ZV9wdXJnZSgmYXRoLT50eHEpOwogCisJa2ZyZWVfc2tiKGF0aC0+cnhfc2tiKTsKKwogCWNhbmNlbF93b3JrX3N5bmMoJmF0aC0+Y3R4dHN3KTsKIAogCWh1LT5wcml2ID0gTlVMTDsKQEAgLTE4Nyw0MCArMTkwLDQyIEBACiAJcmV0dXJuIHNrYl9kZXF1ZXVlKCZhdGgtPnR4cSk7CiB9CiAKLS8qIFJlY3YgZGF0YSAqLwotc3RhdGljIGludCBhdGhfcmVjdihzdHJ1Y3QgaGNpX3VhcnQgKmh1LCB2b2lkICpkYXRhLCBpbnQgY291bnQpCi17Ci0JaW50IHJldDsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaDRfcmVjdl9wa3QgYXRoX3JlY3ZfcGt0c1tdID0geworCXsgSDRfUkVDVl9BQ0wsICAgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSB9LAorCXsgSDRfUkVDVl9TQ08sICAgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSB9LAorCXsgSDRfUkVDVl9FVkVOVCwgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSB9LAorfTsKIAotCXJldCA9IGhjaV9yZWN2X3N0cmVhbV9mcmFnbWVudChodS0+aGRldiwgZGF0YSwgY291bnQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCUJUX0VSUigiRnJhbWUgUmVhc3NlbWJseSBGYWlsZWQiKTsKLQkJcmV0dXJuIHJldDsKKy8qIFJlY3YgZGF0YSAqLworc3RhdGljIGludCBhdGhfcmVjdihzdHJ1Y3QgaGNpX3VhcnQgKmh1LCBjb25zdCB2b2lkICpkYXRhLCBpbnQgY291bnQpCit7CisJc3RydWN0IGF0aF9zdHJ1Y3QgKmF0aCA9IGh1LT5wcml2OworCisJYXRoLT5yeF9za2IgPSBoNF9yZWN2X2J1ZihodS0+aGRldiwgYXRoLT5yeF9za2IsIGRhdGEsIGNvdW50LAorCQkJCSAgYXRoX3JlY3ZfcGt0cywgQVJSQVlfU0laRShhdGhfcmVjdl9wa3RzKSk7CisJaWYgKElTX0VSUihhdGgtPnJ4X3NrYikpIHsKKwkJaW50IGVyciA9IFBUUl9FUlIoYXRoLT5yeF9za2IpOworCQlCVF9FUlIoIiVzOiBGcmFtZSByZWFzc2VtYmx5IGZhaWxlZCAoJWQpIiwgaHUtPmhkZXYtPm5hbWUsIGVycik7CisJCXJldHVybiBlcnI7CiAJfQogCiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3RydWN0IGhjaV91YXJ0X3Byb3RvIGF0aHAgPSB7Ci0JLmlkID0gSENJX1VBUlRfQVRIM0ssCi0JLm9wZW4gPSBhdGhfb3BlbiwKLQkuY2xvc2UgPSBhdGhfY2xvc2UsCi0JLnJlY3YgPSBhdGhfcmVjdiwKLQkuZW5xdWV1ZSA9IGF0aF9lbnF1ZXVlLAotCS5kZXF1ZXVlID0gYXRoX2RlcXVldWUsCi0JLmZsdXNoID0gYXRoX2ZsdXNoLAorc3RhdGljIGNvbnN0IHN0cnVjdCBoY2lfdWFydF9wcm90byBhdGhwID0geworCS5pZAkJPSBIQ0lfVUFSVF9BVEgzSywKKwkubmFtZQkJPSAiQVRIM0siLAorCS5vcGVuCQk9IGF0aF9vcGVuLAorCS5jbG9zZQkJPSBhdGhfY2xvc2UsCisJLnJlY3YJCT0gYXRoX3JlY3YsCisJLmVucXVldWUJPSBhdGhfZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9IGF0aF9kZXF1ZXVlLAorCS5mbHVzaAkJPSBhdGhfZmx1c2gsCiB9OwogCiBpbnQgX19pbml0IGF0aF9pbml0KHZvaWQpCiB7Ci0JaW50IGVyciA9IGhjaV91YXJ0X3JlZ2lzdGVyX3Byb3RvKCZhdGhwKTsKLQotCWlmICghZXJyKQotCQlCVF9JTkZPKCJIQ0lBVEgzSyBwcm90b2NvbCBpbml0aWFsaXplZCIpOwotCWVsc2UKLQkJQlRfRVJSKCJIQ0lBVEgzSyBwcm90b2NvbCByZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiBoY2lfdWFydF9yZWdpc3Rlcl9wcm90bygmYXRocCk7CiB9CiAKIGludCBfX2V4aXQgYXRoX2RlaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2JjbS5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2JjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYzBiNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNtLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKgorICogIEJsdWV0b290aCBIQ0kgVUFSVCBkcml2ZXIgZm9yIEJyb2FkY29tIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE1ICBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKworI2luY2x1ZGUgImJ0YmNtLmgiCisjaW5jbHVkZSAiaGNpX3VhcnQuaCIKKworc3RydWN0IGJjbV9kYXRhIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tiOworCXN0cnVjdCBza19idWZmX2hlYWQgdHhxOworfTsKKworc3RhdGljIGludCBiY21fb3BlbihzdHJ1Y3QgaGNpX3VhcnQgKmh1KQoreworCXN0cnVjdCBiY21fZGF0YSAqYmNtOworCisJQlRfREJHKCJodSAlcCIsIGh1KTsKKworCWJjbSA9IGt6YWxsb2Moc2l6ZW9mKCpiY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJjbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZiY20tPnR4cSk7CisKKwlodS0+cHJpdiA9IGJjbTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fY2xvc2Uoc3RydWN0IGhjaV91YXJ0ICpodSkKK3sKKwlzdHJ1Y3QgYmNtX2RhdGEgKmJjbSA9IGh1LT5wcml2OworCisJQlRfREJHKCJodSAlcCIsIGh1KTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmYmNtLT50eHEpOworCWtmcmVlX3NrYihiY20tPnJ4X3NrYik7CisJa2ZyZWUoYmNtKTsKKworCWh1LT5wcml2ID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fZmx1c2goc3RydWN0IGhjaV91YXJ0ICpodSkKK3sKKwlzdHJ1Y3QgYmNtX2RhdGEgKmJjbSA9IGh1LT5wcml2OworCisJQlRfREJHKCJodSAlcCIsIGh1KTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmYmNtLT50eHEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3NldHVwKHN0cnVjdCBoY2lfdWFydCAqaHUpCit7CisJQlRfREJHKCJodSAlcCIsIGh1KTsKKworCWh1LT5oZGV2LT5zZXRfYmRhZGRyID0gYnRiY21fc2V0X2JkYWRkcjsKKworCXJldHVybiBidGJjbV9zZXR1cF9wYXRjaHJhbShodS0+aGRldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaDRfcmVjdl9wa3QgYmNtX3JlY3ZfcGt0c1tdID0geworCXsgSDRfUkVDVl9BQ0wsICAgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSB9LAorCXsgSDRfUkVDVl9TQ08sICAgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSB9LAorCXsgSDRfUkVDVl9FVkVOVCwgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSB9LAorfTsKKworc3RhdGljIGludCBiY21fcmVjdihzdHJ1Y3QgaGNpX3VhcnQgKmh1LCBjb25zdCB2b2lkICpkYXRhLCBpbnQgY291bnQpCit7CisJc3RydWN0IGJjbV9kYXRhICpiY20gPSBodS0+cHJpdjsKKworCWlmICghdGVzdF9iaXQoSENJX1VBUlRfUkVHSVNURVJFRCwgJmh1LT5mbGFncykpCisJCXJldHVybiAtRVVOQVRDSDsKKworCWJjbS0+cnhfc2tiID0gaDRfcmVjdl9idWYoaHUtPmhkZXYsIGJjbS0+cnhfc2tiLCBkYXRhLCBjb3VudCwKKwkJCQkgIGJjbV9yZWN2X3BrdHMsIEFSUkFZX1NJWkUoYmNtX3JlY3ZfcGt0cykpOworCWlmIChJU19FUlIoYmNtLT5yeF9za2IpKSB7CisJCWludCBlcnIgPSBQVFJfRVJSKGJjbS0+cnhfc2tiKTsKKwkJQlRfRVJSKCIlczogRnJhbWUgcmVhc3NlbWJseSBmYWlsZWQgKCVkKSIsIGh1LT5oZGV2LT5uYW1lLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBiY21fZW5xdWV1ZShzdHJ1Y3QgaGNpX3VhcnQgKmh1LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBiY21fZGF0YSAqYmNtID0gaHUtPnByaXY7CisKKwlCVF9EQkcoImh1ICVwIHNrYiAlcCIsIGh1LCBza2IpOworCisJLyogUHJlcGVuZCBza2Igd2l0aCBmcmFtZSB0eXBlICovCisJbWVtY3B5KHNrYl9wdXNoKHNrYiwgMSksICZidF9jYihza2IpLT5wa3RfdHlwZSwgMSk7CisJc2tiX3F1ZXVlX3RhaWwoJmJjbS0+dHhxLCBza2IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYmNtX2RlcXVldWUoc3RydWN0IGhjaV91YXJ0ICpodSkKK3sKKwlzdHJ1Y3QgYmNtX2RhdGEgKmJjbSA9IGh1LT5wcml2OworCisJcmV0dXJuIHNrYl9kZXF1ZXVlKCZiY20tPnR4cSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gYmNtX3Byb3RvID0geworCS5pZAkJPSBIQ0lfVUFSVF9CQ00sCisJLm5hbWUJCT0gIkJDTSIsCisJLm9wZW4JCT0gYmNtX29wZW4sCisJLmNsb3NlCQk9IGJjbV9jbG9zZSwKKwkuZmx1c2gJCT0gYmNtX2ZsdXNoLAorCS5zZXR1cAkJPSBiY21fc2V0dXAsCisJLnJlY3YJCT0gYmNtX3JlY3YsCisJLmVucXVldWUJPSBiY21fZW5xdWV1ZSwKKwkuZGVxdWV1ZQk9IGJjbV9kZXF1ZXVlLAorfTsKKworaW50IF9faW5pdCBiY21faW5pdCh2b2lkKQoreworCXJldHVybiBoY2lfdWFydF9yZWdpc3Rlcl9wcm90bygmYmNtX3Byb3RvKTsKK30KKworaW50IF9fZXhpdCBiY21fZGVpbml0KHZvaWQpCit7CisJcmV0dXJuIGhjaV91YXJ0X3VucmVnaXN0ZXJfcHJvdG8oJmJjbV9wcm90byk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2Jjc3AuYwppbmRleCAyMWNjNDViLi5kYzhlM2Q0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfYmNzcC5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9iY3NwLmMKQEAgLTQ3LDggKzQ3LDYgQEAKIAogI2luY2x1ZGUgImhjaV91YXJ0LmgiCiAKLSNkZWZpbmUgVkVSU0lPTiAiMC4zIgotCiBzdGF0aWMgYm9vbCB0eGNyYyA9IDE7CiBzdGF0aWMgYm9vbCBoY2lleHRuID0gMTsKIApAQCAtNTU0LDEwICs1NTIsMTAgQEAKIH0KIAogLyogUmVjdiBkYXRhICovCi1zdGF0aWMgaW50IGJjc3BfcmVjdihzdHJ1Y3QgaGNpX3VhcnQgKmh1LCB2b2lkICpkYXRhLCBpbnQgY291bnQpCitzdGF0aWMgaW50IGJjc3BfcmVjdihzdHJ1Y3QgaGNpX3VhcnQgKmh1LCBjb25zdCB2b2lkICpkYXRhLCBpbnQgY291bnQpCiB7CiAJc3RydWN0IGJjc3Bfc3RydWN0ICpiY3NwID0gaHUtPnByaXY7Ci0JdW5zaWduZWQgY2hhciAqcHRyOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cjsKIAogCUJUX0RCRygiaHUgJXAgY291bnQgJWQgcnhfc3RhdGUgJWQgcnhfY291bnQgJWxkIiwgCiAJCWh1LCBjb3VudCwgYmNzcC0+cnhfc3RhdGUsIGJjc3AtPnJ4X2NvdW50KTsKQEAgLTczNSw4ICs3MzMsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGhjaV91YXJ0X3Byb3RvIGJjc3AgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGhjaV91YXJ0X3Byb3RvIGJjc3AgPSB7CiAJLmlkCQk9IEhDSV9VQVJUX0JDU1AsCisJLm5hbWUJCT0gIkJDU1AiLAogCS5vcGVuCQk9IGJjc3Bfb3BlbiwKIAkuY2xvc2UJCT0gYmNzcF9jbG9zZSwKIAkuZW5xdWV1ZQk9IGJjc3BfZW5xdWV1ZSwKQEAgLTc0NywxNCArNzQ2LDcgQEAKIAogaW50IF9faW5pdCBiY3NwX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyID0gaGNpX3VhcnRfcmVnaXN0ZXJfcHJvdG8oJmJjc3ApOwotCi0JaWYgKCFlcnIpCi0JCUJUX0lORk8oIkhDSSBCQ1NQIHByb3RvY29sIGluaXRpYWxpemVkIik7Ci0JZWxzZQotCQlCVF9FUlIoIkhDSSBCQ1NQIHByb3RvY29sIHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLQotCXJldHVybiBlcnI7CisJcmV0dXJuIGhjaV91YXJ0X3JlZ2lzdGVyX3Byb3RvKCZiY3NwKTsKIH0KIAogaW50IF9fZXhpdCBiY3NwX2RlaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2g0LmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfaDQuYwppbmRleCA2NmRiOWE4Li5mNzE5MGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfaDQuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfaDQuYwpAQCAtNDAsMTcgKzQwLDE0IEBACiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KIAogI2luY2x1ZGUgImhjaV91YXJ0LmgiCiAKLSNkZWZpbmUgVkVSU0lPTiAiMS4yIgotCiBzdHJ1Y3QgaDRfc3RydWN0IHsKLQl1bnNpZ25lZCBsb25nIHJ4X3N0YXRlOwotCXVuc2lnbmVkIGxvbmcgcnhfY291bnQ7CiAJc3RydWN0IHNrX2J1ZmYgKnJ4X3NrYjsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4cTsKIH07CkBAIC0xMTcsMTggKzExNCwyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGg0X3JlY3ZfcGt0IGg0X3JlY3ZfcGt0c1tdID0geworCXsgSDRfUkVDVl9BQ0wsICAgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSB9LAorCXsgSDRfUkVDVl9TQ08sICAgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSB9LAorCXsgSDRfUkVDVl9FVkVOVCwgLnJlY3YgPSBoY2lfcmVjdl9mcmFtZSB9LAorfTsKKwogLyogUmVjdiBkYXRhICovCi1zdGF0aWMgaW50IGg0X3JlY3Yoc3RydWN0IGhjaV91YXJ0ICpodSwgdm9pZCAqZGF0YSwgaW50IGNvdW50KQorc3RhdGljIGludCBoNF9yZWN2KHN0cnVjdCBoY2lfdWFydCAqaHUsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBjb3VudCkKIHsKLQlpbnQgcmV0OworCXN0cnVjdCBoNF9zdHJ1Y3QgKmg0ID0gaHUtPnByaXY7CiAKIAlpZiAoIXRlc3RfYml0KEhDSV9VQVJUX1JFR0lTVEVSRUQsICZodS0+ZmxhZ3MpKQogCQlyZXR1cm4gLUVVTkFUQ0g7CiAKLQlyZXQgPSBoY2lfcmVjdl9zdHJlYW1fZnJhZ21lbnQoaHUtPmhkZXYsIGRhdGEsIGNvdW50KTsKLQlpZiAocmV0IDwgMCkgewotCQlCVF9FUlIoIkZyYW1lIFJlYXNzZW1ibHkgRmFpbGVkIik7Ci0JCXJldHVybiByZXQ7CisJaDQtPnJ4X3NrYiA9IGg0X3JlY3ZfYnVmKGh1LT5oZGV2LCBoNC0+cnhfc2tiLCBkYXRhLCBjb3VudCwKKwkJCQkgaDRfcmVjdl9wa3RzLCBBUlJBWV9TSVpFKGg0X3JlY3ZfcGt0cykpOworCWlmIChJU19FUlIoaDQtPnJ4X3NrYikpIHsKKwkJaW50IGVyciA9IFBUUl9FUlIoaDQtPnJ4X3NrYik7CisJCUJUX0VSUigiJXM6IEZyYW1lIHJlYXNzZW1ibHkgZmFpbGVkICglZCkiLCBodS0+aGRldi0+bmFtZSwgZXJyKTsKKwkJcmV0dXJuIGVycjsKIAl9CiAKIAlyZXR1cm4gY291bnQ7CkBAIC0xNDAsOCArMTQ1LDkgQEAKIAlyZXR1cm4gc2tiX2RlcXVldWUoJmg0LT50eHEpOwogfQogCi1zdGF0aWMgc3RydWN0IGhjaV91YXJ0X3Byb3RvIGg0cCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gaDRwID0gewogCS5pZAkJPSBIQ0lfVUFSVF9INCwKKwkubmFtZQkJPSAiSDQiLAogCS5vcGVuCQk9IGg0X29wZW4sCiAJLmNsb3NlCQk9IGg0X2Nsb3NlLAogCS5yZWN2CQk9IGg0X3JlY3YsCkBAIC0xNTIsMTcgKzE1OCwxMDUgQEAKIAogaW50IF9faW5pdCBoNF9pbml0KHZvaWQpCiB7Ci0JaW50IGVyciA9IGhjaV91YXJ0X3JlZ2lzdGVyX3Byb3RvKCZoNHApOwotCi0JaWYgKCFlcnIpCi0JCUJUX0lORk8oIkhDSSBINCBwcm90b2NvbCBpbml0aWFsaXplZCIpOwotCWVsc2UKLQkJQlRfRVJSKCJIQ0kgSDQgcHJvdG9jb2wgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gaGNpX3VhcnRfcmVnaXN0ZXJfcHJvdG8oJmg0cCk7CiB9CiAKIGludCBfX2V4aXQgaDRfZGVpbml0KHZvaWQpCiB7CiAJcmV0dXJuIGhjaV91YXJ0X3VucmVnaXN0ZXJfcHJvdG8oJmg0cCk7CiB9CisKK3N0cnVjdCBza19idWZmICpoNF9yZWN2X2J1ZihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBjb3VudCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaDRfcmVjdl9wa3QgKnBrdHMsIGludCBwa3RzX2NvdW50KQoreworCXdoaWxlIChjb3VudCkgeworCQlpbnQgaSwgbGVuOworCisJCWlmICghc2tiKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcGt0c19jb3VudDsgaSsrKSB7CisJCQkJaWYgKGJ1ZmZlclswXSAhPSAoJnBrdHNbaV0pLT50eXBlKQorCQkJCQljb250aW51ZTsKKworCQkJCXNrYiA9IGJ0X3NrYl9hbGxvYygoJnBrdHNbaV0pLT5tYXhsZW4sCisJCQkJCQkgICBHRlBfQVRPTUlDKTsKKwkJCQlpZiAoIXNrYikKKwkJCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwkJCQlidF9jYihza2IpLT5wa3RfdHlwZSA9ICgmcGt0c1tpXSktPnR5cGU7CisJCQkJYnRfY2Ioc2tiKS0+ZXhwZWN0ID0gKCZwa3RzW2ldKS0+aGxlbjsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogQ2hlY2sgZm9yIGludmFsaWQgcGFja2V0IHR5cGUgKi8KKwkJCWlmICghc2tiKQorCQkJCXJldHVybiBFUlJfUFRSKC1FSUxTRVEpOworCisJCQljb3VudCAtPSAxOworCQkJYnVmZmVyICs9IDE7CisJCX0KKworCQlsZW4gPSBtaW5fdCh1aW50LCBidF9jYihza2IpLT5leHBlY3QgLSBza2ItPmxlbiwgY291bnQpOworCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGJ1ZmZlciwgbGVuKTsKKworCQljb3VudCAtPSBsZW47CisJCWJ1ZmZlciArPSBsZW47CisKKwkJLyogQ2hlY2sgZm9yIHBhcnRpYWwgcGFja2V0ICovCisJCWlmIChza2ItPmxlbiA8IGJ0X2NiKHNrYiktPmV4cGVjdCkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGkgPCBwa3RzX2NvdW50OyBpKyspIHsKKwkJCWlmIChidF9jYihza2IpLT5wa3RfdHlwZSA9PSAoJnBrdHNbaV0pLT50eXBlKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPj0gcGt0c19jb3VudCkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gRVJSX1BUUigtRUlMU0VRKTsKKwkJfQorCisJCWlmIChza2ItPmxlbiA9PSAoJnBrdHNbaV0pLT5obGVuKSB7CisJCQl1MTYgZGxlbjsKKworCQkJc3dpdGNoICgoJnBrdHNbaV0pLT5sc2l6ZSkgeworCQkJY2FzZSAwOgorCQkJCS8qIE5vIHZhcmlhYmxlIGRhdGEgbGVuZ3RoICovCisJCQkJKCZwa3RzW2ldKS0+cmVjdihoZGV2LCBza2IpOworCQkJCXNrYiA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJLyogU2luZ2xlIG9jdGV0IHZhcmlhYmxlIGxlbmd0aCAqLworCQkJCWRsZW4gPSBza2ItPmRhdGFbKCZwa3RzW2ldKS0+bG9mZl07CisJCQkJYnRfY2Ioc2tiKS0+ZXhwZWN0ICs9IGRsZW47CisKKwkJCQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBkbGVuKSB7CisJCQkJCWtmcmVlX3NrYihza2IpOworCQkJCQlyZXR1cm4gRVJSX1BUUigtRU1TR1NJWkUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQkvKiBEb3VibGUgb2N0ZXQgdmFyaWFibGUgbGVuZ3RoICovCisJCQkJZGxlbiA9IGdldF91bmFsaWduZWRfbGUxNihza2ItPmRhdGEgKworCQkJCQkJCSAgKCZwa3RzW2ldKS0+bG9mZik7CisJCQkJYnRfY2Ioc2tiKS0+ZXhwZWN0ICs9IGRsZW47CisKKwkJCQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBkbGVuKSB7CisJCQkJCWtmcmVlX3NrYihza2IpOworCQkJCQlyZXR1cm4gRVJSX1BUUigtRU1TR1NJWkUpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogVW5zdXBwb3J0ZWQgdmFyaWFibGUgbGVuZ3RoICovCisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJcmV0dXJuIEVSUl9QVFIoLUVJTFNFUSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBDb21wbGV0ZSBmcmFtZSAqLworCQkJKCZwa3RzW2ldKS0+cmVjdihoZGV2LCBza2IpOworCQkJc2tiID0gTlVMTDsKKwkJfQorCX0KKworCXJldHVybiBza2I7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfaDUuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9oNS5jCmluZGV4IGVjMGZhNzcuLjM0NTVjZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9oNS5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9oNS5jCkBAIC01MTEsMTAgKzUxMSwxMCBAQAogCWNsZWFyX2JpdChINV9SWF9FU0MsICZoNS0+ZmxhZ3MpOwogfQogCi1zdGF0aWMgaW50IGg1X3JlY3Yoc3RydWN0IGhjaV91YXJ0ICpodSwgdm9pZCAqZGF0YSwgaW50IGNvdW50KQorc3RhdGljIGludCBoNV9yZWN2KHN0cnVjdCBoY2lfdWFydCAqaHUsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBjb3VudCkKIHsKIAlzdHJ1Y3QgaDUgKmg1ID0gaHUtPnByaXY7Ci0JdW5zaWduZWQgY2hhciAqcHRyID0gZGF0YTsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpwdHIgPSBkYXRhOwogCiAJQlRfREJHKCIlcyBwZW5kaW5nICV6dSBjb3VudCAlZCIsIGh1LT5oZGV2LT5uYW1lLCBoNS0+cnhfcGVuZGluZywKIAkgICAgICAgY291bnQpOwpAQCAtNzQzLDggKzc0Myw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gaDVwID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBoY2lfdWFydF9wcm90byBoNXAgPSB7CiAJLmlkCQk9IEhDSV9VQVJUXzNXSVJFLAorCS5uYW1lCQk9ICJUaHJlZS13aXJlIChINSkiLAogCS5vcGVuCQk9IGg1X29wZW4sCiAJLmNsb3NlCQk9IGg1X2Nsb3NlLAogCS5yZWN2CQk9IGg1X3JlY3YsCkBAIC03NTUsMTQgKzc1Niw3IEBACiAKIGludCBfX2luaXQgaDVfaW5pdCh2b2lkKQogewotCWludCBlcnIgPSBoY2lfdWFydF9yZWdpc3Rlcl9wcm90bygmaDVwKTsKLQotCWlmICghZXJyKQotCQlCVF9JTkZPKCJIQ0kgVGhyZWUtd2lyZSBVQVJUIChINSkgcHJvdG9jb2wgaW5pdGlhbGl6ZWQiKTsKLQllbHNlCi0JCUJUX0VSUigiSENJIFRocmVlLXdpcmUgVUFSVCAoSDUpIHByb3RvY29sIGluaXQgZmFpbGVkIik7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiBoY2lfdWFydF9yZWdpc3Rlcl9wcm90bygmaDVwKTsKIH0KIAogaW50IF9fZXhpdCBoNV9kZWluaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9pbnRlbC5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2ludGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkMDdiZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9pbnRlbC5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKgorICogIEJsdWV0b290aCBIQ0kgVUFSVCBkcml2ZXIgZm9yIEludGVsIGRldmljZXMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE1ICBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKworI2luY2x1ZGUgImhjaV91YXJ0LmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfbGRpc2MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jCmluZGV4IGRjNDg3YjUuLjVjOWE3M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sZGlzYy5jCkBAIC00NCwxMyArNDQsMTUgQEAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KIAorI2luY2x1ZGUgImJ0aW50ZWwuaCIKKyNpbmNsdWRlICJidGJjbS5oIgogI2luY2x1ZGUgImhjaV91YXJ0LmgiCiAKLSNkZWZpbmUgVkVSU0lPTiAiMi4yIgorI2RlZmluZSBWRVJTSU9OICIyLjMiCiAKLXN0YXRpYyBzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gKmh1cFtIQ0lfVUFSVF9NQVhfUFJPVE9dOworc3RhdGljIGNvbnN0IHN0cnVjdCBoY2lfdWFydF9wcm90byAqaHVwW0hDSV9VQVJUX01BWF9QUk9UT107CiAKLWludCBoY2lfdWFydF9yZWdpc3Rlcl9wcm90byhzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gKnApCitpbnQgaGNpX3VhcnRfcmVnaXN0ZXJfcHJvdG8oY29uc3Qgc3RydWN0IGhjaV91YXJ0X3Byb3RvICpwKQogewogCWlmIChwLT5pZCA+PSBIQ0lfVUFSVF9NQVhfUFJPVE8pCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjAsMTAgKzYyLDEyIEBACiAKIAlodXBbcC0+aWRdID0gcDsKIAorCUJUX0lORk8oIkhDSSBVQVJUIHByb3RvY29sICVzIHJlZ2lzdGVyZWQiLCBwLT5uYW1lKTsKKwogCXJldHVybiAwOwogfQogCi1pbnQgaGNpX3VhcnRfdW5yZWdpc3Rlcl9wcm90byhzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gKnApCitpbnQgaGNpX3VhcnRfdW5yZWdpc3Rlcl9wcm90byhjb25zdCBzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gKnApCiB7CiAJaWYgKHAtPmlkID49IEhDSV9VQVJUX01BWF9QUk9UTykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03Niw3ICs4MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gKmhjaV91YXJ0X2dldF9wcm90byh1bnNpZ25lZCBpbnQgaWQpCitzdGF0aWMgY29uc3Qgc3RydWN0IGhjaV91YXJ0X3Byb3RvICpoY2lfdWFydF9nZXRfcHJvdG8odW5zaWduZWQgaW50IGlkKQogewogCWlmIChpZCA+PSBIQ0lfVUFSVF9NQVhfUFJPVE8pCiAJCXJldHVybiBOVUxMOwpAQCAtMjYxLDYgKzI2NSw1NCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGhjaV91YXJ0X3NldHVwKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBoY2lfdWFydCAqaHUgPSBoY2lfZ2V0X2RydmRhdGEoaGRldik7CisJc3RydWN0IGhjaV9ycF9yZWFkX2xvY2FsX3ZlcnNpb24gKnZlcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJaWYgKGh1LT5wcm90by0+c2V0dXApCisJCXJldHVybiBodS0+cHJvdG8tPnNldHVwKGh1KTsKKworCWlmICghdGVzdF9iaXQoSENJX1VBUlRfVk5EX0RFVEVDVCwgJmh1LT5oZGV2X2ZsYWdzKSkKKwkJcmV0dXJuIDA7CisKKwlza2IgPSBfX2hjaV9jbWRfc3luYyhoZGV2LCBIQ0lfT1BfUkVBRF9MT0NBTF9WRVJTSU9OLCAwLCBOVUxMLAorCQkJICAgICBIQ0lfSU5JVF9USU1FT1VUKTsKKwlpZiAoSVNfRVJSKHNrYikpIHsKKwkJQlRfRVJSKCIlczogUmVhZGluZyBsb2NhbCB2ZXJzaW9uIGluZm9ybWF0aW9uIGZhaWxlZCAoJWxkKSIsCisJCSAgICAgICBoZGV2LT5uYW1lLCBQVFJfRVJSKHNrYikpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc2tiLT5sZW4gIT0gc2l6ZW9mKCp2ZXIpKSB7CisJCUJUX0VSUigiJXM6IEV2ZW50IGxlbmd0aCBtaXNtYXRjaCBmb3IgdmVyc2lvbiBpbmZvcm1hdGlvbiIsCisJCSAgICAgICBoZGV2LT5uYW1lKTsKKwkJZ290byBkb25lOworCX0KKworCXZlciA9IChzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfdmVyc2lvbiAqKXNrYi0+ZGF0YTsKKworCXN3aXRjaCAobGUxNl90b19jcHUodmVyLT5tYW51ZmFjdHVyZXIpKSB7CisjaWZkZWYgQ09ORklHX0JUX0hDSVVBUlRfSU5URUwKKwljYXNlIDI6CisJCWhkZXYtPnNldF9iZGFkZHIgPSBidGludGVsX3NldF9iZGFkZHI7CisJCWJ0aW50ZWxfY2hlY2tfYmRhZGRyKGhkZXYpOworCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX0JDTQorCWNhc2UgMTU6CisJCWhkZXYtPnNldF9iZGFkZHIgPSBidGJjbV9zZXRfYmRhZGRyOworCQlidGJjbV9jaGVja19iZGFkZHIoaGRldik7CisJCWJyZWFrOworI2VuZGlmCisJfQorCitkb25lOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiAwOworfQorCiAvKiAtLS0tLS0gTERJU0MgcGFydCAtLS0tLS0gKi8KIC8qIGhjaV91YXJ0X3R0eV9vcGVuCiAgKgpAQCAtMzE2LDcgKzM2OCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGhjaV91YXJ0X3R0eV9jbG9zZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCXN0cnVjdCBoY2lfdWFydCAqaHUgPSAodm9pZCAqKXR0eS0+ZGlzY19kYXRhOworCXN0cnVjdCBoY2lfdWFydCAqaHUgPSB0dHktPmRpc2NfZGF0YTsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKIAogCUJUX0RCRygidHR5ICVwIiwgdHR5KTsKQEAgLTM1NSw3ICs0MDcsNyBAQAogICovCiBzdGF0aWMgdm9pZCBoY2lfdWFydF90dHlfd2FrZXVwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCiB7Ci0Jc3RydWN0IGhjaV91YXJ0ICpodSA9ICh2b2lkICopdHR5LT5kaXNjX2RhdGE7CisJc3RydWN0IGhjaV91YXJ0ICpodSA9IHR0eS0+ZGlzY19kYXRhOwogCiAJQlRfREJHKCIiKTsKIApAQCAtMzgzLDkgKzQzNSwxMCBAQAogICoKICAqIFJldHVybiBWYWx1ZTogICAgTm9uZQogICovCi1zdGF0aWMgdm9pZCBoY2lfdWFydF90dHlfcmVjZWl2ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBjb25zdCB1OCAqZGF0YSwgY2hhciAqZmxhZ3MsIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIGhjaV91YXJ0X3R0eV9yZWNlaXZlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGNvbnN0IHU4ICpkYXRhLAorCQkJCSBjaGFyICpmbGFncywgaW50IGNvdW50KQogewotCXN0cnVjdCBoY2lfdWFydCAqaHUgPSAodm9pZCAqKXR0eS0+ZGlzY19kYXRhOworCXN0cnVjdCBoY2lfdWFydCAqaHUgPSB0dHktPmRpc2NfZGF0YTsKIAogCWlmICghaHUgfHwgdHR5ICE9IGh1LT50dHkpCiAJCXJldHVybjsKQEAgLTM5NCw3ICs0NDcsNyBAQAogCQlyZXR1cm47CiAKIAlzcGluX2xvY2soJmh1LT5yeF9sb2NrKTsKLQlodS0+cHJvdG8tPnJlY3YoaHUsICh2b2lkICopIGRhdGEsIGNvdW50KTsKKwlodS0+cHJvdG8tPnJlY3YoaHUsIGRhdGEsIGNvdW50KTsKIAogCWlmIChodS0+aGRldikKIAkJaHUtPmhkZXYtPnN0YXQuYnl0ZV9yeCArPSBjb3VudDsKQEAgLTQyNiw2ICs0NzksNyBAQAogCWhkZXYtPmNsb3NlID0gaGNpX3VhcnRfY2xvc2U7CiAJaGRldi0+Zmx1c2ggPSBoY2lfdWFydF9mbHVzaDsKIAloZGV2LT5zZW5kICA9IGhjaV91YXJ0X3NlbmRfZnJhbWU7CisJaGRldi0+c2V0dXAgPSBoY2lfdWFydF9zZXR1cDsKIAlTRVRfSENJREVWX0RFVihoZGV2LCBodS0+dHR5LT5kZXYpOwogCiAJaWYgKHRlc3RfYml0KEhDSV9VQVJUX1JBV19ERVZJQ0UsICZodS0+aGRldl9mbGFncykpCkBAIC00NTgsNyArNTEyLDcgQEAKIAogc3RhdGljIGludCBoY2lfdWFydF9zZXRfcHJvdG8oc3RydWN0IGhjaV91YXJ0ICpodSwgaW50IGlkKQogewotCXN0cnVjdCBoY2lfdWFydF9wcm90byAqcDsKKwljb25zdCBzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gKnA7CiAJaW50IGVycjsKIAogCXAgPSBoY2lfdWFydF9nZXRfcHJvdG8oaWQpOwpAQCAtNDg2LDkgKzU0MCwxMCBAQAogCQkJCSAgICBCSVQoSENJX1VBUlRfUkVTRVRfT05fSU5JVCkgfAogCQkJCSAgICBCSVQoSENJX1VBUlRfQ1JFQVRFX0FNUCkgfAogCQkJCSAgICBCSVQoSENJX1VBUlRfSU5JVF9QRU5ESU5HKSB8Ci0JCQkJICAgIEJJVChIQ0lfVUFSVF9FWFRfQ09ORklHKTsKKwkJCQkgICAgQklUKEhDSV9VQVJUX0VYVF9DT05GSUcpIHwKKwkJCQkgICAgQklUKEhDSV9VQVJUX1ZORF9ERVRFQ1QpOwogCi0JaWYgKChmbGFncyAmIH52YWxpZF9mbGFncykpCisJaWYgKGZsYWdzICYgfnZhbGlkX2ZsYWdzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWh1LT5oZGV2X2ZsYWdzID0gZmxhZ3M7CkBAIC01MDksMTAgKzU2NCwxMCBAQAogICoKICAqIFJldHVybiBWYWx1ZTogICAgQ29tbWFuZCBkZXBlbmRlbnQKICAqLwotc3RhdGljIGludCBoY2lfdWFydF90dHlfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKiBmaWxlLAotCQkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyBpbnQgaGNpX3VhcnRfdHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0Jc3RydWN0IGhjaV91YXJ0ICpodSA9ICh2b2lkICopdHR5LT5kaXNjX2RhdGE7CisJc3RydWN0IGhjaV91YXJ0ICpodSA9IHR0eS0+ZGlzY19kYXRhOwogCWludCBlcnIgPSAwOwogCiAJQlRfREJHKCIiKTsKQEAgLTU2NiwxOSArNjIxLDE5IEBACiAgKiBXZSBkb24ndCBwcm92aWRlIHJlYWQvd3JpdGUvcG9sbCBpbnRlcmZhY2UgZm9yIHVzZXIgc3BhY2UuCiAgKi8KIHN0YXRpYyBzc2l6ZV90IGhjaV91YXJ0X3R0eV9yZWFkKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQl1bnNpZ25lZCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbnIpCisJCQkJIHVuc2lnbmVkIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBucikKIHsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgaGNpX3VhcnRfdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCisJCQkJICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3QgY291bnQpCiB7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaGNpX3VhcnRfdHR5X3BvbGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKLQkJCQkJc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKndhaXQpCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKndhaXQpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC02MjYsNiArNjgxLDkgQEAKICNpZmRlZiBDT05GSUdfQlRfSENJVUFSVF8zV0lSRQogCWg1X2luaXQoKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX0JDTQorCWJjbV9pbml0KCk7CisjZW5kaWYKIAogCXJldHVybiAwOwogfQpAQCAtNjQ5LDYgKzcwNyw5IEBACiAjaWZkZWYgQ09ORklHX0JUX0hDSVVBUlRfM1dJUkUKIAloNV9kZWluaXQoKTsKICNlbmRpZgorI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX0JDTQorCWJjbV9kZWluaXQoKTsKKyNlbmRpZgogCiAJLyogUmVsZWFzZSB0dHkgcmVnaXN0cmF0aW9uIG9mIGxpbmUgZGlzY2lwbGluZSAqLwogCWVyciA9IHR0eV91bnJlZ2lzdGVyX2xkaXNjKE5fSENJKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV9sbC5jIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xsLmMKaW5kZXggNjlhOTBiMS4uOWVlMjRiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xsLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX2xsLmMKQEAgLTM3MCwxMCArMzcwLDEwIEBACiB9CiAKIC8qIFJlY3YgZGF0YSAqLwotc3RhdGljIGludCBsbF9yZWN2KHN0cnVjdCBoY2lfdWFydCAqaHUsIHZvaWQgKmRhdGEsIGludCBjb3VudCkKK3N0YXRpYyBpbnQgbGxfcmVjdihzdHJ1Y3QgaGNpX3VhcnQgKmh1LCBjb25zdCB2b2lkICpkYXRhLCBpbnQgY291bnQpCiB7CiAJc3RydWN0IGxsX3N0cnVjdCAqbGwgPSBodS0+cHJpdjsKLQljaGFyICpwdHI7CisJY29uc3QgY2hhciAqcHRyOwogCXN0cnVjdCBoY2lfZXZlbnRfaGRyICplaDsKIAlzdHJ1Y3QgaGNpX2FjbF9oZHIgICAqYWg7CiAJc3RydWN0IGhjaV9zY29faGRyICAgKnNoOwpAQCAtNTA1LDggKzUwNSw5IEBACiAJcmV0dXJuIHNrYl9kZXF1ZXVlKCZsbC0+dHhxKTsKIH0KIAotc3RhdGljIHN0cnVjdCBoY2lfdWFydF9wcm90byBsbHAgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGhjaV91YXJ0X3Byb3RvIGxscCA9IHsKIAkuaWQJCT0gSENJX1VBUlRfTEwsCisJLm5hbWUJCT0gIkxMIiwKIAkub3BlbgkJPSBsbF9vcGVuLAogCS5jbG9zZQkJPSBsbF9jbG9zZSwKIAkucmVjdgkJPSBsbF9yZWN2LApAQCAtNTE3LDE0ICs1MTgsNyBAQAogCiBpbnQgX19pbml0IGxsX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyID0gaGNpX3VhcnRfcmVnaXN0ZXJfcHJvdG8oJmxscCk7Ci0KLQlpZiAoIWVycikKLQkJQlRfSU5GTygiSENJTEwgcHJvdG9jb2wgaW5pdGlhbGl6ZWQiKTsKLQllbHNlCi0JCUJUX0VSUigiSENJTEwgcHJvdG9jb2wgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gaGNpX3VhcnRfcmVnaXN0ZXJfcHJvdG8oJmxscCk7CiB9CiAKIGludCBfX2V4aXQgbGxfZGVpbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdWFydC5oIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3VhcnQuaAppbmRleCAyNDc0ODhlLi43MjEyMGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9oY2lfdWFydC5oCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV91YXJ0LmgKQEAgLTM1LDcgKzM1LDcgQEAKICNkZWZpbmUgSENJVUFSVEdFVEZMQUdTCQlfSU9SKCdVJywgMjA0LCBpbnQpCiAKIC8qIFVBUlQgcHJvdG9jb2xzICovCi0jZGVmaW5lIEhDSV9VQVJUX01BWF9QUk9UTwk2CisjZGVmaW5lIEhDSV9VQVJUX01BWF9QUk9UTwk4CiAKICNkZWZpbmUgSENJX1VBUlRfSDQJMAogI2RlZmluZSBIQ0lfVUFSVF9CQ1NQCTEKQEAgLTQzLDIxICs0MywyNiBAQAogI2RlZmluZSBIQ0lfVUFSVF9INERTCTMKICNkZWZpbmUgSENJX1VBUlRfTEwJNAogI2RlZmluZSBIQ0lfVUFSVF9BVEgzSwk1CisjZGVmaW5lIEhDSV9VQVJUX0lOVEVMCTYKKyNkZWZpbmUgSENJX1VBUlRfQkNNCTcKIAogI2RlZmluZSBIQ0lfVUFSVF9SQVdfREVWSUNFCTAKICNkZWZpbmUgSENJX1VBUlRfUkVTRVRfT05fSU5JVAkxCiAjZGVmaW5lIEhDSV9VQVJUX0NSRUFURV9BTVAJMgogI2RlZmluZSBIQ0lfVUFSVF9JTklUX1BFTkRJTkcJMwogI2RlZmluZSBIQ0lfVUFSVF9FWFRfQ09ORklHCTQKKyNkZWZpbmUgSENJX1VBUlRfVk5EX0RFVEVDVAk1CiAKIHN0cnVjdCBoY2lfdWFydDsKIAogc3RydWN0IGhjaV91YXJ0X3Byb3RvIHsKIAl1bnNpZ25lZCBpbnQgaWQ7CisJY29uc3QgY2hhciAqbmFtZTsKIAlpbnQgKCpvcGVuKShzdHJ1Y3QgaGNpX3VhcnQgKmh1KTsKIAlpbnQgKCpjbG9zZSkoc3RydWN0IGhjaV91YXJ0ICpodSk7CiAJaW50ICgqZmx1c2gpKHN0cnVjdCBoY2lfdWFydCAqaHUpOwotCWludCAoKnJlY3YpKHN0cnVjdCBoY2lfdWFydCAqaHUsIHZvaWQgKmRhdGEsIGludCBsZW4pOworCWludCAoKnNldHVwKShzdHJ1Y3QgaGNpX3VhcnQgKmh1KTsKKwlpbnQgKCpyZWN2KShzdHJ1Y3QgaGNpX3VhcnQgKmh1LCBjb25zdCB2b2lkICpkYXRhLCBpbnQgbGVuKTsKIAlpbnQgKCplbnF1ZXVlKShzdHJ1Y3QgaGNpX3VhcnQgKmh1LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqKCpkZXF1ZXVlKShzdHJ1Y3QgaGNpX3VhcnQgKmh1KTsKIH07CkBAIC03MSw3ICs3Niw3IEBACiAJc3RydWN0IHdvcmtfc3RydWN0CWluaXRfcmVhZHk7CiAJc3RydWN0IHdvcmtfc3RydWN0CXdyaXRlX3dvcms7CiAKLQlzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8JKnByb3RvOworCWNvbnN0IHN0cnVjdCBoY2lfdWFydF9wcm90byAqcHJvdG87CiAJdm9pZAkJCSpwcml2OwogCiAJc3RydWN0IHNrX2J1ZmYJCSp0eF9za2I7CkBAIC04NywxNCArOTIsNDggQEAKICNkZWZpbmUgSENJX1VBUlRfU0VORElORwkxCiAjZGVmaW5lIEhDSV9VQVJUX1RYX1dBS0VVUAkyCiAKLWludCBoY2lfdWFydF9yZWdpc3Rlcl9wcm90byhzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gKnApOwotaW50IGhjaV91YXJ0X3VucmVnaXN0ZXJfcHJvdG8oc3RydWN0IGhjaV91YXJ0X3Byb3RvICpwKTsKK2ludCBoY2lfdWFydF9yZWdpc3Rlcl9wcm90byhjb25zdCBzdHJ1Y3QgaGNpX3VhcnRfcHJvdG8gKnApOworaW50IGhjaV91YXJ0X3VucmVnaXN0ZXJfcHJvdG8oY29uc3Qgc3RydWN0IGhjaV91YXJ0X3Byb3RvICpwKTsKIGludCBoY2lfdWFydF90eF93YWtldXAoc3RydWN0IGhjaV91YXJ0ICpodSk7CiBpbnQgaGNpX3VhcnRfaW5pdF9yZWFkeShzdHJ1Y3QgaGNpX3VhcnQgKmh1KTsKIAogI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX0g0CiBpbnQgaDRfaW5pdCh2b2lkKTsKIGludCBoNF9kZWluaXQodm9pZCk7CisKK3N0cnVjdCBoNF9yZWN2X3BrdCB7CisJdTggIHR5cGU7CS8qIFBhY2tldCB0eXBlICovCisJdTggIGhsZW47CS8qIEhlYWRlciBsZW5ndGggKi8KKwl1OCAgbG9mZjsJLyogRGF0YSBsZW5ndGggb2Zmc2V0IGluIGhlYWRlciAqLworCXU4ICBsc2l6ZTsJLyogRGF0YSBsZW5ndGggZmllbGQgc2l6ZSAqLworCXUxNiBtYXhsZW47CS8qIE1heCBvdmVyYWxsIHBhY2tldCBsZW5ndGggKi8KKwlpbnQgKCpyZWN2KShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit9OworCisjZGVmaW5lIEg0X1JFQ1ZfQUNMIFwKKwkudHlwZSA9IEhDSV9BQ0xEQVRBX1BLVCwgXAorCS5obGVuID0gSENJX0FDTF9IRFJfU0laRSwgXAorCS5sb2ZmID0gMiwgXAorCS5sc2l6ZSA9IDIsIFwKKwkubWF4bGVuID0gSENJX01BWF9GUkFNRV9TSVpFIFwKKworI2RlZmluZSBINF9SRUNWX1NDTyBcCisJLnR5cGUgPSBIQ0lfU0NPREFUQV9QS1QsIFwKKwkuaGxlbiA9IEhDSV9TQ09fSERSX1NJWkUsIFwKKwkubG9mZiA9IDIsIFwKKwkubHNpemUgPSAxLCBcCisJLm1heGxlbiA9IEhDSV9NQVhfU0NPX1NJWkUKKworI2RlZmluZSBINF9SRUNWX0VWRU5UIFwKKwkudHlwZSA9IEhDSV9FVkVOVF9QS1QsIFwKKwkuaGxlbiA9IEhDSV9FVkVOVF9IRFJfU0laRSwgXAorCS5sb2ZmID0gMSwgXAorCS5sc2l6ZSA9IDEsIFwKKwkubWF4bGVuID0gSENJX01BWF9FVkVOVF9TSVpFCisKK3N0cnVjdCBza19idWZmICpoNF9yZWN2X2J1ZihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIGludCBjb3VudCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaDRfcmVjdl9wa3QgKnBrdHMsIGludCBwa3RzX2NvdW50KTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0JUX0hDSVVBUlRfQkNTUApAQCAtMTE2LDMgKzE1NSw4IEBACiBpbnQgaDVfaW5pdCh2b2lkKTsKIGludCBoNV9kZWluaXQodm9pZCk7CiAjZW5kaWYKKworI2lmZGVmIENPTkZJR19CVF9IQ0lVQVJUX0JDTQoraW50IGJjbV9pbml0KHZvaWQpOworaW50IGJjbV9kZWluaXQodm9pZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYnVzL29tYXBfbDNfbm9jLmMgYi9kcml2ZXJzL2J1cy9vbWFwX2wzX25vYy5jCmluZGV4IDAyOWJjNzMuLjExZjc5ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYnVzL29tYXBfbDNfbm9jLmMKKysrIGIvZHJpdmVycy9idXMvb21hcF9sM19ub2MuYwpAQCAtMjg0LDcgKzI4NCw3IEBACiAJICovCiAJbDMtPmRlYnVnX2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CiAJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShsMy0+ZGV2LCBsMy0+ZGVidWdfaXJxLCBsM19pbnRlcnJ1cHRfaGFuZGxlciwKLQkJCSAgICAgICBJUlFGX0RJU0FCTEVELCAibDMtZGJnLWlycSIsIGwzKTsKKwkJCSAgICAgICAweDAsICJsMy1kYmctaXJxIiwgbDMpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihsMy0+ZGV2LCAicmVxdWVzdF9pcnEgZmFpbGVkIGZvciAlZFxuIiwKIAkJCWwzLT5kZWJ1Z19pcnEpOwpAQCAtMjkzLDcgKzI5Myw3IEBACiAKIAlsMy0+YXBwX2lycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMSk7CiAJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShsMy0+ZGV2LCBsMy0+YXBwX2lycSwgbDNfaW50ZXJydXB0X2hhbmRsZXIsCi0JCQkgICAgICAgSVJRRl9ESVNBQkxFRCwgImwzLWFwcC1pcnEiLCBsMyk7CisJCQkgICAgICAgMHgwLCAibDMtYXBwLWlycSIsIGwzKTsKIAlpZiAocmV0KQogCQlkZXZfZXJyKGwzLT5kZXYsICJyZXF1ZXN0X2lycSBmYWlsZWQgZm9yICVkXG4iLCBsMy0+YXBwX2lycSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYnVzL29tYXBfbDNfc214LmMgYi9kcml2ZXJzL2J1cy9vbWFwX2wzX3NteC5jCmluZGV4IDU5N2ZkYWUuLjM2MGE1YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYnVzL29tYXBfbDNfc214LmMKKysrIGIvZHJpdmVycy9idXMvb21hcF9sM19zbXguYwpAQCAtMjUxLDE4ICsyNTEsMTYgQEAKIAl9CiAKIAlsMy0+ZGVidWdfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlyZXQgPSByZXF1ZXN0X2lycShsMy0+ZGVidWdfaXJxLCBvbWFwM19sM19hcHBfaXJxLAotCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORywKLQkJImwzLWRlYnVnLWlycSIsIGwzKTsKKwlyZXQgPSByZXF1ZXN0X2lycShsMy0+ZGVidWdfaXJxLCBvbWFwM19sM19hcHBfaXJxLCBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJICAibDMtZGVidWctaXJxIiwgbDMpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGRuJ3QgcmVxdWVzdCBkZWJ1ZyBpcnFcbiIpOwogCQlnb3RvIGVycjE7CiAJfQogCiAJbDMtPmFwcF9pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOwotCXJldCA9IHJlcXVlc3RfaXJxKGwzLT5hcHBfaXJxLCBvbWFwM19sM19hcHBfaXJxLAotCQlJUlFGX0RJU0FCTEVEIHwgSVJRRl9UUklHR0VSX1JJU0lORywKLQkJImwzLWFwcC1pcnEiLCBsMyk7CisJcmV0ID0gcmVxdWVzdF9pcnEobDMtPmFwcF9pcnEsIG9tYXAzX2wzX2FwcF9pcnEsIElSUUZfVFJJR0dFUl9SSVNJTkcsCisJCQkgICJsMy1hcHAtaXJxIiwgbDMpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGRuJ3QgcmVxdWVzdCBhcHAgaXJxXG4iKTsKIAkJZ290byBlcnIyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9LY29uZmlnCmluZGV4IGRlNTdiMzguLmY0OGNmMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL0tjb25maWcKQEAgLTEwMSw2ICsxMDEsMTkgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgWS4KIAorY29uZmlnIEhXX1JBTkRPTV9JUFJPQ19STkcyMDAKKwl0cmlzdGF0ZSAiQnJvYWRjb20gaVByb2MgUk5HMjAwIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX0JDTV9JUFJPQworCWRlZmF1bHQgSFdfUkFORE9NCisJLS0taGVscC0tLQorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMga2VybmVsLXNpZGUgc3VwcG9ydCBmb3IgdGhlIFJORzIwMAorCSAgaGFyZHdhcmUgZm91bmQgb24gdGhlIEJyb2FkY29tIGlQcm9jIFNvQ3MuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlwcm9jLXJuZzIwMAorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCiBjb25maWcgSFdfUkFORE9NX0dFT0RFCiAJdHJpc3RhdGUgIkFNRCBHZW9kZSBIVyBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBzdXBwb3J0IgogCWRlcGVuZHMgb24gWDg2XzMyICYmIFBDSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9NYWtlZmlsZSBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vTWFrZWZpbGUKaW5kZXggMGI0Y2Q1Ny4uMDU1YmIwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL01ha2VmaWxlCkBAIC0yOCw1ICsyOCw2IEBACiBvYmotJChDT05GSUdfSFdfUkFORE9NX0VYWU5PUykJKz0gZXh5bm9zLXJuZy5vCiBvYmotJChDT05GSUdfSFdfUkFORE9NX1RQTSkgKz0gdHBtLXJuZy5vCiBvYmotJChDT05GSUdfSFdfUkFORE9NX0JDTTI4MzUpICs9IGJjbTI4MzUtcm5nLm8KK29iai0kKENPTkZJR19IV19SQU5ET01fSVBST0NfUk5HMjAwKSArPSBpcHJvYy1ybmcyMDAubwogb2JqLSQoQ09ORklHX0hXX1JBTkRPTV9NU00pICs9IG1zbS1ybmcubwogb2JqLSQoQ09ORklHX0hXX1JBTkRPTV9YR0VORSkgKz0geGdlbmUtcm5nLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vYmNtNjN4eC1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vYmNtNjN4eC1ybmcuYwppbmRleCBiYTZhNjVhLi5kMTQ5NGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2JjbTYzeHgtcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9iY202M3h4LXJuZy5jCkBAIC0xMywyNCArMTMsMzcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KIAotI2luY2x1ZGUgPGJjbTYzeHhfaW8uaD4KLSNpbmNsdWRlIDxiY202M3h4X3JlZ3MuaD4KKyNkZWZpbmUgUk5HX0NUUkwJCQkweDAwCisjZGVmaW5lIFJOR19FTgkJCQkoMSA8PCAwKQorCisjZGVmaW5lIFJOR19TVEFUCQkJMHgwNAorI2RlZmluZSBSTkdfQVZBSUxfTUFTSwkJCSgweGZmMDAwMDAwKQorCisjZGVmaW5lIFJOR19EQVRBCQkJMHgwOAorI2RlZmluZSBSTkdfVEhSRVMJCQkweDBjCisjZGVmaW5lIFJOR19NQVNLCQkJMHgxMAogCiBzdHJ1Y3QgYmNtNjN4eF9ybmdfcHJpdiB7CisJc3RydWN0IGh3cm5nIHJuZzsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJdm9pZCBfX2lvbWVtICpyZWdzOwogfTsKIAotI2RlZmluZSB0b19ybmdfcHJpdihybmcpCSgoc3RydWN0IGJjbTYzeHhfcm5nX3ByaXYgKilybmctPnByaXYpCisjZGVmaW5lIHRvX3JuZ19wcml2KHJuZykJY29udGFpbmVyX29mKHJuZywgc3RydWN0IGJjbTYzeHhfcm5nX3ByaXYsIHJuZykKIAogc3RhdGljIGludCBiY202M3h4X3JuZ19pbml0KHN0cnVjdCBod3JuZyAqcm5nKQogewogCXN0cnVjdCBiY202M3h4X3JuZ19wcml2ICpwcml2ID0gdG9fcm5nX3ByaXYocm5nKTsKIAl1MzIgdmFsOworCWludCBlcnJvcjsKIAotCXZhbCA9IGJjbV9yZWFkbChwcml2LT5yZWdzICsgUk5HX0NUUkwpOworCWVycm9yID0gY2xrX3ByZXBhcmVfZW5hYmxlKHByaXYtPmNsayk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwl2YWwgPSBfX3Jhd19yZWFkbChwcml2LT5yZWdzICsgUk5HX0NUUkwpOwogCXZhbCB8PSBSTkdfRU47Ci0JYmNtX3dyaXRlbCh2YWwsIHByaXYtPnJlZ3MgKyBSTkdfQ1RSTCk7CisJX19yYXdfd3JpdGVsKHZhbCwgcHJpdi0+cmVncyArIFJOR19DVFJMKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDAsMjMgKzUzLDI1IEBACiAJc3RydWN0IGJjbTYzeHhfcm5nX3ByaXYgKnByaXYgPSB0b19ybmdfcHJpdihybmcpOwogCXUzMiB2YWw7CiAKLQl2YWwgPSBiY21fcmVhZGwocHJpdi0+cmVncyArIFJOR19DVFJMKTsKKwl2YWwgPSBfX3Jhd19yZWFkbChwcml2LT5yZWdzICsgUk5HX0NUUkwpOwogCXZhbCAmPSB+Uk5HX0VOOwotCWJjbV93cml0ZWwodmFsLCBwcml2LT5yZWdzICsgUk5HX0NUUkwpOworCV9fcmF3X3dyaXRlbCh2YWwsIHByaXYtPnJlZ3MgKyBSTkdfQ1RSTCk7CisKKwljbGtfZGlkc2FibGVfdW5wcmVwYXJlKHByb3YtPmNsayk7CiB9CiAKIHN0YXRpYyBpbnQgYmNtNjN4eF9ybmdfZGF0YV9wcmVzZW50KHN0cnVjdCBod3JuZyAqcm5nLCBpbnQgd2FpdCkKIHsKIAlzdHJ1Y3QgYmNtNjN4eF9ybmdfcHJpdiAqcHJpdiA9IHRvX3JuZ19wcml2KHJuZyk7CiAKLQlyZXR1cm4gYmNtX3JlYWRsKHByaXYtPnJlZ3MgKyBSTkdfU1RBVCkgJiBSTkdfQVZBSUxfTUFTSzsKKwlyZXR1cm4gX19yYXdfcmVhZGwocHJpdi0+cmVncyArIFJOR19TVEFUKSAmIFJOR19BVkFJTF9NQVNLOwogfQogCiBzdGF0aWMgaW50IGJjbTYzeHhfcm5nX2RhdGFfcmVhZChzdHJ1Y3QgaHdybmcgKnJuZywgdTMyICpkYXRhKQogewogCXN0cnVjdCBiY202M3h4X3JuZ19wcml2ICpwcml2ID0gdG9fcm5nX3ByaXYocm5nKTsKIAotCSpkYXRhID0gYmNtX3JlYWRsKHByaXYtPnJlZ3MgKyBSTkdfREFUQSk7CisJKmRhdGEgPSBfX3Jhd19yZWFkbChwcml2LT5yZWdzICsgUk5HX0RBVEEpOwogCiAJcmV0dXJuIDQ7CiB9CkBAIC03Miw5NCArODcsNTMgQEAKIAlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIXIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaW9tZW0gcmVzb3VyY2VcbiIpOwotCQlyZXQgPSAtRU5YSU87Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOwotCWlmICghcHJpdikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtZW1vcnkgZm9yIHByaXZhdGUgc3RydWN0dXJlXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7CisJcHJpdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJcHJpdi0+cm5nLm5hbWUgPSBwZGV2LT5uYW1lOworCXByaXYtPnJuZy5pbml0ID0gYmNtNjN4eF9ybmdfaW5pdDsKKwlwcml2LT5ybmcuY2xlYW51cCA9IGJjbTYzeHhfcm5nX2NsZWFudXA7CisJcHJvdi0+cm5nLmRhdGFfcHJlc2VudCA9IGJjbTYzeHhfcm5nX2RhdGFfcHJlc2VudDsKKwlwcml2LT5ybmcuZGF0YV9yZWFkID0gYmNtNjN4eF9ybmdfZGF0YV9yZWFkOworCisJcHJpdi0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJpcHNlYyIpOworCWlmIChJU19FUlIocHJpdi0+Y2xrKSkgeworCQllcnJvciA9IFBUUl9FUlIocHJpdi0+Y2xrKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gY2xvY2sgZm9yIGRldmljZTogJWRcbiIsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOwogCX0KIAotCXJuZyA9IGt6YWxsb2Moc2l6ZW9mKCpybmcpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXJuZykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyBtZW1vcnkgZm9yIHJuZyBzdHJ1Y3R1cmVcbiIpOwotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dF9mcmVlX3ByaXY7Ci0JfQotCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcm5nKTsKLQlybmctPnByaXYgPSAodW5zaWduZWQgbG9uZylwcml2OwotCXJuZy0+bmFtZSA9IHBkZXYtPm5hbWU7Ci0Jcm5nLT5pbml0ID0gYmNtNjN4eF9ybmdfaW5pdDsKLQlybmctPmNsZWFudXAgPSBiY202M3h4X3JuZ19jbGVhbnVwOwotCXJuZy0+ZGF0YV9wcmVzZW50ID0gYmNtNjN4eF9ybmdfZGF0YV9wcmVzZW50OwotCXJuZy0+ZGF0YV9yZWFkID0gYmNtNjN4eF9ybmdfZGF0YV9yZWFkOwotCi0JY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiaXBzZWMiKTsKLQlpZiAoSVNfRVJSKGNsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gY2xvY2sgZm9yIGRldmljZVxuIik7Ci0JCXJldCA9IFBUUl9FUlIoY2xrKTsKLQkJZ290byBvdXRfZnJlZV9ybmc7Ci0JfQotCi0JcHJpdi0+Y2xrID0gY2xrOwotCiAJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbigmcGRldi0+ZGV2LCByLT5zdGFydCwKIAkJCQkJcmVzb3VyY2Vfc2l6ZShyKSwgcGRldi0+bmFtZSkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVxdWVzdCBtZW0gZmFpbGVkIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2ZyZWVfcm5nOworCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCXByaXYtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LCByLT5zdGFydCwKIAkJCQkJcmVzb3VyY2Vfc2l6ZShyKSk7CiAJaWYgKCFwcml2LT5yZWdzKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImlvcmVtYXAgZmFpbGVkIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2ZyZWVfcm5nOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQljbGtfZW5hYmxlKGNsayk7Ci0KLQlyZXQgPSBod3JuZ19yZWdpc3RlcihybmcpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHJuZyBkZXZpY2VcbiIpOwotCQlnb3RvIG91dF9jbGtfZGlzYWJsZTsKKwllcnJvciA9IGRldm1faHdybmdfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnByaXYtPnJuZyk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBybmcgZGV2aWNlOiAlZFxuIiwKKwkJCWVycm9yKTsKKwkJcmV0dXJuIGVycm9yOwogCX0KIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJyZWdpc3RlcmVkIFJORyBkcml2ZXJcbiIpOwogCiAJcmV0dXJuIDA7Ci0KLW91dF9jbGtfZGlzYWJsZToKLQljbGtfZGlzYWJsZShjbGspOwotb3V0X2ZyZWVfcm5nOgotCWtmcmVlKHJuZyk7Ci1vdXRfZnJlZV9wcml2OgotCWtmcmVlKHByaXYpOwotb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtNjN4eF9ybmdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGh3cm5nICpybmcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3QgYmNtNjN4eF9ybmdfcHJpdiAqcHJpdiA9IHRvX3JuZ19wcml2KHJuZyk7Ci0KLQlod3JuZ191bnJlZ2lzdGVyKHJuZyk7Ci0JY2xrX2Rpc2FibGUocHJpdi0+Y2xrKTsKLQlrZnJlZShwcml2KTsKLQlrZnJlZShybmcpOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJjbTYzeHhfcm5nX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gYmNtNjN4eF9ybmdfcHJvYmUsCi0JLnJlbW92ZQkJPSBiY202M3h4X3JuZ19yZW1vdmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gImJjbTYzeHgtcm5nIiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9jb3JlLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2NvcmUuYwppbmRleCAzMmE4YTg2Li41NzFlZjYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2NvcmUuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2NvcmUuYwpAQCAtMTc5LDcgKzE3OSw4IEBACiAJYWRkX2Vhcmx5X3JhbmRvbW5lc3Mocm5nKTsKIAogCWN1cnJlbnRfcXVhbGl0eSA9IHJuZy0+cXVhbGl0eSA/IDogZGVmYXVsdF9xdWFsaXR5OwotCWN1cnJlbnRfcXVhbGl0eSAmPSAxMDIzOworCWlmIChjdXJyZW50X3F1YWxpdHkgPiAxMDI0KQorCQljdXJyZW50X3F1YWxpdHkgPSAxMDI0OwogCiAJaWYgKGN1cnJlbnRfcXVhbGl0eSA9PSAwICYmIGh3cm5nX2ZpbGwpCiAJCWt0aHJlYWRfc3RvcChod3JuZ19maWxsKTsKQEAgLTUzNiw2ICs1MzcsNDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGh3cm5nX3VucmVnaXN0ZXIpOwogCitzdGF0aWMgdm9pZCBkZXZtX2h3cm5nX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCit7CisJaHdybmdfdW5yZWdpc3RlcigqKHN0cnVjdCBod3JuZyAqKilyZXMpOworfQorCitzdGF0aWMgaW50IGRldm1faHdybmdfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGh3cm5nICoqciA9IHJlczsKKworCWlmIChXQVJOX09OKCFyIHx8ICEqcikpCisJCXJldHVybiAwOworCisJcmV0dXJuICpyID09IGRhdGE7Cit9CisKK2ludCBkZXZtX2h3cm5nX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGh3cm5nICpybmcpCit7CisJc3RydWN0IGh3cm5nICoqcHRyOworCWludCBlcnJvcjsKKworCXB0ciA9IGRldnJlc19hbGxvYyhkZXZtX2h3cm5nX3JlbGVhc2UsIHNpemVvZigqcHRyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyb3IgPSBod3JuZ19yZWdpc3RlcihybmcpOworCWlmIChlcnJvcikgeworCQlkZXZyZXNfZnJlZShwdHIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJKnB0ciA9IHJuZzsKKwlkZXZyZXNfYWRkKGRldiwgcHRyKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1faHdybmdfcmVnaXN0ZXIpOworCit2b2lkIGRldm1faHdybmdfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBod3JuZyAqcm5nKQoreworCWRldnJlc19yZWxlYXNlKGRldiwgZGV2bV9od3JuZ19yZWxlYXNlLCBkZXZtX2h3cm5nX21hdGNoLCBybmcpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9od3JuZ191bnJlZ2lzdGVyKTsKKwogc3RhdGljIGludCBfX2luaXQgaHdybmdfbW9kaW5pdCh2b2lkKQogewogCXJldHVybiByZWdpc3Rlcl9taXNjZGV2KCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL2V4eW5vcy1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vZXh5bm9zLXJuZy5jCmluZGV4IGZlZDA4MzAuLmRjNDcwMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vZXh5bm9zLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vZXh5bm9zLXJuZy5jCkBAIC0xMzEsMTYgKzEzMSw3IEBACiAJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CiAKLQlyZXR1cm4gaHdybmdfcmVnaXN0ZXIoJmV4eW5vc19ybmctPnJuZyk7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zX3JuZ19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZXh5bm9zX3JuZyAqZXh5bm9zX3JuZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaHdybmdfdW5yZWdpc3RlcigmZXh5bm9zX3JuZy0+cm5nKTsKLQotCXJldHVybiAwOworCXJldHVybiBkZXZtX2h3cm5nX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZleHlub3Nfcm5nLT5ybmcpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC0xNzIsNyArMTYzLDYgQEAKIAkJLnBtCT0gJmV4eW5vc19ybmdfcG1fb3BzLAogCX0sCiAJLnByb2JlCQk9IGV4eW5vc19ybmdfcHJvYmUsCi0JLnJlbW92ZQkJPSBleHlub3Nfcm5nX3JlbW92ZSwKIH07CiAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZXh5bm9zX3JuZ19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9pcHJvYy1ybmcyMDAuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vaXByb2Mtcm5nMjAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VhZjdjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vaXByb2Mtcm5nMjAwLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxNSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorKgorKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKi8KKy8qCisgKiBERVNDUklQVElPTjogVGhlIEJyb2FkY29tIGlQcm9jIFJORzIwMCBEcml2ZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworLyogUmVnaXN0ZXJzICovCisjZGVmaW5lIFJOR19DVFJMX09GRlNFVAkJCQkJMHgwMAorI2RlZmluZSBSTkdfQ1RSTF9STkdfUkJHRU5fTUFTSwkJCQkweDAwMDAxRkZGCisjZGVmaW5lIFJOR19DVFJMX1JOR19SQkdFTl9FTkFCTEUJCQkweDAwMDAwMDAxCisjZGVmaW5lIFJOR19DVFJMX1JOR19SQkdFTl9ESVNBQkxFCQkJMHgwMDAwMDAwMAorCisjZGVmaW5lIFJOR19TT0ZUX1JFU0VUX09GRlNFVAkJCQkweDA0CisjZGVmaW5lIFJOR19TT0ZUX1JFU0VUCQkJCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgUkJHX1NPRlRfUkVTRVRfT0ZGU0VUCQkJCTB4MDgKKyNkZWZpbmUgUkJHX1NPRlRfUkVTRVQJCQkJCTB4MDAwMDAwMDEKKworI2RlZmluZSBSTkdfSU5UX1NUQVRVU19PRkZTRVQJCQkJMHgxOAorI2RlZmluZSBSTkdfSU5UX1NUQVRVU19NQVNURVJfRkFJTF9MT0NLT1VUX0lSUV9NQVNLCTB4ODAwMDAwMDAKKyNkZWZpbmUgUk5HX0lOVF9TVEFUVVNfU1RBUlRVUF9UUkFOU0lUSU9OU19NRVRfSVJRX01BU0sJMHgwMDAyMDAwMAorI2RlZmluZSBSTkdfSU5UX1NUQVRVU19OSVNUX0ZBSUxfSVJRX01BU0sJCTB4MDAwMDAwMjAKKyNkZWZpbmUgUk5HX0lOVF9TVEFUVVNfVE9UQUxfQklUU19DT1VOVF9JUlFfTUFTSwkweDAwMDAwMDAxCisKKyNkZWZpbmUgUk5HX0ZJRk9fREFUQV9PRkZTRVQJCQkJMHgyMAorCisjZGVmaW5lIFJOR19GSUZPX0NPVU5UX09GRlNFVAkJCQkweDI0CisjZGVmaW5lIFJOR19GSUZPX0NPVU5UX1JOR19GSUZPX0NPVU5UX01BU0sJCTB4MDAwMDAwRkYKKworc3RydWN0IGlwcm9jX3JuZzIwMF9kZXYgeworCXN0cnVjdCBod3JuZyBybmc7CisJdm9pZCBfX2lvbWVtICpiYXNlOworfTsKKworI2RlZmluZSB0b19ybmdfcHJpdihybmcpCWNvbnRhaW5lcl9vZihybmcsIHN0cnVjdCBpcHJvY19ybmcyMDBfZGV2LCBybmcpCisKK3N0YXRpYyB2b2lkIGlwcm9jX3JuZzIwMF9yZXN0YXJ0KHZvaWQgX19pb21lbSAqcm5nX2Jhc2UpCit7CisJdWludDMyX3QgdmFsOworCisJLyogRGlzYWJsZSBSQkcgKi8KKwl2YWwgPSBpb3JlYWQzMihybmdfYmFzZSArIFJOR19DVFJMX09GRlNFVCk7CisJdmFsICY9IH5STkdfQ1RSTF9STkdfUkJHRU5fTUFTSzsKKwl2YWwgfD0gUk5HX0NUUkxfUk5HX1JCR0VOX0RJU0FCTEU7CisJaW93cml0ZTMyKHZhbCwgcm5nX2Jhc2UgKyBSTkdfQ1RSTF9PRkZTRVQpOworCisJLyogQ2xlYXIgYWxsIGludGVycnVwdCBzdGF0dXMgKi8KKwlpb3dyaXRlMzIoMHhGRkZGRkZGRlVMLCBybmdfYmFzZSArIFJOR19JTlRfU1RBVFVTX09GRlNFVCk7CisKKwkvKiBSZXNldCBSTkcgYW5kIFJCRyAqLworCXZhbCA9IGlvcmVhZDMyKHJuZ19iYXNlICsgUkJHX1NPRlRfUkVTRVRfT0ZGU0VUKTsKKwl2YWwgfD0gUkJHX1NPRlRfUkVTRVQ7CisJaW93cml0ZTMyKHZhbCwgcm5nX2Jhc2UgKyBSQkdfU09GVF9SRVNFVF9PRkZTRVQpOworCisJdmFsID0gaW9yZWFkMzIocm5nX2Jhc2UgKyBSTkdfU09GVF9SRVNFVF9PRkZTRVQpOworCXZhbCB8PSBSTkdfU09GVF9SRVNFVDsKKwlpb3dyaXRlMzIodmFsLCBybmdfYmFzZSArIFJOR19TT0ZUX1JFU0VUX09GRlNFVCk7CisKKwl2YWwgPSBpb3JlYWQzMihybmdfYmFzZSArIFJOR19TT0ZUX1JFU0VUX09GRlNFVCk7CisJdmFsICY9IH5STkdfU09GVF9SRVNFVDsKKwlpb3dyaXRlMzIodmFsLCBybmdfYmFzZSArIFJOR19TT0ZUX1JFU0VUX09GRlNFVCk7CisKKwl2YWwgPSBpb3JlYWQzMihybmdfYmFzZSArIFJCR19TT0ZUX1JFU0VUX09GRlNFVCk7CisJdmFsICY9IH5SQkdfU09GVF9SRVNFVDsKKwlpb3dyaXRlMzIodmFsLCBybmdfYmFzZSArIFJCR19TT0ZUX1JFU0VUX09GRlNFVCk7CisKKwkvKiBFbmFibGUgUkJHICovCisJdmFsID0gaW9yZWFkMzIocm5nX2Jhc2UgKyBSTkdfQ1RSTF9PRkZTRVQpOworCXZhbCAmPSB+Uk5HX0NUUkxfUk5HX1JCR0VOX01BU0s7CisJdmFsIHw9IFJOR19DVFJMX1JOR19SQkdFTl9FTkFCTEU7CisJaW93cml0ZTMyKHZhbCwgcm5nX2Jhc2UgKyBSTkdfQ1RSTF9PRkZTRVQpOworfQorCitzdGF0aWMgaW50IGlwcm9jX3JuZzIwMF9yZWFkKHN0cnVjdCBod3JuZyAqcm5nLCB2b2lkICpidWYsIHNpemVfdCBtYXgsCisJCQkgICAgIGJvb2wgd2FpdCkKK3sKKwlzdHJ1Y3QgaXByb2Nfcm5nMjAwX2RldiAqcHJpdiA9IHRvX3JuZ19wcml2KHJuZyk7CisJdWludDMyX3QgbnVtX3JlbWFpbmluZyA9IG1heDsKKwl1aW50MzJfdCBzdGF0dXM7CisKKwkjZGVmaW5lIE1BWF9SRVNFVFNfUEVSX1JFQUQJMQorCXVpbnQzMl90IG51bV9yZXNldHMgPSAwOworCisJI2RlZmluZSBNQVhfSURMRV9USU1FCSgxICogSFopCisJdW5zaWduZWQgbG9uZyBpZGxlX2VuZHRpbWUgPSBqaWZmaWVzICsgTUFYX0lETEVfVElNRTsKKworCXdoaWxlICgobnVtX3JlbWFpbmluZyA+IDApICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsIGlkbGVfZW5kdGltZSkpIHsKKworCQkvKiBJcyBSTkcgc2FuZT8gSWYgbm90LCByZXNldCBpdC4gKi8KKwkJc3RhdHVzID0gaW9yZWFkMzIocHJpdi0+YmFzZSArIFJOR19JTlRfU1RBVFVTX09GRlNFVCk7CisJCWlmICgoc3RhdHVzICYgKFJOR19JTlRfU1RBVFVTX01BU1RFUl9GQUlMX0xPQ0tPVVRfSVJRX01BU0sgfAorCQkJUk5HX0lOVF9TVEFUVVNfTklTVF9GQUlMX0lSUV9NQVNLKSkgIT0gMCkgeworCisJCQlpZiAobnVtX3Jlc2V0cyA+PSBNQVhfUkVTRVRTX1BFUl9SRUFEKQorCQkJCXJldHVybiBtYXggLSBudW1fcmVtYWluaW5nOworCisJCQlpcHJvY19ybmcyMDBfcmVzdGFydChwcml2LT5iYXNlKTsKKwkJCW51bV9yZXNldHMrKzsKKwkJfQorCisJCS8qIEFyZSB0aGVyZSBhbnkgcmFuZG9tIG51bWJlcnMgYXZhaWxhYmxlPyAqLworCQlpZiAoKGlvcmVhZDMyKHByaXYtPmJhc2UgKyBSTkdfRklGT19DT1VOVF9PRkZTRVQpICYKKwkJCQlSTkdfRklGT19DT1VOVF9STkdfRklGT19DT1VOVF9NQVNLKSA+IDApIHsKKworCQkJaWYgKG51bV9yZW1haW5pbmcgPj0gc2l6ZW9mKHVpbnQzMl90KSkgeworCQkJCS8qIEJ1ZmZlciBoYXMgcm9vbSB0byBzdG9yZSBlbnRpcmUgd29yZCAqLworCQkJCSoodWludDMyX3QgKilidWYgPSBpb3JlYWQzMihwcml2LT5iYXNlICsKKwkJCQkJCQlSTkdfRklGT19EQVRBX09GRlNFVCk7CisJCQkJYnVmICs9IHNpemVvZih1aW50MzJfdCk7CisJCQkJbnVtX3JlbWFpbmluZyAtPSBzaXplb2YodWludDMyX3QpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBCdWZmZXIgY2FuIG9ubHkgc3RvcmUgcGFydGlhbCB3b3JkICovCisJCQkJdWludDMyX3Qgcm5kX251bWJlciA9IGlvcmVhZDMyKHByaXYtPmJhc2UgKworCQkJCQkJCVJOR19GSUZPX0RBVEFfT0ZGU0VUKTsKKwkJCQltZW1jcHkoYnVmLCAmcm5kX251bWJlciwgbnVtX3JlbWFpbmluZyk7CisJCQkJYnVmICs9IG51bV9yZW1haW5pbmc7CisJCQkJbnVtX3JlbWFpbmluZyA9IDA7CisJCQl9CisKKwkJCS8qIFJlc2V0IHRoZSBJRExFIHRpbWVvdXQgKi8KKwkJCWlkbGVfZW5kdGltZSA9IGppZmZpZXMgKyBNQVhfSURMRV9USU1FOworCQl9IGVsc2UgeworCQkJaWYgKCF3YWl0KQorCQkJCS8qIENhbm5vdCB3YWl0LCByZXR1cm4gaW1tZWRpYXRlbHkgKi8KKwkJCQlyZXR1cm4gbWF4IC0gbnVtX3JlbWFpbmluZzsKKworCQkJLyogQ2FuIHdhaXQsIGdpdmUgb3RoZXJzIGNoYW5jZSB0byBydW4gKi8KKwkJCXVzbGVlcF9yYW5nZShtaW4obnVtX3JlbWFpbmluZyAqIDEwLCA1MDBVKSwgNTAwKTsKKwkJfQorCX0KKworCXJldHVybiBtYXggLSBudW1fcmVtYWluaW5nOworfQorCitzdGF0aWMgaW50IGlwcm9jX3JuZzIwMF9pbml0KHN0cnVjdCBod3JuZyAqcm5nKQoreworCXN0cnVjdCBpcHJvY19ybmcyMDBfZGV2ICpwcml2ID0gdG9fcm5nX3ByaXYocm5nKTsKKwl1aW50MzJfdCB2YWw7CisKKwkvKiBTZXR1cCBSTkcuICovCisJdmFsID0gaW9yZWFkMzIocHJpdi0+YmFzZSArIFJOR19DVFJMX09GRlNFVCk7CisJdmFsICY9IH5STkdfQ1RSTF9STkdfUkJHRU5fTUFTSzsKKwl2YWwgfD0gUk5HX0NUUkxfUk5HX1JCR0VOX0VOQUJMRTsKKwlpb3dyaXRlMzIodmFsLCBwcml2LT5iYXNlICsgUk5HX0NUUkxfT0ZGU0VUKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpcHJvY19ybmcyMDBfY2xlYW51cChzdHJ1Y3QgaHdybmcgKnJuZykKK3sKKwlzdHJ1Y3QgaXByb2Nfcm5nMjAwX2RldiAqcHJpdiA9IHRvX3JuZ19wcml2KHJuZyk7CisJdWludDMyX3QgdmFsOworCisJLyogRGlzYWJsZSBSTkcgaGFyZHdhcmUgKi8KKwl2YWwgPSBpb3JlYWQzMihwcml2LT5iYXNlICsgUk5HX0NUUkxfT0ZGU0VUKTsKKwl2YWwgJj0gflJOR19DVFJMX1JOR19SQkdFTl9NQVNLOworCXZhbCB8PSBSTkdfQ1RSTF9STkdfUkJHRU5fRElTQUJMRTsKKwlpb3dyaXRlMzIodmFsLCBwcml2LT5iYXNlICsgUk5HX0NUUkxfT0ZGU0VUKTsKK30KKworc3RhdGljIGludCBpcHJvY19ybmcyMDBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaXByb2Nfcm5nMjAwX2RldiAqcHJpdjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCWludCByZXQ7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIE1hcCBwZXJpcGhlcmFsICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcm5nIHJlc291cmNlc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByaXYtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCWlmIChJU19FUlIocHJpdi0+YmFzZSkpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVtYXAgcm5nIHJlZ3NcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwcml2LT5iYXNlKTsKKwl9CisKKwlwcml2LT5ybmcubmFtZSA9ICJpcHJvYy1ybmcyMDAiLAorCXByaXYtPnJuZy5yZWFkID0gaXByb2Nfcm5nMjAwX3JlYWQsCisJcHJpdi0+cm5nLmluaXQgPSBpcHJvY19ybmcyMDBfaW5pdCwKKwlwcml2LT5ybmcuY2xlYW51cCA9IGlwcm9jX3JuZzIwMF9jbGVhbnVwLAorCisJLyogUmVnaXN0ZXIgZHJpdmVyICovCisJcmV0ID0gZGV2bV9od3JuZ19yZWdpc3RlcihkZXYsICZwcml2LT5ybmcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJod3JuZyByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkZXZfaW5mbyhkZXYsICJod3JuZyByZWdpc3RlcmVkXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpcHJvY19ybmcyMDBfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20saXByb2Mtcm5nMjAwIiwgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpcHJvY19ybmcyMDBfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpcHJvY19ybmcyMDBfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCQk9ICJpcHJvYy1ybmcyMDAiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBpcHJvY19ybmcyMDBfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUJCT0gaXByb2Nfcm5nMjAwX3Byb2JlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaXByb2Nfcm5nMjAwX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkJyb2FkY29tIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlQcm9jIFJORzIwMCBSYW5kb20gTnVtYmVyIEdlbmVyYXRvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vbXNtLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9tc20tcm5nLmMKaW5kZXggY2VhMWM3MC4uOTZmYjk4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9tc20tcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9tc20tcm5nLmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCXJuZy0+aHdybmcuY2xlYW51cCA9IG1zbV9ybmdfY2xlYW51cCwKIAlybmctPmh3cm5nLnJlYWQgPSBtc21fcm5nX3JlYWQsCiAKLQlyZXQgPSBod3JuZ19yZWdpc3Rlcigmcm5nLT5od3JuZyk7CisJcmV0ID0gZGV2bV9od3JuZ19yZWdpc3RlcigmcGRldi0+ZGV2LCAmcm5nLT5od3JuZyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgaHdybmdcbiIpOwogCQlyZXR1cm4gcmV0OwpAQCAtMTY2LDE0ICsxNjYsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1zbV9ybmdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG1zbV9ybmcgKnJuZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCi0JaHdybmdfdW5yZWdpc3Rlcigmcm5nLT5od3JuZyk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1zbV9ybmdfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInFjb20scHJuZyIsIH0sCiAJe30KQEAgLTE4Miw3ICsxNzQsNiBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtc21fcm5nX2RyaXZlciA9IHsKIAkucHJvYmUgPSBtc21fcm5nX3Byb2JlLAotCS5yZW1vdmUgPSBtc21fcm5nX3JlbW92ZSwKIAkuZHJpdmVyID0gewogCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobXNtX3JuZ19vZl9tYXRjaCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL29jdGVvbi1ybmcuYyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vb2N0ZW9uLXJuZy5jCmluZGV4IGJlMWMzZjYuLjYyMzRhNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vb2N0ZW9uLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vb2N0ZW9uLXJuZy5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2V4aXQgb2N0ZW9uX3JuZ19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgb2N0ZW9uX3JuZ19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgaHdybmcgKnJuZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCkBAIC0xMTksNyArMTE5LDcgQEAKIAkJLm5hbWUJCT0gIm9jdGVvbl9ybmciLAogCX0sCiAJLnByb2JlCQk9IG9jdGVvbl9ybmdfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2V4aXRfcChvY3Rlb25fcm5nX3JlbW92ZSksCisJLnJlbW92ZQkJPSBvY3Rlb25fcm5nX3JlbW92ZSwKIH07CiAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIob2N0ZW9uX3JuZ19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9vbWFwLXJuZy5jIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9vbWFwLXJuZy5jCmluZGV4IGQxNGRjZjcuLjhhMTQzMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20vb21hcC1ybmcuYworKysgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL29tYXAtcm5nLmMKQEAgLTIzNiw3ICsyMzYsNyBAQAogCXUzMiB2YWw7CiAKIAkvKiBSZXR1cm4gaWYgUk5HIGlzIGFscmVhZHkgcnVubmluZy4gKi8KLQlpZiAob21hcF9ybmdfcmVhZChwcml2LCBSTkdfQ09ORklHX1JFRykgJiBSTkdfQ09OVFJPTF9FTkFCTEVfVFJOR19NQVNLKQorCWlmIChvbWFwX3JuZ19yZWFkKHByaXYsIFJOR19DT05UUk9MX1JFRykgJiBSTkdfQ09OVFJPTF9FTkFCTEVfVFJOR19NQVNLKQogCQlyZXR1cm4gMDsKIAogCXZhbCA9IFJOR19DT05GSUdfTUlOX1JFRklMX0NZQ0xFUyA8PCBSTkdfQ09ORklHX01JTl9SRUZJTF9DWUNMRVNfU0hJRlQ7CkBAIC0yNjIsNyArMjYyLDcgQEAKIAogCXZhbCA9IG9tYXBfcm5nX3JlYWQocHJpdiwgUk5HX0NPTlRST0xfUkVHKTsKIAl2YWwgJj0gflJOR19DT05UUk9MX0VOQUJMRV9UUk5HX01BU0s7Ci0Jb21hcF9ybmdfd3JpdGUocHJpdiwgUk5HX0NPTkZJR19SRUcsIHZhbCk7CisJb21hcF9ybmdfd3JpdGUocHJpdiwgUk5HX0NPTlRST0xfUkVHLCB2YWwpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcDRfcm5nX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCkBAIC00MDgsNyArNDA4LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBvbWFwX3JuZ19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgb21hcF9ybmdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG9tYXBfcm5nX2RldiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCkBAIC00MjIsOSArNDIyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotCi1zdGF0aWMgaW50IG9tYXBfcm5nX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBfX21heWJlX3VudXNlZCBvbWFwX3JuZ19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgb21hcF9ybmdfZGV2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKQEAgLTQzNCw3ICs0MzIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9tYXBfcm5nX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIG9tYXBfcm5nX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG9tYXBfcm5nX2RldiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCkBAIC00NDUsMjIgKzQ0MywxNSBAQAogfQogCiBzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMob21hcF9ybmdfcG0sIG9tYXBfcm5nX3N1c3BlbmQsIG9tYXBfcm5nX3Jlc3VtZSk7Ci0jZGVmaW5lCU9NQVBfUk5HX1BNCSgmb21hcF9ybmdfcG0pCi0KLSNlbHNlCi0KLSNkZWZpbmUJT01BUF9STkdfUE0JTlVMTAotCi0jZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9ybmdfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCQk9ICJvbWFwX3JuZyIsCi0JCS5wbQkJPSBPTUFQX1JOR19QTSwKKwkJLnBtCQk9ICZvbWFwX3JuZ19wbSwKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG9tYXBfcm5nX29mX21hdGNoKSwKIAl9LAogCS5wcm9iZQkJPSBvbWFwX3JuZ19wcm9iZSwKLQkucmVtb3ZlCQk9IF9fZXhpdF9wKG9tYXBfcm5nX3JlbW92ZSksCisJLnJlbW92ZQkJPSBvbWFwX3JuZ19yZW1vdmUsCiB9OwogCiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG9tYXBfcm5nX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL3BzZXJpZXMtcm5nLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL3BzZXJpZXMtcm5nLmMKaW5kZXggYmNmODZmOS4uNjNjZTUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS9wc2VyaWVzLXJuZy5jCisrKyBiL2RyaXZlcnMvY2hhci9od19yYW5kb20vcHNlcmllcy1ybmcuYwpAQCAtNjEsMTMgKzYxLDEzIEBACiAJLnJlYWQJCT0gcHNlcmllc19ybmdfcmVhZCwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBzZXJpZXNfcm5nX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsCitzdGF0aWMgaW50IHBzZXJpZXNfcm5nX3Byb2JlKHN0cnVjdCB2aW9fZGV2ICpkZXYsCiAJCWNvbnN0IHN0cnVjdCB2aW9fZGV2aWNlX2lkICppZCkKIHsKIAlyZXR1cm4gaHdybmdfcmVnaXN0ZXIoJnBzZXJpZXNfcm5nKTsKIH0KIAotc3RhdGljIGludCBfX2V4aXQgcHNlcmllc19ybmdfcmVtb3ZlKHN0cnVjdCB2aW9fZGV2ICpkZXYpCitzdGF0aWMgaW50IHBzZXJpZXNfcm5nX3JlbW92ZShzdHJ1Y3QgdmlvX2RldiAqZGV2KQogewogCWh3cm5nX3VucmVnaXN0ZXIoJnBzZXJpZXNfcm5nKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9od19yYW5kb20veGdlbmUtcm5nLmMgYi9kcml2ZXJzL2NoYXIvaHdfcmFuZG9tL3hnZW5lLXJuZy5jCmluZGV4IDIzY2FhMDUuLmMzN2NmNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9od19yYW5kb20veGdlbmUtcm5nLmMKKysrIGIvZHJpdmVycy9jaGFyL2h3X3JhbmRvbS94Z2VuZS1ybmcuYwpAQCAtMjEsNiArMjEsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+CkBAIC0zMTAsNiArMzExLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfQUNQSQorc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCB4Z2VuZV9ybmdfYWNwaV9tYXRjaFtdID0geworCXsgIkFQTUMwRDE4IiwgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHhnZW5lX3JuZ19hY3BpX21hdGNoKTsKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IGh3cm5nIHhnZW5lX3JuZ19mdW5jID0gewogCS5uYW1lCQk9ICJ4Z2VuZS1ybmciLAogCS5pbml0CQk9IHhnZW5lX3JuZ19pbml0LApAQCAtNDE1LDYgKzQyNCw3IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJCT0gInhnZW5lLXJuZyIsCiAJCS5vZl9tYXRjaF90YWJsZSA9IHhnZW5lX3JuZ19vZl9tYXRjaCwKKwkJLmFjcGlfbWF0Y2hfdGFibGUgPSBBQ1BJX1BUUih4Z2VuZV9ybmdfYWNwaV9tYXRjaCksCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfcG93ZXJudi5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm52LmMKaW5kZXggNzk1MjRlZC4uODc1M2IwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm52LmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9wb3dlcm52LmMKQEAgLTEyNSw2ICsxMjUsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZzbWktPm1zZ19sb2NrLCBmbGFncyk7CiAKIAlpZiAoIXNtaS0+Y3VyX21zZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzbWktPm1zZ19sb2NrLCBmbGFncyk7CiAJCXByX3dhcm4oIm5vIGN1cnJlbnQgbWVzc2FnZT9cbiIpOwogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NpX2ludGYuYyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCmluZGV4IGY2NjQ2ZWQuLjUxODU4NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCisrKyBiL2RyaXZlcnMvY2hhci9pcG1pL2lwbWlfc2lfaW50Zi5jCkBAIC0yNjMsNiArMjYzLDExIEBACiAJYm9vbCBzdXBwb3J0c19ldmVudF9tc2dfYnVmZjsKIAogCS8qCisJICogQ2FuIHdlIGNsZWFyIHRoZSBnbG9iYWwgZW5hYmxlcyByZWNlaXZlIGlycSBiaXQ/CisJICovCisJYm9vbCBjYW5ub3RfY2xlYXJfcmVjdl9pcnFfYml0OworCisJLyoKIAkgKiBEaWQgd2UgZ2V0IGFuIGF0dGVudGlvbiB0aGF0IHdlIGRpZCBub3QgaGFuZGxlPwogCSAqLwogCWJvb2wgZ290X2F0dG47CkBAIC00NjEsNiArNDY2LDkgQEAKICAqIGFsbG9jYXRlIG1lc3NhZ2VzLCB3ZSBqdXN0IGxlYXZlIHRoZW0gaW4gdGhlIEJNQyBhbmQgcnVuIHRoZSBzeXN0ZW0KICAqIHBvbGxlZCB1bnRpbCB3ZSBjYW4gYWxsb2NhdGUgc29tZSBtZW1vcnkuICBPbmNlIHdlIGhhdmUgc29tZQogICogbWVtb3J5LCB3ZSB3aWxsIHJlLWVuYWJsZSB0aGUgaW50ZXJydXB0LgorICoKKyAqIE5vdGUgdGhhdCB3ZSBjYW5ub3QganVzdCB1c2UgZGlzYWJsZV9pcnEoKSwgc2luY2UgdGhlIGludGVycnVwdCBtYXkKKyAqIGJlIHNoYXJlZC4KICAqLwogc3RhdGljIGlubGluZSBib29sIGRpc2FibGVfc2lfaXJxKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCiB7CkBAIC01NDksMjAgKzU1NywxNSBAQAogCiAJaWYgKHNtaV9pbmZvLT5zdXBwb3J0c19ldmVudF9tc2dfYnVmZikKIAkJZW5hYmxlcyB8PSBJUE1JX0JNQ19FVlRfTVNHX0JVRkY7Ci0JZWxzZQotCQllbmFibGVzICY9IH5JUE1JX0JNQ19FVlRfTVNHX0JVRkY7CiAKLQlpZiAoc21pX2luZm8tPmlycSAmJiAhc21pX2luZm8tPmludGVycnVwdF9kaXNhYmxlZCkKKwlpZiAoKHNtaV9pbmZvLT5pcnEgJiYgIXNtaV9pbmZvLT5pbnRlcnJ1cHRfZGlzYWJsZWQpIHx8CisJICAgIHNtaV9pbmZvLT5jYW5ub3RfY2xlYXJfcmVjdl9pcnFfYml0KQogCQllbmFibGVzIHw9IElQTUlfQk1DX1JDVl9NU0dfSU5UUjsKLQllbHNlCi0JCWVuYWJsZXMgJj0gfklQTUlfQk1DX1JDVl9NU0dfSU5UUjsKIAogCWlmIChzbWlfaW5mby0+c3VwcG9ydHNfZXZlbnRfbXNnX2J1ZmYgJiYKIAkgICAgc21pX2luZm8tPmlycSAmJiAhc21pX2luZm8tPmludGVycnVwdF9kaXNhYmxlZCkKIAogCQllbmFibGVzIHw9IElQTUlfQk1DX0VWVF9NU0dfSU5UUjsKLQllbHNlCi0JCWVuYWJsZXMgJj0gfklQTUlfQk1DX0VWVF9NU0dfSU5UUjsKIAogCSppcnFfb24gPSBlbmFibGVzICYgKElQTUlfQk1DX0VWVF9NU0dfSU5UUiB8IElQTUlfQk1DX1JDVl9NU0dfSU5UUik7CiAKQEAgLTI5MDAsNiArMjkwMyw5NiBAQAogCXJldHVybiBydjsKIH0KIAorLyoKKyAqIFNvbWUgQk1DcyBkbyBub3Qgc3VwcG9ydCBjbGVhcmluZyB0aGUgcmVjZWl2ZSBpcnEgYml0IGluIHRoZSBnbG9iYWwKKyAqIGVuYWJsZXMgKGV2ZW4gaWYgdGhleSBkb24ndCBzdXBwb3J0IGludGVycnVwdHMgb24gdGhlIEJNQykuICBDaGVjaworICogZm9yIHRoaXMgYW5kIGhhbmRsZSBpdCBwcm9wZXJseS4KKyAqLworc3RhdGljIHZvaWQgY2hlY2tfY2xyX3Jjdl9pcnEoc3RydWN0IHNtaV9pbmZvICpzbWlfaW5mbykKK3sKKwl1bnNpZ25lZCBjaGFyICAgICAgICAgbXNnWzNdOworCXVuc2lnbmVkIGNoYXIgICAgICAgICAqcmVzcDsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgcmVzcF9sZW47CisJaW50ICAgICAgICAgICAgICAgICAgIHJ2OworCisJcmVzcCA9IGttYWxsb2MoSVBNSV9NQVhfTVNHX0xFTkdUSCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJPdXQgb2YgbWVtb3J5IGFsbG9jYXRpbmcgcmVzcG9uc2UgZm9yIgorCQkgICAgICAgIiBnbG9iYWwgZW5hYmxlcyBjb21tYW5kLCBjYW5ub3QgY2hlY2sgcmVjdiBpcnEgYml0IgorCQkgICAgICAgIiBoYW5kbGluZy5cbiIpOworCQlyZXR1cm47CisJfQorCisJbXNnWzBdID0gSVBNSV9ORVRGTl9BUFBfUkVRVUVTVCA8PCAyOworCW1zZ1sxXSA9IElQTUlfR0VUX0JNQ19HTE9CQUxfRU5BQkxFU19DTUQ7CisJc21pX2luZm8tPmhhbmRsZXJzLT5zdGFydF90cmFuc2FjdGlvbihzbWlfaW5mby0+c2lfc20sIG1zZywgMik7CisKKwlydiA9IHdhaXRfZm9yX21zZ19kb25lKHNtaV9pbmZvKTsKKwlpZiAocnYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkVycm9yIGdldHRpbmcgcmVzcG9uc2UgZnJvbSBnZXQiCisJCSAgICAgICAiIGdsb2JhbCBlbmFibGVzIGNvbW1hbmQsIGNhbm5vdCBjaGVjayByZWN2IGlycSBiaXQiCisJCSAgICAgICAiIGhhbmRsaW5nLlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJlc3BfbGVuID0gc21pX2luZm8tPmhhbmRsZXJzLT5nZXRfcmVzdWx0KHNtaV9pbmZvLT5zaV9zbSwKKwkJCQkJCSAgcmVzcCwgSVBNSV9NQVhfTVNHX0xFTkdUSCk7CisKKwlpZiAocmVzcF9sZW4gPCA0IHx8CisJCQlyZXNwWzBdICE9IChJUE1JX05FVEZOX0FQUF9SRVFVRVNUIHwgMSkgPDwgMiB8fAorCQkJcmVzcFsxXSAhPSBJUE1JX0dFVF9CTUNfR0xPQkFMX0VOQUJMRVNfQ01EICAgfHwKKwkJCXJlc3BbMl0gIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiSW52YWxpZCByZXR1cm4gZnJvbSBnZXQgZ2xvYmFsIgorCQkgICAgICAgIiBlbmFibGVzIGNvbW1hbmQsIGNhbm5vdCBjaGVjayByZWN2IGlycSBiaXQiCisJCSAgICAgICAiIGhhbmRsaW5nLlxuIik7CisJCXJ2ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKChyZXNwWzNdICYgSVBNSV9CTUNfUkNWX01TR19JTlRSKSA9PSAwKQorCQkvKiBBbHJlYWR5IGNsZWFyLCBzaG91bGQgd29yayBvay4gKi8KKwkJZ290byBvdXQ7CisKKwltc2dbMF0gPSBJUE1JX05FVEZOX0FQUF9SRVFVRVNUIDw8IDI7CisJbXNnWzFdID0gSVBNSV9TRVRfQk1DX0dMT0JBTF9FTkFCTEVTX0NNRDsKKwltc2dbMl0gPSByZXNwWzNdICYgfklQTUlfQk1DX1JDVl9NU0dfSU5UUjsKKwlzbWlfaW5mby0+aGFuZGxlcnMtPnN0YXJ0X3RyYW5zYWN0aW9uKHNtaV9pbmZvLT5zaV9zbSwgbXNnLCAzKTsKKworCXJ2ID0gd2FpdF9mb3JfbXNnX2RvbmUoc21pX2luZm8pOworCWlmIChydikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiRXJyb3IgZ2V0dGluZyByZXNwb25zZSBmcm9tIHNldCIKKwkJICAgICAgICIgZ2xvYmFsIGVuYWJsZXMgY29tbWFuZCwgY2Fubm90IGNoZWNrIHJlY3YgaXJxIGJpdCIKKwkJICAgICAgICIgaGFuZGxpbmcuXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVzcF9sZW4gPSBzbWlfaW5mby0+aGFuZGxlcnMtPmdldF9yZXN1bHQoc21pX2luZm8tPnNpX3NtLAorCQkJCQkJICByZXNwLCBJUE1JX01BWF9NU0dfTEVOR1RIKTsKKworCWlmIChyZXNwX2xlbiA8IDMgfHwKKwkJCXJlc3BbMF0gIT0gKElQTUlfTkVURk5fQVBQX1JFUVVFU1QgfCAxKSA8PCAyIHx8CisJCQlyZXNwWzFdICE9IElQTUlfU0VUX0JNQ19HTE9CQUxfRU5BQkxFU19DTUQpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkludmFsaWQgcmV0dXJuIGZyb20gZ2V0IGdsb2JhbCIKKwkJICAgICAgICIgZW5hYmxlcyBjb21tYW5kLCBjYW5ub3QgY2hlY2sgcmVjdiBpcnEgYml0IgorCQkgICAgICAgIiBoYW5kbGluZy5cbiIpOworCQlydiA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChyZXNwWzJdICE9IDApIHsKKwkJLyoKKwkJICogQW4gZXJyb3Igd2hlbiBzZXR0aW5nIHRoZSBldmVudCBidWZmZXIgYml0IG1lYW5zCisJCSAqIGNsZWFyaW5nIHRoZSBiaXQgaXMgbm90IHN1cHBvcnRlZC4KKwkJICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJUaGUgQk1DIGRvZXMgbm90IHN1cHBvcnQgY2xlYXJpbmciCisJCSAgICAgICAiIHRoZSByZWN2IGlycSBiaXQsIGNvbXBlbnNhdGluZywgYnV0IHRoZSBCTUMgbmVlZHMgdG8iCisJCSAgICAgICAiIGJlIGZpeGVkLlxuIik7CisJCXNtaV9pbmZvLT5jYW5ub3RfY2xlYXJfcmVjdl9pcnFfYml0ID0gdHJ1ZTsKKwl9Cisgb3V0OgorCWtmcmVlKHJlc3ApOworfQorCiBzdGF0aWMgaW50IHRyeV9lbmFibGVfZXZlbnRfYnVmZmVyKHN0cnVjdCBzbWlfaW5mbyAqc21pX2luZm8pCiB7CiAJdW5zaWduZWQgY2hhciAgICAgICAgIG1zZ1szXTsKQEAgLTMzOTUsNiArMzQ4OCw4IEBACiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKKwljaGVja19jbHJfcmN2X2lycShuZXdfc21pKTsKKwogCXNldHVwX29lbV9kYXRhX2hhbmRsZXIobmV3X3NtaSk7CiAJc2V0dXBfeGFjdGlvbl9oYW5kbGVycyhuZXdfc21pKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV9zc2lmLmMgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NzaWYuYwppbmRleCBmNmUzNzhkLi5mNDBlM2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NzaWYuYworKysgYi9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3NzaWYuYwpAQCAtNDY4LDExICs0NjgsMTMgQEAKIAkJaW50IHJlc3VsdDsKIAogCQkvKiBXYWl0IGZvciBzb21ldGhpbmcgdG8gZG8gKi8KLQkJd2FpdF9mb3JfY29tcGxldGlvbigmc3NpZl9pbmZvLT53YWtlX3RocmVhZCk7Ci0JCWluaXRfY29tcGxldGlvbigmc3NpZl9pbmZvLT53YWtlX3RocmVhZCk7Ci0KKwkJcmVzdWx0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKAorCQkJCQkJJnNzaWZfaW5mby0+d2FrZV90aHJlYWQpOwogCQlpZiAoc3NpZl9pbmZvLT5zdG9wcGluZykKIAkJCWJyZWFrOworCQlpZiAocmVzdWx0ID09IC1FUkVTVEFSVFNZUykKKwkJCWNvbnRpbnVlOworCQlpbml0X2NvbXBsZXRpb24oJnNzaWZfaW5mby0+d2FrZV90aHJlYWQpOwogCiAJCWlmIChzc2lmX2luZm8tPmkyY19yZWFkX3dyaXRlID09IEkyQ19TTUJVU19XUklURSkgewogCQkJcmVzdWx0ID0gaTJjX3NtYnVzX3dyaXRlX2Jsb2NrX2RhdGEoCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvbWVtLmMgYi9kcml2ZXJzL2NoYXIvbWVtLmMKaW5kZXggMjk3MTEwYy4uNmIxNzIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL21lbS5jCisrKyBiL2RyaXZlcnMvY2hhci9tZW0uYwpAQCAtMjYsNyArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKQEAgLTYwNywxNiArNjA3LDE2IEBACiAJcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgc3NpemVfdCBhaW9fcmVhZF9udWxsKHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK3N0YXRpYyBzc2l6ZV90IHJlYWRfaXRlcl9udWxsKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHNzaXplX3QgYWlvX3dyaXRlX251bGwoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK3N0YXRpYyBzc2l6ZV90IHdyaXRlX2l0ZXJfbnVsbChzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKLQlyZXR1cm4gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOworCWlvdl9pdGVyX2FkdmFuY2UoZnJvbSwgY291bnQpOworCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIGludCBwaXBlX3RvX251bGwoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqaW5mbywgc3RydWN0IHBpcGVfYnVmZmVyICpidWYsCkBAIC03MTgsNyArNzE4LDcgQEAKICNkZWZpbmUgemVyb19sc2VlawludWxsX2xzZWVrCiAjZGVmaW5lIGZ1bGxfbHNlZWsgICAgICBudWxsX2xzZWVrCiAjZGVmaW5lIHdyaXRlX3plcm8Jd3JpdGVfbnVsbAotI2RlZmluZSBhaW9fd3JpdGVfemVybwlhaW9fd3JpdGVfbnVsbAorI2RlZmluZSB3cml0ZV9pdGVyX3plcm8Jd3JpdGVfaXRlcl9udWxsCiAjZGVmaW5lIG9wZW5fbWVtCW9wZW5fcG9ydAogI2RlZmluZSBvcGVuX2ttZW0Jb3Blbl9tZW0KIApAQCAtNzUwLDggKzc1MCw4IEBACiAJLmxsc2VlawkJPSBudWxsX2xzZWVrLAogCS5yZWFkCQk9IHJlYWRfbnVsbCwKIAkud3JpdGUJCT0gd3JpdGVfbnVsbCwKLQkuYWlvX3JlYWQJPSBhaW9fcmVhZF9udWxsLAotCS5haW9fd3JpdGUJPSBhaW9fd3JpdGVfbnVsbCwKKwkucmVhZF9pdGVyCT0gcmVhZF9pdGVyX251bGwsCisJLndyaXRlX2l0ZXIJPSB3cml0ZV9pdGVyX251bGwsCiAJLnNwbGljZV93cml0ZQk9IHNwbGljZV93cml0ZV9udWxsLAogfTsKIApAQCAtNzY0LDEwICs3NjQsOSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB6ZXJvX2ZvcHMgPSB7CiAJLmxsc2VlawkJPSB6ZXJvX2xzZWVrLAotCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCiAJLndyaXRlCQk9IHdyaXRlX3plcm8sCiAJLnJlYWRfaXRlcgk9IHJlYWRfaXRlcl96ZXJvLAotCS5haW9fd3JpdGUJPSBhaW9fd3JpdGVfemVybywKKwkud3JpdGVfaXRlcgk9IHdyaXRlX2l0ZXJfemVybywKIAkubW1hcAkJPSBtbWFwX3plcm8sCiAjaWZuZGVmIENPTkZJR19NTVUKIAkubW1hcF9jYXBhYmlsaXRpZXMgPSB6ZXJvX21tYXBfY2FwYWJpbGl0aWVzLApAQCAtNzc2LDcgKzc3NSw2IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1bGxfZm9wcyA9IHsKIAkubGxzZWVrCQk9IGZ1bGxfbHNlZWssCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKIAkucmVhZF9pdGVyCT0gcmVhZF9pdGVyX3plcm8sCiAJLndyaXRlCQk9IHdyaXRlX2Z1bGwsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3Jhdy5jIGIvZHJpdmVycy9jaGFyL3Jhdy5jCmluZGV4IDZlMjliZjIuLjVmYzI5MWM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmF3LmMKKysrIGIvZHJpdmVycy9jaGFyL3Jhdy5jCkBAIC0yODIsOSArMjgyLDcgQEAKICNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByYXdfZm9wcyA9IHsKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIJPSBibGtkZXZfcmVhZF9pdGVyLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkud3JpdGVfaXRlcgk9IGJsa2Rldl93cml0ZV9pdGVyLAogCS5mc3luYwkJPSBibGtkZXZfZnN5bmMsCiAJLm9wZW4JCT0gcmF3X29wZW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMgYi9kcml2ZXJzL2NoYXIvdGlsZS1zcm9tLmMKaW5kZXggMDJlNzZhYy4uNjlmNmI0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jCisrKyBiL2RyaXZlcnMvY2hhci90aWxlLXNyb20uYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIHNpemVfdCAqLwogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgkvKiBPX0FDQ01PREUgKi8KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZyBiL2RyaXZlcnMvY2hhci90cG0vS2NvbmZpZwppbmRleCA5ZDRlMzc1Li4zYjg0YThiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdHBtL0tjb25maWcKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9LY29uZmlnCkBAIC0yNSwxMyArMjUsMTQgQEAKIGlmIFRDR19UUE0KIAogY29uZmlnIFRDR19USVMKLQl0cmlzdGF0ZSAiVFBNIEludGVyZmFjZSBTcGVjaWZpY2F0aW9uIDEuMiBJbnRlcmZhY2UiCisJdHJpc3RhdGUgIlRQTSBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbiAxLjIgSW50ZXJmYWNlIC8gVFBNIDIuMCBGSUZPIEludGVyZmFjZSIKIAlkZXBlbmRzIG9uIFg4NgogCS0tLWhlbHAtLS0KIAkgIElmIHlvdSBoYXZlIGEgVFBNIHNlY3VyaXR5IGNoaXAgdGhhdCBpcyBjb21wbGlhbnQgd2l0aCB0aGUKLQkgIFRDRyBUSVMgMS4yIFRQTSBzcGVjaWZpY2F0aW9uIHNheSBZZXMgYW5kIGl0IHdpbGwgYmUgYWNjZXNzaWJsZQotCSAgZnJvbSB3aXRoaW4gTGludXguICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UKLQkgIE0gaGVyZTsgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0cG1fdGlzLgorCSAgVENHIFRJUyAxLjIgVFBNIHNwZWNpZmljYXRpb24gKFRQTTEuMikgb3IgdGhlIFRDRyBQVFAgRklGTworCSAgc3BlY2lmaWNhdGlvbiAoVFBNMi4wKSBzYXkgWWVzIGFuZCBpdCB3aWxsIGJlIGFjY2Vzc2libGUgZnJvbQorCSAgd2l0aGluIExpbnV4LiBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgIE0gaGVyZTsKKwkgIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdHBtX3Rpcy4KIAogY29uZmlnIFRDR19USVNfSTJDX0FUTUVMCiAJdHJpc3RhdGUgIlRQTSBJbnRlcmZhY2UgU3BlY2lmaWNhdGlvbiAxLjIgSW50ZXJmYWNlIChJMkMgLSBBdG1lbCkiCkBAIC0xMDAsMTYgKzEwMSw2IEBACiAJICB3aWxsIGJlIGFjY2Vzc2libGUgZnJvbSB3aXRoaW4gTGludXguICBUbyBjb21waWxlIHRoaXMgZHJpdmVyCiAJICBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTsgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0cG1faWJtdnRwbS4KIAotY29uZmlnIFRDR19USVNfSTJDX1NUMzMKLQl0cmlzdGF0ZSAiVFBNIEludGVyZmFjZSBTcGVjaWZpY2F0aW9uIDEuMiBJbnRlcmZhY2UgKEkyQyAtIFNUTWljcm9lbGVjdHJvbmljcykiCi0JZGVwZW5kcyBvbiBJMkMKLQlkZXBlbmRzIG9uIEdQSU9MSUIKLQktLS1oZWxwLS0tCi0JICBJZiB5b3UgaGF2ZSBhIFRQTSBzZWN1cml0eSBjaGlwIGZyb20gU1RNaWNyb2VsZWN0cm9uaWNzIHdvcmtpbmcgd2l0aAotCSAgYW4gSTJDIGJ1cyBzYXkgWWVzIGFuZCBpdCB3aWxsIGJlIGFjY2Vzc2libGUgZnJvbSB3aXRoaW4gTGludXguCi0JICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOyB0aGUgbW9kdWxlIHdpbGwgYmUKLQkgIGNhbGxlZCB0cG1faTJjX3N0bV9zdDMzLgotCiBjb25maWcgVENHX1hFTgogCXRyaXN0YXRlICJYRU4gVFBNIEludGVyZmFjZSIKIAlkZXBlbmRzIG9uIFRDR19UUE0gJiYgWEVOCkBAIC0xMzEsNCArMTIyLDUgQEAKIAkgIGZyb20gd2l0aGluIExpbnV4LiAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlCiAJICBNIGhlcmU7IHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdHBtX2NyYi4KIAorc291cmNlICJkcml2ZXJzL2NoYXIvdHBtL3N0MzN6cDI0L0tjb25maWciCiBlbmRpZiAjIFRDR19UUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvdHBtL01ha2VmaWxlCmluZGV4IDk5MGNmMTguLjU2ZThmMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9NYWtlZmlsZQpAQCAtMjAsNiArMjAsNiBAQAogb2JqLSQoQ09ORklHX1RDR19BVE1FTCkgKz0gdHBtX2F0bWVsLm8KIG9iai0kKENPTkZJR19UQ0dfSU5GSU5FT04pICs9IHRwbV9pbmZpbmVvbi5vCiBvYmotJChDT05GSUdfVENHX0lCTVZUUE0pICs9IHRwbV9pYm12dHBtLm8KLW9iai0kKENPTkZJR19UQ0dfVElTX0kyQ19TVDMzKSArPSB0cG1faTJjX3N0bV9zdDMzLm8KK29iai0kKENPTkZJR19UQ0dfVElTX1NUMzNaUDI0KSArPSBzdDMzenAyNC8KIG9iai0kKENPTkZJR19UQ0dfWEVOKSArPSB4ZW4tdHBtZnJvbnQubwogb2JqLSQoQ09ORklHX1RDR19DUkIpICs9IHRwbV9jcmIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9LY29uZmlnIGIvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Y2I3Mjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9LY29uZmlnCkBAIC0wLDAgKzEsMzAgQEAKK2NvbmZpZyBUQ0dfVElTX1NUMzNaUDI0CisJdHJpc3RhdGUgIlNUTWljcm9lbGVjdHJvbmljcyBUUE0gSW50ZXJmYWNlIFNwZWNpZmljYXRpb24gMS4yIEludGVyZmFjZSIKKwlkZXBlbmRzIG9uIEdQSU9MSUIKKwktLS1oZWxwLS0tCisJICBTVE1pY3JvZWxlY3Ryb25pY3MgU1QzM1pQMjQgY29yZSBkcml2ZXIuIEl0IGltcGxlbWVudHMgdGhlIGNvcmUKKwkgIFRQTTEuMiBsb2dpYyBhbmQgaG9va3MgaW50byB0aGUgVFBNIGtlcm5lbCBBUElzLiBQaHlzaWNhbCBsYXllcnMgd2lsbAorCSAgcmVnaXN0ZXIgYWdhaW5zdCBpdC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIG0gaGVyZS4gVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZAorCSAgdHBtX3N0MzN6cDI0LgorCitjb25maWcgVENHX1RJU19TVDMzWlAyNF9JMkMKKwl0cmlzdGF0ZSAiVFBNIDEuMiBTVDMzWlAyNCBJMkMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFRDR19USVNfU1QzM1pQMjQKKwlkZXBlbmRzIG9uIEkyQworCS0tLWhlbHAtLS0KKwkgIFRoaXMgbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3IgdGhlIFNUTWljcm9lbGVjdHJvbmljcyBUUE0gc2VjdXJpdHkgY2hpcAorCSAgU1QzM1pQMjQgd2l0aCBpMmMgaW50ZXJmYWNlLgorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTsgdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgdHBtX3N0MzN6cDI0X2kyYy4KKworY29uZmlnIFRDR19USVNfU1QzM1pQMjRfU1BJCisJdHJpc3RhdGUgIlRQTSAxLjIgU1QzM1pQMjQgU1BJIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBUQ0dfVElTX1NUMzNaUDI0CisJZGVwZW5kcyBvbiBTUEkKKwktLS1oZWxwLS0tCisJICBUaGlzIG1vZHVsZSBhZGRzIHN1cHBvcnQgZm9yIHRoZSBTVE1pY3JvZWxlY3Ryb25pY3MgVFBNIHNlY3VyaXR5IGNoaXAKKwkgIFNUMzNaUDI0IHdpdGggc3BpIGludGVyZmFjZS4KKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU7IHRoZSBtb2R1bGUgd2lsbCBiZQorCSAgY2FsbGVkIHRwbV9zdDMzenAyNF9zcGkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3N0MzN6cDI0L01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGE3MjJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9NYWtlZmlsZQpAQCAtMCwwICsxLDEyIEBACisjCisjIE1ha2VmaWxlIGZvciBTVDMzWlAyNCBUUE0gMS4yIGRyaXZlcgorIworCit0cG1fc3QzM3pwMjQtb2JqcyA9IHN0MzN6cDI0Lm8KK29iai0kKENPTkZJR19UQ0dfVElTX1NUMzNaUDI0KSArPSB0cG1fc3QzM3pwMjQubworCit0cG1fc3QzM3pwMjRfaTJjLW9ianMgPSBpMmMubworb2JqLSQoQ09ORklHX1RDR19USVNfU1QzM1pQMjRfSTJDKSArPSB0cG1fc3QzM3pwMjRfaTJjLm8KKwordHBtX3N0MzN6cDI0X3NwaS1vYmpzID0gc3BpLm8KK29iai0kKENPTkZJR19UQ0dfVElTX1NUMzNaUDI0X1NQSSkgKz0gdHBtX3N0MzN6cDI0X3NwaS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3N0MzN6cDI0L2kyYy5jIGIvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDFlZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9pMmMuYwpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIFNUTWljcm9lbGVjdHJvbmljcyBUUE0gSTJDIExpbnV4IGRyaXZlciBmb3IgVFBNIFNUMzNaUDI0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDE1IFNUTWljcm9lbGVjdHJvbmljcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90cG0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3N0MzN6cDI0Lmg+CisKKyNpbmNsdWRlICJzdDMzenAyNC5oIgorCisjZGVmaW5lIFRQTV9EVU1NWV9CWVRFCQkJMHhBQQorCitzdHJ1Y3Qgc3QzM3pwMjRfaTJjX3BoeSB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwl1OCBidWZbVFBNX0JVRlNJWkUgKyAxXTsKKwlpbnQgaW9fbHBjcGQ7Cit9OworCisvKgorICogd3JpdGU4X3JlZworICogU2VuZCBieXRlIHRvIHRoZSBUSVMgcmVnaXN0ZXIgYWNjb3JkaW5nIHRvIHRoZSBTVDMzWlAyNCBJMkMgcHJvdG9jb2wuCisgKiBAcGFyYW06IHRwbV9yZWdpc3RlciwgdGhlIHRwbSB0aXMgcmVnaXN0ZXIgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbTogdHBtX2RhdGEsIHRoZSB0cG1fZGF0YSB0byB3cml0ZSBpbnNpZGUgdGhlIHRwbV9yZWdpc3RlcgorICogQHBhcmFtOiB0cG1fc2l6ZSwgVGhlIGxlbmd0aCBvZiB0aGUgZGF0YQorICogQHJldHVybjogUmV0dXJucyBuZWdhdGl2ZSBlcnJubywgb3IgZWxzZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCisgKi8KK3N0YXRpYyBpbnQgd3JpdGU4X3JlZyh2b2lkICpwaHlfaWQsIHU4IHRwbV9yZWdpc3RlciwgdTggKnRwbV9kYXRhLCBpbnQgdHBtX3NpemUpCit7CisJc3RydWN0IHN0MzN6cDI0X2kyY19waHkgKnBoeSA9IHBoeV9pZDsKKworCXBoeS0+YnVmWzBdID0gdHBtX3JlZ2lzdGVyOworCW1lbWNweShwaHktPmJ1ZiArIDEsIHRwbV9kYXRhLCB0cG1fc2l6ZSk7CisJcmV0dXJuIGkyY19tYXN0ZXJfc2VuZChwaHktPmNsaWVudCwgcGh5LT5idWYsIHRwbV9zaXplICsgMSk7Cit9IC8qIHdyaXRlOF9yZWcoKSAqLworCisvKgorICogcmVhZDhfcmVnCisgKiBSZWN2IGJ5dGUgZnJvbSB0aGUgVElTIHJlZ2lzdGVyIGFjY29yZGluZyB0byB0aGUgU1QzM1pQMjQgSTJDIHByb3RvY29sLgorICogQHBhcmFtOiB0cG1fcmVnaXN0ZXIsIHRoZSB0cG0gdGlzIHJlZ2lzdGVyIHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSByZWFkCisgKiBAcGFyYW06IHRwbV9kYXRhLCB0aGUgVFBNIHJlc3BvbnNlCisgKiBAcGFyYW06IHRwbV9zaXplLCB0cG0gVFBNIHJlc3BvbnNlIHNpemUgdG8gcmVhZC4KKyAqIEByZXR1cm46IG51bWJlciBvZiBieXRlIHJlYWQgc3VjY2Vzc2Z1bGx5OiBzaG91bGQgYmUgb25lIGlmIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgcmVhZDhfcmVnKHZvaWQgKnBoeV9pZCwgdTggdHBtX3JlZ2lzdGVyLCB1OCAqdHBtX2RhdGEsIGludCB0cG1fc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3QzM3pwMjRfaTJjX3BoeSAqcGh5ID0gcGh5X2lkOworCXU4IHN0YXR1cyA9IDA7CisJdTggZGF0YTsKKworCWRhdGEgPSBUUE1fRFVNTVlfQllURTsKKwlzdGF0dXMgPSB3cml0ZThfcmVnKHBoeSwgdHBtX3JlZ2lzdGVyLCAmZGF0YSwgMSk7CisJaWYgKHN0YXR1cyA9PSAyKQorCQlzdGF0dXMgPSBpMmNfbWFzdGVyX3JlY3YocGh5LT5jbGllbnQsIHRwbV9kYXRhLCB0cG1fc2l6ZSk7CisJcmV0dXJuIHN0YXR1czsKK30gLyogcmVhZDhfcmVnKCkgKi8KKworLyoKKyAqIHN0MzN6cDI0X2kyY19zZW5kCisgKiBTZW5kIGJ5dGUgdG8gdGhlIFRJUyByZWdpc3RlciBhY2NvcmRpbmcgdG8gdGhlIFNUMzNaUDI0IEkyQyBwcm90b2NvbC4KKyAqIEBwYXJhbTogcGh5X2lkLCB0aGUgcGh5IGRlc2NyaXB0aW9uCisgKiBAcGFyYW06IHRwbV9yZWdpc3RlciwgdGhlIHRwbSB0aXMgcmVnaXN0ZXIgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHdyaXR0ZW4KKyAqIEBwYXJhbTogdHBtX2RhdGEsIHRoZSB0cG1fZGF0YSB0byB3cml0ZSBpbnNpZGUgdGhlIHRwbV9yZWdpc3RlcgorICogQHBhcmFtOiB0cG1fc2l6ZSwgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YQorICogQHJldHVybjogbnVtYmVyIG9mIGJ5dGUgd3JpdHRlbiBzdWNjZXNzZnVsbHk6IHNob3VsZCBiZSBvbmUgaWYgc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCBzdDMzenAyNF9pMmNfc2VuZCh2b2lkICpwaHlfaWQsIHU4IHRwbV9yZWdpc3RlciwgdTggKnRwbV9kYXRhLAorCQkJICAgICBpbnQgdHBtX3NpemUpCit7CisJcmV0dXJuIHdyaXRlOF9yZWcocGh5X2lkLCB0cG1fcmVnaXN0ZXIgfCBUUE1fV1JJVEVfRElSRUNUSU9OLCB0cG1fZGF0YSwKKwkJCSAgdHBtX3NpemUpOworfQorCisvKgorICogc3QzM3pwMjRfaTJjX3JlY3YKKyAqIFJlY3YgYnl0ZSBmcm9tIHRoZSBUSVMgcmVnaXN0ZXIgYWNjb3JkaW5nIHRvIHRoZSBTVDMzWlAyNCBJMkMgcHJvdG9jb2wuCisgKiBAcGFyYW06IHBoeV9pZCwgdGhlIHBoeSBkZXNjcmlwdGlvbgorICogQHBhcmFtOiB0cG1fcmVnaXN0ZXIsIHRoZSB0cG0gdGlzIHJlZ2lzdGVyIHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSByZWFkCisgKiBAcGFyYW06IHRwbV9kYXRhLCB0aGUgVFBNIHJlc3BvbnNlCisgKiBAcGFyYW06IHRwbV9zaXplLCB0cG0gVFBNIHJlc3BvbnNlIHNpemUgdG8gcmVhZC4KKyAqIEByZXR1cm46IG51bWJlciBvZiBieXRlIHJlYWQgc3VjY2Vzc2Z1bGx5OiBzaG91bGQgYmUgb25lIGlmIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBpbnQgc3QzM3pwMjRfaTJjX3JlY3Yodm9pZCAqcGh5X2lkLCB1OCB0cG1fcmVnaXN0ZXIsIHU4ICp0cG1fZGF0YSwKKwkJCSAgICAgaW50IHRwbV9zaXplKQoreworCXJldHVybiByZWFkOF9yZWcocGh5X2lkLCB0cG1fcmVnaXN0ZXIsIHRwbV9kYXRhLCB0cG1fc2l6ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3QzM3pwMjRfcGh5X29wcyBpMmNfcGh5X29wcyA9IHsKKwkuc2VuZCA9IHN0MzN6cDI0X2kyY19zZW5kLAorCS5yZWN2ID0gc3QzM3pwMjRfaTJjX3JlY3YsCit9OworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgaW50IHN0MzN6cDI0X2kyY19vZl9yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3Qgc3QzM3pwMjRfaTJjX3BoeSAqcGh5KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHA7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHBoeS0+Y2xpZW50OworCWludCBncGlvOworCWludCByZXQ7CisKKwlwcCA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7CisJaWYgKCFwcCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk5vIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBHZXQgR1BJTyBmcm9tIGRldmljZSB0cmVlICovCisJZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKHBwLCAibHBjcGQtZ3Bpb3MiLCAwKTsKKwlpZiAoZ3BpbyA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiRmFpbGVkIHRvIHJldHJpZXZlIGxwY3BkLWdwaW9zIGZyb20gZHRzLlxuIik7CisJCXBoeS0+aW9fbHBjcGQgPSAtMTsKKwkJLyoKKwkJICogbHBjcGQgcGluIGlzIG5vdCBzcGVjaWZpZWQuIFRoaXMgaXMgbm90IGFuIGlzc3VlIGFzCisJCSAqIHBvd2VyIG1hbmFnZW1lbnQgY2FuIGJlIGFsc28gbWFuYWdlZCBieSBUUE0gc3BlY2lmaWMKKwkJICogY29tbWFuZHMuIFNvIGxlYXZlIHdpdGggYSBzdWNjZXNzIHN0YXR1cyBjb2RlLgorCQkgKi8KKwkJcmV0dXJuIDA7CisJfQorCS8qIEdQSU8gcmVxdWVzdCBhbmQgY29uZmlndXJhdGlvbiAqLworCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmY2xpZW50LT5kZXYsIGdwaW8sCisJCQlHUElPRl9PVVRfSU5JVF9ISUdILCAiVFBNIElPIExQQ1BEIik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGxwY3BkIHBpblxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlwaHktPmlvX2xwY3BkID0gZ3BpbzsKKworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgc3QzM3pwMjRfaTJjX29mX3JlcXVlc3RfcmVzb3VyY2VzKHN0cnVjdCBzdDMzenAyNF9pMmNfcGh5ICpwaHkpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzdDMzenAyNF9pMmNfcmVxdWVzdF9yZXNvdXJjZXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkJICBzdHJ1Y3Qgc3QzM3pwMjRfaTJjX3BoeSAqcGh5KQoreworCXN0cnVjdCBzdDMzenAyNF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlpbnQgcmV0OworCisJcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogc3RvcmUgZm9yIGxhdGUgdXNlICovCisJcGh5LT5pb19scGNwZCA9IHBkYXRhLT5pb19scGNwZDsKKworCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5pb19scGNwZCkpIHsKKwkJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKCZjbGllbnQtPmRldiwKKwkJCQlwZGF0YS0+aW9fbHBjcGQsIEdQSU9GX09VVF9JTklUX0hJR0gsCisJCQkJIlRQTSBJT19MUENQRCIpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGxwY3BkIHBpblxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzdDMzenAyNF9pMmNfcHJvYmUgaW5pdGlhbGl6ZSB0aGUgVFBNIGRldmljZQorICogQHBhcmFtOiBjbGllbnQsIHRoZSBpMmNfY2xpZW50IGRyZXNjcmlwdGlvbiAoVFBNIEkyQyBkZXNjcmlwdGlvbikuCisgKiBAcGFyYW06IGlkLCB0aGUgaTJjX2RldmljZV9pZCBzdHJ1Y3QuCisgKiBAcmV0dXJuOiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAqCSAtMSBpbiBvdGhlciBjYXNlLgorICovCitzdGF0aWMgaW50IHN0MzN6cDI0X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IHN0MzN6cDI0X3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBzdDMzenAyNF9pMmNfcGh5ICpwaHk7CisKKwlpZiAoIWNsaWVudCkgeworCQlwcl9pbmZvKCIlczogaTJjIGNsaWVudCBpcyBOVUxMLiBEZXZpY2Ugbm90IGFjY2Vzc2libGUuXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgeworCQlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJjbGllbnQgbm90IGkyYyBjYXBhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGh5ID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCBzdDMzenAyNF9pMmNfcGh5KSwKKwkJCSAgIEdGUF9LRVJORUwpOworCWlmICghcGh5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBoeS0+Y2xpZW50ID0gY2xpZW50OworCXBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhICYmIGNsaWVudC0+ZGV2Lm9mX25vZGUpIHsKKwkJcmV0ID0gc3QzM3pwMjRfaTJjX29mX3JlcXVlc3RfcmVzb3VyY2VzKHBoeSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAocGRhdGEpIHsKKwkJcmV0ID0gc3QzM3pwMjRfaTJjX3JlcXVlc3RfcmVzb3VyY2VzKGNsaWVudCwgcGh5KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHN0MzN6cDI0X3Byb2JlKHBoeSwgJmkyY19waHlfb3BzLCAmY2xpZW50LT5kZXYsIGNsaWVudC0+aXJxLAorCQkJICAgICAgcGh5LT5pb19scGNwZCk7Cit9CisKKy8qCisgKiBzdDMzenAyNF9pMmNfcmVtb3ZlIHJlbW92ZSB0aGUgVFBNIGRldmljZQorICogQHBhcmFtOiBjbGllbnQsIHRoZSBpMmNfY2xpZW50IGRlc2NyaXB0aW9uIChUUE0gSTJDIGRlc2NyaXB0aW9uKS4KKyAqIEByZXR1cm46IDAgaW4gY2FzZSBvZiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IHN0MzN6cDI0X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCXJldHVybiBzdDMzenAyNF9yZW1vdmUoY2hpcCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBzdDMzenAyNF9pMmNfaWRbXSA9IHsKKwl7VFBNX1NUMzNfSTJDLCAwfSwKKwl7fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBzdDMzenAyNF9pMmNfaWQpOworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9zdDMzenAyNF9pMmNfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInN0LHN0MzN6cDI0LWkyYyIsIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9zdDMzenAyNF9pMmNfbWF0Y2gpOworI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhzdDMzenAyNF9pMmNfb3BzLCBzdDMzenAyNF9wbV9zdXNwZW5kLAorCQkJIHN0MzN6cDI0X3BtX3Jlc3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBzdDMzenAyNF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkubmFtZSA9IFRQTV9TVDMzX0kyQywKKwkJLnBtID0gJnN0MzN6cDI0X2kyY19vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihvZl9zdDMzenAyNF9pMmNfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gc3QzM3pwMjRfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSBzdDMzenAyNF9pMmNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IHN0MzN6cDI0X2kyY19pZAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoc3QzM3pwMjRfaTJjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlRQTSBzdXBwb3J0IChUUE1zdXBwb3J0QGxpc3Quc3QuY29tKSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTVE0gVFBNIDEuMiBJMkMgU1QzMyBEcml2ZXIiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjMuMCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9zcGkuYyBiL2RyaXZlcnMvY2hhci90cG0vc3QzM3pwMjQvc3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxODRhMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90cG0vc3QzM3pwMjQvc3BpLmMKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBTVE1pY3JvZWxlY3Ryb25pY3MgVFBNIFNQSSBMaW51eCBkcml2ZXIgZm9yIFRQTSBTVDMzWlAyNAorICogQ29weXJpZ2h0IChDKSAyMDA5IC0gMjAxNSAgU1RNaWNyb2VsZWN0cm9uaWNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC90cG0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3N0MzN6cDI0Lmg+CisKKyNpbmNsdWRlICJzdDMzenAyNC5oIgorCisjZGVmaW5lIFRQTV9EQVRBX0ZJRk8gICAgICAgICAgIDB4MjQKKyNkZWZpbmUgVFBNX0lOVEZfQ0FQQUJJTElUWSAgICAgMHgxNAorCisjZGVmaW5lIFRQTV9EVU1NWV9CWVRFCQkweDAwCisKKyNkZWZpbmUgTUFYX1NQSV9MQVRFTkNZCQkxNQorI2RlZmluZSBMT0NBTElUWTAJCTAKKworI2RlZmluZSBTVDMzWlAyNF9PSwkJCQkJMHg1QQorI2RlZmluZSBTVDMzWlAyNF9VTkRFRklORURfRVJSCQkJCTB4ODAKKyNkZWZpbmUgU1QzM1pQMjRfQkFETE9DQUxJVFkJCQkJMHg4MQorI2RlZmluZSBTVDMzWlAyNF9USVNSRUdJU1RFUl9VS05PV04JCQkweDgyCisjZGVmaW5lIFNUMzNaUDI0X0xPQ0FMSVRZX05PVF9BQ1RJVkFURUQJCQkweDgzCisjZGVmaW5lIFNUMzNaUDI0X0hBU0hfRU5EX0JFRk9SRV9IQVNIX1NUQVJUCQkweDg0CisjZGVmaW5lIFNUMzNaUDI0X0JBRF9DT01NQU5EX09SREVSCQkJMHg4NQorI2RlZmluZSBTVDMzWlAyNF9JTkNPUkVDVF9SRUNFSVZFRF9MRU5HVEgJCTB4ODYKKyNkZWZpbmUgU1QzM1pQMjRfVFBNX0ZJRk9fT1ZFUkZMT1cJCQkweDg5CisjZGVmaW5lIFNUMzNaUDI0X1VORVhQRUNURURfUkVBRF9GSUZPCQkJMHg4QQorI2RlZmluZSBTVDMzWlAyNF9VTkVYUEVDVEVEX1dSSVRFX0ZJRk8JCQkweDhCCisjZGVmaW5lIFNUMzNaUDI0X0NNRFJEWV9TRVRfV0hFTl9QUk9DRVNTSU5HX0hBU0hfRU5ECTB4OTAKKyNkZWZpbmUgU1QzM1pQMjRfRFVNTVlfQllURVMJCQkJMHgwMAorCisvKgorICogVFBNIGNvbW1hbmQgY2FuIGJlIHVwIHRvIDIwNDggYnl0ZSwgQSBUUE0gcmVzcG9uc2UgY2FuIGJlIHVwIHRvCisgKiAxMDI0IGJ5dGUuCisgKiBCZXR3ZWVuIGNvbW1hbmQgYW5kIHJlc3BvbnNlLCB0aGVyZSBhcmUgbGF0ZW5jeSBieXRlICh1cCB0byAxNQorICogdXN1YWxseSBvbiBzdDMzenAyNCAyIGFyZSBlbm91Z2gpLgorICoKKyAqIE92ZXJhbGwgd2hlbiBzZW5kaW5nIGEgY29tbWFuZCBhbmQgZXhwZWN0aW5nIGFuIGFuc3dlciB3ZSBuZWVkIGlmCisgKiB3b3JzdCBjYXNlOgorICogMjA0OCAoZm9yIHRoZSBUUE0gY29tbWFuZCkgKyAxMDI0IChmb3IgdGhlIFRQTSBhbnN3ZXIpLiAgV2UgbmVlZAorICogc29tZSBsYXRlbmN5IGJ5dGUgYmVmb3JlIHRoZSBhbnN3ZXIgaXMgYXZhaWxhYmxlIChtYXggMTUpLgorICogV2UgaGF2ZSAyMDQ4ICsgMTAyNCArIDE1LgorICovCisjZGVmaW5lIFNUMzNaUDI0X1NQSV9CVUZGRVJfU0laRSAoVFBNX0JVRlNJWkUgKyAoVFBNX0JVRlNJWkUgLyAyKSArXAorCQkJCSAgTUFYX1NQSV9MQVRFTkNZKQorCisKK3N0cnVjdCBzdDMzenAyNF9zcGlfcGh5IHsKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldmljZTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHNwaV94ZmVyOworCXU4IHR4X2J1ZltTVDMzWlAyNF9TUElfQlVGRkVSX1NJWkVdOworCXU4IHJ4X2J1ZltTVDMzWlAyNF9TUElfQlVGRkVSX1NJWkVdOworCisJaW50IGlvX2xwY3BkOworCWludCBsYXRlbmN5OworfTsKKworc3RhdGljIGludCBzdDMzenAyNF9zdGF0dXNfdG9fZXJybm8odTggY29kZSkKK3sKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIFNUMzNaUDI0X09LOgorCQlyZXR1cm4gMDsKKwljYXNlIFNUMzNaUDI0X1VOREVGSU5FRF9FUlI6CisJY2FzZSBTVDMzWlAyNF9CQURMT0NBTElUWToKKwljYXNlIFNUMzNaUDI0X1RJU1JFR0lTVEVSX1VLTk9XTjoKKwljYXNlIFNUMzNaUDI0X0xPQ0FMSVRZX05PVF9BQ1RJVkFURUQ6CisJY2FzZSBTVDMzWlAyNF9IQVNIX0VORF9CRUZPUkVfSEFTSF9TVEFSVDoKKwljYXNlIFNUMzNaUDI0X0JBRF9DT01NQU5EX09SREVSOgorCWNhc2UgU1QzM1pQMjRfVU5FWFBFQ1RFRF9SRUFEX0ZJRk86CisJY2FzZSBTVDMzWlAyNF9VTkVYUEVDVEVEX1dSSVRFX0ZJRk86CisJY2FzZSBTVDMzWlAyNF9DTURSRFlfU0VUX1dIRU5fUFJPQ0VTU0lOR19IQVNIX0VORDoKKwkJcmV0dXJuIC1FUFJPVE87CisJY2FzZSBTVDMzWlAyNF9JTkNPUkVDVF9SRUNFSVZFRF9MRU5HVEg6CisJY2FzZSBTVDMzWlAyNF9UUE1fRklGT19PVkVSRkxPVzoKKwkJcmV0dXJuIC1FTVNHU0laRTsKKwljYXNlIFNUMzNaUDI0X0RVTU1ZX0JZVEVTOgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisJcmV0dXJuIGNvZGU7Cit9CisKKy8qCisgKiBzdDMzenAyNF9zcGlfc2VuZAorICogU2VuZCBieXRlIHRvIHRoZSBUSVMgcmVnaXN0ZXIgYWNjb3JkaW5nIHRvIHRoZSBTVDMzWlAyNCBTUEkgcHJvdG9jb2wuCisgKiBAcGFyYW06IHBoeV9pZCwgdGhlIHBoeSBkZXNjcmlwdGlvbgorICogQHBhcmFtOiB0cG1fcmVnaXN0ZXIsIHRoZSB0cG0gdGlzIHJlZ2lzdGVyIHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSB3cml0dGVuCisgKiBAcGFyYW06IHRwbV9kYXRhLCB0aGUgdHBtX2RhdGEgdG8gd3JpdGUgaW5zaWRlIHRoZSB0cG1fcmVnaXN0ZXIKKyAqIEBwYXJhbTogdHBtX3NpemUsIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEKKyAqIEByZXR1cm46IHNob3VsZCBiZSB6ZXJvIGlmIHN1Y2Nlc3MgZWxzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgc3QzM3pwMjRfc3BpX3NlbmQodm9pZCAqcGh5X2lkLCB1OCB0cG1fcmVnaXN0ZXIsIHU4ICp0cG1fZGF0YSwKKwkJCSAgICAgaW50IHRwbV9zaXplKQoreworCXU4IGRhdGEgPSAwOworCWludCB0b3RhbF9sZW5ndGggPSAwLCBuYnJfZHVtbXlfYnl0ZXMgPSAwLCByZXQgPSAwOworCXN0cnVjdCBzdDMzenAyNF9zcGlfcGh5ICpwaHkgPSBwaHlfaWQ7CisJc3RydWN0IHNwaV9kZXZpY2UgKmRldiA9IHBoeS0+c3BpX2RldmljZTsKKwl1OCAqdHhfYnVmID0gKHU4ICopcGh5LT5zcGlfeGZlci50eF9idWY7CisJdTggKnJ4X2J1ZiA9IHBoeS0+c3BpX3hmZXIucnhfYnVmOworCisJLyogUHJlLUhlYWRlciAqLworCWRhdGEgPSBUUE1fV1JJVEVfRElSRUNUSU9OIHwgTE9DQUxJVFkwOworCW1lbWNweSh0eF9idWYgKyB0b3RhbF9sZW5ndGgsICZkYXRhLCBzaXplb2YoZGF0YSkpOworCXRvdGFsX2xlbmd0aCsrOworCWRhdGEgPSB0cG1fcmVnaXN0ZXI7CisJbWVtY3B5KHR4X2J1ZiArIHRvdGFsX2xlbmd0aCwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisJdG90YWxfbGVuZ3RoKys7CisKKwlpZiAodHBtX3NpemUgPiAwICYmIHRwbV9yZWdpc3RlciA9PSBUUE1fREFUQV9GSUZPKSB7CisJCXR4X2J1Zlt0b3RhbF9sZW5ndGgrK10gPSB0cG1fc2l6ZSA+PiA4OworCQl0eF9idWZbdG90YWxfbGVuZ3RoKytdID0gdHBtX3NpemU7CisJfQorCisJbWVtY3B5KCZ0eF9idWZbdG90YWxfbGVuZ3RoXSwgdHBtX2RhdGEsIHRwbV9zaXplKTsKKwl0b3RhbF9sZW5ndGggKz0gdHBtX3NpemU7CisKKwluYnJfZHVtbXlfYnl0ZXMgPSBwaHktPmxhdGVuY3k7CisJbWVtc2V0KCZ0eF9idWZbdG90YWxfbGVuZ3RoXSwgVFBNX0RVTU1ZX0JZVEUsIG5icl9kdW1teV9ieXRlcyk7CisKKwlwaHktPnNwaV94ZmVyLmxlbiA9IHRvdGFsX2xlbmd0aCArIG5icl9kdW1teV9ieXRlczsKKworCXJldCA9IHNwaV9zeW5jX3RyYW5zZmVyKGRldiwgJnBoeS0+c3BpX3hmZXIsIDEpOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gcnhfYnVmW3RvdGFsX2xlbmd0aCArIG5icl9kdW1teV9ieXRlcyAtIDFdOworCisJcmV0dXJuIHN0MzN6cDI0X3N0YXR1c190b19lcnJubyhyZXQpOworfSAvKiBzdDMzenAyNF9zcGlfc2VuZCgpICovCisKKy8qCisgKiByZWFkOF9yZWN2CisgKiBSZWN2IGJ5dGUgZnJvbSB0aGUgVElTIHJlZ2lzdGVyIGFjY29yZGluZyB0byB0aGUgU1QzM1pQMjQgU1BJIHByb3RvY29sLgorICogQHBhcmFtOiBwaHlfaWQsIHRoZSBwaHkgZGVzY3JpcHRpb24KKyAqIEBwYXJhbTogdHBtX3JlZ2lzdGVyLCB0aGUgdHBtIHRpcyByZWdpc3RlciB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgcmVhZAorICogQHBhcmFtOiB0cG1fZGF0YSwgdGhlIFRQTSByZXNwb25zZQorICogQHBhcmFtOiB0cG1fc2l6ZSwgdHBtIFRQTSByZXNwb25zZSBzaXplIHRvIHJlYWQuCisgKiBAcmV0dXJuOiBzaG91bGQgYmUgemVybyBpZiBzdWNjZXNzIGVsc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHJlYWQ4X3JlZyh2b2lkICpwaHlfaWQsIHU4IHRwbV9yZWdpc3RlciwgdTggKnRwbV9kYXRhLCBpbnQgdHBtX3NpemUpCit7CisJdTggZGF0YSA9IDA7CisJaW50IHRvdGFsX2xlbmd0aCA9IDAsIG5icl9kdW1teV9ieXRlcywgcmV0OworCXN0cnVjdCBzdDMzenAyNF9zcGlfcGh5ICpwaHkgPSBwaHlfaWQ7CisJc3RydWN0IHNwaV9kZXZpY2UgKmRldiA9IHBoeS0+c3BpX2RldmljZTsKKwl1OCAqdHhfYnVmID0gKHU4ICopcGh5LT5zcGlfeGZlci50eF9idWY7CisJdTggKnJ4X2J1ZiA9IHBoeS0+c3BpX3hmZXIucnhfYnVmOworCisJLyogUHJlLUhlYWRlciAqLworCWRhdGEgPSBMT0NBTElUWTA7CisJbWVtY3B5KHR4X2J1ZiArIHRvdGFsX2xlbmd0aCwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisJdG90YWxfbGVuZ3RoKys7CisJZGF0YSA9IHRwbV9yZWdpc3RlcjsKKwltZW1jcHkodHhfYnVmICsgdG90YWxfbGVuZ3RoLCAmZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKwl0b3RhbF9sZW5ndGgrKzsKKworCW5icl9kdW1teV9ieXRlcyA9IHBoeS0+bGF0ZW5jeTsKKwltZW1zZXQoJnR4X2J1Zlt0b3RhbF9sZW5ndGhdLCBUUE1fRFVNTVlfQllURSwKKwkgICAgICAgbmJyX2R1bW15X2J5dGVzICsgdHBtX3NpemUpOworCisJcGh5LT5zcGlfeGZlci5sZW4gPSB0b3RhbF9sZW5ndGggKyBuYnJfZHVtbXlfYnl0ZXMgKyB0cG1fc2l6ZTsKKworCS8qIGhlYWRlciArIHN0YXR1cyBieXRlICsgc2l6ZSBvZiB0aGUgZGF0YSArIHN0YXR1cyBieXRlICovCisJcmV0ID0gc3BpX3N5bmNfdHJhbnNmZXIoZGV2LCAmcGh5LT5zcGlfeGZlciwgMSk7CisJaWYgKHRwbV9zaXplID4gMCAmJiByZXQgPT0gMCkgeworCQlyZXQgPSByeF9idWZbdG90YWxfbGVuZ3RoICsgbmJyX2R1bW15X2J5dGVzIC0gMV07CisKKwkJbWVtY3B5KHRwbV9kYXRhLCByeF9idWYgKyB0b3RhbF9sZW5ndGggKyBuYnJfZHVtbXlfYnl0ZXMsCisJCSAgICAgICB0cG1fc2l6ZSk7CisJfQorCisJcmV0dXJuIHJldDsKK30gLyogcmVhZDhfcmVnKCkgKi8KKworLyoKKyAqIHN0MzN6cDI0X3NwaV9yZWN2CisgKiBSZWN2IGJ5dGUgZnJvbSB0aGUgVElTIHJlZ2lzdGVyIGFjY29yZGluZyB0byB0aGUgU1QzM1pQMjQgU1BJIHByb3RvY29sLgorICogQHBhcmFtOiBwaHlfaWQsIHRoZSBwaHkgZGVzY3JpcHRpb24KKyAqIEBwYXJhbTogdHBtX3JlZ2lzdGVyLCB0aGUgdHBtIHRpcyByZWdpc3RlciB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgcmVhZAorICogQHBhcmFtOiB0cG1fZGF0YSwgdGhlIFRQTSByZXNwb25zZQorICogQHBhcmFtOiB0cG1fc2l6ZSwgdHBtIFRQTSByZXNwb25zZSBzaXplIHRvIHJlYWQuCisgKiBAcmV0dXJuOiBudW1iZXIgb2YgYnl0ZSByZWFkIHN1Y2Nlc3NmdWxseTogc2hvdWxkIGJlIG9uZSBpZiBzdWNjZXNzLgorICovCitzdGF0aWMgaW50IHN0MzN6cDI0X3NwaV9yZWN2KHZvaWQgKnBoeV9pZCwgdTggdHBtX3JlZ2lzdGVyLCB1OCAqdHBtX2RhdGEsCisJCQkgICAgIGludCB0cG1fc2l6ZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcmVhZDhfcmVnKHBoeV9pZCwgdHBtX3JlZ2lzdGVyLCB0cG1fZGF0YSwgdHBtX3NpemUpOworCWlmICghc3QzM3pwMjRfc3RhdHVzX3RvX2Vycm5vKHJldCkpCisJCXJldHVybiB0cG1fc2l6ZTsKKwlyZXR1cm4gcmV0OworfSAvKiBzdDMzenAyNF9zcGlfcmVjdigpICovCisKK3N0YXRpYyBpbnQgZXZhbHVhdGVfbGF0ZW5jeSh2b2lkICpwaHlfaWQpCit7CisJc3RydWN0IHN0MzN6cDI0X3NwaV9waHkgKnBoeSA9IHBoeV9pZDsKKwlpbnQgbGF0ZW5jeSA9IDEsIHN0YXR1cyA9IDA7CisJdTggZGF0YSA9IDA7CisKKwl3aGlsZSAoIXN0YXR1cyAmJiBsYXRlbmN5IDwgTUFYX1NQSV9MQVRFTkNZKSB7CisJCXBoeS0+bGF0ZW5jeSA9IGxhdGVuY3k7CisJCXN0YXR1cyA9IHJlYWQ4X3JlZyhwaHlfaWQsIFRQTV9JTlRGX0NBUEFCSUxJVFksICZkYXRhLCAxKTsKKwkJbGF0ZW5jeSsrOworCX0KKwlyZXR1cm4gbGF0ZW5jeSAtIDE7Cit9IC8qIGV2YWx1YXRlX2xhdGVuY3koKSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN0MzN6cDI0X3BoeV9vcHMgc3BpX3BoeV9vcHMgPSB7CisJLnNlbmQgPSBzdDMzenAyNF9zcGlfc2VuZCwKKwkucmVjdiA9IHN0MzN6cDI0X3NwaV9yZWN2LAorfTsKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGludCB0cG1fc3RtX3NwaV9vZl9yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3Qgc3QzM3pwMjRfc3BpX3BoeSAqcGh5KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcHA7CisJc3RydWN0IHNwaV9kZXZpY2UgKmRldiA9IHBoeS0+c3BpX2RldmljZTsKKwlpbnQgZ3BpbzsKKwlpbnQgcmV0OworCisJcHAgPSBkZXYtPmRldi5vZl9ub2RlOworCWlmICghcHApIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogR2V0IEdQSU8gZnJvbSBkZXZpY2UgdHJlZSAqLworCWdwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhwcCwgImxwY3BkLWdwaW9zIiwgMCk7CisJaWYgKGdwaW8gPCAwKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIkZhaWxlZCB0byByZXRyaWV2ZSBscGNwZC1ncGlvcyBmcm9tIGR0cy5cbiIpOworCQlwaHktPmlvX2xwY3BkID0gLTE7CisJCS8qCisJCSAqIGxwY3BkIHBpbiBpcyBub3Qgc3BlY2lmaWVkLiBUaGlzIGlzIG5vdCBhbiBpc3N1ZSBhcworCQkgKiBwb3dlciBtYW5hZ2VtZW50IGNhbiBiZSBhbHNvIG1hbmFnZWQgYnkgVFBNIHNwZWNpZmljCisJCSAqIGNvbW1hbmRzLiBTbyBsZWF2ZSB3aXRoIGEgc3VjY2VzcyBzdGF0dXMgY29kZS4KKwkJICovCisJCXJldHVybiAwOworCX0KKwkvKiBHUElPIHJlcXVlc3QgYW5kIGNvbmZpZ3VyYXRpb24gKi8KKwlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJmRldi0+ZGV2LCBncGlvLAorCQkJR1BJT0ZfT1VUX0lOSVRfSElHSCwgIlRQTSBJTyBMUENQRCIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBscGNwZCBwaW5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcGh5LT5pb19scGNwZCA9IGdwaW87CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IHRwbV9zdG1fc3BpX29mX3JlcXVlc3RfcmVzb3VyY2VzKHN0cnVjdCBzdDMzenAyNF9zcGlfcGh5ICpwaHkpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB0cG1fc3RtX3NwaV9yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3Qgc3BpX2RldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IHN0MzN6cDI0X3NwaV9waHkgKnBoeSkKK3sKKwlzdHJ1Y3Qgc3QzM3pwMjRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJaW50IHJldDsKKworCXBkYXRhID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIHN0b3JlIGZvciBsYXRlIHVzZSAqLworCXBoeS0+aW9fbHBjcGQgPSBwZGF0YS0+aW9fbHBjcGQ7CisKKwlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+aW9fbHBjcGQpKSB7CisJCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmZGV2LT5kZXYsCisJCQkJcGRhdGEtPmlvX2xwY3BkLCBHUElPRl9PVVRfSU5JVF9ISUdILAorCQkJCSJUUE0gSU9fTFBDUEQiKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmZGV2LT5kZXYsICIlcyA6IHJlc2V0IGdwaW9fcmVxdWVzdCBmYWlsZWRcbiIsCisJCQkJX19GSUxFX18pOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKgorICogdHBtX3N0MzNfc3BpX3Byb2JlIGluaXRpYWxpemUgdGhlIFRQTSBkZXZpY2UKKyAqIEBwYXJhbTogZGV2LCB0aGUgc3BpX2RldmljZSBkcmVzY3JpcHRpb24gKFRQTSBTUEkgZGVzY3JpcHRpb24pLgorICogQHJldHVybjogMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCisgKgkgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBkZXNjcmliaW5nIHRoZSBlcnJvci4KKyAqLworc3RhdGljIGludAordHBtX3N0MzNfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3QzM3pwMjRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHN0MzN6cDI0X3NwaV9waHkgKnBoeTsKKworCS8qIENoZWNrIFNQSSBwbGF0Zm9ybSBmdW5jdGlvbm5hbGl0aWVzICovCisJaWYgKCFkZXYpIHsKKwkJcHJfaW5mbygiJXM6IGRldiBpcyBOVUxMLiBEZXZpY2UgaXMgbm90IGFjY2Vzc2libGUuXG4iLAorCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwaHkgPSBkZXZtX2t6YWxsb2MoJmRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHN0MzN6cDI0X3NwaV9waHkpLAorCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaHkpCisJCXJldHVybiAtRU5PTUVNOworCisJcGh5LT5zcGlfZGV2aWNlID0gZGV2OworCXBkYXRhID0gZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhICYmIGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJcmV0ID0gdHBtX3N0bV9zcGlfb2ZfcmVxdWVzdF9yZXNvdXJjZXMocGh5KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfSBlbHNlIGlmIChwZGF0YSkgeworCQlyZXQgPSB0cG1fc3RtX3NwaV9yZXF1ZXN0X3Jlc291cmNlcyhkZXYsIHBoeSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXBoeS0+c3BpX3hmZXIudHhfYnVmID0gcGh5LT50eF9idWY7CisJcGh5LT5zcGlfeGZlci5yeF9idWYgPSBwaHktPnJ4X2J1ZjsKKworCXBoeS0+bGF0ZW5jeSA9IGV2YWx1YXRlX2xhdGVuY3kocGh5KTsKKwlpZiAocGh5LT5sYXRlbmN5IDw9IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHN0MzN6cDI0X3Byb2JlKHBoeSwgJnNwaV9waHlfb3BzLCAmZGV2LT5kZXYsIGRldi0+aXJxLAorCQkJICAgICAgcGh5LT5pb19scGNwZCk7Cit9CisKKy8qCisgKiB0cG1fc3QzM19zcGlfcmVtb3ZlIHJlbW92ZSB0aGUgVFBNIGRldmljZQorICogQHBhcmFtOiBjbGllbnQsIHRoZSBzcGlfZGV2aWNlIGRyZXNjcmlwdGlvbiAoVFBNIFNQSSBkZXNjcmlwdGlvbikuCisgKiBAcmV0dXJuOiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAqLworc3RhdGljIGludCB0cG1fc3QzM19zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gc3BpX2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3QzM3pwMjRfcmVtb3ZlKGNoaXApOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNwaV9kZXZpY2VfaWQgc3QzM3pwMjRfc3BpX2lkW10gPSB7CisJe1RQTV9TVDMzX1NQSSwgMH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgc3QzM3pwMjRfc3BpX2lkKTsKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2Zfc3QzM3pwMjRfc3BpX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzdCxzdDMzenAyNC1zcGkiLCB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2Zfc3QzM3pwMjRfc3BpX21hdGNoKTsKKyNlbmRpZgorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoc3QzM3pwMjRfc3BpX29wcywgc3QzM3pwMjRfcG1fc3VzcGVuZCwKKwkJCSBzdDMzenAyNF9wbV9yZXN1bWUpOworCitzdGF0aWMgc3RydWN0IHNwaV9kcml2ZXIgdHBtX3N0MzNfc3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm5hbWUgPSBUUE1fU1QzM19TUEksCisJCS5wbSA9ICZzdDMzenAyNF9zcGlfb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIob2Zfc3QzM3pwMjRfc3BpX21hdGNoKSwKKwl9LAorCS5wcm9iZSA9IHRwbV9zdDMzX3NwaV9wcm9iZSwKKwkucmVtb3ZlID0gdHBtX3N0MzNfc3BpX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBzdDMzenAyNF9zcGlfaWQsCit9OworCittb2R1bGVfc3BpX2RyaXZlcih0cG1fc3QzM19zcGlfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiVFBNIHN1cHBvcnQgKFRQTXN1cHBvcnRAbGlzdC5zdC5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNUTSBUUE0gMS4yIFNQSSBTVDMzIERyaXZlciIpOworTU9EVUxFX1ZFUlNJT04oIjEuMy4wIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvdHBtL3N0MzN6cDI0L3N0MzN6cDI0LmMgYi9kcml2ZXJzL2NoYXIvdHBtL3N0MzN6cDI0L3N0MzN6cDI0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2MjY3OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY2hhci90cG0vc3QzM3pwMjQvc3QzM3pwMjQuYwpAQCAtMCwwICsxLDY5OCBAQAorLyoKKyAqIFNUTWljcm9lbGVjdHJvbmljcyBUUE0gTGludXggZHJpdmVyIGZvciBUUE0gU1QzM1pQMjQKKyAqIENvcHlyaWdodCAoQykgMjAwOSAtIDIwMTUgU1RNaWNyb2VsZWN0cm9uaWNzCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiLi4vdHBtLmgiCisjaW5jbHVkZSAic3QzM3pwMjQuaCIKKworI2RlZmluZSBUUE1fQUNDRVNTCQkJMHgwCisjZGVmaW5lIFRQTV9TVFMJCQkJMHgxOAorI2RlZmluZSBUUE1fREFUQV9GSUZPCQkJMHgyNAorI2RlZmluZSBUUE1fSU5URl9DQVBBQklMSVRZCQkweDE0CisjZGVmaW5lIFRQTV9JTlRfU1RBVFVTCQkJMHgxMAorI2RlZmluZSBUUE1fSU5UX0VOQUJMRQkJCTB4MDgKKworI2RlZmluZSBMT0NBTElUWTAJCQkwCisKK2VudW0gc3QzM3pwMjRfYWNjZXNzIHsKKwlUUE1fQUNDRVNTX1ZBTElEID0gMHg4MCwKKwlUUE1fQUNDRVNTX0FDVElWRV9MT0NBTElUWSA9IDB4MjAsCisJVFBNX0FDQ0VTU19SRVFVRVNUX1BFTkRJTkcgPSAweDA0LAorCVRQTV9BQ0NFU1NfUkVRVUVTVF9VU0UgPSAweDAyLAorfTsKKworZW51bSBzdDMzenAyNF9zdGF0dXMgeworCVRQTV9TVFNfVkFMSUQgPSAweDgwLAorCVRQTV9TVFNfQ09NTUFORF9SRUFEWSA9IDB4NDAsCisJVFBNX1NUU19HTyA9IDB4MjAsCisJVFBNX1NUU19EQVRBX0FWQUlMID0gMHgxMCwKKwlUUE1fU1RTX0RBVEFfRVhQRUNUID0gMHgwOCwKK307CisKK2VudW0gc3QzM3pwMjRfaW50X2ZsYWdzIHsKKwlUUE1fR0xPQkFMX0lOVF9FTkFCTEUgPSAweDgwLAorCVRQTV9JTlRGX0NNRF9SRUFEWV9JTlQgPSAweDA4MCwKKwlUUE1fSU5URl9GSUZPX0FWQUxBSUJMRV9JTlQgPSAweDA0MCwKKwlUUE1fSU5URl9XQUtFX1VQX1JFQURZX0lOVCA9IDB4MDIwLAorCVRQTV9JTlRGX0xPQ0FMSVRZX0NIQU5HRV9JTlQgPSAweDAwNCwKKwlUUE1fSU5URl9TVFNfVkFMSURfSU5UID0gMHgwMDIsCisJVFBNX0lOVEZfREFUQV9BVkFJTF9JTlQgPSAweDAwMSwKK307CisKK2VudW0gdGlzX2RlZmF1bHRzIHsKKwlUSVNfU0hPUlRfVElNRU9VVCA9IDc1MCwKKwlUSVNfTE9OR19USU1FT1VUID0gMjAwMCwKK307CisKK3N0cnVjdCBzdDMzenAyNF9kZXYgeworCXN0cnVjdCB0cG1fY2hpcCAqY2hpcDsKKwl2b2lkICpwaHlfaWQ7CisJY29uc3Qgc3RydWN0IHN0MzN6cDI0X3BoeV9vcHMgKm9wczsKKwl1MzIgaW50cnM7CisJaW50IGlvX2xwY3BkOworfTsKKworLyoKKyAqIGNsZWFyX2ludGVycnVwdGlvbiBjbGVhciB0aGUgcGVuZGluZyBpbnRlcnJ1cHQuCisgKiBAcGFyYW06IHRwbV9kZXYsIHRoZSB0cG0gZGV2aWNlIGRldmljZS4KKyAqIEByZXR1cm46IHRoZSBpbnRlcnJ1cHQgc3RhdHVzIHZhbHVlLgorICovCitzdGF0aWMgdTggY2xlYXJfaW50ZXJydXB0aW9uKHN0cnVjdCBzdDMzenAyNF9kZXYgKnRwbV9kZXYpCit7CisJdTggaW50ZXJydXB0OworCisJdHBtX2Rldi0+b3BzLT5yZWN2KHRwbV9kZXYtPnBoeV9pZCwgVFBNX0lOVF9TVEFUVVMsICZpbnRlcnJ1cHQsIDEpOworCXRwbV9kZXYtPm9wcy0+c2VuZCh0cG1fZGV2LT5waHlfaWQsIFRQTV9JTlRfU1RBVFVTLCAmaW50ZXJydXB0LCAxKTsKKwlyZXR1cm4gaW50ZXJydXB0OworfSAvKiBjbGVhcl9pbnRlcnJ1cHRpb24oKSAqLworCisvKgorICogc3QzM3pwMjRfY2FuY2VsLCBjYW5jZWwgdGhlIGN1cnJlbnQgY29tbWFuZCBleGVjdXRpb24gb3IKKyAqIHNldCBTVFMgdG8gQ09NTUFORCBSRUFEWS4KKyAqIEBwYXJhbTogY2hpcCwgdGhlIHRwbV9jaGlwIGRlc2NyaXB0aW9uIGFzIHNwZWNpZmllZCBpbiBkcml2ZXIvY2hhci90cG0vdHBtLmgKKyAqLworc3RhdGljIHZvaWQgc3QzM3pwMjRfY2FuY2VsKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc3QzM3pwMjRfZGV2ICp0cG1fZGV2OworCXU4IGRhdGE7CisKKwl0cG1fZGV2ID0gKHN0cnVjdCBzdDMzenAyNF9kZXYgKilUUE1fVlBSSVYoY2hpcCk7CisKKwlkYXRhID0gVFBNX1NUU19DT01NQU5EX1JFQURZOworCXRwbV9kZXYtPm9wcy0+c2VuZCh0cG1fZGV2LT5waHlfaWQsIFRQTV9TVFMsICZkYXRhLCAxKTsKK30gLyogc3QzM3pwMjRfY2FuY2VsKCkgKi8KKworLyoKKyAqIHN0MzN6cDI0X3N0YXR1cyByZXR1cm4gdGhlIFRQTV9TVFMgcmVnaXN0ZXIKKyAqIEBwYXJhbTogY2hpcCwgdGhlIHRwbSBjaGlwIGRlc2NyaXB0aW9uCisgKiBAcmV0dXJuOiB0aGUgVFBNX1NUUyByZWdpc3RlciB2YWx1ZS4KKyAqLworc3RhdGljIHU4IHN0MzN6cDI0X3N0YXR1cyhzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApCit7CisJc3RydWN0IHN0MzN6cDI0X2RldiAqdHBtX2RldjsKKwl1OCBkYXRhOworCisJdHBtX2RldiA9IChzdHJ1Y3Qgc3QzM3pwMjRfZGV2ICopVFBNX1ZQUklWKGNoaXApOworCisJdHBtX2Rldi0+b3BzLT5yZWN2KHRwbV9kZXYtPnBoeV9pZCwgVFBNX1NUUywgJmRhdGEsIDEpOworCXJldHVybiBkYXRhOworfSAvKiBzdDMzenAyNF9zdGF0dXMoKSAqLworCisvKgorICogY2hlY2tfbG9jYWxpdHkgaWYgdGhlIGxvY2FsaXR5IGlzIGFjdGl2ZQorICogQHBhcmFtOiBjaGlwLCB0aGUgdHBtIGNoaXAgZGVzY3JpcHRpb24KKyAqIEByZXR1cm46IHRoZSBhY3RpdmUgbG9jYWxpdHkgb3IgLUVBQ0NFU1MuCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfbG9jYWxpdHkoc3RydWN0IHRwbV9jaGlwICpjaGlwKQoreworCXN0cnVjdCBzdDMzenAyNF9kZXYgKnRwbV9kZXY7CisJdTggZGF0YTsKKwl1OCBzdGF0dXM7CisKKwl0cG1fZGV2ID0gKHN0cnVjdCBzdDMzenAyNF9kZXYgKilUUE1fVlBSSVYoY2hpcCk7CisKKwlzdGF0dXMgPSB0cG1fZGV2LT5vcHMtPnJlY3YodHBtX2Rldi0+cGh5X2lkLCBUUE1fQUNDRVNTLCAmZGF0YSwgMSk7CisJaWYgKHN0YXR1cyAmJiAoZGF0YSAmCisJCShUUE1fQUNDRVNTX0FDVElWRV9MT0NBTElUWSB8IFRQTV9BQ0NFU1NfVkFMSUQpKSA9PQorCQkoVFBNX0FDQ0VTU19BQ1RJVkVfTE9DQUxJVFkgfCBUUE1fQUNDRVNTX1ZBTElEKSkKKwkJcmV0dXJuIGNoaXAtPnZlbmRvci5sb2NhbGl0eTsKKworCXJldHVybiAtRUFDQ0VTOworfSAvKiBjaGVja19sb2NhbGl0eSgpICovCisKKy8qCisgKiByZXF1ZXN0X2xvY2FsaXR5IHJlcXVlc3QgdGhlIFRQTSBsb2NhbGl0eQorICogQHBhcmFtOiBjaGlwLCB0aGUgY2hpcCBkZXNjcmlwdGlvbgorICogQHJldHVybjogdGhlIGFjdGl2ZSBsb2NhbGl0eSBvciBuZWdhdGl2ZSB2YWx1ZS4KKyAqLworc3RhdGljIGludCByZXF1ZXN0X2xvY2FsaXR5KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0b3A7CisJbG9uZyByZXQ7CisJc3RydWN0IHN0MzN6cDI0X2RldiAqdHBtX2RldjsKKwl1OCBkYXRhOworCisJaWYgKGNoZWNrX2xvY2FsaXR5KGNoaXApID09IGNoaXAtPnZlbmRvci5sb2NhbGl0eSkKKwkJcmV0dXJuIGNoaXAtPnZlbmRvci5sb2NhbGl0eTsKKworCXRwbV9kZXYgPSAoc3RydWN0IHN0MzN6cDI0X2RldiAqKVRQTV9WUFJJVihjaGlwKTsKKworCWRhdGEgPSBUUE1fQUNDRVNTX1JFUVVFU1RfVVNFOworCXJldCA9IHRwbV9kZXYtPm9wcy0+c2VuZCh0cG1fZGV2LT5waHlfaWQsIFRQTV9BQ0NFU1MsICZkYXRhLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXN0b3AgPSBqaWZmaWVzICsgY2hpcC0+dmVuZG9yLnRpbWVvdXRfYTsKKworCS8qIFJlcXVlc3QgbG9jYWxpdHkgaXMgdXN1YWxseSBlZmZlY3RpdmUgYWZ0ZXIgdGhlIHJlcXVlc3QgKi8KKwlkbyB7CisJCWlmIChjaGVja19sb2NhbGl0eShjaGlwKSA+PSAwKQorCQkJcmV0dXJuIGNoaXAtPnZlbmRvci5sb2NhbGl0eTsKKwkJbXNsZWVwKFRQTV9USU1FT1VUKTsKKwl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBzdG9wKSk7CisKKwkvKiBjb3VsZCBub3QgZ2V0IGxvY2FsaXR5ICovCisJcmV0dXJuIC1FQUNDRVM7Cit9IC8qIHJlcXVlc3RfbG9jYWxpdHkoKSAqLworCisvKgorICogcmVsZWFzZV9sb2NhbGl0eSByZWxlYXNlIHRoZSBhY3RpdmUgbG9jYWxpdHkKKyAqIEBwYXJhbTogY2hpcCwgdGhlIHRwbSBjaGlwIGRlc2NyaXB0aW9uLgorICovCitzdGF0aWMgdm9pZCByZWxlYXNlX2xvY2FsaXR5KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKK3sKKwlzdHJ1Y3Qgc3QzM3pwMjRfZGV2ICp0cG1fZGV2OworCXU4IGRhdGE7CisKKwl0cG1fZGV2ID0gKHN0cnVjdCBzdDMzenAyNF9kZXYgKilUUE1fVlBSSVYoY2hpcCk7CisJZGF0YSA9IFRQTV9BQ0NFU1NfQUNUSVZFX0xPQ0FMSVRZOworCisJdHBtX2Rldi0+b3BzLT5zZW5kKHRwbV9kZXYtPnBoeV9pZCwgVFBNX0FDQ0VTUywgJmRhdGEsIDEpOworfQorCisvKgorICogZ2V0X2J1cnN0Y291bnQgcmV0dXJuIHRoZSBidXJzdGNvdW50IHZhbHVlCisgKiBAcGFyYW06IGNoaXAsIHRoZSBjaGlwIGRlc2NyaXB0aW9uCisgKiByZXR1cm46IHRoZSBidXJzdGNvdW50IG9yIG5lZ2F0aXZlIHZhbHVlLgorICovCitzdGF0aWMgaW50IGdldF9idXJzdGNvdW50KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0b3A7CisJaW50IGJ1cnN0Y250LCBzdGF0dXM7CisJdTggdHBtX3JlZywgdGVtcDsKKwlzdHJ1Y3Qgc3QzM3pwMjRfZGV2ICp0cG1fZGV2OworCisJdHBtX2RldiA9IChzdHJ1Y3Qgc3QzM3pwMjRfZGV2ICopVFBNX1ZQUklWKGNoaXApOworCisJc3RvcCA9IGppZmZpZXMgKyBjaGlwLT52ZW5kb3IudGltZW91dF9kOworCWRvIHsKKwkJdHBtX3JlZyA9IFRQTV9TVFMgKyAxOworCQlzdGF0dXMgPSB0cG1fZGV2LT5vcHMtPnJlY3YodHBtX2Rldi0+cGh5X2lkLCB0cG1fcmVnLCAmdGVtcCwgMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKworCQl0cG1fcmVnID0gVFBNX1NUUyArIDI7CisJCWJ1cnN0Y250ID0gdGVtcDsKKwkJc3RhdHVzID0gdHBtX2Rldi0+b3BzLT5yZWN2KHRwbV9kZXYtPnBoeV9pZCwgdHBtX3JlZywgJnRlbXAsIDEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJYnVyc3RjbnQgfD0gdGVtcCA8PCA4OworCQlpZiAoYnVyc3RjbnQpCisJCQlyZXR1cm4gYnVyc3RjbnQ7CisJCW1zbGVlcChUUE1fVElNRU9VVCk7CisJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgc3RvcCkpOworCXJldHVybiAtRUJVU1k7Cit9IC8qIGdldF9idXJzdGNvdW50KCkgKi8KKworCisvKgorICogd2FpdF9mb3JfdHBtX3N0YXRfY29uZAorICogQHBhcmFtOiBjaGlwLCBjaGlwIGRlc2NyaXB0aW9uCisgKiBAcGFyYW06IG1hc2ssIGV4cGVjdGVkIG1hc2sgdmFsdWUKKyAqIEBwYXJhbTogY2hlY2tfY2FuY2VsLCBkb2VzIHRoZSBjb21tYW5kIGV4cGVjdGVkIHRvIGJlIGNhbmNlbGVkID8KKyAqIEBwYXJhbTogY2FuY2VsZWQsIGRpZCB3ZSByZWNlaXZlZCBhIGNhbmNlbCByZXF1ZXN0ID8KKyAqIEByZXR1cm46IHRydWUgaWYgc3RhdHVzID09IG1hc2sgb3IgaWYgdGhlIGNvbW1hbmQgaXMgY2FuY2VsZWQuCisgKiBmYWxzZSBpbiBvdGhlciBjYXNlcy4KKyAqLworc3RhdGljIGJvb2wgd2FpdF9mb3JfdHBtX3N0YXRfY29uZChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHU4IG1hc2ssCisJCQkJYm9vbCBjaGVja19jYW5jZWwsIGJvb2wgKmNhbmNlbGVkKQoreworCXU4IHN0YXR1cyA9IGNoaXAtPm9wcy0+c3RhdHVzKGNoaXApOworCisJKmNhbmNlbGVkID0gZmFsc2U7CisJaWYgKChzdGF0dXMgJiBtYXNrKSA9PSBtYXNrKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoY2hlY2tfY2FuY2VsICYmIGNoaXAtPm9wcy0+cmVxX2NhbmNlbGVkKGNoaXAsIHN0YXR1cykpIHsKKwkJKmNhbmNlbGVkID0gdHJ1ZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIHdhaXRfZm9yX3N0YXQgd2FpdCBmb3IgYSBUUE1fU1RTIHZhbHVlCisgKiBAcGFyYW06IGNoaXAsIHRoZSB0cG0gY2hpcCBkZXNjcmlwdGlvbgorICogQHBhcmFtOiBtYXNrLCB0aGUgdmFsdWUgbWFzayB0byB3YWl0CisgKiBAcGFyYW06IHRpbWVvdXQsIHRoZSB0aW1lb3V0CisgKiBAcGFyYW06IHF1ZXVlLCB0aGUgd2FpdCBxdWV1ZS4KKyAqIEBwYXJhbTogY2hlY2tfY2FuY2VsLCBkb2VzIHRoZSBjb21tYW5kIGNhbiBiZSBjYW5jZWxsZWQgPworICogQHJldHVybjogdGhlIHRwbSBzdGF0dXMsIDAgaWYgc3VjY2VzcywgLUVUSU1FIGlmIHRpbWVvdXQgaXMgcmVhY2hlZC4KKyAqLworc3RhdGljIGludCB3YWl0X2Zvcl9zdGF0KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggbWFzaywgdW5zaWduZWQgbG9uZyB0aW1lb3V0LAorCQkJd2FpdF9xdWV1ZV9oZWFkX3QgKnF1ZXVlLCBib29sIGNoZWNrX2NhbmNlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0b3A7CisJaW50IHJldCA9IDA7CisJYm9vbCBjYW5jZWxlZCA9IGZhbHNlOworCWJvb2wgY29uZGl0aW9uOworCXUzMiBjdXJfaW50cnM7CisJdTggc3RhdHVzOworCXN0cnVjdCBzdDMzenAyNF9kZXYgKnRwbV9kZXY7CisKKwl0cG1fZGV2ID0gKHN0cnVjdCBzdDMzenAyNF9kZXYgKilUUE1fVlBSSVYoY2hpcCk7CisKKwkvKiBjaGVjayBjdXJyZW50IHN0YXR1cyAqLworCXN0YXR1cyA9IHN0MzN6cDI0X3N0YXR1cyhjaGlwKTsKKwlpZiAoKHN0YXR1cyAmIG1hc2spID09IG1hc2spCisJCXJldHVybiAwOworCisJc3RvcCA9IGppZmZpZXMgKyB0aW1lb3V0OworCisJaWYgKGNoaXAtPnZlbmRvci5pcnEpIHsKKwkJY3VyX2ludHJzID0gdHBtX2Rldi0+aW50cnM7CisJCWNsZWFyX2ludGVycnVwdGlvbih0cG1fZGV2KTsKKwkJZW5hYmxlX2lycShjaGlwLT52ZW5kb3IuaXJxKTsKKworCQlkbyB7CisJCQlpZiAocmV0ID09IC1FUkVTVEFSVFNZUyAmJiBmcmVlemluZyhjdXJyZW50KSkKKwkJCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfU0lHUEVORElORyk7CisKKwkJCXRpbWVvdXQgPSBzdG9wIC0gamlmZmllczsKKwkJCWlmICgobG9uZykgdGltZW91dCA8PSAwKQorCQkJCXJldHVybiAtMTsKKworCQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoKnF1ZXVlLAorCQkJCQkJY3VyX2ludHJzICE9IHRwbV9kZXYtPmludHJzLAorCQkJCQkJdGltZW91dCk7CisJCQljbGVhcl9pbnRlcnJ1cHRpb24odHBtX2Rldik7CisJCQljb25kaXRpb24gPSB3YWl0X2Zvcl90cG1fc3RhdF9jb25kKGNoaXAsIG1hc2ssCisJCQkJCQljaGVja19jYW5jZWwsICZjYW5jZWxlZCk7CisJCQlpZiAocmV0ID49IDAgJiYgY29uZGl0aW9uKSB7CisJCQkJaWYgKGNhbmNlbGVkKQorCQkJCQlyZXR1cm4gLUVDQU5DRUxFRDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfSB3aGlsZSAocmV0ID09IC1FUkVTVEFSVFNZUyAmJiBmcmVlemluZyhjdXJyZW50KSk7CisKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKGNoaXAtPnZlbmRvci5pcnEpOworCisJfSBlbHNlIHsKKwkJZG8geworCQkJbXNsZWVwKFRQTV9USU1FT1VUKTsKKwkJCXN0YXR1cyA9IGNoaXAtPm9wcy0+c3RhdHVzKGNoaXApOworCQkJaWYgKChzdGF0dXMgJiBtYXNrKSA9PSBtYXNrKQorCQkJCXJldHVybiAwOworCQl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBzdG9wKSk7CisJfQorCisJcmV0dXJuIC1FVElNRTsKK30gLyogd2FpdF9mb3Jfc3RhdCgpICovCisKKy8qCisgKiByZWN2X2RhdGEgcmVjZWl2ZSBkYXRhCisgKiBAcGFyYW06IGNoaXAsIHRoZSB0cG0gY2hpcCBkZXNjcmlwdGlvbgorICogQHBhcmFtOiBidWYsIHRoZSBidWZmZXIgd2hlcmUgdGhlIGRhdGEgYXJlIHJlY2VpdmVkCisgKiBAcGFyYW06IGNvdW50LCB0aGUgbnVtYmVyIG9mIGRhdGEgdG8gcmVjZWl2ZQorICogQHJldHVybjogdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gVFBNIEZJRk8uCisgKi8KK3N0YXRpYyBpbnQgcmVjdl9kYXRhKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBzaXplID0gMCwgYnVyc3RjbnQsIGxlbiwgcmV0OworCXN0cnVjdCBzdDMzenAyNF9kZXYgKnRwbV9kZXY7CisKKwl0cG1fZGV2ID0gKHN0cnVjdCBzdDMzenAyNF9kZXYgKilUUE1fVlBSSVYoY2hpcCk7CisKKwl3aGlsZSAoc2l6ZSA8IGNvdW50ICYmCisJICAgICAgIHdhaXRfZm9yX3N0YXQoY2hpcCwKKwkJCSAgICAgVFBNX1NUU19EQVRBX0FWQUlMIHwgVFBNX1NUU19WQUxJRCwKKwkJCSAgICAgY2hpcC0+dmVuZG9yLnRpbWVvdXRfYywKKwkJCSAgICAgJmNoaXAtPnZlbmRvci5yZWFkX3F1ZXVlLCB0cnVlKSA9PSAwKSB7CisJCWJ1cnN0Y250ID0gZ2V0X2J1cnN0Y291bnQoY2hpcCk7CisJCWlmIChidXJzdGNudCA8IDApCisJCQlyZXR1cm4gYnVyc3RjbnQ7CisJCWxlbiA9IG1pbl90KGludCwgYnVyc3RjbnQsIGNvdW50IC0gc2l6ZSk7CisJCXJldCA9IHRwbV9kZXYtPm9wcy0+cmVjdih0cG1fZGV2LT5waHlfaWQsIFRQTV9EQVRBX0ZJRk8sCisJCQkJCSBidWYgKyBzaXplLCBsZW4pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJc2l6ZSArPSBsZW47CisJfQorCXJldHVybiBzaXplOworfQorCisvKgorICogdHBtX2lvc2VyaXJxX2hhbmRsZXIgdGhlIHNlcmlycSBpcnEgaGFuZGxlcgorICogQHBhcmFtOiBpcnEsIHRoZSB0cG0gY2hpcCBkZXNjcmlwdGlvbgorICogQHBhcmFtOiBkZXZfaWQsIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hpcAorICogQHJldHVybjogdGhlIHN0YXR1cyBvZiB0aGUgaGFuZGxlci4KKyAqLworc3RhdGljIGlycXJldHVybl90IHRwbV9pb3NlcmlycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBkZXZfaWQ7CisJc3RydWN0IHN0MzN6cDI0X2RldiAqdHBtX2RldjsKKworCXRwbV9kZXYgPSAoc3RydWN0IHN0MzN6cDI0X2RldiAqKVRQTV9WUFJJVihjaGlwKTsKKworCXRwbV9kZXYtPmludHJzKys7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjaGlwLT52ZW5kb3IucmVhZF9xdWV1ZSk7CisJZGlzYWJsZV9pcnFfbm9zeW5jKGNoaXAtPnZlbmRvci5pcnEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfSAvKiB0cG1faW9zZXJpcnFfaGFuZGxlcigpICovCisKKy8qCisgKiBzdDMzenAyNF9zZW5kIHNlbmQgVFBNIGNvbW1hbmRzIHRocm91Z2ggdGhlIEkyQyBidXMuCisgKgorICogQHBhcmFtOiBjaGlwLCB0aGUgdHBtX2NoaXAgZGVzY3JpcHRpb24gYXMgc3BlY2lmaWVkIGluIGRyaXZlci9jaGFyL3RwbS90cG0uaAorICogQHBhcmFtOiBidWYsCXRoZSBidWZmZXIgdG8gc2VuZC4KKyAqIEBwYXJhbTogY291bnQsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZC4KKyAqIEByZXR1cm46IEluIGNhc2Ugb2Ygc3VjY2VzcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQuCisgKgkJCUluIG90aGVyIGNhc2UsIGEgPCAwIHZhbHVlIGRlc2NyaWJpbmcgdGhlIGlzc3VlLgorICovCitzdGF0aWMgaW50IHN0MzN6cDI0X3NlbmQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCB1bnNpZ25lZCBjaGFyICpidWYsCisJCQkgc2l6ZV90IGxlbikKK3sKKwl1MzIgc3RhdHVzLCBpLCBzaXplLCBvcmRpbmFsOworCWludCBidXJzdGNudCA9IDA7CisJaW50IHJldDsKKwl1OCBkYXRhOworCXN0cnVjdCBzdDMzenAyNF9kZXYgKnRwbV9kZXY7CisKKwlpZiAoIWNoaXApCisJCXJldHVybiAtRUJVU1k7CisJaWYgKGxlbiA8IFRQTV9IRUFERVJfU0laRSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXRwbV9kZXYgPSAoc3RydWN0IHN0MzN6cDI0X2RldiAqKVRQTV9WUFJJVihjaGlwKTsKKworCXJldCA9IHJlcXVlc3RfbG9jYWxpdHkoY2hpcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzdGF0dXMgPSBzdDMzenAyNF9zdGF0dXMoY2hpcCk7CisJaWYgKChzdGF0dXMgJiBUUE1fU1RTX0NPTU1BTkRfUkVBRFkpID09IDApIHsKKwkJc3QzM3pwMjRfY2FuY2VsKGNoaXApOworCQlpZiAod2FpdF9mb3Jfc3RhdAorCQkgICAgKGNoaXAsIFRQTV9TVFNfQ09NTUFORF9SRUFEWSwgY2hpcC0+dmVuZG9yLnRpbWVvdXRfYiwKKwkJICAgICAmY2hpcC0+dmVuZG9yLnJlYWRfcXVldWUsIGZhbHNlKSA8IDApIHsKKwkJCXJldCA9IC1FVElNRTsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOykgeworCQlidXJzdGNudCA9IGdldF9idXJzdGNvdW50KGNoaXApOworCQlpZiAoYnVyc3RjbnQgPCAwKQorCQkJcmV0dXJuIGJ1cnN0Y250OworCQlzaXplID0gbWluX3QoaW50LCBsZW4gLSBpIC0gMSwgYnVyc3RjbnQpOworCQlyZXQgPSB0cG1fZGV2LT5vcHMtPnNlbmQodHBtX2Rldi0+cGh5X2lkLCBUUE1fREFUQV9GSUZPLAorCQkJCQkgYnVmICsgaSwgc2l6ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXRfZXJyOworCisJCWkgKz0gc2l6ZTsKKwl9CisKKwlzdGF0dXMgPSBzdDMzenAyNF9zdGF0dXMoY2hpcCk7CisJaWYgKChzdGF0dXMgJiBUUE1fU1RTX0RBVEFfRVhQRUNUKSA9PSAwKSB7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyZXQgPSB0cG1fZGV2LT5vcHMtPnNlbmQodHBtX2Rldi0+cGh5X2lkLCBUUE1fREFUQV9GSUZPLAorCQkJCSBidWYgKyBsZW4gLSAxLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJc3RhdHVzID0gc3QzM3pwMjRfc3RhdHVzKGNoaXApOworCWlmICgoc3RhdHVzICYgVFBNX1NUU19EQVRBX0VYUEVDVCkgIT0gMCkgeworCQlyZXQgPSAtRUlPOworCQlnb3RvIG91dF9lcnI7CisJfQorCisJZGF0YSA9IFRQTV9TVFNfR087CisJcmV0ID0gdHBtX2Rldi0+b3BzLT5zZW5kKHRwbV9kZXYtPnBoeV9pZCwgVFBNX1NUUywgJmRhdGEsIDEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9lcnI7CisKKwlpZiAoY2hpcC0+dmVuZG9yLmlycSkgeworCQlvcmRpbmFsID0gYmUzMl90b19jcHUoKigoX19iZTMyICopIChidWYgKyA2KSkpOworCisJCXJldCA9IHdhaXRfZm9yX3N0YXQoY2hpcCwgVFBNX1NUU19EQVRBX0FWQUlMIHwgVFBNX1NUU19WQUxJRCwKKwkJCQl0cG1fY2FsY19vcmRpbmFsX2R1cmF0aW9uKGNoaXAsIG9yZGluYWwpLAorCQkJCSZjaGlwLT52ZW5kb3IucmVhZF9xdWV1ZSwgZmFsc2UpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlyZXR1cm4gbGVuOworb3V0X2VycjoKKwlzdDMzenAyNF9jYW5jZWwoY2hpcCk7CisJcmVsZWFzZV9sb2NhbGl0eShjaGlwKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogc3QzM3pwMjRfcmVjdiByZWNlaXZlZCBUUE0gcmVzcG9uc2UgdGhyb3VnaCBUUE0gcGh5LgorICogQHBhcmFtOiBjaGlwLCB0aGUgdHBtX2NoaXAgZGVzY3JpcHRpb24gYXMgc3BlY2lmaWVkIGluIGRyaXZlci9jaGFyL3RwbS90cG0uaC4KKyAqIEBwYXJhbTogYnVmLAl0aGUgYnVmZmVyIHRvIHN0b3JlIGRhdGFzLgorICogQHBhcmFtOiBjb3VudCwgdGhlIG51bWJlciBvZiBieXRlcyB0byBzZW5kLgorICogQHJldHVybjogSW4gY2FzZSBvZiBzdWNjZXNzIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQuCisgKgkgICAgSW4gb3RoZXIgY2FzZSwgYSA8IDAgdmFsdWUgZGVzY3JpYmluZyB0aGUgaXNzdWUuCisgKi8KK3N0YXRpYyBpbnQgc3QzM3pwMjRfcmVjdihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQpCit7CisJaW50IHNpemUgPSAwOworCWludCBleHBlY3RlZDsKKworCWlmICghY2hpcCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChjb3VudCA8IFRQTV9IRUFERVJfU0laRSkgeworCQlzaXplID0gLUVJTzsKKwkJZ290byBvdXQ7CisJfQorCisJc2l6ZSA9IHJlY3ZfZGF0YShjaGlwLCBidWYsIFRQTV9IRUFERVJfU0laRSk7CisJaWYgKHNpemUgPCBUUE1fSEVBREVSX1NJWkUpIHsKKwkJZGV2X2VycigmY2hpcC0+ZGV2LCAiVW5hYmxlIHRvIHJlYWQgaGVhZGVyXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZXhwZWN0ZWQgPSBiZTMyX3RvX2NwdSgqKF9fYmUzMiAqKShidWYgKyAyKSk7CisJaWYgKGV4cGVjdGVkID4gY291bnQpIHsKKwkJc2l6ZSA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCXNpemUgKz0gcmVjdl9kYXRhKGNoaXAsICZidWZbVFBNX0hFQURFUl9TSVpFXSwKKwkJCWV4cGVjdGVkIC0gVFBNX0hFQURFUl9TSVpFKTsKKwlpZiAoc2l6ZSA8IGV4cGVjdGVkKSB7CisJCWRldl9lcnIoJmNoaXAtPmRldiwgIlVuYWJsZSB0byByZWFkIHJlbWFpbmRlciBvZiByZXN1bHRcbiIpOworCQlzaXplID0gLUVUSU1FOworCX0KKworb3V0OgorCXN0MzN6cDI0X2NhbmNlbChjaGlwKTsKKwlyZWxlYXNlX2xvY2FsaXR5KGNoaXApOworCXJldHVybiBzaXplOworfQorCisvKgorICogc3QzM3pwMjRfcmVxX2NhbmNlbGVkCisgKiBAcGFyYW06IGNoaXAsIHRoZSB0cG1fY2hpcCBkZXNjcmlwdGlvbiBhcyBzcGVjaWZpZWQgaW4gZHJpdmVyL2NoYXIvdHBtL3RwbS5oLgorICogQHBhcmFtOiBzdGF0dXMsIHRoZSBUUE0gc3RhdHVzLgorICogQHJldHVybjogRG9lcyBUUE0gcmVhZHkgdG8gY29tcHV0ZSBhIG5ldyBjb21tYW5kID8gdHJ1ZS4KKyAqLworc3RhdGljIGJvb2wgc3QzM3pwMjRfcmVxX2NhbmNlbGVkKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggc3RhdHVzKQoreworCXJldHVybiAoc3RhdHVzID09IFRQTV9TVFNfQ09NTUFORF9SRUFEWSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdHBtX2NsYXNzX29wcyBzdDMzenAyNF90cG0gPSB7CisJLnNlbmQgPSBzdDMzenAyNF9zZW5kLAorCS5yZWN2ID0gc3QzM3pwMjRfcmVjdiwKKwkuY2FuY2VsID0gc3QzM3pwMjRfY2FuY2VsLAorCS5zdGF0dXMgPSBzdDMzenAyNF9zdGF0dXMsCisJLnJlcV9jb21wbGV0ZV9tYXNrID0gVFBNX1NUU19EQVRBX0FWQUlMIHwgVFBNX1NUU19WQUxJRCwKKwkucmVxX2NvbXBsZXRlX3ZhbCA9IFRQTV9TVFNfREFUQV9BVkFJTCB8IFRQTV9TVFNfVkFMSUQsCisJLnJlcV9jYW5jZWxlZCA9IHN0MzN6cDI0X3JlcV9jYW5jZWxlZCwKK307CisKKy8qCisgKiBzdDMzenAyNF9wcm9iZSBpbml0aWFsaXplIHRoZSBUUE0gZGV2aWNlCisgKiBAcGFyYW06IGNsaWVudCwgdGhlIGkyY19jbGllbnQgZHJlc2NyaXB0aW9uIChUUE0gSTJDIGRlc2NyaXB0aW9uKS4KKyAqIEBwYXJhbTogaWQsIHRoZSBpMmNfZGV2aWNlX2lkIHN0cnVjdC4KKyAqIEByZXR1cm46IDAgaW4gY2FzZSBvZiBzdWNjZXNzLgorICoJIC0xIGluIG90aGVyIGNhc2UuCisgKi8KK2ludCBzdDMzenAyNF9wcm9iZSh2b2lkICpwaHlfaWQsIGNvbnN0IHN0cnVjdCBzdDMzenAyNF9waHlfb3BzICpvcHMsCisJCSAgIHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlycSwgaW50IGlvX2xwY3BkKQoreworCWludCByZXQ7CisJdTggaW50bWFzayA9IDA7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwOworCXN0cnVjdCBzdDMzenAyNF9kZXYgKnRwbV9kZXY7CisKKwljaGlwID0gdHBtbV9jaGlwX2FsbG9jKGRldiwgJnN0MzN6cDI0X3RwbSk7CisJaWYgKElTX0VSUihjaGlwKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2hpcCk7CisKKwl0cG1fZGV2ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBzdDMzenAyNF9kZXYpLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghdHBtX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlUUE1fVlBSSVYoY2hpcCkgPSB0cG1fZGV2OworCXRwbV9kZXYtPnBoeV9pZCA9IHBoeV9pZDsKKwl0cG1fZGV2LT5vcHMgPSBvcHM7CisKKwljaGlwLT52ZW5kb3IudGltZW91dF9hID0gbXNlY3NfdG9famlmZmllcyhUSVNfU0hPUlRfVElNRU9VVCk7CisJY2hpcC0+dmVuZG9yLnRpbWVvdXRfYiA9IG1zZWNzX3RvX2ppZmZpZXMoVElTX0xPTkdfVElNRU9VVCk7CisJY2hpcC0+dmVuZG9yLnRpbWVvdXRfYyA9IG1zZWNzX3RvX2ppZmZpZXMoVElTX1NIT1JUX1RJTUVPVVQpOworCWNoaXAtPnZlbmRvci50aW1lb3V0X2QgPSBtc2Vjc190b19qaWZmaWVzKFRJU19TSE9SVF9USU1FT1VUKTsKKworCWNoaXAtPnZlbmRvci5sb2NhbGl0eSA9IExPQ0FMSVRZMDsKKworCWlmIChpcnEpIHsKKwkJLyogSU5URVJSVVBUIFNldHVwICovCisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoaXAtPnZlbmRvci5yZWFkX3F1ZXVlKTsKKwkJdHBtX2Rldi0+aW50cnMgPSAwOworCisJCWlmIChyZXF1ZXN0X2xvY2FsaXR5KGNoaXApICE9IExPQ0FMSVRZMCkgeworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gX3RwbV9jbGVhbl9hbnN3ZXI7CisJCX0KKworCQljbGVhcl9pbnRlcnJ1cHRpb24odHBtX2Rldik7CisJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsIHRwbV9pb3NlcmlycV9oYW5kbGVyLAorCQkJCUlSUUZfVFJJR0dFUl9ISUdILCAiVFBNIFNFUklSUSBtYW5hZ2VtZW50IiwKKwkJCQljaGlwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNoaXAtPmRldiwgIlRQTSBTRVJJUlEgc2lnbmFscyAlZCBub3QgYXZhaWxhYmxlXG4iLAorCQkJCWlycSk7CisJCQlnb3RvIF90cG1fY2xlYW5fYW5zd2VyOworCQl9CisKKwkJaW50bWFzayB8PSBUUE1fSU5URl9DTURfUkVBRFlfSU5UCisJCQl8ICBUUE1fSU5URl9TVFNfVkFMSURfSU5UCisJCQl8ICBUUE1fSU5URl9EQVRBX0FWQUlMX0lOVDsKKworCQlyZXQgPSB0cG1fZGV2LT5vcHMtPnNlbmQodHBtX2Rldi0+cGh5X2lkLCBUUE1fSU5UX0VOQUJMRSwKKwkJCQkJICZpbnRtYXNrLCAxKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIF90cG1fY2xlYW5fYW5zd2VyOworCisJCWludG1hc2sgPSBUUE1fR0xPQkFMX0lOVF9FTkFCTEU7CisJCXJldCA9IHRwbV9kZXYtPm9wcy0+c2VuZCh0cG1fZGV2LT5waHlfaWQsIChUUE1fSU5UX0VOQUJMRSArIDMpLAorCQkJCQkgJmludG1hc2ssIDEpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gX3RwbV9jbGVhbl9hbnN3ZXI7CisKKwkJY2hpcC0+dmVuZG9yLmlycSA9IGlycTsKKworCQlkaXNhYmxlX2lycV9ub3N5bmMoY2hpcC0+dmVuZG9yLmlycSk7CisKKwkJdHBtX2dlbl9pbnRlcnJ1cHQoY2hpcCk7CisJfQorCisJdHBtX2dldF90aW1lb3V0cyhjaGlwKTsKKwl0cG1fZG9fc2VsZnRlc3QoY2hpcCk7CisKKwlyZXR1cm4gdHBtX2NoaXBfcmVnaXN0ZXIoY2hpcCk7CitfdHBtX2NsZWFuX2Fuc3dlcjoKKwlkZXZfaW5mbygmY2hpcC0+ZGV2LCAiVFBNIGluaXRpYWxpemF0aW9uIGZhaWxcbiIpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHN0MzN6cDI0X3Byb2JlKTsKKworLyoKKyAqIHN0MzN6cDI0X3JlbW92ZSByZW1vdmUgdGhlIFRQTSBkZXZpY2UKKyAqIEBwYXJhbTogdHBtX2RhdGEsIHRoZSB0cG0gcGh5LgorICogQHJldHVybjogMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCisgKi8KK2ludCBzdDMzenAyNF9yZW1vdmUoc3RydWN0IHRwbV9jaGlwICpjaGlwKQoreworCXRwbV9jaGlwX3VucmVnaXN0ZXIoY2hpcCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHN0MzN6cDI0X3JlbW92ZSk7CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKy8qCisgKiBzdDMzenAyNF9wbV9zdXNwZW5kIHN1c3BlbmQgdGhlIFRQTSBkZXZpY2UKKyAqIEBwYXJhbTogdHBtX2RhdGEsIHRoZSB0cG0gcGh5LgorICogQHBhcmFtOiBtZXNnLCB0aGUgcG93ZXIgbWFuYWdlbWVudCBtZXNzYWdlLgorICogQHJldHVybjogMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCisgKi8KK2ludCBzdDMzenAyNF9wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc3QzM3pwMjRfZGV2ICp0cG1fZGV2OworCWludCByZXQgPSAwOworCisJdHBtX2RldiA9IChzdHJ1Y3Qgc3QzM3pwMjRfZGV2ICopVFBNX1ZQUklWKGNoaXApOworCisJaWYgKGdwaW9faXNfdmFsaWQodHBtX2Rldi0+aW9fbHBjcGQpKQorCQlncGlvX3NldF92YWx1ZSh0cG1fZGV2LT5pb19scGNwZCwgMCk7CisJZWxzZQorCQlyZXQgPSB0cG1fcG1fc3VzcGVuZChkZXYpOworCisJcmV0dXJuIHJldDsKK30gLyogc3QzM3pwMjRfcG1fc3VzcGVuZCgpICovCitFWFBPUlRfU1lNQk9MKHN0MzN6cDI0X3BtX3N1c3BlbmQpOworCisvKgorICogc3QzM3pwMjRfcG1fcmVzdW1lIHJlc3VtZSB0aGUgVFBNIGRldmljZQorICogQHBhcmFtOiB0cG1fZGF0YSwgdGhlIHRwbSBwaHkuCisgKiBAcmV0dXJuOiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAqLworaW50IHN0MzN6cDI0X3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRwbV9jaGlwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHN0MzN6cDI0X2RldiAqdHBtX2RldjsKKwlpbnQgcmV0ID0gMDsKKworCXRwbV9kZXYgPSAoc3RydWN0IHN0MzN6cDI0X2RldiAqKVRQTV9WUFJJVihjaGlwKTsKKworCWlmIChncGlvX2lzX3ZhbGlkKHRwbV9kZXYtPmlvX2xwY3BkKSkgeworCQlncGlvX3NldF92YWx1ZSh0cG1fZGV2LT5pb19scGNwZCwgMSk7CisJCXJldCA9IHdhaXRfZm9yX3N0YXQoY2hpcCwKKwkJCQlUUE1fU1RTX1ZBTElELCBjaGlwLT52ZW5kb3IudGltZW91dF9iLAorCQkJCSZjaGlwLT52ZW5kb3IucmVhZF9xdWV1ZSwgZmFsc2UpOworCX0gZWxzZSB7CisJCXJldCA9IHRwbV9wbV9yZXN1bWUoZGV2KTsKKwkJaWYgKCFyZXQpCisJCQl0cG1fZG9fc2VsZnRlc3QoY2hpcCk7CisJfQorCXJldHVybiByZXQ7Cit9IC8qIHN0MzN6cDI0X3BtX3Jlc3VtZSgpICovCitFWFBPUlRfU1lNQk9MKHN0MzN6cDI0X3BtX3Jlc3VtZSk7CisjZW5kaWYKKworTU9EVUxFX0FVVEhPUigiVFBNIHN1cHBvcnQgKFRQTXN1cHBvcnRAbGlzdC5zdC5jb20pIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNUMzNaUDI0IFRQTSAxLjIgZHJpdmVyIik7CitNT0RVTEVfVkVSU0lPTigiMS4zLjAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vc3QzM3pwMjQvc3QzM3pwMjQuaCBiL2RyaXZlcnMvY2hhci90cG0vc3QzM3pwMjQvc3QzM3pwMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA3Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3RwbS9zdDMzenAyNC9zdDMzenAyNC5oCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBTVE1pY3JvZWxlY3Ryb25pY3MgVFBNIExpbnV4IGRyaXZlciBmb3IgVFBNIFNUMzNaUDI0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDE1ICBTVE1pY3JvZWxlY3Ryb25pY3MKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19MT0NBTF9TVDMzWlAyNF9IX18KKyNkZWZpbmUgX19MT0NBTF9TVDMzWlAyNF9IX18KKworI2RlZmluZSBUUE1fV1JJVEVfRElSRUNUSU9OICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgVFBNX0JVRlNJWkUgICAgICAgICAgICAgICAgICAgICAyMDQ4CisKK3N0cnVjdCBzdDMzenAyNF9waHlfb3BzIHsKKwlpbnQgKCpzZW5kKSh2b2lkICpwaHlfaWQsIHU4IHRwbV9yZWdpc3RlciwgdTggKnRwbV9kYXRhLCBpbnQgdHBtX3NpemUpOworCWludCAoKnJlY3YpKHZvaWQgKnBoeV9pZCwgdTggdHBtX3JlZ2lzdGVyLCB1OCAqdHBtX2RhdGEsIGludCB0cG1fc2l6ZSk7Cit9OworCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitpbnQgc3QzM3pwMjRfcG1fc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IHN0MzN6cDI0X3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworI2VuZGlmCisKK2ludCBzdDMzenAyNF9wcm9iZSh2b2lkICpwaHlfaWQsIGNvbnN0IHN0cnVjdCBzdDMzenAyNF9waHlfb3BzICpvcHMsCisJCSAgIHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlycSwgaW50IGlvX2xwY3BkKTsKK2ludCBzdDMzenAyNF9yZW1vdmUoc3RydWN0IHRwbV9jaGlwICpjaGlwKTsKKyNlbmRpZiAvKiBfX0xPQ0FMX1NUMzNaUDI0X0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG0tY2hpcC5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG0tY2hpcC5jCmluZGV4IGUwOTZlOWMuLjI4M2YwMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci90cG0vdHBtLWNoaXAuYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbS1jaGlwLmMKQEAgLTE3MCw2ICsxNzAsNDEgQEAKIAlkZXZpY2VfdW5yZWdpc3RlcigmY2hpcC0+ZGV2KTsKIH0KIAorc3RhdGljIGludCB0cG0xX2NoaXBfcmVnaXN0ZXIoc3RydWN0IHRwbV9jaGlwICpjaGlwKQoreworCWludCByYzsKKworCWlmIChjaGlwLT5mbGFncyAmIFRQTV9DSElQX0ZMQUdfVFBNMikKKwkJcmV0dXJuIDA7CisKKwlyYyA9IHRwbV9zeXNmc19hZGRfZGV2aWNlKGNoaXApOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSB0cG1fYWRkX3BwaShjaGlwKTsKKwlpZiAocmMpIHsKKwkJdHBtX3N5c2ZzX2RlbF9kZXZpY2UoY2hpcCk7CisJCXJldHVybiByYzsKKwl9CisKKwljaGlwLT5iaW9zX2RpciA9IHRwbV9iaW9zX2xvZ19zZXR1cChjaGlwLT5kZXZuYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0cG0xX2NoaXBfdW5yZWdpc3RlcihzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApCit7CisJaWYgKGNoaXAtPmZsYWdzICYgVFBNX0NISVBfRkxBR19UUE0yKQorCQlyZXR1cm47CisKKwlpZiAoY2hpcC0+Ymlvc19kaXIpCisJCXRwbV9iaW9zX2xvZ190ZWFyZG93bihjaGlwLT5iaW9zX2Rpcik7CisKKwl0cG1fcmVtb3ZlX3BwaShjaGlwKTsKKworCXRwbV9zeXNmc19kZWxfZGV2aWNlKGNoaXApOworfQorCiAvKgogICogdHBtX2NoaXBfcmVnaXN0ZXIoKSAtIGNyZWF0ZSBhIGNoYXJhY3RlciBkZXZpY2UgZm9yIHRoZSBUUE0gY2hpcAogICogQGNoaXA6IFRQTSBjaGlwIHRvIHVzZS4KQEAgLTE4NSwyMiArMjIwLDEzIEBACiB7CiAJaW50IHJjOwogCi0JLyogUG9wdWxhdGUgc3lzZnMgZm9yIFRQTTEgZGV2aWNlcy4gKi8KLQlpZiAoIShjaGlwLT5mbGFncyAmIFRQTV9DSElQX0ZMQUdfVFBNMikpIHsKLQkJcmMgPSB0cG1fc3lzZnNfYWRkX2RldmljZShjaGlwKTsKLQkJaWYgKHJjKQotCQkJZ290byBkZWxfbWlzYzsKLQotCQlyYyA9IHRwbV9hZGRfcHBpKGNoaXApOwotCQlpZiAocmMpCi0JCQlnb3RvIGRlbF9zeXNmczsKLQotCQljaGlwLT5iaW9zX2RpciA9IHRwbV9iaW9zX2xvZ19zZXR1cChjaGlwLT5kZXZuYW1lKTsKLQl9CisJcmMgPSB0cG0xX2NoaXBfcmVnaXN0ZXIoY2hpcCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlyYyA9IHRwbV9kZXZfYWRkX2RldmljZShjaGlwKTsKIAlpZiAocmMpCi0JCXJldHVybiByYzsKKwkJZ290byBvdXRfZXJyOwogCiAJLyogTWFrZSB0aGUgY2hpcCBhdmFpbGFibGUuICovCiAJc3Bpbl9sb2NrKCZkcml2ZXJfbG9jayk7CkBAIC0yMTAsMTAgKzIzNiw4IEBACiAJY2hpcC0+ZmxhZ3MgfD0gVFBNX0NISVBfRkxBR19SRUdJU1RFUkVEOwogCiAJcmV0dXJuIDA7Ci1kZWxfc3lzZnM6Ci0JdHBtX3N5c2ZzX2RlbF9kZXZpY2UoY2hpcCk7Ci1kZWxfbWlzYzoKLQl0cG1fZGV2X2RlbF9kZXZpY2UoY2hpcCk7CitvdXRfZXJyOgorCXRwbTFfY2hpcF91bnJlZ2lzdGVyKGNoaXApOwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHRwbV9jaGlwX3JlZ2lzdGVyKTsKQEAgLTIzOCwxMyArMjYyLDcgQEAKIAlzcGluX3VubG9jaygmZHJpdmVyX2xvY2spOwogCXN5bmNocm9uaXplX3JjdSgpOwogCi0JaWYgKCEoY2hpcC0+ZmxhZ3MgJiBUUE1fQ0hJUF9GTEFHX1RQTTIpKSB7Ci0JCWlmIChjaGlwLT5iaW9zX2RpcikKLQkJCXRwbV9iaW9zX2xvZ190ZWFyZG93bihjaGlwLT5iaW9zX2Rpcik7Ci0JCXRwbV9yZW1vdmVfcHBpKGNoaXApOwotCQl0cG1fc3lzZnNfZGVsX2RldmljZShjaGlwKTsKLQl9Ci0KKwl0cG0xX2NoaXBfdW5yZWdpc3RlcihjaGlwKTsKIAl0cG1fZGV2X2RlbF9kZXZpY2UoY2hpcCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh0cG1fY2hpcF91bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX2kyY19zdG1fc3QzMy5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1faTJjX3N0bV9zdDMzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjg0NWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG1faTJjX3N0bV9zdDMzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MTEgKzAsMCBAQAotLyoKLSAqIFNUTWljcm9lbGVjdHJvbmljcyBUUE0gSTJDIExpbnV4IGRyaXZlciBmb3IgVFBNIFNUMzNaUDI0Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTQgIFNUTWljcm9lbGVjdHJvbmljcwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqCi0gKiBTVE1pY3JvZWxlY3Ryb25pY3MgdmVyc2lvbiAxLjIuMSwgQ29weXJpZ2h0IChDKSAyMDE0Ci0gKiBTVE1pY3JvZWxlY3Ryb25pY3MgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgotICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAotICogdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLgotICoKLSAqIEBBdXRob3I6IENocmlzdG9waGUgUklDQVJEIHRwbXN1cHBvcnRAc3QuY29tCi0gKgotICogQEZpbGU6IHRwbV9zdG1fc3QzM19pMmMuYwotICoKLSAqIEBTeW5vcHNpczoKLSAqCTA5LzE1LzIwMTA6CUZpcnN0IHNob3QgZHJpdmVyIHRwbV90aXMgZHJpdmVyIGZvcgotICoJCQkgbHBjIGlzIHVzZWQgYXMgbW9kZWwuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL3RwbV9zdG1fc3QzMy5oPgotI2luY2x1ZGUgInRwbS5oIgotCi0jZGVmaW5lIFRQTV9BQ0NFU1MJCQkweDAKLSNkZWZpbmUgVFBNX1NUUwkJCQkweDE4Ci0jZGVmaW5lIFRQTV9IQVNIX0VORAkJCTB4MjAKLSNkZWZpbmUgVFBNX0RBVEFfRklGTwkJCTB4MjQKLSNkZWZpbmUgVFBNX0hBU0hfREFUQQkJCTB4MjQKLSNkZWZpbmUgVFBNX0hBU0hfU1RBUlQJCQkweDI4Ci0jZGVmaW5lIFRQTV9JTlRGX0NBUEFCSUxJVFkJCTB4MTQKLSNkZWZpbmUgVFBNX0lOVF9TVEFUVVMJCQkweDEwCi0jZGVmaW5lIFRQTV9JTlRfRU5BQkxFCQkJMHgwOAotCi0jZGVmaW5lIFRQTV9EVU1NWV9CWVRFCQkJMHhBQQotI2RlZmluZSBUUE1fV1JJVEVfRElSRUNUSU9OCQkweDgwCi0jZGVmaW5lIFRQTV9IRUFERVJfU0laRQkJCTEwCi0jZGVmaW5lIFRQTV9CVUZTSVpFCQkJMjA0OAotCi0jZGVmaW5lIExPQ0FMSVRZMAkJMAotCi0KLWVudW0gc3RtMzN6cDI0X2FjY2VzcyB7Ci0JVFBNX0FDQ0VTU19WQUxJRCA9IDB4ODAsCi0JVFBNX0FDQ0VTU19BQ1RJVkVfTE9DQUxJVFkgPSAweDIwLAotCVRQTV9BQ0NFU1NfUkVRVUVTVF9QRU5ESU5HID0gMHgwNCwKLQlUUE1fQUNDRVNTX1JFUVVFU1RfVVNFID0gMHgwMiwKLX07Ci0KLWVudW0gc3RtMzN6cDI0X3N0YXR1cyB7Ci0JVFBNX1NUU19WQUxJRCA9IDB4ODAsCi0JVFBNX1NUU19DT01NQU5EX1JFQURZID0gMHg0MCwKLQlUUE1fU1RTX0dPID0gMHgyMCwKLQlUUE1fU1RTX0RBVEFfQVZBSUwgPSAweDEwLAotCVRQTV9TVFNfREFUQV9FWFBFQ1QgPSAweDA4LAotfTsKLQotZW51bSBzdG0zM3pwMjRfaW50X2ZsYWdzIHsKLQlUUE1fR0xPQkFMX0lOVF9FTkFCTEUgPSAweDgwLAotCVRQTV9JTlRGX0NNRF9SRUFEWV9JTlQgPSAweDA4MCwKLQlUUE1fSU5URl9GSUZPX0FWQUxBSUJMRV9JTlQgPSAweDA0MCwKLQlUUE1fSU5URl9XQUtFX1VQX1JFQURZX0lOVCA9IDB4MDIwLAotCVRQTV9JTlRGX0xPQ0FMSVRZX0NIQU5HRV9JTlQgPSAweDAwNCwKLQlUUE1fSU5URl9TVFNfVkFMSURfSU5UID0gMHgwMDIsCi0JVFBNX0lOVEZfREFUQV9BVkFJTF9JTlQgPSAweDAwMSwKLX07Ci0KLWVudW0gdGlzX2RlZmF1bHRzIHsKLQlUSVNfU0hPUlRfVElNRU9VVCA9IDc1MCwKLQlUSVNfTE9OR19USU1FT1VUID0gMjAwMCwKLX07Ci0KLXN0cnVjdCB0cG1fc3RtX2RldiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKLQlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXA7Ci0JdTggYnVmW1RQTV9CVUZTSVpFICsgMV07Ci0JdTMyIGludHJzOwotCWludCBpb19scGNwZDsKLX07Ci0KLS8qCi0gKiB3cml0ZThfcmVnCi0gKiBTZW5kIGJ5dGUgdG8gdGhlIFRJUyByZWdpc3RlciBhY2NvcmRpbmcgdG8gdGhlIFNUMzNaUDI0IEkyQyBwcm90b2NvbC4KLSAqIEBwYXJhbTogdHBtX3JlZ2lzdGVyLCB0aGUgdHBtIHRpcyByZWdpc3RlciB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbgotICogQHBhcmFtOiB0cG1fZGF0YSwgdGhlIHRwbV9kYXRhIHRvIHdyaXRlIGluc2lkZSB0aGUgdHBtX3JlZ2lzdGVyCi0gKiBAcGFyYW06IHRwbV9zaXplLCBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhCi0gKiBAcmV0dXJuOiBSZXR1cm5zIG5lZ2F0aXZlIGVycm5vLCBvciBlbHNlIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbi4KLSAqLwotc3RhdGljIGludCB3cml0ZThfcmVnKHN0cnVjdCB0cG1fc3RtX2RldiAqdHBtX2RldiwgdTggdHBtX3JlZ2lzdGVyLAotCQkgICAgICB1OCAqdHBtX2RhdGEsIHUxNiB0cG1fc2l6ZSkKLXsKLQl0cG1fZGV2LT5idWZbMF0gPSB0cG1fcmVnaXN0ZXI7Ci0JbWVtY3B5KHRwbV9kZXYtPmJ1ZiArIDEsIHRwbV9kYXRhLCB0cG1fc2l6ZSk7Ci0JcmV0dXJuIGkyY19tYXN0ZXJfc2VuZCh0cG1fZGV2LT5jbGllbnQsIHRwbV9kZXYtPmJ1ZiwgdHBtX3NpemUgKyAxKTsKLX0gLyogd3JpdGU4X3JlZygpICovCi0KLS8qCi0gKiByZWFkOF9yZWcKLSAqIFJlY3YgYnl0ZSBmcm9tIHRoZSBUSVMgcmVnaXN0ZXIgYWNjb3JkaW5nIHRvIHRoZSBTVDMzWlAyNCBJMkMgcHJvdG9jb2wuCi0gKiBAcGFyYW06IHRwbV9yZWdpc3RlciwgdGhlIHRwbSB0aXMgcmVnaXN0ZXIgd2hlcmUgdGhlIGRhdGEgc2hvdWxkIGJlIHJlYWQKLSAqIEBwYXJhbTogdHBtX2RhdGEsIHRoZSBUUE0gcmVzcG9uc2UKLSAqIEBwYXJhbTogdHBtX3NpemUsIHRwbSBUUE0gcmVzcG9uc2Ugc2l6ZSB0byByZWFkLgotICogQHJldHVybjogbnVtYmVyIG9mIGJ5dGUgcmVhZCBzdWNjZXNzZnVsbHk6IHNob3VsZCBiZSBvbmUgaWYgc3VjY2Vzcy4KLSAqLwotc3RhdGljIGludCByZWFkOF9yZWcoc3RydWN0IHRwbV9zdG1fZGV2ICp0cG1fZGV2LCB1OCB0cG1fcmVnaXN0ZXIsCi0JCSAgICB1OCAqdHBtX2RhdGEsIGludCB0cG1fc2l6ZSkKLXsKLQl1OCBzdGF0dXMgPSAwOwotCXU4IGRhdGE7Ci0KLQlkYXRhID0gVFBNX0RVTU1ZX0JZVEU7Ci0Jc3RhdHVzID0gd3JpdGU4X3JlZyh0cG1fZGV2LCB0cG1fcmVnaXN0ZXIsICZkYXRhLCAxKTsKLQlpZiAoc3RhdHVzID09IDIpCi0JCXN0YXR1cyA9IGkyY19tYXN0ZXJfcmVjdih0cG1fZGV2LT5jbGllbnQsIHRwbV9kYXRhLCB0cG1fc2l6ZSk7Ci0JcmV0dXJuIHN0YXR1czsKLX0gLyogcmVhZDhfcmVnKCkgKi8KLQotLyoKLSAqIEkyQ19XUklURV9EQVRBCi0gKiBTZW5kIGJ5dGUgdG8gdGhlIFRJUyByZWdpc3RlciBhY2NvcmRpbmcgdG8gdGhlIFNUMzNaUDI0IEkyQyBwcm90b2NvbC4KLSAqIEBwYXJhbTogdHBtX2RldiwgdGhlIGNoaXAgZGVzY3JpcHRpb24KLSAqIEBwYXJhbTogdHBtX3JlZ2lzdGVyLCB0aGUgdHBtIHRpcyByZWdpc3RlciB3aGVyZSB0aGUgZGF0YSBzaG91bGQgYmUgd3JpdHRlbgotICogQHBhcmFtOiB0cG1fZGF0YSwgdGhlIHRwbV9kYXRhIHRvIHdyaXRlIGluc2lkZSB0aGUgdHBtX3JlZ2lzdGVyCi0gKiBAcGFyYW06IHRwbV9zaXplLCBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhCi0gKiBAcmV0dXJuOiBudW1iZXIgb2YgYnl0ZSB3cml0dGVuIHN1Y2Nlc3NmdWxseTogc2hvdWxkIGJlIG9uZSBpZiBzdWNjZXNzLgotICovCi0jZGVmaW5lIEkyQ19XUklURV9EQVRBKHRwbV9kZXYsIHRwbV9yZWdpc3RlciwgdHBtX2RhdGEsIHRwbV9zaXplKSBcCi0JKHdyaXRlOF9yZWcodHBtX2RldiwgdHBtX3JlZ2lzdGVyIHwgXAotCVRQTV9XUklURV9ESVJFQ1RJT04sIHRwbV9kYXRhLCB0cG1fc2l6ZSkpCi0KLS8qCi0gKiBJMkNfUkVBRF9EQVRBCi0gKiBSZWN2IGJ5dGUgZnJvbSB0aGUgVElTIHJlZ2lzdGVyIGFjY29yZGluZyB0byB0aGUgU1QzM1pQMjQgSTJDIHByb3RvY29sLgotICogQHBhcmFtOiB0cG1fZGV2LCB0aGUgY2hpcCBkZXNjcmlwdGlvbgotICogQHBhcmFtOiB0cG1fcmVnaXN0ZXIsIHRoZSB0cG0gdGlzIHJlZ2lzdGVyIHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSByZWFkCi0gKiBAcGFyYW06IHRwbV9kYXRhLCB0aGUgVFBNIHJlc3BvbnNlCi0gKiBAcGFyYW06IHRwbV9zaXplLCB0cG0gVFBNIHJlc3BvbnNlIHNpemUgdG8gcmVhZC4KLSAqIEByZXR1cm46IG51bWJlciBvZiBieXRlIHJlYWQgc3VjY2Vzc2Z1bGx5OiBzaG91bGQgYmUgb25lIGlmIHN1Y2Nlc3MuCi0gKi8KLSNkZWZpbmUgSTJDX1JFQURfREFUQSh0cG1fZGV2LCB0cG1fcmVnaXN0ZXIsIHRwbV9kYXRhLCB0cG1fc2l6ZSkgXAotCShyZWFkOF9yZWcodHBtX2RldiwgdHBtX3JlZ2lzdGVyLCB0cG1fZGF0YSwgdHBtX3NpemUpKQotCi0vKgotICogY2xlYXJfaW50ZXJydXB0aW9uCi0gKiBjbGVhciB0aGUgVFBNIGludGVycnVwdCByZWdpc3Rlci4KLSAqIEBwYXJhbTogdHBtLCB0aGUgY2hpcCBkZXNjcmlwdGlvbgotICogQHJldHVybjogdGhlIFRQTV9JTlRfU1RBVFVTIHZhbHVlCi0gKi8KLXN0YXRpYyB1OCBjbGVhcl9pbnRlcnJ1cHRpb24oc3RydWN0IHRwbV9zdG1fZGV2ICp0cG1fZGV2KQotewotCXU4IGludGVycnVwdDsKLQotCUkyQ19SRUFEX0RBVEEodHBtX2RldiwgVFBNX0lOVF9TVEFUVVMsICZpbnRlcnJ1cHQsIDEpOwotCUkyQ19XUklURV9EQVRBKHRwbV9kZXYsIFRQTV9JTlRfU1RBVFVTLCAmaW50ZXJydXB0LCAxKTsKLQlyZXR1cm4gaW50ZXJydXB0OwotfSAvKiBjbGVhcl9pbnRlcnJ1cHRpb24oKSAqLwotCi0vKgotICogdHBtX3N0bV9pMmNfY2FuY2VsLCBjYW5jZWwgaXMgbm90IGltcGxlbWVudGVkLgotICogQHBhcmFtOiBjaGlwLCB0aGUgdHBtX2NoaXAgZGVzY3JpcHRpb24gYXMgc3BlY2lmaWVkIGluIGRyaXZlci9jaGFyL3RwbS90cG0uaAotICovCi1zdGF0aWMgdm9pZCB0cG1fc3RtX2kyY19jYW5jZWwoc3RydWN0IHRwbV9jaGlwICpjaGlwKQotewotCXN0cnVjdCB0cG1fc3RtX2RldiAqdHBtX2RldjsKLQl1OCBkYXRhOwotCi0JdHBtX2RldiA9IChzdHJ1Y3QgdHBtX3N0bV9kZXYgKilUUE1fVlBSSVYoY2hpcCk7Ci0KLQlkYXRhID0gVFBNX1NUU19DT01NQU5EX1JFQURZOwotCUkyQ19XUklURV9EQVRBKHRwbV9kZXYsIFRQTV9TVFMsICZkYXRhLCAxKTsKLX0gLyogdHBtX3N0bV9pMmNfY2FuY2VsKCkgKi8KLQotLyoKLSAqIHRwbV9zdG1fc3BpX3N0YXR1cyByZXR1cm4gdGhlIFRQTV9TVFMgcmVnaXN0ZXIKLSAqIEBwYXJhbTogY2hpcCwgdGhlIHRwbSBjaGlwIGRlc2NyaXB0aW9uCi0gKiBAcmV0dXJuOiB0aGUgVFBNX1NUUyByZWdpc3RlciB2YWx1ZS4KLSAqLwotc3RhdGljIHU4IHRwbV9zdG1faTJjX3N0YXR1cyhzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApCi17Ci0Jc3RydWN0IHRwbV9zdG1fZGV2ICp0cG1fZGV2OwotCXU4IGRhdGE7Ci0KLQl0cG1fZGV2ID0gKHN0cnVjdCB0cG1fc3RtX2RldiAqKVRQTV9WUFJJVihjaGlwKTsKLQotCUkyQ19SRUFEX0RBVEEodHBtX2RldiwgVFBNX1NUUywgJmRhdGEsIDEpOwotCXJldHVybiBkYXRhOwotfSAvKiB0cG1fc3RtX2kyY19zdGF0dXMoKSAqLwotCi0KLS8qCi0gKiBjaGVja19sb2NhbGl0eSBpZiB0aGUgbG9jYWxpdHkgaXMgYWN0aXZlCi0gKiBAcGFyYW06IGNoaXAsIHRoZSB0cG0gY2hpcCBkZXNjcmlwdGlvbgotICogQHJldHVybjogdGhlIGFjdGl2ZSBsb2NhbGl0eSBvciAtRUFDQ0VTUy4KLSAqLwotc3RhdGljIGludCBjaGVja19sb2NhbGl0eShzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApCi17Ci0Jc3RydWN0IHRwbV9zdG1fZGV2ICp0cG1fZGV2OwotCXU4IGRhdGE7Ci0JdTggc3RhdHVzOwotCi0JdHBtX2RldiA9IChzdHJ1Y3QgdHBtX3N0bV9kZXYgKilUUE1fVlBSSVYoY2hpcCk7Ci0KLQlzdGF0dXMgPSBJMkNfUkVBRF9EQVRBKHRwbV9kZXYsIFRQTV9BQ0NFU1MsICZkYXRhLCAxKTsKLQlpZiAoc3RhdHVzICYmIChkYXRhICYKLQkJKFRQTV9BQ0NFU1NfQUNUSVZFX0xPQ0FMSVRZIHwgVFBNX0FDQ0VTU19WQUxJRCkpID09Ci0JCShUUE1fQUNDRVNTX0FDVElWRV9MT0NBTElUWSB8IFRQTV9BQ0NFU1NfVkFMSUQpKQotCQlyZXR1cm4gY2hpcC0+dmVuZG9yLmxvY2FsaXR5OwotCi0JcmV0dXJuIC1FQUNDRVM7Ci19IC8qIGNoZWNrX2xvY2FsaXR5KCkgKi8KLQotLyoKLSAqIHJlcXVlc3RfbG9jYWxpdHkgcmVxdWVzdCB0aGUgVFBNIGxvY2FsaXR5Ci0gKiBAcGFyYW06IGNoaXAsIHRoZSBjaGlwIGRlc2NyaXB0aW9uCi0gKiBAcmV0dXJuOiB0aGUgYWN0aXZlIGxvY2FsaXR5IG9yIEVBQ0NFU1MuCi0gKi8KLXN0YXRpYyBpbnQgcmVxdWVzdF9sb2NhbGl0eShzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApCi17Ci0JdW5zaWduZWQgbG9uZyBzdG9wOwotCWxvbmcgcmV0OwotCXN0cnVjdCB0cG1fc3RtX2RldiAqdHBtX2RldjsKLQl1OCBkYXRhOwotCi0JaWYgKGNoZWNrX2xvY2FsaXR5KGNoaXApID09IGNoaXAtPnZlbmRvci5sb2NhbGl0eSkKLQkJcmV0dXJuIGNoaXAtPnZlbmRvci5sb2NhbGl0eTsKLQotCXRwbV9kZXYgPSAoc3RydWN0IHRwbV9zdG1fZGV2ICopVFBNX1ZQUklWKGNoaXApOwotCi0JZGF0YSA9IFRQTV9BQ0NFU1NfUkVRVUVTVF9VU0U7Ci0JcmV0ID0gSTJDX1dSSVRFX0RBVEEodHBtX2RldiwgVFBNX0FDQ0VTUywgJmRhdGEsIDEpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVuZDsKLQotCXN0b3AgPSBqaWZmaWVzICsgY2hpcC0+dmVuZG9yLnRpbWVvdXRfYTsKLQotCS8qIFJlcXVlc3QgbG9jYWxpdHkgaXMgdXN1YWxseSBlZmZlY3RpdmUgYWZ0ZXIgdGhlIHJlcXVlc3QgKi8KLQlkbyB7Ci0JCWlmIChjaGVja19sb2NhbGl0eShjaGlwKSA+PSAwKQotCQkJcmV0dXJuIGNoaXAtPnZlbmRvci5sb2NhbGl0eTsKLQkJbXNsZWVwKFRQTV9USU1FT1VUKTsKLQl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBzdG9wKSk7Ci0JcmV0ID0gLUVBQ0NFUzsKLWVuZDoKLQlyZXR1cm4gcmV0OwotfSAvKiByZXF1ZXN0X2xvY2FsaXR5KCkgKi8KLQotLyoKLSAqIHJlbGVhc2VfbG9jYWxpdHkgcmVsZWFzZSB0aGUgYWN0aXZlIGxvY2FsaXR5Ci0gKiBAcGFyYW06IGNoaXAsIHRoZSB0cG0gY2hpcCBkZXNjcmlwdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgcmVsZWFzZV9sb2NhbGl0eShzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApCi17Ci0Jc3RydWN0IHRwbV9zdG1fZGV2ICp0cG1fZGV2OwotCXU4IGRhdGE7Ci0KLQl0cG1fZGV2ID0gKHN0cnVjdCB0cG1fc3RtX2RldiAqKVRQTV9WUFJJVihjaGlwKTsKLQlkYXRhID0gVFBNX0FDQ0VTU19BQ1RJVkVfTE9DQUxJVFk7Ci0KLQlJMkNfV1JJVEVfREFUQSh0cG1fZGV2LCBUUE1fQUNDRVNTLCAmZGF0YSwgMSk7Ci19Ci0KLS8qCi0gKiBnZXRfYnVyc3Rjb3VudCByZXR1cm4gdGhlIGJ1cnN0Y291bnQgYWRkcmVzcyAweDE5IDB4MUEKLSAqIEBwYXJhbTogY2hpcCwgdGhlIGNoaXAgZGVzY3JpcHRpb24KLSAqIHJldHVybjogdGhlIGJ1cnN0Y291bnQuCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X2J1cnN0Y291bnQoc3RydWN0IHRwbV9jaGlwICpjaGlwKQotewotCXVuc2lnbmVkIGxvbmcgc3RvcDsKLQlpbnQgYnVyc3RjbnQsIHN0YXR1czsKLQl1OCB0cG1fcmVnLCB0ZW1wOwotCXN0cnVjdCB0cG1fc3RtX2RldiAqdHBtX2RldjsKLQotCXRwbV9kZXYgPSAoc3RydWN0IHRwbV9zdG1fZGV2ICopVFBNX1ZQUklWKGNoaXApOwotCi0Jc3RvcCA9IGppZmZpZXMgKyBjaGlwLT52ZW5kb3IudGltZW91dF9kOwotCWRvIHsKLQkJdHBtX3JlZyA9IFRQTV9TVFMgKyAxOwotCQlzdGF0dXMgPSBJMkNfUkVBRF9EQVRBKHRwbV9kZXYsIHRwbV9yZWcsICZ0ZW1wLCAxKTsKLQkJaWYgKHN0YXR1cyA8IDApCi0JCQlnb3RvIGVuZDsKLQotCQl0cG1fcmVnID0gdHBtX3JlZyArIDE7Ci0JCWJ1cnN0Y250ID0gdGVtcDsKLQkJc3RhdHVzID0gSTJDX1JFQURfREFUQSh0cG1fZGV2LCB0cG1fcmVnLCAmdGVtcCwgMSk7Ci0JCWlmIChzdGF0dXMgPCAwKQotCQkJZ290byBlbmQ7Ci0KLQkJYnVyc3RjbnQgfD0gdGVtcCA8PCA4OwotCQlpZiAoYnVyc3RjbnQpCi0JCQlyZXR1cm4gYnVyc3RjbnQ7Ci0JCW1zbGVlcChUUE1fVElNRU9VVCk7Ci0JfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgc3RvcCkpOwotCi1lbmQ6Ci0JcmV0dXJuIC1FQlVTWTsKLX0gLyogZ2V0X2J1cnN0Y291bnQoKSAqLwotCi1zdGF0aWMgYm9vbCB3YWl0X2Zvcl90cG1fc3RhdF9jb25kKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggbWFzaywKLQkJCQlib29sIGNoZWNrX2NhbmNlbCwgYm9vbCAqY2FuY2VsZWQpCi17Ci0JdTggc3RhdHVzID0gY2hpcC0+b3BzLT5zdGF0dXMoY2hpcCk7Ci0KLQkqY2FuY2VsZWQgPSBmYWxzZTsKLQlpZiAoKHN0YXR1cyAmIG1hc2spID09IG1hc2spCi0JCXJldHVybiB0cnVlOwotCWlmIChjaGVja19jYW5jZWwgJiYgY2hpcC0+b3BzLT5yZXFfY2FuY2VsZWQoY2hpcCwgc3RhdHVzKSkgewotCQkqY2FuY2VsZWQgPSB0cnVlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi0vKgotICogaW50ZXJydXB0X3RvX3N0YXR1cwotICogQHBhcmFtOiBpcnFfbWFzaywgdGhlIGlycSBtYXNrIHZhbHVlIHRvIHdhaXQKLSAqIEByZXR1cm46IHRoZSBjb3JyZXNwb25kaW5nIHRwbV9zdHMgdmFsdWUKLSAqLwotc3RhdGljIHU4IGludGVycnVwdF90b19zdGF0dXModTggaXJxX21hc2spCi17Ci0JdTggc3RhdHVzID0gMDsKLQotCWlmICgoaXJxX21hc2sgJiBUUE1fSU5URl9TVFNfVkFMSURfSU5UKSA9PSBUUE1fSU5URl9TVFNfVkFMSURfSU5UKQotCQlzdGF0dXMgfD0gVFBNX1NUU19WQUxJRDsKLQlpZiAoKGlycV9tYXNrICYgVFBNX0lOVEZfREFUQV9BVkFJTF9JTlQpID09IFRQTV9JTlRGX0RBVEFfQVZBSUxfSU5UKQotCQlzdGF0dXMgfD0gVFBNX1NUU19EQVRBX0FWQUlMOwotCWlmICgoaXJxX21hc2sgJiBUUE1fSU5URl9DTURfUkVBRFlfSU5UKSA9PSBUUE1fSU5URl9DTURfUkVBRFlfSU5UKQotCQlzdGF0dXMgfD0gVFBNX1NUU19DT01NQU5EX1JFQURZOwotCi0JcmV0dXJuIHN0YXR1czsKLX0gLyogc3RhdHVzX3RvX2ludGVycnVwdCgpICovCi0KLS8qCi0gKiB3YWl0X2Zvcl9zdGF0IHdhaXQgZm9yIGEgVFBNX1NUUyB2YWx1ZQotICogQHBhcmFtOiBjaGlwLCB0aGUgdHBtIGNoaXAgZGVzY3JpcHRpb24KLSAqIEBwYXJhbTogbWFzaywgdGhlIHZhbHVlIG1hc2sgdG8gd2FpdAotICogQHBhcmFtOiB0aW1lb3V0LCB0aGUgdGltZW91dAotICogQHBhcmFtOiBxdWV1ZSwgdGhlIHdhaXQgcXVldWUuCi0gKiBAcGFyYW06IGNoZWNrX2NhbmNlbCwgZG9lcyB0aGUgY29tbWFuZCBjYW4gYmUgY2FuY2VsbGVkID8KLSAqIEByZXR1cm46IHRoZSB0cG0gc3RhdHVzLCAwIGlmIHN1Y2Nlc3MsIC1FVElNRSBpZiB0aW1lb3V0IGlzIHJlYWNoZWQuCi0gKi8KLXN0YXRpYyBpbnQgd2FpdF9mb3Jfc3RhdChzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHU4IG1hc2ssIHVuc2lnbmVkIGxvbmcgdGltZW91dCwKLQkJCXdhaXRfcXVldWVfaGVhZF90ICpxdWV1ZSwgYm9vbCBjaGVja19jYW5jZWwpCi17Ci0JdW5zaWduZWQgbG9uZyBzdG9wOwotCWludCByZXQ7Ci0JYm9vbCBjYW5jZWxlZCA9IGZhbHNlOwotCWJvb2wgY29uZGl0aW9uOwotCXUzMiBjdXJfaW50cnM7Ci0JdTggaW50ZXJydXB0LCBzdGF0dXM7Ci0Jc3RydWN0IHRwbV9zdG1fZGV2ICp0cG1fZGV2OwotCi0JdHBtX2RldiA9IChzdHJ1Y3QgdHBtX3N0bV9kZXYgKilUUE1fVlBSSVYoY2hpcCk7Ci0KLQkvKiBjaGVjayBjdXJyZW50IHN0YXR1cyAqLwotCXN0YXR1cyA9IHRwbV9zdG1faTJjX3N0YXR1cyhjaGlwKTsKLQlpZiAoKHN0YXR1cyAmIG1hc2spID09IG1hc2spCi0JCXJldHVybiAwOwotCi0Jc3RvcCA9IGppZmZpZXMgKyB0aW1lb3V0OwotCi0JaWYgKGNoaXAtPnZlbmRvci5pcnEpIHsKLQkJY3VyX2ludHJzID0gdHBtX2Rldi0+aW50cnM7Ci0JCWludGVycnVwdCA9IGNsZWFyX2ludGVycnVwdGlvbih0cG1fZGV2KTsKLQkJZW5hYmxlX2lycShjaGlwLT52ZW5kb3IuaXJxKTsKLQotYWdhaW46Ci0JCXRpbWVvdXQgPSBzdG9wIC0gamlmZmllczsKLQkJaWYgKChsb25nKSB0aW1lb3V0IDw9IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoKnF1ZXVlLAotCQkJCQljdXJfaW50cnMgIT0gdHBtX2Rldi0+aW50cnMsIHRpbWVvdXQpOwotCi0JCWludGVycnVwdCB8PSBjbGVhcl9pbnRlcnJ1cHRpb24odHBtX2Rldik7Ci0JCXN0YXR1cyA9IGludGVycnVwdF90b19zdGF0dXMoaW50ZXJydXB0KTsKLQkJY29uZGl0aW9uID0gd2FpdF9mb3JfdHBtX3N0YXRfY29uZChjaGlwLCBtYXNrLAotCQkJCQkJICAgY2hlY2tfY2FuY2VsLCAmY2FuY2VsZWQpOwotCi0JCWlmIChyZXQgPj0gMCAmJiBjb25kaXRpb24pIHsKLQkJCWlmIChjYW5jZWxlZCkKLQkJCQlyZXR1cm4gLUVDQU5DRUxFRDsKLQkJCXJldHVybiAwOwotCQl9Ci0JCWlmIChyZXQgPT0gLUVSRVNUQVJUU1lTICYmIGZyZWV6aW5nKGN1cnJlbnQpKSB7Ci0JCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfU0lHUEVORElORyk7Ci0JCQlnb3RvIGFnYWluOwotCQl9Ci0JCWRpc2FibGVfaXJxX25vc3luYyhjaGlwLT52ZW5kb3IuaXJxKTsKLQotCX0gZWxzZSB7Ci0JCWRvIHsKLQkJCW1zbGVlcChUUE1fVElNRU9VVCk7Ci0JCQlzdGF0dXMgPSBjaGlwLT5vcHMtPnN0YXR1cyhjaGlwKTsKLQkJCWlmICgoc3RhdHVzICYgbWFzaykgPT0gbWFzaykKLQkJCQlyZXR1cm4gMDsKLQkJfSB3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgc3RvcCkpOwotCX0KLQotCXJldHVybiAtRVRJTUU7Ci19IC8qIHdhaXRfZm9yX3N0YXQoKSAqLwotCi0vKgotICogcmVjdl9kYXRhIHJlY2VpdmUgZGF0YQotICogQHBhcmFtOiBjaGlwLCB0aGUgdHBtIGNoaXAgZGVzY3JpcHRpb24KLSAqIEBwYXJhbTogYnVmLCB0aGUgYnVmZmVyIHdoZXJlIHRoZSBkYXRhIGFyZSByZWNlaXZlZAotICogQHBhcmFtOiBjb3VudCwgdGhlIG51bWJlciBvZiBkYXRhIHRvIHJlY2VpdmUKLSAqIEByZXR1cm46IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIFRQTSBGSUZPLgotICovCi1zdGF0aWMgaW50IHJlY3ZfZGF0YShzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAsIHU4ICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlpbnQgc2l6ZSA9IDAsIGJ1cnN0Y250LCBsZW4sIHJldDsKLQlzdHJ1Y3QgdHBtX3N0bV9kZXYgKnRwbV9kZXY7Ci0KLQl0cG1fZGV2ID0gKHN0cnVjdCB0cG1fc3RtX2RldiAqKVRQTV9WUFJJVihjaGlwKTsKLQotCXdoaWxlIChzaXplIDwgY291bnQgJiYKLQkgICAgICAgd2FpdF9mb3Jfc3RhdChjaGlwLAotCQkJICAgICBUUE1fU1RTX0RBVEFfQVZBSUwgfCBUUE1fU1RTX1ZBTElELAotCQkJICAgICBjaGlwLT52ZW5kb3IudGltZW91dF9jLAotCQkJICAgICAmY2hpcC0+dmVuZG9yLnJlYWRfcXVldWUsIHRydWUpID09IDApIHsKLQkJYnVyc3RjbnQgPSBnZXRfYnVyc3Rjb3VudChjaGlwKTsKLQkJaWYgKGJ1cnN0Y250IDwgMCkKLQkJCXJldHVybiBidXJzdGNudDsKLQkJbGVuID0gbWluX3QoaW50LCBidXJzdGNudCwgY291bnQgLSBzaXplKTsKLQkJcmV0ID0gSTJDX1JFQURfREFUQSh0cG1fZGV2LCBUUE1fREFUQV9GSUZPLCBidWYgKyBzaXplLCBsZW4pOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJc2l6ZSArPSBsZW47Ci0JfQotCXJldHVybiBzaXplOwotfQotCi0vKgotICogdHBtX2lvc2VyaXJxX2hhbmRsZXIgdGhlIHNlcmlycSBpcnEgaGFuZGxlcgotICogQHBhcmFtOiBpcnEsIHRoZSB0cG0gY2hpcCBkZXNjcmlwdGlvbgotICogQHBhcmFtOiBkZXZfaWQsIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY2hpcAotICogQHJldHVybjogdGhlIHN0YXR1cyBvZiB0aGUgaGFuZGxlci4KLSAqLwotc3RhdGljIGlycXJldHVybl90IHRwbV9pb3NlcmlycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPSBkZXZfaWQ7Ci0Jc3RydWN0IHRwbV9zdG1fZGV2ICp0cG1fZGV2OwotCi0JdHBtX2RldiA9IChzdHJ1Y3QgdHBtX3N0bV9kZXYgKilUUE1fVlBSSVYoY2hpcCk7Ci0KLQl0cG1fZGV2LT5pbnRycysrOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2hpcC0+dmVuZG9yLnJlYWRfcXVldWUpOwotCWRpc2FibGVfaXJxX25vc3luYyhjaGlwLT52ZW5kb3IuaXJxKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0gLyogdHBtX2lvc2VyaXJxX2hhbmRsZXIoKSAqLwotCi0KLS8qCi0gKiB0cG1fc3RtX2kyY19zZW5kIHNlbmQgVFBNIGNvbW1hbmRzIHRocm91Z2ggdGhlIEkyQyBidXMuCi0gKgotICogQHBhcmFtOiBjaGlwLCB0aGUgdHBtX2NoaXAgZGVzY3JpcHRpb24gYXMgc3BlY2lmaWVkIGluIGRyaXZlci9jaGFyL3RwbS90cG0uaAotICogQHBhcmFtOiBidWYsCXRoZSBidWZmZXIgdG8gc2VuZC4KLSAqIEBwYXJhbTogY291bnQsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZC4KLSAqIEByZXR1cm46IEluIGNhc2Ugb2Ygc3VjY2VzcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHNlbnQuCi0gKgkJCUluIG90aGVyIGNhc2UsIGEgPCAwIHZhbHVlIGRlc2NyaWJpbmcgdGhlIGlzc3VlLgotICovCi1zdGF0aWMgaW50IHRwbV9zdG1faTJjX3NlbmQoc3RydWN0IHRwbV9jaGlwICpjaGlwLCB1bnNpZ25lZCBjaGFyICpidWYsCi0JCQkgICAgc2l6ZV90IGxlbikKLXsKLQl1MzIgc3RhdHVzLCBpLCBzaXplOwotCWludCBidXJzdGNudCA9IDA7Ci0JaW50IHJldDsKLQl1OCBkYXRhOwotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0Jc3RydWN0IHRwbV9zdG1fZGV2ICp0cG1fZGV2OwotCi0JaWYgKCFjaGlwKQotCQlyZXR1cm4gLUVCVVNZOwotCWlmIChsZW4gPCBUUE1fSEVBREVSX1NJWkUpCi0JCXJldHVybiAtRUJVU1k7Ci0KLQl0cG1fZGV2ID0gKHN0cnVjdCB0cG1fc3RtX2RldiAqKVRQTV9WUFJJVihjaGlwKTsKLQljbGllbnQgPSB0cG1fZGV2LT5jbGllbnQ7Ci0KLQljbGllbnQtPmZsYWdzID0gMDsKLQotCXJldCA9IHJlcXVlc3RfbG9jYWxpdHkoY2hpcCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlzdGF0dXMgPSB0cG1fc3RtX2kyY19zdGF0dXMoY2hpcCk7Ci0JaWYgKChzdGF0dXMgJiBUUE1fU1RTX0NPTU1BTkRfUkVBRFkpID09IDApIHsKLQkJdHBtX3N0bV9pMmNfY2FuY2VsKGNoaXApOwotCQlpZiAod2FpdF9mb3Jfc3RhdAotCQkgICAgKGNoaXAsIFRQTV9TVFNfQ09NTUFORF9SRUFEWSwgY2hpcC0+dmVuZG9yLnRpbWVvdXRfYiwKLQkJICAgICAmY2hpcC0+dmVuZG9yLnJlYWRfcXVldWUsIGZhbHNlKSA8IDApIHsKLQkJCXJldCA9IC1FVElNRTsKLQkJCWdvdG8gb3V0X2VycjsKLQkJfQotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOykgewotCQlidXJzdGNudCA9IGdldF9idXJzdGNvdW50KGNoaXApOwotCQlpZiAoYnVyc3RjbnQgPCAwKQotCQkJcmV0dXJuIGJ1cnN0Y250OwotCQlzaXplID0gbWluX3QoaW50LCBsZW4gLSBpIC0gMSwgYnVyc3RjbnQpOwotCQlyZXQgPSBJMkNfV1JJVEVfREFUQSh0cG1fZGV2LCBUUE1fREFUQV9GSUZPLCBidWYgKyBpLCBzaXplKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dF9lcnI7Ci0KLQkJaSArPSBzaXplOwotCX0KLQotCXN0YXR1cyA9IHRwbV9zdG1faTJjX3N0YXR1cyhjaGlwKTsKLQlpZiAoKHN0YXR1cyAmIFRQTV9TVFNfREFUQV9FWFBFQ1QpID09IDApIHsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBvdXRfZXJyOwotCX0KLQotCXJldCA9IEkyQ19XUklURV9EQVRBKHRwbV9kZXYsIFRQTV9EQVRBX0ZJRk8sIGJ1ZiArIGxlbiAtIDEsIDEpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9lcnI7Ci0KLQlzdGF0dXMgPSB0cG1fc3RtX2kyY19zdGF0dXMoY2hpcCk7Ci0JaWYgKChzdGF0dXMgJiBUUE1fU1RTX0RBVEFfRVhQRUNUKSAhPSAwKSB7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gb3V0X2VycjsKLQl9Ci0KLQlkYXRhID0gVFBNX1NUU19HTzsKLQlJMkNfV1JJVEVfREFUQSh0cG1fZGV2LCBUUE1fU1RTLCAmZGF0YSwgMSk7Ci0KLQlyZXR1cm4gbGVuOwotb3V0X2VycjoKLQl0cG1fc3RtX2kyY19jYW5jZWwoY2hpcCk7Ci0JcmVsZWFzZV9sb2NhbGl0eShjaGlwKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogdHBtX3N0bV9pMmNfcmVjdiByZWNlaXZlZCBUUE0gcmVzcG9uc2UgdGhyb3VnaCB0aGUgSTJDIGJ1cy4KLSAqIEBwYXJhbTogY2hpcCwgdGhlIHRwbV9jaGlwIGRlc2NyaXB0aW9uIGFzIHNwZWNpZmllZCBpbiBkcml2ZXIvY2hhci90cG0vdHBtLmguCi0gKiBAcGFyYW06IGJ1ZiwJdGhlIGJ1ZmZlciB0byBzdG9yZSBkYXRhcy4KLSAqIEBwYXJhbTogY291bnQsIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2VuZC4KLSAqIEByZXR1cm46IEluIGNhc2Ugb2Ygc3VjY2VzcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLgotICoJICAgIEluIG90aGVyIGNhc2UsIGEgPCAwIHZhbHVlIGRlc2NyaWJpbmcgdGhlIGlzc3VlLgotICovCi1zdGF0aWMgaW50IHRwbV9zdG1faTJjX3JlY3Yoc3RydWN0IHRwbV9jaGlwICpjaGlwLCB1bnNpZ25lZCBjaGFyICpidWYsCi0JCQkgICAgc2l6ZV90IGNvdW50KQotewotCWludCBzaXplID0gMDsKLQlpbnQgZXhwZWN0ZWQ7Ci0KLQlpZiAoIWNoaXApCi0JCXJldHVybiAtRUJVU1k7Ci0KLQlpZiAoY291bnQgPCBUUE1fSEVBREVSX1NJWkUpIHsKLQkJc2l6ZSA9IC1FSU87Ci0JCWdvdG8gb3V0OwotCX0KLQotCXNpemUgPSByZWN2X2RhdGEoY2hpcCwgYnVmLCBUUE1fSEVBREVSX1NJWkUpOwotCWlmIChzaXplIDwgVFBNX0hFQURFUl9TSVpFKSB7Ci0JCWRldl9lcnIoY2hpcC0+cGRldiwgIlVuYWJsZSB0byByZWFkIGhlYWRlclxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWV4cGVjdGVkID0gYmUzMl90b19jcHUoKihfX2JlMzIgKikoYnVmICsgMikpOwotCWlmIChleHBlY3RlZCA+IGNvdW50KSB7Ci0JCXNpemUgPSAtRUlPOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlzaXplICs9IHJlY3ZfZGF0YShjaGlwLCAmYnVmW1RQTV9IRUFERVJfU0laRV0sCi0JCQlleHBlY3RlZCAtIFRQTV9IRUFERVJfU0laRSk7Ci0JaWYgKHNpemUgPCBleHBlY3RlZCkgewotCQlkZXZfZXJyKGNoaXAtPnBkZXYsICJVbmFibGUgdG8gcmVhZCByZW1haW5kZXIgb2YgcmVzdWx0XG4iKTsKLQkJc2l6ZSA9IC1FVElNRTsKLQkJZ290byBvdXQ7Ci0JfQotCi1vdXQ6Ci0JY2hpcC0+b3BzLT5jYW5jZWwoY2hpcCk7Ci0JcmVsZWFzZV9sb2NhbGl0eShjaGlwKTsKLQlyZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIGJvb2wgdHBtX3N0bV9pMmNfcmVxX2NhbmNlbGVkKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgdTggc3RhdHVzKQotewotCXJldHVybiAoc3RhdHVzID09IFRQTV9TVFNfQ09NTUFORF9SRUFEWSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHBtX2NsYXNzX29wcyBzdF9pMmNfdHBtID0gewotCS5zZW5kID0gdHBtX3N0bV9pMmNfc2VuZCwKLQkucmVjdiA9IHRwbV9zdG1faTJjX3JlY3YsCi0JLmNhbmNlbCA9IHRwbV9zdG1faTJjX2NhbmNlbCwKLQkuc3RhdHVzID0gdHBtX3N0bV9pMmNfc3RhdHVzLAotCS5yZXFfY29tcGxldGVfbWFzayA9IFRQTV9TVFNfREFUQV9BVkFJTCB8IFRQTV9TVFNfVkFMSUQsCi0JLnJlcV9jb21wbGV0ZV92YWwgPSBUUE1fU1RTX0RBVEFfQVZBSUwgfCBUUE1fU1RTX1ZBTElELAotCS5yZXFfY2FuY2VsZWQgPSB0cG1fc3RtX2kyY19yZXFfY2FuY2VsZWQsCi19OwotCi0jaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgaW50IHRwbV9zdG1faTJjX29mX3JlcXVlc3RfcmVzb3VyY2VzKHN0cnVjdCB0cG1fY2hpcCAqY2hpcCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBwOwotCXN0cnVjdCB0cG1fc3RtX2RldiAqdHBtX2RldiA9IChzdHJ1Y3QgdHBtX3N0bV9kZXYgKilUUE1fVlBSSVYoY2hpcCk7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRwbV9kZXYtPmNsaWVudDsKLQlpbnQgZ3BpbzsKLQlpbnQgcmV0OwotCi0JcHAgPSBjbGllbnQtPmRldi5vZl9ub2RlOwotCWlmICghcHApIHsKLQkJZGV2X2VycihjaGlwLT5wZGV2LCAiTm8gcGxhdGZvcm0gZGF0YVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIEdldCBHUElPIGZyb20gZGV2aWNlIHRyZWUgKi8KLQlncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8ocHAsICJscGNwZC1ncGlvcyIsIDApOwotCWlmIChncGlvIDwgMCkgewotCQlkZXZfZXJyKGNoaXAtPnBkZXYsICJGYWlsZWQgdG8gcmV0cmlldmUgbHBjcGQtZ3Bpb3MgZnJvbSBkdHMuXG4iKTsKLQkJdHBtX2Rldi0+aW9fbHBjcGQgPSAtMTsKLQkJLyoKLQkJICogbHBjcGQgcGluIGlzIG5vdCBzcGVjaWZpZWQuIFRoaXMgaXMgbm90IGFuIGlzc3VlIGFzCi0JCSAqIHBvd2VyIG1hbmFnZW1lbnQgY2FuIGJlIGFsc28gbWFuYWdlZCBieSBUUE0gc3BlY2lmaWMKLQkJICogY29tbWFuZHMuIFNvIGxlYXZlIHdpdGggYSBzdWNjZXNzIHN0YXR1cyBjb2RlLgotCQkgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCS8qIEdQSU8gcmVxdWVzdCBhbmQgY29uZmlndXJhdGlvbiAqLwotCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmY2xpZW50LT5kZXYsIGdwaW8sCi0JCQlHUElPRl9PVVRfSU5JVF9ISUdILCAiVFBNIElPIExQQ1BEIik7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNoaXAtPnBkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBscGNwZCBwaW5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JdHBtX2Rldi0+aW9fbHBjcGQgPSBncGlvOwotCi0JcmV0dXJuIDA7Ci19Ci0jZWxzZQotc3RhdGljIGludCB0cG1fc3RtX2kyY19vZl9yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3QgdHBtX2NoaXAgKmNoaXApCi17Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCB0cG1fc3RtX2kyY19yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJCQkgc3RydWN0IHRwbV9jaGlwICpjaGlwKQotewotCXN0cnVjdCBzdDMzenAyNF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKLQlzdHJ1Y3QgdHBtX3N0bV9kZXYgKnRwbV9kZXYgPSAoc3RydWN0IHRwbV9zdG1fZGV2ICopVFBNX1ZQUklWKGNoaXApOwotCWludCByZXQ7Ci0KLQlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaWYgKCFwZGF0YSkgewotCQlkZXZfZXJyKGNoaXAtPnBkZXYsICJObyBwbGF0Zm9ybSBkYXRhXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogc3RvcmUgZm9yIGxhdGUgdXNlICovCi0JdHBtX2Rldi0+aW9fbHBjcGQgPSBwZGF0YS0+aW9fbHBjcGQ7Ci0KLQlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+aW9fbHBjcGQpKSB7Ci0JCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmY2xpZW50LT5kZXYsCi0JCQkJcGRhdGEtPmlvX2xwY3BkLCBHUElPRl9PVVRfSU5JVF9ISUdILAotCQkJCSJUUE0gSU9fTFBDUEQiKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycihjaGlwLT5wZGV2LCAiJXMgOiByZXNldCBncGlvX3JlcXVlc3QgZmFpbGVkXG4iLAotCQkJCV9fRklMRV9fKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHRwbV9zdG1faTJjX3Byb2JlIGluaXRpYWxpemUgdGhlIFRQTSBkZXZpY2UKLSAqIEBwYXJhbTogY2xpZW50LCB0aGUgaTJjX2NsaWVudCBkcmVzY3JpcHRpb24gKFRQTSBJMkMgZGVzY3JpcHRpb24pLgotICogQHBhcmFtOiBpZCwgdGhlIGkyY19kZXZpY2VfaWQgc3RydWN0LgotICogQHJldHVybjogMCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCi0gKgkgLTEgaW4gb3RoZXIgY2FzZS4KLSAqLwotc3RhdGljIGludAotdHBtX3N0bV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQotewotCWludCByZXQ7Ci0JdTggaW50bWFzayA9IDA7Ci0Jc3RydWN0IHRwbV9jaGlwICpjaGlwOwotCXN0cnVjdCBzdDMzenAyNF9wbGF0Zm9ybV9kYXRhICpwbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCB0cG1fc3RtX2RldiAqdHBtX2RldjsKLQotCWlmICghY2xpZW50KSB7Ci0JCXByX2luZm8oIiVzOiBpMmMgY2xpZW50IGlzIE5VTEwuIERldmljZSBub3QgYWNjZXNzaWJsZS5cbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7Ci0JCWRldl9pbmZvKCZjbGllbnQtPmRldiwgImNsaWVudCBub3QgaTJjIGNhcGFibGVcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQl0cG1fZGV2ID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKHN0cnVjdCB0cG1fc3RtX2RldiksCi0JCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0cG1fZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNoaXAgPSB0cG1tX2NoaXBfYWxsb2MoJmNsaWVudC0+ZGV2LCAmc3RfaTJjX3RwbSk7Ci0JaWYgKElTX0VSUihjaGlwKSkKLQkJcmV0dXJuIFBUUl9FUlIoY2hpcCk7Ci0KLQlUUE1fVlBSSVYoY2hpcCkgPSB0cG1fZGV2OwotCXRwbV9kZXYtPmNsaWVudCA9IGNsaWVudDsKLQotCXBsYXRmb3JtX2RhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmICghcGxhdGZvcm1fZGF0YSAmJiBjbGllbnQtPmRldi5vZl9ub2RlKSB7Ci0JCXJldCA9IHRwbV9zdG1faTJjX29mX3JlcXVlc3RfcmVzb3VyY2VzKGNoaXApOwotCQlpZiAocmV0KQotCQkJZ290byBfdHBtX2NsZWFuX2Fuc3dlcjsKLQl9IGVsc2UgaWYgKHBsYXRmb3JtX2RhdGEpIHsKLQkJcmV0ID0gdHBtX3N0bV9pMmNfcmVxdWVzdF9yZXNvdXJjZXMoY2xpZW50LCBjaGlwKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gX3RwbV9jbGVhbl9hbnN3ZXI7Ci0JfQotCi0JY2hpcC0+dmVuZG9yLnRpbWVvdXRfYSA9IG1zZWNzX3RvX2ppZmZpZXMoVElTX1NIT1JUX1RJTUVPVVQpOwotCWNoaXAtPnZlbmRvci50aW1lb3V0X2IgPSBtc2Vjc190b19qaWZmaWVzKFRJU19MT05HX1RJTUVPVVQpOwotCWNoaXAtPnZlbmRvci50aW1lb3V0X2MgPSBtc2Vjc190b19qaWZmaWVzKFRJU19TSE9SVF9USU1FT1VUKTsKLQljaGlwLT52ZW5kb3IudGltZW91dF9kID0gbXNlY3NfdG9famlmZmllcyhUSVNfU0hPUlRfVElNRU9VVCk7Ci0KLQljaGlwLT52ZW5kb3IubG9jYWxpdHkgPSBMT0NBTElUWTA7Ci0KLQlpZiAoY2xpZW50LT5pcnEpIHsKLQkJLyogSU5URVJSVVBUIFNldHVwICovCi0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmNoaXAtPnZlbmRvci5yZWFkX3F1ZXVlKTsKLQkJdHBtX2Rldi0+aW50cnMgPSAwOwotCi0JCWlmIChyZXF1ZXN0X2xvY2FsaXR5KGNoaXApICE9IExPQ0FMSVRZMCkgewotCQkJcmV0ID0gLUVOT0RFVjsKLQkJCWdvdG8gX3RwbV9jbGVhbl9hbnN3ZXI7Ci0JCX0KLQotCQljbGVhcl9pbnRlcnJ1cHRpb24odHBtX2Rldik7Ci0JCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJmNsaWVudC0+ZGV2LCBjbGllbnQtPmlycSwKLQkJCQl0cG1faW9zZXJpcnFfaGFuZGxlciwKLQkJCQlJUlFGX1RSSUdHRVJfSElHSCwKLQkJCQkiVFBNIFNFUklSUSBtYW5hZ2VtZW50IiwgY2hpcCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGNoaXAtPnBkZXYsICJUUE0gU0VSSVJRIHNpZ25hbHMgJWQgbm90IGF2YWlsYWJsZVxuIiwKLQkJCQljbGllbnQtPmlycSk7Ci0JCQlnb3RvIF90cG1fY2xlYW5fYW5zd2VyOwotCQl9Ci0KLQkJaW50bWFzayB8PSBUUE1fSU5URl9DTURfUkVBRFlfSU5UCi0JCQl8ICBUUE1fSU5URl9TVFNfVkFMSURfSU5UCi0JCQl8ICBUUE1fSU5URl9EQVRBX0FWQUlMX0lOVDsKLQotCQlyZXQgPSBJMkNfV1JJVEVfREFUQSh0cG1fZGV2LCBUUE1fSU5UX0VOQUJMRSwgJmludG1hc2ssIDEpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gX3RwbV9jbGVhbl9hbnN3ZXI7Ci0KLQkJaW50bWFzayA9IFRQTV9HTE9CQUxfSU5UX0VOQUJMRTsKLQkJcmV0ID0gSTJDX1dSSVRFX0RBVEEodHBtX2RldiwgKFRQTV9JTlRfRU5BQkxFICsgMyksCi0JCQkJICAgICAmaW50bWFzaywgMSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBfdHBtX2NsZWFuX2Fuc3dlcjsKLQotCQljaGlwLT52ZW5kb3IuaXJxID0gY2xpZW50LT5pcnE7Ci0KLQkJZGlzYWJsZV9pcnFfbm9zeW5jKGNoaXAtPnZlbmRvci5pcnEpOwotCi0JCXRwbV9nZW5faW50ZXJydXB0KGNoaXApOwotCX0KLQotCXRwbV9nZXRfdGltZW91dHMoY2hpcCk7Ci0JdHBtX2RvX3NlbGZ0ZXN0KGNoaXApOwotCi0JcmV0dXJuIHRwbV9jaGlwX3JlZ2lzdGVyKGNoaXApOwotX3RwbV9jbGVhbl9hbnN3ZXI6Ci0JZGV2X2luZm8oY2hpcC0+cGRldiwgIlRQTSBJMkMgaW5pdGlhbGlzYXRpb24gZmFpbFxuIik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIHRwbV9zdG1faTJjX3JlbW92ZSByZW1vdmUgdGhlIFRQTSBkZXZpY2UKLSAqIEBwYXJhbTogY2xpZW50LCB0aGUgaTJjX2NsaWVudCBkZXNjcmlwdGlvbiAoVFBNIEkyQyBkZXNjcmlwdGlvbikuCi0gKiBAcmV0dXJuOiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KLSAqLwotc3RhdGljIGludCB0cG1fc3RtX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgdHBtX2NoaXAgKmNoaXAgPQotCQkoc3RydWN0IHRwbV9jaGlwICopIGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwotCi0JaWYgKGNoaXApCi0JCXRwbV9jaGlwX3VucmVnaXN0ZXIoY2hpcCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotLyoKLSAqIHRwbV9zdG1faTJjX3BtX3N1c3BlbmQgc3VzcGVuZCB0aGUgVFBNIGRldmljZQotICogQHBhcmFtOiBjbGllbnQsIHRoZSBpMmNfY2xpZW50IGRyZXNjcmlwdGlvbiAoVFBNIEkyQyBkZXNjcmlwdGlvbikuCi0gKiBAcGFyYW06IG1lc2csIHRoZSBwb3dlciBtYW5hZ2VtZW50IG1lc3NhZ2UuCi0gKiBAcmV0dXJuOiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KLSAqLwotc3RhdGljIGludCB0cG1fc3RtX2kyY19wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc3QzM3pwMjRfcGxhdGZvcm1fZGF0YSAqcGluX2luZm9zID0gZGV2LT5wbGF0Zm9ybV9kYXRhOwotCWludCByZXQgPSAwOwotCi0JaWYgKGdwaW9faXNfdmFsaWQocGluX2luZm9zLT5pb19scGNwZCkpCi0JCWdwaW9fc2V0X3ZhbHVlKHBpbl9pbmZvcy0+aW9fbHBjcGQsIDApOwotCWVsc2UKLQkJcmV0ID0gdHBtX3BtX3N1c3BlbmQoZGV2KTsKLQotCXJldHVybiByZXQ7Ci19IC8qIHRwbV9zdG1faTJjX3N1c3BlbmQoKSAqLwotCi0vKgotICogdHBtX3N0bV9pMmNfcG1fcmVzdW1lIHJlc3VtZSB0aGUgVFBNIGRldmljZQotICogQHBhcmFtOiBjbGllbnQsIHRoZSBpMmNfY2xpZW50IGRyZXNjcmlwdGlvbiAoVFBNIEkyQyBkZXNjcmlwdGlvbikuCi0gKiBAcmV0dXJuOiAwIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KLSAqLwotc3RhdGljIGludCB0cG1fc3RtX2kyY19wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCB0cG1fY2hpcCAqY2hpcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzdDMzenAyNF9wbGF0Zm9ybV9kYXRhICpwaW5faW5mb3MgPSBkZXYtPnBsYXRmb3JtX2RhdGE7Ci0KLQlpbnQgcmV0ID0gMDsKLQotCWlmIChncGlvX2lzX3ZhbGlkKHBpbl9pbmZvcy0+aW9fbHBjcGQpKSB7Ci0JCWdwaW9fc2V0X3ZhbHVlKHBpbl9pbmZvcy0+aW9fbHBjcGQsIDEpOwotCQlyZXQgPSB3YWl0X2Zvcl9zdGF0KGNoaXAsCi0JCQkJVFBNX1NUU19WQUxJRCwgY2hpcC0+dmVuZG9yLnRpbWVvdXRfYiwKLQkJCQkmY2hpcC0+dmVuZG9yLnJlYWRfcXVldWUsIGZhbHNlKTsKLQl9IGVsc2UgewotCQlyZXQgPSB0cG1fcG1fcmVzdW1lKGRldik7Ci0JCWlmICghcmV0KQotCQkJdHBtX2RvX3NlbGZ0ZXN0KGNoaXApOwotCX0KLQlyZXR1cm4gcmV0OwotfSAvKiB0cG1fc3RtX2kyY19wbV9yZXN1bWUoKSAqLwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB0cG1fc3RtX2kyY19pZFtdID0gewotCXtUUE1fU1QzM19JMkMsIDB9LAotCXt9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHRwbV9zdG1faTJjX2lkKTsKLQotI2lmZGVmIENPTkZJR19PRgotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2Zfc3QzM3pwMjRfaTJjX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJzdCxzdDMzenAyNC1pMmMiLCB9LAotCXt9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb2Zfc3QzM3pwMjRfaTJjX21hdGNoKTsKLSNlbmRpZgotCi1zdGF0aWMgU0lNUExFX0RFVl9QTV9PUFModHBtX3N0bV9pMmNfb3BzLCB0cG1fc3RtX2kyY19wbV9zdXNwZW5kLAotCQkJIHRwbV9zdG1faTJjX3BtX3Jlc3VtZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciB0cG1fc3RtX2kyY19kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5uYW1lID0gVFBNX1NUMzNfSTJDLAotCQkucG0gPSAmdHBtX3N0bV9pMmNfb3BzLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIob2Zfc3QzM3pwMjRfaTJjX21hdGNoKSwKLQl9LAotCS5wcm9iZSA9IHRwbV9zdG1faTJjX3Byb2JlLAotCS5yZW1vdmUgPSB0cG1fc3RtX2kyY19yZW1vdmUsCi0JLmlkX3RhYmxlID0gdHBtX3N0bV9pMmNfaWQKLX07Ci0KLW1vZHVsZV9pMmNfZHJpdmVyKHRwbV9zdG1faTJjX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIkNocmlzdG9waGUgUmljYXJkICh0cG1zdXBwb3J0QHN0LmNvbSkiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiU1RNIFRQTSBJMkMgU1QzMyBEcml2ZXIiKTsKLU1PRFVMRV9WRVJTSU9OKCIxLjIuMSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3RwbS90cG1faW5maW5lb24uYyBiL2RyaXZlcnMvY2hhci90cG0vdHBtX2luZmluZW9uLmMKaW5kZXggNmQ0OTIxMy4uNmM0ODhlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG1faW5maW5lb24uYworKysgYi9kcml2ZXJzL2NoYXIvdHBtL3RwbV9pbmZpbmVvbi5jCkBAIC01OTEsMjcgKzU5MSw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IHRwbV9pbmZfcG5wX3N1c3BlbmQoc3RydWN0IHBucF9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHBtX3N0YXRlKQotewotCXN0cnVjdCB0cG1fY2hpcCAqY2hpcCA9IHBucF9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCByYzsKLQlpZiAoY2hpcCkgewotCQl1OCBzYXZlc3RhdGVbXSA9IHsKLQkJCTAsIDE5MywJLyogVFBNX1RBR19SUVVfQ09NTUFORCAqLwotCQkJMCwgMCwgMCwgMTAsCS8qIGJsb2IgbGVuZ3RoIChpbiBieXRlcykgKi8KLQkJCTAsIDAsIDAsIDE1MgkvKiBUUE1fT1JEX1NhdmVTdGF0ZSAqLwotCQl9OwotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJzYXZpbmcgVFBNIHN0YXRlXG4iKTsKLQkJcmMgPSB0cG1faW5mX3NlbmQoY2hpcCwgc2F2ZXN0YXRlLCBzaXplb2Yoc2F2ZXN0YXRlKSk7Ci0JCWlmIChyYyA8IDApIHsKLQkJCWRldl9lcnIoJmRldi0+ZGV2LCAiZXJyb3Igd2hpbGUgc2F2aW5nIFRQTSBzdGF0ZVxuIik7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdHBtX2luZl9wbnBfcmVzdW1lKHN0cnVjdCBwbnBfZGV2ICpkZXYpCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IHRwbV9pbmZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAkvKiBSZS1jb25maWd1cmUgVFBNIGFmdGVyIHN1c3BlbmRpbmcgKi8KIAl0cG1fY29uZmlnX291dChFTkFCTEVfUkVHSVNURVJfUEFJUiwgVFBNX0lORl9BRERSKTsKQEAgLTYyNSwzMCArNjA2LDIyIEBACiAJdHBtX2NvbmZpZ19vdXQoRElTQUJMRV9SRUdJU1RFUl9QQUlSLCBUUE1fSU5GX0FERFIpOwogCS8qIGRpc2FibGUgUkVTRVQsIExQIGFuZCBJUlFDICovCiAJdHBtX2RhdGFfb3V0KFJFU0VUX0xQX0lSUUNfRElTQUJMRSwgQ01EKTsKLQlyZXR1cm4gdHBtX3BtX3Jlc3VtZSgmZGV2LT5kZXYpOworCXJldHVybiB0cG1fcG1fcmVzdW1lKGRldik7CiB9CisjZW5kaWYKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyh0cG1faW5mX3BtLCB0cG1fcG1fc3VzcGVuZCwgdHBtX2luZl9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgdHBtX2luZl9wbnBfZHJpdmVyID0gewogCS5uYW1lID0gInRwbV9pbmZfcG5wIiwKIAkuaWRfdGFibGUgPSB0cG1faW5mX3BucF90YmwsCiAJLnByb2JlID0gdHBtX2luZl9wbnBfcHJvYmUsCi0JLnN1c3BlbmQgPSB0cG1faW5mX3BucF9zdXNwZW5kLAotCS5yZXN1bWUgPSB0cG1faW5mX3BucF9yZXN1bWUsCi0JLnJlbW92ZSA9IHRwbV9pbmZfcG5wX3JlbW92ZQorCS5yZW1vdmUgPSB0cG1faW5mX3BucF9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLnBtID0gJnRwbV9pbmZfcG0sCisJfQogfTsKIAotc3RhdGljIGludCBfX2luaXQgaW5pdF9pbmYodm9pZCkKLXsKLQlyZXR1cm4gcG5wX3JlZ2lzdGVyX2RyaXZlcigmdHBtX2luZl9wbnBfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfaW5mKHZvaWQpCi17Ci0JcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZ0cG1faW5mX3BucF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChpbml0X2luZik7Ci1tb2R1bGVfZXhpdChjbGVhbnVwX2luZik7Cittb2R1bGVfcG5wX2RyaXZlcih0cG1faW5mX3BucF9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJNYXJjZWwgU2VsaG9yc3QgPHRwbWRkQHNpcnJpeC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgSW5maW5lb24gVFBNIFNMRCA5NjMwIFRUIDEuMSAvIFNMQiA5NjM1IFRUIDEuMiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3ZpcnRpb19jb25zb2xlLmMgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwppbmRleCBmYWUyZGJiLi43MmQ3MDI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYworKysgYi9kcml2ZXJzL2NoYXIvdmlydGlvX2NvbnNvbGUuYwpAQCAtMTQyLDYgKzE0Miw3IEBACiAJICogbm90aWZpY2F0aW9uCiAJICovCiAJc3RydWN0IHdvcmtfc3RydWN0IGNvbnRyb2xfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY29uZmlnX3dvcms7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBvcnRzOwogCkBAIC0xODM3LDEwICsxODM4LDIxIEBACiAKIAlwb3J0ZGV2ID0gdmRldi0+cHJpdjsKIAorCWlmICghdXNlX211bHRpcG9ydChwb3J0ZGV2KSkKKwkJc2NoZWR1bGVfd29yaygmcG9ydGRldi0+Y29uZmlnX3dvcmspOworfQorCitzdGF0aWMgdm9pZCBjb25maWdfd29ya19oYW5kbGVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcG9ydHNfZGV2aWNlICpwb3J0ZGV2OworCisJcG9ydGRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcG9ydHNfZGV2aWNlLCBjb250cm9sX3dvcmspOwogCWlmICghdXNlX211bHRpcG9ydChwb3J0ZGV2KSkgeworCQlzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldjsKIAkJc3RydWN0IHBvcnQgKnBvcnQ7CiAJCXUxNiByb3dzLCBjb2xzOwogCisJCXZkZXYgPSBwb3J0ZGV2LT52ZGV2OwogCQl2aXJ0aW9fY3JlYWQodmRldiwgc3RydWN0IHZpcnRpb19jb25zb2xlX2NvbmZpZywgY29scywgJmNvbHMpOwogCQl2aXJ0aW9fY3JlYWQodmRldiwgc3RydWN0IHZpcnRpb19jb25zb2xlX2NvbmZpZywgcm93cywgJnJvd3MpOwogCkBAIC0yMDQwLDEyICsyMDUyLDE0IEBACiAKIAl2aXJ0aW9fZGV2aWNlX3JlYWR5KHBvcnRkZXYtPnZkZXYpOwogCisJSU5JVF9XT1JLKCZwb3J0ZGV2LT5jb25maWdfd29yaywgJmNvbmZpZ193b3JrX2hhbmRsZXIpOworCUlOSVRfV09SSygmcG9ydGRldi0+Y29udHJvbF93b3JrLCAmY29udHJvbF93b3JrX2hhbmRsZXIpOworCiAJaWYgKG11bHRpcG9ydCkgewogCQl1bnNpZ25lZCBpbnQgbnJfYWRkZWRfYnVmczsKIAogCQlzcGluX2xvY2tfaW5pdCgmcG9ydGRldi0+Y19pdnFfbG9jayk7CiAJCXNwaW5fbG9ja19pbml0KCZwb3J0ZGV2LT5jX292cV9sb2NrKTsKLQkJSU5JVF9XT1JLKCZwb3J0ZGV2LT5jb250cm9sX3dvcmssICZjb250cm9sX3dvcmtfaGFuZGxlcik7CiAKIAkJbnJfYWRkZWRfYnVmcyA9IGZpbGxfcXVldWUocG9ydGRldi0+Y19pdnEsCiAJCQkJCSAgICZwb3J0ZGV2LT5jX2l2cV9sb2NrKTsKQEAgLTIxMTMsNiArMjEyNyw4IEBACiAJLyogRmluaXNoIHVwIHdvcmsgdGhhdCdzIGxpbmVkIHVwICovCiAJaWYgKHVzZV9tdWx0aXBvcnQocG9ydGRldikpCiAJCWNhbmNlbF93b3JrX3N5bmMoJnBvcnRkZXYtPmNvbnRyb2xfd29yayk7CisJZWxzZQorCQljYW5jZWxfd29ya19zeW5jKCZwb3J0ZGV2LT5jb25maWdfd29yayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9ydCwgcG9ydDIsICZwb3J0ZGV2LT5wb3J0cywgbGlzdCkKIAkJdW5wbHVnX3BvcnQocG9ydCk7CkBAIC0yMTY0LDYgKzIxODAsNyBAQAogCiAJdmlydHF1ZXVlX2Rpc2FibGVfY2IocG9ydGRldi0+Y19pdnEpOwogCWNhbmNlbF93b3JrX3N5bmMoJnBvcnRkZXYtPmNvbnRyb2xfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmcG9ydGRldi0+Y29uZmlnX3dvcmspOwogCS8qCiAJICogT25jZSBtb3JlOiBpZiBjb250cm9sX3dvcmtfaGFuZGxlcigpIHdhcyBydW5uaW5nLCBpdCB3b3VsZAogCSAqIGVuYWJsZSB0aGUgY2IgYXMgdGhlIGxhc3Qgc3RlcC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvS2NvbmZpZwppbmRleCA2ODE2MWY3Li5hMGIwMzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL0tjb25maWcKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9LY29uZmlnCkBAIC0xOTIsNiArMTkyLDcgQEAKIGNvbmZpZyBTSF9USU1FUl9DTVQKIAlib29sICJSZW5lc2FzIENNVCB0aW1lciBkcml2ZXIiIGlmIENPTVBJTEVfVEVTVAogCWRlcGVuZHMgb24gR0VORVJJQ19DTE9DS0VWRU5UUworCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAJZGVmYXVsdCBTWVNfU1VQUE9SVFNfU0hfQ01UCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIGJ1aWxkIG9mIGEgY2xvY2tzb3VyY2UgYW5kIGNsb2NrZXZlbnQgZHJpdmVyIGZvcgpAQCAtMjAxLDYgKzIwMiw3IEBACiBjb25maWcgU0hfVElNRVJfTVRVMgogCWJvb2wgIlJlbmVzYXMgTVRVMiB0aW1lciBkcml2ZXIiIGlmIENPTVBJTEVfVEVTVAogCWRlcGVuZHMgb24gR0VORVJJQ19DTE9DS0VWRU5UUworCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAJZGVmYXVsdCBTWVNfU1VQUE9SVFNfU0hfTVRVMgogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyBidWlsZCBvZiBhIGNsb2NrZXZlbnQgZHJpdmVyIGZvciB0aGUgTXVsdGktRnVuY3Rpb24KQEAgLTIxMCw2ICsyMTIsNyBAQAogY29uZmlnIFNIX1RJTUVSX1RNVQogCWJvb2wgIlJlbmVzYXMgVE1VIHRpbWVyIGRyaXZlciIgaWYgQ09NUElMRV9URVNUCiAJZGVwZW5kcyBvbiBHRU5FUklDX0NMT0NLRVZFTlRTCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAlkZWZhdWx0IFNZU19TVVBQT1JUU19TSF9UTVUKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgYnVpbGQgb2YgYSBjbG9ja3NvdXJjZSBhbmQgY2xvY2tldmVudCBkcml2ZXIgZm9yCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FybV9hcmNoX3RpbWVyLmMKaW5kZXggYTMwMjVlNy4uMjY2NDY5NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hcm1fYXJjaF90aW1lci5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvYXJtX2FyY2hfdGltZXIuYwpAQCAtNjYxLDE3ICs2NjEsMTcgQEAKIH07CiAKIHN0YXRpYyBib29sIF9faW5pdAotYXJjaF90aW1lcl9wcm9iZWQoaW50IHR5cGUsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMpCithcmNoX3RpbWVyX25lZWRzX3Byb2JpbmcoaW50IHR5cGUsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoZXMpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpkbjsKLQlib29sIHByb2JlZCA9IHRydWU7CisJYm9vbCBuZWVkc19wcm9iaW5nID0gZmFsc2U7CiAKIAlkbiA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCBtYXRjaGVzKTsKIAlpZiAoZG4gJiYgb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShkbikgJiYgIShhcmNoX3RpbWVyc19wcmVzZW50ICYgdHlwZSkpCi0JCXByb2JlZCA9IGZhbHNlOworCQluZWVkc19wcm9iaW5nID0gdHJ1ZTsKIAlvZl9ub2RlX3B1dChkbik7CiAKLQlyZXR1cm4gcHJvYmVkOworCXJldHVybiBuZWVkc19wcm9iaW5nOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgYXJjaF90aW1lcl9jb21tb25faW5pdCh2b2lkKQpAQCAtNjgwLDkgKzY4MCw5IEBACiAKIAkvKiBXYWl0IHVudGlsIGJvdGggbm9kZXMgYXJlIHByb2JlZCBpZiB3ZSBoYXZlIHR3byB0aW1lcnMgKi8KIAlpZiAoKGFyY2hfdGltZXJzX3ByZXNlbnQgJiBtYXNrKSAhPSBtYXNrKSB7Ci0JCWlmICghYXJjaF90aW1lcl9wcm9iZWQoQVJDSF9NRU1fVElNRVIsIGFyY2hfdGltZXJfbWVtX29mX21hdGNoKSkKKwkJaWYgKGFyY2hfdGltZXJfbmVlZHNfcHJvYmluZyhBUkNIX01FTV9USU1FUiwgYXJjaF90aW1lcl9tZW1fb2ZfbWF0Y2gpKQogCQkJcmV0dXJuOwotCQlpZiAoIWFyY2hfdGltZXJfcHJvYmVkKEFSQ0hfQ1AxNV9USU1FUiwgYXJjaF90aW1lcl9vZl9tYXRjaCkpCisJCWlmIChhcmNoX3RpbWVyX25lZWRzX3Byb2JpbmcoQVJDSF9DUDE1X1RJTUVSLCBhcmNoX3RpbWVyX29mX21hdGNoKSkKIAkJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvZHdfYXBiX3RpbWVyX29mLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2R3X2FwYl90aW1lcl9vZi5jCmluZGV4IGQzMDVmYjAuLmExOWEzZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvZHdfYXBiX3RpbWVyX29mLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9kd19hcGJfdGltZXJfb2YuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiAKIHN0YXRpYyB1NjQgbm90cmFjZSByZWFkX3NjaGVkX2Nsb2NrKHZvaWQpCiB7Ci0JcmV0dXJuIH5fX3Jhd19yZWFkbChzY2hlZF9pb19iYXNlKTsKKwlyZXR1cm4gfnJlYWRsX3JlbGF4ZWQoc2NoZWRfaW9fYmFzZSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNwdGltZXJfaWRzW10gX19pbml0Y29uc3QgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2VtX3N0aS5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9lbV9zdGkuYwppbmRleCBkMGE3YmQ2Li5kYzNjNmVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2VtX3N0aS5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvZW1fc3RpLmMKQEAgLTIxMCw3ICsyMTAsNyBAQAogCiAJcmV0ID0gZW1fc3RpX3N0YXJ0KHAsIFVTRVJfQ0xPQ0tTT1VSQ0UpOwogCWlmICghcmV0KQotCQlfX2Nsb2Nrc291cmNlX3VwZGF0ZWZyZXFfaHooY3MsIHAtPnJhdGUpOworCQlfX2Nsb2Nrc291cmNlX3VwZGF0ZV9mcmVxX2h6KGNzLCBwLT5yYXRlKTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX2NtdC5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF9jbXQuYwppbmRleCAyYmQxM2I1Li5iOGZmM2M2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX2NtdC5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2hfY210LmMKQEAgLTY0MSw3ICs2NDEsNyBAQAogCiAJcmV0ID0gc2hfY210X3N0YXJ0KGNoLCBGTEFHX0NMT0NLU09VUkNFKTsKIAlpZiAoIXJldCkgewotCQlfX2Nsb2Nrc291cmNlX3VwZGF0ZWZyZXFfaHooY3MsIGNoLT5yYXRlKTsKKwkJX19jbG9ja3NvdXJjZV91cGRhdGVfZnJlcV9oeihjcywgY2gtPnJhdGUpOwogCQljaC0+Y3NfZW5hYmxlZCA9IHRydWU7CiAJfQogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX3RtdS5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF90bXUuYwppbmRleCBmMTUwY2E4Mi4uYjZiOGZhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9zaF90bXUuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3NoX3RtdS5jCkBAIC0yNzIsNyArMjcyLDcgQEAKIAogCXJldCA9IHNoX3RtdV9lbmFibGUoY2gpOwogCWlmICghcmV0KSB7Ci0JCV9fY2xvY2tzb3VyY2VfdXBkYXRlZnJlcV9oeihjcywgY2gtPnJhdGUpOworCQlfX2Nsb2Nrc291cmNlX3VwZGF0ZV9mcmVxX2h6KGNzLCBjaC0+cmF0ZSk7CiAJCWNoLT5jc19lbmFibGVkID0gdHJ1ZTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc3VuNGlfdGltZXIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc3VuNGlfdGltZXIuYwppbmRleCBmNGE5YzAwLi4xOTI4YTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3N1bjRpX3RpbWVyLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS9zdW40aV90aW1lci5jCkBAIC0xNzAsNyArMTcwLDE1IEBACiAJICAgICAgIFRJTUVSX0NUTF9DTEtfU1JDKFRJTUVSX0NUTF9DTEtfU1JDX09TQzI0TSksCiAJICAgICAgIHRpbWVyX2Jhc2UgKyBUSU1FUl9DVExfUkVHKDEpKTsKIAotCXNjaGVkX2Nsb2NrX3JlZ2lzdGVyKHN1bjRpX3RpbWVyX3NjaGVkX3JlYWQsIDMyLCByYXRlKTsKKwkvKgorCSAqIHNjaGVkX2Nsb2NrX3JlZ2lzdGVyIGRvZXMgbm90IGhhdmUgcHJpb3JpdGllcywgYW5kIG9uIHN1bjZpIGFuZAorCSAqIGxhdGVyIHRoZXJlIGlzIGEgYmV0dGVyIHNjaGVkX2Nsb2NrIHJlZ2lzdGVyZWQgYnkgYXJtX2FyY2hfdGltZXIuYworCSAqLworCWlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImFsbHdpbm5lcixzdW40aS1hMTAiKSB8fAorCSAgICBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImFsbHdpbm5lcixzdW41aS1hMTMiKSB8fAorCSAgICBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImFsbHdpbm5lcixzdW41aS1hMTBzIikpCisJCXNjaGVkX2Nsb2NrX3JlZ2lzdGVyKHN1bjRpX3RpbWVyX3NjaGVkX3JlYWQsIDMyLCByYXRlKTsKKwogCWNsb2Nrc291cmNlX21taW9faW5pdCh0aW1lcl9iYXNlICsgVElNRVJfQ05UVkFMX1JFRygxKSwgbm9kZS0+bmFtZSwKIAkJCSAgICAgIHJhdGUsIDM1MCwgMzIsIGNsb2Nrc291cmNlX21taW9fcmVhZGxfZG93bik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGVncmEyMF90aW1lci5jIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90ZWdyYTIwX3RpbWVyLmMKaW5kZXggZDI2MTZlZi4uNWExMTJkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS90ZWdyYTIwX3RpbWVyLmMKKysrIGIvZHJpdmVycy9jbG9ja3NvdXJjZS90ZWdyYTIwX3RpbWVyLmMKQEAgLTUxLDE1ICs1MSwxNSBAQAogc3RhdGljIHZvaWQgX19pb21lbSAqdGltZXJfcmVnX2Jhc2U7CiBzdGF0aWMgdm9pZCBfX2lvbWVtICpydGNfYmFzZTsKIAotc3RhdGljIHN0cnVjdCB0aW1lc3BlYyBwZXJzaXN0ZW50X3RzOworc3RhdGljIHN0cnVjdCB0aW1lc3BlYzY0IHBlcnNpc3RlbnRfdHM7CiBzdGF0aWMgdTY0IHBlcnNpc3RlbnRfbXMsIGxhc3RfcGVyc2lzdGVudF9tczsKIAogc3RhdGljIHN0cnVjdCBkZWxheV90aW1lciB0ZWdyYV9kZWxheV90aW1lcjsKIAogI2RlZmluZSB0aW1lcl93cml0ZWwodmFsdWUsIHJlZykgXAotCV9fcmF3X3dyaXRlbCh2YWx1ZSwgdGltZXJfcmVnX2Jhc2UgKyAocmVnKSkKKwl3cml0ZWxfcmVsYXhlZCh2YWx1ZSwgdGltZXJfcmVnX2Jhc2UgKyAocmVnKSkKICNkZWZpbmUgdGltZXJfcmVhZGwocmVnKSBcCi0JX19yYXdfcmVhZGwodGltZXJfcmVnX2Jhc2UgKyAocmVnKSkKKwlyZWFkbF9yZWxheGVkKHRpbWVyX3JlZ19iYXNlICsgKHJlZykpCiAKIHN0YXRpYyBpbnQgdGVncmFfdGltZXJfc2V0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBjeWNsZXMsCiAJCQkJCSBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCkBAIC0xMjAsMjYgKzEyMCwyNSBAQAogfQogCiAvKgotICogdGVncmFfcmVhZF9wZXJzaXN0ZW50X2Nsb2NrIC0gIFJldHVybiB0aW1lIGZyb20gYSBwZXJzaXN0ZW50IGNsb2NrLgorICogdGVncmFfcmVhZF9wZXJzaXN0ZW50X2Nsb2NrNjQgLSAgUmV0dXJuIHRpbWUgZnJvbSBhIHBlcnNpc3RlbnQgY2xvY2suCiAgKgogICogUmVhZHMgdGhlIHRpbWUgZnJvbSBhIHNvdXJjZSB3aGljaCBpc24ndCBkaXNhYmxlZCBkdXJpbmcgUE0sIHRoZQogICogMzJrIHN5bmMgdGltZXIuICBDb252ZXJ0IHRoZSBjeWNsZXMgZWxhcHNlZCBzaW5jZSBsYXN0IHJlYWQgaW50bwotICogbnNlY3MgYW5kIGFkZHMgdG8gYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdGltZXNwZWMuCisgKiBuc2VjcyBhbmQgYWRkcyB0byBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyB0aW1lc3BlYzY0LgogICogQ2FyZSBtdXN0IGJlIHRha2VuIHRoYXQgdGhpcyBmdW5jaXRvbiBpcyBub3QgY2FsbGVkIHdoaWxlIHRoZQogICogdGVncmFfcnRjIGRyaXZlciBjb3VsZCBiZSBleGVjdXRpbmcgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zCiAgKiBvbiB0aGUgUlRDIHNoYWRvdyByZWdpc3RlcgogICovCi1zdGF0aWMgdm9pZCB0ZWdyYV9yZWFkX3BlcnNpc3RlbnRfY2xvY2soc3RydWN0IHRpbWVzcGVjICp0cykKK3N0YXRpYyB2b2lkIHRlZ3JhX3JlYWRfcGVyc2lzdGVudF9jbG9jazY0KHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAl1NjQgZGVsdGE7Ci0Jc3RydWN0IHRpbWVzcGVjICp0c3AgPSAmcGVyc2lzdGVudF90czsKIAogCWxhc3RfcGVyc2lzdGVudF9tcyA9IHBlcnNpc3RlbnRfbXM7CiAJcGVyc2lzdGVudF9tcyA9IHRlZ3JhX3J0Y19yZWFkX21zKCk7CiAJZGVsdGEgPSBwZXJzaXN0ZW50X21zIC0gbGFzdF9wZXJzaXN0ZW50X21zOwogCi0JdGltZXNwZWNfYWRkX25zKHRzcCwgZGVsdGEgKiBOU0VDX1BFUl9NU0VDKTsKLQkqdHMgPSAqdHNwOworCXRpbWVzcGVjNjRfYWRkX25zKCZwZXJzaXN0ZW50X3RzLCBkZWx0YSAqIE5TRUNfUEVSX01TRUMpOworCSp0cyA9IHBlcnNpc3RlbnRfdHM7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRlZ3JhX2RlbGF5X3RpbWVyX3JlYWRfY291bnRlcl9sb25nKHZvaWQpCkBAIC0yNTIsNyArMjUxLDcgQEAKIAllbHNlCiAJCWNsa19wcmVwYXJlX2VuYWJsZShjbGspOwogCi0JcmVnaXN0ZXJfcGVyc2lzdGVudF9jbG9jayhOVUxMLCB0ZWdyYV9yZWFkX3BlcnNpc3RlbnRfY2xvY2spOworCXJlZ2lzdGVyX3BlcnNpc3RlbnRfY2xvY2soTlVMTCwgdGVncmFfcmVhZF9wZXJzaXN0ZW50X2Nsb2NrNjQpOwogfQogQ0xPQ0tTT1VSQ0VfT0ZfREVDTEFSRSh0ZWdyYTIwX3J0YywgIm52aWRpYSx0ZWdyYTIwLXJ0YyIsIHRlZ3JhMjBfaW5pdF9ydGMpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWUtZWZtMzIuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1lZm0zMi5jCmluZGV4IGJiYTYyZjkuLjViNmUzZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1lZm0zMi5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZS1lZm0zMi5jCkBAIC0xMTEsNyArMTExLDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZWZtMzJfY2xvY2tfZXZlbnRfZGRhdGEgY2xvY2tfZXZlbnRfZGRhdGEgPSB7CiAJLmV2dGRldiA9IHsKIAkJLm5hbWUgPSAiZWZtMzIgY2xvY2tldmVudCIsCi0JCS5mZWF0dXJlcyA9IENMT0NLX0VWVF9GRUFUX09ORVNIT1QgfCBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQywKKwkJLmZlYXR1cmVzID0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCB8IENMT0NLX0VWVF9GRUFUX1BFUklPRElDLAogCQkuc2V0X21vZGUgPSBlZm0zMl9jbG9ja19ldmVudF9zZXRfbW9kZSwKIAkJLnNldF9uZXh0X2V2ZW50ID0gZWZtMzJfY2xvY2tfZXZlbnRfc2V0X25leHRfZXZlbnQsCiAJCS5yYXRpbmcgPSAyMDAsCkBAIC0yMjUsMTIgKzIyNSwxMiBAQAogCWNsb2NrX2V2ZW50X2RkYXRhLmJhc2UgPSBiYXNlOwogCWNsb2NrX2V2ZW50X2RkYXRhLnBlcmlvZGljX3RvcCA9IERJVl9ST1VORF9DTE9TRVNUKHJhdGUsIDEwMjQgKiBIWik7CiAKLQlzZXR1cF9pcnEoaXJxLCAmZWZtMzJfY2xvY2tfZXZlbnRfaXJxKTsKLQogCWNsb2NrZXZlbnRzX2NvbmZpZ19hbmRfcmVnaXN0ZXIoJmNsb2NrX2V2ZW50X2RkYXRhLmV2dGRldiwKIAkJCQkJRElWX1JPVU5EX0NMT1NFU1QocmF0ZSwgMTAyNCksCiAJCQkJCTB4ZiwgMHhmZmZmKTsKIAorCXNldHVwX2lycShpcnEsICZlZm0zMl9jbG9ja19ldmVudF9pcnEpOworCiAJcmV0dXJuIDA7CiAKIGVycl9nZXRfaXJxOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci1hdG1lbC1waXQuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItYXRtZWwtcGl0LmMKaW5kZXggYjViNGQ0NS4uYzAzMDRmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci1hdG1lbC1waXQuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLWF0bWVsLXBpdC5jCkBAIC02MSwxMiArNjEsMTIgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGl0X3JlYWQodm9pZCBfX2lvbWVtICpiYXNlLCB1bnNpZ25lZCBpbnQgcmVnX29mZnNldCkKIHsKLQlyZXR1cm4gX19yYXdfcmVhZGwoYmFzZSArIHJlZ19vZmZzZXQpOworCXJldHVybiByZWFkbF9yZWxheGVkKGJhc2UgKyByZWdfb2Zmc2V0KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHBpdF93cml0ZSh2b2lkIF9faW9tZW0gKmJhc2UsIHVuc2lnbmVkIGludCByZWdfb2Zmc2V0LCB1bnNpZ25lZCBsb25nIHZhbHVlKQogewotCV9fcmF3X3dyaXRlbCh2YWx1ZSwgYmFzZSArIHJlZ19vZmZzZXQpOworCXdyaXRlbF9yZWxheGVkKHZhbHVlLCBiYXNlICsgcmVnX29mZnNldCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLXN1bjVpLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RpbWVyLXN1bjVpLmMKaW5kZXggMDIyNjg0NC4uMjhhYTRiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS90aW1lci1zdW41aS5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvdGltZXItc3VuNWkuYwpAQCAtMTcsNyArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L2lycXJldHVybi5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWRfY2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CkBAIC0zNyw4ICszNywzMSBAQAogCiAjZGVmaW5lIFRJTUVSX1NZTkNfVElDS1MJMwogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICp0aW1lcl9iYXNlOwotc3RhdGljIHUzMiB0aWNrc19wZXJfamlmZnk7CitzdHJ1Y3Qgc3VuNWlfdGltZXIgeworCXZvaWQgX19pb21lbQkJKmJhc2U7CisJc3RydWN0IGNsawkJKmNsazsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJY2xrX3JhdGVfY2I7CisJdTMyCQkJdGlja3NfcGVyX2ppZmZ5OworfTsKKworI2RlZmluZSB0b19zdW41aV90aW1lcih4KSBcCisJY29udGFpbmVyX29mKHgsIHN0cnVjdCBzdW41aV90aW1lciwgY2xrX3JhdGVfY2IpCisKK3N0cnVjdCBzdW41aV90aW1lcl9jbGtzcmMgeworCXN0cnVjdCBzdW41aV90aW1lcgl0aW1lcjsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UJY2xrc3JjOworfTsKKworI2RlZmluZSB0b19zdW41aV90aW1lcl9jbGtzcmMoeCkgXAorCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3Qgc3VuNWlfdGltZXJfY2xrc3JjLCBjbGtzcmMpCisKK3N0cnVjdCBzdW41aV90aW1lcl9jbGtldnQgeworCXN0cnVjdCBzdW41aV90aW1lcgkJdGltZXI7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZQljbGtldnQ7Cit9OworCisjZGVmaW5lIHRvX3N1bjVpX3RpbWVyX2Nsa2V2dCh4KSBcCisJY29udGFpbmVyX29mKHgsIHN0cnVjdCBzdW41aV90aW1lcl9jbGtldnQsIGNsa2V2dCkKIAogLyoKICAqIFdoZW4gd2UgZGlzYWJsZSBhIHRpbWVyLCB3ZSBuZWVkIHRvIHdhaXQgYXQgbGVhc3QgZm9yIDIgY3ljbGVzIG9mCkBAIC00NiwzMCArNjksMzAgQEAKICAqIHRoYXQgaXMgYWxyZWFkeSBzZXR1cCBhbmQgcnVucyBhdCB0aGUgc2FtZSBmcmVxdWVuY3kgdGhhbiB0aGUgb3RoZXIKICAqIHRpbWVycywgYW5kIHdlIG5ldmVyIHdpbGwgYmUgZGlzYWJsZWQuCiAgKi8KLXN0YXRpYyB2b2lkIHN1bjVpX2Nsa2V2dF9zeW5jKHZvaWQpCitzdGF0aWMgdm9pZCBzdW41aV9jbGtldnRfc3luYyhzdHJ1Y3Qgc3VuNWlfdGltZXJfY2xrZXZ0ICpjZSkKIHsKLQl1MzIgb2xkID0gcmVhZGwodGltZXJfYmFzZSArIFRJTUVSX0NOVFZBTF9MT19SRUcoMSkpOworCXUzMiBvbGQgPSByZWFkbChjZS0+dGltZXIuYmFzZSArIFRJTUVSX0NOVFZBTF9MT19SRUcoMSkpOwogCi0Jd2hpbGUgKChvbGQgLSByZWFkbCh0aW1lcl9iYXNlICsgVElNRVJfQ05UVkFMX0xPX1JFRygxKSkpIDwgVElNRVJfU1lOQ19USUNLUykKKwl3aGlsZSAoKG9sZCAtIHJlYWRsKGNlLT50aW1lci5iYXNlICsgVElNRVJfQ05UVkFMX0xPX1JFRygxKSkpIDwgVElNRVJfU1lOQ19USUNLUykKIAkJY3B1X3JlbGF4KCk7CiB9CiAKLXN0YXRpYyB2b2lkIHN1bjVpX2Nsa2V2dF90aW1lX3N0b3AodTggdGltZXIpCitzdGF0aWMgdm9pZCBzdW41aV9jbGtldnRfdGltZV9zdG9wKHN0cnVjdCBzdW41aV90aW1lcl9jbGtldnQgKmNlLCB1OCB0aW1lcikKIHsKLQl1MzIgdmFsID0gcmVhZGwodGltZXJfYmFzZSArIFRJTUVSX0NUTF9SRUcodGltZXIpKTsKLQl3cml0ZWwodmFsICYgflRJTUVSX0NUTF9FTkFCTEUsIHRpbWVyX2Jhc2UgKyBUSU1FUl9DVExfUkVHKHRpbWVyKSk7CisJdTMyIHZhbCA9IHJlYWRsKGNlLT50aW1lci5iYXNlICsgVElNRVJfQ1RMX1JFRyh0aW1lcikpOworCXdyaXRlbCh2YWwgJiB+VElNRVJfQ1RMX0VOQUJMRSwgY2UtPnRpbWVyLmJhc2UgKyBUSU1FUl9DVExfUkVHKHRpbWVyKSk7CiAKLQlzdW41aV9jbGtldnRfc3luYygpOworCXN1bjVpX2Nsa2V2dF9zeW5jKGNlKTsKIH0KIAotc3RhdGljIHZvaWQgc3VuNWlfY2xrZXZ0X3RpbWVfc2V0dXAodTggdGltZXIsIHUzMiBkZWxheSkKK3N0YXRpYyB2b2lkIHN1bjVpX2Nsa2V2dF90aW1lX3NldHVwKHN0cnVjdCBzdW41aV90aW1lcl9jbGtldnQgKmNlLCB1OCB0aW1lciwgdTMyIGRlbGF5KQogewotCXdyaXRlbChkZWxheSwgdGltZXJfYmFzZSArIFRJTUVSX0lOVFZBTF9MT19SRUcodGltZXIpKTsKKwl3cml0ZWwoZGVsYXksIGNlLT50aW1lci5iYXNlICsgVElNRVJfSU5UVkFMX0xPX1JFRyh0aW1lcikpOwogfQogCi1zdGF0aWMgdm9pZCBzdW41aV9jbGtldnRfdGltZV9zdGFydCh1OCB0aW1lciwgYm9vbCBwZXJpb2RpYykKK3N0YXRpYyB2b2lkIHN1bjVpX2Nsa2V2dF90aW1lX3N0YXJ0KHN0cnVjdCBzdW41aV90aW1lcl9jbGtldnQgKmNlLCB1OCB0aW1lciwgYm9vbCBwZXJpb2RpYykKIHsKLQl1MzIgdmFsID0gcmVhZGwodGltZXJfYmFzZSArIFRJTUVSX0NUTF9SRUcodGltZXIpKTsKKwl1MzIgdmFsID0gcmVhZGwoY2UtPnRpbWVyLmJhc2UgKyBUSU1FUl9DVExfUkVHKHRpbWVyKSk7CiAKIAlpZiAocGVyaW9kaWMpCiAJCXZhbCAmPSB+VElNRVJfQ1RMX09ORVNIT1Q7CkBAIC03Nyw4MCArMTAwLDIzMCBAQAogCQl2YWwgfD0gVElNRVJfQ1RMX09ORVNIT1Q7CiAKIAl3cml0ZWwodmFsIHwgVElNRVJfQ1RMX0VOQUJMRSB8IFRJTUVSX0NUTF9SRUxPQUQsCi0JICAgICAgIHRpbWVyX2Jhc2UgKyBUSU1FUl9DVExfUkVHKHRpbWVyKSk7CisJICAgICAgIGNlLT50aW1lci5iYXNlICsgVElNRVJfQ1RMX1JFRyh0aW1lcikpOwogfQogCiBzdGF0aWMgdm9pZCBzdW41aV9jbGtldnRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKLQkJCSAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsaykKKwkJCSAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsa2V2dCkKIHsKKwlzdHJ1Y3Qgc3VuNWlfdGltZXJfY2xrZXZ0ICpjZSA9IHRvX3N1bjVpX3RpbWVyX2Nsa2V2dChjbGtldnQpOworCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKLQkJc3VuNWlfY2xrZXZ0X3RpbWVfc3RvcCgwKTsKLQkJc3VuNWlfY2xrZXZ0X3RpbWVfc2V0dXAoMCwgdGlja3NfcGVyX2ppZmZ5KTsKLQkJc3VuNWlfY2xrZXZ0X3RpbWVfc3RhcnQoMCwgdHJ1ZSk7CisJCXN1bjVpX2Nsa2V2dF90aW1lX3N0b3AoY2UsIDApOworCQlzdW41aV9jbGtldnRfdGltZV9zZXR1cChjZSwgMCwgY2UtPnRpbWVyLnRpY2tzX3Blcl9qaWZmeSk7CisJCXN1bjVpX2Nsa2V2dF90aW1lX3N0YXJ0KGNlLCAwLCB0cnVlKTsKIAkJYnJlYWs7CiAJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgotCQlzdW41aV9jbGtldnRfdGltZV9zdG9wKDApOwotCQlzdW41aV9jbGtldnRfdGltZV9zdGFydCgwLCBmYWxzZSk7CisJCXN1bjVpX2Nsa2V2dF90aW1lX3N0b3AoY2UsIDApOworCQlzdW41aV9jbGtldnRfdGltZV9zdGFydChjZSwgMCwgZmFsc2UpOwogCQlicmVhazsKIAljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKIAljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgogCWRlZmF1bHQ6Ci0JCXN1bjVpX2Nsa2V2dF90aW1lX3N0b3AoMCk7CisJCXN1bjVpX2Nsa2V2dF90aW1lX3N0b3AoY2UsIDApOwogCQlicmVhazsKIAl9CiB9CiAKIHN0YXRpYyBpbnQgc3VuNWlfY2xrZXZ0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBldnQsCi0JCQkJICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqdW51c2VkKQorCQkJCSAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNsa2V2dCkKIHsKLQlzdW41aV9jbGtldnRfdGltZV9zdG9wKDApOwotCXN1bjVpX2Nsa2V2dF90aW1lX3NldHVwKDAsIGV2dCAtIFRJTUVSX1NZTkNfVElDS1MpOwotCXN1bjVpX2Nsa2V2dF90aW1lX3N0YXJ0KDAsIGZhbHNlKTsKKwlzdHJ1Y3Qgc3VuNWlfdGltZXJfY2xrZXZ0ICpjZSA9IHRvX3N1bjVpX3RpbWVyX2Nsa2V2dChjbGtldnQpOworCisJc3VuNWlfY2xrZXZ0X3RpbWVfc3RvcChjZSwgMCk7CisJc3VuNWlfY2xrZXZ0X3RpbWVfc2V0dXAoY2UsIDAsIGV2dCAtIFRJTUVSX1NZTkNfVElDS1MpOworCXN1bjVpX2Nsa2V2dF90aW1lX3N0YXJ0KGNlLCAwLCBmYWxzZSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2Ugc3VuNWlfY2xvY2tldmVudCA9IHsKLQkubmFtZSA9ICJzdW41aV90aWNrIiwKLQkucmF0aW5nID0gMzQwLAotCS5mZWF0dXJlcyA9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKLQkuc2V0X21vZGUgPSBzdW41aV9jbGtldnRfbW9kZSwKLQkuc2V0X25leHRfZXZlbnQgPSBzdW41aV9jbGtldnRfbmV4dF9ldmVudCwKLX07Ci0KLQogc3RhdGljIGlycXJldHVybl90IHN1bjVpX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0Jc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IHN1bjVpX3RpbWVyX2Nsa2V2dCAqY2UgPSAoc3RydWN0IHN1bjVpX3RpbWVyX2Nsa2V2dCAqKWRldl9pZDsKIAotCXdyaXRlbCgweDEsIHRpbWVyX2Jhc2UgKyBUSU1FUl9JUlFfU1RfUkVHKTsKLQlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKKwl3cml0ZWwoMHgxLCBjZS0+dGltZXIuYmFzZSArIFRJTUVSX0lSUV9TVF9SRUcpOworCWNlLT5jbGtldnQuZXZlbnRfaGFuZGxlcigmY2UtPmNsa2V2dCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHN1bjVpX3RpbWVyX2lycSA9IHsKLQkubmFtZSA9ICJzdW41aV90aW1lcjAiLAotCS5mbGFncyA9IElSUUZfVElNRVIgfCBJUlFGX0lSUVBPTEwsCi0JLmhhbmRsZXIgPSBzdW41aV90aW1lcl9pbnRlcnJ1cHQsCi0JLmRldl9pZCA9ICZzdW41aV9jbG9ja2V2ZW50LAotfTsKLQotc3RhdGljIHU2NCBzdW41aV90aW1lcl9zY2hlZF9yZWFkKHZvaWQpCitzdGF0aWMgY3ljbGVfdCBzdW41aV9jbGtzcmNfcmVhZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNsa3NyYykKIHsKLQlyZXR1cm4gfnJlYWRsKHRpbWVyX2Jhc2UgKyBUSU1FUl9DTlRWQUxfTE9fUkVHKDEpKTsKKwlzdHJ1Y3Qgc3VuNWlfdGltZXJfY2xrc3JjICpjcyA9IHRvX3N1bjVpX3RpbWVyX2Nsa3NyYyhjbGtzcmMpOworCisJcmV0dXJuIH5yZWFkbChjcy0+dGltZXIuYmFzZSArIFRJTUVSX0NOVFZBTF9MT19SRUcoMSkpOworfQorCitzdGF0aWMgaW50IHN1bjVpX3JhdGVfY2JfY2xrc3JjKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2xrX25vdGlmaWVyX2RhdGEgKm5kYXRhID0gZGF0YTsKKwlzdHJ1Y3Qgc3VuNWlfdGltZXIgKnRpbWVyID0gdG9fc3VuNWlfdGltZXIobmIpOworCXN0cnVjdCBzdW41aV90aW1lcl9jbGtzcmMgKmNzID0gY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3Qgc3VuNWlfdGltZXJfY2xrc3JjLCB0aW1lcik7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBQUkVfUkFURV9DSEFOR0U6CisJCWNsb2Nrc291cmNlX3VucmVnaXN0ZXIoJmNzLT5jbGtzcmMpOworCQlicmVhazsKKworCWNhc2UgUE9TVF9SQVRFX0NIQU5HRToKKwkJY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmNzLT5jbGtzcmMsIG5kYXRhLT5uZXdfcmF0ZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzdW41aV9zZXR1cF9jbG9ja3NvdXJjZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJCSAgdm9pZCBfX2lvbWVtICpiYXNlLAorCQkJCQkgIHN0cnVjdCBjbGsgKmNsaywgaW50IGlycSkKK3sKKwlzdHJ1Y3Qgc3VuNWlfdGltZXJfY2xrc3JjICpjczsKKwl1bnNpZ25lZCBsb25nIHJhdGU7CisJaW50IHJldDsKKworCWNzID0ga3phbGxvYyhzaXplb2YoKmNzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiQ291bGRuJ3QgZW5hYmxlIHBhcmVudCBjbG9ja1xuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGspOworCisJY3MtPnRpbWVyLmJhc2UgPSBiYXNlOworCWNzLT50aW1lci5jbGsgPSBjbGs7CisJY3MtPnRpbWVyLmNsa19yYXRlX2NiLm5vdGlmaWVyX2NhbGwgPSBzdW41aV9yYXRlX2NiX2Nsa3NyYzsKKwljcy0+dGltZXIuY2xrX3JhdGVfY2IubmV4dCA9IE5VTEw7CisKKwlyZXQgPSBjbGtfbm90aWZpZXJfcmVnaXN0ZXIoY2xrLCAmY3MtPnRpbWVyLmNsa19yYXRlX2NiKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIGNsb2NrIG5vdGlmaWVyLlxuIik7CisJCWdvdG8gZXJyX2Rpc2FibGVfY2xrOworCX0KKworCXdyaXRlbCh+MCwgYmFzZSArIFRJTUVSX0lOVFZBTF9MT19SRUcoMSkpOworCXdyaXRlbChUSU1FUl9DVExfRU5BQkxFIHwgVElNRVJfQ1RMX1JFTE9BRCwKKwkgICAgICAgYmFzZSArIFRJTUVSX0NUTF9SRUcoMSkpOworCisJY3MtPmNsa3NyYy5uYW1lID0gbm9kZS0+bmFtZTsKKwljcy0+Y2xrc3JjLnJhdGluZyA9IDM0MDsKKwljcy0+Y2xrc3JjLnJlYWQgPSBzdW41aV9jbGtzcmNfcmVhZDsKKwljcy0+Y2xrc3JjLm1hc2sgPSBDTE9DS1NPVVJDRV9NQVNLKDMyKTsKKwljcy0+Y2xrc3JjLmZsYWdzID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVM7CisKKwlyZXQgPSBjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY3MtPmNsa3NyYywgcmF0ZSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIkNvdWxkbid0IHJlZ2lzdGVyIGNsb2NrIHNvdXJjZS5cbiIpOworCQlnb3RvIGVycl9yZW1vdmVfbm90aWZpZXI7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9yZW1vdmVfbm90aWZpZXI6CisJY2xrX25vdGlmaWVyX3VucmVnaXN0ZXIoY2xrLCAmY3MtPnRpbWVyLmNsa19yYXRlX2NiKTsKK2Vycl9kaXNhYmxlX2NsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY2xrKTsKK2Vycl9mcmVlOgorCWtmcmVlKGNzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHN1bjVpX3JhdGVfY2JfY2xrZXZ0KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2xrX25vdGlmaWVyX2RhdGEgKm5kYXRhID0gZGF0YTsKKwlzdHJ1Y3Qgc3VuNWlfdGltZXIgKnRpbWVyID0gdG9fc3VuNWlfdGltZXIobmIpOworCXN0cnVjdCBzdW41aV90aW1lcl9jbGtldnQgKmNlID0gY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3Qgc3VuNWlfdGltZXJfY2xrZXZ0LCB0aW1lcik7CisKKwlpZiAoZXZlbnQgPT0gUE9TVF9SQVRFX0NIQU5HRSkgeworCQljbG9ja2V2ZW50c191cGRhdGVfZnJlcSgmY2UtPmNsa2V2dCwgbmRhdGEtPm5ld19yYXRlKTsKKwkJY2UtPnRpbWVyLnRpY2tzX3Blcl9qaWZmeSA9IERJVl9ST1VORF9VUChuZGF0YS0+bmV3X3JhdGUsIEhaKTsKKwl9CisKKwlyZXR1cm4gTk9USUZZX0RPTkU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHN1bjVpX3NldHVwX2Nsb2NrZXZlbnQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLCB2b2lkIF9faW9tZW0gKmJhc2UsCisJCQkJCSBzdHJ1Y3QgY2xrICpjbGssIGludCBpcnEpCit7CisJc3RydWN0IHN1bjVpX3RpbWVyX2Nsa2V2dCAqY2U7CisJdW5zaWduZWQgbG9uZyByYXRlOworCWludCByZXQ7CisJdTMyIHZhbDsKKworCWNlID0ga3phbGxvYyhzaXplb2YoKmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoY2xrKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiQ291bGRuJ3QgZW5hYmxlIHBhcmVudCBjbG9ja1xuIik7CisJCWdvdG8gZXJyX2ZyZWU7CisJfQorCisJcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGspOworCisJY2UtPnRpbWVyLmJhc2UgPSBiYXNlOworCWNlLT50aW1lci50aWNrc19wZXJfamlmZnkgPSBESVZfUk9VTkRfVVAocmF0ZSwgSFopOworCWNlLT50aW1lci5jbGsgPSBjbGs7CisJY2UtPnRpbWVyLmNsa19yYXRlX2NiLm5vdGlmaWVyX2NhbGwgPSBzdW41aV9yYXRlX2NiX2Nsa2V2dDsKKwljZS0+dGltZXIuY2xrX3JhdGVfY2IubmV4dCA9IE5VTEw7CisKKwlyZXQgPSBjbGtfbm90aWZpZXJfcmVnaXN0ZXIoY2xrLCAmY2UtPnRpbWVyLmNsa19yYXRlX2NiKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIGNsb2NrIG5vdGlmaWVyLlxuIik7CisJCWdvdG8gZXJyX2Rpc2FibGVfY2xrOworCX0KKworCWNlLT5jbGtldnQubmFtZSA9IG5vZGUtPm5hbWU7CisJY2UtPmNsa2V2dC5mZWF0dXJlcyA9IENMT0NLX0VWVF9GRUFUX1BFUklPRElDIHwgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVDsKKwljZS0+Y2xrZXZ0LnNldF9uZXh0X2V2ZW50ID0gc3VuNWlfY2xrZXZ0X25leHRfZXZlbnQ7CisJY2UtPmNsa2V2dC5zZXRfbW9kZSA9IHN1bjVpX2Nsa2V2dF9tb2RlOworCWNlLT5jbGtldnQucmF0aW5nID0gMzQwOworCWNlLT5jbGtldnQuaXJxID0gaXJxOworCWNlLT5jbGtldnQuY3B1bWFzayA9IGNwdV9wb3NzaWJsZV9tYXNrOworCisJLyogRW5hYmxlIHRpbWVyMCBpbnRlcnJ1cHQgKi8KKwl2YWwgPSByZWFkbChiYXNlICsgVElNRVJfSVJRX0VOX1JFRyk7CisJd3JpdGVsKHZhbCB8IFRJTUVSX0lSUV9FTigwKSwgYmFzZSArIFRJTUVSX0lSUV9FTl9SRUcpOworCisJY2xvY2tldmVudHNfY29uZmlnX2FuZF9yZWdpc3RlcigmY2UtPmNsa2V2dCwgcmF0ZSwKKwkJCQkJVElNRVJfU1lOQ19USUNLUywgMHhmZmZmZmZmZik7CisKKwlyZXQgPSByZXF1ZXN0X2lycShpcnEsIHN1bjVpX3RpbWVyX2ludGVycnVwdCwgSVJRRl9USU1FUiB8IElSUUZfSVJRUE9MTCwKKwkJCSAgInN1bjVpX3RpbWVyMCIsIGNlKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIGludGVycnVwdFxuIik7CisJCWdvdG8gZXJyX3JlbW92ZV9ub3RpZmllcjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX3JlbW92ZV9ub3RpZmllcjoKKwljbGtfbm90aWZpZXJfdW5yZWdpc3RlcihjbGssICZjZS0+dGltZXIuY2xrX3JhdGVfY2IpOworZXJyX2Rpc2FibGVfY2xrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShjbGspOworZXJyX2ZyZWU6CisJa2ZyZWUoY2UpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzdW41aV90aW1lcl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKIHsKIAlzdHJ1Y3QgcmVzZXRfY29udHJvbCAqcnN0YzsKLQl1bnNpZ25lZCBsb25nIHJhdGU7CisJdm9pZCBfX2lvbWVtICp0aW1lcl9iYXNlOwogCXN0cnVjdCBjbGsgKmNsazsKLQlpbnQgcmV0LCBpcnE7Ci0JdTMyIHZhbDsKKwlpbnQgaXJxOwogCi0JdGltZXJfYmFzZSA9IG9mX2lvbWFwKG5vZGUsIDApOworCXRpbWVyX2Jhc2UgPSBvZl9pb19yZXF1ZXN0X2FuZF9tYXAobm9kZSwgMCwgb2Zfbm9kZV9mdWxsX25hbWUobm9kZSkpOwogCWlmICghdGltZXJfYmFzZSkKIAkJcGFuaWMoIkNhbid0IG1hcCByZWdpc3RlcnMiKTsKIApAQCAtMTYxLDM2ICszMzQsMTMgQEAKIAljbGsgPSBvZl9jbGtfZ2V0KG5vZGUsIDApOwogCWlmIChJU19FUlIoY2xrKSkKIAkJcGFuaWMoIkNhbid0IGdldCB0aW1lciBjbG9jayIpOwotCWNsa19wcmVwYXJlX2VuYWJsZShjbGspOwotCXJhdGUgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKIAogCXJzdGMgPSBvZl9yZXNldF9jb250cm9sX2dldChub2RlLCBOVUxMKTsKIAlpZiAoIUlTX0VSUihyc3RjKSkKIAkJcmVzZXRfY29udHJvbF9kZWFzc2VydChyc3RjKTsKIAotCXdyaXRlbCh+MCwgdGltZXJfYmFzZSArIFRJTUVSX0lOVFZBTF9MT19SRUcoMSkpOwotCXdyaXRlbChUSU1FUl9DVExfRU5BQkxFIHwgVElNRVJfQ1RMX1JFTE9BRCwKLQkgICAgICAgdGltZXJfYmFzZSArIFRJTUVSX0NUTF9SRUcoMSkpOwotCi0Jc2NoZWRfY2xvY2tfcmVnaXN0ZXIoc3VuNWlfdGltZXJfc2NoZWRfcmVhZCwgMzIsIHJhdGUpOwotCWNsb2Nrc291cmNlX21taW9faW5pdCh0aW1lcl9iYXNlICsgVElNRVJfQ05UVkFMX0xPX1JFRygxKSwgbm9kZS0+bmFtZSwKLQkJCSAgICAgIHJhdGUsIDM0MCwgMzIsIGNsb2Nrc291cmNlX21taW9fcmVhZGxfZG93bik7Ci0KLQl0aWNrc19wZXJfamlmZnkgPSBESVZfUk9VTkRfVVAocmF0ZSwgSFopOwotCi0JcmV0ID0gc2V0dXBfaXJxKGlycSwgJnN1bjVpX3RpbWVyX2lycSk7Ci0JaWYgKHJldCkKLQkJcHJfd2FybigiZmFpbGVkIHRvIHNldHVwIGlycSAlZFxuIiwgaXJxKTsKLQotCS8qIEVuYWJsZSB0aW1lcjAgaW50ZXJydXB0ICovCi0JdmFsID0gcmVhZGwodGltZXJfYmFzZSArIFRJTUVSX0lSUV9FTl9SRUcpOwotCXdyaXRlbCh2YWwgfCBUSU1FUl9JUlFfRU4oMCksIHRpbWVyX2Jhc2UgKyBUSU1FUl9JUlFfRU5fUkVHKTsKLQotCXN1bjVpX2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdV9wb3NzaWJsZV9tYXNrOwotCXN1bjVpX2Nsb2NrZXZlbnQuaXJxID0gaXJxOwotCi0JY2xvY2tldmVudHNfY29uZmlnX2FuZF9yZWdpc3Rlcigmc3VuNWlfY2xvY2tldmVudCwgcmF0ZSwKLQkJCQkJVElNRVJfU1lOQ19USUNLUywgMHhmZmZmZmZmZik7CisJc3VuNWlfc2V0dXBfY2xvY2tzb3VyY2Uobm9kZSwgdGltZXJfYmFzZSwgY2xrLCBpcnEpOworCXN1bjVpX3NldHVwX2Nsb2NrZXZlbnQobm9kZSwgdGltZXJfYmFzZSwgY2xrLCBpcnEpOwogfQogQ0xPQ0tTT1VSQ0VfT0ZfREVDTEFSRShzdW41aV9hMTMsICJhbGx3aW5uZXIsc3VuNWktYTEzLWhzdGltZXIiLAogCQkgICAgICAgc3VuNWlfdGltZXJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCmluZGV4IGExNzFmZWYuLjY1OTg3OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnCkBAIC0yOTMsNSArMjkzLDEzIEBACiAJICBJZiB1bnN1cmUsIHNheSBOLgogZW5kaWYKIAorY29uZmlnIFFPUklRX0NQVUZSRVEKKwl0cmlzdGF0ZSAiQ1BVIGZyZXF1ZW5jeSBzY2FsaW5nIGRyaXZlciBmb3IgRnJlZXNjYWxlIFFvcklRIFNvQ3MiCisJZGVwZW5kcyBvbiBPRiAmJiBDT01NT05fQ0xLICYmIChQUENfRTUwME1DIHx8IEFSTSkKKwlzZWxlY3QgQ0xLX1FPUklRCisJaGVscAorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBzdXBwb3J0IGZvciBGcmVlc2NhbGUgUW9ySVEgU29DcworCSAgd2hpY2ggYXJlIGNhcGFibGUgb2YgY2hhbmdpbmcgdGhlIENQVSdzIGZyZXF1ZW5jeSBkeW5hbWljYWxseS4KKwogZW5kaWYKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLmFybSBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLmFybQppbmRleCAxYjA2ZmM0Li40ZjNkYmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZy5hcm0KKysrIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcuYXJtCkBAIC0xMDgsNiArMTA4LDE1IEBACiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIAorY29uZmlnIEFSTV9ISVNJX0FDUFVfQ1BVRlJFUQorCXRyaXN0YXRlICJIaXNpbGljb24gQUNQVSBDUFVmcmVxIGRyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfSElTSSAmJiBDUFVGUkVRX0RUCisJc2VsZWN0IFBNX09QUAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgaGlzaWxpY29uIEFDUFUgQ1BVZnJlcSBkcml2ZXIuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTi4KKwogY29uZmlnIEFSTV9JTVg2UV9DUFVGUkVRCiAJdHJpc3RhdGUgIkZyZWVzY2FsZSBpLk1YNiBjcHVmcmVxIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBUkNIX01YQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcucG93ZXJwYyBiL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnLnBvd2VycGMKaW5kZXggN2VhMjQ0MS4uM2EwNTk1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcucG93ZXJwYworKysgYi9kcml2ZXJzL2NwdWZyZXEvS2NvbmZpZy5wb3dlcnBjCkBAIC0yMywxNSArMjMsNiBAQAogCSAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIGZyZXF1ZW5jeSBzd2l0Y2hpbmcgb24gTWFwbGUgOTcwRlgKIAkgIEV2YWx1YXRpb24gQm9hcmQgYW5kIGNvbXBhdGlibGUgYm9hcmRzIChJQk0gSlMyeCBibGFkZXMpLgogCi1jb25maWcgUFBDX0NPUkVORVRfQ1BVRlJFUQotCXRyaXN0YXRlICJDUFUgZnJlcXVlbmN5IHNjYWxpbmcgZHJpdmVyIGZvciBGcmVlc2NhbGUgRTUwME1DIFNvQ3MiCi0JZGVwZW5kcyBvbiBQUENfRTUwME1DICYmIE9GICYmIENPTU1PTl9DTEsKLQlzZWxlY3QgQ0xLX1FPUklRCi0JaGVscAotCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBzdXBwb3J0IGZvciBGcmVlc2NhbGUgZTUwMG1jLAotCSAgZTU1MDAgYW5kIGU2NTAwIHNlcmllcyBTb0NzIHdoaWNoIGFyZSBjYXBhYmxlIG9mIGNoYW5naW5nCi0JICB0aGUgQ1BVJ3MgZnJlcXVlbmN5IGR5bmFtaWNhbGx5LgotCiBjb25maWcgQ1BVX0ZSRVFfUE1BQwogCWJvb2wgIlN1cHBvcnQgZm9yIEFwcGxlIFBvd2VyQm9va3MiCiAJZGVwZW5kcyBvbiBBREJfUE1VICYmIFBQQzMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvTWFrZWZpbGUgYi9kcml2ZXJzL2NwdWZyZXEvTWFrZWZpbGUKaW5kZXggODJhMTgyMS4uY2RjZTkyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9NYWtlZmlsZQpAQCAtNTksNiArNTksNyBAQAogYXJtLWV4eW5vcy1jcHVmcmVxLSQoQ09ORklHX0FSTV9FWFlOT1M1MjUwX0NQVUZSRVEpCSs9IGV4eW5vczUyNTAtY3B1ZnJlcS5vCiBvYmotJChDT05GSUdfQVJNX0VYWU5PUzU0NDBfQ1BVRlJFUSkJKz0gZXh5bm9zNTQ0MC1jcHVmcmVxLm8KIG9iai0kKENPTkZJR19BUk1fSElHSEJBTktfQ1BVRlJFUSkJKz0gaGlnaGJhbmstY3B1ZnJlcS5vCitvYmotJChDT05GSUdfQVJNX0hJU0lfQUNQVV9DUFVGUkVRKQkrPSBoaXNpLWFjcHUtY3B1ZnJlcS5vCiBvYmotJChDT05GSUdfQVJNX0lNWDZRX0NQVUZSRVEpCQkrPSBpbXg2cS1jcHVmcmVxLm8KIG9iai0kKENPTkZJR19BUk1fSU5URUdSQVRPUikJCSs9IGludGVncmF0b3ItY3B1ZnJlcS5vCiBvYmotJChDT05GSUdfQVJNX0tJUktXT09EX0NQVUZSRVEpCSs9IGtpcmt3b29kLWNwdWZyZXEubwpAQCAtODUsNyArODYsNyBAQAogcHBjLWNiZS1jcHVmcmVxLXkJCQkrPSBwcGNfY2JlX2NwdWZyZXFfcGVydmFzaXZlLm8gcHBjX2NiZV9jcHVmcmVxLm8KIG9iai0kKENPTkZJR19DUFVfRlJFUV9DQkVfUE1JKQkJKz0gcHBjX2NiZV9jcHVmcmVxX3BtaS5vCiBvYmotJChDT05GSUdfQ1BVX0ZSRVFfTUFQTEUpCQkrPSBtYXBsZS1jcHVmcmVxLm8KLW9iai0kKENPTkZJR19QUENfQ09SRU5FVF9DUFVGUkVRKSAgICs9IHBwYy1jb3JlbmV0LWNwdWZyZXEubworb2JqLSQoQ09ORklHX1FPUklRX0NQVUZSRVEpICAgCQkrPSBxb3JpcS1jcHVmcmVxLm8KIG9iai0kKENPTkZJR19DUFVfRlJFUV9QTUFDKQkJKz0gcG1hYzMyLWNwdWZyZXEubwogb2JqLSQoQ09ORklHX0NQVV9GUkVRX1BNQUM2NCkJCSs9IHBtYWM2NC1jcHVmcmVxLm8KIG9iai0kKENPTkZJR19QUENfUEFTRU1JX0NQVUZSRVEpCSs9IHBhc2VtaS1jcHVmcmVxLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCmluZGV4IDI4ZTU5YTQuLjhhZTY1NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYwpAQCAtMTY5OCwxNSArMTY5OCwxOCBAQAogCQkgICAgfHwgX19jcHVmcmVxX2dvdmVybm9yKHBvbGljeSwgQ1BVRlJFUV9HT1ZfTElNSVRTKSkKIAkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzdGFydCBnb3Zlcm5vciBmb3IgcG9saWN5OiAlcFxuIiwKIAkJCQlfX2Z1bmNfXywgcG9saWN5KTsKLQotCQkvKgotCQkgKiBzY2hlZHVsZSBjYWxsIGNwdWZyZXFfdXBkYXRlX3BvbGljeSgpIGZvciBib290IENQVSwgaS5lLiBsYXN0Ci0JCSAqIHBvbGljeSBpbiBsaXN0LiBJdCB3aWxsIHZlcmlmeSB0aGF0IHRoZSBjdXJyZW50IGZyZXEgaXMgaW4KLQkJICogc3luYyB3aXRoIHdoYXQgd2UgYmVsaWV2ZSBpdCB0byBiZS4KLQkJICovCi0JCWlmIChsaXN0X2lzX2xhc3QoJnBvbGljeS0+cG9saWN5X2xpc3QsICZjcHVmcmVxX3BvbGljeV9saXN0KSkKLQkJCXNjaGVkdWxlX3dvcmsoJnBvbGljeS0+dXBkYXRlKTsKIAl9CisKKwkvKgorCSAqIHNjaGVkdWxlIGNhbGwgY3B1ZnJlcV91cGRhdGVfcG9saWN5KCkgZm9yIGZpcnN0LW9ubGluZSBDUFUsIGFzIHRoYXQKKwkgKiB3b3VsZG4ndCBiZSBob3RwbHVnZ2VkLW91dCBvbiBzdXNwZW5kLiBJdCB3aWxsIHZlcmlmeSB0aGF0IHRoZQorCSAqIGN1cnJlbnQgZnJlcSBpcyBpbiBzeW5jIHdpdGggd2hhdCB3ZSBiZWxpZXZlIGl0IHRvIGJlLgorCSAqLworCXBvbGljeSA9IGNwdWZyZXFfY3B1X2dldF9yYXcoY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spKTsKKwlpZiAoV0FSTl9PTighcG9saWN5KSkKKwkJcmV0dXJuOworCisJc2NoZWR1bGVfd29yaygmcG9saWN5LT51cGRhdGUpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9oaXNpLWFjcHUtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL2hpc2ktYWNwdS1jcHVmcmVxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2ZDViMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3B1ZnJlcS9oaXNpLWFjcHUtY3B1ZnJlcS5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBIaXNpbGljb24gUGxhdGZvcm1zIFVzaW5nIEFDUFUgQ1BVRnJlcSBTdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IEhpc2lsaWNvbiBMaW1pdGVkLgorICogQ29weXJpZ2h0IChjKSAyMDE1IExpbmFybyBMaW1pdGVkLgorICoKKyAqIExlbyBZYW4gPGxlby55YW5AbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCitzdGF0aWMgaW50IF9faW5pdCBoaXNpX2FjcHVfY3B1ZnJlcV9kcml2ZXJfaW5pdCh2b2lkKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisKKwlpZiAoIW9mX21hY2hpbmVfaXNfY29tcGF0aWJsZSgiaGlzaWxpY29uLGhpNjIyMCIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJjcHVmcmVxLWR0IiwgLTEsIE5VTEwsIDApOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocGRldik7Cit9Cittb2R1bGVfaW5pdChoaXNpX2FjcHVfY3B1ZnJlcV9kcml2ZXJfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIkxlbyBZYW4gPGxlby55YW5AbGluYXJvLm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSGlzaWxpY29uIGFjcHUgY3B1ZnJlcSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYyBiL2RyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYwppbmRleCA4NzJjNTc3Li5jNWI4MWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvaW50ZWxfcHN0YXRlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2ludGVsX3BzdGF0ZS5jCkBAIC02MTQsNiArNjE0LDE5IEBACiAJd3Jtc3JsX29uX2NwdShjcHVkYXRhLT5jcHUsIE1TUl9JQTMyX1BFUkZfQ1RMLCB2YWwpOwogfQogCitzdGF0aWMgaW50IGtubF9nZXRfdHVyYm9fcHN0YXRlKHZvaWQpCit7CisJdTY0IHZhbHVlOworCWludCBub250LCByZXQ7CisKKwlyZG1zcmwoTVNSX05ITV9UVVJCT19SQVRJT19MSU1JVCwgdmFsdWUpOworCW5vbnQgPSBjb3JlX2dldF9tYXhfcHN0YXRlKCk7CisJcmV0ID0gKCgodmFsdWUpID4+IDgpICYgMHhGRik7CisJaWYgKHJldCA8PSBub250KQorCQlyZXQgPSBub250OworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgY3B1X2RlZmF1bHRzIGNvcmVfcGFyYW1zID0gewogCS5waWRfcG9saWN5ID0gewogCQkuc2FtcGxlX3JhdGVfbXMgPSAxMCwKQEAgLTY1MSw2ICs2NjQsMjMgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBjcHVfZGVmYXVsdHMga25sX3BhcmFtcyA9IHsKKwkucGlkX3BvbGljeSA9IHsKKwkJLnNhbXBsZV9yYXRlX21zID0gMTAsCisJCS5kZWFkYmFuZCA9IDAsCisJCS5zZXRwb2ludCA9IDk3LAorCQkucF9nYWluX3BjdCA9IDIwLAorCQkuZF9nYWluX3BjdCA9IDAsCisJCS5pX2dhaW5fcGN0ID0gMCwKKwl9LAorCS5mdW5jcyA9IHsKKwkJLmdldF9tYXggPSBjb3JlX2dldF9tYXhfcHN0YXRlLAorCQkuZ2V0X21pbiA9IGNvcmVfZ2V0X21pbl9wc3RhdGUsCisJCS5nZXRfdHVyYm8gPSBrbmxfZ2V0X3R1cmJvX3BzdGF0ZSwKKwkJLnNldCA9IGNvcmVfc2V0X3BzdGF0ZSwKKwl9LAorfTsKKwogc3RhdGljIHZvaWQgaW50ZWxfcHN0YXRlX2dldF9taW5fbWF4KHN0cnVjdCBjcHVkYXRhICpjcHUsIGludCAqbWluLCBpbnQgKm1heCkKIHsKIAlpbnQgbWF4X3BlcmYgPSBjcHUtPnBzdGF0ZS50dXJib19wc3RhdGU7CkBAIC04NjUsNiArODk1LDcgQEAKIAlJQ1BVKDB4NGUsIGNvcmVfcGFyYW1zKSwKIAlJQ1BVKDB4NGYsIGNvcmVfcGFyYW1zKSwKIAlJQ1BVKDB4NTYsIGNvcmVfcGFyYW1zKSwKKwlJQ1BVKDB4NTcsIGtubF9wYXJhbXMpLAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh4ODZjcHUsIGludGVsX3BzdGF0ZV9jcHVfaWRzKTsKQEAgLTEwMjQsMjUgKzEwNTUsMTEgQEAKIAogc3RhdGljIGludCBpbnRlbF9wc3RhdGVfbXNyc19ub3RfdmFsaWQodm9pZCkKIHsKLQkvKiBDaGVjayB0aGF0IGFsbCB0aGUgbXNyJ3Mgd2UgYXJlIHVzaW5nIGFyZSB2YWxpZC4gKi8KLQl1NjQgYXBlcmYsIG1wZXJmLCB0bXA7Ci0KLQlyZG1zcmwoTVNSX0lBMzJfQVBFUkYsIGFwZXJmKTsKLQlyZG1zcmwoTVNSX0lBMzJfTVBFUkYsIG1wZXJmKTsKLQogCWlmICghcHN0YXRlX2Z1bmNzLmdldF9tYXgoKSB8fAogCSAgICAhcHN0YXRlX2Z1bmNzLmdldF9taW4oKSB8fAogCSAgICAhcHN0YXRlX2Z1bmNzLmdldF90dXJibygpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJkbXNybChNU1JfSUEzMl9BUEVSRiwgdG1wKTsKLQlpZiAoISh0bXAgLSBhcGVyZikpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcmRtc3JsKE1TUl9JQTMyX01QRVJGLCB0bXApOwotCWlmICghKHRtcCAtIG1wZXJmKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL3Bvd2VybnYtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL3Bvd2VybnYtY3B1ZnJlcS5jCmluZGV4IDJkZmQ0ZmQuLmViZWYwZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9wb3dlcm52LWNwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvcG93ZXJudi1jcHVmcmVxLmMKQEAgLTM0LDkgKzM0LDEzIEBACiAjaW5jbHVkZSA8YXNtL3NtcC5oPiAvKiBSZXF1aXJlZCBmb3IgY3B1X3NpYmxpbmdfbWFzaygpIGluIFVQIGNvbmZpZ3MgKi8KIAogI2RlZmluZSBQT1dFUk5WX01BWF9QU1RBVEVTCTI1NgorI2RlZmluZSBQTVNSX1BTQUZFX0VOQUJMRQkoMVVMIDw8IDMwKQorI2RlZmluZSBQTVNSX1NQUl9FTV9ESVNBQkxFCSgxVUwgPDwgMzEpCisjZGVmaW5lIFBNU1JfTUFYKHgpCQkoKHggPj4gMzIpICYgMHhGRikKKyNkZWZpbmUgUE1TUl9MUCh4KQkJKCh4ID4+IDQ4KSAmIDB4RkYpCiAKIHN0YXRpYyBzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgcG93ZXJudl9mcmVxc1tQT1dFUk5WX01BWF9QU1RBVEVTKzFdOwotc3RhdGljIGJvb2wgcmVib290aW5nOworc3RhdGljIGJvb2wgcmVib290aW5nLCB0aHJvdHRsZWQ7CiAKIC8qCiAgKiBOb3RlOiBUaGUgc2V0IG9mIHBzdGF0ZXMgY29uc2lzdHMgb2YgY29udGlndW91cyBpbnRlZ2VycywgdGhlCkBAIC0yOTQsNiArMjk4LDQ0IEBACiAJcmV0dXJuIHBvd2VybnZfcHN0YXRlX2luZm8ubWF4IC0gcG93ZXJudl9wc3RhdGVfaW5mby5ub21pbmFsOwogfQogCitzdGF0aWMgdm9pZCBwb3dlcm52X2NwdWZyZXFfdGhyb3R0bGVfY2hlY2sodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIHBtc3I7CisJaW50IHBtc3JfcG1heCwgcG1zcl9scDsKKworCXBtc3IgPSBnZXRfcG1zcHIoU1BSTl9QTVNSKTsKKworCS8qIENoZWNrIGZvciBQbWF4IENhcHBpbmcgKi8KKwlwbXNyX3BtYXggPSAoczgpUE1TUl9NQVgocG1zcik7CisJaWYgKHBtc3JfcG1heCAhPSBwb3dlcm52X3BzdGF0ZV9pbmZvLm1heCkgeworCQl0aHJvdHRsZWQgPSB0cnVlOworCQlwcl9pbmZvKCJDUFUgJWQgUG1heCBpcyByZWR1Y2VkIHRvICVkXG4iLCBjcHUsIHBtc3JfcG1heCk7CisJCXByX2luZm8oIk1heCBhbGxvd2VkIFBzdGF0ZSBpcyBjYXBwZWRcbiIpOworCX0KKworCS8qCisJICogQ2hlY2sgZm9yIFBzYWZlIGJ5IHJlYWRpbmcgTG9jYWxQc3RhdGUKKwkgKiBvciBjaGVjayBpZiBQc2FmZV9tb2RlX2FjdGl2ZSBpcyBzZXQgaW4gUE1TUi4KKwkgKi8KKwlwbXNyX2xwID0gKHM4KVBNU1JfTFAocG1zcik7CisJaWYgKChwbXNyX2xwIDwgcG93ZXJudl9wc3RhdGVfaW5mby5taW4pIHx8CisJCQkJKHBtc3IgJiBQTVNSX1BTQUZFX0VOQUJMRSkpIHsKKwkJdGhyb3R0bGVkID0gdHJ1ZTsKKwkJcHJfaW5mbygiUHN0YXRlIHNldCB0byBzYWZlIGZyZXF1ZW5jeVxuIik7CisJfQorCisJLyogQ2hlY2sgaWYgU1BSX0VNX0RJU0FCTEUgaXMgc2V0IGluIFBNU1IgKi8KKwlpZiAocG1zciAmIFBNU1JfU1BSX0VNX0RJU0FCTEUpIHsKKwkJdGhyb3R0bGVkID0gdHJ1ZTsKKwkJcHJfaW5mbygiRnJlcXVlbmN5IENvbnRyb2wgZGlzYWJsZWQgZnJvbSBPU1xuIik7CisJfQorCisJaWYgKHRocm90dGxlZCkgeworCQlwcl9pbmZvKCJQTVNSID0gJTE2bHhcbiIsIHBtc3IpOworCQlwcl9jcml0KCJDUFUgRnJlcXVlbmN5IGNvdWxkIGJlIHRocm90dGxlZFxuIik7CisJfQorfQorCiAvKgogICogcG93ZXJudl9jcHVmcmVxX3RhcmdldF9pbmRleDogU2V0cyB0aGUgZnJlcXVlbmN5IGNvcnJlc3BvbmRpbmcgdG8KICAqIHRoZSBjcHVmcmVxIHRhYmxlIGVudHJ5IGluZGV4ZWQgYnkgbmV3X2luZGV4IG9uIHRoZSBjcHVzIGluIHRoZQpAQCAtMzA3LDYgKzM0OSw5IEBACiAJaWYgKHVubGlrZWx5KHJlYm9vdGluZykgJiYgbmV3X2luZGV4ICE9IGdldF9ub21pbmFsX2luZGV4KCkpCiAJCXJldHVybiAwOwogCisJaWYgKCF0aHJvdHRsZWQpCisJCXBvd2VybnZfY3B1ZnJlcV90aHJvdHRsZV9jaGVjayhzbXBfcHJvY2Vzc29yX2lkKCkpOworCiAJZnJlcV9kYXRhLnBzdGF0ZV9pZCA9IHBvd2VybnZfZnJlcXNbbmV3X2luZGV4XS5kcml2ZXJfZGF0YTsKIAogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWZyZXEvcHBjLWNvcmVuZXQtY3B1ZnJlcS5jIGIvZHJpdmVycy9jcHVmcmVxL3BwYy1jb3JlbmV0LWNwdWZyZXEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiNGI3Ni4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvcHBjLWNvcmVuZXQtY3B1ZnJlcS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMyBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgotICoKLSAqIENQVSBGcmVxdWVuY3kgU2NhbGluZyBkcml2ZXIgZm9yIEZyZWVzY2FsZSBQb3dlclBDIGNvcmVuZXQgU29Dcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkJS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L29mLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+Ci0KLSNpbmNsdWRlIDxhc20vc21wLmg+CS8qIGZvciBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkgaW4gVVAgY29uZmlncyAqLwotCi0vKioKLSAqIHN0cnVjdCBjcHVfZGF0YSAtIHBlciBDUFUgZGF0YSBzdHJ1Y3QKLSAqIEBwYXJlbnQ6IHRoZSBwYXJlbnQgbm9kZSBvZiBjcHUgY2xvY2sKLSAqIEB0YWJsZTogZnJlcXVlbmN5IHRhYmxlCi0gKi8KLXN0cnVjdCBjcHVfZGF0YSB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQ7Ci0Jc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICp0YWJsZTsKLX07Ci0KLS8qKgotICogc3RydWN0IHNvY19kYXRhIC0gU29DIHNwZWNpZmljIGRhdGEKLSAqIEBmcmVxX21hc2s6IG1hc2sgdGhlIGRpc2FsbG93ZWQgZnJlcXVlbmNpZXMKLSAqIEBmbGFnOiB1bmlxdWUgZmxhZ3MKLSAqLwotc3RydWN0IHNvY19kYXRhIHsKLQl1MzIgZnJlcV9tYXNrWzRdOwotCXUzMiBmbGFnOwotfTsKLQotI2RlZmluZSBGUkVRX01BU0sJMQotLyogc2VlIGhhcmR3YXJlIHNwZWNpZmljYXRpb24gZm9yIHRoZSBhbGxvd2VkIGZycWV1ZW5jaWVzICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19kYXRhIHNkYXRhW10gPSB7Ci0JeyAvKiB1c2VkIGJ5IHAyMDQxIGFuZCBwMzA0MSAqLwotCQkuZnJlcV9tYXNrID0gezB4OCwgMHg4LCAweDIsIDB4Mn0sCi0JCS5mbGFnID0gRlJFUV9NQVNLLAotCX0sCi0JeyAvKiB1c2VkIGJ5IHA1MDIwICovCi0JCS5mcmVxX21hc2sgPSB7MHg4LCAweDJ9LAotCQkuZmxhZyA9IEZSRVFfTUFTSywKLQl9LAotCXsgLyogdXNlZCBieSBwNDA4MCwgcDUwNDAgKi8KLQkJLmZyZXFfbWFzayA9IHswfSwKLQkJLmZsYWcgPSAwLAotCX0sCi19OwotCi0vKgotICogdGhlIG1pbmltdW0gYWxsb3dlZCBjb3JlIGZyZXF1ZW5jeSwgaW4gSHoKLSAqIGZvciBjaGFzc2lzIHYxLjAsID49IHBsYXRmb3JtIGZyZXF1ZW5jeQotICogZm9yIGNoYXNzaXMgdjIuMCwgPj0gcGxhdGZvcm0gZnJlcXVlbmN5IC8gMgotICovCi1zdGF0aWMgdTMyIG1pbl9jcHVmcmVxOwotc3RhdGljIGNvbnN0IHUzMiAqZm1hc2s7Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgY3B1X2RhdGEgKiwgY3B1X2RhdGEpOwotCi0vKiBjcHVtYXNrIGluIGEgY2x1c3RlciAqLwotc3RhdGljIERFRklORV9QRVJfQ1BVKGNwdW1hc2tfdmFyX3QsIGNwdV9tYXNrKTsKLQotI2lmbmRlZiBDT05GSUdfU01QCi1zdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfY29yZV9tYXNrKGludCBjcHUpCi17Ci0JcmV0dXJuIGNwdW1hc2tfb2YoMCk7Ci19Ci0jZW5kaWYKLQotLyogcmVkdWNlIHRoZSBkdXBsaWNhdGVkIGZyZXF1ZW5jaWVzIGluIGZyZXF1ZW5jeSB0YWJsZSAqLwotc3RhdGljIHZvaWQgZnJlcV90YWJsZV9yZWR1cChzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZyZXFfdGFibGUsCi0JCWludCBjb3VudCkKLXsKLQlpbnQgaSwgajsKLQotCWZvciAoaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBpOyBqKyspIHsKLQkJCWlmIChmcmVxX3RhYmxlW2pdLmZyZXF1ZW5jeSA9PSBDUFVGUkVRX0VOVFJZX0lOVkFMSUQgfHwKLQkJCQkJZnJlcV90YWJsZVtqXS5mcmVxdWVuY3kgIT0KLQkJCQkJZnJlcV90YWJsZVtpXS5mcmVxdWVuY3kpCi0JCQkJY29udGludWU7Ci0KLQkJCWZyZXFfdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLS8qIHNvcnQgdGhlIGZyZXF1ZW5jaWVzIGluIGZyZXF1ZW5jeSB0YWJsZSBpbiBkZXNjZW50aW5nIG9yZGVyICovCi1zdGF0aWMgdm9pZCBmcmVxX3RhYmxlX3NvcnQoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlLAotCQlpbnQgY291bnQpCi17Ci0JaW50IGksIGosIGluZDsKLQl1bnNpZ25lZCBpbnQgZnJlcSwgbWF4X2ZyZXE7Ci0Jc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIHRhYmxlOwotCWZvciAoaSA9IDA7IGkgPCBjb3VudCAtIDE7IGkrKykgewotCQltYXhfZnJlcSA9IGZyZXFfdGFibGVbaV0uZnJlcXVlbmN5OwotCQlpbmQgPSBpOwotCQlmb3IgKGogPSBpICsgMTsgaiA8IGNvdW50OyBqKyspIHsKLQkJCWZyZXEgPSBmcmVxX3RhYmxlW2pdLmZyZXF1ZW5jeTsKLQkJCWlmIChmcmVxID09IENQVUZSRVFfRU5UUllfSU5WQUxJRCB8fAotCQkJCQlmcmVxIDw9IG1heF9mcmVxKQotCQkJCWNvbnRpbnVlOwotCQkJaW5kID0gajsKLQkJCW1heF9mcmVxID0gZnJlcTsKLQkJfQotCi0JCWlmIChpbmQgIT0gaSkgewotCQkJLyogZXhjaGFuZ2UgdGhlIGZyZXF1ZW5jaWVzICovCi0JCQl0YWJsZS5kcml2ZXJfZGF0YSA9IGZyZXFfdGFibGVbaV0uZHJpdmVyX2RhdGE7Ci0JCQl0YWJsZS5mcmVxdWVuY3kgPSBmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeTsKLQkJCWZyZXFfdGFibGVbaV0uZHJpdmVyX2RhdGEgPSBmcmVxX3RhYmxlW2luZF0uZHJpdmVyX2RhdGE7Ci0JCQlmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IGZyZXFfdGFibGVbaW5kXS5mcmVxdWVuY3k7Ci0JCQlmcmVxX3RhYmxlW2luZF0uZHJpdmVyX2RhdGEgPSB0YWJsZS5kcml2ZXJfZGF0YTsKLQkJCWZyZXFfdGFibGVbaW5kXS5mcmVxdWVuY3kgPSB0YWJsZS5mcmVxdWVuY3k7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgY29yZW5ldF9jcHVmcmVxX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0JaW50IGksIGNvdW50LCByZXQ7Ci0JdTMyIGZyZXEsIG1hc2s7Ci0Jc3RydWN0IGNsayAqY2xrOwotCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGU7Ci0Jc3RydWN0IGNwdV9kYXRhICpkYXRhOwotCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKLQl1NjQgdTY0dGVtcDsKLQotCW5wID0gb2ZfZ2V0X2NwdV9ub2RlKGNwdSwgTlVMTCk7Ci0JaWYgKCFucCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRhdGEpIHsKLQkJcHJfZXJyKCIlczogbm8gbWVtb3J5XG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX25wOwotCX0KLQotCXBvbGljeS0+Y2xrID0gb2ZfY2xrX2dldChucCwgMCk7Ci0JaWYgKElTX0VSUihwb2xpY3ktPmNsaykpIHsKLQkJcHJfZXJyKCIlczogbm8gY2xvY2sgaW5mb3JtYXRpb25cbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnJfbm9tZW0yOwotCX0KLQotCWRhdGEtPnBhcmVudCA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJjbG9ja3MiLCAwKTsKLQlpZiAoIWRhdGEtPnBhcmVudCkgewotCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNsb2NrIGluZm9ybWF0aW9uXG4iLCBfX2Z1bmNfXyk7Ci0JCWdvdG8gZXJyX25vbWVtMjsKLQl9Ci0KLQljb3VudCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MoZGF0YS0+cGFyZW50LCAiY2xvY2stbmFtZXMiKTsKLQl0YWJsZSA9IGtjYWxsb2MoY291bnQgKyAxLCBzaXplb2YoKnRhYmxlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0YWJsZSkgewotCQlwcl9lcnIoIiVzOiBubyBtZW1vcnlcbiIsIF9fZnVuY19fKTsKLQkJZ290byBlcnJfbm9kZTsKLQl9Ci0KLQlpZiAoZm1hc2spCi0JCW1hc2sgPSBmbWFza1tnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKGNwdSldOwotCWVsc2UKLQkJbWFzayA9IDB4MDsKLQotCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCWNsayA9IG9mX2Nsa19nZXQoZGF0YS0+cGFyZW50LCBpKTsKLQkJZnJlcSA9IGNsa19nZXRfcmF0ZShjbGspOwotCQkvKgotCQkgKiB0aGUgY2xvY2sgaXMgdmFsaWQgaWYgaXRzIGZyZXF1ZW5jeSBpcyBub3QgbWFza2VkCi0JCSAqIGFuZCBsYXJnZSB0aGFuIG1pbmltdW0gYWxsb3dlZCBmcmVxdWVuY3kuCi0JCSAqLwotCQlpZiAoZnJlcSA8IG1pbl9jcHVmcmVxIHx8IChtYXNrICYgKDEgPDwgaSkpKQotCQkJdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOwotCQllbHNlCi0JCQl0YWJsZVtpXS5mcmVxdWVuY3kgPSBmcmVxIC8gMTAwMDsKLQkJdGFibGVbaV0uZHJpdmVyX2RhdGEgPSBpOwotCX0KLQlmcmVxX3RhYmxlX3JlZHVwKHRhYmxlLCBjb3VudCk7Ci0JZnJlcV90YWJsZV9zb3J0KHRhYmxlLCBjb3VudCk7Ci0JdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7Ci0KLQkvKiBzZXQgdGhlIG1pbiBhbmQgbWF4IGZyZXF1ZW5jeSBwcm9wZXJseSAqLwotCXJldCA9IGNwdWZyZXFfdGFibGVfdmFsaWRhdGVfYW5kX3Nob3cocG9saWN5LCB0YWJsZSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoImludmFsaWQgZnJlcXVlbmN5IHRhYmxlOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfbm9tZW0xOwotCX0KLQotCWRhdGEtPnRhYmxlID0gdGFibGU7Ci0KLQkvKiB1cGRhdGUgLT5jcHVzIGlmIHdlIGhhdmUgY2x1c3Rlciwgbm8gaGFybSBpZiBub3QgKi8KLQljcHVtYXNrX2NvcHkocG9saWN5LT5jcHVzLCBwZXJfY3B1KGNwdV9tYXNrLCBjcHUpKTsKLQlmb3JfZWFjaF9jcHUoaSwgcGVyX2NwdShjcHVfbWFzaywgY3B1KSkKLQkJcGVyX2NwdShjcHVfZGF0YSwgaSkgPSBkYXRhOwotCi0JLyogTWluaW11bSB0cmFuc2l0aW9uIGxhdGVuY3kgaXMgMTIgcGxhdGZvcm0gY2xvY2tzICovCi0JdTY0dGVtcCA9IDEyVUxMICogTlNFQ19QRVJfU0VDOwotCWRvX2Rpdih1NjR0ZW1wLCBmc2xfZ2V0X3N5c19mcmVxKCkpOwotCXBvbGljeS0+Y3B1aW5mby50cmFuc2l0aW9uX2xhdGVuY3kgPSB1NjR0ZW1wICsgMTsKLQotCW9mX25vZGVfcHV0KG5wKTsKLQotCXJldHVybiAwOwotCi1lcnJfbm9tZW0xOgotCWtmcmVlKHRhYmxlKTsKLWVycl9ub2RlOgotCW9mX25vZGVfcHV0KGRhdGEtPnBhcmVudCk7Ci1lcnJfbm9tZW0yOgotCXBlcl9jcHUoY3B1X2RhdGEsIGNwdSkgPSBOVUxMOwotCWtmcmVlKGRhdGEpOwotZXJyX25wOgotCW9mX25vZGVfcHV0KG5wKTsKLQotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgaW50IF9fZXhpdCBjb3JlbmV0X2NwdWZyZXFfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCi17Ci0Jc3RydWN0IGNwdV9kYXRhICpkYXRhID0gcGVyX2NwdShjcHVfZGF0YSwgcG9saWN5LT5jcHUpOwotCXVuc2lnbmVkIGludCBjcHU7Ci0KLQlvZl9ub2RlX3B1dChkYXRhLT5wYXJlbnQpOwotCWtmcmVlKGRhdGEtPnRhYmxlKTsKLQlrZnJlZShkYXRhKTsKLQotCWZvcl9lYWNoX2NwdShjcHUsIHBlcl9jcHUoY3B1X21hc2ssIHBvbGljeS0+Y3B1KSkKLQkJcGVyX2NwdShjcHVfZGF0YSwgY3B1KSA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjb3JlbmV0X2NwdWZyZXFfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAotCQl1bnNpZ25lZCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGNsayAqcGFyZW50OwotCXN0cnVjdCBjcHVfZGF0YSAqZGF0YSA9IHBlcl9jcHUoY3B1X2RhdGEsIHBvbGljeS0+Y3B1KTsKLQotCXBhcmVudCA9IG9mX2Nsa19nZXQoZGF0YS0+cGFyZW50LCBkYXRhLT50YWJsZVtpbmRleF0uZHJpdmVyX2RhdGEpOwotCXJldHVybiBjbGtfc2V0X3BhcmVudChwb2xpY3ktPmNsaywgcGFyZW50KTsKLX0KLQotc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBwcGNfY29yZW5ldF9jcHVmcmVxX2RyaXZlciA9IHsKLQkubmFtZQkJPSAicHBjX2NwdWZyZXEiLAotCS5mbGFncwkJPSBDUFVGUkVRX0NPTlNUX0xPT1BTLAotCS5pbml0CQk9IGNvcmVuZXRfY3B1ZnJlcV9jcHVfaW5pdCwKLQkuZXhpdAkJPSBfX2V4aXRfcChjb3JlbmV0X2NwdWZyZXFfY3B1X2V4aXQpLAotCS52ZXJpZnkJCT0gY3B1ZnJlcV9nZW5lcmljX2ZyZXF1ZW5jeV90YWJsZV92ZXJpZnksCi0JLnRhcmdldF9pbmRleAk9IGNvcmVuZXRfY3B1ZnJlcV90YXJnZXQsCi0JLmdldAkJPSBjcHVmcmVxX2dlbmVyaWNfZ2V0LAotCS5hdHRyCQk9IGNwdWZyZXFfZ2VuZXJpY19hdHRyLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbm9kZV9tYXRjaGVzW10gX19pbml0ZGF0YSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImZzbCxwMjA0MS1jbG9ja2dlbiIsIC5kYXRhID0gJnNkYXRhWzBdLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWNsb2NrZ2VuIiwgLmRhdGEgPSAmc2RhdGFbMF0sIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtY2xvY2tnZW4iLCAuZGF0YSA9ICZzZGF0YVsxXSwgfSwKLQl7IC5jb21wYXRpYmxlID0gImZzbCxwNDA4MC1jbG9ja2dlbiIsIC5kYXRhID0gJnNkYXRhWzJdLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZnNsLHA1MDQwLWNsb2NrZ2VuIiwgLmRhdGEgPSAmc2RhdGFbMl0sIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY2xvY2tnZW4tMi4wIiwgfSwKLQl7fQotfTsKLQotc3RhdGljIGludCBfX2luaXQgcHBjX2NvcmVuZXRfY3B1ZnJlcV9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgICpucDsKLQljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKLQljb25zdCBzdHJ1Y3Qgc29jX2RhdGEgKmRhdGE7Ci0JdW5zaWduZWQgaW50IGNwdTsKLQotCW5wID0gb2ZfZmluZF9tYXRjaGluZ19ub2RlKE5VTEwsIG5vZGVfbWF0Y2hlcyk7Ci0JaWYgKCFucCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCWlmICghYWxsb2NfY3B1bWFza192YXIoJnBlcl9jcHUoY3B1X21hc2ssIGNwdSksIEdGUF9LRVJORUwpKQotCQkJZ290byBlcnJfbWFzazsKLQkJY3B1bWFza19jb3B5KHBlcl9jcHUoY3B1X21hc2ssIGNwdSksIGNwdV9jb3JlX21hc2soY3B1KSk7Ci0JfQotCi0JbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKG5vZGVfbWF0Y2hlcywgbnApOwotCWRhdGEgPSBtYXRjaC0+ZGF0YTsKLQlpZiAoZGF0YSkgewotCQlpZiAoZGF0YS0+ZmxhZykKLQkJCWZtYXNrID0gZGF0YS0+ZnJlcV9tYXNrOwotCQltaW5fY3B1ZnJlcSA9IGZzbF9nZXRfc3lzX2ZyZXEoKTsKLQl9IGVsc2UgewotCQltaW5fY3B1ZnJlcSA9IGZzbF9nZXRfc3lzX2ZyZXEoKSAvIDI7Ci0JfQotCi0Jb2Zfbm9kZV9wdXQobnApOwotCi0JcmV0ID0gY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJnBwY19jb3JlbmV0X2NwdWZyZXFfZHJpdmVyKTsKLQlpZiAoIXJldCkKLQkJcHJfaW5mbygiRnJlZXNjYWxlIFBvd2VyUEMgY29yZW5ldCBDUFUgZnJlcXVlbmN5IHNjYWxpbmcgZHJpdmVyXG4iKTsKLQotCXJldHVybiByZXQ7Ci0KLWVycl9tYXNrOgotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCi0JCWZyZWVfY3B1bWFza192YXIocGVyX2NwdShjcHVfbWFzaywgY3B1KSk7Ci0KLQlyZXR1cm4gLUVOT01FTTsKLX0KLW1vZHVsZV9pbml0KHBwY19jb3JlbmV0X2NwdWZyZXFfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwcGNfY29yZW5ldF9jcHVmcmVxX2V4aXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgY3B1OwotCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKLQkJZnJlZV9jcHVtYXNrX3ZhcihwZXJfY3B1KGNwdV9tYXNrLCBjcHUpKTsKLQotCWNwdWZyZXFfdW5yZWdpc3Rlcl9kcml2ZXIoJnBwY19jb3JlbmV0X2NwdWZyZXFfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KHBwY19jb3JlbmV0X2NwdWZyZXFfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIlRhbmcgWXVhbnRpYW4gPFl1YW50aWFuLlRhbmdAZnJlZXNjYWxlLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiY3B1ZnJlcSBkcml2ZXIgZm9yIEZyZWVzY2FsZSBlNTAwbWMgc2VyaWVzIFNvQ3MiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9xb3JpcS1jcHVmcmVxLmMgYi9kcml2ZXJzL2NwdWZyZXEvcW9yaXEtY3B1ZnJlcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4YjIxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NwdWZyZXEvcW9yaXEtY3B1ZnJlcS5jCkBAIC0wLDAgKzEsMzc0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTMgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBDUFUgRnJlcXVlbmN5IFNjYWxpbmcgZHJpdmVyIGZvciBGcmVlc2NhbGUgUW9ySVEgU29Dcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkJS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorCisjaWYgIWRlZmluZWQoQ09ORklHX0FSTSkKKyNpbmNsdWRlIDxhc20vc21wLmg+CS8qIGZvciBnZXRfaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCkgaW4gVVAgY29uZmlncyAqLworI2VuZGlmCisKKy8qKgorICogc3RydWN0IGNwdV9kYXRhCisgKiBAcGFyZW50OiB0aGUgcGFyZW50IG5vZGUgb2YgY3B1IGNsb2NrCisgKiBAdGFibGU6IGZyZXF1ZW5jeSB0YWJsZQorICovCitzdHJ1Y3QgY3B1X2RhdGEgeworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50OworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqdGFibGU7Cit9OworCisvKioKKyAqIHN0cnVjdCBzb2NfZGF0YSAtIFNvQyBzcGVjaWZpYyBkYXRhCisgKiBAZnJlcV9tYXNrOiBtYXNrIHRoZSBkaXNhbGxvd2VkIGZyZXF1ZW5jaWVzCisgKiBAZmxhZzogdW5pcXVlIGZsYWdzCisgKi8KK3N0cnVjdCBzb2NfZGF0YSB7CisJdTMyIGZyZXFfbWFza1s0XTsKKwl1MzIgZmxhZzsKK307CisKKyNkZWZpbmUgRlJFUV9NQVNLCTEKKy8qIHNlZSBoYXJkd2FyZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgYWxsb3dlZCBmcnFldWVuY2llcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZGF0YSBzZGF0YVtdID0geworCXsgLyogdXNlZCBieSBwMjA0MSBhbmQgcDMwNDEgKi8KKwkJLmZyZXFfbWFzayA9IHsweDgsIDB4OCwgMHgyLCAweDJ9LAorCQkuZmxhZyA9IEZSRVFfTUFTSywKKwl9LAorCXsgLyogdXNlZCBieSBwNTAyMCAqLworCQkuZnJlcV9tYXNrID0gezB4OCwgMHgyfSwKKwkJLmZsYWcgPSBGUkVRX01BU0ssCisJfSwKKwl7IC8qIHVzZWQgYnkgcDQwODAsIHA1MDQwICovCisJCS5mcmVxX21hc2sgPSB7MH0sCisJCS5mbGFnID0gMCwKKwl9LAorfTsKKworLyoKKyAqIHRoZSBtaW5pbXVtIGFsbG93ZWQgY29yZSBmcmVxdWVuY3ksIGluIEh6CisgKiBmb3IgY2hhc3NpcyB2MS4wLCA+PSBwbGF0Zm9ybSBmcmVxdWVuY3kKKyAqIGZvciBjaGFzc2lzIHYyLjAsID49IHBsYXRmb3JtIGZyZXF1ZW5jeSAvIDIKKyAqLworc3RhdGljIHUzMiBtaW5fY3B1ZnJlcTsKK3N0YXRpYyBjb25zdCB1MzIgKmZtYXNrOworCisjaWYgZGVmaW5lZChDT05GSUdfQVJNKQorc3RhdGljIGludCBnZXRfY3B1X3BoeXNpY2FsX2lkKGludCBjcHUpCit7CisJcmV0dXJuIHRvcG9sb2d5X2NvcmVfaWQoY3B1KTsKK30KKyNlbHNlCitzdGF0aWMgaW50IGdldF9jcHVfcGh5c2ljYWxfaWQoaW50IGNwdSkKK3sKKwlyZXR1cm4gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOworfQorI2VuZGlmCisKK3N0YXRpYyB1MzIgZ2V0X2J1c19mcmVxKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpzb2M7CisJdTMyIHN5c2ZyZXE7CisKKwlzb2MgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAic29jIik7CisJaWYgKCFzb2MpCisJCXJldHVybiAwOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHNvYywgImJ1cy1mcmVxdWVuY3kiLCAmc3lzZnJlcSkpCisJCXN5c2ZyZXEgPSAwOworCisJb2Zfbm9kZV9wdXQoc29jKTsKKworCXJldHVybiBzeXNmcmVxOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpjcHVfdG9fY2xrX25vZGUoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCAqY2xrX25wOworCisJaWYgKCFjcHVfcHJlc2VudChjcHUpKQorCQlyZXR1cm4gTlVMTDsKKworCW5wID0gb2ZfZ2V0X2NwdV9ub2RlKGNwdSwgTlVMTCk7CisJaWYgKCFucCkKKwkJcmV0dXJuIE5VTEw7CisKKwljbGtfbnAgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAiY2xvY2tzIiwgMCk7CisJaWYgKCFjbGtfbnApCisJCXJldHVybiBOVUxMOworCisJb2Zfbm9kZV9wdXQobnApOworCisJcmV0dXJuIGNsa19ucDsKK30KKworLyogdHJhdmVyc2UgY3B1IG5vZGVzIHRvIGdldCBjcHUgbWFzayBvZiBzaGFyaW5nIGNsb2NrIHdpcmUgKi8KK3N0YXRpYyB2b2lkIHNldF9hZmZlY3RlZF9jcHVzKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsICpjbGtfbnA7CisJc3RydWN0IGNwdW1hc2sgKmRzdHAgPSBwb2xpY3ktPmNwdXM7CisJaW50IGk7CisKKwlucCA9IGNwdV90b19jbGtfbm9kZShwb2xpY3ktPmNwdSk7CisJaWYgKCFucCkKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfcHJlc2VudF9jcHUoaSkgeworCQljbGtfbnAgPSBjcHVfdG9fY2xrX25vZGUoaSk7CisJCWlmICghY2xrX25wKQorCQkJY29udGludWU7CisKKwkJaWYgKGNsa19ucCA9PSBucCkKKwkJCWNwdW1hc2tfc2V0X2NwdShpLCBkc3RwKTsKKworCQlvZl9ub2RlX3B1dChjbGtfbnApOworCX0KKwlvZl9ub2RlX3B1dChucCk7Cit9CisKKy8qIHJlZHVjZSB0aGUgZHVwbGljYXRlZCBmcmVxdWVuY2llcyBpbiBmcmVxdWVuY3kgdGFibGUgKi8KK3N0YXRpYyB2b2lkIGZyZXFfdGFibGVfcmVkdXAoc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlLAorCQlpbnQgY291bnQpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAxOyBpIDwgY291bnQ7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisJCQlpZiAoZnJlcV90YWJsZVtqXS5mcmVxdWVuY3kgPT0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEIHx8CisJCQkJCWZyZXFfdGFibGVbal0uZnJlcXVlbmN5ICE9CisJCQkJCWZyZXFfdGFibGVbaV0uZnJlcXVlbmN5KQorCQkJCWNvbnRpbnVlOworCisJCQlmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IENQVUZSRVFfRU5UUllfSU5WQUxJRDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBzb3J0IHRoZSBmcmVxdWVuY2llcyBpbiBmcmVxdWVuY3kgdGFibGUgaW4gZGVzY2VudGluZyBvcmRlciAqLworc3RhdGljIHZvaWQgZnJlcV90YWJsZV9zb3J0KHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSAqZnJlcV90YWJsZSwKKwkJaW50IGNvdW50KQoreworCWludCBpLCBqLCBpbmQ7CisJdW5zaWduZWQgaW50IGZyZXEsIG1heF9mcmVxOworCXN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSB0YWJsZTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudCAtIDE7IGkrKykgeworCQltYXhfZnJlcSA9IGZyZXFfdGFibGVbaV0uZnJlcXVlbmN5OworCQlpbmQgPSBpOworCQlmb3IgKGogPSBpICsgMTsgaiA8IGNvdW50OyBqKyspIHsKKwkJCWZyZXEgPSBmcmVxX3RhYmxlW2pdLmZyZXF1ZW5jeTsKKwkJCWlmIChmcmVxID09IENQVUZSRVFfRU5UUllfSU5WQUxJRCB8fAorCQkJCQlmcmVxIDw9IG1heF9mcmVxKQorCQkJCWNvbnRpbnVlOworCQkJaW5kID0gajsKKwkJCW1heF9mcmVxID0gZnJlcTsKKwkJfQorCisJCWlmIChpbmQgIT0gaSkgeworCQkJLyogZXhjaGFuZ2UgdGhlIGZyZXF1ZW5jaWVzICovCisJCQl0YWJsZS5kcml2ZXJfZGF0YSA9IGZyZXFfdGFibGVbaV0uZHJpdmVyX2RhdGE7CisJCQl0YWJsZS5mcmVxdWVuY3kgPSBmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeTsKKwkJCWZyZXFfdGFibGVbaV0uZHJpdmVyX2RhdGEgPSBmcmVxX3RhYmxlW2luZF0uZHJpdmVyX2RhdGE7CisJCQlmcmVxX3RhYmxlW2ldLmZyZXF1ZW5jeSA9IGZyZXFfdGFibGVbaW5kXS5mcmVxdWVuY3k7CisJCQlmcmVxX3RhYmxlW2luZF0uZHJpdmVyX2RhdGEgPSB0YWJsZS5kcml2ZXJfZGF0YTsKKwkJCWZyZXFfdGFibGVbaW5kXS5mcmVxdWVuY3kgPSB0YWJsZS5mcmVxdWVuY3k7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgcW9yaXFfY3B1ZnJlcV9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWludCBpLCBjb3VudCwgcmV0OworCXUzMiBmcmVxLCBtYXNrOworCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKnRhYmxlOworCXN0cnVjdCBjcHVfZGF0YSAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gcG9saWN5LT5jcHU7CisJdTY0IHU2NHRlbXA7CisKKwlucCA9IG9mX2dldF9jcHVfbm9kZShjcHUsIE5VTEwpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlnb3RvIGVycl9ucDsKKworCXBvbGljeS0+Y2xrID0gb2ZfY2xrX2dldChucCwgMCk7CisJaWYgKElTX0VSUihwb2xpY3ktPmNsaykpIHsKKwkJcHJfZXJyKCIlczogbm8gY2xvY2sgaW5mb3JtYXRpb25cbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfbm9tZW0yOworCX0KKworCWRhdGEtPnBhcmVudCA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJjbG9ja3MiLCAwKTsKKwlpZiAoIWRhdGEtPnBhcmVudCkgeworCQlwcl9lcnIoIiVzOiBjb3VsZCBub3QgZ2V0IGNsb2NrIGluZm9ybWF0aW9uXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gZXJyX25vbWVtMjsKKwl9CisKKwljb3VudCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MoZGF0YS0+cGFyZW50LCAiY2xvY2stbmFtZXMiKTsKKwl0YWJsZSA9IGtjYWxsb2MoY291bnQgKyAxLCBzaXplb2YoKnRhYmxlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0YWJsZSkgeworCQlwcl9lcnIoIiVzOiBubyBtZW1vcnlcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJfbm9kZTsKKwl9CisKKwlpZiAoZm1hc2spCisJCW1hc2sgPSBmbWFza1tnZXRfY3B1X3BoeXNpY2FsX2lkKGNwdSldOworCWVsc2UKKwkJbWFzayA9IDB4MDsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWNsayA9IG9mX2Nsa19nZXQoZGF0YS0+cGFyZW50LCBpKTsKKwkJZnJlcSA9IGNsa19nZXRfcmF0ZShjbGspOworCQkvKgorCQkgKiB0aGUgY2xvY2sgaXMgdmFsaWQgaWYgaXRzIGZyZXF1ZW5jeSBpcyBub3QgbWFza2VkCisJCSAqIGFuZCBsYXJnZSB0aGFuIG1pbmltdW0gYWxsb3dlZCBmcmVxdWVuY3kuCisJCSAqLworCQlpZiAoZnJlcSA8IG1pbl9jcHVmcmVxIHx8IChtYXNrICYgKDEgPDwgaSkpKQorCQkJdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9FTlRSWV9JTlZBTElEOworCQllbHNlCisJCQl0YWJsZVtpXS5mcmVxdWVuY3kgPSBmcmVxIC8gMTAwMDsKKwkJdGFibGVbaV0uZHJpdmVyX2RhdGEgPSBpOworCX0KKwlmcmVxX3RhYmxlX3JlZHVwKHRhYmxlLCBjb3VudCk7CisJZnJlcV90YWJsZV9zb3J0KHRhYmxlLCBjb3VudCk7CisJdGFibGVbaV0uZnJlcXVlbmN5ID0gQ1BVRlJFUV9UQUJMRV9FTkQ7CisKKwkvKiBzZXQgdGhlIG1pbiBhbmQgbWF4IGZyZXF1ZW5jeSBwcm9wZXJseSAqLworCXJldCA9IGNwdWZyZXFfdGFibGVfdmFsaWRhdGVfYW5kX3Nob3cocG9saWN5LCB0YWJsZSk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoImludmFsaWQgZnJlcXVlbmN5IHRhYmxlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfbm9tZW0xOworCX0KKworCWRhdGEtPnRhYmxlID0gdGFibGU7CisKKwkvKiB1cGRhdGUgLT5jcHVzIGlmIHdlIGhhdmUgY2x1c3Rlciwgbm8gaGFybSBpZiBub3QgKi8KKwlzZXRfYWZmZWN0ZWRfY3B1cyhwb2xpY3kpOworCXBvbGljeS0+ZHJpdmVyX2RhdGEgPSBkYXRhOworCisJLyogTWluaW11bSB0cmFuc2l0aW9uIGxhdGVuY3kgaXMgMTIgcGxhdGZvcm0gY2xvY2tzICovCisJdTY0dGVtcCA9IDEyVUxMICogTlNFQ19QRVJfU0VDOworCWRvX2Rpdih1NjR0ZW1wLCBnZXRfYnVzX2ZyZXEoKSk7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IHU2NHRlbXAgKyAxOworCisJb2Zfbm9kZV9wdXQobnApOworCisJcmV0dXJuIDA7CisKK2Vycl9ub21lbTE6CisJa2ZyZWUodGFibGUpOworZXJyX25vZGU6CisJb2Zfbm9kZV9wdXQoZGF0YS0+cGFyZW50KTsKK2Vycl9ub21lbTI6CisJcG9saWN5LT5kcml2ZXJfZGF0YSA9IE5VTEw7CisJa2ZyZWUoZGF0YSk7CitlcnJfbnA6CisJb2Zfbm9kZV9wdXQobnApOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHFvcmlxX2NwdWZyZXFfY3B1X2V4aXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCit7CisJc3RydWN0IGNwdV9kYXRhICpkYXRhID0gcG9saWN5LT5kcml2ZXJfZGF0YTsKKworCW9mX25vZGVfcHV0KGRhdGEtPnBhcmVudCk7CisJa2ZyZWUoZGF0YS0+dGFibGUpOworCWtmcmVlKGRhdGEpOworCXBvbGljeS0+ZHJpdmVyX2RhdGEgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcW9yaXFfY3B1ZnJlcV90YXJnZXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCisJCXVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgY2xrICpwYXJlbnQ7CisJc3RydWN0IGNwdV9kYXRhICpkYXRhID0gcG9saWN5LT5kcml2ZXJfZGF0YTsKKworCXBhcmVudCA9IG9mX2Nsa19nZXQoZGF0YS0+cGFyZW50LCBkYXRhLT50YWJsZVtpbmRleF0uZHJpdmVyX2RhdGEpOworCXJldHVybiBjbGtfc2V0X3BhcmVudChwb2xpY3ktPmNsaywgcGFyZW50KTsKK30KKworc3RhdGljIHN0cnVjdCBjcHVmcmVxX2RyaXZlciBxb3JpcV9jcHVmcmVxX2RyaXZlciA9IHsKKwkubmFtZQkJPSAicW9yaXFfY3B1ZnJlcSIsCisJLmZsYWdzCQk9IENQVUZSRVFfQ09OU1RfTE9PUFMsCisJLmluaXQJCT0gcW9yaXFfY3B1ZnJlcV9jcHVfaW5pdCwKKwkuZXhpdAkJPSBfX2V4aXRfcChxb3JpcV9jcHVmcmVxX2NwdV9leGl0KSwKKwkudmVyaWZ5CQk9IGNwdWZyZXFfZ2VuZXJpY19mcmVxdWVuY3lfdGFibGVfdmVyaWZ5LAorCS50YXJnZXRfaW5kZXgJPSBxb3JpcV9jcHVmcmVxX3RhcmdldCwKKwkuZ2V0CQk9IGNwdWZyZXFfZ2VuZXJpY19nZXQsCisJLmF0dHIJCT0gY3B1ZnJlcV9nZW5lcmljX2F0dHIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBub2RlX21hdGNoZXNbXSBfX2luaXRjb25zdCA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxwMjA0MS1jbG9ja2dlbiIsIC5kYXRhID0gJnNkYXRhWzBdLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWNsb2NrZ2VuIiwgLmRhdGEgPSAmc2RhdGFbMF0sIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtY2xvY2tnZW4iLCAuZGF0YSA9ICZzZGF0YVsxXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxwNDA4MC1jbG9ja2dlbiIsIC5kYXRhID0gJnNkYXRhWzJdLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLHA1MDQwLWNsb2NrZ2VuIiwgLmRhdGEgPSAmc2RhdGFbMl0sIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY2xvY2tnZW4tMi4wIiwgfSwKKwl7fQorfTsKKworc3RhdGljIGludCBfX2luaXQgcW9yaXFfY3B1ZnJlcV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgICpucDsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwljb25zdCBzdHJ1Y3Qgc29jX2RhdGEgKmRhdGE7CisKKwlucCA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCBub2RlX21hdGNoZXMpOworCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCisJbWF0Y2ggPSBvZl9tYXRjaF9ub2RlKG5vZGVfbWF0Y2hlcywgbnApOworCWRhdGEgPSBtYXRjaC0+ZGF0YTsKKwlpZiAoZGF0YSkgeworCQlpZiAoZGF0YS0+ZmxhZykKKwkJCWZtYXNrID0gZGF0YS0+ZnJlcV9tYXNrOworCQltaW5fY3B1ZnJlcSA9IGdldF9idXNfZnJlcSgpOworCX0gZWxzZSB7CisJCW1pbl9jcHVmcmVxID0gZ2V0X2J1c19mcmVxKCkgLyAyOworCX0KKworCW9mX25vZGVfcHV0KG5wKTsKKworCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfZHJpdmVyKCZxb3JpcV9jcHVmcmVxX2RyaXZlcik7CisJaWYgKCFyZXQpCisJCXByX2luZm8oIkZyZWVzY2FsZSBRb3JJUSBDUFUgZnJlcXVlbmN5IHNjYWxpbmcgZHJpdmVyXG4iKTsKKworCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdChxb3JpcV9jcHVmcmVxX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgcW9yaXFfY3B1ZnJlcV9leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmcW9yaXFfY3B1ZnJlcV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQocW9yaXFfY3B1ZnJlcV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVGFuZyBZdWFudGlhbiA8WXVhbnRpYW4uVGFuZ0BmcmVlc2NhbGUuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJjcHVmcmVxIGRyaXZlciBmb3IgRnJlZXNjYWxlIFFvcklRIHNlcmllcyBTb0NzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvS2NvbmZpZyBiL2RyaXZlcnMvY3B1aWRsZS9LY29uZmlnCmluZGV4IGM1MDI5YzEuLjhjNzkzMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9LY29uZmlnCkBAIC0yOSwxNSArMjksMTAgQEAKIAlib29sCiAKIG1lbnUgIkFSTSBDUFUgSWRsZSBEcml2ZXJzIgotZGVwZW5kcyBvbiBBUk0KK2RlcGVuZHMgb24gQVJNIHx8IEFSTTY0CiBzb3VyY2UgImRyaXZlcnMvY3B1aWRsZS9LY29uZmlnLmFybSIKIGVuZG1lbnUKIAotbWVudSAiQVJNNjQgQ1BVIElkbGUgRHJpdmVycyIKLWRlcGVuZHMgb24gQVJNNjQKLXNvdXJjZSAiZHJpdmVycy9jcHVpZGxlL0tjb25maWcuYXJtNjQiCi1lbmRtZW51Ci0KIG1lbnUgIk1JUFMgQ1BVIElkbGUgRHJpdmVycyIKIGRlcGVuZHMgb24gTUlQUwogc291cmNlICJkcml2ZXJzL2NwdWlkbGUvS2NvbmZpZy5taXBzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL0tjb25maWcuYXJtIGIvZHJpdmVycy9jcHVpZGxlL0tjb25maWcuYXJtCmluZGV4IDhlMDdjOTQuLjIxMzQwZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9LY29uZmlnLmFybQorKysgYi9kcml2ZXJzL2NwdWlkbGUvS2NvbmZpZy5hcm0KQEAgLTEsMTAgKzEsMjAgQEAKICMKICMgQVJNIENQVSBJZGxlIGRyaXZlcnMKICMKK2NvbmZpZyBBUk1fQ1BVSURMRQorICAgICAgICBib29sICJHZW5lcmljIEFSTS9BUk02NCBDUFUgaWRsZSBEcml2ZXIiCisgICAgICAgIHNlbGVjdCBEVF9JRExFX1NUQVRFUworICAgICAgICBoZWxwCisgICAgICAgICAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIGdlbmVyaWMgY3B1aWRsZSBkcml2ZXIgZm9yIEFSTS4KKyAgICAgICAgICBJdCBwcm92aWRlcyBhIGdlbmVyaWMgaWRsZSBkcml2ZXIgd2hvc2UgaWRsZSBzdGF0ZXMgYXJlIGNvbmZpZ3VyZWQKKyAgICAgICAgICBhdCBydW4tdGltZSB0aHJvdWdoIERUIG5vZGVzLiBUaGUgQ1BVaWRsZSBzdXNwZW5kIGJhY2tlbmQgaXMKKyAgICAgICAgICBpbml0aWFsaXplZCBieSBjYWxsaW5nIHRoZSBDUFUgb3BlcmF0aW9ucyBpbml0IGlkbGUgaG9vaworICAgICAgICAgIHByb3ZpZGVkIGJ5IGFyY2hpdGVjdHVyZSBjb2RlLgorCiBjb25maWcgQVJNX0JJR19MSVRUTEVfQ1BVSURMRQogCWJvb2wgIlN1cHBvcnQgZm9yIEFSTSBiaWcuTElUVExFIHByb2Nlc3NvcnMiCiAJZGVwZW5kcyBvbiBBUkNIX1ZFWFBSRVNTX1RDMl9QTSB8fCBBUkNIX0VYWU5PUwotCWRlcGVuZHMgb24gTUNQTQorCWRlcGVuZHMgb24gTUNQTSAmJiAhQVJNNjQKIAlzZWxlY3QgQVJNX0NQVV9TVVNQRU5ECiAJc2VsZWN0IENQVV9JRExFX01VTFRJUExFX0RSSVZFUlMKIAlzZWxlY3QgRFRfSURMRV9TVEFURVMKQEAgLTE2LDUxICsyNiw1MSBAQAogCiBjb25maWcgQVJNX0NMUFM3MTFYX0NQVUlETEUKIAlib29sICJDUFUgSWRsZSBEcml2ZXIgZm9yIENMUFM3MTFYIHByb2Nlc3NvcnMiCi0JZGVwZW5kcyBvbiBBUkNIX0NMUFM3MTFYIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gQVJDSF9DTFBTNzExWCAmJiAhQVJNNjQgfHwgQ09NUElMRV9URVNUCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIGNwdWlkbGUgb24gQ2lycnVzIExvZ2ljIENMUFM3MTFYIFNPQ3MuCiAKIGNvbmZpZyBBUk1fSElHSEJBTktfQ1BVSURMRQogCWJvb2wgIkNQVSBJZGxlIERyaXZlciBmb3IgQ2FseGVkYSBwcm9jZXNzb3JzIgotCWRlcGVuZHMgb24gQVJNX1BTQ0kKKwlkZXBlbmRzIG9uIEFSTV9QU0NJICYmICFBUk02NAogCXNlbGVjdCBBUk1fQ1BVX1NVU1BFTkQKIAloZWxwCiAJICBTZWxlY3QgdGhpcyB0byBlbmFibGUgY3B1aWRsZSBvbiBDYWx4ZWRhIHByb2Nlc3NvcnMuCiAKIGNvbmZpZyBBUk1fS0lSS1dPT0RfQ1BVSURMRQogCWJvb2wgIkNQVSBJZGxlIERyaXZlciBmb3IgTWFydmVsbCBLaXJrd29vZCBTb0NzIgotCWRlcGVuZHMgb24gTUFDSF9LSVJLV09PRAorCWRlcGVuZHMgb24gTUFDSF9LSVJLV09PRCAmJiAhQVJNNjQKIAloZWxwCiAJICBUaGlzIGFkZHMgdGhlIENQVSBJZGxlIGRyaXZlciBmb3IgTWFydmVsbCBLaXJrd29vZCBTb0NzLgogCiBjb25maWcgQVJNX1pZTlFfQ1BVSURMRQogCWJvb2wgIkNQVSBJZGxlIERyaXZlciBmb3IgWGlsaW54IFp5bnEgcHJvY2Vzc29ycyIKLQlkZXBlbmRzIG9uIEFSQ0hfWllOUQorCWRlcGVuZHMgb24gQVJDSF9aWU5RICYmICFBUk02NAogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBjcHVpZGxlIG9uIFhpbGlueCBaeW5xIHByb2Nlc3NvcnMuCiAKIGNvbmZpZyBBUk1fVTg1MDBfQ1BVSURMRQogCWJvb2wgIkNwdSBJZGxlIERyaXZlciBmb3IgdGhlIFNULUUgdTg1MDAgcHJvY2Vzc29ycyIKLQlkZXBlbmRzIG9uIEFSQ0hfVTg1MDAKKwlkZXBlbmRzIG9uIEFSQ0hfVTg1MDAgJiYgIUFSTTY0CiAJaGVscAogCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIGNwdWlkbGUgZm9yIFNULUUgdTg1MDAgcHJvY2Vzc29ycwogCiBjb25maWcgQVJNX0FUOTFfQ1BVSURMRQogCWJvb2wgIkNwdSBJZGxlIERyaXZlciBmb3IgdGhlIEFUOTEgcHJvY2Vzc29ycyIKIAlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIEFSQ0hfQVQ5MQorCWRlcGVuZHMgb24gQVJDSF9BVDkxICYmICFBUk02NAogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBjcHVpZGxlIGZvciBBVDkxIHByb2Nlc3NvcnMKIAogY29uZmlnIEFSTV9FWFlOT1NfQ1BVSURMRQogCWJvb2wgIkNwdSBJZGxlIERyaXZlciBmb3IgdGhlIEV4eW5vcyBwcm9jZXNzb3JzIgotCWRlcGVuZHMgb24gQVJDSF9FWFlOT1MKKwlkZXBlbmRzIG9uIEFSQ0hfRVhZTk9TICYmICFBUk02NAogCXNlbGVjdCBBUkNIX05FRURTX0NQVV9JRExFX0NPVVBMRUQgaWYgU01QCiAJaGVscAogCSAgU2VsZWN0IHRoaXMgdG8gZW5hYmxlIGNwdWlkbGUgZm9yIEV4eW5vcyBwcm9jZXNzb3JzCiAKIGNvbmZpZyBBUk1fTVZFQlVfVjdfQ1BVSURMRQogCWJvb2wgIkNQVSBJZGxlIERyaXZlciBmb3IgbXZlYnUgdjcgZmFtaWx5IHByb2Nlc3NvcnMiCi0JZGVwZW5kcyBvbiBBUkNIX01WRUJVCisJZGVwZW5kcyBvbiBBUkNIX01WRUJVICYmICFBUk02NAogCWhlbHAKIAkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBjcHVpZGxlIG9uIEFybWFkYSAzNzAsIDM4eCBhbmQgWFAgcHJvY2Vzc29ycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9LY29uZmlnLmFybTY0IGIvZHJpdmVycy9jcHVpZGxlL0tjb25maWcuYXJtNjQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZmZiMzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9jcHVpZGxlL0tjb25maWcuYXJtNjQKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jCi0jIEFSTTY0IENQVSBJZGxlIGRyaXZlcnMKLSMKLQotY29uZmlnIEFSTTY0X0NQVUlETEUKLQlib29sICJHZW5lcmljIEFSTTY0IENQVSBpZGxlIERyaXZlciIKLQlzZWxlY3QgRFRfSURMRV9TVEFURVMKLQloZWxwCi0JICBTZWxlY3QgdGhpcyB0byBlbmFibGUgZ2VuZXJpYyBjcHVpZGxlIGRyaXZlciBmb3IgQVJNNjQuCi0JICBJdCBwcm92aWRlcyBhIGdlbmVyaWMgaWRsZSBkcml2ZXIgd2hvc2UgaWRsZSBzdGF0ZXMgYXJlIGNvbmZpZ3VyZWQKLQkgIGF0IHJ1bi10aW1lIHRocm91Z2ggRFQgbm9kZXMuIFRoZSBDUFVpZGxlIHN1c3BlbmQgYmFja2VuZCBpcwotCSAgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyB0aGUgQ1BVIG9wZXJhdGlvbnMgaW5pdCBpZGxlIGhvb2sKLQkgIHByb3ZpZGVkIGJ5IGFyY2hpdGVjdHVyZSBjb2RlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL01ha2VmaWxlIGIvZHJpdmVycy9jcHVpZGxlL01ha2VmaWxlCmluZGV4IDRkMTc3YjkuLjNiYTgxYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NwdWlkbGUvTWFrZWZpbGUKQEAgLTE3LDE2ICsxNywxMyBAQAogb2JqLSQoQ09ORklHX0FSTV9VODUwMF9DUFVJRExFKSAgICAgICAgICs9IGNwdWlkbGUtdXg1MDAubwogb2JqLSQoQ09ORklHX0FSTV9BVDkxX0NQVUlETEUpICAgICAgICAgICs9IGNwdWlkbGUtYXQ5MS5vCiBvYmotJChDT05GSUdfQVJNX0VYWU5PU19DUFVJRExFKSAgICAgICAgKz0gY3B1aWRsZS1leHlub3Mubworb2JqLSQoQ09ORklHX0FSTV9DUFVJRExFKQkJKz0gY3B1aWRsZS1hcm0ubwogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIE1JUFMgZHJpdmVycwogb2JqLSQoQ09ORklHX01JUFNfQ1BTX0NQVUlETEUpCQkrPSBjcHVpZGxlLWNwcy5vCiAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQVJNNjQgZHJpdmVycwotb2JqLSQoQ09ORklHX0FSTTY0X0NQVUlETEUpCQkrPSBjcHVpZGxlLWFybTY0Lm8KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyBQT1dFUlBDIGRyaXZlcnMKIG9iai0kKENPTkZJR19QU0VSSUVTX0NQVUlETEUpCQkrPSBjcHVpZGxlLXBzZXJpZXMubwogb2JqLSQoQ09ORklHX1BPV0VSTlZfQ1BVSURMRSkJCSs9IGNwdWlkbGUtcG93ZXJudi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1hcm0uYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLWFybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTA2OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1hcm0uYwpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIEFSTS9BUk02NCBnZW5lcmljIENQVSBpZGxlIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQVJNIEx0ZC4KKyAqIEF1dGhvcjogTG9yZW56byBQaWVyYWxpc2kgPGxvcmVuem8ucGllcmFsaXNpQGFybS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJDUFVpZGxlIGFybTogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvY3B1X3BtLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vY3B1aWRsZS5oPgorCisjaW5jbHVkZSAiZHRfaWRsZV9zdGF0ZXMuaCIKKworLyoKKyAqIGFybV9lbnRlcl9pZGxlX3N0YXRlIC0gUHJvZ3JhbXMgQ1BVIHRvIGVudGVyIHRoZSBzcGVjaWZpZWQgc3RhdGUKKyAqCisgKiBkZXY6IGNwdWlkbGUgZGV2aWNlCisgKiBkcnY6IGNwdWlkbGUgZHJpdmVyCisgKiBpZHg6IHN0YXRlIGluZGV4CisgKgorICogQ2FsbGVkIGZyb20gdGhlIENQVWlkbGUgZnJhbWV3b3JrIHRvIHByb2dyYW0gdGhlIGRldmljZSB0byB0aGUKKyAqIHNwZWNpZmllZCB0YXJnZXQgc3RhdGUgc2VsZWN0ZWQgYnkgdGhlIGdvdmVybm9yLgorICovCitzdGF0aWMgaW50IGFybV9lbnRlcl9pZGxlX3N0YXRlKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LCBpbnQgaWR4KQoreworCWludCByZXQ7CisKKwlpZiAoIWlkeCkgeworCQljcHVfZG9faWRsZSgpOworCQlyZXR1cm4gaWR4OworCX0KKworCXJldCA9IGNwdV9wbV9lbnRlcigpOworCWlmICghcmV0KSB7CisJCS8qCisJCSAqIFBhc3MgaWRsZSBzdGF0ZSBpbmRleCB0byBjcHVfc3VzcGVuZCB3aGljaCBpbiB0dXJuIHdpbGwKKwkJICogY2FsbCB0aGUgQ1BVIG9wcyBzdXNwZW5kIHByb3RvY29sIHdpdGggaWRsZSBpbmRleCBhcyBhCisJCSAqIHBhcmFtZXRlci4KKwkJICovCisJCWFybV9jcHVpZGxlX3N1c3BlbmQoaWR4KTsKKworCQljcHVfcG1fZXhpdCgpOworCX0KKworCXJldHVybiByZXQgPyAtMSA6IGlkeDsKK30KKworc3RhdGljIHN0cnVjdCBjcHVpZGxlX2RyaXZlciBhcm1faWRsZV9kcml2ZXIgPSB7CisJLm5hbWUgPSAiYXJtX2lkbGUiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS8qCisJICogU3RhdGUgYXQgaW5kZXggMCBpcyBzdGFuZGJ5IHdmaSBhbmQgY29uc2lkZXJlZCBzdGFuZGFyZAorCSAqIG9uIGFsbCBBUk0gcGxhdGZvcm1zLiBJZiBpbiBzb21lIHBsYXRmb3JtcyBzaW1wbGUgd2ZpCisJICogY2FuJ3QgYmUgdXNlZCBhcyAic3RhdGUgMCIsIERUIGJpbmRpbmdzIG11c3QgYmUgaW1wbGVtZW50ZWQKKwkgKiB0byB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlIGFuZCBhbGxvdyBpbnN0YWxsaW5nIGEgc3BlY2lhbAorCSAqIGhhbmRsZXIgZm9yIGlkbGUgc3RhdGUgaW5kZXggMC4KKwkgKi8KKwkuc3RhdGVzWzBdID0geworCQkuZW50ZXIgICAgICAgICAgICAgICAgICA9IGFybV9lbnRlcl9pZGxlX3N0YXRlLAorCQkuZXhpdF9sYXRlbmN5ICAgICAgICAgICA9IDEsCisJCS50YXJnZXRfcmVzaWRlbmN5ICAgICAgID0gMSwKKwkJLnBvd2VyX3VzYWdlCQk9IFVJTlRfTUFYLAorCQkubmFtZSAgICAgICAgICAgICAgICAgICA9ICJXRkkiLAorCQkuZGVzYyAgICAgICAgICAgICAgICAgICA9ICJBUk0gV0ZJIiwKKwl9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhcm1faWRsZV9zdGF0ZV9tYXRjaFtdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAiYXJtLGlkbGUtc3RhdGUiLAorCSAgLmRhdGEgPSBhcm1fZW50ZXJfaWRsZV9zdGF0ZSB9LAorCXsgfSwKK307CisKKy8qCisgKiBhcm1faWRsZV9pbml0CisgKgorICogUmVnaXN0ZXJzIHRoZSBhcm0gc3BlY2lmaWMgY3B1aWRsZSBkcml2ZXIgd2l0aCB0aGUgY3B1aWRsZQorICogZnJhbWV3b3JrLiBJdCByZWxpZXMgb24gY29yZSBjb2RlIHRvIHBhcnNlIHRoZSBpZGxlIHN0YXRlcworICogYW5kIGluaXRpYWxpemUgdGhlbSB1c2luZyBkcml2ZXIgZGF0YSBzdHJ1Y3R1cmVzIGFjY29yZGluZ2x5LgorICovCitzdGF0aWMgaW50IF9faW5pdCBhcm1faWRsZV9pbml0KHZvaWQpCit7CisJaW50IGNwdSwgcmV0OworCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gJmFybV9pZGxlX2RyaXZlcjsKKwlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldjsKKworCS8qCisJICogSW5pdGlhbGl6ZSBpZGxlIHN0YXRlcyBkYXRhLCBzdGFydGluZyBhdCBpbmRleCAxLgorCSAqIFRoaXMgZHJpdmVyIGlzIERUIG9ubHksIGlmIG5vIERUIGlkbGUgc3RhdGVzIGFyZSBkZXRlY3RlZCAocmV0ID09IDApCisJICogbGV0IHRoZSBkcml2ZXIgaW5pdGlhbGl6YXRpb24gZmFpbCBhY2NvcmRpbmdseSBzaW5jZSB0aGVyZSBpcyBubworCSAqIHJlYXNvbiB0byBpbml0aWFsaXplIHRoZSBpZGxlIGRyaXZlciBpZiBvbmx5IHdmaSBpcyBzdXBwb3J0ZWQuCisJICovCisJcmV0ID0gZHRfaW5pdF9pZGxlX2RyaXZlcihkcnYsIGFybV9pZGxlX3N0YXRlX21hdGNoLCAxKTsKKwlpZiAocmV0IDw9IDApCisJCXJldHVybiByZXQgPyA6IC1FTk9ERVY7CisKKwlyZXQgPSBjcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcihkcnYpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgY3B1aWRsZSBkcml2ZXJcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogQ2FsbCBhcmNoIENQVSBvcGVyYXRpb25zIGluIG9yZGVyIHRvIGluaXRpYWxpemUKKwkgKiBpZGxlIHN0YXRlcyBzdXNwZW5kIGJhY2stZW5kIHNwZWNpZmljIGRhdGEKKwkgKi8KKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7CisJCXJldCA9IGFybV9jcHVpZGxlX2luaXQoY3B1KTsKKworCQkvKgorCQkgKiBTa2lwIHRoZSBjcHVpZGxlIGRldmljZSBpbml0aWFsaXphdGlvbiBpZiB0aGUgcmVwb3J0ZWQKKwkJICogZmFpbHVyZSBpcyBhIEhXIG1pc2NvbmZpZ3VyYXRpb24vYnJlYWthZ2UgKC1FTlhJTykuCisJCSAqLworCQlpZiAocmV0ID09IC1FTlhJTykKKwkJCWNvbnRpbnVlOworCisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiQ1BVICVkIGZhaWxlZCB0byBpbml0IGlkbGUgQ1BVIG9wc1xuIiwgY3B1KTsKKwkJCWdvdG8gb3V0X2ZhaWw7CisJCX0KKworCQlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZGV2KSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSBjcHVpZGxlIGRldmljZVxuIik7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisJCWRldi0+Y3B1ID0gY3B1OworCisJCXJldCA9IGNwdWlkbGVfcmVnaXN0ZXJfZGV2aWNlKGRldik7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIGNwdWlkbGUgZGV2aWNlIGZvciBDUFUgJWRcbiIsCisJCQkgICAgICAgY3B1KTsKKwkJCWtmcmVlKGRldik7CisJCQlnb3RvIG91dF9mYWlsOworCQl9CisJfQorCisJcmV0dXJuIDA7CitvdXRfZmFpbDoKKwl3aGlsZSAoLS1jcHUgPj0gMCkgeworCQlkZXYgPSBwZXJfY3B1KGNwdWlkbGVfZGV2aWNlcywgY3B1KTsKKwkJY3B1aWRsZV91bnJlZ2lzdGVyX2RldmljZShkZXYpOworCQlrZnJlZShkZXYpOworCX0KKworCWNwdWlkbGVfdW5yZWdpc3Rlcl9kcml2ZXIoZHJ2KTsKKworCXJldHVybiByZXQ7Cit9CitkZXZpY2VfaW5pdGNhbGwoYXJtX2lkbGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1hcm02NC5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtYXJtNjQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhMmM2Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1hcm02NC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qCi0gKiBBUk02NCBnZW5lcmljIENQVSBpZGxlIGRyaXZlci4KLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgQVJNIEx0ZC4KLSAqIEF1dGhvcjogTG9yZW56byBQaWVyYWxpc2kgPGxvcmVuem8ucGllcmFsaXNpQGFybS5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotCi0jZGVmaW5lIHByX2ZtdChmbXQpICJDUFVpZGxlIGFybTY0OiAiIGZtdAotCi0jaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVfcG0uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotCi0jaW5jbHVkZSA8YXNtL2NwdWlkbGUuaD4KLQotI2luY2x1ZGUgImR0X2lkbGVfc3RhdGVzLmgiCi0KLS8qCi0gKiBhcm02NF9lbnRlcl9pZGxlX3N0YXRlIC0gUHJvZ3JhbXMgQ1BVIHRvIGVudGVyIHRoZSBzcGVjaWZpZWQgc3RhdGUKLSAqCi0gKiBkZXY6IGNwdWlkbGUgZGV2aWNlCi0gKiBkcnY6IGNwdWlkbGUgZHJpdmVyCi0gKiBpZHg6IHN0YXRlIGluZGV4Ci0gKgotICogQ2FsbGVkIGZyb20gdGhlIENQVWlkbGUgZnJhbWV3b3JrIHRvIHByb2dyYW0gdGhlIGRldmljZSB0byB0aGUKLSAqIHNwZWNpZmllZCB0YXJnZXQgc3RhdGUgc2VsZWN0ZWQgYnkgdGhlIGdvdmVybm9yLgotICovCi1zdGF0aWMgaW50IGFybTY0X2VudGVyX2lkbGVfc3RhdGUoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCi0JCQkJICBzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwgaW50IGlkeCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKCFpZHgpIHsKLQkJY3B1X2RvX2lkbGUoKTsKLQkJcmV0dXJuIGlkeDsKLQl9Ci0KLQlyZXQgPSBjcHVfcG1fZW50ZXIoKTsKLQlpZiAoIXJldCkgewotCQkvKgotCQkgKiBQYXNzIGlkbGUgc3RhdGUgaW5kZXggdG8gY3B1X3N1c3BlbmQgd2hpY2ggaW4gdHVybiB3aWxsCi0JCSAqIGNhbGwgdGhlIENQVSBvcHMgc3VzcGVuZCBwcm90b2NvbCB3aXRoIGlkbGUgaW5kZXggYXMgYQotCQkgKiBwYXJhbWV0ZXIuCi0JCSAqLwotCQlyZXQgPSBjcHVfc3VzcGVuZChpZHgpOwotCi0JCWNwdV9wbV9leGl0KCk7Ci0JfQotCi0JcmV0dXJuIHJldCA/IC0xIDogaWR4OwotfQotCi1zdGF0aWMgc3RydWN0IGNwdWlkbGVfZHJpdmVyIGFybTY0X2lkbGVfZHJpdmVyID0gewotCS5uYW1lID0gImFybTY0X2lkbGUiLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS8qCi0JICogU3RhdGUgYXQgaW5kZXggMCBpcyBzdGFuZGJ5IHdmaSBhbmQgY29uc2lkZXJlZCBzdGFuZGFyZAotCSAqIG9uIGFsbCBBUk0gcGxhdGZvcm1zLiBJZiBpbiBzb21lIHBsYXRmb3JtcyBzaW1wbGUgd2ZpCi0JICogY2FuJ3QgYmUgdXNlZCBhcyAic3RhdGUgMCIsIERUIGJpbmRpbmdzIG11c3QgYmUgaW1wbGVtZW50ZWQKLQkgKiB0byB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlIGFuZCBhbGxvdyBpbnN0YWxsaW5nIGEgc3BlY2lhbAotCSAqIGhhbmRsZXIgZm9yIGlkbGUgc3RhdGUgaW5kZXggMC4KLQkgKi8KLQkuc3RhdGVzWzBdID0gewotCQkuZW50ZXIgICAgICAgICAgICAgICAgICA9IGFybTY0X2VudGVyX2lkbGVfc3RhdGUsCi0JCS5leGl0X2xhdGVuY3kgICAgICAgICAgID0gMSwKLQkJLnRhcmdldF9yZXNpZGVuY3kgICAgICAgPSAxLAotCQkucG93ZXJfdXNhZ2UJCT0gVUlOVF9NQVgsCi0JCS5uYW1lICAgICAgICAgICAgICAgICAgID0gIldGSSIsCi0JCS5kZXNjICAgICAgICAgICAgICAgICAgID0gIkFSTTY0IFdGSSIsCi0JfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJtNjRfaWRsZV9zdGF0ZV9tYXRjaFtdIF9faW5pdGNvbnN0ID0gewotCXsgLmNvbXBhdGlibGUgPSAiYXJtLGlkbGUtc3RhdGUiLAotCSAgLmRhdGEgPSBhcm02NF9lbnRlcl9pZGxlX3N0YXRlIH0sCi0JeyB9LAotfTsKLQotLyoKLSAqIGFybTY0X2lkbGVfaW5pdAotICoKLSAqIFJlZ2lzdGVycyB0aGUgYXJtNjQgc3BlY2lmaWMgY3B1aWRsZSBkcml2ZXIgd2l0aCB0aGUgY3B1aWRsZQotICogZnJhbWV3b3JrLiBJdCByZWxpZXMgb24gY29yZSBjb2RlIHRvIHBhcnNlIHRoZSBpZGxlIHN0YXRlcwotICogYW5kIGluaXRpYWxpemUgdGhlbSB1c2luZyBkcml2ZXIgZGF0YSBzdHJ1Y3R1cmVzIGFjY29yZGluZ2x5LgotICovCi1zdGF0aWMgaW50IF9faW5pdCBhcm02NF9pZGxlX2luaXQodm9pZCkKLXsKLQlpbnQgY3B1LCByZXQ7Ci0Jc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYgPSAmYXJtNjRfaWRsZV9kcml2ZXI7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgaWRsZSBzdGF0ZXMgZGF0YSwgc3RhcnRpbmcgYXQgaW5kZXggMS4KLQkgKiBUaGlzIGRyaXZlciBpcyBEVCBvbmx5LCBpZiBubyBEVCBpZGxlIHN0YXRlcyBhcmUgZGV0ZWN0ZWQgKHJldCA9PSAwKQotCSAqIGxldCB0aGUgZHJpdmVyIGluaXRpYWxpemF0aW9uIGZhaWwgYWNjb3JkaW5nbHkgc2luY2UgdGhlcmUgaXMgbm8KLQkgKiByZWFzb24gdG8gaW5pdGlhbGl6ZSB0aGUgaWRsZSBkcml2ZXIgaWYgb25seSB3ZmkgaXMgc3VwcG9ydGVkLgotCSAqLwotCXJldCA9IGR0X2luaXRfaWRsZV9kcml2ZXIoZHJ2LCBhcm02NF9pZGxlX3N0YXRlX21hdGNoLCAxKTsKLQlpZiAocmV0IDw9IDApCi0JCXJldHVybiByZXQgPyA6IC1FTk9ERVY7Ci0KLQkvKgotCSAqIENhbGwgYXJjaCBDUFUgb3BlcmF0aW9ucyBpbiBvcmRlciB0byBpbml0aWFsaXplCi0JICogaWRsZSBzdGF0ZXMgc3VzcGVuZCBiYWNrLWVuZCBzcGVjaWZpYyBkYXRhCi0JICovCi0JZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewotCQlyZXQgPSBjcHVfaW5pdF9pZGxlKGNwdSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiQ1BVICVkIGZhaWxlZCB0byBpbml0IGlkbGUgQ1BVIG9wc1xuIiwgY3B1KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gY3B1aWRsZV9yZWdpc3RlcihkcnYsIE5VTEwpOwotfQotZGV2aWNlX2luaXRjYWxsKGFybTY0X2lkbGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1hdDkxLmMgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1hdDkxLmMKaW5kZXggYWFlN2JmYy4uZjI0NDZjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtYXQ5MS5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLWF0OTEuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogI2luY2x1ZGUgPGFzbS9jcHVpZGxlLmg+CiAKICNkZWZpbmUgQVQ5MV9NQVhfU1RBVEVTCTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLWV4eW5vcy5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtZXh5bm9zLmMKaW5kZXggMjZmNWYyOS4uMGMwNmVhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtZXh5bm9zLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtZXh5bm9zLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvY3B1aWRsZS1leHlub3MuaD4KIAotI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWlkbGUuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUta2lya3dvb2QuYyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLWtpcmt3b29kLmMKaW5kZXggY2VhMGE2Yy4uZDIzZDhmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUta2lya3dvb2QuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1raXJrd29vZC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CiAjaW5jbHVkZSA8YXNtL2NwdWlkbGUuaD4KIAogI2RlZmluZSBLSVJLV09PRF9NQVhfU1RBVEVTCTIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLW12ZWJ1LXY3LmMgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS1tdmVidS12Ny5jCmluZGV4IDM4ZTY4NjEuLjk4MDE1MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLW12ZWJ1LXY3LmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtbXZlYnUtdjcuYwpAQCAtMzcsMTEgKzM3LDExIEBACiAJCWRlZXBpZGxlID0gdHJ1ZTsKIAogCXJldCA9IG12ZWJ1X3Y3X2NwdV9zdXNwZW5kKGRlZXBpZGxlKTsKKwljcHVfcG1fZXhpdCgpOworCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWNwdV9wbV9leGl0KCk7Ci0KIAlyZXR1cm4gaW5kZXg7CiB9CiAKQEAgLTUwLDE3ICs1MCwxNyBAQAogCS5zdGF0ZXNbMF0JCT0gQVJNX0NQVUlETEVfV0ZJX1NUQVRFLAogCS5zdGF0ZXNbMV0JCT0gewogCQkuZW50ZXIJCQk9IG12ZWJ1X3Y3X2VudGVyX2lkbGUsCi0JCS5leGl0X2xhdGVuY3kJCT0gMTAsCisJCS5leGl0X2xhdGVuY3kJCT0gMTAwLAogCQkucG93ZXJfdXNhZ2UJCT0gNTAsCi0JCS50YXJnZXRfcmVzaWRlbmN5CT0gMTAwLAorCQkudGFyZ2V0X3Jlc2lkZW5jeQk9IDEwMDAsCiAJCS5uYW1lCQkJPSAiTVYgQ1BVIElETEUiLAogCQkuZGVzYwkJCT0gIkNQVSBwb3dlciBkb3duIiwKIAl9LAogCS5zdGF0ZXNbMl0JCT0gewogCQkuZW50ZXIJCQk9IG12ZWJ1X3Y3X2VudGVyX2lkbGUsCi0JCS5leGl0X2xhdGVuY3kJCT0gMTAwLAorCQkuZXhpdF9sYXRlbmN5CQk9IDEwMDAsCiAJCS5wb3dlcl91c2FnZQkJPSA1LAotCQkudGFyZ2V0X3Jlc2lkZW5jeQk9IDEwMDAsCisJCS50YXJnZXRfcmVzaWRlbmN5CT0gMTAwMDAsCiAJCS5mbGFncwkJCT0gTVZFQlVfVjdfRkxBR19ERUVQX0lETEUsCiAJCS5uYW1lCQkJPSAiTVYgQ1BVIERFRVAgSURMRSIsCiAJCS5kZXNjCQkJPSAiQ1BVIGFuZCBMMiBGYWJyaWMgcG93ZXIgZG93biIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS11eDUwMC5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtdXg1MDAuYwppbmRleCA2NmY4MWU0Li44YmY4OTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS11eDUwMC5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXV4NTAwLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9jcHVpZGxlLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2MtZm5zLmg+CiAKIHN0YXRpYyBhdG9taWNfdCBtYXN0ZXIgPSBBVE9NSUNfSU5JVCgwKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWFzdGVyX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtenlucS5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUtenlucS5jCmluZGV4IDAwMmI4YzkuLjU0MzI5MmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLXp5bnEuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS16eW5xLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGFzbS9wcm9jLWZucy5oPgogI2luY2x1ZGUgPGFzbS9jcHVpZGxlLmg+CiAKICNkZWZpbmUgWllOUV9NQVhfU1RBVEVTCQkyCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYwppbmRleCAwODBiZDJkLi43YTczYTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKQEAgLTMzMCw5ICszMzAsNiBAQAogCWlmICghZGV2LT5yZWdpc3RlcmVkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICghZGV2LT5zdGF0ZV9jb3VudCkKLQkJZGV2LT5zdGF0ZV9jb3VudCA9IGRydi0+c3RhdGVfY291bnQ7Ci0KIAlyZXQgPSBjcHVpZGxlX2FkZF9kZXZpY2Vfc3lzZnMoZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVpZGxlL2RyaXZlci5jIGIvZHJpdmVycy9jcHVpZGxlL2RyaXZlci5jCmluZGV4IDI2OTdlODcuLjVkYjE0NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9kcml2ZXIuYworKysgYi9kcml2ZXJzL2NwdWlkbGUvZHJpdmVyLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KIAogI2luY2x1ZGUgImNwdWlkbGUuaCIKIApAQCAtMTMwLDIxICsxMzAsMjAgQEAKICNlbmRpZgogCiAvKioKLSAqIGNwdWlkbGVfc2V0dXBfYnJvYWRjYXN0X3RpbWVyIC0gZW5hYmxlL2Rpc2FibGUgdGhlIGJyb2FkY2FzdCB0aW1lcgorICogY3B1aWRsZV9zZXR1cF9icm9hZGNhc3RfdGltZXIgLSBlbmFibGUvZGlzYWJsZSB0aGUgYnJvYWRjYXN0IHRpbWVyIG9uIGEgY3B1CiAgKiBAYXJnOiBhIHZvaWQgcG9pbnRlciB1c2VkIHRvIG1hdGNoIHRoZSBTTVAgY3Jvc3MgY2FsbCBBUEkKICAqCi0gKiBAYXJnIGlzIHVzZWQgYXMgYSB2YWx1ZSBvZiB0eXBlICdsb25nJyB3aXRoIG9uZSBvZiB0aGUgdHdvIHZhbHVlczoKLSAqIC0gQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfT04KLSAqIC0gQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfT0ZGCisgKiBJZiBAYXJnIGlzIE5VTEwgYnJvYWRjYXN0IGlzIGRpc2FibGVkIG90aGVyd2lzZSBlbmFibGVkCiAgKgotICogU2V0IHRoZSBicm9hZGNhc3QgdGltZXIgbm90aWZpY2F0aW9uIGZvciB0aGUgY3VycmVudCBDUFUuICBUaGlzIGZ1bmN0aW9uCi0gKiBpcyBleGVjdXRlZCBwZXIgQ1BVIGJ5IGFuIFNNUCBjcm9zcyBjYWxsLiAgSXQgbm90IHN1cHBvc2VkIHRvIGJlIGNhbGxlZAotICogZGlyZWN0bHkuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkIHBlciBDUFUgYnkgYW4gU01QIGNyb3NzIGNhbGwuICBJdCdzIG5vdAorICogc3VwcG9zZWQgdG8gYmUgY2FsbGVkIGRpcmVjdGx5LgogICovCiBzdGF0aWMgdm9pZCBjcHVpZGxlX3NldHVwX2Jyb2FkY2FzdF90aW1lcih2b2lkICphcmcpCiB7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQljbG9ja2V2ZW50c19ub3RpZnkoKGxvbmcpKGFyZyksICZjcHUpOworCWlmIChhcmcpCisJCXRpY2tfYnJvYWRjYXN0X2VuYWJsZSgpOworCWVsc2UKKwkJdGlja19icm9hZGNhc3RfZGlzYWJsZSgpOwogfQogCiAvKioKQEAgLTIzOSw3ICsyMzgsNyBAQAogCiAJaWYgKGRydi0+YmN0aW1lcikKIAkJb25fZWFjaF9jcHVfbWFzayhkcnYtPmNwdW1hc2ssIGNwdWlkbGVfc2V0dXBfYnJvYWRjYXN0X3RpbWVyLAotCQkJCSAodm9pZCAqKUNMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OLCAxKTsKKwkJCQkgKHZvaWQgKikxLCAxKTsKIAogCXBvbGxfaWRsZV9pbml0KGRydik7CiAKQEAgLTI2Myw3ICsyNjIsNyBAQAogCWlmIChkcnYtPmJjdGltZXIpIHsKIAkJZHJ2LT5iY3RpbWVyID0gMDsKIAkJb25fZWFjaF9jcHVfbWFzayhkcnYtPmNwdW1hc2ssIGNwdWlkbGVfc2V0dXBfYnJvYWRjYXN0X3RpbWVyLAotCQkJCSAodm9pZCAqKUNMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09GRiwgMSk7CisJCQkJIE5VTEwsIDEpOwogCX0KIAogCV9fY3B1aWRsZV91bnNldF9kcml2ZXIoZHJ2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9zeXNmcy5jIGIvZHJpdmVycy9jcHVpZGxlL3N5c2ZzLmMKaW5kZXggOTdjNTkwMy4uODMyYTJjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL3N5c2ZzLmMKKysrIGIvZHJpdmVycy9jcHVpZGxlL3N5c2ZzLmMKQEAgLTQwMSw3ICs0MDEsNyBAQAogCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gY3B1aWRsZV9nZXRfY3B1X2RyaXZlcihkZXZpY2UpOwogCiAJLyogc3RhdGUgc3RhdGlzdGljcyAqLwotCWZvciAoaSA9IDA7IGkgPCBkZXZpY2UtPnN0YXRlX2NvdW50OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgZHJ2LT5zdGF0ZV9jb3VudDsgaSsrKSB7CiAJCWtvYmogPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV9rb2JqKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICgha29iaikKIAkJCWdvdG8gZXJyb3Jfc3RhdGU7CkBAIC00MzMsOSArNDMzLDEwIEBACiAgKi8KIHN0YXRpYyB2b2lkIGNwdWlkbGVfcmVtb3ZlX3N0YXRlX3N5c2ZzKHN0cnVjdCBjcHVpZGxlX2RldmljZSAqZGV2aWNlKQogeworCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gY3B1aWRsZV9nZXRfY3B1X2RyaXZlcihkZXZpY2UpOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IGRldmljZS0+c3RhdGVfY291bnQ7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgZHJ2LT5zdGF0ZV9jb3VudDsgaSsrKQogCQljcHVpZGxlX2ZyZWVfc3RhdGVfa29iaihkZXZpY2UsIGkpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9LY29uZmlnIGIvZHJpdmVycy9jcnlwdG8vS2NvbmZpZwppbmRleCAyZmIwZmRmLi44MDBiZjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9LY29uZmlnCisrKyBiL2RyaXZlcnMvY3J5cHRvL0tjb25maWcKQEAgLTM5MSw3ICszOTEsNyBAQAogCiBjb25maWcgQ1JZUFRPX0RFVl9DQ1AKIAlib29sICJTdXBwb3J0IGZvciBBTUQgQ3J5cHRvZ3JhcGhpYyBDb3Byb2Nlc3NvciIKLQlkZXBlbmRzIG9uIChYODYgJiYgUENJKSB8fCBBUk02NAorCWRlcGVuZHMgb24gKChYODYgJiYgUENJKSB8fCAoQVJNNjQgJiYgKE9GX0FERFJFU1MgfHwgQUNQSSkpKSAmJiBIQVNfSU9NRU0KIAlkZWZhdWx0IG4KIAloZWxwCiAJICBUaGUgQU1EIENyeXB0b2dyYXBoaWMgQ29wcm9jZXNzb3IgcHJvdmlkZXMgaGFyZHdhcmUgc3VwcG9ydApAQCAtNDM2LDQgKzQzNiwyNiBAQAogCSAgaGFyZHdhcmUuIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuIFRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHFjcnlwdG8uCiAKK2NvbmZpZyBDUllQVE9fREVWX1ZNWAorCWJvb2wgIlN1cHBvcnQgZm9yIFZNWCBjcnlwdG9ncmFwaGljIGFjY2VsZXJhdGlvbiBpbnN0cnVjdGlvbnMiCisJZGVwZW5kcyBvbiBQUEM2NAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFZNWCBjcnlwdG9ncmFwaGljIGFjY2VsZXJhdGlvbiBpbnN0cnVjdGlvbnMuCisKK3NvdXJjZSAiZHJpdmVycy9jcnlwdG8vdm14L0tjb25maWciCisKK2NvbmZpZyBDUllQVE9fREVWX0lNR1RFQ19IQVNICisJZGVwZW5kcyBvbiBNSVBTIHx8IENPTVBJTEVfVEVTVAorCXRyaXN0YXRlICJJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMgaGFyZHdhcmUgaGFzaCBhY2NlbGVyYXRvciIKKwlzZWxlY3QgQ1JZUFRPX0FMR0FQSQorCXNlbGVjdCBDUllQVE9fTUQ1CisJc2VsZWN0IENSWVBUT19TSEExCisJc2VsZWN0IENSWVBUT19TSEEyNTYKKwlzZWxlY3QgQ1JZUFRPX0hBU0gKKwloZWxwCisJICBUaGlzIGRyaXZlciBpbnRlcmZhY2VzIHdpdGggdGhlIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcworCSAgaGFyZHdhcmUgaGFzaCBhY2NlbGVyYXRvci4gU3VwcG9ydGluZyBNRDUvU0hBMS9TSEEyMjQvU0hBMjU2CisJICBoYXNoaW5nIGFsZ29yaXRobXMuCisKIGVuZGlmICMgQ1JZUFRPX0hXCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9NYWtlZmlsZSBiL2RyaXZlcnMvY3J5cHRvL01ha2VmaWxlCmluZGV4IDM5MjRmOTMuLmZiODRiZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY3J5cHRvL01ha2VmaWxlCkBAIC02LDYgKzYsNyBAQAogb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfRlNMX0NBQU0pICs9IGNhYW0vCiBvYmotJChDT05GSUdfQ1JZUFRPX0RFVl9HRU9ERSkgKz0gZ2VvZGUtYWVzLm8KIG9iai0kKENPTkZJR19DUllQVE9fREVWX0hJRk5fNzk1WCkgKz0gaGlmbl83OTV4Lm8KK29iai0kKENPTkZJR19DUllQVE9fREVWX0lNR1RFQ19IQVNIKSArPSBpbWctaGFzaC5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0RFVl9JWFA0WFgpICs9IGl4cDR4eF9jcnlwdG8ubwogb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfTVZfQ0VTQSkgKz0gbXZfY2VzYS5vCiBvYmotJChDT05GSUdfQ1JZUFRPX0RFVl9NWFNfRENQKSArPSBteHMtZGNwLm8KQEAgLTI1LDMgKzI2LDQgQEAKIG9iai0kKENPTkZJR19DUllQVE9fREVWX1VYNTAwKSArPSB1eDUwMC8KIG9iai0kKENPTkZJR19DUllQVE9fREVWX1FBVCkgKz0gcWF0Lwogb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfUUNFKSArPSBxY2UvCitvYmotJChDT05GSUdfQ1JZUFRPX0RFVl9WTVgpICs9IHZteC8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2FtY2MvY3J5cHRvNHh4X2NvcmUuYyBiL2RyaXZlcnMvY3J5cHRvL2FtY2MvY3J5cHRvNHh4X2NvcmUuYwppbmRleCBkMDJiNzcxLi4zYjI4ZThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9hbWNjL2NyeXB0bzR4eF9jb3JlLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vYW1jYy9jcnlwdG80eHhfY29yZS5jCkBAIC0xMTU1LDcgKzExNTUsNyBAQAogLyoqCiAgKiBNb2R1bGUgSW5pdGlhbGl6YXRpb24gUm91dGluZQogICovCi1zdGF0aWMgaW50IF9faW5pdCBjcnlwdG80eHhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYpCitzdGF0aWMgaW50IGNyeXB0bzR4eF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKIHsKIAlpbnQgcmM7CiAJc3RydWN0IHJlc291cmNlIHJlczsKQEAgLTEyNjMsNyArMTI2Myw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBjcnlwdG80eHhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQorc3RhdGljIGludCBjcnlwdG80eHhfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZvZmRldi0+ZGV2OwogCXN0cnVjdCBjcnlwdG80eHhfY29yZV9kZXZpY2UgKmNvcmVfZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC0xMjkxLDcgKzEyOTEsNyBAQAogCQkub2ZfbWF0Y2hfdGFibGUgPSBjcnlwdG80eHhfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gY3J5cHRvNHh4X3Byb2JlLAotCS5yZW1vdmUJCT0gX19leGl0X3AoY3J5cHRvNHh4X3JlbW92ZSksCisJLnJlbW92ZQkJPSBjcnlwdG80eHhfcmVtb3ZlLAogfTsKIAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihjcnlwdG80eHhfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2F0bWVsLWFlcy5jIGIvZHJpdmVycy9jcnlwdG8vYXRtZWwtYWVzLmMKaW5kZXggNjU5N2FhYy4uMGY5YTlkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vYXRtZWwtYWVzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vYXRtZWwtYWVzLmMKQEAgLTMxNSwxMCArMzE1LDEwIEBACiAKIAlkZC0+ZG1hX3NpemUgPSBsZW5ndGg7CiAKLQlpZiAoIShkZC0+ZmxhZ3MgJiBBRVNfRkxBR1NfRkFTVCkpIHsKLQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGQtPmRldiwgZG1hX2FkZHJfaW4sIGxlbmd0aCwKLQkJCQkJICAgRE1BX1RPX0RFVklDRSk7Ci0JfQorCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRkLT5kZXYsIGRtYV9hZGRyX2luLCBsZW5ndGgsCisJCQkJICAgRE1BX1RPX0RFVklDRSk7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGQtPmRldiwgZG1hX2FkZHJfb3V0LCBsZW5ndGgsCisJCQkJICAgRE1BX0ZST01fREVWSUNFKTsKIAogCWlmIChkZC0+ZmxhZ3MgJiBBRVNfRkxBR1NfQ0ZCOCkgewogCQlkZC0+ZG1hX2xjaF9pbi5kbWFfY29uZi5kc3RfYWRkcl93aWR0aCA9CkBAIC0zOTEsNiArMzkxLDExIEBACiB7CiAJZGQtPmZsYWdzICY9IH5BRVNfRkxBR1NfRE1BOwogCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGQtPmRldiwgZGQtPmRtYV9hZGRyX2luLAorCQkJCWRkLT5kbWFfc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZGQtPmRldiwgZGQtPmRtYV9hZGRyX291dCwKKwkJCQlkZC0+ZG1hX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CisKIAkvKiB1c2UgY2FjaGUgYnVmZmVycyAqLwogCWRkLT5uYl9pbl9zZyA9IGF0bWVsX2Flc19zZ19sZW5ndGgoZGQtPnJlcSwgZGQtPmluX3NnKTsKIAlpZiAoIWRkLT5uYl9pbl9zZykKQEAgLTQ1OSw2ICs0NjQsOSBAQAogCQlkZC0+ZmxhZ3MgfD0gQUVTX0ZMQUdTX0ZBU1Q7CiAKIAl9IGVsc2UgeworCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdShkZC0+ZGV2LCBkZC0+ZG1hX2FkZHJfaW4sCisJCQkJCWRkLT5kbWFfc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisKIAkJLyogdXNlIGNhY2hlIGJ1ZmZlcnMgKi8KIAkJY291bnQgPSBhdG1lbF9hZXNfc2dfY29weSgmZGQtPmluX3NnLCAmZGQtPmluX29mZnNldCwKIAkJCQlkZC0+YnVmX2luLCBkZC0+YnVmbGVuLCBkZC0+dG90YWwsIDApOwpAQCAtNjE5LDcgKzYyNyw3IEBACiAJCQlkbWFfdW5tYXBfc2coZGQtPmRldiwgZGQtPm91dF9zZywgMSwgRE1BX0ZST01fREVWSUNFKTsKIAkJCWRtYV91bm1hcF9zZyhkZC0+ZGV2LCBkZC0+aW5fc2csIDEsIERNQV9UT19ERVZJQ0UpOwogCQl9IGVsc2UgewotCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZGQtPmRldiwgZGQtPmRtYV9hZGRyX291dCwKKwkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRkLT5kZXYsIGRkLT5kbWFfYWRkcl9vdXQsCiAJCQkJZGQtPmRtYV9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJCQkvKiBjb3B5IGRhdGEgKi8KQEAgLTEyNDYsNiArMTI1NCwxMSBAQAogCiAJLyoga2VlcCBvbmx5IG1ham9yIHZlcnNpb24gbnVtYmVyICovCiAJc3dpdGNoIChkZC0+aHdfdmVyc2lvbiAmIDB4ZmYwKSB7CisJY2FzZSAweDIwMDoKKwkJZGQtPmNhcHMuaGFzX2R1YWxidWZmID0gMTsKKwkJZGQtPmNhcHMuaGFzX2NmYjY0ID0gMTsKKwkJZGQtPmNhcHMubWF4X2J1cnN0X3NpemUgPSA0OworCQlicmVhazsKIAljYXNlIDB4MTMwOgogCQlkZC0+Y2Fwcy5oYXNfZHVhbGJ1ZmYgPSAxOwogCQlkZC0+Y2Fwcy5oYXNfY2ZiNjQgPSAxOwpAQCAtMTMzNiw2ICsxMzQ5LDcgQEAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBhZXNfZGQpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmFlc19kZC0+bGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJmFlc19kZC0+bG9jayk7CiAKIAl0YXNrbGV0X2luaXQoJmFlc19kZC0+ZG9uZV90YXNrLCBhdG1lbF9hZXNfZG9uZV90YXNrLAogCQkJCQkodW5zaWduZWQgbG9uZylhZXNfZGQpOwpAQCAtMTM3NCw3ICsxMzg4LDcgQEAKIAkvKiBJbml0aWFsaXppbmcgdGhlIGNsb2NrICovCiAJYWVzX2RkLT5pY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiYWVzX2NsayIpOwogCWlmIChJU19FUlIoYWVzX2RkLT5pY2xrKSkgewotCQlkZXZfZXJyKGRldiwgImNsb2NrIGludGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJCWRldl9lcnIoZGV2LCAiY2xvY2sgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CiAJCWVyciA9IFBUUl9FUlIoYWVzX2RkLT5pY2xrKTsKIAkJZ290byBjbGtfZXJyOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2F0bWVsLXNoYS5jIGIvZHJpdmVycy9jcnlwdG8vYXRtZWwtc2hhLmMKaW5kZXggMzRkYjA0YS4uNWIzNTQzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vYXRtZWwtc2hhLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vYXRtZWwtc2hhLmMKQEAgLTE2Myw4ICsxNjMsMjAgQEAKIAkJY291bnQgPSBtaW4oY3R4LT5zZy0+bGVuZ3RoIC0gY3R4LT5vZmZzZXQsIGN0eC0+dG90YWwpOwogCQljb3VudCA9IG1pbihjb3VudCwgY3R4LT5idWZsZW4gLSBjdHgtPmJ1ZmNudCk7CiAKLQkJaWYgKGNvdW50IDw9IDApCi0JCQlicmVhazsKKwkJaWYgKGNvdW50IDw9IDApIHsKKwkJCS8qCisJCQkqIENoZWNrIGlmIGNvdW50IDw9IDAgYmVjYXVzZSB0aGUgYnVmZmVyIGlzIGZ1bGwgb3IKKwkJCSogYmVjYXVzZSB0aGUgc2cgbGVuZ3RoIGlzIDAuIEluIHRoZSBsYXRlc3QgY2FzZSwKKwkJCSogY2hlY2sgaWYgdGhlcmUgaXMgYW5vdGhlciBzZyBpbiB0aGUgbGlzdCwgYSAwIGxlbmd0aAorCQkJKiBzZyBkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4gdGhlIGVuZCBvZiB0aGUgc2cgbGlzdC4KKwkJCSovCisJCQlpZiAoKGN0eC0+c2ctPmxlbmd0aCA9PSAwKSAmJiAhc2dfaXNfbGFzdChjdHgtPnNnKSkgeworCQkJCWN0eC0+c2cgPSBzZ19uZXh0KGN0eC0+c2cpOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQogCiAJCXNjYXR0ZXJ3YWxrX21hcF9hbmRfY29weShjdHgtPmJ1ZmZlciArIGN0eC0+YnVmY250LCBjdHgtPnNnLAogCQkJY3R4LT5vZmZzZXQsIGNvdW50LCAwKTsKQEAgLTQyMCwxNCArNDMyLDggQEAKIAlkZXZfZGJnKGRkLT5kZXYsICJ4bWl0X2RtYTogZGlnY250OiAweCVsbHggMHglbGx4LCBsZW5ndGg6ICVkLCBmaW5hbDogJWRcbiIsCiAJCWN0eC0+ZGlnY250WzFdLCBjdHgtPmRpZ2NudFswXSwgbGVuZ3RoMSwgZmluYWwpOwogCi0JaWYgKGN0eC0+ZmxhZ3MgJiAoU0hBX0ZMQUdTX1NIQTEgfCBTSEFfRkxBR1NfU0hBMjI0IHwKLQkJCVNIQV9GTEFHU19TSEEyNTYpKSB7Ci0JCWRkLT5kbWFfbGNoX2luLmRtYV9jb25mLnNyY19tYXhidXJzdCA9IDE2OwotCQlkZC0+ZG1hX2xjaF9pbi5kbWFfY29uZi5kc3RfbWF4YnVyc3QgPSAxNjsKLQl9IGVsc2UgewotCQlkZC0+ZG1hX2xjaF9pbi5kbWFfY29uZi5zcmNfbWF4YnVyc3QgPSAzMjsKLQkJZGQtPmRtYV9sY2hfaW4uZG1hX2NvbmYuZHN0X21heGJ1cnN0ID0gMzI7Ci0JfQorCWRkLT5kbWFfbGNoX2luLmRtYV9jb25mLnNyY19tYXhidXJzdCA9IDE2OworCWRkLT5kbWFfbGNoX2luLmRtYV9jb25mLmRzdF9tYXhidXJzdCA9IDE2OwogCiAJZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhkZC0+ZG1hX2xjaF9pbi5jaGFuLCAmZGQtPmRtYV9sY2hfaW4uZG1hX2NvbmYpOwogCkBAIC01MjksNyArNTM1LDcgQEAKIAlpZiAoZmluYWwpCiAJCWF0bWVsX3NoYV9maWxsX3BhZGRpbmcoY3R4LCAwKTsKIAotCWlmIChmaW5hbCB8fCAoY3R4LT5idWZjbnQgPT0gY3R4LT5idWZsZW4gJiYgY3R4LT50b3RhbCkpIHsKKwlpZiAoZmluYWwgfHwgKGN0eC0+YnVmY250ID09IGN0eC0+YnVmbGVuKSkgewogCQljb3VudCA9IGN0eC0+YnVmY250OwogCQljdHgtPmJ1ZmNudCA9IDA7CiAJCXJldHVybiBhdG1lbF9zaGFfeG1pdF9kbWFfbWFwKGRkLCBjdHgsIGNvdW50LCBmaW5hbCk7CkBAIC0xMjY2LDYgKzEyNzIsMTIgQEAKIAogCS8qIGtlZXAgb25seSBtYWpvciB2ZXJzaW9uIG51bWJlciAqLwogCXN3aXRjaCAoZGQtPmh3X3ZlcnNpb24gJiAweGZmMCkgeworCWNhc2UgMHg0MjA6CisJCWRkLT5jYXBzLmhhc19kbWEgPSAxOworCQlkZC0+Y2Fwcy5oYXNfZHVhbGJ1ZmYgPSAxOworCQlkZC0+Y2Fwcy5oYXNfc2hhMjI0ID0gMTsKKwkJZGQtPmNhcHMuaGFzX3NoYV8zODRfNTEyID0gMTsKKwkJYnJlYWs7CiAJY2FzZSAweDQxMDoKIAkJZGQtPmNhcHMuaGFzX2RtYSA9IDE7CiAJCWRkLT5jYXBzLmhhc19kdWFsYnVmZiA9IDE7CkBAIC0xMzQ5LDYgKzEzNjEsNyBAQAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHNoYV9kZCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmc2hhX2RkLT5saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmc2hhX2RkLT5sb2NrKTsKIAogCXRhc2tsZXRfaW5pdCgmc2hhX2RkLT5kb25lX3Rhc2ssIGF0bWVsX3NoYV9kb25lX3Rhc2ssCiAJCQkJCSh1bnNpZ25lZCBsb25nKXNoYV9kZCk7CkBAIC0xMzg1LDcgKzEzOTgsNyBAQAogCS8qIEluaXRpYWxpemluZyB0aGUgY2xvY2sgKi8KIAlzaGFfZGQtPmljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJzaGFfY2xrIik7CiAJaWYgKElTX0VSUihzaGFfZGQtPmljbGspKSB7Ci0JCWRldl9lcnIoZGV2LCAiY2xvY2sgaW50aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKwkJZGV2X2VycihkZXYsICJjbG9jayBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKIAkJZXJyID0gUFRSX0VSUihzaGFfZGQtPmljbGspOwogCQlnb3RvIGNsa19lcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vYXRtZWwtdGRlcy5jIGIvZHJpdmVycy9jcnlwdG8vYXRtZWwtdGRlcy5jCmluZGV4IDI1ODc3MmQuLmNhMjk5OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2F0bWVsLXRkZXMuYworKysgYi9kcml2ZXJzL2NyeXB0by9hdG1lbC10ZGVzLmMKQEAgLTEzNzAsNiArMTM3MCw3IEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdGRlc19kZCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmdGRlc19kZC0+bGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJnRkZXNfZGQtPmxvY2spOwogCiAJdGFza2xldF9pbml0KCZ0ZGVzX2RkLT5kb25lX3Rhc2ssIGF0bWVsX3RkZXNfZG9uZV90YXNrLAogCQkJCQkodW5zaWduZWQgbG9uZyl0ZGVzX2RkKTsKQEAgLTE0MDgsNyArMTQwOSw3IEBACiAJLyogSW5pdGlhbGl6aW5nIHRoZSBjbG9jayAqLwogCXRkZXNfZGQtPmljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJ0ZGVzX2NsayIpOwogCWlmIChJU19FUlIodGRlc19kZC0+aWNsaykpIHsKLQkJZGV2X2VycihkZXYsICJjbG9jayBpbnRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOworCQlkZXZfZXJyKGRldiwgImNsb2NrIGluaXRpYWxpemF0aW9uIGZhaWxlZC5cbiIpOwogCQllcnIgPSBQVFJfRVJSKHRkZXNfZGQtPmljbGspOwogCQlnb3RvIGNsa19lcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtaGFzaC5jIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtaGFzaC5jCmluZGV4IGYzNDdhYjcuLmJhMDUzMmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2NhYW0vY2FhbWhhc2guYworKysgYi9kcml2ZXJzL2NyeXB0by9jYWFtL2NhYW1oYXNoLmMKQEAgLTExNzIsNiArMTE3Miw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAorCWVkZXNjLT5zZWM0X3NnX2J5dGVzID0gMDsKIAlzaF9sZW4gPSBkZXNjX2xlbihzaF9kZXNjKTsKIAlkZXNjID0gZWRlc2MtPmh3X2Rlc2M7CiAJaW5pdF9qb2JfZGVzY19zaGFyZWQoZGVzYywgcHRyLCBzaF9sZW4sIEhEUl9TSEFSRV9ERUZFUiB8IEhEUl9SRVZFUlNFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NhYW0vY2FhbXJuZy5jIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtcm5nLmMKaW5kZXggYWUzMWU1NS4uMjZhNTQ0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtcm5nLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vY2FhbS9jYWFtcm5nLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogLyogbGVuZ3RoIG9mIGRlc2NyaXB0b3JzICovCiAjZGVmaW5lIERFU0NfSk9CX09fTEVOCQkJKENBQU1fQ01EX1NaICogMiArIENBQU1fUFRSX1NaICogMikKLSNkZWZpbmUgREVTQ19STkdfTEVOCQkJKDEwICogQ0FBTV9DTURfU1opCisjZGVmaW5lIERFU0NfUk5HX0xFTgkJCSg0ICogQ0FBTV9DTURfU1opCiAKIC8qIEJ1ZmZlciwgaXRzIGRtYSBhZGRyZXNzIGFuZCBsb2NrICovCiBzdHJ1Y3QgYnVmX2RhdGEgewpAQCAtOTAsOCArOTAsOCBAQAogCXN0cnVjdCBkZXZpY2UgKmpyZGV2ID0gY3R4LT5qcmRldjsKIAogCWlmIChjdHgtPnNoX2Rlc2NfZG1hKQotCQlkbWFfdW5tYXBfc2luZ2xlKGpyZGV2LCBjdHgtPnNoX2Rlc2NfZG1hLCBERVNDX1JOR19MRU4sCi0JCQkJIERNQV9UT19ERVZJQ0UpOworCQlkbWFfdW5tYXBfc2luZ2xlKGpyZGV2LCBjdHgtPnNoX2Rlc2NfZG1hLAorCQkJCSBkZXNjX2J5dGVzKGN0eC0+c2hfZGVzYyksIERNQV9UT19ERVZJQ0UpOwogCXJuZ191bm1hcF9idWYoanJkZXYsICZjdHgtPmJ1ZnNbMF0pOwogCXJuZ191bm1hcF9idWYoanJkZXYsICZjdHgtPmJ1ZnNbMV0pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2NwL01ha2VmaWxlIGIvZHJpdmVycy9jcnlwdG8vY2NwL01ha2VmaWxlCmluZGV4IDdmNTkyZDguLjU1YTFmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2NjcC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2NyeXB0by9jY3AvTWFrZWZpbGUKQEAgLTEsMTEgKzEsNiBAQAogb2JqLSQoQ09ORklHX0NSWVBUT19ERVZfQ0NQX0REKSArPSBjY3AubwotY2NwLW9ianMgOj0gY2NwLWRldi5vIGNjcC1vcHMubwotaWZkZWYgQ09ORklHX1g4NgotY2NwLW9ianMgKz0gY2NwLXBjaS5vCi1lbmRpZgotaWZkZWYgQ09ORklHX0FSTTY0Ci1jY3Atb2JqcyArPSBjY3AtcGxhdGZvcm0ubwotZW5kaWYKK2NjcC1vYmpzIDo9IGNjcC1kZXYubyBjY3Atb3BzLm8gY2NwLXBsYXRmb3JtLm8KK2NjcC0kKENPTkZJR19QQ0kpICs9IGNjcC1wY2kubwogCiBvYmotJChDT05GSUdfQ1JZUFRPX0RFVl9DQ1BfQ1JZUFRPKSArPSBjY3AtY3J5cHRvLm8KIGNjcC1jcnlwdG8tb2JqcyA6PSBjY3AtY3J5cHRvLW1haW4ubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLWNyeXB0by1hZXMtY21hYy5jIGIvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1jcnlwdG8tYWVzLWNtYWMuYwppbmRleCA4ZTE2MmFkLi5lYTdlODQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLWNyeXB0by1hZXMtY21hYy5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtY3J5cHRvLWFlcy1jbWFjLmMKQEAgLTIzLDcgKzIzLDYgQEAKIAogI2luY2x1ZGUgImNjcC1jcnlwdG8uaCIKIAotCiBzdGF0aWMgaW50IGNjcF9hZXNfY21hY19jb21wbGV0ZShzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKmFzeW5jX3JlcSwKIAkJCQkgaW50IHJldCkKIHsKQEAgLTM4LDExICszNywxMyBAQAogCWlmIChyY3R4LT5oYXNoX3JlbSkgewogCQkvKiBTYXZlIHJlbWFpbmluZyBkYXRhIHRvIGJ1ZmZlciAqLwogCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gcmN0eC0+bmJ5dGVzIC0gcmN0eC0+aGFzaF9yZW07CisKIAkJc2NhdHRlcndhbGtfbWFwX2FuZF9jb3B5KHJjdHgtPmJ1ZiwgcmN0eC0+c3JjLAogCQkJCQkgb2Zmc2V0LCByY3R4LT5oYXNoX3JlbSwgMCk7CiAJCXJjdHgtPmJ1Zl9jb3VudCA9IHJjdHgtPmhhc2hfcmVtOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXJjdHgtPmJ1Zl9jb3VudCA9IDA7CisJfQogCiAJLyogVXBkYXRlIHJlc3VsdCBhcmVhIGlmIHN1cHBsaWVkICovCiAJaWYgKHJlcS0+cmVzdWx0KQpAQCAtMjAyLDcgKzIwMyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgY2NwX2Flc19jbWFjX3NldGtleShzdHJ1Y3QgY3J5cHRvX2FoYXNoICp0Zm0sIGNvbnN0IHU4ICprZXksCi0JCQkgICB1bnNpZ25lZCBpbnQga2V5X2xlbikKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQga2V5X2xlbikKIHsKIAlzdHJ1Y3QgY2NwX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoY3J5cHRvX2FoYXNoX3RmbSh0Zm0pKTsKIAlzdHJ1Y3QgY2NwX2NyeXB0b19haGFzaF9hbGcgKmFsZyA9CkBAIC0yOTIsNyArMjkzLDggQEAKIAljcnlwdG9fYWhhc2hfc2V0X3JlcXNpemUoYWhhc2gsIHNpemVvZihzdHJ1Y3QgY2NwX2Flc19jbWFjX3JlcV9jdHgpKTsKIAogCWNpcGhlcl90Zm0gPSBjcnlwdG9fYWxsb2NfY2lwaGVyKCJhZXMiLCAwLAotCQkJQ1JZUFRPX0FMR19BU1lOQyB8IENSWVBUT19BTEdfTkVFRF9GQUxMQkFDSyk7CisJCQkJCSBDUllQVE9fQUxHX0FTWU5DIHwKKwkJCQkJIENSWVBUT19BTEdfTkVFRF9GQUxMQkFDSyk7CiAJaWYgKElTX0VSUihjaXBoZXJfdGZtKSkgewogCQlwcl93YXJuKCJjb3VsZCBub3QgbG9hZCBhZXMgY2lwaGVyIGRyaXZlclxuIik7CiAJCXJldHVybiBQVFJfRVJSKGNpcGhlcl90Zm0pOwpAQCAtMzU0LDcgKzM1Niw3IEBACiAJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FoYXNoKGFsZyk7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoIiVzIGFoYXNoIGFsZ29yaXRobSByZWdpc3RyYXRpb24gZXJyb3IgKCVkKVxuIiwKLQkJCWJhc2UtPmNyYV9uYW1lLCByZXQpOworCQkgICAgICAgYmFzZS0+Y3JhX25hbWUsIHJldCk7CiAJCWtmcmVlKGNjcF9hbGcpOwogCQlyZXR1cm4gcmV0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtY3J5cHRvLWFlcy14dHMuYyBiL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtY3J5cHRvLWFlcy14dHMuYwppbmRleCAwY2M1NTk0Li41MmM3Mzk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLWNyeXB0by1hZXMteHRzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1jcnlwdG8tYWVzLXh0cy5jCkBAIC0yMSw3ICsyMSw2IEBACiAKICNpbmNsdWRlICJjY3AtY3J5cHRvLmgiCiAKLQogc3RydWN0IGNjcF9hZXNfeHRzX2RlZiB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAljb25zdCBjaGFyICpkcnZfbmFtZTsKQEAgLTIxNiw3ICsyMTUsNiBAQAogCWN0eC0+dS5hZXMudGZtX2FibGtjaXBoZXIgPSBOVUxMOwogfQogCi0KIHN0YXRpYyBpbnQgY2NwX3JlZ2lzdGVyX2Flc194dHNfYWxnKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBjY3BfYWVzX3h0c19kZWYgKmRlZikKIHsKQEAgLTI1NSw3ICsyNTMsNyBAQAogCXJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoYWxnKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiJXMgYWJsa2NpcGhlciBhbGdvcml0aG0gcmVnaXN0cmF0aW9uIGVycm9yICglZClcbiIsCi0JCQlhbGctPmNyYV9uYW1lLCByZXQpOworCQkgICAgICAgYWxnLT5jcmFfbmFtZSwgcmV0KTsKIAkJa2ZyZWUoY2NwX2FsZyk7CiAJCXJldHVybiByZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1jcnlwdG8tYWVzLmMgYi9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLWNyeXB0by1hZXMuYwppbmRleCBlNDY0OTBkLi43OTg0ZjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLWNyeXB0by1hZXMuYworKysgYi9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLWNyeXB0by1hZXMuYwpAQCAtMjIsNyArMjIsNiBAQAogCiAjaW5jbHVkZSAiY2NwLWNyeXB0by5oIgogCi0KIHN0YXRpYyBpbnQgY2NwX2Flc19jb21wbGV0ZShzdHJ1Y3QgY3J5cHRvX2FzeW5jX3JlcXVlc3QgKmFzeW5jX3JlcSwgaW50IHJldCkKIHsKIAlzdHJ1Y3QgYWJsa2NpcGhlcl9yZXF1ZXN0ICpyZXEgPSBhYmxrY2lwaGVyX3JlcXVlc3RfY2FzdChhc3luY19yZXEpOwpAQCAtMzQ1LDcgKzM0NCw3IEBACiAJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FsZyhhbGcpOwogCWlmIChyZXQpIHsKIAkJcHJfZXJyKCIlcyBhYmxrY2lwaGVyIGFsZ29yaXRobSByZWdpc3RyYXRpb24gZXJyb3IgKCVkKVxuIiwKLQkJCWFsZy0+Y3JhX25hbWUsIHJldCk7CisJCSAgICAgICBhbGctPmNyYV9uYW1lLCByZXQpOwogCQlrZnJlZShjY3BfYWxnKTsKIAkJcmV0dXJuIHJldDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLWNyeXB0by1tYWluLmMgYi9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLWNyeXB0by1tYWluLmMKaW5kZXggNGQ0ZTAxNi4uYmRlYzAxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1jcnlwdG8tbWFpbi5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtY3J5cHRvLW1haW4uYwpAQCAtMzMsNyArMzMsNiBAQAogbW9kdWxlX3BhcmFtKHNoYV9kaXNhYmxlLCB1aW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc2hhX2Rpc2FibGUsICJEaXNhYmxlIHVzZSBvZiBTSEEgLSBhbnkgbm9uLXplcm8gdmFsdWUiKTsKIAotCiAvKiBMaXN0IGhlYWRzIGZvciB0aGUgc3VwcG9ydGVkIGFsZ29yaXRobXMgKi8KIHN0YXRpYyBMSVNUX0hFQUQoaGFzaF9hbGdzKTsKIHN0YXRpYyBMSVNUX0hFQUQoY2lwaGVyX2FsZ3MpOwpAQCAtNDgsNiArNDcsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKmJhY2tsb2c7CiAJdW5zaWduZWQgaW50IGNtZF9jb3VudDsKIH07CisKICNkZWZpbmUgQ0NQX0NSWVBUT19NQVhfUUxFTgkxMDAKIAogc3RhdGljIHN0cnVjdCBjY3BfY3J5cHRvX3F1ZXVlIHJlcV9xdWV1ZTsKQEAgLTc3LDcgKzc3LDYgQEAKIAlpbnQgZXJyOwogfTsKIAotCiBzdGF0aWMgaW5saW5lIGJvb2wgY2NwX2NyeXB0b19zdWNjZXNzKGludCBlcnIpCiB7CiAJaWYgKGVyciAmJiAoZXJyICE9IC1FSU5QUk9HUkVTUykgJiYgKGVyciAhPSAtRUJVU1kpKQpAQCAtMTQzLDcgKzE0Miw3IEBACiAJaW50IHJldDsKIAogCWlmIChlcnIgPT0gLUVJTlBST0dSRVNTKSB7Ci0JCS8qIE9ubHkgcHJvcG9nYXRlIHRoZSAtRUlOUFJPR1JFU1MgaWYgbmVjZXNzYXJ5ICovCisJCS8qIE9ubHkgcHJvcGFnYXRlIHRoZSAtRUlOUFJPR1JFU1MgaWYgbmVjZXNzYXJ5ICovCiAJCWlmIChjcnlwdG9fY21kLT5yZXQgPT0gLUVCVVNZKSB7CiAJCQljcnlwdG9fY21kLT5yZXQgPSAtRUlOUFJPR1JFU1M7CiAJCQlyZXEtPmNvbXBsZXRlKHJlcSwgLUVJTlBST0dSRVNTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtY3J5cHRvLXNoYS5jIGIvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1jcnlwdG8tc2hhLmMKaW5kZXggOTY1MzE1Ny4uNTA3YjM0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1jcnlwdG8tc2hhLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1jcnlwdG8tc2hhLmMKQEAgLTIzLDcgKzIzLDYgQEAKIAogI2luY2x1ZGUgImNjcC1jcnlwdG8uaCIKIAotCiBzdGF0aWMgaW50IGNjcF9zaGFfY29tcGxldGUoc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICphc3luY19yZXEsIGludCByZXQpCiB7CiAJc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSA9IGFoYXNoX3JlcXVlc3RfY2FzdChhc3luY19yZXEpOwpAQCAtMzcsMTEgKzM2LDEzIEBACiAJaWYgKHJjdHgtPmhhc2hfcmVtKSB7CiAJCS8qIFNhdmUgcmVtYWluaW5nIGRhdGEgdG8gYnVmZmVyICovCiAJCXVuc2lnbmVkIGludCBvZmZzZXQgPSByY3R4LT5uYnl0ZXMgLSByY3R4LT5oYXNoX3JlbTsKKwogCQlzY2F0dGVyd2Fsa19tYXBfYW5kX2NvcHkocmN0eC0+YnVmLCByY3R4LT5zcmMsCiAJCQkJCSBvZmZzZXQsIHJjdHgtPmhhc2hfcmVtLCAwKTsKIAkJcmN0eC0+YnVmX2NvdW50ID0gcmN0eC0+aGFzaF9yZW07Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJcmN0eC0+YnVmX2NvdW50ID0gMDsKKwl9CiAKIAkvKiBVcGRhdGUgcmVzdWx0IGFyZWEgaWYgc3VwcGxpZWQgKi8KIAlpZiAocmVxLT5yZXN1bHQpCkBAIC0yMjcsOCArMjI4LDkgQEAKIAkJfQogCiAJCWtleV9sZW4gPSBkaWdlc3Rfc2l6ZTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQltZW1jcHkoY3R4LT51LnNoYS5rZXksIGtleSwga2V5X2xlbik7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykgewogCQljdHgtPnUuc2hhLmlwYWRbaV0gPSBjdHgtPnUuc2hhLmtleVtpXSBeIDB4MzY7CkBAIC0zNTUsNyArMzU3LDcgQEAKIAlyZXQgPSBjcnlwdG9fcmVnaXN0ZXJfYWhhc2goYWxnKTsKIAlpZiAocmV0KSB7CiAJCXByX2VycigiJXMgYWhhc2ggYWxnb3JpdGhtIHJlZ2lzdHJhdGlvbiBlcnJvciAoJWQpXG4iLAotCQkJYmFzZS0+Y3JhX25hbWUsIHJldCk7CisJCSAgICAgICBiYXNlLT5jcmFfbmFtZSwgcmV0KTsKIAkJa2ZyZWUoY2NwX2FsZyk7CiAJCXJldHVybiByZXQ7CiAJfQpAQCAtNDEwLDcgKzQxMiw3IEBACiAJcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX2FoYXNoKGFsZyk7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoIiVzIGFoYXNoIGFsZ29yaXRobSByZWdpc3RyYXRpb24gZXJyb3IgKCVkKVxuIiwKLQkJCWJhc2UtPmNyYV9uYW1lLCByZXQpOworCQkgICAgICAgYmFzZS0+Y3JhX25hbWUsIHJldCk7CiAJCWtmcmVlKGNjcF9hbGcpOwogCQlyZXR1cm4gcmV0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtY3J5cHRvLmggYi9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLWNyeXB0by5oCmluZGV4IDlhYTRhZTEuLjc2YTk2ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtY3J5cHRvLmgKKysrIGIvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1jcnlwdG8uaApAQCAtMTMsNyArMTMsNiBAQAogI2lmbmRlZiBfX0NDUF9DUllQVE9fSF9fCiAjZGVmaW5lIF9fQ0NQX0NSWVBUT19IX18KIAotCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KQEAgLTI1LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxjcnlwdG8vaGFzaC5oPgogI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KIAotCiAjZGVmaW5lIENDUF9DUkFfUFJJT1JJVFkJMzAwCiAKIHN0cnVjdCBjY3BfY3J5cHRvX2FibGtjaXBoZXJfYWxnIHsKQEAgLTY4LDcgKzY2LDYgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGFoYXNoX2FsZywgc3RydWN0IGNjcF9jcnlwdG9fYWhhc2hfYWxnLCBhbGcpOwogfQogCi0KIC8qKioqKiBBRVMgcmVsYXRlZCBkZWZpbmVzICoqKioqLwogc3RydWN0IGNjcF9hZXNfY3R4IHsKIAkvKiBGYWxsYmFjayBjaXBoZXIgZm9yIFhUUyB3aXRoIHVuc3VwcG9ydGVkIHVuaXQgc2l6ZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtZGV2LmMgYi9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLWRldi5jCmluZGV4IGNhMjljMTIuLjg2MWJhY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtZGV2LmMKKysrIGIvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1kZXYuYwpAQCAtMzcsNyArMzcsNiBAQAogCXN0cnVjdCBjY3BfY21kICpjbWQ7CiB9OwogCi0KIHN0YXRpYyBzdHJ1Y3QgY2NwX2RldmljZSAqY2NwX2RldjsKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNjcF9kZXZpY2UgKmNjcF9nZXRfZGV2aWNlKHZvaWQpCiB7CkBAIC0yOTYsMTEgKzI5NSw5IEBACiB7CiAJc3RydWN0IGNjcF9kZXZpY2UgKmNjcDsKIAotCWNjcCA9IGt6YWxsb2Moc2l6ZW9mKCpjY3ApLCBHRlBfS0VSTkVMKTsKLQlpZiAoY2NwID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgZGV2aWNlIHN0cnVjdFxuIik7CisJY2NwID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjY3ApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNjcCkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCWNjcC0+ZGV2ID0gZGV2OwogCiAJSU5JVF9MSVNUX0hFQUQoJmNjcC0+Y21kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtZGV2LmggYi9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLWRldi5oCmluZGV4IDYyZmYzNWEuLjZmZjg5MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtZGV2LmgKKysrIGIvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1kZXYuaApAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CiAjaW5jbHVkZSA8bGludXgvaHdfcmFuZG9tLmg+Ci0KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAogI2RlZmluZSBNQVhfRE1BUE9PTF9OQU1FX0xFTgkJMzIKIApAQCAtMzMsNyArMzMsNiBAQAogI2RlZmluZSBDQUNIRV9OT05FCQkJMHgwMAogI2RlZmluZSBDQUNIRV9XQl9OT19BTExPQwkJMHhiNwogCi0KIC8qKioqKiogUmVnaXN0ZXIgTWFwcGluZ3MgKioqKioqLwogI2RlZmluZSBRX01BU0tfUkVHCQkJMHgwMDAKICNkZWZpbmUgVFJOR19PVVRfUkVHCQkJMHgwMGMKQEAgLTU0LDggKzUzLDggQEAKICNkZWZpbmUgQ01EX1FfQ0FDSEVfQkFTRQkJMHgyMjgKICNkZWZpbmUgQ01EX1FfQ0FDSEVfSU5DCQkJMHgyMAogCi0jZGVmaW5lIENNRF9RX0VSUk9SKF9fcXMpCQkoKF9fcXMpICYgMHgwMDAwMDAzZik7Ci0jZGVmaW5lIENNRF9RX0RFUFRIKF9fcXMpCQkoKChfX3FzKSA+PiAxMikgJiAweDAwMDAwMDBmKTsKKyNkZWZpbmUgQ01EX1FfRVJST1IoX19xcykJCSgoX19xcykgJiAweDAwMDAwMDNmKQorI2RlZmluZSBDTURfUV9ERVBUSChfX3FzKQkJKCgoX19xcykgPj4gMTIpICYgMHgwMDAwMDAwZikKIAogLyoqKioqKiBSRVEwIFJlbGF0ZWQgVmFsdWVzICoqKioqKi8KICNkZWZpbmUgUkVRMF9XQUlUX0ZPUl9XUklURQkJMHgwMDAwMDAwNApAQCAtMTAzLDcgKzEwMiw2IEBACiAvKioqKioqIFJFUTYgUmVsYXRlZCBWYWx1ZXMgKioqKioqLwogI2RlZmluZSBSRVE2X01FTVRZUEVfU0hJRlQJCTE2CiAKLQogLyoqKioqKiBLZXkgU3RvcmFnZSBCbG9jayAqKioqKiovCiAjZGVmaW5lIEtTQl9TVEFSVAkJCTc3CiAjZGVmaW5lIEtTQl9FTkQJCQkJMTI3CkBAIC0xMTQsNyArMTEyLDcgQEAKICNkZWZpbmUgQ0NQX0pPQklEX01BU0sJCQkweDAwMDAwMDNmCiAKICNkZWZpbmUgQ0NQX0RNQVBPT0xfTUFYX1NJWkUJCTY0Ci0jZGVmaW5lIENDUF9ETUFQT09MX0FMSUdOCQkoMSA8PCA1KQorI2RlZmluZSBDQ1BfRE1BUE9PTF9BTElHTgkJQklUKDUpCiAKICNkZWZpbmUgQ0NQX1JFVkVSU0VfQlVGX1NJWkUJCTY0CiAKQEAgLTE0Miw3ICsxNDAsNiBAQAogI2RlZmluZSBDQ1BfRUNDX1JFU1VMVF9PRkZTRVQJCTYwCiAjZGVmaW5lIENDUF9FQ0NfUkVTVUxUX1NVQ0NFU1MJCTB4MDAwMQogCi0KIHN0cnVjdCBjY3BfZGV2aWNlOwogc3RydWN0IGNjcF9jbWQ7CiAKQEAgLTI2MSw3ICsyNTgsNiBAQAogCXVuc2lnbmVkIGludCBheGNhY2hlOwogfTsKIAotCiBpbnQgY2NwX3BjaV9pbml0KHZvaWQpOwogdm9pZCBjY3BfcGNpX2V4aXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3Atb3BzLmMgYi9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLW9wcy5jCmluZGV4IDg3MjkzNjQuLjcxZjJlM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3Atb3BzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1vcHMuYwpAQCAtMjcsNyArMjcsNiBAQAogCiAjaW5jbHVkZSAiY2NwLWRldi5oIgogCi0KIGVudW0gY2NwX21lbXR5cGUgewogCUNDUF9NRU1UWVBFX1NZU1RFTSA9IDAsCiAJQ0NQX01FTVRZUEVfS1NCLApAQCAtNTE1LDcgKzUxNCw2IEBACiAJaWYgKCF3YS0+ZG1hX2NvdW50KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc2Myw4ICs3NjEsOSBAQAogCQlzZ19kc3RfbGVuID0gc2dfZG1hX2xlbihkc3QtPnNnX3dhLnNnKSAtIGRzdC0+c2dfd2Euc2dfdXNlZDsKIAkJc2dfZHN0X2xlbiA9IG1pbl90KHU2NCwgc3JjLT5zZ193YS5ieXRlc19sZWZ0LCBzZ19kc3RfbGVuKTsKIAkJb3BfbGVuID0gbWluKHNnX3NyY19sZW4sIHNnX2RzdF9sZW4pOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCW9wX2xlbiA9IHNnX3NyY19sZW47CisJfQogCiAJLyogVGhlIGRhdGEgb3BlcmF0aW9uIGxlbmd0aCB3aWxsIGJlIGF0IGxlYXN0IGJsb2NrX3NpemUgaW4gbGVuZ3RoCiAJICogb3IgdGhlIHNtYWxsZXIgb2YgYXZhaWxhYmxlIHNnIHJvb20gcmVtYWluaW5nIGZvciB0aGUgc291cmNlIG9yCkBAIC0xMTMxLDkgKzExMzAsOSBAQAogCWlmIChyZXQpCiAJCWdvdG8gZV9jdHg7CiAKLQlpZiAoaW5fcGxhY2UpCisJaWYgKGluX3BsYWNlKSB7CiAJCWRzdCA9IHNyYzsKLQllbHNlIHsKKwl9IGVsc2UgewogCQlyZXQgPSBjY3BfaW5pdF9kYXRhKCZkc3QsIGNtZF9xLCBhZXMtPmRzdCwgYWVzLT5zcmNfbGVuLAogCQkJCSAgICBBRVNfQkxPQ0tfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKIAkJaWYgKHJldCkKQEAgLTEzMDQsOSArMTMwMyw5IEBACiAJaWYgKHJldCkKIAkJZ290byBlX2N0eDsKIAotCWlmIChpbl9wbGFjZSkKKwlpZiAoaW5fcGxhY2UpIHsKIAkJZHN0ID0gc3JjOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCXJldCA9IGNjcF9pbml0X2RhdGEoJmRzdCwgY21kX3EsIHh0cy0+ZHN0LCB4dHMtPnNyY19sZW4sCiAJCQkJICAgIHVuaXRfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIAkJaWYgKHJldCkKQEAgLTE0NTEsOCArMTQ1MCw5IEBACiAJCQlnb3RvIGVfY3R4OwogCQl9CiAJCW1lbWNweShjdHguYWRkcmVzcywgaW5pdCwgQ0NQX1NIQV9DVFhTSVpFKTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQljY3Bfc2V0X2RtX2FyZWEoJmN0eCwgMCwgc2hhLT5jdHgsIDAsIHNoYS0+Y3R4X2xlbik7CisJfQogCiAJcmV0ID0gY2NwX2NvcHlfdG9fa3NiKGNtZF9xLCAmY3R4LCBvcC5qb2JpZCwgb3Aua3NiX2N0eCwKIAkJCSAgICAgIENDUF9QQVNTVEhSVV9CWVRFU1dBUF8yNTZCSVQpOwpAQCAtMTczMiw5ICsxNzMyLDkgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVfbWFzazsKIAotCWlmIChpbl9wbGFjZSkKKwlpZiAoaW5fcGxhY2UpIHsKIAkJZHN0ID0gc3JjOwotCWVsc2UgeworCX0gZWxzZSB7CiAJCXJldCA9IGNjcF9pbml0X2RhdGEoJmRzdCwgY21kX3EsIHB0LT5kc3QsIHB0LT5zcmNfbGVuLAogCQkJCSAgICBDQ1BfUEFTU1RIUlVfTUFTS1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAJCWlmIChyZXQpCkBAIC0xOTc0LDcgKzE5NzQsNyBAQAogCXNyYy5hZGRyZXNzICs9IENDUF9FQ0NfT1BFUkFORF9TSVpFOwogCiAJLyogU2V0IHRoZSBmaXJzdCBwb2ludCBaIGNvb3JkaWFuYXRlIHRvIDEgKi8KLQkqKHNyYy5hZGRyZXNzKSA9IDB4MDE7CisJKnNyYy5hZGRyZXNzID0gMHgwMTsKIAlzcmMuYWRkcmVzcyArPSBDQ1BfRUNDX09QRVJBTkRfU0laRTsKIAogCWlmIChlY2MtPmZ1bmN0aW9uID09IENDUF9FQ0NfRlVOQ1RJT05fUEFERF8zODRCSVQpIHsKQEAgLTE5ODksNyArMTk4OSw3IEBACiAJCXNyYy5hZGRyZXNzICs9IENDUF9FQ0NfT1BFUkFORF9TSVpFOwogCiAJCS8qIFNldCB0aGUgc2Vjb25kIHBvaW50IFogY29vcmRpYW5hdGUgdG8gMSAqLwotCQkqKHNyYy5hZGRyZXNzKSA9IDB4MDE7CisJCSpzcmMuYWRkcmVzcyA9IDB4MDE7CiAJCXNyYy5hZGRyZXNzICs9IENDUF9FQ0NfT1BFUkFORF9TSVpFOwogCX0gZWxzZSB7CiAJCS8qIENvcHkgdGhlIERvbWFpbiAiYSIgcGFyYW1ldGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLXBjaS5jIGIvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1wY2kuYwppbmRleCA3Zjg5Yzk0Li5hZjE5MGQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLXBjaS5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtcGNpLmMKQEAgLTE3NCwxMSArMTc0LDEwIEBACiAJaWYgKCFjY3ApCiAJCWdvdG8gZV9lcnI7CiAKLQljY3BfcGNpID0ga3phbGxvYyhzaXplb2YoKmNjcF9wY2kpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNjcF9wY2kpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlX2ZyZWUxOwotCX0KKwljY3BfcGNpID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjY3BfcGNpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjY3BfcGNpKQorCQlnb3RvIGVfZXJyOworCiAJY2NwLT5kZXZfc3BlY2lmaWMgPSBjY3BfcGNpOwogCWNjcC0+Z2V0X2lycSA9IGNjcF9nZXRfaXJxczsKIAljY3AtPmZyZWVfaXJxID0gY2NwX2ZyZWVfaXJxczsKQEAgLTE4Niw3ICsxODUsNyBAQAogCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgImNjcCIpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXYsICJwY2lfcmVxdWVzdF9yZWdpb25zIGZhaWxlZCAoJWQpXG4iLCByZXQpOwotCQlnb3RvIGVfZnJlZTI7CisJCWdvdG8gZV9lcnI7CiAJfQogCiAJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CkBAIC0yMDQsNyArMjAzLDcgQEAKIAogCXJldCA9IC1FSU87CiAJY2NwLT5pb19tYXAgPSBwY2lfaW9tYXAocGRldiwgYmFyLCAwKTsKLQlpZiAoY2NwLT5pb19tYXAgPT0gTlVMTCkgeworCWlmICghY2NwLT5pb19tYXApIHsKIAkJZGV2X2VycihkZXYsICJwY2lfaW9tYXAgZmFpbGVkXG4iKTsKIAkJZ290byBlX2RldmljZTsKIAl9CkBAIC0yMzksMTIgKzIzOCw2IEBACiBlX3JlZ2lvbnM6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAotZV9mcmVlMjoKLQlrZnJlZShjY3BfcGNpKTsKLQotZV9mcmVlMToKLQlrZnJlZShjY3ApOwotCiBlX2VycjoKIAlkZXZfbm90aWNlKGRldiwgImluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJcmV0dXJuIHJldDsKQEAgLTI2Niw4ICsyNTksNiBAQAogCiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAotCWtmcmVlKGNjcCk7Ci0KIAlkZXZfbm90aWNlKGRldiwgImRpc2FibGVkXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1wbGF0Zm9ybS5jIGIvZHJpdmVycy9jcnlwdG8vY2NwL2NjcC1wbGF0Zm9ybS5jCmluZGV4IDhjNTBiYWQuLmIxYzIwYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL2NjcC9jY3AtcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL2NyeXB0by9jY3AvY2NwLXBsYXRmb3JtLmMKQEAgLTIzLDkgKzIzLDE1IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9jY3AuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAKICNpbmNsdWRlICJjY3AtZGV2LmgiCiAKK3N0cnVjdCBjY3BfcGxhdGZvcm0geworCWludCB1c2VfYWNwaTsKKwlpbnQgY29oZXJlbnQ7Cit9OwogCiBzdGF0aWMgaW50IGNjcF9nZXRfaXJxKHN0cnVjdCBjY3BfZGV2aWNlICpjY3ApCiB7CkBAIC04NCwxMCArOTAsNjQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgaW50IGNjcF9hY3BpX3N1cHBvcnQoc3RydWN0IGNjcF9kZXZpY2UgKmNjcCkKK3sKKwlzdHJ1Y3QgY2NwX3BsYXRmb3JtICpjY3BfcGxhdGZvcm0gPSBjY3AtPmRldl9zcGVjaWZpYzsKKwlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYgPSBBQ1BJX0NPTVBBTklPTihjY3AtPmRldik7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGF0YTsKKwlpbnQgY2NhOworCisJLyogUmV0cmlldmUgdGhlIGRldmljZSBjYWNoZSBjb2hlcmVuY3kgdmFsdWUgKi8KKwloYW5kbGUgPSBhZGV2LT5oYW5kbGU7CisJZG8geworCQlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX2ludGVnZXIoaGFuZGxlLCAiX0NDQSIsIE5VTEwsICZkYXRhKTsKKwkJaWYgKCFBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQkJY2NhID0gZGF0YTsKKwkJCWJyZWFrOworCQl9CisJfSB3aGlsZSAoIUFDUElfRkFJTFVSRShzdGF0dXMpKTsKKworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlkZXZfZXJyKGNjcC0+ZGV2LCAiZXJyb3Igb2J0YWluaW5nIGFjcGkgY29oZXJlbmN5IHZhbHVlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2NwX3BsYXRmb3JtLT5jb2hlcmVudCA9ICEhY2NhOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQkvKiBDT05GSUdfQUNQSSAqLworc3RhdGljIGludCBjY3BfYWNwaV9zdXBwb3J0KHN0cnVjdCBjY3BfZGV2aWNlICpjY3ApCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGludCBjY3Bfb2Zfc3VwcG9ydChzdHJ1Y3QgY2NwX2RldmljZSAqY2NwKQoreworCXN0cnVjdCBjY3BfcGxhdGZvcm0gKmNjcF9wbGF0Zm9ybSA9IGNjcC0+ZGV2X3NwZWNpZmljOworCisJY2NwX3BsYXRmb3JtLT5jb2hlcmVudCA9IG9mX2RtYV9pc19jb2hlcmVudChjY3AtPmRldi0+b2Zfbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IGNjcF9vZl9zdXBwb3J0KHN0cnVjdCBjY3BfZGV2aWNlICpjY3ApCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBjY3BfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgY2NwX2RldmljZSAqY2NwOworCXN0cnVjdCBjY3BfcGxhdGZvcm0gKmNjcF9wbGF0Zm9ybTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldiA9IEFDUElfQ09NUEFOSU9OKGRldik7CiAJc3RydWN0IHJlc291cmNlICppb3I7CiAJaW50IHJldDsKIApAQCAtOTYsMjQgKzE1Niw0MCBAQAogCWlmICghY2NwKQogCQlnb3RvIGVfZXJyOwogCi0JY2NwLT5kZXZfc3BlY2lmaWMgPSBOVUxMOworCWNjcF9wbGF0Zm9ybSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY2NwX3BsYXRmb3JtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjY3BfcGxhdGZvcm0pCisJCWdvdG8gZV9lcnI7CisKKwljY3AtPmRldl9zcGVjaWZpYyA9IGNjcF9wbGF0Zm9ybTsKIAljY3AtPmdldF9pcnEgPSBjY3BfZ2V0X2lycXM7CiAJY2NwLT5mcmVlX2lycSA9IGNjcF9mcmVlX2lycXM7CiAKKwljY3BfcGxhdGZvcm0tPnVzZV9hY3BpID0gKCFhZGV2IHx8IGFjcGlfZGlzYWJsZWQpID8gMCA6IDE7CisKIAlpb3IgPSBjY3BfZmluZF9tbWlvX2FyZWEoY2NwKTsKIAljY3AtPmlvX21hcCA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIGlvcik7CiAJaWYgKElTX0VSUihjY3AtPmlvX21hcCkpIHsKIAkJcmV0ID0gUFRSX0VSUihjY3AtPmlvX21hcCk7Ci0JCWdvdG8gZV9mcmVlOworCQlnb3RvIGVfZXJyOwogCX0KIAljY3AtPmlvX3JlZ3MgPSBjY3AtPmlvX21hcDsKIAogCWlmICghZGV2LT5kbWFfbWFzaykKIAkJZGV2LT5kbWFfbWFzayA9ICZkZXYtPmNvaGVyZW50X2RtYV9tYXNrOwotCSooZGV2LT5kbWFfbWFzaykgPSBETUFfQklUX01BU0soNDgpOwotCWRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soNDgpOworCXJldCA9IGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoZGV2LCBETUFfQklUX01BU0soNDgpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKwkJZ290byBlX2VycjsKKwl9CiAKLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKGRldi0+b2Zfbm9kZSwgImRtYS1jb2hlcmVudCIpKQorCWlmIChjY3BfcGxhdGZvcm0tPnVzZV9hY3BpKQorCQlyZXQgPSBjY3BfYWNwaV9zdXBwb3J0KGNjcCk7CisJZWxzZQorCQlyZXQgPSBjY3Bfb2Zfc3VwcG9ydChjY3ApOworCWlmIChyZXQpCisJCWdvdG8gZV9lcnI7CisKKwlpZiAoY2NwX3BsYXRmb3JtLT5jb2hlcmVudCkKIAkJY2NwLT5heGNhY2hlID0gQ0FDSEVfV0JfTk9fQUxMT0M7CiAJZWxzZQogCQljY3AtPmF4Y2FjaGUgPSBDQUNIRV9OT05FOwpAQCAtMTIyLDE1ICsxOTgsMTIgQEAKIAogCXJldCA9IGNjcF9pbml0KGNjcCk7CiAJaWYgKHJldCkKLQkJZ290byBlX2ZyZWU7CisJCWdvdG8gZV9lcnI7CiAKIAlkZXZfbm90aWNlKGRldiwgImVuYWJsZWRcbiIpOwogCiAJcmV0dXJuIDA7CiAKLWVfZnJlZToKLQlrZnJlZShjY3ApOwotCiBlX2VycjoKIAlkZXZfbm90aWNlKGRldiwgImluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7CiAJcmV0dXJuIHJldDsKQEAgLTE0Myw4ICsyMTYsNiBAQAogCiAJY2NwX2Rlc3Ryb3koY2NwKTsKIAotCWtmcmVlKGNjcCk7Ci0KIAlkZXZfbm90aWNlKGRldiwgImRpc2FibGVkXG4iKTsKIAogCXJldHVybiAwOwpAQCAtMjAwLDE1ICsyNzEsMjkgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjY3BfcGxhdGZvcm1faWRzW10gPSB7CisjaWZkZWYgQ09ORklHX0FDUEkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgY2NwX2FjcGlfbWF0Y2hbXSA9IHsKKwl7ICJBTURJMEMwMCIsIDAgfSwKKwl7IH0sCit9OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNjcF9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYW1kLGNjcC1zZWF0dGxlLXYxYSIgfSwKIAl7IH0sCiB9OworI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNjcF9wbGF0Zm9ybV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiQU1EIENyeXB0b2dyYXBoaWMgQ29wcm9jZXNzb3IiLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBjY3BfcGxhdGZvcm1faWRzLAorI2lmZGVmIENPTkZJR19BQ1BJCisJCS5hY3BpX21hdGNoX3RhYmxlID0gY2NwX2FjcGlfbWF0Y2gsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfT0YKKwkJLm9mX21hdGNoX3RhYmxlID0gY2NwX29mX21hdGNoLAorI2VuZGlmCiAJfSwKIAkucHJvYmUgPSBjY3BfcGxhdGZvcm1fcHJvYmUsCiAJLnJlbW92ZSA9IGNjcF9wbGF0Zm9ybV9yZW1vdmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9pbWctaGFzaC5jIGIvZHJpdmVycy9jcnlwdG8vaW1nLWhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDQ3ZDBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vaW1nLWhhc2guYwpAQCAtMCwwICsxLDEwMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzCisgKiBBdXRob3JzOiAgV2lsbCBUaG9tYXMsIEphbWVzIEhhcnRsZXkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqCUludGVyZmFjZSBzdHJ1Y3R1cmUgdGFrZW4gZnJvbSBvbWFwLXNoYW0gZHJpdmVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKworI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CisjaW5jbHVkZSA8Y3J5cHRvL21kNS5oPgorI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KKworI2RlZmluZSBDUl9SRVNFVAkJCTAKKyNkZWZpbmUgQ1JfUkVTRVRfU0VUCQkJMQorI2RlZmluZSBDUl9SRVNFVF9VTlNFVAkJCTAKKworI2RlZmluZSBDUl9NRVNTQUdFX0xFTkdUSF9ICQkweDQKKyNkZWZpbmUgQ1JfTUVTU0FHRV9MRU5HVEhfTAkJMHg4CisKKyNkZWZpbmUgQ1JfQ09OVFJPTAkJCTB4YworI2RlZmluZSBDUl9DT05UUk9MX0JZVEVfT1JERVJfMzIxMAkwCisjZGVmaW5lIENSX0NPTlRST0xfQllURV9PUkRFUl8wMTIzCTEKKyNkZWZpbmUgQ1JfQ09OVFJPTF9CWVRFX09SREVSXzIzMTAJMgorI2RlZmluZSBDUl9DT05UUk9MX0JZVEVfT1JERVJfMTAzMgkzCisjZGVmaW5lIENSX0NPTlRST0xfQllURV9PUkRFUl9TSElGVAk4CisjZGVmaW5lIENSX0NPTlRST0xfQUxHT19NRDUJMAorI2RlZmluZSBDUl9DT05UUk9MX0FMR09fU0hBMQkxCisjZGVmaW5lIENSX0NPTlRST0xfQUxHT19TSEEyMjQJMgorI2RlZmluZSBDUl9DT05UUk9MX0FMR09fU0hBMjU2CTMKKworI2RlZmluZSBDUl9JTlRTVEFUCQkJMHgxMAorI2RlZmluZSBDUl9JTlRFTkFCCQkJMHgxNAorI2RlZmluZSBDUl9JTlRDTEVBUgkJCTB4MTgKKyNkZWZpbmUgQ1JfSU5UX1JFU1VMVFNfQVZBSUxBQkxFCUJJVCgwKQorI2RlZmluZSBDUl9JTlRfTkVXX1JFU1VMVFNfU0VUCQlCSVQoMSkKKyNkZWZpbmUgQ1JfSU5UX1JFU1VMVF9SRUFEX0VSUgkJQklUKDIpCisjZGVmaW5lIENSX0lOVF9NRVNTQUdFX1dSSVRFX0VSUk9SCUJJVCgzKQorI2RlZmluZSBDUl9JTlRfU1RBVFVTCQkJQklUKDgpCisKKyNkZWZpbmUgQ1JfUkVTVUxUX1FVRVVFCQkweDFjCisjZGVmaW5lIENSX1JTRDAJCQkJMHg0MAorI2RlZmluZSBDUl9DT1JFX1JFVgkJCTB4NTAKKyNkZWZpbmUgQ1JfQ09SRV9ERVMxCQkweDYwCisjZGVmaW5lIENSX0NPUkVfREVTMgkJMHg3MAorCisjZGVmaW5lIERSSVZFUl9GTEFHU19CVVNZCQlCSVQoMCkKKyNkZWZpbmUgRFJJVkVSX0ZMQUdTX0ZJTkFMCQlCSVQoMSkKKyNkZWZpbmUgRFJJVkVSX0ZMQUdTX0RNQV9BQ1RJVkUJCUJJVCgyKQorI2RlZmluZSBEUklWRVJfRkxBR1NfT1VUUFVUX1JFQURZCUJJVCgzKQorI2RlZmluZSBEUklWRVJfRkxBR1NfSU5JVAkJQklUKDQpCisjZGVmaW5lIERSSVZFUl9GTEFHU19DUFUJCUJJVCg1KQorI2RlZmluZSBEUklWRVJfRkxBR1NfRE1BX1JFQURZCQlCSVQoNikKKyNkZWZpbmUgRFJJVkVSX0ZMQUdTX0VSUk9SCQlCSVQoNykKKyNkZWZpbmUgRFJJVkVSX0ZMQUdTX1NHCQkJQklUKDgpCisjZGVmaW5lIERSSVZFUl9GTEFHU19TSEExCQlCSVQoMTgpCisjZGVmaW5lIERSSVZFUl9GTEFHU19TSEEyMjQJCUJJVCgxOSkKKyNkZWZpbmUgRFJJVkVSX0ZMQUdTX1NIQTI1NgkJQklUKDIwKQorI2RlZmluZSBEUklWRVJfRkxBR1NfTUQ1CQlCSVQoMjEpCisKKyNkZWZpbmUgSU1HX0hBU0hfUVVFVUVfTEVOR1RICQkyMAorI2RlZmluZSBJTUdfSEFTSF9ETUFfVEhSRVNIT0xECQk2NAorCisjaWZkZWYgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIElNR19IQVNIX0JZVEVfT1JERVIJCUNSX0NPTlRST0xfQllURV9PUkRFUl8zMjEwCisjZWxzZQorI2RlZmluZSBJTUdfSEFTSF9CWVRFX09SREVSCQlDUl9DT05UUk9MX0JZVEVfT1JERVJfMDEyMworI2VuZGlmCisKK3N0cnVjdCBpbWdfaGFzaF9kZXY7CisKK3N0cnVjdCBpbWdfaGFzaF9yZXF1ZXN0X2N0eCB7CisJc3RydWN0IGltZ19oYXNoX2RldgkqaGRldjsKKwl1OCBkaWdlc3RbU0hBMjU2X0RJR0VTVF9TSVpFXSBfX2FsaWduZWQoc2l6ZW9mKHUzMikpOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXNpemVfdAkJCWRpZ3NpemU7CisKKwlkbWFfYWRkcl90CQlkbWFfYWRkcjsKKwlzaXplX3QJCQlkbWFfY3Q7CisKKwkvKiBzZyByb290ICovCisJc3RydWN0IHNjYXR0ZXJsaXN0CSpzZ2ZpcnN0OworCS8qIHdhbGsgc3RhdGUgKi8KKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QJKnNnOworCXNpemVfdAkJCW5lbnRzOworCXNpemVfdAkJCW9mZnNldDsKKwl1bnNpZ25lZCBpbnQJCXRvdGFsOworCXNpemVfdAkJCXNlbnQ7CisKKwl1bnNpZ25lZCBsb25nCQlvcDsKKworCXNpemVfdAkJCWJ1ZmNudDsKKwl1OCBidWZmZXJbMF0gX19hbGlnbmVkKHNpemVvZih1MzIpKTsKKwlzdHJ1Y3QgYWhhc2hfcmVxdWVzdAlmYWxsYmFja19yZXE7Cit9OworCitzdHJ1Y3QgaW1nX2hhc2hfY3R4IHsKKwlzdHJ1Y3QgaW1nX2hhc2hfZGV2CSpoZGV2OworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXN0cnVjdCBjcnlwdG9fYWhhc2gJKmZhbGxiYWNrOworfTsKKworc3RydWN0IGltZ19oYXNoX2RldiB7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJc3RydWN0IGNsawkJKmhhc2hfY2xrOworCXN0cnVjdCBjbGsJCSpzeXNfY2xrOworCXZvaWQgX19pb21lbQkJKmlvX2Jhc2U7CisKKwlwaHlzX2FkZHJfdAkJYnVzX2FkZHI7CisJdm9pZCBfX2lvbWVtCQkqY3B1X2FkZHI7CisKKwlzcGlubG9ja190CQlsb2NrOworCWludAkJCWVycjsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJZG9uZV90YXNrOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAlkbWFfdGFzazsKKworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCXN0cnVjdCBjcnlwdG9fcXVldWUJcXVldWU7CisJc3RydWN0IGFoYXNoX3JlcXVlc3QJKnJlcTsKKworCXN0cnVjdCBkbWFfY2hhbgkJKmRtYV9sY2g7Cit9OworCitzdHJ1Y3QgaW1nX2hhc2hfZHJ2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9saXN0OworCXNwaW5sb2NrX3QgbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaW1nX2hhc2hfZHJ2IGltZ19oYXNoID0geworCS5kZXZfbGlzdCA9IExJU1RfSEVBRF9JTklUKGltZ19oYXNoLmRldl9saXN0KSwKKwkubG9jayA9IF9fU1BJTl9MT0NLX1VOTE9DS0VEKGltZ19oYXNoLmxvY2spLAorfTsKKworc3RhdGljIGlubGluZSB1MzIgaW1nX2hhc2hfcmVhZChzdHJ1Y3QgaW1nX2hhc2hfZGV2ICpoZGV2LCB1MzIgb2Zmc2V0KQoreworCXJldHVybiByZWFkbF9yZWxheGVkKGhkZXYtPmlvX2Jhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW1nX2hhc2hfd3JpdGUoc3RydWN0IGltZ19oYXNoX2RldiAqaGRldiwKKwkJCQkgIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sKKwl3cml0ZWxfcmVsYXhlZCh2YWx1ZSwgaGRldi0+aW9fYmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGltZ19oYXNoX3JlYWRfcmVzdWx0X3F1ZXVlKHN0cnVjdCBpbWdfaGFzaF9kZXYgKmhkZXYpCit7CisJcmV0dXJuIGJlMzJfdG9fY3B1KGltZ19oYXNoX3JlYWQoaGRldiwgQ1JfUkVTVUxUX1FVRVVFKSk7Cit9CisKK3N0YXRpYyB2b2lkIGltZ19oYXNoX3N0YXJ0KHN0cnVjdCBpbWdfaGFzaF9kZXYgKmhkZXYsIGJvb2wgZG1hKQoreworCXN0cnVjdCBpbWdfaGFzaF9yZXF1ZXN0X2N0eCAqY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgoaGRldi0+cmVxKTsKKwl1MzIgY3IgPSBJTUdfSEFTSF9CWVRFX09SREVSIDw8IENSX0NPTlRST0xfQllURV9PUkRFUl9TSElGVDsKKworCWlmIChjdHgtPmZsYWdzICYgRFJJVkVSX0ZMQUdTX01ENSkKKwkJY3IgfD0gQ1JfQ09OVFJPTF9BTEdPX01ENTsKKwllbHNlIGlmIChjdHgtPmZsYWdzICYgRFJJVkVSX0ZMQUdTX1NIQTEpCisJCWNyIHw9IENSX0NPTlRST0xfQUxHT19TSEExOworCWVsc2UgaWYgKGN0eC0+ZmxhZ3MgJiBEUklWRVJfRkxBR1NfU0hBMjI0KQorCQljciB8PSBDUl9DT05UUk9MX0FMR09fU0hBMjI0OworCWVsc2UgaWYgKGN0eC0+ZmxhZ3MgJiBEUklWRVJfRkxBR1NfU0hBMjU2KQorCQljciB8PSBDUl9DT05UUk9MX0FMR09fU0hBMjU2OworCWRldl9kYmcoaGRldi0+ZGV2LCAiU3RhcnRpbmcgaGFzaCBwcm9jZXNzXG4iKTsKKwlpbWdfaGFzaF93cml0ZShoZGV2LCBDUl9DT05UUk9MLCBjcik7CisKKwkvKgorCSAqIFRoZSBoYXJkd2FyZSBibG9jayByZXF1aXJlcyB0d28gY3ljbGVzIGJldHdlZW4gd3JpdGluZyB0aGUgY29udHJvbAorCSAqIHJlZ2lzdGVyIGFuZCB3cml0aW5nIHRoZSBmaXJzdCB3b3JkIG9mIGRhdGEgaW4gbm9uIERNQSBtb2RlLCB0bworCSAqIGVuc3VyZSB0aGUgZmlyc3QgZGF0YSB3cml0ZSBpcyBub3QgZ3JvdXBlZCBpbiBidXJzdCB3aXRoIHRoZSBjb250cm9sCisJICogcmVnaXN0ZXIgd3JpdGUgYSByZWFkIGlzIGlzc3VlZCB0byAnZmx1c2gnIHRoZSBidXMuCisJICovCisJaWYgKCFkbWEpCisJCWltZ19oYXNoX3JlYWQoaGRldiwgQ1JfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyBpbnQgaW1nX2hhc2hfeG1pdF9jcHUoc3RydWN0IGltZ19oYXNoX2RldiAqaGRldiwgY29uc3QgdTggKmJ1ZiwKKwkJCSAgICAgc2l6ZV90IGxlbmd0aCwgaW50IGZpbmFsKQoreworCXUzMiBjb3VudCwgbGVuMzI7CisJY29uc3QgdTMyICpidWZmZXIgPSAoY29uc3QgdTMyICopYnVmOworCisJZGV2X2RiZyhoZGV2LT5kZXYsICJ4bWl0X2NwdTogIGxlbmd0aDogJXp1IGJ5dGVzXG4iLCBsZW5ndGgpOworCisJaWYgKGZpbmFsKQorCQloZGV2LT5mbGFncyB8PSBEUklWRVJfRkxBR1NfRklOQUw7CisKKwlsZW4zMiA9IERJVl9ST1VORF9VUChsZW5ndGgsIHNpemVvZih1MzIpKTsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxlbjMyOyBjb3VudCsrKQorCQl3cml0ZWxfcmVsYXhlZChidWZmZXJbY291bnRdLCBoZGV2LT5jcHVfYWRkcik7CisKKwlyZXR1cm4gLUVJTlBST0dSRVNTOworfQorCitzdGF0aWMgdm9pZCBpbWdfaGFzaF9kbWFfY2FsbGJhY2sodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW1nX2hhc2hfZGV2ICpoZGV2ID0gKHN0cnVjdCBpbWdfaGFzaF9kZXYgKilkYXRhOworCXN0cnVjdCBpbWdfaGFzaF9yZXF1ZXN0X2N0eCAqY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgoaGRldi0+cmVxKTsKKworCWlmIChjdHgtPmJ1ZmNudCkgeworCQlpbWdfaGFzaF94bWl0X2NwdShoZGV2LCBjdHgtPmJ1ZmZlciwgY3R4LT5idWZjbnQsIDApOworCQljdHgtPmJ1ZmNudCA9IDA7CisJfQorCWlmIChjdHgtPnNnKQorCQl0YXNrbGV0X3NjaGVkdWxlKCZoZGV2LT5kbWFfdGFzayk7Cit9CisKK3N0YXRpYyBpbnQgaW1nX2hhc2hfeG1pdF9kbWEoc3RydWN0IGltZ19oYXNoX2RldiAqaGRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CisJc3RydWN0IGltZ19oYXNoX3JlcXVlc3RfY3R4ICpjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChoZGV2LT5yZXEpOworCisJY3R4LT5kbWFfY3QgPSBkbWFfbWFwX3NnKGhkZXYtPmRldiwgc2csIDEsIERNQV9NRU1fVE9fREVWKTsKKwlpZiAoY3R4LT5kbWFfY3QgPT0gMCkgeworCQlkZXZfZXJyKGhkZXYtPmRldiwgIkludmFsaWQgRE1BIHNnXG4iKTsKKwkJaGRldi0+ZXJyID0gLUVJTlZBTDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGVzYyA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NnKGhkZXYtPmRtYV9sY2gsCisJCQkJICAgICAgIHNnLAorCQkJCSAgICAgICBjdHgtPmRtYV9jdCwKKwkJCQkgICAgICAgRE1BX01FTV9UT19ERVYsCisJCQkJICAgICAgIERNQV9QUkVQX0lOVEVSUlVQVCB8IERNQV9DVFJMX0FDSyk7CisJaWYgKCFkZXNjKSB7CisJCWRldl9lcnIoaGRldi0+ZGV2LCAiTnVsbCBETUEgZGVzY3JpcHRvclxuIik7CisJCWhkZXYtPmVyciA9IC1FSU5WQUw7CisJCWRtYV91bm1hcF9zZyhoZGV2LT5kZXYsIHNnLCAxLCBETUFfTUVNX1RPX0RFVik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXNjLT5jYWxsYmFjayA9IGltZ19oYXNoX2RtYV9jYWxsYmFjazsKKwlkZXNjLT5jYWxsYmFja19wYXJhbSA9IGhkZXY7CisJZG1hZW5naW5lX3N1Ym1pdChkZXNjKTsKKwlkbWFfYXN5bmNfaXNzdWVfcGVuZGluZyhoZGV2LT5kbWFfbGNoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGltZ19oYXNoX3dyaXRlX3ZpYV9jcHUoc3RydWN0IGltZ19oYXNoX2RldiAqaGRldikKK3sKKwlzdHJ1Y3QgaW1nX2hhc2hfcmVxdWVzdF9jdHggKmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KGhkZXYtPnJlcSk7CisKKwljdHgtPmJ1ZmNudCA9IHNnX2NvcHlfdG9fYnVmZmVyKGhkZXYtPnJlcS0+c3JjLCBzZ19uZW50cyhjdHgtPnNnKSwKKwkJCQkJY3R4LT5idWZmZXIsIGhkZXYtPnJlcS0+bmJ5dGVzKTsKKworCWN0eC0+dG90YWwgPSBoZGV2LT5yZXEtPm5ieXRlczsKKwljdHgtPmJ1ZmNudCA9IDA7CisKKwloZGV2LT5mbGFncyB8PSAoRFJJVkVSX0ZMQUdTX0NQVSB8IERSSVZFUl9GTEFHU19GSU5BTCk7CisKKwlpbWdfaGFzaF9zdGFydChoZGV2LCBmYWxzZSk7CisKKwlyZXR1cm4gaW1nX2hhc2hfeG1pdF9jcHUoaGRldiwgY3R4LT5idWZmZXIsIGN0eC0+dG90YWwsIDEpOworfQorCitzdGF0aWMgaW50IGltZ19oYXNoX2ZpbmlzaChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBpbWdfaGFzaF9yZXF1ZXN0X2N0eCAqY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKKworCWlmICghcmVxLT5yZXN1bHQpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtY3B5KHJlcS0+cmVzdWx0LCBjdHgtPmRpZ2VzdCwgY3R4LT5kaWdzaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbWdfaGFzaF9jb3B5X2hhc2goc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgaW1nX2hhc2hfcmVxdWVzdF9jdHggKmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJdTMyICpoYXNoID0gKHUzMiAqKWN0eC0+ZGlnZXN0OworCWludCBpOworCisJZm9yIChpID0gKGN0eC0+ZGlnc2l6ZSAvIHNpemVvZih1MzIpKSAtIDE7IGkgPj0gMDsgaS0tKQorCQloYXNoW2ldID0gaW1nX2hhc2hfcmVhZF9yZXN1bHRfcXVldWUoY3R4LT5oZGV2KTsKK30KKworc3RhdGljIHZvaWQgaW1nX2hhc2hfZmluaXNoX3JlcShzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxLCBpbnQgZXJyKQoreworCXN0cnVjdCBpbWdfaGFzaF9yZXF1ZXN0X2N0eCAqY3R4ID0gYWhhc2hfcmVxdWVzdF9jdHgocmVxKTsKKwlzdHJ1Y3QgaW1nX2hhc2hfZGV2ICpoZGV2ID0gIGN0eC0+aGRldjsKKworCWlmICghZXJyKSB7CisJCWltZ19oYXNoX2NvcHlfaGFzaChyZXEpOworCQlpZiAoRFJJVkVSX0ZMQUdTX0ZJTkFMICYgaGRldi0+ZmxhZ3MpCisJCQllcnIgPSBpbWdfaGFzaF9maW5pc2gocmVxKTsKKwl9IGVsc2UgeworCQlkZXZfd2FybihoZGV2LT5kZXYsICJIYXNoIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCBlcnIpOworCQljdHgtPmZsYWdzIHw9IERSSVZFUl9GTEFHU19FUlJPUjsKKwl9CisKKwloZGV2LT5mbGFncyAmPSB+KERSSVZFUl9GTEFHU19ETUFfUkVBRFkgfCBEUklWRVJfRkxBR1NfT1VUUFVUX1JFQURZIHwKKwkJRFJJVkVSX0ZMQUdTX0NQVSB8IERSSVZFUl9GTEFHU19CVVNZIHwgRFJJVkVSX0ZMQUdTX0ZJTkFMKTsKKworCWlmIChyZXEtPmJhc2UuY29tcGxldGUpCisJCXJlcS0+YmFzZS5jb21wbGV0ZSgmcmVxLT5iYXNlLCBlcnIpOworfQorCitzdGF0aWMgaW50IGltZ19oYXNoX3dyaXRlX3ZpYV9kbWEoc3RydWN0IGltZ19oYXNoX2RldiAqaGRldikKK3sKKwlzdHJ1Y3QgaW1nX2hhc2hfcmVxdWVzdF9jdHggKmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KGhkZXYtPnJlcSk7CisKKwlpbWdfaGFzaF9zdGFydChoZGV2LCB0cnVlKTsKKworCWRldl9kYmcoaGRldi0+ZGV2LCAieG1pdCBkbWEgc2l6ZTogJWRcbiIsIGN0eC0+dG90YWwpOworCisJaWYgKCFjdHgtPnRvdGFsKQorCQloZGV2LT5mbGFncyB8PSBEUklWRVJfRkxBR1NfRklOQUw7CisKKwloZGV2LT5mbGFncyB8PSBEUklWRVJfRkxBR1NfRE1BX0FDVElWRSB8IERSSVZFUl9GTEFHU19GSU5BTDsKKworCXRhc2tsZXRfc2NoZWR1bGUoJmhkZXYtPmRtYV90YXNrKTsKKworCXJldHVybiAtRUlOUFJPR1JFU1M7Cit9CisKK3N0YXRpYyBpbnQgaW1nX2hhc2hfZG1hX2luaXQoc3RydWN0IGltZ19oYXNoX2RldiAqaGRldikKK3sKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBkbWFfY29uZjsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWhkZXYtPmRtYV9sY2ggPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKGhkZXYtPmRldiwgInR4Iik7CisJaWYgKCFoZGV2LT5kbWFfbGNoKSB7CisJCWRldl9lcnIoaGRldi0+ZGV2LCAiQ291bGRuJ3QgYXF1aXJlIGEgc2xhdmUgRE1BIGNoYW5uZWwuXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJZG1hX2NvbmYuZGlyZWN0aW9uID0gRE1BX01FTV9UT19ERVY7CisJZG1hX2NvbmYuZHN0X2FkZHIgPSBoZGV2LT5idXNfYWRkcjsKKwlkbWFfY29uZi5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOworCWRtYV9jb25mLmRzdF9tYXhidXJzdCA9IDE2OworCWRtYV9jb25mLmRldmljZV9mYyA9IGZhbHNlOworCisJZXJyID0gZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhoZGV2LT5kbWFfbGNoLCAgJmRtYV9jb25mKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoaGRldi0+ZGV2LCAiQ291bGRuJ3QgY29uZmlndXJlIERNQSBzbGF2ZS5cbiIpOworCQlkbWFfcmVsZWFzZV9jaGFubmVsKGhkZXYtPmRtYV9sY2gpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbWdfaGFzaF9kbWFfdGFzayh1bnNpZ25lZCBsb25nIGQpCit7CisJc3RydWN0IGltZ19oYXNoX2RldiAqaGRldiA9IChzdHJ1Y3QgaW1nX2hhc2hfZGV2ICopZDsKKwlzdHJ1Y3QgaW1nX2hhc2hfcmVxdWVzdF9jdHggKmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KGhkZXYtPnJlcSk7CisJdTggKmFkZHI7CisJc2l6ZV90IG5ieXRlcywgYmxlZnQsIHdzZW5kLCBsZW4sIHRiYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgdHNnOworCisJaWYgKCFjdHgtPnNnKQorCQlyZXR1cm47CisKKwlhZGRyID0gc2dfdmlydChjdHgtPnNnKTsKKwluYnl0ZXMgPSBjdHgtPnNnLT5sZW5ndGggLSBjdHgtPm9mZnNldDsKKworCS8qCisJICogVGhlIGhhc2ggYWNjZWxlcmF0b3IgZG9lcyBub3Qgc3VwcG9ydCBhIGRhdGEgdmFsaWQgbWFzay4gVGhpcyBtZWFucworCSAqIHRoYXQgaWYgZWFjaCBkbWEgKGkuZS4gcGVyIHBhZ2UpIGlzIG5vdCBhIG11bHRpcGxlIG9mIDQgYnl0ZXMsIHRoZQorCSAqIHBhZGRpbmcgYnl0ZXMgaW4gdGhlIGxhc3Qgd29yZCB3cml0dGVuIGJ5IHRoYXQgZG1hIHdvdWxkIGVycm9uZW91c2x5CisJICogYmUgaW5jbHVkZWQgaW4gdGhlIGhhc2guIFRvIGF2b2lkIHRoaXMgd2Ugcm91bmQgZG93biB0aGUgdHJhbnNmZXIsCisJICogYW5kIGFkZCB0aGUgZXhjZXNzIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBkbWEuIEl0IGRvZXMgbm90IG1hdHRlcgorCSAqIHRoYXQgdGhlIGZpbmFsIGRtYSBtYXkgbm90IGJlIGEgbXVsdGlwbGUgb2YgNCBieXRlcyBhcyB0aGUgaGFzaGluZworCSAqIGJsb2NrIGlzIHByb2dyYW1tZWQgdG8gYWNjZXB0IHRoZSBjb3JyZWN0IG51bWJlciBvZiBieXRlcy4KKwkgKi8KKworCWJsZWZ0ID0gbmJ5dGVzICUgNDsKKwl3c2VuZCA9IChuYnl0ZXMgLyA0KTsKKworCWlmICh3c2VuZCkgeworCQlzZ19pbml0X29uZSgmdHNnLCBhZGRyICsgY3R4LT5vZmZzZXQsIHdzZW5kICogNCk7CisJCWlmIChpbWdfaGFzaF94bWl0X2RtYShoZGV2LCAmdHNnKSkgeworCQkJZGV2X2VycihoZGV2LT5kZXYsICJETUEgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gQ1BVIik7CisJCQljdHgtPmZsYWdzIHw9IERSSVZFUl9GTEFHU19DUFU7CisJCQloZGV2LT5lcnIgPSAwOworCQkJaW1nX2hhc2hfeG1pdF9jcHUoaGRldiwgYWRkciArIGN0eC0+b2Zmc2V0LAorCQkJCQkgIHdzZW5kICogNCwgMCk7CisJCQljdHgtPnNlbnQgKz0gd3NlbmQgKiA0OworCQkJd3NlbmQgPSAwOworCQl9IGVsc2UgeworCQkJY3R4LT5zZW50ICs9IHdzZW5kICogNDsKKwkJfQorCX0KKworCWlmIChibGVmdCkgeworCQljdHgtPmJ1ZmNudCA9IHNnX3Bjb3B5X3RvX2J1ZmZlcihjdHgtPnNnZmlyc3QsIGN0eC0+bmVudHMsCisJCQkJCQkgY3R4LT5idWZmZXIsIGJsZWZ0LCBjdHgtPnNlbnQpOworCQl0YmMgPSAwOworCQljdHgtPnNnID0gc2dfbmV4dChjdHgtPnNnKTsKKwkJd2hpbGUgKGN0eC0+c2cgJiYgKGN0eC0+YnVmY250IDwgNCkpIHsKKwkJCWxlbiA9IGN0eC0+c2ctPmxlbmd0aDsKKwkJCWlmIChsaWtlbHkobGVuID4gKDQgLSBjdHgtPmJ1ZmNudCkpKQorCQkJCWxlbiA9IDQgLSBjdHgtPmJ1ZmNudDsKKwkJCXRiYyA9IHNnX3Bjb3B5X3RvX2J1ZmZlcihjdHgtPnNnZmlyc3QsIGN0eC0+bmVudHMsCisJCQkJCQkgY3R4LT5idWZmZXIgKyBjdHgtPmJ1ZmNudCwgbGVuLAorCQkJCQljdHgtPnNlbnQgKyBjdHgtPmJ1ZmNudCk7CisJCQljdHgtPmJ1ZmNudCArPSB0YmM7CisJCQlpZiAodGJjID49IGN0eC0+c2ctPmxlbmd0aCkgeworCQkJCWN0eC0+c2cgPSBzZ19uZXh0KGN0eC0+c2cpOworCQkJCXRiYyA9IDA7CisJCQl9CisJCX0KKworCQljdHgtPnNlbnQgKz0gY3R4LT5idWZjbnQ7CisJCWN0eC0+b2Zmc2V0ID0gdGJjOworCisJCWlmICghd3NlbmQpCisJCQlpbWdfaGFzaF9kbWFfY2FsbGJhY2soaGRldik7CisJfSBlbHNlIHsKKwkJY3R4LT5vZmZzZXQgPSAwOworCQljdHgtPnNnID0gc2dfbmV4dChjdHgtPnNnKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaW1nX2hhc2hfd3JpdGVfdmlhX2RtYV9zdG9wKHN0cnVjdCBpbWdfaGFzaF9kZXYgKmhkZXYpCit7CisJc3RydWN0IGltZ19oYXNoX3JlcXVlc3RfY3R4ICpjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChoZGV2LT5yZXEpOworCisJaWYgKGN0eC0+ZmxhZ3MgJiBEUklWRVJfRkxBR1NfU0cpCisJCWRtYV91bm1hcF9zZyhoZGV2LT5kZXYsIGN0eC0+c2csIGN0eC0+ZG1hX2N0LCBETUFfVE9fREVWSUNFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGltZ19oYXNoX3Byb2Nlc3NfZGF0YShzdHJ1Y3QgaW1nX2hhc2hfZGV2ICpoZGV2KQoreworCXN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEgPSBoZGV2LT5yZXE7CisJc3RydWN0IGltZ19oYXNoX3JlcXVlc3RfY3R4ICpjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCWludCBlcnIgPSAwOworCisJY3R4LT5idWZjbnQgPSAwOworCisJaWYgKHJlcS0+bmJ5dGVzID49IElNR19IQVNIX0RNQV9USFJFU0hPTEQpIHsKKwkJZGV2X2RiZyhoZGV2LT5kZXYsICJwcm9jZXNzIGRhdGEgcmVxdWVzdCglZCBieXRlcykgdXNpbmcgRE1BXG4iLAorCQkJcmVxLT5uYnl0ZXMpOworCQllcnIgPSBpbWdfaGFzaF93cml0ZV92aWFfZG1hKGhkZXYpOworCX0gZWxzZSB7CisJCWRldl9kYmcoaGRldi0+ZGV2LCAicHJvY2VzcyBkYXRhIHJlcXVlc3QoJWQgYnl0ZXMpIHVzaW5nIENQVVxuIiwKKwkJCXJlcS0+bmJ5dGVzKTsKKwkJZXJyID0gaW1nX2hhc2hfd3JpdGVfdmlhX2NwdShoZGV2KTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpbWdfaGFzaF9od19pbml0KHN0cnVjdCBpbWdfaGFzaF9kZXYgKmhkZXYpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG5iaXRzOworCXUzMiB1LCBsOworCisJaW1nX2hhc2hfd3JpdGUoaGRldiwgQ1JfUkVTRVQsIENSX1JFU0VUX1NFVCk7CisJaW1nX2hhc2hfd3JpdGUoaGRldiwgQ1JfUkVTRVQsIENSX1JFU0VUX1VOU0VUKTsKKwlpbWdfaGFzaF93cml0ZShoZGV2LCBDUl9JTlRFTkFCLCBDUl9JTlRfTkVXX1JFU1VMVFNfU0VUKTsKKworCW5iaXRzID0gKHU2NCloZGV2LT5yZXEtPm5ieXRlcyA8PCAzOworCXUgPSBuYml0cyA+PiAzMjsKKwlsID0gbmJpdHM7CisJaW1nX2hhc2hfd3JpdGUoaGRldiwgQ1JfTUVTU0FHRV9MRU5HVEhfSCwgdSk7CisJaW1nX2hhc2hfd3JpdGUoaGRldiwgQ1JfTUVTU0FHRV9MRU5HVEhfTCwgbCk7CisKKwlpZiAoIShEUklWRVJfRkxBR1NfSU5JVCAmIGhkZXYtPmZsYWdzKSkgeworCQloZGV2LT5mbGFncyB8PSBEUklWRVJfRkxBR1NfSU5JVDsKKwkJaGRldi0+ZXJyID0gMDsKKwl9CisJZGV2X2RiZyhoZGV2LT5kZXYsICJodyBpbml0aWFsaXplZCwgbmJpdHM6ICVsbHhcbiIsIG5iaXRzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbWdfaGFzaF9pbml0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBpbWdfaGFzaF9yZXF1ZXN0X2N0eCAqcmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGltZ19oYXNoX2N0eCAqY3R4ID0gY3J5cHRvX2FoYXNoX2N0eCh0Zm0pOworCisJYWhhc2hfcmVxdWVzdF9zZXRfdGZtKCZyY3R4LT5mYWxsYmFja19yZXEsIGN0eC0+ZmFsbGJhY2spOworCXJjdHgtPmZhbGxiYWNrX3JlcS5iYXNlLmZsYWdzID0JcmVxLT5iYXNlLmZsYWdzCisJCSYgQ1JZUFRPX1RGTV9SRVFfTUFZX1NMRUVQOworCisJcmV0dXJuIGNyeXB0b19haGFzaF9pbml0KCZyY3R4LT5mYWxsYmFja19yZXEpOworfQorCitzdGF0aWMgaW50IGltZ19oYXNoX2hhbmRsZV9xdWV1ZShzdHJ1Y3QgaW1nX2hhc2hfZGV2ICpoZGV2LAorCQkJCSBzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBjcnlwdG9fYXN5bmNfcmVxdWVzdCAqYXN5bmNfcmVxLCAqYmFja2xvZzsKKwlzdHJ1Y3QgaW1nX2hhc2hfcmVxdWVzdF9jdHggKmN0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAwLCByZXMgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmhkZXYtPmxvY2ssIGZsYWdzKTsKKworCWlmIChyZXEpCisJCXJlcyA9IGFoYXNoX2VucXVldWVfcmVxdWVzdCgmaGRldi0+cXVldWUsIHJlcSk7CisKKwlpZiAoRFJJVkVSX0ZMQUdTX0JVU1kgJiBoZGV2LT5mbGFncykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZGV2LT5sb2NrLCBmbGFncyk7CisJCXJldHVybiByZXM7CisJfQorCisJYmFja2xvZyA9IGNyeXB0b19nZXRfYmFja2xvZygmaGRldi0+cXVldWUpOworCWFzeW5jX3JlcSA9IGNyeXB0b19kZXF1ZXVlX3JlcXVlc3QoJmhkZXYtPnF1ZXVlKTsKKwlpZiAoYXN5bmNfcmVxKQorCQloZGV2LT5mbGFncyB8PSBEUklWRVJfRkxBR1NfQlVTWTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhkZXYtPmxvY2ssIGZsYWdzKTsKKworCWlmICghYXN5bmNfcmVxKQorCQlyZXR1cm4gcmVzOworCisJaWYgKGJhY2tsb2cpCisJCWJhY2tsb2ctPmNvbXBsZXRlKGJhY2tsb2csIC1FSU5QUk9HUkVTUyk7CisKKwlyZXEgPSBhaGFzaF9yZXF1ZXN0X2Nhc3QoYXN5bmNfcmVxKTsKKwloZGV2LT5yZXEgPSByZXE7CisKKwljdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCisJZGV2X2luZm8oaGRldi0+ZGV2LCAicHJvY2Vzc2luZyByZXEsIG9wOiAlbHUsIGJ5dGVzOiAlZFxuIiwKKwkJIGN0eC0+b3AsIHJlcS0+bmJ5dGVzKTsKKworCWVyciA9IGltZ19oYXNoX2h3X2luaXQoaGRldik7CisKKwlpZiAoIWVycikKKwkJZXJyID0gaW1nX2hhc2hfcHJvY2Vzc19kYXRhKGhkZXYpOworCisJaWYgKGVyciAhPSAtRUlOUFJPR1JFU1MpIHsKKwkJLyogZG9uZV90YXNrIHdpbGwgbm90IGZpbmlzaCBzbyBkbyBpdCBoZXJlICovCisJCWltZ19oYXNoX2ZpbmlzaF9yZXEocmVxLCBlcnIpOworCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGltZ19oYXNoX3VwZGF0ZShzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBpbWdfaGFzaF9yZXF1ZXN0X2N0eCAqcmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBpbWdfaGFzaF9jdHggKmN0eCA9IGNyeXB0b19haGFzaF9jdHgodGZtKTsKKworCWFoYXNoX3JlcXVlc3Rfc2V0X3RmbSgmcmN0eC0+ZmFsbGJhY2tfcmVxLCBjdHgtPmZhbGxiYWNrKTsKKwlyY3R4LT5mYWxsYmFja19yZXEuYmFzZS5mbGFncyA9IHJlcS0+YmFzZS5mbGFncworCQkmIENSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwlyY3R4LT5mYWxsYmFja19yZXEubmJ5dGVzID0gcmVxLT5uYnl0ZXM7CisJcmN0eC0+ZmFsbGJhY2tfcmVxLnNyYyA9IHJlcS0+c3JjOworCisJcmV0dXJuIGNyeXB0b19haGFzaF91cGRhdGUoJnJjdHgtPmZhbGxiYWNrX3JlcSk7Cit9CisKK3N0YXRpYyBpbnQgaW1nX2hhc2hfZmluYWwoc3RydWN0IGFoYXNoX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgaW1nX2hhc2hfcmVxdWVzdF9jdHggKnJjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCXN0cnVjdCBjcnlwdG9fYWhhc2ggKnRmbSA9IGNyeXB0b19haGFzaF9yZXF0Zm0ocmVxKTsKKwlzdHJ1Y3QgaW1nX2hhc2hfY3R4ICpjdHggPSBjcnlwdG9fYWhhc2hfY3R4KHRmbSk7CisKKwlhaGFzaF9yZXF1ZXN0X3NldF90Zm0oJnJjdHgtPmZhbGxiYWNrX3JlcSwgY3R4LT5mYWxsYmFjayk7CisJcmN0eC0+ZmFsbGJhY2tfcmVxLmJhc2UuZmxhZ3MgPSByZXEtPmJhc2UuZmxhZ3MKKwkJJiBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisJcmN0eC0+ZmFsbGJhY2tfcmVxLnJlc3VsdCA9IHJlcS0+cmVzdWx0OworCisJcmV0dXJuIGNyeXB0b19haGFzaF9maW5hbCgmcmN0eC0+ZmFsbGJhY2tfcmVxKTsKK30KKworc3RhdGljIGludCBpbWdfaGFzaF9maW51cChzdHJ1Y3QgYWhhc2hfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBpbWdfaGFzaF9yZXF1ZXN0X2N0eCAqcmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBpbWdfaGFzaF9jdHggKmN0eCA9IGNyeXB0b19haGFzaF9jdHgodGZtKTsKKworCWFoYXNoX3JlcXVlc3Rfc2V0X3RmbSgmcmN0eC0+ZmFsbGJhY2tfcmVxLCBjdHgtPmZhbGxiYWNrKTsKKwlyY3R4LT5mYWxsYmFja19yZXEuYmFzZS5mbGFncyA9IHJlcS0+YmFzZS5mbGFncworCQkmIENSWVBUT19URk1fUkVRX01BWV9TTEVFUDsKKwlyY3R4LT5mYWxsYmFja19yZXEubmJ5dGVzID0gcmVxLT5uYnl0ZXM7CisJcmN0eC0+ZmFsbGJhY2tfcmVxLnNyYyA9IHJlcS0+c3JjOworCXJjdHgtPmZhbGxiYWNrX3JlcS5yZXN1bHQgPSByZXEtPnJlc3VsdDsKKworCXJldHVybiBjcnlwdG9fYWhhc2hfZmludXAoJnJjdHgtPmZhbGxiYWNrX3JlcSk7Cit9CisKK3N0YXRpYyBpbnQgaW1nX2hhc2hfZGlnZXN0KHN0cnVjdCBhaGFzaF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGNyeXB0b19haGFzaCAqdGZtID0gY3J5cHRvX2FoYXNoX3JlcXRmbShyZXEpOworCXN0cnVjdCBpbWdfaGFzaF9jdHggKnRjdHggPSBjcnlwdG9fYWhhc2hfY3R4KHRmbSk7CisJc3RydWN0IGltZ19oYXNoX3JlcXVlc3RfY3R4ICpjdHggPSBhaGFzaF9yZXF1ZXN0X2N0eChyZXEpOworCXN0cnVjdCBpbWdfaGFzaF9kZXYgKmhkZXYgPSBOVUxMOworCXN0cnVjdCBpbWdfaGFzaF9kZXYgKnRtcDsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrKCZpbWdfaGFzaC5sb2NrKTsKKwlpZiAoIXRjdHgtPmhkZXYpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bXAsICZpbWdfaGFzaC5kZXZfbGlzdCwgbGlzdCkgeworCQkJaGRldiA9IHRtcDsKKwkJCWJyZWFrOworCQl9CisJCXRjdHgtPmhkZXYgPSBoZGV2OworCisJfSBlbHNlIHsKKwkJaGRldiA9IHRjdHgtPmhkZXY7CisJfQorCisJc3Bpbl91bmxvY2soJmltZ19oYXNoLmxvY2spOworCWN0eC0+aGRldiA9IGhkZXY7CisJY3R4LT5mbGFncyA9IDA7CisJY3R4LT5kaWdzaXplID0gY3J5cHRvX2FoYXNoX2RpZ2VzdHNpemUodGZtKTsKKworCXN3aXRjaCAoY3R4LT5kaWdzaXplKSB7CisJY2FzZSBTSEExX0RJR0VTVF9TSVpFOgorCQljdHgtPmZsYWdzIHw9IERSSVZFUl9GTEFHU19TSEExOworCQlicmVhazsKKwljYXNlIFNIQTI1Nl9ESUdFU1RfU0laRToKKwkJY3R4LT5mbGFncyB8PSBEUklWRVJfRkxBR1NfU0hBMjU2OworCQlicmVhazsKKwljYXNlIFNIQTIyNF9ESUdFU1RfU0laRToKKwkJY3R4LT5mbGFncyB8PSBEUklWRVJfRkxBR1NfU0hBMjI0OworCQlicmVhazsKKwljYXNlIE1ENV9ESUdFU1RfU0laRToKKwkJY3R4LT5mbGFncyB8PSBEUklWRVJfRkxBR1NfTUQ1OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljdHgtPmJ1ZmNudCA9IDA7CisJY3R4LT5vZmZzZXQgPSAwOworCWN0eC0+c2VudCA9IDA7CisJY3R4LT50b3RhbCA9IHJlcS0+bmJ5dGVzOworCWN0eC0+c2cgPSByZXEtPnNyYzsKKwljdHgtPnNnZmlyc3QgPSByZXEtPnNyYzsKKwljdHgtPm5lbnRzID0gc2dfbmVudHMoY3R4LT5zZyk7CisKKwllcnIgPSBpbWdfaGFzaF9oYW5kbGVfcXVldWUodGN0eC0+aGRldiwgcmVxKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaW1nX2hhc2hfY3JhX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgaW1nX2hhc2hfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCWNvbnN0IGNoYXIgKmFsZ19uYW1lID0gY3J5cHRvX3RmbV9hbGdfbmFtZSh0Zm0pOworCWludCBlcnIgPSAtRU5PTUVNOworCisJY3R4LT5mYWxsYmFjayA9IGNyeXB0b19hbGxvY19haGFzaChhbGdfbmFtZSwgMCwKKwkJCQkJICAgQ1JZUFRPX0FMR19ORUVEX0ZBTExCQUNLKTsKKwlpZiAoSVNfRVJSKGN0eC0+ZmFsbGJhY2spKSB7CisJCXByX2VycigiaW1nX2hhc2g6IENvdWxkIG5vdCBsb2FkIGZhbGxiYWNrIGRyaXZlci5cbiIpOworCQllcnIgPSBQVFJfRVJSKGN0eC0+ZmFsbGJhY2spOworCQlnb3RvIGVycjsKKwl9CisJY3J5cHRvX2FoYXNoX3NldF9yZXFzaXplKF9fY3J5cHRvX2FoYXNoX2Nhc3QodGZtKSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBpbWdfaGFzaF9yZXF1ZXN0X2N0eCkgKworCQkJCSBJTUdfSEFTSF9ETUFfVEhSRVNIT0xEKTsKKworCXJldHVybiAwOworCitlcnI6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaW1nX2hhc2hfY3JhX2V4aXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKwlzdHJ1Y3QgaW1nX2hhc2hfY3R4ICp0Y3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKworCWNyeXB0b19mcmVlX2FoYXNoKHRjdHgtPmZhbGxiYWNrKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGltZ19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGltZ19oYXNoX2RldiAqaGRldiA9IGRldl9pZDsKKwl1MzIgcmVnOworCisJcmVnID0gaW1nX2hhc2hfcmVhZChoZGV2LCBDUl9JTlRTVEFUKTsKKwlpbWdfaGFzaF93cml0ZShoZGV2LCBDUl9JTlRDTEVBUiwgcmVnKTsKKworCWlmIChyZWcgJiBDUl9JTlRfTkVXX1JFU1VMVFNfU0VUKSB7CisJCWRldl9kYmcoaGRldi0+ZGV2LCAiSVJRIENSX0lOVF9ORVdfUkVTVUxUU19TRVRcbiIpOworCQlpZiAoRFJJVkVSX0ZMQUdTX0JVU1kgJiBoZGV2LT5mbGFncykgeworCQkJaGRldi0+ZmxhZ3MgfD0gRFJJVkVSX0ZMQUdTX09VVFBVVF9SRUFEWTsKKwkJCWlmICghKERSSVZFUl9GTEFHU19DUFUgJiBoZGV2LT5mbGFncykpCisJCQkJaGRldi0+ZmxhZ3MgfD0gRFJJVkVSX0ZMQUdTX0RNQV9SRUFEWTsKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmhkZXYtPmRvbmVfdGFzayk7CisJCX0gZWxzZSB7CisJCQlkZXZfd2FybihoZGV2LT5kZXYsCisJCQkJICJIQVNIIGludGVycnVwdCB3aGVuIG5vIGFjdGl2ZSByZXF1ZXN0cy5cbiIpOworCQl9CisJfSBlbHNlIGlmIChyZWcgJiBDUl9JTlRfUkVTVUxUU19BVkFJTEFCTEUpIHsKKwkJZGV2X3dhcm4oaGRldi0+ZGV2LAorCQkJICJJUlEgdHJpZ2dlcmVkIGJlZm9yZSB0aGUgaGFzaCBoYWQgY29tcGxldGVkXG4iKTsKKwl9IGVsc2UgaWYgKHJlZyAmIENSX0lOVF9SRVNVTFRfUkVBRF9FUlIpIHsKKwkJZGV2X3dhcm4oaGRldi0+ZGV2LAorCQkJICJBdHRlbXB0IHRvIHJlYWQgZnJvbSBhbiBlbXB0eSByZXN1bHQgcXVldWVcbiIpOworCX0gZWxzZSBpZiAocmVnICYgQ1JfSU5UX01FU1NBR0VfV1JJVEVfRVJST1IpIHsKKwkJZGV2X3dhcm4oaGRldi0+ZGV2LAorCQkJICJEYXRhIHdyaXR0ZW4gYmVmb3JlIHRoZSBoYXJkd2FyZSB3YXMgY29uZmlndXJlZFxuIik7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBhaGFzaF9hbGcgaW1nX2FsZ3NbXSA9IHsKKwl7CisJCS5pbml0ID0gaW1nX2hhc2hfaW5pdCwKKwkJLnVwZGF0ZSA9IGltZ19oYXNoX3VwZGF0ZSwKKwkJLmZpbmFsID0gaW1nX2hhc2hfZmluYWwsCisJCS5maW51cCA9IGltZ19oYXNoX2ZpbnVwLAorCQkuZGlnZXN0ID0gaW1nX2hhc2hfZGlnZXN0LAorCQkuaGFsZyA9IHsKKwkJCS5kaWdlc3RzaXplID0gTUQ1X0RJR0VTVF9TSVpFLAorCQkJLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gIm1kNSIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJpbWctbWQ1IiwKKwkJCQkuY3JhX3ByaW9yaXR5ID0gMzAwLAorCQkJCS5jcmFfZmxhZ3MgPQorCQkJCUNSWVBUT19BTEdfQVNZTkMgfAorCQkJCUNSWVBUT19BTEdfTkVFRF9GQUxMQkFDSywKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IE1ENV9ITUFDX0JMT0NLX1NJWkUsCisJCQkJLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCBpbWdfaGFzaF9jdHgpLAorCQkJCS5jcmFfaW5pdCA9IGltZ19oYXNoX2NyYV9pbml0LAorCQkJCS5jcmFfZXhpdCA9IGltZ19oYXNoX2NyYV9leGl0LAorCQkJCS5jcmFfbW9kdWxlID0gVEhJU19NT0RVTEUsCisJCQl9CisJCX0KKwl9LAorCXsKKwkJLmluaXQgPSBpbWdfaGFzaF9pbml0LAorCQkudXBkYXRlID0gaW1nX2hhc2hfdXBkYXRlLAorCQkuZmluYWwgPSBpbWdfaGFzaF9maW5hbCwKKwkJLmZpbnVwID0gaW1nX2hhc2hfZmludXAsCisJCS5kaWdlc3QgPSBpbWdfaGFzaF9kaWdlc3QsCisJCS5oYWxnID0geworCQkJLmRpZ2VzdHNpemUgPSBTSEExX0RJR0VTVF9TSVpFLAorCQkJLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gInNoYTEiLAorCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAiaW1nLXNoYTEiLAorCQkJCS5jcmFfcHJpb3JpdHkgPSAzMDAsCisJCQkJLmNyYV9mbGFncyA9CisJCQkJQ1JZUFRPX0FMR19BU1lOQyB8CisJCQkJQ1JZUFRPX0FMR19ORUVEX0ZBTExCQUNLLAorCQkJCS5jcmFfYmxvY2tzaXplID0gU0hBMV9CTE9DS19TSVpFLAorCQkJCS5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW1nX2hhc2hfY3R4KSwKKwkJCQkuY3JhX2luaXQgPSBpbWdfaGFzaF9jcmFfaW5pdCwKKwkJCQkuY3JhX2V4aXQgPSBpbWdfaGFzaF9jcmFfZXhpdCwKKwkJCQkuY3JhX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCQkJfQorCQl9CisJfSwKKwl7CisJCS5pbml0ID0gaW1nX2hhc2hfaW5pdCwKKwkJLnVwZGF0ZSA9IGltZ19oYXNoX3VwZGF0ZSwKKwkJLmZpbmFsID0gaW1nX2hhc2hfZmluYWwsCisJCS5maW51cCA9IGltZ19oYXNoX2ZpbnVwLAorCQkuZGlnZXN0ID0gaW1nX2hhc2hfZGlnZXN0LAorCQkuaGFsZyA9IHsKKwkJCS5kaWdlc3RzaXplID0gU0hBMjI0X0RJR0VTVF9TSVpFLAorCQkJLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gInNoYTIyNCIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJpbWctc2hhMjI0IiwKKwkJCQkuY3JhX3ByaW9yaXR5ID0gMzAwLAorCQkJCS5jcmFfZmxhZ3MgPQorCQkJCUNSWVBUT19BTEdfQVNZTkMgfAorCQkJCUNSWVBUT19BTEdfTkVFRF9GQUxMQkFDSywKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IFNIQTIyNF9CTE9DS19TSVpFLAorCQkJCS5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW1nX2hhc2hfY3R4KSwKKwkJCQkuY3JhX2luaXQgPSBpbWdfaGFzaF9jcmFfaW5pdCwKKwkJCQkuY3JhX2V4aXQgPSBpbWdfaGFzaF9jcmFfZXhpdCwKKwkJCQkuY3JhX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCQkJfQorCQl9CisJfSwKKwl7CisJCS5pbml0ID0gaW1nX2hhc2hfaW5pdCwKKwkJLnVwZGF0ZSA9IGltZ19oYXNoX3VwZGF0ZSwKKwkJLmZpbmFsID0gaW1nX2hhc2hfZmluYWwsCisJCS5maW51cCA9IGltZ19oYXNoX2ZpbnVwLAorCQkuZGlnZXN0ID0gaW1nX2hhc2hfZGlnZXN0LAorCQkuaGFsZyA9IHsKKwkJCS5kaWdlc3RzaXplID0gU0hBMjU2X0RJR0VTVF9TSVpFLAorCQkJLmJhc2UgPSB7CisJCQkJLmNyYV9uYW1lID0gInNoYTI1NiIsCisJCQkJLmNyYV9kcml2ZXJfbmFtZSA9ICJpbWctc2hhMjU2IiwKKwkJCQkuY3JhX3ByaW9yaXR5ID0gMzAwLAorCQkJCS5jcmFfZmxhZ3MgPQorCQkJCUNSWVBUT19BTEdfQVNZTkMgfAorCQkJCUNSWVBUT19BTEdfTkVFRF9GQUxMQkFDSywKKwkJCQkuY3JhX2Jsb2Nrc2l6ZSA9IFNIQTI1Nl9CTE9DS19TSVpFLAorCQkJCS5jcmFfY3R4c2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW1nX2hhc2hfY3R4KSwKKwkJCQkuY3JhX2luaXQgPSBpbWdfaGFzaF9jcmFfaW5pdCwKKwkJCQkuY3JhX2V4aXQgPSBpbWdfaGFzaF9jcmFfZXhpdCwKKwkJCQkuY3JhX21vZHVsZSA9IFRISVNfTU9EVUxFLAorCQkJfQorCQl9CisJfQorfTsKKworc3RhdGljIGludCBpbWdfcmVnaXN0ZXJfYWxncyhzdHJ1Y3QgaW1nX2hhc2hfZGV2ICpoZGV2KQoreworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbWdfYWxncyk7IGkrKykgeworCQllcnIgPSBjcnlwdG9fcmVnaXN0ZXJfYWhhc2goJmltZ19hbGdzW2ldKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX3JlZzsKKwl9CisJcmV0dXJuIDA7CisKK2Vycl9yZWc6CisJZm9yICg7IGktLTsgKQorCQljcnlwdG9fdW5yZWdpc3Rlcl9haGFzaCgmaW1nX2FsZ3NbaV0pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpbWdfdW5yZWdpc3Rlcl9hbGdzKHN0cnVjdCBpbWdfaGFzaF9kZXYgKmhkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbWdfYWxncyk7IGkrKykKKwkJY3J5cHRvX3VucmVnaXN0ZXJfYWhhc2goJmltZ19hbGdzW2ldKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW1nX2hhc2hfZG9uZV90YXNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaW1nX2hhc2hfZGV2ICpoZGV2ID0gKHN0cnVjdCBpbWdfaGFzaF9kZXYgKilkYXRhOworCWludCBlcnIgPSAwOworCisJaWYgKGhkZXYtPmVyciA9PSAtRUlOVkFMKSB7CisJCWVyciA9IGhkZXYtPmVycjsKKwkJZ290byBmaW5pc2g7CisJfQorCisJaWYgKCEoRFJJVkVSX0ZMQUdTX0JVU1kgJiBoZGV2LT5mbGFncykpIHsKKwkJaW1nX2hhc2hfaGFuZGxlX3F1ZXVlKGhkZXYsIE5VTEwpOworCQlyZXR1cm47CisJfQorCisJaWYgKERSSVZFUl9GTEFHU19DUFUgJiBoZGV2LT5mbGFncykgeworCQlpZiAoRFJJVkVSX0ZMQUdTX09VVFBVVF9SRUFEWSAmIGhkZXYtPmZsYWdzKSB7CisJCQloZGV2LT5mbGFncyAmPSB+RFJJVkVSX0ZMQUdTX09VVFBVVF9SRUFEWTsKKwkJCWdvdG8gZmluaXNoOworCQl9CisJfSBlbHNlIGlmIChEUklWRVJfRkxBR1NfRE1BX1JFQURZICYgaGRldi0+ZmxhZ3MpIHsKKwkJaWYgKERSSVZFUl9GTEFHU19ETUFfQUNUSVZFICYgaGRldi0+ZmxhZ3MpIHsKKwkJCWhkZXYtPmZsYWdzICY9IH5EUklWRVJfRkxBR1NfRE1BX0FDVElWRTsKKwkJCWltZ19oYXNoX3dyaXRlX3ZpYV9kbWFfc3RvcChoZGV2KTsKKwkJCWlmIChoZGV2LT5lcnIpIHsKKwkJCQllcnIgPSBoZGV2LT5lcnI7CisJCQkJZ290byBmaW5pc2g7CisJCQl9CisJCX0KKwkJaWYgKERSSVZFUl9GTEFHU19PVVRQVVRfUkVBRFkgJiBoZGV2LT5mbGFncykgeworCQkJaGRldi0+ZmxhZ3MgJj0gfihEUklWRVJfRkxBR1NfRE1BX1JFQURZIHwKKwkJCQkJRFJJVkVSX0ZMQUdTX09VVFBVVF9SRUFEWSk7CisJCQlnb3RvIGZpbmlzaDsKKwkJfQorCX0KKwlyZXR1cm47CisKK2ZpbmlzaDoKKwlpbWdfaGFzaF9maW5pc2hfcmVxKGhkZXYtPnJlcSwgZXJyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaW1nX2hhc2hfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImltZyxoYXNoLWFjY2VsZXJhdG9yIiB9LAorCXt9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaW1nX2hhc2hfbWF0Y2gpOworCitzdGF0aWMgaW50IGltZ19oYXNoX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGltZ19oYXNoX2RldiAqaGRldjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCByZXNvdXJjZSAqaGFzaF9yZXM7CisJaW50CWlycTsKKwlpbnQgZXJyOworCisJaGRldiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqaGRldiksIEdGUF9LRVJORUwpOworCWlmIChoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJmhkZXYtPmxvY2spOworCisJaGRldi0+ZGV2ID0gZGV2OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaGRldik7CisKKwlJTklUX0xJU1RfSEVBRCgmaGRldi0+bGlzdCk7CisKKwl0YXNrbGV0X2luaXQoJmhkZXYtPmRvbmVfdGFzaywgaW1nX2hhc2hfZG9uZV90YXNrLCAodW5zaWduZWQgbG9uZyloZGV2KTsKKwl0YXNrbGV0X2luaXQoJmhkZXYtPmRtYV90YXNrLCBpbWdfaGFzaF9kbWFfdGFzaywgKHVuc2lnbmVkIGxvbmcpaGRldik7CisKKwljcnlwdG9faW5pdF9xdWV1ZSgmaGRldi0+cXVldWUsIElNR19IQVNIX1FVRVVFX0xFTkdUSCk7CisKKwkvKiBSZWdpc3RlciBiYW5rICovCisJaGFzaF9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJaGRldi0+aW9fYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIGhhc2hfcmVzKTsKKwlpZiAoSVNfRVJSKGhkZXYtPmlvX2Jhc2UpKSB7CisJCWVyciA9IFBUUl9FUlIoaGRldi0+aW9fYmFzZSk7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgaW9yZW1hcCwgcmV0dXJuZWQgJWRcbiIsIGVycik7CisKKwkJZ290byByZXNfZXJyOworCX0KKworCS8qIFdyaXRlIHBvcnQgKERNQSBvciBDUFUpICovCisJaGFzaF9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOworCWhkZXYtPmNwdV9hZGRyID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgaGFzaF9yZXMpOworCWlmIChJU19FUlIoaGRldi0+Y3B1X2FkZHIpKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgaW9yZW1hcCB3cml0ZSBwb3J0XG4iKTsKKwkJZXJyID0gUFRSX0VSUihoZGV2LT5jcHVfYWRkcik7CisJCWdvdG8gcmVzX2VycjsKKwl9CisJaGRldi0+YnVzX2FkZHIgPSBoYXNoX3Jlcy0+c3RhcnQ7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAibm8gSVJRIHJlc291cmNlIGluZm9cbiIpOworCQllcnIgPSBpcnE7CisJCWdvdG8gcmVzX2VycjsKKwl9CisKKwllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgaXJxLCBpbWdfaXJxX2hhbmRsZXIsIDAsCisJCQkgICAgICAgZGV2X25hbWUoZGV2KSwgaGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byByZXF1ZXN0IGlycVxuIik7CisJCWdvdG8gcmVzX2VycjsKKwl9CisJZGV2X2RiZyhkZXYsICJ1c2luZyBJUlEgY2hhbm5lbCAlZFxuIiwgaXJxKTsKKworCWhkZXYtPmhhc2hfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJoYXNoIik7CisJaWYgKElTX0VSUihoZGV2LT5oYXNoX2NsaykpIHsKKwkJZGV2X2VycihkZXYsICJjbG9jayBpbml0aWFsaXphdGlvbiBmYWlsZWQuXG4iKTsKKwkJZXJyID0gUFRSX0VSUihoZGV2LT5oYXNoX2Nsayk7CisJCWdvdG8gcmVzX2VycjsKKwl9CisKKwloZGV2LT5zeXNfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJzeXMiKTsKKwlpZiAoSVNfRVJSKGhkZXYtPnN5c19jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiY2xvY2sgaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJCWVyciA9IFBUUl9FUlIoaGRldi0+c3lzX2Nsayk7CisJCWdvdG8gcmVzX2VycjsKKwl9CisKKwllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoaGRldi0+aGFzaF9jbGspOworCWlmIChlcnIpCisJCWdvdG8gcmVzX2VycjsKKworCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShoZGV2LT5zeXNfY2xrKTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsa19lcnI7CisKKwllcnIgPSBpbWdfaGFzaF9kbWFfaW5pdChoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGRtYV9lcnI7CisKKwlkZXZfZGJnKGRldiwgInVzaW5nICVzIGZvciBETUEgdHJhbnNmZXJzXG4iLAorCQlkbWFfY2hhbl9uYW1lKGhkZXYtPmRtYV9sY2gpKTsKKworCXNwaW5fbG9jaygmaW1nX2hhc2gubG9jayk7CisJbGlzdF9hZGRfdGFpbCgmaGRldi0+bGlzdCwgJmltZ19oYXNoLmRldl9saXN0KTsKKwlzcGluX3VubG9jaygmaW1nX2hhc2gubG9jayk7CisKKwllcnIgPSBpbWdfcmVnaXN0ZXJfYWxncyhoZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9hbGdzOworCWRldl9kYmcoZGV2LCAiSW1nIE1ENS9TSEExL1NIQTIyNC9TSEEyNTYgSGFyZHdhcmUgYWNjZWxlcmF0b3IgaW5pdGlhbGl6ZWRcbiIpOworCisJcmV0dXJuIDA7CisKK2Vycl9hbGdzOgorCXNwaW5fbG9jaygmaW1nX2hhc2gubG9jayk7CisJbGlzdF9kZWwoJmhkZXYtPmxpc3QpOworCXNwaW5fdW5sb2NrKCZpbWdfaGFzaC5sb2NrKTsKKwlkbWFfcmVsZWFzZV9jaGFubmVsKGhkZXYtPmRtYV9sY2gpOworZG1hX2VycjoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaGRldi0+c3lzX2Nsayk7CitjbGtfZXJyOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZShoZGV2LT5oYXNoX2Nsayk7CityZXNfZXJyOgorCXRhc2tsZXRfa2lsbCgmaGRldi0+ZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJmhkZXYtPmRtYV90YXNrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaW1nX2hhc2hfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RhdGljIHN0cnVjdCBpbWdfaGFzaF9kZXYgKmhkZXY7CisKKwloZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3Bpbl9sb2NrKCZpbWdfaGFzaC5sb2NrKTsKKwlsaXN0X2RlbCgmaGRldi0+bGlzdCk7CisJc3Bpbl91bmxvY2soJmltZ19oYXNoLmxvY2spOworCisJaW1nX3VucmVnaXN0ZXJfYWxncyhoZGV2KTsKKworCXRhc2tsZXRfa2lsbCgmaGRldi0+ZG9uZV90YXNrKTsKKwl0YXNrbGV0X2tpbGwoJmhkZXYtPmRtYV90YXNrKTsKKworCWRtYV9yZWxlYXNlX2NoYW5uZWwoaGRldi0+ZG1hX2xjaCk7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaGRldi0+aGFzaF9jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShoZGV2LT5zeXNfY2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbWdfaGFzaF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGltZ19oYXNoX3Byb2JlLAorCS5yZW1vdmUJCT0gaW1nX2hhc2hfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJpbWctaGFzaC1hY2NlbGVyYXRvciIsCisJCS5vZl9tYXRjaF90YWJsZQk9IG9mX21hdGNoX3B0cihpbWdfaGFzaF9tYXRjaCksCisJfQorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaW1nX2hhc2hfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbWd0ZWMgU0hBMS8yMjQvMjU2ICYgTUQ1IGh3IGFjY2VsZXJhdG9yIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiV2lsbCBUaG9tYXMuIik7CitNT0RVTEVfQVVUSE9SKCJKYW1lcyBIYXJ0bGV5IDxqYW1lcy5oYXJ0bGV5QGltZ3RlYy5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9teHMtZGNwLmMgYi9kcml2ZXJzL2NyeXB0by9teHMtZGNwLmMKaW5kZXggODI5ZDYzOS4uNTllZDU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vbXhzLWRjcC5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL214cy1kY3AuYwpAQCAtMTUzLDcgKzE1Myw3IEBACiAJc3RydWN0IGRjcCAqc2RjcCA9IGdsb2JhbF9zZGNwOwogCWNvbnN0IGludCBjaGFuID0gYWN0eC0+Y2hhbjsKIAl1aW50MzJfdCBzdGF0OwotCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyByZXQ7CiAJc3RydWN0IGRjcF9kbWFfZGVzYyAqZGVzYyA9ICZzZGNwLT5jb2gtPmRlc2NbYWN0eC0+Y2hhbl07CiAKIAlkbWFfYWRkcl90IGRlc2NfcGh5cyA9IGRtYV9tYXBfc2luZ2xlKHNkY3AtPmRldiwgZGVzYywgc2l6ZW9mKCpkZXNjKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL29tYXAtYWVzLmMgYi9kcml2ZXJzL2NyeXB0by9vbWFwLWFlcy5jCmluZGV4IDQyZjk1YTQuLjlhMjhiN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL29tYXAtYWVzLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vb21hcC1hZXMuYwpAQCAtNTU0LDE1ICs1NTQsMjMgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IG9tYXBfYWVzX2NoZWNrX2FsaWduZWQoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3N0YXRpYyBpbnQgb21hcF9hZXNfY2hlY2tfYWxpZ25lZChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgdG90YWwpCiB7CisJaW50IGxlbiA9IDA7CisKIAl3aGlsZSAoc2cpIHsKIAkJaWYgKCFJU19BTElHTkVEKHNnLT5vZmZzZXQsIDQpKQogCQkJcmV0dXJuIC0xOwogCQlpZiAoIUlTX0FMSUdORUQoc2ctPmxlbmd0aCwgQUVTX0JMT0NLX1NJWkUpKQogCQkJcmV0dXJuIC0xOworCisJCWxlbiArPSBzZy0+bGVuZ3RoOwogCQlzZyA9IHNnX25leHQoc2cpOwogCX0KKworCWlmIChsZW4gIT0gdG90YWwpCisJCXJldHVybiAtMTsKKwogCXJldHVybiAwOwogfQogCkBAIC02MzMsOCArNjQxLDggQEAKIAlkZC0+aW5fc2cgPSByZXEtPnNyYzsKIAlkZC0+b3V0X3NnID0gcmVxLT5kc3Q7CiAKLQlpZiAob21hcF9hZXNfY2hlY2tfYWxpZ25lZChkZC0+aW5fc2cpIHx8Ci0JICAgIG9tYXBfYWVzX2NoZWNrX2FsaWduZWQoZGQtPm91dF9zZykpIHsKKwlpZiAob21hcF9hZXNfY2hlY2tfYWxpZ25lZChkZC0+aW5fc2csIGRkLT50b3RhbCkgfHwKKwkgICAgb21hcF9hZXNfY2hlY2tfYWxpZ25lZChkZC0+b3V0X3NnLCBkZC0+dG90YWwpKSB7CiAJCWlmIChvbWFwX2Flc19jb3B5X3NncyhkZCkpCiAJCQlwcl9lcnIoIkZhaWxlZCB0byBjb3B5IFNHcyBmb3IgdW5hbGlnbmVkIGNhc2VzXG4iKTsKIAkJZGQtPnNnc19jb3BpZWQgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vb21hcC1zaGFtLmMgYi9kcml2ZXJzL2NyeXB0by9vbWFwLXNoYW0uYwppbmRleCAzYzc2Njk2Li40ZDYzZTBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9vbWFwLXNoYW0uYworKysgYi9kcml2ZXJzL2NyeXB0by9vbWFwLXNoYW0uYwpAQCAtNjQwLDYgKzY0MCw3IEBACiAKIAl3aGlsZSAoY3R4LT5zZykgewogCQl2YWRkciA9IGttYXBfYXRvbWljKHNnX3BhZ2UoY3R4LT5zZykpOworCQl2YWRkciArPSBjdHgtPnNnLT5vZmZzZXQ7CiAKIAkJY291bnQgPSBvbWFwX3NoYW1fYXBwZW5kX2J1ZmZlcihjdHgsCiAJCQkJdmFkZHIgKyBjdHgtPm9mZnNldCwKQEAgLTE5NDUsNiArMTk0Niw3IEBACiAJZGQtPmZsYWdzIHw9IGRkLT5wZGF0YS0+ZmxhZ3M7CiAKIAlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCXBtX3J1bnRpbWVfaXJxX3NhZmUoZGV2KTsKIAlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7CiAJcmV2ID0gb21hcF9zaGFtX3JlYWQoZGQsIFNIQV9SRUdfUkVWKGRkKSk7CiAJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9hY2NlbF9kZXZpY2VzLmggYi9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9hZGZfYWNjZWxfZGV2aWNlcy5oCmluZGV4IDE5YzBlZmEuLmYyMmNlNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9hY2NlbF9kZXZpY2VzLmgKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX2FjY2VsX2RldmljZXMuaApAQCAtNTIsNyArNTIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSAiYWRmX2NmZ19jb21tb24uaCIKIAotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lOVEVMIDB4ODA4NgogI2RlZmluZSBBREZfREg4OTVYQ0NfREVWSUNFX05BTUUgImRoODk1eGNjIgogI2RlZmluZSBBREZfREg4OTVYQ0NfUENJX0RFVklDRV9JRCAweDQzNQogI2RlZmluZSBBREZfUENJX01BWF9CQVJTIDMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9hY2NlbF9lbmdpbmUuYyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9hY2NlbF9lbmdpbmUuYwppbmRleCBjNzc0NTNiLi43ZjhiNjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9hZGZfYWNjZWxfZW5naW5lLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX2FjY2VsX2VuZ2luZS5jCkBAIC02MCwzNiArNjAsNDAgQEAKIAogCWlmIChyZXF1ZXN0X2Zpcm13YXJlKCZsb2FkZXJfZGF0YS0+dW9mX2Z3LCBod19kZXZpY2UtPmZ3X25hbWUsCiAJCQkgICAgICZhY2NlbF9kZXYtPmFjY2VsX3BjaV9kZXYucGNpX2Rldi0+ZGV2KSkgewotCQlwcl9lcnIoIlFBVDogRmFpbGVkIHRvIGxvYWQgZmlybXdhcmUgJXNcbiIsIGh3X2RldmljZS0+ZndfbmFtZSk7CisJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwgIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlICVzXG4iLAorCQkJaHdfZGV2aWNlLT5md19uYW1lKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJdW9mX3NpemUgPSBsb2FkZXJfZGF0YS0+dW9mX2Z3LT5zaXplOwogCXVvZl9hZGRyID0gKHZvaWQgKilsb2FkZXJfZGF0YS0+dW9mX2Z3LT5kYXRhOwogCWlmIChxYXRfdWNsb19tYXBfdW9mX29iaihsb2FkZXJfZGF0YS0+ZndfbG9hZGVyLCB1b2ZfYWRkciwgdW9mX3NpemUpKSB7Ci0JCXByX2VycigiUUFUOiBGYWlsZWQgdG8gbWFwIFVPRlxuIik7CisJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwgIkZhaWxlZCB0byBtYXAgVU9GXG4iKTsKIAkJZ290byBvdXRfZXJyOwogCX0KIAlpZiAocWF0X3VjbG9fd3JfYWxsX3VpbWFnZShsb2FkZXJfZGF0YS0+ZndfbG9hZGVyKSkgewotCQlwcl9lcnIoIlFBVDogRmFpbGVkIHRvIG1hcCBVT0ZcbiIpOworCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksICJGYWlsZWQgdG8gbWFwIFVPRlxuIik7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAJcmV0dXJuIDA7CiAKIG91dF9lcnI6Ci0JcmVsZWFzZV9maXJtd2FyZShsb2FkZXJfZGF0YS0+dW9mX2Z3KTsKKwlhZGZfYWVfZndfcmVsZWFzZShhY2NlbF9kZXYpOwogCXJldHVybiAtRUZBVUxUOwogfQogCi1pbnQgYWRmX2FlX2Z3X3JlbGVhc2Uoc3RydWN0IGFkZl9hY2NlbF9kZXYgKmFjY2VsX2RldikKK3ZvaWQgYWRmX2FlX2Z3X3JlbGVhc2Uoc3RydWN0IGFkZl9hY2NlbF9kZXYgKmFjY2VsX2RldikKIHsKIAlzdHJ1Y3QgYWRmX2Z3X2xvYWRlcl9kYXRhICpsb2FkZXJfZGF0YSA9IGFjY2VsX2Rldi0+ZndfbG9hZGVyOwogCi0JcmVsZWFzZV9maXJtd2FyZShsb2FkZXJfZGF0YS0+dW9mX2Z3KTsKIAlxYXRfdWNsb19kZWxfdW9mX29iaihsb2FkZXJfZGF0YS0+ZndfbG9hZGVyKTsKIAlxYXRfaGFsX2RlaW5pdChsb2FkZXJfZGF0YS0+ZndfbG9hZGVyKTsKKworCWlmIChsb2FkZXJfZGF0YS0+dW9mX2Z3KQorCQlyZWxlYXNlX2Zpcm13YXJlKGxvYWRlcl9kYXRhLT51b2ZfZncpOworCisJbG9hZGVyX2RhdGEtPnVvZl9mdyA9IE5VTEw7CiAJbG9hZGVyX2RhdGEtPmZ3X2xvYWRlciA9IE5VTEw7Ci0JcmV0dXJuIDA7CiB9CiAKIGludCBhZGZfYWVfc3RhcnQoc3RydWN0IGFkZl9hY2NlbF9kZXYgKmFjY2VsX2RldikKQEAgLTEwNCw4ICsxMDgsOSBAQAogCQkJYWVfY3RyKys7CiAJCX0KIAl9Ci0JcHJfaW5mbygiUUFUOiBxYXRfZGV2JWQgc3RhcnRlZCAlZCBhY2NlbGVyYXRpb24gZW5naW5lc1xuIiwKLQkJYWNjZWxfZGV2LT5hY2NlbF9pZCwgYWVfY3RyKTsKKwlkZXZfaW5mbygmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkgInFhdF9kZXYlZCBzdGFydGVkICVkIGFjY2VsZXJhdGlvbiBlbmdpbmVzXG4iLAorCQkgYWNjZWxfZGV2LT5hY2NlbF9pZCwgYWVfY3RyKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIxLDggKzEyNiw5IEBACiAJCQlhZV9jdHIrKzsKIAkJfQogCX0KLQlwcl9pbmZvKCJRQVQ6IHFhdF9kZXYlZCBzdG9wcGVkICVkIGFjY2VsZXJhdGlvbiBlbmdpbmVzXG4iLAotCQlhY2NlbF9kZXYtPmFjY2VsX2lkLCBhZV9jdHIpOworCWRldl9pbmZvKCZHRVRfREVWKGFjY2VsX2RldiksCisJCSAicWF0X2RldiVkIHN0b3BwZWQgJWQgYWNjZWxlcmF0aW9uIGVuZ2luZXNcbiIsCisJCSBhY2NlbF9kZXYtPmFjY2VsX2lkLCBhZV9jdHIpOwogCXJldHVybiAwOwogfQogCkBAIC0xNDcsMTIgKzE1MywxMiBAQAogCiAJYWNjZWxfZGV2LT5md19sb2FkZXIgPSBsb2FkZXJfZGF0YTsKIAlpZiAocWF0X2hhbF9pbml0KGFjY2VsX2RldikpIHsKLQkJcHJfZXJyKCJRQVQ6IEZhaWxlZCB0byBpbml0IHRoZSBBRXNcbiIpOworCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksICJGYWlsZWQgdG8gaW5pdCB0aGUgQUVzXG4iKTsKIAkJa2ZyZWUobG9hZGVyX2RhdGEpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKGFkZl9hZV9yZXNldChhY2NlbF9kZXYsIDApKSB7Ci0JCXByX2VycigiUUFUOiBGYWlsZWQgdG8gcmVzZXQgdGhlIEFFc1xuIik7CisJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwgIkZhaWxlZCB0byByZXNldCB0aGUgQUVzXG4iKTsKIAkJcWF0X2hhbF9kZWluaXQobG9hZGVyX2RhdGEtPmZ3X2xvYWRlcik7CiAJCWtmcmVlKGxvYWRlcl9kYXRhKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0xNjIsNiArMTY4LDkgQEAKIAogaW50IGFkZl9hZV9zaHV0ZG93bihzdHJ1Y3QgYWRmX2FjY2VsX2RldiAqYWNjZWxfZGV2KQogeworCXN0cnVjdCBhZGZfZndfbG9hZGVyX2RhdGEgKmxvYWRlcl9kYXRhID0gYWNjZWxfZGV2LT5md19sb2FkZXI7CisKKwlxYXRfaGFsX2RlaW5pdChsb2FkZXJfZGF0YS0+ZndfbG9hZGVyKTsKIAlrZnJlZShhY2NlbF9kZXYtPmZ3X2xvYWRlcik7CiAJYWNjZWxfZGV2LT5md19sb2FkZXIgPSBOVUxMOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX2Flci5jIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX2Flci5jCmluZGV4IGZhMWZlZjguLjJkYmM3MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9hZXIuYworKysgYi9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9hZGZfYWVyLmMKQEAgLTYwLDE0ICs2MCwxNCBAQAogewogCXN0cnVjdCBhZGZfYWNjZWxfZGV2ICphY2NlbF9kZXYgPSBhZGZfZGV2bWdyX3BjaV90b19hY2NlbF9kZXYocGRldik7CiAKLQlwcl9pbmZvKCJRQVQ6IEFjY2VsZXJhdGlvbiBkcml2ZXIgaGFyZHdhcmUgZXJyb3IgZGV0ZWN0ZWQuXG4iKTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQWNjZWxlcmF0aW9uIGRyaXZlciBoYXJkd2FyZSBlcnJvciBkZXRlY3RlZC5cbiIpOwogCWlmICghYWNjZWxfZGV2KSB7Ci0JCXByX2VycigiUUFUOiBDYW4ndCBmaW5kIGFjY2VsZXJhdGlvbiBkZXZpY2VcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBmaW5kIGFjY2VsZXJhdGlvbiBkZXZpY2VcbiIpOwogCQlyZXR1cm4gUENJX0VSU19SRVNVTFRfRElTQ09OTkVDVDsKIAl9CiAKIAlpZiAoc3RhdGUgPT0gcGNpX2NoYW5uZWxfaW9fcGVybV9mYWlsdXJlKSB7Ci0JCXByX2VycigiUUFUOiBDYW4ndCByZWNvdmVyIGZyb20gZGV2aWNlIGVycm9yXG4iKTsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgcmVjb3ZlciBmcm9tIGRldmljZSBlcnJvclxuIik7CiAJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ESVNDT05ORUNUOwogCX0KIApAQCAtODgsMTAgKzg4LDEyIEBACiAJc3RydWN0IHBjaV9kZXYgKnBhcmVudCA9IHBkZXYtPmJ1cy0+c2VsZjsKIAl1aW50MTZfdCBicmlkZ2VfY3RsID0gMDsKIAotCXByX2luZm8oIlFBVDogUmVzZXR0aW5nIGRldmljZSBxYXRfZGV2JWRcbiIsIGFjY2VsX2Rldi0+YWNjZWxfaWQpOworCWRldl9pbmZvKCZHRVRfREVWKGFjY2VsX2RldiksICJSZXNldHRpbmcgZGV2aWNlIHFhdF9kZXYlZFxuIiwKKwkJIGFjY2VsX2Rldi0+YWNjZWxfaWQpOwogCiAJaWYgKCFwY2lfd2FpdF9mb3JfcGVuZGluZ190cmFuc2FjdGlvbihwZGV2KSkKLQkJcHJfaW5mbygiUUFUOiBUcmFuc2FjdGlvbiBzdGlsbCBpbiBwcm9ncmVzcy4gUHJvY2VlZGluZ1xuIik7CisJCWRldl9pbmZvKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkgIlRyYW5zYWN0aW9uIHN0aWxsIGluIHByb2dyZXNzLiBQcm9jZWVkaW5nXG4iKTsKIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBhcmVudCwgUENJX0JSSURHRV9DT05UUk9MLCAmYnJpZGdlX2N0bCk7CiAJYnJpZGdlX2N0bCB8PSBQQ0lfQlJJREdFX0NUTF9CVVNfUkVTRVQ7CkBAIC0xNTgsNyArMTYwLDggQEAKIAkJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAogCQkJCSAgICZyZXNldF9kYXRhLT5jb21wbCwgd2FpdF9qaWZmaWVzKTsKIAkJaWYgKCF0aW1lb3V0KSB7Ci0JCQlwcl9lcnIoIlFBVDogUmVzZXQgZGV2aWNlIHRpbWVvdXQgZXhwaXJlZFxuIik7CisJCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkJIlJlc2V0IGRldmljZSB0aW1lb3V0IGV4cGlyZWRcbiIpOwogCQkJcmV0ID0gLUVGQVVMVDsKIAkJfQogCQlrZnJlZShyZXNldF9kYXRhKTsKQEAgLTE4NCw4ICsxODcsOCBAQAogCiBzdGF0aWMgdm9pZCBhZGZfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXByX2luZm8oIlFBVDogQWNjZWxlcmF0aW9uIGRyaXZlciByZXNldCBjb21wbGV0ZWRcbiIpOwotCXByX2luZm8oIlFBVDogRGV2aWNlIGlzIHVwIGFuZCBydW5uaWdcbiIpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJBY2NlbGVyYXRpb24gZHJpdmVyIHJlc2V0IGNvbXBsZXRlZFxuIik7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkRldmljZSBpcyB1cCBhbmQgcnVubmlnXG4iKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwY2lfZXJyb3JfaGFuZGxlcnMgYWRmX2Vycl9oYW5kbGVyID0gewpAQCAtMjM2LDcgKzIzOSw3IEBACiBpbnQgYWRmX2luaXRfYWVyKHZvaWQpCiB7CiAJZGV2aWNlX3Jlc2V0X3dxID0gY3JlYXRlX3dvcmtxdWV1ZSgicWF0X2RldmljZV9yZXNldF93cSIpOwotCXJldHVybiAoZGV2aWNlX3Jlc2V0X3dxID09IE5VTEwpID8gLUVGQVVMVCA6IDA7CisJcmV0dXJuICFkZXZpY2VfcmVzZXRfd3EgPyAtRUZBVUxUIDogMDsKIH0KIAogdm9pZCBhZGZfZXhpdF9hZXIodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9jZmcuYyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9jZmcuYwppbmRleCBkZTE2ZGE5Li5hYjY1YmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9hZGZfY2ZnLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX2NmZy5jCkBAIC0xNDIsNyArMTQyLDggQEAKIAkJCQkJCSAgZGV2X2NmZ19kYXRhLAogCQkJCQkJICAmcWF0X2Rldl9jZmdfZm9wcyk7CiAJaWYgKCFkZXZfY2ZnX2RhdGEtPmRlYnVnKSB7Ci0JCXByX2VycigiUUFUOiBGYWlsZWQgdG8gY3JlYXRlIHFhdCBjZmcgZGVidWdmcyBlbnRyeS5cbiIpOworCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkiRmFpbGVkIHRvIGNyZWF0ZSBxYXQgY2ZnIGRlYnVnZnMgZW50cnkuXG4iKTsKIAkJa2ZyZWUoZGV2X2NmZ19kYXRhKTsKIAkJYWNjZWxfZGV2LT5jZmcgPSBOVUxMOwogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTMwNSw3ICszMDYsNyBAQAogCQlzbnByaW50ZihrZXlfdmFsLT52YWwsIEFERl9DRkdfTUFYX1ZBTF9MRU5fSU5fQllURVMsCiAJCQkgIjB4JWx4IiwgKHVuc2lnbmVkIGxvbmcpdmFsKTsKIAl9IGVsc2UgewotCQlwcl9lcnIoIlFBVDogVW5rbm93biB0eXBlIGdpdmVuLlxuIik7CisJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwgIlVua25vd24gdHlwZSBnaXZlbi5cbiIpOwogCQlrZnJlZShrZXlfdmFsKTsKIAkJcmV0dXJuIC0xOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9jZmdfc3RyaW5ncy5oIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX2NmZ19zdHJpbmdzLmgKaW5kZXggYzdhYzc1OC4uMTM1NzUxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX2NmZ19zdHJpbmdzLmgKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX2NmZ19zdHJpbmdzLmgKQEAgLTU5LDcgKzU5LDcgQEAKICNkZWZpbmUgQURGX1JJTkdfU1lNX1RYICJSaW5nU3ltVHgiCiAjZGVmaW5lIEFERl9SSU5HX1JORF9UWCAiUmluZ05yYmdUeCIKICNkZWZpbmUgQURGX1JJTkdfQVNZTV9SWCAiUmluZ0FzeW1SeCIKLSNkZWZpbmUgQURGX1JJTkdfU1lNX1JYICJSaW5TeW1SeCIKKyNkZWZpbmUgQURGX1JJTkdfU1lNX1JYICJSaW5nU3ltUngiCiAjZGVmaW5lIEFERl9SSU5HX1JORF9SWCAiUmluZ05yYmdSeCIKICNkZWZpbmUgQURGX1JJTkdfRENfVFggIlJpbmdUeCIKICNkZWZpbmUgQURGX1JJTkdfRENfUlggIlJpbmdSeCIKQEAgLTY5LDE1ICs2OSwxNSBAQAogI2RlZmluZSBBREZfREMgIkRjIgogI2RlZmluZSBBREZfRVRSTUdSX0NPQUxFU0NJTkdfRU5BQkxFRCAiSW50ZXJydXB0Q29hbGVzY2luZ0VuYWJsZWQiCiAjZGVmaW5lIEFERl9FVFJNR1JfQ09BTEVTQ0lOR19FTkFCTEVEX0ZPUk1BVCBcCi0JQURGX0VUUk1HUl9CQU5LIiVkIkFERl9FVFJNR1JfQ09BTEVTQ0lOR19FTkFCTEVECisJQURGX0VUUk1HUl9CQU5LICIlZCIgQURGX0VUUk1HUl9DT0FMRVNDSU5HX0VOQUJMRUQKICNkZWZpbmUgQURGX0VUUk1HUl9DT0FMRVNDRV9USU1FUiAiSW50ZXJydXB0Q29hbGVzY2luZ1RpbWVyTnMiCiAjZGVmaW5lIEFERl9FVFJNR1JfQ09BTEVTQ0VfVElNRVJfRk9STUFUIFwKLQlBREZfRVRSTUdSX0JBTksiJWQiQURGX0VUUk1HUl9DT0FMRVNDRV9USU1FUgorCUFERl9FVFJNR1JfQkFOSyAiJWQiIEFERl9FVFJNR1JfQ09BTEVTQ0VfVElNRVIKICNkZWZpbmUgQURGX0VUUk1HUl9DT0FMRVNDSU5HX01TR19FTkFCTEVEICJJbnRlcnJ1cHRDb2FsZXNjaW5nTnVtUmVzcG9uc2VzIgogI2RlZmluZSBBREZfRVRSTUdSX0NPQUxFU0NJTkdfTVNHX0VOQUJMRURfRk9STUFUIFwKLQlBREZfRVRSTUdSX0JBTksiJWQiQURGX0VUUk1HUl9DT0FMRVNDSU5HX01TR19FTkFCTEVECisJQURGX0VUUk1HUl9CQU5LICIlZCIgQURGX0VUUk1HUl9DT0FMRVNDSU5HX01TR19FTkFCTEVECiAjZGVmaW5lIEFERl9FVFJNR1JfQ09SRV9BRkZJTklUWSAiQ29yZUFmZmluaXR5IgogI2RlZmluZSBBREZfRVRSTUdSX0NPUkVfQUZGSU5JVFlfRk9STUFUIFwKLQlBREZfRVRSTUdSX0JBTksiJWQiQURGX0VUUk1HUl9DT1JFX0FGRklOSVRZCisJQURGX0VUUk1HUl9CQU5LICIlZCIgQURGX0VUUk1HUl9DT1JFX0FGRklOSVRZCiAjZGVmaW5lIEFERl9BQ0NFTF9TVFIgIkFjY2VsZXJhdG9yJWQiCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9jb21tb25fZHJ2LmggYi9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9hZGZfY29tbW9uX2Rydi5oCmluZGV4IGE2MmU0ODUuLjA2NjZlZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9jb21tb25fZHJ2LmgKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX2NvbW1vbl9kcnYuaApAQCAtMTE1LDcgKzExNSw3IEBACiBpbnQgYWRmX2FlX2luaXQoc3RydWN0IGFkZl9hY2NlbF9kZXYgKmFjY2VsX2Rldik7CiBpbnQgYWRmX2FlX3NodXRkb3duKHN0cnVjdCBhZGZfYWNjZWxfZGV2ICphY2NlbF9kZXYpOwogaW50IGFkZl9hZV9md19sb2FkKHN0cnVjdCBhZGZfYWNjZWxfZGV2ICphY2NlbF9kZXYpOwotaW50IGFkZl9hZV9md19yZWxlYXNlKHN0cnVjdCBhZGZfYWNjZWxfZGV2ICphY2NlbF9kZXYpOwordm9pZCBhZGZfYWVfZndfcmVsZWFzZShzdHJ1Y3QgYWRmX2FjY2VsX2RldiAqYWNjZWxfZGV2KTsKIGludCBhZGZfYWVfc3RhcnQoc3RydWN0IGFkZl9hY2NlbF9kZXYgKmFjY2VsX2Rldik7CiBpbnQgYWRmX2FlX3N0b3Aoc3RydWN0IGFkZl9hY2NlbF9kZXYgKmFjY2VsX2Rldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9jdGxfZHJ2LmMgYi9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9hZGZfY3RsX2Rydi5jCmluZGV4IDc0MjA3YTYuLmNiNWYwNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9jdGxfZHJ2LmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX2N0bF9kcnYuYwpAQCAtNzcsMTQgKzc3LDE0IEBACiAJc3RydWN0IGNsYXNzICpkcnZfY2xhc3M7CiB9OwogCi1zdGF0aWMgc3RydWN0IGFkZl9jdGxfZHJ2X2luZm8gYWR0X2N0bF9kcnY7CitzdGF0aWMgc3RydWN0IGFkZl9jdGxfZHJ2X2luZm8gYWRmX2N0bF9kcnY7CiAKIHN0YXRpYyB2b2lkIGFkZl9jaHJfZHJ2X2Rlc3Ryb3kodm9pZCkKIHsKLQlkZXZpY2VfZGVzdHJveShhZHRfY3RsX2Rydi5kcnZfY2xhc3MsIE1LREVWKGFkdF9jdGxfZHJ2Lm1ham9yLCAwKSk7Ci0JY2Rldl9kZWwoJmFkdF9jdGxfZHJ2LmRydl9jZGV2KTsKLQljbGFzc19kZXN0cm95KGFkdF9jdGxfZHJ2LmRydl9jbGFzcyk7Ci0JdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKE1LREVWKGFkdF9jdGxfZHJ2Lm1ham9yLCAwKSwgMSk7CisJZGV2aWNlX2Rlc3Ryb3koYWRmX2N0bF9kcnYuZHJ2X2NsYXNzLCBNS0RFVihhZGZfY3RsX2Rydi5tYWpvciwgMCkpOworCWNkZXZfZGVsKCZhZGZfY3RsX2Rydi5kcnZfY2Rldik7CisJY2xhc3NfZGVzdHJveShhZGZfY3RsX2Rydi5kcnZfY2xhc3MpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihhZGZfY3RsX2Rydi5tYWpvciwgMCksIDEpOwogfQogCiBzdGF0aWMgaW50IGFkZl9jaHJfZHJ2X2NyZWF0ZSh2b2lkKQpAQCAtOTcsMjAgKzk3LDIwIEBACiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAotCWFkdF9jdGxfZHJ2LmRydl9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgREVWSUNFX05BTUUpOwotCWlmIChJU19FUlIoYWR0X2N0bF9kcnYuZHJ2X2NsYXNzKSkgeworCWFkZl9jdGxfZHJ2LmRydl9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgREVWSUNFX05BTUUpOworCWlmIChJU19FUlIoYWRmX2N0bF9kcnYuZHJ2X2NsYXNzKSkgewogCQlwcl9lcnIoIlFBVDogY2xhc3NfY3JlYXRlIGZhaWxlZCBmb3IgYWRmX2N0bFxuIik7CiAJCWdvdG8gZXJyX2NocmRldl91bnJlZzsKIAl9Ci0JYWR0X2N0bF9kcnYubWFqb3IgPSBNQUpPUihkZXZfaWQpOwotCWNkZXZfaW5pdCgmYWR0X2N0bF9kcnYuZHJ2X2NkZXYsICZhZGZfY3RsX29wcyk7Ci0JaWYgKGNkZXZfYWRkKCZhZHRfY3RsX2Rydi5kcnZfY2RldiwgZGV2X2lkLCAxKSkgeworCWFkZl9jdGxfZHJ2Lm1ham9yID0gTUFKT1IoZGV2X2lkKTsKKwljZGV2X2luaXQoJmFkZl9jdGxfZHJ2LmRydl9jZGV2LCAmYWRmX2N0bF9vcHMpOworCWlmIChjZGV2X2FkZCgmYWRmX2N0bF9kcnYuZHJ2X2NkZXYsIGRldl9pZCwgMSkpIHsKIAkJcHJfZXJyKCJRQVQ6IGNkZXYgYWRkIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2NsYXNzX2Rlc3RyOwogCX0KIAotCWRydl9kZXZpY2UgPSBkZXZpY2VfY3JlYXRlKGFkdF9jdGxfZHJ2LmRydl9jbGFzcywgTlVMTCwKLQkJCQkgICBNS0RFVihhZHRfY3RsX2Rydi5tYWpvciwgMCksCisJZHJ2X2RldmljZSA9IGRldmljZV9jcmVhdGUoYWRmX2N0bF9kcnYuZHJ2X2NsYXNzLCBOVUxMLAorCQkJCSAgIE1LREVWKGFkZl9jdGxfZHJ2Lm1ham9yLCAwKSwKIAkJCQkgICBOVUxMLCBERVZJQ0VfTkFNRSk7CiAJaWYgKElTX0VSUihkcnZfZGV2aWNlKSkgewogCQlwcl9lcnIoIlFBVDogZmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2VcbiIpOwpAQCAtMTE4LDkgKzExOCw5IEBACiAJfQogCXJldHVybiAwOwogZXJyX2NkZXZfZGVsOgotCWNkZXZfZGVsKCZhZHRfY3RsX2Rydi5kcnZfY2Rldik7CisJY2Rldl9kZWwoJmFkZl9jdGxfZHJ2LmRydl9jZGV2KTsKIGVycl9jbGFzc19kZXN0cjoKLQljbGFzc19kZXN0cm95KGFkdF9jdGxfZHJ2LmRydl9jbGFzcyk7CisJY2xhc3NfZGVzdHJveShhZGZfY3RsX2Rydi5kcnZfY2xhc3MpOwogZXJyX2NocmRldl91bnJlZzoKIAl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2X2lkLCAxKTsKIAlyZXR1cm4gLUVGQVVMVDsKQEAgLTE1OSwxNCArMTU5LDE2IEBACiAJCWlmIChhZGZfY2ZnX2FkZF9rZXlfdmFsdWVfcGFyYW0oYWNjZWxfZGV2LCBzZWN0aW9uLAogCQkJCQkJa2V5X3ZhbC0+a2V5LCAodm9pZCAqKXZhbCwKIAkJCQkJCWtleV92YWwtPnR5cGUpKSB7Ci0JCQlwcl9lcnIoIlFBVDogZmFpbGVkIHRvIGFkZCBrZXl2YWx1ZS5cbiIpOworCQkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJCSJmYWlsZWQgdG8gYWRkIGhleCBrZXl2YWx1ZS5cbiIpOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoYWRmX2NmZ19hZGRfa2V5X3ZhbHVlX3BhcmFtKGFjY2VsX2Rldiwgc2VjdGlvbiwKIAkJCQkJCWtleV92YWwtPmtleSwga2V5X3ZhbC0+dmFsLAogCQkJCQkJa2V5X3ZhbC0+dHlwZSkpIHsKLQkJCXByX2VycigiUUFUOiBmYWlsZWQgdG8gYWRkIGtleXZhbHVlLlxuIik7CisJCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkJImZhaWxlZCB0byBhZGQga2V5dmFsdWUuXG4iKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAJfQpAQCAtMTg1LDEyICsxODcsMTQgQEAKIAl3aGlsZSAoc2VjdGlvbl9oZWFkKSB7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmc2VjdGlvbiwgKHZvaWQgX191c2VyICopc2VjdGlvbl9oZWFkLAogCQkJCSAgIHNpemVvZigqc2VjdGlvbl9oZWFkKSkpIHsKLQkJCXByX2VycigiUUFUOiBmYWlsZWQgdG8gY29weSBzZWN0aW9uIGluZm9cbiIpOworCQkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJCSJmYWlsZWQgdG8gY29weSBzZWN0aW9uIGluZm9cbiIpOwogCQkJZ290byBvdXRfZXJyOwogCQl9CiAKIAkJaWYgKGFkZl9jZmdfc2VjdGlvbl9hZGQoYWNjZWxfZGV2LCBzZWN0aW9uLm5hbWUpKSB7Ci0JCQlwcl9lcnIoIlFBVDogZmFpbGVkIHRvIGFkZCBzZWN0aW9uLlxuIik7CisJCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkJImZhaWxlZCB0byBhZGQgc2VjdGlvbi5cbiIpOwogCQkJZ290byBvdXRfZXJyOwogCQl9CiAKQEAgLTE5OSw3ICsyMDMsOCBAQAogCQl3aGlsZSAocGFyYW1zX2hlYWQpIHsKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigma2V5X3ZhbCwgKHZvaWQgX191c2VyICopcGFyYW1zX2hlYWQsCiAJCQkJCSAgIHNpemVvZihrZXlfdmFsKSkpIHsKLQkJCQlwcl9lcnIoIlFBVDogRmFpbGVkIHRvIGNvcHkga2V5dmFsdWUuXG4iKTsKKwkJCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkJCSJGYWlsZWQgdG8gY29weSBrZXl2YWx1ZS5cbiIpOwogCQkJCWdvdG8gb3V0X2VycjsKIAkJCX0KIAkJCWlmIChhZGZfYWRkX2tleV92YWx1ZV9kYXRhKGFjY2VsX2Rldiwgc2VjdGlvbi5uYW1lLApAQCAtMjU4LDggKzI2Myw5IEBACiAKIAkJaWYgKGlkID09IGRldi0+YWNjZWxfaWQgfHwgaWQgPT0gQURGX0NGR19BTExfREVWSUNFUykgewogCQkJaWYgKGFkZl9kZXZtZ3JfaW5fcmVzZXQoZGV2KSB8fCBhZGZfZGV2X2luX3VzZShkZXYpKSB7Ci0JCQkJcHJfaW5mbygiUUFUOiBkZXZpY2UgcWF0X2RldiVkIGlzIGJ1c3lcbiIsCi0JCQkJCWRldi0+YWNjZWxfaWQpOworCQkJCWRldl9pbmZvKCZHRVRfREVWKGRldiksCisJCQkJCSAiZGV2aWNlIHFhdF9kZXYlZCBpcyBidXN5XG4iLAorCQkJCQkgZGV2LT5hY2NlbF9pZCk7CiAJCQkJcmV0dXJuIC1FQlVTWTsKIAkJCX0KIAkJfQpAQCAtMjgwLDcgKzI4Niw4IEBACiAJCQkJY29udGludWU7CiAKIAkJCWlmIChhZGZfZGV2X3N0b3AoYWNjZWxfZGV2KSkgewotCQkJCXByX2VycigiUUFUOiBGYWlsZWQgdG8gc3RvcCBxYXRfZGV2JWRcbiIsIGlkKTsKKwkJCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkJCSJGYWlsZWQgdG8gc3RvcCBxYXRfZGV2JWRcbiIsIGlkKTsKIAkJCQlyZXQgPSAtRUZBVUxUOwogCQkJfSBlbHNlIHsKIAkJCQlhZGZfZGV2X3NodXRkb3duKGFjY2VsX2Rldik7CkBAIC0zNDMsMTcgKzM1MCwyMCBAQAogCX0KIAogCWlmICghYWRmX2Rldl9zdGFydGVkKGFjY2VsX2RldikpIHsKLQkJcHJfaW5mbygiUUFUOiBTdGFydGluZyBhY2NlbGVyYXRpb24gZGV2aWNlIHFhdF9kZXYlZC5cbiIsCi0JCQljdGxfZGF0YS0+ZGV2aWNlX2lkKTsKKwkJZGV2X2luZm8oJkdFVF9ERVYoYWNjZWxfZGV2KSwKKwkJCSAiU3RhcnRpbmcgYWNjZWxlcmF0aW9uIGRldmljZSBxYXRfZGV2JWQuXG4iLAorCQkJIGN0bF9kYXRhLT5kZXZpY2VfaWQpOwogCQlyZXQgPSBhZGZfZGV2X2luaXQoYWNjZWxfZGV2KTsKIAkJaWYgKCFyZXQpCiAJCQlyZXQgPSBhZGZfZGV2X3N0YXJ0KGFjY2VsX2Rldik7CiAJfSBlbHNlIHsKLQkJcHJfaW5mbygiUUFUOiBBY2NlbGVyYXRpb24gZGV2aWNlIHFhdF9kZXYlZCBhbHJlYWR5IHN0YXJ0ZWQuXG4iLAotCQkJY3RsX2RhdGEtPmRldmljZV9pZCk7CisJCWRldl9pbmZvKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkgIkFjY2VsZXJhdGlvbiBkZXZpY2UgcWF0X2RldiVkIGFscmVhZHkgc3RhcnRlZC5cbiIsCisJCQkgY3RsX2RhdGEtPmRldmljZV9pZCk7CiAJfQogCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJRQVQ6IEZhaWxlZCB0byBzdGFydCBxYXRfZGV2JWRcbiIsIGN0bF9kYXRhLT5kZXZpY2VfaWQpOworCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksICJGYWlsZWQgdG8gc3RhcnQgcWF0X2RldiVkXG4iLAorCQkJY3RsX2RhdGEtPmRldmljZV9pZCk7CiAJCWFkZl9kZXZfc3RvcChhY2NlbF9kZXYpOwogCQlhZGZfZGV2X3NodXRkb3duKGFjY2VsX2Rldik7CiAJfQpAQCAtNDA4LDcgKzQxOCw3IEBACiAKIAlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmRldl9pbmZvLAogCQkJIHNpemVvZihzdHJ1Y3QgYWRmX2Rldl9zdGF0dXNfaW5mbykpKSB7Ci0JCXByX2VycigiUUFUOiBmYWlsZWQgdG8gY29weSBzdGF0dXMuXG4iKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLCAiZmFpbGVkIHRvIGNvcHkgc3RhdHVzLlxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9kZXZfbWdyLmMgYi9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9hZGZfZGV2X21nci5jCmluZGV4IDRhMGE4MjlkLi4zZjBmZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9hZGZfZGV2X21nci5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9kZXZfbWdyLmMKQEAgLTY3LDcgKzY3LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdHI7CiAKIAlpZiAobnVtX2RldmljZXMgPT0gQURGX01BWF9ERVZJQ0VTKSB7Ci0JCXByX2VycigiUUFUOiBPbmx5IHN1cHBvcnQgdXAgdG8gJWQgZGV2aWNlc1xuIiwgQURGX01BWF9ERVZJQ0VTKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLCAiT25seSBzdXBwb3J0IHVwIHRvICVkIGRldmljZXNcbiIsCisJCQlBREZfTUFYX0RFVklDRVMpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9pbml0LmMgYi9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9hZGZfaW5pdC5jCmluZGV4IDhmMGNhNDkuLjI0NWY0MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl9pbml0LmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX2luaXQuYwpAQCAtMTI0LDEyICsxMjQsMTIgQEAKIAogCWlmICghaHdfZGF0YSkgewogCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCi0JCQkiUUFUOiBGYWlsZWQgdG8gaW5pdCBkZXZpY2UgLSBod19kYXRhIG5vdCBzZXRcbiIpOworCQkJIkZhaWxlZCB0byBpbml0IGRldmljZSAtIGh3X2RhdGEgbm90IHNldFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAogCWlmICghdGVzdF9iaXQoQURGX1NUQVRVU19DT05GSUdVUkVELCAmYWNjZWxfZGV2LT5zdGF0dXMpKSB7Ci0JCXByX2luZm8oIlFBVDogRGV2aWNlIG5vdCBjb25maWd1cmVkXG4iKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLCAiRGV2aWNlIG5vdCBjb25maWd1cmVkXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCkBAIC0xNTEsMjAgKzE1MSwyMSBAQAogCWh3X2RhdGEtPmVuYWJsZV9pbnRzKGFjY2VsX2Rldik7CiAKIAlpZiAoYWRmX2FlX2luaXQoYWNjZWxfZGV2KSkgewotCQlwcl9lcnIoIlFBVDogRmFpbGVkIHRvIGluaXRpYWxpc2UgQWNjZWxlcmF0aW9uIEVuZ2luZVxuIik7CisJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwKKwkJCSJGYWlsZWQgdG8gaW5pdGlhbGlzZSBBY2NlbGVyYXRpb24gRW5naW5lXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCXNldF9iaXQoQURGX1NUQVRVU19BRV9JTklUSUFMSVNFRCwgJmFjY2VsX2Rldi0+c3RhdHVzKTsKIAogCWlmIChhZGZfYWVfZndfbG9hZChhY2NlbF9kZXYpKSB7Ci0JCXByX2VycigiUUFUOiBGYWlsZWQgdG8gbG9hZCBhY2NlbGVyYXRpb24gRldcbiIpOwotCQlhZGZfYWVfZndfcmVsZWFzZShhY2NlbF9kZXYpOworCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkiRmFpbGVkIHRvIGxvYWQgYWNjZWxlcmF0aW9uIEZXXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCXNldF9iaXQoQURGX1NUQVRVU19BRV9VQ09ERV9MT0FERUQsICZhY2NlbF9kZXYtPnN0YXR1cyk7CiAKIAlpZiAoaHdfZGF0YS0+YWxsb2NfaXJxKGFjY2VsX2RldikpIHsKLQkJcHJfZXJyKCJRQVQ6IEZhaWxlZCB0byBhbGxvY2F0ZSBpbnRlcnJ1cHRzXG4iKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGludGVycnVwdHNcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJc2V0X2JpdChBREZfU1RBVFVTX0lSUV9BTExPQ0FURUQsICZhY2NlbF9kZXYtPnN0YXR1cyk7CkBAIC0xNzksOCArMTgwLDkgQEAKIAkJaWYgKCFzZXJ2aWNlLT5hZG1pbikKIAkJCWNvbnRpbnVlOwogCQlpZiAoc2VydmljZS0+ZXZlbnRfaGxkKGFjY2VsX2RldiwgQURGX0VWRU5UX0lOSVQpKSB7Ci0JCQlwcl9lcnIoIlFBVDogRmFpbGVkIHRvIGluaXRpYWxpc2Ugc2VydmljZSAlc1xuIiwKLQkJCSAgICAgICBzZXJ2aWNlLT5uYW1lKTsKKwkJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwKKwkJCQkiRmFpbGVkIHRvIGluaXRpYWxpc2Ugc2VydmljZSAlc1xuIiwKKwkJCQlzZXJ2aWNlLT5uYW1lKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAJCXNldF9iaXQoYWNjZWxfZGV2LT5hY2NlbF9pZCwgJnNlcnZpY2UtPmluaXRfc3RhdHVzKTsKQEAgLTE5MCw4ICsxOTIsOSBAQAogCQlpZiAoc2VydmljZS0+YWRtaW4pCiAJCQljb250aW51ZTsKIAkJaWYgKHNlcnZpY2UtPmV2ZW50X2hsZChhY2NlbF9kZXYsIEFERl9FVkVOVF9JTklUKSkgewotCQkJcHJfZXJyKCJRQVQ6IEZhaWxlZCB0byBpbml0aWFsaXNlIHNlcnZpY2UgJXNcbiIsCi0JCQkgICAgICAgc2VydmljZS0+bmFtZSk7CisJCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkJIkZhaWxlZCB0byBpbml0aWFsaXNlIHNlcnZpY2UgJXNcbiIsCisJCQkJc2VydmljZS0+bmFtZSk7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQlzZXRfYml0KGFjY2VsX2Rldi0+YWNjZWxfaWQsICZzZXJ2aWNlLT5pbml0X3N0YXR1cyk7CkBAIC0yMjEsNyArMjI0LDcgQEAKIAlzZXRfYml0KEFERl9TVEFUVVNfU1RBUlRJTkcsICZhY2NlbF9kZXYtPnN0YXR1cyk7CiAKIAlpZiAoYWRmX2FlX3N0YXJ0KGFjY2VsX2RldikpIHsKLQkJcHJfZXJyKCJRQVQ6IEFFIFN0YXJ0IEZhaWxlZFxuIik7CisJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwgIkFFIFN0YXJ0IEZhaWxlZFxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlzZXRfYml0KEFERl9TVEFUVVNfQUVfU1RBUlRFRCwgJmFjY2VsX2Rldi0+c3RhdHVzKTsKQEAgLTIzMSw4ICsyMzQsOSBAQAogCQlpZiAoIXNlcnZpY2UtPmFkbWluKQogCQkJY29udGludWU7CiAJCWlmIChzZXJ2aWNlLT5ldmVudF9obGQoYWNjZWxfZGV2LCBBREZfRVZFTlRfU1RBUlQpKSB7Ci0JCQlwcl9lcnIoIlFBVDogRmFpbGVkIHRvIHN0YXJ0IHNlcnZpY2UgJXNcbiIsCi0JCQkgICAgICAgc2VydmljZS0+bmFtZSk7CisJCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkJIkZhaWxlZCB0byBzdGFydCBzZXJ2aWNlICVzXG4iLAorCQkJCXNlcnZpY2UtPm5hbWUpOwogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCX0KIAkJc2V0X2JpdChhY2NlbF9kZXYtPmFjY2VsX2lkLCAmc2VydmljZS0+c3RhcnRfc3RhdHVzKTsKQEAgLTI0Miw4ICsyNDYsOSBAQAogCQlpZiAoc2VydmljZS0+YWRtaW4pCiAJCQljb250aW51ZTsKIAkJaWYgKHNlcnZpY2UtPmV2ZW50X2hsZChhY2NlbF9kZXYsIEFERl9FVkVOVF9TVEFSVCkpIHsKLQkJCXByX2VycigiUUFUOiBGYWlsZWQgdG8gc3RhcnQgc2VydmljZSAlc1xuIiwKLQkJCSAgICAgICBzZXJ2aWNlLT5uYW1lKTsKKwkJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwKKwkJCQkiRmFpbGVkIHRvIHN0YXJ0IHNlcnZpY2UgJXNcbiIsCisJCQkJc2VydmljZS0+bmFtZSk7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQogCQlzZXRfYml0KGFjY2VsX2Rldi0+YWNjZWxfaWQsICZzZXJ2aWNlLT5zdGFydF9zdGF0dXMpOwpAQCAtMjUzLDcgKzI1OCw4IEBACiAJc2V0X2JpdChBREZfU1RBVFVTX1NUQVJURUQsICZhY2NlbF9kZXYtPnN0YXR1cyk7CiAKIAlpZiAocWF0X2FsZ3NfcmVnaXN0ZXIoKSkgewotCQlwcl9lcnIoIlFBVDogRmFpbGVkIHRvIHJlZ2lzdGVyIGNyeXB0byBhbGdzXG4iKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJIkZhaWxlZCB0byByZWdpc3RlciBjcnlwdG8gYWxnc1xuIik7CiAJCXNldF9iaXQoQURGX1NUQVRVU19TVEFSVElORywgJmFjY2VsX2Rldi0+c3RhdHVzKTsKIAkJY2xlYXJfYml0KEFERl9TVEFUVVNfU1RBUlRFRCwgJmFjY2VsX2Rldi0+c3RhdHVzKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0yODcsNyArMjkzLDggQEAKIAljbGVhcl9iaXQoQURGX1NUQVRVU19TVEFSVEVELCAmYWNjZWxfZGV2LT5zdGF0dXMpOwogCiAJaWYgKHFhdF9hbGdzX3VucmVnaXN0ZXIoKSkKLQkJcHJfZXJyKCJRQVQ6IEZhaWxlZCB0byB1bnJlZ2lzdGVyIGNyeXB0byBhbGdzXG4iKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJIkZhaWxlZCB0byB1bnJlZ2lzdGVyIGNyeXB0byBhbGdzXG4iKTsKIAogCWxpc3RfZm9yX2VhY2gobGlzdF9pdHIsICZzZXJ2aWNlX3RhYmxlKSB7CiAJCXNlcnZpY2UgPSBsaXN0X2VudHJ5KGxpc3RfaXRyLCBzdHJ1Y3Qgc2VydmljZV9obmRsLCBsaXN0KTsKQEAgLTMxMCw4ICszMTcsOSBAQAogCQlpZiAoIXRlc3RfYml0KGFjY2VsX2Rldi0+YWNjZWxfaWQsICZzZXJ2aWNlLT5zdGFydF9zdGF0dXMpKQogCQkJY29udGludWU7CiAJCWlmIChzZXJ2aWNlLT5ldmVudF9obGQoYWNjZWxfZGV2LCBBREZfRVZFTlRfU1RPUCkpCi0JCQlwcl9lcnIoIlFBVDogRmFpbGVkIHRvIHNodXRkb3duIHNlcnZpY2UgJXNcbiIsCi0JCQkgICAgICAgc2VydmljZS0+bmFtZSk7CisJCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkJIkZhaWxlZCB0byBzaHV0ZG93biBzZXJ2aWNlICVzXG4iLAorCQkJCXNlcnZpY2UtPm5hbWUpOwogCQllbHNlCiAJCQljbGVhcl9iaXQoYWNjZWxfZGV2LT5hY2NlbF9pZCwgJnNlcnZpY2UtPnN0YXJ0X3N0YXR1cyk7CiAJfQpAQCAtMzIxLDcgKzMyOSw3IEBACiAKIAlpZiAodGVzdF9iaXQoQURGX1NUQVRVU19BRV9TVEFSVEVELCAmYWNjZWxfZGV2LT5zdGF0dXMpKSB7CiAJCWlmIChhZGZfYWVfc3RvcChhY2NlbF9kZXYpKQotCQkJcHJfZXJyKCJRQVQ6IGZhaWxlZCB0byBzdG9wIEFFXG4iKTsKKwkJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwgImZhaWxlZCB0byBzdG9wIEFFXG4iKTsKIAkJZWxzZQogCQkJY2xlYXJfYml0KEFERl9TVEFUVVNfQUVfU1RBUlRFRCwgJmFjY2VsX2Rldi0+c3RhdHVzKTsKIAl9CkBAIC0zNTAsMTYgKzM1OCwxNCBAQAogCX0KIAogCWlmICh0ZXN0X2JpdChBREZfU1RBVFVTX0FFX1VDT0RFX0xPQURFRCwgJmFjY2VsX2Rldi0+c3RhdHVzKSkgewotCQlpZiAoYWRmX2FlX2Z3X3JlbGVhc2UoYWNjZWxfZGV2KSkKLQkJCXByX2VycigiUUFUOiBGYWlsZWQgdG8gcmVsZWFzZSB0aGUgdWNvZGVcbiIpOwotCQllbHNlCi0JCQljbGVhcl9iaXQoQURGX1NUQVRVU19BRV9VQ09ERV9MT0FERUQsCi0JCQkJICAmYWNjZWxfZGV2LT5zdGF0dXMpOworCQlhZGZfYWVfZndfcmVsZWFzZShhY2NlbF9kZXYpOworCQljbGVhcl9iaXQoQURGX1NUQVRVU19BRV9VQ09ERV9MT0FERUQsICZhY2NlbF9kZXYtPnN0YXR1cyk7CiAJfQogCiAJaWYgKHRlc3RfYml0KEFERl9TVEFUVVNfQUVfSU5JVElBTElTRUQsICZhY2NlbF9kZXYtPnN0YXR1cykpIHsKIAkJaWYgKGFkZl9hZV9zaHV0ZG93bihhY2NlbF9kZXYpKQotCQkJcHJfZXJyKCJRQVQ6IEZhaWxlZCB0byBzaHV0ZG93biBBY2NlbCBFbmdpbmVcbiIpOworCQkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJCSJGYWlsZWQgdG8gc2h1dGRvd24gQWNjZWwgRW5naW5lXG4iKTsKIAkJZWxzZQogCQkJY2xlYXJfYml0KEFERl9TVEFUVVNfQUVfSU5JVElBTElTRUQsCiAJCQkJICAmYWNjZWxfZGV2LT5zdGF0dXMpOwpAQCAtMzcyLDggKzM3OCw5IEBACiAJCWlmICghdGVzdF9iaXQoYWNjZWxfZGV2LT5hY2NlbF9pZCwgJnNlcnZpY2UtPmluaXRfc3RhdHVzKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoc2VydmljZS0+ZXZlbnRfaGxkKGFjY2VsX2RldiwgQURGX0VWRU5UX1NIVVRET1dOKSkKLQkJCXByX2VycigiUUFUOiBGYWlsZWQgdG8gc2h1dGRvd24gc2VydmljZSAlc1xuIiwKLQkJCSAgICAgICBzZXJ2aWNlLT5uYW1lKTsKKwkJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwKKwkJCQkiRmFpbGVkIHRvIHNodXRkb3duIHNlcnZpY2UgJXNcbiIsCisJCQkJc2VydmljZS0+bmFtZSk7CiAJCWVsc2UKIAkJCWNsZWFyX2JpdChhY2NlbF9kZXYtPmFjY2VsX2lkLCAmc2VydmljZS0+aW5pdF9zdGF0dXMpOwogCX0KQEAgLTM4NCw4ICszOTEsOSBAQAogCQlpZiAoIXRlc3RfYml0KGFjY2VsX2Rldi0+YWNjZWxfaWQsICZzZXJ2aWNlLT5pbml0X3N0YXR1cykpCiAJCQljb250aW51ZTsKIAkJaWYgKHNlcnZpY2UtPmV2ZW50X2hsZChhY2NlbF9kZXYsIEFERl9FVkVOVF9TSFVURE9XTikpCi0JCQlwcl9lcnIoIlFBVDogRmFpbGVkIHRvIHNodXRkb3duIHNlcnZpY2UgJXNcbiIsCi0JCQkgICAgICAgc2VydmljZS0+bmFtZSk7CisJCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkJIkZhaWxlZCB0byBzaHV0ZG93biBzZXJ2aWNlICVzXG4iLAorCQkJCXNlcnZpY2UtPm5hbWUpOwogCQllbHNlCiAJCQljbGVhcl9iaXQoYWNjZWxfZGV2LT5hY2NlbF9pZCwgJnNlcnZpY2UtPmluaXRfc3RhdHVzKTsKIAl9CkBAIC00MTksMTYgKzQyNywxOCBAQAogCQlpZiAoc2VydmljZS0+YWRtaW4pCiAJCQljb250aW51ZTsKIAkJaWYgKHNlcnZpY2UtPmV2ZW50X2hsZChhY2NlbF9kZXYsIEFERl9FVkVOVF9SRVNUQVJUSU5HKSkKLQkJCXByX2VycigiUUFUOiBGYWlsZWQgdG8gcmVzdGFydCBzZXJ2aWNlICVzLlxuIiwKLQkJCSAgICAgICBzZXJ2aWNlLT5uYW1lKTsKKwkJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwKKwkJCQkiRmFpbGVkIHRvIHJlc3RhcnQgc2VydmljZSAlcy5cbiIsCisJCQkJc2VydmljZS0+bmFtZSk7CiAJfQogCWxpc3RfZm9yX2VhY2gobGlzdF9pdHIsICZzZXJ2aWNlX3RhYmxlKSB7CiAJCXNlcnZpY2UgPSBsaXN0X2VudHJ5KGxpc3RfaXRyLCBzdHJ1Y3Qgc2VydmljZV9obmRsLCBsaXN0KTsKIAkJaWYgKCFzZXJ2aWNlLT5hZG1pbikKIAkJCWNvbnRpbnVlOwogCQlpZiAoc2VydmljZS0+ZXZlbnRfaGxkKGFjY2VsX2RldiwgQURGX0VWRU5UX1JFU1RBUlRJTkcpKQotCQkJcHJfZXJyKCJRQVQ6IEZhaWxlZCB0byByZXN0YXJ0IHNlcnZpY2UgJXMuXG4iLAotCQkJICAgICAgIHNlcnZpY2UtPm5hbWUpOworCQkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJCSJGYWlsZWQgdG8gcmVzdGFydCBzZXJ2aWNlICVzLlxuIiwKKwkJCQlzZXJ2aWNlLT5uYW1lKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00NDMsMTYgKzQ1MywxOCBAQAogCQlpZiAoc2VydmljZS0+YWRtaW4pCiAJCQljb250aW51ZTsKIAkJaWYgKHNlcnZpY2UtPmV2ZW50X2hsZChhY2NlbF9kZXYsIEFERl9FVkVOVF9SRVNUQVJURUQpKQotCQkJcHJfZXJyKCJRQVQ6IEZhaWxlZCB0byByZXN0YXJ0IHNlcnZpY2UgJXMuXG4iLAotCQkJICAgICAgIHNlcnZpY2UtPm5hbWUpOworCQkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJCSJGYWlsZWQgdG8gcmVzdGFydCBzZXJ2aWNlICVzLlxuIiwKKwkJCQlzZXJ2aWNlLT5uYW1lKTsKIAl9CiAJbGlzdF9mb3JfZWFjaChsaXN0X2l0ciwgJnNlcnZpY2VfdGFibGUpIHsKIAkJc2VydmljZSA9IGxpc3RfZW50cnkobGlzdF9pdHIsIHN0cnVjdCBzZXJ2aWNlX2huZGwsIGxpc3QpOwogCQlpZiAoIXNlcnZpY2UtPmFkbWluKQogCQkJY29udGludWU7CiAJCWlmIChzZXJ2aWNlLT5ldmVudF9obGQoYWNjZWxfZGV2LCBBREZfRVZFTlRfUkVTVEFSVEVEKSkKLQkJCXByX2VycigiUUFUOiBGYWlsZWQgdG8gcmVzdGFydCBzZXJ2aWNlICVzLlxuIiwKLQkJCSAgICAgICBzZXJ2aWNlLT5uYW1lKTsKKwkJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwKKwkJCQkiRmFpbGVkIHRvIHJlc3RhcnQgc2VydmljZSAlcy5cbiIsCisJCQkJc2VydmljZS0+bmFtZSk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX3RyYW5zcG9ydC5jIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX3RyYW5zcG9ydC5jCmluZGV4IDdkZDU0YWEuLmNjZWMzMjc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9hZGZfdHJhbnNwb3J0LmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX3RyYW5zcG9ydC5jCkBAIC0xOTUsNyArMTk1LDcgQEAKIAltZW1zZXQocmluZy0+YmFzZV9hZGRyLCAweDdGLCByaW5nX3NpemVfYnl0ZXMpOwogCS8qIFRoZSBiYXNlX2FkZHIgaGFzIHRvIGJlIGFsaWduZWQgdG8gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAqLwogCWlmIChhZGZfY2hlY2tfcmluZ19hbGlnbm1lbnQocmluZy0+ZG1hX2FkZHIsIHJpbmdfc2l6ZV9ieXRlcykpIHsKLQkJcHJfZXJyKCJRQVQ6IFJpbmcgYWRkcmVzcyBub3QgYWxpZ25lZFxuIik7CisJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwgIlJpbmcgYWRkcmVzcyBub3QgYWxpZ25lZFxuIik7CiAJCWRtYV9mcmVlX2NvaGVyZW50KCZHRVRfREVWKGFjY2VsX2RldiksIHJpbmdfc2l6ZV9ieXRlcywKIAkJCQkgIHJpbmctPmJhc2VfYWRkciwgcmluZy0+ZG1hX2FkZHIpOwogCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTI0MiwzMiArMjQyLDMzIEBACiAJaW50IHJldDsKIAogCWlmIChiYW5rX251bSA+PSBHRVRfTUFYX0JBTktTKGFjY2VsX2RldikpIHsKLQkJcHJfZXJyKCJRQVQ6IEludmFsaWQgYmFuayBudW1iZXJcbiIpOworCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksICJJbnZhbGlkIGJhbmsgbnVtYmVyXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmIChtc2dfc2l6ZSA+IEFERl9NU0dfU0laRV9UT19CWVRFUyhBREZfTUFYX01TR19TSVpFKSkgewotCQlwcl9lcnIoIlFBVDogSW52YWxpZCBtc2cgc2l6ZVxuIik7CisJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwgIkludmFsaWQgbXNnIHNpemVcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKEFERl9NQVhfSU5GTElHSFRTKGFkZl92ZXJpZnlfcmluZ19zaXplKG1zZ19zaXplLCBudW1fbXNncyksCiAJCQkgICAgICBBREZfQllURVNfVE9fTVNHX1NJWkUobXNnX3NpemUpKSA8IDIpIHsKLQkJcHJfZXJyKCJRQVQ6IEludmFsaWQgcmluZyBzaXplIGZvciBnaXZlbiBtc2cgc2l6ZVxuIik7CisJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwKKwkJCSJJbnZhbGlkIHJpbmcgc2l6ZSBmb3IgZ2l2ZW4gbXNnIHNpemVcbiIpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKGFkZl9jZmdfZ2V0X3BhcmFtX3ZhbHVlKGFjY2VsX2Rldiwgc2VjdGlvbiwgcmluZ19uYW1lLCB2YWwpKSB7Ci0JCXByX2VycigiUUFUOiBTZWN0aW9uICVzLCBubyBzdWNoIGVudHJ5IDogJXNcbiIsCi0JCSAgICAgICBzZWN0aW9uLCByaW5nX25hbWUpOworCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksICJTZWN0aW9uICVzLCBubyBzdWNoIGVudHJ5IDogJXNcbiIsCisJCQlzZWN0aW9uLCByaW5nX25hbWUpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJaWYgKGtzdHJ0b3VpbnQodmFsLCAxMCwgJnJpbmdfbnVtKSkgewotCQlwcl9lcnIoIlFBVDogQ2FuJ3QgZ2V0IHJpbmcgbnVtYmVyXG4iKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLCAiQ2FuJ3QgZ2V0IHJpbmcgbnVtYmVyXG4iKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCiAJYmFuayA9ICZ0cmFuc3BvcnRfZGF0YS0+YmFua3NbYmFua19udW1dOwogCWlmIChhZGZfcmVzZXJ2ZV9yaW5nKGJhbmssIHJpbmdfbnVtKSkgewotCQlwcl9lcnIoIlFBVDogUmluZyAlZCwgJXMgYWxyZWFkeSBleGlzdHMuXG4iLAotCQkgICAgICAgcmluZ19udW0sIHJpbmdfbmFtZSk7CisJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwgIlJpbmcgJWQsICVzIGFscmVhZHkgZXhpc3RzLlxuIiwKKwkJCXJpbmdfbnVtLCByaW5nX25hbWUpOwogCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAJcmluZyA9ICZiYW5rLT5yaW5nc1tyaW5nX251bV07CkBAIC0yODcsNyArMjg4LDggQEAKIAlhY2NlbF9kZXYtPmh3X2RldmljZS0+aHdfYXJiX3JpbmdfZW5hYmxlKHJpbmcpOwogCiAJaWYgKGFkZl9yaW5nX2RlYnVnZnNfYWRkKHJpbmcsIHJpbmdfbmFtZSkpIHsKLQkJcHJfZXJyKCJRQVQ6IENvdWxkbid0IGFkZCByaW5nIGRlYnVnZnMgZW50cnlcbiIpOworCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkiQ291bGRuJ3QgYWRkIHJpbmcgZGVidWdmcyBlbnRyeVxuIik7CiAJCXJldCA9IC1FRkFVTFQ7CiAJCWdvdG8gZXJyOwogCX0KQEAgLTQyOCw3ICs0MzAsOCBAQAogCQkJCWdvdG8gZXJyOwogCQl9IGVsc2UgewogCQkJaWYgKGkgPCBod19kYXRhLT50eF9yeF9nYXApIHsKLQkJCQlwcl9lcnIoIlFBVDogSW52YWxpZCB0eCByaW5ncyBtYXNrIGNvbmZpZ1xuIik7CisJCQkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJCQkiSW52YWxpZCB0eCByaW5ncyBtYXNrIGNvbmZpZ1xuIik7CiAJCQkJZ290byBlcnI7CiAJCQl9CiAJCQl0eF9yaW5nID0gJmJhbmstPnJpbmdzW2kgLSBod19kYXRhLT50eF9yeF9nYXBdOwpAQCAtNDM2LDcgKzQzOSw4IEBACiAJCX0KIAl9CiAJaWYgKGFkZl9iYW5rX2RlYnVnZnNfYWRkKGJhbmspKSB7Ci0JCXByX2VycigiUUFUOiBGYWlsZWQgdG8gYWRkIGJhbmsgZGVidWdmcyBlbnRyeVxuIik7CisJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwKKwkJCSJGYWlsZWQgdG8gYWRkIGJhbmsgZGVidWdmcyBlbnRyeVxuIik7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtNDkyLDcgKzQ5Niw4IEBACiAJZXRyX2RhdGEtPmRlYnVnID0gZGVidWdmc19jcmVhdGVfZGlyKCJ0cmFuc3BvcnQiLAogCQkJCQkgICAgIGFjY2VsX2Rldi0+ZGVidWdmc19kaXIpOwogCWlmICghZXRyX2RhdGEtPmRlYnVnKSB7Ci0JCXByX2VycigiUUFUOiBVbmFibGUgdG8gY3JlYXRlIHRyYW5zcG9ydCBkZWJ1Z2ZzIGVudHJ5XG4iKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJIlVuYWJsZSB0byBjcmVhdGUgdHJhbnNwb3J0IGRlYnVnZnMgZW50cnlcbiIpOwogCQlyZXQgPSAtRU5PRU5UOwogCQlnb3RvIGVycl9iYW5rX2RlYnVnOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl90cmFuc3BvcnRfZGVidWcuYyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2FkZl90cmFuc3BvcnRfZGVidWcuYwppbmRleCA2YjY5NzQ1Li5lNDE5ODY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9hZGZfdHJhbnNwb3J0X2RlYnVnLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vYWRmX3RyYW5zcG9ydF9kZWJ1Zy5jCkBAIC0xMDAsNiArMTAwLDggQEAKIAkJZW1wdHkgPSBSRUFEX0NTUl9FX1NUQVQoY3NyLCBiYW5rLT5iYW5rX251bWJlcik7CiAKIAkJc2VxX3B1dHMoc2ZpbGUsICItLS0tLS0tIFJpbmcgY29uZmlndXJhdGlvbiAtLS0tLS0tXG4iKTsKKwkJc2VxX3ByaW50ZihzZmlsZSwgInJpbmcgbmFtZTogJXNcbiIsCisJCQkgICByaW5nLT5yaW5nX2RlYnVnLT5yaW5nX25hbWUpOwogCQlzZXFfcHJpbnRmKHNmaWxlLCAicmluZyBudW0gJWQsIGJhbmsgbnVtICVkXG4iLAogCQkJICAgcmluZy0+cmluZ19udW1iZXIsIHJpbmctPmJhbmstPmJhbmtfbnVtYmVyKTsKIAkJc2VxX3ByaW50ZihzZmlsZSwgImhlYWQgJXgsIHRhaWwgJXgsIGVtcHR5OiAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2ljcF9xYXRfaHcuaCBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL2ljcF9xYXRfaHcuaAppbmRleCA2OGYxOTFiLi4xMjFkNWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9pY3BfcWF0X2h3LmgKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vaWNwX3FhdF9ody5oCkBAIC0xNDUsNyArMTQ1LDcgQEAKIH07CiAKICNkZWZpbmUgUUFUX0hXX0RFRkFVTFRfQUxJR05NRU5UIDgKLSNkZWZpbmUgUUFUX0hXX1JPVU5EX1VQKHZhbCwgbikgKCgodmFsKSArICgobiktMSkpICYgKH4obi0xKSkpCisjZGVmaW5lIFFBVF9IV19ST1VORF9VUCh2YWwsIG4pICgoKHZhbCkgKyAoKG4pIC0gMSkpICYgKH4obiAtIDEpKSkKICNkZWZpbmUgSUNQX1FBVF9IV19OVUxMX1NUQVRFMV9TWiAzMgogI2RlZmluZSBJQ1BfUUFUX0hXX01ENV9TVEFURTFfU1ogMTYKICNkZWZpbmUgSUNQX1FBVF9IV19TSEExX1NUQVRFMV9TWiAyMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vcWF0X2NyeXB0by5jIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vcWF0X2NyeXB0by5jCmluZGV4IDgyOGYyYTYuLjNiZDcwNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL3FhdF9jcnlwdG8uYworKysgYi9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9xYXRfY3J5cHRvLmMKQEAgLTExMCwxMyArMTEwLDEzIEBACiAJbGlzdF9mb3JfZWFjaChpdHIsIGFkZl9kZXZtZ3JfZ2V0X2hlYWQoKSkgewogCQlhY2NlbF9kZXYgPSBsaXN0X2VudHJ5KGl0ciwgc3RydWN0IGFkZl9hY2NlbF9kZXYsIGxpc3QpOwogCQlpZiAoKG5vZGUgPT0gZGV2X3RvX25vZGUoJkdFVF9ERVYoYWNjZWxfZGV2KSkgfHwKLQkJCWRldl90b19ub2RlKCZHRVRfREVWKGFjY2VsX2RldikpIDwgMCkKLQkJCQkmJiBhZGZfZGV2X3N0YXJ0ZWQoYWNjZWxfZGV2KSkKKwkJICAgICBkZXZfdG9fbm9kZSgmR0VUX0RFVihhY2NlbF9kZXYpKSA8IDApICYmCisJCSAgICBhZGZfZGV2X3N0YXJ0ZWQoYWNjZWxfZGV2KSkKIAkJCWJyZWFrOwogCQlhY2NlbF9kZXYgPSBOVUxMOwogCX0KIAlpZiAoIWFjY2VsX2RldikgewotCQlwcl9lcnIoIlFBVDogQ291bGQgbm90IGZpbmQgZGV2aWNlIG9uIG5vZGUgJWRcbiIsIG5vZGUpOworCQlwcl9lcnIoIlFBVDogQ291bGQgbm90IGZpbmQgYSBkZXZpY2Ugb24gbm9kZSAlZFxuIiwgbm9kZSk7CiAJCWFjY2VsX2RldiA9IGFkZl9kZXZtZ3JfZ2V0X2ZpcnN0KCk7CiAJfQogCWlmICghYWNjZWxfZGV2IHx8ICFhZGZfZGV2X3N0YXJ0ZWQoYWNjZWxfZGV2KSkKQEAgLTEzNyw3ICsxMzcsOCBAQAogCQlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJmluc3RfYmVzdC0+cmVmY3RyKSA9PSAxKSB7CiAJCQlpZiAoYWRmX2Rldl9nZXQoYWNjZWxfZGV2KSkgewogCQkJCWF0b21pY19kZWMoJmluc3RfYmVzdC0+cmVmY3RyKTsKLQkJCQlwcl9lcnIoIlFBVDogQ291bGQgaW5jcmVtZW50IGRldiByZWZjdHJcbiIpOworCQkJCWRldl9lcnIoJkdFVF9ERVYoYWNjZWxfZGV2KSwKKwkJCQkJIkNvdWxkIG5vdCBpbmNyZW1lbnQgZGV2IHJlZmN0clxuIik7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL3FhdF9oYWwuYyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfY29tbW9uL3FhdF9oYWwuYwppbmRleCBiODE4YzE5Li4yNzRmZjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2NvbW1vbi9xYXRfaGFsLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9jb21tb24vcWF0X2hhbC5jCkBAIC00MzQsOCArNDM0LDggQEAKIAlTRVRfR0xCX0NTUihoYW5kbGUsIE1JU0NfQ09OVFJPTCwgbWlzY19jdGwgfCBNQ19USU1FU1RBTVBfRU5BQkxFKTsKIH0KIAotI2RlZmluZSBFU1JBTV9BVVRPX1RJTklUICgxPDwyKQotI2RlZmluZSBFU1JBTV9BVVRPX1RJTklUX0RPTkUgKDE8PDMpCisjZGVmaW5lIEVTUkFNX0FVVE9fVElOSVQJQklUKDIpCisjZGVmaW5lIEVTUkFNX0FVVE9fVElOSVRfRE9ORQlCSVQoMykKICNkZWZpbmUgRVNSQU1fQVVUT19JTklUX1VTRURfQ1lDTEVTICgxNjQwKQogI2RlZmluZSBFU1JBTV9BVVRPX0lOSVRfQ1NSX09GRlNFVCAweEMxQwogc3RhdGljIGludCBxYXRfaGFsX2luaXRfZXNyYW0oc3RydWN0IGljcF9xYXRfZndfbG9hZGVyX2hhbmRsZSAqaGFuZGxlKQpAQCAtNzE4LDcgKzcxOCw3IEBACiAJaGFuZGxlLT5oYWxfaGFuZGxlLT5hZV9tYXhfbnVtID0gbWF4X2VuX2FlX2lkICsgMTsKIAkvKiB0YWtlIGFsbCBBRXMgb3V0IG9mIHJlc2V0ICovCiAJaWYgKHFhdF9oYWxfY2xyX3Jlc2V0KGhhbmRsZSkpIHsKLQkJcHJfZXJyKCJRQVQ6IHFhdF9oYWxfY2xyX3Jlc2V0IGVycm9yXG4iKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLCAicWF0X2hhbF9jbHJfcmVzZXQgZXJyb3JcbiIpOwogCQlnb3RvIG91dF9lcnI7CiAJfQogCWlmIChxYXRfaGFsX2NsZWFyX2dwcihoYW5kbGUpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9kaDg5NXhjYy9hZGZfYWRtaW4uYyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfZGg4OTV4Y2MvYWRmX2FkbWluLmMKaW5kZXggNTNjNDkxYi4uZTQ2NjYwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9kaDg5NXhjYy9hZGZfYWRtaW4uYworKysgYi9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2RoODk1eGNjL2FkZl9hZG1pbi5jCkBAIC05Myw3ICs5Myw4IEBACiAJCW1lbWNweShvdXQsIGFkbWluLT52aXJ0X2FkZHIgKyBvZmZzZXQgKwogCQkgICAgICAgQURGX0FETUlOTVNHX0xFTiwgQURGX0FETUlOTVNHX0xFTik7CiAJZWxzZQotCQlwcl9lcnIoIlFBVDogRmFpbGVkIHRvIHNlbmQgYWRtaW4gbXNnIHRvIGFjY2VsZXJhdG9yXG4iKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJIkZhaWxlZCB0byBzZW5kIGFkbWluIG1zZyB0byBhY2NlbGVyYXRvclxuIik7CiAKIAltdXRleF91bmxvY2soJmFkbWluLT5sb2NrKTsKIAlyZXR1cm4gcmVjZWl2ZWQgPyAwIDogLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfZGg4OTV4Y2MvYWRmX2RoODk1eGNjX2h3X2RhdGEuYyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfZGg4OTV4Y2MvYWRmX2RoODk1eGNjX2h3X2RhdGEuYwppbmRleCA2YTczNWQ1Li5iMTM4NjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2RoODk1eGNjL2FkZl9kaDg5NXhjY19od19kYXRhLmMKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9kaDg5NXhjYy9hZGZfZGg4OTV4Y2NfaHdfZGF0YS5jCkBAIC0xNTAsNyArMTUwLDggQEAKIAkJKmFyYl9tYXBfY29uZmlnID0gdGhyZF90b19hcmJfbWFwX3NrdTY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByX2VycigiUUFUOiBUaGUgY29uZmlndXJhdGlvbiBkb2Vzbid0IG1hdGNoIGFueSBTS1UiKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJIlRoZSBjb25maWd1cmF0aW9uIGRvZXNuJ3QgbWF0Y2ggYW55IFNLVSIpOwogCQkqYXJiX21hcF9jb25maWcgPSBOVUxMOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfZGg4OTV4Y2MvYWRmX2RoODk1eGNjX2h3X2RhdGEuaCBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfZGg4OTV4Y2MvYWRmX2RoODk1eGNjX2h3X2RhdGEuaAppbmRleCAwMWUwYmUyLi4yNTI2OWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2RoODk1eGNjL2FkZl9kaDg5NXhjY19od19kYXRhLmgKKysrIGIvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9kaDg5NXhjYy9hZGZfZGg4OTV4Y2NfaHdfZGF0YS5oCkBAIC03MywxMSArNzMsMTEgQEAKIC8qIEVycm9yIGRldGVjdGlvbiBhbmQgY29ycmVjdGlvbiAqLwogI2RlZmluZSBBREZfREg4OTVYQ0NfQUVfQ1RYX0VOQUJMRVMoaSkgKGkgKiAweDEwMDAgKyAweDIwODE4KQogI2RlZmluZSBBREZfREg4OTVYQ0NfQUVfTUlTQ19DT05UUk9MKGkpIChpICogMHgxMDAwICsgMHgyMDk2MCkKLSNkZWZpbmUgQURGX0RIODk1WENDX0VOQUJMRV9BRV9FQ0NfRVJSICgxIDw8IDI4KQotI2RlZmluZSBBREZfREg4OTVYQ0NfRU5BQkxFX0FFX0VDQ19QQVJJVFlfQ09SUiAoMSA8PCAyNCB8IDEgPDwgMTIpCisjZGVmaW5lIEFERl9ESDg5NVhDQ19FTkFCTEVfQUVfRUNDX0VSUiBCSVQoMjgpCisjZGVmaW5lIEFERl9ESDg5NVhDQ19FTkFCTEVfQUVfRUNDX1BBUklUWV9DT1JSIChCSVQoMjQpIHwgQklUKDEyKSkKICNkZWZpbmUgQURGX0RIODk1WENDX1VFUlJTU01TSChpKSAoaSAqIDB4NDAwMCArIDB4MTgpCiAjZGVmaW5lIEFERl9ESDg5NVhDQ19DRVJSU1NNU0goaSkgKGkgKiAweDQwMDAgKyAweDEwKQotI2RlZmluZSBBREZfREg4OTVYQ0NfRVJSU1NNU0hfRU4gKDEgPDwgMykKKyNkZWZpbmUgQURGX0RIODk1WENDX0VSUlNTTVNIX0VOIEJJVCgzKQogCiAvKiBBZG1pbiBNZXNzYWdlcyBSZWdpc3RlcnMgKi8KICNkZWZpbmUgQURGX0RIODk1WENDX0FETUlOTVNHVVJfT0ZGU0VUICgweDNBMDAwICsgMHg1NzQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2RoODk1eGNjL2FkZl9kcnYuYyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfZGg4OTV4Y2MvYWRmX2Rydi5jCmluZGV4IDhmZmRiOTUuLjlkZWNlYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfZGg4OTV4Y2MvYWRmX2Rydi5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL3FhdC9xYXRfZGg4OTV4Y2MvYWRmX2Rydi5jCkBAIC0yMzYsNyArMjM2LDcgQEAKIAl9CiAKIAlhY2NlbF9kZXYgPSBremFsbG9jX25vZGUoc2l6ZW9mKCphY2NlbF9kZXYpLCBHRlBfS0VSTkVMLAotCQkJICAgICAgICAgZGV2X3RvX25vZGUoJnBkZXYtPmRldikpOworCQkJCSBkZXZfdG9fbm9kZSgmcGRldi0+ZGV2KSk7CiAJaWYgKCFhY2NlbF9kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0zNzksNyArMzc5LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWRmX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIGFkZl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IGFkZl9hY2NlbF9kZXYgKmFjY2VsX2RldiA9IGFkZl9kZXZtZ3JfcGNpX3RvX2FjY2VsX2RldihwZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vcWF0L3FhdF9kaDg5NXhjYy9hZGZfaXNyLmMgYi9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2RoODk1eGNjL2FkZl9pc3IuYwppbmRleCBmZThmODk2Li4wZDAzYzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2RoODk1eGNjL2FkZl9pc3IuYworKysgYi9kcml2ZXJzL2NyeXB0by9xYXQvcWF0X2RoODk1eGNjL2FkZl9pc3IuYwpAQCAtNzMsNyArNzMsNyBAQAogCWlmIChwY2lfZW5hYmxlX21zaXhfZXhhY3QocGNpX2Rldl9pbmZvLT5wY2lfZGV2LAogCQkJCSAgcGNpX2Rldl9pbmZvLT5tc2l4X2VudHJpZXMuZW50cmllcywKIAkJCQkgIG1zaXhfbnVtX2VudHJpZXMpKSB7Ci0JCXByX2VycigiUUFUOiBGYWlsZWQgdG8gZW5hYmxlIE1TSVggSVJRXG4iKTsKKwkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLCAiRmFpbGVkIHRvIGVuYWJsZSBNU0lYIElSUVxuIik7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIAlyZXR1cm4gMDsKQEAgLTk3LDcgKzk3LDggQEAKIHsKIAlzdHJ1Y3QgYWRmX2FjY2VsX2RldiAqYWNjZWxfZGV2ID0gZGV2X3B0cjsKIAotCXByX2luZm8oIlFBVDogcWF0X2RldiVkIHNwdXJpb3VzIEFFIGludGVycnVwdFxuIiwgYWNjZWxfZGV2LT5hY2NlbF9pZCk7CisJZGV2X2luZm8oJkdFVF9ERVYoYWNjZWxfZGV2KSwgInFhdF9kZXYlZCBzcHVyaW91cyBBRSBpbnRlcnJ1cHRcbiIsCisJCSBhY2NlbF9kZXYtPmFjY2VsX2lkKTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTEyMSw4ICsxMjIsOSBAQAogCQlyZXQgPSByZXF1ZXN0X2lycShtc2l4ZVtpXS52ZWN0b3IsCiAJCQkJICBhZGZfbXNpeF9pc3JfYnVuZGxlLCAwLCBuYW1lLCBiYW5rKTsKIAkJaWYgKHJldCkgewotCQkJcHJfZXJyKCJRQVQ6IGZhaWxlZCB0byBlbmFibGUgaXJxICVkIGZvciAlc1xuIiwKLQkJCSAgICAgICBtc2l4ZVtpXS52ZWN0b3IsIG5hbWUpOworCQkJZGV2X2VycigmR0VUX0RFVihhY2NlbF9kZXYpLAorCQkJCSJmYWlsZWQgdG8gZW5hYmxlIGlycSAlZCBmb3IgJXNcbiIsCisJCQkJbXNpeGVbaV0udmVjdG9yLCBuYW1lKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIApAQCAtMTM2LDggKzEzOCw5IEBACiAJCSAicWF0JWQtYWUtY2x1c3RlciIsIGFjY2VsX2Rldi0+YWNjZWxfaWQpOwogCXJldCA9IHJlcXVlc3RfaXJxKG1zaXhlW2ldLnZlY3RvciwgYWRmX21zaXhfaXNyX2FlLCAwLCBuYW1lLCBhY2NlbF9kZXYpOwogCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJRQVQ6IGZhaWxlZCB0byBlbmFibGUgaXJxICVkLCBmb3IgJXNcbiIsCi0JCSAgICAgICBtc2l4ZVtpXS52ZWN0b3IsIG5hbWUpOworCQlkZXZfZXJyKCZHRVRfREVWKGFjY2VsX2RldiksCisJCQkiZmFpbGVkIHRvIGVuYWJsZSBpcnEgJWQsIGZvciAlc1xuIiwKKwkJCW1zaXhlW2ldLnZlY3RvciwgbmFtZSk7CiAJCXJldHVybiByZXQ7CiAJfQogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by9zYWhhcmEuYyBiL2RyaXZlcnMvY3J5cHRvL3NhaGFyYS5jCmluZGV4IDI5MGE3ZjAuLjZiZTM3N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3J5cHRvL3NhaGFyYS5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL3NhaGFyYS5jCkBAIC00NzksNiArNDc5LDcgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCByZXQ7CiAJaW50IGksIGo7CisJaW50IGlkeCA9IDA7CiAKIAkvKiBDb3B5IG5ldyBrZXkgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKGN0eC0+ZmxhZ3MgJiBGTEFHU19ORVdfS0VZKSB7CkBAIC00ODYsMTcgKzQ4NywyMCBAQAogCQljdHgtPmZsYWdzICY9IH5GTEFHU19ORVdfS0VZOwogCiAJCWlmIChkZXYtPmZsYWdzICYgRkxBR1NfQ0JDKSB7Ci0JCQlkZXYtPmh3X2Rlc2NbMF0tPmxlbjEgPSBBRVNfQkxPQ0tfU0laRTsKLQkJCWRldi0+aHdfZGVzY1swXS0+cDEgPSBkZXYtPml2X3BoeXNfYmFzZTsKKwkJCWRldi0+aHdfZGVzY1tpZHhdLT5sZW4xID0gQUVTX0JMT0NLX1NJWkU7CisJCQlkZXYtPmh3X2Rlc2NbaWR4XS0+cDEgPSBkZXYtPml2X3BoeXNfYmFzZTsKIAkJfSBlbHNlIHsKLQkJCWRldi0+aHdfZGVzY1swXS0+bGVuMSA9IDA7Ci0JCQlkZXYtPmh3X2Rlc2NbMF0tPnAxID0gMDsKKwkJCWRldi0+aHdfZGVzY1tpZHhdLT5sZW4xID0gMDsKKwkJCWRldi0+aHdfZGVzY1tpZHhdLT5wMSA9IDA7CiAJCX0KLQkJZGV2LT5od19kZXNjWzBdLT5sZW4yID0gY3R4LT5rZXlsZW47Ci0JCWRldi0+aHdfZGVzY1swXS0+cDIgPSBkZXYtPmtleV9waHlzX2Jhc2U7Ci0JCWRldi0+aHdfZGVzY1swXS0+bmV4dCA9IGRldi0+aHdfcGh5c19kZXNjWzFdOworCQlkZXYtPmh3X2Rlc2NbaWR4XS0+bGVuMiA9IGN0eC0+a2V5bGVuOworCQlkZXYtPmh3X2Rlc2NbaWR4XS0+cDIgPSBkZXYtPmtleV9waHlzX2Jhc2U7CisJCWRldi0+aHdfZGVzY1tpZHhdLT5uZXh0ID0gZGV2LT5od19waHlzX2Rlc2NbMV07CisKKwkJZGV2LT5od19kZXNjW2lkeF0tPmhkciA9IHNhaGFyYV9hZXNfa2V5X2hkcihkZXYpOworCisJCWlkeCsrOwogCX0KLQlkZXYtPmh3X2Rlc2NbMF0tPmhkciA9IHNhaGFyYV9hZXNfa2V5X2hkcihkZXYpOwogCiAJZGV2LT5uYl9pbl9zZyA9IHNhaGFyYV9zZ19sZW5ndGgoZGV2LT5pbl9zZywgZGV2LT50b3RhbCk7CiAJZGV2LT5uYl9vdXRfc2cgPSBzYWhhcmFfc2dfbGVuZ3RoKGRldi0+b3V0X3NnLCBkZXYtPnRvdGFsKTsKQEAgLTUyMCw3ICs1MjQsNyBAQAogCX0KIAogCS8qIENyZWF0ZSBpbnB1dCBsaW5rcyAqLwotCWRldi0+aHdfZGVzY1sxXS0+cDEgPSBkZXYtPmh3X3BoeXNfbGlua1swXTsKKwlkZXYtPmh3X2Rlc2NbaWR4XS0+cDEgPSBkZXYtPmh3X3BoeXNfbGlua1swXTsKIAlzZyA9IGRldi0+aW5fc2c7CiAJZm9yIChpID0gMDsgaSA8IGRldi0+bmJfaW5fc2c7IGkrKykgewogCQlkZXYtPmh3X2xpbmtbaV0tPmxlbiA9IHNnLT5sZW5ndGg7CkBAIC01MzQsNyArNTM4LDcgQEAKIAl9CiAKIAkvKiBDcmVhdGUgb3V0cHV0IGxpbmtzICovCi0JZGV2LT5od19kZXNjWzFdLT5wMiA9IGRldi0+aHdfcGh5c19saW5rW2ldOworCWRldi0+aHdfZGVzY1tpZHhdLT5wMiA9IGRldi0+aHdfcGh5c19saW5rW2ldOwogCXNnID0gZGV2LT5vdXRfc2c7CiAJZm9yIChqID0gaTsgaiA8IGRldi0+bmJfb3V0X3NnICsgaTsgaisrKSB7CiAJCWRldi0+aHdfbGlua1tqXS0+bGVuID0gc2ctPmxlbmd0aDsKQEAgLTU0OCwxMCArNTUyLDEwIEBACiAJfQogCiAJLyogRmlsbCByZW1haW5pbmcgZmllbGRzIG9mIGh3X2Rlc2NbMV0gKi8KLQlkZXYtPmh3X2Rlc2NbMV0tPmhkciA9IHNhaGFyYV9hZXNfZGF0YV9saW5rX2hkcihkZXYpOwotCWRldi0+aHdfZGVzY1sxXS0+bGVuMSA9IGRldi0+dG90YWw7Ci0JZGV2LT5od19kZXNjWzFdLT5sZW4yID0gZGV2LT50b3RhbDsKLQlkZXYtPmh3X2Rlc2NbMV0tPm5leHQgPSAwOworCWRldi0+aHdfZGVzY1tpZHhdLT5oZHIgPSBzYWhhcmFfYWVzX2RhdGFfbGlua19oZHIoZGV2KTsKKwlkZXYtPmh3X2Rlc2NbaWR4XS0+bGVuMSA9IGRldi0+dG90YWw7CisJZGV2LT5od19kZXNjW2lkeF0tPmxlbjIgPSBkZXYtPnRvdGFsOworCWRldi0+aHdfZGVzY1tpZHhdLT5uZXh0ID0gMDsKIAogCXNhaGFyYV9kdW1wX2Rlc2NyaXB0b3JzKGRldik7CiAJc2FoYXJhX2R1bXBfbGlua3MoZGV2KTsKQEAgLTU3Niw2ICs1ODAsNyBAQAogCXN0cnVjdCBzYWhhcmFfY3R4ICpjdHg7CiAJc3RydWN0IHNhaGFyYV9hZXNfcmVxY3R4ICpyY3R4OwogCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCiAJLyogUmVxdWVzdCBpcyByZWFkeSB0byBiZSBkaXNwYXRjaGVkIGJ5IHRoZSBkZXZpY2UgKi8KIAlkZXZfZGJnKGRldi0+ZGV2aWNlLApAQCAtNjAxLDEwICs2MDYsMTIgQEAKIAlyZWluaXRfY29tcGxldGlvbigmZGV2LT5kbWFfY29tcGxldGlvbik7CiAKIAlyZXQgPSBzYWhhcmFfaHdfZGVzY3JpcHRvcl9jcmVhdGUoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGV2LT5kbWFfY29tcGxldGlvbiwKKwl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkZXYtPmRtYV9jb21wbGV0aW9uLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoU0FIQVJBX1RJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgeworCWlmICghdGltZW91dCkgewogCQlkZXZfZXJyKGRldi0+ZGV2aWNlLCAiQUVTIHRpbWVvdXRcbiIpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CkBAIC0xMDQ0LDcgKzEwNTEsOCBAQAogewogCXN0cnVjdCBzYWhhcmFfZGV2ICpkZXYgPSBkZXZfcHRyOwogCXN0cnVjdCBzYWhhcmFfc2hhX3JlcWN0eCAqcmN0eCA9IGFoYXNoX3JlcXVlc3RfY3R4KHJlcSk7Ci0JaW50IHJldCA9IC1FSU5QUk9HUkVTUzsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAogCXJldCA9IHNhaGFyYV9zaGFfcHJlcGFyZV9yZXF1ZXN0KHJlcSk7CiAJaWYgKCFyZXQpCkBAIC0xMDcwLDkgKzEwNzgsOSBAQAogCiAJc2FoYXJhX3dyaXRlKGRldiwgZGV2LT5od19waHlzX2Rlc2NbMF0sIFNBSEFSQV9SRUdfREFSKTsKIAotCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGV2LT5kbWFfY29tcGxldGlvbiwKKwl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkZXYtPmRtYV9jb21wbGV0aW9uLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoU0FIQVJBX1RJTUVPVVRfTVMpKTsKLQlpZiAoIXJldCkgeworCWlmICghdGltZW91dCkgewogCQlkZXZfZXJyKGRldi0+ZGV2aWNlLCAiU0hBIHRpbWVvdXRcbiIpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CkBAIC0xMDkyLDE1ICsxMTAwLDIwIEBACiB7CiAJc3RydWN0IHNhaGFyYV9kZXYgKmRldiA9IChzdHJ1Y3Qgc2FoYXJhX2RldiAqKWRhdGE7CiAJc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICphc3luY19yZXE7CisJc3RydWN0IGNyeXB0b19hc3luY19yZXF1ZXN0ICpiYWNrbG9nOwogCWludCByZXQgPSAwOwogCiAJZG8gewogCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAKIAkJbXV0ZXhfbG9jaygmZGV2LT5xdWV1ZV9tdXRleCk7CisJCWJhY2tsb2cgPSBjcnlwdG9fZ2V0X2JhY2tsb2coJmRldi0+cXVldWUpOwogCQlhc3luY19yZXEgPSBjcnlwdG9fZGVxdWV1ZV9yZXF1ZXN0KCZkZXYtPnF1ZXVlKTsKIAkJbXV0ZXhfdW5sb2NrKCZkZXYtPnF1ZXVlX211dGV4KTsKIAorCQlpZiAoYmFja2xvZykKKwkJCWJhY2tsb2ctPmNvbXBsZXRlKGJhY2tsb2csIC1FSU5QUk9HUkVTUyk7CisKIAkJaWYgKGFzeW5jX3JlcSkgewogCQkJaWYgKGNyeXB0b190Zm1fYWxnX3R5cGUoYXN5bmNfcmVxLT50Zm0pID09CiAJCQkgICAgQ1JZUFRPX0FMR19UWVBFX0FIQVNIKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by90YWxpdG9zLmMgYi9kcml2ZXJzL2NyeXB0by90YWxpdG9zLmMKaW5kZXggZWJiYWU4ZC4uODU3NDE0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vdGFsaXRvcy5jCisrKyBiL2RyaXZlcnMvY3J5cHRvL3RhbGl0b3MuYwpAQCAtNjM3LDggKzYzNyw2IEBACiAjZGVmaW5lIFRBTElUT1NfTUFYX0tFWV9TSVpFCQk5NgogI2RlZmluZSBUQUxJVE9TX01BWF9JVl9MRU5HVEgJCTE2IC8qIG1heCBvZiBBRVNfQkxPQ0tfU0laRSwgREVTM19FREVfQkxPQ0tfU0laRSAqLwogCi0jZGVmaW5lIE1ENV9CTE9DS19TSVpFICAgIDY0Ci0KIHN0cnVjdCB0YWxpdG9zX2N0eCB7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCWludCBjaDsKQEAgLTIxOTUsNyArMjE5Myw3IEBACiAJCQkuaGFsZy5iYXNlID0gewogCQkJCS5jcmFfbmFtZSA9ICJtZDUiLAogCQkJCS5jcmFfZHJpdmVyX25hbWUgPSAibWQ1LXRhbGl0b3MiLAotCQkJCS5jcmFfYmxvY2tzaXplID0gTUQ1X0JMT0NLX1NJWkUsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBNRDVfSE1BQ19CTE9DS19TSVpFLAogCQkJCS5jcmFfZmxhZ3MgPSBDUllQVE9fQUxHX1RZUEVfQUhBU0ggfAogCQkJCQkgICAgIENSWVBUT19BTEdfQVNZTkMsCiAJCQl9CkBAIC0yMjg1LDcgKzIyODMsNyBAQAogCQkJLmhhbGcuYmFzZSA9IHsKIAkJCQkuY3JhX25hbWUgPSAiaG1hYyhtZDUpIiwKIAkJCQkuY3JhX2RyaXZlcl9uYW1lID0gImhtYWMtbWQ1LXRhbGl0b3MiLAotCQkJCS5jcmFfYmxvY2tzaXplID0gTUQ1X0JMT0NLX1NJWkUsCisJCQkJLmNyYV9ibG9ja3NpemUgPSBNRDVfSE1BQ19CTE9DS19TSVpFLAogCQkJCS5jcmFfZmxhZ3MgPSBDUllQVE9fQUxHX1RZUEVfQUhBU0ggfAogCQkJCQkgICAgIENSWVBUT19BTEdfQVNZTkMsCiAJCQl9CkBAIC0yNzA2LDIwICsyNzA0LDE2IEBACiAJCWdvdG8gZXJyX291dDsKIAl9CiAKKwlwcml2LT5maWZvX2xlbiA9IHJvdW5kdXBfcG93X29mX3R3byhwcml2LT5jaGZpZm9fbGVuKTsKKwogCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1fY2hhbm5lbHM7IGkrKykgewogCQlwcml2LT5jaGFuW2ldLnJlZyA9IHByaXYtPnJlZyArIFRBTElUT1NfQ0hfU1RSSURFICogKGkgKyAxKTsKIAkJaWYgKCFwcml2LT5pcnFbMV0gfHwgIShpICYgMSkpCiAJCQlwcml2LT5jaGFuW2ldLnJlZyArPSBUQUxJVE9TX0NIX0JBU0VfT0ZGU0VUOwotCX0KIAotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5udW1fY2hhbm5lbHM7IGkrKykgewogCQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+Y2hhbltpXS5oZWFkX2xvY2spOwogCQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+Y2hhbltpXS50YWlsX2xvY2spOwotCX0KIAotCXByaXYtPmZpZm9fbGVuID0gcm91bmR1cF9wb3dfb2ZfdHdvKHByaXYtPmNoZmlmb19sZW4pOwotCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPm51bV9jaGFubmVsczsgaSsrKSB7CiAJCXByaXYtPmNoYW5baV0uZmlmbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0YWxpdG9zX3JlcXVlc3QpICoKIAkJCQkJICAgICBwcml2LT5maWZvX2xlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcHJpdi0+Y2hhbltpXS5maWZvKSB7CkBAIC0yNzI3LDExICsyNzIxLDEwIEBACiAJCQllcnIgPSAtRU5PTUVNOwogCQkJZ290byBlcnJfb3V0OwogCQl9Ci0JfQogCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPm51bV9jaGFubmVsczsgaSsrKQogCQlhdG9taWNfc2V0KCZwcml2LT5jaGFuW2ldLnN1Ym1pdF9jb3VudCwKIAkJCSAgIC0ocHJpdi0+Y2hmaWZvX2xlbiAtIDEpKTsKKwl9CiAKIAlkbWFfc2V0X21hc2soZGV2LCBETUFfQklUX01BU0soMzYpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vdXg1MDAvaGFzaC9oYXNoX2NvcmUuYyBiL2RyaXZlcnMvY3J5cHRvL3V4NTAwL2hhc2gvaGFzaF9jb3JlLmMKaW5kZXggMTg3YThmZC4uNWY1ZjM2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcnlwdG8vdXg1MDAvaGFzaC9oYXNoX2NvcmUuYworKysgYi9kcml2ZXJzL2NyeXB0by91eDUwMC9oYXNoL2hhc2hfY29yZS5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAkJCWRpcmVjdGlvbiwgRE1BX0NUUkxfQUNLIHwgRE1BX1BSRVBfSU5URVJSVVBUKTsKIAlpZiAoIWRlc2MpIHsKIAkJZGV2X2VycihjdHgtPmRldmljZS0+ZGV2LAotCQkJIiVzOiBkZXZpY2VfcHJlcF9zbGF2ZV9zZygpIGZhaWxlZCFcbiIsIF9fZnVuY19fKTsKKwkJCSIlczogZG1hZW5naW5lX3ByZXBfc2xhdmVfc2coKSBmYWlsZWQhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vdm14L0tjb25maWcgYi9kcml2ZXJzL2NyeXB0by92bXgvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzFiYWJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vdm14L0tjb25maWcKQEAgLTAsMCArMSw4IEBACitjb25maWcgQ1JZUFRPX0RFVl9WTVhfRU5DUllQVAorCXRyaXN0YXRlICJFbmNyeXB0aW9uIGFjY2VsZXJhdGlvbiBzdXBwb3J0IG9uIFA4IENQVSIKKwlkZXBlbmRzIG9uIFBQQzY0ICYmIENSWVBUT19ERVZfVk1YCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3VwcG9ydCBmb3IgVk1YIGNyeXB0b2dyYXBoaWMgYWNjZWxlcmF0aW9uIGluc3RydWN0aW9ucyBvbiBQb3dlcjggQ1BVLgorCSAgVGhpcyBtb2R1bGUgc3VwcG9ydHMgYWNjZWxlcmF0aW9uIGZvciBBRVMgYW5kIEdIQVNIIGluIGhhcmR3YXJlLiBJZiB5b3UKKwkgIGNob29zZSAnTScgaGVyZSwgdGhpcyBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdm14LWNyeXB0by4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3ZteC9NYWtlZmlsZSBiL2RyaXZlcnMvY3J5cHRvL3ZteC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjk5YzZlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vdm14L01ha2VmaWxlCkBAIC0wLDAgKzEsMTkgQEAKK29iai0kKENPTkZJR19DUllQVE9fREVWX1ZNWF9FTkNSWVBUKSArPSB2bXgtY3J5cHRvLm8KK3ZteC1jcnlwdG8tb2JqcyA6PSB2bXgubyBhZXNwOC1wcGMubyBnaGFzaHA4LXBwYy5vIGFlcy5vIGFlc19jYmMubyBhZXNfY3RyLm8gZ2hhc2gubworCitpZmVxICgkKENPTkZJR19DUFVfTElUVExFX0VORElBTikseSkKK1RBUkdFVCA6PSBsaW51eC1wcGM2NGxlCitlbHNlCitUQVJHRVQgOj0gbGludXgtcGNjNjQKK2VuZGlmCisKK3F1aWV0X2NtZF9wZXJsID0gUEVSTCAkQAorICAgICAgY21kX3BlcmwgPSAkKFBFUkwpICQoPCkgJChUQVJHRVQpID4gJChAKQorCiskKHNyYykvYWVzcDgtcHBjLlM6ICQoc3JjKS9hZXNwOC1wcGMucGwKKwkkKGNhbGwgY21kLHBlcmwpCisgIAorJChzcmMpL2doYXNocDgtcHBjLlM6ICQoc3JjKS9naGFzaHA4LXBwYy5wbAorCSQoY2FsbCBjbWQscGVybCkKKworLlBSRUNJT1VTOiAkKG9iaikvYWVzcDgtcHBjLlMgJChvYmopL2doYXNocDgtcHBjLlMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXMuYyBiL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjMwMGVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vdm14L2Flcy5jCkBAIC0wLDAgKzEsMTM5IEBACisvKioKKyAqIEFFUyByb3V0aW5lcyBzdXBwb3J0aW5nIFZNWCBpbnN0cnVjdGlvbnMgb24gdGhlIFBvd2VyIDgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb25seS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogQXV0aG9yOiBNYXJjZWxvIEhlbnJpcXVlIENlcnJpIDxtaGNlcnJpQGJyLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N3aXRjaF90by5oPgorI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KKworI2luY2x1ZGUgImFlc3A4LXBwYy5oIgorCitzdHJ1Y3QgcDhfYWVzX2N0eCB7CisgICAgc3RydWN0IGNyeXB0b19jaXBoZXIgKmZhbGxiYWNrOworICAgIHN0cnVjdCBhZXNfa2V5IGVuY19rZXk7CisgICAgc3RydWN0IGFlc19rZXkgZGVjX2tleTsKK307CisKK3N0YXRpYyBpbnQgcDhfYWVzX2luaXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKyAgICBjb25zdCBjaGFyICphbGc7CisgICAgc3RydWN0IGNyeXB0b19jaXBoZXIgKmZhbGxiYWNrOworICAgIHN0cnVjdCBwOF9hZXNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisgICAgaWYgKCEoYWxnID0gY3J5cHRvX3RmbV9hbGdfbmFtZSh0Zm0pKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBnZXQgYWxnb3JpdGhtIG5hbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgZmFsbGJhY2sgPSBjcnlwdG9fYWxsb2NfY2lwaGVyKGFsZywgMCAsQ1JZUFRPX0FMR19ORUVEX0ZBTExCQUNLKTsKKyAgICBpZiAoSVNfRVJSKGZhbGxiYWNrKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSB0cmFuc2Zvcm1hdGlvbiBmb3IgJyVzJzogJWxkXG4iLAorICAgICAgICAgICAgICAgIGFsZywgUFRSX0VSUihmYWxsYmFjaykpOworICAgICAgICByZXR1cm4gUFRSX0VSUihmYWxsYmFjayk7CisgICAgfQorICAgIHByaW50ayhLRVJOX0lORk8gIlVzaW5nICclcycgYXMgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24uXG4iLAorICAgICAgICAgICAgY3J5cHRvX3RmbV9hbGdfZHJpdmVyX25hbWUoKHN0cnVjdCBjcnlwdG9fdGZtICopIGZhbGxiYWNrKSk7CisKKyAgICBjcnlwdG9fY2lwaGVyX3NldF9mbGFncyhmYWxsYmFjaywKKyAgICAgICAgICAgIGNyeXB0b19jaXBoZXJfZ2V0X2ZsYWdzKChzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqKSB0Zm0pKTsKKyAgICBjdHgtPmZhbGxiYWNrID0gZmFsbGJhY2s7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcDhfYWVzX2V4aXQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKyAgICBzdHJ1Y3QgcDhfYWVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKworICAgIGlmIChjdHgtPmZhbGxiYWNrKSB7CisgICAgICAgIGNyeXB0b19mcmVlX2NpcGhlcihjdHgtPmZhbGxiYWNrKTsKKyAgICAgICAgY3R4LT5mYWxsYmFjayA9IE5VTEw7CisgICAgfQorfQorCitzdGF0aWMgaW50IHA4X2Flc19zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKKyAgICB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IHA4X2Flc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisKKyAgICBwYWdlZmF1bHRfZGlzYWJsZSgpOworICAgIGVuYWJsZV9rZXJuZWxfYWx0aXZlYygpOworICAgIHJldCA9IGFlc19wOF9zZXRfZW5jcnlwdF9rZXkoa2V5LCBrZXlsZW4gKiA4LCAmY3R4LT5lbmNfa2V5KTsKKyAgICByZXQgKz0gYWVzX3A4X3NldF9kZWNyeXB0X2tleShrZXksIGtleWxlbiAqIDgsICZjdHgtPmRlY19rZXkpOworICAgIHBhZ2VmYXVsdF9lbmFibGUoKTsKKyAgICAKKyAgICByZXQgKz0gY3J5cHRvX2NpcGhlcl9zZXRrZXkoY3R4LT5mYWxsYmFjaywga2V5LCBrZXlsZW4pOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHA4X2Flc19lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCit7CisgICAgc3RydWN0IHA4X2Flc19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KHRmbSk7CisKKyAgICBpZiAoaW5faW50ZXJydXB0KCkpIHsKKyAgICAgICAgY3J5cHRvX2NpcGhlcl9lbmNyeXB0X29uZShjdHgtPmZhbGxiYWNrLCBkc3QsIHNyYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFnZWZhdWx0X2Rpc2FibGUoKTsKKyAgICAgICAgZW5hYmxlX2tlcm5lbF9hbHRpdmVjKCk7CisgICAgICAgIGFlc19wOF9lbmNyeXB0KHNyYywgZHN0LCAmY3R4LT5lbmNfa2V5KTsKKyAgICAgICAgcGFnZWZhdWx0X2VuYWJsZSgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcDhfYWVzX2RlY3J5cHQoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYykKK3sKKyAgICBzdHJ1Y3QgcDhfYWVzX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKworICAgIGlmIChpbl9pbnRlcnJ1cHQoKSkgeworICAgICAgICBjcnlwdG9fY2lwaGVyX2RlY3J5cHRfb25lKGN0eC0+ZmFsbGJhY2ssIGRzdCwgc3JjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYWdlZmF1bHRfZGlzYWJsZSgpOworICAgICAgICBlbmFibGVfa2VybmVsX2FsdGl2ZWMoKTsKKyAgICAgICAgYWVzX3A4X2RlY3J5cHQoc3JjLCBkc3QsICZjdHgtPmRlY19rZXkpOworICAgICAgICBwYWdlZmF1bHRfZW5hYmxlKCk7CisgICAgfQorfQorCitzdHJ1Y3QgY3J5cHRvX2FsZyBwOF9hZXNfYWxnID0geworICAgIC5jcmFfbmFtZSA9ICJhZXMiLAorICAgIC5jcmFfZHJpdmVyX25hbWUgPSAicDhfYWVzIiwKKyAgICAuY3JhX21vZHVsZSA9IFRISVNfTU9EVUxFLAorICAgIC5jcmFfcHJpb3JpdHkgPSAxMDAwLAorICAgIC5jcmFfdHlwZSA9IE5VTEwsCisgICAgLmNyYV9mbGFncyA9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIgfCBDUllQVE9fQUxHX05FRURfRkFMTEJBQ0ssCisgICAgLmNyYV9hbGlnbm1hc2sgPSAwLAorICAgIC5jcmFfYmxvY2tzaXplID0gQUVTX0JMT0NLX1NJWkUsCisgICAgLmNyYV9jdHhzaXplID0gc2l6ZW9mKHN0cnVjdCBwOF9hZXNfY3R4KSwKKyAgICAuY3JhX2luaXQgPSBwOF9hZXNfaW5pdCwKKyAgICAuY3JhX2V4aXQgPSBwOF9hZXNfZXhpdCwKKyAgICAuY3JhX2NpcGhlciA9IHsKKyAgICAgICAgLmNpYV9taW5fa2V5c2l6ZSA9IEFFU19NSU5fS0VZX1NJWkUsCisgICAgICAgIC5jaWFfbWF4X2tleXNpemUgPSBBRVNfTUFYX0tFWV9TSVpFLAorICAgICAgICAuY2lhX3NldGtleSA9IHA4X2Flc19zZXRrZXksCisgICAgICAgIC5jaWFfZW5jcnlwdCA9IHA4X2Flc19lbmNyeXB0LAorICAgICAgICAuY2lhX2RlY3J5cHQgPSBwOF9hZXNfZGVjcnlwdCwKKyAgICB9LAorfTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vdm14L2Flc19jYmMuYyBiL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNfY2JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE1NTliNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNfY2JjLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qKgorICogQUVTIENCQyByb3V0aW5lcyBzdXBwb3J0aW5nIFZNWCBpbnN0cnVjdGlvbnMgb24gdGhlIFBvd2VyIDgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb25seS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogQXV0aG9yOiBNYXJjZWxvIEhlbnJpcXVlIENlcnJpIDxtaGNlcnJpQGJyLmlibS5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8YXNtL3N3aXRjaF90by5oPgorI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2NhdHRlcndhbGsuaD4KKworI2luY2x1ZGUgImFlc3A4LXBwYy5oIgorCitzdHJ1Y3QgcDhfYWVzX2NiY19jdHggeworICAgIHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICpmYWxsYmFjazsKKyAgICBzdHJ1Y3QgYWVzX2tleSBlbmNfa2V5OworICAgIHN0cnVjdCBhZXNfa2V5IGRlY19rZXk7Cit9OworCitzdGF0aWMgaW50IHA4X2Flc19jYmNfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworICAgIGNvbnN0IGNoYXIgKmFsZzsKKyAgICBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqZmFsbGJhY2s7CisgICAgc3RydWN0IHA4X2Flc19jYmNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisgICAgaWYgKCEoYWxnID0gY3J5cHRvX3RmbV9hbGdfbmFtZSh0Zm0pKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBnZXQgYWxnb3JpdGhtIG5hbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgZmFsbGJhY2sgPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKGFsZywgMCAsQ1JZUFRPX0FMR19ORUVEX0ZBTExCQUNLKTsKKyAgICBpZiAoSVNfRVJSKGZhbGxiYWNrKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSB0cmFuc2Zvcm1hdGlvbiBmb3IgJyVzJzogJWxkXG4iLAorICAgICAgICAgICAgICAgIGFsZywgUFRSX0VSUihmYWxsYmFjaykpOworICAgICAgICByZXR1cm4gUFRSX0VSUihmYWxsYmFjayk7CisgICAgfQorICAgIHByaW50ayhLRVJOX0lORk8gIlVzaW5nICclcycgYXMgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24uXG4iLAorICAgICAgICAgICAgY3J5cHRvX3RmbV9hbGdfZHJpdmVyX25hbWUoKHN0cnVjdCBjcnlwdG9fdGZtICopIGZhbGxiYWNrKSk7CisKKyAgICBjcnlwdG9fYmxrY2lwaGVyX3NldF9mbGFncyhmYWxsYmFjaywKKyAgICAgICAgICAgIGNyeXB0b19ibGtjaXBoZXJfZ2V0X2ZsYWdzKChzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqKSB0Zm0pKTsKKyAgICBjdHgtPmZhbGxiYWNrID0gZmFsbGJhY2s7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcDhfYWVzX2NiY19leGl0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisgICAgc3RydWN0IHA4X2Flc19jYmNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisgICAgaWYgKGN0eC0+ZmFsbGJhY2spIHsKKyAgICAgICAgY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGN0eC0+ZmFsbGJhY2spOworICAgICAgICBjdHgtPmZhbGxiYWNrID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcDhfYWVzX2NiY19zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKKyAgICB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IHA4X2Flc19jYmNfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisgICAgcGFnZWZhdWx0X2Rpc2FibGUoKTsKKyAgICBlbmFibGVfa2VybmVsX2FsdGl2ZWMoKTsKKyAgICByZXQgPSBhZXNfcDhfc2V0X2VuY3J5cHRfa2V5KGtleSwga2V5bGVuICogOCwgJmN0eC0+ZW5jX2tleSk7CisgICAgcmV0ICs9IGFlc19wOF9zZXRfZGVjcnlwdF9rZXkoa2V5LCBrZXlsZW4gKiA4LCAmY3R4LT5kZWNfa2V5KTsKKyAgICBwYWdlZmF1bHRfZW5hYmxlKCk7CisKKyAgICByZXQgKz0gY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkoY3R4LT5mYWxsYmFjaywga2V5LCBrZXlsZW4pOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcDhfYWVzX2NiY19lbmNyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworICAgIHN0cnVjdCBwOF9hZXNfY2JjX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoCisgICAgICAgICAgICBjcnlwdG9fYmxrY2lwaGVyX3RmbShkZXNjLT50Zm0pKTsKKyAgICBzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZmFsbGJhY2tfZGVzYyA9IHsKKyAgICAgICAgLnRmbSA9IGN0eC0+ZmFsbGJhY2ssCisgICAgICAgIC5pbmZvID0gZGVzYy0+aW5mbywKKyAgICAgICAgLmZsYWdzID0gZGVzYy0+ZmxhZ3MKKyAgICB9OworCisgICAgaWYgKGluX2ludGVycnVwdCgpKSB7CisgICAgICAgIHJldCA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZmFsbGJhY2tfZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFnZWZhdWx0X2Rpc2FibGUoKTsKKyAgICAgICAgZW5hYmxlX2tlcm5lbF9hbHRpdmVjKCk7CisKKwlibGtjaXBoZXJfd2Fsa19pbml0KCZ3YWxrLCBkc3QsIHNyYywgbmJ5dGVzKTsKKyAgICAgICAgcmV0ID0gYmxrY2lwaGVyX3dhbGtfdmlydChkZXNjLCAmd2Fsayk7CisgICAgICAgIHdoaWxlICgobmJ5dGVzID0gd2Fsay5uYnl0ZXMpKSB7CisJCQlhZXNfcDhfY2JjX2VuY3J5cHQod2Fsay5zcmMudmlydC5hZGRyLCB3YWxrLmRzdC52aXJ0LmFkZHIsCisJCQkJbmJ5dGVzICYgQUVTX0JMT0NLX01BU0ssICZjdHgtPmVuY19rZXksIHdhbGsuaXYsIDEpOworCQkJbmJ5dGVzICY9IEFFU19CTE9DS19TSVpFIC0gMTsKKwkJCXJldCA9IGJsa2NpcGhlcl93YWxrX2RvbmUoZGVzYywgJndhbGssIG5ieXRlcyk7CisJfQorCisgICAgICAgIHBhZ2VmYXVsdF9lbmFibGUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHA4X2Flc19jYmNfZGVjcnlwdChzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgKmRlc2MsCisgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAorICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCit7CisgICAgaW50IHJldDsKKyAgICBzdHJ1Y3QgYmxrY2lwaGVyX3dhbGsgd2FsazsKKyAgICBzdHJ1Y3QgcDhfYWVzX2NiY19jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KAorICAgICAgICAgICAgY3J5cHRvX2Jsa2NpcGhlcl90Zm0oZGVzYy0+dGZtKSk7CisgICAgc3RydWN0IGJsa2NpcGhlcl9kZXNjIGZhbGxiYWNrX2Rlc2MgPSB7CisgICAgICAgIC50Zm0gPSBjdHgtPmZhbGxiYWNrLAorICAgICAgICAuaW5mbyA9IGRlc2MtPmluZm8sCisgICAgICAgIC5mbGFncyA9IGRlc2MtPmZsYWdzCisgICAgfTsKKworICAgIGlmIChpbl9pbnRlcnJ1cHQoKSkgeworICAgICAgICByZXQgPSBjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoJmZhbGxiYWNrX2Rlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhZ2VmYXVsdF9kaXNhYmxlKCk7CisgICAgICAgIGVuYWJsZV9rZXJuZWxfYWx0aXZlYygpOworCisJYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisgICAgICAgIHJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnQoZGVzYywgJndhbGspOworICAgICAgICB3aGlsZSAoKG5ieXRlcyA9IHdhbGsubmJ5dGVzKSkgeworCQkJYWVzX3A4X2NiY19lbmNyeXB0KHdhbGsuc3JjLnZpcnQuYWRkciwgd2Fsay5kc3QudmlydC5hZGRyLAorCQkJCW5ieXRlcyAmIEFFU19CTE9DS19NQVNLLCAmY3R4LT5kZWNfa2V5LCB3YWxrLml2LCAwKTsKKwkJCW5ieXRlcyAmPSBBRVNfQkxPQ0tfU0laRSAtIDE7CisJCQlyZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCBuYnl0ZXMpOworCQl9CisKKyAgICAgICAgcGFnZWZhdWx0X2VuYWJsZSgpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKworc3RydWN0IGNyeXB0b19hbGcgcDhfYWVzX2NiY19hbGcgPSB7CisgICAgLmNyYV9uYW1lID0gImNiYyhhZXMpIiwKKyAgICAuY3JhX2RyaXZlcl9uYW1lID0gInA4X2Flc19jYmMiLAorICAgIC5jcmFfbW9kdWxlID0gVEhJU19NT0RVTEUsCisgICAgLmNyYV9wcmlvcml0eSA9IDEwMDAsCisgICAgLmNyYV90eXBlID0gJmNyeXB0b19ibGtjaXBoZXJfdHlwZSwKKyAgICAuY3JhX2ZsYWdzID0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUiB8IENSWVBUT19BTEdfTkVFRF9GQUxMQkFDSywKKyAgICAuY3JhX2FsaWdubWFzayA9IDAsCisgICAgLmNyYV9ibG9ja3NpemUgPSBBRVNfQkxPQ0tfU0laRSwKKyAgICAuY3JhX2N0eHNpemUgPSBzaXplb2Yoc3RydWN0IHA4X2Flc19jYmNfY3R4KSwKKyAgICAuY3JhX2luaXQgPSBwOF9hZXNfY2JjX2luaXQsCisgICAgLmNyYV9leGl0ID0gcDhfYWVzX2NiY19leGl0LAorICAgIC5jcmFfYmxrY2lwaGVyID0geworICAgICAgICAuaXZzaXplID0gMCwKKyAgICAgICAgLm1pbl9rZXlzaXplID0gQUVTX01JTl9LRVlfU0laRSwKKyAgICAgICAgLm1heF9rZXlzaXplID0gQUVTX01BWF9LRVlfU0laRSwKKyAgICAgICAgLnNldGtleSA9IHA4X2Flc19jYmNfc2V0a2V5LAorICAgICAgICAuZW5jcnlwdCA9IHA4X2Flc19jYmNfZW5jcnlwdCwKKyAgICAgICAgLmRlY3J5cHQgPSBwOF9hZXNfY2JjX2RlY3J5cHQsCisgICAgfSwKK307CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNfY3RyLmMgYi9kcml2ZXJzL2NyeXB0by92bXgvYWVzX2N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGJlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NyeXB0by92bXgvYWVzX2N0ci5jCkBAIC0wLDAgKzEsMTY3IEBACisvKioKKyAqIEFFUyBDVFIgcm91dGluZXMgc3VwcG9ydGluZyBWTVggaW5zdHJ1Y3Rpb25zIG9uIHRoZSBQb3dlciA4CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IEludGVybmF0aW9uYWwgQnVzaW5lc3MgTWFjaGluZXMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9ubHkuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIEF1dGhvcjogTWFyY2VsbyBIZW5yaXF1ZSBDZXJyaSA8bWhjZXJyaUBici5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGFzbS9zd2l0Y2hfdG8uaD4KKyNpbmNsdWRlIDxjcnlwdG8vYWVzLmg+CisjaW5jbHVkZSA8Y3J5cHRvL3NjYXR0ZXJ3YWxrLmg+CisjaW5jbHVkZSAiYWVzcDgtcHBjLmgiCisKK3N0cnVjdCBwOF9hZXNfY3RyX2N0eCB7CisgICAgc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKmZhbGxiYWNrOworICAgIHN0cnVjdCBhZXNfa2V5IGVuY19rZXk7Cit9OworCitzdGF0aWMgaW50IHA4X2Flc19jdHJfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworICAgIGNvbnN0IGNoYXIgKmFsZzsKKyAgICBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqZmFsbGJhY2s7CisgICAgc3RydWN0IHA4X2Flc19jdHJfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisgICAgaWYgKCEoYWxnID0gY3J5cHRvX3RmbV9hbGdfbmFtZSh0Zm0pKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBnZXQgYWxnb3JpdGhtIG5hbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgfQorCisgICAgZmFsbGJhY2sgPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKGFsZywgMCAsQ1JZUFRPX0FMR19ORUVEX0ZBTExCQUNLKTsKKyAgICBpZiAoSVNfRVJSKGZhbGxiYWNrKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSB0cmFuc2Zvcm1hdGlvbiBmb3IgJyVzJzogJWxkXG4iLAorICAgICAgICAgICAgICAgIGFsZywgUFRSX0VSUihmYWxsYmFjaykpOworICAgICAgICByZXR1cm4gUFRSX0VSUihmYWxsYmFjayk7CisgICAgfQorICAgIHByaW50ayhLRVJOX0lORk8gIlVzaW5nICclcycgYXMgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24uXG4iLAorICAgICAgICAgICAgY3J5cHRvX3RmbV9hbGdfZHJpdmVyX25hbWUoKHN0cnVjdCBjcnlwdG9fdGZtICopIGZhbGxiYWNrKSk7CisKKyAgICBjcnlwdG9fYmxrY2lwaGVyX3NldF9mbGFncyhmYWxsYmFjaywKKyAgICAgICAgICAgIGNyeXB0b19ibGtjaXBoZXJfZ2V0X2ZsYWdzKChzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqKSB0Zm0pKTsKKyAgICBjdHgtPmZhbGxiYWNrID0gZmFsbGJhY2s7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcDhfYWVzX2N0cl9leGl0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCit7CisgICAgc3RydWN0IHA4X2Flc19jdHJfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisgICAgaWYgKGN0eC0+ZmFsbGJhY2spIHsKKyAgICAgICAgY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKGN0eC0+ZmFsbGJhY2spOworICAgICAgICBjdHgtPmZhbGxiYWNrID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcDhfYWVzX2N0cl9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKKyAgICB1bnNpZ25lZCBpbnQga2V5bGVuKQoreworICAgIGludCByZXQ7CisgICAgc3RydWN0IHA4X2Flc19jdHJfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisgICAgcGFnZWZhdWx0X2Rpc2FibGUoKTsKKyAgICBlbmFibGVfa2VybmVsX2FsdGl2ZWMoKTsKKyAgICByZXQgPSBhZXNfcDhfc2V0X2VuY3J5cHRfa2V5KGtleSwga2V5bGVuICogOCwgJmN0eC0+ZW5jX2tleSk7CisgICAgcGFnZWZhdWx0X2VuYWJsZSgpOworCisgICAgcmV0ICs9IGNyeXB0b19ibGtjaXBoZXJfc2V0a2V5KGN0eC0+ZmFsbGJhY2ssIGtleSwga2V5bGVuKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwOF9hZXNfY3RyX2ZpbmFsKHN0cnVjdCBwOF9hZXNfY3RyX2N0eCAqY3R4LAorICAgICAgICAgICAgICAgIHN0cnVjdCBibGtjaXBoZXJfd2FsayAqd2FsaykKK3sKKyAgICB1OCAqY3RyYmxrID0gd2Fsay0+aXY7CisgICAgdTgga2V5c3RyZWFtW0FFU19CTE9DS19TSVpFXTsKKyAgICB1OCAqc3JjID0gd2Fsay0+c3JjLnZpcnQuYWRkcjsKKyAgICB1OCAqZHN0ID0gd2Fsay0+ZHN0LnZpcnQuYWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzID0gd2Fsay0+bmJ5dGVzOworCisgICAgcGFnZWZhdWx0X2Rpc2FibGUoKTsKKyAgICBlbmFibGVfa2VybmVsX2FsdGl2ZWMoKTsKKyAgICBhZXNfcDhfZW5jcnlwdChjdHJibGssIGtleXN0cmVhbSwgJmN0eC0+ZW5jX2tleSk7CisgICAgcGFnZWZhdWx0X2VuYWJsZSgpOworCisgICAgY3J5cHRvX3hvcihrZXlzdHJlYW0sIHNyYywgbmJ5dGVzKTsKKyAgICBtZW1jcHkoZHN0LCBrZXlzdHJlYW0sIG5ieXRlcyk7CisgICAgY3J5cHRvX2luYyhjdHJibGssIEFFU19CTE9DS19TSVpFKTsKK30KKworc3RhdGljIGludCBwOF9hZXNfY3RyX2NyeXB0KHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKKyAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCisgICAgdW5zaWduZWQgaW50IG5ieXRlcykKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBibGtjaXBoZXJfd2FsayB3YWxrOworICAgIHN0cnVjdCBwOF9hZXNfY3RyX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoCisgICAgICAgICAgICBjcnlwdG9fYmxrY2lwaGVyX3RmbShkZXNjLT50Zm0pKTsKKyAgICBzdHJ1Y3QgYmxrY2lwaGVyX2Rlc2MgZmFsbGJhY2tfZGVzYyA9IHsKKyAgICAgICAgLnRmbSA9IGN0eC0+ZmFsbGJhY2ssCisgICAgICAgIC5pbmZvID0gZGVzYy0+aW5mbywKKyAgICAgICAgLmZsYWdzID0gZGVzYy0+ZmxhZ3MKKyAgICB9OworCisgICAgaWYgKGluX2ludGVycnVwdCgpKSB7CisgICAgICAgIHJldCA9IGNyeXB0b19ibGtjaXBoZXJfZW5jcnlwdCgmZmFsbGJhY2tfZGVzYywgZHN0LCBzcmMsIG5ieXRlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYmxrY2lwaGVyX3dhbGtfaW5pdCgmd2FsaywgZHN0LCBzcmMsIG5ieXRlcyk7CisgICAgICAgIHJldCA9IGJsa2NpcGhlcl93YWxrX3ZpcnRfYmxvY2soZGVzYywgJndhbGssIEFFU19CTE9DS19TSVpFKTsKKyAgICAgICAgd2hpbGUgKChuYnl0ZXMgPSB3YWxrLm5ieXRlcykgPj0gQUVTX0JMT0NLX1NJWkUpIHsKKyAgICAgICAgICAgIHBhZ2VmYXVsdF9kaXNhYmxlKCk7CisgICAgICAgICAgICBlbmFibGVfa2VybmVsX2FsdGl2ZWMoKTsKKyAgICAgICAgICAgIGFlc19wOF9jdHIzMl9lbmNyeXB0X2Jsb2Nrcyh3YWxrLnNyYy52aXJ0LmFkZHIsIHdhbGsuZHN0LnZpcnQuYWRkciwKKyAgICAgICAgICAgICAgICAobmJ5dGVzICYgQUVTX0JMT0NLX01BU0spL0FFU19CTE9DS19TSVpFLCAmY3R4LT5lbmNfa2V5LCB3YWxrLml2KTsKKyAgICAgICAgICAgIHBhZ2VmYXVsdF9lbmFibGUoKTsKKworICAgICAgICAgICAgY3J5cHRvX2luYyh3YWxrLml2LCBBRVNfQkxPQ0tfU0laRSk7CisgICAgICAgICAgICBuYnl0ZXMgJj0gQUVTX0JMT0NLX1NJWkUgLSAxOworICAgICAgICAgICAgcmV0ID0gYmxrY2lwaGVyX3dhbGtfZG9uZShkZXNjLCAmd2FsaywgbmJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod2Fsay5uYnl0ZXMpIHsKKyAgICAgICAgICAgIHA4X2Flc19jdHJfZmluYWwoY3R4LCAmd2Fsayk7CisgICAgICAgICAgICByZXQgPSBibGtjaXBoZXJfd2Fsa19kb25lKGRlc2MsICZ3YWxrLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBjcnlwdG9fYWxnIHA4X2Flc19jdHJfYWxnID0geworICAgIC5jcmFfbmFtZSA9ICJjdHIoYWVzKSIsCisgICAgLmNyYV9kcml2ZXJfbmFtZSA9ICJwOF9hZXNfY3RyIiwKKyAgICAuY3JhX21vZHVsZSA9IFRISVNfTU9EVUxFLAorICAgIC5jcmFfcHJpb3JpdHkgPSAxMDAwLAorICAgIC5jcmFfdHlwZSA9ICZjcnlwdG9fYmxrY2lwaGVyX3R5cGUsCisgICAgLmNyYV9mbGFncyA9IENSWVBUT19BTEdfVFlQRV9CTEtDSVBIRVIgfCBDUllQVE9fQUxHX05FRURfRkFMTEJBQ0ssCisgICAgLmNyYV9hbGlnbm1hc2sgPSAwLAorICAgIC5jcmFfYmxvY2tzaXplID0gMSwKKyAgICAuY3JhX2N0eHNpemUgPSBzaXplb2Yoc3RydWN0IHA4X2Flc19jdHJfY3R4KSwKKyAgICAuY3JhX2luaXQgPSBwOF9hZXNfY3RyX2luaXQsCisgICAgLmNyYV9leGl0ID0gcDhfYWVzX2N0cl9leGl0LAorICAgIC5jcmFfYmxrY2lwaGVyID0geworICAgICAgICAuaXZzaXplID0gMCwKKyAgICAgICAgLm1pbl9rZXlzaXplID0gQUVTX01JTl9LRVlfU0laRSwKKyAgICAgICAgLm1heF9rZXlzaXplID0gQUVTX01BWF9LRVlfU0laRSwKKyAgICAgICAgLnNldGtleSA9IHA4X2Flc19jdHJfc2V0a2V5LAorICAgICAgICAuZW5jcnlwdCA9IHA4X2Flc19jdHJfY3J5cHQsCisgICAgICAgIC5kZWNyeXB0ID0gcDhfYWVzX2N0cl9jcnlwdCwKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNwOC1wcGMuaCBiL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNwOC1wcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTYzOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vdm14L2Flc3A4LXBwYy5oCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGNyeXB0by9hZXMuaD4KKworI2RlZmluZSBBRVNfQkxPQ0tfTUFTSyAgKH4oQUVTX0JMT0NLX1NJWkUtMSkpCisKK3N0cnVjdCBhZXNfa2V5IHsKKyAgICB1OCBrZXlbQUVTX01BWF9LRVlMRU5HVEhdOworICAgIGludCByb3VuZHM7Cit9OworCitpbnQgYWVzX3A4X3NldF9lbmNyeXB0X2tleShjb25zdCB1OCAqdXNlcktleSwgY29uc3QgaW50IGJpdHMsCisgICAgICAgIHN0cnVjdCBhZXNfa2V5ICprZXkpOworaW50IGFlc19wOF9zZXRfZGVjcnlwdF9rZXkoY29uc3QgdTggKnVzZXJLZXksIGNvbnN0IGludCBiaXRzLAorICAgICAgICBzdHJ1Y3QgYWVzX2tleSAqa2V5KTsKK3ZvaWQgYWVzX3A4X2VuY3J5cHQoY29uc3QgdTggKmluLCB1OCAqb3V0LCBjb25zdCBzdHJ1Y3QgYWVzX2tleSAqa2V5KTsKK3ZvaWQgYWVzX3A4X2RlY3J5cHQoY29uc3QgdTggKmluLCB1OCAqb3V0LGNvbnN0IHN0cnVjdCBhZXNfa2V5ICprZXkpOwordm9pZCBhZXNfcDhfY2JjX2VuY3J5cHQoY29uc3QgdTggKmluLCB1OCAqb3V0LCBzaXplX3QgbGVuLAorCQljb25zdCBzdHJ1Y3QgYWVzX2tleSAqa2V5LCB1OCAqaXYsIGNvbnN0IGludCBlbmMpOwordm9pZCBhZXNfcDhfY3RyMzJfZW5jcnlwdF9ibG9ja3MoY29uc3QgdTggKmluLCB1OCAqb3V0LAorICAgICAgICBzaXplX3QgbGVuLCBjb25zdCBzdHJ1Y3QgYWVzX2tleSAqa2V5LCBjb25zdCB1OCAqaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcnlwdG8vdm14L2Flc3A4LXBwYy5wbCBiL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNwOC1wcGMucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1YzIwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL3ZteC9hZXNwOC1wcGMucGwKQEAgLTAsMCArMSwxOTMwIEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHN1cHBvcnQgZm9yIEFFUyBpbnN0cnVjdGlvbnMgYXMgcGVyIFBvd2VySVNBCisjIHNwZWNpZmljYXRpb24gdmVyc2lvbiAyLjA3LCBmaXJzdCBpbXBsZW1lbnRlZCBieSBQT1dFUjggcHJvY2Vzc29yLgorIyBUaGUgbW9kdWxlIGlzIGVuZGlhbi1hZ25vc3RpYyBpbiBzZW5zZSB0aGF0IGl0IHN1cHBvcnRzIGJvdGggYmlnLQorIyBhbmQgbGl0dGxlLWVuZGlhbiBjYXNlcy4gRGF0YSBhbGlnbm1lbnQgaW4gcGFyYWxsZWxpemFibGUgbW9kZXMgaXMKKyMgaGFuZGxlZCB3aXRoIFZTWCBsb2FkcyBhbmQgc3RvcmVzLCB3aGljaCBpbXBsaWVzIE1TUi5WU1ggZmxhZyBiZWluZworIyBzZXQuIEl0IHNob3VsZCBhbHNvIGJlIG5vdGVkIHRoYXQgSVNBIHNwZWNpZmljYXRpb24gZG9lc24ndCBwcm9oaWJpdAorIyBhbGlnbm1lbnQgZXhjZXB0aW9ucyBmb3IgdGhlc2UgaW5zdHJ1Y3Rpb25zIG9uIHBhZ2UgYm91bmRhcmllcy4KKyMgSW5pdGlhbGx5IGFsaWdubWVudCB3YXMgaGFuZGxlZCBpbiBwdXJlIEFsdGlWZWMvVk1YIHdheSBbd2hlbiBkYXRhCisjIGlzIGFsaWduZWQgcHJvZ3JhbW1hdGljYWxseSwgd2hpY2ggaW4gdHVybiBndWFyYW50ZWVzIGV4Y2VwdGlvbi0KKyMgZnJlZSBleGVjdXRpb25dLCBidXQgaXQgdHVybmVkIHRvIGhhbXBlciBwZXJmb3JtYW5jZSB3aGVuIHZjaXBoZXIKKyMgaW5zdHJ1Y3Rpb25zIGFyZSBpbnRlcmxlYXZlZC4gSXQncyByZWNrb25lZCB0aGF0IGV2ZW50dWFsCisjIG1pc2FsaWdubWVudCBwZW5hbHRpZXMgYXQgcGFnZSBib3VuZGFyaWVzIGFyZSBpbiBhdmVyYWdlIGxvd2VyCisjIHRoYW4gYWRkaXRpb25hbCBvdmVyaGVhZCBpbiBwdXJlIEFsdGlWZWMgYXBwcm9hY2guCisKKyRmbGF2b3VyID0gc2hpZnQ7CisKK2lmICgkZmxhdm91ciA9fiAvNjQvKSB7CisJJFNJWkVfVAk9ODsKKwkkTFJTQVZFCT0yKiRTSVpFX1Q7CisJJFNUVQk9InN0ZHUiOworCSRQT1AJPSJsZCI7CisJJFBVU0gJPSJzdGQiOworCSRVQ01QCT0iY21wbGQiOworCSRTSEwJPSJzbGRpIjsKK30gZWxzaWYgKCRmbGF2b3VyID1+IC8zMi8pIHsKKwkkU0laRV9UCT00OworCSRMUlNBVkUJPSRTSVpFX1Q7CisJJFNUVQk9InN0d3UiOworCSRQT1AJPSJsd3oiOworCSRQVVNICT0ic3R3IjsKKwkkVUNNUAk9ImNtcGx3IjsKKwkkU0hMCT0ic2x3aSI7Cit9IGVsc2UgeyBkaWUgIm5vbnNlbnNlICRmbGF2b3VyIjsgfQorCiskTElUVExFX0VORElBTiA9ICgkZmxhdm91cj1+L2xlJC8pID8gJFNJWkVfVCA6IDA7CisKKyQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CisoICR4bGF0ZT0iJHtkaXJ9cHBjLXhsYXRlLnBsIiBhbmQgLWYgJHhsYXRlICkgb3IKKyggJHhsYXRlPSIke2Rpcn0uLi8uLi9wZXJsYXNtL3BwYy14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSkgb3IKK2RpZSAiY2FuJ3QgbG9jYXRlIHBwYy14bGF0ZS5wbCI7CisKK29wZW4gU1RET1VULCJ8ICReWCAkeGxhdGUgJGZsYXZvdXIgIi5zaGlmdCB8fCBkaWUgImNhbid0IGNhbGwgJHhsYXRlOiAkISI7CisKKyRGUkFNRT04KiRTSVpFX1Q7CiskcHJlZml4PSJhZXNfcDgiOworCiskc3A9InIxIjsKKyR2cnNhdmU9InIxMiI7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3t7ewkjIEtleSBzZXR1cCBwcm9jZWR1cmVzCQkJCQkJIworbXkgKCRpbnAsJGJpdHMsJG91dCwkcHRyLCRjbnQsJHJvdW5kcyk9bWFwKCJyJF8iLCgzLi44KSk7CitteSAoJHplcm8sJGluMCwkaW4xLCRrZXksJHJjb24sJG1hc2ssJHRtcCk9bWFwKCJ2JF8iLCgwLi42KSk7CitteSAoJHN0YWdlLCRvdXRwZXJtLCRvdXRtYXNrLCRvdXRoZWFkLCRvdXR0YWlsKT1tYXAoInYkXyIsKDcuLjExKSk7CisKKyRjb2RlLj08PF9fXzsKKy5tYWNoaW5lCSJhbnkiCisKKy50ZXh0CisKKy5hbGlnbgk3CityY29uOgorLmxvbmcJMHgwMTAwMDAwMCwgMHgwMTAwMDAwMCwgMHgwMTAwMDAwMCwgMHgwMTAwMDAwMAk/cmV2CisubG9uZwkweDFiMDAwMDAwLCAweDFiMDAwMDAwLCAweDFiMDAwMDAwLCAweDFiMDAwMDAwCT9yZXYKKy5sb25nCTB4MGQwZTBmMGMsIDB4MGQwZTBmMGMsIDB4MGQwZTBmMGMsIDB4MGQwZTBmMGMJP3JldgorLmxvbmcJMCwwLDAsMAkJCQkJCT9hc2lzCitMY29uc3RzOgorCW1mbHIJcjAKKwliY2wJMjAsMzEsXCQrNAorCW1mbHIJJHB0cgkgI3Z2dnZ2ICJkaXN0YW5jZSBiZXR3ZWVuIC4gYW5kIHJjb24KKwlhZGRpCSRwdHIsJHB0ciwtMHg0OAorCW10bHIJcjAKKwlibHIKKwkubG9uZwkwCisJLmJ5dGUJMCwxMiwweDE0LDAsMCwwLDAsMAorLmFzY2l6CSJBRVMgZm9yIFBvd2VySVNBIDIuMDcsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCisKKy5nbG9ibAkuJHtwcmVmaXh9X3NldF9lbmNyeXB0X2tleQorTHNldF9lbmNyeXB0X2tleToKKwltZmxyCQlyMTEKKwkkUFVTSAkJcjExLCRMUlNBVkUoJHNwKQorCisJbGkJCSRwdHIsLTEKKwkke1VDTVB9aQkkaW5wLDAKKwliZXEtCQlMZW5jX2tleV9hYm9ydAkJIyBpZiAoJGlucD09MCkgcmV0dXJuIC0xOworCSR7VUNNUH1pCSRvdXQsMAorCWJlcS0JCUxlbmNfa2V5X2Fib3J0CQkjIGlmICgkb3V0PT0wKSByZXR1cm4gLTE7CisJbGkJCSRwdHIsLTIKKwljbXB3aQkJJGJpdHMsMTI4CisJYmx0LQkJTGVuY19rZXlfYWJvcnQKKwljbXB3aQkJJGJpdHMsMjU2CisJYmd0LQkJTGVuY19rZXlfYWJvcnQKKwlhbmRpLgkJcjAsJGJpdHMsMHgzZgorCWJuZS0JCUxlbmNfa2V5X2Fib3J0CisKKwlsaXMJCXIwLDB4ZmZmMAorCW1mc3ByCQkkdnJzYXZlLDI1NgorCW10c3ByCQkyNTYscjAKKworCWJsCQlMY29uc3RzCisJbXRscgkJcjExCisKKwluZWcJCXI5LCRpbnAKKwlsdngJCSRpbjAsMCwkaW5wCisJYWRkaQkJJGlucCwkaW5wLDE1CQkjIDE1IGlzIG5vdCB0eXBvCisJbHZzcgkJJGtleSwwLHI5CQkjIGJvcnJvdyAka2V5CisJbGkJCXI4LDB4MjAKKwljbXB3aQkJJGJpdHMsMTkyCisJbHZ4CQkkaW4xLDAsJGlucAorCWxlP3ZzcGx0aXNiCSRtYXNrLDB4MGYJCSMgYm9ycm93ICRtYXNrCisJbHZ4CQkkcmNvbiwwLCRwdHIKKwlsZT92eG9yCQkka2V5LCRrZXksJG1hc2sJCSMgYWRqdXN0IGZvciBieXRlIHN3YXAKKwlsdngJCSRtYXNrLHI4LCRwdHIKKwlhZGRpCQkkcHRyLCRwdHIsMHgxMAorCXZwZXJtCQkkaW4wLCRpbjAsJGluMSwka2V5CSMgYWxpZ24gW2FuZCBieXRlIHN3YXAgaW4gTEVdCisJbGkJCSRjbnQsOAorCXZ4b3IJCSR6ZXJvLCR6ZXJvLCR6ZXJvCisJbXRjdHIJCSRjbnQKKworCT9sdnNyCQkkb3V0cGVybSwwLCRvdXQKKwl2c3BsdGlzYgkkb3V0bWFzaywtMQorCWx2eAkJJG91dGhlYWQsMCwkb3V0CisJP3ZwZXJtCQkkb3V0bWFzaywkemVybywkb3V0bWFzaywkb3V0cGVybQorCisJYmx0CQlMb29wMTI4CisJYWRkaQkJJGlucCwkaW5wLDgKKwliZXEJCUwxOTIKKwlhZGRpCQkkaW5wLCRpbnAsOAorCWIJCUwyNTYKKworLmFsaWduCTQKK0xvb3AxMjg6CisJdnBlcm0JCSRrZXksJGluMCwkaW4wLCRtYXNrCSMgcm90YXRlLW4tc3BsYXQKKwl2c2xkb2kJCSR0bXAsJHplcm8sJGluMCwxMgkjID4+MzIKKwkgdnBlcm0JCSRvdXR0YWlsLCRpbjAsJGluMCwkb3V0cGVybQkjIHJvdGF0ZQorCSB2c2VsCQkkc3RhZ2UsJG91dGhlYWQsJG91dHRhaWwsJG91dG1hc2sKKwkgdm1yCQkkb3V0aGVhZCwkb3V0dGFpbAorCXZjaXBoZXJsYXN0CSRrZXksJGtleSwkcmNvbgorCSBzdHZ4CQkkc3RhZ2UsMCwkb3V0CisJIGFkZGkJCSRvdXQsJG91dCwxNgorCisJdnhvcgkJJGluMCwkaW4wLCR0bXAKKwl2c2xkb2kJCSR0bXAsJHplcm8sJHRtcCwxMgkjID4+MzIKKwl2eG9yCQkkaW4wLCRpbjAsJHRtcAorCXZzbGRvaQkJJHRtcCwkemVybywkdG1wLDEyCSMgPj4zMgorCXZ4b3IJCSRpbjAsJGluMCwkdG1wCisJIHZhZGR1d20JJHJjb24sJHJjb24sJHJjb24KKwl2eG9yCQkkaW4wLCRpbjAsJGtleQorCWJkbnoJCUxvb3AxMjgKKworCWx2eAkJJHJjb24sMCwkcHRyCQkjIGxhc3QgdHdvIHJvdW5kIGtleXMKKworCXZwZXJtCQkka2V5LCRpbjAsJGluMCwkbWFzawkjIHJvdGF0ZS1uLXNwbGF0CisJdnNsZG9pCQkkdG1wLCR6ZXJvLCRpbjAsMTIJIyA+PjMyCisJIHZwZXJtCQkkb3V0dGFpbCwkaW4wLCRpbjAsJG91dHBlcm0JIyByb3RhdGUKKwkgdnNlbAkJJHN0YWdlLCRvdXRoZWFkLCRvdXR0YWlsLCRvdXRtYXNrCisJIHZtcgkJJG91dGhlYWQsJG91dHRhaWwKKwl2Y2lwaGVybGFzdAkka2V5LCRrZXksJHJjb24KKwkgc3R2eAkJJHN0YWdlLDAsJG91dAorCSBhZGRpCQkkb3V0LCRvdXQsMTYKKworCXZ4b3IJCSRpbjAsJGluMCwkdG1wCisJdnNsZG9pCQkkdG1wLCR6ZXJvLCR0bXAsMTIJIyA+PjMyCisJdnhvcgkJJGluMCwkaW4wLCR0bXAKKwl2c2xkb2kJCSR0bXAsJHplcm8sJHRtcCwxMgkjID4+MzIKKwl2eG9yCQkkaW4wLCRpbjAsJHRtcAorCSB2YWRkdXdtCSRyY29uLCRyY29uLCRyY29uCisJdnhvcgkJJGluMCwkaW4wLCRrZXkKKworCXZwZXJtCQkka2V5LCRpbjAsJGluMCwkbWFzawkjIHJvdGF0ZS1uLXNwbGF0CisJdnNsZG9pCQkkdG1wLCR6ZXJvLCRpbjAsMTIJIyA+PjMyCisJIHZwZXJtCQkkb3V0dGFpbCwkaW4wLCRpbjAsJG91dHBlcm0JIyByb3RhdGUKKwkgdnNlbAkJJHN0YWdlLCRvdXRoZWFkLCRvdXR0YWlsLCRvdXRtYXNrCisJIHZtcgkJJG91dGhlYWQsJG91dHRhaWwKKwl2Y2lwaGVybGFzdAkka2V5LCRrZXksJHJjb24KKwkgc3R2eAkJJHN0YWdlLDAsJG91dAorCSBhZGRpCQkkb3V0LCRvdXQsMTYKKworCXZ4b3IJCSRpbjAsJGluMCwkdG1wCisJdnNsZG9pCQkkdG1wLCR6ZXJvLCR0bXAsMTIJIyA+PjMyCisJdnhvcgkJJGluMCwkaW4wLCR0bXAKKwl2c2xkb2kJCSR0bXAsJHplcm8sJHRtcCwxMgkjID4+MzIKKwl2eG9yCQkkaW4wLCRpbjAsJHRtcAorCXZ4b3IJCSRpbjAsJGluMCwka2V5CisJIHZwZXJtCQkkb3V0dGFpbCwkaW4wLCRpbjAsJG91dHBlcm0JIyByb3RhdGUKKwkgdnNlbAkJJHN0YWdlLCRvdXRoZWFkLCRvdXR0YWlsLCRvdXRtYXNrCisJIHZtcgkJJG91dGhlYWQsJG91dHRhaWwKKwkgc3R2eAkJJHN0YWdlLDAsJG91dAorCisJYWRkaQkJJGlucCwkb3V0LDE1CQkjIDE1IGlzIG5vdCB0eXBvCisJYWRkaQkJJG91dCwkb3V0LDB4NTAKKworCWxpCQkkcm91bmRzLDEwCisJYgkJTGRvbmUKKworLmFsaWduCTQKK0wxOTI6CisJbHZ4CQkkdG1wLDAsJGlucAorCWxpCQkkY250LDQKKwkgdnBlcm0JCSRvdXR0YWlsLCRpbjAsJGluMCwkb3V0cGVybQkjIHJvdGF0ZQorCSB2c2VsCQkkc3RhZ2UsJG91dGhlYWQsJG91dHRhaWwsJG91dG1hc2sKKwkgdm1yCQkkb3V0aGVhZCwkb3V0dGFpbAorCSBzdHZ4CQkkc3RhZ2UsMCwkb3V0CisJIGFkZGkJCSRvdXQsJG91dCwxNgorCXZwZXJtCQkkaW4xLCRpbjEsJHRtcCwka2V5CSMgYWxpZ24gW2FuZCBieXRlIHN3YXAgaW4gTEVdCisJdnNwbHRpc2IJJGtleSw4CQkJIyBib3Jyb3cgJGtleQorCW10Y3RyCQkkY250CisJdnN1YnVibQkJJG1hc2ssJG1hc2ssJGtleQkjIGFkanVzdCB0aGUgbWFzaworCitMb29wMTkyOgorCXZwZXJtCQkka2V5LCRpbjEsJGluMSwkbWFzawkjIHJvYXRlLW4tc3BsYXQKKwl2c2xkb2kJCSR0bXAsJHplcm8sJGluMCwxMgkjID4+MzIKKwl2Y2lwaGVybGFzdAkka2V5LCRrZXksJHJjb24KKworCXZ4b3IJCSRpbjAsJGluMCwkdG1wCisJdnNsZG9pCQkkdG1wLCR6ZXJvLCR0bXAsMTIJIyA+PjMyCisJdnhvcgkJJGluMCwkaW4wLCR0bXAKKwl2c2xkb2kJCSR0bXAsJHplcm8sJHRtcCwxMgkjID4+MzIKKwl2eG9yCQkkaW4wLCRpbjAsJHRtcAorCisJIHZzbGRvaQkJJHN0YWdlLCR6ZXJvLCRpbjEsOAorCXZzcGx0dwkJJHRtcCwkaW4wLDMKKwl2eG9yCQkkdG1wLCR0bXAsJGluMQorCXZzbGRvaQkJJGluMSwkemVybywkaW4xLDEyCSMgPj4zMgorCSB2YWRkdXdtCSRyY29uLCRyY29uLCRyY29uCisJdnhvcgkJJGluMSwkaW4xLCR0bXAKKwl2eG9yCQkkaW4wLCRpbjAsJGtleQorCXZ4b3IJCSRpbjEsJGluMSwka2V5CisJIHZzbGRvaQkJJHN0YWdlLCRzdGFnZSwkaW4wLDgKKworCXZwZXJtCQkka2V5LCRpbjEsJGluMSwkbWFzawkjIHJvdGF0ZS1uLXNwbGF0CisJdnNsZG9pCQkkdG1wLCR6ZXJvLCRpbjAsMTIJIyA+PjMyCisJIHZwZXJtCQkkb3V0dGFpbCwkc3RhZ2UsJHN0YWdlLCRvdXRwZXJtCSMgcm90YXRlCisJIHZzZWwJCSRzdGFnZSwkb3V0aGVhZCwkb3V0dGFpbCwkb3V0bWFzaworCSB2bXIJCSRvdXRoZWFkLCRvdXR0YWlsCisJdmNpcGhlcmxhc3QJJGtleSwka2V5LCRyY29uCisJIHN0dngJCSRzdGFnZSwwLCRvdXQKKwkgYWRkaQkJJG91dCwkb3V0LDE2CisKKwkgdnNsZG9pCQkkc3RhZ2UsJGluMCwkaW4xLDgKKwl2eG9yCQkkaW4wLCRpbjAsJHRtcAorCXZzbGRvaQkJJHRtcCwkemVybywkdG1wLDEyCSMgPj4zMgorCSB2cGVybQkJJG91dHRhaWwsJHN0YWdlLCRzdGFnZSwkb3V0cGVybQkjIHJvdGF0ZQorCSB2c2VsCQkkc3RhZ2UsJG91dGhlYWQsJG91dHRhaWwsJG91dG1hc2sKKwkgdm1yCQkkb3V0aGVhZCwkb3V0dGFpbAorCXZ4b3IJCSRpbjAsJGluMCwkdG1wCisJdnNsZG9pCQkkdG1wLCR6ZXJvLCR0bXAsMTIJIyA+PjMyCisJdnhvcgkJJGluMCwkaW4wLCR0bXAKKwkgc3R2eAkJJHN0YWdlLDAsJG91dAorCSBhZGRpCQkkb3V0LCRvdXQsMTYKKworCXZzcGx0dwkJJHRtcCwkaW4wLDMKKwl2eG9yCQkkdG1wLCR0bXAsJGluMQorCXZzbGRvaQkJJGluMSwkemVybywkaW4xLDEyCSMgPj4zMgorCSB2YWRkdXdtCSRyY29uLCRyY29uLCRyY29uCisJdnhvcgkJJGluMSwkaW4xLCR0bXAKKwl2eG9yCQkkaW4wLCRpbjAsJGtleQorCXZ4b3IJCSRpbjEsJGluMSwka2V5CisJIHZwZXJtCQkkb3V0dGFpbCwkaW4wLCRpbjAsJG91dHBlcm0JIyByb3RhdGUKKwkgdnNlbAkJJHN0YWdlLCRvdXRoZWFkLCRvdXR0YWlsLCRvdXRtYXNrCisJIHZtcgkJJG91dGhlYWQsJG91dHRhaWwKKwkgc3R2eAkJJHN0YWdlLDAsJG91dAorCSBhZGRpCQkkaW5wLCRvdXQsMTUJCSMgMTUgaXMgbm90IHR5cG8KKwkgYWRkaQkJJG91dCwkb3V0LDE2CisJYmRuegkJTG9vcDE5MgorCisJbGkJCSRyb3VuZHMsMTIKKwlhZGRpCQkkb3V0LCRvdXQsMHgyMAorCWIJCUxkb25lCisKKy5hbGlnbgk0CitMMjU2OgorCWx2eAkJJHRtcCwwLCRpbnAKKwlsaQkJJGNudCw3CisJbGkJCSRyb3VuZHMsMTQKKwkgdnBlcm0JCSRvdXR0YWlsLCRpbjAsJGluMCwkb3V0cGVybQkjIHJvdGF0ZQorCSB2c2VsCQkkc3RhZ2UsJG91dGhlYWQsJG91dHRhaWwsJG91dG1hc2sKKwkgdm1yCQkkb3V0aGVhZCwkb3V0dGFpbAorCSBzdHZ4CQkkc3RhZ2UsMCwkb3V0CisJIGFkZGkJCSRvdXQsJG91dCwxNgorCXZwZXJtCQkkaW4xLCRpbjEsJHRtcCwka2V5CSMgYWxpZ24gW2FuZCBieXRlIHN3YXAgaW4gTEVdCisJbXRjdHIJCSRjbnQKKworTG9vcDI1NjoKKwl2cGVybQkJJGtleSwkaW4xLCRpbjEsJG1hc2sJIyByb3RhdGUtbi1zcGxhdAorCXZzbGRvaQkJJHRtcCwkemVybywkaW4wLDEyCSMgPj4zMgorCSB2cGVybQkJJG91dHRhaWwsJGluMSwkaW4xLCRvdXRwZXJtCSMgcm90YXRlCisJIHZzZWwJCSRzdGFnZSwkb3V0aGVhZCwkb3V0dGFpbCwkb3V0bWFzaworCSB2bXIJCSRvdXRoZWFkLCRvdXR0YWlsCisJdmNpcGhlcmxhc3QJJGtleSwka2V5LCRyY29uCisJIHN0dngJCSRzdGFnZSwwLCRvdXQKKwkgYWRkaQkJJG91dCwkb3V0LDE2CisKKwl2eG9yCQkkaW4wLCRpbjAsJHRtcAorCXZzbGRvaQkJJHRtcCwkemVybywkdG1wLDEyCSMgPj4zMgorCXZ4b3IJCSRpbjAsJGluMCwkdG1wCisJdnNsZG9pCQkkdG1wLCR6ZXJvLCR0bXAsMTIJIyA+PjMyCisJdnhvcgkJJGluMCwkaW4wLCR0bXAKKwkgdmFkZHV3bQkkcmNvbiwkcmNvbiwkcmNvbgorCXZ4b3IJCSRpbjAsJGluMCwka2V5CisJIHZwZXJtCQkkb3V0dGFpbCwkaW4wLCRpbjAsJG91dHBlcm0JIyByb3RhdGUKKwkgdnNlbAkJJHN0YWdlLCRvdXRoZWFkLCRvdXR0YWlsLCRvdXRtYXNrCisJIHZtcgkJJG91dGhlYWQsJG91dHRhaWwKKwkgc3R2eAkJJHN0YWdlLDAsJG91dAorCSBhZGRpCQkkaW5wLCRvdXQsMTUJCSMgMTUgaXMgbm90IHR5cG8KKwkgYWRkaQkJJG91dCwkb3V0LDE2CisJYmR6CQlMZG9uZQorCisJdnNwbHR3CQkka2V5LCRpbjAsMwkJIyBqdXN0IHNwbGF0CisJdnNsZG9pCQkkdG1wLCR6ZXJvLCRpbjEsMTIJIyA+PjMyCisJdnNib3gJCSRrZXksJGtleQorCisJdnhvcgkJJGluMSwkaW4xLCR0bXAKKwl2c2xkb2kJCSR0bXAsJHplcm8sJHRtcCwxMgkjID4+MzIKKwl2eG9yCQkkaW4xLCRpbjEsJHRtcAorCXZzbGRvaQkJJHRtcCwkemVybywkdG1wLDEyCSMgPj4zMgorCXZ4b3IJCSRpbjEsJGluMSwkdG1wCisKKwl2eG9yCQkkaW4xLCRpbjEsJGtleQorCWIJCUxvb3AyNTYKKworLmFsaWduCTQKK0xkb25lOgorCWx2eAkJJGluMSwwLCRpbnAJCSMgcmVkdW5kYW50IGluIGFsaWduZWQgY2FzZQorCXZzZWwJCSRpbjEsJG91dGhlYWQsJGluMSwkb3V0bWFzaworCXN0dngJCSRpbjEsMCwkaW5wCisJbGkJCSRwdHIsMAorCW10c3ByCQkyNTYsJHZyc2F2ZQorCXN0dwkJJHJvdW5kcywwKCRvdXQpCisKK0xlbmNfa2V5X2Fib3J0OgorCW1yCQlyMywkcHRyCisJYmxyCisJLmxvbmcJCTAKKwkuYnl0ZQkJMCwxMiwweDE0LDEsMCwwLDMsMAorCS5sb25nCQkwCisuc2l6ZQkuJHtwcmVmaXh9X3NldF9lbmNyeXB0X2tleSwuLS4ke3ByZWZpeH1fc2V0X2VuY3J5cHRfa2V5CisKKy5nbG9ibAkuJHtwcmVmaXh9X3NldF9kZWNyeXB0X2tleQorCSRTVFUJCSRzcCwtJEZSQU1FKCRzcCkKKwltZmxyCQlyMTAKKwkkUFVTSAkJcjEwLCRGUkFNRSskTFJTQVZFKCRzcCkKKwlibAkJTHNldF9lbmNyeXB0X2tleQorCW10bHIJCXIxMAorCisJY21wd2kJCXIzLDAKKwlibmUtCQlMZGVjX2tleV9hYm9ydAorCisJc2x3aQkJJGNudCwkcm91bmRzLDQKKwlzdWJpCQkkaW5wLCRvdXQsMjQwCQkjIGZpcnN0IHJvdW5kIGtleQorCXNyd2kJCSRyb3VuZHMsJHJvdW5kcywxCisJYWRkCQkkb3V0LCRpbnAsJGNudAkJIyBsYXN0IHJvdW5kIGtleQorCW10Y3RyCQkkcm91bmRzCisKK0xkZWNrZXk6CisJbHd6CQlyMCwgMCgkaW5wKQorCWx3egkJcjYsIDQoJGlucCkKKwlsd3oJCXI3LCA4KCRpbnApCisJbHd6CQlyOCwgMTIoJGlucCkKKwlhZGRpCQkkaW5wLCRpbnAsMTYKKwlsd3oJCXI5LCAwKCRvdXQpCisJbHd6CQlyMTAsNCgkb3V0KQorCWx3egkJcjExLDgoJG91dCkKKwlsd3oJCXIxMiwxMigkb3V0KQorCXN0dwkJcjAsIDAoJG91dCkKKwlzdHcJCXI2LCA0KCRvdXQpCisJc3R3CQlyNywgOCgkb3V0KQorCXN0dwkJcjgsIDEyKCRvdXQpCisJc3ViaQkJJG91dCwkb3V0LDE2CisJc3R3CQlyOSwgLTE2KCRpbnApCisJc3R3CQlyMTAsLTEyKCRpbnApCisJc3R3CQlyMTEsLTgoJGlucCkKKwlzdHcJCXIxMiwtNCgkaW5wKQorCWJkbnoJCUxkZWNrZXkKKworCXhvcgkJcjMscjMscjMJCSMgcmV0dXJuIHZhbHVlCitMZGVjX2tleV9hYm9ydDoKKwlhZGRpCQkkc3AsJHNwLCRGUkFNRQorCWJscgorCS5sb25nCQkwCisJLmJ5dGUJCTAsMTIsNCwxLDB4ODAsMCwzLDAKKwkubG9uZwkJMAorLnNpemUJLiR7cHJlZml4fV9zZXRfZGVjcnlwdF9rZXksLi0uJHtwcmVmaXh9X3NldF9kZWNyeXB0X2tleQorX19fCit9fX0KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3t7ewkjIFNpbmdsZSBibG9jayBlbi0gYW5kIGRlY3J5cHQgcHJvY2VkdXJlcwkJCSMKK3N1YiBnZW5fYmxvY2sgKCkgeworbXkgJGRpciA9IHNoaWZ0OworbXkgJG4gICA9ICRkaXIgZXEgImRlIiA/ICJuIiA6ICIiOworbXkgKCRpbnAsJG91dCwka2V5LCRyb3VuZHMsJGlkeCk9bWFwKCJyJF8iLCgzLi43KSk7CisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAkuJHtwcmVmaXh9XyR7ZGlyfWNyeXB0CisJbHd6CQkkcm91bmRzLDI0MCgka2V5KQorCWxpcwkJcjAsMHhmYzAwCisJbWZzcHIJCSR2cnNhdmUsMjU2CisJbGkJCSRpZHgsMTUJCQkjIDE1IGlzIG5vdCB0eXBvCisJbXRzcHIJCTI1NixyMAorCisJbHZ4CQl2MCwwLCRpbnAKKwluZWcJCXIxMSwkb3V0CisJbHZ4CQl2MSwkaWR4LCRpbnAKKwlsdnNsCQl2MiwwLCRpbnAJCSMgaW5wcGVybQorCWxlP3ZzcGx0aXNiCXY0LDB4MGYKKwk/bHZzbAkJdjMsMCxyMTEJCSMgb3V0cGVybQorCWxlP3Z4b3IJCXYyLHYyLHY0CisJbGkJCSRpZHgsMTYKKwl2cGVybQkJdjAsdjAsdjEsdjIJCSMgYWxpZ24gW2FuZCBieXRlIHN3YXAgaW4gTEVdCisJbHZ4CQl2MSwwLCRrZXkKKwk/bHZzbAkJdjUsMCwka2V5CQkjIGtleXBlcm0KKwlzcndpCQkkcm91bmRzLCRyb3VuZHMsMQorCWx2eAkJdjIsJGlkeCwka2V5CisJYWRkaQkJJGlkeCwkaWR4LDE2CisJc3ViaQkJJHJvdW5kcywkcm91bmRzLDEKKwk/dnBlcm0JCXYxLHYxLHYyLHY1CQkjIGFsaWduIHJvdW5kIGtleQorCisJdnhvcgkJdjAsdjAsdjEKKwlsdngJCXYxLCRpZHgsJGtleQorCWFkZGkJCSRpZHgsJGlkeCwxNgorCW10Y3RyCQkkcm91bmRzCisKK0xvb3BfJHtkaXJ9YzoKKwk/dnBlcm0JCXYyLHYyLHYxLHY1CisJdiR7bn1jaXBoZXIJdjAsdjAsdjIKKwlsdngJCXYyLCRpZHgsJGtleQorCWFkZGkJCSRpZHgsJGlkeCwxNgorCT92cGVybQkJdjEsdjEsdjIsdjUKKwl2JHtufWNpcGhlcgl2MCx2MCx2MQorCWx2eAkJdjEsJGlkeCwka2V5CisJYWRkaQkJJGlkeCwkaWR4LDE2CisJYmRuegkJTG9vcF8ke2Rpcn1jCisKKwk/dnBlcm0JCXYyLHYyLHYxLHY1CisJdiR7bn1jaXBoZXIJdjAsdjAsdjIKKwlsdngJCXYyLCRpZHgsJGtleQorCT92cGVybQkJdjEsdjEsdjIsdjUKKwl2JHtufWNpcGhlcmxhc3QJdjAsdjAsdjEKKworCXZzcGx0aXNiCXYyLC0xCisJdnhvcgkJdjEsdjEsdjEKKwlsaQkJJGlkeCwxNQkJCSMgMTUgaXMgbm90IHR5cG8KKwk/dnBlcm0JCXYyLHYxLHYyLHYzCQkjIG91dG1hc2sKKwlsZT92eG9yCQl2Myx2Myx2NAorCWx2eAkJdjEsMCwkb3V0CQkjIG91dGhlYWQKKwl2cGVybQkJdjAsdjAsdjAsdjMJCSMgcm90YXRlIFthbmQgYnl0ZSBzd2FwIGluIExFXQorCXZzZWwJCXYxLHYxLHYwLHYyCisJbHZ4CQl2NCwkaWR4LCRvdXQKKwlzdHZ4CQl2MSwwLCRvdXQKKwl2c2VsCQl2MCx2MCx2NCx2MgorCXN0dngJCXYwLCRpZHgsJG91dAorCisJbXRzcHIJCTI1NiwkdnJzYXZlCisJYmxyCisJLmxvbmcJCTAKKwkuYnl0ZQkJMCwxMiwweDE0LDAsMCwwLDMsMAorCS5sb25nCQkwCisuc2l6ZQkuJHtwcmVmaXh9XyR7ZGlyfWNyeXB0LC4tLiR7cHJlZml4fV8ke2Rpcn1jcnlwdAorX19fCit9CismZ2VuX2Jsb2NrKCJlbiIpOworJmdlbl9ibG9jaygiZGUiKTsKK319fQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwore3t7CSMgQ0JDIGVuLSBhbmQgZGVjcnlwdCBwcm9jZWR1cmVzCQkJCSMKK215ICgkaW5wLCRvdXQsJGxlbiwka2V5LCRpdnAsJGVuYywkcm91bmRzLCRpZHgpPW1hcCgiciRfIiwoMy4uMTApKTsKK215ICgkcm5ka2V5MCwkcm5ka2V5MSwkaW5vdXQsJHRtcCk9CQltYXAoInYkXyIsKDAuLjMpKTsKK215ICgkaXZlYywkaW5wdGFpbCwkaW5wcGVybSwkb3V0aGVhZCwkb3V0cGVybSwkb3V0bWFzaywka2V5cGVybSk9CisJCQkJCQltYXAoInYkXyIsKDQuLjEwKSk7CiskY29kZS49PDxfX187CisuZ2xvYmwJLiR7cHJlZml4fV9jYmNfZW5jcnlwdAorCSR7VUNNUH1pCSRsZW4sMTYKKwlibHRsci0KKworCWNtcHdpCQkkZW5jLDAJCQkjIHRlc3QgZGlyZWN0aW9uCisJbGlzCQlyMCwweGZmZTAKKwltZnNwcgkJJHZyc2F2ZSwyNTYKKwltdHNwcgkJMjU2LHIwCisKKwlsaQkJJGlkeCwxNQorCXZ4b3IJCSRybmRrZXkwLCRybmRrZXkwLCRybmRrZXkwCisJbGU/dnNwbHRpc2IJJHRtcCwweDBmCisKKwlsdngJCSRpdmVjLDAsJGl2cAkJIyBsb2FkIFt1bmFsaWduZWRdIGl2CisJbHZzbAkJJGlucHBlcm0sMCwkaXZwCisJbHZ4CQkkaW5wdGFpbCwkaWR4LCRpdnAKKwlsZT92eG9yCQkkaW5wcGVybSwkaW5wcGVybSwkdG1wCisJdnBlcm0JCSRpdmVjLCRpdmVjLCRpbnB0YWlsLCRpbnBwZXJtCisKKwluZWcJCXIxMSwkaW5wCisJP2x2c2wJCSRrZXlwZXJtLDAsJGtleQkJIyBwcmVwYXJlIGZvciB1bmFsaWduZWQga2V5CisJbHd6CQkkcm91bmRzLDI0MCgka2V5KQorCisJbHZzcgkJJGlucHBlcm0sMCxyMTEJCSMgcHJlcGFyZSBmb3IgdW5hbGlnbmVkIGxvYWQKKwlsdngJCSRpbnB0YWlsLDAsJGlucAorCWFkZGkJCSRpbnAsJGlucCwxNQkJIyAxNSBpcyBub3QgdHlwbworCWxlP3Z4b3IJCSRpbnBwZXJtLCRpbnBwZXJtLCR0bXAKKworCT9sdnNyCQkkb3V0cGVybSwwLCRvdXQJCSMgcHJlcGFyZSBmb3IgdW5hbGlnbmVkIHN0b3JlCisJdnNwbHRpc2IJJG91dG1hc2ssLTEKKwlsdngJCSRvdXRoZWFkLDAsJG91dAorCT92cGVybQkJJG91dG1hc2ssJHJuZGtleTAsJG91dG1hc2ssJG91dHBlcm0KKwlsZT92eG9yCQkkb3V0cGVybSwkb3V0cGVybSwkdG1wCisKKwlzcndpCQkkcm91bmRzLCRyb3VuZHMsMQorCWxpCQkkaWR4LDE2CisJc3ViaQkJJHJvdW5kcywkcm91bmRzLDEKKwliZXEJCUxjYmNfZGVjCisKK0xjYmNfZW5jOgorCXZtcgkJJGlub3V0LCRpbnB0YWlsCisJbHZ4CQkkaW5wdGFpbCwwLCRpbnAKKwlhZGRpCQkkaW5wLCRpbnAsMTYKKwltdGN0cgkJJHJvdW5kcworCXN1YmkJCSRsZW4sJGxlbiwxNgkJIyBsZW4tPTE2CisKKwlsdngJCSRybmRrZXkwLDAsJGtleQorCSB2cGVybQkJJGlub3V0LCRpbm91dCwkaW5wdGFpbCwkaW5wcGVybQorCWx2eAkJJHJuZGtleTEsJGlkeCwka2V5CisJYWRkaQkJJGlkeCwkaWR4LDE2CisJP3ZwZXJtCQkkcm5ka2V5MCwkcm5ka2V5MCwkcm5ka2V5MSwka2V5cGVybQorCXZ4b3IJCSRpbm91dCwkaW5vdXQsJHJuZGtleTAKKwlsdngJCSRybmRrZXkwLCRpZHgsJGtleQorCWFkZGkJCSRpZHgsJGlkeCwxNgorCXZ4b3IJCSRpbm91dCwkaW5vdXQsJGl2ZWMKKworTG9vcF9jYmNfZW5jOgorCT92cGVybQkJJHJuZGtleTEsJHJuZGtleTEsJHJuZGtleTAsJGtleXBlcm0KKwl2Y2lwaGVyCQkkaW5vdXQsJGlub3V0LCRybmRrZXkxCisJbHZ4CQkkcm5ka2V5MSwkaWR4LCRrZXkKKwlhZGRpCQkkaWR4LCRpZHgsMTYKKwk/dnBlcm0JCSRybmRrZXkwLCRybmRrZXkwLCRybmRrZXkxLCRrZXlwZXJtCisJdmNpcGhlcgkJJGlub3V0LCRpbm91dCwkcm5ka2V5MAorCWx2eAkJJHJuZGtleTAsJGlkeCwka2V5CisJYWRkaQkJJGlkeCwkaWR4LDE2CisJYmRuegkJTG9vcF9jYmNfZW5jCisKKwk/dnBlcm0JCSRybmRrZXkxLCRybmRrZXkxLCRybmRrZXkwLCRrZXlwZXJtCisJdmNpcGhlcgkJJGlub3V0LCRpbm91dCwkcm5ka2V5MQorCWx2eAkJJHJuZGtleTEsJGlkeCwka2V5CisJbGkJCSRpZHgsMTYKKwk/dnBlcm0JCSRybmRrZXkwLCRybmRrZXkwLCRybmRrZXkxLCRrZXlwZXJtCisJdmNpcGhlcmxhc3QJJGl2ZWMsJGlub3V0LCRybmRrZXkwCisJJHtVQ01QfWkJJGxlbiwxNgorCisJdnBlcm0JCSR0bXAsJGl2ZWMsJGl2ZWMsJG91dHBlcm0KKwl2c2VsCQkkaW5vdXQsJG91dGhlYWQsJHRtcCwkb3V0bWFzaworCXZtcgkJJG91dGhlYWQsJHRtcAorCXN0dngJCSRpbm91dCwwLCRvdXQKKwlhZGRpCQkkb3V0LCRvdXQsMTYKKwliZ2UJCUxjYmNfZW5jCisKKwliCQlMY2JjX2RvbmUKKworLmFsaWduCTQKK0xjYmNfZGVjOgorCSR7VUNNUH1pCSRsZW4sMTI4CisJYmdlCQlfYWVzcDhfY2JjX2RlY3J5cHQ4eAorCXZtcgkJJHRtcCwkaW5wdGFpbAorCWx2eAkJJGlucHRhaWwsMCwkaW5wCisJYWRkaQkJJGlucCwkaW5wLDE2CisJbXRjdHIJCSRyb3VuZHMKKwlzdWJpCQkkbGVuLCRsZW4sMTYJCSMgbGVuLT0xNgorCisJbHZ4CQkkcm5ka2V5MCwwLCRrZXkKKwkgdnBlcm0JCSR0bXAsJHRtcCwkaW5wdGFpbCwkaW5wcGVybQorCWx2eAkJJHJuZGtleTEsJGlkeCwka2V5CisJYWRkaQkJJGlkeCwkaWR4LDE2CisJP3ZwZXJtCQkkcm5ka2V5MCwkcm5ka2V5MCwkcm5ka2V5MSwka2V5cGVybQorCXZ4b3IJCSRpbm91dCwkdG1wLCRybmRrZXkwCisJbHZ4CQkkcm5ka2V5MCwkaWR4LCRrZXkKKwlhZGRpCQkkaWR4LCRpZHgsMTYKKworTG9vcF9jYmNfZGVjOgorCT92cGVybQkJJHJuZGtleTEsJHJuZGtleTEsJHJuZGtleTAsJGtleXBlcm0KKwl2bmNpcGhlcgkkaW5vdXQsJGlub3V0LCRybmRrZXkxCisJbHZ4CQkkcm5ka2V5MSwkaWR4LCRrZXkKKwlhZGRpCQkkaWR4LCRpZHgsMTYKKwk/dnBlcm0JCSRybmRrZXkwLCRybmRrZXkwLCRybmRrZXkxLCRrZXlwZXJtCisJdm5jaXBoZXIJJGlub3V0LCRpbm91dCwkcm5ka2V5MAorCWx2eAkJJHJuZGtleTAsJGlkeCwka2V5CisJYWRkaQkJJGlkeCwkaWR4LDE2CisJYmRuegkJTG9vcF9jYmNfZGVjCisKKwk/dnBlcm0JCSRybmRrZXkxLCRybmRrZXkxLCRybmRrZXkwLCRrZXlwZXJtCisJdm5jaXBoZXIJJGlub3V0LCRpbm91dCwkcm5ka2V5MQorCWx2eAkJJHJuZGtleTEsJGlkeCwka2V5CisJbGkJCSRpZHgsMTYKKwk/dnBlcm0JCSRybmRrZXkwLCRybmRrZXkwLCRybmRrZXkxLCRrZXlwZXJtCisJdm5jaXBoZXJsYXN0CSRpbm91dCwkaW5vdXQsJHJuZGtleTAKKwkke1VDTVB9aQkkbGVuLDE2CisKKwl2eG9yCQkkaW5vdXQsJGlub3V0LCRpdmVjCisJdm1yCQkkaXZlYywkdG1wCisJdnBlcm0JCSR0bXAsJGlub3V0LCRpbm91dCwkb3V0cGVybQorCXZzZWwJCSRpbm91dCwkb3V0aGVhZCwkdG1wLCRvdXRtYXNrCisJdm1yCQkkb3V0aGVhZCwkdG1wCisJc3R2eAkJJGlub3V0LDAsJG91dAorCWFkZGkJCSRvdXQsJG91dCwxNgorCWJnZQkJTGNiY19kZWMKKworTGNiY19kb25lOgorCWFkZGkJCSRvdXQsJG91dCwtMQorCWx2eAkJJGlub3V0LDAsJG91dAkJIyByZWR1bmRhbnQgaW4gYWxpZ25lZCBjYXNlCisJdnNlbAkJJGlub3V0LCRvdXRoZWFkLCRpbm91dCwkb3V0bWFzaworCXN0dngJCSRpbm91dCwwLCRvdXQKKworCW5lZwkJJGVuYywkaXZwCQkjIHdyaXRlIFt1bmFsaWduZWRdIGl2CisJbGkJCSRpZHgsMTUJCQkjIDE1IGlzIG5vdCB0eXBvCisJdnhvcgkJJHJuZGtleTAsJHJuZGtleTAsJHJuZGtleTAKKwl2c3BsdGlzYgkkb3V0bWFzaywtMQorCWxlP3ZzcGx0aXNiCSR0bXAsMHgwZgorCT9sdnNsCQkkb3V0cGVybSwwLCRlbmMKKwk/dnBlcm0JCSRvdXRtYXNrLCRybmRrZXkwLCRvdXRtYXNrLCRvdXRwZXJtCisJbGU/dnhvcgkJJG91dHBlcm0sJG91dHBlcm0sJHRtcAorCWx2eAkJJG91dGhlYWQsMCwkaXZwCisJdnBlcm0JCSRpdmVjLCRpdmVjLCRpdmVjLCRvdXRwZXJtCisJdnNlbAkJJGlub3V0LCRvdXRoZWFkLCRpdmVjLCRvdXRtYXNrCisJbHZ4CQkkaW5wdGFpbCwkaWR4LCRpdnAKKwlzdHZ4CQkkaW5vdXQsMCwkaXZwCisJdnNlbAkJJGlub3V0LCRpdmVjLCRpbnB0YWlsLCRvdXRtYXNrCisJc3R2eAkJJGlub3V0LCRpZHgsJGl2cAorCisJbXRzcHIJCTI1NiwkdnJzYXZlCisJYmxyCisJLmxvbmcJCTAKKwkuYnl0ZQkJMCwxMiwweDE0LDAsMCwwLDYsMAorCS5sb25nCQkwCitfX18KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3t7CSMgT3B0aW1pemVkIENCQyBkZWNyeXB0IHByb2NlZHVyZQkJCQkjCitteSAka2V5Xz0icjExIjsKK215ICgkeDAwLCR4MTAsJHgyMCwkeDMwLCR4NDAsJHg1MCwkeDYwLCR4NzApPW1hcCgiciRfIiwoMCw4LDI2Li4zMSkpOworbXkgKCRpbjAsICRpbjEsICRpbjIsICRpbjMsICRpbjQsICRpbjUsICRpbjYsICRpbjcgKT1tYXAoInYkXyIsKDAuLjMsMTAuLjEzKSk7CitteSAoJG91dDAsJG91dDEsJG91dDIsJG91dDMsJG91dDQsJG91dDUsJG91dDYsJG91dDcpPW1hcCgidiRfIiwoMTQuLjIxKSk7CitteSAkcm5ka2V5MD0idjIzIjsJIyB2MjQtdjI1IHJvdGF0aW5nIGJ1ZmZlciBmb3IgZmlyc3QgZm91bmQga2V5cworCQkJIyB2MjYtdjMxIGxhc3QgNiByb3VuZCBrZXlzCitteSAoJHRtcCwka2V5cGVybSk9KCRpbjMsJGluNCk7CSMgYWxpYXNlcyB3aXRoICJjYWxsZXIiLCByZWR1bmRhbnQgYXNzaWdubWVudAorCiskY29kZS49PDxfX187CisuYWxpZ24JNQorX2Flc3A4X2NiY19kZWNyeXB0OHg6CisJJFNUVQkJJHNwLC1gKCRGUkFNRSsyMSoxNis2KiRTSVpFX1QpYCgkc3ApCisJbGkJCXIxMCxgJEZSQU1FKzgqMTYrMTVgCisJbGkJCXIxMSxgJEZSQU1FKzgqMTYrMzFgCisJc3R2eAkJdjIwLHIxMCwkc3AJCSMgQUJJIHNheXMgc28KKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJdjIxLHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJdjIyLHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJdjIzLHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJdjI0LHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJdjI1LHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJdjI2LHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJdjI3LHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJdjI4LHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJdjI5LHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJdjMwLHIxMCwkc3AKKwlzdHZ4CQl2MzEscjExLCRzcAorCWxpCQlyMCwtMQorCXN0dwkJJHZyc2F2ZSxgJEZSQU1FKzIxKjE2LTRgKCRzcCkJIyBzYXZlIHZyc2F2ZQorCWxpCQkkeDEwLDB4MTAKKwkkUFVTSAkJcjI2LGAkRlJBTUUrMjEqMTYrMCokU0laRV9UYCgkc3ApCisJbGkJCSR4MjAsMHgyMAorCSRQVVNICQlyMjcsYCRGUkFNRSsyMSoxNisxKiRTSVpFX1RgKCRzcCkKKwlsaQkJJHgzMCwweDMwCisJJFBVU0gJCXIyOCxgJEZSQU1FKzIxKjE2KzIqJFNJWkVfVGAoJHNwKQorCWxpCQkkeDQwLDB4NDAKKwkkUFVTSAkJcjI5LGAkRlJBTUUrMjEqMTYrMyokU0laRV9UYCgkc3ApCisJbGkJCSR4NTAsMHg1MAorCSRQVVNICQlyMzAsYCRGUkFNRSsyMSoxNis0KiRTSVpFX1RgKCRzcCkKKwlsaQkJJHg2MCwweDYwCisJJFBVU0gJCXIzMSxgJEZSQU1FKzIxKjE2KzUqJFNJWkVfVGAoJHNwKQorCWxpCQkkeDcwLDB4NzAKKwltdHNwcgkJMjU2LHIwCisKKwlzdWJpCQkkcm91bmRzLCRyb3VuZHMsMwkjIC00IGluIHRvdGFsCisJc3ViaQkJJGxlbiwkbGVuLDEyOAkJIyBiaWFzCisKKwlsdngJCSRybmRrZXkwLCR4MDAsJGtleQkjIGxvYWQga2V5IHNjaGVkdWxlCisJbHZ4CQl2MzAsJHgxMCwka2V5CisJYWRkaQkJJGtleSwka2V5LDB4MjAKKwlsdngJCXYzMSwkeDAwLCRrZXkKKwk/dnBlcm0JCSRybmRrZXkwLCRybmRrZXkwLHYzMCwka2V5cGVybQorCWFkZGkJCSRrZXlfLCRzcCwkRlJBTUUrMTUKKwltdGN0cgkJJHJvdW5kcworCitMb2FkX2NiY19kZWNfa2V5OgorCT92cGVybQkJdjI0LHYzMCx2MzEsJGtleXBlcm0KKwlsdngJCXYzMCwkeDEwLCRrZXkKKwlhZGRpCQkka2V5LCRrZXksMHgyMAorCXN0dngJCXYyNCwkeDAwLCRrZXlfCQkjIG9mZi1sb2FkIHJvdW5kWzFdCisJP3ZwZXJtCQl2MjUsdjMxLHYzMCwka2V5cGVybQorCWx2eAkJdjMxLCR4MDAsJGtleQorCXN0dngJCXYyNSwkeDEwLCRrZXlfCQkjIG9mZi1sb2FkIHJvdW5kWzJdCisJYWRkaQkJJGtleV8sJGtleV8sMHgyMAorCWJkbnoJCUxvYWRfY2JjX2RlY19rZXkKKworCWx2eAkJdjI2LCR4MTAsJGtleQorCT92cGVybQkJdjI0LHYzMCx2MzEsJGtleXBlcm0KKwlsdngJCXYyNywkeDIwLCRrZXkKKwlzdHZ4CQl2MjQsJHgwMCwka2V5XwkJIyBvZmYtbG9hZCByb3VuZFszXQorCT92cGVybQkJdjI1LHYzMSx2MjYsJGtleXBlcm0KKwlsdngJCXYyOCwkeDMwLCRrZXkKKwlzdHZ4CQl2MjUsJHgxMCwka2V5XwkJIyBvZmYtbG9hZCByb3VuZFs0XQorCWFkZGkJCSRrZXlfLCRzcCwkRlJBTUUrMTUJIyByZXdpbmQgJGtleV8KKwk/dnBlcm0JCXYyNix2MjYsdjI3LCRrZXlwZXJtCisJbHZ4CQl2MjksJHg0MCwka2V5CisJP3ZwZXJtCQl2MjcsdjI3LHYyOCwka2V5cGVybQorCWx2eAkJdjMwLCR4NTAsJGtleQorCT92cGVybQkJdjI4LHYyOCx2MjksJGtleXBlcm0KKwlsdngJCXYzMSwkeDYwLCRrZXkKKwk/dnBlcm0JCXYyOSx2MjksdjMwLCRrZXlwZXJtCisJbHZ4CQkkb3V0MCwkeDcwLCRrZXkJCSMgYm9ycm93ICRvdXQwCisJP3ZwZXJtCQl2MzAsdjMwLHYzMSwka2V5cGVybQorCWx2eAkJdjI0LCR4MDAsJGtleV8JCSMgcHJlLWxvYWQgcm91bmRbMV0KKwk/dnBlcm0JCXYzMSx2MzEsJG91dDAsJGtleXBlcm0KKwlsdngJCXYyNSwkeDEwLCRrZXlfCQkjIHByZS1sb2FkIHJvdW5kWzJdCisKKwkjbHZ4CQkkaW5wdGFpbCwwLCRpbnAJCSMgImNhbGxlciIgYWxyZWFkeSBkaWQgdGhpcworCSNhZGRpCQkkaW5wLCRpbnAsMTUJCSMgMTUgaXMgbm90IHR5cG8KKwlzdWJpCQkkaW5wLCRpbnAsMTUJCSMgdW5kbyAiY2FsbGVyIgorCisJIGxlP2xpCQkkaWR4LDgKKwlsdnhfdQkJJGluMCwkeDAwLCRpbnAJCSMgbG9hZCBmaXJzdCA4ICJ3b3JkcyIKKwkgbGU/bHZzbAkkaW5wcGVybSwwLCRpZHgKKwkgbGU/dnNwbHRpc2IJJHRtcCwweDBmCisJbHZ4X3UJCSRpbjEsJHgxMCwkaW5wCisJIGxlP3Z4b3IJJGlucHBlcm0sJGlucHBlcm0sJHRtcAkjIHRyYW5zZm9ybSBmb3IgbHZ4X3Uvc3R2eF91CisJbHZ4X3UJCSRpbjIsJHgyMCwkaW5wCisJIGxlP3ZwZXJtCSRpbjAsJGluMCwkaW4wLCRpbnBwZXJtCisJbHZ4X3UJCSRpbjMsJHgzMCwkaW5wCisJIGxlP3ZwZXJtCSRpbjEsJGluMSwkaW4xLCRpbnBwZXJtCisJbHZ4X3UJCSRpbjQsJHg0MCwkaW5wCisJIGxlP3ZwZXJtCSRpbjIsJGluMiwkaW4yLCRpbnBwZXJtCisJdnhvcgkJJG91dDAsJGluMCwkcm5ka2V5MAorCWx2eF91CQkkaW41LCR4NTAsJGlucAorCSBsZT92cGVybQkkaW4zLCRpbjMsJGluMywkaW5wcGVybQorCXZ4b3IJCSRvdXQxLCRpbjEsJHJuZGtleTAKKwlsdnhfdQkJJGluNiwkeDYwLCRpbnAKKwkgbGU/dnBlcm0JJGluNCwkaW40LCRpbjQsJGlucHBlcm0KKwl2eG9yCQkkb3V0MiwkaW4yLCRybmRrZXkwCisJbHZ4X3UJCSRpbjcsJHg3MCwkaW5wCisJYWRkaQkJJGlucCwkaW5wLDB4ODAKKwkgbGU/dnBlcm0JJGluNSwkaW41LCRpbjUsJGlucHBlcm0KKwl2eG9yCQkkb3V0MywkaW4zLCRybmRrZXkwCisJIGxlP3ZwZXJtCSRpbjYsJGluNiwkaW42LCRpbnBwZXJtCisJdnhvcgkJJG91dDQsJGluNCwkcm5ka2V5MAorCSBsZT92cGVybQkkaW43LCRpbjcsJGluNywkaW5wcGVybQorCXZ4b3IJCSRvdXQ1LCRpbjUsJHJuZGtleTAKKwl2eG9yCQkkb3V0NiwkaW42LCRybmRrZXkwCisJdnhvcgkJJG91dDcsJGluNywkcm5ka2V5MAorCisJbXRjdHIJCSRyb3VuZHMKKwliCQlMb29wX2NiY19kZWM4eAorLmFsaWduCTUKK0xvb3BfY2JjX2RlYzh4OgorCXZuY2lwaGVyCSRvdXQwLCRvdXQwLHYyNAorCXZuY2lwaGVyCSRvdXQxLCRvdXQxLHYyNAorCXZuY2lwaGVyCSRvdXQyLCRvdXQyLHYyNAorCXZuY2lwaGVyCSRvdXQzLCRvdXQzLHYyNAorCXZuY2lwaGVyCSRvdXQ0LCRvdXQ0LHYyNAorCXZuY2lwaGVyCSRvdXQ1LCRvdXQ1LHYyNAorCXZuY2lwaGVyCSRvdXQ2LCRvdXQ2LHYyNAorCXZuY2lwaGVyCSRvdXQ3LCRvdXQ3LHYyNAorCWx2eAkJdjI0LCR4MjAsJGtleV8JCSMgcm91bmRbM10KKwlhZGRpCQkka2V5Xywka2V5XywweDIwCisKKwl2bmNpcGhlcgkkb3V0MCwkb3V0MCx2MjUKKwl2bmNpcGhlcgkkb3V0MSwkb3V0MSx2MjUKKwl2bmNpcGhlcgkkb3V0Miwkb3V0Mix2MjUKKwl2bmNpcGhlcgkkb3V0Mywkb3V0Myx2MjUKKwl2bmNpcGhlcgkkb3V0NCwkb3V0NCx2MjUKKwl2bmNpcGhlcgkkb3V0NSwkb3V0NSx2MjUKKwl2bmNpcGhlcgkkb3V0Niwkb3V0Nix2MjUKKwl2bmNpcGhlcgkkb3V0Nywkb3V0Nyx2MjUKKwlsdngJCXYyNSwkeDEwLCRrZXlfCQkjIHJvdW5kWzRdCisJYmRuegkJTG9vcF9jYmNfZGVjOHgKKworCXN1YmljCQkkbGVuLCRsZW4sMTI4CQkjICRsZW4tPTEyOAorCXZuY2lwaGVyCSRvdXQwLCRvdXQwLHYyNAorCXZuY2lwaGVyCSRvdXQxLCRvdXQxLHYyNAorCXZuY2lwaGVyCSRvdXQyLCRvdXQyLHYyNAorCXZuY2lwaGVyCSRvdXQzLCRvdXQzLHYyNAorCXZuY2lwaGVyCSRvdXQ0LCRvdXQ0LHYyNAorCXZuY2lwaGVyCSRvdXQ1LCRvdXQ1LHYyNAorCXZuY2lwaGVyCSRvdXQ2LCRvdXQ2LHYyNAorCXZuY2lwaGVyCSRvdXQ3LCRvdXQ3LHYyNAorCisJc3ViZmUuCQlyMCxyMCxyMAkJIyBib3Jyb3c/LTE6MAorCXZuY2lwaGVyCSRvdXQwLCRvdXQwLHYyNQorCXZuY2lwaGVyCSRvdXQxLCRvdXQxLHYyNQorCXZuY2lwaGVyCSRvdXQyLCRvdXQyLHYyNQorCXZuY2lwaGVyCSRvdXQzLCRvdXQzLHYyNQorCXZuY2lwaGVyCSRvdXQ0LCRvdXQ0LHYyNQorCXZuY2lwaGVyCSRvdXQ1LCRvdXQ1LHYyNQorCXZuY2lwaGVyCSRvdXQ2LCRvdXQ2LHYyNQorCXZuY2lwaGVyCSRvdXQ3LCRvdXQ3LHYyNQorCisJYW5kCQlyMCxyMCwkbGVuCisJdm5jaXBoZXIJJG91dDAsJG91dDAsdjI2CisJdm5jaXBoZXIJJG91dDEsJG91dDEsdjI2CisJdm5jaXBoZXIJJG91dDIsJG91dDIsdjI2CisJdm5jaXBoZXIJJG91dDMsJG91dDMsdjI2CisJdm5jaXBoZXIJJG91dDQsJG91dDQsdjI2CisJdm5jaXBoZXIJJG91dDUsJG91dDUsdjI2CisJdm5jaXBoZXIJJG91dDYsJG91dDYsdjI2CisJdm5jaXBoZXIJJG91dDcsJG91dDcsdjI2CisKKwlhZGQJCSRpbnAsJGlucCxyMAkJIyAkaW5wIGlzIGFkanVzdGVkIGluIHN1Y2gKKwkJCQkJCSMgd2F5IHRoYXQgYXQgZXhpdCBmcm9tIHRoZQorCQkJCQkJIyBsb29wIGluWC1pbjcgYXJlIGxvYWRlZAorCQkJCQkJIyB3aXRoIGxhc3QgIndvcmRzIgorCXZuY2lwaGVyCSRvdXQwLCRvdXQwLHYyNworCXZuY2lwaGVyCSRvdXQxLCRvdXQxLHYyNworCXZuY2lwaGVyCSRvdXQyLCRvdXQyLHYyNworCXZuY2lwaGVyCSRvdXQzLCRvdXQzLHYyNworCXZuY2lwaGVyCSRvdXQ0LCRvdXQ0LHYyNworCXZuY2lwaGVyCSRvdXQ1LCRvdXQ1LHYyNworCXZuY2lwaGVyCSRvdXQ2LCRvdXQ2LHYyNworCXZuY2lwaGVyCSRvdXQ3LCRvdXQ3LHYyNworCisJYWRkaQkJJGtleV8sJHNwLCRGUkFNRSsxNQkjIHJld2luZCAka2V5XworCXZuY2lwaGVyCSRvdXQwLCRvdXQwLHYyOAorCXZuY2lwaGVyCSRvdXQxLCRvdXQxLHYyOAorCXZuY2lwaGVyCSRvdXQyLCRvdXQyLHYyOAorCXZuY2lwaGVyCSRvdXQzLCRvdXQzLHYyOAorCXZuY2lwaGVyCSRvdXQ0LCRvdXQ0LHYyOAorCXZuY2lwaGVyCSRvdXQ1LCRvdXQ1LHYyOAorCXZuY2lwaGVyCSRvdXQ2LCRvdXQ2LHYyOAorCXZuY2lwaGVyCSRvdXQ3LCRvdXQ3LHYyOAorCWx2eAkJdjI0LCR4MDAsJGtleV8JCSMgcmUtcHJlLWxvYWQgcm91bmRbMV0KKworCXZuY2lwaGVyCSRvdXQwLCRvdXQwLHYyOQorCXZuY2lwaGVyCSRvdXQxLCRvdXQxLHYyOQorCXZuY2lwaGVyCSRvdXQyLCRvdXQyLHYyOQorCXZuY2lwaGVyCSRvdXQzLCRvdXQzLHYyOQorCXZuY2lwaGVyCSRvdXQ0LCRvdXQ0LHYyOQorCXZuY2lwaGVyCSRvdXQ1LCRvdXQ1LHYyOQorCXZuY2lwaGVyCSRvdXQ2LCRvdXQ2LHYyOQorCXZuY2lwaGVyCSRvdXQ3LCRvdXQ3LHYyOQorCWx2eAkJdjI1LCR4MTAsJGtleV8JCSMgcmUtcHJlLWxvYWQgcm91bmRbMl0KKworCXZuY2lwaGVyCSRvdXQwLCRvdXQwLHYzMAorCSB2eG9yCQkkaXZlYywkaXZlYyx2MzEJCSMgeG9yIHdpdGggbGFzdCByb3VuZCBrZXkKKwl2bmNpcGhlcgkkb3V0MSwkb3V0MSx2MzAKKwkgdnhvcgkJJGluMCwkaW4wLHYzMQorCXZuY2lwaGVyCSRvdXQyLCRvdXQyLHYzMAorCSB2eG9yCQkkaW4xLCRpbjEsdjMxCisJdm5jaXBoZXIJJG91dDMsJG91dDMsdjMwCisJIHZ4b3IJCSRpbjIsJGluMix2MzEKKwl2bmNpcGhlcgkkb3V0NCwkb3V0NCx2MzAKKwkgdnhvcgkJJGluMywkaW4zLHYzMQorCXZuY2lwaGVyCSRvdXQ1LCRvdXQ1LHYzMAorCSB2eG9yCQkkaW40LCRpbjQsdjMxCisJdm5jaXBoZXIJJG91dDYsJG91dDYsdjMwCisJIHZ4b3IJCSRpbjUsJGluNSx2MzEKKwl2bmNpcGhlcgkkb3V0Nywkb3V0Nyx2MzAKKwkgdnhvcgkJJGluNiwkaW42LHYzMQorCisJdm5jaXBoZXJsYXN0CSRvdXQwLCRvdXQwLCRpdmVjCisJdm5jaXBoZXJsYXN0CSRvdXQxLCRvdXQxLCRpbjAKKwkgbHZ4X3UJCSRpbjAsJHgwMCwkaW5wCQkjIGxvYWQgbmV4dCBpbnB1dCBibG9jaworCXZuY2lwaGVybGFzdAkkb3V0Miwkb3V0MiwkaW4xCisJIGx2eF91CQkkaW4xLCR4MTAsJGlucAorCXZuY2lwaGVybGFzdAkkb3V0Mywkb3V0MywkaW4yCisJIGxlP3ZwZXJtCSRpbjAsJGluMCwkaW4wLCRpbnBwZXJtCisJIGx2eF91CQkkaW4yLCR4MjAsJGlucAorCXZuY2lwaGVybGFzdAkkb3V0NCwkb3V0NCwkaW4zCisJIGxlP3ZwZXJtCSRpbjEsJGluMSwkaW4xLCRpbnBwZXJtCisJIGx2eF91CQkkaW4zLCR4MzAsJGlucAorCXZuY2lwaGVybGFzdAkkb3V0NSwkb3V0NSwkaW40CisJIGxlP3ZwZXJtCSRpbjIsJGluMiwkaW4yLCRpbnBwZXJtCisJIGx2eF91CQkkaW40LCR4NDAsJGlucAorCXZuY2lwaGVybGFzdAkkb3V0Niwkb3V0NiwkaW41CisJIGxlP3ZwZXJtCSRpbjMsJGluMywkaW4zLCRpbnBwZXJtCisJIGx2eF91CQkkaW41LCR4NTAsJGlucAorCXZuY2lwaGVybGFzdAkkb3V0Nywkb3V0NywkaW42CisJIGxlP3ZwZXJtCSRpbjQsJGluNCwkaW40LCRpbnBwZXJtCisJIGx2eF91CQkkaW42LCR4NjAsJGlucAorCXZtcgkJJGl2ZWMsJGluNworCSBsZT92cGVybQkkaW41LCRpbjUsJGluNSwkaW5wcGVybQorCSBsdnhfdQkJJGluNywkeDcwLCRpbnAKKwkgYWRkaQkJJGlucCwkaW5wLDB4ODAKKworCWxlP3ZwZXJtCSRvdXQwLCRvdXQwLCRvdXQwLCRpbnBwZXJtCisJbGU/dnBlcm0JJG91dDEsJG91dDEsJG91dDEsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQwLCR4MDAsJG91dAorCSBsZT92cGVybQkkaW42LCRpbjYsJGluNiwkaW5wcGVybQorCSB2eG9yCQkkb3V0MCwkaW4wLCRybmRrZXkwCisJbGU/dnBlcm0JJG91dDIsJG91dDIsJG91dDIsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQxLCR4MTAsJG91dAorCSBsZT92cGVybQkkaW43LCRpbjcsJGluNywkaW5wcGVybQorCSB2eG9yCQkkb3V0MSwkaW4xLCRybmRrZXkwCisJbGU/dnBlcm0JJG91dDMsJG91dDMsJG91dDMsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQyLCR4MjAsJG91dAorCSB2eG9yCQkkb3V0MiwkaW4yLCRybmRrZXkwCisJbGU/dnBlcm0JJG91dDQsJG91dDQsJG91dDQsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQzLCR4MzAsJG91dAorCSB2eG9yCQkkb3V0MywkaW4zLCRybmRrZXkwCisJbGU/dnBlcm0JJG91dDUsJG91dDUsJG91dDUsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQ0LCR4NDAsJG91dAorCSB2eG9yCQkkb3V0NCwkaW40LCRybmRrZXkwCisJbGU/dnBlcm0JJG91dDYsJG91dDYsJG91dDYsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQ1LCR4NTAsJG91dAorCSB2eG9yCQkkb3V0NSwkaW41LCRybmRrZXkwCisJbGU/dnBlcm0JJG91dDcsJG91dDcsJG91dDcsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQ2LCR4NjAsJG91dAorCSB2eG9yCQkkb3V0NiwkaW42LCRybmRrZXkwCisJc3R2eF91CQkkb3V0NywkeDcwLCRvdXQKKwlhZGRpCQkkb3V0LCRvdXQsMHg4MAorCSB2eG9yCQkkb3V0NywkaW43LCRybmRrZXkwCisKKwltdGN0cgkJJHJvdW5kcworCWJlcQkJTG9vcF9jYmNfZGVjOHgJCSMgZGlkICRsZW4tPTEyOCBib3Jyb3c/CisKKwlhZGRpYy4JCSRsZW4sJGxlbiwxMjgKKwliZXEJCUxjYmNfZGVjOHhfZG9uZQorCW5vcAorCW5vcAorCitMb29wX2NiY19kZWM4eF90YWlsOgkJCQkjIHVwIHRvIDcgIndvcmRzIiB0YWlsLi4uCisJdm5jaXBoZXIJJG91dDEsJG91dDEsdjI0CisJdm5jaXBoZXIJJG91dDIsJG91dDIsdjI0CisJdm5jaXBoZXIJJG91dDMsJG91dDMsdjI0CisJdm5jaXBoZXIJJG91dDQsJG91dDQsdjI0CisJdm5jaXBoZXIJJG91dDUsJG91dDUsdjI0CisJdm5jaXBoZXIJJG91dDYsJG91dDYsdjI0CisJdm5jaXBoZXIJJG91dDcsJG91dDcsdjI0CisJbHZ4CQl2MjQsJHgyMCwka2V5XwkJIyByb3VuZFszXQorCWFkZGkJCSRrZXlfLCRrZXlfLDB4MjAKKworCXZuY2lwaGVyCSRvdXQxLCRvdXQxLHYyNQorCXZuY2lwaGVyCSRvdXQyLCRvdXQyLHYyNQorCXZuY2lwaGVyCSRvdXQzLCRvdXQzLHYyNQorCXZuY2lwaGVyCSRvdXQ0LCRvdXQ0LHYyNQorCXZuY2lwaGVyCSRvdXQ1LCRvdXQ1LHYyNQorCXZuY2lwaGVyCSRvdXQ2LCRvdXQ2LHYyNQorCXZuY2lwaGVyCSRvdXQ3LCRvdXQ3LHYyNQorCWx2eAkJdjI1LCR4MTAsJGtleV8JCSMgcm91bmRbNF0KKwliZG56CQlMb29wX2NiY19kZWM4eF90YWlsCisKKwl2bmNpcGhlcgkkb3V0MSwkb3V0MSx2MjQKKwl2bmNpcGhlcgkkb3V0Miwkb3V0Mix2MjQKKwl2bmNpcGhlcgkkb3V0Mywkb3V0Myx2MjQKKwl2bmNpcGhlcgkkb3V0NCwkb3V0NCx2MjQKKwl2bmNpcGhlcgkkb3V0NSwkb3V0NSx2MjQKKwl2bmNpcGhlcgkkb3V0Niwkb3V0Nix2MjQKKwl2bmNpcGhlcgkkb3V0Nywkb3V0Nyx2MjQKKworCXZuY2lwaGVyCSRvdXQxLCRvdXQxLHYyNQorCXZuY2lwaGVyCSRvdXQyLCRvdXQyLHYyNQorCXZuY2lwaGVyCSRvdXQzLCRvdXQzLHYyNQorCXZuY2lwaGVyCSRvdXQ0LCRvdXQ0LHYyNQorCXZuY2lwaGVyCSRvdXQ1LCRvdXQ1LHYyNQorCXZuY2lwaGVyCSRvdXQ2LCRvdXQ2LHYyNQorCXZuY2lwaGVyCSRvdXQ3LCRvdXQ3LHYyNQorCisJdm5jaXBoZXIJJG91dDEsJG91dDEsdjI2CisJdm5jaXBoZXIJJG91dDIsJG91dDIsdjI2CisJdm5jaXBoZXIJJG91dDMsJG91dDMsdjI2CisJdm5jaXBoZXIJJG91dDQsJG91dDQsdjI2CisJdm5jaXBoZXIJJG91dDUsJG91dDUsdjI2CisJdm5jaXBoZXIJJG91dDYsJG91dDYsdjI2CisJdm5jaXBoZXIJJG91dDcsJG91dDcsdjI2CisKKwl2bmNpcGhlcgkkb3V0MSwkb3V0MSx2MjcKKwl2bmNpcGhlcgkkb3V0Miwkb3V0Mix2MjcKKwl2bmNpcGhlcgkkb3V0Mywkb3V0Myx2MjcKKwl2bmNpcGhlcgkkb3V0NCwkb3V0NCx2MjcKKwl2bmNpcGhlcgkkb3V0NSwkb3V0NSx2MjcKKwl2bmNpcGhlcgkkb3V0Niwkb3V0Nix2MjcKKwl2bmNpcGhlcgkkb3V0Nywkb3V0Nyx2MjcKKworCXZuY2lwaGVyCSRvdXQxLCRvdXQxLHYyOAorCXZuY2lwaGVyCSRvdXQyLCRvdXQyLHYyOAorCXZuY2lwaGVyCSRvdXQzLCRvdXQzLHYyOAorCXZuY2lwaGVyCSRvdXQ0LCRvdXQ0LHYyOAorCXZuY2lwaGVyCSRvdXQ1LCRvdXQ1LHYyOAorCXZuY2lwaGVyCSRvdXQ2LCRvdXQ2LHYyOAorCXZuY2lwaGVyCSRvdXQ3LCRvdXQ3LHYyOAorCisJdm5jaXBoZXIJJG91dDEsJG91dDEsdjI5CisJdm5jaXBoZXIJJG91dDIsJG91dDIsdjI5CisJdm5jaXBoZXIJJG91dDMsJG91dDMsdjI5CisJdm5jaXBoZXIJJG91dDQsJG91dDQsdjI5CisJdm5jaXBoZXIJJG91dDUsJG91dDUsdjI5CisJdm5jaXBoZXIJJG91dDYsJG91dDYsdjI5CisJdm5jaXBoZXIJJG91dDcsJG91dDcsdjI5CisKKwl2bmNpcGhlcgkkb3V0MSwkb3V0MSx2MzAKKwkgdnhvcgkJJGl2ZWMsJGl2ZWMsdjMxCQkjIGxhc3Qgcm91bmQga2V5CisJdm5jaXBoZXIJJG91dDIsJG91dDIsdjMwCisJIHZ4b3IJCSRpbjEsJGluMSx2MzEKKwl2bmNpcGhlcgkkb3V0Mywkb3V0Myx2MzAKKwkgdnhvcgkJJGluMiwkaW4yLHYzMQorCXZuY2lwaGVyCSRvdXQ0LCRvdXQ0LHYzMAorCSB2eG9yCQkkaW4zLCRpbjMsdjMxCisJdm5jaXBoZXIJJG91dDUsJG91dDUsdjMwCisJIHZ4b3IJCSRpbjQsJGluNCx2MzEKKwl2bmNpcGhlcgkkb3V0Niwkb3V0Nix2MzAKKwkgdnhvcgkJJGluNSwkaW41LHYzMQorCXZuY2lwaGVyCSRvdXQ3LCRvdXQ3LHYzMAorCSB2eG9yCQkkaW42LCRpbjYsdjMxCisKKwljbXBsd2kJCSRsZW4sMzIJCQkjIHN3aXRjaCgkbGVuKQorCWJsdAkJTGNiY19kZWM4eF9vbmUKKwlub3AKKwliZXEJCUxjYmNfZGVjOHhfdHdvCisJY21wbHdpCQkkbGVuLDY0CisJYmx0CQlMY2JjX2RlYzh4X3RocmVlCisJbm9wCisJYmVxCQlMY2JjX2RlYzh4X2ZvdXIKKwljbXBsd2kJCSRsZW4sOTYKKwlibHQJCUxjYmNfZGVjOHhfZml2ZQorCW5vcAorCWJlcQkJTGNiY19kZWM4eF9zaXgKKworTGNiY19kZWM4eF9zZXZlbjoKKwl2bmNpcGhlcmxhc3QJJG91dDEsJG91dDEsJGl2ZWMKKwl2bmNpcGhlcmxhc3QJJG91dDIsJG91dDIsJGluMQorCXZuY2lwaGVybGFzdAkkb3V0Mywkb3V0MywkaW4yCisJdm5jaXBoZXJsYXN0CSRvdXQ0LCRvdXQ0LCRpbjMKKwl2bmNpcGhlcmxhc3QJJG91dDUsJG91dDUsJGluNAorCXZuY2lwaGVybGFzdAkkb3V0Niwkb3V0NiwkaW41CisJdm5jaXBoZXJsYXN0CSRvdXQ3LCRvdXQ3LCRpbjYKKwl2bXIJCSRpdmVjLCRpbjcKKworCWxlP3ZwZXJtCSRvdXQxLCRvdXQxLCRvdXQxLCRpbnBwZXJtCisJbGU/dnBlcm0JJG91dDIsJG91dDIsJG91dDIsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQxLCR4MDAsJG91dAorCWxlP3ZwZXJtCSRvdXQzLCRvdXQzLCRvdXQzLCRpbnBwZXJtCisJc3R2eF91CQkkb3V0MiwkeDEwLCRvdXQKKwlsZT92cGVybQkkb3V0NCwkb3V0NCwkb3V0NCwkaW5wcGVybQorCXN0dnhfdQkJJG91dDMsJHgyMCwkb3V0CisJbGU/dnBlcm0JJG91dDUsJG91dDUsJG91dDUsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQ0LCR4MzAsJG91dAorCWxlP3ZwZXJtCSRvdXQ2LCRvdXQ2LCRvdXQ2LCRpbnBwZXJtCisJc3R2eF91CQkkb3V0NSwkeDQwLCRvdXQKKwlsZT92cGVybQkkb3V0Nywkb3V0Nywkb3V0NywkaW5wcGVybQorCXN0dnhfdQkJJG91dDYsJHg1MCwkb3V0CisJc3R2eF91CQkkb3V0NywkeDYwLCRvdXQKKwlhZGRpCQkkb3V0LCRvdXQsMHg3MAorCWIJCUxjYmNfZGVjOHhfZG9uZQorCisuYWxpZ24JNQorTGNiY19kZWM4eF9zaXg6CisJdm5jaXBoZXJsYXN0CSRvdXQyLCRvdXQyLCRpdmVjCisJdm5jaXBoZXJsYXN0CSRvdXQzLCRvdXQzLCRpbjIKKwl2bmNpcGhlcmxhc3QJJG91dDQsJG91dDQsJGluMworCXZuY2lwaGVybGFzdAkkb3V0NSwkb3V0NSwkaW40CisJdm5jaXBoZXJsYXN0CSRvdXQ2LCRvdXQ2LCRpbjUKKwl2bmNpcGhlcmxhc3QJJG91dDcsJG91dDcsJGluNgorCXZtcgkJJGl2ZWMsJGluNworCisJbGU/dnBlcm0JJG91dDIsJG91dDIsJG91dDIsJGlucHBlcm0KKwlsZT92cGVybQkkb3V0Mywkb3V0Mywkb3V0MywkaW5wcGVybQorCXN0dnhfdQkJJG91dDIsJHgwMCwkb3V0CisJbGU/dnBlcm0JJG91dDQsJG91dDQsJG91dDQsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQzLCR4MTAsJG91dAorCWxlP3ZwZXJtCSRvdXQ1LCRvdXQ1LCRvdXQ1LCRpbnBwZXJtCisJc3R2eF91CQkkb3V0NCwkeDIwLCRvdXQKKwlsZT92cGVybQkkb3V0Niwkb3V0Niwkb3V0NiwkaW5wcGVybQorCXN0dnhfdQkJJG91dDUsJHgzMCwkb3V0CisJbGU/dnBlcm0JJG91dDcsJG91dDcsJG91dDcsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQ2LCR4NDAsJG91dAorCXN0dnhfdQkJJG91dDcsJHg1MCwkb3V0CisJYWRkaQkJJG91dCwkb3V0LDB4NjAKKwliCQlMY2JjX2RlYzh4X2RvbmUKKworLmFsaWduCTUKK0xjYmNfZGVjOHhfZml2ZToKKwl2bmNpcGhlcmxhc3QJJG91dDMsJG91dDMsJGl2ZWMKKwl2bmNpcGhlcmxhc3QJJG91dDQsJG91dDQsJGluMworCXZuY2lwaGVybGFzdAkkb3V0NSwkb3V0NSwkaW40CisJdm5jaXBoZXJsYXN0CSRvdXQ2LCRvdXQ2LCRpbjUKKwl2bmNpcGhlcmxhc3QJJG91dDcsJG91dDcsJGluNgorCXZtcgkJJGl2ZWMsJGluNworCisJbGU/dnBlcm0JJG91dDMsJG91dDMsJG91dDMsJGlucHBlcm0KKwlsZT92cGVybQkkb3V0NCwkb3V0NCwkb3V0NCwkaW5wcGVybQorCXN0dnhfdQkJJG91dDMsJHgwMCwkb3V0CisJbGU/dnBlcm0JJG91dDUsJG91dDUsJG91dDUsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQ0LCR4MTAsJG91dAorCWxlP3ZwZXJtCSRvdXQ2LCRvdXQ2LCRvdXQ2LCRpbnBwZXJtCisJc3R2eF91CQkkb3V0NSwkeDIwLCRvdXQKKwlsZT92cGVybQkkb3V0Nywkb3V0Nywkb3V0NywkaW5wcGVybQorCXN0dnhfdQkJJG91dDYsJHgzMCwkb3V0CisJc3R2eF91CQkkb3V0NywkeDQwLCRvdXQKKwlhZGRpCQkkb3V0LCRvdXQsMHg1MAorCWIJCUxjYmNfZGVjOHhfZG9uZQorCisuYWxpZ24JNQorTGNiY19kZWM4eF9mb3VyOgorCXZuY2lwaGVybGFzdAkkb3V0NCwkb3V0NCwkaXZlYworCXZuY2lwaGVybGFzdAkkb3V0NSwkb3V0NSwkaW40CisJdm5jaXBoZXJsYXN0CSRvdXQ2LCRvdXQ2LCRpbjUKKwl2bmNpcGhlcmxhc3QJJG91dDcsJG91dDcsJGluNgorCXZtcgkJJGl2ZWMsJGluNworCisJbGU/dnBlcm0JJG91dDQsJG91dDQsJG91dDQsJGlucHBlcm0KKwlsZT92cGVybQkkb3V0NSwkb3V0NSwkb3V0NSwkaW5wcGVybQorCXN0dnhfdQkJJG91dDQsJHgwMCwkb3V0CisJbGU/dnBlcm0JJG91dDYsJG91dDYsJG91dDYsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQ1LCR4MTAsJG91dAorCWxlP3ZwZXJtCSRvdXQ3LCRvdXQ3LCRvdXQ3LCRpbnBwZXJtCisJc3R2eF91CQkkb3V0NiwkeDIwLCRvdXQKKwlzdHZ4X3UJCSRvdXQ3LCR4MzAsJG91dAorCWFkZGkJCSRvdXQsJG91dCwweDQwCisJYgkJTGNiY19kZWM4eF9kb25lCisKKy5hbGlnbgk1CitMY2JjX2RlYzh4X3RocmVlOgorCXZuY2lwaGVybGFzdAkkb3V0NSwkb3V0NSwkaXZlYworCXZuY2lwaGVybGFzdAkkb3V0Niwkb3V0NiwkaW41CisJdm5jaXBoZXJsYXN0CSRvdXQ3LCRvdXQ3LCRpbjYKKwl2bXIJCSRpdmVjLCRpbjcKKworCWxlP3ZwZXJtCSRvdXQ1LCRvdXQ1LCRvdXQ1LCRpbnBwZXJtCisJbGU/dnBlcm0JJG91dDYsJG91dDYsJG91dDYsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQ1LCR4MDAsJG91dAorCWxlP3ZwZXJtCSRvdXQ3LCRvdXQ3LCRvdXQ3LCRpbnBwZXJtCisJc3R2eF91CQkkb3V0NiwkeDEwLCRvdXQKKwlzdHZ4X3UJCSRvdXQ3LCR4MjAsJG91dAorCWFkZGkJCSRvdXQsJG91dCwweDMwCisJYgkJTGNiY19kZWM4eF9kb25lCisKKy5hbGlnbgk1CitMY2JjX2RlYzh4X3R3bzoKKwl2bmNpcGhlcmxhc3QJJG91dDYsJG91dDYsJGl2ZWMKKwl2bmNpcGhlcmxhc3QJJG91dDcsJG91dDcsJGluNgorCXZtcgkJJGl2ZWMsJGluNworCisJbGU/dnBlcm0JJG91dDYsJG91dDYsJG91dDYsJGlucHBlcm0KKwlsZT92cGVybQkkb3V0Nywkb3V0Nywkb3V0NywkaW5wcGVybQorCXN0dnhfdQkJJG91dDYsJHgwMCwkb3V0CisJc3R2eF91CQkkb3V0NywkeDEwLCRvdXQKKwlhZGRpCQkkb3V0LCRvdXQsMHgyMAorCWIJCUxjYmNfZGVjOHhfZG9uZQorCisuYWxpZ24JNQorTGNiY19kZWM4eF9vbmU6CisJdm5jaXBoZXJsYXN0CSRvdXQ3LCRvdXQ3LCRpdmVjCisJdm1yCQkkaXZlYywkaW43CisKKwlsZT92cGVybQkkb3V0Nywkb3V0Nywkb3V0NywkaW5wcGVybQorCXN0dnhfdQkJJG91dDcsMCwkb3V0CisJYWRkaQkJJG91dCwkb3V0LDB4MTAKKworTGNiY19kZWM4eF9kb25lOgorCWxlP3ZwZXJtCSRpdmVjLCRpdmVjLCRpdmVjLCRpbnBwZXJtCisJc3R2eF91CQkkaXZlYywwLCRpdnAJCSMgd3JpdGUgW3VuYWxpZ25lZF0gaXYKKworCWxpCQlyMTAsYCRGUkFNRSsxNWAKKwlsaQkJcjExLGAkRlJBTUUrMzFgCisJc3R2eAkJJGlucHBlcm0scjEwLCRzcAkjIHdpcGUgY29waWVzIG9mIHJvdW5kIGtleXMKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJJGlucHBlcm0scjExLCRzcAorCWFkZGkJCXIxMSxyMTEsMzIKKwlzdHZ4CQkkaW5wcGVybSxyMTAsJHNwCisJYWRkaQkJcjEwLHIxMCwzMgorCXN0dngJCSRpbnBwZXJtLHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJJGlucHBlcm0scjEwLCRzcAorCWFkZGkJCXIxMCxyMTAsMzIKKwlzdHZ4CQkkaW5wcGVybSxyMTEsJHNwCisJYWRkaQkJcjExLHIxMSwzMgorCXN0dngJCSRpbnBwZXJtLHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJJGlucHBlcm0scjExLCRzcAorCWFkZGkJCXIxMSxyMTEsMzIKKworCW10c3ByCQkyNTYsJHZyc2F2ZQorCWx2eAkJdjIwLHIxMCwkc3AJCSMgQUJJIHNheXMgc28KKwlhZGRpCQlyMTAscjEwLDMyCisJbHZ4CQl2MjEscjExLCRzcAorCWFkZGkJCXIxMSxyMTEsMzIKKwlsdngJCXYyMixyMTAsJHNwCisJYWRkaQkJcjEwLHIxMCwzMgorCWx2eAkJdjIzLHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJbHZ4CQl2MjQscjEwLCRzcAorCWFkZGkJCXIxMCxyMTAsMzIKKwlsdngJCXYyNSxyMTEsJHNwCisJYWRkaQkJcjExLHIxMSwzMgorCWx2eAkJdjI2LHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJbHZ4CQl2MjcscjExLCRzcAorCWFkZGkJCXIxMSxyMTEsMzIKKwlsdngJCXYyOCxyMTAsJHNwCisJYWRkaQkJcjEwLHIxMCwzMgorCWx2eAkJdjI5LHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJbHZ4CQl2MzAscjEwLCRzcAorCWx2eAkJdjMxLHIxMSwkc3AKKwkkUE9QCQlyMjYsYCRGUkFNRSsyMSoxNiswKiRTSVpFX1RgKCRzcCkKKwkkUE9QCQlyMjcsYCRGUkFNRSsyMSoxNisxKiRTSVpFX1RgKCRzcCkKKwkkUE9QCQlyMjgsYCRGUkFNRSsyMSoxNisyKiRTSVpFX1RgKCRzcCkKKwkkUE9QCQlyMjksYCRGUkFNRSsyMSoxNiszKiRTSVpFX1RgKCRzcCkKKwkkUE9QCQlyMzAsYCRGUkFNRSsyMSoxNis0KiRTSVpFX1RgKCRzcCkKKwkkUE9QCQlyMzEsYCRGUkFNRSsyMSoxNis1KiRTSVpFX1RgKCRzcCkKKwlhZGRpCQkkc3AsJHNwLGAkRlJBTUUrMjEqMTYrNiokU0laRV9UYAorCWJscgorCS5sb25nCQkwCisJLmJ5dGUJCTAsMTIsMHgxNCwwLDB4ODAsNiw2LDAKKwkubG9uZwkJMAorLnNpemUJLiR7cHJlZml4fV9jYmNfZW5jcnlwdCwuLS4ke3ByZWZpeH1fY2JjX2VuY3J5cHQKK19fXworfX0JfX19CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3t7ewkjIENUUiBwcm9jZWR1cmVbc10JCQkJCQkjCitteSAoJGlucCwkb3V0LCRsZW4sJGtleSwkaXZwLCR4MTAsJHJvdW5kcywkaWR4KT1tYXAoInIkXyIsKDMuLjEwKSk7CitteSAoJHJuZGtleTAsJHJuZGtleTEsJGlub3V0LCR0bXApPQkJbWFwKCJ2JF8iLCgwLi4zKSk7CitteSAoJGl2ZWMsJGlucHRhaWwsJGlucHBlcm0sJG91dGhlYWQsJG91dHBlcm0sJG91dG1hc2ssJGtleXBlcm0sJG9uZSk9CisJCQkJCQltYXAoInYkXyIsKDQuLjExKSk7CitteSAkZGF0PSR0bXA7CisKKyRjb2RlLj08PF9fXzsKKy5nbG9ibAkuJHtwcmVmaXh9X2N0cjMyX2VuY3J5cHRfYmxvY2tzCisJJHtVQ01QfWkJJGxlbiwxCisJYmx0bHItCisKKwlsaXMJCXIwLDB4ZmZmMAorCW1mc3ByCQkkdnJzYXZlLDI1NgorCW10c3ByCQkyNTYscjAKKworCWxpCQkkaWR4LDE1CisJdnhvcgkJJHJuZGtleTAsJHJuZGtleTAsJHJuZGtleTAKKwlsZT92c3BsdGlzYgkkdG1wLDB4MGYKKworCWx2eAkJJGl2ZWMsMCwkaXZwCQkjIGxvYWQgW3VuYWxpZ25lZF0gaXYKKwlsdnNsCQkkaW5wcGVybSwwLCRpdnAKKwlsdngJCSRpbnB0YWlsLCRpZHgsJGl2cAorCSB2c3BsdGlzYgkkb25lLDEKKwlsZT92eG9yCQkkaW5wcGVybSwkaW5wcGVybSwkdG1wCisJdnBlcm0JCSRpdmVjLCRpdmVjLCRpbnB0YWlsLCRpbnBwZXJtCisJIHZzbGRvaQkJJG9uZSwkcm5ka2V5MCwkb25lLDEKKworCW5lZwkJcjExLCRpbnAKKwk/bHZzbAkJJGtleXBlcm0sMCwka2V5CQkjIHByZXBhcmUgZm9yIHVuYWxpZ25lZCBrZXkKKwlsd3oJCSRyb3VuZHMsMjQwKCRrZXkpCisKKwlsdnNyCQkkaW5wcGVybSwwLHIxMQkJIyBwcmVwYXJlIGZvciB1bmFsaWduZWQgbG9hZAorCWx2eAkJJGlucHRhaWwsMCwkaW5wCisJYWRkaQkJJGlucCwkaW5wLDE1CQkjIDE1IGlzIG5vdCB0eXBvCisJbGU/dnhvcgkJJGlucHBlcm0sJGlucHBlcm0sJHRtcAorCisJc3J3aQkJJHJvdW5kcywkcm91bmRzLDEKKwlsaQkJJGlkeCwxNgorCXN1YmkJCSRyb3VuZHMsJHJvdW5kcywxCisKKwkke1VDTVB9aQkkbGVuLDgKKwliZ2UJCV9hZXNwOF9jdHIzMl9lbmNyeXB0OHgKKworCT9sdnNyCQkkb3V0cGVybSwwLCRvdXQJCSMgcHJlcGFyZSBmb3IgdW5hbGlnbmVkIHN0b3JlCisJdnNwbHRpc2IJJG91dG1hc2ssLTEKKwlsdngJCSRvdXRoZWFkLDAsJG91dAorCT92cGVybQkJJG91dG1hc2ssJHJuZGtleTAsJG91dG1hc2ssJG91dHBlcm0KKwlsZT92eG9yCQkkb3V0cGVybSwkb3V0cGVybSwkdG1wCisKKwlsdngJCSRybmRrZXkwLDAsJGtleQorCW10Y3RyCQkkcm91bmRzCisJbHZ4CQkkcm5ka2V5MSwkaWR4LCRrZXkKKwlhZGRpCQkkaWR4LCRpZHgsMTYKKwk/dnBlcm0JCSRybmRrZXkwLCRybmRrZXkwLCRybmRrZXkxLCRrZXlwZXJtCisJdnhvcgkJJGlub3V0LCRpdmVjLCRybmRrZXkwCisJbHZ4CQkkcm5ka2V5MCwkaWR4LCRrZXkKKwlhZGRpCQkkaWR4LCRpZHgsMTYKKwliCQlMb29wX2N0cjMyX2VuYworCisuYWxpZ24JNQorTG9vcF9jdHIzMl9lbmM6CisJP3ZwZXJtCQkkcm5ka2V5MSwkcm5ka2V5MSwkcm5ka2V5MCwka2V5cGVybQorCXZjaXBoZXIJCSRpbm91dCwkaW5vdXQsJHJuZGtleTEKKwlsdngJCSRybmRrZXkxLCRpZHgsJGtleQorCWFkZGkJCSRpZHgsJGlkeCwxNgorCT92cGVybQkJJHJuZGtleTAsJHJuZGtleTAsJHJuZGtleTEsJGtleXBlcm0KKwl2Y2lwaGVyCQkkaW5vdXQsJGlub3V0LCRybmRrZXkwCisJbHZ4CQkkcm5ka2V5MCwkaWR4LCRrZXkKKwlhZGRpCQkkaWR4LCRpZHgsMTYKKwliZG56CQlMb29wX2N0cjMyX2VuYworCisJdmFkZHV3bQkJJGl2ZWMsJGl2ZWMsJG9uZQorCSB2bXIJCSRkYXQsJGlucHRhaWwKKwkgbHZ4CQkkaW5wdGFpbCwwLCRpbnAKKwkgYWRkaQkJJGlucCwkaW5wLDE2CisJIHN1YmljLgkJJGxlbiwkbGVuLDEJCSMgYmxvY2tzLS0KKworCT92cGVybQkJJHJuZGtleTEsJHJuZGtleTEsJHJuZGtleTAsJGtleXBlcm0KKwl2Y2lwaGVyCQkkaW5vdXQsJGlub3V0LCRybmRrZXkxCisJbHZ4CQkkcm5ka2V5MSwkaWR4LCRrZXkKKwkgdnBlcm0JCSRkYXQsJGRhdCwkaW5wdGFpbCwkaW5wcGVybQorCSBsaQkJJGlkeCwxNgorCT92cGVybQkJJHJuZGtleTEsJHJuZGtleTAsJHJuZGtleTEsJGtleXBlcm0KKwkgbHZ4CQkkcm5ka2V5MCwwLCRrZXkKKwl2eG9yCQkkZGF0LCRkYXQsJHJuZGtleTEJIyBsYXN0IHJvdW5kIGtleQorCXZjaXBoZXJsYXN0CSRpbm91dCwkaW5vdXQsJGRhdAorCisJIGx2eAkJJHJuZGtleTEsJGlkeCwka2V5CisJIGFkZGkJCSRpZHgsJGlkeCwxNgorCXZwZXJtCQkkaW5vdXQsJGlub3V0LCRpbm91dCwkb3V0cGVybQorCXZzZWwJCSRkYXQsJG91dGhlYWQsJGlub3V0LCRvdXRtYXNrCisJIG10Y3RyCQkkcm91bmRzCisJID92cGVybQkJJHJuZGtleTAsJHJuZGtleTAsJHJuZGtleTEsJGtleXBlcm0KKwl2bXIJCSRvdXRoZWFkLCRpbm91dAorCSB2eG9yCQkkaW5vdXQsJGl2ZWMsJHJuZGtleTAKKwkgbHZ4CQkkcm5ka2V5MCwkaWR4LCRrZXkKKwkgYWRkaQkJJGlkeCwkaWR4LDE2CisJc3R2eAkJJGRhdCwwLCRvdXQKKwlhZGRpCQkkb3V0LCRvdXQsMTYKKwlibmUJCUxvb3BfY3RyMzJfZW5jCisKKwlhZGRpCQkkb3V0LCRvdXQsLTEKKwlsdngJCSRpbm91dCwwLCRvdXQJCSMgcmVkdW5kYW50IGluIGFsaWduZWQgY2FzZQorCXZzZWwJCSRpbm91dCwkb3V0aGVhZCwkaW5vdXQsJG91dG1hc2sKKwlzdHZ4CQkkaW5vdXQsMCwkb3V0CisKKwltdHNwcgkJMjU2LCR2cnNhdmUKKwlibHIKKwkubG9uZwkJMAorCS5ieXRlCQkwLDEyLDB4MTQsMCwwLDAsNiwwCisJLmxvbmcJCTAKK19fXworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwore3sJIyBPcHRpbWl6ZWQgQ1RSIHByb2NlZHVyZQkJCQkJIworbXkgJGtleV89InIxMSI7CitteSAoJHgwMCwkeDEwLCR4MjAsJHgzMCwkeDQwLCR4NTAsJHg2MCwkeDcwKT1tYXAoInIkXyIsKDAsOCwyNi4uMzEpKTsKK215ICgkaW4wLCAkaW4xLCAkaW4yLCAkaW4zLCAkaW40LCAkaW41LCAkaW42LCAkaW43ICk9bWFwKCJ2JF8iLCgwLi4zLDEwLDEyLi4xNCkpOworbXkgKCRvdXQwLCRvdXQxLCRvdXQyLCRvdXQzLCRvdXQ0LCRvdXQ1LCRvdXQ2LCRvdXQ3KT1tYXAoInYkXyIsKDE1Li4yMikpOworbXkgJHJuZGtleTA9InYyMyI7CSMgdjI0LXYyNSByb3RhdGluZyBidWZmZXIgZm9yIGZpcnN0IGZvdW5kIGtleXMKKwkJCSMgdjI2LXYzMSBsYXN0IDYgcm91bmQga2V5cworbXkgKCR0bXAsJGtleXBlcm0pPSgkaW4zLCRpbjQpOwkjIGFsaWFzZXMgd2l0aCAiY2FsbGVyIiwgcmVkdW5kYW50IGFzc2lnbm1lbnQKK215ICgkdHdvLCR0aHJlZSwkZm91cik9KCRvdXRoZWFkLCRvdXRwZXJtLCRvdXRtYXNrKTsKKworJGNvZGUuPTw8X19fOworLmFsaWduCTUKK19hZXNwOF9jdHIzMl9lbmNyeXB0OHg6CisJJFNUVQkJJHNwLC1gKCRGUkFNRSsyMSoxNis2KiRTSVpFX1QpYCgkc3ApCisJbGkJCXIxMCxgJEZSQU1FKzgqMTYrMTVgCisJbGkJCXIxMSxgJEZSQU1FKzgqMTYrMzFgCisJc3R2eAkJdjIwLHIxMCwkc3AJCSMgQUJJIHNheXMgc28KKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJdjIxLHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJdjIyLHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJdjIzLHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJdjI0LHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJdjI1LHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJdjI2LHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJdjI3LHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJdjI4LHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJdjI5LHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJdjMwLHIxMCwkc3AKKwlzdHZ4CQl2MzEscjExLCRzcAorCWxpCQlyMCwtMQorCXN0dwkJJHZyc2F2ZSxgJEZSQU1FKzIxKjE2LTRgKCRzcCkJIyBzYXZlIHZyc2F2ZQorCWxpCQkkeDEwLDB4MTAKKwkkUFVTSAkJcjI2LGAkRlJBTUUrMjEqMTYrMCokU0laRV9UYCgkc3ApCisJbGkJCSR4MjAsMHgyMAorCSRQVVNICQlyMjcsYCRGUkFNRSsyMSoxNisxKiRTSVpFX1RgKCRzcCkKKwlsaQkJJHgzMCwweDMwCisJJFBVU0gJCXIyOCxgJEZSQU1FKzIxKjE2KzIqJFNJWkVfVGAoJHNwKQorCWxpCQkkeDQwLDB4NDAKKwkkUFVTSAkJcjI5LGAkRlJBTUUrMjEqMTYrMyokU0laRV9UYCgkc3ApCisJbGkJCSR4NTAsMHg1MAorCSRQVVNICQlyMzAsYCRGUkFNRSsyMSoxNis0KiRTSVpFX1RgKCRzcCkKKwlsaQkJJHg2MCwweDYwCisJJFBVU0gJCXIzMSxgJEZSQU1FKzIxKjE2KzUqJFNJWkVfVGAoJHNwKQorCWxpCQkkeDcwLDB4NzAKKwltdHNwcgkJMjU2LHIwCisKKwlzdWJpCQkkcm91bmRzLCRyb3VuZHMsMwkjIC00IGluIHRvdGFsCisKKwlsdngJCSRybmRrZXkwLCR4MDAsJGtleQkjIGxvYWQga2V5IHNjaGVkdWxlCisJbHZ4CQl2MzAsJHgxMCwka2V5CisJYWRkaQkJJGtleSwka2V5LDB4MjAKKwlsdngJCXYzMSwkeDAwLCRrZXkKKwk/dnBlcm0JCSRybmRrZXkwLCRybmRrZXkwLHYzMCwka2V5cGVybQorCWFkZGkJCSRrZXlfLCRzcCwkRlJBTUUrMTUKKwltdGN0cgkJJHJvdW5kcworCitMb2FkX2N0cjMyX2VuY19rZXk6CisJP3ZwZXJtCQl2MjQsdjMwLHYzMSwka2V5cGVybQorCWx2eAkJdjMwLCR4MTAsJGtleQorCWFkZGkJCSRrZXksJGtleSwweDIwCisJc3R2eAkJdjI0LCR4MDAsJGtleV8JCSMgb2ZmLWxvYWQgcm91bmRbMV0KKwk/dnBlcm0JCXYyNSx2MzEsdjMwLCRrZXlwZXJtCisJbHZ4CQl2MzEsJHgwMCwka2V5CisJc3R2eAkJdjI1LCR4MTAsJGtleV8JCSMgb2ZmLWxvYWQgcm91bmRbMl0KKwlhZGRpCQkka2V5Xywka2V5XywweDIwCisJYmRuegkJTG9hZF9jdHIzMl9lbmNfa2V5CisKKwlsdngJCXYyNiwkeDEwLCRrZXkKKwk/dnBlcm0JCXYyNCx2MzAsdjMxLCRrZXlwZXJtCisJbHZ4CQl2MjcsJHgyMCwka2V5CisJc3R2eAkJdjI0LCR4MDAsJGtleV8JCSMgb2ZmLWxvYWQgcm91bmRbM10KKwk/dnBlcm0JCXYyNSx2MzEsdjI2LCRrZXlwZXJtCisJbHZ4CQl2MjgsJHgzMCwka2V5CisJc3R2eAkJdjI1LCR4MTAsJGtleV8JCSMgb2ZmLWxvYWQgcm91bmRbNF0KKwlhZGRpCQkka2V5Xywkc3AsJEZSQU1FKzE1CSMgcmV3aW5kICRrZXlfCisJP3ZwZXJtCQl2MjYsdjI2LHYyNywka2V5cGVybQorCWx2eAkJdjI5LCR4NDAsJGtleQorCT92cGVybQkJdjI3LHYyNyx2MjgsJGtleXBlcm0KKwlsdngJCXYzMCwkeDUwLCRrZXkKKwk/dnBlcm0JCXYyOCx2MjgsdjI5LCRrZXlwZXJtCisJbHZ4CQl2MzEsJHg2MCwka2V5CisJP3ZwZXJtCQl2MjksdjI5LHYzMCwka2V5cGVybQorCWx2eAkJJG91dDAsJHg3MCwka2V5CQkjIGJvcnJvdyAkb3V0MAorCT92cGVybQkJdjMwLHYzMCx2MzEsJGtleXBlcm0KKwlsdngJCXYyNCwkeDAwLCRrZXlfCQkjIHByZS1sb2FkIHJvdW5kWzFdCisJP3ZwZXJtCQl2MzEsdjMxLCRvdXQwLCRrZXlwZXJtCisJbHZ4CQl2MjUsJHgxMCwka2V5XwkJIyBwcmUtbG9hZCByb3VuZFsyXQorCisJdmFkZHV3bQkJJHR3bywkb25lLCRvbmUKKwlzdWJpCQkkaW5wLCRpbnAsMTUJCSMgdW5kbyAiY2FsbGVyIgorCSRTSEwJCSRsZW4sJGxlbiw0CisKKwl2YWRkdXdtCQkkb3V0MSwkaXZlYywkb25lCSMgY291bnRlciB2YWx1ZXMgLi4uCisJdmFkZHV3bQkJJG91dDIsJGl2ZWMsJHR3bworCXZ4b3IJCSRvdXQwLCRpdmVjLCRybmRrZXkwCSMgLi4uIHhvcmVkIHdpdGggcm5ka2V5WzBdCisJIGxlP2xpCQkkaWR4LDgKKwl2YWRkdXdtCQkkb3V0Mywkb3V0MSwkdHdvCisJdnhvcgkJJG91dDEsJG91dDEsJHJuZGtleTAKKwkgbGU/bHZzbAkkaW5wcGVybSwwLCRpZHgKKwl2YWRkdXdtCQkkb3V0NCwkb3V0MiwkdHdvCisJdnhvcgkJJG91dDIsJG91dDIsJHJuZGtleTAKKwkgbGU/dnNwbHRpc2IJJHRtcCwweDBmCisJdmFkZHV3bQkJJG91dDUsJG91dDMsJHR3bworCXZ4b3IJCSRvdXQzLCRvdXQzLCRybmRrZXkwCisJIGxlP3Z4b3IJJGlucHBlcm0sJGlucHBlcm0sJHRtcAkjIHRyYW5zZm9ybSBmb3IgbHZ4X3Uvc3R2eF91CisJdmFkZHV3bQkJJG91dDYsJG91dDQsJHR3bworCXZ4b3IJCSRvdXQ0LCRvdXQ0LCRybmRrZXkwCisJdmFkZHV3bQkJJG91dDcsJG91dDUsJHR3bworCXZ4b3IJCSRvdXQ1LCRvdXQ1LCRybmRrZXkwCisJdmFkZHV3bQkJJGl2ZWMsJG91dDYsJHR3bwkjIG5leHQgY291bnRlciB2YWx1ZQorCXZ4b3IJCSRvdXQ2LCRvdXQ2LCRybmRrZXkwCisJdnhvcgkJJG91dDcsJG91dDcsJHJuZGtleTAKKworCW10Y3RyCQkkcm91bmRzCisJYgkJTG9vcF9jdHIzMl9lbmM4eAorLmFsaWduCTUKK0xvb3BfY3RyMzJfZW5jOHg6CisJdmNpcGhlciAJJG91dDAsJG91dDAsdjI0CisJdmNpcGhlciAJJG91dDEsJG91dDEsdjI0CisJdmNpcGhlciAJJG91dDIsJG91dDIsdjI0CisJdmNpcGhlciAJJG91dDMsJG91dDMsdjI0CisJdmNpcGhlciAJJG91dDQsJG91dDQsdjI0CisJdmNpcGhlciAJJG91dDUsJG91dDUsdjI0CisJdmNpcGhlciAJJG91dDYsJG91dDYsdjI0CisJdmNpcGhlciAJJG91dDcsJG91dDcsdjI0CitMb29wX2N0cjMyX2VuYzh4X21pZGRsZToKKwlsdngJCXYyNCwkeDIwLCRrZXlfCQkjIHJvdW5kWzNdCisJYWRkaQkJJGtleV8sJGtleV8sMHgyMAorCisJdmNpcGhlciAJJG91dDAsJG91dDAsdjI1CisJdmNpcGhlciAJJG91dDEsJG91dDEsdjI1CisJdmNpcGhlciAJJG91dDIsJG91dDIsdjI1CisJdmNpcGhlciAJJG91dDMsJG91dDMsdjI1CisJdmNpcGhlciAJJG91dDQsJG91dDQsdjI1CisJdmNpcGhlciAJJG91dDUsJG91dDUsdjI1CisJdmNpcGhlciAJJG91dDYsJG91dDYsdjI1CisJdmNpcGhlciAJJG91dDcsJG91dDcsdjI1CisJbHZ4CQl2MjUsJHgxMCwka2V5XwkJIyByb3VuZFs0XQorCWJkbnoJCUxvb3BfY3RyMzJfZW5jOHgKKworCXN1YmljCQlyMTEsJGxlbiwyNTYJCSMgJGxlbi0yNTYsIGJvcnJvdyAka2V5XworCXZjaXBoZXIgCSRvdXQwLCRvdXQwLHYyNAorCXZjaXBoZXIgCSRvdXQxLCRvdXQxLHYyNAorCXZjaXBoZXIgCSRvdXQyLCRvdXQyLHYyNAorCXZjaXBoZXIgCSRvdXQzLCRvdXQzLHYyNAorCXZjaXBoZXIgCSRvdXQ0LCRvdXQ0LHYyNAorCXZjaXBoZXIgCSRvdXQ1LCRvdXQ1LHYyNAorCXZjaXBoZXIgCSRvdXQ2LCRvdXQ2LHYyNAorCXZjaXBoZXIgCSRvdXQ3LCRvdXQ3LHYyNAorCisJc3ViZmUJCXIwLHIwLHIwCQkjIGJvcnJvdz8tMTowCisJdmNpcGhlciAJJG91dDAsJG91dDAsdjI1CisJdmNpcGhlciAJJG91dDEsJG91dDEsdjI1CisJdmNpcGhlciAJJG91dDIsJG91dDIsdjI1CisJdmNpcGhlciAJJG91dDMsJG91dDMsdjI1CisJdmNpcGhlciAJJG91dDQsJG91dDQsdjI1CisJdmNpcGhlcgkJJG91dDUsJG91dDUsdjI1CisJdmNpcGhlcgkJJG91dDYsJG91dDYsdjI1CisJdmNpcGhlcgkJJG91dDcsJG91dDcsdjI1CisKKwlhbmQJCXIwLHIwLHIxMQorCWFkZGkJCSRrZXlfLCRzcCwkRlJBTUUrMTUJIyByZXdpbmQgJGtleV8KKwl2Y2lwaGVyCQkkb3V0MCwkb3V0MCx2MjYKKwl2Y2lwaGVyCQkkb3V0MSwkb3V0MSx2MjYKKwl2Y2lwaGVyCQkkb3V0Miwkb3V0Mix2MjYKKwl2Y2lwaGVyCQkkb3V0Mywkb3V0Myx2MjYKKwl2Y2lwaGVyCQkkb3V0NCwkb3V0NCx2MjYKKwl2Y2lwaGVyCQkkb3V0NSwkb3V0NSx2MjYKKwl2Y2lwaGVyCQkkb3V0Niwkb3V0Nix2MjYKKwl2Y2lwaGVyCQkkb3V0Nywkb3V0Nyx2MjYKKwlsdngJCXYyNCwkeDAwLCRrZXlfCQkjIHJlLXByZS1sb2FkIHJvdW5kWzFdCisKKwlzdWJpYwkJJGxlbiwkbGVuLDEyOQkJIyAkbGVuLT0xMjkKKwl2Y2lwaGVyCQkkb3V0MCwkb3V0MCx2MjcKKwlhZGRpCQkkbGVuLCRsZW4sMQkJIyAkbGVuLT0xMjggcmVhbGx5CisJdmNpcGhlcgkJJG91dDEsJG91dDEsdjI3CisJdmNpcGhlcgkJJG91dDIsJG91dDIsdjI3CisJdmNpcGhlcgkJJG91dDMsJG91dDMsdjI3CisJdmNpcGhlcgkJJG91dDQsJG91dDQsdjI3CisJdmNpcGhlcgkJJG91dDUsJG91dDUsdjI3CisJdmNpcGhlcgkJJG91dDYsJG91dDYsdjI3CisJdmNpcGhlcgkJJG91dDcsJG91dDcsdjI3CisJbHZ4CQl2MjUsJHgxMCwka2V5XwkJIyByZS1wcmUtbG9hZCByb3VuZFsyXQorCisJdmNpcGhlcgkJJG91dDAsJG91dDAsdjI4CisJIGx2eF91CQkkaW4wLCR4MDAsJGlucAkJIyBsb2FkIGlucHV0CisJdmNpcGhlcgkJJG91dDEsJG91dDEsdjI4CisJIGx2eF91CQkkaW4xLCR4MTAsJGlucAorCXZjaXBoZXIJCSRvdXQyLCRvdXQyLHYyOAorCSBsdnhfdQkJJGluMiwkeDIwLCRpbnAKKwl2Y2lwaGVyCQkkb3V0Mywkb3V0Myx2MjgKKwkgbHZ4X3UJCSRpbjMsJHgzMCwkaW5wCisJdmNpcGhlcgkJJG91dDQsJG91dDQsdjI4CisJIGx2eF91CQkkaW40LCR4NDAsJGlucAorCXZjaXBoZXIJCSRvdXQ1LCRvdXQ1LHYyOAorCSBsdnhfdQkJJGluNSwkeDUwLCRpbnAKKwl2Y2lwaGVyCQkkb3V0Niwkb3V0Nix2MjgKKwkgbHZ4X3UJCSRpbjYsJHg2MCwkaW5wCisJdmNpcGhlcgkJJG91dDcsJG91dDcsdjI4CisJIGx2eF91CQkkaW43LCR4NzAsJGlucAorCSBhZGRpCQkkaW5wLCRpbnAsMHg4MAorCisJdmNpcGhlcgkJJG91dDAsJG91dDAsdjI5CisJIGxlP3ZwZXJtCSRpbjAsJGluMCwkaW4wLCRpbnBwZXJtCisJdmNpcGhlcgkJJG91dDEsJG91dDEsdjI5CisJIGxlP3ZwZXJtCSRpbjEsJGluMSwkaW4xLCRpbnBwZXJtCisJdmNpcGhlcgkJJG91dDIsJG91dDIsdjI5CisJIGxlP3ZwZXJtCSRpbjIsJGluMiwkaW4yLCRpbnBwZXJtCisJdmNpcGhlcgkJJG91dDMsJG91dDMsdjI5CisJIGxlP3ZwZXJtCSRpbjMsJGluMywkaW4zLCRpbnBwZXJtCisJdmNpcGhlcgkJJG91dDQsJG91dDQsdjI5CisJIGxlP3ZwZXJtCSRpbjQsJGluNCwkaW40LCRpbnBwZXJtCisJdmNpcGhlcgkJJG91dDUsJG91dDUsdjI5CisJIGxlP3ZwZXJtCSRpbjUsJGluNSwkaW41LCRpbnBwZXJtCisJdmNpcGhlcgkJJG91dDYsJG91dDYsdjI5CisJIGxlP3ZwZXJtCSRpbjYsJGluNiwkaW42LCRpbnBwZXJtCisJdmNpcGhlcgkJJG91dDcsJG91dDcsdjI5CisJIGxlP3ZwZXJtCSRpbjcsJGluNywkaW43LCRpbnBwZXJtCisKKwlhZGQJCSRpbnAsJGlucCxyMAkJIyAkaW5wIGlzIGFkanVzdGVkIGluIHN1Y2gKKwkJCQkJCSMgd2F5IHRoYXQgYXQgZXhpdCBmcm9tIHRoZQorCQkJCQkJIyBsb29wIGluWC1pbjcgYXJlIGxvYWRlZAorCQkJCQkJIyB3aXRoIGxhc3QgIndvcmRzIgorCXN1YmZlLgkJcjAscjAscjAJCSMgYm9ycm93Py0xOjAKKwl2Y2lwaGVyCQkkb3V0MCwkb3V0MCx2MzAKKwkgdnhvcgkJJGluMCwkaW4wLHYzMQkJIyB4b3Igd2l0aCBsYXN0IHJvdW5kIGtleQorCXZjaXBoZXIJCSRvdXQxLCRvdXQxLHYzMAorCSB2eG9yCQkkaW4xLCRpbjEsdjMxCisJdmNpcGhlcgkJJG91dDIsJG91dDIsdjMwCisJIHZ4b3IJCSRpbjIsJGluMix2MzEKKwl2Y2lwaGVyCQkkb3V0Mywkb3V0Myx2MzAKKwkgdnhvcgkJJGluMywkaW4zLHYzMQorCXZjaXBoZXIJCSRvdXQ0LCRvdXQ0LHYzMAorCSB2eG9yCQkkaW40LCRpbjQsdjMxCisJdmNpcGhlcgkJJG91dDUsJG91dDUsdjMwCisJIHZ4b3IJCSRpbjUsJGluNSx2MzEKKwl2Y2lwaGVyCQkkb3V0Niwkb3V0Nix2MzAKKwkgdnhvcgkJJGluNiwkaW42LHYzMQorCXZjaXBoZXIJCSRvdXQ3LCRvdXQ3LHYzMAorCSB2eG9yCQkkaW43LCRpbjcsdjMxCisKKwlibmUJCUxjdHIzMl9lbmM4eF9icmVhawkjIGRpZCAkbGVuLTEyOSBib3Jyb3c/CisKKwl2Y2lwaGVybGFzdAkkaW4wLCRvdXQwLCRpbjAKKwl2Y2lwaGVybGFzdAkkaW4xLCRvdXQxLCRpbjEKKwkgdmFkZHV3bQkkb3V0MSwkaXZlYywkb25lCSMgY291bnRlciB2YWx1ZXMgLi4uCisJdmNpcGhlcmxhc3QJJGluMiwkb3V0MiwkaW4yCisJIHZhZGR1d20JJG91dDIsJGl2ZWMsJHR3bworCSB2eG9yCQkkb3V0MCwkaXZlYywkcm5ka2V5MAkjIC4uLiB4b3JlZCB3aXRoIHJuZGtleVswXQorCXZjaXBoZXJsYXN0CSRpbjMsJG91dDMsJGluMworCSB2YWRkdXdtCSRvdXQzLCRvdXQxLCR0d28KKwkgdnhvcgkJJG91dDEsJG91dDEsJHJuZGtleTAKKwl2Y2lwaGVybGFzdAkkaW40LCRvdXQ0LCRpbjQKKwkgdmFkZHV3bQkkb3V0NCwkb3V0MiwkdHdvCisJIHZ4b3IJCSRvdXQyLCRvdXQyLCRybmRrZXkwCisJdmNpcGhlcmxhc3QJJGluNSwkb3V0NSwkaW41CisJIHZhZGR1d20JJG91dDUsJG91dDMsJHR3bworCSB2eG9yCQkkb3V0Mywkb3V0Mywkcm5ka2V5MAorCXZjaXBoZXJsYXN0CSRpbjYsJG91dDYsJGluNgorCSB2YWRkdXdtCSRvdXQ2LCRvdXQ0LCR0d28KKwkgdnhvcgkJJG91dDQsJG91dDQsJHJuZGtleTAKKwl2Y2lwaGVybGFzdAkkaW43LCRvdXQ3LCRpbjcKKwkgdmFkZHV3bQkkb3V0Nywkb3V0NSwkdHdvCisJIHZ4b3IJCSRvdXQ1LCRvdXQ1LCRybmRrZXkwCisJbGU/dnBlcm0JJGluMCwkaW4wLCRpbjAsJGlucHBlcm0KKwkgdmFkZHV3bQkkaXZlYywkb3V0NiwkdHdvCSMgbmV4dCBjb3VudGVyIHZhbHVlCisJIHZ4b3IJCSRvdXQ2LCRvdXQ2LCRybmRrZXkwCisJbGU/dnBlcm0JJGluMSwkaW4xLCRpbjEsJGlucHBlcm0KKwkgdnhvcgkJJG91dDcsJG91dDcsJHJuZGtleTAKKwltdGN0cgkJJHJvdW5kcworCisJIHZjaXBoZXIJJG91dDAsJG91dDAsdjI0CisJc3R2eF91CQkkaW4wLCR4MDAsJG91dAorCWxlP3ZwZXJtCSRpbjIsJGluMiwkaW4yLCRpbnBwZXJtCisJIHZjaXBoZXIJJG91dDEsJG91dDEsdjI0CisJc3R2eF91CQkkaW4xLCR4MTAsJG91dAorCWxlP3ZwZXJtCSRpbjMsJGluMywkaW4zLCRpbnBwZXJtCisJIHZjaXBoZXIJJG91dDIsJG91dDIsdjI0CisJc3R2eF91CQkkaW4yLCR4MjAsJG91dAorCWxlP3ZwZXJtCSRpbjQsJGluNCwkaW40LCRpbnBwZXJtCisJIHZjaXBoZXIJJG91dDMsJG91dDMsdjI0CisJc3R2eF91CQkkaW4zLCR4MzAsJG91dAorCWxlP3ZwZXJtCSRpbjUsJGluNSwkaW41LCRpbnBwZXJtCisJIHZjaXBoZXIJJG91dDQsJG91dDQsdjI0CisJc3R2eF91CQkkaW40LCR4NDAsJG91dAorCWxlP3ZwZXJtCSRpbjYsJGluNiwkaW42LCRpbnBwZXJtCisJIHZjaXBoZXIJJG91dDUsJG91dDUsdjI0CisJc3R2eF91CQkkaW41LCR4NTAsJG91dAorCWxlP3ZwZXJtCSRpbjcsJGluNywkaW43LCRpbnBwZXJtCisJIHZjaXBoZXIJJG91dDYsJG91dDYsdjI0CisJc3R2eF91CQkkaW42LCR4NjAsJG91dAorCSB2Y2lwaGVyCSRvdXQ3LCRvdXQ3LHYyNAorCXN0dnhfdQkJJGluNywkeDcwLCRvdXQKKwlhZGRpCQkkb3V0LCRvdXQsMHg4MAorCisJYgkJTG9vcF9jdHIzMl9lbmM4eF9taWRkbGUKKworLmFsaWduCTUKK0xjdHIzMl9lbmM4eF9icmVhazoKKwljbXB3aQkJJGxlbiwtMHg2MAorCWJsdAkJTGN0cjMyX2VuYzh4X29uZQorCW5vcAorCWJlcQkJTGN0cjMyX2VuYzh4X3R3bworCWNtcHdpCQkkbGVuLC0weDQwCisJYmx0CQlMY3RyMzJfZW5jOHhfdGhyZWUKKwlub3AKKwliZXEJCUxjdHIzMl9lbmM4eF9mb3VyCisJY21wd2kJCSRsZW4sLTB4MjAKKwlibHQJCUxjdHIzMl9lbmM4eF9maXZlCisJbm9wCisJYmVxCQlMY3RyMzJfZW5jOHhfc2l4CisJY21wd2kJCSRsZW4sMHgwMAorCWJsdAkJTGN0cjMyX2VuYzh4X3NldmVuCisKK0xjdHIzMl9lbmM4eF9laWdodDoKKwl2Y2lwaGVybGFzdAkkb3V0MCwkb3V0MCwkaW4wCisJdmNpcGhlcmxhc3QJJG91dDEsJG91dDEsJGluMQorCXZjaXBoZXJsYXN0CSRvdXQyLCRvdXQyLCRpbjIKKwl2Y2lwaGVybGFzdAkkb3V0Mywkb3V0MywkaW4zCisJdmNpcGhlcmxhc3QJJG91dDQsJG91dDQsJGluNAorCXZjaXBoZXJsYXN0CSRvdXQ1LCRvdXQ1LCRpbjUKKwl2Y2lwaGVybGFzdAkkb3V0Niwkb3V0NiwkaW42CisJdmNpcGhlcmxhc3QJJG91dDcsJG91dDcsJGluNworCisJbGU/dnBlcm0JJG91dDAsJG91dDAsJG91dDAsJGlucHBlcm0KKwlsZT92cGVybQkkb3V0MSwkb3V0MSwkb3V0MSwkaW5wcGVybQorCXN0dnhfdQkJJG91dDAsJHgwMCwkb3V0CisJbGU/dnBlcm0JJG91dDIsJG91dDIsJG91dDIsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQxLCR4MTAsJG91dAorCWxlP3ZwZXJtCSRvdXQzLCRvdXQzLCRvdXQzLCRpbnBwZXJtCisJc3R2eF91CQkkb3V0MiwkeDIwLCRvdXQKKwlsZT92cGVybQkkb3V0NCwkb3V0NCwkb3V0NCwkaW5wcGVybQorCXN0dnhfdQkJJG91dDMsJHgzMCwkb3V0CisJbGU/dnBlcm0JJG91dDUsJG91dDUsJG91dDUsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQ0LCR4NDAsJG91dAorCWxlP3ZwZXJtCSRvdXQ2LCRvdXQ2LCRvdXQ2LCRpbnBwZXJtCisJc3R2eF91CQkkb3V0NSwkeDUwLCRvdXQKKwlsZT92cGVybQkkb3V0Nywkb3V0Nywkb3V0NywkaW5wcGVybQorCXN0dnhfdQkJJG91dDYsJHg2MCwkb3V0CisJc3R2eF91CQkkb3V0NywkeDcwLCRvdXQKKwlhZGRpCQkkb3V0LCRvdXQsMHg4MAorCWIJCUxjdHIzMl9lbmM4eF9kb25lCisKKy5hbGlnbgk1CitMY3RyMzJfZW5jOHhfc2V2ZW46CisJdmNpcGhlcmxhc3QJJG91dDAsJG91dDAsJGluMQorCXZjaXBoZXJsYXN0CSRvdXQxLCRvdXQxLCRpbjIKKwl2Y2lwaGVybGFzdAkkb3V0Miwkb3V0MiwkaW4zCisJdmNpcGhlcmxhc3QJJG91dDMsJG91dDMsJGluNAorCXZjaXBoZXJsYXN0CSRvdXQ0LCRvdXQ0LCRpbjUKKwl2Y2lwaGVybGFzdAkkb3V0NSwkb3V0NSwkaW42CisJdmNpcGhlcmxhc3QJJG91dDYsJG91dDYsJGluNworCisJbGU/dnBlcm0JJG91dDAsJG91dDAsJG91dDAsJGlucHBlcm0KKwlsZT92cGVybQkkb3V0MSwkb3V0MSwkb3V0MSwkaW5wcGVybQorCXN0dnhfdQkJJG91dDAsJHgwMCwkb3V0CisJbGU/dnBlcm0JJG91dDIsJG91dDIsJG91dDIsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQxLCR4MTAsJG91dAorCWxlP3ZwZXJtCSRvdXQzLCRvdXQzLCRvdXQzLCRpbnBwZXJtCisJc3R2eF91CQkkb3V0MiwkeDIwLCRvdXQKKwlsZT92cGVybQkkb3V0NCwkb3V0NCwkb3V0NCwkaW5wcGVybQorCXN0dnhfdQkJJG91dDMsJHgzMCwkb3V0CisJbGU/dnBlcm0JJG91dDUsJG91dDUsJG91dDUsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQ0LCR4NDAsJG91dAorCWxlP3ZwZXJtCSRvdXQ2LCRvdXQ2LCRvdXQ2LCRpbnBwZXJtCisJc3R2eF91CQkkb3V0NSwkeDUwLCRvdXQKKwlzdHZ4X3UJCSRvdXQ2LCR4NjAsJG91dAorCWFkZGkJCSRvdXQsJG91dCwweDcwCisJYgkJTGN0cjMyX2VuYzh4X2RvbmUKKworLmFsaWduCTUKK0xjdHIzMl9lbmM4eF9zaXg6CisJdmNpcGhlcmxhc3QJJG91dDAsJG91dDAsJGluMgorCXZjaXBoZXJsYXN0CSRvdXQxLCRvdXQxLCRpbjMKKwl2Y2lwaGVybGFzdAkkb3V0Miwkb3V0MiwkaW40CisJdmNpcGhlcmxhc3QJJG91dDMsJG91dDMsJGluNQorCXZjaXBoZXJsYXN0CSRvdXQ0LCRvdXQ0LCRpbjYKKwl2Y2lwaGVybGFzdAkkb3V0NSwkb3V0NSwkaW43CisKKwlsZT92cGVybQkkb3V0MCwkb3V0MCwkb3V0MCwkaW5wcGVybQorCWxlP3ZwZXJtCSRvdXQxLCRvdXQxLCRvdXQxLCRpbnBwZXJtCisJc3R2eF91CQkkb3V0MCwkeDAwLCRvdXQKKwlsZT92cGVybQkkb3V0Miwkb3V0Miwkb3V0MiwkaW5wcGVybQorCXN0dnhfdQkJJG91dDEsJHgxMCwkb3V0CisJbGU/dnBlcm0JJG91dDMsJG91dDMsJG91dDMsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQyLCR4MjAsJG91dAorCWxlP3ZwZXJtCSRvdXQ0LCRvdXQ0LCRvdXQ0LCRpbnBwZXJtCisJc3R2eF91CQkkb3V0MywkeDMwLCRvdXQKKwlsZT92cGVybQkkb3V0NSwkb3V0NSwkb3V0NSwkaW5wcGVybQorCXN0dnhfdQkJJG91dDQsJHg0MCwkb3V0CisJc3R2eF91CQkkb3V0NSwkeDUwLCRvdXQKKwlhZGRpCQkkb3V0LCRvdXQsMHg2MAorCWIJCUxjdHIzMl9lbmM4eF9kb25lCisKKy5hbGlnbgk1CitMY3RyMzJfZW5jOHhfZml2ZToKKwl2Y2lwaGVybGFzdAkkb3V0MCwkb3V0MCwkaW4zCisJdmNpcGhlcmxhc3QJJG91dDEsJG91dDEsJGluNAorCXZjaXBoZXJsYXN0CSRvdXQyLCRvdXQyLCRpbjUKKwl2Y2lwaGVybGFzdAkkb3V0Mywkb3V0MywkaW42CisJdmNpcGhlcmxhc3QJJG91dDQsJG91dDQsJGluNworCisJbGU/dnBlcm0JJG91dDAsJG91dDAsJG91dDAsJGlucHBlcm0KKwlsZT92cGVybQkkb3V0MSwkb3V0MSwkb3V0MSwkaW5wcGVybQorCXN0dnhfdQkJJG91dDAsJHgwMCwkb3V0CisJbGU/dnBlcm0JJG91dDIsJG91dDIsJG91dDIsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQxLCR4MTAsJG91dAorCWxlP3ZwZXJtCSRvdXQzLCRvdXQzLCRvdXQzLCRpbnBwZXJtCisJc3R2eF91CQkkb3V0MiwkeDIwLCRvdXQKKwlsZT92cGVybQkkb3V0NCwkb3V0NCwkb3V0NCwkaW5wcGVybQorCXN0dnhfdQkJJG91dDMsJHgzMCwkb3V0CisJc3R2eF91CQkkb3V0NCwkeDQwLCRvdXQKKwlhZGRpCQkkb3V0LCRvdXQsMHg1MAorCWIJCUxjdHIzMl9lbmM4eF9kb25lCisKKy5hbGlnbgk1CitMY3RyMzJfZW5jOHhfZm91cjoKKwl2Y2lwaGVybGFzdAkkb3V0MCwkb3V0MCwkaW40CisJdmNpcGhlcmxhc3QJJG91dDEsJG91dDEsJGluNQorCXZjaXBoZXJsYXN0CSRvdXQyLCRvdXQyLCRpbjYKKwl2Y2lwaGVybGFzdAkkb3V0Mywkb3V0MywkaW43CisKKwlsZT92cGVybQkkb3V0MCwkb3V0MCwkb3V0MCwkaW5wcGVybQorCWxlP3ZwZXJtCSRvdXQxLCRvdXQxLCRvdXQxLCRpbnBwZXJtCisJc3R2eF91CQkkb3V0MCwkeDAwLCRvdXQKKwlsZT92cGVybQkkb3V0Miwkb3V0Miwkb3V0MiwkaW5wcGVybQorCXN0dnhfdQkJJG91dDEsJHgxMCwkb3V0CisJbGU/dnBlcm0JJG91dDMsJG91dDMsJG91dDMsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQyLCR4MjAsJG91dAorCXN0dnhfdQkJJG91dDMsJHgzMCwkb3V0CisJYWRkaQkJJG91dCwkb3V0LDB4NDAKKwliCQlMY3RyMzJfZW5jOHhfZG9uZQorCisuYWxpZ24JNQorTGN0cjMyX2VuYzh4X3RocmVlOgorCXZjaXBoZXJsYXN0CSRvdXQwLCRvdXQwLCRpbjUKKwl2Y2lwaGVybGFzdAkkb3V0MSwkb3V0MSwkaW42CisJdmNpcGhlcmxhc3QJJG91dDIsJG91dDIsJGluNworCisJbGU/dnBlcm0JJG91dDAsJG91dDAsJG91dDAsJGlucHBlcm0KKwlsZT92cGVybQkkb3V0MSwkb3V0MSwkb3V0MSwkaW5wcGVybQorCXN0dnhfdQkJJG91dDAsJHgwMCwkb3V0CisJbGU/dnBlcm0JJG91dDIsJG91dDIsJG91dDIsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQxLCR4MTAsJG91dAorCXN0dnhfdQkJJG91dDIsJHgyMCwkb3V0CisJYWRkaQkJJG91dCwkb3V0LDB4MzAKKwliCQlMY2JjX2RlYzh4X2RvbmUKKworLmFsaWduCTUKK0xjdHIzMl9lbmM4eF90d286CisJdmNpcGhlcmxhc3QJJG91dDAsJG91dDAsJGluNgorCXZjaXBoZXJsYXN0CSRvdXQxLCRvdXQxLCRpbjcKKworCWxlP3ZwZXJtCSRvdXQwLCRvdXQwLCRvdXQwLCRpbnBwZXJtCisJbGU/dnBlcm0JJG91dDEsJG91dDEsJG91dDEsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQwLCR4MDAsJG91dAorCXN0dnhfdQkJJG91dDEsJHgxMCwkb3V0CisJYWRkaQkJJG91dCwkb3V0LDB4MjAKKwliCQlMY2JjX2RlYzh4X2RvbmUKKworLmFsaWduCTUKK0xjdHIzMl9lbmM4eF9vbmU6CisJdmNpcGhlcmxhc3QJJG91dDAsJG91dDAsJGluNworCisJbGU/dnBlcm0JJG91dDAsJG91dDAsJG91dDAsJGlucHBlcm0KKwlzdHZ4X3UJCSRvdXQwLDAsJG91dAorCWFkZGkJCSRvdXQsJG91dCwweDEwCisKK0xjdHIzMl9lbmM4eF9kb25lOgorCWxpCQlyMTAsYCRGUkFNRSsxNWAKKwlsaQkJcjExLGAkRlJBTUUrMzFgCisJc3R2eAkJJGlucHBlcm0scjEwLCRzcAkjIHdpcGUgY29waWVzIG9mIHJvdW5kIGtleXMKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJJGlucHBlcm0scjExLCRzcAorCWFkZGkJCXIxMSxyMTEsMzIKKwlzdHZ4CQkkaW5wcGVybSxyMTAsJHNwCisJYWRkaQkJcjEwLHIxMCwzMgorCXN0dngJCSRpbnBwZXJtLHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJc3R2eAkJJGlucHBlcm0scjEwLCRzcAorCWFkZGkJCXIxMCxyMTAsMzIKKwlzdHZ4CQkkaW5wcGVybSxyMTEsJHNwCisJYWRkaQkJcjExLHIxMSwzMgorCXN0dngJCSRpbnBwZXJtLHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJc3R2eAkJJGlucHBlcm0scjExLCRzcAorCWFkZGkJCXIxMSxyMTEsMzIKKworCW10c3ByCQkyNTYsJHZyc2F2ZQorCWx2eAkJdjIwLHIxMCwkc3AJCSMgQUJJIHNheXMgc28KKwlhZGRpCQlyMTAscjEwLDMyCisJbHZ4CQl2MjEscjExLCRzcAorCWFkZGkJCXIxMSxyMTEsMzIKKwlsdngJCXYyMixyMTAsJHNwCisJYWRkaQkJcjEwLHIxMCwzMgorCWx2eAkJdjIzLHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJbHZ4CQl2MjQscjEwLCRzcAorCWFkZGkJCXIxMCxyMTAsMzIKKwlsdngJCXYyNSxyMTEsJHNwCisJYWRkaQkJcjExLHIxMSwzMgorCWx2eAkJdjI2LHIxMCwkc3AKKwlhZGRpCQlyMTAscjEwLDMyCisJbHZ4CQl2MjcscjExLCRzcAorCWFkZGkJCXIxMSxyMTEsMzIKKwlsdngJCXYyOCxyMTAsJHNwCisJYWRkaQkJcjEwLHIxMCwzMgorCWx2eAkJdjI5LHIxMSwkc3AKKwlhZGRpCQlyMTEscjExLDMyCisJbHZ4CQl2MzAscjEwLCRzcAorCWx2eAkJdjMxLHIxMSwkc3AKKwkkUE9QCQlyMjYsYCRGUkFNRSsyMSoxNiswKiRTSVpFX1RgKCRzcCkKKwkkUE9QCQlyMjcsYCRGUkFNRSsyMSoxNisxKiRTSVpFX1RgKCRzcCkKKwkkUE9QCQlyMjgsYCRGUkFNRSsyMSoxNisyKiRTSVpFX1RgKCRzcCkKKwkkUE9QCQlyMjksYCRGUkFNRSsyMSoxNiszKiRTSVpFX1RgKCRzcCkKKwkkUE9QCQlyMzAsYCRGUkFNRSsyMSoxNis0KiRTSVpFX1RgKCRzcCkKKwkkUE9QCQlyMzEsYCRGUkFNRSsyMSoxNis1KiRTSVpFX1RgKCRzcCkKKwlhZGRpCQkkc3AsJHNwLGAkRlJBTUUrMjEqMTYrNiokU0laRV9UYAorCWJscgorCS5sb25nCQkwCisJLmJ5dGUJCTAsMTIsMHgxNCwwLDB4ODAsNiw2LDAKKwkubG9uZwkJMAorLnNpemUJLiR7cHJlZml4fV9jdHIzMl9lbmNyeXB0X2Jsb2NrcywuLS4ke3ByZWZpeH1fY3RyMzJfZW5jcnlwdF9ibG9ja3MKK19fXworfX0JfX19CisKK215ICRjb25zdHM9MTsKK2ZvcmVhY2goc3BsaXQoIlxuIiwkY29kZSkpIHsKKyAgICAgICAgcy9cYChbXlxgXSopXGAvZXZhbCgkMSkvZ2VvOworCisJIyBjb25zdGFudHMgdGFibGUgZW5kaWFuLXNwZWNpZmljIGNvbnZlcnNpb24KKwlpZiAoJGNvbnN0cyAmJiBtL1wuKGxvbmd8Ynl0ZSlccysoLispXHMrKFw/W2Etel0qKSQvbykgeworCSAgICBteSAkY29udj0kMzsKKwkgICAgbXkgQGJ5dGVzPSgpOworCisJICAgICMgY29udmVydCB0byBlbmRpYW4tYWdub3N0aWMgZm9ybWF0CisJICAgIGlmICgkMSBlcSAibG9uZyIpIHsKKwkgICAgICBmb3JlYWNoIChzcGxpdCgvLFxzKi8sJDIpKSB7CisJCW15ICRsID0gL14wLz9vY3Q6aW50OworCQlwdXNoIEBieXRlcywoJGw+PjI0KSYweGZmLCgkbD4+MTYpJjB4ZmYsKCRsPj44KSYweGZmLCRsJjB4ZmY7CisJICAgICAgfQorCSAgICB9IGVsc2UgeworCQlAYnl0ZXMgPSBtYXAoL14wLz9vY3Q6aW50LHNwbGl0KC8sXHMqLywkMikpOworCSAgICB9CisKKwkgICAgIyBsaXR0bGUtZW5kaWFuIGNvbnZlcnNpb24KKwkgICAgaWYgKCRmbGF2b3VyID1+IC9sZSQvbykgeworCQlTV0lUQ0g6IGZvcigkY29udikgIHsKKwkJICAgIC9cP2ludi8gJiYgZG8gICB7IEBieXRlcz1tYXAoJF9eMHhmLEBieXRlcyk7IGxhc3Q7IH07CisJCSAgICAvXD9yZXYvICYmIGRvICAgeyBAYnl0ZXM9cmV2ZXJzZShAYnl0ZXMpOyAgICBsYXN0OyB9OyAKKwkJfQorCSAgICB9CisKKwkgICAgI2VtaXQKKwkgICAgcHJpbnQgIi5ieXRlXHQiLGpvaW4oJywnLG1hcCAoc3ByaW50ZigiMHglMDJ4IiwkXyksQGJ5dGVzKSksIlxuIjsKKwkgICAgbmV4dDsKKwl9CisJJGNvbnN0cz0wIGlmIChtL0xjb25zdHM6L28pOwkjIGVuZCBvZiB0YWJsZQorCisJIyBpbnN0cnVjdGlvbnMgcHJlZml4ZWQgd2l0aCAnPycgYXJlIGVuZGlhbi1zcGVjaWZpYyBhbmQgbmVlZAorCSMgdG8gYmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuLi4KKwlpZiAoJGZsYXZvdXIgPX4gL2xlJC9vKSB7CSMgbGl0dGxlLWVuZGlhbgorCSAgICBzL2xlXD8vL28JCW9yCisJICAgIHMvYmVcPy8jYmUjL28Jb3IKKwkgICAgcy9cP2x2c3IvbHZzbC9vCW9yCisJICAgIHMvXD9sdnNsL2x2c3IvbwlvcgorCSAgICBzL1w/KHZwZXJtXHMrdlswLTldKyxccyopKHZbMC05XSssXHMqKSh2WzAtOV0rLFxzKikodlswLTldKykvJDEkMyQyJDQvbyBvcgorCSAgICBzL1w/KHZzbGRvaVxzK3ZbMC05XSssXHMqKSh2WzAtOV0rLClccyoodlswLTldKyxccyopKFswLTldKykvJDEkMyQyIDE2LSQ0L28gb3IKKwkgICAgcy9cPyh2c3BsdHdccyt2WzAtOV0rLFxzKikodlswLTldKywpXHMqKFswLTldKS8kMSQyIDMtJDMvbzsKKwl9IGVsc2UgewkJCSMgYmlnLWVuZGlhbgorCSAgICBzL2xlXD8vI2xlIy9vCW9yCisJICAgIHMvYmVcPy8vbwkJb3IKKwkgICAgcy9cPyhbYS16XSspLyQxL287CisJfQorCisgICAgICAgIHByaW50ICRfLCJcbiI7Cit9CisKK2Nsb3NlIFNURE9VVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3ZteC9naGFzaC5jIGIvZHJpdmVycy9jcnlwdG8vdm14L2doYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmZmUyNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL3ZteC9naGFzaC5jCkBAIC0wLDAgKzEsMjE0IEBACisvKioKKyAqIEdIQVNIIHJvdXRpbmVzIHN1cHBvcnRpbmcgVk1YIGluc3RydWN0aW9ucyBvbiB0aGUgUG93ZXIgOAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvbmx5LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBBdXRob3I6IE1hcmNlbG8gSGVucmlxdWUgQ2VycmkgPG1oY2VycmlAYnIuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxhc20vc3dpdGNoX3RvLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2Flcy5oPgorI2luY2x1ZGUgPGNyeXB0by9zY2F0dGVyd2Fsay5oPgorI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2IxMjhvcHMuaD4KKworI2RlZmluZSBJTl9JTlRFUlJVUFQgaW5faW50ZXJydXB0KCkKKworI2RlZmluZSBHSEFTSF9CTE9DS19TSVpFICgxNikKKyNkZWZpbmUgR0hBU0hfRElHRVNUX1NJWkUgKDE2KQorI2RlZmluZSBHSEFTSF9LRVlfTEVOICgxNikKKwordm9pZCBnY21faW5pdF9wOCh1MTI4IGh0YWJsZVsxNl0sIGNvbnN0IHU2NCBYaVsyXSk7Cit2b2lkIGdjbV9nbXVsdF9wOCh1NjQgWGlbMl0sIGNvbnN0IHUxMjggaHRhYmxlWzE2XSk7Cit2b2lkIGdjbV9naGFzaF9wOCh1NjQgWGlbMl0sIGNvbnN0IHUxMjggaHRhYmxlWzE2XSwKKyAgICAgICAgY29uc3QgdTggKmluLHNpemVfdCBsZW4pOworCitzdHJ1Y3QgcDhfZ2hhc2hfY3R4IHsKKyAgICB1MTI4IGh0YWJsZVsxNl07CisgICAgc3RydWN0IGNyeXB0b19zaGFzaCAqZmFsbGJhY2s7Cit9OworCitzdHJ1Y3QgcDhfZ2hhc2hfZGVzY19jdHggeworICAgIHU2NCBzaGFzaFsyXTsKKyAgICB1OCBidWZmZXJbR0hBU0hfRElHRVNUX1NJWkVdOworICAgIGludCBieXRlczsKKyAgICBzdHJ1Y3Qgc2hhc2hfZGVzYyBmYWxsYmFja19kZXNjOworfTsKKworc3RhdGljIGludCBwOF9naGFzaF9pbml0X3RmbShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQoreworICAgIGNvbnN0IGNoYXIgKmFsZzsKKyAgICBzdHJ1Y3QgY3J5cHRvX3NoYXNoICpmYWxsYmFjazsKKyAgICBzdHJ1Y3QgY3J5cHRvX3NoYXNoICpzaGFzaF90Zm0gPSBfX2NyeXB0b19zaGFzaF9jYXN0KHRmbSk7CisgICAgc3RydWN0IHA4X2doYXNoX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgodGZtKTsKKworICAgIGlmICghKGFsZyA9IGNyeXB0b190Zm1fYWxnX25hbWUodGZtKSkpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZ2V0IGFsZ29yaXRobSBuYW1lLlxuIik7CisgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgIH0KKworICAgIGZhbGxiYWNrID0gY3J5cHRvX2FsbG9jX3NoYXNoKGFsZywgMCAsQ1JZUFRPX0FMR19ORUVEX0ZBTExCQUNLKTsKKyAgICBpZiAoSVNfRVJSKGZhbGxiYWNrKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSB0cmFuc2Zvcm1hdGlvbiBmb3IgJyVzJzogJWxkXG4iLAorICAgICAgICAgICAgICAgIGFsZywgUFRSX0VSUihmYWxsYmFjaykpOworICAgICAgICByZXR1cm4gUFRSX0VSUihmYWxsYmFjayk7CisgICAgfQorICAgIHByaW50ayhLRVJOX0lORk8gIlVzaW5nICclcycgYXMgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24uXG4iLAorICAgICAgICAgICAgY3J5cHRvX3RmbV9hbGdfZHJpdmVyX25hbWUoY3J5cHRvX3NoYXNoX3RmbShmYWxsYmFjaykpKTsKKworICAgIGNyeXB0b19zaGFzaF9zZXRfZmxhZ3MoZmFsbGJhY2ssCisgICAgICAgICAgICBjcnlwdG9fc2hhc2hfZ2V0X2ZsYWdzKChzdHJ1Y3QgY3J5cHRvX3NoYXNoICopIHRmbSkpOworICAgIGN0eC0+ZmFsbGJhY2sgPSBmYWxsYmFjazsKKworICAgIHNoYXNoX3RmbS0+ZGVzY3NpemUgPSBzaXplb2Yoc3RydWN0IHA4X2doYXNoX2Rlc2NfY3R4KQorICAgICAgICArIGNyeXB0b19zaGFzaF9kZXNjc2l6ZShmYWxsYmFjayk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcDhfZ2hhc2hfZXhpdF90Zm0oc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKK3sKKyAgICBzdHJ1Y3QgcDhfZ2hhc2hfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eCh0Zm0pOworCisgICAgaWYgKGN0eC0+ZmFsbGJhY2spIHsKKyAgICAgICAgY3J5cHRvX2ZyZWVfc2hhc2goY3R4LT5mYWxsYmFjayk7CisgICAgICAgIGN0eC0+ZmFsbGJhY2sgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIGludCBwOF9naGFzaF9pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQoreworICAgIHN0cnVjdCBwOF9naGFzaF9jdHggKmN0eCA9IGNyeXB0b190Zm1fY3R4KGNyeXB0b19zaGFzaF90Zm0oZGVzYy0+dGZtKSk7CisgICAgc3RydWN0IHA4X2doYXNoX2Rlc2NfY3R4ICpkY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKyAgICBkY3R4LT5ieXRlcyA9IDA7CisgICAgbWVtc2V0KGRjdHgtPnNoYXNoLCAwLCBHSEFTSF9ESUdFU1RfU0laRSk7CisgICAgZGN0eC0+ZmFsbGJhY2tfZGVzYy50Zm0gPSBjdHgtPmZhbGxiYWNrOworICAgIGRjdHgtPmZhbGxiYWNrX2Rlc2MuZmxhZ3MgPSBkZXNjLT5mbGFnczsKKyAgICByZXR1cm4gY3J5cHRvX3NoYXNoX2luaXQoJmRjdHgtPmZhbGxiYWNrX2Rlc2MpOworfQorCitzdGF0aWMgaW50IHA4X2doYXNoX3NldGtleShzdHJ1Y3QgY3J5cHRvX3NoYXNoICp0Zm0sIGNvbnN0IHU4ICprZXksCisgICAgdW5zaWduZWQgaW50IGtleWxlbikKK3sKKyAgICBzdHJ1Y3QgcDhfZ2hhc2hfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fc2hhc2hfdGZtKHRmbSkpOworCisgICAgaWYgKGtleWxlbiAhPSBHSEFTSF9LRVlfTEVOKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIHBhZ2VmYXVsdF9kaXNhYmxlKCk7CisgICAgZW5hYmxlX2tlcm5lbF9hbHRpdmVjKCk7CisgICAgZW5hYmxlX2tlcm5lbF9mcCgpOworICAgIGdjbV9pbml0X3A4KGN0eC0+aHRhYmxlLCAoY29uc3QgdTY0ICopIGtleSk7CisgICAgcGFnZWZhdWx0X2VuYWJsZSgpOworICAgIHJldHVybiBjcnlwdG9fc2hhc2hfc2V0a2V5KGN0eC0+ZmFsbGJhY2ssIGtleSwga2V5bGVuKTsKK30KKworc3RhdGljIGludCBwOF9naGFzaF91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsCisgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzcmNsZW4pCit7CisgICAgdW5zaWduZWQgaW50IGxlbjsKKyAgICBzdHJ1Y3QgcDhfZ2hhc2hfY3R4ICpjdHggPSBjcnlwdG9fdGZtX2N0eChjcnlwdG9fc2hhc2hfdGZtKGRlc2MtPnRmbSkpOworICAgIHN0cnVjdCBwOF9naGFzaF9kZXNjX2N0eCAqZGN0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisgICAgaWYgKElOX0lOVEVSUlVQVCkgeworICAgICAgICByZXR1cm4gY3J5cHRvX3NoYXNoX3VwZGF0ZSgmZGN0eC0+ZmFsbGJhY2tfZGVzYywgc3JjLCBzcmNsZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkY3R4LT5ieXRlcykgeworICAgICAgICAgICAgaWYgKGRjdHgtPmJ5dGVzICsgc3JjbGVuIDwgR0hBU0hfRElHRVNUX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZGN0eC0+YnVmZmVyICsgZGN0eC0+Ynl0ZXMsIHNyYywgc3JjbGVuKTsKKyAgICAgICAgICAgICAgICBkY3R4LT5ieXRlcyArPSBzcmNsZW47CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoZGN0eC0+YnVmZmVyICsgZGN0eC0+Ynl0ZXMsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgR0hBU0hfRElHRVNUX1NJWkUgLSBkY3R4LT5ieXRlcyk7CisgICAgICAgICAgICBwYWdlZmF1bHRfZGlzYWJsZSgpOworICAgICAgICAgICAgZW5hYmxlX2tlcm5lbF9hbHRpdmVjKCk7CisgICAgICAgICAgICBlbmFibGVfa2VybmVsX2ZwKCk7CisgICAgICAgICAgICBnY21fZ2hhc2hfcDgoZGN0eC0+c2hhc2gsIGN0eC0+aHRhYmxlLCBkY3R4LT5idWZmZXIsCisgICAgICAgICAgICAgICAgICAgIEdIQVNIX0RJR0VTVF9TSVpFKTsKKyAgICAgICAgICAgIHBhZ2VmYXVsdF9lbmFibGUoKTsKKyAgICAgICAgICAgIHNyYyArPSBHSEFTSF9ESUdFU1RfU0laRSAtIGRjdHgtPmJ5dGVzOworICAgICAgICAgICAgc3JjbGVuIC09IEdIQVNIX0RJR0VTVF9TSVpFIC0gZGN0eC0+Ynl0ZXM7CisgICAgICAgICAgICBkY3R4LT5ieXRlcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gc3JjbGVuICYgfihHSEFTSF9ESUdFU1RfU0laRSAtIDEpOworICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICBwYWdlZmF1bHRfZGlzYWJsZSgpOworICAgICAgICAgICAgZW5hYmxlX2tlcm5lbF9hbHRpdmVjKCk7CisgICAgICAgICAgICBlbmFibGVfa2VybmVsX2ZwKCk7CisgICAgICAgICAgICBnY21fZ2hhc2hfcDgoZGN0eC0+c2hhc2gsIGN0eC0+aHRhYmxlLCBzcmMsIGxlbik7CisgICAgICAgICAgICBwYWdlZmF1bHRfZW5hYmxlKCk7CisgICAgICAgICAgICBzcmMgKz0gbGVuOworICAgICAgICAgICAgc3JjbGVuIC09IGxlbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjbGVuKSB7CisgICAgICAgICAgICBtZW1jcHkoZGN0eC0+YnVmZmVyLCBzcmMsIHNyY2xlbik7CisgICAgICAgICAgICBkY3R4LT5ieXRlcyA9IHNyY2xlbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcDhfZ2hhc2hfZmluYWwoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IHA4X2doYXNoX2N0eCAqY3R4ID0gY3J5cHRvX3RmbV9jdHgoY3J5cHRvX3NoYXNoX3RmbShkZXNjLT50Zm0pKTsKKyAgICBzdHJ1Y3QgcDhfZ2hhc2hfZGVzY19jdHggKmRjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKworICAgIGlmIChJTl9JTlRFUlJVUFQpIHsKKyAgICAgICAgcmV0dXJuIGNyeXB0b19zaGFzaF9maW5hbCgmZGN0eC0+ZmFsbGJhY2tfZGVzYywgb3V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGN0eC0+Ynl0ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IGRjdHgtPmJ5dGVzOyBpIDwgR0hBU0hfRElHRVNUX1NJWkU7IGkrKykKKyAgICAgICAgICAgICAgICBkY3R4LT5idWZmZXJbaV0gPSAwOworICAgICAgICAgICAgcGFnZWZhdWx0X2Rpc2FibGUoKTsKKyAgICAgICAgICAgIGVuYWJsZV9rZXJuZWxfYWx0aXZlYygpOworICAgICAgICAgICAgZW5hYmxlX2tlcm5lbF9mcCgpOworICAgICAgICAgICAgZ2NtX2doYXNoX3A4KGRjdHgtPnNoYXNoLCBjdHgtPmh0YWJsZSwgZGN0eC0+YnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBHSEFTSF9ESUdFU1RfU0laRSk7CisgICAgICAgICAgICBwYWdlZmF1bHRfZW5hYmxlKCk7CisgICAgICAgICAgICBkY3R4LT5ieXRlcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KG91dCwgZGN0eC0+c2hhc2gsIEdIQVNIX0RJR0VTVF9TSVpFKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdHJ1Y3Qgc2hhc2hfYWxnIHA4X2doYXNoX2FsZyA9IHsKKyAgICAuZGlnZXN0c2l6ZSA9IEdIQVNIX0RJR0VTVF9TSVpFLAorICAgIC5pbml0ICAgICAgID0gcDhfZ2hhc2hfaW5pdCwKKyAgICAudXBkYXRlICAgICA9IHA4X2doYXNoX3VwZGF0ZSwKKyAgICAuZmluYWwgICAgICA9IHA4X2doYXNoX2ZpbmFsLAorICAgIC5zZXRrZXkgICAgID0gcDhfZ2hhc2hfc2V0a2V5LAorICAgIC5kZXNjc2l6ZSAgID0gc2l6ZW9mKHN0cnVjdCBwOF9naGFzaF9kZXNjX2N0eCksCisgICAgLmJhc2UgICAgICAgPSB7CisgICAgICAgIC5jcmFfbmFtZSA9ICJnaGFzaCIsCisgICAgICAgIC5jcmFfZHJpdmVyX25hbWUgPSAicDhfZ2hhc2giLAorICAgICAgICAuY3JhX3ByaW9yaXR5ID0gMTAwMCwKKyAgICAgICAgLmNyYV9mbGFncyA9IENSWVBUT19BTEdfVFlQRV9TSEFTSCB8IENSWVBUT19BTEdfTkVFRF9GQUxMQkFDSywKKyAgICAgICAgLmNyYV9ibG9ja3NpemUgPSBHSEFTSF9CTE9DS19TSVpFLAorICAgICAgICAuY3JhX2N0eHNpemUgPSBzaXplb2Yoc3RydWN0IHA4X2doYXNoX2N0eCksCisgICAgICAgIC5jcmFfbW9kdWxlID0gVEhJU19NT0RVTEUsCisgICAgICAgIC5jcmFfaW5pdCA9IHA4X2doYXNoX2luaXRfdGZtLAorICAgICAgICAuY3JhX2V4aXQgPSBwOF9naGFzaF9leGl0X3RmbSwKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3ZteC9naGFzaHA4LXBwYy5wbCBiL2RyaXZlcnMvY3J5cHRvL3ZteC9naGFzaHA4LXBwYy5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTZmODk5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jcnlwdG8vdm14L2doYXNocDgtcHBjLnBsCkBAIC0wLDAgKzEsMjI4IEBACisjIS91c3IvYmluL2VudiBwZXJsCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdyaXR0ZW4gYnkgQW5keSBQb2x5YWtvdiA8YXBwcm9Ab3BlbnNzbC5vcmc+IGZvciB0aGUgT3BlblNTTAorIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCisjIENSWVBUT0dBTVMgbGljZW5zZXMgZGVwZW5kaW5nIG9uIHdoZXJlIHlvdSBvYnRhaW4gaXQuIEZvciBmdXJ0aGVyCisjIGRldGFpbHMgc2VlIGh0dHA6Ly93d3cub3BlbnNzbC5vcmcvfmFwcHJvL2NyeXB0b2dhbXMvLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBHSEFTSCBmb3IgZm9yIFBvd2VySVNBIHYyLjA3LgorIworIyBKdWx5IDIwMTQKKyMKKyMgQWNjdXJhdGUgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnRzIGFyZSBwcm9ibGVtYXRpYywgYmVjYXVzZSBpdCdzCisjIGFsd2F5cyB2aXJ0dWFsaXplZCBzZXR1cCB3aXRoIHBvc3NpYmx5IHRocm90dGxlZCBwcm9jZXNzb3IuCisjIFJlbGF0aXZlIGNvbXBhcmlzb24gaXMgdGhlcmVmb3JlIG1vcmUgaW5mb3JtYXRpdmUuIFRoaXMgaW5pdGlhbAorIyB2ZXJzaW9uIGlzIH4yLjF4IHNsb3dlciB0aGFuIGhhcmR3YXJlLWFzc2lzdGVkIEFFUy0xMjgtQ1RSLCB+MTJ4CisjIGZhc3RlciB0aGFuICI0LWJpdCIgaW50ZWdlci1vbmx5IGNvbXBpbGVyLWdlbmVyYXRlZCA2NC1iaXQgY29kZS4KKyMgIkluaXRpYWwgdmVyc2lvbiIgbWVhbnMgdGhhdCB0aGVyZSBpcyByb29tIGZvciBmdXRoZXIgaW1wcm92ZW1lbnQuCisKKyRmbGF2b3VyPXNoaWZ0OworJG91dHB1dCA9c2hpZnQ7CisKK2lmICgkZmxhdm91ciA9fiAvNjQvKSB7CisJJFNJWkVfVD04OworCSRMUlNBVkU9MiokU0laRV9UOworCSRTVFU9InN0ZHUiOworCSRQT1A9ImxkIjsKKwkkUFVTSD0ic3RkIjsKK30gZWxzaWYgKCRmbGF2b3VyID1+IC8zMi8pIHsKKwkkU0laRV9UPTQ7CisJJExSU0FWRT0kU0laRV9UOworCSRTVFU9InN0d3UiOworCSRQT1A9Imx3eiI7CisJJFBVU0g9InN0dyI7Cit9IGVsc2UgeyBkaWUgIm5vbnNlbnNlICRmbGF2b3VyIjsgfQorCiskMCA9fiBtLyguKltcL1xcXSlbXlwvXFxdKyQvOyAkZGlyPSQxOworKCAkeGxhdGU9IiR7ZGlyfXBwYy14bGF0ZS5wbCIgYW5kIC1mICR4bGF0ZSApIG9yCisoICR4bGF0ZT0iJHtkaXJ9Li4vLi4vcGVybGFzbS9wcGMteGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCitkaWUgImNhbid0IGxvY2F0ZSBwcGMteGxhdGUucGwiOworCitvcGVuIFNURE9VVCwifCAkXlggJHhsYXRlICRmbGF2b3VyICRvdXRwdXQiIHx8IGRpZSAiY2FuJ3QgY2FsbCAkeGxhdGU6ICQhIjsKKworbXkgKCRYaXAsJEh0YmwsJGlucCwkbGVuKT1tYXAoInIkXyIsKDMuLjYpKTsJIyBhcmd1bWVudCBibG9jaworCitteSAoJFhsLCRYbSwkWGgsJElOKT1tYXAoInYkXyIsKDAuLjMpKTsKK215ICgkemVybywkdDAsJHQxLCR0MiwkeEMyLCRILCRIaCwkSGwsJGxlbWFzayk9bWFwKCJ2JF8iLCg0Li4xMikpOworbXkgJHZyc2F2ZT0icjEyIjsKKworJGNvZGU9PDxfX187CisubWFjaGluZQkiYW55IgorCisudGV4dAorCisuZ2xvYmwJLmdjbV9pbml0X3A4CisJbGlzCQlyMCwweGZmZjAKKwlsaQkJcjgsMHgxMAorCW1mc3ByCQkkdnJzYXZlLDI1NgorCWxpCQlyOSwweDIwCisJbXRzcHIJCTI1NixyMAorCWxpCQlyMTAsMHgzMAorCWx2eF91CQkkSCwwLHI0CQkJIyBsb2FkIEgKKworCXZzcGx0aXNiCSR4QzIsLTE2CQkjIDB4ZjAKKwl2c3BsdGlzYgkkdDAsMQkJCSMgb25lCisJdmFkZHVibQkJJHhDMiwkeEMyLCR4QzIJCSMgMHhlMAorCXZ4b3IJCSR6ZXJvLCR6ZXJvLCR6ZXJvCisJdm9yCQkkeEMyLCR4QzIsJHQwCQkjIDB4ZTEKKwl2c2xkb2kJCSR4QzIsJHhDMiwkemVybywxNQkjIDB4ZTEuLi4KKwl2c2xkb2kJCSR0MSwkemVybywkdDAsMQkJIyAuLi4xCisJdmFkZHVibQkJJHhDMiwkeEMyLCR4QzIJCSMgMHhjMi4uLgorCXZzcGx0aXNiCSR0Miw3CisJdm9yCQkkeEMyLCR4QzIsJHQxCQkjIDB4YzIuLi4uMDEKKwl2c3BsdGIJCSR0MSwkSCwwCQkjIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZQorCXZzbAkJJEgsJEgsJHQwCQkjIEg8PD0xCisJdnNyYWIJCSR0MSwkdDEsJHQyCQkjIGJyb2FkY2FzdCBjYXJyeSBiaXQKKwl2YW5kCQkkdDEsJHQxLCR4QzIKKwl2eG9yCQkkSCwkSCwkdDEJCSMgdHdpc3RlZCBICisKKwl2c2xkb2kJCSRILCRILCRILDgJCSMgdHdpc3QgZXZlbiBtb3JlIC4uLgorCXZzbGRvaQkJJHhDMiwkemVybywkeEMyLDgJIyAweGMyLjAKKwl2c2xkb2kJCSRIbCwkemVybywkSCw4CQkjIC4uLiBhbmQgc3BsaXQKKwl2c2xkb2kJCSRIaCwkSCwkemVybyw4CisKKwlzdHZ4X3UJCSR4QzIsMCxyMwkJIyBzYXZlIHByZS1jb21wdXRlZCB0YWJsZQorCXN0dnhfdQkJJEhsLHI4LHIzCisJc3R2eF91CQkkSCwgcjkscjMKKwlzdHZ4X3UJCSRIaCxyMTAscjMKKworCW10c3ByCQkyNTYsJHZyc2F2ZQorCWJscgorCS5sb25nCQkwCisJLmJ5dGUJCTAsMTIsMHgxNCwwLDAsMCwyLDAKKwkubG9uZwkJMAorLnNpemUJLmdjbV9pbml0X3A4LC4tLmdjbV9pbml0X3A4CisKKy5nbG9ibAkuZ2NtX2dtdWx0X3A4CisJbGlzCQlyMCwweGZmZjgKKwlsaQkJcjgsMHgxMAorCW1mc3ByCQkkdnJzYXZlLDI1NgorCWxpCQlyOSwweDIwCisJbXRzcHIJCTI1NixyMAorCWxpCQlyMTAsMHgzMAorCWx2eF91CQkkSU4sMCwkWGlwCQkjIGxvYWQgWGkKKworCWx2eF91CQkkSGwscjgsJEh0YmwJCSMgbG9hZCBwcmUtY29tcHV0ZWQgdGFibGUKKwkgbGU/bHZzbAkkbGVtYXNrLHIwLHIwCisJbHZ4X3UJCSRILCByOSwkSHRibAorCSBsZT92c3BsdGlzYgkkdDAsMHgwNworCWx2eF91CQkkSGgscjEwLCRIdGJsCisJIGxlP3Z4b3IJJGxlbWFzaywkbGVtYXNrLCR0MAorCWx2eF91CQkkeEMyLDAsJEh0YmwKKwkgbGU/dnBlcm0JJElOLCRJTiwkSU4sJGxlbWFzaworCXZ4b3IJCSR6ZXJvLCR6ZXJvLCR6ZXJvCisKKwl2cG1zdW1kCQkkWGwsJElOLCRIbAkJIyBILmxvt1hpLmxvCisJdnBtc3VtZAkJJFhtLCRJTiwkSAkJIyBILmhpt1hpLmxvK0gubG+3WGkuaGkKKwl2cG1zdW1kCQkkWGgsJElOLCRIaAkJIyBILmhpt1hpLmhpCisKKwl2cG1zdW1kCQkkdDIsJFhsLCR4QzIJCSMgMXN0IHBoYXNlCisKKwl2c2xkb2kJCSR0MCwkWG0sJHplcm8sOAorCXZzbGRvaQkJJHQxLCR6ZXJvLCRYbSw4CisJdnhvcgkJJFhsLCRYbCwkdDAKKwl2eG9yCQkkWGgsJFhoLCR0MQorCisJdnNsZG9pCQkkWGwsJFhsLCRYbCw4CisJdnhvcgkJJFhsLCRYbCwkdDIKKworCXZzbGRvaQkJJHQxLCRYbCwkWGwsOAkJIyAybmQgcGhhc2UKKwl2cG1zdW1kCQkkWGwsJFhsLCR4QzIKKwl2eG9yCQkkdDEsJHQxLCRYaAorCXZ4b3IJCSRYbCwkWGwsJHQxCisKKwlsZT92cGVybQkkWGwsJFhsLCRYbCwkbGVtYXNrCisJc3R2eF91CQkkWGwsMCwkWGlwCQkjIHdyaXRlIG91dCBYaQorCisJbXRzcHIJCTI1NiwkdnJzYXZlCisJYmxyCisJLmxvbmcJCTAKKwkuYnl0ZQkJMCwxMiwweDE0LDAsMCwwLDIsMAorCS5sb25nCQkwCisuc2l6ZQkuZ2NtX2dtdWx0X3A4LC4tLmdjbV9nbXVsdF9wOAorCisuZ2xvYmwJLmdjbV9naGFzaF9wOAorCWxpcwkJcjAsMHhmZmY4CisJbGkJCXI4LDB4MTAKKwltZnNwcgkJJHZyc2F2ZSwyNTYKKwlsaQkJcjksMHgyMAorCW10c3ByCQkyNTYscjAKKwlsaQkJcjEwLDB4MzAKKwlsdnhfdQkJJFhsLDAsJFhpcAkJIyBsb2FkIFhpCisKKwlsdnhfdQkJJEhsLHI4LCRIdGJsCQkjIGxvYWQgcHJlLWNvbXB1dGVkIHRhYmxlCisJIGxlP2x2c2wJJGxlbWFzayxyMCxyMAorCWx2eF91CQkkSCwgcjksJEh0YmwKKwkgbGU/dnNwbHRpc2IJJHQwLDB4MDcKKwlsdnhfdQkJJEhoLHIxMCwkSHRibAorCSBsZT92eG9yCSRsZW1hc2ssJGxlbWFzaywkdDAKKwlsdnhfdQkJJHhDMiwwLCRIdGJsCisJIGxlP3ZwZXJtCSRYbCwkWGwsJFhsLCRsZW1hc2sKKwl2eG9yCQkkemVybywkemVybywkemVybworCisJbHZ4X3UJCSRJTiwwLCRpbnAKKwlhZGRpCQkkaW5wLCRpbnAsMTYKKwlzdWJpCQkkbGVuLCRsZW4sMTYKKwkgbGU/dnBlcm0JJElOLCRJTiwkSU4sJGxlbWFzaworCXZ4b3IJCSRJTiwkSU4sJFhsCisJYgkJTG9vcAorCisuYWxpZ24JNQorTG9vcDoKKwkgc3ViaWMJCSRsZW4sJGxlbiwxNgorCXZwbXN1bWQJCSRYbCwkSU4sJEhsCQkjIEgubG+3WGkubG8KKwkgc3ViZmUuCQlyMCxyMCxyMAkJIyBib3Jyb3c/LTE6MAorCXZwbXN1bWQJCSRYbSwkSU4sJEgJCSMgSC5oabdYaS5sbytILmxvt1hpLmhpCisJIGFuZAkJcjAscjAsJGxlbgorCXZwbXN1bWQJCSRYaCwkSU4sJEhoCQkjIEguaGm3WGkuaGkKKwkgYWRkCQkkaW5wLCRpbnAscjAKKworCXZwbXN1bWQJCSR0MiwkWGwsJHhDMgkJIyAxc3QgcGhhc2UKKworCXZzbGRvaQkJJHQwLCRYbSwkemVybyw4CisJdnNsZG9pCQkkdDEsJHplcm8sJFhtLDgKKwl2eG9yCQkkWGwsJFhsLCR0MAorCXZ4b3IJCSRYaCwkWGgsJHQxCisKKwl2c2xkb2kJCSRYbCwkWGwsJFhsLDgKKwl2eG9yCQkkWGwsJFhsLCR0MgorCSBsdnhfdQkJJElOLDAsJGlucAorCSBhZGRpCQkkaW5wLCRpbnAsMTYKKworCXZzbGRvaQkJJHQxLCRYbCwkWGwsOAkJIyAybmQgcGhhc2UKKwl2cG1zdW1kCQkkWGwsJFhsLCR4QzIKKwkgbGU/dnBlcm0JJElOLCRJTiwkSU4sJGxlbWFzaworCXZ4b3IJCSR0MSwkdDEsJFhoCisJdnhvcgkJJElOLCRJTiwkdDEKKwl2eG9yCQkkSU4sJElOLCRYbAorCWJlcQkJTG9vcAkJCSMgZGlkICRsZW4tPTE2IGJvcnJvdz8KKworCXZ4b3IJCSRYbCwkWGwsJHQxCisJbGU/dnBlcm0JJFhsLCRYbCwkWGwsJGxlbWFzaworCXN0dnhfdQkJJFhsLDAsJFhpcAkJIyB3cml0ZSBvdXQgWGkKKworCW10c3ByCQkyNTYsJHZyc2F2ZQorCWJscgorCS5sb25nCQkwCisJLmJ5dGUJCTAsMTIsMHgxNCwwLDAsMCw0LDAKKwkubG9uZwkJMAorLnNpemUJLmdjbV9naGFzaF9wOCwuLS5nY21fZ2hhc2hfcDgKKworLmFzY2l6ICAiR0hBU0ggZm9yIFBvd2VySVNBIDIuMDcsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCisuYWxpZ24gIDIKK19fXworCitmb3JlYWNoIChzcGxpdCgiXG4iLCRjb2RlKSkgeworCWlmICgkZmxhdm91ciA9fiAvbGUkL28pIHsJIyBsaXR0bGUtZW5kaWFuCisJICAgIHMvbGVcPy8vbwkJb3IKKwkgICAgcy9iZVw/LyNiZSMvbzsKKwl9IGVsc2UgeworCSAgICBzL2xlXD8vI2xlIy9vCW9yCisJICAgIHMvYmVcPy8vbzsKKwl9CisJcHJpbnQgJF8sIlxuIjsKK30KKworY2xvc2UgU1RET1VUOyAjIGVuZm9yY2UgZmx1c2gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3J5cHRvL3ZteC9wcGMteGxhdGUucGwgYi9kcml2ZXJzL2NyeXB0by92bXgvcHBjLXhsYXRlLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTE4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2NyeXB0by92bXgvcHBjLXhsYXRlLnBsCkBAIC0wLDAgKzEsMjA3IEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgUG93ZXJQQyBhc3NlbWJsZXIgZGlzdGlsbGVyIGJ5IDxhcHBybz4uCisKK215ICRmbGF2b3VyID0gc2hpZnQ7CitteSAkb3V0cHV0ID0gc2hpZnQ7CitvcGVuIFNURE9VVCwiPiRvdXRwdXQiIHx8IGRpZSAiY2FuJ3Qgb3BlbiAkb3V0cHV0OiAkISI7CisKK215ICVHTE9CQUxTOworbXkgJGRvdGlubG9jYWxsYWJlbHM9KCRmbGF2b3VyPX4vbGludXgvKT8xOjA7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZGlyZWN0aXZlcyB3aGljaCBuZWVkIHNwZWNpYWwgdHJlYXRtZW50IG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK215ICRnbG9ibCA9IHN1YiB7CisgICAgbXkgJGp1bmsgPSBzaGlmdDsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICRnbG9iYWwgPSBcJEdMT0JBTFN7JG5hbWV9OworICAgIG15ICRyZXQ7CisKKyAgICAkbmFtZSA9fiBzfF5bXC5cX118fDsKKyAKKyAgICBTV0lUQ0g6IGZvciAoJGZsYXZvdXIpIHsKKwkvYWl4LwkJJiYgZG8geyAkbmFtZSA9ICIuJG5hbWUiOworCQkJCWxhc3Q7CisJCQkgICAgICB9OworCS9vc3gvCQkmJiBkbyB7ICRuYW1lID0gIl8kbmFtZSI7CisJCQkJbGFzdDsKKwkJCSAgICAgIH07CisJL2xpbnV4LworCQkJJiYgZG8gewkkcmV0ID0gIl9HTE9CQUwoJG5hbWUpIjsKKwkJCQlsYXN0OworCQkJICAgICAgfTsKKyAgICB9CisKKyAgICAkcmV0ID0gIi5nbG9ibAkkbmFtZVxuYWxpZ24gNVxuJG5hbWU6IiBpZiAoISRyZXQpOworICAgICQkZ2xvYmFsID0gJG5hbWU7CisgICAgJHJldDsKK307CitteSAkdGV4dCA9IHN1YiB7CisgICAgbXkgJHJldCA9ICgkZmxhdm91ciA9fiAvYWl4LykgPyAiLmNzZWN0XHQudGV4dFtQUl0sNyIgOiAiLnRleHQiOworICAgICRyZXQgPSAiLmFiaXZlcnNpb24JMlxuIi4kcmV0CWlmICgkZmxhdm91ciA9fiAvbGludXguKjY0bGUvKTsKKyAgICAkcmV0OworfTsKK215ICRtYWNoaW5lID0gc3ViIHsKKyAgICBteSAkanVuayA9IHNoaWZ0OworICAgIG15ICRhcmNoID0gc2hpZnQ7CisgICAgaWYgKCRmbGF2b3VyID1+IC9vc3gvKQorICAgIHsJJGFyY2ggPX4gcy9cIi8vZzsKKwkkYXJjaCA9ICgkZmxhdm91cj1+LzY0LykgPyAicHBjOTcwLTY0IiA6ICJwcGM5NzAiIGlmICgkYXJjaCBlcSAiYW55Iik7CisgICAgfQorICAgICIubWFjaGluZQkkYXJjaCI7Cit9OworbXkgJHNpemUgPSBzdWIgeworICAgIGlmICgkZmxhdm91ciA9fiAvbGludXgvKQorICAgIHsJc2hpZnQ7CisJbXkgJG5hbWUgPSBzaGlmdDsgJG5hbWUgPX4gc3xeW1wuXF9dfHw7CisJbXkgJHJldCAgPSAiLnNpemUJJG5hbWUsLi0iLigkZmxhdm91cj1+LzY0JC8/Ii4iOiIiKS4kbmFtZTsKKwkkcmV0IC49ICJcbi5zaXplCS4kbmFtZSwuLS4kbmFtZSIgaWYgKCRmbGF2b3VyPX4vNjQkLyk7CisJJHJldDsKKyAgICB9CisgICAgZWxzZQorICAgIHsJIiI7CX0KK307CitteSAkYXNjaXogPSBzdWIgeworICAgIHNoaWZ0OworICAgIG15ICRsaW5lID0gam9pbigiLCIsQF8pOworICAgIGlmICgkbGluZSA9fiAvXiIoLiopIiQvKQorICAgIHsJIi5ieXRlCSIgLiBqb2luKCIsIix1bnBhY2soIkMqIiwkMSksMCkgLiAiXG4uYWxpZ24JMiI7CX0KKyAgICBlbHNlCisgICAgewkiIjsJfQorfTsKK215ICRxdWFkID0gc3ViIHsKKyAgICBzaGlmdDsKKyAgICBteSBAcmV0OworICAgIG15ICgkaGksJGxvKTsKKyAgICBmb3IgKEBfKSB7CisJaWYgKC9eMHgoWzAtOWEtZl0qPykoWzAtOWEtZl17MSw4fSkkL2lvKQorCXsgICRoaT0kMT8iMHgkMSI6IjAiOyAkbG89IjB4JDIiOyAgfQorCWVsc2lmICgvXihbMC05XSspJC9vKQorCXsgICRoaT0kMT4+MzI7ICRsbz0kMSYweGZmZmZmZmZmOyAgfSAjIGVycm9yLXByb25lIHdpdGggMzItYml0IHBlcmwKKwllbHNlCisJeyAgJGhpPXVuZGVmOyAkbG89JF87IH0KKworCWlmIChkZWZpbmVkKCRoaSkpCisJeyAgcHVzaChAcmV0LCRmbGF2b3VyPX4vbGUkL28/Ii5sb25nXHQkbG8sJGhpIjoiLmxvbmdcdCRoaSwkbG8iKTsgIH0KKwllbHNlCisJeyAgcHVzaChAcmV0LCIucXVhZAkkbG8iKTsgIH0KKyAgICB9CisgICAgam9pbigiXG4iLEByZXQpOworfTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBzaW1wbGlmaWVkIG1uZW1vbmljcyBub3QgaGFuZGxlZCBieSBhdCBsZWFzdCBvbmUgYXNzZW1ibGVyCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitteSAkY21wbHcgPSBzdWIgeworICAgIG15ICRmID0gc2hpZnQ7CisgICAgbXkgJGNyID0gMDsgJGNyID0gc2hpZnQgaWYgKCQjXz4xKTsKKyAgICAjIFNvbWUgb3V0LW9mLWRhdGUgMzItYml0IEdOVSBhc3NlbWJsZXIganVzdCBjYW4ndCBoYW5kbGUgY21wbHcuLi4KKyAgICAoJGZsYXZvdXIgPX4gL2xpbnV4LiozMi8pID8KKwkiCS5sb25nCSIuc3ByaW50ZiAiMHgleCIsMzE8PDI2fCRjcjw8MjN8JF9bMF08PDE2fCRfWzFdPDwxMXw2NCA6CisJIgljbXBsdwkiLmpvaW4oJywnLCRjcixAXyk7Cit9OworbXkgJGJkbnogPSBzdWIgeworICAgIG15ICRmID0gc2hpZnQ7CisgICAgbXkgJGJvID0gJGY9fi9bXCtcLV0vID8gMTYrOSA6IDE2OwkjIG9wdGlvbmFsICJ0byBiZSB0YWtlbiIgaGludAorICAgICIJYmMJJGJvLDAsIi5zaGlmdDsKK30gaWYgKCRmbGF2b3VyIX4vbGludXgvKTsKK215ICRibHRsciA9IHN1YiB7CisgICAgbXkgJGYgPSBzaGlmdDsKKyAgICBteSAkYm8gPSAkZj1+L1wtLyA/IDEyKzIgOiAxMjsJIyBvcHRpb25hbCAibm90IHRvIGJlIHRha2VuIiBoaW50CisgICAgKCRmbGF2b3VyID1+IC9saW51eC8pID8JCSMgR05VIGFzIGRvZXNuJ3QgYWxsb3cgbW9zdCByZWNlbnQgaGludHMKKwkiCS5sb25nCSIuc3ByaW50ZiAiMHgleCIsMTk8PDI2fCRibzw8MjF8MTY8PDEgOgorCSIJYmNscgkkYm8sMCI7Cit9OworbXkgJGJuZWxyID0gc3ViIHsKKyAgICBteSAkZiA9IHNoaWZ0OworICAgIG15ICRibyA9ICRmPX4vXC0vID8gNCsyIDogNDsJIyBvcHRpb25hbCAibm90IHRvIGJlIHRha2VuIiBoaW50CisgICAgKCRmbGF2b3VyID1+IC9saW51eC8pID8JCSMgR05VIGFzIGRvZXNuJ3QgYWxsb3cgbW9zdCByZWNlbnQgaGludHMKKwkiCS5sb25nCSIuc3ByaW50ZiAiMHgleCIsMTk8PDI2fCRibzw8MjF8Mjw8MTZ8MTY8PDEgOgorCSIJYmNscgkkYm8sMiI7Cit9OworbXkgJGJlcWxyID0gc3ViIHsKKyAgICBteSAkZiA9IHNoaWZ0OworICAgIG15ICRibyA9ICRmPX4vLS8gPyAxMisyIDogMTI7CSMgb3B0aW9uYWwgIm5vdCB0byBiZSB0YWtlbiIgaGludAorICAgICgkZmxhdm91ciA9fiAvbGludXgvKSA/CQkjIEdOVSBhcyBkb2Vzbid0IGFsbG93IG1vc3QgcmVjZW50IGhpbnRzCisJIgkubG9uZwkiLnNwcmludGYgIjB4JVgiLDE5PDwyNnwkYm88PDIxfDI8PDE2fDE2PDwxIDoKKwkiCWJjbHIJJGJvLDIiOworfTsKKyMgR05VIGFzc2VtYmxlciBjYW4ndCBoYW5kbGUgZXh0cmRpIHJBLHJTLDE2LDQ4LCBvciB3aGVuIHN1bSBvZiBsYXN0IHR3bworIyBhcmd1bWVudHMgaXMgNjQsIHdpdGggIm9wZXJhbmQgb3V0IG9mIHJhbmdlIiBlcnJvci4KK215ICRleHRyZGkgPSBzdWIgeworICAgIG15ICgkZiwkcmEsJHJzLCRuLCRiKSA9IEBfOworICAgICRiID0gKCRiKyRuKSY2MzsgJG4gPSA2NC0kbjsKKyAgICAiCXJsZGljbAkkcmEsJHJzLCRiLCRuIjsKK307CitteSAkdm1yID0gc3ViIHsKKyAgICBteSAoJGYsJHZ4LCR2eSkgPSBAXzsKKyAgICAiCXZvcgkkdngsJHZ5LCR2eSI7Cit9OworCisjIFBvd2VySVNBIDIuMDYgc3R1ZmYKK3N1YiB2c3htZW1fb3AgeworICAgIG15ICgkZiwgJHZydCwgJHJhLCAkcmIsICRvcCkgPSBAXzsKKyAgICAiCS5sb25nCSIuc3ByaW50ZiAiMHglWCIsKDMxPDwyNil8KCR2cnQ8PDIxKXwoJHJhPDwxNil8KCRyYjw8MTEpfCgkb3AqMisxKTsKK30KKyMgbWFkZS11cCB1bmFsaWduZWQgbWVtb3J5IHJlZmVyZW5jZSBBbHRpVmVjL1ZNWCBpbnN0cnVjdGlvbnMKK215ICRsdnhfdQk9IHN1YiB7CXZzeG1lbV9vcChAXywgODQ0KTsgfTsJIyBseHZkMngKK215ICRzdHZ4X3UJPSBzdWIgewl2c3htZW1fb3AoQF8sIDk3Mik7IH07CSMgc3R4dmQyeAorbXkgJGx2ZHhfdQk9IHN1YiB7CXZzeG1lbV9vcChAXywgNTg4KTsgfTsJIyBseHNkeAorbXkgJHN0dmR4X3UJPSBzdWIgewl2c3htZW1fb3AoQF8sIDcxNik7IH07CSMgc3R4c2R4CitteSAkbHZ4XzR3CT0gc3ViIHsgdnN4bWVtX29wKEBfLCA3ODApOyB9OwkjIGx4dnc0eAorbXkgJHN0dnhfNHcJPSBzdWIgeyB2c3htZW1fb3AoQF8sIDkwOCk7IH07CSMgc3R4dnc0eAorCisjIFBvd2VySVNBIDIuMDcgc3R1ZmYKK3N1YiB2Y3J5cHRvX29wIHsKKyAgICBteSAoJGYsICR2cnQsICR2cmEsICR2cmIsICRvcCkgPSBAXzsKKyAgICAiCS5sb25nCSIuc3ByaW50ZiAiMHglWCIsKDQ8PDI2KXwoJHZydDw8MjEpfCgkdnJhPDwxNil8KCR2cmI8PDExKXwkb3A7Cit9CitteSAkdmNpcGhlcgk9IHN1YiB7IHZjcnlwdG9fb3AoQF8sIDEyODgpOyB9OworbXkgJHZjaXBoZXJsYXN0CT0gc3ViIHsgdmNyeXB0b19vcChAXywgMTI4OSk7IH07CitteSAkdm5jaXBoZXIJPSBzdWIgeyB2Y3J5cHRvX29wKEBfLCAxMzUyKTsgfTsKK215ICR2bmNpcGhlcmxhc3Q9IHN1YiB7IHZjcnlwdG9fb3AoQF8sIDEzNTMpOyB9OworbXkgJHZzYm94CT0gc3ViIHsgdmNyeXB0b19vcChAXywgMCwgMTQ4MCk7IH07CitteSAkdnNoYXNpZ21hZAk9IHN1YiB7IG15ICgkc3QsJHNpeCk9c3BsaWNlKEBfLC0yKTsgdmNyeXB0b19vcChAXywgJHN0PDw0fCRzaXgsIDE3MzApOyB9OworbXkgJHZzaGFzaWdtYXcJPSBzdWIgeyBteSAoJHN0LCRzaXgpPXNwbGljZShAXywtMik7IHZjcnlwdG9fb3AoQF8sICRzdDw8NHwkc2l4LCAxNjY2KTsgfTsKK215ICR2cG1zdW1iCT0gc3ViIHsgdmNyeXB0b19vcChAXywgMTAzMik7IH07CitteSAkdnBtc3VtZAk9IHN1YiB7IHZjcnlwdG9fb3AoQF8sIDEyMjQpOyB9OworbXkgJHZwbXN1YmgJPSBzdWIgeyB2Y3J5cHRvX29wKEBfLCAxMDk2KTsgfTsKK215ICR2cG1zdW13CT0gc3ViIHsgdmNyeXB0b19vcChAXywgMTE2MCk7IH07CitteSAkdmFkZHVkbQk9IHN1YiB7IHZjcnlwdG9fb3AoQF8sIDE5Mik7ICB9OworCitteSAkbXRzbGUJPSBzdWIgeworICAgIG15ICgkZiwgJGFyZykgPSBAXzsKKyAgICAiCS5sb25nCSIuc3ByaW50ZiAiMHglWCIsKDMxPDwyNil8KCRhcmc8PDIxKXwoMTQ3KjIpOworfTsKKworcHJpbnQgIiNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPlxuIiBpZiAkZmxhdm91ciA9fiAvbGludXgvOworCit3aGlsZSgkbGluZT08PikgeworCisgICAgJGxpbmUgPX4gc3xbIyE7XS4qJHx8OwkjIGdldCByaWQgb2YgYXNtLXN0eWxlIGNvbW1lbnRzLi4uCisgICAgJGxpbmUgPX4gc3wvXCouKlwqL3x8OwkjIC4uLiBhbmQgQy1zdHlsZSBjb21tZW50cy4uLgorICAgICRsaW5lID1+IHN8XlxzK3x8OwkJIyAuLi4gYW5kIHNraXAgd2hpdGUgc3BhY2VzIGluIGJlZ2lubmluZy4uLgorICAgICRsaW5lID1+IHN8XHMrJHx8OwkJIyAuLi4gYW5kIGF0IHRoZSBlbmQKKworICAgIHsKKwkkbGluZSA9fiBzfFxiXC5MKFx3Kyl8TCQxfGc7CSMgY29tbW9uIGRlbm9taW5hdG9yIGZvciBMb2NhbGxhYmVsCisJJGxpbmUgPX4gc3xcYkwoXHcrKXxcLkwkMXxnCWlmICgkZG90aW5sb2NhbGxhYmVscyk7CisgICAgfQorCisgICAgeworCSRsaW5lID1+IHN8XlxzKihcLj8pKFx3KykoW1wuXCtcLV0/KVxzKnx8OworCW15ICRjID0gJDE7ICRjID0gIlx0IiBpZiAoJGMgZXEgIiIpOworCW15ICRtbmVtb25pYyA9ICQyOworCW15ICRmID0gJDM7CisJbXkgJG9wY29kZSA9IGV2YWwoIlwkJG1uZW1vbmljIik7CisJJGxpbmUgPX4gcy9cYihjP1tyZl18dnx2cykoWzAtOV0rKVxiLyQyL2cgaWYgKCRjIG5lICIuIiBhbmQgJGZsYXZvdXIgIX4gL29zeC8pOworCWlmIChyZWYoJG9wY29kZSkgZXEgJ0NPREUnKSB7ICRsaW5lID0gJiRvcGNvZGUoJGYsc3BsaXQoJywnLCRsaW5lKSk7IH0KKwllbHNpZiAoJG1uZW1vbmljKSAgICAgICAgICAgeyAkbGluZSA9ICRjLiRtbmVtb25pYy4kZi4iXHQiLiRsaW5lOyB9CisgICAgfQorCisgICAgcHJpbnQgJGxpbmUgaWYgKCRsaW5lKTsKKyAgICBwcmludCAiXG4iOworfQorCitjbG9zZSBTVERPVVQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NyeXB0by92bXgvdm14LmMgYi9kcml2ZXJzL2NyeXB0by92bXgvdm14LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRkOGQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvY3J5cHRvL3ZteC92bXguYwpAQCAtMCwwICsxLDg4IEBACisvKioKKyAqIFJvdXRpbmVzIHN1cHBvcnRpbmcgVk1YIGluc3RydWN0aW9ucyBvbiB0aGUgUG93ZXIgOAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvbmx5LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBBdXRob3I6IE1hcmNlbG8gSGVucmlxdWUgQ2VycmkgPG1oY2VycmlAYnIuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgorI2luY2x1ZGUgPGFzbS9jcHV0YWJsZS5oPgorI2luY2x1ZGUgPGNyeXB0by9pbnRlcm5hbC9oYXNoLmg+CisKK2V4dGVybiBzdHJ1Y3Qgc2hhc2hfYWxnIHA4X2doYXNoX2FsZzsKK2V4dGVybiBzdHJ1Y3QgY3J5cHRvX2FsZyBwOF9hZXNfYWxnOworZXh0ZXJuIHN0cnVjdCBjcnlwdG9fYWxnIHA4X2Flc19jYmNfYWxnOworZXh0ZXJuIHN0cnVjdCBjcnlwdG9fYWxnIHA4X2Flc19jdHJfYWxnOworc3RhdGljIHN0cnVjdCBjcnlwdG9fYWxnICphbGdzW10gPSB7CisgICAgJnA4X2Flc19hbGcsCisgICAgJnA4X2Flc19jYmNfYWxnLAorICAgICZwOF9hZXNfY3RyX2FsZywKKyAgICBOVUxMLAorfTsKKworaW50IF9faW5pdCBwOF9pbml0KHZvaWQpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgc3RydWN0IGNyeXB0b19hbGcgKiphbGdfaXQ7CisKKyAgICBpZiAoIShjdXJfY3B1X3NwZWMtPmNwdV91c2VyX2ZlYXR1cmVzMiAmIFBQQ19GRUFUVVJFMl9WRUNfQ1JZUFRPKSkKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisKKyAgICBmb3IgKGFsZ19pdCA9IGFsZ3M7ICphbGdfaXQ7IGFsZ19pdCsrKSB7CisgICAgICAgIHJldCA9IGNyeXB0b19yZWdpc3Rlcl9hbGcoKmFsZ19pdCk7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNyeXB0b19yZWdpc3Rlcl9hbGcgJyVzJyA9ICVkXG4iLAorICAgICAgICAgICAgICAgICgqYWxnX2l0KS0+Y3JhX25hbWUsIHJldCk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIGZvciAoYWxnX2l0LS07IGFsZ19pdCA+PSBhbGdzOyBhbGdfaXQtLSkKKyAgICAgICAgICAgICAgICBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoKmFsZ19pdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gY3J5cHRvX3JlZ2lzdGVyX3NoYXNoKCZwOF9naGFzaF9hbGcpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgZm9yIChhbGdfaXQgPSBhbGdzOyAqYWxnX2l0OyBhbGdfaXQrKykKKyAgICAgICAgICAgIGNyeXB0b191bnJlZ2lzdGVyX2FsZygqYWxnX2l0KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBfX2V4aXQgcDhfZXhpdCh2b2lkKQoreworICAgIHN0cnVjdCBjcnlwdG9fYWxnICoqYWxnX2l0OworCisgICAgZm9yIChhbGdfaXQgPSBhbGdzOyAqYWxnX2l0OyBhbGdfaXQrKykgeworICAgICAgICBwcmludGsoS0VSTl9JTkZPICJSZW1vdmluZyAnJXMnXG4iLCAoKmFsZ19pdCktPmNyYV9uYW1lKTsKKyAgICAgICAgY3J5cHRvX3VucmVnaXN0ZXJfYWxnKCphbGdfaXQpOworICAgIH0KKyAgICBjcnlwdG9fdW5yZWdpc3Rlcl9zaGFzaCgmcDhfZ2hhc2hfYWxnKTsKK30KKworbW9kdWxlX2luaXQocDhfaW5pdCk7Cittb2R1bGVfZXhpdChwOF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyY2VsbyBDZXJyaTxtaGNlcnJpQGJyLmlibS5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIklCTSBWTVggY3J5cHRvZ2FwaGljIGFjY2VsZXJhdGlvbiBpbnN0cnVjdGlvbnMgc3VwcG9ydCBvbiBQb3dlciA4Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMS4wLjAiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuYyBiL2RyaXZlcnMvZGV2ZnJlcS9kZXZmcmVxLmMKaW5kZXggMzBiNTM4ZDguLmNhMWIzNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9kZXZmcmVxLmMKKysrIGIvZHJpdmVycy9kZXZmcmVxL2RldmZyZXEuYwpAQCAtMzkyLDcgKzM5Miw2IEBACiAvKioKICAqIF9yZW1vdmVfZGV2ZnJlcSgpIC0gUmVtb3ZlIGRldmZyZXEgZnJvbSB0aGUgbGlzdCBhbmQgcmVsZWFzZSBpdHMgcmVzb3VyY2VzLgogICogQGRldmZyZXE6CXRoZSBkZXZmcmVxIHN0cnVjdAotICogQHNraXA6CXNraXAgY2FsbGluZyBkZXZpY2VfdW5yZWdpc3RlcigpLgogICovCiBzdGF0aWMgdm9pZCBfcmVtb3ZlX2RldmZyZXEoc3RydWN0IGRldmZyZXEgKmRldmZyZXEpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RldmZyZXEvZXZlbnQvZXh5bm9zLXBwbXUuYyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9leHlub3MtcHBtdS5jCmluZGV4IGFkODM0NzMuLjdkOTlkMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9leHlub3MtcHBtdS5jCisrKyBiL2RyaXZlcnMvZGV2ZnJlcS9ldmVudC9leHlub3MtcHBtdS5jCkBAIC0xOTQsNyArMTk0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBkZXZmcmVxX2V2ZW50X29wcyBleHlub3NfcHBtdV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGRldmZyZXFfZXZlbnRfb3BzIGV4eW5vc19wcG11X29wcyA9IHsKIAkuZGlzYWJsZSA9IGV4eW5vc19wcG11X2Rpc2FibGUsCiAJLnNldF9ldmVudCA9IGV4eW5vc19wcG11X3NldF9ldmVudCwKIAkuZ2V0X2V2ZW50ID0gZXh5bm9zX3BwbXVfZ2V0X2V2ZW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kZXZmcmVxL3RlZ3JhLWRldmZyZXEuYyBiL2RyaXZlcnMvZGV2ZnJlcS90ZWdyYS1kZXZmcmVxLmMKaW5kZXggMzQ3OTA5Ni4uMTNhMWE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kZXZmcmVxL3RlZ3JhLWRldmZyZXEuYworKysgYi9kcml2ZXJzL2RldmZyZXEvdGVncmEtZGV2ZnJlcS5jCkBAIC02Miw3ICs2Miw4IEBACiAjZGVmaW5lIEFDVE1PTl9CRUxPV19XTUFSS19XSU5ET1cJCQkJMwogI2RlZmluZSBBQ1RNT05fQk9PU1RfRlJFUV9TVEVQCQkJCQkxNjAwMAogCi0vKiBhY3Rpdml0eSBjb3VudGVyIGlzIGluY3JlbWVudGVkIGV2ZXJ5IDI1NiBtZW1vcnkgdHJhbnNhY3Rpb25zLCBhbmQgZWFjaAorLyoKKyAqIEFjdGl2aXR5IGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZXZlcnkgMjU2IG1lbW9yeSB0cmFuc2FjdGlvbnMsIGFuZCBlYWNoCiAgKiB0cmFuc2FjdGlvbiB0YWtlcyA0IEVNQyBjbG9ja3MgZm9yIFRlZ3JhMTI0OyBTbyB0aGUgQ09VTlRfV0VJR0hUIGlzCiAgKiA0ICogMjU2ID0gMTAyNC4KICAqLwpAQCAtODUsMTYgKzg2LDI1IEBACiAgKiBzdHJ1Y3QgdGVncmFfZGV2ZnJlcV9kZXZpY2VfY29uZmlnIC0gY29uZmlndXJhdGlvbiBzcGVjaWZpYyB0byBhbiBBQ1RNT04KICAqIGRldmljZQogICoKLSAqIENvZWZmaWNpZW50cyBhbmQgdGhyZXNob2xkcyBhcmUgaW4gJQorICogQ29lZmZpY2llbnRzIGFuZCB0aHJlc2hvbGRzIGFyZSBwZXJjZW50YWdlcyB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkCiAgKi8KIHN0cnVjdCB0ZWdyYV9kZXZmcmVxX2RldmljZV9jb25maWcgewogCXUzMgkJb2Zmc2V0OwogCXUzMgkJaXJxX21hc2s7CiAKKwkvKiBGYWN0b3JzIGFwcGxpZWQgdG8gYm9vc3RfZnJlcSBldmVyeSBjb25zZWN1dGl2ZSB3YXRlcm1hcmsgYnJlYWNoICovCiAJdW5zaWduZWQgaW50CWJvb3N0X3VwX2NvZWZmOwogCXVuc2lnbmVkIGludAlib29zdF9kb3duX2NvZWZmOworCisJLyogRGVmaW5lIHRoZSB3YXRlcm1hcmsgYm91bmRzIHdoZW4gYXBwbGllZCB0byB0aGUgY3VycmVudCBhdmcgKi8KIAl1bnNpZ25lZCBpbnQJYm9vc3RfdXBfdGhyZXNob2xkOwogCXVuc2lnbmVkIGludAlib29zdF9kb3duX3RocmVzaG9sZDsKKworCS8qCisJICogVGhyZXNob2xkIG9mIGFjdGl2aXR5IChjeWNsZXMpIGJlbG93IHdoaWNoIHRoZSBDUFUgZnJlcXVlbmN5IGlzbid0CisJICogdG8gYmUgdGFrZW4gaW50byBhY2NvdW50LiBUaGlzIGlzIHRvIGF2b2lkIGluY3JlYXNpbmcgdGhlIEVNQworCSAqIGZyZXF1ZW5jeSB3aGVuIHRoZSBDUFUgaXMgdmVyeSBidXN5IGJ1dCBub3QgYWNjZXNzaW5nIHRoZSBidXMgb2Z0ZW4uCisJICovCiAJdTMyCQlhdmdfZGVwZW5kZW5jeV90aHJlc2hvbGQ7CiB9OwogCkBAIC0xMDUsNyArMTE1LDcgQEAKIAogc3RhdGljIHN0cnVjdCB0ZWdyYV9kZXZmcmVxX2RldmljZV9jb25maWcgYWN0bW9uX2RldmljZV9jb25maWdzW10gPSB7CiAJewotCQkvKiBNQ0FMTCAqLworCQkvKiBNQ0FMTDogQWxsIG1lbW9yeSBhY2Nlc3NlcyAoaW5jbHVkaW5nIGZyb20gdGhlIENQVXMpICovCiAJCS5vZmZzZXQgPSAweDFjMCwKIAkJLmlycV9tYXNrID0gMSA8PCAyNiwKIAkJLmJvb3N0X3VwX2NvZWZmID0gMjAwLApAQCAtMTE0LDcgKzEyNCw3IEBACiAJCS5ib29zdF9kb3duX3RocmVzaG9sZCA9IDQwLAogCX0sCiAJewotCQkvKiBNQ0NQVSAqLworCQkvKiBNQ0NQVTogbWVtb3J5IGFjY2Vzc2VzIGZyb20gdGhlIENQVXMgKi8KIAkJLm9mZnNldCA9IDB4MjAwLAogCQkuaXJxX21hc2sgPSAxIDw8IDI1LAogCQkuYm9vc3RfdXBfY29lZmYgPSA4MDAsCkBAIC0xMzIsMjUgKzE0MiwyOSBAQAogICovCiBzdHJ1Y3QgdGVncmFfZGV2ZnJlcV9kZXZpY2UgewogCWNvbnN0IHN0cnVjdCB0ZWdyYV9kZXZmcmVxX2RldmljZV9jb25maWcgKmNvbmZpZzsKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJc3BpbmxvY2tfdCBsb2NrOwogCi0Jdm9pZCBfX2lvbWVtCSpyZWdzOwotCXUzMgkJYXZnX2JhbmRfZnJlcTsKLQl1MzIJCWF2Z19jb3VudDsKKwkvKiBBdmVyYWdlIGV2ZW50IGNvdW50IHNhbXBsZWQgaW4gdGhlIGxhc3QgaW50ZXJydXB0ICovCisJdTMyIGF2Z19jb3VudDsKIAotCXVuc2lnbmVkIGxvbmcJdGFyZ2V0X2ZyZXE7Ci0JdW5zaWduZWQgbG9uZwlib29zdF9mcmVxOworCS8qCisJICogRXh0cmEgZnJlcXVlbmN5IHRvIGluY3JlYXNlIHRoZSB0YXJnZXQgYnkgZHVlIHRvIGNvbnNlY3V0aXZlCisJICogd2F0ZXJtYXJrIGJyZWFjaGVzLgorCSAqLworCXVuc2lnbmVkIGxvbmcgYm9vc3RfZnJlcTsKKworCS8qIE9wdGltYWwgZnJlcXVlbmN5IGNhbGN1bGF0ZWQgZnJvbSB0aGUgc3RhdHMgZm9yIHRoaXMgZGV2aWNlICovCisJdW5zaWduZWQgbG9uZyB0YXJnZXRfZnJlcTsKIH07CiAKIHN0cnVjdCB0ZWdyYV9kZXZmcmVxIHsKIAlzdHJ1Y3QgZGV2ZnJlcQkJKmRldmZyZXE7CiAKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwZGV2OwogCXN0cnVjdCByZXNldF9jb250cm9sCSpyZXNldDsKIAlzdHJ1Y3QgY2xrCQkqY2xvY2s7CiAJdm9pZCBfX2lvbWVtCQkqcmVnczsKIAotCXNwaW5sb2NrX3QJCWxvY2s7Ci0KIAlzdHJ1Y3QgY2xrCQkqZW1jX2Nsb2NrOwogCXVuc2lnbmVkIGxvbmcJCW1heF9mcmVxOwogCXVuc2lnbmVkIGxvbmcJCWN1cl9mcmVxOwpAQCAtMTc0LDE5ICsxODgsNDMgQEAKIAl7ICAyNTAwMDAsICAgIDEwMDAwMCB9LAogfTsKIAorc3RhdGljIHUzMiBhY3Rtb25fcmVhZGwoc3RydWN0IHRlZ3JhX2RldmZyZXEgKnRlZ3JhLCB1MzIgb2Zmc2V0KQoreworCXJldHVybiByZWFkbCh0ZWdyYS0+cmVncyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGFjdG1vbl93cml0ZWwoc3RydWN0IHRlZ3JhX2RldmZyZXEgKnRlZ3JhLCB1MzIgdmFsLCB1MzIgb2Zmc2V0KQoreworCXdyaXRlbCh2YWwsIHRlZ3JhLT5yZWdzICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHUzMiBkZXZpY2VfcmVhZGwoc3RydWN0IHRlZ3JhX2RldmZyZXFfZGV2aWNlICpkZXYsIHUzMiBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKGRldi0+cmVncyArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGRldmljZV93cml0ZWwoc3RydWN0IHRlZ3JhX2RldmZyZXFfZGV2aWNlICpkZXYsIHUzMiB2YWwsCisJCQkgIHUzMiBvZmZzZXQpCit7CisJd3JpdGVsKHZhbCwgZGV2LT5yZWdzICsgb2Zmc2V0KTsKK30KKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9fcGVyY2VudCh1bnNpZ25lZCBsb25nIHZhbCwgdW5zaWduZWQgaW50IHBjdCkKIHsKIAlyZXR1cm4gdmFsICogcGN0IC8gMTAwOwogfQogCi1zdGF0aWMgdm9pZCB0ZWdyYV9kZXZmcmVxX3VwZGF0ZV9hdmdfd21hcmsoc3RydWN0IHRlZ3JhX2RldmZyZXFfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCB0ZWdyYV9kZXZmcmVxX3VwZGF0ZV9hdmdfd21hcmsoc3RydWN0IHRlZ3JhX2RldmZyZXEgKnRlZ3JhLAorCQkJCQkgICBzdHJ1Y3QgdGVncmFfZGV2ZnJlcV9kZXZpY2UgKmRldikKIHsKIAl1MzIgYXZnID0gZGV2LT5hdmdfY291bnQ7Ci0JdTMyIGJhbmQgPSBkZXYtPmF2Z19iYW5kX2ZyZXEgKiBBQ1RNT05fU0FNUExJTkdfUEVSSU9EOworCXUzMiBhdmdfYmFuZF9mcmVxID0gdGVncmEtPm1heF9mcmVxICogQUNUTU9OX0RFRkFVTFRfQVZHX0JBTkQgLyBLSFo7CisJdTMyIGJhbmQgPSBhdmdfYmFuZF9mcmVxICogQUNUTU9OX1NBTVBMSU5HX1BFUklPRDsKIAotCXdyaXRlbChhdmcgKyBiYW5kLCBkZXYtPnJlZ3MgKyBBQ1RNT05fREVWX0FWR19VUFBFUl9XTUFSSyk7Ci0JYXZnID0gbWF4KGF2ZywgYmFuZCk7Ci0Jd3JpdGVsKGF2ZyAtIGJhbmQsIGRldi0+cmVncyArIEFDVE1PTl9ERVZfQVZHX0xPV0VSX1dNQVJLKTsKKwlkZXZpY2Vfd3JpdGVsKGRldiwgYXZnICsgYmFuZCwgQUNUTU9OX0RFVl9BVkdfVVBQRVJfV01BUkspOworCisJYXZnID0gbWF4KGRldi0+YXZnX2NvdW50LCBiYW5kKTsKKwlkZXZpY2Vfd3JpdGVsKGRldiwgYXZnIC0gYmFuZCwgQUNUTU9OX0RFVl9BVkdfTE9XRVJfV01BUkspOwogfQogCiBzdGF0aWMgdm9pZCB0ZWdyYV9kZXZmcmVxX3VwZGF0ZV93bWFyayhzdHJ1Y3QgdGVncmFfZGV2ZnJlcSAqdGVncmEsCkBAIC0xOTQsOTYgKzIzMiw5NiBAQAogewogCXUzMiB2YWwgPSB0ZWdyYS0+Y3VyX2ZyZXEgKiBBQ1RNT05fU0FNUExJTkdfUEVSSU9EOwogCi0Jd3JpdGVsKGRvX3BlcmNlbnQodmFsLCBkZXYtPmNvbmZpZy0+Ym9vc3RfdXBfdGhyZXNob2xkKSwKLQkgICAgICAgZGV2LT5yZWdzICsgQUNUTU9OX0RFVl9VUFBFUl9XTUFSSyk7CisJZGV2aWNlX3dyaXRlbChkZXYsIGRvX3BlcmNlbnQodmFsLCBkZXYtPmNvbmZpZy0+Ym9vc3RfdXBfdGhyZXNob2xkKSwKKwkJICAgICAgQUNUTU9OX0RFVl9VUFBFUl9XTUFSSyk7CiAKLQl3cml0ZWwoZG9fcGVyY2VudCh2YWwsIGRldi0+Y29uZmlnLT5ib29zdF9kb3duX3RocmVzaG9sZCksCi0JICAgICAgIGRldi0+cmVncyArIEFDVE1PTl9ERVZfTE9XRVJfV01BUkspOworCWRldmljZV93cml0ZWwoZGV2LCBkb19wZXJjZW50KHZhbCwgZGV2LT5jb25maWctPmJvb3N0X2Rvd25fdGhyZXNob2xkKSwKKwkJICAgICAgQUNUTU9OX0RFVl9MT1dFUl9XTUFSSyk7CiB9CiAKIHN0YXRpYyB2b2lkIGFjdG1vbl93cml0ZV9iYXJyaWVyKHN0cnVjdCB0ZWdyYV9kZXZmcmVxICp0ZWdyYSkKIHsKIAkvKiBlbnN1cmUgdGhlIHVwZGF0ZSBoYXMgcmVhY2hlZCB0aGUgQUNUTU9OICovCiAJd21iKCk7Ci0JcmVhZGwodGVncmEtPnJlZ3MgKyBBQ1RNT05fR0xCX1NUQVRVUyk7CisJYWN0bW9uX3JlYWRsKHRlZ3JhLCBBQ1RNT05fR0xCX1NUQVRVUyk7CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBhY3Rtb25faXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBhY3Rtb25faXNyX2RldmljZShzdHJ1Y3QgdGVncmFfZGV2ZnJlcSAqdGVncmEsCisJCQkgICAgICBzdHJ1Y3QgdGVncmFfZGV2ZnJlcV9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgdGVncmFfZGV2ZnJlcSAqdGVncmEgPSBkYXRhOwotCXN0cnVjdCB0ZWdyYV9kZXZmcmVxX2RldmljZSAqZGV2ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiB2YWw7Ci0JdW5zaWduZWQgaW50IGk7CisJdTMyIGludHJfc3RhdHVzLCBkZXZfY3RybDsKIAotCXZhbCA9IHJlYWRsKHRlZ3JhLT5yZWdzICsgQUNUTU9OX0dMQl9TVEFUVVMpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlZ3JhLT5kZXZpY2VzKTsgaSsrKSB7Ci0JCWlmICh2YWwgJiB0ZWdyYS0+ZGV2aWNlc1tpXS5jb25maWctPmlycV9tYXNrKSB7Ci0JCQlkZXYgPSB0ZWdyYS0+ZGV2aWNlcyArIGk7Ci0JCQlicmVhazsKLQkJfQotCX0KKwlkZXYtPmF2Z19jb3VudCA9IGRldmljZV9yZWFkbChkZXYsIEFDVE1PTl9ERVZfQVZHX0NPVU5UKTsKKwl0ZWdyYV9kZXZmcmVxX3VwZGF0ZV9hdmdfd21hcmsodGVncmEsIGRldik7CiAKLQlpZiAoIWRldikKLQkJcmV0dXJuIElSUV9OT05FOworCWludHJfc3RhdHVzID0gZGV2aWNlX3JlYWRsKGRldiwgQUNUTU9OX0RFVl9JTlRSX1NUQVRVUyk7CisJZGV2X2N0cmwgPSBkZXZpY2VfcmVhZGwoZGV2LCBBQ1RNT05fREVWX0NUUkwpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRlZ3JhLT5sb2NrLCBmbGFncyk7Ci0KLQlkZXYtPmF2Z19jb3VudCA9IHJlYWRsKGRldi0+cmVncyArIEFDVE1PTl9ERVZfQVZHX0NPVU5UKTsKLQl0ZWdyYV9kZXZmcmVxX3VwZGF0ZV9hdmdfd21hcmsoZGV2KTsKLQotCXZhbCA9IHJlYWRsKGRldi0+cmVncyArIEFDVE1PTl9ERVZfSU5UUl9TVEFUVVMpOwotCWlmICh2YWwgJiBBQ1RNT05fREVWX0lOVFJfQ09OU0VDVVRJVkVfVVBQRVIpIHsKLQkJdmFsID0gcmVhZGwoZGV2LT5yZWdzICsgQUNUTU9OX0RFVl9DVFJMKSB8Ci0JCQlBQ1RNT05fREVWX0NUUkxfQ09OU0VDVVRJVkVfQUJPVkVfV01BUktfRU4gfAotCQkJQUNUTU9OX0RFVl9DVFJMX0NPTlNFQ1VUSVZFX0JFTE9XX1dNQVJLX0VOOwotCisJaWYgKGludHJfc3RhdHVzICYgQUNUTU9OX0RFVl9JTlRSX0NPTlNFQ1VUSVZFX1VQUEVSKSB7CiAJCS8qCiAJCSAqIG5ld19ib29zdCA9IG1pbihvbGRfYm9vc3QgKiB1cF9jb2VmICsgc3RlcCwgbWF4X2ZyZXEpCiAJCSAqLwogCQlkZXYtPmJvb3N0X2ZyZXEgPSBkb19wZXJjZW50KGRldi0+Ym9vc3RfZnJlcSwKIAkJCQkJICAgICBkZXYtPmNvbmZpZy0+Ym9vc3RfdXBfY29lZmYpOwogCQlkZXYtPmJvb3N0X2ZyZXEgKz0gQUNUTU9OX0JPT1NUX0ZSRVFfU1RFUDsKLQkJaWYgKGRldi0+Ym9vc3RfZnJlcSA+PSB0ZWdyYS0+bWF4X2ZyZXEpIHsKLQkJCWRldi0+Ym9vc3RfZnJlcSA9IHRlZ3JhLT5tYXhfZnJlcTsKLQkJCXZhbCAmPSB+QUNUTU9OX0RFVl9DVFJMX0NPTlNFQ1VUSVZFX0FCT1ZFX1dNQVJLX0VOOwotCQl9Ci0JCXdyaXRlbCh2YWwsIGRldi0+cmVncyArIEFDVE1PTl9ERVZfQ1RSTCk7Ci0JfSBlbHNlIGlmICh2YWwgJiBBQ1RNT05fREVWX0lOVFJfQ09OU0VDVVRJVkVfTE9XRVIpIHsKLQkJdmFsID0gcmVhZGwoZGV2LT5yZWdzICsgQUNUTU9OX0RFVl9DVFJMKSB8Ci0JCQlBQ1RNT05fREVWX0NUUkxfQ09OU0VDVVRJVkVfQUJPVkVfV01BUktfRU4gfAotCQkJQUNUTU9OX0RFVl9DVFJMX0NPTlNFQ1VUSVZFX0JFTE9XX1dNQVJLX0VOOwogCisJCWRldl9jdHJsIHw9IEFDVE1PTl9ERVZfQ1RSTF9DT05TRUNVVElWRV9CRUxPV19XTUFSS19FTjsKKworCQlpZiAoZGV2LT5ib29zdF9mcmVxID49IHRlZ3JhLT5tYXhfZnJlcSkKKwkJCWRldi0+Ym9vc3RfZnJlcSA9IHRlZ3JhLT5tYXhfZnJlcTsKKwkJZWxzZQorCQkJZGV2X2N0cmwgfD0gQUNUTU9OX0RFVl9DVFJMX0NPTlNFQ1VUSVZFX0FCT1ZFX1dNQVJLX0VOOworCX0gZWxzZSBpZiAoaW50cl9zdGF0dXMgJiBBQ1RNT05fREVWX0lOVFJfQ09OU0VDVVRJVkVfTE9XRVIpIHsKIAkJLyoKIAkJICogbmV3X2Jvb3N0ID0gb2xkX2Jvb3N0ICogZG93bl9jb2VmCiAJCSAqIG9yIDAgaWYgKG9sZF9ib29zdCAqIGRvd25fY29lZiA8IHN0ZXAgLyAyKQogCQkgKi8KIAkJZGV2LT5ib29zdF9mcmVxID0gZG9fcGVyY2VudChkZXYtPmJvb3N0X2ZyZXEsCiAJCQkJCSAgICAgZGV2LT5jb25maWctPmJvb3N0X2Rvd25fY29lZmYpOwotCQlpZiAoZGV2LT5ib29zdF9mcmVxIDwgKEFDVE1PTl9CT09TVF9GUkVRX1NURVAgPj4gMSkpIHsKKworCQlkZXZfY3RybCB8PSBBQ1RNT05fREVWX0NUUkxfQ09OU0VDVVRJVkVfQUJPVkVfV01BUktfRU47CisKKwkJaWYgKGRldi0+Ym9vc3RfZnJlcSA8IChBQ1RNT05fQk9PU1RfRlJFUV9TVEVQID4+IDEpKQogCQkJZGV2LT5ib29zdF9mcmVxID0gMDsKLQkJCXZhbCAmPSB+QUNUTU9OX0RFVl9DVFJMX0NPTlNFQ1VUSVZFX0JFTE9XX1dNQVJLX0VOOwotCQl9Ci0JCXdyaXRlbCh2YWwsIGRldi0+cmVncyArIEFDVE1PTl9ERVZfQ1RSTCk7CisJCWVsc2UKKwkJCWRldl9jdHJsIHw9IEFDVE1PTl9ERVZfQ1RSTF9DT05TRUNVVElWRV9CRUxPV19XTUFSS19FTjsKIAl9CiAKIAlpZiAoZGV2LT5jb25maWctPmF2Z19kZXBlbmRlbmN5X3RocmVzaG9sZCkgewotCQl2YWwgPSByZWFkbChkZXYtPnJlZ3MgKyBBQ1RNT05fREVWX0NUUkwpOwogCQlpZiAoZGV2LT5hdmdfY291bnQgPj0gZGV2LT5jb25maWctPmF2Z19kZXBlbmRlbmN5X3RocmVzaG9sZCkKLQkJCXZhbCB8PSBBQ1RNT05fREVWX0NUUkxfQ09OU0VDVVRJVkVfQkVMT1dfV01BUktfRU47CisJCQlkZXZfY3RybCB8PSBBQ1RNT05fREVWX0NUUkxfQ09OU0VDVVRJVkVfQkVMT1dfV01BUktfRU47CiAJCWVsc2UgaWYgKGRldi0+Ym9vc3RfZnJlcSA9PSAwKQotCQkJdmFsICY9IH5BQ1RNT05fREVWX0NUUkxfQ09OU0VDVVRJVkVfQkVMT1dfV01BUktfRU47Ci0JCXdyaXRlbCh2YWwsIGRldi0+cmVncyArIEFDVE1PTl9ERVZfQ1RSTCk7CisJCQlkZXZfY3RybCAmPSB+QUNUTU9OX0RFVl9DVFJMX0NPTlNFQ1VUSVZFX0JFTE9XX1dNQVJLX0VOOwogCX0KIAotCXdyaXRlbChBQ1RNT05fSU5UUl9TVEFUVVNfQ0xFQVIsIGRldi0+cmVncyArIEFDVE1PTl9ERVZfSU5UUl9TVEFUVVMpOworCWRldmljZV93cml0ZWwoZGV2LCBkZXZfY3RybCwgQUNUTU9OX0RFVl9DVFJMKTsKKworCWRldmljZV93cml0ZWwoZGV2LCBBQ1RNT05fSU5UUl9TVEFUVVNfQ0xFQVIsIEFDVE1PTl9ERVZfSU5UUl9TVEFUVVMpOwogCiAJYWN0bW9uX3dyaXRlX2JhcnJpZXIodGVncmEpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGVncmEtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKK30KIAotCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7CitzdGF0aWMgaXJxcmV0dXJuX3QgYWN0bW9uX2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB0ZWdyYV9kZXZmcmVxICp0ZWdyYSA9IGRhdGE7CisJYm9vbCBoYW5kbGVkID0gZmFsc2U7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIHZhbDsKKworCXZhbCA9IGFjdG1vbl9yZWFkbCh0ZWdyYSwgQUNUTU9OX0dMQl9TVEFUVVMpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlZ3JhLT5kZXZpY2VzKTsgaSsrKSB7CisJCWlmICh2YWwgJiB0ZWdyYS0+ZGV2aWNlc1tpXS5jb25maWctPmlycV9tYXNrKSB7CisJCQlhY3Rtb25faXNyX2RldmljZSh0ZWdyYSwgdGVncmEtPmRldmljZXMgKyBpKTsKKwkJCWhhbmRsZWQgPSB0cnVlOworCQl9CisJfQorCisJcmV0dXJuIGhhbmRsZWQgPyBJUlFfV0FLRV9USFJFQUQgOiBJUlFfTk9ORTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYWN0bW9uX2NwdV90b19lbWNfcmF0ZShzdHJ1Y3QgdGVncmFfZGV2ZnJlcSAqdGVncmEsCkBAIC0zMTcsNyArMzU1LDcgQEAKIAkJc3RhdGljX2NwdV9lbWNfZnJlcSA9IGFjdG1vbl9jcHVfdG9fZW1jX3JhdGUodGVncmEsIGNwdV9mcmVxKTsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdGVncmEtPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CiAKIAlkZXYtPnRhcmdldF9mcmVxID0gZGV2LT5hdmdfY291bnQgLyBBQ1RNT05fU0FNUExJTkdfUEVSSU9EOwogCWF2Z19zdXN0YWluX2NvZWYgPSAxMDAgKiAxMDAgLyBkZXYtPmNvbmZpZy0+Ym9vc3RfdXBfdGhyZXNob2xkOwpAQCAtMzI3LDcgKzM2NSw3IEBACiAJaWYgKGRldi0+YXZnX2NvdW50ID49IGRldi0+Y29uZmlnLT5hdmdfZGVwZW5kZW5jeV90aHJlc2hvbGQpCiAJCWRldi0+dGFyZ2V0X2ZyZXEgPSBtYXgoZGV2LT50YXJnZXRfZnJlcSwgc3RhdGljX2NwdV9lbWNfZnJlcSk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0ZWdyYS0+bG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgYWN0bW9uX3RocmVhZF9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSkKQEAgLTM0NSwxMzEgKzM4MywxMTAgQEAKIAkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKnB0cikKIHsKIAlzdHJ1Y3QgY2xrX25vdGlmaWVyX2RhdGEgKmRhdGEgPSBwdHI7Ci0Jc3RydWN0IHRlZ3JhX2RldmZyZXEgKnRlZ3JhID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgdGVncmFfZGV2ZnJlcSwKLQkJCQkJCSAgIHJhdGVfY2hhbmdlX25iKTsKKwlzdHJ1Y3QgdGVncmFfZGV2ZnJlcSAqdGVncmE7CisJc3RydWN0IHRlZ3JhX2RldmZyZXFfZGV2aWNlICpkZXY7CiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0ZWdyYS0+bG9jaywgZmxhZ3MpOworCWlmIChhY3Rpb24gIT0gUE9TVF9SQVRFX0NIQU5HRSkKKwkJcmV0dXJuIE5PVElGWV9PSzsKIAotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBQT1NUX1JBVEVfQ0hBTkdFOgotCQl0ZWdyYS0+Y3VyX2ZyZXEgPSBkYXRhLT5uZXdfcmF0ZSAvIEtIWjsKKwl0ZWdyYSA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IHRlZ3JhX2RldmZyZXEsIHJhdGVfY2hhbmdlX25iKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0ZWdyYS0+ZGV2aWNlcyk7IGkrKykKLQkJCXRlZ3JhX2RldmZyZXFfdXBkYXRlX3dtYXJrKHRlZ3JhLCB0ZWdyYS0+ZGV2aWNlcyArIGkpOworCXRlZ3JhLT5jdXJfZnJlcSA9IGRhdGEtPm5ld19yYXRlIC8gS0haOwogCi0JCWFjdG1vbl93cml0ZV9iYXJyaWVyKHRlZ3JhKTsKLQkJYnJlYWs7Ci0JY2FzZSBQUkVfUkFURV9DSEFOR0U6Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgQUJPUlRfUkFURV9DSEFOR0U6Ci0JCWJyZWFrOwotCX07CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVncmEtPmRldmljZXMpOyBpKyspIHsKKwkJZGV2ID0gJnRlZ3JhLT5kZXZpY2VzW2ldOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGVncmEtPmxvY2ssIGZsYWdzKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCQl0ZWdyYV9kZXZmcmVxX3VwZGF0ZV93bWFyayh0ZWdyYSwgZGV2KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJfQorCisJYWN0bW9uX3dyaXRlX2JhcnJpZXIodGVncmEpOwogCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAorc3RhdGljIHZvaWQgdGVncmFfYWN0bW9uX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCB0ZWdyYV9kZXZmcmVxICp0ZWdyYSkKK3sKKwlzdHJ1Y3QgdGVncmFfZGV2ZnJlcV9kZXZpY2UgKmRldjsKKwl1MzIgdmFsOworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVncmEtPmRldmljZXMpOyBpKyspIHsKKwkJZGV2ID0gJnRlZ3JhLT5kZXZpY2VzW2ldOworCisJCXZhbCA9IGRldmljZV9yZWFkbChkZXYsIEFDVE1PTl9ERVZfQ1RSTCk7CisJCXZhbCB8PSBBQ1RNT05fREVWX0NUUkxfQVZHX0FCT1ZFX1dNQVJLX0VOOworCQl2YWwgfD0gQUNUTU9OX0RFVl9DVFJMX0FWR19CRUxPV19XTUFSS19FTjsKKwkJdmFsIHw9IEFDVE1PTl9ERVZfQ1RSTF9DT05TRUNVVElWRV9CRUxPV19XTUFSS19FTjsKKwkJdmFsIHw9IEFDVE1PTl9ERVZfQ1RSTF9DT05TRUNVVElWRV9BQk9WRV9XTUFSS19FTjsKKworCQlkZXZpY2Vfd3JpdGVsKGRldiwgdmFsLCBBQ1RNT05fREVWX0NUUkwpOworCX0KKworCWFjdG1vbl93cml0ZV9iYXJyaWVyKHRlZ3JhKTsKK30KKworc3RhdGljIHZvaWQgdGVncmFfYWN0bW9uX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgdGVncmFfZGV2ZnJlcSAqdGVncmEpCit7CisJc3RydWN0IHRlZ3JhX2RldmZyZXFfZGV2aWNlICpkZXY7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlZ3JhLT5kZXZpY2VzKTsgaSsrKSB7CisJCWRldiA9ICZ0ZWdyYS0+ZGV2aWNlc1tpXTsKKworCQl2YWwgPSBkZXZpY2VfcmVhZGwoZGV2LCBBQ1RNT05fREVWX0NUUkwpOworCQl2YWwgJj0gfkFDVE1PTl9ERVZfQ1RSTF9BVkdfQUJPVkVfV01BUktfRU47CisJCXZhbCAmPSB+QUNUTU9OX0RFVl9DVFJMX0FWR19CRUxPV19XTUFSS19FTjsKKwkJdmFsICY9IH5BQ1RNT05fREVWX0NUUkxfQ09OU0VDVVRJVkVfQkVMT1dfV01BUktfRU47CisJCXZhbCAmPSB+QUNUTU9OX0RFVl9DVFJMX0NPTlNFQ1VUSVZFX0FCT1ZFX1dNQVJLX0VOOworCisJCWRldmljZV93cml0ZWwoZGV2LCB2YWwsIEFDVE1PTl9ERVZfQ1RSTCk7CisJfQorCisJYWN0bW9uX3dyaXRlX2JhcnJpZXIodGVncmEpOworfQorCiBzdGF0aWMgdm9pZCB0ZWdyYV9hY3Rtb25fY29uZmlndXJlX2RldmljZShzdHJ1Y3QgdGVncmFfZGV2ZnJlcSAqdGVncmEsCiAJCQkJCSAgc3RydWN0IHRlZ3JhX2RldmZyZXFfZGV2aWNlICpkZXYpCiB7Ci0JdTMyIHZhbDsKKwl1MzIgdmFsID0gMDsKIAotCWRldi0+YXZnX2JhbmRfZnJlcSA9IHRlZ3JhLT5tYXhfZnJlcSAqIEFDVE1PTl9ERUZBVUxUX0FWR19CQU5EIC8gS0haOwogCWRldi0+dGFyZ2V0X2ZyZXEgPSB0ZWdyYS0+Y3VyX2ZyZXE7CiAKIAlkZXYtPmF2Z19jb3VudCA9IHRlZ3JhLT5jdXJfZnJlcSAqIEFDVE1PTl9TQU1QTElOR19QRVJJT0Q7Ci0Jd3JpdGVsKGRldi0+YXZnX2NvdW50LCBkZXYtPnJlZ3MgKyBBQ1RNT05fREVWX0lOSVRfQVZHKTsKKwlkZXZpY2Vfd3JpdGVsKGRldiwgZGV2LT5hdmdfY291bnQsIEFDVE1PTl9ERVZfSU5JVF9BVkcpOwogCi0JdGVncmFfZGV2ZnJlcV91cGRhdGVfYXZnX3dtYXJrKGRldik7CisJdGVncmFfZGV2ZnJlcV91cGRhdGVfYXZnX3dtYXJrKHRlZ3JhLCBkZXYpOwogCXRlZ3JhX2RldmZyZXFfdXBkYXRlX3dtYXJrKHRlZ3JhLCBkZXYpOwogCi0Jd3JpdGVsKEFDVE1PTl9DT1VOVF9XRUlHSFQsIGRldi0+cmVncyArIEFDVE1PTl9ERVZfQ09VTlRfV0VJR0hUKTsKLQl3cml0ZWwoQUNUTU9OX0lOVFJfU1RBVFVTX0NMRUFSLCBkZXYtPnJlZ3MgKyBBQ1RNT05fREVWX0lOVFJfU1RBVFVTKTsKKwlkZXZpY2Vfd3JpdGVsKGRldiwgQUNUTU9OX0NPVU5UX1dFSUdIVCwgQUNUTU9OX0RFVl9DT1VOVF9XRUlHSFQpOworCWRldmljZV93cml0ZWwoZGV2LCBBQ1RNT05fSU5UUl9TVEFUVVNfQ0xFQVIsIEFDVE1PTl9ERVZfSU5UUl9TVEFUVVMpOwogCi0JdmFsID0gMDsKLQl2YWwgfD0gQUNUTU9OX0RFVl9DVFJMX0VOQl9QRVJJT0RJQyB8Ci0JICAgICAgIEFDVE1PTl9ERVZfQ1RSTF9BVkdfQUJPVkVfV01BUktfRU4gfAotCSAgICAgICBBQ1RNT05fREVWX0NUUkxfQVZHX0JFTE9XX1dNQVJLX0VOOworCXZhbCB8PSBBQ1RNT05fREVWX0NUUkxfRU5CX1BFUklPRElDOwogCXZhbCB8PSAoQUNUTU9OX0FWRVJBR0VfV0lORE9XX0xPRzIgLSAxKQogCQk8PCBBQ1RNT05fREVWX0NUUkxfS19WQUxfU0hJRlQ7CiAJdmFsIHw9IChBQ1RNT05fQkVMT1dfV01BUktfV0lORE9XIC0gMSkKIAkJPDwgQUNUTU9OX0RFVl9DVFJMX0NPTlNFQ1VUSVZFX0JFTE9XX1dNQVJLX05VTV9TSElGVDsKIAl2YWwgfD0gKEFDVE1PTl9BQk9WRV9XTUFSS19XSU5ET1cgLSAxKQogCQk8PCBBQ1RNT05fREVWX0NUUkxfQ09OU0VDVVRJVkVfQUJPVkVfV01BUktfTlVNX1NISUZUOwotCXZhbCB8PSBBQ1RNT05fREVWX0NUUkxfQ09OU0VDVVRJVkVfQkVMT1dfV01BUktfRU4gfAotCSAgICAgICBBQ1RNT05fREVWX0NUUkxfQ09OU0VDVVRJVkVfQUJPVkVfV01BUktfRU47Ci0KLQl3cml0ZWwodmFsLCBkZXYtPnJlZ3MgKyBBQ1RNT05fREVWX0NUUkwpOwotCi0JYWN0bW9uX3dyaXRlX2JhcnJpZXIodGVncmEpOwotCi0JdmFsID0gcmVhZGwoZGV2LT5yZWdzICsgQUNUTU9OX0RFVl9DVFJMKTsKIAl2YWwgfD0gQUNUTU9OX0RFVl9DVFJMX0VOQjsKLQl3cml0ZWwodmFsLCBkZXYtPnJlZ3MgKyBBQ1RNT05fREVWX0NUUkwpOworCisJZGV2aWNlX3dyaXRlbChkZXYsIHZhbCwgQUNUTU9OX0RFVl9DVFJMKTsKIAogCWFjdG1vbl93cml0ZV9iYXJyaWVyKHRlZ3JhKTsKIH0KIAotc3RhdGljIGludCB0ZWdyYV9kZXZmcmVxX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IHRlZ3JhX2RldmZyZXEgKnRlZ3JhOwotCXN0cnVjdCB0ZWdyYV9kZXZmcmVxX2RldmljZSAqYWN0bW9uX2RldjsKLQl1bnNpZ25lZCBpbnQgaTsKLQl1MzIgdmFsOwotCi0JcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7Ci0JdGVncmEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlZ3JhLT5kZXZpY2VzKTsgaSsrKSB7Ci0JCWFjdG1vbl9kZXYgPSAmdGVncmEtPmRldmljZXNbaV07Ci0KLQkJdmFsID0gcmVhZGwoYWN0bW9uX2Rldi0+cmVncyArIEFDVE1PTl9ERVZfQ1RSTCk7Ci0JCXZhbCAmPSB+QUNUTU9OX0RFVl9DVFJMX0VOQjsKLQkJd3JpdGVsKHZhbCwgYWN0bW9uX2Rldi0+cmVncyArIEFDVE1PTl9ERVZfQ1RSTCk7Ci0KLQkJd3JpdGVsKEFDVE1PTl9JTlRSX1NUQVRVU19DTEVBUiwKLQkJICAgICAgIGFjdG1vbl9kZXYtPnJlZ3MgKyBBQ1RNT05fREVWX0lOVFJfU1RBVFVTKTsKLQotCQlhY3Rtb25fd3JpdGVfYmFycmllcih0ZWdyYSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGVncmFfZGV2ZnJlcV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IHRlZ3JhX2RldmZyZXEgKnRlZ3JhOwotCXN0cnVjdCB0ZWdyYV9kZXZmcmVxX2RldmljZSAqYWN0bW9uX2RldjsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCXBkZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlLCBkZXYpOwotCXRlZ3JhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0ZWdyYS0+ZGV2aWNlcyk7IGkrKykgewotCQlhY3Rtb25fZGV2ID0gJnRlZ3JhLT5kZXZpY2VzW2ldOwotCi0JCXRlZ3JhX2FjdG1vbl9jb25maWd1cmVfZGV2aWNlKHRlZ3JhLCBhY3Rtb25fZGV2KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCB0ZWdyYV9kZXZmcmVxX3RhcmdldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGxvbmcgKmZyZXEsCiAJCQkJdTMyIGZsYWdzKQogewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IHRlZ3JhX2RldmZyZXEgKnRlZ3JhOworCXN0cnVjdCB0ZWdyYV9kZXZmcmVxICp0ZWdyYSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7CiAJdW5zaWduZWQgbG9uZyByYXRlID0gKmZyZXEgKiBLSFo7CiAKLQlwZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBsYXRmb3JtX2RldmljZSwgZGV2KTsKLQl0ZWdyYSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCiAJcmN1X3JlYWRfbG9jaygpOwogCW9wcCA9IGRldmZyZXFfcmVjb21tZW5kZWRfb3BwKGRldiwgJnJhdGUsIGZsYWdzKTsKIAlpZiAoSVNfRVJSKG9wcCkpIHsKQEAgLTQ4MCwxMCArNDk3LDggQEAKIAlyYXRlID0gZGV2X3BtX29wcF9nZXRfZnJlcShvcHApOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JLyogVE9ETzogT25jZSB3ZSBoYXZlIHBlci11c2VyIGNsayBjb25zdHJhaW50cywgc2V0IGEgZmxvb3IgKi8KLQljbGtfc2V0X3JhdGUodGVncmEtPmVtY19jbG9jaywgcmF0ZSk7Ci0KLQkvKiBUT0RPOiBTZXQgdm9sdGFnZSBhcyB3ZWxsICovCisJY2xrX3NldF9taW5fcmF0ZSh0ZWdyYS0+ZW1jX2Nsb2NrLCByYXRlKTsKKwljbGtfc2V0X3JhdGUodGVncmEtPmVtY19jbG9jaywgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ5MSwxMyArNTA2LDkgQEAKIHN0YXRpYyBpbnQgdGVncmFfZGV2ZnJlcV9nZXRfZGV2X3N0YXR1cyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBkZXZmcmVxX2Rldl9zdGF0dXMgKnN0YXQpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKLQlzdHJ1Y3QgdGVncmFfZGV2ZnJlcSAqdGVncmE7CisJc3RydWN0IHRlZ3JhX2RldmZyZXEgKnRlZ3JhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IHRlZ3JhX2RldmZyZXFfZGV2aWNlICphY3Rtb25fZGV2OwogCi0JcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UsIGRldik7Ci0JdGVncmEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQogCXN0YXQtPmN1cnJlbnRfZnJlcXVlbmN5ID0gdGVncmEtPmN1cl9mcmVxOwogCiAJLyogVG8gYmUgdXNlZCBieSB0aGUgdGVncmEgZ292ZXJub3IgKi8KQEAgLTUwOCw3ICs1MTksNyBAQAogCWFjdG1vbl9kZXYgPSAmdGVncmEtPmRldmljZXNbTUNBTExdOwogCiAJLyogTnVtYmVyIG9mIGN5Y2xlcyBzcGVudCBvbiBtZW1vcnkgYWNjZXNzICovCi0Jc3RhdC0+YnVzeV90aW1lID0gYWN0bW9uX2Rldi0+YXZnX2NvdW50OworCXN0YXQtPmJ1c3lfdGltZSA9IGRldmljZV9yZWFkbChhY3Rtb25fZGV2LCBBQ1RNT05fREVWX0FWR19DT1VOVCk7CiAKIAkvKiBUaGUgYnVzIGNhbiBiZSBjb25zaWRlcmVkIHRvIGJlIHNhdHVyYXRlZCB3YXkgYmVmb3JlIDEwMCUgKi8KIAlzdGF0LT5idXN5X3RpbWUgKj0gMTAwIC8gQlVTX1NBVFVSQVRJT05fUkFUSU87CkBAIC01MTYsMTEgKzUyNywxOSBAQAogCS8qIE51bWJlciBvZiBjeWNsZXMgaW4gYSBzYW1wbGluZyBwZXJpb2QgKi8KIAlzdGF0LT50b3RhbF90aW1lID0gQUNUTU9OX1NBTVBMSU5HX1BFUklPRCAqIHRlZ3JhLT5jdXJfZnJlcTsKIAorCXN0YXQtPmJ1c3lfdGltZSA9IG1pbihzdGF0LT5idXN5X3RpbWUsIHN0YXQtPnRvdGFsX3RpbWUpOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdGVncmFfZGV2ZnJlcV9nZXRfdGFyZ2V0KHN0cnVjdCBkZXZmcmVxICpkZXZmcmVxLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpmcmVxKQorc3RhdGljIHN0cnVjdCBkZXZmcmVxX2Rldl9wcm9maWxlIHRlZ3JhX2RldmZyZXFfcHJvZmlsZSA9IHsKKwkucG9sbGluZ19tcwk9IDAsCisJLnRhcmdldAkJPSB0ZWdyYV9kZXZmcmVxX3RhcmdldCwKKwkuZ2V0X2Rldl9zdGF0dXMJPSB0ZWdyYV9kZXZmcmVxX2dldF9kZXZfc3RhdHVzLAorfTsKKworc3RhdGljIGludCB0ZWdyYV9nb3Zlcm5vcl9nZXRfdGFyZ2V0KHN0cnVjdCBkZXZmcmVxICpkZXZmcmVxLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqZnJlcSkKIHsKIAlzdHJ1Y3QgZGV2ZnJlcV9kZXZfc3RhdHVzIHN0YXQ7CiAJc3RydWN0IHRlZ3JhX2RldmZyZXEgKnRlZ3JhOwpAQCAtNTQ4LDIyICs1NjcsNDMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0ZWdyYV9kZXZmcmVxX2V2ZW50X2hhbmRsZXIoc3RydWN0IGRldmZyZXEgKmRldmZyZXEsCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBldmVudCwgdm9pZCAqZGF0YSkKK3N0YXRpYyBpbnQgdGVncmFfZ292ZXJub3JfZXZlbnRfaGFuZGxlcihzdHJ1Y3QgZGV2ZnJlcSAqZGV2ZnJlcSwKKwkJCQkJdW5zaWduZWQgaW50IGV2ZW50LCB2b2lkICpkYXRhKQogewotCXJldHVybiAwOworCXN0cnVjdCB0ZWdyYV9kZXZmcmVxICp0ZWdyYTsKKwlpbnQgcmV0ID0gMDsKKworCXRlZ3JhID0gZGV2X2dldF9kcnZkYXRhKGRldmZyZXEtPmRldi5wYXJlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgREVWRlJFUV9HT1ZfU1RBUlQ6CisJCWRldmZyZXFfbW9uaXRvcl9zdGFydChkZXZmcmVxKTsKKwkJdGVncmFfYWN0bW9uX2VuYWJsZV9pbnRlcnJ1cHRzKHRlZ3JhKTsKKwkJYnJlYWs7CisKKwljYXNlIERFVkZSRVFfR09WX1NUT1A6CisJCXRlZ3JhX2FjdG1vbl9kaXNhYmxlX2ludGVycnVwdHModGVncmEpOworCQlkZXZmcmVxX21vbml0b3Jfc3RvcChkZXZmcmVxKTsKKwkJYnJlYWs7CisKKwljYXNlIERFVkZSRVFfR09WX1NVU1BFTkQ6CisJCXRlZ3JhX2FjdG1vbl9kaXNhYmxlX2ludGVycnVwdHModGVncmEpOworCQlkZXZmcmVxX21vbml0b3Jfc3VzcGVuZChkZXZmcmVxKTsKKwkJYnJlYWs7CisKKwljYXNlIERFVkZSRVFfR09WX1JFU1VNRToKKwkJZGV2ZnJlcV9tb25pdG9yX3Jlc3VtZShkZXZmcmVxKTsKKwkJdGVncmFfYWN0bW9uX2VuYWJsZV9pbnRlcnJ1cHRzKHRlZ3JhKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZmcmVxX2dvdmVybm9yIHRlZ3JhX2RldmZyZXFfZ292ZXJub3IgPSB7Ci0JLm5hbWUgPSAidGVncmEiLAotCS5nZXRfdGFyZ2V0X2ZyZXEgPSB0ZWdyYV9kZXZmcmVxX2dldF90YXJnZXQsCi0JLmV2ZW50X2hhbmRsZXIgPSB0ZWdyYV9kZXZmcmVxX2V2ZW50X2hhbmRsZXIsCi19OwotCi1zdGF0aWMgc3RydWN0IGRldmZyZXFfZGV2X3Byb2ZpbGUgdGVncmFfZGV2ZnJlcV9wcm9maWxlID0gewotCS5wb2xsaW5nX21zCT0gMCwKLQkudGFyZ2V0CQk9IHRlZ3JhX2RldmZyZXFfdGFyZ2V0LAotCS5nZXRfZGV2X3N0YXR1cwk9IHRlZ3JhX2RldmZyZXFfZ2V0X2Rldl9zdGF0dXMsCisJLm5hbWUgPSAidGVncmFfYWN0bW9uIiwKKwkuZ2V0X3RhcmdldF9mcmVxID0gdGVncmFfZ292ZXJub3JfZ2V0X3RhcmdldCwKKwkuZXZlbnRfaGFuZGxlciA9IHRlZ3JhX2dvdmVybm9yX2V2ZW50X2hhbmRsZXIsCiB9OwogCiBzdGF0aWMgaW50IHRlZ3JhX2RldmZyZXFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTU3MSw4ICs2MTEsOCBAQAogCXN0cnVjdCB0ZWdyYV9kZXZmcmVxICp0ZWdyYTsKIAlzdHJ1Y3QgdGVncmFfZGV2ZnJlcV9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQl1bnNpZ25lZCBsb25nIG1heF9mcmVxOwogCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGxvbmcgcmF0ZTsKIAlpbnQgaXJxOwogCWludCBlcnI7CiAKQEAgLTU4MCwxOSArNjIwLDExIEBACiAJaWYgKCF0ZWdyYSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGluX2xvY2tfaW5pdCgmdGVncmEtPmxvY2spOwotCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpZiAoIXJlcykgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IHJlZ3MgcmVzb3VyY2VcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9CiAKIAl0ZWdyYS0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwotCWlmIChJU19FUlIodGVncmEtPnJlZ3MpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgSU8gbWVtb3J5XG4iKTsKKwlpZiAoSVNfRVJSKHRlZ3JhLT5yZWdzKSkKIAkJcmV0dXJuIFBUUl9FUlIodGVncmEtPnJlZ3MpOwotCX0KIAogCXRlZ3JhLT5yZXNldCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgImFjdG1vbiIpOwogCWlmIChJU19FUlIodGVncmEtPnJlc2V0KSkgewpAQCAtNjEyLDExICs2NDQsNyBAQAogCQlyZXR1cm4gUFRSX0VSUih0ZWdyYS0+ZW1jX2Nsb2NrKTsKIAl9CiAKLQllcnIgPSBvZl9pbml0X29wcF90YWJsZSgmcGRldi0+ZGV2KTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpbml0IG9wZXJhdGluZyBwb2ludCB0YWJsZVxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWNsa19zZXRfcmF0ZSh0ZWdyYS0+ZW1jX2Nsb2NrLCBVTE9OR19NQVgpOwogCiAJdGVncmEtPnJhdGVfY2hhbmdlX25iLm5vdGlmaWVyX2NhbGwgPSB0ZWdyYV9hY3Rtb25fcmF0ZV9ub3RpZnlfY2I7CiAJZXJyID0gY2xrX25vdGlmaWVyX3JlZ2lzdGVyKHRlZ3JhLT5lbWNfY2xvY2ssICZ0ZWdyYS0+cmF0ZV9jaGFuZ2VfbmIpOwpAQCAtNjMwLDQzICs2NTgsNDEgQEAKIAogCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZSh0ZWdyYS0+Y2xvY2spOwogCWlmIChlcnIpIHsKLQkJcmVzZXRfY29udHJvbF9kZWFzc2VydCh0ZWdyYS0+cmVzZXQpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIHByZXBhcmUgYW5kIGVuYWJsZSBBQ1RNT04gY2xvY2tcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAogCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQodGVncmEtPnJlc2V0KTsKIAotCW1heF9mcmVxID0gY2xrX3JvdW5kX3JhdGUodGVncmEtPmVtY19jbG9jaywgVUxPTkdfTUFYKTsKLQl0ZWdyYS0+bWF4X2ZyZXEgPSBtYXhfZnJlcSAvIEtIWjsKLQotCWNsa19zZXRfcmF0ZSh0ZWdyYS0+ZW1jX2Nsb2NrLCBtYXhfZnJlcSk7Ci0KKwl0ZWdyYS0+bWF4X2ZyZXEgPSBjbGtfcm91bmRfcmF0ZSh0ZWdyYS0+ZW1jX2Nsb2NrLCBVTE9OR19NQVgpIC8gS0haOwogCXRlZ3JhLT5jdXJfZnJlcSA9IGNsa19nZXRfcmF0ZSh0ZWdyYS0+ZW1jX2Nsb2NrKSAvIEtIWjsKIAotCXdyaXRlbChBQ1RNT05fU0FNUExJTkdfUEVSSU9EIC0gMSwKLQkgICAgICAgdGVncmEtPnJlZ3MgKyBBQ1RNT05fR0xCX1BFUklPRF9DVFJMKTsKKwlhY3Rtb25fd3JpdGVsKHRlZ3JhLCBBQ1RNT05fU0FNUExJTkdfUEVSSU9EIC0gMSwKKwkJICAgICAgQUNUTU9OX0dMQl9QRVJJT0RfQ1RSTCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhY3Rtb25fZGV2aWNlX2NvbmZpZ3MpOyBpKyspIHsKIAkJZGV2ID0gdGVncmEtPmRldmljZXMgKyBpOwogCQlkZXYtPmNvbmZpZyA9IGFjdG1vbl9kZXZpY2VfY29uZmlncyArIGk7CiAJCWRldi0+cmVncyA9IHRlZ3JhLT5yZWdzICsgZGV2LT5jb25maWctPm9mZnNldDsKKwkJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CiAKLQkJdGVncmFfYWN0bW9uX2NvbmZpZ3VyZV9kZXZpY2UodGVncmEsIHRlZ3JhLT5kZXZpY2VzICsgaSk7CisJCXRlZ3JhX2FjdG1vbl9jb25maWd1cmVfZGV2aWNlKHRlZ3JhLCBkZXYpOwogCX0KIAotCWVyciA9IGRldmZyZXFfYWRkX2dvdmVybm9yKCZ0ZWdyYV9kZXZmcmVxX2dvdmVybm9yKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhZGQgZ292ZXJub3JcbiIpOwotCQlyZXR1cm4gZXJyOworCWZvciAocmF0ZSA9IDA7IHJhdGUgPD0gdGVncmEtPm1heF9mcmVxICogS0haOyByYXRlKyspIHsKKwkJcmF0ZSA9IGNsa19yb3VuZF9yYXRlKHRlZ3JhLT5lbWNfY2xvY2ssIHJhdGUpOworCQlkZXZfcG1fb3BwX2FkZCgmcGRldi0+ZGV2LCByYXRlLCAwKTsKIAl9CiAKLQl0ZWdyYV9kZXZmcmVxX3Byb2ZpbGUuaW5pdGlhbF9mcmVxID0gY2xrX2dldF9yYXRlKHRlZ3JhLT5lbWNfY2xvY2spOwotCXRlZ3JhLT5kZXZmcmVxID0gZGV2bV9kZXZmcmVxX2FkZF9kZXZpY2UoJnBkZXYtPmRldiwKLQkJCQkJCSAmdGVncmFfZGV2ZnJlcV9wcm9maWxlLAotCQkJCQkJICJ0ZWdyYSIsCi0JCQkJCQkgTlVMTCk7Ci0KIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEgPD0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IElSUVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRlZ3JhKTsKKwogCWVyciA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwgaXJxLCBhY3Rtb25faXNyLAogCQkJCQlhY3Rtb25fdGhyZWFkX2lzciwgSVJRRl9TSEFSRUQsCiAJCQkJCSJ0ZWdyYS1kZXZmcmVxIiwgdGVncmEpOwpAQCAtNjc1LDcgKzcwMSwxMSBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRlZ3JhKTsKKwl0ZWdyYV9kZXZmcmVxX3Byb2ZpbGUuaW5pdGlhbF9mcmVxID0gY2xrX2dldF9yYXRlKHRlZ3JhLT5lbWNfY2xvY2spOworCXRlZ3JhLT5kZXZmcmVxID0gZGV2bV9kZXZmcmVxX2FkZF9kZXZpY2UoJnBkZXYtPmRldiwKKwkJCQkJCSAmdGVncmFfZGV2ZnJlcV9wcm9maWxlLAorCQkJCQkJICJ0ZWdyYV9hY3Rtb24iLAorCQkJCQkJIE5VTEwpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02ODMsNiArNzEzLDE5IEBACiBzdGF0aWMgaW50IHRlZ3JhX2RldmZyZXFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHRlZ3JhX2RldmZyZXEgKnRlZ3JhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFjdG1vbl9kZXZpY2VfY29uZmlncyk7IGkrKykgeworCQl2YWwgPSBkZXZpY2VfcmVhZGwoJnRlZ3JhLT5kZXZpY2VzW2ldLCBBQ1RNT05fREVWX0NUUkwpOworCQl2YWwgJj0gfkFDVE1PTl9ERVZfQ1RSTF9FTkI7CisJCWRldmljZV93cml0ZWwoJnRlZ3JhLT5kZXZpY2VzW2ldLCB2YWwsIEFDVE1PTl9ERVZfQ1RSTCk7CisJfQorCisJYWN0bW9uX3dyaXRlX2JhcnJpZXIodGVncmEpOworCisJZGV2bV9mcmVlX2lycSgmcGRldi0+ZGV2LCBpcnEsIHRlZ3JhKTsKIAogCWNsa19ub3RpZmllcl91bnJlZ2lzdGVyKHRlZ3JhLT5lbWNfY2xvY2ssICZ0ZWdyYS0+cmF0ZV9jaGFuZ2VfbmIpOwogCkBAIC02OTEsMjggKzczNCw1MiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgU0lNUExFX0RFVl9QTV9PUFModGVncmFfZGV2ZnJlcV9wbV9vcHMsCi0JCQkgdGVncmFfZGV2ZnJlcV9zdXNwZW5kLAotCQkJIHRlZ3JhX2RldmZyZXFfcmVzdW1lKTsKLQotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfZGV2ZnJlcV9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfZGV2ZnJlcV9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMTI0LWFjdG1vbiIgfSwKIAl7IH0sCiB9OwogCitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0ZWdyYV9kZXZmcmVxX29mX21hdGNoKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfZGV2ZnJlcV9kcml2ZXIgPSB7CiAJLnByb2JlCT0gdGVncmFfZGV2ZnJlcV9wcm9iZSwKIAkucmVtb3ZlCT0gdGVncmFfZGV2ZnJlcV9yZW1vdmUsCiAJLmRyaXZlciA9IHsKLQkJLm5hbWUJCT0gInRlZ3JhLWRldmZyZXEiLAotCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJCS5uYW1lID0gInRlZ3JhLWRldmZyZXEiLAogCQkub2ZfbWF0Y2hfdGFibGUgPSB0ZWdyYV9kZXZmcmVxX29mX21hdGNoLAotCQkucG0JCT0gJnRlZ3JhX2RldmZyZXFfcG1fb3BzLAogCX0sCiB9OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0ZWdyYV9kZXZmcmVxX2RyaXZlcik7CiAKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK3N0YXRpYyBpbnQgX19pbml0IHRlZ3JhX2RldmZyZXFfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gZGV2ZnJlcV9hZGRfZ292ZXJub3IoJnRlZ3JhX2RldmZyZXFfZ292ZXJub3IpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIGFkZCBnb3Zlcm5vcjogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdGVncmFfZGV2ZnJlcV9kcml2ZXIpOworCWlmIChyZXQpCisJCWRldmZyZXFfcmVtb3ZlX2dvdmVybm9yKCZ0ZWdyYV9kZXZmcmVxX2dvdmVybm9yKTsKKworCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdCh0ZWdyYV9kZXZmcmVxX2luaXQpCisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZWdyYV9kZXZmcmVxX2V4aXQodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZWdyYV9kZXZmcmVxX2RyaXZlcik7CisKKwlyZXQgPSBkZXZmcmVxX3JlbW92ZV9nb3Zlcm5vcigmdGVncmFfZGV2ZnJlcV9nb3Zlcm5vcik7CisJaWYgKHJldCkKKwkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlbW92ZSBnb3Zlcm5vcjogJWRcbiIsIF9fZnVuY19fLCByZXQpOworfQorbW9kdWxlX2V4aXQodGVncmFfZGV2ZnJlcV9leGl0KQorCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlRlZ3JhIGRldmZyZXEgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJUb21ldSBWaXpvc28gPHRvbWV1LnZpem9zb0Bjb2xsYWJvcmEuY29tPiIpOwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgdGVncmFfZGV2ZnJlcV9vZl9tYXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9LY29uZmlnIGIvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRleCBhODc0YjZlLi45NDJjYTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hL0tjb25maWcKQEAgLTUxLDE5ICs1MSw2IEBACiAJICBPUyBhbmQgdG9vbHMgZm9yIE1JQyB0byB1c2Ugd2l0aCB0aGlzIGRyaXZlciBhcmUgYXZhaWxhYmxlIGZyb20KIAkgIDxodHRwOi8vc29mdHdhcmUuaW50ZWwuY29tL2VuLXVzL21pYy1kZXZlbG9wZXI+LgogCi1jb25maWcgSU5URUxfTUlEX0RNQUMKLQl0cmlzdGF0ZSAiSW50ZWwgTUlEIERNQSBzdXBwb3J0IGZvciBQZXJpcGhlcmFsIERNQSBjb250cm9sbGVycyIKLQlkZXBlbmRzIG9uIFBDSSAmJiBYODYKLQlzZWxlY3QgRE1BX0VOR0lORQotCWRlZmF1bHQgbgotCWhlbHAKLQkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgSW50ZWwoUikgTUlEIERNQSBlbmdpbmUgcHJlc2VudAotCSAgaW4gSW50ZWwgTUlEIGNoaXBzZXRzLgotCi0JICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIHN1Y2ggYSBjaGlwc2V0LgotCi0JICBJZiB1bnN1cmUsIHNheSBOLgotCiBjb25maWcgQVNZTkNfVFhfRU5BQkxFX0NIQU5ORUxfU1dJVENICiAJYm9vbAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9NYWtlZmlsZSBiL2RyaXZlcnMvZG1hL01ha2VmaWxlCmluZGV4IGY5MTVmNjEuLjUzOWQ0ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZG1hL01ha2VmaWxlCkBAIC02LDcgKzYsNiBAQAogb2JqLSQoQ09ORklHX0RNQV9BQ1BJKSArPSBhY3BpLWRtYS5vCiBvYmotJChDT05GSUdfRE1BX09GKSArPSBvZi1kbWEubwogCi1vYmotJChDT05GSUdfSU5URUxfTUlEX0RNQUMpICs9IGludGVsX21pZF9kbWEubwogb2JqLSQoQ09ORklHX0RNQVRFU1QpICs9IGRtYXRlc3Qubwogb2JqLSQoQ09ORklHX0lOVEVMX0lPQVRETUEpICs9IGlvYXQvCiBvYmotJChDT05GSUdfSU5URUxfSU9QX0FETUEpICs9IGlvcC1hZG1hLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2FtYmEtcGwwOHguYyBiL2RyaXZlcnMvZG1hL2FtYmEtcGwwOHguYwppbmRleCA0YTVmZDI0Li44M2FhNTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9hbWJhLXBsMDh4LmMKKysrIGIvZHJpdmVycy9kbWEvYW1iYS1wbDA4eC5jCkBAIC05Nyw2ICs5NywxMiBAQAogCiAjZGVmaW5lIERSSVZFUl9OQU1FCSJwbDA4eGRtYWMiCiAKKyNkZWZpbmUgUEw4MFhfRE1BX0JVU1dJRFRIUyBcCisJQklUKERNQV9TTEFWRV9CVVNXSURUSF9VTkRFRklORUQpIHwgXAorCUJJVChETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFKSB8IFwKKwlCSVQoRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVMpIHwgXAorCUJJVChETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUykKKwogc3RhdGljIHN0cnVjdCBhbWJhX2RyaXZlciBwbDA4eF9hbWJhX2RyaXZlcjsKIHN0cnVjdCBwbDA4eF9kcml2ZXJfZGF0YTsKIApAQCAtMjA3MCw2ICsyMDc2LDEwIEBACiAJcGwwOHgtPm1lbWNweS5kZXZpY2VfcGF1c2UgPSBwbDA4eF9wYXVzZTsKIAlwbDA4eC0+bWVtY3B5LmRldmljZV9yZXN1bWUgPSBwbDA4eF9yZXN1bWU7CiAJcGwwOHgtPm1lbWNweS5kZXZpY2VfdGVybWluYXRlX2FsbCA9IHBsMDh4X3Rlcm1pbmF0ZV9hbGw7CisJcGwwOHgtPm1lbWNweS5zcmNfYWRkcl93aWR0aHMgPSBQTDgwWF9ETUFfQlVTV0lEVEhTOworCXBsMDh4LT5tZW1jcHkuZHN0X2FkZHJfd2lkdGhzID0gUEw4MFhfRE1BX0JVU1dJRFRIUzsKKwlwbDA4eC0+bWVtY3B5LmRpcmVjdGlvbnMgPSBCSVQoRE1BX01FTV9UT19NRU0pOworCXBsMDh4LT5tZW1jcHkucmVzaWR1ZV9ncmFudWxhcml0eSA9IERNQV9SRVNJRFVFX0dSQU5VTEFSSVRZX1NFR01FTlQ7CiAKIAkvKiBJbml0aWFsaXplIHNsYXZlIGVuZ2luZSAqLwogCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgcGwwOHgtPnNsYXZlLmNhcF9tYXNrKTsKQEAgLTIwODYsNiArMjA5NiwxMCBAQAogCXBsMDh4LT5zbGF2ZS5kZXZpY2VfcGF1c2UgPSBwbDA4eF9wYXVzZTsKIAlwbDA4eC0+c2xhdmUuZGV2aWNlX3Jlc3VtZSA9IHBsMDh4X3Jlc3VtZTsKIAlwbDA4eC0+c2xhdmUuZGV2aWNlX3Rlcm1pbmF0ZV9hbGwgPSBwbDA4eF90ZXJtaW5hdGVfYWxsOworCXBsMDh4LT5zbGF2ZS5zcmNfYWRkcl93aWR0aHMgPSBQTDgwWF9ETUFfQlVTV0lEVEhTOworCXBsMDh4LT5zbGF2ZS5kc3RfYWRkcl93aWR0aHMgPSBQTDgwWF9ETUFfQlVTV0lEVEhTOworCXBsMDh4LT5zbGF2ZS5kaXJlY3Rpb25zID0gQklUKERNQV9ERVZfVE9fTUVNKSB8IEJJVChETUFfTUVNX1RPX0RFVik7CisJcGwwOHgtPnNsYXZlLnJlc2lkdWVfZ3JhbnVsYXJpdHkgPSBETUFfUkVTSURVRV9HUkFOVUxBUklUWV9TRUdNRU5UOwogCiAJLyogR2V0IHRoZSBwbGF0Zm9ybSBkYXRhICovCiAJcGwwOHgtPnBkID0gZGV2X2dldF9wbGF0ZGF0YSgmYWRldi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMgYi9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jCmluZGV4IDFlMWE0YzUuLjBiNGZjNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMKKysrIGIvZHJpdmVycy9kbWEvYXRfaGRtYWMuYwpAQCAtMjM4LDkzICsyMzgsMTI2IEBACiB9CiAKIC8qCi0gKiBhdGNfZ2V0X2N1cnJlbnRfZGVzY3JpcHRvcnMgLQotICogbG9jYXRlIHRoZSBkZXNjcmlwdG9yIHdoaWNoIGVxdWFsIHRvIHBoeXNpY2FsIGFkZHJlc3MgaW4gRFNDUgotICogQGF0Y2hhbjogdGhlIGNoYW5uZWwgd2Ugd2FudCB0byBzdGFydAotICogQGRzY3JfYWRkcjogcGh5c2ljYWwgZGVzY3JpcHRvciBhZGRyZXNzIGluIERTQ1IKKyAqIGF0Y19nZXRfZGVzY19ieV9jb29raWUgLSBnZXQgdGhlIGRlc2NyaXB0b3Igb2YgYSBjb29raWUKKyAqIEBhdGNoYW46IHRoZSBETUEgY2hhbm5lbAorICogQGNvb2tpZTogdGhlIGNvb2tpZSB0byBnZXQgdGhlIGRlc2NyaXB0b3IgZm9yCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgYXRfZGVzYyAqYXRjX2dldF9jdXJyZW50X2Rlc2NyaXB0b3JzKHN0cnVjdCBhdF9kbWFfY2hhbiAqYXRjaGFuLAotCQkJCQkJCXUzMiBkc2NyX2FkZHIpCitzdGF0aWMgc3RydWN0IGF0X2Rlc2MgKmF0Y19nZXRfZGVzY19ieV9jb29raWUoc3RydWN0IGF0X2RtYV9jaGFuICphdGNoYW4sCisJCQkJCQlkbWFfY29va2llX3QgY29va2llKQogewotCXN0cnVjdCBhdF9kZXNjICAqZGVzYywgKl9kZXNjLCAqY2hpbGQsICpkZXNjX2N1ciA9IE5VTEw7CisJc3RydWN0IGF0X2Rlc2MgKmRlc2MsICpfZGVzYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZGVzYywgJmF0Y2hhbi0+cXVldWUsIGRlc2Nfbm9kZSkgeworCQlpZiAoZGVzYy0+dHhkLmNvb2tpZSA9PSBjb29raWUpCisJCQlyZXR1cm4gZGVzYzsKKwl9CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsICZhdGNoYW4tPmFjdGl2ZV9saXN0LCBkZXNjX25vZGUpIHsKLQkJaWYgKGRlc2MtPmxsaS5kc2NyID09IGRzY3JfYWRkcikgewotCQkJZGVzY19jdXIgPSBkZXNjOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCAmZGVzYy0+dHhfbGlzdCwgZGVzY19ub2RlKSB7Ci0JCQlpZiAoY2hpbGQtPmxsaS5kc2NyID09IGRzY3JfYWRkcikgewotCQkJCWRlc2NfY3VyID0gY2hpbGQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKwkJaWYgKGRlc2MtPnR4ZC5jb29raWUgPT0gY29va2llKQorCQkJcmV0dXJuIGRlc2M7CiAJfQogCi0JcmV0dXJuIGRlc2NfY3VyOworCXJldHVybiBOVUxMOwogfQogCi0vKgotICogYXRjX2dldF9ieXRlc19sZWZ0IC0KLSAqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlc2lkdWUgaW4gZG1hIGJ1ZmZlciwKLSAqIEBjaGFuOiB0aGUgY2hhbm5lbCB3ZSB3YW50IHRvIHN0YXJ0CisvKioKKyAqIGF0Y19jYWxjX2J5dGVzX2xlZnQgLSBjYWxjdWxhdGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgbGVmdCBhY2NvcmRpbmcgdG8gdGhlCisgKiB2YWx1ZSByZWFkIGZyb20gQ1RSTEEuCisgKgorICogQGN1cnJlbnRfbGVuOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgYmVmb3JlIHJlYWRpbmcgQ1RSTEEKKyAqIEBjdHJsYTogdGhlIHZhbHVlIG9mIENUUkxBCisgKiBAZGVzYzogdGhlIGRlc2NyaXB0b3IgY29udGFpbmluZyB0aGUgdHJhbnNmZXIgd2lkdGgKICAqLwotc3RhdGljIGludCBhdGNfZ2V0X2J5dGVzX2xlZnQoc3RydWN0IGRtYV9jaGFuICpjaGFuKQorc3RhdGljIGlubGluZSBpbnQgYXRjX2NhbGNfYnl0ZXNfbGVmdChpbnQgY3VycmVudF9sZW4sIHUzMiBjdHJsYSwKKwkJCQkJc3RydWN0IGF0X2Rlc2MgKmRlc2MpCit7CisJcmV0dXJuIGN1cnJlbnRfbGVuIC0gKChjdHJsYSAmIEFUQ19CVFNJWkVfTUFYKSA8PCBkZXNjLT50eF93aWR0aCk7Cit9CisKKy8qKgorICogYXRjX2NhbGNfYnl0ZXNfbGVmdF9mcm9tX3JlZyAtIGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IGFjY29yZGluZworICogdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgQ1RSTEEuCisgKgorICogQGN1cnJlbnRfbGVuOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgYmVmb3JlIHJlYWRpbmcgQ1RSTEEKKyAqIEBhdGNoYW46IHRoZSBjaGFubmVsIHRvIHJlYWQgQ1RSTEEgZm9yCisgKiBAZGVzYzogdGhlIGRlc2NyaXB0b3IgY29udGFpbmluZyB0aGUgdHJhbnNmZXIgd2lkdGgKKyAqLworc3RhdGljIGlubGluZSBpbnQgYXRjX2NhbGNfYnl0ZXNfbGVmdF9mcm9tX3JlZyhpbnQgY3VycmVudF9sZW4sCisJCQlzdHJ1Y3QgYXRfZG1hX2NoYW4gKmF0Y2hhbiwgc3RydWN0IGF0X2Rlc2MgKmRlc2MpCit7CisJdTMyIGN0cmxhID0gY2hhbm5lbF9yZWFkbChhdGNoYW4sIENUUkxBKTsKKworCXJldHVybiBhdGNfY2FsY19ieXRlc19sZWZ0KGN1cnJlbnRfbGVuLCBjdHJsYSwgZGVzYyk7Cit9CisKKy8qKgorICogYXRjX2dldF9ieXRlc19sZWZ0IC0gZ2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVzaWR1ZSBmb3IgYSBjb29raWUKKyAqIEBjaGFuOiBETUEgY2hhbm5lbAorICogQGNvb2tpZTogdHJhbnNhY3Rpb24gaWRlbnRpZmllciB0byBjaGVjayBzdGF0dXMgb2YKKyAqLworc3RhdGljIGludCBhdGNfZ2V0X2J5dGVzX2xlZnQoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfY29va2llX3QgY29va2llKQogewogCXN0cnVjdCBhdF9kbWFfY2hhbiAgICAgICphdGNoYW4gPSB0b19hdF9kbWFfY2hhbihjaGFuKTsKLQlzdHJ1Y3QgYXRfZG1hICAgICAgICAgICAqYXRkbWEgPSB0b19hdF9kbWEoY2hhbi0+ZGV2aWNlKTsKLQlpbnQJY2hhbl9pZCA9IGF0Y2hhbi0+Y2hhbl9jb21tb24uY2hhbl9pZDsKIAlzdHJ1Y3QgYXRfZGVzYyAqZGVzY19maXJzdCA9IGF0Y19maXJzdF9hY3RpdmUoYXRjaGFuKTsKLQlzdHJ1Y3QgYXRfZGVzYyAqZGVzY19jdXI7Ci0JaW50IHJldCA9IDAsIGNvdW50ID0gMDsKKwlzdHJ1Y3QgYXRfZGVzYyAqZGVzYzsKKwlpbnQgcmV0OworCXUzMiBjdHJsYSwgZHNjcjsKIAogCS8qCi0JICogSW5pdGlhbGl6ZSBuZWNlc3NhcnkgdmFsdWVzIGluIHRoZSBmaXJzdCB0aW1lLgotCSAqIHJlbWFpbl9kZXNjIHJlY29yZCByZW1haW4gZGVzYyBsZW5ndGguCisJICogSWYgdGhlIGNvb2tpZSBkb2Vzbid0IG1hdGNoIHRvIHRoZSBjdXJyZW50bHkgcnVubmluZyB0cmFuc2ZlciB0aGVuCisJICogd2UgY2FuIHJldHVybiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBhc3NvY2lhdGVkIERNQSB0cmFuc2ZlciwKKwkgKiBiZWNhdXNlIGl0IGlzIHN0aWxsIHF1ZXVlZC4KIAkgKi8KLQlpZiAoYXRjaGFuLT5yZW1haW5fZGVzYyA9PSAwKQotCQkvKiBGaXJzdCBkZXNjcmlwdG9yIGVtYmVkZHMgdGhlIHRyYW5zYWN0aW9uIGxlbmd0aCAqLwotCQlhdGNoYW4tPnJlbWFpbl9kZXNjID0gZGVzY19maXJzdC0+bGVuOworCWRlc2MgPSBhdGNfZ2V0X2Rlc2NfYnlfY29va2llKGF0Y2hhbiwgY29va2llKTsKKwlpZiAoZGVzYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwllbHNlIGlmIChkZXNjICE9IGRlc2NfZmlyc3QpCisJCXJldHVybiBkZXNjLT50b3RhbF9sZW47CiAKLQkvKgotCSAqIFRoaXMgaGFwcGVucyB3aGVuIGN1cnJlbnQgZGVzY3JpcHRvciB0cmFuc2ZlciBjb21wbGV0ZS4KLQkgKiBUaGUgcmVzaWR1YWwgYnVmZmVyIHNpemUgc2hvdWxkIHJlZHVjZSBjdXJyZW50IGRlc2NyaXB0b3IgbGVuZ3RoLgotCSAqLwotCWlmICh1bmxpa2VseSh0ZXN0X2JpdChBVENfSVNfQlRDLCAmYXRjaGFuLT5zdGF0dXMpKSkgewotCQljbGVhcl9iaXQoQVRDX0lTX0JUQywgJmF0Y2hhbi0+c3RhdHVzKTsKLQkJZGVzY19jdXIgPSBhdGNfZ2V0X2N1cnJlbnRfZGVzY3JpcHRvcnMoYXRjaGFuLAotCQkJCQkJY2hhbm5lbF9yZWFkbChhdGNoYW4sIERTQ1IpKTsKLQkJaWYgKCFkZXNjX2N1cikgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9CisJLyogY29va2llIG1hdGNoZXMgdG8gdGhlIGN1cnJlbnRseSBydW5uaW5nIHRyYW5zZmVyICovCisJcmV0ID0gZGVzY19maXJzdC0+dG90YWxfbGVuOwogCi0JCWNvdW50ID0gKGRlc2NfY3VyLT5sbGkuY3RybGEgJiBBVENfQlRTSVpFX01BWCkKLQkJCTw8IGRlc2NfZmlyc3QtPnR4X3dpZHRoOwotCQlpZiAoYXRjaGFuLT5yZW1haW5fZGVzYyA8IGNvdW50KSB7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlpZiAoZGVzY19maXJzdC0+bGxpLmRzY3IpIHsKKwkJLyogaGFyZHdhcmUgbGlua2VkIGxpc3QgdHJhbnNmZXIgKi8KIAotCQlhdGNoYW4tPnJlbWFpbl9kZXNjIC09IGNvdW50OwotCQlyZXQgPSBhdGNoYW4tPnJlbWFpbl9kZXNjOwotCX0gZWxzZSB7CiAJCS8qCi0JCSAqIEdldCByZXNpZHVhbCBieXRlcyB3aGVuIGN1cnJlbnQKLQkJICogZGVzY3JpcHRvciB0cmFuc2ZlciBpbiBwcm9ncmVzcy4KKwkJICogQ2FsY3VsYXRlIHRoZSByZXNpZHVlIGJ5IHJlbW92aW5nIHRoZSBsZW5ndGggb2YgdGhlIGNoaWxkCisJCSAqIGRlc2NyaXB0b3JzIGFscmVhZHkgdHJhbnNmZXJyZWQgZnJvbSB0aGUgdG90YWwgbGVuZ3RoLgorCQkgKiBUbyBnZXQgdGhlIGN1cnJlbnQgY2hpbGQgZGVzY3JpcHRvciB3ZSBjYW4gdXNlIHRoZSB2YWx1ZSBvZgorCQkgKiB0aGUgY2hhbm5lbCdzIERTQ1IgcmVnaXN0ZXIgYW5kIGNvbXBhcmUgaXQgYWdhaW5zdCB0aGUgdmFsdWUKKwkJICogb2YgdGhlIGhhcmR3YXJlIGxpbmtlZCBsaXN0IHN0cnVjdHVyZSBvZiBlYWNoIGNoaWxkCisJCSAqIGRlc2NyaXB0b3IuCiAJCSAqLwotCQljb3VudCA9IChjaGFubmVsX3JlYWRsKGF0Y2hhbiwgQ1RSTEEpICYgQVRDX0JUU0laRV9NQVgpCi0JCQkJPDwgKGRlc2NfZmlyc3QtPnR4X3dpZHRoKTsKLQkJcmV0ID0gYXRjaGFuLT5yZW1haW5fZGVzYyAtIGNvdW50OwotCX0KLQkvKgotCSAqIENoZWNrIGZpZm8gZW1wdHkuCi0JICovCi0JaWYgKCEoZG1hX3JlYWRsKGF0ZG1hLCBDSFNSKSAmIEFUX0RNQV9FTVBUKGNoYW5faWQpKSkKLQkJYXRjX2lzc3VlX3BlbmRpbmcoY2hhbik7CiAKLW91dDoKKwkJY3RybGEgPSBjaGFubmVsX3JlYWRsKGF0Y2hhbiwgQ1RSTEEpOworCQlybWIoKTsgLyogZW5zdXJlIENUUkxBIGlzIHJlYWQgYmVmb3JlIERTQ1IgKi8KKwkJZHNjciA9IGNoYW5uZWxfcmVhZGwoYXRjaGFuLCBEU0NSKTsKKworCQkvKiBmb3IgdGhlIGZpcnN0IGRlc2NyaXB0b3Igd2UgY2FuIGJlIG1vcmUgYWNjdXJhdGUgKi8KKwkJaWYgKGRlc2NfZmlyc3QtPmxsaS5kc2NyID09IGRzY3IpCisJCQlyZXR1cm4gYXRjX2NhbGNfYnl0ZXNfbGVmdChyZXQsIGN0cmxhLCBkZXNjX2ZpcnN0KTsKKworCQlyZXQgLT0gZGVzY19maXJzdC0+bGVuOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRlc2MsICZkZXNjX2ZpcnN0LT50eF9saXN0LCBkZXNjX25vZGUpIHsKKwkJCWlmIChkZXNjLT5sbGkuZHNjciA9PSBkc2NyKQorCQkJCWJyZWFrOworCisJCQlyZXQgLT0gZGVzYy0+bGVuOworCQl9CisKKwkJLyoKKwkJICogRm9yIHRoZSBsYXN0IGRlc2NyaXB0b3IgaW4gdGhlIGNoYWluIHdlIGNhbiBjYWxjdWxhdGUKKwkJICogdGhlIHJlbWFpbmluZyBieXRlcyB1c2luZyB0aGUgY2hhbm5lbCdzIHJlZ2lzdGVyLgorCQkgKiBOb3RlIHRoYXQgdGhlIHRyYW5zZmVyIHdpZHRoIG9mIHRoZSBmaXJzdCBhbmQgbGFzdAorCQkgKiBkZXNjcmlwdG9yIG1heSBkaWZmZXIuCisJCSAqLworCQlpZiAoIWRlc2MtPmxsaS5kc2NyKQorCQkJcmV0ID0gYXRjX2NhbGNfYnl0ZXNfbGVmdF9mcm9tX3JlZyhyZXQsIGF0Y2hhbiwgZGVzYyk7CisJfSBlbHNlIHsKKwkJLyogc2luZ2xlIHRyYW5zZmVyICovCisJCXJldCA9IGF0Y19jYWxjX2J5dGVzX2xlZnRfZnJvbV9yZWcocmV0LCBhdGNoYW4sIGRlc2NfZmlyc3QpOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTUzOSw4ICs1NzIsNiBAQAogCQkJCQkvKiBHaXZlIGluZm9ybWF0aW9uIHRvIHRhc2tsZXQgKi8KIAkJCQkJc2V0X2JpdChBVENfSVNfRVJST1IsICZhdGNoYW4tPnN0YXR1cyk7CiAJCQkJfQotCQkJCWlmIChwZW5kaW5nICYgQVRfRE1BX0JUQyhpKSkKLQkJCQkJc2V0X2JpdChBVENfSVNfQlRDLCAmYXRjaGFuLT5zdGF0dXMpOwogCQkJCXRhc2tsZXRfc2NoZWR1bGUoJmF0Y2hhbi0+dGFza2xldCk7CiAJCQkJcmV0ID0gSVJRX0hBTkRMRUQ7CiAJCQl9CkBAIC02NTMsMTQgKzY4NCwxOCBAQAogCQlkZXNjLT5sbGkuY3RybGIgPSBjdHJsYjsKIAogCQlkZXNjLT50eGQuY29va2llID0gMDsKKwkJZGVzYy0+bGVuID0geGZlcl9jb3VudCA8PCBzcmNfd2lkdGg7CiAKIAkJYXRjX2Rlc2NfY2hhaW4oJmZpcnN0LCAmcHJldiwgZGVzYyk7CiAJfQogCiAJLyogRmlyc3QgZGVzY3JpcHRvciBvZiB0aGUgY2hhaW4gZW1iZWRkcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uICovCiAJZmlyc3QtPnR4ZC5jb29raWUgPSAtRUJVU1k7Ci0JZmlyc3QtPmxlbiA9IGxlbjsKKwlmaXJzdC0+dG90YWxfbGVuID0gbGVuOworCisJLyogc2V0IHRyYW5zZmVyIHdpZHRoIGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIHJlc2lkdWUgKi8KIAlmaXJzdC0+dHhfd2lkdGggPSBzcmNfd2lkdGg7CisJcHJldi0+dHhfd2lkdGggPSBzcmNfd2lkdGg7CiAKIAkvKiBzZXQgZW5kLW9mLWxpbmsgdG8gdGhlIGxhc3QgbGluayBkZXNjcmlwdG9yIG9mIGxpc3QqLwogCXNldF9kZXNjX2VvbChkZXNjKTsKQEAgLTc1Miw2ICs3ODcsNyBAQAogCQkJCQl8IEFUQ19TUkNfV0lEVEgobWVtX3dpZHRoKQogCQkJCQl8IGxlbiA+PiBtZW1fd2lkdGg7CiAJCQlkZXNjLT5sbGkuY3RybGIgPSBjdHJsYjsKKwkJCWRlc2MtPmxlbiA9IGxlbjsKIAogCQkJYXRjX2Rlc2NfY2hhaW4oJmZpcnN0LCAmcHJldiwgZGVzYyk7CiAJCQl0b3RhbF9sZW4gKz0gbGVuOwpAQCAtNzkyLDYgKzgyOCw3IEBACiAJCQkJCXwgQVRDX0RTVF9XSURUSChtZW1fd2lkdGgpCiAJCQkJCXwgbGVuID4+IHJlZ193aWR0aDsKIAkJCWRlc2MtPmxsaS5jdHJsYiA9IGN0cmxiOworCQkJZGVzYy0+bGVuID0gbGVuOwogCiAJCQlhdGNfZGVzY19jaGFpbigmZmlyc3QsICZwcmV2LCBkZXNjKTsKIAkJCXRvdGFsX2xlbiArPSBsZW47CkBAIC04MDYsOCArODQzLDExIEBACiAKIAkvKiBGaXJzdCBkZXNjcmlwdG9yIG9mIHRoZSBjaGFpbiBlbWJlZGRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gKi8KIAlmaXJzdC0+dHhkLmNvb2tpZSA9IC1FQlVTWTsKLQlmaXJzdC0+bGVuID0gdG90YWxfbGVuOworCWZpcnN0LT50b3RhbF9sZW4gPSB0b3RhbF9sZW47CisKKwkvKiBzZXQgdHJhbnNmZXIgd2lkdGggZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiB0aGUgcmVzaWR1ZSAqLwogCWZpcnN0LT50eF93aWR0aCA9IHJlZ193aWR0aDsKKwlwcmV2LT50eF93aWR0aCA9IHJlZ193aWR0aDsKIAogCS8qIGZpcnN0IGxpbmsgZGVzY3JpcHRvciBvZiBsaXN0IGlzIHJlc3BvbnNpYmxlIG9mIGZsYWdzICovCiAJZmlyc3QtPnR4ZC5mbGFncyA9IGZsYWdzOyAvKiBjbGllbnQgaXMgaW4gY29udHJvbCBvZiB0aGlzIGFjayAqLwpAQCAtODcyLDYgKzkxMiw3IEBACiAJCQkJfCBBVENfRkNfTUVNMlBFUgogCQkJCXwgQVRDX1NJRihhdGNoYW4tPm1lbV9pZikKIAkJCQl8IEFUQ19ESUYoYXRjaGFuLT5wZXJfaWYpOworCQlkZXNjLT5sZW4gPSBwZXJpb2RfbGVuOwogCQlicmVhazsKIAogCWNhc2UgRE1BX0RFVl9UT19NRU06CkBAIC04ODMsNiArOTI0LDcgQEAKIAkJCQl8IEFUQ19GQ19QRVIyTUVNCiAJCQkJfCBBVENfU0lGKGF0Y2hhbi0+cGVyX2lmKQogCQkJCXwgQVRDX0RJRihhdGNoYW4tPm1lbV9pZik7CisJCWRlc2MtPmxlbiA9IHBlcmlvZF9sZW47CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTk2NCw3ICsxMDA2LDcgQEAKIAogCS8qIEZpcnN0IGRlc2NyaXB0b3Igb2YgdGhlIGNoYWluIGVtYmVkZHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiAqLwogCWZpcnN0LT50eGQuY29va2llID0gLUVCVVNZOwotCWZpcnN0LT5sZW4gPSBidWZfbGVuOworCWZpcnN0LT50b3RhbF9sZW4gPSBidWZfbGVuOwogCWZpcnN0LT50eF93aWR0aCA9IHJlZ193aWR0aDsKIAogCXJldHVybiAmZmlyc3QtPnR4ZDsKQEAgLTExMTgsNyArMTE2MCw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmF0Y2hhbi0+bG9jaywgZmxhZ3MpOwogCiAJLyogIEdldCBudW1iZXIgb2YgYnl0ZXMgbGVmdCBpbiB0aGUgYWN0aXZlIHRyYW5zYWN0aW9ucyAqLwotCWJ5dGVzID0gYXRjX2dldF9ieXRlc19sZWZ0KGNoYW4pOworCWJ5dGVzID0gYXRjX2dldF9ieXRlc19sZWZ0KGNoYW4sIGNvb2tpZSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIApAQCAtMTIxNCw3ICsxMjU2LDYgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKIAlhdGNoYW4tPmRlc2NzX2FsbG9jYXRlZCA9IGk7Ci0JYXRjaGFuLT5yZW1haW5fZGVzYyA9IDA7CiAJbGlzdF9zcGxpY2UoJnRtcF9saXN0LCAmYXRjaGFuLT5mcmVlX2xpc3QpOwogCWRtYV9jb29raWVfaW5pdChjaGFuKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhdGNoYW4tPmxvY2ssIGZsYWdzKTsKQEAgLTEyNTcsNyArMTI5OCw2IEBACiAJbGlzdF9zcGxpY2VfaW5pdCgmYXRjaGFuLT5mcmVlX2xpc3QsICZsaXN0KTsKIAlhdGNoYW4tPmRlc2NzX2FsbG9jYXRlZCA9IDA7CiAJYXRjaGFuLT5zdGF0dXMgPSAwOwotCWF0Y2hhbi0+cmVtYWluX2Rlc2MgPSAwOwogCiAJZGV2X3ZkYmcoY2hhbjJkZXYoY2hhbiksICJmcmVlX2NoYW5fcmVzb3VyY2VzOiBkb25lXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2F0X2hkbWFjX3JlZ3MuaCBiL2RyaXZlcnMvZG1hL2F0X2hkbWFjX3JlZ3MuaAppbmRleCBkNmJiYTZjLi4yNzI3Y2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9hdF9oZG1hY19yZWdzLmgKKysrIGIvZHJpdmVycy9kbWEvYXRfaGRtYWNfcmVncy5oCkBAIC0xODEsOCArMTgxLDkgQEAKICAqIEBhdF9sbGk6IGhhcmR3YXJlIGxsaSBzdHJ1Y3R1cmUKICAqIEB0eGQ6IHN1cHBvcnQgZm9yIHRoZSBhc3luY190eCBhcGkKICAqIEBkZXNjX25vZGU6IG5vZGUgb24gdGhlIGNoYW5uZWQgZGVzY3JpcHRvcnMgbGlzdAotICogQGxlbjogdG90YWwgdHJhbnNhY3Rpb24gYnl0ZWNvdW50CisgKiBAbGVuOiBkZXNjcmlwdG9yIGJ5dGUgY291bnQKICAqIEB0eF93aWR0aDogdHJhbnNmZXIgd2lkdGgKKyAqIEB0b3RhbF9sZW46IHRvdGFsIHRyYW5zYWN0aW9uIGJ5dGUgY291bnQKICAqLwogc3RydWN0IGF0X2Rlc2MgewogCS8qIEZJUlNUIHZhbHVlcyB0aGUgaGFyZHdhcmUgdXNlcyAqLwpAQCAtMTk0LDYgKzE5NSw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAkJZGVzY19ub2RlOwogCXNpemVfdAkJCQlsZW47CiAJdTMyCQkJCXR4X3dpZHRoOworCXNpemVfdAkJCQl0b3RhbF9sZW47CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhdF9kZXNjICoKQEAgLTIxMyw3ICsyMTUsNiBAQAogZW51bSBhdGNfc3RhdHVzIHsKIAlBVENfSVNfRVJST1IgPSAwLAogCUFUQ19JU19QQVVTRUQgPSAxLAotCUFUQ19JU19CVEMgPSAyLAogCUFUQ19JU19DWUNMSUMgPSAyNCwKIH07CiAKQEAgLTIzMSw3ICsyMzIsNiBAQAogICogQHNhdmVfY2ZnOiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIHRoYXQgaXMgc2F2ZWQgb24gc3VzcGVuZC9yZXN1bWUgY3ljbGUKICAqIEBzYXZlX2RzY3I6IGZvciBjeWNsaWMgb3BlcmF0aW9ucywgcHJlc2VydmUgbmV4dCBkZXNjcmlwdG9yIGFkZHJlc3MgaW4KICAqICAgICAgICAgICAgIHRoZSBjeWNsaWMgbGlzdCBvbiBzdXNwZW5kL3Jlc3VtZSBjeWNsZQotICogQHJlbWFpbl9kZXNjOiB0byBzYXZlIHJlbWFpbiBkZXNjIGxlbmd0aAogICogQGRtYV9zY29uZmlnOiBjb25maWd1cmF0aW9uIGZvciBzbGF2ZSB0cmFuc2ZlcnMsIHBhc3NlZCB2aWEKICAqIC5kZXZpY2VfY29uZmlnCiAgKiBAbG9jazogc2VyaWFsaXplcyBlbnF1ZXVlL2RlcXVldWUgb3BlcmF0aW9ucyB0byBkZXNjcmlwdG9ycyBsaXN0cwpAQCAtMjUxLDcgKzI1MSw2IEBACiAJc3RydWN0IHRhc2tsZXRfc3RydWN0CXRhc2tsZXQ7CiAJdTMyCQkJc2F2ZV9jZmc7CiAJdTMyCQkJc2F2ZV9kc2NyOwotCXUzMgkJCXJlbWFpbl9kZXNjOwogCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGRtYV9zY29uZmlnOwogCiAJc3BpbmxvY2tfdAkJbG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2JjbTI4MzUtZG1hLmMgYi9kcml2ZXJzL2RtYS9iY20yODM1LWRtYS5jCmluZGV4IDA3MjMwOTYuLmM5MmQ2YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2JjbTI4MzUtZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvYmNtMjgzNS1kbWEuYwpAQCAtNDc1LDYgKzQ3NSw3IEBACiAJICogYy0+ZGVzYyBpcyBOVUxMIGFuZCBleGl0LikKIAkgKi8KIAlpZiAoYy0+ZGVzYykgeworCQliY20yODM1X2RtYV9kZXNjX2ZyZWUoJmMtPmRlc2MtPnZkKTsKIAkJYy0+ZGVzYyA9IE5VTEw7CiAJCWJjbTI4MzVfZG1hX2Fib3J0KGMtPmNoYW5fYmFzZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2NwcGk0MS5jIGIvZHJpdmVycy9kbWEvY3BwaTQxLmMKaW5kZXggNTEyY2I4ZS4uY2VlZGFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvY3BwaTQxLmMKKysrIGIvZHJpdmVycy9kbWEvY3BwaTQxLmMKQEAgLTkwMyw2ICs5MDMsMTEgQEAKIAlyZXR1cm4gb2ZfaWQtPmRhdGE7CiB9CiAKKyNkZWZpbmUgQ1BQSTQxX0RNQV9CVVNXSURUSFMJKEJJVChETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFKSB8IFwKKwkJCQlCSVQoRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVMpIHwgXAorCQkJCUJJVChETUFfU0xBVkVfQlVTV0lEVEhfM19CWVRFUykgfCBcCisJCQkJQklUKERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTKSkKKwogc3RhdGljIGludCBjcHBpNDFfZG1hX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGNwcGk0MV9kZCAqY2RkOwpAQCAtOTI2LDYgKzkzMSwxMCBAQAogCWNkZC0+ZGRldi5kZXZpY2VfaXNzdWVfcGVuZGluZyA9IGNwcGk0MV9kbWFfaXNzdWVfcGVuZGluZzsKIAljZGQtPmRkZXYuZGV2aWNlX3ByZXBfc2xhdmVfc2cgPSBjcHBpNDFfZG1hX3ByZXBfc2xhdmVfc2c7CiAJY2RkLT5kZGV2LmRldmljZV90ZXJtaW5hdGVfYWxsID0gY3BwaTQxX3N0b3BfY2hhbjsKKwljZGQtPmRkZXYuZGlyZWN0aW9ucyA9IEJJVChETUFfREVWX1RPX01FTSkgfCBCSVQoRE1BX01FTV9UT19ERVYpOworCWNkZC0+ZGRldi5zcmNfYWRkcl93aWR0aHMgPSBDUFBJNDFfRE1BX0JVU1dJRFRIUzsKKwljZGQtPmRkZXYuZHN0X2FkZHJfd2lkdGhzID0gQ1BQSTQxX0RNQV9CVVNXSURUSFM7CisJY2RkLT5kZGV2LnJlc2lkdWVfZ3JhbnVsYXJpdHkgPSBETUFfUkVTSURVRV9HUkFOVUxBUklUWV9CVVJTVDsKIAljZGQtPmRkZXYuZGV2ID0gZGV2OwogCUlOSVRfTElTVF9IRUFEKCZjZGQtPmRkZXYuY2hhbm5lbHMpOwogCWNwcDQxX2RtYV9pbmZvLmRtYV9jYXAgPSBjZGQtPmRkZXYuY2FwX21hc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9kbWEtano0NzQwLmMgYi9kcml2ZXJzL2RtYS9kbWEtano0NzQwLmMKaW5kZXggNDUyN2EzZS4uODQ4ODQ0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZG1hLWp6NDc0MC5jCisrKyBiL2RyaXZlcnMvZG1hL2RtYS1qejQ3NDAuYwpAQCAtNTExLDYgKzUxMSw5IEBACiAJa2ZyZWUoY29udGFpbmVyX29mKHZkZXNjLCBzdHJ1Y3Qgano0NzQwX2RtYV9kZXNjLCB2ZGVzYykpOwogfQogCisjZGVmaW5lIEpaNDc0MF9ETUFfQlVTV0lEVEhTIChCSVQoRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURSkgfCBcCisJQklUKERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTKSB8IEJJVChETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUykpCisKIHN0YXRpYyBpbnQgano0NzQwX2RtYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBqejQ3NDBfZG1hZW5naW5lX2NoYW4gKmNoYW47CkBAIC01NDgsNiArNTUxLDEwIEBACiAJZGQtPmRldmljZV9wcmVwX2RtYV9jeWNsaWMgPSBqejQ3NDBfZG1hX3ByZXBfZG1hX2N5Y2xpYzsKIAlkZC0+ZGV2aWNlX2NvbmZpZyA9IGp6NDc0MF9kbWFfc2xhdmVfY29uZmlnOwogCWRkLT5kZXZpY2VfdGVybWluYXRlX2FsbCA9IGp6NDc0MF9kbWFfdGVybWluYXRlX2FsbDsKKwlkZC0+c3JjX2FkZHJfd2lkdGhzID0gSlo0NzQwX0RNQV9CVVNXSURUSFM7CisJZGQtPmRzdF9hZGRyX3dpZHRocyA9IEpaNDc0MF9ETUFfQlVTV0lEVEhTOworCWRkLT5kaXJlY3Rpb25zID0gQklUKERNQV9ERVZfVE9fTUVNKSB8IEJJVChETUFfTUVNX1RPX0RFVik7CisJZGQtPnJlc2lkdWVfZ3JhbnVsYXJpdHkgPSBETUFfUkVTSURVRV9HUkFOVUxBUklUWV9CVVJTVDsKIAlkZC0+ZGV2ID0gJnBkZXYtPmRldjsKIAlJTklUX0xJU1RfSEVBRCgmZGQtPmNoYW5uZWxzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwppbmRleCBmMTU3MTJmLi5hYzMzNmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYworKysgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwpAQCAtODU5LDkgKzg1OSw2IEBACiAJQlVHX09OKCFkZXZpY2UtPmRldmljZV9pc3N1ZV9wZW5kaW5nKTsKIAlCVUdfT04oIWRldmljZS0+ZGV2KTsKIAotCVdBUk4oZG1hX2hhc19jYXAoRE1BX1NMQVZFLCBkZXZpY2UtPmNhcF9tYXNrKSAmJiAhZGV2aWNlLT5kaXJlY3Rpb25zLAotCSAgICAgInRoaXMgZHJpdmVyIGRvZXNuJ3Qgc3VwcG9ydCBnZW5lcmljIHNsYXZlIGNhcGFiaWxpdGllcyByZXBvcnRpbmdcbiIpOwotCiAJLyogbm90ZTogdGhpcyBvbmx5IG1hdHRlcnMgaW4gdGhlCiAJICogQ09ORklHX0FTWU5DX1RYX0VOQUJMRV9DSEFOTkVMX1NXSVRDSD1uIGNhc2UKIAkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2R3L3BsYXRmb3JtLmMgYi9kcml2ZXJzL2RtYS9kdy9wbGF0Zm9ybS5jCmluZGV4IDY1NjVhMzYuLmIyYzNhZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2R3L3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9kbWEvZHcvcGxhdGZvcm0uYwpAQCAtMjYsNiArMjYsOCBAQAogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAorI2RlZmluZSBEUlZfTkFNRQkiZHdfZG1hYyIKKwogc3RhdGljIHN0cnVjdCBkbWFfY2hhbiAqZHdfZG1hX29mX3hsYXRlKHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmRtYV9zcGVjLAogCQkJCQlzdHJ1Y3Qgb2ZfZG1hICpvZmRtYSkKIHsKQEAgLTI4NCw3ICsyODYsNyBAQAogCS5yZW1vdmUJCT0gZHdfcmVtb3ZlLAogCS5zaHV0ZG93biAgICAgICA9IGR3X3NodXRkb3duLAogCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gImR3X2RtYWMiLAorCQkubmFtZQk9IERSVl9OQU1FLAogCQkucG0JPSAmZHdfZGV2X3BtX29wcywKIAkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGR3X2RtYV9vZl9pZF90YWJsZSksCiAJCS5hY3BpX21hdGNoX3RhYmxlID0gQUNQSV9QVFIoZHdfZG1hX2FjcGlfaWRfdGFibGUpLApAQCAtMzA1LDMgKzMwNyw0IEBACiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3lub3BzeXMgRGVzaWduV2FyZSBETUEgQ29udHJvbGxlciBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06IiBEUlZfTkFNRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9lZG1hLmMgYi9kcml2ZXJzL2RtYS9lZG1hLmMKaW5kZXggMjc2MTU3Zi4uNTNkYmQzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvZWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2VkbWEuYwpAQCAtMjYwLDYgKzI2MCwxMyBAQAogCSAqLwogCWlmIChlY2hhbi0+ZWRlc2MpIHsKIAkJaW50IGN5Y2xpYyA9IGVjaGFuLT5lZGVzYy0+Y3ljbGljOworCisJCS8qCisJCSAqIGZyZWUgdGhlIHJ1bm5pbmcgcmVxdWVzdCBkZXNjcmlwdG9yCisJCSAqIHNpbmNlIGl0IGlzIG5vdCBpbiBhbnkgb2YgdGhlIHZkZXNjIGxpc3RzCisJCSAqLworCQllZG1hX2Rlc2NfZnJlZSgmZWNoYW4tPmVkZXNjLT52ZGVzYyk7CisKIAkJZWNoYW4tPmVkZXNjID0gTlVMTDsKIAkJZWRtYV9zdG9wKGVjaGFuLT5jaF9udW0pOwogCQkvKiBNb3ZlIHRoZSBjeWNsaWMgY2hhbm5lbCBiYWNrIHRvIGRlZmF1bHQgcXVldWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMgYi9kcml2ZXJzL2RtYS9pbXgtc2RtYS5jCmluZGV4IDE4YzBhMTMuLjY2YTBlZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvaW14LXNkbWEuYwpAQCAtNTMxLDYgKzUzMSwxMCBAQAogCQlkZXZfZXJyKHNkbWEtPmRldiwgIlRpbWVvdXQgd2FpdGluZyBmb3IgQ0gwIHJlYWR5XG4iKTsKIAl9CiAKKwkvKiBTZXQgYml0cyBvZiBDT05GSUcgcmVnaXN0ZXIgd2l0aCBkeW5hbWljIGNvbnRleHQgc3dpdGNoaW5nICovCisJaWYgKHJlYWRsKHNkbWEtPnJlZ3MgKyBTRE1BX0hfQ09ORklHKSA9PSAwKQorCQl3cml0ZWxfcmVsYXhlZChTRE1BX0hfQ09ORklHX0NTTSwgc2RtYS0+cmVncyArIFNETUFfSF9DT05GSUcpOworCiAJcmV0dXJuIHJldCA/IDAgOiAtRVRJTUVET1VUOwogfQogCkBAIC0xMzk0LDkgKzEzOTgsNiBAQAogCiAJd3JpdGVsX3JlbGF4ZWQoY2NiX3BoeXMsIHNkbWEtPnJlZ3MgKyBTRE1BX0hfQzBQVFIpOwogCi0JLyogU2V0IGJpdHMgb2YgQ09ORklHIHJlZ2lzdGVyIHdpdGggZ2l2ZW4gY29udGV4dCBzd2l0Y2hpbmcgbW9kZSAqLwotCXdyaXRlbF9yZWxheGVkKFNETUFfSF9DT05GSUdfQ1NNLCBzZG1hLT5yZWdzICsgU0RNQV9IX0NPTkZJRyk7Ci0KIAkvKiBJbml0aWFsaXplcyBjaGFubmVsJ3MgcHJpb3JpdGllcyAqLwogCXNkbWFfc2V0X2NoYW5uZWxfcHJpb3JpdHkoJnNkbWEtPmNoYW5uZWxbMF0sIDcpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pbnRlbF9taWRfZG1hLmMgYi9kcml2ZXJzL2RtYS9pbnRlbF9taWRfZG1hLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYWVhZDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9kbWEvaW50ZWxfbWlkX2RtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0NyArMCwwIEBACi0vKgotICogIGludGVsX21pZF9kbWEuYyAtIEludGVsIExhbmd3ZWxsIERNQSBEcml2ZXJzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOC0xMCBJbnRlbCBDb3JwCi0gKiAgQXV0aG9yOiBWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4KLSAqICBUaGUgZHJpdmVyIGRlc2lnbiBpcyBiYXNlZCBvbiBkd19kbWFjIGRyaXZlcgotICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqICA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQS4KLSAqCi0gKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZWxfbWlkX2RtYS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotCi0jaW5jbHVkZSAiZG1hZW5naW5lLmgiCi0KLSNkZWZpbmUgTUFYX0NIQU4JNCAvKm1heCBjaCBhY3Jvc3MgY29udHJvbGxlcnMqLwotI2luY2x1ZGUgImludGVsX21pZF9kbWFfcmVncy5oIgotCi0jZGVmaW5lIElOVEVMX01JRF9ETUFDMV9JRAkJMHgwODE0Ci0jZGVmaW5lIElOVEVMX01JRF9ETUFDMl9JRAkJMHgwODEzCi0jZGVmaW5lIElOVEVMX01JRF9HUF9ETUFDMl9JRAkJMHgwODI3Ci0jZGVmaW5lIElOVEVMX01GTERfRE1BQzFfSUQJCTB4MDgzMAotI2RlZmluZSBMTldfUEVSSVBIUkFMX01BU0tfQkFTRQkJMHhGRkFFODAwOAotI2RlZmluZSBMTldfUEVSSVBIUkFMX01BU0tfU0laRQkJMHgxMAotI2RlZmluZSBMTldfUEVSSVBIUkFMX1NUQVRVUwkJMHgwCi0jZGVmaW5lIExOV19QRVJJUEhSQUxfTUFTSwkJMHg4Ci0KLXN0cnVjdCBpbnRlbF9taWRfZG1hX3Byb2JlX2luZm8gewotCXU4IG1heF9jaGFuOwotCXU4IGNoX2Jhc2U7Ci0JdTE2IGJsb2NrX3NpemU7Ci0JdTMyIHBpbXJfbWFzazsKLX07Ci0KLSNkZWZpbmUgSU5GTyhfbWF4X2NoYW4sIF9jaF9iYXNlLCBfYmxvY2tfc2l6ZSwgX3BpbXJfbWFzaykgXAotCSgoa2VybmVsX3Vsb25nX3QpJihzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9wcm9iZV9pbmZvKSB7CVwKLQkJLm1heF9jaGFuID0gKF9tYXhfY2hhbiksCQkJXAotCQkuY2hfYmFzZSA9IChfY2hfYmFzZSksCQkJCVwKLQkJLmJsb2NrX3NpemUgPSAoX2Jsb2NrX3NpemUpLAkJCVwKLQkJLnBpbXJfbWFzayA9IChfcGltcl9tYXNrKSwJCQlcCi0JfSkKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1VdGlsaXR5IEZ1bmN0aW9ucyovCi0vKioKLSAqIGdldF9jaF9pbmRleAktCWNvbnZlcnQgc3RhdHVzIHRvIGNoYW5uZWwKLSAqIEBzdGF0dXM6IHN0YXR1cyBtYXNrCi0gKiBAYmFzZTogZG1hIGNoIGJhc2UgdmFsdWUKLSAqCi0gKiBNb2RpZnkgdGhlIHN0YXR1cyBtYXNrIGFuZCByZXR1cm4gdGhlIGNoYW5uZWwgaW5kZXggbmVlZGluZwotICogYXR0ZW50aW9uIChvciAtMSBpZiBuZWl0aGVyKQotICovCi1zdGF0aWMgaW50IGdldF9jaF9pbmRleChpbnQgKnN0YXR1cywgdW5zaWduZWQgaW50IGJhc2UpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9DSEFOOyBpKyspIHsKLQkJaWYgKCpzdGF0dXMgJiAoMSA8PCAoaSArIGJhc2UpKSkgewotCQkJKnN0YXR1cyA9ICpzdGF0dXMgJiB+KDEgPDwgKGkgKyBiYXNlKSk7Ci0JCQlwcl9kZWJ1ZygiTURNQTogaW5kZXggJWQgTmV3IHN0YXR1cyAleFxuIiwgaSwgKnN0YXR1cyk7Ci0JCQlyZXR1cm4gaTsKLQkJfQotCX0KLQlyZXR1cm4gLTE7Ci19Ci0KLS8qKgotICogZ2V0X2Jsb2NrX3RzCS0JY2FsY3VsYXRlcyBkbWEgdHJhbnNhY3Rpb24gbGVuZ3RoCi0gKiBAbGVuOiBkbWEgdHJhbnNmZXIgbGVuZ3RoCi0gKiBAdHhfd2lkdGg6IGRtYSB0cmFuc2ZlciBzcmMgd2lkdGgKLSAqIEBibG9ja19zaXplOiBkbWEgY29udHJvbGxlciBtYXggYmxvY2sgc2l6ZQotICoKLSAqIEJhc2VkIG9uIHNyYyB3aWR0aCBjYWxjdWxhdGUgdGhlIERNQSB0cnNhY3Rpb24gbGVuZ3RoIGluIGRhdGEgaXRlbXMKLSAqIHJldHVybiBkYXRhIGl0ZW1zIG9yIEZGRkYgaWYgZXhjZWVkcyBtYXggbGVuZ3RoIGZvciBibG9jawotICovCi1zdGF0aWMgaW50IGdldF9ibG9ja190cyhpbnQgbGVuLCBpbnQgdHhfd2lkdGgsIGludCBibG9ja19zaXplKQotewotCWludCBieXRlX3dpZHRoID0gMCwgYmxvY2tfdHMgPSAwOwotCi0Jc3dpdGNoICh0eF93aWR0aCkgewotCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURToKLQkJYnl0ZV93aWR0aCA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzJfQllURVM6Ci0JCWJ5dGVfd2lkdGggPSAyOwotCQlicmVhazsKLQljYXNlIERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOgotCWRlZmF1bHQ6Ci0JCWJ5dGVfd2lkdGggPSA0OwotCQlicmVhazsKLQl9Ci0KLQlibG9ja190cyA9IGxlbi9ieXRlX3dpZHRoOwotCWlmIChibG9ja190cyA+IGJsb2NrX3NpemUpCi0JCWJsb2NrX3RzID0gMHhGRkZGOwotCXJldHVybiBibG9ja190czsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ETUFDMSBpbnRlcnJ1cHQgRnVuY3Rpb25zKi8KLQotLyoqCi0gKiBkbWFjMV9tYXNrX3BlcmlwaHJhbF9pbnRyIC0JbWFzayB0aGUgcGVyaXBocmFsIGludGVycnVwdAotICogQG1pZDogZG1hIGRldmljZSBmb3Igd2hpY2ggbWFza2luZyBpcyByZXF1aXJlZAotICoKLSAqIE1hc2tzIHRoZSBETUEgcGVyaXBocmFsIGludGVycnVwdAotICogdGhpcyBpcyB2YWxpZCBmb3IgRE1BQzEgZmFtaWx5IGNvbnRyb2xsZXJzIG9ubHkKLSAqIFRoaXMgY29udHJvbGxlciBzaG91bGQgaGF2ZSBwZXJpcGhyYWwgbWFzayByZWdpc3RlcnMgYWxyZWFkeSBtYXBwZWQKLSAqLwotc3RhdGljIHZvaWQgZG1hYzFfbWFza19wZXJpcGhyYWxfaW50cihzdHJ1Y3QgbWlkZG1hX2RldmljZSAqbWlkKQotewotCXUzMiBwaW1yOwotCi0JaWYgKG1pZC0+cGltcl9tYXNrKSB7Ci0JCXBpbXIgPSByZWFkbChtaWQtPm1hc2tfcmVnICsgTE5XX1BFUklQSFJBTF9NQVNLKTsKLQkJcGltciB8PSBtaWQtPnBpbXJfbWFzazsKLQkJd3JpdGVsKHBpbXIsIG1pZC0+bWFza19yZWcgKyBMTldfUEVSSVBIUkFMX01BU0spOwotCX0KLQlyZXR1cm47Ci19Ci0KLS8qKgotICogZG1hYzFfdW5tYXNrX3BlcmlwaHJhbF9pbnRyIC0JdW5tYXNrIHRoZSBwZXJpcGhyYWwgaW50ZXJydXB0Ci0gKiBAbWlkYzogZG1hIGNoYW5uZWwgZm9yIHdoaWNoIG1hc2tpbmcgaXMgcmVxdWlyZWQKLSAqCi0gKiBVbk1hc2tzIHRoZSBETUEgcGVyaXBocmFsIGludGVycnVwdCwKLSAqIHRoaXMgaXMgdmFsaWQgZm9yIERNQUMxIGZhbWlseSBjb250cm9sbGVycyBvbmx5Ci0gKiBUaGlzIGNvbnRyb2xsZXIgc2hvdWxkIGhhdmUgcGVyaXBocmFsIG1hc2sgcmVnaXN0ZXJzIGFscmVhZHkgbWFwcGVkCi0gKi8KLXN0YXRpYyB2b2lkIGRtYWMxX3VubWFza19wZXJpcGhyYWxfaW50cihzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9jaGFuICptaWRjKQotewotCXUzMiBwaW1yOwotCXN0cnVjdCBtaWRkbWFfZGV2aWNlICptaWQgPSB0b19taWRkbWFfZGV2aWNlKG1pZGMtPmNoYW4uZGV2aWNlKTsKLQotCWlmIChtaWQtPnBpbXJfbWFzaykgewotCQlwaW1yID0gcmVhZGwobWlkLT5tYXNrX3JlZyArIExOV19QRVJJUEhSQUxfTUFTSyk7Ci0JCXBpbXIgJj0gfm1pZC0+cGltcl9tYXNrOwotCQl3cml0ZWwocGltciwgbWlkLT5tYXNrX3JlZyArIExOV19QRVJJUEhSQUxfTUFTSyk7Ci0JfQotCXJldHVybjsKLX0KLQotLyoqCi0gKiBlbmFibGVfZG1hX2ludGVycnVwdCAtCWVuYWJsZSB0aGUgcGVyaXBocmFsIGludGVycnVwdAotICogQG1pZGM6IGRtYSBjaGFubmVsIGZvciB3aGljaCBlbmFibGUgaW50ZXJydXB0IGlzIHJlcXVpcmVkCi0gKgotICogRW5hYmxlIHRoZSBETUEgcGVyaXBocmFsIGludGVycnVwdCwKLSAqIHRoaXMgaXMgdmFsaWQgZm9yIERNQUMxIGZhbWlseSBjb250cm9sbGVycyBvbmx5Ci0gKiBUaGlzIGNvbnRyb2xsZXIgc2hvdWxkIGhhdmUgcGVyaXBocmFsIG1hc2sgcmVnaXN0ZXJzIGFscmVhZHkgbWFwcGVkCi0gKi8KLXN0YXRpYyB2b2lkIGVuYWJsZV9kbWFfaW50ZXJydXB0KHN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4gKm1pZGMpCi17Ci0JZG1hYzFfdW5tYXNrX3BlcmlwaHJhbF9pbnRyKG1pZGMpOwotCi0JLyplbiBjaCBpbnRlcnJ1cHRzKi8KLQlpb3dyaXRlMzIoVU5NQVNLX0lOVFJfUkVHKG1pZGMtPmNoX2lkKSwgbWlkYy0+ZG1hX2Jhc2UgKyBNQVNLX1RGUik7Ci0JaW93cml0ZTMyKFVOTUFTS19JTlRSX1JFRyhtaWRjLT5jaF9pZCksIG1pZGMtPmRtYV9iYXNlICsgTUFTS19FUlIpOwotCXJldHVybjsKLX0KLQotLyoqCi0gKiBkaXNhYmxlX2RtYV9pbnRlcnJ1cHQgLQlkaXNhYmxlIHRoZSBwZXJpcGhyYWwgaW50ZXJydXB0Ci0gKiBAbWlkYzogZG1hIGNoYW5uZWwgZm9yIHdoaWNoIGRpc2FibGUgaW50ZXJydXB0IGlzIHJlcXVpcmVkCi0gKgotICogRGlzYWJsZSB0aGUgRE1BIHBlcmlwaHJhbCBpbnRlcnJ1cHQsCi0gKiB0aGlzIGlzIHZhbGlkIGZvciBETUFDMSBmYW1pbHkgY29udHJvbGxlcnMgb25seQotICogVGhpcyBjb250cm9sbGVyIHNob3VsZCBoYXZlIHBlcmlwaHJhbCBtYXNrIHJlZ2lzdGVycyBhbHJlYWR5IG1hcHBlZAotICovCi1zdGF0aWMgdm9pZCBkaXNhYmxlX2RtYV9pbnRlcnJ1cHQoc3RydWN0IGludGVsX21pZF9kbWFfY2hhbiAqbWlkYykKLXsKLQkvKkNoZWNrIExQRSBQSVNSLCBtYWtlIHN1cmUgZndkIGlzIGRpc2FibGVkKi8KLQlpb3dyaXRlMzIoTUFTS19JTlRSX1JFRyhtaWRjLT5jaF9pZCksIG1pZGMtPmRtYV9iYXNlICsgTUFTS19CTE9DSyk7Ci0JaW93cml0ZTMyKE1BU0tfSU5UUl9SRUcobWlkYy0+Y2hfaWQpLCBtaWRjLT5kbWFfYmFzZSArIE1BU0tfVEZSKTsKLQlpb3dyaXRlMzIoTUFTS19JTlRSX1JFRyhtaWRjLT5jaF9pZCksIG1pZGMtPmRtYV9iYXNlICsgTUFTS19FUlIpOwotCXJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi1ETUEgY2hhbm5lbCBoZWxwZXIgRnVuY3Rpb25zKi8KLS8qKgotICogbWlkX2Rlc2NfZ2V0CQktCWdldCBhIGRlc2NyaXB0b3IKLSAqIEBtaWRjOiBkbWEgY2hhbm5lbCBmb3Igd2hpY2ggZGVzY3JpcHRvciBpcyByZXF1aXJlZAotICoKLSAqIE9idGFpbiBhIGRlc2NyaXB0b3IgZm9yIHRoZSBjaGFubmVsLiBSZXR1cm5zIE5VTEwgaWYgbm9uZSBhcmUgZnJlZS4KLSAqIE9uY2UgdGhlIGRlc2NyaXB0b3IgaXMgcmV0dXJuZWQgaXQgaXMgcHJpdmF0ZSB1bnRpbCBwdXQgb24gYW5vdGhlcgotICogbGlzdCBvciBmcmVlZAotICovCi1zdGF0aWMgc3RydWN0IGludGVsX21pZF9kbWFfZGVzYyAqbWlkY19kZXNjX2dldChzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9jaGFuICptaWRjKQotewotCXN0cnVjdCBpbnRlbF9taWRfZG1hX2Rlc2MgKmRlc2MsICpfZGVzYzsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9kZXNjICpyZXQgPSBOVUxMOwotCi0Jc3Bpbl9sb2NrX2JoKCZtaWRjLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsICZtaWRjLT5mcmVlX2xpc3QsIGRlc2Nfbm9kZSkgewotCQlpZiAoYXN5bmNfdHhfdGVzdF9hY2soJmRlc2MtPnR4ZCkpIHsKLQkJCWxpc3RfZGVsKCZkZXNjLT5kZXNjX25vZGUpOwotCQkJcmV0ID0gZGVzYzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZtaWRjLT5sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIG1pZF9kZXNjX3B1dAkJLQlwdXQgYSBkZXNjcmlwdG9yCi0gKiBAbWlkYzogZG1hIGNoYW5uZWwgZm9yIHdoaWNoIGRlc2NyaXB0b3IgaXMgcmVxdWlyZWQKLSAqIEBkZXNjOiBkZXNjcmlwdG9yIHRvIHB1dAotICoKLSAqIFJldHVybiBhIGRlc2NyaXB0b3IgZnJvbSBsd25fZGVzY19nZXQgYmFjayB0byB0aGUgZnJlZSBwb29sCi0gKi8KLXN0YXRpYyB2b2lkIG1pZGNfZGVzY19wdXQoc3RydWN0IGludGVsX21pZF9kbWFfY2hhbiAqbWlkYywKLQkJCXN0cnVjdCBpbnRlbF9taWRfZG1hX2Rlc2MgKmRlc2MpCi17Ci0JaWYgKGRlc2MpIHsKLQkJc3Bpbl9sb2NrX2JoKCZtaWRjLT5sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+ZGVzY19ub2RlLCAmbWlkYy0+ZnJlZV9saXN0KTsKLQkJc3Bpbl91bmxvY2tfYmgoJm1pZGMtPmxvY2spOwotCX0KLX0KLS8qKgotICogbWlkY19kb3N0YXJ0CQktCQliZWdpbiBhIERNQSB0cmFuc2FjdGlvbgotICogQG1pZGM6IGNoYW5uZWwgZm9yIHdoaWNoIHR4biBpcyB0byBiZSBzdGFydGVkCi0gKiBAZmlyc3Q6IGZpcnN0IGRlc2NyaXB0b3Igb2Ygc2VyaWVzCi0gKgotICogTG9hZCBhIHRyYW5zYWN0aW9uIGludG8gdGhlIGVuZ2luZS4gVGhpcyBtdXN0IGJlIGNhbGxlZCB3aXRoIG1pZGMtPmxvY2sKLSAqIGhlbGQgYW5kIGJoIGRpc2FibGVkLgotICovCi1zdGF0aWMgdm9pZCBtaWRjX2Rvc3RhcnQoc3RydWN0IGludGVsX21pZF9kbWFfY2hhbiAqbWlkYywKLQkJCXN0cnVjdCBpbnRlbF9taWRfZG1hX2Rlc2MgKmZpcnN0KQotewotCXN0cnVjdCBtaWRkbWFfZGV2aWNlICptaWQgPSB0b19taWRkbWFfZGV2aWNlKG1pZGMtPmNoYW4uZGV2aWNlKTsKLQotCS8qICBjaGFubmVsIGlzIGlkbGUgKi8KLQlpZiAobWlkYy0+YnVzeSAmJiB0ZXN0X2NoX2VuKG1pZGMtPmRtYV9iYXNlLCBtaWRjLT5jaF9pZCkpIHsKLQkJLyplcnJvciovCi0JCXByX2VycigiRVJSX01ETUE6IGNoYW5uZWwgaXMgYnVzeSBpbiBzdGFydFxuIik7Ci0JCS8qIFRoZSB0YXNrbGV0IHdpbGwgaG9wZWZ1bGx5IGFkdmFuY2UgdGhlIHF1ZXVlLi4uICovCi0JCXJldHVybjsKLQl9Ci0JbWlkYy0+YnVzeSA9IHRydWU7Ci0JLyp3cml0ZSByZWdpc3RlcnMgYW5kIGVuKi8KLQlpb3dyaXRlMzIoZmlyc3QtPnNhciwgbWlkYy0+Y2hfcmVncyArIFNBUik7Ci0JaW93cml0ZTMyKGZpcnN0LT5kYXIsIG1pZGMtPmNoX3JlZ3MgKyBEQVIpOwotCWlvd3JpdGUzMihmaXJzdC0+bGxpX3BoeXMsIG1pZGMtPmNoX3JlZ3MgKyBMTFApOwotCWlvd3JpdGUzMihmaXJzdC0+Y2ZnX2hpLCBtaWRjLT5jaF9yZWdzICsgQ0ZHX0hJR0gpOwotCWlvd3JpdGUzMihmaXJzdC0+Y2ZnX2xvLCBtaWRjLT5jaF9yZWdzICsgQ0ZHX0xPVyk7Ci0JaW93cml0ZTMyKGZpcnN0LT5jdGxfbG8sIG1pZGMtPmNoX3JlZ3MgKyBDVExfTE9XKTsKLQlpb3dyaXRlMzIoZmlyc3QtPmN0bF9oaSwgbWlkYy0+Y2hfcmVncyArIENUTF9ISUdIKTsKLQlwcl9kZWJ1ZygiTURNQTpUWCBTQVIgJXgsREFSICV4LENGR0wgJXgsQ0ZHSCAleCxDVExIICV4LCBDVExMICV4XG4iLAotCQkoaW50KWZpcnN0LT5zYXIsIChpbnQpZmlyc3QtPmRhciwgZmlyc3QtPmNmZ19oaSwKLQkJZmlyc3QtPmNmZ19sbywgZmlyc3QtPmN0bF9oaSwgZmlyc3QtPmN0bF9sbyk7Ci0JZmlyc3QtPnN0YXR1cyA9IERNQV9JTl9QUk9HUkVTUzsKLQotCWlvd3JpdGUzMihFTkFCTEVfQ0hBTk5FTChtaWRjLT5jaF9pZCksIG1pZC0+ZG1hX2Jhc2UgKyBETUFfQ0hBTl9FTik7Ci19Ci0KLS8qKgotICogbWlkY19kZXNjcmlwdG9yX2NvbXBsZXRlCS0JcHJvY2VzcyBjb21wbGV0ZWQgZGVzY3JpcHRvcgotICogQG1pZGM6IGNoYW5uZWwgb3duaW5nIHRoZSBkZXNjcmlwdG9yCi0gKiBAZGVzYzogdGhlIGRlc2NyaXB0b3IgaXRzZWxmCi0gKgotICogUHJvY2VzcyBhIGNvbXBsZXRlZCBkZXNjcmlwdG9yIGFuZCBwZXJmb3JtIGFueSBjYWxsYmFja3MgdXBvbgotICogdGhlIGNvbXBsZXRpb24uIFRoZSBjb21wbGV0aW9uIGhhbmRsaW5nIGRyb3BzIHRoZSBsb2NrIGR1cmluZyB0aGUKLSAqIGNhbGxiYWNrcyBidXQgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkLgotICovCi1zdGF0aWMgdm9pZCBtaWRjX2Rlc2NyaXB0b3JfY29tcGxldGUoc3RydWN0IGludGVsX21pZF9kbWFfY2hhbiAqbWlkYywKLQkJc3RydWN0IGludGVsX21pZF9kbWFfZGVzYyAqZGVzYykKLQkJX19yZWxlYXNlcygmbWlkYy0+bG9jaykgX19hY3F1aXJlcygmbWlkYy0+bG9jaykKLXsKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IJKnR4ZCA9ICZkZXNjLT50eGQ7Ci0JZG1hX2FzeW5jX3R4X2NhbGxiYWNrIGNhbGxiYWNrX3R4ZCA9IE5VTEw7Ci0Jc3RydWN0IGludGVsX21pZF9kbWFfbGxpCSpsbGl0ZW07Ci0Jdm9pZCAqcGFyYW1fdHhkID0gTlVMTDsKLQotCWRtYV9jb29raWVfY29tcGxldGUodHhkKTsKLQljYWxsYmFja190eGQgPSB0eGQtPmNhbGxiYWNrOwotCXBhcmFtX3R4ZCA9IHR4ZC0+Y2FsbGJhY2tfcGFyYW07Ci0KLQlpZiAoZGVzYy0+bGxpICE9IE5VTEwpIHsKLQkJLypjbGVhciB0aGUgRE9ORSBiaXQgb2YgY29tcGxldGVkIExMSSBpbiBtZW1vcnkqLwotCQlsbGl0ZW0gPSBkZXNjLT5sbGkgKyBkZXNjLT5jdXJyZW50X2xsaTsKLQkJbGxpdGVtLT5jdGxfaGkgJj0gQ0xFQVJfRE9ORTsKLQkJaWYgKGRlc2MtPmN1cnJlbnRfbGxpIDwgZGVzYy0+bGxpX2xlbmd0aC0xKQotCQkJKGRlc2MtPmN1cnJlbnRfbGxpKSsrOwotCQllbHNlCi0JCQlkZXNjLT5jdXJyZW50X2xsaSA9IDA7Ci0JfQotCXNwaW5fdW5sb2NrX2JoKCZtaWRjLT5sb2NrKTsKLQlpZiAoY2FsbGJhY2tfdHhkKSB7Ci0JCXByX2RlYnVnKCJNRE1BOiBUWEQgY2FsbGJhY2sgc2V0IC4uLiBjYWxsaW5nXG4iKTsKLQkJY2FsbGJhY2tfdHhkKHBhcmFtX3R4ZCk7Ci0JfQotCWlmIChtaWRjLT5yYXdfdGZyKSB7Ci0JCWRlc2MtPnN0YXR1cyA9IERNQV9DT01QTEVURTsKLQkJaWYgKGRlc2MtPmxsaSAhPSBOVUxMKSB7Ci0JCQlwY2lfcG9vbF9mcmVlKGRlc2MtPmxsaV9wb29sLCBkZXNjLT5sbGksCi0JCQkJCQlkZXNjLT5sbGlfcGh5cyk7Ci0JCQlwY2lfcG9vbF9kZXN0cm95KGRlc2MtPmxsaV9wb29sKTsKLQkJCWRlc2MtPmxsaSA9IE5VTEw7Ci0JCX0KLQkJbGlzdF9tb3ZlKCZkZXNjLT5kZXNjX25vZGUsICZtaWRjLT5mcmVlX2xpc3QpOwotCQltaWRjLT5idXN5ID0gZmFsc2U7Ci0JfQotCXNwaW5fbG9ja19iaCgmbWlkYy0+bG9jayk7Ci0KLX0KLS8qKgotICogbWlkY19zY2FuX2Rlc2NyaXB0b3JzIC0JCWNoZWNrIHRoZSBkZXNjcmlwdG9ycyBpbiBjaGFubmVsCi0gKgkJCQkJbWFyayBjb21wbGV0ZWQgd2hlbiB0eCBpcyBjb21wbGV0ZXRlCi0gKiBAbWlkOiBkZXZpY2UKLSAqIEBtaWRjOiBjaGFubmVsIHRvIHNjYW4KLSAqCi0gKiBXYWxrIHRoZSBkZXNjcmlwdG9yIGNoYWluIGZvciB0aGUgZGV2aWNlIGFuZCBwcm9jZXNzIGFueSBlbnRyaWVzCi0gKiB0aGF0IGFyZSBjb21wbGV0ZS4KLSAqLwotc3RhdGljIHZvaWQgbWlkY19zY2FuX2Rlc2NyaXB0b3JzKHN0cnVjdCBtaWRkbWFfZGV2aWNlICptaWQsCi0JCQkJc3RydWN0IGludGVsX21pZF9kbWFfY2hhbiAqbWlkYykKLXsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9kZXNjICpkZXNjID0gTlVMTCwgKl9kZXNjID0gTlVMTDsKLQotCS8qdHggaXMgY29tcGxldGUqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZGVzYywgJm1pZGMtPmFjdGl2ZV9saXN0LCBkZXNjX25vZGUpIHsKLQkJaWYgKGRlc2MtPnN0YXR1cyA9PSBETUFfSU5fUFJPR1JFU1MpCi0JCQltaWRjX2Rlc2NyaXB0b3JfY29tcGxldGUobWlkYywgZGVzYyk7Ci0JfQotCXJldHVybjsKLQl9Ci0vKioKLSAqIG1pZGNfbGxpX2ZpbGxfc2cgLQkJSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQKLSAqCQkJCVNHIGxpc3QgdG8gTGlua2VkIExpc3QgSXRlbXMuCi0gKkBtaWRjOiBDaGFubmVsCi0gKkBkZXNjOiBETUEgZGVzY3JpcHRvcgotICpAc2dsaXN0OiBQb2ludGVyIHRvIFNHIGxpc3QKLSAqQHNnbGVuOiBTRyBsaXN0IGxlbmd0aAotICpAZmxhZ3M6IERNQSB0cmFuc2FjdGlvbiBmbGFncwotICoKLSAqIFdhbGsgdGhyb3VnaCB0aGUgU0cgbGlzdCBhbmQgY29udmVydCB0aGUgU0cgbGlzdCBpbnRvIExpbmtlZAotICogTGlzdCBJdGVtcyAoTExJKS4KLSAqLwotc3RhdGljIGludCBtaWRjX2xsaV9maWxsX3NnKHN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4gKm1pZGMsCi0JCQkJc3RydWN0IGludGVsX21pZF9kbWFfZGVzYyAqZGVzYywKLQkJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbGlzdCwKLQkJCQl1bnNpZ25lZCBpbnQgc2dsZW4sCi0JCQkJdW5zaWduZWQgaW50IGZsYWdzKQotewotCXN0cnVjdCBpbnRlbF9taWRfZG1hX3NsYXZlICptaWRzOwotCXN0cnVjdCBzY2F0dGVybGlzdCAgKnNnOwotCWRtYV9hZGRyX3QgbGxpX25leHQsIHNnX3BoeV9hZGRyOwotCXN0cnVjdCBpbnRlbF9taWRfZG1hX2xsaSAqbGxpX2Jsb2NfZGVzYzsKLQl1bmlvbiBpbnRlbF9taWRfZG1hX2N0bF9sbyBjdGxfbG87Ci0JdW5pb24gaW50ZWxfbWlkX2RtYV9jdGxfaGkgY3RsX2hpOwotCWludCBpOwotCi0JcHJfZGVidWcoIk1ETUE6IEVudGVyZWQgbWlkY19sbGlfZmlsbF9zZ1xuIik7Ci0JbWlkcyA9IG1pZGMtPm1pZF9zbGF2ZTsKLQotCWxsaV9ibG9jX2Rlc2MgPSBkZXNjLT5sbGk7Ci0JbGxpX25leHQgPSBkZXNjLT5sbGlfcGh5czsKLQotCWN0bF9sby5jdGxfbG8gPSBkZXNjLT5jdGxfbG87Ci0JY3RsX2hpLmN0bF9oaSA9IGRlc2MtPmN0bF9oaTsKLQlmb3JfZWFjaF9zZyhzZ2xpc3QsIHNnLCBzZ2xlbiwgaSkgewotCQkvKlBvcHVsYXRlIENUTF9MT1cgYW5kIExMSSB2YWx1ZXMqLwotCQlpZiAoaSAhPSBzZ2xlbiAtIDEpIHsKLQkJCWxsaV9uZXh0ID0gbGxpX25leHQgKwotCQkJCXNpemVvZihzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9sbGkpOwotCQl9IGVsc2UgewotCQkvKkNoZWNrIGZvciBjaXJjdWxhciBsaXN0LCBvdGhlcndpc2UgdGVybWluYXRlIExMSSB0byBaRVJPKi8KLQkJCWlmIChmbGFncyAmIERNQV9QUkVQX0NJUkNVTEFSX0xJU1QpIHsKLQkJCQlwcl9kZWJ1ZygiTURNQTogTExJIGlzIGNvbmZpZ3VyZWQgaW4gY2lyY3VsYXIgbW9kZVxuIik7Ci0JCQkJbGxpX25leHQgPSBkZXNjLT5sbGlfcGh5czsKLQkJCX0gZWxzZSB7Ci0JCQkJbGxpX25leHQgPSAwOwotCQkJCWN0bF9sby5jdGx4LmxscF9kc3RfZW4gPSAwOwotCQkJCWN0bF9sby5jdGx4LmxscF9zcmNfZW4gPSAwOwotCQkJfQotCQl9Ci0JCS8qUG9wdWxhdGUgQ1RMX0hJIHZhbHVlcyovCi0JCWN0bF9oaS5jdGx4LmJsb2NrX3RzID0gZ2V0X2Jsb2NrX3RzKHNnX2RtYV9sZW4oc2cpLAotCQkJCQkJCWRlc2MtPndpZHRoLAotCQkJCQkJCW1pZGMtPmRtYS0+YmxvY2tfc2l6ZSk7Ci0JCS8qUG9wdWxhdGUgU0FSIGFuZCBEQVIgdmFsdWVzKi8KLQkJc2dfcGh5X2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7Ci0JCWlmIChkZXNjLT5kaXJuID09ICBETUFfTUVNX1RPX0RFVikgewotCQkJbGxpX2Jsb2NfZGVzYy0+c2FyICA9IHNnX3BoeV9hZGRyOwotCQkJbGxpX2Jsb2NfZGVzYy0+ZGFyICA9IG1pZHMtPmRtYV9zbGF2ZS5kc3RfYWRkcjsKLQkJfSBlbHNlIGlmIChkZXNjLT5kaXJuID09ICBETUFfREVWX1RPX01FTSkgewotCQkJbGxpX2Jsb2NfZGVzYy0+c2FyICA9IG1pZHMtPmRtYV9zbGF2ZS5zcmNfYWRkcjsKLQkJCWxsaV9ibG9jX2Rlc2MtPmRhciAgPSBzZ19waHlfYWRkcjsKLQkJfQotCQkvKkNvcHkgdmFsdWVzIGludG8gYmxvY2sgZGVzY3JpcHRvciBpbiBzeXN0ZW0gbWVtcm95Ki8KLQkJbGxpX2Jsb2NfZGVzYy0+bGxwID0gbGxpX25leHQ7Ci0JCWxsaV9ibG9jX2Rlc2MtPmN0bF9sbyA9IGN0bF9sby5jdGxfbG87Ci0JCWxsaV9ibG9jX2Rlc2MtPmN0bF9oaSA9IGN0bF9oaS5jdGxfaGk7Ci0KLQkJbGxpX2Jsb2NfZGVzYysrOwotCX0KLQkvKkNvcHkgdmVyeSBmaXJzdCBMTEkgdmFsdWVzIHRvIGRlc2NyaXB0b3IqLwotCWRlc2MtPmN0bF9sbyA9IGRlc2MtPmxsaS0+Y3RsX2xvOwotCWRlc2MtPmN0bF9oaSA9IGRlc2MtPmxsaS0+Y3RsX2hpOwotCWRlc2MtPnNhciA9IGRlc2MtPmxsaS0+c2FyOwotCWRlc2MtPmRhciA9IGRlc2MtPmxsaS0+ZGFyOwotCi0JcmV0dXJuIDA7Ci19Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLURNQSBlbmdpbmUgY2FsbGJhY2sgRnVuY3Rpb25zKi8KLS8qKgotICogaW50ZWxfbWlkX2RtYV90eF9zdWJtaXQgLQljYWxsYmFjayB0byBzdWJtaXQgRE1BIHRyYW5zYWN0aW9uCi0gKiBAdHg6IGRtYSBlbmdpbmUgZGVzY3JpcHRvcgotICoKLSAqIFN1Ym1pdCB0aGUgRE1BIHRyYW5zYWN0aW9uIGZvciB0aGlzIGRlc2NyaXB0b3IsIHN0YXJ0IGlmIGNoIGlkbGUKLSAqLwotc3RhdGljIGRtYV9jb29raWVfdCBpbnRlbF9taWRfZG1hX3R4X3N1Ym1pdChzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnR4KQotewotCXN0cnVjdCBpbnRlbF9taWRfZG1hX2Rlc2MJKmRlc2MgPSB0b19pbnRlbF9taWRfZG1hX2Rlc2ModHgpOwotCXN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4JKm1pZGMgPSB0b19pbnRlbF9taWRfZG1hX2NoYW4odHgtPmNoYW4pOwotCWRtYV9jb29raWVfdAkJY29va2llOwotCi0Jc3Bpbl9sb2NrX2JoKCZtaWRjLT5sb2NrKTsKLQljb29raWUgPSBkbWFfY29va2llX2Fzc2lnbih0eCk7Ci0KLQlpZiAobGlzdF9lbXB0eSgmbWlkYy0+YWN0aXZlX2xpc3QpKQotCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5kZXNjX25vZGUsICZtaWRjLT5hY3RpdmVfbGlzdCk7Ci0JZWxzZQotCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5kZXNjX25vZGUsICZtaWRjLT5xdWV1ZSk7Ci0KLQltaWRjX2Rvc3RhcnQobWlkYywgZGVzYyk7Ci0Jc3Bpbl91bmxvY2tfYmgoJm1pZGMtPmxvY2spOwotCi0JcmV0dXJuIGNvb2tpZTsKLX0KLQotLyoqCi0gKiBpbnRlbF9taWRfZG1hX2lzc3VlX3BlbmRpbmcgLQljYWxsYmFjayB0byBpc3N1ZSBwZW5kaW5nIHR4bgotICogQGNoYW46IGNoYW4gd2hlcmUgcGVuZGluZyB0cmFzY2F0aW9uIG5lZWRzIHRvIGJlIGNoZWNrZWQgYW5kIHN1Ym1pdHRlZAotICoKLSAqIENhbGwgZm9yIHNjYW4gdG8gaXNzdWUgcGVuZGluZyBkZXNjcmlwdG9ycwotICovCi1zdGF0aWMgdm9pZCBpbnRlbF9taWRfZG1hX2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKQotewotCXN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4JKm1pZGMgPSB0b19pbnRlbF9taWRfZG1hX2NoYW4oY2hhbik7Ci0KLQlzcGluX2xvY2tfYmgoJm1pZGMtPmxvY2spOwotCWlmICghbGlzdF9lbXB0eSgmbWlkYy0+cXVldWUpKQotCQltaWRjX3NjYW5fZGVzY3JpcHRvcnModG9fbWlkZG1hX2RldmljZShjaGFuLT5kZXZpY2UpLCBtaWRjKTsKLQlzcGluX3VubG9ja19iaCgmbWlkYy0+bG9jayk7Ci19Ci0KLS8qKgotICogaW50ZWxfbWlkX2RtYV90eF9zdGF0dXMgLQlSZXR1cm4gc3RhdHVzIG9mIHR4bgotICogQGNoYW46IGNoYW4gZm9yIHdoZXJlIHN0YXR1cyBuZWVkcyB0byBiZSBjaGVja2VkCi0gKiBAY29va2llOiBjb29raWUgZm9yIHR4bgotICogQHR4c3RhdGU6IERNQSB0eG4gc3RhdGUKLSAqCi0gKiBSZXR1cm4gc3RhdHVzIG9mIERNQSB0eG4KLSAqLwotc3RhdGljIGVudW0gZG1hX3N0YXR1cyBpbnRlbF9taWRfZG1hX3R4X3N0YXR1cyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCi0JCQkJCQlkbWFfY29va2llX3QgY29va2llLAotCQkJCQkJc3RydWN0IGRtYV90eF9zdGF0ZSAqdHhzdGF0ZSkKLXsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9jaGFuICptaWRjID0gdG9faW50ZWxfbWlkX2RtYV9jaGFuKGNoYW4pOwotCWVudW0gZG1hX3N0YXR1cyByZXQ7Ci0KLQlyZXQgPSBkbWFfY29va2llX3N0YXR1cyhjaGFuLCBjb29raWUsIHR4c3RhdGUpOwotCWlmIChyZXQgIT0gRE1BX0NPTVBMRVRFKSB7Ci0JCXNwaW5fbG9ja19iaCgmbWlkYy0+bG9jayk7Ci0JCW1pZGNfc2Nhbl9kZXNjcmlwdG9ycyh0b19taWRkbWFfZGV2aWNlKGNoYW4tPmRldmljZSksIG1pZGMpOwotCQlzcGluX3VubG9ja19iaCgmbWlkYy0+bG9jayk7Ci0KLQkJcmV0ID0gZG1hX2Nvb2tpZV9zdGF0dXMoY2hhbiwgY29va2llLCB0eHN0YXRlKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGludGVsX21pZF9kbWFfY29uZmlnKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKLQkJCQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqc2xhdmUpCi17Ci0Jc3RydWN0IGludGVsX21pZF9kbWFfY2hhbgkqbWlkYyA9IHRvX2ludGVsX21pZF9kbWFfY2hhbihjaGFuKTsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9zbGF2ZSAqbWlkX3NsYXZlOwotCi0JQlVHX09OKCFtaWRjKTsKLQlCVUdfT04oIXNsYXZlKTsKLQlwcl9kZWJ1ZygiTURNQTogc2xhdmUgY29udHJvbCBjYWxsZWRcbiIpOwotCi0JbWlkX3NsYXZlID0gdG9faW50ZWxfbWlkX2RtYV9zbGF2ZShzbGF2ZSk7Ci0KLQlCVUdfT04oIW1pZF9zbGF2ZSk7Ci0KLQltaWRjLT5taWRfc2xhdmUgPSBtaWRfc2xhdmU7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaW50ZWxfbWlkX2RtYV90ZXJtaW5hdGVfYWxsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKLXsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9jaGFuCSptaWRjID0gdG9faW50ZWxfbWlkX2RtYV9jaGFuKGNoYW4pOwotCXN0cnVjdCBtaWRkbWFfZGV2aWNlCSptaWQgPSB0b19taWRkbWFfZGV2aWNlKGNoYW4tPmRldmljZSk7Ci0Jc3RydWN0IGludGVsX21pZF9kbWFfZGVzYwkqZGVzYywgKl9kZXNjOwotCXVuaW9uIGludGVsX21pZF9kbWFfY2ZnX2xvIGNmZ19sbzsKLQotCXNwaW5fbG9ja19iaCgmbWlkYy0+bG9jayk7Ci0JaWYgKG1pZGMtPmJ1c3kgPT0gZmFsc2UpIHsKLQkJc3Bpbl91bmxvY2tfYmgoJm1pZGMtPmxvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JLypTdXNwZW5kIGFuZCBkaXNhYmxlIHRoZSBjaGFubmVsKi8KLQljZmdfbG8uY2ZnX2xvID0gaW9yZWFkMzIobWlkYy0+Y2hfcmVncyArIENGR19MT1cpOwotCWNmZ19sby5jZmd4LmNoX3N1c3AgPSAxOwotCWlvd3JpdGUzMihjZmdfbG8uY2ZnX2xvLCBtaWRjLT5jaF9yZWdzICsgQ0ZHX0xPVyk7Ci0JaW93cml0ZTMyKERJU0FCTEVfQ0hBTk5FTChtaWRjLT5jaF9pZCksIG1pZC0+ZG1hX2Jhc2UgKyBETUFfQ0hBTl9FTik7Ci0JbWlkYy0+YnVzeSA9IGZhbHNlOwotCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLwotCWRpc2FibGVfZG1hX2ludGVycnVwdChtaWRjKTsKLQltaWRjLT5kZXNjc19hbGxvY2F0ZWQgPSAwOwotCi0Jc3Bpbl91bmxvY2tfYmgoJm1pZGMtPmxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZGVzYywgJm1pZGMtPmFjdGl2ZV9saXN0LCBkZXNjX25vZGUpIHsKLQkJaWYgKGRlc2MtPmxsaSAhPSBOVUxMKSB7Ci0JCQlwY2lfcG9vbF9mcmVlKGRlc2MtPmxsaV9wb29sLCBkZXNjLT5sbGksCi0JCQkJCQlkZXNjLT5sbGlfcGh5cyk7Ci0JCQlwY2lfcG9vbF9kZXN0cm95KGRlc2MtPmxsaV9wb29sKTsKLQkJCWRlc2MtPmxsaSA9IE5VTEw7Ci0JCX0KLQkJbGlzdF9tb3ZlKCZkZXNjLT5kZXNjX25vZGUsICZtaWRjLT5mcmVlX2xpc3QpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi0vKioKLSAqIGludGVsX21pZF9kbWFfcHJlcF9tZW1jcHkgLQlQcmVwIG1lbWNweSB0eG4KLSAqIEBjaGFuOiBjaGFuIGZvciBETUEgdHJhbnNmZXIKLSAqIEBkZXN0OiBkZXN0biBhZGRyZXNzCi0gKiBAc3JjOiBzcmMgYWRkcmVzcwotICogQGxlbjogRE1BIHRyYW5zZmVyIGxlbgotICogQGZsYWdzOiBETUEgZmxhZ3MKLSAqCi0gKiBQZXJmb3JtIGEgRE1BIG1lbWNweS4gTm90ZSB3ZSBzdXBwb3J0IHNsYXZlIHBlcmlwaHJhbCBETUEgdHJhbnNmZXJzIG9ubHkKLSAqIFRoZSBwZXJpcGhyYWwgdHhuIGRldGFpbHMgc2hvdWxkIGJlIGZpbGxlZCBpbiBzbGF2ZSBzdHJ1Y3R1cmUgcHJvcGVybHkKLSAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgdHhuCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmludGVsX21pZF9kbWFfcHJlcF9tZW1jcHkoCi0JCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgZGVzdCwKLQkJCWRtYV9hZGRyX3Qgc3JjLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQotewotCXN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4gKm1pZGM7Ci0Jc3RydWN0IGludGVsX21pZF9kbWFfZGVzYyAqZGVzYyA9IE5VTEw7Ci0Jc3RydWN0IGludGVsX21pZF9kbWFfc2xhdmUgKm1pZHM7Ci0JdW5pb24gaW50ZWxfbWlkX2RtYV9jdGxfbG8gY3RsX2xvOwotCXVuaW9uIGludGVsX21pZF9kbWFfY3RsX2hpIGN0bF9oaTsKLQl1bmlvbiBpbnRlbF9taWRfZG1hX2NmZ19sbyBjZmdfbG87Ci0JdW5pb24gaW50ZWxfbWlkX2RtYV9jZmdfaGkgY2ZnX2hpOwotCWVudW0gZG1hX3NsYXZlX2J1c3dpZHRoIHdpZHRoOwotCi0JcHJfZGVidWcoIk1ETUE6IFByZXAgZm9yIG1lbWNweVxuIik7Ci0JQlVHX09OKCFjaGFuKTsKLQlpZiAoIWxlbikKLQkJcmV0dXJuIE5VTEw7Ci0KLQltaWRjID0gdG9faW50ZWxfbWlkX2RtYV9jaGFuKGNoYW4pOwotCUJVR19PTighbWlkYyk7Ci0KLQltaWRzID0gbWlkYy0+bWlkX3NsYXZlOwotCUJVR19PTighbWlkcyk7Ci0KLQlwcl9kZWJ1ZygiTURNQTpjYWxsZWQgZm9yIERNQSAleCBDSCAlZCBMZW5ndGggJXp1XG4iLAotCQkJCW1pZGMtPmRtYS0+cGNpX2lkLCBtaWRjLT5jaF9pZCwgbGVuKTsKLQlwcl9kZWJ1ZygiTURNQTpDZmcgcGFzc2VkIE1vZGUgJXgsIERpcm4gJXgsIEhTICV4LCBXaWR0aCAleFxuIiwKLQkJCW1pZHMtPmNmZ19tb2RlLCBtaWRzLT5kbWFfc2xhdmUuZGlyZWN0aW9uLAotCQkJbWlkcy0+aHNfbW9kZSwgbWlkcy0+ZG1hX3NsYXZlLnNyY19hZGRyX3dpZHRoKTsKLQotCS8qY2FsY3VsYXRlIENGR19MTyovCi0JaWYgKG1pZHMtPmhzX21vZGUgPT0gTE5XX0RNQV9TV19IUykgewotCQljZmdfbG8uY2ZnX2xvID0gMDsKLQkJY2ZnX2xvLmNmZ3guaHNfc2VsX2RzdCA9IDE7Ci0JCWNmZ19sby5jZmd4LmhzX3NlbF9zcmMgPSAxOwotCX0gZWxzZSBpZiAobWlkcy0+aHNfbW9kZSA9PSBMTldfRE1BX0hXX0hTKQotCQljZmdfbG8uY2ZnX2xvID0gMHgwMDAwMDsKLQotCS8qY2FsY3VsYXRlIENGR19ISSovCi0JaWYgKG1pZHMtPmNmZ19tb2RlID09IExOV19ETUFfTUVNX1RPX01FTSkgewotCQkvKlNXIEhTIG9ubHkqLwotCQljZmdfaGkuY2ZnX2hpID0gMDsKLQl9IGVsc2UgewotCQljZmdfaGkuY2ZnX2hpID0gMDsKLQkJaWYgKG1pZGMtPmRtYS0+cGltcl9tYXNrKSB7Ci0JCQljZmdfaGkuY2ZneC5wcm90Y3RsID0gMHgwOyAvKmRlZmF1bHQgdmFsdWUqLwotCQkJY2ZnX2hpLmNmZ3guZmlmb19tb2RlID0gMTsKLQkJCWlmIChtaWRzLT5kbWFfc2xhdmUuZGlyZWN0aW9uID09IERNQV9NRU1fVE9fREVWKSB7Ci0JCQkJY2ZnX2hpLmNmZ3guc3JjX3BlciA9IDA7Ci0JCQkJaWYgKG1pZHMtPmRldmljZV9pbnN0YW5jZSA9PSAwKQotCQkJCQljZmdfaGkuY2ZneC5kc3RfcGVyID0gMzsKLQkJCQlpZiAobWlkcy0+ZGV2aWNlX2luc3RhbmNlID09IDEpCi0JCQkJCWNmZ19oaS5jZmd4LmRzdF9wZXIgPSAxOwotCQkJfSBlbHNlIGlmIChtaWRzLT5kbWFfc2xhdmUuZGlyZWN0aW9uID09IERNQV9ERVZfVE9fTUVNKSB7Ci0JCQkJaWYgKG1pZHMtPmRldmljZV9pbnN0YW5jZSA9PSAwKQotCQkJCQljZmdfaGkuY2ZneC5zcmNfcGVyID0gMjsKLQkJCQlpZiAobWlkcy0+ZGV2aWNlX2luc3RhbmNlID09IDEpCi0JCQkJCWNmZ19oaS5jZmd4LnNyY19wZXIgPSAwOwotCQkJCWNmZ19oaS5jZmd4LmRzdF9wZXIgPSAwOwotCQkJfQotCQl9IGVsc2UgewotCQkJY2ZnX2hpLmNmZ3gucHJvdGN0bCA9IDB4MTsgLypkZWZhdWx0IHZhbHVlKi8KLQkJCWNmZ19oaS5jZmd4LnNyY19wZXIgPSBjZmdfaGkuY2ZneC5kc3RfcGVyID0KLQkJCQkJbWlkYy0+Y2hfaWQgLSBtaWRjLT5kbWEtPmNoYW5fYmFzZTsKLQkJfQotCX0KLQotCS8qY2FsY3VsYXRlIENUTF9ISSovCi0JY3RsX2hpLmN0bHgucmVzZXIgPSAwOwotCWN0bF9oaS5jdGx4LmRvbmUgID0gMDsKLQl3aWR0aCA9IG1pZHMtPmRtYV9zbGF2ZS5zcmNfYWRkcl93aWR0aDsKLQotCWN0bF9oaS5jdGx4LmJsb2NrX3RzID0gZ2V0X2Jsb2NrX3RzKGxlbiwgd2lkdGgsIG1pZGMtPmRtYS0+YmxvY2tfc2l6ZSk7Ci0JcHJfZGVidWcoIk1ETUE6Y2FsYyBsZW4gJWQgZm9yIGJsb2NrIHNpemUgJWRcbiIsCi0JCQkJY3RsX2hpLmN0bHguYmxvY2tfdHMsIG1pZGMtPmRtYS0+YmxvY2tfc2l6ZSk7Ci0JLypjYWxjdWxhdGUgQ1RMX0xPKi8KLQljdGxfbG8uY3RsX2xvID0gMDsKLQljdGxfbG8uY3RseC5pbnRfZW4gPSAxOwotCWN0bF9sby5jdGx4LmRzdF9tc2l6ZSA9IG1pZHMtPmRtYV9zbGF2ZS5zcmNfbWF4YnVyc3Q7Ci0JY3RsX2xvLmN0bHguc3JjX21zaXplID0gbWlkcy0+ZG1hX3NsYXZlLmRzdF9tYXhidXJzdDsKLQotCS8qCi0JICogSGVyZSB3ZSBuZWVkIHNvbWUgdHJhbnNsYXRpb24gZnJvbSAiZW51bSBkbWFfc2xhdmVfYnVzd2lkdGgiCi0JICogdG8gdGhlIGZvcm1hdCBmb3Igb3VyIGRtYSBjb250cm9sbGVyCi0JICoJCXN0YW5kYXJkCWludGVsX21pZF9kbWFjJ3MgZm9ybWF0Ci0JICoJCSAxIEJ5dGUJCQkwYjAwMAotCSAqCQkgMiBCeXRlcwkJMGIwMDEKLQkgKgkJIDQgQnl0ZXMJCTBiMDEwCi0JICovCi0JY3RsX2xvLmN0bHguZHN0X3RyX3dpZHRoID0gbWlkcy0+ZG1hX3NsYXZlLmRzdF9hZGRyX3dpZHRoIC8gMjsKLQljdGxfbG8uY3RseC5zcmNfdHJfd2lkdGggPSBtaWRzLT5kbWFfc2xhdmUuc3JjX2FkZHJfd2lkdGggLyAyOwotCi0JaWYgKG1pZHMtPmNmZ19tb2RlID09IExOV19ETUFfTUVNX1RPX01FTSkgewotCQljdGxfbG8uY3RseC50dF9mYyA9IDA7Ci0JCWN0bF9sby5jdGx4LnNpbmMgPSAwOwotCQljdGxfbG8uY3RseC5kaW5jID0gMDsKLQl9IGVsc2UgewotCQlpZiAobWlkcy0+ZG1hX3NsYXZlLmRpcmVjdGlvbiA9PSBETUFfTUVNX1RPX0RFVikgewotCQkJY3RsX2xvLmN0bHguc2luYyA9IDA7Ci0JCQljdGxfbG8uY3RseC5kaW5jID0gMjsKLQkJCWN0bF9sby5jdGx4LnR0X2ZjID0gMTsKLQkJfSBlbHNlIGlmIChtaWRzLT5kbWFfc2xhdmUuZGlyZWN0aW9uID09IERNQV9ERVZfVE9fTUVNKSB7Ci0JCQljdGxfbG8uY3RseC5zaW5jID0gMjsKLQkJCWN0bF9sby5jdGx4LmRpbmMgPSAwOwotCQkJY3RsX2xvLmN0bHgudHRfZmMgPSAyOwotCQl9Ci0JfQotCi0JcHJfZGVidWcoIk1ETUE6Q2FsYyBDVEwgTE8gJXgsIENUTCBISSAleCwgQ0ZHIExPICV4LCBDRkcgSEkgJXhcbiIsCi0JCWN0bF9sby5jdGxfbG8sIGN0bF9oaS5jdGxfaGksIGNmZ19sby5jZmdfbG8sIGNmZ19oaS5jZmdfaGkpOwotCi0JZW5hYmxlX2RtYV9pbnRlcnJ1cHQobWlkYyk7Ci0KLQlkZXNjID0gbWlkY19kZXNjX2dldChtaWRjKTsKLQlpZiAoZGVzYyA9PSBOVUxMKQotCQlnb3RvIGVycl9kZXNjX2dldDsKLQlkZXNjLT5zYXIgPSBzcmM7Ci0JZGVzYy0+ZGFyID0gZGVzdCA7Ci0JZGVzYy0+bGVuID0gbGVuOwotCWRlc2MtPmNmZ19oaSA9IGNmZ19oaS5jZmdfaGk7Ci0JZGVzYy0+Y2ZnX2xvID0gY2ZnX2xvLmNmZ19sbzsKLQlkZXNjLT5jdGxfbG8gPSBjdGxfbG8uY3RsX2xvOwotCWRlc2MtPmN0bF9oaSA9IGN0bF9oaS5jdGxfaGk7Ci0JZGVzYy0+d2lkdGggPSB3aWR0aDsKLQlkZXNjLT5kaXJuID0gbWlkcy0+ZG1hX3NsYXZlLmRpcmVjdGlvbjsKLQlkZXNjLT5sbGlfcGh5cyA9IDA7Ci0JZGVzYy0+bGxpID0gTlVMTDsKLQlkZXNjLT5sbGlfcG9vbCA9IE5VTEw7Ci0JcmV0dXJuICZkZXNjLT50eGQ7Ci0KLWVycl9kZXNjX2dldDoKLQlwcl9lcnIoIkVSUl9NRE1BOiBGYWlsZWQgdG8gZ2V0IGRlc2NcbiIpOwotCW1pZGNfZGVzY19wdXQobWlkYywgZGVzYyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0vKioKLSAqIGludGVsX21pZF9kbWFfcHJlcF9zbGF2ZV9zZyAtCVByZXAgc2xhdmUgc2cgdHhuCi0gKiBAY2hhbjogY2hhbiBmb3IgRE1BIHRyYW5zZmVyCi0gKiBAc2dsOiBzY2F0dGVyIGdhdGhlciBsaXN0Ci0gKiBAc2dfbGVuOiBsZW5ndGggb2Ygc2cgdHhuCi0gKiBAZGlyZWN0aW9uOiBETUEgdHJhbnNmZXIgZGlydG4KLSAqIEBmbGFnczogRE1BIGZsYWdzCi0gKiBAY29udGV4dDogdHJhbnNmZXIgY29udGV4dCAoaWdub3JlZCkKLSAqCi0gKiBQcmVwYXJlcyBMTEkgYmFzZWQgcGVyaXBocmFsIHRyYW5zZmVyCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmludGVsX21pZF9kbWFfcHJlcF9zbGF2ZV9zZygKLQkJCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCi0JCQl1bnNpZ25lZCBpbnQgc2dfbGVuLCBlbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyZWN0aW9uLAotCQkJdW5zaWduZWQgbG9uZyBmbGFncywgdm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9jaGFuICptaWRjID0gTlVMTDsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9zbGF2ZSAqbWlkcyA9IE5VTEw7Ci0Jc3RydWN0IGludGVsX21pZF9kbWFfZGVzYyAqZGVzYyA9IE5VTEw7Ci0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eGQgPSBOVUxMOwotCXVuaW9uIGludGVsX21pZF9kbWFfY3RsX2xvIGN0bF9sbzsKLQotCXByX2RlYnVnKCJNRE1BOiBQcmVwIGZvciBzbGF2ZSBTR1xuIik7Ci0KLQlpZiAoIXNnX2xlbikgewotCQlwcl9lcnIoIk1ETUE6IEludmFsaWQgU0cgbGVuZ3RoXG4iKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCW1pZGMgPSB0b19pbnRlbF9taWRfZG1hX2NoYW4oY2hhbik7Ci0JQlVHX09OKCFtaWRjKTsKLQotCW1pZHMgPSBtaWRjLT5taWRfc2xhdmU7Ci0JQlVHX09OKCFtaWRzKTsKLQotCWlmICghbWlkYy0+ZG1hLT5waW1yX21hc2spIHsKLQkJLyogV2UgY2FuIHN0aWxsIGhhbmRsZSBzZyBsaXN0IHdpdGggb25seSBvbmUgaXRlbSAqLwotCQlpZiAoc2dfbGVuID09IDEpIHsKLQkJCXR4ZCA9IGludGVsX21pZF9kbWFfcHJlcF9tZW1jcHkoY2hhbiwKLQkJCQkJCW1pZHMtPmRtYV9zbGF2ZS5kc3RfYWRkciwKLQkJCQkJCW1pZHMtPmRtYV9zbGF2ZS5zcmNfYWRkciwKLQkJCQkJCXNnX2RtYV9sZW4oc2dsKSwKLQkJCQkJCWZsYWdzKTsKLQkJCXJldHVybiB0eGQ7Ci0JCX0gZWxzZSB7Ci0JCQlwcl93YXJuKCJNRE1BOiBTRyBsaXN0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb250cm9sbGVyXG4iKTsKLQkJCXJldHVybiAgTlVMTDsKLQkJfQotCX0KLQotCXByX2RlYnVnKCJNRE1BOiBTRyBMZW5ndGggPSAlZCwgZGlyZWN0aW9uID0gJWQsIEZsYWdzID0gJSNseFxuIiwKLQkJCXNnX2xlbiwgZGlyZWN0aW9uLCBmbGFncyk7Ci0KLQl0eGQgPSBpbnRlbF9taWRfZG1hX3ByZXBfbWVtY3B5KGNoYW4sIDAsIDAsIHNnX2RtYV9sZW4oc2dsKSwgZmxhZ3MpOwotCWlmIChOVUxMID09IHR4ZCkgewotCQlwcl9lcnIoIk1ETUE6IFByZXAgbWVtY3B5IGZhaWxlZFxuIik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWRlc2MgPSB0b19pbnRlbF9taWRfZG1hX2Rlc2ModHhkKTsKLQlkZXNjLT5kaXJuID0gZGlyZWN0aW9uOwotCWN0bF9sby5jdGxfbG8gPSBkZXNjLT5jdGxfbG87Ci0JY3RsX2xvLmN0bHgubGxwX2RzdF9lbiA9IDE7Ci0JY3RsX2xvLmN0bHgubGxwX3NyY19lbiA9IDE7Ci0JZGVzYy0+Y3RsX2xvID0gY3RsX2xvLmN0bF9sbzsKLQlkZXNjLT5sbGlfbGVuZ3RoID0gc2dfbGVuOwotCWRlc2MtPmN1cnJlbnRfbGxpID0gMDsKLQkvKiBETUEgY29oZXJlbnQgbWVtb3J5IHBvb2wgZm9yIExMSSBkZXNjcmlwdG9ycyovCi0JZGVzYy0+bGxpX3Bvb2wgPSBwY2lfcG9vbF9jcmVhdGUoImludGVsX21pZF9kbWFfbGxpX3Bvb2wiLAotCQkJCW1pZGMtPmRtYS0+cGRldiwKLQkJCQkoc2l6ZW9mKHN0cnVjdCBpbnRlbF9taWRfZG1hX2xsaSkqc2dfbGVuKSwKLQkJCQkzMiwgMCk7Ci0JaWYgKE5VTEwgPT0gZGVzYy0+bGxpX3Bvb2wpIHsKLQkJcHJfZXJyKCJNSURfRE1BOkxMSSBwb29sIGNyZWF0ZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlkZXNjLT5sbGkgPSBwY2lfcG9vbF9hbGxvYyhkZXNjLT5sbGlfcG9vbCwgR0ZQX0tFUk5FTCwgJmRlc2MtPmxsaV9waHlzKTsKLQlpZiAoIWRlc2MtPmxsaSkgewotCQlwcl9lcnIoIk1JRF9ETUE6IExMSSBhbGxvYyBmYWlsZWRcbiIpOwotCQlwY2lfcG9vbF9kZXN0cm95KGRlc2MtPmxsaV9wb29sKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JbWlkY19sbGlfZmlsbF9zZyhtaWRjLCBkZXNjLCBzZ2wsIHNnX2xlbiwgZmxhZ3MpOwotCWlmIChmbGFncyAmIERNQV9QUkVQX0lOVEVSUlVQVCkgewotCQlpb3dyaXRlMzIoVU5NQVNLX0lOVFJfUkVHKG1pZGMtPmNoX2lkKSwKLQkJCQltaWRjLT5kbWFfYmFzZSArIE1BU0tfQkxPQ0spOwotCQlwcl9kZWJ1ZygiTURNQTpFbmFibGVkIEJsb2NrIGludGVycnVwdFxuIik7Ci0JfQotCXJldHVybiAmZGVzYy0+dHhkOwotfQotCi0vKioKLSAqIGludGVsX21pZF9kbWFfZnJlZV9jaGFuX3Jlc291cmNlcyAtCUZyZWVzIGRtYSByZXNvdXJjZXMKLSAqIEBjaGFuOiBjaGFuIHJlcXVpcmluZyBhdHRlbnRpb24KLSAqCi0gKiBGcmVlcyB0aGUgYWxsb2NhdGVkIHJlc291cmNlcyBvbiB0aGlzIERNQSBjaGFuCi0gKi8KLXN0YXRpYyB2b2lkIGludGVsX21pZF9kbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCi17Ci0Jc3RydWN0IGludGVsX21pZF9kbWFfY2hhbgkqbWlkYyA9IHRvX2ludGVsX21pZF9kbWFfY2hhbihjaGFuKTsKLQlzdHJ1Y3QgbWlkZG1hX2RldmljZQkqbWlkID0gdG9fbWlkZG1hX2RldmljZShjaGFuLT5kZXZpY2UpOwotCXN0cnVjdCBpbnRlbF9taWRfZG1hX2Rlc2MJKmRlc2MsICpfZGVzYzsKLQotCWlmICh0cnVlID09IG1pZGMtPmJ1c3kpIHsKLQkJLyp0cnlpbmcgdG8gZnJlZSBjaCBpbiB1c2UhISEhISovCi0JCXByX2VycigiRVJSX01ETUE6IHRyeWluZyB0byBmcmVlIGNoIGluIHVzZVxuIik7Ci0JfQotCXNwaW5fbG9ja19iaCgmbWlkYy0+bG9jayk7Ci0JbWlkYy0+ZGVzY3NfYWxsb2NhdGVkID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsICZtaWRjLT5hY3RpdmVfbGlzdCwgZGVzY19ub2RlKSB7Ci0JCWxpc3RfZGVsKCZkZXNjLT5kZXNjX25vZGUpOwotCQlwY2lfcG9vbF9mcmVlKG1pZC0+ZG1hX3Bvb2wsIGRlc2MsIGRlc2MtPnR4ZC5waHlzKTsKLQl9Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRlc2MsIF9kZXNjLCAmbWlkYy0+ZnJlZV9saXN0LCBkZXNjX25vZGUpIHsKLQkJbGlzdF9kZWwoJmRlc2MtPmRlc2Nfbm9kZSk7Ci0JCXBjaV9wb29sX2ZyZWUobWlkLT5kbWFfcG9vbCwgZGVzYywgZGVzYy0+dHhkLnBoeXMpOwotCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2Rlc2MsICZtaWRjLT5xdWV1ZSwgZGVzY19ub2RlKSB7Ci0JCWxpc3RfZGVsKCZkZXNjLT5kZXNjX25vZGUpOwotCQlwY2lfcG9vbF9mcmVlKG1pZC0+ZG1hX3Bvb2wsIGRlc2MsIGRlc2MtPnR4ZC5waHlzKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJm1pZGMtPmxvY2spOwotCW1pZGMtPmluX3VzZSA9IGZhbHNlOwotCW1pZGMtPmJ1c3kgPSBmYWxzZTsKLQkvKiBEaXNhYmxlIENIIGludGVycnVwdHMgKi8KLQlpb3dyaXRlMzIoTUFTS19JTlRSX1JFRyhtaWRjLT5jaF9pZCksIG1pZC0+ZG1hX2Jhc2UgKyBNQVNLX0JMT0NLKTsKLQlpb3dyaXRlMzIoTUFTS19JTlRSX1JFRyhtaWRjLT5jaF9pZCksIG1pZC0+ZG1hX2Jhc2UgKyBNQVNLX0VSUik7Ci0JcG1fcnVudGltZV9wdXQoJm1pZC0+cGRldi0+ZGV2KTsKLX0KLQotLyoqCi0gKiBpbnRlbF9taWRfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzIC0JQWxsb2NhdGUgZG1hIHJlc291cmNlcwotICogQGNoYW46IGNoYW4gcmVxdWlyaW5nIGF0dGVudGlvbgotICoKLSAqIEFsbG9jYXRlcyBETUEgcmVzb3VyY2VzIG9uIHRoaXMgY2hhbgotICogUmV0dXJuIHRoZSBkZXNjcmlwdG9ycyBhbGxvY2F0ZWQKLSAqLwotc3RhdGljIGludCBpbnRlbF9taWRfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKLXsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9jaGFuCSptaWRjID0gdG9faW50ZWxfbWlkX2RtYV9jaGFuKGNoYW4pOwotCXN0cnVjdCBtaWRkbWFfZGV2aWNlCSptaWQgPSB0b19taWRkbWFfZGV2aWNlKGNoYW4tPmRldmljZSk7Ci0Jc3RydWN0IGludGVsX21pZF9kbWFfZGVzYwkqZGVzYzsKLQlkbWFfYWRkcl90CQlwaHlzOwotCWludAlpID0gMDsKLQotCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJm1pZC0+cGRldi0+ZGV2KTsKLQotCWlmIChtaWQtPnN0YXRlID09IFNVU1BFTkRFRCkgewotCQlpZiAoZG1hX3Jlc3VtZSgmbWlkLT5wZGV2LT5kZXYpKSB7Ci0JCQlwcl9lcnIoIkVSUl9NRE1BOiByZXN1bWUgZmFpbGVkIik7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCX0KLQotCS8qIEFTU0VSVDogIGNoYW5uZWwgaXMgaWRsZSAqLwotCWlmICh0ZXN0X2NoX2VuKG1pZC0+ZG1hX2Jhc2UsIG1pZGMtPmNoX2lkKSkgewotCQkvKmNoIGlzIG5vdCBpZGxlKi8KLQkJcHJfZXJyKCJFUlJfTURNQTogY2ggbm90IGlkbGVcbiIpOwotCQlwbV9ydW50aW1lX3B1dCgmbWlkLT5wZGV2LT5kZXYpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JZG1hX2Nvb2tpZV9pbml0KGNoYW4pOwotCi0Jc3Bpbl9sb2NrX2JoKCZtaWRjLT5sb2NrKTsKLQl3aGlsZSAobWlkYy0+ZGVzY3NfYWxsb2NhdGVkIDwgREVTQ1NfUEVSX0NIQU5ORUwpIHsKLQkJc3Bpbl91bmxvY2tfYmgoJm1pZGMtPmxvY2spOwotCQlkZXNjID0gcGNpX3Bvb2xfYWxsb2MobWlkLT5kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJnBoeXMpOwotCQlpZiAoIWRlc2MpIHsKLQkJCXByX2VycigiRVJSX01ETUE6IGRlc2MgZmFpbGVkXG4iKTsKLQkJCXBtX3J1bnRpbWVfcHV0KCZtaWQtPnBkZXYtPmRldik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJCS8qY2hlY2sqLwotCQl9Ci0JCWRtYV9hc3luY190eF9kZXNjcmlwdG9yX2luaXQoJmRlc2MtPnR4ZCwgY2hhbik7Ci0JCWRlc2MtPnR4ZC50eF9zdWJtaXQgPSBpbnRlbF9taWRfZG1hX3R4X3N1Ym1pdDsKLQkJZGVzYy0+dHhkLmZsYWdzID0gRE1BX0NUUkxfQUNLOwotCQlkZXNjLT50eGQucGh5cyA9IHBoeXM7Ci0JCXNwaW5fbG9ja19iaCgmbWlkYy0+bG9jayk7Ci0JCWkgPSArK21pZGMtPmRlc2NzX2FsbG9jYXRlZDsKLQkJbGlzdF9hZGRfdGFpbCgmZGVzYy0+ZGVzY19ub2RlLCAmbWlkYy0+ZnJlZV9saXN0KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfYmgoJm1pZGMtPmxvY2spOwotCW1pZGMtPmluX3VzZSA9IHRydWU7Ci0JbWlkYy0+YnVzeSA9IGZhbHNlOwotCXByX2RlYnVnKCJNSURfRE1BOiBEZXNjIGFsbG9jIGRvbmUgcmV0OiAlZCBkZXNjXG4iLCBpKTsKLQlyZXR1cm4gaTsKLX0KLQotLyoqCi0gKiBtaWRjX2hhbmRsZV9lcnJvciAtCUhhbmRsZSBETUEgdHhuIGVycm9yCi0gKiBAbWlkOiBjb250cm9sbGVyIHdoZXJlIGVycm9yIG9jY3VycmVkCi0gKiBAbWlkYzogY2hhbiB3aGVyZSBlcnJvciBvY2N1cnJlZAotICoKLSAqIFNjYW4gdGhlIGRlc2NyaXB0b3IgZm9yIGVycm9yCi0gKi8KLXN0YXRpYyB2b2lkIG1pZGNfaGFuZGxlX2Vycm9yKHN0cnVjdCBtaWRkbWFfZGV2aWNlICptaWQsCi0JCXN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4gKm1pZGMpCi17Ci0JbWlkY19zY2FuX2Rlc2NyaXB0b3JzKG1pZCwgbWlkYyk7Ci19Ci0KLS8qKgotICogZG1hX3Rhc2tsZXQgLQlETUEgaW50ZXJydXB0IHRhc2tsZXQKLSAqIEBkYXRhOiB0YXNrbGV0IGFyZyAodGhlIGNvbnRyb2xsZXIgc3RydWN0dXJlKQotICoKLSAqIFNjYW4gdGhlIGNvbnRyb2xsZXIgZm9yIGludGVycnVwdHMgZm9yIGNvbXBsZXRpb24vZXJyb3IKLSAqIENsZWFyIHRoZSBpbnRlcnJ1cHQgYW5kIGNhbGwgZm9yIGhhbmRsaW5nIGNvbXBsZXRpb24vZXJyb3IKLSAqLwotc3RhdGljIHZvaWQgZG1hX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBtaWRkbWFfZGV2aWNlICptaWQgPSBOVUxMOwotCXN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4gKm1pZGMgPSBOVUxMOwotCXUzMiBzdGF0dXMsIHJhd190ZnIsIHJhd19ibG9jazsKLQlpbnQgaTsKLQotCW1pZCA9IChzdHJ1Y3QgbWlkZG1hX2RldmljZSAqKWRhdGE7Ci0JaWYgKG1pZCA9PSBOVUxMKSB7Ci0JCXByX2VycigiRVJSX01ETUE6IHRhc2tsZXQgTnVsbCBwYXJhbVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JcHJfZGVidWcoIk1ETUE6IGluIHRhc2tsZXQgZm9yIGRldmljZSAleFxuIiwgbWlkLT5wY2lfaWQpOwotCXJhd190ZnIgPSBpb3JlYWQzMihtaWQtPmRtYV9iYXNlICsgUkFXX1RGUik7Ci0JcmF3X2Jsb2NrID0gaW9yZWFkMzIobWlkLT5kbWFfYmFzZSArIFJBV19CTE9DSyk7Ci0Jc3RhdHVzID0gcmF3X3RmciB8IHJhd19ibG9jazsKLQlzdGF0dXMgJj0gbWlkLT5pbnRyX21hc2s7Ci0Jd2hpbGUgKHN0YXR1cykgewotCQkvKnR4biBpbnRlcnJ1cHQqLwotCQlpID0gZ2V0X2NoX2luZGV4KCZzdGF0dXMsIG1pZC0+Y2hhbl9iYXNlKTsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlwcl9lcnIoIkVSUl9NRE1BOkludmFsaWQgY2ggaW5kZXggJXhcbiIsIGkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCW1pZGMgPSAmbWlkLT5jaFtpXTsKLQkJaWYgKG1pZGMgPT0gTlVMTCkgewotCQkJcHJfZXJyKCJFUlJfTURNQTpOdWxsIHBhcmFtIG1pZGNcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXByX2RlYnVnKCJNRE1BOlR4IGNvbXBsZXRlIGludGVycnVwdCAleCwgQ2ggTm8gJWQgSW5kZXggJWRcbiIsCi0JCQkJc3RhdHVzLCBtaWRjLT5jaF9pZCwgaSk7Ci0JCW1pZGMtPnJhd190ZnIgPSByYXdfdGZyOwotCQltaWRjLT5yYXdfYmxvY2sgPSByYXdfYmxvY2s7Ci0JCXNwaW5fbG9ja19iaCgmbWlkYy0+bG9jayk7Ci0JCS8qY2xlYXJpbmcgdGhpcyBpbnRlcnJ1cHRzIGZpcnN0Ki8KLQkJaW93cml0ZTMyKCgxIDw8IG1pZGMtPmNoX2lkKSwgbWlkLT5kbWFfYmFzZSArIENMRUFSX1RGUik7Ci0JCWlmIChyYXdfYmxvY2spIHsKLQkJCWlvd3JpdGUzMigoMSA8PCBtaWRjLT5jaF9pZCksCi0JCQkJbWlkLT5kbWFfYmFzZSArIENMRUFSX0JMT0NLKTsKLQkJfQotCQltaWRjX3NjYW5fZGVzY3JpcHRvcnMobWlkLCBtaWRjKTsKLQkJcHJfZGVidWcoIk1ETUE6U2NhbiBvZiBkZXNjLi4uIGNvbXBsZXRlLCB1bm1hc2tpbmdcbiIpOwotCQlpb3dyaXRlMzIoVU5NQVNLX0lOVFJfUkVHKG1pZGMtPmNoX2lkKSwKLQkJCQltaWQtPmRtYV9iYXNlICsgTUFTS19URlIpOwotCQlpZiAocmF3X2Jsb2NrKSB7Ci0JCQlpb3dyaXRlMzIoVU5NQVNLX0lOVFJfUkVHKG1pZGMtPmNoX2lkKSwKLQkJCQltaWQtPmRtYV9iYXNlICsgTUFTS19CTE9DSyk7Ci0JCX0KLQkJc3Bpbl91bmxvY2tfYmgoJm1pZGMtPmxvY2spOwotCX0KLQotCXN0YXR1cyA9IGlvcmVhZDMyKG1pZC0+ZG1hX2Jhc2UgKyBSQVdfRVJSKTsKLQlzdGF0dXMgJj0gbWlkLT5pbnRyX21hc2s7Ci0Jd2hpbGUgKHN0YXR1cykgewotCQkvKmVyciBpbnRlcnJ1cHQqLwotCQlpID0gZ2V0X2NoX2luZGV4KCZzdGF0dXMsIG1pZC0+Y2hhbl9iYXNlKTsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlwcl9lcnIoIkVSUl9NRE1BOkludmFsaWQgY2ggaW5kZXggJXhcbiIsIGkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCW1pZGMgPSAmbWlkLT5jaFtpXTsKLQkJaWYgKG1pZGMgPT0gTlVMTCkgewotCQkJcHJfZXJyKCJFUlJfTURNQTpOdWxsIHBhcmFtIG1pZGNcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXByX2RlYnVnKCJNRE1BOlR4IGNvbXBsZXRlIGludGVycnVwdCAleCwgQ2ggTm8gJWQgSW5kZXggJWRcbiIsCi0JCQkJc3RhdHVzLCBtaWRjLT5jaF9pZCwgaSk7Ci0KLQkJaW93cml0ZTMyKCgxIDw8IG1pZGMtPmNoX2lkKSwgbWlkLT5kbWFfYmFzZSArIENMRUFSX0VSUik7Ci0JCXNwaW5fbG9ja19iaCgmbWlkYy0+bG9jayk7Ci0JCW1pZGNfaGFuZGxlX2Vycm9yKG1pZCwgbWlkYyk7Ci0JCWlvd3JpdGUzMihVTk1BU0tfSU5UUl9SRUcobWlkYy0+Y2hfaWQpLAotCQkJCW1pZC0+ZG1hX2Jhc2UgKyBNQVNLX0VSUik7Ci0JCXNwaW5fdW5sb2NrX2JoKCZtaWRjLT5sb2NrKTsKLQl9Ci0JcHJfZGVidWcoIk1ETUE6RXhpdGluZyB0YWtzbGV0Li4uXG4iKTsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGRtYV90YXNrbGV0MSh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0JcHJfZGVidWcoIk1ETUE6aW4gdGFrc2xldDEuLi5cbiIpOwotCXJldHVybiBkbWFfdGFza2xldChkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgZG1hX3Rhc2tsZXQyKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlwcl9kZWJ1ZygiTURNQTppbiB0YWtzbGV0Mi4uLlxuIik7Ci0JcmV0dXJuIGRtYV90YXNrbGV0KGRhdGEpOwotfQotCi0vKioKLSAqIGludGVsX21pZF9kbWFfaW50ZXJydXB0IC0JRE1BIElTUgotICogQGlycTogSVJRIHdoZXJlIGludGVycnVwdCBvY2N1cnJlZAotICogQGRhdGE6IElTUiBjbGxiYWNrIGRhdGEgKHRoZSBjb250cm9sbGVyIHN0cnVjdHVyZSkKLSAqCi0gKiBTZWUgaWYgdGhpcyBpcyBvdXIgaW50ZXJydXB0IGlmIHNvIHRoZW4gc2NoZWR1bGUgdGhlIHRhc2tsZXQKLSAqIG90aGVyd2lzZSBpZ25vcmUKLSAqLwotc3RhdGljIGlycXJldHVybl90IGludGVsX21pZF9kbWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IG1pZGRtYV9kZXZpY2UgKm1pZCA9IGRhdGE7Ci0JdTMyIHRmcl9zdGF0dXMsIGVycl9zdGF0dXM7Ci0JaW50IGNhbGxfdGFza2xldCA9IDA7Ci0KLQl0ZnJfc3RhdHVzID0gaW9yZWFkMzIobWlkLT5kbWFfYmFzZSArIFJBV19URlIpOwotCWVycl9zdGF0dXMgPSBpb3JlYWQzMihtaWQtPmRtYV9iYXNlICsgUkFXX0VSUik7Ci0JaWYgKCF0ZnJfc3RhdHVzICYmICFlcnJfc3RhdHVzKQotCQlyZXR1cm4gSVJRX05PTkU7Ci0KLQkvKkRNQSBJbnRlcnJ1cHQqLwotCXByX2RlYnVnKCJNRE1BOkdvdCBhbiBpbnRlcnJ1cHQgb24gaXJxICVkXG4iLCBpcnEpOwotCXByX2RlYnVnKCJNRE1BOiBTdGF0dXMgJXgsIE1hc2sgJXhcbiIsIHRmcl9zdGF0dXMsIG1pZC0+aW50cl9tYXNrKTsKLQl0ZnJfc3RhdHVzICY9IG1pZC0+aW50cl9tYXNrOwotCWlmICh0ZnJfc3RhdHVzKSB7Ci0JCS8qbmVlZCB0byBkaXNhYmxlIGludHIqLwotCQlpb3dyaXRlMzIoKHRmcl9zdGF0dXMgPDwgSU5UX01BU0tfV0UpLCBtaWQtPmRtYV9iYXNlICsgTUFTS19URlIpOwotCQlpb3dyaXRlMzIoKHRmcl9zdGF0dXMgPDwgSU5UX01BU0tfV0UpLCBtaWQtPmRtYV9iYXNlICsgTUFTS19CTE9DSyk7Ci0JCXByX2RlYnVnKCJNRE1BOiBDYWxsaW5nIHRhc2tsZXQgJXhcbiIsIHRmcl9zdGF0dXMpOwotCQljYWxsX3Rhc2tsZXQgPSAxOwotCX0KLQllcnJfc3RhdHVzICY9IG1pZC0+aW50cl9tYXNrOwotCWlmIChlcnJfc3RhdHVzKSB7Ci0JCWlvd3JpdGUzMigoZXJyX3N0YXR1cyA8PCBJTlRfTUFTS19XRSksCi0JCQkgIG1pZC0+ZG1hX2Jhc2UgKyBNQVNLX0VSUik7Ci0JCWNhbGxfdGFza2xldCA9IDE7Ci0JfQotCWlmIChjYWxsX3Rhc2tsZXQpCi0JCXRhc2tsZXRfc2NoZWR1bGUoJm1pZC0+dGFza2xldCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlbF9taWRfZG1hX2ludGVycnVwdDEoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlyZXR1cm4gaW50ZWxfbWlkX2RtYV9pbnRlcnJ1cHQoaXJxLCBkYXRhKTsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGludGVsX21pZF9kbWFfaW50ZXJydXB0MihpbnQgaXJxLCB2b2lkICpkYXRhKQotewotCXJldHVybiBpbnRlbF9taWRfZG1hX2ludGVycnVwdChpcnEsIGRhdGEpOwotfQotCi0vKioKLSAqIG1pZF9zZXR1cF9kbWEgLQlTZXR1cCB0aGUgRE1BIGNvbnRyb2xsZXIKLSAqIEBwZGV2OiBDb250cm9sbGVyIFBDSSBkZXZpY2Ugc3RydWN0dXJlCi0gKgotICogSW5pdGlhbGl6ZSB0aGUgRE1BIGNvbnRyb2xsZXIsIGNoYW5uZWxzLCByZWdpc3RlcnMgd2l0aCBETUEgZW5naW5lLAotICogSVNSLiBJbml0aWFsaXplIERNQSBjb250cm9sbGVyIGNoYW5uZWxzLgotICovCi1zdGF0aWMgaW50IG1pZF9zZXR1cF9kbWEoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IG1pZGRtYV9kZXZpY2UgKmRtYSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlpbnQgZXJyLCBpOwotCi0JLyogRE1BIGNvaGVyZW50IG1lbW9yeSBwb29sIGZvciBETUEgZGVzY3JpcHRvciBhbGxvY2F0aW9ucyAqLwotCWRtYS0+ZG1hX3Bvb2wgPSBwY2lfcG9vbF9jcmVhdGUoImludGVsX21pZF9kbWFfZGVzY19wb29sIiwgcGRldiwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpbnRlbF9taWRfZG1hX2Rlc2MpLAotCQkJCQkzMiwgMCk7Ci0JaWYgKE5VTEwgPT0gZG1hLT5kbWFfcG9vbCkgewotCQlwcl9lcnIoIkVSUl9NRE1BOnBjaV9wb29sX2NyZWF0ZSBmYWlsZWRcbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9kbWFfcG9vbDsKLQl9Ci0KLQlJTklUX0xJU1RfSEVBRCgmZG1hLT5jb21tb24uY2hhbm5lbHMpOwotCWRtYS0+cGNpX2lkID0gcGRldi0+ZGV2aWNlOwotCWlmIChkbWEtPnBpbXJfbWFzaykgewotCQlkbWEtPm1hc2tfcmVnID0gaW9yZW1hcChMTldfUEVSSVBIUkFMX01BU0tfQkFTRSwKLQkJCQkJTE5XX1BFUklQSFJBTF9NQVNLX1NJWkUpOwotCQlpZiAoZG1hLT5tYXNrX3JlZyA9PSBOVUxMKSB7Ci0JCQlwcl9lcnIoIkVSUl9NRE1BOkNhbid0IG1hcCBwZXJpcGhyYWwgaW50ciBzcGFjZSAhIVxuIik7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBlcnJfaW9yZW1hcDsKLQkJfQotCX0gZWxzZQotCQlkbWEtPm1hc2tfcmVnID0gTlVMTDsKLQotCXByX2RlYnVnKCJNRE1BOkFkZGluZyAlZCBjaGFubmVsIGZvciB0aGlzIGNvbnRyb2xsZXJcbiIsIGRtYS0+bWF4X2NoYW4pOwotCS8qaW5pdCBDSCBzdHJ1Y3R1cmVzKi8KLQlkbWEtPmludHJfbWFzayA9IDA7Ci0JZG1hLT5zdGF0ZSA9IFJVTk5JTkc7Ci0JZm9yIChpID0gMDsgaSA8IGRtYS0+bWF4X2NoYW47IGkrKykgewotCQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9jaGFuICptaWRjaCA9ICZkbWEtPmNoW2ldOwotCi0JCW1pZGNoLT5jaGFuLmRldmljZSA9ICZkbWEtPmNvbW1vbjsKLQkJZG1hX2Nvb2tpZV9pbml0KCZtaWRjaC0+Y2hhbik7Ci0JCW1pZGNoLT5jaF9pZCA9IGRtYS0+Y2hhbl9iYXNlICsgaTsKLQkJcHJfZGVidWcoIk1ETUE6SW5pdCBDSCAlZCwgSUQgJWRcbiIsIGksIG1pZGNoLT5jaF9pZCk7Ci0KLQkJbWlkY2gtPmRtYV9iYXNlID0gZG1hLT5kbWFfYmFzZTsKLQkJbWlkY2gtPmNoX3JlZ3MgPSBkbWEtPmRtYV9iYXNlICsgRE1BX0NIX1NJWkUgKiBtaWRjaC0+Y2hfaWQ7Ci0JCW1pZGNoLT5kbWEgPSBkbWE7Ci0JCWRtYS0+aW50cl9tYXNrIHw9IDEgPDwgKGRtYS0+Y2hhbl9iYXNlICsgaSk7Ci0JCXNwaW5fbG9ja19pbml0KCZtaWRjaC0+bG9jayk7Ci0KLQkJSU5JVF9MSVNUX0hFQUQoJm1pZGNoLT5hY3RpdmVfbGlzdCk7Ci0JCUlOSVRfTElTVF9IRUFEKCZtaWRjaC0+cXVldWUpOwotCQlJTklUX0xJU1RfSEVBRCgmbWlkY2gtPmZyZWVfbGlzdCk7Ci0JCS8qbWFzayBpbnRlcnJ1cHRzKi8KLQkJaW93cml0ZTMyKE1BU0tfSU5UUl9SRUcobWlkY2gtPmNoX2lkKSwKLQkJCWRtYS0+ZG1hX2Jhc2UgKyBNQVNLX0JMT0NLKTsKLQkJaW93cml0ZTMyKE1BU0tfSU5UUl9SRUcobWlkY2gtPmNoX2lkKSwKLQkJCWRtYS0+ZG1hX2Jhc2UgKyBNQVNLX1NSQ19UUkFOKTsKLQkJaW93cml0ZTMyKE1BU0tfSU5UUl9SRUcobWlkY2gtPmNoX2lkKSwKLQkJCWRtYS0+ZG1hX2Jhc2UgKyBNQVNLX0RTVF9UUkFOKTsKLQkJaW93cml0ZTMyKE1BU0tfSU5UUl9SRUcobWlkY2gtPmNoX2lkKSwKLQkJCWRtYS0+ZG1hX2Jhc2UgKyBNQVNLX0VSUik7Ci0JCWlvd3JpdGUzMihNQVNLX0lOVFJfUkVHKG1pZGNoLT5jaF9pZCksCi0JCQlkbWEtPmRtYV9iYXNlICsgTUFTS19URlIpOwotCi0JCWRpc2FibGVfZG1hX2ludGVycnVwdChtaWRjaCk7Ci0JCWxpc3RfYWRkX3RhaWwoJm1pZGNoLT5jaGFuLmRldmljZV9ub2RlLCAmZG1hLT5jb21tb24uY2hhbm5lbHMpOwotCX0KLQlwcl9kZWJ1ZygiTURNQTogQ2FsYyBNYXNrIGFzICV4IGZvciB0aGlzIGNvbnRyb2xsZXJcbiIsIGRtYS0+aW50cl9tYXNrKTsKLQotCS8qaW5pdCBkbWEgc3RydWN0dXJlKi8KLQlkbWFfY2FwX3plcm8oZG1hLT5jb21tb24uY2FwX21hc2spOwotCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIGRtYS0+Y29tbW9uLmNhcF9tYXNrKTsKLQlkbWFfY2FwX3NldChETUFfU0xBVkUsIGRtYS0+Y29tbW9uLmNhcF9tYXNrKTsKLQlkbWFfY2FwX3NldChETUFfUFJJVkFURSwgZG1hLT5jb21tb24uY2FwX21hc2spOwotCWRtYS0+Y29tbW9uLmRldiA9ICZwZGV2LT5kZXY7Ci0KLQlkbWEtPmNvbW1vbi5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgPQotCQkJCQlpbnRlbF9taWRfZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzOwotCWRtYS0+Y29tbW9uLmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzID0KLQkJCQkJaW50ZWxfbWlkX2RtYV9mcmVlX2NoYW5fcmVzb3VyY2VzOwotCi0JZG1hLT5jb21tb24uZGV2aWNlX3R4X3N0YXR1cyA9IGludGVsX21pZF9kbWFfdHhfc3RhdHVzOwotCWRtYS0+Y29tbW9uLmRldmljZV9wcmVwX2RtYV9tZW1jcHkgPSBpbnRlbF9taWRfZG1hX3ByZXBfbWVtY3B5OwotCWRtYS0+Y29tbW9uLmRldmljZV9pc3N1ZV9wZW5kaW5nID0gaW50ZWxfbWlkX2RtYV9pc3N1ZV9wZW5kaW5nOwotCWRtYS0+Y29tbW9uLmRldmljZV9wcmVwX3NsYXZlX3NnID0gaW50ZWxfbWlkX2RtYV9wcmVwX3NsYXZlX3NnOwotCWRtYS0+Y29tbW9uLmRldmljZV9jb25maWcgPSBpbnRlbF9taWRfZG1hX2NvbmZpZzsKLQlkbWEtPmNvbW1vbi5kZXZpY2VfdGVybWluYXRlX2FsbCA9IGludGVsX21pZF9kbWFfdGVybWluYXRlX2FsbDsKLQotCS8qZW5hYmxlIGRtYSBjbnRybCovCi0JaW93cml0ZTMyKFJFR19CSVQwLCBkbWEtPmRtYV9iYXNlICsgRE1BX0NGRyk7Ci0KLQkvKnJlZ2lzdGVyIGlycSAqLwotCWlmIChkbWEtPnBpbXJfbWFzaykgewotCQlwcl9kZWJ1ZygiTURNQTpSZXF1ZXN0aW5nIGlycSBzaGFyZWQgZm9yIERNQUMxXG4iKTsKLQkJZXJyID0gcmVxdWVzdF9pcnEocGRldi0+aXJxLCBpbnRlbF9taWRfZG1hX2ludGVycnVwdDEsCi0JCQlJUlFGX1NIQVJFRCwgIklOVEVMX01JRF9ETUFDMSIsIGRtYSk7Ci0JCWlmICgwICE9IGVycikKLQkJCWdvdG8gZXJyX2lycTsKLQl9IGVsc2UgewotCQlkbWEtPmludHJfbWFzayA9IDB4MDM7Ci0JCXByX2RlYnVnKCJNRE1BOlJlcXVlc3RpbmcgaXJxIGZvciBETUFDMlxuIik7Ci0JCWVyciA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgaW50ZWxfbWlkX2RtYV9pbnRlcnJ1cHQyLAotCQkJSVJRRl9TSEFSRUQsICJJTlRFTF9NSURfRE1BQzIiLCBkbWEpOwotCQlpZiAoMCAhPSBlcnIpCi0JCQlnb3RvIGVycl9pcnE7Ci0JfQotCS8qcmVnaXN0ZXIgZGV2aWNlIHcvIGVuZ2luZSovCi0JZXJyID0gZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlcigmZG1hLT5jb21tb24pOwotCWlmICgwICE9IGVycikgewotCQlwcl9lcnIoIkVSUl9NRE1BOmRldmljZV9yZWdpc3RlciBmYWlsZWQ6ICVkXG4iLCBlcnIpOwotCQlnb3RvIGVycl9lbmdpbmU7Ci0JfQotCWlmIChkbWEtPnBpbXJfbWFzaykgewotCQlwcl9kZWJ1Zygic2V0dGluZyB1cCB0YXNrbGV0MSBmb3IgRE1BQzFcbiIpOwotCQl0YXNrbGV0X2luaXQoJmRtYS0+dGFza2xldCwgZG1hX3Rhc2tsZXQxLCAodW5zaWduZWQgbG9uZylkbWEpOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJzZXR0aW5nIHVwIHRhc2tsZXQyIGZvciBETUFDMlxuIik7Ci0JCXRhc2tsZXRfaW5pdCgmZG1hLT50YXNrbGV0LCBkbWFfdGFza2xldDIsICh1bnNpZ25lZCBsb25nKWRtYSk7Ci0JfQotCXJldHVybiAwOwotCi1lcnJfZW5naW5lOgotCWZyZWVfaXJxKHBkZXYtPmlycSwgZG1hKTsKLWVycl9pcnE6Ci0JaWYgKGRtYS0+bWFza19yZWcpCi0JCWlvdW5tYXAoZG1hLT5tYXNrX3JlZyk7Ci1lcnJfaW9yZW1hcDoKLQlwY2lfcG9vbF9kZXN0cm95KGRtYS0+ZG1hX3Bvb2wpOwotZXJyX2RtYV9wb29sOgotCXByX2VycigiRVJSX01ETUE6c2V0dXBfZG1hIGZhaWxlZDogJWRcbiIsIGVycik7Ci0JcmV0dXJuIGVycjsKLQotfQotCi0vKioKLSAqIG1pZGRtYV9zaHV0ZG93biAtCVNodXRkb3duIHRoZSBETUEgY29udHJvbGxlcgotICogQHBkZXY6IENvbnRyb2xsZXIgUENJIGRldmljZSBzdHJ1Y3R1cmUKLSAqCi0gKiBDYWxsZWQgYnkgcmVtb3ZlCi0gKiBVbnJlZ2lzdGVyIERNYSBjb250cm9sbGVyLCBjbGVhciBhbGwgc3RydWN0dXJlcyBhbmQgZnJlZSBpbnRlcnJ1cHQKLSAqLwotc3RhdGljIHZvaWQgbWlkZG1hX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBtaWRkbWFfZGV2aWNlICpkZXZpY2UgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0KLQlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoJmRldmljZS0+Y29tbW9uKTsKLQlwY2lfcG9vbF9kZXN0cm95KGRldmljZS0+ZG1hX3Bvb2wpOwotCWlmIChkZXZpY2UtPm1hc2tfcmVnKQotCQlpb3VubWFwKGRldmljZS0+bWFza19yZWcpOwotCWlmIChkZXZpY2UtPmRtYV9iYXNlKQotCQlpb3VubWFwKGRldmljZS0+ZG1hX2Jhc2UpOwotCWZyZWVfaXJxKHBkZXYtPmlycSwgZGV2aWNlKTsKLQlyZXR1cm47Ci19Ci0KLS8qKgotICogaW50ZWxfbWlkX2RtYV9wcm9iZSAtCVBDSSBQcm9iZQotICogQHBkZXY6IENvbnRyb2xsZXIgUENJIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBpZDogcGNpIGRldmljZSBpZCBzdHJ1Y3R1cmUKLSAqCi0gKiBJbml0aWFsaXplIHRoZSBQQ0kgZGV2aWNlLCBtYXAgQkFScywgcXVlcnkgZHJpdmVyIGRhdGEuCi0gKiBDYWxsIHNldHVwX2RtYSB0byBjb21wbGV0ZSBjb250b2xsZXIgYW5kIGNoYW4gaW5pdGlsemF0aW9uCi0gKi8KLXN0YXRpYyBpbnQgaW50ZWxfbWlkX2RtYV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLQkJCQkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQotewotCXN0cnVjdCBtaWRkbWFfZGV2aWNlICpkZXZpY2U7Ci0JdTMyIGJhc2VfYWRkciwgYmFyX3NpemU7Ci0Jc3RydWN0IGludGVsX21pZF9kbWFfcHJvYmVfaW5mbyAqaW5mbzsKLQlpbnQgZXJyOwotCi0JcHJfZGVidWcoIk1ETUE6IHByb2JlIGZvciAleFxuIiwgcGRldi0+ZGV2aWNlKTsKLQlpbmZvID0gKHZvaWQgKilpZC0+ZHJpdmVyX2RhdGE7Ci0JcHJfZGVidWcoIk1ETUE6IENIICVkLCBiYXNlICVkLCBibG9jayBsZW4gJWQsIFBlcmlwaHJhbCBtYXNrICV4XG4iLAotCQkJCWluZm8tPm1heF9jaGFuLCBpbmZvLT5jaF9iYXNlLAotCQkJCWluZm8tPmJsb2NrX3NpemUsIGluZm8tPnBpbXJfbWFzayk7Ci0KLQllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9lbmFibGVfZGV2aWNlOwotCi0JZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCAiaW50ZWxfbWlkX2RtYWMiKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9yZXF1ZXN0X3JlZ2lvbnM7Ci0KLQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3NldF9kbWFfbWFzazsKLQotCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9zZXRfZG1hX21hc2s7Ci0KLQlkZXZpY2UgPSBremFsbG9jKHNpemVvZigqZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkZXZpY2UpIHsKLQkJcHJfZXJyKCJFUlJfTURNQTpremFsbG9jIGZhaWxlZCBwcm9iZVxuIik7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2t6YWxsb2M7Ci0JfQotCWRldmljZS0+cGRldiA9IHBjaV9kZXZfZ2V0KHBkZXYpOwotCi0JYmFzZV9hZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwotCWJhcl9zaXplICA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCk7Ci0JZGV2aWNlLT5kbWFfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShiYXNlX2FkZHIsIERNQV9SRUdfU0laRSk7Ci0JaWYgKCFkZXZpY2UtPmRtYV9iYXNlKSB7Ci0JCXByX2VycigiRVJSX01ETUE6aW9yZW1hcCBmYWlsZWRcbiIpOwotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9pb3JlbWFwOwotCX0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgZGV2aWNlKTsKLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQlkZXZpY2UtPm1heF9jaGFuID0gaW5mby0+bWF4X2NoYW47Ci0JZGV2aWNlLT5jaGFuX2Jhc2UgPSBpbmZvLT5jaF9iYXNlOwotCWRldmljZS0+YmxvY2tfc2l6ZSA9IGluZm8tPmJsb2NrX3NpemU7Ci0JZGV2aWNlLT5waW1yX21hc2sgPSBpbmZvLT5waW1yX21hc2s7Ci0KLQllcnIgPSBtaWRfc2V0dXBfZG1hKHBkZXYpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2RtYTsKLQotCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcGRldi0+ZGV2KTsKLQlwbV9ydW50aW1lX2FsbG93KCZwZGV2LT5kZXYpOwotCXJldHVybiAwOwotCi1lcnJfZG1hOgotCWlvdW5tYXAoZGV2aWNlLT5kbWFfYmFzZSk7Ci1lcnJfaW9yZW1hcDoKLQlwY2lfZGV2X3B1dChwZGV2KTsKLQlrZnJlZShkZXZpY2UpOwotZXJyX2t6YWxsb2M6Ci1lcnJfc2V0X2RtYV9tYXNrOgotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotZXJyX3JlcXVlc3RfcmVnaW9uczoKLWVycl9lbmFibGVfZGV2aWNlOgotCXByX2VycigiRVJSX01ETUE6UHJvYmUgZmFpbGVkICVkXG4iLCBlcnIpOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgotICogaW50ZWxfbWlkX2RtYV9yZW1vdmUgLQlQQ0kgcmVtb3ZlCi0gKiBAcGRldjogQ29udHJvbGxlciBQQ0kgZGV2aWNlIHN0cnVjdHVyZQotICoKLSAqIEZyZWUgdXAgYWxsIHJlc291cmNlcyBhbmQgZGF0YQotICogQ2FsbCBzaHV0ZG93bl9kbWEgdG8gY29tcGxldGUgY29udG9sbGVyIGFuZCBjaGFuIGNsZWFudXAKLSAqLwotc3RhdGljIHZvaWQgaW50ZWxfbWlkX2RtYV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCi17Ci0Jc3RydWN0IG1pZGRtYV9kZXZpY2UgKmRldmljZSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKCZwZGV2LT5kZXYpOwotCXBtX3J1bnRpbWVfZm9yYmlkKCZwZGV2LT5kZXYpOwotCW1pZGRtYV9zaHV0ZG93bihwZGV2KTsKLQlwY2lfZGV2X3B1dChwZGV2KTsKLQlrZnJlZShkZXZpY2UpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotfQotCi0vKiBQb3dlciBNYW5hZ2VtZW50ICovCi0vKgotKiBkbWFfc3VzcGVuZCAtIFBDSSBzdXNwZW5kIGZ1bmN0aW9uCi0qCi0qIEBwY2k6IFBDSSBkZXZpY2Ugc3RydWN0dXJlCi0qIEBzdGF0ZTogUE0gbWVzc2FnZQotKgotKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBPUyB3aGVuIGEgcG93ZXIgZXZlbnQgb2NjdXJzCi0qLwotc3RhdGljIGludCBkbWFfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBjaSA9IHRvX3BjaV9kZXYoZGV2KTsKLQlpbnQgaTsKLQlzdHJ1Y3QgbWlkZG1hX2RldmljZSAqZGV2aWNlID0gcGNpX2dldF9kcnZkYXRhKHBjaSk7Ci0JcHJfZGVidWcoIk1ETUE6IGRtYV9zdXNwZW5kIGNhbGxlZFxuIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZGV2aWNlLT5tYXhfY2hhbjsgaSsrKSB7Ci0JCWlmIChkZXZpY2UtPmNoW2ldLmluX3VzZSkKLQkJCXJldHVybiAtRUFHQUlOOwotCX0KLQlkbWFjMV9tYXNrX3BlcmlwaHJhbF9pbnRyKGRldmljZSk7Ci0JZGV2aWNlLT5zdGF0ZSA9IFNVU1BFTkRFRDsKLQlwY2lfc2F2ZV9zdGF0ZShwY2kpOwotCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwotCXBjaV9zZXRfcG93ZXJfc3RhdGUocGNpLCBQQ0lfRDNob3QpOwotCXJldHVybiAwOwotfQotCi0vKioKLSogZG1hX3Jlc3VtZSAtIFBDSSByZXN1bWUgZnVuY3Rpb24KLSoKLSogQHBjaToJUENJIGRldmljZSBzdHJ1Y3R1cmUKLSoKLSogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgT1Mgd2hlbiBhIHBvd2VyIGV2ZW50IG9jY3VycwotKi8KLWludCBkbWFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpID0gdG9fcGNpX2RldihkZXYpOwotCWludCByZXQ7Ci0Jc3RydWN0IG1pZGRtYV9kZXZpY2UgKmRldmljZSA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOwotCi0JcHJfZGVidWcoIk1ETUE6IGRtYV9yZXN1bWUgY2FsbGVkXG4iKTsKLQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QwKTsKLQlwY2lfcmVzdG9yZV9zdGF0ZShwY2kpOwotCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaSk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIk1ETUE6IGRldmljZSBjYW4ndCBiZSBlbmFibGVkIGZvciAleFxuIiwgcGNpLT5kZXZpY2UpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlkZXZpY2UtPnN0YXRlID0gUlVOTklORzsKLQlpb3dyaXRlMzIoUkVHX0JJVDAsIGRldmljZS0+ZG1hX2Jhc2UgKyBETUFfQ0ZHKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkbWFfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgbWlkZG1hX2RldmljZSAqZGV2aWNlID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOwotCi0JZGV2aWNlLT5zdGF0ZSA9IFNVU1BFTkRFRDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkbWFfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gdG9fcGNpX2RldihkZXYpOwotCXN0cnVjdCBtaWRkbWFfZGV2aWNlICpkZXZpY2UgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7Ci0KLQlkZXZpY2UtPnN0YXRlID0gUlVOTklORzsKLQlpb3dyaXRlMzIoUkVHX0JJVDAsIGRldmljZS0+ZG1hX2Jhc2UgKyBETUFfQ0ZHKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkbWFfcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKLQlzdHJ1Y3QgbWlkZG1hX2RldmljZSAqZGV2aWNlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGRldmljZS0+bWF4X2NoYW47IGkrKykgewotCQlpZiAoZGV2aWNlLT5jaFtpXS5pbl91c2UpCi0JCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBQQ0kgc3R1ZmYKLSovCi1zdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaW50ZWxfbWlkX2RtYV9pZHNbXSA9IHsKLQl7IFBDSV9WREVWSUNFKElOVEVMLCBJTlRFTF9NSURfRE1BQzFfSUQpLAlJTkZPKDIsIDYsIDQwOTUsIDB4MjAwMDIwKX0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgSU5URUxfTUlEX0RNQUMyX0lEKSwJSU5GTygyLCAwLCAyMDQ3LCAwKX0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgSU5URUxfTUlEX0dQX0RNQUMyX0lEKSwJSU5GTygyLCAwLCAyMDQ3LCAwKX0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgSU5URUxfTUZMRF9ETUFDMV9JRCksCUlORk8oNCwgMCwgNDA5NSwgMHg0MDAwNDApfSwKLQl7IDAsIH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaW50ZWxfbWlkX2RtYV9pZHMpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaW50ZWxfbWlkX2RtYV9wbSA9IHsKLQkucnVudGltZV9zdXNwZW5kID0gZG1hX3J1bnRpbWVfc3VzcGVuZCwKLQkucnVudGltZV9yZXN1bWUgPSBkbWFfcnVudGltZV9yZXN1bWUsCi0JLnJ1bnRpbWVfaWRsZSA9IGRtYV9ydW50aW1lX2lkbGUsCi0JLnN1c3BlbmQgPSBkbWFfc3VzcGVuZCwKLQkucmVzdW1lID0gZG1hX3Jlc3VtZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpbnRlbF9taWRfZG1hX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUJCT0JIkludGVsIE1JRCBETUEiLAotCS5pZF90YWJsZQk9CWludGVsX21pZF9kbWFfaWRzLAotCS5wcm9iZQkJPQlpbnRlbF9taWRfZG1hX3Byb2JlLAotCS5yZW1vdmUJCT0JaW50ZWxfbWlkX2RtYV9yZW1vdmUsCi0jaWZkZWYgQ09ORklHX1BNCi0JLmRyaXZlciA9IHsKLQkJLnBtID0gJmludGVsX21pZF9kbWFfcG0sCi0JfSwKLSNlbmRpZgotfTsKLQotc3RhdGljIGludCBfX2luaXQgaW50ZWxfbWlkX2RtYV9pbml0KHZvaWQpCi17Ci0JcHJfZGVidWcoIklORk9fTURNQTogTE5XIERNQSBEcml2ZXIgVmVyc2lvbiAlc1xuIiwKLQkJCUlOVEVMX01JRF9ETUFfRFJJVkVSX1ZFUlNJT04pOwotCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpbnRlbF9taWRfZG1hX3BjaV9kcml2ZXIpOwotfQotZnNfaW5pdGNhbGwoaW50ZWxfbWlkX2RtYV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGludGVsX21pZF9kbWFfZXhpdCh2b2lkKQotewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaW50ZWxfbWlkX2RtYV9wY2lfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGludGVsX21pZF9kbWFfZXhpdCk7Ci0KLU1PRFVMRV9BVVRIT1IoIlZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCAoUikgTUlEIERNQUMgRHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfVkVSU0lPTihJTlRFTF9NSURfRE1BX0RSSVZFUl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2ludGVsX21pZF9kbWFfcmVncy5oIGIvZHJpdmVycy9kbWEvaW50ZWxfbWlkX2RtYV9yZWdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YjQyMTkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9kbWEvaW50ZWxfbWlkX2RtYV9yZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOTkgKzAsMCBAQAotLyoKLSAqICBpbnRlbF9taWRfZG1hX3JlZ3MuaCAtIEludGVsIE1JRCBETUEgRHJpdmVycwotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMTAgSW50ZWwgQ29ycAotICogIEF1dGhvcjogVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+Ci0gKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgotICoKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKgotICoKLSAqLwotI2lmbmRlZiBfX0lOVEVMX01JRF9ETUFDX1JFR1NfSF9fCi0jZGVmaW5lIF9fSU5URUxfTUlEX0RNQUNfUkVHU19IX18KLQotI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+Ci0KLSNkZWZpbmUgSU5URUxfTUlEX0RNQV9EUklWRVJfVkVSU0lPTiAiMS4xLjAiCi0KLSNkZWZpbmUJUkVHX0JJVDAJCTB4MDAwMDAwMDEKLSNkZWZpbmUJUkVHX0JJVDgJCTB4MDAwMDAxMDAKLSNkZWZpbmUgSU5UX01BU0tfV0UJCTB4OAotI2RlZmluZSBDTEVBUl9ET05FCQkweEZGRkZFRkZGCi0jZGVmaW5lIFVOTUFTS19JTlRSX1JFRyhjaGFuX251bSkgXAotCSgoUkVHX0JJVDAgPDwgY2hhbl9udW0pIHwgKFJFR19CSVQ4IDw8IGNoYW5fbnVtKSkKLSNkZWZpbmUgTUFTS19JTlRSX1JFRyhjaGFuX251bSkgKFJFR19CSVQ4IDw8IGNoYW5fbnVtKQotCi0jZGVmaW5lIEVOQUJMRV9DSEFOTkVMKGNoYW5fbnVtKSBcCi0JKChSRUdfQklUMCA8PCBjaGFuX251bSkgfCAoUkVHX0JJVDggPDwgY2hhbl9udW0pKQotCi0jZGVmaW5lIERJU0FCTEVfQ0hBTk5FTChjaGFuX251bSkgXAotCShSRUdfQklUOCA8PCBjaGFuX251bSkKLQotI2RlZmluZSBERVNDU19QRVJfQ0hBTk5FTAkxNgotLypETUEgUmVnaXN0ZXJzKi8KLS8qcmVnaXN0ZXJzIGFzc29jaWF0ZWQgd2l0aCBjaGFubmVsIHByb2dyYW1taW5nKi8KLSNkZWZpbmUgRE1BX1JFR19TSVpFCQkweDQwMAotI2RlZmluZSBETUFfQ0hfU0laRQkJMHg1OAotCi0vKkNIIFggUkVHID0gKERNQV9DSF9TSVpFKSpDSF9OTyArIFJFRyovCi0jZGVmaW5lIFNBUgkJCTB4MDAgLyogU291cmNlIEFkZHJlc3MgUmVnaXN0ZXIqLwotI2RlZmluZSBEQVIJCQkweDA4IC8qIERlc3RpbmF0aW9uIEFkZHJlc3MgUmVnaXN0ZXIqLwotI2RlZmluZSBMTFAJCQkweDEwIC8qIExpbmtlZCBMaXN0IFBvaW50ZXIgUmVnaXN0ZXIqLwotI2RlZmluZSBDVExfTE9XCQkJMHgxOCAvKiBDb250cm9sIFJlZ2lzdGVyKi8KLSNkZWZpbmUgQ1RMX0hJR0gJCTB4MUMgLyogQ29udHJvbCBSZWdpc3RlciovCi0jZGVmaW5lIENGR19MT1cJCQkweDQwIC8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgTG93Ki8KLSNkZWZpbmUgQ0ZHX0hJR0gJCTB4NDQgLyogQ29uZmlndXJhdGlvbiBSZWdpc3RlciBoaWdoKi8KLQotI2RlZmluZSBTVEFUVVNfVEZSCQkweDJFOAotI2RlZmluZSBTVEFUVVNfQkxPQ0sJCTB4MkYwCi0jZGVmaW5lIFNUQVRVU19FUlIJCTB4MzA4Ci0KLSNkZWZpbmUgUkFXX1RGUgkJCTB4MkMwCi0jZGVmaW5lIFJBV19CTE9DSwkJMHgyQzgKLSNkZWZpbmUgUkFXX0VSUgkJCTB4MkUwCi0KLSNkZWZpbmUgTUFTS19URlIJCTB4MzEwCi0jZGVmaW5lIE1BU0tfQkxPQ0sJCTB4MzE4Ci0jZGVmaW5lIE1BU0tfU1JDX1RSQU4JCTB4MzIwCi0jZGVmaW5lIE1BU0tfRFNUX1RSQU4JCTB4MzI4Ci0jZGVmaW5lIE1BU0tfRVJSCQkweDMzMAotCi0jZGVmaW5lIENMRUFSX1RGUgkJMHgzMzgKLSNkZWZpbmUgQ0xFQVJfQkxPQ0sJCTB4MzQwCi0jZGVmaW5lIENMRUFSX1NSQ19UUkFOCQkweDM0OAotI2RlZmluZSBDTEVBUl9EU1RfVFJBTgkJMHgzNTAKLSNkZWZpbmUgQ0xFQVJfRVJSCQkweDM1OAotCi0jZGVmaW5lIElOVFJfU1RBVFVTCQkweDM2MAotI2RlZmluZSBETUFfQ0ZHCQkJMHgzOTgKLSNkZWZpbmUgRE1BX0NIQU5fRU4JCTB4M0EwCi0KLS8qRE1BIGNoYW5uZWwgY29udHJvbCByZWdpc3RlcnMqLwotdW5pb24gaW50ZWxfbWlkX2RtYV9jdGxfbG8gewotCXN0cnVjdCB7Ci0JCXUzMglpbnRfZW46MTsJLyplbmFibGUgb3IgZGlzYWJsZSBpbnRlcnJ1cHRzKi8KLQkJCQkJLypzaG91bGQgYmUgMCovCi0JCXUzMglkc3RfdHJfd2lkdGg6MzsJLypkZXN0aW5hdGlvbiB0cmFuc2ZlciB3aWR0aCovCi0JCQkJCS8qdXN1YWxseSAzMiBiaXRzID0gMDEwKi8KLQkJdTMyCXNyY190cl93aWR0aDozOyAvKnNvdXJjZSB0cmFuc2ZlciB3aWR0aCovCi0JCQkJCS8qdXN1YWxseSAzMiBiaXRzID0gMDEwKi8KLQkJdTMyCWRpbmM6MjsJCS8qZGVzdGluYXRpb24gYWRkcmVzcyBpbmMvZGVjKi8KLQkJCQkJLypGb3IgbWVtOklOQz0wMCwgUGVyaXBocmFsIE5vSU5DPTExKi8KLQkJdTMyCXNpbmM6MjsJCS8qc291cmNlIGFkZHJlc3MgaW5jIG9yIGRlYywgYXMgYWJvdmUqLwotCQl1MzIJZHN0X21zaXplOjM7CS8qZGVzdGluYXRpb24gYnVyc3QgdHJhbnNhY3Rpb24gbGVuZ3RoKi8KLQkJCQkJLyphbHdheXMgPSAxNiBpZSAwMTEqLwotCQl1MzIJc3JjX21zaXplOjM7CS8qc291cmNlIGJ1cnN0IHRyYW5zYWN0aW9uIGxlbmd0aCovCi0JCQkJCS8qYWx3YXlzID0gMTYgaWUgMDExKi8KLQkJdTMyCXJlc2VyMTozOwotCQl1MzIJdHRfZmM6MzsJLyp0cmFuc2ZlciB0eXBlIGFuZCBmbG93IGNvbnRyb2xsZXIqLwotCQkJCQkvKk0tTSA9IDAwMAotCQkJCQkgIFAtTSA9IDAxMAotCQkJCQkgIE0tUCA9IDAwMSovCi0JCXUzMglkbXM6MjsJCS8qZGVzdGluYXRpb24gbWFzdGVyIHNlbGVjdCA9IDAqLwotCQl1MzIJc21zOjI7CQkvKnNvdXJjZSBtYXN0ZXIgc2VsZWN0ID0gMCovCi0JCXUzMglsbHBfZHN0X2VuOjE7CS8qZW5hYmxlL2Rpc2FibGUgZGVzdGluYXRpb24gTExQID0gMCovCi0JCXUzMglsbHBfc3JjX2VuOjE7CS8qZW5hYmxlL2Rpc2FibGUgc291cmNlIExMUCA9IDAqLwotCQl1MzIJcmVzZXIyOjM7Ci0JfSBjdGx4OwotCXUzMgljdGxfbG87Ci19OwotCi11bmlvbiBpbnRlbF9taWRfZG1hX2N0bF9oaSB7Ci0Jc3RydWN0IHsKLQkJdTMyCWJsb2NrX3RzOjEyOwkvKmJsb2NrIHRyYW5zZmVyIHNpemUqLwotCQl1MzIJZG9uZToxOwkJLypEb25lIC0gdXBkYXRlZCBieSBETUFDKi8KLQkJdTMyCXJlc2VyOjE5OwkvKmNvbmZpZ3VyZWQgYnkgRE1BQyovCi0JfSBjdGx4OwotCXUzMgljdGxfaGk7Ci0KLX07Ci0KLS8qRE1BIGNoYW5uZWwgY29uZmlndXJhdGlvbiByZWdpc3RlcnMqLwotdW5pb24gaW50ZWxfbWlkX2RtYV9jZmdfbG8gewotCXN0cnVjdCB7Ci0JCXUzMglyZXNlcjE6NTsKLQkJdTMyCWNoX3ByaW9yOjM7CS8qY2hhbm5lbCBwcmlvcml0eSA9IDAqLwotCQl1MzIJY2hfc3VzcDoxOwkvKmNoYW5uZWwgc3VzcGVuZCA9IDAqLwotCQl1MzIJZmlmb19lbXB0eToxOwkvKkZJRk8gZW1wdHkgb3Igbm90IFIgYml0ID0gMCovCi0JCXUzMgloc19zZWxfZHN0OjE7CS8qc2VsZWN0IEhXL1NXIGRlc3RuIGhhbmRzaGFraW5nKi8KLQkJCQkJLypIVyA9IDAsIFNXID0gMSovCi0JCXUzMgloc19zZWxfc3JjOjE7CS8qc2VsZWN0IEhXL1NXIHNyYyBoYW5kc2hha2luZyovCi0JCXUzMglyZXNlcjI6NjsKLQkJdTMyCWRzdF9oc19wb2w6MTsJLypkZXN0IEhTIGludGVyZmFjZSBwb2xhcml0eSovCi0JCXUzMglzcmNfaHNfcG9sOjE7CS8qc3JjIEhTIGludGVyZmFjZSBwb2xhcml0eSovCi0JCXUzMgltYXhfYWJyc3Q6MTA7CS8qbWF4IEFNQkEgYnVyc3QgbGVuID0gMCAobm8gc3cgbGltaXQqLwotCQl1MzIJcmVsb2FkX3NyYzoxOwkvKmF1dG8gcmVsb2FkIHNyYyBhZGRyID0xIGlmIHNyYyBpcyBQKi8KLQkJdTMyCXJlbG9hZF9kc3Q6MTsJLypBUiBkZXN0biBhZGRyID0xIGlmIGRzdG4gaXMgUCovCi0JfSBjZmd4OwotCXUzMgljZmdfbG87Ci19OwotCi11bmlvbiBpbnRlbF9taWRfZG1hX2NmZ19oaSB7Ci0Jc3RydWN0IHsKLQkJdTMyCWZjbW9kZToxOwkvKmZsb3cgY29udHJvbCBtb2RlID0gMSovCi0JCXUzMglmaWZvX21vZGU6MTsJLypGSUZPIG1vZGUgc2VsZWN0ID0gMSovCi0JCXUzMglwcm90Y3RsOjM7CS8qcHJvdGVjdGlvbiBjb250cm9sID0gMCovCi0JCXUzMglyc3ZkOjI7Ci0JCXUzMglzcmNfcGVyOjQ7CS8qc3JjIGh3IEhTIGludGVyZmFjZSovCi0JCXUzMglkc3RfcGVyOjQ7CS8qZHN0biBodyBIUyBpbnRlcmZhY2UqLwotCQl1MzIJcmVzZXIyOjE3OwotCX0gY2ZneDsKLQl1MzIJY2ZnX2hpOwotfTsKLQotCi0vKioKLSAqIHN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4gLSBpbnRlcm5hbCBtaWQgcmVwcmVzZW50YXRpb24gb2YgYSBETUEgY2hhbm5lbAotICogQGNoYW46IGRtYV9jaGFuIHN0cmN0dXJlIHJlcHJlc2V0YXRpb24gZm9yIG1pZCBjaGFuCi0gKiBAY2hfcmVnczogTU1JTyByZWdpc3RlciBzcGFjZSBwb2ludGVyIHRvIGNoYW5uZWwgcmVnaXN0ZXIKLSAqIEBkbWFfYmFzZTogTU1JTyByZWdpc3RlciBzcGFjZSBETUEgZW5naW5lIGJhc2UgcG9pbnRlcgotICogQGNoX2lkOiBETUEgY2hhbm5lbCBpZAotICogQGxvY2s6IGNoYW5uZWwgc3BpbmxvY2sKLSAqIEBhY3RpdmVfbGlzdDogY3VycmVudCBhY3RpdmUgZGVzY3JpcHRvcnMKLSAqIEBxdWV1ZTogY3VycmVudCBxdWV1ZWQgdXAgZGVzY3JpcHRvcnMKLSAqIEBmcmVlX2xpc3Q6IGN1cnJlbnQgZnJlZSBkZXNjcmlwdG9ycwotICogQHNsYXZlOiBkbWEgc2xhdmUgc3RydWN0dXJlCi0gKiBAZGVzY3NfYWxsb2NhdGVkOiB0b3RhbCBudW1iZXIgb2YgZGVzY3JpcHRvcnMgYWxsb2NhdGVkCi0gKiBAZG1hOiBkbWEgZGV2aWNlIHN0cnVjdHVyZSBwb2ludGVyCi0gKiBAYnVzeTogYm9vbCByZXByZXNlbnRpbmcgaWYgY2ggaXMgYnVzeSAoYWN0aXZlIHR4bikgb3Igbm90Ci0gKiBAaW5fdXNlOiBib29sIHJlcHJlc2VudGluZyBpZiBjaCBpcyBpbiB1c2Ugb3Igbm90Ci0gKiBAcmF3X3RmcjogcmF3IHRyZiBpbnRlcnJ1cHQgcmVjZWl2ZWQKLSAqIEByYXdfYmxvY2s6IHJhdyBibG9jayBpbnRlcnJ1cHQgcmVjZWl2ZWQKLSAqLwotc3RydWN0IGludGVsX21pZF9kbWFfY2hhbiB7Ci0Jc3RydWN0IGRtYV9jaGFuCQljaGFuOwotCXZvaWQgX19pb21lbQkJKmNoX3JlZ3M7Ci0Jdm9pZCBfX2lvbWVtCQkqZG1hX2Jhc2U7Ci0JaW50CQkJY2hfaWQ7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWFjdGl2ZV9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7Ci0Jc3RydWN0IGxpc3RfaGVhZAlmcmVlX2xpc3Q7Ci0JdW5zaWduZWQgaW50CQlkZXNjc19hbGxvY2F0ZWQ7Ci0Jc3RydWN0IG1pZGRtYV9kZXZpY2UJKmRtYTsKLQlib29sCQkJYnVzeTsKLQlib29sCQkJaW5fdXNlOwotCXUzMgkJCXJhd190ZnI7Ci0JdTMyCQkJcmF3X2Jsb2NrOwotCXN0cnVjdCBpbnRlbF9taWRfZG1hX3NsYXZlICptaWRfc2xhdmU7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4gKnRvX2ludGVsX21pZF9kbWFfY2hhbigKLQkJCQkJCXN0cnVjdCBkbWFfY2hhbiAqY2hhbikKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGNoYW4sIHN0cnVjdCBpbnRlbF9taWRfZG1hX2NoYW4sIGNoYW4pOwotfQotCi1lbnVtIGludGVsX21pZF9kbWFfc3RhdGUgewotCVJVTk5JTkcgPSAwLAotCVNVU1BFTkRFRCwKLX07Ci0vKioKLSAqIHN0cnVjdCBtaWRkbWFfZGV2aWNlIC0gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSBETUEgZGV2aWNlCi0gKiBAcGRldjogUENJIGRldmljZQotICogQGRtYV9iYXNlOiBNTUlPIHJlZ2lzdGVyIHNwYWNlIHBvaW50ZXIgb2YgRE1BCi0gKiBAZG1hX3Bvb2w6IGZvciBhbGxvY2F0aW5nIERNQSBkZXNjcmlwdG9ycwotICogQGNvbW1vbjogZW1iZWRkZWQgc3RydWN0IGRtYV9kZXZpY2UKLSAqIEB0YXNrbGV0OiBkbWEgdGFza2xldCBmb3IgcHJvY2Vzc2luZyBpbnRlcnJ1cHRzCi0gKiBAY2g6IHBlciBjaGFubmVsIGRhdGEKLSAqIEBwY2lfaWQ6IERNQSBkZXZpY2UgUENJIElECi0gKiBAaW50cl9tYXNrOiBJbnRlcnJ1cHQgbWFzayB0byBiZSB1c2VkCi0gKiBAbWFza19yZWc6IE1NSU8gcmVnaXN0ZXIgZm9yIHBlcmlwaHJhbCBtYXNrCi0gKiBAY2hhbl9iYXNlOiBCYXNlIGNoIGluZGV4IChyZWFkIGZyb20gZHJpdmVyIGRhdGEpCi0gKiBAbWF4X2NoYW46IG1heCBudW1iZXIgb2YgY2hzIHN1cHBvcnRlZCAoZnJvbSBkcnZfZGF0YSkKLSAqIEBibG9ja19zaXplOiBCbG9jayBzaXplIG9mIERNQSB0cmFuc2ZlciBzdXBwb3J0ZWQgKGZyb20gZHJ2X2RhdGEpCi0gKiBAcGltcl9tYXNrOiBNTUlPIHJlZ2lzdGVyIGFkZHIgZm9yIHBlcmlwaHJhbCBpbnRlcnJ1cHQgKGZyb20gZHJ2X2RhdGEpCi0gKiBAc3RhdGU6IGRtYSBQTSBkZXZpY2Ugc3RhdGUKLSAqLwotc3RydWN0IG1pZGRtYV9kZXZpY2UgewotCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKLQl2b2lkIF9faW9tZW0JCSpkbWFfYmFzZTsKLQlzdHJ1Y3QgcGNpX3Bvb2wJCSpkbWFfcG9vbDsKLQlzdHJ1Y3QgZG1hX2RldmljZQljb21tb247Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0ICAgdGFza2xldDsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9jaGFuIGNoW01BWF9DSEFOXTsKLQl1bnNpZ25lZCBpbnQJCXBjaV9pZDsKLQl1bnNpZ25lZCBpbnQJCWludHJfbWFzazsKLQl2b2lkIF9faW9tZW0JCSptYXNrX3JlZzsKLQlpbnQJCQljaGFuX2Jhc2U7Ci0JaW50CQkJbWF4X2NoYW47Ci0JaW50CQkJYmxvY2tfc2l6ZTsKLQl1bnNpZ25lZCBpbnQJCXBpbXJfbWFzazsKLQllbnVtIGludGVsX21pZF9kbWFfc3RhdGUgc3RhdGU7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBtaWRkbWFfZGV2aWNlICp0b19taWRkbWFfZGV2aWNlKHN0cnVjdCBkbWFfZGV2aWNlICpjb21tb24pCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihjb21tb24sIHN0cnVjdCBtaWRkbWFfZGV2aWNlLCBjb21tb24pOwotfQotCi1zdHJ1Y3QgaW50ZWxfbWlkX2RtYV9kZXNjIHsKLQl2b2lkIF9faW9tZW0JCQkqYmxvY2s7IC8qY2ggcHRyKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCQlkZXNjX25vZGU7Ci0Jc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yCXR4ZDsKLQlzaXplX3QJCQkJbGVuOwotCWRtYV9hZGRyX3QJCQlzYXI7Ci0JZG1hX2FkZHJfdAkJCWRhcjsKLQl1MzIJCQkJY2ZnX2hpOwotCXUzMgkJCQljZmdfbG87Ci0JdTMyCQkJCWN0bF9sbzsKLQl1MzIJCQkJY3RsX2hpOwotCXN0cnVjdCBwY2lfcG9vbAkJCSpsbGlfcG9vbDsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9sbGkJKmxsaTsKLQlkbWFfYWRkcl90CQkJbGxpX3BoeXM7Ci0JdW5zaWduZWQgaW50CQkJbGxpX2xlbmd0aDsKLQl1bnNpZ25lZCBpbnQJCQljdXJyZW50X2xsaTsKLQlkbWFfYWRkcl90CQkJbmV4dDsKLQllbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24JCWRpcm47Ci0JZW51bSBkbWFfc3RhdHVzCQkJc3RhdHVzOwotCWVudW0gZG1hX3NsYXZlX2J1c3dpZHRoCQl3aWR0aDsgLyp3aWR0aCBvZiBETUEgdHhuKi8KLQllbnVtIGludGVsX21pZF9kbWFfbW9kZQkJY2ZnX21vZGU7IC8qbW9kZSBjb25maWd1cmF0aW9uKi8KLQotfTsKLQotc3RydWN0IGludGVsX21pZF9kbWFfbGxpIHsKLQlkbWFfYWRkcl90CQkJc2FyOwotCWRtYV9hZGRyX3QJCQlkYXI7Ci0JZG1hX2FkZHJfdAkJCWxscDsKLQl1MzIJCQkJY3RsX2xvOwotCXUzMgkJCQljdGxfaGk7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotc3RhdGljIGlubGluZSBpbnQgdGVzdF9jaF9lbih2b2lkIF9faW9tZW0gKmRtYSwgdTMyIGNoX25vKQotewotCXUzMiBlbl9yZWcgPSBpb3JlYWQzMihkbWEgKyBETUFfQ0hBTl9FTik7Ci0JcmV0dXJuIChlbl9yZWcgPj4gY2hfbm8pICYgMHgxOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBpbnRlbF9taWRfZG1hX2Rlc2MgKnRvX2ludGVsX21pZF9kbWFfZGVzYwotCQkoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0eGQpCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZih0eGQsIHN0cnVjdCBpbnRlbF9taWRfZG1hX2Rlc2MsIHR4ZCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGludGVsX21pZF9kbWFfc2xhdmUgKnRvX2ludGVsX21pZF9kbWFfc2xhdmUKLQkJKHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICpzbGF2ZSkKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKHNsYXZlLCBzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9zbGF2ZSwgZG1hX3NsYXZlKTsKLX0KLQotCi1pbnQgZG1hX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCi0jZW5kaWYgLypfX0lOVEVMX01JRF9ETUFDX1JFR1NfSF9fKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21veGFydC1kbWEuYyBiL2RyaXZlcnMvZG1hL21veGFydC1kbWEuYwppbmRleCAxNWNhYjdkLi5iNDYzNDEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9tb3hhcnQtZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvbW94YXJ0LWRtYS5jCkBAIC0xOTMsOCArMTkzLDEwIEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPnZjLmxvY2ssIGZsYWdzKTsKIAotCWlmIChjaC0+ZGVzYykKKwlpZiAoY2gtPmRlc2MpIHsKKwkJbW94YXJ0X2RtYV9kZXNjX2ZyZWUoJmNoLT5kZXNjLT52ZCk7CiAJCWNoLT5kZXNjID0gTlVMTDsKKwl9CiAKIAljdHJsID0gcmVhZGwoY2gtPmJhc2UgKyBSRUdfT0ZGX0NUUkwpOwogCWN0cmwgJj0gfihBUEJfRE1BX0VOQUJMRSB8IEFQQl9ETUFfRklOX0lOVF9FTiB8IEFQQl9ETUFfRVJSX0lOVF9FTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9vZi1kbWEuYyBiL2RyaXZlcnMvZG1hL29mLWRtYS5jCmluZGV4IGNhMzFmMWIuLmNiZDRhOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL29mLWRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL29mLWRtYS5jCkBAIC0xOTQsNiArMTk0LDcgQEAKIAogCXJldHVybiBFUlJfUFRSKHJldF9ub19jaGFubmVsKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX2RtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWwpOwogCiAvKioKICAqIG9mX2RtYV9zaW1wbGVfeGxhdGUgLSBTaW1wbGUgRE1BIGVuZ2luZSB0cmFuc2xhdGlvbiBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvb21hcC1kbWEuYyBiL2RyaXZlcnMvZG1hL29tYXAtZG1hLmMKaW5kZXggN2RkNmRkMS4uMTY3ZGJhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvb21hcC1kbWEuYworKysgYi9kcml2ZXJzL2RtYS9vbWFwLWRtYS5jCkBAIC05ODEsNiArOTgxLDcgQEAKIAkgKiBjLT5kZXNjIGlzIE5VTEwgYW5kIGV4aXQuKQogCSAqLwogCWlmIChjLT5kZXNjKSB7CisJCW9tYXBfZG1hX2Rlc2NfZnJlZSgmYy0+ZGVzYy0+dmQpOwogCQljLT5kZXNjID0gTlVMTDsKIAkJLyogQXZvaWQgc3RvcHBpbmcgdGhlIGRtYSB0d2ljZSAqLwogCQlpZiAoIWMtPnBhdXNlZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jIGIvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKaW5kZXggNjhhY2EzMy4uMTMzMmIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKKysrIGIvZHJpdmVycy9kbWEvc3RlX2RtYTQwLmMKQEAgLTM1NDgsNyArMzU0OCw3IEBACiAKIAlpZiAoIXBsYXRfZGF0YSkgewogCQlpZiAobnApIHsKLQkJCWlmKGQ0MF9vZl9wcm9iZShwZGV2LCBucCkpIHsKKwkJCWlmIChkNDBfb2ZfcHJvYmUocGRldiwgbnApKSB7CiAJCQkJcmV0ID0gLUVOT01FTTsKIAkJCQlnb3RvIGZhaWx1cmU7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuYwppbmRleCA1OTA3YzE3Li45Mjc3MmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmMKQEAgLTIwLDggKzIwLDcgQEAKICAqLwogc3RhdGljIGF0b21pY190IGRydl9pbnN0YW5jZXMgPSBBVE9NSUNfSU5JVCgwKTsKIAotLyogUGVyLW5vZGUgZHJpdmVyIGluc3RhbmNlcyAqLwotc3RhdGljIHN0cnVjdCBtZW1fY3RsX2luZm8gKiptY2lzOworLyogUGVyLW5vZGUgc3R1ZmYgKi8KIHN0YXRpYyBzdHJ1Y3QgZWNjX3NldHRpbmdzICoqZWNjX3N0bmdzOwogCiAvKgpAQCAtOTAzLDkgKzkwMiwxNyBAQAogLyogT24gRjEwaCBhbmQgbGF0ZXIgRXJyQWRkciBpcyBNQzRfQUREUls0NzoxXSAqLwogc3RhdGljIHU2NCBnZXRfZXJyb3JfYWRkcmVzcyhzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQsIHN0cnVjdCBtY2UgKm0pCiB7Ci0JdTY0IGFkZHI7CisJdTE2IG1jZV9uaWQgPSBhbWRfZ2V0X25iX2lkKG0tPmV4dGNwdSk7CisJc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpOwogCXU4IHN0YXJ0X2JpdCA9IDE7CiAJdTggZW5kX2JpdCAgID0gNDc7CisJdTY0IGFkZHI7CisKKwltY2kgPSBlZGFjX21jX2ZpbmQobWNlX25pZCk7CisJaWYgKCFtY2kpCisJCXJldHVybiAwOworCisJcHZ0ID0gbWNpLT5wdnRfaW5mbzsKIAogCWlmIChwdnQtPmZhbSA9PSAweGYpIHsKIAkJc3RhcnRfYml0ID0gMzsKQEAgLTkxOCwxNyArOTI1LDEzIEBACiAJICogRXJyYXR1bSA2Mzcgd29ya2Fyb3VuZAogCSAqLwogCWlmIChwdnQtPmZhbSA9PSAweDE1KSB7Ci0JCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dDsKIAkJdTY0IGNjNl9iYXNlLCB0bXBfYWRkcjsKIAkJdTMyIHRtcDsKLQkJdTE2IG1jZV9uaWQ7CiAJCXU4IGludGx2X2VuOwogCiAJCWlmICgoYWRkciAmIEdFTk1BU0tfVUxMKDQ3LCAyNCkpID4+IDI0ICE9IDB4MDBmZGY3KQogCQkJcmV0dXJuIGFkZHI7CiAKLQkJbWNlX25pZAk9IGFtZF9nZXRfbmJfaWQobS0+ZXh0Y3B1KTsKLQkJcHZ0CT0gbWNpc1ttY2VfbmlkXS0+cHZ0X2luZm87CiAKIAkJYW1kNjRfcmVhZF9wY2lfY2ZnKHB2dC0+RjEsIERSQU1fTE9DQUxfTk9ERV9MSU0sICZ0bXApOwogCQlpbnRsdl9lbiA9IHRtcCA+PiAyMSAmIDB4NzsKQEAgLTE1MTEsNyArMTUxNCw3IEBACiAJaW50IGNzX2ZvdW5kID0gLUVJTlZBTDsKIAlpbnQgY3Nyb3c7CiAKLQltY2kgPSBtY2lzW25pZF07CisJbWNpID0gZWRhY19tY19maW5kKG5pZCk7CiAJaWYgKCFtY2kpCiAJCXJldHVybiBjc19mb3VuZDsKIApAQCAtMjY2MywzNCArMjY2Niw2IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X21jX3N5c2ZzX2F0dHJzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKLXsKLQlzdHJ1Y3QgYW1kNjRfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOwotCWludCByYzsKLQotCXJjID0gYW1kNjRfY3JlYXRlX3N5c2ZzX2RiZ19maWxlcyhtY2kpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCWlmIChwdnQtPmZhbSA+PSAweDEwKSB7Ci0JCXJjID0gYW1kNjRfY3JlYXRlX3N5c2ZzX2luamVjdF9maWxlcyhtY2kpOwotCQlpZiAocmMgPCAwKQotCQkJcmV0dXJuIHJjOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkZWxfbWNfc3lzZnNfYXR0cnMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQotewotCXN0cnVjdCBhbWQ2NF9wdnQgKnB2dCA9IG1jaS0+cHZ0X2luZm87Ci0KLQlhbWQ2NF9yZW1vdmVfc3lzZnNfZGJnX2ZpbGVzKG1jaSk7Ci0KLQlpZiAocHZ0LT5mYW0gPj0gMHgxMCkKLQkJYW1kNjRfcmVtb3ZlX3N5c2ZzX2luamVjdF9maWxlcyhtY2kpOwotfQotCiBzdGF0aWMgdm9pZCBzZXR1cF9tY2lfbWlzY19hdHRycyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2ksCiAJCQkJIHN0cnVjdCBhbWQ2NF9mYW1pbHlfdHlwZSAqZmFtKQogewpAQCAtMjc3OCw2ICsyNzUzLDE2IEBACiAJcmV0dXJuIGZhbV90eXBlOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqYW1kNjRfZWRhY19hdHRyX2dyb3Vwc1tdID0geworI2lmZGVmIENPTkZJR19FREFDX0RFQlVHCisJJmFtZDY0X2VkYWNfZGJnX2dyb3VwLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0VEQUNfQU1ENjRfRVJST1JfSU5KRUNUSU9OCisJJmFtZDY0X2VkYWNfaW5qX2dyb3VwLAorI2VuZGlmCisJTlVMTAorfTsKKwogc3RhdGljIGludCBpbml0X29uZV9pbnN0YW5jZShzdHJ1Y3QgcGNpX2RldiAqRjIpCiB7CiAJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gTlVMTDsKQEAgLTI4NDQsMTQgKzI4MjksMTAgQEAKIAkJbWNpLT5lZGFjX2NhcCA9IEVEQUNfRkxBR19OT05FOwogCiAJcmV0ID0gLUVOT0RFVjsKLQlpZiAoZWRhY19tY19hZGRfbWMobWNpKSkgeworCWlmIChlZGFjX21jX2FkZF9tY193aXRoX2dyb3VwcyhtY2ksIGFtZDY0X2VkYWNfYXR0cl9ncm91cHMpKSB7CiAJCWVkYWNfZGJnKDEsICJmYWlsZWQgZWRhY19tY19hZGRfbWMoKVxuIik7CiAJCWdvdG8gZXJyX2FkZF9tYzsKIAl9Ci0JaWYgKHNldF9tY19zeXNmc19hdHRycyhtY2kpKSB7Ci0JCWVkYWNfZGJnKDEsICJmYWlsZWQgZWRhY19tY19hZGRfbWMoKVxuIik7Ci0JCWdvdG8gZXJyX2FkZF9zeXNmczsKLQl9CiAKIAkvKiByZWdpc3RlciBzdHVmZiB3aXRoIEVEQUMgTUNFICovCiAJaWYgKHJlcG9ydF9nYXJ0X2Vycm9ycykKQEAgLTI4NTksMTQgKzI4NDAsMTAgQEAKIAogCWFtZF9yZWdpc3Rlcl9lY2NfZGVjb2RlcihkZWNvZGVfYnVzX2Vycm9yKTsKIAotCW1jaXNbbmlkXSA9IG1jaTsKLQogCWF0b21pY19pbmMoJmRydl9pbnN0YW5jZXMpOwogCiAJcmV0dXJuIDA7CiAKLWVycl9hZGRfc3lzZnM6Ci0JZWRhY19tY19kZWxfbWMobWNpLT5wZGV2KTsKIGVycl9hZGRfbWM6CiAJZWRhY19tY19mcmVlKG1jaSk7CiAKQEAgLTI5NDAsNyArMjkxNyw2IEBACiAJbWNpID0gZmluZF9tY2lfYnlfZGV2KCZwZGV2LT5kZXYpOwogCVdBUk5fT04oIW1jaSk7CiAKLQlkZWxfbWNfc3lzZnNfYXR0cnMobWNpKTsKIAkvKiBSZW1vdmUgZnJvbSBFREFDIENPUkUgdHJhY2tpbmcgbGlzdCAqLwogCW1jaSA9IGVkYWNfbWNfZGVsX21jKCZwZGV2LT5kZXYpOwogCWlmICghbWNpKQpAQCAtMjk2MSw3ICsyOTM3LDYgQEAKIAogCS8qIEZyZWUgdGhlIEVEQUMgQ09SRSByZXNvdXJjZXMgKi8KIAltY2ktPnB2dF9pbmZvID0gTlVMTDsKLQltY2lzW25pZF0gPSBOVUxMOwogCiAJa2ZyZWUocHZ0KTsKIAllZGFjX21jX2ZyZWUobWNpKTsKQEAgLTI5OTksNyArMjk3NCw3IEBACiAJaWYgKHBjaV9jdGwpCiAJCXJldHVybjsKIAotCW1jaSA9IG1jaXNbMF07CisJbWNpID0gZWRhY19tY19maW5kKDApOwogCWlmICghbWNpKQogCQlyZXR1cm47CiAKQEAgLTMwMjMsOSArMjk5OCw4IEBACiAJCWdvdG8gZXJyX3JldDsKIAogCWVyciA9IC1FTk9NRU07Ci0JbWNpcwkgID0ga3phbGxvYyhhbWRfbmJfbnVtKCkgKiBzaXplb2YobWNpc1swXSksIEdGUF9LRVJORUwpOwogCWVjY19zdG5ncyA9IGt6YWxsb2MoYW1kX25iX251bSgpICogc2l6ZW9mKGVjY19zdG5nc1swXSksIEdGUF9LRVJORUwpOwotCWlmICghKG1jaXMgJiYgZWNjX3N0bmdzKSkKKwlpZiAoIWVjY19zdG5ncykKIAkJZ290byBlcnJfZnJlZTsKIAogCW1zcnMgPSBtc3JzX2FsbG9jKCk7CkBAIC0zMDU2LDkgKzMwMzAsNiBAQAogCW1zcnMgPSBOVUxMOwogCiBlcnJfZnJlZToKLQlrZnJlZShtY2lzKTsKLQltY2lzID0gTlVMTDsKLQogCWtmcmVlKGVjY19zdG5ncyk7CiAJZWNjX3N0bmdzID0gTlVMTDsKIApAQCAtMzA3Niw5ICszMDQ3LDYgQEAKIAlrZnJlZShlY2Nfc3RuZ3MpOwogCWVjY19zdG5ncyA9IE5VTEw7CiAKLQlrZnJlZShtY2lzKTsKLQltY2lzID0gTlVMTDsKLQogCW1zcnNfZnJlZShtc3JzKTsKIAltc3JzID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmggYi9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhYy5oCmluZGV4IGQ4NDY4YzYuLjRiZGVjNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjLmgKKysrIGIvZHJpdmVycy9lZGFjL2FtZDY0X2VkYWMuaApAQCAtNDUzLDMxICs0NTMsMTEgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfRURBQ19ERUJVRwotaW50IGFtZDY0X2NyZWF0ZV9zeXNmc19kYmdfZmlsZXMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKTsKLXZvaWQgYW1kNjRfcmVtb3ZlX3N5c2ZzX2RiZ19maWxlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpOwotCi0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgYW1kNjRfY3JlYXRlX3N5c2ZzX2RiZ19maWxlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgdm9pZCBpbmxpbmUgYW1kNjRfcmVtb3ZlX3N5c2ZzX2RiZ19maWxlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCi17Ci19CitleHRlcm4gY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhbWQ2NF9lZGFjX2RiZ19ncm91cDsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0VEQUNfQU1ENjRfRVJST1JfSU5KRUNUSU9OCi1pbnQgYW1kNjRfY3JlYXRlX3N5c2ZzX2luamVjdF9maWxlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpOwotdm9pZCBhbWQ2NF9yZW1vdmVfc3lzZnNfaW5qZWN0X2ZpbGVzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSk7Ci0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBhbWQ2NF9jcmVhdGVfc3lzZnNfaW5qZWN0X2ZpbGVzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhbWQ2NF9yZW1vdmVfc3lzZnNfaW5qZWN0X2ZpbGVzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKLXsKLX0KK2V4dGVybiBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGFtZDY0X2VkYWNfaW5qX2dyb3VwOwogI2VuZGlmCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhY19kYmcuYyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjX2RiZy5jCmluZGV4IDJjMWJiZjcuLjQ3MDljNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjX2RiZy5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjX2RiZy5jCkBAIC00MCwzNCArNDAsMTUgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUih0b3BtZW0yLCBTX0lSVUdPLCBhbWQ2NF90b3BfbWVtMl9zaG93LCBOVUxMKTsKIHN0YXRpYyBERVZJQ0VfQVRUUihkcmFtX2hvbGUsIFNfSVJVR08sIGFtZDY0X2hvbGVfc2hvdywgTlVMTCk7CiAKLWludCBhbWQ2NF9jcmVhdGVfc3lzZnNfZGJnX2ZpbGVzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKLXsKLQlpbnQgcmM7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYW1kNjRfZWRhY19kYmdfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfZGhhci5hdHRyLAorCSZkZXZfYXR0cl9kYmFtLmF0dHIsCisJJmRldl9hdHRyX3RvcG1lbS5hdHRyLAorCSZkZXZfYXR0cl90b3BtZW0yLmF0dHIsCisJJmRldl9hdHRyX2RyYW1faG9sZS5hdHRyLAorCU5VTEwKK307CiAKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9kaGFyKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfZGJhbSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX3RvcG1lbSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX3RvcG1lbTIpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9kcmFtX2hvbGUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGFtZDY0X3JlbW92ZV9zeXNmc19kYmdfZmlsZXMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQotewotCWRldmljZV9yZW1vdmVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9kaGFyKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfZGJhbSk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX3RvcG1lbSk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX3RvcG1lbTIpOwotCWRldmljZV9yZW1vdmVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9kcmFtX2hvbGUpOwotfQorY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhbWQ2NF9lZGFjX2RiZ19ncm91cCA9IHsKKwkuYXR0cnMgPSBhbWQ2NF9lZGFjX2RiZ19hdHRycywKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvYW1kNjRfZWRhY19pbmouYyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjX2luai5jCmluZGV4IDBkNjZhZTYuLmUxNDk3N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjX2luai5jCisrKyBiL2RyaXZlcnMvZWRhYy9hbWQ2NF9lZGFjX2luai5jCkBAIC0yMDcsMzUgKzIwNywyOCBAQAogc3RhdGljIERFVklDRV9BVFRSKGluamVjdF9yZWFkLCAgU19JV1VTUiwKIAkJICAgTlVMTCwgYW1kNjRfaW5qZWN0X3JlYWRfc3RvcmUpOwogCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYW1kNjRfZWRhY19pbmpfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfaW5qZWN0X3NlY3Rpb24uYXR0ciwKKwkmZGV2X2F0dHJfaW5qZWN0X3dvcmQuYXR0ciwKKwkmZGV2X2F0dHJfaW5qZWN0X2VjY192ZWN0b3IuYXR0ciwKKwkmZGV2X2F0dHJfaW5qZWN0X3dyaXRlLmF0dHIsCisJJmRldl9hdHRyX2luamVjdF9yZWFkLmF0dHIsCisJTlVMTAorfTsKIAotaW50IGFtZDY0X2NyZWF0ZV9zeXNmc19pbmplY3RfZmlsZXMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQorc3RhdGljIHVtb2RlX3QgYW1kNjRfZWRhY19pbmpfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkJIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBpZHgpCiB7Ci0JaW50IHJjOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGtvYmpfdG9fZGV2KGtvYmopOworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBtZW1fY3RsX2luZm8sIGRldik7CisJc3RydWN0IGFtZDY0X3B2dCAqcHZ0ID0gbWNpLT5wdnRfaW5mbzsKIAotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdF9zZWN0aW9uKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0X3dvcmQpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9pbmplY3RfZWNjX3ZlY3Rvcik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdF93cml0ZSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdF9yZWFkKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gMDsKKwlpZiAocHZ0LT5mYW0gPCAweDEwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYXR0ci0+bW9kZTsKIH0KIAotdm9pZCBhbWQ2NF9yZW1vdmVfc3lzZnNfaW5qZWN0X2ZpbGVzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKLXsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0X3NlY3Rpb24pOwotCWRldmljZV9yZW1vdmVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9pbmplY3Rfd29yZCk7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdF9lY2NfdmVjdG9yKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0X3dyaXRlKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0X3JlYWQpOwotfQorY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBhbWQ2NF9lZGFjX2lual9ncm91cCA9IHsKKwkuYXR0cnMgPSBhbWQ2NF9lZGFjX2lual9hdHRycywKKwkuaXNfdmlzaWJsZSA9IGFtZDY0X2VkYWNfaW5qX2lzX3Zpc2libGUsCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oIGIvZHJpdmVycy9lZGFjL2VkYWNfY29yZS5oCmluZGV4IDZjOWYzODEuLmFkNDI1ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX2NvcmUuaAorKysgYi9kcml2ZXJzL2VkYWMvZWRhY19jb3JlLmgKQEAgLTQ0Niw3ICs0NDYsOSBAQAogCQkJCSAgIHVuc2lnbmVkIG5fbGF5ZXJzLAogCQkJCSAgIHN0cnVjdCBlZGFjX21jX2xheWVyICpsYXllcnMsCiAJCQkJICAgdW5zaWduZWQgc3pfcHZ0KTsKLWV4dGVybiBpbnQgZWRhY19tY19hZGRfbWMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKTsKK2V4dGVybiBpbnQgZWRhY19tY19hZGRfbWNfd2l0aF9ncm91cHMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKipncm91cHMpOworI2RlZmluZSBlZGFjX21jX2FkZF9tYyhtY2kpCWVkYWNfbWNfYWRkX21jX3dpdGhfZ3JvdXBzKG1jaSwgTlVMTCkKIGV4dGVybiB2b2lkIGVkYWNfbWNfZnJlZShzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpOwogZXh0ZXJuIHN0cnVjdCBtZW1fY3RsX2luZm8gKmVkYWNfbWNfZmluZChpbnQgaWR4KTsKIGV4dGVybiBzdHJ1Y3QgbWVtX2N0bF9pbmZvICpmaW5kX21jaV9ieV9kZXYoc3RydWN0IGRldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMgYi9kcml2ZXJzL2VkYWMvZWRhY19tYy5jCmluZGV4IDE3NDc5MDYuLmFmM2JlMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX21jLmMKKysrIGIvZHJpdmVycy9lZGFjL2VkYWNfbWMuYwpAQCAtNzEwLDkgKzcxMCwxMCBAQAogRVhQT1JUX1NZTUJPTChlZGFjX21jX2ZpbmQpOwogCiAvKioKLSAqIGVkYWNfbWNfYWRkX21jOiBJbnNlcnQgdGhlICdtY2knIHN0cnVjdHVyZSBpbnRvIHRoZSBtY2kgZ2xvYmFsIGxpc3QgYW5kCi0gKiAgICAgICAgICAgICAgICAgY3JlYXRlIHN5c2ZzIGVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIG1jaSBzdHJ1Y3R1cmUKKyAqIGVkYWNfbWNfYWRkX21jX3dpdGhfZ3JvdXBzOiBJbnNlcnQgdGhlICdtY2knIHN0cnVjdHVyZSBpbnRvIHRoZSBtY2kKKyAqCWdsb2JhbCBsaXN0IGFuZCBjcmVhdGUgc3lzZnMgZW50cmllcyBhc3NvY2lhdGVkIHdpdGggbWNpIHN0cnVjdHVyZQogICogQG1jaTogcG9pbnRlciB0byB0aGUgbWNpIHN0cnVjdHVyZSB0byBiZSBhZGRlZCB0byB0aGUgbGlzdAorICogQGdyb3Vwczogb3B0aW9uYWwgYXR0cmlidXRlIGdyb3VwcyBmb3IgdGhlIGRyaXZlci1zcGVjaWZpYyBzeXNmcyBlbnRyaWVzCiAgKgogICogUmV0dXJuOgogICoJMAlTdWNjZXNzCkBAIC03MjAsNyArNzIxLDggQEAKICAqLwogCiAvKiBGSVhNRSAtIHNob3VsZCBhIHdhcm5pbmcgYmUgcHJpbnRlZCBpZiBubyBlcnJvciBkZXRlY3Rpb24/IGNvcnJlY3Rpb24/ICovCi1pbnQgZWRhY19tY19hZGRfbWMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQoraW50IGVkYWNfbWNfYWRkX21jX3dpdGhfZ3JvdXBzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzKQogewogCWludCByZXQgPSAtRUlOVkFMOwogCWVkYWNfZGJnKDAsICJcbiIpOwpAQCAtNzcxLDcgKzc3Myw3IEBACiAKIAltY2ktPmJ1cyA9ICZtY19idXNbbWNpLT5tY19pZHhdOwogCi0JaWYgKGVkYWNfY3JlYXRlX3N5c2ZzX21jaV9kZXZpY2UobWNpKSkgeworCWlmIChlZGFjX2NyZWF0ZV9zeXNmc19tY2lfZGV2aWNlKG1jaSwgZ3JvdXBzKSkgewogCQllZGFjX21jX3ByaW50ayhtY2ksIEtFUk5fV0FSTklORywKIAkJCSJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGRldmljZVxuIik7CiAJCWdvdG8gZmFpbDE7CkBAIC04MDUsNyArODA3LDcgQEAKIAltdXRleF91bmxvY2soJm1lbV9jdGxzX211dGV4KTsKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwoZWRhY19tY19hZGRfbWMpOworRVhQT1JUX1NZTUJPTF9HUEwoZWRhY19tY19hZGRfbWNfd2l0aF9ncm91cHMpOwogCiAvKioKICAqIGVkYWNfbWNfZGVsX21jOiBSZW1vdmUgc3lzZnMgZW50cmllcyBmb3Igc3BlY2lmaWVkIG1jaSBzdHJ1Y3R1cmUgYW5kCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19tY19zeXNmcy5jIGIvZHJpdmVycy9lZGFjL2VkYWNfbWNfc3lzZnMuYwppbmRleCBjODRlZWNiLi4xMTJkNjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19tY19zeXNmcy5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX21jX3N5c2ZzLmMKQEAgLTMyMywxMyArMzIzLDE0IEBACiAJY2hhbm5lbF9kaW1tX2xhYmVsX3Nob3csIGNoYW5uZWxfZGltbV9sYWJlbF9zdG9yZSwgNSk7CiAKIC8qIFRvdGFsIHBvc3NpYmxlIGR5bmFtaWMgRElNTSBMYWJlbCBhdHRyaWJ1dGUgZmlsZSB0YWJsZSAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkeW5hbWljX2Nzcm93X2RpbW1fYXR0cltdID0gewotCSZkZXZfYXR0cl9sZWdhY3lfY2gwX2RpbW1fbGFiZWwuYXR0ciwKLQkmZGV2X2F0dHJfbGVnYWN5X2NoMV9kaW1tX2xhYmVsLmF0dHIsCi0JJmRldl9hdHRyX2xlZ2FjeV9jaDJfZGltbV9sYWJlbC5hdHRyLAotCSZkZXZfYXR0cl9sZWdhY3lfY2gzX2RpbW1fbGFiZWwuYXR0ciwKLQkmZGV2X2F0dHJfbGVnYWN5X2NoNF9kaW1tX2xhYmVsLmF0dHIsCi0JJmRldl9hdHRyX2xlZ2FjeV9jaDVfZGltbV9sYWJlbC5hdHRyCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZHluYW1pY19jc3Jvd19kaW1tX2F0dHJbXSA9IHsKKwkmZGV2X2F0dHJfbGVnYWN5X2NoMF9kaW1tX2xhYmVsLmF0dHIuYXR0ciwKKwkmZGV2X2F0dHJfbGVnYWN5X2NoMV9kaW1tX2xhYmVsLmF0dHIuYXR0ciwKKwkmZGV2X2F0dHJfbGVnYWN5X2NoMl9kaW1tX2xhYmVsLmF0dHIuYXR0ciwKKwkmZGV2X2F0dHJfbGVnYWN5X2NoM19kaW1tX2xhYmVsLmF0dHIuYXR0ciwKKwkmZGV2X2F0dHJfbGVnYWN5X2NoNF9kaW1tX2xhYmVsLmF0dHIuYXR0ciwKKwkmZGV2X2F0dHJfbGVnYWN5X2NoNV9kaW1tX2xhYmVsLmF0dHIuYXR0ciwKKwlOVUxMCiB9OwogCiAvKiBwb3NzaWJsZSBkeW5hbWljIGNoYW5uZWwgY2VfY291bnQgYXR0cmlidXRlIGZpbGVzICovCkBAIC0zNDcsMTMgKzM0OCw0NSBAQAogCQkgICBjaGFubmVsX2NlX2NvdW50X3Nob3csIE5VTEwsIDUpOwogCiAvKiBUb3RhbCBwb3NzaWJsZSBkeW5hbWljIGNlX2NvdW50IGF0dHJpYnV0ZSBmaWxlIHRhYmxlICovCi1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmR5bmFtaWNfY3Nyb3dfY2VfY291bnRfYXR0cltdID0gewotCSZkZXZfYXR0cl9sZWdhY3lfY2gwX2NlX2NvdW50LmF0dHIsCi0JJmRldl9hdHRyX2xlZ2FjeV9jaDFfY2VfY291bnQuYXR0ciwKLQkmZGV2X2F0dHJfbGVnYWN5X2NoMl9jZV9jb3VudC5hdHRyLAotCSZkZXZfYXR0cl9sZWdhY3lfY2gzX2NlX2NvdW50LmF0dHIsCi0JJmRldl9hdHRyX2xlZ2FjeV9jaDRfY2VfY291bnQuYXR0ciwKLQkmZGV2X2F0dHJfbGVnYWN5X2NoNV9jZV9jb3VudC5hdHRyCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZHluYW1pY19jc3Jvd19jZV9jb3VudF9hdHRyW10gPSB7CisJJmRldl9hdHRyX2xlZ2FjeV9jaDBfY2VfY291bnQuYXR0ci5hdHRyLAorCSZkZXZfYXR0cl9sZWdhY3lfY2gxX2NlX2NvdW50LmF0dHIuYXR0ciwKKwkmZGV2X2F0dHJfbGVnYWN5X2NoMl9jZV9jb3VudC5hdHRyLmF0dHIsCisJJmRldl9hdHRyX2xlZ2FjeV9jaDNfY2VfY291bnQuYXR0ci5hdHRyLAorCSZkZXZfYXR0cl9sZWdhY3lfY2g0X2NlX2NvdW50LmF0dHIuYXR0ciwKKwkmZGV2X2F0dHJfbGVnYWN5X2NoNV9jZV9jb3VudC5hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIHVtb2RlX3QgY3Nyb3dfZGV2X2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBpZHgpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0ga29ial90b19kZXYoa29iaik7CisJc3RydWN0IGNzcm93X2luZm8gKmNzcm93ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNzcm93X2luZm8sIGRldik7CisKKwlpZiAoaWR4ID49IGNzcm93LT5ucl9jaGFubmVscykKKwkJcmV0dXJuIDA7CisJLyogT25seSBleHBvc2UgcG9wdWxhdGVkIERJTU1zICovCisJaWYgKCFjc3Jvdy0+Y2hhbm5lbHNbaWR4XS0+ZGltbS0+bnJfcGFnZXMpCisJCXJldHVybiAwOworCXJldHVybiBhdHRyLT5tb2RlOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGNzcm93X2Rldl9kaW1tX2dyb3VwID0geworCS5hdHRycyA9IGR5bmFtaWNfY3Nyb3dfZGltbV9hdHRyLAorCS5pc192aXNpYmxlID0gY3Nyb3dfZGV2X2lzX3Zpc2libGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjc3Jvd19kZXZfY2VfY291bnRfZ3JvdXAgPSB7CisJLmF0dHJzID0gZHluYW1pY19jc3Jvd19jZV9jb3VudF9hdHRyLAorCS5pc192aXNpYmxlID0gY3Nyb3dfZGV2X2lzX3Zpc2libGUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqY3Nyb3dfZGV2X2dyb3Vwc1tdID0geworCSZjc3Jvd19kZXZfZGltbV9ncm91cCwKKwkmY3Nyb3dfZGV2X2NlX2NvdW50X2dyb3VwLAorCU5VTEwKIH07CiAKIHN0YXRpYyBpbmxpbmUgaW50IG5yX3BhZ2VzX3Blcl9jc3JvdyhzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3cpCkBAIC0zNzAsMTMgKzQwMywxMiBAQAogc3RhdGljIGludCBlZGFjX2NyZWF0ZV9jc3Jvd19vYmplY3Qoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAogCQkJCSAgICBzdHJ1Y3QgY3Nyb3dfaW5mbyAqY3Nyb3csIGludCBpbmRleCkKIHsKLQlpbnQgZXJyLCBjaGFuOwotCiAJaWYgKGNzcm93LT5ucl9jaGFubmVscyA+IEVEQUNfTlJfQ0hBTk5FTFMpCiAJCXJldHVybiAtRU5PREVWOwogCiAJY3Nyb3ctPmRldi50eXBlID0gJmNzcm93X2F0dHJfdHlwZTsKIAljc3Jvdy0+ZGV2LmJ1cyA9IG1jaS0+YnVzOworCWNzcm93LT5kZXYuZ3JvdXBzID0gY3Nyb3dfZGV2X2dyb3VwczsKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmY3Nyb3ctPmRldik7CiAJY3Nyb3ctPmRldi5wYXJlbnQgPSAmbWNpLT5kZXY7CiAJY3Nyb3ctPm1jaSA9IG1jaTsKQEAgLTM4Niw0NSArNDE4LDEzIEBACiAJZWRhY19kYmcoMCwgImNyZWF0aW5nICh2aXJ0dWFsKSBjc3JvdyBub2RlICVzXG4iLAogCQkgZGV2X25hbWUoJmNzcm93LT5kZXYpKTsKIAotCWVyciA9IGRldmljZV9hZGQoJmNzcm93LT5kZXYpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JZm9yIChjaGFuID0gMDsgY2hhbiA8IGNzcm93LT5ucl9jaGFubmVsczsgY2hhbisrKSB7Ci0JCS8qIE9ubHkgZXhwb3NlIHBvcHVsYXRlZCBESU1NcyAqLwotCQlpZiAoIWNzcm93LT5jaGFubmVsc1tjaGFuXS0+ZGltbS0+bnJfcGFnZXMpCi0JCQljb250aW51ZTsKLQkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZjc3Jvdy0+ZGV2LAotCQkJCQkgZHluYW1pY19jc3Jvd19kaW1tX2F0dHJbY2hhbl0pOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXJyb3I7Ci0JCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmY3Nyb3ctPmRldiwKLQkJCQkJIGR5bmFtaWNfY3Nyb3dfY2VfY291bnRfYXR0cltjaGFuXSk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNzcm93LT5kZXYsCi0JCQkJCSAgIGR5bmFtaWNfY3Nyb3dfZGltbV9hdHRyW2NoYW5dKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0JZm9yICgtLWNoYW47IGNoYW4gPj0gMDsgY2hhbi0tKSB7Ci0JCWRldmljZV9yZW1vdmVfZmlsZSgmY3Nyb3ctPmRldiwKLQkJCQkJZHluYW1pY19jc3Jvd19kaW1tX2F0dHJbY2hhbl0pOwotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNzcm93LT5kZXYsCi0JCQkJCSAgIGR5bmFtaWNfY3Nyb3dfY2VfY291bnRfYXR0cltjaGFuXSk7Ci0JfQotCXB1dF9kZXZpY2UoJmNzcm93LT5kZXYpOwotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gZGV2aWNlX2FkZCgmY3Nyb3ctPmRldik7CiB9CiAKIC8qIENyZWF0ZSBhIENTUk9XIG9iamVjdCB1bmRlciBzcGVjaWZlZCBlZGFjX21jX2RldmljZSAqLwogc3RhdGljIGludCBlZGFjX2NyZWF0ZV9jc3Jvd19vYmplY3RzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKIHsKLQlpbnQgZXJyLCBpLCBjaGFuOworCWludCBlcnIsIGk7CiAJc3RydWN0IGNzcm93X2luZm8gKmNzcm93OwogCiAJZm9yIChpID0gMDsgaSA8IG1jaS0+bnJfY3Nyb3dzOyBpKyspIHsKQEAgLTQ0NiwxNCArNDQ2LDYgQEAKIAkJY3Nyb3cgPSBtY2ktPmNzcm93c1tpXTsKIAkJaWYgKCFucl9wYWdlc19wZXJfY3Nyb3coY3Nyb3cpKQogCQkJY29udGludWU7Ci0JCWZvciAoY2hhbiA9IGNzcm93LT5ucl9jaGFubmVscyAtIDE7IGNoYW4gPj0gMDsgY2hhbi0tKSB7Ci0JCQlpZiAoIWNzcm93LT5jaGFubmVsc1tjaGFuXS0+ZGltbS0+bnJfcGFnZXMpCi0JCQkJY29udGludWU7Ci0JCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNzcm93LT5kZXYsCi0JCQkJCQlkeW5hbWljX2Nzcm93X2RpbW1fYXR0cltjaGFuXSk7Ci0JCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmNzcm93LT5kZXYsCi0JCQkJCQlkeW5hbWljX2Nzcm93X2NlX2NvdW50X2F0dHJbY2hhbl0pOwotCQl9CiAJCXB1dF9kZXZpY2UoJm1jaS0+Y3Nyb3dzW2ldLT5kZXYpOwogCX0KIApAQCAtNDYyLDIzICs0NTQsMTMgQEAKIAogc3RhdGljIHZvaWQgZWRhY19kZWxldGVfY3Nyb3dfb2JqZWN0cyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCiB7Ci0JaW50IGksIGNoYW47CisJaW50IGk7CiAJc3RydWN0IGNzcm93X2luZm8gKmNzcm93OwogCiAJZm9yIChpID0gbWNpLT5ucl9jc3Jvd3MgLSAxOyBpID49IDA7IGktLSkgewogCQljc3JvdyA9IG1jaS0+Y3Nyb3dzW2ldOwogCQlpZiAoIW5yX3BhZ2VzX3Blcl9jc3Jvdyhjc3JvdykpCiAJCQljb250aW51ZTsKLQkJZm9yIChjaGFuID0gY3Nyb3ctPm5yX2NoYW5uZWxzIC0gMTsgY2hhbiA+PSAwOyBjaGFuLS0pIHsKLQkJCWlmICghY3Nyb3ctPmNoYW5uZWxzW2NoYW5dLT5kaW1tLT5ucl9wYWdlcykKLQkJCQljb250aW51ZTsKLQkJCWVkYWNfZGJnKDEsICJSZW1vdmluZyBjc3JvdyAlZCBjaGFubmVsICVkIHN5c2ZzIG5vZGVzXG4iLAotCQkJCSBpLCBjaGFuKTsKLQkJCWRldmljZV9yZW1vdmVfZmlsZSgmY3Nyb3ctPmRldiwKLQkJCQkJCWR5bmFtaWNfY3Nyb3dfZGltbV9hdHRyW2NoYW5dKTsKLQkJCWRldmljZV9yZW1vdmVfZmlsZSgmY3Nyb3ctPmRldiwKLQkJCQkJCWR5bmFtaWNfY3Nyb3dfY2VfY291bnRfYXR0cltjaGFuXSk7Ci0JCX0KIAkJZGV2aWNlX3VucmVnaXN0ZXIoJm1jaS0+Y3Nyb3dzW2ldLT5kZXYpOwogCX0KIH0KQEAgLTg2Myw3ICs4NDUsOCBAQAogc3RhdGljIERFVklDRV9BVFRSKG1heF9sb2NhdGlvbiwgU19JUlVHTywgbWNpX21heF9sb2NhdGlvbl9zaG93LCBOVUxMKTsKIAogLyogbWVtb3J5IHNjcnViYmVyIGF0dHJpYnV0ZSBmaWxlICovCi1zdGF0aWMgREVWSUNFX0FUVFIoc2RyYW1fc2NydWJfcmF0ZSwgMCwgTlVMTCwgTlVMTCk7CitERVZJQ0VfQVRUUihzZHJhbV9zY3J1Yl9yYXRlLCAwLCBtY2lfc2RyYW1fc2NydWJfcmF0ZV9zaG93LAorCSAgICBtY2lfc2RyYW1fc2NydWJfcmF0ZV9zdG9yZSk7IC8qIHVtb2RlIHNldCBsYXRlciBpbiBpc192aXNpYmxlICovCiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptY2lfYXR0cnNbXSA9IHsKIAkmZGV2X2F0dHJfcmVzZXRfY291bnRlcnMuYXR0ciwKQEAgLTg3NSwxMSArODU4LDI5IEBACiAJJmRldl9hdHRyX3VlX2NvdW50LmF0dHIsCiAJJmRldl9hdHRyX2NlX2NvdW50LmF0dHIsCiAJJmRldl9hdHRyX21heF9sb2NhdGlvbi5hdHRyLAorCSZkZXZfYXR0cl9zZHJhbV9zY3J1Yl9yYXRlLmF0dHIsCiAJTlVMTAogfTsKIAorc3RhdGljIHVtb2RlX3QgbWNpX2F0dHJfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgaWR4KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGtvYmpfdG9fZGV2KGtvYmopOworCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHRvX21jaShkZXYpOworCXVtb2RlX3QgbW9kZSA9IDA7CisKKwlpZiAoYXR0ciAhPSAmZGV2X2F0dHJfc2RyYW1fc2NydWJfcmF0ZS5hdHRyKQorCQlyZXR1cm4gYXR0ci0+bW9kZTsKKwlpZiAobWNpLT5nZXRfc2RyYW1fc2NydWJfcmF0ZSkKKwkJbW9kZSB8PSBTX0lSVUdPOworCWlmIChtY2ktPnNldF9zZHJhbV9zY3J1Yl9yYXRlKQorCQltb2RlIHw9IFNfSVdVU1I7CisJcmV0dXJuIG1vZGU7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1jaV9hdHRyX2dycCA9IHsKIAkuYXR0cnMJPSBtY2lfYXR0cnMsCisJLmlzX3Zpc2libGUgPSBtY2lfYXR0cl9pc192aXNpYmxlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKm1jaV9hdHRyX2dyb3Vwc1tdID0gewpAQCAtOTEzLDcgKzkxNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgX19leGl0IGVkYWNfZGVidWdmc19leGl0KHZvaWQpCit2b2lkIGVkYWNfZGVidWdmc19leGl0KHZvaWQpCiB7CiAJZGVidWdmc19yZW1vdmUoZWRhY19kZWJ1Z2ZzKTsKIH0KQEAgLTk3Myw3ICs5NzQsOCBAQAogICoJMAlTdWNjZXNzCiAgKgkhMAlGYWlsdXJlCiAgKi8KLWludCBlZGFjX2NyZWF0ZV9zeXNmc19tY2lfZGV2aWNlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKK2ludCBlZGFjX2NyZWF0ZV9zeXNmc19tY2lfZGV2aWNlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSwKKwkJCQkgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3VwcykKIHsKIAlpbnQgaSwgZXJyOwogCkBAIC05OTcsNiArOTk5LDcgQEAKIAogCW1jaS0+ZGV2LnBhcmVudCA9IG1jaV9wZGV2OwogCW1jaS0+ZGV2LmJ1cyA9IG1jaS0+YnVzOworCW1jaS0+ZGV2Lmdyb3VwcyA9IGdyb3VwczsKIAlkZXZfc2V0X25hbWUoJm1jaS0+ZGV2LCAibWMlZCIsIG1jaS0+bWNfaWR4KTsKIAlkZXZfc2V0X2RydmRhdGEoJm1jaS0+ZGV2LCBtY2kpOwogCXBtX3J1bnRpbWVfZm9yYmlkKCZtY2ktPmRldik7CkBAIC0xMDA4LDIzICsxMDExLDYgQEAKIAkJZ290byBmYWlsX3VucmVnaXN0ZXJfYnVzOwogCX0KIAotCWlmIChtY2ktPnNldF9zZHJhbV9zY3J1Yl9yYXRlIHx8IG1jaS0+Z2V0X3NkcmFtX3NjcnViX3JhdGUpIHsKLQkJaWYgKG1jaS0+Z2V0X3NkcmFtX3NjcnViX3JhdGUpIHsKLQkJCWRldl9hdHRyX3NkcmFtX3NjcnViX3JhdGUuYXR0ci5tb2RlIHw9IFNfSVJVR087Ci0JCQlkZXZfYXR0cl9zZHJhbV9zY3J1Yl9yYXRlLnNob3cgPSAmbWNpX3NkcmFtX3NjcnViX3JhdGVfc2hvdzsKLQkJfQotCi0JCWlmIChtY2ktPnNldF9zZHJhbV9zY3J1Yl9yYXRlKSB7Ci0JCQlkZXZfYXR0cl9zZHJhbV9zY3J1Yl9yYXRlLmF0dHIubW9kZSB8PSBTX0lXVVNSOwotCQkJZGV2X2F0dHJfc2RyYW1fc2NydWJfcmF0ZS5zdG9yZSA9ICZtY2lfc2RyYW1fc2NydWJfcmF0ZV9zdG9yZTsKLQkJfQotCi0JCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9zZHJhbV9zY3J1Yl9yYXRlKTsKLQkJaWYgKGVycikgewotCQkJZWRhY19kYmcoMSwgImZhaWx1cmU6IGNyZWF0ZSBzZHJhbV9zY3J1Yl9yYXRlXG4iKTsKLQkJCWdvdG8gZmFpbF91bnJlZ2lzdGVyX2RldjsKLQkJfQotCX0KIAkvKgogCSAqIENyZWF0ZSB0aGUgZGltbS9yYW5rIGRldmljZXMKIAkgKi8KQEAgLTEwNzEsNyArMTA1Nyw2IEBACiAKIAkJZGV2aWNlX3VucmVnaXN0ZXIoJmRpbW0tPmRldik7CiAJfQotZmFpbF91bnJlZ2lzdGVyX2RldjoKIAlkZXZpY2VfdW5yZWdpc3RlcigmbWNpLT5kZXYpOwogZmFpbF91bnJlZ2lzdGVyX2J1czoKIAlidXNfdW5yZWdpc3RlcihtY2ktPmJ1cyk7CkBAIC0xMTcwLDcgKzExNTUsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXZvaWQgX19leGl0IGVkYWNfbWNfc3lzZnNfZXhpdCh2b2lkKQordm9pZCBlZGFjX21jX3N5c2ZzX2V4aXQodm9pZCkKIHsKIAlkZXZpY2VfdW5yZWdpc3RlcihtY2lfcGRldik7CiAJZWRhY19wdXRfc3lzZnNfc3Vic3lzKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvZWRhY19tb2R1bGUuYyBiL2RyaXZlcnMvZWRhYy9lZGFjX21vZHVsZS5jCmluZGV4IGU2ZDE2OTEuLjljYjA4MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9lZGFjX21vZHVsZS5jCisrKyBiL2RyaXZlcnMvZWRhYy9lZGFjX21vZHVsZS5jCkBAIC0xMTIsMjAgKzExMiwyMyBAQAogCiAJZXJyID0gZWRhY19tY19zeXNmc19pbml0KCk7CiAJaWYgKGVycikKLQkJZ290byBlcnJvcjsKKwkJZ290byBlcnJfc3lzZnM7CiAKIAllZGFjX2RlYnVnZnNfaW5pdCgpOwogCi0JLyogU2V0dXAvSW5pdGlhbGl6ZSB0aGUgd29ya3EgZm9yIHRoaXMgY29yZSAqLwogCWVyciA9IGVkYWNfd29ya3F1ZXVlX3NldHVwKCk7CiAJaWYgKGVycikgewotCQllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19NQywgImluaXQgV29ya1F1ZXVlIGZhaWx1cmVcbiIpOwotCQlnb3RvIGVycm9yOworCQllZGFjX3ByaW50ayhLRVJOX0VSUiwgRURBQ19NQywgIkZhaWx1cmUgaW5pdGlhbGl6aW5nIHdvcmtxdWV1ZVxuIik7CisJCWdvdG8gZXJyX3dxOwogCX0KIAogCXJldHVybiAwOwogCi1lcnJvcjoKK2Vycl93cToKKwllZGFjX2RlYnVnZnNfZXhpdCgpOworCWVkYWNfbWNfc3lzZnNfZXhpdCgpOworCitlcnJfc3lzZnM6CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2VkYWNfbW9kdWxlLmggYi9kcml2ZXJzL2VkYWMvZWRhY19tb2R1bGUuaAppbmRleCBmMjExOGJmLi4yNmVjYzUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvZWRhY19tb2R1bGUuaAorKysgYi9kcml2ZXJzL2VkYWMvZWRhY19tb2R1bGUuaApAQCAtMjIsNyArMjIsOCBAQAogCS8qIG9uIGVkYWNfbWNfc3lzZnMuYyAqLwogaW50IGVkYWNfbWNfc3lzZnNfaW5pdCh2b2lkKTsKIHZvaWQgZWRhY19tY19zeXNmc19leGl0KHZvaWQpOwotZXh0ZXJuIGludCBlZGFjX2NyZWF0ZV9zeXNmc19tY2lfZGV2aWNlKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSk7CitleHRlcm4gaW50IGVkYWNfY3JlYXRlX3N5c2ZzX21jaV9kZXZpY2Uoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpLAorCQkJCQljb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICoqZ3JvdXBzKTsKIGV4dGVybiB2b2lkIGVkYWNfcmVtb3ZlX3N5c2ZzX21jaV9kZXZpY2Uoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKTsKIHZvaWQgZWRhY191bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSk7CiBleHRlcm4gaW50IGVkYWNfZ2V0X2xvZ191ZSh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9oaWdoYmFua19tY19lZGFjLmMgYi9kcml2ZXJzL2VkYWMvaGlnaGJhbmtfbWNfZWRhYy5jCmluZGV4IGY3ODRkZTEuLjExMjYwY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9oaWdoYmFua19tY19lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2hpZ2hiYW5rX21jX2VkYWMuYwpAQCAtMTI0LDYgKzEyNCwxMyBAQAogCiBzdGF0aWMgREVWSUNFX0FUVFIoaW5qZWN0X2N0cmwsIFNfSVdVU1IsIE5VTEwsIGhpZ2hiYW5rX21jX2luamVjdF9jdHJsKTsKIAorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmhpZ2hiYW5rX2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9pbmplY3RfY3RybC5hdHRyLAorCU5VTEwKK307CisKK0FUVFJJQlVURV9HUk9VUFMoaGlnaGJhbmtfZGV2KTsKKwogc3RydWN0IGhiX21jX3NldHRpbmdzIHsKIAlpbnQJZXJyX29mZnNldDsKIAlpbnQJaW50X29mZnNldDsKQEAgLTEzOSw3ICsxNDYsNyBAQAogCS5pbnRfb2Zmc2V0ID0gTVdfRERSX0VDQ19JTlRfQkFTRSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGhiX2Rkcl9jdHJsX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBoYl9kZHJfY3RybF9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiY2FseGVkYSxoYi1kZHItY3RybCIsCQkuZGF0YSA9ICZoYl9zZXR0aW5ncyB9LAogCXsgLmNvbXBhdGlibGUgPSAiY2FseGVkYSxlY3gtMjAwMC1kZHItY3RybCIsCS5kYXRhID0gJm13X3NldHRpbmdzIH0sCiAJe30sCkBAIC0yMzEsNyArMjM4LDcgQEAKIAlkaW1tLT5tdHlwZSA9IE1FTV9ERFIzOwogCWRpbW0tPmVkYWNfbW9kZSA9IEVEQUNfU0VDREVEOwogCi0JcmVzID0gZWRhY19tY19hZGRfbWMobWNpKTsKKwlyZXMgPSBlZGFjX21jX2FkZF9tY193aXRoX2dyb3VwcyhtY2ksIGhpZ2hiYW5rX2Rldl9ncm91cHMpOwogCWlmIChyZXMgPCAwKQogCQlnb3RvIGVycjsKIApAQCAtMjQzLDggKzI1MCw2IEBACiAJCWdvdG8gZXJyMjsKIAl9CiAKLQlkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0X2N0cmwpOwotCiAJZGV2cmVzX2Nsb3NlX2dyb3VwKCZwZGV2LT5kZXYsIE5VTEwpOwogCXJldHVybiAwOwogZXJyMjoKQEAgLTI1OSw3ICsyNjQsNiBAQAogewogCXN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JZGV2aWNlX3JlbW92ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdF9jdHJsKTsKIAllZGFjX21jX2RlbF9tYygmcGRldi0+ZGV2KTsKIAllZGFjX21jX2ZyZWUobWNpKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k3Y29yZV9lZGFjLmMKaW5kZXggOWNkMGIzMC4uMDEwODdhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2k3Y29yZV9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2k3Y29yZV9lZGFjLmMKQEAgLTExNTcsMjcgKzExNTcsMjQgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihpbmplY3RfZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJICAgaTdjb3JlX2luamVjdF9lbmFibGVfc2hvdywgaTdjb3JlX2luamVjdF9lbmFibGVfc3RvcmUpOwogCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaTdjb3JlX2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9pbmplY3Rfc2VjdGlvbi5hdHRyLAorCSZkZXZfYXR0cl9pbmplY3RfdHlwZS5hdHRyLAorCSZkZXZfYXR0cl9pbmplY3RfZWNjbWFzay5hdHRyLAorCSZkZXZfYXR0cl9pbmplY3RfZW5hYmxlLmF0dHIsCisJTlVMTAorfTsKKworQVRUUklCVVRFX0dST1VQUyhpN2NvcmVfZGV2KTsKKwogc3RhdGljIGludCBpN2NvcmVfY3JlYXRlX3N5c2ZzX2RldmljZXMoc3RydWN0IG1lbV9jdGxfaW5mbyAqbWNpKQogewogCXN0cnVjdCBpN2NvcmVfcHZ0ICpwdnQgPSBtY2ktPnB2dF9pbmZvOwogCWludCByYzsKIAotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdF9zZWN0aW9uKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0X3R5cGUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9pbmplY3RfZWNjbWFzayk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdF9lbmFibGUpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQogCXB2dC0+YWRkcm1hdGNoX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCpwdnQtPmFkZHJtYXRjaF9kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXB2dC0+YWRkcm1hdGNoX2RldikKLQkJcmV0dXJuIHJjOworCQlyZXR1cm4gLUVOT01FTTsKIAogCXB2dC0+YWRkcm1hdGNoX2Rldi0+dHlwZSA9ICZhZGRybWF0Y2hfdHlwZTsKIAlwdnQtPmFkZHJtYXRjaF9kZXYtPmJ1cyA9IG1jaS0+ZGV2LmJ1czsKQEAgLTExOTgsNyArMTE5NSw3IEBACiAJCWlmICghcHZ0LT5jaGFuY291bnRzX2RldikgewogCQkJcHV0X2RldmljZShwdnQtPmFkZHJtYXRjaF9kZXYpOwogCQkJZGV2aWNlX2RlbChwdnQtPmFkZHJtYXRjaF9kZXYpOwotCQkJcmV0dXJuIHJjOworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAogCQlwdnQtPmNoYW5jb3VudHNfZGV2LT50eXBlID0gJmFsbF9jaGFubmVsX2NvdW50c190eXBlOwpAQCAtMTIyMywxMSArMTIyMCw2IEBACiAKIAllZGFjX2RiZygxLCAiXG4iKTsKIAotCWRldmljZV9yZW1vdmVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9pbmplY3Rfc2VjdGlvbik7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdF90eXBlKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0X2VjY21hc2spOwotCWRldmljZV9yZW1vdmVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9pbmplY3RfZW5hYmxlKTsKLQogCWlmICghcHZ0LT5pc19yZWdpc3RlcmVkKSB7CiAJCXB1dF9kZXZpY2UocHZ0LT5jaGFuY291bnRzX2Rldik7CiAJCWRldmljZV9kZWwocHZ0LT5jaGFuY291bnRzX2Rldik7CkBAIC0yMjU5LDcgKzIyNTEsNyBAQAogCQllbmFibGVfc2RyYW1fc2NydWJfc2V0dGluZyhtY2kpOwogCiAJLyogYWRkIHRoaXMgbmV3IE1DIGNvbnRyb2wgc3RydWN0dXJlIHRvIEVEQUMncyBsaXN0IG9mIE1DcyAqLwotCWlmICh1bmxpa2VseShlZGFjX21jX2FkZF9tYyhtY2kpKSkgeworCWlmICh1bmxpa2VseShlZGFjX21jX2FkZF9tY193aXRoX2dyb3VwcyhtY2ksIGk3Y29yZV9kZXZfZ3JvdXBzKSkpIHsKIAkJZWRhY19kYmcoMCwgIk1DOiBmYWlsZWQgZWRhY19tY19hZGRfbWMoKVxuIik7CiAJCS8qIEZJWE1FOiBwZXJoYXBzIHNvbWUgY29kZSBzaG91bGQgZ28gaGVyZSB0aGF0IGRpc2FibGVzIGVycm9yCiAJCSAqIHJlcG9ydGluZyBpZiB3ZSBqdXN0IGVuYWJsZWQgaXQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pODI0NDNieGd4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pODI0NDNieGd4X2VkYWMuYwppbmRleCBiNDcwNWQ5Li40ZDQxMTAzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2k4MjQ0M2J4Z3hfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pODI0NDNieGd4X2VkYWMuYwpAQCAtMzUwLDggKzM1MCw2IEBACiAJcmV0dXJuIC1FTk9ERVY7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGk4MjQ0M2J4Z3hfZWRhY21jX3Byb2JlMSk7Ci0KIC8qIHJldHVybnMgY291bnQgKD49IDApLCBvciBuZWdhdGl2ZSBvbiBlcnJvciAqLwogc3RhdGljIGludCBpODI0NDNieGd4X2VkYWNtY19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQpAQCAtMzg0LDggKzM4Miw2IEBACiAJZWRhY19tY19mcmVlKG1jaSk7CiB9CiAKLUVYUE9SVF9TWU1CT0xfR1BMKGk4MjQ0M2J4Z3hfZWRhY21jX3JlbW92ZV9vbmUpOwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaTgyNDQzYnhneF9wY2lfdGJsW10gPSB7CiAJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjQ0M0JYXzApfSwKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyNDQzQlhfMil9LApAQCAtNDQ1LDkgKzQ0MSw3IEBACiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpODI0NDNieGd4X2VkYWNtY19kcml2ZXIpOwogCiBmYWlsMDoKLQlpZiAobWNpX3BkZXYgIT0gTlVMTCkKLQkJcGNpX2Rldl9wdXQobWNpX3BkZXYpOwotCisJcGNpX2Rldl9wdXQobWNpX3BkZXYpOwogCXJldHVybiBwY2lfcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pODI4NjBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k4Mjg2MF9lZGFjLmMKaW5kZXggNDM4MjM0My4uZWUxMDc4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL2k4Mjg2MF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2k4Mjg2MF9lZGFjLmMKQEAgLTM0MywyMCArMzQzLDE1IEBACiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpODI4NjBfZHJpdmVyKTsKIAogZmFpbDA6Ci0JaWYgKG1jaV9wZGV2ICE9IE5VTEwpCi0JCXBjaV9kZXZfcHV0KG1jaV9wZGV2KTsKLQorCXBjaV9kZXZfcHV0KG1jaV9wZGV2KTsKIAlyZXR1cm4gcGNpX3JjOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaTgyODYwX2V4aXQodm9pZCkKIHsKIAllZGFjX2RiZygzLCAiXG4iKTsKLQogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaTgyODYwX2RyaXZlcik7Ci0KLQlpZiAobWNpX3BkZXYgIT0gTlVMTCkKLQkJcGNpX2Rldl9wdXQobWNpX3BkZXYpOworCXBjaV9kZXZfcHV0KG1jaV9wZGV2KTsKIH0KIAogbW9kdWxlX2luaXQoaTgyODYwX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jIGIvZHJpdmVycy9lZGFjL2k4Mjg3NXBfZWRhYy5jCmluZGV4IDY0YjY4MzIuLmMyNmE1MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pODI4NzVwX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvaTgyODc1cF9lZGFjLmMKQEAgLTU3Niw5ICs1NzYsNyBAQAogCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmaTgyODc1cF9kcml2ZXIpOwogCiBmYWlsMDoKLQlpZiAobWNpX3BkZXYgIT0gTlVMTCkKLQkJcGNpX2Rldl9wdXQobWNpX3BkZXYpOwotCisJcGNpX2Rldl9wdXQobWNpX3BkZXYpOwogCXJldHVybiBwY2lfcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9pODI5NzV4X2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pODI5NzV4X2VkYWMuYwppbmRleCAxMGIxMDUyLi4zNWFiNjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2VkYWMvaTgyOTc1eF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL2k4Mjk3NXhfZWRhYy5jCkBAIC02ODUsOSArNjg1LDcgQEAKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmk4Mjk3NXhfZHJpdmVyKTsKIAogZmFpbDA6Ci0JaWYgKG1jaV9wZGV2ICE9IE5VTEwpCi0JCXBjaV9kZXZfcHV0KG1jaV9wZGV2KTsKLQorCXBjaV9kZXZfcHV0KG1jaV9wZGV2KTsKIAlyZXR1cm4gcGNpX3JjOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvbXBjODV4eF9lZGFjLmMKaW5kZXggMWZhNzZhNS4uNjhiZjIzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL21wYzg1eHhfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9tcGM4NXh4X2VkYWMuYwpAQCAtMTM0LDI5ICsxMzQsMTQgQEAKIERFVklDRV9BVFRSKGluamVjdF9jdHJsLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkgICAgbXBjODV4eF9tY19pbmplY3RfY3RybF9zaG93LCBtcGM4NXh4X21jX2luamVjdF9jdHJsX3N0b3JlKTsKIAotc3RhdGljIGludCBtcGM4NXh4X2NyZWF0ZV9zeXNmc19hdHRyaWJ1dGVzKHN0cnVjdCBtZW1fY3RsX2luZm8gKm1jaSkKLXsKLQlpbnQgcmM7CitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbXBjODV4eF9kZXZfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfaW5qZWN0X2RhdGFfaGkuYXR0ciwKKwkmZGV2X2F0dHJfaW5qZWN0X2RhdGFfbG8uYXR0ciwKKwkmZGV2X2F0dHJfaW5qZWN0X2N0cmwuYXR0ciwKKwlOVUxMCit9OwogCi0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0X2RhdGFfaGkpOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9pbmplY3RfZGF0YV9sbyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdF9jdHJsKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXBjODV4eF9yZW1vdmVfc3lzZnNfYXR0cmlidXRlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCi17Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2luamVjdF9kYXRhX2hpKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0X2RhdGFfbG8pOwotCWRldmljZV9yZW1vdmVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9pbmplY3RfY3RybCk7Ci19CitBVFRSSUJVVEVfR1JPVVBTKG1wYzg1eHhfZGV2KTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiogUENJIEVyciBkZXZpY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogI2lmZGVmIENPTkZJR19QQ0kKQEAgLTY4NSw3ICs2NzAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4NXh4X2wyX2Vycl9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjODV4eF9sMl9lcnJfb2ZfbWF0Y2hbXSA9IHsKIC8qIGRlcHJlY2F0ZSB0aGUgZnNsLDg1Li4gZm9ybXMgaW4gdGhlIGZ1dHVyZSwgMi42LjMwPyAqLwogCXsgLmNvbXBhdGlibGUgPSAiZnNsLDg1NDAtbDItY2FjaGUtY29udHJvbGxlciIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0MS1sMi1jYWNoZS1jb250cm9sbGVyIiwgfSwKQEAgLTExMDYsMTMgKzEwOTEsNyBAQAogCS8qIGNsZWFyIGFsbCBlcnJvciBiaXRzICovCiAJb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfREVURUNULCB+MCk7CiAKLQlpZiAoZWRhY19tY19hZGRfbWMobWNpKSkgewotCQllZGFjX2RiZygzLCAiZmFpbGVkIGVkYWNfbWNfYWRkX21jKClcbiIpOwotCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAobXBjODV4eF9jcmVhdGVfc3lzZnNfYXR0cmlidXRlcyhtY2kpKSB7Ci0JCWVkYWNfbWNfZGVsX21jKG1jaS0+cGRldik7CisJaWYgKGVkYWNfbWNfYWRkX21jX3dpdGhfZ3JvdXBzKG1jaSwgbXBjODV4eF9kZXZfZ3JvdXBzKSkgewogCQllZGFjX2RiZygzLCAiZmFpbGVkIGVkYWNfbWNfYWRkX21jKClcbiIpOwogCQlnb3RvIGVycjsKIAl9CkBAIC0xMTc2LDEzICsxMTU1LDEyIEBACiAJCSBvcmlnX2Rkcl9lcnJfZGlzYWJsZSk7CiAJb3V0X2JlMzIocGRhdGEtPm1jX3ZiYXNlICsgTVBDODVYWF9NQ19FUlJfU0JFLCBvcmlnX2Rkcl9lcnJfc2JlKTsKIAotCW1wYzg1eHhfcmVtb3ZlX3N5c2ZzX2F0dHJpYnV0ZXMobWNpKTsKIAllZGFjX21jX2RlbF9tYygmb3AtPmRldik7CiAJZWRhY19tY19mcmVlKG1jaSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzg1eHhfbWNfZXJyX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4NXh4X21jX2Vycl9vZl9tYXRjaFtdID0gewogLyogZGVwcmVjYXRlIHRoZSBmc2wsODUuLiBmb3JtcyBpbiB0aGUgZnV0dXJlLCAyLjYuMzA/ICovCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0MC1tZW1vcnktY29udHJvbGxlciIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsODU0MS1tZW1vcnktY29udHJvbGxlciIsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvb2N0ZW9uX2VkYWMtbG1jLmMgYi9kcml2ZXJzL2VkYWMvb2N0ZW9uX2VkYWMtbG1jLmMKaW5kZXggNGJkMTBmOS4uYmIxOWUwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL29jdGVvbl9lZGFjLWxtYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9vY3Rlb25fZWRhYy1sbWMuYwpAQCAtMjA5LDM1ICsyMDksMTggQEAKIHN0YXRpYyBERVZJQ0VfQVRUUihjb2wsIFNfSVJVR08gfCBTX0lXVVNSLAogCQkgICBvY3Rlb25fbWNfaW5qZWN0X2NvbF9zaG93LCBvY3Rlb25fbWNfaW5qZWN0X2NvbF9zdG9yZSk7CiAKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpvY3Rlb25fZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX2luamVjdC5hdHRyLAorCSZkZXZfYXR0cl9lcnJvcl90eXBlLmF0dHIsCisJJmRldl9hdHRyX2RpbW0uYXR0ciwKKwkmZGV2X2F0dHJfcmFuay5hdHRyLAorCSZkZXZfYXR0cl9iYW5rLmF0dHIsCisJJmRldl9hdHRyX3Jvdy5hdHRyLAorCSZkZXZfYXR0cl9jb2wuYXR0ciwKKwlOVUxMCit9OwogCi1zdGF0aWMgaW50IG9jdGVvbl9zZXRfbWNfc3lzZnNfYXR0cmlidXRlcyhzdHJ1Y3QgbWVtX2N0bF9pbmZvICptY2kpCi17Ci0JaW50IHJjOwotCi0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfaW5qZWN0KTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfZXJyb3JfdHlwZSk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2RpbW0pOwotCWlmIChyYyA8IDApCi0JCXJldHVybiByYzsKLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbWNpLT5kZXYsICZkZXZfYXR0cl9yYW5rKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1jaS0+ZGV2LCAmZGV2X2F0dHJfYmFuayk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX3Jvdyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZtY2ktPmRldiwgJmRldl9hdHRyX2NvbCk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JcmV0dXJuIDA7Ci19CitBVFRSSUJVVEVfR1JPVVBTKG9jdGVvbl9kZXYpOwogCiBzdGF0aWMgaW50IG9jdGVvbl9sbWNfZWRhY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpAQCAtMjcxLDE4ICsyNTQsMTIgQEAKIAkJbWNpLT5jdGxfbmFtZSA9ICJvY3Rlb24tbG1jLWVyciI7CiAJCW1jaS0+ZWRhY19jaGVjayA9IG9jdGVvbl9sbWNfZWRhY19wb2xsOwogCi0JCWlmIChlZGFjX21jX2FkZF9tYyhtY2kpKSB7CisJCWlmIChlZGFjX21jX2FkZF9tY193aXRoX2dyb3VwcyhtY2ksIG9jdGVvbl9kZXZfZ3JvdXBzKSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZWRhY19tY19hZGRfbWMoKSBmYWlsZWRcbiIpOwogCQkJZWRhY19tY19mcmVlKG1jaSk7CiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAKLQkJaWYgKG9jdGVvbl9zZXRfbWNfc3lzZnNfYXR0cmlidXRlcyhtY2kpKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJvY3Rlb25fc2V0X21jX3N5c2ZzX2F0dHJpYnV0ZXMoKSBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC1FTlhJTzsKLQkJfQotCi0KIAkJY2ZnMC51NjQgPSBjdm14X3JlYWRfY3NyKENWTVhfTE1DWF9NRU1fQ0ZHMChtYykpOwogCQljZmcwLnMuaW50cl9kZWRfZW5hID0gMDsJLyogV2UgcG9sbCAqLwogCQljZmcwLnMuaW50cl9zZWNfZW5hID0gMDsKQEAgLTMwOSwxOCArMjg2LDEyIEBACiAJCW1jaS0+Y3RsX25hbWUgPSAiY29fbG1jX2VyciI7CiAJCW1jaS0+ZWRhY19jaGVjayA9IG9jdGVvbl9sbWNfZWRhY19wb2xsX28yOwogCi0JCWlmIChlZGFjX21jX2FkZF9tYyhtY2kpKSB7CisJCWlmIChlZGFjX21jX2FkZF9tY193aXRoX2dyb3VwcyhtY2ksIG9jdGVvbl9kZXZfZ3JvdXBzKSkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZWRhY19tY19hZGRfbWMoKSBmYWlsZWRcbiIpOwogCQkJZWRhY19tY19mcmVlKG1jaSk7CiAJCQlyZXR1cm4gLUVOWElPOwogCQl9CiAKLQkJaWYgKG9jdGVvbl9zZXRfbWNfc3lzZnNfYXR0cmlidXRlcyhtY2kpKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJvY3Rlb25fc2V0X21jX3N5c2ZzX2F0dHJpYnV0ZXMoKSBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIC1FTlhJTzsKLQkJfQotCi0KIAkJZW4udTY0ID0gY3ZteF9yZWFkX2NzcihDVk1YX0xNQ1hfTUVNX0NGRzAobWMpKTsKIAkJZW4ucy5pbnRyX2RlZF9lbmEgPSAwOwkvKiBXZSBwb2xsICovCiAJCWVuLnMuaW50cl9zZWNfZW5hID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9wcGM0eHhfZWRhYy5jIGIvZHJpdmVycy9lZGFjL3BwYzR4eF9lZGFjLmMKaW5kZXggMWI2NGZkMC4uMzUxNWIzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL3BwYzR4eF9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL3BwYzR4eF9lZGFjLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogICogRGV2aWNlIHRyZWUgbm9kZSB0eXBlIGFuZCBjb21wYXRpYmxlIHR1cGxlcyB0aGlzIGRyaXZlciBjYW4gbWF0Y2gKICAqIG9uLgogICovCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBwcGM0eHhfZWRhY19tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcHBjNHh4X2VkYWNfbWF0Y2hbXSA9IHsKIAl7CiAJCS5jb21wYXRpYmxlCT0gImlibSxzZHJhbS00eHgtZGRyMiIKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL3N5bm9wc3lzX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9zeW5vcHN5c19lZGFjLmMKaW5kZXggMWM5NjkxNS4uZmMxNTNhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL3N5bm9wc3lzX2VkYWMuYworKysgYi9kcml2ZXJzL2VkYWMvc3lub3BzeXNfZWRhYy5jCkBAIC01MTIsNyArNTEyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgc3lucHNfZWRhY19tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3lucHNfZWRhY19tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAieGxueCx6eW5xLWRkcmMtYTA1IiwgfSwKIAl7IC8qIGVuZCBvZiB0YWJsZSAqLyB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWFyaXpvbmEuYyBiL2RyaXZlcnMvZXh0Y29uL2V4dGNvbi1hcml6b25hLmMKaW5kZXggNjNmMDFjNC4uNmI1ZTc5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9leHRjb24vZXh0Y29uLWFyaXpvbmEuYworKysgYi9kcml2ZXJzL2V4dGNvbi9leHRjb24tYXJpem9uYS5jCkBAIC0xMTQ5LDYgKzExNDksNyBAQAogCQl9CiAJCWJyZWFrOwogCWNhc2UgV001MTEwOgorCWNhc2UgV004MjgwOgogCQlzd2l0Y2ggKGFyaXpvbmEtPnJldikgewogCQljYXNlIDAgLi4uIDI6CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlyZXdpcmUvbmV0LmMgYi9kcml2ZXJzL2ZpcmV3aXJlL25ldC5jCmluZGV4IDJjNjhkYTEuLmY0ZWE4MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlyZXdpcmUvbmV0LmMKKysrIGIvZHJpdmVycy9maXJld2lyZS9uZXQuYwpAQCAtMjM3LDE4ICsyMzcsNiBAQAogCXJldHVybiAtbmV0LT5oYXJkX2hlYWRlcl9sZW47CiB9CiAKLXN0YXRpYyBpbnQgZnduZXRfaGVhZGVyX3JlYnVpbGQoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgZnduZXRfaGVhZGVyICpoID0gKHN0cnVjdCBmd25ldF9oZWFkZXIgKilza2ItPmRhdGE7Ci0KLQlpZiAoZ2V0X3VuYWxpZ25lZF9iZTE2KCZoLT5oX3Byb3RvKSA9PSBFVEhfUF9JUCkKLQkJcmV0dXJuIGFycF9maW5kKCh1bnNpZ25lZCBjaGFyICopJmgtPmhfZGVzdCwgc2tiKTsKLQotCWRldl9ub3RpY2UoJnNrYi0+ZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVzb2x2ZSB0eXBlICUwNHggYWRkcmVzc2VzXG4iLAotCQkgICBiZTE2X3RvX2NwdShoLT5oX3Byb3RvKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgZnduZXRfaGVhZGVyX2NhY2hlKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLAogCQkJICAgICAgc3RydWN0IGhoX2NhY2hlICpoaCwgX19iZTE2IHR5cGUpCiB7CkBAIC0yODIsNyArMjcwLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZWFkZXJfb3BzIGZ3bmV0X2hlYWRlcl9vcHMgPSB7CiAJLmNyZWF0ZSAgICAgICAgID0gZnduZXRfaGVhZGVyX2NyZWF0ZSwKLQkucmVidWlsZCAgICAgICAgPSBmd25ldF9oZWFkZXJfcmVidWlsZCwKIAkuY2FjaGUJCT0gZnduZXRfaGVhZGVyX2NhY2hlLAogCS5jYWNoZV91cGRhdGUJPSBmd25ldF9oZWFkZXJfY2FjaGVfdXBkYXRlLAogCS5wYXJzZSAgICAgICAgICA9IGZ3bmV0X2hlYWRlcl9wYXJzZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYyBiL2RyaXZlcnMvZmlybXdhcmUvZG1pX3NjYW4uYwppbmRleCA2OWZhYzA2Li42ZTQ1YTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2RtaV9zY2FuLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9kbWlfc2Nhbi5jCkBAIC0xNyw3ICsxNyw5IEBACiAgKi8KIHN0YXRpYyBjb25zdCBjaGFyIGRtaV9lbXB0eV9zdHJpbmdbXSA9ICIgICAgICAgICI7CiAKLXN0YXRpYyB1MTYgX19pbml0ZGF0YSBkbWlfdmVyOworc3RhdGljIHUzMiBkbWlfdmVyIF9faW5pdGRhdGE7CitzdGF0aWMgdTMyIGRtaV9sZW47CitzdGF0aWMgdTE2IGRtaV9udW07CiAvKgogICogQ2F0Y2ggdG9vIGVhcmx5IGNhbGxzIHRvIGRtaV9jaGVja19zeXN0ZW0oKToKICAqLwpAQCAtNzgsNyArODAsNyBAQAogICoJV2UgaGF2ZSB0byBiZSBjYXV0aW91cyBoZXJlLiBXZSBoYXZlIHNlZW4gQklPU2VzIHdpdGggRE1JIHBvaW50ZXJzCiAgKglwb2ludGluZyB0byBjb21wbGV0ZWx5IHRoZSB3cm9uZyBwbGFjZSBmb3IgZXhhbXBsZQogICovCi1zdGF0aWMgdm9pZCBkbWlfdGFibGUodTggKmJ1ZiwgdTMyIGxlbiwgaW50IG51bSwKK3N0YXRpYyB2b2lkIGRtaV90YWJsZSh1OCAqYnVmLAogCQkgICAgICB2b2lkICgqZGVjb2RlKShjb25zdCBzdHJ1Y3QgZG1pX2hlYWRlciAqLCB2b2lkICopLAogCQkgICAgICB2b2lkICpwcml2YXRlX2RhdGEpCiB7CkBAIC04NiwxMCArODgsMTMgQEAKIAlpbnQgaSA9IDA7CiAKIAkvKgotCSAqCVN0b3Agd2hlbiB3ZSBzZWUgYWxsIHRoZSBpdGVtcyB0aGUgdGFibGUgY2xhaW1lZCB0byBoYXZlCi0JICoJT1Igd2UgcnVuIG9mZiB0aGUgZW5kIG9mIHRoZSB0YWJsZSAoYWxzbyBoYXBwZW5zKQorCSAqIFN0b3Agd2hlbiB3ZSBoYXZlIHNlZW4gYWxsIHRoZSBpdGVtcyB0aGUgdGFibGUgY2xhaW1lZCB0byBoYXZlCisJICogKFNNQklPUyA8IDMuMCBvbmx5KSBPUiB3ZSByZWFjaCBhbiBlbmQtb2YtdGFibGUgbWFya2VyIE9SIHdlIHJ1bgorCSAqIG9mZiB0aGUgZW5kIG9mIHRoZSB0YWJsZSAoc2hvdWxkIG5ldmVyIGhhcHBlbiBidXQgc29tZXRpbWVzIGRvZXMKKwkgKiBvbiBib2d1cyBpbXBsZW1lbnRhdGlvbnMuKQogCSAqLwotCXdoaWxlICgoaSA8IG51bSkgJiYgKGRhdGEgLSBidWYgKyBzaXplb2Yoc3RydWN0IGRtaV9oZWFkZXIpKSA8PSBsZW4pIHsKKwl3aGlsZSAoKCFkbWlfbnVtIHx8IGkgPCBkbWlfbnVtKSAmJgorCSAgICAgICAoZGF0YSAtIGJ1ZiArIHNpemVvZihzdHJ1Y3QgZG1pX2hlYWRlcikpIDw9IGRtaV9sZW4pIHsKIAkJY29uc3Qgc3RydWN0IGRtaV9oZWFkZXIgKmRtID0gKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICopZGF0YTsKIAogCQkvKgpAQCAtOTgsOSArMTAzLDkgQEAKIAkJICogIHRhYmxlIGluIGRtaV9kZWNvZGUgb3IgZG1pX3N0cmluZwogCQkgKi8KIAkJZGF0YSArPSBkbS0+bGVuZ3RoOwotCQl3aGlsZSAoKGRhdGEgLSBidWYgPCBsZW4gLSAxKSAmJiAoZGF0YVswXSB8fCBkYXRhWzFdKSkKKwkJd2hpbGUgKChkYXRhIC0gYnVmIDwgZG1pX2xlbiAtIDEpICYmIChkYXRhWzBdIHx8IGRhdGFbMV0pKQogCQkJZGF0YSsrOwotCQlpZiAoZGF0YSAtIGJ1ZiA8IGxlbiAtIDEpCisJCWlmIChkYXRhIC0gYnVmIDwgZG1pX2xlbiAtIDEpCiAJCQlkZWNvZGUoZG0sIHByaXZhdGVfZGF0YSk7CiAKIAkJLyoKQEAgLTExNSw4ICsxMjAsNiBAQAogfQogCiBzdGF0aWMgcGh5c19hZGRyX3QgZG1pX2Jhc2U7Ci1zdGF0aWMgdTMyIGRtaV9sZW47Ci1zdGF0aWMgdTE2IGRtaV9udW07CiAKIHN0YXRpYyBpbnQgX19pbml0IGRtaV93YWxrX2Vhcmx5KHZvaWQgKCpkZWNvZGUpKGNvbnN0IHN0cnVjdCBkbWlfaGVhZGVyICosCiAJCXZvaWQgKikpCkBAIC0xMjcsNyArMTMwLDcgQEAKIAlpZiAoYnVmID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAotCWRtaV90YWJsZShidWYsIGRtaV9sZW4sIGRtaV9udW0sIGRlY29kZSwgTlVMTCk7CisJZG1pX3RhYmxlKGJ1ZiwgZGVjb2RlLCBOVUxMKTsKIAogCWFkZF9kZXZpY2VfcmFuZG9tbmVzcyhidWYsIGRtaV9sZW4pOwogCkBAIC0xOTgsNyArMjAxLDcgQEAKIAkgKiB0aGUgVVVJRCBhcmUgc3VwcG9zZWQgdG8gYmUgbGl0dGxlLWVuZGlhbiBlbmNvZGVkLiAgVGhlIHNwZWNpZmljYXRpb24KIAkgKiBzYXlzIHRoYXQgdGhpcyBpcyB0aGUgZGVmYWN0byBzdGFuZGFyZC4KIAkgKi8KLQlpZiAoZG1pX3ZlciA+PSAweDAyMDYpCisJaWYgKGRtaV92ZXIgPj0gMHgwMjA2MDApCiAJCXNwcmludGYocywgIiVwVUwiLCBkKTsKIAllbHNlCiAJCXNwcmludGYocywgIiVwVUIiLCBkKTsKQEAgLTQ3MCw3ICs0NzMsNyBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBkbWlfcHJlc2VudChjb25zdCB1OCAqYnVmKQogewotCWludCBzbWJpb3NfdmVyOworCXUzMiBzbWJpb3NfdmVyOwogCiAJaWYgKG1lbWNtcChidWYsICJfU01fIiwgNCkgPT0gMCAmJgogCSAgICBidWZbNV0gPCAzMiAmJiBkbWlfY2hlY2tzdW0oYnVmLCBidWZbNV0pKSB7CkBAIC01MDMsMTQgKzUwNiwxNiBAQAogCQlpZiAoZG1pX3dhbGtfZWFybHkoZG1pX2RlY29kZSkgPT0gMCkgewogCQkJaWYgKHNtYmlvc192ZXIpIHsKIAkJCQlkbWlfdmVyID0gc21iaW9zX3ZlcjsKLQkJCQlwcl9pbmZvKCJTTUJJT1MgJWQuJWQgcHJlc2VudC5cbiIsCi0JCQkJICAgICAgIGRtaV92ZXIgPj4gOCwgZG1pX3ZlciAmIDB4RkYpOworCQkJCXByX2luZm8oIlNNQklPUyAlZC4lZCVzIHByZXNlbnQuXG4iLAorCQkJCQlkbWlfdmVyID4+IDgsIGRtaV92ZXIgJiAweEZGLAorCQkJCQkoZG1pX3ZlciA8IDB4MDMwMCkgPyAiIiA6ICIueCIpOwogCQkJfSBlbHNlIHsKIAkJCQlkbWlfdmVyID0gKGJ1ZlsxNF0gJiAweEYwKSA8PCA0IHwKIAkJCQkJICAgKGJ1ZlsxNF0gJiAweDBGKTsKIAkJCQlwcl9pbmZvKCJMZWdhY3kgRE1JICVkLiVkIHByZXNlbnQuXG4iLAogCQkJCSAgICAgICBkbWlfdmVyID4+IDgsIGRtaV92ZXIgJiAweEZGKTsKIAkJCX0KKwkJCWRtaV92ZXIgPDw9IDg7CiAJCQlkbWlfZm9ybWF0X2lkcyhkbWlfaWRzX3N0cmluZywgc2l6ZW9mKGRtaV9pZHNfc3RyaW5nKSk7CiAJCQlwcmludGsoS0VSTl9ERUJVRyAiRE1JOiAlc1xuIiwgZG1pX2lkc19zdHJpbmcpOwogCQkJcmV0dXJuIDA7CkBAIC01MjgsMjUgKzUzMywxNiBAQAogewogCWlmIChtZW1jbXAoYnVmLCAiX1NNM18iLCA1KSA9PSAwICYmCiAJICAgIGJ1Zls2XSA8IDMyICYmIGRtaV9jaGVja3N1bShidWYsIGJ1Zls2XSkpIHsKLQkJZG1pX3ZlciA9IGdldF91bmFsaWduZWRfYmUxNihidWYgKyA3KTsKKwkJZG1pX3ZlciA9IGdldF91bmFsaWduZWRfYmUzMihidWYgKyA2KTsKKwkJZG1pX3ZlciAmPSAweEZGRkZGRjsKKwkJZG1pX251bSA9IDA7CQkJLyogTm8gbG9uZ2VyIHNwZWNpZmllZCAqLwogCQlkbWlfbGVuID0gZ2V0X3VuYWxpZ25lZF9sZTMyKGJ1ZiArIDEyKTsKIAkJZG1pX2Jhc2UgPSBnZXRfdW5hbGlnbmVkX2xlNjQoYnVmICsgMTYpOwogCi0JCS8qCi0JCSAqIFRoZSA2NC1iaXQgU01CSU9TIDMuMCBlbnRyeSBwb2ludCBubyBsb25nZXIgaGFzIGEgZmllbGQKLQkJICogY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIHN0cnVjdHVyZXMgcHJlc2VudCBpbiB0aGUgdGFibGUuCi0JCSAqIEluc3RlYWQsIGl0IGRlZmluZXMgdGhlIHRhYmxlIHNpemUgYXMgYSBtYXhpbXVtIHNpemUsIGFuZAotCQkgKiByZWxpZXMgb24gdGhlIGVuZC1vZi10YWJsZSBzdHJ1Y3R1cmUgdHlwZSAoIzEyNykgdG8gYmUgdXNlZAotCQkgKiB0byBzaWduYWwgdGhlIGVuZCBvZiB0aGUgdGFibGUuCi0JCSAqIFNvIGxldCdzIGRlZmluZSBkbWlfbnVtIGFzIGFuIHVwcGVyIGJvdW5kIGFzIHdlbGw6IGVhY2gKLQkJICogc3RydWN0dXJlIGhhcyBhIDQgYnl0ZSBoZWFkZXIsIHNvIGRtaV9sZW4gLyA0IGlzIGFuIHVwcGVyCi0JCSAqIGJvdW5kIGZvciB0aGUgbnVtYmVyIG9mIHN0cnVjdHVyZXMgaW4gdGhlIHRhYmxlLgotCQkgKi8KLQkJZG1pX251bSA9IGRtaV9sZW4gLyA0OwotCiAJCWlmIChkbWlfd2Fsa19lYXJseShkbWlfZGVjb2RlKSA9PSAwKSB7Ci0JCQlwcl9pbmZvKCJTTUJJT1MgJWQuJWQgcHJlc2VudC5cbiIsCi0JCQkJZG1pX3ZlciA+PiA4LCBkbWlfdmVyICYgMHhGRik7CisJCQlwcl9pbmZvKCJTTUJJT1MgJWQuJWQuJWQgcHJlc2VudC5cbiIsCisJCQkJZG1pX3ZlciA+PiAxNiwgKGRtaV92ZXIgPj4gOCkgJiAweEZGLAorCQkJCWRtaV92ZXIgJiAweEZGKTsKIAkJCWRtaV9mb3JtYXRfaWRzKGRtaV9pZHNfc3RyaW5nLCBzaXplb2YoZG1pX2lkc19zdHJpbmcpKTsKIAkJCXByX2RlYnVnKCJETUk6ICVzXG4iLCBkbWlfaWRzX3N0cmluZyk7CiAJCQlyZXR1cm4gMDsKQEAgLTkwMSw3ICs4OTcsNyBAQAogCWlmIChidWYgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCi0JZG1pX3RhYmxlKGJ1ZiwgZG1pX2xlbiwgZG1pX251bSwgZGVjb2RlLCBwcml2YXRlX2RhdGEpOworCWRtaV90YWJsZShidWYsIGRlY29kZSwgcHJpdmF0ZV9kYXRhKTsKIAogCWRtaV91bm1hcChidWYpOwogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9hcm0tc3R1Yi5jIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9hcm0tc3R1Yi5jCmluZGV4IGRjYWU0ODIuLmUyOTU2MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvYXJtLXN0dWIuYworKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2FybS1zdHViLmMKQEAgLTE3NSw3ICsxNzUsNyBAQAogCXVuc2lnbmVkIGxvbmcgaW5pdHJkX2FkZHI7CiAJdTY0IGluaXRyZF9zaXplID0gMDsKIAl1bnNpZ25lZCBsb25nIGZkdF9hZGRyID0gMDsgIC8qIE9yaWdpbmFsIERUQiAqLwotCXU2NCBmZHRfc2l6ZSA9IDA7ICAvKiBXZSBkb24ndCBnZXQgc2l6ZSBmcm9tIGNvbmZpZ3VyYXRpb24gdGFibGUgKi8KKwl1bnNpZ25lZCBsb25nIGZkdF9zaXplID0gMDsKIAljaGFyICpjbWRsaW5lX3B0ciA9IE5VTEw7CiAJaW50IGNtZGxpbmVfc2l6ZSA9IDA7CiAJdW5zaWduZWQgbG9uZyBuZXdfZmR0X2FkZHI7CkBAIC0yMzksOCArMjM5LDcgQEAKIAl9IGVsc2UgewogCQlzdGF0dXMgPSBoYW5kbGVfY21kbGluZV9maWxlcyhzeXNfdGFibGUsIGltYWdlLCBjbWRsaW5lX3B0ciwKIAkJCQkJICAgICAgImR0Yj0iLAotCQkJCQkgICAgICB+MFVMLCAodW5zaWduZWQgbG9uZyAqKSZmZHRfYWRkciwKLQkJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcgKikmZmR0X3NpemUpOworCQkJCQkgICAgICB+MFVMLCAmZmR0X2FkZHIsICZmZHRfc2l6ZSk7CiAKIAkJaWYgKHN0YXR1cyAhPSBFRklfU1VDQ0VTUykgewogCQkJcHJfZWZpX2VycihzeXNfdGFibGUsICJGYWlsZWQgdG8gbG9hZCBkZXZpY2UgdHJlZSFcbiIpOwpAQCAtMjUyLDcgKzI1MSw3IEBACiAJCXByX2VmaShzeXNfdGFibGUsICJVc2luZyBEVEIgZnJvbSBjb21tYW5kIGxpbmVcbiIpOwogCX0gZWxzZSB7CiAJCS8qIExvb2sgZm9yIGEgZGV2aWNlIHRyZWUgY29uZmlndXJhdGlvbiB0YWJsZSBlbnRyeS4gKi8KLQkJZmR0X2FkZHIgPSAodWludHB0cl90KWdldF9mZHQoc3lzX3RhYmxlKTsKKwkJZmR0X2FkZHIgPSAodWludHB0cl90KWdldF9mZHQoc3lzX3RhYmxlLCAmZmR0X3NpemUpOwogCQlpZiAoZmR0X2FkZHIpCiAJCQlwcl9lZmkoc3lzX3RhYmxlLCAiVXNpbmcgRFRCIGZyb20gY29uZmlndXJhdGlvbiB0YWJsZVxuIik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9lZmlzdHViLmggYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2VmaXN0dWIuaAppbmRleCA0NzQzN2IxLi5lMzM0YTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2VmaXN0dWIuaAorKysgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2VmaXN0dWIuaApAQCAtNDEsNyArNDEsNyBAQAogCQkJCQkgICAgdW5zaWduZWQgbG9uZyBmZHRfYWRkciwKIAkJCQkJICAgIHVuc2lnbmVkIGxvbmcgZmR0X3NpemUpOwogCi12b2lkICpnZXRfZmR0KGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlKTsKK3ZvaWQgKmdldF9mZHQoZWZpX3N5c3RlbV90YWJsZV90ICpzeXNfdGFibGUsIHVuc2lnbmVkIGxvbmcgKmZkdF9zaXplKTsKIAogdm9pZCBlZmlfZ2V0X3ZpcnRtYXAoZWZpX21lbW9yeV9kZXNjX3QgKm1lbW9yeV9tYXAsIHVuc2lnbmVkIGxvbmcgbWFwX3NpemUsCiAJCSAgICAgdW5zaWduZWQgbG9uZyBkZXNjX3NpemUsIGVmaV9tZW1vcnlfZGVzY190ICpydW50aW1lX21hcCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvZmR0LmMgYi9kcml2ZXJzL2Zpcm13YXJlL2VmaS9saWJzdHViL2ZkdC5jCmluZGV4IDkxZGE1NmMuLmVmNWQ3NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpL2xpYnN0dWIvZmR0LmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9lZmkvbGlic3R1Yi9mZHQuYwpAQCAtMzIzLDcgKzMyMyw3IEBACiAJcmV0dXJuIEVGSV9MT0FEX0VSUk9SOwogfQogCi12b2lkICpnZXRfZmR0KGVmaV9zeXN0ZW1fdGFibGVfdCAqc3lzX3RhYmxlKQordm9pZCAqZ2V0X2ZkdChlZmlfc3lzdGVtX3RhYmxlX3QgKnN5c190YWJsZSwgdW5zaWduZWQgbG9uZyAqZmR0X3NpemUpCiB7CiAJZWZpX2d1aWRfdCBmZHRfZ3VpZCA9IERFVklDRV9UUkVFX0dVSUQ7CiAJZWZpX2NvbmZpZ190YWJsZV90ICp0YWJsZXM7CkBAIC0zMzYsNiArMzM2LDExIEBACiAJZm9yIChpID0gMDsgaSA8IHN5c190YWJsZS0+bnJfdGFibGVzOyBpKyspCiAJCWlmIChlZmlfZ3VpZGNtcCh0YWJsZXNbaV0uZ3VpZCwgZmR0X2d1aWQpID09IDApIHsKIAkJCWZkdCA9ICh2b2lkICopIHRhYmxlc1tpXS50YWJsZTsKKwkJCWlmIChmZHRfY2hlY2tfaGVhZGVyKGZkdCkgIT0gMCkgeworCQkJCXByX2VmaV9lcnIoc3lzX3RhYmxlLCAiSW52YWxpZCBoZWFkZXIgZGV0ZWN0ZWQgb24gVUVGSSBzdXBwbGllZCBGRFQsIGlnbm9yaW5nIC4uLlxuIik7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQkqZmR0X3NpemUgPSBmZHRfdG90YWxzaXplKGZkdCk7CiAJCQlicmVhazsKIAkgfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vS2NvbmZpZyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCmluZGV4IGMxZTJjYTMuLmRjMWFhYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9LY29uZmlnCisrKyBiL2RyaXZlcnMvZ3Bpby9LY29uZmlnCkBAIC02NjksNiArNjY5LDcgQEAKIGNvbmZpZyBHUElPX1RDMzU4OVgKIAlib29sICJUQzM1ODlYIEdQSU9zIgogCWRlcGVuZHMgb24gTUZEX1RDMzU4OVgKKwlkZXBlbmRzIG9uIE9GX0dQSU8KIAlzZWxlY3QgR1BJT0xJQl9JUlFDSElQCiAJaGVscAogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBHUElPcyBmb3VuZCBvbiB0aGUgVEMzNTg5WApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tYXJpem9uYS5jIGIvZHJpdmVycy9ncGlvL2dwaW8tYXJpem9uYS5jCmluZGV4IGZlMzY5ZjUuLjk2NjVkMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWFyaXpvbmEuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1hcml6b25hLmMKQEAgLTExNiw2ICsxMTYsNyBAQAogCXN3aXRjaCAoYXJpem9uYS0+dHlwZSkgewogCWNhc2UgV001MTAyOgogCWNhc2UgV001MTEwOgorCWNhc2UgV004MjgwOgogCWNhc2UgV004OTk3OgogCQlhcml6b25hX2dwaW8tPmdwaW9fY2hpcC5uZ3BpbyA9IDU7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tbXBjOHh4eC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbXBjOHh4eC5jCmluZGV4IGE2OTUyYmEzLi5hNjViNzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1tcGM4eHh4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbXBjOHh4eC5jCkBAIC0zMzQsNyArMzM0LDcgQEAKIAkueGxhdGUJPSBpcnFfZG9tYWluX3hsYXRlX3R3b2NlbGwsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4eHh4X2dwaW9faWRzW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzh4eHhfZ3Bpb19pZHNbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4MzQ5LWdwaW8iLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZ3BpbyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjODYxMC1ncGlvIiwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXN5c2Nvbi5jIGIvZHJpdmVycy9ncGlvL2dwaW8tc3lzY29uLmMKaW5kZXggMjU3ZTI5OC4uMDQ1YTk1MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tc3lzY29uLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tc3lzY29uLmMKQEAgLTIxOSw3ICsyMTksNyBAQAogCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChucCwgImdwaW8sc3lzY29uLWRldiIsIDIsCiAJCQkJCQkgJnByaXYtPmRpcl9yZWdfb2Zmc2V0KTsKIAkJaWYgKHJldCkKLQkJCWRldl9lcnIoZGV2LCAiY2FuJ3QgcmVhZCB0aGUgZGlyIHJlZ2lzdGVyIG9mZnNldCFcbiIpOworCQkJZGV2X2RiZyhkZXYsICJjYW4ndCByZWFkIHRoZSBkaXIgcmVnaXN0ZXIgb2Zmc2V0IVxuIik7CiAKIAkJcHJpdi0+ZGlyX3JlZ19vZmZzZXQgPDw9IDM7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL2dwaW8tdGMzNTg5eC5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdGMzNTg5eC5jCmluZGV4IDExYWVkMjYuLjMxYjI0NGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXRjMzU4OXguYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby10YzM1ODl4LmMKQEAgLTI2MCwxMCArMjYwLDcgQEAKIAl0YzM1ODl4X2dwaW8tPmNoaXAubmdwaW8gPSB0YzM1ODl4LT5udW1fZ3BpbzsKIAl0YzM1ODl4X2dwaW8tPmNoaXAuZGV2ID0gJnBkZXYtPmRldjsKIAl0YzM1ODl4X2dwaW8tPmNoaXAuYmFzZSA9IC0xOwotCi0jaWZkZWYgQ09ORklHX09GX0dQSU8KIAl0YzM1ODl4X2dwaW8tPmNoaXAub2Zfbm9kZSA9IG5wOwotI2VuZGlmCiAKIAkvKiBCcmluZyB0aGUgR1BJTyBtb2R1bGUgb3V0IG9mIHJlc2V0ICovCiAJcmV0ID0gdGMzNTg5eF9zZXRfYml0cyh0YzM1ODl4LCBUQzM1ODl4X1JTVENUUkwsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1hY3BpLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi1hY3BpLmMKaW5kZXggYzA5MjlkOS4uZGY5OTBmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW9saWItYWNwaS5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLWFjcGkuYwpAQCAtMjAxLDYgKzIwMSwxMCBAQAogCWlmICghaGFuZGxlcikKIAkJcmV0dXJuIEFFX0JBRF9QQVJBTUVURVI7CiAKKwlwaW4gPSBhY3BpX2dwaW9jaGlwX3Bpbl90b19ncGlvX29mZnNldChjaGlwLCBwaW4pOworCWlmIChwaW4gPCAwKQorCQlyZXR1cm4gQUVfQkFEX1BBUkFNRVRFUjsKKwogCWRlc2MgPSBncGlvY2hpcF9yZXF1ZXN0X293bl9kZXNjKGNoaXAsIHBpbiwgIkFDUEk6RXZlbnQiKTsKIAlpZiAoSVNfRVJSKGRlc2MpKSB7CiAJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgR1BJT1xuIik7CkBAIC01NTEsNiArNTU1LDEyIEBACiAJCXN0cnVjdCBncGlvX2Rlc2MgKmRlc2M7CiAJCWJvb2wgZm91bmQ7CiAKKwkJcGluID0gYWNwaV9ncGlvY2hpcF9waW5fdG9fZ3Bpb19vZmZzZXQoY2hpcCwgcGluKTsKKwkJaWYgKHBpbiA8IDApIHsKKwkJCXN0YXR1cyA9IEFFX0JBRF9QQVJBTUVURVI7CisJCQlnb3RvIG91dDsKKwkJfQorCiAJCW11dGV4X2xvY2soJmFjaGlwLT5jb25uX2xvY2spOwogCiAJCWZvdW5kID0gZmFsc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5oIGIvZHJpdmVycy9ncGlvL2dwaW9saWIuaAppbmRleCA1NTBhNWVhLi5hYjg5MmJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpb2xpYi5oCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvbGliLmgKQEAgLTE3LDYgKzE3LDggQEAKIAogZW51bSBvZl9ncGlvX2ZsYWdzOwogCitzdHJ1Y3QgYWNwaV9kZXZpY2U7CisKIC8qKgogICogc3RydWN0IGFjcGlfZ3Bpb19pbmZvIC0gQUNQSSBHUElPIHNwZWNpZmljIGluZm9ybWF0aW9uCiAgKiBAZ3Bpb2ludDogaWYgJXRydWUgdGhpcyBHUElPIGlzIG9mIHR5cGUgR3Bpb0ludCBvdGhlcndpc2UgdHlwZSBpcyBHcGlvSW8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1ka2ZkL2tmZF9kZXZpY2VfcXVldWVfbWFuYWdlci5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRrZmQva2ZkX2RldmljZV9xdWV1ZV9tYW5hZ2VyLmMKaW5kZXggOTEwZmY4YS4uZDgxMzVhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRrZmQva2ZkX2RldmljZV9xdWV1ZV9tYW5hZ2VyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRrZmQva2ZkX2RldmljZV9xdWV1ZV9tYW5hZ2VyLmMKQEAgLTY0NSw2ICs2NDUsNyBAQAogCXByX2RlYnVnKCIgICAgIHNkbWEgcXVldWUgaWQ6ICVkXG4iLCBxLT5wcm9wZXJ0aWVzLnNkbWFfcXVldWVfaWQpOwogCXByX2RlYnVnKCIgICAgIHNkbWEgZW5naW5lIGlkOiAlZFxuIiwgcS0+cHJvcGVydGllcy5zZG1hX2VuZ2luZV9pZCk7CiAKKwlpbml0X3NkbWFfdm0oZHFtLCBxLCBxcGQpOwogCXJldHZhbCA9IG1xZC0+aW5pdF9tcWQobXFkLCAmcS0+bXFkLCAmcS0+bXFkX21lbV9vYmosCiAJCQkJJnEtPmdhcnRfbXFkX2FkZHIsICZxLT5wcm9wZXJ0aWVzKTsKIAlpZiAocmV0dmFsICE9IDApIHsKQEAgLTY1Miw3ICs2NTMsMTQgQEAKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlpbml0X3NkbWFfdm0oZHFtLCBxLCBxcGQpOworCXJldHZhbCA9IG1xZC0+bG9hZF9tcWQobXFkLCBxLT5tcWQsIDAsCisJCQkJMCwgTlVMTCk7CisJaWYgKHJldHZhbCAhPSAwKSB7CisJCWRlYWxsb2NhdGVfc2RtYV9xdWV1ZShkcW0sIHEtPnNkbWFfaWQpOworCQltcWQtPnVuaW5pdF9tcWQobXFkLCBxLT5tcWQsIHEtPm1xZF9tZW1fb2JqKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRrZmQva2ZkX2tlcm5lbF9xdWV1ZS5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRrZmQva2ZkX2tlcm5lbF9xdWV1ZS5jCmluZGV4IGU0MTVhMmEuLmM3ZDI5OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1ka2ZkL2tmZF9rZXJuZWxfcXVldWUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGtmZC9rZmRfa2VybmVsX3F1ZXVlLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAlCVUdfT04oIWtxIHx8ICFkZXYpOwogCUJVR19PTih0eXBlICE9IEtGRF9RVUVVRV9UWVBFX0RJUSAmJiB0eXBlICE9IEtGRF9RVUVVRV9UWVBFX0hJUSk7CiAKLQlwcl9kZWJ1Zygia2ZkOiBJbiBmdW5jICVzIGluaXRpYWxpemluZyBxdWV1ZSB0eXBlICVkIHNpemUgJWRcbiIsCisJcHJfZGVidWcoImFtZGtmZDogSW4gZnVuYyAlcyBpbml0aWFsaXppbmcgcXVldWUgdHlwZSAlZCBzaXplICVkXG4iLAogCQkJX19mdW5jX18sIEtGRF9RVUVVRV9UWVBFX0hJUSwgcXVldWVfc2l6ZSk7CiAKIAlub3Aub3Bjb2RlID0gSVRfTk9QOwpAQCAtNjksMTIgKzY5LDE2IEBACiAKIAlwcm9wLmRvb3JiZWxsX3B0ciA9IGtmZF9nZXRfa2VybmVsX2Rvb3JiZWxsKGRldiwgJnByb3AuZG9vcmJlbGxfb2ZmKTsKIAotCWlmIChwcm9wLmRvb3JiZWxsX3B0ciA9PSBOVUxMKQorCWlmIChwcm9wLmRvb3JiZWxsX3B0ciA9PSBOVUxMKSB7CisJCXByX2VycigiYW1ka2ZkOiBlcnJvciBpbml0IGRvb3JiZWxsIik7CiAJCWdvdG8gZXJyX2dldF9rZXJuZWxfZG9vcmJlbGw7CisJfQogCiAJcmV0dmFsID0ga2ZkX2d0dF9zYV9hbGxvY2F0ZShkZXYsIHF1ZXVlX3NpemUsICZrcS0+cHEpOwotCWlmIChyZXR2YWwgIT0gMCkKKwlpZiAocmV0dmFsICE9IDApIHsKKwkJcHJfZXJyKCJhbWRrZmQ6IGVycm9yIGluaXQgcHEgcXVldWVzIHNpemUgKCVkKVxuIiwgcXVldWVfc2l6ZSk7CiAJCWdvdG8gZXJyX3BxX2FsbG9jYXRlX3ZpZG1lbTsKKwl9CiAKIAlrcS0+cHFfa2VybmVsX2FkZHIgPSBrcS0+cHEtPmNwdV9wdHI7CiAJa3EtPnBxX2dwdV9hZGRyID0ga3EtPnBxLT5ncHVfYWRkcjsKQEAgLTE2NSwxMCArMTY5LDggQEAKIGVycl9lb3BfYWxsb2NhdGVfdmlkbWVtOgogCWtmZF9ndHRfc2FfZnJlZShkZXYsIGtxLT5wcSk7CiBlcnJfcHFfYWxsb2NhdGVfdmlkbWVtOgotCXByX2Vycigia2ZkOiBlcnJvciBpbml0IHBxXG4iKTsKIAlrZmRfcmVsZWFzZV9rZXJuZWxfZG9vcmJlbGwoZGV2LCBwcm9wLmRvb3JiZWxsX3B0cik7CiBlcnJfZ2V0X2tlcm5lbF9kb29yYmVsbDoKLQlwcl9lcnIoImtmZDogZXJyb3IgaW5pdCBkb29yYmVsbCIpOwogCXJldHVybiBmYWxzZTsKIAogfQpAQCAtMTg3LDYgKzE4OSw4IEBACiAJZWxzZSBpZiAoa3EtPnF1ZXVlLT5wcm9wZXJ0aWVzLnR5cGUgPT0gS0ZEX1FVRVVFX1RZUEVfRElRKQogCQlrZmRfZ3R0X3NhX2ZyZWUoa3EtPmRldiwga3EtPmZlbmNlX21lbV9vYmopOwogCisJa3EtPm1xZC0+dW5pbml0X21xZChrcS0+bXFkLCBrcS0+cXVldWUtPm1xZCwga3EtPnF1ZXVlLT5tcWRfbWVtX29iaik7CisKIAlrZmRfZ3R0X3NhX2ZyZWUoa3EtPmRldiwga3EtPnJwdHJfbWVtKTsKIAlrZmRfZ3R0X3NhX2ZyZWUoa3EtPmRldiwga3EtPndwdHJfbWVtKTsKIAlrcS0+b3BzX2FzaWNfc3BlY2lmaWMudW5pbml0aWFsaXplKGtxKTsKQEAgLTIxMSw3ICsyMTUsNyBAQAogCXF1ZXVlX2FkZHJlc3MgPSAodW5zaWduZWQgaW50ICopa3EtPnBxX2tlcm5lbF9hZGRyOwogCXF1ZXVlX3NpemVfZHdvcmRzID0ga3EtPnF1ZXVlLT5wcm9wZXJ0aWVzLnF1ZXVlX3NpemUgLyBzaXplb2YodWludDMyX3QpOwogCi0JcHJfZGVidWcoImtmZDogSW4gZnVuYyAlc1xucnB0cjogJWRcbndwdHI6ICVkXG5xdWV1ZV9hZGRyZXNzIDB4JXBcbiIsCisJcHJfZGVidWcoImFtZGtmZDogSW4gZnVuYyAlc1xucnB0cjogJWRcbndwdHI6ICVkXG5xdWV1ZV9hZGRyZXNzIDB4JXBcbiIsCiAJCQlfX2Z1bmNfXywgcnB0ciwgd3B0ciwgcXVldWVfYWRkcmVzcyk7CiAKIAlhdmFpbGFibGVfc2l6ZSA9IChycHRyIC0gMSAtIHdwdHIgKyBxdWV1ZV9zaXplX2R3b3JkcykgJQpAQCAtMjk2LDcgKzMwMCw3IEBACiAJfQogCiAJaWYgKGtxLT5vcHMuaW5pdGlhbGl6ZShrcSwgZGV2LCB0eXBlLCBLRkRfS0VSTkVMX1FVRVVFX1NJWkUpID09IGZhbHNlKSB7Ci0JCXByX2Vycigia2ZkOiBmYWlsZWQgdG8gaW5pdCBrZXJuZWwgcXVldWVcbiIpOworCQlwcl9lcnIoImFtZGtmZDogZmFpbGVkIHRvIGluaXQga2VybmVsIHF1ZXVlXG4iKTsKIAkJa2ZyZWUoa3EpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0zMTksNyArMzIzLDcgQEAKIAogCUJVR19PTighZGV2KTsKIAotCXByX2Vycigia2ZkOiBzdGFydGluZyBrZXJuZWwgcXVldWUgdGVzdFxuIik7CisJcHJfZXJyKCJhbWRrZmQ6IHN0YXJ0aW5nIGtlcm5lbCBxdWV1ZSB0ZXN0XG4iKTsKIAogCWtxID0ga2VybmVsX3F1ZXVlX2luaXQoZGV2LCBLRkRfUVVFVUVfVFlQRV9ISVEpOwogCUJVR19PTigha3EpOwpAQCAtMzMwLDcgKzMzNCw3IEBACiAJCWJ1ZmZlcltpXSA9IGtxLT5ub3BfcGFja2V0OwogCWtxLT5vcHMuc3VibWl0X3BhY2tldChrcSk7CiAKLQlwcl9lcnIoImtmZDogZW5kaW5nIGtlcm5lbCBxdWV1ZSB0ZXN0XG4iKTsKKwlwcl9lcnIoImFtZGtmZDogZW5kaW5nIGtlcm5lbCBxdWV1ZSB0ZXN0XG4iKTsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCmluZGV4IGY2ZDA0YzcuLmI2ZjA3NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Yy5jCkBAIC01MjUsMTcgKzUyNSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGRybV9mcmFtZWJ1ZmZlcl9yZWZlcmVuY2UpOwogCi1zdGF0aWMgdm9pZCBkcm1fZnJhbWVidWZmZXJfZnJlZV9idWcoc3RydWN0IGtyZWYgKmtyZWYpCi17Ci0JQlVHKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZHJtX2ZyYW1lYnVmZmVyX3VucmVmZXJlbmNlKHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiKQotewotCURSTV9ERUJVRygiJXA6IEZCIElEOiAlZCAoJWQpXG4iLCBmYiwgZmItPmJhc2UuaWQsIGF0b21pY19yZWFkKCZmYi0+cmVmY291bnQucmVmY291bnQpKTsKLQlrcmVmX3B1dCgmZmItPnJlZmNvdW50LCBkcm1fZnJhbWVidWZmZXJfZnJlZV9idWcpOwotfQotCiAvKioKICAqIGRybV9mcmFtZWJ1ZmZlcl91bnJlZ2lzdGVyX3ByaXZhdGUgLSB1bnJlZ2lzdGVyIGEgcHJpdmF0ZSBmYiBmcm9tIHRoZSBsb29rdXAgaWRyCiAgKiBAZmI6IGZiIHRvIHVucmVnaXN0ZXIKQEAgLTEzMjAsNyArMTMwOSw3IEBACiAJCXJldHVybjsKIAl9CiAJLyogZGlzY29ubmVjdCB0aGUgcGxhbmUgZnJvbSB0aGUgZmIgYW5kIGNydGM6ICovCi0JX19kcm1fZnJhbWVidWZmZXJfdW5yZWZlcmVuY2UocGxhbmUtPm9sZF9mYik7CisJZHJtX2ZyYW1lYnVmZmVyX3VucmVmZXJlbmNlKHBsYW5lLT5vbGRfZmIpOwogCXBsYW5lLT5vbGRfZmIgPSBOVUxMOwogCXBsYW5lLT5mYiA9IE5VTEw7CiAJcGxhbmUtPmNydGMgPSBOVUxMOwpAQCAtMjEzMiw3ICsyMTIxLDcgQEAKIAljb25uZWN0b3IgPSBkcm1fY29ubmVjdG9yX2ZpbmQoZGV2LCBvdXRfcmVzcC0+Y29ubmVjdG9yX2lkKTsKIAlpZiAoIWNvbm5lY3RvcikgewogCQlyZXQgPSAtRU5PRU5UOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBEUk1fQ09OTkVDVE9SX01BWF9FTkNPREVSOyBpKyspCkBAIC0yMjEyLDYgKzIyMDEsOCBAQAogCiBvdXQ6CiAJZHJtX21vZGVzZXRfdW5sb2NrKCZkZXYtPm1vZGVfY29uZmlnLmNvbm5lY3Rpb25fbXV0ZXgpOworCitvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmZGV2LT5tb2RlX2NvbmZpZy5tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkX2xvYWQuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZWRpZF9sb2FkLmMKaW5kZXggNzMyY2I2Zi4uNGMwYWE5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkX2xvYWQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWRfbG9hZC5jCkBAIC0yODcsNiArMjg3LDcgQEAKIAogCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShjb25uZWN0b3IsIGVkaWQpOwogCXJldCA9IGRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIGVkaWQpOworCWRybV9lZGlkX3RvX2VsZChjb25uZWN0b3IsIGVkaWQpOwogCWtmcmVlKGVkaWQpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJvYmVfaGVscGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3Byb2JlX2hlbHBlci5jCmluZGV4IDY1OTFkNDguLjNmZWU1ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJvYmVfaGVscGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9iZV9oZWxwZXIuYwpAQCAtMTc0LDYgKzE3NCw3IEBACiAJCQlzdHJ1Y3QgZWRpZCAqZWRpZCA9IChzdHJ1Y3QgZWRpZCAqKSBjb25uZWN0b3ItPmVkaWRfYmxvYl9wdHItPmRhdGE7CiAKIAkJCWNvdW50ID0gZHJtX2FkZF9lZGlkX21vZGVzKGNvbm5lY3RvciwgZWRpZCk7CisJCQlkcm1fZWRpZF90b19lbGQoY29ubmVjdG9yLCBlZGlkKTsKIAkJfSBlbHNlCiAJCQljb3VudCA9ICgqY29ubmVjdG9yX2Z1bmNzLT5nZXRfbW9kZXMpKGNvbm5lY3Rvcik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV90cmFjZS5oIGIvZHJpdmVycy9ncHUvZHJtL2RybV90cmFjZS5oCmluZGV4IDI3Y2M5NWYuLmNlM2M0MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fdHJhY2UuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3RyYWNlLmgKQEAgLTcsNyArNyw2IEBACiAKICN1bmRlZiBUUkFDRV9TWVNURU0KICNkZWZpbmUgVFJBQ0VfU1lTVEVNIGRybQotI2RlZmluZSBUUkFDRV9TWVNURU1fU1RSSU5HIF9fc3RyaW5naWZ5KFRSQUNFX1NZU1RFTSkKICNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIGRybV90cmFjZQogCiBUUkFDRV9FVkVOVChkcm1fdmJsYW5rX2V2ZW50LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9LY29uZmlnIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9LY29uZmlnCmluZGV4IGE1ZTc0NjEuLjBhNjc4MDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL0tjb25maWcKQEAgLTUwLDcgKzUwLDcgQEAKIAogY29uZmlnIERSTV9FWFlOT1NfRFAKIAlib29sICJFWFlOT1MgRFJNIERQIGRyaXZlciBzdXBwb3J0IgotCWRlcGVuZHMgb24gKERSTV9FWFlOT1NfRklNRCB8fCBEUk1fRVhZTk9TN0RFQ09OKSAmJiBBUkNIX0VYWU5PUyAmJiAoRFJNX1BUTjM0NjA9biB8fCBEUk1fUFROMzQ2MD15IHx8IERSTV9QVE4zNDYwPURSTV9FWFlOT1MpCisJZGVwZW5kcyBvbiAoRFJNX0VYWU5PU19GSU1EIHx8IERSTV9FWFlOT1M3X0RFQ09OKSAmJiBBUkNIX0VYWU5PUyAmJiAoRFJNX1BUTjM0NjA9biB8fCBEUk1fUFROMzQ2MD15IHx8IERSTV9QVE4zNDYwPURSTV9FWFlOT1MpCiAJZGVmYXVsdCBEUk1fRVhZTk9TCiAJc2VsZWN0IERSTV9QQU5FTAogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zN19kcm1fZGVjb24uYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zN19kcm1fZGVjb24uYwppbmRleCA2M2YwMmUyLi45NzAwNDYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vczdfZHJtX2RlY29uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3M3X2RybV9kZWNvbi5jCkBAIC04ODgsOCArODg4LDggQEAKIAlvZl9ub2RlX3B1dChpODBfaWZfdGltaW5ncyk7CiAKIAljdHgtPnJlZ3MgPSBvZl9pb21hcChkZXYtPm9mX25vZGUsIDApOwotCWlmIChJU19FUlIoY3R4LT5yZWdzKSkgewotCQlyZXQgPSBQVFJfRVJSKGN0eC0+cmVncyk7CisJaWYgKCFjdHgtPnJlZ3MpIHsKKwkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfZGVsX2NvbXBvbmVudDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jb25uZWN0b3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jb25uZWN0b3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5YjNkNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fY29ubmVjdG9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgotICogQXV0aG9yczoKLSAqCUlua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KLSAqCUpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4KLSAqCVNldW5nLVdvbyBLaW0gPHN3MDMxMi5raW1Ac2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8ZHJtL2RybVAuaD4KLSNpbmNsdWRlIDxkcm0vZHJtX2NydGNfaGVscGVyLmg+Ci0KLSNpbmNsdWRlIDxkcm0vZXh5bm9zX2RybS5oPgotI2luY2x1ZGUgImV4eW5vc19kcm1fZHJ2LmgiCi0jaW5jbHVkZSAiZXh5bm9zX2RybV9lbmNvZGVyLmgiCi0jaW5jbHVkZSAiZXh5bm9zX2RybV9jb25uZWN0b3IuaCIKLQotI2RlZmluZSB0b19leHlub3NfY29ubmVjdG9yKHgpCWNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZXh5bm9zX2RybV9jb25uZWN0b3IsXAotCQkJCWRybV9jb25uZWN0b3IpCi0KLXN0cnVjdCBleHlub3NfZHJtX2Nvbm5lY3RvciB7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IJCWRybV9jb25uZWN0b3I7Ci0JdWludDMyX3QJCQllbmNvZGVyX2lkOwotCXN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkJKmRpc3BsYXk7Ci19OwotCi1zdGF0aWMgaW50IGV4eW5vc19kcm1fY29ubmVjdG9yX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQotewotCXN0cnVjdCBleHlub3NfZHJtX2Nvbm5lY3RvciAqZXh5bm9zX2Nvbm5lY3RvciA9Ci0JCQkJCXRvX2V4eW5vc19jb25uZWN0b3IoY29ubmVjdG9yKTsKLQlzdHJ1Y3QgZXh5bm9zX2RybV9kaXNwbGF5ICpkaXNwbGF5ID0gZXh5bm9zX2Nvbm5lY3Rvci0+ZGlzcGxheTsKLQlzdHJ1Y3QgZWRpZCAqZWRpZCA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gMDsKLQlpbnQgcmV0OwotCi0JLyoKLQkgKiBpZiBnZXRfZWRpZCgpIGV4aXN0cyB0aGVuIGdldF9lZGlkKCkgY2FsbGJhY2sgb2YgaGRtaSBzaWRlCi0JICogaXMgY2FsbGVkIHRvIGdldCBlZGlkIGRhdGEgdGhyb3VnaCBpMmMgaW50ZXJmYWNlIGVsc2UKLQkgKiBnZXQgdGltaW5nIGZyb20gdGhlIEZJTUQgZHJpdmVyKGRpc3BsYXkgY29udHJvbGxlcikuCi0JICoKLQkgKiBQLlMuIGluIGNhc2Ugb2YgbGNkIHBhbmVsLCBjb3VudCBpcyBhbHdheXMgMSBpZiBzdWNjZXNzCi0JICogYmVjYXVzZSBsY2QgcGFuZWwgaGFzIG9ubHkgb25lIG1vZGUuCi0JICovCi0JaWYgKGRpc3BsYXktPm9wcy0+Z2V0X2VkaWQpIHsKLQkJZWRpZCA9IGRpc3BsYXktPm9wcy0+Z2V0X2VkaWQoZGlzcGxheSwgY29ubmVjdG9yKTsKLQkJaWYgKElTX0VSUl9PUl9OVUxMKGVkaWQpKSB7Ci0JCQlyZXQgPSBQVFJfRVJSKGVkaWQpOwotCQkJZWRpZCA9IE5VTEw7Ci0JCQlEUk1fRVJST1IoIlBhbmVsIG9wZXJhdGlvbiBnZXRfZWRpZCBmYWlsZWQgJWRcbiIsIHJldCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWNvdW50ID0gZHJtX2FkZF9lZGlkX21vZGVzKGNvbm5lY3RvciwgZWRpZCk7Ci0JCWlmICghY291bnQpIHsKLQkJCURSTV9FUlJPUigiQWRkIGVkaWQgbW9kZXMgZmFpbGVkICVkXG4iLCBjb3VudCk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCWRybV9tb2RlX2Nvbm5lY3Rvcl91cGRhdGVfZWRpZF9wcm9wZXJ0eShjb25uZWN0b3IsIGVkaWQpOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBleHlub3NfZHJtX3BhbmVsX2luZm8gKnBhbmVsOwotCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9IGRybV9tb2RlX2NyZWF0ZShjb25uZWN0b3ItPmRldik7Ci0JCWlmICghbW9kZSkgewotCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIGEgbmV3IGRpc3BsYXkgbW9kZS5cbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlpZiAoZGlzcGxheS0+b3BzLT5nZXRfcGFuZWwpCi0JCQlwYW5lbCA9IGRpc3BsYXktPm9wcy0+Z2V0X3BhbmVsKGRpc3BsYXkpOwotCQllbHNlIHsKLQkJCWRybV9tb2RlX2Rlc3Ryb3koY29ubmVjdG9yLT5kZXYsIG1vZGUpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlkcm1fZGlzcGxheV9tb2RlX2Zyb21fdmlkZW9tb2RlKCZwYW5lbC0+dm0sIG1vZGUpOwotCQltb2RlLT53aWR0aF9tbSA9IHBhbmVsLT53aWR0aF9tbTsKLQkJbW9kZS0+aGVpZ2h0X21tID0gcGFuZWwtPmhlaWdodF9tbTsKLQkJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ud2lkdGhfbW0gPSBtb2RlLT53aWR0aF9tbTsKLQkJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uaGVpZ2h0X21tID0gbW9kZS0+aGVpZ2h0X21tOwotCi0JCW1vZGUtPnR5cGUgPSBEUk1fTU9ERV9UWVBFX0RSSVZFUiB8IERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOwotCQlkcm1fbW9kZV9zZXRfbmFtZShtb2RlKTsKLQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG1vZGUpOwotCi0JCWNvdW50ID0gMTsKLQl9Ci0KLW91dDoKLQlrZnJlZShlZGlkKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBpbnQgZXh5bm9zX2RybV9jb25uZWN0b3JfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAotCQkJCQkgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCi17Ci0Jc3RydWN0IGV4eW5vc19kcm1fY29ubmVjdG9yICpleHlub3NfY29ubmVjdG9yID0KLQkJCQkJdG9fZXh5bm9zX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCXN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXkgPSBleHlub3NfY29ubmVjdG9yLT5kaXNwbGF5OwotCWludCByZXQgPSBNT0RFX0JBRDsKLQotCURSTV9ERUJVR19LTVMoIiVzXG4iLCBfX0ZJTEVfXyk7Ci0KLQlpZiAoZGlzcGxheS0+b3BzLT5jaGVja19tb2RlKQotCQlpZiAoIWRpc3BsYXktPm9wcy0+Y2hlY2tfbW9kZShkaXNwbGF5LCBtb2RlKSkKLQkJCXJldCA9IE1PREVfT0s7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICpleHlub3NfZHJtX2Jlc3RfZW5jb2RlcigKLQkJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7Ci0Jc3RydWN0IGV4eW5vc19kcm1fY29ubmVjdG9yICpleHlub3NfY29ubmVjdG9yID0KLQkJCQkJdG9fZXh5bm9zX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCXJldHVybiBkcm1fZW5jb2Rlcl9maW5kKGRldiwgZXh5bm9zX2Nvbm5lY3Rvci0+ZW5jb2Rlcl9pZCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgZXh5bm9zX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MgPSB7Ci0JLmdldF9tb2Rlcwk9IGV4eW5vc19kcm1fY29ubmVjdG9yX2dldF9tb2RlcywKLQkubW9kZV92YWxpZAk9IGV4eW5vc19kcm1fY29ubmVjdG9yX21vZGVfdmFsaWQsCi0JLmJlc3RfZW5jb2Rlcgk9IGV4eW5vc19kcm1fYmVzdF9lbmNvZGVyLAotfTsKLQotc3RhdGljIGludCBleHlub3NfZHJtX2Nvbm5lY3Rvcl9maWxsX21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCi0JCQkJdW5zaWduZWQgaW50IG1heF93aWR0aCwgdW5zaWduZWQgaW50IG1heF9oZWlnaHQpCi17Ci0Jc3RydWN0IGV4eW5vc19kcm1fY29ubmVjdG9yICpleHlub3NfY29ubmVjdG9yID0KLQkJCQkJdG9fZXh5bm9zX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCXN0cnVjdCBleHlub3NfZHJtX2Rpc3BsYXkgKmRpc3BsYXkgPSBleHlub3NfY29ubmVjdG9yLT5kaXNwbGF5OwotCXVuc2lnbmVkIGludCB3aWR0aCwgaGVpZ2h0OwotCi0Jd2lkdGggPSBtYXhfd2lkdGg7Ci0JaGVpZ2h0ID0gbWF4X2hlaWdodDsKLQotCS8qCi0JICogaWYgc3BlY2lmaWMgZHJpdmVyIHdhbnQgdG8gZmluZCBkZXNpcmVkX21vZGUgdXNpbmcgbWF4bXVtCi0JICogcmVzb2x1dGlvbiB0aGVuIGdldCBtYXggd2lkdGggYW5kIGhlaWdodCBmcm9tIHRoYXQgZHJpdmVyLgotCSAqLwotCWlmIChkaXNwbGF5LT5vcHMtPmdldF9tYXhfcmVzb2wpCi0JCWRpc3BsYXktPm9wcy0+Z2V0X21heF9yZXNvbChkaXNwbGF5LCAmd2lkdGgsICZoZWlnaHQpOwotCi0JcmV0dXJuIGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2Rlcyhjb25uZWN0b3IsIHdpZHRoLAotCQkJCQkJCWhlaWdodCk7Ci19Ci0KLS8qIGdldCBkZXRlY3Rpb24gc3RhdHVzIG9mIGRpc3BsYXkgZGV2aWNlLiAqLwotc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMKLWV4eW5vc19kcm1fY29ubmVjdG9yX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBib29sIGZvcmNlKQotewotCXN0cnVjdCBleHlub3NfZHJtX2Nvbm5lY3RvciAqZXh5bm9zX2Nvbm5lY3RvciA9Ci0JCQkJCXRvX2V4eW5vc19jb25uZWN0b3IoY29ubmVjdG9yKTsKLQlzdHJ1Y3QgZXh5bm9zX2RybV9kaXNwbGF5ICpkaXNwbGF5ID0gZXh5bm9zX2Nvbm5lY3Rvci0+ZGlzcGxheTsKLQllbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIHN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwotCi0JaWYgKGRpc3BsYXktPm9wcy0+aXNfY29ubmVjdGVkKSB7Ci0JCWlmIChkaXNwbGF5LT5vcHMtPmlzX2Nvbm5lY3RlZChkaXNwbGF5KSkKLQkJCXN0YXR1cyA9IGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOwotCQllbHNlCi0JCQlzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKLQl9Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBleHlub3NfZHJtX2Nvbm5lY3Rvcl9kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCi17Ci0Jc3RydWN0IGV4eW5vc19kcm1fY29ubmVjdG9yICpleHlub3NfY29ubmVjdG9yID0KLQkJdG9fZXh5bm9zX2Nvbm5lY3Rvcihjb25uZWN0b3IpOwotCi0JZHJtX2Nvbm5lY3Rvcl91bnJlZ2lzdGVyKGNvbm5lY3Rvcik7Ci0JZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7Ci0Ja2ZyZWUoZXh5bm9zX2Nvbm5lY3Rvcik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBleHlub3NfY29ubmVjdG9yX2Z1bmNzID0gewotCS5kcG1zCQk9IGRybV9oZWxwZXJfY29ubmVjdG9yX2RwbXMsCi0JLmZpbGxfbW9kZXMJPSBleHlub3NfZHJtX2Nvbm5lY3Rvcl9maWxsX21vZGVzLAotCS5kZXRlY3QJCT0gZXh5bm9zX2RybV9jb25uZWN0b3JfZGV0ZWN0LAotCS5kZXN0cm95CT0gZXh5bm9zX2RybV9jb25uZWN0b3JfZGVzdHJveSwKLX07Ci0KLXN0cnVjdCBkcm1fY29ubmVjdG9yICpleHlub3NfZHJtX2Nvbm5lY3Rvcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkJCSAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKLXsKLQlzdHJ1Y3QgZXh5bm9zX2RybV9jb25uZWN0b3IgKmV4eW5vc19jb25uZWN0b3I7Ci0Jc3RydWN0IGV4eW5vc19kcm1fZGlzcGxheSAqZGlzcGxheSA9IGV4eW5vc19kcm1fZ2V0X2Rpc3BsYXkoZW5jb2Rlcik7Ci0Jc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKLQlpbnQgdHlwZTsKLQlpbnQgZXJyOwotCi0JZXh5bm9zX2Nvbm5lY3RvciA9IGt6YWxsb2Moc2l6ZW9mKCpleHlub3NfY29ubmVjdG9yKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFleHlub3NfY29ubmVjdG9yKQotCQlyZXR1cm4gTlVMTDsKLQotCWNvbm5lY3RvciA9ICZleHlub3NfY29ubmVjdG9yLT5kcm1fY29ubmVjdG9yOwotCi0Jc3dpdGNoIChkaXNwbGF5LT50eXBlKSB7Ci0JY2FzZSBFWFlOT1NfRElTUExBWV9UWVBFX0hETUk6Ci0JCXR5cGUgPSBEUk1fTU9ERV9DT05ORUNUT1JfSERNSUE7Ci0JCWNvbm5lY3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSB0cnVlOwotCQljb25uZWN0b3ItPnBvbGxlZCA9IERSTV9DT05ORUNUT1JfUE9MTF9IUEQ7Ci0JCWJyZWFrOwotCWNhc2UgRVhZTk9TX0RJU1BMQVlfVFlQRV9WSURJOgotCQl0eXBlID0gRFJNX01PREVfQ09OTkVDVE9SX1ZJUlRVQUw7Ci0JCWNvbm5lY3Rvci0+cG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0hQRDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJdHlwZSA9IERSTV9NT0RFX0NPTk5FQ1RPUl9Vbmtub3duOwotCQlicmVhazsKLQl9Ci0KLQlkcm1fY29ubmVjdG9yX2luaXQoZGV2LCBjb25uZWN0b3IsICZleHlub3NfY29ubmVjdG9yX2Z1bmNzLCB0eXBlKTsKLQlkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoY29ubmVjdG9yLCAmZXh5bm9zX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwotCi0JZXJyID0gZHJtX2Nvbm5lY3Rvcl9yZWdpc3Rlcihjb25uZWN0b3IpOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX2Nvbm5lY3RvcjsKLQotCWV4eW5vc19jb25uZWN0b3ItPmVuY29kZXJfaWQgPSBlbmNvZGVyLT5iYXNlLmlkOwotCWV4eW5vc19jb25uZWN0b3ItPmRpc3BsYXkgPSBkaXNwbGF5OwotCWNvbm5lY3Rvci0+ZHBtcyA9IERSTV9NT0RFX0RQTVNfT0ZGOwotCWNvbm5lY3Rvci0+ZW5jb2RlciA9IGVuY29kZXI7Ci0KLQllcnIgPSBkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIoY29ubmVjdG9yLCBlbmNvZGVyKTsKLQlpZiAoZXJyKSB7Ci0JCURSTV9FUlJPUigiZmFpbGVkIHRvIGF0dGFjaCBhIGNvbm5lY3RvciB0byBhIGVuY29kZXJcbiIpOwotCQlnb3RvIGVycl9zeXNmczsKLQl9Ci0KLQlEUk1fREVCVUdfS01TKCJjb25uZWN0b3IgaGFzIGJlZW4gY3JlYXRlZFxuIik7Ci0KLQlyZXR1cm4gY29ubmVjdG9yOwotCi1lcnJfc3lzZnM6Ci0JZHJtX2Nvbm5lY3Rvcl91bnJlZ2lzdGVyKGNvbm5lY3Rvcik7Ci1lcnJfY29ubmVjdG9yOgotCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOwotCWtmcmVlKGV4eW5vc19jb25uZWN0b3IpOwotCXJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Nvbm5lY3Rvci5oIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2Nvbm5lY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWIyMGQ3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9jb25uZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KLSAqIEF1dGhvcnM6Ci0gKglJbmtpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Ci0gKglKb29ueW91bmcgU2hpbSA8ankwOTIyLnNoaW1Ac2Ftc3VuZy5jb20+Ci0gKglTZXVuZy1Xb28gS2ltIDxzdzAzMTIua2ltQHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKLSAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2lmbmRlZiBfRVhZTk9TX0RSTV9DT05ORUNUT1JfSF8KLSNkZWZpbmUgX0VYWU5PU19EUk1fQ09OTkVDVE9SX0hfCi0KLXN0cnVjdCBkcm1fY29ubmVjdG9yICpleHlub3NfZHJtX2Nvbm5lY3Rvcl9jcmVhdGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKLQkJCQkJCSAgIHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2Rlcik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWQuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9maW1kLmMKaW5kZXggOTI1ZmM2OS4uMzNhMTBjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2ZpbWQuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19kcm1fZmltZC5jCkBAIC0xNDcsNiArMTQ3LDcgQEAKIAl1bnNpZ25lZCBpbnQJCW92bF9oZWlnaHQ7CiAJdW5zaWduZWQgaW50CQlmYl93aWR0aDsKIAl1bnNpZ25lZCBpbnQJCWZiX2hlaWdodDsKKwl1bnNpZ25lZCBpbnQJCWZiX3BpdGNoOwogCXVuc2lnbmVkIGludAkJYnBwOwogCXVuc2lnbmVkIGludAkJcGl4ZWxfZm9ybWF0OwogCWRtYV9hZGRyX3QJCWRtYV9hZGRyOwpAQCAtMjg0LDE0ICsyODUsOSBAQAogCX0KIH0KIAotc3RhdGljIGludCBmaW1kX2N0eF9pbml0aWFsaXplKHN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eCwKK3N0YXRpYyBpbnQgZmltZF9pb21tdV9hdHRhY2hfZGV2aWNlcyhzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHgsCiAJCQlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldikKIHsKLQlzdHJ1Y3QgZXh5bm9zX2RybV9wcml2YXRlICpwcml2OwotCXByaXYgPSBkcm1fZGV2LT5kZXZfcHJpdmF0ZTsKLQotCWN0eC0+ZHJtX2RldiA9IGRybV9kZXY7Ci0JY3R4LT5waXBlID0gcHJpdi0+cGlwZSsrOwogCiAJLyogYXR0YWNoIHRoaXMgc3ViIGRyaXZlciB0byBpb21tdSBtYXBwaW5nIGlmIHN1cHBvcnRlZC4gKi8KIAlpZiAoaXNfZHJtX2lvbW11X3N1cHBvcnRlZChjdHgtPmRybV9kZXYpKSB7CkBAIC0zMTMsNyArMzA5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZmltZF9jdHhfcmVtb3ZlKHN0cnVjdCBmaW1kX2NvbnRleHQgKmN0eCkKK3N0YXRpYyB2b2lkIGZpbWRfaW9tbXVfZGV0YWNoX2RldmljZXMoc3RydWN0IGZpbWRfY29udGV4dCAqY3R4KQogewogCS8qIGRldGFjaCB0aGlzIHN1YiBkcml2ZXIgZnJvbSBpb21tdSBtYXBwaW5nIGlmIHN1cHBvcnRlZC4gKi8KIAlpZiAoaXNfZHJtX2lvbW11X3N1cHBvcnRlZChjdHgtPmRybV9kZXYpKQpAQCAtNTM3LDEzICs1MzMsMTQgQEAKIAl3aW5fZGF0YS0+b2Zmc2V0X3kgPSBwbGFuZS0+Y3J0Y195OwogCXdpbl9kYXRhLT5vdmxfd2lkdGggPSBwbGFuZS0+Y3J0Y193aWR0aDsKIAl3aW5fZGF0YS0+b3ZsX2hlaWdodCA9IHBsYW5lLT5jcnRjX2hlaWdodDsKKwl3aW5fZGF0YS0+ZmJfcGl0Y2ggPSBwbGFuZS0+cGl0Y2g7CiAJd2luX2RhdGEtPmZiX3dpZHRoID0gcGxhbmUtPmZiX3dpZHRoOwogCXdpbl9kYXRhLT5mYl9oZWlnaHQgPSBwbGFuZS0+ZmJfaGVpZ2h0OwogCXdpbl9kYXRhLT5kbWFfYWRkciA9IHBsYW5lLT5kbWFfYWRkclswXSArIG9mZnNldDsKIAl3aW5fZGF0YS0+YnBwID0gcGxhbmUtPmJwcDsKIAl3aW5fZGF0YS0+cGl4ZWxfZm9ybWF0ID0gcGxhbmUtPnBpeGVsX2Zvcm1hdDsKLQl3aW5fZGF0YS0+YnVmX29mZnNpemUgPSAocGxhbmUtPmZiX3dpZHRoIC0gcGxhbmUtPmNydGNfd2lkdGgpICoKLQkJCQkocGxhbmUtPmJwcCA+PiAzKTsKKwl3aW5fZGF0YS0+YnVmX29mZnNpemUgPQorCQlwbGFuZS0+cGl0Y2ggLSAocGxhbmUtPmNydGNfd2lkdGggKiAocGxhbmUtPmJwcCA+PiAzKSk7CiAJd2luX2RhdGEtPmxpbmVfc2l6ZSA9IHBsYW5lLT5jcnRjX3dpZHRoICogKHBsYW5lLT5icHAgPj4gMyk7CiAKIAlEUk1fREVCVUdfS01TKCJvZmZzZXRfeCA9ICVkLCBvZmZzZXRfeSA9ICVkXG4iLApAQCAtNzA5LDcgKzcwNiw3IEBACiAJd3JpdGVsKHZhbCwgY3R4LT5yZWdzICsgVklEV3hfQlVGX1NUQVJUKHdpbiwgMCkpOwogCiAJLyogYnVmZmVyIGVuZCBhZGRyZXNzICovCi0Jc2l6ZSA9IHdpbl9kYXRhLT5mYl93aWR0aCAqIHdpbl9kYXRhLT5vdmxfaGVpZ2h0ICogKHdpbl9kYXRhLT5icHAgPj4gMyk7CisJc2l6ZSA9IHdpbl9kYXRhLT5mYl9waXRjaCAqIHdpbl9kYXRhLT5vdmxfaGVpZ2h0ICogKHdpbl9kYXRhLT5icHAgPj4gMyk7CiAJdmFsID0gKHVuc2lnbmVkIGxvbmcpKHdpbl9kYXRhLT5kbWFfYWRkciArIHNpemUpOwogCXdyaXRlbCh2YWwsIGN0eC0+cmVncyArIFZJRFd4X0JVRl9FTkQod2luLCAwKSk7CiAKQEAgLTEwNTYsMjUgKzEwNTMsMjMgQEAKIHsKIAlzdHJ1Y3QgZmltZF9jb250ZXh0ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgZHJtX2RldmljZSAqZHJtX2RldiA9IGRhdGE7CisJc3RydWN0IGV4eW5vc19kcm1fcHJpdmF0ZSAqcHJpdiA9IGRybV9kZXYtPmRldl9wcml2YXRlOwogCWludCByZXQ7CiAKLQlyZXQgPSBmaW1kX2N0eF9pbml0aWFsaXplKGN0eCwgZHJtX2Rldik7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoImZpbWRfY3R4X2luaXRpYWxpemUgZmFpbGVkLlxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQorCWN0eC0+ZHJtX2RldiA9IGRybV9kZXY7CisJY3R4LT5waXBlID0gcHJpdi0+cGlwZSsrOwogCiAJY3R4LT5jcnRjID0gZXh5bm9zX2RybV9jcnRjX2NyZWF0ZShkcm1fZGV2LCBjdHgtPnBpcGUsCiAJCQkJCSAgIEVYWU5PU19ESVNQTEFZX1RZUEVfTENELAogCQkJCQkgICAmZmltZF9jcnRjX29wcywgY3R4KTsKLQlpZiAoSVNfRVJSKGN0eC0+Y3J0YykpIHsKLQkJZmltZF9jdHhfcmVtb3ZlKGN0eCk7Ci0JCXJldHVybiBQVFJfRVJSKGN0eC0+Y3J0Yyk7Ci0JfQogCiAJaWYgKGN0eC0+ZGlzcGxheSkKIAkJZXh5bm9zX2RybV9jcmVhdGVfZW5jX2Nvbm4oZHJtX2RldiwgY3R4LT5kaXNwbGF5KTsKIAorCXJldCA9IGZpbWRfaW9tbXVfYXR0YWNoX2RldmljZXMoY3R4LCBkcm1fZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJcmV0dXJuIDA7CiAKIH0KQEAgLTEwODYsMTAgKzEwODEsMTAgQEAKIAogCWZpbWRfZHBtcyhjdHgtPmNydGMsIERSTV9NT0RFX0RQTVNfT0ZGKTsKIAorCWZpbWRfaW9tbXVfZGV0YWNoX2RldmljZXMoY3R4KTsKKwogCWlmIChjdHgtPmRpc3BsYXkpCiAJCWV4eW5vc19kcGlfcmVtb3ZlKGN0eC0+ZGlzcGxheSk7Ci0KLQlmaW1kX2N0eF9yZW1vdmUoY3R4KTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wb25lbnRfb3BzIGZpbWRfY29tcG9uZW50X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9wbGFuZS5jIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX3BsYW5lLmMKaW5kZXggYTU2MTY4Ny4uOGFkNWI3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX3BsYW5lLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX3BsYW5lLmMKQEAgLTE3NSw3ICsxNzUsNyBAQAogCXN0cnVjdCBleHlub3NfZHJtX3BsYW5lICpleHlub3NfcGxhbmUgPSB0b19leHlub3NfcGxhbmUocGxhbmUpOwogCXN0cnVjdCBleHlub3NfZHJtX2NydGMgKmV4eW5vc19jcnRjID0gdG9fZXh5bm9zX2NydGMocGxhbmUtPmNydGMpOwogCi0JaWYgKGV4eW5vc19jcnRjLT5vcHMtPndpbl9kaXNhYmxlKQorCWlmIChleHlub3NfY3J0YyAmJiBleHlub3NfY3J0Yy0+b3BzLT53aW5fZGlzYWJsZSkKIAkJZXh5bm9zX2NydGMtPm9wcy0+d2luX2Rpc2FibGUoZXh5bm9zX2NydGMsCiAJCQkJCSAgICAgIGV4eW5vc19wbGFuZS0+enBvcyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX21peGVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vZXh5bm9zL2V4eW5vc19taXhlci5jCmluZGV4IDM1MThiYzQuLjJlM2JjNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX21peGVyLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfbWl4ZXIuYwpAQCAtNTUsNiArNTUsNyBAQAogCXVuc2lnbmVkIGludAkJZmJfeDsKIAl1bnNpZ25lZCBpbnQJCWZiX3k7CiAJdW5zaWduZWQgaW50CQlmYl93aWR0aDsKKwl1bnNpZ25lZCBpbnQJCWZiX3BpdGNoOwogCXVuc2lnbmVkIGludAkJZmJfaGVpZ2h0OwogCXVuc2lnbmVkIGludAkJc3JjX3dpZHRoOwogCXVuc2lnbmVkIGludAkJc3JjX2hlaWdodDsKQEAgLTQzOCw3ICs0MzksNyBAQAogCX0gZWxzZSB7CiAJCWx1bWFfYWRkclswXSA9IHdpbl9kYXRhLT5kbWFfYWRkcjsKIAkJY2hyb21hX2FkZHJbMF0gPSB3aW5fZGF0YS0+ZG1hX2FkZHIKLQkJCSsgKHdpbl9kYXRhLT5mYl93aWR0aCAqIHdpbl9kYXRhLT5mYl9oZWlnaHQpOworCQkJKyAod2luX2RhdGEtPmZiX3BpdGNoICogd2luX2RhdGEtPmZiX2hlaWdodCk7CiAJfQogCiAJaWYgKHdpbl9kYXRhLT5zY2FuX2ZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0UpIHsKQEAgLTQ0Nyw4ICs0NDgsOCBAQAogCQkJbHVtYV9hZGRyWzFdID0gbHVtYV9hZGRyWzBdICsgMHg0MDsKIAkJCWNocm9tYV9hZGRyWzFdID0gY2hyb21hX2FkZHJbMF0gKyAweDQwOwogCQl9IGVsc2UgewotCQkJbHVtYV9hZGRyWzFdID0gbHVtYV9hZGRyWzBdICsgd2luX2RhdGEtPmZiX3dpZHRoOwotCQkJY2hyb21hX2FkZHJbMV0gPSBjaHJvbWFfYWRkclswXSArIHdpbl9kYXRhLT5mYl93aWR0aDsKKwkJCWx1bWFfYWRkclsxXSA9IGx1bWFfYWRkclswXSArIHdpbl9kYXRhLT5mYl9waXRjaDsKKwkJCWNocm9tYV9hZGRyWzFdID0gY2hyb21hX2FkZHJbMF0gKyB3aW5fZGF0YS0+ZmJfcGl0Y2g7CiAJCX0KIAl9IGVsc2UgewogCQljdHgtPmludGVybGFjZSA9IGZhbHNlOwpAQCAtNDY5LDEwICs0NzAsMTAgQEAKIAl2cF9yZWdfd3JpdGVtYXNrKHJlcywgVlBfTU9ERSwgdmFsLCBWUF9NT0RFX0ZNVF9NQVNLKTsKIAogCS8qIHNldHRpbmcgc2l6ZSBvZiBpbnB1dCBpbWFnZSAqLwotCXZwX3JlZ193cml0ZShyZXMsIFZQX0lNR19TSVpFX1ksIFZQX0lNR19IU0laRSh3aW5fZGF0YS0+ZmJfd2lkdGgpIHwKKwl2cF9yZWdfd3JpdGUocmVzLCBWUF9JTUdfU0laRV9ZLCBWUF9JTUdfSFNJWkUod2luX2RhdGEtPmZiX3BpdGNoKSB8CiAJCVZQX0lNR19WU0laRSh3aW5fZGF0YS0+ZmJfaGVpZ2h0KSk7CiAJLyogY2hyb21hIGhlaWdodCBoYXMgdG8gcmVkdWNlZCBieSAyIHRvIGF2b2lkIGNocm9tYSBkaXN0b3Jpb25zICovCi0JdnBfcmVnX3dyaXRlKHJlcywgVlBfSU1HX1NJWkVfQywgVlBfSU1HX0hTSVpFKHdpbl9kYXRhLT5mYl93aWR0aCkgfAorCXZwX3JlZ193cml0ZShyZXMsIFZQX0lNR19TSVpFX0MsIFZQX0lNR19IU0laRSh3aW5fZGF0YS0+ZmJfcGl0Y2gpIHwKIAkJVlBfSU1HX1ZTSVpFKHdpbl9kYXRhLT5mYl9oZWlnaHQgLyAyKSk7CiAKIAl2cF9yZWdfd3JpdGUocmVzLCBWUF9TUkNfV0lEVEgsIHdpbl9kYXRhLT5zcmNfd2lkdGgpOwpAQCAtNTU5LDcgKzU2MCw3IEBACiAJLyogY29udmVydGluZyBkbWEgYWRkcmVzcyBiYXNlIGFuZCBzb3VyY2Ugb2Zmc2V0ICovCiAJZG1hX2FkZHIgPSB3aW5fZGF0YS0+ZG1hX2FkZHIKIAkJKyAod2luX2RhdGEtPmZiX3ggKiB3aW5fZGF0YS0+YnBwID4+IDMpCi0JCSsgKHdpbl9kYXRhLT5mYl95ICogd2luX2RhdGEtPmZiX3dpZHRoICogd2luX2RhdGEtPmJwcCA+PiAzKTsKKwkJKyAod2luX2RhdGEtPmZiX3kgKiB3aW5fZGF0YS0+ZmJfcGl0Y2gpOwogCXNyY194X29mZnNldCA9IDA7CiAJc3JjX3lfb2Zmc2V0ID0gMDsKIApAQCAtNTc2LDcgKzU3Nyw4IEBACiAJCU1YUl9HUlBfQ0ZHX0ZPUk1BVF9WQUwoZm10KSwgTVhSX0dSUF9DRkdfRk9STUFUX01BU0spOwogCiAJLyogc2V0dXAgZ2VvbWV0cnkgKi8KLQltaXhlcl9yZWdfd3JpdGUocmVzLCBNWFJfR1JBUEhJQ19TUEFOKHdpbiksIHdpbl9kYXRhLT5mYl93aWR0aCk7CisJbWl4ZXJfcmVnX3dyaXRlKHJlcywgTVhSX0dSQVBISUNfU1BBTih3aW4pLAorCQkJd2luX2RhdGEtPmZiX3BpdGNoIC8gKHdpbl9kYXRhLT5icHAgPj4gMykpOwogCiAJLyogc2V0dXAgZGlzcGxheSBzaXplICovCiAJaWYgKGN0eC0+bXhyX3ZlciA9PSBNWFJfVkVSXzEyOF8wXzBfMTg0ICYmCkBAIC05NjEsNiArOTYzLDcgQEAKIAl3aW5fZGF0YS0+ZmJfeSA9IHBsYW5lLT5mYl95OwogCXdpbl9kYXRhLT5mYl93aWR0aCA9IHBsYW5lLT5mYl93aWR0aDsKIAl3aW5fZGF0YS0+ZmJfaGVpZ2h0ID0gcGxhbmUtPmZiX2hlaWdodDsKKwl3aW5fZGF0YS0+ZmJfcGl0Y2ggPSBwbGFuZS0+cGl0Y2g7CiAJd2luX2RhdGEtPnNyY193aWR0aCA9IHBsYW5lLT5zcmNfd2lkdGg7CiAJd2luX2RhdGEtPnNyY19oZWlnaHQgPSBwbGFuZS0+c3JjX2hlaWdodDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKaW5kZXggY2M2ZWE1My4uNWM2NmI1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCkBAIC0xMDk1LDYgKzEwOTUsNyBAQAogCS8qIEd1bml0LURpc3BsYXkgQ1ogZG9tYWluLCAweDE4MjAyOC0weDE4MjFDRiAqLwogCXMtPmd1X2N0bDAJCT0gSTkxNV9SRUFEKFZMVl9HVV9DVEwwKTsKIAlzLT5ndV9jdGwxCQk9IEk5MTVfUkVBRChWTFZfR1VfQ1RMMSk7CisJcy0+cGNicgkJCT0gSTkxNV9SRUFEKFZMVl9QQ0JSKTsKIAlzLT5jbG9ja19nYXRlX2RpczIJPSBJOTE1X1JFQUQoVkxWX0dVTklUX0NMT0NLX0dBVEUyKTsKIAogCS8qCkBAIC0xMTg5LDYgKzExOTAsNyBAQAogCS8qIEd1bml0LURpc3BsYXkgQ1ogZG9tYWluLCAweDE4MjAyOC0weDE4MjFDRiAqLwogCUk5MTVfV1JJVEUoVkxWX0dVX0NUTDAsCQkJcy0+Z3VfY3RsMCk7CiAJSTkxNV9XUklURShWTFZfR1VfQ1RMMSwJCQlzLT5ndV9jdGwxKTsKKwlJOTE1X1dSSVRFKFZMVl9QQ0JSLAkJCXMtPnBjYnIpOwogCUk5MTVfV1JJVEUoVkxWX0dVTklUX0NMT0NLX0dBVEUyLAlzLT5jbG9ja19nYXRlX2RpczIpOwogfQogCkBAIC0xMTk3LDE5ICsxMTk5LDcgQEAKIAl1MzIgdmFsOwogCWludCBlcnI7CiAKLQl2YWwgPSBJOTE1X1JFQUQoVkxWX0dUTENfU1VSVklWQUJJTElUWV9SRUcpOwotCVdBUk5fT04oISEodmFsICYgVkxWX0dGWF9DTEtfRk9SQ0VfT05fQklUKSA9PSBmb3JjZV9vbik7Ci0KICNkZWZpbmUgQ09ORCAoSTkxNV9SRUFEKFZMVl9HVExDX1NVUlZJVkFCSUxJVFlfUkVHKSAmIFZMVl9HRlhfQ0xLX1NUQVRVU19CSVQpCi0JLyogV2FpdCBmb3IgYSBwcmV2aW91cyBmb3JjZS1vZmYgdG8gc2V0dGxlICovCi0JaWYgKGZvcmNlX29uKSB7Ci0JCWVyciA9IHdhaXRfZm9yKCFDT05ELCAyMCk7Ci0JCWlmIChlcnIpIHsKLQkJCURSTV9FUlJPUigidGltZW91dCB3YWl0aW5nIGZvciBHRlggY2xvY2sgZm9yY2Utb2ZmICglMDh4KVxuIiwKLQkJCQkgIEk5MTVfUkVBRChWTFZfR1RMQ19TVVJWSVZBQklMSVRZX1JFRykpOwotCQkJcmV0dXJuIGVycjsKLQkJfQotCX0KIAogCXZhbCA9IEk5MTVfUkVBRChWTFZfR1RMQ19TVVJWSVZBQklMSVRZX1JFRyk7CiAJdmFsICY9IH5WTFZfR0ZYX0NMS19GT1JDRV9PTl9CSVQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAppbmRleCA4NzI3MDg2Li5iNGZhYTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKQEAgLTEwOTQsNiArMTA5NCw3IEBACiAJLyogRGlzcGxheSAyIENaIGRvbWFpbiAqLwogCXUzMiBndV9jdGwwOwogCXUzMiBndV9jdGwxOworCXUzMiBwY2JyOwogCXUzMiBjbG9ja19nYXRlX2RpczI7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwppbmRleCA1YjIwNTg2Li4yN2VhNmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKQEAgLTI3MzcsMjQgKzI3MzcsMTEgQEAKIAogCVdBUk5fT04oaTkxNV92ZXJpZnlfbGlzdHMocmluZy0+ZGV2KSk7CiAKLQkvKiBNb3ZlIGFueSBidWZmZXJzIG9uIHRoZSBhY3RpdmUgbGlzdCB0aGF0IGFyZSBubyBsb25nZXIgcmVmZXJlbmNlZAotCSAqIGJ5IHRoZSByaW5nYnVmZmVyIHRvIHRoZSBmbHVzaGluZy9pbmFjdGl2ZSBsaXN0cyBhcyBhcHByb3ByaWF0ZSwKLQkgKiBiZWZvcmUgd2UgZnJlZSB0aGUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RzLgorCS8qIFJldGlyZSByZXF1ZXN0cyBmaXJzdCBhcyB3ZSB1c2UgaXQgYWJvdmUgZm9yIHRoZSBlYXJseSByZXR1cm4uCisJICogSWYgd2UgcmV0aXJlIHJlcXVlc3RzIGxhc3QsIHdlIG1heSB1c2UgYSBsYXRlciBzZXFubyBhbmQgc28gY2xlYXIKKwkgKiB0aGUgcmVxdWVzdHMgbGlzdHMgd2l0aG91dCBjbGVhcmluZyB0aGUgYWN0aXZlIGxpc3QsIGxlYWRpbmcgdG8KKwkgKiBjb25mdXNpb24uCiAJICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZyaW5nLT5hY3RpdmVfbGlzdCkpIHsKLQkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKLQotCQlvYmogPSBsaXN0X2ZpcnN0X2VudHJ5KCZyaW5nLT5hY3RpdmVfbGlzdCwKLQkJCQkgICAgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCwKLQkJCQkgICAgICByaW5nX2xpc3QpOwotCi0JCWlmICghaTkxNV9nZW1fcmVxdWVzdF9jb21wbGV0ZWQob2JqLT5sYXN0X3JlYWRfcmVxLCB0cnVlKSkKLQkJCWJyZWFrOwotCi0JCWk5MTVfZ2VtX29iamVjdF9tb3ZlX3RvX2luYWN0aXZlKG9iaik7Ci0JfQotCi0KIAl3aGlsZSAoIWxpc3RfZW1wdHkoJnJpbmctPnJlcXVlc3RfbGlzdCkpIHsKIAkJc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0OwogCQlzdHJ1Y3QgaW50ZWxfcmluZ2J1ZmZlciAqcmluZ2J1ZjsKQEAgLTI3ODksNiArMjc3NiwyMyBAQAogCQlpOTE1X2dlbV9mcmVlX3JlcXVlc3QocmVxdWVzdCk7CiAJfQogCisJLyogTW92ZSBhbnkgYnVmZmVycyBvbiB0aGUgYWN0aXZlIGxpc3QgdGhhdCBhcmUgbm8gbG9uZ2VyIHJlZmVyZW5jZWQKKwkgKiBieSB0aGUgcmluZ2J1ZmZlciB0byB0aGUgZmx1c2hpbmcvaW5hY3RpdmUgbGlzdHMgYXMgYXBwcm9wcmlhdGUsCisJICogYmVmb3JlIHdlIGZyZWUgdGhlIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0cy4KKwkgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnJpbmctPmFjdGl2ZV9saXN0KSkgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJCW9iaiA9IGxpc3RfZmlyc3RfZW50cnkoJnJpbmctPmFjdGl2ZV9saXN0LAorCQkJCSAgICAgIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0LAorCQkJCSAgICAgIHJpbmdfbGlzdCk7CisKKwkJaWYgKCFpOTE1X2dlbV9yZXF1ZXN0X2NvbXBsZXRlZChvYmotPmxhc3RfcmVhZF9yZXEsIHRydWUpKQorCQkJYnJlYWs7CisKKwkJaTkxNV9nZW1fb2JqZWN0X21vdmVfdG9faW5hY3RpdmUob2JqKTsKKwl9CisKIAlpZiAodW5saWtlbHkocmluZy0+dHJhY2VfaXJxX3JlcSAmJgogCQkgICAgIGk5MTVfZ2VtX3JlcXVlc3RfY29tcGxldGVkKHJpbmctPnRyYWNlX2lycV9yZXEsIHRydWUpKSkgewogCQlyaW5nLT5pcnFfcHV0KHJpbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jCmluZGV4IGI3NzMzNjguLjM4YTc0MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKQEAgLTE0ODcsNyArMTQ4Nyw3IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCWlmIChpOTE1X25lZWRzX2NtZF9wYXJzZXIocmluZykpIHsKKwlpZiAoaTkxNV9uZWVkc19jbWRfcGFyc2VyKHJpbmcpICYmIGFyZ3MtPmJhdGNoX2xlbikgewogCQliYXRjaF9vYmogPSBpOTE1X2dlbV9leGVjYnVmZmVyX3BhcnNlKHJpbmcsCiAJCQkJCQkgICAgICAmc2hhZG93X2V4ZWNfZW50cnksCiAJCQkJCQkgICAgICBlYiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfdHJhY2UuaAppbmRleCA2MDU4YTAxLi5kNzc2NjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3RyYWNlLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV90cmFjZS5oCkBAIC0xMiw3ICsxMiw2IEBACiAKICN1bmRlZiBUUkFDRV9TWVNURU0KICNkZWZpbmUgVFJBQ0VfU1lTVEVNIGk5MTUKLSNkZWZpbmUgVFJBQ0VfU1lTVEVNX1NUUklORyBfX3N0cmluZ2lmeShUUkFDRV9TWVNURU0pCiAjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBpOTE1X3RyYWNlCiAKIC8qIHBpcGUgdXBkYXRlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCmluZGV4IDk5NDNjMjAuLmY3NTE3M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxkcm0vaTkxNV9kcm0uaD4KICNpbmNsdWRlICJpOTE1X2Rydi5oIgogI2luY2x1ZGUgImk5MTVfdHJhY2UuaCIKKyNpbmNsdWRlIDxkcm0vZHJtX2F0b21pYy5oPgogI2luY2x1ZGUgPGRybS9kcm1fYXRvbWljX2hlbHBlci5oPgogI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVscGVyLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgpAQCAtMjQxNiw2ICsyNDE3LDE0IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCisvKiBVcGRhdGUgcGxhbmUtPnN0YXRlLT5mYiB0byBtYXRjaCBwbGFuZS0+ZmIgYWZ0ZXIgZHJpdmVyLWludGVybmFsIHVwZGF0ZXMgKi8KK3N0YXRpYyB2b2lkCit1cGRhdGVfc3RhdGVfZmIoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUpCit7CisJaWYgKHBsYW5lLT5mYiAhPSBwbGFuZS0+c3RhdGUtPmZiKQorCQlkcm1fYXRvbWljX3NldF9mYl9mb3JfcGxhbmUocGxhbmUtPnN0YXRlLCBwbGFuZS0+ZmIpOworfQorCiBzdGF0aWMgdm9pZAogaW50ZWxfZmluZF9wbGFuZV9vYmooc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMsCiAJCSAgICAgc3RydWN0IGludGVsX2luaXRpYWxfcGxhbmVfY29uZmlnICpwbGFuZV9jb25maWcpCkBAIC0yNDI5LDggKzI0MzgsMTUgQEAKIAlpZiAoIWludGVsX2NydGMtPmJhc2UucHJpbWFyeS0+ZmIpCiAJCXJldHVybjsKIAotCWlmIChpbnRlbF9hbGxvY19wbGFuZV9vYmooaW50ZWxfY3J0YywgcGxhbmVfY29uZmlnKSkKKwlpZiAoaW50ZWxfYWxsb2NfcGxhbmVfb2JqKGludGVsX2NydGMsIHBsYW5lX2NvbmZpZykpIHsKKwkJc3RydWN0IGRybV9wbGFuZSAqcHJpbWFyeSA9IGludGVsX2NydGMtPmJhc2UucHJpbWFyeTsKKworCQlwcmltYXJ5LT5zdGF0ZS0+Y3J0YyA9ICZpbnRlbF9jcnRjLT5iYXNlOworCQlwcmltYXJ5LT5jcnRjID0gJmludGVsX2NydGMtPmJhc2U7CisJCXVwZGF0ZV9zdGF0ZV9mYihwcmltYXJ5KTsKKwogCQlyZXR1cm47CisJfQogCiAJa2ZyZWUoaW50ZWxfY3J0Yy0+YmFzZS5wcmltYXJ5LT5mYik7CiAJaW50ZWxfY3J0Yy0+YmFzZS5wcmltYXJ5LT5mYiA9IE5VTEw7CkBAIC0yNDUzLDE1ICsyNDY5LDIxIEBACiAJCQljb250aW51ZTsKIAogCQlpZiAoaTkxNV9nZW1fb2JqX2dndHRfb2Zmc2V0KG9iaikgPT0gcGxhbmVfY29uZmlnLT5iYXNlKSB7CisJCQlzdHJ1Y3QgZHJtX3BsYW5lICpwcmltYXJ5ID0gaW50ZWxfY3J0Yy0+YmFzZS5wcmltYXJ5OworCiAJCQlpZiAob2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKQogCQkJCWRldl9wcml2LT5wcmVzZXJ2ZV9iaW9zX3N3aXp6bGUgPSB0cnVlOwogCiAJCQlkcm1fZnJhbWVidWZmZXJfcmVmZXJlbmNlKGMtPnByaW1hcnktPmZiKTsKLQkJCWludGVsX2NydGMtPmJhc2UucHJpbWFyeS0+ZmIgPSBjLT5wcmltYXJ5LT5mYjsKKwkJCXByaW1hcnktPmZiID0gYy0+cHJpbWFyeS0+ZmI7CisJCQlwcmltYXJ5LT5zdGF0ZS0+Y3J0YyA9ICZpbnRlbF9jcnRjLT5iYXNlOworCQkJcHJpbWFyeS0+Y3J0YyA9ICZpbnRlbF9jcnRjLT5iYXNlOwogCQkJb2JqLT5mcm9udGJ1ZmZlcl9iaXRzIHw9IElOVEVMX0ZST05UQlVGRkVSX1BSSU1BUlkoaW50ZWxfY3J0Yy0+cGlwZSk7CiAJCQlicmVhazsKIAkJfQogCX0KKworCXVwZGF0ZV9zdGF0ZV9mYihpbnRlbF9jcnRjLT5iYXNlLnByaW1hcnkpOwogfQogCiBzdGF0aWMgdm9pZCBpOXh4X3VwZGF0ZV9wcmltYXJ5X3BsYW5lKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKQEAgLTY2MDIsNiArNjYyNCwxMCBAQAogCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiOwogCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmI7CiAKKwl2YWwgPSBJOTE1X1JFQUQoRFNQQ05UUihwbGFuZSkpOworCWlmICghKHZhbCAmIERJU1BMQVlfUExBTkVfRU5BQkxFKSkKKwkJcmV0dXJuOworCiAJaW50ZWxfZmIgPSBremFsbG9jKHNpemVvZigqaW50ZWxfZmIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWludGVsX2ZiKSB7CiAJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBhbGxvYyBmYlxuIik7CkBAIC02NjEwLDggKzY2MzYsNiBAQAogCiAJZmIgPSAmaW50ZWxfZmItPmJhc2U7CiAKLQl2YWwgPSBJOTE1X1JFQUQoRFNQQ05UUihwbGFuZSkpOwotCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpCiAJCWlmICh2YWwgJiBESVNQUExBTkVfVElMRUQpCiAJCQlwbGFuZV9jb25maWctPnRpbGluZyA9IEk5MTVfVElMSU5HX1g7CkBAIC03NjQzLDYgKzc2NjcsOSBAQAogCWZiID0gJmludGVsX2ZiLT5iYXNlOwogCiAJdmFsID0gSTkxNV9SRUFEKFBMQU5FX0NUTChwaXBlLCAwKSk7CisJaWYgKCEodmFsICYgUExBTkVfQ1RMX0VOQUJMRSkpCisJCWdvdG8gZXJyb3I7CisKIAlpZiAodmFsICYgUExBTkVfQ1RMX1RJTEVEX01BU0spCiAJCXBsYW5lX2NvbmZpZy0+dGlsaW5nID0gSTkxNV9USUxJTkdfWDsKIApAQCAtNzczMCw2ICs3NzU3LDEwIEBACiAJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CiAJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYjsKIAorCXZhbCA9IEk5MTVfUkVBRChEU1BDTlRSKHBpcGUpKTsKKwlpZiAoISh2YWwgJiBESVNQTEFZX1BMQU5FX0VOQUJMRSkpCisJCXJldHVybjsKKwogCWludGVsX2ZiID0ga3phbGxvYyhzaXplb2YoKmludGVsX2ZiKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbnRlbF9mYikgewogCQlEUk1fREVCVUdfS01TKCJmYWlsZWQgdG8gYWxsb2MgZmJcbiIpOwpAQCAtNzczOCw4ICs3NzY5LDYgQEAKIAogCWZiID0gJmludGVsX2ZiLT5iYXNlOwogCi0JdmFsID0gSTkxNV9SRUFEKERTUENOVFIocGlwZSkpOwotCiAJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpCiAJCWlmICh2YWwgJiBESVNQUExBTkVfVElMRUQpCiAJCQlwbGFuZV9jb25maWctPnRpbGluZyA9IEk5MTVfVElMSU5HX1g7CkBAIC05ODE2LDYgKzk4NDUsNyBAQAogCWRybV9nZW1fb2JqZWN0X3JlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAogCWNydGMtPnByaW1hcnktPmZiID0gZmI7CisJdXBkYXRlX3N0YXRlX2ZiKGNydGMtPnByaW1hcnkpOwogCiAJd29yay0+cGVuZGluZ19mbGlwX29iaiA9IG9iajsKIApAQCAtOTg4NCw2ICs5OTE0LDcgQEAKIGNsZWFudXBfcGVuZGluZzoKIAlhdG9taWNfZGVjKCZpbnRlbF9jcnRjLT51bnBpbl93b3JrX2NvdW50KTsKIAljcnRjLT5wcmltYXJ5LT5mYiA9IG9sZF9mYjsKKwl1cGRhdGVfc3RhdGVfZmIoY3J0Yy0+cHJpbWFyeSk7CiAJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2UoJndvcmstPm9sZF9mYl9vYmotPmJhc2UpOwogCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZvYmotPmJhc2UpOwogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtMTM3MTgsNiArMTM3NDksNyBAQAogCQkJCSAgdG9faW50ZWxfY3J0YyhjKS0+cGlwZSk7CiAJCQlkcm1fZnJhbWVidWZmZXJfdW5yZWZlcmVuY2UoYy0+cHJpbWFyeS0+ZmIpOwogCQkJYy0+cHJpbWFyeS0+ZmIgPSBOVUxMOworCQkJdXBkYXRlX3N0YXRlX2ZiKGMtPnByaW1hcnkpOwogCQl9CiAJfQogCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc3ByaXRlLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJpdGUuYwppbmRleCAwYTUyYzQ0Li45YzU0NTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJpdGUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zcHJpdGUuYwpAQCAtMTMyMiw3ICsxMzIyLDcgQEAKIAlkcm1fbW9kZXNldF9sb2NrX2FsbChkZXYpOwogCiAJcGxhbmUgPSBkcm1fcGxhbmVfZmluZChkZXYsIHNldC0+cGxhbmVfaWQpOwotCWlmICghcGxhbmUpIHsKKwlpZiAoIXBsYW5lIHx8IHBsYW5lLT50eXBlICE9IERSTV9QTEFORV9UWVBFX09WRVJMQVkpIHsKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KQEAgLTEzNDksNyArMTM0OSw3IEBACiAJZHJtX21vZGVzZXRfbG9ja19hbGwoZGV2KTsKIAogCXBsYW5lID0gZHJtX3BsYW5lX2ZpbmQoZGV2LCBnZXQtPnBsYW5lX2lkKTsKLQlpZiAoIXBsYW5lKSB7CisJaWYgKCFwbGFuZSB8fCBwbGFuZS0+dHlwZSAhPSBEUk1fUExBTkVfVFlQRV9PVkVSTEFZKSB7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2VkcC9lZHBfY3RybC5jIGIvZHJpdmVycy9ncHUvZHJtL21zbS9lZHAvZWRwX2N0cmwuYwppbmRleCAzZTI0NjIxLi4wZWM1YWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbXNtL2VkcC9lZHBfY3RybC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9tc20vZWRwL2VkcF9jdHJsLmMKQEAgLTMzMiw3ICszMzIsNyBAQAogCQlnb3RvIHZkZGFfc2V0X2ZhaWw7CiAJfQogCi0JcmV0ID0gcmVndWxhdG9yX3NldF9vcHRpbXVtX21vZGUoY3RybC0+dmRkYV92cmVnLCBWRERBX1VBX09OX0xPQUQpOworCXJldCA9IHJlZ3VsYXRvcl9zZXRfbG9hZChjdHJsLT52ZGRhX3ZyZWcsIFZEREFfVUFfT05fTE9BRCk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfZXJyKCIlczogdmRkYV92cmVnIHNldCByZWd1bGF0b3IgbW9kZSBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gdmRkYV9zZXRfZmFpbDsKQEAgLTM1Niw3ICszNTYsNyBAQAogbHZsX2VuYWJsZV9mYWlsOgogCXJlZ3VsYXRvcl9kaXNhYmxlKGN0cmwtPnZkZGFfdnJlZyk7CiB2ZGRhX2VuYWJsZV9mYWlsOgotCXJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2RlKGN0cmwtPnZkZGFfdnJlZywgVkREQV9VQV9PRkZfTE9BRCk7CisJcmVndWxhdG9yX3NldF9sb2FkKGN0cmwtPnZkZGFfdnJlZywgVkREQV9VQV9PRkZfTE9BRCk7CiB2ZGRhX3NldF9mYWlsOgogCXJldHVybiByZXQ7CiB9CkBAIC0zNjUsNyArMzY1LDcgQEAKIHsKIAlyZWd1bGF0b3JfZGlzYWJsZShjdHJsLT5sdmxfdnJlZyk7CiAJcmVndWxhdG9yX2Rpc2FibGUoY3RybC0+dmRkYV92cmVnKTsKLQlyZWd1bGF0b3Jfc2V0X29wdGltdW1fbW9kZShjdHJsLT52ZGRhX3ZyZWcsIFZEREFfVUFfT0ZGX0xPQUQpOworCXJlZ3VsYXRvcl9zZXRfbG9hZChjdHJsLT52ZGRhX3ZyZWcsIFZEREFfVUFfT0ZGX0xPQUQpOwogfQogCiBzdGF0aWMgaW50IGVkcF9ncGlvX2NvbmZpZyhzdHJ1Y3QgZWRwX2N0cmwgKmN0cmwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvYmFzZS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZGV2aWNlL2Jhc2UuYwppbmRleCAyOWJkNTM5Li42ZWZhOGYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvYmFzZS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2RldmljZS9iYXNlLmMKQEAgLTM0MCwxMSArMzQwLDEzIEBACiAKIAkJLyogc3dpdGNoIG1taW8gdG8gY3B1J3MgbmF0aXZlIGVuZGlhbm5lc3MgKi8KICNpZm5kZWYgX19CSUdfRU5ESUFOCi0JCWlmIChpb3JlYWQzMl9uYXRpdmUobWFwICsgMHgwMDAwMDQpICE9IDB4MDAwMDAwMDApCisJCWlmIChpb3JlYWQzMl9uYXRpdmUobWFwICsgMHgwMDAwMDQpICE9IDB4MDAwMDAwMDApIHsKICNlbHNlCi0JCWlmIChpb3JlYWQzMl9uYXRpdmUobWFwICsgMHgwMDAwMDQpID09IDB4MDAwMDAwMDApCisJCWlmIChpb3JlYWQzMl9uYXRpdmUobWFwICsgMHgwMDAwMDQpID09IDB4MDAwMDAwMDApIHsKICNlbmRpZgogCQkJaW93cml0ZTMyX25hdGl2ZSgweDAxMDAwMDAxLCBtYXAgKyAweDAwMDAwNCk7CisJCQlpb3JlYWQzMl9uYXRpdmUobWFwKTsKKwkJfQogCiAJCS8qIHJlYWQgYm9vdDAgYW5kIHN0cmFwcGluZyBpbmZvcm1hdGlvbiAqLwogCQlib290MCA9IGlvcmVhZDMyX25hdGl2ZShtYXAgKyAweDAwMDAwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9kZXZpY2UvZ20xMDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2RldmljZS9nbTEwMC5jCmluZGV4IDUzOTU2MWUuLjEwOGQwNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2RldmljZS9nbTEwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2RldmljZS9nbTEwMC5jCkBAIC0xNDIsNiArMTQyLDQ5IEBACiAJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9NU1BQUCAgXSA9ICZnZjEwMF9tc3BwcF9vY2xhc3M7CiAjZW5kaWYKIAkJYnJlYWs7CisJY2FzZSAweDEyNjoKKwkJZGV2aWNlLT5jbmFtZSA9ICJHTTIwNiI7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9WQklPUyAgXSA9ICZudmttX2Jpb3Nfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfR1BJTyAgIF0gPSAgZ2sxMDRfZ3Bpb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JMkMgICAgXSA9ICBnbTIwNF9pMmNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfRlVTRSAgIF0gPSAmZ20xMDdfZnVzZV9vY2xhc3M7CisjaWYgMAorCQkvKiBsb29rcyB0byBiZSBzb21lIG5vbi10cml2aWFsIGNoYW5nZXMgKi8KKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0NMSyAgICBdID0gJmdrMTA0X2Nsa19vY2xhc3M7CisJCS8qIHByaXYgcmluZyBzYXlzIG5vIHRvIDB4MTBlYjE0IHdyaXRlcyAqLworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfVEhFUk0gIF0gPSAmZ20xMDdfdGhlcm1fb2NsYXNzOworI2VuZGlmCisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9NWE0gICAgXSA9ICZudjUwX214bV9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9ERVZJTklUXSA9ICBnbTIwNF9kZXZpbml0X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX01DICAgICBdID0gIGdrMjBhX21jX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JVUyAgICBdID0gIGdmMTAwX2J1c19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9USU1FUiAgXSA9ICZnazIwYV90aW1lcl9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9GQiAgICAgXSA9ICBnbTEwN19mYl9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9MVEMgICAgXSA9ICBnbTEwN19sdGNfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfSUJVUyAgIF0gPSAmZ2sxMDRfaWJ1c19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9JTlNUTUVNXSA9ICBudjUwX2luc3RtZW1fb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9TVUJERVZfTU1VICAgIF0gPSAmZ2YxMDBfbW11X29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX0JBUiAgICBdID0gJmdmMTAwX2Jhcl9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX1NVQkRFVl9QTVUgICAgXSA9ICBnazIwOF9wbXVfb2NsYXNzOworI2lmIDAKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfU1VCREVWX1ZPTFQgICBdID0gJm52NDBfdm9sdF9vY2xhc3M7CisjZW5kaWYKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0RNQU9CSiBdID0gIGdmMTEwX2RtYWVuZ19vY2xhc3M7CisjaWYgMAorCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfRklGTyAgIF0gPSAgZ2syMDhfZmlmb19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9TVyAgICAgXSA9ICBnZjEwMF9zd19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9HUiAgICAgXSA9ICBnbTEwN19ncl9vY2xhc3M7CisjZW5kaWYKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0RJU1AgICBdID0gIGdtMjA0X2Rpc3Bfb2NsYXNzOworI2lmIDAKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX0NFMCAgICBdID0gJmdtMjA0X2NlMF9vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9DRTEgICAgXSA9ICZnbTIwNF9jZTFfb2NsYXNzOworCQlkZXZpY2UtPm9jbGFzc1tOVkRFVl9FTkdJTkVfQ0UyICAgIF0gPSAmZ20yMDRfY2UyX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX01TVkxEICBdID0gJmdrMTA0X21zdmxkX29jbGFzczsKKwkJZGV2aWNlLT5vY2xhc3NbTlZERVZfRU5HSU5FX01TUERFQyBdID0gJmdrMTA0X21zcGRlY19vY2xhc3M7CisJCWRldmljZS0+b2NsYXNzW05WREVWX0VOR0lORV9NU1BQUCAgXSA9ICZnZjEwMF9tc3BwcF9vY2xhc3M7CisjZW5kaWYKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJbnZfZmF0YWwoZGV2aWNlLCAidW5rbm93biBNYXh3ZWxsIGNoaXBzZXRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2ZpZm8vbnYwNC5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZmlmby9udjA0LmMKaW5kZXggYjAzOGI2ZS4uMDQzZTQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZmlmby9udjA0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZmlmby9udjA0LmMKQEAgLTUwMiw3MiArNTAyLDU3IEBACiB7CiAJc3RydWN0IG52a21fZGV2aWNlICpkZXZpY2UgPSBudl9kZXZpY2Uoc3ViZGV2KTsKIAlzdHJ1Y3QgbnYwNF9maWZvX3ByaXYgKnByaXYgPSAodm9pZCAqKXN1YmRldjsKLQl1aW50MzJfdCBzdGF0dXMsIHJlYXNzaWduOwotCWludCBjbnQgPSAwOworCXUzMiBtYXNrID0gbnZfcmQzMihwcml2LCBOVjAzX1BGSUZPX0lOVFJfRU5fMCk7CisJdTMyIHN0YXQgPSBudl9yZDMyKHByaXYsIE5WMDNfUEZJRk9fSU5UUl8wKSAmIG1hc2s7CisJdTMyIHJlYXNzaWduLCBjaGlkLCBnZXQsIHNlbTsKIAogCXJlYXNzaWduID0gbnZfcmQzMihwcml2LCBOVjAzX1BGSUZPX0NBQ0hFUykgJiAxOwotCXdoaWxlICgoc3RhdHVzID0gbnZfcmQzMihwcml2LCBOVjAzX1BGSUZPX0lOVFJfMCkpICYmIChjbnQrKyA8IDEwMCkpIHsKLQkJdWludDMyX3QgY2hpZCwgZ2V0OworCW52X3dyMzIocHJpdiwgTlYwM19QRklGT19DQUNIRVMsIDApOwogCi0JCW52X3dyMzIocHJpdiwgTlYwM19QRklGT19DQUNIRVMsIDApOworCWNoaWQgPSBudl9yZDMyKHByaXYsIE5WMDNfUEZJRk9fQ0FDSEUxX1BVU0gxKSAmIHByaXYtPmJhc2UubWF4OworCWdldCAgPSBudl9yZDMyKHByaXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCk7CiAKLQkJY2hpZCA9IG52X3JkMzIocHJpdiwgTlYwM19QRklGT19DQUNIRTFfUFVTSDEpICYgcHJpdi0+YmFzZS5tYXg7Ci0JCWdldCAgPSBudl9yZDMyKHByaXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCk7Ci0KLQkJaWYgKHN0YXR1cyAmIE5WX1BGSUZPX0lOVFJfQ0FDSEVfRVJST1IpIHsKLQkJCW52MDRfZmlmb19jYWNoZV9lcnJvcihkZXZpY2UsIHByaXYsIGNoaWQsIGdldCk7Ci0JCQlzdGF0dXMgJj0gfk5WX1BGSUZPX0lOVFJfQ0FDSEVfRVJST1I7Ci0JCX0KLQotCQlpZiAoc3RhdHVzICYgTlZfUEZJRk9fSU5UUl9ETUFfUFVTSEVSKSB7Ci0JCQludjA0X2ZpZm9fZG1hX3B1c2hlcihkZXZpY2UsIHByaXYsIGNoaWQpOwotCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX0RNQV9QVVNIRVI7Ci0JCX0KLQotCQlpZiAoc3RhdHVzICYgTlZfUEZJRk9fSU5UUl9TRU1BUEhPUkUpIHsKLQkJCXVpbnQzMl90IHNlbTsKLQotCQkJc3RhdHVzICY9IH5OVl9QRklGT19JTlRSX1NFTUFQSE9SRTsKLQkJCW52X3dyMzIocHJpdiwgTlYwM19QRklGT19JTlRSXzAsCi0JCQkJTlZfUEZJRk9fSU5UUl9TRU1BUEhPUkUpOwotCi0JCQlzZW0gPSBudl9yZDMyKHByaXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1NFTUFQSE9SRSk7Ci0JCQludl93cjMyKHByaXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1NFTUFQSE9SRSwgc2VtIHwgMHgxKTsKLQotCQkJbnZfd3IzMihwcml2LCBOVjAzX1BGSUZPX0NBQ0hFMV9HRVQsIGdldCArIDQpOwotCQkJbnZfd3IzMihwcml2LCBOVjA0X1BGSUZPX0NBQ0hFMV9QVUxMMCwgMSk7Ci0JCX0KLQotCQlpZiAoZGV2aWNlLT5jYXJkX3R5cGUgPT0gTlZfNTApIHsKLQkJCWlmIChzdGF0dXMgJiAweDAwMDAwMDEwKSB7Ci0JCQkJc3RhdHVzICY9IH4weDAwMDAwMDEwOwotCQkJCW52X3dyMzIocHJpdiwgMHgwMDIxMDAsIDB4MDAwMDAwMTApOwotCQkJfQotCi0JCQlpZiAoc3RhdHVzICYgMHg0MDAwMDAwMCkgewotCQkJCW52X3dyMzIocHJpdiwgMHgwMDIxMDAsIDB4NDAwMDAwMDApOwotCQkJCW52a21fZmlmb191ZXZlbnQoJnByaXYtPmJhc2UpOwotCQkJCXN0YXR1cyAmPSB+MHg0MDAwMDAwMDsKLQkJCX0KLQkJfQotCi0JCWlmIChzdGF0dXMpIHsKLQkJCW52X3dhcm4ocHJpdiwgInVua25vd24gaW50ciAweCUwOHgsIGNoICVkXG4iLAotCQkJCXN0YXR1cywgY2hpZCk7Ci0JCQludl93cjMyKHByaXYsIE5WMDNfUEZJRk9fSU5UUl8wLCBzdGF0dXMpOwotCQkJc3RhdHVzID0gMDsKLQkJfQotCi0JCW52X3dyMzIocHJpdiwgTlYwM19QRklGT19DQUNIRVMsIHJlYXNzaWduKTsKKwlpZiAoc3RhdCAmIE5WX1BGSUZPX0lOVFJfQ0FDSEVfRVJST1IpIHsKKwkJbnYwNF9maWZvX2NhY2hlX2Vycm9yKGRldmljZSwgcHJpdiwgY2hpZCwgZ2V0KTsKKwkJc3RhdCAmPSB+TlZfUEZJRk9fSU5UUl9DQUNIRV9FUlJPUjsKIAl9CiAKLQlpZiAoc3RhdHVzKSB7Ci0JCW52X2Vycm9yKHByaXYsICJzdGlsbCBhbmdyeSBhZnRlciAlZCBzcGlucywgaGFsdFxuIiwgY250KTsKLQkJbnZfd3IzMihwcml2LCAweDAwMjE0MCwgMCk7Ci0JCW52X3dyMzIocHJpdiwgMHgwMDAxNDAsIDApOworCWlmIChzdGF0ICYgTlZfUEZJRk9fSU5UUl9ETUFfUFVTSEVSKSB7CisJCW52MDRfZmlmb19kbWFfcHVzaGVyKGRldmljZSwgcHJpdiwgY2hpZCk7CisJCXN0YXQgJj0gfk5WX1BGSUZPX0lOVFJfRE1BX1BVU0hFUjsKIAl9CiAKLQludl93cjMyKHByaXYsIDB4MDAwMTAwLCAweDAwMDAwMTAwKTsKKwlpZiAoc3RhdCAmIE5WX1BGSUZPX0lOVFJfU0VNQVBIT1JFKSB7CisJCXN0YXQgJj0gfk5WX1BGSUZPX0lOVFJfU0VNQVBIT1JFOworCQludl93cjMyKHByaXYsIE5WMDNfUEZJRk9fSU5UUl8wLCBOVl9QRklGT19JTlRSX1NFTUFQSE9SRSk7CisKKwkJc2VtID0gbnZfcmQzMihwcml2LCBOVjEwX1BGSUZPX0NBQ0hFMV9TRU1BUEhPUkUpOworCQludl93cjMyKHByaXYsIE5WMTBfUEZJRk9fQ0FDSEUxX1NFTUFQSE9SRSwgc2VtIHwgMHgxKTsKKworCQludl93cjMyKHByaXYsIE5WMDNfUEZJRk9fQ0FDSEUxX0dFVCwgZ2V0ICsgNCk7CisJCW52X3dyMzIocHJpdiwgTlYwNF9QRklGT19DQUNIRTFfUFVMTDAsIDEpOworCX0KKworCWlmIChkZXZpY2UtPmNhcmRfdHlwZSA9PSBOVl81MCkgeworCQlpZiAoc3RhdCAmIDB4MDAwMDAwMTApIHsKKwkJCXN0YXQgJj0gfjB4MDAwMDAwMTA7CisJCQludl93cjMyKHByaXYsIDB4MDAyMTAwLCAweDAwMDAwMDEwKTsKKwkJfQorCisJCWlmIChzdGF0ICYgMHg0MDAwMDAwMCkgeworCQkJbnZfd3IzMihwcml2LCAweDAwMjEwMCwgMHg0MDAwMDAwMCk7CisJCQludmttX2ZpZm9fdWV2ZW50KCZwcml2LT5iYXNlKTsKKwkJCXN0YXQgJj0gfjB4NDAwMDAwMDA7CisJCX0KKwl9CisKKwlpZiAoc3RhdCkgeworCQludl93YXJuKHByaXYsICJ1bmtub3duIGludHIgMHglMDh4XG4iLCBzdGF0KTsKKwkJbnZfbWFzayhwcml2LCBOVjAzX1BGSUZPX0lOVFJfRU5fMCwgc3RhdCwgMHgwMDAwMDAwMCk7CisJCW52X3dyMzIocHJpdiwgTlYwM19QRklGT19JTlRSXzAsIHN0YXQpOworCX0KKworCW52X3dyMzIocHJpdiwgTlYwM19QRklGT19DQUNIRVMsIHJlYXNzaWduKTsKIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZ3IvY3R4Z2YxMDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2dyL2N0eGdmMTAwLmMKaW5kZXggMmU3ZWMzOC4uNTdlMmM1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZ3IvY3R4Z2YxMDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9nci9jdHhnZjEwMC5jCkBAIC0xMDMyLDkgKzEwMzIsOSBAQAogCWNvbnN0IGludCBzID0gODsKIAljb25zdCBpbnQgYiA9IG1taW9fdnJhbShpbmZvLCBpbXBsLT5idW5kbGVfc2l6ZSwgKDEgPDwgcyksIGFjY2Vzcyk7CiAJbW1pb19yZWZuKGluZm8sIDB4NDA4MDA0LCAweDAwMDAwMDAwLCBzLCBiKTsKLQltbWlvX3JlZm4oaW5mbywgMHg0MDgwMDgsIDB4ODAwMDAwMDAgfCAoaW1wbC0+YnVuZGxlX3NpemUgPj4gcyksIDAsIGIpOworCW1taW9fd3IzMihpbmZvLCAweDQwODAwOCwgMHg4MDAwMDAwMCB8IChpbXBsLT5idW5kbGVfc2l6ZSA+PiBzKSk7CiAJbW1pb19yZWZuKGluZm8sIDB4NDE4ODA4LCAweDAwMDAwMDAwLCBzLCBiKTsKLQltbWlvX3JlZm4oaW5mbywgMHg0MTg4MGMsIDB4ODAwMDAwMDAgfCAoaW1wbC0+YnVuZGxlX3NpemUgPj4gcyksIDAsIGIpOworCW1taW9fd3IzMihpbmZvLCAweDQxODgwYywgMHg4MDAwMDAwMCB8IChpbXBsLT5idW5kbGVfc2l6ZSA+PiBzKSk7CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2dyL2N0eGdrMTA0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9nci9jdHhnazEwNC5jCmluZGV4IGI1MjMwMGQuLjVlOTQ1NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2dyL2N0eGdrMTA0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZ3IvY3R4Z2sxMDQuYwpAQCAtODUxLDkgKzg1MSw5IEBACiAJY29uc3QgaW50IHMgPSA4OwogCWNvbnN0IGludCBiID0gbW1pb192cmFtKGluZm8sIGltcGwtPmJ1bmRsZV9zaXplLCAoMSA8PCBzKSwgYWNjZXNzKTsKIAltbWlvX3JlZm4oaW5mbywgMHg0MDgwMDQsIDB4MDAwMDAwMDAsIHMsIGIpOwotCW1taW9fcmVmbihpbmZvLCAweDQwODAwOCwgMHg4MDAwMDAwMCB8IChpbXBsLT5idW5kbGVfc2l6ZSA+PiBzKSwgMCwgYik7CisJbW1pb193cjMyKGluZm8sIDB4NDA4MDA4LCAweDgwMDAwMDAwIHwgKGltcGwtPmJ1bmRsZV9zaXplID4+IHMpKTsKIAltbWlvX3JlZm4oaW5mbywgMHg0MTg4MDgsIDB4MDAwMDAwMDAsIHMsIGIpOwotCW1taW9fcmVmbihpbmZvLCAweDQxODgwYywgMHg4MDAwMDAwMCB8IChpbXBsLT5idW5kbGVfc2l6ZSA+PiBzKSwgMCwgYik7CisJbW1pb193cjMyKGluZm8sIDB4NDE4ODBjLCAweDgwMDAwMDAwIHwgKGltcGwtPmJ1bmRsZV9zaXplID4+IHMpKTsKIAltbWlvX3dyMzIoaW5mbywgMHg0MDY0YzgsIChzdGF0ZV9saW1pdCA8PCAxNikgfCB0b2tlbl9saW1pdCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2dyL2N0eGdtMTA3LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL2VuZ2luZS9nci9jdHhnbTEwNy5jCmluZGV4IDk1NmY0ZGMuLmIyZmFlNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vZW5naW5lL2dyL2N0eGdtMTA3LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9lbmdpbmUvZ3IvY3R4Z20xMDcuYwpAQCAtODcxLDkgKzg3MSw5IEBACiAJY29uc3QgaW50IHMgPSA4OwogCWNvbnN0IGludCBiID0gbW1pb192cmFtKGluZm8sIGltcGwtPmJ1bmRsZV9zaXplLCAoMSA8PCBzKSwgYWNjZXNzKTsKIAltbWlvX3JlZm4oaW5mbywgMHg0MDgwMDQsIDB4MDAwMDAwMDAsIHMsIGIpOwotCW1taW9fcmVmbihpbmZvLCAweDQwODAwOCwgMHg4MDAwMDAwMCB8IChpbXBsLT5idW5kbGVfc2l6ZSA+PiBzKSwgMCwgYik7CisJbW1pb193cjMyKGluZm8sIDB4NDA4MDA4LCAweDgwMDAwMDAwIHwgKGltcGwtPmJ1bmRsZV9zaXplID4+IHMpKTsKIAltbWlvX3JlZm4oaW5mbywgMHg0MThlMjQsIDB4MDAwMDAwMDAsIHMsIGIpOwotCW1taW9fcmVmbihpbmZvLCAweDQxOGUyOCwgMHg4MDAwMDAwMCB8IChpbXBsLT5idW5kbGVfc2l6ZSA+PiBzKSwgMCwgYik7CisJbW1pb193cjMyKGluZm8sIDB4NDE4ZTI4LCAweDgwMDAwMDAwIHwgKGltcGwtPmJ1bmRsZV9zaXplID4+IHMpKTsKIAltbWlvX3dyMzIoaW5mbywgMHg0MDY0YzgsIChzdGF0ZV9saW1pdCA8PCAxNikgfCB0b2tlbl9saW1pdCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vc3ViZGV2L2Jpb3MvaTJjLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmttL3N1YmRldi9iaW9zL2kyYy5jCmluZGV4IGQxYTg5YjIuLmM0ZTFmMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252a20vc3ViZGV2L2Jpb3MvaTJjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvYmlvcy9pMmMuYwpAQCAtNzQsNyArNzQsMTEgQEAKIAl1MTYgZW50ID0gZGNiX2kyY19lbnRyeShiaW9zLCBpZHgsICZ2ZXIsICZsZW4pOwogCWlmIChlbnQpIHsKIAkJaWYgKHZlciA+PSAweDQxKSB7Ci0JCQlpZiAoIShudl9ybzMyKGJpb3MsIGVudCkgJiAweDgwMDAwMDAwKSkKKwkJCXUzMiBlbnRfdmFsdWUgPSBudl9ybzMyKGJpb3MsIGVudCk7CisJCQl1OCBpMmNfcG9ydCA9IChlbnRfdmFsdWUgPj4gMjcpICYgMHgxZjsKKwkJCXU4IGRwYXV4X3BvcnQgPSAoZW50X3ZhbHVlID4+IDIyKSAmIDB4MWY7CisJCQkvKiB2YWx1ZSAweDFmIG1lYW5zIHVudXNlZCBhY2NvcmRpbmcgdG8gRENCIDQueCBzcGVjICovCisJCQlpZiAoaTJjX3BvcnQgPT0gMHgxZiAmJiBkcGF1eF9wb3J0ID09IDB4MWYpCiAJCQkJaW5mby0+dHlwZSA9IERDQl9JMkNfVU5VU0VEOwogCQkJZWxzZQogCQkJCWluZm8tPnR5cGUgPSBEQ0JfSTJDX1BNR1I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2Npa2QuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lrZC5oCmluZGV4IGM2NDhlMTkuLjI0M2EzNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lrZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vY2lrZC5oCkBAIC0yMTI5LDYgKzIxMjksNyBAQAogI2RlZmluZSBWQ0VfVUVOQ19SRUdfQ0xPQ0tfR0FUSU5HCTB4MjA3YzAKICNkZWZpbmUgVkNFX1NZU19JTlRfRU4JCQkweDIxMzAwCiAjCWRlZmluZSBWQ0VfU1lTX0lOVF9UUkFQX0lOVEVSUlVQVF9FTgkoMSA8PCAzKQorI2RlZmluZSBWQ0VfTE1JX1ZDUFVfQ0FDSEVfNDBCSVRfQkFSCTB4MjE0NWMKICNkZWZpbmUgVkNFX0xNSV9DVFJMMgkJCTB4MjE0NzQKICNkZWZpbmUgVkNFX0xNSV9DVFJMCQkJMHgyMTQ5OAogI2RlZmluZSBWQ0VfTE1JX1ZNX0NUUkwJCQkweDIxNGEwCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb24uaAppbmRleCA1NTg3NjAzLi4zM2Q1YTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbi5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uLmgKQEAgLTE1NjUsNiArMTU2NSw3IEBACiAJaW50CQkJbmV3X2FjdGl2ZV9jcnRjX2NvdW50OwogCXUzMgkJCWN1cnJlbnRfYWN0aXZlX2NydGNzOwogCWludAkJCWN1cnJlbnRfYWN0aXZlX2NydGNfY291bnQ7CisJYm9vbCBzaW5nbGVfZGlzcGxheTsKIAlzdHJ1Y3QgcmFkZW9uX2RwbV9keW5hbWljX3N0YXRlIGR5bl9zdGF0ZTsKIAlzdHJ1Y3QgcmFkZW9uX2RwbV9mYW4gZmFuOwogCXUzMiB0ZHBfbGltaXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iaW9zLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9iaW9zLmMKaW5kZXggNjNjY2I4Zi4uZDI3ZTRjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYmlvcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2Jpb3MuYwpAQCAtNzYsNyArNzYsNyBAQAogCiBzdGF0aWMgYm9vbCByYWRlb25fcmVhZF9iaW9zKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2KQogewotCXVpbnQ4X3QgX19pb21lbSAqYmlvczsKKwl1aW50OF90IF9faW9tZW0gKmJpb3MsIHZhbDEsIHZhbDI7CiAJc2l6ZV90IHNpemU7CiAKIAlyZGV2LT5iaW9zID0gTlVMTDsKQEAgLTg2LDE1ICs4NiwxOSBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JaWYgKHNpemUgPT0gMCB8fCBiaW9zWzBdICE9IDB4NTUgfHwgYmlvc1sxXSAhPSAweGFhKSB7CisJdmFsMSA9IHJlYWRiKCZiaW9zWzBdKTsKKwl2YWwyID0gcmVhZGIoJmJpb3NbMV0pOworCisJaWYgKHNpemUgPT0gMCB8fCB2YWwxICE9IDB4NTUgfHwgdmFsMiAhPSAweGFhKSB7CiAJCXBjaV91bm1hcF9yb20ocmRldi0+cGRldiwgYmlvcyk7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JcmRldi0+YmlvcyA9IGttZW1kdXAoYmlvcywgc2l6ZSwgR0ZQX0tFUk5FTCk7CisJcmRldi0+YmlvcyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJkZXYtPmJpb3MgPT0gTlVMTCkgewogCQlwY2lfdW5tYXBfcm9tKHJkZXYtPnBkZXYsIGJpb3MpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQorCW1lbWNweV9mcm9taW8ocmRldi0+YmlvcywgYmlvcywgc2l6ZSk7CiAJcGNpX3VubWFwX3JvbShyZGV2LT5wZGV2LCBiaW9zKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2tmZC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa2ZkLmMKaW5kZXggMDYxZWFhOS4uMTIyZWI1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa2ZkLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fa2ZkLmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogCQkJLmNvbXB1dGVfdm1pZF9iaXRtYXAgPSAweEZGMDAsCiAKIAkJCS5maXJzdF9jb21wdXRlX3BpcGUgPSAxLAotCQkJLmNvbXB1dGVfcGlwZV9jb3VudCA9IDggLSAxLAorCQkJLmNvbXB1dGVfcGlwZV9jb3VudCA9IDQgLSAxLAogCQl9OwogCiAJCXJhZGVvbl9kb29yYmVsbF9nZXRfa2ZkX2luZm8ocmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21uLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9tbi5jCmluZGV4IGE2OWJkNDQuLjU3MmI0ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX21uLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fbW4uYwpAQCAtMTIyLDcgKzEyMiw2IEBACiAJaXQgPSBpbnRlcnZhbF90cmVlX2l0ZXJfZmlyc3QoJnJtbi0+b2JqZWN0cywgc3RhcnQsIGVuZCk7CiAJd2hpbGUgKGl0KSB7CiAJCXN0cnVjdCByYWRlb25fYm8gKmJvOwotCQlzdHJ1Y3QgZmVuY2UgKmZlbmNlOwogCQlpbnQgcjsKIAogCQlibyA9IGNvbnRhaW5lcl9vZihpdCwgc3RydWN0IHJhZGVvbl9ibywgbW5faXQpOwpAQCAtMTM0LDEyICsxMzMsMTAgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJZmVuY2UgPSByZXNlcnZhdGlvbl9vYmplY3RfZ2V0X2V4Y2woYm8tPnRiby5yZXN2KTsKLQkJaWYgKGZlbmNlKSB7Ci0JCQlyID0gcmFkZW9uX2ZlbmNlX3dhaXQoKHN0cnVjdCByYWRlb25fZmVuY2UgKilmZW5jZSwgZmFsc2UpOwotCQkJaWYgKHIpCi0JCQkJRFJNX0VSUk9SKCIoJWQpIGZhaWxlZCB0byB3YWl0IGZvciB1c2VyIGJvXG4iLCByKTsKLQkJfQorCQlyID0gcmVzZXJ2YXRpb25fb2JqZWN0X3dhaXRfdGltZW91dF9yY3UoYm8tPnRiby5yZXN2LCB0cnVlLAorCQkJZmFsc2UsIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsKKwkJaWYgKHIpCisJCQlEUk1fRVJST1IoIiglZCkgZmFpbGVkIHRvIHdhaXQgZm9yIHVzZXIgYm9cbiIsIHIpOwogCiAJCXJhZGVvbl90dG1fcGxhY2VtZW50X2Zyb21fZG9tYWluKGJvLCBSQURFT05fR0VNX0RPTUFJTl9DUFUpOwogCQlyID0gdHRtX2JvX3ZhbGlkYXRlKCZiby0+dGJvLCAmYm8tPnBsYWNlbWVudCwgZmFsc2UsIGZhbHNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX29iamVjdC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKaW5kZXggNDNlMDk5NC4uMzE4MTY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fb2JqZWN0LmMKQEAgLTE3MywxNyArMTczLDYgQEAKIAkJZWxzZQogCQkJcmJvLT5wbGFjZW1lbnRzW2ldLmxwZm4gPSAwOwogCX0KLQotCS8qCi0JICogVXNlIHR3by1lbmRlZCBhbGxvY2F0aW9uIGRlcGVuZGluZyBvbiB0aGUgYnVmZmVyIHNpemUgdG8KLQkgKiBpbXByb3ZlIGZyYWdtZW50YXRpb24gcXVhbGl0eS4KLQkgKiA1MTJrYiB3YXMgbWVhc3VyZWQgYXMgdGhlIG1vc3Qgb3B0aW1hbCBudW1iZXIuCi0JICovCi0JaWYgKHJiby0+dGJvLm1lbS5zaXplID4gNTEyICogMTAyNCkgewotCQlmb3IgKGkgPSAwOyBpIDwgYzsgaSsrKSB7Ci0JCQlyYm8tPnBsYWNlbWVudHNbaV0uZmxhZ3MgfD0gVFRNX1BMX0ZMQUdfVE9QRE9XTjsKLQkJfQotCX0KIH0KIAogaW50IHJhZGVvbl9ib19jcmVhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcG0uYwppbmRleCAzM2NmNDEwLi5jMWJhODNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9wbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3BtLmMKQEAgLTgzNywxMiArODM3LDggQEAKIAlyYWRlb25fcG1fY29tcHV0ZV9jbG9ja3MocmRldik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmFkZW9uX3BzICpyYWRlb25fZHBtX3BpY2tfcG93ZXJfc3RhdGUoc3RydWN0IHJhZGVvbl9kZXZpY2UgKnJkZXYsCi0JCQkJCQkgICAgIGVudW0gcmFkZW9uX3BtX3N0YXRlX3R5cGUgZHBtX3N0YXRlKQorc3RhdGljIGJvb2wgcmFkZW9uX2RwbV9zaW5nbGVfZGlzcGxheShzdHJ1Y3QgcmFkZW9uX2RldmljZSAqcmRldikKIHsKLQlpbnQgaTsKLQlzdHJ1Y3QgcmFkZW9uX3BzICpwczsKLQl1MzIgdWlfY2xhc3M7CiAJYm9vbCBzaW5nbGVfZGlzcGxheSA9IChyZGV2LT5wbS5kcG0ubmV3X2FjdGl2ZV9jcnRjX2NvdW50IDwgMikgPwogCQl0cnVlIDogZmFsc2U7CiAKQEAgLTg1OCw2ICs4NTQsMTcgQEAKIAlpZiAoc2luZ2xlX2Rpc3BsYXkgJiYgKHI2MDBfZHBtX2dldF92cmVmcmVzaChyZGV2KSA+PSAxMjApKQogCQlzaW5nbGVfZGlzcGxheSA9IGZhbHNlOwogCisJcmV0dXJuIHNpbmdsZV9kaXNwbGF5OworfQorCitzdGF0aWMgc3RydWN0IHJhZGVvbl9wcyAqcmFkZW9uX2RwbV9waWNrX3Bvd2VyX3N0YXRlKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LAorCQkJCQkJICAgICBlbnVtIHJhZGVvbl9wbV9zdGF0ZV90eXBlIGRwbV9zdGF0ZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcmFkZW9uX3BzICpwczsKKwl1MzIgdWlfY2xhc3M7CisJYm9vbCBzaW5nbGVfZGlzcGxheSA9IHJhZGVvbl9kcG1fc2luZ2xlX2Rpc3BsYXkocmRldik7CisKIAkvKiBjZXJ0YWluIG9sZGVyIGFzaWNzIGhhdmUgYSBzZXBhcmFyZSAzRCBwZXJmb3JtYW5jZSBzdGF0ZSwKIAkgKiBzbyB0cnkgdGhhdCBmaXJzdCBpZiB0aGUgdXNlciBzZWxlY3RlZCBwZXJmb3JtYW5jZQogCSAqLwpAQCAtOTgzLDYgKzk5MCw3IEBACiAJc3RydWN0IHJhZGVvbl9wcyAqcHM7CiAJZW51bSByYWRlb25fcG1fc3RhdGVfdHlwZSBkcG1fc3RhdGU7CiAJaW50IHJldDsKKwlib29sIHNpbmdsZV9kaXNwbGF5ID0gcmFkZW9uX2RwbV9zaW5nbGVfZGlzcGxheShyZGV2KTsKIAogCS8qIGlmIGRwbSBpbml0IGZhaWxlZCAqLwogCWlmICghcmRldi0+cG0uZHBtX2VuYWJsZWQpCkBAIC0xMDA3LDYgKzEwMTUsOSBAQAogCQkvKiB2Y2UganVzdCBtb2RpZmllcyBhbiBleGlzdGluZyBzdGF0ZSBzbyBmb3JjZSBhIGNoYW5nZSAqLwogCQlpZiAocHMtPnZjZV9hY3RpdmUgIT0gcmRldi0+cG0uZHBtLnZjZV9hY3RpdmUpCiAJCQlnb3RvIGZvcmNlOworCQkvKiB1c2VyIGhhcyBtYWRlIGEgZGlzcGxheSBjaGFuZ2UgKHN1Y2ggYXMgdGltaW5nKSAqLworCQlpZiAocmRldi0+cG0uZHBtLnNpbmdsZV9kaXNwbGF5ICE9IHNpbmdsZV9kaXNwbGF5KQorCQkJZ290byBmb3JjZTsKIAkJaWYgKChyZGV2LT5mYW1pbHkgPCBDSElQX0JBUlRTKSB8fCAocmRldi0+ZmxhZ3MgJiBSQURFT05fSVNfSUdQKSkgewogCQkJLyogZm9yIHByZS1CVEMgYW5kIEFQVXMgaWYgdGhlIG51bSBjcnRjcyBjaGFuZ2VkIGJ1dCBzdGF0ZSBpcyB0aGUgc2FtZSwKIAkJCSAqIGFsbCB3ZSBuZWVkIHRvIGRvIGlzIHVwZGF0ZSB0aGUgZGlzcGxheSBjb25maWd1cmF0aW9uLgpAQCAtMTA2OSw2ICsxMDgwLDcgQEAKIAogCXJkZXYtPnBtLmRwbS5jdXJyZW50X2FjdGl2ZV9jcnRjcyA9IHJkZXYtPnBtLmRwbS5uZXdfYWN0aXZlX2NydGNzOwogCXJkZXYtPnBtLmRwbS5jdXJyZW50X2FjdGl2ZV9jcnRjX2NvdW50ID0gcmRldi0+cG0uZHBtLm5ld19hY3RpdmVfY3J0Y19jb3VudDsKKwlyZGV2LT5wbS5kcG0uc2luZ2xlX2Rpc3BsYXkgPSBzaW5nbGVfZGlzcGxheTsKIAogCS8qIHdhaXQgZm9yIHRoZSByaW5ncyB0byBkcmFpbiAqLwogCWZvciAoaSA9IDA7IGkgPCBSQURFT05fTlVNX1JJTkdTOyBpKyspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JpbmcuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3JpbmcuYwppbmRleCAyNDU2ZjY5Li44Yzc4NzIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9yaW5nLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fcmluZy5jCkBAIC00OTUsNyArNDk1LDcgQEAKIAlzZXFfcHJpbnRmKG0sICIldSBmcmVlIGR3b3JkcyBpbiByaW5nXG4iLCByaW5nLT5yaW5nX2ZyZWVfZHcpOwogCXNlcV9wcmludGYobSwgIiV1IGR3b3JkcyBpbiByaW5nXG4iLCBjb3VudCk7CiAKLQlpZiAoIXJpbmctPnJlYWR5KQorCWlmICghcmluZy0+cmluZykKIAkJcmV0dXJuIDA7CiAKIAkvKiBwcmludCA4IGR3IGJlZm9yZSBjdXJyZW50IHJwdHIgYXMgb2Z0ZW4gaXQncyB0aGUgbGFzdCBleGVjdXRlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHJhY2UuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3RyYWNlLmgKaW5kZXggY2UwNzVjYi4uZmRjZTQwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHJhY2UuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl90cmFjZS5oCkBAIC05LDcgKzksNiBAQAogCiAjdW5kZWYgVFJBQ0VfU1lTVEVNCiAjZGVmaW5lIFRSQUNFX1NZU1RFTSByYWRlb24KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNX1NUUklORyBfX3N0cmluZ2lmeShUUkFDRV9TWVNURU0pCiAjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSByYWRlb25fdHJhY2UKIAogVFJBQ0VfRVZFTlQocmFkZW9uX2JvX2NyZWF0ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX3R0bS5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKaW5kZXggZDAyYWExZC4uYjI5MmFjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fdHRtLmMKQEAgLTU5OCw2ICs1OTgsMTAgQEAKIAllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24gPSB3cml0ZSA/CiAJCURNQV9CSURJUkVDVElPTkFMIDogRE1BX1RPX0RFVklDRTsKIAorCS8qIGRvdWJsZSBjaGVjayB0aGF0IHdlIGRvbid0IGZyZWUgdGhlIHRhYmxlIHR3aWNlICovCisJaWYgKCF0dG0tPnNnLT5zZ2wpCisJCXJldHVybjsKKwogCS8qIGZyZWUgdGhlIHNnIHRhYmxlIGFuZCBwYWdlcyBhZ2FpbiAqLwogCWRtYV91bm1hcF9zZyhyZGV2LT5kZXYsIHR0bS0+c2ctPnNnbCwgdHRtLT5zZy0+bmVudHMsIGRpcmVjdGlvbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vdmNlX3YyXzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vdmNlX3YyXzAuYwppbmRleCAxYWM3YmI4Li5mYmJlNzhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3ZjZV92Ml8wLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi92Y2VfdjJfMC5jCkBAIC0xNTYsNiArMTU2LDkgQEAKIAlXUkVHMzIoVkNFX0xNSV9TV0FQX0NOVEwxLCAwKTsKIAlXUkVHMzIoVkNFX0xNSV9WTV9DVFJMLCAwKTsKIAorCVdSRUczMihWQ0VfTE1JX1ZDUFVfQ0FDSEVfNDBCSVRfQkFSLCBhZGRyID4+IDgpOworCisJYWRkciAmPSAweGZmOwogCXNpemUgPSBSQURFT05fR1BVX1BBR0VfQUxJR04ocmRldi0+dmNlX2Z3LT5zaXplKTsKIAlXUkVHMzIoVkNFX1ZDUFVfQ0FDSEVfT0ZGU0VUMCwgYWRkciAmIDB4N2ZmZmZmZmYpOwogCVdSRUczMihWQ0VfVkNQVV9DQUNIRV9TSVpFMCwgc2l6ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9LY29uZmlnIGIvZHJpdmVycy9oaWQvS2NvbmZpZwppbmRleCAxNTJiMDA2Li4xNTMzOGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaGlkL0tjb25maWcKQEAgLTkyLDcgKzkyLDcgQEAKIAlkZXBlbmRzIG9uIEhJRAogCiBjb25maWcgSElEX0E0VEVDSAotCXRyaXN0YXRlICJBNCB0ZWNoIG1pY2UiIGlmIEVYUEVSVAorCXRyaXN0YXRlICJBNCB0ZWNoIG1pY2UiCiAJZGVwZW5kcyBvbiBISUQKIAlkZWZhdWx0ICFFWFBFUlQKIAktLS1oZWxwLS0tCkBAIC0xMTMsNyArMTEzLDcgQEAKIAlnYW1lIGNvbnRyb2xsZXJzLgogCiBjb25maWcgSElEX0FQUExFCi0JdHJpc3RhdGUgIkFwcGxlIHtpLFBvd2VyLE1hY31Cb29rcyIgaWYgRVhQRVJUCisJdHJpc3RhdGUgIkFwcGxlIHtpLFBvd2VyLE1hY31Cb29rcyIKIAlkZXBlbmRzIG9uIEhJRAogCWRlZmF1bHQgIUVYUEVSVAogCS0tLWhlbHAtLS0KQEAgLTE0MSw3ICsxNDEsNyBAQAogCVN1cHBvcnQgZm9yIEF1cmVhbCBDeSBzZSBXLTAxUk4gUmVtb3RlIENvbnRyb2xsZXIgYW5kIG90aGVyIEF1cmVhbCBkZXJpdmVkIHJlbW90ZXMuCiAKIGNvbmZpZyBISURfQkVMS0lOCi0JdHJpc3RhdGUgIkJlbGtpbiBGbGlwIEtWTSBhbmQgV2lyZWxlc3Mga2V5Ym9hcmQiIGlmIEVYUEVSVAorCXRyaXN0YXRlICJCZWxraW4gRmxpcCBLVk0gYW5kIFdpcmVsZXNzIGtleWJvYXJkIgogCWRlcGVuZHMgb24gSElECiAJZGVmYXVsdCAhRVhQRVJUCiAJLS0taGVscC0tLQpAQCAtMTU4LDE0ICsxNTgsMTQgQEAKIAkgLSBCRVRPUCAyMTg1IFBDICYgQkZNIE1PREUKIAogY29uZmlnIEhJRF9DSEVSUlkKLQl0cmlzdGF0ZSAiQ2hlcnJ5IEN5bW90aW9uIGtleWJvYXJkIiBpZiBFWFBFUlQKKwl0cmlzdGF0ZSAiQ2hlcnJ5IEN5bW90aW9uIGtleWJvYXJkIgogCWRlcGVuZHMgb24gSElECiAJZGVmYXVsdCAhRVhQRVJUCiAJLS0taGVscC0tLQogCVN1cHBvcnQgZm9yIENoZXJyeSBDeW1vdGlvbiBrZXlib2FyZC4KIAogY29uZmlnIEhJRF9DSElDT05ZCi0JdHJpc3RhdGUgIkNoaWNvbnkgVGFjdGljYWwgcGFkIiBpZiBFWFBFUlQKKwl0cmlzdGF0ZSAiQ2hpY29ueSBUYWN0aWNhbCBwYWQiCiAJZGVwZW5kcyBvbiBISUQKIAlkZWZhdWx0ICFFWFBFUlQKIAktLS1oZWxwLS0tCkBAIC0xOTYsNyArMTk2LDcgQEAKIAljdXN0b21pemFibGUgVVNCIGRlc2NyaXB0b3IgZmllbGRzIGFyZSBleHBvc2VkIGFzIHN5c2ZzIGF0dHJpYnV0ZXMuCiAKIGNvbmZpZyBISURfQ1lQUkVTUwotCXRyaXN0YXRlICJDeXByZXNzIG1vdXNlIGFuZCBiYXJjb2RlIHJlYWRlcnMiIGlmIEVYUEVSVAorCXRyaXN0YXRlICJDeXByZXNzIG1vdXNlIGFuZCBiYXJjb2RlIHJlYWRlcnMiCiAJZGVwZW5kcyBvbiBISUQKIAlkZWZhdWx0ICFFWFBFUlQKIAktLS1oZWxwLS0tCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAlkaWZmZXJlbnQgZGV2aWNlcyB0aGFuIHRob3NlIGhhbmRsZWQgYnkgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9FTE8uCiAKIGNvbmZpZyBISURfRVpLRVkKLQl0cmlzdGF0ZSAiRXprZXkgQlRDIDgxOTMga2V5Ym9hcmQiIGlmIEVYUEVSVAorCXRyaXN0YXRlICJFemtleSBCVEMgODE5MyBrZXlib2FyZCIKIAlkZXBlbmRzIG9uIEhJRAogCWRlZmF1bHQgIUVYUEVSVAogCS0tLWhlbHAtLS0KQEAgLTI4NiwxMiArMjg2LDYgQEAKIAlDdXJyZW50bHkgdGhlIGZvbGxvd2luZyBkZXZpY2VzIGFyZSBrbm93IHRvIGJlIHN1cHBvcnRlZDoKIAkgIC0gTVNJIEdUNjgzUgogCi1jb25maWcgSElEX0hVSU9OCi0JdHJpc3RhdGUgIkh1aW9uIHRhYmxldHMiCi0JZGVwZW5kcyBvbiBVU0JfSElECi0JLS0taGVscC0tLQotCVN1cHBvcnQgZm9yIEh1aW9uIDU4MCB0YWJsZXQuCi0KIGNvbmZpZyBISURfS0VZVE9VQ0gKIAl0cmlzdGF0ZSAiS2V5dG91Y2ggSElEIGRldmljZXMiCiAJZGVwZW5kcyBvbiBISUQKQEAgLTMxMiw5ICszMDYsOSBAQAogCiBjb25maWcgSElEX1VDTE9HSUMKIAl0cmlzdGF0ZSAiVUMtTG9naWMiCi0JZGVwZW5kcyBvbiBISUQKKwlkZXBlbmRzIG9uIFVTQl9ISUQKIAktLS1oZWxwLS0tCi0JU3VwcG9ydCBmb3IgVUMtTG9naWMgdGFibGV0cy4KKwlTdXBwb3J0IGZvciBVQy1Mb2dpYyBhbmQgSHVpb24gdGFibGV0cy4KIAogY29uZmlnIEhJRF9XQUxUT1AKIAl0cmlzdGF0ZSAiV2FsdG9wIgpAQCAtMzQ0LDcgKzMzOCw3IEBACiAJU3VwcG9ydCBmb3IgVHdpbmhhbiBJUiByZW1vdGUgY29udHJvbC4KIAogY29uZmlnIEhJRF9LRU5TSU5HVE9OCi0JdHJpc3RhdGUgIktlbnNpbmd0b24gU2xpbWJsYWRlIFRyYWNrYmFsbCIgaWYgRVhQRVJUCisJdHJpc3RhdGUgIktlbnNpbmd0b24gU2xpbWJsYWRlIFRyYWNrYmFsbCIKIAlkZXBlbmRzIG9uIEhJRAogCWRlZmF1bHQgIUVYUEVSVAogCS0tLWhlbHAtLS0KQEAgLTM3Miw3ICszNjYsNyBAQAogCS0gVGhpbmtQYWQgQ29tcGFjdCBVU0IgS2V5Ym9hcmQgd2l0aCBUcmFja1BvaW50IChzdXBwb3J0cyBGbiBrZXlzKQogCiBjb25maWcgSElEX0xPR0lURUNICi0JdHJpc3RhdGUgIkxvZ2l0ZWNoIGRldmljZXMiIGlmIEVYUEVSVAorCXRyaXN0YXRlICJMb2dpdGVjaCBkZXZpY2VzIgogCWRlcGVuZHMgb24gSElECiAJZGVmYXVsdCAhRVhQRVJUCiAJLS0taGVscC0tLQpAQCAtNDYxLDE0ICs0NTUsMTQgQEAKIAlBcHBsZSBXaXJlbGVzcyAiTWFnaWMiIE1vdXNlIGFuZCB0aGUgQXBwbGUgV2lyZWxlc3MgIk1hZ2ljIiBUcmFja3BhZC4KIAogY29uZmlnIEhJRF9NSUNST1NPRlQKLQl0cmlzdGF0ZSAiTWljcm9zb2Z0IG5vbi1mdWxseSBISUQtY29tcGxpYW50IGRldmljZXMiIGlmIEVYUEVSVAorCXRyaXN0YXRlICJNaWNyb3NvZnQgbm9uLWZ1bGx5IEhJRC1jb21wbGlhbnQgZGV2aWNlcyIKIAlkZXBlbmRzIG9uIEhJRAogCWRlZmF1bHQgIUVYUEVSVAogCS0tLWhlbHAtLS0KIAlTdXBwb3J0IGZvciBNaWNyb3NvZnQgZGV2aWNlcyB0aGF0IGFyZSBub3QgZnVsbHkgY29tcGxpYW50IHdpdGggSElEIHN0YW5kYXJkLgogCiBjb25maWcgSElEX01PTlRFUkVZCi0JdHJpc3RhdGUgIk1vbnRlcmV5IEdlbml1cyBLQjI5RSBrZXlib2FyZCIgaWYgRVhQRVJUCisJdHJpc3RhdGUgIk1vbnRlcmV5IEdlbml1cyBLQjI5RSBrZXlib2FyZCIKIAlkZXBlbmRzIG9uIEhJRAogCWRlZmF1bHQgIUVYUEVSVAogCS0tLWhlbHAtLS0KQEAgLTYzOCw3ICs2MzIsNiBAQAogCiBjb25maWcgSElEX1BMQU5UUk9OSUNTCiAJdHJpc3RhdGUgIlBsYW50cm9uaWNzIFVTQiBISUQgRHJpdmVyIgotCWRlZmF1bHQgIUVYUEVSVAogCWRlcGVuZHMgb24gSElECiAJLS0taGVscC0tLQogCVByb3ZpZGVzIEhJRCBzdXBwb3J0IGZvciBQbGFudHJvbmljcyB0ZWxlcGhvbnkgZGV2aWNlcy4KQEAgLTg4NSw2ICs4NzgsMjEgQEAKIAkgIGZvciBldmVudHMgYW5kIGhhbmRsZSBkYXRhIHN0cmVhbXMuIEVhY2ggc2Vuc29yIGRyaXZlciBjYW4gZm9ybWF0CiAJICBkYXRhIGFuZCBwcmVzZW50IHRvIHVzZXIgbW9kZSB1c2luZyBpbnB1dCBvciBJSU8gaW50ZXJmYWNlLgogCitjb25maWcgSElEX1NFTlNPUl9DVVNUT01fU0VOU09SCisJdHJpc3RhdGUgIkhJRCBTZW5zb3JzIGh1YiBjdXN0b20gc2Vuc29yIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBISURfU0VOU09SX0hVQgorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIEhJRCBTZW5zb3IgaHViIHNwZWNpZmljYXRpb24gYWxsb3dzIGRlZmluaXRpb24gb2Ygc29tZSBjdXN0b20gYW5kCisJICBnZW5lcmljIHNlbnNvcnMuIFVubGlrZSBvdGhlciBISUQgc2Vuc29ycywgdGhleSBjYW4ndCBiZSBleHBvcnRlZAorCSAgdmlhIExpbnV4IElJTyBiZWNhdXNlIG9mIGN1c3RvbSBmaWVsZHMuIFRoaXMgaXMgdXAgdG8gdGhlIG1hbnVmYWN0dXJlcgorCSAgdG8gZGVjaWRlIGhvdyB0byBpbnRlcnByZXQgdGhlc2Ugc3BlY2lhbCBzZW5zb3IgaWRzIGFuZCBwcm9jZXNzIGluCisJICB0aGUgdXNlciBzcGFjZS4gQ3VycmVudGx5IHNvbWUgbWFudWZhY3R1cmVycyBhcmUgdXNpbmcgdGhlc2UgaWRzIGZvcgorCSAgc2Vuc29yIGNhbGlicmF0aW9uIGFuZCBkZWJ1Z2dpbmcgb3RoZXIgc2Vuc29ycy4gTWFudWZhY3R1cmVycworCSAgc2hvdWxkJ3QgdXNlIHRoZXNlIHNwZWNpYWwgY3VzdG9tIHNlbnNvciBpZHMgdG8gZXhwb3J0IGFueSBvZiB0aGUKKwkgIHN0YW5kYXJkIHNlbnNvcnMuCisJICBTZWxlY3QgdGhpcyBjb25maWcgb3B0aW9uIGZvciBjdXN0b20vZ2VuZXJpYyBzZW5zb3Igc3VwcG9ydC4KKwogZW5kbWVudQogCiBlbmRpZiAjIEhJRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvTWFrZWZpbGUgYi9kcml2ZXJzL2hpZC9NYWtlZmlsZQppbmRleCA2ZjE5OTU4Li5lNGEyMWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2hpZC9NYWtlZmlsZQpAQCAtNDEsNyArNDEsNiBAQAogb2JqLSQoQ09ORklHX0hJRF9IT0xURUspCSs9IGhpZC1ob2x0ZWsta2JkLm8KIG9iai0kKENPTkZJR19ISURfSE9MVEVLKQkrPSBoaWQtaG9sdGVrLW1vdXNlLm8KIG9iai0kKENPTkZJR19ISURfSE9MVEVLKQkrPSBoaWQtaG9sdGVrZmYubwotb2JqLSQoQ09ORklHX0hJRF9IVUlPTikJCSs9IGhpZC1odWlvbi5vCiBvYmotJChDT05GSUdfSElEX0hZUEVSVl9NT1VTRSkJKz0gaGlkLWh5cGVydi5vCiBvYmotJChDT05GSUdfSElEX0lDQURFKQkJKz0gaGlkLWljYWRlLm8KIG9iai0kKENPTkZJR19ISURfS0VOU0lOR1RPTikJKz0gaGlkLWtlbnNpbmd0b24ubwpAQCAtMTAxLDYgKzEwMCw3IEBACiBvYmotJChDT05GSUdfSElEX1dBTFRPUCkJKz0gaGlkLXdhbHRvcC5vCiBvYmotJChDT05GSUdfSElEX1dJSU1PVEUpCSs9IGhpZC13aWltb3RlLm8KIG9iai0kKENPTkZJR19ISURfU0VOU09SX0hVQikJKz0gaGlkLXNlbnNvci1odWIubworb2JqLSQoQ09ORklHX0hJRF9TRU5TT1JfQ1VTVE9NX1NFTlNPUikJKz0gaGlkLXNlbnNvci1jdXN0b20ubwogCiBvYmotJChDT05GSUdfVVNCX0hJRCkJCSs9IHVzYmhpZC8KIG9iai0kKENPTkZJR19VU0JfTU9VU0UpCQkrPSB1c2JoaWQvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtY29yZS5jIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwppbmRleCA3YzY2OWMzLi43MjJhOTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKQEAgLTE1NjIsMTIgKzE1NjIsMjYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90CitzaG93X2NvdW50cnkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBoaWRfZGV2aWNlICpoZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGhpZF9kZXZpY2UsIGRldik7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlMDJ4XG4iLCBoZGV2LT5jb3VudHJ5ICYgMHhmZik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBkZXZfYmluX2F0dHJfcmVwb3J0X2Rlc2MgPSB7CiAJLmF0dHIgPSB7IC5uYW1lID0gInJlcG9ydF9kZXNjcmlwdG9yIiwgLm1vZGUgPSAwNDQ0IH0sCiAJLnJlYWQgPSByZWFkX3JlcG9ydF9kZXNjcmlwdG9yLAogCS5zaXplID0gSElEX01BWF9ERVNDUklQVE9SX1NJWkUsCiB9OwogCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfY291bnRyeSA9IHsKKwkuYXR0ciA9IHsgLm5hbWUgPSAiY291bnRyeSIsIC5tb2RlID0gMDQ0NCB9LAorCS5zaG93ID0gc2hvd19jb3VudHJ5LAorfTsKKwogaW50IGhpZF9jb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCB1bnNpZ25lZCBpbnQgY29ubmVjdF9tYXNrKQogewogCXN0YXRpYyBjb25zdCBjaGFyICp0eXBlc1tdID0geyAiRGV2aWNlIiwgIlBvaW50ZXIiLCAiTW91c2UiLCAiRGV2aWNlIiwKQEAgLTE2NDYsNiArMTY2MCwxMSBAQAogCQlidXMgPSAiPFVOS05PV04+IjsKIAl9CiAKKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmhkZXYtPmRldiwgJmRldl9hdHRyX2NvdW50cnkpOworCWlmIChyZXQpCisJCWhpZF93YXJuKGhkZXYsCisJCQkgImNhbid0IGNyZWF0ZSBzeXNmcyBjb3VudHJ5IGNvZGUgYXR0cmlidXRlIGVycjogJWRcbiIsIHJldCk7CisKIAlyZXQgPSBkZXZpY2VfY3JlYXRlX2Jpbl9maWxlKCZoZGV2LT5kZXYsICZkZXZfYmluX2F0dHJfcmVwb3J0X2Rlc2MpOwogCWlmIChyZXQpCiAJCWhpZF93YXJuKGhkZXYsCkBAIC0xNjYxLDYgKzE2ODAsNyBAQAogCiB2b2lkIGhpZF9kaXNjb25uZWN0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQogeworCWRldmljZV9yZW1vdmVfZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2F0dHJfY291bnRyeSk7CiAJZGV2aWNlX3JlbW92ZV9iaW5fZmlsZSgmaGRldi0+ZGV2LCAmZGV2X2Jpbl9hdHRyX3JlcG9ydF9kZXNjKTsKIAlpZiAoaGRldi0+Y2xhaW1lZCAmIEhJRF9DTEFJTUVEX0lOUFVUKQogCQloaWRpbnB1dF9kaXNjb25uZWN0KGhkZXYpOwpAQCAtMTgyNCw2ICsxODQ0LDcgQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfS1lFLCBVU0JfREVWSUNFX0lEX0tZRV9NT1VTRVBFTl9JNjA4WCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfS1lFLCBVU0JfREVWSUNFX0lEX0tZRV9NT1VTRVBFTl9JNjA4WF8yKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9LWUUsIFVTQl9ERVZJQ0VfSURfS1lFX0VBU1lQRU5fTTYxMFgpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0tZRSwgVVNCX0RFVklDRV9JRF9LWUVfUEVOU0tFVENIX005MTIpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xBQlRFQywgVVNCX0RFVklDRV9JRF9MQUJURUNfV0lSRUxFU1NfS0VZQk9BUkQpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0xDUE9XRVIsIFVTQl9ERVZJQ0VfSURfTENQT1dFUl9MQzEwMDAgKSB9LAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0hJRF9MRU5PVk8pCkBAIC0xOTU5LDYgKzE5ODAsNyBAQAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9USFJVU1RNQVNURVIsIDB4YjY1YSkgfSwKIAl7IEhJRF9CTFVFVE9PVEhfREVWSUNFKFVTQl9WRU5ET1JfSURfVElWTywgVVNCX0RFVklDRV9JRF9USVZPX1NMSURFX0JUKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9USVZPLCBVU0JfREVWSUNFX0lEX1RJVk9fU0xJREUpIH0sCisJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RJVk8sIFVTQl9ERVZJQ0VfSURfVElWT19TTElERV9QUk8pIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RPUFNFRUQsIFVTQl9ERVZJQ0VfSURfVE9QU0VFRF9DWUJFUkxJTkspIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RPUFNFRUQyLCBVU0JfREVWSUNFX0lEX1RPUFNFRUQyX1JGX0NPTUJPKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9UV0lOSEFOLCBVU0JfREVWSUNFX0lEX1RXSU5IQU5fSVJfUkVNT1RFKSB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWRlYnVnLmMgYi9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYwppbmRleCA4YmY2MWQyLi4yODg2YjY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtZGVidWcuYwpAQCAtMTY1LDYgKzE2NSw3IEBACiAgICAgezAsIDB4NTMsICJEZXZpY2VJbmRleCJ9LAogICAgIHswLCAweDU0LCAiQ29udGFjdENvdW50In0sCiAgICAgezAsIDB4NTUsICJDb250YWN0TWF4aW11bU51bWJlciJ9LAorICAgIHswLCAweDU5LCAiQnV0dG9uVHlwZSJ9LAogICAgIHswLCAweDVBLCAiU2Vjb25kYXJ5QmFycmVsU3dpdGNoIn0sCiAgICAgezAsIDB4NUIsICJUcmFuc2R1Y2VyU2VyaWFsTnVtYmVyIn0sCiAgIHsgMTUsIDAsICJQaHlzaWNhbEludGVyZmFjZURldmljZSIgfSwKQEAgLTgxNCw3ICs4MTUsNyBAQAogCVtLRVlfREVMRVRFRklMRV0gPSAiRGVsZXRlRmlsZSIsCVtLRVlfWEZFUl0gPSAiWC1mZXIiLAogCVtLRVlfUFJPRzFdID0gIlByb2cxIiwJCQlbS0VZX1BST0cyXSA9ICJQcm9nMiIsCiAJW0tFWV9XV1ddID0gIldXVyIsCQkJW0tFWV9NU0RPU10gPSAiTVNET1MiLAotCVtLRVlfQ09GRkVFXSA9ICJDb2ZmZWUiLAkJW0tFWV9ESVJFQ1RJT05dID0gIkRpcmVjdGlvbiIsCisJW0tFWV9DT0ZGRUVdID0gIkNvZmZlZSIsCQlbS0VZX1JPVEFURV9ESVNQTEFZXSA9ICJSb3RhdGVEaXNwbGF5IiwKIAlbS0VZX0NZQ0xFV0lORE9XU10gPSAiQ3ljbGVXaW5kb3dzIiwJW0tFWV9NQUlMXSA9ICJNYWlsIiwKIAlbS0VZX0JPT0tNQVJLU10gPSAiQm9va21hcmtzIiwJCVtLRVlfQ09NUFVURVJdID0gIkNvbXB1dGVyIiwKIAlbS0VZX0JBQ0tdID0gIkJhY2siLAkJCVtLRVlfRk9SV0FSRF0gPSAiRm9yd2FyZCIsCkBAIC0xMTI3LDcgKzExMjgsOCBAQAogCiAJCQkJaWYgKCFsaXN0LT5oZGV2IHx8ICFsaXN0LT5oZGV2LT5kZWJ1ZykgewogCQkJCQlyZXQgPSAtRUlPOwotCQkJCQlicmVhazsKKwkJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCQkJZ290byBvdXQ7CiAJCQkJfQogCiAJCQkJLyogYWxsb3cgT19OT05CTE9DSyBmcm9tIG90aGVyIHRocmVhZHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1odWlvbi5jIGIvZHJpdmVycy9oaWQvaGlkLWh1aW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjY4Y2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWh1aW9uLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqICBISUQgZHJpdmVyIGZvciBIdWlvbiBkZXZpY2VzIG5vdCBmdWxseSBjb21wbGlhbnQgd2l0aCBISUQgc3RhbmRhcmQKLSAqCi0gKiAgQ29weXJpZ2h0IChjKSAyMDEzIE1hcnRpbiBSdXNrbwotICogIENvcHlyaWdodCAoYykgMjAxNCBOaWtvbGFpIEtvbmRyYXNob3YKLSAqLwotCi0vKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCi0gKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotI2luY2x1ZGUgInVzYmhpZC91c2JoaWQuaCIKLQotI2luY2x1ZGUgImhpZC1pZHMuaCIKLQotLyogUmVwb3J0IGRlc2NyaXB0b3IgdGVtcGxhdGUgcGxhY2Vob2xkZXIgaGVhZCAqLwotI2RlZmluZSBIVUlPTl9QSF9IRUFECTB4RkUsIDB4RUQsIDB4MUQKLQotLyogUmVwb3J0IGRlc2NyaXB0b3IgdGVtcGxhdGUgcGxhY2Vob2xkZXIgSURzICovCi1lbnVtIGh1aW9uX3BoX2lkIHsKLQlIVUlPTl9QSF9JRF9YX0xNLAotCUhVSU9OX1BIX0lEX1hfUE0sCi0JSFVJT05fUEhfSURfWV9MTSwKLQlIVUlPTl9QSF9JRF9ZX1BNLAotCUhVSU9OX1BIX0lEX1BSRVNTVVJFX0xNLAotCUhVSU9OX1BIX0lEX05VTQotfTsKLQotLyogUmVwb3J0IGRlc2NyaXB0b3IgdGVtcGxhdGUgcGxhY2Vob2xkZXIgKi8KLSNkZWZpbmUgSFVJT05fUEgoX0lEKSBIVUlPTl9QSF9IRUFELCBIVUlPTl9QSF9JRF8jI19JRAotCi0vKiBGaXhlZCByZXBvcnQgZGVzY3JpcHRvciB0ZW1wbGF0ZSAqLwotc3RhdGljIGNvbnN0IF9fdTggaHVpb25fdGFibGV0X3JkZXNjX3RlbXBsYXRlW10gPSB7Ci0JMHgwNSwgMHgwRCwgICAgICAgICAgICAgLyogIFVzYWdlIFBhZ2UgKERpZ2l0aXplciksICAgICAgICAgICAgICAgICAqLwotCTB4MDksIDB4MDIsICAgICAgICAgICAgIC8qICBVc2FnZSAoUGVuKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQkweEExLCAweDAxLCAgICAgICAgICAgICAvKiAgQ29sbGVjdGlvbiAoQXBwbGljYXRpb24pLCAgICAgICAgICAgICAgICovCi0JMHg4NSwgMHgwNywgICAgICAgICAgICAgLyogICAgICBSZXBvcnQgSUQgKDcpLCAgICAgICAgICAgICAgICAgICAgICAqLwotCTB4MDksIDB4MjAsICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgKFN0eWx1cyksICAgICAgICAgICAgICAgICAgICAgKi8KLQkweEEwLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIENvbGxlY3Rpb24gKFBoeXNpY2FsKSwgICAgICAgICAgICAgICovCi0JMHgxNCwgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgTG9naWNhbCBNaW5pbXVtICgwKSwgICAgICAgICAgICAqLwotCTB4MjUsIDB4MDEsICAgICAgICAgICAgIC8qICAgICAgICAgIExvZ2ljYWwgTWF4aW11bSAoMSksICAgICAgICAgICAgKi8KLQkweDc1LCAweDAxLCAgICAgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgU2l6ZSAoMSksICAgICAgICAgICAgICAgICovCi0JMHgwOSwgMHg0MiwgICAgICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgKFRpcCBTd2l0Y2gpLCAgICAgICAgICAgICAqLwotCTB4MDksIDB4NDQsICAgICAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIChCYXJyZWwgU3dpdGNoKSwgICAgICAgICAgKi8KLQkweDA5LCAweDQ2LCAgICAgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoVGFibGV0IFBpY2spLCAgICAgICAgICAgICovCi0JMHg5NSwgMHgwMywgICAgICAgICAgICAgLyogICAgICAgICAgUmVwb3J0IENvdW50ICgzKSwgICAgICAgICAgICAgICAqLwotCTB4ODEsIDB4MDIsICAgICAgICAgICAgIC8qICAgICAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAgICAgKi8KLQkweDk1LCAweDAzLCAgICAgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgQ291bnQgKDMpLCAgICAgICAgICAgICAgICovCi0JMHg4MSwgMHgwMywgICAgICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKENvbnN0YW50LCBWYXJpYWJsZSksICAgICAqLwotCTB4MDksIDB4MzIsICAgICAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIChJbiBSYW5nZSksICAgICAgICAgICAgICAgKi8KLQkweDk1LCAweDAxLCAgICAgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgQ291bnQgKDEpLCAgICAgICAgICAgICAgICovCi0JMHg4MSwgMHgwMiwgICAgICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICAgICAqLwotCTB4OTUsIDB4MDEsICAgICAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBDb3VudCAoMSksICAgICAgICAgICAgICAgKi8KLQkweDgxLCAweDAzLCAgICAgICAgICAgICAvKiAgICAgICAgICBJbnB1dCAoQ29uc3RhbnQsIFZhcmlhYmxlKSwgICAgICovCi0JMHg3NSwgMHgxMCwgICAgICAgICAgICAgLyogICAgICAgICAgUmVwb3J0IFNpemUgKDE2KSwgICAgICAgICAgICAgICAqLwotCTB4OTUsIDB4MDEsICAgICAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBDb3VudCAoMSksICAgICAgICAgICAgICAgKi8KLQkweEE0LCAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICBQdXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JMHgwNSwgMHgwMSwgICAgICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgUGFnZSAoRGVza3RvcCksICAgICAgICAgICAqLwotCTB4NjUsIDB4MTMsICAgICAgICAgICAgIC8qICAgICAgICAgIFVuaXQgKEluY2gpLCAgICAgICAgICAgICAgICAgICAgKi8KLQkweDU1LCAweEZELCAgICAgICAgICAgICAvKiAgICAgICAgICBVbml0IEV4cG9uZW50ICgtMyksICAgICAgICAgICAgICovCi0JMHgzNCwgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgUGh5c2ljYWwgTWluaW11bSAoMCksICAgICAgICAgICAqLwotCTB4MDksIDB4MzAsICAgICAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIChYKSwgICAgICAgICAgICAgICAgICAgICAgKi8KLQkweDI3LCBIVUlPTl9QSChYX0xNKSwgICAvKiAgICAgICAgICBMb2dpY2FsIE1heGltdW0gKFBMQUNFSE9MREVSKSwgICovCi0JMHg0NywgSFVJT05fUEgoWF9QTSksICAgLyogICAgICAgICAgUGh5c2ljYWwgTWF4aW11bSAoUExBQ0VIT0xERVIpLCAqLwotCTB4ODEsIDB4MDIsICAgICAgICAgICAgIC8qICAgICAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAgICAgKi8KLQkweDA5LCAweDMxLCAgICAgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoWSksICAgICAgICAgICAgICAgICAgICAgICovCi0JMHgyNywgSFVJT05fUEgoWV9MTSksICAgLyogICAgICAgICAgTG9naWNhbCBNYXhpbXVtIChQTEFDRUhPTERFUiksICAqLwotCTB4NDcsIEhVSU9OX1BIKFlfUE0pLCAgIC8qICAgICAgICAgIFBoeXNpY2FsIE1heGltdW0gKFBMQUNFSE9MREVSKSwgKi8KLQkweDgxLCAweDAyLCAgICAgICAgICAgICAvKiAgICAgICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgICAgICovCi0JMHhCNCwgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgUG9wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCTB4MDksIDB4MzAsICAgICAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIChUaXAgUHJlc3N1cmUpLCAgICAgICAgICAgKi8KLQkweDI3LAotCUhVSU9OX1BIKFBSRVNTVVJFX0xNKSwgIC8qICAgICAgICAgIExvZ2ljYWwgTWF4aW11bSAoUExBQ0VIT0xERVIpLCAgKi8KLQkweDgxLCAweDAyLCAgICAgICAgICAgICAvKiAgICAgICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgICAgICovCi0JMHhDMCwgICAgICAgICAgICAgICAgICAgLyogICAgICBFbmQgQ29sbGVjdGlvbiwgICAgICAgICAgICAgICAgICAgICAqLwotCTB4QzAgICAgICAgICAgICAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLS8qIFBhcmFtZXRlciBpbmRpY2VzICovCi1lbnVtIGh1aW9uX3BybSB7Ci0JSFVJT05fUFJNX1hfTE0JCT0gMSwKLQlIVUlPTl9QUk1fWV9MTQkJPSAyLAotCUhVSU9OX1BSTV9QUkVTU1VSRV9MTQk9IDQsCi0JSFVJT05fUFJNX1JFU09MVVRJT04JPSA1LAotCUhVSU9OX1BSTV9OVU0KLX07Ci0KLS8qIERyaXZlciBkYXRhICovCi1zdHJ1Y3QgaHVpb25fZHJ2ZGF0YSB7Ci0JX191OCAqcmRlc2M7Ci0JdW5zaWduZWQgaW50IHJzaXplOwotfTsKLQotc3RhdGljIF9fdTggKmh1aW9uX3JlcG9ydF9maXh1cChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgX191OCAqcmRlc2MsCi0JCXVuc2lnbmVkIGludCAqcnNpemUpCi17Ci0Jc3RydWN0IGh1aW9uX2RydmRhdGEgKmRydmRhdGEgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7Ci0Jc3dpdGNoIChoZGV2LT5wcm9kdWN0KSB7Ci0JY2FzZSBVU0JfREVWSUNFX0lEX0hVSU9OX1RBQkxFVDoKLQkJaWYgKGRydmRhdGEtPnJkZXNjICE9IE5VTEwpIHsKLQkJCXJkZXNjID0gZHJ2ZGF0YS0+cmRlc2M7Ci0JCQkqcnNpemUgPSBkcnZkYXRhLT5yc2l6ZTsKLQkJfQotCQlicmVhazsKLQl9Ci0JcmV0dXJuIHJkZXNjOwotfQotCi0vKioKLSAqIEVuYWJsZSBmdWxseS1mdW5jdGlvbmFsIHRhYmxldCBtb2RlIGFuZCBkZXRlcm1pbmUgZGV2aWNlIHBhcmFtZXRlcnMuCi0gKgotICogQGhkZXY6CUhJRCBkZXZpY2UKLSAqLwotc3RhdGljIGludCBodWlvbl90YWJsZXRfZW5hYmxlKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQotewotCWludCByYzsKLQlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiX2RldiA9IGhpZF90b191c2JfZGV2KGhkZXYpOwotCXN0cnVjdCBodWlvbl9kcnZkYXRhICpkcnZkYXRhID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOwotCV9fbGUxNiAqYnVmID0gTlVMTDsKLQlzaXplX3QgbGVuOwotCXMzMiBwYXJhbXNbSFVJT05fUEhfSURfTlVNXTsKLQlzMzIgcmVzb2x1dGlvbjsKLQlfX3U4ICpwOwotCXMzMiB2OwotCi0JLyoKLQkgKiBSZWFkIHN0cmluZyBkZXNjcmlwdG9yIGNvbnRhaW5pbmcgdGFibGV0IHBhcmFtZXRlcnMuIFRoZSBzcGVjaWZpYwotCSAqIHN0cmluZyBkZXNjcmlwdG9yIGFuZCBkYXRhIHdlcmUgZGlzY292ZXJlZCBieSBzbmlmZmluZyB0aGUgV2luZG93cwotCSAqIGRyaXZlciB0cmFmZmljLgotCSAqIE5PVEU6IFRoaXMgZW5hYmxlcyBmdWxseS1mdW5jdGlvbmFsIHRhYmxldCBtb2RlLgotCSAqLwotCWxlbiA9IEhVSU9OX1BSTV9OVU0gKiBzaXplb2YoKmJ1Zik7Ci0JYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCWlmIChidWYgPT0gTlVMTCkgewotCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcGFyYW1ldGVyIGJ1ZmZlclxuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBjbGVhbnVwOwotCX0KLQlyYyA9IHVzYl9jb250cm9sX21zZyh1c2JfZGV2LCB1c2JfcmN2Y3RybHBpcGUodXNiX2RldiwgMCksCi0JCQkJVVNCX1JFUV9HRVRfREVTQ1JJUFRPUiwgVVNCX0RJUl9JTiwKLQkJCQkoVVNCX0RUX1NUUklORyA8PCA4KSArIDB4NjQsCi0JCQkJMHgwNDA5LCBidWYsIGxlbiwKLQkJCQlVU0JfQ1RSTF9HRVRfVElNRU9VVCk7Ci0JaWYgKHJjID09IC1FUElQRSkgewotCQloaWRfZXJyKGhkZXYsICJkZXZpY2UgcGFyYW1ldGVycyBub3QgZm91bmRcbiIpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gY2xlYW51cDsKLQl9IGVsc2UgaWYgKHJjIDwgMCkgewotCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gZ2V0IGRldmljZSBwYXJhbWV0ZXJzOiAlZFxuIiwgcmMpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gY2xlYW51cDsKLQl9IGVsc2UgaWYgKHJjICE9IGxlbikgewotCQloaWRfZXJyKGhkZXYsICJpbnZhbGlkIGRldmljZSBwYXJhbWV0ZXJzXG4iKTsKLQkJcmMgPSAtRU5PREVWOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCi0JLyogRXh0cmFjdCBkZXZpY2UgcGFyYW1ldGVycyAqLwotCXBhcmFtc1tIVUlPTl9QSF9JRF9YX0xNXSA9IGxlMTZfdG9fY3B1KGJ1ZltIVUlPTl9QUk1fWF9MTV0pOwotCXBhcmFtc1tIVUlPTl9QSF9JRF9ZX0xNXSA9IGxlMTZfdG9fY3B1KGJ1ZltIVUlPTl9QUk1fWV9MTV0pOwotCXBhcmFtc1tIVUlPTl9QSF9JRF9QUkVTU1VSRV9MTV0gPQotCQlsZTE2X3RvX2NwdShidWZbSFVJT05fUFJNX1BSRVNTVVJFX0xNXSk7Ci0JcmVzb2x1dGlvbiA9IGxlMTZfdG9fY3B1KGJ1ZltIVUlPTl9QUk1fUkVTT0xVVElPTl0pOwotCWlmIChyZXNvbHV0aW9uID09IDApIHsKLQkJcGFyYW1zW0hVSU9OX1BIX0lEX1hfUE1dID0gMDsKLQkJcGFyYW1zW0hVSU9OX1BIX0lEX1lfUE1dID0gMDsKLQl9IGVsc2UgewotCQlwYXJhbXNbSFVJT05fUEhfSURfWF9QTV0gPSBwYXJhbXNbSFVJT05fUEhfSURfWF9MTV0gKgotCQkJCQkJMTAwMCAvIHJlc29sdXRpb247Ci0JCXBhcmFtc1tIVUlPTl9QSF9JRF9ZX1BNXSA9IHBhcmFtc1tIVUlPTl9QSF9JRF9ZX0xNXSAqCi0JCQkJCQkxMDAwIC8gcmVzb2x1dGlvbjsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSBmaXhlZCByZXBvcnQgZGVzY3JpcHRvciAqLwotCWRydmRhdGEtPnJkZXNjID0gZGV2bV9rbWFsbG9jKCZoZGV2LT5kZXYsCi0JCQkJc2l6ZW9mKGh1aW9uX3RhYmxldF9yZGVzY190ZW1wbGF0ZSksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKGRydmRhdGEtPnJkZXNjID09IE5VTEwpIHsKLQkJaGlkX2VycihoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGZpeGVkIHJkZXNjXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCWRydmRhdGEtPnJzaXplID0gc2l6ZW9mKGh1aW9uX3RhYmxldF9yZGVzY190ZW1wbGF0ZSk7Ci0KLQkvKiBGb3JtYXQgZml4ZWQgcmVwb3J0IGRlc2NyaXB0b3IgKi8KLQltZW1jcHkoZHJ2ZGF0YS0+cmRlc2MsIGh1aW9uX3RhYmxldF9yZGVzY190ZW1wbGF0ZSwKLQkJZHJ2ZGF0YS0+cnNpemUpOwotCWZvciAocCA9IGRydmRhdGEtPnJkZXNjOwotCSAgICAgcCA8PSBkcnZkYXRhLT5yZGVzYyArIGRydmRhdGEtPnJzaXplIC0gNDspIHsKLQkJaWYgKHBbMF0gPT0gMHhGRSAmJiBwWzFdID09IDB4RUQgJiYgcFsyXSA9PSAweDFEICYmCi0JCSAgICBwWzNdIDwgc2l6ZW9mKHBhcmFtcykpIHsKLQkJCXYgPSBwYXJhbXNbcFszXV07Ci0JCQlwdXRfdW5hbGlnbmVkKGNwdV90b19sZTMyKHYpLCAoczMyICopcCk7Ci0JCQlwICs9IDQ7Ci0JCX0gZWxzZSB7Ci0JCQlwKys7Ci0JCX0KLQl9Ci0KLQlyYyA9IDA7Ci0KLWNsZWFudXA6Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBpbnQgaHVpb25fcHJvYmUoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIGNvbnN0IHN0cnVjdCBoaWRfZGV2aWNlX2lkICppZCkKLXsKLQlpbnQgcmM7Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGhkZXYtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBodWlvbl9kcnZkYXRhICpkcnZkYXRhOwotCi0JLyogQWxsb2NhdGUgYW5kIGFzc2lnbiBkcml2ZXIgZGF0YSAqLwotCWRydmRhdGEgPSBkZXZtX2t6YWxsb2MoJmhkZXYtPmRldiwgc2l6ZW9mKCpkcnZkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRydmRhdGEgPT0gTlVMTCkgewotCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZHJpdmVyIGRhdGFcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JaGlkX3NldF9kcnZkYXRhKGhkZXYsIGRydmRhdGEpOwotCi0Jc3dpdGNoIChpZC0+cHJvZHVjdCkgewotCWNhc2UgVVNCX0RFVklDRV9JRF9IVUlPTl9UQUJMRVQ6Ci0JCS8qIElmIHRoaXMgaXMgdGhlIHBlbiBpbnRlcmZhY2UgKi8KLQkJaWYgKGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXIgPT0gMCkgewotCQkJcmMgPSBodWlvbl90YWJsZXRfZW5hYmxlKGhkZXYpOwotCQkJaWYgKHJjKSB7Ci0JCQkJaGlkX2VycihoZGV2LCAidGFibGV0IGVuYWJsaW5nIGZhaWxlZFxuIik7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQl9Ci0JCWJyZWFrOwotCX0KLQotCXJjID0gaGlkX3BhcnNlKGhkZXYpOwotCWlmIChyYykgewotCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmMgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7Ci0JaWYgKHJjKSB7Ci0JCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBodWlvbl9yYXdfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQsCi0JCQl1OCAqZGF0YSwgaW50IHNpemUpCi17Ci0Jc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYgPSB0b191c2JfaW50ZXJmYWNlKGhkZXYtPmRldi5wYXJlbnQpOwotCi0JLyogSWYgdGhpcyBpcyBhIHBlbiBpbnB1dCByZXBvcnQgKi8KLQlpZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlciA9PSAwICYmCi0JICAgIHJlcG9ydC0+dHlwZSA9PSBISURfSU5QVVRfUkVQT1JUICYmCi0JICAgIHJlcG9ydC0+aWQgPT0gMHgwNyAmJiBzaXplID49IDIpCi0JCS8qIEludmVydCB0aGUgaW4tcmFuZ2UgYml0ICovCi0JCWRhdGFbMV0gXj0gMHg0MDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgaHVpb25fZGV2aWNlc1tdID0gewotCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9IVUlPTiwgVVNCX0RFVklDRV9JRF9IVUlPTl9UQUJMRVQpIH0sCi0JeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfSFVJT05fVEFCTEVUKSB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoaGlkLCBodWlvbl9kZXZpY2VzKTsKLQotc3RhdGljIHN0cnVjdCBoaWRfZHJpdmVyIGh1aW9uX2RyaXZlciA9IHsKLQkubmFtZSA9ICJodWlvbiIsCi0JLmlkX3RhYmxlID0gaHVpb25fZGV2aWNlcywKLQkucHJvYmUgPSBodWlvbl9wcm9iZSwKLQkucmVwb3J0X2ZpeHVwID0gaHVpb25fcmVwb3J0X2ZpeHVwLAotCS5yYXdfZXZlbnQgPSBodWlvbl9yYXdfZXZlbnQsCi19OwotbW9kdWxlX2hpZF9kcml2ZXIoaHVpb25fZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiTWFydGluIFJ1c2tvIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkh1aW9uIEhJRCBkcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1pZHMuaCBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaAppbmRleCAyMDQzMTJiLi40MWYxNjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLWlkcy5oCkBAIC00NTksNiArNDU5LDExIEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUdDSV9GTFlJTkcJMHgwMDIwCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVUdDSV9GSUdIVElORwkweDAwMzAKIAorI2RlZmluZSBVU0JfVkVORE9SX0lEX0hQCQkweDAzZjAKKyNkZWZpbmUgVVNCX1BST0RVQ1RfSURfSFBfTE9HSVRFQ0hfT0VNX1VTQl9PUFRJQ0FMX01PVVNFXzBBNEEJMHgwYTRhCisjZGVmaW5lIFVTQl9QUk9EVUNUX0lEX0hQX0xPR0lURUNIX09FTV9VU0JfT1BUSUNBTF9NT1VTRV8wQjRBCTB4MGI0YQorI2RlZmluZSBVU0JfUFJPRFVDVF9JRF9IUF9QSVhBUlRfT0VNX1VTQl9PUFRJQ0FMX01PVVNFCQkweDEzNGEKKwogI2RlZmluZSBVU0JfVkVORE9SX0lEX0hVSU9OCQkweDI1NmMKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9IVUlPTl9UQUJMRVQJMHgwMDZlCiAKQEAgLTUzMyw2ICs1MzgsNyBAQAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0tZRV9NT1VTRVBFTl9JNjA4WAkweDUwMTEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9LWUVfTU9VU0VQRU5fSTYwOFhfMgkweDUwMWEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9LWUVfRUFTWVBFTl9NNjEwWAkweDUwMTMKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9LWUVfUEVOU0tFVENIX005MTIJMHg1MDE1CiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9MQUJURUMJCTB4MTAyMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0xBQlRFQ19XSVJFTEVTU19LRVlCT0FSRAkweDAwMDYKQEAgLTU4NiwxMCArNTkyLDE0IEBACiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gJCTB4MDQ2ZAogI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0FVRElPSFVCIDB4MGEwZQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1Q2NTEJMHhiMDBjCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfQzA3NwkweGMwMDcKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9SRUNFSVZFUgkweGMxMDEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZX0ZJUlNUICAweGMxMTAKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9IQVJNT05ZX0xBU1QgMHhjMTRmCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfSEFSTU9OWV9QUzMgMHgwMzA2CisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTU9VU0VfQzAxQQkweGMwMWEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9NT1VTRV9DMDVBCTB4YzA1YQorI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX01PVVNFX0MwNkEJMHhjMDZhCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUlVNQkxFUEFEX0NPUkQJMHhjMjBhCiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfUlVNQkxFUEFECTB4YzIxMQogI2RlZmluZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0VYVFJFTUVfM0QJMHhjMjE1CkBAIC04OTgsNiArOTA4LDcgQEAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9USVZPCQkweDE1MGEKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9USVZPX1NMSURFX0JUCTB4MTIwMAogI2RlZmluZSBVU0JfREVWSUNFX0lEX1RJVk9fU0xJREUJMHgxMjAxCisjZGVmaW5lIFVTQl9ERVZJQ0VfSURfVElWT19TTElERV9QUk8JMHgxMjAzCiAKICNkZWZpbmUgVVNCX1ZFTkRPUl9JRF9UT1BTRUVECQkweDA3NjYKICNkZWZpbmUgVVNCX0RFVklDRV9JRF9UT1BTRUVEX0NZQkVSTElOSwkweDAyMDQKQEAgLTEwMjAsNiArMTAzMSw3IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfWllUUk9OSUNfWlhZMTAwCTB4MDAwNQogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfUFJJTUFYCTB4MDQ2MQorI2RlZmluZSBVU0JfREVWSUNFX0lEX1BSSU1BWF9NT1VTRV80RDIyCTB4NGQyMgogI2RlZmluZSBVU0JfREVWSUNFX0lEX1BSSU1BWF9LRVlCT0FSRAkweDRlMDUKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaW5wdXQuYyBiL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCmluZGV4IDA1Mjg2OWQuLjAwOGU4OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pbnB1dC5jCkBAIC0zMzksNyArMzM5LDcgQEAKIAkJCQkJIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHByb3AsCiAJCQkJCSB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBoaWRfZGV2aWNlICpkZXYgPSBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgaGlkX2RldmljZSwgYmF0dGVyeSk7CisJc3RydWN0IGhpZF9kZXZpY2UgKmRldiA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCWludCByZXQgPSAwOwogCV9fdTggKmJ1ZjsKIApAQCAtMzk3LDI2ICszOTcsMzIgQEAKIAogc3RhdGljIGJvb2wgaGlkaW5wdXRfc2V0dXBfYmF0dGVyeShzdHJ1Y3QgaGlkX2RldmljZSAqZGV2LCB1bnNpZ25lZCByZXBvcnRfdHlwZSwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQpCiB7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeSA9ICZkZXYtPmJhdHRlcnk7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKnBzeV9kZXNjID0gTlVMTDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0geyAuZHJ2X2RhdGEgPSBkZXYsIH07CiAJdW5zaWduZWQgcXVpcmtzOwogCXMzMiBtaW4sIG1heDsKIAogCWlmIChmaWVsZC0+dXNhZ2UtPmhpZCAhPSBISURfRENfQkFUVEVSWVNUUkVOR1RIKQogCQlyZXR1cm4gZmFsc2U7CS8qIG5vIG1hdGNoICovCiAKLQlpZiAoYmF0dGVyeS0+bmFtZSAhPSBOVUxMKQorCWlmIChkZXYtPmJhdHRlcnkgIT0gTlVMTCkKIAkJZ290byBvdXQ7CS8qIGFscmVhZHkgaW5pdGlhbGl6ZWQ/ICovCiAKLQliYXR0ZXJ5LT5uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJoaWQtJXMtYmF0dGVyeSIsIGRldi0+dW5pcSk7Ci0JaWYgKGJhdHRlcnktPm5hbWUgPT0gTlVMTCkKKwlwc3lfZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpwc3lfZGVzYyksIEdGUF9LRVJORUwpOworCWlmIChwc3lfZGVzYyA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAotCWJhdHRlcnktPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCWJhdHRlcnktPnByb3BlcnRpZXMgPSBoaWRpbnB1dF9iYXR0ZXJ5X3Byb3BzOwotCWJhdHRlcnktPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShoaWRpbnB1dF9iYXR0ZXJ5X3Byb3BzKTsKLQliYXR0ZXJ5LT51c2VfZm9yX2FwbSA9IDA7Ci0JYmF0dGVyeS0+Z2V0X3Byb3BlcnR5ID0gaGlkaW5wdXRfZ2V0X2JhdHRlcnlfcHJvcGVydHk7CisJcHN5X2Rlc2MtPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgImhpZC0lcy1iYXR0ZXJ5IiwgZGV2LT51bmlxKTsKKwlpZiAocHN5X2Rlc2MtPm5hbWUgPT0gTlVMTCkgeworCQlrZnJlZShwc3lfZGVzYyk7CisJCWdvdG8gb3V0OworCX0KKworCXBzeV9kZXNjLT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKKwlwc3lfZGVzYy0+cHJvcGVydGllcyA9IGhpZGlucHV0X2JhdHRlcnlfcHJvcHM7CisJcHN5X2Rlc2MtPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShoaWRpbnB1dF9iYXR0ZXJ5X3Byb3BzKTsKKwlwc3lfZGVzYy0+dXNlX2Zvcl9hcG0gPSAwOworCXBzeV9kZXNjLT5nZXRfcHJvcGVydHkgPSBoaWRpbnB1dF9nZXRfYmF0dGVyeV9wcm9wZXJ0eTsKIAogCXF1aXJrcyA9IGZpbmRfYmF0dGVyeV9xdWlyayhkZXYpOwogCkBAIC00MzksMjcgKzQ0NSwzMCBAQAogCWRldi0+YmF0dGVyeV9yZXBvcnRfdHlwZSA9IHJlcG9ydF90eXBlOwogCWRldi0+YmF0dGVyeV9yZXBvcnRfaWQgPSBmaWVsZC0+cmVwb3J0LT5pZDsKIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmZGV2LT5kZXYsIGJhdHRlcnkpOwotCWlmIChyZXQgIT0gMCkgewotCQloaWRfd2FybihkZXYsICJjYW4ndCByZWdpc3RlciBwb3dlciBzdXBwbHk6ICVkXG4iLCByZXQpOwotCQlrZnJlZShiYXR0ZXJ5LT5uYW1lKTsKLQkJYmF0dGVyeS0+bmFtZSA9IE5VTEw7CisJZGV2LT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZkZXYtPmRldiwgcHN5X2Rlc2MsICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGRldi0+YmF0dGVyeSkpIHsKKwkJaGlkX3dhcm4oZGV2LCAiY2FuJ3QgcmVnaXN0ZXIgcG93ZXIgc3VwcGx5OiAlbGRcbiIsCisJCQkJUFRSX0VSUihkZXYtPmJhdHRlcnkpKTsKKwkJa2ZyZWUocHN5X2Rlc2MtPm5hbWUpOworCQlrZnJlZShwc3lfZGVzYyk7CisJCWRldi0+YmF0dGVyeSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJcG93ZXJfc3VwcGx5X3Bvd2VycyhkZXYtPmJhdHRlcnksICZkZXYtPmRldik7CiAJfQogCi0JcG93ZXJfc3VwcGx5X3Bvd2VycyhiYXR0ZXJ5LCAmZGV2LT5kZXYpOwotCiBvdXQ6CiAJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIGhpZGlucHV0X2NsZWFudXBfYmF0dGVyeShzdHJ1Y3QgaGlkX2RldmljZSAqZGV2KQogewotCWlmICghZGV2LT5iYXR0ZXJ5Lm5hbWUpCisJaWYgKCFkZXYtPmJhdHRlcnkpCiAJCXJldHVybjsKIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkZXYtPmJhdHRlcnkpOwotCWtmcmVlKGRldi0+YmF0dGVyeS5uYW1lKTsKLQlkZXYtPmJhdHRlcnkubmFtZSA9IE5VTEw7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGV2LT5iYXR0ZXJ5KTsKKwlrZnJlZShkZXYtPmJhdHRlcnktPmRlc2MtPm5hbWUpOworCWtmcmVlKGRldi0+YmF0dGVyeS0+ZGVzYyk7CisJZGV2LT5iYXR0ZXJ5ID0gTlVMTDsKIH0KICNlbHNlICAvKiAhQ09ORklHX0hJRF9CQVRURVJZX1NUUkVOR1RIICovCiBzdGF0aWMgYm9vbCBoaWRpbnB1dF9zZXR1cF9iYXR0ZXJ5KHN0cnVjdCBoaWRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHJlcG9ydF90eXBlLApAQCAtNzExLDYgKzcyMCwyOSBAQAogCQl9CiAJCWJyZWFrOwogCisJY2FzZSBISURfVVBfVEVMRVBIT05ZOgorCQlzd2l0Y2ggKHVzYWdlLT5oaWQgJiBISURfVVNBR0UpIHsKKwkJY2FzZSAweDJmOiBtYXBfa2V5X2NsZWFyKEtFWV9NSUNNVVRFKTsJCWJyZWFrOworCQljYXNlIDB4YjA6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfMCk7CWJyZWFrOworCQljYXNlIDB4YjE6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfMSk7CWJyZWFrOworCQljYXNlIDB4YjI6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfMik7CWJyZWFrOworCQljYXNlIDB4YjM6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfMyk7CWJyZWFrOworCQljYXNlIDB4YjQ6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfNCk7CWJyZWFrOworCQljYXNlIDB4YjU6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfNSk7CWJyZWFrOworCQljYXNlIDB4YjY6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfNik7CWJyZWFrOworCQljYXNlIDB4Yjc6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfNyk7CWJyZWFrOworCQljYXNlIDB4Yjg6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfOCk7CWJyZWFrOworCQljYXNlIDB4Yjk6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfOSk7CWJyZWFrOworCQljYXNlIDB4YmE6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfU1RBUik7CWJyZWFrOworCQljYXNlIDB4YmI6IG1hcF9rZXlfY2xlYXIoS0VZX05VTUVSSUNfUE9VTkQpOwlicmVhazsKKwkJY2FzZSAweGJjOiBtYXBfa2V5X2NsZWFyKEtFWV9OVU1FUklDX0EpOwlicmVhazsKKwkJY2FzZSAweGJkOiBtYXBfa2V5X2NsZWFyKEtFWV9OVU1FUklDX0IpOwlicmVhazsKKwkJY2FzZSAweGJlOiBtYXBfa2V5X2NsZWFyKEtFWV9OVU1FUklDX0MpOwlicmVhazsKKwkJY2FzZSAweGJmOiBtYXBfa2V5X2NsZWFyKEtFWV9OVU1FUklDX0QpOwlicmVhazsKKwkJZGVmYXVsdDogZ290byBpZ25vcmU7CisJCX0KKwkJYnJlYWs7CisKIAljYXNlIEhJRF9VUF9DT05TVU1FUjoJLyogVVNCIEhVVCB2MS4xMiwgcGFnZXMgNzUtODQgKi8KIAkJc3dpdGNoICh1c2FnZS0+aGlkICYgSElEX1VTQUdFKSB7CiAJCWNhc2UgMHgwMDA6IGdvdG8gaWdub3JlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWt5ZS5jIGIvZHJpdmVycy9oaWQvaGlkLWt5ZS5jCmluZGV4IDE1OGZjZjUuLjMyZTZkOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1reWUuYworKysgYi9kcml2ZXJzL2hpZC9oaWQta3llLmMKQEAgLTI2OCw2ICsyNjgsMTM3IEBACiAJMHhDMCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIEVuZCBDb2xsZWN0aW9uICAgICAgICAgICAgICAgICAgKi8KIH07CiAKKworLyogT3JpZ2luYWwgUGVuU2tldGNoIE05MTIgcmVwb3J0IGRlc2NyaXB0b3Igc2l6ZSAqLworI2RlZmluZSBQRU5TS0VUQ0hfTTkxMl9SREVTQ19PUklHX1NJWkUJNDgyCisKKy8qIEZpeGVkIFBlblNrZXRjaCBNOTEyIHJlcG9ydCBkZXNjcmlwdG9yICovCitzdGF0aWMgX191OCBwZW5za2V0Y2hfbTkxMl9yZGVzY19maXhlZFtdID0geworCTB4MDUsIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICBVc2FnZSBQYWdlIChEZXNrdG9wKSwgICAgICAgICAgICovCisJMHgwOCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogIFVzYWdlICgwMGgpLCAgICAgICAgICAgICAgICAgICAgKi8KKwkweEExLCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgQ29sbGVjdGlvbiAoQXBwbGljYXRpb24pLCAgICAgICAqLworCTB4ODUsIDB4MDUsICAgICAgICAgICAgICAgICAgIC8qICAgIFJlcG9ydCBJRCAoNSksICAgICAgICAgICAgICAgICovCisJMHgwNiwgMHgwMCwgMHhGRiwgICAgICAgICAgICAgLyogICAgVXNhZ2UgUGFnZSAoRkYwMGgpLCAgICAgICAgICAgKi8KKwkweDA5LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICBVc2FnZSAoMDFoKSwgICAgICAgICAgICAgICAgICAqLworCTB4MTUsIDB4ODEsICAgICAgICAgICAgICAgICAgIC8qICAgIExvZ2ljYWwgTWluaW11bSAoLTEyNyksICAgICAgICovCisJMHgyNSwgMHg3RiwgICAgICAgICAgICAgICAgICAgLyogICAgTG9naWNhbCBNYXhpbXVtICgxMjcpLCAgICAgICAgKi8KKwkweDc1LCAweDA4LCAgICAgICAgICAgICAgICAgICAvKiAgICBSZXBvcnQgU2l6ZSAoOCksICAgICAgICAgICAgICAqLworCTB4OTUsIDB4MDcsICAgICAgICAgICAgICAgICAgIC8qICAgIFJlcG9ydCBDb3VudCAoNyksICAgICAgICAgICAgICovCisJMHhCMSwgMHgwMiwgICAgICAgICAgICAgICAgICAgLyogICAgRmVhdHVyZSAoVmFyaWFibGUpLCAgICAgICAgICAgKi8KKwkweEMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgRW5kIENvbGxlY3Rpb24sICAgICAgICAgICAgICAgICAqLworCTB4MDUsIDB4MEQsICAgICAgICAgICAgICAgICAgIC8qICBVc2FnZSBQYWdlIChEaWdpdGl6ZXIpLCAgICAgICAgICovCisJMHgwOSwgMHgwMiwgICAgICAgICAgICAgICAgICAgLyogIFVzYWdlIChQZW4pLCAgICAgICAgICAgICAgICAgICAgKi8KKwkweEExLCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgQ29sbGVjdGlvbiAoQXBwbGljYXRpb24pLCAgICAgICAqLworCTB4ODUsIDB4MTAsICAgICAgICAgICAgICAgICAgIC8qICAgIFJlcG9ydCBJRCAoMTYpLCAgICAgICAgICAgICAgICovCisJMHgwOSwgMHgyMCwgICAgICAgICAgICAgICAgICAgLyogICAgVXNhZ2UgKFN0eWx1cyksICAgICAgICAgICAgICAgKi8KKwkweEEwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBDb2xsZWN0aW9uIChQaHlzaWNhbCksICAgICAgICAqLworCTB4MDksIDB4NDIsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgKFRpcCBTd2l0Y2gpLCAgICAgICAgICovCisJMHgwOSwgMHg0NCwgICAgICAgICAgICAgICAgICAgLyogICAgICBVc2FnZSAoQmFycmVsIFN3aXRjaCksICAgICAgKi8KKwkweDA5LCAweDQ2LCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFVzYWdlIChUYWJsZXQgUGljayksICAgICAgICAqLworCTB4MTQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgTG9naWNhbCBNaW5pbXVtICgwKSwgICAgICAgICovCisJMHgyNSwgMHgwMSwgICAgICAgICAgICAgICAgICAgLyogICAgICBMb2dpY2FsIE1heGltdW0gKDEpLCAgICAgICAgKi8KKwkweDc1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBTaXplICgxKSwgICAgICAgICAgICAqLworCTB4OTUsIDB4MDMsICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVwb3J0IENvdW50ICgzKSwgICAgICAgICAgICovCisJMHg4MSwgMHgwMiwgICAgICAgICAgICAgICAgICAgLyogICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgKi8KKwkweDk1LCAweDA0LCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBDb3VudCAoNCksICAgICAgICAgICAqLworCTB4ODEsIDB4MDMsICAgICAgICAgICAgICAgICAgIC8qICAgICAgSW5wdXQgKENvbnN0YW50LCBWYXJpYWJsZSksICovCisJMHgwOSwgMHgzMiwgICAgICAgICAgICAgICAgICAgLyogICAgICBVc2FnZSAoSW4gUmFuZ2UpLCAgICAgICAgICAgKi8KKwkweDk1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBDb3VudCAoMSksICAgICAgICAgICAqLworCTB4ODEsIDB4MDIsICAgICAgICAgICAgICAgICAgIC8qICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisJMHg3NSwgMHgxMCwgICAgICAgICAgICAgICAgICAgLyogICAgICBSZXBvcnQgU2l6ZSAoMTYpLCAgICAgICAgICAgKi8KKwkweDk1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBDb3VudCAoMSksICAgICAgICAgICAqLworCTB4QTQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUHVzaCwgICAgICAgICAgICAgICAgICAgICAgICovCisJMHgwNSwgMHgwMSwgICAgICAgICAgICAgICAgICAgLyogICAgICBVc2FnZSBQYWdlIChEZXNrdG9wKSwgICAgICAgKi8KKwkweDU1LCAweEZELCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFVuaXQgRXhwb25lbnQgKC0zKSwgICAgICAgICAqLworCTB4NjUsIDB4MTMsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVW5pdCAoSW5jaCksICAgICAgICAgICAgICAgICovCisJMHgxNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBMb2dpY2FsIE1pbmltdW0gKDApLCAgICAgICAgKi8KKwkweDM0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFBoeXNpY2FsIE1pbmltdW0gKDApLCAgICAgICAqLworCTB4MDksIDB4MzAsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgKFgpLCAgICAgICAgICAgICAgICAgICovCisJMHgyNywgMHgwMCwgMHhGMCwgMHgwMCwgMHgwMCwgLyogICAgICBMb2dpY2FsIE1heGltdW0gKDYxNDQwKSwgICAgKi8KKwkweDQ2LCAweEUwLCAweDJFLCAgICAgICAgICAgICAvKiAgICAgIFBoeXNpY2FsIE1heGltdW0gKDEyMDAwKSwgICAqLworCTB4ODEsIDB4MDIsICAgICAgICAgICAgICAgICAgIC8qICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisJMHgwOSwgMHgzMSwgICAgICAgICAgICAgICAgICAgLyogICAgICBVc2FnZSAoWSksICAgICAgICAgICAgICAgICAgKi8KKwkweDI3LCAweDAwLCAweEI0LCAweDAwLCAweDAwLCAvKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoNDYwODApLCAgICAqLworCTB4NDYsIDB4MjgsIDB4MjMsICAgICAgICAgICAgIC8qICAgICAgUGh5c2ljYWwgTWF4aW11bSAoOTAwMCksICAgICovCisJMHg4MSwgMHgwMiwgICAgICAgICAgICAgICAgICAgLyogICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgKi8KKwkweEI0LCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIFBvcCwgICAgICAgICAgICAgICAgICAgICAgICAqLworCTB4MDksIDB4MzAsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgKFRpcCBQcmVzc3VyZSksICAgICAgICovCisJMHgxNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBMb2dpY2FsIE1pbmltdW0gKDApLCAgICAgICAgKi8KKwkweDI2LCAweEZGLCAweDA3LCAgICAgICAgICAgICAvKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoMjA0NyksICAgICAqLworCTB4ODEsIDB4MDIsICAgICAgICAgICAgICAgICAgIC8qICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisJMHhDMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgRW5kIENvbGxlY3Rpb24sICAgICAgICAgICAgICAgKi8KKwkweEMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgRW5kIENvbGxlY3Rpb24sICAgICAgICAgICAgICAgICAqLworCTB4MDUsIDB4MEQsICAgICAgICAgICAgICAgICAgIC8qICBVc2FnZSBQYWdlIChEaWdpdGl6ZXIpLCAgICAgICAgICovCisJMHgwOSwgMHgyMSwgICAgICAgICAgICAgICAgICAgLyogIFVzYWdlIChQdWNrKSwgICAgICAgICAgICAgICAgICAgKi8KKwkweEExLCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgQ29sbGVjdGlvbiAoQXBwbGljYXRpb24pLCAgICAgICAqLworCTB4ODUsIDB4MTEsICAgICAgICAgICAgICAgICAgIC8qICAgIFJlcG9ydCBJRCAoMTcpLCAgICAgICAgICAgICAgICovCisJMHgwOSwgMHgyMSwgICAgICAgICAgICAgICAgICAgLyogICAgVXNhZ2UgKFB1Y2spLCAgICAgICAgICAgICAgICAgKi8KKwkweEEwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICBDb2xsZWN0aW9uIChQaHlzaWNhbCksICAgICAgICAqLworCTB4MDUsIDB4MDksICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgUGFnZSAoQnV0dG9uKSwgICAgICAgICovCisJMHg3NSwgMHgwMSwgICAgICAgICAgICAgICAgICAgLyogICAgICBSZXBvcnQgU2l6ZSAoMSksICAgICAgICAgICAgKi8KKwkweDE5LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFVzYWdlIE1pbmltdW0gKDAxaCksICAgICAgICAqLworCTB4MjksIDB4MDMsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgTWF4aW11bSAoMDNoKSwgICAgICAgICovCisJMHgxNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBMb2dpY2FsIE1pbmltdW0gKDApLCAgICAgICAgKi8KKwkweDI1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoMSksICAgICAgICAqLworCTB4OTUsIDB4MDMsICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVwb3J0IENvdW50ICgzKSwgICAgICAgICAgICovCisJMHg4MSwgMHgwMiwgICAgICAgICAgICAgICAgICAgLyogICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgKi8KKwkweDk1LCAweDA0LCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBDb3VudCAoNCksICAgICAgICAgICAqLworCTB4ODEsIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICAgICAgSW5wdXQgKENvbnN0YW50KSwgICAgICAgICAgICovCisJMHg5NSwgMHgwMSwgICAgICAgICAgICAgICAgICAgLyogICAgICBSZXBvcnQgQ291bnQgKDEpLCAgICAgICAgICAgKi8KKwkweDBCLCAweDMyLCAweDAwLCAweDBELCAweDAwLCAvKiAgICAgIFVzYWdlIChEaWdpdGl6ZXIgSW4gUmFuZ2UpLCAqLworCTB4MTQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgTG9naWNhbCBNaW5pbXVtICgwKSwgICAgICAgICovCisJMHgyNSwgMHgwMSwgICAgICAgICAgICAgICAgICAgLyogICAgICBMb2dpY2FsIE1heGltdW0gKDEpLCAgICAgICAgKi8KKwkweDgxLCAweDAyLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAqLworCTB4QTQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUHVzaCwgICAgICAgICAgICAgICAgICAgICAgICovCisJMHgwNSwgMHgwMSwgICAgICAgICAgICAgICAgICAgLyogICAgICBVc2FnZSBQYWdlIChEZXNrdG9wKSwgICAgICAgKi8KKwkweDc1LCAweDEwLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBTaXplICgxNiksICAgICAgICAgICAqLworCTB4OTUsIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVwb3J0IENvdW50ICgxKSwgICAgICAgICAgICovCisJMHg1NSwgMHhGRCwgICAgICAgICAgICAgICAgICAgLyogICAgICBVbml0IEV4cG9uZW50ICgtMyksICAgICAgICAgKi8KKwkweDY1LCAweDEzLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFVuaXQgKEluY2gpLCAgICAgICAgICAgICAgICAqLworCTB4MTQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgTG9naWNhbCBNaW5pbXVtICgwKSwgICAgICAgICovCisJMHgzNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBQaHlzaWNhbCBNaW5pbXVtICgwKSwgICAgICAgKi8KKwkweDA5LCAweDMwLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFVzYWdlIChYKSwgICAgICAgICAgICAgICAgICAqLworCTB4MjcsIDB4MDAsIDB4RjAsIDB4MDAsIDB4MDAsIC8qICAgICAgTG9naWNhbCBNYXhpbXVtICg2MTQ0MCksICAgICovCisJMHg0NiwgMHhFMCwgMHgyRSwgICAgICAgICAgICAgLyogICAgICBQaHlzaWNhbCBNYXhpbXVtICgxMjAwMCksICAgKi8KKwkweDgxLCAweDAyLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAqLworCTB4MDksIDB4MzEsICAgICAgICAgICAgICAgICAgIC8qICAgICAgVXNhZ2UgKFkpLCAgICAgICAgICAgICAgICAgICovCisJMHgyNywgMHgwMCwgMHhCNCwgMHgwMCwgMHgwMCwgLyogICAgICBMb2dpY2FsIE1heGltdW0gKDQ2MDgwKSwgICAgKi8KKwkweDQ2LCAweDI4LCAweDIzLCAgICAgICAgICAgICAvKiAgICAgIFBoeXNpY2FsIE1heGltdW0gKDkwMDApLCAgICAqLworCTB4ODEsIDB4MDIsICAgICAgICAgICAgICAgICAgIC8qICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICovCisJMHgwOSwgMHgzOCwgICAgICAgICAgICAgICAgICAgLyogICAgICBVc2FnZSAoV2hlZWwpLCAgICAgICAgICAgICAgKi8KKwkweDc1LCAweDA4LCAgICAgICAgICAgICAgICAgICAvKiAgICAgIFJlcG9ydCBTaXplICg4KSwgICAgICAgICAgICAqLworCTB4OTUsIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICAgICAgUmVwb3J0IENvdW50ICgxKSwgICAgICAgICAgICovCisJMHgxNSwgMHhGRiwgICAgICAgICAgICAgICAgICAgLyogICAgICBMb2dpY2FsIE1pbmltdW0gKC0xKSwgICAgICAgKi8KKwkweDI1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICAgIExvZ2ljYWwgTWF4aW11bSAoMSksICAgICAgICAqLworCTB4MzQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUGh5c2ljYWwgTWluaW11bSAoMCksICAgICAgICovCisJMHg0NCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBQaHlzaWNhbCBNYXhpbXVtICgwKSwgICAgICAgKi8KKwkweDgxLCAweDA2LCAgICAgICAgICAgICAgICAgICAvKiAgICAgIElucHV0IChWYXJpYWJsZSwgUmVsYXRpdmUpLCAqLworCTB4QjQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgUG9wLCAgICAgICAgICAgICAgICAgICAgICAgICovCisJMHhDMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgRW5kIENvbGxlY3Rpb24sICAgICAgICAgICAgICAgKi8KKwkweEMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgRW5kIENvbGxlY3Rpb24sICAgICAgICAgICAgICAgICAqLworCTB4MDUsIDB4MEMsICAgICAgICAgICAgICAgICAgIC8qICBVc2FnZSBQYWdlIChDb25zdW1lciksICAgICAgICAgICovCisJMHgwOSwgMHgwMSwgICAgICAgICAgICAgICAgICAgLyogIFVzYWdlIChDb25zdW1lciBDb250cm9sKSwgICAgICAgKi8KKwkweEExLCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgQ29sbGVjdGlvbiAoQXBwbGljYXRpb24pLCAgICAgICAqLworCTB4ODUsIDB4MTIsICAgICAgICAgICAgICAgICAgIC8qICAgIFJlcG9ydCBJRCAoMTgpLCAgICAgICAgICAgICAgICovCisJMHgxNCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgTG9naWNhbCBNaW5pbXVtICgwKSwgICAgICAgICAgKi8KKwkweDI1LCAweDAxLCAgICAgICAgICAgICAgICAgICAvKiAgICBMb2dpY2FsIE1heGltdW0gKDEpLCAgICAgICAgICAqLworCTB4NzUsIDB4MDEsICAgICAgICAgICAgICAgICAgIC8qICAgIFJlcG9ydCBTaXplICgxKSwgICAgICAgICAgICAgICovCisJMHg5NSwgMHgwOCwgICAgICAgICAgICAgICAgICAgLyogICAgUmVwb3J0IENvdW50ICg4KSwgICAgICAgICAgICAgKi8KKwkweDA1LCAweDBDLCAgICAgICAgICAgICAgICAgICAvKiAgICBVc2FnZSBQYWdlIChDb25zdW1lciksICAgICAgICAqLworCTB4MEEsIDB4NkEsIDB4MDIsICAgICAgICAgICAgIC8qICAgIFVzYWdlIChBQyBEZWxldGUpLCAgICAgICAgICAgICovCisJMHgwQSwgMHgxQSwgMHgwMiwgICAgICAgICAgICAgLyogICAgVXNhZ2UgKEFDIFVuZG8pLCAgICAgICAgICAgICAgKi8KKwkweDBBLCAweDAxLCAweDAyLCAgICAgICAgICAgICAvKiAgICBVc2FnZSAoQUMgTmV3KSwgICAgICAgICAgICAgICAqLworCTB4MEEsIDB4MkYsIDB4MDIsICAgICAgICAgICAgIC8qICAgIFVzYWdlIChBQyBab29tKSwgICAgICAgICAgICAgICovCisJMHgwQSwgMHgyNSwgMHgwMiwgICAgICAgICAgICAgLyogICAgVXNhZ2UgKEFDIEZvcndhcmQpLCAgICAgICAgICAgKi8KKwkweDBBLCAweDI0LCAweDAyLCAgICAgICAgICAgICAvKiAgICBVc2FnZSAoQUMgQmFjayksICAgICAgICAgICAgICAqLworCTB4MEEsIDB4MkQsIDB4MDIsICAgICAgICAgICAgIC8qICAgIFVzYWdlIChBQyBab29tIEluKSwgICAgICAgICAgICovCisJMHgwQSwgMHgyRSwgMHgwMiwgICAgICAgICAgICAgLyogICAgVXNhZ2UgKEFDIFpvb20gT3V0KSwgICAgICAgICAgKi8KKwkweDgxLCAweDAyLCAgICAgICAgICAgICAgICAgICAvKiAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgICAqLworCTB4OTUsIDB4MzAsICAgICAgICAgICAgICAgICAgIC8qICAgIFJlcG9ydCBDb3VudCAoNDgpLCAgICAgICAgICAgICovCisJMHg4MSwgMHgwMywgICAgICAgICAgICAgICAgICAgLyogICAgSW5wdXQgKENvbnN0YW50LCBWYXJpYWJsZSksICAgKi8KKwkweEMwICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgRW5kIENvbGxlY3Rpb24gICAgICAgICAgICAgICAgICAqLworfTsKKwogc3RhdGljIF9fdTggKmt5ZV9jb25zdW1lcl9jb250cm9sX2ZpeHVwKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBfX3U4ICpyZGVzYywKIAkJdW5zaWduZWQgaW50ICpyc2l6ZSwgaW50IG9mZnNldCwgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpIHsKIAkvKgpAQCAtMzM1LDYgKzQ2NiwxMiBAQAogCQkJKnJzaXplID0gc2l6ZW9mKGVhc3lwZW5fbTYxMHhfcmRlc2NfZml4ZWQpOwogCQl9CiAJCWJyZWFrOworCWNhc2UgVVNCX0RFVklDRV9JRF9LWUVfUEVOU0tFVENIX005MTI6CisJCWlmICgqcnNpemUgPT0gUEVOU0tFVENIX005MTJfUkRFU0NfT1JJR19TSVpFKSB7CisJCQlyZGVzYyA9IHBlbnNrZXRjaF9tOTEyX3JkZXNjX2ZpeGVkOworCQkJKnJzaXplID0gc2l6ZW9mKHBlbnNrZXRjaF9tOTEyX3JkZXNjX2ZpeGVkKTsKKwkJfQorCQlicmVhazsKIAljYXNlIFVTQl9ERVZJQ0VfSURfR0VOSVVTX0dJTEFfR0FNSU5HX01PVVNFOgogCQlyZGVzYyA9IGt5ZV9jb25zdW1lcl9jb250cm9sX2ZpeHVwKGhkZXYsIHJkZXNjLCByc2l6ZSwgMTA0LAogCQkJCQkiR2VuaXVzIEdpbGEgR2FtaW5nIE1vdXNlIik7CkBAIC00MTgsNiArNTU1LDcgQEAKIAljYXNlIFVTQl9ERVZJQ0VfSURfS1lFX01PVVNFUEVOX0k2MDhYOgogCWNhc2UgVVNCX0RFVklDRV9JRF9LWUVfTU9VU0VQRU5fSTYwOFhfMjoKIAljYXNlIFVTQl9ERVZJQ0VfSURfS1lFX0VBU1lQRU5fTTYxMFg6CisJY2FzZSBVU0JfREVWSUNFX0lEX0tZRV9QRU5TS0VUQ0hfTTkxMjoKIAkJcmV0ID0ga3llX3RhYmxldF9lbmFibGUoaGRldik7CiAJCWlmIChyZXQpIHsKIAkJCWhpZF9lcnIoaGRldiwgInRhYmxldCBlbmFibGluZyBmYWlsZWRcbiIpOwpAQCAtNDU3LDYgKzU5NSw4IEBACiAJCQkJVVNCX0RFVklDRV9JRF9HRU5JVVNfR1hfSU1QRVJBVE9SKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9LWUUsCiAJCQkJVVNCX0RFVklDRV9JRF9HRU5JVVNfTUFOVElDT1JFKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9LWUUsCisJCQkJVVNCX0RFVklDRV9JRF9LWUVfUEVOU0tFVENIX005MTIpIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShoaWQsIGt5ZV9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sZy5jIGIvZHJpdmVycy9oaWQvaGlkLWxnLmMKaW5kZXggZjkxZmYxNC4uYjg2YzE4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJ1c2JoaWQvdXNiaGlkLmgiCiAjaW5jbHVkZSAiaGlkLWlkcy5oIgogI2luY2x1ZGUgImhpZC1sZy5oIgorI2luY2x1ZGUgImhpZC1sZzRmZi5oIgogCiAjZGVmaW5lIExHX1JERVNDCQkweDAwMQogI2RlZmluZSBMR19CQURfUkVMQVRJVkVfS0VZUwkweDAwMgpAQCAtODE4LDQgKzgxOSwxMCBAQAogfTsKIG1vZHVsZV9oaWRfZHJpdmVyKGxnX2RyaXZlcik7CiAKKyNpZmRlZiBDT05GSUdfTE9HSVdIRUVMU19GRgoraW50IGxnNGZmX25vX2F1dG9zd2l0Y2ggPSAwOworbW9kdWxlX3BhcmFtX25hbWVkKGxnNGZmX25vX2F1dG9zd2l0Y2gsIGxnNGZmX25vX2F1dG9zd2l0Y2gsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGxnNGZmX25vX2F1dG9zd2l0Y2gsICJEbyBub3Qgc3dpdGNoIG11bHRpbW9kZSB3aGVlbHMgdG8gdGhlaXIgbmF0aXZlIG1vZGUgYXV0b21hdGljYWxseSIpOworI2VuZGlmCisKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sZy5oIGIvZHJpdmVycy9oaWQvaGlkLWxnLmgKaW5kZXggMTQyY2UzZi4uMTBkZDhmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxnLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxnLmgKQEAgLTI0LDE2ICsyNCw0IEBACiBzdGF0aWMgaW5saW5lIGludCBsZzNmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KSB7IHJldHVybiAtMTsgfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfTE9HSVdIRUVMU19GRgotaW50IGxnNGZmX2FkanVzdF9pbnB1dF9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKLQkJCSAgICAgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlLCBzdHJ1Y3QgbGdfZHJ2X2RhdGEgKmRydl9kYXRhKTsKLWludCBsZzRmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KTsKLWludCBsZzRmZl9kZWluaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGxnNGZmX2FkanVzdF9pbnB1dF9ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkLCBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwKLQkJCQkJICAgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsIF9fczMyIHZhbHVlLCBzdHJ1Y3QgbGdfZHJ2X2RhdGEgKmRydl9kYXRhKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGludCBsZzRmZl9pbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KSB7IHJldHVybiAtMTsgfQotc3RhdGljIGlubGluZSBpbnQgbGc0ZmZfZGVpbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KSB7IHJldHVybiAtMTsgfQotI2VuZGlmCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLWxnNGZmLmMgYi9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuYwppbmRleCBkYjBkZDliLi4xMjMyMjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtbGc0ZmYuYwpAQCAtMzAsMjMgKzMwLDQ0IEBACiAKICNpbmNsdWRlICJ1c2JoaWQvdXNiaGlkLmgiCiAjaW5jbHVkZSAiaGlkLWxnLmgiCisjaW5jbHVkZSAiaGlkLWxnNGZmLmgiCiAjaW5jbHVkZSAiaGlkLWlkcy5oIgogCi0jZGVmaW5lIERGR1RfUkVWX01BSiAweDEzCi0jZGVmaW5lIERGR1RfUkVWX01JTiAweDIyCi0jZGVmaW5lIERGR1QyX1JFVl9NSU4gMHgyNgotI2RlZmluZSBERlBfUkVWX01BSiAweDExCi0jZGVmaW5lIERGUF9SRVZfTUlOIDB4MDYKLSNkZWZpbmUgRkZFWF9SRVZfTUFKIDB4MjEKLSNkZWZpbmUgRkZFWF9SRVZfTUlOIDB4MDAKLSNkZWZpbmUgRzI1X1JFVl9NQUogMHgxMgotI2RlZmluZSBHMjVfUkVWX01JTiAweDIyCi0jZGVmaW5lIEcyN19SRVZfTUFKIDB4MTIKLSNkZWZpbmUgRzI3X1JFVl9NSU4gMHgzOAotI2RlZmluZSBHMjdfMl9SRVZfTUlOIDB4MzkKLQogI2RlZmluZSB0b19oaWRfZGV2aWNlKHBkZXYpIGNvbnRhaW5lcl9vZihwZGV2LCBzdHJ1Y3QgaGlkX2RldmljZSwgZGV2KQogCisjZGVmaW5lIExHNEZGX01NT0RFX0lTX01VTFRJTU9ERSAwCisjZGVmaW5lIExHNEZGX01NT0RFX1NXSVRDSEVEIDEKKyNkZWZpbmUgTEc0RkZfTU1PREVfTk9UX01VTFRJTU9ERSAyCisKKyNkZWZpbmUgTEc0RkZfTU9ERV9OQVRJVkVfSURYIDAKKyNkZWZpbmUgTEc0RkZfTU9ERV9ERkVYX0lEWCAxCisjZGVmaW5lIExHNEZGX01PREVfREZQX0lEWCAyCisjZGVmaW5lIExHNEZGX01PREVfRzI1X0lEWCAzCisjZGVmaW5lIExHNEZGX01PREVfREZHVF9JRFggNAorI2RlZmluZSBMRzRGRl9NT0RFX0cyN19JRFggNQorI2RlZmluZSBMRzRGRl9NT0RFX01BWF9JRFggNgorCisjZGVmaW5lIExHNEZGX01PREVfTkFUSVZFIEJJVChMRzRGRl9NT0RFX05BVElWRV9JRFgpCisjZGVmaW5lIExHNEZGX01PREVfREZFWCBCSVQoTEc0RkZfTU9ERV9ERkVYX0lEWCkKKyNkZWZpbmUgTEc0RkZfTU9ERV9ERlAgQklUKExHNEZGX01PREVfREZQX0lEWCkKKyNkZWZpbmUgTEc0RkZfTU9ERV9HMjUgQklUKExHNEZGX01PREVfRzI1X0lEWCkKKyNkZWZpbmUgTEc0RkZfTU9ERV9ERkdUIEJJVChMRzRGRl9NT0RFX0RGR1RfSURYKQorI2RlZmluZSBMRzRGRl9NT0RFX0cyNyBCSVQoTEc0RkZfTU9ERV9HMjdfSURYKQorCisjZGVmaW5lIExHNEZGX0RGRVhfVEFHICJERi1FWCIKKyNkZWZpbmUgTEc0RkZfREZFWF9OQU1FICJEcml2aW5nIEZvcmNlIC8gRm9ybXVsYSBFWCIKKyNkZWZpbmUgTEc0RkZfREZQX1RBRyAiREZQIgorI2RlZmluZSBMRzRGRl9ERlBfTkFNRSAiRHJpdmluZyBGb3JjZSBQcm8iCisjZGVmaW5lIExHNEZGX0cyNV9UQUcgIkcyNSIKKyNkZWZpbmUgTEc0RkZfRzI1X05BTUUgIkcyNSBSYWNpbmcgV2hlZWwiCisjZGVmaW5lIExHNEZGX0cyN19UQUcgIkcyNyIKKyNkZWZpbmUgTEc0RkZfRzI3X05BTUUgIkcyNyBSYWNpbmcgV2hlZWwiCisjZGVmaW5lIExHNEZGX0RGR1RfVEFHICJERkdUIgorI2RlZmluZSBMRzRGRl9ERkdUX05BTUUgIkRyaXZpbmcgRm9yY2UgR1QiCisKKyNkZWZpbmUgTEc0RkZfRkZFWF9SRVZfTUFKIDB4MjEKKyNkZWZpbmUgTEc0RkZfRkZFWF9SRVZfTUlOIDB4MDAKKwogc3RhdGljIHZvaWQgaGlkX2xnNGZmX3NldF9yYW5nZV9kZnAoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdTE2IHJhbmdlKTsKIHN0YXRpYyB2b2lkIGhpZF9sZzRmZl9zZXRfcmFuZ2VfZzI1KHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHUxNiByYW5nZSk7CiAKQEAgLTU5LDYgKzgwLDEwIEBACiAJX191OCAgbGVkX3N0YXRlOwogCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZFs1XTsKICNlbmRpZgorCXUzMiBhbHRlcm5hdGVfbW9kZXM7CisJY29uc3QgY2hhciAqcmVhbF90YWc7CisJY29uc3QgY2hhciAqcmVhbF9uYW1lOworCXUxNiByZWFsX3Byb2R1Y3RfaWQ7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXZvaWQgKCpzZXRfcmFuZ2UpKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHUxNiByYW5nZSk7CiB9OwpAQCAtNzcsNiArMTAyLDM1IEBACiAJdm9pZCAoKnNldF9yYW5nZSkoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdTE2IHJhbmdlKTsKIH07CiAKK3N0cnVjdCBsZzRmZl9jb21wYXRfbW9kZV9zd2l0Y2ggeworCWNvbnN0IF9fdTggY21kX2NvdW50OwkvKiBOdW1iZXIgb2YgY29tbWFuZHMgdG8gc2VuZCAqLworCWNvbnN0IF9fdTggY21kW107Cit9OworCitzdHJ1Y3QgbGc0ZmZfd2hlZWxfaWRlbnRfaW5mbyB7CisJY29uc3QgdTE2IG1hc2s7CisJY29uc3QgdTE2IHJlc3VsdDsKKwljb25zdCB1MTYgcmVhbF9wcm9kdWN0X2lkOworfTsKKworc3RydWN0IGxnNGZmX3doZWVsX2lkZW50X2NoZWNrbGlzdCB7CisJY29uc3QgdTMyIGNvdW50OworCWNvbnN0IHN0cnVjdCBsZzRmZl93aGVlbF9pZGVudF9pbmZvICptb2RlbHNbXTsKK307CisKK3N0cnVjdCBsZzRmZl9tdWx0aW1vZGVfd2hlZWwgeworCWNvbnN0IHUxNiBwcm9kdWN0X2lkOworCWNvbnN0IHUzMiBhbHRlcm5hdGVfbW9kZXM7CisJY29uc3QgY2hhciAqcmVhbF90YWc7CisJY29uc3QgY2hhciAqcmVhbF9uYW1lOworfTsKKworc3RydWN0IGxnNGZmX2FsdGVybmF0ZV9tb2RlIHsKKwljb25zdCB1MTYgcHJvZHVjdF9pZDsKKwljb25zdCBjaGFyICp0YWc7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbGc0ZmZfd2hlZWwgbGc0ZmZfZGV2aWNlc1tdID0gewogCXtVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dIRUVMLCAgICAgICBsZzRmZl93aGVlbF9lZmZlY3RzLCA0MCwgMjcwLCBOVUxMfSwKIAl7VVNCX0RFVklDRV9JRF9MT0dJVEVDSF9NT01PX1dIRUVMLCAgbGc0ZmZfd2hlZWxfZWZmZWN0cywgNDAsIDI3MCwgTlVMTH0sCkBAIC04OCw0OCArMTQyLDEwOCBAQAogCXtVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dJSV9XSEVFTCwgICBsZzRmZl93aGVlbF9lZmZlY3RzLCA0MCwgMjcwLCBOVUxMfQogfTsKIAotc3RydWN0IGxnNGZmX25hdGl2ZV9jbWQgewotCWNvbnN0IF9fdTggY21kX251bTsJLyogTnVtYmVyIG9mIGNvbW1hbmRzIHRvIHNlbmQgKi8KLQljb25zdCBfX3U4IGNtZFtdOworc3RhdGljIGNvbnN0IHN0cnVjdCBsZzRmZl9tdWx0aW1vZGVfd2hlZWwgbGc0ZmZfbXVsdGltb2RlX3doZWVsc1tdID0geworCXtVU0JfREVWSUNFX0lEX0xPR0lURUNIX0RGUF9XSEVFTCwKKwkgTEc0RkZfTU9ERV9OQVRJVkUgfCBMRzRGRl9NT0RFX0RGUCB8IExHNEZGX01PREVfREZFWCwKKwkgTEc0RkZfREZQX1RBRywgTEc0RkZfREZQX05BTUV9LAorCXtVU0JfREVWSUNFX0lEX0xPR0lURUNIX0cyNV9XSEVFTCwKKwkgTEc0RkZfTU9ERV9OQVRJVkUgfCBMRzRGRl9NT0RFX0cyNSB8IExHNEZGX01PREVfREZQIHwgTEc0RkZfTU9ERV9ERkVYLAorCSBMRzRGRl9HMjVfVEFHLCBMRzRGRl9HMjVfTkFNRX0sCisJe1VTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfREZHVF9XSEVFTCwKKwkgTEc0RkZfTU9ERV9OQVRJVkUgfCBMRzRGRl9NT0RFX0RGR1QgfCBMRzRGRl9NT0RFX0RGUCB8IExHNEZGX01PREVfREZFWCwKKwkgTEc0RkZfREZHVF9UQUcsIExHNEZGX0RGR1RfTkFNRX0sCisJe1VTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRzI3X1dIRUVMLAorCSBMRzRGRl9NT0RFX05BVElWRSB8IExHNEZGX01PREVfRzI3IHwgTEc0RkZfTU9ERV9HMjUgfCBMRzRGRl9NT0RFX0RGUCB8IExHNEZGX01PREVfREZFWCwKKwkgTEc0RkZfRzI3X1RBRywgTEc0RkZfRzI3X05BTUV9LAogfTsKIAotc3RydWN0IGxnNGZmX3VzYl9yZXZpc2lvbiB7Ci0JY29uc3QgX191MTYgcmV2X21hajsKLQljb25zdCBfX3UxNiByZXZfbWluOwotCWNvbnN0IHN0cnVjdCBsZzRmZl9uYXRpdmVfY21kICpjb21tYW5kOworc3RhdGljIGNvbnN0IHN0cnVjdCBsZzRmZl9hbHRlcm5hdGVfbW9kZSBsZzRmZl9hbHRlcm5hdGVfbW9kZXNbXSA9IHsKKwlbTEc0RkZfTU9ERV9OQVRJVkVfSURYXSA9IHswLCAibmF0aXZlIiwgIiJ9LAorCVtMRzRGRl9NT0RFX0RGRVhfSURYXSA9IHtVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dIRUVMLCBMRzRGRl9ERkVYX1RBRywgTEc0RkZfREZFWF9OQU1FfSwKKwlbTEc0RkZfTU9ERV9ERlBfSURYXSA9IHtVU0JfREVWSUNFX0lEX0xPR0lURUNIX0RGUF9XSEVFTCwgTEc0RkZfREZQX1RBRywgTEc0RkZfREZQX05BTUV9LAorCVtMRzRGRl9NT0RFX0cyNV9JRFhdID0ge1VTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRzI1X1dIRUVMLCBMRzRGRl9HMjVfVEFHLCBMRzRGRl9HMjVfTkFNRX0sCisJW0xHNEZGX01PREVfREZHVF9JRFhdID0ge1VTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfREZHVF9XSEVFTCwgTEc0RkZfREZHVF9UQUcsIExHNEZGX0RGR1RfTkFNRX0sCisJW0xHNEZGX01PREVfRzI3X0lEWF0gPSB7VVNCX0RFVklDRV9JRF9MT0dJVEVDSF9HMjdfV0hFRUwsIExHNEZGX0cyN19UQUcsIExHNEZGX0cyN19OQU1FfQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBsZzRmZl9uYXRpdmVfY21kIG5hdGl2ZV9kZnAgPSB7CisvKiBNdWx0aW1vZGUgd2hlZWwgaWRlbnRpZmljYXRvcnMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGc0ZmZfd2hlZWxfaWRlbnRfaW5mbyBsZzRmZl9kZnBfaWRlbnRfaW5mbyA9IHsKKwkweGYwMDAsCisJMHgxMDAwLAorCVVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfREZQX1dIRUVMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGxnNGZmX3doZWVsX2lkZW50X2luZm8gbGc0ZmZfZzI1X2lkZW50X2luZm8gPSB7CisJMHhmZjAwLAorCTB4MTIwMCwKKwlVU0JfREVWSUNFX0lEX0xPR0lURUNIX0cyNV9XSEVFTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZzRmZl93aGVlbF9pZGVudF9pbmZvIGxnNGZmX2cyN19pZGVudF9pbmZvID0geworCTB4ZmZmMCwKKwkweDEyMzAsCisJVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9HMjdfV0hFRUwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGc0ZmZfd2hlZWxfaWRlbnRfaW5mbyBsZzRmZl9kZmd0X2lkZW50X2luZm8gPSB7CisJMHhmZjAwLAorCTB4MTMwMCwKKwlVU0JfREVWSUNFX0lEX0xPR0lURUNIX0RGR1RfV0hFRUwKK307CisKKy8qIE11bHRpbW9kZSB3aGVlbCBpZGVudGlmaWNhdGlvbiBjaGVja2xpc3RzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGxnNGZmX3doZWVsX2lkZW50X2NoZWNrbGlzdCBsZzRmZl9tYWluX2NoZWNrbGlzdCA9IHsKKwk0LAorCXsmbGc0ZmZfZGZndF9pZGVudF9pbmZvLAorCSAmbGc0ZmZfZzI3X2lkZW50X2luZm8sCisJICZsZzRmZl9nMjVfaWRlbnRfaW5mbywKKwkgJmxnNGZmX2RmcF9pZGVudF9pbmZvfQorfTsKKworLyogQ29tcGF0aWJpbGl0eSBtb2RlIHN3aXRjaGluZyBjb21tYW5kcyAqLworLyogRVhUX0NNRDkgLSBVbmRlcnN0b29kIGJ5IEcyNyBhbmQgREZHVCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBsZzRmZl9jb21wYXRfbW9kZV9zd2l0Y2ggbGc0ZmZfbW9kZV9zd2l0Y2hfZXh0MDlfZGZleCA9IHsKKwkyLAorCXsweGY4LCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAkvKiBSZXZlcnQgbW9kZSB1cG9uIFVTQiByZXNldCAqLworCSAweGY4LCAweDA5LCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwfQkvKiBTd2l0Y2ggbW9kZSB0byBERi1FWCB3aXRoIGRldGFjaCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZzRmZl9jb21wYXRfbW9kZV9zd2l0Y2ggbGc0ZmZfbW9kZV9zd2l0Y2hfZXh0MDlfZGZwID0geworCTIsCisJezB4ZjgsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCS8qIFJldmVydCBtb2RlIHVwb24gVVNCIHJlc2V0ICovCisJIDB4ZjgsIDB4MDksIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9CS8qIFN3aXRjaCBtb2RlIHRvIERGUCB3aXRoIGRldGFjaCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZzRmZl9jb21wYXRfbW9kZV9zd2l0Y2ggbGc0ZmZfbW9kZV9zd2l0Y2hfZXh0MDlfZzI1ID0geworCTIsCisJezB4ZjgsIDB4MGEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCS8qIFJldmVydCBtb2RlIHVwb24gVVNCIHJlc2V0ICovCisJIDB4ZjgsIDB4MDksIDB4MDIsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDB9CS8qIFN3aXRjaCBtb2RlIHRvIEcyNSB3aXRoIGRldGFjaCAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBsZzRmZl9jb21wYXRfbW9kZV9zd2l0Y2ggbGc0ZmZfbW9kZV9zd2l0Y2hfZXh0MDlfZGZndCA9IHsKKwkyLAorCXsweGY4LCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAkvKiBSZXZlcnQgbW9kZSB1cG9uIFVTQiByZXNldCAqLworCSAweGY4LCAweDA5LCAweDAzLCAweDAxLCAweDAwLCAweDAwLCAweDAwfQkvKiBTd2l0Y2ggbW9kZSB0byBERkdUIHdpdGggZGV0YWNoICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGxnNGZmX2NvbXBhdF9tb2RlX3N3aXRjaCBsZzRmZl9tb2RlX3N3aXRjaF9leHQwOV9nMjcgPSB7CisJMiwKKwl7MHhmOCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwJLyogUmV2ZXJ0IG1vZGUgdXBvbiBVU0IgcmVzZXQgKi8KKwkgMHhmOCwgMHgwOSwgMHgwNCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMH0JLyogU3dpdGNoIG1vZGUgdG8gRzI3IHdpdGggZGV0YWNoICovCit9OworCisvKiBFWFRfQ01EMSAtIFVuZGVyc3Rvb2QgYnkgREZQLCBHMjUsIEcyNyBhbmQgREZHVCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBsZzRmZl9jb21wYXRfbW9kZV9zd2l0Y2ggbGc0ZmZfbW9kZV9zd2l0Y2hfZXh0MDFfZGZwID0gewogCTEsCiAJezB4ZjgsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGxnNGZmX25hdGl2ZV9jbWQgbmF0aXZlX2RmZ3QgPSB7Ci0JMiwKLQl7MHhmOCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwJLyogMXN0IGNvbW1hbmQgKi8KLQkgMHhmOCwgMHgwOSwgMHgwMywgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMH0JLyogMm5kIGNvbW1hbmQgKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbGc0ZmZfbmF0aXZlX2NtZCBuYXRpdmVfZzI1ID0geworLyogRVhUX0NNRDE2IC0gVW5kZXJzdG9vZCBieSBHMjUgYW5kIEcyNyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBsZzRmZl9jb21wYXRfbW9kZV9zd2l0Y2ggbGc0ZmZfbW9kZV9zd2l0Y2hfZXh0MTZfZzI1ID0gewogCTEsCiAJezB4ZjgsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9CiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGxnNGZmX25hdGl2ZV9jbWQgbmF0aXZlX2cyNyA9IHsKLQkyLAotCXsweGY4LCAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAkvKiAxc3QgY29tbWFuZCAqLwotCSAweGY4LCAweDA5LCAweDA0LCAweDAxLCAweDAwLCAweDAwLCAweDAwfQkvKiAybmQgY29tbWFuZCAqLwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBsZzRmZl91c2JfcmV2aXNpb24gbGc0ZmZfcmV2c1tdID0gewotCXtERkdUX1JFVl9NQUosIERGR1RfUkVWX01JTiwgJm5hdGl2ZV9kZmd0fSwJLyogRHJpdmluZyBGb3JjZSBHVCAqLwotCXtERkdUX1JFVl9NQUosIERGR1QyX1JFVl9NSU4sICZuYXRpdmVfZGZndH0sCS8qIERyaXZpbmcgRm9yY2UgR1QgdjIgKi8KLQl7REZQX1JFVl9NQUosICBERlBfUkVWX01JTiwgICZuYXRpdmVfZGZwfSwJLyogRHJpdmluZyBGb3JjZSBQcm8gKi8KLQl7RzI1X1JFVl9NQUosICBHMjVfUkVWX01JTiwgICZuYXRpdmVfZzI1fSwJLyogRzI1ICovCi0Je0cyN19SRVZfTUFKLCAgRzI3X1JFVl9NSU4sICAmbmF0aXZlX2cyN30sCS8qIEcyNyAqLwotCXtHMjdfUkVWX01BSiwgIEcyN18yX1JFVl9NSU4sICAmbmF0aXZlX2cyN30sCS8qIEcyNyB2MiAqLwotfTsKLQogLyogUmVjYWxjdWxhdGVzIFggYXhpcyB2YWx1ZSBhY2NvcmRpbmdseSB0byBjdXJyZW50bHkgc2VsZWN0ZWQgcmFuZ2UgKi8KIHN0YXRpYyBfX3MzMiBsZzRmZl9hZGp1c3RfZGZwX3hfYXhpcyhfX3MzMiB2YWx1ZSwgX191MTYgcmFuZ2UpCiB7CkBAIC0zOTYsMjEgKzUxMCwyMTcgQEAKIAloaWRfaHdfcmVxdWVzdChoaWQsIHJlcG9ydCwgSElEX1JFUV9TRVRfUkVQT1JUKTsKIH0KIAotc3RhdGljIHZvaWQgaGlkX2xnNGZmX3N3aXRjaF9uYXRpdmUoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgY29uc3Qgc3RydWN0IGxnNGZmX25hdGl2ZV9jbWQgKmNtZCkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGc0ZmZfY29tcGF0X21vZGVfc3dpdGNoICpsZzRmZl9nZXRfbW9kZV9zd2l0Y2hfY29tbWFuZChjb25zdCB1MTYgcmVhbF9wcm9kdWN0X2lkLCBjb25zdCB1MTYgdGFyZ2V0X3Byb2R1Y3RfaWQpCit7CisJc3dpdGNoIChyZWFsX3Byb2R1Y3RfaWQpIHsKKwljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfREZQX1dIRUVMOgorCQlzd2l0Y2ggKHRhcmdldF9wcm9kdWN0X2lkKSB7CisJCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9ERlBfV0hFRUw6CisJCQlyZXR1cm4gJmxnNGZmX21vZGVfc3dpdGNoX2V4dDAxX2RmcDsKKwkJLyogREZQIGNhbiBvbmx5IGJlIHN3aXRjaGVkIHRvIGl0cyBuYXRpdmUgbW9kZSAqLworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0cyNV9XSEVFTDoKKwkJc3dpdGNoICh0YXJnZXRfcHJvZHVjdF9pZCkgeworCQljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfREZQX1dIRUVMOgorCQkJcmV0dXJuICZsZzRmZl9tb2RlX3N3aXRjaF9leHQwMV9kZnA7CisJCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9HMjVfV0hFRUw6CisJCQlyZXR1cm4gJmxnNGZmX21vZGVfc3dpdGNoX2V4dDE2X2cyNTsKKwkJLyogRzI1IGNhbiBvbmx5IGJlIHN3aXRjaGVkIHRvIERGUCBtb2RlIG9yIGl0cyBuYXRpdmUgbW9kZSAqLworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0cyN19XSEVFTDoKKwkJc3dpdGNoICh0YXJnZXRfcHJvZHVjdF9pZCkgeworCQljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0hFRUw6CisJCQlyZXR1cm4gJmxnNGZmX21vZGVfc3dpdGNoX2V4dDA5X2RmZXg7CisJCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9ERlBfV0hFRUw6CisJCQlyZXR1cm4gJmxnNGZmX21vZGVfc3dpdGNoX2V4dDA5X2RmcDsKKwkJY2FzZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0cyNV9XSEVFTDoKKwkJCXJldHVybiAmbGc0ZmZfbW9kZV9zd2l0Y2hfZXh0MDlfZzI1OworCQljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfRzI3X1dIRUVMOgorCQkJcmV0dXJuICZsZzRmZl9tb2RlX3N3aXRjaF9leHQwOV9nMjc7CisJCS8qIEcyNyBjYW4gb25seSBiZSBzd2l0Y2hlZCB0byBERi1FWCwgREZQLCBHMjUgb3IgaXRzIG5hdGl2ZSBtb2RlICovCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfREZHVF9XSEVFTDoKKwkJc3dpdGNoICh0YXJnZXRfcHJvZHVjdF9pZCkgeworCQljYXNlIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0hFRUw6CisJCQlyZXR1cm4gJmxnNGZmX21vZGVfc3dpdGNoX2V4dDA5X2RmZXg7CisJCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9ERlBfV0hFRUw6CisJCQlyZXR1cm4gJmxnNGZmX21vZGVfc3dpdGNoX2V4dDA5X2RmcDsKKwkJY2FzZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0RGR1RfV0hFRUw6CisJCQlyZXR1cm4gJmxnNGZmX21vZGVfc3dpdGNoX2V4dDA5X2RmZ3Q7CisJCS8qIERGR1QgY2FuIG9ubHkgYmUgc3dpdGNoZWQgdG8gREYtRVgsIERGUCBvciBpdHMgbmF0aXZlIG1vZGUgKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWJyZWFrOworCS8qIE5vIG90aGVyIHdoZWVscyBoYXZlIG11bHRpcGxlIG1vZGVzICovCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IGxnNGZmX3N3aXRjaF9jb21wYXRpYmlsaXR5X21vZGUoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgY29uc3Qgc3RydWN0IGxnNGZmX2NvbXBhdF9tb2RlX3N3aXRjaCAqcykKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpyZXBvcnRfbGlzdCA9ICZoaWQtPnJlcG9ydF9lbnVtW0hJRF9PVVRQVVRfUkVQT1JUXS5yZXBvcnRfbGlzdDsKIAlzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0ID0gbGlzdF9lbnRyeShyZXBvcnRfbGlzdC0+bmV4dCwgc3RydWN0IGhpZF9yZXBvcnQsIGxpc3QpOwotCV9fdTggaSwgajsKKwlfX3MzMiAqdmFsdWUgPSByZXBvcnQtPmZpZWxkWzBdLT52YWx1ZTsKKwl1OCBpOwogCi0JaiA9IDA7Ci0Jd2hpbGUgKGogPCA3KmNtZC0+Y21kX251bSkgewotCQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQotCQkJcmVwb3J0LT5maWVsZFswXS0+dmFsdWVbaV0gPSBjbWQtPmNtZFtqKytdOworCWZvciAoaSA9IDA7IGkgPCBzLT5jbWRfY291bnQ7IGkrKykgeworCQl1OCBqOworCisJCWZvciAoaiA9IDA7IGogPCA3OyBqKyspCisJCQl2YWx1ZVtqXSA9IHMtPmNtZFtqICsgKDcqaSldOwogCiAJCWhpZF9od19yZXF1ZXN0KGhpZCwgcmVwb3J0LCBISURfUkVRX1NFVF9SRVBPUlQpOwogCX0KKwloaWRfaHdfd2FpdChoaWQpOworCXJldHVybiAwOwogfQogCitzdGF0aWMgc3NpemVfdCBsZzRmZl9hbHRlcm5hdGVfbW9kZXNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IHRvX2hpZF9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbGc0ZmZfZGV2aWNlX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgbGdfZHJ2X2RhdGEgKmRydl9kYXRhOworCXNzaXplX3QgY291bnQgPSAwOworCWludCBpOworCisJZHJ2X2RhdGEgPSBoaWRfZ2V0X2RydmRhdGEoaGlkKTsKKwlpZiAoIWRydl9kYXRhKSB7CisJCWhpZF9lcnIoaGlkLCAiUHJpdmF0ZSBkcml2ZXIgZGF0YSBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZW50cnkgPSBkcnZfZGF0YS0+ZGV2aWNlX3Byb3BzOworCWlmICghZW50cnkpIHsKKwkJaGlkX2VycihoaWQsICJEZXZpY2UgcHJvcGVydGllcyBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFlbnRyeS0+cmVhbF9uYW1lKSB7CisJCWhpZF9lcnIoaGlkLCAiTlVMTCBwb2ludGVyIHRvIHN0cmluZ1xuIik7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBMRzRGRl9NT0RFX01BWF9JRFg7IGkrKykgeworCQlpZiAoZW50cnktPmFsdGVybmF0ZV9tb2RlcyAmIEJJVChpKSkgeworCQkJLyogUHJpbnQgdGFnIGFuZCBmdWxsIG5hbWUgKi8KKwkJCWNvdW50ICs9IHNjbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICIlczogJXMiLAorCQkJCQkgICBsZzRmZl9hbHRlcm5hdGVfbW9kZXNbaV0udGFnLAorCQkJCQkgICAhbGc0ZmZfYWx0ZXJuYXRlX21vZGVzW2ldLnByb2R1Y3RfaWQgPyBlbnRyeS0+cmVhbF9uYW1lIDogbGc0ZmZfYWx0ZXJuYXRlX21vZGVzW2ldLm5hbWUpOworCQkJaWYgKGNvdW50ID49IFBBR0VfU0laRSAtIDEpCisJCQkJcmV0dXJuIGNvdW50OworCisJCQkvKiBNYXJrIHRoZSBjdXJyZW50bHkgYWN0aXZlIG1vZGUgd2l0aCBhbiBhc3RlcmlzayAqLworCQkJaWYgKGxnNGZmX2FsdGVybmF0ZV9tb2Rlc1tpXS5wcm9kdWN0X2lkID09IGVudHJ5LT5wcm9kdWN0X2lkIHx8CisJCQkgICAgKGxnNGZmX2FsdGVybmF0ZV9tb2Rlc1tpXS5wcm9kdWN0X2lkID09IDAgJiYgZW50cnktPnByb2R1Y3RfaWQgPT0gZW50cnktPnJlYWxfcHJvZHVjdF9pZCkpCisJCQkJY291bnQgKz0gc2NucHJpbnRmKGJ1ZiArIGNvdW50LCBQQUdFX1NJWkUgLSBjb3VudCwgIiAqXG4iKTsKKwkJCWVsc2UKKwkJCQljb3VudCArPSBzY25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LCAiXG4iKTsKKworCQkJaWYgKGNvdW50ID49IFBBR0VfU0laRSAtIDEpCisJCQkJcmV0dXJuIGNvdW50OworCQl9CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBsZzRmZl9hbHRlcm5hdGVfbW9kZXNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhpZCA9IHRvX2hpZF9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgbGc0ZmZfZGV2aWNlX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3QgbGdfZHJ2X2RhdGEgKmRydl9kYXRhOworCWNvbnN0IHN0cnVjdCBsZzRmZl9jb21wYXRfbW9kZV9zd2l0Y2ggKnM7CisJdTE2IHRhcmdldF9wcm9kdWN0X2lkID0gMDsKKwlpbnQgaSwgcmV0OworCWNoYXIgKmxidWY7CisKKwlkcnZfZGF0YSA9IGhpZF9nZXRfZHJ2ZGF0YShoaWQpOworCWlmICghZHJ2X2RhdGEpIHsKKwkJaGlkX2VycihoaWQsICJQcml2YXRlIGRyaXZlciBkYXRhIG5vdCBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllbnRyeSA9IGRydl9kYXRhLT5kZXZpY2VfcHJvcHM7CisJaWYgKCFlbnRyeSkgeworCQloaWRfZXJyKGhpZCwgIkRldmljZSBwcm9wZXJ0aWVzIG5vdCBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBBbGxvdyBcbiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXIgKi8KKwlsYnVmID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcyIsIGJ1Zik7CisJaWYgKCFsYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWkgPSBzdHJsZW4obGJ1Zik7CisJaWYgKGxidWZbaS0xXSA9PSAnXG4nKSB7CisJCWlmIChpID09IDEpIHsKKwkJCWtmcmVlKGxidWYpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbGJ1ZltpLTFdID0gJ1wwJzsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTEc0RkZfTU9ERV9NQVhfSURYOyBpKyspIHsKKwkJY29uc3QgdTE2IG1vZGVfcHJvZHVjdF9pZCA9IGxnNGZmX2FsdGVybmF0ZV9tb2Rlc1tpXS5wcm9kdWN0X2lkOworCQljb25zdCBjaGFyICp0YWcgPSBsZzRmZl9hbHRlcm5hdGVfbW9kZXNbaV0udGFnOworCisJCWlmIChlbnRyeS0+YWx0ZXJuYXRlX21vZGVzICYgQklUKGkpKSB7CisJCQlpZiAoIXN0cmNtcCh0YWcsIGxidWYpKSB7CisJCQkJaWYgKCFtb2RlX3Byb2R1Y3RfaWQpCisJCQkJCXRhcmdldF9wcm9kdWN0X2lkID0gZW50cnktPnJlYWxfcHJvZHVjdF9pZDsKKwkJCQllbHNlCisJCQkJCXRhcmdldF9wcm9kdWN0X2lkID0gbW9kZV9wcm9kdWN0X2lkOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJaWYgKGkgPT0gTEc0RkZfTU9ERV9NQVhfSURYKSB7CisJCWhpZF9pbmZvKGhpZCwgIlJlcXVlc3RlZCBtb2RlIFwiJXNcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2VcbiIsIGxidWYpOworCQlrZnJlZShsYnVmKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWtmcmVlKGxidWYpOyAvKiBOb3QgbmVlZGVkIGFueW1vcmUgKi8KKworCWlmICh0YXJnZXRfcHJvZHVjdF9pZCA9PSBlbnRyeS0+cHJvZHVjdF9pZCkgLyogTm90aGluZyB0byBkbyAqLworCQlyZXR1cm4gY291bnQ7CisKKwkvKiBBdXRvbWF0aWMgc3dpdGNoaW5nIGhhcyB0byBiZSBkaXNhYmxlZCBmb3IgdGhlIHN3aXRjaCB0byBERi1FWCBtb2RlIHRvIHdvcmsgY29ycmVjdGx5ICovCisJaWYgKHRhcmdldF9wcm9kdWN0X2lkID09IFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfV0hFRUwgJiYgIWxnNGZmX25vX2F1dG9zd2l0Y2gpIHsKKwkJaGlkX2luZm8oaGlkLCAiXCIlc1wiIGNhbm5vdCBiZSBzd2l0Y2hlZCB0byBcIkRGLUVYXCIgbW9kZS4gTG9hZCB0aGUgXCJoaWRfbG9naXRlY2hcIiBtb2R1bGUgd2l0aCBcImxnNGZmX25vX2F1dG9zd2l0Y2g9MVwiIHBhcmFtZXRlciBzZXQgYW5kIHRyeSBhZ2FpblxuIiwKKwkJCSBlbnRyeS0+cmVhbF9uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogVGFrZSBjYXJlIG9mIGhhcmR3YXJlIGxpbWl0YXRpb25zICovCisJaWYgKChlbnRyeS0+cmVhbF9wcm9kdWN0X2lkID09IFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfREZQX1dIRUVMIHx8IGVudHJ5LT5yZWFsX3Byb2R1Y3RfaWQgPT0gVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9HMjVfV0hFRUwpICYmCisJICAgIGVudHJ5LT5wcm9kdWN0X2lkID4gdGFyZ2V0X3Byb2R1Y3RfaWQpIHsKKwkJaGlkX2luZm8oaGlkLCAiXCIlc1wiIGNhbm5vdCBiZSBzd2l0Y2hlZCBiYWNrIGludG8gXCIlc1wiIG1vZGVcbiIsIGVudHJ5LT5yZWFsX25hbWUsIGxnNGZmX2FsdGVybmF0ZV9tb2Rlc1tpXS5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcyA9IGxnNGZmX2dldF9tb2RlX3N3aXRjaF9jb21tYW5kKGVudHJ5LT5yZWFsX3Byb2R1Y3RfaWQsIHRhcmdldF9wcm9kdWN0X2lkKTsKKwlpZiAoIXMpIHsKKwkJaGlkX2VycihoaWQsICJJbnZhbGlkIHRhcmdldCBwcm9kdWN0IElEICVYXG4iLCB0YXJnZXRfcHJvZHVjdF9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IGxnNGZmX3N3aXRjaF9jb21wYXRpYmlsaXR5X21vZGUoaGlkLCBzKTsKKwlyZXR1cm4gKHJldCA9PSAwID8gY291bnQgOiByZXQpOworfQorc3RhdGljIERFVklDRV9BVFRSKGFsdGVybmF0ZV9tb2RlcywgU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JV0dSUCB8IFNfSVJPVEgsIGxnNGZmX2FsdGVybmF0ZV9tb2Rlc19zaG93LCBsZzRmZl9hbHRlcm5hdGVfbW9kZXNfc3RvcmUpOworCiAvKiBSZWFkIGN1cnJlbnQgcmFuZ2UgYW5kIGRpc3BsYXkgaXQgaW4gdGVybWluYWwgKi8KIHN0YXRpYyBzc2l6ZV90IHJhbmdlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgY2hhciAqYnVmKQpAQCAtNDcyLDYgKzc4Miw0MSBAQAogfQogc3RhdGljIERFVklDRV9BVFRSX1JXKHJhbmdlKTsKIAorc3RhdGljIHNzaXplX3QgbGc0ZmZfcmVhbF9pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gdG9faGlkX2RldmljZShkZXYpOworCXN0cnVjdCBsZzRmZl9kZXZpY2VfZW50cnkgKmVudHJ5OworCXN0cnVjdCBsZ19kcnZfZGF0YSAqZHJ2X2RhdGE7CisJc2l6ZV90IGNvdW50OworCisJZHJ2X2RhdGEgPSBoaWRfZ2V0X2RydmRhdGEoaGlkKTsKKwlpZiAoIWRydl9kYXRhKSB7CisJCWhpZF9lcnIoaGlkLCAiUHJpdmF0ZSBkcml2ZXIgZGF0YSBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZW50cnkgPSBkcnZfZGF0YS0+ZGV2aWNlX3Byb3BzOworCWlmICghZW50cnkpIHsKKwkJaGlkX2VycihoaWQsICJEZXZpY2UgcHJvcGVydGllcyBub3QgZm91bmQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFlbnRyeS0+cmVhbF90YWcgfHwgIWVudHJ5LT5yZWFsX25hbWUpIHsKKwkJaGlkX2VycihoaWQsICJOVUxMIHBvaW50ZXIgdG8gc3RyaW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJY291bnQgPSBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlczogJXNcbiIsIGVudHJ5LT5yZWFsX3RhZywgZW50cnktPnJlYWxfbmFtZSk7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBsZzRmZl9yZWFsX2lkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCS8qIFJlYWwgSUQgaXMgYSByZWFkLW9ubHkgdmFsdWUgKi8KKwlyZXR1cm4gLUVQRVJNOworfQorc3RhdGljIERFVklDRV9BVFRSKHJlYWxfaWQsIFNfSVJVR08sIGxnNGZmX3JlYWxfaWRfc2hvdywgbGc0ZmZfcmVhbF9pZF9zdG9yZSk7CisKICNpZmRlZiBDT05GSUdfTEVEU19DTEFTUwogc3RhdGljIHZvaWQgbGc0ZmZfc2V0X2xlZHMoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgX191OCBsZWRzKQogewpAQCAtNTU1LDIwICs5MDAsMTE5IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIHUxNiBsZzRmZl9pZGVudGlmeV9tdWx0aW1vZGVfd2hlZWwoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgY29uc3QgdTE2IHJlcG9ydGVkX3Byb2R1Y3RfaWQsIGNvbnN0IHUxNiBiY2REZXZpY2UpCit7CisJY29uc3Qgc3RydWN0IGxnNGZmX3doZWVsX2lkZW50X2NoZWNrbGlzdCAqY2hlY2tsaXN0OworCWludCBpLCBmcm9tX2lkeCwgdG9faWR4OworCisJc3dpdGNoIChyZXBvcnRlZF9wcm9kdWN0X2lkKSB7CisJY2FzZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX1dIRUVMOgorCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9ERlBfV0hFRUw6CisJCWNoZWNrbGlzdCA9ICZsZzRmZl9tYWluX2NoZWNrbGlzdDsKKwkJZnJvbV9pZHggPSAwOworCQl0b19pZHggPSBjaGVja2xpc3QtPmNvdW50IC0gMTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0cyNV9XSEVFTDoKKwkJY2hlY2tsaXN0ID0gJmxnNGZmX21haW5fY2hlY2tsaXN0OworCQlmcm9tX2lkeCA9IDA7CisJCXRvX2lkeCA9IGNoZWNrbGlzdC0+Y291bnQgLSAyOyAvKiBFbmQgaWRlbnRpdHkgY2hlY2sgYXQgRzI1ICovCisJCWJyZWFrOworCWNhc2UgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9HMjdfV0hFRUw6CisJCWNoZWNrbGlzdCA9ICZsZzRmZl9tYWluX2NoZWNrbGlzdDsKKwkJZnJvbV9pZHggPSAxOyAvKiBTdGFydCBpZGVudGl0eSBjaGVjayBhdCBHMjcgKi8KKwkJdG9faWR4ID0gY2hlY2tsaXN0LT5jb3VudCAtIDM7IC8qIEVuZCBpZGVudGl0eSBjaGVjayBhdCBHMjcgKi8KKwkJYnJlYWs7CisJY2FzZSBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0RGR1RfV0hFRUw6CisJCWNoZWNrbGlzdCA9ICZsZzRmZl9tYWluX2NoZWNrbGlzdDsKKwkJZnJvbV9pZHggPSAwOworCQl0b19pZHggPSBjaGVja2xpc3QtPmNvdW50IC0gNDsgLyogRW5kIGlkZW50aXR5IGNoZWNrIGF0IERGR1QgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gZnJvbV9pZHg7IGkgPD0gdG9faWR4OyBpKyspIHsKKwkJY29uc3QgdTE2IG1hc2sgPSBjaGVja2xpc3QtPm1vZGVsc1tpXS0+bWFzazsKKwkJY29uc3QgdTE2IHJlc3VsdCA9IGNoZWNrbGlzdC0+bW9kZWxzW2ldLT5yZXN1bHQ7CisJCWNvbnN0IHUxNiByZWFsX3Byb2R1Y3RfaWQgPSBjaGVja2xpc3QtPm1vZGVsc1tpXS0+cmVhbF9wcm9kdWN0X2lkOworCisJCWlmICgoYmNkRGV2aWNlICYgbWFzaykgPT0gcmVzdWx0KSB7CisJCQlkYmdfaGlkKCJGb3VuZCB3aGVlbCB3aXRoIHJlYWwgUElEICVYIHdob3NlIHJlcG9ydGVkIFBJRCBpcyAlWFxuIiwgcmVhbF9wcm9kdWN0X2lkLCByZXBvcnRlZF9wcm9kdWN0X2lkKTsKKwkJCXJldHVybiByZWFsX3Byb2R1Y3RfaWQ7CisJCX0KKwl9CisKKwkvKiBObyBtYXRjaCBmb3VuZC4gVGhpcyBpcyBlaXRoZXIgRHJpdmluZyBGb3JjZSBvciBhbiB1bmtub3duCisJICogd2hlZWwgbW9kZWwsIGRvIG5vdCB0b3VjaCBpdCAqLworCWRiZ19oaWQoIldoZWVsIHdpdGggYmNkRGV2aWNlICVYIHdhcyBub3QgcmVjb2duaXplZCBhcyBtdWx0aW1vZGUgd2hlZWwsIGxlYXZpbmcgaW4gaXRzIGN1cnJlbnQgbW9kZVxuIiwgYmNkRGV2aWNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsZzRmZl9oYW5kbGVfbXVsdGltb2RlX3doZWVsKHN0cnVjdCBoaWRfZGV2aWNlICpoaWQsIHUxNiAqcmVhbF9wcm9kdWN0X2lkLCBjb25zdCB1MTYgYmNkRGV2aWNlKQoreworCWNvbnN0IHUxNiByZXBvcnRlZF9wcm9kdWN0X2lkID0gaGlkLT5wcm9kdWN0OworCWludCByZXQ7CisKKwkqcmVhbF9wcm9kdWN0X2lkID0gbGc0ZmZfaWRlbnRpZnlfbXVsdGltb2RlX3doZWVsKGhpZCwgcmVwb3J0ZWRfcHJvZHVjdF9pZCwgYmNkRGV2aWNlKTsKKwkvKiBQcm9iZWQgd2hlZWwgaXMgbm90IGEgbXVsdGltb2RlIHdoZWVsICovCisJaWYgKCEqcmVhbF9wcm9kdWN0X2lkKSB7CisJCSpyZWFsX3Byb2R1Y3RfaWQgPSByZXBvcnRlZF9wcm9kdWN0X2lkOworCQlkYmdfaGlkKCJXaGVlbCBpcyBub3QgYSBtdWx0aW1vZGUgd2hlZWxcbiIpOworCQlyZXR1cm4gTEc0RkZfTU1PREVfTk9UX01VTFRJTU9ERTsKKwl9CisKKwkvKiBTd2l0Y2ggZnJvbSAiRHJpdmluZyBGb3JjZSIgbW9kZSB0byBuYXRpdmUgbW9kZSBhdXRvbWF0aWNhbGx5LgorCSAqIE90aGVyd2lzZSBrZWVwIHRoZSB3aGVlbCBpbiBpdHMgY3VycmVudCBtb2RlICovCisJaWYgKHJlcG9ydGVkX3Byb2R1Y3RfaWQgPT0gVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSEVFTCAmJgorCSAgICByZXBvcnRlZF9wcm9kdWN0X2lkICE9ICpyZWFsX3Byb2R1Y3RfaWQgJiYKKwkgICAgIWxnNGZmX25vX2F1dG9zd2l0Y2gpIHsKKwkJY29uc3Qgc3RydWN0IGxnNGZmX2NvbXBhdF9tb2RlX3N3aXRjaCAqcyA9IGxnNGZmX2dldF9tb2RlX3N3aXRjaF9jb21tYW5kKCpyZWFsX3Byb2R1Y3RfaWQsICpyZWFsX3Byb2R1Y3RfaWQpOworCisJCWlmICghcykgeworCQkJaGlkX2VycihoaWQsICJJbnZhbGlkIHByb2R1Y3QgaWQgJVhcbiIsICpyZWFsX3Byb2R1Y3RfaWQpOworCQkJcmV0dXJuIExHNEZGX01NT0RFX05PVF9NVUxUSU1PREU7CisJCX0KKworCQlyZXQgPSBsZzRmZl9zd2l0Y2hfY29tcGF0aWJpbGl0eV9tb2RlKGhpZCwgcyk7CisJCWlmIChyZXQpIHsKKwkJCS8qIFdoZWVsIGNvdWxkIG5vdCBoYXZlIGJlZW4gc3dpdGNoZWQgdG8gbmF0aXZlIG1vZGUsCisJCQkgKiBsZWF2ZSBpdCBpbiAiRHJpdmluZyBGb3JjZSIgbW9kZSBhbmQgY29udGludWUgKi8KKwkJCWhpZF9lcnIoaGlkLCAiVW5hYmxlIHRvIHN3aXRjaCB3aGVlbCBtb2RlLCBlcnJubyAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiBMRzRGRl9NTU9ERV9JU19NVUxUSU1PREU7CisJCX0KKwkJcmV0dXJuIExHNEZGX01NT0RFX1NXSVRDSEVEOworCX0KKworCXJldHVybiBMRzRGRl9NTU9ERV9JU19NVUxUSU1PREU7Cit9CisKKwogaW50IGxnNGZmX2luaXQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCkKIHsKIAlzdHJ1Y3QgaGlkX2lucHV0ICpoaWRpbnB1dCA9IGxpc3RfZW50cnkoaGlkLT5pbnB1dHMubmV4dCwgc3RydWN0IGhpZF9pbnB1dCwgbGlzdCk7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gaGlkaW5wdXQtPmlucHV0OworCWNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKnVkZXNjID0gJihoaWRfdG9fdXNiX2RldihoaWQpLT5kZXNjcmlwdG9yKTsKKwljb25zdCB1MTYgYmNkRGV2aWNlID0gbGUxNl90b19jcHUodWRlc2MtPmJjZERldmljZSk7CiAJc3RydWN0IGxnNGZmX2RldmljZV9lbnRyeSAqZW50cnk7CiAJc3RydWN0IGxnX2Rydl9kYXRhICpkcnZfZGF0YTsKLQlzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICp1ZGVzYzsKIAlpbnQgZXJyb3IsIGksIGo7Ci0JX191MTYgYmNkRGV2aWNlLCByZXZfbWFqLCByZXZfbWluOworCWludCBtbW9kZV9yZXQsIG1tb2RlX2lkeCA9IC0xOworCXUxNiByZWFsX3Byb2R1Y3RfaWQ7CiAKIAkvKiBDaGVjayB0aGF0IHRoZSByZXBvcnQgbG9va3Mgb2sgKi8KIAlpZiAoIWhpZF92YWxpZGF0ZV92YWx1ZXMoaGlkLCBISURfT1VUUFVUX1JFUE9SVCwgMCwgMCwgNykpCiAJCXJldHVybiAtMTsKIAorCS8qIENoZWNrIGlmIGEgbXVsdGltb2RlIHdoZWVsIGhhcyBiZWVuIGNvbm5lY3RlZCBhbmQKKwkgKiBoYW5kbGUgaXQgYXBwcm9wcmlhdGVseSAqLworCW1tb2RlX3JldCA9IGxnNGZmX2hhbmRsZV9tdWx0aW1vZGVfd2hlZWwoaGlkLCAmcmVhbF9wcm9kdWN0X2lkLCBiY2REZXZpY2UpOworCisJLyogV2hlZWwgaGFzIGJlZW4gdG9sZCB0byBzd2l0Y2ggdG8gbmF0aXZlIG1vZGUuIFRoZXJlIGlzIG5vIHBvaW50IGluIGdvaW5nIG9uCisJICogd2l0aCB0aGUgaW5pdGlhbGl6YXRpb24gYXMgdGhlIHdoZWVsIHdpbGwgZG8gYSBVU0IgcmVzZXQgd2hlbiBpdCBzd2l0Y2hlcyBtb2RlCisJICovCisJaWYgKG1tb2RlX3JldCA9PSBMRzRGRl9NTU9ERV9TV0lUQ0hFRCkKKwkJcmV0dXJuIDA7CisKIAkvKiBDaGVjayB3aGF0IHdoZWVsIGhhcyBiZWVuIGNvbm5lY3RlZCAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxnNGZmX2RldmljZXMpOyBpKyspIHsKIAkJaWYgKGhpZC0+cHJvZHVjdCA9PSBsZzRmZl9kZXZpY2VzW2ldLnByb2R1Y3RfaWQpIHsKQEAgLTU4MywyNSArMTAyNywxNSBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JLyogQXR0ZW1wdCB0byBzd2l0Y2ggd2hlZWwgdG8gbmF0aXZlIG1vZGUgd2hlbiBhcHBsaWNhYmxlICovCi0JdWRlc2MgPSAmKGhpZF90b191c2JfZGV2KGhpZCktPmRlc2NyaXB0b3IpOwotCWlmICghdWRlc2MpIHsKLQkJaGlkX2VycihoaWQsICJOVUxMIFVTQiBkZXZpY2UgZGVzY3JpcHRvclxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0JYmNkRGV2aWNlID0gbGUxNl90b19jcHUodWRlc2MtPmJjZERldmljZSk7Ci0JcmV2X21haiA9IGJjZERldmljZSA+PiA4OwotCXJldl9taW4gPSBiY2REZXZpY2UgJiAweGZmOworCWlmIChtbW9kZV9yZXQgPT0gTEc0RkZfTU1PREVfSVNfTVVMVElNT0RFKSB7CisJCWZvciAobW1vZGVfaWR4ID0gMDsgbW1vZGVfaWR4IDwgQVJSQVlfU0laRShsZzRmZl9tdWx0aW1vZGVfd2hlZWxzKTsgbW1vZGVfaWR4KyspIHsKKwkJCWlmIChyZWFsX3Byb2R1Y3RfaWQgPT0gbGc0ZmZfbXVsdGltb2RlX3doZWVsc1ttbW9kZV9pZHhdLnByb2R1Y3RfaWQpCisJCQkJYnJlYWs7CisJCX0KIAotCWlmIChsZzRmZl9kZXZpY2VzW2ldLnByb2R1Y3RfaWQgPT0gVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9XSEVFTCkgewotCQlkYmdfaGlkKCJHZW5lcmljIHdoZWVsIGRldGVjdGVkLCBjYW4gaXQgZG8gbmF0aXZlP1xuIik7Ci0JCWRiZ19oaWQoIlVTQiByZXZpc2lvbjogJTJ4LiUwMnhcbiIsIHJldl9tYWosIHJldl9taW4pOwotCi0JCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKGxnNGZmX3JldnMpOyBqKyspIHsKLQkJCWlmIChsZzRmZl9yZXZzW2pdLnJldl9tYWogPT0gcmV2X21haiAmJiBsZzRmZl9yZXZzW2pdLnJldl9taW4gPT0gcmV2X21pbikgewotCQkJCWhpZF9sZzRmZl9zd2l0Y2hfbmF0aXZlKGhpZCwgbGc0ZmZfcmV2c1tqXS5jb21tYW5kKTsKLQkJCQloaWRfaW5mbyhoaWQsICJTd2l0Y2hlZCB0byBuYXRpdmUgbW9kZVxuIik7Ci0JCQl9CisJCWlmIChtbW9kZV9pZHggPT0gQVJSQVlfU0laRShsZzRmZl9tdWx0aW1vZGVfd2hlZWxzKSkgeworCQkJaGlkX2VycihoaWQsICJEZXZpY2UgcHJvZHVjdCBJRCAlWCBpcyBub3QgbGlzdGVkIGFzIGEgbXVsdGltb2RlIHdoZWVsIiwgcmVhbF9wcm9kdWN0X2lkKTsKKwkJCXJldHVybiAtMTsKIAkJfQogCX0KIApAQCAtNjMwLDE0ICsxMDY0LDIzIEBACiAJZHJ2X2RhdGEtPmRldmljZV9wcm9wcyA9IGVudHJ5OwogCiAJZW50cnktPnByb2R1Y3RfaWQgPSBsZzRmZl9kZXZpY2VzW2ldLnByb2R1Y3RfaWQ7CisJZW50cnktPnJlYWxfcHJvZHVjdF9pZCA9IHJlYWxfcHJvZHVjdF9pZDsKIAllbnRyeS0+bWluX3JhbmdlID0gbGc0ZmZfZGV2aWNlc1tpXS5taW5fcmFuZ2U7CiAJZW50cnktPm1heF9yYW5nZSA9IGxnNGZmX2RldmljZXNbaV0ubWF4X3JhbmdlOwogCWVudHJ5LT5zZXRfcmFuZ2UgPSBsZzRmZl9kZXZpY2VzW2ldLnNldF9yYW5nZTsKKwlpZiAobW1vZGVfcmV0ID09IExHNEZGX01NT0RFX0lTX01VTFRJTU9ERSkgeworCQlCVUdfT04obW1vZGVfaWR4ID09IC0xKTsKKwkJZW50cnktPmFsdGVybmF0ZV9tb2RlcyA9IGxnNGZmX211bHRpbW9kZV93aGVlbHNbbW1vZGVfaWR4XS5hbHRlcm5hdGVfbW9kZXM7CisJCWVudHJ5LT5yZWFsX3RhZyA9IGxnNGZmX211bHRpbW9kZV93aGVlbHNbbW1vZGVfaWR4XS5yZWFsX3RhZzsKKwkJZW50cnktPnJlYWxfbmFtZSA9IGxnNGZmX211bHRpbW9kZV93aGVlbHNbbW1vZGVfaWR4XS5yZWFsX25hbWU7CisJfQogCiAJLyogQ2hlY2sgaWYgYXV0b2NlbnRlcmluZyBpcyBhdmFpbGFibGUgYW5kCiAJICogc2V0IHRoZSBjZW50ZXJpbmcgZm9yY2UgdG8gemVybyBieSBkZWZhdWx0ICovCiAJaWYgKHRlc3RfYml0KEZGX0FVVE9DRU5URVIsIGRldi0+ZmZiaXQpKSB7Ci0JCWlmIChyZXZfbWFqID09IEZGRVhfUkVWX01BSiAmJiByZXZfbWluID09IEZGRVhfUkVWX01JTikJLyogRm9ybXVsYSBGb3JjZSBFWCBleHBlY3RzIGRpZmZlcmVudCBhdXRvY2VudGVyaW5nIGNvbW1hbmQgKi8KKwkJLyogRm9ybXVsYSBGb3JjZSBFWCBleHBlY3RzIGRpZmZlcmVudCBhdXRvY2VudGVyaW5nIGNvbW1hbmQgKi8KKwkJaWYgKChiY2REZXZpY2UgPj4gOCkgPT0gTEc0RkZfRkZFWF9SRVZfTUFKICYmCisJCSAgICAoYmNkRGV2aWNlICYgMHhmZikgPT0gTEc0RkZfRkZFWF9SRVZfTUlOKQogCQkJZGV2LT5mZi0+c2V0X2F1dG9jZW50ZXIgPSBoaWRfbGc0ZmZfc2V0X2F1dG9jZW50ZXJfZmZleDsKIAkJZWxzZQogCQkJZGV2LT5mZi0+c2V0X2F1dG9jZW50ZXIgPSBoaWRfbGc0ZmZfc2V0X2F1dG9jZW50ZXJfZGVmYXVsdDsKQEAgLTY0OSw2ICsxMDkyLDE0IEBACiAJZXJyb3IgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmhpZC0+ZGV2LCAmZGV2X2F0dHJfcmFuZ2UpOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOworCWlmIChtbW9kZV9yZXQgPT0gTEc0RkZfTU1PREVfSVNfTVVMVElNT0RFKSB7CisJCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZoaWQtPmRldiwgJmRldl9hdHRyX3JlYWxfaWQpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisJCWVycm9yID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZoaWQtPmRldiwgJmRldl9hdHRyX2FsdGVybmF0ZV9tb2Rlcyk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CiAJZGJnX2hpZCgic3lzZnMgaW50ZXJmYWNlIGNyZWF0ZWRcbiIpOwogCiAJLyogU2V0IHRoZSBtYXhpbXVtIHJhbmdlIHRvIHN0YXJ0IHdpdGggKi8KQEAgLTcxMSwyNCArMTE2MiwyNiBAQAogCXJldHVybiAwOwogfQogCi0KLQogaW50IGxnNGZmX2RlaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGlkKQogewogCXN0cnVjdCBsZzRmZl9kZXZpY2VfZW50cnkgKmVudHJ5OwogCXN0cnVjdCBsZ19kcnZfZGF0YSAqZHJ2X2RhdGE7CiAKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmhpZC0+ZGV2LCAmZGV2X2F0dHJfcmFuZ2UpOwotCiAJZHJ2X2RhdGEgPSBoaWRfZ2V0X2RydmRhdGEoaGlkKTsKIAlpZiAoIWRydl9kYXRhKSB7CiAJCWhpZF9lcnIoaGlkLCAiRXJyb3Igd2hpbGUgZGVpbml0aWFsaXppbmcgZGV2aWNlLCBubyBwcml2YXRlIGRyaXZlciBkYXRhLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJZW50cnkgPSBkcnZfZGF0YS0+ZGV2aWNlX3Byb3BzOwotCWlmICghZW50cnkpIHsKLQkJaGlkX2VycihoaWQsICJFcnJvciB3aGlsZSBkZWluaXRpYWxpemluZyBkZXZpY2UsIG5vIGRldmljZSBwcm9wZXJ0aWVzIGRhdGEuXG4iKTsKLQkJcmV0dXJuIC0xOworCWlmICghZW50cnkpCisJCWdvdG8gb3V0OyAvKiBOb3RoaW5nIG1vcmUgdG8gZG8gKi8KKworCWRldmljZV9yZW1vdmVfZmlsZSgmaGlkLT5kZXYsICZkZXZfYXR0cl9yYW5nZSk7CisKKwkvKiBNdWx0aW1vZGUgZGV2aWNlcyB3aWxsIGhhdmUgYXQgbGVhc3QgdGhlICJNT0RFX05BVElWRSIgYml0IHNldCAqLworCWlmIChlbnRyeS0+YWx0ZXJuYXRlX21vZGVzKSB7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmaGlkLT5kZXYsICZkZXZfYXR0cl9yZWFsX2lkKTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZoaWQtPmRldiwgJmRldl9hdHRyX2FsdGVybmF0ZV9tb2Rlcyk7CiAJfQogCiAjaWZkZWYgQ09ORklHX0xFRFNfQ0xBU1MKQEAgLTc1Miw2ICsxMjA1LDcgQEAKIAkvKiBEZWFsbG9jYXRlIG1lbW9yeSAqLwogCWtmcmVlKGVudHJ5KTsKIAorb3V0OgogCWRiZ19oaWQoIkRldmljZSBzdWNjZXNzZnVsbHkgdW5yZWdpc3RlcmVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sZzRmZi5oIGIvZHJpdmVycy9oaWQvaGlkLWxnNGZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2YTUwOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1sZzRmZi5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgX19ISURfTEc0RkZfSAorI2RlZmluZSBfX0hJRF9MRzRGRl9ICisKKyNpZmRlZiBDT05GSUdfTE9HSVdIRUVMU19GRgorZXh0ZXJuIGludCBsZzRmZl9ub19hdXRvc3dpdGNoOyAvKiBGcm9tIGhpZC1sZy5jICovCisKK2ludCBsZzRmZl9hZGp1c3RfaW5wdXRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCisJCQkgICAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSwgc3RydWN0IGxnX2Rydl9kYXRhICpkcnZfZGF0YSk7CitpbnQgbGc0ZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldik7CitpbnQgbGc0ZmZfZGVpbml0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBsZzRmZl9hZGp1c3RfaW5wdXRfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgc3RydWN0IGhpZF9maWVsZCAqZmllbGQsCisJCQkJCSAgIHN0cnVjdCBoaWRfdXNhZ2UgKnVzYWdlLCBfX3MzMiB2YWx1ZSwgc3RydWN0IGxnX2Rydl9kYXRhICpkcnZfZGF0YSkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgbGc0ZmZfaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikgeyByZXR1cm4gLTE7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGxnNGZmX2RlaW5pdChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikgeyByZXR1cm4gLTE7IH0KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1sb2dpdGVjaC1oaWRwcC5jIGIvZHJpdmVycy9oaWQvaGlkLWxvZ2l0ZWNoLWhpZHBwLmMKaW5kZXggZTc3NjU4Yy4uYjNjZjZmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWxvZ2l0ZWNoLWhpZHBwLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWxvZ2l0ZWNoLWhpZHBwLmMKQEAgLTI4LDYgKzI4LDExIEBACiBNT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBUaXNzb2lyZXMgPGJlbmphbWluLnRpc3NvaXJlc0BnbWFpbC5jb20+Iik7CiBNT0RVTEVfQVVUSE9SKCJOZXN0b3IgTG9wZXogQ2FzYWRvIDxubG9wZXpjYXNhZEBsb2dpdGVjaC5jb20+Iik7CiAKK3N0YXRpYyBib29sIGRpc2FibGVfcmF3X21vZGU7Cittb2R1bGVfcGFyYW0oZGlzYWJsZV9yYXdfbW9kZSwgYm9vbCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfcmF3X21vZGUsCisJIkRpc2FibGUgUmF3IG1vZGUgcmVwb3J0aW5nIGZvciB0b3VjaHBhZHMgYW5kIGtlZXAgZmlybXdhcmUgZ2VzdHVyZXMuIik7CisKICNkZWZpbmUgUkVQT1JUX0lEX0hJRFBQX1NIT1JUCQkJMHgxMAogI2RlZmluZSBSRVBPUlRfSURfSElEUFBfTE9ORwkJCTB4MTEKIApAQCAtMTE4OCw2ICsxMTkzLDExIEBACiAKIAloaWRwcC0+cXVpcmtzID0gaWQtPmRyaXZlcl9kYXRhOwogCisJaWYgKGRpc2FibGVfcmF3X21vZGUpIHsKKwkJaGlkcHAtPnF1aXJrcyAmPSB+SElEUFBfUVVJUktfQ0xBU1NfV1RQOworCQloaWRwcC0+cXVpcmtzICY9IH5ISURQUF9RVUlSS19ERUxBWUVEX0lOSVQ7CisJfQorCiAJaWYgKGhpZHBwLT5xdWlya3MgJiBISURQUF9RVUlSS19DTEFTU19XVFApIHsKIAkJcmV0ID0gd3RwX2FsbG9jYXRlKGhkZXYsIGlkKTsKIAkJaWYgKHJldCkKQEAgLTEyMTAsNiArMTIyMCw3IEBACiAJY29ubmVjdGVkID0gaGlkcHBfaXNfY29ubmVjdGVkKGhpZHBwKTsKIAlpZiAoaWQtPmdyb3VwICE9IEhJRF9HUk9VUF9MT0dJVEVDSF9ESl9ERVZJQ0UpIHsKIAkJaWYgKCFjb25uZWN0ZWQpIHsKKwkJCXJldCA9IC1FTk9ERVY7CiAJCQloaWRfZXJyKGhkZXYsICJEZXZpY2Ugbm90IGNvbm5lY3RlZCIpOwogCQkJaGlkX2RldmljZV9pb19zdG9wKGhkZXYpOwogCQkJZ290byBoaWRfcGFyc2VfZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1tdWx0aXRvdWNoLmMgYi9kcml2ZXJzL2hpZC9oaWQtbXVsdGl0b3VjaC5jCmluZGV4IGY2NWU3OGIuLjZhOWIwNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1tdWx0aXRvdWNoLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLW11bHRpdG91Y2guYwpAQCAtNDIsNyArNDIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9tdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogCkBAIC03Miw2ICs3MSw4IEBACiAjZGVmaW5lIE1UX0lOUFVUTU9ERV9UT1VDSFNDUkVFTgkweDAyCiAjZGVmaW5lIE1UX0lOUFVUTU9ERV9UT1VDSFBBRAkJMHgwMwogCisjZGVmaW5lIE1UX0JVVFRPTlRZUEVfQ0xJQ0tQQUQJCTAKKwogc3RydWN0IG10X3Nsb3QgewogCV9fczMyIHgsIHksIGN4LCBjeSwgcCwgdywgaDsKIAlfX3MzMiBjb250YWN0aWQ7CS8qIHRoZSBkZXZpY2UgQ29udGFjdElEIGFzc2lnbmVkIHRvIHRoaXMgc2xvdCAqLwpAQCAtMTE2LDYgKzExNyw4IEBACiAJX191OCB0b3VjaGVzX2J5X3JlcG9ydDsJLyogaG93IG1hbnkgdG91Y2hlcyBhcmUgcHJlc2VudCBpbiBvbmUgcmVwb3J0OgogCQkJCSogMSBtZWFucyB3ZSBzaG91bGQgdXNlIGEgc2VyaWFsIHByb3RvY29sCiAJCQkJKiA+IDEgbWVhbnMgaHlicmlkIChtdWx0aXRvdWNoKSBwcm90b2NvbCAqLworCV9fdTggYnV0dG9uc19jb3VudDsJLyogbnVtYmVyIG9mIHBoeXNpY2FsIGJ1dHRvbnMgcGVyIHRvdWNocGFkICovCisJYm9vbCBpc19idXR0b25wYWQ7CS8qIGlzIHRoaXMgZGV2aWNlIGEgYnV0dG9uIHBhZD8gKi8KIAlib29sIHNlcmlhbF9tYXliZTsJLyogbmVlZCB0byBjaGVjayBmb3Igc2VyaWFsIHByb3RvY29sICovCiAJYm9vbCBjdXJ2YWxpZDsJCS8qIGlzIHRoZSBjdXJyZW50IGNvbnRhY3QgdmFsaWQ/ICovCiAJdW5zaWduZWQgbXRfZmxhZ3M7CS8qIGZsYWdzIHRvIHBhc3MgdG8gaW5wdXQtbXQgKi8KQEAgLTMzNCw2ICszMzcsMTYgQEAKIAkJCXRkLT5tYXhjb250YWN0cyA9IHRkLT5tdGNsYXNzLm1heGNvbnRhY3RzOwogCiAJCWJyZWFrOworCWNhc2UgSElEX0RHX0JVVFRPTlRZUEU6CisJCWlmICh1c2FnZS0+dXNhZ2VfaW5kZXggPj0gZmllbGQtPnJlcG9ydF9jb3VudCkgeworCQkJZGV2X2VycigmaGRldi0+ZGV2LCAiSElEX0RHX0JVVFRPTlRZUEUgb3V0IG9mIHJhbmdlXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZpZWxkLT52YWx1ZVt1c2FnZS0+dXNhZ2VfaW5kZXhdID09IE1UX0JVVFRPTlRZUEVfQ0xJQ0tQQUQpCisJCQl0ZC0+aXNfYnV0dG9ucGFkID0gdHJ1ZTsKKworCQlicmVhazsKIAl9CiB9CiAKQEAgLTM3OSw2ICszOTIsMTAgQEAKIAkJdGQtPmlucHV0bW9kZV92YWx1ZSA9IE1UX0lOUFVUTU9ERV9UT1VDSFBBRDsKIAl9CiAKKwkvKiBjb3VudCB0aGUgYnV0dG9ucyBvbiB0b3VjaHBhZHMgKi8KKwlpZiAoKHVzYWdlLT5oaWQgJiBISURfVVNBR0VfUEFHRSkgPT0gSElEX1VQX0JVVFRPTikKKwkJdGQtPmJ1dHRvbnNfY291bnQrKzsKKwogCWlmICh1c2FnZS0+dXNhZ2VfaW5kZXgpCiAJCXByZXZfdXNhZ2UgPSAmZmllbGQtPnVzYWdlW3VzYWdlLT51c2FnZV9pbmRleCAtIDFdOwogCkBAIC03MjgsNiArNzQ1LDEzIEBACiAJaWYgKGNscy0+cXVpcmtzICYgTVRfUVVJUktfTk9UX1NFRU5fTUVBTlNfVVApCiAJCXRkLT5tdF9mbGFncyB8PSBJTlBVVF9NVF9EUk9QX1VOVVNFRDsKIAorCS8qIGNoZWNrIGZvciBjbGlja3BhZHMgKi8KKwlpZiAoKHRkLT5tdF9mbGFncyAmIElOUFVUX01UX1BPSU5URVIpICYmICh0ZC0+YnV0dG9uc19jb3VudCA9PSAxKSkKKwkJdGQtPmlzX2J1dHRvbnBhZCA9IHRydWU7CisKKwlpZiAodGQtPmlzX2J1dHRvbnBhZCkKKwkJX19zZXRfYml0KElOUFVUX1BST1BfQlVUVE9OUEFELCBpbnB1dC0+cHJvcGJpdCk7CisKIAlpbnB1dF9tdF9pbml0X3Nsb3RzKGlucHV0LCB0ZC0+bWF4Y29udGFjdHMsIHRkLT5tdF9mbGFncyk7CiAKIAl0ZC0+bXRfZmxhZ3MgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvaGlkLXJtaS5jIGIvZHJpdmVycy9oaWQvaGlkLXJtaS5jCmluZGV4IDQ5ZDRmZTQuLjM2OGZmZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1ybWkuYworKysgYi9kcml2ZXJzL2hpZC9oaWQtcm1pLmMKQEAgLTEwNCw2ICsxMDQsNyBAQAogCiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXN0cnVjdCBybWlfZnVuY3Rpb24gZjAxOwogCXN0cnVjdCBybWlfZnVuY3Rpb24gZjExOwogCXN0cnVjdCBybWlfZnVuY3Rpb24gZjMwOwogCkBAIC0xMjQsNiArMTI1LDcgQEAKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGRldjsKIAogCXVuc2lnbmVkIGxvbmcgZGV2aWNlX2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgZmlybXdhcmVfaWQ7CiB9OwogCiAjZGVmaW5lIFJNSV9QQUdFKGFkZHIpICgoKGFkZHIpID4+IDgpICYgMHhmZikKQEAgLTI3Miw2ICsyNzQsNDYgQEAKIAlyZXR1cm4gcm1pX3JlYWRfYmxvY2soaGRldiwgYWRkciwgYnVmLCAxKTsKIH0KIAorc3RhdGljIGludCBybWlfd3JpdGVfYmxvY2soc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHUxNiBhZGRyLCB2b2lkICpidWYsCisJCWNvbnN0IGludCBsZW4pCit7CisJc3RydWN0IHJtaV9kYXRhICpkYXRhID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5wYWdlX211dGV4KTsKKworCWlmIChSTUlfUEFHRShhZGRyKSAhPSBkYXRhLT5wYWdlKSB7CisJCXJldCA9IHJtaV9zZXRfcGFnZShoZGV2LCBSTUlfUEFHRShhZGRyKSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBleGl0OworCX0KKworCWRhdGEtPndyaXRlUmVwb3J0WzBdID0gUk1JX1dSSVRFX1JFUE9SVF9JRDsKKwlkYXRhLT53cml0ZVJlcG9ydFsxXSA9IGxlbjsKKwlkYXRhLT53cml0ZVJlcG9ydFsyXSA9IGFkZHIgJiAweEZGOworCWRhdGEtPndyaXRlUmVwb3J0WzNdID0gKGFkZHIgPj4gOCkgJiAweEZGOworCW1lbWNweSgmZGF0YS0+d3JpdGVSZXBvcnRbNF0sIGJ1ZiwgbGVuKTsKKworCXJldCA9IHJtaV93cml0ZV9yZXBvcnQoaGRldiwgZGF0YS0+d3JpdGVSZXBvcnQsCisJCQkJCWRhdGEtPm91dHB1dF9yZXBvcnRfc2l6ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaGRldi0+ZGV2LAorCQkJImZhaWxlZCB0byB3cml0ZSByZXF1ZXN0IG91dHB1dCByZXBvcnQgKCVkKVxuIiwKKwkJCXJldCk7CisJCWdvdG8gZXhpdDsKKwl9CisJcmV0ID0gMDsKKworZXhpdDoKKwltdXRleF91bmxvY2soJmRhdGEtPnBhZ2VfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJtaV93cml0ZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgdTE2IGFkZHIsIHZvaWQgKmJ1ZikKK3sKKwlyZXR1cm4gcm1pX3dyaXRlX2Jsb2NrKGhkZXYsIGFkZHIsIGJ1ZiwgMSk7Cit9CisKIHN0YXRpYyB2b2lkIHJtaV9mMTFfcHJvY2Vzc190b3VjaChzdHJ1Y3Qgcm1pX2RhdGEgKmhkYXRhLCBpbnQgc2xvdCwKIAkJdTggZmluZ2VyX3N0YXRlLCB1OCAqdG91Y2hfZGF0YSkKIHsKQEAgLTUzMiw2ICs1NzQsOSBAQAogCXUxNiBwYWdlX2Jhc2UgPSBwYWdlIDw8IDg7CiAKIAlzd2l0Y2ggKHBkdF9lbnRyeS0+ZnVuY3Rpb25fbnVtYmVyKSB7CisJY2FzZSAweDAxOgorCQlmID0gJmRhdGEtPmYwMTsKKwkJYnJlYWs7CiAJY2FzZSAweDExOgogCQlmID0gJmRhdGEtPmYxMTsKIAkJYnJlYWs7CkBAIC02MDQsNiArNjQ5LDkyIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorI2RlZmluZSBSTUlfREVWSUNFX0YwMV9CQVNJQ19RVUVSWV9MRU4JMTEKKworc3RhdGljIGludCBybWlfcG9wdWxhdGVfZjAxKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQoreworCXN0cnVjdCBybWlfZGF0YSAqZGF0YSA9IGhpZF9nZXRfZHJ2ZGF0YShoZGV2KTsKKwl1OCBiYXNpY19xdWVyaWVzW1JNSV9ERVZJQ0VfRjAxX0JBU0lDX1FVRVJZX0xFTl07CisJdTggaW5mb1szXTsKKwlpbnQgcmV0OworCWJvb2wgaGFzX3F1ZXJ5NDI7CisJYm9vbCBoYXNfbHRzOworCWJvb2wgaGFzX3NlbnNvcl9pZDsKKwlib29sIGhhc19kczRfcXVlcmllcyA9IGZhbHNlOworCWJvb2wgaGFzX2J1aWxkX2lkX3F1ZXJ5ID0gZmFsc2U7CisJYm9vbCBoYXNfcGFja2FnZV9pZF9xdWVyeSA9IGZhbHNlOworCXUxNiBxdWVyeV9vZmZzZXQgPSBkYXRhLT5mMDEucXVlcnlfYmFzZV9hZGRyOworCXUxNiBwcm9kX2luZm9fYWRkcjsKKwl1OCBkczRfcXVlcnlfbGVuOworCisJcmV0ID0gcm1pX3JlYWRfYmxvY2soaGRldiwgcXVlcnlfb2Zmc2V0LCBiYXNpY19xdWVyaWVzLAorCQkJCVJNSV9ERVZJQ0VfRjAxX0JBU0lDX1FVRVJZX0xFTik7CisJaWYgKHJldCkgeworCQloaWRfZXJyKGhkZXYsICJDYW4gbm90IHJlYWQgYmFzaWMgcXVlcmllcyBmcm9tIEZ1bmN0aW9uIDB4MS5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWhhc19sdHMgPSAhIShiYXNpY19xdWVyaWVzWzBdICYgQklUKDIpKTsKKwloYXNfc2Vuc29yX2lkID0gISEoYmFzaWNfcXVlcmllc1sxXSAmIEJJVCgzKSk7CisJaGFzX3F1ZXJ5NDIgPSAhIShiYXNpY19xdWVyaWVzWzFdICYgQklUKDcpKTsKKworCXF1ZXJ5X29mZnNldCArPSAxMTsKKwlwcm9kX2luZm9fYWRkciA9IHF1ZXJ5X29mZnNldCArIDY7CisJcXVlcnlfb2Zmc2V0ICs9IDEwOworCisJaWYgKGhhc19sdHMpCisJCXF1ZXJ5X29mZnNldCArPSAyMDsKKworCWlmIChoYXNfc2Vuc29yX2lkKQorCQlxdWVyeV9vZmZzZXQrKzsKKworCWlmIChoYXNfcXVlcnk0MikgeworCQlyZXQgPSBybWlfcmVhZChoZGV2LCBxdWVyeV9vZmZzZXQsIGluZm8pOworCQlpZiAocmV0KSB7CisJCQloaWRfZXJyKGhkZXYsICJDYW4gbm90IHJlYWQgcXVlcnk0Mi5cbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQloYXNfZHM0X3F1ZXJpZXMgPSAhIShpbmZvWzBdICYgQklUKDApKTsKKwkJcXVlcnlfb2Zmc2V0Kys7CisJfQorCisJaWYgKGhhc19kczRfcXVlcmllcykgeworCQlyZXQgPSBybWlfcmVhZChoZGV2LCBxdWVyeV9vZmZzZXQsICZkczRfcXVlcnlfbGVuKTsKKwkJaWYgKHJldCkgeworCQkJaGlkX2VycihoZGV2LCAiQ2FuIG5vdCByZWFkIERTNCBRdWVyeSBsZW5ndGguXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcXVlcnlfb2Zmc2V0Kys7CisKKwkJaWYgKGRzNF9xdWVyeV9sZW4gPiAwKSB7CisJCQlyZXQgPSBybWlfcmVhZChoZGV2LCBxdWVyeV9vZmZzZXQsIGluZm8pOworCQkJaWYgKHJldCkgeworCQkJCWhpZF9lcnIoaGRldiwgIkNhbiBub3QgcmVhZCBEUzQgcXVlcnkuXG4iKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCisJCQloYXNfcGFja2FnZV9pZF9xdWVyeSA9ICEhKGluZm9bMF0gJiBCSVQoMCkpOworCQkJaGFzX2J1aWxkX2lkX3F1ZXJ5ID0gISEoaW5mb1swXSAmIEJJVCgxKSk7CisJCX0KKwl9CisKKwlpZiAoaGFzX3BhY2thZ2VfaWRfcXVlcnkpCisJCXByb2RfaW5mb19hZGRyKys7CisKKwlpZiAoaGFzX2J1aWxkX2lkX3F1ZXJ5KSB7CisJCXJldCA9IHJtaV9yZWFkX2Jsb2NrKGhkZXYsIHByb2RfaW5mb19hZGRyLCBpbmZvLCAzKTsKKwkJaWYgKHJldCkgeworCQkJaGlkX2VycihoZGV2LCAiQ2FuIG5vdCByZWFkIHByb2R1Y3QgaW5mby5cbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWRhdGEtPmZpcm13YXJlX2lkID0gaW5mb1sxXSA8PCA4IHwgaW5mb1swXTsKKwkJZGF0YS0+ZmlybXdhcmVfaWQgKz0gaW5mb1syXSAqIDY1NTM2OworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHJtaV9wb3B1bGF0ZV9mMTEoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCiB7CiAJc3RydWN0IHJtaV9kYXRhICpkYXRhID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOwpAQCAtNjIwLDYgKzc1MSw4IEBACiAJYm9vbCBoYXNfZ2VzdHVyZXM7CiAJYm9vbCBoYXNfcmVsOwogCWJvb2wgaGFzX2RhdGE0MCA9IGZhbHNlOworCWJvb2wgaGFzX2RyaWJibGUgPSBmYWxzZTsKKwlib29sIGhhc19wYWxtX2RldGVjdCA9IGZhbHNlOwogCXVuc2lnbmVkIHhfc2l6ZSwgeV9zaXplOwogCXUxNiBxdWVyeV9vZmZzZXQ7CiAKQEAgLTY2MSw2ICs3OTQsMTQgQEAKIAloYXNfcmVsID0gISEoYnVmWzBdICYgQklUKDMpKTsKIAloYXNfZ2VzdHVyZXMgPSAhIShidWZbMF0gJiBCSVQoNSkpOwogCisJcmV0ID0gcm1pX3JlYWQoaGRldiwgZGF0YS0+ZjExLnF1ZXJ5X2Jhc2VfYWRkciArIDUsIGJ1Zik7CisJaWYgKHJldCkgeworCQloaWRfZXJyKGhkZXYsICJjYW4gbm90IGdldCBhYnNvbHV0ZSBkYXRhIHNvdXJjZXM6ICVkLlxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwloYXNfZHJpYmJsZSA9ICEhKGJ1ZlswXSAmIEJJVCg0KSk7CisKIAkvKgogCSAqIEF0IGxlYXN0IDQgcXVlcmllcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBwcmVzZW50IGluIEYxMQogCSAqICsxIGZvciBxdWVyeSA1IHdoaWNoIGlzIHByZXNlbnQgc2luY2UgYWJzb2x1dGUgZXZlbnRzIGFyZQpAQCAtNjgwLDYgKzgyMSw3IEBACiAJCQkJcmV0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KKwkJaGFzX3BhbG1fZGV0ZWN0ID0gISEoYnVmWzBdICYgQklUKDApKTsKIAkJaGFzX3F1ZXJ5MTAgPSAhIShidWZbMF0gJiBCSVQoMikpOwogCiAJCXF1ZXJ5X29mZnNldCArPSAyOyAvKiBxdWVyeSA3IGFuZCA4IGFyZSBwcmVzZW50ICovCkBAIC03NjYsMTcgKzkwOCwzOCBAQAogCSAqIHJldHJpZXZlIHRoZSBjdHJsIHJlZ2lzdGVycwogCSAqIHRoZSBjdHJsIHJlZ2lzdGVyIGhhcyBhIHNpemUgb2YgMjAgYnV0IGEgZncgYnVnIHNwbGl0IGl0IGludG8gMTYgKyA0LAogCSAqIGFuZCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyBpZiB0aGUgZmlyc3QgMjAgYnl0ZXMgYXJlIGhlcmUgb3Igbm90LgotCSAqIFdlIHVzZSBvbmx5IHRoZSBmaXJzdCAxMCBieXRlcywgc28gZ2V0IG9ubHkgdGhlbS4KKwkgKiBXZSB1c2Ugb25seSB0aGUgZmlyc3QgMTIgYnl0ZXMsIHNvIGdldCBvbmx5IHRoZW0uCiAJICovCi0JcmV0ID0gcm1pX3JlYWRfYmxvY2soaGRldiwgZGF0YS0+ZjExLmNvbnRyb2xfYmFzZV9hZGRyLCBidWYsIDEwKTsKKwlyZXQgPSBybWlfcmVhZF9ibG9jayhoZGV2LCBkYXRhLT5mMTEuY29udHJvbF9iYXNlX2FkZHIsIGJ1ZiwgMTIpOwogCWlmIChyZXQpIHsKLQkJaGlkX2VycihoZGV2LCAiY2FuIG5vdCByZWFkIGN0cmwgYmxvY2sgb2Ygc2l6ZSAxMDogJWQuXG4iLCByZXQpOworCQloaWRfZXJyKGhkZXYsICJjYW4gbm90IHJlYWQgY3RybCBibG9jayBvZiBzaXplIDExOiAlZC5cbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJZGF0YS0+bWF4X3ggPSBidWZbNl0gfCAoYnVmWzddIDw8IDgpOwogCWRhdGEtPm1heF95ID0gYnVmWzhdIHwgKGJ1Zls5XSA8PCA4KTsKIAorCWlmIChoYXNfZHJpYmJsZSkgeworCQlidWZbMF0gPSBidWZbMF0gJiB+QklUKDYpOworCQlyZXQgPSBybWlfd3JpdGUoaGRldiwgZGF0YS0+ZjExLmNvbnRyb2xfYmFzZV9hZGRyLCBidWYpOworCQlpZiAocmV0KSB7CisJCQloaWRfZXJyKGhkZXYsICJjYW4gbm90IHdyaXRlIHRvIGNvbnRyb2wgcmVnIDA6ICVkLlxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmIChoYXNfcGFsbV9kZXRlY3QpIHsKKwkJYnVmWzExXSA9IGJ1ZlsxMV0gJiB+QklUKDApOworCQlyZXQgPSBybWlfd3JpdGUoaGRldiwgZGF0YS0+ZjExLmNvbnRyb2xfYmFzZV9hZGRyICsgMTEsCisJCQkJJmJ1ZlsxMV0pOworCQlpZiAocmV0KSB7CisJCQloaWRfZXJyKGhkZXYsICJjYW4gbm90IHdyaXRlIHRvIGNvbnRyb2wgcmVnIDExOiAlZC5cbiIsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODU4LDYgKzEwMjEsMTIgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwlyZXQgPSBybWlfcG9wdWxhdGVfZjAxKGhkZXYpOworCWlmIChyZXQpIHsKKwkJaGlkX2VycihoZGV2LCAiRXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nIEYwMSAoJWQpLlxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKIAlyZXQgPSBybWlfcG9wdWxhdGVfZjExKGhkZXYpOwogCWlmIChyZXQpIHsKIAkJaGlkX2VycihoZGV2LCAiRXJyb3Igd2hpbGUgaW5pdGlhbGl6aW5nIEYxMSAoJWQpLlxuIiwgcmV0KTsKQEAgLTkwNyw2ICsxMDc2LDggQEAKIAlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAKKwloaWRfaW5mbyhoZGV2LCAiZmlybXdhcmUgaWQ6ICVsZFxuIiwgZGF0YS0+ZmlybXdhcmVfaWQpOworCiAJX19zZXRfYml0KEVWX0FCUywgaW5wdXQtPmV2Yml0KTsKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX01UX1BPU0lUSU9OX1gsIDEsIGRhdGEtPm1heF94LCAwLCAwKTsKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX01UX1BPU0lUSU9OX1ksIDEsIGRhdGEtPm1heF95LCAwLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zZW5zb3ItY3VzdG9tLmMgYi9kcml2ZXJzL2hpZC9oaWQtc2Vuc29yLWN1c3RvbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MTRmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2hpZC9oaWQtc2Vuc29yLWN1c3RvbS5jCkBAIC0wLDAgKzEsODQ5IEBACisvKgorICogaGlkLXNlbnNvci1jdXN0b20uYworICogQ29weXJpZ2h0IChjKSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvYnNlYXJjaC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZC1zZW5zb3ItaHViLmg+CisKKyNkZWZpbmUgSElEX0NVU1RPTV9OQU1FX0xFTkdUSAkJNjQKKyNkZWZpbmUgSElEX0NVU1RPTV9NQVhfQ09SRV9BVFRSUwkxMAorI2RlZmluZSBISURfQ1VTVE9NX1RPVEFMX0FUVFJTCQkoSElEX0NVU1RPTV9NQVhfQ09SRV9BVFRSUyArIDEpCisjZGVmaW5lIEhJRF9DVVNUT01fRklGT19TSVpFCQk0MDk2CisjZGVmaW5lIEhJRF9DVVNUT01fTUFYX0ZFQVRVUkVfQllURVMJNjQKKworc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tX2ZpZWxkIHsKKwlpbnQgcmVwb3J0X2lkOworCWNoYXIgZ3JvdXBfbmFtZVtISURfQ1VTVE9NX05BTUVfTEVOR1RIXTsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfYXR0cmlidXRlX2luZm8gYXR0cmlidXRlOworCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHNkX2F0dHJzW0hJRF9DVVNUT01fTUFYX0NPUkVfQVRUUlNdOworCWNoYXIgYXR0cl9uYW1lW0hJRF9DVVNUT01fVE9UQUxfQVRUUlNdW0hJRF9DVVNUT01fTkFNRV9MRU5HVEhdOworCXN0cnVjdCBhdHRyaWJ1dGUgKmF0dHJzW0hJRF9DVVNUT01fVE9UQUxfQVRUUlNdOworCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaGlkX2N1c3RvbV9hdHRyaWJ1dGVfZ3JvdXA7Cit9OworCitzdHJ1Y3QgaGlkX3NlbnNvcl9jdXN0b20geworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2OworCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9jYWxsYmFja3MgY2FsbGJhY2tzOworCWludCBzZW5zb3JfZmllbGRfY291bnQ7CisJc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tX2ZpZWxkICpmaWVsZHM7CisJaW50IGlucHV0X2ZpZWxkX2NvdW50OworCWludCBpbnB1dF9yZXBvcnRfc2l6ZTsKKwlpbnQgaW5wdXRfcmVwb3J0X3JlY2Rfc2l6ZTsKKwlib29sIGlucHV0X3NraXBfc2FtcGxlOworCWJvb2wgZW5hYmxlOworCXN0cnVjdCBoaWRfc2Vuc29yX2N1c3RvbV9maWVsZCAqcG93ZXJfc3RhdGU7CisJc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tX2ZpZWxkICpyZXBvcnRfc3RhdGU7CisJc3RydWN0IG1pc2NkZXZpY2UgY3VzdG9tX2RldjsKKwlzdHJ1Y3Qga2ZpZm8gZGF0YV9maWZvOworCXVuc2lnbmVkIGxvbmcgbWlzY19vcGVuZWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKK307CisKKy8qIEhlYWRlciBmb3IgZWFjaCBzYW1wbGUgdG8gdXNlciBzcGFjZSB2aWEgZGV2IGludGVyZmFjZSAqLworc3RydWN0IGhpZF9zZW5zb3Jfc2FtcGxlIHsKKwl1MzIgdXNhZ2VfaWQ7CisJdTY0IHRpbWVzdGFtcDsKKwl1MzIgcmF3X2xlbjsKK30gX19wYWNrZWQ7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlIGhpZF9jdXN0b21fYXR0cnNbXSA9IHsKKwl7Lm5hbWUgPSAibmFtZSIsIC5tb2RlID0gU19JUlVHT30sCisJey5uYW1lID0gInVuaXRzIiwgLm1vZGUgPSBTX0lSVUdPfSwKKwl7Lm5hbWUgPSAidW5pdC1leHBvIiwgLm1vZGUgPSBTX0lSVUdPfSwKKwl7Lm5hbWUgPSAibWluaW11bSIsIC5tb2RlID0gU19JUlVHT30sCisJey5uYW1lID0gIm1heGltdW0iLCAubW9kZSA9IFNfSVJVR099LAorCXsubmFtZSA9ICJzaXplIiwgLm1vZGUgPSBTX0lSVUdPfSwKKwl7Lm5hbWUgPSAidmFsdWUiLCAubW9kZSA9IFNfSVdVU1IgfCBTX0lSVUdPfSwKKwl7Lm5hbWUgPSBOVUxMfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoaWRfY3VzdG9tX3VzYWdlX2Rlc2MgeworCWludCB1c2FnZV9pZDsKKwljaGFyICpkZXNjOworfSBoaWRfY3VzdG9tX3VzYWdlX2Rlc2NfdGFibGVbXSA9IHsKKwl7MHgyMDAyMDEsCSJldmVudC1zZW5zb3Itc3RhdGUifSwKKwl7MHgyMDAyMDIsCSJldmVudC1zZW5zb3ItZXZlbnQifSwKKwl7MHgyMDAzMDEsCSJwcm9wZXJ0eS1mcmllbmRseS1uYW1lIn0sCisJezB4MjAwMzAyLAkicHJvcGVydHktcGVyc2lzdGVudC11bmlxdWUtaWQifSwKKwl7MHgyMDAzMDMsCSJwcm9wZXJ0eS1zZW5zb3Itc3RhdHVzIn0sCisJezB4MjAwMzA0LAkicHJvcGVydHktbWluLXJlcG9ydC1pbnRlcnZhbCJ9LAorCXsweDIwMDMwNSwJInByb3BlcnR5LXNlbnNvci1tYW51ZmFjdHVyZXIifSwKKwl7MHgyMDAzMDYsCSJwcm9wZXJ0eS1zZW5zb3ItbW9kZWwifSwKKwl7MHgyMDAzMDcsCSJwcm9wZXJ0eS1zZW5zb3Itc2VyaWFsLW51bWJlciJ9LAorCXsweDIwMDMwOCwJInByb3BlcnR5LXNlbnNvci1kZXNjcmlwdGlvbiJ9LAorCXsweDIwMDMwOSwJInByb3BlcnR5LXNlbnNvci1jb25uZWN0aW9uLXR5cGUifSwKKwl7MHgyMDAzMEEsCSJwcm9wZXJ0eS1zZW5zb3ItZGV2aWNlLXBhdGgifSwKKwl7MHgyMDAzMEIsCSJwcm9wZXJ0eS1oYXJkd2FyZS1yZXZpc2lvbiJ9LAorCXsweDIwMDMwQywJInByb3BlcnR5LWZpcm13YXJlLXZlcnNpb24ifSwKKwl7MHgyMDAzMEQsCSJwcm9wZXJ0eS1yZWxlYXNlLWRhdGUifSwKKwl7MHgyMDAzMEUsCSJwcm9wZXJ0eS1yZXBvcnQtaW50ZXJ2YWwifSwKKwl7MHgyMDAzMEYsCSJwcm9wZXJ0eS1jaGFuZ2Utc2Vuc2l0aXZpdHktYWJzb2x1dGUifSwKKwl7MHgyMDAzMTAsCSJwcm9wZXJ0eS1jaGFuZ2Utc2Vuc2l0aXZpdHktcGVyY2VudC1yYW5nZSJ9LAorCXsweDIwMDMxMSwJInByb3BlcnR5LWNoYW5nZS1zZW5zaXRpdml0eS1wZXJjZW50LXJlbGF0aXZlIn0sCisJezB4MjAwMzEyLAkicHJvcGVydHktYWNjdXJhY3kifSwKKwl7MHgyMDAzMTMsCSJwcm9wZXJ0eS1yZXNvbHV0aW9uIn0sCisJezB4MjAwMzE0LAkicHJvcGVydHktbWF4aW11bSJ9LAorCXsweDIwMDMxNSwJInByb3BlcnR5LW1pbmltdW0ifSwKKwl7MHgyMDAzMTYsCSJwcm9wZXJ0eS1yZXBvcnRpbmctc3RhdGUifSwKKwl7MHgyMDAzMTcsCSJwcm9wZXJ0eS1zYW1wbGluZy1yYXRlIn0sCisJezB4MjAwMzE4LAkicHJvcGVydHktcmVzcG9uc2UtY3VydmUifSwKKwl7MHgyMDAzMTksCSJwcm9wZXJ0eS1wb3dlci1zdGF0ZSJ9LAorCXsweDIwMDU0MCwJImRhdGEtZmllbGQtY3VzdG9tIn0sCisJezB4MjAwNTQxLAkiZGF0YS1maWVsZC1jdXN0b20tdXNhZ2UifSwKKwl7MHgyMDA1NDIsCSJkYXRhLWZpZWxkLWN1c3RvbS1ib29sZWFuLWFycmF5In0sCisJezB4MjAwNTQzLAkiZGF0YS1maWVsZC1jdXN0b20tdmFsdWUifSwKKwl7MHgyMDA1NDQsCSJkYXRhLWZpZWxkLWN1c3RvbS12YWx1ZV8xIn0sCisJezB4MjAwNTQ1LAkiZGF0YS1maWVsZC1jdXN0b20tdmFsdWVfMiJ9LAorCXsweDIwMDU0NiwJImRhdGEtZmllbGQtY3VzdG9tLXZhbHVlXzMifSwKKwl7MHgyMDA1NDcsCSJkYXRhLWZpZWxkLWN1c3RvbS12YWx1ZV80In0sCisJezB4MjAwNTQ4LAkiZGF0YS1maWVsZC1jdXN0b20tdmFsdWVfNSJ9LAorCXsweDIwMDU0OSwJImRhdGEtZmllbGQtY3VzdG9tLXZhbHVlXzYifSwKKwl7MHgyMDA1NEEsCSJkYXRhLWZpZWxkLWN1c3RvbS12YWx1ZV83In0sCisJezB4MjAwNTRCLAkiZGF0YS1maWVsZC1jdXN0b20tdmFsdWVfOCJ9LAorCXsweDIwMDU0QywJImRhdGEtZmllbGQtY3VzdG9tLXZhbHVlXzkifSwKKwl7MHgyMDA1NEQsCSJkYXRhLWZpZWxkLWN1c3RvbS12YWx1ZV8xMCJ9LAorCXsweDIwMDU0RSwJImRhdGEtZmllbGQtY3VzdG9tLXZhbHVlXzExIn0sCisJezB4MjAwNTRGLAkiZGF0YS1maWVsZC1jdXN0b20tdmFsdWVfMTIifSwKKwl7MHgyMDA1NTAsCSJkYXRhLWZpZWxkLWN1c3RvbS12YWx1ZV8xMyJ9LAorCXsweDIwMDU1MSwJImRhdGEtZmllbGQtY3VzdG9tLXZhbHVlXzE0In0sCisJezB4MjAwNTUyLAkiZGF0YS1maWVsZC1jdXN0b20tdmFsdWVfMTUifSwKKwl7MHgyMDA1NTMsCSJkYXRhLWZpZWxkLWN1c3RvbS12YWx1ZV8xNiJ9LAorCXsweDIwMDU1NCwJImRhdGEtZmllbGQtY3VzdG9tLXZhbHVlXzE3In0sCisJezB4MjAwNTU1LAkiZGF0YS1maWVsZC1jdXN0b20tdmFsdWVfMTgifSwKKwl7MHgyMDA1NTYsCSJkYXRhLWZpZWxkLWN1c3RvbS12YWx1ZV8xOSJ9LAorCXsweDIwMDU1NywJImRhdGEtZmllbGQtY3VzdG9tLXZhbHVlXzIwIn0sCisJezB4MjAwNTU4LAkiZGF0YS1maWVsZC1jdXN0b20tdmFsdWVfMjEifSwKKwl7MHgyMDA1NTksCSJkYXRhLWZpZWxkLWN1c3RvbS12YWx1ZV8yMiJ9LAorCXsweDIwMDU1QSwJImRhdGEtZmllbGQtY3VzdG9tLXZhbHVlXzIzIn0sCisJezB4MjAwNTVCLAkiZGF0YS1maWVsZC1jdXN0b20tdmFsdWVfMjQifSwKKwl7MHgyMDA1NUMsCSJkYXRhLWZpZWxkLWN1c3RvbS12YWx1ZV8yNSJ9LAorCXsweDIwMDU1RCwJImRhdGEtZmllbGQtY3VzdG9tLXZhbHVlXzI2In0sCisJezB4MjAwNTVFLAkiZGF0YS1maWVsZC1jdXN0b20tdmFsdWVfMjcifSwKKwl7MHgyMDA1NUYsCSJkYXRhLWZpZWxkLWN1c3RvbS12YWx1ZV8yOCJ9LAorfTsKKworc3RhdGljIGludCB1c2FnZV9pZF9jbXAoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQoreworCWlmICgqKGludCAqKXAxIDwgKihpbnQgKilwMikKKwkJcmV0dXJuIC0xOworCisJaWYgKCooaW50ICopcDEgPiAqKGludCAqKXAyKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBlbmFibGVfc2Vuc29yX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tICpzZW5zb3JfaW5zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHNlbnNvcl9pbnN0LT5lbmFibGUpOworfQorCitzdGF0aWMgaW50IHNldF9wb3dlcl9yZXBvcnRfc3RhdGUoc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tICpzZW5zb3JfaW5zdCwKKwkJCQkgIGJvb2wgc3RhdGUpCit7CisJaW50IHBvd2VyX3ZhbCA9IC0xOworCWludCByZXBvcnRfdmFsID0gLTE7CisJdTMyIHBvd2VyX3N0YXRlX3VzYWdlX2lkOworCXUzMiByZXBvcnRfc3RhdGVfdXNhZ2VfaWQ7CisJaW50IHJldDsKKworCS8qCisJICogSXQgaXMgcG9zc2libGUgdGhhdCB0aGUgcG93ZXIvcmVwb3J0IHN0YXRlIGlkcyBhcmUgbm90IHByZXNlbnQuCisJICogSW4gdGhpcyBjYXNlIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gc3VjY2Vzcy4gQnV0IGlmIHRoZQorCSAqIGlkcyBhcmUgcHJlc2VudCwgdGhlbiBpdCB3aWxsIHJldHVybiBlcnJvciBpZiBzZXQgZmFpbHMuCisJICovCisJaWYgKHN0YXRlKSB7CisJCXBvd2VyX3N0YXRlX3VzYWdlX2lkID0KKwkJCUhJRF9VU0FHRV9TRU5TT1JfUFJPUF9QT1dFUl9TVEFURV9EMF9GVUxMX1BPV0VSX0VOVU07CisJCXJlcG9ydF9zdGF0ZV91c2FnZV9pZCA9CisJCQlISURfVVNBR0VfU0VOU09SX1BST1BfUkVQT1JUSU5HX1NUQVRFX0FMTF9FVkVOVFNfRU5VTTsKKwl9IGVsc2UgeworCQlwb3dlcl9zdGF0ZV91c2FnZV9pZCA9CisJCQlISURfVVNBR0VfU0VOU09SX1BST1BfUE9XRVJfU1RBVEVfRDRfUE9XRVJfT0ZGX0VOVU07CisJCXJlcG9ydF9zdGF0ZV91c2FnZV9pZCA9CisJCQlISURfVVNBR0VfU0VOU09SX1BST1BfUkVQT1JUSU5HX1NUQVRFX05PX0VWRU5UU19FTlVNOworCX0KKworCWlmIChzZW5zb3JfaW5zdC0+cG93ZXJfc3RhdGUpCisJCXBvd2VyX3ZhbCA9IGhpZF9zZW5zb3JfZ2V0X3VzYWdlX2luZGV4KHNlbnNvcl9pbnN0LT5oc2RldiwKKwkJCQlzZW5zb3JfaW5zdC0+cG93ZXJfc3RhdGUtPmF0dHJpYnV0ZS5yZXBvcnRfaWQsCisJCQkJc2Vuc29yX2luc3QtPnBvd2VyX3N0YXRlLT5hdHRyaWJ1dGUuaW5kZXgsCisJCQkJcG93ZXJfc3RhdGVfdXNhZ2VfaWQpOworCWlmIChzZW5zb3JfaW5zdC0+cmVwb3J0X3N0YXRlKQorCQlyZXBvcnRfdmFsID0gaGlkX3NlbnNvcl9nZXRfdXNhZ2VfaW5kZXgoc2Vuc29yX2luc3QtPmhzZGV2LAorCQkJCXNlbnNvcl9pbnN0LT5yZXBvcnRfc3RhdGUtPmF0dHJpYnV0ZS5yZXBvcnRfaWQsCisJCQkJc2Vuc29yX2luc3QtPnJlcG9ydF9zdGF0ZS0+YXR0cmlidXRlLmluZGV4LAorCQkJCXJlcG9ydF9zdGF0ZV91c2FnZV9pZCk7CisKKwlpZiAocG93ZXJfdmFsID49IDApIHsKKwkJcG93ZXJfdmFsICs9CisJCQlzZW5zb3JfaW5zdC0+cG93ZXJfc3RhdGUtPmF0dHJpYnV0ZS5sb2dpY2FsX21pbmltdW07CisJCXJldCA9IHNlbnNvcl9odWJfc2V0X2ZlYXR1cmUoc2Vuc29yX2luc3QtPmhzZGV2LAorCQkJCXNlbnNvcl9pbnN0LT5wb3dlcl9zdGF0ZS0+YXR0cmlidXRlLnJlcG9ydF9pZCwKKwkJCQlzZW5zb3JfaW5zdC0+cG93ZXJfc3RhdGUtPmF0dHJpYnV0ZS5pbmRleCwKKwkJCQlzaXplb2YocG93ZXJfdmFsKSwKKwkJCQkmcG93ZXJfdmFsKTsKKwkJaWYgKHJldCkgeworCQkJaGlkX2VycihzZW5zb3JfaW5zdC0+aHNkZXYtPmhkZXYsCisJCQkJIlNldCBwb3dlciBzdGF0ZSBmYWlsZWRcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmIChyZXBvcnRfdmFsID49IDApIHsKKwkJcmVwb3J0X3ZhbCArPQorCQkJc2Vuc29yX2luc3QtPnJlcG9ydF9zdGF0ZS0+YXR0cmlidXRlLmxvZ2ljYWxfbWluaW11bTsKKwkJcmV0ID0gc2Vuc29yX2h1Yl9zZXRfZmVhdHVyZShzZW5zb3JfaW5zdC0+aHNkZXYsCisJCQkJc2Vuc29yX2luc3QtPnJlcG9ydF9zdGF0ZS0+YXR0cmlidXRlLnJlcG9ydF9pZCwKKwkJCQlzZW5zb3JfaW5zdC0+cmVwb3J0X3N0YXRlLT5hdHRyaWJ1dGUuaW5kZXgsCisJCQkJc2l6ZW9mKHJlcG9ydF92YWwpLAorCQkJCSZyZXBvcnRfdmFsKTsKKwkJaWYgKHJldCkgeworCQkJaGlkX2VycihzZW5zb3JfaW5zdC0+aHNkZXYtPmhkZXYsCisJCQkJIlNldCByZXBvcnQgc3RhdGUgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZW5hYmxlX3NlbnNvcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBoaWRfc2Vuc29yX2N1c3RvbSAqc2Vuc29yX2luc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgdmFsdWU7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlpZiAoa3N0cnRvaW50KGJ1ZiwgMCwgJnZhbHVlKSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJnNlbnNvcl9pbnN0LT5tdXRleCk7CisJaWYgKHZhbHVlICYmICFzZW5zb3JfaW5zdC0+ZW5hYmxlKSB7CisJCXJldCA9IHNlbnNvcl9odWJfZGV2aWNlX29wZW4oc2Vuc29yX2luc3QtPmhzZGV2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gdW5sb2NrX3N0YXRlOworCisJCXJldCA9IHNldF9wb3dlcl9yZXBvcnRfc3RhdGUoc2Vuc29yX2luc3QsIHRydWUpOworCQlpZiAocmV0KSB7CisJCQlzZW5zb3JfaHViX2RldmljZV9jbG9zZShzZW5zb3JfaW5zdC0+aHNkZXYpOworCQkJZ290byB1bmxvY2tfc3RhdGU7CisJCX0KKwkJc2Vuc29yX2luc3QtPmVuYWJsZSA9IHRydWU7CisJfSBlbHNlIGlmICghdmFsdWUgJiYgc2Vuc29yX2luc3QtPmVuYWJsZSkgeworCQlyZXQgPSBzZXRfcG93ZXJfcmVwb3J0X3N0YXRlKHNlbnNvcl9pbnN0LCBmYWxzZSk7CisJCXNlbnNvcl9odWJfZGV2aWNlX2Nsb3NlKHNlbnNvcl9pbnN0LT5oc2Rldik7CisJCXNlbnNvcl9pbnN0LT5lbmFibGUgPSBmYWxzZTsKKwl9Cit1bmxvY2tfc3RhdGU6CisJbXV0ZXhfdW5sb2NrKCZzZW5zb3JfaW5zdC0+bXV0ZXgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSX1JXKGVuYWJsZV9zZW5zb3IpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZW5hYmxlX3NlbnNvcl9hdHRyc1tdID0geworCSZkZXZfYXR0cl9lbmFibGVfc2Vuc29yLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGVuYWJsZV9zZW5zb3JfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBlbmFibGVfc2Vuc29yX2F0dHJzLAorfTsKKworc3RhdGljIHNzaXplX3Qgc2hvd192YWx1ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBoaWRfc2Vuc29yX2N1c3RvbSAqc2Vuc29yX2luc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfYXR0cmlidXRlX2luZm8gKmF0dHJpYnV0ZTsKKwlpbnQgaW5kZXgsIHVzYWdlLCBmaWVsZF9pbmRleDsKKwljaGFyIG5hbWVbSElEX0NVU1RPTV9OQU1FX0xFTkdUSF07CisJYm9vbCBmZWF0dXJlID0gZmFsc2U7CisJYm9vbCBpbnB1dCA9IGZhbHNlOworCWludCB2YWx1ZSA9IDA7CisKKwlpZiAoc3NjYW5mKGF0dHItPmF0dHIubmFtZSwgImZlYXR1cmUtJWQtJXgtJXMiLCAmaW5kZXgsICZ1c2FnZSwKKwkJICAgbmFtZSkgPT0gMykgeworCQlmZWF0dXJlID0gdHJ1ZTsKKwkJZmllbGRfaW5kZXggPSBpbmRleCArIHNlbnNvcl9pbnN0LT5pbnB1dF9maWVsZF9jb3VudDsKKwl9IGVsc2UgaWYgKHNzY2FuZihhdHRyLT5hdHRyLm5hbWUsICJpbnB1dC0lZC0leC0lcyIsICZpbmRleCwgJnVzYWdlLAorCQkgICBuYW1lKSA9PSAzKSB7CisJCWlucHV0ID0gdHJ1ZTsKKwkJZmllbGRfaW5kZXggPSBpbmRleDsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXN0cm5jbXAobmFtZSwgInZhbHVlIiwgc3RybGVuKCJ2YWx1ZSIpKSkgeworCQl1MzIgcmVwb3J0X2lkOworCQlpbnQgcmV0OworCisJCWF0dHJpYnV0ZSA9ICZzZW5zb3JfaW5zdC0+ZmllbGRzW2ZpZWxkX2luZGV4XS5hdHRyaWJ1dGU7CisJCXJlcG9ydF9pZCA9IGF0dHJpYnV0ZS0+cmVwb3J0X2lkOworCQlpZiAoZmVhdHVyZSkgeworCQkJdTggdmFsdWVzW0hJRF9DVVNUT01fTUFYX0ZFQVRVUkVfQllURVNdOworCQkJaW50IGxlbiA9IDA7CisJCQl1NjQgdmFsdWUgPSAwOworCQkJaW50IGkgPSAwOworCisJCQlyZXQgPSBzZW5zb3JfaHViX2dldF9mZWF0dXJlKHNlbnNvcl9pbnN0LT5oc2RldiwKKwkJCQkJCSAgICAgcmVwb3J0X2lkLAorCQkJCQkJICAgICBpbmRleCwKKwkJCQkJCSAgICAgc2l6ZW9mKHZhbHVlcyksIHZhbHVlcyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQl3aGlsZSAoaSA8IHJldCkgeworCQkJCWlmIChpICsgYXR0cmlidXRlLT5zaXplID4gcmV0KSB7CisJCQkJCWxlbiArPSBzbnByaW50ZigmYnVmW2xlbl0sCisJCQkJCQkJUEFHRV9TSVpFIC0gbGVuLAorCQkJCQkJCSIlZCAiLCB2YWx1ZXNbaV0pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc3dpdGNoIChhdHRyaWJ1dGUtPnNpemUpIHsKKwkJCQljYXNlIDI6CisJCQkJCXZhbHVlID0gKHU2NCkgKih1MTYgKikmdmFsdWVzW2ldOworCQkJCQlpICs9IGF0dHJpYnV0ZS0+c2l6ZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA0OgorCQkJCQl2YWx1ZSA9ICh1NjQpICoodTMyICopJnZhbHVlc1tpXTsKKwkJCQkJaSArPSBhdHRyaWJ1dGUtPnNpemU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgODoKKwkJCQkJdmFsdWUgPSAqKHU2NCAqKSZ2YWx1ZXNbaV07CisJCQkJCWkgKz0gYXR0cmlidXRlLT5zaXplOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQl2YWx1ZSA9ICh1NjQpIHZhbHVlc1tpXTsKKwkJCQkJKytpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgUEFHRV9TSVpFIC0gbGVuLAorCQkJCQkJIiVsbGQgIiwgdmFsdWUpOworCQkJfQorCQkJbGVuICs9IHNucHJpbnRmKCZidWZbbGVuXSwgUEFHRV9TSVpFIC0gbGVuLCAiXG4iKTsKKworCQkJcmV0dXJuIGxlbjsKKwkJfSBlbHNlIGlmIChpbnB1dCkKKwkJCXZhbHVlID0gc2Vuc29yX2h1Yl9pbnB1dF9hdHRyX2dldF9yYXdfdmFsdWUoCisJCQkJCQlzZW5zb3JfaW5zdC0+aHNkZXYsCisJCQkJCQlzZW5zb3JfaW5zdC0+aHNkZXYtPnVzYWdlLAorCQkJCQkJdXNhZ2UsIHJlcG9ydF9pZCwKKwkJCQkJCVNFTlNPUl9IVUJfU1lOQyk7CisJfSBlbHNlIGlmICghc3RybmNtcChuYW1lLCAidW5pdHMiLCBzdHJsZW4oInVuaXRzIikpKQorCQl2YWx1ZSA9IHNlbnNvcl9pbnN0LT5maWVsZHNbZmllbGRfaW5kZXhdLmF0dHJpYnV0ZS51bml0czsKKwllbHNlIGlmICghc3RybmNtcChuYW1lLCAidW5pdC1leHBvIiwgc3RybGVuKCJ1bml0LWV4cG8iKSkpCisJCXZhbHVlID0gc2Vuc29yX2luc3QtPmZpZWxkc1tmaWVsZF9pbmRleF0uYXR0cmlidXRlLnVuaXRfZXhwbzsKKwllbHNlIGlmICghc3RybmNtcChuYW1lLCAic2l6ZSIsIHN0cmxlbigic2l6ZSIpKSkKKwkJdmFsdWUgPSBzZW5zb3JfaW5zdC0+ZmllbGRzW2ZpZWxkX2luZGV4XS5hdHRyaWJ1dGUuc2l6ZTsKKwllbHNlIGlmICghc3RybmNtcChuYW1lLCAibWluaW11bSIsIHN0cmxlbigibWluaW11bSIpKSkKKwkJdmFsdWUgPSBzZW5zb3JfaW5zdC0+ZmllbGRzW2ZpZWxkX2luZGV4XS5hdHRyaWJ1dGUuCisJCQkJCQkJbG9naWNhbF9taW5pbXVtOworCWVsc2UgaWYgKCFzdHJuY21wKG5hbWUsICJtYXhpbXVtIiwgc3RybGVuKCJtYXhpbXVtIikpKQorCQl2YWx1ZSA9IHNlbnNvcl9pbnN0LT5maWVsZHNbZmllbGRfaW5kZXhdLmF0dHJpYnV0ZS4KKwkJCQkJCQlsb2dpY2FsX21heGltdW07CisJZWxzZSBpZiAoIXN0cm5jbXAobmFtZSwgIm5hbWUiLCBzdHJsZW4oIm5hbWUiKSkpIHsKKwkJc3RydWN0IGhpZF9jdXN0b21fdXNhZ2VfZGVzYyAqdXNhZ2VfZGVzYzsKKworCQl1c2FnZV9kZXNjID0gYnNlYXJjaCgmdXNhZ2UsIGhpZF9jdXN0b21fdXNhZ2VfZGVzY190YWJsZSwKKwkJCQkgICAgIEFSUkFZX1NJWkUoaGlkX2N1c3RvbV91c2FnZV9kZXNjX3RhYmxlKSwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgaGlkX2N1c3RvbV91c2FnZV9kZXNjKSwKKwkJCQkgICAgIHVzYWdlX2lkX2NtcCk7CisJCWlmICh1c2FnZV9kZXNjKQorCQkJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXNcbiIsCisJCQkJCXVzYWdlX2Rlc2MtPmRlc2MpOworCQllbHNlCisJCQlyZXR1cm4gc3ByaW50ZihidWYsICJub3Qtc3BlY2lmaWVkXG4iKTsKKwkgfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfdmFsdWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9jdXN0b20gKnNlbnNvcl9pbnN0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGluZGV4LCBmaWVsZF9pbmRleCwgdXNhZ2U7CisJY2hhciBuYW1lW0hJRF9DVVNUT01fTkFNRV9MRU5HVEhdOworCWludCB2YWx1ZTsKKworCWlmIChzc2NhbmYoYXR0ci0+YXR0ci5uYW1lLCAiZmVhdHVyZS0lZC0leC0lcyIsICZpbmRleCwgJnVzYWdlLAorCQkgICBuYW1lKSA9PSAzKSB7CisJCWZpZWxkX2luZGV4ID0gaW5kZXggKyBzZW5zb3JfaW5zdC0+aW5wdXRfZmllbGRfY291bnQ7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzdHJuY21wKG5hbWUsICJ2YWx1ZSIsIHN0cmxlbigidmFsdWUiKSkpIHsKKwkJdTMyIHJlcG9ydF9pZDsKKwkJaW50IHJldDsKKworCQlpZiAoa3N0cnRvaW50KGJ1ZiwgMCwgJnZhbHVlKSAhPSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmVwb3J0X2lkID0gc2Vuc29yX2luc3QtPmZpZWxkc1tmaWVsZF9pbmRleF0uYXR0cmlidXRlLgorCQkJCQkJCQlyZXBvcnRfaWQ7CisJCXJldCA9IHNlbnNvcl9odWJfc2V0X2ZlYXR1cmUoc2Vuc29yX2luc3QtPmhzZGV2LCByZXBvcnRfaWQsCisJCQkJCSAgICAgaW5kZXgsIHNpemVvZih2YWx1ZSksICZ2YWx1ZSk7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGhpZF9zZW5zb3JfY2FwdHVyZV9zYW1wbGUoc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJICB1bnNpZ25lZCB1c2FnZV9pZCwgc2l6ZV90IHJhd19sZW4sCisJCQkJICBjaGFyICpyYXdfZGF0YSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9jdXN0b20gKnNlbnNvcl9pbnN0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocHJpdik7CisJc3RydWN0IGhpZF9zZW5zb3Jfc2FtcGxlIGhlYWRlcjsKKworCS8qIElmIGFueSBlcnJvciBvY2N1cnMgaW4gYSBzYW1wbGUsIHJlc3Qgb2YgdGhlIGZpZWxkcyBhcmUgaWdub3JlZCAqLworCWlmIChzZW5zb3JfaW5zdC0+aW5wdXRfc2tpcF9zYW1wbGUpIHsKKwkJaGlkX2VycihzZW5zb3JfaW5zdC0+aHNkZXYtPmhkZXYsICJTa2lwcGVkIHJlbWFpbmluZyBkYXRhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaGlkX2RiZyhzZW5zb3JfaW5zdC0+aHNkZXYtPmhkZXYsICIlcyByZWNlaXZlZCAlZCBvZiAlZFxuIiwgX19mdW5jX18sCisJCShpbnQpIChzZW5zb3JfaW5zdC0+aW5wdXRfcmVwb3J0X3JlY2Rfc2l6ZSArIHJhd19sZW4pLAorCQlzZW5zb3JfaW5zdC0+aW5wdXRfcmVwb3J0X3NpemUpOworCisJaWYgKCF0ZXN0X2JpdCgwLCAmc2Vuc29yX2luc3QtPm1pc2Nfb3BlbmVkKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXNlbnNvcl9pbnN0LT5pbnB1dF9yZXBvcnRfcmVjZF9zaXplKSB7CisJCWludCByZXF1aXJlZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBoaWRfc2Vuc29yX3NhbXBsZSkgKworCQkJCQkJc2Vuc29yX2luc3QtPmlucHV0X3JlcG9ydF9zaXplOworCQloZWFkZXIudXNhZ2VfaWQgPSBoc2Rldi0+dXNhZ2U7CisJCWhlYWRlci5yYXdfbGVuID0gc2Vuc29yX2luc3QtPmlucHV0X3JlcG9ydF9zaXplOworCQloZWFkZXIudGltZXN0YW1wID0ga3RpbWVfZ2V0X3JlYWxfbnMoKTsKKwkJaWYgKGtmaWZvX2F2YWlsKCZzZW5zb3JfaW5zdC0+ZGF0YV9maWZvKSA+PSByZXF1aXJlZF9zaXplKSB7CisJCQlrZmlmb19pbigmc2Vuc29yX2luc3QtPmRhdGFfZmlmbywKKwkJCQkgKHVuc2lnbmVkIGNoYXIgKikmaGVhZGVyLAorCQkJCSBzaXplb2YoaGVhZGVyKSk7CisJCX0gZWxzZQorCQkJc2Vuc29yX2luc3QtPmlucHV0X3NraXBfc2FtcGxlID0gdHJ1ZTsKKwl9CisJaWYgKGtmaWZvX2F2YWlsKCZzZW5zb3JfaW5zdC0+ZGF0YV9maWZvKSA+PSByYXdfbGVuKQorCQlrZmlmb19pbigmc2Vuc29yX2luc3QtPmRhdGFfZmlmbywgKHVuc2lnbmVkIGNoYXIgKilyYXdfZGF0YSwKKwkJCSByYXdfbGVuKTsKKworCXNlbnNvcl9pbnN0LT5pbnB1dF9yZXBvcnRfcmVjZF9zaXplICs9IHJhd19sZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoaWRfc2Vuc29yX3NlbmRfZXZlbnQoc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsCisJCQkJIHVuc2lnbmVkIHVzYWdlX2lkLCB2b2lkICpwcml2KQoreworCXN0cnVjdCBoaWRfc2Vuc29yX2N1c3RvbSAqc2Vuc29yX2luc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwcml2KTsKKworCWlmICghdGVzdF9iaXQoMCwgJnNlbnNvcl9pbnN0LT5taXNjX29wZW5lZCkpCisJCXJldHVybiAwOworCisJc2Vuc29yX2luc3QtPmlucHV0X3JlcG9ydF9yZWNkX3NpemUgPSAwOworCXNlbnNvcl9pbnN0LT5pbnB1dF9za2lwX3NhbXBsZSA9IGZhbHNlOworCisJd2FrZV91cCgmc2Vuc29yX2luc3QtPndhaXQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGlkX3NlbnNvcl9jdXN0b21fYWRkX2ZpZWxkKHN0cnVjdCBoaWRfc2Vuc29yX2N1c3RvbSAqc2Vuc29yX2luc3QsCisJCQkJICAgICAgIGludCBpbmRleCwgaW50IHJlcG9ydF90eXBlLAorCQkJCSAgICAgICBzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0LAorCQkJCSAgICAgICBzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCkKK3sKKwlzdHJ1Y3QgaGlkX3NlbnNvcl9jdXN0b21fZmllbGQgKnNlbnNvcl9maWVsZDsKKwl2b2lkICpmaWVsZHM7CisKKwlmaWVsZHMgPSBrcmVhbGxvYyhzZW5zb3JfaW5zdC0+ZmllbGRzLAorCQkJICAoc2Vuc29yX2luc3QtPnNlbnNvcl9maWVsZF9jb3VudCArIDEpICoKKwkJCSAgIHNpemVvZihzdHJ1Y3QgaGlkX3NlbnNvcl9jdXN0b21fZmllbGQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpZWxkcykgeworCQlrZnJlZShzZW5zb3JfaW5zdC0+ZmllbGRzKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXNlbnNvcl9pbnN0LT5maWVsZHMgPSBmaWVsZHM7CisJc2Vuc29yX2ZpZWxkID0gJnNlbnNvcl9pbnN0LT5maWVsZHNbc2Vuc29yX2luc3QtPnNlbnNvcl9maWVsZF9jb3VudF07CisJc2Vuc29yX2ZpZWxkLT5hdHRyaWJ1dGUudXNhZ2VfaWQgPSBzZW5zb3JfaW5zdC0+aHNkZXYtPnVzYWdlOworCWlmIChmaWVsZC0+bG9naWNhbCkKKwkJc2Vuc29yX2ZpZWxkLT5hdHRyaWJ1dGUuYXR0cmliX2lkID0gZmllbGQtPmxvZ2ljYWw7CisJZWxzZQorCQlzZW5zb3JfZmllbGQtPmF0dHJpYnV0ZS5hdHRyaWJfaWQgPSBmaWVsZC0+dXNhZ2VbMF0uaGlkOworCisJc2Vuc29yX2ZpZWxkLT5hdHRyaWJ1dGUuaW5kZXggPSBpbmRleDsKKwlzZW5zb3JfZmllbGQtPmF0dHJpYnV0ZS5yZXBvcnRfaWQgPSByZXBvcnQtPmlkOworCXNlbnNvcl9maWVsZC0+YXR0cmlidXRlLnVuaXRzID0gZmllbGQtPnVuaXQ7CisJc2Vuc29yX2ZpZWxkLT5hdHRyaWJ1dGUudW5pdF9leHBvID0gZmllbGQtPnVuaXRfZXhwb25lbnQ7CisJc2Vuc29yX2ZpZWxkLT5hdHRyaWJ1dGUuc2l6ZSA9IChmaWVsZC0+cmVwb3J0X3NpemUgLyA4KTsKKwlzZW5zb3JfZmllbGQtPmF0dHJpYnV0ZS5sb2dpY2FsX21pbmltdW0gPSBmaWVsZC0+bG9naWNhbF9taW5pbXVtOworCXNlbnNvcl9maWVsZC0+YXR0cmlidXRlLmxvZ2ljYWxfbWF4aW11bSA9IGZpZWxkLT5sb2dpY2FsX21heGltdW07CisKKwlpZiAocmVwb3J0X3R5cGUgPT0gSElEX0ZFQVRVUkVfUkVQT1JUKQorCQlzbnByaW50ZihzZW5zb3JfZmllbGQtPmdyb3VwX25hbWUsCisJCQkgc2l6ZW9mKHNlbnNvcl9maWVsZC0+Z3JvdXBfbmFtZSksICJmZWF0dXJlLSV4LSV4IiwKKwkJCSBzZW5zb3JfZmllbGQtPmF0dHJpYnV0ZS5pbmRleCwKKwkJCSBzZW5zb3JfZmllbGQtPmF0dHJpYnV0ZS5hdHRyaWJfaWQpOworCWVsc2UgaWYgKHJlcG9ydF90eXBlID09IEhJRF9JTlBVVF9SRVBPUlQpIHsKKwkJc25wcmludGYoc2Vuc29yX2ZpZWxkLT5ncm91cF9uYW1lLAorCQkJIHNpemVvZihzZW5zb3JfZmllbGQtPmdyb3VwX25hbWUpLAorCQkJICJpbnB1dC0leC0leCIsIHNlbnNvcl9maWVsZC0+YXR0cmlidXRlLmluZGV4LAorCQkJIHNlbnNvcl9maWVsZC0+YXR0cmlidXRlLmF0dHJpYl9pZCk7CisJCXNlbnNvcl9pbnN0LT5pbnB1dF9maWVsZF9jb3VudCsrOworCQlzZW5zb3JfaW5zdC0+aW5wdXRfcmVwb3J0X3NpemUgKz0gKGZpZWxkLT5yZXBvcnRfc2l6ZSAqCisJCQkJCQkgICBmaWVsZC0+cmVwb3J0X2NvdW50KSAvIDg7CisJfQorCisJbWVtc2V0KCZzZW5zb3JfZmllbGQtPmhpZF9jdXN0b21fYXR0cmlidXRlX2dyb3VwLCAwLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGF0dHJpYnV0ZV9ncm91cCkpOworCXNlbnNvcl9pbnN0LT5zZW5zb3JfZmllbGRfY291bnQrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhpZF9zZW5zb3JfY3VzdG9tX2FkZF9maWVsZHMoc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tICpzZW5zb3JfaW5zdCwKKwkJCQkJc3RydWN0IGhpZF9yZXBvcnRfZW51bSAqcmVwb3J0X2VudW0sCisJCQkJCWludCByZXBvcnRfdHlwZSkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CisJc3RydWN0IGhpZF9maWVsZCAqZmllbGQ7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYgPSBzZW5zb3JfaW5zdC0+aHNkZXY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcG9ydCwgJnJlcG9ydF9lbnVtLT5yZXBvcnRfbGlzdCwgbGlzdCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcmVwb3J0LT5tYXhmaWVsZDsgKytpKSB7CisJCQlmaWVsZCA9IHJlcG9ydC0+ZmllbGRbaV07CisJCQlpZiAoZmllbGQtPm1heHVzYWdlICYmCisJCQkgICAgKChmaWVsZC0+dXNhZ2VbMF0uY29sbGVjdGlvbl9pbmRleCA+PQorCQkJICAgICAgaHNkZXYtPnN0YXJ0X2NvbGxlY3Rpb25faW5kZXgpICYmCisJCQkgICAgICAoZmllbGQtPnVzYWdlWzBdLmNvbGxlY3Rpb25faW5kZXggPAorCQkJICAgICAgIGhzZGV2LT5lbmRfY29sbGVjdGlvbl9pbmRleCkpKSB7CisKKwkJCQlyZXQgPSBoaWRfc2Vuc29yX2N1c3RvbV9hZGRfZmllbGQoc2Vuc29yX2luc3QsCisJCQkJCQkJCSAgaSwKKwkJCQkJCQkJICByZXBvcnRfdHlwZSwKKwkJCQkJCQkJICByZXBvcnQsCisJCQkJCQkJCSAgZmllbGQpOworCQkJCWlmIChyZXQpCisJCQkJCXJldHVybiByZXQ7CisKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhpZF9zZW5zb3JfY3VzdG9tX2FkZF9hdHRyaWJ1dGVzKHN0cnVjdCBoaWRfc2Vuc29yX2N1c3RvbQorCQkJCQkJCQkqc2Vuc29yX2luc3QpCit7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYgPSBzZW5zb3JfaW5zdC0+aHNkZXY7CisJc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYgPSBoc2Rldi0+aGRldjsKKwlpbnQgcmV0ID0gLTE7CisJaW50IGksIGo7CisKKwlmb3IgKGogPSAwOyBqIDwgSElEX1JFUE9SVF9UWVBFUzsgKytqKSB7CisJCWlmIChqID09IEhJRF9PVVRQVVRfUkVQT1JUKQorCQkJY29udGludWU7CisKKwkJcmV0ID0gaGlkX3NlbnNvcl9jdXN0b21fYWRkX2ZpZWxkcyhzZW5zb3JfaW5zdCwKKwkJCQkJCSAgICZoZGV2LT5yZXBvcnRfZW51bVtqXSwgaik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJfQorCisJLyogQ3JlYXRlIHN5c2ZzIGF0dHJpYnV0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2Vuc29yX2luc3QtPnNlbnNvcl9maWVsZF9jb3VudDsgKytpKSB7CisJCWogPSAwOworCQl3aGlsZSAoaiA8IEhJRF9DVVNUT01fVE9UQUxfQVRUUlMgJiYKKwkJICAgICAgIGhpZF9jdXN0b21fYXR0cnNbal0ubmFtZSkgeworCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmljZV9hdHRyOworCisJCQlkZXZpY2VfYXR0ciA9ICZzZW5zb3JfaW5zdC0+ZmllbGRzW2ldLnNkX2F0dHJzW2pdOworCisJCQlzbnByaW50ZigoY2hhciAqKSZzZW5zb3JfaW5zdC0+ZmllbGRzW2ldLmF0dHJfbmFtZVtqXSwKKwkJCQkgSElEX0NVU1RPTV9OQU1FX0xFTkdUSCwgIiVzLSVzIiwKKwkJCQkgc2Vuc29yX2luc3QtPmZpZWxkc1tpXS5ncm91cF9uYW1lLAorCQkJCSBoaWRfY3VzdG9tX2F0dHJzW2pdLm5hbWUpOworCQkJc3lzZnNfYXR0cl9pbml0KCZkZXZpY2VfYXR0ci0+YXR0cik7CisJCQlkZXZpY2VfYXR0ci0+YXR0ci5uYW1lID0KKwkJCQkoY2hhciAqKSZzZW5zb3JfaW5zdC0+ZmllbGRzW2ldLmF0dHJfbmFtZVtqXTsKKwkJCWRldmljZV9hdHRyLT5hdHRyLm1vZGUgPSBoaWRfY3VzdG9tX2F0dHJzW2pdLm1vZGU7CisJCQlkZXZpY2VfYXR0ci0+c2hvdyA9IHNob3dfdmFsdWU7CisJCQlpZiAoaGlkX2N1c3RvbV9hdHRyc1tqXS5tb2RlICYgU19JV1VTUikKKwkJCQlkZXZpY2VfYXR0ci0+c3RvcmUgPSBzdG9yZV92YWx1ZTsKKwkJCXNlbnNvcl9pbnN0LT5maWVsZHNbaV0uYXR0cnNbal0gPSAmZGV2aWNlX2F0dHItPmF0dHI7CisJCQkrK2o7CisJCX0KKwkJc2Vuc29yX2luc3QtPmZpZWxkc1tpXS5hdHRyc1tqXSA9IE5VTEw7CisJCXNlbnNvcl9pbnN0LT5maWVsZHNbaV0uaGlkX2N1c3RvbV9hdHRyaWJ1dGVfZ3JvdXAuYXR0cnMgPQorCQkJCQkJc2Vuc29yX2luc3QtPmZpZWxkc1tpXS5hdHRyczsKKwkJc2Vuc29yX2luc3QtPmZpZWxkc1tpXS5oaWRfY3VzdG9tX2F0dHJpYnV0ZV9ncm91cC5uYW1lID0KKwkJCQkJc2Vuc29yX2luc3QtPmZpZWxkc1tpXS5ncm91cF9uYW1lOworCQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnNlbnNvcl9pbnN0LT5wZGV2LT5kZXYua29iaiwKKwkJCQkJICZzZW5zb3JfaW5zdC0+ZmllbGRzW2ldLgorCQkJCQkgaGlkX2N1c3RvbV9hdHRyaWJ1dGVfZ3JvdXApOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJLyogRm9yIHBvd2VyIG9yIHJlcG9ydCBmaWVsZCBzdG9yZSBpbmRleGVzICovCisJCWlmIChzZW5zb3JfaW5zdC0+ZmllbGRzW2ldLmF0dHJpYnV0ZS5hdHRyaWJfaWQgPT0KKwkJCQkJSElEX1VTQUdFX1NFTlNPUl9QUk9ZX1BPV0VSX1NUQVRFKQorCQkJc2Vuc29yX2luc3QtPnBvd2VyX3N0YXRlID0gJnNlbnNvcl9pbnN0LT5maWVsZHNbaV07CisJCWVsc2UgaWYgKHNlbnNvcl9pbnN0LT5maWVsZHNbaV0uYXR0cmlidXRlLmF0dHJpYl9pZCA9PQorCQkJCQlISURfVVNBR0VfU0VOU09SX1BST1BfUkVQT1JUX1NUQVRFKQorCQkJc2Vuc29yX2luc3QtPnJlcG9ydF9zdGF0ZSA9ICZzZW5zb3JfaW5zdC0+ZmllbGRzW2ldOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhpZF9zZW5zb3JfY3VzdG9tX3JlbW92ZV9hdHRyaWJ1dGVzKHN0cnVjdCBoaWRfc2Vuc29yX2N1c3RvbSAqCisJCQkJCQkJCXNlbnNvcl9pbnN0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNlbnNvcl9pbnN0LT5zZW5zb3JfZmllbGRfY291bnQ7ICsraSkKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZW5zb3JfaW5zdC0+cGRldi0+ZGV2LmtvYmosCisJCQkJICAgJnNlbnNvcl9pbnN0LT5maWVsZHNbaV0uCisJCQkJICAgaGlkX2N1c3RvbV9hdHRyaWJ1dGVfZ3JvdXApOworCisJa2ZyZWUoc2Vuc29yX2luc3QtPmZpZWxkcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGhpZF9zZW5zb3JfY3VzdG9tX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKmZfcHMpCit7CisJc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tICpzZW5zb3JfaW5zdDsKKwl1bnNpZ25lZCBpbnQgY29waWVkOworCWludCByZXQ7CisKKwlzZW5zb3JfaW5zdCA9IGNvbnRhaW5lcl9vZihmaWxlLT5wcml2YXRlX2RhdGEsCisJCQkJICAgc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tLCBjdXN0b21fZGV2KTsKKworCWlmIChjb3VudCA8IHNpemVvZihzdHJ1Y3QgaGlkX3NlbnNvcl9zYW1wbGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvIHsKKwkJaWYgKGtmaWZvX2lzX2VtcHR5KCZzZW5zb3JfaW5zdC0+ZGF0YV9maWZvKSkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiAtRUFHQUlOOworCisJCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc2Vuc29yX2luc3QtPndhaXQsCisJCQkJIWtmaWZvX2lzX2VtcHR5KCZzZW5zb3JfaW5zdC0+ZGF0YV9maWZvKSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0ID0ga2ZpZm9fdG9fdXNlcigmc2Vuc29yX2luc3QtPmRhdGFfZmlmbywgYnVmLCBjb3VudCwKKwkJCQkgICAgJmNvcGllZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJfSB3aGlsZSAoY29waWVkID09IDApOworCisJcmV0dXJuIGNvcGllZDsKK30KKworc3RhdGljIGludCBoaWRfc2Vuc29yX2N1c3RvbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBoaWRfc2Vuc29yX2N1c3RvbSAqc2Vuc29yX2luc3Q7CisKKwlzZW5zb3JfaW5zdCA9IGNvbnRhaW5lcl9vZihmaWxlLT5wcml2YXRlX2RhdGEsCisJCQkJICAgc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tLCBjdXN0b21fZGV2KTsKKworCWNsZWFyX2JpdCgwLCAmc2Vuc29yX2luc3QtPm1pc2Nfb3BlbmVkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhpZF9zZW5zb3JfY3VzdG9tX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tICpzZW5zb3JfaW5zdDsKKworCXNlbnNvcl9pbnN0ID0gY29udGFpbmVyX29mKGZpbGUtPnByaXZhdGVfZGF0YSwKKwkJCQkgICBzdHJ1Y3QgaGlkX3NlbnNvcl9jdXN0b20sIGN1c3RvbV9kZXYpOworCS8qIFdlIGVzc2VudGlhbGx5IGhhdmUgc2luZ2xlIHJlYWRlciBhbmQgd3JpdGVyICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnNlbnNvcl9pbnN0LT5taXNjX29wZW5lZCkpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGlkX3NlbnNvcl9jdXN0b21fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBoaWRfc2Vuc29yX2N1c3RvbSAqc2Vuc29yX2luc3Q7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJc2Vuc29yX2luc3QgPSBjb250YWluZXJfb2YoZmlsZS0+cHJpdmF0ZV9kYXRhLAorCQkJCSAgIHN0cnVjdCBoaWRfc2Vuc29yX2N1c3RvbSwgY3VzdG9tX2Rldik7CisKKwlwb2xsX3dhaXQoZmlsZSwgJnNlbnNvcl9pbnN0LT53YWl0LCB3YWl0KTsKKworCWlmICgha2ZpZm9faXNfZW1wdHkoJnNlbnNvcl9pbnN0LT5kYXRhX2ZpZm8pKQorCQltYXNrID0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBoaWRfc2Vuc29yX2N1c3RvbV9mb3BzID0geworCS5vcGVuID0gIGhpZF9zZW5zb3JfY3VzdG9tX29wZW4sCisJLnJlYWQgPSAgaGlkX3NlbnNvcl9jdXN0b21fcmVhZCwKKwkucmVsZWFzZSA9IGhpZF9zZW5zb3JfY3VzdG9tX3JlbGVhc2UsCisJLnBvbGwgPSBoaWRfc2Vuc29yX2N1c3RvbV9wb2xsLAorCS5sbHNlZWsgPSBub29wX2xsc2VlaywKK307CisKK3N0YXRpYyBpbnQgaGlkX3NlbnNvcl9jdXN0b21fZGV2X2lmX2FkZChzdHJ1Y3QgaGlkX3NlbnNvcl9jdXN0b20gKnNlbnNvcl9pbnN0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBrZmlmb19hbGxvYygmc2Vuc29yX2luc3QtPmRhdGFfZmlmbywgSElEX0NVU1RPTV9GSUZPX1NJWkUsCisJCQkgIEdGUF9LRVJORUwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZW5zb3JfaW5zdC0+d2FpdCk7CisKKwlzZW5zb3JfaW5zdC0+Y3VzdG9tX2Rldi5taW5vciA9IE1JU0NfRFlOQU1JQ19NSU5PUjsKKwlzZW5zb3JfaW5zdC0+Y3VzdG9tX2Rldi5uYW1lID0gZGV2X25hbWUoJnNlbnNvcl9pbnN0LT5wZGV2LT5kZXYpOworCXNlbnNvcl9pbnN0LT5jdXN0b21fZGV2LmZvcHMgPSAmaGlkX3NlbnNvcl9jdXN0b21fZm9wcywKKwlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZzZW5zb3JfaW5zdC0+Y3VzdG9tX2Rldik7CisJaWYgKHJldCkgeworCQlrZmlmb19mcmVlKCZzZW5zb3JfaW5zdC0+ZGF0YV9maWZvKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhpZF9zZW5zb3JfY3VzdG9tX2Rldl9pZl9yZW1vdmUoc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tCisJCQkJCQkJCSpzZW5zb3JfaW5zdCkKK3sKKwl3YWtlX3VwKCZzZW5zb3JfaW5zdC0+d2FpdCk7CisJbWlzY19kZXJlZ2lzdGVyKCZzZW5zb3JfaW5zdC0+Y3VzdG9tX2Rldik7CisJa2ZpZm9fZnJlZSgmc2Vuc29yX2luc3QtPmRhdGFfZmlmbyk7CisKK30KKworc3RhdGljIGludCBoaWRfc2Vuc29yX2N1c3RvbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBoaWRfc2Vuc29yX2N1c3RvbSAqc2Vuc29yX2luc3Q7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0OworCisJc2Vuc29yX2luc3QgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpzZW5zb3JfaW5zdCksCisJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZW5zb3JfaW5zdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZW5zb3JfaW5zdC0+Y2FsbGJhY2tzLmNhcHR1cmVfc2FtcGxlID0gaGlkX3NlbnNvcl9jYXB0dXJlX3NhbXBsZTsKKwlzZW5zb3JfaW5zdC0+Y2FsbGJhY2tzLnNlbmRfZXZlbnQgPSBoaWRfc2Vuc29yX3NlbmRfZXZlbnQ7CisJc2Vuc29yX2luc3QtPmNhbGxiYWNrcy5wZGV2ID0gcGRldjsKKwlzZW5zb3JfaW5zdC0+aHNkZXYgPSBoc2RldjsKKwlzZW5zb3JfaW5zdC0+cGRldiA9IHBkZXY7CisJbXV0ZXhfaW5pdCgmc2Vuc29yX2luc3QtPm11dGV4KTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzZW5zb3JfaW5zdCk7CisJcmV0ID0gc2Vuc29yX2h1Yl9yZWdpc3Rlcl9jYWxsYmFjayhoc2RldiwgaHNkZXYtPnVzYWdlLAorCQkJCQkgICAmc2Vuc29yX2luc3QtPmNhbGxiYWNrcyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FsbGJhY2sgcmVnIGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzZW5zb3JfaW5zdC0+cGRldi0+ZGV2LmtvYmosCisJCQkJICZlbmFibGVfc2Vuc29yX2F0dHJfZ3JvdXApOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JlbW92ZV9jYWxsYmFjazsKKworCXJldCA9IGhpZF9zZW5zb3JfY3VzdG9tX2FkZF9hdHRyaWJ1dGVzKHNlbnNvcl9pbnN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZW1vdmVfZ3JvdXA7CisKKwlyZXQgPSBoaWRfc2Vuc29yX2N1c3RvbV9kZXZfaWZfYWRkKHNlbnNvcl9pbnN0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZW1vdmVfYXR0cmlidXRlczsKKworCXJldHVybiAwOworCitlcnJfcmVtb3ZlX2F0dHJpYnV0ZXM6CisJaGlkX3NlbnNvcl9jdXN0b21fcmVtb3ZlX2F0dHJpYnV0ZXMoc2Vuc29yX2luc3QpOworZXJyX3JlbW92ZV9ncm91cDoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJnNlbnNvcl9pbnN0LT5wZGV2LT5kZXYua29iaiwKKwkJCSAgICZlbmFibGVfc2Vuc29yX2F0dHJfZ3JvdXApOworZXJyX3JlbW92ZV9jYWxsYmFjazoKKwlzZW5zb3JfaHViX3JlbW92ZV9jYWxsYmFjayhoc2RldiwgaHNkZXYtPnVzYWdlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGlkX3NlbnNvcl9jdXN0b21fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGhpZF9zZW5zb3JfY3VzdG9tICpzZW5zb3JfaW5zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwloaWRfc2Vuc29yX2N1c3RvbV9kZXZfaWZfcmVtb3ZlKHNlbnNvcl9pbnN0KTsKKwloaWRfc2Vuc29yX2N1c3RvbV9yZW1vdmVfYXR0cmlidXRlcyhzZW5zb3JfaW5zdCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZzZW5zb3JfaW5zdC0+cGRldi0+ZGV2LmtvYmosCisJCQkgICAmZW5hYmxlX3NlbnNvcl9hdHRyX2dyb3VwKTsKKwlzZW5zb3JfaHViX3JlbW92ZV9jYWxsYmFjayhoc2RldiwgaHNkZXYtPnVzYWdlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBoaWRfc2Vuc29yX2N1c3RvbV9pZHNbXSA9IHsKKwl7CisJCS5uYW1lID0gIkhJRC1TRU5TT1ItMjAwMGUxIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiSElELVNFTlNPUi0yMDAwZTIiLAorCX0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgaGlkX3NlbnNvcl9jdXN0b21faWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGlkX3NlbnNvcl9jdXN0b21fcGxhdGZvcm1fZHJpdmVyID0geworCS5pZF90YWJsZSA9IGhpZF9zZW5zb3JfY3VzdG9tX2lkcywKKwkuZHJpdmVyID0geworCQkubmFtZQk9IEtCVUlMRF9NT0ROQU1FLAorCX0sCisJLnByb2JlCQk9IGhpZF9zZW5zb3JfY3VzdG9tX3Byb2JlLAorCS5yZW1vdmUJCT0gaGlkX3NlbnNvcl9jdXN0b21fcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaGlkX3NlbnNvcl9jdXN0b21fcGxhdGZvcm1fZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJISUQgU2Vuc29yIEN1c3RvbSBhbmQgR2VuZXJpYyBzZW5zb3IgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTcmluaXZhcyBQYW5kcnV2YWRhIDxzcmluaXZhcy5wYW5kcnV2YWRhQGxpbnV4LmludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zZW5zb3ItaHViLmMgYi9kcml2ZXJzL2hpZC9oaWQtc2Vuc29yLWh1Yi5jCmluZGV4IGU1NGNlMTAuLmMzZjZmMWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtc2Vuc29yLWh1Yi5jCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1zZW5zb3ItaHViLmMKQEAgLTI5LDI5ICsyOSwxMCBAQAogI2RlZmluZSBISURfU0VOU09SX0hVQl9FTlVNX1FVSVJLCTB4MDEKIAogLyoqCi0gKiBzdHJ1Y3Qgc2Vuc29yX2h1Yl9wZW5kaW5nIC0gU3luY2hyb25vdXMgcmVhZCBwZW5kaW5nIGluZm9ybWF0aW9uCi0gKiBAc3RhdHVzOgkJUGVuZGluZyBzdGF0dXMgdHJ1ZS9mYWxzZS4KLSAqIEByZWFkeToJCUNvbXBsZXRpb24gc3luY2hyb25pemF0aW9uIGRhdGEuCi0gKiBAdXNhZ2VfaWQ6CQlVc2FnZSBpZCBmb3IgcGh5c2ljYWwgZGV2aWNlLCBFLmcuIEd5cm8gdXNhZ2UgaWQuCi0gKiBAYXR0cl91c2FnZV9pZDoJVXNhZ2UgSWQgb2YgYSBmaWVsZCwgRS5nLiBYLUFYSVMgZm9yIGEgZ3lyby4KLSAqIEByYXdfc2l6ZToJCVJlc3BvbnNlIHNpemUgZm9yIGEgcmVhZCByZXF1ZXN0LgotICogQHJhd19kYXRhOgkJUGxhY2UgaG9sZGVyIGZvciByZWNlaXZlZCByZXNwb25zZS4KLSAqLwotc3RydWN0IHNlbnNvcl9odWJfcGVuZGluZyB7Ci0JYm9vbCBzdGF0dXM7Ci0Jc3RydWN0IGNvbXBsZXRpb24gcmVhZHk7Ci0JdTMyIHVzYWdlX2lkOwotCXUzMiBhdHRyX3VzYWdlX2lkOwotCWludCByYXdfc2l6ZTsKLQl1OCAgKnJhd19kYXRhOwotfTsKLQotLyoqCiAgKiBzdHJ1Y3Qgc2Vuc29yX2h1Yl9kYXRhIC0gSG9sZCBhIGluc3RhbmNlIGRhdGEgZm9yIGEgSElEIGh1YiBkZXZpY2UKICAqIEBoc2RldjoJCVN0b3JlZCBoaWQgaW5zdGFuY2UgZm9yIGN1cnJlbnQgaHViIGRldmljZS4KICAqIEBtdXRleDoJCU11dGV4IHRvIHNlcmlhbGl6ZSBzeW5jaHJvbm91cyByZXF1ZXN0LgogICogQGxvY2s6CQlTcGluIGxvY2sgdG8gcHJvdGVjdCBwZW5kaW5nIHJlcXVlc3Qgc3RydWN0dXJlLgotICogQHBlbmRpbmc6CQlIb2xkcyBpbmZvcm1hdGlvbiBvZiBwZW5kaW5nIHN5bmMgcmVhZCByZXF1ZXN0LgogICogQGR5bl9jYWxsYmFja19saXN0OglIb2xkcyBjYWxsYmFjayBmdW5jdGlvbgogICogQGR5bl9jYWxsYmFja19sb2NrOglzcGluIGxvY2sgdG8gcHJvdGVjdCBjYWxsYmFjayBsaXN0CiAgKiBAaGlkX3NlbnNvcl9odWJfY2xpZW50X2RldnM6CVN0b3JlcyBhbGwgTUZEIGNlbGxzIGZvciBhIGh1YiBpbnN0YW5jZS4KQEAgLTYxLDcgKzQyLDYgQEAKIHN0cnVjdCBzZW5zb3JfaHViX2RhdGEgewogCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IHNlbnNvcl9odWJfcGVuZGluZyBwZW5kaW5nOwogCXN0cnVjdCBsaXN0X2hlYWQgZHluX2NhbGxiYWNrX2xpc3Q7CiAJc3BpbmxvY2tfdCBkeW5fY2FsbGJhY2tfbG9jazsKIAlzdHJ1Y3QgbWZkX2NlbGwgKmhpZF9zZW5zb3JfaHViX2NsaWVudF9kZXZzOwpAQCAtMTA2LDcgKzg2LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBoZGV2LT5tYXhjb2xsZWN0aW9uOyArK2kpIHsKIAkJc3RydWN0IGhpZF9jb2xsZWN0aW9uICpjb2xsZWN0aW9uID0gJmhkZXYtPmNvbGxlY3Rpb25baV07Ci0JCWlmIChjb2xsZWN0aW9uLT50eXBlID09IEhJRF9DT0xMRUNUSU9OX1BIWVNJQ0FMKQorCQlpZiAoY29sbGVjdGlvbi0+dHlwZSA9PSBISURfQ09MTEVDVElPTl9QSFlTSUNBTCB8fAorCQkgICAgY29sbGVjdGlvbi0+dHlwZSA9PSBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTikKIAkJCSsrY291bnQ7CiAJfQogCkBAIC0xMzksNyArMTIwLDggQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwZGF0YS0+ZHluX2NhbGxiYWNrX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGxiYWNrLCAmcGRhdGEtPmR5bl9jYWxsYmFja19saXN0LCBsaXN0KQotCQlpZiAoY2FsbGJhY2stPnVzYWdlX2lkID09IHVzYWdlX2lkICYmCisJCWlmICgoY2FsbGJhY2stPnVzYWdlX2lkID09IHVzYWdlX2lkIHx8CisJCSAgICAgY2FsbGJhY2stPnVzYWdlX2lkID09IEhJRF9VU0FHRV9TRU5TT1JfQ09MTEVDVElPTikgJiYKIAkJCShjb2xsZWN0aW9uX2luZGV4ID49CiAJCQkJY2FsbGJhY2stPmhzZGV2LT5zdGFydF9jb2xsZWN0aW9uX2luZGV4KSAmJgogCQkJKGNvbGxlY3Rpb25faW5kZXggPApAQCAtMTc5LDcgKzE2MSwxOCBAQAogCWNhbGxiYWNrLT51c2FnZV9jYWxsYmFjayA9IHVzYWdlX2NhbGxiYWNrOwogCWNhbGxiYWNrLT51c2FnZV9pZCA9IHVzYWdlX2lkOwogCWNhbGxiYWNrLT5wcml2ID0gTlVMTDsKLQlsaXN0X2FkZF90YWlsKCZjYWxsYmFjay0+bGlzdCwgJnBkYXRhLT5keW5fY2FsbGJhY2tfbGlzdCk7CisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIGNvbGxlY3Rpb24gdHlwZSwgdGhlbgorCSAqIGl0IHdpbGwgaGFuZGxlIGFsbCByZXBvcnRzIGZvciBzZW5zb3JzIGluIHRoaXMgY29sbGVjdGlvbi4gSWYKKwkgKiB0aGVyZSBpcyBhbHNvIGFuIGluZGl2aWR1YWwgc2Vuc29yIGhhbmRsZXIgcmVnaXN0cmF0aW9uLCB0aGVuCisJICogd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcmVwb3J0cyBhcmUgZGlyZWN0ZWQgdG8gY29sbGVjdGlvbgorCSAqIGhhbmRsZXIsIGFzIHRoaXMgbWF5IGJlIGEgZnVzaW9uIHNlbnNvci4gU28gYWRkIGNvbGxlY3Rpb24gaGFuZGxlcnMKKwkgKiB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LCBzbyB0aGF0IHRoZXkgYXJlIG1hdGNoZWQgZmlyc3QuCisJICovCisJaWYgKHVzYWdlX2lkID09IEhJRF9VU0FHRV9TRU5TT1JfQ09MTEVDVElPTikKKwkJbGlzdF9hZGQoJmNhbGxiYWNrLT5saXN0LCAmcGRhdGEtPmR5bl9jYWxsYmFja19saXN0KTsKKwllbHNlCisJCWxpc3RfYWRkX3RhaWwoJmNhbGxiYWNrLT5saXN0LCAmcGRhdGEtPmR5bl9jYWxsYmFja19saXN0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGF0YS0+ZHluX2NhbGxiYWNrX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwpAQCAtMjA4LDEwICsyMDEsMTQgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHNlbnNvcl9odWJfcmVtb3ZlX2NhbGxiYWNrKTsKIAogaW50IHNlbnNvcl9odWJfc2V0X2ZlYXR1cmUoc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXYsIHUzMiByZXBvcnRfaWQsCi0JCQkJdTMyIGZpZWxkX2luZGV4LCBzMzIgdmFsdWUpCisJCQkgICB1MzIgZmllbGRfaW5kZXgsIGludCBidWZmZXJfc2l6ZSwgdm9pZCAqYnVmZmVyKQogewogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CiAJc3RydWN0IHNlbnNvcl9odWJfZGF0YSAqZGF0YSA9IGhpZF9nZXRfZHJ2ZGF0YShoc2Rldi0+aGRldik7CisJX19zMzIgKmJ1ZjMyID0gYnVmZmVyOworCWludCBpID0gMDsKKwlpbnQgcmVtYWluaW5nX2J5dGVzOworCV9fczMyIHZhbHVlOwogCWludCByZXQgPSAwOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOwpAQCAtMjIwLDcgKzIxNywyMSBAQAogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmVfcHJvYzsKIAl9Ci0JaGlkX3NldF9maWVsZChyZXBvcnQtPmZpZWxkW2ZpZWxkX2luZGV4XSwgMCwgdmFsdWUpOworCisJcmVtYWluaW5nX2J5dGVzID0gZG9fZGl2KGJ1ZmZlcl9zaXplLCBzaXplb2YoX19zMzIpKTsKKwlpZiAoYnVmZmVyX3NpemUpIHsKKwkJZm9yIChpID0gMDsgaSA8IGJ1ZmZlcl9zaXplOyArK2kpIHsKKwkJCWhpZF9zZXRfZmllbGQocmVwb3J0LT5maWVsZFtmaWVsZF9pbmRleF0sIGksCisJCQkJICAgICAgKF9fZm9yY2UgX19zMzIpY3B1X3RvX2xlMzIoKmJ1ZjMyKSk7CisJCQkrK2J1ZjMyOworCQl9CisJfQorCWlmIChyZW1haW5pbmdfYnl0ZXMpIHsKKwkJdmFsdWUgPSAwOworCQltZW1jcHkoJnZhbHVlLCAodTggKilidWYzMiwgcmVtYWluaW5nX2J5dGVzKTsKKwkJaGlkX3NldF9maWVsZChyZXBvcnQtPmZpZWxkW2ZpZWxkX2luZGV4XSwgaSwKKwkJCSAgICAgIChfX2ZvcmNlIF9fczMyKWNwdV90b19sZTMyKHZhbHVlKSk7CisJfQogCWhpZF9od19yZXF1ZXN0KGhzZGV2LT5oZGV2LCByZXBvcnQsIEhJRF9SRVFfU0VUX1JFUE9SVCk7CiAJaGlkX2h3X3dhaXQoaHNkZXYtPmhkZXYpOwogCkBAIC0yMzIsMTAgKzI0MywxMSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc2Vuc29yX2h1Yl9zZXRfZmVhdHVyZSk7CiAKIGludCBzZW5zb3JfaHViX2dldF9mZWF0dXJlKHN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2LCB1MzIgcmVwb3J0X2lkLAotCQkJCXUzMiBmaWVsZF9pbmRleCwgczMyICp2YWx1ZSkKKwkJCSAgIHUzMiBmaWVsZF9pbmRleCwgaW50IGJ1ZmZlcl9zaXplLCB2b2lkICpidWZmZXIpCiB7CiAJc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydDsKIAlzdHJ1Y3Qgc2Vuc29yX2h1Yl9kYXRhICpkYXRhID0gaGlkX2dldF9kcnZkYXRhKGhzZGV2LT5oZGV2KTsKKwlpbnQgcmVwb3J0X3NpemU7CiAJaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CkBAIC0yNDcsNyArMjU5LDE3IEBACiAJfQogCWhpZF9od19yZXF1ZXN0KGhzZGV2LT5oZGV2LCByZXBvcnQsIEhJRF9SRVFfR0VUX1JFUE9SVCk7CiAJaGlkX2h3X3dhaXQoaHNkZXYtPmhkZXYpOwotCSp2YWx1ZSA9IHJlcG9ydC0+ZmllbGRbZmllbGRfaW5kZXhdLT52YWx1ZVswXTsKKworCS8qIGNhbGN1bGF0ZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gcmVhZCB0aGlzIGZpZWxkICovCisJcmVwb3J0X3NpemUgPSBESVZfUk9VTkRfVVAocmVwb3J0LT5maWVsZFtmaWVsZF9pbmRleF0tPnJlcG9ydF9zaXplLAorCQkJCSAgIDgpICoKKwkJCQkgICByZXBvcnQtPmZpZWxkW2ZpZWxkX2luZGV4XS0+cmVwb3J0X2NvdW50OworCWlmICghcmVwb3J0X3NpemUpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBkb25lX3Byb2M7CisJfQorCXJldCA9IG1pbihyZXBvcnRfc2l6ZSwgYnVmZmVyX3NpemUpOworCW1lbWNweShidWZmZXIsIHJlcG9ydC0+ZmllbGRbZmllbGRfaW5kZXhdLT52YWx1ZSwgcmV0KTsKIAogZG9uZV9wcm9jOgogCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOwpAQCAtMjU5LDQ3ICsyODEsNTQgQEAKIAogaW50IHNlbnNvcl9odWJfaW5wdXRfYXR0cl9nZXRfcmF3X3ZhbHVlKHN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2LAogCQkJCQl1MzIgdXNhZ2VfaWQsCi0JCQkJCXUzMiBhdHRyX3VzYWdlX2lkLCB1MzIgcmVwb3J0X2lkKQorCQkJCQl1MzIgYXR0cl91c2FnZV9pZCwgdTMyIHJlcG9ydF9pZCwKKwkJCQkJZW51bSBzZW5zb3JfaHViX3JlYWRfZmxhZ3MgZmxhZykKIHsKIAlzdHJ1Y3Qgc2Vuc29yX2h1Yl9kYXRhICpkYXRhID0gaGlkX2dldF9kcnZkYXRhKGhzZGV2LT5oZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQ7CiAJaW50IHJldF92YWwgPSAwOwogCi0JbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOwotCW1lbXNldCgmZGF0YS0+cGVuZGluZywgMCwgc2l6ZW9mKGRhdGEtPnBlbmRpbmcpKTsKLQlpbml0X2NvbXBsZXRpb24oJmRhdGEtPnBlbmRpbmcucmVhZHkpOwotCWRhdGEtPnBlbmRpbmcudXNhZ2VfaWQgPSB1c2FnZV9pZDsKLQlkYXRhLT5wZW5kaW5nLmF0dHJfdXNhZ2VfaWQgPSBhdHRyX3VzYWdlX2lkOwotCWRhdGEtPnBlbmRpbmcucmF3X3NpemUgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKLQlkYXRhLT5wZW5kaW5nLnN0YXR1cyA9IHRydWU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+bG9jaywgZmxhZ3MpOwotCXJlcG9ydCA9IHNlbnNvcl9odWJfcmVwb3J0KHJlcG9ydF9pZCwgaHNkZXYtPmhkZXYsIEhJRF9JTlBVVF9SRVBPUlQpOworCXJlcG9ydCA9IHNlbnNvcl9odWJfcmVwb3J0KHJlcG9ydF9pZCwgaHNkZXYtPmhkZXYsCisJCQkJICAgSElEX0lOUFVUX1JFUE9SVCk7CiAJaWYgKCFyZXBvcnQpCi0JCWdvdG8gZXJyX2ZyZWU7CisJCXJldHVybiAtRUlOVkFMOwogCi0JaGlkX2h3X3JlcXVlc3QoaHNkZXYtPmhkZXYsIHJlcG9ydCwgSElEX1JFUV9HRVRfUkVQT1JUKTsKLQl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmZGF0YS0+cGVuZGluZy5yZWFkeSwgSFoqNSk7Ci0Jc3dpdGNoIChkYXRhLT5wZW5kaW5nLnJhd19zaXplKSB7Ci0JY2FzZSAxOgotCQlyZXRfdmFsID0gKih1OCAqKWRhdGEtPnBlbmRpbmcucmF3X2RhdGE7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJcmV0X3ZhbCA9ICoodTE2ICopZGF0YS0+cGVuZGluZy5yYXdfZGF0YTsKLQkJYnJlYWs7Ci0JY2FzZSA0OgotCQlyZXRfdmFsID0gKih1MzIgKilkYXRhLT5wZW5kaW5nLnJhd19kYXRhOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXRfdmFsID0gMDsKKwltdXRleF9sb2NrKCZoc2Rldi0+bXV0ZXgpOworCWlmIChmbGFnID09IFNFTlNPUl9IVUJfU1lOQykgeworCQltZW1zZXQoJmhzZGV2LT5wZW5kaW5nLCAwLCBzaXplb2YoaHNkZXYtPnBlbmRpbmcpKTsKKwkJaW5pdF9jb21wbGV0aW9uKCZoc2Rldi0+cGVuZGluZy5yZWFkeSk7CisJCWhzZGV2LT5wZW5kaW5nLnVzYWdlX2lkID0gdXNhZ2VfaWQ7CisJCWhzZGV2LT5wZW5kaW5nLmF0dHJfdXNhZ2VfaWQgPSBhdHRyX3VzYWdlX2lkOworCQloc2Rldi0+cGVuZGluZy5yYXdfc2l6ZSA9IDA7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhdGEtPmxvY2ssIGZsYWdzKTsKKwkJaHNkZXYtPnBlbmRpbmcuc3RhdHVzID0gdHJ1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+bG9jaywgZmxhZ3MpOwogCX0KLQlrZnJlZShkYXRhLT5wZW5kaW5nLnJhd19kYXRhKTsKLQotZXJyX2ZyZWU6Ci0JZGF0YS0+cGVuZGluZy5zdGF0dXMgPSBmYWxzZTsKKwltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CisJaGlkX2h3X3JlcXVlc3QoaHNkZXYtPmhkZXYsIHJlcG9ydCwgSElEX1JFUV9HRVRfUkVQT1JUKTsKIAltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKKwlpZiAoZmxhZyA9PSBTRU5TT1JfSFVCX1NZTkMpIHsKKwkJd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCisJCQkJCQkmaHNkZXYtPnBlbmRpbmcucmVhZHksIEhaKjUpOworCQlzd2l0Y2ggKGhzZGV2LT5wZW5kaW5nLnJhd19zaXplKSB7CisJCWNhc2UgMToKKwkJCXJldF92YWwgPSAqKHU4ICopaHNkZXYtPnBlbmRpbmcucmF3X2RhdGE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcmV0X3ZhbCA9ICoodTE2ICopaHNkZXYtPnBlbmRpbmcucmF3X2RhdGE7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJcmV0X3ZhbCA9ICoodTMyICopaHNkZXYtPnBlbmRpbmcucmF3X2RhdGE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldF92YWwgPSAwOworCQl9CisJCWtmcmVlKGhzZGV2LT5wZW5kaW5nLnJhd19kYXRhKTsKKwkJaHNkZXYtPnBlbmRpbmcuc3RhdHVzID0gZmFsc2U7CisJfQorCW11dGV4X3VubG9jaygmaHNkZXYtPm11dGV4KTsKIAogCXJldHVybiByZXRfdmFsOwogfQpAQCAtNDU1LDE2ICs0ODQsNiBAQAogCQkJCQlyZXBvcnQtPmZpZWxkW2ldLT5yZXBvcnRfY291bnQpLzgpOwogCQlzeiA9IChyZXBvcnQtPmZpZWxkW2ldLT5yZXBvcnRfc2l6ZSAqCiAJCQkJCXJlcG9ydC0+ZmllbGRbaV0tPnJlcG9ydF9jb3VudCkvODsKLQkJaWYgKHBkYXRhLT5wZW5kaW5nLnN0YXR1cyAmJiBwZGF0YS0+cGVuZGluZy5hdHRyX3VzYWdlX2lkID09Ci0JCQkJcmVwb3J0LT5maWVsZFtpXS0+dXNhZ2UtPmhpZCkgewotCQkJaGlkX2RiZyhoZGV2LCAiZGF0YSB3YXMgcGVuZGluZyAuLi5cbiIpOwotCQkJcGRhdGEtPnBlbmRpbmcucmF3X2RhdGEgPSBrbWVtZHVwKHB0ciwgc3osIEdGUF9BVE9NSUMpOwotCQkJaWYgKHBkYXRhLT5wZW5kaW5nLnJhd19kYXRhKQotCQkJCXBkYXRhLT5wZW5kaW5nLnJhd19zaXplID0gc3o7Ci0JCQllbHNlCi0JCQkJcGRhdGEtPnBlbmRpbmcucmF3X3NpemUgPSAwOwotCQkJY29tcGxldGUoJnBkYXRhLT5wZW5kaW5nLnJlYWR5KTsKLQkJfQogCQljb2xsZWN0aW9uID0gJmhkZXYtPmNvbGxlY3Rpb25bCiAJCQkJcmVwb3J0LT5maWVsZFtpXS0+dXNhZ2UtPmNvbGxlY3Rpb25faW5kZXhdOwogCQloaWRfZGJnKGhkZXYsICJjb2xsZWN0aW9uLT51c2FnZSAleFxuIiwKQEAgLTQ3NCw4ICs0OTMsMjMgQEAKIAkJCQlyZXBvcnQtPmZpZWxkW2ldLT5waHlzaWNhbCwKIAkJCQlyZXBvcnQtPmZpZWxkW2ldLT51c2FnZVswXS5jb2xsZWN0aW9uX2luZGV4LAogCQkJCSZoc2RldiwgJnByaXYpOwotCi0JCWlmIChjYWxsYmFjayAmJiBjYWxsYmFjay0+Y2FwdHVyZV9zYW1wbGUpIHsKKwkJaWYgKCFjYWxsYmFjaykgeworCQkJcHRyICs9IHN6OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGhzZGV2LT5wZW5kaW5nLnN0YXR1cyAmJiAoaHNkZXYtPnBlbmRpbmcuYXR0cl91c2FnZV9pZCA9PQorCQkJCQkgICAgICByZXBvcnQtPmZpZWxkW2ldLT51c2FnZS0+aGlkIHx8CisJCQkJCSAgICAgIGhzZGV2LT5wZW5kaW5nLmF0dHJfdXNhZ2VfaWQgPT0KKwkJCQkJICAgICAgcmVwb3J0LT5maWVsZFtpXS0+bG9naWNhbCkpIHsKKwkJCWhpZF9kYmcoaGRldiwgImRhdGEgd2FzIHBlbmRpbmcgLi4uXG4iKTsKKwkJCWhzZGV2LT5wZW5kaW5nLnJhd19kYXRhID0ga21lbWR1cChwdHIsIHN6LCBHRlBfQVRPTUlDKTsKKwkJCWlmIChoc2Rldi0+cGVuZGluZy5yYXdfZGF0YSkKKwkJCQloc2Rldi0+cGVuZGluZy5yYXdfc2l6ZSA9IHN6OworCQkJZWxzZQorCQkJCWhzZGV2LT5wZW5kaW5nLnJhd19zaXplID0gMDsKKwkJCWNvbXBsZXRlKCZoc2Rldi0+cGVuZGluZy5yZWFkeSk7CisJCX0KKwkJaWYgKGNhbGxiYWNrLT5jYXB0dXJlX3NhbXBsZSkgewogCQkJaWYgKHJlcG9ydC0+ZmllbGRbaV0tPmxvZ2ljYWwpCiAJCQkJY2FsbGJhY2stPmNhcHR1cmVfc2FtcGxlKGhzZGV2LAogCQkJCQlyZXBvcnQtPmZpZWxkW2ldLT5sb2dpY2FsLCBzeiwgcHRyLApAQCAtNTcyLDYgKzYwNiw3IEBACiAJaW50IGRldl9jbnQ7CiAJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqaHNkZXY7CiAJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqbGFzdF9oc2RldiA9IE5VTEw7CisJc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAqY29sbGVjdGlvbl9oc2RldiA9IE5VTEw7CiAKIAlzZCA9IGRldm1fa3phbGxvYygmaGRldi0+ZGV2LCBzaXplb2YoKnNkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZCkgewpAQCAtNjE4LDcgKzY1Myw4IEBACiAJZm9yIChpID0gMDsgaSA8IGhkZXYtPm1heGNvbGxlY3Rpb247ICsraSkgewogCQlzdHJ1Y3QgaGlkX2NvbGxlY3Rpb24gKmNvbGxlY3Rpb24gPSAmaGRldi0+Y29sbGVjdGlvbltpXTsKIAotCQlpZiAoY29sbGVjdGlvbi0+dHlwZSA9PSBISURfQ09MTEVDVElPTl9QSFlTSUNBTCkgeworCQlpZiAoY29sbGVjdGlvbi0+dHlwZSA9PSBISURfQ09MTEVDVElPTl9QSFlTSUNBTCB8fAorCQkgICAgY29sbGVjdGlvbi0+dHlwZSA9PSBISURfQ09MTEVDVElPTl9BUFBMSUNBVElPTikgewogCiAJCQloc2RldiA9IGRldm1fa3phbGxvYygmaGRldi0+ZGV2LCBzaXplb2YoKmhzZGV2KSwKIAkJCQkJICAgICBHRlBfS0VSTkVMKTsKQEAgLTYzMCw2ICs2NjYsOCBAQAogCQkJaHNkZXYtPmhkZXYgPSBoZGV2OwogCQkJaHNkZXYtPnZlbmRvcl9pZCA9IGhkZXYtPnZlbmRvcjsKIAkJCWhzZGV2LT5wcm9kdWN0X2lkID0gaGRldi0+cHJvZHVjdDsKKwkJCWhzZGV2LT51c2FnZSA9IGNvbGxlY3Rpb24tPnVzYWdlOworCQkJbXV0ZXhfaW5pdCgmaHNkZXYtPm11dGV4KTsKIAkJCWhzZGV2LT5zdGFydF9jb2xsZWN0aW9uX2luZGV4ID0gaTsKIAkJCWlmIChsYXN0X2hzZGV2KQogCQkJCWxhc3RfaHNkZXYtPmVuZF9jb2xsZWN0aW9uX2luZGV4ID0gaTsKQEAgLTY1MywxMCArNjkxLDE3IEBACiAJCQloaWRfZGJnKGhkZXYsICJBZGRpbmcgJXM6JWRcbiIsIG5hbWUsCiAJCQkJCWhzZGV2LT5zdGFydF9jb2xsZWN0aW9uX2luZGV4KTsKIAkJCXNkLT5oaWRfc2Vuc29yX2NsaWVudF9jbnQrKzsKKwkJCWlmIChjb2xsZWN0aW9uX2hzZGV2KQorCQkJCWNvbGxlY3Rpb25faHNkZXYtPmVuZF9jb2xsZWN0aW9uX2luZGV4ID0gaTsKKwkJCWlmIChjb2xsZWN0aW9uLT50eXBlID09IEhJRF9DT0xMRUNUSU9OX0FQUExJQ0FUSU9OICYmCisJCQkgICAgY29sbGVjdGlvbi0+dXNhZ2UgPT0gSElEX1VTQUdFX1NFTlNPUl9DT0xMRUNUSU9OKQorCQkJCWNvbGxlY3Rpb25faHNkZXYgPSBoc2RldjsKIAkJfQogCX0KIAlpZiAobGFzdF9oc2RldikKIAkJbGFzdF9oc2Rldi0+ZW5kX2NvbGxlY3Rpb25faW5kZXggPSBpOworCWlmIChjb2xsZWN0aW9uX2hzZGV2KQorCQljb2xsZWN0aW9uX2hzZGV2LT5lbmRfY29sbGVjdGlvbl9pbmRleCA9IGk7CiAKIAlyZXQgPSBtZmRfYWRkX2hvdHBsdWdfZGV2aWNlcygmaGRldi0+ZGV2LAogCQkJc2QtPmhpZF9zZW5zb3JfaHViX2NsaWVudF9kZXZzLApAQCAtNjc2LDEzICs3MjEsMTggQEAKIHsKIAlzdHJ1Y3Qgc2Vuc29yX2h1Yl9kYXRhICpkYXRhID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CiAKIAloaWRfZGJnKGhkZXYsICIgaGFyZHdhcmUgcmVtb3ZlZFxuIik7CiAJaGlkX2h3X2Nsb3NlKGhkZXYpOwogCWhpZF9od19zdG9wKGhkZXYpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZkYXRhLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGRhdGEtPnBlbmRpbmcuc3RhdHVzKQotCQljb21wbGV0ZSgmZGF0YS0+cGVuZGluZy5yZWFkeSk7CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPmhpZF9zZW5zb3JfY2xpZW50X2NudDsgKytpKSB7CisJCXN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2ID0KKwkJCWRhdGEtPmhpZF9zZW5zb3JfaHViX2NsaWVudF9kZXZzW2ldLnBsYXRmb3JtX2RhdGE7CisJCWlmIChoc2Rldi0+cGVuZGluZy5zdGF0dXMpCisJCQljb21wbGV0ZSgmaHNkZXYtPnBlbmRpbmcucmVhZHkpOworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYXRhLT5sb2NrLCBmbGFncyk7CiAJbWZkX3JlbW92ZV9kZXZpY2VzKCZoZGV2LT5kZXYpOwogCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zb255LmMgYi9kcml2ZXJzL2hpZC9oaWQtc29ueS5jCmluZGV4IDE4OTZjMDEuLjZjYTk2Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1zb255LmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXNvbnkuYwpAQCAtODAyLDcgKzgwMiw4IEBACiAjZGVmaW5lIERTNF9SRVBPUlRfMHgwNV9TSVpFIDMyCiAjZGVmaW5lIERTNF9SRVBPUlRfMHgxMV9TSVpFIDc4CiAjZGVmaW5lIERTNF9SRVBPUlRfMHg4MV9TSVpFIDcKLSNkZWZpbmUgU0lYQVhJU19SRVBPUlRfMHhGMl9TSVpFIDE4CisjZGVmaW5lIFNJWEFYSVNfUkVQT1JUXzB4RjJfU0laRSAxNworI2RlZmluZSBTSVhBWElTX1JFUE9SVF8weEY1X1NJWkUgOAogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNvbnlfZGV2X2xpc3RfbG9jayk7CiBzdGF0aWMgTElTVF9IRUFEKHNvbnlfZGV2aWNlX2xpc3QpOwpAQCAtODE1LDcgKzgxNiw4IEBACiAJc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkc1tNQVhfTEVEU107CiAJdW5zaWduZWQgbG9uZyBxdWlya3M7CiAJc3RydWN0IHdvcmtfc3RydWN0IHN0YXRlX3dvcmtlcjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYmF0dGVyeV9kZXNjOwogCWludCBkZXZpY2VfaWQ7CiAJX191OCAqb3V0cHV0X3JlcG9ydF9kbWFidWY7CiAKQEAgLTExMzAsMTggKzExMzIsMzggQEAKICAqLwogc3RhdGljIGludCBzaXhheGlzX3NldF9vcGVyYXRpb25hbF91c2Ioc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYpCiB7CisJY29uc3QgaW50IGJ1Zl9zaXplID0KKwkJbWF4KFNJWEFYSVNfUkVQT1JUXzB4RjJfU0laRSwgU0lYQVhJU19SRVBPUlRfMHhGNV9TSVpFKTsKKwlfX3U4ICpidWY7CiAJaW50IHJldDsKLQljaGFyICpidWYgPSBrbWFsbG9jKDE4LCBHRlBfS0VSTkVMKTsKIAorCWJ1ZiA9IGttYWxsb2MoYnVmX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldCA9IGhpZF9od19yYXdfcmVxdWVzdChoZGV2LCAweGYyLCBidWYsIDE3LCBISURfRkVBVFVSRV9SRVBPUlQsCi0JCQkJIEhJRF9SRVFfR0VUX1JFUE9SVCk7CisJcmV0ID0gaGlkX2h3X3Jhd19yZXF1ZXN0KGhkZXYsIDB4ZjIsIGJ1ZiwgU0lYQVhJU19SRVBPUlRfMHhGMl9TSVpFLAorCQkJCSBISURfRkVBVFVSRV9SRVBPUlQsIEhJRF9SRVFfR0VUX1JFUE9SVCk7CisJaWYgKHJldCA8IDApIHsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3Qgc2V0IG9wZXJhdGlvbmFsIG1vZGU6IHN0ZXAgMVxuIik7CisJCWdvdG8gb3V0OworCX0KIAorCS8qCisJICogU29tZSBjb21wYXRpYmxlIGNvbnRyb2xsZXJzIGxpa2UgdGhlIFNwZWVkbGluayBTdHJpa2UgRlggYW5kCisJICogR2FzaWEgbmVlZCBhbm90aGVyIHF1ZXJ5IHBsdXMgYW4gVVNCIGludGVycnVwdCB0byBnZXQgb3BlcmF0aW9uYWwuCisJICovCisJcmV0ID0gaGlkX2h3X3Jhd19yZXF1ZXN0KGhkZXYsIDB4ZjUsIGJ1ZiwgU0lYQVhJU19SRVBPUlRfMHhGNV9TSVpFLAorCQkJCSBISURfRkVBVFVSRV9SRVBPUlQsIEhJRF9SRVFfR0VUX1JFUE9SVCk7CisJaWYgKHJldCA8IDApIHsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3Qgc2V0IG9wZXJhdGlvbmFsIG1vZGU6IHN0ZXAgMlxuIik7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGhpZF9od19vdXRwdXRfcmVwb3J0KGhkZXYsIGJ1ZiwgMSk7CiAJaWYgKHJldCA8IDApCi0JCWhpZF9lcnIoaGRldiwgImNhbid0IHNldCBvcGVyYXRpb25hbCBtb2RlXG4iKTsKKwkJaGlkX2VycihoZGV2LCAiY2FuJ3Qgc2V0IG9wZXJhdGlvbmFsIG1vZGU6IHN0ZXAgM1xuIik7CiAKK291dDoKIAlrZnJlZShidWYpOwogCiAJcmV0dXJuIHJldDsKQEAgLTE2NjAsNyArMTY4Miw3IEBACiAJCQkJICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBzb255X3NjICpzYyA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBzb255X3NjLCBiYXR0ZXJ5KTsKKwlzdHJ1Y3Qgc29ueV9zYyAqc2MgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAwOwogCXU4IGJhdHRlcnlfY2hhcmdpbmcsIGJhdHRlcnlfY2FwYWNpdHksIGNhYmxlX3N0YXRlOwpAQCAtMTY5OSw2ICsxNzIxLDcgQEAKIAogc3RhdGljIGludCBzb255X2JhdHRlcnlfcHJvYmUoc3RydWN0IHNvbnlfc2MgKnNjKQogeworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7IC5kcnZfZGF0YSA9IHNjLCB9OwogCXN0cnVjdCBoaWRfZGV2aWNlICpoZGV2ID0gc2MtPmhkZXY7CiAJaW50IHJldDsKIApAQCAtMTcwOCwzOSArMTczMSw0MiBAQAogCSAqLwogCXNjLT5iYXR0ZXJ5X2NhcGFjaXR5ID0gMTAwOwogCi0Jc2MtPmJhdHRlcnkucHJvcGVydGllcyA9IHNvbnlfYmF0dGVyeV9wcm9wczsKLQlzYy0+YmF0dGVyeS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoc29ueV9iYXR0ZXJ5X3Byb3BzKTsKLQlzYy0+YmF0dGVyeS5nZXRfcHJvcGVydHkgPSBzb255X2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwotCXNjLT5iYXR0ZXJ5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCXNjLT5iYXR0ZXJ5LnVzZV9mb3JfYXBtID0gMDsKLQlzYy0+YmF0dGVyeS5uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJzb255X2NvbnRyb2xsZXJfYmF0dGVyeV8lcE1SIiwKLQkJCQkgICAgIHNjLT5tYWNfYWRkcmVzcyk7Ci0JaWYgKCFzYy0+YmF0dGVyeS5uYW1lKQorCXNjLT5iYXR0ZXJ5X2Rlc2MucHJvcGVydGllcyA9IHNvbnlfYmF0dGVyeV9wcm9wczsKKwlzYy0+YmF0dGVyeV9kZXNjLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShzb255X2JhdHRlcnlfcHJvcHMpOworCXNjLT5iYXR0ZXJ5X2Rlc2MuZ2V0X3Byb3BlcnR5ID0gc29ueV9iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKKwlzYy0+YmF0dGVyeV9kZXNjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCXNjLT5iYXR0ZXJ5X2Rlc2MudXNlX2Zvcl9hcG0gPSAwOworCXNjLT5iYXR0ZXJ5X2Rlc2MubmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAorCQkJCQkgICJzb255X2NvbnRyb2xsZXJfYmF0dGVyeV8lcE1SIiwKKwkJCQkJICBzYy0+bWFjX2FkZHJlc3MpOworCWlmICghc2MtPmJhdHRlcnlfZGVzYy5uYW1lKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmaGRldi0+ZGV2LCAmc2MtPmJhdHRlcnkpOwotCWlmIChyZXQpIHsKKwlzYy0+YmF0dGVyeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmaGRldi0+ZGV2LCAmc2MtPmJhdHRlcnlfZGVzYywKKwkJCQkJICAgICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKHNjLT5iYXR0ZXJ5KSkgeworCQlyZXQgPSBQVFJfRVJSKHNjLT5iYXR0ZXJ5KTsKIAkJaGlkX2VycihoZGV2LCAiVW5hYmxlIHRvIHJlZ2lzdGVyIGJhdHRlcnkgZGV2aWNlXG4iKTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKLQlwb3dlcl9zdXBwbHlfcG93ZXJzKCZzYy0+YmF0dGVyeSwgJmhkZXYtPmRldik7CisJcG93ZXJfc3VwcGx5X3Bvd2VycyhzYy0+YmF0dGVyeSwgJmhkZXYtPmRldik7CiAJcmV0dXJuIDA7CiAKIGVycl9mcmVlOgotCWtmcmVlKHNjLT5iYXR0ZXJ5Lm5hbWUpOwotCXNjLT5iYXR0ZXJ5Lm5hbWUgPSBOVUxMOworCWtmcmVlKHNjLT5iYXR0ZXJ5X2Rlc2MubmFtZSk7CisJc2MtPmJhdHRlcnlfZGVzYy5uYW1lID0gTlVMTDsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBzb255X2JhdHRlcnlfcmVtb3ZlKHN0cnVjdCBzb255X3NjICpzYykKIHsKLQlpZiAoIXNjLT5iYXR0ZXJ5Lm5hbWUpCisJaWYgKCFzYy0+YmF0dGVyeV9kZXNjLm5hbWUpCiAJCXJldHVybjsKIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZzYy0+YmF0dGVyeSk7Ci0Ja2ZyZWUoc2MtPmJhdHRlcnkubmFtZSk7Ci0Jc2MtPmJhdHRlcnkubmFtZSA9IE5VTEw7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoc2MtPmJhdHRlcnkpOworCWtmcmVlKHNjLT5iYXR0ZXJ5X2Rlc2MubmFtZSk7CisJc2MtPmJhdHRlcnlfZGVzYy5uYW1lID0gTlVMTDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1zdGVlbHNlcmllcy5jIGIvZHJpdmVycy9oaWQvaGlkLXN0ZWVsc2VyaWVzLmMKaW5kZXggMjlmMzI4Zi4uM2VkZDRhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLXN0ZWVsc2VyaWVzLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXN0ZWVsc2VyaWVzLmMKQEAgLTEyLDcgKzEyLDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlkLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC10aXZvLmMgYi9kcml2ZXJzL2hpZC9oaWQtdGl2by5jCmluZGV4IGQ3OTBkOGQuLmQ5ODY5NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC10aXZvLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXRpdm8uYwpAQCAtNjQsNiArNjQsNyBAQAogCS8qIFRpVm8gU2xpZGUgQmx1ZXRvb3RoIHJlbW90ZSwgcGFpcnMgd2l0aCBhIEJyb2FkY29tIGRvbmdsZSAqLwogCXsgSElEX0JMVUVUT09USF9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9USVZPLCBVU0JfREVWSUNFX0lEX1RJVk9fU0xJREVfQlQpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX1RJVk8sIFVTQl9ERVZJQ0VfSURfVElWT19TTElERSkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVElWTywgVVNCX0RFVklDRV9JRF9USVZPX1NMSURFX1BSTykgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgdGl2b19kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC11Y2xvZ2ljLmMgYi9kcml2ZXJzL2hpZC9oaWQtdWNsb2dpYy5jCmluZGV4IGZiOGI1MTYuLjk0MTY3MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC11Y2xvZ2ljLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXVjbG9naWMuYwpAQCAtMSw3ICsxLDggQEAKIC8qCiAgKiAgSElEIGRyaXZlciBmb3IgVUMtTG9naWMgZGV2aWNlcyBub3QgZnVsbHkgY29tcGxpYW50IHdpdGggSElEIHN0YW5kYXJkCiAgKgotICogIENvcHlyaWdodCAoYykgMjAxMCBOaWtvbGFpIEtvbmRyYXNob3YKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxNCBOaWtvbGFpIEtvbmRyYXNob3YKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTMgTWFydGluIFJ1c2tvCiAgKi8KIAogLyoKQEAgLTE1LDYgKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC9oaWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSAidXNiaGlkL3VzYmhpZC5oIgogCiAjaW5jbHVkZSAiaGlkLWlkcy5oIgogCkBAIC01NDYsMTEgKzU0OSw5MyBAQAogCTB4QzAgICAgICAgIC8qICBFbmQgQ29sbGVjdGlvbiAgICAgICAgICAgICAgKi8KIH07CiAKKy8qIFJlcG9ydCBkZXNjcmlwdG9yIHRlbXBsYXRlIHBsYWNlaG9sZGVyIGhlYWQgKi8KKyNkZWZpbmUgVUNMT0dJQ19QSF9IRUFECTB4RkUsIDB4RUQsIDB4MUQKKworLyogUmVwb3J0IGRlc2NyaXB0b3IgdGVtcGxhdGUgcGxhY2Vob2xkZXIgSURzICovCitlbnVtIHVjbG9naWNfcGhfaWQgeworCVVDTE9HSUNfUEhfSURfWF9MTSwKKwlVQ0xPR0lDX1BIX0lEX1hfUE0sCisJVUNMT0dJQ19QSF9JRF9ZX0xNLAorCVVDTE9HSUNfUEhfSURfWV9QTSwKKwlVQ0xPR0lDX1BIX0lEX1BSRVNTVVJFX0xNLAorCVVDTE9HSUNfUEhfSURfTlVNCit9OworCisvKiBSZXBvcnQgZGVzY3JpcHRvciB0ZW1wbGF0ZSBwbGFjZWhvbGRlciAqLworI2RlZmluZSBVQ0xPR0lDX1BIKF9JRCkgVUNMT0dJQ19QSF9IRUFELCBVQ0xPR0lDX1BIX0lEXyMjX0lECisjZGVmaW5lIFVDTE9HSUNfUEVOX1JFUE9SVF9JRAkweDA3CisKKy8qIEZpeGVkIHJlcG9ydCBkZXNjcmlwdG9yIHRlbXBsYXRlICovCitzdGF0aWMgY29uc3QgX191OCB1Y2xvZ2ljX3RhYmxldF9yZGVzY190ZW1wbGF0ZVtdID0geworCTB4MDUsIDB4MEQsICAgICAgICAgICAgIC8qICBVc2FnZSBQYWdlIChEaWdpdGl6ZXIpLCAgICAgICAgICAgICAgICAgKi8KKwkweDA5LCAweDAyLCAgICAgICAgICAgICAvKiAgVXNhZ2UgKFBlbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJMHhBMSwgMHgwMSwgICAgICAgICAgICAgLyogIENvbGxlY3Rpb24gKEFwcGxpY2F0aW9uKSwgICAgICAgICAgICAgICAqLworCTB4ODUsIDB4MDcsICAgICAgICAgICAgIC8qICAgICAgUmVwb3J0IElEICg3KSwgICAgICAgICAgICAgICAgICAgICAgKi8KKwkweDA5LCAweDIwLCAgICAgICAgICAgICAvKiAgICAgIFVzYWdlIChTdHlsdXMpLCAgICAgICAgICAgICAgICAgICAgICovCisJMHhBMCwgICAgICAgICAgICAgICAgICAgLyogICAgICBDb2xsZWN0aW9uIChQaHlzaWNhbCksICAgICAgICAgICAgICAqLworCTB4MTQsICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgIExvZ2ljYWwgTWluaW11bSAoMCksICAgICAgICAgICAgKi8KKwkweDI1LCAweDAxLCAgICAgICAgICAgICAvKiAgICAgICAgICBMb2dpY2FsIE1heGltdW0gKDEpLCAgICAgICAgICAgICovCisJMHg3NSwgMHgwMSwgICAgICAgICAgICAgLyogICAgICAgICAgUmVwb3J0IFNpemUgKDEpLCAgICAgICAgICAgICAgICAqLworCTB4MDksIDB4NDIsICAgICAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIChUaXAgU3dpdGNoKSwgICAgICAgICAgICAgKi8KKwkweDA5LCAweDQ0LCAgICAgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoQmFycmVsIFN3aXRjaCksICAgICAgICAgICovCisJMHgwOSwgMHg0NiwgICAgICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgKFRhYmxldCBQaWNrKSwgICAgICAgICAgICAqLworCTB4OTUsIDB4MDMsICAgICAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBDb3VudCAoMyksICAgICAgICAgICAgICAgKi8KKwkweDgxLCAweDAyLCAgICAgICAgICAgICAvKiAgICAgICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgICAgICovCisJMHg5NSwgMHgwMywgICAgICAgICAgICAgLyogICAgICAgICAgUmVwb3J0IENvdW50ICgzKSwgICAgICAgICAgICAgICAqLworCTB4ODEsIDB4MDMsICAgICAgICAgICAgIC8qICAgICAgICAgIElucHV0IChDb25zdGFudCwgVmFyaWFibGUpLCAgICAgKi8KKwkweDA5LCAweDMyLCAgICAgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoSW4gUmFuZ2UpLCAgICAgICAgICAgICAgICovCisJMHg5NSwgMHgwMSwgICAgICAgICAgICAgLyogICAgICAgICAgUmVwb3J0IENvdW50ICgxKSwgICAgICAgICAgICAgICAqLworCTB4ODEsIDB4MDIsICAgICAgICAgICAgIC8qICAgICAgICAgIElucHV0IChWYXJpYWJsZSksICAgICAgICAgICAgICAgKi8KKwkweDk1LCAweDAxLCAgICAgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgQ291bnQgKDEpLCAgICAgICAgICAgICAgICovCisJMHg4MSwgMHgwMywgICAgICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKENvbnN0YW50LCBWYXJpYWJsZSksICAgICAqLworCTB4NzUsIDB4MTAsICAgICAgICAgICAgIC8qICAgICAgICAgIFJlcG9ydCBTaXplICgxNiksICAgICAgICAgICAgICAgKi8KKwkweDk1LCAweDAxLCAgICAgICAgICAgICAvKiAgICAgICAgICBSZXBvcnQgQ291bnQgKDEpLCAgICAgICAgICAgICAgICovCisJMHhBNCwgICAgICAgICAgICAgICAgICAgLyogICAgICAgICAgUHVzaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCTB4MDUsIDB4MDEsICAgICAgICAgICAgIC8qICAgICAgICAgIFVzYWdlIFBhZ2UgKERlc2t0b3ApLCAgICAgICAgICAgKi8KKwkweDY1LCAweDEzLCAgICAgICAgICAgICAvKiAgICAgICAgICBVbml0IChJbmNoKSwgICAgICAgICAgICAgICAgICAgICovCisJMHg1NSwgMHhGRCwgICAgICAgICAgICAgLyogICAgICAgICAgVW5pdCBFeHBvbmVudCAoLTMpLCAgICAgICAgICAgICAqLworCTB4MzQsICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgIFBoeXNpY2FsIE1pbmltdW0gKDApLCAgICAgICAgICAgKi8KKwkweDA5LCAweDMwLCAgICAgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoWCksICAgICAgICAgICAgICAgICAgICAgICovCisJMHgyNywgVUNMT0dJQ19QSChYX0xNKSwgLyogICAgICAgICAgTG9naWNhbCBNYXhpbXVtIChQTEFDRUhPTERFUiksICAqLworCTB4NDcsIFVDTE9HSUNfUEgoWF9QTSksIC8qICAgICAgICAgIFBoeXNpY2FsIE1heGltdW0gKFBMQUNFSE9MREVSKSwgKi8KKwkweDgxLCAweDAyLCAgICAgICAgICAgICAvKiAgICAgICAgICBJbnB1dCAoVmFyaWFibGUpLCAgICAgICAgICAgICAgICovCisJMHgwOSwgMHgzMSwgICAgICAgICAgICAgLyogICAgICAgICAgVXNhZ2UgKFkpLCAgICAgICAgICAgICAgICAgICAgICAqLworCTB4MjcsIFVDTE9HSUNfUEgoWV9MTSksIC8qICAgICAgICAgIExvZ2ljYWwgTWF4aW11bSAoUExBQ0VIT0xERVIpLCAgKi8KKwkweDQ3LCBVQ0xPR0lDX1BIKFlfUE0pLCAvKiAgICAgICAgICBQaHlzaWNhbCBNYXhpbXVtIChQTEFDRUhPTERFUiksICovCisJMHg4MSwgMHgwMiwgICAgICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICAgICAqLworCTB4QjQsICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgIFBvcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkweDA5LCAweDMwLCAgICAgICAgICAgICAvKiAgICAgICAgICBVc2FnZSAoVGlwIFByZXNzdXJlKSwgICAgICAgICAgICovCisJMHgyNywKKwlVQ0xPR0lDX1BIKFBSRVNTVVJFX0xNKSwvKiAgICAgICAgICBMb2dpY2FsIE1heGltdW0gKFBMQUNFSE9MREVSKSwgICovCisJMHg4MSwgMHgwMiwgICAgICAgICAgICAgLyogICAgICAgICAgSW5wdXQgKFZhcmlhYmxlKSwgICAgICAgICAgICAgICAqLworCTB4QzAsICAgICAgICAgICAgICAgICAgIC8qICAgICAgRW5kIENvbGxlY3Rpb24sICAgICAgICAgICAgICAgICAgICAgKi8KKwkweEMwICAgICAgICAgICAgICAgICAgICAvKiAgRW5kIENvbGxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCisvKiBQYXJhbWV0ZXIgaW5kaWNlcyAqLworZW51bSB1Y2xvZ2ljX3BybSB7CisJVUNMT0dJQ19QUk1fWF9MTQk9IDEsCisJVUNMT0dJQ19QUk1fWV9MTQk9IDIsCisJVUNMT0dJQ19QUk1fUFJFU1NVUkVfTE0JPSA0LAorCVVDTE9HSUNfUFJNX1JFU09MVVRJT04JPSA1LAorCVVDTE9HSUNfUFJNX05VTQorfTsKKworLyogRHJpdmVyIGRhdGEgKi8KK3N0cnVjdCB1Y2xvZ2ljX2RydmRhdGEgeworCV9fdTggKnJkZXNjOworCXVuc2lnbmVkIGludCByc2l6ZTsKKwlib29sIGludmVydF9wZW5faW5yYW5nZTsKKwlib29sIGlnbm9yZV9wZW5fdXNhZ2U7Cit9OworCiBzdGF0aWMgX191OCAqdWNsb2dpY19yZXBvcnRfZml4dXAoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIF9fdTggKnJkZXNjLAogCQkJCQl1bnNpZ25lZCBpbnQgKnJzaXplKQogewogCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppZmFjZSA9IHRvX3VzYl9pbnRlcmZhY2UoaGRldi0+ZGV2LnBhcmVudCk7CiAJX191OCBpZmFjZV9udW0gPSBpZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwlzdHJ1Y3QgdWNsb2dpY19kcnZkYXRhICpkcnZkYXRhID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOwogCiAJc3dpdGNoIChoZGV2LT5wcm9kdWN0KSB7CiAJY2FzZSBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1BGMTIwOToKQEAgLTYyMSwxMSArNzA2LDI0MSBAQAogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGRydmRhdGEtPnJkZXNjICE9IE5VTEwpIHsKKwkJCXJkZXNjID0gZHJ2ZGF0YS0+cmRlc2M7CisJCQkqcnNpemUgPSBkcnZkYXRhLT5yc2l6ZTsKKwkJfQogCX0KIAogCXJldHVybiByZGVzYzsKIH0KIAorc3RhdGljIGludCB1Y2xvZ2ljX2lucHV0X21hcHBpbmcoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfaW5wdXQgKmhpLAorCQlzdHJ1Y3QgaGlkX2ZpZWxkICpmaWVsZCwgc3RydWN0IGhpZF91c2FnZSAqdXNhZ2UsCisJCXVuc2lnbmVkIGxvbmcgKipiaXQsIGludCAqbWF4KQoreworCXN0cnVjdCB1Y2xvZ2ljX2RydmRhdGEgKmRydmRhdGEgPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7CisKKwkvKiBkaXNjYXJkIHRoZSB1bnVzZWQgcGVuIGludGVyZmFjZSAqLworCWlmICgoZHJ2ZGF0YS0+aWdub3JlX3Blbl91c2FnZSkgJiYKKwkgICAgKGZpZWxkLT5hcHBsaWNhdGlvbiA9PSBISURfREdfUEVOKSkKKwkJcmV0dXJuIC0xOworCisJLyogbGV0IGhpZC1jb3JlIGRlY2lkZSB3aGF0IHRvIGRvICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVjbG9naWNfaW5wdXRfY29uZmlndXJlZChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKKwkJc3RydWN0IGhpZF9pbnB1dCAqaGkpCit7CisJY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpzdWZmaXggPSBOVUxMOworCXN0cnVjdCBoaWRfZmllbGQgKmZpZWxkOworCXNpemVfdCBsZW47CisKKwkvKiBubyByZXBvcnQgYXNzb2NpYXRlZCAoSElEX1FVSVJLX01VTFRJX0lOUFVUIG5vdCBzZXQpICovCisJaWYgKCFoaS0+cmVwb3J0KQorCQlyZXR1cm47CisKKwlmaWVsZCA9IGhpLT5yZXBvcnQtPmZpZWxkWzBdOworCisJc3dpdGNoIChmaWVsZC0+YXBwbGljYXRpb24pIHsKKwljYXNlIEhJRF9HRF9LRVlCT0FSRDoKKwkJc3VmZml4ID0gIktleWJvYXJkIjsKKwkJYnJlYWs7CisJY2FzZSBISURfR0RfTU9VU0U6CisJCXN1ZmZpeCA9ICJNb3VzZSI7CisJCWJyZWFrOworCWNhc2UgSElEX0dEX0tFWVBBRDoKKwkJc3VmZml4ID0gIlBhZCI7CisJCWJyZWFrOworCWNhc2UgSElEX0RHX1BFTjoKKwkJc3VmZml4ID0gIlBlbiI7CisJCWJyZWFrOworCWNhc2UgSElEX0NQX0NPTlNVTUVSX0NPTlRST0w6CisJCXN1ZmZpeCA9ICJDb25zdW1lciBDb250cm9sIjsKKwkJYnJlYWs7CisJY2FzZSBISURfR0RfU1lTVEVNX0NPTlRST0w6CisJCXN1ZmZpeCA9ICJTeXN0ZW0gQ29udHJvbCI7CisJCWJyZWFrOworCX0KKworCWlmIChzdWZmaXgpIHsKKwkJbGVuID0gc3RybGVuKGhkZXYtPm5hbWUpICsgMiArIHN0cmxlbihzdWZmaXgpOworCQluYW1lID0gZGV2bV9remFsbG9jKCZoaS0+aW5wdXQtPmRldiwgbGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKG5hbWUpIHsKKwkJCXNucHJpbnRmKG5hbWUsIGxlbiwgIiVzICVzIiwgaGRldi0+bmFtZSwgc3VmZml4KTsKKwkJCWhpLT5pbnB1dC0+bmFtZSA9IG5hbWU7CisJCX0KKwl9Cit9CisKKy8qKgorICogRW5hYmxlIGZ1bGx5LWZ1bmN0aW9uYWwgdGFibGV0IG1vZGUgYW5kIGRldGVybWluZSBkZXZpY2UgcGFyYW1ldGVycy4KKyAqCisgKiBAaGRldjoJSElEIGRldmljZQorICovCitzdGF0aWMgaW50IHVjbG9naWNfdGFibGV0X2VuYWJsZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldikKK3sKKwlpbnQgcmM7CisJc3RydWN0IHVzYl9kZXZpY2UgKnVzYl9kZXYgPSBoaWRfdG9fdXNiX2RldihoZGV2KTsKKwlzdHJ1Y3QgdWNsb2dpY19kcnZkYXRhICpkcnZkYXRhID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCV9fbGUxNiAqYnVmID0gTlVMTDsKKwlzaXplX3QgbGVuOworCXMzMiBwYXJhbXNbVUNMT0dJQ19QSF9JRF9OVU1dOworCXMzMiByZXNvbHV0aW9uOworCV9fdTggKnA7CisJczMyIHY7CisKKwkvKgorCSAqIFJlYWQgc3RyaW5nIGRlc2NyaXB0b3IgY29udGFpbmluZyB0YWJsZXQgcGFyYW1ldGVycy4gVGhlIHNwZWNpZmljCisJICogc3RyaW5nIGRlc2NyaXB0b3IgYW5kIGRhdGEgd2VyZSBkaXNjb3ZlcmVkIGJ5IHNuaWZmaW5nIHRoZSBXaW5kb3dzCisJICogZHJpdmVyIHRyYWZmaWMuCisJICogTk9URTogVGhpcyBlbmFibGVzIGZ1bGx5LWZ1bmN0aW9uYWwgdGFibGV0IG1vZGUuCisJICovCisJbGVuID0gVUNMT0dJQ19QUk1fTlVNICogc2l6ZW9mKCpidWYpOworCWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJaGlkX2VycihoZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHBhcmFtZXRlciBidWZmZXJcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDsKKwl9CisJcmMgPSB1c2JfY29udHJvbF9tc2codXNiX2RldiwgdXNiX3JjdmN0cmxwaXBlKHVzYl9kZXYsIDApLAorCQkJCVVTQl9SRVFfR0VUX0RFU0NSSVBUT1IsIFVTQl9ESVJfSU4sCisJCQkJKFVTQl9EVF9TVFJJTkcgPDwgOCkgKyAweDY0LAorCQkJCTB4MDQwOSwgYnVmLCBsZW4sCisJCQkJVVNCX0NUUkxfR0VUX1RJTUVPVVQpOworCWlmIChyYyA9PSAtRVBJUEUpIHsKKwkJaGlkX2VycihoZGV2LCAiZGV2aWNlIHBhcmFtZXRlcnMgbm90IGZvdW5kXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGNsZWFudXA7CisJfSBlbHNlIGlmIChyYyA8IDApIHsKKwkJaGlkX2VycihoZGV2LCAiZmFpbGVkIHRvIGdldCBkZXZpY2UgcGFyYW1ldGVyczogJWRcbiIsIHJjKTsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGNsZWFudXA7CisJfSBlbHNlIGlmIChyYyAhPSBsZW4pIHsKKwkJaGlkX2VycihoZGV2LCAiaW52YWxpZCBkZXZpY2UgcGFyYW1ldGVyc1xuIik7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBjbGVhbnVwOworCX0KKworCS8qIEV4dHJhY3QgZGV2aWNlIHBhcmFtZXRlcnMgKi8KKwlwYXJhbXNbVUNMT0dJQ19QSF9JRF9YX0xNXSA9IGxlMTZfdG9fY3B1KGJ1ZltVQ0xPR0lDX1BSTV9YX0xNXSk7CisJcGFyYW1zW1VDTE9HSUNfUEhfSURfWV9MTV0gPSBsZTE2X3RvX2NwdShidWZbVUNMT0dJQ19QUk1fWV9MTV0pOworCXBhcmFtc1tVQ0xPR0lDX1BIX0lEX1BSRVNTVVJFX0xNXSA9CisJCWxlMTZfdG9fY3B1KGJ1ZltVQ0xPR0lDX1BSTV9QUkVTU1VSRV9MTV0pOworCXJlc29sdXRpb24gPSBsZTE2X3RvX2NwdShidWZbVUNMT0dJQ19QUk1fUkVTT0xVVElPTl0pOworCWlmIChyZXNvbHV0aW9uID09IDApIHsKKwkJcGFyYW1zW1VDTE9HSUNfUEhfSURfWF9QTV0gPSAwOworCQlwYXJhbXNbVUNMT0dJQ19QSF9JRF9ZX1BNXSA9IDA7CisJfSBlbHNlIHsKKwkJcGFyYW1zW1VDTE9HSUNfUEhfSURfWF9QTV0gPSBwYXJhbXNbVUNMT0dJQ19QSF9JRF9YX0xNXSAqCisJCQkJCQkxMDAwIC8gcmVzb2x1dGlvbjsKKwkJcGFyYW1zW1VDTE9HSUNfUEhfSURfWV9QTV0gPSBwYXJhbXNbVUNMT0dJQ19QSF9JRF9ZX0xNXSAqCisJCQkJCQkxMDAwIC8gcmVzb2x1dGlvbjsKKwl9CisKKwkvKiBBbGxvY2F0ZSBmaXhlZCByZXBvcnQgZGVzY3JpcHRvciAqLworCWRydmRhdGEtPnJkZXNjID0gZGV2bV9remFsbG9jKCZoZGV2LT5kZXYsCisJCQkJc2l6ZW9mKHVjbG9naWNfdGFibGV0X3JkZXNjX3RlbXBsYXRlKSwKKwkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoZHJ2ZGF0YS0+cmRlc2MgPT0gTlVMTCkgeworCQloaWRfZXJyKGhkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZml4ZWQgcmRlc2NcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cDsKKwl9CisJZHJ2ZGF0YS0+cnNpemUgPSBzaXplb2YodWNsb2dpY190YWJsZXRfcmRlc2NfdGVtcGxhdGUpOworCisJLyogRm9ybWF0IGZpeGVkIHJlcG9ydCBkZXNjcmlwdG9yICovCisJbWVtY3B5KGRydmRhdGEtPnJkZXNjLCB1Y2xvZ2ljX3RhYmxldF9yZGVzY190ZW1wbGF0ZSwKKwkJZHJ2ZGF0YS0+cnNpemUpOworCWZvciAocCA9IGRydmRhdGEtPnJkZXNjOworCSAgICAgcCA8PSBkcnZkYXRhLT5yZGVzYyArIGRydmRhdGEtPnJzaXplIC0gNDspIHsKKwkJaWYgKHBbMF0gPT0gMHhGRSAmJiBwWzFdID09IDB4RUQgJiYgcFsyXSA9PSAweDFEICYmCisJCSAgICBwWzNdIDwgc2l6ZW9mKHBhcmFtcykpIHsKKwkJCXYgPSBwYXJhbXNbcFszXV07CisJCQlwdXRfdW5hbGlnbmVkKGNwdV90b19sZTMyKHYpLCAoczMyICopcCk7CisJCQlwICs9IDQ7CisJCX0gZWxzZSB7CisJCQlwKys7CisJCX0KKwl9CisKKwlyYyA9IDA7CisKK2NsZWFudXA6CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgdWNsb2dpY19wcm9iZShzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKKwkJY29uc3Qgc3RydWN0IGhpZF9kZXZpY2VfaWQgKmlkKQoreworCWludCByYzsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoaGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHVjbG9naWNfZHJ2ZGF0YSAqZHJ2ZGF0YTsKKworCS8qCisJICogbGliaW5wdXQgcmVxdWlyZXMgdGhlIHBhZCBpbnRlcmZhY2UgdG8gYmUgb24gYSBkaWZmZXJlbnQgbm9kZQorCSAqIHRoYW4gdGhlIHBlbiwgc28gdXNlIFFVSVJLX01VTFRJX0lOUFVUIGZvciBhbGwgdGFibGV0cy4KKwkgKi8KKwloZGV2LT5xdWlya3MgfD0gSElEX1FVSVJLX01VTFRJX0lOUFVUOworCWhkZXYtPnF1aXJrcyB8PSBISURfUVVJUktfTk9fRU1QVFlfSU5QVVQ7CisKKwkvKiBBbGxvY2F0ZSBhbmQgYXNzaWduIGRyaXZlciBkYXRhICovCisJZHJ2ZGF0YSA9IGRldm1fa3phbGxvYygmaGRldi0+ZGV2LCBzaXplb2YoKmRydmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZHJ2ZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBkcnZkYXRhKTsKKworCXN3aXRjaCAoaWQtPnByb2R1Y3QpIHsKKwljYXNlIFVTQl9ERVZJQ0VfSURfSFVJT05fVEFCTEVUOgorCQkvKiBJZiB0aGlzIGlzIHRoZSBwZW4gaW50ZXJmYWNlICovCisJCWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyID09IDApIHsKKwkJCXJjID0gdWNsb2dpY190YWJsZXRfZW5hYmxlKGhkZXYpOworCQkJaWYgKHJjKSB7CisJCQkJaGlkX2VycihoZGV2LCAidGFibGV0IGVuYWJsaW5nIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIHJjOworCQkJfQorCQkJZHJ2ZGF0YS0+aW52ZXJ0X3Blbl9pbnJhbmdlID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWRydmRhdGEtPmlnbm9yZV9wZW5fdXNhZ2UgPSB0cnVlOworCQl9CisJCWJyZWFrOworCX0KKworCXJjID0gaGlkX3BhcnNlKGhkZXYpOworCWlmIChyYykgeworCQloaWRfZXJyKGhkZXYsICJwYXJzZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBoaWRfaHdfc3RhcnQoaGRldiwgSElEX0NPTk5FQ1RfREVGQVVMVCk7CisJaWYgKHJjKSB7CisJCWhpZF9lcnIoaGRldiwgImh3IHN0YXJ0IGZhaWxlZFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1Y2xvZ2ljX3Jhd19ldmVudChzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwgc3RydWN0IGhpZF9yZXBvcnQgKnJlcG9ydCwKKwkJCXU4ICpkYXRhLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgdWNsb2dpY19kcnZkYXRhICpkcnZkYXRhID0gaGlkX2dldF9kcnZkYXRhKGhkZXYpOworCisJaWYgKChkcnZkYXRhLT5pbnZlcnRfcGVuX2lucmFuZ2UpICYmCisJICAgIChyZXBvcnQtPnR5cGUgPT0gSElEX0lOUFVUX1JFUE9SVCkgJiYKKwkgICAgKHJlcG9ydC0+aWQgPT0gVUNMT0dJQ19QRU5fUkVQT1JUX0lEKSAmJgorCSAgICAoc2l6ZSA+PSAyKSkKKwkJLyogSW52ZXJ0IHRoZSBpbi1yYW5nZSBiaXQgKi8KKwkJZGF0YVsxXSBePSAweDQwOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCB1Y2xvZ2ljX2RldmljZXNbXSA9IHsKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywKIAkJCQlVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1BGMTIwOSkgfSwKQEAgLTY0MSw2ICs5NTYsOCBAQAogCQkJCVVTQl9ERVZJQ0VfSURfVUNMT0dJQ19XSVJFTEVTU19UQUJMRVRfVFdITDg1MCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfVUNMT0dJQywKIAkJCQlVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1RXSEE2MCkgfSwKKwl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfSFVJT04sIFVTQl9ERVZJQ0VfSURfSFVJT05fVEFCTEVUKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9VQ0xPR0lDLCBVU0JfREVWSUNFX0lEX0hVSU9OX1RBQkxFVCkgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgdWNsb2dpY19kZXZpY2VzKTsKQEAgLTY0OCw4ICs5NjUsMTQgQEAKIHN0YXRpYyBzdHJ1Y3QgaGlkX2RyaXZlciB1Y2xvZ2ljX2RyaXZlciA9IHsKIAkubmFtZSA9ICJ1Y2xvZ2ljIiwKIAkuaWRfdGFibGUgPSB1Y2xvZ2ljX2RldmljZXMsCisJLnByb2JlID0gdWNsb2dpY19wcm9iZSwKIAkucmVwb3J0X2ZpeHVwID0gdWNsb2dpY19yZXBvcnRfZml4dXAsCisJLnJhd19ldmVudCA9IHVjbG9naWNfcmF3X2V2ZW50LAorCS5pbnB1dF9tYXBwaW5nID0gdWNsb2dpY19pbnB1dF9tYXBwaW5nLAorCS5pbnB1dF9jb25maWd1cmVkID0gdWNsb2dpY19pbnB1dF9jb25maWd1cmVkLAogfTsKIG1vZHVsZV9oaWRfZHJpdmVyKHVjbG9naWNfZHJpdmVyKTsKIAorTU9EVUxFX0FVVEhPUigiTWFydGluIFJ1c2tvIik7CitNT0RVTEVfQVVUSE9SKCJOaWtvbGFpIEtvbmRyYXNob3YiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC13aWltb3RlLW1vZHVsZXMuYyBiL2RyaXZlcnMvaGlkL2hpZC13aWltb3RlLW1vZHVsZXMuYwppbmRleCA2YjYxZjAxLi4wNWUyM2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC9oaWQtd2lpbW90ZS1tb2R1bGVzLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLXdpaW1vdGUtbW9kdWxlcy5jCkBAIC0yMDMsOCArMjAzLDcgQEAKIAkJCQkgICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJCSAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCB3aWltb3RlX2RhdGEgKndkYXRhID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IHdpaW1vdGVfZGF0YSwKLQkJCQkJCSAgYmF0dGVyeSk7CisJc3RydWN0IHdpaW1vdGVfZGF0YSAqd2RhdGEgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAlpbnQgcmV0ID0gMCwgc3RhdGU7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMjM4LDQyICsyMzcsNDYgQEAKIHN0YXRpYyBpbnQgd2lpbW9kX2JhdHRlcnlfcHJvYmUoY29uc3Qgc3RydWN0IHdpaW1vZF9vcHMgKm9wcywKIAkJCQlzdHJ1Y3Qgd2lpbW90ZV9kYXRhICp3ZGF0YSkKIHsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0geyAuZHJ2X2RhdGEgPSB3ZGF0YSwgfTsKIAlpbnQgcmV0OwogCi0Jd2RhdGEtPmJhdHRlcnkucHJvcGVydGllcyA9IHdpaW1vZF9iYXR0ZXJ5X3Byb3BzOwotCXdkYXRhLT5iYXR0ZXJ5Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3aWltb2RfYmF0dGVyeV9wcm9wcyk7Ci0Jd2RhdGEtPmJhdHRlcnkuZ2V0X3Byb3BlcnR5ID0gd2lpbW9kX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwotCXdkYXRhLT5iYXR0ZXJ5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCXdkYXRhLT5iYXR0ZXJ5LnVzZV9mb3JfYXBtID0gMDsKLQl3ZGF0YS0+YmF0dGVyeS5uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJ3aWltb3RlX2JhdHRlcnlfJXMiLAotCQkJCQl3ZGF0YS0+aGRldi0+dW5pcSk7Ci0JaWYgKCF3ZGF0YS0+YmF0dGVyeS5uYW1lKQorCXdkYXRhLT5iYXR0ZXJ5X2Rlc2MucHJvcGVydGllcyA9IHdpaW1vZF9iYXR0ZXJ5X3Byb3BzOworCXdkYXRhLT5iYXR0ZXJ5X2Rlc2MubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdpaW1vZF9iYXR0ZXJ5X3Byb3BzKTsKKwl3ZGF0YS0+YmF0dGVyeV9kZXNjLmdldF9wcm9wZXJ0eSA9IHdpaW1vZF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKKwl3ZGF0YS0+YmF0dGVyeV9kZXNjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCXdkYXRhLT5iYXR0ZXJ5X2Rlc2MudXNlX2Zvcl9hcG0gPSAwOworCXdkYXRhLT5iYXR0ZXJ5X2Rlc2MubmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAid2lpbW90ZV9iYXR0ZXJ5XyVzIiwKKwkJCQkJICAgICB3ZGF0YS0+aGRldi0+dW5pcSk7CisJaWYgKCF3ZGF0YS0+YmF0dGVyeV9kZXNjLm5hbWUpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZ3ZGF0YS0+aGRldi0+ZGV2LCAmd2RhdGEtPmJhdHRlcnkpOwotCWlmIChyZXQpIHsKKwl3ZGF0YS0+YmF0dGVyeSA9IHBvd2VyX3N1cHBseV9yZWdpc3Rlcigmd2RhdGEtPmhkZXYtPmRldiwKKwkJCQkJICAgICAgICZ3ZGF0YS0+YmF0dGVyeV9kZXNjLAorCQkJCQkgICAgICAgJnBzeV9jZmcpOworCWlmIChJU19FUlIod2RhdGEtPmJhdHRlcnkpKSB7CiAJCWhpZF9lcnIod2RhdGEtPmhkZXYsICJjYW5ub3QgcmVnaXN0ZXIgYmF0dGVyeSBkZXZpY2VcbiIpOworCQlyZXQgPSBQVFJfRVJSKHdkYXRhLT5iYXR0ZXJ5KTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CiAKLQlwb3dlcl9zdXBwbHlfcG93ZXJzKCZ3ZGF0YS0+YmF0dGVyeSwgJndkYXRhLT5oZGV2LT5kZXYpOworCXBvd2VyX3N1cHBseV9wb3dlcnMod2RhdGEtPmJhdHRlcnksICZ3ZGF0YS0+aGRldi0+ZGV2KTsKIAlyZXR1cm4gMDsKIAogZXJyX2ZyZWU6Ci0Ja2ZyZWUod2RhdGEtPmJhdHRlcnkubmFtZSk7Ci0Jd2RhdGEtPmJhdHRlcnkubmFtZSA9IE5VTEw7CisJa2ZyZWUod2RhdGEtPmJhdHRlcnlfZGVzYy5uYW1lKTsKKwl3ZGF0YS0+YmF0dGVyeV9kZXNjLm5hbWUgPSBOVUxMOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHdpaW1vZF9iYXR0ZXJ5X3JlbW92ZShjb25zdCBzdHJ1Y3Qgd2lpbW9kX29wcyAqb3BzLAogCQkJCSAgc3RydWN0IHdpaW1vdGVfZGF0YSAqd2RhdGEpCiB7Ci0JaWYgKCF3ZGF0YS0+YmF0dGVyeS5uYW1lKQorCWlmICghd2RhdGEtPmJhdHRlcnlfZGVzYy5uYW1lKQogCQlyZXR1cm47CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcigmd2RhdGEtPmJhdHRlcnkpOwotCWtmcmVlKHdkYXRhLT5iYXR0ZXJ5Lm5hbWUpOwotCXdkYXRhLT5iYXR0ZXJ5Lm5hbWUgPSBOVUxMOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHdkYXRhLT5iYXR0ZXJ5KTsKKwlrZnJlZSh3ZGF0YS0+YmF0dGVyeV9kZXNjLm5hbWUpOworCXdkYXRhLT5iYXR0ZXJ5X2Rlc2MubmFtZSA9IE5VTEw7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2lpbW9kX29wcyB3aWltb2RfYmF0dGVyeSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC13aWltb3RlLmggYi9kcml2ZXJzL2hpZC9oaWQtd2lpbW90ZS5oCmluZGV4IDEwOTM0YWEuLjg3NTY5NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC13aWltb3RlLmgKKysrIGIvZHJpdmVycy9oaWQvaGlkLXdpaW1vdGUuaApAQCAtMTQ3LDcgKzE0Nyw4IEBACiAJc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkc1s0XTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICphY2NlbDsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppcjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYmF0dGVyeV9kZXNjOwogCXN0cnVjdCBpbnB1dF9kZXYgKm1wOwogCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwogCXN0cnVjdCB3aWltb3RlX2RlYnVnICpkZWJ1ZzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2kyYy1oaWQvaTJjLWhpZC5jIGIvZHJpdmVycy9oaWQvaTJjLWhpZC9pMmMtaGlkLmMKaW5kZXggMzYwNTNmMy4uYWI0ZGQ5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaTJjLWhpZC9pMmMtaGlkLmMKKysrIGIvZHJpdmVycy9oaWQvaTJjLWhpZC9pMmMtaGlkLmMKQEAgLTM3LDYgKzM3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2kyYy9pMmMtaGlkLmg+CiAKQEAgLTE0NCw2ICsxNDUsOCBAQAogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwkJLyogZGV2aWNlIGZsYWdzICovCiAKIAl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OwkJLyogRm9yIHdhaXRpbmcgdGhlIGludGVycnVwdCAqLworCXN0cnVjdCBncGlvX2Rlc2MJKmRlc2M7CisJaW50CQkJaXJxOwogCiAJc3RydWN0IGkyY19oaWRfcGxhdGZvcm1fZGF0YSBwZGF0YTsKIH07CkBAIC03ODUsMTYgKzc4OCwxNiBAQAogCXN0cnVjdCBpMmNfaGlkICppaGlkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJaW50IHJldDsKIAotCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiUmVxdWVzdGluZyBJUlE6ICVkXG4iLCBjbGllbnQtPmlycSk7CisJZGV2X2RiZygmY2xpZW50LT5kZXYsICJSZXF1ZXN0aW5nIElSUTogJWRcbiIsIGloaWQtPmlycSk7CiAKLQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShjbGllbnQtPmlycSwgTlVMTCwgaTJjX2hpZF9pcnEsCisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaWhpZC0+aXJxLCBOVUxMLCBpMmNfaGlkX2lycSwKIAkJCUlSUUZfVFJJR0dFUl9MT1cgfCBJUlFGX09ORVNIT1QsCiAJCQljbGllbnQtPm5hbWUsIGloaWQpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl93YXJuKCZjbGllbnQtPmRldiwKIAkJCSJDb3VsZCBub3QgcmVnaXN0ZXIgZm9yICVzIGludGVycnVwdCwgaXJxID0gJWQsIgogCQkJIiByZXQgPSAlZFxuIiwKLQkJCWNsaWVudC0+bmFtZSwgY2xpZW50LT5pcnEsIHJldCk7CisJCQljbGllbnQtPm5hbWUsIGloaWQtPmlycSwgcmV0KTsKIAogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTg0MSw2ICs4NDQsMTQgQEAKIH0KIAogI2lmZGVmIENPTkZJR19BQ1BJCisKKy8qIERlZmF1bHQgR1BJTyBtYXBwaW5nICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZ3Bpb19wYXJhbXMgaTJjX2hpZF9pcnFfZ3BpbyA9IHsgMCwgMCwgdHJ1ZSB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2dwaW9fbWFwcGluZyBpMmNfaGlkX2FjcGlfZ3Bpb3NbXSA9IHsKKwl7ICJncGlvcyIsICZpMmNfaGlkX2lycV9ncGlvLCAxIH0sCisJeyB9LAorfTsKKwogc3RhdGljIGludCBpMmNfaGlkX2FjcGlfcGRhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJc3RydWN0IGkyY19oaWRfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCiB7CkBAIC04NjYsNyArODc3LDcgQEAKIAlwZGF0YS0+aGlkX2Rlc2NyaXB0b3JfYWRkcmVzcyA9IG9iai0+aW50ZWdlci52YWx1ZTsKIAlBQ1BJX0ZSRUUob2JqKTsKIAotCXJldHVybiAwOworCXJldHVybiBhY3BpX2Rldl9hZGRfZHJpdmVyX2dwaW9zKGFkZXYsIGkyY19oaWRfYWNwaV9ncGlvcyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgaTJjX2hpZF9hY3BpX21hdGNoW10gPSB7CkBAIC05MzAsMTIgKzk0MSw2IEBACiAKIAlkYmdfaGlkKCJISUQgcHJvYmUgY2FsbGVkIGZvciBpMmMgMHglMDJ4XG4iLCBjbGllbnQtPmFkZHIpOwogCi0JaWYgKCFjbGllbnQtPmlycSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKLQkJCSJISUQgb3ZlciBpMmMgaGFzIG5vdCBiZWVuIHByb3ZpZGVkIGFuIEludCBJUlFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlpaGlkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGkyY19oaWQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWloaWQpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtOTU1LDYgKzk2MCwyMyBAQAogCQlpaGlkLT5wZGF0YSA9ICpwbGF0Zm9ybV9kYXRhOwogCX0KIAorCWlmIChjbGllbnQtPmlycSA+IDApIHsKKwkJaWhpZC0+aXJxID0gY2xpZW50LT5pcnE7CisJfSBlbHNlIGlmIChBQ1BJX0NPTVBBTklPTigmY2xpZW50LT5kZXYpKSB7CisJCWloaWQtPmRlc2MgPSBncGlvZF9nZXQoJmNsaWVudC0+ZGV2LCBOVUxMLCBHUElPRF9JTik7CisJCWlmIChJU19FUlIoaWhpZC0+ZGVzYykpIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGdldCBHUElPIGludGVycnVwdFxuIik7CisJCQlyZXR1cm4gUFRSX0VSUihpaGlkLT5kZXNjKTsKKwkJfQorCisJCWloaWQtPmlycSA9IGdwaW9kX3RvX2lycShpaGlkLT5kZXNjKTsKKwkJaWYgKGloaWQtPmlycSA8IDApIHsKKwkJCWdwaW9kX3B1dChpaGlkLT5kZXNjKTsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGNvbnZlcnQgR1BJTyB0byBJUlFcbiIpOworCQkJcmV0dXJuIGloaWQtPmlycTsKKwkJfQorCX0KKwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGloaWQpOwogCiAJaWhpZC0+Y2xpZW50ID0gY2xpZW50OwpAQCAtMTAxNywxMyArMTAzOSwxNiBAQAogCWhpZF9kZXN0cm95X2RldmljZShoaWQpOwogCiBlcnJfaXJxOgotCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBpaGlkKTsKKwlmcmVlX2lycShpaGlkLT5pcnEsIGloaWQpOwogCiBlcnJfcG06CiAJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZjbGllbnQtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZjbGllbnQtPmRldik7CiAKIGVycjoKKwlpZiAoaWhpZC0+ZGVzYykKKwkJZ3Bpb2RfcHV0KGloaWQtPmRlc2MpOworCiAJaTJjX2hpZF9mcmVlX2J1ZmZlcnMoaWhpZCk7CiAJa2ZyZWUoaWhpZCk7CiAJcmV0dXJuIHJldDsKQEAgLTEwNDIsMTMgKzEwNjcsMTggQEAKIAloaWQgPSBpaGlkLT5oaWQ7CiAJaGlkX2Rlc3Ryb3lfZGV2aWNlKGhpZCk7CiAKLQlmcmVlX2lycShjbGllbnQtPmlycSwgaWhpZCk7CisJZnJlZV9pcnEoaWhpZC0+aXJxLCBpaGlkKTsKIAogCWlmIChpaGlkLT5idWZzaXplKQogCQlpMmNfaGlkX2ZyZWVfYnVmZmVycyhpaGlkKTsKIAorCWlmIChpaGlkLT5kZXNjKQorCQlncGlvZF9wdXQoaWhpZC0+ZGVzYyk7CisKIAlrZnJlZShpaGlkKTsKIAorCWFjcGlfZGV2X3JlbW92ZV9kcml2ZXJfZ3Bpb3MoQUNQSV9DT01QQU5JT04oJmNsaWVudC0+ZGV2KSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA2MCw5ICsxMDkwLDkgQEAKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaWhpZC0+aGlkOwogCWludCByZXQgPSAwOwogCi0JZGlzYWJsZV9pcnEoY2xpZW50LT5pcnEpOworCWRpc2FibGVfaXJxKGloaWQtPmlycSk7CiAJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZjbGllbnQtPmRldikpCi0JCWVuYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSk7CisJCWVuYWJsZV9pcnFfd2FrZShpaGlkLT5pcnEpOwogCiAJaWYgKGhpZC0+ZHJpdmVyICYmIGhpZC0+ZHJpdmVyLT5zdXNwZW5kKQogCQlyZXQgPSBoaWQtPmRyaXZlci0+c3VzcGVuZChoaWQsIFBNU0dfU1VTUEVORCk7CkBAIC0xMDgwLDEzICsxMTEwLDEzIEBACiAJc3RydWN0IGkyY19oaWQgKmloaWQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3QgaGlkX2RldmljZSAqaGlkID0gaWhpZC0+aGlkOwogCi0JZW5hYmxlX2lycShjbGllbnQtPmlycSk7CisJZW5hYmxlX2lycShpaGlkLT5pcnEpOwogCXJldCA9IGkyY19oaWRfaHdyZXNldChjbGllbnQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAoZGV2aWNlX21heV93YWtldXAoJmNsaWVudC0+ZGV2KSkKLQkJZGlzYWJsZV9pcnFfd2FrZShjbGllbnQtPmlycSk7CisJCWRpc2FibGVfaXJxX3dha2UoaWhpZC0+aXJxKTsKIAogCWlmIChoaWQtPmRyaXZlciAmJiBoaWQtPmRyaXZlci0+cmVzZXRfcmVzdW1lKSB7CiAJCXJldCA9IGhpZC0+ZHJpdmVyLT5yZXNldF9yZXN1bWUoaGlkKTsKQEAgLTExMDEsMTcgKzExMzEsMTkgQEAKIHN0YXRpYyBpbnQgaTJjX2hpZF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGkyY19oaWQgKmloaWQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCWkyY19oaWRfc2V0X3Bvd2VyKGNsaWVudCwgSTJDX0hJRF9QV1JfU0xFRVApOwotCWRpc2FibGVfaXJxKGNsaWVudC0+aXJxKTsKKwlkaXNhYmxlX2lycShpaGlkLT5pcnEpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGkyY19oaWRfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGkyY19oaWQgKmloaWQgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCWVuYWJsZV9pcnEoY2xpZW50LT5pcnEpOworCWVuYWJsZV9pcnEoaWhpZC0+aXJxKTsKIAlpMmNfaGlkX3NldF9wb3dlcihjbGllbnQsIEkyQ19ISURfUFdSX09OKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYyBiL2RyaXZlcnMvaGlkL3VzYmhpZC9oaWQtcGlkZmYuYwppbmRleCAwYjUzMWM2Li4wODE3NGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXBpZGZmLmMKKysrIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1waWRmZi5jCkBAIC01NjgsNiArNTY4LDEyIEBACiAJaW50IHR5cGVfaWQ7CiAJaW50IGVycm9yOwogCisJcGlkZmYtPmJsb2NrX2xvYWRbUElEX0VGRkVDVF9CTE9DS19JTkRFWF0udmFsdWVbMF0gPSAwOworCWlmIChvbGQpIHsKKwkJcGlkZmYtPmJsb2NrX2xvYWRbUElEX0VGRkVDVF9CTE9DS19JTkRFWF0udmFsdWVbMF0gPQorCQkJcGlkZmYtPnBpZF9pZFtlZmZlY3QtPmlkXTsKKwl9CisKIAlzd2l0Y2ggKGVmZmVjdC0+dHlwZSkgewogCWNhc2UgRkZfQ09OU1RBTlQ6CiAJCWlmICghb2xkKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jIGIvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYwppbmRleCA5YmU5OWE2Ny4uYTc3NTE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvdXNiaGlkL2hpZC1xdWlya3MuYworKysgYi9kcml2ZXJzL2hpZC91c2JoaWQvaGlkLXF1aXJrcy5jCkBAIC03OCw2ICs3OCwxMyBAQAogCXsgVVNCX1ZFTkRPUl9JRF9FTE8sIFVTQl9ERVZJQ0VfSURfRUxPX1RTMjcwMCwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX0ZPUk1PU0EsIFVTQl9ERVZJQ0VfSURfRk9STU9TQV9JUl9SRUNFSVZFUiwgSElEX1FVSVJLX05PX0lOSVRfUkVQT1JUUyB9LAogCXsgVVNCX1ZFTkRPUl9JRF9GUkVFU0NBTEUsIFVTQl9ERVZJQ0VfSURfRlJFRVNDQUxFX01YMjgsIEhJRF9RVUlSS19OT0dFVCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9IUCwgVVNCX1BST0RVQ1RfSURfSFBfTE9HSVRFQ0hfT0VNX1VTQl9PUFRJQ0FMX01PVVNFXzBBNEEsIEhJRF9RVUlSS19BTFdBWVNfUE9MTCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9IUCwgVVNCX1BST0RVQ1RfSURfSFBfTE9HSVRFQ0hfT0VNX1VTQl9PUFRJQ0FMX01PVVNFXzBCNEEsIEhJRF9RVUlSS19BTFdBWVNfUE9MTCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9IUCwgVVNCX1BST0RVQ1RfSURfSFBfUElYQVJUX09FTV9VU0JfT1BUSUNBTF9NT1VTRSwgSElEX1FVSVJLX0FMV0FZU19QT0xMIH0sCisJeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX0MwNzcsIEhJRF9RVUlSS19BTFdBWVNfUE9MTCB9LAorCXsgVVNCX1ZFTkRPUl9JRF9MT0dJVEVDSCwgVVNCX0RFVklDRV9JRF9MT0dJVEVDSF9NT1VTRV9DMDFBLCBISURfUVVJUktfQUxXQVlTX1BPTEwgfSwKKwl7IFVTQl9WRU5ET1JfSURfTE9HSVRFQ0gsIFVTQl9ERVZJQ0VfSURfTE9HSVRFQ0hfTU9VU0VfQzA1QSwgSElEX1FVSVJLX0FMV0FZU19QT0xMIH0sCisJeyBVU0JfVkVORE9SX0lEX0xPR0lURUNILCBVU0JfREVWSUNFX0lEX0xPR0lURUNIX01PVVNFX0MwNkEsIEhJRF9RVUlSS19BTFdBWVNfUE9MTCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9NR0UsIFVTQl9ERVZJQ0VfSURfTUdFX1VQUywgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX01JQ1JPU09GVCwgVVNCX0RFVklDRV9JRF9NU19UWVBFX0NPVkVSXzMsIEhJRF9RVUlSS19OT19JTklUX1JFUE9SVFMgfSwKIAl7IFVTQl9WRU5ET1JfSURfTUlDUk9TT0ZULCBVU0JfREVWSUNFX0lEX01TX1RZUEVfQ09WRVJfM19KUCwgSElEX1FVSVJLX05PX0lOSVRfUkVQT1JUUyB9LApAQCAtOTEsNiArOTgsNyBAQAogCXsgVVNCX1ZFTkRPUl9JRF9QSVhBUlQsIFVTQl9ERVZJQ0VfSURfUElYQVJUX09QVElDQUxfVE9VQ0hfU0NSRUVOLCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCiAJeyBVU0JfVkVORE9SX0lEX1BJWEFSVCwgVVNCX0RFVklDRV9JRF9QSVhBUlRfT1BUSUNBTF9UT1VDSF9TQ1JFRU4xLCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCiAJeyBVU0JfVkVORE9SX0lEX1BJWEFSVCwgVVNCX0RFVklDRV9JRF9QSVhBUlRfT1BUSUNBTF9UT1VDSF9TQ1JFRU4yLCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCisJeyBVU0JfVkVORE9SX0lEX1BSSU1BWCwgVVNCX0RFVklDRV9JRF9QUklNQVhfTU9VU0VfNEQyMiwgSElEX1FVSVJLX0FMV0FZU19QT0xMIH0sCiAJeyBVU0JfVkVORE9SX0lEX1BST0RJR0UsIFVTQl9ERVZJQ0VfSURfUFJPRElHRV9DT1JETEVTUywgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1FVQU5UQSwgVVNCX0RFVklDRV9JRF9RVUFOVEFfT1BUSUNBTF9UT1VDSF8zMDAxLCBISURfUVVJUktfTk9HRVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfUVVBTlRBLCBVU0JfREVWSUNFX0lEX1FVQU5UQV9PUFRJQ0FMX1RPVUNIXzMwMDgsIEhJRF9RVUlSS19OT0dFVCB9LApAQCAtMTA2LDEyICsxMTQsOCBAQAogCXsgVVNCX1ZFTkRPUl9JRF9TWU1CT0wsIFVTQl9ERVZJQ0VfSURfU1lNQk9MX1NDQU5ORVJfMiwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1RQViwgVVNCX0RFVklDRV9JRF9UUFZfT1BUSUNBTF9UT1VDSFNDUkVFTiwgSElEX1FVSVJLX05PR0VUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1RVUkJPWCwgVVNCX0RFVklDRV9JRF9UVVJCT1hfS0VZQk9BUkQsIEhJRF9RVUlSS19OT0dFVCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9VQ0xPR0lDLCBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1BGMTIwOSwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCi0JeyBVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfV1A0MDMwVSwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfS05BNSwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX1VDTE9HSUMsIFVTQl9ERVZJQ0VfSURfVUNMT0dJQ19UQUJMRVRfVFdBNjAsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9VQ0xPR0lDLCBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1dQNTU0MFUsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAotCXsgVVNCX1ZFTkRPUl9JRF9VQ0xPR0lDLCBVU0JfREVWSUNFX0lEX1VDTE9HSUNfVEFCTEVUX1dQODA2MFUsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9XQUxUT1AsIFVTQl9ERVZJQ0VfSURfV0FMVE9QX01FRElBX1RBQkxFVF8xMF82X0lOQ0gsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9XQUxUT1AsIFVTQl9ERVZJQ0VfSURfV0FMVE9QX01FRElBX1RBQkxFVF8xNF8xX0lOQ0gsIEhJRF9RVUlSS19NVUxUSV9JTlBVVCB9LAogCXsgVVNCX1ZFTkRPUl9JRF9XQUxUT1AsIFVTQl9ERVZJQ0VfSURfV0FMVE9QX1NJUklVU19CQVRURVJZX0ZSRUVfVEFCTEVULCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKQEAgLTEyNyw2ICsxMzEsNyBAQAogCXsgVVNCX1ZFTkRPUl9JRF9LWUUsIFVTQl9ERVZJQ0VfSURfS1lFX01PVVNFUEVOX0k2MDhYLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfS1lFLCBVU0JfREVWSUNFX0lEX0tZRV9NT1VTRVBFTl9JNjA4WF8yLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKIAl7IFVTQl9WRU5ET1JfSURfS1lFLCBVU0JfREVWSUNFX0lEX0tZRV9FQVNZUEVOX002MTBYLCBISURfUVVJUktfTVVMVElfSU5QVVQgfSwKKwl7IFVTQl9WRU5ET1JfSURfS1lFLCBVU0JfREVWSUNFX0lEX0tZRV9QRU5TS0VUQ0hfTTkxMiwgSElEX1FVSVJLX01VTFRJX0lOUFVUIH0sCiAJeyBVU0JfVkVORE9SX0lEX05UUklHLCBVU0JfREVWSUNFX0lEX05UUklHX0RVT1NFTlNFLCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCiAJeyBVU0JfVkVORE9SX0lEX1NFTUlDTywgVVNCX0RFVklDRV9JRF9TRU1JQ09fVVNCX0tFWUtPQVJELCBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTIH0sCiAJeyBVU0JfVkVORE9SX0lEX1NZTkFQVElDUywgVVNCX0RFVklDRV9JRF9TWU5BUFRJQ1NfTFRTMSwgSElEX1FVSVJLX05PX0lOSVRfUkVQT1JUUyB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9oaWQvd2Fjb20uaCBiL2RyaXZlcnMvaGlkL3dhY29tLmgKaW5kZXggN2RiNDMyOC4uMDI0ZjRkODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3dhY29tLmgKKysrIGIvZHJpdmVycy9oaWQvd2Fjb20uaApAQCAtMTE5LDggKzExOSwxMCBAQAogCQl1OCBpbWdfbHVtOyAgIC8qIE9MRUQgbWF0cml4IGRpc3BsYXkgYnJpZ2h0bmVzcyAqLwogCX0gbGVkOwogCWJvb2wgbGVkX2luaXRpYWxpemVkOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0dGVyeTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGFjOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYWM7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGJhdHRlcnlfZGVzYzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYWNfZGVzYzsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB3YWNvbV9zY2hlZHVsZV93b3JrKHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYykKQEAgLTEyOSwxMyArMTMxLDYgQEAKIAlzY2hlZHVsZV93b3JrKCZ3YWNvbS0+d29yayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB3YWNvbV9ub3RpZnlfYmF0dGVyeShzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpCi17Ci0Jc3RydWN0IHdhY29tICp3YWNvbSA9IGNvbnRhaW5lcl9vZih3YWNvbV93YWMsIHN0cnVjdCB3YWNvbSwgd2Fjb21fd2FjKTsKLQotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZ3YWNvbS0+YmF0dGVyeSk7Ci19Ci0KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaGlkX2RldmljZV9pZCB3YWNvbV9pZHNbXTsKIAogdm9pZCB3YWNvbV93YWNfaXJxKHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYywgc2l6ZV90IGxlbik7CkBAIC0xNDksNCArMTQ0LDUgQEAKIGludCB3YWNvbV93YWNfZXZlbnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsIHN0cnVjdCBoaWRfZmllbGQgKmZpZWxkLAogCQlzdHJ1Y3QgaGlkX3VzYWdlICp1c2FnZSwgX19zMzIgdmFsdWUpOwogdm9pZCB3YWNvbV93YWNfcmVwb3J0KHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2LCBzdHJ1Y3QgaGlkX3JlcG9ydCAqcmVwb3J0KTsKK3ZvaWQgd2Fjb21fYmF0dGVyeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3dhY29tX3N5cy5jIGIvZHJpdmVycy9oaWQvd2Fjb21fc3lzLmMKaW5kZXggZjA1NjhhNy4uZTg2MDdkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvd2Fjb21fc3lzLmMKKysrIGIvZHJpdmVycy9oaWQvd2Fjb21fc3lzLmMKQEAgLTQwNiw2ICs0MDYsOSBAQAogCQllbHNlIGlmIChmZWF0dXJlcy0+dHlwZSA9PSBXQUNPTV8yN1FIRFQpIHsKIAkJCXJldHVybiB3YWNvbV9zZXRfZGV2aWNlX21vZGUoaGRldiwgMTMxLCAzLCAyKTsKIAkJfQorCQllbHNlIGlmIChmZWF0dXJlcy0+dHlwZSA9PSBCQU1CT09fUEFEKSB7CisJCQlyZXR1cm4gd2Fjb21fc2V0X2RldmljZV9tb2RlKGhkZXYsIDIsIDIsIDIpOworCQl9CiAJfSBlbHNlIGlmIChmZWF0dXJlcy0+ZGV2aWNlX3R5cGUgPT0gQlROX1RPT0xfUEVOKSB7CiAJCWlmIChmZWF0dXJlcy0+dHlwZSA8PSBCQU1CT09fUFQgJiYgZmVhdHVyZXMtPnR5cGUgIT0gV0lSRUxFU1MpIHsKIAkJCXJldHVybiB3YWNvbV9zZXRfZGV2aWNlX21vZGUoaGRldiwgMiwgMiwgMik7CkBAIC01MjQsNiArNTI3LDExIEBACiAKIAl3YWNvbV93YWMtPnNoYXJlZCA9ICZkYXRhLT5zaGFyZWQ7CiAKKwlpZiAod2Fjb21fd2FjLT5mZWF0dXJlcy5kZXZpY2VfdHlwZSA9PSBCVE5fVE9PTF9GSU5HRVIpCisJCXdhY29tX3dhYy0+c2hhcmVkLT50b3VjaCA9IGhkZXY7CisJZWxzZSBpZiAod2Fjb21fd2FjLT5mZWF0dXJlcy5kZXZpY2VfdHlwZSA9PSBCVE5fVE9PTF9QRU4pCisJCXdhY29tX3dhYy0+c2hhcmVkLT5wZW4gPSBoZGV2OworCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZ3YWNvbV91ZGV2X2xpc3RfbG9jayk7CiAJcmV0dXJuIHJldHZhbDsKQEAgLTU0MSwxNCArNTQ5LDIyIEBACiAJa2ZyZWUoZGF0YSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdhY29tX3JlbW92ZV9zaGFyZWRfZGF0YShzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSkKK3N0YXRpYyB2b2lkIHdhY29tX3JlbW92ZV9zaGFyZWRfZGF0YShzdHJ1Y3Qgd2Fjb20gKndhY29tKQogewogCXN0cnVjdCB3YWNvbV9oZGV2X2RhdGEgKmRhdGE7CisJc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjID0gJndhY29tLT53YWNvbV93YWM7CiAKLQlpZiAod2Fjb20tPnNoYXJlZCkgewotCQlkYXRhID0gY29udGFpbmVyX29mKHdhY29tLT5zaGFyZWQsIHN0cnVjdCB3YWNvbV9oZGV2X2RhdGEsIHNoYXJlZCk7CisJaWYgKHdhY29tX3dhYy0+c2hhcmVkKSB7CisJCWRhdGEgPSBjb250YWluZXJfb2Yod2Fjb21fd2FjLT5zaGFyZWQsIHN0cnVjdCB3YWNvbV9oZGV2X2RhdGEsCisJCQkJICAgIHNoYXJlZCk7CisKKwkJaWYgKHdhY29tX3dhYy0+c2hhcmVkLT50b3VjaCA9PSB3YWNvbS0+aGRldikKKwkJCXdhY29tX3dhYy0+c2hhcmVkLT50b3VjaCA9IE5VTEw7CisJCWVsc2UgaWYgKHdhY29tX3dhYy0+c2hhcmVkLT5wZW4gPT0gd2Fjb20tPmhkZXYpCisJCQl3YWNvbV93YWMtPnNoYXJlZC0+cGVuID0gTlVMTDsKKwogCQlrcmVmX3B1dCgmZGF0YS0+a3JlZiwgd2Fjb21fcmVsZWFzZV9zaGFyZWRfZGF0YSk7Ci0JCXdhY29tLT5zaGFyZWQgPSBOVUxMOworCQl3YWNvbV93YWMtPnNoYXJlZCA9IE5VTEw7CiAJfQogfQogCkBAIC05MjksNiArOTQ1LDcgQEAKIH0KIAogc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHdhY29tX2JhdHRlcnlfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAogCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKIAlQT1dFUl9TVVBQTFlfUFJPUF9TQ09QRSwKIAlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWQpAQCAtOTQ0LDEwICs5NjEsMTMgQEAKIAkJCQkgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IHdhY29tLCBiYXR0ZXJ5KTsKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKHBzcCkgeworCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCQl2YWwtPmludHZhbCA9IHdhY29tLT53YWNvbV93YWMuYmF0X2Nvbm5lY3RlZDsKKwkJCWJyZWFrOwogCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NDT1BFOgogCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU0NPUEVfREVWSUNFOwogCQkJYnJlYWs7CkBAIC05NjEsNiArOTgxLDggQEAKIAkJCWVsc2UgaWYgKHdhY29tLT53YWNvbV93YWMuYmF0dGVyeV9jYXBhY2l0eSA9PSAxMDAgJiYKIAkJCQkgICAgd2Fjb20tPndhY29tX3dhYy5wc19jb25uZWN0ZWQpCiAJCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisJCQllbHNlIGlmICh3YWNvbS0+d2Fjb21fd2FjLnBzX2Nvbm5lY3RlZCkKKwkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwogCQkJZWxzZQogCQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKIAkJCWJyZWFrOwpAQCAtOTc2LDcgKzk5OCw3IEBACiAJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IHdhY29tICp3YWNvbSA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCB3YWNvbSwgYWMpOworCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAlpbnQgcmV0ID0gMDsKIAogCXN3aXRjaCAocHNwKSB7CkBAIC05OTgsNDIgKzEwMjAsNDYgQEAKIHN0YXRpYyBpbnQgd2Fjb21faW5pdGlhbGl6ZV9iYXR0ZXJ5KHN0cnVjdCB3YWNvbSAqd2Fjb20pCiB7CiAJc3RhdGljIGF0b21pY190IGJhdHRlcnlfbm8gPSBBVE9NSUNfSU5JVCgwKTsKLQlpbnQgZXJyb3I7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHsgLmRydl9kYXRhID0gd2Fjb20sIH07CiAJdW5zaWduZWQgbG9uZyBuOwogCiAJaWYgKHdhY29tLT53YWNvbV93YWMuZmVhdHVyZXMucXVpcmtzICYgV0FDT01fUVVJUktfQkFUVEVSWSkgeworCQlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKmJhdF9kZXNjID0gJndhY29tLT5iYXR0ZXJ5X2Rlc2M7CisJCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqYWNfZGVzYyA9ICZ3YWNvbS0+YWNfZGVzYzsKIAkJbiA9IGF0b21pY19pbmNfcmV0dXJuKCZiYXR0ZXJ5X25vKSAtIDE7CiAKLQkJd2Fjb20tPmJhdHRlcnkucHJvcGVydGllcyA9IHdhY29tX2JhdHRlcnlfcHJvcHM7Ci0JCXdhY29tLT5iYXR0ZXJ5Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3YWNvbV9iYXR0ZXJ5X3Byb3BzKTsKLQkJd2Fjb20tPmJhdHRlcnkuZ2V0X3Byb3BlcnR5ID0gd2Fjb21fYmF0dGVyeV9nZXRfcHJvcGVydHk7CisJCWJhdF9kZXNjLT5wcm9wZXJ0aWVzID0gd2Fjb21fYmF0dGVyeV9wcm9wczsKKwkJYmF0X2Rlc2MtPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3YWNvbV9iYXR0ZXJ5X3Byb3BzKTsKKwkJYmF0X2Rlc2MtPmdldF9wcm9wZXJ0eSA9IHdhY29tX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwogCQlzcHJpbnRmKHdhY29tLT53YWNvbV93YWMuYmF0X25hbWUsICJ3YWNvbV9iYXR0ZXJ5XyVsZCIsIG4pOwotCQl3YWNvbS0+YmF0dGVyeS5uYW1lID0gd2Fjb20tPndhY29tX3dhYy5iYXRfbmFtZTsKLQkJd2Fjb20tPmJhdHRlcnkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JCXdhY29tLT5iYXR0ZXJ5LnVzZV9mb3JfYXBtID0gMDsKKwkJYmF0X2Rlc2MtPm5hbWUgPSB3YWNvbS0+d2Fjb21fd2FjLmJhdF9uYW1lOworCQliYXRfZGVzYy0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CisJCWJhdF9kZXNjLT51c2VfZm9yX2FwbSA9IDA7CiAKLQkJd2Fjb20tPmFjLnByb3BlcnRpZXMgPSB3YWNvbV9hY19wcm9wczsKLQkJd2Fjb20tPmFjLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3YWNvbV9hY19wcm9wcyk7Ci0JCXdhY29tLT5hYy5nZXRfcHJvcGVydHkgPSB3YWNvbV9hY19nZXRfcHJvcGVydHk7CisJCWFjX2Rlc2MtPnByb3BlcnRpZXMgPSB3YWNvbV9hY19wcm9wczsKKwkJYWNfZGVzYy0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdhY29tX2FjX3Byb3BzKTsKKwkJYWNfZGVzYy0+Z2V0X3Byb3BlcnR5ID0gd2Fjb21fYWNfZ2V0X3Byb3BlcnR5OwogCQlzcHJpbnRmKHdhY29tLT53YWNvbV93YWMuYWNfbmFtZSwgIndhY29tX2FjXyVsZCIsIG4pOwotCQl3YWNvbS0+YWMubmFtZSA9IHdhY29tLT53YWNvbV93YWMuYWNfbmFtZTsKLQkJd2Fjb20tPmFjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKLQkJd2Fjb20tPmFjLnVzZV9mb3JfYXBtID0gMDsKKwkJYWNfZGVzYy0+bmFtZSA9IHdhY29tLT53YWNvbV93YWMuYWNfbmFtZTsKKwkJYWNfZGVzYy0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOworCQlhY19kZXNjLT51c2VfZm9yX2FwbSA9IDA7CiAKLQkJZXJyb3IgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJndhY29tLT5oZGV2LT5kZXYsCi0JCQkJCSAgICAgICZ3YWNvbS0+YmF0dGVyeSk7Ci0JCWlmIChlcnJvcikKLQkJCXJldHVybiBlcnJvcjsKKwkJd2Fjb20tPmJhdHRlcnkgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJndhY29tLT5oZGV2LT5kZXYsCisJCQkJCSAgICAgICZ3YWNvbS0+YmF0dGVyeV9kZXNjLCAmcHN5X2NmZyk7CisJCWlmIChJU19FUlIod2Fjb20tPmJhdHRlcnkpKQorCQkJcmV0dXJuIFBUUl9FUlIod2Fjb20tPmJhdHRlcnkpOwogCi0JCXBvd2VyX3N1cHBseV9wb3dlcnMoJndhY29tLT5iYXR0ZXJ5LCAmd2Fjb20tPmhkZXYtPmRldik7CisJCXBvd2VyX3N1cHBseV9wb3dlcnMod2Fjb20tPmJhdHRlcnksICZ3YWNvbS0+aGRldi0+ZGV2KTsKIAotCQllcnJvciA9IHBvd2VyX3N1cHBseV9yZWdpc3Rlcigmd2Fjb20tPmhkZXYtPmRldiwgJndhY29tLT5hYyk7Ci0JCWlmIChlcnJvcikgewotCQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJndhY29tLT5iYXR0ZXJ5KTsKLQkJCXJldHVybiBlcnJvcjsKKwkJd2Fjb20tPmFjID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZ3YWNvbS0+aGRldi0+ZGV2LAorCQkJCQkJICAmd2Fjb20tPmFjX2Rlc2MsCisJCQkJCQkgICZwc3lfY2ZnKTsKKwkJaWYgKElTX0VSUih3YWNvbS0+YWMpKSB7CisJCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcih3YWNvbS0+YmF0dGVyeSk7CisJCQlyZXR1cm4gUFRSX0VSUih3YWNvbS0+YWMpOwogCQl9CiAKLQkJcG93ZXJfc3VwcGx5X3Bvd2Vycygmd2Fjb20tPmFjLCAmd2Fjb20tPmhkZXYtPmRldik7CisJCXBvd2VyX3N1cHBseV9wb3dlcnMod2Fjb20tPmFjLCAmd2Fjb20tPmhkZXYtPmRldik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMDQxLDEyICsxMDY3LDExIEBACiAKIHN0YXRpYyB2b2lkIHdhY29tX2Rlc3Ryb3lfYmF0dGVyeShzdHJ1Y3Qgd2Fjb20gKndhY29tKQogewotCWlmICgod2Fjb20tPndhY29tX3dhYy5mZWF0dXJlcy5xdWlya3MgJiBXQUNPTV9RVUlSS19CQVRURVJZKSAmJgotCSAgICAgd2Fjb20tPmJhdHRlcnkuZGV2KSB7Ci0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZ3YWNvbS0+YmF0dGVyeSk7Ci0JCXdhY29tLT5iYXR0ZXJ5LmRldiA9IE5VTEw7Ci0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZ3YWNvbS0+YWMpOwotCQl3YWNvbS0+YWMuZGV2ID0gTlVMTDsKKwlpZiAod2Fjb20tPmJhdHRlcnkpIHsKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIod2Fjb20tPmJhdHRlcnkpOworCQl3YWNvbS0+YmF0dGVyeSA9IE5VTEw7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHdhY29tLT5hYyk7CisJCXdhY29tLT5hYyA9IE5VTEw7CiAJfQogfQogCkBAIC0xMzEzLDYgKzEzMzgsMjAgQEAKIAlyZXR1cm47CiB9CiAKK3ZvaWQgd2Fjb21fYmF0dGVyeV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgd2Fjb20gKndhY29tID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3YWNvbSwgd29yayk7CisKKwlpZiAoKHdhY29tLT53YWNvbV93YWMuZmVhdHVyZXMucXVpcmtzICYgV0FDT01fUVVJUktfQkFUVEVSWSkgJiYKKwkgICAgICF3YWNvbS0+YmF0dGVyeSkgeworCQl3YWNvbV9pbml0aWFsaXplX2JhdHRlcnkod2Fjb20pOworCX0KKwllbHNlIGlmICghKHdhY29tLT53YWNvbV93YWMuZmVhdHVyZXMucXVpcmtzICYgV0FDT01fUVVJUktfQkFUVEVSWSkgJiYKKwkJIHdhY29tLT5iYXR0ZXJ5KSB7CisJCXdhY29tX2Rlc3Ryb3lfYmF0dGVyeSh3YWNvbSk7CisJfQorfQorCiAvKgogICogTm90IGFsbCBkZXZpY2VzIHJlcG9ydCBwaHlzaWNhbCBkaW1lbnNpb25zIGZyb20gSElELgogICogQ29tcHV0ZSB0aGUgZGVmYXVsdCBmcm9tIGhhcmRjb2RlZCBsb2dpY2FsIGRpbWVuc2lvbgpAQCAtMTM3Myw2ICsxNDEyLDkgQEAKIAogCWhkZXYtPnF1aXJrcyB8PSBISURfUVVJUktfTk9fSU5JVF9SRVBPUlRTOwogCisJLyogaGlkLWNvcmUgc2V0cyB0aGlzIHF1aXJrIGZvciB0aGUgYm9vdCBpbnRlcmZhY2UgKi8KKwloZGV2LT5xdWlya3MgJj0gfkhJRF9RVUlSS19OT0dFVDsKKwogCXdhY29tID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdhY29tKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF3YWNvbSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNDEyLDYgKzE0NTQsMjEgQEAKIAkJCWdvdG8gZmFpbF9hbGxvY2F0ZV9pbnB1dHM7CiAJfQogCisJLyoKKwkgKiBCYW1ib28gUGFkIGhhcyBhIGdlbmVyaWMgaGlkIGhhbmRsaW5nIGZvciB0aGUgUGVuLCBhbmQgd2Ugc3dpdGNoIGl0CisJICogaW50byBkZWJ1ZyBtb2RlIGZvciB0aGUgdG91Y2ggcGFydC4KKwkgKiBXZSBpZ25vcmUgdGhlIG90aGVyIGludGVyZmFjZXMuCisJICovCisJaWYgKGZlYXR1cmVzLT50eXBlID09IEJBTUJPT19QQUQpIHsKKwkJaWYgKGZlYXR1cmVzLT5wa3RsZW4gPT0gV0FDT01fUEtHTEVOX1BFTkFCTEVEKSB7CisJCQlmZWF0dXJlcy0+dHlwZSA9IEhJRF9HRU5FUklDOworCQl9IGVsc2UgaWYgKChmZWF0dXJlcy0+cGt0bGVuICE9IFdBQ09NX1BLR0xFTl9CUEFEX1RPVUNIKSAmJgorCQkJICAgKGZlYXR1cmVzLT5wa3RsZW4gIT0gV0FDT01fUEtHTEVOX0JQQURfVE9VQ0hfVVNCKSkgeworCQkJZXJyb3IgPSAtRU5PREVWOworCQkJZ290byBmYWlsX3NoYXJlZF9kYXRhOworCQl9CisJfQorCiAJLyogc2V0IHRoZSBkZWZhdWx0IHNpemUgaW4gY2FzZSB3ZSBkbyBub3QgZ2V0IHRoZW0gZnJvbSBoaWQgKi8KIAl3YWNvbV9zZXRfZGVmYXVsdF9waHkoZmVhdHVyZXMpOwogCkBAIC0xNDQ2LDYgKzE1MDMsMTIgQEAKIAkJZmVhdHVyZXMtPnlfbWF4ID0gNDA5NjsKIAl9CiAKKwkvKgorCSAqIFNhbWUgdGhpbmcgZm9yIEJhbWJvbyBQQUQKKwkgKi8KKwlpZiAoZmVhdHVyZXMtPnR5cGUgPT0gQkFNQk9PX1BBRCkKKwkJZmVhdHVyZXMtPmRldmljZV90eXBlID0gQlROX1RPT0xfRklOR0VSOworCiAJaWYgKGhkZXYtPmJ1cyA9PSBCVVNfQkxVRVRPT1RIKQogCQlmZWF0dXJlcy0+cXVpcmtzIHw9IFdBQ09NX1FVSVJLX0JBVFRFUlk7CiAKQEAgLTE0NjIsMTkgKzE1MjUsMTcgQEAKIAlzbnByaW50Zih3YWNvbV93YWMtPnBhZF9uYW1lLCBzaXplb2Yod2Fjb21fd2FjLT5wYWRfbmFtZSksCiAJCSIlcyBQYWQiLCBmZWF0dXJlcy0+bmFtZSk7CiAKLQlpZiAoZmVhdHVyZXMtPnF1aXJrcyAmIFdBQ09NX1FVSVJLX01VTFRJX0lOUFVUKSB7Ci0JCS8qIEFwcGVuZCB0aGUgZGV2aWNlIHR5cGUgdG8gdGhlIG5hbWUgKi8KLQkJaWYgKGZlYXR1cmVzLT5kZXZpY2VfdHlwZSAhPSBCVE5fVE9PTF9GSU5HRVIpCi0JCQlzdHJsY2F0KHdhY29tX3dhYy0+bmFtZSwgIiBQZW4iLCBXQUNPTV9OQU1FX01BWCk7Ci0JCWVsc2UgaWYgKGZlYXR1cmVzLT50b3VjaF9tYXgpCi0JCQlzdHJsY2F0KHdhY29tX3dhYy0+bmFtZSwgIiBGaW5nZXIiLCBXQUNPTV9OQU1FX01BWCk7Ci0JCWVsc2UKLQkJCXN0cmxjYXQod2Fjb21fd2FjLT5uYW1lLCAiIFBhZCIsIFdBQ09NX05BTUVfTUFYKTsKKwkvKiBBcHBlbmQgdGhlIGRldmljZSB0eXBlIHRvIHRoZSBuYW1lICovCisJaWYgKGZlYXR1cmVzLT5kZXZpY2VfdHlwZSAhPSBCVE5fVE9PTF9GSU5HRVIpCisJCXN0cmxjYXQod2Fjb21fd2FjLT5uYW1lLCAiIFBlbiIsIFdBQ09NX05BTUVfTUFYKTsKKwllbHNlIGlmIChmZWF0dXJlcy0+dG91Y2hfbWF4KQorCQlzdHJsY2F0KHdhY29tX3dhYy0+bmFtZSwgIiBGaW5nZXIiLCBXQUNPTV9OQU1FX01BWCk7CisJZWxzZQorCQlzdHJsY2F0KHdhY29tX3dhYy0+bmFtZSwgIiBQYWQiLCBXQUNPTV9OQU1FX01BWCk7CiAKLQkJZXJyb3IgPSB3YWNvbV9hZGRfc2hhcmVkX2RhdGEoaGRldik7Ci0JCWlmIChlcnJvcikKLQkJCWdvdG8gZmFpbF9zaGFyZWRfZGF0YTsKLQl9CisJZXJyb3IgPSB3YWNvbV9hZGRfc2hhcmVkX2RhdGEoaGRldik7CisJaWYgKGVycm9yKQorCQlnb3RvIGZhaWxfc2hhcmVkX2RhdGE7CiAKIAlpZiAoIShmZWF0dXJlcy0+cXVpcmtzICYgV0FDT01fUVVJUktfTU9OSVRPUikgJiYKIAkgICAgIChmZWF0dXJlcy0+cXVpcmtzICYgV0FDT01fUVVJUktfQkFUVEVSWSkpIHsKQEAgLTE1MjcsNyArMTU4OCw3IEBACiAJd2Fjb21fY2xlYW5faW5wdXRzKHdhY29tKTsKIAl3YWNvbV9kZXN0cm95X2JhdHRlcnkod2Fjb20pOwogZmFpbF9iYXR0ZXJ5OgotCXdhY29tX3JlbW92ZV9zaGFyZWRfZGF0YSh3YWNvbV93YWMpOworCXdhY29tX3JlbW92ZV9zaGFyZWRfZGF0YSh3YWNvbSk7CiBmYWlsX3NoYXJlZF9kYXRhOgogCXdhY29tX2NsZWFuX2lucHV0cyh3YWNvbSk7CiBmYWlsX2FsbG9jYXRlX2lucHV0czoKQEAgLTE1NTAsNyArMTYxMSw3IEBACiAJaWYgKGhkZXYtPmJ1cyA9PSBCVVNfQkxVRVRPT1RIKQogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmhkZXYtPmRldiwgJmRldl9hdHRyX3NwZWVkKTsKIAl3YWNvbV9kZXN0cm95X2JhdHRlcnkod2Fjb20pOwotCXdhY29tX3JlbW92ZV9zaGFyZWRfZGF0YSgmd2Fjb20tPndhY29tX3dhYyk7CisJd2Fjb21fcmVtb3ZlX3NoYXJlZF9kYXRhKHdhY29tKTsKIAogCWhpZF9zZXRfZHJ2ZGF0YShoZGV2LCBOVUxMKTsKIAlrZnJlZSh3YWNvbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC93YWNvbV93YWMuYyBiL2RyaXZlcnMvaGlkL3dhY29tX3dhYy5jCmluZGV4IDA0NjM1MWMuLmZhNTRkMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL3dhY29tX3dhYy5jCisrKyBiL2RyaXZlcnMvaGlkL3dhY29tX3dhYy5jCkBAIC00NSw2ICs0NSwyNyBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgc2hvcnQgYmF0Y2FwX2k0WzhdID0geyAxLCAxNSwgMzAsIDQ1LCA2MCwgNzAsIDg1LCAxMDAgfTsKIAorc3RhdGljIHZvaWQgd2Fjb21fbm90aWZ5X2JhdHRlcnkoc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjLAorCWludCBiYXRfY2FwYWNpdHksIGJvb2wgYmF0X2NoYXJnaW5nLCBib29sIGJhdF9jb25uZWN0ZWQsCisJYm9vbCBwc19jb25uZWN0ZWQpCit7CisJc3RydWN0IHdhY29tICp3YWNvbSA9IGNvbnRhaW5lcl9vZih3YWNvbV93YWMsIHN0cnVjdCB3YWNvbSwgd2Fjb21fd2FjKTsKKwlib29sIGNoYW5nZWQgPSB3YWNvbV93YWMtPmJhdHRlcnlfY2FwYWNpdHkgIT0gYmF0X2NhcGFjaXR5ICB8fAorCQkgICAgICAgd2Fjb21fd2FjLT5iYXRfY2hhcmdpbmcgICAgICE9IGJhdF9jaGFyZ2luZyAgfHwKKwkJICAgICAgIHdhY29tX3dhYy0+YmF0X2Nvbm5lY3RlZCAgICAhPSBiYXRfY29ubmVjdGVkIHx8CisJCSAgICAgICB3YWNvbV93YWMtPnBzX2Nvbm5lY3RlZCAgICAgIT0gcHNfY29ubmVjdGVkOworCisJaWYgKGNoYW5nZWQpIHsKKwkJd2Fjb21fd2FjLT5iYXR0ZXJ5X2NhcGFjaXR5ID0gYmF0X2NhcGFjaXR5OworCQl3YWNvbV93YWMtPmJhdF9jaGFyZ2luZyA9IGJhdF9jaGFyZ2luZzsKKwkJd2Fjb21fd2FjLT5iYXRfY29ubmVjdGVkID0gYmF0X2Nvbm5lY3RlZDsKKwkJd2Fjb21fd2FjLT5wc19jb25uZWN0ZWQgPSBwc19jb25uZWN0ZWQ7CisKKwkJaWYgKHdhY29tLT5iYXR0ZXJ5KQorCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQod2Fjb20tPmJhdHRlcnkpOworCX0KK30KKwogc3RhdGljIGludCB3YWNvbV9wZW5wYXJ0bmVyX2lycShzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSkKIHsKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gd2Fjb20tPmRhdGE7CkBAIC00MTksMTcgKzQ0MCwyNiBAQAogCQlydyA9IChkYXRhWzddID4+IDIgJiAweDA3KTsKIAkJYmF0dGVyeV9jYXBhY2l0eSA9IGJhdGNhcF9ncltyd107CiAJCXBzX2Nvbm5lY3RlZCA9IHJ3ID09IDc7Ci0JCWlmICgod2Fjb20tPmJhdHRlcnlfY2FwYWNpdHkgIT0gYmF0dGVyeV9jYXBhY2l0eSkgfHwKLQkJICAgICh3YWNvbS0+cHNfY29ubmVjdGVkICE9IHBzX2Nvbm5lY3RlZCkpIHsKLQkJCXdhY29tLT5iYXR0ZXJ5X2NhcGFjaXR5ID0gYmF0dGVyeV9jYXBhY2l0eTsKLQkJCXdhY29tLT5wc19jb25uZWN0ZWQgPSBwc19jb25uZWN0ZWQ7Ci0JCQl3YWNvbV9ub3RpZnlfYmF0dGVyeSh3YWNvbSk7Ci0JCX0KKwkJd2Fjb21fbm90aWZ5X2JhdHRlcnkod2Fjb20sIGJhdHRlcnlfY2FwYWNpdHksIHBzX2Nvbm5lY3RlZCwKKwkJCQkgICAgIDEsIHBzX2Nvbm5lY3RlZCk7CiAJfQogZXhpdDoKIAlyZXR1cm4gcmV0dmFsOwogfQogCitzdGF0aWMgdm9pZCB3YWNvbV9pbnR1b3Nfc2NoZWR1bGVfcHJveF9ldmVudChzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMpCit7CisJc3RydWN0IHdhY29tICp3YWNvbSA9IGNvbnRhaW5lcl9vZih3YWNvbV93YWMsIHN0cnVjdCB3YWNvbSwgd2Fjb21fd2FjKTsKKwlzdHJ1Y3QgaGlkX3JlcG9ydCAqcjsKKwlzdHJ1Y3QgaGlkX3JlcG9ydF9lbnVtICpyZTsKKworCXJlID0gJih3YWNvbS0+aGRldi0+cmVwb3J0X2VudW1bSElEX0ZFQVRVUkVfUkVQT1JUXSk7CisJciA9IHJlLT5yZXBvcnRfaWRfaGFzaFtXQUNPTV9SRVBPUlRfSU5UVU9TUkVBRF07CisJaWYgKHIpIHsKKwkJaGlkX2h3X3JlcXVlc3Qod2Fjb20tPmhkZXYsIHIsIEhJRF9SRVFfR0VUX1JFUE9SVCk7CisJfQorfQorCiBzdGF0aWMgaW50IHdhY29tX2ludHVvc19pbm91dChzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSkKIHsKIAlzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgKmZlYXR1cmVzID0gJndhY29tLT5mZWF0dXJlczsKQEAgLTU1MSw4ICs1ODEsOSBAQAogCSAgIChmZWF0dXJlcy0+dHlwZSA9PSBDSU5USVEgJiYgIShkYXRhWzFdICYgMHg0MCkpKQogCQlyZXR1cm4gMTsKIAotCWlmIChmZWF0dXJlcy0+cXVpcmtzICYgV0FDT01fUVVJUktfTVVMVElfSU5QVVQpCi0JCXdhY29tLT5zaGFyZWQtPnN0eWx1c19pbl9wcm94aW1pdHkgPSB0cnVlOworCXdhY29tLT5zaGFyZWQtPnN0eWx1c19pbl9wcm94aW1pdHkgPSB0cnVlOworCWlmICh3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duKQorCQlyZXR1cm4gMTsKIAogCS8qIGluIFJhbmdlIHdoaWxlIGV4aXRpbmcgKi8KIAlpZiAoKChkYXRhWzFdICYgMHhmZSkgPT0gMHgyMCkgJiYgd2Fjb20tPnJlcG9ydGluZ19kYXRhKSB7CkBAIC01NjQsOCArNTk1LDcgQEAKIAogCS8qIEV4aXQgcmVwb3J0ICovCiAJaWYgKChkYXRhWzFdICYgMHhmZSkgPT0gMHg4MCkgewotCQlpZiAoZmVhdHVyZXMtPnF1aXJrcyAmIFdBQ09NX1FVSVJLX01VTFRJX0lOUFVUKQotCQkJd2Fjb20tPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eSA9IGZhbHNlOworCQl3YWNvbS0+c2hhcmVkLT5zdHlsdXNfaW5fcHJveGltaXR5ID0gZmFsc2U7CiAJCXdhY29tLT5yZXBvcnRpbmdfZGF0YSA9IGZhbHNlOwogCiAJCS8qIGRvbid0IHJlcG9ydCBleGl0IGlmIHdlIGRvbid0IGtub3cgdGhlIElEICovCkBAIC02MDYsOCArNjM2LDExIEBACiAJfQogCiAJLyogZG9uJ3QgcmVwb3J0IG90aGVyIGV2ZW50cyBpZiB3ZSBkb24ndCBrbm93IHRoZSBJRCAqLwotCWlmICghd2Fjb20tPmlkW2lkeF0pCisJaWYgKCF3YWNvbS0+aWRbaWR4XSkgeworCQkvKiBidXQgcmVzY2hlZHVsZSBhIHJlYWQgb2YgdGhlIGN1cnJlbnQgdG9vbCAqLworCQl3YWNvbV9pbnR1b3Nfc2NoZWR1bGVfcHJveF9ldmVudCh3YWNvbSk7CiAJCXJldHVybiAxOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTAxOSwxNSArMTA1Miw5IEBACiAJCWJhdF9jaGFyZ2luZyA9IChwb3dlcl9yYXcgJiAweDA4KSA/IDEgOiAwOwogCQlwc19jb25uZWN0ZWQgPSAocG93ZXJfcmF3ICYgMHgxMCkgPyAxIDogMDsKIAkJYmF0dGVyeV9jYXBhY2l0eSA9IGJhdGNhcF9pNFtwb3dlcl9yYXcgJiAweDA3XTsKLQkJaWYgKCh3YWNvbS0+YmF0dGVyeV9jYXBhY2l0eSAhPSBiYXR0ZXJ5X2NhcGFjaXR5KSB8fAotCQkgICAgKHdhY29tLT5iYXRfY2hhcmdpbmcgIT0gYmF0X2NoYXJnaW5nKSB8fAotCQkgICAgKHdhY29tLT5wc19jb25uZWN0ZWQgIT0gcHNfY29ubmVjdGVkKSkgewotCQkJd2Fjb20tPmJhdHRlcnlfY2FwYWNpdHkgPSBiYXR0ZXJ5X2NhcGFjaXR5OwotCQkJd2Fjb20tPmJhdF9jaGFyZ2luZyA9IGJhdF9jaGFyZ2luZzsKLQkJCXdhY29tLT5wc19jb25uZWN0ZWQgPSBwc19jb25uZWN0ZWQ7Ci0JCQl3YWNvbV9ub3RpZnlfYmF0dGVyeSh3YWNvbSk7Ci0JCX0KLQorCQl3YWNvbV9ub3RpZnlfYmF0dGVyeSh3YWNvbSwgYmF0dGVyeV9jYXBhY2l0eSwgYmF0X2NoYXJnaW5nLAorCQkJCSAgICAgYmF0dGVyeV9jYXBhY2l0eSB8fCBiYXRfY2hhcmdpbmcsCisJCQkJICAgICBwc19jb25uZWN0ZWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZGJnKHdhY29tLT5pbnB1dC0+ZGV2LnBhcmVudCwKQEAgLTEwMzgsMTIgKzEwNjUsMzQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB3YWNvbV93YWNfZmluZ2VyX2NvdW50X3RvdWNoZXMoc3RydWN0IHdhY29tX3dhYyAqd2Fjb20pCit7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB3YWNvbS0+aW5wdXQ7CisJdW5zaWduZWQgdG91Y2hfbWF4ID0gd2Fjb20tPmZlYXR1cmVzLnRvdWNoX21heDsKKwlpbnQgY291bnQgPSAwOworCWludCBpOworCisJLyogbm9uLUhJRF9HRU5FUklDIHNpbmdsZSB0b3VjaCBpbnB1dCBkb2Vzbid0IGNhbGwgdGhpcyByb3V0aW5lICovCisJaWYgKCh0b3VjaF9tYXggPT0gMSkgJiYgKHdhY29tLT5mZWF0dXJlcy50eXBlID09IEhJRF9HRU5FUklDKSkKKwkJcmV0dXJuIHdhY29tLT5oaWRfZGF0YS50aXBzd2l0Y2ggJiYKKwkJICAgICAgICF3YWNvbS0+c2hhcmVkLT5zdHlsdXNfaW5fcHJveGltaXR5OworCisJZm9yIChpID0gMDsgaSA8IGlucHV0LT5tdC0+bnVtX3Nsb3RzOyBpKyspIHsKKwkJc3RydWN0IGlucHV0X210X3Nsb3QgKnBzID0gJmlucHV0LT5tdC0+c2xvdHNbaV07CisJCWludCBpZCA9IGlucHV0X210X2dldF92YWx1ZShwcywgQUJTX01UX1RSQUNLSU5HX0lEKTsKKwkJaWYgKGlkID49IDApCisJCQljb3VudCsrOworCX0KKworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIGludCB3YWNvbV8yNGhkdF9pcnEoc3RydWN0IHdhY29tX3dhYyAqd2Fjb20pCiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB3YWNvbS0+aW5wdXQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHdhY29tLT5kYXRhOwogCWludCBpOwotCWludCBjdXJyZW50X251bV9jb250YWN0cyA9IDA7CisJaW50IGN1cnJlbnRfbnVtX2NvbnRhY3RzID0gZGF0YVs2MV07CiAJaW50IGNvbnRhY3RzX3RvX3NlbmQgPSAwOwogCWludCBudW1fY29udGFjdHNfbGVmdCA9IDQ7IC8qIG1heGltdW0gY29udGFjdHMgcGVyIHBhY2tldCAqLwogCWludCBieXRlX3Blcl9wYWNrZXQgPSBXQUNPTV9CWVRFU19QRVJfMjRIRFRfUEFDS0VUOwpAQCAtMTA1NCw4ICsxMTAzLDYgQEAKIAkJbnVtX2NvbnRhY3RzX2xlZnQgPSAxMDsKIAkJYnl0ZV9wZXJfcGFja2V0ID0gV0FDT01fQllURVNfUEVSX1FIRFRISURfUEFDS0VUOwogCQl5X29mZnNldCA9IDA7Ci0JfSBlbHNlIHsKLQkJY3VycmVudF9udW1fY29udGFjdHMgPSBkYXRhWzYxXTsKIAl9CiAKIAkvKgpAQCAtMTA5OCwxMyArMTE0NSwxMyBAQAogCQkJfQogCQl9CiAJfQotCWlucHV0X210X3JlcG9ydF9wb2ludGVyX2VtdWxhdGlvbihpbnB1dCwgdHJ1ZSk7CisJaW5wdXRfbXRfc3luY19mcmFtZShpbnB1dCk7CiAKIAl3YWNvbS0+bnVtX2NvbnRhY3RzX2xlZnQgLT0gY29udGFjdHNfdG9fc2VuZDsKLQlpZiAod2Fjb20tPm51bV9jb250YWN0c19sZWZ0IDw9IDApCisJaWYgKHdhY29tLT5udW1fY29udGFjdHNfbGVmdCA8PSAwKSB7CiAJCXdhY29tLT5udW1fY29udGFjdHNfbGVmdCA9IDA7Ci0KLQl3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duID0gKHdhY29tLT5udW1fY29udGFjdHNfbGVmdCA+IDApOworCQl3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duID0gd2Fjb21fd2FjX2Zpbmdlcl9jb3VudF90b3VjaGVzKHdhY29tKTsKKwl9CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTExNDksMTMgKzExOTYsMTMgQEAKIAkJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19NVF9QT1NJVElPTl9ZLCB5KTsKIAkJfQogCX0KLQlpbnB1dF9tdF9yZXBvcnRfcG9pbnRlcl9lbXVsYXRpb24oaW5wdXQsIHRydWUpOworCWlucHV0X210X3N5bmNfZnJhbWUoaW5wdXQpOwogCiAJd2Fjb20tPm51bV9jb250YWN0c19sZWZ0IC09IGNvbnRhY3RzX3RvX3NlbmQ7Ci0JaWYgKHdhY29tLT5udW1fY29udGFjdHNfbGVmdCA8IDApCisJaWYgKHdhY29tLT5udW1fY29udGFjdHNfbGVmdCA8PSAwKSB7CiAJCXdhY29tLT5udW1fY29udGFjdHNfbGVmdCA9IDA7Ci0KLQl3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duID0gKHdhY29tLT5udW1fY29udGFjdHNfbGVmdCA+IDApOworCQl3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duID0gd2Fjb21fd2FjX2Zpbmdlcl9jb3VudF90b3VjaGVzKHdhY29tKTsKKwl9CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTExNjMsNyArMTIxMCw2IEBACiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB3YWNvbS0+aW5wdXQ7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHdhY29tLT5kYXRhOwotCWludCBjb250YWN0X3dpdGhfbm9fcGVuX2Rvd25fY291bnQgPSAwOwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewpAQCAtMTE3OCwxMyArMTIyNCwxMiBAQAogCiAJCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfTVRfUE9TSVRJT05fWCwgeCk7CiAJCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfTVRfUE9TSVRJT05fWSwgeSk7Ci0JCQljb250YWN0X3dpdGhfbm9fcGVuX2Rvd25fY291bnQrKzsKIAkJfQogCX0KLQlpbnB1dF9tdF9yZXBvcnRfcG9pbnRlcl9lbXVsYXRpb24oaW5wdXQsIHRydWUpOworCWlucHV0X210X3N5bmNfZnJhbWUoaW5wdXQpOwogCiAJLyoga2VlcCB0b3VjaCBzdGF0ZSBmb3IgcGVuIGV2ZW50ICovCi0Jd2Fjb20tPnNoYXJlZC0+dG91Y2hfZG93biA9IChjb250YWN0X3dpdGhfbm9fcGVuX2Rvd25fY291bnQgPiAwKTsKKwl3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duID0gd2Fjb21fd2FjX2Zpbmdlcl9jb3VudF90b3VjaGVzKHdhY29tKTsKIAogCXJldHVybiAxOwogfQpAQCAtMTE5MywyOSArMTIzOCwyNSBAQAogewogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB3YWNvbS0+ZGF0YTsKIAlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHdhY29tLT5pbnB1dDsKLQlib29sIHByb3g7CisJYm9vbCBwcm94ID0gIXdhY29tLT5zaGFyZWQtPnN0eWx1c19pbl9wcm94aW1pdHk7CiAJaW50IHggPSAwLCB5ID0gMDsKIAogCWlmICh3YWNvbS0+ZmVhdHVyZXMudG91Y2hfbWF4ID4gMSB8fCBsZW4gPiBXQUNPTV9QS0dMRU5fVFBDMkZHKQogCQlyZXR1cm4gMDsKIAotCWlmICghd2Fjb20tPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eSkgewotCQlpZiAobGVuID09IFdBQ09NX1BLR0xFTl9UUEMxRkcpIHsKLQkJCXByb3ggPSBkYXRhWzBdICYgMHgwMTsKLQkJCXggPSBnZXRfdW5hbGlnbmVkX2xlMTYoJmRhdGFbMV0pOwotCQkJeSA9IGdldF91bmFsaWduZWRfbGUxNigmZGF0YVszXSk7Ci0JCX0gZWxzZSBpZiAobGVuID09IFdBQ09NX1BLR0xFTl9UUEMxRkdfQikgewotCQkJcHJveCA9IGRhdGFbMl0gJiAweDAxOwotCQkJeCA9IGdldF91bmFsaWduZWRfbGUxNigmZGF0YVszXSk7Ci0JCQl5ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZkYXRhWzVdKTsKLQkJfSBlbHNlIHsKLQkJCXByb3ggPSBkYXRhWzFdICYgMHgwMTsKLQkJCXggPSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZkYXRhWzJdKTsKLQkJCXkgPSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZkYXRhWzRdKTsKLQkJfQotCX0gZWxzZQotCQkvKiBmb3JjZSB0b3VjaCBvdXQgd2hlbiBwZW4gaXMgaW4gcHJveCAqLwotCQlwcm94ID0gMDsKKwlpZiAobGVuID09IFdBQ09NX1BLR0xFTl9UUEMxRkcpIHsKKwkJcHJveCA9IHByb3ggJiYgKGRhdGFbMF0gJiAweDAxKTsKKwkJeCA9IGdldF91bmFsaWduZWRfbGUxNigmZGF0YVsxXSk7CisJCXkgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJmRhdGFbM10pOworCX0gZWxzZSBpZiAobGVuID09IFdBQ09NX1BLR0xFTl9UUEMxRkdfQikgeworCQlwcm94ID0gcHJveCAmJiAoZGF0YVsyXSAmIDB4MDEpOworCQl4ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZkYXRhWzNdKTsKKwkJeSA9IGdldF91bmFsaWduZWRfbGUxNigmZGF0YVs1XSk7CisJfSBlbHNlIHsKKwkJcHJveCA9IHByb3ggJiYgKGRhdGFbMV0gJiAweDAxKTsKKwkJeCA9IGxlMTZfdG9fY3B1cCgoX19sZTE2ICopJmRhdGFbMl0pOworCQl5ID0gbGUxNl90b19jcHVwKChfX2xlMTYgKikmZGF0YVs0XSk7CisJfQogCiAJaWYgKHByb3gpIHsKIAkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX1gsIHgpOwpAQCAtMTUxNiwyOSArMTU1Nyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgd2Fjb21fd2FjX2Zpbmdlcl9jb3VudF90b3VjaGVzKHN0cnVjdCBoaWRfZGV2aWNlICpoZGV2KQotewotCXN0cnVjdCB3YWNvbSAqd2Fjb20gPSBoaWRfZ2V0X2RydmRhdGEoaGRldik7Ci0Jc3RydWN0IHdhY29tX3dhYyAqd2Fjb21fd2FjID0gJndhY29tLT53YWNvbV93YWM7Ci0Jc3RydWN0IGlucHV0X2RldiAqaW5wdXQgPSB3YWNvbV93YWMtPmlucHV0OwotCXVuc2lnbmVkIHRvdWNoX21heCA9IHdhY29tX3dhYy0+ZmVhdHVyZXMudG91Y2hfbWF4OwotCWludCBjb3VudCA9IDA7Ci0JaW50IGk7Ci0KLQlpZiAodG91Y2hfbWF4ID09IDEpCi0JCXJldHVybiB3YWNvbV93YWMtPmhpZF9kYXRhLnRpcHN3aXRjaCAmJgotCQkgICAgICAgIXdhY29tX3dhYy0+c2hhcmVkLT5zdHlsdXNfaW5fcHJveGltaXR5OwotCi0JZm9yIChpID0gMDsgaSA8IGlucHV0LT5tdC0+bnVtX3Nsb3RzOyBpKyspIHsKLQkJc3RydWN0IGlucHV0X210X3Nsb3QgKnBzID0gJmlucHV0LT5tdC0+c2xvdHNbaV07Ci0JCWludCBpZCA9IGlucHV0X210X2dldF92YWx1ZShwcywgQUJTX01UX1RSQUNLSU5HX0lEKTsKLQkJaWYgKGlkID49IDApCi0JCQljb3VudCsrOwotCX0KLQotCXJldHVybiBjb3VudDsKLX0KLQogc3RhdGljIHZvaWQgd2Fjb21fd2FjX2Zpbmdlcl9yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhkZXYsCiAJCXN0cnVjdCBoaWRfcmVwb3J0ICpyZXBvcnQpCiB7CkBAIC0xNTUzLDcgKzE1NzEsNyBAQAogCWlucHV0X3N5bmMoaW5wdXQpOwogCiAJLyoga2VlcCB0b3VjaCBzdGF0ZSBmb3IgcGVuIGV2ZW50ICovCi0Jd2Fjb21fd2FjLT5zaGFyZWQtPnRvdWNoX2Rvd24gPSB3YWNvbV93YWNfZmluZ2VyX2NvdW50X3RvdWNoZXMoaGRldik7CisJd2Fjb21fd2FjLT5zaGFyZWQtPnRvdWNoX2Rvd24gPSB3YWNvbV93YWNfZmluZ2VyX2NvdW50X3RvdWNoZXMod2Fjb21fd2FjKTsKIH0KIAogdm9pZCB3YWNvbV93YWNfdXNhZ2VfbWFwcGluZyhzdHJ1Y3QgaGlkX2RldmljZSAqaGRldiwKQEAgLTE2NDMsMTIgKzE2NjEsMTMgQEAKIAkJfQogCX0KIAotCWlucHV0X210X3JlcG9ydF9wb2ludGVyX2VtdWxhdGlvbihpbnB1dCwgdHJ1ZSk7CisJaW5wdXRfbXRfc3luY19mcmFtZShpbnB1dCk7CiAKIAlpbnB1dF9yZXBvcnRfa2V5KHBhZF9pbnB1dCwgQlROX0xFRlQsIChkYXRhWzFdICYgMHgwOCkgIT0gMCk7CiAJaW5wdXRfcmVwb3J0X2tleShwYWRfaW5wdXQsIEJUTl9GT1JXQVJELCAoZGF0YVsxXSAmIDB4MDQpICE9IDApOwogCWlucHV0X3JlcG9ydF9rZXkocGFkX2lucHV0LCBCVE5fQkFDSywgKGRhdGFbMV0gJiAweDAyKSAhPSAwKTsKIAlpbnB1dF9yZXBvcnRfa2V5KHBhZF9pbnB1dCwgQlROX1JJR0hULCAoZGF0YVsxXSAmIDB4MDEpICE9IDApOworCXdhY29tLT5zaGFyZWQtPnRvdWNoX2Rvd24gPSB3YWNvbV93YWNfZmluZ2VyX2NvdW50X3RvdWNoZXMod2Fjb20pOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0xNzMzLDcgKzE3NTIsOCBAQAogCQkJd2Fjb21fYnB0M19idXR0b25fbXNnKHdhY29tLCBkYXRhICsgb2Zmc2V0KTsKIAogCX0KLQlpbnB1dF9tdF9yZXBvcnRfcG9pbnRlcl9lbXVsYXRpb24oaW5wdXQsIHRydWUpOworCWlucHV0X210X3N5bmNfZnJhbWUoaW5wdXQpOworCXdhY29tLT5zaGFyZWQtPnRvdWNoX2Rvd24gPSB3YWNvbV93YWNfZmluZ2VyX2NvdW50X3RvdWNoZXMod2Fjb20pOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0xNzQ1LDIwICsxNzY1LDkgQEAKIAl1bnNpZ25lZCBjaGFyICpkYXRhID0gd2Fjb20tPmRhdGE7CiAJaW50IHByb3ggPSAwLCB4ID0gMCwgeSA9IDAsIHAgPSAwLCBkID0gMCwgcGVuID0gMCwgYnRuMSA9IDAsIGJ0bjIgPSAwOwogCi0JaWYgKGRhdGFbMF0gIT0gV0FDT01fUkVQT1JUX1BFTkFCTEVEICYmIGRhdGFbMF0gIT0gV0FDT01fUkVQT1JUX1VTQikKKwlpZiAoZGF0YVswXSAhPSBXQUNPTV9SRVBPUlRfUEVOQUJMRUQpCiAJICAgIHJldHVybiAwOwogCi0JaWYgKGRhdGFbMF0gPT0gV0FDT01fUkVQT1JUX1VTQikgewotCQlpZiAoZmVhdHVyZXMtPnR5cGUgPT0gSU5UVU9TSFQgJiYKLQkJICAgIHdhY29tLT5zaGFyZWQtPnRvdWNoX2lucHV0ICYmCi0JCSAgICBmZWF0dXJlcy0+dG91Y2hfbWF4KSB7Ci0JCQlpbnB1dF9yZXBvcnRfc3dpdGNoKHdhY29tLT5zaGFyZWQtPnRvdWNoX2lucHV0LAotCQkJCQkgICAgU1dfTVVURV9ERVZJQ0UsIGRhdGFbOF0gJiAweDQwKTsKLQkJCWlucHV0X3N5bmMod2Fjb20tPnNoYXJlZC0+dG91Y2hfaW5wdXQpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQogCXByb3ggPSAoZGF0YVsxXSAmIDB4MjApID09IDB4MjA7CiAKIAkvKgpAQCAtMTc3MSwxNyArMTc4MCwyMSBAQAogCSAqCiAJICogSGFyZHdhcmUgZG9lcyByZXBvcnQgemVybyBpbiBtb3N0IG91dC1vZi1wcm94IGNhc2VzIGJ1dCBub3QgYWxsLgogCSAqLwotCWlmIChwcm94KSB7Ci0JCWlmICghd2Fjb20tPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eSkgewotCQkJaWYgKGRhdGFbMV0gJiAweDA4KSB7Ci0JCQkJd2Fjb20tPnRvb2xbMF0gPSBCVE5fVE9PTF9SVUJCRVI7Ci0JCQkJd2Fjb20tPmlkWzBdID0gRVJBU0VSX0RFVklDRV9JRDsKLQkJCX0gZWxzZSB7Ci0JCQkJd2Fjb20tPnRvb2xbMF0gPSBCVE5fVE9PTF9QRU47Ci0JCQkJd2Fjb20tPmlkWzBdID0gU1RZTFVTX0RFVklDRV9JRDsKLQkJCX0KLQkJCXdhY29tLT5zaGFyZWQtPnN0eWx1c19pbl9wcm94aW1pdHkgPSB0cnVlOworCWlmICghd2Fjb20tPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eSkgeworCQlpZiAoZGF0YVsxXSAmIDB4MDgpIHsKKwkJCXdhY29tLT50b29sWzBdID0gQlROX1RPT0xfUlVCQkVSOworCQkJd2Fjb20tPmlkWzBdID0gRVJBU0VSX0RFVklDRV9JRDsKKwkJfSBlbHNlIHsKKwkJCXdhY29tLT50b29sWzBdID0gQlROX1RPT0xfUEVOOworCQkJd2Fjb20tPmlkWzBdID0gU1RZTFVTX0RFVklDRV9JRDsKIAkJfQorCX0KKworCXdhY29tLT5zaGFyZWQtPnN0eWx1c19pbl9wcm94aW1pdHkgPSBwcm94OworCWlmICh3YWNvbS0+c2hhcmVkLT50b3VjaF9kb3duKQorCQlyZXR1cm4gMDsKKworCWlmIChwcm94KSB7CiAJCXggPSBsZTE2X3RvX2NwdXAoKF9fbGUxNiAqKSZkYXRhWzJdKTsKIAkJeSA9IGxlMTZfdG9fY3B1cCgoX19sZTE2ICopJmRhdGFbNF0pOwogCQlwID0gbGUxNl90b19jcHVwKChfX2xlMTYgKikmZGF0YVs2XSk7CkBAIC0xNzk3LDYgKzE4MTAsOCBAQAogCQlwZW4gPSBkYXRhWzFdICYgMHgwMTsKIAkJYnRuMSA9IGRhdGFbMV0gJiAweDAyOwogCQlidG4yID0gZGF0YVsxXSAmIDB4MDQ7CisJfSBlbHNlIHsKKwkJd2Fjb20tPmlkWzBdID0gMDsKIAl9CiAKIAlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fVE9VQ0gsIHBlbik7CkBAIC0xODA4LDExICsxODIzLDYgQEAKIAlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfUFJFU1NVUkUsIHApOwogCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19ESVNUQU5DRSwgZCk7CiAKLQlpZiAoIXByb3gpIHsKLQkJd2Fjb20tPmlkWzBdID0gMDsKLQkJd2Fjb20tPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eSA9IGZhbHNlOwotCX0KLQogCWlucHV0X3JlcG9ydF9rZXkoaW5wdXQsIHdhY29tLT50b29sWzBdLCBwcm94KTsgLyogUEVOIG9yIFJVQkJFUiAqLwogCWlucHV0X3JlcG9ydF9hYnMoaW5wdXQsIEFCU19NSVNDLCB3YWNvbS0+aWRbMF0pOyAvKiBUT09MIElEICovCiAKQEAgLTE4MzEsNiArMTg0MSw5MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB3YWNvbV9iYW1ib29fcGFkX3Blbl9ldmVudChzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSwKKwkJdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKwl1bnNpZ25lZCBjaGFyIHByZWZpeDsKKworCS8qCisJICogV2UgbmVlZCB0byByZXJvdXRlIHRoZSBldmVudCBmcm9tIHRoZSBkZWJ1ZyBpbnRlcmZhY2UgdG8gdGhlCisJICogcGVuIGludGVyZmFjZS4KKwkgKiBXZSBuZWVkIHRvIGFkZCB0aGUgcmVwb3J0IElEIHRvIHRoZSBhY3R1YWwgcGVuIHJlcG9ydCwgc28gd2UKKwkgKiB0ZW1wb3Jhcnkgb3ZlcndyaXRlIHRoZSBmaXJzdCBieXRlIHRvIHByZXZlbnQgaGF2aW5nIHRvIGt6YWxsb2Mva2ZyZWUKKwkgKiBhbmQgbWVtY3B5IHRoZSByZXBvcnQuCisJICovCisJcHJlZml4ID0gZGF0YVswXTsKKwlkYXRhWzBdID0gV0FDT01fUkVQT1JUX0JQQURfUEVOOworCisJLyoKKwkgKiBhY3R1YWxseSByZXJvdXRlIHRoZSBldmVudC4KKwkgKiBObyBuZWVkIHRvIGNoZWNrIGlmIHdhY29tLT5zaGFyZWQtPnBlbiBpcyB2YWxpZCwgaGlkX2lucHV0X3JlcG9ydCgpCisJICogd2lsbCBjaGVjayBmb3IgdXMuCisJICovCisJaGlkX2lucHV0X3JlcG9ydCh3YWNvbS0+c2hhcmVkLT5wZW4sIEhJRF9JTlBVVF9SRVBPUlQsIGRhdGEsCisJCQkgV0FDT01fUEtHTEVOX1BFTkFCTEVELCAxKTsKKworCWRhdGFbMF0gPSBwcmVmaXg7Cit9CisKK3N0YXRpYyBpbnQgd2Fjb21fYmFtYm9vX3BhZF90b3VjaF9ldmVudChzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbSwKKwkJdW5zaWduZWQgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCA9IHdhY29tLT5pbnB1dDsKKwl1bnNpZ25lZCBjaGFyICpmaW5nZXJfZGF0YSwgcHJlZml4OworCXVuc2lnbmVkIGlkOworCWludCB4LCB5OworCWJvb2wgdmFsaWQ7CisKKwlwcmVmaXggPSBkYXRhWzBdOworCisJZm9yIChpZCA9IDA7IGlkIDwgd2Fjb20tPmZlYXR1cmVzLnRvdWNoX21heDsgaWQrKykgeworCQl2YWxpZCA9ICEhKHByZWZpeCAmIEJJVChpZCkpICYmCisJCQkhd2Fjb20tPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eTsKKworCQlpbnB1dF9tdF9zbG90KGlucHV0LCBpZCk7CisJCWlucHV0X210X3JlcG9ydF9zbG90X3N0YXRlKGlucHV0LCBNVF9UT09MX0ZJTkdFUiwgdmFsaWQpOworCisJCWlmICghdmFsaWQpCisJCQljb250aW51ZTsKKworCQlmaW5nZXJfZGF0YSA9IGRhdGEgKyAxICsgaWQgKiAzOworCQl4ID0gZmluZ2VyX2RhdGFbMF0gfCAoKGZpbmdlcl9kYXRhWzFdICYgMHgwZikgPDwgOCk7CisJCXkgPSAoZmluZ2VyX2RhdGFbMl0gPDwgNCkgfCAoZmluZ2VyX2RhdGFbMV0gPj4gNCk7CisKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dCwgQUJTX01UX1BPU0lUSU9OX1gsIHgpOworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0LCBBQlNfTVRfUE9TSVRJT05fWSwgeSk7CisJfQorCisJaW5wdXRfbXRfc3luY19mcmFtZShpbnB1dCk7CisKKwlpbnB1dF9yZXBvcnRfa2V5KGlucHV0LCBCVE5fTEVGVCwgcHJlZml4ICYgMHg0MCk7CisJaW5wdXRfcmVwb3J0X2tleShpbnB1dCwgQlROX1JJR0hULCBwcmVmaXggJiAweDgwKTsKKworCS8qIGtlZXAgdG91Y2ggc3RhdGUgZm9yIHBlbiBldmVudCAqLworCXdhY29tLT5zaGFyZWQtPnRvdWNoX2Rvd24gPSAhIXByZWZpeCAmJgorCQkJCSAgICAhd2Fjb20tPnNoYXJlZC0+c3R5bHVzX2luX3Byb3hpbWl0eTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHdhY29tX2JhbWJvb19wYWRfaXJxKHN0cnVjdCB3YWNvbV93YWMgKndhY29tLCBzaXplX3QgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB3YWNvbS0+ZGF0YTsKKworCWlmICghKChsZW4gPT0gV0FDT01fUEtHTEVOX0JQQURfVE9VQ0gpIHx8CisJICAgICAgKGxlbiA9PSBXQUNPTV9QS0dMRU5fQlBBRF9UT1VDSF9VU0IpKSB8fAorCSAgICAoZGF0YVswXSAhPSBXQUNPTV9SRVBPUlRfQlBBRF9UT1VDSCkpCisJCXJldHVybiAwOworCisJaWYgKGRhdGFbMV0gJiAweDAxKQorCQl3YWNvbV9iYW1ib29fcGFkX3Blbl9ldmVudCh3YWNvbSwgJmRhdGFbMV0pOworCisJaWYgKGRhdGFbMV0gJiAweDAyKQorCQlyZXR1cm4gd2Fjb21fYmFtYm9vX3BhZF90b3VjaF9ldmVudCh3YWNvbSwgJmRhdGFbOV0pOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgd2Fjb21fd2lyZWxlc3NfaXJxKHN0cnVjdCB3YWNvbV93YWMgKndhY29tLCBzaXplX3QgbGVuKQogewogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSB3YWNvbS0+ZGF0YTsKQEAgLTE4NDEsNyArMTkzNiw3IEBACiAKIAljb25uZWN0ZWQgPSBkYXRhWzFdICYgMHgwMTsKIAlpZiAoY29ubmVjdGVkKSB7Ci0JCWludCBwaWQsIGJhdHRlcnksIHBzX2Nvbm5lY3RlZDsKKwkJaW50IHBpZCwgYmF0dGVyeSwgY2hhcmdpbmc7CiAKIAkJaWYgKCh3YWNvbS0+c2hhcmVkLT50eXBlID09IElOVFVPU0hUKSAmJgogCQkgICAgd2Fjb20tPnNoYXJlZC0+dG91Y2hfaW5wdXQgJiYKQEAgLTE4NTMsMzMgKzE5NDgsNjYgQEAKIAogCQlwaWQgPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmRhdGFbNl0pOwogCQliYXR0ZXJ5ID0gKGRhdGFbNV0gJiAweDNmKSAqIDEwMCAvIDMxOwotCQlwc19jb25uZWN0ZWQgPSAhIShkYXRhWzVdICYgMHg4MCk7CisJCWNoYXJnaW5nID0gISEoZGF0YVs1XSAmIDB4ODApOwogCQlpZiAod2Fjb20tPnBpZCAhPSBwaWQpIHsKIAkJCXdhY29tLT5waWQgPSBwaWQ7CiAJCQl3YWNvbV9zY2hlZHVsZV93b3JrKHdhY29tKTsKIAkJfQogCi0JCWlmICh3YWNvbS0+c2hhcmVkLT50eXBlICYmCi0JCSAgICAoYmF0dGVyeSAhPSB3YWNvbS0+YmF0dGVyeV9jYXBhY2l0eSB8fAotCQkgICAgIHBzX2Nvbm5lY3RlZCAhPSB3YWNvbS0+cHNfY29ubmVjdGVkKSkgewotCQkJd2Fjb20tPmJhdHRlcnlfY2FwYWNpdHkgPSBiYXR0ZXJ5OwotCQkJd2Fjb20tPnBzX2Nvbm5lY3RlZCA9IHBzX2Nvbm5lY3RlZDsKLQkJCXdhY29tLT5iYXRfY2hhcmdpbmcgPSBwc19jb25uZWN0ZWQgJiYKLQkJCQkJCXdhY29tLT5iYXR0ZXJ5X2NhcGFjaXR5IDwgMTAwOwotCQkJd2Fjb21fbm90aWZ5X2JhdHRlcnkod2Fjb20pOwotCQl9CisJCWlmICh3YWNvbS0+c2hhcmVkLT50eXBlKQorCQkJd2Fjb21fbm90aWZ5X2JhdHRlcnkod2Fjb20sIGJhdHRlcnksIGNoYXJnaW5nLCAxLCAwKTsKKwogCX0gZWxzZSBpZiAod2Fjb20tPnBpZCAhPSAwKSB7CiAJCS8qIGRpc2Nvbm5lY3RlZCB3aGlsZSBwcmV2aW91c2x5IGNvbm5lY3RlZCAqLwogCQl3YWNvbS0+cGlkID0gMDsKIAkJd2Fjb21fc2NoZWR1bGVfd29yayh3YWNvbSk7Ci0JCXdhY29tLT5iYXR0ZXJ5X2NhcGFjaXR5ID0gMDsKLQkJd2Fjb20tPmJhdF9jaGFyZ2luZyA9IDA7Ci0JCXdhY29tLT5wc19jb25uZWN0ZWQgPSAwOworCQl3YWNvbV9ub3RpZnlfYmF0dGVyeSh3YWNvbSwgMCwgMCwgMCwgMCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgd2Fjb21fc3RhdHVzX2lycShzdHJ1Y3Qgd2Fjb21fd2FjICp3YWNvbV93YWMsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHdhY29tICp3YWNvbSA9IGNvbnRhaW5lcl9vZih3YWNvbV93YWMsIHN0cnVjdCB3YWNvbSwgd2Fjb21fd2FjKTsKKwlzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgKmZlYXR1cmVzID0gJndhY29tX3dhYy0+ZmVhdHVyZXM7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IHdhY29tX3dhYy0+ZGF0YTsKKworCWlmIChkYXRhWzBdICE9IFdBQ09NX1JFUE9SVF9VU0IpCisJCXJldHVybiAwOworCisJaWYgKGZlYXR1cmVzLT50eXBlID09IElOVFVPU0hUICYmCisJICAgIHdhY29tX3dhYy0+c2hhcmVkLT50b3VjaF9pbnB1dCAmJgorCSAgICBmZWF0dXJlcy0+dG91Y2hfbWF4KSB7CisJCWlucHV0X3JlcG9ydF9zd2l0Y2god2Fjb21fd2FjLT5zaGFyZWQtPnRvdWNoX2lucHV0LAorCQkJCSAgICBTV19NVVRFX0RFVklDRSwgZGF0YVs4XSAmIDB4NDApOworCQlpbnB1dF9zeW5jKHdhY29tX3dhYy0+c2hhcmVkLT50b3VjaF9pbnB1dCk7CisJfQorCisJaWYgKGRhdGFbOV0gJiAweDAyKSB7IC8qIHdpcmVsZXNzIG1vZHVsZSBpcyBhdHRhY2hlZCAqLworCQlpbnQgYmF0dGVyeSA9IChkYXRhWzhdICYgMHgzZikgKiAxMDAgLyAzMTsKKwkJYm9vbCBjaGFyZ2luZyA9ICEhKGRhdGFbOF0gJiAweDgwKTsKKworCQl3YWNvbV9ub3RpZnlfYmF0dGVyeSh3YWNvbV93YWMsIGJhdHRlcnksIGNoYXJnaW5nLAorCQkJCSAgICAgYmF0dGVyeSB8fCBjaGFyZ2luZywgMSk7CisKKwkJaWYgKCF3YWNvbS0+YmF0dGVyeSAmJgorCQkgICAgIShmZWF0dXJlcy0+cXVpcmtzICYgV0FDT01fUVVJUktfQkFUVEVSWSkpIHsKKwkJCWZlYXR1cmVzLT5xdWlya3MgfD0gV0FDT01fUVVJUktfQkFUVEVSWTsKKwkJCUlOSVRfV09SSygmd2Fjb20tPndvcmssIHdhY29tX2JhdHRlcnlfd29yayk7CisJCQl3YWNvbV9zY2hlZHVsZV93b3JrKHdhY29tX3dhYyk7CisJCX0KKwl9CisJZWxzZSBpZiAoKGZlYXR1cmVzLT5xdWlya3MgJiBXQUNPTV9RVUlSS19CQVRURVJZKSAmJgorCQkgd2Fjb20tPmJhdHRlcnkpIHsKKwkJZmVhdHVyZXMtPnF1aXJrcyAmPSB+V0FDT01fUVVJUktfQkFUVEVSWTsKKwkJSU5JVF9XT1JLKCZ3YWNvbS0+d29yaywgd2Fjb21fYmF0dGVyeV93b3JrKTsKKwkJd2Fjb21fc2NoZWR1bGVfd29yayh3YWNvbV93YWMpOworCQl3YWNvbV9ub3RpZnlfYmF0dGVyeSh3YWNvbV93YWMsIDAsIDAsIDAsIDApOworCX0KKwlyZXR1cm4gMDsKK30KKwogdm9pZCB3YWNvbV93YWNfaXJxKHN0cnVjdCB3YWNvbV93YWMgKndhY29tX3dhYywgc2l6ZV90IGxlbikKIHsKIAlib29sIHN5bmM7CkBAIC0xOTQ5LDYgKzIwNzcsOCBAQAogCWNhc2UgSU5UVU9TUEw6CiAJCWlmIChsZW4gPT0gV0FDT01fUEtHTEVOX0JCVE9VQ0gzKQogCQkJc3luYyA9IHdhY29tX2JwdDNfdG91Y2god2Fjb21fd2FjKTsKKwkJZWxzZSBpZiAod2Fjb21fd2FjLT5kYXRhWzBdID09IFdBQ09NX1JFUE9SVF9VU0IpCisJCQlzeW5jID0gd2Fjb21fc3RhdHVzX2lycSh3YWNvbV93YWMsIGxlbik7CiAJCWVsc2UKIAkJCXN5bmMgPSB3YWNvbV9pbnR1b3NfaXJxKHdhY29tX3dhYyk7CiAJCWJyZWFrOwpAQCAtMTk2NCw3ICsyMDk0LDE0IEBACiAKIAljYXNlIEJBTUJPT19QVDoKIAljYXNlIElOVFVPU0hUOgotCQlzeW5jID0gd2Fjb21fYnB0X2lycSh3YWNvbV93YWMsIGxlbik7CisJCWlmICh3YWNvbV93YWMtPmRhdGFbMF0gPT0gV0FDT01fUkVQT1JUX1VTQikKKwkJCXN5bmMgPSB3YWNvbV9zdGF0dXNfaXJxKHdhY29tX3dhYywgbGVuKTsKKwkJZWxzZQorCQkJc3luYyA9IHdhY29tX2JwdF9pcnEod2Fjb21fd2FjLCBsZW4pOworCQlicmVhazsKKworCWNhc2UgQkFNQk9PX1BBRDoKKwkJc3luYyA9IHdhY29tX2JhbWJvb19wYWRfaXJxKHdhY29tX3dhYywgbGVuKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdJUkVMRVNTOgpAQCAtMjAzNiwxMiArMjE3Myw2IEBACiAJCWZlYXR1cmVzLT55X21heCA9IDEwMjM7CiAJfQogCi0JLyogdGhlc2UgZGV2aWNlIGhhdmUgbXVsdGlwbGUgaW5wdXRzICovCi0JaWYgKGZlYXR1cmVzLT50eXBlID49IFdJUkVMRVNTIHx8Ci0JICAgIChmZWF0dXJlcy0+dHlwZSA+PSBJTlRVT1M1UyAmJiBmZWF0dXJlcy0+dHlwZSA8PSBJTlRVT1NIVCkgfHwKLQkgICAgKGZlYXR1cmVzLT5vVmlkICYmIGZlYXR1cmVzLT5vUGlkKSkKLQkJZmVhdHVyZXMtPnF1aXJrcyB8PSBXQUNPTV9RVUlSS19NVUxUSV9JTlBVVDsKLQogCS8qIHF1aXJrIGZvciBiYW1ib28gdG91Y2ggd2l0aCAyIGxvdyByZXMgdG91Y2hlcyAqLwogCWlmIChmZWF0dXJlcy0+dHlwZSA9PSBCQU1CT09fUFQgJiYKIAkgICAgZmVhdHVyZXMtPnBrdGxlbiA9PSBXQUNPTV9QS0dMRU5fQkJUT1VDSCkgewpAQCAtMjMwNSw2ICsyNDM2LDEzIEBACiAJCQkJCSAgICAgIDAsIDApOwogCQl9CiAJCWJyZWFrOworCWNhc2UgQkFNQk9PX1BBRDoKKwkJX19jbGVhcl9iaXQoQUJTX01JU0MsIGlucHV0X2Rldi0+YWJzYml0KTsKKwkJaW5wdXRfbXRfaW5pdF9zbG90cyhpbnB1dF9kZXYsIGZlYXR1cmVzLT50b3VjaF9tYXgsCisJCQkJICAgIElOUFVUX01UX1BPSU5URVIpOworCQlfX3NldF9iaXQoQlROX0xFRlQsIGlucHV0X2Rldi0+a2V5Yml0KTsKKwkJX19zZXRfYml0KEJUTl9SSUdIVCwgaW5wdXRfZGV2LT5rZXliaXQpOworCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNzU0LDYgKzI4OTIsMTUgQEAKIAl7ICJXYWNvbSBDaW50aXEgMTNIRCIsIDU5MTUyLCAzMzQ0OCwgMTAyMywgNjMsCiAJICBXQUNPTV8xM0hELCBXQUNPTV9JTlRVT1MzX1JFUywgV0FDT01fSU5UVU9TM19SRVMsCiAJICBXQUNPTV9DSU5USVFfT0ZGU0VULCBXQUNPTV9DSU5USVFfT0ZGU0VUIH07CitzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4MzMzID0KKwl7ICJXYWNvbSBDaW50aXEgMTNIRCB0b3VjaCIsIDU5MTUyLCAzMzQ0OCwgMjA0NywgNjMsCisJICBXQUNPTV8xM0hELCBXQUNPTV9JTlRVT1MzX1JFUywgV0FDT01fSU5UVU9TM19SRVMsCisJICBXQUNPTV9DSU5USVFfT0ZGU0VULCBXQUNPTV9DSU5USVFfT0ZGU0VULAorCSAgLm9WaWQgPSBVU0JfVkVORE9SX0lEX1dBQ09NLCAub1BpZCA9IDB4MzM1IH07CitzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4MzM1ID0KKwl7ICJXYWNvbSBDaW50aXEgMTNIRCB0b3VjaCIsIC50eXBlID0gV0FDT01fMjRIRFQsIC8qIFRvdWNoICovCisJICAub1ZpZCA9IFVTQl9WRU5ET1JfSURfV0FDT00sIC5vUGlkID0gMHgzMzMsIC50b3VjaF9tYXggPSAxMCwKKwkgIC5jaGVja19mb3JfaGlkX3R5cGUgPSB0cnVlLCAuaGlkX3R5cGUgPSBISURfVFlQRV9VU0JOT05FIH07CiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4QzcgPQogCXsgIldhY29tIERUVTE5MzEiLCAzNzgzMiwgMzAzMDUsIDUxMSwgMCwKIAkgIFBMLCBXQUNPTV9JTlRVT1NfUkVTLCBXQUNPTV9JTlRVT1NfUkVTIH07CkBAIC0yOTU4LDYgKzMxMDUsMTIgQEAKIAl7ICJXYWNvbSBJU0R2NSAzMEMiLCAudHlwZSA9IFdBQ09NXzI0SERULCAvKiBUb3VjaCAqLwogCSAgLm9WaWQgPSBVU0JfVkVORE9SX0lEX1dBQ09NLCAub1BpZCA9IDB4MzBBLCAudG91Y2hfbWF4ID0gMTAsCiAJICAuY2hlY2tfZm9yX2hpZF90eXBlID0gdHJ1ZSwgLmhpZF90eXBlID0gSElEX1RZUEVfVVNCTk9ORSB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weDMxOCA9CisJeyAiV2Fjb20gVVNCIEJhbWJvbyBQQUQiLCA0MDk1LCA0MDk1LCAvKiBUb3VjaCAqLworCSAgLnR5cGUgPSBCQU1CT09fUEFELCAzNSwgNDgsIC50b3VjaF9tYXggPSA0IH07CitzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4MzE5ID0KKwl7ICJXYWNvbSBXaXJlbGVzcyBCYW1ib28gUEFEIiwgNDA5NSwgNDA5NSwgLyogVG91Y2ggKi8KKwkgIC50eXBlID0gQkFNQk9PX1BBRCwgMzUsIDQ4LCAudG91Y2hfbWF4ID0gNCB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weDMyMyA9CiAJeyAiV2Fjb20gSW50dW9zIFAgTSIsIDIxNjAwLCAxMzUwMCwgMTAyMywgMzEsCiAJICBJTlRVT1NIVCwgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUywKQEAgLTI5NzQsNiArMzEyNywxMCBAQAogCUhJRF9ERVZJQ0UoQlVTX0JMVUVUT09USCwgSElEX0dST1VQX1dBQ09NLCBVU0JfVkVORE9SX0lEX1dBQ09NLCBwcm9kKSxcCiAJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KSZ3YWNvbV9mZWF0dXJlc18jI3Byb2QKIAorI2RlZmluZSBJMkNfREVWSUNFX1dBQ09NKHByb2QpCQkJCQkJXAorCUhJRF9ERVZJQ0UoQlVTX0kyQywgSElEX0dST1VQX1dBQ09NLCBVU0JfVkVORE9SX0lEX1dBQ09NLCBwcm9kKSxcCisJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KSZ3YWNvbV9mZWF0dXJlc18jI3Byb2QKKwogI2RlZmluZSBVU0JfREVWSUNFX0xFTk9WTyhwcm9kKQkJCQkJXAogCUhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfTEVOT1ZPLCBwcm9kKSwJCQlcCiAJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KSZ3YWNvbV9mZWF0dXJlc18jI3Byb2QKQEAgLTMxMDYsMTEgKzMyNjMsMTUgQEAKIAl7IFVTQl9ERVZJQ0VfV0FDT00oMHgzMTQpIH0sCiAJeyBVU0JfREVWSUNFX1dBQ09NKDB4MzE1KSB9LAogCXsgVVNCX0RFVklDRV9XQUNPTSgweDMxNykgfSwKKwl7IFVTQl9ERVZJQ0VfV0FDT00oMHgzMTgpIH0sCisJeyBVU0JfREVWSUNFX1dBQ09NKDB4MzE5KSB9LAogCXsgVVNCX0RFVklDRV9XQUNPTSgweDMyMykgfSwKIAl7IFVTQl9ERVZJQ0VfV0FDT00oMHgzMkEpIH0sCiAJeyBVU0JfREVWSUNFX1dBQ09NKDB4MzJCKSB9LAogCXsgVVNCX0RFVklDRV9XQUNPTSgweDMyQykgfSwKIAl7IFVTQl9ERVZJQ0VfV0FDT00oMHgzMkYpIH0sCisJeyBVU0JfREVWSUNFX1dBQ09NKDB4MzMzKSB9LAorCXsgVVNCX0RFVklDRV9XQUNPTSgweDMzNSkgfSwKIAl7IFVTQl9ERVZJQ0VfV0FDT00oMHg0MDAxKSB9LAogCXsgVVNCX0RFVklDRV9XQUNPTSgweDQwMDQpIH0sCiAJeyBVU0JfREVWSUNFX1dBQ09NKDB4NTAwMCkgfSwKQEAgLTMxMTgsNiArMzI3OSw3IEBACiAJeyBVU0JfREVWSUNFX0xFTk9WTygweDYwMDQpIH0sCiAKIAl7IFVTQl9ERVZJQ0VfV0FDT00oSElEX0FOWV9JRCkgfSwKKwl7IEkyQ19ERVZJQ0VfV0FDT00oSElEX0FOWV9JRCkgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGhpZCwgd2Fjb21faWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL3dhY29tX3dhYy5oIGIvZHJpdmVycy9oaWQvd2Fjb21fd2FjLmgKaW5kZXggMDIxZWUxYy4uNDcwMGFjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvd2Fjb21fd2FjLmgKKysrIGIvZHJpdmVycy9oaWQvd2Fjb21fd2FjLmgKQEAgLTMzLDYgKzMzLDggQEAKICNkZWZpbmUgV0FDT01fUEtHTEVOX01UVFBDCTQwCiAjZGVmaW5lIFdBQ09NX1BLR0xFTl9EVFVTCTY4CiAjZGVmaW5lIFdBQ09NX1BLR0xFTl9QRU5BQkxFRAkgOAorI2RlZmluZSBXQUNPTV9QS0dMRU5fQlBBRF9UT1VDSAkzMgorI2RlZmluZSBXQUNPTV9QS0dMRU5fQlBBRF9UT1VDSF9VU0IJNjQKIAogLyogd2Fjb20gZGF0YSBzaXplIHBlciBNVCBjb250YWN0ICovCiAjZGVmaW5lIFdBQ09NX0JZVEVTX1BFUl9NVF9QQUNLRVQJMTEKQEAgLTY3LDEzICs2OSwxNCBAQAogI2RlZmluZSBXQUNPTV9SRVBPUlRfMjRIRFQJCTEKICNkZWZpbmUgV0FDT01fUkVQT1JUX1dMCQkJMTI4CiAjZGVmaW5lIFdBQ09NX1JFUE9SVF9VU0IJCTE5MgorI2RlZmluZSBXQUNPTV9SRVBPUlRfQlBBRF9QRU4JCTMKKyNkZWZpbmUgV0FDT01fUkVQT1JUX0JQQURfVE9VQ0gJCTE2CiAKIC8qIGRldmljZSBxdWlya3MgKi8KLSNkZWZpbmUgV0FDT01fUVVJUktfTVVMVElfSU5QVVQJCTB4MDAwMQotI2RlZmluZSBXQUNPTV9RVUlSS19CQlRPVUNIX0xPV1JFUwkweDAwMDIKLSNkZWZpbmUgV0FDT01fUVVJUktfTk9fSU5QVVQJCTB4MDAwNAotI2RlZmluZSBXQUNPTV9RVUlSS19NT05JVE9SCQkweDAwMDgKLSNkZWZpbmUgV0FDT01fUVVJUktfQkFUVEVSWQkJMHgwMDEwCisjZGVmaW5lIFdBQ09NX1FVSVJLX0JCVE9VQ0hfTE9XUkVTCTB4MDAwMQorI2RlZmluZSBXQUNPTV9RVUlSS19OT19JTlBVVAkJMHgwMDAyCisjZGVmaW5lIFdBQ09NX1FVSVJLX01PTklUT1IJCTB4MDAwNAorI2RlZmluZSBXQUNPTV9RVUlSS19CQVRURVJZCQkweDAwMDgKIAogI2RlZmluZSBXQUNPTV9QRU5fRklFTEQoZikJKCgoZiktPmxvZ2ljYWwgPT0gSElEX0RHX1NUWUxVUykgfHwgXAogCQkJCSAoKGYpLT5waHlzaWNhbCA9PSBISURfREdfU1RZTFVTKSB8fCBcCkBAIC0xMjIsNiArMTI1LDcgQEAKIAlCQU1CT09fUFQsCiAJV0FDT01fMjRIRFQsCiAJV0FDT01fMjdRSERULAorCUJBTUJPT19QQUQsCiAJVEFCTEVUUEMsICAgLyogYWRkIG5ldyBUUEMgYmVsb3cgKi8KIAlUQUJMRVRQQ0UsCiAJVEFCTEVUUEMyRkcsCkBAIC0xNjksNiArMTczLDggQEAKIAl1bnNpZ25lZCB0b3VjaF9tYXg7CiAJaW50IHR5cGU7CiAJc3RydWN0IGlucHV0X2RldiAqdG91Y2hfaW5wdXQ7CisJc3RydWN0IGhpZF9kZXZpY2UgKnBlbjsKKwlzdHJ1Y3QgaGlkX2RldmljZSAqdG91Y2g7CiB9OwogCiBzdHJ1Y3QgaGlkX2RhdGEgewpAQCAtMjA1LDYgKzIxMSw3IEBACiAJaW50IGJhdHRlcnlfY2FwYWNpdHk7CiAJaW50IG51bV9jb250YWN0c19sZWZ0OwogCWludCBiYXRfY2hhcmdpbmc7CisJaW50IGJhdF9jb25uZWN0ZWQ7CiAJaW50IHBzX2Nvbm5lY3RlZDsKIAl1OCBidF9mZWF0dXJlczsKIAl1OCBidF9oaWdoX3NwZWVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9oc2kvY2xpZW50cy9LY29uZmlnIGIvZHJpdmVycy9oc2kvY2xpZW50cy9LY29uZmlnCmluZGV4IGJjNjBkZWMuLmQ2MTI2MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHNpL2NsaWVudHMvS2NvbmZpZworKysgYi9kcml2ZXJzL2hzaS9jbGllbnRzL0tjb25maWcKQEAgLTYsMTMgKzYsMjMgQEAKIAogY29uZmlnIE5PS0lBX01PREVNCiAJdHJpc3RhdGUgIk5va2lhIE1vZGVtIgotCWRlcGVuZHMgb24gSFNJICYmIFNTSV9QUk9UT0NPTAorCWRlcGVuZHMgb24gSFNJICYmIFNTSV9QUk9UT0NPTCAmJiBDTVRfU1BFRUNICiAJaGVscAogCVNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBtb2RlbSBvbiBOb2tpYQogCU45MDAgKE5va2lhIFJYLTUxKSBoYXJkd2FyZS4KIAogCUlmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBDTVRfU1BFRUNICisJdHJpc3RhdGUgIkNNVCBzcGVlY2giCisJZGVwZW5kcyBvbiBIU0kgJiYgU1NJX1BST1RPQ09MCisJaGVscAorCUlmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBlbmFibGUgdGhlIENNVCBzcGVlY2ggcHJvdG9jb2wgdXNlZAorCWJ5IE5va2lhIG1vZGVtcy4gSWYgeW91IHNheSBNIHRoZSBwcm90b2NvbCB3aWxsIGJlIGF2YWlsYWJsZSBhcworCW1vZHVsZSBuYW1lZCBjbXRfc3BlZWNoLgorCisJSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIFNTSV9QUk9UT0NPTAogCXRyaXN0YXRlICJTU0kgcHJvdG9jb2wiCiAJZGVwZW5kcyBvbiBIU0kgJiYgUEhPTkVUICYmIE9NQVBfU1NJCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hzaS9jbGllbnRzL01ha2VmaWxlIGIvZHJpdmVycy9oc2kvY2xpZW50cy9NYWtlZmlsZQppbmRleCA0ZDViYzBlLi4yNjA3MjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hzaS9jbGllbnRzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaHNpL2NsaWVudHMvTWFrZWZpbGUKQEAgLTQsNCArNCw1IEBACiAKIG9iai0kKENPTkZJR19OT0tJQV9NT0RFTSkJKz0gbm9raWEtbW9kZW0ubwogb2JqLSQoQ09ORklHX1NTSV9QUk9UT0NPTCkJKz0gc3NpX3Byb3RvY29sLm8KK29iai0kKENPTkZJR19DTVRfU1BFRUNIKQkrPSBjbXRfc3BlZWNoLm8KIG9iai0kKENPTkZJR19IU0lfQ0hBUikJCSs9IGhzaV9jaGFyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHNpL2NsaWVudHMvY210X3NwZWVjaC5jIGIvZHJpdmVycy9oc2kvY2xpZW50cy9jbXRfc3BlZWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4MzUyOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHNpL2NsaWVudHMvY210X3NwZWVjaC5jCkBAIC0wLDAgKzEsMTQ1NyBAQAorLyoKKyAqIGNtdF9zcGVlY2guYyAtIEhTSSBDTVQgc3BlZWNoIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5LDIwMTAgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdDogS2FpIFZlaG1hbmVuIDxrYWkudmVobWFuZW5Abm9raWEuY29tPgorICogT3JpZ2luYWwgYXV0aG9yOiBQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9oc2kvaHNpLmg+CisjaW5jbHVkZSA8bGludXgvaHNpL3NzaV9wcm90b2NvbC5oPgorI2luY2x1ZGUgPGxpbnV4L2hzaS9jcy1wcm90b2NvbC5oPgorCisjZGVmaW5lIENTX01NQVBfU0laRQlQQUdFX1NJWkUKKworc3RydWN0IGNoYXJfcXVldWUgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwl1MzIJCQltc2c7Cit9OworCitzdHJ1Y3QgY3NfY2hhciB7CisJdW5zaWduZWQgaW50CQlvcGVuZWQ7CisJc3RydWN0IGhzaV9jbGllbnQJKmNsOworCXN0cnVjdCBjc19oc2lfaWZhY2UJKmhpOworCXN0cnVjdCBsaXN0X2hlYWQJY2hhcmRldl9xdWV1ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWRhdGFpbmRfcXVldWU7CisJaW50CQkJZGF0YWluZF9wZW5kaW5nOworCS8qIG1tYXAgdGhpbmdzICovCisJdW5zaWduZWQgbG9uZwkJbW1hcF9iYXNlOworCXVuc2lnbmVkIGxvbmcJCW1tYXBfc2l6ZTsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCBmYXN5bmNfc3RydWN0CSphc3luY19xdWV1ZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0OworCS8qIGhzaSBjaGFubmVsIGlkcyAqLworCWludCAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfaWRfY21kOworCWludCAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfaWRfZGF0YTsKK307CisKKyNkZWZpbmUgU1NJX0NIQU5ORUxfU1RBVEVfUkVBRElORwkxCisjZGVmaW5lIFNTSV9DSEFOTkVMX1NUQVRFX1dSSVRJTkcJKDEgPDwgMSkKKyNkZWZpbmUgU1NJX0NIQU5ORUxfU1RBVEVfUE9MTAkJKDEgPDwgMikKKyNkZWZpbmUgU1NJX0NIQU5ORUxfU1RBVEVfRVJST1IJCSgxIDw8IDMpCisKKyNkZWZpbmUgVEFSR0VUX01BU0sJCQkweGYwMDAwMDAKKyNkZWZpbmUgVEFSR0VUX1JFTU9URQkJCSgxIDw8IENTX0RPTUFJTl9TSElGVCkKKyNkZWZpbmUgVEFSR0VUX0xPQ0FMCQkJMAorCisvKiBOdW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBjb21tYW5kcyBidWZmZXJzICovCisjZGVmaW5lIENTX01BWF9DTURTCQkgICAgICAgIDQKKworLyoKKyAqIER1cmluZyBkYXRhIHRyYW5zZmVycywgdHJhbnNhY3Rpb25zIG11c3QgYmUgaGFuZGxlZAorICogd2l0aGluIDIwbXMgKGZpeGVkIHZhbHVlIGluIGNtdHNwZWVjaCBIU0kgcHJvdG9jb2wpCisgKi8KKyNkZWZpbmUgQ1NfUU9TX0xBVEVOQ1lfRk9SX0RBVEFfVVNFQwkyMDAwMAorCisvKiBUaW1lb3V0IHRvIHdhaXQgZm9yIHBlbmRpbmcgSFNJIHRyYW5zZmVycyB0byBjb21wbGV0ZSAqLworI2RlZmluZSBDU19IU0lfVFJBTlNGRVJfVElNRU9VVF9NUyAgICAgIDUwMAorCisKKyNkZWZpbmUgUlhfUFRSX0JPVU5EQVJZX1NISUZUCQk4CisjZGVmaW5lIFJYX1BUUl9NQVhfU0hJRlQJCShSWF9QVFJfQk9VTkRBUllfU0hJRlQgKyBcCisJCQkJCQlDU19NQVhfQlVGRkVSU19TSElGVCkKK3N0cnVjdCBjc19oc2lfaWZhY2UgeworCXN0cnVjdCBoc2lfY2xpZW50CQkqY2w7CisJc3RydWN0IGhzaV9jbGllbnQJCSptYXN0ZXI7CisKKwl1bnNpZ25lZCBpbnQJCQlpZmFjZV9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQJCQl3YWtlbGluZV9zdGF0ZTsKKwl1bnNpZ25lZCBpbnQJCQljb250cm9sX3N0YXRlOworCXVuc2lnbmVkIGludAkJCWRhdGFfc3RhdGU7CisKKwkvKiBzdGF0ZSBleHBvc2VkIHRvIGFwcGxpY2F0aW9uICovCisJc3RydWN0IGNzX21tYXBfY29uZmlnX2Jsb2NrCSptbWFwX2NmZzsKKworCXVuc2lnbmVkIGxvbmcJCQltbWFwX2Jhc2U7CisJdW5zaWduZWQgbG9uZwkJCW1tYXBfc2l6ZTsKKworCXVuc2lnbmVkIGludAkJCXJ4X3Nsb3Q7CisJdW5zaWduZWQgaW50CQkJdHhfc2xvdDsKKworCS8qIG5vdGU6IGZvciBzZWN1cml0eSByZWFzb25zLCB3ZSBkbyBub3QgdHJ1c3QgdGhlIGNvbnRlbnRzIG9mCisJICogbW1hcF9jZmcsIGJ1dCBpbnN0ZWFkIGR1cGxpY2F0ZSB0aGUgdmFyaWFibGVzIGhlcmUgKi8KKwl1bnNpZ25lZCBpbnQJCQlidWZfc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCQlyeF9idWZzOworCXVuc2lnbmVkIGludAkJCXR4X2J1ZnM7CisJdW5zaWduZWQgaW50CQkJcnhfcHRyX2JvdW5kYXJ5OworCXVuc2lnbmVkIGludAkJCXJ4X29mZnNldHNbQ1NfTUFYX0JVRkZFUlNdOworCXVuc2lnbmVkIGludAkJCXR4X29mZnNldHNbQ1NfTUFYX0JVRkZFUlNdOworCisJLyogc2l6ZSBvZiBhbGlnbmVkIG1lbW9yeSBibG9ja3MgKi8KKwl1bnNpZ25lZCBpbnQJCQlzbG90X3NpemU7CisJdW5zaWduZWQgaW50CQkJZmxhZ3M7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCQljbWRxdWV1ZTsKKworCXN0cnVjdCBoc2lfbXNnCQkJKmRhdGFfcnhfbXNnOworCXN0cnVjdCBoc2lfbXNnCQkJKmRhdGFfdHhfbXNnOworCXdhaXRfcXVldWVfaGVhZF90CQlkYXRhd2FpdDsKKworCXN0cnVjdCBwbV9xb3NfcmVxdWVzdCAgICAgICAgICAgcG1fcW9zX3JlcTsKKworCXNwaW5sb2NrX3QJCQlsb2NrOworfTsKKworc3RhdGljIHN0cnVjdCBjc19jaGFyIGNzX2NoYXJfZGF0YTsKKworc3RhdGljIHZvaWQgY3NfaHNpX3JlYWRfb25fY29udHJvbChzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSk7CitzdGF0aWMgdm9pZCBjc19oc2lfcmVhZF9vbl9kYXRhKHN0cnVjdCBjc19oc2lfaWZhY2UgKmhpKTsKKworc3RhdGljIGlubGluZSB2b2lkIHJ4X3B0cl9zaGlmdF90b29fYmlnKHZvaWQpCit7CisJQlVJTERfQlVHX09OKCgxTExVIDw8IFJYX1BUUl9NQVhfU0hJRlQpID4gVUlOVF9NQVgpOworfQorCitzdGF0aWMgdm9pZCBjc19ub3RpZnkodTMyIG1lc3NhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGNoYXJfcXVldWUgKmVudHJ5OworCisJc3Bpbl9sb2NrKCZjc19jaGFyX2RhdGEubG9jayk7CisKKwlpZiAoIWNzX2NoYXJfZGF0YS5vcGVuZWQpIHsKKwkJc3Bpbl91bmxvY2soJmNzX2NoYXJfZGF0YS5sb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCisJZW50cnkgPSBrbWFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWVudHJ5KSB7CisJCWRldl9lcnIoJmNzX2NoYXJfZGF0YS5jbC0+ZGV2aWNlLAorCQkJIkNhbid0IGFsbG9jYXRlIG5ldyBlbnRyeSBmb3IgdGhlIHF1ZXVlLlxuIik7CisJCXNwaW5fdW5sb2NrKCZjc19jaGFyX2RhdGEubG9jayk7CisJCWdvdG8gb3V0OworCX0KKworCWVudHJ5LT5tc2cgPSBtZXNzYWdlOworCWxpc3RfYWRkX3RhaWwoJmVudHJ5LT5saXN0LCBoZWFkKTsKKworCXNwaW5fdW5sb2NrKCZjc19jaGFyX2RhdGEubG9jayk7CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNzX2NoYXJfZGF0YS53YWl0KTsKKwlraWxsX2Zhc3luYygmY3NfY2hhcl9kYXRhLmFzeW5jX3F1ZXVlLCBTSUdJTywgUE9MTF9JTik7CisKK291dDoKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB1MzIgY3NfcG9wX2VudHJ5KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGNoYXJfcXVldWUgKmVudHJ5OworCXUzMiBkYXRhOworCisJZW50cnkgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIHN0cnVjdCBjaGFyX3F1ZXVlLCBsaXN0KTsKKwlkYXRhID0gZW50cnktPm1zZzsKKwlsaXN0X2RlbCgmZW50cnktPmxpc3QpOworCWtmcmVlKGVudHJ5KTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgdm9pZCBjc19ub3RpZnlfY29udHJvbCh1MzIgbWVzc2FnZSkKK3sKKwljc19ub3RpZnkobWVzc2FnZSwgJmNzX2NoYXJfZGF0YS5jaGFyZGV2X3F1ZXVlKTsKK30KKworc3RhdGljIHZvaWQgY3Nfbm90aWZ5X2RhdGEodTMyIG1lc3NhZ2UsIGludCBtYXhsZW5ndGgpCit7CisJY3Nfbm90aWZ5KG1lc3NhZ2UsICZjc19jaGFyX2RhdGEuZGF0YWluZF9xdWV1ZSk7CisKKwlzcGluX2xvY2soJmNzX2NoYXJfZGF0YS5sb2NrKTsKKwljc19jaGFyX2RhdGEuZGF0YWluZF9wZW5kaW5nKys7CisJd2hpbGUgKGNzX2NoYXJfZGF0YS5kYXRhaW5kX3BlbmRpbmcgPiBtYXhsZW5ndGggJiYKKwkJCQkhbGlzdF9lbXB0eSgmY3NfY2hhcl9kYXRhLmRhdGFpbmRfcXVldWUpKSB7CisJCWRldl9kYmcoJmNzX2NoYXJfZGF0YS5jbC0+ZGV2aWNlLCAiZGF0YSBub3RpZmljYXRpb24gIgorCQkicXVldWUgb3ZlcnJ1biAoJXUgZW50cmllcylcbiIsIGNzX2NoYXJfZGF0YS5kYXRhaW5kX3BlbmRpbmcpOworCisJCWNzX3BvcF9lbnRyeSgmY3NfY2hhcl9kYXRhLmRhdGFpbmRfcXVldWUpOworCQljc19jaGFyX2RhdGEuZGF0YWluZF9wZW5kaW5nLS07CisJfQorCXNwaW5fdW5sb2NrKCZjc19jaGFyX2RhdGEubG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjc19zZXRfY21kKHN0cnVjdCBoc2lfbXNnICptc2csIHUzMiBjbWQpCit7CisJdTMyICpkYXRhID0gc2dfdmlydChtc2ctPnNndC5zZ2wpOworCSpkYXRhID0gY21kOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBjc19nZXRfY21kKHN0cnVjdCBoc2lfbXNnICptc2cpCit7CisJdTMyICpkYXRhID0gc2dfdmlydChtc2ctPnNndC5zZ2wpOworCXJldHVybiAqZGF0YTsKK30KKworc3RhdGljIHZvaWQgY3NfcmVsZWFzZV9jbWQoc3RydWN0IGhzaV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSA9IG1zZy0+Y29udGV4dDsKKworCWxpc3RfYWRkX3RhaWwoJm1zZy0+bGluaywgJmhpLT5jbWRxdWV1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNzX2NtZF9kZXN0cnVjdG9yKHN0cnVjdCBoc2lfbXNnICptc2cpCit7CisJc3RydWN0IGNzX2hzaV9pZmFjZSAqaGkgPSBtc2ctPmNvbnRleHQ7CisKKwlzcGluX2xvY2soJmhpLT5sb2NrKTsKKworCWRldl9kYmcoJmNzX2NoYXJfZGF0YS5jbC0+ZGV2aWNlLCAiY29udHJvbCBjbWQgZGVzdHJ1Y3RvclxuIik7CisKKwlpZiAoaGktPmlmYWNlX3N0YXRlICE9IENTX1NUQVRFX0NMT1NFRCkKKwkJZGV2X2VycigmaGktPmNsLT5kZXZpY2UsICJDbWQgZmx1c2hlZCB3aGlsZSBkcml2ZXIgYWN0aXZlXG4iKTsKKworCWlmIChtc2ctPnR0eXBlID09IEhTSV9NU0dfUkVBRCkKKwkJaGktPmNvbnRyb2xfc3RhdGUgJj0KKwkJCX4oU1NJX0NIQU5ORUxfU1RBVEVfUE9MTCB8IFNTSV9DSEFOTkVMX1NUQVRFX1JFQURJTkcpOworCWVsc2UgaWYgKG1zZy0+dHR5cGUgPT0gSFNJX01TR19XUklURSAmJgorCQkJaGktPmNvbnRyb2xfc3RhdGUgJiBTU0lfQ0hBTk5FTF9TVEFURV9XUklUSU5HKQorCQloaS0+Y29udHJvbF9zdGF0ZSAmPSB+U1NJX0NIQU5ORUxfU1RBVEVfV1JJVElORzsKKworCWNzX3JlbGVhc2VfY21kKG1zZyk7CisKKwlzcGluX3VubG9jaygmaGktPmxvY2spOworfQorCitzdGF0aWMgc3RydWN0IGhzaV9tc2cgKmNzX2NsYWltX2NtZChzdHJ1Y3QgY3NfaHNpX2lmYWNlKiBzc2kpCit7CisJc3RydWN0IGhzaV9tc2cgKm1zZzsKKworCUJVR19PTihsaXN0X2VtcHR5KCZzc2ktPmNtZHF1ZXVlKSk7CisKKwltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZzc2ktPmNtZHF1ZXVlLCBzdHJ1Y3QgaHNpX21zZywgbGluayk7CisJbGlzdF9kZWwoJm1zZy0+bGluayk7CisJbXNnLT5kZXN0cnVjdG9yID0gY3NfY21kX2Rlc3RydWN0b3I7CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgdm9pZCBjc19mcmVlX2NtZHMoc3RydWN0IGNzX2hzaV9pZmFjZSAqc3NpKQoreworCXN0cnVjdCBoc2lfbXNnICptc2csICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCB0bXAsICZzc2ktPmNtZHF1ZXVlLCBsaW5rKSB7CisJCWxpc3RfZGVsKCZtc2ctPmxpbmspOworCQltc2ctPmRlc3RydWN0b3IgPSBOVUxMOworCQlrZnJlZShzZ192aXJ0KG1zZy0+c2d0LnNnbCkpOworCQloc2lfZnJlZV9tc2cobXNnKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY3NfYWxsb2NfY21kcyhzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSkKK3sKKwlzdHJ1Y3QgaHNpX21zZyAqbXNnOworCXUzMiAqYnVmOworCXVuc2lnbmVkIGludCBpOworCisJSU5JVF9MSVNUX0hFQUQoJmhpLT5jbWRxdWV1ZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ1NfTUFYX0NNRFM7IGkrKykgeworCQltc2cgPSBoc2lfYWxsb2NfbXNnKDEsIEdGUF9LRVJORUwpOworCQlpZiAoIW1zZykKKwkJCWdvdG8gb3V0OworCQlidWYgPSBrbWFsbG9jKHNpemVvZigqYnVmKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmKSB7CisJCQloc2lfZnJlZV9tc2cobXNnKTsKKwkJCWdvdG8gb3V0OworCQl9CisJCXNnX2luaXRfb25lKG1zZy0+c2d0LnNnbCwgYnVmLCBzaXplb2YoKmJ1ZikpOworCQltc2ctPmNoYW5uZWwgPSBjc19jaGFyX2RhdGEuY2hhbm5lbF9pZF9jbWQ7CisJCW1zZy0+Y29udGV4dCA9IGhpOworCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpbmssICZoaS0+Y21kcXVldWUpOworCX0KKworCXJldHVybiAwOworCitvdXQ6CisJY3NfZnJlZV9jbWRzKGhpKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgY3NfaHNpX2RhdGFfZGVzdHJ1Y3RvcihzdHJ1Y3QgaHNpX21zZyAqbXNnKQoreworCXN0cnVjdCBjc19oc2lfaWZhY2UgKmhpID0gbXNnLT5jb250ZXh0OworCWNvbnN0IGNoYXIgKmRpciA9IChtc2ctPnR0eXBlID09IEhTSV9NU0dfUkVBRCkgPyAiVFgiIDogIlJYIjsKKworCWRldl9kYmcoJmNzX2NoYXJfZGF0YS5jbC0+ZGV2aWNlLCAiRnJlZWluZyBkYXRhICVzIG1lc3NhZ2VcbiIsIGRpcik7CisKKwlzcGluX2xvY2soJmhpLT5sb2NrKTsKKwlpZiAoaGktPmlmYWNlX3N0YXRlICE9IENTX1NUQVRFX0NMT1NFRCkKKwkJZGV2X2VycigmY3NfY2hhcl9kYXRhLmNsLT5kZXZpY2UsCisJCQkJIkRhdGEgJXMgZmx1c2ggd2hpbGUgZGV2aWNlIGFjdGl2ZVxuIiwgZGlyKTsKKwlpZiAobXNnLT50dHlwZSA9PSBIU0lfTVNHX1JFQUQpCisJCWhpLT5kYXRhX3N0YXRlICY9CisJCQl+KFNTSV9DSEFOTkVMX1NUQVRFX1BPTEwgfCBTU0lfQ0hBTk5FTF9TVEFURV9SRUFESU5HKTsKKwllbHNlCisJCWhpLT5kYXRhX3N0YXRlICY9IH5TU0lfQ0hBTk5FTF9TVEFURV9XUklUSU5HOworCisJbXNnLT5zdGF0dXMgPSBIU0lfU1RBVFVTX0NPTVBMRVRFRDsKKwlpZiAodW5saWtlbHkod2FpdHF1ZXVlX2FjdGl2ZSgmaGktPmRhdGF3YWl0KSkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGktPmRhdGF3YWl0KTsKKworCXNwaW5fdW5sb2NrKCZoaS0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgY3NfaHNpX2FsbG9jX2RhdGEoc3RydWN0IGNzX2hzaV9pZmFjZSAqaGkpCit7CisJc3RydWN0IGhzaV9tc2cgKnR4bXNnLCAqcnhtc2c7CisJaW50IHJlcyA9IDA7CisKKwlyeG1zZyA9IGhzaV9hbGxvY19tc2coMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeG1zZykgeworCQlyZXMgPSAtRU5PTUVNOworCQlnb3RvIG91dDE7CisJfQorCXJ4bXNnLT5jaGFubmVsID0gY3NfY2hhcl9kYXRhLmNoYW5uZWxfaWRfZGF0YTsKKwlyeG1zZy0+ZGVzdHJ1Y3RvciA9IGNzX2hzaV9kYXRhX2Rlc3RydWN0b3I7CisJcnhtc2ctPmNvbnRleHQgPSBoaTsKKworCXR4bXNnID0gaHNpX2FsbG9jX21zZygxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4bXNnKSB7CisJCXJlcyA9IC1FTk9NRU07CisJCWdvdG8gb3V0MjsKKwl9CisJdHhtc2ctPmNoYW5uZWwgPSBjc19jaGFyX2RhdGEuY2hhbm5lbF9pZF9kYXRhOworCXR4bXNnLT5kZXN0cnVjdG9yID0gY3NfaHNpX2RhdGFfZGVzdHJ1Y3RvcjsKKwl0eG1zZy0+Y29udGV4dCA9IGhpOworCisJaGktPmRhdGFfcnhfbXNnID0gcnhtc2c7CisJaGktPmRhdGFfdHhfbXNnID0gdHhtc2c7CisKKwlyZXR1cm4gMDsKKworb3V0MjoKKwloc2lfZnJlZV9tc2cocnhtc2cpOworb3V0MToKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBjc19oc2lfZnJlZV9kYXRhX21zZyhzdHJ1Y3QgaHNpX21zZyAqbXNnKQoreworCVdBUk5fT04obXNnLT5zdGF0dXMgIT0gSFNJX1NUQVRVU19DT01QTEVURUQgJiYKKwkJCQkJbXNnLT5zdGF0dXMgIT0gSFNJX1NUQVRVU19FUlJPUik7CisJaHNpX2ZyZWVfbXNnKG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGNzX2hzaV9mcmVlX2RhdGEoc3RydWN0IGNzX2hzaV9pZmFjZSAqaGkpCit7CisJY3NfaHNpX2ZyZWVfZGF0YV9tc2coaGktPmRhdGFfcnhfbXNnKTsKKwljc19oc2lfZnJlZV9kYXRhX21zZyhoaS0+ZGF0YV90eF9tc2cpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19jc19oc2lfZXJyb3JfcHJlKHN0cnVjdCBjc19oc2lfaWZhY2UgKmhpLAorCQkJCQlzdHJ1Y3QgaHNpX21zZyAqbXNnLCBjb25zdCBjaGFyICppbmZvLAorCQkJCQl1bnNpZ25lZCBpbnQgKnN0YXRlKQoreworCXNwaW5fbG9jaygmaGktPmxvY2spOworCWRldl9lcnIoJmhpLT5jbC0+ZGV2aWNlLCAiSFNJICVzIGVycm9yLCBtc2cgJWQsIHN0YXRlICV1XG4iLAorCQlpbmZvLCBtc2ctPnN0YXR1cywgKnN0YXRlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fY3NfaHNpX2Vycm9yX3Bvc3Qoc3RydWN0IGNzX2hzaV9pZmFjZSAqaGkpCit7CisJc3Bpbl91bmxvY2soJmhpLT5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fY3NfaHNpX2Vycm9yX3JlYWRfYml0cyh1bnNpZ25lZCBpbnQgKnN0YXRlKQoreworCSpzdGF0ZSB8PSBTU0lfQ0hBTk5FTF9TVEFURV9FUlJPUjsKKwkqc3RhdGUgJj0gfihTU0lfQ0hBTk5FTF9TVEFURV9SRUFESU5HIHwgU1NJX0NIQU5ORUxfU1RBVEVfUE9MTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2NzX2hzaV9lcnJvcl93cml0ZV9iaXRzKHVuc2lnbmVkIGludCAqc3RhdGUpCit7CisJKnN0YXRlIHw9IFNTSV9DSEFOTkVMX1NUQVRFX0VSUk9SOworCSpzdGF0ZSAmPSB+U1NJX0NIQU5ORUxfU1RBVEVfV1JJVElORzsKK30KKworc3RhdGljIHZvaWQgY3NfaHNpX2NvbnRyb2xfcmVhZF9lcnJvcihzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSwKKwkJCQkJCQlzdHJ1Y3QgaHNpX21zZyAqbXNnKQoreworCV9fY3NfaHNpX2Vycm9yX3ByZShoaSwgbXNnLCAiY29udHJvbCByZWFkIiwgJmhpLT5jb250cm9sX3N0YXRlKTsKKwljc19yZWxlYXNlX2NtZChtc2cpOworCV9fY3NfaHNpX2Vycm9yX3JlYWRfYml0cygmaGktPmNvbnRyb2xfc3RhdGUpOworCV9fY3NfaHNpX2Vycm9yX3Bvc3QoaGkpOworfQorCitzdGF0aWMgdm9pZCBjc19oc2lfY29udHJvbF93cml0ZV9lcnJvcihzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSwKKwkJCQkJCQlzdHJ1Y3QgaHNpX21zZyAqbXNnKQoreworCV9fY3NfaHNpX2Vycm9yX3ByZShoaSwgbXNnLCAiY29udHJvbCB3cml0ZSIsICZoaS0+Y29udHJvbF9zdGF0ZSk7CisJY3NfcmVsZWFzZV9jbWQobXNnKTsKKwlfX2NzX2hzaV9lcnJvcl93cml0ZV9iaXRzKCZoaS0+Y29udHJvbF9zdGF0ZSk7CisJX19jc19oc2lfZXJyb3JfcG9zdChoaSk7CisKK30KKworc3RhdGljIHZvaWQgY3NfaHNpX2RhdGFfcmVhZF9lcnJvcihzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSwgc3RydWN0IGhzaV9tc2cgKm1zZykKK3sKKwlfX2NzX2hzaV9lcnJvcl9wcmUoaGksIG1zZywgImRhdGEgcmVhZCIsICZoaS0+ZGF0YV9zdGF0ZSk7CisJX19jc19oc2lfZXJyb3JfcmVhZF9iaXRzKCZoaS0+ZGF0YV9zdGF0ZSk7CisJX19jc19oc2lfZXJyb3JfcG9zdChoaSk7Cit9CisKK3N0YXRpYyB2b2lkIGNzX2hzaV9kYXRhX3dyaXRlX2Vycm9yKHN0cnVjdCBjc19oc2lfaWZhY2UgKmhpLAorCQkJCQkJCXN0cnVjdCBoc2lfbXNnICptc2cpCit7CisJX19jc19oc2lfZXJyb3JfcHJlKGhpLCBtc2csICJkYXRhIHdyaXRlIiwgJmhpLT5kYXRhX3N0YXRlKTsKKwlfX2NzX2hzaV9lcnJvcl93cml0ZV9iaXRzKCZoaS0+ZGF0YV9zdGF0ZSk7CisJX19jc19oc2lfZXJyb3JfcG9zdChoaSk7Cit9CisKK3N0YXRpYyB2b2lkIGNzX2hzaV9yZWFkX29uX2NvbnRyb2xfY29tcGxldGUoc3RydWN0IGhzaV9tc2cgKm1zZykKK3sKKwl1MzIgY21kID0gY3NfZ2V0X2NtZChtc2cpOworCXN0cnVjdCBjc19oc2lfaWZhY2UgKmhpID0gbXNnLT5jb250ZXh0OworCisJc3Bpbl9sb2NrKCZoaS0+bG9jayk7CisJaGktPmNvbnRyb2xfc3RhdGUgJj0gflNTSV9DSEFOTkVMX1NUQVRFX1JFQURJTkc7CisJaWYgKG1zZy0+c3RhdHVzID09IEhTSV9TVEFUVVNfRVJST1IpIHsKKwkJZGV2X2VycigmaGktPmNsLT5kZXZpY2UsICJDb250cm9sIFJYIGVycm9yIGRldGVjdGVkXG4iKTsKKwkJY3NfaHNpX2NvbnRyb2xfcmVhZF9lcnJvcihoaSwgbXNnKTsKKwkJc3Bpbl91bmxvY2soJmhpLT5sb2NrKTsKKwkJZ290byBvdXQ7CisJfQorCWRldl9kYmcoJmhpLT5jbC0+ZGV2aWNlLCAiUmVhZCBvbiBjb250cm9sOiAlMDhYXG4iLCBjbWQpOworCWNzX3JlbGVhc2VfY21kKG1zZyk7CisJaWYgKGhpLT5mbGFncyAmIENTX0ZFQVRfVFNUQU1QX1JYX0NUUkwpIHsKKwkJc3RydWN0IHRpbWVzcGVjICp0c3RhbXAgPQorCQkJJmhpLT5tbWFwX2NmZy0+dHN0YW1wX3J4X2N0cmw7CisJCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKHRzdGFtcCk7CisJfQorCXNwaW5fdW5sb2NrKCZoaS0+bG9jayk7CisKKwljc19ub3RpZnlfY29udHJvbChjbWQpOworCitvdXQ6CisJY3NfaHNpX3JlYWRfb25fY29udHJvbChoaSk7Cit9CisKK3N0YXRpYyB2b2lkIGNzX2hzaV9wZWVrX29uX2NvbnRyb2xfY29tcGxldGUoc3RydWN0IGhzaV9tc2cgKm1zZykKK3sKKwlzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSA9IG1zZy0+Y29udGV4dDsKKwlpbnQgcmV0OworCisJaWYgKG1zZy0+c3RhdHVzID09IEhTSV9TVEFUVVNfRVJST1IpIHsKKwkJZGV2X2VycigmaGktPmNsLT5kZXZpY2UsICJDb250cm9sIHBlZWsgUlggZXJyb3IgZGV0ZWN0ZWRcbiIpOworCQljc19oc2lfY29udHJvbF9yZWFkX2Vycm9yKGhpLCBtc2cpOworCQlyZXR1cm47CisJfQorCisJV0FSTl9PTighKGhpLT5jb250cm9sX3N0YXRlICYgU1NJX0NIQU5ORUxfU1RBVEVfUkVBRElORykpOworCisJZGV2X2RiZygmaGktPmNsLT5kZXZpY2UsICJQZWVrIG9uIGNvbnRyb2wgY29tcGxldGUsIHJlYWRpbmdcbiIpOworCW1zZy0+c2d0Lm5lbnRzID0gMTsKKwltc2ctPmNvbXBsZXRlID0gY3NfaHNpX3JlYWRfb25fY29udHJvbF9jb21wbGV0ZTsKKwlyZXQgPSBoc2lfYXN5bmNfcmVhZChoaS0+Y2wsIG1zZyk7CisJaWYgKHJldCkKKwkJY3NfaHNpX2NvbnRyb2xfcmVhZF9lcnJvcihoaSwgbXNnKTsKK30KKworc3RhdGljIHZvaWQgY3NfaHNpX3JlYWRfb25fY29udHJvbChzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSkKK3sKKwlzdHJ1Y3QgaHNpX21zZyAqbXNnOworCWludCByZXQ7CisKKwlzcGluX2xvY2soJmhpLT5sb2NrKTsKKwlpZiAoaGktPmNvbnRyb2xfc3RhdGUgJiBTU0lfQ0hBTk5FTF9TVEFURV9SRUFESU5HKSB7CisJCWRldl9lcnIoJmhpLT5jbC0+ZGV2aWNlLCAiQ29udHJvbCByZWFkIGFscmVhZHkgcGVuZGluZyAoJWQpXG4iLAorCQkJaGktPmNvbnRyb2xfc3RhdGUpOworCQlzcGluX3VubG9jaygmaGktPmxvY2spOworCQlyZXR1cm47CisJfQorCWlmIChoaS0+Y29udHJvbF9zdGF0ZSAmIFNTSV9DSEFOTkVMX1NUQVRFX0VSUk9SKSB7CisJCWRldl9lcnIoJmhpLT5jbC0+ZGV2aWNlLCAiQ29udHJvbCByZWFkIGVycm9yICglZClcbiIsCisJCQloaS0+Y29udHJvbF9zdGF0ZSk7CisJCXNwaW5fdW5sb2NrKCZoaS0+bG9jayk7CisJCXJldHVybjsKKwl9CisJaGktPmNvbnRyb2xfc3RhdGUgfD0gU1NJX0NIQU5ORUxfU1RBVEVfUkVBRElORzsKKwlkZXZfZGJnKCZoaS0+Y2wtPmRldmljZSwgIklzc3VpbmcgUlggb24gY29udHJvbFxuIik7CisJbXNnID0gY3NfY2xhaW1fY21kKGhpKTsKKwlzcGluX3VubG9jaygmaGktPmxvY2spOworCisJbXNnLT5zZ3QubmVudHMgPSAwOworCW1zZy0+Y29tcGxldGUgPSBjc19oc2lfcGVla19vbl9jb250cm9sX2NvbXBsZXRlOworCXJldCA9IGhzaV9hc3luY19yZWFkKGhpLT5jbCwgbXNnKTsKKwlpZiAocmV0KQorCQljc19oc2lfY29udHJvbF9yZWFkX2Vycm9yKGhpLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBjc19oc2lfd3JpdGVfb25fY29udHJvbF9jb21wbGV0ZShzdHJ1Y3QgaHNpX21zZyAqbXNnKQoreworCXN0cnVjdCBjc19oc2lfaWZhY2UgKmhpID0gbXNnLT5jb250ZXh0OworCWlmIChtc2ctPnN0YXR1cyA9PSBIU0lfU1RBVFVTX0NPTVBMRVRFRCkgeworCQlzcGluX2xvY2soJmhpLT5sb2NrKTsKKwkJaGktPmNvbnRyb2xfc3RhdGUgJj0gflNTSV9DSEFOTkVMX1NUQVRFX1dSSVRJTkc7CisJCWNzX3JlbGVhc2VfY21kKG1zZyk7CisJCXNwaW5fdW5sb2NrKCZoaS0+bG9jayk7CisJfSBlbHNlIGlmIChtc2ctPnN0YXR1cyA9PSBIU0lfU1RBVFVTX0VSUk9SKSB7CisJCWNzX2hzaV9jb250cm9sX3dyaXRlX2Vycm9yKGhpLCBtc2cpOworCX0gZWxzZSB7CisJCWRldl9lcnIoJmhpLT5jbC0+ZGV2aWNlLAorCQkJInVuZXhwZWN0ZWQgc3RhdHVzIGluIGNvbnRyb2wgd3JpdGUgY2FsbGJhY2sgJWRcbiIsCisJCQltc2ctPnN0YXR1cyk7CisJfQorfQorCitzdGF0aWMgaW50IGNzX2hzaV93cml0ZV9vbl9jb250cm9sKHN0cnVjdCBjc19oc2lfaWZhY2UgKmhpLCB1MzIgbWVzc2FnZSkKK3sKKwlzdHJ1Y3QgaHNpX21zZyAqbXNnOworCWludCByZXQ7CisKKwlzcGluX2xvY2soJmhpLT5sb2NrKTsKKwlpZiAoaGktPmNvbnRyb2xfc3RhdGUgJiBTU0lfQ0hBTk5FTF9TVEFURV9FUlJPUikgeworCQlzcGluX3VubG9jaygmaGktPmxvY2spOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGhpLT5jb250cm9sX3N0YXRlICYgU1NJX0NIQU5ORUxfU1RBVEVfV1JJVElORykgeworCQlkZXZfZXJyKCZoaS0+Y2wtPmRldmljZSwKKwkJCSJXcml0ZSBzdGlsbCBwZW5kaW5nIG9uIGNvbnRyb2wgY2hhbm5lbC5cbiIpOworCQlzcGluX3VubG9jaygmaGktPmxvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwloaS0+Y29udHJvbF9zdGF0ZSB8PSBTU0lfQ0hBTk5FTF9TVEFURV9XUklUSU5HOworCW1zZyA9IGNzX2NsYWltX2NtZChoaSk7CisJc3Bpbl91bmxvY2soJmhpLT5sb2NrKTsKKworCWNzX3NldF9jbWQobXNnLCBtZXNzYWdlKTsKKwltc2ctPnNndC5uZW50cyA9IDE7CisJbXNnLT5jb21wbGV0ZSA9IGNzX2hzaV93cml0ZV9vbl9jb250cm9sX2NvbXBsZXRlOworCWRldl9kYmcoJmhpLT5jbC0+ZGV2aWNlLAorCQkiU2VuZGluZyBjb250cm9sIG1lc3NhZ2UgJTA4WFxuIiwgbWVzc2FnZSk7CisJcmV0ID0gaHNpX2FzeW5jX3dyaXRlKGhpLT5jbCwgbXNnKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJmhpLT5jbC0+ZGV2aWNlLAorCQkJImFzeW5jX3dyaXRlIGZhaWxlZCB3aXRoICVkXG4iLCByZXQpOworCQljc19oc2lfY29udHJvbF93cml0ZV9lcnJvcihoaSwgbXNnKTsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBjb250cm9sIHJlYWQgaXMgYWx3YXlzIHBlbmRpbmcgd2hlbiBpc3N1aW5nCisJICogbmV3IGNvbnRyb2wgd3JpdGVzLiBUaGlzIGlzIG5lZWRlZCBhcyB0aGUgY29udHJvbGxlcgorCSAqIG1heSBmbHVzaCBvdXIgbWVzc2FnZXMgaWYgZS5nLiB0aGUgcGVlciBkZXZpY2UgcmVib290cworCSAqIHVuZXhwZWN0ZWRseSAoYW5kIHdlIGNhbm5vdCBkaXJlY3RseSByZXN1Ym1pdCBhIG5ldyByZWFkIGZyb20KKwkgKiB0aGUgbWVzc2FnZSBkZXN0cnVjdG9yOyBzZWUgY3NfY21kX2Rlc3RydWN0b3IoKSkuCisJICovCisJaWYgKCEoaGktPmNvbnRyb2xfc3RhdGUgJiBTU0lfQ0hBTk5FTF9TVEFURV9SRUFESU5HKSkgeworCQlkZXZfZXJyKCZoaS0+Y2wtPmRldmljZSwgIlJlc3RhcnRpbmcgY29udHJvbCByZWFkc1xuIik7CisJCWNzX2hzaV9yZWFkX29uX2NvbnRyb2woaGkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjc19oc2lfcmVhZF9vbl9kYXRhX2NvbXBsZXRlKHN0cnVjdCBoc2lfbXNnICptc2cpCit7CisJc3RydWN0IGNzX2hzaV9pZmFjZSAqaGkgPSBtc2ctPmNvbnRleHQ7CisJdTMyIHBheWxvYWQ7CisKKwlpZiAodW5saWtlbHkobXNnLT5zdGF0dXMgPT0gSFNJX1NUQVRVU19FUlJPUikpIHsKKwkJY3NfaHNpX2RhdGFfcmVhZF9lcnJvcihoaSwgbXNnKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9jaygmaGktPmxvY2spOworCVdBUk5fT04oIShoaS0+ZGF0YV9zdGF0ZSAmIFNTSV9DSEFOTkVMX1NUQVRFX1JFQURJTkcpKTsKKwloaS0+ZGF0YV9zdGF0ZSAmPSB+U1NJX0NIQU5ORUxfU1RBVEVfUkVBRElORzsKKwlwYXlsb2FkID0gQ1NfUlhfREFUQV9SRUNFSVZFRDsKKwlwYXlsb2FkIHw9IGhpLT5yeF9zbG90OworCWhpLT5yeF9zbG90Kys7CisJaGktPnJ4X3Nsb3QgJT0gaGktPnJ4X3B0cl9ib3VuZGFyeTsKKwkvKiBleHBvc2UgY3VycmVudCByeCBwdHIgaW4gbW1hcCBhcmVhICovCisJaGktPm1tYXBfY2ZnLT5yeF9wdHIgPSBoaS0+cnhfc2xvdDsKKwlpZiAodW5saWtlbHkod2FpdHF1ZXVlX2FjdGl2ZSgmaGktPmRhdGF3YWl0KSkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGktPmRhdGF3YWl0KTsKKwlzcGluX3VubG9jaygmaGktPmxvY2spOworCisJY3Nfbm90aWZ5X2RhdGEocGF5bG9hZCwgaGktPnJ4X2J1ZnMpOworCWNzX2hzaV9yZWFkX29uX2RhdGEoaGkpOworfQorCitzdGF0aWMgdm9pZCBjc19oc2lfcGVla19vbl9kYXRhX2NvbXBsZXRlKHN0cnVjdCBoc2lfbXNnICptc2cpCit7CisJc3RydWN0IGNzX2hzaV9pZmFjZSAqaGkgPSBtc2ctPmNvbnRleHQ7CisJdTMyICphZGRyZXNzOworCWludCByZXQ7CisKKwlpZiAodW5saWtlbHkobXNnLT5zdGF0dXMgPT0gSFNJX1NUQVRVU19FUlJPUikpIHsKKwkJY3NfaHNpX2RhdGFfcmVhZF9lcnJvcihoaSwgbXNnKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodW5saWtlbHkoaGktPmlmYWNlX3N0YXRlICE9IENTX1NUQVRFX0NPTkZJR1VSRUQpKSB7CisJCWRldl9lcnIoJmhpLT5jbC0+ZGV2aWNlLCAiRGF0YSByZWNlaXZlZCBpbiBpbnZhbGlkIHN0YXRlXG4iKTsKKwkJY3NfaHNpX2RhdGFfcmVhZF9lcnJvcihoaSwgbXNnKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9jaygmaGktPmxvY2spOworCVdBUk5fT04oIShoaS0+ZGF0YV9zdGF0ZSAmIFNTSV9DSEFOTkVMX1NUQVRFX1BPTEwpKTsKKwloaS0+ZGF0YV9zdGF0ZSAmPSB+U1NJX0NIQU5ORUxfU1RBVEVfUE9MTDsKKwloaS0+ZGF0YV9zdGF0ZSB8PSBTU0lfQ0hBTk5FTF9TVEFURV9SRUFESU5HOworCXNwaW5fdW5sb2NrKCZoaS0+bG9jayk7CisKKwlhZGRyZXNzID0gKHUzMiAqKShoaS0+bW1hcF9iYXNlICsKKwkJCQloaS0+cnhfb2Zmc2V0c1toaS0+cnhfc2xvdCAlIGhpLT5yeF9idWZzXSk7CisJc2dfaW5pdF9vbmUobXNnLT5zZ3Quc2dsLCBhZGRyZXNzLCBoaS0+YnVmX3NpemUpOworCW1zZy0+c2d0Lm5lbnRzID0gMTsKKwltc2ctPmNvbXBsZXRlID0gY3NfaHNpX3JlYWRfb25fZGF0YV9jb21wbGV0ZTsKKwlyZXQgPSBoc2lfYXN5bmNfcmVhZChoaS0+Y2wsIG1zZyk7CisJaWYgKHJldCkKKwkJY3NfaHNpX2RhdGFfcmVhZF9lcnJvcihoaSwgbXNnKTsKK30KKworLyoKKyAqIFJlYWQvd3JpdGUgdHJhbnNhY3Rpb24gaXMgb25nb2luZy4gUmV0dXJucyBmYWxzZSBpZiBpbgorICogU1NJX0NIQU5ORUxfU1RBVEVfUE9MTCBzdGF0ZS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY3Nfc3RhdGVfeGZlcl9hY3RpdmUodW5zaWduZWQgaW50IHN0YXRlKQoreworCXJldHVybiAoc3RhdGUgJiBTU0lfQ0hBTk5FTF9TVEFURV9XUklUSU5HKSB8fAorCQkoc3RhdGUgJiBTU0lfQ0hBTk5FTF9TVEFURV9SRUFESU5HKTsKK30KKworLyoKKyAqIE5vIHBlbmRpbmcgcmVhZC93cml0ZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQgY3Nfc3RhdGVfaWRsZSh1bnNpZ25lZCBpbnQgc3RhdGUpCit7CisJcmV0dXJuICEoc3RhdGUgJiB+U1NJX0NIQU5ORUxfU1RBVEVfRVJST1IpOworfQorCitzdGF0aWMgdm9pZCBjc19oc2lfcmVhZF9vbl9kYXRhKHN0cnVjdCBjc19oc2lfaWZhY2UgKmhpKQoreworCXN0cnVjdCBoc2lfbXNnICpyeG1zZzsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZoaS0+bG9jayk7CisJaWYgKGhpLT5kYXRhX3N0YXRlICYKKwkJKFNTSV9DSEFOTkVMX1NUQVRFX1JFQURJTkcgfCBTU0lfQ0hBTk5FTF9TVEFURV9QT0xMKSkgeworCQlkZXZfZGJnKCZoaS0+Y2wtPmRldmljZSwgIkRhdGEgcmVhZCBhbHJlYWR5IHBlbmRpbmcgKCV1KVxuIiwKKwkJCWhpLT5kYXRhX3N0YXRlKTsKKwkJc3Bpbl91bmxvY2soJmhpLT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwloaS0+ZGF0YV9zdGF0ZSB8PSBTU0lfQ0hBTk5FTF9TVEFURV9QT0xMOworCXNwaW5fdW5sb2NrKCZoaS0+bG9jayk7CisKKwlyeG1zZyA9IGhpLT5kYXRhX3J4X21zZzsKKwlzZ19pbml0X29uZShyeG1zZy0+c2d0LnNnbCwgKHZvaWQgKiloaS0+bW1hcF9iYXNlLCAwKTsKKwlyeG1zZy0+c2d0Lm5lbnRzID0gMDsKKwlyeG1zZy0+Y29tcGxldGUgPSBjc19oc2lfcGVla19vbl9kYXRhX2NvbXBsZXRlOworCisJcmV0ID0gaHNpX2FzeW5jX3JlYWQoaGktPmNsLCByeG1zZyk7CisJaWYgKHJldCkKKwkJY3NfaHNpX2RhdGFfcmVhZF9lcnJvcihoaSwgcnhtc2cpOworfQorCitzdGF0aWMgdm9pZCBjc19oc2lfd3JpdGVfb25fZGF0YV9jb21wbGV0ZShzdHJ1Y3QgaHNpX21zZyAqbXNnKQoreworCXN0cnVjdCBjc19oc2lfaWZhY2UgKmhpID0gbXNnLT5jb250ZXh0OworCisJaWYgKG1zZy0+c3RhdHVzID09IEhTSV9TVEFUVVNfQ09NUExFVEVEKSB7CisJCXNwaW5fbG9jaygmaGktPmxvY2spOworCQloaS0+ZGF0YV9zdGF0ZSAmPSB+U1NJX0NIQU5ORUxfU1RBVEVfV1JJVElORzsKKwkJaWYgKHVubGlrZWx5KHdhaXRxdWV1ZV9hY3RpdmUoJmhpLT5kYXRhd2FpdCkpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZoaS0+ZGF0YXdhaXQpOworCQlzcGluX3VubG9jaygmaGktPmxvY2spOworCX0gZWxzZSB7CisJCWNzX2hzaV9kYXRhX3dyaXRlX2Vycm9yKGhpLCBtc2cpOworCX0KK30KKworc3RhdGljIGludCBjc19oc2lfd3JpdGVfb25fZGF0YShzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSwgdW5zaWduZWQgaW50IHNsb3QpCit7CisJdTMyICphZGRyZXNzOworCXN0cnVjdCBoc2lfbXNnICp0eG1zZzsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZoaS0+bG9jayk7CisJaWYgKGhpLT5pZmFjZV9zdGF0ZSAhPSBDU19TVEFURV9DT05GSUdVUkVEKSB7CisJCWRldl9lcnIoJmhpLT5jbC0+ZGV2aWNlLCAiTm90IGNvbmZpZ3VyZWQsIGFib3J0aW5nXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGhpLT5kYXRhX3N0YXRlICYgU1NJX0NIQU5ORUxfU1RBVEVfRVJST1IpIHsKKwkJZGV2X2VycigmaGktPmNsLT5kZXZpY2UsICJIU0kgZXJyb3IsIGFib3J0aW5nXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CisJaWYgKGhpLT5kYXRhX3N0YXRlICYgU1NJX0NIQU5ORUxfU1RBVEVfV1JJVElORykgeworCQlkZXZfZXJyKCZoaS0+Y2wtPmRldmljZSwgIldyaXRlIHBlbmRpbmcgb24gZGF0YSBjaGFubmVsLlxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJvcjsKKwl9CisJaGktPmRhdGFfc3RhdGUgfD0gU1NJX0NIQU5ORUxfU1RBVEVfV1JJVElORzsKKwlzcGluX3VubG9jaygmaGktPmxvY2spOworCisJaGktPnR4X3Nsb3QgPSBzbG90OworCWFkZHJlc3MgPSAodTMyICopKGhpLT5tbWFwX2Jhc2UgKyBoaS0+dHhfb2Zmc2V0c1toaS0+dHhfc2xvdF0pOworCXR4bXNnID0gaGktPmRhdGFfdHhfbXNnOworCXNnX2luaXRfb25lKHR4bXNnLT5zZ3Quc2dsLCBhZGRyZXNzLCBoaS0+YnVmX3NpemUpOworCXR4bXNnLT5jb21wbGV0ZSA9IGNzX2hzaV93cml0ZV9vbl9kYXRhX2NvbXBsZXRlOworCXJldCA9IGhzaV9hc3luY193cml0ZShoaS0+Y2wsIHR4bXNnKTsKKwlpZiAocmV0KQorCQljc19oc2lfZGF0YV93cml0ZV9lcnJvcihoaSwgdHhtc2cpOworCisJcmV0dXJuIHJldDsKKworZXJyb3I6CisJc3Bpbl91bmxvY2soJmhpLT5sb2NrKTsKKwlpZiAocmV0ID09IC1FSU8pCisJCWNzX2hzaV9kYXRhX3dyaXRlX2Vycm9yKGhpLCBoaS0+ZGF0YV90eF9tc2cpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjc19oc2lfZ2V0X3N0YXRlKHN0cnVjdCBjc19oc2lfaWZhY2UgKmhpKQoreworCXJldHVybiBoaS0+aWZhY2Vfc3RhdGU7Cit9CisKK3N0YXRpYyBpbnQgY3NfaHNpX2NvbW1hbmQoc3RydWN0IGNzX2hzaV9pZmFjZSAqaGksIHUzMiBjbWQpCit7CisJaW50IHJldCA9IDA7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJc3dpdGNoIChjbWQgJiBUQVJHRVRfTUFTSykgeworCWNhc2UgVEFSR0VUX1JFTU9URToKKwkJcmV0ID0gY3NfaHNpX3dyaXRlX29uX2NvbnRyb2woaGksIGNtZCk7CisJCWJyZWFrOworCWNhc2UgVEFSR0VUX0xPQ0FMOgorCQlpZiAoKGNtZCAmIENTX0NNRF9NQVNLKSA9PSBDU19UWF9EQVRBX1JFQURZKQorCQkJcmV0ID0gY3NfaHNpX3dyaXRlX29uX2RhdGEoaGksIGNtZCAmIENTX1BBUkFNX01BU0spOworCQllbHNlCisJCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJbG9jYWxfYmhfZW5hYmxlKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjc19oc2lfc2V0X3dha2VsaW5lKHN0cnVjdCBjc19oc2lfaWZhY2UgKmhpLCBib29sIG5ld19zdGF0ZSkKK3sKKwlpbnQgY2hhbmdlID0gMDsKKworCXNwaW5fbG9ja19iaCgmaGktPmxvY2spOworCWlmIChoaS0+d2FrZWxpbmVfc3RhdGUgIT0gbmV3X3N0YXRlKSB7CisJCWhpLT53YWtlbGluZV9zdGF0ZSA9IG5ld19zdGF0ZTsKKwkJY2hhbmdlID0gMTsKKwkJZGV2X2RiZygmaGktPmNsLT5kZXZpY2UsICJzZXR0aW5nIHdha2UgbGluZSB0byAlZCAoJXApXG4iLAorCQkJbmV3X3N0YXRlLCBoaS0+Y2wpOworCX0KKwlzcGluX3VubG9ja19iaCgmaGktPmxvY2spOworCisJaWYgKGNoYW5nZSkgeworCQlpZiAobmV3X3N0YXRlKQorCQkJc3NpcF9zbGF2ZV9zdGFydF90eChoaS0+bWFzdGVyKTsKKwkJZWxzZQorCQkJc3NpcF9zbGF2ZV9zdG9wX3R4KGhpLT5tYXN0ZXIpOworCX0KKworCWRldl9kYmcoJmhpLT5jbC0+ZGV2aWNlLCAid2FrZSBsaW5lIHNldCB0byAlZCAoJXApXG4iLAorCQluZXdfc3RhdGUsIGhpLT5jbCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9idWZmZXJfc2l6ZXMoc3RydWN0IGNzX2hzaV9pZmFjZSAqaGksIGludCByeF9idWZzLCBpbnQgdHhfYnVmcykKK3sKKwloaS0+cnhfYnVmcyA9IHJ4X2J1ZnM7CisJaGktPnR4X2J1ZnMgPSB0eF9idWZzOworCWhpLT5tbWFwX2NmZy0+cnhfYnVmcyA9IHJ4X2J1ZnM7CisJaGktPm1tYXBfY2ZnLT50eF9idWZzID0gdHhfYnVmczsKKworCWlmIChoaS0+ZmxhZ3MgJiBDU19GRUFUX1JPTExJTkdfUlhfQ09VTlRFUikgeworCQkvKgorCQkgKiBGb3IgbW9yZSByb2J1c3Qgb3ZlcnJ1biBkZXRlY3Rpb24sIGxldCB0aGUgcngKKwkJICogcG9pbnRlciBydW4gaW4gcmFuZ2UgMC4uJ2JvdW5kYXJ5LTEnLiBCb3VuZGFyeQorCQkgKiBpcyBhIG11bHRpcGxlIG9mIHJ4X2J1ZnMsIGFuZCBsaW1pdGVkIGluIG1heCBzaXplCisJCSAqIGJ5IFJYX1BUUl9NQVhfU0hJRlQgdG8gYWxsb3cgZm9yIGZhc3QgcHRyLWRpZmYKKwkJICogY2FsY3VsYXRpb24uCisJCSAqLworCQloaS0+cnhfcHRyX2JvdW5kYXJ5ID0gKHJ4X2J1ZnMgPDwgUlhfUFRSX0JPVU5EQVJZX1NISUZUKTsKKwkJaGktPm1tYXBfY2ZnLT5yeF9wdHJfYm91bmRhcnkgPSBoaS0+cnhfcHRyX2JvdW5kYXJ5OworCX0gZWxzZSB7CisJCWhpLT5yeF9wdHJfYm91bmRhcnkgPSBoaS0+cnhfYnVmczsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYnVmX3BhcmFtcyhzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSwKKwkJCQkJY29uc3Qgc3RydWN0IGNzX2J1ZmZlcl9jb25maWcgKmJ1Zl9jZmcpCit7CisJc2l6ZV90IGJ1Zl9zaXplX2FsaWduZWQgPSBMMV9DQUNIRV9BTElHTihidWZfY2ZnLT5idWZfc2l6ZSkgKgorCQkJCQkoYnVmX2NmZy0+cnhfYnVmcyArIGJ1Zl9jZmctPnR4X2J1ZnMpOworCXNpemVfdCBjdHJsX3NpemVfYWxpZ25lZCA9IEwxX0NBQ0hFX0FMSUdOKHNpemVvZigqaGktPm1tYXBfY2ZnKSk7CisJaW50IHIgPSAwOworCisJaWYgKGJ1Zl9jZmctPnJ4X2J1ZnMgPiBDU19NQVhfQlVGRkVSUyB8fAorCQkJCQlidWZfY2ZnLT50eF9idWZzID4gQ1NfTUFYX0JVRkZFUlMpIHsKKwkJciA9IC1FSU5WQUw7CisJfSBlbHNlIGlmICgoYnVmX3NpemVfYWxpZ25lZCArIGN0cmxfc2l6ZV9hbGlnbmVkKSA+PSBoaS0+bW1hcF9zaXplKSB7CisJCWRldl9lcnIoJmhpLT5jbC0+ZGV2aWNlLCAiTm8gc3BhY2UgZm9yIHRoZSByZXF1ZXN0ZWQgYnVmZmVyICIKKwkJCSJjb25maWd1cmF0aW9uXG4iKTsKKwkJciA9IC1FTk9CVUZTOworCX0KKworCXJldHVybiByOworfQorCisvKioKKyAqIEJsb2NrIHVudGlsIHBlbmRpbmcgZGF0YSB0cmFuc2ZlcnMgaGF2ZSBjb21wbGV0ZWQuCisgKi8KK3N0YXRpYyBpbnQgY3NfaHNpX2RhdGFfc3luYyhzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSkKK3sKKwlpbnQgciA9IDA7CisKKwlzcGluX2xvY2tfYmgoJmhpLT5sb2NrKTsKKworCWlmICghY3Nfc3RhdGVfeGZlcl9hY3RpdmUoaGktPmRhdGFfc3RhdGUpKSB7CisJCWRldl9kYmcoJmhpLT5jbC0+ZGV2aWNlLCAiaHNpX2RhdGFfc3luYyBicmVhaywgaWRsZVxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWZvciAoOzspIHsKKwkJaW50IHM7CisJCURFRklORV9XQUlUKHdhaXQpOworCQlpZiAoIWNzX3N0YXRlX3hmZXJfYWN0aXZlKGhpLT5kYXRhX3N0YXRlKSkKKwkJCWdvdG8gb3V0OworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCXIgPSAtRVJFU1RBUlRTWVM7CisJCQlnb3RvIG91dDsKKwkJfQorCQkvKioKKwkJICogcHJlcGFyZV90b193YWl0IG11c3QgYmUgY2FsbGVkIHdpdGggaGktPmxvY2sgaGVsZAorCQkgKiBzbyB0aGF0IGNhbGxiYWNrcyBjYW4gY2hlY2sgZm9yIHdhaXRxdWV1ZV9hY3RpdmUoKQorCQkgKi8KKwkJcHJlcGFyZV90b193YWl0KCZoaS0+ZGF0YXdhaXQsICZ3YWl0LCBUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19iaCgmaGktPmxvY2spOworCQlzID0gc2NoZWR1bGVfdGltZW91dCgKKwkJCW1zZWNzX3RvX2ppZmZpZXMoQ1NfSFNJX1RSQU5TRkVSX1RJTUVPVVRfTVMpKTsKKwkJc3Bpbl9sb2NrX2JoKCZoaS0+bG9jayk7CisJCWZpbmlzaF93YWl0KCZoaS0+ZGF0YXdhaXQsICZ3YWl0KTsKKwkJaWYgKCFzKSB7CisJCQlkZXZfZGJnKCZoaS0+Y2wtPmRldmljZSwKKwkJCQkiaHNpX2RhdGFfc3luYyB0aW1lb3V0IGFmdGVyICVkIG1zXG4iLAorCQkJCUNTX0hTSV9UUkFOU0ZFUl9USU1FT1VUX01TKTsKKwkJCXIgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKK291dDoKKwlzcGluX3VubG9ja19iaCgmaGktPmxvY2spOworCWRldl9kYmcoJmhpLT5jbC0+ZGV2aWNlLCAiaHNpX2RhdGFfc3luYyBkb25lIHdpdGggcmVzICVkXG4iLCByKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBjc19oc2lfZGF0YV9lbmFibGUoc3RydWN0IGNzX2hzaV9pZmFjZSAqaGksCisJCQkJCXN0cnVjdCBjc19idWZmZXJfY29uZmlnICpidWZfY2ZnKQoreworCXVuc2lnbmVkIGludCBkYXRhX3N0YXJ0LCBpOworCisJQlVHX09OKGhpLT5idWZfc2l6ZSA9PSAwKTsKKworCXNldF9idWZmZXJfc2l6ZXMoaGksIGJ1Zl9jZmctPnJ4X2J1ZnMsIGJ1Zl9jZmctPnR4X2J1ZnMpOworCisJaGktPnNsb3Rfc2l6ZSA9IEwxX0NBQ0hFX0FMSUdOKGhpLT5idWZfc2l6ZSk7CisJZGV2X2RiZygmaGktPmNsLT5kZXZpY2UsCisJCQkic2V0dGluZyBzbG90IHNpemUgdG8gJXUsIGJ1ZiBzaXplICV1LCBhbGlnbiAldVxuIiwKKwkJCWhpLT5zbG90X3NpemUsIGhpLT5idWZfc2l6ZSwgTDFfQ0FDSEVfQllURVMpOworCisJZGF0YV9zdGFydCA9IEwxX0NBQ0hFX0FMSUdOKHNpemVvZigqaGktPm1tYXBfY2ZnKSk7CisJZGV2X2RiZygmaGktPmNsLT5kZXZpY2UsCisJCQkic2V0dGluZyBkYXRhIHN0YXJ0IGF0ICV1LCBjZmcgYmxvY2sgJXUsIGFsaWduICV1XG4iLAorCQkJZGF0YV9zdGFydCwgc2l6ZW9mKCpoaS0+bW1hcF9jZmcpLCBMMV9DQUNIRV9CWVRFUyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaGktPm1tYXBfY2ZnLT5yeF9idWZzOyBpKyspIHsKKwkJaGktPnJ4X29mZnNldHNbaV0gPSBkYXRhX3N0YXJ0ICsgaSAqIGhpLT5zbG90X3NpemU7CisJCWhpLT5tbWFwX2NmZy0+cnhfb2Zmc2V0c1tpXSA9IGhpLT5yeF9vZmZzZXRzW2ldOworCQlkZXZfZGJnKCZoaS0+Y2wtPmRldmljZSwgIkRMIGJ1ZiAjJXUgYXQgJXVcbiIsCisJCQkJCWksIGhpLT5yeF9vZmZzZXRzW2ldKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGhpLT5tbWFwX2NmZy0+dHhfYnVmczsgaSsrKSB7CisJCWhpLT50eF9vZmZzZXRzW2ldID0gZGF0YV9zdGFydCArCisJCQkoaSArIGhpLT5tbWFwX2NmZy0+cnhfYnVmcykgKiBoaS0+c2xvdF9zaXplOworCQloaS0+bW1hcF9jZmctPnR4X29mZnNldHNbaV0gPSBoaS0+dHhfb2Zmc2V0c1tpXTsKKwkJZGV2X2RiZygmaGktPmNsLT5kZXZpY2UsICJVTCBidWYgIyV1IGF0ICV1XG4iLAorCQkJCQlpLCBoaS0+cnhfb2Zmc2V0c1tpXSk7CisJfQorCisJaGktPmlmYWNlX3N0YXRlID0gQ1NfU1RBVEVfQ09ORklHVVJFRDsKK30KKworc3RhdGljIHZvaWQgY3NfaHNpX2RhdGFfZGlzYWJsZShzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoaSwgaW50IG9sZF9zdGF0ZSkKK3sKKwlpZiAob2xkX3N0YXRlID09IENTX1NUQVRFX0NPTkZJR1VSRUQpIHsKKwkJZGV2X2RiZygmaGktPmNsLT5kZXZpY2UsCisJCQkiY2xvc2luZyBkYXRhIGNoYW5uZWwgd2l0aCBzbG90IHNpemUgMFxuIik7CisJCWhpLT5pZmFjZV9zdGF0ZSA9IENTX1NUQVRFX09QRU5FRDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY3NfaHNpX2J1Zl9jb25maWcoc3RydWN0IGNzX2hzaV9pZmFjZSAqaGksCisJCQkJCXN0cnVjdCBjc19idWZmZXJfY29uZmlnICpidWZfY2ZnKQoreworCWludCByID0gMDsKKwl1bnNpZ25lZCBpbnQgb2xkX3N0YXRlID0gaGktPmlmYWNlX3N0YXRlOworCisJc3Bpbl9sb2NrX2JoKCZoaS0+bG9jayk7CisJLyogUHJldmVudCBuZXcgdHJhbnNhY3Rpb25zIGR1cmluZyBidWZmZXIgcmVjb25maWcgKi8KKwlpZiAob2xkX3N0YXRlID09IENTX1NUQVRFX0NPTkZJR1VSRUQpCisJCWhpLT5pZmFjZV9zdGF0ZSA9IENTX1NUQVRFX09QRU5FRDsKKwlzcGluX3VubG9ja19iaCgmaGktPmxvY2spOworCisJLyoKKwkgKiBtYWtlIHN1cmUgdGhhdCBubyBub24temVybyBkYXRhIHJlYWRzIGFyZSBvbmdvaW5nIGJlZm9yZQorCSAqIHByb2NlZWRpbmcgdG8gY2hhbmdlIHRoZSBidWZmZXIgbGF5b3V0CisJICovCisJciA9IGNzX2hzaV9kYXRhX3N5bmMoaGkpOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlXQVJOX09OKGNzX3N0YXRlX3hmZXJfYWN0aXZlKGhpLT5kYXRhX3N0YXRlKSk7CisKKwlzcGluX2xvY2tfYmgoJmhpLT5sb2NrKTsKKwlyID0gY2hlY2tfYnVmX3BhcmFtcyhoaSwgYnVmX2NmZyk7CisJaWYgKHIgPCAwKQorCQlnb3RvIGVycm9yOworCisJaGktPmJ1Zl9zaXplID0gYnVmX2NmZy0+YnVmX3NpemU7CisJaGktPm1tYXBfY2ZnLT5idWZfc2l6ZSA9IGhpLT5idWZfc2l6ZTsKKwloaS0+ZmxhZ3MgPSBidWZfY2ZnLT5mbGFnczsKKworCWhpLT5yeF9zbG90ID0gMDsKKwloaS0+dHhfc2xvdCA9IDA7CisJaGktPnNsb3Rfc2l6ZSA9IDA7CisKKwlpZiAoaGktPmJ1Zl9zaXplKQorCQljc19oc2lfZGF0YV9lbmFibGUoaGksIGJ1Zl9jZmcpOworCWVsc2UKKwkJY3NfaHNpX2RhdGFfZGlzYWJsZShoaSwgb2xkX3N0YXRlKTsKKworCXNwaW5fdW5sb2NrX2JoKCZoaS0+bG9jayk7CisKKwlpZiAob2xkX3N0YXRlICE9IGhpLT5pZmFjZV9zdGF0ZSkgeworCQlpZiAoaGktPmlmYWNlX3N0YXRlID09IENTX1NUQVRFX0NPTkZJR1VSRUQpIHsKKwkJCXBtX3Fvc19hZGRfcmVxdWVzdCgmaGktPnBtX3Fvc19yZXEsCisJCQkJUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwKKwkJCQlDU19RT1NfTEFURU5DWV9GT1JfREFUQV9VU0VDKTsKKwkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKKwkJCWNzX2hzaV9yZWFkX29uX2RhdGEoaGkpOworCQkJbG9jYWxfYmhfZW5hYmxlKCk7CisJCX0gZWxzZSBpZiAob2xkX3N0YXRlID09IENTX1NUQVRFX0NPTkZJR1VSRUQpIHsKKwkJCXBtX3Fvc19yZW1vdmVfcmVxdWVzdCgmaGktPnBtX3Fvc19yZXEpOworCQl9CisJfQorCXJldHVybiByOworCitlcnJvcjoKKwlzcGluX3VubG9ja19iaCgmaGktPmxvY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGNzX2hzaV9zdGFydChzdHJ1Y3QgY3NfaHNpX2lmYWNlICoqaGksIHN0cnVjdCBoc2lfY2xpZW50ICpjbCwKKwkJCXVuc2lnbmVkIGxvbmcgbW1hcF9iYXNlLCB1bnNpZ25lZCBsb25nIG1tYXBfc2l6ZSkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgY3NfaHNpX2lmYWNlICpoc2lfaWYgPSBremFsbG9jKHNpemVvZigqaHNpX2lmKSwgR0ZQX0tFUk5FTCk7CisKKwlkZXZfZGJnKCZjbC0+ZGV2aWNlLCAiY3NfaHNpX3N0YXJ0XG4iKTsKKworCWlmICghaHNpX2lmKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gbGVhdmUwOworCX0KKwlzcGluX2xvY2tfaW5pdCgmaHNpX2lmLT5sb2NrKTsKKwloc2lfaWYtPmNsID0gY2w7CisJaHNpX2lmLT5pZmFjZV9zdGF0ZSA9IENTX1NUQVRFX0NMT1NFRDsKKwloc2lfaWYtPm1tYXBfY2ZnID0gKHN0cnVjdCBjc19tbWFwX2NvbmZpZ19ibG9jayAqKW1tYXBfYmFzZTsKKwloc2lfaWYtPm1tYXBfYmFzZSA9IG1tYXBfYmFzZTsKKwloc2lfaWYtPm1tYXBfc2l6ZSA9IG1tYXBfc2l6ZTsKKwltZW1zZXQoaHNpX2lmLT5tbWFwX2NmZywgMCwgc2l6ZW9mKCpoc2lfaWYtPm1tYXBfY2ZnKSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaHNpX2lmLT5kYXRhd2FpdCk7CisJZXJyID0gY3NfYWxsb2NfY21kcyhoc2lfaWYpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJmNsLT5kZXZpY2UsICJVbmFibGUgdG8gYWxsb2MgSFNJIG1lc3NhZ2VzXG4iKTsKKwkJZ290byBsZWF2ZTE7CisJfQorCWVyciA9IGNzX2hzaV9hbGxvY19kYXRhKGhzaV9pZik7CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2VycigmY2wtPmRldmljZSwgIlVuYWJsZSB0byBhbGxvYyBIU0kgbWVzc2FnZXMgZm9yIGRhdGFcbiIpOworCQlnb3RvIGxlYXZlMjsKKwl9CisJZXJyID0gaHNpX2NsYWltX3BvcnQoY2wsIDEpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoJmNsLT5kZXZpY2UsCisJCQkJIkNvdWxkIG5vdCBvcGVuLCBIU0kgcG9ydCBhbHJlYWR5IGNsYWltZWRcbiIpOworCQlnb3RvIGxlYXZlMzsKKwl9CisJaHNpX2lmLT5tYXN0ZXIgPSBzc2lwX3NsYXZlX2dldF9tYXN0ZXIoY2wpOworCWlmIChJU19FUlIoaHNpX2lmLT5tYXN0ZXIpKSB7CisJCWVyciA9IFBUUl9FUlIoaHNpX2lmLT5tYXN0ZXIpOworCQlkZXZfZXJyKCZjbC0+ZGV2aWNlLCAiQ291bGQgbm90IGdldCBIU0kgbWFzdGVyIGNsaWVudFxuIik7CisJCWdvdG8gbGVhdmU0OworCX0KKwlpZiAoIXNzaXBfc2xhdmVfcnVubmluZyhoc2lfaWYtPm1hc3RlcikpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZGV2X2VycigmY2wtPmRldmljZSwKKwkJCQkiSFNJIHBvcnQgbm90IGluaXRpYWxpemVkXG4iKTsKKwkJZ290byBsZWF2ZTQ7CisJfQorCisJaHNpX2lmLT5pZmFjZV9zdGF0ZSA9IENTX1NUQVRFX09QRU5FRDsKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJY3NfaHNpX3JlYWRfb25fY29udHJvbChoc2lfaWYpOworCWxvY2FsX2JoX2VuYWJsZSgpOworCisJZGV2X2RiZygmY2wtPmRldmljZSwgImNzX2hzaV9zdGFydC4uLmRvbmVcbiIpOworCisJQlVHX09OKCFoaSk7CisJKmhpID0gaHNpX2lmOworCisJcmV0dXJuIDA7CisKK2xlYXZlNDoKKwloc2lfcmVsZWFzZV9wb3J0KGNsKTsKK2xlYXZlMzoKKwljc19oc2lfZnJlZV9kYXRhKGhzaV9pZik7CitsZWF2ZTI6CisJY3NfZnJlZV9jbWRzKGhzaV9pZik7CitsZWF2ZTE6CisJa2ZyZWUoaHNpX2lmKTsKK2xlYXZlMDoKKwlkZXZfZGJnKCZjbC0+ZGV2aWNlLCAiY3NfaHNpX3N0YXJ0Li4uZG9uZS9lcnJvclxuXG4iKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGNzX2hzaV9zdG9wKHN0cnVjdCBjc19oc2lfaWZhY2UgKmhpKQoreworCWRldl9kYmcoJmhpLT5jbC0+ZGV2aWNlLCAiY3NfaHNpX3N0b3BcbiIpOworCWNzX2hzaV9zZXRfd2FrZWxpbmUoaGksIDApOworCXNzaXBfc2xhdmVfcHV0X21hc3RlcihoaS0+bWFzdGVyKTsKKworCS8qIGhzaV9yZWxlYXNlX3BvcnQoKSBuZWVkcyB0byBiZSBjYWxsZWQgd2l0aCBDU19TVEFURV9DTE9TRUQgKi8KKwloaS0+aWZhY2Vfc3RhdGUgPSBDU19TVEFURV9DTE9TRUQ7CisJaHNpX3JlbGVhc2VfcG9ydChoaS0+Y2wpOworCisJLyoKKwkgKiBoc2lfcmVsZWFzZV9wb3J0KCkgc2hvdWxkIGZsdXNoIG91dCBhbGwgdGhlIHBlbmRpbmcKKwkgKiBtZXNzYWdlcywgc28gY3Nfc3RhdGVfaWRsZSgpIHNob3VsZCBiZSB0cnVlIGZvciBib3RoCisJICogY29udHJvbCBhbmQgZGF0YSBjaGFubmVscy4KKwkgKi8KKwlXQVJOX09OKCFjc19zdGF0ZV9pZGxlKGhpLT5jb250cm9sX3N0YXRlKSk7CisJV0FSTl9PTighY3Nfc3RhdGVfaWRsZShoaS0+ZGF0YV9zdGF0ZSkpOworCisJaWYgKHBtX3Fvc19yZXF1ZXN0X2FjdGl2ZSgmaGktPnBtX3Fvc19yZXEpKQorCQlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QoJmhpLT5wbV9xb3NfcmVxKTsKKworCXNwaW5fbG9ja19iaCgmaGktPmxvY2spOworCWNzX2hzaV9mcmVlX2RhdGEoaGkpOworCWNzX2ZyZWVfY21kcyhoaSk7CisJc3Bpbl91bmxvY2tfYmgoJmhpLT5sb2NrKTsKKwlrZnJlZShoaSk7Cit9CisKK3N0YXRpYyBpbnQgY3NfY2hhcl92bWFfZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQoreworCXN0cnVjdCBjc19jaGFyICpjc2RhdGEgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoY3NkYXRhLT5tbWFwX2Jhc2UpOworCWdldF9wYWdlKHBhZ2UpOworCXZtZi0+cGFnZSA9IHBhZ2U7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBjc19jaGFyX3ZtX29wcyA9IHsKKwkuZmF1bHQJPSBjc19jaGFyX3ZtYV9mYXVsdCwKK307CisKK3N0YXRpYyBpbnQgY3NfY2hhcl9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKQoreworCXN0cnVjdCBjc19jaGFyICpjc2RhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZmFzeW5jX2hlbHBlcihmZCwgZmlsZSwgb24sICZjc2RhdGEtPmFzeW5jX3F1ZXVlKSA8IDApCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3NfY2hhcl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBjc19jaGFyICpjc2RhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmNzX2NoYXJfZGF0YS53YWl0LCB3YWl0KTsKKwlzcGluX2xvY2tfYmgoJmNzZGF0YS0+bG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZjc2RhdGEtPmNoYXJkZXZfcXVldWUpKQorCQlyZXQgPSBQT0xMSU4gfCBQT0xMUkROT1JNOworCWVsc2UgaWYgKCFsaXN0X2VtcHR5KCZjc2RhdGEtPmRhdGFpbmRfcXVldWUpKQorCQlyZXQgPSBQT0xMSU4gfCBQT0xMUkROT1JNOworCXNwaW5fdW5sb2NrX2JoKCZjc2RhdGEtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgY3NfY2hhcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkJCQkJCWxvZmZfdCAqdW51c2VkKQoreworCXN0cnVjdCBjc19jaGFyICpjc2RhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdTMyIGRhdGE7CisJc3NpemVfdCByZXR2YWw7CisKKwlpZiAoY291bnQgPCBzaXplb2YoZGF0YSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yICg7OykgeworCQlERUZJTkVfV0FJVCh3YWl0KTsKKworCQlzcGluX2xvY2tfYmgoJmNzZGF0YS0+bG9jayk7CisJCWlmICghbGlzdF9lbXB0eSgmY3NkYXRhLT5jaGFyZGV2X3F1ZXVlKSkgeworCQkJZGF0YSA9IGNzX3BvcF9lbnRyeSgmY3NkYXRhLT5jaGFyZGV2X3F1ZXVlKTsKKwkJfSBlbHNlIGlmICghbGlzdF9lbXB0eSgmY3NkYXRhLT5kYXRhaW5kX3F1ZXVlKSkgeworCQkJZGF0YSA9IGNzX3BvcF9lbnRyeSgmY3NkYXRhLT5kYXRhaW5kX3F1ZXVlKTsKKwkJCWNzZGF0YS0+ZGF0YWluZF9wZW5kaW5nLS07CisJCX0gZWxzZSB7CisJCQlkYXRhID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19iaCgmY3NkYXRhLT5sb2NrKTsKKworCQlpZiAoZGF0YSkKKwkJCWJyZWFrOworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXJldHZhbCA9IC1FQUdBSU47CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJlcGFyZV90b193YWl0X2V4Y2x1c2l2ZSgmY3NkYXRhLT53YWl0LCAmd2FpdCwKKwkJCQkJCVRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlKCk7CisJCWZpbmlzaF93YWl0KCZjc2RhdGEtPndhaXQsICZ3YWl0KTsKKwl9CisKKwlyZXR2YWwgPSBwdXRfdXNlcihkYXRhLCAodTMyIF9fdXNlciAqKWJ1Zik7CisJaWYgKCFyZXR2YWwpCisJCXJldHZhbCA9IHNpemVvZihkYXRhKTsKKworb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNzX2NoYXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqdW51c2VkKQoreworCXN0cnVjdCBjc19jaGFyICpjc2RhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdTMyIGRhdGE7CisJaW50IGVycjsKKwlzc2l6ZV90CXJldHZhbDsKKworCWlmIChjb3VudCA8IHNpemVvZihkYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZ2V0X3VzZXIoZGF0YSwgKHUzMiBfX3VzZXIgKilidWYpKQorCQlyZXR2YWwgPSAtRUZBVUxUOworCWVsc2UKKwkJcmV0dmFsID0gY291bnQ7CisKKwllcnIgPSBjc19oc2lfY29tbWFuZChjc2RhdGEtPmhpLCBkYXRhKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dmFsID0gZXJyOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGxvbmcgY3NfY2hhcl9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY3NfY2hhciAqY3NkYXRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByID0gMDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDU19HRVRfU1RBVEU6IHsKKwkJdW5zaWduZWQgaW50IHN0YXRlOworCisJCXN0YXRlID0gY3NfaHNpX2dldF9zdGF0ZShjc2RhdGEtPmhpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZzdGF0ZSwgc2l6ZW9mKHN0YXRlKSkpCisJCQlyID0gLUVGQVVMVDsKKworCQlicmVhazsKKwl9CisJY2FzZSBDU19TRVRfV0FLRUxJTkU6IHsKKwkJdW5zaWduZWQgaW50IHN0YXRlOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmc3RhdGUsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHN0YXRlKSkpIHsKKwkJCXIgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc3RhdGUgPiAxKSB7CisJCQlyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJY3NfaHNpX3NldF93YWtlbGluZShjc2RhdGEtPmhpLCAhIXN0YXRlKTsKKworCQlicmVhazsKKwl9CisJY2FzZSBDU19HRVRfSUZfVkVSU0lPTjogeworCQl1bnNpZ25lZCBpbnQgaWZ2ZXIgPSBDU19JRl9WRVJTSU9OOworCisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaWZ2ZXIsIHNpemVvZihpZnZlcikpKQorCQkJciA9IC1FRkFVTFQ7CisKKwkJYnJlYWs7CisJfQorCWNhc2UgQ1NfQ09ORklHX0JVRlM6IHsKKwkJc3RydWN0IGNzX2J1ZmZlcl9jb25maWcgYnVmX2NmZzsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmJ1Zl9jZmcsICh2b2lkIF9fdXNlciAqKWFyZywKKwkJCQkJCQlzaXplb2YoYnVmX2NmZykpKQorCQkJciA9IC1FRkFVTFQ7CisJCWVsc2UKKwkJCXIgPSBjc19oc2lfYnVmX2NvbmZpZyhjc2RhdGEtPmhpLCAmYnVmX2NmZyk7CisKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCXIgPSAtRU5PVFRZOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBjc19jaGFyX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCWlmICh2bWEtPnZtX2VuZCA8IHZtYS0+dm1fc3RhcnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fSU8gfCBWTV9ET05URFVNUCB8IFZNX0RPTlRFWFBBTkQ7CisJdm1hLT52bV9vcHMgPSAmY3NfY2hhcl92bV9vcHM7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjc19jaGFyX29wZW4oc3RydWN0IGlub2RlICp1bnVzZWQsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgcDsKKworCXNwaW5fbG9ja19iaCgmY3NfY2hhcl9kYXRhLmxvY2spOworCWlmIChjc19jaGFyX2RhdGEub3BlbmVkKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJc3Bpbl91bmxvY2tfYmgoJmNzX2NoYXJfZGF0YS5sb2NrKTsKKwkJZ290byBvdXQxOworCX0KKwljc19jaGFyX2RhdGEub3BlbmVkID0gMTsKKwljc19jaGFyX2RhdGEuZGF0YWluZF9wZW5kaW5nID0gMDsKKwlzcGluX3VubG9ja19iaCgmY3NfY2hhcl9kYXRhLmxvY2spOworCisJcCA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwlpZiAoIXApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQyOworCX0KKworCXJldCA9IGNzX2hzaV9zdGFydCgmY3NfY2hhcl9kYXRhLmhpLCBjc19jaGFyX2RhdGEuY2wsIHAsIENTX01NQVBfU0laRSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjc19jaGFyX2RhdGEuY2wtPmRldmljZSwgIlVuYWJsZSB0byBpbml0aWFsaXplIEhTSVxuIik7CisJCWdvdG8gb3V0MzsKKwl9CisKKwkvKiB0aGVzZSBhcmUgb25seSB1c2VkIGluIHJlbGVhc2Ugc28gbG9jayBub3QgbmVlZGVkICovCisJY3NfY2hhcl9kYXRhLm1tYXBfYmFzZSA9IHA7CisJY3NfY2hhcl9kYXRhLm1tYXBfc2l6ZSA9IENTX01NQVBfU0laRTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9ICZjc19jaGFyX2RhdGE7CisKKwlyZXR1cm4gMDsKKworb3V0MzoKKwlmcmVlX3BhZ2UocCk7CitvdXQyOgorCXNwaW5fbG9ja19iaCgmY3NfY2hhcl9kYXRhLmxvY2spOworCWNzX2NoYXJfZGF0YS5vcGVuZWQgPSAwOworCXNwaW5fdW5sb2NrX2JoKCZjc19jaGFyX2RhdGEubG9jayk7CitvdXQxOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNzX2ZyZWVfY2hhcl9xdWV1ZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBjaGFyX3F1ZXVlICplbnRyeTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjdXJzb3IsICpuZXh0OworCisJaWYgKCFsaXN0X2VtcHR5KGhlYWQpKSB7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShjdXJzb3IsIG5leHQsIGhlYWQpIHsKKwkJCWVudHJ5ID0gbGlzdF9lbnRyeShjdXJzb3IsIHN0cnVjdCBjaGFyX3F1ZXVlLCBsaXN0KTsKKwkJCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJCQlrZnJlZShlbnRyeSk7CisJCX0KKwl9CisKK30KKworc3RhdGljIGludCBjc19jaGFyX3JlbGVhc2Uoc3RydWN0IGlub2RlICp1bnVzZWQsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjc19jaGFyICpjc2RhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwljc19oc2lfc3RvcChjc2RhdGEtPmhpKTsKKwlzcGluX2xvY2tfYmgoJmNzZGF0YS0+bG9jayk7CisJY3NkYXRhLT5oaSA9IE5VTEw7CisJZnJlZV9wYWdlKGNzZGF0YS0+bW1hcF9iYXNlKTsKKwljc19mcmVlX2NoYXJfcXVldWUoJmNzZGF0YS0+Y2hhcmRldl9xdWV1ZSk7CisJY3NfZnJlZV9jaGFyX3F1ZXVlKCZjc2RhdGEtPmRhdGFpbmRfcXVldWUpOworCWNzZGF0YS0+b3BlbmVkID0gMDsKKwlzcGluX3VubG9ja19iaCgmY3NkYXRhLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjc19jaGFyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGNzX2NoYXJfcmVhZCwKKwkud3JpdGUJCT0gY3NfY2hhcl93cml0ZSwKKwkucG9sbAkJPSBjc19jaGFyX3BvbGwsCisJLnVubG9ja2VkX2lvY3RsCT0gY3NfY2hhcl9pb2N0bCwKKwkubW1hcAkJPSBjc19jaGFyX21tYXAsCisJLm9wZW4JCT0gY3NfY2hhcl9vcGVuLAorCS5yZWxlYXNlCT0gY3NfY2hhcl9yZWxlYXNlLAorCS5mYXN5bmMJCT0gY3NfY2hhcl9mYXN5bmMsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgY3NfY2hhcl9taXNjZGV2ID0geworCS5taW5vcgk9IE1JU0NfRFlOQU1JQ19NSU5PUiwKKwkubmFtZQk9ICJjbXRfc3BlZWNoIiwKKwkuZm9wcwk9ICZjc19jaGFyX2ZvcHMKK307CisKK3N0YXRpYyBpbnQgY3NfaHNpX2NsaWVudF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGhzaV9jbGllbnQgKmNsID0gdG9faHNpX2NsaWVudChkZXYpOworCisJZGV2X2RiZyhkZXYsICJoc2lfY2xpZW50X3Byb2JlXG4iKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjc19jaGFyX2RhdGEud2FpdCk7CisJc3Bpbl9sb2NrX2luaXQoJmNzX2NoYXJfZGF0YS5sb2NrKTsKKwljc19jaGFyX2RhdGEub3BlbmVkID0gMDsKKwljc19jaGFyX2RhdGEuY2wgPSBjbDsKKwljc19jaGFyX2RhdGEuaGkgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZjc19jaGFyX2RhdGEuY2hhcmRldl9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmNzX2NoYXJfZGF0YS5kYXRhaW5kX3F1ZXVlKTsKKworCWNzX2NoYXJfZGF0YS5jaGFubmVsX2lkX2NtZCA9IGhzaV9nZXRfY2hhbm5lbF9pZF9ieV9uYW1lKGNsLAorCQkic3BlZWNoLWNvbnRyb2wiKTsKKwlpZiAoY3NfY2hhcl9kYXRhLmNoYW5uZWxfaWRfY21kIDwgMCkgeworCQllcnIgPSBjc19jaGFyX2RhdGEuY2hhbm5lbF9pZF9jbWQ7CisJCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGdldCBjbWQgY2hhbm5lbCAoJWQpXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWNzX2NoYXJfZGF0YS5jaGFubmVsX2lkX2RhdGEgPSBoc2lfZ2V0X2NoYW5uZWxfaWRfYnlfbmFtZShjbCwKKwkJInNwZWVjaC1kYXRhIik7CisJaWYgKGNzX2NoYXJfZGF0YS5jaGFubmVsX2lkX2RhdGEgPCAwKSB7CisJCWVyciA9IGNzX2NoYXJfZGF0YS5jaGFubmVsX2lkX2RhdGE7CisJCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGdldCBkYXRhIGNoYW5uZWwgKCVkKVxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwllcnIgPSBtaXNjX3JlZ2lzdGVyKCZjc19jaGFyX21pc2NkZXYpOworCWlmIChlcnIpCisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyOiAlZFxuIiwgZXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3NfaHNpX2NsaWVudF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBjc19oc2lfaWZhY2UgKmhpOworCisJZGV2X2RiZyhkZXYsICJoc2lfY2xpZW50X3JlbW92ZVxuIik7CisJbWlzY19kZXJlZ2lzdGVyKCZjc19jaGFyX21pc2NkZXYpOworCXNwaW5fbG9ja19iaCgmY3NfY2hhcl9kYXRhLmxvY2spOworCWhpID0gY3NfY2hhcl9kYXRhLmhpOworCWNzX2NoYXJfZGF0YS5oaSA9IE5VTEw7CisJc3Bpbl91bmxvY2tfYmgoJmNzX2NoYXJfZGF0YS5sb2NrKTsKKwlpZiAoaGkpCisJCWNzX2hzaV9zdG9wKGhpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGhzaV9jbGllbnRfZHJpdmVyIGNzX2hzaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiY210LXNwZWVjaCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucHJvYmUJPSBjc19oc2lfY2xpZW50X3Byb2JlLAorCQkucmVtb3ZlCT0gY3NfaHNpX2NsaWVudF9yZW1vdmUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNzX2NoYXJfaW5pdCh2b2lkKQoreworCXByX2luZm8oIkNNVCBzcGVlY2ggZHJpdmVyIGFkZGVkXG4iKTsKKwlyZXR1cm4gaHNpX3JlZ2lzdGVyX2NsaWVudF9kcml2ZXIoJmNzX2hzaV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoY3NfY2hhcl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGNzX2NoYXJfZXhpdCh2b2lkKQoreworCWhzaV91bnJlZ2lzdGVyX2NsaWVudF9kcml2ZXIoJmNzX2hzaV9kcml2ZXIpOworCXByX2luZm8oIkNNVCBzcGVlY2ggZHJpdmVyIHJlbW92ZWRcbiIpOworfQorbW9kdWxlX2V4aXQoY3NfY2hhcl9leGl0KTsKKworTU9EVUxFX0FMSUFTKCJoc2k6Y210LXNwZWVjaCIpOworTU9EVUxFX0FVVEhPUigiS2FpIFZlaG1hbmVuIDxrYWkudmVobWFuZW5Abm9raWEuY29tPiIpOworTU9EVUxFX0FVVEhPUigiUGV0ZXIgVWpmYWx1c2kgPHBldGVyLnVqZmFsdXNpQG5va2lhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ01UIHNwZWVjaCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHNpL2NsaWVudHMvbm9raWEtbW9kZW0uYyBiL2RyaXZlcnMvaHNpL2NsaWVudHMvbm9raWEtbW9kZW0uYwppbmRleCBlYjRkYzYzLi5iYmIxOTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2hzaS9jbGllbnRzL25va2lhLW1vZGVtLmMKKysrIGIvZHJpdmVycy9oc2kvY2xpZW50cy9ub2tpYS1tb2RlbS5jCkBAIC00Niw2ICs0Niw3IEBACiAJc3RydWN0IG5va2lhX21vZGVtX2dwaW8JKmdwaW9zOwogCWludAkJCWdwaW9fYW1vdW50OwogCXN0cnVjdCBoc2lfY2xpZW50CSpzc2lfcHJvdG9jb2w7CisJc3RydWN0IGhzaV9jbGllbnQJKmNtdF9zcGVlY2g7CiB9OwogCiBzdGF0aWMgdm9pZCBkb19ub2tpYV9tb2RlbV9yc3RfaW5kX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQpAQCAtMTQ5LDYgKzE1MCw3IEBACiAJc3RydWN0IGhzaV9wb3J0ICpwb3J0ID0gaHNpX2dldF9wb3J0KGNsKTsKIAlpbnQgaXJxLCBwZmxhZ3MsIGVycjsKIAlzdHJ1Y3QgaHNpX2JvYXJkX2luZm8gc3NpcDsKKwlzdHJ1Y3QgaHNpX2JvYXJkX2luZm8gY210c3BlZWNoOwogCiAJbnAgPSBkZXYtPm9mX25vZGU7CiAJaWYgKCFucCkgewpAQCAtMjAwLDYgKzIwMiw3IEBACiAJbW9kZW0tPnNzaV9wcm90b2NvbCA9IGhzaV9uZXdfY2xpZW50KHBvcnQsICZzc2lwKTsKIAlpZiAoIW1vZGVtLT5zc2lfcHJvdG9jb2wpIHsKIAkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgcmVnaXN0ZXIgc3NpLXByb3RvY29sIGRldmljZVxuIik7CisJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3IyOwogCX0KIApAQCAtMjEzLDEyICsyMTYsMzUgQEAKIAkJZ290byBlcnJvcjM7CiAJfQogCi0JLyogVE9ETzogcmVnaXN0ZXIgY210LXNwZWVjaCBoc2kgY2xpZW50ICovCisJY210c3BlZWNoLm5hbWUgPSAiY210LXNwZWVjaCI7CisJY210c3BlZWNoLnR4X2NmZyA9IGNsLT50eF9jZmc7CisJY210c3BlZWNoLnJ4X2NmZyA9IGNsLT5yeF9jZmc7CisJY210c3BlZWNoLnBsYXRmb3JtX2RhdGEgPSBOVUxMOworCWNtdHNwZWVjaC5hcmNoZGF0YSA9IE5VTEw7CisKKwltb2RlbS0+Y210X3NwZWVjaCA9IGhzaV9uZXdfY2xpZW50KHBvcnQsICZjbXRzcGVlY2gpOworCWlmICghbW9kZW0tPmNtdF9zcGVlY2gpIHsKKwkJZGV2X2VycihkZXYsICJDb3VsZCBub3QgcmVnaXN0ZXIgY210LXNwZWVjaCBkZXZpY2VcbiIpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yMzsKKwl9CisKKwllcnIgPSBkZXZpY2VfYXR0YWNoKCZtb2RlbS0+Y210X3NwZWVjaC0+ZGV2aWNlKTsKKwlpZiAoZXJyID09IDApIHsKKwkJZGV2X2VycihkZXYsICJNaXNzaW5nIGNtdC1zcGVlY2ggZHJpdmVyXG4iKTsKKwkJZXJyID0gLUVQUk9CRV9ERUZFUjsKKwkJZ290byBlcnJvcjQ7CisJfSBlbHNlIGlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiQ291bGQgbm90IGxvYWQgY210LXNwZWVjaCBkcml2ZXIgKCVkKVxuIiwgZXJyKTsKKwkJZ290byBlcnJvcjQ7CisJfQogCiAJZGV2X2luZm8oZGV2LCAiUmVnaXN0ZXJlZCBOb2tpYSBIU0kgbW9kZW1cbiIpOwogCiAJcmV0dXJuIDA7CiAKK2Vycm9yNDoKKwloc2lfcmVtb3ZlX2NsaWVudCgmbW9kZW0tPmNtdF9zcGVlY2gtPmRldmljZSwgTlVMTCk7CiBlcnJvcjM6CiAJaHNpX3JlbW92ZV9jbGllbnQoJm1vZGVtLT5zc2lfcHJvdG9jb2wtPmRldmljZSwgTlVMTCk7CiBlcnJvcjI6CkBAIC0yMzcsNiArMjYzLDExIEBACiAJaWYgKCFtb2RlbSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAobW9kZW0tPmNtdF9zcGVlY2gpIHsKKwkJaHNpX3JlbW92ZV9jbGllbnQoJm1vZGVtLT5jbXRfc3BlZWNoLT5kZXZpY2UsIE5VTEwpOworCQltb2RlbS0+Y210X3NwZWVjaCA9IE5VTEw7CisJfQorCiAJaWYgKG1vZGVtLT5zc2lfcHJvdG9jb2wpIHsKIAkJaHNpX3JlbW92ZV9jbGllbnQoJm1vZGVtLT5zc2lfcHJvdG9jb2wtPmRldmljZSwgTlVMTCk7CiAJCW1vZGVtLT5zc2lfcHJvdG9jb2wgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9LY29uZmlnIGIvZHJpdmVycy9od21vbi9LY29uZmlnCmluZGV4IDExMGZhZGUuLjI1ZDllNzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vS2NvbmZpZworKysgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKQEAgLTUxMCw2ICs1MTAsNyBAQAogY29uZmlnIFNFTlNPUlNfR1BJT19GQU4KIAl0cmlzdGF0ZSAiR1BJTyBmYW4iCiAJZGVwZW5kcyBvbiBHUElPTElCCisJZGVwZW5kcyBvbiBUSEVSTUFMIHx8IFRIRVJNQUw9bgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBmYW5zIGNvbm5lY3RlZCB0byBHUElPIGxpbmVzLgogCkBAIC01OTksOCArNjAwLDggQEAKIAloZWxwCiAJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgSVRFIElUODcwNUYsIElUODcxMkYsCiAJICBJVDg3MTZGLCBJVDg3MThGLCBJVDg3MjBGLCBJVDg3MjFGLCBJVDg3MjZGLCBJVDg3MjhGLCBJVDg3NThFLAotCSAgSVQ4NzcxRSwgSVQ4NzcyRSwgSVQ4NzgyRiwgSVQ4NzgzRS9GIGFuZCBJVDg2MDNFIHNlbnNvciBjaGlwcywKLQkgIGFuZCB0aGUgU2lTOTUwIGNsb25lLgorCSAgSVQ4NzcxRSwgSVQ4NzcyRSwgSVQ4NzgxRiwgSVQ4NzgyRiwgSVQ4NzgzRS9GLCBJVDg3ODZFLCBJVDg3OTBFLAorCSAgSVQ4NjAzRSwgSVQ4NjIwRSwgYW5kIElUODYyM0Ugc2Vuc29yIGNoaXBzLCBhbmQgdGhlIFNpUzk1MCBjbG9uZS4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaXQ4Ny4KQEAgLTYyNCw3ICs2MjUsNyBAQAogCSAgbW9iaWxlIGRldmljZXMgYW5kIHNlcnZlcnMuICBTdXBwb3J0IHdpbGwgaW5jbHVkZSwgYnV0IG5vdCBiZSBsaW1pdGVkCiAJICB0bywgQURUNzQwOCwgQVQzMFRTMDAsIENBVDM0VFMwMiwgQ0FUNjA5NSwgTUFYNjYwNCwgTUNQOTgwNCwgTUNQOTgwNSwKIAkgIE1DUDk4MjQyLCBNQ1A5ODI0MywgTUNQOTgyNDQsIE1DUDk4NDMsIFNFOTcsIFNFOTgsIFNUVFM0MjQoRSksCi0JICBTVFRTMjAwMiwgU1RUUzMwMDAsIFRTRTIwMDJCMywgVFNFMjAwMkdCMiwgVFMzMDAwQjMsIGFuZCBUUzMwMDBHQjIuCisJICBTVFRTMjAwMiwgU1RUUzMwMDAsIFRTRTIwMDIsIFRTRTIwMDQsIFRTMzAwMCwgYW5kIFRTMzAwMS4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgamM0Mi4KQEAgLTExNDUsNiArMTE0NiwxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbmN0NzgwMi4KIAorY29uZmlnIFNFTlNPUlNfTkNUNzkwNAorCXRyaXN0YXRlICJOdXZvdG9uIE5DVDc5MDQiCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE51dm90b24gTkNUNzkwNAorCSAgaGFyZHdhcmUgbW9uaXRvcmluZyBjaGlwLCBpbmNsdWRpbmcgbWFudWFsIGZhbiBzcGVlZCBjb250cm9sLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBuY3Q3OTA0LgorCiBjb25maWcgU0VOU09SU19QQ0Y4NTkxCiAJdHJpc3RhdGUgIlBoaWxpcHMgUENGODU5MSBBREMvREFDIgogCWRlcGVuZHMgb24gSTJDCkBAIC0xMTY0LDYgKzExNzUsNyBAQAogY29uZmlnIFNFTlNPUlNfUFdNX0ZBTgogCXRyaXN0YXRlICJQV00gZmFuIgogCWRlcGVuZHMgb24gKFBXTSAmJiBPRikgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBUSEVSTUFMIHx8IFRIRVJNQUw9bgogCWhlbHAKIAkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBmYW5zIGNvbm5lY3RlZCB0byBQV00gbGluZXMuCiAJICBUaGUgZHJpdmVyIHVzZXMgdGhlIGdlbmVyaWMgUFdNIGludGVyZmFjZSwgdGh1cyBpdCB3aWxsIHdvcmsgb24gYQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5kZXggNmM5NDE0Ny4uYjRhNDBmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC0xMjAsNiArMTIwLDcgQEAKIG9iai0kKENPTkZJR19TRU5TT1JTX05DVDY2ODMpCSs9IG5jdDY2ODMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTkNUNjc3NSkJKz0gbmN0Njc3NS5vCiBvYmotJChDT05GSUdfU0VOU09SU19OQ1Q3ODAyKQkrPSBuY3Q3ODAyLm8KK29iai0kKENPTkZJR19TRU5TT1JTX05DVDc5MDQpCSs9IG5jdDc5MDQubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTlRDX1RIRVJNSVNUT1IpCSs9IG50Y190aGVybWlzdG9yLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1BDODczNjApCSs9IHBjODczNjAubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUEM4NzQyNykJKz0gcGM4NzQyNy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKaW5kZXggNWI3ZmVjOC4uZWQzMDNiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCisrKyBiL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYwpAQCAtMzk3LDE0ICszOTcsMTMgQEAKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpID0gewogCQkJc2hvd19sYWJlbCwgc2hvd19jcml0X2FsYXJtLCBzaG93X3RlbXAsIHNob3dfdGptYXgsCiAJCQlzaG93X3R0YXJnZXQgfTsKLQlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbmFtZXNbVE9UQUxfQVRUUlNdID0gewotCQkJCQkidGVtcCVkX2xhYmVsIiwgInRlbXAlZF9jcml0X2FsYXJtIiwKLQkJCQkJInRlbXAlZF9pbnB1dCIsICJ0ZW1wJWRfY3JpdCIsCi0JCQkJCSJ0ZW1wJWRfbWF4IiB9OworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzdWZmaXhlc1tUT1RBTF9BVFRSU10gPSB7CisJCSJsYWJlbCIsICJjcml0X2FsYXJtIiwgImlucHV0IiwgImNyaXQiLCAibWF4IgorCX07CiAKIAlmb3IgKGkgPSAwOyBpIDwgdGRhdGEtPmF0dHJfc2l6ZTsgaSsrKSB7Ci0JCXNucHJpbnRmKHRkYXRhLT5hdHRyX25hbWVbaV0sIENPUkVURU1QX05BTUVfTEVOR1RILCBuYW1lc1tpXSwKLQkJCWF0dHJfbm8pOworCQlzbnByaW50Zih0ZGF0YS0+YXR0cl9uYW1lW2ldLCBDT1JFVEVNUF9OQU1FX0xFTkdUSCwKKwkJCSAidGVtcCVkXyVzIiwgYXR0cl9ubywgc3VmZml4ZXNbaV0pOwogCQlzeXNmc19hdHRyX2luaXQoJnRkYXRhLT5zZF9hdHRyc1tpXS5kZXZfYXR0ci5hdHRyKTsKIAkJdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyLmF0dHIubmFtZSA9IHRkYXRhLT5hdHRyX25hbWVbaV07CiAJCXRkYXRhLT5zZF9hdHRyc1tpXS5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9ncGlvLWZhbi5jIGIvZHJpdmVycy9od21vbi9ncGlvLWZhbi5jCmluZGV4IDM2YWJmODEuLmEzZGFlNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vZ3Bpby1mYW4uYworKysgYi9kcml2ZXJzL2h3bW9uL2dwaW8tZmFuLmMKQEAgLTM0LDEwICszNCwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvdGhlcm1hbC5oPgogCiBzdHJ1Y3QgZ3Bpb19mYW5fZGF0YSB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGRldjsKIAlzdHJ1Y3QgZGV2aWNlCQkqaHdtb25fZGV2OworCS8qIENvb2xpbmcgZGV2aWNlIGlmIGFueSAqLworCXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBtdXRleAkJbG9jazsgLyogbG9jayBHUElPcyBvcGVyYXRpb25zLiAqLwogCWludAkJCW51bV9jdHJsOwogCXVuc2lnbmVkCQkqY3RybDsKQEAgLTM4Nyw2ICszOTAsNTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBncGlvX2Zhbl9nZXRfbWF4X3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2LAorCQkJCSAgdW5zaWduZWQgbG9uZyAqc3RhdGUpCit7CisJc3RydWN0IGdwaW9fZmFuX2RhdGEgKmZhbl9kYXRhID0gY2Rldi0+ZGV2ZGF0YTsKKworCWlmICghZmFuX2RhdGEpCisJCXJldHVybiAtRUlOVkFMOworCisJKnN0YXRlID0gZmFuX2RhdGEtPm51bV9zcGVlZCAtIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Bpb19mYW5fZ2V0X2N1cl9zdGF0ZShzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgKnN0YXRlKQoreworCXN0cnVjdCBncGlvX2Zhbl9kYXRhICpmYW5fZGF0YSA9IGNkZXYtPmRldmRhdGE7CisJaW50IHI7CisKKwlpZiAoIWZhbl9kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXIgPSBnZXRfZmFuX3NwZWVkX2luZGV4KGZhbl9kYXRhKTsKKwlpZiAociA8IDApCisJCXJldHVybiByOworCisJKnN0YXRlID0gcjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBncGlvX2Zhbl9zZXRfY3VyX3N0YXRlKHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlICpjZGV2LAorCQkJCSAgdW5zaWduZWQgbG9uZyBzdGF0ZSkKK3sKKwlzdHJ1Y3QgZ3Bpb19mYW5fZGF0YSAqZmFuX2RhdGEgPSBjZGV2LT5kZXZkYXRhOworCisJaWYgKCFmYW5fZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzZXRfZmFuX3NwZWVkKGZhbl9kYXRhLCBzdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgZ3Bpb19mYW5fY29vbF9vcHMgPSB7CisJLmdldF9tYXhfc3RhdGUgPSBncGlvX2Zhbl9nZXRfbWF4X3N0YXRlLAorCS5nZXRfY3VyX3N0YXRlID0gZ3Bpb19mYW5fZ2V0X2N1cl9zdGF0ZSwKKwkuc2V0X2N1cl9zdGF0ZSA9IGdwaW9fZmFuX3NldF9jdXJfc3RhdGUsCit9OworCiAjaWZkZWYgQ09ORklHX09GX0dQSU8KIC8qCiAgKiBUcmFuc2xhdGUgT3BlbkZpcm13YXJlIG5vZGUgcHJvcGVydGllcyBpbnRvIHBsYXRmb3JtX2RhdGEKQEAgLTQwNCwxMCArNDU0LDMyIEBACiAKIAlub2RlID0gZGV2LT5vZl9ub2RlOwogCisJLyogQWxhcm0gR1BJTyBpZiBvbmUgZXhpc3RzICovCisJaWYgKG9mX2dwaW9fbmFtZWRfY291bnQobm9kZSwgImFsYXJtLWdwaW9zIikgPiAwKSB7CisJCXN0cnVjdCBncGlvX2Zhbl9hbGFybSAqYWxhcm07CisJCWludCB2YWw7CisJCWVudW0gb2ZfZ3Bpb19mbGFncyBmbGFnczsKKworCQlhbGFybSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgZ3Bpb19mYW5fYWxhcm0pLAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKCFhbGFybSkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXZhbCA9IG9mX2dldF9uYW1lZF9ncGlvX2ZsYWdzKG5vZGUsICJhbGFybS1ncGlvcyIsIDAsICZmbGFncyk7CisJCWlmICh2YWwgPCAwKQorCQkJcmV0dXJuIHZhbDsKKwkJYWxhcm0tPmdwaW8gPSB2YWw7CisJCWFsYXJtLT5hY3RpdmVfbG93ID0gZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1c7CisKKwkJcGRhdGEtPmFsYXJtID0gYWxhcm07CisJfQorCiAJLyogRmlsbCBHUElPIHBpbiBhcnJheSAqLwogCXBkYXRhLT5udW1fY3RybCA9IG9mX2dwaW9fY291bnQobm9kZSk7CiAJaWYgKHBkYXRhLT5udW1fY3RybCA8PSAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiZ3Bpb3MgRFQgcHJvcGVydHkgZW1wdHkgLyBtaXNzaW5nIik7CisJCWlmIChwZGF0YS0+YWxhcm0pCisJCQlyZXR1cm4gMDsKKwkJZGV2X2VycihkZXYsICJEVCBwcm9wZXJ0aWVzIGVtcHR5IC8gbWlzc2luZyIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJY3RybCA9IGRldm1fa3phbGxvYyhkZXYsIHBkYXRhLT5udW1fY3RybCAqIHNpemVvZih1bnNpZ25lZCksCkBAIC00NjAsMjYgKzUzMiw2IEBACiAJfQogCXBkYXRhLT5zcGVlZCA9IHNwZWVkOwogCi0JLyogQWxhcm0gR1BJTyBpZiBvbmUgZXhpc3RzICovCi0JaWYgKG9mX2dwaW9fbmFtZWRfY291bnQobm9kZSwgImFsYXJtLWdwaW9zIikgPiAwKSB7Ci0JCXN0cnVjdCBncGlvX2Zhbl9hbGFybSAqYWxhcm07Ci0JCWludCB2YWw7Ci0JCWVudW0gb2ZfZ3Bpb19mbGFncyBmbGFnczsKLQotCQlhbGFybSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgZ3Bpb19mYW5fYWxhcm0pLAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKCFhbGFybSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JCXZhbCA9IG9mX2dldF9uYW1lZF9ncGlvX2ZsYWdzKG5vZGUsICJhbGFybS1ncGlvcyIsIDAsICZmbGFncyk7Ci0JCWlmICh2YWwgPCAwKQotCQkJcmV0dXJuIHZhbDsKLQkJYWxhcm0tPmdwaW8gPSB2YWw7Ci0JCWFsYXJtLT5hY3RpdmVfbG93ID0gZmxhZ3MgJiBPRl9HUElPX0FDVElWRV9MT1c7Ci0KLQkJcGRhdGEtPmFsYXJtID0gYWxhcm07Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQ5NSw2ICs1NDcsMTEgQEAKIAlzdHJ1Y3QgZ3Bpb19mYW5fZGF0YSAqZmFuX2RhdGE7CiAJc3RydWN0IGdwaW9fZmFuX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAorCWZhbl9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZ3Bpb19mYW5fZGF0YSksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFmYW5fZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKICNpZmRlZiBDT05GSUdfT0ZfR1BJTwogCWlmICghcGRhdGEpIHsKIAkJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKQEAgLTUxMiwxMSArNTY5LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAjZW5kaWYgLyogQ09ORklHX09GX0dQSU8gKi8KIAotCWZhbl9kYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZ3Bpb19mYW5fZGF0YSksCi0JCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmYW5fZGF0YSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlmYW5fZGF0YS0+cGRldiA9IHBkZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZmFuX2RhdGEpOwogCW11dGV4X2luaXQoJmZhbl9kYXRhLT5sb2NrKTsKQEAgLTU0NCwxOCArNTk2LDM5IEBACiAJCQkJCQkgICAgICAgZ3Bpb19mYW5fZ3JvdXBzKTsKIAlpZiAoSVNfRVJSKGZhbl9kYXRhLT5od21vbl9kZXYpKQogCQlyZXR1cm4gUFRSX0VSUihmYW5fZGF0YS0+aHdtb25fZGV2KTsKKyNpZmRlZiBDT05GSUdfT0ZfR1BJTworCS8qIE9wdGlvbmFsIGNvb2xpbmcgZGV2aWNlIHJlZ2lzdGVyIGZvciBEZXZpY2UgdHJlZSBwbGF0Zm9ybXMgKi8KKwlmYW5fZGF0YS0+Y2RldiA9IHRoZXJtYWxfb2ZfY29vbGluZ19kZXZpY2VfcmVnaXN0ZXIocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkJICAgICJncGlvLWZhbiIsCisJCQkJCQkJICAgIGZhbl9kYXRhLAorCQkJCQkJCSAgICAmZ3Bpb19mYW5fY29vbF9vcHMpOworI2Vsc2UgLyogQ09ORklHX09GX0dQSU8gKi8KKwkvKiBPcHRpb25hbCBjb29saW5nIGRldmljZSByZWdpc3RlciBmb3Igbm9uIERldmljZSB0cmVlIHBsYXRmb3JtcyAqLworCWZhbl9kYXRhLT5jZGV2ID0gdGhlcm1hbF9jb29saW5nX2RldmljZV9yZWdpc3RlcigiZ3Bpby1mYW4iLCBmYW5fZGF0YSwKKwkJCQkJCQkgJmdwaW9fZmFuX2Nvb2xfb3BzKTsKKyNlbmRpZiAvKiBDT05GSUdfT0ZfR1BJTyAqLwogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIkdQSU8gZmFuIGluaXRpYWxpemVkXG4iKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBncGlvX2Zhbl9zaHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBncGlvX2Zhbl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgZ3Bpb19mYW5fZGF0YSAqZmFuX2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGdwaW9fZmFuX2RhdGEgKmZhbl9kYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoIUlTX0VSUihmYW5fZGF0YS0+Y2RldikpCisJCXRoZXJtYWxfY29vbGluZ19kZXZpY2VfdW5yZWdpc3RlcihmYW5fZGF0YS0+Y2Rldik7CiAKIAlpZiAoZmFuX2RhdGEtPmN0cmwpCiAJCXNldF9mYW5fc3BlZWQoZmFuX2RhdGEsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdwaW9fZmFuX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJZ3Bpb19mYW5fcmVtb3ZlKHBkZXYpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCkBAIC01ODksNiArNjYyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZ3Bpb19mYW5fZHJpdmVyID0gewogCS5wcm9iZQkJPSBncGlvX2Zhbl9wcm9iZSwKKwkucmVtb3ZlCQk9IGdwaW9fZmFuX3JlbW92ZSwKIAkuc2h1dGRvd24JPSBncGlvX2Zhbl9zaHV0ZG93biwKIAkuZHJpdmVyCT0gewogCQkubmFtZQk9ICJncGlvLWZhbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2libXBleC5jIGIvZHJpdmVycy9od21vbi9pYm1wZXguYwppbmRleCAwMzBlN2ZmLi4yMWI5YzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2libXBleC5jCisrKyBiL2RyaXZlcnMvaHdtb24vaWJtcGV4LmMKQEAgLTU2LDE1ICs1NiwxMCBAQAogc3RhdGljIHU4IGNvbnN0IHdhdHRfc2Vuc29yX3NpZ1tdICA9IHsweDQxLCAweDQzfTsKIAogI2RlZmluZSBQRVhfTlVNX1NFTlNPUl9GVU5DUwkzCi1zdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IHBvd2VyX3NlbnNvcl9uYW1lX3RlbXBsYXRlc1tdID0gewotCSIlcyVkX2F2ZXJhZ2UiLAotCSIlcyVkX2F2ZXJhZ2VfbG93ZXN0IiwKLQkiJXMlZF9hdmVyYWdlX2hpZ2hlc3QiCi19Owotc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCB0ZW1wX3NlbnNvcl9uYW1lX3RlbXBsYXRlc1tdID0gewotCSIlcyVkX2lucHV0IiwKLQkiJXMlZF9pbnB1dF9sb3dlc3QiLAotCSIlcyVkX2lucHV0X2hpZ2hlc3QiCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNlbnNvcl9uYW1lX3N1ZmZpeGVzW10gPSB7CisJIiIsCisJIl9sb3dlc3QiLAorCSJfaGlnaGVzdCIKIH07CiAKIHN0YXRpYyB2b2lkIGlibXBleF9tc2dfaGFuZGxlcihzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnLCB2b2lkICp1c2VyX21zZ19kYXRhKTsKQEAgLTM1NSw5ICszNTAsMTEgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAodHlwZSA9PSBURU1QX1NFTlNPUikKLQkJc3ByaW50ZihuLCB0ZW1wX3NlbnNvcl9uYW1lX3RlbXBsYXRlc1tmdW5jXSwgInRlbXAiLCBjb3VudGVyKTsKKwkJc3ByaW50ZihuLCAidGVtcCVkX2lucHV0JXMiLAorCQkJY291bnRlciwgc2Vuc29yX25hbWVfc3VmZml4ZXNbZnVuY10pOwogCWVsc2UgaWYgKHR5cGUgPT0gUE9XRVJfU0VOU09SKQotCQlzcHJpbnRmKG4sIHBvd2VyX3NlbnNvcl9uYW1lX3RlbXBsYXRlc1tmdW5jXSwgInBvd2VyIiwgY291bnRlcik7CisJCXNwcmludGYobiwgInBvd2VyJWRfYXZlcmFnZSVzIiwKKwkJCWNvdW50ZXIsIHNlbnNvcl9uYW1lX3N1ZmZpeGVzW2Z1bmNdKTsKIAogCXN5c2ZzX2F0dHJfaW5pdCgmZGF0YS0+c2Vuc29yc1tzZW5zb3JdLmF0dHJbZnVuY10uZGV2X2F0dHIuYXR0cik7CiAJZGF0YS0+c2Vuc29yc1tzZW5zb3JdLmF0dHJbZnVuY10uZGV2X2F0dHIuYXR0ci5uYW1lID0gbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vaWJtcG93ZXJudi5jIGIvZHJpdmVycy9od21vbi9pYm1wb3dlcm52LmMKaW5kZXggZmViZTgxNy4uNDI1NTUxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9pYm1wb3dlcm52LmMKKysrIGIvZHJpdmVycy9od21vbi9pYm1wb3dlcm52LmMKQEAgLTMwLDggKzMwLDExIEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8YXNtL29wYWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxhc20vY3B1dGhyZWFkcy5oPgorI2luY2x1ZGUgPGFzbS9zbXAuaD4KIAogI2RlZmluZSBNQVhfQVRUUl9MRU4JMzIKKyNkZWZpbmUgTUFYX0xBQkVMX0xFTgk2NAogCiAvKiBTZW5zb3Igc3VmZml4IG5hbWUgZnJvbSBEVCAqLwogI2RlZmluZSBEVF9GQVVMVF9BVFRSX1NVRkZJWAkJImZhdWx0ZWQiCkBAIC00NCwxNyArNDcsMjAgQEAKICAqLwogZW51bSBzZW5zb3JzIHsKIAlGQU4sCi0JQU1CSUVOVF9URU1QLAorCVRFTVAsCiAJUE9XRVJfU1VQUExZLAogCVBPV0VSX0lOUFVULAogCU1BWF9TRU5TT1JfVFlQRSwKIH07CiAKKyNkZWZpbmUgSU5WQUxJRF9JTkRFWCAoLTFVKQorCiBzdGF0aWMgc3RydWN0IHNlbnNvcl9ncm91cCB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAljb25zdCBjaGFyICpjb21wYXRpYmxlOwogCXN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgZ3JvdXA7CiAJdTMyIGF0dHJfY291bnQ7CisJdTMyIGh3bW9uX2luZGV4OwogfSBzZW5zb3JfZ3JvdXBzW10gPSB7CiAJeyJmYW4iLCAiaWJtLG9wYWwtc2Vuc29yLWNvb2xpbmctZmFuIn0sCiAJeyJ0ZW1wIiwgImlibSxvcGFsLXNlbnNvci1hbWItdGVtcCJ9LApAQCAtNjQsNyArNzAsMTAgQEAKIAogc3RydWN0IHNlbnNvcl9kYXRhIHsKIAl1MzIgaWQ7IC8qIEFuIG9wYXF1ZSBpZCBvZiB0aGUgZmlybXdhcmUgZm9yIGVhY2ggc2Vuc29yICovCisJdTMyIGh3bW9uX2luZGV4OworCXUzMiBvcGFsX2luZGV4OwogCWVudW0gc2Vuc29ycyB0eXBlOworCWNoYXIgbGFiZWxbTUFYX0xBQkVMX0xFTl07CiAJY2hhciBuYW1lW01BWF9BVFRSX0xFTl07CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7CiB9OwpAQCAtODcsNyArOTYsNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogQ29udmVydCB0ZW1wZXJhdHVyZSB0byBtaWxsaS1kZWdyZWVzICovCi0JaWYgKHNkYXRhLT50eXBlID09IEFNQklFTlRfVEVNUCkKKwlpZiAoc2RhdGEtPnR5cGUgPT0gVEVNUCkKIAkJeCAqPSAxMDAwOwogCS8qIENvbnZlcnQgcG93ZXIgdG8gbWljcm8td2F0dHMgKi8KIAllbHNlIGlmIChzZGF0YS0+dHlwZSA9PSBQT1dFUl9JTlBVVCkKQEAgLTk2LDggKzEwNSw2NSBAQAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB4KTsKIH0KIAotc3RhdGljIGludCBnZXRfc2Vuc29yX2luZGV4X2F0dHIoY29uc3QgY2hhciAqbmFtZSwgdTMyICppbmRleCwKLQkJCQkJY2hhciAqYXR0cikKK3N0YXRpYyBzc2l6ZV90IHNob3dfbGFiZWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwKKwkJCSAgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGF0YSAqc2RhdGEgPSBjb250YWluZXJfb2YoZGV2YXR0ciwgc3RydWN0IHNlbnNvcl9kYXRhLAorCQkJCQkJIGRldl9hdHRyKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzZGF0YS0+bGFiZWwpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBnZXRfbG9naWNhbF9jcHUoaW50IGh3Y3B1KQoreworCWludCBjcHU7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQorCQlpZiAoZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpID09IGh3Y3B1KQorCQkJcmV0dXJuIGNwdTsKKworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbWFrZV9zZW5zb3JfbGFiZWwoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCQkgICAgIHN0cnVjdCBzZW5zb3JfZGF0YSAqc2RhdGEsCisJCQkJICAgICBjb25zdCBjaGFyICpsYWJlbCkKK3sKKwl1MzIgaWQ7CisJc2l6ZV90IG47CisKKwluID0gc25wcmludGYoc2RhdGEtPmxhYmVsLCBzaXplb2Yoc2RhdGEtPmxhYmVsKSwgIiVzIiwgbGFiZWwpOworCisJLyoKKwkgKiBDb3JlIHRlbXAgcHJldHR5IHByaW50CisJICovCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImlibSxwaXIiLCAmaWQpKSB7CisJCWludCBjcHVpZCA9IGdldF9sb2dpY2FsX2NwdShpZCk7CisKKwkJaWYgKGNwdWlkID49IDApCisJCQkvKgorCQkJICogVGhlIGRpZ2l0YWwgdGhlcm1hbCBzZW5zb3JzIGFyZSBhc3NvY2lhdGVkCisJCQkgKiB3aXRoIGEgY29yZS4gTGV0J3MgcHJpbnQgb3V0IHRoZSByYW5nZSBvZgorCQkJICogY3B1IGlkcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBoYXJkd2FyZQorCQkJICogdGhyZWFkcyBvZiB0aGUgY29yZS4KKwkJCSAqLworCQkJbiArPSBzbnByaW50ZihzZGF0YS0+bGFiZWwgKyBuLAorCQkJCSAgICAgIHNpemVvZihzZGF0YS0+bGFiZWwpIC0gbiwgIiAlZC0lZCIsCisJCQkJICAgICAgY3B1aWQsIGNwdWlkICsgdGhyZWFkc19wZXJfY29yZSAtIDEpOworCQllbHNlCisJCQluICs9IHNucHJpbnRmKHNkYXRhLT5sYWJlbCArIG4sCisJCQkJICAgICAgc2l6ZW9mKHNkYXRhLT5sYWJlbCkgLSBuLCAiIHBoeSVkIiwgaWQpOworCX0KKworCS8qCisJICogTWVtYnVmZmVyIHByZXR0eSBwcmludAorCSAqLworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJpYm0sY2hpcC1pZCIsICZpZCkpCisJCW4gKz0gc25wcmludGYoc2RhdGEtPmxhYmVsICsgbiwgc2l6ZW9mKHNkYXRhLT5sYWJlbCkgLSBuLAorCQkJICAgICAgIiAlZCIsIGlkICYgMHhmZmZmKTsKK30KKworc3RhdGljIGludCBnZXRfc2Vuc29yX2luZGV4X2F0dHIoY29uc3QgY2hhciAqbmFtZSwgdTMyICppbmRleCwgY2hhciAqYXR0cikKIHsKIAljaGFyICpoYXNoX3BvcyA9IHN0cmNocihuYW1lLCAnIycpOwogCWNoYXIgYnVmWzhdID0geyAwIH07CkBAIC0xMjcsNDYgKzE5Myw5MCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqY29udmVydF9vcGFsX2F0dHJfbmFtZShlbnVtIHNlbnNvcnMgdHlwZSwKKwkJCQkJICBjb25zdCBjaGFyICpvcGFsX2F0dHIpCit7CisJY29uc3QgY2hhciAqYXR0cl9uYW1lID0gTlVMTDsKKworCWlmICghc3RyY21wKG9wYWxfYXR0ciwgRFRfRkFVTFRfQVRUUl9TVUZGSVgpKSB7CisJCWF0dHJfbmFtZSA9ICJmYXVsdCI7CisJfSBlbHNlIGlmICghc3RyY21wKG9wYWxfYXR0ciwgRFRfREFUQV9BVFRSX1NVRkZJWCkpIHsKKwkJYXR0cl9uYW1lID0gImlucHV0IjsKKwl9IGVsc2UgaWYgKCFzdHJjbXAob3BhbF9hdHRyLCBEVF9USFJFU0hPTERfQVRUUl9TVUZGSVgpKSB7CisJCWlmICh0eXBlID09IFRFTVApCisJCQlhdHRyX25hbWUgPSAibWF4IjsKKwkJZWxzZSBpZiAodHlwZSA9PSBGQU4pCisJCQlhdHRyX25hbWUgPSAibWluIjsKKwl9CisKKwlyZXR1cm4gYXR0cl9uYW1lOworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoZSBEVCBub2RlIG5hbWUgaW50byB0aGUgJ2h3bW9uJyBhdHRyaWJ1dGUgbmFtZS4KICAqIElCTVBPV0VSTlYgZGV2aWNlIG5vZGUgYXBwZWFyIGxpa2UgY29vbGluZy1mYW4jMi1kYXRhLCBhbWItdGVtcCMxLXRocnMgZXRjLgogICogd2hpY2ggbmVlZCB0byBiZSBtYXBwZWQgYXMgZmFuMl9pbnB1dCwgdGVtcDFfbWF4IHJlc3BlY3RpdmVseSBiZWZvcmUKICAqIHBvcHVsYXRpbmcgdGhlbSBpbnNpZGUgaHdtb24gZGV2aWNlIGNsYXNzLgogICovCi1zdGF0aWMgaW50IGNyZWF0ZV9od21vbl9hdHRyX25hbWUoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIHNlbnNvcnMgdHlwZSwKLQkJCQkJIGNvbnN0IGNoYXIgKm5vZGVfbmFtZSwKLQkJCQkJIGNoYXIgKmh3bW9uX2F0dHJfbmFtZSkKK3N0YXRpYyBjb25zdCBjaGFyICpwYXJzZV9vcGFsX25vZGVfbmFtZShjb25zdCBjaGFyICpub2RlX25hbWUsCisJCQkJCWVudW0gc2Vuc29ycyB0eXBlLCB1MzIgKmluZGV4KQogewogCWNoYXIgYXR0cl9zdWZmaXhbTUFYX0FUVFJfTEVOXTsKLQljaGFyICphdHRyX25hbWU7Ci0JdTMyIGluZGV4OworCWNvbnN0IGNoYXIgKmF0dHJfbmFtZTsKIAlpbnQgZXJyOwogCi0JZXJyID0gZ2V0X3NlbnNvcl9pbmRleF9hdHRyKG5vZGVfbmFtZSwgJmluZGV4LCBhdHRyX3N1ZmZpeCk7Ci0JaWYgKGVycikgewotCQlkZXZfZXJyKGRldiwgIlNlbnNvciBkZXZpY2Ugbm9kZSBuYW1lICclcycgaXMgaW52YWxpZFxuIiwKLQkJCW5vZGVfbmFtZSk7Ci0JCXJldHVybiBlcnI7CisJZXJyID0gZ2V0X3NlbnNvcl9pbmRleF9hdHRyKG5vZGVfbmFtZSwgaW5kZXgsIGF0dHJfc3VmZml4KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCisJYXR0cl9uYW1lID0gY29udmVydF9vcGFsX2F0dHJfbmFtZSh0eXBlLCBhdHRyX3N1ZmZpeCk7CisJaWYgKCFhdHRyX25hbWUpCisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCisJcmV0dXJuIGF0dHJfbmFtZTsKK30KKworc3RhdGljIGludCBnZXRfc2Vuc29yX3R5cGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwllbnVtIHNlbnNvcnMgdHlwZTsKKwljb25zdCBjaGFyICpzdHI7CisKKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYX1NFTlNPUl9UWVBFOyB0eXBlKyspIHsKKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCBzZW5zb3JfZ3JvdXBzW3R5cGVdLmNvbXBhdGlibGUpKQorCQkJcmV0dXJuIHR5cGU7CiAJfQogCi0JaWYgKCFzdHJjbXAoYXR0cl9zdWZmaXgsIERUX0ZBVUxUX0FUVFJfU1VGRklYKSkgewotCQlhdHRyX25hbWUgPSAiZmF1bHQiOwotCX0gZWxzZSBpZiAoIXN0cmNtcChhdHRyX3N1ZmZpeCwgRFRfREFUQV9BVFRSX1NVRkZJWCkpIHsKLQkJYXR0cl9uYW1lID0gImlucHV0IjsKLQl9IGVsc2UgaWYgKCFzdHJjbXAoYXR0cl9zdWZmaXgsIERUX1RIUkVTSE9MRF9BVFRSX1NVRkZJWCkpIHsKLQkJaWYgKHR5cGUgPT0gQU1CSUVOVF9URU1QKQotCQkJYXR0cl9uYW1lID0gIm1heCI7Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRkFOKQotCQkJYXR0cl9uYW1lID0gIm1pbiI7Ci0JCWVsc2UKLQkJCXJldHVybiAtRU5PRU5UOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRU5PRU5UOwotCX0KKwkvKgorCSAqIExldCdzIGNoZWNrIGlmIHdlIGhhdmUgYSBuZXdlciBkZXZpY2UgdHJlZQorCSAqLworCWlmICghb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJpYm0sb3BhbC1zZW5zb3IiKSkKKwkJcmV0dXJuIE1BWF9TRU5TT1JfVFlQRTsKIAotCXNucHJpbnRmKGh3bW9uX2F0dHJfbmFtZSwgTUFYX0FUVFJfTEVOLCAiJXMlZF8lcyIsCi0JCSBzZW5zb3JfZ3JvdXBzW3R5cGVdLm5hbWUsIGluZGV4LCBhdHRyX25hbWUpOwotCXJldHVybiAwOworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgInNlbnNvci10eXBlIiwgJnN0cikpCisJCXJldHVybiBNQVhfU0VOU09SX1RZUEU7CisKKwlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYX1NFTlNPUl9UWVBFOyB0eXBlKyspCisJCWlmICghc3RyY21wKHN0ciwgc2Vuc29yX2dyb3Vwc1t0eXBlXS5uYW1lKSkKKwkJCXJldHVybiB0eXBlOworCisJcmV0dXJuIE1BWF9TRU5TT1JfVFlQRTsKK30KKworc3RhdGljIHUzMiBnZXRfc2Vuc29yX2h3bW9uX2luZGV4KHN0cnVjdCBzZW5zb3JfZGF0YSAqc2RhdGEsCisJCQkJICBzdHJ1Y3Qgc2Vuc29yX2RhdGEgKnNkYXRhX3RhYmxlLCBpbnQgY291bnQpCit7CisJaW50IGk7CisKKwkvKgorCSAqIFdlIGRvbid0IHVzZSB0aGUgT1BBTCBpbmRleCBvbiBuZXdlciBkZXZpY2UgdHJlZXMKKwkgKi8KKwlpZiAoc2RhdGEtPm9wYWxfaW5kZXggIT0gSU5WQUxJRF9JTkRFWCkgeworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCWlmIChzZGF0YV90YWJsZVtpXS5vcGFsX2luZGV4ID09IHNkYXRhLT5vcGFsX2luZGV4ICYmCisJCQkgICAgc2RhdGFfdGFibGVbaV0udHlwZSA9PSBzZGF0YS0+dHlwZSkKKwkJCQlyZXR1cm4gc2RhdGFfdGFibGVbaV0uaHdtb25faW5kZXg7CisJfQorCXJldHVybiArK3NlbnNvcl9ncm91cHNbc2RhdGEtPnR5cGVdLmh3bW9uX2luZGV4OwogfQogCiBzdGF0aWMgaW50IHBvcHVsYXRlX2F0dHJfZ3JvdXBzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xNzgsMTUgKzI4OCwyMiBAQAogCiAJb3BhbCA9IG9mX2ZpbmRfbm9kZV9ieV9wYXRoKCIvaWJtLG9wYWwvc2Vuc29ycyIpOwogCWZvcl9lYWNoX2NoaWxkX29mX25vZGUob3BhbCwgbnApIHsKKwkJY29uc3QgY2hhciAqbGFiZWw7CisKIAkJaWYgKG5wLT5uYW1lID09IE5VTEwpCiAJCQljb250aW51ZTsKIAotCQlmb3IgKHR5cGUgPSAwOyB0eXBlIDwgTUFYX1NFTlNPUl9UWVBFOyB0eXBlKyspCi0JCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsCi0JCQkJCXNlbnNvcl9ncm91cHNbdHlwZV0uY29tcGF0aWJsZSkpIHsKLQkJCQlzZW5zb3JfZ3JvdXBzW3R5cGVdLmF0dHJfY291bnQrKzsKLQkJCQlicmVhazsKLQkJCX0KKwkJdHlwZSA9IGdldF9zZW5zb3JfdHlwZShucCk7CisJCWlmICh0eXBlID09IE1BWF9TRU5TT1JfVFlQRSkKKwkJCWNvbnRpbnVlOworCisJCXNlbnNvcl9ncm91cHNbdHlwZV0uYXR0cl9jb3VudCsrOworCisJCS8qCisJCSAqIGFkZCBhIG5ldyBhdHRyaWJ1dGUgZm9yIGxhYmVscworCQkgKi8KKwkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImxhYmVsIiwgJmxhYmVsKSkKKwkJCXNlbnNvcl9ncm91cHNbdHlwZV0uYXR0cl9jb3VudCsrOwogCX0KIAogCW9mX25vZGVfcHV0KG9wYWwpOwpAQCAtMjA3LDYgKzMyNCwyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBjcmVhdGVfaHdtb25fYXR0cihzdHJ1Y3Qgc2Vuc29yX2RhdGEgKnNkYXRhLCBjb25zdCBjaGFyICphdHRyX25hbWUsCisJCQkgICAgICBzc2l6ZV90ICgqc2hvdykoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICAgY2hhciAqYnVmKSkKK3sKKwlzbnByaW50ZihzZGF0YS0+bmFtZSwgTUFYX0FUVFJfTEVOLCAiJXMlZF8lcyIsCisJCSBzZW5zb3JfZ3JvdXBzW3NkYXRhLT50eXBlXS5uYW1lLCBzZGF0YS0+aHdtb25faW5kZXgsCisJCSBhdHRyX25hbWUpOworCisJc3lzZnNfYXR0cl9pbml0KCZzZGF0YS0+ZGV2X2F0dHIuYXR0cik7CisJc2RhdGEtPmRldl9hdHRyLmF0dHIubmFtZSA9IHNkYXRhLT5uYW1lOworCXNkYXRhLT5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCXNkYXRhLT5kZXZfYXR0ci5zaG93ID0gc2hvdzsKK30KKwogLyoKICAqIEl0ZXJhdGUgdGhyb3VnaCB0aGUgZGV2aWNlIHRyZWUgZm9yIGVhY2ggY2hpbGQgb2YgJ3NlbnNvcnMnIG5vZGUsIGNyZWF0ZQogICogYSBzeXNmcyBhdHRyaWJ1dGUgZmlsZSwgdGhlIGZpbGUgaXMgbmFtZWQgYnkgdHJhbnNsYXRpbmcgdGhlIERUIG5vZGUgbmFtZQpAQCAtMjMzLDE4ICszNjUsMjMgQEAKIAl9CiAKIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG9wYWwsIG5wKSB7CisJCWNvbnN0IGNoYXIgKmF0dHJfbmFtZTsKKwkJdTMyIG9wYWxfaW5kZXg7CisJCWNvbnN0IGNoYXIgKmxhYmVsOworCiAJCWlmIChucC0+bmFtZSA9PSBOVUxMKQogCQkJY29udGludWU7CiAKLQkJZm9yICh0eXBlID0gMDsgdHlwZSA8IE1BWF9TRU5TT1JfVFlQRTsgdHlwZSsrKQotCQkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLAotCQkJCQlzZW5zb3JfZ3JvdXBzW3R5cGVdLmNvbXBhdGlibGUpKQotCQkJCWJyZWFrOwotCisJCXR5cGUgPSBnZXRfc2Vuc29yX3R5cGUobnApOwogCQlpZiAodHlwZSA9PSBNQVhfU0VOU09SX1RZUEUpCiAJCQljb250aW51ZTsKIAotCQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJzZW5zb3ItaWQiLCAmc2Vuc29yX2lkKSkgeworCQkvKgorCQkgKiBOZXdlciBkZXZpY2UgdHJlZXMgdXNlIGEgInNlbnNvci1kYXRhIiBwcm9wZXJ0eQorCQkgKiBuYW1lIGZvciBpbnB1dC4KKwkJICovCisJCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInNlbnNvci1pZCIsICZzZW5zb3JfaWQpICYmCisJCSAgICBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInNlbnNvci1kYXRhIiwgJnNlbnNvcl9pZCkpIHsKIAkJCWRldl9pbmZvKCZwZGV2LT5kZXYsCiAJCQkJICInc2Vuc29yLWlkJyBtaXNzaW5nIGluIHRoZSBub2RlICclcydcbiIsCiAJCQkJIG5wLT5uYW1lKTsKQEAgLTI1MywxOCArMzkwLDQ2IEBACiAKIAkJc2RhdGFbY291bnRdLmlkID0gc2Vuc29yX2lkOwogCQlzZGF0YVtjb3VudF0udHlwZSA9IHR5cGU7Ci0JCWVyciA9IGNyZWF0ZV9od21vbl9hdHRyX25hbWUoJnBkZXYtPmRldiwgdHlwZSwgbnAtPm5hbWUsCi0JCQkJCSAgICAgc2RhdGFbY291bnRdLm5hbWUpOwotCQlpZiAoZXJyKQotCQkJZ290byBleGl0X3B1dF9ub2RlOwogCi0JCXN5c2ZzX2F0dHJfaW5pdCgmc2RhdGFbY291bnRdLmRldl9hdHRyLmF0dHIpOwotCQlzZGF0YVtjb3VudF0uZGV2X2F0dHIuYXR0ci5uYW1lID0gc2RhdGFbY291bnRdLm5hbWU7Ci0JCXNkYXRhW2NvdW50XS5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOwotCQlzZGF0YVtjb3VudF0uZGV2X2F0dHIuc2hvdyA9IHNob3dfc2Vuc29yOworCQkvKgorCQkgKiBJZiB3ZSBjYW4gbm90IHBhcnNlIHRoZSBub2RlIG5hbWUsIGl0IG1lYW5zIHdlIGFyZQorCQkgKiBydW5uaW5nIG9uIGEgbmV3ZXIgZGV2aWNlIHRyZWUuIFdlIGNhbiBqdXN0IGZvcmdldAorCQkgKiBhYm91dCB0aGUgT1BBTCBpbmRleCBhbmQgdXNlIGEgZGVmYXV0IHZhbHVlIGZvciB0aGUKKwkJICogaHdtb24gYXR0cmlidXRlIG5hbWUKKwkJICovCisJCWF0dHJfbmFtZSA9IHBhcnNlX29wYWxfbm9kZV9uYW1lKG5wLT5uYW1lLCB0eXBlLCAmb3BhbF9pbmRleCk7CisJCWlmIChJU19FUlIoYXR0cl9uYW1lKSkgeworCQkJYXR0cl9uYW1lID0gImlucHV0IjsKKwkJCW9wYWxfaW5kZXggPSBJTlZBTElEX0lOREVYOworCQl9CisKKwkJc2RhdGFbY291bnRdLm9wYWxfaW5kZXggPSBvcGFsX2luZGV4OworCQlzZGF0YVtjb3VudF0uaHdtb25faW5kZXggPQorCQkJZ2V0X3NlbnNvcl9od21vbl9pbmRleCgmc2RhdGFbY291bnRdLCBzZGF0YSwgY291bnQpOworCisJCWNyZWF0ZV9od21vbl9hdHRyKCZzZGF0YVtjb3VudF0sIGF0dHJfbmFtZSwgc2hvd19zZW5zb3IpOwogCiAJCXBncm91cHNbdHlwZV0tPmF0dHJzW3NlbnNvcl9ncm91cHNbdHlwZV0uYXR0cl9jb3VudCsrXSA9CiAJCQkJJnNkYXRhW2NvdW50KytdLmRldl9hdHRyLmF0dHI7CisKKwkJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImxhYmVsIiwgJmxhYmVsKSkgeworCQkJLyoKKwkJCSAqIEZvciB0aGUgbGFiZWwgYXR0cmlidXRlLCB3ZSBjYW4gcmV1c2UgdGhlCisJCQkgKiAicHJvcGVydGllcyIgb2YgdGhlIHByZXZpb3VzICJpbnB1dCIKKwkJCSAqIGF0dHJpYnV0ZS4gVGhleSBhcmUgcmVsYXRlZCB0byB0aGUgc2FtZQorCQkJICogc2Vuc29yLgorCQkJICovCisJCQlzZGF0YVtjb3VudF0udHlwZSA9IHR5cGU7CisJCQlzZGF0YVtjb3VudF0ub3BhbF9pbmRleCA9IHNkYXRhW2NvdW50IC0gMV0ub3BhbF9pbmRleDsKKwkJCXNkYXRhW2NvdW50XS5od21vbl9pbmRleCA9IHNkYXRhW2NvdW50IC0gMV0uaHdtb25faW5kZXg7CisKKwkJCW1ha2Vfc2Vuc29yX2xhYmVsKG5wLCAmc2RhdGFbY291bnRdLCBsYWJlbCk7CisKKwkJCWNyZWF0ZV9od21vbl9hdHRyKCZzZGF0YVtjb3VudF0sICJsYWJlbCIsIHNob3dfbGFiZWwpOworCisJCQlwZ3JvdXBzW3R5cGVdLT5hdHRyc1tzZW5zb3JfZ3JvdXBzW3R5cGVdLmF0dHJfY291bnQrK10gPQorCQkJCSZzZGF0YVtjb3VudCsrXS5kZXZfYXR0ci5hdHRyOworCQl9CiAJfQogCiBleGl0X3B1dF9ub2RlOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9pdDg3LmMgYi9kcml2ZXJzL2h3bW9uL2l0ODcuYwppbmRleCA0MDkxMTZjLi5kMGVlNTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2l0ODcuYworKysgYi9kcml2ZXJzL2h3bW9uL2l0ODcuYwpAQCAtMTEsNiArMTEsNyBAQAogICogIHNpbWlsYXIgcGFydHMuICBUaGUgb3RoZXIgZGV2aWNlcyBhcmUgc3VwcG9ydGVkIGJ5IGRpZmZlcmVudCBkcml2ZXJzLgogICoKICAqICBTdXBwb3J0czogSVQ4NjAzRSAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCisgKiAgICAgICAgICAgIElUODYyMEUgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICogICAgICAgICAgICBJVDg2MjNFICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UKICAqICAgICAgICAgICAgSVQ4NzA1RiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCiAgKiAgICAgICAgICAgIElUODcxMkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQpAQCAtMjMsOCArMjQsMTEgQEAKICAqICAgICAgICAgICAgSVQ4NzU4RSAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCiAgKiAgICAgICAgICAgIElUODc3MUUgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICogICAgICAgICAgICBJVDg3NzJFICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UKKyAqICAgICAgICAgICAgSVQ4NzgxRiAgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCiAgKiAgICAgICAgICAgIElUODc4MkYgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQogICogICAgICAgICAgICBJVDg3ODNFL0YgU3VwZXIgSS9PIGNoaXAgdy9MUEMgaW50ZXJmYWNlCisgKiAgICAgICAgICAgIElUODc4NkUgIFN1cGVyIEkvTyBjaGlwIHcvTFBDIGludGVyZmFjZQorICogICAgICAgICAgICBJVDg3OTBFICBTdXBlciBJL08gY2hpcCB3L0xQQyBpbnRlcmZhY2UKICAqICAgICAgICAgICAgU2lzOTUwICAgQSBjbG9uZSBvZiB0aGUgSVQ4NzA1RgogICoKICAqICBDb3B5cmlnaHQgKEMpIDIwMDEgQ2hyaXMgR2F1dGhyb24KQEAgLTY2LDcgKzcwLDcgQEAKICNkZWZpbmUgRFJWTkFNRSAiaXQ4NyIKIAogZW51bSBjaGlwcyB7IGl0ODcsIGl0ODcxMiwgaXQ4NzE2LCBpdDg3MTgsIGl0ODcyMCwgaXQ4NzIxLCBpdDg3MjgsIGl0ODc3MSwKLQkgICAgIGl0ODc3MiwgaXQ4NzgyLCBpdDg3ODMsIGl0ODYwMyB9OworCSAgICAgaXQ4NzcyLCBpdDg3ODEsIGl0ODc4MiwgaXQ4NzgzLCBpdDg3ODYsIGl0ODc5MCwgaXQ4NjAzLCBpdDg2MjAgfTsKIAogc3RhdGljIHVuc2lnbmVkIHNob3J0IGZvcmNlX2lkOwogbW9kdWxlX3BhcmFtKGZvcmNlX2lkLCB1c2hvcnQsIDApOwpAQCAtMTQ2LDE1ICsxNTAsMjAgQEAKICNkZWZpbmUgSVQ4NzI4Rl9ERVZJRCAweDg3MjgKICNkZWZpbmUgSVQ4NzcxRV9ERVZJRCAweDg3NzEKICNkZWZpbmUgSVQ4NzcyRV9ERVZJRCAweDg3NzIKKyNkZWZpbmUgSVQ4NzgxRl9ERVZJRCAweDg3ODEKICNkZWZpbmUgSVQ4NzgyRl9ERVZJRCAweDg3ODIKICNkZWZpbmUgSVQ4NzgzRV9ERVZJRCAweDg3ODMKKyNkZWZpbmUgSVQ4Nzg2RV9ERVZJRCAweDg3ODYKKyNkZWZpbmUgSVQ4NzkwRV9ERVZJRCAweDg3OTAKICNkZWZpbmUgSVQ4NjAzRV9ERVZJRCAweDg2MDMKKyNkZWZpbmUgSVQ4NjIwRV9ERVZJRCAweDg2MjAKICNkZWZpbmUgSVQ4NjIzRV9ERVZJRCAweDg2MjMKICNkZWZpbmUgSVQ4N19BQ1RfUkVHICAweDMwCiAjZGVmaW5lIElUODdfQkFTRV9SRUcgMHg2MAogCiAvKiBMb2dpY2FsIGRldmljZSA3IHJlZ2lzdGVycyAoSVQ4NzEyRiBhbmQgbGF0ZXIpICovCiAjZGVmaW5lIElUODdfU0lPX0dQSU8xX1JFRwkweDI1CisjZGVmaW5lIElUODdfU0lPX0dQSU8yX1JFRwkweDI2CiAjZGVmaW5lIElUODdfU0lPX0dQSU8zX1JFRwkweDI3CiAjZGVmaW5lIElUODdfU0lPX0dQSU81X1JFRwkweDI5CiAjZGVmaW5lIElUODdfU0lPX1BJTlgxX1JFRwkweDJhCS8qIFBpbiBzZWxlY3Rpb24gKi8KQEAgLTIwNywxMSArMjE2LDExIEBACiAKIC8qIE1vbml0b3JzOiA5IHZvbHRhZ2UgKDAgdG8gNywgYmF0dGVyeSksIDMgdGVtcCAoMSB0byAzKSwgMyBmYW4gKDEgdG8gMykgKi8KIAotc3RhdGljIGNvbnN0IHU4IElUODdfUkVHX0ZBTltdCQk9IHsgMHgwZCwgMHgwZSwgMHgwZiwgMHg4MCwgMHg4MiB9Owotc3RhdGljIGNvbnN0IHU4IElUODdfUkVHX0ZBTl9NSU5bXQk9IHsgMHgxMCwgMHgxMSwgMHgxMiwgMHg4NCwgMHg4NiB9Owotc3RhdGljIGNvbnN0IHU4IElUODdfUkVHX0ZBTlhbXQkJPSB7IDB4MTgsIDB4MTksIDB4MWEsIDB4ODEsIDB4ODMgfTsKLXN0YXRpYyBjb25zdCB1OCBJVDg3X1JFR19GQU5YX01JTltdCT0geyAweDFiLCAweDFjLCAweDFkLCAweDg1LCAweDg3IH07Ci1zdGF0aWMgY29uc3QgdTggSVQ4N19SRUdfVEVNUF9PRkZTRVRbXQk9IHsgMHg1NiwgMHg1NywgMHg1OSB9Oworc3RhdGljIGNvbnN0IHU4IElUODdfUkVHX0ZBTltdICAgICAgICAgPSB7IDB4MGQsIDB4MGUsIDB4MGYsIDB4ODAsIDB4ODIsIDB4NGMgfTsKK3N0YXRpYyBjb25zdCB1OCBJVDg3X1JFR19GQU5fTUlOW10gICAgID0geyAweDEwLCAweDExLCAweDEyLCAweDg0LCAweDg2LCAweDRlIH07CitzdGF0aWMgY29uc3QgdTggSVQ4N19SRUdfRkFOWFtdICAgICAgICA9IHsgMHgxOCwgMHgxOSwgMHgxYSwgMHg4MSwgMHg4MywgMHg0ZCB9Oworc3RhdGljIGNvbnN0IHU4IElUODdfUkVHX0ZBTlhfTUlOW10gICAgPSB7IDB4MWIsIDB4MWMsIDB4MWQsIDB4ODUsIDB4ODcsIDB4NGYgfTsKK3N0YXRpYyBjb25zdCB1OCBJVDg3X1JFR19URU1QX09GRlNFVFtdID0geyAweDU2LCAweDU3LCAweDU5IH07CiAKICNkZWZpbmUgSVQ4N19SRUdfRkFOX01BSU5fQ1RSTCAweDEzCiAjZGVmaW5lIElUODdfUkVHX0ZBTl9DVEwgICAgICAgMHgxNApAQCAtMjM4LDYgKzI0Nyw3IEBACiAKIHN0cnVjdCBpdDg3X2RldmljZXMgewogCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqIGNvbnN0IHN1ZmZpeDsKIAl1MTYgZmVhdHVyZXM7CiAJdTggcGVjaV9tYXNrOwogCXU4IG9sZF9wZWNpX21hc2s7CkBAIC0yNTAsNzkgKzI2MCwxMzEgQEAKICNkZWZpbmUgRkVBVF9URU1QX09GRlNFVAkoMSA8PCA0KQogI2RlZmluZSBGRUFUX1RFTVBfUEVDSQkJKDEgPDwgNSkKICNkZWZpbmUgRkVBVF9URU1QX09MRF9QRUNJCSgxIDw8IDYpCisjZGVmaW5lIEZFQVRfRkFOMTZfQ09ORklHCSgxIDw8IDcpCS8qIE5lZWQgdG8gZW5hYmxlIDE2LWJpdCBmYW5zICovCisjZGVmaW5lIEZFQVRfRklWRV9GQU5TCQkoMSA8PCA4KQkvKiBTdXBwb3J0cyBmaXZlIGZhbnMgKi8KKyNkZWZpbmUgRkVBVF9WSUQJCSgxIDw8IDkpCS8qIFNldCBpZiBjaGlwIHN1cHBvcnRzIFZJRCAqLworI2RlZmluZSBGRUFUX0lON19JTlRFUk5BTAkoMSA8PCAxMCkJLyogU2V0IGlmIGluNyBpcyBpbnRlcm5hbCAqLworI2RlZmluZSBGRUFUX1NJWF9GQU5TCQkoMSA8PCAxMSkJLyogU3VwcG9ydHMgc2l4IGZhbnMgKi8KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpdDg3X2RldmljZXMgaXQ4N19kZXZpY2VzW10gPSB7CiAJW2l0ODddID0gewogCQkubmFtZSA9ICJpdDg3IiwKKwkJLnN1ZmZpeCA9ICJGIiwKIAkJLmZlYXR1cmVzID0gRkVBVF9PTERfQVVUT1BXTSwJLyogbWF5IG5lZWQgdG8gb3ZlcndyaXRlICovCiAJfSwKIAlbaXQ4NzEyXSA9IHsKIAkJLm5hbWUgPSAiaXQ4NzEyIiwKLQkJLmZlYXR1cmVzID0gRkVBVF9PTERfQVVUT1BXTSwJLyogbWF5IG5lZWQgdG8gb3ZlcndyaXRlICovCisJCS5zdWZmaXggPSAiRiIsCisJCS5mZWF0dXJlcyA9IEZFQVRfT0xEX0FVVE9QV00gfCBGRUFUX1ZJRCwKKwkJCQkJCS8qIG1heSBuZWVkIHRvIG92ZXJ3cml0ZSAqLwogCX0sCiAJW2l0ODcxNl0gPSB7CiAJCS5uYW1lID0gIml0ODcxNiIsCi0JCS5mZWF0dXJlcyA9IEZFQVRfMTZCSVRfRkFOUyB8IEZFQVRfVEVNUF9PRkZTRVQsCisJCS5zdWZmaXggPSAiRiIsCisJCS5mZWF0dXJlcyA9IEZFQVRfMTZCSVRfRkFOUyB8IEZFQVRfVEVNUF9PRkZTRVQgfCBGRUFUX1ZJRAorCQkgIHwgRkVBVF9GQU4xNl9DT05GSUcgfCBGRUFUX0ZJVkVfRkFOUywKIAl9LAogCVtpdDg3MThdID0gewogCQkubmFtZSA9ICJpdDg3MTgiLAotCQkuZmVhdHVyZXMgPSBGRUFUXzE2QklUX0ZBTlMgfCBGRUFUX1RFTVBfT0ZGU0VUCi0JCSAgfCBGRUFUX1RFTVBfT0xEX1BFQ0ksCisJCS5zdWZmaXggPSAiRiIsCisJCS5mZWF0dXJlcyA9IEZFQVRfMTZCSVRfRkFOUyB8IEZFQVRfVEVNUF9PRkZTRVQgfCBGRUFUX1ZJRAorCQkgIHwgRkVBVF9URU1QX09MRF9QRUNJIHwgRkVBVF9GQU4xNl9DT05GSUcgfCBGRUFUX0ZJVkVfRkFOUywKIAkJLm9sZF9wZWNpX21hc2sgPSAweDQsCiAJfSwKIAlbaXQ4NzIwXSA9IHsKIAkJLm5hbWUgPSAiaXQ4NzIwIiwKLQkJLmZlYXR1cmVzID0gRkVBVF8xNkJJVF9GQU5TIHwgRkVBVF9URU1QX09GRlNFVAotCQkgIHwgRkVBVF9URU1QX09MRF9QRUNJLAorCQkuc3VmZml4ID0gIkYiLAorCQkuZmVhdHVyZXMgPSBGRUFUXzE2QklUX0ZBTlMgfCBGRUFUX1RFTVBfT0ZGU0VUIHwgRkVBVF9WSUQKKwkJICB8IEZFQVRfVEVNUF9PTERfUEVDSSB8IEZFQVRfRkFOMTZfQ09ORklHIHwgRkVBVF9GSVZFX0ZBTlMsCiAJCS5vbGRfcGVjaV9tYXNrID0gMHg0LAogCX0sCiAJW2l0ODcyMV0gPSB7CiAJCS5uYW1lID0gIml0ODcyMSIsCisJCS5zdWZmaXggPSAiRiIsCiAJCS5mZWF0dXJlcyA9IEZFQVRfTkVXRVJfQVVUT1BXTSB8IEZFQVRfMTJNVl9BREMgfCBGRUFUXzE2QklUX0ZBTlMKLQkJICB8IEZFQVRfVEVNUF9PRkZTRVQgfCBGRUFUX1RFTVBfT0xEX1BFQ0kgfCBGRUFUX1RFTVBfUEVDSSwKKwkJICB8IEZFQVRfVEVNUF9PRkZTRVQgfCBGRUFUX1RFTVBfT0xEX1BFQ0kgfCBGRUFUX1RFTVBfUEVDSQorCQkgIHwgRkVBVF9GQU4xNl9DT05GSUcgfCBGRUFUX0ZJVkVfRkFOUyB8IEZFQVRfSU43X0lOVEVSTkFMLAogCQkucGVjaV9tYXNrID0gMHgwNSwKIAkJLm9sZF9wZWNpX21hc2sgPSAweDAyLAkvKiBBY3R1YWxseSByZXBvcnRzIFBDSCAqLwogCX0sCiAJW2l0ODcyOF0gPSB7CiAJCS5uYW1lID0gIml0ODcyOCIsCisJCS5zdWZmaXggPSAiRiIsCiAJCS5mZWF0dXJlcyA9IEZFQVRfTkVXRVJfQVVUT1BXTSB8IEZFQVRfMTJNVl9BREMgfCBGRUFUXzE2QklUX0ZBTlMKLQkJICB8IEZFQVRfVEVNUF9PRkZTRVQgfCBGRUFUX1RFTVBfUEVDSSwKKwkJICB8IEZFQVRfVEVNUF9PRkZTRVQgfCBGRUFUX1RFTVBfUEVDSSB8IEZFQVRfRklWRV9GQU5TCisJCSAgfCBGRUFUX0lON19JTlRFUk5BTCwKIAkJLnBlY2lfbWFzayA9IDB4MDcsCiAJfSwKIAlbaXQ4NzcxXSA9IHsKIAkJLm5hbWUgPSAiaXQ4NzcxIiwKKwkJLnN1ZmZpeCA9ICJFIiwKIAkJLmZlYXR1cmVzID0gRkVBVF9ORVdFUl9BVVRPUFdNIHwgRkVBVF8xMk1WX0FEQyB8IEZFQVRfMTZCSVRfRkFOUwotCQkgIHwgRkVBVF9URU1QX09GRlNFVCB8IEZFQVRfVEVNUF9QRUNJLAotCQkJCQkvKiBQRUNJOiBndWVzc3dvcmsgKi8KLQkJCQkJLyogMTJtViBBREMgKE9ITSkgKi8KLQkJCQkJLyogMTYgYml0IGZhbnMgKE9ITSkgKi8KKwkJICB8IEZFQVRfVEVNUF9PRkZTRVQgfCBGRUFUX1RFTVBfUEVDSSB8IEZFQVRfSU43X0lOVEVSTkFMLAorCQkJCS8qIFBFQ0k6IGd1ZXNzd29yayAqLworCQkJCS8qIDEybVYgQURDIChPSE0pICovCisJCQkJLyogMTYgYml0IGZhbnMgKE9ITSkgKi8KKwkJCQkvKiB0aHJlZSBmYW5zLCBhbHdheXMgMTYgYml0IChndWVzc3dvcmspICovCiAJCS5wZWNpX21hc2sgPSAweDA3LAogCX0sCiAJW2l0ODc3Ml0gPSB7CiAJCS5uYW1lID0gIml0ODc3MiIsCisJCS5zdWZmaXggPSAiRSIsCiAJCS5mZWF0dXJlcyA9IEZFQVRfTkVXRVJfQVVUT1BXTSB8IEZFQVRfMTJNVl9BREMgfCBGRUFUXzE2QklUX0ZBTlMKLQkJICB8IEZFQVRfVEVNUF9PRkZTRVQgfCBGRUFUX1RFTVBfUEVDSSwKLQkJCQkJLyogUEVDSSAoY29yZWJvb3QpICovCi0JCQkJCS8qIDEybVYgQURDIChIV1NlbnNvcnM0LCBPSE0pICovCi0JCQkJCS8qIDE2IGJpdCBmYW5zIChIV1NlbnNvcnM0LCBPSE0pICovCisJCSAgfCBGRUFUX1RFTVBfT0ZGU0VUIHwgRkVBVF9URU1QX1BFQ0kgfCBGRUFUX0lON19JTlRFUk5BTCwKKwkJCQkvKiBQRUNJIChjb3JlYm9vdCkgKi8KKwkJCQkvKiAxMm1WIEFEQyAoSFdTZW5zb3JzNCwgT0hNKSAqLworCQkJCS8qIDE2IGJpdCBmYW5zIChIV1NlbnNvcnM0LCBPSE0pICovCisJCQkJLyogdGhyZWUgZmFucywgYWx3YXlzIDE2IGJpdCAoZGF0YXNoZWV0KSAqLwogCQkucGVjaV9tYXNrID0gMHgwNywKIAl9LAorCVtpdDg3ODFdID0geworCQkubmFtZSA9ICJpdDg3ODEiLAorCQkuc3VmZml4ID0gIkYiLAorCQkuZmVhdHVyZXMgPSBGRUFUXzE2QklUX0ZBTlMgfCBGRUFUX1RFTVBfT0ZGU0VUCisJCSAgfCBGRUFUX1RFTVBfT0xEX1BFQ0kgfCBGRUFUX0ZBTjE2X0NPTkZJRywKKwkJLm9sZF9wZWNpX21hc2sgPSAweDQsCisJfSwKIAlbaXQ4NzgyXSA9IHsKIAkJLm5hbWUgPSAiaXQ4NzgyIiwKKwkJLnN1ZmZpeCA9ICJGIiwKIAkJLmZlYXR1cmVzID0gRkVBVF8xNkJJVF9GQU5TIHwgRkVBVF9URU1QX09GRlNFVAotCQkgIHwgRkVBVF9URU1QX09MRF9QRUNJLAorCQkgIHwgRkVBVF9URU1QX09MRF9QRUNJIHwgRkVBVF9GQU4xNl9DT05GSUcsCiAJCS5vbGRfcGVjaV9tYXNrID0gMHg0LAogCX0sCiAJW2l0ODc4M10gPSB7CiAJCS5uYW1lID0gIml0ODc4MyIsCisJCS5zdWZmaXggPSAiRS9GIiwKIAkJLmZlYXR1cmVzID0gRkVBVF8xNkJJVF9GQU5TIHwgRkVBVF9URU1QX09GRlNFVAotCQkgIHwgRkVBVF9URU1QX09MRF9QRUNJLAorCQkgIHwgRkVBVF9URU1QX09MRF9QRUNJIHwgRkVBVF9GQU4xNl9DT05GSUcsCiAJCS5vbGRfcGVjaV9tYXNrID0gMHg0LAogCX0sCisJW2l0ODc4Nl0gPSB7CisJCS5uYW1lID0gIml0ODc4NiIsCisJCS5zdWZmaXggPSAiRSIsCisJCS5mZWF0dXJlcyA9IEZFQVRfTkVXRVJfQVVUT1BXTSB8IEZFQVRfMTJNVl9BREMgfCBGRUFUXzE2QklUX0ZBTlMKKwkJICB8IEZFQVRfVEVNUF9PRkZTRVQgfCBGRUFUX1RFTVBfUEVDSSB8IEZFQVRfSU43X0lOVEVSTkFMLAorCQkucGVjaV9tYXNrID0gMHgwNywKKwl9LAorCVtpdDg3OTBdID0geworCQkubmFtZSA9ICJpdDg3OTAiLAorCQkuc3VmZml4ID0gIkUiLAorCQkuZmVhdHVyZXMgPSBGRUFUX05FV0VSX0FVVE9QV00gfCBGRUFUXzEyTVZfQURDIHwgRkVBVF8xNkJJVF9GQU5TCisJCSAgfCBGRUFUX1RFTVBfT0ZGU0VUIHwgRkVBVF9URU1QX1BFQ0kgfCBGRUFUX0lON19JTlRFUk5BTCwKKwkJLnBlY2lfbWFzayA9IDB4MDcsCisJfSwKIAlbaXQ4NjAzXSA9IHsKIAkJLm5hbWUgPSAiaXQ4NjAzIiwKKwkJLnN1ZmZpeCA9ICJFIiwKIAkJLmZlYXR1cmVzID0gRkVBVF9ORVdFUl9BVVRPUFdNIHwgRkVBVF8xMk1WX0FEQyB8IEZFQVRfMTZCSVRfRkFOUwotCQkgIHwgRkVBVF9URU1QX09GRlNFVCB8IEZFQVRfVEVNUF9QRUNJLAorCQkgIHwgRkVBVF9URU1QX09GRlNFVCB8IEZFQVRfVEVNUF9QRUNJIHwgRkVBVF9JTjdfSU5URVJOQUwsCisJCS5wZWNpX21hc2sgPSAweDA3LAorCX0sCisJW2l0ODYyMF0gPSB7CisJCS5uYW1lID0gIml0ODYyMCIsCisJCS5zdWZmaXggPSAiRSIsCisJCS5mZWF0dXJlcyA9IEZFQVRfTkVXRVJfQVVUT1BXTSB8IEZFQVRfMTJNVl9BREMgfCBGRUFUXzE2QklUX0ZBTlMKKwkJICB8IEZFQVRfVEVNUF9PRkZTRVQgfCBGRUFUX1RFTVBfUEVDSSB8IEZFQVRfU0lYX0ZBTlMKKwkJICB8IEZFQVRfSU43X0lOVEVSTkFMLAogCQkucGVjaV9tYXNrID0gMHgwNywKIAl9LAogfTsKQEAgLTMzNyw2ICszOTksMTIgQEAKICNkZWZpbmUgaGFzX3RlbXBfb2xkX3BlY2koZGF0YSwgbnIpIFwKIAkJCQkoKChkYXRhKS0+ZmVhdHVyZXMgJiBGRUFUX1RFTVBfT0xEX1BFQ0kpICYmIFwKIAkJCQkgKChkYXRhKS0+b2xkX3BlY2lfbWFzayAmICgxIDw8IG5yKSkpCisjZGVmaW5lIGhhc19mYW4xNl9jb25maWcoZGF0YSkJKChkYXRhKS0+ZmVhdHVyZXMgJiBGRUFUX0ZBTjE2X0NPTkZJRykKKyNkZWZpbmUgaGFzX2ZpdmVfZmFucyhkYXRhKQkoKGRhdGEpLT5mZWF0dXJlcyAmIChGRUFUX0ZJVkVfRkFOUyB8IFwKKwkJCQkJCSAgICAgRkVBVF9TSVhfRkFOUykpCisjZGVmaW5lIGhhc192aWQoZGF0YSkJCSgoZGF0YSktPmZlYXR1cmVzICYgRkVBVF9WSUQpCisjZGVmaW5lIGhhc19pbjdfaW50ZXJuYWwoZGF0YSkJKChkYXRhKS0+ZmVhdHVyZXMgJiBGRUFUX0lON19JTlRFUk5BTCkKKyNkZWZpbmUgaGFzX3NpeF9mYW5zKGRhdGEpCSgoZGF0YSktPmZlYXR1cmVzICYgRkVBVF9TSVhfRkFOUykKIAogc3RydWN0IGl0ODdfc2lvX2RhdGEgewogCWVudW0gY2hpcHMgdHlwZTsKQEAgLTM3Myw3ICs0NDEsNyBAQAogCXUxNiBpbl9zY2FsZWQ7CQkvKiBJbnRlcm5hbCB2b2x0YWdlIHNlbnNvcnMgYXJlIHNjYWxlZCAqLwogCXU4IGluWzEwXVszXTsJCS8qIFtucl1bMF09aW4sIFsxXT1taW4sIFsyXT1tYXggKi8KIAl1OCBoYXNfZmFuOwkJLyogQml0ZmllbGQsIGZhbnMgZW5hYmxlZCAqLwotCXUxNiBmYW5bNV1bMl07CQkvKiBSZWdpc3RlciB2YWx1ZXMsIFtucl1bMF09ZmFuLCBbMV09bWluICovCisJdTE2IGZhbls2XVsyXTsJCS8qIFJlZ2lzdGVyIHZhbHVlcywgW25yXVswXT1mYW4sIFsxXT1taW4gKi8KIAl1OCBoYXNfdGVtcDsJCS8qIEJpdGZpZWxkLCB0ZW1wIHNlbnNvcnMgZW5hYmxlZCAqLwogCXM4IHRlbXBbM11bNF07CQkvKiBbbnJdWzBdPXRlbXAsIFsxXT1taW4sIFsyXT1tYXgsIFszXT1vZmZzZXQgKi8KIAl1OCBzZW5zb3I7CQkvKiBSZWdpc3RlciB2YWx1ZSAoSVQ4N19SRUdfVEVNUF9FTkFCTEUpICovCkBAIC00NzUsMTUgKzU0MywyNSBAQAogfQogI2RlZmluZSBESVZfRlJPTV9SRUcodmFsKSAoMSA8PCAodmFsKSkKIAorLyoKKyAqIFBXTSBiYXNlIGZyZXF1ZW5jaWVzLiBUaGUgZnJlcXVlbmN5IGhhcyB0byBiZSBkaXZpZGVkIGJ5IGVpdGhlciAxMjggb3IgMjU2LAorICogZGVwZW5kaW5nIG9uIHRoZSBjaGlwIHR5cGUsIHRvIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIFBXTSBmcmVxdWVuY3kuCisgKgorICogU29tZSBvZiB0aGUgY2hpcCBkYXRhc2hlZXRzIHN1Z2dlc3QgYSBiYXNlIGZyZXF1ZW5jeSBvZiA1MSBrSHogaW5zdGVhZAorICogb2YgNzUwIGtIeiBmb3IgdGhlIHNsb3dlc3QgYmFzZSBmcmVxdWVuY3ksIHJlc3VsdGluZyBpbiBhIFBXTSBmcmVxdWVuY3kKKyAqIG9mIDIwMCBIei4gU29tZXRpbWVzIGJvdGggUFdNIGZyZXF1ZW5jeSBzZWxlY3QgcmVnaXN0ZXJzIGFyZSBhZmZlY3RlZCwKKyAqIHNvbWV0aW1lcyBqdXN0IG9uZS4gSXQgaXMgdW5rbm93biBpZiB0aGlzIGlzIGEgZGF0YXNoZWV0IGVycm9yIG9yIHJlYWwsCisgKiBzbyB0aGlzIGlzIGlnbm9yZWQgZm9yIG5vdy4KKyAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fZnJlcVs4XSA9IHsKLQk0ODAwMDAwMCAvIDEyOCwKLQkyNDAwMDAwMCAvIDEyOCwKLQkxMjAwMDAwMCAvIDEyOCwKLQk4MDAwMDAwIC8gMTI4LAotCTYwMDAwMDAgLyAxMjgsCi0JMzAwMDAwMCAvIDEyOCwKLQkxNTAwMDAwIC8gMTI4LAotCTc1MDAwMCAvIDEyOCwKKwk0ODAwMDAwMCwKKwkyNDAwMDAwMCwKKwkxMjAwMDAwMCwKKwk4MDAwMDAwLAorCTYwMDAwMDAsCisJMzAwMDAwMCwKKwkxNTAwMDAwLAorCTc1MDAwMCwKIH07CiAKIHN0YXRpYyBpbnQgaXQ4N19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKQEAgLTgwMSw4ICs4NzksMTEgQEAKIHsKIAlzdHJ1Y3QgaXQ4N19kYXRhICpkYXRhID0gaXQ4N191cGRhdGVfZGV2aWNlKGRldik7CiAJaW50IGluZGV4ID0gKGRhdGEtPmZhbl9jdGwgPj4gNCkgJiAweDA3OworCXVuc2lnbmVkIGludCBmcmVxOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHB3bV9mcmVxW2luZGV4XSk7CisJZnJlcSA9IHB3bV9mcmVxW2luZGV4XSAvIChoYXNfbmV3ZXJfYXV0b3B3bShkYXRhKSA/IDI1NiA6IDEyOCk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZnJlcSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHNldF9mYW4oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKQEAgLTEwMjQsNiArMTEwNSw5IEBACiAJaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwl2YWwgPSBjbGFtcF92YWwodmFsLCAwLCAxMDAwMDAwKTsKKwl2YWwgKj0gaGFzX25ld2VyX2F1dG9wd20oZGF0YSkgPyAyNTYgOiAxMjg7CisKIAkvKiBTZWFyY2ggZm9yIHRoZSBuZWFyZXN0IGF2YWlsYWJsZSBmcmVxdWVuY3kgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAJCWlmICh2YWwgPiAocHdtX2ZyZXFbaV0gKyBwd21fZnJlcVtpKzFdKSAvIDIpCkBAIC0xMTk2LDYgKzEyODAsMTAgQEAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFJfMihmYW41X21pbiwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfZmFuLCBzZXRfZmFuLAogCQkJICAgIDQsIDEpOwogCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSXzIoZmFuNl9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDUsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUl8yKGZhbjZfbWluLCBTX0lSVUdPIHwgU19JV1VTUiwgc2hvd19mYW4sIHNldF9mYW4sCisJCQkgICAgNSwgMSk7CisKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMV9lbmFibGUsIFNfSVJVR08gfCBTX0lXVVNSLAogCQkJICBzaG93X3B3bV9lbmFibGUsIHNldF9wd21fZW5hYmxlLCAwKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIocHdtMSwgU19JUlVHTyB8IFNfSVdVU1IsIHNob3dfcHdtLCBzZXRfcHdtLCAwKTsKQEAgLTEzMjYsNiArMTQxNCw3IEBACiBzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjNfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDIpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW40X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAzKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjZfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDcpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTYpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTcpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTgpOwpAQCAtMTM3Niw2ICsxNDY1LDcgQEAKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuM19iZWVwLCBTX0lSVUdPLCBzaG93X2JlZXAsIHNldF9iZWVwLCAwKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNF9iZWVwLCBTX0lSVUdPLCBzaG93X2JlZXAsIHNldF9iZWVwLCAwKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNV9iZWVwLCBTX0lSVUdPLCBzaG93X2JlZXAsIHNldF9iZWVwLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNl9iZWVwLCBTX0lSVUdPLCBzaG93X2JlZXAsIHNldF9iZWVwLCAwKTsKIHN0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfYmVlcCwgU19JUlVHTyB8IFNfSVdVU1IsCiAJCQkgIHNob3dfYmVlcCwgc2V0X2JlZXAsIDIpOwogc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9iZWVwLCBTX0lSVUdPLCBzaG93X2JlZXAsIE5VTEwsIDIpOwpAQCAtMTU3OSw3ICsxNjY5LDcgQEAKIAkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX2JlZXAuZGV2X2F0dHIuYXR0ciwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppdDg3X2F0dHJpYnV0ZXNfZmFuWzVdWzMrMV0gPSB7IHsKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppdDg3X2F0dHJpYnV0ZXNfZmFuWzZdWzMrMV0gPSB7IHsKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbWluLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2FsYXJtLmRldl9hdHRyLmF0dHIsCkBAIC0xNjA0LDE0ICsxNjk0LDIwIEBACiAJJnNlbnNvcl9kZXZfYXR0cl9mYW41X21pbi5kZXZfYXR0ci5hdHRyLAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuNV9hbGFybS5kZXZfYXR0ci5hdHRyLAogCU5VTEwKK30sIHsKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjZfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW42X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJTlVMTAogfSB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBpdDg3X2dyb3VwX2Zhbls1XSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGl0ODdfZ3JvdXBfZmFuWzZdID0gewogCXsgLmF0dHJzID0gaXQ4N19hdHRyaWJ1dGVzX2ZhblswXSB9LAogCXsgLmF0dHJzID0gaXQ4N19hdHRyaWJ1dGVzX2ZhblsxXSB9LAogCXsgLmF0dHJzID0gaXQ4N19hdHRyaWJ1dGVzX2ZhblsyXSB9LAogCXsgLmF0dHJzID0gaXQ4N19hdHRyaWJ1dGVzX2ZhblszXSB9LAogCXsgLmF0dHJzID0gaXQ4N19hdHRyaWJ1dGVzX2Zhbls0XSB9LAorCXsgLmF0dHJzID0gaXQ4N19hdHRyaWJ1dGVzX2Zhbls1XSB9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGUgKml0ODdfYXR0cmlidXRlc19mYW5fZGl2W10gPSB7CkBAIC0xNjkzLDYgKzE3ODksNyBAQAogCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19iZWVwLmRldl9hdHRyLmF0dHIsCiAJJnNlbnNvcl9kZXZfYXR0cl9mYW40X2JlZXAuZGV2X2F0dHIuYXR0ciwKIAkmc2Vuc29yX2Rldl9hdHRyX2ZhbjVfYmVlcC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuNl9iZWVwLmRldl9hdHRyLmF0dHIsCiB9OwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXQ4N19hdHRyaWJ1dGVzX3ZpZFtdID0gewpAQCAtMTcyNCw2ICsxODIxLDcgQEAKIAlpbnQgZXJyOwogCXUxNiBjaGlwX3R5cGU7CiAJY29uc3QgY2hhciAqYm9hcmRfdmVuZG9yLCAqYm9hcmRfbmFtZTsKKwljb25zdCBzdHJ1Y3QgaXQ4N19kZXZpY2VzICpjb25maWc7CiAKIAllcnIgPSBzdXBlcmlvX2VudGVyKCk7CiAJaWYgKGVycikKQEAgLTE3NjEsMTYgKzE4NTksMjggQEAKIAljYXNlIElUODc3MkVfREVWSUQ6CiAJCXNpb19kYXRhLT50eXBlID0gaXQ4NzcyOwogCQlicmVhazsKKwljYXNlIElUODc4MUZfREVWSUQ6CisJCXNpb19kYXRhLT50eXBlID0gaXQ4NzgxOworCQlicmVhazsKIAljYXNlIElUODc4MkZfREVWSUQ6CiAJCXNpb19kYXRhLT50eXBlID0gaXQ4NzgyOwogCQlicmVhazsKIAljYXNlIElUODc4M0VfREVWSUQ6CiAJCXNpb19kYXRhLT50eXBlID0gaXQ4NzgzOwogCQlicmVhazsKKwljYXNlIElUODc4NkVfREVWSUQ6CisJCXNpb19kYXRhLT50eXBlID0gaXQ4Nzg2OworCQlicmVhazsKKwljYXNlIElUODc5MEVfREVWSUQ6CisJCXNpb19kYXRhLT50eXBlID0gaXQ4NzkwOworCQlicmVhazsKIAljYXNlIElUODYwM0VfREVWSUQ6CiAJY2FzZSBJVDg2MjNFX0RFVklEOgogCQlzaW9fZGF0YS0+dHlwZSA9IGl0ODYwMzsKIAkJYnJlYWs7CisJY2FzZSBJVDg2MjBFX0RFVklEOgorCQlzaW9fZGF0YS0+dHlwZSA9IGl0ODYyMDsKKwkJYnJlYWs7CiAJY2FzZSAweGZmZmY6CS8qIE5vIGRldmljZSBhdCBhbGwgKi8KIAkJZ290byBleGl0OwogCWRlZmF1bHQ6CkBAIC0xNzkyLDMwICsxOTAyLDM0IEBACiAKIAllcnIgPSAwOwogCXNpb19kYXRhLT5yZXZpc2lvbiA9IHN1cGVyaW9faW5iKERFVlJFVikgJiAweDBmOwotCXByX2luZm8oIkZvdW5kIElUJTA0eCVjIGNoaXAgYXQgMHgleCwgcmV2aXNpb24gJWRcbiIsIGNoaXBfdHlwZSwKLQkJY2hpcF90eXBlID09IDB4ODc3MSB8fCBjaGlwX3R5cGUgPT0gMHg4NzcyIHx8Ci0JCWNoaXBfdHlwZSA9PSAweDg2MDMgPyAnRScgOiAnRicsICphZGRyZXNzLAotCQlzaW9fZGF0YS0+cmV2aXNpb24pOworCXByX2luZm8oIkZvdW5kIElUJTA0eCVzIGNoaXAgYXQgMHgleCwgcmV2aXNpb24gJWRcbiIsIGNoaXBfdHlwZSwKKwkJaXQ4N19kZXZpY2VzW3Npb19kYXRhLT50eXBlXS5zdWZmaXgsCisJCSphZGRyZXNzLCBzaW9fZGF0YS0+cmV2aXNpb24pOworCisJY29uZmlnID0gJml0ODdfZGV2aWNlc1tzaW9fZGF0YS0+dHlwZV07CisKKwkvKiBpbjcgKFZTQiBvciBWQ0NINVYpIGlzIGFsd2F5cyBpbnRlcm5hbCBvbiBzb21lIGNoaXBzICovCisJaWYgKGhhc19pbjdfaW50ZXJuYWwoY29uZmlnKSkKKwkJc2lvX2RhdGEtPmludGVybmFsIHw9ICgxIDw8IDEpOwogCiAJLyogaW44IChWYmF0KSBpcyBhbHdheXMgaW50ZXJuYWwgKi8KLQlzaW9fZGF0YS0+aW50ZXJuYWwgPSAoMSA8PCAyKTsKKwlzaW9fZGF0YS0+aW50ZXJuYWwgfD0gKDEgPDwgMik7CisKIAkvKiBPbmx5IHRoZSBJVDg2MDNFIGhhcyBpbjkgKi8KIAlpZiAoc2lvX2RhdGEtPnR5cGUgIT0gaXQ4NjAzKQogCQlzaW9fZGF0YS0+c2tpcF9pbiB8PSAoMSA8PCA5KTsKIAotCS8qIFJlYWQgR1BJTyBjb25maWcgYW5kIFZJRCB2YWx1ZSBmcm9tIExETiA3IChHUElPKSAqLwotCWlmIChzaW9fZGF0YS0+dHlwZSA9PSBpdDg3KSB7Ci0JCS8qIFRoZSBJVDg3MDVGIGRvZXNuJ3QgaGF2ZSBWSUQgcGlucyBhdCBhbGwgKi8KKwlpZiAoIWhhc192aWQoY29uZmlnKSkKIAkJc2lvX2RhdGEtPnNraXBfdmlkID0gMTsKIAorCS8qIFJlYWQgR1BJTyBjb25maWcgYW5kIFZJRCB2YWx1ZSBmcm9tIExETiA3IChHUElPKSAqLworCWlmIChzaW9fZGF0YS0+dHlwZSA9PSBpdDg3KSB7CiAJCS8qIFRoZSBJVDg3MDVGIGhhcyBhIGRpZmZlcmVudCBMRCBudW1iZXIgZm9yIEdQSU8gKi8KIAkJc3VwZXJpb19zZWxlY3QoNSk7CiAJCXNpb19kYXRhLT5iZWVwX3BpbiA9IHN1cGVyaW9faW5iKElUODdfU0lPX0JFRVBfUElOX1JFRykgJiAweDNmOwogCX0gZWxzZSBpZiAoc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NzgzKSB7CiAJCWludCByZWcyNSwgcmVnMjcsIHJlZzJhLCByZWcyYywgcmVnZWY7CiAKLQkJc2lvX2RhdGEtPnNraXBfdmlkID0gMTsJLyogTm8gVklEICovCi0KIAkJc3VwZXJpb19zZWxlY3QoR1BJTyk7CiAKIAkJcmVnMjUgPSBzdXBlcmlvX2luYihJVDg3X1NJT19HUElPMV9SRUcpOwpAQCAtMTg4MSw3ICsxOTk1LDYgQEAKIAl9IGVsc2UgaWYgKHNpb19kYXRhLT50eXBlID09IGl0ODYwMykgewogCQlpbnQgcmVnMjcsIHJlZzI5OwogCi0JCXNpb19kYXRhLT5za2lwX3ZpZCA9IDE7CS8qIE5vIFZJRCAqLwogCQlzdXBlcmlvX3NlbGVjdChHUElPKTsKIAogCQlyZWcyNyA9IHN1cGVyaW9faW5iKElUODdfU0lPX0dQSU8zX1JFRyk7CkBAIC0xOTAyLDE0ICsyMDE1LDM2IEBACiAJCXNpb19kYXRhLT5za2lwX2luIHw9ICgxIDw8IDUpOyAvKiBObyBWSU41ICovCiAJCXNpb19kYXRhLT5za2lwX2luIHw9ICgxIDw8IDYpOyAvKiBObyBWSU42ICovCiAKLQkJLyogbm8gZmFuNCAqLwotCQlzaW9fZGF0YS0+c2tpcF9wd20gfD0gKDEgPDwgMyk7Ci0JCXNpb19kYXRhLT5za2lwX2ZhbiB8PSAoMSA8PCAzKTsKLQotCQlzaW9fZGF0YS0+aW50ZXJuYWwgfD0gKDEgPDwgMSk7IC8qIGluNyBpcyBWU0IgKi8KIAkJc2lvX2RhdGEtPmludGVybmFsIHw9ICgxIDw8IDMpOyAvKiBpbjkgaXMgQVZDQyAqLwogCiAJCXNpb19kYXRhLT5iZWVwX3BpbiA9IHN1cGVyaW9faW5iKElUODdfU0lPX0JFRVBfUElOX1JFRykgJiAweDNmOworCX0gZWxzZSBpZiAoc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NjIwKSB7CisJCWludCByZWc7CisKKwkJc3VwZXJpb19zZWxlY3QoR1BJTyk7CisKKwkJLyogQ2hlY2sgZm9yIGZhbjQsIGZhbjUgKi8KKwkJcmVnID0gc3VwZXJpb19pbmIoSVQ4N19TSU9fR1BJTzJfUkVHKTsKKwkJaWYgKCEocmVnICYgKDEgPDwgNSkpKQorCQkJc2lvX2RhdGEtPnNraXBfZmFuIHw9ICgxIDw8IDMpOworCQlpZiAoIShyZWcgJiAoMSA8PCA0KSkpCisJCQlzaW9fZGF0YS0+c2tpcF9mYW4gfD0gKDEgPDwgNCk7CisKKwkJLyogQ2hlY2sgZm9yIHB3bTMsIGZhbjMgKi8KKwkJcmVnID0gc3VwZXJpb19pbmIoSVQ4N19TSU9fR1BJTzNfUkVHKTsKKwkJaWYgKHJlZyAmICgxIDw8IDYpKQorCQkJc2lvX2RhdGEtPnNraXBfcHdtIHw9ICgxIDw8IDIpOworCQlpZiAocmVnICYgKDEgPDwgNykpCisJCQlzaW9fZGF0YS0+c2tpcF9mYW4gfD0gKDEgPDwgMik7CisKKwkJLyogQ2hlY2sgZm9yIHB3bTIsIGZhbjIgKi8KKwkJcmVnID0gc3VwZXJpb19pbmIoSVQ4N19TSU9fR1BJTzVfUkVHKTsKKwkJaWYgKHJlZyAmICgxIDw8IDEpKQorCQkJc2lvX2RhdGEtPnNraXBfcHdtIHw9ICgxIDw8IDEpOworCQlpZiAocmVnICYgKDEgPDwgMikpCisJCQlzaW9fZGF0YS0+c2tpcF9mYW4gfD0gKDEgPDwgMSk7CisKKwkJc2lvX2RhdGEtPmJlZXBfcGluID0gc3VwZXJpb19pbmIoSVQ4N19TSU9fQkVFUF9QSU5fUkVHKSAmIDB4M2Y7CiAJfSBlbHNlIHsKIAkJaW50IHJlZzsKIAkJYm9vbCB1YXJ0NjsKQEAgLTE5MTcsMTUgKzIwNTIsNyBAQAogCQlzdXBlcmlvX3NlbGVjdChHUElPKTsKIAogCQlyZWcgPSBzdXBlcmlvX2luYihJVDg3X1NJT19HUElPM19SRUcpOwotCQlpZiAoc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NzIxIHx8IHNpb19kYXRhLT50eXBlID09IGl0ODcyOCB8fAotCQkgICAgc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NzcxIHx8IHNpb19kYXRhLT50eXBlID09IGl0ODc3MiB8fAotCQkgICAgc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NzgyKSB7Ci0JCQkvKgotCQkJICogSVQ4NzIxRi9JVDg3NThFLCBhbmQgSVQ4NzgyRiBkb24ndCBoYXZlIFZJRCBwaW5zCi0JCQkgKiBhdCBhbGwsIG5vdCBzdXJlIGFib3V0IHRoZSBJVDg3MjhGIGFuZCBjb21wYXRpYmxlcy4KLQkJCSAqLwotCQkJc2lvX2RhdGEtPnNraXBfdmlkID0gMTsKLQkJfSBlbHNlIHsKKwkJaWYgKCFzaW9fZGF0YS0+c2tpcF92aWQpIHsKIAkJCS8qIFdlIG5lZWQgYXQgbGVhc3QgNCBWSUQgcGlucyAqLwogCQkJaWYgKHJlZyAmIDB4MGYpIHsKIAkJCQlwcl9pbmZvKCJWSUQgaXMgZGlzYWJsZWQgKHBpbnMgdXNlZCBmb3IgR1BJTylcbiIpOwpAQCAtMTk3NSwxMCArMjEwMiw3IEBACiAJCX0KIAkJaWYgKHJlZyAmICgxIDw8IDApKQogCQkJc2lvX2RhdGEtPmludGVybmFsIHw9ICgxIDw8IDApOwotCQlpZiAoKHJlZyAmICgxIDw8IDEpKSB8fCBzaW9fZGF0YS0+dHlwZSA9PSBpdDg3MjEgfHwKLQkJICAgIHNpb19kYXRhLT50eXBlID09IGl0ODcyOCB8fAotCQkgICAgc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NzcxIHx8Ci0JCSAgICBzaW9fZGF0YS0+dHlwZSA9PSBpdDg3NzIpCisJCWlmIChyZWcgJiAoMSA8PCAxKSkKIAkJCXNpb19kYXRhLT5pbnRlcm5hbCB8PSAoMSA8PCAxKTsKIAogCQkvKgpAQCAtMjA1MCw3ICsyMTc0LDcgQEAKIAkJCXN5c2ZzX3JlbW92ZV9maWxlKCZkZXYtPmtvYmosCiAJCQkJCSAgaXQ4N19hdHRyaWJ1dGVzX3RlbXBfYmVlcFtpXSk7CiAJfQotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAJCWlmICghKGRhdGEtPmhhc19mYW4gJiAoMSA8PCBpKSkpCiAJCQljb250aW51ZTsKIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXYtPmtvYmosICZpdDg3X2dyb3VwX2ZhbltpXSk7CkBAIC0yMDYyLDcgKzIxODYsNyBAQAogCQkJCQkgIGl0ODdfYXR0cmlidXRlc19mYW5fZGl2W2ldKTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQlpZiAoc2lvX2RhdGEtPnNraXBfcHdtICYgKDEgPDwgMCkpCisJCWlmIChzaW9fZGF0YS0+c2tpcF9wd20gJiAoMSA8PCBpKSkKIAkJCWNvbnRpbnVlOwogCQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldi0+a29iaiwgJml0ODdfZ3JvdXBfcHdtW2ldKTsKIAkJaWYgKGhhc19vbGRfYXV0b3B3bShkYXRhKSkKQEAgLTIxMTIsMTMgKzIyMzYsMTQgQEAKIAljYXNlIGl0ODc6CiAJCWlmIChzaW9fZGF0YS0+cmV2aXNpb24gPj0gMHgwMykgewogCQkJZGF0YS0+ZmVhdHVyZXMgJj0gfkZFQVRfT0xEX0FVVE9QV007Ci0JCQlkYXRhLT5mZWF0dXJlcyB8PSBGRUFUXzE2QklUX0ZBTlM7CisJCQlkYXRhLT5mZWF0dXJlcyB8PSBGRUFUX0ZBTjE2X0NPTkZJRyB8IEZFQVRfMTZCSVRfRkFOUzsKIAkJfQogCQlicmVhazsKIAljYXNlIGl0ODcxMjoKIAkJaWYgKHNpb19kYXRhLT5yZXZpc2lvbiA+PSAweDA4KSB7CiAJCQlkYXRhLT5mZWF0dXJlcyAmPSB+RkVBVF9PTERfQVVUT1BXTTsKLQkJCWRhdGEtPmZlYXR1cmVzIHw9IEZFQVRfMTZCSVRfRkFOUzsKKwkJCWRhdGEtPmZlYXR1cmVzIHw9IEZFQVRfRkFOMTZfQ09ORklHIHwgRkVBVF8xNkJJVF9GQU5TIHwKKwkJCQkJICBGRUFUX0ZJVkVfRkFOUzsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjE0Nyw3ICsyMjcyLDggQEAKIAkJCWRhdGEtPmluX3NjYWxlZCB8PSAoMSA8PCA4KTsJLyogaW44IGlzIFZiYXQgKi8KIAkJaWYgKHNpb19kYXRhLT5pbnRlcm5hbCAmICgxIDw8IDMpKQogCQkJZGF0YS0+aW5fc2NhbGVkIHw9ICgxIDw8IDkpOwkvKiBpbjkgaXMgQVZDQyAqLwotCX0gZWxzZSBpZiAoc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NzgyIHx8IHNpb19kYXRhLT50eXBlID09IGl0ODc4MykgeworCX0gZWxzZSBpZiAoc2lvX2RhdGEtPnR5cGUgPT0gaXQ4NzgxIHx8IHNpb19kYXRhLT50eXBlID09IGl0ODc4MiB8fAorCQkgICBzaW9fZGF0YS0+dHlwZSA9PSBpdDg3ODMpIHsKIAkJaWYgKHNpb19kYXRhLT5pbnRlcm5hbCAmICgxIDw8IDApKQogCQkJZGF0YS0+aW5fc2NhbGVkIHw9ICgxIDw8IDMpOwkvKiBpbjMgaXMgVkNDNVYgKi8KIAkJaWYgKHNpb19kYXRhLT5pbnRlcm5hbCAmICgxIDw8IDEpKQpAQCAtMjIwNSw3ICsyMzMxLDcgQEAKIAogCS8qIERvIG5vdCBjcmVhdGUgZmFuIGZpbGVzIGZvciBkaXNhYmxlZCBmYW5zICovCiAJZmFuX2JlZXBfbmVlZF9ydyA9IDE7Ci0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKIAkJaWYgKCEoZGF0YS0+aGFzX2ZhbiAmICgxIDw8IGkpKSkKIAkJCWNvbnRpbnVlOwogCQllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJml0ODdfZ3JvdXBfZmFuW2ldKTsKQEAgLTI0NTAsMjQgKzI1NzYsMjYgQEAKIAl9CiAJZGF0YS0+aGFzX2ZhbiA9IChkYXRhLT5mYW5fbWFpbl9jdHJsID4+IDQpICYgMHgwNzsKIAotCS8qIFNldCB0YWNob21ldGVycyB0byAxNi1iaXQgbW9kZSBpZiBuZWVkZWQsIElUODYwM0UgKGFuZCBJVDg3MjhGPykKLQkgKiBoYXMgaXQgYnkgZGVmYXVsdCAqLwotCWlmIChoYXNfMTZiaXRfZmFucyhkYXRhKSAmJiBkYXRhLT50eXBlICE9IGl0ODYwMykgewotCQl0bXAgPSBpdDg3X3JlYWRfdmFsdWUoZGF0YSwgSVQ4N19SRUdfRkFOXzE2QklUKTsKKwl0bXAgPSBpdDg3X3JlYWRfdmFsdWUoZGF0YSwgSVQ4N19SRUdfRkFOXzE2QklUKTsKKworCS8qIFNldCB0YWNob21ldGVycyB0byAxNi1iaXQgbW9kZSBpZiBuZWVkZWQgKi8KKwlpZiAoaGFzX2ZhbjE2X2NvbmZpZyhkYXRhKSkgewogCQlpZiAofnRtcCAmIDB4MDcgJiBkYXRhLT5oYXNfZmFuKSB7CiAJCQlkZXZfZGJnKCZwZGV2LT5kZXYsCiAJCQkJIlNldHRpbmcgZmFuMS0zIHRvIDE2LWJpdCBtb2RlXG4iKTsKIAkJCWl0ODdfd3JpdGVfdmFsdWUoZGF0YSwgSVQ4N19SRUdfRkFOXzE2QklULAogCQkJCQkgdG1wIHwgMHgwNyk7CiAJCX0KLQkJLyogSVQ4NzA1RiwgSVQ4NzgyRiwgYW5kIElUODc4M0UvRiBvbmx5IHN1cHBvcnQgdGhyZWUgZmFucy4gKi8KLQkJaWYgKGRhdGEtPnR5cGUgIT0gaXQ4NyAmJiBkYXRhLT50eXBlICE9IGl0ODc4MiAmJgotCQkgICAgZGF0YS0+dHlwZSAhPSBpdDg3ODMpIHsKLQkJCWlmICh0bXAgJiAoMSA8PCA0KSkKLQkJCQlkYXRhLT5oYXNfZmFuIHw9ICgxIDw8IDMpOyAvKiBmYW40IGVuYWJsZWQgKi8KLQkJCWlmICh0bXAgJiAoMSA8PCA1KSkKLQkJCQlkYXRhLT5oYXNfZmFuIHw9ICgxIDw8IDQpOyAvKiBmYW41IGVuYWJsZWQgKi8KLQkJfQorCX0KKworCS8qIENoZWNrIGZvciBhZGRpdGlvbmFsIGZhbnMgKi8KKwlpZiAoaGFzX2ZpdmVfZmFucyhkYXRhKSkgeworCQlpZiAodG1wICYgKDEgPDwgNCkpCisJCQlkYXRhLT5oYXNfZmFuIHw9ICgxIDw8IDMpOyAvKiBmYW40IGVuYWJsZWQgKi8KKwkJaWYgKHRtcCAmICgxIDw8IDUpKQorCQkJZGF0YS0+aGFzX2ZhbiB8PSAoMSA8PCA0KTsgLyogZmFuNSBlbmFibGVkICovCisJCWlmIChoYXNfc2l4X2ZhbnMoZGF0YSkgJiYgKHRtcCAmICgxIDw8IDIpKSkKKwkJCWRhdGEtPmhhc19mYW4gfD0gKDEgPDwgNSk7IC8qIGZhbjYgZW5hYmxlZCAqLwogCX0KIAogCS8qIEZhbiBpbnB1dCBwaW5zIG1heSBiZSB1c2VkIGZvciBhbHRlcm5hdGl2ZSBmdW5jdGlvbnMgKi8KQEAgLTI1MzUsNyArMjY2Myw3IEBACiAJCWlmIChkYXRhLT50eXBlID09IGl0ODYwMykKIAkJCWRhdGEtPmluWzldWzBdID0gaXQ4N19yZWFkX3ZhbHVlKGRhdGEsIDB4MmYpOwogCi0JCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogCQkJLyogU2tpcCBkaXNhYmxlZCBmYW5zICovCiAJCQlpZiAoIShkYXRhLT5oYXNfZmFuICYgKDEgPDwgaSkpKQogCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9qYzQyLmMgYi9kcml2ZXJzL2h3bW9uL2pjNDIuYwppbmRleCA5OTZiZGZkLi45ODg3ZDMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2pjNDIuYworKysgYi9kcml2ZXJzL2h3bW9uL2pjNDIuYwpAQCAtODcsMTEgKzg3LDE0IEBACiAjZGVmaW5lIEFUMzBUU0UwMDRfREVWSURfTUFTSwkweGZmZmYKIAogLyogSURUICovCi0jZGVmaW5lIFRTMzAwMEIzX0RFVklECQkweDI5MDMgIC8qIEFsc28gbWF0Y2hlcyBUU0UyMDAyQjMgKi8KLSNkZWZpbmUgVFMzMDAwQjNfREVWSURfTUFTSwkweGZmZmYKKyNkZWZpbmUgVFNFMjAwNF9ERVZJRAkJMHgyMjAwCisjZGVmaW5lIFRTRTIwMDRfREVWSURfTUFTSwkweGZmMDAKIAotI2RlZmluZSBUUzMwMDBHQjJfREVWSUQJCTB4MjkxMiAgLyogQWxzbyBtYXRjaGVzIFRTRTIwMDJHQjIgKi8KLSNkZWZpbmUgVFMzMDAwR0IyX0RFVklEX01BU0sJMHhmZmZmCisjZGVmaW5lIFRTMzAwMF9ERVZJRAkJMHgyOTAwICAvKiBBbHNvIG1hdGNoZXMgVFNFMjAwMiAqLworI2RlZmluZSBUUzMwMDBfREVWSURfTUFTSwkweGZmMDAKKworI2RlZmluZSBUUzMwMDFfREVWSUQJCTB4MzAwMAorI2RlZmluZSBUUzMwMDFfREVWSURfTUFTSwkweGZmMDAKIAogLyogTWF4aW0gKi8KICNkZWZpbmUgTUFYNjYwNF9ERVZJRAkJMHgzZTAwCkBAIC0xNTIsOCArMTU1LDkgQEAKIAl7IEFEVF9NQU5JRCwgQURUNzQwOF9ERVZJRCwgQURUNzQwOF9ERVZJRF9NQVNLIH0sCiAJeyBBVE1FTF9NQU5JRCwgQVQzMFRTMDBfREVWSUQsIEFUMzBUUzAwX0RFVklEX01BU0sgfSwKIAl7IEFUTUVMX01BTklEMiwgQVQzMFRTRTAwNF9ERVZJRCwgQVQzMFRTRTAwNF9ERVZJRF9NQVNLIH0sCi0JeyBJRFRfTUFOSUQsIFRTMzAwMEIzX0RFVklELCBUUzMwMDBCM19ERVZJRF9NQVNLIH0sCi0JeyBJRFRfTUFOSUQsIFRTMzAwMEdCMl9ERVZJRCwgVFMzMDAwR0IyX0RFVklEX01BU0sgfSwKKwl7IElEVF9NQU5JRCwgVFNFMjAwNF9ERVZJRCwgVFNFMjAwNF9ERVZJRF9NQVNLIH0sCisJeyBJRFRfTUFOSUQsIFRTMzAwMF9ERVZJRCwgVFMzMDAwX0RFVklEX01BU0sgfSwKKwl7IElEVF9NQU5JRCwgVFMzMDAxX0RFVklELCBUUzMwMDFfREVWSURfTUFTSyB9LAogCXsgTUFYX01BTklELCBNQVg2NjA0X0RFVklELCBNQVg2NjA0X0RFVklEX01BU0sgfSwKIAl7IE1DUF9NQU5JRCwgTUNQOTgwNF9ERVZJRCwgTUNQOTgwNF9ERVZJRF9NQVNLIH0sCiAJeyBNQ1BfTUFOSUQsIE1DUDk4MjQyX0RFVklELCBNQ1A5ODI0Ml9ERVZJRF9NQVNLIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL25jdDY3NzUuYyBiL2RyaXZlcnMvaHdtb24vbmN0Njc3NS5jCmluZGV4IDFiZTQxMTcuLjRmY2I0ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbmN0Njc3NS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbmN0Njc3NS5jCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlICJsbTc1LmgiCiAKQEAgLTg4MCwxMiArODgxLDEyIEBACiAJdTE2IGhhdmVfdGVtcDsKIAl1MTYgaGF2ZV90ZW1wX2ZpeGVkOwogCXUxNiBoYXZlX2luOwotI2lmZGVmIENPTkZJR19QTQorCiAJLyogUmVtZW1iZXIgZXh0cmEgcmVnaXN0ZXIgdmFsdWVzIG92ZXIgc3VzcGVuZC9yZXN1bWUgKi8KIAl1OCB2YmF0OwogCXU4IGZhbmRpdjE7CiAJdTggZmFuZGl2MjsKLSNlbmRpZgorCXU4IHNpb19yZWdfZW5hYmxlOwogfTsKIAogc3RydWN0IG5jdDY3NzVfc2lvX2RhdGEgewpAQCAtMzE3OCw2ICszMTc5LDEwIEBACiAJaW50IHNpb3JlZyA9IGRhdGEtPnNpb3JlZzsKIAlpbnQgcmVndmFsOwogCisJLyogU3RvcmUgU0lPX1JFR19FTkFCTEUgZm9yIHVzZSBkdXJpbmcgcmVzdW1lICovCisJc3VwZXJpb19zZWxlY3Qoc2lvcmVnLCBOQ1Q2Nzc1X0xEX0hXTSk7CisJZGF0YS0+c2lvX3JlZ19lbmFibGUgPSBzdXBlcmlvX2luYihzaW9yZWcsIFNJT19SRUdfRU5BQkxFKTsKKwogCS8qIGZhbjQgYW5kIGZhbjUgc2hhcmUgc29tZSBwaW5zIHdpdGggdGhlIEdQSU8gYW5kIHNlcmlhbCBmbGFzaCAqLwogCWlmIChkYXRhLT5raW5kID09IG5jdDY3NzUpIHsKIAkJcmVndmFsID0gc3VwZXJpb19pbmIoc2lvcmVnLCAweDJjKTsKQEAgLTMxOTUsMjEgKzMyMDAsMzggQEAKIAkJcHdtNnBpbiA9IGZhbHNlOwogCX0gZWxzZSBpZiAoZGF0YS0+a2luZCA9PSBuY3Q2Nzc2KSB7CiAJCWJvb2wgZ3BvayA9IHN1cGVyaW9faW5iKHNpb3JlZywgMHgyNykgJiAweDgwOworCQljb25zdCBjaGFyICpib2FyZF92ZW5kb3IsICpib2FyZF9uYW1lOwogCi0JCXN1cGVyaW9fc2VsZWN0KHNpb3JlZywgTkNUNjc3NV9MRF9IV00pOwotCQlyZWd2YWwgPSBzdXBlcmlvX2luYihzaW9yZWcsIFNJT19SRUdfRU5BQkxFKTsKKwkJYm9hcmRfdmVuZG9yID0gZG1pX2dldF9zeXN0ZW1faW5mbyhETUlfQk9BUkRfVkVORE9SKTsKKwkJYm9hcmRfbmFtZSA9IGRtaV9nZXRfc3lzdGVtX2luZm8oRE1JX0JPQVJEX05BTUUpOwogCi0JCWlmIChyZWd2YWwgJiAweDgwKQorCQlpZiAoYm9hcmRfbmFtZSAmJiBib2FyZF92ZW5kb3IgJiYKKwkJICAgICFzdHJjbXAoYm9hcmRfdmVuZG9yLCAiQVNSb2NrIikpIHsKKwkJCS8qCisJCQkgKiBBdXhpbGlhcnkgZmFuIG1vbml0b3JpbmcgaXMgbm90IGVuYWJsZWQgb24gQVNSb2NrCisJCQkgKiBaNzcgUHJvNC1NIGlmIGJvb3RlZCBpbiBVRUZJIFVsdHJhLUZhc3RCb290IG1vZGUuCisJCQkgKiBPYnNlcnZlZCB3aXRoIEJJT1MgdmVyc2lvbiAyLjAwLgorCQkJICovCisJCQlpZiAoIXN0cmNtcChib2FyZF9uYW1lLCAiWjc3IFBybzQtTSIpKSB7CisJCQkJaWYgKChkYXRhLT5zaW9fcmVnX2VuYWJsZSAmIDB4ZTApICE9IDB4ZTApIHsKKwkJCQkJZGF0YS0+c2lvX3JlZ19lbmFibGUgfD0gMHhlMDsKKwkJCQkJc3VwZXJpb19vdXRiKHNpb3JlZywgU0lPX1JFR19FTkFCTEUsCisJCQkJCQkgICAgIGRhdGEtPnNpb19yZWdfZW5hYmxlKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZGF0YS0+c2lvX3JlZ19lbmFibGUgJiAweDgwKQogCQkJZmFuM3BpbiA9IGdwb2s7CiAJCWVsc2UKIAkJCWZhbjNwaW4gPSAhKHN1cGVyaW9faW5iKHNpb3JlZywgMHgyNCkgJiAweDQwKTsKIAotCQlpZiAocmVndmFsICYgMHg0MCkKKwkJaWYgKGRhdGEtPnNpb19yZWdfZW5hYmxlICYgMHg0MCkKIAkJCWZhbjRwaW4gPSBncG9rOwogCQllbHNlCiAJCQlmYW40cGluID0gc3VwZXJpb19pbmIoc2lvcmVnLCAweDFDKSAmIDB4MDE7CiAKLQkJaWYgKHJlZ3ZhbCAmIDB4MjApCisJCWlmIChkYXRhLT5zaW9fcmVnX2VuYWJsZSAmIDB4MjApCiAJCQlmYW41cGluID0gZ3BvazsKIAkJZWxzZQogCQkJZmFuNXBpbiA9IHN1cGVyaW9faW5iKHNpb3JlZywgMHgxQykgJiAweDAyOwpAQCAtMzk4OSw4ICs0MDExLDcgQEAKIAl9CiB9CiAKLSNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgbmN0Njc3NV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbmN0Njc3NV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbmN0Njc3NV9kYXRhICpkYXRhID0gbmN0Njc3NV91cGRhdGVfZGV2aWNlKGRldik7CiAKQEAgLTQwMDUsMjIgKzQwMjYsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBuY3Q2Nzc1X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIG5jdDY3NzVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbmN0Njc3NV9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHNpb3JlZyA9IGRhdGEtPnNpb3JlZzsKIAlpbnQgaSwgaiwgZXJyID0gMDsKKwl1OCByZWc7CiAKIAltdXRleF9sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CiAJZGF0YS0+YmFuayA9IDB4ZmY7CQkvKiBGb3JjZSBpbml0aWFsIGJhbmsgc2VsZWN0aW9uICovCiAKLQlpZiAoZGF0YS0+a2luZCA9PSBuY3Q2NzkxIHx8IGRhdGEtPmtpbmQgPT0gbmN0Njc5MikgewotCQllcnIgPSBzdXBlcmlvX2VudGVyKGRhdGEtPnNpb3JlZyk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGFib3J0OworCWVyciA9IHN1cGVyaW9fZW50ZXIoc2lvcmVnKTsKKwlpZiAoZXJyKQorCQlnb3RvIGFib3J0OwogCi0JCW5jdDY3OTFfZW5hYmxlX2lvX21hcHBpbmcoZGF0YS0+c2lvcmVnKTsKLQkJc3VwZXJpb19leGl0KGRhdGEtPnNpb3JlZyk7Ci0JfQorCXN1cGVyaW9fc2VsZWN0KHNpb3JlZywgTkNUNjc3NV9MRF9IV00pOworCXJlZyA9IHN1cGVyaW9faW5iKHNpb3JlZywgU0lPX1JFR19FTkFCTEUpOworCWlmIChyZWcgIT0gZGF0YS0+c2lvX3JlZ19lbmFibGUpCisJCXN1cGVyaW9fb3V0YihzaW9yZWcsIFNJT19SRUdfRU5BQkxFLCBkYXRhLT5zaW9fcmVnX2VuYWJsZSk7CisKKwlpZiAoZGF0YS0+a2luZCA9PSBuY3Q2NzkxIHx8IGRhdGEtPmtpbmQgPT0gbmN0Njc5MikKKwkJbmN0Njc5MV9lbmFibGVfaW9fbWFwcGluZyhzaW9yZWcpOworCisJc3VwZXJpb19leGl0KHNpb3JlZyk7CiAKIAkvKiBSZXN0b3JlIGxpbWl0cyAqLwogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5pbl9udW07IGkrKykgewpAQCAtNDA2NiwyMiArNDA5NCwxMiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBuY3Q2Nzc1X2Rldl9wbV9vcHMgPSB7Ci0JLnN1c3BlbmQgPSBuY3Q2Nzc1X3N1c3BlbmQsCi0JLnJlc3VtZSA9IG5jdDY3NzVfcmVzdW1lLAotCS5mcmVlemUgPSBuY3Q2Nzc1X3N1c3BlbmQsCi0JLnJlc3RvcmUgPSBuY3Q2Nzc1X3Jlc3VtZSwKLX07Ci0KLSNkZWZpbmUgTkNUNjc3NV9ERVZfUE1fT1BTCSgmbmN0Njc3NV9kZXZfcG1fb3BzKQotI2Vsc2UKLSNkZWZpbmUgTkNUNjc3NV9ERVZfUE1fT1BTCU5VTEwKLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhuY3Q2Nzc1X2Rldl9wbV9vcHMsIG5jdDY3NzVfc3VzcGVuZCwgbmN0Njc3NV9yZXN1bWUpOwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBuY3Q2Nzc1X2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQk9IERSVk5BTUUsCi0JCS5wbQk9IE5DVDY3NzVfREVWX1BNX09QUywKKwkJLnBtCT0gJm5jdDY3NzVfZGV2X3BtX29wcywKIAl9LAogCS5wcm9iZQkJPSBuY3Q2Nzc1X3Byb2JlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbmN0NzkwNC5jIGIvZHJpdmVycy9od21vbi9uY3Q3OTA0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc3YjgyZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vbmN0NzkwNC5jCkBAIC0wLDAgKzEsNTkzIEBACisvKgorICogbmN0NzkwNC5jIC0gZHJpdmVyIGZvciBOdXZvdG9uIE5DVDc5MDRELgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBLb250cm9uCisgKiBBdXRob3I6IFZhZGltIFYuIFZsYXNvdiA8dnZsYXNvdkBkZXYucnRzb2Z0LnJ1PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24uaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi1zeXNmcy5oPgorCisjZGVmaW5lIFZFTkRPUl9JRF9SRUcJCTB4N0EJLyogQW55IGJhbmsgKi8KKyNkZWZpbmUgTlVWT1RPTl9JRAkJMHg1MAorI2RlZmluZSBDSElQX0lEX1JFRwkJMHg3QgkvKiBBbnkgYmFuayAqLworI2RlZmluZSBOQ1Q3OTA0X0lECQkweEM1CisjZGVmaW5lIERFVklDRV9JRF9SRUcJCTB4N0MJLyogQW55IGJhbmsgKi8KKworI2RlZmluZSBCQU5LX1NFTF9SRUcJCTB4RkYKKyNkZWZpbmUgQkFOS18wCQkJMHgwMAorI2RlZmluZSBCQU5LXzEJCQkweDAxCisjZGVmaW5lIEJBTktfMgkJCTB4MDIKKyNkZWZpbmUgQkFOS18zCQkJMHgwMworI2RlZmluZSBCQU5LXzQJCQkweDA0CisjZGVmaW5lIEJBTktfTUFYCQkweDA0CisKKyNkZWZpbmUgRkFOSU5fTUFYCQkxMgkvKiBDb3VudGVkIGZyb20gMSAqLworI2RlZmluZSBWU0VOX01BWAkJMjEJLyogVlNFTjEuLjE0LCAzVkRELCBWQkFULCBWM1ZTQiwKKwkJCQkJICAgTFREIChub3QgYSB2b2x0YWdlKSwgVlNFTjE3Li4xOSAqLworI2RlZmluZSBGQU5DVExfTUFYCQk0CS8qIENvdW50ZWQgZnJvbSAxICovCisjZGVmaW5lIFRDUFVfTUFYCQk4CS8qIENvdW50ZWQgZnJvbSAxICovCisjZGVmaW5lIFRFTVBfTUFYCQk0CS8qIENvdW50ZWQgZnJvbSAxICovCisKKyNkZWZpbmUgVlRfQURDX0NUUkwwX1JFRwkweDIwCS8qIEJhbmsgMCAqLworI2RlZmluZSBWVF9BRENfQ1RSTDFfUkVHCTB4MjEJLyogQmFuayAwICovCisjZGVmaW5lIFZUX0FEQ19DVFJMMl9SRUcJMHgyMgkvKiBCYW5rIDAgKi8KKyNkZWZpbmUgRkFOSU5fQ1RSTDBfUkVHCQkweDI0CisjZGVmaW5lIEZBTklOX0NUUkwxX1JFRwkJMHgyNQorI2RlZmluZSBEVFNfVF9DVFJMMF9SRUcJCTB4MjYKKyNkZWZpbmUgRFRTX1RfQ1RSTDFfUkVHCQkweDI3CisjZGVmaW5lIFZUX0FEQ19NRF9SRUcJCTB4MkUKKworI2RlZmluZSBWU0VOMV9IVl9SRUcJCTB4NDAJLyogQmFuayAwOyAyIHJlZ3MgKEhWL0xWKSBwZXIgc2Vuc29yICovCisjZGVmaW5lIFRFTVBfQ0gxX0hWX1JFRwkJMHg0MgkvKiBCYW5rIDA7IHNhbWUgYXMgVlNFTjJfSFYgKi8KKyNkZWZpbmUgTFREX0hWX1JFRwkJMHg2MgkvKiBCYW5rIDA7IDIgcmVncyBpbiBWU0VOIHJhbmdlICovCisjZGVmaW5lIEZBTklOMV9IVl9SRUcJCTB4ODAJLyogQmFuayAwOyAyIHJlZ3MgKEhWL0xWKSBwZXIgc2Vuc29yICovCisjZGVmaW5lIFRfQ1BVMV9IVl9SRUcJCTB4QTAJLyogQmFuayAwOyAyIHJlZ3MgKEhWL0xWKSBwZXIgc2Vuc29yICovCisKKyNkZWZpbmUgUFJUU19SRUcJCTB4MDMJLyogQmFuayAyICovCisjZGVmaW5lIEZBTkNUTDFfRk1SX1JFRwkJMHgwMAkvKiBCYW5rIDM7IDEgcmVnIHBlciBjaGFubmVsICovCisjZGVmaW5lIEZBTkNUTDFfT1VUX1JFRwkJMHgxMAkvKiBCYW5rIDM7IDEgcmVnIHBlciBjaGFubmVsICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7CisJMHgyZCwgMHgyZSwgSTJDX0NMSUVOVF9FTkQKK307CisKK3N0cnVjdCBuY3Q3OTA0X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IG11dGV4IGJhbmtfbG9jazsKKwlpbnQgYmFua19zZWw7CisJdTMyIGZhbmluX21hc2s7CisJdTMyIHZzZW5fbWFzazsKKwl1MzIgdGNwdV9tYXNrOworCXU4IGZhbl9tb2RlW0ZBTkNUTF9NQVhdOworfTsKKworLyogQWNjZXNzIGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBuY3Q3OTA0X2JhbmtfbG9jayhzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhLCB1bnNpZ25lZCBiYW5rKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5iYW5rX2xvY2spOworCWlmIChkYXRhLT5iYW5rX3NlbCA9PSBiYW5rKQorCQlyZXR1cm4gMDsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgQkFOS19TRUxfUkVHLCBiYW5rKTsKKwlpZiAocmV0ID09IDApCisJCWRhdGEtPmJhbmtfc2VsID0gYmFuazsKKwllbHNlCisJCWRhdGEtPmJhbmtfc2VsID0gLTE7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5jdDc5MDRfYmFua19yZWxlYXNlKHN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEpCit7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5iYW5rX2xvY2spOworfQorCisvKiBSZWFkIDEtYnl0ZSByZWdpc3Rlci4gUmV0dXJucyB1bnNpZ25lZCByZWcgb3IgLUVSUk5PIG9uIGVycm9yLiAqLworc3RhdGljIGludCBuY3Q3OTA0X3JlYWRfcmVnKHN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEsCisJCQkgICAgdW5zaWduZWQgYmFuaywgdW5zaWduZWQgcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IHJldDsKKworCXJldCA9IG5jdDc5MDRfYmFua19sb2NrKGRhdGEsIGJhbmspOworCWlmIChyZXQgPT0gMCkKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKworCW5jdDc5MDRfYmFua19yZWxlYXNlKGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWFkIDItYnl0ZSByZWdpc3Rlci4gUmV0dXJucyByZWdpc3RlciBpbiBiaWctZW5kaWFuIGZvcm1hdCBvcgorICogLUVSUk5PIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IG5jdDc5MDRfcmVhZF9yZWcxNihzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhLAorCQkJICAgICAgdW5zaWduZWQgYmFuaywgdW5zaWduZWQgcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBkYXRhLT5jbGllbnQ7CisJaW50IHJldCwgaGk7CisKKwlyZXQgPSBuY3Q3OTA0X2JhbmtfbG9jayhkYXRhLCBiYW5rKTsKKwlpZiAocmV0ID09IDApIHsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcmVnKTsKKwkJaWYgKHJldCA+PSAwKSB7CisJCQloaSA9IHJldDsKKwkJCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHJlZyArIDEpOworCQkJaWYgKHJldCA+PSAwKQorCQkJCXJldCB8PSBoaSA8PCA4OworCQl9CisJfQorCisJbmN0NzkwNF9iYW5rX3JlbGVhc2UoZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworLyogV3JpdGUgMS1ieXRlIHJlZ2lzdGVyLiBSZXR1cm5zIDAgb3IgLUVSUk5PIG9uIGVycm9yLiAqLworc3RhdGljIGludCBuY3Q3OTA0X3dyaXRlX3JlZyhzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhLAorCQkJICAgICB1bnNpZ25lZCBiYW5rLCB1bnNpZ25lZCByZWcsIHU4IHZhbCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCWludCByZXQ7CisKKwlyZXQgPSBuY3Q3OTA0X2JhbmtfbG9jayhkYXRhLCBiYW5rKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCByZWcsIHZhbCk7CisKKwluY3Q3OTA0X2JhbmtfcmVsZWFzZShkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBGQU5JTiBBVFRSICovCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisJdW5zaWduZWQgY250LCBycG07CisKKwlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnMTYoZGF0YSwgQkFOS18wLCBGQU5JTjFfSFZfUkVHICsgaW5kZXggKiAyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwljbnQgPSAoKHJldCAmIDB4ZmYwMCkgPj4gMykgfCAocmV0ICYgMHgxZik7CisJaWYgKGNudCA9PSAweDFmZmYpCisJCXJwbSA9IDA7CisJZWxzZQorCQlycG0gPSAxMzUwMDAwIC8gY250OworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBycG0pOworfQorCitzdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X2ZhbmluX2lzX3Zpc2libGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCXN0cnVjdCBhdHRyaWJ1dGUgKmEsIGludCBuKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoZGF0YS0+ZmFuaW5fbWFzayAmICgxIDw8IG4pKQorCQlyZXR1cm4gYS0+bW9kZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuM19pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW40X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjVfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCA0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNl9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW43X2lucHV0LCBTX0lSVUdPLCBzaG93X2ZhbiwgTlVMTCwgNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjhfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCA3KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuOV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMF9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDkpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xMV9pbnB1dCwgU19JUlVHTywgc2hvd19mYW4sIE5VTEwsIDEwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMTJfaW5wdXQsIFNfSVJVR08sIHNob3dfZmFuLCBOVUxMLCAxMSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpuY3Q3OTA0X2ZhbmluX2F0dHJzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4zX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW40X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW41X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW42X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW43X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW44X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW45X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9mYW4xMF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMTFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjEyX2lucHV0LmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbmN0NzkwNF9mYW5pbl9ncm91cCA9IHsKKwkuYXR0cnMgPSBuY3Q3OTA0X2ZhbmluX2F0dHJzLAorCS5pc192aXNpYmxlID0gbmN0NzkwNF9mYW5pbl9pc192aXNpYmxlLAorfTsKKworLyogVlNFTiBBVFRSICovCitzdGF0aWMgc3NpemVfdCBzaG93X3ZvbHRhZ2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKwlpbnQgdm9sdDsKKworCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsIFZTRU4xX0hWX1JFRyArIGluZGV4ICogMik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJdm9sdCA9ICgocmV0ICYgMHhmZjAwKSA+PiA1KSB8IChyZXQgJiAweDcpOworCWlmIChpbmRleCA8IDE0KQorCQl2b2x0ICo9IDI7IC8qIDAuMDAyViBzY2FsZSAqLworCWVsc2UKKwkJdm9sdCAqPSA2OyAvKiAwLjAwNlYgc2NhbGUgKi8KKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2b2x0KTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19sdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisJaW50IHRlbXA7CisKKwlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnMTYoZGF0YSwgQkFOS18wLCBMVERfSFZfUkVHKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwl0ZW1wID0gKChyZXQgJiAweGZmMDApID4+IDUpIHwgKHJldCAmIDB4Nyk7CisJdGVtcCA9IHNpZ25fZXh0ZW5kMzIodGVtcCwgMTApICogMTI1OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOworfQorCitzdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X3ZzZW5faXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYSwgaW50IG4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChkYXRhLT52c2VuX21hc2sgJiAoMSA8PCBuKSkKKwkJcmV0dXJuIGEtPm1vZGU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjJfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluM19pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW40X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjVfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluNl9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW43X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDYpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjhfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgNyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluOV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCA4KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMF9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCA5KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xMV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTJfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjEzX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDEyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xNF9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxMyk7CisvKgorICogTmV4dCAzIHZvbHRhZ2Ugc2Vuc29ycyBoYXZlIHNwZWNpZmljIG5hbWVzIGluIHRoZSBOdXZvdG9uIGRvYworICogKDNWREQsIFZCQVQsIDNWU0IpIGJ1dCB3ZSB1c2UgdmFjYW50IG51bWJlcnMgZm9yIHRoZW0uCisgKi8KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xNV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAxNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTZfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTUpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjIwX2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDE2KTsKKy8qIFRoaXMgaXMgbm90IGEgdm9sdGFnZSwgYnV0IGEgbG9jYWwgdGVtcGVyYXR1cmUgc2Vuc29yLiAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd19sdGVtcCwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGluMTdfaW5wdXQsIFNfSVJVR08sIHNob3dfdm9sdGFnZSwgTlVMTCwgMTgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihpbjE4X2lucHV0LCBTX0lSVUdPLCBzaG93X3ZvbHRhZ2UsIE5VTEwsIDE5KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoaW4xOV9pbnB1dCwgU19JUlVHTywgc2hvd192b2x0YWdlLCBOVUxMLCAyMCk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpuY3Q3OTA0X3ZzZW5fYXR0cnNbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX2luMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW4yX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW41X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luN19pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfaW44X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTJfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTRfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTVfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMTZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2luMjBfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjE3X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjE4X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl9pbjE5X2lucHV0LmRldl9hdHRyLmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbmN0NzkwNF92c2VuX2dyb3VwID0geworCS5hdHRycyA9IG5jdDc5MDRfdnNlbl9hdHRycywKKwkuaXNfdmlzaWJsZSA9IG5jdDc5MDRfdnNlbl9pc192aXNpYmxlLAorfTsKKworLyogQ1BVX1RFTVAgQVRUUiAqLworc3RhdGljIHNzaXplX3Qgc2hvd190Y3B1KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisJaW50IHRlbXA7CisKKwlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnMTYoZGF0YSwgQkFOS18wLCBUX0NQVTFfSFZfUkVHICsgaW5kZXggKiAyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXRlbXAgPSAoKHJldCAmIDB4ZmYwMCkgPj4gNSkgfCAocmV0ICYgMHg3KTsKKwl0ZW1wID0gc2lnbl9leHRlbmQzMih0ZW1wLCAxMCkgKiAxMjU7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHRlbXApOworfQorCitzdGF0aWMgdW1vZGVfdCBuY3Q3OTA0X3RjcHVfaXNfdmlzaWJsZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQkgICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYSwgaW50IG4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBkZXZpY2UsIGtvYmopOworCXN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChkYXRhLT50Y3B1X21hc2sgJiAoMSA8PCBuKSkKKwkJcmV0dXJuIGEtPm1vZGU7CisJcmV0dXJuIDA7Cit9CisKKy8qICJ0ZW1wMV9pbnB1dCIgcmVzZXJ2ZWQgZm9yIGxvY2FsIHRlbXAgKi8KK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2lucHV0LCBTX0lSVUdPLCBzaG93X3RjcHUsIE5VTEwsIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9pbnB1dCwgU19JUlVHTywgc2hvd190Y3B1LCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA2X2lucHV0LCBTX0lSVUdPLCBzaG93X3RjcHUsIE5VTEwsIDQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wN19pbnB1dCwgU19JUlVHTywgc2hvd190Y3B1LCBOVUxMLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDhfaW5wdXQsIFNfSVJVR08sIHNob3dfdGNwdSwgTlVMTCwgNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA5X2lucHV0LCBTX0lSVUdPLCBzaG93X3RjcHUsIE5VTEwsIDcpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbmN0NzkwNF90Y3B1X2F0dHJzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDZfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA3X2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wOF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDlfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBuY3Q3OTA0X3RjcHVfZ3JvdXAgPSB7CisJLmF0dHJzID0gbmN0NzkwNF90Y3B1X2F0dHJzLAorCS5pc192aXNpYmxlID0gbmN0NzkwNF90Y3B1X2lzX3Zpc2libGUsCit9OworCisvKiBQV00gQVRUUiAqLworc3RhdGljIHNzaXplX3Qgc3RvcmVfcHdtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCWlmIChrc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmICh2YWwgPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gbmN0NzkwNF93cml0ZV9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX09VVF9SRUcgKyBpbmRleCwgdmFsKTsKKworCXJldHVybiByZXQgPyByZXQgOiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCXN0cnVjdCBuY3Q3OTA0X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgdmFsOworCisJdmFsID0gbmN0NzkwNF9yZWFkX3JlZyhkYXRhLCBCQU5LXzMsIEZBTkNUTDFfT1VUX1JFRyArIGluZGV4KTsKKwlpZiAodmFsIDwgMCkKKwkJcmV0dXJuIHZhbDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBzdG9yZV9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlpZiAoa3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodmFsID4gMSB8fCAodmFsICYmICFkYXRhLT5mYW5fbW9kZVtpbmRleF0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IG5jdDc5MDRfd3JpdGVfcmVnKGRhdGEsIEJBTktfMywgRkFOQ1RMMV9GTVJfUkVHICsgaW5kZXgsCisJCQkJdmFsID8gZGF0YS0+ZmFuX21vZGVbaW5kZXhdIDogMCk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7Cit9CisKKy8qIFJldHVybiAwIGZvciBtYW51YWwgbW9kZSBvciAxIGZvciBTbWFydEZhbiBtb2RlICovCitzdGF0aWMgc3NpemVfdCBzaG93X21vZGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgbmN0NzkwNF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHZhbDsKKworCXZhbCA9IG5jdDc5MDRfcmVhZF9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX0ZNUl9SRUcgKyBpbmRleCk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiB2YWw7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsID8gMSA6IDApOworfQorCisvKiAyIGF0dHJpYnV0ZXMgcGVyIGNoYW5uZWw6IHB3bSBhbmQgbW9kZSAqLworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4xX3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X3B3bSwgc3RvcmVfcHdtLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuMV9tb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCXNob3dfbW9kZSwgc3RvcmVfbW9kZSwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjJfcHdtLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCXNob3dfcHdtLCBzdG9yZV9wd20sIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW4yX21vZGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJc2hvd19tb2RlLCBzdG9yZV9tb2RlLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuM19wd20sIFNfSVJVR08gfCBTX0lXVVNSLAorCQkJc2hvd19wd20sIHN0b3JlX3B3bSwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKGZhbjNfbW9kZSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X21vZGUsIHN0b3JlX21vZGUsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUihmYW40X3B3bSwgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlzaG93X3B3bSwgc3RvcmVfcHdtLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIoZmFuNF9tb2RlLCBTX0lSVUdPIHwgU19JV1VTUiwKKwkJCXNob3dfbW9kZSwgc3RvcmVfbW9kZSwgMyk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpuY3Q3OTA0X2ZhbmN0bF9hdHRyc1tdID0geworCSZzZW5zb3JfZGV2X2F0dHJfZmFuMV9wd20uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjFfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuMl9wd20uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjJfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuM19wd20uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjNfbW9kZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfZmFuNF9wd20uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX2ZhbjRfbW9kZS5kZXZfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG5jdDc5MDRfZmFuY3RsX2dyb3VwID0geworCS5hdHRycyA9IG5jdDc5MDRfZmFuY3RsX2F0dHJzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKm5jdDc5MDRfZ3JvdXBzW10gPSB7CisJJm5jdDc5MDRfZmFuaW5fZ3JvdXAsCisJJm5jdDc5MDRfdnNlbl9ncm91cCwKKwkmbmN0NzkwNF90Y3B1X2dyb3VwLAorCSZuY3Q3OTA0X2ZhbmN0bF9ncm91cCwKKwlOVUxMCit9OworCisvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgbmN0NzkwNF9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoYWRhcHRlciwKKwkJCQkgICAgIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURSB8CisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIERldGVybWluZSB0aGUgY2hpcCB0eXBlLiAqLworCWlmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBWRU5ET1JfSURfUkVHKSAhPSBOVVZPVE9OX0lEIHx8CisJICAgIGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIENISVBfSURfUkVHKSAhPSBOQ1Q3OTA0X0lEIHx8CisJICAgIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBERVZJQ0VfSURfUkVHKSAmIDB4ZjApICE9IDB4NTAgfHwKKwkgICAgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIEJBTktfU0VMX1JFRykgJiAweGY4KSAhPSAweDAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN0cmxjcHkoaW5mby0+dHlwZSwgIm5jdDc5MDQiLCBJMkNfTkFNRV9TSVpFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5jdDc5MDRfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG5jdDc5MDRfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCWludCByZXQsIGk7CisJdTMyIG1hc2s7CisKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBuY3Q3OTA0X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJZGF0YS0+Y2xpZW50ID0gY2xpZW50OworCW11dGV4X2luaXQoJmRhdGEtPmJhbmtfbG9jayk7CisJZGF0YS0+YmFua19zZWwgPSAtMTsKKworCS8qIFNldHVwIHNlbnNvciBncm91cHMuICovCisJLyogRkFOSU4gYXR0cmlidXRlcyAqLworCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcxNihkYXRhLCBCQU5LXzAsIEZBTklOX0NUUkwwX1JFRyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJZGF0YS0+ZmFuaW5fbWFzayA9IChyZXQgPj4gOCkgfCAoKHJldCAmIDB4ZmYpIDw8IDgpOworCisJLyoKKwkgKiBWU0VOIGF0dHJpYnV0ZXMKKwkgKgorCSAqIE5vdGU6IHZvbHRhZ2Ugc2Vuc29ycyBvdmVybGFwIHdpdGggZXh0ZXJuYWwgdGVtcGVyYXR1cmUKKwkgKiBzZW5zb3JzLiBTbywgaWYgd2UgZXZlciBkZWNpZGUgdG8gc3VwcG9ydCB0aGUgbGF0dGVyCisJICogd2Ugd2lsbCBoYXZlIHRvIGFkanVzdCAndnNlbl9tYXNrJyBhY2NvcmRpbmdseS4KKwkgKi8KKwltYXNrID0gMDsKKwlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnMTYoZGF0YSwgQkFOS18wLCBWVF9BRENfQ1RSTDBfUkVHKTsKKwlpZiAocmV0ID49IDApCisJCW1hc2sgPSAocmV0ID4+IDgpIHwgKChyZXQgJiAweGZmKSA8PCA4KTsKKwlyZXQgPSBuY3Q3OTA0X3JlYWRfcmVnKGRhdGEsIEJBTktfMCwgVlRfQURDX0NUUkwyX1JFRyk7CisJaWYgKHJldCA+PSAwKQorCQltYXNrIHw9IChyZXQgPDwgMTYpOworCWRhdGEtPnZzZW5fbWFzayA9IG1hc2s7CisKKwkvKiBDUFVfVEVNUCBhdHRyaWJ1dGVzICovCisJcmV0ID0gbmN0NzkwNF9yZWFkX3JlZzE2KGRhdGEsIEJBTktfMCwgRFRTX1RfQ1RSTDBfUkVHKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlkYXRhLT50Y3B1X21hc2sgPSAoKHJldCA+PiA4KSAmIDB4ZikgfCAoKHJldCAmIDB4ZikgPDwgNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRkFOQ1RMX01BWDsgaSsrKSB7CisJCXJldCA9IG5jdDc5MDRfcmVhZF9yZWcoZGF0YSwgQkFOS18zLCBGQU5DVEwxX0ZNUl9SRUcgKyBpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlkYXRhLT5mYW5fbW9kZVtpXSA9IHJldDsKKwl9CisKKwlod21vbl9kZXYgPQorCQlkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcyhkZXYsIGNsaWVudC0+bmFtZSwgZGF0YSwKKwkJCQkJCSAgICAgICBuY3Q3OTA0X2dyb3Vwcyk7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhod21vbl9kZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbmN0NzkwNF9pZFtdID0geworCXsibmN0NzkwNCIsIDB9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbmN0NzkwNF9kcml2ZXIgPSB7CisJLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm5jdDc5MDQiLAorCX0sCisJLnByb2JlID0gbmN0NzkwNF9wcm9iZSwKKwkuaWRfdGFibGUgPSBuY3Q3OTA0X2lkLAorCS5kZXRlY3QgPSBuY3Q3OTA0X2RldGVjdCwKKwkuYWRkcmVzc19saXN0ID0gbm9ybWFsX2kyYywKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKG5jdDc5MDRfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiVmFkaW0gVi4gVmxhc292IDx2dmxhc292QGRldi5ydHNvZnQucnU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkh3bW9uIGRyaXZlciBmb3IgTlVWT1RPTiBOQ1Q3OTA0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3B3bS1mYW4uYyBiL2RyaXZlcnMvaHdtb24vcHdtLWZhbi5jCmluZGV4IDE5OTFkOTAzLi4yZDlhNzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3B3bS1mYW4uYworKysgYi9kcml2ZXJzL2h3bW9uL3B3bS1mYW4uYwpAQCAtMjQsNTUgKzI0LDc4IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcHdtLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90aGVybWFsLmg+CiAKICNkZWZpbmUgTUFYX1BXTSAyNTUKIAogc3RydWN0IHB3bV9mYW5fY3R4IHsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlzdHJ1Y3QgcHdtX2RldmljZSAqcHdtOwotCXVuc2lnbmVkIGNoYXIgcHdtX3ZhbHVlOworCXVuc2lnbmVkIGludCBwd21fdmFsdWU7CisJdW5zaWduZWQgaW50IHB3bV9mYW5fc3RhdGU7CisJdW5zaWduZWQgaW50IHB3bV9mYW5fbWF4X3N0YXRlOworCXVuc2lnbmVkIGludCAqcHdtX2Zhbl9jb29saW5nX2xldmVsczsKKwlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldjsKIH07CiAKLXN0YXRpYyBzc2l6ZV90IHNldF9wd20oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorc3RhdGljIGludCAgX19zZXRfcHdtKHN0cnVjdCBwd21fZmFuX2N0eCAqY3R4LCB1bnNpZ25lZCBsb25nIHB3bSkKIHsKLQlzdHJ1Y3QgcHdtX2Zhbl9jdHggKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXVuc2lnbmVkIGxvbmcgcHdtLCBkdXR5OwotCXNzaXplX3QgcmV0OwotCi0JaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZwd20pIHx8IHB3bSA+IE1BWF9QV00pCi0JCXJldHVybiAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgZHV0eTsKKwlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJmN0eC0+bG9jayk7Ci0KIAlpZiAoY3R4LT5wd21fdmFsdWUgPT0gcHdtKQotCQlnb3RvIGV4aXRfc2V0X3B3bV9ub19jaGFuZ2U7Ci0KLQlpZiAocHdtID09IDApIHsKLQkJcHdtX2Rpc2FibGUoY3R4LT5wd20pOwotCQlnb3RvIGV4aXRfc2V0X3B3bTsKLQl9CisJCWdvdG8gZXhpdF9zZXRfcHdtX2VycjsKIAogCWR1dHkgPSBESVZfUk9VTkRfVVAocHdtICogKGN0eC0+cHdtLT5wZXJpb2QgLSAxKSwgTUFYX1BXTSk7CiAJcmV0ID0gcHdtX2NvbmZpZyhjdHgtPnB3bSwgZHV0eSwgY3R4LT5wd20tPnBlcmlvZCk7CiAJaWYgKHJldCkKIAkJZ290byBleGl0X3NldF9wd21fZXJyOwogCisJaWYgKHB3bSA9PSAwKQorCQlwd21fZGlzYWJsZShjdHgtPnB3bSk7CisKIAlpZiAoY3R4LT5wd21fdmFsdWUgPT0gMCkgewogCQlyZXQgPSBwd21fZW5hYmxlKGN0eC0+cHdtKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXhpdF9zZXRfcHdtX2VycjsKIAl9CiAKLWV4aXRfc2V0X3B3bToKIAljdHgtPnB3bV92YWx1ZSA9IHB3bTsKLWV4aXRfc2V0X3B3bV9ub19jaGFuZ2U6Ci0JcmV0ID0gY291bnQ7CiBleGl0X3NldF9wd21fZXJyOgogCW11dGV4X3VubG9jaygmY3R4LT5sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBwd21fZmFuX3VwZGF0ZV9zdGF0ZShzdHJ1Y3QgcHdtX2Zhbl9jdHggKmN0eCwgdW5zaWduZWQgbG9uZyBwd20pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3R4LT5wd21fZmFuX21heF9zdGF0ZTsgKytpKQorCQlpZiAocHdtIDwgY3R4LT5wd21fZmFuX2Nvb2xpbmdfbGV2ZWxzW2kgKyAxXSkKKwkJCWJyZWFrOworCisJY3R4LT5wd21fZmFuX3N0YXRlID0gaTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3B3bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHB3bV9mYW5fY3R4ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBsb25nIHB3bTsKKwlpbnQgcmV0OworCisJaWYgKGtzdHJ0b3VsKGJ1ZiwgMTAsICZwd20pIHx8IHB3bSA+IE1BWF9QV00pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gX19zZXRfcHdtKGN0eCwgcHdtKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcHdtX2Zhbl91cGRhdGVfc3RhdGUoY3R4LCBwd20pOworCXJldHVybiBjb3VudDsKK30KKwogc3RhdGljIHNzaXplX3Qgc2hvd19wd20oc3RydWN0IGRldmljZSAqZGV2LAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTkxLDEwICsxMTQsMTA4IEBACiAKIEFUVFJJQlVURV9HUk9VUFMocHdtX2Zhbik7CiAKKy8qIHRoZXJtYWwgY29vbGluZyBkZXZpY2UgY2FsbGJhY2tzICovCitzdGF0aWMgaW50IHB3bV9mYW5fZ2V0X21heF9zdGF0ZShzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKKwkJCQkgdW5zaWduZWQgbG9uZyAqc3RhdGUpCit7CisJc3RydWN0IHB3bV9mYW5fY3R4ICpjdHggPSBjZGV2LT5kZXZkYXRhOworCisJaWYgKCFjdHgpCisJCXJldHVybiAtRUlOVkFMOworCisJKnN0YXRlID0gY3R4LT5wd21fZmFuX21heF9zdGF0ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB3bV9mYW5fZ2V0X2N1cl9zdGF0ZShzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwKKwkJCQkgdW5zaWduZWQgbG9uZyAqc3RhdGUpCit7CisJc3RydWN0IHB3bV9mYW5fY3R4ICpjdHggPSBjZGV2LT5kZXZkYXRhOworCisJaWYgKCFjdHgpCisJCXJldHVybiAtRUlOVkFMOworCisJKnN0YXRlID0gY3R4LT5wd21fZmFuX3N0YXRlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3B3bV9mYW5fc2V0X2N1cl9zdGF0ZShzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldiwgdW5zaWduZWQgbG9uZyBzdGF0ZSkKK3sKKwlzdHJ1Y3QgcHdtX2Zhbl9jdHggKmN0eCA9IGNkZXYtPmRldmRhdGE7CisJaW50IHJldDsKKworCWlmICghY3R4IHx8IChzdGF0ZSA+IGN0eC0+cHdtX2Zhbl9tYXhfc3RhdGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzdGF0ZSA9PSBjdHgtPnB3bV9mYW5fc3RhdGUpCisJCXJldHVybiAwOworCisJcmV0ID0gX19zZXRfcHdtKGN0eCwgY3R4LT5wd21fZmFuX2Nvb2xpbmdfbGV2ZWxzW3N0YXRlXSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZjZGV2LT5kZXZpY2UsICJDYW5ub3Qgc2V0IHB3bSFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWN0eC0+cHdtX2Zhbl9zdGF0ZSA9IHN0YXRlOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyBwd21fZmFuX2Nvb2xpbmdfb3BzID0geworCS5nZXRfbWF4X3N0YXRlID0gcHdtX2Zhbl9nZXRfbWF4X3N0YXRlLAorCS5nZXRfY3VyX3N0YXRlID0gcHdtX2Zhbl9nZXRfY3VyX3N0YXRlLAorCS5zZXRfY3VyX3N0YXRlID0gcHdtX2Zhbl9zZXRfY3VyX3N0YXRlLAorfTsKKworc3RhdGljIGludCBwd21fZmFuX29mX2dldF9jb29saW5nX2RhdGEoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgcHdtX2Zhbl9jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCWludCBudW0sIGksIHJldDsKKworCWlmICghb2ZfZmluZF9wcm9wZXJ0eShucCwgImNvb2xpbmctbGV2ZWxzIiwgTlVMTCkpCisJCXJldHVybiAwOworCisJcmV0ID0gb2ZfcHJvcGVydHlfY291bnRfdTMyX2VsZW1zKG5wLCAiY29vbGluZy1sZXZlbHMiKTsKKwlpZiAocmV0IDw9IDApIHsKKwkJZGV2X2VycihkZXYsICJXcm9uZyBkYXRhIVxuIik7CisJCXJldHVybiByZXQgPyA6IC1FSU5WQUw7CisJfQorCisJbnVtID0gcmV0OworCWN0eC0+cHdtX2Zhbl9jb29saW5nX2xldmVscyA9IGRldm1fa3phbGxvYyhkZXYsIG51bSAqIHNpemVvZih1MzIpLAorCQkJCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgtPnB3bV9mYW5fY29vbGluZ19sZXZlbHMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkobnAsICJjb29saW5nLWxldmVscyIsCisJCQkJCSBjdHgtPnB3bV9mYW5fY29vbGluZ19sZXZlbHMsIG51bSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIlByb3BlcnR5ICdjb29saW5nLWxldmVscycgY2Fubm90IGJlIHJlYWQhXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKGN0eC0+cHdtX2Zhbl9jb29saW5nX2xldmVsc1tpXSA+IE1BWF9QV00pIHsKKwkJCWRldl9lcnIoZGV2LCAiUFdNIGZhbiBzdGF0ZVslZF06JWQgPiAlZFxuIiwgaSwKKwkJCQljdHgtPnB3bV9mYW5fY29vbGluZ19sZXZlbHNbaV0sIE1BWF9QV00pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwljdHgtPnB3bV9mYW5fbWF4X3N0YXRlID0gbnVtIC0gMTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHB3bV9mYW5fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpod21vbjsKKwlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqY2RldjsKIAlzdHJ1Y3QgcHdtX2Zhbl9jdHggKmN0eDsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbjsKIAlpbnQgZHV0eV9jeWNsZTsKIAlpbnQgcmV0OwogCkBAIC0xMzYsNiArMjU3LDI2IEBACiAJCXB3bV9kaXNhYmxlKGN0eC0+cHdtKTsKIAkJcmV0dXJuIFBUUl9FUlIoaHdtb24pOwogCX0KKworCXJldCA9IHB3bV9mYW5fb2ZfZ2V0X2Nvb2xpbmdfZGF0YSgmcGRldi0+ZGV2LCBjdHgpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljdHgtPnB3bV9mYW5fc3RhdGUgPSBjdHgtPnB3bV9mYW5fbWF4X3N0YXRlOworCWlmIChJU19FTkFCTEVEKENPTkZJR19USEVSTUFMKSkgeworCQljZGV2ID0gdGhlcm1hbF9vZl9jb29saW5nX2RldmljZV9yZWdpc3RlcihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCQkgICJwd20tZmFuIiwgY3R4LAorCQkJCQkJCSAgJnB3bV9mYW5fY29vbGluZ19vcHMpOworCQlpZiAoSVNfRVJSKGNkZXYpKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byByZWdpc3RlciBwd20tZmFuIGFzIGNvb2xpbmcgZGV2aWNlIik7CisJCQlwd21fZGlzYWJsZShjdHgtPnB3bSk7CisJCQlyZXR1cm4gUFRSX0VSUihjZGV2KTsKKwkJfQorCQljdHgtPmNkZXYgPSBjZGV2OworCQl0aGVybWFsX2NkZXZfdXBkYXRlKGNkZXYpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xNDMsNiArMjg0LDcgQEAKIHsKIAlzdHJ1Y3QgcHdtX2Zhbl9jdHggKmN0eCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCisJdGhlcm1hbF9jb29saW5nX2RldmljZV91bnJlZ2lzdGVyKGN0eC0+Y2Rldik7CiAJaWYgKGN0eC0+cHdtX3ZhbHVlKQogCQlwd21fZGlzYWJsZShjdHgtPnB3bSk7CiAJcmV0dXJuIDA7CkBAIC0xNzcsNyArMzE5LDcgQEAKIAogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHB3bV9mYW5fcG0sIHB3bV9mYW5fc3VzcGVuZCwgcHdtX2Zhbl9yZXN1bWUpOwogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBvZl9wd21fZmFuX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9wd21fZmFuX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJwd20tZmFuIiwgfSwKIAl7fSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3ZleHByZXNzLmMgYi9kcml2ZXJzL2h3bW9uL3ZleHByZXNzLmMKaW5kZXggY2YxODQ4Yi4uOGJhNDE5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi92ZXhwcmVzcy5jCisrKyBiL2RyaXZlcnMvaHdtb24vdmV4cHJlc3MuYwpAQCAtMTkzLDcgKzE5Myw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZleHByZXNzX2h3bW9uX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2ZXhwcmVzc19od21vbl9vZl9tYXRjaFtdID0gewogI2lmICFkZWZpbmVkKENPTkZJR19SRUdVTEFUT1JfVkVYUFJFU1MpCiAJewogCQkuY29tcGF0aWJsZSA9ICJhcm0sdmV4cHJlc3Mtdm9sdCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCmluZGV4IDIyZGE5YzIuLjIyNTVhZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCkBAIC00ODUsNiArNDg1LDE1IEBACiAJICB0aGUgcGxhdGZvcm0gZmlybXdhcmUgY29udHJvbGxpbmcgaXQuIFlvdSBzaG91bGQgc2F5IFkgaWYgcnVubmluZyBvbgogCSAgYSBCYXlUcmFpbCBzeXN0ZW0gdXNpbmcgdGhlIEFYUDI4OC4KIAorY29uZmlnIEkyQ19ESUdJQ09MT1IKKwl0cmlzdGF0ZSAiQ29uZXhhbnQgRGlnaWNvbG9yIEkyQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBBUkNIX0RJR0lDT0xPUgorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIENvbmV4YW50IERpZ2ljb2xvciBTb0NzIChDWDkyNzU1KSBJMkMgY29udHJvbGxlciBkcml2ZXIuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIGkyYy1kaWdpY29sb3IuCisKIGNvbmZpZyBJMkNfRUZNMzIKIAl0cmlzdGF0ZSAiRUZNMzIgSTJDIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBBUkNIX0VGTTMyIHx8IENPTVBJTEVfVEVTVApAQCAtNTc0LDYgKzU4MywxNSBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaTJjLWlvcDN4eC4KIAorY29uZmlnIEkyQ19KWjQ3ODAKKwl0cmlzdGF0ZSAiSlo0NzgwIEkyQyBjb250cm9sbGVyIGludGVyZmFjZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gTUFDSF9KWjQ3ODAgfHwgQ09NUElMRV9URVNUCisJaGVscAorCSBJZiB5b3Ugc2F5IHllcyB0byB0aGlzIG9wdGlvbiwgc3VwcG9ydCB3aWxsIGJlIGluY2x1ZGVkIGZvciB0aGUKKwkgSW5nZW5pYyBKWjQ3ODAgSTJDIGNvbnRyb2xsZXIuCisKKwkgSWYgeW91IGRvbid0IGtub3cgd2hhdCB0byBkbyBoZXJlLCBzYXkgTi4KKwogY29uZmlnIEkyQ19LRU1QTEQKIAl0cmlzdGF0ZSAiS29udHJvbiBDT00gSTJDIENvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBNRkRfS0VNUExECkBAIC04OTgsNiArOTE2LDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBpMmMteGxyLgogCitjb25maWcgSTJDX1hMUDlYWAorCXRyaXN0YXRlICJYTFA5WFggSTJDIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBDUFVfWExQIHx8IENPTVBJTEVfVEVTVAorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIG9uLWNoaXAgSTJDIGludGVyZmFjZSBvZgorCSAgdGhlIEJyb2FkY29tIFhMUDl4eC9YTFA1eHggTUlQUyBwcm9jZXNzb3JzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBpMmMteGxwOXh4LgorCiBjb25maWcgSTJDX1JDQVIKIAl0cmlzdGF0ZSAiUmVuZXNhcyBSLUNhciBJMkMgQ29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEFSQ0hfU0hNT0JJTEUgfHwgQ09NUElMRV9URVNUCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUKaW5kZXggMzYzOGZlYi4uY2RmOTQxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQpAQCAtNDUsNiArNDUsNyBAQAogaTJjLWRlc2lnbndhcmUtcGxhdGZvcm0tJChDT05GSUdfSTJDX0RFU0lHTldBUkVfQkFZVFJBSUwpICs9IGkyYy1kZXNpZ253YXJlLWJheXRyYWlsLm8KIG9iai0kKENPTkZJR19JMkNfREVTSUdOV0FSRV9QQ0kpCSs9IGkyYy1kZXNpZ253YXJlLXBjaS5vCiBpMmMtZGVzaWdud2FyZS1wY2ktb2JqcyA6PSBpMmMtZGVzaWdud2FyZS1wY2lkcnYubworb2JqLSQoQ09ORklHX0kyQ19ESUdJQ09MT1IpCSs9IGkyYy1kaWdpY29sb3Iubwogb2JqLSQoQ09ORklHX0kyQ19FRk0zMikJCSs9IGkyYy1lZm0zMi5vCiBvYmotJChDT05GSUdfSTJDX0VHMjBUKQkJKz0gaTJjLWVnMjB0Lm8KIG9iai0kKENPTkZJR19JMkNfRVhZTk9TNSkJKz0gaTJjLWV4eW5vczUubwpAQCAtNTUsNiArNTYsNyBAQAogb2JqLSQoQ09ORklHX0kyQ19JTUcpCQkrPSBpMmMtaW1nLXNjYi5vCiBvYmotJChDT05GSUdfSTJDX0lNWCkJCSs9IGkyYy1pbXgubwogb2JqLSQoQ09ORklHX0kyQ19JT1AzWFgpCSs9IGkyYy1pb3AzeHgubworb2JqLSQoQ09ORklHX0kyQ19KWjQ3ODApCSs9IGkyYy1qejQ3ODAubwogb2JqLSQoQ09ORklHX0kyQ19LRU1QTEQpCSs9IGkyYy1rZW1wbGQubwogb2JqLSQoQ09ORklHX0kyQ19NRVNPTikJCSs9IGkyYy1tZXNvbi5vCiBvYmotJChDT05GSUdfSTJDX01QQykJCSs9IGkyYy1tcGMubwpAQCAtODcsNiArODksNyBAQAogb2JqLSQoQ09ORklHX0kyQ19PQ1RFT04pCSs9IGkyYy1vY3Rlb24ubwogb2JqLSQoQ09ORklHX0kyQ19YSUxJTlgpCSs9IGkyYy14aWljLm8KIG9iai0kKENPTkZJR19JMkNfWExSKQkJKz0gaTJjLXhsci5vCitvYmotJChDT05GSUdfSTJDX1hMUDlYWCkJKz0gaTJjLXhscDl4eC5vCiBvYmotJChDT05GSUdfSTJDX1JDQVIpCQkrPSBpMmMtcmNhci5vCiAKICMgRXh0ZXJuYWwgSTJDL1NNQnVzIGFkYXB0ZXIgZHJpdmVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1hdDkxLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYwppbmRleCA2MzZmZDJlLi5mZjIzZDFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF0OTEuYwpAQCAtMzgxLDYgKzM4MSw3IEBACiBzdGF0aWMgaW50IGF0OTFfZG9fdHdpX3RyYW5zZmVyKHN0cnVjdCBhdDkxX3R3aV9kZXYgKmRldikKIHsKIAlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OwogCWJvb2wgaGFzX3VucmVfZmxhZyA9IGRldi0+cGRhdGEtPmhhc191bnJlX2ZsYWc7CiAKIAlkZXZfZGJnKGRldi0+ZGV2LCAidHJhbnNmZXI6ICVzICVkIGJ5dGVzLlxuIiwKQEAgLTQzNiw5ICs0MzcsOSBAQAogCQl9CiAJfQogCi0JcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkZXYtPmNtZF9jb21wbGV0ZSwKLQkJCQkJICAgICBkZXYtPmFkYXB0ZXIudGltZW91dCk7Ci0JaWYgKHJldCA9PSAwKSB7CisJdGltZV9sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkZXYtPmNtZF9jb21wbGV0ZSwKKwkJCQkJICAgICAgZGV2LT5hZGFwdGVyLnRpbWVvdXQpOworCWlmICh0aW1lX2xlZnQgPT0gMCkgewogCQlkZXZfZXJyKGRldi0+ZGV2LCAiY29udHJvbGxlciB0aW1lZCBvdXRcbiIpOwogCQlhdDkxX2luaXRfdHdpX2J1cyhkZXYpOwogCQlyZXQgPSAtRVRJTUVET1VUOwpAQCAtNDg3LDMwICs0ODgsMTAgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQkvKgotCSAqIFRoZSBoYXJkd2FyZSBjYW4gaGFuZGxlIGF0IG1vc3QgdHdvIG1lc3NhZ2VzIGNvbmNhdGVuYXRlZCBieSBhCi0JICogcmVwZWF0ZWQgc3RhcnQgdmlhIGl0J3MgaW50ZXJuYWwgYWRkcmVzcyBmZWF0dXJlLgotCSAqLwotCWlmIChudW0gPiAyKSB7Ci0JCWRldl9lcnIoZGV2LT5kZXYsCi0JCQkiY2Fubm90IGhhbmRsZSBtb3JlIHRoYW4gdHdvIGNvbmNhdGVuYXRlZCBtZXNzYWdlcy5cbiIpOwotCQlyZXQgPSAwOwotCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKG51bSA9PSAyKSB7CisJaWYgKG51bSA9PSAyKSB7CiAJCWludCBpbnRlcm5hbF9hZGRyZXNzID0gMDsKIAkJaW50IGk7CiAKLQkJaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgewotCQkJZGV2X2VycihkZXYtPmRldiwgImZpcnN0IHRyYW5zZmVyIG11c3QgYmUgd3JpdGUuXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQlpZiAobXNnLT5sZW4gPiAzKSB7Ci0JCQlkZXZfZXJyKGRldi0+ZGV2LCAiZmlyc3QgbWVzc2FnZSBzaXplIG11c3QgYmUgPD0gMy5cbiIpOwotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KIAkJLyogMXN0IG1zZyBpcyBwdXQgaW50byB0aGUgaW50ZXJuYWwgYWRkcmVzcywgc3RhcnQgd2l0aCAybmQgKi8KIAkJbV9zdGFydCA9ICZtc2dbMV07CiAJCWZvciAoaSA9IDA7IGkgPCBtc2ctPmxlbjsgKytpKSB7CkBAIC01NDAsNiArNTIxLDE1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorLyoKKyAqIFRoZSBoYXJkd2FyZSBjYW4gaGFuZGxlIGF0IG1vc3QgdHdvIG1lc3NhZ2VzIGNvbmNhdGVuYXRlZCBieSBhCisgKiByZXBlYXRlZCBzdGFydCB2aWEgaXQncyBpbnRlcm5hbCBhZGRyZXNzIGZlYXR1cmUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXJfcXVpcmtzIGF0OTFfdHdpX3F1aXJrcyA9IHsKKwkuZmxhZ3MgPSBJMkNfQVFfQ09NQiB8IEkyQ19BUV9DT01CX1dSSVRFX0ZJUlNUIHwgSTJDX0FRX0NPTUJfU0FNRV9BRERSLAorCS5tYXhfY29tYl8xc3RfbXNnX2xlbiA9IDMsCit9OworCiBzdGF0aWMgdTMyIGF0OTFfdHdpX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQogewogCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19FTVVMCkBAIC03NzcsNiArNzY3LDcgQEAKIAlkZXYtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKIAlkZXYtPmFkYXB0ZXIuY2xhc3MgPSBJMkNfQ0xBU1NfREVQUkVDQVRFRDsKIAlkZXYtPmFkYXB0ZXIuYWxnbyA9ICZhdDkxX3R3aV9hbGdvcml0aG07CisJZGV2LT5hZGFwdGVyLnF1aXJrcyA9ICZhdDkxX3R3aV9xdWlya3M7CiAJZGV2LT5hZGFwdGVyLmRldi5wYXJlbnQgPSBkZXYtPmRldjsKIAlkZXYtPmFkYXB0ZXIubnIgPSBwZGV2LT5pZDsKIAlkZXYtPmFkYXB0ZXIudGltZW91dCA9IEFUOTFfSTJDX1RJTUVPVVQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF4eGlhLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWF4eGlhLmMKaW5kZXggNzY4YTU5OC4uMzJkODgzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1heHhpYS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYXh4aWEuYwpAQCAtMzM0LDEyICszMzQsNyBAQAogCXUzMiBpbnRfbWFzayA9IE1TVF9TVEFUVVNfRVJSIHwgTVNUX1NUQVRVU19TTlM7CiAJdTMyIHJ4X3hmZXIsIHR4X3hmZXI7CiAJdTMyIGFkZHJfMSwgYWRkcl8yOwotCWludCByZXQ7Ci0KLQlpZiAobXNnLT5sZW4gPiAyNTUpIHsKLQkJZGV2X3dhcm4oaWRldi0+ZGV2LCAidW5zdXBwb3J0ZWQgbGVuZ3RoICV1XG4iLCBtc2ctPmxlbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwl1bnNpZ25lZCBsb25nIHRpbWVfbGVmdDsKIAogCWlkZXYtPm1zZyA9IG1zZzsKIAlpZGV2LT5tc2dfeGZyZCA9IDA7CkBAIC0zODgsMTUgKzM4MywxNSBAQAogCiAJaTJjX2ludF9lbmFibGUoaWRldiwgaW50X21hc2spOwogCi0JcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpZGV2LT5tc2dfY29tcGxldGUsCi0JCQkJCSAgSTJDX1hGRVJfVElNRU9VVCk7CisJdGltZV9sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpZGV2LT5tc2dfY29tcGxldGUsCisJCQkJCSAgICAgIEkyQ19YRkVSX1RJTUVPVVQpOwogCiAJaTJjX2ludF9kaXNhYmxlKGlkZXYsIGludF9tYXNrKTsKIAogCWlmIChyZWFkbChpZGV2LT5iYXNlICsgTVNUX0NPTU1BTkQpICYgQ01EX0JVU1kpCiAJCWRldl93YXJuKGlkZXYtPmRldiwgImJ1c3kgYWZ0ZXIgeGZlclxuIik7CiAKLQlpZiAocmV0ID09IDApCisJaWYgKHRpbWVfbGVmdCA9PSAwKQogCQlpZGV2LT5tc2dfZXJyID0gLUVUSU1FRE9VVDsKIAogCWlmICh1bmxpa2VseShpZGV2LT5tc2dfZXJyKSAmJiBpZGV2LT5tc2dfZXJyICE9IC1FTlhJTykKQEAgLTQwOCwxNyArNDAzLDE3IEBACiBzdGF0aWMgaW50IGF4eGlhX2kyY19zdG9wKHN0cnVjdCBheHhpYV9pMmNfZGV2ICppZGV2KQogewogCXUzMiBpbnRfbWFzayA9IE1TVF9TVEFUVVNfRVJSIHwgTVNUX1NUQVRVU19TQ0M7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHRpbWVfbGVmdDsKIAogCXJlaW5pdF9jb21wbGV0aW9uKCZpZGV2LT5tc2dfY29tcGxldGUpOwogCiAJLyogSXNzdWUgc3RvcCAqLwogCXdyaXRlbCgweGIsIGlkZXYtPmJhc2UgKyBNU1RfQ09NTUFORCk7CiAJaTJjX2ludF9lbmFibGUoaWRldiwgaW50X21hc2spOwotCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaWRldi0+bXNnX2NvbXBsZXRlLAotCQkJCQkgIEkyQ19TVE9QX1RJTUVPVVQpOworCXRpbWVfbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaWRldi0+bXNnX2NvbXBsZXRlLAorCQkJCQkgICAgICBJMkNfU1RPUF9USU1FT1VUKTsKIAlpMmNfaW50X2Rpc2FibGUoaWRldiwgaW50X21hc2spOwotCWlmIChyZXQgPT0gMCkKKwlpZiAodGltZV9sZWZ0ID09IDApCiAJCXJldHVybiAtRVRJTUVET1VUOwogCiAJaWYgKHJlYWRsKGlkZXYtPmJhc2UgKyBNU1RfQ09NTUFORCkgJiBDTURfQlVTWSkKQEAgLTQ1NCw2ICs0NDksMTEgQEAKIAkuZnVuY3Rpb25hbGl0eSA9IGF4eGlhX2kyY19mdW5jLAogfTsKIAorc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlcl9xdWlya3MgYXh4aWFfaTJjX3F1aXJrcyA9IHsKKwkubWF4X3JlYWRfbGVuID0gMjU1LAorCS5tYXhfd3JpdGVfbGVuID0gMjU1LAorfTsKKwogc3RhdGljIGludCBheHhpYV9pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CkBAIC01MTEsNiArNTExLDcgQEAKIAlzdHJsY3B5KGlkZXYtPmFkYXB0ZXIubmFtZSwgcGRldi0+bmFtZSwgc2l6ZW9mKGlkZXYtPmFkYXB0ZXIubmFtZSkpOwogCWlkZXYtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKIAlpZGV2LT5hZGFwdGVyLmFsZ28gPSAmYXh4aWFfaTJjX2FsZ287CisJaWRldi0+YWRhcHRlci5xdWlya3MgPSAmYXh4aWFfaTJjX3F1aXJrczsKIAlpZGV2LT5hZGFwdGVyLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OwogCWlkZXYtPmFkYXB0ZXIuZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iY20taXByb2MuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtYmNtLWlwcm9jLmMKaW5kZXggZDNjODkxNS4uZjlmMmMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iY20taXByb2MuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbS1pcHJvYy5jCkBAIC0xNjAsMTQgKzE2MCw2IEBACiAJdTMyIHZhbDsKIAl1bnNpZ25lZCBsb25nIHRpbWVfbGVmdCA9IG1zZWNzX3RvX2ppZmZpZXMoSTJDX1RJTUVPVVRfTUVTQyk7CiAKLQkvKiBuZWVkIHRvIHJlc2VydmUgb25lIGJ5dGUgaW4gdGhlIEZJRk8gZm9yIHRoZSBzbGF2ZSBhZGRyZXNzICovCi0JaWYgKG1zZy0+bGVuID4gTV9UWF9SWF9GSUZPX1NJWkUgLSAxKSB7Ci0JCWRldl9lcnIoaXByb2NfaTJjLT5kZXZpY2UsCi0JCQkib25seSBzdXBwb3J0IGRhdGEgbGVuZ3RoIHVwIHRvICV1IGJ5dGVzXG4iLAotCQkJTV9UWF9SWF9GSUZPX1NJWkUgLSAxKTsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KLQogCS8qIGNoZWNrIGlmIGJ1cyBpcyBidXN5ICovCiAJaWYgKCEhKHJlYWRsKGlwcm9jX2kyYy0+YmFzZSArIE1fQ01EX09GRlNFVCkgJgogCSAgICAgICBCSVQoTV9DTURfU1RBUlRfQlVTWV9TSElGVCkpKSB7CkBAIC0yODcsNiArMjc5LDEyIEBACiAJLmZ1bmN0aW9uYWxpdHkgPSBiY21faXByb2NfaTJjX2Z1bmN0aW9uYWxpdHksCiB9OwogCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyX3F1aXJrcyBiY21faXByb2NfaTJjX3F1aXJrcyA9IHsKKwkvKiBuZWVkIHRvIHJlc2VydmUgb25lIGJ5dGUgaW4gdGhlIEZJRk8gZm9yIHRoZSBzbGF2ZSBhZGRyZXNzICovCisJLm1heF9yZWFkX2xlbiA9IE1fVFhfUlhfRklGT19TSVpFIC0gMSwKKwkubWF4X3dyaXRlX2xlbiA9IE1fVFhfUlhfRklGT19TSVpFIC0gMSwKK307CisKIHN0YXRpYyBpbnQgYmNtX2lwcm9jX2kyY19jZmdfc3BlZWQoc3RydWN0IGJjbV9pcHJvY19pMmNfZGV2ICppcHJvY19pMmMpCiB7CiAJdW5zaWduZWQgaW50IGJ1c19zcGVlZDsKQEAgLTQxMyw2ICs0MTEsNyBAQAogCWkyY19zZXRfYWRhcGRhdGEoYWRhcCwgaXByb2NfaTJjKTsKIAlzdHJsY3B5KGFkYXAtPm5hbWUsICJCcm9hZGNvbSBpUHJvYyBJMkMgYWRhcHRlciIsIHNpemVvZihhZGFwLT5uYW1lKSk7CiAJYWRhcC0+YWxnbyA9ICZiY21faXByb2NfYWxnbzsKKwlhZGFwLT5xdWlya3MgPSAmYmNtX2lwcm9jX2kyY19xdWlya3M7CiAJYWRhcC0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CiAJYWRhcC0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1iY20yODM1LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbTI4MzUuYwppbmRleCA1ZDZmZWI5Li5jOTMzNmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbTI4MzUuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWJjbTI4MzUuYwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJCQkJc3RydWN0IGkyY19tc2cgKm1zZykKIHsKIAl1MzIgYzsKLQlpbnQgdGltZV9sZWZ0OworCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OwogCiAJaTJjX2Rldi0+bXNnX2J1ZiA9IG1zZy0+YnVmOwogCWkyY19kZXYtPm1zZ19idWZfcmVtYWluaW5nID0gbXNnLT5sZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNhZGVuY2UuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCmluZGV4IDdkN2ExNGMuLjJlZTc4ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY2FkZW5jZS5jCkBAIC00NzUsNyArNDc1LDcgQEAKIHN0YXRpYyBpbnQgY2Ruc19pMmNfcHJvY2Vzc19tc2coc3RydWN0IGNkbnNfaTJjICppZCwgc3RydWN0IGkyY19tc2cgKm1zZywKIAkJc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQogewotCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lX2xlZnQ7CiAJdTMyIHJlZzsKIAogCWlkLT5wX21zZyA9IG1zZzsKQEAgLTUwMSw4ICs1MDEsOCBAQAogCQljZG5zX2kyY19tc2VuZChpZCk7CiAKIAkvKiBXYWl0IGZvciB0aGUgc2lnbmFsIG9mIGNvbXBsZXRpb24gKi8KLQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmlkLT54ZmVyX2RvbmUsIGFkYXAtPnRpbWVvdXQpOwotCWlmICghcmV0KSB7CisJdGltZV9sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpZC0+eGZlcl9kb25lLCBhZGFwLT50aW1lb3V0KTsKKwlpZiAodGltZV9sZWZ0ID09IDApIHsKIAkJY2Ruc19pMmNfbWFzdGVyX3Jlc2V0KGFkYXApOwogCQlkZXZfZXJyKGlkLT5hZGFwLmRldi5wYXJlbnQsCiAJCQkJInRpbWVvdXQgd2FpdGluZyBvbiBjb21wbGV0aW9uXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3BtLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWNwbS5jCmluZGV4IDJkNDY2NTMuLjcxNGJkYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtY3BtLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1jcG0uYwpAQCAtMzA4LDIyICszMDgsMTIgQEAKIAlzdHJ1Y3QgaTJjX3JlZyBfX2lvbWVtICppMmNfcmVnID0gY3BtLT5pMmNfcmVnOwogCXN0cnVjdCBpMmNfcmFtIF9faW9tZW0gKmkyY19yYW0gPSBjcG0tPmkyY19yYW07CiAJc3RydWN0IGkyY19tc2cgKnBtc2c7Ci0JaW50IHJldCwgaTsKKwlpbnQgcmV0OwogCWludCB0cHRyOwogCWludCBycHRyOwogCWNiZF90IF9faW9tZW0gKnRiZGY7CiAJY2JkX3QgX19pb21lbSAqcmJkZjsKIAotCWlmIChudW0gPiBDUE1fTUFYQkQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogQ2hlY2sgaWYgd2UgaGF2ZSBhbnkgb3ZlcnNpemVkIFJFQUQgcmVxdWVzdHMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJcG1zZyA9ICZtc2dzW2ldOwotCQlpZiAocG1zZy0+bGVuID49IENQTV9NQVhfUkVBRCkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQogCS8qIFJlc2V0IHRvIHVzZSBmaXJzdCBidWZmZXIgKi8KIAlvdXRfYmUxNigmaTJjX3JhbS0+cmJwdHIsIGluX2JlMTYoJmkyY19yYW0tPnJiYXNlKSk7CiAJb3V0X2JlMTYoJmkyY19yYW0tPnRicHRyLCBpbl9iZTE2KCZpMmNfcmFtLT50YmFzZSkpOwpAQCAtNDI0LDEwICs0MTQsMTggQEAKIAkuZnVuY3Rpb25hbGl0eSA9IGNwbV9pMmNfZnVuYywKIH07CiAKKy8qIENQTV9NQVhfUkVBRCBpcyBhbHNvIGxpbWl0aW5nIHdyaXRlcyBhY2NvcmRpbmcgdG8gdGhlIGNvZGUhICovCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyX3F1aXJrcyBjcG1faTJjX3F1aXJrcyA9IHsKKwkubWF4X251bV9tc2dzID0gQ1BNX01BWEJELAorCS5tYXhfcmVhZF9sZW4gPSBDUE1fTUFYX1JFQUQsCisJLm1heF93cml0ZV9sZW4gPSBDUE1fTUFYX1JFQUQsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hZGFwdGVyIGNwbV9vcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5uYW1lCQk9ICJpMmMtY3BtIiwKIAkuYWxnbwkJPSAmY3BtX2kyY19hbGdvLAorCS5xdWlya3MJCT0gJmNwbV9pMmNfcXVpcmtzLAogfTsKIAogc3RhdGljIGludCBjcG1faTJjX3NldHVwKHN0cnVjdCBjcG1faTJjICpjcG0pCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRhdmluY2kuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGF2aW5jaS5jCmluZGV4IDZkYzdmZjUuLjQ3ODhhMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGF2aW5jaS5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGF2aW5jaS5jCkBAIC02MCw2ICs2MCwxMiBAQAogI2RlZmluZSBEQVZJTkNJX0kyQ19JVlJfUkVHCTB4MjgKICNkZWZpbmUgREFWSU5DSV9JMkNfRU1EUl9SRUcJMHgyYwogI2RlZmluZSBEQVZJTkNJX0kyQ19QU0NfUkVHCTB4MzAKKyNkZWZpbmUgREFWSU5DSV9JMkNfRlVOQ19SRUcJMHg0OAorI2RlZmluZSBEQVZJTkNJX0kyQ19ESVJfUkVHCTB4NGMKKyNkZWZpbmUgREFWSU5DSV9JMkNfRElOX1JFRwkweDUwCisjZGVmaW5lIERBVklOQ0lfSTJDX0RPVVRfUkVHCTB4NTQKKyNkZWZpbmUgREFWSU5DSV9JMkNfRFNFVF9SRUcJMHg1OAorI2RlZmluZSBEQVZJTkNJX0kyQ19EQ0xSX1JFRwkweDVjCiAKICNkZWZpbmUgREFWSU5DSV9JMkNfSVZSX0FBUwkweDA3CiAjZGVmaW5lIERBVklOQ0lfSTJDX0lWUl9TQ0QJMHgwNgpAQCAtOTMsNiArOTksMjkgQEAKICNkZWZpbmUgREFWSU5DSV9JMkNfSU1SX05BQ0sJQklUKDEpCiAjZGVmaW5lIERBVklOQ0lfSTJDX0lNUl9BTAlCSVQoMCkKIAorLyogc2V0IFNEQSBhbmQgU0NMIGFzIEdQSU8gKi8KKyNkZWZpbmUgREFWSU5DSV9JMkNfRlVOQ19QRlVOQzAJQklUKDApCisKKy8qIHNldCBTQ0wgYXMgb3V0cHV0IHdoZW4gdXNlZCBhcyBHUElPKi8KKyNkZWZpbmUgREFWSU5DSV9JMkNfRElSX1BESVIwCUJJVCgwKQorLyogc2V0IFNEQSBhcyBvdXRwdXQgd2hlbiB1c2VkIGFzIEdQSU8qLworI2RlZmluZSBEQVZJTkNJX0kyQ19ESVJfUERJUjEJQklUKDEpCisKKy8qIHJlYWQgU0NMIEdQSU8gbGV2ZWwgKi8KKyNkZWZpbmUgREFWSU5DSV9JMkNfRElOX1BESU4wIEJJVCgwKQorLyogcmVhZCBTREEgR1BJTyBsZXZlbCAqLworI2RlZmluZSBEQVZJTkNJX0kyQ19ESU5fUERJTjEgQklUKDEpCisKKy8qc2V0IHRoZSBTQ0wgR1BJTyBoaWdoICovCisjZGVmaW5lIERBVklOQ0lfSTJDX0RTRVRfUERTRVQwCUJJVCgwKQorLypzZXQgdGhlIFNEQSBHUElPIGhpZ2ggKi8KKyNkZWZpbmUgREFWSU5DSV9JMkNfRFNFVF9QRFNFVDEJQklUKDEpCisKKy8qIHNldCB0aGUgU0NMIEdQSU8gbG93ICovCisjZGVmaW5lIERBVklOQ0lfSTJDX0RDTFJfUERDTFIwCUJJVCgwKQorLyogc2V0IHRoZSBTREEgR1BJTyBsb3cgKi8KKyNkZWZpbmUgREFWSU5DSV9JMkNfRENMUl9QRENMUjEJQklUKDEpCisKIHN0cnVjdCBkYXZpbmNpX2kyY19kZXYgewogCXN0cnVjdCBkZXZpY2UgICAgICAgICAgICpkZXY7CiAJdm9pZCBfX2lvbWVtCQkqYmFzZTsKQEAgLTEyOSw0MyArMTU4LDYgQEAKIAlyZXR1cm4gcmVhZHdfcmVsYXhlZChpMmNfZGV2LT5iYXNlICsgcmVnKTsKIH0KIAotLyogR2VuZXJhdGUgYSBwdWxzZSBvbiB0aGUgaTJjIGNsb2NrIHBpbi4gKi8KLXN0YXRpYyB2b2lkIGRhdmluY2lfaTJjX2Nsb2NrX3B1bHNlKHVuc2lnbmVkIGludCBzY2xfcGluKQotewotCXUxNiBpOwotCi0JaWYgKHNjbF9waW4pIHsKLQkJLyogU2VuZCBoaWdoIGFuZCBsb3cgb24gdGhlIFNDTCBsaW5lICovCi0JCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKLQkJCWdwaW9fc2V0X3ZhbHVlKHNjbF9waW4sIDApOwotCQkJdWRlbGF5KDIwKTsKLQkJCWdwaW9fc2V0X3ZhbHVlKHNjbF9waW4sIDEpOwotCQkJdWRlbGF5KDIwKTsKLQkJfQotCX0KLX0KLQotLyogVGhpcyByb3V0aW5lIGRvZXMgaTJjIGJ1cyByZWNvdmVyeSBhcyBzcGVjaWZpZWQgaW4gdGhlCi0gKiBpMmMgcHJvdG9jb2wgUmV2LiAwMyBzZWN0aW9uIDMuMTYgdGl0bGVkICJCdXMgY2xlYXIiCi0gKi8KLXN0YXRpYyB2b2lkIGRhdmluY2lfaTJjX3JlY292ZXJfYnVzKHN0cnVjdCBkYXZpbmNpX2kyY19kZXYgKmRldikKLXsKLQl1MzIgZmxhZyA9IDA7Ci0Jc3RydWN0IGRhdmluY2lfaTJjX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wZGF0YTsKLQotCWRldl9lcnIoZGV2LT5kZXYsICJpbml0aWF0aW5nIGkyYyBidXMgcmVjb3ZlcnlcbiIpOwotCS8qIFNlbmQgTkFDSyB0byB0aGUgc2xhdmUgKi8KLQlmbGFnID0gZGF2aW5jaV9pMmNfcmVhZF9yZWcoZGV2LCBEQVZJTkNJX0kyQ19NRFJfUkVHKTsKLQlmbGFnIHw9ICBEQVZJTkNJX0kyQ19NRFJfTkFDSzsKLQkvKiB3cml0ZSB0aGUgZGF0YSBpbnRvIG1vZGUgcmVnaXN0ZXIgKi8KLQlkYXZpbmNpX2kyY193cml0ZV9yZWcoZGV2LCBEQVZJTkNJX0kyQ19NRFJfUkVHLCBmbGFnKTsKLQlkYXZpbmNpX2kyY19jbG9ja19wdWxzZShwZGF0YS0+c2NsX3Bpbik7Ci0JLyogU2VuZCBTVE9QICovCi0JZmxhZyA9IGRhdmluY2lfaTJjX3JlYWRfcmVnKGRldiwgREFWSU5DSV9JMkNfTURSX1JFRyk7Ci0JZmxhZyB8PSBEQVZJTkNJX0kyQ19NRFJfU1RQOwotCWRhdmluY2lfaTJjX3dyaXRlX3JlZyhkZXYsIERBVklOQ0lfSTJDX01EUl9SRUcsIGZsYWcpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgZGF2aW5jaV9pMmNfcmVzZXRfY3RybChzdHJ1Y3QgZGF2aW5jaV9pMmNfZGV2ICppMmNfZGV2LAogCQkJCQkJCQlpbnQgdmFsKQogewpAQCAtMjYzLDYgKzI1NSw5OSBAQAogfQogCiAvKgorICogVGhpcyByb3V0aW5lIGRvZXMgaTJjIGJ1cyByZWNvdmVyeSBieSB1c2luZyBpMmNfZ2VuZXJpY19ncGlvX3JlY292ZXJ5CisgKiB3aGljaCBpcyBwcm92aWRlZCBieSBJMkMgQnVzIHJlY292ZXJ5IGluZnJhc3RydWN0dXJlLgorICovCitzdGF0aWMgdm9pZCBkYXZpbmNpX2kyY19wcmVwYXJlX3JlY292ZXJ5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9pMmNfZGV2ICpkZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCisJLyogRGlzYWJsZSBpbnRlcnJ1cHRzICovCisJZGF2aW5jaV9pMmNfd3JpdGVfcmVnKGRldiwgREFWSU5DSV9JMkNfSU1SX1JFRywgMCk7CisKKwkvKiBwdXQgSTJDIGludG8gcmVzZXQgKi8KKwlkYXZpbmNpX2kyY19yZXNldF9jdHJsKGRldiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdmluY2lfaTJjX3VucHJlcGFyZV9yZWNvdmVyeShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJc3RydWN0IGRhdmluY2lfaTJjX2RldiAqZGV2ID0gaTJjX2dldF9hZGFwZGF0YShhZGFwKTsKKworCWkyY19kYXZpbmNpX2luaXQoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYnVzX3JlY292ZXJ5X2luZm8gZGF2aW5jaV9pMmNfZ3Bpb19yZWNvdmVyeV9pbmZvID0geworCS5yZWNvdmVyX2J1cyA9IGkyY19nZW5lcmljX2dwaW9fcmVjb3ZlcnksCisJLnByZXBhcmVfcmVjb3ZlcnkgPSBkYXZpbmNpX2kyY19wcmVwYXJlX3JlY292ZXJ5LAorCS51bnByZXBhcmVfcmVjb3ZlcnkgPSBkYXZpbmNpX2kyY191bnByZXBhcmVfcmVjb3ZlcnksCit9OworCitzdGF0aWMgdm9pZCBkYXZpbmNpX2kyY19zZXRfc2NsKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgaW50IHZhbCkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9pMmNfZGV2ICpkZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCisJaWYgKHZhbCkKKwkJZGF2aW5jaV9pMmNfd3JpdGVfcmVnKGRldiwgREFWSU5DSV9JMkNfRFNFVF9SRUcsCisJCQkJICAgICAgREFWSU5DSV9JMkNfRFNFVF9QRFNFVDApOworCWVsc2UKKwkJZGF2aW5jaV9pMmNfd3JpdGVfcmVnKGRldiwgREFWSU5DSV9JMkNfRENMUl9SRUcsCisJCQkJICAgICAgREFWSU5DSV9JMkNfRENMUl9QRENMUjApOworfQorCitzdGF0aWMgaW50IGRhdmluY2lfaTJjX2dldF9zY2woc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBkYXZpbmNpX2kyY19kZXYgKmRldiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisJaW50IHZhbDsKKworCS8qIHJlYWQgdGhlIHN0YXRlIG9mIFNDTCAqLworCXZhbCA9IGRhdmluY2lfaTJjX3JlYWRfcmVnKGRldiwgREFWSU5DSV9JMkNfRElOX1JFRyk7CisJcmV0dXJuIHZhbCAmIERBVklOQ0lfSTJDX0RJTl9QRElOMDsKK30KKworc3RhdGljIGludCBkYXZpbmNpX2kyY19nZXRfc2RhKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9pMmNfZGV2ICpkZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCWludCB2YWw7CisKKwkvKiByZWFkIHRoZSBzdGF0ZSBvZiBTREEgKi8KKwl2YWwgPSBkYXZpbmNpX2kyY19yZWFkX3JlZyhkZXYsIERBVklOQ0lfSTJDX0RJTl9SRUcpOworCXJldHVybiB2YWwgJiBEQVZJTkNJX0kyQ19ESU5fUERJTjE7Cit9CisKK3N0YXRpYyB2b2lkIGRhdmluY2lfaTJjX3NjbF9wcmVwYXJlX3JlY292ZXJ5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgZGF2aW5jaV9pMmNfZGV2ICpkZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCisJZGF2aW5jaV9pMmNfcHJlcGFyZV9yZWNvdmVyeShhZGFwKTsKKworCS8qIFNDTCBvdXRwdXQsIFNEQSBpbnB1dCAqLworCWRhdmluY2lfaTJjX3dyaXRlX3JlZyhkZXYsIERBVklOQ0lfSTJDX0RJUl9SRUcsIERBVklOQ0lfSTJDX0RJUl9QRElSMCk7CisKKwkvKiBjaGFuZ2UgdG8gR1BJTyBtb2RlICovCisJZGF2aW5jaV9pMmNfd3JpdGVfcmVnKGRldiwgREFWSU5DSV9JMkNfRlVOQ19SRUcsCisJCQkgICAgICBEQVZJTkNJX0kyQ19GVU5DX1BGVU5DMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRhdmluY2lfaTJjX3NjbF91bnByZXBhcmVfcmVjb3Zlcnkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKQoreworCXN0cnVjdCBkYXZpbmNpX2kyY19kZXYgKmRldiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CisKKwkvKiBjaGFuZ2UgYmFjayB0byBJMkMgbW9kZSAqLworCWRhdmluY2lfaTJjX3dyaXRlX3JlZyhkZXYsIERBVklOQ0lfSTJDX0ZVTkNfUkVHLCAwKTsKKworCWRhdmluY2lfaTJjX3VucHJlcGFyZV9yZWNvdmVyeShhZGFwKTsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYnVzX3JlY292ZXJ5X2luZm8gZGF2aW5jaV9pMmNfc2NsX3JlY292ZXJ5X2luZm8gPSB7CisJLnJlY292ZXJfYnVzID0gaTJjX2dlbmVyaWNfc2NsX3JlY292ZXJ5LAorCS5zZXRfc2NsID0gZGF2aW5jaV9pMmNfc2V0X3NjbCwKKwkuZ2V0X3NjbCA9IGRhdmluY2lfaTJjX2dldF9zY2wsCisJLmdldF9zZGEgPSBkYXZpbmNpX2kyY19nZXRfc2RhLAorCS5wcmVwYXJlX3JlY292ZXJ5ID0gZGF2aW5jaV9pMmNfc2NsX3ByZXBhcmVfcmVjb3ZlcnksCisJLnVucHJlcGFyZV9yZWNvdmVyeSA9IGRhdmluY2lfaTJjX3NjbF91bnByZXBhcmVfcmVjb3ZlcnksCit9OworCisvKgogICogV2FpdGluZyBmb3IgYnVzIG5vdCBidXN5CiAgKi8KIHN0YXRpYyBpbnQgaTJjX2RhdmluY2lfd2FpdF9idXNfbm90X2J1c3koc3RydWN0IGRhdmluY2lfaTJjX2RldiAqZGV2LApAQCAtMjgyLDggKzM2Nyw3IEBACiAJCQkJcmV0dXJuIC1FVElNRURPVVQ7CiAJCQl9IGVsc2UgewogCQkJCXRvX2NudCA9IDA7Ci0JCQkJZGF2aW5jaV9pMmNfcmVjb3Zlcl9idXMoZGV2KTsKLQkJCQlpMmNfZGF2aW5jaV9pbml0KGRldik7CisJCQkJaTJjX3JlY292ZXJfYnVzKCZkZXYtPmFkYXB0ZXIpOwogCQkJfQogCQl9CiAJCWlmIChhbGxvd19zbGVlcCkKQEAgLTMwNCw3ICszODgsNyBAQAogCXN0cnVjdCBkYXZpbmNpX2kyY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldi0+cGRhdGE7CiAJdTMyIGZsYWc7CiAJdTE2IHc7Ci0JaW50IHI7CisJdW5zaWduZWQgbG9uZyB0aW1lX2xlZnQ7CiAKIAkvKiBJbnRyb2R1Y2UgYSBkZWxheSwgcmVxdWlyZWQgZm9yIHNvbWUgYm9hcmRzIChlLmcgRGF2aW5jaSBFVk0pICovCiAJaWYgKHBkYXRhLT5idXNfZGVsYXkpCkBAIC0zNjgsMTEgKzQ1MiwxMSBAQAogCQlmbGFnIHw9IERBVklOQ0lfSTJDX01EUl9TVFA7CiAJZGF2aW5jaV9pMmNfd3JpdGVfcmVnKGRldiwgREFWSU5DSV9JMkNfTURSX1JFRywgZmxhZyk7CiAKLQlyID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZkZXYtPmNtZF9jb21wbGV0ZSwgZGV2LT5hZGFwdGVyLnRpbWVvdXQpOwotCWlmIChyID09IDApIHsKKwl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRldi0+Y21kX2NvbXBsZXRlLAorCQkJCQkJZGV2LT5hZGFwdGVyLnRpbWVvdXQpOworCWlmICghdGltZV9sZWZ0KSB7CiAJCWRldl9lcnIoZGV2LT5kZXYsICJjb250cm9sbGVyIHRpbWVkIG91dFxuIik7Ci0JCWRhdmluY2lfaTJjX3JlY292ZXJfYnVzKGRldik7Ci0JCWkyY19kYXZpbmNpX2luaXQoZGV2KTsKKwkJaTJjX3JlY292ZXJfYnVzKGFkYXApOwogCQlkZXYtPmJ1Zl9sZW4gPSAwOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CkBAIC0zODAsMTcgKzQ2NCwxMyBAQAogCQkvKiBUaGlzIHNob3VsZCBiZSAwIGlmIGFsbCBieXRlcyB3ZXJlIHRyYW5zZmVycmVkCiAJCSAqIG9yIGRldi0+Y21kX2VyciBkZW5vdGVzIGFuIGVycm9yLgogCQkgKi8KLQkJaWYgKHIgPj0gMCkgewotCQkJZGV2X2VycihkZXYtPmRldiwgImFibm9ybWFsIHRlcm1pbmF0aW9uIGJ1Zl9sZW49JWlcbiIsCi0JCQkJZGV2LT5idWZfbGVuKTsKLQkJCXIgPSAtRVJFTU9URUlPOwotCQl9CisJCWRldl9lcnIoZGV2LT5kZXYsICJhYm5vcm1hbCB0ZXJtaW5hdGlvbiBidWZfbGVuPSVpXG4iLAorCQkJZGV2LT5idWZfbGVuKTsKIAkJZGV2LT50ZXJtaW5hdGUgPSAxOwogCQl3bWIoKTsKIAkJZGV2LT5idWZfbGVuID0gMDsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQotCWlmIChyIDwgMCkKLQkJcmV0dXJuIHI7CiAKIAkvKiBubyBlcnJvciAqLwogCWlmIChsaWtlbHkoIWRldi0+Y21kX2VycikpCkBAIC02NzQsNiArNzU0LDEwIEBACiAJCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsICJjbG9jay1mcmVxdWVuY3kiLAogCQkJJnByb3ApKQogCQkJZGV2LT5wZGF0YS0+YnVzX2ZyZXEgPSBwcm9wIC8gMTAwMDsKKworCQlkZXYtPnBkYXRhLT5oYXNfcGZ1bmMgPQorCQkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkgICAgICAidGksaGFzLXBmdW5jIik7CiAJfSBlbHNlIGlmICghZGV2LT5wZGF0YSkgewogCQlkZXYtPnBkYXRhID0gJmRhdmluY2lfaTJjX3BsYXRmb3JtX2RhdGFfZGVmYXVsdDsKIAl9CkBAIC03MTUsNiArNzk5LDE0IEBACiAJYWRhcC0+dGltZW91dCA9IERBVklOQ0lfSTJDX1RJTUVPVVQ7CiAJYWRhcC0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAorCWlmIChkZXYtPnBkYXRhLT5oYXNfcGZ1bmMpCisJCWFkYXAtPmJ1c19yZWNvdmVyeV9pbmZvID0gJmRhdmluY2lfaTJjX3NjbF9yZWNvdmVyeV9pbmZvOworCWVsc2UgaWYgKGRldi0+cGRhdGEtPnNjbF9waW4pIHsKKwkJYWRhcC0+YnVzX3JlY292ZXJ5X2luZm8gPSAmZGF2aW5jaV9pMmNfZ3Bpb19yZWNvdmVyeV9pbmZvOworCQlhZGFwLT5idXNfcmVjb3ZlcnlfaW5mby0+c2NsX2dwaW8gPSBkZXYtPnBkYXRhLT5zY2xfcGluOworCQlhZGFwLT5idXNfcmVjb3ZlcnlfaW5mby0+c2RhX2dwaW8gPSBkZXYtPnBkYXRhLT5zZGFfcGluOworCX0KKwogCWFkYXAtPm5yID0gcGRldi0+aWQ7CiAJciA9IGkyY19hZGRfbnVtYmVyZWRfYWRhcHRlcihhZGFwKTsKIAlpZiAocikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1jb3JlLmMKaW5kZXggNmUyNWMwMS4uNmYxOWEzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLWNvcmUuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtY29yZS5jCkBAIC02NTYsOCArNjU2LDcgQEAKIAlpMmNfZHdfeGZlcl9pbml0KGRldik7CiAKIAkvKiB3YWl0IGZvciB0eCB0byBjb21wbGV0ZSAqLwotCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGV2LT5jbWRfY29tcGxldGUsIEhaKTsKLQlpZiAocmV0ID09IDApIHsKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZGV2LT5jbWRfY29tcGxldGUsIEhaKSkgewogCQlkZXZfZXJyKGRldi0+ZGV2LCAiY29udHJvbGxlciB0aW1lZCBvdXRcbiIpOwogCQkvKiBpMmNfZHdfaW5pdCBpbXBsaWNpdGx5IGRpc2FibGVzIHRoZSBhZGFwdGVyICovCiAJCWkyY19kd19pbml0KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtcGxhdGRydi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kZXNpZ253YXJlLXBsYXRkcnYuYwppbmRleCBjMjcwZjVmLi4wYTgwZTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRlc2lnbndhcmUtcGxhdGRydi5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGVzaWdud2FyZS1wbGF0ZHJ2LmMKQEAgLTE0MywxMCArMTQzLDggQEAKIAl1MzIgY2xrX2ZyZXEsIGh0ID0gMDsKIAogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKGlycSA8IDApIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaXJxIHJlc291cmNlP1xuIik7Ci0JCXJldHVybiBpcnE7IC8qIC1FTlhJTyAqLwotCX0KKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKIAogCWRldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGR3X2kyY19kZXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRldikKQEAgLTE2Niw3ICsxNjQsNyBAQAogCS8qIGZhc3QgbW9kZSBieSBkZWZhdWx0IGJlY2F1c2Ugb2YgbGVnYWN5IHJlYXNvbnMgKi8KIAljbGtfZnJlcSA9IDQwMDAwMDsKIAotCWlmIChBQ1BJX0NPTVBBTklPTigmcGRldi0+ZGV2KSkgeworCWlmIChoYXNfYWNwaV9jb21wYW5pb24oJnBkZXYtPmRldikpIHsKIAkJZHdfaTJjX2FjcGlfY29uZmlndXJlKHBkZXYpOwogCX0gZWxzZSBpZiAocGRldi0+ZGV2Lm9mX25vZGUpIHsKIAkJb2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2Lm9mX25vZGUsCkBAIC0yODYsNyArMjg0LDcgQEAKIAlwbV9ydW50aW1lX3B1dCgmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAKLQlpZiAoQUNQSV9DT01QQU5JT04oJnBkZXYtPmRldikpCisJaWYgKGhhc19hY3BpX2NvbXBhbmlvbigmcGRldi0+ZGV2KSkKIAkJZHdfaTJjX2FjcGlfdW5jb25maWd1cmUocGRldik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGlnaWNvbG9yLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRpZ2ljb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZjFlNTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWRpZ2ljb2xvci5jCkBAIC0wLDAgKzEsMzg1IEBACisvKgorICogSTJDIGJ1cyBkcml2ZXIgZm9yIENvbmV4YW50IERpZ2ljb2xvciBTb0NzCisgKgorICogQXV0aG9yOiBCYXJ1Y2ggU2lhY2ggPGJhcnVjaEB0a29zLmNvLmlsPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBQYXJhZG94IElubm92YXRpb24gTHRkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKworI2RlZmluZSBERUZBVUxUX0ZSRVEJCTEwMDAwMAorI2RlZmluZSBUSU1FT1VUX01TCQkxMDAKKworI2RlZmluZSBJSV9DT05UUk9MCQkweDAKKyNkZWZpbmUgSUlfQ09OVFJPTF9MT0NBTF9SRVNFVAlCSVQoMCkKKworI2RlZmluZSBJSV9DTE9DS1RJTUUJCTB4MQorCisjZGVmaW5lIElJX0NPTU1BTkQJCTB4MgorI2RlZmluZSBJSV9DTURfU1RBUlQJCTEKKyNkZWZpbmUgSUlfQ01EX1JFU1RBUlQJCTIKKyNkZWZpbmUgSUlfQ01EX1NFTkRfQUNLCQkzCisjZGVmaW5lIElJX0NNRF9HRVRfQUNLCQk2CisjZGVmaW5lIElJX0NNRF9HRVRfTk9BQ0sJNworI2RlZmluZSBJSV9DTURfU1RPUAkJMTAKKyNkZWZpbmUgSUlfQ09NTUFORF9HTwkJQklUKDcpCisjZGVmaW5lIElJX0NPTU1BTkRfQ09NUExFVElPTl9TVEFUVVMocikJKCgocikgPj4gNSkgJiAzKQorI2RlZmluZSBJSV9DTURfU1RBVFVTX05PUk1BTAkwCisjZGVmaW5lIElJX0NNRF9TVEFUVVNfQUNLX0dPT0QJMQorI2RlZmluZSBJSV9DTURfU1RBVFVTX0FDS19CQUQJMgorI2RlZmluZSBJSV9DTURfU1RBVFVTX0FCT1JUCTMKKworI2RlZmluZSBJSV9EQVRBCQkJMHgzCisjZGVmaW5lIElJX0lOVEZMQUdfQ0xFQVIJMHg4CisjZGVmaW5lIElJX0lOVEVOQUJMRQkJMHhhCisKK3N0cnVjdCBkY19pMmMgeworCXN0cnVjdCBpMmNfYWRhcHRlcglhZGFwOworCXN0cnVjdCBkZXZpY2UJCSpkZXY7CisJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwlzdHJ1Y3QgY2xrCQkqY2xrOworCXVuc2lnbmVkIGludAkJZnJlcXVlbmN5OworCisJc3RydWN0IGkyY19tc2cJCSptc2c7CisJdW5zaWduZWQgaW50CQltc2didWZfcHRyOworCWludAkJCWxhc3Q7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgY29tcGxldGlvbglkb25lOworCWludAkJCXN0YXRlOworCWludAkJCWVycm9yOworfTsKKworZW51bSB7CisJU1RBVEVfSURMRSwKKwlTVEFURV9TVEFSVCwKKwlTVEFURV9BRERSLAorCVNUQVRFX1dSSVRFLAorCVNUQVRFX1JFQUQsCisJU1RBVEVfU1RPUCwKK307CisKK3N0YXRpYyB2b2lkIGRjX2kyY19jbWQoc3RydWN0IGRjX2kyYyAqaTJjLCB1OCBjbWQpCit7CisJd3JpdGViX3JlbGF4ZWQoY21kIHwgSUlfQ09NTUFORF9HTywgaTJjLT5yZWdzICsgSUlfQ09NTUFORCk7Cit9CisKK3N0YXRpYyB1OCBkY19pMmNfYWRkcl9jbWQoc3RydWN0IGkyY19tc2cgKm1zZykKK3sKKwl1OCBhZGRyID0gKG1zZy0+YWRkciAmIDB4N2YpIDw8IDE7CisKKwlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1JEKQorCQlhZGRyIHw9IDE7CisKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIHZvaWQgZGNfaTJjX2RhdGEoc3RydWN0IGRjX2kyYyAqaTJjLCB1OCBkYXRhKQoreworCXdyaXRlYl9yZWxheGVkKGRhdGEsIGkyYy0+cmVncyArIElJX0RBVEEpOworfQorCitzdGF0aWMgdm9pZCBkY19pMmNfd3JpdGVfYnl0ZShzdHJ1Y3QgZGNfaTJjICppMmMsIHU4IGJ5dGUpCit7CisJZGNfaTJjX2RhdGEoaTJjLCBieXRlKTsKKwlkY19pMmNfY21kKGkyYywgSUlfQ01EX1NFTkRfQUNLKTsKK30KKworc3RhdGljIHZvaWQgZGNfaTJjX3dyaXRlX2J1ZihzdHJ1Y3QgZGNfaTJjICppMmMpCit7CisJZGNfaTJjX3dyaXRlX2J5dGUoaTJjLCBpMmMtPm1zZy0+YnVmW2kyYy0+bXNnYnVmX3B0cisrXSk7Cit9CisKK3N0YXRpYyB2b2lkIGRjX2kyY19uZXh0X3JlYWQoc3RydWN0IGRjX2kyYyAqaTJjKQoreworCWJvb2wgbGFzdCA9IChpMmMtPm1zZ2J1Zl9wdHIgKyAxID09IGkyYy0+bXNnLT5sZW4pOworCisJZGNfaTJjX2NtZChpMmMsIGxhc3QgPyBJSV9DTURfR0VUX05PQUNLIDogSUlfQ01EX0dFVF9BQ0spOworfQorCitzdGF0aWMgdm9pZCBkY19pMmNfc3RvcChzdHJ1Y3QgZGNfaTJjICppMmMpCit7CisJaTJjLT5zdGF0ZSA9IFNUQVRFX1NUT1A7CisJaWYgKGkyYy0+bGFzdCkKKwkJZGNfaTJjX2NtZChpMmMsIElJX0NNRF9TVE9QKTsKKwllbHNlCisJCWNvbXBsZXRlKCZpMmMtPmRvbmUpOworfQorCitzdGF0aWMgdTggZGNfaTJjX3JlYWRfYnl0ZShzdHJ1Y3QgZGNfaTJjICppMmMpCit7CisJcmV0dXJuIHJlYWRiX3JlbGF4ZWQoaTJjLT5yZWdzICsgSUlfREFUQSk7Cit9CisKK3N0YXRpYyB2b2lkIGRjX2kyY19yZWFkX2J1ZihzdHJ1Y3QgZGNfaTJjICppMmMpCit7CisJaTJjLT5tc2ctPmJ1ZltpMmMtPm1zZ2J1Zl9wdHIrK10gPSBkY19pMmNfcmVhZF9ieXRlKGkyYyk7CisJZGNfaTJjX25leHRfcmVhZChpMmMpOworfQorCitzdGF0aWMgdm9pZCBkY19pMmNfc2V0X2lycShzdHJ1Y3QgZGNfaTJjICppMmMsIGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJd3JpdGViX3JlbGF4ZWQoMSwgaTJjLT5yZWdzICsgSUlfSU5URkxBR19DTEVBUik7CisJd3JpdGViX3JlbGF4ZWQoISFlbmFibGUsIGkyYy0+cmVncyArIElJX0lOVEVOQUJMRSk7Cit9CisKK3N0YXRpYyBpbnQgZGNfaTJjX2NtZF9zdGF0dXMoc3RydWN0IGRjX2kyYyAqaTJjKQoreworCXU4IGNtZCA9IHJlYWRiX3JlbGF4ZWQoaTJjLT5yZWdzICsgSUlfQ09NTUFORCk7CisKKwlyZXR1cm4gSUlfQ09NTUFORF9DT01QTEVUSU9OX1NUQVRVUyhjbWQpOworfQorCitzdGF0aWMgdm9pZCBkY19pMmNfc3RhcnRfbXNnKHN0cnVjdCBkY19pMmMgKmkyYywgaW50IGZpcnN0KQoreworCXN0cnVjdCBpMmNfbXNnICptc2cgPSBpMmMtPm1zZzsKKworCWlmICghKG1zZy0+ZmxhZ3MgJiBJMkNfTV9OT1NUQVJUKSkgeworCQlpMmMtPnN0YXRlID0gU1RBVEVfU1RBUlQ7CisJCWRjX2kyY19jbWQoaTJjLCBmaXJzdCA/IElJX0NNRF9TVEFSVCA6IElJX0NNRF9SRVNUQVJUKTsKKwl9IGVsc2UgaWYgKG1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgeworCQlpMmMtPnN0YXRlID0gU1RBVEVfUkVBRDsKKwkJZGNfaTJjX25leHRfcmVhZChpMmMpOworCX0gZWxzZSB7CisJCWkyYy0+c3RhdGUgPSBTVEFURV9XUklURTsKKwkJZGNfaTJjX3dyaXRlX2J1ZihpMmMpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IGRjX2kyY19pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBkY19pMmMgKmkyYyA9IGRldl9pZDsKKwlpbnQgY21kX3N0YXR1cyA9IGRjX2kyY19jbWRfc3RhdHVzKGkyYyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBhZGRyX2NtZDsKKworCXdyaXRlYl9yZWxheGVkKDEsIGkyYy0+cmVncyArIElJX0lOVEZMQUdfQ0xFQVIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyYy0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNtZF9zdGF0dXMgPT0gSUlfQ01EX1NUQVRVU19BQ0tfQkFECisJICAgIHx8IGNtZF9zdGF0dXMgPT0gSUlfQ01EX1NUQVRVU19BQk9SVCkgeworCQlpMmMtPmVycm9yID0gLUVJTzsKKwkJY29tcGxldGUoJmkyYy0+ZG9uZSk7CisJCWdvdG8gb3V0OworCX0KKworCXN3aXRjaCAoaTJjLT5zdGF0ZSkgeworCWNhc2UgU1RBVEVfU1RBUlQ6CisJCWFkZHJfY21kID0gZGNfaTJjX2FkZHJfY21kKGkyYy0+bXNnKTsKKwkJZGNfaTJjX3dyaXRlX2J5dGUoaTJjLCBhZGRyX2NtZCk7CisJCWkyYy0+c3RhdGUgPSBTVEFURV9BRERSOworCQlicmVhazsKKwljYXNlIFNUQVRFX0FERFI6CisJCWlmIChpMmMtPm1zZy0+ZmxhZ3MgJiBJMkNfTV9SRCkgeworCQkJZGNfaTJjX25leHRfcmVhZChpMmMpOworCQkJaTJjLT5zdGF0ZSA9IFNUQVRFX1JFQUQ7CisJCQlicmVhazsKKwkJfQorCQlpMmMtPnN0YXRlID0gU1RBVEVfV1JJVEU7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU1RBVEVfV1JJVEU6CisJCWlmIChpMmMtPm1zZ2J1Zl9wdHIgPCBpMmMtPm1zZy0+bGVuKQorCQkJZGNfaTJjX3dyaXRlX2J1ZihpMmMpOworCQllbHNlCisJCQlkY19pMmNfc3RvcChpMmMpOworCQlicmVhazsKKwljYXNlIFNUQVRFX1JFQUQ6CisJCWlmIChpMmMtPm1zZ2J1Zl9wdHIgPCBpMmMtPm1zZy0+bGVuKQorCQkJZGNfaTJjX3JlYWRfYnVmKGkyYyk7CisJCWVsc2UKKwkJCWRjX2kyY19zdG9wKGkyYyk7CisJCWJyZWFrOworCWNhc2UgU1RBVEVfU1RPUDoKKwkJaTJjLT5zdGF0ZSA9IFNUQVRFX0lETEU7CisJCWNvbXBsZXRlKCZpMmMtPmRvbmUpOworCQlicmVhazsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMmMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgZGNfaTJjX3hmZXJfbXNnKHN0cnVjdCBkY19pMmMgKmkyYywgc3RydWN0IGkyY19tc2cgKm1zZywgaW50IGZpcnN0LAorCQkJICAgaW50IGxhc3QpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhUSU1FT1VUX01TKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyYy0+bG9jaywgZmxhZ3MpOworCWkyYy0+bXNnID0gbXNnOworCWkyYy0+bXNnYnVmX3B0ciA9IDA7CisJaTJjLT5sYXN0ID0gbGFzdDsKKwlpMmMtPmVycm9yID0gMDsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZpMmMtPmRvbmUpOworCWRjX2kyY19zZXRfaXJxKGkyYywgMSk7CisJZGNfaTJjX3N0YXJ0X21zZyhpMmMsIGZpcnN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMmMtPmxvY2ssIGZsYWdzKTsKKworCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmkyYy0+ZG9uZSwgdGltZW91dCk7CisJZGNfaTJjX3NldF9pcnEoaTJjLCAwKTsKKwlpZiAodGltZW91dCA9PSAwKSB7CisJCWkyYy0+c3RhdGUgPSBTVEFURV9JRExFOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlpZiAoaTJjLT5lcnJvcikKKwkJcmV0dXJuIGkyYy0+ZXJyb3I7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkY19pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKQoreworCXN0cnVjdCBkY19pMmMgKmkyYyA9IGFkYXAtPmFsZ29fZGF0YTsKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXJldCA9IGRjX2kyY194ZmVyX21zZyhpMmMsICZtc2dzW2ldLCBpID09IDAsIGkgPT0gbnVtIC0gMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBudW07Cit9CisKK3N0YXRpYyBpbnQgZGNfaTJjX2luaXRfaHcoc3RydWN0IGRjX2kyYyAqaTJjKQoreworCXVuc2lnbmVkIGxvbmcgY2xrX3JhdGUgPSBjbGtfZ2V0X3JhdGUoaTJjLT5jbGspOworCXVuc2lnbmVkIGludCBjbG9ja3RpbWU7CisKKwl3cml0ZWJfcmVsYXhlZChJSV9DT05UUk9MX0xPQ0FMX1JFU0VULCBpMmMtPnJlZ3MgKyBJSV9DT05UUk9MKTsKKwl1ZGVsYXkoMTAwKTsKKwl3cml0ZWJfcmVsYXhlZCgwLCBpMmMtPnJlZ3MgKyBJSV9DT05UUk9MKTsKKwl1ZGVsYXkoMTAwKTsKKworCWNsb2NrdGltZSA9IERJVl9ST1VORF9VUChjbGtfcmF0ZSwgNjQgKiBpMmMtPmZyZXF1ZW5jeSk7CisJaWYgKGNsb2NrdGltZSA8IDEgfHwgY2xvY2t0aW1lID4gMHhmZikgeworCQlkZXZfZXJyKGkyYy0+ZGV2LCAiY2FuJ3Qgc2V0IGJ1cyBzcGVlZCBvZiAldSBIelxuIiwKKwkJCWkyYy0+ZnJlcXVlbmN5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdyaXRlYl9yZWxheGVkKGNsb2NrdGltZSAtIDEsIGkyYy0+cmVncyArIElJX0NMT0NLVElNRSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBkY19pMmNfZnVuYyhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUwgfCBJMkNfRlVOQ19OT1NUQVJUOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19hbGdvcml0aG0gZGNfaTJjX2FsZ29yaXRobSA9IHsKKwkubWFzdGVyX3hmZXIJPSBkY19pMmNfeGZlciwKKwkuZnVuY3Rpb25hbGl0eQk9IGRjX2kyY19mdW5jLAorfTsKKworc3RhdGljIGludCBkY19pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGRjX2kyYyAqaTJjOworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlpbnQgcmV0ID0gMCwgaXJxOworCisJaTJjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZGNfaTJjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpMmMpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwKKwkJCQkgJmkyYy0+ZnJlcXVlbmN5KSkKKwkJaTJjLT5mcmVxdWVuY3kgPSBERUZBVUxUX0ZSRVE7CisKKwlpMmMtPmRldiA9ICZwZGV2LT5kZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjKTsKKworCXNwaW5fbG9ja19pbml0KCZpMmMtPmxvY2spOworCWluaXRfY29tcGxldGlvbigmaTJjLT5kb25lKTsKKworCWkyYy0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoaTJjLT5jbGspKQorCQlyZXR1cm4gUFRSX0VSUihpMmMtPmNsayk7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpMmMtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcik7CisJaWYgKElTX0VSUihpMmMtPnJlZ3MpKQorCQlyZXR1cm4gUFRSX0VSUihpMmMtPnJlZ3MpOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkKKwkJcmV0dXJuIGlycTsKKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgaXJxLCBkY19pMmNfaXJxLCAwLAorCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCBpMmMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3RybGNweShpMmMtPmFkYXAubmFtZSwgIkNvbmV4YW50IERpZ2ljb2xvciBJMkMgYWRhcHRlciIsCisJCXNpemVvZihpMmMtPmFkYXAubmFtZSkpOworCWkyYy0+YWRhcC5vd25lciA9IFRISVNfTU9EVUxFOworCWkyYy0+YWRhcC5hbGdvID0gJmRjX2kyY19hbGdvcml0aG07CisJaTJjLT5hZGFwLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCWkyYy0+YWRhcC5kZXYub2Zfbm9kZSA9IG5wOworCWkyYy0+YWRhcC5hbGdvX2RhdGEgPSBpMmM7CisKKwlyZXQgPSBkY19pMmNfaW5pdF9odyhpMmMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoaTJjLT5jbGspOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZpMmMtPmFkYXApOworCWlmIChyZXQgPCAwKSB7CisJCWNsa191bnByZXBhcmUoaTJjLT5jbGspOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRjX2kyY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGNfaTJjICppMmMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWkyY19kZWxfYWRhcHRlcigmaTJjLT5hZGFwKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaTJjLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGRjX2kyY19tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiY254dCxjeDkyNzU1LWkyYyIgfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkY19pMmNfZHJpdmVyID0geworCS5wcm9iZSAgID0gZGNfaTJjX3Byb2JlLAorCS5yZW1vdmUgID0gZGNfaTJjX3JlbW92ZSwKKwkuZHJpdmVyICA9IHsKKwkJLm5hbWUgID0gImRpZ2ljb2xvci1pMmMiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBkY19pMmNfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGRjX2kyY19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJCYXJ1Y2ggU2lhY2ggPGJhcnVjaEB0a29zLmNvLmlsPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb25leGFudCBEaWdpY29sb3IgSTJDIG1hc3RlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZGxuMi5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kbG4yLmMKaW5kZXggYjNmYjg2YS4uMTYwMGVkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kbG4yLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1kbG4yLmMKQEAgLTE0NCw3ICsxNDQsNiBAQAogewogCXN0cnVjdCBkbG4yX2kyYyAqZGxuMiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcHRlcik7CiAJc3RydWN0IGkyY19tc2cgKnBtc2c7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJmRsbjItPmFkYXB0ZXIuZGV2OwogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CkBAIC0xNTIsMTEgKzE1MSw2IEBACiAKIAkJcG1zZyA9ICZtc2dzW2ldOwogCi0JCWlmIChwbXNnLT5sZW4gPiBETE4yX0kyQ19NQVhfWEZFUl9TSVpFKSB7Ci0JCQlkZXZfd2FybihkZXYsICJtYXhpbXVtIHRyYW5zZmVyIHNpemUgZXhjZWVkZWRcbiIpOwotCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQl9Ci0KIAkJaWYgKHBtc2ctPmZsYWdzICYgSTJDX01fUkQpIHsKIAkJCXJldCA9IGRsbjJfaTJjX3JlYWQoZGxuMiwgcG1zZy0+YWRkciwgcG1zZy0+YnVmLAogCQkJCQkgICAgcG1zZy0+bGVuKTsKQEAgLTE4Nyw2ICsxODEsMTEgQEAKIAkuZnVuY3Rpb25hbGl0eSA9IGRsbjJfaTJjX2Z1bmMsCiB9OwogCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyX3F1aXJrcyBkbG4yX2kyY19xdWlya3MgPSB7CisJLm1heF9yZWFkX2xlbiA9IERMTjJfSTJDX01BWF9YRkVSX1NJWkUsCisJLm1heF93cml0ZV9sZW4gPSBETE4yX0kyQ19NQVhfWEZFUl9TSVpFLAorfTsKKwogc3RhdGljIGludCBkbG4yX2kyY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWludCByZXQ7CkBAIC0yMDksNyArMjA4LDkgQEAKIAlkbG4yLT5hZGFwdGVyLm93bmVyID0gVEhJU19NT0RVTEU7CiAJZGxuMi0+YWRhcHRlci5jbGFzcyA9IEkyQ19DTEFTU19IV01PTjsKIAlkbG4yLT5hZGFwdGVyLmFsZ28gPSAmZGxuMl9pMmNfdXNiX2FsZ29yaXRobTsKKwlkbG4yLT5hZGFwdGVyLnF1aXJrcyA9ICZkbG4yX2kyY19xdWlya3M7CiAJZGxuMi0+YWRhcHRlci5kZXYucGFyZW50ID0gZGV2OworCWRsbjItPmFkYXB0ZXIuZGV2Lm9mX25vZGUgPSBkZXYtPm9mX25vZGU7CiAJaTJjX3NldF9hZGFwZGF0YSgmZGxuMi0+YWRhcHRlciwgZGxuMik7CiAJc25wcmludGYoZGxuMi0+YWRhcHRlci5uYW1lLCBzaXplb2YoZGxuMi0+YWRhcHRlci5uYW1lKSwgIiVzLSVzLSVkIiwKIAkJICJkbG4yLWkyYyIsIGRldl9uYW1lKHBkZXYtPmRldi5wYXJlbnQpLCBkbG4yLT5wb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaTgwMS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKaW5kZXggOGZhZmIyNS4uNWVjYmIzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pODAxLmMKQEAgLTIyMyw4ICsyMjMsNiBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaTgwMV9kcml2ZXI7Ci0KICNkZWZpbmUgRkVBVFVSRV9TTUJVU19QRUMJKDEgPDwgMCkKICNkZWZpbmUgRkVBVFVSRV9CTE9DS19CVUZGRVIJKDEgPDwgMSkKICNkZWZpbmUgRkVBVFVSRV9CTE9DS19QUk9DCSgxIDw8IDIpCkBAIC0xMTQwLDcgKzExMzgsNyBAQAogCWludCBlcnIsIGk7CiAJc3RydWN0IGk4MDFfcHJpdiAqcHJpdjsKIAotCXByaXYgPSBremFsbG9jKHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCXByaXYgPSBkZXZtX2t6YWxsb2MoJmRldi0+ZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xMTgyLDM0ICsxMTgwLDM1IEBACiAJfQogCXByaXYtPmZlYXR1cmVzICY9IH5kaXNhYmxlX2ZlYXR1cmVzOwogCi0JZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwllcnIgPSBwY2ltX2VuYWJsZV9kZXZpY2UoZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBTTUJ1cyBQQ0kgZGV2aWNlICglZClcbiIsCiAJCQllcnIpOwotCQlnb3RvIGV4aXQ7CisJCXJldHVybiBlcnI7CiAJfQorCXBjaW1fcGluX2RldmljZShkZXYpOwogCiAJLyogRGV0ZXJtaW5lIHRoZSBhZGRyZXNzIG9mIHRoZSBTTUJ1cyBhcmVhICovCiAJcHJpdi0+c21iYSA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIFNNQkJBUik7CiAJaWYgKCFwcml2LT5zbWJhKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiU01CdXMgYmFzZSBhZGRyZXNzIHVuaW5pdGlhbGl6ZWQsICIKLQkJCSJ1cGdyYWRlIEJJT1NcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGV4aXQ7CisJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJIlNNQnVzIGJhc2UgYWRkcmVzcyB1bmluaXRpYWxpemVkLCB1cGdyYWRlIEJJT1NcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAllcnIgPSBhY3BpX2NoZWNrX3Jlc291cmNlX2NvbmZsaWN0KCZkZXYtPnJlc291cmNlW1NNQkJBUl0pOwogCWlmIChlcnIpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBleGl0OworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb24oZGV2LCBTTUJCQVIsIGk4MDFfZHJpdmVyLm5hbWUpOworCWVyciA9IHBjaW1faW9tYXBfcmVnaW9ucyhkZXYsIDEgPDwgU01CQkFSLAorCQkJCSBkZXZfZHJpdmVyX3N0cmluZygmZGV2LT5kZXYpKTsKIAlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgU01CdXMgcmVnaW9uICIKLQkJCSIweCVseC0weCVMeFxuIiwgcHJpdi0+c21iYSwKKwkJZGV2X2VycigmZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIHJlcXVlc3QgU01CdXMgcmVnaW9uIDB4JWx4LTB4JUx4XG4iLAorCQkJcHJpdi0+c21iYSwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcGNpX3Jlc291cmNlX2VuZChkZXYsIFNNQkJBUikpOwotCQlnb3RvIGV4aXQ7CisJCXJldHVybiBlcnI7CiAJfQogCiAJcGNpX3JlYWRfY29uZmlnX2J5dGUocHJpdi0+cGNpX2RldiwgU01CSFNUQ0ZHLCAmdGVtcCk7CkBAIC0xMjU0LDggKzEyNTMsOSBAQAogCWlmIChwcml2LT5mZWF0dXJlcyAmIEZFQVRVUkVfSVJRKSB7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPndhaXRxKTsKIAotCQllcnIgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgaTgwMV9pc3IsIElSUUZfU0hBUkVELAotCQkJCSAgaTgwMV9kcml2ZXIubmFtZSwgcHJpdik7CisJCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoJmRldi0+ZGV2LCBkZXYtPmlycSwgaTgwMV9pc3IsCisJCQkJICAgICAgIElSUUZfU0hBUkVELAorCQkJCSAgICAgICBkZXZfZHJpdmVyX3N0cmluZygmZGV2LT5kZXYpLCBwcml2KTsKIAkJaWYgKGVycikgewogCQkJZGV2X2VycigmZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgaXJxICVkOiAlZFxuIiwKIAkJCQlkZXYtPmlycSwgZXJyKTsKQEAgLTEyNzYsNyArMTI3Niw3IEBACiAJZXJyID0gaTJjX2FkZF9hZGFwdGVyKCZwcml2LT5hZGFwdGVyKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJmRldi0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBTTUJ1cyBhZGFwdGVyXG4iKTsKLQkJZ290byBleGl0X2ZyZWVfaXJxOworCQlyZXR1cm4gZXJyOwogCX0KIAogCWk4MDFfcHJvYmVfb3B0aW9uYWxfc2xhdmVzKHByaXYpOwpAQCAtMTI4NiwxNCArMTI4Niw2IEBACiAJcGNpX3NldF9kcnZkYXRhKGRldiwgcHJpdik7CiAKIAlyZXR1cm4gMDsKLQotZXhpdF9mcmVlX2lycToKLQlpZiAocHJpdi0+ZmVhdHVyZXMgJiBGRUFUVVJFX0lSUSkKLQkJZnJlZV9pcnEoZGV2LT5pcnEsIHByaXYpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbihkZXYsIFNNQkJBUik7Ci1leGl0OgotCWtmcmVlKHByaXYpOwotCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIGk4MDFfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpkZXYpCkBAIC0xMzA0LDExICsxMjk2LDYgQEAKIAlpMmNfZGVsX2FkYXB0ZXIoJnByaXYtPmFkYXB0ZXIpOwogCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIFNNQkhTVENGRywgcHJpdi0+b3JpZ2luYWxfaHN0Y2ZnKTsKIAotCWlmIChwcml2LT5mZWF0dXJlcyAmIEZFQVRVUkVfSVJRKQotCQlmcmVlX2lycShkZXYtPmlycSwgcHJpdik7Ci0JcGNpX3JlbGVhc2VfcmVnaW9uKGRldiwgU01CQkFSKTsKLQotCWtmcmVlKHByaXYpOwogCS8qCiAJICogZG8gbm90IGNhbGwgcGNpX2Rpc2FibGVfZGV2aWNlKGRldikgc2luY2UgaXQgY2FuIGNhdXNlIGhhcmQgaGFuZ3Mgb24KIAkgKiBzb21lIHN5c3RlbXMgZHVyaW5nIHBvd2VyLW9mZiAoZWcuIEZ1aml0c3UtU2llbWVucyBMaWZlYm9vayBFODAxMCkKQEAgLTEzMzAsNyArMTMxNyw3IEBACiB7CiAJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKLQlyZXR1cm4gcGNpX2VuYWJsZV9kZXZpY2UoZGV2KTsKKwlyZXR1cm4gMDsKIH0KICNlbHNlCiAjZGVmaW5lIGk4MDFfc3VzcGVuZCBOVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWltZy1zY2IuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW1nLXNjYi5jCmluZGV4IDBmY2MxNjkuLjAwZmZkNjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW1nLXNjYi5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW1nLXNjYi5jCkBAIC05ODgsMTUgKzk4OCwxNiBAQAogc3RhdGljIGludCBpbWdfaTJjX3Jlc2V0X2J1cyhzdHJ1Y3QgaW1nX2kyYyAqaTJjKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHRpbWVfbGVmdDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpMmMtPmxvY2ssIGZsYWdzKTsKIAlyZWluaXRfY29tcGxldGlvbigmaTJjLT5tc2dfY29tcGxldGUpOwogCWltZ19pMmNfcmVzZXRfc3RhcnQoaTJjKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMmMtPmxvY2ssIGZsYWdzKTsKIAotCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaTJjLT5tc2dfY29tcGxldGUsIElNR19JMkNfVElNRU9VVCk7Ci0JaWYgKHJldCA9PSAwKQorCXRpbWVfbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaTJjLT5tc2dfY29tcGxldGUsCisJCQkJCSAgICAgIElNR19JMkNfVElNRU9VVCk7CisJaWYgKHRpbWVfbGVmdCA9PSAwKQogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwMDcsNiArMTAwOCw3IEBACiAJc3RydWN0IGltZ19pMmMgKmkyYyA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CiAJYm9vbCBhdG9taWMgPSBmYWxzZTsKIAlpbnQgaSwgcmV0OworCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OwogCiAJaWYgKGkyYy0+bW9kZSA9PSBNT0RFX1NVU1BFTkQpIHsKIAkJV0FSTigxLCAicmVmdXNpbmcgdG8gc2VydmljZSB0cmFuc2FjdGlvbiBpbiBzdXNwZW5kZWQgc3RhdGVcbiIpOwpAQCAtMTA2OCwxMSArMTA3MCwxMSBAQAogCQkJaW1nX2kyY193cml0ZShpMmMpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMmMtPmxvY2ssIGZsYWdzKTsKIAotCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmkyYy0+bXNnX2NvbXBsZXRlLAotCQkJCQkJICBJTUdfSTJDX1RJTUVPVVQpOworCQl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmkyYy0+bXNnX2NvbXBsZXRlLAorCQkJCQkJICAgICAgSU1HX0kyQ19USU1FT1VUKTsKIAkJZGVsX3RpbWVyX3N5bmMoJmkyYy0+Y2hlY2tfdGltZXIpOwogCi0JCWlmIChyZXQgPT0gMCkgeworCQlpZiAodGltZV9sZWZ0ID09IDApIHsKIAkJCWRldl9lcnIoYWRhcC0+ZGV2LnBhcmVudCwgImkyYyB0cmFuc2ZlciB0aW1lZCBvdXRcbiIpOwogCQkJaTJjLT5tc2dfc3RhdHVzID0gLUVUSU1FRE9VVDsKIAkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbXguYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtaW14LmMKaW5kZXggZDdiMjZmYy4uYTUzYTdkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pbXguYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlteC5jCkBAIC02MDEsNiArNjAxLDcgQEAKIAkJCQkJc3RydWN0IGkyY19tc2cgKm1zZ3MpCiB7CiAJaW50IHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHRpbWVfbGVmdDsKIAl1bnNpZ25lZCBpbnQgdGVtcCA9IDA7CiAJdW5zaWduZWQgbG9uZyBvcmlnX2ppZmZpZXMgPSBqaWZmaWVzOwogCXN0cnVjdCBpbXhfaTJjX2RtYSAqZG1hID0gaTJjX2lteC0+ZG1hOwpAQCAtNjI0LDEwICs2MjUsMTAgQEAKIAkgKi8KIAlpbXhfaTJjX3dyaXRlX3JlZyhtc2dzLT5hZGRyIDw8IDEsIGkyY19pbXgsIElNWF9JMkNfSTJEUik7CiAJcmVpbml0X2NvbXBsZXRpb24oJmkyY19pbXgtPmRtYS0+Y21kX2NvbXBsZXRlKTsKLQlyZXN1bHQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoCisJdGltZV9sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KAogCQkJCSZpMmNfaW14LT5kbWEtPmNtZF9jb21wbGV0ZSwKIAkJCQltc2Vjc190b19qaWZmaWVzKERNQV9USU1FT1VUKSk7Ci0JaWYgKHJlc3VsdCA9PSAwKSB7CisJaWYgKHRpbWVfbGVmdCA9PSAwKSB7CiAJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGRtYS0+Y2hhbl91c2luZyk7CiAJCXJldHVybiAtRVRJTUVET1VUOwogCX0KQEAgLTY2Myw2ICs2NjQsNyBAQAogCQkJc3RydWN0IGkyY19tc2cgKm1zZ3MsIGJvb2wgaXNfbGFzdG1zZykKIHsKIAlpbnQgcmVzdWx0OworCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OwogCXVuc2lnbmVkIGludCB0ZW1wOwogCXVuc2lnbmVkIGxvbmcgb3JpZ19qaWZmaWVzID0gamlmZmllczsKIAlzdHJ1Y3QgaW14X2kyY19kbWEgKmRtYSA9IGkyY19pbXgtPmRtYTsKQEAgLTY4MiwxMCArNjg0LDEwIEBACiAJCXJldHVybiByZXN1bHQ7CiAKIAlyZWluaXRfY29tcGxldGlvbigmaTJjX2lteC0+ZG1hLT5jbWRfY29tcGxldGUpOwotCXJlc3VsdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgKKwl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoCiAJCQkJJmkyY19pbXgtPmRtYS0+Y21kX2NvbXBsZXRlLAogCQkJCW1zZWNzX3RvX2ppZmZpZXMoRE1BX1RJTUVPVVQpKTsKLQlpZiAocmVzdWx0ID09IDApIHsKKwlpZiAodGltZV9sZWZ0ID09IDApIHsKIAkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoZG1hLT5jaGFuX3VzaW5nKTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1pc210LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzbXQuYwppbmRleCBmMmIwZmYwLi5mOTk0NzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzbXQuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWlzbXQuYwpAQCAtMzgwLDYgKzM4MCw3IEBACiAJCSAgICAgICBpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCiB7CiAJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHRpbWVfbGVmdDsKIAlkbWFfYWRkcl90IGRtYV9hZGRyID0gMDsgLyogYWRkcmVzcyBvZiB0aGUgZGF0YSBidWZmZXIgKi8KIAl1OCBkbWFfc2l6ZSA9IDA7CiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2RpcmVjdGlvbiA9IDA7CkBAIC01NzgsMTMgKzU3OSwxMyBAQAogCWlzbXRfc3VibWl0X2Rlc2MocHJpdik7CiAKIAkvKiBOb3cgd2Ugd2FpdCBmb3IgaW50ZXJydXB0IGNvbXBsZXRpb24sIDFzICovCi0JcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZwcml2LT5jbXAsIEhaKjEpOworCXRpbWVfbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcHJpdi0+Y21wLCBIWioxKTsKIAogCS8qIHVubWFwIHRoZSBkYXRhIGJ1ZmZlciAqLwogCWlmIChkbWFfc2l6ZSAhPSAwKQogCQlkbWFfdW5tYXBfc2luZ2xlKCZhZGFwLT5kZXYsIGRtYV9hZGRyLCBkbWFfc2l6ZSwgZG1hX2RpcmVjdGlvbik7CiAKLQlpZiAodW5saWtlbHkoIXJldCkpIHsKKwlpZiAodW5saWtlbHkoIXRpbWVfbGVmdCkpIHsKIAkJZGV2X2VycihkZXYsICJjb21wbGV0aW9uIHdhaXQgdGltZWQgb3V0XG4iKTsKIAkJcmV0ID0gLUVUSU1FRE9VVDsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWp6NDc4MC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1qejQ3ODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTFkNjkzMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtano0NzgwLmMKQEAgLTAsMCArMSw4MzIgQEAKKy8qCisgKiBJbmdlbmljIEpaNDc4MCBJMkMgYnVzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMDkgSW5nZW5pYyBTZW1pY29uZHVjdG9yIEluYy4KKyAqIENvcHlyaWdodCAoQykgMjAxNSBJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2RlZmluZSBKWjQ3ODBfSTJDX0NUUkwJCTB4MDAKKyNkZWZpbmUgSlo0NzgwX0kyQ19UQVIJCTB4MDQKKyNkZWZpbmUgSlo0NzgwX0kyQ19TQVIJCTB4MDgKKyNkZWZpbmUgSlo0NzgwX0kyQ19EQwkJMHgxMAorI2RlZmluZSBKWjQ3ODBfSTJDX1NIQ05UCTB4MTQKKyNkZWZpbmUgSlo0NzgwX0kyQ19TTENOVAkweDE4CisjZGVmaW5lIEpaNDc4MF9JMkNfRkhDTlQJMHgxQworI2RlZmluZSBKWjQ3ODBfSTJDX0ZMQ05UCTB4MjAKKyNkZWZpbmUgSlo0NzgwX0kyQ19JTlRTVAkweDJDCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UTQkJMHgzMAorI2RlZmluZSBKWjQ3ODBfSTJDX1JYVEwJCTB4MzgKKyNkZWZpbmUgSlo0NzgwX0kyQ19UWFRMCQkweDNDCisjZGVmaW5lIEpaNDc4MF9JMkNfQ0lOVFIJMHg0MAorI2RlZmluZSBKWjQ3ODBfSTJDX0NSWFVGCTB4NDQKKyNkZWZpbmUgSlo0NzgwX0kyQ19DUlhPRgkweDQ4CisjZGVmaW5lIEpaNDc4MF9JMkNfQ1RYT0YJMHg0QworI2RlZmluZSBKWjQ3ODBfSTJDX0NSWFJFUQkweDUwCisjZGVmaW5lIEpaNDc4MF9JMkNfQ1RYQUJSVAkweDU0CisjZGVmaW5lIEpaNDc4MF9JMkNfQ1JYRE9ORQkweDU4CisjZGVmaW5lIEpaNDc4MF9JMkNfQ0FDVAkJMHg1QworI2RlZmluZSBKWjQ3ODBfSTJDX0NTVFAJCTB4NjAKKyNkZWZpbmUgSlo0NzgwX0kyQ19DU1RUCQkweDY0CisjZGVmaW5lIEpaNDc4MF9JMkNfQ0dDCQkweDY4CisjZGVmaW5lIEpaNDc4MF9JMkNfRU5CCQkweDZDCisjZGVmaW5lIEpaNDc4MF9JMkNfU1RBCQkweDcwCisjZGVmaW5lIEpaNDc4MF9JMkNfVFhBQlJUCTB4ODAKKyNkZWZpbmUgSlo0NzgwX0kyQ19ETUFDUgkweDg4CisjZGVmaW5lIEpaNDc4MF9JMkNfRE1BVERMUgkweDhDCisjZGVmaW5lIEpaNDc4MF9JMkNfRE1BUkRMUgkweDkwCisjZGVmaW5lIEpaNDc4MF9JMkNfU0RBU1UJMHg5NAorI2RlZmluZSBKWjQ3ODBfSTJDX0FDS0dDCTB4OTgKKyNkZWZpbmUgSlo0NzgwX0kyQ19FTlNUQQkweDlDCisjZGVmaW5lIEpaNDc4MF9JMkNfU0RBSEQJMHhEMAorCisjZGVmaW5lIEpaNDc4MF9JMkNfQ1RSTF9TVFBITEQJCUJJVCg3KQorI2RlZmluZSBKWjQ3ODBfSTJDX0NUUkxfU0xWRElTCQlCSVQoNikKKyNkZWZpbmUgSlo0NzgwX0kyQ19DVFJMX1JFU1QJCUJJVCg1KQorI2RlZmluZSBKWjQ3ODBfSTJDX0NUUkxfTUFUUAkJQklUKDQpCisjZGVmaW5lIEpaNDc4MF9JMkNfQ1RSTF9TQVRQCQlCSVQoMykKKyNkZWZpbmUgSlo0NzgwX0kyQ19DVFJMX1NQREYJCUJJVCgyKQorI2RlZmluZSBKWjQ3ODBfSTJDX0NUUkxfU1BEUwkJQklUKDEpCisjZGVmaW5lIEpaNDc4MF9JMkNfQ1RSTF9NRAkJQklUKDApCisKKyNkZWZpbmUgSlo0NzgwX0kyQ19TVEFfU0xWQUNUCQlCSVQoNikKKyNkZWZpbmUgSlo0NzgwX0kyQ19TVEFfTVNUQUNUCQlCSVQoNSkKKyNkZWZpbmUgSlo0NzgwX0kyQ19TVEFfUkZGCQlCSVQoNCkKKyNkZWZpbmUgSlo0NzgwX0kyQ19TVEFfUkZORQkJQklUKDMpCisjZGVmaW5lIEpaNDc4MF9JMkNfU1RBX1RGRQkJQklUKDIpCisjZGVmaW5lIEpaNDc4MF9JMkNfU1RBX1RGTkYJCUJJVCgxKQorI2RlZmluZSBKWjQ3ODBfSTJDX1NUQV9BQ1QJCUJJVCgwKQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGp6NDc4MF9pMmNfYWJydF9zcmNbXSA9IHsKKwkiQUJSVF83Ql9BRERSX05PQUNLIiwKKwkiQUJSVF8xMEFERFIxX05PQUNLIiwKKwkiQUJSVF8xMEFERFIyX05PQUNLIiwKKwkiQUJSVF9YREFUQV9OT0FDSyIsCisJIkFCUlRfR0NBTExfTk9BQ0siLAorCSJBQlJUX0dDQUxMX1JFQUQiLAorCSJBQlJUX0hTX0FDS0QiLAorCSJTQllURV9BQ0tERVQiLAorCSJBQlJUX0hTX05PUlNUUlQiLAorCSJTQllURV9OT1JTVFJUIiwKKwkiQUJSVF8xMEJfUkRfTk9SU1RSVCIsCisJIkFCUlRfTUFTVEVSX0RJUyIsCisJIkFSQl9MT1NUIiwKKwkiU0xWRkxVU0hfVFhGSUZPIiwKKwkiU0xWX0FSQkxPU1QiLAorCSJTTFZSRF9JTlRYIiwKK307CisKKyNkZWZpbmUgSlo0NzgwX0kyQ19JTlRTVF9JR0MJCUJJVCgxMSkKKyNkZWZpbmUgSlo0NzgwX0kyQ19JTlRTVF9JU1RUCQlCSVQoMTApCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UU1RfSVNUUAkJQklUKDkpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UU1RfSUFDVAkJQklUKDgpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UU1RfUlhETgkJQklUKDcpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UU1RfVFhBQlQJCUJJVCg2KQorI2RlZmluZSBKWjQ3ODBfSTJDX0lOVFNUX1JEUkVRCQlCSVQoNSkKKyNkZWZpbmUgSlo0NzgwX0kyQ19JTlRTVF9UWEVNUAkJQklUKDQpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UU1RfVFhPRgkJQklUKDMpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UU1RfUlhGTAkJQklUKDIpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UU1RfUlhPRgkJQklUKDEpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UU1RfUlhVRgkJQklUKDApCisKKyNkZWZpbmUgSlo0NzgwX0kyQ19JTlRNX01JR0MJCUJJVCgxMSkKKyNkZWZpbmUgSlo0NzgwX0kyQ19JTlRNX01JU1RUCQlCSVQoMTApCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UTV9NSVNUUAkJQklUKDkpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UTV9NSUFDVAkJQklUKDgpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UTV9NUlhETgkJQklUKDcpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UTV9NVFhBQlQJCUJJVCg2KQorI2RlZmluZSBKWjQ3ODBfSTJDX0lOVE1fTVJEUkVRCQlCSVQoNSkKKyNkZWZpbmUgSlo0NzgwX0kyQ19JTlRNX01UWEVNUAkJQklUKDQpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UTV9NVFhPRgkJQklUKDMpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UTV9NUlhGTAkJQklUKDIpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UTV9NUlhPRgkJQklUKDEpCisjZGVmaW5lIEpaNDc4MF9JMkNfSU5UTV9NUlhVRgkJQklUKDApCisKKyNkZWZpbmUgSlo0NzgwX0kyQ19EQ19SRUFECQlCSVQoOCkKKworI2RlZmluZSBKWjQ3ODBfSTJDX1NEQUhEX0hERU5CCQlCSVQoOCkKKworI2RlZmluZSBKWjQ3ODBfSTJDX0VOQl9JMkMJCUJJVCgwKQorCisjZGVmaW5lIEpaNDc4MF9JMkNTSENOVF9BREpVU1QobikJKCgobikgLSA4KSA8IDYgPyA2IDogKChuKSAtIDgpKQorI2RlZmluZSBKWjQ3ODBfSTJDU0xDTlRfQURKVVNUKG4pCSgoKG4pIC0gMSkgPCA4ID8gOCA6ICgobikgLSAxKSkKKyNkZWZpbmUgSlo0NzgwX0kyQ0ZIQ05UX0FESlVTVChuKQkoKChuKSAtIDgpIDwgNiA/IDYgOiAoKG4pIC0gOCkpCisjZGVmaW5lIEpaNDc4MF9JMkNGTENOVF9BREpVU1QobikJKCgobikgLSAxKSA8IDggPyA4IDogKChuKSAtIDEpKQorCisjZGVmaW5lIEpaNDc4MF9JMkNfRklGT19MRU4JMTYKKyNkZWZpbmUgVFhfTEVWRUwJCTMKKyNkZWZpbmUgUlhfTEVWRUwJCShKWjQ3ODBfSTJDX0ZJRk9fTEVOIC0gVFhfTEVWRUwgLSAxKQorCisjZGVmaW5lIEpaNDc4MF9JMkNfVElNRU9VVAkzMDAKKworI2RlZmluZSBCVUZTSVpFIDIwMAorCitzdHJ1Y3Qgano0NzgwX2kyYyB7CisJdm9pZCBfX2lvbWVtCQkqaW9tZW07CisJaW50CQkJIGlycTsKKwlzdHJ1Y3QgY2xrCQkqY2xrOworCXN0cnVjdCBpMmNfYWRhcHRlcgkgYWRhcDsKKworCS8qIGxvY2sgdG8gcHJvdGVjdCByYnVmIGFuZCB3YnVmIGJldHdlZW4geGZlcl9yZC93ciBhbmQgaXJxIGhhbmRsZXIgKi8KKwlzcGlubG9ja190CQlsb2NrOworCisJLyogYmVnaW5uaW5nIG9mIGxvY2sgc2NvcGUgKi8KKwl1bnNpZ25lZCBjaGFyCQkqcmJ1ZjsKKwlpbnQJCQlyZF90b3RhbF9sZW47CisJaW50CQkJcmRfZGF0YV94ZmVyZWQ7CisJaW50CQkJcmRfY21kX3hmZXJlZDsKKworCXVuc2lnbmVkIGNoYXIJCSp3YnVmOworCWludAkJCXd0X2xlbjsKKworCWludAkJCWlzX3dyaXRlOworCWludAkJCXN0b3BfaG9sZDsKKwlpbnQJCQlzcGVlZDsKKworCWludAkJCWRhdGFfYnVmW0JVRlNJWkVdOworCWludAkJCWNtZF9idWZbQlVGU0laRV07CisJaW50CQkJY21kOworCisJLyogZW5kIG9mIGxvY2sgc2NvcGUgKi8KKwlzdHJ1Y3QgY29tcGxldGlvbgl0cmFuc193YWl0cTsKK307CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgc2hvcnQgano0NzgwX2kyY19yZWFkdyhzdHJ1Y3Qgano0NzgwX2kyYyAqaTJjLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZHcoaTJjLT5pb21lbSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBqejQ3ODBfaTJjX3dyaXRldyhzdHJ1Y3Qgano0NzgwX2kyYyAqaTJjLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIHNob3J0IHZhbCkKK3sKKwl3cml0ZXcodmFsLCBpMmMtPmlvbWVtICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBqejQ3ODBfaTJjX2Rpc2FibGUoc3RydWN0IGp6NDc4MF9pMmMgKmkyYykKK3sKKwl1bnNpZ25lZCBzaG9ydCByZWd2YWw7CisJdW5zaWduZWQgbG9uZyBsb29wcyA9IDU7CisKKwlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfRU5CLCAwKTsKKworCWRvIHsKKwkJcmVndmFsID0gano0NzgwX2kyY19yZWFkdyhpMmMsIEpaNDc4MF9JMkNfRU5TVEEpOworCQlpZiAoIShyZWd2YWwgJiBKWjQ3ODBfSTJDX0VOQl9JMkMpKQorCQkJcmV0dXJuIDA7CisKKwkJdXNsZWVwX3JhbmdlKDUwMDAsIDE1MDAwKTsKKwl9IHdoaWxlICgtLWxvb3BzKTsKKworCWRldl9lcnIoJmkyYy0+YWRhcC5kZXYsICJkaXNhYmxlIGZhaWxlZDogRU5TVEE9MHglMDR4XG4iLCByZWd2YWwpOworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW50IGp6NDc4MF9pMmNfZW5hYmxlKHN0cnVjdCBqejQ3ODBfaTJjICppMmMpCit7CisJdW5zaWduZWQgc2hvcnQgcmVndmFsOworCXVuc2lnbmVkIGxvbmcgbG9vcHMgPSA1OworCisJano0NzgwX2kyY193cml0ZXcoaTJjLCBKWjQ3ODBfSTJDX0VOQiwgMSk7CisKKwlkbyB7CisJCXJlZ3ZhbCA9IGp6NDc4MF9pMmNfcmVhZHcoaTJjLCBKWjQ3ODBfSTJDX0VOU1RBKTsKKwkJaWYgKHJlZ3ZhbCAmIEpaNDc4MF9JMkNfRU5CX0kyQykKKwkJCXJldHVybiAwOworCisJCXVzbGVlcF9yYW5nZSg1MDAwLCAxNTAwMCk7CisJfSB3aGlsZSAoLS1sb29wcyk7CisKKwlkZXZfZXJyKCZpMmMtPmFkYXAuZGV2LCAiZW5hYmxlIGZhaWxlZDogRU5TVEE9MHglMDR4XG4iLCByZWd2YWwpOworCXJldHVybiAtRVRJTUVET1VUOworfQorCitzdGF0aWMgaW50IGp6NDc4MF9pMmNfc2V0X3RhcmdldChzdHJ1Y3Qgano0NzgwX2kyYyAqaTJjLCB1bnNpZ25lZCBjaGFyIGFkZHJlc3MpCit7CisJdW5zaWduZWQgc2hvcnQgcmVndmFsOworCXVuc2lnbmVkIGxvbmcgbG9vcHMgPSA1OworCisJZG8geworCQlyZWd2YWwgPSBqejQ3ODBfaTJjX3JlYWR3KGkyYywgSlo0NzgwX0kyQ19TVEEpOworCQlpZiAoKHJlZ3ZhbCAmIEpaNDc4MF9JMkNfU1RBX1RGRSkgJiYKKwkJICAgICEocmVndmFsICYgSlo0NzgwX0kyQ19TVEFfTVNUQUNUKSkKKwkJCWJyZWFrOworCisJCXVzbGVlcF9yYW5nZSg1MDAwLCAxNTAwMCk7CisJfSB3aGlsZSAoLS1sb29wcyk7CisKKwlpZiAobG9vcHMpIHsKKwkJano0NzgwX2kyY193cml0ZXcoaTJjLCBKWjQ3ODBfSTJDX1RBUiwgYWRkcmVzcyk7CisJCXJldHVybiAwOworCX0KKworCWRldl9lcnIoJmkyYy0+YWRhcC5kZXYsCisJCSJzZXQgZGV2aWNlIHRvIGFkZHJlc3MgMHglMDJ4IGZhaWxlZCwgU1RBPTB4JTA0eFxuIiwKKwkJYWRkcmVzcywgcmVndmFsKTsKKworCXJldHVybiAtRU5YSU87Cit9CisKK3N0YXRpYyBpbnQgano0NzgwX2kyY19zZXRfc3BlZWQoc3RydWN0IGp6NDc4MF9pMmMgKmkyYykKK3sKKwlpbnQgZGV2X2Nsa19raHogPSBjbGtfZ2V0X3JhdGUoaTJjLT5jbGspIC8gMTAwMDsKKwlpbnQgY250X2hpZ2ggPSAwOwkvKiBISUdIIHBlcmlvZCBjb3VudCBvZiB0aGUgU0NMIGNsb2NrICovCisJaW50IGNudF9sb3cgPSAwOwkvKiBMT1cgcGVyaW9kIGNvdW50IG9mIHRoZSBTQ0wgY2xvY2sgKi8KKwlpbnQgY250X3BlcmlvZCA9IDA7CS8qIHBlcmlvZCBjb3VudCBvZiB0aGUgU0NMIGNsb2NrICovCisJaW50IHNldHVwX3RpbWUgPSAwOworCWludCBob2xkX3RpbWUgPSAwOworCXVuc2lnbmVkIHNob3J0IHRtcCA9IDA7CisJaW50IGkyY19jbGsgPSBpMmMtPnNwZWVkOworCisJaWYgKGp6NDc4MF9pMmNfZGlzYWJsZShpMmMpKQorCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiaTJjIG5vdCBkaXNhYmxlZFxuIik7CisKKwkvKgorCSAqIDEgSlo0NzgwX0kyQyBjeWNsZSBlcXVhbHMgdG8gY250X3BlcmlvZCBQQ0xLKGkyY19jbGspCisJICogc3RhbmRhcmQgbW9kZSwgbWluIExPVyBhbmQgSElHSCBwZXJpb2QgYXJlIDQ3MDAgbnMgYW5kIDQwMDAgbnMKKwkgKiBmYXN0IG1vZGUsIG1pbiBMT1cgYW5kIEhJR0ggcGVyaW9kIGFyZSAxMzAwIG5zIGFuZCA2MDAgbnMKKwkgKi8KKwljbnRfcGVyaW9kID0gZGV2X2Nsa19raHogLyBpMmNfY2xrOworCisJaWYgKGkyY19jbGsgPD0gMTAwKQorCQljbnRfaGlnaCA9IChjbnRfcGVyaW9kICogNDAwMCkgLyAoNDcwMCArIDQwMDApOworCWVsc2UKKwkJY250X2hpZ2ggPSAoY250X3BlcmlvZCAqIDYwMCkgLyAoMTMwMCArIDYwMCk7CisKKwljbnRfbG93ID0gY250X3BlcmlvZCAtIGNudF9oaWdoOworCisJLyoKKwkgKiBOT1RFOiBKWjQ3ODBfSTJDX0NUUkxfUkVTVCBjYW4ndCBzZXQgd2hlbiBpMmMgZW5hYmxlZCwgYmVjYXVzZQorCSAqIG5vcm1hbCByZWFkIGFyZSAyIG1lc3NhZ2VzLCB3ZSBjYW5ub3QgZGlzYWJsZSBpMmMgY29udHJvbGxlcgorCSAqIGJldHdlZW4gdGhlc2UgdHdvIG1lc3NhZ2VzLCB0aGlzIG1lYW5zIHRoYXQgd2UgbXVzdCBhbHdheXMgc2V0CisJICogSlo0NzgwX0kyQ19DVFJMX1JFU1Qgd2hlbiBpbml0IEpaNDc4MF9JMkNfQ1RSTAorCSAqCisJICovCisJaWYgKGkyY19jbGsgPD0gMTAwKSB7CisJCXRtcCA9IEpaNDc4MF9JMkNfQ1RSTF9TUERTIHwgSlo0NzgwX0kyQ19DVFJMX1JFU1QKKwkJICAgICAgfCBKWjQ3ODBfSTJDX0NUUkxfU0xWRElTIHwgSlo0NzgwX0kyQ19DVFJMX01EOworCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfQ1RSTCwgdG1wKTsKKworCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfU0hDTlQsCisJCQkJICBKWjQ3ODBfSTJDU0hDTlRfQURKVVNUKGNudF9oaWdoKSk7CisJCWp6NDc4MF9pMmNfd3JpdGV3KGkyYywgSlo0NzgwX0kyQ19TTENOVCwKKwkJCQkgIEpaNDc4MF9JMkNTTENOVF9BREpVU1QoY250X2xvdykpOworCX0gZWxzZSB7CisJCXRtcCA9IEpaNDc4MF9JMkNfQ1RSTF9TUERGIHwgSlo0NzgwX0kyQ19DVFJMX1JFU1QKKwkJICAgICAgfCBKWjQ3ODBfSTJDX0NUUkxfU0xWRElTIHwgSlo0NzgwX0kyQ19DVFJMX01EOworCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfQ1RSTCwgdG1wKTsKKworCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfRkhDTlQsCisJCQkJICBKWjQ3ODBfSTJDRkhDTlRfQURKVVNUKGNudF9oaWdoKSk7CisJCWp6NDc4MF9pMmNfd3JpdGV3KGkyYywgSlo0NzgwX0kyQ19GTENOVCwKKwkJCQkgIEpaNDc4MF9JMkNGTENOVF9BREpVU1QoY250X2xvdykpOworCX0KKworCS8qCisJICogYSBpMmMgZGV2aWNlIG11c3QgaW50ZXJuYWxseSBwcm92aWRlIGEgaG9sZCB0aW1lIGF0IGxlYXN0IDMwMG5zCisJICogdEhEOkRBVAorCSAqCVN0YW5kYXJkIE1vZGU6IG1pbj0zMDBucywgbWF4PTM0NTBucworCSAqCUZhc3QgTW9kZTogbWluPTBucywgbWF4PTkwMG5zCisJICogdFNVOkRBVAorCSAqCVN0YW5kYXJkIE1vZGU6IG1pbj0yNTBucywgbWF4PWluZmluaXRlCisJICoJRmFzdCBNb2RlOiBtaW49MTAwKDI1MG5zIGlzIHJlY29tbWVuZGVkKSwgbWF4PWluZmluaXRlCisJICoKKwkgKiAxaTJjX2NsayA9IDEwXjYgLyBkZXZfY2xrX2toegorCSAqIG9uIEZQR0EsIGRldl9jbGtfa2h6ID0gMTIwMDAsIHNvIDFpMmNfY2xrID0gMTAwMC8xMiA9IDgzbnMKKwkgKiBvbiBQaXNjZXMoMTAwOE0pLCBkZXZfY2xrX2toej0xMjYwMDAsIHNvIDFpMmNfY2xrID0gMTAwMCAvIDEyNiA9IDhucworCSAqCisJICogVGhlIGFjdHVhbCBob2xkIHRpbWUgaXMgKFNEQUhEICsgMSkgKiAoaTJjX2NsayBwZXJpb2QpLgorCSAqCisJICogTGVuZ3RoIG9mIHNldHVwIHRpbWUgY2FsY3VsYXRlZCB1c2luZyAoU0RBU1UgLSAxKSAqIChpY19jbGtfcGVyaW9kKQorCSAqCisJICovCisJaWYgKGkyY19jbGsgPD0gMTAwKSB7IC8qIHN0YW5kYXJkIG1vZGUgKi8KKwkJc2V0dXBfdGltZSA9IDMwMDsKKwkJaG9sZF90aW1lID0gNDAwOworCX0gZWxzZSB7CisJCXNldHVwX3RpbWUgPSA0NTA7CisJCWhvbGRfdGltZSA9IDQ1MDsKKwl9CisKKwlob2xkX3RpbWUgPSAoKGhvbGRfdGltZSAqIGRldl9jbGtfa2h6KSAvIDEwMDAwMDApIC0gMTsKKwlzZXR1cF90aW1lID0gKChzZXR1cF90aW1lICogZGV2X2Nsa19raHopIC8gMTAwMDAwMCkgICsgMTsKKworCWlmIChzZXR1cF90aW1lID4gMjU1KQorCQlzZXR1cF90aW1lID0gMjU1OworCisJaWYgKHNldHVwX3RpbWUgPD0gMCkKKwkJc2V0dXBfdGltZSA9IDE7CisKKwlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfU0RBU1UsIHNldHVwX3RpbWUpOworCisJaWYgKGhvbGRfdGltZSA+IDI1NSkKKwkJaG9sZF90aW1lID0gMjU1OworCisJaWYgKGhvbGRfdGltZSA+PSAwKSB7CisJCS8qaTJjIGhvbGQgdGltZSBlbmFibGUgKi8KKwkJaG9sZF90aW1lIHw9IEpaNDc4MF9JMkNfU0RBSERfSERFTkI7CisJCWp6NDc4MF9pMmNfd3JpdGV3KGkyYywgSlo0NzgwX0kyQ19TREFIRCwgaG9sZF90aW1lKTsKKwl9IGVsc2UgeworCQkvKiBkaXNhYmxlIGhvbGQgdGltZSAqLworCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfU0RBSEQsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGp6NDc4MF9pMmNfY2xlYW51cChzdHJ1Y3Qgano0NzgwX2kyYyAqaTJjKQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCB0bXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTJjLT5sb2NrLCBmbGFncyk7CisKKwkvKiBjYW4gc2VuZCBzdG9wIG5vdyBpZiBuZWVkICovCisJdG1wID0gano0NzgwX2kyY19yZWFkdyhpMmMsIEpaNDc4MF9JMkNfQ1RSTCk7CisJdG1wICY9IH5KWjQ3ODBfSTJDX0NUUkxfU1RQSExEOworCWp6NDc4MF9pMmNfd3JpdGV3KGkyYywgSlo0NzgwX0kyQ19DVFJMLCB0bXApOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyBmaXJzdCAqLworCWp6NDc4MF9pMmNfd3JpdGV3KGkyYywgSlo0NzgwX0kyQ19JTlRNLCAwKTsKKworCS8qIHRoZW4gY2xlYXIgYWxsIGludGVycnVwdHMgKi8KKwlqejQ3ODBfaTJjX3JlYWR3KGkyYywgSlo0NzgwX0kyQ19DVFhBQlJUKTsKKwlqejQ3ODBfaTJjX3JlYWR3KGkyYywgSlo0NzgwX0kyQ19DSU5UUik7CisKKwkvKiB0aGVuIGRpc2FibGUgdGhlIGNvbnRyb2xsZXIgKi8KKwl0bXAgPSBqejQ3ODBfaTJjX3JlYWR3KGkyYywgSlo0NzgwX0kyQ19DVFJMKTsKKwl0bXAgJj0gfkpaNDc4MF9JMkNfRU5CX0kyQzsKKwlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfQ1RSTCwgdG1wKTsKKwl1ZGVsYXkoMTApOworCXRtcCB8PSBKWjQ3ODBfSTJDX0VOQl9JMkM7CisJano0NzgwX2kyY193cml0ZXcoaTJjLCBKWjQ3ODBfSTJDX0NUUkwsIHRtcCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMmMtPmxvY2ssIGZsYWdzKTsKKworCXJldCA9IGp6NDc4MF9pMmNfZGlzYWJsZShpMmMpOworCWlmIChyZXQpCisJCWRldl9lcnIoJmkyYy0+YWRhcC5kZXYsCisJCQkidW5hYmxlIHRvIGRpc2FibGUgZGV2aWNlIGR1cmluZyBjbGVhbnVwIVxuIik7CisKKwlpZiAodW5saWtlbHkoano0NzgwX2kyY19yZWFkdyhpMmMsIEpaNDc4MF9JMkNfSU5UTSkKKwkJICAgICAmIGp6NDc4MF9pMmNfcmVhZHcoaTJjLCBKWjQ3ODBfSTJDX0lOVFNUKSkpCisJCWRldl9lcnIoJmkyYy0+YWRhcC5kZXYsCisJCQkiZGV2aWNlIGhhcyBpbnRlcnJ1cHRzIGFmdGVyIGEgY29tcGxldGUgY2xlYW51cCFcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBqejQ3ODBfaTJjX3ByZXBhcmUoc3RydWN0IGp6NDc4MF9pMmMgKmkyYykKK3sKKwlqejQ3ODBfaTJjX3NldF9zcGVlZChpMmMpOworCXJldHVybiBqejQ3ODBfaTJjX2VuYWJsZShpMmMpOworfQorCitzdGF0aWMgdm9pZCBqejQ3ODBfaTJjX3NlbmRfcmNtZChzdHJ1Y3Qgano0NzgwX2kyYyAqaTJjLCBpbnQgY21kX2NvdW50KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNtZF9jb3VudDsgaSsrKQorCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfREMsIEpaNDc4MF9JMkNfRENfUkVBRCk7Cit9CisKK3N0YXRpYyB2b2lkIGp6NDc4MF9pMmNfdHJhbnNfZG9uZShzdHJ1Y3Qgano0NzgwX2kyYyAqaTJjKQoreworCWp6NDc4MF9pMmNfd3JpdGV3KGkyYywgSlo0NzgwX0kyQ19JTlRNLCAwKTsKKwljb21wbGV0ZSgmaTJjLT50cmFuc193YWl0cSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBqejQ3ODBfaTJjX2lycShpbnQgaXJxbm8sIHZvaWQgKmRldl9pZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCB0bXA7CisJdW5zaWduZWQgc2hvcnQgaW50c3Q7CisJdW5zaWduZWQgc2hvcnQgaW50bXNrOworCXN0cnVjdCBqejQ3ODBfaTJjICppMmMgPSBkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpMmMtPmxvY2ssIGZsYWdzKTsKKwlpbnRtc2sgPSBqejQ3ODBfaTJjX3JlYWR3KGkyYywgSlo0NzgwX0kyQ19JTlRNKTsKKwlpbnRzdCA9IGp6NDc4MF9pMmNfcmVhZHcoaTJjLCBKWjQ3ODBfSTJDX0lOVFNUKTsKKworCWludHN0ICY9IGludG1zazsKKworCWlmIChpbnRzdCAmIEpaNDc4MF9JMkNfSU5UU1RfVFhBQlQpIHsKKwkJano0NzgwX2kyY190cmFuc19kb25lKGkyYyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwlpZiAoaW50c3QgJiBKWjQ3ODBfSTJDX0lOVFNUX1JYT0YpIHsKKwkJZGV2X2RiZygmaTJjLT5hZGFwLmRldiwgInJlY2VpdmVkIGZpZm8gb3ZlcmZsb3chXG4iKTsKKwkJano0NzgwX2kyY190cmFuc19kb25lKGkyYyk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIFdoZW4gcmVhZGluZywgYWx3YXlzIGRyYWluIFJYIEZJRk8gYmVmb3JlIHdlIHNlbmQgbW9yZSBSZWFkCisJICogQ29tbWFuZHMgdG8gYXZvaWQgZmlmbyBvdmVycnVuCisJICovCisJaWYgKGkyYy0+aXNfd3JpdGUgPT0gMCkgeworCQlpbnQgcmRfbGVmdDsKKworCQl3aGlsZSAoKGp6NDc4MF9pMmNfcmVhZHcoaTJjLCBKWjQ3ODBfSTJDX1NUQSkKKwkJCQkgICYgSlo0NzgwX0kyQ19TVEFfUkZORSkpIHsKKwkJCSooaTJjLT5yYnVmKyspID0gano0NzgwX2kyY19yZWFkdyhpMmMsIEpaNDc4MF9JMkNfREMpCisJCQkJCSAmIDB4ZmY7CisJCQlpMmMtPnJkX2RhdGFfeGZlcmVkKys7CisJCQlpZiAoaTJjLT5yZF9kYXRhX3hmZXJlZCA9PSBpMmMtPnJkX3RvdGFsX2xlbikgeworCQkJCWp6NDc4MF9pMmNfdHJhbnNfZG9uZShpMmMpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCisJCXJkX2xlZnQgPSBpMmMtPnJkX3RvdGFsX2xlbiAtIGkyYy0+cmRfZGF0YV94ZmVyZWQ7CisKKwkJaWYgKHJkX2xlZnQgPD0gSlo0NzgwX0kyQ19GSUZPX0xFTikKKwkJCWp6NDc4MF9pMmNfd3JpdGV3KGkyYywgSlo0NzgwX0kyQ19SWFRMLCByZF9sZWZ0IC0gMSk7CisJfQorCisJaWYgKGludHN0ICYgSlo0NzgwX0kyQ19JTlRTVF9UWEVNUCkgeworCQlpZiAoaTJjLT5pc193cml0ZSA9PSAwKSB7CisJCQlpbnQgY21kX2xlZnQgPSBpMmMtPnJkX3RvdGFsX2xlbiAtIGkyYy0+cmRfY21kX3hmZXJlZDsKKwkJCWludCBtYXhfc2VuZCA9IChKWjQ3ODBfSTJDX0ZJRk9fTEVOIC0gMSkKKwkJCQkJIC0gKGkyYy0+cmRfY21kX3hmZXJlZAorCQkJCQkgLSBpMmMtPnJkX2RhdGFfeGZlcmVkKTsKKwkJCWludCBjbWRfdG9fc2VuZCA9IG1pbihjbWRfbGVmdCwgbWF4X3NlbmQpOworCisJCQlpZiAoaTJjLT5yZF9jbWRfeGZlcmVkICE9IDApCisJCQkJY21kX3RvX3NlbmQgPSBtaW4oY21kX3RvX3NlbmQsCisJCQkJCQkgIEpaNDc4MF9JMkNfRklGT19MRU4KKwkJCQkJCSAgLSBUWF9MRVZFTCAtIDEpOworCisJCQlpZiAoY21kX3RvX3NlbmQpIHsKKwkJCQlqejQ3ODBfaTJjX3NlbmRfcmNtZChpMmMsIGNtZF90b19zZW5kKTsKKwkJCQlpMmMtPnJkX2NtZF94ZmVyZWQgKz0gY21kX3RvX3NlbmQ7CisJCQl9CisKKwkJCWNtZF9sZWZ0ID0gaTJjLT5yZF90b3RhbF9sZW4gLSBpMmMtPnJkX2NtZF94ZmVyZWQ7CisJCQlpZiAoY21kX2xlZnQgPT0gMCkgeworCQkJCWludG1zayA9IGp6NDc4MF9pMmNfcmVhZHcoaTJjLCBKWjQ3ODBfSTJDX0lOVE0pOworCQkJCWludG1zayAmPSB+Slo0NzgwX0kyQ19JTlRNX01UWEVNUDsKKwkJCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfSU5UTSwgaW50bXNrKTsKKworCQkJCXRtcCA9IGp6NDc4MF9pMmNfcmVhZHcoaTJjLCBKWjQ3ODBfSTJDX0NUUkwpOworCQkJCXRtcCAmPSB+Slo0NzgwX0kyQ19DVFJMX1NUUEhMRDsKKwkJCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfQ1RSTCwgdG1wKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIHNob3J0IGRhdGE7CisJCQl1bnNpZ25lZCBzaG9ydCBpMmNfc3RhOworCisJCQlpMmNfc3RhID0gano0NzgwX2kyY19yZWFkdyhpMmMsIEpaNDc4MF9JMkNfU1RBKTsKKworCQkJd2hpbGUgKChpMmNfc3RhICYgSlo0NzgwX0kyQ19TVEFfVEZORikgJiYKKwkJCSAgICAgICAoaTJjLT53dF9sZW4gPiAwKSkgeworCQkJCWkyY19zdGEgPSBqejQ3ODBfaTJjX3JlYWR3KGkyYywgSlo0NzgwX0kyQ19TVEEpOworCQkJCWRhdGEgPSAqaTJjLT53YnVmOworCQkJCWRhdGEgJj0gfkpaNDc4MF9JMkNfRENfUkVBRDsKKwkJCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfREMsCisJCQkJCQkgIGRhdGEpOworCQkJCWkyYy0+d2J1ZisrOworCQkJCWkyYy0+d3RfbGVuLS07CisJCQl9CisKKwkJCWlmIChpMmMtPnd0X2xlbiA9PSAwKSB7CisJCQkJaWYgKCFpMmMtPnN0b3BfaG9sZCkgeworCQkJCQl0bXAgPSBqejQ3ODBfaTJjX3JlYWR3KGkyYywKKwkJCQkJCQkgICAgICAgSlo0NzgwX0kyQ19DVFJMKTsKKwkJCQkJdG1wICY9IH5KWjQ3ODBfSTJDX0NUUkxfU1RQSExEOworCQkJCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfQ1RSTCwKKwkJCQkJCQkgIHRtcCk7CisJCQkJfQorCisJCQkJano0NzgwX2kyY190cmFuc19kb25lKGkyYyk7CisJCQkJZ290byBkb25lOworCQkJfQorCQl9CisJfQorCitkb25lOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHZvaWQgano0NzgwX2kyY190eGFicnQoc3RydWN0IGp6NDc4MF9pMmMgKmkyYywgaW50IHNyYykKK3sKKwlpbnQgaTsKKworCWRldl9lcnIoJmkyYy0+YWRhcC5kZXYsICJ0eGFicnQ6IDB4JTA4eFxuIiwgc3JjKTsKKwlkZXZfZXJyKCZpMmMtPmFkYXAuZGV2LCAiZGV2aWNlIGFkZHI9JXhcbiIsCisJCWp6NDc4MF9pMmNfcmVhZHcoaTJjLCBKWjQ3ODBfSTJDX1RBUikpOworCWRldl9lcnIoJmkyYy0+YWRhcC5kZXYsICJzZW5kIGNtZCBjb3VudDolZCAgJWRcbiIsCisJCWkyYy0+Y21kLCBpMmMtPmNtZF9idWZbaTJjLT5jbWRdKTsKKwlkZXZfZXJyKCZpMmMtPmFkYXAuZGV2LCAicmVjZWl2ZSBkYXRhIGNvdW50OiVkICAlZFxuIiwKKwkJaTJjLT5jbWQsIGkyYy0+ZGF0YV9idWZbaTJjLT5jbWRdKTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmIChzcmMgJiBCSVQoaSkpCisJCQlkZXZfZGJnKCZpMmMtPmFkYXAuZGV2LCAiSTJDIFRYQUJSVFslZF09JXNcbiIsCisJCQkJaSwgano0NzgwX2kyY19hYnJ0X3NyY1tpXSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBqejQ3ODBfaTJjX3hmZXJfcmVhZChzdHJ1Y3Qgano0NzgwX2kyYyAqaTJjLAorCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sIGludCBjbnQsCisJCQkJICAgICAgIGludCBpZHgpCit7CisJaW50IHJldCA9IDA7CisJbG9uZyB0aW1lb3V0OworCWludCB3YWl0X3RpbWUgPSBKWjQ3ODBfSTJDX1RJTUVPVVQgKiAobGVuICsgNSk7CisJdW5zaWduZWQgc2hvcnQgdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltZW1zZXQoYnVmLCAwLCBsZW4pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmkyYy0+bG9jaywgZmxhZ3MpOworCisJaTJjLT5zdG9wX2hvbGQgPSAwOworCWkyYy0+aXNfd3JpdGUgPSAwOworCWkyYy0+cmJ1ZiA9IGJ1ZjsKKwlpMmMtPnJkX3RvdGFsX2xlbiA9IGxlbjsKKwlpMmMtPnJkX2RhdGFfeGZlcmVkID0gMDsKKwlpMmMtPnJkX2NtZF94ZmVyZWQgPSAwOworCisJaWYgKGxlbiA8PSBKWjQ3ODBfSTJDX0ZJRk9fTEVOKQorCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfUlhUTCwgbGVuIC0gMSk7CisJZWxzZQorCQlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfUlhUTCwgUlhfTEVWRUwpOworCisJano0NzgwX2kyY193cml0ZXcoaTJjLCBKWjQ3ODBfSTJDX1RYVEwsIFRYX0xFVkVMKTsKKworCWp6NDc4MF9pMmNfd3JpdGV3KGkyYywgSlo0NzgwX0kyQ19JTlRNLAorCQkJICBKWjQ3ODBfSTJDX0lOVE1fTVJYRkwgfCBKWjQ3ODBfSTJDX0lOVE1fTVRYRU1QCisJCQkgIHwgSlo0NzgwX0kyQ19JTlRNX01UWEFCVCB8IEpaNDc4MF9JMkNfSU5UTV9NUlhPRik7CisKKwl0bXAgPSBqejQ3ODBfaTJjX3JlYWR3KGkyYywgSlo0NzgwX0kyQ19DVFJMKTsKKwl0bXAgfD0gSlo0NzgwX0kyQ19DVFJMX1NUUEhMRDsKKwlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfQ1RSTCwgdG1wKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyYy0+bG9jaywgZmxhZ3MpOworCisJdGltZW91dCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaTJjLT50cmFuc193YWl0cSwKKwkJCQkJICAgICAgbXNlY3NfdG9famlmZmllcyh3YWl0X3RpbWUpKTsKKworCWlmICghdGltZW91dCkgeworCQlkZXZfZXJyKCZpMmMtPmFkYXAuZGV2LCAiaXJxIHJlYWQgdGltZW91dFxuIik7CisJCWRldl9kYmcoJmkyYy0+YWRhcC5kZXYsICJzZW5kIGNtZCBjb3VudDolZCAgJWRcbiIsCisJCQlpMmMtPmNtZCwgaTJjLT5jbWRfYnVmW2kyYy0+Y21kXSk7CisJCWRldl9kYmcoJmkyYy0+YWRhcC5kZXYsICJyZWNlaXZlIGRhdGEgY291bnQ6JWQgICVkXG4iLAorCQkJaTJjLT5jbWQsIGkyYy0+ZGF0YV9idWZbaTJjLT5jbWRdKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisKKwl0bXAgPSBqejQ3ODBfaTJjX3JlYWR3KGkyYywgSlo0NzgwX0kyQ19UWEFCUlQpOworCWlmICh0bXApIHsKKwkJano0NzgwX2kyY190eGFicnQoaTJjLCB0bXApOworCQlyZXQgPSAtRUlPOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGp6NDc4MF9pMmNfeGZlcl93cml0ZShzdHJ1Y3Qgano0NzgwX2kyYyAqaTJjLAorCQkJCQl1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sCisJCQkJCWludCBjbnQsIGludCBpZHgpCit7CisJaW50IHJldCA9IDA7CisJaW50IHdhaXRfdGltZSA9IEpaNDc4MF9JMkNfVElNRU9VVCAqIChsZW4gKyA1KTsKKwlsb25nIHRpbWVvdXQ7CisJdW5zaWduZWQgc2hvcnQgdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaTJjLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaWR4IDwgKGNudCAtIDEpKQorCQlpMmMtPnN0b3BfaG9sZCA9IDE7CisJZWxzZQorCQlpMmMtPnN0b3BfaG9sZCA9IDA7CisKKwlpMmMtPmlzX3dyaXRlID0gMTsKKwlpMmMtPndidWYgPSBidWY7CisJaTJjLT53dF9sZW4gPSBsZW47CisKKwlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfVFhUTCwgVFhfTEVWRUwpOworCisJano0NzgwX2kyY193cml0ZXcoaTJjLCBKWjQ3ODBfSTJDX0lOVE0sIEpaNDc4MF9JMkNfSU5UTV9NVFhFTVAKKwkJCQkJfCBKWjQ3ODBfSTJDX0lOVE1fTVRYQUJUKTsKKworCXRtcCA9IGp6NDc4MF9pMmNfcmVhZHcoaTJjLCBKWjQ3ODBfSTJDX0NUUkwpOworCXRtcCB8PSBKWjQ3ODBfSTJDX0NUUkxfU1RQSExEOworCWp6NDc4MF9pMmNfd3JpdGV3KGkyYywgSlo0NzgwX0kyQ19DVFJMLCB0bXApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaTJjLT5sb2NrLCBmbGFncyk7CisKKwl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpMmMtPnRyYW5zX3dhaXRxLAorCQkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKHdhaXRfdGltZSkpOworCWlmICh0aW1lb3V0ICYmICFpMmMtPnN0b3BfaG9sZCkgeworCQl1bnNpZ25lZCBzaG9ydCBpMmNfc3RhOworCQlpbnQgd3JpdGVfaW5fcHJvY2VzczsKKworCQl0aW1lb3V0ID0gSlo0NzgwX0kyQ19USU1FT1VUICogMTAwOworCQlmb3IgKDsgdGltZW91dCA+IDA7IHRpbWVvdXQtLSkgeworCQkJaTJjX3N0YSA9IGp6NDc4MF9pMmNfcmVhZHcoaTJjLCBKWjQ3ODBfSTJDX1NUQSk7CisKKwkJCXdyaXRlX2luX3Byb2Nlc3MgPSAoaTJjX3N0YSAmIEpaNDc4MF9JMkNfU1RBX01TVEFDVCkgfHwKKwkJCQkhKGkyY19zdGEgJiBKWjQ3ODBfSTJDX1NUQV9URkUpOworCQkJaWYgKCF3cml0ZV9pbl9wcm9jZXNzKQorCQkJCWJyZWFrOworCQkJdWRlbGF5KDEwKTsKKwkJfQorCX0KKworCWlmICghdGltZW91dCkgeworCQlkZXZfZXJyKCZpMmMtPmFkYXAuZGV2LCAid3JpdGUgd2FpdCB0aW1lb3V0XG4iKTsKKwkJcmV0ID0gLUVJTzsKKwl9CisKKwl0bXAgPSBqejQ3ODBfaTJjX3JlYWR3KGkyYywgSlo0NzgwX0kyQ19UWEFCUlQpOworCWlmICh0bXApIHsKKwkJano0NzgwX2kyY190eGFicnQoaTJjLCB0bXApOworCQlyZXQgPSAtRUlPOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgano0NzgwX2kyY194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZywKKwkJCSAgIGludCBjb3VudCkKK3sKKwlpbnQgaSA9IC1FSU87CisJaW50IHJldCA9IDA7CisJc3RydWN0IGp6NDc4MF9pMmMgKmkyYyA9IGFkYXAtPmFsZ29fZGF0YTsKKworCXJldCA9IGp6NDc4MF9pMmNfcHJlcGFyZShpMmMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmaTJjLT5hZGFwLmRldiwgIkkyQyBwcmVwYXJlIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChtc2ctPmFkZHIgIT0gano0NzgwX2kyY19yZWFkdyhpMmMsIEpaNDc4MF9JMkNfVEFSKSkgeworCQlyZXQgPSBqejQ3ODBfaTJjX3NldF90YXJnZXQoaTJjLCBtc2ctPmFkZHIpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrLCBtc2crKykgeworCQlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1JEKQorCQkJcmV0ID0gano0NzgwX2kyY194ZmVyX3JlYWQoaTJjLCBtc2ctPmJ1ZiwgbXNnLT5sZW4sCisJCQkJCQkgICBjb3VudCwgaSk7CisJCWVsc2UKKwkJCXJldCA9IGp6NDc4MF9pMmNfeGZlcl93cml0ZShpMmMsIG1zZy0+YnVmLCBtc2ctPmxlbiwKKwkJCQkJCSAgICBjb3VudCwgaSk7CisKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGk7CisKK291dDoKKwlqejQ3ODBfaTJjX2NsZWFudXAoaTJjKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTMyIGp6NDc4MF9pMmNfZnVuY3Rpb25hbGl0eShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXApCit7CisJcmV0dXJuIEkyQ19GVU5DX0kyQyB8IEkyQ19GVU5DX1NNQlVTX0VNVUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBqejQ3ODBfaTJjX2FsZ29yaXRobSA9IHsKKwkubWFzdGVyX3hmZXIJPSBqejQ3ODBfaTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkJPSBqejQ3ODBfaTJjX2Z1bmN0aW9uYWxpdHksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBqejQ3ODBfaTJjX29mX21hdGNoZXNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImluZ2VuaWMsano0NzgwLWkyYyIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCitzdGF0aWMgaW50IGp6NDc4MF9pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgY2xrX2ZyZXEgPSAwOworCXVuc2lnbmVkIHNob3J0IHRtcDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJc3RydWN0IGp6NDc4MF9pMmMgKmkyYzsKKworCWkyYyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGp6NDc4MF9pMmMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWkyYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpMmMtPmFkYXAub3duZXIJCT0gVEhJU19NT0RVTEU7CisJaTJjLT5hZGFwLmFsZ28JCT0gJmp6NDc4MF9pMmNfYWxnb3JpdGhtOworCWkyYy0+YWRhcC5hbGdvX2RhdGEJPSBpMmM7CisJaTJjLT5hZGFwLnJldHJpZXMJPSA1OworCWkyYy0+YWRhcC5kZXYucGFyZW50CT0gJnBkZXYtPmRldjsKKwlpMmMtPmFkYXAuZGV2Lm9mX25vZGUJPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzcHJpbnRmKGkyYy0+YWRhcC5uYW1lLCAiJXMiLCBwZGV2LT5uYW1lKTsKKworCWluaXRfY29tcGxldGlvbigmaTJjLT50cmFuc193YWl0cSk7CisJc3Bpbl9sb2NrX2luaXQoJmkyYy0+bG9jayk7CisKKwlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpMmMtPmlvbWVtID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHIpOworCWlmIChJU19FUlIoaTJjLT5pb21lbSkpCisJCXJldHVybiBQVFJfRVJSKGkyYy0+aW9tZW0pOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaTJjKTsKKworCWkyYy0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoaTJjLT5jbGspKQorCQlyZXR1cm4gUFRSX0VSUihpMmMtPmNsayk7CisKKwljbGtfcHJlcGFyZV9lbmFibGUoaTJjLT5jbGspOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAiY2xvY2stZnJlcXVlbmN5IiwKKwkJCQkgJmNsa19mcmVxKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjbG9jay1mcmVxdWVuY3kgbm90IHNwZWNpZmllZCBpbiBEVCIpOworCQlyZXR1cm4gY2xrX2ZyZXE7CisJfQorCisJaTJjLT5zcGVlZCA9IGNsa19mcmVxIC8gMTAwMDsKKwlqejQ3ODBfaTJjX3NldF9zcGVlZChpMmMpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIkJ1cyBmcmVxdWVuY3kgaXMgJWQgS0h6XG4iLCBpMmMtPnNwZWVkKTsKKworCXRtcCA9IGp6NDc4MF9pMmNfcmVhZHcoaTJjLCBKWjQ3ODBfSTJDX0NUUkwpOworCXRtcCAmPSB+Slo0NzgwX0kyQ19DVFJMX1NUUEhMRDsKKwlqejQ3ODBfaTJjX3dyaXRldyhpMmMsIEpaNDc4MF9JMkNfQ1RSTCwgdG1wKTsKKworCWp6NDc4MF9pMmNfd3JpdGV3KGkyYywgSlo0NzgwX0kyQ19JTlRNLCAweDApOworCisJaTJjLT5jbWQgPSAwOworCW1lbXNldChpMmMtPmNtZF9idWYsIDAsIEJVRlNJWkUpOworCW1lbXNldChpMmMtPmRhdGFfYnVmLCAwLCBCVUZTSVpFKTsKKworCWkyYy0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGkyYy0+aXJxLCBqejQ3ODBfaTJjX2lycSwgMCwKKwkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgaTJjKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGkyY19hZGRfYWRhcHRlcigmaTJjLT5hZGFwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIGJ1c1xuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworCitlcnI6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGkyYy0+Y2xrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGp6NDc4MF9pMmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGp6NDc4MF9pMmMgKmkyYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGkyYy0+Y2xrKTsKKwlpMmNfZGVsX2FkYXB0ZXIoJmkyYy0+YWRhcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGp6NDc4MF9pMmNfZHJpdmVyID0geworCS5wcm9iZQkJPSBqejQ3ODBfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gano0NzgwX2kyY19yZW1vdmUsCisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImp6NDc4MC1pMmMiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoano0NzgwX2kyY19vZl9tYXRjaGVzKSwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihqejQ3ODBfaTJjX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoInp0eWFuPHp0eWFuQGluZ2VuaWMuY24+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImkyYyBkcml2ZXIgZm9yIEpaNDc4MCBTb0NzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1tcGMuYwppbmRleCBjNzRjYzJiLi40OGVjZmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW1wYy5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXBjLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCiAjaW5jbHVkZSA8YXNtL21wYzUyeHguaD4KKyNpbmNsdWRlIDxhc20vbXBjODV4eC5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAKICNkZWZpbmUgRFJWX05BTUUgIm1wYy1pMmMiCkBAIC05NSw4ICs5Niw5IEBACiAJCWkyYy0+aW50ZXJydXB0ID0gcmVhZGIoaTJjLT5iYXNlICsgTVBDX0kyQ19TUik7CiAJCXdyaXRlYigwLCBpMmMtPmJhc2UgKyBNUENfSTJDX1NSKTsKIAkJd2FrZV91cCgmaTJjLT5xdWV1ZSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKIAl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOworCXJldHVybiBJUlFfTk9ORTsKIH0KIAogLyogU29tZXRpbWVzIDl0aCBjbG9jayBwdWxzZSBpc24ndCBnZW5lcmF0ZWQsIGFuZCBzbGF2ZSBkb2Vzbid0IHJlbGVhc2UKQEAgLTM0Niw2ICszNDgsMzMgQEAKIAlyZXR1cm4gdmFsOwogfQogCitzdGF0aWMgdTMyIG1wY19pMmNfZ2V0X3ByZXNjYWxlcl84eHh4KHZvaWQpCit7CisJLyogbXBjODN4eCBhbmQgbXBjODJ4eCBhbGwgaGF2ZSBwcmVzY2FsZXIgMSAqLworCXUzMiBwcmVzY2FsZXIgPSAxOworCisJLyogbXBjODV4eCAqLworCWlmIChwdnJfdmVyc2lvbl9pcyhQVlJfVkVSX0U1MDBWMSkgfHwgcHZyX3ZlcnNpb25faXMoUFZSX1ZFUl9FNTAwVjIpCisJCXx8IHB2cl92ZXJzaW9uX2lzKFBWUl9WRVJfRTUwME1DKQorCQl8fCBwdnJfdmVyc2lvbl9pcyhQVlJfVkVSX0U1NTAwKQorCQl8fCBwdnJfdmVyc2lvbl9pcyhQVlJfVkVSX0U2NTAwKSkgeworCQl1bnNpZ25lZCBpbnQgc3ZyID0gbWZzcHIoU1BSTl9TVlIpOworCisJCWlmICgoU1ZSX1NPQ19WRVIoc3ZyKSA9PSBTVlJfODU0MCkKKwkJCXx8IChTVlJfU09DX1ZFUihzdnIpID09IFNWUl84NTQxKQorCQkJfHwgKFNWUl9TT0NfVkVSKHN2cikgPT0gU1ZSXzg1NjApCisJCQl8fCAoU1ZSX1NPQ19WRVIoc3ZyKSA9PSBTVlJfODU1NSkKKwkJCXx8IChTVlJfU09DX1ZFUihzdnIpID09IFNWUl84NjEwKSkKKwkJCS8qIHRoZSBhYm92ZSA4NXh4IFNvQ3MgaGF2ZSBwcmVzY2FsZXIgMSAqLworCQkJcHJlc2NhbGVyID0gMTsKKwkJZWxzZQorCQkJLyogYWxsIHRoZSBvdGhlciA4NXh4IGhhdmUgcHJlc2NhbGVyIDIgKi8KKwkJCXByZXNjYWxlciA9IDI7CisJfQorCisJcmV0dXJuIHByZXNjYWxlcjsKK30KKwogc3RhdGljIGludCBtcGNfaTJjX2dldF9mZHJfOHh4eChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHUzMiBjbG9jaywKIAkJCQkJICB1MzIgcHJlc2NhbGVyLCB1MzIgKnJlYWxfY2xrKQogewpAQCAtMzYzLDcgKzM5Miw3IEBACiAJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJmc2wsbXBjODU0NC1pMmMiKSkKIAkJcHJlc2NhbGVyID0gbXBjX2kyY19nZXRfc2VjX2NmZ184eHh4KCkgPyAzIDogMjsKIAlpZiAoIXByZXNjYWxlcikKLQkJcHJlc2NhbGVyID0gMTsKKwkJcHJlc2NhbGVyID0gbXBjX2kyY19nZXRfcHJlc2NhbGVyXzh4eHgoKTsKIAogCWRpdmlkZXIgPSBmc2xfZ2V0X3N5c19mcmVxKCkgLyBjbG9jayAvIHByZXNjYWxlcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1teHMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbXhzLmMKaW5kZXggZmY4YjEyYy4uNTZmY2VmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1teHMuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW14cy5jCkBAIC01NjgsNiArNTY4LDcgQEAKIAlpbnQgcmV0OwogCWludCBmbGFnczsKIAlpbnQgdXNlX3BpbyA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lX2xlZnQ7CiAKIAlmbGFncyA9IHN0b3AgPyBNWFNfSTJDX0NUUkwwX1BPU1RfU0VORF9TVE9QIDogMDsKIApAQCAtNTk5LDkgKzYwMCw5IEBACiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaTJjLT5jbWRfY29tcGxldGUsCisJCXRpbWVfbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaTJjLT5jbWRfY29tcGxldGUsCiAJCQkJCQltc2Vjc190b19qaWZmaWVzKDEwMDApKTsKLQkJaWYgKHJldCA9PSAwKQorCQlpZiAoIXRpbWVfbGVmdCkKIAkJCWdvdG8gdGltZW91dDsKIAogCQlyZXQgPSBpMmMtPmNtZF9lcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW5vbWFkaWsuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbm9tYWRpay5jCmluZGV4IDk3OTk4OTQuLmJjZDE3ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbm9tYWRpay5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbm9tYWRpay5jCkBAIC00NDYsOSArNDQ2LDkgQEAKICAqLwogc3RhdGljIGludCByZWFkX2kyYyhzdHJ1Y3Qgbm1rX2kyY19kZXYgKmRldiwgdTE2IGZsYWdzKQogewotCXUzMiBzdGF0dXMgPSAwOworCWludCBzdGF0dXMgPSAwOwogCXUzMiBtY3IsIGlycV9tYXNrOwotCWludCB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAogCW1jciA9IGxvYWRfaTJjX21jcl9yZWcoZGV2LCBmbGFncyk7CiAJd3JpdGVsKG1jciwgZGV2LT52aXJ0YmFzZSArIEkyQ19NQ1IpOwpAQCAtNTE3LDcgKzUxNyw3IEBACiB7CiAJdTMyIHN0YXR1cyA9IDA7CiAJdTMyIG1jciwgaXJxX21hc2s7Ci0JaW50IHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCiAJbWNyID0gbG9hZF9pMmNfbWNyX3JlZyhkZXYsIGZsYWdzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vcGFsLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9wYWwuYwppbmRleCAxNmY5MGIxLi43NWRkNmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9wYWwuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9wYWwuYwpAQCAtMTA0LDE4ICsxMDQsOCBAQAogCQlyZXEuYnVmZmVyX3JhID0gY3B1X3RvX2JlNjQoX19wYShtc2dzWzBdLmJ1ZikpOwogCQlicmVhazsKIAljYXNlIDI6Ci0JCS8qIEZvciB0d28gbWVzc2FnZXMsIHdlIGJhc2ljYWxseSBzdXBwb3J0IG9ubHkgc2ltcGxlCi0JCSAqIHNtYnVzIHRyYW5zYWN0aW9ucyBvZiBhIHdyaXRlIHBsdXMgYSByZWFkLiBXZSBtaWdodAotCQkgKiB3YW50IHRvIGFsbG93IGFsc28gdHdvIHdyaXRlcyBidXQgd2UnZCBoYXZlIHRvIGJvdW5jZQotCQkgKiB0aGUgZGF0YSBpbnRvIGEgc2luZ2xlIGJ1ZmZlci4KLQkJICovCi0JCWlmICgobXNnc1swXS5mbGFncyAmIEkyQ19NX1JEKSB8fCAhKG1zZ3NbMV0uZmxhZ3MgJiBJMkNfTV9SRCkpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCWlmIChtc2dzWzBdLmxlbiA+IDQpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCWlmIChtc2dzWzBdLmFkZHIgIT0gbXNnc1sxXS5hZGRyKQotCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCQlyZXEudHlwZSA9IE9QQUxfSTJDX1NNX1JFQUQ7CisJCXJlcS50eXBlID0gKG1zZ3NbMV0uZmxhZ3MgJiBJMkNfTV9SRCkgPworCQkJT1BBTF9JMkNfU01fUkVBRCA6IE9QQUxfSTJDX1NNX1dSSVRFOwogCQlyZXEuYWRkciA9IGNwdV90b19iZTE2KG1zZ3NbMF0uYWRkcik7CiAJCXJlcS5zdWJhZGRyX3N6ID0gbXNnc1swXS5sZW47CiAJCWZvciAoaSA9IDA7IGkgPCBtc2dzWzBdLmxlbjsgaSsrKQpAQCAtMjEwLDYgKzIwMCwxNSBAQAogCS5mdW5jdGlvbmFsaXR5CT0gaTJjX29wYWxfZnVuYywKIH07CiAKKy8qCisgKiBGb3IgdHdvIG1lc3NhZ2VzLCB3ZSBiYXNpY2FsbHkgc3VwcG9ydCBzaW1wbGUgc21idXMgdHJhbnNhY3Rpb25zIG9mIGEKKyAqIHdyaXRlLXRoZW4tYW55dGhpbmcuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXJfcXVpcmtzIGkyY19vcGFsX3F1aXJrcyA9IHsKKwkuZmxhZ3MgPSBJMkNfQVFfQ09NQiB8IEkyQ19BUV9DT01CX1dSSVRFX0ZJUlNUIHwgSTJDX0FRX0NPTUJfU0FNRV9BRERSLAorCS5tYXhfY29tYl8xc3RfbXNnX2xlbiA9IDQsCit9OworCiBzdGF0aWMgaW50IGkyY19vcGFsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGkyY19hZGFwdGVyCSphZGFwdGVyOwpAQCAtMjMyLDYgKzIzMSw3IEBACiAKIAlhZGFwdGVyLT5hbGdvID0gJmkyY19vcGFsX2FsZ287CiAJYWRhcHRlci0+YWxnb19kYXRhID0gKHZvaWQgKikodW5zaWduZWQgbG9uZylvcGFsX2lkOworCWFkYXB0ZXItPnF1aXJrcyA9ICZpMmNfb3BhbF9xdWlya3M7CiAJYWRhcHRlci0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CiAJYWRhcHRlci0+ZGV2Lm9mX25vZGUgPSBvZl9ub2RlX2dldChwZGV2LT5kZXYub2Zfbm9kZSk7CiAJcG5hbWUgPSBvZl9nZXRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUsICJpYm0scG9ydC1uYW1lIiwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtY21zcC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wbWNtc3AuYwppbmRleCBkMzdkOWRiLi4yYzQwZWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBtY21zcC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG1jbXNwLmMKQEAgLTQ1NiwxNCArNDU2LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGNtZC0+cmVhZF9sZW4gPiBNU1BfTUFYX0JZVEVTX1BFUl9SVyB8fAotCSAgICBjbWQtPndyaXRlX2xlbiA+IE1TUF9NQVhfQllURVNfUEVSX1JXKSB7Ci0JCWRldl9lcnIoJnBtY21zcHR3aV9hZGFwdGVyLmRldiwKLQkJCSIlczogQ2Fubm90IHRyYW5zZmVyIG1vcmUgdGhhbiAlZCBieXRlc1xuIiwKLQkJCV9fZnVuY19fLCBNU1BfTUFYX0JZVEVTX1BFUl9SVyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCWRldl9kYmcoJnBtY21zcHR3aV9hZGFwdGVyLmRldiwKIAkJIlNldHRpbmcgYWRkcmVzcyB0byAweCUwNHhcbiIsIGNtZC0+YWRkcik7CkBAIC01MjAsMjUgKzUxMiwxNCBAQAogCXN0cnVjdCBwbWNtc3B0d2lfY2ZnIG9sZGNmZywgbmV3Y2ZnOwogCWludCByZXQ7CiAKLQlpZiAobnVtID4gMikgewotCQlkZXZfZGJnKCZhZGFwLT5kZXYsICIlZCBtZXNzYWdlcyB1bnN1cHBvcnRlZFxuIiwgbnVtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfSBlbHNlIGlmIChudW0gPT0gMikgewotCQkvKiBDaGVjayBmb3IgYSBkdWFsIHdyaXRlLXRoZW4tcmVhZCBjb21tYW5kICovCisJaWYgKG51bSA9PSAyKSB7CiAJCXN0cnVjdCBpMmNfbXNnICpuZXh0bXNnID0gbXNnICsgMTsKLQkJaWYgKCEobXNnLT5mbGFncyAmIEkyQ19NX1JEKSAmJgotCQkgICAgKG5leHRtc2ctPmZsYWdzICYgSTJDX01fUkQpICYmCi0JCSAgICBtc2ctPmFkZHIgPT0gbmV4dG1zZy0+YWRkcikgewotCQkJY21kLnR5cGUgPSBNU1BfVFdJX0NNRF9XUklURV9SRUFEOwotCQkJY21kLndyaXRlX2xlbiA9IG1zZy0+bGVuOwotCQkJY21kLndyaXRlX2RhdGEgPSBtc2ctPmJ1ZjsKLQkJCWNtZC5yZWFkX2xlbiA9IG5leHRtc2ctPmxlbjsKLQkJCWNtZC5yZWFkX2RhdGEgPSBuZXh0bXNnLT5idWY7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfZGJnKCZhZGFwLT5kZXYsCi0JCQkJIk5vbiB3cml0ZS1yZWFkIGR1YWwgbWVzc2FnZXMgdW5zdXBwb3J0ZWRcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKworCQljbWQudHlwZSA9IE1TUF9UV0lfQ01EX1dSSVRFX1JFQUQ7CisJCWNtZC53cml0ZV9sZW4gPSBtc2ctPmxlbjsKKwkJY21kLndyaXRlX2RhdGEgPSBtc2ctPmJ1ZjsKKwkJY21kLnJlYWRfbGVuID0gbmV4dG1zZy0+bGVuOworCQljbWQucmVhZF9kYXRhID0gbmV4dG1zZy0+YnVmOwogCX0gZWxzZSBpZiAobXNnLT5mbGFncyAmIEkyQ19NX1JEKSB7CiAJCWNtZC50eXBlID0gTVNQX1RXSV9DTURfUkVBRDsKIAkJY21kLnJlYWRfbGVuID0gbXNnLT5sZW47CkBAIC01OTgsNiArNTc5LDE0IEBACiAJCUkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSB8IEkyQ19GVU5DX1NNQlVTX1BST0NfQ0FMTDsKIH0KIAorc3RhdGljIHN0cnVjdCBpMmNfYWRhcHRlcl9xdWlya3MgcG1jbXNwdHdpX2kyY19xdWlya3MgPSB7CisJLmZsYWdzID0gSTJDX0FRX0NPTUJfV1JJVEVfVEhFTl9SRUFELAorCS5tYXhfd3JpdGVfbGVuID0gTVNQX01BWF9CWVRFU19QRVJfUlcsCisJLm1heF9yZWFkX2xlbiA9IE1TUF9NQVhfQllURVNfUEVSX1JXLAorCS5tYXhfY29tYl8xc3RfbXNnX2xlbiA9IE1TUF9NQVhfQllURVNfUEVSX1JXLAorCS5tYXhfY29tYl8ybmRfbXNnX2xlbiA9IE1TUF9NQVhfQllURVNfUEVSX1JXLAorfTsKKwogLyogLS0gSW5pdGlhbGl6YXRpb24gLS0gKi8KIAogc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHBtY21zcHR3aV9hbGdvID0gewpAQCAtNjA5LDYgKzU5OCw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04gfCBJMkNfQ0xBU1NfU1BELAogCS5hbGdvCQk9ICZwbWNtc3B0d2lfYWxnbywKKwkucXVpcmtzCQk9ICZwbWNtc3B0d2lfaTJjX3F1aXJrcywKIAkubmFtZQkJPSBEUlZfTkFNRSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG93ZXJtYWMuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcG93ZXJtYWMuYwppbmRleCA2MGE1M2MxLi42YWJjZjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXBvd2VybWFjLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1wb3dlcm1hYy5jCkBAIC0xNTMsMTIgKzE1Myw2IEBACiAJaW50CQkJcmVhZDsKIAlpbnQJCQlhZGRyZGlyOwogCi0JaWYgKG51bSAhPSAxKSB7Ci0JCWRldl9lcnIoJmFkYXAtPmRldiwKLQkJCSJNdWx0aS1tZXNzYWdlIEkyQyB0cmFuc2FjdGlvbnMgbm90IHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KIAlpZiAobXNncy0+ZmxhZ3MgJiBJMkNfTV9URU4pCiAJCXJldHVybiAtRUlOVkFMOwogCXJlYWQgPSAobXNncy0+ZmxhZ3MgJiBJMkNfTV9SRCkgIT0gMDsKQEAgLTIwNSw2ICsxOTksOSBAQAogCS5mdW5jdGlvbmFsaXR5CT0gaTJjX3Bvd2VybWFjX2Z1bmMsCiB9OwogCitzdGF0aWMgc3RydWN0IGkyY19hZGFwdGVyX3F1aXJrcyBpMmNfcG93ZXJtYWNfcXVpcmtzID0geworCS5tYXhfbnVtX21zZ3MgPSAxLAorfTsKIAogc3RhdGljIGludCBpMmNfcG93ZXJtYWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKIHsKQEAgLTQzNCw2ICs0MzEsNyBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBhZGFwdGVyKTsKIAlhZGFwdGVyLT5hbGdvID0gJmkyY19wb3dlcm1hY19hbGdvcml0aG07CisJYWRhcHRlci0+cXVpcmtzID0gJmkyY19wb3dlcm1hY19xdWlya3M7CiAJaTJjX3NldF9hZGFwZGF0YShhZGFwdGVyLCBidXMpOwogCWFkYXB0ZXItPmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcXVwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXF1cC5jCmluZGV4IDRkYWQyM2IuLmZkY2JkYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcXVwLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1xdXAuYwpAQCAtNDEyLDE3ICs0MTIsNiBAQAogCXVuc2lnbmVkIGxvbmcgbGVmdDsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBUaGUgUVVQIGJsb2NrIHdpbGwgaXNzdWUgYSBOQUNLIGFuZCBTVE9QIG9uIHRoZSBidXMgd2hlbiByZWFjaGluZwotCSAqIHRoZSBlbmQgb2YgdGhlIHJlYWQsIHRoZSBsZW5ndGggb2YgdGhlIHJlYWQgaXMgc3BlY2lmaWVkIGFzIG9uZSBieXRlCi0JICogd2hpY2ggbGltaXRzIHRoZSBwb3NzaWJsZSByZWFkIHRvIDI1NiAoUVVQX1JFQURfTElNSVQpIGJ5dGVzLgotCSAqLwotCWlmIChtc2ctPmxlbiA+IFFVUF9SRUFEX0xJTUlUKSB7Ci0JCWRldl9lcnIocXVwLT5kZXYsICJIVyBub3QgY2FwYWJsZSBvZiByZWFkcyBvdmVyICVkIGJ5dGVzXG4iLAotCQkJUVVQX1JFQURfTElNSVQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlxdXAtPm1zZyA9IG1zZzsKIAlxdXAtPnBvcyAgPSAwOwogCkBAIC01MzQsNiArNTIzLDE1IEBACiAJLmZ1bmN0aW9uYWxpdHkJPSBxdXBfaTJjX2Z1bmMsCiB9OwogCisvKgorICogVGhlIFFVUCBibG9jayB3aWxsIGlzc3VlIGEgTkFDSyBhbmQgU1RPUCBvbiB0aGUgYnVzIHdoZW4gcmVhY2hpbmcKKyAqIHRoZSBlbmQgb2YgdGhlIHJlYWQsIHRoZSBsZW5ndGggb2YgdGhlIHJlYWQgaXMgc3BlY2lmaWVkIGFzIG9uZSBieXRlCisgKiB3aGljaCBsaW1pdHMgdGhlIHBvc3NpYmxlIHJlYWQgdG8gMjU2IChRVVBfUkVBRF9MSU1JVCkgYnl0ZXMuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXJfcXVpcmtzIHF1cF9pMmNfcXVpcmtzID0geworCS5tYXhfcmVhZF9sZW4gPSBRVVBfUkVBRF9MSU1JVCwKK307CisKIHN0YXRpYyB2b2lkIHF1cF9pMmNfZW5hYmxlX2Nsb2NrcyhzdHJ1Y3QgcXVwX2kyY19kZXYgKnF1cCkKIHsKIAljbGtfcHJlcGFyZV9lbmFibGUocXVwLT5jbGspOwpAQCAtNjcwLDYgKzY2OCw3IEBACiAKIAlpMmNfc2V0X2FkYXBkYXRhKCZxdXAtPmFkYXAsIHF1cCk7CiAJcXVwLT5hZGFwLmFsZ28gPSAmcXVwX2kyY19hbGdvOworCXF1cC0+YWRhcC5xdWlya3MgPSAmcXVwX2kyY19xdWlya3M7CiAJcXVwLT5hZGFwLmRldi5wYXJlbnQgPSBxdXAtPmRldjsKIAlxdXAtPmFkYXAuZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlzdHJsY3B5KHF1cC0+YWRhcC5uYW1lLCAiUVVQIEkyQyBhZGFwdGVyIiwgc2l6ZW9mKHF1cC0+YWRhcC5uYW1lKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXJjYXIuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcmNhci5jCmluZGV4IDcxYTZlMDcuLjVhODRiZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcmNhci5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtcmNhci5jCkBAIC0zODIsMTEgKzM4MiwxMSBAQAogCWlmIChzc3JfZmlsdGVyZWQgJiBTQVIpIHsKIAkJLyogcmVhZCBvciB3cml0ZSByZXF1ZXN0ICovCiAJCWlmIChzc3JfcmF3ICYgU1RNKSB7Ci0JCQlpMmNfc2xhdmVfZXZlbnQocHJpdi0+c2xhdmUsIEkyQ19TTEFWRV9SRVFfUkVBRF9TVEFSVCwgJnZhbHVlKTsKKwkJCWkyY19zbGF2ZV9ldmVudChwcml2LT5zbGF2ZSwgSTJDX1NMQVZFX1JFQURfUkVRVUVTVEVELCAmdmFsdWUpOwogCQkJcmNhcl9pMmNfd3JpdGUocHJpdiwgSUNSWFRYLCB2YWx1ZSk7CiAJCQlyY2FyX2kyY193cml0ZShwcml2LCBJQ1NJRVIsIFNERSB8IFNTUiB8IFNBUik7CiAJCX0gZWxzZSB7Ci0JCQlpMmNfc2xhdmVfZXZlbnQocHJpdi0+c2xhdmUsIEkyQ19TTEFWRV9SRVFfV1JJVEVfU1RBUlQsICZ2YWx1ZSk7CisJCQlpMmNfc2xhdmVfZXZlbnQocHJpdi0+c2xhdmUsIEkyQ19TTEFWRV9XUklURV9SRVFVRVNURUQsICZ2YWx1ZSk7CiAJCQlyY2FyX2kyY19yZWFkKHByaXYsIElDUlhUWCk7CS8qIGR1bW15IHJlYWQgKi8KIAkJCXJjYXJfaTJjX3dyaXRlKHByaXYsIElDU0lFUiwgU0RSIHwgU1NSIHwgU0FSKTsKIAkJfQpAQCAtNDA2LDE3ICs0MDYsMTUgQEAKIAkJaW50IHJldDsKIAogCQl2YWx1ZSA9IHJjYXJfaTJjX3JlYWQocHJpdiwgSUNSWFRYKTsKLQkJcmV0ID0gaTJjX3NsYXZlX2V2ZW50KHByaXYtPnNsYXZlLCBJMkNfU0xBVkVfUkVRX1dSSVRFX0VORCwgJnZhbHVlKTsKKwkJcmV0ID0gaTJjX3NsYXZlX2V2ZW50KHByaXYtPnNsYXZlLCBJMkNfU0xBVkVfV1JJVEVfUkVDRUlWRUQsICZ2YWx1ZSk7CiAJCS8qIFNlbmQgTkFDSyBpbiBjYXNlIG9mIGVycm9yICovCiAJCXJjYXJfaTJjX3dyaXRlKHByaXYsIElDU0NSLCBTSUUgfCBTREJTIHwgKHJldCA8IDAgPyBGTkEgOiAwKSk7Ci0JCWkyY19zbGF2ZV9ldmVudChwcml2LT5zbGF2ZSwgSTJDX1NMQVZFX1JFUV9XUklURV9TVEFSVCwgJnZhbHVlKTsKIAkJcmNhcl9pMmNfd3JpdGUocHJpdiwgSUNTU1IsIH5TRFIgJiAweGZmKTsKIAl9CiAKIAkvKiBtYXN0ZXIgd2FudHMgdG8gcmVhZCBmcm9tIHVzICovCiAJaWYgKHNzcl9maWx0ZXJlZCAmIFNERSkgewotCQlpMmNfc2xhdmVfZXZlbnQocHJpdi0+c2xhdmUsIEkyQ19TTEFWRV9SRVFfUkVBRF9FTkQsICZ2YWx1ZSk7Ci0JCWkyY19zbGF2ZV9ldmVudChwcml2LT5zbGF2ZSwgSTJDX1NMQVZFX1JFUV9SRUFEX1NUQVJULCAmdmFsdWUpOworCQlpMmNfc2xhdmVfZXZlbnQocHJpdi0+c2xhdmUsIEkyQ19TTEFWRV9SRUFEX1BST0NFU1NFRCwgJnZhbHVlKTsKIAkJcmNhcl9pMmNfd3JpdGUocHJpdiwgSUNSWFRYLCB2YWx1ZSk7CiAJCXJjYXJfaTJjX3dyaXRlKHByaXYsIElDU1NSLCB+U0RFICYgMHhmZik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10ZWdyYS5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy10ZWdyYS5jCmluZGV4IDI5ZjE0MzMuLjFiY2Q3NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdGVncmEuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXRlZ3JhLmMKQEAgLTUzMiw3ICs1MzIsNyBAQAogewogCXUzMiBwYWNrZXRfaGVhZGVyOwogCXUzMiBpbnRfbWFzazsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OwogCiAJdGVncmFfaTJjX2ZsdXNoX2ZpZm9zKGkyY19kZXYpOwogCkBAIC01ODUsMTggKzU4NSwyMCBAQAogCWRldl9kYmcoaTJjX2Rldi0+ZGV2LCAidW5tYXNrZWQgaXJxOiAlMDJ4XG4iLAogCQlpMmNfcmVhZGwoaTJjX2RldiwgSTJDX0lOVF9NQVNLKSk7CiAKLQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmkyY19kZXYtPm1zZ19jb21wbGV0ZSwgVEVHUkFfSTJDX1RJTUVPVVQpOworCXRpbWVfbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaTJjX2Rldi0+bXNnX2NvbXBsZXRlLAorCQkJCQkJVEVHUkFfSTJDX1RJTUVPVVQpOwogCXRlZ3JhX2kyY19tYXNrX2lycShpMmNfZGV2LCBpbnRfbWFzayk7CiAKLQlpZiAocmV0ID09IDApIHsKKwlpZiAodGltZV9sZWZ0ID09IDApIHsKIAkJZGV2X2VycihpMmNfZGV2LT5kZXYsICJpMmMgdHJhbnNmZXIgdGltZWQgb3V0XG4iKTsKIAogCQl0ZWdyYV9pMmNfaW5pdChpMmNfZGV2KTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CiAJfQogCi0JZGV2X2RiZyhpMmNfZGV2LT5kZXYsICJ0cmFuc2ZlciBjb21wbGV0ZTogJWQgJWQgJWRcbiIsCi0JCXJldCwgY29tcGxldGlvbl9kb25lKCZpMmNfZGV2LT5tc2dfY29tcGxldGUpLCBpMmNfZGV2LT5tc2dfZXJyKTsKKwlkZXZfZGJnKGkyY19kZXYtPmRldiwgInRyYW5zZmVyIGNvbXBsZXRlOiAlbHUgJWQgJWRcbiIsCisJCXRpbWVfbGVmdCwgY29tcGxldGlvbl9kb25lKCZpMmNfZGV2LT5tc2dfY29tcGxldGUpLAorCQlpMmNfZGV2LT5tc2dfZXJyKTsKIAogCWlmIChsaWtlbHkoaTJjX2Rldi0+bXNnX2VyciA9PSBJMkNfRVJSX05PTkUpKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtdmlwZXJib2FyZC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aXBlcmJvYXJkLmMKaW5kZXggNzUzM2ZhMy4uNDdlODhhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aXBlcmJvYXJkLmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy12aXBlcmJvYXJkLmMKQEAgLTI4OCwxMCArMjg4LDYgQEAKIAkJCWksIHBtc2ctPmZsYWdzICYgSTJDX01fUkQgPyAicmVhZCIgOiAid3JpdGUiLAogCQkJcG1zZy0+ZmxhZ3MsIHBtc2ctPmxlbiwgcG1zZy0+YWRkcik7CiAKLQkJLyogbXNncyBsb25nZXIgdGhhbiAyMDQ4IGJ5dGVzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IGFkYXB0ZXIgKi8KLQkJaWYgKHBtc2ctPmxlbiA+IDIwNDgpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQogCQltdXRleF9sb2NrKCZ2Yi0+bG9jayk7CiAJCS8qIGRpcmVjdGx5IHNlbmQgdGhlIG1lc3NhZ2UgKi8KIAkJaWYgKHBtc2ctPmZsYWdzICYgSTJDX01fUkQpIHsKQEAgLTM1OCw2ICszNTQsMTEgQEAKIAkuZnVuY3Rpb25hbGl0eQk9IHZwcmJyZF9pMmNfZnVuYywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXJfcXVpcmtzIHZwcmJyZF9xdWlya3MgPSB7CisJLm1heF9yZWFkX2xlbiA9IDIwNDgsCisJLm1heF93cml0ZV9sZW4gPSAyMDQ4LAorfTsKKwogc3RhdGljIGludCB2cHJicmRfaTJjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHZwcmJyZCAqdmIgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CkBAIC0zNzMsNiArMzc0LDcgQEAKIAl2Yl9pMmMtPmkyYy5vd25lciA9IFRISVNfTU9EVUxFOwogCXZiX2kyYy0+aTJjLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OOwogCXZiX2kyYy0+aTJjLmFsZ28gPSAmdnByYnJkX2FsZ29yaXRobTsKKwl2Yl9pMmMtPmkyYy5xdWlya3MgPSAmdnByYnJkX3F1aXJrczsKIAl2Yl9pMmMtPmkyYy5hbGdvX2RhdGEgPSB2YjsKIAkvKiBzYXZlIHRoZSBwYXJhbSBpbiB1c2IgY2FwYWJhYmxlIG1lbW9yeSAqLwogCXZiX2kyYy0+YnVzX2ZyZXFfcGFyYW0gPSBpMmNfYnVzX3BhcmFtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy13bXQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtd210LmMKaW5kZXggODJlYTM0OS4uZTFlM2E4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy13bXQuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXdtdC5jCkBAIC0xMjgsNyArMTI4LDggQEAKIHsKIAlzdHJ1Y3Qgd210X2kyY19kZXYgKmkyY19kZXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOwogCXUxNiB2YWwsIHRjcl92YWw7Ci0JaW50IHJldCwgd2FpdF9yZXN1bHQ7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHdhaXRfcmVzdWx0OwogCWludCB4ZmVyX2xlbiA9IDA7CiAKIAlpZiAoIShwbXNnLT5mbGFncyAmIEkyQ19NX05PU1RBUlQpKSB7CkBAIC0xNzcsNyArMTc4LDcgQEAKIAogCXdoaWxlICh4ZmVyX2xlbiA8IHBtc2ctPmxlbikgewogCQl3YWl0X3Jlc3VsdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaTJjX2Rldi0+Y29tcGxldGUsCi0JCQkJCQkJICA1MDAgKiBIWiAvIDEwMDApOworCQkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7CiAKIAkJaWYgKHdhaXRfcmVzdWx0ID09IDApCiAJCQlyZXR1cm4gLUVUSU1FRE9VVDsKQEAgLTIxOCw3ICsyMTksOCBAQAogewogCXN0cnVjdCB3bXRfaTJjX2RldiAqaTJjX2RldiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcCk7CiAJdTE2IHZhbCwgdGNyX3ZhbDsKLQlpbnQgcmV0LCB3YWl0X3Jlc3VsdDsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgd2FpdF9yZXN1bHQ7CiAJdTMyIHhmZXJfbGVuID0gMDsKIAogCWlmICghKHBtc2ctPmZsYWdzICYgSTJDX01fTk9TVEFSVCkpIHsKQEAgLTI2Niw3ICsyNjgsNyBAQAogCiAJd2hpbGUgKHhmZXJfbGVuIDwgcG1zZy0+bGVuKSB7CiAJCXdhaXRfcmVzdWx0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpMmNfZGV2LT5jb21wbGV0ZSwKLQkJCQkJCQkgIDUwMCAqIEhaIC8gMTAwMCk7CisJCQkJCQkJbXNlY3NfdG9famlmZmllcyg1MDApKTsKIAogCQlpZiAoIXdhaXRfcmVzdWx0KQogCQkJcmV0dXJuIC1FVElNRURPVVQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXhscDl4eC5jIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy14bHA5eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQxNDE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy14bHA5eHguYwpAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE1IEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjZGVmaW5lIFhMUDlYWF9JMkNfRElWCQkJMHgwCisjZGVmaW5lIFhMUDlYWF9JMkNfQ1RSTAkJCTB4MQorI2RlZmluZSBYTFA5WFhfSTJDX0NNRAkJCTB4MgorI2RlZmluZSBYTFA5WFhfSTJDX1NUQVRVUwkJMHgzCisjZGVmaW5lIFhMUDlYWF9JMkNfTVRYRklGTwkJMHg0CisjZGVmaW5lIFhMUDlYWF9JMkNfTVJYRklGTwkJMHg1CisjZGVmaW5lIFhMUDlYWF9JMkNfTUZJRk9DVFJMCQkweDYKKyNkZWZpbmUgWExQOVhYX0kyQ19TVFhGSUZPCQkweDcKKyNkZWZpbmUgWExQOVhYX0kyQ19TUlhGSUZPCQkweDgKKyNkZWZpbmUgWExQOVhYX0kyQ19TRklGT0NUUkwJCTB4OQorI2RlZmluZSBYTFA5WFhfSTJDX1NMQVZFQUREUgkJMHhBCisjZGVmaW5lIFhMUDlYWF9JMkNfT1dOQUREUgkJMHhCCisjZGVmaW5lIFhMUDlYWF9JMkNfRklGT1dDTlQJCTB4QworI2RlZmluZSBYTFA5WFhfSTJDX0lOVEVOCQkweEQKKyNkZWZpbmUgWExQOVhYX0kyQ19JTlRTVAkJMHhFCisjZGVmaW5lIFhMUDlYWF9JMkNfV0FJVENOVAkJMHhGCisjZGVmaW5lIFhMUDlYWF9JMkNfVElNRU9VVAkJMFgxMAorI2RlZmluZSBYTFA5WFhfSTJDX0dFTkNBTExBRERSCQkweDExCisKKyNkZWZpbmUgWExQOVhYX0kyQ19DTURfU1RBUlQJCUJJVCg3KQorI2RlZmluZSBYTFA5WFhfSTJDX0NNRF9TVE9QCQlCSVQoNikKKyNkZWZpbmUgWExQOVhYX0kyQ19DTURfUkVBRAkJQklUKDUpCisjZGVmaW5lIFhMUDlYWF9JMkNfQ01EX1dSSVRFCQlCSVQoNCkKKyNkZWZpbmUgWExQOVhYX0kyQ19DTURfQUNLCQlCSVQoMykKKworI2RlZmluZSBYTFA5WFhfSTJDX0NUUkxfTUNUTEVOX1NISUZUCTE2CisjZGVmaW5lIFhMUDlYWF9JMkNfQ1RSTF9NQ1RMRU5fTUFTSwkweGZmZmYwMDAwCisjZGVmaW5lIFhMUDlYWF9JMkNfQ1RSTF9SU1QJCUJJVCg4KQorI2RlZmluZSBYTFA5WFhfSTJDX0NUUkxfRU4JCUJJVCg2KQorI2RlZmluZSBYTFA5WFhfSTJDX0NUUkxfTUFTVEVSCQlCSVQoNCkKKyNkZWZpbmUgWExQOVhYX0kyQ19DVFJMX0ZJRk9SRAkJQklUKDEpCisjZGVmaW5lIFhMUDlYWF9JMkNfQ1RSTF9BRERNT0RFCQlCSVQoMCkKKworI2RlZmluZSBYTFA5WFhfSTJDX0lOVEVOX05BQ0tBRERSCUJJVCgyNSkKKyNkZWZpbmUgWExQOVhYX0kyQ19JTlRFTl9TQUREUgkJQklUKDEzKQorI2RlZmluZSBYTFA5WFhfSTJDX0lOVEVOX0RBVEFET05FCUJJVCgxMikKKyNkZWZpbmUgWExQOVhYX0kyQ19JTlRFTl9BUkxPU1QJCUJJVCgxMSkKKyNkZWZpbmUgWExQOVhYX0kyQ19JTlRFTl9NRklGT0ZVTEwJQklUKDQpCisjZGVmaW5lIFhMUDlYWF9JMkNfSU5URU5fTUZJRk9FTVRZCUJJVCgzKQorI2RlZmluZSBYTFA5WFhfSTJDX0lOVEVOX01GSUZPSEkJQklUKDIpCisjZGVmaW5lIFhMUDlYWF9JMkNfSU5URU5fQlVTRVJSCQlCSVQoMCkKKworI2RlZmluZSBYTFA5WFhfSTJDX01GSUZPQ1RSTF9ISVRIX1NISUZUCQk4CisjZGVmaW5lIFhMUDlYWF9JMkNfTUZJRk9DVFJMX0xPVEhfU0hJRlQJCTAKKyNkZWZpbmUgWExQOVhYX0kyQ19NRklGT0NUUkxfUlNUCQlCSVQoMTYpCisKKyNkZWZpbmUgWExQOVhYX0kyQ19TTEFWRUFERFJfUlcJCQlCSVQoMCkKKyNkZWZpbmUgWExQOVhYX0kyQ19TTEFWRUFERFJfQUREUl9TSElGVAkJMQorCisjZGVmaW5lIFhMUDlYWF9JMkNfSVBfQ0xLX0ZSRVEJCTEzMzAwMDAwMFVMCisjZGVmaW5lIFhMUDlYWF9JMkNfREVGQVVMVF9GUkVRCQkxMDAwMDAKKyNkZWZpbmUgWExQOVhYX0kyQ19ISUdIX0ZSRVEJCTQwMDAwMAorI2RlZmluZSBYTFA5WFhfSTJDX0ZJRk9fU0laRQkJMHg4MFUKKyNkZWZpbmUgWExQOVhYX0kyQ19USU1FT1VUX01TCQkxMDAwCisKKyNkZWZpbmUgWExQOVhYX0kyQ19GSUZPX1dDTlRfTUFTSwkweGZmCisjZGVmaW5lIFhMUDlYWF9JMkNfU1RBVFVTX0VSUk1BU0sJKFhMUDlYWF9JMkNfSU5URU5fQVJMT1NUIHwgXAorCQkJWExQOVhYX0kyQ19JTlRFTl9OQUNLQUREUiB8IFhMUDlYWF9JMkNfSU5URU5fQlVTRVJSKQorCitzdHJ1Y3QgeGxwOXh4X2kyY19kZXYgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcHRlcjsKKwlzdHJ1Y3QgY29tcGxldGlvbiBtc2dfY29tcGxldGU7CisJaW50IGlycTsKKwlib29sIG1zZ19yZWFkOworCXUzMiBfX2lvbWVtICpiYXNlOworCXUzMiBtc2dfYnVmX3JlbWFpbmluZzsKKwl1MzIgbXNnX2xlbjsKKwl1MzIgY2xrX2h6OworCXUzMiBtc2dfZXJyOworCXU4ICptc2dfYnVmOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHhscDl4eF93cml0ZV9pMmNfcmVnKHN0cnVjdCB4bHA5eHhfaTJjX2RldiAqcHJpdiwKKwkJCQkJdW5zaWduZWQgbG9uZyByZWcsIHUzMiB2YWwpCit7CisJd3JpdGVsKHZhbCwgcHJpdi0+YmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHhscDl4eF9yZWFkX2kyY19yZWcoc3RydWN0IHhscDl4eF9pMmNfZGV2ICpwcml2LAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgcmVnKQoreworCXJldHVybiByZWFkbChwcml2LT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgeGxwOXh4X2kyY19tYXNrX2lycShzdHJ1Y3QgeGxwOXh4X2kyY19kZXYgKnByaXYsIHUzMiBtYXNrKQoreworCXUzMiBpbnRlbjsKKworCWludGVuID0geGxwOXh4X3JlYWRfaTJjX3JlZyhwcml2LCBYTFA5WFhfSTJDX0lOVEVOKSAmIH5tYXNrOworCXhscDl4eF93cml0ZV9pMmNfcmVnKHByaXYsIFhMUDlYWF9JMkNfSU5URU4sIGludGVuKTsKK30KKworc3RhdGljIHZvaWQgeGxwOXh4X2kyY191bm1hc2tfaXJxKHN0cnVjdCB4bHA5eHhfaTJjX2RldiAqcHJpdiwgdTMyIG1hc2spCit7CisJdTMyIGludGVuOworCisJaW50ZW4gPSB4bHA5eHhfcmVhZF9pMmNfcmVnKHByaXYsIFhMUDlYWF9JMkNfSU5URU4pIHwgbWFzazsKKwl4bHA5eHhfd3JpdGVfaTJjX3JlZyhwcml2LCBYTFA5WFhfSTJDX0lOVEVOLCBpbnRlbik7Cit9CisKK3N0YXRpYyB2b2lkIHhscDl4eF9pMmNfdXBkYXRlX3J4X2ZpZm9fdGhyZXMoc3RydWN0IHhscDl4eF9pMmNfZGV2ICpwcml2KQoreworCXUzMiB0aHJlczsKKworCXRocmVzID0gbWluKHByaXYtPm1zZ19idWZfcmVtYWluaW5nLCBYTFA5WFhfSTJDX0ZJRk9fU0laRSk7CisJeGxwOXh4X3dyaXRlX2kyY19yZWcocHJpdiwgWExQOVhYX0kyQ19NRklGT0NUUkwsCisJCQkgICAgIHRocmVzIDw8IFhMUDlYWF9JMkNfTUZJRk9DVFJMX0hJVEhfU0hJRlQpOworfQorCitzdGF0aWMgdm9pZCB4bHA5eHhfaTJjX2ZpbGxfdHhfZmlmbyhzdHJ1Y3QgeGxwOXh4X2kyY19kZXYgKnByaXYpCit7CisJdTMyIGxlbiwgaTsKKwl1OCAqYnVmID0gcHJpdi0+bXNnX2J1ZjsKKworCWxlbiA9IG1pbihwcml2LT5tc2dfYnVmX3JlbWFpbmluZywgWExQOVhYX0kyQ19GSUZPX1NJWkUpOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJeGxwOXh4X3dyaXRlX2kyY19yZWcocHJpdiwgWExQOVhYX0kyQ19NVFhGSUZPLCBidWZbaV0pOworCXByaXYtPm1zZ19idWZfcmVtYWluaW5nIC09IGxlbjsKKwlwcml2LT5tc2dfYnVmICs9IGxlbjsKK30KKworc3RhdGljIHZvaWQgeGxwOXh4X2kyY19kcmFpbl9yeF9maWZvKHN0cnVjdCB4bHA5eHhfaTJjX2RldiAqcHJpdikKK3sKKwl1MzIgbGVuLCBpOworCXU4ICpidWYgPSBwcml2LT5tc2dfYnVmOworCisJbGVuID0geGxwOXh4X3JlYWRfaTJjX3JlZyhwcml2LCBYTFA5WFhfSTJDX0ZJRk9XQ05UKSAmCisJCQkJICBYTFA5WFhfSTJDX0ZJRk9fV0NOVF9NQVNLOworCWxlbiA9IG1pbihwcml2LT5tc2dfYnVmX3JlbWFpbmluZywgbGVuKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIGJ1ZisrKQorCQkqYnVmID0geGxwOXh4X3JlYWRfaTJjX3JlZyhwcml2LCBYTFA5WFhfSTJDX01SWEZJRk8pOworCisJcHJpdi0+bXNnX2J1Zl9yZW1haW5pbmcgLT0gbGVuOworCXByaXYtPm1zZ19idWYgPSBidWY7CisKKwlpZiAocHJpdi0+bXNnX2J1Zl9yZW1haW5pbmcpCisJCXhscDl4eF9pMmNfdXBkYXRlX3J4X2ZpZm9fdGhyZXMocHJpdik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB4bHA5eHhfaTJjX2lzcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IHhscDl4eF9pMmNfZGV2ICpwcml2ID0gZGV2X2lkOworCXUzMiBzdGF0dXM7CisKKwlzdGF0dXMgPSB4bHA5eHhfcmVhZF9pMmNfcmVnKHByaXYsIFhMUDlYWF9JMkNfSU5UU1QpOworCWlmIChzdGF0dXMgPT0gMCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJeGxwOXh4X3dyaXRlX2kyY19yZWcocHJpdiwgWExQOVhYX0kyQ19JTlRTVCwgc3RhdHVzKTsKKwlpZiAoc3RhdHVzICYgWExQOVhYX0kyQ19TVEFUVVNfRVJSTUFTSykgeworCQlwcml2LT5tc2dfZXJyID0gc3RhdHVzOworCQlnb3RvIHhmZXJfZG9uZTsKKwl9CisKKwkvKiBTQUREUiBBQ0sgZm9yIFNNQlVTX1FVSUNLICovCisJaWYgKChzdGF0dXMgJiBYTFA5WFhfSTJDX0lOVEVOX1NBRERSKSAmJiAocHJpdi0+bXNnX2xlbiA9PSAwKSkKKwkJZ290byB4ZmVyX2RvbmU7CisKKwlpZiAoIXByaXYtPm1zZ19yZWFkKSB7CisJCWlmIChzdGF0dXMgJiBYTFA5WFhfSTJDX0lOVEVOX01GSUZPRU1UWSkgeworCQkJLyogVFggRklGTyBnb3QgZW1wdHksIGZpbGwgaXQgdXAgYWdhaW4gKi8KKwkJCWlmIChwcml2LT5tc2dfYnVmX3JlbWFpbmluZykKKwkJCQl4bHA5eHhfaTJjX2ZpbGxfdHhfZmlmbyhwcml2KTsKKwkJCWVsc2UKKwkJCQl4bHA5eHhfaTJjX21hc2tfaXJxKHByaXYsCisJCQkJCQkgICAgWExQOVhYX0kyQ19JTlRFTl9NRklGT0VNVFkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHN0YXR1cyAmIChYTFA5WFhfSTJDX0lOVEVOX0RBVEFET05FIHwKKwkJCSAgICAgIFhMUDlYWF9JMkNfSU5URU5fTUZJRk9ISSkpIHsKKwkJCS8qIGRhdGEgaXMgaW4gRklGTywgcmVhZCBpdCAqLworCQkJaWYgKHByaXYtPm1zZ19idWZfcmVtYWluaW5nKQorCQkJCXhscDl4eF9pMmNfZHJhaW5fcnhfZmlmbyhwcml2KTsKKwkJfQorCX0KKworCS8qIFRyYW5zZmVyIGNvbXBsZXRlICovCisJaWYgKHN0YXR1cyAmIFhMUDlYWF9JMkNfSU5URU5fREFUQURPTkUpCisJCWdvdG8geGZlcl9kb25lOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworCit4ZmVyX2RvbmU6CisJeGxwOXh4X3dyaXRlX2kyY19yZWcocHJpdiwgWExQOVhYX0kyQ19JTlRFTiwgMCk7CisJY29tcGxldGUoJnByaXYtPm1zZ19jb21wbGV0ZSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHhscDl4eF9pMmNfaW5pdChzdHJ1Y3QgeGxwOXh4X2kyY19kZXYgKnByaXYpCit7CisJdTMyIHByZXNjYWxlOworCisJLyoKKwkgKiBUaGUgY29udHJvbGxlciB1c2VzIDUgKiBTQ0wgY2xvY2sgaW50ZXJuYWxseS4KKwkgKiBTbyBwcmVzY2FsZSB2YWx1ZSBzaG91bGQgYmUgZGl2aWRlZCBieSA1LgorCSAqLworCXByZXNjYWxlID0gRElWX1JPVU5EX1VQKFhMUDlYWF9JMkNfSVBfQ0xLX0ZSRVEsIHByaXYtPmNsa19oeik7CisJcHJlc2NhbGUgPSAoKHByZXNjYWxlIC0gOCkgLyA1KSAtIDE7CisJeGxwOXh4X3dyaXRlX2kyY19yZWcocHJpdiwgWExQOVhYX0kyQ19DVFJMLCBYTFA5WFhfSTJDX0NUUkxfUlNUKTsKKwl4bHA5eHhfd3JpdGVfaTJjX3JlZyhwcml2LCBYTFA5WFhfSTJDX0NUUkwsIFhMUDlYWF9JMkNfQ1RSTF9FTiB8CisJCQkgICAgIFhMUDlYWF9JMkNfQ1RSTF9NQVNURVIpOworCXhscDl4eF93cml0ZV9pMmNfcmVnKHByaXYsIFhMUDlYWF9JMkNfRElWLCBwcmVzY2FsZSk7CisJeGxwOXh4X3dyaXRlX2kyY19yZWcocHJpdiwgWExQOVhYX0kyQ19JTlRFTiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4bHA5eHhfaTJjX3hmZXJfbXNnKHN0cnVjdCB4bHA5eHhfaTJjX2RldiAqcHJpdiwgc3RydWN0IGkyY19tc2cgKm1zZywKKwkJCSAgICAgICBpbnQgbGFzdF9tc2cpCit7CisJdW5zaWduZWQgbG9uZyB0aW1lbGVmdDsKKwl1MzIgaW50cl9tYXNrLCBjbWQsIHZhbDsKKworCXByaXYtPm1zZ19idWYgPSBtc2ctPmJ1ZjsKKwlwcml2LT5tc2dfYnVmX3JlbWFpbmluZyA9IHByaXYtPm1zZ19sZW4gPSBtc2ctPmxlbjsKKwlwcml2LT5tc2dfZXJyID0gMDsKKwlwcml2LT5tc2dfcmVhZCA9IChtc2ctPmZsYWdzICYgSTJDX01fUkQpOworCXJlaW5pdF9jb21wbGV0aW9uKCZwcml2LT5tc2dfY29tcGxldGUpOworCisJLyogUmVzZXQgRklGTyAqLworCXhscDl4eF93cml0ZV9pMmNfcmVnKHByaXYsIFhMUDlYWF9JMkNfTUZJRk9DVFJMLAorCQkJICAgICBYTFA5WFhfSTJDX01GSUZPQ1RSTF9SU1QpOworCisJLyogc2V0IEZJRk8gdGhyZXNob2xkIGlmIHJlYWRpbmcgKi8KKwlpZiAocHJpdi0+bXNnX3JlYWQpCisJCXhscDl4eF9pMmNfdXBkYXRlX3J4X2ZpZm9fdGhyZXMocHJpdik7CisKKwkvKiBzZXQgc2xhdmUgYWRkciAqLworCXhscDl4eF93cml0ZV9pMmNfcmVnKHByaXYsIFhMUDlYWF9JMkNfU0xBVkVBRERSLAorCQkJICAgICAobXNnLT5hZGRyIDw8IFhMUDlYWF9JMkNfU0xBVkVBRERSX0FERFJfU0hJRlQpIHwKKwkJCSAgICAgKHByaXYtPm1zZ19yZWFkID8gWExQOVhYX0kyQ19TTEFWRUFERFJfUlcgOiAwKSk7CisKKwkvKiBCdWlsZCBjb250cm9sIHdvcmQgZm9yIHRyYW5zZmVyICovCisJdmFsID0geGxwOXh4X3JlYWRfaTJjX3JlZyhwcml2LCBYTFA5WFhfSTJDX0NUUkwpOworCWlmICghcHJpdi0+bXNnX3JlYWQpCisJCXZhbCAmPSB+WExQOVhYX0kyQ19DVFJMX0ZJRk9SRDsKKwllbHNlCisJCXZhbCB8PSBYTFA5WFhfSTJDX0NUUkxfRklGT1JEOwkvKiByZWFkICovCisKKwlpZiAobXNnLT5mbGFncyAmIEkyQ19NX1RFTikKKwkJdmFsIHw9IFhMUDlYWF9JMkNfQ1RSTF9BRERNT0RFOwkvKiAxMC1iaXQgYWRkcmVzcyBtb2RlKi8KKwllbHNlCisJCXZhbCAmPSB+WExQOVhYX0kyQ19DVFJMX0FERE1PREU7CisKKwkvKiBzZXQgZGF0YSBsZW5ndGggdG8gYmUgdHJhbnNmZXJyZWQgKi8KKwl2YWwgPSAodmFsICYgflhMUDlYWF9JMkNfQ1RSTF9NQ1RMRU5fTUFTSykgfAorCSAgICAgIChtc2ctPmxlbiA8PCBYTFA5WFhfSTJDX0NUUkxfTUNUTEVOX1NISUZUKTsKKwl4bHA5eHhfd3JpdGVfaTJjX3JlZyhwcml2LCBYTFA5WFhfSTJDX0NUUkwsIHZhbCk7CisKKwkvKiBmaWxsIGZpZm8gZHVyaW5nIHR4ICovCisJaWYgKCFwcml2LT5tc2dfcmVhZCkKKwkJeGxwOXh4X2kyY19maWxsX3R4X2ZpZm8ocHJpdik7CisKKwkvKiBzZXQgaW50ZXJydXB0IG1hc2sgKi8KKwlpbnRyX21hc2sgPSAoWExQOVhYX0kyQ19JTlRFTl9BUkxPU1QgfCBYTFA5WFhfSTJDX0lOVEVOX0JVU0VSUiB8CisJCSAgICAgWExQOVhYX0kyQ19JTlRFTl9OQUNLQUREUiB8IFhMUDlYWF9JMkNfSU5URU5fREFUQURPTkUpOworCisJaWYgKHByaXYtPm1zZ19yZWFkKSB7CisJCWludHJfbWFzayB8PSBYTFA5WFhfSTJDX0lOVEVOX01GSUZPSEk7CisJCWlmIChtc2ctPmxlbiA9PSAwKQorCQkJaW50cl9tYXNrIHw9IFhMUDlYWF9JMkNfSU5URU5fU0FERFI7CisJfSBlbHNlIHsKKwkJaWYgKG1zZy0+bGVuID09IDApCisJCQlpbnRyX21hc2sgfD0gWExQOVhYX0kyQ19JTlRFTl9TQUREUjsKKwkJZWxzZQorCQkJaW50cl9tYXNrIHw9IFhMUDlYWF9JMkNfSU5URU5fTUZJRk9FTVRZOworCX0KKwl4bHA5eHhfaTJjX3VubWFza19pcnEocHJpdiwgaW50cl9tYXNrKTsKKworCS8qIHNldCBjbWQgcmVnICovCisJY21kID0gWExQOVhYX0kyQ19DTURfU1RBUlQ7CisJY21kIHw9IChwcml2LT5tc2dfcmVhZCA/IFhMUDlYWF9JMkNfQ01EX1JFQUQgOiBYTFA5WFhfSTJDX0NNRF9XUklURSk7CisJaWYgKGxhc3RfbXNnKQorCQljbWQgfD0gWExQOVhYX0kyQ19DTURfU1RPUDsKKworCXhscDl4eF93cml0ZV9pMmNfcmVnKHByaXYsIFhMUDlYWF9JMkNfQ01ELCBjbWQpOworCisJdGltZWxlZnQgPSBtc2Vjc190b19qaWZmaWVzKFhMUDlYWF9JMkNfVElNRU9VVF9NUyk7CisJdGltZWxlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnByaXYtPm1zZ19jb21wbGV0ZSwgdGltZWxlZnQpOworCisJaWYgKHByaXYtPm1zZ19lcnIpIHsKKwkJZGV2X2RiZyhwcml2LT5kZXYsICJ0cmFuc2ZlciBlcnJvciAleCFcbiIsIHByaXYtPm1zZ19lcnIpOworCQlpZiAocHJpdi0+bXNnX2VyciAmIFhMUDlYWF9JMkNfSU5URU5fQlVTRVJSKQorCQkJeGxwOXh4X2kyY19pbml0KHByaXYpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlpZiAodGltZWxlZnQgPT0gMCkgeworCQlkZXZfZGJnKHByaXYtPmRldiwgImkyYyB0cmFuc2ZlciB0aW1lZCBvdXQhXG4iKTsKKwkJeGxwOXh4X2kyY19pbml0KHByaXYpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4bHA5eHhfaTJjX3hmZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNncywKKwkJCSAgIGludCBudW0pCit7CisJaW50IGksIHJldDsKKwlzdHJ1Y3QgeGxwOXh4X2kyY19kZXYgKnByaXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXJldCA9IHhscDl4eF9pMmNfeGZlcl9tc2cocHJpdiwgJm1zZ3NbaV0sIGkgPT0gbnVtIC0gMSk7CisJCWlmIChyZXQgIT0gMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIG51bTsKK30KKworc3RhdGljIHUzMiB4bHA5eHhfaTJjX2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19FTVVMIHwgSTJDX0ZVTkNfSTJDIHwKKwkJSTJDX0ZVTkNfMTBCSVRfQUREUjsKK30KKworc3RhdGljIHN0cnVjdCBpMmNfYWxnb3JpdGhtIHhscDl4eF9pMmNfYWxnbyA9IHsKKwkubWFzdGVyX3hmZXIgPSB4bHA5eHhfaTJjX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSB4bHA5eHhfaTJjX2Z1bmN0aW9uYWxpdHksCit9OworCitzdGF0aWMgaW50IHhscDl4eF9pMmNfZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCSAgICBzdHJ1Y3QgeGxwOXh4X2kyY19kZXYgKnByaXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXUzMiBmcmVxOworCWludCBlcnI7CisKKwllcnIgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNsb2NrLWZyZXF1ZW5jeSIsICZmcmVxKTsKKwlpZiAoZXJyKSB7CisJCWZyZXEgPSBYTFA5WFhfSTJDX0RFRkFVTFRfRlJFUTsKKwkJZGV2X2RiZygmcGRldi0+ZGV2LCAidXNpbmcgZGVmYXVsdCBmcmVxdWVuY3kgJXVcbiIsIGZyZXEpOworCX0gZWxzZSBpZiAoZnJlcSA9PSAwIHx8IGZyZXEgPiBYTFA5WFhfSTJDX0hJR0hfRlJFUSkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiaW52YWxpZCBmcmVxdWVuY3kgJXUsIHVzaW5nIGRlZmF1bHRcbiIsCisJCQkgZnJlcSk7CisJCWZyZXEgPSBYTFA5WFhfSTJDX0RFRkFVTFRfRlJFUTsKKwl9CisJcHJpdi0+Y2xrX2h6ID0gZnJlcTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhscDl4eF9pMmNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgeGxwOXh4X2kyY19kZXYgKnByaXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGVyciA9IDA7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXByaXYtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHByaXYtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihwcml2LT5iYXNlKTsKKworCXByaXYtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHByaXYtPmlycSA8PSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgaXJxIVxuIik7CisJCXJldHVybiBwcml2LT5pcnE7CisJfQorCisJeGxwOXh4X2kyY19nZXRfZnJlcXVlbmN5KHBkZXYsIHByaXYpOworCXhscDl4eF9pMmNfaW5pdChwcml2KTsKKworCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgcHJpdi0+aXJxLCB4bHA5eHhfaTJjX2lzciwgMCwKKwkJCSAgICAgICBwZGV2LT5uYW1lLCBwcml2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIklSUSByZXF1ZXN0IGZhaWxlZCFcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWluaXRfY29tcGxldGlvbigmcHJpdi0+bXNnX2NvbXBsZXRlKTsKKwlwcml2LT5hZGFwdGVyLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2OworCXByaXYtPmFkYXB0ZXIuYWxnbyA9ICZ4bHA5eHhfaTJjX2FsZ287CisJcHJpdi0+YWRhcHRlci5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXByaXYtPmRldiA9ICZwZGV2LT5kZXY7CisKKwlzbnByaW50Zihwcml2LT5hZGFwdGVyLm5hbWUsIHNpemVvZihwcml2LT5hZGFwdGVyLm5hbWUpLCAieGxwOXh4LWkyYyIpOworCWkyY19zZXRfYWRhcGRhdGEoJnByaXYtPmFkYXB0ZXIsIHByaXYpOworCisJZXJyID0gaTJjX2FkZF9hZGFwdGVyKCZwcml2LT5hZGFwdGVyKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhZGQgSTJDIGFkYXB0ZXIhXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJJMkMgYnVzOiVkIGFkZGVkXG4iLCBwcml2LT5hZGFwdGVyLm5yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhscDl4eF9pMmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHhscDl4eF9pMmNfZGV2ICpwcml2OworCisJcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXhscDl4eF93cml0ZV9pMmNfcmVnKHByaXYsIFhMUDlYWF9JMkNfSU5URU4sIDApOworCXN5bmNocm9uaXplX2lycShwcml2LT5pcnEpOworCWkyY19kZWxfYWRhcHRlcigmcHJpdi0+YWRhcHRlcik7CisJeGxwOXh4X3dyaXRlX2kyY19yZWcocHJpdiwgWExQOVhYX0kyQ19DVFJMLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB4bHA5eHhfaTJjX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJuZXRsb2dpYyx4bHA5ODAtaTJjIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB4bHA5eHhfaTJjX2RyaXZlciA9IHsKKwkucHJvYmUgPSB4bHA5eHhfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSB4bHA5eHhfaTJjX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ4bHA5eHgtaTJjIiwKKwkJLm9mX21hdGNoX3RhYmxlID0geGxwOXh4X2kyY19vZl9tYXRjaCwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih4bHA5eHhfaTJjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlN1YmhlbmR1IFNla2hhciBCZWhlcmEgPHNiZWhlcmFAYnJvYWRjb20uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYTFA5WFgvNVhYIEkyQyBCdXMgQ29udHJvbGxlciBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMgYi9kcml2ZXJzL2kyYy9pMmMtY29yZS5jCmluZGV4IGVkZjI3NGMuLjE2NzJlNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2kyYy1jb3JlLmMKKysrIGIvZHJpdmVycy9pMmMvaTJjLWNvcmUuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJCXJldHVybiBBRV9PSzsKIAogCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKLQlpbmZvLmFjcGlfbm9kZS5jb21wYW5pb24gPSBhZGV2OworCWluZm8uZndub2RlID0gYWNwaV9md25vZGVfaGFuZGxlKGFkZXYpOwogCWluZm8uaXJxID0gLTE7CiAKIAlJTklUX0xJU1RfSEVBRCgmcmVzb3VyY2VfbGlzdCk7CkBAIC01NjEsNyArNTYxLDcgQEAKIAlpbnQgaSA9IDAsIHZhbCA9IDEsIHJldCA9IDA7CiAKIAlpZiAoYnJpLT5wcmVwYXJlX3JlY292ZXJ5KQotCQlicmktPnByZXBhcmVfcmVjb3ZlcnkoYnJpKTsKKwkJYnJpLT5wcmVwYXJlX3JlY292ZXJ5KGFkYXApOwogCiAJLyoKIAkgKiBCeSB0aGlzIHRpbWUgU0NMIGlzIGhpZ2gsIGFzIHdlIG5lZWQgdG8gZ2l2ZSA5IGZhbGxpbmctcmlzaW5nIGVkZ2VzCkBAIC01ODYsNyArNTg2LDcgQEAKIAl9CiAKIAlpZiAoYnJpLT51bnByZXBhcmVfcmVjb3ZlcnkpCi0JCWJyaS0+dW5wcmVwYXJlX3JlY292ZXJ5KGJyaSk7CisJCWJyaS0+dW5wcmVwYXJlX3JlY292ZXJ5KGFkYXApOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTk3MSw3ICs5NzEsNyBAQAogCWNsaWVudC0+ZGV2LmJ1cyA9ICZpMmNfYnVzX3R5cGU7CiAJY2xpZW50LT5kZXYudHlwZSA9ICZpMmNfY2xpZW50X3R5cGU7CiAJY2xpZW50LT5kZXYub2Zfbm9kZSA9IGluZm8tPm9mX25vZGU7Ci0JQUNQSV9DT01QQU5JT05fU0VUKCZjbGllbnQtPmRldiwgaW5mby0+YWNwaV9ub2RlLmNvbXBhbmlvbik7CisJY2xpZW50LT5kZXYuZndub2RlID0gaW5mby0+Zndub2RlOwogCiAJaTJjX2Rldl9zZXRfbmFtZShhZGFwLCBjbGllbnQpOwogCXN0YXR1cyA9IGRldmljZV9yZWdpc3RlcigmY2xpZW50LT5kZXYpOwpAQCAtMTg3NSw2ICsxODc1LDEzIEBACiB7CiAJaW50IHJldHZhbDsKIAorCXJldHZhbCA9IG9mX2FsaWFzX2dldF9oaWdoZXN0X2lkKCJpMmMiKTsKKworCWRvd25fd3JpdGUoJl9faTJjX2JvYXJkX2xvY2spOworCWlmIChyZXR2YWwgPj0gX19pMmNfZmlyc3RfZHluYW1pY19idXNfbnVtKQorCQlfX2kyY19maXJzdF9keW5hbWljX2J1c19udW0gPSByZXR2YWwgKyAxOworCXVwX3dyaXRlKCZfX2kyY19ib2FyZF9sb2NrKTsKKwogCXJldHZhbCA9IGJ1c19yZWdpc3RlcigmaTJjX2J1c190eXBlKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwpAQCAtMTkyNiw2ICsxOTMzLDY1IEBACiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KIAorLyogQ2hlY2sgaWYgdmFsIGlzIGV4Y2VlZGluZyB0aGUgcXVpcmsgSUZGIHF1aXJrIGlzIG5vbiAwICovCisjZGVmaW5lIGkyY19xdWlya19leGNlZWRlZCh2YWwsIHF1aXJrKSAoKHF1aXJrKSAmJiAoKHZhbCkgPiAocXVpcmspKSkKKworc3RhdGljIGludCBpMmNfcXVpcmtfZXJyb3Ioc3RydWN0IGkyY19hZGFwdGVyICphZGFwLCBzdHJ1Y3QgaTJjX21zZyAqbXNnLCBjaGFyICplcnJfbXNnKQoreworCWRldl9lcnJfcmF0ZWxpbWl0ZWQoJmFkYXAtPmRldiwgImFkYXB0ZXIgcXVpcms6ICVzIChhZGRyIDB4JTA0eCwgc2l6ZSAldSwgJXMpXG4iLAorCQkJICAgIGVycl9tc2csIG1zZy0+YWRkciwgbXNnLT5sZW4sCisJCQkgICAgbXNnLT5mbGFncyAmIEkyQ19NX1JEID8gInJlYWQiIDogIndyaXRlIik7CisJcmV0dXJuIC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW50IGkyY19jaGVja19mb3JfcXVpcmtzKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwgc3RydWN0IGkyY19tc2cgKm1zZ3MsIGludCBudW0pCit7CisJY29uc3Qgc3RydWN0IGkyY19hZGFwdGVyX3F1aXJrcyAqcSA9IGFkYXAtPnF1aXJrczsKKwlpbnQgbWF4X251bSA9IHEtPm1heF9udW1fbXNncywgaTsKKwlib29sIGRvX2xlbl9jaGVjayA9IHRydWU7CisKKwlpZiAocS0+ZmxhZ3MgJiBJMkNfQVFfQ09NQikgeworCQltYXhfbnVtID0gMjsKKworCQkvKiBzcGVjaWFsIGNoZWNrcyBmb3IgY29tYmluZWQgbWVzc2FnZXMgKi8KKwkJaWYgKG51bSA9PSAyKSB7CisJCQlpZiAocS0+ZmxhZ3MgJiBJMkNfQVFfQ09NQl9XUklURV9GSVJTVCAmJiBtc2dzWzBdLmZsYWdzICYgSTJDX01fUkQpCisJCQkJcmV0dXJuIGkyY19xdWlya19lcnJvcihhZGFwLCAmbXNnc1swXSwgIjFzdCBjb21iIG1zZyBtdXN0IGJlIHdyaXRlIik7CisKKwkJCWlmIChxLT5mbGFncyAmIEkyQ19BUV9DT01CX1JFQURfU0VDT05EICYmICEobXNnc1sxXS5mbGFncyAmIEkyQ19NX1JEKSkKKwkJCQlyZXR1cm4gaTJjX3F1aXJrX2Vycm9yKGFkYXAsICZtc2dzWzFdLCAiMm5kIGNvbWIgbXNnIG11c3QgYmUgcmVhZCIpOworCisJCQlpZiAocS0+ZmxhZ3MgJiBJMkNfQVFfQ09NQl9TQU1FX0FERFIgJiYgbXNnc1swXS5hZGRyICE9IG1zZ3NbMV0uYWRkcikKKwkJCQlyZXR1cm4gaTJjX3F1aXJrX2Vycm9yKGFkYXAsICZtc2dzWzBdLCAiY29tYiBtc2cgb25seSB0byBzYW1lIGFkZHIiKTsKKworCQkJaWYgKGkyY19xdWlya19leGNlZWRlZChtc2dzWzBdLmxlbiwgcS0+bWF4X2NvbWJfMXN0X21zZ19sZW4pKQorCQkJCXJldHVybiBpMmNfcXVpcmtfZXJyb3IoYWRhcCwgJm1zZ3NbMF0sICJtc2cgdG9vIGxvbmciKTsKKworCQkJaWYgKGkyY19xdWlya19leGNlZWRlZChtc2dzWzFdLmxlbiwgcS0+bWF4X2NvbWJfMm5kX21zZ19sZW4pKQorCQkJCXJldHVybiBpMmNfcXVpcmtfZXJyb3IoYWRhcCwgJm1zZ3NbMV0sICJtc2cgdG9vIGxvbmciKTsKKworCQkJZG9fbGVuX2NoZWNrID0gZmFsc2U7CisJCX0KKwl9CisKKwlpZiAoaTJjX3F1aXJrX2V4Y2VlZGVkKG51bSwgbWF4X251bSkpCisJCXJldHVybiBpMmNfcXVpcmtfZXJyb3IoYWRhcCwgJm1zZ3NbMF0sICJ0b28gbWFueSBtZXNzYWdlcyIpOworCisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXUxNiBsZW4gPSBtc2dzW2ldLmxlbjsKKworCQlpZiAobXNnc1tpXS5mbGFncyAmIEkyQ19NX1JEKSB7CisJCQlpZiAoZG9fbGVuX2NoZWNrICYmIGkyY19xdWlya19leGNlZWRlZChsZW4sIHEtPm1heF9yZWFkX2xlbikpCisJCQkJcmV0dXJuIGkyY19xdWlya19lcnJvcihhZGFwLCAmbXNnc1tpXSwgIm1zZyB0b28gbG9uZyIpOworCQl9IGVsc2UgeworCQkJaWYgKGRvX2xlbl9jaGVjayAmJiBpMmNfcXVpcmtfZXhjZWVkZWQobGVuLCBxLT5tYXhfd3JpdGVfbGVuKSkKKwkJCQlyZXR1cm4gaTJjX3F1aXJrX2Vycm9yKGFkYXAsICZtc2dzW2ldLCAibXNnIHRvbyBsb25nIik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBfX2kyY190cmFuc2ZlciAtIHVubG9ja2VkIGZsYXZvciBvZiBpMmNfdHJhbnNmZXIKICAqIEBhZGFwOiBIYW5kbGUgdG8gSTJDIGJ1cwpAQCAtMTk0Myw2ICsyMDA5LDkgQEAKIAl1bnNpZ25lZCBsb25nIG9yaWdfamlmZmllczsKIAlpbnQgcmV0LCB0cnk7CiAKKwlpZiAoYWRhcC0+cXVpcmtzICYmIGkyY19jaGVja19mb3JfcXVpcmtzKGFkYXAsIG1zZ3MsIG51bSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCS8qIGkyY190cmFjZV9tc2cgZ2V0cyBlbmFibGVkIHdoZW4gdHJhY2Vwb2ludCBpMmNfdHJhbnNmZXIgZ2V0cwogCSAqIGVuYWJsZWQuICBUaGlzIGlzIGFuIGVmZmljaWVudCB3YXkgb2Yga2VlcGluZyB0aGUgZm9yLWxvb3AgZnJvbQogCSAqIGJlaW5nIGV4ZWN1dGVkIHdoZW4gbm90IG5lZWRlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2kyYy1zbGF2ZS1lZXByb20uYyBiL2RyaXZlcnMvaTJjL2kyYy1zbGF2ZS1lZXByb20uYwppbmRleCBjZjliMDlkLi44MjIzNzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9pMmMtc2xhdmUtZWVwcm9tLmMKKysrIGIvZHJpdmVycy9pMmMvaTJjLXNsYXZlLWVlcHJvbS5jCkBAIC0zNiw3ICszNiw3IEBACiAJc3RydWN0IGVlcHJvbV9kYXRhICplZXByb20gPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCXN3aXRjaCAoZXZlbnQpIHsKLQljYXNlIEkyQ19TTEFWRV9SRVFfV1JJVEVfRU5EOgorCWNhc2UgSTJDX1NMQVZFX1dSSVRFX1JFQ0VJVkVEOgogCQlpZiAoZWVwcm9tLT5maXJzdF93cml0ZSkgewogCQkJZWVwcm9tLT5idWZmZXJfaWR4ID0gKnZhbDsKIAkJCWVlcHJvbS0+Zmlyc3Rfd3JpdGUgPSBmYWxzZTsKQEAgLTQ3LDE3ICs0NywyMyBAQAogCQl9CiAJCWJyZWFrOwogCi0JY2FzZSBJMkNfU0xBVkVfUkVRX1JFQURfU1RBUlQ6CisJY2FzZSBJMkNfU0xBVkVfUkVBRF9QUk9DRVNTRUQ6CisJCS8qIFRoZSBwcmV2aW91cyBieXRlIG1hZGUgaXQgdG8gdGhlIGJ1cywgZ2V0IG5leHQgb25lICovCisJCWVlcHJvbS0+YnVmZmVyX2lkeCsrOworCQkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgSTJDX1NMQVZFX1JFQURfUkVRVUVTVEVEOgogCQlzcGluX2xvY2soJmVlcHJvbS0+YnVmZmVyX2xvY2spOwogCQkqdmFsID0gZWVwcm9tLT5idWZmZXJbZWVwcm9tLT5idWZmZXJfaWR4XTsKIAkJc3Bpbl91bmxvY2soJmVlcHJvbS0+YnVmZmVyX2xvY2spOwotCQlicmVhazsKLQotCWNhc2UgSTJDX1NMQVZFX1JFUV9SRUFEX0VORDoKLQkJZWVwcm9tLT5idWZmZXJfaWR4Kys7CisJCS8qCisJCSAqIERvIG5vdCBpbmNyZW1lbnQgYnVmZmVyX2lkeCBoZXJlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYKKwkJICogdGhpcyBieXRlIHdpbGwgYmUgYWN0dWFsbHkgdXNlZC4gUmVhZCBMaW51eCBJMkMgc2xhdmUgZG9jcworCQkgKiBmb3IgZGV0YWlscy4KKwkJICovCiAJCWJyZWFrOwogCiAJY2FzZSBJMkNfU0xBVkVfU1RPUDoKKwljYXNlIEkyQ19TTEFWRV9XUklURV9SRVFVRVNURUQ6CiAJCWVlcHJvbS0+Zmlyc3Rfd3JpdGUgPSB0cnVlOwogCQlicmVhazsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvbXV4ZXMvaTJjLW11eC1ncGlvLmMgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LWdwaW8uYwppbmRleCBmNTc5OGViLi43MGRiOTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LWdwaW8uYworKysgYi9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LWdwaW8uYwpAQCAtNzYsMTAgKzc2LDkgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCWFkYXB0ZXIgPSBvZl9maW5kX2kyY19hZGFwdGVyX2J5X25vZGUoYWRhcHRlcl9ucCk7Ci0JaWYgKCFhZGFwdGVyKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBmaW5kIHBhcmVudCBidXNcbiIpOworCWlmICghYWRhcHRlcikKIAkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Ci0JfQorCiAJbXV4LT5kYXRhLnBhcmVudCA9IGkyY19hZGFwdGVyX2lkKGFkYXB0ZXIpOwogCXB1dF9kZXZpY2UoJmFkYXB0ZXItPmRldik7CiAKQEAgLTE3NywxMSArMTc2LDggQEAKIAl9CiAKIAlwYXJlbnQgPSBpMmNfZ2V0X2FkYXB0ZXIobXV4LT5kYXRhLnBhcmVudCk7Ci0JaWYgKCFwYXJlbnQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiUGFyZW50IGFkYXB0ZXIgKCVkKSBub3QgZm91bmRcbiIsCi0JCQltdXgtPmRhdGEucGFyZW50KTsKKwlpZiAoIXBhcmVudCkKIAkJcmV0dXJuIC1FUFJPQkVfREVGRVI7Ci0JfQogCiAJbXV4LT5wYXJlbnQgPSBwYXJlbnQ7CiAJbXV4LT5ncGlvX2Jhc2UgPSBncGlvX2Jhc2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9tdXhlcy9pMmMtbXV4LXBjYTk1NHguYyBiL2RyaXZlcnMvaTJjL211eGVzL2kyYy1tdXgtcGNhOTU0eC5jCmluZGV4IDNkOGY0ZmUuLmJlYTBkMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL211eGVzL2kyYy1tdXgtcGNhOTU0eC5jCisrKyBiL2RyaXZlcnMvaTJjL211eGVzL2kyYy1tdXgtcGNhOTU0eC5jCkBAIC0yMDQsOSArMjA0LDkgQEAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBkYXRhKTsKIAogCS8qIEdldCB0aGUgbXV4IG91dCBvZiByZXNldCBpZiBhIHJlc2V0IEdQSU8gaXMgc3BlY2lmaWVkLiAqLwotCWdwaW8gPSBkZXZtX2dwaW9kX2dldCgmY2xpZW50LT5kZXYsICJyZXNldCIpOwotCWlmICghSVNfRVJSKGdwaW8pKQotCQlncGlvZF9kaXJlY3Rpb25fb3V0cHV0KGdwaW8sIDApOworCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbCgmY2xpZW50LT5kZXYsICJyZXNldCIsIEdQSU9EX09VVF9MT1cpOworCWlmIChJU19FUlIoZ3BpbykpCisJCXJldHVybiBQVFJfRVJSKGdwaW8pOwogCiAJLyogV3JpdGUgdGhlIG11eCByZWdpc3RlciBhdCBhZGRyIHRvIHZlcmlmeQogCSAqIHRoYXQgdGhlIG11eCBpcyBpbiBmYWN0IHByZXNlbnQuIFRoaXMgYWxzbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLWxpYi5jIGIvZHJpdmVycy9pZGUvaWRlLWxpYi5jCmluZGV4IGQ5Yzk4MjkuLmUxMTgwZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS1saWIuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtbGliLmMKQEAgLTE0OCw4ICsxNDgsOCBAQAogCQkJcHJpbnRrKEtFUk5fQ09OVCAiRGF0YVJlcXVlc3QgIik7CiAJCWlmIChzdGF0ICYgQVRBX0NPUlIpCiAJCQlwcmludGsoS0VSTl9DT05UICJDb3JyZWN0ZWRFcnJvciAiKTsKLQkJaWYgKHN0YXQgJiBBVEFfSURYKQotCQkJcHJpbnRrKEtFUk5fQ09OVCAiSW5kZXggIik7CisJCWlmIChzdGF0ICYgQVRBX1NFTlNFKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiU2Vuc2UgIik7CiAJCWlmIChzdGF0ICYgQVRBX0VSUikKIAkJCXByaW50ayhLRVJOX0NPTlQgIkVycm9yICIpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS1wbnAuYyBiL2RyaXZlcnMvaWRlL2lkZS1wbnAuYwppbmRleCBlNWYzZGI4Li5mNWYyYjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcG5wLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXBucC5jCkBAIC05NiwxNyArOTYsNSBAQAogCS5yZW1vdmUJCT0gaWRlcG5wX3JlbW92ZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBucGlkZV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBucF9yZWdpc3Rlcl9kcml2ZXIoJmlkZXBucF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcG5waWRlX2V4aXQodm9pZCkKLXsKLQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJmlkZXBucF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChwbnBpZGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChwbnBpZGVfZXhpdCk7Ci0KK21vZHVsZV9wbnBfZHJpdmVyKGlkZXBucF9kcml2ZXIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGUvaWRlLXByb2JlLmMgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYwppbmRleCBhM2QzYjE3Li4wYjYzZmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYworKysgYi9kcml2ZXJzL2lkZS9pZGUtcHJvYmUuYwpAQCAtMjczLDcgKzI3Myw3IEBACiAJICAgIChod2lmLT5ob3N0X2ZsYWdzICYgSURFX0hGTEFHX0JST0tFTl9BTFRTVEFUVVMpID09IDApIHsKIAkJYSA9IHRwX29wcy0+cmVhZF9hbHRzdGF0dXMoaHdpZik7CiAJCXMgPSB0cF9vcHMtPnJlYWRfc3RhdHVzKGh3aWYpOwotCQlpZiAoKGEgXiBzKSAmIH5BVEFfSURYKQorCQlpZiAoKGEgXiBzKSAmIH5BVEFfU0VOU0UpCiAJCQkvKiBhbmNpZW50IFNlYWdhdGUgZHJpdmVzLCBicm9rZW4gaW50ZXJmYWNlcyAqLwogCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHByb2Jpbmcgd2l0aCBTVEFUVVMoMHglMDJ4KSAiCiAJCQkJCSAiaW5zdGVhZCBvZiBBTFRTVEFUVVMoMHglMDJ4KVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMgYi9kcml2ZXJzL2lkZS9pZGUtdGFwZS5jCmluZGV4IDE3OTNhZWEuLjZlYjczOGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2lkZS10YXBlLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlLXRhcGUuYwpAQCAtMTc5MywxMSArMTc5MywxMSBAQAogCXRhcGUtPmJlc3RfZHNjX3J3X2ZyZXEgPSBjbGFtcF90KHVuc2lnbmVkIGxvbmcsIHQsIElERVRBUEVfRFNDX1JXX01JTiwKIAkJCQkJIElERVRBUEVfRFNDX1JXX01BWCk7CiAJcHJpbnRrKEtFUk5fSU5GTyAiaWRlLXRhcGU6ICVzIDwtPiAlczogJWRLQnBzLCAlZColZGtCIGJ1ZmZlciwgIgotCQkiJWx1bXMgdERTQyVzXG4iLAorCQkiJXVtcyB0RFNDJXNcbiIsCiAJCWRyaXZlLT5uYW1lLCB0YXBlLT5uYW1lLCAqKHUxNiAqKSZ0YXBlLT5jYXBzWzE0XSwKIAkJKCoodTE2ICopJnRhcGUtPmNhcHNbMTZdICogNTEyKSAvIHRhcGUtPmJ1ZmZlcl9zaXplLAogCQl0YXBlLT5idWZmZXJfc2l6ZSAvIDEwMjQsCi0JCXRhcGUtPmJlc3RfZHNjX3J3X2ZyZXEgKiAxMDAwIC8gSFosCisJCWppZmZpZXNfdG9fbXNlY3ModGFwZS0+YmVzdF9kc2NfcndfZnJlcSksCiAJCShkcml2ZS0+ZGV2X2ZsYWdzICYgSURFX0RGTEFHX1VTSU5HX0RNQSkgPyAiLCBETUEiIDogIiIpOwogCiAJaWRlX3Byb2NfcmVnaXN0ZXJfZHJpdmVyKGRyaXZlLCB0YXBlLT5kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZGxlL2ludGVsX2lkbGUuYyBiL2RyaXZlcnMvaWRsZS9pbnRlbF9pZGxlLmMKaW5kZXggYjBlNTg1Mi4uMmEzNmE5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGxlL2ludGVsX2lkbGUuYworKysgYi9kcml2ZXJzL2lkbGUvaW50ZWxfaWRsZS5jCkBAIC01NSw3ICs1NSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CkBAIC0yMTgsMTggKzIxOCwxMCBAQAogCQkuZW50ZXIgPSAmaW50ZWxfaWRsZSwKIAkJLmVudGVyX2ZyZWV6ZSA9IGludGVsX2lkbGVfZnJlZXplLCB9LAogCXsKLQkJLm5hbWUgPSAiQzFFLUJZVCIsCi0JCS5kZXNjID0gIk1XQUlUIDB4MDEiLAotCQkuZmxhZ3MgPSBNV0FJVDJmbGcoMHgwMSksCi0JCS5leGl0X2xhdGVuY3kgPSAxNSwKLQkJLnRhcmdldF9yZXNpZGVuY3kgPSAzMCwKLQkJLmVudGVyID0gJmludGVsX2lkbGUsCi0JCS5lbnRlcl9mcmVlemUgPSBpbnRlbF9pZGxlX2ZyZWV6ZSwgfSwKLQl7CiAJCS5uYW1lID0gIkM2Ti1CWVQiLAogCQkuZGVzYyA9ICJNV0FJVCAweDU4IiwKIAkJLmZsYWdzID0gTVdBSVQyZmxnKDB4NTgpIHwgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVELAotCQkuZXhpdF9sYXRlbmN5ID0gNDAsCisJCS5leGl0X2xhdGVuY3kgPSAzMDAsCiAJCS50YXJnZXRfcmVzaWRlbmN5ID0gMjc1LAogCQkuZW50ZXIgPSAmaW50ZWxfaWRsZSwKIAkJLmVudGVyX2ZyZWV6ZSA9IGludGVsX2lkbGVfZnJlZXplLCB9LApAQCAtMjM3LDcgKzIyOSw3IEBACiAJCS5uYW1lID0gIkM2Uy1CWVQiLAogCQkuZGVzYyA9ICJNV0FJVCAweDUyIiwKIAkJLmZsYWdzID0gTVdBSVQyZmxnKDB4NTIpIHwgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVELAotCQkuZXhpdF9sYXRlbmN5ID0gMTQwLAorCQkuZXhpdF9sYXRlbmN5ID0gNTAwLAogCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDU2MCwKIAkJLmVudGVyID0gJmludGVsX2lkbGUsCiAJCS5lbnRlcl9mcmVlemUgPSBpbnRlbF9pZGxlX2ZyZWV6ZSwgfSwKQEAgLTI0Niw3ICsyMzgsNyBAQAogCQkuZGVzYyA9ICJNV0FJVCAweDYwIiwKIAkJLmZsYWdzID0gTVdBSVQyZmxnKDB4NjApIHwgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVELAogCQkuZXhpdF9sYXRlbmN5ID0gMTIwMCwKLQkJLnRhcmdldF9yZXNpZGVuY3kgPSAxNTAwLAorCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDQwMDAsCiAJCS5lbnRlciA9ICZpbnRlbF9pZGxlLAogCQkuZW50ZXJfZnJlZXplID0gaW50ZWxfaWRsZV9mcmVlemUsIH0sCiAJewpAQCAtMjYxLDYgKzI1Myw1MSBAQAogCQkuZW50ZXIgPSBOVUxMIH0KIH07CiAKK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSBjaHRfY3N0YXRlc1tdID0geworCXsKKwkJLm5hbWUgPSAiQzEtQ0hUIiwKKwkJLmRlc2MgPSAiTVdBSVQgMHgwMCIsCisJCS5mbGFncyA9IE1XQUlUMmZsZygweDAwKSwKKwkJLmV4aXRfbGF0ZW5jeSA9IDEsCisJCS50YXJnZXRfcmVzaWRlbmN5ID0gMSwKKwkJLmVudGVyID0gJmludGVsX2lkbGUsCisJCS5lbnRlcl9mcmVlemUgPSBpbnRlbF9pZGxlX2ZyZWV6ZSwgfSwKKwl7CisJCS5uYW1lID0gIkM2Ti1DSFQiLAorCQkuZGVzYyA9ICJNV0FJVCAweDU4IiwKKwkJLmZsYWdzID0gTVdBSVQyZmxnKDB4NTgpIHwgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVELAorCQkuZXhpdF9sYXRlbmN5ID0gODAsCisJCS50YXJnZXRfcmVzaWRlbmN5ID0gMjc1LAorCQkuZW50ZXIgPSAmaW50ZWxfaWRsZSwKKwkJLmVudGVyX2ZyZWV6ZSA9IGludGVsX2lkbGVfZnJlZXplLCB9LAorCXsKKwkJLm5hbWUgPSAiQzZTLUNIVCIsCisJCS5kZXNjID0gIk1XQUlUIDB4NTIiLAorCQkuZmxhZ3MgPSBNV0FJVDJmbGcoMHg1MikgfCBDUFVJRExFX0ZMQUdfVExCX0ZMVVNIRUQsCisJCS5leGl0X2xhdGVuY3kgPSAyMDAsCisJCS50YXJnZXRfcmVzaWRlbmN5ID0gNTYwLAorCQkuZW50ZXIgPSAmaW50ZWxfaWRsZSwKKwkJLmVudGVyX2ZyZWV6ZSA9IGludGVsX2lkbGVfZnJlZXplLCB9LAorCXsKKwkJLm5hbWUgPSAiQzctQ0hUIiwKKwkJLmRlc2MgPSAiTVdBSVQgMHg2MCIsCisJCS5mbGFncyA9IE1XQUlUMmZsZygweDYwKSB8IENQVUlETEVfRkxBR19UTEJfRkxVU0hFRCwKKwkJLmV4aXRfbGF0ZW5jeSA9IDEyMDAsCisJCS50YXJnZXRfcmVzaWRlbmN5ID0gNDAwMCwKKwkJLmVudGVyID0gJmludGVsX2lkbGUsCisJCS5lbnRlcl9mcmVlemUgPSBpbnRlbF9pZGxlX2ZyZWV6ZSwgfSwKKwl7CisJCS5uYW1lID0gIkM3Uy1DSFQiLAorCQkuZGVzYyA9ICJNV0FJVCAweDY0IiwKKwkJLmZsYWdzID0gTVdBSVQyZmxnKDB4NjQpIHwgQ1BVSURMRV9GTEFHX1RMQl9GTFVTSEVELAorCQkuZXhpdF9sYXRlbmN5ID0gMTAwMDAsCisJCS50YXJnZXRfcmVzaWRlbmN5ID0gMjAwMDAsCisJCS5lbnRlciA9ICZpbnRlbF9pZGxlLAorCQkuZW50ZXJfZnJlZXplID0gaW50ZWxfaWRsZV9mcmVlemUsIH0sCisJeworCQkuZW50ZXIgPSBOVUxMIH0KK307CisKIHN0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSBpdmJfY3N0YXRlc1tdID0gewogCXsKIAkJLm5hbWUgPSAiQzEtSVZCIiwKQEAgLTYzOCwxMiArNjc1LDEyIEBACiAJCWxlYXZlX21tKGNwdSk7CiAKIAlpZiAoIShsYXBpY190aW1lcl9yZWxpYWJsZV9zdGF0ZXMgJiAoMSA8PCAoY3N0YXRlKSkpKQotCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIsICZjcHUpOworCQl0aWNrX2Jyb2FkY2FzdF9lbnRlcigpOwogCiAJbXdhaXRfaWRsZV93aXRoX2hpbnRzKGVheCwgZWN4KTsKIAogCWlmICghKGxhcGljX3RpbWVyX3JlbGlhYmxlX3N0YXRlcyAmICgxIDw8IChjc3RhdGUpKSkpCi0JCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElULCAmY3B1KTsKKwkJdGlja19icm9hZGNhc3RfZXhpdCgpOwogCiAJcmV0dXJuIGluZGV4OwogfQpAQCAtNjY1LDEzICs3MDIsMTIgQEAKIAogc3RhdGljIHZvaWQgX19zZXR1cF9icm9hZGNhc3RfdGltZXIodm9pZCAqYXJnKQogewotCXVuc2lnbmVkIGxvbmcgcmVhc29uID0gKHVuc2lnbmVkIGxvbmcpYXJnOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgbG9uZyBvbiA9ICh1bnNpZ25lZCBsb25nKWFyZzsKIAotCXJlYXNvbiA9IHJlYXNvbiA/Ci0JCUNMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OIDogQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfT0ZGOwotCi0JY2xvY2tldmVudHNfbm90aWZ5KHJlYXNvbiwgJmNwdSk7CisJaWYgKG9uKQorCQl0aWNrX2Jyb2FkY2FzdF9lbmFibGUoKTsKKwllbHNlCisJCXRpY2tfYnJvYWRjYXN0X2Rpc2FibGUoKTsKIH0KIAogc3RhdGljIGludCBjcHVfaG90cGx1Z19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuLApAQCAtNzQ4LDYgKzc4NCwxMiBAQAogCS5ieXRfYXV0b19kZW1vdGlvbl9kaXNhYmxlX2ZsYWcgPSB0cnVlLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBpZGxlX2NwdSBpZGxlX2NwdV9jaHQgPSB7CisJLnN0YXRlX3RhYmxlID0gY2h0X2NzdGF0ZXMsCisJLmRpc2FibGVfcHJvbW90aW9uX3RvX2MxZSA9IHRydWUsCisJLmJ5dF9hdXRvX2RlbW90aW9uX2Rpc2FibGVfZmxhZyA9IHRydWUsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlkbGVfY3B1IGlkbGVfY3B1X2l2YiA9IHsKIAkuc3RhdGVfdGFibGUgPSBpdmJfY3N0YXRlcywKIAkuZGlzYWJsZV9wcm9tb3Rpb25fdG9fYzFlID0gdHJ1ZSwKQEAgLTc3Niw3ICs4MTgsNyBAQAogI2RlZmluZSBJQ1BVKG1vZGVsLCBjcHUpIFwKIAl7IFg4Nl9WRU5ET1JfSU5URUwsIDYsIG1vZGVsLCBYODZfRkVBVFVSRV9NV0FJVCwgKHVuc2lnbmVkIGxvbmcpJmNwdSB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCBpbnRlbF9pZGxlX2lkc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB4ODZfY3B1X2lkIGludGVsX2lkbGVfaWRzW10gX19pbml0Y29uc3QgPSB7CiAJSUNQVSgweDFhLCBpZGxlX2NwdV9uZWhhbGVtKSwKIAlJQ1BVKDB4MWUsIGlkbGVfY3B1X25laGFsZW0pLAogCUlDUFUoMHgxZiwgaWRsZV9jcHVfbmVoYWxlbSksCkBAIC03OTAsNiArODMyLDcgQEAKIAlJQ1BVKDB4MmQsIGlkbGVfY3B1X3NuYiksCiAJSUNQVSgweDM2LCBpZGxlX2NwdV9hdG9tKSwKIAlJQ1BVKDB4MzcsIGlkbGVfY3B1X2J5dCksCisJSUNQVSgweDRjLCBpZGxlX2NwdV9jaHQpLAogCUlDUFUoMHgzYSwgaWRsZV9jcHVfaXZiKSwKIAlJQ1BVKDB4M2UsIGlkbGVfY3B1X2l2dCksCiAJSUNQVSgweDNjLCBpZGxlX2NwdV9oc3cpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvYm1hMTgwLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWExODAuYwppbmRleCAxMDk2ZGEzLi43NWM2ZDIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9ibWExODAuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9ibWExODAuYwpAQCAtNjU5LDcgKzY1OSw3IEBACiAKIAltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CiAKLQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgaW5kaW9fZGV2LT5idWZmZXItPnNjYW5fbWFzaywKKwlmb3JfZWFjaF9zZXRfYml0KGJpdCwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrLAogCQkJIGluZGlvX2Rldi0+bWFza2xlbmd0aCkgewogCQlyZXQgPSBibWExODBfZ2V0X2RhdGFfcmVnKGRhdGEsIGJpdCk7CiAJCWlmIChyZXQgPCAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9ibWMxNTAtYWNjZWwuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2JtYzE1MC1hY2NlbC5jCmluZGV4IDA2NmQwYzAuLjczZTg3NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL2JtYzE1MC1hY2NlbC5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL2JtYzE1MC1hY2NlbC5jCkBAIC03MCw3ICs3MCw5IEBACiAjZGVmaW5lIEJNQzE1MF9BQ0NFTF9JTlRfTUFQXzBfQklUX1NMT1BFCUJJVCgyKQogCiAjZGVmaW5lIEJNQzE1MF9BQ0NFTF9SRUdfSU5UX01BUF8xCQkweDFBCi0jZGVmaW5lIEJNQzE1MF9BQ0NFTF9JTlRfTUFQXzFfQklUX0RBVEEJQklUKDApCisjZGVmaW5lIEJNQzE1MF9BQ0NFTF9JTlRfTUFQXzFfQklUX0RBVEEJCUJJVCgwKQorI2RlZmluZSBCTUMxNTBfQUNDRUxfSU5UX01BUF8xX0JJVF9GV00JCUJJVCgxKQorI2RlZmluZSBCTUMxNTBfQUNDRUxfSU5UX01BUF8xX0JJVF9GRlVMTAlCSVQoMikKIAogI2RlZmluZSBCTUMxNTBfQUNDRUxfUkVHX0lOVF9SU1RfTEFUQ0gJCTB4MjEKICNkZWZpbmUgQk1DMTUwX0FDQ0VMX0lOVF9NT0RFX0xBVENIX1JFU0VUCTB4ODAKQEAgLTgzLDcgKzg1LDkgQEAKICNkZWZpbmUgQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfU0xQX1oJCUJJVCgyKQogCiAjZGVmaW5lIEJNQzE1MF9BQ0NFTF9SRUdfSU5UX0VOXzEJCTB4MTcKLSNkZWZpbmUgQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfREFUQV9FTglCSVQoNCkKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX0lOVF9FTl9CSVRfREFUQV9FTgkJQklUKDQpCisjZGVmaW5lIEJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX0ZGVUxMX0VOCUJJVCg1KQorI2RlZmluZSBCTUMxNTBfQUNDRUxfSU5UX0VOX0JJVF9GV01fRU4JCUJJVCg2KQogCiAjZGVmaW5lIEJNQzE1MF9BQ0NFTF9SRUdfSU5UX09VVF9DVFJMCQkweDIwCiAjZGVmaW5lIEJNQzE1MF9BQ0NFTF9JTlRfT1VUX0NUUkxfSU5UMV9MVkwJQklUKDApCkBAIC0xMjIsNiArMTI2LDEyIEBACiAjZGVmaW5lIEJNQzE1MF9BQ0NFTF9BWElTX1RPX1JFRyhheGlzKQkoQk1DMTUwX0FDQ0VMX1JFR19YT1VUX0wgKyAoYXhpcyAqIDIpKQogI2RlZmluZSBCTUMxNTBfQVVUT19TVVNQRU5EX0RFTEFZX01TCQkyMDAwCiAKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX1JFR19GSUZPX1NUQVRVUwkJMHgwRQorI2RlZmluZSBCTUMxNTBfQUNDRUxfUkVHX0ZJRk9fQ09ORklHMAkJMHgzMAorI2RlZmluZSBCTUMxNTBfQUNDRUxfUkVHX0ZJRk9fQ09ORklHMQkJMHgzRQorI2RlZmluZSBCTUMxNTBfQUNDRUxfUkVHX0ZJRk9fREFUQQkJMHgzRgorI2RlZmluZSBCTUMxNTBfQUNDRUxfRklGT19MRU5HVEgJCTMyCisKIGVudW0gYm1jMTUwX2FjY2VsX2F4aXMgewogCUFYSVNfWCwKIAlBWElTX1ksCkBAIC0xNDcsMjAgKzE1Nyw0NiBAQAogCWNvbnN0IHN0cnVjdCBibWMxNTBfc2NhbGVfaW5mbyBzY2FsZV90YWJsZVs0XTsKIH07CiAKK3N0cnVjdCBibWMxNTBfYWNjZWxfaW50ZXJydXB0IHsKKwljb25zdCBzdHJ1Y3QgYm1jMTUwX2FjY2VsX2ludGVycnVwdF9pbmZvICppbmZvOworCWF0b21pY190IHVzZXJzOworfTsKKworc3RydWN0IGJtYzE1MF9hY2NlbF90cmlnZ2VyIHsKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGE7CisJc3RydWN0IGlpb190cmlnZ2VyICppbmRpb190cmlnOworCWludCAoKnNldHVwKShzdHJ1Y3QgYm1jMTUwX2FjY2VsX3RyaWdnZXIgKnQsIGJvb2wgc3RhdGUpOworCWludCBpbnRyOworCWJvb2wgZW5hYmxlZDsKK307CisKK2VudW0gYm1jMTUwX2FjY2VsX2ludGVycnVwdF9pZCB7CisJQk1DMTUwX0FDQ0VMX0lOVF9EQVRBX1JFQURZLAorCUJNQzE1MF9BQ0NFTF9JTlRfQU5ZX01PVElPTiwKKwlCTUMxNTBfQUNDRUxfSU5UX1dBVEVSTUFSSywKKwlCTUMxNTBfQUNDRUxfSU5URVJSVVBUUywKK307CisKK2VudW0gYm1jMTUwX2FjY2VsX3RyaWdnZXJfaWQgeworCUJNQzE1MF9BQ0NFTF9UUklHR0VSX0RBVEFfUkVBRFksCisJQk1DMTUwX0FDQ0VMX1RSSUdHRVJfQU5ZX01PVElPTiwKKwlCTUMxNTBfQUNDRUxfVFJJR0dFUlMsCit9OworCiBzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Ci0Jc3RydWN0IGlpb190cmlnZ2VyICpkcmVhZHlfdHJpZzsKLQlzdHJ1Y3QgaWlvX3RyaWdnZXIgKm1vdGlvbl90cmlnOworCXN0cnVjdCBibWMxNTBfYWNjZWxfaW50ZXJydXB0IGludGVycnVwdHNbQk1DMTUwX0FDQ0VMX0lOVEVSUlVQVFNdOworCWF0b21pY190IGFjdGl2ZV9pbnRyOworCXN0cnVjdCBibWMxNTBfYWNjZWxfdHJpZ2dlciB0cmlnZ2Vyc1tCTUMxNTBfQUNDRUxfVFJJR0dFUlNdOwogCXN0cnVjdCBtdXRleCBtdXRleDsKKwl1OCBmaWZvX21vZGUsIHdhdGVybWFyazsKIAlzMTYgYnVmZmVyWzhdOwogCXU4IGJ3X2JpdHM7CiAJdTMyIHNsb3BlX2R1cjsKIAl1MzIgc2xvcGVfdGhyZXM7CiAJdTMyIHJhbmdlOwogCWludCBldl9lbmFibGVfc3RhdGU7Ci0JYm9vbCBkcmVhZHlfdHJpZ2dlcl9vbjsKLQlib29sIG1vdGlvbl90cmlnZ2VyX29uOwotCWludDY0X3QgdGltZXN0YW1wOworCWludDY0X3QgdGltZXN0YW1wLCBvbGRfdGltZXN0YW1wOwogCWNvbnN0IHN0cnVjdCBibWMxNTBfYWNjZWxfY2hpcF9pbmZvICpjaGlwX2luZm87CiB9OwogCkBAIC0xNjgsMTQgKzIwNCwxNCBAQAogCWludCB2YWw7CiAJaW50IHZhbDI7CiAJdTggYndfYml0czsKLX0gYm1jMTUwX2FjY2VsX3NhbXBfZnJlcV90YWJsZVtdID0geyB7NywgODEwMDAwLCAweDA4fSwKLQkJCQkgICAgIHsxNSwgNjMwMDAwLCAweDA5fSwKLQkJCQkgICAgIHszMSwgMjUwMDAwLCAweDBBfSwKLQkJCQkgICAgIHs2MiwgNTAwMDAwLCAweDBCfSwKLQkJCQkgICAgIHsxMjUsIDAsIDB4MEN9LAotCQkJCSAgICAgezI1MCwgMCwgMHgwRH0sCi0JCQkJICAgICB7NTAwLCAwLCAweDBFfSwKLQkJCQkgICAgIHsxMDAwLCAwLCAweDBGfSB9OworfSBibWMxNTBfYWNjZWxfc2FtcF9mcmVxX3RhYmxlW10gPSB7IHsxNSwgNjIwMDAwLCAweDA4fSwKKwkJCQkgICAgIHszMSwgMjYwMDAwLCAweDA5fSwKKwkJCQkgICAgIHs2MiwgNTAwMDAwLCAweDBBfSwKKwkJCQkgICAgIHsxMjUsIDAsIDB4MEJ9LAorCQkJCSAgICAgezI1MCwgMCwgMHgwQ30sCisJCQkJICAgICB7NTAwLCAwLCAweDBEfSwKKwkJCQkgICAgIHsxMDAwLCAwLCAweDBFfSwKKwkJCQkgICAgIHsyMDAwLCAwLCAweDBGfSB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAlpbnQgYndfYml0czsKQEAgLTI2OSw2ICszMDUsNDYgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAorc3RhdGljIGludCBibWMxNTBfYWNjZWxfdXBkYXRlX3Nsb3BlKHN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSkKK3sKKwlpbnQgcmV0LCB2YWw7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgQk1DMTUwX0FDQ0VMX1JFR19JTlRfNiwKKwkJCQkJZGF0YS0+c2xvcGVfdGhyZXMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfaW50XzZcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIEJNQzE1MF9BQ0NFTF9SRUdfSU5UXzUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3IgcmVhZGluZyByZWdfaW50XzVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXZhbCA9IChyZXQgJiB+Qk1DMTUwX0FDQ0VMX1NMT1BFX0RVUl9NQVNLKSB8IGRhdGEtPnNsb3BlX2R1cjsKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgQk1DMTUwX0FDQ0VMX1JFR19JTlRfNSwKKwkJCQkJdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHdyaXRlIHJlZ19pbnRfNVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZGV2X2RiZygmZGF0YS0+Y2xpZW50LT5kZXYsICIlczogJXggJXhcbiIsIF9fZnVuY19fLCBkYXRhLT5zbG9wZV90aHJlcywKKwkJZGF0YS0+c2xvcGVfZHVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX2FueV9tb3Rpb25fc2V0dXAoc3RydWN0IGJtYzE1MF9hY2NlbF90cmlnZ2VyICp0LAorCQkJCQkgYm9vbCBzdGF0ZSkKK3sKKwlpZiAoc3RhdGUpCisJCXJldHVybiBibWMxNTBfYWNjZWxfdXBkYXRlX3Nsb3BlKHQtPmRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX2NoaXBfaW5pdChzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEpCiB7CiAJaW50IHJldDsKQEAgLTMwNywzMiArMzgzLDEyIEBACiAKIAlkYXRhLT5yYW5nZSA9IEJNQzE1MF9BQ0NFTF9ERUZfUkFOR0VfNEc7CiAKLQkvKiBTZXQgZGVmYXVsdCBzbG9wZSBkdXJhdGlvbiAqLwotCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIEJNQzE1MF9BQ0NFTF9SRUdfSU5UXzUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3IgcmVhZGluZyByZWdfaW50XzVcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlkYXRhLT5zbG9wZV9kdXIgfD0gQk1DMTUwX0FDQ0VMX0RFRl9TTE9QRV9EVVJBVElPTjsKLQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCQkJQk1DMTUwX0FDQ0VMX1JFR19JTlRfNSwKLQkJCQkJZGF0YS0+c2xvcGVfZHVyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHdyaXRpbmcgcmVnX2ludF81XG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JZGV2X2RiZygmZGF0YS0+Y2xpZW50LT5kZXYsICJzbG9wZV9kdXIgJXhcbiIsIGRhdGEtPnNsb3BlX2R1cik7Ci0KLQkvKiBTZXQgZGVmYXVsdCBzbG9wZSB0aHJlc2hvbGRzICovCi0JcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UXzYsCi0JCQkJCUJNQzE1MF9BQ0NFTF9ERUZfU0xPUEVfVEhSRVNIT0xEKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHdyaXRpbmcgcmVnX2ludF82XG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJLyogU2V0IGRlZmF1bHQgc2xvcGUgZHVyYXRpb24gYW5kIHRocmVzaG9sZHMgKi8KIAlkYXRhLT5zbG9wZV90aHJlcyA9IEJNQzE1MF9BQ0NFTF9ERUZfU0xPUEVfVEhSRVNIT0xEOwotCWRldl9kYmcoJmRhdGEtPmNsaWVudC0+ZGV2LCAic2xvcGVfdGhyZXMgJXhcbiIsIGRhdGEtPnNsb3BlX3RocmVzKTsKKwlkYXRhLT5zbG9wZV9kdXIgPSBCTUMxNTBfQUNDRUxfREVGX1NMT1BFX0RVUkFUSU9OOworCXJldCA9IGJtYzE1MF9hY2NlbF91cGRhdGVfc2xvcGUoZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAkvKiBTZXQgZGVmYXVsdCBhcyBsYXRjaGVkIGludGVycnVwdHMgKi8KIAlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKQEAgLTM0OCwxNTUgKzQwNCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX3NldHVwX2FueV9tb3Rpb25faW50ZXJydXB0KAotCQkJCQlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEsCi0JCQkJCWJvb2wgc3RhdHVzKQotewotCWludCByZXQ7Ci0KLQkvKiBFbmFibGUvRGlzYWJsZSBJTlQxIG1hcHBpbmcgKi8KLQlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAotCQkJCSAgICAgICBCTUMxNTBfQUNDRUxfUkVHX0lOVF9NQVBfMCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciByZWFkaW5nIHJlZ19pbnRfbWFwXzBcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlpZiAoc3RhdHVzKQotCQlyZXQgfD0gQk1DMTUwX0FDQ0VMX0lOVF9NQVBfMF9CSVRfU0xPUEU7Ci0JZWxzZQotCQlyZXQgJj0gfkJNQzE1MF9BQ0NFTF9JTlRfTUFQXzBfQklUX1NMT1BFOwotCi0JcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UX01BUF8wLAotCQkJCQlyZXQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfaW50X21hcF8wXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoc3RhdHVzKSB7Ci0JCS8qIFNldCBzbG9wZSBkdXJhdGlvbiAobm8gb2Ygc2FtcGxlcykgKi8KLQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJCQlCTUMxNTBfQUNDRUxfUkVHX0lOVF81LAotCQkJCQkJZGF0YS0+c2xvcGVfZHVyKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGUgcmVnX2ludF81XG4iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvKiBTZXQgc2xvcGUgdGhyZXNob2xkcyAqLwotCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UXzYsCi0JCQkJCQlkYXRhLT5zbG9wZV90aHJlcyk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHdyaXRlIHJlZ19pbnRfNlxuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJLyoKLQkJICogTmV3IGRhdGEgaW50ZXJydXB0IGlzIGFsd2F5cyBub24tbGF0Y2hlZCwKLQkJICogd2hpY2ggd2lsbCBoYXZlIGhpZ2hlciBwcmlvcml0eSwgc28gbm8gbmVlZAotCQkgKiB0byBzZXQgbGF0Y2hlZCBtb2RlLCB3ZSB3aWxsIGJlIGZsb29kZWQgYW55d2F5IHdpdGggSU5UUgotCQkgKi8KLQkJaWYgKCFkYXRhLT5kcmVhZHlfdHJpZ2dlcl9vbikgewotCQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UX1JTVF9MQVRDSCwKLQkJCQkJQk1DMTUwX0FDQ0VMX0lOVF9NT0RFX0xBVENIX0lOVCB8Ci0JCQkJCUJNQzE1MF9BQ0NFTF9JTlRfTU9ERV9MQVRDSF9SRVNFVCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LAotCQkJCQkiRXJyb3Igd3JpdGluZyByZWdfaW50X3JzdF9sYXRjaFxuIik7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJfQotCi0JCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAotCQkJCQkJQk1DMTUwX0FDQ0VMX1JFR19JTlRfRU5fMCwKLQkJCQkJCUJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX1NMUF9YIHwKLQkJCQkJCUJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX1NMUF9ZIHwKLQkJCQkJCUJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX1NMUF9aKTsKLQl9IGVsc2UKLQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJCQlCTUMxNTBfQUNDRUxfUkVHX0lOVF9FTl8wLAotCQkJCQkJMCk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHdyaXRpbmcgcmVnX2ludF9lbl8wXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBibWMxNTBfYWNjZWxfc2V0dXBfbmV3X2RhdGFfaW50ZXJydXB0KHN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSwKLQkJCQkJICAgYm9vbCBzdGF0dXMpCi17Ci0JaW50IHJldDsKLQotCS8qIEVuYWJsZS9EaXNhYmxlIElOVDEgbWFwcGluZyAqLwotCXJldCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJICAgICAgIEJNQzE1MF9BQ0NFTF9SRUdfSU5UX01BUF8xKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHJlYWRpbmcgcmVnX2ludF9tYXBfMVxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWlmIChzdGF0dXMpCi0JCXJldCB8PSBCTUMxNTBfQUNDRUxfSU5UX01BUF8xX0JJVF9EQVRBOwotCWVsc2UKLQkJcmV0ICY9IH5CTUMxNTBfQUNDRUxfSU5UX01BUF8xX0JJVF9EQVRBOwotCi0JcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UX01BUF8xLAotCQkJCQlyZXQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfaW50X21hcF8xXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoc3RhdHVzKSB7Ci0JCS8qCi0JCSAqIFNldCBub24gbGF0Y2hlZCBtb2RlIGludGVycnVwdCBhbmQgY2xlYXIgYW55IGxhdGNoZWQKLQkJICogaW50ZXJydXB0Ci0JCSAqLwotCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCQkJQk1DMTUwX0FDQ0VMX1JFR19JTlRfUlNUX0xBVENILAotCQkJCQlCTUMxNTBfQUNDRUxfSU5UX01PREVfTk9OX0xBVENIX0lOVCB8Ci0JCQkJCUJNQzE1MF9BQ0NFTF9JTlRfTU9ERV9MQVRDSF9SRVNFVCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwKLQkJCQkiRXJyb3Igd3JpdGluZyByZWdfaW50X3JzdF9sYXRjaFxuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCi0JCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UX0VOXzEsCi0JCQkJCUJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX0RBVEFfRU4pOwotCi0JfSBlbHNlIHsKLQkJLyogUmVzdG9yZSBkZWZhdWx0IGludGVycnVwdCBtb2RlICovCi0JCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAotCQkJCQlCTUMxNTBfQUNDRUxfUkVHX0lOVF9SU1RfTEFUQ0gsCi0JCQkJCUJNQzE1MF9BQ0NFTF9JTlRfTU9ERV9MQVRDSF9JTlQgfAotCQkJCQlCTUMxNTBfQUNDRUxfSU5UX01PREVfTEFUQ0hfUkVTRVQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsCi0JCQkJIkVycm9yIHdyaXRpbmcgcmVnX2ludF9yc3RfbGF0Y2hcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAotCQkJCQkJQk1DMTUwX0FDQ0VMX1JFR19JTlRfRU5fMSwKLQkJCQkJCTApOwotCX0KLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfaW50X2VuXzFcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGJtYzE1MF9hY2NlbF9nZXRfYncoc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhLCBpbnQgKnZhbCwKIAkJCSAgICAgICBpbnQgKnZhbDIpCiB7CkBAIC01NTQsNiArNDYxLDEyMCBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYm1jMTUwX2FjY2VsX2ludGVycnVwdF9pbmZvIHsKKwl1OCBtYXBfcmVnOworCXU4IG1hcF9iaXRtYXNrOworCXU4IGVuX3JlZzsKKwl1OCBlbl9iaXRtYXNrOworfSBibWMxNTBfYWNjZWxfaW50ZXJydXB0c1tCTUMxNTBfQUNDRUxfSU5URVJSVVBUU10gPSB7CisJeyAvKiBkYXRhIHJlYWR5IGludGVycnVwdCAqLworCQkubWFwX3JlZyA9IEJNQzE1MF9BQ0NFTF9SRUdfSU5UX01BUF8xLAorCQkubWFwX2JpdG1hc2sgPSBCTUMxNTBfQUNDRUxfSU5UX01BUF8xX0JJVF9EQVRBLAorCQkuZW5fcmVnID0gQk1DMTUwX0FDQ0VMX1JFR19JTlRfRU5fMSwKKwkJLmVuX2JpdG1hc2sgPSBCTUMxNTBfQUNDRUxfSU5UX0VOX0JJVF9EQVRBX0VOLAorCX0sCisJeyAgLyogbW90aW9uIGludGVycnVwdCAqLworCQkubWFwX3JlZyA9IEJNQzE1MF9BQ0NFTF9SRUdfSU5UX01BUF8wLAorCQkubWFwX2JpdG1hc2sgPSBCTUMxNTBfQUNDRUxfSU5UX01BUF8wX0JJVF9TTE9QRSwKKwkJLmVuX3JlZyA9IEJNQzE1MF9BQ0NFTF9SRUdfSU5UX0VOXzAsCisJCS5lbl9iaXRtYXNrID0gIEJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX1NMUF9YIHwKKwkJCUJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX1NMUF9ZIHwKKwkJCUJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX1NMUF9aCisJfSwKKwl7IC8qIGZpZm8gd2F0ZXJtYXJrIGludGVycnVwdCAqLworCQkubWFwX3JlZyA9IEJNQzE1MF9BQ0NFTF9SRUdfSU5UX01BUF8xLAorCQkubWFwX2JpdG1hc2sgPSBCTUMxNTBfQUNDRUxfSU5UX01BUF8xX0JJVF9GV00sCisJCS5lbl9yZWcgPSBCTUMxNTBfQUNDRUxfUkVHX0lOVF9FTl8xLAorCQkuZW5fYml0bWFzayA9IEJNQzE1MF9BQ0NFTF9JTlRfRU5fQklUX0ZXTV9FTiwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgYm1jMTUwX2FjY2VsX2ludGVycnVwdHNfc2V0dXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkJICBzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQk1DMTUwX0FDQ0VMX0lOVEVSUlVQVFM7IGkrKykKKwkJZGF0YS0+aW50ZXJydXB0c1tpXS5pbmZvID0gJmJtYzE1MF9hY2NlbF9pbnRlcnJ1cHRzW2ldOworfQorCitzdGF0aWMgaW50IGJtYzE1MF9hY2NlbF9zZXRfaW50ZXJydXB0KHN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSwgaW50IGksCisJCQkJICAgICAgYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2ludGVycnVwdCAqaW50ciA9ICZkYXRhLT5pbnRlcnJ1cHRzW2ldOworCWNvbnN0IHN0cnVjdCBibWMxNTBfYWNjZWxfaW50ZXJydXB0X2luZm8gKmluZm8gPSBpbnRyLT5pbmZvOworCWludCByZXQ7CisKKwlpZiAoc3RhdGUpIHsKKwkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZpbnRyLT51c2VycykgPiAxKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZpbnRyLT51c2VycykgPiAwKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBXZSB3aWxsIGV4cGVjdCB0aGUgZW5hYmxlIGFuZCBkaXNhYmxlIHRvIGRvIG9wZXJhdGlvbiBpbgorCSAqIGluIHJldmVyc2Ugb3JkZXIuIFRoaXMgd2lsbCBoYXBwZW4gaGVyZSBhbnl3YXkgYXMgb3VyCisJICogcmVzdW1lIG9wZXJhdGlvbiB1c2VzIHN5bmMgbW9kZSBydW50aW1lIHBtIGNhbGxzLCB0aGUKKwkgKiBzdXNwZW5kIG9wZXJhdGlvbiB3aWxsIGJlIGRlbGF5ZWQgYnkgYXV0b3N1c3BlbmQgZGVsYXkKKwkgKiBTbyB0aGUgZGlzYWJsZSBvcGVyYXRpb24gd2lsbCBzdGlsbCBoYXBwZW4gaW4gcmV2ZXJzZSBvZgorCSAqIGVuYWJsZSBvcGVyYXRpb24uIFdoZW4gcnVudGltZSBwbSBpcyBkaXNhYmxlZCB0aGUgbW9kZQorCSAqIGlzIGFsd2F5cyBvbiBzbyBzZXF1ZW5jZSBkb2Vzbid0IG1hdHRlcgorCSAqLworCXJldCA9IGJtYzE1MF9hY2NlbF9zZXRfcG93ZXJfc3RhdGUoZGF0YSwgc3RhdGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogbWFwIHRoZSBpbnRlcnJ1cHQgdG8gdGhlIGFwcHJvcHJpYXRlIHBpbnMgKi8KKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBpbmZvLT5tYXBfcmVnKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHJlYWRpbmcgcmVnX2ludF9tYXBcbiIpOworCQlnb3RvIG91dF9maXhfcG93ZXJfc3RhdGU7CisJfQorCWlmIChzdGF0ZSkKKwkJcmV0IHw9IGluZm8tPm1hcF9iaXRtYXNrOworCWVsc2UKKwkJcmV0ICY9IH5pbmZvLT5tYXBfYml0bWFzazsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBpbmZvLT5tYXBfcmVnLAorCQkJCQlyZXQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfaW50X21hcFxuIik7CisJCWdvdG8gb3V0X2ZpeF9wb3dlcl9zdGF0ZTsKKwl9CisKKwkvKiBlbmFibGUvZGlzYWJsZSB0aGUgaW50ZXJydXB0ICovCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgaW5mby0+ZW5fcmVnKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHJlYWRpbmcgcmVnX2ludF9lblxuIik7CisJCWdvdG8gb3V0X2ZpeF9wb3dlcl9zdGF0ZTsKKwl9CisKKwlpZiAoc3RhdGUpCisJCXJldCB8PSBpbmZvLT5lbl9iaXRtYXNrOworCWVsc2UKKwkJcmV0ICY9IH5pbmZvLT5lbl9iaXRtYXNrOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsIGluZm8tPmVuX3JlZywgcmV0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHdyaXRpbmcgcmVnX2ludF9lblxuIik7CisJCWdvdG8gb3V0X2ZpeF9wb3dlcl9zdGF0ZTsKKwl9CisKKwlpZiAoc3RhdGUpCisJCWF0b21pY19pbmMoJmRhdGEtPmFjdGl2ZV9pbnRyKTsKKwllbHNlCisJCWF0b21pY19kZWMoJmRhdGEtPmFjdGl2ZV9pbnRyKTsKKworCXJldHVybiAwOworCitvdXRfZml4X3Bvd2VyX3N0YXRlOgorCWJtYzE1MF9hY2NlbF9zZXRfcG93ZXJfc3RhdGUoZGF0YSwgZmFsc2UpOworCXJldHVybiByZXQ7Cit9CisKKwogc3RhdGljIGludCBibWMxNTBfYWNjZWxfc2V0X3NjYWxlKHN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSwgaW50IHZhbCkKIHsKIAlpbnQgcmV0LCBpOwpAQCAtNzMyLDcgKzc1Myw3IEBACiAJCSp2YWwgPSBkYXRhLT5zbG9wZV90aHJlczsKIAkJYnJlYWs7CiAJY2FzZSBJSU9fRVZfSU5GT19QRVJJT0Q6Ci0JCSp2YWwgPSBkYXRhLT5zbG9wZV9kdXIgJiBCTUMxNTBfQUNDRUxfU0xPUEVfRFVSX01BU0s7CisJCSp2YWwgPSBkYXRhLT5zbG9wZV9kdXI7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzU1LDExICs3NzYsMTAgQEAKIAogCXN3aXRjaCAoaW5mbykgewogCWNhc2UgSUlPX0VWX0lORk9fVkFMVUU6Ci0JCWRhdGEtPnNsb3BlX3RocmVzID0gdmFsOworCQlkYXRhLT5zbG9wZV90aHJlcyA9IHZhbCAmIDB4RkY7CiAJCWJyZWFrOwogCWNhc2UgSUlPX0VWX0lORk9fUEVSSU9EOgotCQlkYXRhLT5zbG9wZV9kdXIgJj0gfkJNQzE1MF9BQ0NFTF9TTE9QRV9EVVJfTUFTSzsKLQkJZGF0YS0+c2xvcGVfZHVyIHw9IHZhbCAmIEJNQzE1MF9BQ0NFTF9TTE9QRV9EVVJfTUFTSzsKKwkJZGF0YS0+c2xvcGVfZHVyID0gdmFsICYgQk1DMTUwX0FDQ0VMX1NMT1BFX0RVUl9NQVNLOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc4OCw0MCArODA4LDE4IEBACiAJc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgcmV0OwogCi0JaWYgKHN0YXRlICYmIGRhdGEtPmV2X2VuYWJsZV9zdGF0ZSkKKwlpZiAoc3RhdGUgPT0gZGF0YS0+ZXZfZW5hYmxlX3N0YXRlKQogCQlyZXR1cm4gMDsKIAogCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKIAotCWlmICghc3RhdGUgJiYgZGF0YS0+bW90aW9uX3RyaWdnZXJfb24pIHsKLQkJZGF0YS0+ZXZfZW5hYmxlX3N0YXRlID0gMDsKLQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogV2Ugd2lsbCBleHBlY3QgdGhlIGVuYWJsZSBhbmQgZGlzYWJsZSB0byBkbyBvcGVyYXRpb24gaW4KLQkgKiBpbiByZXZlcnNlIG9yZGVyLiBUaGlzIHdpbGwgaGFwcGVuIGhlcmUgYW55d2F5IGFzIG91cgotCSAqIHJlc3VtZSBvcGVyYXRpb24gdXNlcyBzeW5jIG1vZGUgcnVudGltZSBwbSBjYWxscywgdGhlCi0JICogc3VzcGVuZCBvcGVyYXRpb24gd2lsbCBiZSBkZWxheWVkIGJ5IGF1dG9zdXNwZW5kIGRlbGF5Ci0JICogU28gdGhlIGRpc2FibGUgb3BlcmF0aW9uIHdpbGwgc3RpbGwgaGFwcGVuIGluIHJldmVyc2Ugb2YKLQkgKiBlbmFibGUgb3BlcmF0aW9uLiBXaGVuIHJ1bnRpbWUgcG0gaXMgZGlzYWJsZWQgdGhlIG1vZGUKLQkgKiBpcyBhbHdheXMgb24gc28gc2VxdWVuY2UgZG9lc24ndCBtYXR0ZXIKLQkgKi8KLQotCXJldCA9IGJtYzE1MF9hY2NlbF9zZXRfcG93ZXJfc3RhdGUoZGF0YSwgc3RhdGUpOworCXJldCA9IGJtYzE1MF9hY2NlbF9zZXRfaW50ZXJydXB0KGRhdGEsIEJNQzE1MF9BQ0NFTF9JTlRfQU5ZX01PVElPTiwKKwkJCQkJIHN0YXRlKTsKIAlpZiAocmV0IDwgMCkgewogCQltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSAgYm1jMTUwX2FjY2VsX3NldHVwX2FueV9tb3Rpb25faW50ZXJydXB0KGRhdGEsIHN0YXRlKTsKLQlpZiAocmV0IDwgMCkgewotCQlibWMxNTBfYWNjZWxfc2V0X3Bvd2VyX3N0YXRlKGRhdGEsIGZhbHNlKTsKLQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJZGF0YS0+ZXZfZW5hYmxlX3N0YXRlID0gc3RhdGU7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CiAKQEAgLTgzMiwxNSArODMwLDIyNiBAQAogCQkJCSAgIHN0cnVjdCBpaW9fdHJpZ2dlciAqdHJpZykKIHsKIAlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCBpOwogCi0JaWYgKGRhdGEtPmRyZWFkeV90cmlnICE9IHRyaWcgJiYgZGF0YS0+bW90aW9uX3RyaWcgIT0gdHJpZykKLQkJcmV0dXJuIC1FSU5WQUw7CisJZm9yIChpID0gMDsgaSA8IEJNQzE1MF9BQ0NFTF9UUklHR0VSUzsgaSsrKSB7CisJCWlmIChkYXRhLT50cmlnZ2Vyc1tpXS5pbmRpb190cmlnID09IHRyaWcpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3QgYm1jMTUwX2FjY2VsX2dldF9maWZvX3dhdGVybWFyayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCB3bTsKKworCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKKwl3bSA9IGRhdGEtPndhdGVybWFyazsKKwltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB3bSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJtYzE1MF9hY2NlbF9nZXRfZmlmb19zdGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CisJc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlib29sIHN0YXRlOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOworCXN0YXRlID0gZGF0YS0+Zmlmb19tb2RlOworCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0YXRlKTsKK30KKworc3RhdGljIElJT19DT05TVF9BVFRSKGh3Zmlmb193YXRlcm1hcmtfbWluLCAiMSIpOworc3RhdGljIElJT19DT05TVF9BVFRSKGh3Zmlmb193YXRlcm1hcmtfbWF4LAorCQkgICAgICBfX3N0cmluZ2lmeShCTUMxNTBfQUNDRUxfRklGT19MRU5HVEgpKTsKK3N0YXRpYyBJSU9fREVWSUNFX0FUVFIoaHdmaWZvX2VuYWJsZWQsIFNfSVJVR08sCisJCSAgICAgICBibWMxNTBfYWNjZWxfZ2V0X2ZpZm9fc3RhdGUsIE5VTEwsIDApOworc3RhdGljIElJT19ERVZJQ0VfQVRUUihod2ZpZm9fd2F0ZXJtYXJrLCBTX0lSVUdPLAorCQkgICAgICAgYm1jMTUwX2FjY2VsX2dldF9maWZvX3dhdGVybWFyaywgTlVMTCwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlICpibWMxNTBfYWNjZWxfZmlmb19hdHRyaWJ1dGVzW10gPSB7CisJJmlpb19jb25zdF9hdHRyX2h3Zmlmb193YXRlcm1hcmtfbWluLmRldl9hdHRyLmF0dHIsCisJJmlpb19jb25zdF9hdHRyX2h3Zmlmb193YXRlcm1hcmtfbWF4LmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9od2ZpZm9fd2F0ZXJtYXJrLmRldl9hdHRyLmF0dHIsCisJJmlpb19kZXZfYXR0cl9od2ZpZm9fZW5hYmxlZC5kZXZfYXR0ci5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgaW50IGJtYzE1MF9hY2NlbF9zZXRfd2F0ZXJtYXJrKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHVuc2lnbmVkIHZhbCkKK3sKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWYgKHZhbCA+IEJNQzE1MF9BQ0NFTF9GSUZPX0xFTkdUSCkKKwkJdmFsID0gQk1DMTUwX0FDQ0VMX0ZJRk9fTEVOR1RIOworCisJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOworCWRhdGEtPndhdGVybWFyayA9IHZhbDsKKwltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKIAogCXJldHVybiAwOwogfQogCisvKgorICogV2UgbXVzdCByZWFkIGF0IGxlYXN0IG9uZSBmdWxsIGZyYW1lIGluIG9uZSBidXJzdCwgb3RoZXJ3aXNlIHRoZSByZXN0IG9mIHRoZQorICogZnJhbWUgZGF0YSBpcyBkaXNjYXJkZWQuCisgKi8KK3N0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX2ZpZm9fdHJhbnNmZXIoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCQkgICAgICBjaGFyICpidWZmZXIsIGludCBzYW1wbGVzKQoreworCWludCBzYW1wbGVfbGVuZ3RoID0gMyAqIDI7CisJdTggcmVnX2ZpZm9fZGF0YSA9IEJNQzE1MF9BQ0NFTF9SRUdfRklGT19EQVRBOworCWludCByZXQgPSAtRUlPOworCisJaWYgKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSkgeworCQlzdHJ1Y3QgaTJjX21zZyBtc2dbMl0gPSB7CisJCQl7CisJCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkJLmZsYWdzID0gMCwKKwkJCQkuYnVmID0gJnJlZ19maWZvX2RhdGEsCisJCQkJLmxlbiA9IHNpemVvZihyZWdfZmlmb19kYXRhKSwKKwkJCX0sCisJCQl7CisJCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkJLmZsYWdzID0gSTJDX01fUkQsCisJCQkJLmJ1ZiA9ICh1OCAqKWJ1ZmZlciwKKwkJCQkubGVuID0gc2FtcGxlcyAqIHNhbXBsZV9sZW5ndGgsCisJCQl9CisJCX07CisKKwkJcmV0ID0gaTJjX3RyYW5zZmVyKGNsaWVudC0+YWRhcHRlciwgbXNnLCAyKTsKKwkJaWYgKHJldCAhPSAyKQorCQkJcmV0ID0gLUVJTzsKKwkJZWxzZQorCQkJcmV0ID0gMDsKKwl9IGVsc2UgeworCQlpbnQgaSwgc3RlcCA9IEkyQ19TTUJVU19CTE9DS19NQVggLyBzYW1wbGVfbGVuZ3RoOworCisJCWZvciAoaSA9IDA7IGkgPCBzYW1wbGVzICogc2FtcGxlX2xlbmd0aDsgaSArPSBzdGVwKSB7CisJCQlyZXQgPSBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShjbGllbnQsCisJCQkJCQkJICAgIHJlZ19maWZvX2RhdGEsIHN0ZXAsCisJCQkJCQkJICAgICZidWZmZXJbaV0pOworCQkJaWYgKHJldCAhPSBzdGVwKSB7CisJCQkJcmV0ID0gLUVJTzsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJcmV0ID0gMDsKKwkJfQorCX0KKworCWlmIChyZXQpCisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRXJyb3IgdHJhbnNmZXJyaW5nIGRhdGEgZnJvbSBmaWZvXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19ibWMxNTBfYWNjZWxfZmlmb19mbHVzaChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgICAgdW5zaWduZWQgc2FtcGxlcywgYm9vbCBpcnEpCit7CisJc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0LCBpOworCXU4IGNvdW50OworCXUxNiBidWZmZXJbQk1DMTUwX0FDQ0VMX0ZJRk9fTEVOR1RIICogM107CisJaW50NjRfdCB0c3RhbXA7CisJdWludDY0X3Qgc2FtcGxlX3BlcmlvZDsKKwlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAorCQkJCSAgICAgICBCTUMxNTBfQUNDRUxfUkVHX0ZJRk9fU1RBVFVTKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHJlYWRpbmcgcmVnX2ZpZm9fc3RhdHVzXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljb3VudCA9IHJldCAmIDB4N0Y7CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogSWYgd2UgZ2V0dGluZyBjYWxsZWQgZnJvbSBJUlEgaGFuZGxlciB3ZSBrbm93IHRoZSBzdG9yZWQgdGltZXN0YW1wIGlzCisJICogZmFpcmx5IGFjY3VyYXRlIGZvciB0aGUgbGFzdCBzdG9yZWQgc2FtcGxlLiBPdGhlcndpc2UsIGlmIHdlIGFyZQorCSAqIGNhbGxlZCBhcyBhIHJlc3VsdCBvZiBhIHJlYWQgb3BlcmF0aW9uIGZyb20gdXNlcnNwYWNlIGFuZCBoZW5jZQorCSAqIGJlZm9yZSB0aGUgd2F0ZXJtYXJrIGludGVycnVwdCB3YXMgdHJpZ2dlcmVkLCB0YWtlIGEgdGltZXN0YW1wCisJICogbm93LiBXZSBjYW4gZmFsbCBhbnl3aGVyZSBpbiBiZXR3ZWVuIHR3byBzYW1wbGVzIHNvIHRoZSBlcnJvciBpbiB0aGlzCisJICogY2FzZSBpcyBhdCBtb3N0IG9uZSBzYW1wbGUgcGVyaW9kLgorCSAqLworCWlmICghaXJxKSB7CisJCWRhdGEtPm9sZF90aW1lc3RhbXAgPSBkYXRhLT50aW1lc3RhbXA7CisJCWRhdGEtPnRpbWVzdGFtcCA9IGlpb19nZXRfdGltZV9ucygpOworCX0KKworCS8qCisJICogQXBwcm94aW1hdGUgdGltZXN0YW1wcyBmb3IgZWFjaCBvZiB0aGUgc2FtcGxlIGJhc2VkIG9uIHRoZSBzYW1wbGluZworCSAqIGZyZXF1ZW5jeSwgdGltZXN0YW1wIGZvciBsYXN0IHNhbXBsZSBhbmQgbnVtYmVyIG9mIHNhbXBsZXMuCisJICoKKwkgKiBOb3RlIHRoYXQgd2UgY2FuJ3QgdXNlIHRoZSBjdXJyZW50IGJhbmR3aWR0aCBzZXR0aW5ncyB0byBjb21wdXRlIHRoZQorCSAqIHNhbXBsZSBwZXJpb2QgYmVjYXVzZSB0aGUgc2FtcGxlIHJhdGUgdmFyaWVzIHdpdGggdGhlIGRldmljZQorCSAqIChlLmcuIGJldHdlZW4gMzEuNzBtcyB0byAzMi4yMG1zIGZvciBhIGJhbmR3aWR0aCBvZiAxNS42M0haKS4gVGhhdAorCSAqIHNtYWxsIHZhcmlhdGlvbiBhZGRzIHdoZW4gd2Ugc3RvcmUgYSBsYXJnZSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQKKwkgKiBjcmVhdGVzIHNpZ25pZmljYW50IGppdHRlciBiZXR3ZWVuIHRoZSBsYXN0IGFuZCBmaXJzdCBzYW1wbGVzIGluCisJICogZGlmZmVyZW50IGJhdGNoZXMgKGUuZy4gMzJtcyB2cyAyMW1zKS4KKwkgKgorCSAqIFRvIGF2b2lkIHRoaXMgaXNzdWUgd2UgY29tcHV0ZSB0aGUgYWN0dWFsIHNhbXBsZSBwZXJpb2Qgb3Vyc2VsdmVzCisJICogYmFzZWQgb24gdGhlIHRpbWVzdGFtcCBkZWx0YSBiZXR3ZWVuIHRoZSBsYXN0IHR3byBmbHVzaCBvcGVyYXRpb25zLgorCSAqLworCXNhbXBsZV9wZXJpb2QgPSAoZGF0YS0+dGltZXN0YW1wIC0gZGF0YS0+b2xkX3RpbWVzdGFtcCk7CisJZG9fZGl2KHNhbXBsZV9wZXJpb2QsIGNvdW50KTsKKwl0c3RhbXAgPSBkYXRhLT50aW1lc3RhbXAgLSAoY291bnQgLSAxKSAqIHNhbXBsZV9wZXJpb2Q7CisKKwlpZiAoc2FtcGxlcyAmJiBjb3VudCA+IHNhbXBsZXMpCisJCWNvdW50ID0gc2FtcGxlczsKKworCXJldCA9IGJtYzE1MF9hY2NlbF9maWZvX3RyYW5zZmVyKGRhdGEtPmNsaWVudCwgKHU4ICopYnVmZmVyLCBjb3VudCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogSWRlYWxseSB3ZSB3YW50IHRoZSBJSU8gY29yZSB0byBoYW5kbGUgdGhlIGRlbXV4IHdoZW4gcnVubmluZyBpbiBmaWZvCisJICogbW9kZSBidXQgbm90IHdoZW4gcnVubmluZyBpbiB0cmlnZ2VyZWQgYnVmZmVyIG1vZGUuIFVuZm9ydHVuYXRlbHkKKwkgKiB0aGlzIGRvZXMgbm90IHNlZW0gdG8gYmUgcG9zc2libGUsIHNvIHN0aWNrIHdpdGggZHJpdmVyIGRlbXV4IGZvcgorCSAqIG5vdy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQl1MTYgc2FtcGxlWzhdOworCQlpbnQgaiwgYml0OworCisJCWogPSAwOworCQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrLAorCQkJCSBpbmRpb19kZXYtPm1hc2tsZW5ndGgpCisJCQltZW1jcHkoJnNhbXBsZVtqKytdLCAmYnVmZmVyW2kgKiAzICsgYml0XSwgMik7CisKKwkJaWlvX3B1c2hfdG9fYnVmZmVyc193aXRoX3RpbWVzdGFtcChpbmRpb19kZXYsIHNhbXBsZSwgdHN0YW1wKTsKKworCQl0c3RhbXAgKz0gc2FtcGxlX3BlcmlvZDsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX2ZpZm9fZmx1c2goc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwgdW5zaWduZWQgc2FtcGxlcykKK3sKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CisJcmV0ID0gX19ibWMxNTBfYWNjZWxfZmlmb19mbHVzaChpbmRpb19kZXYsIHNhbXBsZXMsIGZhbHNlKTsKKwltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBJSU9fQ09OU1RfQVRUUl9TQU1QX0ZSRVFfQVZBSUwoCi0JCSI3LjgxMDAwMCAxNS42MzAwMDAgMzEuMjUwMDAwIDYyLjUwMDAwMCAxMjUgMjUwIDUwMCAxMDAwIik7CisJCSIxNS42MjAwMDAgMzEuMjYwMDAwIDYyLjUwMDAwIDEyNSAyNTAgNTAwIDEwMDAgMjAwMCIpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqYm1jMTUwX2FjY2VsX2F0dHJpYnV0ZXNbXSA9IHsKIAkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLApAQCAtOTc4LDYgKzExODcsMjAgQEAKIAkuZHJpdmVyX21vZHVsZQkJPSBUSElTX01PRFVMRSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gYm1jMTUwX2FjY2VsX2luZm9fZmlmbyA9IHsKKwkuYXR0cnMJCQk9ICZibWMxNTBfYWNjZWxfYXR0cnNfZ3JvdXAsCisJLnJlYWRfcmF3CQk9IGJtYzE1MF9hY2NlbF9yZWFkX3JhdywKKwkud3JpdGVfcmF3CQk9IGJtYzE1MF9hY2NlbF93cml0ZV9yYXcsCisJLnJlYWRfZXZlbnRfdmFsdWUJPSBibWMxNTBfYWNjZWxfcmVhZF9ldmVudCwKKwkud3JpdGVfZXZlbnRfdmFsdWUJPSBibWMxNTBfYWNjZWxfd3JpdGVfZXZlbnQsCisJLndyaXRlX2V2ZW50X2NvbmZpZwk9IGJtYzE1MF9hY2NlbF93cml0ZV9ldmVudF9jb25maWcsCisJLnJlYWRfZXZlbnRfY29uZmlnCT0gYm1jMTUwX2FjY2VsX3JlYWRfZXZlbnRfY29uZmlnLAorCS52YWxpZGF0ZV90cmlnZ2VyCT0gYm1jMTUwX2FjY2VsX3ZhbGlkYXRlX3RyaWdnZXIsCisJLmh3Zmlmb19zZXRfd2F0ZXJtYXJrCT0gYm1jMTUwX2FjY2VsX3NldF93YXRlcm1hcmssCisJLmh3Zmlmb19mbHVzaF90b19idWZmZXIJPSBibWMxNTBfYWNjZWxfZmlmb19mbHVzaCwKKwkuZHJpdmVyX21vZHVsZQkJPSBUSElTX01PRFVMRSwKK307CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBibWMxNTBfYWNjZWxfdHJpZ2dlcl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnApCiB7CiAJc3RydWN0IGlpb19wb2xsX2Z1bmMgKnBmID0gcDsKQEAgLTk4Niw3ICsxMjA5LDcgQEAKIAlpbnQgYml0LCByZXQsIGkgPSAwOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOwotCWZvcl9lYWNoX3NldF9iaXQoYml0LCBpbmRpb19kZXYtPmJ1ZmZlci0+c2Nhbl9tYXNrLAorCWZvcl9lYWNoX3NldF9iaXQoYml0LCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssCiAJCQkgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKSB7CiAJCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsCiAJCQkJCSAgICAgICBCTUMxNTBfQUNDRUxfQVhJU19UT19SRUcoYml0KSk7CkBAIC0xMDA4LDEyICsxMjMxLDEyIEBACiAKIHN0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX3RyaWdfdHJ5X3JlZW4oc3RydWN0IGlpb190cmlnZ2VyICp0cmlnKQogewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpaW9fdHJpZ2dlcl9nZXRfZHJ2ZGF0YSh0cmlnKTsKLQlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0cnVjdCBibWMxNTBfYWNjZWxfdHJpZ2dlciAqdCA9IGlpb190cmlnZ2VyX2dldF9kcnZkYXRhKHRyaWcpOworCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSA9IHQtPmRhdGE7CiAJaW50IHJldDsKIAogCS8qIG5ldyBkYXRhIGludGVycnVwdHMgZG9uJ3QgbmVlZCBhY2sgKi8KLQlpZiAoZGF0YS0+ZHJlYWR5X3RyaWdnZXJfb24pCisJaWYgKHQgPT0gJnQtPmRhdGEtPnRyaWdnZXJzW0JNQzE1MF9BQ0NFTF9UUklHR0VSX0RBVEFfUkVBRFldKQogCQlyZXR1cm4gMDsKIAogCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKQEAgLTEwMzIsNDMgKzEyNTUsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBibWMxNTBfYWNjZWxfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAorc3RhdGljIGludCBibWMxNTBfYWNjZWxfdHJpZ2dlcl9zZXRfc3RhdGUoc3RydWN0IGlpb190cmlnZ2VyICp0cmlnLAogCQkJCQkJICAgYm9vbCBzdGF0ZSkKIHsKLQlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaWlvX3RyaWdnZXJfZ2V0X2RydmRhdGEodHJpZyk7Ci0Jc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX3RyaWdnZXIgKnQgPSBpaW9fdHJpZ2dlcl9nZXRfZHJ2ZGF0YSh0cmlnKTsKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSB0LT5kYXRhOwogCWludCByZXQ7CiAKIAltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CiAKLQlpZiAoIXN0YXRlICYmIGRhdGEtPmV2X2VuYWJsZV9zdGF0ZSAmJiBkYXRhLT5tb3Rpb25fdHJpZ2dlcl9vbikgewotCQlkYXRhLT5tb3Rpb25fdHJpZ2dlcl9vbiA9IGZhbHNlOworCWlmICh0LT5lbmFibGVkID09IHN0YXRlKSB7CiAJCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKgotCSAqIFJlZmVyIHRvIGNvbW1lbnQgaW4gYm1jMTUwX2FjY2VsX3dyaXRlX2V2ZW50X2NvbmZpZyBmb3IKLQkgKiBlbmFibGUvZGlzYWJsZSBvcGVyYXRpb24gb3JkZXIKLQkgKi8KLQlyZXQgPSBibWMxNTBfYWNjZWxfc2V0X3Bvd2VyX3N0YXRlKGRhdGEsIHN0YXRlKTsKKwlpZiAodC0+c2V0dXApIHsKKwkJcmV0ID0gdC0+c2V0dXAodCwgc3RhdGUpOworCQlpZiAocmV0IDwgMCkgeworCQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0ID0gYm1jMTUwX2FjY2VsX3NldF9pbnRlcnJ1cHQoZGF0YSwgdC0+aW50ciwgc3RhdGUpOwogCWlmIChyZXQgPCAwKSB7CiAJCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlpZiAoZGF0YS0+bW90aW9uX3RyaWcgPT0gdHJpZykKLQkJcmV0ID0gIGJtYzE1MF9hY2NlbF9zZXR1cF9hbnlfbW90aW9uX2ludGVycnVwdChkYXRhLCBzdGF0ZSk7Ci0JZWxzZQotCQlyZXQgPSBibWMxNTBfYWNjZWxfc2V0dXBfbmV3X2RhdGFfaW50ZXJydXB0KGRhdGEsIHN0YXRlKTsKLQlpZiAocmV0IDwgMCkgewotCQlibWMxNTBfYWNjZWxfc2V0X3Bvd2VyX3N0YXRlKGRhdGEsIGZhbHNlKTsKLQkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWlmIChkYXRhLT5tb3Rpb25fdHJpZyA9PSB0cmlnKQotCQlkYXRhLT5tb3Rpb25fdHJpZ2dlcl9vbiA9IHN0YXRlOwotCWVsc2UKLQkJZGF0YS0+ZHJlYWR5X3RyaWdnZXJfb24gPSBzdGF0ZTsKKworCXQtPmVuYWJsZWQgPSBzdGF0ZTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOwogCkBAIC0xMDc2LDIzICsxMjkxLDIyIEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX3RyaWdnZXJfb3BzIGJtYzE1MF9hY2NlbF90cmlnZ2VyX29wcyA9IHsKLQkuc2V0X3RyaWdnZXJfc3RhdGUgPSBibWMxNTBfYWNjZWxfZGF0YV9yZHlfdHJpZ2dlcl9zZXRfc3RhdGUsCisJLnNldF90cmlnZ2VyX3N0YXRlID0gYm1jMTUwX2FjY2VsX3RyaWdnZXJfc2V0X3N0YXRlLAogCS50cnlfcmVlbmFibGUgPSBibWMxNTBfYWNjZWxfdHJpZ190cnlfcmVlbiwKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBibWMxNTBfYWNjZWxfZXZlbnRfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2YXRlKQorc3RhdGljIGludCBibWMxNTBfYWNjZWxfaGFuZGxlX3JvY19ldmVudChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewotCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwcml2YXRlOwogCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7Ci0JaW50IHJldDsKIAlpbnQgZGlyOworCWludCByZXQ7CiAKIAlyZXQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LAogCQkJCSAgICAgICBCTUMxNTBfQUNDRUxfUkVHX0lOVF9TVEFUVVNfMik7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciByZWFkaW5nIHJlZ19pbnRfc3RhdHVzXzJcbiIpOwotCQlnb3RvIGFja19pbnRyX3N0YXR1czsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlpZiAocmV0ICYgQk1DMTUwX0FDQ0VMX0FOWV9NT1RJT05fQklUX1NJR04pCkBAIC0xMTIxLDMyICsxMzM1LDczIEBACiAJCQkJCQkJSUlPX0VWX1RZUEVfUk9DLAogCQkJCQkJCWRpciksCiAJCQkJCQkJZGF0YS0+dGltZXN0YW1wKTsKLWFja19pbnRyX3N0YXR1czoKLQlpZiAoIWRhdGEtPmRyZWFkeV90cmlnZ2VyX29uKQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBibWMxNTBfYWNjZWxfaXJxX3RocmVhZF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKnByaXZhdGUpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHByaXZhdGU7CisJc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlib29sIGFjayA9IGZhbHNlOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CisKKwlpZiAoZGF0YS0+Zmlmb19tb2RlKSB7CisJCXJldCA9IF9fYm1jMTUwX2FjY2VsX2ZpZm9fZmx1c2goaW5kaW9fZGV2LAorCQkJCQkJQk1DMTUwX0FDQ0VMX0ZJRk9fTEVOR1RILCB0cnVlKTsKKwkJaWYgKHJldCA+IDApCisJCQlhY2sgPSB0cnVlOworCX0KKworCWlmIChkYXRhLT5ldl9lbmFibGVfc3RhdGUpIHsKKwkJcmV0ID0gYm1jMTUwX2FjY2VsX2hhbmRsZV9yb2NfZXZlbnQoaW5kaW9fZGV2KTsKKwkJaWYgKHJldCA+IDApCisJCQlhY2sgPSB0cnVlOworCX0KKworCWlmIChhY2spIHsKIAkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYXRhLT5jbGllbnQsCiAJCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UX1JTVF9MQVRDSCwKIAkJCQkJQk1DMTUwX0FDQ0VMX0lOVF9NT0RFX0xBVENIX0lOVCB8CiAJCQkJCUJNQzE1MF9BQ0NFTF9JTlRfTU9ERV9MQVRDSF9SRVNFVCk7CisJCWlmIChyZXQpCisJCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwgIkVycm9yIHdyaXRpbmcgcmVnX2ludF9yc3RfbGF0Y2hcbiIpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9IGVsc2UgeworCQlyZXQgPSBJUlFfTk9ORTsKKwl9CiAKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgYm1jMTUwX2FjY2VsX2RhdGFfcmR5X3RyaWdfcG9sbChpbnQgaXJxLCB2b2lkICpwcml2YXRlKQorc3RhdGljIGlycXJldHVybl90IGJtYzE1MF9hY2NlbF9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpwcml2YXRlKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBwcml2YXRlOwogCXN0cnVjdCBibWMxNTBfYWNjZWxfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJYm9vbCBhY2sgPSBmYWxzZTsKKwlpbnQgaTsKIAorCWRhdGEtPm9sZF90aW1lc3RhbXAgPSBkYXRhLT50aW1lc3RhbXA7CiAJZGF0YS0+dGltZXN0YW1wID0gaWlvX2dldF90aW1lX25zKCk7CiAKLQlpZiAoZGF0YS0+ZHJlYWR5X3RyaWdnZXJfb24pCi0JCWlpb190cmlnZ2VyX3BvbGwoZGF0YS0+ZHJlYWR5X3RyaWcpOwotCWVsc2UgaWYgKGRhdGEtPm1vdGlvbl90cmlnZ2VyX29uKQotCQlpaW9fdHJpZ2dlcl9wb2xsKGRhdGEtPm1vdGlvbl90cmlnKTsKKwlmb3IgKGkgPSAwOyBpIDwgQk1DMTUwX0FDQ0VMX1RSSUdHRVJTOyBpKyspIHsKKwkJaWYgKGRhdGEtPnRyaWdnZXJzW2ldLmVuYWJsZWQpIHsKKwkJCWlpb190cmlnZ2VyX3BvbGwoZGF0YS0+dHJpZ2dlcnNbaV0uaW5kaW9fdHJpZyk7CisJCQlhY2sgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CiAKLQlpZiAoZGF0YS0+ZXZfZW5hYmxlX3N0YXRlKQorCWlmIChkYXRhLT5ldl9lbmFibGVfc3RhdGUgfHwgZGF0YS0+Zmlmb19tb2RlKQogCQlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOwotCWVsc2UKKworCWlmIChhY2spCiAJCXJldHVybiBJUlFfSEFORExFRDsKKworCXJldHVybiBJUlFfTk9ORTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgKmJtYzE1MF9hY2NlbF9tYXRjaF9hY3BpX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCAqZGF0YSkKQEAgLTExNzYsMTYgKzE0MzEsMTIgQEAKIAlkZXYgPSAmY2xpZW50LT5kZXY7CiAKIAkvKiBkYXRhIHJlYWR5IGdwaW8gaW50ZXJydXB0IHBpbiAqLwotCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsIEJNQzE1MF9BQ0NFTF9HUElPX05BTUUsIDApOworCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsIEJNQzE1MF9BQ0NFTF9HUElPX05BTUUsIDAsIEdQSU9EX0lOKTsKIAlpZiAoSVNfRVJSKGdwaW8pKSB7CiAJCWRldl9lcnIoZGV2LCAiRmFpbGVkOiBncGlvIGdldCBpbmRleFxuIik7CiAJCXJldHVybiBQVFJfRVJSKGdwaW8pOwogCX0KIAotCXJldCA9IGdwaW9kX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJcmV0ID0gZ3Bpb2RfdG9faXJxKGdwaW8pOwogCiAJZGV2X2RiZyhkZXYsICJHUElPIHJlc291cmNlLCBubzolZCBpcnE6JWRcbiIsIGRlc2NfdG9fZ3BpbyhncGlvKSwgcmV0KTsKQEAgLTExOTMsNiArMTQ0NCwxNTggQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwlpbnQgaW50cjsKKwljb25zdCBjaGFyICpuYW1lOworCWludCAoKnNldHVwKShzdHJ1Y3QgYm1jMTUwX2FjY2VsX3RyaWdnZXIgKnQsIGJvb2wgc3RhdGUpOworfSBibWMxNTBfYWNjZWxfdHJpZ2dlcnNbQk1DMTUwX0FDQ0VMX1RSSUdHRVJTXSA9IHsKKwl7CisJCS5pbnRyID0gMCwKKwkJLm5hbWUgPSAiJXMtZGV2JWQiLAorCX0sCisJeworCQkuaW50ciA9IDEsCisJCS5uYW1lID0gIiVzLWFueS1tb3Rpb24tZGV2JWQiLAorCQkuc2V0dXAgPSBibWMxNTBfYWNjZWxfYW55X21vdGlvbl9zZXR1cCwKKwl9LAorfTsKKworc3RhdGljIHZvaWQgYm1jMTUwX2FjY2VsX3VucmVnaXN0ZXJfdHJpZ2dlcnMoc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhLAorCQkJCQkgICAgIGludCBmcm9tKQoreworCWludCBpOworCisJZm9yIChpID0gZnJvbTsgaSA+PSAwOyBpKyspIHsKKwkJaWYgKGRhdGEtPnRyaWdnZXJzW2ldLmluZGlvX3RyaWcpIHsKKwkJCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoZGF0YS0+dHJpZ2dlcnNbaV0uaW5kaW9fdHJpZyk7CisJCQlkYXRhLT50cmlnZ2Vyc1tpXS5pbmRpb190cmlnID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBibWMxNTBfYWNjZWxfdHJpZ2dlcnNfc2V0dXAoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCQkgICAgICAgc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhKQoreworCWludCBpLCByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgQk1DMTUwX0FDQ0VMX1RSSUdHRVJTOyBpKyspIHsKKwkJc3RydWN0IGJtYzE1MF9hY2NlbF90cmlnZ2VyICp0ID0gJmRhdGEtPnRyaWdnZXJzW2ldOworCisJCXQtPmluZGlvX3RyaWcgPSBkZXZtX2lpb190cmlnZ2VyX2FsbG9jKCZkYXRhLT5jbGllbnQtPmRldiwKKwkJCQkJICAgICAgIGJtYzE1MF9hY2NlbF90cmlnZ2Vyc1tpXS5uYW1lLAorCQkJCQkJICAgICAgIGluZGlvX2Rldi0+bmFtZSwKKwkJCQkJCSAgICAgICBpbmRpb19kZXYtPmlkKTsKKwkJaWYgKCF0LT5pbmRpb190cmlnKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQl0LT5pbmRpb190cmlnLT5kZXYucGFyZW50ID0gJmRhdGEtPmNsaWVudC0+ZGV2OworCQl0LT5pbmRpb190cmlnLT5vcHMgPSAmYm1jMTUwX2FjY2VsX3RyaWdnZXJfb3BzOworCQl0LT5pbnRyID0gYm1jMTUwX2FjY2VsX3RyaWdnZXJzW2ldLmludHI7CisJCXQtPmRhdGEgPSBkYXRhOworCQl0LT5zZXR1cCA9IGJtYzE1MF9hY2NlbF90cmlnZ2Vyc1tpXS5zZXR1cDsKKwkJaWlvX3RyaWdnZXJfc2V0X2RydmRhdGEodC0+aW5kaW9fdHJpZywgdCk7CisKKwkJcmV0ID0gaWlvX3RyaWdnZXJfcmVnaXN0ZXIodC0+aW5kaW9fdHJpZyk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwlpZiAocmV0KQorCQlibWMxNTBfYWNjZWxfdW5yZWdpc3Rlcl90cmlnZ2VycyhkYXRhLCBpIC0gMSk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEJNQzE1MF9BQ0NFTF9GSUZPX01PREVfU1RSRUFNICAgICAgICAgIDB4ODAKKyNkZWZpbmUgQk1DMTUwX0FDQ0VMX0ZJRk9fTU9ERV9GSUZPICAgICAgICAgICAgMHg0MAorI2RlZmluZSBCTUMxNTBfQUNDRUxfRklGT19NT0RFX0JZUEFTUyAgICAgICAgICAweDAwCisKK3N0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX2ZpZm9fc2V0X21vZGUoc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhKQoreworCXU4IHJlZyA9IEJNQzE1MF9BQ0NFTF9SRUdfRklGT19DT05GSUcxOworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgcmVnLCBkYXRhLT5maWZvX21vZGUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfZmlmb19jb25maWcxXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWRhdGEtPmZpZm9fbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJQk1DMTUwX0FDQ0VMX1JFR19GSUZPX0NPTkZJRzAsCisJCQkJCWRhdGEtPndhdGVybWFyayk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfZmlmb19jb25maWcwXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYm1jMTUwX2FjY2VsX2J1ZmZlcl9wb3N0ZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJc3RydWN0IGJtYzE1MF9hY2NlbF9kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChpbmRpb19kZXYtPmN1cnJlbnRtb2RlID09IElORElPX0JVRkZFUl9UUklHR0VSRUQpCisJCXJldHVybiBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9wb3N0ZW5hYmxlKGluZGlvX2Rldik7CisKKwltdXRleF9sb2NrKCZkYXRhLT5tdXRleCk7CisKKwlpZiAoIWRhdGEtPndhdGVybWFyaykKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBibWMxNTBfYWNjZWxfc2V0X2ludGVycnVwdChkYXRhLCBCTUMxNTBfQUNDRUxfSU5UX1dBVEVSTUFSSywKKwkJCQkJIHRydWUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJZGF0YS0+Zmlmb19tb2RlID0gQk1DMTUwX0FDQ0VMX0ZJRk9fTU9ERV9GSUZPOworCisJcmV0ID0gYm1jMTUwX2FjY2VsX2ZpZm9fc2V0X21vZGUoZGF0YSk7CisJaWYgKHJldCkgeworCQlkYXRhLT5maWZvX21vZGUgPSAwOworCQlibWMxNTBfYWNjZWxfc2V0X2ludGVycnVwdChkYXRhLCBCTUMxNTBfQUNDRUxfSU5UX1dBVEVSTUFSSywKKwkJCQkJICAgZmFsc2UpOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBibWMxNTBfYWNjZWxfYnVmZmVyX3ByZWRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWYgKGluZGlvX2Rldi0+Y3VycmVudG1vZGUgPT0gSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCkKKwkJcmV0dXJuIGlpb190cmlnZ2VyZWRfYnVmZmVyX3ByZWRpc2FibGUoaW5kaW9fZGV2KTsKKworCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKKworCWlmICghZGF0YS0+Zmlmb19tb2RlKQorCQlnb3RvIG91dDsKKworCWJtYzE1MF9hY2NlbF9zZXRfaW50ZXJydXB0KGRhdGEsIEJNQzE1MF9BQ0NFTF9JTlRfV0FURVJNQVJLLCBmYWxzZSk7CisJX19ibWMxNTBfYWNjZWxfZmlmb19mbHVzaChpbmRpb19kZXYsIEJNQzE1MF9BQ0NFTF9GSUZPX0xFTkdUSCwgZmFsc2UpOworCWRhdGEtPmZpZm9fbW9kZSA9IDA7CisJYm1jMTUwX2FjY2VsX2ZpZm9fc2V0X21vZGUoZGF0YSk7CisKK291dDoKKwltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19idWZmZXJfc2V0dXBfb3BzIGJtYzE1MF9hY2NlbF9idWZmZXJfb3BzID0geworCS5wb3N0ZW5hYmxlID0gYm1jMTUwX2FjY2VsX2J1ZmZlcl9wb3N0ZW5hYmxlLAorCS5wcmVkaXNhYmxlID0gYm1jMTUwX2FjY2VsX2J1ZmZlcl9wcmVkaXNhYmxlLAorfTsKKwogc3RhdGljIGludCBibWMxNTBfYWNjZWxfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKQEAgLTEyMzksNTMgKzE2NDIsNTEgQEAKIAlpZiAoY2xpZW50LT5pcnEgPj0gMCkgewogCQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKAogCQkJCQkJJmNsaWVudC0+ZGV2LCBjbGllbnQtPmlycSwKLQkJCQkJCWJtYzE1MF9hY2NlbF9kYXRhX3JkeV90cmlnX3BvbGwsCi0JCQkJCQlibWMxNTBfYWNjZWxfZXZlbnRfaGFuZGxlciwKKwkJCQkJCWJtYzE1MF9hY2NlbF9pcnFfaGFuZGxlciwKKwkJCQkJCWJtYzE1MF9hY2NlbF9pcnFfdGhyZWFkX2hhbmRsZXIsCiAJCQkJCQlJUlFGX1RSSUdHRVJfUklTSU5HLAogCQkJCQkJQk1DMTUwX0FDQ0VMX0lSUV9OQU1FLAogCQkJCQkJaW5kaW9fZGV2KTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKLQkJZGF0YS0+ZHJlYWR5X3RyaWcgPSBkZXZtX2lpb190cmlnZ2VyX2FsbG9jKCZjbGllbnQtPmRldiwKLQkJCQkJCQkgICAiJXMtZGV2JWQiLAotCQkJCQkJCSAgIGluZGlvX2Rldi0+bmFtZSwKLQkJCQkJCQkgICBpbmRpb19kZXYtPmlkKTsKLQkJaWYgKCFkYXRhLT5kcmVhZHlfdHJpZykKLQkJCXJldHVybiAtRU5PTUVNOworCQkvKgorCQkgKiBTZXQgbGF0Y2hlZCBtb2RlIGludGVycnVwdC4gV2hpbGUgY2VydGFpbiBpbnRlcnJ1cHRzIGFyZQorCQkgKiBub24tbGF0Y2hlZCByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZ3MgKGUuZy4gbmV3IGRhdGEpIHdlCisJCSAqIHdhbnQgdG8gdXNlIGxhdGNoIG1vZGUgd2hlbiB3ZSBjYW4gdG8gcHJldmVudCBpbnRlcnJ1cHQKKwkJICogZmxvb2RpbmcuCisJCSAqLworCQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwKKwkJCQkJCUJNQzE1MF9BQ0NFTF9SRUdfSU5UX1JTVF9MQVRDSCwKKwkJCQkJICAgICBCTUMxNTBfQUNDRUxfSU5UX01PREVfTEFUQ0hfUkVTRVQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciB3cml0aW5nIHJlZ19pbnRfcnN0X2xhdGNoXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAotCQlkYXRhLT5tb3Rpb25fdHJpZyA9IGRldm1faWlvX3RyaWdnZXJfYWxsb2MoJmNsaWVudC0+ZGV2LAotCQkJCQkJCSAgIiVzLWFueS1tb3Rpb24tZGV2JWQiLAotCQkJCQkJCSAgaW5kaW9fZGV2LT5uYW1lLAotCQkJCQkJCSAgaW5kaW9fZGV2LT5pZCk7Ci0JCWlmICghZGF0YS0+bW90aW9uX3RyaWcpCi0JCQlyZXR1cm4gLUVOT01FTTsKKwkJYm1jMTUwX2FjY2VsX2ludGVycnVwdHNfc2V0dXAoaW5kaW9fZGV2LCBkYXRhKTsKIAotCQlkYXRhLT5kcmVhZHlfdHJpZy0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKLQkJZGF0YS0+ZHJlYWR5X3RyaWctPm9wcyA9ICZibWMxNTBfYWNjZWxfdHJpZ2dlcl9vcHM7Ci0JCWlpb190cmlnZ2VyX3NldF9kcnZkYXRhKGRhdGEtPmRyZWFkeV90cmlnLCBpbmRpb19kZXYpOwotCQlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3RlcihkYXRhLT5kcmVhZHlfdHJpZyk7CisJCXJldCA9IGJtYzE1MF9hY2NlbF90cmlnZ2Vyc19zZXR1cChpbmRpb19kZXYsIGRhdGEpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQlkYXRhLT5tb3Rpb25fdHJpZy0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKLQkJZGF0YS0+bW90aW9uX3RyaWctPm9wcyA9ICZibWMxNTBfYWNjZWxfdHJpZ2dlcl9vcHM7Ci0JCWlpb190cmlnZ2VyX3NldF9kcnZkYXRhKGRhdGEtPm1vdGlvbl90cmlnLCBpbmRpb19kZXYpOwotCQlyZXQgPSBpaW9fdHJpZ2dlcl9yZWdpc3RlcihkYXRhLT5tb3Rpb25fdHJpZyk7Ci0JCWlmIChyZXQpIHsKLQkJCWRhdGEtPm1vdGlvbl90cmlnID0gTlVMTDsKLQkJCWdvdG8gZXJyX3RyaWdnZXJfdW5yZWdpc3RlcjsKLQkJfQotCiAJCXJldCA9IGlpb190cmlnZ2VyZWRfYnVmZmVyX3NldHVwKGluZGlvX2RldiwKIAkJCQkJCSAmaWlvX3BvbGxmdW5jX3N0b3JlX3RpbWUsCiAJCQkJCQkgYm1jMTUwX2FjY2VsX3RyaWdnZXJfaGFuZGxlciwKLQkJCQkJCSBOVUxMKTsKKwkJCQkJCSAmYm1jMTUwX2FjY2VsX2J1ZmZlcl9vcHMpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCiAJCQkJIkZhaWxlZDogaWlvIHRyaWdnZXJlZCBidWZmZXIgc2V0dXBcbiIpOwogCQkJZ290byBlcnJfdHJpZ2dlcl91bnJlZ2lzdGVyOwogCQl9CisKKwkJaWYgKGkyY19jaGVja19mdW5jdGlvbmFsaXR5KGNsaWVudC0+YWRhcHRlciwgSTJDX0ZVTkNfSTJDKSB8fAorCQkgICAgaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCQkgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0spKSB7CisJCQlpbmRpb19kZXYtPm1vZGVzIHw9IElORElPX0JVRkZFUl9TT0ZUV0FSRTsKKwkJCWluZGlvX2Rldi0+aW5mbyA9ICZibWMxNTBfYWNjZWxfaW5mb19maWZvOworCQkJaW5kaW9fZGV2LT5idWZmZXItPmF0dHJzID0gYm1jMTUwX2FjY2VsX2ZpZm9fYXR0cmlidXRlczsKKwkJfQogCX0KIAogCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKQEAgLTEzMDgsMTMgKzE3MDksMTAgQEAKIGVycl9paW9fdW5yZWdpc3RlcjoKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIGVycl9idWZmZXJfY2xlYW51cDoKLQlpZiAoZGF0YS0+ZHJlYWR5X3RyaWcpCisJaWYgKGluZGlvX2Rldi0+cG9sbGZ1bmMpCiAJCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKIGVycl90cmlnZ2VyX3VucmVnaXN0ZXI6Ci0JaWYgKGRhdGEtPmRyZWFkeV90cmlnKQotCQlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKGRhdGEtPmRyZWFkeV90cmlnKTsKLQlpZiAoZGF0YS0+bW90aW9uX3RyaWcpCi0JCWlpb190cmlnZ2VyX3VucmVnaXN0ZXIoZGF0YS0+bW90aW9uX3RyaWcpOworCWJtYzE1MF9hY2NlbF91bnJlZ2lzdGVyX3RyaWdnZXJzKGRhdGEsIEJNQzE1MF9BQ0NFTF9UUklHR0VSUyAtIDEpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEzMzAsMTEgKzE3MjgsNyBAQAogCiAJaWlvX2RldmljZV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CiAKLQlpZiAoZGF0YS0+ZHJlYWR5X3RyaWcpIHsKLQkJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOwotCQlpaW9fdHJpZ2dlcl91bnJlZ2lzdGVyKGRhdGEtPmRyZWFkeV90cmlnKTsKLQkJaWlvX3RyaWdnZXJfdW5yZWdpc3RlcihkYXRhLT5tb3Rpb25fdHJpZyk7Ci0JfQorCWJtYzE1MF9hY2NlbF91bnJlZ2lzdGVyX3RyaWdnZXJzKGRhdGEsIEJNQzE1MF9BQ0NFTF9UUklHR0VSUyAtIDEpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOwogCWJtYzE1MF9hY2NlbF9zZXRfbW9kZShkYXRhLCBCTUMxNTBfQUNDRUxfU0xFRVBfTU9ERV9ERUVQX1NVU1BFTkQsIDApOwpAQCAtMTM2Miw5ICsxNzU2LDkgQEAKIAlzdHJ1Y3QgYm1jMTUwX2FjY2VsX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOwotCWlmIChkYXRhLT5kcmVhZHlfdHJpZ2dlcl9vbiB8fCBkYXRhLT5tb3Rpb25fdHJpZ2dlcl9vbiB8fAotCQkJCQkJCWRhdGEtPmV2X2VuYWJsZV9zdGF0ZSkKKwlpZiAoYXRvbWljX3JlYWQoJmRhdGEtPmFjdGl2ZV9pbnRyKSkKIAkJYm1jMTUwX2FjY2VsX3NldF9tb2RlKGRhdGEsIEJNQzE1MF9BQ0NFTF9TTEVFUF9NT0RFX05PUk1BTCwgMCk7CisJYm1jMTUwX2FjY2VsX2ZpZm9fc2V0X21vZGUoZGF0YSk7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTEzOTgsNiArMTc5Miw5IEBACiAJcmV0ID0gYm1jMTUwX2FjY2VsX3NldF9tb2RlKGRhdGEsIEJNQzE1MF9BQ0NFTF9TTEVFUF9NT0RFX05PUk1BTCwgMCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CisJcmV0ID0gYm1jMTUwX2FjY2VsX2ZpZm9fc2V0X21vZGUoZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlzbGVlcF92YWwgPSBibWMxNTBfYWNjZWxfZ2V0X3N0YXJ0dXBfdGltZXMoZGF0YSk7CiAJaWYgKHNsZWVwX3ZhbCA8IDIwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvaGlkLXNlbnNvci1hY2NlbC0zZC5jIGIvZHJpdmVycy9paW8vYWNjZWwvaGlkLXNlbnNvci1hY2NlbC0zZC5jCmluZGV4IGRmNmE1OTMuLjJiNGZhZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL2hpZC1zZW5zb3ItYWNjZWwtM2QuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9oaWQtc2Vuc29yLWFjY2VsLTNkLmMKQEAgLTEyMyw3ICsxMjMsOCBAQAogCQkJKnZhbCA9IHNlbnNvcl9odWJfaW5wdXRfYXR0cl9nZXRfcmF3X3ZhbHVlKAogCQkJCQlhY2NlbF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuaHNkZXYsCiAJCQkJCUhJRF9VU0FHRV9TRU5TT1JfQUNDRUxfM0QsIGFkZHJlc3MsCi0JCQkJCXJlcG9ydF9pZCk7CisJCQkJCXJlcG9ydF9pZCwKKwkJCQkJU0VOU09SX0hVQl9TWU5DKTsKIAkJZWxzZSB7CiAJCQkqdmFsID0gMDsKIAkJCWhpZF9zZW5zb3JfcG93ZXJfc3RhdGUoJmFjY2VsX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FjY2VsL2t4Y2prLTEwMTMuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL2t4Y2prLTEwMTMuYwppbmRleCA1NjdkZTI2Li41MWRhMzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hY2NlbC9reGNqay0xMDEzLmMKKysrIGIvZHJpdmVycy9paW8vYWNjZWwva3hjamstMTAxMy5jCkBAIC05NTYsNyArOTU2LDcgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKIAotCWZvcl9lYWNoX3NldF9iaXQoYml0LCBpbmRpb19kZXYtPmJ1ZmZlci0+c2Nhbl9tYXNrLAorCWZvcl9lYWNoX3NldF9iaXQoYml0LCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssCiAJCQkgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKSB7CiAJCXJldCA9IGt4Y2prMTAxM19nZXRfYWNjX3JlZyhkYXRhLCBiaXQpOwogCQlpZiAocmV0IDwgMCkgewpAQCAtMTE2OSwxNiArMTE2OSwxMiBAQAogCWRldiA9ICZjbGllbnQtPmRldjsKIAogCS8qIGRhdGEgcmVhZHkgZ3BpbyBpbnRlcnJ1cHQgcGluICovCi0JZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGRldiwgImt4Y2prMTAxM19pbnQiLCAwKTsKKwlncGlvID0gZGV2bV9ncGlvZF9nZXRfaW5kZXgoZGV2LCAia3hjamsxMDEzX2ludCIsIDAsIEdQSU9EX0lOKTsKIAlpZiAoSVNfRVJSKGdwaW8pKSB7CiAJCWRldl9lcnIoZGV2LCAiYWNwaSBncGlvIGdldCBpbmRleCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gUFRSX0VSUihncGlvKTsKIAl9CiAKLQlyZXQgPSBncGlvZF9kaXJlY3Rpb25faW5wdXQoZ3Bpbyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCXJldCA9IGdwaW9kX3RvX2lycShncGlvKTsKIAogCWRldl9kYmcoZGV2LCAiR1BJTyByZXNvdXJjZSwgbm86JWQgaXJxOiVkXG4iLCBkZXNjX3RvX2dwaW8oZ3BpbyksIHJldCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9tbWE5NTUxLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9tbWE5NTUxLmMKaW5kZXggNDZjMzgzNS4uN2RiN2NjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvbW1hOTU1MS5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL21tYTk1NTEuYwpAQCAtNDE4LDE3ICs0MTgsMTggQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+Y2xpZW50LT5kZXY7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTU1BOTU1MV9HUElPX0NPVU5UOyBpKyspIHsKLQkJZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGRldiwgTU1BOTU1MV9HUElPX05BTUUsIGkpOworCQlncGlvID0gZGV2bV9ncGlvZF9nZXRfaW5kZXgoZGV2LCBNTUE5NTUxX0dQSU9fTkFNRSwgaSwKKwkJCQkJICAgIEdQSU9EX0lOKTsKIAkJaWYgKElTX0VSUihncGlvKSkgewogCQkJZGV2X2VycihkZXYsICJhY3BpIGdwaW8gZ2V0IGluZGV4IGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gUFRSX0VSUihncGlvKTsKIAkJfQogCi0JCXJldCA9IGdwaW9kX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKLQkJaWYgKHJldCkKKwkJcmV0ID0gZ3Bpb2RfdG9faXJxKGdwaW8pOworCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJZGF0YS0+aXJxc1tpXSA9IGdwaW9kX3RvX2lycShncGlvKTsKKwkJZGF0YS0+aXJxc1tpXSA9IHJldDsKIAkJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIGRhdGEtPmlycXNbaV0sCiAJCQkJTlVMTCwgbW1hOTU1MV9ldmVudF9oYW5kbGVyLAogCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX09ORVNIT1QsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9tbWE5NTUzLmMgYi9kcml2ZXJzL2lpby9hY2NlbC9tbWE5NTUzLmMKaW5kZXggZDIzZWJmMS4uMmRmMWFmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvbW1hOTU1My5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL21tYTk1NTMuYwpAQCAtMTEwOSwxNiArMTEwOSwxMiBAQAogCWRldiA9ICZjbGllbnQtPmRldjsKIAogCS8qIGRhdGEgcmVhZHkgZ3BpbyBpbnRlcnJ1cHQgcGluICovCi0JZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGRldiwgTU1BOTU1M19HUElPX05BTUUsIDApOworCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsIE1NQTk1NTNfR1BJT19OQU1FLCAwLCBHUElPRF9JTik7CiAJaWYgKElTX0VSUihncGlvKSkgewogCQlkZXZfZXJyKGRldiwgImFjcGkgZ3BpbyBnZXQgaW5kZXggZmFpbGVkXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIoZ3Bpbyk7CiAJfQogCi0JcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX2lucHV0KGdwaW8pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlyZXQgPSBncGlvZF90b19pcnEoZ3Bpbyk7CiAKIAlkZXZfZGJnKGRldiwgImdwaW8gcmVzb3VyY2UsIG5vOiVkIGlycTolZFxuIiwgZGVzY190b19ncGlvKGdwaW8pLCByZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvc3RfYWNjZWwuaCBiL2RyaXZlcnMvaWlvL2FjY2VsL3N0X2FjY2VsLmgKaW5kZXggZmE5NjQ2MC4uN2VlOTcyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWNjZWwvc3RfYWNjZWwuaAorKysgYi9kcml2ZXJzL2lpby9hY2NlbC9zdF9hY2NlbC5oCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9paW8vY29tbW9uL3N0X3NlbnNvcnMuaD4KIAorI2RlZmluZSBMSVMzTFYwMkRMX0FDQ0VMX0RFVl9OQU1FCSJsaXMzbHYwMmRsX2FjY2VsIgogI2RlZmluZSBMU00zMDNETEhDX0FDQ0VMX0RFVl9OQU1FCSJsc20zMDNkbGhjX2FjY2VsIgogI2RlZmluZSBMSVMzREhfQUNDRUxfREVWX05BTUUJCSJsaXMzZGgiCiAjZGVmaW5lIExTTTMzMERfQUNDRUxfREVWX05BTUUJCSJsc20zMzBkX2FjY2VsIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWNjZWwvc3RfYWNjZWxfY29yZS5jIGIvZHJpdmVycy9paW8vYWNjZWwvc3RfYWNjZWxfY29yZS5jCmluZGV4IDUzZjMyNjIuLjU4ZDFkMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL3N0X2FjY2VsX2NvcmUuYworKysgYi9kcml2ZXJzL2lpby9hY2NlbC9zdF9hY2NlbF9jb3JlLmMKQEAgLTEyOSw2ICsxMjksMzAgQEAKICNkZWZpbmUgU1RfQUNDRUxfM19JRzFfRU5fTUFTSwkJCTB4MDgKICNkZWZpbmUgU1RfQUNDRUxfM19NVUxUSVJFQURfQklUCQlmYWxzZQogCisvKiBDVVNUT00gVkFMVUVTIEZPUiBTRU5TT1IgNCAqLworI2RlZmluZSBTVF9BQ0NFTF80X1dBSV9FWFAJCQkweDNhCisjZGVmaW5lIFNUX0FDQ0VMXzRfT0RSX0FERFIJCQkweDIwCisjZGVmaW5lIFNUX0FDQ0VMXzRfT0RSX01BU0sJCQkweDMwIC8qIERGMSBhbmQgREYwICovCisjZGVmaW5lIFNUX0FDQ0VMXzRfT0RSX0FWTF80MEhaX1ZBTAkJMHgwMAorI2RlZmluZSBTVF9BQ0NFTF80X09EUl9BVkxfMTYwSFpfVkFMCQkweDAxCisjZGVmaW5lIFNUX0FDQ0VMXzRfT0RSX0FWTF82NDBIWl9WQUwJCTB4MDIKKyNkZWZpbmUgU1RfQUNDRUxfNF9PRFJfQVZMXzI1NjBIWl9WQUwJCTB4MDMKKyNkZWZpbmUgU1RfQUNDRUxfNF9QV19BRERSCQkJMHgyMAorI2RlZmluZSBTVF9BQ0NFTF80X1BXX01BU0sJCQkweGMwCisjZGVmaW5lIFNUX0FDQ0VMXzRfRlNfQUREUgkJCTB4MjEKKyNkZWZpbmUgU1RfQUNDRUxfNF9GU19NQVNLCQkJMHg4MAorI2RlZmluZSBTVF9BQ0NFTF80X0ZTX0FWTF8yX1ZBTAkJCTBYMDAKKyNkZWZpbmUgU1RfQUNDRUxfNF9GU19BVkxfNl9WQUwJCQkwWDAxCisjZGVmaW5lIFNUX0FDQ0VMXzRfRlNfQVZMXzJfR0FJTgkJSUlPX0dfVE9fTV9TXzIoMTAyNCkKKyNkZWZpbmUgU1RfQUNDRUxfNF9GU19BVkxfNl9HQUlOCQlJSU9fR19UT19NX1NfMigzNDApCisjZGVmaW5lIFNUX0FDQ0VMXzRfQkRVX0FERFIJCQkweDIxCisjZGVmaW5lIFNUX0FDQ0VMXzRfQkRVX01BU0sJCQkweDQwCisjZGVmaW5lIFNUX0FDQ0VMXzRfRFJEWV9JUlFfQUREUgkJMHgyMQorI2RlZmluZSBTVF9BQ0NFTF80X0RSRFlfSVJRX0lOVDFfTUFTSwkJMHgwNAorI2RlZmluZSBTVF9BQ0NFTF80X0lHMV9FTl9BRERSCQkJMHgyMQorI2RlZmluZSBTVF9BQ0NFTF80X0lHMV9FTl9NQVNLCQkJMHgwOAorI2RlZmluZSBTVF9BQ0NFTF80X01VTFRJUkVBRF9CSVQJCXRydWUKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIHN0X2FjY2VsXzEyYml0X2NoYW5uZWxzW10gPSB7CiAJU1RfU0VOU09SU19MU01fQ0hBTk5FTFMoSUlPX0FDQ0VMLAogCQkJQklUKElJT19DSEFOX0lORk9fUkFXKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwKQEAgLTM3Myw2ICszOTcsNjMgQEAKIAkJLm11bHRpX3JlYWRfYml0ID0gU1RfQUNDRUxfM19NVUxUSVJFQURfQklULAogCQkuYm9vdGltZSA9IDIsCiAJfSwKKwl7CisJCS53YWkgPSBTVF9BQ0NFTF80X1dBSV9FWFAsCisJCS5zZW5zb3JzX3N1cHBvcnRlZCA9IHsKKwkJCVswXSA9IExJUzNMVjAyRExfQUNDRUxfREVWX05BTUUsCisJCX0sCisJCS5jaCA9IChzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqKXN0X2FjY2VsXzEyYml0X2NoYW5uZWxzLAorCQkub2RyID0geworCQkJLmFkZHIgPSBTVF9BQ0NFTF80X09EUl9BRERSLAorCQkJLm1hc2sgPSBTVF9BQ0NFTF80X09EUl9NQVNLLAorCQkJLm9kcl9hdmwgPSB7CisJCQkJeyA0MCwgU1RfQUNDRUxfNF9PRFJfQVZMXzQwSFpfVkFMIH0sCisJCQkJeyAxNjAsIFNUX0FDQ0VMXzRfT0RSX0FWTF8xNjBIWl9WQUwsIH0sCisJCQkJeyA2NDAsIFNUX0FDQ0VMXzRfT0RSX0FWTF82NDBIWl9WQUwsIH0sCisJCQkJeyAyNTYwLCBTVF9BQ0NFTF80X09EUl9BVkxfMjU2MEhaX1ZBTCwgfSwKKwkJCX0sCisJCX0sCisJCS5wdyA9IHsKKwkJCS5hZGRyID0gU1RfQUNDRUxfNF9QV19BRERSLAorCQkJLm1hc2sgPSBTVF9BQ0NFTF80X1BXX01BU0ssCisJCQkudmFsdWVfb24gPSBTVF9TRU5TT1JTX0RFRkFVTFRfUE9XRVJfT05fVkFMVUUsCisJCQkudmFsdWVfb2ZmID0gU1RfU0VOU09SU19ERUZBVUxUX1BPV0VSX09GRl9WQUxVRSwKKwkJfSwKKwkJLmVuYWJsZV9heGlzID0geworCQkJLmFkZHIgPSBTVF9TRU5TT1JTX0RFRkFVTFRfQVhJU19BRERSLAorCQkJLm1hc2sgPSBTVF9TRU5TT1JTX0RFRkFVTFRfQVhJU19NQVNLLAorCQl9LAorCQkuZnMgPSB7CisJCQkuYWRkciA9IFNUX0FDQ0VMXzRfRlNfQUREUiwKKwkJCS5tYXNrID0gU1RfQUNDRUxfNF9GU19NQVNLLAorCQkJLmZzX2F2bCA9IHsKKwkJCQlbMF0gPSB7CisJCQkJCS5udW0gPSBTVF9BQ0NFTF9GU19BVkxfMkcsCisJCQkJCS52YWx1ZSA9IFNUX0FDQ0VMXzRfRlNfQVZMXzJfVkFMLAorCQkJCQkuZ2FpbiA9IFNUX0FDQ0VMXzRfRlNfQVZMXzJfR0FJTiwKKwkJCQl9LAorCQkJCVsxXSA9IHsKKwkJCQkJLm51bSA9IFNUX0FDQ0VMX0ZTX0FWTF82RywKKwkJCQkJLnZhbHVlID0gU1RfQUNDRUxfNF9GU19BVkxfNl9WQUwsCisJCQkJCS5nYWluID0gU1RfQUNDRUxfNF9GU19BVkxfNl9HQUlOLAorCQkJCX0sCisJCQl9LAorCQl9LAorCQkuYmR1ID0geworCQkJLmFkZHIgPSBTVF9BQ0NFTF80X0JEVV9BRERSLAorCQkJLm1hc2sgPSBTVF9BQ0NFTF80X0JEVV9NQVNLLAorCQl9LAorCQkuZHJkeV9pcnEgPSB7CisJCQkuYWRkciA9IFNUX0FDQ0VMXzRfRFJEWV9JUlFfQUREUiwKKwkJCS5tYXNrX2ludDEgPSBTVF9BQ0NFTF80X0RSRFlfSVJRX0lOVDFfTUFTSywKKwkJCS5pZzEgPSB7CisJCQkJLmVuX2FkZHIgPSBTVF9BQ0NFTF80X0lHMV9FTl9BRERSLAorCQkJCS5lbl9tYXNrID0gU1RfQUNDRUxfNF9JRzFfRU5fTUFTSywKKwkJCX0sCisJCX0sCisJCS5tdWx0aV9yZWFkX2JpdCA9IFNUX0FDQ0VMXzRfTVVMVElSRUFEX0JJVCwKKwkJLmJvb3RpbWUgPSAyLCAvKiBndWVzcyAqLworCX0sCiB9OwogCiBzdGF0aWMgaW50IHN0X2FjY2VsX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hY2NlbC9zdF9hY2NlbF9pMmMuYyBiL2RyaXZlcnMvaWlvL2FjY2VsL3N0X2FjY2VsX2kyYy5jCmluZGV4IGM3MjQ2YmQuLjZiNzIwYzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FjY2VsL3N0X2FjY2VsX2kyYy5jCisrKyBiL2RyaXZlcnMvaWlvL2FjY2VsL3N0X2FjY2VsX2kyYy5jCkBAIC0yMSw2ICsyMSwxMCBAQAogI2lmZGVmIENPTkZJR19PRgogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3RfYWNjZWxfb2ZfbWF0Y2hbXSA9IHsKIAl7CisJCS5jb21wYXRpYmxlID0gInN0LGxpczNsdjAyZGwtYWNjZWwiLAorCQkuZGF0YSA9IExJUzNMVjAyRExfQUNDRUxfREVWX05BTUUsCisJfSwKKwl7CiAJCS5jb21wYXRpYmxlID0gInN0LGxzbTMwM2RsaC1hY2NlbCIsCiAJCS5kYXRhID0gTFNNMzAzRExIX0FDQ0VMX0RFVl9OQU1FLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCmluZGV4IDIwMmRhZjguLmUzNmE3M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9LY29uZmlnCkBAIC0xMzUsOSArMTM1LDE5IEBACiAJICBkZXZpY2UuIERlcGVuZGluZyBvbiBwbGF0Zm9ybSBjb25maWd1cmF0aW9uLCB0aGlzIGdlbmVyYWwgcHVycG9zZSBBREMgY2FuCiAJICBiZSB1c2VkIGZvciBzYW1wbGluZyBzZW5zb3JzIHN1Y2ggYXMgdGhlcm1hbCByZXNpc3RvcnMuCiAKK2NvbmZpZyBEQTkxNTBfR1BBREMKKwl0cmlzdGF0ZSAiRGlhbG9nIERBOTE1MCBHUEFEQyBkcml2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1GRF9EQTkxNTAKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgRGlhbG9nIERBOTE1MCBHUEFEQy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIGNob3NlbiwgdGhlIG1vZHVsZSBuYW1lCisJICB3aWxsIGJlIGRhOTE1MC1ncGFkYy4KKwogY29uZmlnIENDMTAwMDFfQURDCiAJdHJpc3RhdGUgIkNvc21pYyBDaXJjdWl0cyAxMDAwMSBBREMgZHJpdmVyIgotCWRlcGVuZHMgb24gSEFTX0lPTUVNIHx8IEhBVkVfQ0xLIHx8IFJFR1VMQVRPUgorCWRlcGVuZHMgb24gSEFWRV9DTEsgfHwgUkVHVUxBVE9SCisJZGVwZW5kcyBvbiBIQVNfSU9NRU0KIAlzZWxlY3QgSUlPX0JVRkZFUgogCXNlbGVjdCBJSU9fVFJJR0dFUkVEX0JVRkZFUgogCWhlbHAKQEAgLTE4NiwxMCArMTk2LDExIEBACiAJICBkYXRhIHZpYSB0aGUgaWlvIGRldiBpbnRlcmZhY2UuCiAKIGNvbmZpZyBNQ1AzMjBYCi0JdHJpc3RhdGUgIk1pY3JvY2hpcCBUZWNobm9sb2d5IE1DUDMyMDQvMDgiCisJdHJpc3RhdGUgIk1pY3JvY2hpcCBUZWNobm9sb2d5IE1DUDN4MDEvMDIvMDQvMDgiCiAJZGVwZW5kcyBvbiBTUEkKIAloZWxwCi0JICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgTWljcm9jaGlwIFRlY2hub2xvZ3kncyBNQ1AzMjA0IG9yCisJICBTYXkgeWVzIGhlcmUgdG8gYnVpbGQgc3VwcG9ydCBmb3IgTWljcm9jaGlwIFRlY2hub2xvZ3kncworCSAgTUNQMzAwMSwgTUNQMzAwMiwgTUNQMzAwNCwgTUNQMzAwOCwgTUNQMzIwMSwgTUNQMzIwMiwgTUNQMzIwNCBvcgogCSAgTUNQMzIwOCBhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJ0ZXIuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUgYi9kcml2ZXJzL2lpby9hZGMvTWFrZWZpbGUKaW5kZXggMDMxNWFmNi4uMzkzMGU2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9NYWtlZmlsZQpAQCAtMTUsNiArMTUsNyBAQAogb2JqLSQoQ09ORklHX0FENzk5WCkgKz0gYWQ3OTl4Lm8KIG9iai0kKENPTkZJR19BVDkxX0FEQykgKz0gYXQ5MV9hZGMubwogb2JqLSQoQ09ORklHX0FYUDI4OF9BREMpICs9IGF4cDI4OF9hZGMubworb2JqLSQoQ09ORklHX0RBOTE1MF9HUEFEQykgKz0gZGE5MTUwLWdwYWRjLm8KIG9iai0kKENPTkZJR19DQzEwMDAxX0FEQykgKz0gY2MxMDAwMV9hZGMubwogb2JqLSQoQ09ORklHX0VYWU5PU19BREMpICs9IGV4eW5vc19hZGMubwogb2JqLSQoQ09ORklHX0xQODc4OF9BREMpICs9IGxwODc4OF9hZGMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL2FkNzc5My5jIGIvZHJpdmVycy9paW8vYWRjL2FkNzc5My5jCmluZGV4IDRkZGRlYWIuLmI4NDkyMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9hZDc3OTMuYworKysgYi9kcml2ZXJzL2lpby9hZGMvYWQ3NzkzLmMKQEAgLTg2MSw1ICs4NjEsNSBAQAogbW9kdWxlX3NwaV9kcml2ZXIoYWQ3NzkzX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIk1pY2hhZWwgSGVubmVyaWNoIDxoZW5uZXJpY2hAYmxhY2tmaW4udWNsaW51eC5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENzc5MyBhbmQgc2ltaWFsciBBRENzIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZyBEZXZpY2VzIEFENzc5MyBhbmQgc2ltaWxhciBBRENzIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9hZGMvYXQ5MV9hZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy9hdDkxX2FkYy5jCmluZGV4IGZmNjFhZTUuLjhhMGViNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy9hdDkxX2FkYy5jCisrKyBiL2RyaXZlcnMvaWlvL2FkYy9hdDkxX2FkYy5jCkBAIC01NDQsNyArNTQ0LDYgQEAKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaWRldiA9IGlpb190cmlnZ2VyX2dldF9kcnZkYXRhKHRyaWcpOwogCXN0cnVjdCBhdDkxX2FkY19zdGF0ZSAqc3QgPSBpaW9fcHJpdihpZGV2KTsKLQlzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyID0gaWRldi0+YnVmZmVyOwogCXN0cnVjdCBhdDkxX2FkY19yZWdfZGVzYyAqcmVnID0gc3QtPnJlZ2lzdGVyczsKIAl1MzIgc3RhdHVzID0gYXQ5MV9hZGNfcmVhZGwoc3QsIHJlZy0+dHJpZ2dlcl9yZWdpc3Rlcik7CiAJaW50IHZhbHVlOwpAQCAtNTY0LDcgKzU2Myw3IEBACiAJCWF0OTFfYWRjX3dyaXRlbChzdCwgcmVnLT50cmlnZ2VyX3JlZ2lzdGVyLAogCQkJCXN0YXR1cyB8IHZhbHVlKTsKIAotCQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgYnVmZmVyLT5zY2FuX21hc2ssCisJCWZvcl9lYWNoX3NldF9iaXQoYml0LCBpZGV2LT5hY3RpdmVfc2Nhbl9tYXNrLAogCQkJCSBzdC0+bnVtX2NoYW5uZWxzKSB7CiAJCQlzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiA9IGlkZXYtPmNoYW5uZWxzICsgYml0OwogCQkJYXQ5MV9hZGNfd3JpdGVsKHN0LCBBVDkxX0FEQ19DSEVSLApAQCAtNTc5LDcgKzU3OCw3IEBACiAJCWF0OTFfYWRjX3dyaXRlbChzdCwgcmVnLT50cmlnZ2VyX3JlZ2lzdGVyLAogCQkJCXN0YXR1cyAmIH52YWx1ZSk7CiAKLQkJZm9yX2VhY2hfc2V0X2JpdChiaXQsIGJ1ZmZlci0+c2Nhbl9tYXNrLAorCQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgaWRldi0+YWN0aXZlX3NjYW5fbWFzaywKIAkJCQkgc3QtPm51bV9jaGFubmVscykgewogCQkJc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4gPSBpZGV2LT5jaGFubmVscyArIGJpdDsKIAkJCWF0OTFfYWRjX3dyaXRlbChzdCwgQVQ5MV9BRENfQ0hEUiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy9kYTkxNTAtZ3BhZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy9kYTkxNTAtZ3BhZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDQ1MTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vYWRjL2RhOTE1MC1ncGFkYy5jCkBAIC0wLDAgKzEsNDA3IEBACisvKgorICogREE5MTUwIEdQQURDIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBEaWFsb2cgU2VtaWNvbmR1Y3RvcgorICoKKyAqIEF1dGhvcjogQWRhbSBUaG9tc29uIDxBZGFtLlRob21zb24uT3BlbnNvdXJjZUBkaWFzZW1pLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2RyaXZlci5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkxNTAvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkxNTAvcmVnaXN0ZXJzLmg+CisKKy8qIENoYW5uZWxzICovCitlbnVtIGRhOTE1MF9ncGFkY19od19jaGFubmVsIHsKKwlEQTkxNTBfR1BBRENfSFdfQ0hBTl9HUElPQV8yViA9IDAsCisJREE5MTUwX0dQQURDX0hXX0NIQU5fR1BJT0FfMlZfLAorCURBOTE1MF9HUEFEQ19IV19DSEFOX0dQSU9CXzJWLAorCURBOTE1MF9HUEFEQ19IV19DSEFOX0dQSU9CXzJWXywKKwlEQTkxNTBfR1BBRENfSFdfQ0hBTl9HUElPQ18yViwKKwlEQTkxNTBfR1BBRENfSFdfQ0hBTl9HUElPQ18yVl8sCisJREE5MTUwX0dQQURDX0hXX0NIQU5fR1BJT0RfMlYsCisJREE5MTUwX0dQQURDX0hXX0NIQU5fR1BJT0RfMlZfLAorCURBOTE1MF9HUEFEQ19IV19DSEFOX0lCVVNfU0VOU0UsCisJREE5MTUwX0dQQURDX0hXX0NIQU5fSUJVU19TRU5TRV8sCisJREE5MTUwX0dQQURDX0hXX0NIQU5fVkJVU19ESVYsCisJREE5MTUwX0dQQURDX0hXX0NIQU5fVkJVU19ESVZfLAorCURBOTE1MF9HUEFEQ19IV19DSEFOX0lELAorCURBOTE1MF9HUEFEQ19IV19DSEFOX0lEXywKKwlEQTkxNTBfR1BBRENfSFdfQ0hBTl9WU1lTLAorCURBOTE1MF9HUEFEQ19IV19DSEFOX1ZTWVNfLAorCURBOTE1MF9HUEFEQ19IV19DSEFOX0dQSU9BXzZWLAorCURBOTE1MF9HUEFEQ19IV19DSEFOX0dQSU9BXzZWXywKKwlEQTkxNTBfR1BBRENfSFdfQ0hBTl9HUElPQl82ViwKKwlEQTkxNTBfR1BBRENfSFdfQ0hBTl9HUElPQl82Vl8sCisJREE5MTUwX0dQQURDX0hXX0NIQU5fR1BJT0NfNlYsCisJREE5MTUwX0dQQURDX0hXX0NIQU5fR1BJT0NfNlZfLAorCURBOTE1MF9HUEFEQ19IV19DSEFOX0dQSU9EXzZWLAorCURBOTE1MF9HUEFEQ19IV19DSEFOX0dQSU9EXzZWXywKKwlEQTkxNTBfR1BBRENfSFdfQ0hBTl9WQkFULAorCURBOTE1MF9HUEFEQ19IV19DSEFOX1ZCQVRfLAorCURBOTE1MF9HUEFEQ19IV19DSEFOX1RCQVQsCisJREE5MTUwX0dQQURDX0hXX0NIQU5fVEJBVF8sCisJREE5MTUwX0dQQURDX0hXX0NIQU5fVEpVTkNfQ09SRSwKKwlEQTkxNTBfR1BBRENfSFdfQ0hBTl9USlVOQ19DT1JFXywKKwlEQTkxNTBfR1BBRENfSFdfQ0hBTl9USlVOQ19PVlAsCisJREE5MTUwX0dQQURDX0hXX0NIQU5fVEpVTkNfT1ZQXywKK307CisKK2VudW0gZGE5MTUwX2dwYWRjX2NoYW5uZWwgeworCURBOTE1MF9HUEFEQ19DSEFOX0dQSU9BID0gMCwKKwlEQTkxNTBfR1BBRENfQ0hBTl9HUElPQiwKKwlEQTkxNTBfR1BBRENfQ0hBTl9HUElPQywKKwlEQTkxNTBfR1BBRENfQ0hBTl9HUElPRCwKKwlEQTkxNTBfR1BBRENfQ0hBTl9JQlVTLAorCURBOTE1MF9HUEFEQ19DSEFOX1ZCVVMsCisJREE5MTUwX0dQQURDX0NIQU5fVlNZUywKKwlEQTkxNTBfR1BBRENfQ0hBTl9WQkFULAorCURBOTE1MF9HUEFEQ19DSEFOX1RCQVQsCisJREE5MTUwX0dQQURDX0NIQU5fVEpVTkNfQ09SRSwKKwlEQTkxNTBfR1BBRENfQ0hBTl9USlVOQ19PVlAsCit9OworCisvKiBQcml2YXRlIGRhdGEgKi8KK3N0cnVjdCBkYTkxNTBfZ3BhZGMgeworCXN0cnVjdCBkYTkxNTAgKmRhOTE1MDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0ZTsKK307CisKKworc3RhdGljIGlycXJldHVybl90IGRhOTE1MF9ncGFkY19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKworCXN0cnVjdCBkYTkxNTBfZ3BhZGMgKmdwYWRjID0gZGF0YTsKKworCWNvbXBsZXRlKCZncGFkYy0+Y29tcGxldGUpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGRhOTE1MF9ncGFkY19yZWFkX2FkYyhzdHJ1Y3QgZGE5MTUwX2dwYWRjICpncGFkYywgaW50IGh3X2NoYW4pCit7CisJdTggcmVzdWx0X3JlZ3NbMl07CisJaW50IHJlc3VsdDsKKworCW11dGV4X2xvY2soJmdwYWRjLT5sb2NrKTsKKworCS8qIFNldCBjaGFubmVsICYgZW5hYmxlIG1lYXN1cmVtZW50ICovCisJZGE5MTUwX3JlZ193cml0ZShncGFkYy0+ZGE5MTUwLCBEQTkxNTBfR1BBRENfTUFOLAorCQkJIChEQTkxNTBfR1BBRENfRU5fTUFTSyB8CisJCQkgIGh3X2NoYW4gPDwgREE5MTUwX0dQQURDX01VWF9TSElGVCkpOworCisJLyogQ29uc3VtZSBsZWZ0LW92ZXIgY29tcGxldGlvbiBmcm9tIGEgcHJldmlvdXMgdGltZW91dCAqLworCXRyeV93YWl0X2Zvcl9jb21wbGV0aW9uKCZncGFkYy0+Y29tcGxldGUpOworCisJLyogQ2hlY2sgZm9yIGFjdHVhbCBjb21wbGV0aW9uICovCisJd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZncGFkYy0+Y29tcGxldGUsIG1zZWNzX3RvX2ppZmZpZXMoNSkpOworCisJLyogUmVhZCByZXN1bHQgYW5kIHN0YXR1cyBmcm9tIGRldmljZSAqLworCWRhOTE1MF9idWxrX3JlYWQoZ3BhZGMtPmRhOTE1MCwgREE5MTUwX0dQQURDX1JFU19BLCAyLCByZXN1bHRfcmVncyk7CisKKwltdXRleF91bmxvY2soJmdwYWRjLT5sb2NrKTsKKworCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSBkZXZpY2UgcmVhbGx5IGhhcyBjb21wbGV0ZWQgcmVhZGluZyAqLworCWlmIChyZXN1bHRfcmVnc1sxXSAmIERBOTE1MF9HUEFEQ19SVU5fTUFTSykgeworCQlkZXZfZXJyKGdwYWRjLT5kZXYsICJUaW1lb3V0IG9uIGNoYW5uZWwgJWQgb2YgR1BBRENcbiIsCisJCQlod19jaGFuKTsKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJfQorCisJLyogTFNCcyAtIDIgYml0cyAqLworCXJlc3VsdCA9IChyZXN1bHRfcmVnc1sxXSAmIERBOTE1MF9HUEFEQ19SRVNfTF9NQVNLKSA+PgorCQkgREE5MTUwX0dQQURDX1JFU19MX1NISUZUOworCS8qIE1TQnMgLSA4IGJpdHMgKi8KKwlyZXN1bHQgfD0gcmVzdWx0X3JlZ3NbMF0gPDwgREE5MTUwX0dQQURDX1JFU19MX0JJVFM7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIGludCBkYTkxNTBfZ3BhZGNfZ3Bpb182dl92b2x0YWdlX25vdyhpbnQgcmF3X3ZhbCkKK3sKKwkvKiBDb252ZXJ0IHRvIG1WICovCisJcmV0dXJuICg2ICogKChyYXdfdmFsICogMTAwMCkgKyA1MDApKSAvIDEwMjQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRhOTE1MF9ncGFkY19pYnVzX2N1cnJlbnRfYXZnKGludCByYXdfdmFsKQoreworCS8qIENvbnZlcnQgdG8gbUEgKi8KKwlyZXR1cm4gKDQgKiAoKHJhd192YWwgKiAxMDAwKSArIDUwMCkpIC8gMjA0ODsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGE5MTUwX2dwYWRjX3ZidXNfMjF2X3ZvbHRhZ2Vfbm93KGludCByYXdfdmFsKQoreworCS8qIENvbnZlcnQgdG8gbVYgKi8KKwlyZXR1cm4gKDIxICogKChyYXdfdmFsICogMTAwMCkgKyA1MDApKSAvIDEwMjQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRhOTE1MF9ncGFkY192c3lzXzZ2X3ZvbHRhZ2Vfbm93KGludCByYXdfdmFsKQoreworCS8qIENvbnZlcnQgdG8gbVYgKi8KKwlyZXR1cm4gKDMgKiAoKHJhd192YWwgKiAxMDAwKSArIDUwMCkpIC8gNTEyOworfQorCitzdGF0aWMgaW50IGRhOTE1MF9ncGFkY19yZWFkX3Byb2Nlc3NlZChzdHJ1Y3QgZGE5MTUwX2dwYWRjICpncGFkYywgaW50IGNoYW5uZWwsCisJCQkJICAgICAgIGludCBod19jaGFuLCBpbnQgKnZhbCkKK3sKKwlpbnQgcmF3X3ZhbDsKKworCXJhd192YWwgPSBkYTkxNTBfZ3BhZGNfcmVhZF9hZGMoZ3BhZGMsIGh3X2NoYW4pOworCWlmIChyYXdfdmFsIDwgMCkKKwkJcmV0dXJuIHJhd192YWw7CisKKwlzd2l0Y2ggKGNoYW5uZWwpIHsKKwljYXNlIERBOTE1MF9HUEFEQ19DSEFOX0dQSU9BOgorCWNhc2UgREE5MTUwX0dQQURDX0NIQU5fR1BJT0I6CisJY2FzZSBEQTkxNTBfR1BBRENfQ0hBTl9HUElPQzoKKwljYXNlIERBOTE1MF9HUEFEQ19DSEFOX0dQSU9EOgorCQkqdmFsID0gZGE5MTUwX2dwYWRjX2dwaW9fNnZfdm9sdGFnZV9ub3cocmF3X3ZhbCk7CisJCWJyZWFrOworCWNhc2UgREE5MTUwX0dQQURDX0NIQU5fSUJVUzoKKwkJKnZhbCA9IGRhOTE1MF9ncGFkY19pYnVzX2N1cnJlbnRfYXZnKHJhd192YWwpOworCQlicmVhazsKKwljYXNlIERBOTE1MF9HUEFEQ19DSEFOX1ZCVVM6CisJCSp2YWwgPSBkYTkxNTBfZ3BhZGNfdmJ1c18yMXZfdm9sdGFnZV9ub3cocmF3X3ZhbCk7CisJCWJyZWFrOworCWNhc2UgREE5MTUwX0dQQURDX0NIQU5fVlNZUzoKKwkJKnZhbCA9IGRhOTE1MF9ncGFkY192c3lzXzZ2X3ZvbHRhZ2Vfbm93KHJhd192YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBObyBwcm9jZXNzaW5nIGZvciBvdGhlciBjaGFubmVscyBzbyByZXR1cm4gcmF3IHZhbHVlICovCisJCSp2YWwgPSByYXdfdmFsOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gSUlPX1ZBTF9JTlQ7Cit9CisKK3N0YXRpYyBpbnQgZGE5MTUwX2dwYWRjX3JlYWRfc2NhbGUoaW50IGNoYW5uZWwsIGludCAqdmFsLCBpbnQgKnZhbDIpCit7CisJc3dpdGNoIChjaGFubmVsKSB7CisJY2FzZSBEQTkxNTBfR1BBRENfQ0hBTl9WQkFUOgorCQkqdmFsID0gMjkzMjsKKwkJKnZhbDIgPSAxMDAwOworCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMOworCWNhc2UgREE5MTUwX0dQQURDX0NIQU5fVEpVTkNfQ09SRToKKwljYXNlIERBOTE1MF9HUEFEQ19DSEFOX1RKVU5DX09WUDoKKwkJKnZhbCA9IDEwMDAwMDA7CisJCSp2YWwyID0gNDQyMDsKKwkJcmV0dXJuIElJT19WQUxfRlJBQ1RJT05BTDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGE5MTUwX2dwYWRjX3JlYWRfb2Zmc2V0KGludCBjaGFubmVsLCBpbnQgKnZhbCkKK3sKKwlzd2l0Y2ggKGNoYW5uZWwpIHsKKwljYXNlIERBOTE1MF9HUEFEQ19DSEFOX1ZCQVQ6CisJCSp2YWwgPSAxNTAwMDAwIC8gMjkzMjsKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgREE5MTUwX0dQQURDX0NIQU5fVEpVTkNfQ09SRToKKwljYXNlIERBOTE1MF9HUEFEQ19DSEFOX1RKVU5DX09WUDoKKwkJKnZhbCA9IC0xNDQ7CisJCXJldHVybiBJSU9fVkFMX0lOVDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGE5MTUwX2dwYWRjX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJCSBpbnQgKnZhbCwgaW50ICp2YWwyLCBsb25nIG1hc2spCit7CisJc3RydWN0IGRhOTE1MF9ncGFkYyAqZ3BhZGMgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJaWYgKChjaGFuLT5jaGFubmVsIDwgREE5MTUwX0dQQURDX0NIQU5fR1BJT0EpIHx8CisJICAgIChjaGFuLT5jaGFubmVsID4gREE5MTUwX0dQQURDX0NIQU5fVEpVTkNfT1ZQKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUkFXOgorCWNhc2UgSUlPX0NIQU5fSU5GT19QUk9DRVNTRUQ6CisJCXJldHVybiBkYTkxNTBfZ3BhZGNfcmVhZF9wcm9jZXNzZWQoZ3BhZGMsIGNoYW4tPmNoYW5uZWwsCisJCQkJCQkgICBjaGFuLT5hZGRyZXNzLCB2YWwpOworCWNhc2UgSUlPX0NIQU5fSU5GT19TQ0FMRToKKwkJcmV0dXJuIGRhOTE1MF9ncGFkY19yZWFkX3NjYWxlKGNoYW4tPmNoYW5uZWwsIHZhbCwgdmFsMik7CisJY2FzZSBJSU9fQ0hBTl9JTkZPX09GRlNFVDoKKwkJcmV0dXJuIGRhOTE1MF9ncGFkY19yZWFkX29mZnNldChjaGFuLT5jaGFubmVsLCB2YWwpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBkYTkxNTBfZ3BhZGNfaW5mbyA9IHsKKwkucmVhZF9yYXcgPSAmZGE5MTUwX2dwYWRjX3JlYWRfcmF3LAorCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCit9OworCisjZGVmaW5lIERBOTE1MF9HUEFEQ19DSEFOTkVMKF9pZCwgX2h3X2lkLCBfdHlwZSwgY2hhbl9pbmZvLAlcCisJCQkgICAgIF9leHRfbmFtZSkgewkJCVwKKwkudHlwZSA9IF90eXBlLAkJCQkJCVwKKwkuaW5kZXhlZCA9IDEsCQkJCQkJXAorCS5jaGFubmVsID0gREE5MTUwX0dQQURDX0NIQU5fIyNfaWQsCQkJXAorCS5hZGRyZXNzID0gREE5MTUwX0dQQURDX0hXX0NIQU5fIyNfaHdfaWQsCQlcCisJLmluZm9fbWFza19zZXBhcmF0ZSA9IGNoYW5faW5mbywJCQlcCisJLmV4dGVuZF9uYW1lID0gX2V4dF9uYW1lLAkJCQlcCisJLmRhdGFzaGVldF9uYW1lID0gI19pZCwJCQkJCVwKK30KKworI2RlZmluZSBEQTkxNTBfR1BBRENfQ0hBTk5FTF9SQVcoX2lkLCBfaHdfaWQsIF90eXBlLCBfZXh0X25hbWUpCVwKKwlEQTkxNTBfR1BBRENfQ0hBTk5FTChfaWQsIF9od19pZCwgX3R5cGUsCQlcCisJCQkgICAgIEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksIF9leHRfbmFtZSkKKworI2RlZmluZSBEQTkxNTBfR1BBRENfQ0hBTk5FTF9TQ0FMRUQoX2lkLCBfaHdfaWQsIF90eXBlLCBfZXh0X25hbWUpCVwKKwlEQTkxNTBfR1BBRENfQ0hBTk5FTChfaWQsIF9od19pZCwgX3R5cGUsCQkJXAorCQkJICAgICBCSVQoSUlPX0NIQU5fSU5GT19SQVcpIHwJCQlcCisJCQkgICAgIEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSB8CQkJXAorCQkJICAgICBCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpLAkJCVwKKwkJCSAgICAgX2V4dF9uYW1lKQorCisjZGVmaW5lIERBOTE1MF9HUEFEQ19DSEFOTkVMX1BST0NFU1NFRChfaWQsIF9od19pZCwgX3R5cGUsIF9leHRfbmFtZSkJXAorCURBOTE1MF9HUEFEQ19DSEFOTkVMKF9pZCwgX2h3X2lkLCBfdHlwZSwJCQlcCisJCQkgICAgIEJJVChJSU9fQ0hBTl9JTkZPX1BST0NFU1NFRCksIF9leHRfbmFtZSkKKworLyogU3VwcG9ydGVkIGNoYW5uZWxzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgZGE5MTUwX2dwYWRjX2NoYW5uZWxzW10gPSB7CisJREE5MTUwX0dQQURDX0NIQU5ORUxfUFJPQ0VTU0VEKEdQSU9BLCBHUElPQV82ViwgSUlPX1ZPTFRBR0UsIE5VTEwpLAorCURBOTE1MF9HUEFEQ19DSEFOTkVMX1BST0NFU1NFRChHUElPQiwgR1BJT0JfNlYsIElJT19WT0xUQUdFLCBOVUxMKSwKKwlEQTkxNTBfR1BBRENfQ0hBTk5FTF9QUk9DRVNTRUQoR1BJT0MsIEdQSU9DXzZWLCBJSU9fVk9MVEFHRSwgTlVMTCksCisJREE5MTUwX0dQQURDX0NIQU5ORUxfUFJPQ0VTU0VEKEdQSU9ELCBHUElPRF82ViwgSUlPX1ZPTFRBR0UsIE5VTEwpLAorCURBOTE1MF9HUEFEQ19DSEFOTkVMX1BST0NFU1NFRChJQlVTLCBJQlVTX1NFTlNFLCBJSU9fQ1VSUkVOVCwgImlidXMiKSwKKwlEQTkxNTBfR1BBRENfQ0hBTk5FTF9QUk9DRVNTRUQoVkJVUywgVkJVU19ESVZfLCBJSU9fVk9MVEFHRSwgInZidXMiKSwKKwlEQTkxNTBfR1BBRENfQ0hBTk5FTF9QUk9DRVNTRUQoVlNZUywgVlNZUywgSUlPX1ZPTFRBR0UsICJ2c3lzIiksCisJREE5MTUwX0dQQURDX0NIQU5ORUxfU0NBTEVEKFZCQVQsIFZCQVQsIElJT19WT0xUQUdFLCAidmJhdCIpLAorCURBOTE1MF9HUEFEQ19DSEFOTkVMX1JBVyhUQkFULCBUQkFULCBJSU9fVk9MVEFHRSwgInRiYXQiKSwKKwlEQTkxNTBfR1BBRENfQ0hBTk5FTF9TQ0FMRUQoVEpVTkNfQ09SRSwgVEpVTkNfQ09SRSwgSUlPX1RFTVAsCisJCQkJICAgICJ0anVuY19jb3JlIiksCisJREE5MTUwX0dQQURDX0NIQU5ORUxfU0NBTEVEKFRKVU5DX09WUCwgVEpVTkNfT1ZQLCBJSU9fVEVNUCwKKwkJCQkgICAgInRqdW5jX292cCIpLAorfTsKKworLyogRGVmYXVsdCBtYXBzIHVzZWQgYnkgZGE5MTUwLWNoYXJnZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgaWlvX21hcCBkYTkxNTBfZ3BhZGNfZGVmYXVsdF9tYXBzW10gPSB7CisJeworCQkuY29uc3VtZXJfZGV2X25hbWUgPSAiZGE5MTUwLWNoYXJnZXIiLAorCQkuY29uc3VtZXJfY2hhbm5lbCA9ICJDSEFOX0lCVVMiLAorCQkuYWRjX2NoYW5uZWxfbGFiZWwgPSAiSUJVUyIsCisJfSwKKwl7CisJCS5jb25zdW1lcl9kZXZfbmFtZSA9ICJkYTkxNTAtY2hhcmdlciIsCisJCS5jb25zdW1lcl9jaGFubmVsID0gIkNIQU5fVkJVUyIsCisJCS5hZGNfY2hhbm5lbF9sYWJlbCA9ICJWQlVTIiwKKwl9LAorCXsKKwkJLmNvbnN1bWVyX2Rldl9uYW1lID0gImRhOTE1MC1jaGFyZ2VyIiwKKwkJLmNvbnN1bWVyX2NoYW5uZWwgPSAiQ0hBTl9USlVOQyIsCisJCS5hZGNfY2hhbm5lbF9sYWJlbCA9ICJUSlVOQ19DT1JFIiwKKwl9LAorCXsKKwkJLmNvbnN1bWVyX2Rldl9uYW1lID0gImRhOTE1MC1jaGFyZ2VyIiwKKwkJLmNvbnN1bWVyX2NoYW5uZWwgPSAiQ0hBTl9WQkFUIiwKKwkJLmFkY19jaGFubmVsX2xhYmVsID0gIlZCQVQiLAorCX0sCisJe30sCit9OworCitzdGF0aWMgaW50IGRhOTE1MF9ncGFkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRhOTE1MCAqZGE5MTUwID0gZGV2X2dldF9kcnZkYXRhKGRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgZGE5MTUwX2dwYWRjICpncGFkYzsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCWludCBpcnEsIHJldDsKKworCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYyhkZXYsIHNpemVvZigqZ3BhZGMpKTsKKwlpZiAoIWluZGlvX2RldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgSUlPIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlncGFkYyA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmRpb19kZXYpOworCWdwYWRjLT5kYTkxNTAgPSBkYTkxNTA7CisJZ3BhZGMtPmRldiA9IGRldjsKKwltdXRleF9pbml0KCZncGFkYy0+bG9jayk7CisJaW5pdF9jb21wbGV0aW9uKCZncGFkYy0+Y29tcGxldGUpOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIkdQQURDIik7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IElSUTogJWRcbiIsIGlycSk7CisJCXJldHVybiBpcnE7CisJfQorCisJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIGlycSwgTlVMTCwgZGE5MTUwX2dwYWRjX2lycSwKKwkJCQkJSVJRRl9PTkVTSE9ULCAiR1BBREMiLCBncGFkYyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXF1ZXN0IElSUSAlZDogJWRcbiIsIGlycSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBpaW9fbWFwX2FycmF5X3JlZ2lzdGVyKGluZGlvX2RldiwgZGE5MTUwX2dwYWRjX2RlZmF1bHRfbWFwcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWdpc3RlciBJSU8gbWFwczogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaW5kaW9fZGV2LT5uYW1lID0gZGV2X25hbWUoZGV2KTsKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSBkZXY7CisJaW5kaW9fZGV2LT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCWluZGlvX2Rldi0+aW5mbyA9ICZkYTkxNTBfZ3BhZGNfaW5mbzsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IGRhOTE1MF9ncGFkY19jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUoZGE5MTUwX2dwYWRjX2NoYW5uZWxzKTsKKworCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIElJTyBkZXZpY2U6ICVkXG4iLCByZXQpOworCQlnb3RvIGlpb19tYXBfdW5yZWc7CisJfQorCisJcmV0dXJuIDA7CisKK2lpb19tYXBfdW5yZWc6CisJaWlvX21hcF9hcnJheV91bnJlZ2lzdGVyKGluZGlvX2Rldik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRhOTE1MF9ncGFkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpaW9fbWFwX2FycmF5X3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkYTkxNTBfZ3BhZGNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImRhOTE1MC1ncGFkYyIsCisJfSwKKwkucHJvYmUgPSBkYTkxNTBfZ3BhZGNfcHJvYmUsCisJLnJlbW92ZSA9IGRhOTE1MF9ncGFkY19yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGRhOTE1MF9ncGFkY19kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkdQQURDIERyaXZlciBmb3IgREE5MTUwIik7CitNT0RVTEVfQVVUSE9SKCJBZGFtIFRob21zb24gPEFkYW0uVGhvbXNvbi5PcGVuc291cmNlQGRpYXNlbWkuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vYWRjL21heDEwMjcuYyBiL2RyaXZlcnMvaWlvL2FkYy9tYXgxMDI3LmMKaW5kZXggODdlZTFjNy4uNDRiZjgxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vYWRjL21heDEwMjcuYworKysgYi9kcml2ZXJzL2lpby9hZGMvbWF4MTAyNy5jCkBAIC00MzYsNyArNDM2LDcgQEAKIAkJCQkgIGluZGlvX2Rldi0+bnVtX2NoYW5uZWxzICogMiwKIAkJCQkgIEdGUF9LRVJORUwpOwogCWlmIChzdC0+YnVmZmVyID09IE5VTEwpIHsKLQkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJDYW4ndCBhbGxvY2F0ZSBidWZmZmVyXG4iKTsKKwkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsICJDYW4ndCBhbGxvY2F0ZSBidWZmZXJcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy90aV9hbTMzNXhfYWRjLmMgYi9kcml2ZXJzL2lpby9hZGMvdGlfYW0zMzV4X2FkYy5jCmluZGV4IDJlNWNjNDQuLmEwZTcxNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2FkYy90aV9hbTMzNXhfYWRjLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL3RpX2FtMzM1eF9hZGMuYwpAQCAtMTg4LDEyICsxODgsMTEgQEAKIHN0YXRpYyBpbnQgdGlhZGNfYnVmZmVyX3Bvc3RlbmFibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKIHsKIAlzdHJ1Y3QgdGlhZGNfZGV2aWNlICphZGNfZGV2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKLQlzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyID0gaW5kaW9fZGV2LT5idWZmZXI7CiAJdW5zaWduZWQgaW50IGVuYiA9IDA7CiAJdTggYml0OwogCiAJdGlhZGNfc3RlcF9jb25maWcoaW5kaW9fZGV2KTsKLQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgYnVmZmVyLT5zY2FuX21hc2ssIGFkY19kZXYtPmNoYW5uZWxzKQorCWZvcl9lYWNoX3NldF9iaXQoYml0LCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssIGFkY19kZXYtPmNoYW5uZWxzKQogCQllbmIgfD0gKGdldF9hZGNfc3RlcF9iaXQoYWRjX2RldiwgYml0KSA8PCAxKTsKIAlhZGNfZGV2LT5idWZmZXJfZW5fY2hfc3RlcHMgPSBlbmI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2FkYy92ZjYxMF9hZGMuYyBiL2RyaXZlcnMvaWlvL2FkYy92ZjYxMF9hZGMuYwppbmRleCA4ZWMzNTNjLi41NjI5MmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9hZGMvdmY2MTBfYWRjLmMKKysrIGIvZHJpdmVycy9paW8vYWRjL3ZmNjEwX2FkYy5jCkBAIC0xNDEsOSArMTQxLDEzIEBACiAJc3RydWN0IHJlZ3VsYXRvciAqdnJlZjsKIAlzdHJ1Y3QgdmY2MTBfYWRjX2ZlYXR1cmUgYWRjX2ZlYXR1cmU7CiAKKwl1MzIgc2FtcGxlX2ZyZXFfYXZhaWxbNV07CisKIAlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOwogfTsKIAorc3RhdGljIGNvbnN0IHUzMiB2ZjYxMF9od19hdmdzW10gPSB7IDEsIDQsIDgsIDE2LCAzMiB9OworCiAjZGVmaW5lIFZGNjEwX0FEQ19DSEFOKF9pZHgsIF9jaGFuX3R5cGUpIHsJCQlcCiAJLnR5cGUgPSAoX2NoYW5fdHlwZSksCQkJCQlcCiAJLmluZGV4ZWQgPSAxLAkJCQkJCVwKQEAgLTE4MCwzNSArMTg0LDQ3IEBACiAJLyogc2VudGluZWwgKi8KIH07CiAKLS8qCi0gKiBBREMgc2FtcGxlIGZyZXF1ZW5jeSwgdW5pdCBpcyBBRENLIGN5Y2xlcy4KLSAqIEFEQyBjbGsgc291cmNlIGlzIGlwZyBjbG9jaywgd2hpY2ggaXMgdGhlIHNhbWUgYXMgYnVzIGNsb2NrLgotICoKLSAqIEFEQyBjb252ZXJzaW9uIHRpbWUgPSBTRkNBZGRlciArIEF2ZXJhZ2VOdW0geCAoQkNUICsgTFNUQWRkZXIpCi0gKiBTRkNBZGRlcjogZml4ZWQgdG8gNiBBRENLIGN5Y2xlcwotICogQXZlcmFnZU51bTogMSwgNCwgOCwgMTYsIDMyIHNhbXBsZXMgZm9yIGhhcmR3YXJlIGF2ZXJhZ2UuCi0gKiBCQ1QgKEJhc2UgQ29udmVyc2lvbiBUaW1lKTogZml4ZWQgdG8gMjUgQURDSyBjeWNsZXMgZm9yIDEyIGJpdCBtb2RlCi0gKiBMU1RBZGRlcihMb25nIFNhbXBsZSBUaW1lKTogZml4ZWQgdG8gMyBBRENLIGN5Y2xlcwotICoKLSAqIEJ5IGRlZmF1bHQsIGVuYWJsZSAxMiBiaXQgcmVzb2x1dGlvbiBtb2RlLCBjbG9jayBzb3VyY2UKLSAqIHNldCB0byBpcGcgY2xvY2ssIFNvIGdldCBiZWxvdyBmcmVxdWVuY3kgZ3JvdXA6Ci0gKi8KLXN0YXRpYyBjb25zdCB1MzIgdmY2MTBfc2FtcGxlX2ZyZXFfYXZhaWxbNV0gPQotezE5NDExNzYsIDU1OTMzMiwgMjg2OTU3LCAxNDUzNzQsIDczMTcxfTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZjYxMF9hZGNfY2FsY3VsYXRlX3JhdGVzKHN0cnVjdCB2ZjYxMF9hZGMgKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBhZGNrX3JhdGUsIGlwZ19yYXRlID0gY2xrX2dldF9yYXRlKGluZm8tPmNsayk7CisJaW50IGk7CisKKwkvKgorCSAqIENhbGN1bGF0ZSBBREMgc2FtcGxlIGZyZXF1ZW5jaWVzCisJICogU2FtcGxlIHRpbWUgdW5pdCBpcyBBRENLIGN5Y2xlcy4gQURDSyBjbGsgc291cmNlIGlzIGlwZyBjbG9jaywKKwkgKiB3aGljaCBpcyB0aGUgc2FtZSBhcyBidXMgY2xvY2suCisJICoKKwkgKiBBREMgY29udmVyc2lvbiB0aW1lID0gU0ZDQWRkZXIgKyBBdmVyYWdlTnVtIHggKEJDVCArIExTVEFkZGVyKQorCSAqIFNGQ0FkZGVyOiBmaXhlZCB0byA2IEFEQ0sgY3ljbGVzCisJICogQXZlcmFnZU51bTogMSwgNCwgOCwgMTYsIDMyIHNhbXBsZXMgZm9yIGhhcmR3YXJlIGF2ZXJhZ2UuCisJICogQkNUIChCYXNlIENvbnZlcnNpb24gVGltZSk6IGZpeGVkIHRvIDI1IEFEQ0sgY3ljbGVzIGZvciAxMiBiaXQgbW9kZQorCSAqIExTVEFkZGVyKExvbmcgU2FtcGxlIFRpbWUpOiBmaXhlZCB0byAzIEFEQ0sgY3ljbGVzCisJICovCisJYWRja19yYXRlID0gaXBnX3JhdGUgLyBpbmZvLT5hZGNfZmVhdHVyZS5jbGtfZGl2OworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZmNjEwX2h3X2F2Z3MpOyBpKyspCisJCWluZm8tPnNhbXBsZV9mcmVxX2F2YWlsW2ldID0KKwkJCWFkY2tfcmF0ZSAvICg2ICsgdmY2MTBfaHdfYXZnc1tpXSAqICgyNSArIDMpKTsKK30KIAogc3RhdGljIGlubGluZSB2b2lkIHZmNjEwX2FkY19jZmdfaW5pdChzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQogeworCXN0cnVjdCB2ZjYxMF9hZGNfZmVhdHVyZSAqYWRjX2ZlYXR1cmUgPSAmaW5mby0+YWRjX2ZlYXR1cmU7CisKIAkvKiBzZXQgZGVmYXVsdCBDb25maWd1cmF0aW9uIGZvciBBREMgY29udHJvbGxlciAqLwotCWluZm8tPmFkY19mZWF0dXJlLmNsa19zZWwgPSBWRjYxMF9BRENJT0NfQlVTQ0xLX1NFVDsKLQlpbmZvLT5hZGNfZmVhdHVyZS52b2xfcmVmID0gVkY2MTBfQURDSU9DX1ZSX1ZSRUZfU0VUOworCWFkY19mZWF0dXJlLT5jbGtfc2VsID0gVkY2MTBfQURDSU9DX0JVU0NMS19TRVQ7CisJYWRjX2ZlYXR1cmUtPnZvbF9yZWYgPSBWRjYxMF9BRENJT0NfVlJfVlJFRl9TRVQ7CiAKLQlpbmZvLT5hZGNfZmVhdHVyZS5jYWxpYnJhdGlvbiA9IHRydWU7Ci0JaW5mby0+YWRjX2ZlYXR1cmUub3Z3cmVuID0gdHJ1ZTsKKwlhZGNfZmVhdHVyZS0+Y2FsaWJyYXRpb24gPSB0cnVlOworCWFkY19mZWF0dXJlLT5vdndyZW4gPSB0cnVlOwogCi0JaW5mby0+YWRjX2ZlYXR1cmUuY2xrX2RpdiA9IDE7Ci0JaW5mby0+YWRjX2ZlYXR1cmUucmVzX21vZGUgPSAxMjsKLQlpbmZvLT5hZGNfZmVhdHVyZS5zYW1wbGVfcmF0ZSA9IDE7Ci0JaW5mby0+YWRjX2ZlYXR1cmUubHBtID0gdHJ1ZTsKKwlhZGNfZmVhdHVyZS0+cmVzX21vZGUgPSAxMjsKKwlhZGNfZmVhdHVyZS0+c2FtcGxlX3JhdGUgPSAxOworCWFkY19mZWF0dXJlLT5scG0gPSB0cnVlOworCisJLyogVXNlIGEgc2F2ZSBBRENLIHdoaWNoIGlzIGJlbG93IDIwTUh6IG9uIGFsbCBkZXZpY2VzICovCisJYWRjX2ZlYXR1cmUtPmNsa19kaXYgPSA4OworCisJdmY2MTBfYWRjX2NhbGN1bGF0ZV9yYXRlcyhpbmZvKTsKIH0KIAogc3RhdGljIHZvaWQgdmY2MTBfYWRjX2NmZ19wb3N0X3NldChzdHJ1Y3QgdmY2MTBfYWRjICppbmZvKQpAQCAtMjU5LDcgKzI3NSw2IEBACiBzdGF0aWMgdm9pZCB2ZjYxMF9hZGNfY2FsaWJyYXRpb24oc3RydWN0IHZmNjEwX2FkYyAqaW5mbykKIHsKIAlpbnQgYWRjX2djLCBoY19jZmc7Ci0JaW50IHRpbWVvdXQ7CiAKIAlpZiAoIWluZm8tPmFkY19mZWF0dXJlLmNhbGlicmF0aW9uKQogCQlyZXR1cm47CkBAIC0yNzEsOSArMjg2LDcgQEAKIAlhZGNfZ2MgPSByZWFkbChpbmZvLT5yZWdzICsgVkY2MTBfUkVHX0FEQ19HQyk7CiAJd3JpdGVsKGFkY19nYyB8IFZGNjEwX0FEQ19DQUwsIGluZm8tPnJlZ3MgKyBWRjYxMF9SRUdfQURDX0dDKTsKIAotCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQKLQkJCSgmaW5mby0+Y29tcGxldGlvbiwgVkY2MTBfQURDX1RJTUVPVVQpOwotCWlmICh0aW1lb3V0ID09IDApCisJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmluZm8tPmNvbXBsZXRpb24sIFZGNjEwX0FEQ19USU1FT1VUKSkKIAkJZGV2X2VycihpbmZvLT5kZXYsICJUaW1lb3V0IGZvciBhZGMgY2FsaWJyYXRpb25cbiIpOwogCiAJYWRjX2djID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfR1MpOwpAQCAtMjkwLDEyICszMDMsMTAgQEAKIAogCWNmZ19kYXRhID0gcmVhZGwoaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfQ0ZHKTsKIAotCS8qIGxvdyBwb3dlciBjb25maWd1cmF0aW9uICovCiAJY2ZnX2RhdGEgJj0gflZGNjEwX0FEQ19BRExQQ19FTjsKIAlpZiAoYWRjX2ZlYXR1cmUtPmxwbSkKIAkJY2ZnX2RhdGEgfD0gVkY2MTBfQURDX0FETFBDX0VOOwogCi0JLyogZGlzYWJsZSBoaWdoIHNwZWVkICovCiAJY2ZnX2RhdGEgJj0gflZGNjEwX0FEQ19BREhTQ19FTjsKIAogCXdyaXRlbChjZmdfZGF0YSwgaW5mby0+cmVncyArIFZGNjEwX1JFR19BRENfQ0ZHKTsKQEAgLTQzNSwxMCArNDQ2LDI3IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgSUlPX0NPTlNUX0FUVFJfU0FNUF9GUkVRX0FWQUlMKCIxOTQxMTc2LCA1NTkzMzIsIDI4Njk1NywgMTQ1Mzc0LCA3MzE3MSIpOworc3RhdGljIHNzaXplX3QgdmY2MTBfc2hvd19zYW1wX2ZyZXFfYXZhaWwoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHZmNjEwX2FkYyAqaW5mbyA9IGlpb19wcml2KGRldl90b19paW9fZGV2KGRldikpOworCXNpemVfdCBsZW4gPSAwOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5mby0+c2FtcGxlX2ZyZXFfYXZhaWwpOyBpKyspCisJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBQQUdFX1NJWkUgLSBsZW4sCisJCQkiJXUgIiwgaW5mby0+c2FtcGxlX2ZyZXFfYXZhaWxbaV0pOworCisJLyogcmVwbGFjZSB0cmFpbGluZyBzcGFjZSBieSBuZXdsaW5lICovCisJYnVmW2xlbiAtIDFdID0gJ1xuJzsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBJSU9fREVWX0FUVFJfU0FNUF9GUkVRX0FWQUlMKHZmNjEwX3Nob3dfc2FtcF9mcmVxX2F2YWlsKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnZmNjEwX2F0dHJpYnV0ZXNbXSA9IHsKLQkmaWlvX2NvbnN0X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAorCSZpaW9fZGV2X2F0dHJfc2FtcGxpbmdfZnJlcXVlbmN5X2F2YWlsYWJsZS5kZXZfYXR0ci5hdHRyLAogCU5VTEwKIH07CiAKQEAgLTUwMiw3ICs1MzAsNyBAQAogCQlyZXR1cm4gSUlPX1ZBTF9GUkFDVElPTkFMX0xPRzI7CiAKIAljYXNlIElJT19DSEFOX0lORk9fU0FNUF9GUkVROgotCQkqdmFsID0gdmY2MTBfc2FtcGxlX2ZyZXFfYXZhaWxbaW5mby0+YWRjX2ZlYXR1cmUuc2FtcGxlX3JhdGVdOworCQkqdmFsID0gaW5mby0+c2FtcGxlX2ZyZXFfYXZhaWxbaW5mby0+YWRjX2ZlYXR1cmUuc2FtcGxlX3JhdGVdOwogCQkqdmFsMiA9IDA7CiAJCXJldHVybiBJSU9fVkFMX0lOVDsKIApAQCAtNTI1LDkgKzU1Myw5IEBACiAJc3dpdGNoIChtYXNrKSB7CiAJCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CiAJCQlmb3IgKGkgPSAwOwotCQkJCWkgPCBBUlJBWV9TSVpFKHZmNjEwX3NhbXBsZV9mcmVxX2F2YWlsKTsKKwkJCQlpIDwgQVJSQVlfU0laRShpbmZvLT5zYW1wbGVfZnJlcV9hdmFpbCk7CiAJCQkJaSsrKQotCQkJCWlmICh2YWwgPT0gdmY2MTBfc2FtcGxlX2ZyZXFfYXZhaWxbaV0pIHsKKwkJCQlpZiAodmFsID09IGluZm8tPnNhbXBsZV9mcmVxX2F2YWlsW2ldKSB7CiAJCQkJCWluZm8tPmFkY19mZWF0dXJlLnNhbXBsZV9yYXRlID0gaTsKIAkJCQkJdmY2MTBfYWRjX3NhbXBsZV9zZXQoaW5mbyk7CiAJCQkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItYXR0cmlidXRlcy5jIGIvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItYXR0cmlidXRlcy5jCmluZGV4IDI1YjAxZTEuLmU4MWY0MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2NvbW1vbi9oaWQtc2Vuc29ycy9oaWQtc2Vuc29yLWF0dHJpYnV0ZXMuYworKysgYi9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci1hdHRyaWJ1dGVzLmMKQEAgLTE1Myw4ICsxNTMsOCBAQAogCWludCByZXQ7CiAKIAlyZXQgPSBzZW5zb3JfaHViX2dldF9mZWF0dXJlKHN0LT5oc2RldiwKLQkJc3QtPnBvbGwucmVwb3J0X2lkLAotCQlzdC0+cG9sbC5pbmRleCwgJnZhbHVlKTsKKwkJCQkgICAgIHN0LT5wb2xsLnJlcG9ydF9pZCwKKwkJCQkgICAgIHN0LT5wb2xsLmluZGV4LCBzaXplb2YodmFsdWUpLCAmdmFsdWUpOwogCiAJaWYgKHJldCA8IDAgfHwgdmFsdWUgPCAwKSB7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTc0LDggKzE3NCw4IEBACiAJaW50IHJldDsKIAogCXJldCA9IHNlbnNvcl9odWJfZ2V0X2ZlYXR1cmUoc3QtPmhzZGV2LAotCQlzdC0+cG9sbC5yZXBvcnRfaWQsCi0JCXN0LT5wb2xsLmluZGV4LCAmdmFsdWUpOworCQkJCSAgICAgc3QtPnBvbGwucmVwb3J0X2lkLAorCQkJCSAgICAgc3QtPnBvbGwuaW5kZXgsIHNpemVvZih2YWx1ZSksICZ2YWx1ZSk7CiAJaWYgKHJldCA8IDAgfHwgdmFsdWUgPCAwKSB7CiAJCSp2YWwxID0gKnZhbDIgPSAwOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIxMiw5ICsyMTIsOCBAQAogCQllbHNlCiAJCQl2YWx1ZSA9IDA7CiAJfQotCXJldCA9IHNlbnNvcl9odWJfc2V0X2ZlYXR1cmUoc3QtPmhzZGV2LAotCQlzdC0+cG9sbC5yZXBvcnRfaWQsCi0JCXN0LT5wb2xsLmluZGV4LCB2YWx1ZSk7CisJcmV0ID0gc2Vuc29yX2h1Yl9zZXRfZmVhdHVyZShzdC0+aHNkZXYsIHN0LT5wb2xsLnJlcG9ydF9pZCwKKwkJCQkgICAgIHN0LT5wb2xsLmluZGV4LCBzaXplb2YodmFsdWUpLCAmdmFsdWUpOwogCWlmIChyZXQgPCAwIHx8IHZhbHVlIDwgMCkKIAkJcmV0ID0gLUVJTlZBTDsKIApAQCAtMjI5LDggKzIyOCw5IEBACiAJaW50IHJldDsKIAogCXJldCA9IHNlbnNvcl9odWJfZ2V0X2ZlYXR1cmUoc3QtPmhzZGV2LAotCQlzdC0+c2Vuc2l0aXZpdHkucmVwb3J0X2lkLAotCQlzdC0+c2Vuc2l0aXZpdHkuaW5kZXgsICZ2YWx1ZSk7CisJCQkJICAgICBzdC0+c2Vuc2l0aXZpdHkucmVwb3J0X2lkLAorCQkJCSAgICAgc3QtPnNlbnNpdGl2aXR5LmluZGV4LCBzaXplb2YodmFsdWUpLAorCQkJCSAgICAgJnZhbHVlKTsKIAlpZiAocmV0IDwgMCB8fCB2YWx1ZSA8IDApIHsKIAkJKnZhbDEgPSAqdmFsMiA9IDA7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjUzLDkgKzI1Myw5IEBACiAJdmFsdWUgPSBjb252ZXJ0X3RvX3Z0Zl9mb3JtYXQoc3QtPnNlbnNpdGl2aXR5LnNpemUsCiAJCQkJc3QtPnNlbnNpdGl2aXR5LnVuaXRfZXhwbywKIAkJCQl2YWwxLCB2YWwyKTsKLQlyZXQgPSBzZW5zb3JfaHViX3NldF9mZWF0dXJlKHN0LT5oc2RldiwKLQkJc3QtPnNlbnNpdGl2aXR5LnJlcG9ydF9pZCwKLQkJc3QtPnNlbnNpdGl2aXR5LmluZGV4LCB2YWx1ZSk7CisJcmV0ID0gc2Vuc29yX2h1Yl9zZXRfZmVhdHVyZShzdC0+aHNkZXYsIHN0LT5zZW5zaXRpdml0eS5yZXBvcnRfaWQsCisJCQkJICAgICBzdC0+c2Vuc2l0aXZpdHkuaW5kZXgsIHNpemVvZih2YWx1ZSksCisJCQkJICAgICAmdmFsdWUpOwogCWlmIChyZXQgPCAwIHx8IHZhbHVlIDwgMCkKIAkJcmV0ID0gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5jIGIvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5jCmluZGV4IDJmMWQ1MzViLi42MTBmYzk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9jb21tb24vaGlkLXNlbnNvcnMvaGlkLXNlbnNvci10cmlnZ2VyLmMKKysrIGIvZHJpdmVycy9paW8vY29tbW9uL2hpZC1zZW5zb3JzL2hpZC1zZW5zb3ItdHJpZ2dlci5jCkBAIC02OCwyMCArNjgsMjEgQEAKIAlpZiAoc3RhdGVfdmFsID49IDApIHsKIAkJc3RhdGVfdmFsICs9IHN0LT5wb3dlcl9zdGF0ZS5sb2dpY2FsX21pbmltdW07CiAJCXNlbnNvcl9odWJfc2V0X2ZlYXR1cmUoc3QtPmhzZGV2LCBzdC0+cG93ZXJfc3RhdGUucmVwb3J0X2lkLAotCQkJCQlzdC0+cG93ZXJfc3RhdGUuaW5kZXgsCi0JCQkJCShzMzIpc3RhdGVfdmFsKTsKKwkJCQkgICAgICAgc3QtPnBvd2VyX3N0YXRlLmluZGV4LCBzaXplb2Yoc3RhdGVfdmFsKSwKKwkJCQkgICAgICAgJnN0YXRlX3ZhbCk7CiAJfQogCiAJaWYgKHJlcG9ydF92YWwgPj0gMCkgewogCQlyZXBvcnRfdmFsICs9IHN0LT5yZXBvcnRfc3RhdGUubG9naWNhbF9taW5pbXVtOwogCQlzZW5zb3JfaHViX3NldF9mZWF0dXJlKHN0LT5oc2Rldiwgc3QtPnJlcG9ydF9zdGF0ZS5yZXBvcnRfaWQsCi0JCQkJCXN0LT5yZXBvcnRfc3RhdGUuaW5kZXgsCi0JCQkJCShzMzIpcmVwb3J0X3ZhbCk7CisJCQkJICAgICAgIHN0LT5yZXBvcnRfc3RhdGUuaW5kZXgsCisJCQkJICAgICAgIHNpemVvZihyZXBvcnRfdmFsKSwKKwkJCQkgICAgICAgJnJlcG9ydF92YWwpOwogCX0KIAogCXNlbnNvcl9odWJfZ2V0X2ZlYXR1cmUoc3QtPmhzZGV2LCBzdC0+cG93ZXJfc3RhdGUucmVwb3J0X2lkLAotCQkJCQlzdC0+cG93ZXJfc3RhdGUuaW5kZXgsCi0JCQkJCSZzdGF0ZV92YWwpOworCQkJICAgICAgIHN0LT5wb3dlcl9zdGF0ZS5pbmRleCwKKwkJCSAgICAgICBzaXplb2Yoc3RhdGVfdmFsKSwgJnN0YXRlX3ZhbCk7CiAJaWYgKHN0YXRlICYmIHBvbGxfdmFsdWUpCiAJCW1zbGVlcF9pbnRlcnJ1cHRpYmxlKHBvbGxfdmFsdWUgKiAyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vY29tbW9uL3NzcF9zZW5zb3JzL3NzcF9kZXYuYyBiL2RyaXZlcnMvaWlvL2NvbW1vbi9zc3Bfc2Vuc29ycy9zc3BfZGV2LmMKaW5kZXggNTVhOTAwODIuLjlhNDAwOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2NvbW1vbi9zc3Bfc2Vuc29ycy9zc3BfZGV2LmMKKysrIGIvZHJpdmVycy9paW8vY29tbW9uL3NzcF9zZW5zb3JzL3NzcF9kZXYuYwpAQCAtNDM3LDcgKzQzNyw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNzcF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3NwX29mX21hdGNoW10gPSB7CiAJewogCQkuY29tcGF0aWJsZQk9ICJzYW1zdW5nLHNlbnNvcmh1Yi1yaW5hdG8iLAogCQkuZGF0YQkJPSAmc3NwX3JpbmF0b19pbmZvLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vZGFjL0tjb25maWcgYi9kcml2ZXJzL2lpby9kYWMvS2NvbmZpZwppbmRleCAyMjM2ZWEyLi4xMzQ3MWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9kYWMvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9kYWMvS2NvbmZpZwpAQCAtMTQzLDExICsxNDMsMTYgQEAKIAkgIGFkNzMwMy4KIAogY29uZmlnIE1BWDUxNwotCXRyaXN0YXRlICJNYXhpbSBNQVg1MTcvNTE4LzUxOSBEQUMgZHJpdmVyIgorCXRyaXN0YXRlICJNYXhpbSBNQVg1MTcvNTE4LzUxOS81MjAvNTIxIERBQyBkcml2ZXIiCiAJZGVwZW5kcyBvbiBJMkMKIAloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIE1heGltIGNoaXBzIE1BWDUxNywKLQkgIE1BWDUxOCBhbmQgTUFYNTE5IChJMkMgOC1CaXQgREFDcyB3aXRoIHJhaWwtdG8tcmFpbCBvdXRwdXRzKS4KKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nIE1heGltIGNoaXBzCisJICAoSTJDIDgtQml0IERBQ3Mgd2l0aCByYWlsLXRvLXJhaWwgb3V0cHV0cyk6CisJICBNQVg1MTcgLSBTaW5nbGUgY2hhbm5lbCwgc2luZ2xlIHJlZmVyZW5jZQorCSAgTUFYNTE4IC0gRHVhbCBjaGFubmVsLCByZWY9VmRkCisJICBNQVg1MTkgLSBEdWFsIGNoYW5uZWwsIGR1YWwgcmVmZXJlbmNlCisJICBNQVg1MjAgLSBRdWFkIGNoYW5uZWwsIHF1YWQgcmVmZXJlbmNlCisJICBNQVg1MjEgLSBPY3RhbCBjaGFubmVsLCBpbmRlcGVuZGVudCByZWYgZm9yIGNoMC0zLCBzaGFyZWQgcmVmIGZvciBjaDQtNwogCiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBtYXg1MTcuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9kYWMvbWF4NTE3LmMgYi9kcml2ZXJzL2lpby9kYWMvbWF4NTE3LmMKaW5kZXggOWE4MmE3Mi4uNTUwN2IzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vZGFjL21heDUxNy5jCisrKyBiL2RyaXZlcnMvaWlvL2RhYy9tYXg1MTcuYwpAQCAtMzksMTEgKzM5LDEzIEBACiAJSURfTUFYNTE3LAogCUlEX01BWDUxOCwKIAlJRF9NQVg1MTksCisJSURfTUFYNTIwLAorCUlEX01BWDUyMSwKIH07CiAKIHN0cnVjdCBtYXg1MTdfZGF0YSB7CiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKLQl1bnNpZ25lZCBzaG9ydAkJdnJlZl9tdlsyXTsKKwl1bnNpZ25lZCBzaG9ydAkJdnJlZl9tdls4XTsKIH07CiAKIC8qCkBAIC0xNDksNyArMTUxLDEzIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBtYXg1MTdfY2hhbm5lbHNbXSA9IHsKIAlNQVg1MTdfQ0hBTk5FTCgwKSwKLQlNQVg1MTdfQ0hBTk5FTCgxKQorCU1BWDUxN19DSEFOTkVMKDEpLAorCU1BWDUxN19DSEFOTkVMKDIpLAorCU1BWDUxN19DSEFOTkVMKDMpLAorCU1BWDUxN19DSEFOTkVMKDQpLAorCU1BWDUxN19DSEFOTkVMKDUpLAorCU1BWDUxN19DSEFOTkVMKDYpLAorCU1BWDUxN19DSEFOTkVMKDcpLAogfTsKIAogc3RhdGljIGludCBtYXg1MTdfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKQEAgLTE1OCw2ICsxNjYsNyBAQAogCXN0cnVjdCBtYXg1MTdfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OwogCXN0cnVjdCBtYXg1MTdfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaW50IGNoYW47CiAKIAlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRhdGEpKTsKIAlpZiAoIWluZGlvX2RldikKQEAgLTE2OSwxMSArMTc4LDIxIEBACiAJLyogZXN0YWJsaXNoIHRoYXQgdGhlIGlpb19kZXYgaXMgYSBjaGlsZCBvZiB0aGUgaTJjIGRldmljZSAqLwogCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9ICZjbGllbnQtPmRldjsKIAotCS8qIHJlZHVjZWQgY2hhbm5lbCBzZXQgZm9yIE1BWDUxNyAqLwotCWlmIChpZC0+ZHJpdmVyX2RhdGEgPT0gSURfTUFYNTE3KQotCQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IDE7Ci0JZWxzZQorCXN3aXRjaCAoaWQtPmRyaXZlcl9kYXRhKSB7CisJY2FzZSBJRF9NQVg1MjE6CisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gODsKKwkJYnJlYWs7CisJY2FzZSBJRF9NQVg1MjA6CisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gNDsKKwkJYnJlYWs7CisJY2FzZSBJRF9NQVg1MTk6CisJY2FzZSBJRF9NQVg1MTg6CiAJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gMjsKKwkJYnJlYWs7CisJZGVmYXVsdDogIC8qIHNpbmdsZSBjaGFubmVsIGZvciBNQVg1MTcgKi8KKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSAxOworCQlicmVhazsKKwl9CiAJaW5kaW9fZGV2LT5jaGFubmVscyA9IG1heDUxN19jaGFubmVsczsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CiAJaW5kaW9fZGV2LT5pbmZvID0gJm1heDUxN19pbmZvOwpAQCAtMTgyLDExICsyMDEsMTEgQEAKIAkgKiBSZWZlcmVuY2Ugdm9sdGFnZSBvbiBNQVg1MTggYW5kIGRlZmF1bHQgaXMgNVYsIGVsc2UgdGFrZSB2cmVmX212CiAJICogZnJvbSBwbGF0Zm9ybV9kYXRhCiAJICovCi0JaWYgKGlkLT5kcml2ZXJfZGF0YSA9PSBJRF9NQVg1MTggfHwgIXBsYXRmb3JtX2RhdGEpIHsKLQkJZGF0YS0+dnJlZl9tdlswXSA9IGRhdGEtPnZyZWZfbXZbMV0gPSA1MDAwOyAvKiBtViAqLwotCX0gZWxzZSB7Ci0JCWRhdGEtPnZyZWZfbXZbMF0gPSBwbGF0Zm9ybV9kYXRhLT52cmVmX212WzBdOwotCQlkYXRhLT52cmVmX212WzFdID0gcGxhdGZvcm1fZGF0YS0+dnJlZl9tdlsxXTsKKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgaW5kaW9fZGV2LT5udW1fY2hhbm5lbHM7IGNoYW4rKykgeworCQlpZiAoaWQtPmRyaXZlcl9kYXRhID09IElEX01BWDUxOCB8fCAhcGxhdGZvcm1fZGF0YSkKKwkJCWRhdGEtPnZyZWZfbXZbY2hhbl0gPSA1MDAwOyAvKiBtViAqLworCQllbHNlCisJCQlkYXRhLT52cmVmX212W2NoYW5dID0gcGxhdGZvcm1fZGF0YS0+dnJlZl9tdltjaGFuXTsKIAl9CiAKIAlyZXR1cm4gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwpAQCAtMjAyLDYgKzIyMSw4IEBACiAJeyAibWF4NTE3IiwgSURfTUFYNTE3IH0sCiAJeyAibWF4NTE4IiwgSURfTUFYNTE4IH0sCiAJeyAibWF4NTE5IiwgSURfTUFYNTE5IH0sCisJeyAibWF4NTIwIiwgSURfTUFYNTIwIH0sCisJeyAibWF4NTIxIiwgSURfTUFYNTIxIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1heDUxN19pZCk7CkBAIC0yMTgsNSArMjM5LDUgQEAKIG1vZHVsZV9pMmNfZHJpdmVyKG1heDUxN19kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJSb2xhbmQgU3RpZ2dlIDxzdGlnZ2VAYW50Y29tLmRlPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJNQVg1MTcvTUFYNTE4L01BWDUxOSA4LWJpdCBEQUMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUFYNTE3LzUxOC81MTkvNTIwLzUyMSA4LWJpdCBEQUMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2d5cm8vYm1nMTYwLmMgYi9kcml2ZXJzL2lpby9neXJvL2JtZzE2MC5jCmluZGV4IDYwNDUxYjMuLjQ0MTVmNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2d5cm8vYm1nMTYwLmMKKysrIGIvZHJpdmVycy9paW8vZ3lyby9ibWcxNjAuYwpAQCAtODIyLDcgKzgyMiw3IEBACiAJaW50IGJpdCwgcmV0LCBpID0gMDsKIAogCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKLQlmb3JfZWFjaF9zZXRfYml0KGJpdCwgaW5kaW9fZGV2LT5idWZmZXItPnNjYW5fbWFzaywKKwlmb3JfZWFjaF9zZXRfYml0KGJpdCwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrLAogCQkJIGluZGlvX2Rldi0+bWFza2xlbmd0aCkgewogCQlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoZGF0YS0+Y2xpZW50LAogCQkJCQkgICAgICAgQk1HMTYwX0FYSVNfVE9fUkVHKGJpdCkpOwpAQCAtMTAwMSwxNiArMTAwMSwxMiBAQAogCWRldiA9ICZjbGllbnQtPmRldjsKIAogCS8qIGRhdGEgcmVhZHkgZ3BpbyBpbnRlcnJ1cHQgcGluICovCi0JZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGRldiwgQk1HMTYwX0dQSU9fTkFNRSwgMCk7CisJZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGRldiwgQk1HMTYwX0dQSU9fTkFNRSwgMCwgR1BJT0RfSU4pOwogCWlmIChJU19FUlIoZ3BpbykpIHsKIAkJZGV2X2VycihkZXYsICJhY3BpIGdwaW8gZ2V0IGluZGV4IGZhaWxlZFxuIik7CiAJCXJldHVybiBQVFJfRVJSKGdwaW8pOwogCX0KIAotCXJldCA9IGdwaW9kX2RpcmVjdGlvbl9pbnB1dChncGlvKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCiAJcmV0ID0gZ3Bpb2RfdG9faXJxKGdwaW8pOwogCiAJZGV2X2RiZyhkZXYsICJHUElPIHJlc291cmNlLCBubzolZCBpcnE6JWRcbiIsIGRlc2NfdG9fZ3BpbyhncGlvKSwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2d5cm8vaGlkLXNlbnNvci1neXJvLTNkLmMgYi9kcml2ZXJzL2lpby9neXJvL2hpZC1zZW5zb3ItZ3lyby0zZC5jCmluZGV4IGEzYzNlMTkuLmI1ODgzYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2d5cm8vaGlkLXNlbnNvci1neXJvLTNkLmMKKysrIGIvZHJpdmVycy9paW8vZ3lyby9oaWQtc2Vuc29yLWd5cm8tM2QuYwpAQCAtMTIzLDcgKzEyMyw4IEBACiAJCQkqdmFsID0gc2Vuc29yX2h1Yl9pbnB1dF9hdHRyX2dldF9yYXdfdmFsdWUoCiAJCQkJCWd5cm9fc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLmhzZGV2LAogCQkJCQlISURfVVNBR0VfU0VOU09SX0dZUk9fM0QsIGFkZHJlc3MsCi0JCQkJCXJlcG9ydF9pZCk7CisJCQkJCXJlcG9ydF9pZCwKKwkJCQkJU0VOU09SX0hVQl9TWU5DKTsKIAkJZWxzZSB7CiAJCQkqdmFsID0gMDsKIAkJCWhpZF9zZW5zb3JfcG93ZXJfc3RhdGUoJmd5cm9fc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vZ3lyby9pdGczMjAwX2NvcmUuYyBiL2RyaXZlcnMvaWlvL2d5cm8vaXRnMzIwMF9jb3JlLmMKaW5kZXggNmE4MDIwZC4uZjBmZDk0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vZ3lyby9pdGczMjAwX2NvcmUuYworKysgYi9kcml2ZXJzL2lpby9neXJvL2l0ZzMyMDBfY29yZS5jCkBAIC0yMjMsNiArMjIzLDEwIEBACiAJaW50IHJldDsKIAl1OCB2YWw7CiAKKwlyZXQgPSBpdGczMjAwX3Jlc2V0KGluZGlvX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcmV0OworCiAJcmV0ID0gaXRnMzIwMF9yZWFkX3JlZ184KGluZGlvX2RldiwgSVRHMzIwMF9SRUdfQUREUkVTUywgJnZhbCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfcmV0OwpAQCAtMjMzLDEwICsyMzcsNiBAQAogCQlnb3RvIGVycl9yZXQ7CiAJfQogCi0JcmV0ID0gaXRnMzIwMF9yZXNldChpbmRpb19kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3JldDsKLQogCXJldCA9IGl0ZzMyMDBfZW5hYmxlX2Z1bGxfc2NhbGUoaW5kaW9fZGV2KTsKIGVycl9yZXQ6CiAJcmV0dXJuIHJldDsKQEAgLTM1MSw2ICszNTEsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBfX21heWJlX3VudXNlZCBpdGczMjAwX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaXRnMzIwMCAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJZGV2X2RiZygmc3QtPmkyYy0+ZGV2LCAic3VzcGVuZCBkZXZpY2UiKTsKKworCXJldHVybiBpdGczMjAwX3dyaXRlX3JlZ184KGluZGlvX2RldiwgSVRHMzIwMF9SRUdfUE9XRVJfTUFOQUdFTUVOVCwKKwkJCQkgICBJVEczMjAwX1NMRUVQKTsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBpdGczMjAwX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIGl0ZzMyMDBfaW5pdGlhbF9zZXR1cChpbmRpb19kZXYpOworfQorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoaXRnMzIwMF9wbV9vcHMsIGl0ZzMyMDBfc3VzcGVuZCwgaXRnMzIwMF9yZXN1bWUpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgaXRnMzIwMF9pZFtdID0gewogCXsgIml0ZzMyMDAiLCAwIH0sCiAJeyB9CkBAIC0zNjEsNiArMzgxLDcgQEAKIAkuZHJpdmVyID0gewogCQkub3duZXIgID0gVEhJU19NT0RVTEUsCiAJCS5uYW1lCT0gIml0ZzMyMDAiLAorCQkucG0JPSAmaXRnMzIwMF9wbV9vcHMsCiAJfSwKIAkuaWRfdGFibGUJPSBpdGczMjAwX2lkLAogCS5wcm9iZQkJPSBpdGczMjAwX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vZ3lyby9zdF9neXJvX2NvcmUuYyBiL2RyaXZlcnMvaWlvL2d5cm8vc3RfZ3lyb19jb3JlLmMKaW5kZXggZjA3YTIzMy4uMjEzOTVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vZ3lyby9zdF9neXJvX2NvcmUuYworKysgYi9kcml2ZXJzL2lpby9neXJvL3N0X2d5cm9fY29yZS5jCkBAIC04Nyw2ICs4NywzMSBAQAogI2RlZmluZSBTVF9HWVJPXzJfRFJEWV9JUlFfSU5UMl9NQVNLCQkweDA4CiAjZGVmaW5lIFNUX0dZUk9fMl9NVUxUSVJFQURfQklUCQkJdHJ1ZQogCisvKiBDVVNUT00gVkFMVUVTIEZPUiBTRU5TT1IgMyAqLworI2RlZmluZSBTVF9HWVJPXzNfV0FJX0VYUAkJCTB4ZDcKKyNkZWZpbmUgU1RfR1lST18zX09EUl9BRERSCQkJMHgyMAorI2RlZmluZSBTVF9HWVJPXzNfT0RSX01BU0sJCQkweGMwCisjZGVmaW5lIFNUX0dZUk9fM19PRFJfQVZMXzk1SFpfVkFMCQkweDAwCisjZGVmaW5lIFNUX0dZUk9fM19PRFJfQVZMXzE5MEhaX1ZBTAkJMHgwMQorI2RlZmluZSBTVF9HWVJPXzNfT0RSX0FWTF8zODBIWl9WQUwJCTB4MDIKKyNkZWZpbmUgU1RfR1lST18zX09EUl9BVkxfNzYwSFpfVkFMCQkweDAzCisjZGVmaW5lIFNUX0dZUk9fM19QV19BRERSCQkJMHgyMAorI2RlZmluZSBTVF9HWVJPXzNfUFdfTUFTSwkJCTB4MDgKKyNkZWZpbmUgU1RfR1lST18zX0ZTX0FERFIJCQkweDIzCisjZGVmaW5lIFNUX0dZUk9fM19GU19NQVNLCQkJMHgzMAorI2RlZmluZSBTVF9HWVJPXzNfRlNfQVZMXzI1MF9WQUwJCTB4MDAKKyNkZWZpbmUgU1RfR1lST18zX0ZTX0FWTF81MDBfVkFMCQkweDAxCisjZGVmaW5lIFNUX0dZUk9fM19GU19BVkxfMjAwMF9WQUwJCTB4MDIKKyNkZWZpbmUgU1RfR1lST18zX0ZTX0FWTF8yNTBfR0FJTgkJSUlPX0RFR1JFRV9UT19SQUQoODc1MCkKKyNkZWZpbmUgU1RfR1lST18zX0ZTX0FWTF81MDBfR0FJTgkJSUlPX0RFR1JFRV9UT19SQUQoMTc1MDApCisjZGVmaW5lIFNUX0dZUk9fM19GU19BVkxfMjAwMF9HQUlOCQlJSU9fREVHUkVFX1RPX1JBRCg3MDAwMCkKKyNkZWZpbmUgU1RfR1lST18zX0JEVV9BRERSCQkJMHgyMworI2RlZmluZSBTVF9HWVJPXzNfQkRVX01BU0sJCQkweDgwCisjZGVmaW5lIFNUX0dZUk9fM19EUkRZX0lSUV9BRERSCQkJMHgyMgorI2RlZmluZSBTVF9HWVJPXzNfRFJEWV9JUlFfSU5UMl9NQVNLCQkweDA4CisjZGVmaW5lIFNUX0dZUk9fM19NVUxUSVJFQURfQklUCQkJdHJ1ZQorCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBzdF9neXJvXzE2Yml0X2NoYW5uZWxzW10gPSB7CiAJU1RfU0VOU09SU19MU01fQ0hBTk5FTFMoSUlPX0FOR0xfVkVMLAogCQkJQklUKElJT19DSEFOX0lORk9fUkFXKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwKQEAgLTIyNSw2ICsyNTAsNjQgQEAKIAkJLm11bHRpX3JlYWRfYml0ID0gU1RfR1lST18yX01VTFRJUkVBRF9CSVQsCiAJCS5ib290aW1lID0gMiwKIAl9LAorCXsKKwkJLndhaSA9IFNUX0dZUk9fM19XQUlfRVhQLAorCQkuc2Vuc29yc19zdXBwb3J0ZWQgPSB7CisJCQlbMF0gPSBMM0dEMjBfR1lST19ERVZfTkFNRSwKKwkJfSwKKwkJLmNoID0gKHN0cnVjdCBpaW9fY2hhbl9zcGVjICopc3RfZ3lyb18xNmJpdF9jaGFubmVscywKKwkJLm9kciA9IHsKKwkJCS5hZGRyID0gU1RfR1lST18zX09EUl9BRERSLAorCQkJLm1hc2sgPSBTVF9HWVJPXzNfT0RSX01BU0ssCisJCQkub2RyX2F2bCA9IHsKKwkJCQl7IDk1LCBTVF9HWVJPXzNfT0RSX0FWTF85NUhaX1ZBTCwgfSwKKwkJCQl7IDE5MCwgU1RfR1lST18zX09EUl9BVkxfMTkwSFpfVkFMLCB9LAorCQkJCXsgMzgwLCBTVF9HWVJPXzNfT0RSX0FWTF8zODBIWl9WQUwsIH0sCisJCQkJeyA3NjAsIFNUX0dZUk9fM19PRFJfQVZMXzc2MEhaX1ZBTCwgfSwKKwkJCX0sCisJCX0sCisJCS5wdyA9IHsKKwkJCS5hZGRyID0gU1RfR1lST18zX1BXX0FERFIsCisJCQkubWFzayA9IFNUX0dZUk9fM19QV19NQVNLLAorCQkJLnZhbHVlX29uID0gU1RfU0VOU09SU19ERUZBVUxUX1BPV0VSX09OX1ZBTFVFLAorCQkJLnZhbHVlX29mZiA9IFNUX1NFTlNPUlNfREVGQVVMVF9QT1dFUl9PRkZfVkFMVUUsCisJCX0sCisJCS5lbmFibGVfYXhpcyA9IHsKKwkJCS5hZGRyID0gU1RfU0VOU09SU19ERUZBVUxUX0FYSVNfQUREUiwKKwkJCS5tYXNrID0gU1RfU0VOU09SU19ERUZBVUxUX0FYSVNfTUFTSywKKwkJfSwKKwkJLmZzID0geworCQkJLmFkZHIgPSBTVF9HWVJPXzNfRlNfQUREUiwKKwkJCS5tYXNrID0gU1RfR1lST18zX0ZTX01BU0ssCisJCQkuZnNfYXZsID0geworCQkJCVswXSA9IHsKKwkJCQkJLm51bSA9IFNUX0dZUk9fRlNfQVZMXzI1MERQUywKKwkJCQkJLnZhbHVlID0gU1RfR1lST18zX0ZTX0FWTF8yNTBfVkFMLAorCQkJCQkuZ2FpbiA9IFNUX0dZUk9fM19GU19BVkxfMjUwX0dBSU4sCisJCQkJfSwKKwkJCQlbMV0gPSB7CisJCQkJCS5udW0gPSBTVF9HWVJPX0ZTX0FWTF81MDBEUFMsCisJCQkJCS52YWx1ZSA9IFNUX0dZUk9fM19GU19BVkxfNTAwX1ZBTCwKKwkJCQkJLmdhaW4gPSBTVF9HWVJPXzNfRlNfQVZMXzUwMF9HQUlOLAorCQkJCX0sCisJCQkJWzJdID0geworCQkJCQkubnVtID0gU1RfR1lST19GU19BVkxfMjAwMERQUywKKwkJCQkJLnZhbHVlID0gU1RfR1lST18zX0ZTX0FWTF8yMDAwX1ZBTCwKKwkJCQkJLmdhaW4gPSBTVF9HWVJPXzNfRlNfQVZMXzIwMDBfR0FJTiwKKwkJCQl9LAorCQkJfSwKKwkJfSwKKwkJLmJkdSA9IHsKKwkJCS5hZGRyID0gU1RfR1lST18zX0JEVV9BRERSLAorCQkJLm1hc2sgPSBTVF9HWVJPXzNfQkRVX01BU0ssCisJCX0sCisJCS5kcmR5X2lycSA9IHsKKwkJCS5hZGRyID0gU1RfR1lST18zX0RSRFlfSVJRX0FERFIsCisJCQkubWFza19pbnQyID0gU1RfR1lST18zX0RSRFlfSVJRX0lOVDJfTUFTSywKKwkJfSwKKwkJLm11bHRpX3JlYWRfYml0ID0gU1RfR1lST18zX01VTFRJUkVBRF9CSVQsCisJCS5ib290aW1lID0gMiwKKwl9LAogfTsKIAogc3RhdGljIGludCBzdF9neXJvX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbXUvYWRpc190cmlnZ2VyLmMgYi9kcml2ZXJzL2lpby9pbXUvYWRpc190cmlnZ2VyLmMKaW5kZXggZTAwMTdjMi4uZjUzZTlhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L2FkaXNfdHJpZ2dlci5jCisrKyBiL2RyaXZlcnMvaWlvL2ltdS9hZGlzX3RyaWdnZXIuYwpAQCAtNjAsNyArNjAsNyBAQAogCWlpb190cmlnZ2VyX3NldF9kcnZkYXRhKGFkaXMtPnRyaWcsIGFkaXMpOwogCXJldCA9IGlpb190cmlnZ2VyX3JlZ2lzdGVyKGFkaXMtPnRyaWcpOwogCi0JaW5kaW9fZGV2LT50cmlnID0gYWRpcy0+dHJpZzsKKwlpbmRpb19kZXYtPnRyaWcgPSBpaW9fdHJpZ2dlcl9nZXQoYWRpcy0+dHJpZyk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9mcmVlX2lycTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL01ha2VmaWxlIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL01ha2VmaWxlCmluZGV4IDNhNjc3YzcuLmY1NjZmNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvTWFrZWZpbGUKQEAgLTMsNCArMyw0IEBACiAjCiAKIG9iai0kKENPTkZJR19JTlZfTVBVNjA1MF9JSU8pICs9IGludi1tcHU2MDUwLm8KLWludi1tcHU2MDUwLW9ianMgOj0gaW52X21wdV9jb3JlLm8gaW52X21wdV9yaW5nLm8gaW52X21wdV90cmlnZ2VyLm8KK2ludi1tcHU2MDUwLW9ianMgOj0gaW52X21wdV9jb3JlLm8gaW52X21wdV9yaW5nLm8gaW52X21wdV90cmlnZ2VyLm8gaW52X21wdV9hY3BpLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2FjcGkuYyBiL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2FjcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzk4MmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfYWNwaS5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogaW52X21wdV9hY3BpOiBBQ1BJIHByb2Nlc3NpbmcgZm9yIGNyZWF0aW5nIGNsaWVudCBkZXZpY2VzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZkZWYgQ09ORklHX0FDUEkKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlICJpbnZfbXB1X2lpby5oIgorCitlbnVtIGludl9tcHVfcHJvZHVjdF9uYW1lIHsKKwlJTlZfTVBVX05PVF9NQVRDSEVELAorCUlOVl9NUFVfQVNVU19UMTAwVEEsCit9OworCitzdGF0aWMgZW51bSBpbnZfbXB1X3Byb2R1Y3RfbmFtZSBtYXRjaGVkX3Byb2R1Y3RfbmFtZTsKKworc3RhdGljIGludCBfX2luaXQgYXN1c190MTAwX21hdGNoZWQoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCit7CisJbWF0Y2hlZF9wcm9kdWN0X25hbWUgPSBJTlZfTVBVX0FTVVNfVDEwMFRBOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBpbnZfbXB1X2Rldl9saXN0W10gPSB7CisJeworCS5jYWxsYmFjayA9IGFzdXNfdDEwMF9tYXRjaGVkLAorCS5pZGVudCA9ICJBc3VzIFRyYW5zZm9ybWVyIEJvb2sgVDEwMCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQVNVU1RlSyBDT01QVVRFUiBJTkMiKSwKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiVDEwMFRBIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfVkVSU0lPTiwgIjEuMCIpLAorCQl9LAorCX0sCisJLyogQWRkIG1vcmUgbWF0Y2hpbmcgdGFibGVzIGhlcmUuLiovCisJe30KK307CisKK3N0YXRpYyBpbnQgYXN1c19hY3BpX2dldF9zZW5zb3JfaW5mbyhzdHJ1Y3QgYWNwaV9kZXZpY2UgKmFkZXYsCisJCQkJICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJCSAgICAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQoreworCXN0cnVjdCBhY3BpX2J1ZmZlciBidWZmZXIgPSB7QUNQSV9BTExPQ0FURV9CVUZGRVIsIE5VTEx9OworCWludCBpOworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwl1bmlvbiBhY3BpX29iamVjdCAqY3BtOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoYWRldi0+aGFuZGxlLCAiQ05GMCIsIE5VTEwsICZidWZmZXIpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljcG0gPSBidWZmZXIucG9pbnRlcjsKKwlmb3IgKGkgPSAwOyBpIDwgY3BtLT5wYWNrYWdlLmNvdW50OyArK2kpIHsKKwkJdW5pb24gYWNwaV9vYmplY3QgKmVsZW07CisJCWludCBqOworCisJCWVsZW0gPSAmKGNwbS0+cGFja2FnZS5lbGVtZW50c1tpXSk7CisJCWZvciAoaiA9IDA7IGogPCBlbGVtLT5wYWNrYWdlLmNvdW50OyArK2opIHsKKwkJCXVuaW9uIGFjcGlfb2JqZWN0ICpzdWJfZWxlbTsKKworCQkJc3ViX2VsZW0gPSAmKGVsZW0tPnBhY2thZ2UuZWxlbWVudHNbal0pOworCQkJaWYgKHN1Yl9lbGVtLT50eXBlID09IEFDUElfVFlQRV9TVFJJTkcpCisJCQkJc3RybGNweShpbmZvLT50eXBlLCBzdWJfZWxlbS0+c3RyaW5nLnBvaW50ZXIsCisJCQkJCXNpemVvZihpbmZvLT50eXBlKSk7CisJCQllbHNlIGlmIChzdWJfZWxlbS0+dHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQkJCWlmIChzdWJfZWxlbS0+aW50ZWdlci52YWx1ZSAhPSBjbGllbnQtPmFkZHIpIHsKKwkJCQkJaW5mby0+YWRkciA9IHN1Yl9lbGVtLT5pbnRlZ2VyLnZhbHVlOworCQkJCQlicmVhazsgLyogTm90IGEgTVBVNjUwMCBwcmltYXJ5ICovCisJCQkJfQorCQkJfQorCQl9CisJfQorCisJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOworCisJcmV0dXJuIGNwbS0+cGFja2FnZS5jb3VudDsKK30KKworc3RhdGljIGludCBhY3BpX2kyY19jaGVja19yZXNvdXJjZShzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqYXJlcywgdm9pZCAqZGF0YSkKK3sKKwl1MzIgKmFkZHIgPSBkYXRhOworCisJaWYgKGFyZXMtPnR5cGUgPT0gQUNQSV9SRVNPVVJDRV9UWVBFX1NFUklBTF9CVVMpIHsKKwkJc3RydWN0IGFjcGlfcmVzb3VyY2VfaTJjX3NlcmlhbGJ1cyAqc2I7CisKKwkJc2IgPSAmYXJlcy0+ZGF0YS5pMmNfc2VyaWFsX2J1czsKKwkJaWYgKHNiLT50eXBlID09IEFDUElfUkVTT1VSQ0VfU0VSSUFMX1RZUEVfSTJDKSB7CisJCQlpZiAoKmFkZHIpCisJCQkJKmFkZHIgfD0gKHNiLT5zbGF2ZV9hZGRyZXNzIDw8IDE2KTsKKwkJCWVsc2UKKwkJCQkqYWRkciA9IHNiLT5zbGF2ZV9hZGRyZXNzOworCQl9CisJfQorCisJLyogVGVsbCB0aGUgQUNQSSBjb3JlIHRoYXQgd2UgYWxyZWFkeSBjb3BpZWQgdGhpcyBhZGRyZXNzICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaW52X21wdV9wcm9jZXNzX2FjcGlfY29uZmlnKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0ICpwcmltYXJ5X2FkZHIsCisJCQkJICAgICAgIHVuc2lnbmVkIHNob3J0ICpzZWNvbmRhcnlfYWRkcikKK3sKKwljb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmlkOworCXN0cnVjdCBhY3BpX2RldmljZSAqYWRldjsKKwl1MzIgaTJjX2FkZHIgPSAwOworCUxJU1RfSEVBRChyZXNvdXJjZXMpOworCWludCByZXQ7CisKKwlpZCA9IGFjcGlfbWF0Y2hfZGV2aWNlKGNsaWVudC0+ZGV2LmRyaXZlci0+YWNwaV9tYXRjaF90YWJsZSwKKwkJCSAgICAgICAmY2xpZW50LT5kZXYpOworCWlmICghaWQpCisJCXJldHVybiAtRU5PREVWOworCisJYWRldiA9IEFDUElfQ09NUEFOSU9OKCZjbGllbnQtPmRldik7CisJaWYgKCFhZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldCA9IGFjcGlfZGV2X2dldF9yZXNvdXJjZXMoYWRldiwgJnJlc291cmNlcywKKwkJCQkgICAgIGFjcGlfaTJjX2NoZWNrX3Jlc291cmNlLCAmaTJjX2FkZHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJYWNwaV9kZXZfZnJlZV9yZXNvdXJjZV9saXN0KCZyZXNvdXJjZXMpOworCSpwcmltYXJ5X2FkZHIgPSBpMmNfYWRkciAmIDB4MDAwMGZmZmY7CisJKnNlY29uZGFyeV9hZGRyID0gKGkyY19hZGRyICYgMHhmZmZmMDAwMCkgPj4gMTY7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGludl9tcHVfYWNwaV9jcmVhdGVfbXV4X2NsaWVudChzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0KQoreworCisJc3QtPm11eF9jbGllbnQgPSBOVUxMOworCWlmIChBQ1BJX0hBTkRMRSgmc3QtPmNsaWVudC0+ZGV2KSkgeworCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaW5mbzsKKwkJc3RydWN0IGFjcGlfZGV2aWNlICphZGV2OworCQlpbnQgcmV0ID0gLTE7CisKKwkJYWRldiA9IEFDUElfQ09NUEFOSU9OKCZzdC0+Y2xpZW50LT5kZXYpOworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisKKwkJZG1pX2NoZWNrX3N5c3RlbShpbnZfbXB1X2Rldl9saXN0KTsKKwkJc3dpdGNoIChtYXRjaGVkX3Byb2R1Y3RfbmFtZSkgeworCQljYXNlIElOVl9NUFVfQVNVU19UMTAwVEE6CisJCQlyZXQgPSBhc3VzX2FjcGlfZ2V0X3NlbnNvcl9pbmZvKGFkZXYsIHN0LT5jbGllbnQsCisJCQkJCQkJJmluZm8pOworCQkJYnJlYWs7CisJCS8qIEFkZCBtb3JlIG1hdGNoZWQgcHJvZHVjdCBwcm9jZXNzaW5nIGhlcmUgKi8KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJldCA8IDApIHsKKwkJCS8qIE5vIG1hdGNoaW5nIERNSSwgc28gY3JlYXRlIGRldmljZSBvbiBJTlY2WFggdHlwZSAqLworCQkJdW5zaWduZWQgc2hvcnQgcHJpbWFyeSwgc2Vjb25kYXJ5OworCisJCQlyZXQgPSBpbnZfbXB1X3Byb2Nlc3NfYWNwaV9jb25maWcoc3QtPmNsaWVudCwgJnByaW1hcnksCisJCQkJCQkJICAmc2Vjb25kYXJ5KTsKKwkJCWlmICghcmV0ICYmIHNlY29uZGFyeSkgeworCQkJCWNoYXIgKm5hbWU7CisKKwkJCQlpbmZvLmFkZHIgPSBzZWNvbmRhcnk7CisJCQkJc3RybGNweShpbmZvLnR5cGUsIGRldl9uYW1lKCZhZGV2LT5kZXYpLAorCQkJCQlzaXplb2YoaW5mby50eXBlKSk7CisJCQkJbmFtZSA9IHN0cmNocihpbmZvLnR5cGUsICc6Jyk7CisJCQkJaWYgKG5hbWUpCisJCQkJCSpuYW1lID0gJ1wwJzsKKwkJCQlzdHJsY2F0KGluZm8udHlwZSwgIi1jbGllbnQiLAorCQkJCQlzaXplb2YoaW5mby50eXBlKSk7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gMDsgLyogbm8gc2Vjb25kYXJ5IGFkZHIsIHdoaWNoIGlzIE9LICovCisJCX0KKwkJc3QtPm11eF9jbGllbnQgPSBpMmNfbmV3X2RldmljZShzdC0+bXV4X2FkYXB0ZXIsICZpbmZvKTsKKwkJaWYgKCFzdC0+bXV4X2NsaWVudCkKKwkJCXJldHVybiAtRU5PREVWOworCisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaW52X21wdV9hY3BpX2RlbGV0ZV9tdXhfY2xpZW50KHN0cnVjdCBpbnZfbXB1NjA1MF9zdGF0ZSAqc3QpCit7CisJaWYgKHN0LT5tdXhfY2xpZW50KQorCQlpMmNfdW5yZWdpc3Rlcl9kZXZpY2Uoc3QtPm11eF9jbGllbnQpOworfQorI2Vsc2UKKworI2luY2x1ZGUgImludl9tcHVfaWlvLmgiCisKK2ludCBpbnZfbXB1X2FjcGlfY3JlYXRlX211eF9jbGllbnQoc3RydWN0IGludl9tcHU2MDUwX3N0YXRlICpzdCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpbnZfbXB1X2FjcGlfZGVsZXRlX211eF9jbGllbnQoc3RydWN0IGludl9tcHU2MDUwX3N0YXRlICpzdCkKK3sKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfY29yZS5jIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfY29yZS5jCmluZGV4IGQ4ZDViZWQuLjE3ZDRiYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2NvcmUuYworKysgYi9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9jb3JlLmMKQEAgLTQxMCw0MiArNDEwLDQ2IEBACiAJfQogfQogCi1zdGF0aWMgaW50IGludl9tcHU2MDUwX3dyaXRlX2ZzcihzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0LCBpbnQgZnNyKQorc3RhdGljIGludCBpbnZfbXB1NjA1MF93cml0ZV9neXJvX3NjYWxlKHN0cnVjdCBpbnZfbXB1NjA1MF9zdGF0ZSAqc3QsIGludCB2YWwpCiB7Ci0JaW50IHJlc3VsdDsKKwlpbnQgcmVzdWx0LCBpOwogCXU4IGQ7CiAKLQlpZiAoZnNyIDwgMCB8fCBmc3IgPiBJTlZfTVBVNjA1MF9NQVhfR1lST19GU19QQVJBTSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGZzciA9PSBzdC0+Y2hpcF9jb25maWcuZnNyKQotCQlyZXR1cm4gMDsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShneXJvX3NjYWxlXzYwNTApOyArK2kpIHsKKwkJaWYgKGd5cm9fc2NhbGVfNjA1MFtpXSA9PSB2YWwpIHsKKwkJCWQgPSAoaSA8PCBJTlZfTVBVNjA1MF9HWVJPX0NPTkZJR19GU1JfU0hJRlQpOworCQkJcmVzdWx0ID0gaW52X21wdTYwNTBfd3JpdGVfcmVnKHN0LAorCQkJCQlzdC0+cmVnLT5neXJvX2NvbmZpZywgZCk7CisJCQlpZiAocmVzdWx0KQorCQkJCXJldHVybiByZXN1bHQ7CiAKLQlkID0gKGZzciA8PCBJTlZfTVBVNjA1MF9HWVJPX0NPTkZJR19GU1JfU0hJRlQpOwotCXJlc3VsdCA9IGludl9tcHU2MDUwX3dyaXRlX3JlZyhzdCwgc3QtPnJlZy0+Z3lyb19jb25maWcsIGQpOwotCWlmIChyZXN1bHQpCi0JCXJldHVybiByZXN1bHQ7Ci0Jc3QtPmNoaXBfY29uZmlnLmZzciA9IGZzcjsKKwkJCXN0LT5jaGlwX2NvbmZpZy5mc3IgPSBpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBpbnZfbXB1NjA1MF93cml0ZV9hY2NlbF9mcyhzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0LCBpbnQgZnMpCitzdGF0aWMgaW50IGludl9tcHU2MDUwX3dyaXRlX2FjY2VsX3NjYWxlKHN0cnVjdCBpbnZfbXB1NjA1MF9zdGF0ZSAqc3QsIGludCB2YWwpCiB7Ci0JaW50IHJlc3VsdDsKKwlpbnQgcmVzdWx0LCBpOwogCXU4IGQ7CiAKLQlpZiAoZnMgPCAwIHx8IGZzID4gSU5WX01QVTYwNTBfTUFYX0FDQ0xfRlNfUEFSQU0pCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChmcyA9PSBzdC0+Y2hpcF9jb25maWcuYWNjbF9mcykKLQkJcmV0dXJuIDA7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWNjZWxfc2NhbGUpOyArK2kpIHsKKwkJaWYgKGFjY2VsX3NjYWxlW2ldID09IHZhbCkgeworCQkJZCA9IChpIDw8IElOVl9NUFU2MDUwX0FDQ0xfQ09ORklHX0ZTUl9TSElGVCk7CisJCQlyZXN1bHQgPSBpbnZfbXB1NjA1MF93cml0ZV9yZWcoc3QsCisJCQkJCXN0LT5yZWctPmFjY2xfY29uZmlnLCBkKTsKKwkJCWlmIChyZXN1bHQpCisJCQkJcmV0dXJuIHJlc3VsdDsKIAotCWQgPSAoZnMgPDwgSU5WX01QVTYwNTBfQUNDTF9DT05GSUdfRlNSX1NISUZUKTsKLQlyZXN1bHQgPSBpbnZfbXB1NjA1MF93cml0ZV9yZWcoc3QsIHN0LT5yZWctPmFjY2xfY29uZmlnLCBkKTsKLQlpZiAocmVzdWx0KQotCQlyZXR1cm4gcmVzdWx0OwotCXN0LT5jaGlwX2NvbmZpZy5hY2NsX2ZzID0gZnM7CisJCQlzdC0+Y2hpcF9jb25maWcuYWNjbF9mcyA9IGk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KIAotCXJldHVybiAwOworCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgaW50IGludl9tcHU2MDUwX3dyaXRlX3JhdyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LApAQCAtNDcxLDEwICs0NzUsMTAgQEAKIAljYXNlIElJT19DSEFOX0lORk9fU0NBTEU6CiAJCXN3aXRjaCAoY2hhbi0+dHlwZSkgewogCQljYXNlIElJT19BTkdMX1ZFTDoKLQkJCXJlc3VsdCA9IGludl9tcHU2MDUwX3dyaXRlX2ZzcihzdCwgdmFsKTsKKwkJCXJlc3VsdCA9IGludl9tcHU2MDUwX3dyaXRlX2d5cm9fc2NhbGUoc3QsIHZhbDIpOwogCQkJYnJlYWs7CiAJCWNhc2UgSUlPX0FDQ0VMOgotCQkJcmVzdWx0ID0gaW52X21wdTYwNTBfd3JpdGVfYWNjZWxfZnMoc3QsIHZhbCk7CisJCQlyZXN1bHQgPSBpbnZfbXB1NjA1MF93cml0ZV9hY2NlbF9zY2FsZShzdCwgdmFsMik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXJlc3VsdCA9IC1FSU5WQUw7CkBAIC04MjUsOCArODI5LDE0IEBACiAJCWdvdG8gb3V0X3VucmVnX2RldmljZTsKIAl9CiAKKwlyZXN1bHQgPSBpbnZfbXB1X2FjcGlfY3JlYXRlX211eF9jbGllbnQoc3QpOworCWlmIChyZXN1bHQpCisJCWdvdG8gb3V0X2RlbF9tdXg7CisKIAlyZXR1cm4gMDsKIAorb3V0X2RlbF9tdXg6CisJaTJjX2RlbF9tdXhfYWRhcHRlcihzdC0+bXV4X2FkYXB0ZXIpOwogb3V0X3VucmVnX2RldmljZToKIAlpaW9fZGV2aWNlX3VucmVnaXN0ZXIoaW5kaW9fZGV2KTsKIG91dF9yZW1vdmVfdHJpZ2dlcjoKQEAgLTg0MSw2ICs4NTEsNyBAQAogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAlzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAorCWludl9tcHVfYWNwaV9kZWxldGVfbXV4X2NsaWVudChzdCk7CiAJaTJjX2RlbF9tdXhfYWRhcHRlcihzdC0+bXV4X2FkYXB0ZXIpOwogCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOwogCWludl9tcHU2MDUwX3JlbW92ZV90cmlnZ2VyKHN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X2lpby5oIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKaW5kZXggYWE4MzdkZS4uZGIwYTRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKKysrIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfaWlvLmgKQEAgLTEyMSw2ICsxMjEsNyBAQAogCXNwaW5sb2NrX3QgdGltZV9zdGFtcF9sb2NrOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IGkyY19hZGFwdGVyICptdXhfYWRhcHRlcjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbXV4X2NsaWVudDsKIAl1bnNpZ25lZCBpbnQgcG93ZXJ1cF9jb3VudDsKIAlzdHJ1Y3QgaW52X21wdTYwNTBfcGxhdGZvcm1fZGF0YSBwbGF0X2RhdGE7CiAJREVDTEFSRV9LRklGTyh0aW1lc3RhbXBzLCBsb25nIGxvbmcsIFRJTUVTVEFNUF9GSUZPX1NJWkUpOwpAQCAtMjUxLDMgKzI1Miw1IEBACiBpbnQgaW52X21wdTYwNTBfc3dpdGNoX2VuZ2luZShzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0LCBib29sIGVuLCB1MzIgbWFzayk7CiBpbnQgaW52X21wdTYwNTBfd3JpdGVfcmVnKHN0cnVjdCBpbnZfbXB1NjA1MF9zdGF0ZSAqc3QsIGludCByZWcsIHU4IHZhbCk7CiBpbnQgaW52X21wdTYwNTBfc2V0X3Bvd2VyX2l0ZyhzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0LCBib29sIHBvd2VyX29uKTsKK2ludCBpbnZfbXB1X2FjcGlfY3JlYXRlX211eF9jbGllbnQoc3RydWN0IGludl9tcHU2MDUwX3N0YXRlICpzdCk7Cit2b2lkIGludl9tcHVfYWNwaV9kZWxldGVfbXV4X2NsaWVudChzdHJ1Y3QgaW52X21wdTYwNTBfc3RhdGUgKnN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X3JpbmcuYyBiL2RyaXZlcnMvaWlvL2ltdS9pbnZfbXB1NjA1MC9pbnZfbXB1X3JpbmcuYwppbmRleCAwY2QzMDZhLi5iYTI3ZTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbXUvaW52X21wdTYwNTAvaW52X21wdV9yaW5nLmMKKysrIGIvZHJpdmVycy9paW8vaW11L2ludl9tcHU2MDUwL2ludl9tcHVfcmluZy5jCkBAIC0yNCw2ICsyNCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlICJpbnZfbXB1X2lpby5oIgogCitzdGF0aWMgdm9pZCBpbnZfY2xlYXJfa2ZpZm8oc3RydWN0IGludl9tcHU2MDUwX3N0YXRlICpzdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogdGFrZSB0aGUgc3BpbiBsb2NrIHNlbSB0byBhdm9pZCBpbnRlcnJ1cHQga2ljayBpbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzdC0+dGltZV9zdGFtcF9sb2NrLCBmbGFncyk7CisJa2ZpZm9fcmVzZXQoJnN0LT50aW1lc3RhbXBzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdC0+dGltZV9zdGFtcF9sb2NrLCBmbGFncyk7Cit9CisKIGludCBpbnZfcmVzZXRfZmlmbyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCWludCByZXN1bHQ7CkBAIC01MCw2ICs2MCwxMCBAQAogCQkJCQlJTlZfTVBVNjA1MF9CSVRfRklGT19SU1QpOwogCWlmIChyZXN1bHQpCiAJCWdvdG8gcmVzZXRfZmlmb19mYWlsOworCisJLyogY2xlYXIgdGltZXN0YW1wcyBmaWZvICovCisJaW52X2NsZWFyX2tmaWZvKHN0KTsKKwogCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KIAlpZiAoc3QtPmNoaXBfY29uZmlnLmFjY2xfZmlmb19lbmFibGUgfHwKIAkgICAgc3QtPmNoaXBfY29uZmlnLmd5cm9fZmlmb19lbmFibGUpIHsKQEAgLTgzLDE2ICs5Nyw2IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHZvaWQgaW52X2NsZWFyX2tmaWZvKHN0cnVjdCBpbnZfbXB1NjA1MF9zdGF0ZSAqc3QpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIHRha2UgdGhlIHNwaW4gbG9jayBzZW0gdG8gYXZvaWQgaW50ZXJydXB0IGtpY2sgaW4gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3QtPnRpbWVfc3RhbXBfbG9jaywgZmxhZ3MpOwotCWtmaWZvX3Jlc2V0KCZzdC0+dGltZXN0YW1wcyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3QtPnRpbWVfc3RhbXBfbG9jaywgZmxhZ3MpOwotfQotCiAvKioKICAqIGludl9tcHU2MDUwX2lycV9oYW5kbGVyKCkgLSBDYWNoZSBhIHRpbWVzdGFtcCBhdCBlYWNoIGRhdGEgcmVhZHkgaW50ZXJydXB0LgogICovCkBAIC0xODQsNyArMTg4LDYgQEAKIGZsdXNoX2ZpZm86CiAJLyogRmx1c2ggSFcgYW5kIFNXIEZJRk9zLiAqLwogCWludl9yZXNldF9maWZvKGluZGlvX2Rldik7Ci0JaW52X2NsZWFyX2tmaWZvKHN0KTsKIAltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2ltdS9rbXg2MS5jIGIvZHJpdmVycy9paW8vaW11L2tteDYxLmMKaW5kZXggNWNjMzY5Mi4uNDYyYTAxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vaW11L2tteDYxLmMKKysrIGIvZHJpdmVycy9paW8vaW11L2tteDYxLmMKQEAgLTE2OSwxOSArMTY5LDE4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAlpbnQgdmFsOwogCWludCB2YWwyOwotCXU4IG9kcl9iaXRzOwotfSBrbXg2MV9zYW1wX2ZyZXFfdGFibGVbXSA9IHsgezEyLCA1MDAwMDAsIDB4MDB9LAotCQkJezI1LCAwLCAweDAxfSwKLQkJCXs1MCwgMCwgMHgwMn0sCi0JCQl7MTAwLCAwLCAweDAzfSwKLQkJCXsyMDAsIDAsIDB4MDR9LAotCQkJezQwMCwgMCwgMHgwNX0sCi0JCQl7ODAwLCAwLCAweDA2fSwKLQkJCXsxNjAwLCAwLCAweDA3fSwKLQkJCXswLCA3ODEwMDAsIDB4MDh9LAotCQkJezEsIDU2MzAwMCwgMHgwOX0sCi0JCQl7MywgMTI1MDAwLCAweDBBfSwKLQkJCXs2LCAyNTAwMDAsIDB4MEJ9IH07Cit9IGtteDYxX3NhbXBfZnJlcV90YWJsZVtdID0geyB7MTIsIDUwMDAwMH0sCisJCQl7MjUsIDB9LAorCQkJezUwLCAwfSwKKwkJCXsxMDAsIDB9LAorCQkJezIwMCwgMH0sCisJCQl7NDAwLCAwfSwKKwkJCXs4MDAsIDB9LAorCQkJezE2MDAsIDB9LAorCQkJezAsIDc4MTAwMH0sCisJCQl7MSwgNTYzMDAwfSwKKwkJCXszLCAxMjUwMDB9LAorCQkJezYsIDI1MDAwMH0gfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJaW50IHZhbDsKQEAgLTMwMiwyNCArMzAxLDEwIEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoa214NjFfc2FtcF9mcmVxX3RhYmxlKTsgaSsrKQogCQlpZiAodmFsID09IGtteDYxX3NhbXBfZnJlcV90YWJsZVtpXS52YWwgJiYKIAkJICAgIHZhbDIgPT0ga214NjFfc2FtcF9mcmVxX3RhYmxlW2ldLnZhbDIpCi0JCQlyZXR1cm4ga214NjFfc2FtcF9mcmVxX3RhYmxlW2ldLm9kcl9iaXRzOworCQkJcmV0dXJuIGk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQga214NjFfY29udmVydF9iaXRfdG9fZnJlcSh1OCBvZHJfYml0cywgaW50ICp2YWwsIGludCAqdmFsMikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGtteDYxX3NhbXBfZnJlcV90YWJsZSk7IGkrKykKLQkJaWYgKG9kcl9iaXRzID09IGtteDYxX3NhbXBfZnJlcV90YWJsZVtpXS5vZHJfYml0cykgewotCQkJKnZhbCA9IGtteDYxX3NhbXBfZnJlcV90YWJsZVtpXS52YWw7Ci0JCQkqdmFsMiA9IGtteDYxX3NhbXBfZnJlcV90YWJsZVtpXS52YWwyOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotCiBzdGF0aWMgaW50IGtteDYxX2NvbnZlcnRfd2FrZV91cF9vZHJfdG9fYml0KGludCB2YWwsIGludCB2YWwyKQogewogCWludCBpOwpAQCAtNDc4LDcgKzQ2Myw3IEBACiAKIHN0YXRpYyBpbnQga214NjFfZ2V0X29kcihzdHJ1Y3Qga214NjFfZGF0YSAqZGF0YSwgaW50ICp2YWwsIGludCAqdmFsMiwKIAkJCSB1OCBkZXZpY2UpCi17CWludCBpOworewogCXU4IGxvZHJfYml0czsKIAogCWlmIChkZXZpY2UgJiBLTVg2MV9BQ0MpCkBAIC00OTAsMTMgKzQ3NSwxMyBAQAogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShrbXg2MV9zYW1wX2ZyZXFfdGFibGUpOyBpKyspCi0JCWlmIChsb2RyX2JpdHMgPT0ga214NjFfc2FtcF9mcmVxX3RhYmxlW2ldLm9kcl9iaXRzKSB7Ci0JCQkqdmFsID0ga214NjFfc2FtcF9mcmVxX3RhYmxlW2ldLnZhbDsKLQkJCSp2YWwyID0ga214NjFfc2FtcF9mcmVxX3RhYmxlW2ldLnZhbDI7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCXJldHVybiAtRUlOVkFMOworCWlmIChsb2RyX2JpdHMgPj0gQVJSQVlfU0laRShrbXg2MV9zYW1wX2ZyZXFfdGFibGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSp2YWwgPSBrbXg2MV9zYW1wX2ZyZXFfdGFibGVbbG9kcl9iaXRzXS52YWw7CisJKnZhbDIgPSBrbXg2MV9zYW1wX2ZyZXFfdGFibGVbbG9kcl9iaXRzXS52YWwyOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQga214NjFfc2V0X3JhbmdlKHN0cnVjdCBrbXg2MV9kYXRhICpkYXRhLCB1OCByYW5nZSkKQEAgLTU4MCw4ICs1NjUsMTEgQEAKIAl9CiAJZGF0YS0+b2RyX2JpdHMgPSByZXQ7CiAKLQkvKiBzZXQgb3V0cHV0IGRhdGEgcmF0ZSBmb3Igd2FrZSB1cCAobW90aW9uIGRldGVjdGlvbikgZnVuY3Rpb24gKi8KLQlyZXQgPSBrbXg2MV9jb252ZXJ0X2JpdF90b19mcmVxKGRhdGEtPm9kcl9iaXRzLCAmdmFsLCAmdmFsMik7CisJLyoKKwkgKiBzZXQgb3V0cHV0IGRhdGEgcmF0ZSBmb3Igd2FrZSB1cCAobW90aW9uIGRldGVjdGlvbikgZnVuY3Rpb24KKwkgKiB0byBtYXRjaCBkYXRhIHJhdGUgZm9yIGFjY2VsZXJvbWV0ZXIgc2FtcGxpbmcKKwkgKi8KKwlyZXQgPSBrbXg2MV9nZXRfb2RyKGRhdGEsICZ2YWwsICZ2YWwyLCBLTVg2MV9BQ0MpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0xMjI3LDcgKzEyMTUsNyBAQAogCQliYXNlID0gS01YNjFfTUFHX1hPVVRfTDsKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwotCWZvcl9lYWNoX3NldF9iaXQoYml0LCBpbmRpb19kZXYtPmJ1ZmZlci0+c2Nhbl9tYXNrLAorCWZvcl9lYWNoX3NldF9iaXQoYml0LCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssCiAJCQkgaW5kaW9fZGV2LT5tYXNrbGVuZ3RoKSB7CiAJCXJldCA9IGtteDYxX3JlYWRfbWVhc3VyZW1lbnQoZGF0YSwgYmFzZSwgYml0KTsKIAkJaWYgKHJldCA8IDApIHsKQEAgLTEyNjcsMTYgKzEyNTUsMTIgQEAKIAlkZXYgPSAmY2xpZW50LT5kZXY7CiAKIAkvKiBkYXRhIHJlYWR5IGdwaW8gaW50ZXJydXB0IHBpbiAqLwotCWdwaW8gPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsIEtNWDYxX0dQSU9fTkFNRSwgMCk7CisJZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4KGRldiwgS01YNjFfR1BJT19OQU1FLCAwLCBHUElPRF9JTik7CiAJaWYgKElTX0VSUihncGlvKSkgewogCQlkZXZfZXJyKGRldiwgImFjcGkgZ3BpbyBnZXQgaW5kZXggZmFpbGVkXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIoZ3Bpbyk7CiAJfQogCi0JcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX2lucHV0KGdwaW8pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlyZXQgPSBncGlvZF90b19pcnEoZ3Bpbyk7CiAKIAlkZXZfZGJnKGRldiwgIkdQSU8gcmVzb3VyY2UsIG5vOiVkIGlycTolZFxuIiwgZGVzY190b19ncGlvKGdwaW8pLCByZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWJ1ZmZlci5jCmluZGV4IDcxMzMzMTQuLmRmOTE5ZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1idWZmZXIuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tYnVmZmVyLmMKQEAgLTM3LDExICszNyw1NyBAQAogCXJldHVybiAhbGlzdF9lbXB0eSgmYnVmLT5idWZmZXJfbGlzdCk7CiB9CiAKLXN0YXRpYyBib29sIGlpb19idWZmZXJfZGF0YV9hdmFpbGFibGUoc3RydWN0IGlpb19idWZmZXIgKmJ1ZikKK3N0YXRpYyBzaXplX3QgaWlvX2J1ZmZlcl9kYXRhX2F2YWlsYWJsZShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmKQogewogCXJldHVybiBidWYtPmFjY2Vzcy0+ZGF0YV9hdmFpbGFibGUoYnVmKTsKIH0KIAorc3RhdGljIGludCBpaW9fYnVmZmVyX2ZsdXNoX2h3ZmlmbyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAorCQkJCSAgIHN0cnVjdCBpaW9fYnVmZmVyICpidWYsIHNpemVfdCByZXF1aXJlZCkKK3sKKwlpZiAoIWluZGlvX2Rldi0+aW5mby0+aHdmaWZvX2ZsdXNoX3RvX2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gaW5kaW9fZGV2LT5pbmZvLT5od2ZpZm9fZmx1c2hfdG9fYnVmZmVyKGluZGlvX2RldiwgcmVxdWlyZWQpOworfQorCitzdGF0aWMgYm9vbCBpaW9fYnVmZmVyX3JlYWR5KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsIHN0cnVjdCBpaW9fYnVmZmVyICpidWYsCisJCQkgICAgIHNpemVfdCB0b193YWl0LCBpbnQgdG9fZmx1c2gpCit7CisJc2l6ZV90IGF2YWlsOworCWludCBmbHVzaGVkID0gMDsKKworCS8qIHdha2V1cCBpZiB0aGUgZGV2aWNlIHdhcyB1bnJlZ2lzdGVyZWQgKi8KKwlpZiAoIWluZGlvX2Rldi0+aW5mbykKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBkcmFpbiB0aGUgYnVmZmVyIGlmIGl0IHdhcyBkaXNhYmxlZCAqLworCWlmICghaWlvX2J1ZmZlcl9pc19hY3RpdmUoYnVmKSkgeworCQl0b193YWl0ID0gbWluX3Qoc2l6ZV90LCB0b193YWl0LCAxKTsKKwkJdG9fZmx1c2ggPSAwOworCX0KKworCWF2YWlsID0gaWlvX2J1ZmZlcl9kYXRhX2F2YWlsYWJsZShidWYpOworCisJaWYgKGF2YWlsID49IHRvX3dhaXQpIHsKKwkJLyogZm9yY2UgYSBmbHVzaCBmb3Igbm9uLWJsb2NraW5nIHJlYWRzICovCisJCWlmICghdG9fd2FpdCAmJiAhYXZhaWwgJiYgdG9fZmx1c2gpCisJCQlpaW9fYnVmZmVyX2ZsdXNoX2h3ZmlmbyhpbmRpb19kZXYsIGJ1ZiwgdG9fZmx1c2gpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlpZiAodG9fZmx1c2gpCisJCWZsdXNoZWQgPSBpaW9fYnVmZmVyX2ZsdXNoX2h3ZmlmbyhpbmRpb19kZXYsIGJ1ZiwKKwkJCQkJCSAgdG9fd2FpdCAtIGF2YWlsKTsKKwlpZiAoZmx1c2hlZCA8PSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoYXZhaWwgKyBmbHVzaGVkID49IHRvX3dhaXQpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiAvKioKICAqIGlpb19idWZmZXJfcmVhZF9maXJzdF9uX291dGVyKCkgLSBjaHJkZXYgcmVhZCBmb3IgYnVmZmVyIGFjY2VzcwogICoKQEAgLTUzLDYgKzk5LDkgQEAKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpaW9fYnVmZmVyICpyYiA9IGluZGlvX2Rldi0+YnVmZmVyOworCXNpemVfdCBkYXR1bV9zaXplOworCXNpemVfdCB0b193YWl0ID0gMDsKKwlzaXplX3QgdG9fcmVhZDsKIAlpbnQgcmV0OwogCiAJaWYgKCFpbmRpb19kZXYtPmluZm8pCkBAIC02MSwxOSArMTEwLDI4IEBACiAJaWYgKCFyYiB8fCAhcmItPmFjY2Vzcy0+cmVhZF9maXJzdF9uKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRvIHsKLQkJaWYgKCFpaW9fYnVmZmVyX2RhdGFfYXZhaWxhYmxlKHJiKSkgewotCQkJaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQotCQkJCXJldHVybiAtRUFHQUlOOworCWRhdHVtX3NpemUgPSByYi0+Ynl0ZXNfcGVyX2RhdHVtOwogCi0JCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUocmItPnBvbGxxLAotCQkJCQlpaW9fYnVmZmVyX2RhdGFfYXZhaWxhYmxlKHJiKSB8fAotCQkJCQlpbmRpb19kZXYtPmluZm8gPT0gTlVMTCk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCQlpZiAoaW5kaW9fZGV2LT5pbmZvID09IE5VTEwpCi0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCX0KKwkvKgorCSAqIElmIGRhdHVtX3NpemUgaXMgMCB0aGVyZSB3aWxsIG5ldmVyIGJlIGFueXRoaW5nIHRvIHJlYWQgZnJvbSB0aGUKKwkgKiBidWZmZXIsIHNvIHNpZ25hbCBlbmQgb2YgZmlsZSBub3cuCisJICovCisJaWYgKCFkYXR1bV9zaXplKQorCQlyZXR1cm4gMDsKKworCXRvX3JlYWQgPSBtaW5fdChzaXplX3QsIG4gLyBkYXR1bV9zaXplLCByYi0+d2F0ZXJtYXJrKTsKKworCWlmICghKGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJdG9fd2FpdCA9IHRvX3JlYWQ7CisKKwlkbyB7CisJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShyYi0+cG9sbHEsCisJCQlpaW9fYnVmZmVyX3JlYWR5KGluZGlvX2RldiwgcmIsIHRvX3dhaXQsIHRvX3JlYWQpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKCFpbmRpb19kZXYtPmluZm8pCisJCQlyZXR1cm4gLUVOT0RFVjsKIAogCQlyZXQgPSByYi0+YWNjZXNzLT5yZWFkX2ZpcnN0X24ocmIsIG4sIGJ1Zik7CiAJCWlmIChyZXQgPT0gMCAmJiAoZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQpAQCAtOTYsOSArMTU0LDggQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlwb2xsX3dhaXQoZmlscCwgJnJiLT5wb2xscSwgd2FpdCk7Ci0JaWYgKGlpb19idWZmZXJfZGF0YV9hdmFpbGFibGUocmIpKQorCWlmIChpaW9fYnVmZmVyX3JlYWR5KGluZGlvX2RldiwgcmIsIHJiLT53YXRlcm1hcmssIDApKQogCQlyZXR1cm4gUE9MTElOIHwgUE9MTFJETk9STTsKLQkvKiBuZWVkIGEgd2F5IG9mIGtub3dpbmcgaWYgdGhlcmUgbWF5IGJlIGVub3VnaCBkYXRhLi4uICovCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyMyw2ICsxODAsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZidWZmZXItPmJ1ZmZlcl9saXN0KTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZidWZmZXItPnBvbGxxKTsKIAlrcmVmX2luaXQoJmJ1ZmZlci0+cmVmKTsKKwlidWZmZXItPndhdGVybWFyayA9IDE7CiB9CiBFWFBPUlRfU1lNQk9MKGlpb19idWZmZXJfaW5pdCk7CiAKQEAgLTQxNiw2ICs0NzQsMTEgQEAKIAkJYnVmZmVyLT5hY2Nlc3MtPnNldF9sZW5ndGgoYnVmZmVyLCB2YWwpOwogCQlyZXQgPSAwOwogCX0KKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwlpZiAoYnVmZmVyLT5sZW5ndGggJiYgYnVmZmVyLT5sZW5ndGggPCBidWZmZXItPndhdGVybWFyaykKKwkJYnVmZmVyLT53YXRlcm1hcmsgPSBidWZmZXItPmxlbmd0aDsKK291dDoKIAltdXRleF91bmxvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCiAJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKQEAgLTQ3Miw2ICs1MzUsNyBAQAogc3RhdGljIHZvaWQgaWlvX2J1ZmZlcl9kZWFjdGl2YXRlKHN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIpCiB7CiAJbGlzdF9kZWxfaW5pdCgmYnVmZmVyLT5idWZmZXJfbGlzdCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZidWZmZXItPnBvbGxxKTsKIAlpaW9fYnVmZmVyX3B1dChidWZmZXIpOwogfQogCkBAIC02MjksMTkgKzY5MywxNiBAQAogCQl9CiAJfQogCS8qIERlZmluaXRlbHkgcG9zc2libGUgZm9yIGRldmljZXMgdG8gc3VwcG9ydCBib3RoIG9mIHRoZXNlLiAqLwotCWlmIChpbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCkgewotCQlpZiAoIWluZGlvX2Rldi0+dHJpZykgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiQnVmZmVyIG5vdCBzdGFydGVkOiBubyB0cmlnZ2VyXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkvKiBDYW4gb25seSBvY2N1ciBvbiBmaXJzdCBidWZmZXIgKi8KLQkJCWdvdG8gZXJyb3JfcnVuX3Bvc3RkaXNhYmxlOwotCQl9CisJaWYgKChpbmRpb19kZXYtPm1vZGVzICYgSU5ESU9fQlVGRkVSX1RSSUdHRVJFRCkgJiYgaW5kaW9fZGV2LT50cmlnKSB7CiAJCWluZGlvX2Rldi0+Y3VycmVudG1vZGUgPSBJTkRJT19CVUZGRVJfVFJJR0dFUkVEOwogCX0gZWxzZSBpZiAoaW5kaW9fZGV2LT5tb2RlcyAmIElORElPX0JVRkZFUl9IQVJEV0FSRSkgewogCQlpbmRpb19kZXYtPmN1cnJlbnRtb2RlID0gSU5ESU9fQlVGRkVSX0hBUkRXQVJFOwogCX0gZWxzZSBpZiAoaW5kaW9fZGV2LT5tb2RlcyAmIElORElPX0JVRkZFUl9TT0ZUV0FSRSkgewogCQlpbmRpb19kZXYtPmN1cnJlbnRtb2RlID0gSU5ESU9fQlVGRkVSX1NPRlRXQVJFOwogCX0gZWxzZSB7IC8qIFNob3VsZCBuZXZlciBiZSByZWFjaGVkICovCisJCS8qIENhbiBvbmx5IG9jY3VyIG9uIGZpcnN0IGJ1ZmZlciAqLworCQlpZiAoaW5kaW9fZGV2LT5tb2RlcyAmIElORElPX0JVRkZFUl9UUklHR0VSRUQpCisJCQlwcl9pbmZvKCJCdWZmZXIgbm90IHN0YXJ0ZWQ6IG5vIHRyaWdnZXJcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycm9yX3J1bl9wb3N0ZGlzYWJsZTsKIAl9CkBAIC03NTQsMTIgKzgxNSw2OCBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpb19zY2FuX2VsZW1lbnRzX2dyb3VwX25hbWUgPSAic2Nhbl9lbGVtZW50cyI7CiAKK3N0YXRpYyBzc2l6ZV90IGlpb19idWZmZXJfc2hvd193YXRlcm1hcmsoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CisJc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciA9IGluZGlvX2Rldi0+YnVmZmVyOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIGJ1ZmZlci0+d2F0ZXJtYXJrKTsKK30KKworc3RhdGljIHNzaXplX3QgaWlvX2J1ZmZlcl9zdG9yZV93YXRlcm1hcmsoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJICBzaXplX3QgbGVuKQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOworCXN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIgPSBpbmRpb19kZXYtPmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91aW50KGJ1ZiwgMTAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKCF2YWwpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlpZiAodmFsID4gYnVmZmVyLT5sZW5ndGgpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGlpb19idWZmZXJfaXNfYWN0aXZlKGluZGlvX2Rldi0+YnVmZmVyKSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWJ1ZmZlci0+d2F0ZXJtYXJrID0gdmFsOworCisJaWYgKGluZGlvX2Rldi0+aW5mby0+aHdmaWZvX3NldF93YXRlcm1hcmspCisJCWluZGlvX2Rldi0+aW5mby0+aHdmaWZvX3NldF93YXRlcm1hcmsoaW5kaW9fZGV2LCB2YWwpOworb3V0OgorCW11dGV4X3VubG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CisKKwlyZXR1cm4gcmV0ID8gcmV0IDogbGVuOworfQorCiBzdGF0aWMgREVWSUNFX0FUVFIobGVuZ3RoLCBTX0lSVUdPIHwgU19JV1VTUiwgaWlvX2J1ZmZlcl9yZWFkX2xlbmd0aCwKIAkJICAgaWlvX2J1ZmZlcl93cml0ZV9sZW5ndGgpOwogc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGRldl9hdHRyX2xlbmd0aF9ybyA9IF9fQVRUUihsZW5ndGgsCiAJU19JUlVHTywgaWlvX2J1ZmZlcl9yZWFkX2xlbmd0aCwgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoZW5hYmxlLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJICAgaWlvX2J1ZmZlcl9zaG93X2VuYWJsZSwgaWlvX2J1ZmZlcl9zdG9yZV9lbmFibGUpOworc3RhdGljIERFVklDRV9BVFRSKHdhdGVybWFyaywgU19JUlVHTyB8IFNfSVdVU1IsCisJCSAgIGlpb19idWZmZXJfc2hvd193YXRlcm1hcmssIGlpb19idWZmZXJfc3RvcmVfd2F0ZXJtYXJrKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmlpb19idWZmZXJfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfbGVuZ3RoLmF0dHIsCisJJmRldl9hdHRyX2VuYWJsZS5hdHRyLAorCSZkZXZfYXR0cl93YXRlcm1hcmsuYXR0ciwKK307CiAKIGludCBpaW9fYnVmZmVyX2FsbG9jX3N5c2ZzX2FuZF9tYXNrKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CkBAIC03NzgsMjEgKzg5NSwyMyBAQAogCQkJYXR0cmNvdW50Kys7CiAJfQogCi0JYnVmZmVyLT5idWZmZXJfZ3JvdXAubmFtZSA9ICJidWZmZXIiOwotCWJ1ZmZlci0+YnVmZmVyX2dyb3VwLmF0dHJzID0ga2NhbGxvYyhhdHRyY291bnQgKyAzLAotCQkJc2l6ZW9mKCpidWZmZXItPmJ1ZmZlcl9ncm91cC5hdHRycyksIEdGUF9LRVJORUwpOwotCWlmICghYnVmZmVyLT5idWZmZXJfZ3JvdXAuYXR0cnMpCisJYXR0ciA9IGtjYWxsb2MoYXR0cmNvdW50ICsgQVJSQVlfU0laRShpaW9fYnVmZmVyX2F0dHJzKSArIDEsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGF0dHJpYnV0ZSAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhdHRyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChidWZmZXItPmFjY2Vzcy0+c2V0X2xlbmd0aCkKLQkJYnVmZmVyLT5idWZmZXJfZ3JvdXAuYXR0cnNbMF0gPSAmZGV2X2F0dHJfbGVuZ3RoLmF0dHI7Ci0JZWxzZQotCQlidWZmZXItPmJ1ZmZlcl9ncm91cC5hdHRyc1swXSA9ICZkZXZfYXR0cl9sZW5ndGhfcm8uYXR0cjsKLQlidWZmZXItPmJ1ZmZlcl9ncm91cC5hdHRyc1sxXSA9ICZkZXZfYXR0cl9lbmFibGUuYXR0cjsKKwltZW1jcHkoYXR0ciwgaWlvX2J1ZmZlcl9hdHRycywgc2l6ZW9mKGlpb19idWZmZXJfYXR0cnMpKTsKKwlpZiAoIWJ1ZmZlci0+YWNjZXNzLT5zZXRfbGVuZ3RoKQorCQlhdHRyWzBdID0gJmRldl9hdHRyX2xlbmd0aF9yby5hdHRyOworCiAJaWYgKGJ1ZmZlci0+YXR0cnMpCi0JCW1lbWNweSgmYnVmZmVyLT5idWZmZXJfZ3JvdXAuYXR0cnNbMl0sIGJ1ZmZlci0+YXR0cnMsCi0JCQlzaXplb2YoKiZidWZmZXItPmJ1ZmZlcl9ncm91cC5hdHRycykgKiBhdHRyY291bnQpOwotCWJ1ZmZlci0+YnVmZmVyX2dyb3VwLmF0dHJzW2F0dHJjb3VudCsyXSA9IE5VTEw7CisJCW1lbWNweSgmYXR0cltBUlJBWV9TSVpFKGlpb19idWZmZXJfYXR0cnMpXSwgYnVmZmVyLT5hdHRycywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYXR0cmlidXRlICopICogYXR0cmNvdW50KTsKKworCWF0dHJbYXR0cmNvdW50ICsgQVJSQVlfU0laRShpaW9fYnVmZmVyX2F0dHJzKV0gPSBOVUxMOworCisJYnVmZmVyLT5idWZmZXJfZ3JvdXAubmFtZSA9ICJidWZmZXIiOworCWJ1ZmZlci0+YnVmZmVyX2dyb3VwLmF0dHJzID0gYXR0cjsKIAogCWluZGlvX2Rldi0+Z3JvdXBzW2luZGlvX2Rldi0+Z3JvdXBjb3VudGVyKytdID0gJmJ1ZmZlci0+YnVmZmVyX2dyb3VwOwogCkBAIC05MzcsOCArMTA1NiwxOCBAQAogc3RhdGljIGludCBpaW9fcHVzaF90b19idWZmZXIoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlciwgY29uc3Qgdm9pZCAqZGF0YSkKIHsKIAljb25zdCB2b2lkICpkYXRhb3V0ID0gaWlvX2RlbXV4KGJ1ZmZlciwgZGF0YSk7CisJaW50IHJldDsKIAotCXJldHVybiBidWZmZXItPmFjY2Vzcy0+c3RvcmVfdG8oYnVmZmVyLCBkYXRhb3V0KTsKKwlyZXQgPSBidWZmZXItPmFjY2Vzcy0+c3RvcmVfdG8oYnVmZmVyLCBkYXRhb3V0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBXZSBjYW4ndCBqdXN0IHRlc3QgZm9yIHdhdGVybWFyayB0byBkZWNpZGUgaWYgd2Ugd2FrZSB0aGUgcG9sbCBxdWV1ZQorCSAqIGJlY2F1c2UgcmVhZCBtYXkgcmVxdWVzdCBsZXNzIHNhbXBsZXMgdGhhbiB0aGUgd2F0ZXJtYXJrLgorCSAqLworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9wb2xsKCZidWZmZXItPnBvbGxxLCBQT0xMSU4gfCBQT0xMUkROT1JNKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgaWlvX2J1ZmZlcl9kZW11eF9mcmVlKHN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jIGIvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWNvcmUuYwppbmRleCBhYWJhOWQzLi40ZGY5N2Y2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tY29yZS5jCisrKyBiL2RyaXZlcnMvaWlvL2luZHVzdHJpYWxpby1jb3JlLmMKQEAgLTg0Nyw4ICs4NDcsNyBAQAogICogQGF0dHJfbGlzdDogTGlzdCBvZiBJSU8gZGV2aWNlIGF0dHJpYnV0ZXMKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBlYWNoIG9mIHRoZSBJSU8gZGV2aWNlCi0gKiBhdHRyaWJ1dGVzIGluIHRoZSBsaXN0LiBOb3RlOiBpZiB5b3Ugd2FudCB0byByZXVzZSB0aGUgbGlzdCBhZnRlciBjYWxsaW5nCi0gKiB0aGlzIGZ1bmN0aW9uIHlvdSBoYXZlIHRvIHJlaW5pdGlhbGl6ZSBpdCB1c2luZyBJTklUX0xJU1RfSEVBRCgpLgorICogYXR0cmlidXRlcyBpbiB0aGUgbGlzdC4KICAqLwogdm9pZCBpaW9fZnJlZV9jaGFuX2RldmF0dHJfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICphdHRyX2xpc3QpCiB7CkBAIC04NTYsNiArODU1LDcgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCBhdHRyX2xpc3QsIGwpIHsKIAkJa2ZyZWUocC0+ZGV2X2F0dHIuYXR0ci5uYW1lKTsKKwkJbGlzdF9kZWwoJnAtPmwpOwogCQlrZnJlZShwKTsKIAl9CiB9CkBAIC05MzYsNiArOTM2LDcgQEAKIAogCWlpb19mcmVlX2NoYW5fZGV2YXR0cl9saXN0KCZpbmRpb19kZXYtPmNoYW5uZWxfYXR0cl9saXN0KTsKIAlrZnJlZShpbmRpb19kZXYtPmNoYW5fYXR0cl9ncm91cC5hdHRycyk7CisJaW5kaW9fZGV2LT5jaGFuX2F0dHJfZ3JvdXAuYXR0cnMgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBpaW9fZGV2X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2aWNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vaW5kdXN0cmlhbGlvLWV2ZW50LmMgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYwppbmRleCBhNGIzOTcwLi5hOTk2OTJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYworKysgYi9kcml2ZXJzL2lpby9pbmR1c3RyaWFsaW8tZXZlbnQuYwpAQCAtNTAwLDYgKzUwMCw3IEBACiBlcnJvcl9mcmVlX3NldHVwX2V2ZW50X2xpbmVzOgogCWlpb19mcmVlX2NoYW5fZGV2YXR0cl9saXN0KCZpbmRpb19kZXYtPmV2ZW50X2ludGVyZmFjZS0+ZGV2X2F0dHJfbGlzdCk7CiAJa2ZyZWUoaW5kaW9fZGV2LT5ldmVudF9pbnRlcmZhY2UpOworCWluZGlvX2Rldi0+ZXZlbnRfaW50ZXJmYWNlID0gTlVMTDsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9rZmlmb19idWYuYyBiL2RyaXZlcnMvaWlvL2tmaWZvX2J1Zi5jCmluZGV4IGIyYmVlYTAuLjg0N2NhNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2tmaWZvX2J1Zi5jCisrKyBiL2RyaXZlcnMvaWlvL2tmaWZvX2J1Zi5jCkBAIC04Myw5ICs4Myw2IEBACiAJcmV0ID0ga2ZpZm9faW4oJmtmLT5rZiwgZGF0YSwgMSk7CiAJaWYgKHJldCAhPSAxKQogCQlyZXR1cm4gLUVCVVNZOwotCi0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoJnItPnBvbGxxLCBQT0xMSU4gfCBQT0xMUkROT1JNKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMDksMTYgKzEwNiwxNiBAQAogCXJldHVybiBjb3BpZWQ7CiB9CiAKLXN0YXRpYyBib29sIGlpb19rZmlmb19idWZfZGF0YV9hdmFpbGFibGUoc3RydWN0IGlpb19idWZmZXIgKnIpCitzdGF0aWMgc2l6ZV90IGlpb19rZmlmb19idWZfZGF0YV9hdmFpbGFibGUoc3RydWN0IGlpb19idWZmZXIgKnIpCiB7CiAJc3RydWN0IGlpb19rZmlmbyAqa2YgPSBpaW9fdG9fa2ZpZm8ocik7Ci0JYm9vbCBlbXB0eTsKKwlzaXplX3Qgc2FtcGxlczsKIAogCW11dGV4X2xvY2soJmtmLT51c2VyX2xvY2spOwotCWVtcHR5ID0ga2ZpZm9faXNfZW1wdHkoJmtmLT5rZik7CisJc2FtcGxlcyA9IGtmaWZvX2xlbigma2YtPmtmKTsKIAltdXRleF91bmxvY2soJmtmLT51c2VyX2xvY2spOwogCi0JcmV0dXJuICFlbXB0eTsKKwlyZXR1cm4gc2FtcGxlczsKIH0KIAogc3RhdGljIHZvaWQgaWlvX2tmaWZvX2J1ZmZlcl9yZWxlYXNlKHN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC9LY29uZmlnIGIvZHJpdmVycy9paW8vbGlnaHQvS2NvbmZpZwppbmRleCBhMjI0YWZkLi4wMWExYTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC9LY29uZmlnCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L0tjb25maWcKQEAgLTU5LDYgKzU5LDE2IEBACiAJIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6CiAJIHRoZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY20zMjMyLgogCitjb25maWcgQ00zMzIzCisJZGVwZW5kcyBvbiBJMkMKKwl0cmlzdGF0ZSAiQ2FwZWxsYSBDTTMzMjMgY29sb3IgbGlnaHQgc2Vuc29yIgorCWhlbHAKKwkgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBidWlsZCBhIGRyaXZlciBmb3IgQ2FwZWxhIENNMzMyMworCSBjb2xvciBzZW5zb3IuCisKKwkgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJIGJlIGNhbGxlZCBjbTMzMjMuCisKIGNvbmZpZyBDTTM2NjUxCiAJZGVwZW5kcyBvbiBJMkMKIAl0cmlzdGF0ZSAiQ00zNjY1MSBkcml2ZXIiCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC9NYWtlZmlsZSBiL2RyaXZlcnMvaWlvL2xpZ2h0L01ha2VmaWxlCmluZGV4IGIxMmE1MTYuLmFkN2MzMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2xpZ2h0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L01ha2VmaWxlCkBAIC04LDYgKzgsNyBAQAogb2JqLSQoQ09ORklHX0FQRFM5MzAwKQkJKz0gYXBkczkzMDAubwogb2JqLSQoQ09ORklHX0NNMzIxODEpCQkrPSBjbTMyMTgxLm8KIG9iai0kKENPTkZJR19DTTMyMzIpCQkrPSBjbTMyMzIubworb2JqLSQoQ09ORklHX0NNMzMyMykJCSs9IGNtMzMyMy5vCiBvYmotJChDT05GSUdfQ00zNjY1MSkJCSs9IGNtMzY2NTEubwogb2JqLSQoQ09ORklHX0dQMkFQMDIwQTAwRikJKz0gZ3AyYXAwMjBhMDBmLm8KIG9iai0kKENPTkZJR19ISURfU0VOU09SX0FMUykJKz0gaGlkLXNlbnNvci1hbHMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvY20zMjMyLmMgYi9kcml2ZXJzL2lpby9saWdodC9jbTMyMzIuYwppbmRleCA5MGUzNTE5Li4zOWM4ZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC9jbTMyMzIuYworKysgYi9kcml2ZXJzL2lpby9saWdodC9jbTMyMzIuYwpAQCAtMzc4LDYgKzM3OCwzOSBAQAogCXt9CiB9OwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGNtMzIzMl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSk7CisJc3RydWN0IGNtMzIzMl9jaGlwICpjaGlwID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gY2hpcC0+Y2xpZW50OworCWludCByZXQ7CisKKwljaGlwLT5yZWdzX2NtZCB8PSBDTTMyMzJfQ01EX0FMU19ESVNBQkxFOworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBDTTMyMzJfUkVHX0FERFJfQ01ELAorCQkJCQljaGlwLT5yZWdzX2NtZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNtMzIzMl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKTsKKwlzdHJ1Y3QgY20zMjMyX2NoaXAgKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBjaGlwLT5jbGllbnQ7CisJaW50IHJldDsKKworCWNoaXAtPnJlZ3NfY21kICY9IH5DTTMyMzJfQ01EX0FMU19ESVNBQkxFOworCXJldCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBDTTMyMzJfUkVHX0FERFJfQ01ELAorCQkJCQljaGlwLT5yZWdzX2NtZCB8IENNMzIzMl9DTURfQUxTX1JFU0VUKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBjbTMyMzJfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGNtMzIzMl9zdXNwZW5kLCBjbTMyMzJfcmVzdW1lKX07CisjZW5kaWYKKwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGNtMzIzMl9pZCk7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNtMzIzMl9vZl9tYXRjaFtdID0gewpAQCAtMzkwLDYgKzQyMyw5IEBACiAJCS5uYW1lCT0gImNtMzIzMiIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoY20zMjMyX29mX21hdGNoKSwKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKwkJLnBtCT0gJmNtMzIzMl9wbV9vcHMsCisjZW5kaWYKIAl9LAogCS5pZF90YWJsZQk9IGNtMzIzMl9pZCwKIAkucHJvYmUJCT0gY20zMjMyX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvY20zMzIzLmMgYi9kcml2ZXJzL2lpby9saWdodC9jbTMzMjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjkwMzNlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvY20zMzIzLmMKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBDTTMzMjMgLSBDYXBlbGxhIENvbG9yIExpZ2h0IFNlbnNvcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHZlcnNpb24gMiBvZgorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4KKyAqIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBJSU8gZHJpdmVyIGZvciBDTTMzMjMgKDctYml0IEkyQyBzbGF2ZSBhZGRyZXNzIDB4MTApCisgKgorICogVE9ETzogY2FsaWJzY2FsZSB0byBjb3JyZWN0IHRoZSBsZW5zIGZhY3RvcgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL3N5c2ZzLmg+CisKKyNkZWZpbmUgQ00zMzIzX0RSVl9OQU1FICJjbTMzMjMiCisKKyNkZWZpbmUgQ00zMzIzX0NNRF9DT05GCQkweDAwCisjZGVmaW5lIENNMzMyM19DTURfUkVEX0RBVEEJMHgwOAorI2RlZmluZSBDTTMzMjNfQ01EX0dSRUVOX0RBVEEJMHgwOQorI2RlZmluZSBDTTMzMjNfQ01EX0JMVUVfREFUQQkweDBBCisjZGVmaW5lIENNMzMyM19DTURfQ0xFQVJfREFUQQkweDBCCisKKyNkZWZpbmUgQ00zMzIzX0NPTkZfU0RfQklUCUJJVCgwKSAvKiBzZW5zb3IgZGlzYWJsZSAqLworI2RlZmluZSBDTTMzMjNfQ09ORl9BRl9CSVQJQklUKDEpIC8qIGF1dG8vbWFudWFsIGZvcmNlIG1vZGUgKi8KKyNkZWZpbmUgQ00zMzIzX0NPTkZfSVRfTUFTSwkoQklUKDQpIHwgQklUKDUpIHwgQklUKDYpKQorI2RlZmluZSBDTTMzMjNfQ09ORl9JVF9TSElGVAk0CisKKyNkZWZpbmUgQ00zMzIzX0lOVF9USU1FX0FWQUlMQUJMRSAiMC4wNCAwLjA4IDAuMTYgMC4zMiAwLjY0IDEuMjgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCB2YWw7CisJaW50IHZhbDI7Cit9IGNtMzMyM19pbnRfdGltZVtdID0geworCXswLCA0MDAwMH0sICAvKiA0MCBtcyAqLworCXswLCA4MDAwMH0sICAvKiA4MCBtcyAqLworCXswLCAxNjAwMDB9LCAvKiAxNjAgbXMgKi8KKwl7MCwgMzIwMDAwfSwgLyogMzIwIG1zICovCisJezAsIDY0MDAwMH0sIC8qIDY0MCBtcyAqLworCXsxLCAyODAwMDB9LCAvKiAxMjgwIG1zICovCit9OworCitzdHJ1Y3QgY20zMzIzX2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJdTE2IHJlZ19jb25mOworCXN0cnVjdCBtdXRleCBtdXRleDsKK307CisKKyNkZWZpbmUgQ00zMzIzX0NPTE9SX0NIQU5ORUwoX2NvbG9yLCBfYWRkcikgeyBcCisJLnR5cGUgPSBJSU9fSU5URU5TSVRZLCBcCisJLm1vZGlmaWVkID0gMSwgXAorCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19SQVcpLCBcCisJLmluZm9fbWFza19zaGFyZWRfYnlfYWxsID0gQklUKElJT19DSEFOX0lORk9fSU5UX1RJTUUpLCBcCisJLmNoYW5uZWwyID0gSUlPX01PRF9MSUdIVF8jI19jb2xvciwgXAorCS5hZGRyZXNzID0gX2FkZHIsIFwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNtMzMyM19jaGFubmVsc1tdID0geworCUNNMzMyM19DT0xPUl9DSEFOTkVMKFJFRCwgQ00zMzIzX0NNRF9SRURfREFUQSksCisJQ00zMzIzX0NPTE9SX0NIQU5ORUwoR1JFRU4sIENNMzMyM19DTURfR1JFRU5fREFUQSksCisJQ00zMzIzX0NPTE9SX0NIQU5ORUwoQkxVRSwgQ00zMzIzX0NNRF9CTFVFX0RBVEEpLAorCUNNMzMyM19DT0xPUl9DSEFOTkVMKENMRUFSLCBDTTMzMjNfQ01EX0NMRUFSX0RBVEEpLAorfTsKKworc3RhdGljIElJT19DT05TVF9BVFRSX0lOVF9USU1FX0FWQUlMKENNMzMyM19JTlRfVElNRV9BVkFJTEFCTEUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY20zMzIzX2F0dHJpYnV0ZXNbXSA9IHsKKwkmaWlvX2NvbnN0X2F0dHJfaW50ZWdyYXRpb25fdGltZV9hdmFpbGFibGUuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBjbTMzMjNfYXR0cmlidXRlX2dyb3VwID0geworCS5hdHRycyA9IGNtMzMyM19hdHRyaWJ1dGVzLAorfTsKKworc3RhdGljIGludCBjbTMzMjNfaW5pdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGNtMzMyM19kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsIENNMzMyM19DTURfQ09ORik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciByZWFkaW5nIHJlZ19jb25mXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBlbmFibGUgc2Vuc29yIGFuZCBzZXQgYXV0byBmb3JjZSBtb2RlICovCisJcmV0ICY9IH4oQ00zMzIzX0NPTkZfU0RfQklUIHwgQ00zMzIzX0NPTkZfQUZfQklUKTsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoZGF0YS0+Y2xpZW50LCBDTTMzMjNfQ01EX0NPTkYsIHJldCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsICJFcnJvciB3cml0aW5nIHJlZ19jb25mXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkYXRhLT5yZWdfY29uZiA9IHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbTMzMjNfZGlzYWJsZShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IGNtMzMyM19kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJldCA9IGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoZGF0YS0+Y2xpZW50LCBDTTMzMjNfQ01EX0NPTkYsCisJCQkJCUNNMzMyM19DT05GX1NEX0JJVCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiRXJyb3Igd3JpdGluZyByZWdfY29uZlxuIik7Cit9CisKK3N0YXRpYyBpbnQgY20zMzIzX3NldF9pdF9iaXRzKHN0cnVjdCBjbTMzMjNfZGF0YSAqZGF0YSwgaW50IHZhbCwgaW50IHZhbDIpCit7CisJaW50IGksIHJldDsKKwl1MTYgcmVnX2NvbmY7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbTMzMjNfaW50X3RpbWUpOyBpKyspIHsKKwkJaWYgKHZhbCA9PSBjbTMzMjNfaW50X3RpbWVbaV0udmFsICYmCisJCSAgICB2YWwyID09IGNtMzMyM19pbnRfdGltZVtpXS52YWwyKSB7CisJCQlyZWdfY29uZiA9IGRhdGEtPnJlZ19jb25mOworCQkJcmVnX2NvbmYgfD0gaSA8PCBDTTMzMjNfQ09ORl9JVF9TSElGVDsKKworCQkJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsCisJCQkJCQkJQ00zMzIzX0NNRF9DT05GLAorCQkJCQkJCXJlZ19jb25mKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCWRhdGEtPnJlZ19jb25mID0gcmVnX2NvbmY7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBjbTMzMjNfZ2V0X2l0X2JpdHMoc3RydWN0IGNtMzMyM19kYXRhICpkYXRhKQoreworCWludCBiaXRzOworCisJYml0cyA9IChkYXRhLT5yZWdfY29uZiAmIENNMzMyM19DT05GX0lUX01BU0spID4+CisJCUNNMzMyM19DT05GX0lUX1NISUZUOworCisJaWYgKGJpdHMgPj0gQVJSQVlfU0laRShjbTMzMjNfaW50X3RpbWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gYml0czsKK30KKworc3RhdGljIGludCBjbTMzMjNfcmVhZF9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLCBpbnQgKnZhbCwKKwkJCSAgIGludCAqdmFsMiwgbG9uZyBtYXNrKQoreworCWludCBpLCByZXQ7CisJc3RydWN0IGNtMzMyM19kYXRhICpkYXRhID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19SQVc6CisJCW11dGV4X2xvY2soJmRhdGEtPm11dGV4KTsKKwkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGRhdGEtPmNsaWVudCwgY2hhbi0+YWRkcmVzcyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQltdXRleF91bmxvY2soJmRhdGEtPm11dGV4KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJKnZhbCA9IHJldDsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CisKKwkJcmV0dXJuIElJT19WQUxfSU5UOworCWNhc2UgSUlPX0NIQU5fSU5GT19JTlRfVElNRToKKwkJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOworCQlpID0gY20zMzIzX2dldF9pdF9iaXRzKGRhdGEpOworCQlpZiAoaSA8IDApIHsKKwkJCW11dGV4X3VubG9jaygmZGF0YS0+bXV0ZXgpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQkqdmFsID0gY20zMzIzX2ludF90aW1lW2ldLnZhbDsKKwkJKnZhbDIgPSBjbTMzMjNfaW50X3RpbWVbaV0udmFsMjsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CisKKwkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IGNtMzMyM193cml0ZV9yYXcoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKKwkJCSAgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwgaW50IHZhbCwKKwkJCSAgICBpbnQgdmFsMiwgbG9uZyBtYXNrKQoreworCXN0cnVjdCBjbTMzMjNfZGF0YSAqZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaW50IHJldDsKKworCXN3aXRjaCAobWFzaykgeworCWNhc2UgSUlPX0NIQU5fSU5GT19JTlRfVElNRToKKwkJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOworCQlyZXQgPSBjbTMzMjNfc2V0X2l0X2JpdHMoZGF0YSwgdmFsLCB2YWwyKTsKKwkJbXV0ZXhfdW5sb2NrKCZkYXRhLT5tdXRleCk7CisKKwkJcmV0dXJuIHJldDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gY20zMzIzX2luZm8gPSB7CisJLmRyaXZlcl9tb2R1bGUJPSBUSElTX01PRFVMRSwKKwkucmVhZF9yYXcJPSBjbTMzMjNfcmVhZF9yYXcsCisJLndyaXRlX3Jhdwk9IGNtMzMyM193cml0ZV9yYXcsCisJLmF0dHJzCQk9ICZjbTMzMjNfYXR0cmlidXRlX2dyb3VwLAorfTsKKworc3RhdGljIGludCBjbTMzMjNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgY20zMzIzX2RhdGEgKmRhdGE7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKwlpbnQgcmV0OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpkYXRhKSk7CisJaWYgKCFpbmRpb19kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGF0YSA9IGlpb19wcml2KGluZGlvX2Rldik7CisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5kaW9fZGV2KTsKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisKKwltdXRleF9pbml0KCZkYXRhLT5tdXRleCk7CisKKwlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJaW5kaW9fZGV2LT5pbmZvID0gJmNtMzMyM19pbmZvOworCWluZGlvX2Rldi0+bmFtZSA9IENNMzMyM19EUlZfTkFNRTsKKwlpbmRpb19kZXYtPmNoYW5uZWxzID0gY20zMzIzX2NoYW5uZWxzOworCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gQVJSQVlfU0laRShjbTMzMjNfY2hhbm5lbHMpOworCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKKworCXJldCA9IGNtMzMyM19pbml0KGluZGlvX2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJjbTMzMjMgY2hpcCBpbml0IGZhaWxlZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBpaW8gZGV2XG4iKTsKKwkJZ290byBlcnJfaW5pdDsKKwl9CisJcmV0dXJuIDA7CitlcnJfaW5pdDoKKwljbTMzMjNfZGlzYWJsZShpbmRpb19kZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY20zMzIzX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCWlpb19kZXZpY2VfdW5yZWdpc3RlcihpbmRpb19kZXYpOworCWNtMzMyM19kaXNhYmxlKGluZGlvX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGNtMzMyM19pZFtdID0geworCXsiY20zMzIzIiwgMH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgY20zMzIzX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGNtMzMyM19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBDTTMzMjNfRFJWX05BTUUsCisJfSwKKwkucHJvYmUJCT0gY20zMzIzX3Byb2JlLAorCS5yZW1vdmUJCT0gY20zMzIzX3JlbW92ZSwKKwkuaWRfdGFibGUJPSBjbTMzMjNfaWQsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihjbTMzMjNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiRGFuaWVsIEJhbHV0YSA8ZGFuaWVsLmJhbHV0YUBpbnRlbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNhcGVsbGEgQ00zMzIzIENvbG9yIExpZ2h0IFNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L2dwMmFwMDIwYTAwZi5jIGIvZHJpdmVycy9paW8vbGlnaHQvZ3AyYXAwMjBhMDBmLmMKaW5kZXggMjIxZWQxNi4uMzJiNjQ0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvZ3AyYXAwMjBhMDBmLmMKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvZ3AyYXAwMjBhMDBmLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogI2luY2x1ZGUgPGxpbnV4L2lpby9idWZmZXIuaD4KICNpbmNsdWRlIDxsaW51eC9paW8vZXZlbnRzLmg+CiAjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgpAQCAtOTY2LDcgKzk2Nyw2IEBACiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IHBmLT5pbmRpb19kZXY7CiAJc3RydWN0IGdwMmFwMDIwYTAwZl9kYXRhICpwcml2ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlzaXplX3QgZF9zaXplID0gMDsKLQlfX2xlMzIgbGlnaHRfbHV4OwogCWludCBpLCBvdXRfdmFsLCByZXQ7CiAKIAlmb3JfZWFjaF9zZXRfYml0KGksIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaywKQEAgLTk4MSw4ICs5ODEsOCBAQAogCQkgICAgaSA9PSBHUDJBUDAyMEEwMEZfU0NBTl9NT0RFX0xJR0hUX0lSKSB7CiAJCQlvdXRfdmFsID0gbGUxNl90b19jcHVwKChfX2xlMTYgKikmcHJpdi0+YnVmZmVyW2Rfc2l6ZV0pOwogCQkJZ3AyYXAwMjBhMDBmX291dHB1dF90b19sdXgocHJpdiwgJm91dF92YWwpOwotCQkJbGlnaHRfbHV4ID0gY3B1X3RvX2xlMzIob3V0X3ZhbCk7Ci0JCQltZW1jcHkoJnByaXYtPmJ1ZmZlcltkX3NpemVdLCAodTggKikmbGlnaHRfbHV4LCA0KTsKKworCQkJcHV0X3VuYWxpZ25lZF9sZTMyKG91dF92YWwsICZwcml2LT5idWZmZXJbZF9zaXplXSk7CiAJCQlkX3NpemUgKz0gNDsKIAkJfSBlbHNlIHsKIAkJCWRfc2l6ZSArPSAyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvaGlkLXNlbnNvci1hbHMuYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2hpZC1zZW5zb3ItYWxzLmMKaW5kZXggOTQ4YWNmYy4uMTYwOWVjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbGlnaHQvaGlkLXNlbnNvci1hbHMuYworKysgYi9kcml2ZXJzL2lpby9saWdodC9oaWQtc2Vuc29yLWFscy5jCkBAIC0xMDEsNyArMTAxLDggQEAKIAkJCSp2YWwgPSBzZW5zb3JfaHViX2lucHV0X2F0dHJfZ2V0X3Jhd192YWx1ZSgKIAkJCQkJYWxzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5oc2RldiwKIAkJCQkJSElEX1VTQUdFX1NFTlNPUl9BTFMsIGFkZHJlc3MsCi0JCQkJCXJlcG9ydF9pZCk7CisJCQkJCXJlcG9ydF9pZCwKKwkJCQkJU0VOU09SX0hVQl9TWU5DKTsKIAkJCWhpZF9zZW5zb3JfcG93ZXJfc3RhdGUoJmFsc19zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMsCiAJCQkJCQlmYWxzZSk7CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9saWdodC9oaWQtc2Vuc29yLXByb3guYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2hpZC1zZW5zb3ItcHJveC5jCmluZGV4IDNlY2Y3OWUuLjkxZWNjNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL2xpZ2h0L2hpZC1zZW5zb3ItcHJveC5jCisrKyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2hpZC1zZW5zb3ItcHJveC5jCkBAIC05Niw3ICs5Niw4IEBACiAJCQkqdmFsID0gc2Vuc29yX2h1Yl9pbnB1dF9hdHRyX2dldF9yYXdfdmFsdWUoCiAJCQkJcHJveF9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuaHNkZXYsCiAJCQkJSElEX1VTQUdFX1NFTlNPUl9QUk9YLCBhZGRyZXNzLAotCQkJCXJlcG9ydF9pZCk7CisJCQkJcmVwb3J0X2lkLAorCQkJCVNFTlNPUl9IVUJfU1lOQyk7CiAJCQloaWRfc2Vuc29yX3Bvd2VyX3N0YXRlKCZwcm94X3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywKIAkJCQkJCWZhbHNlKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL2xpZ2h0L2pzYTEyMTIuYyBiL2RyaXZlcnMvaWlvL2xpZ2h0L2pzYTEyMTIuYwppbmRleCAyOWRlN2U3Li4zYTNhZjg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC9qc2ExMjEyLmMKKysrIGIvZHJpdmVycy9paW8vbGlnaHQvanNhMTIxMi5jCkBAIC0zMDgsNyArMzA4LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBqc2ExMjEyX3JlZ21hcF9jb25maWcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcganNhMTIxMl9yZWdtYXBfY29uZmlnID0gewogCS5uYW1lID0gIEpTQTEyMTJfUkVHTUFQX05BTUUsCiAJLnJlZ19iaXRzID0gOCwKIAkudmFsX2JpdHMgPSA4LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vbGlnaHQvbHRyNTAxLmMgYi9kcml2ZXJzL2lpby9saWdodC9sdHI1MDEuYwppbmRleCA2MmI3MDcyLi43OGI4NzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lpby9saWdodC9sdHI1MDEuYworKysgYi9kcml2ZXJzL2lpby9saWdodC9sdHI1MDEuYwpAQCAtMzMzLDYgKzMzMywxMyBAQAogCQlkYXRhLT5wc19jb250cik7CiB9CiAKK3N0YXRpYyBpbnQgbHRyNTAxX3Bvd2VyZG93bihzdHJ1Y3QgbHRyNTAxX2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIGx0cjUwMV93cml0ZV9jb250cihkYXRhLT5jbGllbnQsCisJCQkJICBkYXRhLT5hbHNfY29udHIgJiB+TFRSNTAxX0NPTlRSX0FDVElWRSwKKwkJCQkgIGRhdGEtPnBzX2NvbnRyICYgfkxUUjUwMV9DT05UUl9BQ1RJVkUpOworfQorCiBzdGF0aWMgaW50IGx0cjUwMV9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC0zNzAsNyArMzc3LDcgQEAKIAlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCiAJCWx0cjUwMV90cmlnZ2VyX2hhbmRsZXIsIE5VTEwpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gcG93ZXJkb3duX29uX2Vycm9yOwogCiAJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwogCWlmIChyZXQpCkBAIC0zODAsMTYgKzM4NywxMSBAQAogCiBlcnJvcl91bnJlZ19idWZmZXI6CiAJaWlvX3RyaWdnZXJlZF9idWZmZXJfY2xlYW51cChpbmRpb19kZXYpOworcG93ZXJkb3duX29uX2Vycm9yOgorCWx0cjUwMV9wb3dlcmRvd24oZGF0YSk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBsdHI1MDFfcG93ZXJkb3duKHN0cnVjdCBsdHI1MDFfZGF0YSAqZGF0YSkKLXsKLQlyZXR1cm4gbHRyNTAxX3dyaXRlX2NvbnRyKGRhdGEtPmNsaWVudCwKLQkJZGF0YS0+YWxzX2NvbnRyICYgfkxUUjUwMV9DT05UUl9BQ1RJVkUsCi0JCWRhdGEtPnBzX2NvbnRyICYgfkxUUjUwMV9DT05UUl9BQ1RJVkUpOwotfQotCiBzdGF0aWMgaW50IGx0cjUwMV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvaGlkLXNlbnNvci1tYWduLTNkLmMgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvaGlkLXNlbnNvci1tYWduLTNkLmMKaW5kZXggZDIyOTkzYi4uNGY5YzBiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL2hpZC1zZW5zb3ItbWFnbi0zZC5jCisrKyBiL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9oaWQtc2Vuc29yLW1hZ24tM2QuYwpAQCAtMTcwLDcgKzE3MCw4IEBACiAJCQkqdmFsID0gc2Vuc29yX2h1Yl9pbnB1dF9hdHRyX2dldF9yYXdfdmFsdWUoCiAJCQkJbWFnbl9zdGF0ZS0+Y29tbW9uX2F0dHJpYnV0ZXMuaHNkZXYsCiAJCQkJSElEX1VTQUdFX1NFTlNPUl9DT01QQVNTXzNELCBhZGRyZXNzLAotCQkJCXJlcG9ydF9pZCk7CisJCQkJcmVwb3J0X2lkLAorCQkJCVNFTlNPUl9IVUJfU1lOQyk7CiAJCWVsc2UgewogCQkJKnZhbCA9IDA7CiAJCQloaWRfc2Vuc29yX3Bvd2VyX3N0YXRlKCZtYWduX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMgYi9kcml2ZXJzL2lpby9tYWduZXRvbWV0ZXIvbWFnMzExMC5jCmluZGV4IGUzMTA2YjQuLjI2MWQ1MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL21hZ25ldG9tZXRlci9tYWczMTEwLmMKKysrIGIvZHJpdmVycy9paW8vbWFnbmV0b21ldGVyL21hZzMxMTAuYwpAQCAtMzIxLDYgKzMyMSwxMiBAQAogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBtYWczMTEwX3NjYW5fbWFza3NbXSA9IHsweDcsIDB4ZiwgMH07CiAKK3N0YXRpYyBpbnQgbWFnMzExMF9zdGFuZGJ5KHN0cnVjdCBtYWczMTEwX2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBNQUczMTEwX0NUUkxfUkVHMSwKKwkJZGF0YS0+Y3RybF9yZWcxICYgfk1BRzMxMTBfQ1RSTF9BQyk7Cit9CisKIHN0YXRpYyBpbnQgbWFnMzExMF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKQEAgLTM2MCwxMiArMzY2LDEyIEBACiAJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIE1BRzMxMTBfQ1RSTF9SRUcyLAogCQlNQUczMTEwX0NUUkxfQVVUT19NUlNUX0VOKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBzdGFuZGJ5X29uX2Vycm9yOwogCiAJcmV0ID0gaWlvX3RyaWdnZXJlZF9idWZmZXJfc2V0dXAoaW5kaW9fZGV2LCBOVUxMLAogCQltYWczMTEwX3RyaWdnZXJfaGFuZGxlciwgTlVMTCk7CiAJaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJCWdvdG8gc3RhbmRieV9vbl9lcnJvcjsKIAogCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKIAlpZiAocmV0IDwgMCkKQEAgLTM3NCwxNSArMzgwLDExIEBACiAKIGJ1ZmZlcl9jbGVhbnVwOgogCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKK3N0YW5kYnlfb25fZXJyb3I6CisJbWFnMzExMF9zdGFuZGJ5KGlpb19wcml2KGluZGlvX2RldikpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbWFnMzExMF9zdGFuZGJ5KHN0cnVjdCBtYWczMTEwX2RhdGEgKmRhdGEpCi17Ci0JcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGF0YS0+Y2xpZW50LCBNQUczMTEwX0NUUkxfUkVHMSwKLQkJZGF0YS0+Y3RybF9yZWcxICYgfk1BRzMxMTBfQ1RSTF9BQyk7Ci19Ci0KIHN0YXRpYyBpbnQgbWFnMzExMF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9vcmllbnRhdGlvbi9oaWQtc2Vuc29yLWluY2wtM2QuYyBiL2RyaXZlcnMvaWlvL29yaWVudGF0aW9uL2hpZC1zZW5zb3ItaW5jbC0zZC5jCmluZGV4IDczODU0NDYuLjU5MzBmYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL29yaWVudGF0aW9uL2hpZC1zZW5zb3ItaW5jbC0zZC5jCisrKyBiL2RyaXZlcnMvaWlvL29yaWVudGF0aW9uL2hpZC1zZW5zb3ItaW5jbC0zZC5jCkBAIC0xMjQsNyArMTI0LDggQEAKIAkJCSp2YWwgPSBzZW5zb3JfaHViX2lucHV0X2F0dHJfZ2V0X3Jhd192YWx1ZSgKIAkJCQlpbmNsX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5oc2RldiwKIAkJCQlISURfVVNBR0VfU0VOU09SX0lOQ0xJTk9NRVRFUl8zRCwgYWRkcmVzcywKLQkJCQlyZXBvcnRfaWQpOworCQkJCXJlcG9ydF9pZCwKKwkJCQlTRU5TT1JfSFVCX1NZTkMpOwogCQllbHNlIHsKIAkJCWhpZF9zZW5zb3JfcG93ZXJfc3RhdGUoJmluY2xfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLAogCQkJCQkJZmFsc2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL0tjb25maWcKaW5kZXggYTNiZTUzNy4uZmE2Mjk1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvS2NvbmZpZworKysgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9LY29uZmlnCkBAIC01Miw2ICs1MiwzMyBAQAogICAgICAgICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKICAgICAgICAgICB3aWxsIGJlIGNhbGxlZCBtcGwzMTE1LgogCitjb25maWcgTVM1NjExCisJdHJpc3RhdGUgIk1lYXN1cmVtZW50IFNwZWNpYWxpdGllcyBNUzU2MTEgcHJlc3N1cmUgc2Vuc29yIGRyaXZlciIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGJ1aWxkIHN1cHBvcnQgZm9yIHRoZSBNZWFzdXJlbWVudCBTcGVjaWFsaXRpZXMKKwkgIE1TNTYxMSBwcmVzc3VyZSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yLgorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBtczU2MTFfY29yZS4KKworY29uZmlnIE1TNTYxMV9JMkMKKwl0cmlzdGF0ZSAic3VwcG9ydCBJMkMgYnVzIGNvbm5lY3Rpb24iCisJZGVwZW5kcyBvbiBJMkMgJiYgTVM1NjExCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBidWlsZCBJMkMgYnVzIHN1cHBvcnQgZm9yIE1TNTYxMS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbXM1NjExX2kyYy4KKworY29uZmlnIE1TNTYxMV9TUEkKKwl0cmlzdGF0ZSAic3VwcG9ydCBTUEkgYnVzIGNvbm5lY3Rpb24iCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIE1TNTYxMQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gYnVpbGQgU1BJIGJ1cyBzdXBwb3J0IGZvciBNUzU2MTEuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIG1zNTYxMV9zcGkuCisKIGNvbmZpZyBJSU9fU1RfUFJFU1MKIAl0cmlzdGF0ZSAiU1RNaWNyb2VsZWN0cm9uaWNzIHByZXNzdXJlIHNlbnNvciBEcml2ZXIiCiAJZGVwZW5kcyBvbiAoSTJDIHx8IFNQSV9NQVNURVIpICYmIFNZU0ZTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9NYWtlZmlsZSBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL01ha2VmaWxlCmluZGV4IDg4MDExZjIuLmE0Zjk4ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL01ha2VmaWxlCkBAIC03LDYgKzcsOSBAQAogb2JqLSQoQ09ORklHX0hJRF9TRU5TT1JfUFJFU1MpICAgKz0gaGlkLXNlbnNvci1wcmVzcy5vCiBvYmotJChDT05GSUdfTVBMMTE1KSArPSBtcGwxMTUubwogb2JqLSQoQ09ORklHX01QTDMxMTUpICs9IG1wbDMxMTUubworb2JqLSQoQ09ORklHX01TNTYxMSkgKz0gbXM1NjExX2NvcmUubworb2JqLSQoQ09ORklHX01TNTYxMV9JMkMpICs9IG1zNTYxMV9pMmMubworb2JqLSQoQ09ORklHX01TNTYxMV9TUEkpICs9IG1zNTYxMV9zcGkubwogb2JqLSQoQ09ORklHX0lJT19TVF9QUkVTUykgKz0gc3RfcHJlc3N1cmUubwogc3RfcHJlc3N1cmUteSA6PSBzdF9wcmVzc3VyZV9jb3JlLm8KIHN0X3ByZXNzdXJlLSQoQ09ORklHX0lJT19CVUZGRVIpICs9IHN0X3ByZXNzdXJlX2J1ZmZlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9oaWQtc2Vuc29yLXByZXNzLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9oaWQtc2Vuc29yLXByZXNzLmMKaW5kZXggMWFmMzE0OS4uN2JiOGQ0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vcHJlc3N1cmUvaGlkLXNlbnNvci1wcmVzcy5jCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL2hpZC1zZW5zb3ItcHJlc3MuYwpAQCAtMTAwLDcgKzEwMCw4IEBACiAJCQkqdmFsID0gc2Vuc29yX2h1Yl9pbnB1dF9hdHRyX2dldF9yYXdfdmFsdWUoCiAJCQkJcHJlc3Nfc3RhdGUtPmNvbW1vbl9hdHRyaWJ1dGVzLmhzZGV2LAogCQkJCUhJRF9VU0FHRV9TRU5TT1JfUFJFU1NVUkUsIGFkZHJlc3MsCi0JCQkJcmVwb3J0X2lkKTsKKwkJCQlyZXBvcnRfaWQsCisJCQkJU0VOU09SX0hVQl9TWU5DKTsKIAkJCWhpZF9zZW5zb3JfcG93ZXJfc3RhdGUoJnByZXNzX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcywKIAkJCQkJCWZhbHNlKTsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMS5oIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvbXM1NjExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5YzZjZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBNUzU2MTEgcHJlc3N1cmUgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIFRvbWFzeiBEdXN6eW5za2kgPHRkdXN6eW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjaWZuZGVmIF9NUzU2MTFfSAorI2RlZmluZSBfTVM1NjExX0gKKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby9paW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCisjZGVmaW5lIE1TNTYxMV9SRVNFVAkJCTB4MWUKKyNkZWZpbmUgTVM1NjExX1JFQURfQURDCQkJMHgwMAorI2RlZmluZSBNUzU2MTFfUkVBRF9QUk9NX1dPUkQJCTB4QTAKKyNkZWZpbmUgTVM1NjExX1NUQVJUX1RFTVBfQ09OVgkJMHg1OAorI2RlZmluZSBNUzU2MTFfU1RBUlRfUFJFU1NVUkVfQ09OVgkweDQ4CisKKyNkZWZpbmUgTVM1NjExX0NPTlZfVElNRV9NSU4JCTkwNDAKKyNkZWZpbmUgTVM1NjExX0NPTlZfVElNRV9NQVgJCTEwMDAwCisKKyNkZWZpbmUgTVM1NjExX1BST01fV09SRFNfTkIJCTgKKworc3RydWN0IG1zNTYxMV9zdGF0ZSB7CisJdm9pZCAqY2xpZW50OworCXN0cnVjdCBtdXRleCBsb2NrOworCisJaW50ICgqcmVzZXQpKHN0cnVjdCBkZXZpY2UgKmRldik7CisJaW50ICgqcmVhZF9wcm9tX3dvcmQpKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGluZGV4LCB1MTYgKndvcmQpOworCWludCAoKnJlYWRfYWRjX3RlbXBfYW5kX3ByZXNzdXJlKShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgczMyICp0ZW1wLCBzMzIgKnByZXNzdXJlKTsKKworCXUxNiBwcm9tW01TNTYxMV9QUk9NX1dPUkRTX05CXTsKK307CisKK2ludCBtczU2MTFfcHJvYmUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KTsKKworI2VuZGlmIC8qIF9NUzU2MTFfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJlc3N1cmUvbXM1NjExX2NvcmUuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMV9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyYzg1MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMV9jb3JlLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBNUzU2MTEgcHJlc3N1cmUgYW5kIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIFRvbWFzeiBEdXN6eW5za2kgPHRkdXN6eW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIERhdGEgc2hlZXQ6CisgKiAgaHR0cDovL3d3dy5tZWFzLXNwZWMuY29tL2Rvd25sb2Fkcy9NUzU2MTEtMDFCQTAzLnBkZgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJtczU2MTEuaCIKKworc3RhdGljIGJvb2wgbXM1NjExX3Byb21faXNfdmFsaWQodTE2ICpwcm9tLCBzaXplX3QgbGVuKQoreworCWludCBpLCBqOworCXVpbnQxNl90IGNyYyA9IDAsIGNyY19vcmlnID0gcHJvbVs3XSAmIDB4MDAwRjsKKworCXByb21bN10gJj0gMHhGRjAwOworCisJZm9yIChpID0gMDsgaSA8IGxlbiAqIDI7IGkrKykgeworCQlpZiAoaSAlIDIgPT0gMSkKKwkJCWNyYyBePSBwcm9tW2kgPj4gMV0gJiAweDAwRkY7CisJCWVsc2UKKwkJCWNyYyBePSBwcm9tW2kgPj4gMV0gPj4gODsKKworCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQlpZiAoY3JjICYgMHg4MDAwKQorCQkJCWNyYyA9IChjcmMgPDwgMSkgXiAweDMwMDA7CisJCQllbHNlCisJCQkJY3JjIDw8PSAxOworCQl9CisJfQorCisJY3JjID0gKGNyYyA+PiAxMikgJiAweDAwMEY7CisKKwlyZXR1cm4gY3JjX29yaWcgIT0gMHgwMDAwICYmIGNyYyA9PSBjcmNfb3JpZzsKK30KKworc3RhdGljIGludCBtczU2MTFfcmVhZF9wcm9tKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCit7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3QgbXM1NjExX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVM1NjExX1BST01fV09SRFNfTkI7IGkrKykgeworCQlyZXQgPSBzdC0+cmVhZF9wcm9tX3dvcmQoJmluZGlvX2Rldi0+ZGV2LCBpLCAmc3QtPnByb21baV0pOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmaW5kaW9fZGV2LT5kZXYsCisJCQkJImZhaWxlZCB0byByZWFkIHByb20gYXQgJWRcbiIsIGkpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWlmICghbXM1NjExX3Byb21faXNfdmFsaWQoc3QtPnByb20sIE1TNTYxMV9QUk9NX1dPUkRTX05CKSkgeworCQlkZXZfZXJyKCZpbmRpb19kZXYtPmRldiwgIlBST00gaW50ZWdyaXR5IGNoZWNrIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zNTYxMV9yZWFkX3RlbXBfYW5kX3ByZXNzdXJlKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJCSBzMzIgKnRlbXAsIHMzMiAqcHJlc3N1cmUpCit7CisJaW50IHJldDsKKwlzMzIgdCwgcDsKKwlzNjQgb2ZmLCBzZW5zLCBkdDsKKwlzdHJ1Y3QgbXM1NjExX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlyZXQgPSBzdC0+cmVhZF9hZGNfdGVtcF9hbmRfcHJlc3N1cmUoJmluZGlvX2Rldi0+ZGV2LCAmdCwgJnApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmluZGlvX2Rldi0+ZGV2LAorCQkJImZhaWxlZCB0byByZWFkIHRlbXBlcmF0dXJlIGFuZCBwcmVzc3VyZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZHQgPSB0IC0gKHN0LT5wcm9tWzVdIDw8IDgpOworCW9mZiA9ICgoczY0KXN0LT5wcm9tWzJdIDw8IDE2KSArICgoc3QtPnByb21bNF0gKiBkdCkgPj4gNyk7CisJc2VucyA9ICgoczY0KXN0LT5wcm9tWzFdIDw8IDE1KSArICgoc3QtPnByb21bM10gKiBkdCkgPj4gOCk7CisKKwl0ID0gMjAwMCArICgoc3QtPnByb21bNl0gKiBkdCkgPj4gMjMpOworCWlmICh0IDwgMjAwMCkgeworCQlzNjQgb2ZmMiwgc2VuczIsIHQyOworCisJCXQyID0gKGR0ICogZHQpID4+IDMxOworCQlvZmYyID0gKDUgKiAodCAtIDIwMDApICogKHQgLSAyMDAwKSkgPj4gMTsKKwkJc2VuczIgPSBvZmYyID4+IDE7CisKKwkJaWYgKHQgPCAtMTUwMCkgeworCQkJczY0IHRtcCA9ICh0ICsgMTUwMCkgKiAodCArIDE1MDApOworCisJCQlvZmYyICs9IDcgKiB0bXA7CisJCQlzZW5zMiArPSAoMTEgKiB0bXApID4+IDE7CisJCX0KKworCQl0IC09IHQyOworCQlvZmYgLT0gb2ZmMjsKKwkJc2VucyAtPSBzZW5zMjsKKwl9CisKKwkqdGVtcCA9IHQ7CisJKnByZXNzdXJlID0gKCgocCAqIHNlbnMpID4+IDIxKSAtIG9mZikgPj4gMTU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtczU2MTFfcmVzZXQoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBtczU2MTFfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKworCXJldCA9IHN0LT5yZXNldCgmaW5kaW9fZGV2LT5kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmluZGlvX2Rldi0+ZGV2LCAiZmFpbGVkIHRvIHJlc2V0IGRldmljZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJdXNsZWVwX3JhbmdlKDMwMDAsIDQwMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXM1NjExX3JlYWRfcmF3KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkgICBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyBjb25zdCAqY2hhbiwKKwkJCSAgIGludCAqdmFsLCBpbnQgKnZhbDIsIGxvbmcgbWFzaykKK3sKKwlpbnQgcmV0OworCXMzMiB0ZW1wLCBwcmVzc3VyZTsKKwlzdHJ1Y3QgbXM1NjExX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CisKKwlzd2l0Y2ggKG1hc2spIHsKKwljYXNlIElJT19DSEFOX0lORk9fUFJPQ0VTU0VEOgorCQltdXRleF9sb2NrKCZzdC0+bG9jayk7CisJCXJldCA9IG1zNTYxMV9yZWFkX3RlbXBfYW5kX3ByZXNzdXJlKGluZGlvX2RldiwKKwkJCQkJCSAgICAmdGVtcCwgJnByZXNzdXJlKTsKKwkJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlzd2l0Y2ggKGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBJSU9fVEVNUDoKKwkJCSp2YWwgPSB0ZW1wICogMTA7CisJCQlyZXR1cm4gSUlPX1ZBTF9JTlQ7CisJCWNhc2UgSUlPX1BSRVNTVVJFOgorCQkJKnZhbCA9IHByZXNzdXJlIC8gMTAwMDsKKwkJCSp2YWwyID0gKHByZXNzdXJlICUgMTAwMCkgKiAxMDAwOworCQkJcmV0dXJuIElJT19WQUxfSU5UX1BMVVNfTUlDUk87CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlpb19jaGFuX3NwZWMgbXM1NjExX2NoYW5uZWxzW10gPSB7CisJeworCQkudHlwZSA9IElJT19QUkVTU1VSRSwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1BST0NFU1NFRCkgfAorCQkJQklUKElJT19DSEFOX0lORk9fU0NBTEUpCisJfSwKKwl7CisJCS50eXBlID0gSUlPX1RFTVAsCisJCS5pbmZvX21hc2tfc2VwYXJhdGUgPSBCSVQoSUlPX0NIQU5fSU5GT19QUk9DRVNTRUQpIHwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKQorCX0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWlvX2luZm8gbXM1NjExX2luZm8gPSB7CisJLnJlYWRfcmF3ID0gJm1zNTYxMV9yZWFkX3JhdywKKwkuZHJpdmVyX21vZHVsZSA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBtczU2MTFfaW5pdChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQoreworCWludCByZXQ7CisKKwlyZXQgPSBtczU2MTFfcmVzZXQoaW5kaW9fZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBtczU2MTFfcmVhZF9wcm9tKGluZGlvX2Rldik7Cit9CisKK2ludCBtczU2MTFfcHJvYmUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rldiwgc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCisJbXV0ZXhfaW5pdCgmc3QtPmxvY2spOworCWluZGlvX2Rldi0+ZGV2LnBhcmVudCA9IGRldjsKKwlpbmRpb19kZXYtPm5hbWUgPSBkZXYtPmRyaXZlci0+bmFtZTsKKwlpbmRpb19kZXYtPmluZm8gPSAmbXM1NjExX2luZm87CisJaW5kaW9fZGV2LT5jaGFubmVscyA9IG1zNTYxMV9jaGFubmVsczsKKwlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUobXM1NjExX2NoYW5uZWxzKTsKKwlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CisKKwlyZXQgPSBtczU2MTFfaW5pdChpbmRpb19kZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGRldm1faWlvX2RldmljZV9yZWdpc3RlcihkZXYsIGluZGlvX2Rldik7Cit9CitFWFBPUlRfU1lNQk9MKG1zNTYxMV9wcm9iZSk7CisKK01PRFVMRV9BVVRIT1IoIlRvbWFzeiBEdXN6eW5za2kgPHRkdXN6eW5zQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVM1NjExIGNvcmUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTFfaTJjLmMgYi9kcml2ZXJzL2lpby9wcmVzc3VyZS9tczU2MTFfaTJjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4ZmQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMV9pMmMuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIE1TNTYxMSBwcmVzc3VyZSBhbmQgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciAoSTJDIGJ1cykKKyAqCisgKiBDb3B5cmlnaHQgKGMpIFRvbWFzeiBEdXN6eW5za2kgPHRkdXN6eW5zQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIDctYml0IEkyQyBzbGF2ZSBhZGRyZXNzZXM6CisgKgorICogMHg3NyAoQ1NCIHBpbiBsb3cpCisgKiAweDc2IChDU0IgcGluIGhpZ2gpCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAibXM1NjExLmgiCisKK3N0YXRpYyBpbnQgbXM1NjExX2kyY19yZXNldChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfdG9faWlvX2RldihkZXYpKTsKKworCXJldHVybiBpMmNfc21idXNfd3JpdGVfYnl0ZShzdC0+Y2xpZW50LCBNUzU2MTFfUkVTRVQpOworfQorCitzdGF0aWMgaW50IG1zNTYxMV9pMmNfcmVhZF9wcm9tX3dvcmQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW5kZXgsIHUxNiAqd29yZCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBtczU2MTFfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X3RvX2lpb19kZXYoZGV2KSk7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX3N3YXBwZWQoc3QtPmNsaWVudCwKKwkJCU1TNTYxMV9SRUFEX1BST01fV09SRCArIChpbmRleCA8PCAxKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqd29yZCA9IHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zNTYxMV9pMmNfcmVhZF9hZGMoc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3QsIHMzMiAqdmFsKQoreworCWludCByZXQ7CisJdTggYnVmWzNdOworCisJcmV0ID0gaTJjX3NtYnVzX3JlYWRfaTJjX2Jsb2NrX2RhdGEoc3QtPmNsaWVudCwgTVM1NjExX1JFQURfQURDLAorCQkJCQkgICAgMywgYnVmKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSp2YWwgPSAoYnVmWzBdIDw8IDE2KSB8IChidWZbMV0gPDwgOCkgfCBidWZbMl07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtczU2MTFfaTJjX3JlYWRfYWRjX3RlbXBfYW5kX3ByZXNzdXJlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCSBzMzIgKnRlbXAsIHMzMiAqcHJlc3N1cmUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXM1NjExX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl90b19paW9fZGV2KGRldikpOworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoc3QtPmNsaWVudCwgTVM1NjExX1NUQVJUX1RFTVBfQ09OVik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl1c2xlZXBfcmFuZ2UoTVM1NjExX0NPTlZfVElNRV9NSU4sIE1TNTYxMV9DT05WX1RJTUVfTUFYKTsKKworCXJldCA9IG1zNTYxMV9pMmNfcmVhZF9hZGMoc3QsIHRlbXApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoc3QtPmNsaWVudCwgTVM1NjExX1NUQVJUX1BSRVNTVVJFX0NPTlYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJdXNsZWVwX3JhbmdlKE1TNTYxMV9DT05WX1RJTUVfTUlOLCBNUzU2MTFfQ09OVl9USU1FX01BWCk7CisKKwlyZXR1cm4gbXM1NjExX2kyY19yZWFkX2FkYyhzdCwgcHJlc3N1cmUpOworfQorCitzdGF0aWMgaW50IG1zNTYxMV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3Q7CisJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQllURSB8CisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQSB8CisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19SRUFEX0kyQ19CTE9DSykpCisJCXJldHVybiAtRU5PREVWOworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpzdCkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKKwlzdC0+cmVzZXQgPSBtczU2MTFfaTJjX3Jlc2V0OworCXN0LT5yZWFkX3Byb21fd29yZCA9IG1zNTYxMV9pMmNfcmVhZF9wcm9tX3dvcmQ7CisJc3QtPnJlYWRfYWRjX3RlbXBfYW5kX3ByZXNzdXJlID0gbXM1NjExX2kyY19yZWFkX2FkY190ZW1wX2FuZF9wcmVzc3VyZTsKKwlzdC0+Y2xpZW50ID0gY2xpZW50OworCisJcmV0dXJuIG1zNTYxMV9wcm9iZShpbmRpb19kZXYsICZjbGllbnQtPmRldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtczU2MTFfaWRbXSA9IHsKKwl7ICJtczU2MTEiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1zNTYxMV9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBtczU2MTFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zNTYxMSIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCisJLmlkX3RhYmxlID0gbXM1NjExX2lkLAorCS5wcm9iZSA9IG1zNTYxMV9pMmNfcHJvYmUsCit9OworbW9kdWxlX2kyY19kcml2ZXIobXM1NjExX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIlRvbWFzeiBEdXN6eW5za2kgPHRkdXN6eW5zQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTVM1NjExIGkyYyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMV9zcGkuYyBiL2RyaXZlcnMvaWlvL3ByZXNzdXJlL21zNTYxMV9zcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzY3MjZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9paW8vcHJlc3N1cmUvbXM1NjExX3NwaS5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogTVM1NjExIHByZXNzdXJlIGFuZCB0ZW1wZXJhdHVyZSBzZW5zb3IgZHJpdmVyIChTUEkgYnVzKQorICoKKyAqIENvcHlyaWdodCAoYykgVG9tYXN6IER1c3p5bnNraSA8dGR1c3p5bnNAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgIm1zNTYxMS5oIgorCitzdGF0aWMgaW50IG1zNTYxMV9zcGlfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXU4IGNtZCA9IE1TNTYxMV9SRVNFVDsKKwlzdHJ1Y3QgbXM1NjExX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl90b19paW9fZGV2KGRldikpOworCisJcmV0dXJuIHNwaV93cml0ZV90aGVuX3JlYWQoc3QtPmNsaWVudCwgJmNtZCwgMSwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgbXM1NjExX3NwaV9yZWFkX3Byb21fd29yZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbmRleCwgdTE2ICp3b3JkKQoreworCWludCByZXQ7CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfdG9faWlvX2RldihkZXYpKTsKKworCXJldCA9IHNwaV93OHIxNmJlKHN0LT5jbGllbnQsIE1TNTYxMV9SRUFEX1BST01fV09SRCArIChpbmRleCA8PCAxKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkqd29yZCA9IHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zNTYxMV9zcGlfcmVhZF9hZGMoc3RydWN0IGRldmljZSAqZGV2LCBzMzIgKnZhbCkKK3sKKwlpbnQgcmV0OworCXU4IGJ1ZlszXSA9IHsgTVM1NjExX1JFQURfQURDIH07CisJc3RydWN0IG1zNTYxMV9zdGF0ZSAqc3QgPSBpaW9fcHJpdihkZXZfdG9faWlvX2RldihkZXYpKTsKKworCXJldCA9IHNwaV93cml0ZV90aGVuX3JlYWQoc3QtPmNsaWVudCwgYnVmLCAxLCBidWYsIDMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKnZhbCA9IChidWZbMF0gPDwgMTYpIHwgKGJ1ZlsxXSA8PCA4KSB8IGJ1ZlsyXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zNTYxMV9zcGlfcmVhZF9hZGNfdGVtcF9hbmRfcHJlc3N1cmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJIHMzMiAqdGVtcCwgczMyICpwcmVzc3VyZSkKK3sKKwl1OCBjbWQ7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXM1NjExX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl90b19paW9fZGV2KGRldikpOworCisJY21kID0gTVM1NjExX1NUQVJUX1RFTVBfQ09OVjsKKwlyZXQgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHN0LT5jbGllbnQsICZjbWQsIDEsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJdXNsZWVwX3JhbmdlKE1TNTYxMV9DT05WX1RJTUVfTUlOLCBNUzU2MTFfQ09OVl9USU1FX01BWCk7CisKKwlyZXQgPSBtczU2MTFfc3BpX3JlYWRfYWRjKGRldiwgdGVtcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwljbWQgPSBNUzU2MTFfU1RBUlRfUFJFU1NVUkVfQ09OVjsKKwlyZXQgPSBzcGlfd3JpdGVfdGhlbl9yZWFkKHN0LT5jbGllbnQsICZjbWQsIDEsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJdXNsZWVwX3JhbmdlKE1TNTYxMV9DT05WX1RJTUVfTUlOLCBNUzU2MTFfQ09OVl9USU1FX01BWCk7CisKKwlyZXR1cm4gbXM1NjExX3NwaV9yZWFkX2FkYyhkZXYsIHByZXNzdXJlKTsKK30KKworc3RhdGljIGludCBtczU2MTFfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXM1NjExX3N0YXRlICpzdDsKKwlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2OworCisJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpzdCkpOworCWlmICghaW5kaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaS0+bW9kZSA9IFNQSV9NT0RFXzA7CisJc3BpLT5tYXhfc3BlZWRfaHogPSAyMDAwMDAwMDsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCXJldCA9IHNwaV9zZXR1cChzcGkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXN0LT5yZXNldCA9IG1zNTYxMV9zcGlfcmVzZXQ7CisJc3QtPnJlYWRfcHJvbV93b3JkID0gbXM1NjExX3NwaV9yZWFkX3Byb21fd29yZDsKKwlzdC0+cmVhZF9hZGNfdGVtcF9hbmRfcHJlc3N1cmUgPSBtczU2MTFfc3BpX3JlYWRfYWRjX3RlbXBfYW5kX3ByZXNzdXJlOworCXN0LT5jbGllbnQgPSBzcGk7CisKKwlyZXR1cm4gbXM1NjExX3Byb2JlKGluZGlvX2RldiwgJnNwaS0+ZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIG1zNTYxMV9pZFtdID0geworCXsgIm1zNTYxMSIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgbXM1NjExX2lkKTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIG1zNTYxMV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXM1NjExIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkuaWRfdGFibGUgPSBtczU2MTFfaWQsCisJLnByb2JlID0gbXM1NjExX3NwaV9wcm9iZSwKK307Cittb2R1bGVfc3BpX2RyaXZlcihtczU2MTFfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiVG9tYXN6IER1c3p5bnNraSA8dGR1c3p5bnNAZ21haWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNUzU2MTEgc3BpIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vcHJveGltaXR5L3N4OTUwMC5jIGIvZHJpdmVycy9paW8vcHJveGltaXR5L3N4OTUwMC5jCmluZGV4IDc0ZGZmNGUuLmZhNDBmNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWlvL3Byb3hpbWl0eS9zeDk1MDAuYworKysgYi9kcml2ZXJzL2lpby9wcm94aW1pdHkvc3g5NTAwLmMKQEAgLTQ5NCw3ICs0OTQsNyBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+bXV0ZXgpOwogCi0JZm9yX2VhY2hfc2V0X2JpdChiaXQsIGluZGlvX2Rldi0+YnVmZmVyLT5zY2FuX21hc2ssCisJZm9yX2VhY2hfc2V0X2JpdChiaXQsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaywKIAkJCSBpbmRpb19kZXYtPm1hc2tsZW5ndGgpIHsKIAkJcmV0ID0gc3g5NTAwX3JlYWRfcHJveGltaXR5KGRhdGEsICZpbmRpb19kZXYtPmNoYW5uZWxzW2JpdF0sCiAJCQkJCSAgICAmdmFsKTsKQEAgLTYxOCwxNiArNjE4LDEyIEBACiAJZGV2ID0gJmNsaWVudC0+ZGV2OwogCiAJLyogZGF0YSByZWFkeSBncGlvIGludGVycnVwdCBwaW4gKi8KLQlncGlvID0gZGV2bV9ncGlvZF9nZXRfaW5kZXgoZGV2LCBTWDk1MDBfR1BJT19OQU1FLCAwKTsKKwlncGlvID0gZGV2bV9ncGlvZF9nZXRfaW5kZXgoZGV2LCBTWDk1MDBfR1BJT19OQU1FLCAwLCBHUElPRF9JTik7CiAJaWYgKElTX0VSUihncGlvKSkgewogCQlkZXZfZXJyKGRldiwgImFjcGkgZ3BpbyBnZXQgaW5kZXggZmFpbGVkXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIoZ3Bpbyk7CiAJfQogCi0JcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX2lucHV0KGdwaW8pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KIAlyZXQgPSBncGlvZF90b19pcnEoZ3Bpbyk7CiAKIAlkZXZfZGJnKGRldiwgIkdQSU8gcmVzb3VyY2UsIG5vOiVkIGlycTolZFxuIiwgZGVzY190b19ncGlvKGdwaW8pLCByZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9paW8vdGVtcGVyYXR1cmUvbWx4OTA2MTQuYyBiL2RyaXZlcnMvaWlvL3RlbXBlcmF0dXJlL21seDkwNjE0LmMKaW5kZXggYzhiNmFjOC4uYTExMmZjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9paW8vdGVtcGVyYXR1cmUvbWx4OTA2MTQuYworKysgYi9kcml2ZXJzL2lpby90ZW1wZXJhdHVyZS9tbHg5MDYxNC5jCkBAIC0yLDYgKzIsNyBAQAogICogbWx4OTA2MTQuYyAtIFN1cHBvcnQgZm9yIE1lbGV4aXMgTUxYOTA2MTQgY29udGFjdGxlc3MgSVIgdGVtcGVyYXR1cmUgc2Vuc29yCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDE0IFBldGVyIE1lZXJ3YWxkIDxwbWVlcndAcG1lZXJ3Lm5ldD4KKyAqIENvcHlyaWdodCAoYykgMjAxNSBFc3NlbnNpdW0gTlYKICAqCiAgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdmVyc2lvbiAyIG9mCiAgKiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbgpAQCAtMjAsMTEgKzIxLDM1IEBACiAKICNpbmNsdWRlIDxsaW51eC9paW8vaWlvLmg+CiAKLSNkZWZpbmUgTUxYOTA2MTRfT1BfUkFNIDB4MDAKKyNkZWZpbmUgTUxYOTA2MTRfT1BfUkFNCQkweDAwCisjZGVmaW5lIE1MWDkwNjE0X09QX0VFUFJPTQkweDIwCisjZGVmaW5lIE1MWDkwNjE0X09QX1NMRUVQCTB4ZmYKIAogLyogUkFNIG9mZnNldHMgd2l0aCAxNi1iaXQgZGF0YSwgTVNCIGZpcnN0ICovCi0jZGVmaW5lIE1MWDkwNjE0X1RBIDB4MDYgLyogYW1iaWVudCB0ZW1wZXJhdHVyZSAqLwotI2RlZmluZSBNTFg5MDYxNF9UT0JKMSAweDA3IC8qIG9iamVjdCB0ZW1wZXJhdHVyZSAqLworI2RlZmluZSBNTFg5MDYxNF9SQVcxCShNTFg5MDYxNF9PUF9SQU0gfCAweDA0KSAvKiByYXcgZGF0YSBJUiBjaGFubmVsIDEgKi8KKyNkZWZpbmUgTUxYOTA2MTRfUkFXMgkoTUxYOTA2MTRfT1BfUkFNIHwgMHgwNSkgLyogcmF3IGRhdGEgSVIgY2hhbm5lbCAyICovCisjZGVmaW5lIE1MWDkwNjE0X1RBCShNTFg5MDYxNF9PUF9SQU0gfCAweDA2KSAvKiBhbWJpZW50IHRlbXBlcmF0dXJlICovCisjZGVmaW5lIE1MWDkwNjE0X1RPQkoxCShNTFg5MDYxNF9PUF9SQU0gfCAweDA3KSAvKiBvYmplY3QgMSB0ZW1wZXJhdHVyZSAqLworI2RlZmluZSBNTFg5MDYxNF9UT0JKMgkoTUxYOTA2MTRfT1BfUkFNIHwgMHgwOCkgLyogb2JqZWN0IDIgdGVtcGVyYXR1cmUgKi8KKworLyogRUVQUk9NIG9mZnNldHMgd2l0aCAxNi1iaXQgZGF0YSwgTVNCIGZpcnN0ICovCisjZGVmaW5lIE1MWDkwNjE0X0VNSVNTSVZJVFkJKE1MWDkwNjE0X09QX0VFUFJPTSB8IDB4MDQpIC8qIGVtaXNzaXZpdHkgY29ycmVjdGlvbiBjb2VmZmljaWVudCAqLworI2RlZmluZSBNTFg5MDYxNF9DT05GSUcJCShNTFg5MDYxNF9PUF9FRVBST00gfCAweDA1KSAvKiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisKKy8qIENvbnRyb2wgYml0cyBpbiBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIE1MWDkwNjE0X0NPTkZJR19JSVJfU0hJRlQgMCAvKiBJSVIgY29lZmZpY2llbnQgKi8KKyNkZWZpbmUgTUxYOTA2MTRfQ09ORklHX0lJUl9NQVNLICgweDcgPDwgTUxYOTA2MTRfQ09ORklHX0lJUl9TSElGVCkKKyNkZWZpbmUgTUxYOTA2MTRfQ09ORklHX0RVQUxfU0hJRlQgNiAvKiBzaW5nbGUgKDApIG9yIGR1YWwgKDEpIElSIHNlbnNvciAqLworI2RlZmluZSBNTFg5MDYxNF9DT05GSUdfRFVBTF9NQVNLICgxIDw8IE1MWDkwNjE0X0NPTkZJR19EVUFMX1NISUZUKQorI2RlZmluZSBNTFg5MDYxNF9DT05GSUdfRklSX1NISUZUIDggLyogRklSIGNvZWZmaWNpZW50ICovCisjZGVmaW5lIE1MWDkwNjE0X0NPTkZJR19GSVJfTUFTSyAoMHg3IDw8IE1MWDkwNjE0X0NPTkZJR19GSVJfU0hJRlQpCisjZGVmaW5lIE1MWDkwNjE0X0NPTkZJR19HQUlOX1NISUZUIDExIC8qIGdhaW4gKi8KKyNkZWZpbmUgTUxYOTA2MTRfQ09ORklHX0dBSU5fTUFTSyAoMHg3IDw8IE1MWDkwNjE0X0NPTkZJR19HQUlOX1NISUZUKQorCisvKiBUaW1pbmdzIChpbiBtcykgKi8KKyNkZWZpbmUgTUxYOTA2MTRfVElNSU5HX0VFUFJPTSAyMCAvKiB0aW1lIGZvciBFRVBST00gd3JpdGUvZXJhc2UgdG8gY29tcGxldGUgKi8KKyNkZWZpbmUgTUxYOTA2MTRfVElNSU5HX1dBS0VVUCAzNCAvKiB0aW1lIHRvIGhvbGQgU0RBIGxvdyBmb3Igd2FrZS11cCAqLworI2RlZmluZSBNTFg5MDYxNF9USU1JTkdfU1RBUlRVUCAyNTAgLyogdGltZSBiZWZvcmUgZmlyc3QgZGF0YSBhZnRlciB3YWtlLXVwICovCiAKIHN0cnVjdCBtbHg5MDYxNF9kYXRhIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwpAQCAtMzUsMjYgKzYwLDM0IEBACiAJCQkgICAgaW50ICp2YWwyLCBsb25nIG1hc2spCiB7CiAJc3RydWN0IG1seDkwNjE0X2RhdGEgKmRhdGEgPSBpaW9fcHJpdihpbmRpb19kZXYpOworCXU4IGNtZDsKIAlzMzIgcmV0OwogCiAJc3dpdGNoIChtYXNrKSB7CiAJY2FzZSBJSU9fQ0hBTl9JTkZPX1JBVzogLyogMC4wMksgLyBMU0IgKi8KIAkJc3dpdGNoIChjaGFubmVsLT5jaGFubmVsMikgewogCQljYXNlIElJT19NT0RfVEVNUF9BTUJJRU5UOgotCQkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCSAgICBNTFg5MDYxNF9PUF9SQU0gfCBNTFg5MDYxNF9UQSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OworCQkJY21kID0gTUxYOTA2MTRfVEE7CiAJCQlicmVhazsKIAkJY2FzZSBJSU9fTU9EX1RFTVBfT0JKRUNUOgotCQkJcmV0ID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGRhdGEtPmNsaWVudCwKLQkJCSAgICBNTFg5MDYxNF9PUF9SQU0gfCBNTFg5MDYxNF9UT0JKMSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlyZXR1cm4gcmV0OworCQkJc3dpdGNoIChjaGFubmVsLT5jaGFubmVsKSB7CisJCQljYXNlIDA6CisJCQkJY21kID0gTUxYOTA2MTRfVE9CSjE7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJY21kID0gTUxYOTA2MTRfVE9CSjI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQorCisJCXJldCA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShkYXRhLT5jbGllbnQsIGNtZCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAkJKnZhbCA9IHJldDsKIAkJcmV0dXJuIElJT19WQUxfSU5UOwogCWNhc2UgSUlPX0NIQU5fSU5GT19PRkZTRVQ6CkBAIC04Niw2ICsxMTksMTYgQEAKIAkJLmluZm9fbWFza19zaGFyZWRfYnlfdHlwZSA9IEJJVChJSU9fQ0hBTl9JTkZPX09GRlNFVCkgfAogCQkgICAgQklUKElJT19DSEFOX0lORk9fU0NBTEUpLAogCX0sCisJeworCQkudHlwZSA9IElJT19URU1QLAorCQkuaW5kZXhlZCA9IDEsCisJCS5tb2RpZmllZCA9IDEsCisJCS5jaGFubmVsID0gMSwKKwkJLmNoYW5uZWwyID0gSUlPX01PRF9URU1QX09CSkVDVCwKKwkJLmluZm9fbWFza19zZXBhcmF0ZSA9IEJJVChJSU9fQ0hBTl9JTkZPX1JBVyksCisJCS5pbmZvX21hc2tfc2hhcmVkX2J5X3R5cGUgPSBCSVQoSUlPX0NIQU5fSU5GT19PRkZTRVQpIHwKKwkJICAgIEJJVChJSU9fQ0hBTl9JTkZPX1NDQUxFKSwKKwl9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpaW9faW5mbyBtbHg5MDYxNF9pbmZvID0gewpAQCAtOTMsMTEgKzEzNiwyNSBAQAogCS5kcml2ZXJfbW9kdWxlID0gVEhJU19NT0RVTEUsCiB9OwogCisvKiBSZXR1cm4gMCBmb3Igc2luZ2xlIHNlbnNvciwgMSBmb3IgZHVhbCBzZW5zb3IsIDwwIG9uIGVycm9yLiAqLworc3RhdGljIGludCBtbHg5MDYxNF9wcm9iZV9udW1faXJfc2Vuc29ycyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXMzMiByZXQ7CisKKwlyZXQgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBNTFg5MDYxNF9DT05GSUcpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gKHJldCAmIE1MWDkwNjE0X0NPTkZJR19EVUFMX01BU0spID8gMSA6IDA7Cit9CisKIHN0YXRpYyBpbnQgbWx4OTA2MTRfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIAlzdHJ1Y3QgbWx4OTA2MTRfZGF0YSAqZGF0YTsKKwlpbnQgcmV0OwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX1dPUkRfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTE1LDggKzE3MiwyMSBAQAogCWluZGlvX2Rldi0+bW9kZXMgPSBJTkRJT19ESVJFQ1RfTU9ERTsKIAlpbmRpb19kZXYtPmluZm8gPSAmbWx4OTA2MTRfaW5mbzsKIAotCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBtbHg5MDYxNF9jaGFubmVsczsKLQlpbmRpb19kZXYtPm51bV9jaGFubmVscyA9IEFSUkFZX1NJWkUobWx4OTA2MTRfY2hhbm5lbHMpOworCXJldCA9IG1seDkwNjE0X3Byb2JlX251bV9pcl9zZW5zb3JzKGNsaWVudCk7CisJc3dpdGNoIChyZXQpIHsKKwljYXNlIDA6CisJCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiRm91bmQgc2luZ2xlIHNlbnNvciIpOworCQlpbmRpb19kZXYtPmNoYW5uZWxzID0gbWx4OTA2MTRfY2hhbm5lbHM7CisJCWluZGlvX2Rldi0+bnVtX2NoYW5uZWxzID0gMjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgIkZvdW5kIGR1YWwgc2Vuc29yIik7CisJCWluZGlvX2Rldi0+Y2hhbm5lbHMgPSBtbHg5MDYxNF9jaGFubmVsczsKKwkJaW5kaW9fZGV2LT5udW1fY2hhbm5lbHMgPSAzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gcmV0OworCX0KIAogCXJldHVybiBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CiB9CkBAIC0xNDYsNSArMjE2LDYgQEAKIG1vZHVsZV9pMmNfZHJpdmVyKG1seDkwNjE0X2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIlBldGVyIE1lZXJ3YWxkIDxwbWVlcndAcG1lZXJ3Lm5ldD4iKTsKK01PRFVMRV9BVVRIT1IoIlZpYW5uZXkgbGUgQ2zDqW1lbnQgZGUgU2FpbnQtTWFyY3EgPHZpYW5uZXkubGVjbGVtZW50QGVzc2Vuc2l1bS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk1lbGV4aXMgTUxYOTA2MTQgY29udGFjdGxlc3MgSVIgdGVtcGVyYXR1cmUgc2Vuc29yIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdW1lbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvdW1lbS5jCmluZGV4IGFlYzdhNmEuLjhjMDE0YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL3VtZW0uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS91bWVtLmMKQEAgLTk5LDYgKzk5LDE0IEBACiAJaWYgKGRtYXN5bmMpCiAJCWRtYV9zZXRfYXR0cihETUFfQVRUUl9XUklURV9CQVJSSUVSLCAmYXR0cnMpOwogCisJLyoKKwkgKiBJZiB0aGUgY29tYmluYXRpb24gb2YgdGhlIGFkZHIgYW5kIHNpemUgcmVxdWVzdGVkIGZvciB0aGlzIG1lbW9yeQorCSAqIHJlZ2lvbiBjYXVzZXMgYW4gaW50ZWdlciBvdmVyZmxvdywgcmV0dXJuIGVycm9yLgorCSAqLworCWlmICgoUEFHRV9BTElHTihhZGRyICsgc2l6ZSkgPD0gc2l6ZSkgfHwKKwkgICAgKFBBR0VfQUxJR04oYWRkciArIHNpemUpIDw9IGFkZHIpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwogCWlmICghY2FuX2RvX21sb2NrKCkpCiAJCXJldHVybiBFUlJfUFRSKC1FUEVSTSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9pcGF0aC9pcGF0aF9maWxlX29wcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKaW5kZXggNmQ3ZjQ1My4uNDUwZDE1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2lwYXRoL2lwYXRoX2ZpbGVfb3BzLmMKQEAgLTQwLDkgKzQwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAKICNpbmNsdWRlICJpcGF0aF9rZXJuZWwuaCIKQEAgLTUzLDE1ICs1MywxOSBAQAogc3RhdGljIGludCBpcGF0aF9jbG9zZShzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiBzdGF0aWMgc3NpemVfdCBpcGF0aF93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsCiAJCQkgICBsb2ZmX3QgKik7Ci1zdGF0aWMgc3NpemVfdCBpcGF0aF93cml0ZXYoc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgLCBsb2ZmX3QpOworc3RhdGljIHNzaXplX3QgaXBhdGhfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXBhdGhfcG9sbChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKik7CiBzdGF0aWMgaW50IGlwYXRoX21tYXAoc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogCisvKgorICogVGhpcyBpcyByZWFsbHksIHJlYWxseSB3ZWlyZCBzaGl0IC0gd3JpdGUoKSBhbmQgd3JpdGV2KCkgaGVyZQorICogaGF2ZSBjb21wbGV0ZWx5IHVucmVsYXRlZCBzZW1hbnRpY3MuICBTdWNreSB1c2VybGFuZCBBQkksCisgKiBmaWxtIGF0IDExLgorICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpcGF0aF9maWxlX29wcyA9IHsKIAkub3duZXIgPSBUSElTX01PRFVMRSwKIAkud3JpdGUgPSBpcGF0aF93cml0ZSwKLQkuYWlvX3dyaXRlID0gaXBhdGhfd3JpdGV2LAorCS53cml0ZV9pdGVyID0gaXBhdGhfd3JpdGVfaXRlciwKIAkub3BlbiA9IGlwYXRoX29wZW4sCiAJLnJlbGVhc2UgPSBpcGF0aF9jbG9zZSwKIAkucG9sbCA9IGlwYXRoX3BvbGwsCkBAIC0yNDE0LDE4ICsyNDE4LDE3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHNzaXplX3QgaXBhdGhfd3JpdGV2KHN0cnVjdCBraW9jYiAqaW9jYiwgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBkaW0sIGxvZmZfdCBvZmYpCitzdGF0aWMgc3NpemVfdCBpcGF0aF93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCXN0cnVjdCBmaWxlICpmaWxwID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgaXBhdGhfZmlsZWRhdGEgKmZwID0gZmlscC0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBpcGF0aF9wb3J0ZGF0YSAqcGQgPSBwb3J0X2ZwKGZpbHApOwogCXN0cnVjdCBpcGF0aF91c2VyX3NkbWFfcXVldWUgKnBxID0gZnAtPnBxOwogCi0JaWYgKCFkaW0pCisJaWYgKCFpdGVyX2lzX2lvdmVjKGZyb20pIHx8ICFmcm9tLT5ucl9zZWdzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBpcGF0aF91c2VyX3NkbWFfd3JpdGV2KHBkLT5wb3J0X2RkLCBwcSwgaW92LCBkaW0pOworCXJldHVybiBpcGF0aF91c2VyX3NkbWFfd3JpdGV2KHBkLT5wb3J0X2RkLCBwcSwgZnJvbS0+aW92LCBmcm9tLT5ucl9zZWdzKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbGFzcyAqaXBhdGhfY2xhc3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCmluZGV4IGM3NjE5NzEuLjU5MDQwMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCkBAIC02NCw2ICs2NCwxNCBAQAogI2RlZmluZSBHVUlEX1RCTF9CTEtfTlVNX0VOVFJJRVMgOAogI2RlZmluZSBHVUlEX1RCTF9CTEtfU0laRSAoR1VJRF9UQkxfRU5UUllfU0laRSAqIEdVSURfVEJMX0JMS19OVU1fRU5UUklFUykKIAorLyogQ291bnRlcnMgc2hvdWxkIGJlIHNhdHVyYXRlIG9uY2UgdGhleSByZWFjaCB0aGVpciBtYXhpbXVtIHZhbHVlICovCisjZGVmaW5lIEFTU0lHTl8zMkJJVF9DT1VOVEVSKGNvdW50ZXIsIHZhbHVlKSBkbyB7XAorCWlmICgodmFsdWUpID4gVTMyX01BWCkJCQkgXAorCQljb3VudGVyID0gY3B1X3RvX2JlMzIoVTMyX01BWCk7IFwKKwllbHNlCQkJCQkgXAorCQljb3VudGVyID0gY3B1X3RvX2JlMzIodmFsdWUpOwkgXAorfSB3aGlsZSAoMCkKKwogc3RydWN0IG1seDRfbWFkX3Jjdl9idWYgewogCXN0cnVjdCBpYl9ncmggZ3JoOwogCXU4IHBheWxvYWRbMjU2XTsKQEAgLTgwNiwxMCArODE0LDE0IEBACiBzdGF0aWMgdm9pZCBlZGl0X2NvdW50ZXIoc3RydWN0IG1seDRfY291bnRlciAqY250LAogCQkJCQlzdHJ1Y3QgaWJfcG1hX3BvcnRjb3VudGVycyAqcG1hX2NudCkKIHsKLQlwbWFfY250LT5wb3J0X3htaXRfZGF0YSA9IGNwdV90b19iZTMyKChiZTY0X3RvX2NwdShjbnQtPnR4X2J5dGVzKT4+MikpOwotCXBtYV9jbnQtPnBvcnRfcmN2X2RhdGEgID0gY3B1X3RvX2JlMzIoKGJlNjRfdG9fY3B1KGNudC0+cnhfYnl0ZXMpPj4yKSk7Ci0JcG1hX2NudC0+cG9ydF94bWl0X3BhY2tldHMgPSBjcHVfdG9fYmUzMihiZTY0X3RvX2NwdShjbnQtPnR4X2ZyYW1lcykpOwotCXBtYV9jbnQtPnBvcnRfcmN2X3BhY2tldHMgID0gY3B1X3RvX2JlMzIoYmU2NF90b19jcHUoY250LT5yeF9mcmFtZXMpKTsKKwlBU1NJR05fMzJCSVRfQ09VTlRFUihwbWFfY250LT5wb3J0X3htaXRfZGF0YSwKKwkJCSAgICAgKGJlNjRfdG9fY3B1KGNudC0+dHhfYnl0ZXMpID4+IDIpKTsKKwlBU1NJR05fMzJCSVRfQ09VTlRFUihwbWFfY250LT5wb3J0X3Jjdl9kYXRhLAorCQkJICAgICAoYmU2NF90b19jcHUoY250LT5yeF9ieXRlcykgPj4gMikpOworCUFTU0lHTl8zMkJJVF9DT1VOVEVSKHBtYV9jbnQtPnBvcnRfeG1pdF9wYWNrZXRzLAorCQkJICAgICBiZTY0X3RvX2NwdShjbnQtPnR4X2ZyYW1lcykpOworCUFTU0lHTl8zMkJJVF9DT1VOVEVSKHBtYV9jbnQtPnBvcnRfcmN2X3BhY2tldHMsCisJCQkgICAgIGJlNjRfdG9fY3B1KGNudC0+cnhfZnJhbWVzKSk7CiB9CiAKIHN0YXRpYyBpbnQgaWJvZV9wcm9jZXNzX21hZChzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwgaW50IG1hZF9mbGFncywgdTggcG9ydF9udW0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMKaW5kZXggYWM2ZTJiNy4uOTc2YmVhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21haW4uYwpAQCAtNTg3LDggKzU4Nyw5IEBACiAJCSgoX19iZTMyICopIG1haWxib3gtPmJ1ZilbMV0gPSBjcHVfdG9fYmUzMihjYXBfbWFzayk7CiAJfQogCi0JZXJyID0gbWx4NF9jbWQoZGV2LT5kZXYsIG1haWxib3gtPmRtYSwgcG9ydCwgMCwgTUxYNF9DTURfU0VUX1BPUlQsCi0JCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0IsIE1MWDRfQ01EX1dSQVBQRUQpOworCWVyciA9IG1seDRfY21kKGRldi0+ZGV2LCBtYWlsYm94LT5kbWEsIHBvcnQsIE1MWDRfU0VUX1BPUlRfSUJfT1BDT0RFLAorCQkgICAgICAgTUxYNF9DTURfU0VUX1BPUlQsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwKKwkJICAgICAgIE1MWDRfQ01EX1dSQVBQRUQpOwogCiAJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldi0+ZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwpAQCAtMTUyNSw4ICsxNTI2LDggQEAKIAltZW1jcHkoZ2lkcywgZ3ctPmdpZHMsIHNpemVvZiBndy0+Z2lkcyk7CiAKIAllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgTUxYNF9TRVRfUE9SVF9HSURfVEFCTEUgPDwgOCB8IGd3LT5wb3J0LAotCQkgICAgICAgMSwgTUxYNF9DTURfU0VUX1BPUlQsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwKLQkJICAgICAgIE1MWDRfQ01EX1dSQVBQRUQpOworCQkgICAgICAgTUxYNF9TRVRfUE9SVF9FVEhfT1BDT0RFLCBNTFg0X0NNRF9TRVRfUE9SVCwKKwkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwgTUxYNF9DTURfV1JBUFBFRCk7CiAJaWYgKGVycikKIAkJcHJfd2Fybigic2V0IHBvcnQgY29tbWFuZCBmYWlsZWRcbiIpOwogCWVsc2UKQEAgLTE1NjQsNyArMTU2NSw3IEBACiAJCQkJICAgIElCX0xJTktfTEFZRVJfRVRIRVJORVQpIHsKIAkJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsCiAJCQkgICAgICAgTUxYNF9TRVRfUE9SVF9HSURfVEFCTEUgPDwgOCB8IGd3LT5wb3J0LAotCQkJICAgICAgIDEsIE1MWDRfQ01EX1NFVF9QT1JULAorCQkJICAgICAgIE1MWDRfU0VUX1BPUlRfRVRIX09QQ09ERSwgTUxYNF9DTURfU0VUX1BPUlQsCiAJCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19CLAogCQkJICAgICAgIE1MWDRfQ01EX1dSQVBQRUQpOwogCQlpZiAoZXJyKQpAQCAtMjY5Nyw4ICsyNjk4LDEyIEBACiAJc3Bpbl9sb2NrX2JoKCZpYmRldi0+aWJvZS5sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgTUxYNF9NQVhfUE9SVFM7ICsraSkgewogCQlzdHJ1Y3QgbmV0X2RldmljZSAqY3Vycl9uZXRkZXYgPSBpYmRldi0+aWJvZS5uZXRkZXZzW2ldOworCQllbnVtIGliX3BvcnRfc3RhdGUgY3Vycl9wb3J0X3N0YXRlOwogCi0JCWVudW0gaWJfcG9ydF9zdGF0ZSBjdXJyX3BvcnRfc3RhdGUgPQorCQlpZiAoIWN1cnJfbmV0ZGV2KQorCQkJY29udGludWU7CisKKwkJY3Vycl9wb3J0X3N0YXRlID0KIAkJCShuZXRpZl9ydW5uaW5nKGN1cnJfbmV0ZGV2KSAmJgogCQkJIG5ldGlmX2NhcnJpZXJfb2soY3Vycl9uZXRkZXYpKSA/CiAJCQlJQl9QT1JUX0FDVElWRSA6IElCX1BPUlRfRE9XTjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L2FoLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9haC5jCmluZGV4IDM5YWIwY2EuLjY2MDgwNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L2FoLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvYWguYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvY3EuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L2NxLmMKaW5kZXggYzQ2M2U3Yi4uMmVlNmIxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvY3EuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9jcS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTWVsbGFub3ggVGVjaG5vbG9naWVzIGluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC01NzIsMTEgKzU3MiwxNSBAQAogCiBpbnQgbWx4NV9pYl9hcm1fY3Eoc3RydWN0IGliX2NxICppYmNxLCBlbnVtIGliX2NxX25vdGlmeV9mbGFncyBmbGFncykKIHsKKwlzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiA9IHRvX21kZXYoaWJjcS0+ZGV2aWNlKS0+bWRldjsKKwl2b2lkIF9faW9tZW0gKnVhcl9wYWdlID0gbWRldi0+cHJpdi51dWFyaS51YXJzWzBdLm1hcDsKKwogCW1seDVfY3FfYXJtKCZ0b19tY3EoaWJjcSktPm1jcSwKIAkJICAgIChmbGFncyAmIElCX0NRX1NPTElDSVRFRF9NQVNLKSA9PSBJQl9DUV9TT0xJQ0lURUQgPwogCQkgICAgTUxYNV9DUV9EQl9SRVFfTk9UX1NPTCA6IE1MWDVfQ1FfREJfUkVRX05PVCwKLQkJICAgIHRvX21kZXYoaWJjcS0+ZGV2aWNlKS0+bWRldi0+cHJpdi51dWFyaS51YXJzWzBdLm1hcCwKLQkJICAgIE1MWDVfR0VUX0RPT1JCRUxMX0xPQ0soJnRvX21kZXYoaWJjcS0+ZGV2aWNlKS0+bWRldi0+cHJpdi5jcV91YXJfbG9jaykpOworCQkgICAgdWFyX3BhZ2UsCisJCSAgICBNTFg1X0dFVF9ET09SQkVMTF9MT0NLKCZtZGV2LT5wcml2LmNxX3Vhcl9sb2NrKSwKKwkJICAgIHRvX21jcShpYmNxKS0+bWNxLmNvbnNfaW5kZXgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02OTcsOCArNzAxLDYgQEAKIAogCWNxLT5tY3Euc2V0X2NpX2RiICA9IGNxLT5kYi5kYjsKIAljcS0+bWNxLmFybV9kYiAgICAgPSBjcS0+ZGIuZGIgKyAxOwotCSpjcS0+bWNxLnNldF9jaV9kYiA9IDA7Ci0JKmNxLT5tY3EuYXJtX2RiICAgID0gMDsKIAljcS0+bWNxLmNxZV9zeiA9IGNxZV9zaXplOwogCiAJZXJyID0gYWxsb2NfY3FfYnVmKGRldiwgJmNxLT5idWYsIGVudHJpZXMsIGNxZV9zaXplKTsKQEAgLTc4Miw3ICs3ODQsNyBAQAogCWNxLT5jcWVfc2l6ZSA9IGNxZV9zaXplOwogCWNxYi0+Y3R4LmNxZV9zel9mbGFncyA9IGNxZV9zel90b19tbHhfc3ooY3FlX3NpemUpIDw8IDU7CiAJY3FiLT5jdHgubG9nX3N6X3Vzcl9wYWdlID0gY3B1X3RvX2JlMzIoKGlsb2cyKGVudHJpZXMpIDw8IDI0KSB8IGluZGV4KTsKLQllcnIgPSBtbHg1X3ZlY3RvcjJlcW4oZGV2LCB2ZWN0b3IsICZlcW4sICZpcnFuKTsKKwllcnIgPSBtbHg1X3ZlY3RvcjJlcW4oZGV2LT5tZGV2LCB2ZWN0b3IsICZlcW4sICZpcnFuKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9jcWI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L2Rvb3JiZWxsLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9kb29yYmVsbC5jCmluZGV4IGVjZTAyOGYuLmEwZTRlNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L2Rvb3JiZWxsLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvZG9vcmJlbGwuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbWFkLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tYWQuYwppbmRleCA2NTdhZjlhLi45Y2Y5YTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tYWQuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tYWQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbWFpbi5jCmluZGV4IGNjNGFjMWUuLjU3Yzk4MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tYWluLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTYyLDk1ICs2Miw2IEBACiAJRFJJVkVSX05BTUUgIjogTWVsbGFub3ggQ29ubmVjdC1JQiBJbmZpbmliYW5kIGRyaXZlciB2IgogCURSSVZFUl9WRVJTSU9OICIgKCIgRFJJVkVSX1JFTERBVEUgIilcbiI7CiAKLWludCBtbHg1X3ZlY3RvcjJlcW4oc3RydWN0IG1seDVfaWJfZGV2ICpkZXYsIGludCB2ZWN0b3IsIGludCAqZXFuLCBpbnQgKmlycW4pCi17Ci0Jc3RydWN0IG1seDVfZXFfdGFibGUgKnRhYmxlID0gJmRldi0+bWRldi0+cHJpdi5lcV90YWJsZTsKLQlzdHJ1Y3QgbWx4NV9lcSAqZXEsICpuOwotCWludCBlcnIgPSAtRU5PRU5UOwotCi0Jc3Bpbl9sb2NrKCZ0YWJsZS0+bG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVxLCBuLCAmZGV2LT5lcXNfbGlzdCwgbGlzdCkgewotCQlpZiAoZXEtPmluZGV4ID09IHZlY3RvcikgewotCQkJKmVxbiA9IGVxLT5lcW47Ci0JCQkqaXJxbiA9IGVxLT5pcnFuOwotCQkJZXJyID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZ0YWJsZS0+bG9jayk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGFsbG9jX2NvbXBfZXFzKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2KQotewotCXN0cnVjdCBtbHg1X2VxX3RhYmxlICp0YWJsZSA9ICZkZXYtPm1kZXYtPnByaXYuZXFfdGFibGU7Ci0JY2hhciBuYW1lW01MWDVfTUFYX0VRX05BTUVdOwotCXN0cnVjdCBtbHg1X2VxICplcSwgKm47Ci0JaW50IG5jb21wX3ZlYzsKLQlpbnQgbmVudDsKLQlpbnQgZXJyOwotCWludCBpOwotCi0JSU5JVF9MSVNUX0hFQUQoJmRldi0+ZXFzX2xpc3QpOwotCW5jb21wX3ZlYyA9IHRhYmxlLT5udW1fY29tcF92ZWN0b3JzOwotCW5lbnQgPSBNTFg1X0NPTVBfRVFfU0laRTsKLQlmb3IgKGkgPSAwOyBpIDwgbmNvbXBfdmVjOyBpKyspIHsKLQkJZXEgPSBremFsbG9jKHNpemVvZigqZXEpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFlcSkgewotCQkJZXJyID0gLUVOT01FTTsKLQkJCWdvdG8gY2xlYW47Ci0JCX0KLQotCQlzbnByaW50ZihuYW1lLCBNTFg1X01BWF9FUV9OQU1FLCAibWx4NV9jb21wJWQiLCBpKTsKLQkJZXJyID0gbWx4NV9jcmVhdGVfbWFwX2VxKGRldi0+bWRldiwgZXEsCi0JCQkJCSBpICsgTUxYNV9FUV9WRUNfQ09NUF9CQVNFLCBuZW50LCAwLAotCQkJCQkgbmFtZSwgJmRldi0+bWRldi0+cHJpdi51dWFyaS51YXJzWzBdKTsKLQkJaWYgKGVycikgewotCQkJa2ZyZWUoZXEpOwotCQkJZ290byBjbGVhbjsKLQkJfQotCQltbHg1X2liX2RiZyhkZXYsICJhbGxvY2F0ZWQgY29tcGxldGlvbiBFUU4gJWRcbiIsIGVxLT5lcW4pOwotCQllcS0+aW5kZXggPSBpOwotCQlzcGluX2xvY2soJnRhYmxlLT5sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmZXEtPmxpc3QsICZkZXYtPmVxc19saXN0KTsKLQkJc3Bpbl91bmxvY2soJnRhYmxlLT5sb2NrKTsKLQl9Ci0KLQlkZXYtPm51bV9jb21wX3ZlY3RvcnMgPSBuY29tcF92ZWM7Ci0JcmV0dXJuIDA7Ci0KLWNsZWFuOgotCXNwaW5fbG9jaygmdGFibGUtPmxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlcSwgbiwgJmRldi0+ZXFzX2xpc3QsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJmVxLT5saXN0KTsKLQkJc3Bpbl91bmxvY2soJnRhYmxlLT5sb2NrKTsKLQkJaWYgKG1seDVfZGVzdHJveV91bm1hcF9lcShkZXYtPm1kZXYsIGVxKSkKLQkJCW1seDVfaWJfd2FybihkZXYsICJmYWlsZWQgdG8gZGVzdHJveSBFUSAweCV4XG4iLCBlcS0+ZXFuKTsKLQkJa2ZyZWUoZXEpOwotCQlzcGluX2xvY2soJnRhYmxlLT5sb2NrKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJnRhYmxlLT5sb2NrKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2NvbXBfZXFzKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2KQotewotCXN0cnVjdCBtbHg1X2VxX3RhYmxlICp0YWJsZSA9ICZkZXYtPm1kZXYtPnByaXYuZXFfdGFibGU7Ci0Jc3RydWN0IG1seDVfZXEgKmVxLCAqbjsKLQotCXNwaW5fbG9jaygmdGFibGUtPmxvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlcSwgbiwgJmRldi0+ZXFzX2xpc3QsIGxpc3QpIHsKLQkJbGlzdF9kZWwoJmVxLT5saXN0KTsKLQkJc3Bpbl91bmxvY2soJnRhYmxlLT5sb2NrKTsKLQkJaWYgKG1seDVfZGVzdHJveV91bm1hcF9lcShkZXYtPm1kZXYsIGVxKSkKLQkJCW1seDVfaWJfd2FybihkZXYsICJmYWlsZWQgdG8gZGVzdHJveSBFUSAweCV4XG4iLCBlcS0+ZXFuKTsKLQkJa2ZyZWUoZXEpOwotCQlzcGluX2xvY2soJnRhYmxlLT5sb2NrKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJnRhYmxlLT5sb2NrKTsKLX0KLQogc3RhdGljIGludCBtbHg1X2liX3F1ZXJ5X2RldmljZShzdHJ1Y3QgaWJfZGV2aWNlICppYmRldiwKIAkJCQlzdHJ1Y3QgaWJfZGV2aWNlX2F0dHIgKnByb3BzKQogewpAQCAtMTI5MSwxMCArMTIwMiw2IEBACiAKIAlnZXRfZXh0X3BvcnRfY2FwcyhkZXYpOwogCi0JZXJyID0gYWxsb2NfY29tcF9lcXMoZGV2KTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9kZWFsbG9jOwotCiAJTUxYNV9JTklUX0RPT1JCRUxMX0xPQ0soJmRldi0+dWFyX2xvY2spOwogCiAJc3RybGNweShkZXYtPmliX2Rldi5uYW1lLCAibWx4NV8lZCIsIElCX0RFVklDRV9OQU1FX01BWCk7CkBAIC0xMzAzLDcgKzEyMTAsOCBAQAogCWRldi0+aWJfZGV2LmxvY2FsX2RtYV9sa2V5CT0gbWRldi0+Y2Fwcy5nZW4ucmVzZXJ2ZWRfbGtleTsKIAlkZXYtPm51bV9wb3J0cwkJPSBtZGV2LT5jYXBzLmdlbi5udW1fcG9ydHM7CiAJZGV2LT5pYl9kZXYucGh5c19wb3J0X2NudCAgICAgPSBkZXYtPm51bV9wb3J0czsKLQlkZXYtPmliX2Rldi5udW1fY29tcF92ZWN0b3JzCT0gZGV2LT5udW1fY29tcF92ZWN0b3JzOworCWRldi0+aWJfZGV2Lm51bV9jb21wX3ZlY3RvcnMgICAgPQorCQlkZXYtPm1kZXYtPnByaXYuZXFfdGFibGUubnVtX2NvbXBfdmVjdG9yczsKIAlkZXYtPmliX2Rldi5kbWFfZGV2aWNlCT0gJm1kZXYtPnBkZXYtPmRldjsKIAogCWRldi0+aWJfZGV2LnV2ZXJic19hYmlfdmVyCT0gTUxYNV9JQl9VVkVSQlNfQUJJX1ZFUlNJT047CkBAIC0xMzkwLDEzICsxMjk4LDEzIEBACiAKIAllcnIgPSBpbml0X25vZGVfZGF0YShkZXYpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX2VxczsKKwkJZ290byBlcnJfZGVhbGxvYzsKIAogCW11dGV4X2luaXQoJmRldi0+Y2FwX21hc2tfbXV0ZXgpOwogCiAJZXJyID0gY3JlYXRlX2Rldl9yZXNvdXJjZXMoJmRldi0+ZGV2cik7CiAJaWYgKGVycikKLQkJZ290byBlcnJfZXFzOworCQlnb3RvIGVycl9kZWFsbG9jOwogCiAJZXJyID0gbWx4NV9pYl9vZHBfaW5pdF9vbmUoZGV2KTsKIAlpZiAoZXJyKQpAQCAtMTQzMyw5ICsxMzQxLDYgQEAKIGVycl9yc3JjOgogCWRlc3Ryb3lfZGV2X3Jlc291cmNlcygmZGV2LT5kZXZyKTsKIAotZXJyX2VxczoKLQlmcmVlX2NvbXBfZXFzKGRldik7Ci0KIGVycl9kZWFsbG9jOgogCWliX2RlYWxsb2NfZGV2aWNlKChzdHJ1Y3QgaWJfZGV2aWNlICopZGV2KTsKIApAQCAtMTQ1MCw3ICsxMzU1LDYgQEAKIAlkZXN0cm95X3VtcmNfcmVzKGRldik7CiAJbWx4NV9pYl9vZHBfcmVtb3ZlX29uZShkZXYpOwogCWRlc3Ryb3lfZGV2X3Jlc291cmNlcygmZGV2LT5kZXZyKTsKLQlmcmVlX2NvbXBfZXFzKGRldik7CiAJaWJfZGVhbGxvY19kZXZpY2UoJmRldi0+aWJfZGV2KTsKIH0KIApAQCAtMTQ1OCw2ICsxMzYyLDcgQEAKIAkuYWRkICAgICAgICAgICAgPSBtbHg1X2liX2FkZCwKIAkucmVtb3ZlICAgICAgICAgPSBtbHg1X2liX3JlbW92ZSwKIAkuZXZlbnQgICAgICAgICAgPSBtbHg1X2liX2V2ZW50LAorCS5wcm90b2NvbAk9IE1MWDVfSU5URVJGQUNFX1BST1RPQ09MX0lCLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgbWx4NV9pYl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tZW0uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21lbS5jCmluZGV4IDYxMWE5ZmQuLjQwZGYyY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21lbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21lbS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTWVsbGFub3ggVGVjaG5vbG9naWVzIGluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tbHg1X2liLmggYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tbHg1X2liLmgKaW5kZXggODNmMjJmZS4uZGZmMWNmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbWx4NV9pYi5oCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21seDVfaWIuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtNDIxLDkgKzQyMSw3IEBACiAJc3RydWN0IGliX2RldmljZQkJaWJfZGV2OwogCXN0cnVjdCBtbHg1X2NvcmVfZGV2CQkqbWRldjsKIAlNTFg1X0RFQ0xBUkVfRE9PUkJFTExfTE9DSyh1YXJfbG9jayk7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJZXFzX2xpc3Q7CiAJaW50CQkJCW51bV9wb3J0czsKLQlpbnQJCQkJbnVtX2NvbXBfdmVjdG9yczsKIAkvKiBzZXJpYWxpemUgdXBkYXRlIG9mIGNhcGFiaWxpdHkgbWFzawogCSAqLwogCXN0cnVjdCBtdXRleAkJCWNhcF9tYXNrX211dGV4OwpAQCAtNTk0LDcgKzU5Miw2IEBACiAJCQkJCSAgc3RydWN0IGliX3Vjb250ZXh0ICpjb250ZXh0LAogCQkJCQkgIHN0cnVjdCBpYl91ZGF0YSAqdWRhdGEpOwogaW50IG1seDVfaWJfZGVhbGxvY194cmNkKHN0cnVjdCBpYl94cmNkICp4cmNkKTsKLWludCBtbHg1X3ZlY3RvcjJlcW4oc3RydWN0IG1seDVfaWJfZGV2ICpkZXYsIGludCB2ZWN0b3IsIGludCAqZXFuLCBpbnQgKmlycW4pOwogaW50IG1seDVfaWJfZ2V0X2J1Zl9vZmZzZXQodTY0IGFkZHIsIGludCBwYWdlX3NoaWZ0LCB1MzIgKm9mZnNldCk7CiBpbnQgbWx4NV9xdWVyeV9leHRfcG9ydF9jYXBzKHN0cnVjdCBtbHg1X2liX2RldiAqZGV2LCB1OCBwb3J0KTsKIGludCBtbHg1X2liX3F1ZXJ5X3BvcnQoc3RydWN0IGliX2RldmljZSAqaWJkZXYsIHU4IHBvcnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tci5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvbXIuYwppbmRleCBjZDk4MjJlLi43MWM1OTM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9tci5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L21yLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L29kcC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvb2RwLmMKaW5kZXggYTJjNTQxYy4uNTA5OWRiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvb2RwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvb2RwLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE0IE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L3FwLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9xcC5jCmluZGV4IGJlMGNkMzUuLjRkNzAyNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L3FwLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvcXAuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtNzk2LDkgKzc5Niw2IEBACiAJCWdvdG8gZXJyX2ZyZWU7CiAJfQogCi0JcXAtPmRiLmRiWzBdID0gMDsKLQlxcC0+ZGIuZGJbMV0gPSAwOwotCiAJcXAtPnNxLndyaWQgPSBrbWFsbG9jKHFwLT5zcS53cWVfY250ICogc2l6ZW9mKCpxcC0+c3Eud3JpZCksIEdGUF9LRVJORUwpOwogCXFwLT5zcS53cl9kYXRhID0ga21hbGxvYyhxcC0+c3Eud3FlX2NudCAqIHNpemVvZigqcXAtPnNxLndyX2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlxcC0+cnEud3JpZCA9IGttYWxsb2MocXAtPnJxLndxZV9jbnQgKiBzaXplb2YoKnFwLT5ycS53cmlkKSwgR0ZQX0tFUk5FTCk7CkBAIC0xMTYyLDEwICsxMTU5LDExIEBACiAJaW4gPSBremFsbG9jKHNpemVvZigqaW4pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluKQogCQlyZXR1cm47CisKIAlpZiAocXAtPnN0YXRlICE9IElCX1FQU19SRVNFVCkgewogCQltbHg1X2liX3FwX2Rpc2FibGVfcGFnZWZhdWx0cyhxcCk7CiAJCWlmIChtbHg1X2NvcmVfcXBfbW9kaWZ5KGRldi0+bWRldiwgdG9fbWx4NV9zdGF0ZShxcC0+c3RhdGUpLAotCQkJCQlNTFg1X1FQX1NUQVRFX1JTVCwgaW4sIHNpemVvZigqaW4pLCAmcXAtPm1xcCkpCisJCQkJCU1MWDVfUVBfU1RBVEVfUlNULCBpbiwgMCwgJnFwLT5tcXApKQogCQkJbWx4NV9pYl93YXJuKGRldiwgIm1seDVfaWI6IG1vZGlmeSBRUCAlMDZ4IHRvIFJFU0VUIGZhaWxlZFxuIiwKIAkJCQkgICAgIHFwLT5tcXAucXBuKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS9zcnEuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L3NycS5jCmluZGV4IDQxZmVjNjYuLjAyZDc3YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L3NycS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L3NycS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTWVsbGFub3ggVGVjaG5vbG9naWVzIGluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0xNjUsOCArMTY1LDYgQEAKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQkqc3JxLT5kYi5kYiA9IDA7Ci0KIAlpZiAobWx4NV9idWZfYWxsb2MoZGV2LT5tZGV2LCBidWZfc2l6ZSwgUEFHRV9TSVpFICogMiwgJnNycS0+YnVmKSkgewogCQltbHg1X2liX2RiZyhkZXYsICJidWYgYWxsb2MgZmFpbGVkXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L3VzZXIuaCBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg1L3VzZXIuaAppbmRleCBkMGJhMjY0Li43NmZiN2I5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NS91c2VyLmgKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDUvdXNlci5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTWVsbGFub3ggVGVjaG5vbG9naWVzIGluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9maWxlX29wcy5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZmlsZV9vcHMuYwppbmRleCA0MTkzN2M2Li45ZWE2YzQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9maWxlX29wcy5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZpbGVfb3BzLmMKQEAgLTM5LDExICszOSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogCiAjaW5jbHVkZSAicWliLmgiCiAjaW5jbHVkZSAicWliX2NvbW1vbi5oIgpAQCAtNTUsMTUgKzU1LDE5IEBACiBzdGF0aWMgaW50IHFpYl9vcGVuKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKIHN0YXRpYyBpbnQgcWliX2Nsb3NlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqKTsKIHN0YXRpYyBzc2l6ZV90IHFpYl93cml0ZShzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKLXN0YXRpYyBzc2l6ZV90IHFpYl9haW9fd3JpdGUoc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLAotCQkJICAgICB1bnNpZ25lZCBsb25nLCBsb2ZmX3QpOworc3RhdGljIHNzaXplX3QgcWliX3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcWliX3BvbGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICopOwogc3RhdGljIGludCBxaWJfbW1hcGYoc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogCisvKgorICogVGhpcyBpcyByZWFsbHksIHJlYWxseSB3ZWlyZCBzaGl0IC0gd3JpdGUoKSBhbmQgd3JpdGV2KCkgaGVyZQorICogaGF2ZSBjb21wbGV0ZWx5IHVucmVsYXRlZCBzZW1hbnRpY3MuICBTdWNreSB1c2VybGFuZCBBQkksCisgKiBmaWxtIGF0IDExLgorICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBxaWJfZmlsZV9vcHMgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLndyaXRlID0gcWliX3dyaXRlLAotCS5haW9fd3JpdGUgPSBxaWJfYWlvX3dyaXRlLAorCS53cml0ZV9pdGVyID0gcWliX3dyaXRlX2l0ZXIsCiAJLm9wZW4gPSBxaWJfb3BlbiwKIAkucmVsZWFzZSA9IHFpYl9jbG9zZSwKIAkucG9sbCA9IHFpYl9wb2xsLApAQCAtMjI0OSwxNyArMjI1MywxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IHFpYl9haW9fd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBkaW0sIGxvZmZfdCBvZmYpCitzdGF0aWMgc3NpemVfdCBxaWJfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKIAlzdHJ1Y3QgcWliX2ZpbGVkYXRhICpmcCA9IGlvY2ItPmtpX2ZpbHAtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgcWliX2N0eHRkYXRhICpyY2QgPSBjdHh0X2ZwKGlvY2ItPmtpX2ZpbHApOwogCXN0cnVjdCBxaWJfdXNlcl9zZG1hX3F1ZXVlICpwcSA9IGZwLT5wcTsKIAotCWlmICghZGltIHx8ICFwcSkKKwlpZiAoIWl0ZXJfaXNfaW92ZWMoZnJvbSkgfHwgIWZyb20tPm5yX3NlZ3MgfHwgIXBxKQogCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiBxaWJfdXNlcl9zZG1hX3dyaXRldihyY2QsIHBxLCBpb3YsIGRpbSk7CisJCQkgCisJcmV0dXJuIHFpYl91c2VyX3NkbWFfd3JpdGV2KHJjZCwgcHEsIGZyb20tPmlvdiwgZnJvbS0+bnJfc2Vncyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xhc3MgKnFpYl9jbGFzczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbWFpbi5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKaW5kZXggNThiNWFhMy4uNjU3Yjg5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMKQEAgLTg0Miw2ICs4NDIsMTMgQEAKIAlxdWV1ZV93b3JrKGlwb2liX3dvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnRfdGFzayk7CiB9CiAKK3N0YXRpYyBpbnQgaXBvaWJfZ2V0X2lmbGluayhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcG9pYl9kZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gcHJpdi0+cGFyZW50LT5pZmluZGV4OworfQorCiBzdGF0aWMgdTMyIGlwb2liX2FkZHJfaGFzaChzdHJ1Y3QgaXBvaWJfbmVpZ2hfaGFzaCAqaHRibCwgdTggKmRhZGRyKQogewogCS8qCkBAIC0xMzQxLDYgKzEzNDgsNyBAQAogCS5uZG9fc3RhcnRfeG1pdAkgCSA9IGlwb2liX3N0YXJ0X3htaXQsCiAJLm5kb190eF90aW1lb3V0CQkgPSBpcG9pYl90aW1lb3V0LAogCS5uZG9fc2V0X3J4X21vZGUJID0gaXBvaWJfc2V0X21jYXN0X2xpc3QsCisJLm5kb19nZXRfaWZsaW5rCQkgPSBpcG9pYl9nZXRfaWZsaW5rLAogfTsKIAogdm9pZCBpcG9pYl9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl92bGFuLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZsYW4uYwppbmRleCA5ZmFkN2I1Li40ZGQxMzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZsYW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX3ZsYW4uYwpAQCAtMTAyLDcgKzEwMiw2IEBACiAJfQogCiAJcHJpdi0+Y2hpbGRfdHlwZSAgPSB0eXBlOwotCXByaXYtPmRldi0+aWZsaW5rID0gcHByaXYtPmRldi0+aWZpbmRleDsKIAlsaXN0X2FkZF90YWlsKCZwcml2LT5saXN0LCAmcHByaXYtPmNoaWxkX2ludGZzKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9pbnB1dC1tdC5jIGIvZHJpdmVycy9pbnB1dC9pbnB1dC1tdC5jCmluZGV4IGNiMTUwYTEuLjU0ZmNlNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvaW5wdXQtbXQuYworKysgYi9kcml2ZXJzL2lucHV0L2lucHV0LW10LmMKQEAgLTg4LDEwICs4OCwxMyBAQAogCQkJZ290byBlcnJfbWVtOwogCX0KIAotCS8qIE1hcmsgc2xvdHMgYXMgJ3VudXNlZCcgKi8KKwkvKiBNYXJrIHNsb3RzIGFzICdpbmFjdGl2ZScgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3Nsb3RzOyBpKyspCiAJCWlucHV0X210X3NldF92YWx1ZSgmbXQtPnNsb3RzW2ldLCBBQlNfTVRfVFJBQ0tJTkdfSUQsIC0xKTsKIAorCS8qIE1hcmsgc2xvdHMgYXMgJ3VudXNlZCcgKi8KKwltdC0+ZnJhbWUgPSAxOworCiAJZGV2LT5tdCA9IG10OwogCXJldHVybiAwOwogZXJyX21lbToKQEAgLTM2NSwyNyArMzY4LDM1IEBACiAJCQkgICAgICAgaW50ICpzbG90cywgaW50IG51bV9wb3MpCiB7CiAJc3RydWN0IGlucHV0X210X3Nsb3QgKnM7Ci0JaW50ICp3ID0gbXQtPnJlZCwgKnA7CisJaW50ICp3ID0gbXQtPnJlZCwgajsKIAotCWZvciAocCA9IHNsb3RzOyBwICE9IHNsb3RzICsgbnVtX3BvczsgcCsrKQotCQkqcCA9IC0xOworCWZvciAoaiA9IDA7IGogIT0gbnVtX3BvczsgaisrKQorCQlzbG90c1tqXSA9IC0xOwogCiAJZm9yIChzID0gbXQtPnNsb3RzOyBzICE9IG10LT5zbG90cyArIG10LT5udW1fc2xvdHM7IHMrKykgewogCQlpZiAoIWlucHV0X210X2lzX2FjdGl2ZShzKSkKIAkJCWNvbnRpbnVlOwotCQlmb3IgKHAgPSBzbG90czsgcCAhPSBzbG90cyArIG51bV9wb3M7IHArKykKLQkJCWlmICgqdysrIDwgMCkKLQkJCQkqcCA9IHMgLSBtdC0+c2xvdHM7CisKKwkJZm9yIChqID0gMDsgaiAhPSBudW1fcG9zOyBqKyspIHsKKwkJCWlmICh3W2pdIDwgMCkgeworCQkJCXNsb3RzW2pdID0gcyAtIG10LT5zbG90czsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXcgKz0gbnVtX3BvczsKIAl9CiAKIAlmb3IgKHMgPSBtdC0+c2xvdHM7IHMgIT0gbXQtPnNsb3RzICsgbXQtPm51bV9zbG90czsgcysrKSB7CiAJCWlmIChpbnB1dF9tdF9pc19hY3RpdmUocykpCiAJCQljb250aW51ZTsKLQkJZm9yIChwID0gc2xvdHM7IHAgIT0gc2xvdHMgKyBudW1fcG9zOyBwKyspCi0JCQlpZiAoKnAgPCAwKSB7Ci0JCQkJKnAgPSBzIC0gbXQtPnNsb3RzOworCisJCWZvciAoaiA9IDA7IGogIT0gbnVtX3BvczsgaisrKSB7CisJCQlpZiAoc2xvdHNbal0gPCAwKSB7CisJCQkJc2xvdHNbal0gPSBzIC0gbXQtPnNsb3RzOwogCQkJCWJyZWFrOwogCQkJfQorCQl9CiAJfQogfQogCkBAIC00MzksNiArNDUwLDggQEAKICAqIHNldCB0aGUga2V5IG9uIHRoZSBmaXJzdCB1bnVzZWQgc2xvdCBhbmQgcmV0dXJuLgogICoKICAqIElmIG5vIGF2YWlsYWJsZSBzbG90IGNhbiBiZSBmb3VuZCwgLTEgaXMgcmV0dXJuZWQuCisgKiBOb3RlIHRoYXQgZm9yIHRoaXMgZnVuY3Rpb24gdG8gd29yayBwcm9wZXJseSwgaW5wdXRfbXRfc3luY19mcmFtZSgpIGhhcworICogdG8gYmUgY2FsbGVkIGF0IGVhY2ggZnJhbWUuCiAgKi8KIGludCBpbnB1dF9tdF9nZXRfc2xvdF9ieV9rZXkoc3RydWN0IGlucHV0X2RldiAqZGV2LCBpbnQga2V5KQogewpAQCAtNDUzLDcgKzQ2Niw3IEBACiAJCQlyZXR1cm4gcyAtIG10LT5zbG90czsKIAogCWZvciAocyA9IG10LT5zbG90czsgcyAhPSBtdC0+c2xvdHMgKyBtdC0+bnVtX3Nsb3RzOyBzKyspCi0JCWlmICghaW5wdXRfbXRfaXNfYWN0aXZlKHMpKSB7CisJCWlmICghaW5wdXRfbXRfaXNfYWN0aXZlKHMpICYmICFpbnB1dF9tdF9pc191c2VkKG10LCBzKSkgewogCQkJcy0+a2V5ID0ga2V5OwogCQkJcmV0dXJuIHMgLSBtdC0+c2xvdHM7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvS2NvbmZpZwppbmRleCBhODliYTdjLi4xMDZmYmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL0tjb25maWcKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9LY29uZmlnCkBAIC01ODgsNiArNTg4LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBkYXZpbmNpX2tleXNjYW4uCiAKK2NvbmZpZyBLRVlCT0FSRF9JUEFRX01JQ1JPCisJdHJpc3RhdGUgIkJ1dHRvbnMgb24gTWljcm8gU29DIChpUGFxIGgzMTAwLGgzNjAwLGgzNzAwKSIKKwlkZXBlbmRzIG9uIE1GRF9JUEFRX01JQ1JPCisJaGVscAorCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBidXR0b25zIGF0dGFjaGVkIHRvCisJICBNaWNybyBwZXJpcGhlcmFsIGNvbnRyb2xsZXIgb24gaVBBUSBoMzEwMC9oMzYwMC9oMzcwMAorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcGFxLW1pY3JvLWtleXMuCisKIGNvbmZpZyBLRVlCT0FSRF9PTUFQCiAJdHJpc3RhdGUgIlRJIE9NQVAga2V5cGFkIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAxCkBAIC02ODYsNCArNjk2LDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjYXAxMXh4LgogCitjb25maWcgS0VZQk9BUkRfQkNNCisJdHJpc3RhdGUgIkJyb2FkY29tIGtleXBhZCBkcml2ZXIiCisJZGVwZW5kcyBvbiBPRiAmJiBIQVZFX0NMSworCXNlbGVjdCBJTlBVVF9NQVRSSVhLTUFQCisJZGVmYXVsdCBBUkNIX0JDTV9DWUdOVVMKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIHVzZSBCcm9hZGNvbSBrZXlwYWQuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGJjbS1rZXlwYWQuCisKIGVuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9NYWtlZmlsZQppbmRleCA0NzA3Njc4Li5kZjI4ZDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvTWFrZWZpbGUKQEAgLTEwLDYgKzEwLDcgQEAKIG9iai0kKENPTkZJR19LRVlCT0FSRF9BTUlHQSkJCSs9IGFtaWtiZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfQVRBUkkpCQkrPSBhdGFrYmQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0FUS0JEKQkJKz0gYXRrYmQubworb2JqLSQoQ09ORklHX0tFWUJPQVJEX0JDTSkJCSs9IGJjbS1rZXlwYWQubwogb2JqLSQoQ09ORklHX0tFWUJPQVJEX0JGSU4pCQkrPSBiZjU0eC1rZXlzLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9DQVAxMVhYKQkJKz0gY2FwMTF4eC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfQ0xQUzcxMVgpCQkrPSBjbHBzNzExeC1rZXlwYWQubwpAQCAtMjMsNiArMjQsNyBAQAogb2JqLSQoQ09ORklHX0tFWUJPQVJEX1RDQTg0MTgpCQkrPSB0Y2E4NDE4X2tleXBhZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfSElMKQkJKz0gaGlsX2tiZC5vCiBvYmotJChDT05GSUdfS0VZQk9BUkRfSElMX09MRCkJCSs9IGhpbGtiZC5vCitvYmotJChDT05GSUdfS0VZQk9BUkRfSVBBUV9NSUNSTykJKz0gaXBhcS1taWNyby1rZXlzLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9JTVgpCQkrPSBpbXhfa2V5cGFkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9IUDZYWCkJCSs9IGpvcm5hZGE2ODBfa2JkLm8KIG9iai0kKENPTkZJR19LRVlCT0FSRF9IUDdYWCkJCSs9IGpvcm5hZGE3MjBfa2JkLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvYXRrYmQuYwppbmRleCAzODdjNTFmLi5lYzg3NmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2F0a2JkLmMKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9hdGtiZC5jCkBAIC0xNjUzLDYgKzE2NTMsMTIgQEAKIAlyZXR1cm4gMTsKIH0KIAorLyoKKyAqIE5PVEU6IGRvIG5vdCBhZGQgYW55IG1vcmUgImZvcmNlIHJlbGVhc2UiIHF1aXJrcyB0byB0aGlzIHRhYmxlLiAgVGhlCisgKiB0YXNrIG9mIGFkanVzdGluZyBsaXN0IG9mIGtleXMgdGhhdCBzaG91bGQgYmUgInJlbGVhc2VkIiBhdXRvbWF0aWNhbGx5CisgKiBieSB0aGUgZHJpdmVyIGlzIG5vdyBkZWxlZ2F0ZWQgdG8gdXNlcnNwYWNlIHRvb2xzLCBzdWNoIGFzIHVkZXYsIHNvCisgKiBzdWJtaXQgc3VjaCBxdWlya3MgdGhlcmUuCisgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBhdGtiZF9kbWlfcXVpcmtfdGFibGVbXSBfX2luaXRjb25zdCA9IHsKIAl7CiAJCS5tYXRjaGVzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9iY20ta2V5cGFkLmMgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2JjbS1rZXlwYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE4YjcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9iY20ta2V5cGFkLmMKQEAgLTAsMCArMSw0NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0L21hdHJpeF9rZXlwYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgREVGQVVMVF9DTEtfSFoJCQkzMTI1MAorI2RlZmluZSBNQVhfUk9XUwkJCTgKKyNkZWZpbmUgTUFYX0NPTFMJCQk4CisKKy8qIFJlZ2lzdGVyL2ZpZWxkIGRlZmluaXRpb25zICovCisjZGVmaW5lIEtQQ1JfT0ZGU0VUCQkJMHgwMDAwMDA4MAorI2RlZmluZSBLUENSX01PREUJCQkweDAwMDAwMDAyCisjZGVmaW5lIEtQQ1JfTU9ERV9TSElGVAkJCTEKKyNkZWZpbmUgS1BDUl9NT0RFX01BU0sJCQkxCisjZGVmaW5lIEtQQ1JfRU5BQkxFCQkJMHgwMDAwMDAwMQorI2RlZmluZSBLUENSX1NUQVRVU0ZJTFRFUkVOQUJMRQkJMHgwMDAwODAwMAorI2RlZmluZSBLUENSX1NUQVRVU0ZJTFRFUlRZUEVfU0hJRlQJMTIKKyNkZWZpbmUgS1BDUl9DT0xGSUxURVJFTkFCTEUJCTB4MDAwMDA4MDAKKyNkZWZpbmUgS1BDUl9DT0xGSUxURVJUWVBFX1NISUZUCTgKKyNkZWZpbmUgS1BDUl9ST1dXSURUSF9TSElGVAkJMjAKKyNkZWZpbmUgS1BDUl9DT0xVTU5XSURUSF9TSElGVAkJMTYKKworI2RlZmluZSBLUElPUl9PRkZTRVQJCQkweDAwMDAwMDg0CisjZGVmaW5lIEtQSU9SX1JPV09DT05UUkxfU0hJRlQJCTI0CisjZGVmaW5lIEtQSU9SX1JPV09DT05UUkxfTUFTSwkJMHhGRjAwMDAwMAorI2RlZmluZSBLUElPUl9DT0xVTU5PQ09OVFJMX1NISUZUCTE2CisjZGVmaW5lIEtQSU9SX0NPTFVNTk9DT05UUkxfTUFTSwkweDAwRkYwMDAwCisjZGVmaW5lIEtQSU9SX0NPTFVNTl9JT19EQVRBX1NISUZUCTAKKworI2RlZmluZSBLUEVNUjBfT0ZGU0VUCQkJMHgwMDAwMDA5MAorI2RlZmluZSBLUEVNUjFfT0ZGU0VUCQkJMHgwMDAwMDA5NAorI2RlZmluZSBLUEVNUjJfT0ZGU0VUCQkJMHgwMDAwMDA5OAorI2RlZmluZSBLUEVNUjNfT0ZGU0VUCQkJMHgwMDAwMDA5QworI2RlZmluZSBLUEVNUl9FREdFVFlQRV9CT1RICQkzCisKKyNkZWZpbmUgS1BTU1IwX09GRlNFVAkJCTB4MDAwMDAwQTAKKyNkZWZpbmUgS1BTU1IxX09GRlNFVAkJCTB4MDAwMDAwQTQKKyNkZWZpbmUgS1BTU1JOX09GRlNFVChyZWdfbikJCShLUFNTUjBfT0ZGU0VUICsgNCAqIChyZWdfbikpCisjZGVmaW5lIEtQSU1SMF9PRkZTRVQJCQkweDAwMDAwMEIwCisjZGVmaW5lIEtQSU1SMV9PRkZTRVQJCQkweDAwMDAwMEI0CisjZGVmaW5lIEtQSUNSMF9PRkZTRVQJCQkweDAwMDAwMEI4CisjZGVmaW5lIEtQSUNSMV9PRkZTRVQJCQkweDAwMDAwMEJDCisjZGVmaW5lIEtQSUNSTl9PRkZTRVQocmVnX24pCQkoS1BJQ1IwX09GRlNFVCArIDQgKiAocmVnX24pKQorI2RlZmluZSBLUElTUjBfT0ZGU0VUCQkJMHgwMDAwMDBDMAorI2RlZmluZSBLUElTUjFfT0ZGU0VUCQkJMHgwMDAwMDBDNAorCisjZGVmaW5lIEtQQ1JfU1RBVFVTRklMVEVSVFlQRV9NQVgJNworI2RlZmluZSBLUENSX0NPTEZJTFRFUlRZUEVfTUFYCQk3CisKKy8qIE1hY3JvcyB0byBkZXRlcm1pbmUgdGhlIHJvdy9jb2x1bW4gZnJvbSBhIGJpdCB0aGF0IGlzIHNldCBpbiBTU1IwLzEuICovCisjZGVmaW5lIEJJVF9UT19ST1dfU1NSTihiaXRfbnIsIHJlZ19uKQkoKChiaXRfbnIpID4+IDMpICsgNCAqIChyZWdfbikpCisjZGVmaW5lIEJJVF9UT19DT0woYml0X25yKQkJKChiaXRfbnIpICUgOCkKKworLyogU3RydWN0dXJlIHJlcHJlc2VudGluZyB2YXJpb3VzIHJ1bi10aW1lIGVudGl0aWVzICovCitzdHJ1Y3QgYmNtX2twIHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IGlycTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2OworCXVuc2lnbmVkIGxvbmcgbGFzdF9zdGF0ZVsyXTsKKwl1bnNpZ25lZCBpbnQgbl9yb3dzOworCXVuc2lnbmVkIGludCBuX2NvbHM7CisJdTMyIGtwY3I7CisJdTMyIGtwaW9yOworCXUzMiBrcGVtcjsKKwl1MzIgaW1yMF92YWw7CisJdTMyIGltcjFfdmFsOworfTsKKworLyoKKyAqIFJldHVybnMgdGhlIGtleWNvZGUgZnJvbSB0aGUgaW5wdXQgZGV2aWNlIGtleW1hcCBnaXZlbiB0aGUgcm93IGFuZAorICogY29sdW1uLgorICovCitzdGF0aWMgaW50IGJjbV9rcF9nZXRfa2V5Y29kZShzdHJ1Y3QgYmNtX2twICprcCwgaW50IHJvdywgaW50IGNvbCkKK3sKKwl1bnNpZ25lZCBpbnQgcm93X3NoaWZ0ID0gZ2V0X2NvdW50X29yZGVyKGtwLT5uX2NvbHMpOworCXVuc2lnbmVkIHNob3J0ICprZXltYXAgPSBrcC0+aW5wdXRfZGV2LT5rZXljb2RlOworCisJcmV0dXJuIGtleW1hcFtNQVRSSVhfU0NBTl9DT0RFKHJvdywgY29sLCByb3dfc2hpZnQpXTsKK30KKworc3RhdGljIHZvaWQgYmNtX2twX3JlcG9ydF9rZXlzKHN0cnVjdCBiY21fa3AgKmtwLCBpbnQgcmVnX251bSwgaW50IHB1bGxfbW9kZSkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXRlLCBjaGFuZ2U7CisJaW50IGJpdF9ucjsKKwlpbnQga2V5X3ByZXNzOworCWludCByb3csIGNvbDsKKwl1bnNpZ25lZCBpbnQga2V5Y29kZTsKKworCS8qIENsZWFyIGludGVycnVwdHMgKi8KKwl3cml0ZWwoMHhGRkZGRkZGRiwga3AtPmJhc2UgKyBLUElDUk5fT0ZGU0VUKHJlZ19udW0pKTsKKworCXN0YXRlID0gcmVhZGwoa3AtPmJhc2UgKyBLUFNTUk5fT0ZGU0VUKHJlZ19udW0pKTsKKwljaGFuZ2UgPSBrcC0+bGFzdF9zdGF0ZVtyZWdfbnVtXSBeIHN0YXRlOworCWtwLT5sYXN0X3N0YXRlW3JlZ19udW1dID0gc3RhdGU7CisKKwlmb3JfZWFjaF9zZXRfYml0KGJpdF9uciwgJmNoYW5nZSwgQklUU19QRVJfTE9ORykgeworCQlrZXlfcHJlc3MgPSBzdGF0ZSAmIEJJVChiaXRfbnIpOworCQkvKiBUaGUgbWVhbmluZyBvZiBTU1IgcmVnaXN0ZXIgZGVwZW5kcyBvbiBwdWxsIG1vZGUuICovCisJCWtleV9wcmVzcyA9IHB1bGxfbW9kZSA/ICFrZXlfcHJlc3MgOiBrZXlfcHJlc3M7CisJCXJvdyA9IEJJVF9UT19ST1dfU1NSTihiaXRfbnIsIHJlZ19udW0pOworCQljb2wgPSBCSVRfVE9fQ09MKGJpdF9ucik7CisJCWtleWNvZGUgPSBiY21fa3BfZ2V0X2tleWNvZGUoa3AsIHJvdywgY29sKTsKKwkJaW5wdXRfcmVwb3J0X2tleShrcC0+aW5wdXRfZGV2LCBrZXljb2RlLCBrZXlfcHJlc3MpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IGJjbV9rcF9pc3JfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYmNtX2twICprcCA9IGRldl9pZDsKKwlpbnQgcHVsbF9tb2RlID0gKGtwLT5rcGNyID4+IEtQQ1JfTU9ERV9TSElGVCkgJiBLUENSX01PREVfTUFTSzsKKwlpbnQgcmVnX251bTsKKworCWZvciAocmVnX251bSA9IDA7IHJlZ19udW0gPD0gMTsgcmVnX251bSsrKQorCQliY21fa3BfcmVwb3J0X2tleXMoa3AsIHJlZ19udW0sIHB1bGxfbW9kZSk7CisKKwlpbnB1dF9zeW5jKGtwLT5pbnB1dF9kZXYpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGJjbV9rcF9zdGFydChzdHJ1Y3QgYmNtX2twICprcCkKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoa3AtPmNsaykgeworCQllcnJvciA9IGNsa19wcmVwYXJlX2VuYWJsZShrcC0+Y2xrKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0KKworCXdyaXRlbChrcC0+a3Bpb3IsIGtwLT5iYXNlICsgS1BJT1JfT0ZGU0VUKTsKKworCXdyaXRlbChrcC0+aW1yMF92YWwsIGtwLT5iYXNlICsgS1BJTVIwX09GRlNFVCk7CisJd3JpdGVsKGtwLT5pbXIxX3ZhbCwga3AtPmJhc2UgKyBLUElNUjFfT0ZGU0VUKTsKKworCXdyaXRlbChrcC0+a3BlbXIsIGtwLT5iYXNlICsgS1BFTVIwX09GRlNFVCk7CisJd3JpdGVsKGtwLT5rcGVtciwga3AtPmJhc2UgKyBLUEVNUjFfT0ZGU0VUKTsKKwl3cml0ZWwoa3AtPmtwZW1yLCBrcC0+YmFzZSArIEtQRU1SMl9PRkZTRVQpOworCXdyaXRlbChrcC0+a3BlbXIsIGtwLT5iYXNlICsgS1BFTVIzX09GRlNFVCk7CisKKwl3cml0ZWwoMHhGRkZGRkZGRiwga3AtPmJhc2UgKyBLUElDUjBfT0ZGU0VUKTsKKwl3cml0ZWwoMHhGRkZGRkZGRiwga3AtPmJhc2UgKyBLUElDUjFfT0ZGU0VUKTsKKworCWtwLT5sYXN0X3N0YXRlWzBdID0gcmVhZGwoa3AtPmJhc2UgKyBLUFNTUjBfT0ZGU0VUKTsKKwlrcC0+bGFzdF9zdGF0ZVswXSA9IHJlYWRsKGtwLT5iYXNlICsgS1BTU1IxX09GRlNFVCk7CisKKwl3cml0ZWwoa3AtPmtwY3IgfCBLUENSX0VOQUJMRSwga3AtPmJhc2UgKyBLUENSX09GRlNFVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmNtX2twX3N0b3AoY29uc3Qgc3RydWN0IGJjbV9rcCAqa3ApCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHJlYWRsKGtwLT5iYXNlICsgS1BDUl9PRkZTRVQpOworCXZhbCAmPSB+S1BDUl9FTkFCTEU7CisJd3JpdGVsKDAsIGtwLT5iYXNlICsgS1BDUl9PRkZTRVQpOworCXdyaXRlbCgwLCBrcC0+YmFzZSArIEtQSU1SMF9PRkZTRVQpOworCXdyaXRlbCgwLCBrcC0+YmFzZSArIEtQSU1SMV9PRkZTRVQpOworCXdyaXRlbCgweEZGRkZGRkZGLCBrcC0+YmFzZSArIEtQSUNSMF9PRkZTRVQpOworCXdyaXRlbCgweEZGRkZGRkZGLCBrcC0+YmFzZSArIEtQSUNSMV9PRkZTRVQpOworCisJaWYgKGtwLT5jbGspCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShrcC0+Y2xrKTsKK30KKworc3RhdGljIGludCBiY21fa3Bfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IGJjbV9rcCAqa3AgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIGJjbV9rcF9zdGFydChrcCk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbV9rcF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IGJjbV9rcCAqa3AgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJYmNtX2twX3N0b3Aoa3ApOworfQorCitzdGF0aWMgaW50IGJjbV9rcF9tYXRyaXhfa2V5X3BhcnNlX2R0KHN0cnVjdCBiY21fa3AgKmtwKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGtwLT5pbnB1dF9kZXYtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKKwlpbnQgZXJyb3I7CisJdW5zaWduZWQgaW50IGR0X3ZhbDsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgbnVtX3Jvd3MsIGNvbF9tYXNrLCByb3dzX3NldDsKKworCS8qIEluaXRpYWxpemUgdGhlIEtQQ1IgS2V5cGFkIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKi8KKwlrcC0+a3BjciA9IEtQQ1JfU1RBVFVTRklMVEVSRU5BQkxFIHwgS1BDUl9DT0xGSUxURVJFTkFCTEU7CisKKwllcnJvciA9IG1hdHJpeF9rZXlwYWRfcGFyc2Vfb2ZfcGFyYW1zKGRldiwgJmtwLT5uX3Jvd3MsICZrcC0+bl9jb2xzKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcGFyc2Uga3AgcGFyYW1zXG4iKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qIFNldCByb3cgd2lkdGggZm9yIHRoZSBBU0lDIGJsb2NrLiAqLworCWtwLT5rcGNyIHw9IChrcC0+bl9yb3dzIC0gMSkgPDwgS1BDUl9ST1dXSURUSF9TSElGVDsKKworCS8qIFNldCBjb2x1bW4gd2lkdGggZm9yIHRoZSBBU0lDIGJsb2NrLiAqLworCWtwLT5rcGNyIHw9IChrcC0+bl9jb2xzIC0gMSkgPDwgS1BDUl9DT0xVTU5XSURUSF9TSElGVDsKKworCS8qIENvbmZpZ3VyZSB0aGUgSU1SIHJlZ2lzdGVycyAqLworCisJLyoKKwkgKiBJTVIgcmVnaXN0ZXJzIGNvbnRhaW4gaW50ZXJydXB0IGVuYWJsZSBiaXRzIGZvciA4eDggbWF0cml4CisJICogSU1SMCByZWdpc3RlciBmb3JtYXQ6IDxyb3czPiA8cm93Mj4gPHJvdzE+IDxyb3cwPgorCSAqIElNUjEgcmVnaXN0ZXIgZm9ybWF0OiA8cm93Nz4gPHJvdzY+IDxyb3c1PiA8cm93ND4KKwkgKi8KKwljb2xfbWFzayA9ICgxIDw8IChrcC0+bl9jb2xzKSkgLSAxOworCW51bV9yb3dzID0ga3AtPm5fcm93czsKKworCS8qIFNldCBjb2x1bW4gYml0cyBpbiByb3dzIDAgdG8gMyBpbiBJTVIwICovCisJa3AtPmltcjBfdmFsID0gY29sX21hc2s7CisKKwlyb3dzX3NldCA9IDE7CisJd2hpbGUgKC0tbnVtX3Jvd3MgJiYgcm93c19zZXQrKyA8IDQpCisJCWtwLT5pbXIwX3ZhbCB8PSBrcC0+aW1yMF92YWwgPDwgTUFYX0NPTFM7CisKKwkvKiBTZXQgY29sdW1uIGJpdHMgaW4gcm93cyA0IHRvIDcgaW4gSU1SMSAqLworCWtwLT5pbXIxX3ZhbCA9IDA7CisJaWYgKG51bV9yb3dzKSB7CisJCWtwLT5pbXIxX3ZhbCA9IGNvbF9tYXNrOworCQl3aGlsZSAoLS1udW1fcm93cykKKwkJCWtwLT5pbXIxX3ZhbCB8PSBrcC0+aW1yMV92YWwgPDwgTUFYX0NPTFM7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgS1BFTVIgS2V5cHJlc3MgRWRnZSBNb2RlIFJlZ2lzdGVycyAqLworCS8qIFRyaWdnZXIgb24gYm90aCBlZGdlcyAqLworCWtwLT5rcGVtciA9IDA7CisJZm9yIChpID0gMDsgaSA8PSAzMDsgaSArPSAyKQorCQlrcC0+a3BlbXIgfD0gKEtQRU1SX0VER0VUWVBFX0JPVEggPDwgaSk7CisKKwkvKgorCSAqIE9idGFpbiB0aGUgU3RhdHVzIGZpbHRlciBkZWJvdW5jZSB2YWx1ZSBhbmQgdmVyaWZ5IGFnYWluc3QgdGhlCisJICogcG9zc2libGUgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUgRFQgYmluZGluZy4KKwkgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInN0YXR1cy1kZWJvdW5jZS1maWx0ZXItcGVyaW9kIiwgJmR0X3ZhbCk7CisKKwlpZiAoZHRfdmFsID4gS1BDUl9TVEFUVVNGSUxURVJUWVBFX01BWCkgeworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgU3RhdHVzIGZpbHRlciBkZWJvdW5jZSB2YWx1ZSAlZFxuIiwKKwkJCWR0X3ZhbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWtwLT5rcGNyIHw9IGR0X3ZhbCA8PCBLUENSX1NUQVRVU0ZJTFRFUlRZUEVfU0hJRlQ7CisKKwkvKgorCSAqIE9idGFpbiB0aGUgQ29sdW1uIGZpbHRlciBkZWJvdW5jZSB2YWx1ZSBhbmQgdmVyaWZ5IGFnYWluc3QgdGhlCisJICogcG9zc2libGUgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUgRFQgYmluZGluZy4KKwkgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImNvbC1kZWJvdW5jZS1maWx0ZXItcGVyaW9kIiwgJmR0X3ZhbCk7CisKKwlpZiAoZHRfdmFsID4gS1BDUl9DT0xGSUxURVJUWVBFX01BWCkgeworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgQ29sdW1uIGZpbHRlciBkZWJvdW5jZSB2YWx1ZSAlZFxuIiwKKwkJCWR0X3ZhbCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWtwLT5rcGNyIHw9IGR0X3ZhbCA8PCBLUENSX0NPTEZJTFRFUlRZUEVfU0hJRlQ7CisKKwkvKgorCSAqIERldGVybWluZSBiZXR3ZWVuIHRoZSByb3cgYW5kIGNvbHVtbiwKKwkgKiB3aGljaCBzaG91bGQgYmUgY29uZmlndXJlZCBhcyBvdXRwdXQuCisJICovCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInJvdy1vdXRwdXQtZW5hYmxlZCIpKSB7CisJCS8qCisJCSogU2V0IFJvd09Db250cmwgb3IgQ29sdW1uT0NvbnRybCBpbiBLUElPUgorCQkqIHRvIHRoZSBudW1iZXIgb2YgcGlucyB0byBkcml2ZSBhcyBvdXRwdXRzCisJCSovCisJCWtwLT5rcGlvciA9ICgoMSA8PCBrcC0+bl9yb3dzKSAtIDEpIDw8CisJCQkJS1BJT1JfUk9XT0NPTlRSTF9TSElGVDsKKwl9IGVsc2UgeworCQlrcC0+a3Bpb3IgPSAoKDEgPDwga3AtPm5fY29scykgLSAxKSA8PAorCQkJCUtQSU9SX0NPTFVNTk9DT05UUkxfU0hJRlQ7CisJfQorCisJLyoKKwkgKiBEZXRlcm1pbmUgaWYgdGhlIHNjYW4gcHVsbCB1cCBuZWVkcyB0byBiZSBlbmFibGVkCisJICovCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInB1bGwtdXAtZW5hYmxlZCIpKQorCQlrcC0+a3BjciB8PSBLUENSX01PREU7CisKKwlkZXZfZGJnKGRldiwgIm5fcm93cz0lZCBuX2NvbD0lZCBrcGNyPSV4IGtwaW9yPSV4IGtwZW1yPSV4XG4iLAorCQlrcC0+bl9yb3dzLCBrcC0+bl9jb2xzLAorCQlrcC0+a3Bjciwga3AtPmtwaW9yLCBrcC0+a3BlbXIpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBiY21fa3BfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYmNtX2twICprcDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dF9kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGVycm9yOworCisJa3AgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCprcCksIEdGUF9LRVJORUwpOworCWlmICgha3ApCisJCXJldHVybiAtRU5PTUVNOworCisJaW5wdXRfZGV2ID0gZGV2bV9pbnB1dF9hbGxvY2F0ZV9kZXZpY2UoJnBkZXYtPmRldik7CisJaWYgKCFpbnB1dF9kZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dF9kZXYtPmV2Yml0KTsKKworCS8qIEVuYWJsZSBhdXRvIHJlcGVhdCBmZWF0dXJlIG9mIExpbnV4IGlucHV0IHN1YnN5c3RlbSAqLworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wocGRldi0+ZGV2Lm9mX25vZGUsICJhdXRvcmVwZWF0IikpCisJCV9fc2V0X2JpdChFVl9SRVAsIGlucHV0X2Rldi0+ZXZiaXQpOworCisJaW5wdXRfZGV2LT5uYW1lID0gcGRldi0+bmFtZTsKKwlpbnB1dF9kZXYtPnBoeXMgPSAia2V5cGFkL2lucHV0MCI7CisJaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwlpbnB1dF9kZXYtPm9wZW4gPSBiY21fa3Bfb3BlbjsKKwlpbnB1dF9kZXYtPmNsb3NlID0gYmNtX2twX2Nsb3NlOworCisJaW5wdXRfZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJaW5wdXRfZGV2LT5pZC52ZW5kb3IgPSAweDAwMDE7CisJaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gMHgwMDAxOworCWlucHV0X2Rldi0+aWQudmVyc2lvbiA9IDB4MDEwMDsKKworCWlucHV0X3NldF9kcnZkYXRhKGlucHV0X2Rldiwga3ApOworCisJa3AtPmlucHV0X2RldiA9IGlucHV0X2RldjsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGtwKTsKKworCWVycm9yID0gYmNtX2twX21hdHJpeF9rZXlfcGFyc2VfZHQoa3ApOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBtYXRyaXhfa2V5cGFkX2J1aWxkX2tleW1hcChOVUxMLCBOVUxMLAorCQkJCQkgICBrcC0+bl9yb3dzLCBrcC0+bl9jb2xzLAorCQkJCQkgICBOVUxMLCBpbnB1dF9kZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYnVpbGQga2V5bWFwXG4iKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCS8qIEdldCB0aGUgS0VZUEFEIGJhc2UgYWRkcmVzcyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTWlzc2luZyBrZXlwYWQgYmFzZSBhZGRyZXNzIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJa3AtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGtwLT5iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoa3AtPmJhc2UpOworCisJLyogRW5hYmxlIGNsb2NrICovCisJa3AtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAicGVyaV9jbGsiKTsKKwlpZiAoSVNfRVJSKGtwLT5jbGspKSB7CisJCWVycm9yID0gUFRSX0VSUihrcC0+Y2xrKTsKKwkJaWYgKGVycm9yICE9IC1FTk9FTlQpIHsKKwkJCWlmIChlcnJvciAhPSAtRVBST0JFX0RFRkVSKQorCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgY2xvY2tcbiIpOworCQkJcmV0dXJuIGVycm9yOworCQl9CisJCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJCSJObyBjbG9jayBzcGVjaWZpZWQuIEFzc3VtaW5nIGl0J3MgZW5hYmxlZFxuIik7CisJCWtwLT5jbGsgPSBOVUxMOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGludCBkZXNpcmVkX3JhdGU7CisJCWxvbmcgYWN0dWFsX3JhdGU7CisKKwkJZXJyb3IgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJICAgICAiY2xvY2stZnJlcXVlbmN5IiwgJmRlc2lyZWRfcmF0ZSk7CisJCWlmIChlcnJvciA8IDApCisJCQlkZXNpcmVkX3JhdGUgPSBERUZBVUxUX0NMS19IWjsKKworCQlhY3R1YWxfcmF0ZSA9IGNsa19yb3VuZF9yYXRlKGtwLT5jbGssIGRlc2lyZWRfcmF0ZSk7CisJCWlmIChhY3R1YWxfcmF0ZSA8PSAwKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJZXJyb3IgPSBjbGtfc2V0X3JhdGUoa3AtPmNsaywgYWN0dWFsX3JhdGUpOworCQlpZiAoZXJyb3IpCisJCQlyZXR1cm4gZXJyb3I7CisKKwkJZXJyb3IgPSBjbGtfcHJlcGFyZV9lbmFibGUoa3AtPmNsayk7CisJCWlmIChlcnJvcikKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwkvKiBQdXQgdGhlIGtwIGludG8gYSBrbm93biBzYW5lIHN0YXRlICovCisJYmNtX2twX3N0b3Aoa3ApOworCisJa3AtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGtwLT5pcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIElSUSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllcnJvciA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwga3AtPmlycSwKKwkJCQkJICBOVUxMLCBiY21fa3BfaXNyX3RocmVhZCwKKwkJCQkJICBJUlFGX09ORVNIT1QsIHBkZXYtPm5hbWUsIGtwKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgSVJRXG4iKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0X2Rldik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJjbV9rcF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY20ta2V5cGFkIiB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBiY21fa3Bfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiY21fa3BfZGV2aWNlX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gYmNtX2twX3Byb2JlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJiY20ta2V5cGFkIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGJjbV9rcF9vZl9tYXRjaCksCisJfQorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiY21fa3BfZGV2aWNlX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkJyb2FkY29tIENvcnBvcmF0aW9uIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJDTSBLZXlwYWQgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nyb3NfZWNfa2V5Yi5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9jcm9zX2VjX2tleWIuYwppbmRleCBmZmE5ODlmLi42NGI5YjU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2Nyb3NfZWNfa2V5Yi5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvY3Jvc19lY19rZXliLmMKQEAgLTMzOCw3ICszMzgsNyBAQAogCSAqIHdha2Ugc291cmNlIChlLmcuIHRoZSBsaWQgaXMgb3BlbiBhbmQgdGhlIHVzZXIgbWlnaHQgcHJlc3MgYSBrZXkgdG8KIAkgKiB3YWtlKSB0aGVuIHRoZSBrZXkgc2NhbiBidWZmZXIgc2hvdWxkIGJlIHByZXNlcnZlZC4KIAkgKi8KLQlpZiAoY2tkZXYtPmVjLT53YXNfd2FrZV9kZXZpY2UpCisJaWYgKCFja2Rldi0+ZWMtPndhc193YWtlX2RldmljZSkKIAkJY3Jvc19lY19rZXliX2NsZWFyX2tleWJvYXJkKGNrZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9pcGFxLW1pY3JvLWtleXMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaXBhcS1taWNyby1rZXlzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyOTAwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvaXBhcS1taWNyby1rZXlzLmMKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIGgzNjAwIGF0bWVsIG1pY3JvIGNvbXBhbmlvbiBzdXBwb3J0LCBrZXkgc3ViZGV2aWNlCisgKiBiYXNlZCBvbiBwcmV2aW91cyBrZXJuZWwgMi40IHZlcnNpb24KKyAqIEF1dGhvciA6IEFsZXNzYW5kcm8gR2FyZGljaCA8Z3JlbWxpbkBncmVtbGluLml0PgorICogQXV0aG9yIDogTGludXMgV2FsbGVpaiA8bGludXMud2FsbGVpakBsaW5hcm8ub3JnPgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9pcGFxLW1pY3JvLmg+CisKK3N0cnVjdCBpcGFxX21pY3JvX2tleXMgeworCXN0cnVjdCBpcGFxX21pY3JvICptaWNybzsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKwl1MTYgKmNvZGVzOworfTsKKworc3RhdGljIGNvbnN0IHUxNiBtaWNyb19rZXljb2Rlc1tdID0geworCUtFWV9SRUNPUkQsCQkvKiAxOiAgUmVjb3JkIGJ1dHRvbgkJCSovCisJS0VZX0NBTEVOREFSLAkJLyogMjogIENhbGVuZGFyCQkJCSovCisJS0VZX0FERFJFU1NCT09LLAkvKiAzOiAgQ29udGFjdHMgKGxvb2tzIGxpa2UgT3V0bG9vaykJKi8KKwlLRVlfTUFJTCwJCS8qIDQ6ICBFbnZlbG9wZSAoUSBvbiBvbGRlciBpUEFRcykJKi8KKwlLRVlfSE9NRVBBR0UsCQkvKiA1OiAgU3RhcnQgKGxvb2tzIGxpa2Ugc3dvb3B5IGFycm93KQkqLworCUtFWV9VUCwJCQkvKiA2OiAgVXAJCQkJKi8KKwlLRVlfUklHSFQsCQkvKiA3OiAgUmlnaHQJCQkJKi8KKwlLRVlfTEVGVCwJCS8qIDg6ICBMZWZ0CQkJCSovCisJS0VZX0RPV04sCQkvKiA5OiAgRG93bgkJCQkqLworfTsKKworc3RhdGljIHZvaWQgbWljcm9fa2V5X3JlY2VpdmUodm9pZCAqZGF0YSwgaW50IGxlbiwgdW5zaWduZWQgY2hhciAqbXNnKQoreworCXN0cnVjdCBpcGFxX21pY3JvX2tleXMgKmtleXMgPSBkYXRhOworCWludCBrZXksIGRvd247CisKKwlkb3duID0gMHg4MCAmIG1zZ1swXTsKKwlrZXkgID0gMHg3ZiAmIG1zZ1swXTsKKworCWlmIChrZXkgPCBBUlJBWV9TSVpFKG1pY3JvX2tleWNvZGVzKSkgeworCQlpbnB1dF9yZXBvcnRfa2V5KGtleXMtPmlucHV0LCBrZXlzLT5jb2Rlc1trZXldLCBkb3duKTsKKwkJaW5wdXRfc3luYyhrZXlzLT5pbnB1dCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtaWNyb19rZXlfc3RhcnQoc3RydWN0IGlwYXFfbWljcm9fa2V5cyAqa2V5cykKK3sKKwlzcGluX2xvY2soJmtleXMtPm1pY3JvLT5sb2NrKTsKKwlrZXlzLT5taWNyby0+a2V5ID0gbWljcm9fa2V5X3JlY2VpdmU7CisJa2V5cy0+bWljcm8tPmtleV9kYXRhID0ga2V5czsKKwlzcGluX3VubG9jaygma2V5cy0+bWljcm8tPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBtaWNyb19rZXlfc3RvcChzdHJ1Y3QgaXBhcV9taWNyb19rZXlzICprZXlzKQoreworCXNwaW5fbG9jaygma2V5cy0+bWljcm8tPmxvY2spOworCWtleXMtPm1pY3JvLT5rZXkgPSBOVUxMOworCWtleXMtPm1pY3JvLT5rZXlfZGF0YSA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmtleXMtPm1pY3JvLT5sb2NrKTsKK30KKworc3RhdGljIGludCBtaWNyb19rZXlfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlzdHJ1Y3QgaXBhcV9taWNyb19rZXlzICprZXlzID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXQpOworCisJbWljcm9fa2V5X3N0YXJ0KGtleXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1pY3JvX2tleV9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dCkKK3sKKwlzdHJ1Y3QgaXBhcV9taWNyb19rZXlzICprZXlzID0gaW5wdXRfZ2V0X2RydmRhdGEoaW5wdXQpOworCisJbWljcm9fa2V5X3N0b3Aoa2V5cyk7Cit9CisKK3N0YXRpYyBpbnQgbWljcm9fa2V5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGlwYXFfbWljcm9fa2V5cyAqa2V5czsKKwlpbnQgZXJyb3I7CisJaW50IGk7CisKKwlrZXlzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqa2V5cyksIEdGUF9LRVJORUwpOworCWlmICgha2V5cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlrZXlzLT5taWNybyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKworCWtleXMtPmlucHV0ID0gZGV2bV9pbnB1dF9hbGxvY2F0ZV9kZXZpY2UoJnBkZXYtPmRldik7CisJaWYgKCFrZXlzLT5pbnB1dCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlrZXlzLT5pbnB1dC0+a2V5Y29kZXNpemUgPSBzaXplb2YobWljcm9fa2V5Y29kZXNbMF0pOworCWtleXMtPmlucHV0LT5rZXljb2RlbWF4ID0gQVJSQVlfU0laRShtaWNyb19rZXljb2Rlcyk7CisJa2V5cy0+Y29kZXMgPSBkZXZtX2ttZW1kdXAoJnBkZXYtPmRldiwgbWljcm9fa2V5Y29kZXMsCisJCQkgICBrZXlzLT5pbnB1dC0+a2V5Y29kZXNpemUgKiBrZXlzLT5pbnB1dC0+a2V5Y29kZW1heCwKKwkJCSAgIEdGUF9LRVJORUwpOworCWtleXMtPmlucHV0LT5rZXljb2RlID0ga2V5cy0+Y29kZXM7CisKKwlfX3NldF9iaXQoRVZfS0VZLCBrZXlzLT5pbnB1dC0+ZXZiaXQpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1pY3JvX2tleWNvZGVzKTsgaSsrKQorCQlfX3NldF9iaXQobWljcm9fa2V5Y29kZXNbaV0sIGtleXMtPmlucHV0LT5rZXliaXQpOworCisJa2V5cy0+aW5wdXQtPm5hbWUgPSAiaDM2MDAgbWljcm8ga2V5cyI7CisJa2V5cy0+aW5wdXQtPm9wZW4gPSBtaWNyb19rZXlfb3BlbjsKKwlrZXlzLT5pbnB1dC0+Y2xvc2UgPSBtaWNyb19rZXlfY2xvc2U7CisJaW5wdXRfc2V0X2RydmRhdGEoa2V5cy0+aW5wdXQsIGtleXMpOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2Uoa2V5cy0+aW5wdXQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwga2V5cyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbWljcm9fa2V5X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpcGFxX21pY3JvX2tleXMgKmtleXMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCW1pY3JvX2tleV9zdG9wKGtleXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbWljcm9fa2V5X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwYXFfbWljcm9fa2V5cyAqa2V5cyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0ID0ga2V5cy0+aW5wdXQ7CisKKwltdXRleF9sb2NrKCZpbnB1dC0+bXV0ZXgpOworCisJaWYgKGlucHV0LT51c2VycykKKwkJbWljcm9fa2V5X3N0YXJ0KGtleXMpOworCisJbXV0ZXhfdW5sb2NrKCZpbnB1dC0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhtaWNyb19rZXlfZGV2X3BtX29wcywKKwkJCSBtaWNyb19rZXlfc3VzcGVuZCwgbWljcm9fa2V5X3Jlc3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1pY3JvX2tleV9kZXZpY2VfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lICAgID0gImlwYXEtbWljcm8ta2V5cyIsCisJCS5wbQk9ICZtaWNyb19rZXlfZGV2X3BtX29wcywKKwl9LAorCS5wcm9iZSAgID0gbWljcm9fa2V5X3Byb2JlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWljcm9fa2V5X2RldmljZV9kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oImRyaXZlciBmb3IgaVBBUSBBdG1lbCBtaWNybyBrZXlzIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmlwYXEtbWljcm8ta2V5cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90YzM1ODl4LWtleXBhZC5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90YzM1ODl4LWtleXBhZC5jCmluZGV4IDU2MzkzMjUuLjMxYzYwNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGMzNTg5eC1rZXlwYWQuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RjMzU4OXgta2V5cGFkLmMKQEAgLTcwLDYgKzcwLDI4IEBACiAjZGVmaW5lIFRDMzU4OXhfS0JEX0lOVF9DTFIJMHgxCiAKIC8qKgorICogc3RydWN0IHRjMzU4OTNfa2V5cGFkX3BsYXRmb3JtX2RhdGEgLSBwbGF0Zm9ybSBzcGVjaWZpYyBrZXlwYWQgZGF0YQorICogQGtleW1hcF9kYXRhOiAgICAgICAgbWF0cml4IHNjYW4gY29kZSB0YWJsZSBmb3Iga2V5Y29kZXMKKyAqIEBrcm93OiAgICAgICAgICAgICAgIG1hc2sgZm9yIGF2YWlsYWJsZSByb3dzLCB2YWx1ZSBpcyAweEZGCisgKiBAa2NvbDogICAgICAgICAgICAgICBtYXNrIGZvciBhdmFpbGFibGUgY29sdW1ucywgdmFsdWUgaXMgMHhGRgorICogQGRlYm91bmNlX3BlcmlvZDogICAgcGxhdGZvcm0gc3BlY2lmaWMgZGVib3VuY2UgdGltZQorICogQHNldHRsZV90aW1lOiAgICAgICAgcGxhdGZvcm0gc3BlY2lmaWMgc2V0dGxlIGRvd24gdGltZQorICogQGlycXR5cGU6ICAgICAgICAgICAgdHlwZSBvZiBpbnRlcnJ1cHQsIGZhbGxpbmcgb3IgcmlzaW5nIGVkZ2UKKyAqIEBlbmFibGVfd2FrZXVwOiAgICAgIHNwZWNpZmllcyBpZiBrZXlwYWQgZXZlbnQgY2FuIHdha2UgdXAgc3lzdGVtIGZyb20gc2xlZXAKKyAqIEBub19hdXRvcmVwZWF0OiAgICAgIGZsYWcgZm9yIGF1dG8gcmVwZXRpdGlvbgorICovCitzdHJ1Y3QgdGMzNTg5eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSB7CisJY29uc3Qgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSAqa2V5bWFwX2RhdGE7CisJdTggICAgICAgICAgICAgICAgICAgICAga3JvdzsKKwl1OCAgICAgICAgICAgICAgICAgICAgICBrY29sOworCXU4ICAgICAgICAgICAgICAgICAgICAgIGRlYm91bmNlX3BlcmlvZDsKKwl1OCAgICAgICAgICAgICAgICAgICAgICBzZXR0bGVfdGltZTsKKwl1bnNpZ25lZCBsb25nICAgICAgICAgICBpcnF0eXBlOworCWJvb2wgICAgICAgICAgICAgICAgICAgIGVuYWJsZV93YWtldXA7CisJYm9vbCAgICAgICAgICAgICAgICAgICAgbm9fYXV0b3JlcGVhdDsKK307CisKKy8qKgogICogc3RydWN0IHRjX2tleXBhZCAtIGRhdGEgc3RydWN0dXJlIHVzZWQgYnkga2V5cGFkIGRyaXZlcgogICogQHRjMzU4OXg6ICAgIHBvaW50ZXIgdG8gdGMzNTg5MwogICogQGlucHV0OiAgICAgIHBvaW50ZXIgdG8gaW5wdXQgZGV2aWNlIG9iamVjdApAQCAtMjk2LDcgKzMxOCw2IEBACiAJdGMzNTg5eF9rZXlwYWRfZGlzYWJsZShrZXlwYWQpOwogfQogCi0jaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRjMzU4OXhfa2V5cGFkX3BsYXRmb3JtX2RhdGEgKgogdGMzNTg5eF9rZXlwYWRfb2ZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtMzQ2LDE0ICszNjcsNiBAQAogCiAJcmV0dXJuIHBsYXQ7CiB9Ci0jZWxzZQotc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgdGMzNTg5eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSAqCi10YzM1ODl4X2tleXBhZF9vZl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Ci19Ci0jZW5kaWYKLQogCiBzdGF0aWMgaW50IHRjMzU4OXhfa2V5cGFkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC0zNjMsMTMgKzM3NiwxMCBAQAogCWNvbnN0IHN0cnVjdCB0YzM1ODl4X2tleXBhZF9wbGF0Zm9ybV9kYXRhICpwbGF0OwogCWludCBlcnJvciwgaXJxOwogCi0JcGxhdCA9IHRjMzU4OXgtPnBkYXRhLT5rZXlwYWQ7Ci0JaWYgKCFwbGF0KSB7Ci0JCXBsYXQgPSB0YzM1ODl4X2tleXBhZF9vZl9wcm9iZSgmcGRldi0+ZGV2KTsKLQkJaWYgKElTX0VSUihwbGF0KSkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiaW52YWxpZCBrZXlwYWQgcGxhdGZvcm0gZGF0YVxuIik7Ci0JCQlyZXR1cm4gUFRSX0VSUihwbGF0KTsKLQkJfQorCXBsYXQgPSB0YzM1ODl4X2tleXBhZF9vZl9wcm9iZSgmcGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKHBsYXQpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQga2V5cGFkIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwbGF0KTsKIAl9CiAKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZwppbmRleCA2ZGViOGRhLi40NDM2YWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvS2NvbmZpZwpAQCAtMTE1LDYgKzExNSwxOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgcGNzcGtyLgogCitjb25maWcgSU5QVVRfUE04OTQxX1BXUktFWQorCXRyaXN0YXRlICJRdWFsY29tbSBQTTg5NDEgcG93ZXIga2V5IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBNRkRfU1BNSV9QTUlDCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgcG93ZXIga2V5IHVzdWFsbHkgZm91bmQKKwkgIG9uIGJvYXJkcyB1c2luZyBhIFF1YWxjb21tIFBNODk0MSBjb21wYXRpYmxlIFBNSUMuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKKwkgIHdpbGwgYmUgY2FsbGVkIHBtODk0MS1wd3JrZXkuCisKIGNvbmZpZyBJTlBVVF9QTThYWFhfVklCUkFUT1IKIAl0cmlzdGF0ZSAiUXVhbGNvbW0gUE04WFhYIHZpYnJhdG9yIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBNRkRfUE04WFhYCkBAIC0xNjUsNiArMTc3LDE4IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbWF4Nzc2OTMtaGFwdGljLgogCitjb25maWcgSU5QVVRfTUFYNzc4NDNfSEFQVElDCisgICAgdHJpc3RhdGUgIk1BWElNIE1BWDc3ODQzIGhhcHRpYyBjb250cm9sbGVyIHN1cHBvcnQiCisgICAgZGVwZW5kcyBvbiBNRkRfTUFYNzc4NDMgJiYgUkVHVUxBVE9SCisgICAgc2VsZWN0IElOUFVUX0ZGX01FTUxFU1MKKyAgICBoZWxwCisgICAgICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBoYXB0aWMgY29udHJvbGxlciBvbgorICAgICAgTUFYSU0gTUFYNzc4NDMgY2hpcC4gVGhlIGRyaXZlciBzdXBwb3J0cyBmZi1tZW1sZXNzIGludGVyZmFjZQorICAgICAgZnJvbSBpbnB1dCBmcmFtZXdvcmsuCisKKyAgICAgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKyAgICAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBtYXg3Nzg0My1oYXB0aWMuCisKIGNvbmZpZyBJTlBVVF9NQVg4OTI1X09OS0VZCiAJdHJpc3RhdGUgIk1BWDg5MjUgT05LRVkgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1GRF9NQVg4OTI1CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL2lucHV0L21pc2MvTWFrZWZpbGUKaW5kZXggNDAzYTFhNS4uNzhiYTRjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9NYWtlZmlsZQpAQCAtMzksNiArMzksNyBAQAogb2JqLSQoQ09ORklHX0lOUFVUX0tYVEo5KQkJKz0ga3h0ajkubwogb2JqLSQoQ09ORklHX0lOUFVUX002OEtfQkVFUCkJCSs9IG02OGtzcGtyLm8KIG9iai0kKENPTkZJR19JTlBVVF9NQVg3NzY5M19IQVBUSUMpCSs9IG1heDc3NjkzLWhhcHRpYy5vCitvYmotJChDT05GSUdfSU5QVVRfTUFYNzc4NDNfSEFQVElDKQkrPSBtYXg3Nzg0My1oYXB0aWMubwogb2JqLSQoQ09ORklHX0lOUFVUX01BWDg5MjVfT05LRVkpCSs9IG1heDg5MjVfb25rZXkubwogb2JqLSQoQ09ORklHX0lOUFVUX01BWDg5OTdfSEFQVElDKQkrPSBtYXg4OTk3X2hhcHRpYy5vCiBvYmotJChDT05GSUdfSU5QVVRfTUMxMzc4M19QV1JCVVRUT04pCSs9IG1jMTM3ODMtcHdyYnV0dG9uLm8KQEAgLTQ5LDYgKzUwLDcgQEAKIG9iai0kKENPTkZJR19JTlBVVF9QQ0Y1MDYzM19QTVUpCSs9IHBjZjUwNjMzLWlucHV0Lm8KIG9iai0kKENPTkZJR19JTlBVVF9QQ0Y4NTc0KQkJKz0gcGNmODU3NF9rZXlwYWQubwogb2JqLSQoQ09ORklHX0lOUFVUX1BDU1BLUikJCSs9IHBjc3Brci5vCitvYmotJChDT05GSUdfSU5QVVRfUE04OTQxX1BXUktFWSkJKz0gcG04OTQxLXB3cmtleS5vCiBvYmotJChDT05GSUdfSU5QVVRfUE04WFhYX1ZJQlJBVE9SKQkrPSBwbTh4eHgtdmlicmF0b3Iubwogb2JqLSQoQ09ORklHX0lOUFVUX1BNSUM4WFhYX1BXUktFWSkJKz0gcG1pYzh4eHgtcHdya2V5Lm8KIG9iai0kKENPTkZJR19JTlBVVF9QT1dFUk1BVEUpCQkrPSBwb3dlcm1hdGUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL21heDc3ODQzLWhhcHRpYy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL21heDc3ODQzLWhhcHRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjY2JiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvbWF4Nzc4NDMtaGFwdGljLmMKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBNQVhJTSBNQVg3NzY5MyBIYXB0aWMgZGV2aWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiBBdXRob3I6IEphZXdvbiBLaW0gPGphZXdvbjAyLmtpbUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWF4Nzc4NDMtcHJpdmF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3B3bS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2RlZmluZSBNQVhfTUFHTklUVURFX1NISUZUICAgICAgICAxNgorCitlbnVtIG1heDc3ODQzX2hhcHRpY19tb3Rvcl90eXBlIHsKKwlNQVg3Nzg0M19IQVBUSUNfRVJNID0gMCwKKwlNQVg3Nzg0M19IQVBUSUNfTFJBLAorfTsKKworZW51bSBtYXg3Nzg0M19oYXB0aWNfcHdtX2Rpdmlzb3IgeworCU1BWDc3ODQzX0hBUFRJQ19QV01fRElWSVNPUl8zMiA9IDAsCisJTUFYNzc4NDNfSEFQVElDX1BXTV9ESVZJU09SXzY0LAorCU1BWDc3ODQzX0hBUFRJQ19QV01fRElWSVNPUl8xMjgsCisJTUFYNzc4NDNfSEFQVElDX1BXTV9ESVZJU09SXzI1NiwKK307CisKK3N0cnVjdCBtYXg3Nzg0M19oYXB0aWMgeworCXN0cnVjdCByZWdtYXAgKnJlZ21hcF9oYXB0aWM7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKKwlzdHJ1Y3QgcHdtX2RldmljZSAqcHdtX2RldjsKKwlzdHJ1Y3QgcmVndWxhdG9yICptb3Rvcl9yZWc7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IG11dGV4IG11dGV4OworCisJdW5zaWduZWQgaW50IG1hZ25pdHVkZTsKKwl1bnNpZ25lZCBpbnQgcHdtX2R1dHk7CisKKwlib29sIGFjdGl2ZTsKKwlib29sIHN1c3BlbmRlZDsKKworCWVudW0gbWF4Nzc4NDNfaGFwdGljX21vdG9yX3R5cGUgdHlwZTsKKwllbnVtIG1heDc3ODQzX2hhcHRpY19wd21fZGl2aXNvciBwd21fZGl2aXNvcjsKK307CisKK3N0YXRpYyBpbnQgbWF4Nzc4NDNfaGFwdGljX3NldF9kdXR5X2N5Y2xlKHN0cnVjdCBtYXg3Nzg0M19oYXB0aWMgKmhhcHRpYykKK3sKKwlpbnQgZGVsdGEgPSAoaGFwdGljLT5wd21fZGV2LT5wZXJpb2QgKyBoYXB0aWMtPnB3bV9kdXR5KSAvIDI7CisJaW50IGVycm9yOworCisJZXJyb3IgPSBwd21fY29uZmlnKGhhcHRpYy0+cHdtX2RldiwgZGVsdGEsIGhhcHRpYy0+cHdtX2Rldi0+cGVyaW9kKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycihoYXB0aWMtPmRldiwgImZhaWxlZCB0byBjb25maWd1cmUgcHdtOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc4NDNfaGFwdGljX2JpYXMoc3RydWN0IG1heDc3ODQzX2hhcHRpYyAqaGFwdGljLCBib29sIG9uKQoreworCWludCBlcnJvcjsKKworCWVycm9yID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGhhcHRpYy0+cmVnbWFwX2hhcHRpYywKKwkJCQkgICBNQVg3Nzg0M19TWVNfUkVHX01BSU5DVFJMMSwKKwkJCQkgICBNQVg3Nzg0M19NQUlOQ1RSTDFfQklBU0VOX01BU0ssCisJCQkJICAgb24gPDwgTUFJTkNUUkwxX0JJQVNFTl9TSElGVCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoaGFwdGljLT5kZXYsICJmYWlsZWQgdG8gJXMgYmlhczogJWRcbiIsCisJCQlvbiA/ICJlbmFibGUiIDogImRpc2FibGUiLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXg3Nzg0M19oYXB0aWNfY29uZmlnKHN0cnVjdCBtYXg3Nzg0M19oYXB0aWMgKmhhcHRpYywgYm9vbCBlbmFibGUpCit7CisJdW5zaWduZWQgaW50IHZhbHVlOworCWludCBlcnJvcjsKKworCXZhbHVlID0gKGhhcHRpYy0+dHlwZSA8PCBNQ09ORklHX01PREVfU0hJRlQpIHwKKwkJKGVuYWJsZSA8PCBNQ09ORklHX01FTl9TSElGVCkgfAorCQkoaGFwdGljLT5wd21fZGl2aXNvciA8PCBNQ09ORklHX1BESVZfU0hJRlQpOworCisJZXJyb3IgPSByZWdtYXBfd3JpdGUoaGFwdGljLT5yZWdtYXBfaGFwdGljLAorCQkJICAgICBNQVg3Nzg0M19IQVBfUkVHX01DT05GSUcsIHZhbHVlKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycihoYXB0aWMtPmRldiwKKwkJCSJmYWlsZWQgdG8gdXBkYXRlIGhhcHRpYyBjb25maWc6ICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXg3Nzg0M19oYXB0aWNfZW5hYmxlKHN0cnVjdCBtYXg3Nzg0M19oYXB0aWMgKmhhcHRpYykKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoaGFwdGljLT5hY3RpdmUpCisJCXJldHVybiAwOworCisJZXJyb3IgPSBwd21fZW5hYmxlKGhhcHRpYy0+cHdtX2Rldik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoaGFwdGljLT5kZXYsCisJCQkiZmFpbGVkIHRvIGVuYWJsZSBwd20gZGV2aWNlOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBtYXg3Nzg0M19oYXB0aWNfY29uZmlnKGhhcHRpYywgdHJ1ZSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycl9jb25maWc7CisKKwloYXB0aWMtPmFjdGl2ZSA9IHRydWU7CisKKwlyZXR1cm4gMDsKKworZXJyX2NvbmZpZzoKKwlwd21fZGlzYWJsZShoYXB0aWMtPnB3bV9kZXYpOworCisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IG1heDc3ODQzX2hhcHRpY19kaXNhYmxlKHN0cnVjdCBtYXg3Nzg0M19oYXB0aWMgKmhhcHRpYykKK3sKKwlpbnQgZXJyb3I7CisKKwlpZiAoIWhhcHRpYy0+YWN0aXZlKQorCQlyZXR1cm4gMDsKKworCWVycm9yID0gbWF4Nzc4NDNfaGFwdGljX2NvbmZpZyhoYXB0aWMsIGZhbHNlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXB3bV9kaXNhYmxlKGhhcHRpYy0+cHdtX2Rldik7CisKKwloYXB0aWMtPmFjdGl2ZSA9IGZhbHNlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1heDc3ODQzX2hhcHRpY19wbGF5X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBtYXg3Nzg0M19oYXB0aWMgKmhhcHRpYyA9CisJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1heDc3ODQzX2hhcHRpYywgd29yayk7CisJaW50IGVycm9yOworCisJbXV0ZXhfbG9jaygmaGFwdGljLT5tdXRleCk7CisKKwlpZiAoaGFwdGljLT5zdXNwZW5kZWQpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWlmIChoYXB0aWMtPm1hZ25pdHVkZSkgeworCQllcnJvciA9IG1heDc3ODQzX2hhcHRpY19zZXRfZHV0eV9jeWNsZShoYXB0aWMpOworCQlpZiAoZXJyb3IpIHsKKwkJCWRldl9lcnIoaGFwdGljLT5kZXYsCisJCQkJImZhaWxlZCB0byBzZXQgZHV0eSBjeWNsZTogJWRcbiIsIGVycm9yKTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCWVycm9yID0gbWF4Nzc4NDNfaGFwdGljX2VuYWJsZShoYXB0aWMpOworCQlpZiAoZXJyb3IpCisJCQlkZXZfZXJyKGhhcHRpYy0+ZGV2LAorCQkJCSJjYW5ub3QgZW5hYmxlIGhhcHRpYzogJWRcbiIsIGVycm9yKTsKKwl9IGVsc2UgeworCQllcnJvciA9IG1heDc3ODQzX2hhcHRpY19kaXNhYmxlKGhhcHRpYyk7CisJCWlmIChlcnJvcikKKwkJCWRldl9lcnIoaGFwdGljLT5kZXYsCisJCQkJImNhbm5vdCBkaXNhYmxlIGhhcHRpYzogJWRcbiIsIGVycm9yKTsKKwl9CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZoYXB0aWMtPm11dGV4KTsKK30KKworc3RhdGljIGludCBtYXg3Nzg0M19oYXB0aWNfcGxheV9lZmZlY3Qoc3RydWN0IGlucHV0X2RldiAqZGV2LCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgZmZfZWZmZWN0ICplZmZlY3QpCit7CisJc3RydWN0IG1heDc3ODQzX2hhcHRpYyAqaGFwdGljID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKwl1NjQgcGVyaW9kX21hZ19tdWx0aTsKKworCWhhcHRpYy0+bWFnbml0dWRlID0gZWZmZWN0LT51LnJ1bWJsZS5zdHJvbmdfbWFnbml0dWRlOworCWlmICghaGFwdGljLT5tYWduaXR1ZGUpCisJCWhhcHRpYy0+bWFnbml0dWRlID0gZWZmZWN0LT51LnJ1bWJsZS53ZWFrX21hZ25pdHVkZTsKKworCXBlcmlvZF9tYWdfbXVsdGkgPSAodTY0KWhhcHRpYy0+cHdtX2Rldi0+cGVyaW9kICogaGFwdGljLT5tYWduaXR1ZGU7CisJaGFwdGljLT5wd21fZHV0eSA9ICh1bnNpZ25lZCBpbnQpKHBlcmlvZF9tYWdfbXVsdGkgPj4KKwkJCQkJCU1BWF9NQUdOSVRVREVfU0hJRlQpOworCisJc2NoZWR1bGVfd29yaygmaGFwdGljLT53b3JrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDc3ODQzX2hhcHRpY19vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWF4Nzc4NDNfaGFwdGljICpoYXB0aWMgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnJvcjsKKworCWVycm9yID0gbWF4Nzc4NDNfaGFwdGljX2JpYXMoaGFwdGljLCB0cnVlKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gcmVndWxhdG9yX2VuYWJsZShoYXB0aWMtPm1vdG9yX3JlZyk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoaGFwdGljLT5kZXYsCisJCQkiZmFpbGVkIHRvIGVuYWJsZSByZWd1bGF0b3I6ICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWF4Nzc4NDNfaGFwdGljX2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWF4Nzc4NDNfaGFwdGljICpoYXB0aWMgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnJvcjsKKworCWNhbmNlbF93b3JrX3N5bmMoJmhhcHRpYy0+d29yayk7CisJbWF4Nzc4NDNfaGFwdGljX2Rpc2FibGUoaGFwdGljKTsKKworCWVycm9yID0gcmVndWxhdG9yX2Rpc2FibGUoaGFwdGljLT5tb3Rvcl9yZWcpOworCWlmIChlcnJvcikKKwkJZGV2X2VycihoYXB0aWMtPmRldiwKKwkJCSJmYWlsZWQgdG8gZGlzYWJsZSByZWd1bGF0b3I6ICVkXG4iLCBlcnJvcik7CisKKwltYXg3Nzg0M19oYXB0aWNfYmlhcyhoYXB0aWMsIGZhbHNlKTsKK30KKworc3RhdGljIGludCBtYXg3Nzg0M19oYXB0aWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbWF4Nzc4NDMgKm1heDc3ODQzID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBtYXg3Nzg0M19oYXB0aWMgKmhhcHRpYzsKKwlpbnQgZXJyb3I7CisKKwloYXB0aWMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpoYXB0aWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhhcHRpYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloYXB0aWMtPnJlZ21hcF9oYXB0aWMgPSBtYXg3Nzg0My0+cmVnbWFwOworCWhhcHRpYy0+ZGV2ID0gJnBkZXYtPmRldjsKKwloYXB0aWMtPnR5cGUgPSBNQVg3Nzg0M19IQVBUSUNfTFJBOworCWhhcHRpYy0+cHdtX2Rpdmlzb3IgPSBNQVg3Nzg0M19IQVBUSUNfUFdNX0RJVklTT1JfMTI4OworCisJSU5JVF9XT1JLKCZoYXB0aWMtPndvcmssIG1heDc3ODQzX2hhcHRpY19wbGF5X3dvcmspOworCW11dGV4X2luaXQoJmhhcHRpYy0+bXV0ZXgpOworCisJaGFwdGljLT5wd21fZGV2ID0gZGV2bV9wd21fZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIoaGFwdGljLT5wd21fZGV2KSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHB3bSBkZXZpY2VcbiIpOworCQlyZXR1cm4gUFRSX0VSUihoYXB0aWMtPnB3bV9kZXYpOworCX0KKworCWhhcHRpYy0+bW90b3JfcmVnID0gZGV2bV9yZWd1bGF0b3JfZ2V0X2V4Y2x1c2l2ZSgmcGRldi0+ZGV2LCAiaGFwdGljIik7CisJaWYgKElTX0VSUihoYXB0aWMtPm1vdG9yX3JlZykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCByZWd1bGF0b3JcbiIpOworCQlyZXR1cm4gUFRSX0VSUihoYXB0aWMtPm1vdG9yX3JlZyk7CisJfQorCisJaGFwdGljLT5pbnB1dF9kZXYgPSBkZXZtX2lucHV0X2FsbG9jYXRlX2RldmljZSgmcGRldi0+ZGV2KTsKKwlpZiAoIWhhcHRpYy0+aW5wdXRfZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwloYXB0aWMtPmlucHV0X2Rldi0+bmFtZSA9ICJtYXg3Nzg0My1oYXB0aWMiOworCWhhcHRpYy0+aW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMTsKKwloYXB0aWMtPmlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisJaGFwdGljLT5pbnB1dF9kZXYtPm9wZW4gPSBtYXg3Nzg0M19oYXB0aWNfb3BlbjsKKwloYXB0aWMtPmlucHV0X2Rldi0+Y2xvc2UgPSBtYXg3Nzg0M19oYXB0aWNfY2xvc2U7CisJaW5wdXRfc2V0X2RydmRhdGEoaGFwdGljLT5pbnB1dF9kZXYsIGhhcHRpYyk7CisJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaGFwdGljLT5pbnB1dF9kZXYsIEVWX0ZGLCBGRl9SVU1CTEUpOworCisJZXJyb3IgPSBpbnB1dF9mZl9jcmVhdGVfbWVtbGVzcyhoYXB0aWMtPmlucHV0X2RldiwgTlVMTCwKKwkJCW1heDc3ODQzX2hhcHRpY19wbGF5X2VmZmVjdCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgZm9yY2UtZmVlZGJhY2tcbiIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaGFwdGljLT5pbnB1dF9kZXYpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGhhcHRpYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBtYXg3Nzg0M19oYXB0aWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtYXg3Nzg0M19oYXB0aWMgKmhhcHRpYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBlcnJvcjsKKworCWVycm9yID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZoYXB0aWMtPm11dGV4KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCW1heDc3ODQzX2hhcHRpY19kaXNhYmxlKGhhcHRpYyk7CisKKwloYXB0aWMtPnN1c3BlbmRlZCA9IHRydWU7CisKKwltdXRleF91bmxvY2soJmhhcHRpYy0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tYXliZV91bnVzZWQgbWF4Nzc4NDNfaGFwdGljX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBtYXg3Nzg0M19oYXB0aWMgKmhhcHRpYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGludCBtYWduaXR1ZGU7CisKKwltdXRleF9sb2NrKCZoYXB0aWMtPm11dGV4KTsKKworCWhhcHRpYy0+c3VzcGVuZGVkID0gZmFsc2U7CisKKwltYWduaXR1ZGUgPSBBQ0NFU1NfT05DRShoYXB0aWMtPm1hZ25pdHVkZSk7CisJaWYgKG1hZ25pdHVkZSkKKwkJbWF4Nzc4NDNfaGFwdGljX2VuYWJsZShoYXB0aWMpOworCisJbXV0ZXhfdW5sb2NrKCZoYXB0aWMtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobWF4Nzc4NDNfaGFwdGljX3BtX29wcywKKwkJbWF4Nzc4NDNfaGFwdGljX3N1c3BlbmQsIG1heDc3ODQzX2hhcHRpY19yZXN1bWUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtYXg3Nzg0M19oYXB0aWNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJtYXg3Nzg0My1oYXB0aWMiLAorCQkucG0JPSAmbWF4Nzc4NDNfaGFwdGljX3BtX29wcywKKwl9LAorCS5wcm9iZQkJPSBtYXg3Nzg0M19oYXB0aWNfcHJvYmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtYXg3Nzg0M19oYXB0aWNfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiSmFld29uIEtpbSA8amFld29uMDIua2ltQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNQVhJTSBNQVg3Nzg0MyBIYXB0aWMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvbW1hODQ1MC5jIGIvZHJpdmVycy9pbnB1dC9taXNjL21tYTg0NTAuYwppbmRleCA5ODIyODc3Li4xOWM3MzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvbW1hODQ1MC5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9tbWE4NDUwLmMKQEAgLTE3NCwxMiArMTc0LDEzIEBACiAJc3RydWN0IG1tYTg0NTAgKm07CiAJaW50IGVycjsKIAotCW0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbW1hODQ1MCksIEdGUF9LRVJORUwpOwotCWlkZXYgPSBpbnB1dF9hbGxvY2F0ZV9wb2xsZWRfZGV2aWNlKCk7Ci0JaWYgKCFtIHx8ICFpZGV2KSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2ZyZWVfbWVtOwotCX0KKwltID0gZGV2bV9remFsbG9jKCZjLT5kZXYsIHNpemVvZigqbSksIEdGUF9LRVJORUwpOworCWlmICghbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZGV2ID0gZGV2bV9pbnB1dF9hbGxvY2F0ZV9wb2xsZWRfZGV2aWNlKCZjLT5kZXYpOworCWlmICghaWRldikKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAltLT5jbGllbnQgPSBjOwogCW0tPmlkZXYgPSBpZGV2OwpAQCAtMTg3LDcgKzE4OCw2IEBACiAJaWRldi0+cHJpdmF0ZQkJPSBtOwogCWlkZXYtPmlucHV0LT5uYW1lCT0gTU1BODQ1MF9EUlZfTkFNRTsKIAlpZGV2LT5pbnB1dC0+aWQuYnVzdHlwZQk9IEJVU19JMkM7Ci0JaWRldi0+aW5wdXQtPmRldi5wYXJlbnQgPSAmYy0+ZGV2OwogCWlkZXYtPnBvbGwJCT0gbW1hODQ1MF9wb2xsOwogCWlkZXYtPnBvbGxfaW50ZXJ2YWwJPSBQT0xMX0lOVEVSVkFMOwogCWlkZXYtPnBvbGxfaW50ZXJ2YWxfbWF4CT0gUE9MTF9JTlRFUlZBTF9NQVg7CkBAIC0yMDIsMjkgKzIwMiwxMiBAQAogCWVyciA9IGlucHV0X3JlZ2lzdGVyX3BvbGxlZF9kZXZpY2UoaWRldik7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZjLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgcG9sbGVkIGlucHV0IGRldmljZVxuIik7Ci0JCWdvdG8gZXJyX2ZyZWVfbWVtOworCQlyZXR1cm4gZXJyOwogCX0KIAogCWkyY19zZXRfY2xpZW50ZGF0YShjLCBtKTsKIAogCXJldHVybiAwOwotCi1lcnJfZnJlZV9tZW06Ci0JaW5wdXRfZnJlZV9wb2xsZWRfZGV2aWNlKGlkZXYpOwotCWtmcmVlKG0pOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgbW1hODQ1MF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmMpCi17Ci0Jc3RydWN0IG1tYTg0NTAgKm0gPSBpMmNfZ2V0X2NsaWVudGRhdGEoYyk7Ci0Jc3RydWN0IGlucHV0X3BvbGxlZF9kZXYgKmlkZXYgPSBtLT5pZGV2OwotCi0JaW5wdXRfdW5yZWdpc3Rlcl9wb2xsZWRfZGV2aWNlKGlkZXYpOwotCWlucHV0X2ZyZWVfcG9sbGVkX2RldmljZShpZGV2KTsKLQlrZnJlZShtKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbW1hODQ1MF9pZFtdID0gewpAQCAtMjQyLDExICsyMjUsOSBAQAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1tYTg0NTBfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gTU1BODQ1MF9EUlZfTkFNRSwKLQkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG1tYTg0NTBfZHRfaWRzLAogCX0sCiAJLnByb2JlCQk9IG1tYTg0NTBfcHJvYmUsCi0JLnJlbW92ZQkJPSBtbWE4NDUwX3JlbW92ZSwKIAkuaWRfdGFibGUJPSBtbWE4NDUwX2lkLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3BhbG1hcy1wd3JidXR0b24uYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9wYWxtYXMtcHdyYnV0dG9uLmMKaW5kZXggMWY5YjVlZS4uMWUxYmFlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL3BhbG1hcy1wd3JidXR0b24uYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvcGFsbWFzLXB3cmJ1dHRvbi5jCkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJCSBwYWxtYXNfcHdyb25fc3VzcGVuZCwgcGFsbWFzX3B3cm9uX3Jlc3VtZSk7CiAKICNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX3BhbG1hc19wd3JfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX3BhbG1hc19wd3JfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInRpLHBhbG1hcy1wd3JidXR0b24iIH0sCiAJeyB9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbWlzYy9wbTg5NDEtcHdya2V5LmMgYi9kcml2ZXJzL2lucHV0L21pc2MvcG04OTQxLXB3cmtleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2N2RiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L21pc2MvcG04OTQxLXB3cmtleS5jCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBTb255IE1vYmlsZSBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNkZWZpbmUgUE9OX1JFVjIJCQkweDAxCisKKyNkZWZpbmUgUE9OX1JUX1NUUwkJCTB4MTAKKyNkZWZpbmUgIFBPTl9LUERQV1JfTl9TRVQJCUJJVCgwKQorCisjZGVmaW5lIFBPTl9QU19IT0xEX1JTVF9DVEwJCTB4NWEKKyNkZWZpbmUgUE9OX1BTX0hPTERfUlNUX0NUTDIJCTB4NWIKKyNkZWZpbmUgIFBPTl9QU19IT0xEX0VOQUJMRQkJQklUKDcpCisjZGVmaW5lICBQT05fUFNfSE9MRF9UWVBFX01BU0sJCTB4MGYKKyNkZWZpbmUgIFBPTl9QU19IT0xEX1RZUEVfU0hVVERPV04JNAorI2RlZmluZSAgUE9OX1BTX0hPTERfVFlQRV9IQVJEX1JFU0VUCTcKKworI2RlZmluZSBQT05fUFVMTF9DVEwJCQkweDcwCisjZGVmaW5lICBQT05fS1BEUFdSX1BVTExfVVAJCUJJVCgxKQorCisjZGVmaW5lIFBPTl9EQkNfQ1RMCQkJMHg3MQorI2RlZmluZSAgUE9OX0RCQ19ERUxBWV9NQVNLCQkweDcKKworCitzdHJ1Y3QgcG04OTQxX3B3cmtleSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCBpcnE7CisJdTMyIGJhc2VhZGRyOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppbnB1dDsKKworCXVuc2lnbmVkIGludCByZXZpc2lvbjsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcmVib290X25vdGlmaWVyOworfTsKKworc3RhdGljIGludCBwbTg5NDFfcmVib290X25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAorCQkJCXVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQoreworCXN0cnVjdCBwbTg5NDFfcHdya2V5ICpwd3JrZXkgPSBjb250YWluZXJfb2YobmIsIHN0cnVjdCBwbTg5NDFfcHdya2V5LAorCQkJCQkJICAgIHJlYm9vdF9ub3RpZmllcik7CisJdW5zaWduZWQgaW50IGVuYWJsZV9yZWc7CisJdW5zaWduZWQgaW50IHJlc2V0X3R5cGU7CisJaW50IGVycm9yOworCisJLyogUE1JQ3Mgd2l0aCByZXZpc2lvbiAwIGhhdmUgdGhlIGVuYWJsZSBiaXQgaW4gc2FtZSByZWdpc3RlciBhcyBjdHJsICovCisJaWYgKHB3cmtleS0+cmV2aXNpb24gPT0gMCkKKwkJZW5hYmxlX3JlZyA9IFBPTl9QU19IT0xEX1JTVF9DVEw7CisJZWxzZQorCQllbmFibGVfcmVnID0gUE9OX1BTX0hPTERfUlNUX0NUTDI7CisKKwllcnJvciA9IHJlZ21hcF91cGRhdGVfYml0cyhwd3JrZXktPnJlZ21hcCwKKwkJCQkgICBwd3JrZXktPmJhc2VhZGRyICsgZW5hYmxlX3JlZywKKwkJCQkgICBQT05fUFNfSE9MRF9FTkFCTEUsCisJCQkJICAgMCk7CisJaWYgKGVycm9yKQorCQlkZXZfZXJyKHB3cmtleS0+ZGV2LAorCQkJInVuYWJsZSB0byBjbGVhciBwcyBob2xkIHJlc2V0IGVuYWJsZTogJWRcbiIsCisJCQllcnJvcik7CisKKwkvKgorCSAqIFVwZGF0ZXMgb2YgUE9OX1BTX0hPTERfRU5BQkxFIHJlcXVpcmVzIDMgc2xlZXAgY3ljbGVzIGJldHdlZW4KKwkgKiB3cml0ZXMuCisJICovCisJdXNsZWVwX3JhbmdlKDEwMCwgMTAwMCk7CisKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIFNZU19IQUxUOgorCWNhc2UgU1lTX1BPV0VSX09GRjoKKwkJcmVzZXRfdHlwZSA9IFBPTl9QU19IT0xEX1RZUEVfU0hVVERPV047CisJCWJyZWFrOworCWNhc2UgU1lTX1JFU1RBUlQ6CisJZGVmYXVsdDoKKwkJcmVzZXRfdHlwZSA9IFBPTl9QU19IT0xEX1RZUEVfSEFSRF9SRVNFVDsKKwkJYnJlYWs7CisJfTsKKworCWVycm9yID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHB3cmtleS0+cmVnbWFwLAorCQkJCSAgIHB3cmtleS0+YmFzZWFkZHIgKyBQT05fUFNfSE9MRF9SU1RfQ1RMLAorCQkJCSAgIFBPTl9QU19IT0xEX1RZUEVfTUFTSywKKwkJCQkgICByZXNldF90eXBlKTsKKwlpZiAoZXJyb3IpCisJCWRldl9lcnIocHdya2V5LT5kZXYsICJ1bmFibGUgdG8gc2V0IHBzIGhvbGQgcmVzZXQgdHlwZTogJWRcbiIsCisJCQllcnJvcik7CisKKwllcnJvciA9IHJlZ21hcF91cGRhdGVfYml0cyhwd3JrZXktPnJlZ21hcCwKKwkJCQkgICBwd3JrZXktPmJhc2VhZGRyICsgZW5hYmxlX3JlZywKKwkJCQkgICBQT05fUFNfSE9MRF9FTkFCTEUsCisJCQkJICAgUE9OX1BTX0hPTERfRU5BQkxFKTsKKwlpZiAoZXJyb3IpCisJCWRldl9lcnIocHdya2V5LT5kZXYsICJ1bmFibGUgdG8gcmUtc2V0IGVuYWJsZTogJWRcbiIsIGVycm9yKTsKKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIGlycXJldHVybl90IHBtODk0MV9wd3JrZXlfaXJxKGludCBpcnEsIHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBwbTg5NDFfcHdya2V5ICpwd3JrZXkgPSBfZGF0YTsKKwl1bnNpZ25lZCBpbnQgc3RzOworCWludCBlcnJvcjsKKworCWVycm9yID0gcmVnbWFwX3JlYWQocHdya2V5LT5yZWdtYXAsCisJCQkgICAgcHdya2V5LT5iYXNlYWRkciArIFBPTl9SVF9TVFMsICZzdHMpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJaW5wdXRfcmVwb3J0X2tleShwd3JrZXktPmlucHV0LCBLRVlfUE9XRVIsICEhKHN0cyAmIFBPTl9LUERQV1JfTl9TRVQpKTsKKwlpbnB1dF9zeW5jKHB3cmtleS0+aW5wdXQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIHBtODk0MV9wd3JrZXlfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBtODk0MV9wd3JrZXkgKnB3cmtleSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWVuYWJsZV9pcnFfd2FrZShwd3JrZXktPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBwbTg5NDFfcHdya2V5X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBtODk0MV9wd3JrZXkgKnB3cmtleSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWRpc2FibGVfaXJxX3dha2UocHdya2V5LT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhwbTg5NDFfcHdyX2tleV9wbV9vcHMsCisJCQkgcG04OTQxX3B3cmtleV9zdXNwZW5kLCBwbTg5NDFfcHdya2V5X3Jlc3VtZSk7CisKK3N0YXRpYyBpbnQgcG04OTQxX3B3cmtleV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbTg5NDFfcHdya2V5ICpwd3JrZXk7CisJYm9vbCBwdWxsX3VwOworCXUzMiByZXFfZGVsYXk7CisJaW50IGVycm9yOworCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAiZGVib3VuY2UiLCAmcmVxX2RlbGF5KSkKKwkJcmVxX2RlbGF5ID0gMTU2MjU7CisKKwlpZiAocmVxX2RlbGF5ID4gMjAwMDAwMCB8fCByZXFfZGVsYXkgPT0gMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIGRlYm91bmNlIHRpbWU6ICV1XG4iLCByZXFfZGVsYXkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwdWxsX3VwID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLCAiYmlhcy1wdWxsLXVwIik7CisKKwlwd3JrZXkgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwd3JrZXkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB3cmtleSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwd3JrZXktPmRldiA9ICZwZGV2LT5kZXY7CisKKwlwd3JrZXktPnJlZ21hcCA9IGRldl9nZXRfcmVnbWFwKHBkZXYtPmRldi5wYXJlbnQsIE5VTEwpOworCWlmICghcHdya2V5LT5yZWdtYXApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGxvY2F0ZSByZWdtYXBcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwd3JrZXktPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHB3cmtleS0+aXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycVxuIik7CisJCXJldHVybiBwd3JrZXktPmlycTsKKwl9CisKKwllcnJvciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAicmVnIiwKKwkJCQkgICAgICZwd3JrZXktPmJhc2VhZGRyKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gcmVnbWFwX3JlYWQocHdya2V5LT5yZWdtYXAsIHB3cmtleS0+YmFzZWFkZHIgKyBQT05fUkVWMiwKKwkJCSAgICAmcHdya2V5LT5yZXZpc2lvbik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBzZXQgZGVib3VuY2U6ICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlwd3JrZXktPmlucHV0ID0gZGV2bV9pbnB1dF9hbGxvY2F0ZV9kZXZpY2UoJnBkZXYtPmRldik7CisJaWYgKCFwd3JrZXktPmlucHV0KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBpbnB1dCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpbnB1dF9zZXRfY2FwYWJpbGl0eShwd3JrZXktPmlucHV0LCBFVl9LRVksIEtFWV9QT1dFUik7CisKKwlwd3JrZXktPmlucHV0LT5uYW1lID0gInBtODk0MV9wd3JrZXkiOworCXB3cmtleS0+aW5wdXQtPnBoeXMgPSAicG04OTQxX3B3cmtleS9pbnB1dDAiOworCisJcmVxX2RlbGF5ID0gKHJlcV9kZWxheSA8PCA2KSAvIFVTRUNfUEVSX1NFQzsKKwlyZXFfZGVsYXkgPSBpbG9nMihyZXFfZGVsYXkpOworCisJZXJyb3IgPSByZWdtYXBfdXBkYXRlX2JpdHMocHdya2V5LT5yZWdtYXAsCisJCQkJICAgcHdya2V5LT5iYXNlYWRkciArIFBPTl9EQkNfQ1RMLAorCQkJCSAgIFBPTl9EQkNfREVMQVlfTUFTSywKKwkJCQkgICByZXFfZGVsYXkpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0IGRlYm91bmNlOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSByZWdtYXBfdXBkYXRlX2JpdHMocHdya2V5LT5yZWdtYXAsCisJCQkJICAgcHdya2V5LT5iYXNlYWRkciArIFBPTl9QVUxMX0NUTCwKKwkJCQkgICBQT05fS1BEUFdSX1BVTExfVVAsCisJCQkJICAgcHVsbF91cCA/IFBPTl9LUERQV1JfUFVMTF9VUCA6IDApOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0IHB1bGw6ICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwgcHdya2V5LT5pcnEsCisJCQkJCSAgTlVMTCwgcG04OTQxX3B3cmtleV9pcnEsCisJCQkJCSAgSVJRRl9PTkVTSE9ULAorCQkJCQkgICJwbTg5NDFfcHdya2V5IiwgcHdya2V5KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHJlcXVlc3RpbmcgSVJROiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocHdya2V5LT5pbnB1dCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBpbnB1dCBkZXZpY2U6ICVkXG4iLAorCQkJZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcHdya2V5LT5yZWJvb3Rfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IHBtODk0MV9yZWJvb3Rfbm90aWZ5LAorCWVycm9yID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwd3JrZXktPnJlYm9vdF9ub3RpZmllcik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciByZWJvb3Qgbm90aWZpZXI6ICVkXG4iLAorCQkJZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHdya2V5KTsKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwbTg5NDFfcHdya2V5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBwbTg5NDFfcHdya2V5ICpwd3JrZXkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAwKTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcHdya2V5LT5yZWJvb3Rfbm90aWZpZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBtODk0MV9wd3Jfa2V5X2lkX3RhYmxlW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODk0MS1wd3JrZXkiIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcG04OTQxX3B3cl9rZXlfaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwbTg5NDFfcHdya2V5X2RyaXZlciA9IHsKKwkucHJvYmUgPSBwbTg5NDFfcHdya2V5X3Byb2JlLAorCS5yZW1vdmUgPSBwbTg5NDFfcHdya2V5X3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJwbTg5NDEtcHdya2V5IiwKKwkJLnBtID0gJnBtODk0MV9wd3Jfa2V5X3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHBtODk0MV9wd3Jfa2V5X2lkX3RhYmxlKSwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocG04OTQxX3B3cmtleV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlBNODk0MSBQb3dlciBLZXkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvcHdtLWJlZXBlci5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3B3bS1iZWVwZXIuYwppbmRleCBhMjhlZTcwLi5lODJlZGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvcHdtLWJlZXBlci5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9wd20tYmVlcGVyLmMKQEAgLTUwLDcgKzUwLDYgQEAKIAl9CiAKIAlpZiAodmFsdWUgPT0gMCkgewotCQlwd21fY29uZmlnKGJlZXBlci0+cHdtLCAwLCAwKTsKIAkJcHdtX2Rpc2FibGUoYmVlcGVyLT5wd20pOwogCX0gZWxzZSB7CiAJCXBlcmlvZCA9IEhaX1RPX05BTk9TRUNPTkRTKHZhbHVlKTsKQEAgLTE2OSwxMiArMTY4LDYgQEAKIHN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhwd21fYmVlcGVyX3BtX29wcywKIAkJCSBwd21fYmVlcGVyX3N1c3BlbmQsIHB3bV9iZWVwZXJfcmVzdW1lKTsKIAotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotI2RlZmluZSBQV01fQkVFUEVSX1BNX09QUyAoJnB3bV9iZWVwZXJfcG1fb3BzKQotI2Vsc2UKLSNkZWZpbmUgUFdNX0JFRVBFUl9QTV9PUFMgTlVMTAotI2VuZGlmCi0KICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHB3bV9iZWVwZXJfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInB3bS1iZWVwZXIiLCB9LApAQCAtMTg3LDcgKzE4MCw3IEBACiAJLnJlbW92ZSA9IHB3bV9iZWVwZXJfcmVtb3ZlLAogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gInB3bS1iZWVwZXIiLAotCQkucG0JPSBQV01fQkVFUEVSX1BNX09QUywKKwkJLnBtCT0gJnB3bV9iZWVwZXJfcG1fb3BzLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIocHdtX2JlZXBlcl9tYXRjaCksCiAJfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21pc2MvcmVndWxhdG9yLWhhcHRpYy5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3JlZ3VsYXRvci1oYXB0aWMuYwppbmRleCAxMzJlYjkxLi42YmYzZjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvcmVndWxhdG9yLWhhcHRpYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9yZWd1bGF0b3ItaGFwdGljLmMKQEAgLTI0NSw3ICsyNDUsNyBAQAogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHJlZ3VsYXRvcl9oYXB0aWNfcG1fb3BzLAogCQlyZWd1bGF0b3JfaGFwdGljX3N1c3BlbmQsIHJlZ3VsYXRvcl9oYXB0aWNfcmVzdW1lKTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcmVndWxhdG9yX2hhcHRpY19kdF9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcmVndWxhdG9yX2hhcHRpY19kdF9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAicmVndWxhdG9yLWhhcHRpYyIgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL3RwczY1MjE4LXB3cmJ1dHRvbi5jIGIvZHJpdmVycy9pbnB1dC9taXNjL3RwczY1MjE4LXB3cmJ1dHRvbi5jCmluZGV4IDU0NTA4ZGUuLmEzOWI2MjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbWlzYy90cHM2NTIxOC1wd3JidXR0b24uYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvdHBzNjUyMTgtcHdyYnV0dG9uLmMKQEAgLTEwNiw3ICsxMDYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBvZl90cHM2NTIxOF9wd3JfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX3RwczY1MjE4X3B3cl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAidGksdHBzNjUyMTgtcHdyYnV0dG9uIiB9LAogCXsgfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2FscHMuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCmluZGV4IDFiZDE1ZWIuLmU2NzA4ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5jCkBAIC0xNTMsMTAgKzE1MywxOCBAQAogCUFMUFNfUFJPVE9fVjcsIDB4NDgsIDB4NDgsIEFMUFNfRFVBTFBPSU5UCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGFscHNfcHJvdG9jb2xfaW5mbyBhbHBzX3Y4X3Byb3RvY29sX2RhdGEgPSB7CisJQUxQU19QUk9UT19WOCwgMHgxOCwgMHgxOCwgMAorfTsKKwogc3RhdGljIHZvaWQgYWxwc19zZXRfYWJzX3BhcmFtc19zdChzdHJ1Y3QgYWxwc19kYXRhICpwcml2LAogCQkJCSAgIHN0cnVjdCBpbnB1dF9kZXYgKmRldjEpOwogc3RhdGljIHZvaWQgYWxwc19zZXRfYWJzX3BhcmFtc19tdChzdHJ1Y3QgYWxwc19kYXRhICpwcml2LAogCQkJCSAgIHN0cnVjdCBpbnB1dF9kZXYgKmRldjEpOworc3RhdGljIHZvaWQgYWxwc19zZXRfYWJzX3BhcmFtc192NyhzdHJ1Y3QgYWxwc19kYXRhICpwcml2LAorCQkJCSAgIHN0cnVjdCBpbnB1dF9kZXYgKmRldjEpOworc3RhdGljIHZvaWQgYWxwc19zZXRfYWJzX3BhcmFtc19zczRfdjIoc3RydWN0IGFscHNfZGF0YSAqcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGlucHV0X2RldiAqZGV2MSk7CiAKIC8qIFBhY2tldCBmb3JtYXRzIGFyZSBkZXNjcmliZWQgaW4gRG9jdW1lbnRhdGlvbi9pbnB1dC9hbHBzLnR4dCAqLwogCkBAIC0yNDMsNiArMjUxLDE0IEBACiAJCXJldHVybjsKIAl9CiAKKwkvKiBOb24gaW50ZXJsZWF2ZWQgVjIgZHVhbHBvaW50IGhhcyBzZXBhcmF0ZSBzdGljayBidXR0b24gYml0cyAqLworCWlmIChwcml2LT5wcm90b192ZXJzaW9uID09IEFMUFNfUFJPVE9fVjIgJiYKKwkgICAgcHJpdi0+ZmxhZ3MgPT0gKEFMUFNfUEFTUyB8IEFMUFNfRFVBTFBPSU5UKSkgeworCQlsZWZ0IHw9IHBhY2tldFswXSAmIDE7CisJCXJpZ2h0IHw9IHBhY2tldFswXSAmIDI7CisJCW1pZGRsZSB8PSBwYWNrZXRbMF0gJiA0OworCX0KKwogCWFscHNfcmVwb3J0X2J1dHRvbnMoZGV2LCBkZXYyLCBsZWZ0LCByaWdodCwgbWlkZGxlKTsKIAogCS8qIENvbnZlcnQgaGFyZHdhcmUgdGFwIHRvIGEgcmVhc29uYWJsZSBaIHZhbHVlICovCkBAIC0xMDg1LDYgKzExMDEsMTc2IEBACiAJCWFscHNfcHJvY2Vzc190b3VjaHBhZF9wYWNrZXRfdjcocHNtb3VzZSk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGFscHNfZ2V0X3BrdF9pZF9zczRfdjIodW5zaWduZWQgY2hhciAqYnl0ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHBrdF9pZCA9IFNTNF9QQUNLRVRfSURfSURMRTsKKworCWlmIChieXRlWzBdID09IDB4MTggJiYgYnl0ZVsxXSA9PSAweDEwICYmIGJ5dGVbMl0gPT0gMHgwMCAmJgorCSAgICAoYnl0ZVszXSAmIDB4ODgpID09IDB4MDggJiYgYnl0ZVs0XSA9PSAweDEwICYmIGJ5dGVbNV0gPT0gMHgwMCkgeworCQlwa3RfaWQgPSBTUzRfUEFDS0VUX0lEX0lETEU7CisJfSBlbHNlIGlmICghKGJ5dGVbM10gJiAweDEwKSkgeworCQlwa3RfaWQgPSBTUzRfUEFDS0VUX0lEX09ORTsKKwl9IGVsc2UgaWYgKCEoYnl0ZVszXSAmIDB4MjApKSB7CisJCXBrdF9pZCA9IFNTNF9QQUNLRVRfSURfVFdPOworCX0gZWxzZSB7CisJCXBrdF9pZCA9IFNTNF9QQUNLRVRfSURfTVVMVEk7CisJfQorCisJcmV0dXJuIHBrdF9pZDsKK30KKworc3RhdGljIGludCBhbHBzX2RlY29kZV9zczRfdjIoc3RydWN0IGFscHNfZmllbGRzICpmLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqcCwgc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IGFscHNfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisJdW5zaWduZWQgY2hhciBwa3RfaWQ7CisJdW5zaWduZWQgaW50IG5vX2RhdGFfeCwgbm9fZGF0YV95OworCisJcGt0X2lkID0gYWxwc19nZXRfcGt0X2lkX3NzNF92MihwKTsKKworCS8qIEN1cnJlbnQgcGFja2V0IGlzIDFGaW5nZXIgY29vcmRpbmF0ZSBwYWNrZXQgKi8KKwlzd2l0Y2ggKHBrdF9pZCkgeworCWNhc2UgU1M0X1BBQ0tFVF9JRF9PTkU6CisJCWYtPm10WzBdLnggPSBTUzRfMUZfWF9WMihwKTsKKwkJZi0+bXRbMF0ueSA9IFNTNF8xRl9ZX1YyKHApOworCQlmLT5wcmVzc3VyZSA9ICgoU1M0XzFGX1pfVjIocCkpICogMikgJiAweDdmOworCQlmLT5maW5nZXJzID0gMTsKKwkJZi0+Zmlyc3RfbXAgPSAwOworCQlmLT5pc19tcCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBTUzRfUEFDS0VUX0lEX1RXTzoKKwkJaWYgKHByaXYtPmZsYWdzICYgQUxQU19CVVRUT05QQUQpIHsKKwkJCWYtPm10WzBdLnggPSBTUzRfQlRMX01GX1hfVjIocCwgMCk7CisJCQlmLT5tdFswXS55ID0gU1M0X0JUTF9NRl9ZX1YyKHAsIDApOworCQkJZi0+bXRbMV0ueCA9IFNTNF9CVExfTUZfWF9WMihwLCAxKTsKKwkJCWYtPm10WzFdLnkgPSBTUzRfQlRMX01GX1lfVjIocCwgMSk7CisJCX0gZWxzZSB7CisJCQlmLT5tdFswXS54ID0gU1M0X1NURF9NRl9YX1YyKHAsIDApOworCQkJZi0+bXRbMF0ueSA9IFNTNF9TVERfTUZfWV9WMihwLCAwKTsKKwkJCWYtPm10WzFdLnggPSBTUzRfU1REX01GX1hfVjIocCwgMSk7CisJCQlmLT5tdFsxXS55ID0gU1M0X1NURF9NRl9ZX1YyKHAsIDEpOworCQl9CisJCWYtPnByZXNzdXJlID0gU1M0X01GX1pfVjIocCwgMCkgPyAweDMwIDogMDsKKworCQlpZiAoU1M0X0lTX01GX0NPTlRJTlVFKHApKSB7CisJCQlmLT5maXJzdF9tcCA9IDE7CisJCX0gZWxzZSB7CisJCQlmLT5maW5nZXJzID0gMjsKKwkJCWYtPmZpcnN0X21wID0gMDsKKwkJfQorCQlmLT5pc19tcCA9IDA7CisKKwkJYnJlYWs7CisKKwljYXNlIFNTNF9QQUNLRVRfSURfTVVMVEk6CisJCWlmIChwcml2LT5mbGFncyAmIEFMUFNfQlVUVE9OUEFEKSB7CisJCQlmLT5tdFsyXS54ID0gU1M0X0JUTF9NRl9YX1YyKHAsIDApOworCQkJZi0+bXRbMl0ueSA9IFNTNF9CVExfTUZfWV9WMihwLCAwKTsKKwkJCWYtPm10WzNdLnggPSBTUzRfQlRMX01GX1hfVjIocCwgMSk7CisJCQlmLT5tdFszXS55ID0gU1M0X0JUTF9NRl9ZX1YyKHAsIDEpOworCQkJbm9fZGF0YV94ID0gU1M0X01GUEFDS0VUX05PX0FYX0JMOworCQkJbm9fZGF0YV95ID0gU1M0X01GUEFDS0VUX05PX0FZX0JMOworCQl9IGVsc2UgeworCQkJZi0+bXRbMl0ueCA9IFNTNF9TVERfTUZfWF9WMihwLCAwKTsKKwkJCWYtPm10WzJdLnkgPSBTUzRfU1REX01GX1lfVjIocCwgMCk7CisJCQlmLT5tdFszXS54ID0gU1M0X1NURF9NRl9YX1YyKHAsIDEpOworCQkJZi0+bXRbM10ueSA9IFNTNF9TVERfTUZfWV9WMihwLCAxKTsKKwkJCW5vX2RhdGFfeCA9IFNTNF9NRlBBQ0tFVF9OT19BWDsKKwkJCW5vX2RhdGFfeSA9IFNTNF9NRlBBQ0tFVF9OT19BWTsKKwkJfQorCisJCWYtPmZpcnN0X21wID0gMDsKKwkJZi0+aXNfbXAgPSAxOworCisJCWlmIChTUzRfSVNfNUZfREVURUNURUQocCkpIHsKKwkJCWYtPmZpbmdlcnMgPSA1OworCQl9IGVsc2UgaWYgKGYtPm10WzNdLnggPT0gbm9fZGF0YV94ICYmCisJCQkgICAgIGYtPm10WzNdLnkgPT0gbm9fZGF0YV95KSB7CisJCQlmLT5tdFszXS54ID0gMDsKKwkJCWYtPm10WzNdLnkgPSAwOworCQkJZi0+ZmluZ2VycyA9IDM7CisJCX0gZWxzZSB7CisJCQlmLT5maW5nZXJzID0gNDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU1M0X1BBQ0tFVF9JRF9JRExFOgorCWRlZmF1bHQ6CisJCW1lbXNldChmLCAwLCBzaXplb2Yoc3RydWN0IGFscHNfZmllbGRzKSk7CisJCWJyZWFrOworCX0KKworCWYtPmxlZnQgPSAhIShTUzRfQlROX1YyKHApICYgMHgwMSk7CisJaWYgKCEocHJpdi0+ZmxhZ3MgJiBBTFBTX0JVVFRPTlBBRCkpIHsKKwkJZi0+cmlnaHQgPSAhIShTUzRfQlROX1YyKHApICYgMHgwMik7CisJCWYtPm1pZGRsZSA9ICEhKFNTNF9CVE5fVjIocCkgJiAweDA0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWxwc19wcm9jZXNzX3BhY2tldF9zczRfdjIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IGFscHNfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisJdW5zaWduZWQgY2hhciAqcGFja2V0ID0gcHNtb3VzZS0+cGFja2V0OworCXN0cnVjdCBpbnB1dF9kZXYgKmRldiA9IHBzbW91c2UtPmRldjsKKwlzdHJ1Y3QgYWxwc19maWVsZHMgKmYgPSAmcHJpdi0+ZjsKKworCW1lbXNldChmLCAwLCBzaXplb2Yoc3RydWN0IGFscHNfZmllbGRzKSk7CisJcHJpdi0+ZGVjb2RlX2ZpZWxkcyhmLCBwYWNrZXQsIHBzbW91c2UpOworCWlmIChwcml2LT5tdWx0aV9wYWNrZXQpIHsKKwkJLyoKKwkJICogU29tZXRpbWVzIHRoZSBmaXJzdCBwYWNrZXQgd2lsbCBpbmRpY2F0ZSBhIG11bHRpLXBhY2tldAorCQkgKiBzZXF1ZW5jZSwgYnV0IHNvbWV0aW1lcyB0aGUgbmV4dCBtdWx0aS1wYWNrZXQgd291bGQgbm90CisJCSAqIGNvbWUuIENoZWNrIGZvciB0aGlzLCBhbmQgd2hlbiBpdCBoYXBwZW5zIHByb2Nlc3MgdGhlCisJCSAqIHBvc2l0aW9uIHBhY2tldCBhcyB1c3VhbC4KKwkJICovCisJCWlmIChmLT5pc19tcCkgeworCQkJLyogTm93IHByb2Nlc3MgdGhlIDFzdCBwYWNrZXQgKi8KKwkJCXByaXYtPmRlY29kZV9maWVsZHMoZiwgcHJpdi0+bXVsdGlfZGF0YSwgcHNtb3VzZSk7CisJCX0gZWxzZSB7CisJCQlwcml2LT5tdWx0aV9wYWNrZXQgPSAwOworCQl9CisJfQorCisJLyoKKwkgKiAiZi5pc19tcCIgd291bGQgYWx3YXlzIGJlICcwJyBhZnRlciBtZXJnaW5nIHRoZSAxc3QgYW5kIDJuZCBwYWNrZXQuCisJICogV2hlbiBpdCBpcyBzZXQsIGl0IG1lYW5zIDJuZCBwYWNrZXQgY29tZXMgd2l0aG91dCAxc3QgcGFja2V0IGNvbWUuCisJICovCisJaWYgKGYtPmlzX21wKQorCQlyZXR1cm47CisKKwkvKiBTYXZlIHRoZSBmaXJzdCBwYWNrZXQgKi8KKwlpZiAoIXByaXYtPm11bHRpX3BhY2tldCAmJiBmLT5maXJzdF9tcCkgeworCQlwcml2LT5tdWx0aV9wYWNrZXQgPSAxOworCQltZW1jcHkocHJpdi0+bXVsdGlfZGF0YSwgcGFja2V0LCBzaXplb2YocHJpdi0+bXVsdGlfZGF0YSkpOworCQlyZXR1cm47CisJfQorCisJcHJpdi0+bXVsdGlfcGFja2V0ID0gMDsKKworCWFscHNfcmVwb3J0X210X2RhdGEocHNtb3VzZSwgKGYtPmZpbmdlcnMgPD0gNCkgPyBmLT5maW5nZXJzIDogNCk7CisKKwlpbnB1dF9tdF9yZXBvcnRfZmluZ2VyX2NvdW50KGRldiwgZi0+ZmluZ2Vycyk7CisKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGYtPmxlZnQpOworCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fUklHSFQsIGYtPnJpZ2h0KTsKKwlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX01JRERMRSwgZi0+bWlkZGxlKTsKKworCWlucHV0X3JlcG9ydF9hYnMoZGV2LCBBQlNfUFJFU1NVUkUsIGYtPnByZXNzdXJlKTsKKwlpbnB1dF9zeW5jKGRldik7Cit9CisKK3N0YXRpYyBib29sIGFscHNfaXNfdmFsaWRfcGFja2FnZV9zczRfdjIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJaWYgKHBzbW91c2UtPnBrdGNudCA9PSA0ICYmICgocHNtb3VzZS0+cGFja2V0WzNdICYgMHgwOCkgIT0gMHgwOCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAocHNtb3VzZS0+cGt0Y250ID09IDYgJiYgKChwc21vdXNlLT5wYWNrZXRbNV0gJiAweDEwKSAhPSAweDApKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyBERUZJTkVfTVVURVgoYWxwc19tdXRleCk7CiAKIHN0YXRpYyB2b2lkIGFscHNfcmVnaXN0ZXJfYmFyZV9wczJfbW91c2Uoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMTE1NCwxMiArMTM0MCwzMSBAQAogCW11dGV4X3VubG9jaygmYWxwc19tdXRleCk7CiB9CiAKLXN0YXRpYyB2b2lkIGFscHNfcmVwb3J0X2JhcmVfcHMyX3BhY2tldChzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYsCitzdGF0aWMgdm9pZCBhbHBzX3JlcG9ydF9iYXJlX3BzMl9wYWNrZXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsCiAJCQkJCXVuc2lnbmVkIGNoYXIgcGFja2V0W10sCiAJCQkJCWJvb2wgcmVwb3J0X2J1dHRvbnMpCiB7CisJc3RydWN0IGFscHNfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisJc3RydWN0IGlucHV0X2RldiAqZGV2LCAqZGV2MiA9IE5VTEw7CisKKwkvKiBGaWd1cmUgb3V0IHdoaWNoIGRldmljZSB0byB1c2UgdG8gcmVwb3J0IHRoZSBiYXJlIHBhY2tldCAqLworCWlmIChwcml2LT5wcm90b192ZXJzaW9uID09IEFMUFNfUFJPVE9fVjIgJiYKKwkgICAgKHByaXYtPmZsYWdzICYgQUxQU19EVUFMUE9JTlQpKSB7CisJCS8qIE9uIFYyIGRldmljZXMgdGhlIER1YWxQb2ludCBTdGljayByZXBvcnRzIGJhcmUgcGFja2V0cyAqLworCQlkZXYgPSBwcml2LT5kZXYyOworCQlkZXYyID0gcHNtb3VzZS0+ZGV2OworCX0gZWxzZSBpZiAodW5saWtlbHkoSVNfRVJSX09SX05VTEwocHJpdi0+ZGV2MykpKSB7CisJCS8qIFJlZ2lzdGVyIGRldjMgbW91c2UgaWYgd2UgcmVjZWl2ZWQgUFMvMiBwYWNrZXQgZmlyc3QgdGltZSAqLworCQlpZiAoIUlTX0VSUihwcml2LT5kZXYzKSkKKwkJCXBzbW91c2VfcXVldWVfd29yayhwc21vdXNlLCAmcHJpdi0+ZGV2M19yZWdpc3Rlcl93b3JrLAorCQkJCQkgICAwKTsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCWRldiA9IHByaXYtPmRldjM7CisJfQorCiAJaWYgKHJlcG9ydF9idXR0b25zKQotCQlhbHBzX3JlcG9ydF9idXR0b25zKGRldiwgTlVMTCwKKwkJYWxwc19yZXBvcnRfYnV0dG9ucyhkZXYsIGRldjIsCiAJCQkJcGFja2V0WzBdICYgMSwgcGFja2V0WzBdICYgMiwgcGFja2V0WzBdICYgNCk7CiAKIAlpbnB1dF9yZXBvcnRfcmVsKGRldiwgUkVMX1gsCkBAIC0xMjMyLDggKzE0MzcsOCBAQAogCQkgKiBkZS1zeW5jaHJvbml6YXRpb24uCiAJCSAqLwogCi0JCWFscHNfcmVwb3J0X2JhcmVfcHMyX3BhY2tldChwcml2LT5kZXYyLAotCQkJCQkgICAgJnBzbW91c2UtPnBhY2tldFszXSwgZmFsc2UpOworCQlhbHBzX3JlcG9ydF9iYXJlX3BzMl9wYWNrZXQocHNtb3VzZSwgJnBzbW91c2UtPnBhY2tldFszXSwKKwkJCQkJICAgIGZhbHNlKTsKIAogCQkvKgogCQkgKiBDb250aW51ZSB3aXRoIHRoZSBzdGFuZGFyZCBBTFBTIHByb3RvY29sIGhhbmRsaW5nLApAQCAtMTI4NywyMCArMTQ5MiwxNSBAQAogCSAqIGEgZGV2aWNlIGNvbm5lY3RlZCB0byB0aGUgZXh0ZXJuYWwgUFMvMiBwb3J0LiBCZWNhdXNlIGJhcmUgUFMvMgogCSAqIHByb3RvY29sIGRvZXMgbm90IGhhdmUgZW5vdWdoIGNvbnN0YW50IGJpdHMgdG8gc2VsZi1zeW5jaHJvbml6ZQogCSAqIHByb3Blcmx5IHdlIG9ubHkgZG8gdGhpcyBpZiB0aGUgZGV2aWNlIGlzIGZ1bGx5IHN5bmNocm9uaXplZC4KKwkgKiBDYW4gbm90IGRpc3Rpbmd1aXNoIFY4J3MgZmlyc3QgYnl0ZSBmcm9tIFBTLzIgcGFja2V0J3MKIAkgKi8KLQlpZiAoIXBzbW91c2UtPm91dF9vZl9zeW5jX2NudCAmJiAocHNtb3VzZS0+cGFja2V0WzBdICYgMHhjOCkgPT0gMHgwOCkgewotCi0JCS8qIFJlZ2lzdGVyIGRldjMgbW91c2UgaWYgd2UgcmVjZWl2ZWQgUFMvMiBwYWNrZXQgZmlyc3QgdGltZSAqLwotCQlpZiAodW5saWtlbHkoIXByaXYtPmRldjMpKQotCQkJcHNtb3VzZV9xdWV1ZV93b3JrKHBzbW91c2UsCi0JCQkJCSAgICZwcml2LT5kZXYzX3JlZ2lzdGVyX3dvcmssIDApOworCWlmIChwcml2LT5wcm90b192ZXJzaW9uICE9IEFMUFNfUFJPVE9fVjggJiYKKwkgICAgIXBzbW91c2UtPm91dF9vZl9zeW5jX2NudCAmJgorCSAgICAocHNtb3VzZS0+cGFja2V0WzBdICYgMHhjOCkgPT0gMHgwOCkgewogCiAJCWlmIChwc21vdXNlLT5wa3RjbnQgPT0gMykgewotCQkJLyogT25jZSBkZXYzIG1vdXNlIGRldmljZSBpcyByZWdpc3RlcmVkIHJlcG9ydCBkYXRhICovCi0JCQlpZiAobGlrZWx5KCFJU19FUlJfT1JfTlVMTChwcml2LT5kZXYzKSkpCi0JCQkJYWxwc19yZXBvcnRfYmFyZV9wczJfcGFja2V0KHByaXYtPmRldjMsCi0JCQkJCQkJICAgIHBzbW91c2UtPnBhY2tldCwKLQkJCQkJCQkgICAgdHJ1ZSk7CisJCQlhbHBzX3JlcG9ydF9iYXJlX3BzMl9wYWNrZXQocHNtb3VzZSwgcHNtb3VzZS0+cGFja2V0LAorCQkJCQkJICAgIHRydWUpOwogCQkJcmV0dXJuIFBTTU9VU0VfRlVMTF9QQUNLRVQ7CiAJCX0KIAkJcmV0dXJuIFBTTU9VU0VfR09PRF9EQVRBOwpAQCAtMTM0NSw4ICsxNTQ1LDEwIEBACiAJCXJldHVybiBQU01PVVNFX0JBRF9EQVRBOwogCX0KIAotCWlmIChwcml2LT5wcm90b192ZXJzaW9uID09IEFMUFNfUFJPVE9fVjcgJiYKLQkgICAgIWFscHNfaXNfdmFsaWRfcGFja2FnZV92Nyhwc21vdXNlKSkgeworCWlmICgocHJpdi0+cHJvdG9fdmVyc2lvbiA9PSBBTFBTX1BST1RPX1Y3ICYmCisJCQkhYWxwc19pc192YWxpZF9wYWNrYWdlX3Y3KHBzbW91c2UpKSB8fAorCSAgICAocHJpdi0+cHJvdG9fdmVyc2lvbiA9PSBBTFBTX1BST1RPX1Y4ICYmCisJCQkhYWxwc19pc192YWxpZF9wYWNrYWdlX3NzNF92Mihwc21vdXNlKSkpIHsKIAkJcHNtb3VzZV9kYmcocHNtb3VzZSwgInJlZnVzaW5nIHBhY2tldFslaV0gPSAleFxuIiwKIAkJCSAgICBwc21vdXNlLT5wa3RjbnQgLSAxLAogCQkJICAgIHBzbW91c2UtPnBhY2tldFtwc21vdXNlLT5wa3RjbnQgLSAxXSk7CkBAIC0yMTIxLDYgKzIzMjMsODggQEAKIAlyZXR1cm4gLTE7CiB9CiAKK3N0YXRpYyBpbnQgYWxwc19nZXRfb3RwX3ZhbHVlc19zczRfdjIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsCisJCQkJICAgICAgdW5zaWduZWQgY2hhciBpbmRleCwgdW5zaWduZWQgY2hhciBvdHBbXSkKK3sKKwlzdHJ1Y3QgcHMyZGV2ICpwczJkZXYgPSAmcHNtb3VzZS0+cHMyZGV2OworCisJc3dpdGNoIChpbmRleCkgeworCWNhc2UgMDoKKwkJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfU0VUU1RSRUFNKSAgfHwKKwkJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfU0VUU1RSRUFNKSAgfHwKKwkJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgb3RwLCBQU01PVVNFX0NNRF9HRVRJTkZPKSkKKwkJCXJldHVybiAtMTsKKworCQlicmVhazsKKworCWNhc2UgMToKKwkJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfU0VUUE9MTCkgIHx8CisJCSAgICBwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIFBTTU9VU0VfQ01EX1NFVFBPTEwpICB8fAorCQkgICAgcHMyX2NvbW1hbmQocHMyZGV2LCBvdHAsIFBTTU9VU0VfQ01EX0dFVElORk8pKQorCQkJcmV0dXJuIC0xOworCisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFscHNfdXBkYXRlX2RldmljZV9hcmVhX3NzNF92Mih1bnNpZ25lZCBjaGFyIG90cFtdWzRdLAorCQkJCQkgIHN0cnVjdCBhbHBzX2RhdGEgKnByaXYpCit7CisJaW50IG51bV94X2VsZWN0cm9kZTsKKwlpbnQgbnVtX3lfZWxlY3Ryb2RlOworCWludCB4X3BpdGNoLCB5X3BpdGNoLCB4X3BoeXMsIHlfcGh5czsKKworCW51bV94X2VsZWN0cm9kZSA9IFNTNF9OVU1TRU5TT1JfWE9GRlNFVCArIChvdHBbMV1bMF0gJiAweDBGKTsKKwludW1feV9lbGVjdHJvZGUgPSBTUzRfTlVNU0VOU09SX1lPRkZTRVQgKyAoKG90cFsxXVswXSA+PiA0KSAmIDB4MEYpOworCisJcHJpdi0+eF9tYXggPSAobnVtX3hfZWxlY3Ryb2RlIC0gMSkgKiBTUzRfQ09VTlRfUEVSX0VMRUNUUk9ERTsKKwlwcml2LT55X21heCA9IChudW1feV9lbGVjdHJvZGUgLSAxKSAqIFNTNF9DT1VOVF9QRVJfRUxFQ1RST0RFOworCisJeF9waXRjaCA9ICgob3RwWzFdWzJdID4+IDIpICYgMHgwNykgKyBTUzRfTUlOX1BJVENIX01NOworCXlfcGl0Y2ggPSAoKG90cFsxXVsyXSA+PiA1KSAmIDB4MDcpICsgU1M0X01JTl9QSVRDSF9NTTsKKworCXhfcGh5cyA9IHhfcGl0Y2ggKiAobnVtX3hfZWxlY3Ryb2RlIC0gMSk7IC8qIEluIDAuMSBtbSB1bml0cyAqLworCXlfcGh5cyA9IHlfcGl0Y2ggKiAobnVtX3lfZWxlY3Ryb2RlIC0gMSk7IC8qIEluIDAuMSBtbSB1bml0cyAqLworCisJcHJpdi0+eF9yZXMgPSBwcml2LT54X21heCAqIDEwIC8geF9waHlzOyAvKiB1bml0cyAvIG1tICovCisJcHJpdi0+eV9yZXMgPSBwcml2LT55X21heCAqIDEwIC8geV9waHlzOyAvKiB1bml0cyAvIG1tICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbHBzX3VwZGF0ZV9idG5faW5mb19zczRfdjIodW5zaWduZWQgY2hhciBvdHBbXVs0XSwKKwkJCQkgICAgICAgc3RydWN0IGFscHNfZGF0YSAqcHJpdikKK3sKKwl1bnNpZ25lZCBjaGFyIGlzX2J0bmxlc3M7CisKKwlpc19idG5sZXNzID0gKG90cFsxXVsxXSA+PiAzKSAmIDB4MDE7CisKKwlpZiAoaXNfYnRubGVzcykKKwkJcHJpdi0+ZmxhZ3MgfD0gQUxQU19CVVRUT05QQUQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbHBzX3NldF9kZWZhdWx0c19zczRfdjIoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsCisJCQkJICAgIHN0cnVjdCBhbHBzX2RhdGEgKnByaXYpCit7CisJdW5zaWduZWQgY2hhciBvdHBbMl1bNF07CisKKwltZW1zZXQob3RwLCAwLCBzaXplb2Yob3RwKSk7CisKKwlpZiAoYWxwc19nZXRfb3RwX3ZhbHVlc19zczRfdjIocHNtb3VzZSwgMCwgJm90cFswXVswXSkgfHwKKwkgICAgYWxwc19nZXRfb3RwX3ZhbHVlc19zczRfdjIocHNtb3VzZSwgMSwgJm90cFsxXVswXSkpCisJCXJldHVybiAtMTsKKworCWFscHNfdXBkYXRlX2RldmljZV9hcmVhX3NzNF92MihvdHAsIHByaXYpOworCisJYWxwc191cGRhdGVfYnRuX2luZm9fc3M0X3YyKG90cCwgcHJpdik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhbHBzX2RvbHBoaW5fZ2V0X2RldmljZV9hcmVhKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLAogCQkJCQlzdHJ1Y3QgYWxwc19kYXRhICpwcml2KQogewpAQCAtMjIxMyw2ICsyNDk3LDM1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBhbHBzX2h3X2luaXRfc3M0X3YyKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBwczJkZXYgKnBzMmRldiA9ICZwc21vdXNlLT5wczJkZXY7CisJY2hhciBwYXJhbVsyXSA9IHsweDY0LCAweDI4fTsKKwlpbnQgcmV0ID0gLTE7CisKKwkvKiBlbnRlciBhYnNvbHV0ZSBtb2RlICovCisJaWYgKHBzMl9jb21tYW5kKHBzMmRldiwgTlVMTCwgUFNNT1VTRV9DTURfU0VUU1RSRUFNKSB8fAorCSAgICBwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIFBTTU9VU0VfQ01EX1NFVFNUUkVBTSkgfHwKKwkgICAgcHMyX2NvbW1hbmQocHMyZGV2LCAmcGFyYW1bMF0sIFBTTU9VU0VfQ01EX1NFVFJBVEUpIHx8CisJICAgIHBzMl9jb21tYW5kKHBzMmRldiwgJnBhcmFtWzFdLCBQU01PVVNFX0NNRF9TRVRSQVRFKSkgeworCQlnb3RvIGVycm9yOworCX0KKworCS8qIFQuQi5ELiBEZWNyZWFkIG5vaXNlIHBhY2tldCBudW1iZXIsIGRlbGV0ZSBpbiB0aGUgZnV0dXJlICovCisJaWYgKGFscHNfZXhpdF9jb21tYW5kX21vZGUocHNtb3VzZSkgfHwKKwkgICAgYWxwc19lbnRlcl9jb21tYW5kX21vZGUocHNtb3VzZSkgfHwKKwkgICAgYWxwc19jb21tYW5kX21vZGVfd3JpdGVfcmVnKHBzbW91c2UsIDB4MDAxRCwgMHgyMCkpIHsKKwkJZ290byBlcnJvcjsKKwl9CisJYWxwc19leGl0X2NvbW1hbmRfbW9kZShwc21vdXNlKTsKKworCXJldHVybiBwczJfY29tbWFuZChwczJkZXYsIE5VTEwsIFBTTU9VU0VfQ01EX0VOQUJMRSk7CisKK2Vycm9yOgorCWFscHNfZXhpdF9jb21tYW5kX21vZGUocHNtb3VzZSk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBhbHBzX3NldF9wcm90b2NvbChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwKIAkJCSAgICAgc3RydWN0IGFscHNfZGF0YSAqcHJpdiwKIAkJCSAgICAgY29uc3Qgc3RydWN0IGFscHNfcHJvdG9jb2xfaW5mbyAqcHJvdG9jb2wpCkBAIC0yMjgxLDEwICsyNTk0LDEyIEBACiAJCXByaXYtPnNldF9hYnNfcGFyYW1zID0gYWxwc19zZXRfYWJzX3BhcmFtc19tdDsKIAkJcHJpdi0+bmliYmxlX2NvbW1hbmRzID0gYWxwc192M19uaWJibGVfY29tbWFuZHM7CiAJCXByaXYtPmFkZHJfY29tbWFuZCA9IFBTTU9VU0VfQ01EX1JFU0VUX1dSQVA7Ci0JCXByaXYtPnhfbWF4ID0gMTM2MDsKLQkJcHJpdi0+eV9tYXggPSA2NjA7CiAJCXByaXYtPnhfYml0cyA9IDIzOwogCQlwcml2LT55X2JpdHMgPSAxMjsKKworCQlpZiAoYWxwc19kb2xwaGluX2dldF9kZXZpY2VfYXJlYShwc21vdXNlLCBwcml2KSkKKwkJCXJldHVybiAtRUlPOworCiAJCWJyZWFrOwogCiAJY2FzZSBBTFBTX1BST1RPX1Y2OgpAQCAtMjMwMCwxNyArMjYxNSwyOSBAQAogCQlwcml2LT5od19pbml0ID0gYWxwc19od19pbml0X3Y3OwogCQlwcml2LT5wcm9jZXNzX3BhY2tldCA9IGFscHNfcHJvY2Vzc19wYWNrZXRfdjc7CiAJCXByaXYtPmRlY29kZV9maWVsZHMgPSBhbHBzX2RlY29kZV9wYWNrZXRfdjc7Ci0JCXByaXYtPnNldF9hYnNfcGFyYW1zID0gYWxwc19zZXRfYWJzX3BhcmFtc19tdDsKKwkJcHJpdi0+c2V0X2Fic19wYXJhbXMgPSBhbHBzX3NldF9hYnNfcGFyYW1zX3Y3OwogCQlwcml2LT5uaWJibGVfY29tbWFuZHMgPSBhbHBzX3YzX25pYmJsZV9jb21tYW5kczsKIAkJcHJpdi0+YWRkcl9jb21tYW5kID0gUFNNT1VTRV9DTURfUkVTRVRfV1JBUDsKLQotCQlpZiAoYWxwc19kb2xwaGluX2dldF9kZXZpY2VfYXJlYShwc21vdXNlLCBwcml2KSkKLQkJCXJldHVybiAtRUlPOworCQlwcml2LT54X21heCA9IDB4ZmZmOworCQlwcml2LT55X21heCA9IDB4N2ZmOwogCiAJCWlmIChwcml2LT5md192ZXJbMV0gIT0gMHhiYSkKIAkJCXByaXYtPmZsYWdzIHw9IEFMUFNfQlVUVE9OUEFEOwogCiAJCWJyZWFrOworCisJY2FzZSBBTFBTX1BST1RPX1Y4OgorCQlwcml2LT5od19pbml0ID0gYWxwc19od19pbml0X3NzNF92MjsKKwkJcHJpdi0+cHJvY2Vzc19wYWNrZXQgPSBhbHBzX3Byb2Nlc3NfcGFja2V0X3NzNF92MjsKKwkJcHJpdi0+ZGVjb2RlX2ZpZWxkcyA9IGFscHNfZGVjb2RlX3NzNF92MjsKKwkJcHJpdi0+c2V0X2Fic19wYXJhbXMgPSBhbHBzX3NldF9hYnNfcGFyYW1zX3NzNF92MjsKKwkJcHJpdi0+bmliYmxlX2NvbW1hbmRzID0gYWxwc192M19uaWJibGVfY29tbWFuZHM7CisJCXByaXYtPmFkZHJfY29tbWFuZCA9IFBTTU9VU0VfQ01EX1JFU0VUX1dSQVA7CisKKwkJaWYgKGFscHNfc2V0X2RlZmF1bHRzX3NzNF92Mihwc21vdXNlLCBwcml2KSkKKwkJCXJldHVybiAtRUlPOworCisJCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjM3OSw2ICsyNzA2LDkgQEAKIAkJfSBlbHNlIGlmIChlY1swXSA9PSAweDg4ICYmIGVjWzFdID09IDB4MDcgJiYKIAkJCSAgIGVjWzJdID49IDB4OTAgJiYgZWNbMl0gPD0gMHg5ZCkgewogCQkJcHJvdG9jb2wgPSAmYWxwc192M19wcm90b2NvbF9kYXRhOworCQl9IGVsc2UgaWYgKGU3WzBdID09IDB4NzMgJiYgZTdbMV0gPT0gMHgwMyAmJgorCQkJICAgZTdbMl0gPT0gMHgxNCAmJiBlY1sxXSA9PSAweDAyKSB7CisJCQlwcm90b2NvbCA9ICZhbHBzX3Y4X3Byb3RvY29sX2RhdGE7CiAJCX0gZWxzZSB7CiAJCQlwc21vdXNlX2RiZyhwc21vdXNlLAogCQkJCSAgICAiTGlrZWx5IG5vdCBhbiBBTFBTIHRvdWNocGFkOiBFNz0lM3BoLCBFQz0lM3BoXG4iLCBlNywgZWMpOwpAQCAtMjQyNywxMCArMjc1NywxMSBAQAogewogCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldjEsIEFCU19YLCAwLCBwcml2LT54X21heCwgMCwgMCk7CiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2MSwgQUJTX1ksIDAsIHByaXYtPnlfbWF4LCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYxLCBBQlNfUFJFU1NVUkUsIDAsIDEyNywgMCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIGFscHNfc2V0X2Fic19wYXJhbXNfbXQoc3RydWN0IGFscHNfZGF0YSAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYxKQorc3RhdGljIHZvaWQgYWxwc19zZXRfYWJzX3BhcmFtc19tdF9jb21tb24oc3RydWN0IGFscHNfZGF0YSAqcHJpdiwKKwkJCQkJICBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYxKQogewogCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldjEsIEFCU19NVF9QT1NJVElPTl9YLCAwLCBwcml2LT54X21heCwgMCwgMCk7CiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2MSwgQUJTX01UX1BPU0lUSU9OX1ksIDAsIHByaXYtPnlfbWF4LCAwLCAwKTsKQEAgLTI0MzgsMTUgKzI3NjksNDQgQEAKIAlpbnB1dF9hYnNfc2V0X3JlcyhkZXYxLCBBQlNfTVRfUE9TSVRJT05fWCwgcHJpdi0+eF9yZXMpOwogCWlucHV0X2Fic19zZXRfcmVzKGRldjEsIEFCU19NVF9QT1NJVElPTl9ZLCBwcml2LT55X3Jlcyk7CiAKLQlpbnB1dF9tdF9pbml0X3Nsb3RzKGRldjEsIE1BWF9UT1VDSEVTLCBJTlBVVF9NVF9QT0lOVEVSIHwKLQkJSU5QVVRfTVRfRFJPUF9VTlVTRUQgfCBJTlBVVF9NVF9UUkFDSyB8IElOUFVUX01UX1NFTUlfTVQpOwotCiAJc2V0X2JpdChCVE5fVE9PTF9UUklQTEVUQVAsIGRldjEtPmtleWJpdCk7CiAJc2V0X2JpdChCVE5fVE9PTF9RVUFEVEFQLCBkZXYxLT5rZXliaXQpOworfQogCi0JLyogVjcgaXMgcmVhbCBtdWx0aS10b3VjaCAqLwotCWlmIChwcml2LT5wcm90b192ZXJzaW9uID09IEFMUFNfUFJPVE9fVjcpCi0JCWNsZWFyX2JpdChJTlBVVF9QUk9QX1NFTUlfTVQsIGRldjEtPnByb3BiaXQpOworc3RhdGljIHZvaWQgYWxwc19zZXRfYWJzX3BhcmFtc19tdChzdHJ1Y3QgYWxwc19kYXRhICpwcml2LAorCQkJCSAgIHN0cnVjdCBpbnB1dF9kZXYgKmRldjEpCit7CisJYWxwc19zZXRfYWJzX3BhcmFtc19tdF9jb21tb24ocHJpdiwgZGV2MSk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2MSwgQUJTX1BSRVNTVVJFLCAwLCAxMjcsIDAsIDApOworCisJaW5wdXRfbXRfaW5pdF9zbG90cyhkZXYxLCBNQVhfVE9VQ0hFUywKKwkJCSAgICBJTlBVVF9NVF9QT0lOVEVSIHwgSU5QVVRfTVRfRFJPUF9VTlVTRUQgfAorCQkJCUlOUFVUX01UX1RSQUNLIHwgSU5QVVRfTVRfU0VNSV9NVCk7Cit9CisKK3N0YXRpYyB2b2lkIGFscHNfc2V0X2Fic19wYXJhbXNfdjcoc3RydWN0IGFscHNfZGF0YSAqcHJpdiwKKwkJCQkgICBzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYxKQoreworCWFscHNfc2V0X2Fic19wYXJhbXNfbXRfY29tbW9uKHByaXYsIGRldjEpOworCXNldF9iaXQoQlROX1RPT0xfUVVJTlRUQVAsIGRldjEtPmtleWJpdCk7CisKKwlpbnB1dF9tdF9pbml0X3Nsb3RzKGRldjEsIE1BWF9UT1VDSEVTLAorCQkJICAgIElOUFVUX01UX1BPSU5URVIgfCBJTlBVVF9NVF9EUk9QX1VOVVNFRCB8CisJCQkJSU5QVVRfTVRfVFJBQ0spOworCisJc2V0X2JpdChCVE5fVE9PTF9RVUlOVFRBUCwgZGV2MS0+a2V5Yml0KTsKK30KKworc3RhdGljIHZvaWQgYWxwc19zZXRfYWJzX3BhcmFtc19zczRfdjIoc3RydWN0IGFscHNfZGF0YSAqcHJpdiwKKwkJCQkgICAgICAgc3RydWN0IGlucHV0X2RldiAqZGV2MSkKK3sKKwlhbHBzX3NldF9hYnNfcGFyYW1zX210X2NvbW1vbihwcml2LCBkZXYxKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhkZXYxLCBBQlNfUFJFU1NVUkUsIDAsIDEyNywgMCwgMCk7CisJc2V0X2JpdChCVE5fVE9PTF9RVUlOVFRBUCwgZGV2MS0+a2V5Yml0KTsKKworCWlucHV0X210X2luaXRfc2xvdHMoZGV2MSwgTUFYX1RPVUNIRVMsCisJCQkgICAgSU5QVVRfTVRfUE9JTlRFUiB8IElOUFVUX01UX0RST1BfVU5VU0VEIHwKKwkJCQlJTlBVVF9NVF9UUkFDSyk7CiB9CiAKIGludCBhbHBzX2luaXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCkBAIC0yNDc5LDkgKzI4MzksNiBAQAogCWRldjEtPmV2Yml0W0JJVF9XT1JEKEVWX0FCUyldIHw9IEJJVF9NQVNLKEVWX0FCUyk7CiAKIAlwcml2LT5zZXRfYWJzX3BhcmFtcyhwcml2LCBkZXYxKTsKLQkvKiBObyBwcmVzc3VyZSBvbiBWNyAqLwotCWlmIChwcml2LT5wcm90b192ZXJzaW9uICE9IEFMUFNfUFJPVE9fVjcpCi0JCWlucHV0X3NldF9hYnNfcGFyYW1zKGRldjEsIEFCU19QUkVTU1VSRSwgMCwgMTI3LCAwLCAwKTsKIAogCWlmIChwcml2LT5mbGFncyAmIEFMUFNfV0hFRUwpIHsKIAkJZGV2MS0+ZXZiaXRbQklUX1dPUkQoRVZfUkVMKV0gfD0gQklUX01BU0soRVZfUkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvYWxwcy5oIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmgKaW5kZXggMDI1MTNjMC4uNmRmZGNjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9hbHBzLmgKQEAgLTIyLDE0ICsyMiw5MCBAQAogI2RlZmluZSBBTFBTX1BST1RPX1Y1CQkweDUwMAogI2RlZmluZSBBTFBTX1BST1RPX1Y2CQkweDYwMAogI2RlZmluZSBBTFBTX1BST1RPX1Y3CQkweDcwMAkvKiB0M2J0bCB0NHMgKi8KKyNkZWZpbmUgQUxQU19QUk9UT19WOAkJMHg4MDAJLyogU1M0YnRsIFNTNHMgKi8KIAotI2RlZmluZSBNQVhfVE9VQ0hFUwkyCisjZGVmaW5lIE1BWF9UT1VDSEVTCTQKIAogI2RlZmluZSBET0xQSElOX0NPVU5UX1BFUl9FTEVDVFJPREUJNjQKICNkZWZpbmUgRE9MUEhJTl9QUk9GSUxFX1hPRkZTRVQJCTgJLyogeC1lbGVjdHJvZGUgb2Zmc2V0ICovCiAjZGVmaW5lIERPTFBISU5fUFJPRklMRV9ZT0ZGU0VUCQkxCS8qIHktZWxlY3Ryb2RlIG9mZnNldCAqLwogCiAvKgorICogZW51bSBTUzRfUEFDS0VUX0lEIC0gZGVmaW5lcyB0aGUgcGFja2V0IHR5cGUgZm9yIFY4CisgKiBTUzRfUEFDS0VUX0lEX0lETEU6IFRoZXJlJ3Mgbm8gZmluZ2VyIGFuZCBubyBidXR0b24gYWN0aXZpdHkuCisgKiBTUzRfUEFDS0VUX0lEX09ORTogVGhlcmUncyBvbmUgZmluZ2VyIG9uIHRvdWNocGFkCisgKiAgb3IgdGhlcmUncyBidXR0b24gYWN0aXZpdGllcy4KKyAqIFNTNF9QQUNLRVRfSURfVFdPOiBUaGVyZSdzIHR3byBvciBtb3JlIGZpbmdlcnMgb24gdG91Y2hwYWQKKyAqIFNTNF9QQUNLRVRfSURfTVVMVEk6IFRoZXJlJ3MgdGhyZWUgb3IgbW9yZSBmaW5nZXJzIG9uIHRvdWNocGFkCisqLworZW51bSBTUzRfUEFDS0VUX0lEIHsKKwlTUzRfUEFDS0VUX0lEX0lETEUgPSAwLAorCVNTNF9QQUNLRVRfSURfT05FLAorCVNTNF9QQUNLRVRfSURfVFdPLAorCVNTNF9QQUNLRVRfSURfTVVMVEksCit9OworCisjZGVmaW5lIFNTNF9DT1VOVF9QRVJfRUxFQ1RST0RFCQkyNTYKKyNkZWZpbmUgU1M0X05VTVNFTlNPUl9YT0ZGU0VUCQk3CisjZGVmaW5lIFNTNF9OVU1TRU5TT1JfWU9GRlNFVAkJNworI2RlZmluZSBTUzRfTUlOX1BJVENIX01NCQk1MAorCisjZGVmaW5lIFNTNF9NQVNLX05PUk1BTF9CVVRUT05TCQkweDA3CisKKyNkZWZpbmUgU1M0XzFGX1hfVjIoX2IpCQkoKF9iWzBdICYgMHgwMDA3KSB8CQlcCisJCQkJICgoX2JbMV0gPDwgMykgJiAweDAwNzgpIHwJXAorCQkJCSAoKF9iWzFdIDw8IDIpICYgMHgwMzgwKSB8CVwKKwkJCQkgKChfYlsyXSA8PCA1KSAmIDB4MUMwMCkJXAorCQkJCSkKKworI2RlZmluZSBTUzRfMUZfWV9WMihfYikJCSgoKF9iWzJdKSAmIDB4MDAwRikgfAkJXAorCQkJCSAoKF9iWzNdID4+IDIpICYgMHgwMDMwKSB8CVwKKwkJCQkgKChfYls0XSA8PCA2KSAmIDB4MDNDMCkgfAlcCisJCQkJICgoX2JbNF0gPDwgNSkgJiAweDBDMDApCVwKKwkJCQkpCisKKyNkZWZpbmUgU1M0XzFGX1pfVjIoX2IpCQkoKChfYls1XSkgJiAweDBGKSB8CQlcCisJCQkJICgoX2JbNV0gPj4gMSkgJiAweDcwKSB8CVwKKwkJCQkgKChfYls0XSkgJiAweDgwKQkJXAorCQkJCSkKKworI2RlZmluZSBTUzRfMUZfTEZCX1YyKF9iKQkoKChfYlsyXSA+PiA0KSAmIDB4MDEpID09IDB4MDEpCisKKyNkZWZpbmUgU1M0X01GX0xGX1YyKF9iLCBfaSkJKChfYlsxICsgKF9pKSAqIDNdICYgMHgwMDA0KSA9PSAweDAwMDQpCisKKyNkZWZpbmUgU1M0X0JUTl9WMihfYikJCSgoX2JbMF0gPj4gNSkgJiBTUzRfTUFTS19OT1JNQUxfQlVUVE9OUykKKworI2RlZmluZSBTUzRfU1REX01GX1hfVjIoX2IsIF9pKQkoKChfYlswICsgKF9pKSAqIDNdIDw8IDUpICYgMHgwMEUwKSB8CVwKKwkJCQkgKChfYlsxICsgX2kgKiAzXSAgPDwgNSkgJiAweDFGMDApCVwKKwkJCQkpCisKKyNkZWZpbmUgU1M0X1NURF9NRl9ZX1YyKF9iLCBfaSkJKCgoX2JbMSArIChfaSkgKiAzXSA8PCAzKSAmIDB4MDAxMCkgfAlcCisJCQkJICgoX2JbMiArIChfaSkgKiAzXSA8PCA1KSAmIDB4MDFFMCkgfAlcCisJCQkJICgoX2JbMiArIChfaSkgKiAzXSA8PCA0KSAmIDB4MEUwMCkJXAorCQkJCSkKKworI2RlZmluZSBTUzRfQlRMX01GX1hfVjIoX2IsIF9pKQkoU1M0X1NURF9NRl9YX1YyKF9iLCBfaSkgfAkJXAorCQkJCSAoKF9iWzAgKyAoX2kpICogM10gPj4gMykgJiAweDAwMTApCVwKKwkJCQkpCisKKyNkZWZpbmUgU1M0X0JUTF9NRl9ZX1YyKF9iLCBfaSkJKFNTNF9TVERfTUZfWV9WMihfYiwgX2kpIHwgXAorCQkJCSAoKF9iWzAgKyAoX2kpICogM10gPj4gMykgJiAweDAwMDgpCVwKKwkJCQkpCisKKyNkZWZpbmUgU1M0X01GX1pfVjIoX2IsIF9pKQkoKChfYlsxICsgKF9pKSAqIDNdKSAmIDB4MDAwMSkgfAlcCisJCQkJICgoX2JbMSArIChfaSkgKiAzXSA+PiAxKSAmIDB4MDAwMikJXAorCQkJCSkKKworI2RlZmluZSBTUzRfSVNfTUZfQ09OVElOVUUoX2IpCSgoX2JbMl0gJiAweDEwKSA9PSAweDEwKQorI2RlZmluZSBTUzRfSVNfNUZfREVURUNURUQoX2IpCSgoX2JbMl0gJiAweDEwKSA9PSAweDEwKQorCisKKyNkZWZpbmUgU1M0X01GUEFDS0VUX05PX0FYCTgxNjAJLyogWC1Db29yZGluYXRlIHZhbHVlICovCisjZGVmaW5lIFNTNF9NRlBBQ0tFVF9OT19BWQk0MDgwCS8qIFktQ29vcmRpbmF0ZSB2YWx1ZSAqLworI2RlZmluZSBTUzRfTUZQQUNLRVRfTk9fQVhfQkwJODE3NgkvKiBCdXR0b25sZXNzIFgtQ29vcmRpbmF0ZSB2YWx1ZSAqLworI2RlZmluZSBTUzRfTUZQQUNLRVRfTk9fQVlfQkwJNDA4OAkvKiBCdXR0b25sZXNzIFktQ29vcmRpbmF0ZSB2YWx1ZSAqLworCisvKgogICogZW51bSBWN19QQUNLRVRfSUQgLSBkZWZpbmVzIHRoZSBwYWNrZXQgdHlwZSBmb3IgVjcKICAqIFY3X1BBQ0tFVF9JRF9JRExFOiBUaGVyZSdzIG5vIGZpbmdlciBhbmQgbm8gYnV0dG9uIGFjdGl2aXR5LgogICogVjdfUEFDS0VUX0lEX1RXTzogVGhlcmUncyBvbmUgb3IgdHdvIG5vbi1yZXN0aW5nIGZpbmdlcnMgb24gdG91Y2hwYWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbl9pMmMuaCBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbl9pMmMuaAppbmRleCBlMTAwYzFiLi45YjJkYzAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW5faTJjLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFuX2kyYy5oCkBAIC0xNyw3ICsxNyw3IEBACiAgKi8KIAogI2lmbmRlZiBfRUxBTl9JMkNfSAotI2RlZmluZSBfRUxBTl9pMkNfSAorI2RlZmluZSBfRUxBTl9JMkNfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFuX2kyY19jb3JlLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW5faTJjX2NvcmUuYwppbmRleCA3Y2U4YmZlLi4zNzVkOThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW5faTJjX2NvcmUuYworKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW5faTJjX2NvcmUuYwpAQCAtOTksNyArOTksNyBAQAogCWVycm9yID0gcmVndWxhdG9yX2VuYWJsZShkYXRhLT52Y2MpOwogCWlmIChlcnJvcikgewogCQlkZXZfZXJyKCZkYXRhLT5jbGllbnQtPmRldiwKLQkJCSJGYWlsZWQgdG8gZW5hYmxlIHJlZ3VsYXRvcjogJWRcbiIsIGVycm9yKTsKKwkJCSJmYWlsZWQgdG8gZW5hYmxlIHJlZ3VsYXRvcjogJWRcbiIsIGVycm9yKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApAQCAtMTExLDYgKzExMSw3IEBACiAJCW1zbGVlcCgzMCk7CiAJfSB3aGlsZSAoLS1yZXBlYXQgPiAwKTsKIAorCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBwb3dlcjogJWRcbiIsIGVycm9yKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTEyNSw3ICsxMjYsNyBAQAogCQkJZXJyb3IgPSByZWd1bGF0b3JfZGlzYWJsZShkYXRhLT52Y2MpOwogCQkJaWYgKGVycm9yKSB7CiAJCQkJZGV2X2VycigmZGF0YS0+Y2xpZW50LT5kZXYsCi0JCQkJCSJGYWlsZWQgdG8gZGlzYWJsZSByZWd1bGF0b3I6ICVkXG4iLAorCQkJCQkiZmFpbGVkIHRvIGRpc2FibGUgcmVndWxhdG9yOiAlZFxuIiwKIAkJCQkJZXJyb3IpOwogCQkJCS8qIEF0dGVtcHQgdG8gcG93ZXIgdGhlIGNoaXAgYmFjayB1cCAqLwogCQkJCWRhdGEtPm9wcy0+cG93ZXJfY29udHJvbChkYXRhLT5jbGllbnQsIHRydWUpOwpAQCAtMTM4LDYgKzEzOSw3IEBACiAJCW1zbGVlcCgzMCk7CiAJfSB3aGlsZSAoLS1yZXBlYXQgPiAwKTsKIAorCWRldl9lcnIoJmRhdGEtPmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIGRpc2FibGUgcG93ZXI6ICVkXG4iLCBlcnJvcik7CiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xOTYsNyArMTk4LDYgQEAKIAkJaWYgKCFlcnJvcikKIAkJCXJldHVybiAwOwogCi0JCXJlcGVhdC0tOwogCQltc2xlZXAoMzApOwogCX0gd2hpbGUgKC0tcmVwZWF0ID4gMCk7CiAKQEAgLTEwODQsMTYgKzEwODUsMTggQEAKIAl9CiAKIAllcnJvciA9IGVsYW5fZW5hYmxlX3Bvd2VyKGRhdGEpOwotCWlmIChlcnJvcikKKwlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycihkZXYsICJwb3dlciB1cCB3aGVuIHJlc3VtaW5nIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJZ290byBlcnI7CisJfQogCiAJZXJyb3IgPSBlbGFuX2luaXRpYWxpemUoZGF0YSk7CiAJaWYgKGVycm9yKQogCQlkZXZfZXJyKGRldiwgImluaXRpYWxpemUgd2hlbiByZXN1bWluZyBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CiAKK2VycjoKIAllbmFibGVfaXJxKGRhdGEtPmNsaWVudC0+aXJxKTsKLQotCXJldHVybiAwOworCXJldHVybiBlcnJvcjsKIH0KIAogc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGVsYW5fcG1fb3BzLCBlbGFuX3N1c3BlbmQsIGVsYW5fcmVzdW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbl9pMmNfaTJjLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW5faTJjX2kyYy5jCmluZGV4IDAyOTk0MWYuLjZjZjBkZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbl9pMmNfaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFuX2kyY19pMmMuYwpAQCAtMTE3LDcgKzExNywxNSBAQAogCWludCByZXQ7CiAKIAlyZXQgPSBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCAmbXNnLCAxKTsKLQlyZXR1cm4gcmV0ID09IDEgPyAwIDogKHJldCA8IDAgPyByZXQgOiAtRUlPKTsKKwlpZiAocmV0ICE9IDEpIHsKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gLUVJTzsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ3cml0aW5nIGNtZCAoMHglMDR4KSBmYWlsZWQ6ICVkXG4iLAorCQkJcmVnLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGVsYW5faTJjX2luaXRpYWxpemUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guYwppbmRleCA2ZTIyNjgyLi45OTFkYzZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW50ZWNoLmMKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFudGVjaC5jCkBAIC04OTMsNiArODkzLDIxIEBACiB9CiAKIC8qCisgKiBUaGlzIHdyaXRlcyB0aGUgcmVnXzA3IHZhbHVlIGFnYWluIHRvIHRoZSBoYXJkd2FyZSBhdCB0aGUgZW5kIG9mIGV2ZXJ5CisgKiBzZXRfcmF0ZSBjYWxsIGJlY2F1c2UgdGhlIHJlZ2lzdGVyIGxvc2VzIGl0cyB2YWx1ZS4gcmVnXzA3IGFsbG93cyBzZXR0aW5nCisgKiBhYnNvbHV0ZSBtb2RlIG9uIHY0IGhhcmR3YXJlCisgKi8KK3N0YXRpYyB2b2lkIGVsYW50ZWNoX3NldF9yYXRlX3Jlc3RvcmVfcmVnXzA3KHN0cnVjdCBwc21vdXNlICpwc21vdXNlLAorCQl1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwlzdHJ1Y3QgZWxhbnRlY2hfZGF0YSAqZXRkID0gcHNtb3VzZS0+cHJpdmF0ZTsKKworCWV0ZC0+b3JpZ2luYWxfc2V0X3JhdGUocHNtb3VzZSwgcmF0ZSk7CisJaWYgKGVsYW50ZWNoX3dyaXRlX3JlZyhwc21vdXNlLCAweDA3LCBldGQtPnJlZ18wNykpCisJCXBzbW91c2VfZXJyKHBzbW91c2UsICJyZXN0b3JpbmcgcmVnXzA3IGZhaWxlZFxuIik7Cit9CisKKy8qCiAgKiBQdXQgdGhlIHRvdWNocGFkIGludG8gYWJzb2x1dGUgbW9kZQogICovCiBzdGF0aWMgaW50IGVsYW50ZWNoX3NldF9hYnNvbHV0ZV9tb2RlKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQpAQCAtMTA5NCw2ICsxMTA5LDggQEAKICAqIEFzdXMgSzUzU1YgICAgICAgICAgICAgIDB4NDUwZjAxICAgICAgICA3OCwgMTUsIDBjICAgICAgMiBodyBidXR0b25zCiAgKiBBc3VzIEc0NlZXICAgICAgICAgICAgICAweDQ2MGYwMiAgICAgICAgMDAsIDE4LCAwYyAgICAgIDIgaHcgYnV0dG9ucwogICogQXN1cyBHNzUwSlggICAgICAgICAgICAgMHgzNjBmMDAgICAgICAgIDAwLCAxNiwgMGMgICAgICAyIGh3IGJ1dHRvbnMKKyAqIEFzdXMgVFA1MDBMTiAgICAgICAgICAgIDB4MzgxZjE3ICAgICAgICAxMCwgMTQsIDBlICAgICAgY2xpY2twYWQKKyAqIEFzdXMgWDc1MEpOICAgICAgICAgICAgIDB4MzgxZjE3ICAgICAgICAxMCwgMTQsIDBlICAgICAgY2xpY2twYWQKICAqIEFzdXMgVVgzMSAgICAgICAgICAgICAgIDB4MzYxZjAwICAgICAgICAyMCwgMTUsIDBlICAgICAgY2xpY2twYWQKICAqIEFzdXMgVVgzMlZEICAgICAgICAgICAgIDB4MzYxZjAyICAgICAgICAwMCwgMTUsIDBlICAgICAgY2xpY2twYWQKICAqIEF2YXRhciBBVklVLTE0NUEyICAgICAgIDB4MzYxZjAwICAgICAgICA/ICAgICAgICAgICAgICAgY2xpY2twYWQKQEAgLTE2MzUsNiArMTY1MiwxMSBAQAogCQlnb3RvIGluaXRfZmFpbDsKIAl9CiAKKwlpZiAoZXRkLT5md192ZXJzaW9uID09IDB4MzgxZjE3KSB7CisJCWV0ZC0+b3JpZ2luYWxfc2V0X3JhdGUgPSBwc21vdXNlLT5zZXRfcmF0ZTsKKwkJcHNtb3VzZS0+c2V0X3JhdGUgPSBlbGFudGVjaF9zZXRfcmF0ZV9yZXN0b3JlX3JlZ18wNzsKKwl9CisKIAlpZiAoZWxhbnRlY2hfc2V0X2lucHV0X3BhcmFtcyhwc21vdXNlKSkgewogCQlwc21vdXNlX2Vycihwc21vdXNlLCAiZmFpbGVkIHRvIHF1ZXJ5IHRvdWNocGFkIHJhbmdlLlxuIik7CiAJCWdvdG8gaW5pdF9mYWlsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFudGVjaC5oIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9lbGFudGVjaC5oCmluZGV4IDZmM2FmZWMuLmY5NjVkMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvZWxhbnRlY2guaAorKysgYi9kcml2ZXJzL2lucHV0L21vdXNlL2VsYW50ZWNoLmgKQEAgLTE0Miw2ICsxNDIsNyBAQAogCXN0cnVjdCBmaW5nZXJfcG9zIG10W0VUUF9NQVhfRklOR0VSU107CiAJdW5zaWduZWQgY2hhciBwYXJpdHlbMjU2XTsKIAlpbnQgKCpzZW5kX2NtZCkoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHVuc2lnbmVkIGNoYXIgYywgdW5zaWduZWQgY2hhciAqcGFyYW0pOworCXZvaWQgKCpvcmlnaW5hbF9zZXRfcmF0ZSkoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIHVuc2lnbmVkIGludCByYXRlKTsKIH07CiAKICNpZmRlZiBDT05GSUdfTU9VU0VfUFMyX0VMQU5URUNICmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL2xpZmVib29rLmMKaW5kZXggMjMyMjJkZC4uZTVlZDIxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9saWZlYm9vay5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvbGlmZWJvb2suYwpAQCAtMjU2LDggKzI1Niw4IEBACiAKIGludCBsaWZlYm9va19kZXRlY3Qoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGJvb2wgc2V0X3Byb3BlcnRpZXMpCiB7Ci0gICAgICAgIGlmICghbGlmZWJvb2tfcHJlc2VudCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisJaWYgKCFsaWZlYm9va19wcmVzZW50KQorCQlyZXR1cm4gLTE7CiAKIAlpZiAoZGVzaXJlZF9zZXJpb19waHlzICYmCiAJICAgIHN0cmNtcChwc21vdXNlLT5wczJkZXYuc2VyaW8tPnBoeXMsIGRlc2lyZWRfc2VyaW9fcGh5cykpCkBAIC0yNjgsNyArMjY4LDcgQEAKIAkJcHNtb3VzZS0+bmFtZSA9ICJMaWZlYm9vayBUb3VjaFNjcmVlbiI7CiAJfQogCi0gICAgICAgIHJldHVybiAwOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGxpZmVib29rX2NyZWF0ZV9yZWxhdGl2ZV9kZXZpY2Uoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9wc21vdXNlLWJhc2UuYwppbmRleCA4YmM2MTIzLi4yNzA1N2RmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3BzbW91c2UtYmFzZS5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvcHNtb3VzZS1iYXNlLmMKQEAgLTQ3NCwxOSArNDc0LDQ1IEBACiAJCQkgICBQU01PVVNFX0NNRF9QT0xMIHwgKHBzbW91c2UtPnBrdHNpemUgPDwgOCkpOwogfQogCitzdGF0aWMgYm9vbCBwc21vdXNlX2NoZWNrX3BucF9pZChjb25zdCBjaGFyICppZCwgY29uc3QgY2hhciAqIGNvbnN0IGlkc1tdKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaWRzW2ldOyBpKyspCisJCWlmICghc3RyY2FzZWNtcChpZCwgaWRzW2ldKSkKKwkJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCiAvKgogICogcHNtb3VzZV9tYXRjaGVzX3BucF9pZCAtIGNoZWNrIGlmIHBzbW91c2UgbWF0Y2hlcyBvbmUgb2YgdGhlIHBhc3NlZCBpbiBpZHMuCiAgKi8KIGJvb2wgcHNtb3VzZV9tYXRjaGVzX3BucF9pZChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwgY29uc3QgY2hhciAqIGNvbnN0IGlkc1tdKQogewotCWludCBpOworCXN0cnVjdCBzZXJpbyAqc2VyaW8gPSBwc21vdXNlLT5wczJkZXYuc2VyaW87CisJY2hhciAqcCwgKmZ3X2lkX2NvcHksICpzYXZlX3B0cjsKKwlib29sIGZvdW5kID0gZmFsc2U7CiAKLQlpZiAoIXN0cm5jbXAocHNtb3VzZS0+cHMyZGV2LnNlcmlvLT5maXJtd2FyZV9pZCwgIlBOUDoiLCA0KSkKLQkJZm9yIChpID0gMDsgaWRzW2ldOyBpKyspCi0JCQlpZiAoc3Ryc3RyKHBzbW91c2UtPnBzMmRldi5zZXJpby0+ZmlybXdhcmVfaWQsIGlkc1tpXSkpCi0JCQkJcmV0dXJuIHRydWU7CisJaWYgKHN0cm5jbXAoc2VyaW8tPmZpcm13YXJlX2lkLCAiUE5QOiAiLCA1KSkKKwkJcmV0dXJuIGZhbHNlOwogCi0JcmV0dXJuIGZhbHNlOworCWZ3X2lkX2NvcHkgPSBrc3RybmR1cCgmc2VyaW8tPmZpcm13YXJlX2lkWzVdLAorCQkJICAgICAgc2l6ZW9mKHNlcmlvLT5maXJtd2FyZV9pZCkgLSA1LAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19pZF9jb3B5KQorCQlyZXR1cm4gZmFsc2U7CisKKwlzYXZlX3B0ciA9IGZ3X2lkX2NvcHk7CisJd2hpbGUgKChwID0gc3Ryc2VwKCZmd19pZF9jb3B5LCAiICIpKSAhPSBOVUxMKSB7CisJCWlmIChwc21vdXNlX2NoZWNrX3BucF9pZChwLCBpZHMpKSB7CisJCQlmb3VuZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWtmcmVlKHNhdmVfcHRyKTsKKwlyZXR1cm4gZm91bmQ7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYwppbmRleCBmMmNjZWI2Li42MzBhZjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKQEAgLTEyMywzMiArMTIzLDQ2IEBACiAKIHN0YXRpYyBib29sIGNyNDhfcHJvZmlsZV9zZW5zb3I7CiAKKyNkZWZpbmUgQU5ZX0JPQVJEX0lEIDAKIHN0cnVjdCBtaW5fbWF4X3F1aXJrIHsKIAljb25zdCBjaGFyICogY29uc3QgKnBucF9pZHM7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgbG9uZyBpbnQgbWluLCBtYXg7CisJfSBib2FyZF9pZDsKIAlpbnQgeF9taW4sIHhfbWF4LCB5X21pbiwgeV9tYXg7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG1pbl9tYXhfcXVpcmsgbWluX21heF9wbnBpZF90YWJsZVtdID0gewogCXsKIAkJKGNvbnN0IGNoYXIgKiBjb25zdCBbXSl7IkxFTjAwMzMiLCBOVUxMfSwKKwkJe0FOWV9CT0FSRF9JRCwgQU5ZX0JPQVJEX0lEfSwKIAkJMTAyNCwgNTA1MiwgMjI1OCwgNDgzMgogCX0sCiAJewotCQkoY29uc3QgY2hhciAqIGNvbnN0IFtdKXsiTEVOMDAzNSIsICJMRU4wMDQyIiwgTlVMTH0sCisJCShjb25zdCBjaGFyICogY29uc3QgW10peyJMRU4wMDQyIiwgTlVMTH0sCisJCXtBTllfQk9BUkRfSUQsIEFOWV9CT0FSRF9JRH0sCiAJCTEyMzIsIDU3MTAsIDExNTYsIDQ2OTYKIAl9LAogCXsKIAkJKGNvbnN0IGNoYXIgKiBjb25zdCBbXSl7IkxFTjAwMzQiLCAiTEVOMDAzNiIsICJMRU4wMDM3IiwKIAkJCQkJIkxFTjAwMzkiLCAiTEVOMjAwMiIsICJMRU4yMDA0IiwKIAkJCQkJTlVMTH0sCisJCXtBTllfQk9BUkRfSUQsIDI5NjF9LAogCQkxMDI0LCA1MTEyLCAyMDI0LCA0ODMyCiAJfSwKIAl7CiAJCShjb25zdCBjaGFyICogY29uc3QgW10peyJMRU4yMDAxIiwgTlVMTH0sCisJCXtBTllfQk9BUkRfSUQsIEFOWV9CT0FSRF9JRH0sCiAJCTEwMjQsIDUwMjIsIDI1MDgsIDQ4MzIKIAl9LAogCXsKIAkJKGNvbnN0IGNoYXIgKiBjb25zdCBbXSl7IkxFTjIwMDYiLCBOVUxMfSwKKwkJezI2OTEsIDI2OTF9LAorCQkxMDI0LCA1MDQ1LCAyNDU3LCA0ODMyCisJfSwKKwl7CisJCShjb25zdCBjaGFyICogY29uc3QgW10peyJMRU4yMDA2IiwgTlVMTH0sCisJCXtBTllfQk9BUkRfSUQsIEFOWV9CT0FSRF9JRH0sCiAJCTEyNjQsIDU2NzUsIDExNzEsIDQ2ODgKIAl9LAogCXsgfQpAQCAtMTc1LDkgKzE4OSw3IEBACiAJIkxFTjAwNDEiLAogCSJMRU4wMDQyIiwgLyogWW9nYSAqLwogCSJMRU4wMDQ1IiwKLQkiTEVOMDA0NiIsCiAJIkxFTjAwNDciLAotCSJMRU4wMDQ4IiwKIAkiTEVOMDA0OSIsCiAJIkxFTjIwMDAiLAogCSJMRU4yMDAxIiwgLyogRWRnZSBFNDMxICovCkBAIC0xODUsNyArMTk3LDcgQEAKIAkiTEVOMjAwMyIsCiAJIkxFTjIwMDQiLCAvKiBMNDQwICovCiAJIkxFTjIwMDUiLAotCSJMRU4yMDA2IiwKKwkiTEVOMjAwNiIsIC8qIEVkZ2UgRTQ0MC9FNTQwICovCiAJIkxFTjIwMDciLAogCSJMRU4yMDA4IiwKIAkiTEVOMjAwOSIsCkBAIC0xOTQsNiArMjA2LDEzIEBACiAJTlVMTAogfTsKIAorLyogVGhpcyBsaXN0IGhhcyBiZWVuIGtpbmRseSBwcm92aWRlZCBieSBTeW5hcHRpY3MuICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZvcmNlcGFkX3BucF9pZHNbXSA9IHsKKwkiU1lOMzAwRCIsCisJIlNZTjMwMTQiLAorCU5VTEwKK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJU3luYXB0aWNzIGNvbW11bmljYXRpb25zIGZ1bmN0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yMzUsMTggKzI1NCwzOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN5bmFwdGljc19tb3JlX2V4dGVuZGVkX3F1ZXJpZXMoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCit7CisJc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlszXTsKKworCWlmIChzeW5hcHRpY3Nfc2VuZF9jbWQocHNtb3VzZSwgU1lOX1FVRV9NRVhUX0NBUEFCXzEwLCBidWYpKQorCQlyZXR1cm4gLTE7CisKKwlwcml2LT5leHRfY2FwXzEwID0gKGJ1ZlswXTw8MTYpIHwgKGJ1ZlsxXTw8OCkgfCBidWZbMl07CisKKwlyZXR1cm4gMDsKK30KKwogLyoKLSAqIFJlYWQgdGhlIGJvYXJkIGlkIGZyb20gdGhlIHRvdWNocGFkCisgKiBSZWFkIHRoZSBib2FyZCBpZCBhbmQgdGhlICJNb3JlIEV4dGVuZGVkIFF1ZXJpZXMiIGZyb20gdGhlIHRvdWNocGFkCiAgKiBUaGUgYm9hcmQgaWQgaXMgZW5jb2RlZCBpbiB0aGUgIlFVRVJZIE1PREVTIiByZXNwb25zZQogICovCi1zdGF0aWMgaW50IHN5bmFwdGljc19ib2FyZF9pZChzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKK3N0YXRpYyBpbnQgc3luYXB0aWNzX3F1ZXJ5X21vZGVzKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQogewogCXN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CiAJdW5zaWduZWQgY2hhciBiaWRbM107CiAKKwkvKiBmaXJtd2FyZXMgcHJpb3IgNy41IGhhdmUgbm8gYm9hcmRfaWQgZW5jb2RlZCAqLworCWlmIChTWU5fSURfRlVMTChwcml2LT5pZGVudGl0eSkgPCAweDcwNSkKKwkJcmV0dXJuIDA7CisKIAlpZiAoc3luYXB0aWNzX3NlbmRfY21kKHBzbW91c2UsIFNZTl9RVUVfTU9ERVMsIGJpZCkpCiAJCXJldHVybiAtMTsKIAlwcml2LT5ib2FyZF9pZCA9ICgoYmlkWzBdICYgMHhmYykgPDwgNikgfCBiaWRbMV07CisKKwlpZiAoU1lOX01FWFRfQ0FQX0JJVChiaWRbMF0pKQorCQlyZXR1cm4gc3luYXB0aWNzX21vcmVfZXh0ZW5kZWRfcXVlcmllcyhwc21vdXNlKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0zNDYsNyArMzg2LDYgQEAKIHsKIAlzdHJ1Y3Qgc3luYXB0aWNzX2RhdGEgKnByaXYgPSBwc21vdXNlLT5wcml2YXRlOwogCXVuc2lnbmVkIGNoYXIgcmVzcFszXTsKLQlpbnQgaTsKIAogCWlmIChTWU5fSURfTUFKT1IocHJpdi0+aWRlbnRpdHkpIDwgNCkKIAkJcmV0dXJuIDA7CkBAIC0zNTgsMTcgKzM5Nyw2IEBACiAJCX0KIAl9CiAKLQlmb3IgKGkgPSAwOyBtaW5fbWF4X3BucGlkX3RhYmxlW2ldLnBucF9pZHM7IGkrKykgewotCQlpZiAocHNtb3VzZV9tYXRjaGVzX3BucF9pZChwc21vdXNlLAotCQkJCQkgICBtaW5fbWF4X3BucGlkX3RhYmxlW2ldLnBucF9pZHMpKSB7Ci0JCQlwcml2LT54X21pbiA9IG1pbl9tYXhfcG5waWRfdGFibGVbaV0ueF9taW47Ci0JCQlwcml2LT54X21heCA9IG1pbl9tYXhfcG5waWRfdGFibGVbaV0ueF9tYXg7Ci0JCQlwcml2LT55X21pbiA9IG1pbl9tYXhfcG5waWRfdGFibGVbaV0ueV9taW47Ci0JCQlwcml2LT55X21heCA9IG1pbl9tYXhfcG5waWRfdGFibGVbaV0ueV9tYXg7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQogCWlmIChTWU5fRVhUX0NBUF9SRVFVRVNUUyhwcml2LT5jYXBhYmlsaXRpZXMpID49IDUgJiYKIAkgICAgU1lOX0NBUF9NQVhfRElNRU5TSU9OUyhwcml2LT5leHRfY2FwXzBjKSkgewogCQlpZiAoc3luYXB0aWNzX3NlbmRfY21kKHBzbW91c2UsIFNZTl9RVUVfRVhUX01BWF9DT09SRFMsIHJlc3ApKSB7CkBAIC0zNzcsMjMgKzQwNSw2OSBAQAogCQl9IGVsc2UgewogCQkJcHJpdi0+eF9tYXggPSAocmVzcFswXSA8PCA1KSB8ICgocmVzcFsxXSAmIDB4MGYpIDw8IDEpOwogCQkJcHJpdi0+eV9tYXggPSAocmVzcFsyXSA8PCA1KSB8ICgocmVzcFsxXSAmIDB4ZjApID4+IDMpOworCQkJcHNtb3VzZV9pbmZvKHBzbW91c2UsCisJCQkJICAgICAicXVlcmllZCBtYXggY29vcmRpbmF0ZXM6IHggWy4uJWRdLCB5IFsuLiVkXVxuIiwKKwkJCQkgICAgIHByaXYtPnhfbWF4LCBwcml2LT55X21heCk7CiAJCX0KIAl9CiAKLQlpZiAoU1lOX0VYVF9DQVBfUkVRVUVTVFMocHJpdi0+Y2FwYWJpbGl0aWVzKSA+PSA3ICYmCi0JICAgIFNZTl9DQVBfTUlOX0RJTUVOU0lPTlMocHJpdi0+ZXh0X2NhcF8wYykpIHsKKwlpZiAoU1lOX0NBUF9NSU5fRElNRU5TSU9OUyhwcml2LT5leHRfY2FwXzBjKSAmJgorCSAgICAoU1lOX0VYVF9DQVBfUkVRVUVTVFMocHJpdi0+Y2FwYWJpbGl0aWVzKSA+PSA3IHx8CisJICAgICAvKgorCSAgICAgICogRmlybXdhcmUgdjguMSBkb2VzIG5vdCByZXBvcnQgcHJvcGVyIG51bWJlciBvZiBleHRlbmRlZAorCSAgICAgICogY2FwYWJpbGl0aWVzLCBidXQgaGFzIGJlZW4gcHJvdmVuIHRvIHJlcG9ydCBjb3JyZWN0IG1pbgorCSAgICAgICogY29vcmRpbmF0ZXMuCisJICAgICAgKi8KKwkgICAgIFNZTl9JRF9GVUxMKHByaXYtPmlkZW50aXR5KSA9PSAweDgwMSkpIHsKIAkJaWYgKHN5bmFwdGljc19zZW5kX2NtZChwc21vdXNlLCBTWU5fUVVFX0VYVF9NSU5fQ09PUkRTLCByZXNwKSkgewogCQkJcHNtb3VzZV93YXJuKHBzbW91c2UsCiAJCQkJICAgICAiZGV2aWNlIGNsYWltcyB0byBoYXZlIG1pbiBjb29yZGluYXRlcyBxdWVyeSwgYnV0IEknbSBub3QgYWJsZSB0byByZWFkIGl0LlxuIik7CiAJCX0gZWxzZSB7CiAJCQlwcml2LT54X21pbiA9IChyZXNwWzBdIDw8IDUpIHwgKChyZXNwWzFdICYgMHgwZikgPDwgMSk7CiAJCQlwcml2LT55X21pbiA9IChyZXNwWzJdIDw8IDUpIHwgKChyZXNwWzFdICYgMHhmMCkgPj4gMyk7CisJCQlwc21vdXNlX2luZm8ocHNtb3VzZSwKKwkJCQkgICAgICJxdWVyaWVkIG1pbiBjb29yZGluYXRlczogeCBbJWQuLl0sIHkgWyVkLi5dXG4iLAorCQkJCSAgICAgcHJpdi0+eF9taW4sIHByaXYtPnlfbWluKTsKIAkJfQogCX0KIAogCXJldHVybiAwOwogfQogCisvKgorICogQXBwbHkgcXVpcmsocykgaWYgdGhlIGhhcmR3YXJlIG1hdGNoZXMKKyAqLworCitzdGF0aWMgdm9pZCBzeW5hcHRpY3NfYXBwbHlfcXVpcmtzKHN0cnVjdCBwc21vdXNlICpwc21vdXNlKQoreworCXN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBtaW5fbWF4X3BucGlkX3RhYmxlW2ldLnBucF9pZHM7IGkrKykgeworCQlpZiAoIXBzbW91c2VfbWF0Y2hlc19wbnBfaWQocHNtb3VzZSwKKwkJCQkJICAgIG1pbl9tYXhfcG5waWRfdGFibGVbaV0ucG5wX2lkcykpCisJCQljb250aW51ZTsKKworCQlpZiAobWluX21heF9wbnBpZF90YWJsZVtpXS5ib2FyZF9pZC5taW4gIT0gQU5ZX0JPQVJEX0lEICYmCisJCSAgICBwcml2LT5ib2FyZF9pZCA8IG1pbl9tYXhfcG5waWRfdGFibGVbaV0uYm9hcmRfaWQubWluKQorCQkJY29udGludWU7CisKKwkJaWYgKG1pbl9tYXhfcG5waWRfdGFibGVbaV0uYm9hcmRfaWQubWF4ICE9IEFOWV9CT0FSRF9JRCAmJgorCQkgICAgcHJpdi0+Ym9hcmRfaWQgPiBtaW5fbWF4X3BucGlkX3RhYmxlW2ldLmJvYXJkX2lkLm1heCkKKwkJCWNvbnRpbnVlOworCisJCXByaXYtPnhfbWluID0gbWluX21heF9wbnBpZF90YWJsZVtpXS54X21pbjsKKwkJcHJpdi0+eF9tYXggPSBtaW5fbWF4X3BucGlkX3RhYmxlW2ldLnhfbWF4OworCQlwcml2LT55X21pbiA9IG1pbl9tYXhfcG5waWRfdGFibGVbaV0ueV9taW47CisJCXByaXYtPnlfbWF4ID0gbWluX21heF9wbnBpZF90YWJsZVtpXS55X21heDsKKwkJcHNtb3VzZV9pbmZvKHBzbW91c2UsCisJCQkgICAgICJxdWlya2VkIG1pbi9tYXggY29vcmRpbmF0ZXM6IHggWyVkLi4lZF0sIHkgWyVkLi4lZF1cbiIsCisJCQkgICAgIHByaXYtPnhfbWluLCBwcml2LT54X21heCwKKwkJCSAgICAgcHJpdi0+eV9taW4sIHByaXYtPnlfbWF4KTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgaW50IHN5bmFwdGljc19xdWVyeV9oYXJkd2FyZShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSkKIHsKIAlpZiAoc3luYXB0aWNzX2lkZW50aWZ5KHBzbW91c2UpKQpAQCAtNDAyLDEzICs0NzYsMTUgQEAKIAkJcmV0dXJuIC0xOwogCWlmIChzeW5hcHRpY3NfZmlybXdhcmVfaWQocHNtb3VzZSkpCiAJCXJldHVybiAtMTsKLQlpZiAoc3luYXB0aWNzX2JvYXJkX2lkKHBzbW91c2UpKQorCWlmIChzeW5hcHRpY3NfcXVlcnlfbW9kZXMocHNtb3VzZSkpCiAJCXJldHVybiAtMTsKIAlpZiAoc3luYXB0aWNzX2NhcGFiaWxpdHkocHNtb3VzZSkpCiAJCXJldHVybiAtMTsKIAlpZiAoc3luYXB0aWNzX3Jlc29sdXRpb24ocHNtb3VzZSkpCiAJCXJldHVybiAtMTsKIAorCXN5bmFwdGljc19hcHBseV9xdWlya3MocHNtb3VzZSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTE2LDE4ICs1OTIsMjIgQEAKIAlyZXR1cm4gKGJ1ZlswXSAmIDB4RkMpID09IDB4ODQgJiYgKGJ1ZlszXSAmIDB4Q0MpID09IDB4QzQ7CiB9CiAKLXN0YXRpYyB2b2lkIHN5bmFwdGljc19wYXNzX3B0X3BhY2tldChzdHJ1Y3Qgc2VyaW8gKnB0cG9ydCwgdW5zaWduZWQgY2hhciAqcGFja2V0KQorc3RhdGljIHZvaWQgc3luYXB0aWNzX3Bhc3NfcHRfcGFja2V0KHN0cnVjdCBwc21vdXNlICpwc21vdXNlLAorCQkJCSAgICAgc3RydWN0IHNlcmlvICpwdHBvcnQsCisJCQkJICAgICB1bnNpZ25lZCBjaGFyICpwYWNrZXQpCiB7CisJc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgcHNtb3VzZSAqY2hpbGQgPSBzZXJpb19nZXRfZHJ2ZGF0YShwdHBvcnQpOwogCiAJaWYgKGNoaWxkICYmIGNoaWxkLT5zdGF0ZSA9PSBQU01PVVNFX0FDVElWQVRFRCkgewotCQlzZXJpb19pbnRlcnJ1cHQocHRwb3J0LCBwYWNrZXRbMV0sIDApOworCQlzZXJpb19pbnRlcnJ1cHQocHRwb3J0LCBwYWNrZXRbMV0gfCBwcml2LT5wdF9idXR0b25zLCAwKTsKIAkJc2VyaW9faW50ZXJydXB0KHB0cG9ydCwgcGFja2V0WzRdLCAwKTsKIAkJc2VyaW9faW50ZXJydXB0KHB0cG9ydCwgcGFja2V0WzVdLCAwKTsKIAkJaWYgKGNoaWxkLT5wa3RzaXplID09IDQpCiAJCQlzZXJpb19pbnRlcnJ1cHQocHRwb3J0LCBwYWNrZXRbMl0sIDApOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXNlcmlvX2ludGVycnVwdChwdHBvcnQsIHBhY2tldFsxXSwgMCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBzeW5hcHRpY3NfcHRfYWN0aXZhdGUoc3RydWN0IHBzbW91c2UgKnBzbW91c2UpCkBAIC02MDUsNyArNjg1LDE3IEBACiAJfQogfQogCi1zdGF0aWMgYm9vbCBpc19mb3JjZXBhZDsKK3N0YXRpYyB2b2lkIHN5bmFwdGljc19wYXJzZV9leHRfYnV0dG9ucyhjb25zdCB1bnNpZ25lZCBjaGFyIGJ1ZltdLAorCQkJCQlzdHJ1Y3Qgc3luYXB0aWNzX2RhdGEgKnByaXYsCisJCQkJCXN0cnVjdCBzeW5hcHRpY3NfaHdfc3RhdGUgKmh3KQoreworCXVuc2lnbmVkIGludCBleHRfYml0cyA9CisJCShTWU5fQ0FQX01VTFRJX0JVVFRPTl9OTyhwcml2LT5leHRfY2FwKSArIDEpID4+IDE7CisJdW5zaWduZWQgaW50IGV4dF9tYXNrID0gR0VOTUFTSyhleHRfYml0cyAtIDEsIDApOworCisJaHctPmV4dF9idXR0b25zID0gYnVmWzRdICYgZXh0X21hc2s7CisJaHctPmV4dF9idXR0b25zIHw9IChidWZbNV0gJiBleHRfbWFzaykgPDwgZXh0X2JpdHM7Cit9CiAKIHN0YXRpYyBpbnQgc3luYXB0aWNzX3BhcnNlX2h3X3N0YXRlKGNvbnN0IHVuc2lnbmVkIGNoYXIgYnVmW10sCiAJCQkJICAgIHN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiwKQEAgLTYzNiw3ICs3MjYsNyBAQAogCQlody0+bGVmdCAgPSAoYnVmWzBdICYgMHgwMSkgPyAxIDogMDsKIAkJaHctPnJpZ2h0ID0gKGJ1ZlswXSAmIDB4MDIpID8gMSA6IDA7CiAKLQkJaWYgKGlzX2ZvcmNlcGFkKSB7CisJCWlmIChwcml2LT5pc19mb3JjZXBhZCkgewogCQkJLyoKIAkJCSAqIEZvcmNlUGFkcywgbGlrZSBDbGlja3BhZHMsIHVzZSBtaWRkbGUgYnV0dG9uCiAJCQkgKiBiaXRzIHRvIHJlcG9ydCBwcmltYXJ5IGJ1dHRvbiBjbGlja3MuCkBAIC02OTEsMjggKzc4MSw5IEBACiAJCQlody0+ZG93biA9ICgoYnVmWzBdIF4gYnVmWzNdKSAmIDB4MDIpID8gMSA6IDA7CiAJCX0KIAotCQlpZiAoU1lOX0NBUF9NVUxUSV9CVVRUT05fTk8ocHJpdi0+ZXh0X2NhcCkgJiYKKwkJaWYgKFNZTl9DQVBfTVVMVElfQlVUVE9OX05PKHByaXYtPmV4dF9jYXApID4gMCAmJgogCQkgICAgKChidWZbMF0gXiBidWZbM10pICYgMHgwMikpIHsKLQkJCXN3aXRjaCAoU1lOX0NBUF9NVUxUSV9CVVRUT05fTk8ocHJpdi0+ZXh0X2NhcCkgJiB+MHgwMSkgewotCQkJZGVmYXVsdDoKLQkJCQkvKgotCQkJCSAqIGlmIG5FeHRCdG4gaXMgZ3JlYXRlciB0aGFuIDggaXQgc2hvdWxkIGJlCi0JCQkJICogY29uc2lkZXJlZCBpbnZhbGlkIGFuZCB0cmVhdGVkIGFzIDAKLQkJCQkgKi8KLQkJCQlicmVhazsKLQkJCWNhc2UgODoKLQkJCQlody0+ZXh0X2J1dHRvbnMgfD0gKChidWZbNV0gJiAweDA4KSkgPyAweDgwIDogMDsKLQkJCQlody0+ZXh0X2J1dHRvbnMgfD0gKChidWZbNF0gJiAweDA4KSkgPyAweDQwIDogMDsKLQkJCWNhc2UgNjoKLQkJCQlody0+ZXh0X2J1dHRvbnMgfD0gKChidWZbNV0gJiAweDA0KSkgPyAweDIwIDogMDsKLQkJCQlody0+ZXh0X2J1dHRvbnMgfD0gKChidWZbNF0gJiAweDA0KSkgPyAweDEwIDogMDsKLQkJCWNhc2UgNDoKLQkJCQlody0+ZXh0X2J1dHRvbnMgfD0gKChidWZbNV0gJiAweDAyKSkgPyAweDA4IDogMDsKLQkJCQlody0+ZXh0X2J1dHRvbnMgfD0gKChidWZbNF0gJiAweDAyKSkgPyAweDA0IDogMDsKLQkJCWNhc2UgMjoKLQkJCQlody0+ZXh0X2J1dHRvbnMgfD0gKChidWZbNV0gJiAweDAxKSkgPyAweDAyIDogMDsKLQkJCQlody0+ZXh0X2J1dHRvbnMgfD0gKChidWZbNF0gJiAweDAxKSkgPyAweDAxIDogMDsKLQkJCX0KKwkJCXN5bmFwdGljc19wYXJzZV9leHRfYnV0dG9ucyhidWYsIHByaXYsIGh3KTsKIAkJfQogCX0gZWxzZSB7CiAJCWh3LT54ID0gKCgoYnVmWzFdICYgMHgxZikgPDwgOCkgfCBidWZbMl0pOwpAQCAtNzc0LDEyICs4NDUsNTQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHN5bmFwdGljc19yZXBvcnRfZXh0X2J1dHRvbnMoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsCisJCQkJCSBjb25zdCBzdHJ1Y3Qgc3luYXB0aWNzX2h3X3N0YXRlICpodykKK3sKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYgPSBwc21vdXNlLT5kZXY7CisJc3RydWN0IHN5bmFwdGljc19kYXRhICpwcml2ID0gcHNtb3VzZS0+cHJpdmF0ZTsKKwlpbnQgZXh0X2JpdHMgPSAoU1lOX0NBUF9NVUxUSV9CVVRUT05fTk8ocHJpdi0+ZXh0X2NhcCkgKyAxKSA+PiAxOworCWNoYXIgYnVmWzZdID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKwlpbnQgaTsKKworCWlmICghU1lOX0NBUF9NVUxUSV9CVVRUT05fTk8ocHJpdi0+ZXh0X2NhcCkpCisJCXJldHVybjsKKworCS8qIEJ1ZyBpbiBGVyA4LjEsIGJ1dHRvbnMgYXJlIHJlcG9ydGVkIG9ubHkgd2hlbiBFeHRCaXQgaXMgMSAqLworCWlmIChTWU5fSURfRlVMTChwcml2LT5pZGVudGl0eSkgPT0gMHg4MDEgJiYKKwkgICAgISgocHNtb3VzZS0+cGFja2V0WzBdIF4gcHNtb3VzZS0+cGFja2V0WzNdKSAmIDB4MDIpKQorCQlyZXR1cm47CisKKwlpZiAoIVNZTl9DQVBfRVhUX0JVVFRPTlNfU1RJQ0socHJpdi0+ZXh0X2NhcF8xMCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IGV4dF9iaXRzOyBpKyspIHsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fMCArIDIgKiBpLAorCQkJCWh3LT5leHRfYnV0dG9ucyAmICgxIDw8IGkpKTsKKwkJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fMSArIDIgKiBpLAorCQkJCWh3LT5leHRfYnV0dG9ucyAmICgxIDw8IChpICsgZXh0X2JpdHMpKSk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCS8qCisJICogVGhpcyBnZW5lcmF0aW9uIG9mIHRvdWNocGFkcyBoYXMgdGhlIHRyYWNrc3RpY2sgYnV0dG9ucworCSAqIHBoeXNpY2FsbHkgd2lyZWQgdG8gdGhlIHRvdWNocGFkLiBSZS1yb3V0ZSB0aGVtIHRocm91Z2gKKwkgKiB0aGUgcGFzcy10aHJvdWdoIGludGVyZmFjZS4KKwkgKi8KKwlpZiAoIXByaXYtPnB0X3BvcnQpCisJCXJldHVybjsKKworCS8qIFRoZSB0cmFja3N0aWNrIGV4cGVjdHMgYXQgbW9zdCAzIGJ1dHRvbnMgKi8KKwlwcml2LT5wdF9idXR0b25zID0gU1lOX0NBUF9FWFRfQlVUVE9OX1NUSUNLX0woaHctPmV4dF9idXR0b25zKSAgICAgIHwKKwkJCSAgIFNZTl9DQVBfRVhUX0JVVFRPTl9TVElDS19SKGh3LT5leHRfYnV0dG9ucykgPDwgMSB8CisJCQkgICBTWU5fQ0FQX0VYVF9CVVRUT05fU1RJQ0tfTShody0+ZXh0X2J1dHRvbnMpIDw8IDI7CisKKwlzeW5hcHRpY3NfcGFzc19wdF9wYWNrZXQocHNtb3VzZSwgcHJpdi0+cHRfcG9ydCwgYnVmKTsKK30KKwogc3RhdGljIHZvaWQgc3luYXB0aWNzX3JlcG9ydF9idXR0b25zKHN0cnVjdCBwc21vdXNlICpwc21vdXNlLAogCQkJCSAgICAgY29uc3Qgc3RydWN0IHN5bmFwdGljc19od19zdGF0ZSAqaHcpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqZGV2ID0gcHNtb3VzZS0+ZGV2OwogCXN0cnVjdCBzeW5hcHRpY3NfZGF0YSAqcHJpdiA9IHBzbW91c2UtPnByaXZhdGU7Ci0JaW50IGk7CiAKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX0xFRlQsIGh3LT5sZWZ0KTsKIAlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROX1JJR0hULCBody0+cmlnaHQpOwpAQCAtNzkyLDggKzkwNSw3IEBACiAJCWlucHV0X3JlcG9ydF9rZXkoZGV2LCBCVE5fQkFDSywgaHctPmRvd24pOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBTWU5fQ0FQX01VTFRJX0JVVFRPTl9OTyhwcml2LT5leHRfY2FwKTsgaSsrKQotCQlpbnB1dF9yZXBvcnRfa2V5KGRldiwgQlROXzAgKyBpLCBody0+ZXh0X2J1dHRvbnMgJiAoMSA8PCBpKSk7CisJc3luYXB0aWNzX3JlcG9ydF9leHRfYnV0dG9ucyhwc21vdXNlLCBodyk7CiB9CiAKIHN0YXRpYyB2b2lkIHN5bmFwdGljc19yZXBvcnRfbXRfZGF0YShzdHJ1Y3QgcHNtb3VzZSAqcHNtb3VzZSwKQEAgLTEwMTQsNyArMTEyNiw4IEBACiAJCWlmIChTWU5fQ0FQX1BBU1NfVEhST1VHSChwcml2LT5jYXBhYmlsaXRpZXMpICYmCiAJCSAgICBzeW5hcHRpY3NfaXNfcHRfcGFja2V0KHBzbW91c2UtPnBhY2tldCkpIHsKIAkJCWlmIChwcml2LT5wdF9wb3J0KQotCQkJCXN5bmFwdGljc19wYXNzX3B0X3BhY2tldChwcml2LT5wdF9wb3J0LCBwc21vdXNlLT5wYWNrZXQpOworCQkJCXN5bmFwdGljc19wYXNzX3B0X3BhY2tldChwc21vdXNlLCBwcml2LT5wdF9wb3J0LAorCQkJCQkJCSBwc21vdXNlLT5wYWNrZXQpOwogCQl9IGVsc2UKIAkJCXN5bmFwdGljc19wcm9jZXNzX3BhY2tldChwc21vdXNlKTsKIApAQCAtMTA4MSw3ICsxMTk0LDcgQEAKIAkJCQkJQUJTX01UX1BPU0lUSU9OX1kpOwogCQkvKiBJbWFnZSBzZW5zb3JzIGNhbiByZXBvcnQgcGVyLWNvbnRhY3QgcHJlc3N1cmUgKi8KIAkJaW5wdXRfc2V0X2Fic19wYXJhbXMoZGV2LCBBQlNfTVRfUFJFU1NVUkUsIDAsIDI1NSwgMCwgMCk7Ci0JCWlucHV0X210X2luaXRfc2xvdHMoZGV2LCAyLCBJTlBVVF9NVF9QT0lOVEVSIHwgSU5QVVRfTVRfVFJBQ0spOworCQlpbnB1dF9tdF9pbml0X3Nsb3RzKGRldiwgMywgSU5QVVRfTVRfUE9JTlRFUiB8IElOUFVUX01UX1RSQUNLKTsKIAogCQkvKiBJbWFnZSBzZW5zb3JzIGNhbiBzaWduYWwgNCBhbmQgNSBmaW5nZXIgY2xpY2tzICovCiAJCV9fc2V0X2JpdChCVE5fVE9PTF9RVUFEVEFQLCBkZXYtPmtleWJpdCk7CkBAIC0xMTE2LDggKzEyMjksOSBAQAogCQlfX3NldF9iaXQoQlROX0JBQ0ssIGRldi0+a2V5Yml0KTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgU1lOX0NBUF9NVUxUSV9CVVRUT05fTk8ocHJpdi0+ZXh0X2NhcCk7IGkrKykKLQkJX19zZXRfYml0KEJUTl8wICsgaSwgZGV2LT5rZXliaXQpOworCWlmICghU1lOX0NBUF9FWFRfQlVUVE9OU19TVElDSyhwcml2LT5leHRfY2FwXzEwKSkKKwkJZm9yIChpID0gMDsgaSA8IFNZTl9DQVBfTVVMVElfQlVUVE9OX05PKHByaXYtPmV4dF9jYXApOyBpKyspCisJCQlfX3NldF9iaXQoQlROXzAgKyBpLCBkZXYtPmtleWJpdCk7CiAKIAlfX2NsZWFyX2JpdChFVl9SRUwsIGRldi0+ZXZiaXQpOwogCV9fY2xlYXJfYml0KFJFTF9YLCBkZXYtPnJlbGJpdCk7CkBAIC0xMTI1LDcgKzEyMzksOCBAQAogCiAJaWYgKFNZTl9DQVBfQ0xJQ0tQQUQocHJpdi0+ZXh0X2NhcF8wYykpIHsKIAkJX19zZXRfYml0KElOUFVUX1BST1BfQlVUVE9OUEFELCBkZXYtPnByb3BiaXQpOwotCQlpZiAocHNtb3VzZV9tYXRjaGVzX3BucF9pZChwc21vdXNlLCB0b3BidXR0b25wYWRfcG5wX2lkcykpCisJCWlmIChwc21vdXNlX21hdGNoZXNfcG5wX2lkKHBzbW91c2UsIHRvcGJ1dHRvbnBhZF9wbnBfaWRzKSAmJgorCQkgICAgIVNZTl9DQVBfRVhUX0JVVFRPTlNfU1RJQ0socHJpdi0+ZXh0X2NhcF8xMCkpCiAJCQlfX3NldF9iaXQoSU5QVVRfUFJPUF9UT1BCVVRUT05QQUQsIGRldi0+cHJvcGJpdCk7CiAJCS8qIENsaWNrcGFkcyByZXBvcnQgb25seSBsZWZ0IGJ1dHRvbiAqLwogCQlfX2NsZWFyX2JpdChCVE5fUklHSFQsIGRldi0+a2V5Yml0KTsKQEAgLTEzMTEsMjkgKzE0MjYsMTEgQEAKIAl7IH0KIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBmb3JjZXBhZF9kbWlfdGFibGVbXSBfX2luaXRjb25zdCA9IHsKLSNpZiBkZWZpbmVkKENPTkZJR19ETUkpICYmIGRlZmluZWQoQ09ORklHX1g4NikKLQl7Ci0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSGV3bGV0dC1QYWNrYXJkIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIkhQIEVsaXRlQm9vayBGb2xpbyAxMDQwIEcxIiksCi0JCX0sCi0JfSwKLSNlbmRpZgotCXsgfQotfTsKLQogdm9pZCBfX2luaXQgc3luYXB0aWNzX21vZHVsZV9pbml0KHZvaWQpCiB7CiAJaW1wYWlyZWRfdG9zaGliYV9rYmMgPSBkbWlfY2hlY2tfc3lzdGVtKHRvc2hpYmFfZG1pX3RhYmxlKTsKIAlicm9rZW5fb2xwY19lYyA9IGRtaV9jaGVja19zeXN0ZW0ob2xwY19kbWlfdGFibGUpOwogCWNyNDhfcHJvZmlsZV9zZW5zb3IgPSBkbWlfY2hlY2tfc3lzdGVtKGNyNDhfZG1pX3RhYmxlKTsKLQotCS8qCi0JICogVW5mb3J0dW5hdGVseSBGb3JjZVBhZCBjYXBhYmlsaXR5IGlzIG5vdCBleHBvcnRlZCBvdmVyIFBTLzIsCi0JICogc28gd2UgaGF2ZSB0byByZXNvcnQgdG8gY2hlY2tpbmcgRE1JLgotCSAqLwotCWlzX2ZvcmNlcGFkID0gZG1pX2NoZWNrX3N5c3RlbShmb3JjZXBhZF9kbWlfdGFibGUpOwogfQogCiBzdGF0aWMgaW50IF9fc3luYXB0aWNzX2luaXQoc3RydWN0IHBzbW91c2UgKnBzbW91c2UsIGJvb2wgYWJzb2x1dGVfbW9kZSkKQEAgLTEzNjgsNiArMTQ2NSwxMiBAQAogCWlmIChTWU5fSURfRElTR0VTVF9TVVBQT1JURUQocHJpdi0+aWRlbnRpdHkpKQogCQlwcml2LT5kaXNhYmxlX2dlc3R1cmUgPSB0cnVlOwogCisJLyoKKwkgKiBVbmZvcnR1bmF0ZWx5IEZvcmNlUGFkIGNhcGFiaWxpdHkgaXMgbm90IGV4cG9ydGVkIG92ZXIgUFMvMiwKKwkgKiBzbyB3ZSBoYXZlIHRvIHJlc29ydCB0byBjaGVja2luZyBQTlAgSURzLgorCSAqLworCXByaXYtPmlzX2ZvcmNlcGFkID0gcHNtb3VzZV9tYXRjaGVzX3BucF9pZChwc21vdXNlLCBmb3JjZXBhZF9wbnBfaWRzKTsKKwogCWlmIChzeW5hcHRpY3Nfc2V0X21vZGUocHNtb3VzZSkpIHsKIAkJcHNtb3VzZV9lcnIocHNtb3VzZSwgIlVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZS5cbiIpOwogCQlnb3RvIGluaXRfZmFpbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmggYi9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5oCmluZGV4IGFlZGMzMjkuLjU2ZmFhN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmgKKysrIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuaApAQCAtMjIsNiArMjIsNyBAQAogI2RlZmluZSBTWU5fUVVFX0VYVF9DQVBBQl8wQwkJMHgwYwogI2RlZmluZSBTWU5fUVVFX0VYVF9NQVhfQ09PUkRTCQkweDBkCiAjZGVmaW5lIFNZTl9RVUVfRVhUX01JTl9DT09SRFMJCTB4MGYKKyNkZWZpbmUgU1lOX1FVRV9NRVhUX0NBUEFCXzEwCQkweDEwCiAKIC8qIHN5bmF0aWNzIG1vZGVzICovCiAjZGVmaW5lIFNZTl9CSVRfQUJTT0xVVEVfTU9ERQkJKDEgPDwgNykKQEAgLTUzLDYgKzU0LDcgQEAKICNkZWZpbmUgU1lOX0VYVF9DQVBfUkVRVUVTVFMoYykJCSgoKGMpICYgMHg3MDAwMDApID4+IDIwKQogI2RlZmluZSBTWU5fQ0FQX01VTFRJX0JVVFRPTl9OTyhlYykJKCgoZWMpICYgMHgwMGYwMDApID4+IDEyKQogI2RlZmluZSBTWU5fQ0FQX1BST0RVQ1RfSUQoZWMpCQkoKChlYykgJiAweGZmMDAwMCkgPj4gMTYpCisjZGVmaW5lIFNZTl9NRVhUX0NBUF9CSVQobSkJCSgobSkgJiAoMSA8PCAxKSkKIAogLyoKICAqIFRoZSBmb2xsb3dpbmcgZGVzY3JpYmVzIHJlc3BvbnNlIGZvciB0aGUgMHgwYyBxdWVyeS4KQEAgLTg5LDYgKzkxLDMwIEBACiAjZGVmaW5lIFNZTl9DQVBfUkVEVUNFRF9GSUxURVJJTkcoZXgwYykJKChleDBjKSAmIDB4MDAwNDAwKQogI2RlZmluZSBTWU5fQ0FQX0lNQUdFX1NFTlNPUihleDBjKQkoKGV4MGMpICYgMHgwMDA4MDApCiAKKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlc2NpYmVzIHJlc3BvbnNlIGZvciB0aGUgMHgxMCBxdWVyeS4KKyAqCisgKiBieXRlCW1hc2sJbmFtZQkJCW1lYW5pbmcKKyAqIC0tLS0JLS0tLQktLS0tLS0tCQkJLS0tLS0tLS0tLS0tCisgKiAxCTB4MDEJZXh0IGJ1dHRvbnMgYXJlIHN0aWNrCWJ1dHRvbnMgZXhwb3J0ZWQgaW4gdGhlIGV4dGVuZGVkCisgKgkJCQkJY2FwYWJpbGl0eSBhcmUgYWN0dWFsbHkgbWVhbnQgdG8gYmUgdXNlZAorICoJCQkJCWJ5IHRoZSB0cmFja3RpY2sgKHBhc3MtdGhyb3VnaCkuCisgKiAxCTB4MDIJU2VjdXJlUGFkCQl0aGUgdG91Y2hwYWQgaXMgYSBTZWN1cmVQYWQsIHNvIGl0CisgKgkJCQkJY29udGFpbnMgYSBidWlsdC1pbiBmaW5nZXJwcmludCByZWFkZXIuCisgKiAxCTB4ZTAJbW9yZSBleHQgY291bnQJCWhvdyBtYW55IG1vcmUgZXh0ZW50ZWQgcXVlcmllcyBhcmUKKyAqCQkJCQlhdmFpbGFibGUgYWZ0ZXIgdGhpcyBvbmUuCisgKiAyCTB4ZmYJU2VjdXJlUGFkIHdpZHRoCQl0aGUgd2lkdGggb2YgdGhlIFNlY3VyZVBhZCBmaW5nZXJwcmludAorICoJCQkJCXJlYWRlci4KKyAqIDMJMHhmZglTZWN1cmVQYWQgaGVpZ2h0CXRoZSBoZWlnaHQgb2YgdGhlIFNlY3VyZVBhZCBmaW5nZXJwcmludAorICoJCQkJCXJlYWRlci4KKyAqLworI2RlZmluZSBTWU5fQ0FQX0VYVF9CVVRUT05TX1NUSUNLKGV4MTApCSgoZXgxMCkgJiAweDAxMDAwMCkKKyNkZWZpbmUgU1lOX0NBUF9TRUNVUkVQQUQoZXgxMCkJCSgoZXgxMCkgJiAweDAyMDAwMCkKKworI2RlZmluZSBTWU5fQ0FQX0VYVF9CVVRUT05fU1RJQ0tfTChlYikJKCEhKChlYikgJiAweDAxKSkKKyNkZWZpbmUgU1lOX0NBUF9FWFRfQlVUVE9OX1NUSUNLX00oZWIpCSghISgoZWIpICYgMHgwMikpCisjZGVmaW5lIFNZTl9DQVBfRVhUX0JVVFRPTl9TVElDS19SKGViKQkoISEoKGViKSAmIDB4MDQpKQorCiAvKiBzeW5hcHRpY3MgbW9kZXMgcXVlcnkgYml0cyAqLwogI2RlZmluZSBTWU5fTU9ERV9BQlNPTFVURShtKQkJKChtKSAmICgxIDw8IDcpKQogI2RlZmluZSBTWU5fTU9ERV9SQVRFKG0pCQkoKG0pICYgKDEgPDwgNikpCkBAIC0xNDMsNiArMTY5LDcgQEAKIAl1bnNpZ25lZCBsb25nIGludCBjYXBhYmlsaXRpZXM7CQkvKiBDYXBhYmlsaXRpZXMgKi8KIAl1bnNpZ25lZCBsb25nIGludCBleHRfY2FwOwkJLyogRXh0ZW5kZWQgQ2FwYWJpbGl0aWVzICovCiAJdW5zaWduZWQgbG9uZyBpbnQgZXh0X2NhcF8wYzsJCS8qIEV4dCBDYXBzIGZyb20gMHgwYyBxdWVyeSAqLworCXVuc2lnbmVkIGxvbmcgaW50IGV4dF9jYXBfMTA7CQkvKiBFeHQgQ2FwcyBmcm9tIDB4MTAgcXVlcnkgKi8KIAl1bnNpZ25lZCBsb25nIGludCBpZGVudGl0eTsJCS8qIElkZW50aWZpY2F0aW9uICovCiAJdW5zaWduZWQgaW50IHhfcmVzLCB5X3JlczsJCS8qIFgvWSByZXNvbHV0aW9uIGluIHVuaXRzL21tICovCiAJdW5zaWduZWQgaW50IHhfbWF4LCB5X21heDsJCS8qIE1heCBjb29yZGluYXRlcyAoZnJvbSBGVykgKi8KQEAgLTE1Niw2ICsxODMsNyBAQAogCWJvb2wgZGlzYWJsZV9nZXN0dXJlOwkJCS8qIGRpc2FibGUgZ2VzdHVyZXMgKi8KIAogCXN0cnVjdCBzZXJpbyAqcHRfcG9ydDsJCQkvKiBQYXNzLXRocm91Z2ggc2VyaW8gcG9ydCAqLworCXVuc2lnbmVkIGNoYXIgcHRfYnV0dG9uczsJCS8qIFBhc3MtdGhyb3VnaCBidXR0b25zICovCiAKIAkvKgogCSAqIExhc3QgcmVjZWl2ZWQgQWR2YW5jZWQgR2VzdHVyZSBNb2RlIChBR00pIHBhY2tldC4gQW4gQUdNIHBhY2tldApAQCAtMTY4LDYgKzE5Niw3IEBACiAJdW5zaWduZWQgbG9uZwkJCQlwcmVzc19zdGFydDsKIAlib29sCQkJCQlwcmVzczsKIAlib29sCQkJCQlyZXBvcnRfcHJlc3M7CisJYm9vbAkJCQkJaXNfZm9yY2VwYWQ7CiB9OwogCiB2b2lkIHN5bmFwdGljc19tb2R1bGVfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vZ3NjcHMyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2dzY3BzMi5jCmluZGV4IDk0YWI0OTQuLmVjYmE2NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvc2VyaW8vZ3NjcHMyLmMKKysrIGIvZHJpdmVycy9pbnB1dC9zZXJpby9nc2NwczIuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL2k4MDQyLmMKaW5kZXggOTg2YTcxYy4uY2I1ZWNlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9zZXJpby9pODA0Mi5jCisrKyBiL2RyaXZlcnMvaW5wdXQvc2VyaW8vaTgwNDIuYwpAQCAtMTE2MiwxMyArMTE2MiwzMiBAQAogCiBzdGF0aWMgaW50IGk4MDQyX3BtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogeworCWludCBpOworCiAJaTgwNDJfY29udHJvbGxlcl9yZXNldCh0cnVlKTsKIAorCS8qIFNldCB1cCBzZXJpbyBpbnRlcnJ1cHRzIGZvciBzeXN0ZW0gd2FrZXVwLiAqLworCWZvciAoaSA9IDA7IGkgPCBJODA0Ml9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3Qgc2VyaW8gKnNlcmlvID0gaTgwNDJfcG9ydHNbaV0uc2VyaW87CisKKwkJaWYgKHNlcmlvICYmIGRldmljZV9tYXlfd2FrZXVwKCZzZXJpby0+ZGV2KSkKKwkJCWVuYWJsZV9pcnFfd2FrZShpODA0Ml9wb3J0c1tpXS5pcnEpOworCX0KKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGk4MDQyX3BtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSTgwNDJfTlVNX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IHNlcmlvICpzZXJpbyA9IGk4MDQyX3BvcnRzW2ldLnNlcmlvOworCisJCWlmIChzZXJpbyAmJiBkZXZpY2VfbWF5X3dha2V1cCgmc2VyaW8tPmRldikpCisJCQlkaXNhYmxlX2lycV93YWtlKGk4MDQyX3BvcnRzW2ldLmlycSk7CisJfQorCiAJLyoKIAkgKiBPbiByZXN1bWUgZnJvbSBTMlIgd2UgYWx3YXlzIHRyeSB0byByZXNldCB0aGUgY29udHJvbGxlcgogCSAqIHRvIGJyaW5nIGl0IGluIGEgc2FuZSBzdGF0ZS4gKEluIGNhc2Ugb2YgUzJEIHdlIGV4cGVjdApAQCAtMTMwMCwxMyArMTMxOSwxNiBAQAogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IEk4MDQyX05VTV9QT1JUUzsgaSsrKSB7Ci0JCWlmIChpODA0Ml9wb3J0c1tpXS5zZXJpbykgeworCQlzdHJ1Y3Qgc2VyaW8gKnNlcmlvID0gaTgwNDJfcG9ydHNbaV0uc2VyaW87CisKKwkJaWYgKHNlcmlvKSB7CiAJCQlwcmludGsoS0VSTl9JTkZPICJzZXJpbzogJXMgYXQgJSNseCwlI2x4IGlycSAlZFxuIiwKLQkJCQlpODA0Ml9wb3J0c1tpXS5zZXJpby0+bmFtZSwKKwkJCQlzZXJpby0+bmFtZSwKIAkJCQkodW5zaWduZWQgbG9uZykgSTgwNDJfREFUQV9SRUcsCiAJCQkJKHVuc2lnbmVkIGxvbmcpIEk4MDQyX0NPTU1BTkRfUkVHLAogCQkJCWk4MDQyX3BvcnRzW2ldLmlycSk7Ci0JCQlzZXJpb19yZWdpc3Rlcl9wb3J0KGk4MDQyX3BvcnRzW2ldLnNlcmlvKTsKKwkJCXNlcmlvX3JlZ2lzdGVyX3BvcnQoc2VyaW8pOworCQkJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZSgmc2VyaW8tPmRldiwgdHJ1ZSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL0tjb25maWcKaW5kZXggNjI2MWZkNi4uNTQ3ZjY3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vS2NvbmZpZwpAQCAtMTQwLDYgKzE0MCwxOSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYnUyMTAxM190cy4KIAorY29uZmlnIFRPVUNIU0NSRUVOX0NISVBPTkVfSUNOODMxOAorCXRyaXN0YXRlICJjaGlwb25lIGljbjgzMTggdG91Y2hzY3JlZW4gY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEdQSU9MSUIKKwlkZXBlbmRzIG9uIEkyQworCWRlcGVuZHMgb24gT0YKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgQ2hpcE9uZSBpY244MzE4IGJhc2VkIEkyQyB0b3VjaHNjcmVlbi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgY2hpcG9uZV9pY244MzE4LgorCiBjb25maWcgVE9VQ0hTQ1JFRU5fQ1k4Q1RNRzExMAogCXRyaXN0YXRlICJjeThjdG1nMTEwIHRvdWNoc2NyZWVuIgogCWRlcGVuZHMgb24gSTJDCkBAIC0yOTcsMTEgKzMxMCwxMiBAQAogCiBjb25maWcgVE9VQ0hTQ1JFRU5fR09PRElYCiAJdHJpc3RhdGUgIkdvb2RpeCBJMkMgdG91Y2hzY3JlZW4iCi0JZGVwZW5kcyBvbiBJMkMgJiYgQUNQSQorCWRlcGVuZHMgb24gSTJDCiAJaGVscAogCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSB0aGUgR29vZGl4IHRvdWNoc2NyZWVuIChzdWNoIGFzIG9uZQogCSAgaW5zdGFsbGVkIGluIE9uZGEgdjk3NXcgdGFibGV0cykgY29ubmVjdGVkIHRvIHlvdXIKLQkgIHN5c3RlbS4KKwkgIHN5c3RlbS4gSXQgYWxzbyBzdXBwb3J0cyA1LWZpbmdlciBjaGlwIG1vZGVscywgd2hpY2ggY2FuIGJlCisJICBmb3VuZCBvbiBBUk0gdGFibGV0cywgbGlrZSBXZXhsZXIgVEFCNzIwMCBhbmQgTVNJIFByaW1vNzMuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKQEAgLTMyMyw2ICszMzcsMTggQEAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIGlsaTIxMHguCiAKK2NvbmZpZyBUT1VDSFNDUkVFTl9JUFJPQworCXRyaXN0YXRlICJJUFJPQyB0b3VjaCBwYW5lbCBkcml2ZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFSQ0hfQkNNX0lQUk9DIHx8IENPTVBJTEVfVEVTVAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBJUFJPQyB0b3VjaAorCSAgY29udHJvbGxlciB0byB5b3VyIHN5c3RlbS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgYmNtX2lwcm9jX3RzYy4KKwogY29uZmlnIFRPVUNIU0NSRUVOX1MzQzI0MTAKIAl0cmlzdGF0ZSAiU2Ftc3VuZyBTM0MyNDEwL2dlbmVyaWMgdG91Y2hzY3JlZW4gaW5wdXQgZHJpdmVyIgogCWRlcGVuZHMgb24gQVJDSF9TM0MyNFhYIHx8IFNBTVNVTkdfREVWX1RTCkBAIC05NjIsNiArOTg4LDE3IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzdXI0MC4KIAorY29uZmlnIFRPVUNIU0NSRUVOX1NYODY1NAorCXRyaXN0YXRlICJTZW10ZWNoIFNYODY1NCB0b3VjaHNjcmVlbiIKKwlkZXBlbmRzIG9uIEkyQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBTZW10ZWNoIFNYODY1NCB0b3VjaHNjcmVlbiBjb250cm9sbGVyLgorCisJICBJZiB1bnN1cmUsIHNheSBOCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHN4ODY1NC4KKwogY29uZmlnIFRPVUNIU0NSRUVOX1RQUzY1MDdYCiAJdHJpc3RhdGUgIlRQUzY1MDd4IGJhc2VkIHRvdWNoc2NyZWVucyIKIAlkZXBlbmRzIG9uIEkyQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZSBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vTWFrZWZpbGUKaW5kZXggMDI0MmZlYS4uNDRkZWVhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL01ha2VmaWxlCkBAIC0xNyw2ICsxNyw3IEBACiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fQVRNRUxfTVhUKQkrPSBhdG1lbF9teHRfdHMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0FVT19QSVhDSVIpCSs9IGF1by1waXhjaXItdHMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0JVMjEwMTMpCSs9IGJ1MjEwMTNfdHMubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0NISVBPTkVfSUNOODMxOCkJKz0gY2hpcG9uZV9pY244MzE4Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9DWThDVE1HMTEwKQkrPSBjeThjdG1nMTEwX3RzLm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9DWVRUU1BfQ09SRSkJKz0gY3l0dHNwX2NvcmUubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0NZVFRTUF9JMkMpCSs9IGN5dHRzcF9pMmMubyBjeXR0c3BfaTJjX2NvbW1vbi5vCkBAIC0zOSw2ICs0MCw3IEBACiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fSUxJMjEwWCkJKz0gaWxpMjEweC5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fSU5FWElPKQkrPSBpbmV4aW8ubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0lOVEVMX01JRCkJKz0gaW50ZWwtbWlkLXRvdWNoLm8KK29iai0kKENPTkZJR19UT1VDSFNDUkVFTl9JUFJPQykJCSs9IGJjbV9pcHJvY190c2Mubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX0xQQzMyWFgpCSs9IGxwYzMyeHhfdHMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX01BWDExODAxKQkrPSBtYXgxMTgwMV90cy5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fTUMxMzc4MykJKz0gbWMxMzc4M190cy5vCkBAIC03OSw1ICs4MSw2IEBACiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fV005N1hYX01BSU5TVE9ORSkJKz0gbWFpbnN0b25lLXdtOTd4eC5vCiBvYmotJChDT05GSUdfVE9VQ0hTQ1JFRU5fV005N1hYX1pZTE9OSVRFKQkrPSB6eWxvbml0ZS13bTk3eHgubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1c5MFg5MDApCSs9IHc5MHA5MTBfdHMubworb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1NYODY1NCkJKz0gc3g4NjU0Lm8KIG9iai0kKENPTkZJR19UT1VDSFNDUkVFTl9UUFM2NTA3WCkJKz0gdHBzNjUwN3gtdHMubwogb2JqLSQoQ09ORklHX1RPVUNIU0NSRUVOX1pGT1JDRSkJKz0gemZvcmNlX3RzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXIxMDIxX2kyYy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hcjEwMjFfaTJjLmMKaW5kZXggYmEzMDU3OC4uZjBiOTU0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hcjEwMjFfaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hcjEwMjFfaTJjLmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhcjEwMjFfaTJjX2lkKTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYXIxMDIxX2kyY19vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXIxMDIxX2kyY19vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAibWljcm9jaGlwLGFyMTAyMS1pMmMiLCB9LAogCXsgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfbXh0X3RzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2F0bWVsX214dF90cy5jCmluZGV4IDk1ZWU5MmEuLjI4NzVkZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYXRtZWxfbXh0X3RzLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hdG1lbF9teHRfdHMuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogLyogVmVyc2lvbiAqLwogI2RlZmluZSBNWFRfVkVSXzIwCQkyMApAQCAtNzksNiArODAsNyBAQAogI2RlZmluZSBNWFRfU1BUX0RJR0lUSVpFUl9UNDMJCTQzCiAjZGVmaW5lIE1YVF9TUFRfTUVTU0FHRUNPVU5UX1Q0NAk0NAogI2RlZmluZSBNWFRfU1BUX0NURUNPTkZJR19UNDYJCTQ2CisjZGVmaW5lIE1YVF9UT1VDSF9NVUxUSVRPVUNIU0NSRUVOX1QxMDAgMTAwCiAKIC8qIE1YVF9HRU5fTUVTU0FHRV9UNSBvYmplY3QgKi8KICNkZWZpbmUgTVhUX1JQVElEX05PTVNHCQkweGZmCkBAIC0xODUsNiArMTg3LDM2IEBACiAjZGVmaW5lIE1YVF9SRVNFVF9WQUxVRQkJMHgwMQogI2RlZmluZSBNWFRfQkFDS1VQX1ZBTFVFCTB4NTUKIAorLyogVDEwMCBNdWx0aXBsZSBUb3VjaCBUb3VjaHNjcmVlbiAqLworI2RlZmluZSBNWFRfVDEwMF9DVFJMCQkwCisjZGVmaW5lIE1YVF9UMTAwX0NGRzEJCTEKKyNkZWZpbmUgTVhUX1QxMDBfVENIQVVYCQkzCisjZGVmaW5lIE1YVF9UMTAwX1hSQU5HRQkJMTMKKyNkZWZpbmUgTVhUX1QxMDBfWVJBTkdFCQkyNAorCisjZGVmaW5lIE1YVF9UMTAwX0NGR19TV0lUQ0hYWQlCSVQoNSkKKworI2RlZmluZSBNWFRfVDEwMF9UQ0hBVVhfVkVDVAlCSVQoMCkKKyNkZWZpbmUgTVhUX1QxMDBfVENIQVVYX0FNUEwJQklUKDEpCisjZGVmaW5lIE1YVF9UMTAwX1RDSEFVWF9BUkVBCUJJVCgyKQorCisjZGVmaW5lIE1YVF9UMTAwX0RFVEVDVAkJQklUKDcpCisjZGVmaW5lIE1YVF9UMTAwX1RZUEVfTUFTSwkweDcwCisKK2VudW0gdDEwMF90eXBlIHsKKwlNWFRfVDEwMF9UWVBFX0ZJTkdFUgkJPSAxLAorCU1YVF9UMTAwX1RZUEVfUEFTU0lWRV9TVFlMVVMJPSAyLAorCU1YVF9UMTAwX1RZUEVfSE9WRVJJTkdfRklOR0VSCT0gNCwKKwlNWFRfVDEwMF9UWVBFX0dMT1ZFCQk9IDUsCisJTVhUX1QxMDBfVFlQRV9MQVJHRV9UT1VDSAk9IDYsCit9OworCisjZGVmaW5lIE1YVF9ESVNUQU5DRV9BQ1RJVkVfVE9VQ0gJMAorI2RlZmluZSBNWFRfRElTVEFOQ0VfSE9WRVJJTkcJCTEKKworI2RlZmluZSBNWFRfVE9VQ0hfTUFKT1JfREVGQVVMVAkJMQorI2RlZmluZSBNWFRfUFJFU1NVUkVfREVGQVVMVAkJMQorCiAvKiBEZWxheSB0aW1lcyAqLwogI2RlZmluZSBNWFRfQkFDS1VQX1RJTUUJCTUwCS8qIG1zZWMgKi8KICNkZWZpbmUgTVhUX1JFU0VUX1RJTUUJCTIwMAkvKiBtc2VjICovCkBAIC0yNDQsNiArMjc2LDkgQEAKIAl1bnNpZ25lZCBpbnQgbWF4X3k7CiAJYm9vbCBpbl9ib290bG9hZGVyOwogCXUxNiBtZW1fc2l6ZTsKKwl1OCB0MTAwX2F1eF9hbXBsOworCXU4IHQxMDBfYXV4X2FyZWE7CisJdTggdDEwMF9hdXhfdmVjdDsKIAl1OCBtYXhfcmVwb3J0aWQ7CiAJdTMyIGNvbmZpZ19jcmM7CiAJdTMyIGluZm9fY3JjOwpAQCAtMjUzLDYgKzI4OCw3IEBACiAJYm9vbCB1cGRhdGVfaW5wdXQ7CiAJdTggbGFzdF9tZXNzYWdlX2NvdW50OwogCXU4IG51bV90b3VjaGlkczsKKwl1OCBtdWx0aXRvdWNoOwogCiAJLyogQ2FjaGVkIHBhcmFtZXRlcnMgZnJvbSBvYmplY3QgdGFibGUgKi8KIAl1MTYgVDVfYWRkcmVzczsKQEAgLTI2NCw2ICszMDAsOCBAQAogCXU4IFQ5X3JlcG9ydGlkX21heDsKIAl1OCBUMTlfcmVwb3J0aWQ7CiAJdTE2IFQ0NF9hZGRyZXNzOworCXU4IFQxMDBfcmVwb3J0aWRfbWluOworCXU4IFQxMDBfcmVwb3J0aWRfbWF4OwogCiAJLyogZm9yIGZ3IHVwZGF0ZSBpbiBib290bG9hZGVyICovCiAJc3RydWN0IGNvbXBsZXRpb24gYmxfY29tcGxldGlvbjsKQEAgLTc3MSw2ICs4MDksMTE0IEBACiAJZGF0YS0+dXBkYXRlX2lucHV0ID0gdHJ1ZTsKIH0KIAorc3RhdGljIHZvaWQgbXh0X3Byb2NfdDEwMF9tZXNzYWdlKHN0cnVjdCBteHRfZGF0YSAqZGF0YSwgdTggKm1lc3NhZ2UpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmNsaWVudC0+ZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldiA9IGRhdGEtPmlucHV0X2RldjsKKwlpbnQgaWQ7CisJdTggc3RhdHVzOworCXU4IHR5cGUgPSAwOworCXUxNiB4OworCXUxNiB5OworCWludCBkaXN0YW5jZSA9IDA7CisJaW50IHRvb2wgPSAwOworCXU4IG1ham9yID0gMDsKKwl1OCBwcmVzc3VyZSA9IDA7CisJdTggb3JpZW50YXRpb24gPSAwOworCisJaWQgPSBtZXNzYWdlWzBdIC0gZGF0YS0+VDEwMF9yZXBvcnRpZF9taW4gLSAyOworCisJLyogaWdub3JlIFNDUlNUQVRVUyBldmVudHMgKi8KKwlpZiAoaWQgPCAwKQorCQlyZXR1cm47CisKKwlzdGF0dXMgPSBtZXNzYWdlWzFdOworCXggPSBnZXRfdW5hbGlnbmVkX2xlMTYoJm1lc3NhZ2VbMl0pOworCXkgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJm1lc3NhZ2VbNF0pOworCisJaWYgKHN0YXR1cyAmIE1YVF9UMTAwX0RFVEVDVCkgeworCQl0eXBlID0gKHN0YXR1cyAmIE1YVF9UMTAwX1RZUEVfTUFTSykgPj4gNDsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBNWFRfVDEwMF9UWVBFX0hPVkVSSU5HX0ZJTkdFUjoKKwkJCXRvb2wgPSBNVF9UT09MX0ZJTkdFUjsKKwkJCWRpc3RhbmNlID0gTVhUX0RJU1RBTkNFX0hPVkVSSU5HOworCisJCQlpZiAoZGF0YS0+dDEwMF9hdXhfdmVjdCkKKwkJCQlvcmllbnRhdGlvbiA9IG1lc3NhZ2VbZGF0YS0+dDEwMF9hdXhfdmVjdF07CisKKwkJCWJyZWFrOworCisJCWNhc2UgTVhUX1QxMDBfVFlQRV9GSU5HRVI6CisJCWNhc2UgTVhUX1QxMDBfVFlQRV9HTE9WRToKKwkJCXRvb2wgPSBNVF9UT09MX0ZJTkdFUjsKKwkJCWRpc3RhbmNlID0gTVhUX0RJU1RBTkNFX0FDVElWRV9UT1VDSDsKKworCQkJaWYgKGRhdGEtPnQxMDBfYXV4X2FyZWEpCisJCQkJbWFqb3IgPSBtZXNzYWdlW2RhdGEtPnQxMDBfYXV4X2FyZWFdOworCisJCQlpZiAoZGF0YS0+dDEwMF9hdXhfYW1wbCkKKwkJCQlwcmVzc3VyZSA9IG1lc3NhZ2VbZGF0YS0+dDEwMF9hdXhfYW1wbF07CisKKwkJCWlmIChkYXRhLT50MTAwX2F1eF92ZWN0KQorCQkJCW9yaWVudGF0aW9uID0gbWVzc2FnZVtkYXRhLT50MTAwX2F1eF92ZWN0XTsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBNWFRfVDEwMF9UWVBFX1BBU1NJVkVfU1RZTFVTOgorCQkJdG9vbCA9IE1UX1RPT0xfUEVOOworCisJCQkvKgorCQkJICogUGFzc2l2ZSBzdHlsdXMgaXMgcmVwb3J0ZWQgd2l0aCBzaXplIHplcm8gc28KKwkJCSAqIGhhcmRjb2RlLgorCQkJICovCisJCQltYWpvciA9IE1YVF9UT1VDSF9NQUpPUl9ERUZBVUxUOworCisJCQlpZiAoZGF0YS0+dDEwMF9hdXhfYW1wbCkKKwkJCQlwcmVzc3VyZSA9IG1lc3NhZ2VbZGF0YS0+dDEwMF9hdXhfYW1wbF07CisKKwkJCWJyZWFrOworCisJCWNhc2UgTVhUX1QxMDBfVFlQRV9MQVJHRV9UT1VDSDoKKwkJCS8qIElnbm9yZSBzdXBwcmVzc2VkIHRvdWNoICovCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X2RiZyhkZXYsICJVbmV4cGVjdGVkIFQxMDAgdHlwZVxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKgorCSAqIFZhbHVlcyByZXBvcnRlZCBzaG91bGQgYmUgbm9uLXplcm8gaWYgdG9vbCBpcyB0b3VjaGluZyB0aGUKKwkgKiBkZXZpY2UKKwkgKi8KKwlpZiAoIXByZXNzdXJlICYmIHR5cGUgIT0gTVhUX1QxMDBfVFlQRV9IT1ZFUklOR19GSU5HRVIpCisJCXByZXNzdXJlID0gTVhUX1BSRVNTVVJFX0RFRkFVTFQ7CisKKwlpbnB1dF9tdF9zbG90KGlucHV0X2RldiwgaWQpOworCisJaWYgKHN0YXR1cyAmIE1YVF9UMTAwX0RFVEVDVCkgeworCQlkZXZfZGJnKGRldiwgIlsldV0gdHlwZToldSB4OiV1IHk6JXUgYTolMDJYIHA6JTAyWCB2OiUwMlhcbiIsCisJCQlpZCwgdHlwZSwgeCwgeSwgbWFqb3IsIHByZXNzdXJlLCBvcmllbnRhdGlvbik7CisKKwkJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoaW5wdXRfZGV2LCB0b29sLCAxKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9YLCB4KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9ZLCB5KTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19NVF9UT1VDSF9NQUpPUiwgbWFqb3IpOworCQlpbnB1dF9yZXBvcnRfYWJzKGlucHV0X2RldiwgQUJTX01UX1BSRVNTVVJFLCBwcmVzc3VyZSk7CisJCWlucHV0X3JlcG9ydF9hYnMoaW5wdXRfZGV2LCBBQlNfTVRfRElTVEFOQ0UsIGRpc3RhbmNlKTsKKwkJaW5wdXRfcmVwb3J0X2FicyhpbnB1dF9kZXYsIEFCU19NVF9PUklFTlRBVElPTiwgb3JpZW50YXRpb24pOworCX0gZWxzZSB7CisJCWRldl9kYmcoZGV2LCAiWyV1XSByZWxlYXNlXG4iLCBpZCk7CisKKwkJLyogY2xvc2Ugb3V0IHNsb3QgKi8KKwkJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoaW5wdXRfZGV2LCAwLCAwKTsKKwl9CisKKwlkYXRhLT51cGRhdGVfaW5wdXQgPSB0cnVlOworfQorCiBzdGF0aWMgaW50IG14dF9wcm9jX21lc3NhZ2Uoc3RydWN0IG14dF9kYXRhICpkYXRhLCB1OCAqbWVzc2FnZSkKIHsKIAl1OCByZXBvcnRfaWQgPSBtZXNzYWdlWzBdOwpAQCAtNzg2LDkgKzkzMiwxMiBAQAogCQkgKiBpcyBub3QgeWV0IHJlZ2lzdGVyZWQuCiAJCSAqLwogCQlteHRfZHVtcF9tZXNzYWdlKGRhdGEsIG1lc3NhZ2UpOwotCX0gZWxzZSBpZiAocmVwb3J0X2lkID49IGRhdGEtPlQ5X3JlcG9ydGlkX21pbgotCSAgICAmJiByZXBvcnRfaWQgPD0gZGF0YS0+VDlfcmVwb3J0aWRfbWF4KSB7CisJfSBlbHNlIGlmIChyZXBvcnRfaWQgPj0gZGF0YS0+VDlfcmVwb3J0aWRfbWluICYmCisJCSAgIHJlcG9ydF9pZCA8PSBkYXRhLT5UOV9yZXBvcnRpZF9tYXgpIHsKIAkJbXh0X3Byb2NfdDlfbWVzc2FnZShkYXRhLCBtZXNzYWdlKTsKKwl9IGVsc2UgaWYgKHJlcG9ydF9pZCA+PSBkYXRhLT5UMTAwX3JlcG9ydGlkX21pbiAmJgorCQkgICByZXBvcnRfaWQgPD0gZGF0YS0+VDEwMF9yZXBvcnRpZF9tYXgpIHsKKwkJbXh0X3Byb2NfdDEwMF9tZXNzYWdlKGRhdGEsIG1lc3NhZ2UpOwogCX0gZWxzZSBpZiAocmVwb3J0X2lkID09IGRhdGEtPlQxOV9yZXBvcnRpZCkgewogCQlteHRfaW5wdXRfYnV0dG9uKGRhdGEsIG1lc3NhZ2UpOwogCQlkYXRhLT51cGRhdGVfaW5wdXQgPSB0cnVlOwpAQCAtMTQxMSw2ICsxNTYwLDggQEAKIAlkYXRhLT5UOV9yZXBvcnRpZF9tYXggPSAwOwogCWRhdGEtPlQxOV9yZXBvcnRpZCA9IDA7CiAJZGF0YS0+VDQ0X2FkZHJlc3MgPSAwOworCWRhdGEtPlQxMDBfcmVwb3J0aWRfbWluID0gMDsKKwlkYXRhLT5UMTAwX3JlcG9ydGlkX21heCA9IDA7CiAJZGF0YS0+bWF4X3JlcG9ydGlkID0gMDsKIH0KIApAQCAtMTQ4Nyw2ICsxNjM4LDcgQEAKIAkJCWRhdGEtPlQ3X2FkZHJlc3MgPSBvYmplY3QtPnN0YXJ0X2FkZHJlc3M7CiAJCQlicmVhazsKIAkJY2FzZSBNWFRfVE9VQ0hfTVVMVElfVDk6CisJCQlkYXRhLT5tdWx0aXRvdWNoID0gTVhUX1RPVUNIX01VTFRJX1Q5OwogCQkJZGF0YS0+VDlfcmVwb3J0aWRfbWluID0gbWluX2lkOwogCQkJZGF0YS0+VDlfcmVwb3J0aWRfbWF4ID0gbWF4X2lkOwogCQkJZGF0YS0+bnVtX3RvdWNoaWRzID0gb2JqZWN0LT5udW1fcmVwb3J0X2lkcwpAQCAtMTQ5OCw2ICsxNjUwLDEzIEBACiAJCWNhc2UgTVhUX1NQVF9HUElPUFdNX1QxOToKIAkJCWRhdGEtPlQxOV9yZXBvcnRpZCA9IG1pbl9pZDsKIAkJCWJyZWFrOworCQljYXNlIE1YVF9UT1VDSF9NVUxUSVRPVUNIU0NSRUVOX1QxMDA6CisJCQlkYXRhLT5tdWx0aXRvdWNoID0gTVhUX1RPVUNIX01VTFRJVE9VQ0hTQ1JFRU5fVDEwMDsKKwkJCWRhdGEtPlQxMDBfcmVwb3J0aWRfbWluID0gbWluX2lkOworCQkJZGF0YS0+VDEwMF9yZXBvcnRpZF9tYXggPSBtYXhfaWQ7CisJCQkvKiBmaXJzdCB0d28gcmVwb3J0IElEcyByZXNlcnZlZCAqLworCQkJZGF0YS0+bnVtX3RvdWNoaWRzID0gb2JqZWN0LT5udW1fcmVwb3J0X2lkcyAtIDI7CisJCQlicmVhazsKIAkJfQogCiAJCWVuZF9hZGRyZXNzID0gb2JqZWN0LT5zdGFydF9hZGRyZXNzCkBAIC0xNTgyLDIyICsxNzQxLDEzOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG14dF9yZWFkX3QxMDBfY29uZmlnKHN0cnVjdCBteHRfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gZGF0YS0+Y2xpZW50OworCWludCBlcnJvcjsKKwlzdHJ1Y3QgbXh0X29iamVjdCAqb2JqZWN0OworCXUxNiByYW5nZV94LCByYW5nZV95OworCXU4IGNmZywgdGNoYXV4OworCXU4IGF1eDsKKworCW9iamVjdCA9IG14dF9nZXRfb2JqZWN0KGRhdGEsIE1YVF9UT1VDSF9NVUxUSVRPVUNIU0NSRUVOX1QxMDApOworCWlmICghb2JqZWN0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gX19teHRfcmVhZF9yZWcoY2xpZW50LAorCQkJICAgICAgIG9iamVjdC0+c3RhcnRfYWRkcmVzcyArIE1YVF9UMTAwX1hSQU5HRSwKKwkJCSAgICAgICBzaXplb2YocmFuZ2VfeCksICZyYW5nZV94KTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWxlMTZfdG9fY3B1cygmcmFuZ2VfeCk7CisKKwllcnJvciA9IF9fbXh0X3JlYWRfcmVnKGNsaWVudCwKKwkJCSAgICAgICBvYmplY3QtPnN0YXJ0X2FkZHJlc3MgKyBNWFRfVDEwMF9ZUkFOR0UsCisJCQkgICAgICAgc2l6ZW9mKHJhbmdlX3kpLCAmcmFuZ2VfeSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlsZTE2X3RvX2NwdXMoJnJhbmdlX3kpOworCisJZXJyb3IgPSAgX19teHRfcmVhZF9yZWcoY2xpZW50LAorCQkJCW9iamVjdC0+c3RhcnRfYWRkcmVzcyArIE1YVF9UMTAwX0NGRzEsCisJCQkJMSwgJmNmZyk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9ICBfX214dF9yZWFkX3JlZyhjbGllbnQsCisJCQkJb2JqZWN0LT5zdGFydF9hZGRyZXNzICsgTVhUX1QxMDBfVENIQVVYLAorCQkJCTEsICZ0Y2hhdXgpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJLyogSGFuZGxlIGRlZmF1bHQgdmFsdWVzICovCisJaWYgKHJhbmdlX3ggPT0gMCkKKwkJcmFuZ2VfeCA9IDEwMjM7CisKKwlpZiAocmFuZ2VfeSA9PSAwKQorCQlyYW5nZV95ID0gMTAyMzsKKworCWlmIChjZmcgJiBNWFRfVDEwMF9DRkdfU1dJVENIWFkpIHsKKwkJZGF0YS0+bWF4X3ggPSByYW5nZV95OworCQlkYXRhLT5tYXhfeSA9IHJhbmdlX3g7CisJfSBlbHNlIHsKKwkJZGF0YS0+bWF4X3ggPSByYW5nZV94OworCQlkYXRhLT5tYXhfeSA9IHJhbmdlX3k7CisJfQorCisJLyogYWxsb2NhdGUgYXV4IGJ5dGVzICovCisJYXV4ID0gNjsKKworCWlmICh0Y2hhdXggJiBNWFRfVDEwMF9UQ0hBVVhfVkVDVCkKKwkJZGF0YS0+dDEwMF9hdXhfdmVjdCA9IGF1eCsrOworCisJaWYgKHRjaGF1eCAmIE1YVF9UMTAwX1RDSEFVWF9BTVBMKQorCQlkYXRhLT50MTAwX2F1eF9hbXBsID0gYXV4Kys7CisKKwlpZiAodGNoYXV4ICYgTVhUX1QxMDBfVENIQVVYX0FSRUEpCisJCWRhdGEtPnQxMDBfYXV4X2FyZWEgPSBhdXgrKzsKKworCWRldl9kYmcoJmNsaWVudC0+ZGV2LAorCQkiVDEwMCBhdXggbWFwcGluZ3MgdmVjdDoldSBhbXBsOiV1IGFyZWE6JXVcbiIsCisJCWRhdGEtPnQxMDBfYXV4X3ZlY3QsIGRhdGEtPnQxMDBfYXV4X2FtcGwsIGRhdGEtPnQxMDBfYXV4X2FyZWEpOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LAorCQkgIlQxMDAgVG91Y2hzY3JlZW4gc2l6ZSBYJXVZJXVcbiIsIGRhdGEtPm1heF94LCBkYXRhLT5tYXhfeSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBteHRfaW5wdXRfb3BlbihzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpOwogc3RhdGljIHZvaWQgbXh0X2lucHV0X2Nsb3NlKHN0cnVjdCBpbnB1dF9kZXYgKmRldik7CiAKLXN0YXRpYyBpbnQgbXh0X2luaXRpYWxpemVfdDlfaW5wdXRfZGV2aWNlKHN0cnVjdCBteHRfZGF0YSAqZGF0YSkKK3N0YXRpYyB2b2lkIG14dF9zZXRfdXBfYXNfdG91Y2hwYWQoc3RydWN0IGlucHV0X2RldiAqaW5wdXRfZGV2LAorCQkJCSAgIHN0cnVjdCBteHRfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZGF0YS0+Y2xpZW50LT5kZXY7CiAJY29uc3Qgc3RydWN0IG14dF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCWludCBpOworCisJaW5wdXRfZGV2LT5uYW1lID0gIkF0bWVsIG1hWFRvdWNoIFRvdWNocGFkIjsKKworCV9fc2V0X2JpdChJTlBVVF9QUk9QX0JVVFRPTlBBRCwgaW5wdXRfZGV2LT5wcm9wYml0KTsKKworCWlucHV0X2Fic19zZXRfcmVzKGlucHV0X2RldiwgQUJTX1gsIE1YVF9QSVhFTFNfUEVSX01NKTsKKwlpbnB1dF9hYnNfc2V0X3JlcyhpbnB1dF9kZXYsIEFCU19ZLCBNWFRfUElYRUxTX1BFUl9NTSk7CisJaW5wdXRfYWJzX3NldF9yZXMoaW5wdXRfZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwKKwkJCSAgTVhUX1BJWEVMU19QRVJfTU0pOworCWlucHV0X2Fic19zZXRfcmVzKGlucHV0X2RldiwgQUJTX01UX1BPU0lUSU9OX1ksCisJCQkgIE1YVF9QSVhFTFNfUEVSX01NKTsKKworCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+dDE5X251bV9rZXlzOyBpKyspCisJCWlmIChwZGF0YS0+dDE5X2tleW1hcFtpXSAhPSBLRVlfUkVTRVJWRUQpCisJCQlpbnB1dF9zZXRfY2FwYWJpbGl0eShpbnB1dF9kZXYsIEVWX0tFWSwKKwkJCQkJICAgICBwZGF0YS0+dDE5X2tleW1hcFtpXSk7Cit9CisKK3N0YXRpYyBpbnQgbXh0X2luaXRpYWxpemVfaW5wdXRfZGV2aWNlKHN0cnVjdCBteHRfZGF0YSAqZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3QgbXh0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGF0YS0+cGRhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmNsaWVudC0+ZGV2OwogCXN0cnVjdCBpbnB1dF9kZXYgKmlucHV0X2RldjsKIAlpbnQgZXJyb3I7CiAJdW5zaWduZWQgaW50IG51bV9tdF9zbG90czsKIAl1bnNpZ25lZCBpbnQgbXRfZmxhZ3MgPSAwOwotCWludCBpOwogCi0JZXJyb3IgPSBteHRfcmVhZF90OV9yZXNvbHV0aW9uKGRhdGEpOwotCWlmIChlcnJvcikKLQkJZGV2X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgVDkgcmVzb2x1dGlvblxuIik7CisJc3dpdGNoIChkYXRhLT5tdWx0aXRvdWNoKSB7CisJY2FzZSBNWFRfVE9VQ0hfTVVMVElfVDk6CisJCW51bV9tdF9zbG90cyA9IGRhdGEtPlQ5X3JlcG9ydGlkX21heCAtIGRhdGEtPlQ5X3JlcG9ydGlkX21pbiArIDE7CisJCWVycm9yID0gbXh0X3JlYWRfdDlfcmVzb2x1dGlvbihkYXRhKTsKKwkJaWYgKGVycm9yKQorCQkJZGV2X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemUgVDkgcmVzb2x1dGlvblxuIik7CisJCWJyZWFrOworCisJY2FzZSBNWFRfVE9VQ0hfTVVMVElUT1VDSFNDUkVFTl9UMTAwOgorCQludW1fbXRfc2xvdHMgPSBkYXRhLT5udW1fdG91Y2hpZHM7CisJCWVycm9yID0gbXh0X3JlYWRfdDEwMF9jb25maWcoZGF0YSk7CisJCWlmIChlcnJvcikKKwkJCWRldl93YXJuKGRldiwgIkZhaWxlZCB0byByZWFkIFQxMDAgY29uZmlnXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgIkludmFsaWQgbXVsdGl0b3VjaCBvYmplY3RcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlpbnB1dF9kZXYgPSBpbnB1dF9hbGxvY2F0ZV9kZXZpY2UoKTsKIAlpZiAoIWlucHV0X2RldikgewpAQCAtMTYxMiw1NCArMTg4Nyw3NiBAQAogCWlucHV0X2Rldi0+b3BlbiA9IG14dF9pbnB1dF9vcGVuOwogCWlucHV0X2Rldi0+Y2xvc2UgPSBteHRfaW5wdXRfY2xvc2U7CiAKLQlfX3NldF9iaXQoRVZfQUJTLCBpbnB1dF9kZXYtPmV2Yml0KTsKLQlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dF9kZXYtPmV2Yml0KTsKLQlfX3NldF9iaXQoQlROX1RPVUNILCBpbnB1dF9kZXYtPmtleWJpdCk7Ci0KLQlpZiAocGRhdGEtPnQxOV9udW1fa2V5cykgewotCQlfX3NldF9iaXQoSU5QVVRfUFJPUF9CVVRUT05QQUQsIGlucHV0X2Rldi0+cHJvcGJpdCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHBkYXRhLT50MTlfbnVtX2tleXM7IGkrKykKLQkJCWlmIChwZGF0YS0+dDE5X2tleW1hcFtpXSAhPSBLRVlfUkVTRVJWRUQpCi0JCQkJaW5wdXRfc2V0X2NhcGFiaWxpdHkoaW5wdXRfZGV2LCBFVl9LRVksCi0JCQkJCQkgICAgIHBkYXRhLT50MTlfa2V5bWFwW2ldKTsKLQotCQltdF9mbGFncyB8PSBJTlBVVF9NVF9QT0lOVEVSOwotCi0JCWlucHV0X2Fic19zZXRfcmVzKGlucHV0X2RldiwgQUJTX1gsIE1YVF9QSVhFTFNfUEVSX01NKTsKLQkJaW5wdXRfYWJzX3NldF9yZXMoaW5wdXRfZGV2LCBBQlNfWSwgTVhUX1BJWEVMU19QRVJfTU0pOwotCQlpbnB1dF9hYnNfc2V0X3JlcyhpbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9YLAotCQkJCSAgTVhUX1BJWEVMU19QRVJfTU0pOwotCQlpbnB1dF9hYnNfc2V0X3JlcyhpbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9ZLAotCQkJCSAgTVhUX1BJWEVMU19QRVJfTU0pOwotCi0JCWlucHV0X2Rldi0+bmFtZSA9ICJBdG1lbCBtYVhUb3VjaCBUb3VjaHBhZCI7Ci0JfQorCWlucHV0X3NldF9jYXBhYmlsaXR5KGlucHV0X2RldiwgRVZfS0VZLCBCVE5fVE9VQ0gpOwogCiAJLyogRm9yIHNpbmdsZSB0b3VjaCAqLwotCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1gsCi0JCQkgICAgIDAsIGRhdGEtPm1heF94LCAwLCAwKTsKLQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19ZLAotCQkJICAgICAwLCBkYXRhLT5tYXhfeSwgMCwgMCk7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfUFJFU1NVUkUsCi0JCQkgICAgIDAsIDI1NSwgMCwgMCk7CisJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfWCwgMCwgZGF0YS0+bWF4X3gsIDAsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX1ksIDAsIGRhdGEtPm1heF95LCAwLCAwKTsKKworCWlmIChkYXRhLT5tdWx0aXRvdWNoID09IE1YVF9UT1VDSF9NVUxUSV9UOSB8fAorCSAgICAoZGF0YS0+bXVsdGl0b3VjaCA9PSBNWFRfVE9VQ0hfTVVMVElUT1VDSFNDUkVFTl9UMTAwICYmCisJICAgICBkYXRhLT50MTAwX2F1eF9hbXBsKSkgeworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19QUkVTU1VSRSwgMCwgMjU1LCAwLCAwKTsKKwl9CisKKwkvKiBJZiBkZXZpY2UgaGFzIGJ1dHRvbnMgd2UgYXNzdW1lIGl0IGlzIGEgdG91Y2hwYWQgKi8KKwlpZiAocGRhdGEtPnQxOV9udW1fa2V5cykgeworCQlteHRfc2V0X3VwX2FzX3RvdWNocGFkKGlucHV0X2RldiwgZGF0YSk7CisJCW10X2ZsYWdzIHw9IElOUFVUX01UX1BPSU5URVI7CisJfQogCiAJLyogRm9yIG11bHRpIHRvdWNoICovCi0JbnVtX210X3Nsb3RzID0gZGF0YS0+VDlfcmVwb3J0aWRfbWF4IC0gZGF0YS0+VDlfcmVwb3J0aWRfbWluICsgMTsKIAllcnJvciA9IGlucHV0X210X2luaXRfc2xvdHMoaW5wdXRfZGV2LCBudW1fbXRfc2xvdHMsIG10X2ZsYWdzKTsKIAlpZiAoZXJyb3IpIHsKIAkJZGV2X2VycihkZXYsICJFcnJvciAlZCBpbml0aWFsaXNpbmcgc2xvdHNcbiIsIGVycm9yKTsKIAkJZ290byBlcnJfZnJlZV9tZW07CiAJfQogCi0JaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfTVRfVE9VQ0hfTUFKT1IsCi0JCQkgICAgIDAsIE1YVF9NQVhfQVJFQSwgMCwgMCk7CisJaWYgKGRhdGEtPm11bHRpdG91Y2ggPT0gTVhUX1RPVUNIX01VTFRJVE9VQ0hTQ1JFRU5fVDEwMCkgeworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19NVF9UT09MX1RZUEUsCisJCQkJICAgICAwLCBNVF9UT09MX01BWCwgMCwgMCk7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX01UX0RJU1RBTkNFLAorCQkJCSAgICAgTVhUX0RJU1RBTkNFX0FDVElWRV9UT1VDSCwKKwkJCQkgICAgIE1YVF9ESVNUQU5DRV9IT1ZFUklORywKKwkJCQkgICAgIDAsIDApOworCX0KKwogCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX01UX1BPU0lUSU9OX1gsCiAJCQkgICAgIDAsIGRhdGEtPm1heF94LCAwLCAwKTsKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19NVF9QT1NJVElPTl9ZLAogCQkJICAgICAwLCBkYXRhLT5tYXhfeSwgMCwgMCk7Ci0JaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfTVRfUFJFU1NVUkUsCi0JCQkgICAgIDAsIDI1NSwgMCwgMCk7CisKKwlpZiAoZGF0YS0+bXVsdGl0b3VjaCA9PSBNWFRfVE9VQ0hfTVVMVElfVDkgfHwKKwkgICAgKGRhdGEtPm11bHRpdG91Y2ggPT0gTVhUX1RPVUNIX01VTFRJVE9VQ0hTQ1JFRU5fVDEwMCAmJgorCSAgICAgZGF0YS0+dDEwMF9hdXhfYXJlYSkpIHsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfTVRfVE9VQ0hfTUFKT1IsCisJCQkJICAgICAwLCBNWFRfTUFYX0FSRUEsIDAsIDApOworCX0KKworCWlmIChkYXRhLT5tdWx0aXRvdWNoID09IE1YVF9UT1VDSF9NVUxUSV9UOSB8fAorCSAgICAoZGF0YS0+bXVsdGl0b3VjaCA9PSBNWFRfVE9VQ0hfTVVMVElUT1VDSFNDUkVFTl9UMTAwICYmCisJICAgICBkYXRhLT50MTAwX2F1eF9hbXBsKSkgeworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19NVF9QUkVTU1VSRSwKKwkJCQkgICAgIDAsIDI1NSwgMCwgMCk7CisJfQorCisJaWYgKGRhdGEtPm11bHRpdG91Y2ggPT0gTVhUX1RPVUNIX01VTFRJVE9VQ0hTQ1JFRU5fVDEwMCAmJgorCSAgICBkYXRhLT50MTAwX2F1eF92ZWN0KSB7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0X2RldiwgQUJTX01UX09SSUVOVEFUSU9OLAorCQkJCSAgICAgMCwgMjU1LCAwLCAwKTsKKwl9CisKKwlpZiAoZGF0YS0+bXVsdGl0b3VjaCA9PSBNWFRfVE9VQ0hfTVVMVElUT1VDSFNDUkVFTl9UMTAwICYmCisJICAgIGRhdGEtPnQxMDBfYXV4X2FtcGwpIHsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXRfZGV2LCBBQlNfTVRfUFJFU1NVUkUsCisJCQkJICAgICAwLCAyNTUsIDAsIDApOworCX0KKworCWlmIChkYXRhLT5tdWx0aXRvdWNoID09IE1YVF9UT1VDSF9NVUxUSVRPVUNIU0NSRUVOX1QxMDAgJiYKKwkgICAgZGF0YS0+dDEwMF9hdXhfdmVjdCkgeworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dF9kZXYsIEFCU19NVF9PUklFTlRBVElPTiwKKwkJCQkgICAgIDAsIDI1NSwgMCwgMCk7CisJfQogCiAJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBkYXRhKTsKIApAQCAtMTc2NSw5ICsyMDYyLDEzIEBACiAJCQlkZXZfd2FybihkZXYsICJFcnJvciAlZCB1cGRhdGluZyBjb25maWdcbiIsIGVycm9yKTsKIAl9CiAKLQllcnJvciA9IG14dF9pbml0aWFsaXplX3Q5X2lucHV0X2RldmljZShkYXRhKTsKLQlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKKwlpZiAoZGF0YS0+bXVsdGl0b3VjaCkgeworCQllcnJvciA9IG14dF9pbml0aWFsaXplX2lucHV0X2RldmljZShkYXRhKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIGVycm9yOworCX0gZWxzZSB7CisJCWRldl93YXJuKGRldiwgIk5vIHRvdWNoIG9iamVjdCBkZXRlY3RlZFxuIik7CisJfQogCiAJZGV2X2luZm8oZGV2LAogCQkgIkZhbWlseTogJXUgVmFyaWFudDogJXUgRmlybXdhcmUgViV1LiV1LiUwMlggT2JqZWN0czogJXVcbiIsCkBAIC0yMDQ0LDE1ICsyMzQ1LDEzIEBACiBzdGF0aWMgdm9pZCBteHRfc3RhcnQoc3RydWN0IG14dF9kYXRhICpkYXRhKQogewogCS8qIFRvdWNoIGVuYWJsZSAqLwotCW14dF93cml0ZV9vYmplY3QoZGF0YSwKLQkJCU1YVF9UT1VDSF9NVUxUSV9UOSwgTVhUX1RPVUNIX0NUUkwsIDB4ODMpOworCW14dF93cml0ZV9vYmplY3QoZGF0YSwgZGF0YS0+bXVsdGl0b3VjaCwgTVhUX1RPVUNIX0NUUkwsIDB4ODMpOwogfQogCiBzdGF0aWMgdm9pZCBteHRfc3RvcChzdHJ1Y3QgbXh0X2RhdGEgKmRhdGEpCiB7CiAJLyogVG91Y2ggZGlzYWJsZSAqLwotCW14dF93cml0ZV9vYmplY3QoZGF0YSwKLQkJCU1YVF9UT1VDSF9NVUxUSV9UOSwgTVhUX1RPVUNIX0NUUkwsIDApOworCW14dF93cml0ZV9vYmplY3QoZGF0YSwgZGF0YS0+bXVsdGl0b3VjaCwgTVhUX1RPVUNIX0NUUkwsIDApOwogfQogCiBzdGF0aWMgaW50IG14dF9pbnB1dF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYmNtX2lwcm9jX3RzYy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9iY21faXByb2NfdHNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU0NjBhNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2JjbV9pcHJvY190c2MuYwpAQCAtMCwwICsxLDUyMiBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE1IEJyb2FkY29tIENvcnBvcmF0aW9uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorKgorKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXlib2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlvLmg+CisKKyNkZWZpbmUgSVBST0NfVFNfTkFNRSAiaXByb2MtdHMiCisKKyNkZWZpbmUgUEVOX0RPV05fU1RBVFVTICAgICAxCisjZGVmaW5lIFBFTl9VUF9TVEFUVVMgICAgICAgMAorCisjZGVmaW5lIFhfTUlOICAgICAgICAgICAgICAgMAorI2RlZmluZSBZX01JTiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWF9NQVggICAgICAgICAgICAgICAweEZGRgorI2RlZmluZSBZX01BWCAgICAgICAgICAgICAgIDB4RkZGCisKKy8qIFZhbHVlIGdpdmVuIGJ5IGNvbnRyb2xsZXIgZm9yIGludmFsaWQgY29vcmRpbmF0ZS4gKi8KKyNkZWZpbmUgSU5WQUxJRF9DT09SRCAgICAgICAweEZGRkZGRkZGCisKKy8qIFJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgUkVHQ1RMMSAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFJFR0NUTDIgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBJTlRFUlJVUFRfVEhSRVMgICAgIDB4MDgKKyNkZWZpbmUgSU5URVJSVVBUX01BU0sgICAgICAweDBjCisKKyNkZWZpbmUgSU5URVJSVVBUX1NUQVRVUyAgICAweDEwCisjZGVmaW5lIENPTlRST0xMRVJfU1RBVFVTICAgMHgxNAorI2RlZmluZSBGSUZPX0RBVEEgICAgICAgICAgIDB4MTgKKyNkZWZpbmUgRklGT19EQVRBX1hfWV9NQVNLICAweEZGRkYKKyNkZWZpbmUgQU5BTE9HX0NPTlRST0wgICAgICAweDFjCisKKyNkZWZpbmUgQVVYX0RBVEEgICAgICAgICAgICAweDIwCisjZGVmaW5lIERFQk9VTkNFX0NOVFJfU1RBVCAgMHgyNAorI2RlZmluZSBTQ0FOX0NOVFJfU1RBVCAgICAgIDB4MjgKKyNkZWZpbmUgUkVNX0NOVFJfU1RBVCAgICAgICAweDJjCisKKyNkZWZpbmUgU0VUVExJTkdfVElNRVJfU1RBVCAweDMwCisjZGVmaW5lIFNQQVJFX1JFRyAgICAgICAgICAgMHgzNAorI2RlZmluZSBTT0ZUX0JZUEFTU19DT05UUk9MIDB4MzgKKyNkZWZpbmUgU09GVF9CWVBBU1NfREFUQSAgICAweDNjCisKKworLyogQml0IHZhbHVlcyBmb3IgSU5URVJSVVBUX01BU0sgYW5kIElOVEVSUlVQVF9TVEFUVVMgcmVncyAqLworI2RlZmluZSBUU19QRU5fSU5UUl9NQVNLICAgICAgICBCSVQoMCkKKyNkZWZpbmUgVFNfRklGT19JTlRSX01BU0sgICAgICAgQklUKDIpCisKKy8qIEJpdCB2YWx1ZXMgZm9yIENPTlRST0xMRVJfU1RBVFVTIHJlZzEgKi8KKyNkZWZpbmUgVFNfUEVOX0RPV04gICAgICAgICAgICAgQklUKDApCisKKy8qIFNoaWZ0IHZhbHVlcyBmb3IgY29udHJvbCByZWcxICovCisjZGVmaW5lIFNDQU5OSU5HX1BFUklPRF9TSElGVCAgIDI0CisjZGVmaW5lIERFQk9VTkNFX1RJTUVPVVRfU0hJRlQgIDE2CisjZGVmaW5lIFNFVFRMSU5HX1RJTUVPVVRfU0hJRlQgIDgKKyNkZWZpbmUgVE9VQ0hfVElNRU9VVF9TSElGVCAgICAgMAorCisvKiBTaGlmdCB2YWx1ZXMgZm9yIGNvb3JkaW5hdGVzIGZyb20gZmlmbyAqLworI2RlZmluZSBYX0NPT1JEX1NISUZUICAwCisjZGVmaW5lIFlfQ09PUkRfU0hJRlQgIDE2CisKKy8qIEJpdCB2YWx1ZXMgZm9yIFJFR0NUTDIgKi8KKyNkZWZpbmUgVFNfQ09OVFJPTExFUl9FTl9CSVQgICAgQklUKDE2KQorI2RlZmluZSBUU19DT05UUk9MTEVSX0FWR0RBVEFfU0hJRlQgOAorI2RlZmluZSBUU19DT05UUk9MTEVSX0FWR0RBVEFfTUFTSyAoMHg3IDw8IFRTX0NPTlRST0xMRVJfQVZHREFUQV9TSElGVCkKKyNkZWZpbmUgVFNfQ09OVFJPTExFUl9QV1JfTERPICAgQklUKDUpCisjZGVmaW5lIFRTX0NPTlRST0xMRVJfUFdSX0FEQyAgIEJJVCg0KQorI2RlZmluZSBUU19DT05UUk9MTEVSX1BXUl9CR1AgICBCSVQoMykKKyNkZWZpbmUgVFNfQ09OVFJPTExFUl9QV1JfVFMgICAgQklUKDIpCisjZGVmaW5lIFRTX1dJUkVfTU9ERV9CSVQgICAgICAgIEJJVCgxKQorCisjZGVmaW5lIGRiZ19yZWcoZGV2LCBwcml2LCByZWcpIFwKKwlkZXZfZGJnKGRldiwgIiUyMHM9IDB4JTA4eFxuIiwgI3JlZywgcmVhZGwoKHByaXYpLT5yZWdzICsgcmVnKSkKKworc3RydWN0IHRzY19wYXJhbSB7CisJLyogRWFjaCBzdGVwIGlzIDEwMjQgdXMuICBWYWxpZCAxLTI1NiAqLworCXUzMiBzY2FubmluZ19wZXJpb2Q7CisKKwkvKiAgRWFjaCBzdGVwIGlzIDUxMiB1cy4gIFZhbGlkIDAtMjU1ICovCisJdTMyIGRlYm91bmNlX3RpbWVvdXQ7CisKKwkvKgorCSAqIFRoZSBzZXR0bGluZyBkdXJhdGlvbiAoaW4gbXMpIGlzIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgdHNjCisJICogd2FpdHMgdG8gYWxsb3cgdGhlIHZvbHRhZ2UgdG8gc2V0dGxlIGFmdGVyIHR1cm5pbmcgb24gdGhlCisJICogZHJpdmVycyBpbiBkZXRlY3Rpb24gbW9kZS4gVmFsaWQgdmFsdWVzOiAwLTExCisJICogICAwID0gIDAuMDA4IG1zCisJICogICAxID0gIDAuMDEgbXMKKwkgKiAgIDIgPSAgMC4wMiBtcworCSAqICAgMyA9ICAwLjA0IG1zCisJICogICA0ID0gIDAuMDggbXMKKwkgKiAgIDUgPSAgMC4xNiBtcworCSAqICAgNiA9ICAwLjMyIG1zCisJICogICA3ID0gIDAuNjQgbXMKKwkgKiAgIDggPSAgMS4yOCBtcworCSAqICAgOSA9ICAyLjU2IG1zCisJICogICAxMCA9IDUuMTIgbXMKKwkgKiAgIDExID0gMTAuMjQgbXMKKwkgKi8KKwl1MzIgc2V0dGxpbmdfdGltZW91dDsKKworCS8qIHRvdWNoIHRpbWVvdXQgaW4gc2FtcGxlIGNvdW50cyAqLworCXUzMiB0b3VjaF90aW1lb3V0OworCisJLyoKKwkgKiBOdW1iZXIgb2YgZGF0YSBzYW1wbGVzIHdoaWNoIGFyZSBhdmVyYWdlZCBiZWZvcmUgYSBmaW5hbCBkYXRhIHBvaW50CisJICogaXMgcGxhY2VkIGludG8gdGhlIEZJRk8KKwkgKi8KKwl1MzIgYXZlcmFnZV9kYXRhOworCisJLyogRklGTyB0aHJlc2hvbGQgKi8KKwl1MzIgZmlmb190aHJlc2hvbGQ7CisKKwkvKiBPcHRpb25hbCBzdGFuZGFyZCB0b3VjaHNjcmVlbiBwcm9wZXJ0aWVzLiAqLworCXUzMiBtYXhfeDsKKwl1MzIgbWF4X3k7CisJdTMyIGZ1enpfeDsKKwl1MzIgZnV6el95OworCWJvb2wgaW52ZXJ0X3g7CisJYm9vbCBpbnZlcnRfeTsKK307CisKK3N0cnVjdCBpcHJvY190c19wcml2IHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CisKKwl2b2lkIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IGNsayAqdHNjX2NsazsKKworCWludCAgcGVuX3N0YXR1czsKKwlzdHJ1Y3QgdHNjX3BhcmFtIGNmZ19wYXJhbXM7Cit9OworCisvKgorICogU2V0IGRlZmF1bHQgdmFsdWVzIHRoZSBzYW1lIGFzIGhhcmR3YXJlIHJlc2V0IHZhbHVlcworICogZXhjZXB0IGZvciBmaWZvX3RocmVzaG9sZCB3aXRoIGlzIHNldCB0byAxLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHRzY19wYXJhbSBpcHJvY19kZWZhdWx0X2NvbmZpZyA9IHsKKwkuc2Nhbm5pbmdfcGVyaW9kICA9IDB4NSwgIC8qIDEgdG8gMjU2ICovCisJLmRlYm91bmNlX3RpbWVvdXQgPSAweDI4LCAvKiAwIHRvIDI1NSAqLworCS5zZXR0bGluZ190aW1lb3V0ID0gMHg3LCAgLyogMCB0byAxMSAqLworCS50b3VjaF90aW1lb3V0ICAgID0gMHhhLCAgLyogMCB0byAyNTUgKi8KKwkuYXZlcmFnZV9kYXRhICAgICA9IDUsICAgIC8qIGVudHJ5IDUgPSAzMiBwdHMgKi8KKwkuZmlmb190aHJlc2hvbGQgICA9IDEsICAgIC8qIDAgdG8gMzEgKi8KKwkubWF4X3ggICAgICAgICAgICA9IFhfTUFYLAorCS5tYXhfeSAgICAgICAgICAgID0gWV9NQVgsCit9OworCitzdGF0aWMgdm9pZCB0c19yZWdfZHVtcChzdHJ1Y3QgaXByb2NfdHNfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+cGRldi0+ZGV2OworCisJZGJnX3JlZyhkZXYsIHByaXYsIFJFR0NUTDEpOworCWRiZ19yZWcoZGV2LCBwcml2LCBSRUdDVEwyKTsKKwlkYmdfcmVnKGRldiwgcHJpdiwgSU5URVJSVVBUX1RIUkVTKTsKKwlkYmdfcmVnKGRldiwgcHJpdiwgSU5URVJSVVBUX01BU0spOworCWRiZ19yZWcoZGV2LCBwcml2LCBJTlRFUlJVUFRfU1RBVFVTKTsKKwlkYmdfcmVnKGRldiwgcHJpdiwgQ09OVFJPTExFUl9TVEFUVVMpOworCWRiZ19yZWcoZGV2LCBwcml2LCBGSUZPX0RBVEEpOworCWRiZ19yZWcoZGV2LCBwcml2LCBBTkFMT0dfQ09OVFJPTCk7CisJZGJnX3JlZyhkZXYsIHByaXYsIEFVWF9EQVRBKTsKKwlkYmdfcmVnKGRldiwgcHJpdiwgREVCT1VOQ0VfQ05UUl9TVEFUKTsKKwlkYmdfcmVnKGRldiwgcHJpdiwgU0NBTl9DTlRSX1NUQVQpOworCWRiZ19yZWcoZGV2LCBwcml2LCBSRU1fQ05UUl9TVEFUKTsKKwlkYmdfcmVnKGRldiwgcHJpdiwgU0VUVExJTkdfVElNRVJfU1RBVCk7CisJZGJnX3JlZyhkZXYsIHByaXYsIFNQQVJFX1JFRyk7CisJZGJnX3JlZyhkZXYsIHByaXYsIFNPRlRfQllQQVNTX0NPTlRST0wpOworCWRiZ19yZWcoZGV2LCBwcml2LCBTT0ZUX0JZUEFTU19EQVRBKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGlwcm9jX3RvdWNoc2NyZWVuX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBkYXRhOworCXN0cnVjdCBpcHJvY190c19wcml2ICpwcml2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdTMyIGludHJfc3RhdHVzOworCXUzMiByYXdfY29vcmRpbmF0ZTsKKwl1MTYgeDsKKwl1MTYgeTsKKwlpbnQgaTsKKwlib29sIG5lZWRzX3N5bmMgPSBmYWxzZTsKKworCWludHJfc3RhdHVzID0gcmVhZGwocHJpdi0+cmVncyArIElOVEVSUlVQVF9TVEFUVVMpOworCWludHJfc3RhdHVzICY9IFRTX1BFTl9JTlRSX01BU0sgfCBUU19GSUZPX0lOVFJfTUFTSzsKKwlpZiAoaW50cl9zdGF0dXMgPT0gMCkKKwkJcmV0dXJuIElSUV9OT05FOworCisJLyogQ2xlYXIgYWxsIGludGVycnVwdCBzdGF0dXMgYml0cywgd3JpdGUtMS1jbGVhciAqLworCXdyaXRlbChpbnRyX3N0YXR1cywgcHJpdi0+cmVncyArIElOVEVSUlVQVF9TVEFUVVMpOworCisJLyogUGVuIHVwL2Rvd24gKi8KKwlpZiAoaW50cl9zdGF0dXMgJiBUU19QRU5fSU5UUl9NQVNLKSB7CisJCWlmIChyZWFkbChwcml2LT5yZWdzICsgQ09OVFJPTExFUl9TVEFUVVMpICYgVFNfUEVOX0RPV04pCisJCQlwcml2LT5wZW5fc3RhdHVzID0gUEVOX0RPV05fU1RBVFVTOworCQllbHNlCisJCQlwcml2LT5wZW5fc3RhdHVzID0gUEVOX1VQX1NUQVRVUzsKKworCQlpbnB1dF9yZXBvcnRfa2V5KHByaXYtPmlkZXYsIEJUTl9UT1VDSCwgcHJpdi0+cGVuX3N0YXR1cyk7CisJCW5lZWRzX3N5bmMgPSB0cnVlOworCisJCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwKKwkJCSJwZW4gdXAtZG93biAoJWQpXG4iLCBwcml2LT5wZW5fc3RhdHVzKTsKKwl9CisKKwkvKiBjb29yZGluYXRlcyBpbiBGSUZPIGV4Y2VlZCB0aGUgdGhlc2hvbGQgKi8KKwlpZiAoaW50cl9zdGF0dXMgJiBUU19GSUZPX0lOVFJfTUFTSykgeworCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+Y2ZnX3BhcmFtcy5maWZvX3RocmVzaG9sZDsgaSsrKSB7CisJCQlyYXdfY29vcmRpbmF0ZSA9IHJlYWRsKHByaXYtPnJlZ3MgKyBGSUZPX0RBVEEpOworCQkJaWYgKHJhd19jb29yZGluYXRlID09IElOVkFMSURfQ09PUkQpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBUaGUgeCBhbmQgeSBjb29yZGluYXRlIGFyZSAxNiBiaXRzIGVhY2gKKwkJCSAqIHdpdGggdGhlIHggaW4gdGhlIGxvd2VyIDE2IGJpdHMgYW5kIHkgaW4gdGhlCisJCQkgKiB1cHBlciAxNiBiaXRzLgorCQkJICovCisJCQl4ID0gKHJhd19jb29yZGluYXRlID4+IFhfQ09PUkRfU0hJRlQpICYKKwkJCQlGSUZPX0RBVEFfWF9ZX01BU0s7CisJCQl5ID0gKHJhd19jb29yZGluYXRlID4+IFlfQ09PUkRfU0hJRlQpICYKKwkJCQlGSUZPX0RBVEFfWF9ZX01BU0s7CisKKwkJCS8qIFdlIG9ubHkgd2FudCB0byByZXRhaW4gdGhlIDEyIG1zYiBvZiB0aGUgMTYgKi8KKwkJCXggPSAoeCA+PiA0KSAmIDB4MEZGRjsKKwkJCXkgPSAoeSA+PiA0KSAmIDB4MEZGRjsKKworCQkJLyogYWRqdXN0IHggeSBhY2NvcmRpbmcgdG8gbGNkIHRzYyBtb3VudCBhbmdsZSAqLworCQkJaWYgKHByaXYtPmNmZ19wYXJhbXMuaW52ZXJ0X3gpCisJCQkJeCA9IHByaXYtPmNmZ19wYXJhbXMubWF4X3ggLSB4OworCisJCQlpZiAocHJpdi0+Y2ZnX3BhcmFtcy5pbnZlcnRfeSkKKwkJCQl5ID0gcHJpdi0+Y2ZnX3BhcmFtcy5tYXhfeSAtIHk7CisKKwkJCWlucHV0X3JlcG9ydF9hYnMocHJpdi0+aWRldiwgQUJTX1gsIHgpOworCQkJaW5wdXRfcmVwb3J0X2Ficyhwcml2LT5pZGV2LCBBQlNfWSwgeSk7CisJCQluZWVkc19zeW5jID0gdHJ1ZTsKKworCQkJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LCAieHkgKDB4JXggMHgleClcbiIsIHgsIHkpOworCQl9CisJfQorCisJaWYgKG5lZWRzX3N5bmMpCisJCWlucHV0X3N5bmMocHJpdi0+aWRldik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgaXByb2NfdHNfc3RhcnQoc3RydWN0IGlucHV0X2RldiAqaWRldikKK3sKKwlzdHJ1Y3QgaXByb2NfdHNfcHJpdiAqcHJpdiA9IGlucHV0X2dldF9kcnZkYXRhKGlkZXYpOworCXUzMiB2YWw7CisJaW50IGVycm9yOworCisJLyogRW5hYmxlIGNsb2NrICovCisJZXJyb3IgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+dHNjX2Nsayk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnByaXYtPnBkZXYtPmRldiwgIiVzIGNsa19wcmVwYXJlX2VuYWJsZSBmYWlsZWQgJWRcbiIsCisJCQlfX2Z1bmNfXywgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyoKKwkgKiBJbnRlcnJ1cHQgaXMgZ2VuZXJhdGVkIHdoZW46CisJICogIEZJRk8gcmVhY2hlcyB0aGUgaW50X3RoIHZhbHVlLCBhbmQgcGVuIGV2ZW50KHVwL2Rvd24pCisJICovCisJdmFsID0gVFNfUEVOX0lOVFJfTUFTSyB8IFRTX0ZJRk9fSU5UUl9NQVNLOworCXdyaXRlbCh2YWwsIHByaXYtPnJlZ3MgKyBJTlRFUlJVUFRfTUFTSyk7CisKKwl3cml0ZWwocHJpdi0+Y2ZnX3BhcmFtcy5maWZvX3RocmVzaG9sZCwgcHJpdi0+cmVncyArIElOVEVSUlVQVF9USFJFUyk7CisKKwkvKiBJbml0aWFsaXplIGNvbnRyb2wgcmVnMSAqLworCXZhbCA9IDA7CisJdmFsIHw9IHByaXYtPmNmZ19wYXJhbXMuc2Nhbm5pbmdfcGVyaW9kIDw8IFNDQU5OSU5HX1BFUklPRF9TSElGVDsKKwl2YWwgfD0gcHJpdi0+Y2ZnX3BhcmFtcy5kZWJvdW5jZV90aW1lb3V0IDw8IERFQk9VTkNFX1RJTUVPVVRfU0hJRlQ7CisJdmFsIHw9IHByaXYtPmNmZ19wYXJhbXMuc2V0dGxpbmdfdGltZW91dCA8PCBTRVRUTElOR19USU1FT1VUX1NISUZUOworCXZhbCB8PSBwcml2LT5jZmdfcGFyYW1zLnRvdWNoX3RpbWVvdXQgPDwgVE9VQ0hfVElNRU9VVF9TSElGVDsKKwl3cml0ZWwodmFsLCBwcml2LT5yZWdzICsgUkVHQ1RMMSk7CisKKwkvKiBUcnkgdG8gY2xlYXIgYWxsIGludGVycnVwdCBzdGF0dXMgKi8KKwl2YWwgPSByZWFkbChwcml2LT5yZWdzICsgSU5URVJSVVBUX1NUQVRVUyk7CisJdmFsIHw9IFRTX0ZJRk9fSU5UUl9NQVNLIHwgVFNfUEVOX0lOVFJfTUFTSzsKKwl3cml0ZWwodmFsLCBwcml2LT5yZWdzICsgSU5URVJSVVBUX1NUQVRVUyk7CisKKwkvKiBJbml0aWFsaXplIGNvbnRyb2wgcmVnMiAqLworCXZhbCA9IHJlYWRsKHByaXYtPnJlZ3MgKyBSRUdDVEwyKTsKKwl2YWwgfD0gVFNfQ09OVFJPTExFUl9FTl9CSVQgfCBUU19XSVJFX01PREVfQklUOworCisJdmFsICY9IH5UU19DT05UUk9MTEVSX0FWR0RBVEFfTUFTSzsKKwl2YWwgfD0gcHJpdi0+Y2ZnX3BhcmFtcy5hdmVyYWdlX2RhdGEgPDwgVFNfQ09OVFJPTExFUl9BVkdEQVRBX1NISUZUOworCisJdmFsICY9IH4oVFNfQ09OVFJPTExFUl9QV1JfTERPIHwJLyogUFdSIHVwIExETyAqLworCQkgICBUU19DT05UUk9MTEVSX1BXUl9BREMgfAkvKiBQV1IgdXAgQURDICovCisJCSAgIFRTX0NPTlRST0xMRVJfUFdSX0JHUCB8CS8qIFBXUiB1cCBCR1AgKi8KKwkJICAgVFNfQ09OVFJPTExFUl9QV1JfVFMpOwkvKiBQV1IgdXAgVFMgKi8KKworCXdyaXRlbCh2YWwsIHByaXYtPnJlZ3MgKyBSRUdDVEwyKTsKKworCXRzX3JlZ19kdW1wKHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwcm9jX3RzX3N0b3Aoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXUzMiB2YWw7CisJc3RydWN0IGlwcm9jX3RzX3ByaXYgKnByaXYgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJd3JpdGVsKDAsIHByaXYtPnJlZ3MgKyBJTlRFUlJVUFRfTUFTSyk7IC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKworCS8qIE9ubHkgcG93ZXIgZG93biB0b3VjaCBzY3JlZW4gY29udHJvbGxlciAqLworCXZhbCA9IHJlYWRsKHByaXYtPnJlZ3MgKyBSRUdDVEwyKTsKKwl2YWwgfD0gVFNfQ09OVFJPTExFUl9QV1JfVFM7CisJd3JpdGVsKHZhbCwgcHJpdi0+cmVncyArIFJFR0NUTDIpOworCisJY2xrX2Rpc2FibGUocHJpdi0+dHNjX2Nsayk7Cit9CisKK3N0YXRpYyBpbnQgaXByb2NfZ2V0X3RzY19jb25maWcoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaXByb2NfdHNfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCXUzMiB2YWw7CisKKwlwcml2LT5jZmdfcGFyYW1zID0gaXByb2NfZGVmYXVsdF9jb25maWc7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gMDsKKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInNjYW5uaW5nX3BlcmlvZCIsICZ2YWwpID49IDApIHsKKwkJaWYgKHZhbCA8IDEgfHwgdmFsID4gMjU2KSB7CisJCQlkZXZfZXJyKGRldiwgInNjYW5uaW5nX3BlcmlvZCAoJXUpIG11c3QgYmUgWzEtMjU2XVxuIiwKKwkJCQl2YWwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcHJpdi0+Y2ZnX3BhcmFtcy5zY2FubmluZ19wZXJpb2QgPSB2YWw7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZGVib3VuY2VfdGltZW91dCIsICZ2YWwpID49IDApIHsKKwkJaWYgKHZhbCA+IDI1NSkgeworCQkJZGV2X2VycihkZXYsICJkZWJvdW5jZV90aW1lb3V0ICgldSkgbXVzdCBiZSBbMC0yNTVdXG4iLAorCQkJCXZhbCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwcml2LT5jZmdfcGFyYW1zLmRlYm91bmNlX3RpbWVvdXQgPSB2YWw7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic2V0dGxpbmdfdGltZW91dCIsICZ2YWwpID49IDApIHsKKwkJaWYgKHZhbCA+IDExKSB7CisJCQlkZXZfZXJyKGRldiwgInNldHRsaW5nX3RpbWVvdXQgKCV1KSBtdXN0IGJlIFswLTExXVxuIiwKKwkJCQl2YWwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcHJpdi0+Y2ZnX3BhcmFtcy5zZXR0bGluZ190aW1lb3V0ID0gdmFsOworCX0KKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRvdWNoX3RpbWVvdXQiLCAmdmFsKSA+PSAwKSB7CisJCWlmICh2YWwgPiAyNTUpIHsKKwkJCWRldl9lcnIoZGV2LCAidG91Y2hfdGltZW91dCAoJXUpIG11c3QgYmUgWzAtMjU1XVxuIiwKKwkJCQl2YWwpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcHJpdi0+Y2ZnX3BhcmFtcy50b3VjaF90aW1lb3V0ID0gdmFsOworCX0KKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImF2ZXJhZ2VfZGF0YSIsICZ2YWwpID49IDApIHsKKwkJaWYgKHZhbCA+IDgpIHsKKwkJCWRldl9lcnIoZGV2LCAiYXZlcmFnZV9kYXRhICgldSkgbXVzdCBiZSBbMC04XVxuIiwgdmFsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXByaXYtPmNmZ19wYXJhbXMuYXZlcmFnZV9kYXRhID0gdmFsOworCX0KKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImZpZm9fdGhyZXNob2xkIiwgJnZhbCkgPj0gMCkgeworCQlpZiAodmFsID4gMzEpIHsKKwkJCWRldl9lcnIoZGV2LCAiZmlmb190aHJlc2hvbGQgKCV1KSkgbXVzdCBiZSBbMC0zMV1cbiIsCisJCQkJdmFsKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXByaXYtPmNmZ19wYXJhbXMuZmlmb190aHJlc2hvbGQgPSB2YWw7CisJfQorCisJLyogUGFyc2Ugb3B0aW9uYWwgcHJvcGVydGllcy4gKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRvdWNoc2NyZWVuLXNpemUteCIsICZwcml2LT5jZmdfcGFyYW1zLm1heF94KTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRvdWNoc2NyZWVuLXNpemUteSIsICZwcml2LT5jZmdfcGFyYW1zLm1heF95KTsKKworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidG91Y2hzY3JlZW4tZnV6ei14IiwKKwkJCSAgICAgJnByaXYtPmNmZ19wYXJhbXMuZnV6el94KTsKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRvdWNoc2NyZWVuLWZ1enoteSIsCisJCQkgICAgICZwcml2LT5jZmdfcGFyYW1zLmZ1enpfeSk7CisKKwlwcml2LT5jZmdfcGFyYW1zLmludmVydF94ID0KKwkJb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAidG91Y2hzY3JlZW4taW52ZXJ0ZWQteCIpOworCXByaXYtPmNmZ19wYXJhbXMuaW52ZXJ0X3kgPQorCQlvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJ0b3VjaHNjcmVlbi1pbnZlcnRlZC15Iik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcHJvY190c19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpcHJvY190c19wcml2ICpwcml2OworCXN0cnVjdCBpbnB1dF9kZXYgKmlkZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGlycTsKKwlpbnQgZXJyb3I7CisKKwlwcml2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiB0b3VjaHNjcmVlbiBjb250cm9sbGVyIG1lbW9yeSBtYXBwZWQgcmVncyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcHJpdi0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIocHJpdi0+cmVncykpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKHByaXYtPnJlZ3MpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gbWFwIEkvTyBtZW1vcnk6ICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwlwcml2LT50c2NfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJ0c2NfY2xrIik7CisJaWYgKElTX0VSUihwcml2LT50c2NfY2xrKSkgeworCQllcnJvciA9IFBUUl9FUlIocHJpdi0+dHNjX2Nsayk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJmYWlsZWQgZ2V0dGluZyBjbG9jayB0c2NfY2xrOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcHJpdi0+cGRldiA9IHBkZXY7CisJZXJyb3IgPSBpcHJvY19nZXRfdHNjX2NvbmZpZygmcGRldi0+ZGV2LCBwcml2KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZ2V0X3RzY19jb25maWcgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJaWRldiA9IGRldm1faW5wdXRfYWxsb2NhdGVfZGV2aWNlKCZwZGV2LT5kZXYpOworCWlmICghaWRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgaW5wdXQgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHJpdi0+aWRldiA9IGlkZXY7CisJcHJpdi0+cGVuX3N0YXR1cyA9IFBFTl9VUF9TVEFUVVM7CisKKwkvKiBTZXQgaW5wdXQgZGV2aWNlIGluZm8gICovCisJaWRldi0+bmFtZSA9IElQUk9DX1RTX05BTUU7CisJaWRldi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CisKKwlpZGV2LT5pZC5idXN0eXBlID0gQlVTX0hPU1Q7CisJaWRldi0+aWQudmVuZG9yID0gU0VSSU9fVU5LTk9XTjsKKwlpZGV2LT5pZC5wcm9kdWN0ID0gMDsKKwlpZGV2LT5pZC52ZXJzaW9uID0gMDsKKworCWlkZXYtPmV2Yml0WzBdID0gQklUX01BU0soRVZfS0VZKSB8IEJJVF9NQVNLKEVWX0FCUyk7CisJX19zZXRfYml0KEJUTl9UT1VDSCwgaWRldi0+a2V5Yml0KTsKKworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlkZXYsIEFCU19YLCBYX01JTiwgcHJpdi0+Y2ZnX3BhcmFtcy5tYXhfeCwKKwkJCSAgICAgcHJpdi0+Y2ZnX3BhcmFtcy5mdXp6X3gsIDApOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlkZXYsIEFCU19ZLCBZX01JTiwgcHJpdi0+Y2ZnX3BhcmFtcy5tYXhfeSwKKwkJCSAgICAgcHJpdi0+Y2ZnX3BhcmFtcy5mdXp6X3ksIDApOworCisJaWRldi0+b3BlbiA9IGlwcm9jX3RzX3N0YXJ0OworCWlkZXYtPmNsb3NlID0gaXByb2NfdHNfc3RvcDsKKworCWlucHV0X3NldF9kcnZkYXRhKGlkZXYsIHByaXYpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCisJLyogZ2V0IGludGVycnVwdCAqLworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGxhdGZvcm1fZ2V0X2lycSBmYWlsZWQ6ICVkXG4iLCBpcnEpOworCQlyZXR1cm4gaXJxOworCX0KKworCWVycm9yID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBpcnEsCisJCQkJIGlwcm9jX3RvdWNoc2NyZWVuX2ludGVycnVwdCwKKwkJCQkgSVJRRl9TSEFSRUQsIElQUk9DX1RTX05BTUUsIHBkZXYpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UocHJpdi0+aWRldik7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgaW5wdXQgZGV2aWNlOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlwcm9jX3RzX29mX21hdGNoW10gPSB7CisJey5jb21wYXRpYmxlID0gImJyY20saXByb2MtdG91Y2hzY3JlZW4iLCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpcHJvY190c19vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlwcm9jX3RzX2RyaXZlciA9IHsKKwkucHJvYmUgPSBpcHJvY190c19wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZQk9IElQUk9DX1RTX05BTUUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihpcHJvY190c19vZl9tYXRjaCksCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaXByb2NfdHNfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUFJPQyBUb3VjaHNjcmVlbiBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJyb2FkY29tIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2NoaXBvbmVfaWNuODMxOC5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jaGlwb25lX2ljbjgzMTguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmU5ZGIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9jaGlwb25lX2ljbjgzMTguYwpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIERyaXZlciBmb3IgQ2hpcE9uZSBpY244MzE4IGkyYyB0b3VjaHNjcmVlbiBjb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFJlZCBIYXQgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogUmVkIEhhdCBhdXRob3JzOgorICogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQvbXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorCisjZGVmaW5lIElDTjgzMThfUkVHX1BPV0VSCQk0CisjZGVmaW5lIElDTjgzMThfUkVHX1RPVUNIREFUQQkJMTYKKworI2RlZmluZSBJQ044MzE4X1BPV0VSX0FDVElWRQkJMAorI2RlZmluZSBJQ044MzE4X1BPV0VSX01PTklUT1IJCTEKKyNkZWZpbmUgSUNOODMxOF9QT1dFUl9ISUJFUk5BVEUJCTIKKworI2RlZmluZSBJQ044MzE4X01BWF9UT1VDSEVTCQk1CisKK3N0cnVjdCBpY244MzE4X3RvdWNoIHsKKwlfX3U4IHNsb3Q7CisJX19iZTE2IHg7CisJX19iZTE2IHk7CisJX191OCBwcmVzc3VyZTsJLyogU2VlbXMgbW9yZSBsaWtlIGZpbmdlciB3aWR0aCB0aGVuIHByZXNzdXJlIHJlYWxseSAqLworCV9fdTggZXZlbnQ7CisvKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDIgYW5kIDMgaXMgdW5jbGVhciAqLworI2RlZmluZSBJQ044MzE4X0VWRU5UX05PX0RBVEEJMSAvKiBObyBmaW5nZXIgc2VlbiB5ZXQgc2luY2Ugd2FrZXVwICovCisjZGVmaW5lIElDTjgzMThfRVZFTlRfVVBEQVRFMQkyIC8qIE5ldyBvciB1cGRhdGVkIGNvb3JkaW5hdGVzICovCisjZGVmaW5lIElDTjgzMThfRVZFTlRfVVBEQVRFMgkzIC8qIE5ldyBvciB1cGRhdGVkIGNvb3JkaW5hdGVzICovCisjZGVmaW5lIElDTjgzMThfRVZFTlRfRU5ECTQgLyogRmluZ2VyIGxpZnRlZCAqLworfSBfX3BhY2tlZDsKKworc3RydWN0IGljbjgzMThfdG91Y2hfZGF0YSB7CisJX191OCBzb2Z0YnV0dG9uOworCV9fdTggdG91Y2hfY291bnQ7CisJc3RydWN0IGljbjgzMThfdG91Y2ggdG91Y2hlc1tJQ044MzE4X01BWF9UT1VDSEVTXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBpY244MzE4X2RhdGEgeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJc3RydWN0IGdwaW9fZGVzYyAqd2FrZV9ncGlvOworCXUzMiBtYXhfeDsKKwl1MzIgbWF4X3k7CisJYm9vbCBpbnZlcnRfeDsKKwlib29sIGludmVydF95OworCWJvb2wgc3dhcF94X3k7Cit9OworCitzdGF0aWMgaW50IGljbjgzMThfcmVhZF90b3VjaF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJICAgc3RydWN0IGljbjgzMThfdG91Y2hfZGF0YSAqdG91Y2hfZGF0YSkKK3sKKwl1OCByZWcgPSBJQ044MzE4X1JFR19UT1VDSERBVEE7CisJc3RydWN0IGkyY19tc2cgbXNnWzJdID0geworCQl7CisJCQkuYWRkciA9IGNsaWVudC0+YWRkciwKKwkJCS5sZW4gPSAxLAorCQkJLmJ1ZiA9ICZyZWcKKwkJfSwKKwkJeworCQkJLmFkZHIgPSBjbGllbnQtPmFkZHIsCisJCQkuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCS5sZW4gPSBzaXplb2Yoc3RydWN0IGljbjgzMThfdG91Y2hfZGF0YSksCisJCQkuYnVmID0gKHU4ICopdG91Y2hfZGF0YQorCQl9CisJfTsKKworCXJldHVybiBpMmNfdHJhbnNmZXIoY2xpZW50LT5hZGFwdGVyLCBtc2csIDIpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaWNuODMxOF90b3VjaF9hY3RpdmUodTggZXZlbnQpCit7CisJcmV0dXJuIChldmVudCA9PSBJQ044MzE4X0VWRU5UX1VQREFURTEpIHx8CisJICAgICAgIChldmVudCA9PSBJQ044MzE4X0VWRU5UX1VQREFURTIpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaWNuODMxOF9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBpY244MzE4X2RhdGEgKmRhdGEgPSBkZXZfaWQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRhdGEtPmNsaWVudC0+ZGV2OworCXN0cnVjdCBpY244MzE4X3RvdWNoX2RhdGEgdG91Y2hfZGF0YTsKKwlpbnQgaSwgcmV0LCB4LCB5OworCisJcmV0ID0gaWNuODMxOF9yZWFkX3RvdWNoX2RhdGEoZGF0YS0+Y2xpZW50LCAmdG91Y2hfZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJFcnJvciByZWFkaW5nIHRvdWNoIGRhdGE6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKHRvdWNoX2RhdGEuc29mdGJ1dHRvbikgeworCQkvKgorCQkgKiBPdGhlciBkYXRhIGlzIGludmFsaWQgd2hlbiBhIHNvZnRidXR0b24gaXMgcHJlc3NlZC4KKwkJICogVGhpcyBuZWVkcyBzb21lIGV4dHJhIGRldmljZXRyZWUgYmluZGluZ3MgdG8gbWFwIHRoZSBpY244MzE4CisJCSAqIHNvZnRidXR0b24gY29kZXMgdG8gZXZkZXYgY29kZXMuIEN1cnJlbnRseSBubyBrbm93biBkZXZpY2VzCisJCSAqIHVzZSB0aGlzLgorCQkgKi8KKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmICh0b3VjaF9kYXRhLnRvdWNoX2NvdW50ID4gSUNOODMxOF9NQVhfVE9VQ0hFUykgeworCQlkZXZfd2FybihkZXYsICJUb28gbXVjaCB0b3VjaGVzICVkID4gJWRcbiIsCisJCQkgdG91Y2hfZGF0YS50b3VjaF9jb3VudCwgSUNOODMxOF9NQVhfVE9VQ0hFUyk7CisJCXRvdWNoX2RhdGEudG91Y2hfY291bnQgPSBJQ044MzE4X01BWF9UT1VDSEVTOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB0b3VjaF9kYXRhLnRvdWNoX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGljbjgzMThfdG91Y2ggKnRvdWNoID0gJnRvdWNoX2RhdGEudG91Y2hlc1tpXTsKKwkJYm9vbCBhY3QgPSBpY244MzE4X3RvdWNoX2FjdGl2ZSh0b3VjaC0+ZXZlbnQpOworCisJCWlucHV0X210X3Nsb3QoZGF0YS0+aW5wdXQsIHRvdWNoLT5zbG90KTsKKwkJaW5wdXRfbXRfcmVwb3J0X3Nsb3Rfc3RhdGUoZGF0YS0+aW5wdXQsIE1UX1RPT0xfRklOR0VSLCBhY3QpOworCQlpZiAoIWFjdCkKKwkJCWNvbnRpbnVlOworCisJCXggPSBiZTE2X3RvX2NwdSh0b3VjaC0+eCk7CisJCXkgPSBiZTE2X3RvX2NwdSh0b3VjaC0+eSk7CisKKwkJaWYgKGRhdGEtPmludmVydF94KQorCQkJeCA9IGRhdGEtPm1heF94IC0geDsKKworCQlpZiAoZGF0YS0+aW52ZXJ0X3kpCisJCQl5ID0gZGF0YS0+bWF4X3kgLSB5OworCisJCWlmICghZGF0YS0+c3dhcF94X3kpIHsKKwkJCWlucHV0X2V2ZW50KGRhdGEtPmlucHV0LCBFVl9BQlMsIEFCU19NVF9QT1NJVElPTl9YLCB4KTsKKwkJCWlucHV0X2V2ZW50KGRhdGEtPmlucHV0LCBFVl9BQlMsIEFCU19NVF9QT1NJVElPTl9ZLCB5KTsKKwkJfSBlbHNlIHsKKwkJCWlucHV0X2V2ZW50KGRhdGEtPmlucHV0LCBFVl9BQlMsIEFCU19NVF9QT1NJVElPTl9YLCB5KTsKKwkJCWlucHV0X2V2ZW50KGRhdGEtPmlucHV0LCBFVl9BQlMsIEFCU19NVF9QT1NJVElPTl9ZLCB4KTsKKwkJfQorCX0KKworCWlucHV0X210X3N5bmNfZnJhbWUoZGF0YS0+aW5wdXQpOworCWlucHV0X3N5bmMoZGF0YS0+aW5wdXQpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IGljbjgzMThfc3RhcnQoc3RydWN0IGlucHV0X2RldiAqZGV2KQoreworCXN0cnVjdCBpY244MzE4X2RhdGEgKmRhdGEgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCisJZW5hYmxlX2lycShkYXRhLT5jbGllbnQtPmlycSk7CisJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPndha2VfZ3BpbywgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaWNuODMxOF9zdG9wKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgaWNuODMxOF9kYXRhICpkYXRhID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKworCWRpc2FibGVfaXJxKGRhdGEtPmNsaWVudC0+aXJxKTsKKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhdGEtPmNsaWVudCwgSUNOODMxOF9SRUdfUE9XRVIsCisJCQkJICBJQ044MzE4X1BPV0VSX0hJQkVSTkFURSk7CisJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKGRhdGEtPndha2VfZ3BpbywgMCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgaWNuODMxOF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaWNuODMxOF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKHRvX2kyY19jbGllbnQoZGV2KSk7CisKKwltdXRleF9sb2NrKCZkYXRhLT5pbnB1dC0+bXV0ZXgpOworCWlmIChkYXRhLT5pbnB1dC0+dXNlcnMpCisJCWljbjgzMThfc3RvcChkYXRhLT5pbnB1dCk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5pbnB1dC0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWNuODMxOF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpY244MzE4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEodG9faTJjX2NsaWVudChkZXYpKTsKKworCW11dGV4X2xvY2soJmRhdGEtPmlucHV0LT5tdXRleCk7CisJaWYgKGRhdGEtPmlucHV0LT51c2VycykKKwkJaWNuODMxOF9zdGFydChkYXRhLT5pbnB1dCk7CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT5pbnB1dC0+bXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKGljbjgzMThfcG1fb3BzLCBpY244MzE4X3N1c3BlbmQsIGljbjgzMThfcmVzdW1lKTsKKworc3RhdGljIGludCBpY244MzE4X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCXN0cnVjdCBpY244MzE4X2RhdGEgKmRhdGE7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJdTMyIGZ1enpfeCA9IDAsIGZ1enpfeSA9IDA7CisJaW50IGVycm9yOworCisJaWYgKCFjbGllbnQtPmlycSkgeworCQlkZXZfZXJyKGRldiwgIkVycm9yIG5vIGlycSBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEtPndha2VfZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0KGRldiwgIndha2UiLCBHUElPRF9PVVRfTE9XKTsKKwlpZiAoSVNfRVJSKGRhdGEtPndha2VfZ3BpbykpIHsKKwkJZXJyb3IgPSBQVFJfRVJSKGRhdGEtPndha2VfZ3Bpbyk7CisJCWlmIChlcnJvciAhPSAtRVBST0JFX0RFRkVSKQorCQkJZGV2X2VycihkZXYsICJFcnJvciBnZXR0aW5nIHdha2UgZ3BpbzogJWRcbiIsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRvdWNoc2NyZWVuLXNpemUteCIsICZkYXRhLT5tYXhfeCkgfHwKKwkgICAgb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0b3VjaHNjcmVlbi1zaXplLXkiLCAmZGF0YS0+bWF4X3kpKSB7CisJCWRldl9lcnIoZGV2LCAiRXJyb3IgdG91Y2hzY3JlZW4tc2l6ZS14IGFuZC9vciAteSBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogT3B0aW9uYWwgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRvdWNoc2NyZWVuLWZ1enoteCIsICZmdXp6X3gpOworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidG91Y2hzY3JlZW4tZnV6ei15IiwgJmZ1enpfeSk7CisJZGF0YS0+aW52ZXJ0X3ggPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJ0b3VjaHNjcmVlbi1pbnZlcnRlZC14Iik7CisJZGF0YS0+aW52ZXJ0X3kgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJ0b3VjaHNjcmVlbi1pbnZlcnRlZC15Iik7CisJZGF0YS0+c3dhcF94X3kgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJ0b3VjaHNjcmVlbi1zd2FwcGVkLXgteSIpOworCisJaW5wdXQgPSBkZXZtX2lucHV0X2FsbG9jYXRlX2RldmljZShkZXYpOworCWlmICghaW5wdXQpCisJCXJldHVybiAtRU5PTUVNOworCisJaW5wdXQtPm5hbWUgPSBjbGllbnQtPm5hbWU7CisJaW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOworCWlucHV0LT5vcGVuID0gaWNuODMxOF9zdGFydDsKKwlpbnB1dC0+Y2xvc2UgPSBpY244MzE4X3N0b3A7CisJaW5wdXQtPmRldi5wYXJlbnQgPSBkZXY7CisKKwlpZiAoIWRhdGEtPnN3YXBfeF95KSB7CisJCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCBBQlNfTVRfUE9TSVRJT05fWCwgMCwKKwkJCQkgICAgIGRhdGEtPm1heF94LCBmdXp6X3gsIDApOworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX01UX1BPU0lUSU9OX1ksIDAsCisJCQkJICAgICBkYXRhLT5tYXhfeSwgZnV6el95LCAwKTsKKwl9IGVsc2UgeworCQlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX01UX1BPU0lUSU9OX1gsIDAsCisJCQkJICAgICBkYXRhLT5tYXhfeSwgZnV6el95LCAwKTsKKwkJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19NVF9QT1NJVElPTl9ZLCAwLAorCQkJCSAgICAgZGF0YS0+bWF4X3gsIGZ1enpfeCwgMCk7CisJfQorCisJZXJyb3IgPSBpbnB1dF9tdF9pbml0X3Nsb3RzKGlucHV0LCBJQ044MzE4X01BWF9UT1VDSEVTLAorCQkJCSAgICBJTlBVVF9NVF9ESVJFQ1QgfCBJTlBVVF9NVF9EUk9QX1VOVVNFRCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlkYXRhLT5jbGllbnQgPSBjbGllbnQ7CisJZGF0YS0+aW5wdXQgPSBpbnB1dDsKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpbnB1dCwgZGF0YSk7CisKKwllcnJvciA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoZGV2LCBjbGllbnQtPmlycSwgTlVMTCwgaWNuODMxOF9pcnEsCisJCQkJCSAgSVJRRl9PTkVTSE9ULCBjbGllbnQtPm5hbWUsIGRhdGEpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKGRldiwgIkVycm9yIHJlcXVlc3RpbmcgaXJxOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogU3RvcCBkZXZpY2UgdGlsbCBvcGVuZWQgKi8KKwlpY244MzE4X3N0b3AoZGF0YS0+aW5wdXQpOworCisJZXJyb3IgPSBpbnB1dF9yZWdpc3Rlcl9kZXZpY2UoaW5wdXQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaWNuODMxOF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiY2hpcG9uZSxpY244MzE4IiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGljbjgzMThfb2ZfbWF0Y2gpOworCisvKiBUaGlzIGlzIHVzZWxlc3MgZm9yIE9GLWVuYWJsZWQgZGV2aWNlcywgYnV0IGl0IGlzIG5lZWRlZCBieSBJMkMgc3Vic3lzdGVtICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgaWNuODMxOF9pMmNfaWRbXSA9IHsKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGljbjgzMThfaTJjX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGljbjgzMThfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkubmFtZQk9ICJjaGlwb25lX2ljbjgzMTgiLAorCQkucG0JPSAmaWNuODMxOF9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IGljbjgzMThfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBpY244MzE4X3Byb2JlLAorCS5pZF90YWJsZSA9IGljbjgzMThfaTJjX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIoaWNuODMxOF9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNoaXBPbmUgaWNuODMxOCBJMkMgVG91Y2hzY3JlZW4gRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lZHQtZnQ1eDA2LmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2VkdC1mdDV4MDYuYwppbmRleCBkNGMyNGZiLi5lNmFlZjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2VkdC1mdDV4MDYuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2VkdC1mdDV4MDYuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQvbXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC90b3VjaHNjcmVlbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L2VkdC1mdDV4MDYuaD4KIAogI2RlZmluZSBNQVhfU1VQUE9SVF9QT0lOVFMJCTUKQEAgLTEwMzQsNyArMTAzNSw2IEBACiAJaW5wdXQtPmlkLmJ1c3R5cGUgPSBCVVNfSTJDOwogCWlucHV0LT5kZXYucGFyZW50ID0gJmNsaWVudC0+ZGV2OwogCi0JX19zZXRfYml0KEVWX1NZTiwgaW5wdXQtPmV2Yml0KTsKIAlfX3NldF9iaXQoRVZfS0VZLCBpbnB1dC0+ZXZiaXQpOwogCV9fc2V0X2JpdChFVl9BQlMsIGlucHV0LT5ldmJpdCk7CiAJX19zZXRfYml0KEJUTl9UT1VDSCwgaW5wdXQtPmtleWJpdCk7CkBAIC0xMDQ0LDYgKzEwNDQsMTAgQEAKIAkJCSAgICAgMCwgdHNkYXRhLT5udW1feCAqIDY0IC0gMSwgMCwgMCk7CiAJaW5wdXRfc2V0X2Fic19wYXJhbXMoaW5wdXQsIEFCU19NVF9QT1NJVElPTl9ZLAogCQkJICAgICAwLCB0c2RhdGEtPm51bV95ICogNjQgLSAxLCAwLCAwKTsKKworCWlmICghcGRhdGEpCisJCXRvdWNoc2NyZWVuX3BhcnNlX29mX3BhcmFtcyhpbnB1dCk7CisKIAllcnJvciA9IGlucHV0X210X2luaXRfc2xvdHMoaW5wdXQsIE1BWF9TVVBQT1JUX1BPSU5UUywgMCk7CiAJaWYgKGVycm9yKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiVW5hYmxlIHRvIGluaXQgTVQgc2xvdHMuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZWxhbnRzX2kyYy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lbGFudHNfaTJjLmMKaW5kZXggOTI2YzU4ZS4uNDNiM2M5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lbGFudHNfaTJjLmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9lbGFudHNfaTJjLmMKQEAgLTk4LDcgKzk4LDYgQEAKICNkZWZpbmUgTUFYX0ZXX1VQREFURV9SRVRSSUVTCTMwCiAKICNkZWZpbmUgRUxBTl9GV19QQUdFU0laRQkxMzIKLSNkZWZpbmUgRUxBTl9GV19GSUxFTkFNRQkiZWxhbnRzX2kyYy5iaW4iCiAKIC8qIGNhbGlicmF0aW9uIHRpbWVvdXQgZGVmaW5pdGlvbiAqLwogI2RlZmluZSBFTEFOX0NBTElfVElNRU9VVF9NU0VDCTEwMDAwCkBAIC02OTcsMTIgKzY5NiwxOSBAQAogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0cy0+Y2xpZW50OwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY2hhciAqZndfbmFtZTsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBFTEFOX0ZXX0ZJTEVOQU1FLCAmY2xpZW50LT5kZXYpOworCWZ3X25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgImVsYW50c19pMmNfJTR4LmJpbiIsIHRzLT5od192ZXJzaW9uKTsKKwlpZiAoIWZ3X25hbWUpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X2luZm8oJmNsaWVudC0+ZGV2LCAicmVxdWVzdGluZyBmdyBuYW1lID0gJXNcbiIsIGZ3X25hbWUpOworCWVycm9yID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X25hbWUsICZjbGllbnQtPmRldik7CisJa2ZyZWUoZndfbmFtZSk7CiAJaWYgKGVycm9yKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3QgZmlybXdhcmUgJXM6ICVkXG4iLAotCQkJRUxBTl9GV19GSUxFTkFNRSwgZXJyb3IpOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IGZpcm13YXJlOiAlZFxuIiwKKwkJCWVycm9yKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9nb29kaXguYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vZ29vZGl4LmMKaW5kZXggY2ExOTY2OC4uM2FmMTY5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9nb29kaXguYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2dvb2RpeC5jCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogc3RydWN0IGdvb2RpeF90c19kYXRhIHsKQEAgLTQ4LDYgKzUwLDcgQEAKICNkZWZpbmUgR09PRElYX1JFR19WRVJTSU9OCQkweDgxNDAKIAogI2RlZmluZSBSRVNPTFVUSU9OX0xPQwkJMQorI2RlZmluZSBNQVhfQ09OVEFDVFNfTE9DCTUKICNkZWZpbmUgVFJJR0dFUl9MT0MJCTYKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgZ29vZGl4X2lycV9mbGFnc1tdID0gewpAQCAtOTksNyArMTAyLDcgQEAKIAl9CiAKIAl0b3VjaF9udW0gPSBkYXRhWzBdICYgMHgwZjsKLQlpZiAodG91Y2hfbnVtID4gR09PRElYX01BWF9DT05UQUNUUykKKwlpZiAodG91Y2hfbnVtID4gdHMtPm1heF90b3VjaF9udW0pCiAJCXJldHVybiAtRVBST1RPOwogCiAJaWYgKHRvdWNoX251bSA+IDEpIHsKQEAgLTE0MSw3ICsxNDQsNyBAQAogICovCiBzdGF0aWMgdm9pZCBnb29kaXhfcHJvY2Vzc19ldmVudHMoc3RydWN0IGdvb2RpeF90c19kYXRhICp0cykKIHsKLQl1OCAgcG9pbnRfZGF0YVsxICsgR09PRElYX0NPTlRBQ1RfU0laRSAqIEdPT0RJWF9NQVhfQ09OVEFDVFNdOworCXU4ICBwb2ludF9kYXRhWzEgKyBHT09ESVhfQ09OVEFDVF9TSVpFICogdHMtPm1heF90b3VjaF9udW1dOwogCWludCB0b3VjaF9udW07CiAJaW50IGk7CiAKQEAgLTIwMiwyMSArMjA1LDIzIEBACiAJCXRzLT5hYnNfeF9tYXggPSBHT09ESVhfTUFYX1dJRFRIOwogCQl0cy0+YWJzX3lfbWF4ID0gR09PRElYX01BWF9IRUlHSFQ7CiAJCXRzLT5pbnRfdHJpZ2dlcl90eXBlID0gR09PRElYX0lOVF9UUklHR0VSOworCQl0cy0+bWF4X3RvdWNoX251bSA9IEdPT0RJWF9NQVhfQ09OVEFDVFM7CiAJCXJldHVybjsKIAl9CiAKIAl0cy0+YWJzX3hfbWF4ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZjb25maWdbUkVTT0xVVElPTl9MT0NdKTsKIAl0cy0+YWJzX3lfbWF4ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZjb25maWdbUkVTT0xVVElPTl9MT0MgKyAyXSk7Ci0JdHMtPmludF90cmlnZ2VyX3R5cGUgPSAoY29uZmlnW1RSSUdHRVJfTE9DXSkgJiAweDAzOwotCWlmICghdHMtPmFic194X21heCB8fCAhdHMtPmFic195X21heCkgeworCXRzLT5pbnRfdHJpZ2dlcl90eXBlID0gY29uZmlnW1RSSUdHRVJfTE9DXSAmIDB4MDM7CisJdHMtPm1heF90b3VjaF9udW0gPSBjb25maWdbTUFYX0NPTlRBQ1RTX0xPQ10gJiAweDBmOworCWlmICghdHMtPmFic194X21heCB8fCAhdHMtPmFic195X21heCB8fCAhdHMtPm1heF90b3VjaF9udW0pIHsKIAkJZGV2X2VycigmdHMtPmNsaWVudC0+ZGV2LAogCQkJIkludmFsaWQgY29uZmlnLCB1c2luZyBkZWZhdWx0c1xuIik7CiAJCXRzLT5hYnNfeF9tYXggPSBHT09ESVhfTUFYX1dJRFRIOwogCQl0cy0+YWJzX3lfbWF4ID0gR09PRElYX01BWF9IRUlHSFQ7CisJCXRzLT5tYXhfdG91Y2hfbnVtID0gR09PRElYX01BWF9DT05UQUNUUzsKIAl9CiB9CiAKLQogLyoqCiAgKiBnb29kaXhfcmVhZF92ZXJzaW9uIC0gUmVhZCBnb29kaXggdG91Y2hzY3JlZW4gdmVyc2lvbgogICoKQEAgLTI5NSw3ICszMDAsNyBAQAogCWlucHV0X3NldF9hYnNfcGFyYW1zKHRzLT5pbnB1dF9kZXYsIEFCU19NVF9XSURUSF9NQUpPUiwgMCwgMjU1LCAwLCAwKTsKIAlpbnB1dF9zZXRfYWJzX3BhcmFtcyh0cy0+aW5wdXRfZGV2LCBBQlNfTVRfVE9VQ0hfTUFKT1IsIDAsIDI1NSwgMCwgMCk7CiAKLQlpbnB1dF9tdF9pbml0X3Nsb3RzKHRzLT5pbnB1dF9kZXYsIEdPT0RJWF9NQVhfQ09OVEFDVFMsCisJaW5wdXRfbXRfaW5pdF9zbG90cyh0cy0+aW5wdXRfZGV2LCB0cy0+bWF4X3RvdWNoX251bSwKIAkJCSAgICBJTlBVVF9NVF9ESVJFQ1QgfCBJTlBVVF9NVF9EUk9QX1VOVVNFRCk7CiAKIAl0cy0+aW5wdXRfZGV2LT5uYW1lID0gIkdvb2RpeCBDYXBhY2l0aXZlIFRvdWNoU2NyZWVuIjsKQEAgLTM3MiwxMSArMzc3LDI3IEBACiAJeyB9CiB9OwogCisjaWZkZWYgQ09ORklHX0FDUEkKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgZ29vZGl4X2FjcGlfbWF0Y2hbXSA9IHsKIAl7ICJHRElYMTAwMSIsIDAgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIGdvb2RpeF9hY3BpX21hdGNoKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBnb29kaXhfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImdvb2RpeCxndDkxMSIgfSwKKwl7IC5jb21wYXRpYmxlID0gImdvb2RpeCxndDkxMTAiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJnb29kaXgsZ3Q5MTIiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJnb29kaXgsZ3Q5MjciIH0sCisJeyAuY29tcGF0aWJsZSA9ICJnb29kaXgsZ3Q5MjcxIiB9LAorCXsgLmNvbXBhdGlibGUgPSAiZ29vZGl4LGd0OTI4IiB9LAorCXsgLmNvbXBhdGlibGUgPSAiZ29vZGl4LGd0OTY3IiB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGdvb2RpeF9vZl9tYXRjaCk7CisjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGdvb2RpeF90c19kcml2ZXIgPSB7CiAJLnByb2JlID0gZ29vZGl4X3RzX3Byb2JlLApAQCAtMzg0LDcgKzQwNSw4IEBACiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAiR29vZGl4LVRTIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5hY3BpX21hdGNoX3RhYmxlID0gZ29vZGl4X2FjcGlfbWF0Y2gsCisJCS5hY3BpX21hdGNoX3RhYmxlID0gQUNQSV9QVFIoZ29vZGl4X2FjcGlfbWF0Y2gpLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoZ29vZGl4X29mX21hdGNoKSwKIAl9LAogfTsKIG1vZHVsZV9pMmNfZHJpdmVyKGdvb2RpeF90c19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9vZl90b3VjaHNjcmVlbi5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9vZl90b3VjaHNjcmVlbi5jCmluZGV4IGY4ZjliODQuLmI4MmI1MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vb2ZfdG91Y2hzY3JlZW4uYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL29mX3RvdWNoc2NyZWVuLmMKQEAgLTExLDggKzExLDQxIEBACiAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQvbXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC90b3VjaHNjcmVlbi5oPgogCitzdGF0aWMgdTMyIG9mX2dldF9vcHRpb25hbF91MzIoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwkJCSAgICAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSkKK3sKKwl1MzIgdmFsID0gMDsKKworCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCBwcm9wZXJ0eSwgJnZhbCk7CisKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCB0b3VjaHNjcmVlbl9zZXRfcGFyYW1zKHN0cnVjdCBpbnB1dF9kZXYgKmRldiwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGF4aXMsCisJCQkJICAgaW50IG1heCwgaW50IGZ1enopCit7CisJc3RydWN0IGlucHV0X2Fic2luZm8gKmFic2luZm87CisKKwlpZiAoIXRlc3RfYml0KGF4aXMsIGRldi0+YWJzYml0KSkgeworCQkvKgorCQkgKiBFbWl0IGEgd2FybmluZyBvbmx5IGlmIHRoZSBheGlzIGlzIG5vdCBhIG11bHRpdG91Y2gKKwkJICogYXhpcywgd2hpY2ggbWlnaHQgbm90IGJlIHNldCBieSB0aGUgZHJpdmVyLgorCQkgKi8KKwkJaWYgKCFpbnB1dF9pc19tdF9heGlzKGF4aXMpKQorCQkJZGV2X3dhcm4oJmRldi0+ZGV2LAorCQkJCSAiRFQgc3BlY2lmaWVzIHBhcmFtZXRlcnMgYnV0IHRoZSBheGlzIGlzIG5vdCBzZXQgdXBcbiIpOworCQlyZXR1cm47CisJfQorCisJYWJzaW5mbyA9ICZkZXYtPmFic2luZm9bYXhpc107CisJYWJzaW5mby0+bWF4aW11bSA9IG1heDsKKwlhYnNpbmZvLT5mdXp6ID0gZnV6ejsKK30KKwogLyoqCiAgKiB0b3VjaHNjcmVlbl9wYXJzZV9vZl9wYXJhbXMgLSBwYXJzZSBjb21tb24gdG91Y2hzY3JlZW4gRFQgcHJvcGVydGllcwogICogQGRldjogZGV2aWNlIHRoYXQgc2hvdWxkIGJlIHBhcnNlZApAQCAtMjQsMjIgKzU3LDMxIEBACiB2b2lkIHRvdWNoc2NyZWVuX3BhcnNlX29mX3BhcmFtcyhzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZTsKLQlzdHJ1Y3QgaW5wdXRfYWJzaW5mbyAqYWJzaW5mbzsKKwl1MzIgbWF4aW11bSwgZnV6ejsKIAogCWlucHV0X2FsbG9jX2Fic2luZm8oZGV2KTsKIAlpZiAoIWRldi0+YWJzaW5mbykKIAkJcmV0dXJuOwogCi0JYWJzaW5mbyA9ICZkZXYtPmFic2luZm9bQUJTX1hdOwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidG91Y2hzY3JlZW4tc2l6ZS14IiwgJmFic2luZm8tPm1heGltdW0pOwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidG91Y2hzY3JlZW4tZnV6ei14IiwgJmFic2luZm8tPmZ1enopOworCW1heGltdW0gPSBvZl9nZXRfb3B0aW9uYWxfdTMyKG5wLCAidG91Y2hzY3JlZW4tc2l6ZS14Iik7CisJZnV6eiA9IG9mX2dldF9vcHRpb25hbF91MzIobnAsICJ0b3VjaHNjcmVlbi1mdXp6LXgiKTsKKwlpZiAobWF4aW11bSB8fCBmdXp6KSB7CisJCXRvdWNoc2NyZWVuX3NldF9wYXJhbXMoZGV2LCBBQlNfWCwgbWF4aW11bSwgZnV6eik7CisJCXRvdWNoc2NyZWVuX3NldF9wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWCwgbWF4aW11bSwgZnV6eik7CisJfQogCi0JYWJzaW5mbyA9ICZkZXYtPmFic2luZm9bQUJTX1ldOwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidG91Y2hzY3JlZW4tc2l6ZS15IiwgJmFic2luZm8tPm1heGltdW0pOwotCW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidG91Y2hzY3JlZW4tZnV6ei15IiwgJmFic2luZm8tPmZ1enopOworCW1heGltdW0gPSBvZl9nZXRfb3B0aW9uYWxfdTMyKG5wLCAidG91Y2hzY3JlZW4tc2l6ZS15Iik7CisJZnV6eiA9IG9mX2dldF9vcHRpb25hbF91MzIobnAsICJ0b3VjaHNjcmVlbi1mdXp6LXkiKTsKKwlpZiAobWF4aW11bSB8fCBmdXp6KSB7CisJCXRvdWNoc2NyZWVuX3NldF9wYXJhbXMoZGV2LCBBQlNfWSwgbWF4aW11bSwgZnV6eik7CisJCXRvdWNoc2NyZWVuX3NldF9wYXJhbXMoZGV2LCBBQlNfTVRfUE9TSVRJT05fWSwgbWF4aW11bSwgZnV6eik7CisJfQogCi0JYWJzaW5mbyA9ICZkZXYtPmFic2luZm9bQUJTX1BSRVNTVVJFXTsKLQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRvdWNoc2NyZWVuLW1heC1wcmVzc3VyZSIsICZhYnNpbmZvLT5tYXhpbXVtKTsKLQlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRvdWNoc2NyZWVuLWZ1enotcHJlc3N1cmUiLCAmYWJzaW5mby0+ZnV6eik7CisJbWF4aW11bSA9IG9mX2dldF9vcHRpb25hbF91MzIobnAsICJ0b3VjaHNjcmVlbi1tYXgtcHJlc3N1cmUiKTsKKwlmdXp6ID0gb2ZfZ2V0X29wdGlvbmFsX3UzMihucCwgInRvdWNoc2NyZWVuLWZ1enotcHJlc3N1cmUiKTsKKwlpZiAobWF4aW11bSB8fCBmdXp6KSB7CisJCXRvdWNoc2NyZWVuX3NldF9wYXJhbXMoZGV2LCBBQlNfUFJFU1NVUkUsIG1heGltdW0sIGZ1enopOworCQl0b3VjaHNjcmVlbl9zZXRfcGFyYW1zKGRldiwgQUJTX01UX1BSRVNTVVJFLCBtYXhpbXVtLCBmdXp6KTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MKHRvdWNoc2NyZWVuX3BhcnNlX29mX3BhcmFtcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3N1bjRpLXRzLmMgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3N1bjRpLXRzLmMKaW5kZXggYjkzYTI4Yi4uYzAxMTY5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9zdW40aS10cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vc3VuNGktdHMuYwpAQCAtMzAsNiArMzAsMTAgQEAKICAqIFRoZXNlIGtpbmRzIG9mIGhldXJpc3RpY3MgYXJlIGp1c3QgYXNraW5nIGZvciB0cm91YmxlIChhbmQgZG9uJ3QgYmVsb25nCiAgKiBpbiB0aGUga2VybmVsKS4gU28gdGhpcyBkcml2ZXIgb2ZmZXJzIHN0cmFpZ2h0IGZvcndhcmQsIHJlbGlhYmxlIHNpbmdsZQogICogdG91Y2ggZnVuY3Rpb25hbGl0eSBvbmx5LgorICoKKyAqIHMuYS4gQTIwIFVzZXIgTWFudWFsICIxLjE1IFRQIiAoRG9jdW1lbnRhdGlvbi9hcm0vc3VueGkvUkVBRE1FKQorICogKGxvb2tzIGxpa2UgdGhlIGRlc2NyaXB0aW9uIGluIHRoZSBBMjAgVXNlciBNYW51YWwgdjEuMyBpcyBiZXR0ZXIKKyAqIHRoYW4gdGhlIG9uZSBpbiB0aGUgQTEwIFVzZXIgTWFudWFsIHYuMS41KQogICovCiAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KQEAgLTE5Myw3ICsxOTcsNyBAQAogCWlmICh0cy0+dGVtcF9kYXRhID09IC0xKQogCQlyZXR1cm4gLUVBR0FJTjsKIAotCSp0ZW1wID0gKHRzLT50ZW1wX2RhdGEgLSB0cy0+dGVtcF9vZmZzZXQpICogdHMtPnRlbXBfc3RlcDsKKwkqdGVtcCA9IHRzLT50ZW1wX2RhdGEgKiB0cy0+dGVtcF9zdGVwIC0gdHMtPnRlbXBfb2Zmc2V0OwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNDYsNiArMjUwLDggQEAKIAlpbnQgZXJyb3I7CiAJdTMyIHJlZzsKIAlib29sIHRzX2F0dGFjaGVkOworCXUzMiB0cF9zZW5zaXRpdmVfYWRqdXN0ID0gMTU7CisJdTMyIGZpbHRlcl90eXBlID0gMTsKIAogCXRzID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBzdW40aV90c19kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0cykKQEAgLTI1NSwyMiArMjYxLDMxIEBACiAJdHMtPmlnbm9yZV9maWZvX2RhdGEgPSB0cnVlOwogCXRzLT50ZW1wX2RhdGEgPSAtMTsKIAlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJhbGx3aW5uZXIsc3VuNmktYTMxLXRzIikpIHsKLQkJLyogQWxsd2lubmVyIFNESyBoYXMgdGVtcGVyYXR1cmUgPSAtMjcxICsgKHZhbHVlIC8gNikgKEMpICovCi0JCXRzLT50ZW1wX29mZnNldCA9IDE2MjY7CisJCS8qIEFsbHdpbm5lciBTREsgaGFzIHRlbXBlcmF0dXJlIChDKSA9ICh2YWx1ZSAvIDYpIC0gMjcxICovCisJCXRzLT50ZW1wX29mZnNldCA9IDI3MTAwMDsKIAkJdHMtPnRlbXBfc3RlcCA9IDE2NzsKKwl9IGVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiYWxsd2lubmVyLHN1bjRpLWExMC10cyIpKSB7CisJCS8qCisJCSAqIFRoZSBBMTAgdGVtcGVyYXR1cmUgc2Vuc29yIGhhcyBxdWl0ZSBhIHdpZGUgc3ByZWFkLCB0aGVzZQorCQkgKiBwYXJhbWV0ZXJzIGFyZSBiYXNlZCBvbiB0aGUgYXZlcmFnaW5nIG9mIHRoZSBjYWxpYnJhdGlvbgorCQkgKiByZXN1bHRzIG9mIDQgY29tcGxldGVseSBkaWZmZXJlbnQgYm9hcmRzLCB3aXRoIGEgc3ByZWFkIG9mCisJCSAqIHRlbXBfc3RlcCBmcm9tIDAuMDk2IC0gMC4xNzAgYW5kIHRlbXBfb2Zmc2V0IGZyb20gMTc2IC0gMzMxLgorCQkgKi8KKwkJdHMtPnRlbXBfb2Zmc2V0ID0gMjU3MDAwOworCQl0cy0+dGVtcF9zdGVwID0gMTMzOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIFRoZSB1c2VyIG1hbnVhbHMgZG8gbm90IGNvbnRhaW4gdGhlIGZvcm11bGEgZm9yIGNhbGN1bGF0aW5nCiAJCSAqIHRoZSB0ZW1wZXJhdHVyZS4gVGhlIGZvcm11bGEgdXNlZCBoZXJlIGlzIGZyb20gdGhlIEFYUDIwOSwKIAkJICogd2hpY2ggaXMgZGVzaWduZWQgYnkgWC1Qb3dlcnMsIGFuIGFmZmlsaWF0ZSBvZiBBbGx3aW5uZXI6CiAJCSAqCi0JCSAqICAgICB0ZW1wZXJhdHVyZSA9IC0xNDQuNyArICh2YWx1ZSAqIDAuMSkKKwkJICogICAgIHRlbXBlcmF0dXJlIChDKSA9ICh2YWx1ZSAqIDAuMSkgLSAxNDQuNwogCQkgKgogCQkgKiBBbGx3aW5uZXIgZG9lcyBub3QgaGF2ZSBhbnkgZG9jdW1lbnRhdGlvbiB3aGF0c29ldmVyIGZvcgogCQkgKiB0aGlzIGhhcmR3YXJlLiBNb3Jlb3ZlciwgaXQgaXMgY2xhaW1lZCB0aGF0IHRoZSBzZW5zb3IKIAkJICogaXMgaW5hY2N1cmF0ZSBhbmQgY2Fubm90IHdvcmsgcHJvcGVybHkuCiAJCSAqLwotCQl0cy0+dGVtcF9vZmZzZXQgPSAxNDQ3OworCQl0cy0+dGVtcF9vZmZzZXQgPSAxNDQ3MDA7CiAJCXRzLT50ZW1wX3N0ZXAgPSAxMDA7CiAJfQogCkBAIC0zMTMsMTQgKzMyOCwyMCBAQAogCSAgICAgICB0cy0+YmFzZSArIFRQX0NUUkwwKTsKIAogCS8qCi0JICogc2Vuc2l0aXZlX2FkanVzdCA9IDE1IDogbWF4LCB3aGljaCBpcyBub3QgYWxsIHRoYXQgc2Vuc2l0aXZlLAorCSAqIHRwX3NlbnNpdGl2ZV9hZGp1c3QgaXMgYW4gb3B0aW9uYWwgcHJvcGVydHkKIAkgKiB0cF9tb2RlID0gMCA6IG9ubHkgeCBhbmQgeSBjb29yZGluYXRlcywgYXMgd2UgZG9uJ3QgdXNlIGR1YWwgdG91Y2gKIAkgKi8KLQl3cml0ZWwoVFBfU0VOU0lUSVZFX0FESlVTVCgxNSkgfCBUUF9NT0RFX1NFTEVDVCgwKSwKKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImFsbHdpbm5lcix0cC1zZW5zaXRpdmUtYWRqdXN0IiwKKwkJCSAgICAgJnRwX3NlbnNpdGl2ZV9hZGp1c3QpOworCXdyaXRlbChUUF9TRU5TSVRJVkVfQURKVVNUKHRwX3NlbnNpdGl2ZV9hZGp1c3QpIHwgVFBfTU9ERV9TRUxFQ1QoMCksCiAJICAgICAgIHRzLT5iYXNlICsgVFBfQ1RSTDIpOwogCi0JLyogRW5hYmxlIG1lZGlhbiBmaWx0ZXIsIHR5cGUgMSA6IDUvMyAqLwotCXdyaXRlbChGSUxURVJfRU4oMSkgfCBGSUxURVJfVFlQRSgxKSwgdHMtPmJhc2UgKyBUUF9DVFJMMyk7CisJLyoKKwkgKiBFbmFibGUgbWVkaWFuIGFuZCBhdmVyYWdpbmcgZmlsdGVyLCBvcHRpb25hbCBwcm9wZXJ0eSBmb3IKKwkgKiBmaWx0ZXIgdHlwZS4KKwkgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImFsbHdpbm5lcixmaWx0ZXItdHlwZSIsICZmaWx0ZXJfdHlwZSk7CisJd3JpdGVsKEZJTFRFUl9FTigxKSB8IEZJTFRFUl9UWVBFKGZpbHRlcl90eXBlKSwgdHMtPmJhc2UgKyBUUF9DVFJMMyk7CiAKIAkvKiBFbmFibGUgdGVtcGVyYXR1cmUgbWVhc3VyZW1lbnQsIHBlcmlvZCAxOTUzICgyIHNlY29uZHMpICovCiAJd3JpdGVsKFRFTVBfRU5BQkxFKDEpIHwgVEVNUF9QRVJJT0QoMTk1MyksIHRzLT5iYXNlICsgVFBfVFBSKTsKQEAgLTMzMCwxMCArMzUxLDEwIEBACiAJICogZmluYWxseSBlbmFibGUgdHAgbW9kZS4KIAkgKi8KIAlyZWcgPSBTVFlMVVNfVVBfREVCT1VOKDUpIHwgU1RZTFVTX1VQX0RFQk9VTl9FTigxKTsKLQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJhbGx3aW5uZXIsc3VuNGktYTEwLXRzIikpCi0JCXJlZyB8PSBUUF9NT0RFX0VOKDEpOwotCWVsc2UKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJhbGx3aW5uZXIsc3VuNmktYTMxLXRzIikpCiAJCXJlZyB8PSBTVU42SV9UUF9NT0RFX0VOKDEpOworCWVsc2UKKwkJcmVnIHw9IFRQX01PREVfRU4oMSk7CiAJd3JpdGVsKHJlZywgdHMtPmJhc2UgKyBUUF9DVFJMMSk7CiAKIAkvKgpAQCAtMzgzLDYgKzQwNCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjRpX3RzX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNGktYTEwLXRzIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW41aS1hMTMtdHMiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjZpLWEzMS10cyIsIH0sCiAJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9zeDg2NTQuYyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vc3g4NjU0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjYjlhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vc3g4NjU0LmMKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBEcml2ZXIgZm9yIFNlbXRlY2ggU1g4NjU0IEkyQyB0b3VjaHNjcmVlbiBjb250cm9sbGVyLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBBcm1hZGV1cyBTeXN0ZW1zCisgKglTw6liYXN0aWVuIFN6eW1hbnNraSA8c2ViYXN0aWVuLnN6eW1hbnNraUBhcm1hZGV1cy5jb20+CisgKgorICogVXNpbmcgY29kZSBmcm9tOgorICogIC0gc3g4NjV4LmMKKyAqCUNvcHlyaWdodCAoYykgMjAxMyBVLU1vQm8gU3JsCisgKglQaWVybHVpZ2kgUGFzc2FybyA8cC5wYXNzYXJvQHUtbW9iby5jb20+CisgKiAgLSBzeDg2NTAuYworICogICAgICBDb3B5cmlnaHQgKGMpIDIwMDkgV2F5bmUgUm9iZXJ0cworICogIC0gdHNjMjAwNy5jCisgKiAgICAgIENvcHlyaWdodCAoYykgMjAwOCBLd2FuZ3dvbyBMZWUKKyAqICAtIGFkczc4NDYuYworICogICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgRGF2aWQgQnJvd25lbGwKKyAqICAgICAgQ29weXJpZ2h0IChjKSAyMDA2IE5va2lhIENvcnBvcmF0aW9uCisgKiAgLSBjb3JnaV90cy5jCisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFJpY2hhcmQgUHVyZGllCisgKiAgLSBvbWFwX3RzLltoY10sIGFkczc4NDYuaCwgdHNfb3NrLmMKKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDAyIE1vbnRhVmlzdGEgU29mdHdhcmUKKyAqICAgICAgQ29weXJpZ2h0IChDKSAyMDA0IFRleGFzIEluc3RydW1lbnRzCisgKiAgICAgIENvcHlyaWdodCAoQykgMjAwNSBEaXJrIEJlaG1lCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCisvKiByZWdpc3RlciBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgSTJDX1JFR19UT1VDSDAJCQkweDAwCisjZGVmaW5lIEkyQ19SRUdfVE9VQ0gxCQkJMHgwMQorI2RlZmluZSBJMkNfUkVHX0NIQU5NQVNLCQkweDA0CisjZGVmaW5lIEkyQ19SRUdfSVJRTUFTSwkJCTB4MjIKKyNkZWZpbmUgSTJDX1JFR19JUlFTUkMJCQkweDIzCisjZGVmaW5lIEkyQ19SRUdfU09GVFJFU0VUCQkweDNmCisKKy8qIGNvbW1hbmRzICovCisjZGVmaW5lIENNRF9SRUFEX1JFR0lTVEVSCQkweDQwCisjZGVmaW5lIENNRF9NQU5VQUwJCQkweGMwCisjZGVmaW5lIENNRF9QRU5UUkcJCQkweGUwCisKKy8qIHZhbHVlIGZvciBJMkNfUkVHX1NPRlRSRVNFVCAqLworI2RlZmluZSBTT0ZUUkVTRVRfVkFMVUUJCQkweGRlCisKKy8qIGJpdHMgZm9yIEkyQ19SRUdfSVJRU1JDICovCisjZGVmaW5lIElSUV9QRU5UT1VDSF9UT1VDSENPTlZET05FCTB4MDgKKyNkZWZpbmUgSVJRX1BFTlJFTEVBU0UJCQkweDA0CisKKy8qIGJpdHMgZm9yIFJlZ1RvdWNoMSAqLworI2RlZmluZSBDT05ESVJRCQkJCTB4MjAKKyNkZWZpbmUgRklMVF83U0EJCQkweDAzCisKKy8qIGJpdHMgZm9yIEkyQ19SRUdfQ0hBTk1BU0sgKi8KKyNkZWZpbmUgQ09OVl9YCQkJCTB4ODAKKyNkZWZpbmUgQ09OVl9ZCQkJCTB4NDAKKworLyogY29vcmRpbmF0ZXMgcmF0ZTogaGlnaGVyIG5pYmJsZSBvZiBDVFJMMCByZWdpc3RlciAqLworI2RlZmluZSBSQVRFX01BTlVBTAkJCTB4MDAKKyNkZWZpbmUgUkFURV81MDAwQ1BTCQkJMHhmMAorCisvKiBwb3dlciBkZWxheTogbG93ZXIgbmliYmxlIG9mIENUUkwwIHJlZ2lzdGVyICovCisjZGVmaW5lIFBPV0RMWV8xXzFNUwkJCTB4MGIKKworI2RlZmluZSBNQVhfMTJCSVQJCQkoKDEgPDwgMTIpIC0gMSkKKworc3RydWN0IHN4ODY1NCB7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzeDg2NTRfaXJxKGludCBpcnEsIHZvaWQgKmhhbmRsZSkKK3sKKwlzdHJ1Y3Qgc3g4NjU0ICpzeDg2NTQgPSBoYW5kbGU7CisJaW50IGlycXNyYzsKKwl1OCBkYXRhWzRdOworCXVuc2lnbmVkIGludCB4LCB5OworCWludCByZXR2YWw7CisKKwlpcnFzcmMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoc3g4NjU0LT5jbGllbnQsCisJCQkJCSAgQ01EX1JFQURfUkVHSVNURVIgfCBJMkNfUkVHX0lSUVNSQyk7CisJZGV2X2RiZygmc3g4NjU0LT5jbGllbnQtPmRldiwgImlycXNyYyA9IDB4JXgiLCBpcnFzcmMpOworCisJaWYgKGlycXNyYyA8IDApCisJCWdvdG8gb3V0OworCisJaWYgKGlycXNyYyAmIElSUV9QRU5SRUxFQVNFKSB7CisJCWRldl9kYmcoJnN4ODY1NC0+Y2xpZW50LT5kZXYsICJwZW4gcmVsZWFzZSBpbnRlcnJ1cHQiKTsKKworCQlpbnB1dF9yZXBvcnRfa2V5KHN4ODY1NC0+aW5wdXQsIEJUTl9UT1VDSCwgMCk7CisJCWlucHV0X3N5bmMoc3g4NjU0LT5pbnB1dCk7CisJfQorCisJaWYgKGlycXNyYyAmIElSUV9QRU5UT1VDSF9UT1VDSENPTlZET05FKSB7CisJCWRldl9kYmcoJnN4ODY1NC0+Y2xpZW50LT5kZXYsICJwZW4gdG91Y2ggaW50ZXJydXB0Iik7CisKKwkJcmV0dmFsID0gaTJjX21hc3Rlcl9yZWN2KHN4ODY1NC0+Y2xpZW50LCBkYXRhLCBzaXplb2YoZGF0YSkpOworCQlpZiAocmV0dmFsICE9IHNpemVvZihkYXRhKSkKKwkJCWdvdG8gb3V0OworCisJCS8qIGludmFsaWQgZGF0YSAqLworCQlpZiAodW5saWtlbHkoZGF0YVswXSAmIDB4ODAgfHwgZGF0YVsyXSAmIDB4ODApKQorCQkJZ290byBvdXQ7CisKKwkJeCA9ICgoZGF0YVswXSAmIDB4ZikgPDwgOCkgfCAoZGF0YVsxXSk7CisJCXkgPSAoKGRhdGFbMl0gJiAweGYpIDw8IDgpIHwgKGRhdGFbM10pOworCisJCWlucHV0X3JlcG9ydF9hYnMoc3g4NjU0LT5pbnB1dCwgQUJTX1gsIHgpOworCQlpbnB1dF9yZXBvcnRfYWJzKHN4ODY1NC0+aW5wdXQsIEFCU19ZLCB5KTsKKwkJaW5wdXRfcmVwb3J0X2tleShzeDg2NTQtPmlucHV0LCBCVE5fVE9VQ0gsIDEpOworCQlpbnB1dF9zeW5jKHN4ODY1NC0+aW5wdXQpOworCisJCWRldl9kYmcoJnN4ODY1NC0+Y2xpZW50LT5kZXYsICJwb2ludCglNGQsJTRkKVxuIiwgeCwgeSk7CisJfQorCitvdXQ6CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHN4ODY1NF9vcGVuKHN0cnVjdCBpbnB1dF9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc3g4NjU0ICpzeDg2NTQgPSBpbnB1dF9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBzeDg2NTQtPmNsaWVudDsKKwlpbnQgZXJyb3I7CisKKwkvKiBlbmFibGUgcGVuIHRyaWdnZXIgbW9kZSAqLworCWVycm9yID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEkyQ19SRUdfVE9VQ0gwLAorCQkJCQkgIFJBVEVfNTAwMENQUyB8IFBPV0RMWV8xXzFNUyk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAid3JpdGluZyB0byBJMkNfUkVHX1RPVUNIMCBmYWlsZWQiKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWVycm9yID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCBDTURfUEVOVFJHKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ3cml0aW5nIGNvbW1hbmQgQ01EX1BFTlRSRyBmYWlsZWQiKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWVuYWJsZV9pcnEoY2xpZW50LT5pcnEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN4ODY1NF9jbG9zZShzdHJ1Y3QgaW5wdXRfZGV2ICpkZXYpCit7CisJc3RydWN0IHN4ODY1NCAqc3g4NjU0ID0gaW5wdXRfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gc3g4NjU0LT5jbGllbnQ7CisJaW50IGVycm9yOworCisJZGlzYWJsZV9pcnEoY2xpZW50LT5pcnEpOworCisJLyogZW5hYmxlIG1hbnVhbCBtb2RlIG1vZGUgKi8KKwllcnJvciA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGNsaWVudCwgQ01EX01BTlVBTCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAid3JpdGluZyBjb21tYW5kIENNRF9NQU5VQUwgZmFpbGVkIik7CisJCXJldHVybjsKKwl9CisKKwllcnJvciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBJMkNfUkVHX1RPVUNIMCwgMCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAid3JpdGluZyB0byBJMkNfUkVHX1RPVUNIMCBmYWlsZWQiKTsKKwkJcmV0dXJuOworCX0KK30KKworc3RhdGljIGludCBzeDg2NTRfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3Qgc3g4NjU0ICpzeDg2NTQ7CisJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7CisJaW50IGVycm9yOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShjbGllbnQtPmFkYXB0ZXIsCisJCQkJICAgICBJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQSkpCisJCXJldHVybiAtRU5YSU87CisKKwlzeDg2NTQgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKnN4ODY1NCksIEdGUF9LRVJORUwpOworCWlmICghc3g4NjU0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlucHV0ID0gZGV2bV9pbnB1dF9hbGxvY2F0ZV9kZXZpY2UoJmNsaWVudC0+ZGV2KTsKKwlpZiAoIXN4ODY1NCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbnB1dC0+bmFtZSA9ICJTWDg2NTQgSTJDIFRvdWNoc2NyZWVuIjsKKwlpbnB1dC0+aWQuYnVzdHlwZSA9IEJVU19JMkM7CisJaW5wdXQtPmRldi5wYXJlbnQgPSAmY2xpZW50LT5kZXY7CisJaW5wdXQtPm9wZW4gPSBzeDg2NTRfb3BlbjsKKwlpbnB1dC0+Y2xvc2UgPSBzeDg2NTRfY2xvc2U7CisKKwlfX3NldF9iaXQoSU5QVVRfUFJPUF9ESVJFQ1QsIGlucHV0LT5wcm9wYml0KTsKKwlpbnB1dF9zZXRfY2FwYWJpbGl0eShpbnB1dCwgRVZfS0VZLCBCVE5fVE9VQ0gpOworCWlucHV0X3NldF9hYnNfcGFyYW1zKGlucHV0LCBBQlNfWCwgMCwgTUFYXzEyQklULCAwLCAwKTsKKwlpbnB1dF9zZXRfYWJzX3BhcmFtcyhpbnB1dCwgQUJTX1ksIDAsIE1BWF8xMkJJVCwgMCwgMCk7CisKKwlzeDg2NTQtPmNsaWVudCA9IGNsaWVudDsKKwlzeDg2NTQtPmlucHV0ID0gaW5wdXQ7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YShzeDg2NTQtPmlucHV0LCBzeDg2NTQpOworCisJZXJyb3IgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgSTJDX1JFR19TT0ZUUkVTRVQsCisJCQkJCSAgU09GVFJFU0VUX1ZBTFVFKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ3cml0aW5nIHNvZnRyZXNldCB2YWx1ZSBmYWlsZWQiKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWVycm9yID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEkyQ19SRUdfQ0hBTk1BU0ssCisJCQkJCSAgQ09OVl9YIHwgQ09OVl9ZKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ3cml0aW5nIHRvIEkyQ19SRUdfQ0hBTk1BU0sgZmFpbGVkIik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBJMkNfUkVHX0lSUU1BU0ssCisJCQkJCSAgSVJRX1BFTlRPVUNIX1RPVUNIQ09OVkRPTkUgfAorCQkJCQkJSVJRX1BFTlJFTEVBU0UpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIndyaXRpbmcgdG8gSTJDX1JFR19JUlFNQVNLIGZhaWxlZCIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgSTJDX1JFR19UT1VDSDEsCisJCQkJCSAgQ09ORElSUSB8IEZJTFRfN1NBKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJ3cml0aW5nIHRvIEkyQ19SRUdfVE9VQ0gxIGZhaWxlZCIpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJZXJyb3IgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZjbGllbnQtPmRldiwgY2xpZW50LT5pcnEsCisJCQkJCSAgTlVMTCwgc3g4NjU0X2lycSwKKwkJCQkJICBJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfT05FU0hPVCwKKwkJCQkJICBjbGllbnQtPm5hbWUsIHN4ODY1NCk7CisJaWYgKGVycm9yKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJIkZhaWxlZCB0byBlbmFibGUgSVJRICVkLCBlcnJvcjogJWRcbiIsCisJCQljbGllbnQtPmlycSwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJLyogRGlzYWJsZSB0aGUgSVJRLCB3ZSdsbCBlbmFibGUgaXQgaW4gc3g4NjU0X29wZW4oKSAqLworCWRpc2FibGVfaXJxKGNsaWVudC0+aXJxKTsKKworCWVycm9yID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHN4ODY1NC0+aW5wdXQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgc3g4NjU0KTsKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3g4NjU0X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzZW10ZWNoLHN4ODY1NCIsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN4ODY1NF9vZl9tYXRjaCk7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHN4ODY1NF9pZF90YWJsZVtdID0geworCXsgInNlbXRlY2hfc3g4NjU0IiwgMCB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgc3g4NjU0X2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHN4ODY1NF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic3g4NjU0IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHN4ODY1NF9vZl9tYXRjaCksCisJfSwKKwkuaWRfdGFibGUgPSBzeDg2NTRfaWRfdGFibGUsCisJLnByb2JlID0gc3g4NjU0X3Byb2JlLAorfTsKK21vZHVsZV9pMmNfZHJpdmVyKHN4ODY1NF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJTw6liYXN0aWVuIFN6eW1hbnNraSA8c2ViYXN0aWVuLnN6eW1hbnNraUBhcm1hZGV1cy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNlbXRlY2ggU1g4NjU0IEkyQyBUb3VjaHNjcmVlbiBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdHNjMjAwNy5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90c2MyMDA3LmMKaW5kZXggMWJmOTkwNi4uY2NjOGFhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90c2MyMDA3LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi90c2MyMDA3LmMKQEAgLTc1LDcgKzc1LDcgQEAKIAl1MTYJCQltb2RlbDsKIAl1MTYJCQl4X3BsYXRlX29obXM7CiAJdTE2CQkJbWF4X3J0OwotCXVuc2lnbmVkIGxvbmcJCXBvbGxfcGVyaW9kOworCXVuc2lnbmVkIGxvbmcJCXBvbGxfcGVyaW9kOyAvKiBpbiBqaWZmaWVzICovCiAJaW50CQkJZnV6eng7CiAJaW50CQkJZnV6enk7CiAJaW50CQkJZnV6eno7CkBAIC0yMTQsOCArMjE0LDcgQEAKIAkJCWRldl9kYmcoJnRzLT5jbGllbnQtPmRldiwgImlnbm9yZWQgcHJlc3N1cmUgJWRcbiIsIHJ0KTsKIAkJfQogCi0JCXdhaXRfZXZlbnRfdGltZW91dCh0cy0+d2FpdCwgdHMtPnN0b3BwZWQsCi0JCQkJICAgbXNlY3NfdG9famlmZmllcyh0cy0+cG9sbF9wZXJpb2QpKTsKKwkJd2FpdF9ldmVudF90aW1lb3V0KHRzLT53YWl0LCB0cy0+c3RvcHBlZCwgdHMtPnBvbGxfcGVyaW9kKTsKIAl9CiAKIAlkZXZfZGJnKCZ0cy0+Y2xpZW50LT5kZXYsICJVUFxuIik7CkBAIC0zMTQsOSArMzEzLDkgQEAKIAkJdHMtPmZ1enp6ID0gdmFsMzI7CiAKIAlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTY0KG5wLCAidGkscG9sbC1wZXJpb2QiLCAmdmFsNjQpKQotCQl0cy0+cG9sbF9wZXJpb2QgPSB2YWw2NDsKKwkJdHMtPnBvbGxfcGVyaW9kID0gbXNlY3NfdG9famlmZmllcyh2YWw2NCk7CiAJZWxzZQotCQl0cy0+cG9sbF9wZXJpb2QgPSAxOworCQl0cy0+cG9sbF9wZXJpb2QgPSBtc2Vjc190b19qaWZmaWVzKDEpOwogCiAJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRpLHgtcGxhdGUtb2htcyIsICZ2YWwzMikpIHsKIAkJdHMtPnhfcGxhdGVfb2htcyA9IHZhbDMyOwpAQCAtMzUwLDcgKzM0OSw3IEBACiAJdHMtPm1vZGVsICAgICAgICAgICAgID0gcGRhdGEtPm1vZGVsOwogCXRzLT54X3BsYXRlX29obXMgICAgICA9IHBkYXRhLT54X3BsYXRlX29obXM7CiAJdHMtPm1heF9ydCAgICAgICAgICAgID0gcGRhdGEtPm1heF9ydCA/IDogTUFYXzEyQklUOwotCXRzLT5wb2xsX3BlcmlvZCAgICAgICA9IHBkYXRhLT5wb2xsX3BlcmlvZCA/IDogMTsKKwl0cy0+cG9sbF9wZXJpb2QgICAgICAgPSBtc2Vjc190b19qaWZmaWVzKHBkYXRhLT5wb2xsX3BlcmlvZCA/IDogMSk7CiAJdHMtPmdldF9wZW5kb3duX3N0YXRlID0gcGRhdGEtPmdldF9wZW5kb3duX3N0YXRlOwogCXRzLT5jbGVhcl9wZW5pcnEgICAgICA9IHBkYXRhLT5jbGVhcl9wZW5pcnE7CiAJdHMtPmZ1enp4ICAgICAgICAgICAgID0gcGRhdGEtPmZ1enp4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91c2J0b3VjaHNjcmVlbi5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi91c2J0b3VjaHNjcmVlbi5jCmluZGV4IGEwOTY2MzMuLmYyYzZjMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vdXNidG91Y2hzY3JlZW4uYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL3VzYnRvdWNoc2NyZWVuLmMKQEAgLTEzMiw2ICsxMzIsNyBAQAogCURFVlRZUEVfR1VOWkUsCiAJREVWVFlQRV9ETUNfVFNDMTAsCiAJREVWVFlQRV9JUlRPVUNILAorCURFVlRZUEVfSVJUT1VDSF9ISVJFUywKIAlERVZUWVBFX0lERUFMVEVLLAogCURFVlRZUEVfR0VORVJBTF9UT1VDSCwKIAlERVZUWVBFX0dPVE9QLApAQCAtMTk4LDYgKzE5OSw3IEBACiAjaWZkZWYgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9JUlRPVUNICiAJe1VTQl9ERVZJQ0UoMHg1OTVhLCAweDAwMDEpLCAuZHJpdmVyX2luZm8gPSBERVZUWVBFX0lSVE9VQ0h9LAogCXtVU0JfREVWSUNFKDB4NjYxNSwgMHgwMDAxKSwgLmRyaXZlcl9pbmZvID0gREVWVFlQRV9JUlRPVUNIfSwKKwl7VVNCX0RFVklDRSgweDY2MTUsIDB4MDAxMiksIC5kcml2ZXJfaW5mbyA9IERFVlRZUEVfSVJUT1VDSF9ISVJFU30sCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19UT1VDSFNDUkVFTl9VU0JfSURFQUxURUsKQEAgLTExNzcsNiArMTE3OSwxNSBAQAogCQkucmVwdF9zaXplCT0gOCwKIAkJLnJlYWRfZGF0YQk9IGlydG91Y2hfcmVhZF9kYXRhLAogCX0sCisKKwlbREVWVFlQRV9JUlRPVUNIX0hJUkVTXSA9IHsKKwkJLm1pbl94YwkJPSAweDAsCisJCS5tYXhfeGMJCT0gMHg3ZmZmLAorCQkubWluX3ljCQk9IDB4MCwKKwkJLm1heF95YwkJPSAweDdmZmYsCisJCS5yZXB0X3NpemUJPSA4LAorCQkucmVhZF9kYXRhCT0gaXJ0b3VjaF9yZWFkX2RhdGEsCisJfSwKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1RPVUNIU0NSRUVOX1VTQl9JREVBTFRFSwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9hcm0tc21tdS5jIGIvZHJpdmVycy9pb21tdS9hcm0tc21tdS5jCmluZGV4IGZjMTNkZDUuLmEzYWRkZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvYXJtLXNtbXUuYworKysgYi9kcml2ZXJzL2lvbW11L2FybS1zbW11LmMKQEAgLTEyODgsMTAgKzEyODgsMTMgQEAKIAkJcmV0dXJuIDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmc21tdV9kb21haW4tPnBndGJsX2xvY2ssIGZsYWdzKTsKLQlpZiAoc21tdV9kb21haW4tPnNtbXUtPmZlYXR1cmVzICYgQVJNX1NNTVVfRkVBVF9UUkFOU19PUFMpCisJaWYgKHNtbXVfZG9tYWluLT5zbW11LT5mZWF0dXJlcyAmIEFSTV9TTU1VX0ZFQVRfVFJBTlNfT1BTICYmCisJCQlzbW11X2RvbWFpbi0+c3RhZ2UgPT0gQVJNX1NNTVVfRE9NQUlOX1MxKSB7CiAJCXJldCA9IGFybV9zbW11X2lvdmFfdG9fcGh5c19oYXJkKGRvbWFpbiwgaW92YSk7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCXJldCA9IG9wcy0+aW92YV90b19waHlzKG9wcywgaW92YSk7CisJfQorCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc21tdV9kb21haW4tPnBndGJsX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CkBAIC0xNTU2LDcgKzE1NTksNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoc21tdS0+dmVyc2lvbiA9PSAxIHx8ICghKGlkICYgSUQwX0FUT1NOUykgJiYgKGlkICYgSUQwX1MxVFMpKSkgeworCWlmICgoaWQgJiBJRDBfUzFUUykgJiYgKChzbW11LT52ZXJzaW9uID09IDEpIHx8IChpZCAmIElEMF9BVE9TTlMpKSkgewogCQlzbW11LT5mZWF0dXJlcyB8PSBBUk1fU01NVV9GRUFUX1RSQU5TX09QUzsKIAkJZGV2X25vdGljZShzbW11LT5kZXYsICJcdGFkZHJlc3MgdHJhbnNsYXRpb24gb3BzXG4iKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2ludGVsLWlvbW11LmMgYi9kcml2ZXJzL2lvbW11L2ludGVsLWlvbW11LmMKaW5kZXggYWU0YzFhOC4uNGZjMWY4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9pbnRlbC1pb21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvaW50ZWwtaW9tbXUuYwpAQCAtNjg0LDcgKzY4NCw3IEBACiAJaWYgKGRldl9pc19wY2koZGV2KSkgewogCQlwZGV2ID0gdG9fcGNpX2RldihkZXYpOwogCQlzZWdtZW50ID0gcGNpX2RvbWFpbl9ucihwZGV2LT5idXMpOwotCX0gZWxzZSBpZiAoQUNQSV9DT01QQU5JT04oZGV2KSkKKwl9IGVsc2UgaWYgKGhhc19hY3BpX2NvbXBhbmlvbihkZXYpKQogCQlkZXYgPSAmQUNQSV9DT01QQU5JT04oZGV2KS0+ZGV2OwogCiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMTc0Miw5ICsxNzQyLDggQEAKIAogc3RhdGljIHZvaWQgZG9tYWluX2V4aXQoc3RydWN0IGRtYXJfZG9tYWluICpkb21haW4pCiB7Ci0Jc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOwotCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CiAJc3RydWN0IHBhZ2UgKmZyZWVsaXN0ID0gTlVMTDsKKwlpbnQgaTsKIAogCS8qIERvbWFpbiAwIGlzIHJlc2VydmVkLCBzbyBkb250IHByb2Nlc3MgaXQgKi8KIAlpZiAoIWRvbWFpbikKQEAgLTE3NjQsOCArMTc2Myw4IEBACiAKIAkvKiBjbGVhciBhdHRhY2hlZCBvciBjYWNoZWQgZG9tYWlucyAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQlmb3JfZWFjaF9hY3RpdmVfaW9tbXUoaW9tbXUsIGRyaGQpCi0JCWlvbW11X2RldGFjaF9kb21haW4oZG9tYWluLCBpb21tdSk7CisJZm9yX2VhY2hfc2V0X2JpdChpLCBkb21haW4tPmlvbW11X2JtcCwgZ19udW1fb2ZfaW9tbXVzKQorCQlpb21tdV9kZXRhY2hfZG9tYWluKGRvbWFpbiwgZ19pb21tdXNbaV0pOwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJZG1hX2ZyZWVfcGFnZWxpc3QoZnJlZWxpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pcG1tdS12bXNhLmMgYi9kcml2ZXJzL2lvbW11L2lwbW11LXZtc2EuYwppbmRleCAxMDE4NmNhLi5iYzM5YmRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L2lwbW11LXZtc2EuYworKysgYi9kcml2ZXJzL2lvbW11L2lwbW11LXZtc2EuYwpAQCAtODUxLDYgKzg1MSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlwbW11X29mX2lkc1tdID0gewogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxpcG1tdS12bXNhIiwgfSwKKwl7IH0KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlwbW11X2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvb2ZfaW9tbXUuYyBiL2RyaXZlcnMvaW9tbXUvb2ZfaW9tbXUuYwppbmRleCBhZjFkYzZhLi40MzQyOWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lvbW11L29mX2lvbW11LmMKKysrIGIvZHJpdmVycy9pb21tdS9vZl9pb21tdS5jCkBAIC0xMzMsMTkgKzEzMywyNSBAQAogCXJldHVybiBvcHM7CiB9CiAKLXN0cnVjdCBpb21tdV9vcHMgKm9mX2lvbW11X2NvbmZpZ3VyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdHJ1Y3QgaW9tbXVfb3BzICpvZl9pb21tdV9jb25maWd1cmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGRldmljZV9ub2RlICptYXN0ZXJfbnApCiB7CiAJc3RydWN0IG9mX3BoYW5kbGVfYXJncyBpb21tdV9zcGVjOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJc3RydWN0IGlvbW11X29wcyAqb3BzID0gTlVMTDsKIAlpbnQgaWR4ID0gMDsKIAorCWlmIChkZXZfaXNfcGNpKGRldikpIHsKKwkJZGV2X2VycihkZXYsICJJT01NVSBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBmb3IgUENJXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCiAJLyoKIAkgKiBXZSBkb24ndCBjdXJyZW50bHkgd2FsayB1cCB0aGUgdHJlZSBsb29raW5nIGZvciBhIHBhcmVudCBJT01NVS4KIAkgKiBTZWUgdGhlIGBOb3RlczonIHNlY3Rpb24gb2YKIAkgKiBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW9tbXUvaW9tbXUudHh0CiAJICovCi0Jd2hpbGUgKCFvZl9wYXJzZV9waGFuZGxlX3dpdGhfYXJncyhkZXYtPm9mX25vZGUsICJpb21tdXMiLAorCXdoaWxlICghb2ZfcGFyc2VfcGhhbmRsZV93aXRoX2FyZ3MobWFzdGVyX25wLCAiaW9tbXVzIiwKIAkJCQkJICAgIiNpb21tdS1jZWxscyIsIGlkeCwKIAkJCQkJICAgJmlvbW11X3NwZWMpKSB7CiAJCW5wID0gaW9tbXVfc3BlYy5ucDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9LY29uZmlnIGIvZHJpdmVycy9pcnFjaGlwL0tjb25maWcKaW5kZXggY2M3OWQyYS4uYzhkMjYwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL0tjb25maWcKKysrIGIvZHJpdmVycy9pcnFjaGlwL0tjb25maWcKQEAgLTExMCw2ICsxMTAsMTMgQEAKIAlib29sCiAJc2VsZWN0IElSUV9ET01BSU4KIAorY29uZmlnIFNUX0lSUUNISVAKKwlib29sCisJc2VsZWN0IFJFR01BUAorCXNlbGVjdCBNRkRfU1lTQ09OCisJaGVscAorCSAgRW5hYmxlcyBTeXNDZmcgQ29udHJvbGxlZCBJUlFzIG9uIFNUaSBiYXNlZCBwbGF0Zm9ybXMuCisKIGNvbmZpZyBUQjEwWF9JUlFDCiAJYm9vbAogCXNlbGVjdCBJUlFfRE9NQUlOCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUgYi9kcml2ZXJzL2lycWNoaXAvTWFrZWZpbGUKaW5kZXggNDI5NjVkMi4uNTUyYTc0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9NYWtlZmlsZQpAQCAtNiw2ICs2LDcgQEAKIG9iai0kKENPTkZJR19BUkNIX01NUCkJCQkrPSBpcnEtbW1wLm8KIG9iai0kKENPTkZJR19BUkNIX01WRUJVKQkJKz0gaXJxLWFybWFkYS0zNzAteHAubwogb2JqLSQoQ09ORklHX0FSQ0hfTVhTKQkJCSs9IGlycS1teHMubworb2JqLSQoQ09ORklHX0FSQ0hfVEVHUkEpCQkrPSBpcnEtdGVncmEubwogb2JqLSQoQ09ORklHX0FSQ0hfUzNDMjRYWCkJCSs9IGlycS1zM2MyNHh4Lm8KIG9iai0kKENPTkZJR19EV19BUEJfSUNUTCkJCSs9IGlycS1kdy1hcGItaWN0bC5vCiBvYmotJChDT05GSUdfTUVUQUcpCQkJKz0gaXJxLW1ldGFnLWV4dC5vCkBAIC0zMywxMCArMzQsMTIgQEAKIG9iai0kKENPTkZJR19WRVJTQVRJTEVfRlBHQV9JUlEpCSs9IGlycS12ZXJzYXRpbGUtZnBnYS5vCiBvYmotJChDT05GSUdfQVJDSF9OU1BJUkUpCQkrPSBpcnEtemV2aW8ubwogb2JqLSQoQ09ORklHX0FSQ0hfVlQ4NTAwKQkJKz0gaXJxLXZ0ODUwMC5vCitvYmotJChDT05GSUdfU1RfSVJRQ0hJUCkJCSs9IGlycS1zdC5vCiBvYmotJChDT05GSUdfVEIxMFhfSVJRQykJCSs9IGlycS10YjEweC5vCiBvYmotJChDT05GSUdfWFRFTlNBKQkJCSs9IGlycS14dGVuc2EtcGljLm8KIG9iai0kKENPTkZJR19YVEVOU0FfTVgpCQkJKz0gaXJxLXh0ZW5zYS1teC5vCiBvYmotJChDT05GSUdfSVJRX0NST1NTQkFSKQkJKz0gaXJxLWNyb3NzYmFyLm8KK29iai0kKENPTkZJR19TT0NfVkY2MTApCQkJKz0gaXJxLXZmNjEwLW1zY20taXIubwogb2JqLSQoQ09ORklHX0JDTTcxMjBfTDJfSVJRKQkJKz0gaXJxLWJjbTcxMjAtbDIubwogb2JqLSQoQ09ORklHX0JSQ01TVEJfTDJfSVJRKQkJKz0gaXJxLWJyY21zdGItbDIubwogb2JqLSQoQ09ORklHX0tFWVNUT05FX0lSUSkJCSs9IGlycS1rZXlzdG9uZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWFybWFkYS0zNzAteHAuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jCmluZGV4IDQzODdkYWUuLmRhY2NjOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtYXJtYWRhLTM3MC14cC5jCkBAIC0zOCw2ICszOCw4IEBACiAvKiBJbnRlcnJ1cHQgQ29udHJvbGxlciBSZWdpc3RlcnMgTWFwICovCiAjZGVmaW5lIEFSTUFEQV8zNzBfWFBfSU5UX1NFVF9NQVNLX09GRlMJCSgweDQ4KQogI2RlZmluZSBBUk1BREFfMzcwX1hQX0lOVF9DTEVBUl9NQVNLX09GRlMJKDB4NEMpCisjZGVmaW5lIEFSTUFEQV8zNzBfWFBfSU5UX0ZBQlJJQ19NQVNLX09GRlMJKDB4NTQpCisjZGVmaW5lIEFSTUFEQV8zNzBfWFBfSU5UX0NBVVNFX1BFUkYoY3B1KQkoMSA8PCBjcHUpCiAKICNkZWZpbmUgQVJNQURBXzM3MF9YUF9JTlRfQ09OVFJPTAkJKDB4MDApCiAjZGVmaW5lIEFSTUFEQV8zNzBfWFBfSU5UX1NFVF9FTkFCTEVfT0ZGUwkoMHgzMCkKQEAgLTU2LDYgKzU4LDcgQEAKICNkZWZpbmUgQVJNQURBXzM3MF9YUF9NQVhfUEVSX0NQVV9JUlFTCQkoMjgpCiAKICNkZWZpbmUgQVJNQURBXzM3MF9YUF9USU1FUjBfUEVSX0NQVV9JUlEJKDUpCisjZGVmaW5lIEFSTUFEQV8zNzBfWFBfRkFCUklDX0lSUQkJKDMpCiAKICNkZWZpbmUgSVBJX0RPT1JCRUxMX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICgwKQogI2RlZmluZSBJUElfRE9PUkJFTExfRU5EICAgICAgICAgICAgICAgICAgICAgICAgKDgpCkBAIC03Nyw2ICs4MCwxNyBAQAogc3RhdGljIHBoeXNfYWRkcl90IG1zaV9kb29yYmVsbF9hZGRyOwogI2VuZGlmCiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19wZXJjcHVfaXJxKGlycV9od19udW1iZXJfdCBpcnEpCit7CisJc3dpdGNoIChpcnEpIHsKKwljYXNlIEFSTUFEQV8zNzBfWFBfVElNRVIwX1BFUl9DUFVfSVJROgorCWNhc2UgQVJNQURBXzM3MF9YUF9GQUJSSUNfSVJROgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCiAvKgogICogSW4gU01QIG1vZGU6CiAgKiBGb3Igc2hhcmVkIGdsb2JhbCBpbnRlcnJ1cHRzLCBtYXNrL3VubWFzayBnbG9iYWwgZW5hYmxlIGJpdApAQCAtODYsNyArMTAwLDcgQEAKIHsKIAlpcnFfaHdfbnVtYmVyX3QgaHdpcnEgPSBpcnFkX3RvX2h3aXJxKGQpOwogCi0JaWYgKGh3aXJxICE9IEFSTUFEQV8zNzBfWFBfVElNRVIwX1BFUl9DUFVfSVJRKQorCWlmICghaXNfcGVyY3B1X2lycShod2lycSkpCiAJCXdyaXRlbChod2lycSwgbWFpbl9pbnRfYmFzZSArCiAJCQkJQVJNQURBXzM3MF9YUF9JTlRfQ0xFQVJfRU5BQkxFX09GRlMpOwogCWVsc2UKQEAgLTk4LDcgKzExMiw3IEBACiB7CiAJaXJxX2h3X251bWJlcl90IGh3aXJxID0gaXJxZF90b19od2lycShkKTsKIAotCWlmIChod2lycSAhPSBBUk1BREFfMzcwX1hQX1RJTUVSMF9QRVJfQ1BVX0lSUSkKKwlpZiAoIWlzX3BlcmNwdV9pcnEoaHdpcnEpKQogCQl3cml0ZWwoaHdpcnEsIG1haW5faW50X2Jhc2UgKwogCQkJCUFSTUFEQV8zNzBfWFBfSU5UX1NFVF9FTkFCTEVfT0ZGUyk7CiAJZWxzZQpAQCAtMjgxLDIwICsyOTUsMjEgQEAKICNpZmRlZiBDT05GSUdfU01QCiAJLmlycV9zZXRfYWZmaW5pdHkgPSBhcm1hZGFfeHBfc2V0X2FmZmluaXR5LAogI2VuZGlmCisJLmZsYWdzCQk9IElSUUNISVBfU0tJUF9TRVRfV0FLRSB8IElSUUNISVBfTUFTS19PTl9TVVNQRU5ELAogfTsKIAogc3RhdGljIGludCBhcm1hZGFfMzcwX3hwX21waWNfaXJxX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqaCwKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgdmlycSwgaXJxX2h3X251bWJlcl90IGh3KQogewogCWFybWFkYV8zNzBfeHBfaXJxX21hc2soaXJxX2dldF9pcnFfZGF0YSh2aXJxKSk7Ci0JaWYgKGh3ICE9IEFSTUFEQV8zNzBfWFBfVElNRVIwX1BFUl9DUFVfSVJRKQorCWlmICghaXNfcGVyY3B1X2lycShodykpCiAJCXdyaXRlbChodywgcGVyX2NwdV9pbnRfYmFzZSArCiAJCQlBUk1BREFfMzcwX1hQX0lOVF9DTEVBUl9NQVNLX09GRlMpOwogCWVsc2UKIAkJd3JpdGVsKGh3LCBtYWluX2ludF9iYXNlICsgQVJNQURBXzM3MF9YUF9JTlRfU0VUX0VOQUJMRV9PRkZTKTsKIAlpcnFfc2V0X3N0YXR1c19mbGFncyh2aXJxLCBJUlFfTEVWRUwpOwogCi0JaWYgKGh3ID09IEFSTUFEQV8zNzBfWFBfVElNRVIwX1BFUl9DUFVfSVJRKSB7CisJaWYgKGlzX3BlcmNwdV9pcnEoaHcpKSB7CiAJCWlycV9zZXRfcGVyY3B1X2RldmlkKHZpcnEpOwogCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIodmlycSwgJmFybWFkYV8zNzBfeHBfaXJxX2NoaXAsCiAJCQkJCWhhbmRsZV9wZXJjcHVfZGV2aWRfaXJxKTsKQEAgLTMwOCwyOCArMzIzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIGFybWFkYV9tcGljX3NlbmRfZG9vcmJlbGwoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGlycSkKLXsKLQlpbnQgY3B1OwotCXVuc2lnbmVkIGxvbmcgbWFwID0gMDsKLQotCS8qIENvbnZlcnQgb3VyIGxvZ2ljYWwgQ1BVIG1hc2sgaW50byBhIHBoeXNpY2FsIG9uZS4gKi8KLQlmb3JfZWFjaF9jcHUoY3B1LCBtYXNrKQotCQltYXAgfD0gMSA8PCBjcHVfbG9naWNhbF9tYXAoY3B1KTsKLQotCS8qCi0JICogRW5zdXJlIHRoYXQgc3RvcmVzIHRvIE5vcm1hbCBtZW1vcnkgYXJlIHZpc2libGUgdG8gdGhlCi0JICogb3RoZXIgQ1BVcyBiZWZvcmUgaXNzdWluZyB0aGUgSVBJLgotCSAqLwotCWRzYigpOwotCi0JLyogc3VibWl0IHNvZnRpcnEgKi8KLQl3cml0ZWwoKG1hcCA8PCA4KSB8IGlycSwgbWFpbl9pbnRfYmFzZSArCi0JCUFSTUFEQV8zNzBfWFBfU1dfVFJJR19JTlRfT0ZGUyk7Ci19Ci0KIHN0YXRpYyB2b2lkIGFybWFkYV94cF9tcGljX3NtcF9jcHVfaW5pdCh2b2lkKQogewogCXUzMiBjb250cm9sOwpAQCAtMzUyLDExICszNDUsNDQgQEAKIAl3cml0ZWwoMCwgcGVyX2NwdV9pbnRfYmFzZSArIEFSTUFEQV8zNzBfWFBfSU5UX0NMRUFSX01BU0tfT0ZGUyk7CiB9CiAKK3N0YXRpYyB2b2lkIGFybWFkYV94cF9tcGljX3BlcmZfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY3B1aWQgPSBjcHVfbG9naWNhbF9tYXAoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCS8qIEVuYWJsZSBQZXJmb3JtYW5jZSBDb3VudGVyIE92ZXJmbG93IGludGVycnVwdHMgKi8KKwl3cml0ZWwoQVJNQURBXzM3MF9YUF9JTlRfQ0FVU0VfUEVSRihjcHVpZCksCisJICAgICAgIHBlcl9jcHVfaW50X2Jhc2UgKyBBUk1BREFfMzcwX1hQX0lOVF9GQUJSSUNfTUFTS19PRkZTKTsKK30KKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyB2b2lkIGFybWFkYV9tcGljX3NlbmRfZG9vcmJlbGwoY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssCisJCQkJICAgICAgdW5zaWduZWQgaW50IGlycSkKK3sKKwlpbnQgY3B1OworCXVuc2lnbmVkIGxvbmcgbWFwID0gMDsKKworCS8qIENvbnZlcnQgb3VyIGxvZ2ljYWwgQ1BVIG1hc2sgaW50byBhIHBoeXNpY2FsIG9uZS4gKi8KKwlmb3JfZWFjaF9jcHUoY3B1LCBtYXNrKQorCQltYXAgfD0gMSA8PCBjcHVfbG9naWNhbF9tYXAoY3B1KTsKKworCS8qCisJICogRW5zdXJlIHRoYXQgc3RvcmVzIHRvIE5vcm1hbCBtZW1vcnkgYXJlIHZpc2libGUgdG8gdGhlCisJICogb3RoZXIgQ1BVcyBiZWZvcmUgaXNzdWluZyB0aGUgSVBJLgorCSAqLworCWRzYigpOworCisJLyogc3VibWl0IHNvZnRpcnEgKi8KKwl3cml0ZWwoKG1hcCA8PCA4KSB8IGlycSwgbWFpbl9pbnRfYmFzZSArCisJCUFSTUFEQV8zNzBfWFBfU1dfVFJJR19JTlRfT0ZGUyk7Cit9CisKIHN0YXRpYyBpbnQgYXJtYWRhX3hwX21waWNfc2Vjb25kYXJ5X2luaXQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCiAJCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKLQlpZiAoYWN0aW9uID09IENQVV9TVEFSVElORyB8fCBhY3Rpb24gPT0gQ1BVX1NUQVJUSU5HX0ZST1pFTikKKwlpZiAoYWN0aW9uID09IENQVV9TVEFSVElORyB8fCBhY3Rpb24gPT0gQ1BVX1NUQVJUSU5HX0ZST1pFTikgeworCQlhcm1hZGFfeHBfbXBpY19wZXJmX2luaXQoKTsKIAkJYXJtYWRhX3hwX21waWNfc21wX2NwdV9pbml0KCk7CisJfQogCiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KQEAgLTM2OSw4ICszOTUsMTAgQEAKIHN0YXRpYyBpbnQgbXBpY19jYXNjYWRlZF9zZWNvbmRhcnlfaW5pdChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwKIAkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7Ci0JaWYgKGFjdGlvbiA9PSBDUFVfU1RBUlRJTkcgfHwgYWN0aW9uID09IENQVV9TVEFSVElOR19GUk9aRU4pCisJaWYgKGFjdGlvbiA9PSBDUFVfU1RBUlRJTkcgfHwgYWN0aW9uID09IENQVV9TVEFSVElOR19GUk9aRU4pIHsKKwkJYXJtYWRhX3hwX21waWNfcGVyZl9pbml0KCk7CiAJCWVuYWJsZV9wZXJjcHVfaXJxKHBhcmVudF9pcnEsIElSUV9UWVBFX05PTkUpOworCX0KIAogCXJldHVybiBOT1RJRllfT0s7CiB9CkBAIC0zNzksNyArNDA3LDYgQEAKIAkubm90aWZpZXJfY2FsbCA9IG1waWNfY2FzY2FkZWRfc2Vjb25kYXJ5X2luaXQsCiAJLnByaW9yaXR5ID0gMTAwLAogfTsKLQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogc3RhdGljIHN0cnVjdCBpcnFfZG9tYWluX29wcyBhcm1hZGFfMzcwX3hwX21waWNfaXJxX29wcyA9IHsKQEAgLTU4OCw5ICs2MTUsOSBAQAogCiAJQlVHX09OKCFhcm1hZGFfMzcwX3hwX21waWNfZG9tYWluKTsKIAotI2lmZGVmIENPTkZJR19TTVAKKwkvKiBTZXR1cCBmb3IgdGhlIGJvb3QgQ1BVICovCisJYXJtYWRhX3hwX21waWNfcGVyZl9pbml0KCk7CiAJYXJtYWRhX3hwX21waWNfc21wX2NwdV9pbml0KCk7Ci0jZW5kaWYKIAogCWFybWFkYV8zNzBfeHBfbXNpX2luaXQobm9kZSwgbWFpbl9pbnRfcmVzLnN0YXJ0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1jcm9zc2Jhci5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1jcm9zc2Jhci5jCmluZGV4IGJiYmFmNWQuLjY5MmZlMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtY3Jvc3NiYXIuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWNyb3NzYmFyLmMKQEAgLTExLDExICsxMSwxMiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFkb21haW4uaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvYXJtLWdpYy5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvaXJxLWNyb3NzYmFyLmg+CisKKyNpbmNsdWRlICJpcnFjaGlwLmgiCiAKICNkZWZpbmUgSVJRX0ZSRUUJLTEKICNkZWZpbmUgSVJRX1JFU0VSVkVECS0yCkBAIC0yNCw2ICsyNSw3IEBACiAKIC8qKgogICogc3RydWN0IGNyb3NzYmFyX2RldmljZSAtIGNyb3NzYmFyIGRldmljZSBkZXNjcmlwdGlvbgorICogQGxvY2s6IHNwaW5sb2NrIHNlcmlhbGl6aW5nIGFjY2VzcyB0byBAaXJxX21hcAogICogQGludF9tYXg6IG1heGltdW0gbnVtYmVyIG9mIHN1cHBvcnRlZCBpbnRlcnJ1cHRzCiAgKiBAc2FmZV9tYXA6IHNhZmUgZGVmYXVsdCB2YWx1ZSB0byBpbml0aWFsaXplIHRoZSBjcm9zc2JhcgogICogQG1heF9jcm9zc2Jhcl9zb3VyY2VzOiBNYXhpbXVtIG51bWJlciBvZiBjcm9zc2JhciBzb3VyY2VzCkBAIC0zMyw2ICszNSw3IEBACiAgKiBAd3JpdGU6IHJlZ2lzdGVyIHdyaXRlIGZ1bmN0aW9uIHBvaW50ZXIKICAqLwogc3RydWN0IGNyb3NzYmFyX2RldmljZSB7CisJcmF3X3NwaW5sb2NrX3QgbG9jazsKIAl1aW50IGludF9tYXg7CiAJdWludCBzYWZlX21hcDsKIAl1aW50IG1heF9jcm9zc2Jhcl9zb3VyY2VzOwpAQCAtNDQsNzIgKzQ3LDEwMSBAQAogCiBzdGF0aWMgc3RydWN0IGNyb3NzYmFyX2RldmljZSAqY2I7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcm9zc2Jhcl93cml0ZWwoaW50IGlycV9ubywgaW50IGNiX25vKQorc3RhdGljIHZvaWQgY3Jvc3NiYXJfd3JpdGVsKGludCBpcnFfbm8sIGludCBjYl9ubykKIHsKIAl3cml0ZWwoY2Jfbm8sIGNiLT5jcm9zc2Jhcl9iYXNlICsgY2ItPnJlZ2lzdGVyX29mZnNldHNbaXJxX25vXSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcm9zc2Jhcl93cml0ZXcoaW50IGlycV9ubywgaW50IGNiX25vKQorc3RhdGljIHZvaWQgY3Jvc3NiYXJfd3JpdGV3KGludCBpcnFfbm8sIGludCBjYl9ubykKIHsKIAl3cml0ZXcoY2Jfbm8sIGNiLT5jcm9zc2Jhcl9iYXNlICsgY2ItPnJlZ2lzdGVyX29mZnNldHNbaXJxX25vXSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcm9zc2Jhcl93cml0ZWIoaW50IGlycV9ubywgaW50IGNiX25vKQorc3RhdGljIHZvaWQgY3Jvc3NiYXJfd3JpdGViKGludCBpcnFfbm8sIGludCBjYl9ubykKIHsKIAl3cml0ZWIoY2Jfbm8sIGNiLT5jcm9zc2Jhcl9iYXNlICsgY2ItPnJlZ2lzdGVyX29mZnNldHNbaXJxX25vXSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGdldF9wcmV2X21hcF9pcnEoaW50IGNiX25vKQorc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBjcm9zc2Jhcl9jaGlwID0geworCS5uYW1lCQkJPSAiQ0JBUiIsCisJLmlycV9lb2kJCT0gaXJxX2NoaXBfZW9pX3BhcmVudCwKKwkuaXJxX21hc2sJCT0gaXJxX2NoaXBfbWFza19wYXJlbnQsCisJLmlycV91bm1hc2sJCT0gaXJxX2NoaXBfdW5tYXNrX3BhcmVudCwKKwkuaXJxX3JldHJpZ2dlcgkJPSBpcnFfY2hpcF9yZXRyaWdnZXJfaGllcmFyY2h5LAorCS5pcnFfc2V0X3dha2UJCT0gaXJxX2NoaXBfc2V0X3dha2VfcGFyZW50LAorI2lmZGVmIENPTkZJR19TTVAKKwkuaXJxX3NldF9hZmZpbml0eQk9IGlycV9jaGlwX3NldF9hZmZpbml0eV9wYXJlbnQsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgYWxsb2NhdGVfZ2ljX2lycShzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCB2aXJxLAorCQkJICAgIGlycV9od19udW1iZXJfdCBod2lycSkKIHsKKwlzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzIGFyZ3M7CiAJaW50IGk7CisJaW50IGVycjsKIAotCWZvciAoaSA9IGNiLT5pbnRfbWF4IC0gMTsgaSA+PSAwOyBpLS0pCi0JCWlmIChjYi0+aXJxX21hcFtpXSA9PSBjYl9ubykKLQkJCXJldHVybiBpOwotCi0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGFsbG9jYXRlX2ZyZWVfaXJxKGludCBjYl9ubykKLXsKLQlpbnQgaTsKLQorCXJhd19zcGluX2xvY2soJmNiLT5sb2NrKTsKIAlmb3IgKGkgPSBjYi0+aW50X21heCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAJCWlmIChjYi0+aXJxX21hcFtpXSA9PSBJUlFfRlJFRSkgewotCQkJY2ItPmlycV9tYXBbaV0gPSBjYl9ubzsKLQkJCXJldHVybiBpOworCQkJY2ItPmlycV9tYXBbaV0gPSBod2lycTsKKwkJCWJyZWFrOwogCQl9CiAJfQorCXJhd19zcGluX3VubG9jaygmY2ItPmxvY2spOwogCi0JcmV0dXJuIC1FTk9ERVY7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWFyZ3MubnAgPSBkb21haW4tPnBhcmVudC0+b2Zfbm9kZTsKKwlhcmdzLmFyZ3NfY291bnQgPSAzOworCWFyZ3MuYXJnc1swXSA9IDA7CS8qIFNQSSAqLworCWFyZ3MuYXJnc1sxXSA9IGk7CisJYXJncy5hcmdzWzJdID0gSVJRX1RZUEVfTEVWRUxfSElHSDsKKworCWVyciA9IGlycV9kb21haW5fYWxsb2NfaXJxc19wYXJlbnQoZG9tYWluLCB2aXJxLCAxLCAmYXJncyk7CisJaWYgKGVycikKKwkJY2ItPmlycV9tYXBbaV0gPSBJUlFfRlJFRTsKKwllbHNlCisJCWNiLT53cml0ZShpLCBod2lycSk7CisKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgbmVlZHNfY3Jvc3NiYXJfd3JpdGUoaXJxX2h3X251bWJlcl90IGh3KQorc3RhdGljIGludCBjcm9zc2Jhcl9kb21haW5fYWxsb2Moc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCB2aXJxLAorCQkJCSB1bnNpZ25lZCBpbnQgbnJfaXJxcywgdm9pZCAqZGF0YSkKIHsKLQlpbnQgY2Jfbm87CisJc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncyA9IGRhdGE7CisJaXJxX2h3X251bWJlcl90IGh3aXJxOworCWludCBpOwogCi0JaWYgKGh3ID4gR0lDX0lSUV9TVEFSVCkgewotCQljYl9ubyA9IGNiLT5pcnFfbWFwW2h3IC0gR0lDX0lSUV9TVEFSVF07Ci0JCWlmIChjYl9ubyAhPSBJUlFfUkVTRVJWRUQgJiYgY2Jfbm8gIT0gSVJRX1NLSVApCi0JCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoYXJncy0+YXJnc19jb3VudCAhPSAzKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogTm90IEdJQyBjb21wbGlhbnQgKi8KKwlpZiAoYXJncy0+YXJnc1swXSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsJLyogTm8gUFBJIHNob3VsZCBwb2ludCB0byB0aGlzIGRvbWFpbiAqLworCisJaHdpcnEgPSBhcmdzLT5hcmdzWzFdOworCWlmICgoaHdpcnEgKyBucl9pcnFzKSA+IGNiLT5tYXhfY3Jvc3NiYXJfc291cmNlcykKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIENhbid0IGRlYWwgd2l0aCB0aGlzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKSB7CisJCWludCBlcnIgPSBhbGxvY2F0ZV9naWNfaXJxKGQsIHZpcnEgKyBpLCBod2lycSArIGkpOworCisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWlycV9kb21haW5fc2V0X2h3aXJxX2FuZF9jaGlwKGQsIHZpcnEgKyBpLCBod2lycSArIGksCisJCQkJCSAgICAgICZjcm9zc2Jhcl9jaGlwLCBOVUxMKTsKIAl9CiAKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyBpbnQgY3Jvc3NiYXJfZG9tYWluX21hcChzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgdW5zaWduZWQgaW50IGlycSwKLQkJCSAgICAgICBpcnFfaHdfbnVtYmVyX3QgaHcpCi17Ci0JaWYgKG5lZWRzX2Nyb3NzYmFyX3dyaXRlKGh3KSkKLQkJY2ItPndyaXRlKGh3IC0gR0lDX0lSUV9TVEFSVCwgY2ItPmlycV9tYXBbaHcgLSBHSUNfSVJRX1NUQVJUXSk7Ci0KIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBjcm9zc2Jhcl9kb21haW5fdW5tYXAgLSB1bm1hcCBhIGNyb3NzYmFyPC0+aXJxIGNvbm5lY3Rpb24KLSAqIEBkOiBkb21haW4gb2YgaXJxIHRvIHVubWFwCi0gKiBAaXJxOiB2aXJxIG51bWJlcgorICogY3Jvc3NiYXJfZG9tYWluX2ZyZWUgLSB1bm1hcC9mcmVlIGEgY3Jvc3NiYXI8LT5pcnEgY29ubmVjdGlvbgorICogQGRvbWFpbjogZG9tYWluIG9mIGlycSB0byB1bm1hcAorICogQHZpcnE6IHZpcnEgbnVtYmVyCisgKiBAbnJfaXJxczogbnVtYmVyIG9mIGlycXMgdG8gZnJlZQogICoKICAqIFdlIGRvIG5vdCBtYWludGFpbiBhIHVzZSBjb3VudCBvZiB0b3RhbCBudW1iZXIgb2YgbWFwL3VubWFwCiAgKiBjYWxscyBmb3IgYSBwYXJ0aWN1bGFyIGlycSB0byBmaW5kIG91dCBpZiBhIGlycSBjYW4gYmUgcmVhbGx5CkBAIC0xMTcsMTQgKzE0OSwyMCBAQAogICogYWZ0ZXIgd2hpY2ggaXJxIGlzIGFueXdheXMgdW51c2FibGUuIFNvIGFuIGV4cGxpY2l0IG1hcCBoYXMgdG8gYmUgY2FsbGVkCiAgKiBhZnRlciB0aGF0LgogICovCi1zdGF0aWMgdm9pZCBjcm9zc2Jhcl9kb21haW5fdW5tYXAoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBjcm9zc2Jhcl9kb21haW5fZnJlZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLCB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCQkgdW5zaWduZWQgaW50IG5yX2lycXMpCiB7Ci0JaXJxX2h3X251bWJlcl90IGh3ID0gaXJxX2dldF9pcnFfZGF0YShpcnEpLT5od2lycTsKKwlpbnQgaTsKIAotCWlmIChuZWVkc19jcm9zc2Jhcl93cml0ZShodykpIHsKLQkJY2ItPmlycV9tYXBbaHcgLSBHSUNfSVJRX1NUQVJUXSA9IElSUV9GUkVFOwotCQljYi0+d3JpdGUoaHcgLSBHSUNfSVJRX1NUQVJULCBjYi0+c2FmZV9tYXApOworCXJhd19zcGluX2xvY2soJmNiLT5sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnJfaXJxczsgaSsrKSB7CisJCXN0cnVjdCBpcnFfZGF0YSAqZCA9IGlycV9kb21haW5fZ2V0X2lycV9kYXRhKGRvbWFpbiwgdmlycSArIGkpOworCisJCWlycV9kb21haW5fcmVzZXRfaXJxX2RhdGEoZCk7CisJCWNiLT5pcnFfbWFwW2QtPmh3aXJxXSA9IElSUV9GUkVFOworCQljYi0+d3JpdGUoZC0+aHdpcnEsIGNiLT5zYWZlX21hcCk7CiAJfQorCXJhd19zcGluX3VubG9jaygmY2ItPmxvY2spOwogfQogCiBzdGF0aWMgaW50IGNyb3NzYmFyX2RvbWFpbl94bGF0ZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwKQEAgLTEzMyw0NCArMTcxLDIyIEBACiAJCQkJIHVuc2lnbmVkIGxvbmcgKm91dF9od2lycSwKIAkJCQkgdW5zaWduZWQgaW50ICpvdXRfdHlwZSkKIHsKLQlpbnQgcmV0OwotCWludCByZXFfbnVtID0gaW50c3BlY1sxXTsKLQlpbnQgZGlyZWN0X21hcF9udW07CisJaWYgKGQtPm9mX25vZGUgIT0gY29udHJvbGxlcikKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIFNob3VsZG4ndCBoYXBwZW4sIHJlYWxseS4uLiAqLworCWlmIChpbnRzaXplICE9IDMpCisJCXJldHVybiAtRUlOVkFMOwkvKiBOb3QgR0lDIGNvbXBsaWFudCAqLworCWlmIChpbnRzcGVjWzBdICE9IDApCisJCXJldHVybiAtRUlOVkFMOwkvKiBObyBQUEkgc2hvdWxkIHBvaW50IHRvIHRoaXMgZG9tYWluICovCiAKLQlpZiAocmVxX251bSA+PSBjYi0+bWF4X2Nyb3NzYmFyX3NvdXJjZXMpIHsKLQkJZGlyZWN0X21hcF9udW0gPSByZXFfbnVtIC0gY2ItPm1heF9jcm9zc2Jhcl9zb3VyY2VzOwotCQlpZiAoZGlyZWN0X21hcF9udW0gPCBjYi0+aW50X21heCkgewotCQkJcmV0ID0gY2ItPmlycV9tYXBbZGlyZWN0X21hcF9udW1dOwotCQkJaWYgKHJldCA9PSBJUlFfUkVTRVJWRUQgfHwgcmV0ID09IElSUV9TS0lQKSB7Ci0JCQkJLyogV2UgdXNlIHRoZSBpbnRlcnJ1cHQgbnVtIGFzIGgvdyBpcnEgbnVtICovCi0JCQkJcmV0ID0gZGlyZWN0X21hcF9udW07Ci0JCQkJZ290byBmb3VuZDsKLQkJCX0KLQkJfQotCi0JCXByX2VycigiJXM6IHJlcXVlc3RlZCBjcm9zc2JhciBudW1iZXIgJWQgPiBtYXggJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgcmVxX251bSwgY2ItPm1heF9jcm9zc2Jhcl9zb3VyY2VzKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gZ2V0X3ByZXZfbWFwX2lycShyZXFfbnVtKTsKLQlpZiAocmV0ID49IDApCi0JCWdvdG8gZm91bmQ7Ci0KLQlyZXQgPSBhbGxvY2F0ZV9mcmVlX2lycShyZXFfbnVtKTsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi1mb3VuZDoKLQkqb3V0X2h3aXJxID0gcmV0ICsgR0lDX0lSUV9TVEFSVDsKKwkqb3V0X2h3aXJxID0gaW50c3BlY1sxXTsKKwkqb3V0X3R5cGUgPSBpbnRzcGVjWzJdOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIHJvdXRhYmxlX2lycV9kb21haW5fb3BzID0gewotCS5tYXAgPSBjcm9zc2Jhcl9kb21haW5fbWFwLAotCS51bm1hcCA9IGNyb3NzYmFyX2RvbWFpbl91bm1hcCwKLQkueGxhdGUgPSBjcm9zc2Jhcl9kb21haW5feGxhdGUKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgY3Jvc3NiYXJfZG9tYWluX29wcyA9IHsKKwkuYWxsb2MJPSBjcm9zc2Jhcl9kb21haW5fYWxsb2MsCisJLmZyZWUJPSBjcm9zc2Jhcl9kb21haW5fZnJlZSwKKwkueGxhdGUJPSBjcm9zc2Jhcl9kb21haW5feGxhdGUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBjcm9zc2Jhcl9vZl9pbml0KHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKQEAgLTI5Myw3ICszMDksOCBAQAogCQljYi0+d3JpdGUoaSwgY2ItPnNhZmVfbWFwKTsKIAl9CiAKLQlyZWdpc3Rlcl9yb3V0YWJsZV9kb21haW5fb3BzKCZyb3V0YWJsZV9pcnFfZG9tYWluX29wcyk7CisJcmF3X3NwaW5fbG9ja19pbml0KCZjYi0+bG9jayk7CisKIAlyZXR1cm4gMDsKIAogZXJyX3JlZ19vZmZzZXQ6CkBAIC0zMDksMTggKzMyNiwzNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNyb3NzYmFyX21hdGNoW10gX19pbml0Y29uc3QgPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJ0aSxpcnEtY3Jvc3NiYXIiIH0sCi0Je30KLX07Ci0KLWludCBfX2luaXQgaXJxY3Jvc3NiYXJfaW5pdCh2b2lkKQorc3RhdGljIGludCBfX2luaXQgaXJxY3Jvc3NiYXJfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJICAgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQlucCA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCBjcm9zc2Jhcl9tYXRjaCk7Ci0JaWYgKCFucCkKLQkJcmV0dXJuIC1FTk9ERVY7CisJc3RydWN0IGlycV9kb21haW4gKnBhcmVudF9kb21haW4sICpkb21haW47CisJaW50IGVycjsKIAotCWNyb3NzYmFyX29mX2luaXQobnApOworCWlmICghcGFyZW50KSB7CisJCXByX2VycigiJXM6IG5vIHBhcmVudCwgZ2l2aW5nIHVwXG4iLCBub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwYXJlbnRfZG9tYWluID0gaXJxX2ZpbmRfaG9zdChwYXJlbnQpOworCWlmICghcGFyZW50X2RvbWFpbikgeworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gb2J0YWluIHBhcmVudCBkb21haW5cbiIsIG5vZGUtPmZ1bGxfbmFtZSk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJZXJyID0gY3Jvc3NiYXJfb2ZfaW5pdChub2RlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfaGllcmFyY2h5KHBhcmVudF9kb21haW4sIDAsCisJCQkJCSAgY2ItPm1heF9jcm9zc2Jhcl9zb3VyY2VzLAorCQkJCQkgIG5vZGUsICZjcm9zc2Jhcl9kb21haW5fb3BzLAorCQkJCQkgIE5VTEwpOworCWlmICghZG9tYWluKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZWQgZG9tYWluXG4iLCBub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KKworSVJRQ0hJUF9ERUNMQVJFKHRpX2lycWNyb3NzYmFyLCAidGksaXJxLWNyb3NzYmFyIiwgaXJxY3Jvc3NiYXJfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWRpZ2ljb2xvci5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1kaWdpY29sb3IuYwppbmRleCA5MzBhMmEyLi4zY2JjNjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWRpZ2ljb2xvci5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZGlnaWNvbG9yLmMKQEAgLTU1LDggKzU1LDggQEAKIAl9IHdoaWxlICgxKTsKIH0KIAotc3RhdGljIHZvaWQgZGlnaWNvbG9yX3NldF9nYyh2b2lkIF9faW9tZW0gKnJlZ19iYXNlLCB1bnNpZ25lZCBpcnFfYmFzZSwKLQkJCSAgICAgdW5zaWduZWQgZW5fcmVnLCB1bnNpZ25lZCBhY2tfcmVnKQorc3RhdGljIHZvaWQgX19pbml0IGRpZ2ljb2xvcl9zZXRfZ2Modm9pZCBfX2lvbWVtICpyZWdfYmFzZSwgdW5zaWduZWQgaXJxX2Jhc2UsCisJCQkJICAgIHVuc2lnbmVkIGVuX3JlZywgdW5zaWduZWQgYWNrX3JlZykKIHsKIAlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2M7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLWl0cy5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLmMKaW5kZXggNTk2YjBhOS4uOTY4N2Y4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMtaXRzLmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCiBzdGF0aWMgdm9pZCBpdHNfZW5jb2RlX2RldmlkKHN0cnVjdCBpdHNfY21kX2Jsb2NrICpjbWQsIHUzMiBkZXZpZCkKIHsKLQljbWQtPnJhd19jbWRbMF0gJj0gfigweGZmZmZVTCA8PCAzMik7CisJY21kLT5yYXdfY21kWzBdICY9IEJJVF9VTEwoMzIpIC0gMTsKIAljbWQtPnJhd19jbWRbMF0gfD0gKCh1NjQpZGV2aWQpIDw8IDMyOwogfQogCkBAIC04MDIsNiArODAyLDcgQEAKIAlpbnQgaTsKIAlpbnQgcHN6ID0gU1pfNjRLOwogCXU2NCBzaHIgPSBHSVRTX0JBU0VSX0lubmVyU2hhcmVhYmxlOworCXU2NCBjYWNoZSA9IEdJVFNfQkFTRVJfV2FXYjsKIAogCWZvciAoaSA9IDA7IGkgPCBHSVRTX0JBU0VSX05SX1JFR1M7IGkrKykgewogCQl1NjQgdmFsID0gcmVhZHFfcmVsYXhlZChpdHMtPmJhc2UgKyBHSVRTX0JBU0VSICsgaSAqIDgpOwpAQCAtODQ4LDcgKzg0OSw3IEBACiAJCXZhbCA9ICh2aXJ0X3RvX3BoeXMoYmFzZSkgCQkJCSB8CiAJCSAgICAgICAodHlwZSA8PCBHSVRTX0JBU0VSX1RZUEVfU0hJRlQpCQkJIHwKIAkJICAgICAgICgoZW50cnlfc2l6ZSAtIDEpIDw8IEdJVFNfQkFTRVJfRU5UUllfU0laRV9TSElGVCkgfAotCQkgICAgICAgR0lUU19CQVNFUl9XYVdiCQkJCQkgfAorCQkgICAgICAgY2FjaGUJCQkJCQkgfAogCQkgICAgICAgc2hyCQkJCQkJIHwKIAkJICAgICAgIEdJVFNfQkFTRVJfVkFMSUQpOwogCkBAIC04NzQsOSArODc1LDEyIEBACiAJCQkgKiBTaGFyZWFiaWxpdHkgZGlkbid0IHN0aWNrLiBKdXN0IHVzZQogCQkJICogd2hhdGV2ZXIgdGhlIHJlYWQgcmVwb3J0ZWQsIHdoaWNoIGlzIGxpa2VseQogCQkJICogdG8gYmUgdGhlIG9ubHkgdGhpbmcgdGhpcyByZWRpc3RyaWJ1dG9yCi0JCQkgKiBzdXBwb3J0cy4KKwkJCSAqIHN1cHBvcnRzLiBJZiB0aGF0J3MgemVybywgbWFrZSBpdAorCQkJICogbm9uLWNhY2hlYWJsZSBhcyB3ZWxsLgogCQkJICovCiAJCQlzaHIgPSB0bXAgJiBHSVRTX0JBU0VSX1NIQVJFQUJJTElUWV9NQVNLOworCQkJaWYgKCFzaHIpCisJCQkJY2FjaGUgPSBHSVRTX0JBU0VSX25DOwogCQkJZ290byByZXRyeV9iYXNlcjsKIAkJfQogCkBAIC05ODAsMTYgKzk4NCwzOSBAQAogCXRtcCA9IHJlYWRxX3JlbGF4ZWQocmJhc2UgKyBHSUNSX1BST1BCQVNFUik7CiAKIAlpZiAoKHRtcCBeIHZhbCkgJiBHSUNSX1BST1BCQVNFUl9TSEFSRUFCSUxJVFlfTUFTSykgeworCQlpZiAoISh0bXAgJiBHSUNSX1BST1BCQVNFUl9TSEFSRUFCSUxJVFlfTUFTSykpIHsKKwkJCS8qCisJCQkgKiBUaGUgSFcgcmVwb3J0cyBub24tc2hhcmVhYmxlLCB3ZSBtdXN0CisJCQkgKiByZW1vdmUgdGhlIGNhY2hlYWJpbGl0eSBhdHRyaWJ1dGVzIGFzCisJCQkgKiB3ZWxsLgorCQkJICovCisJCQl2YWwgJj0gfihHSUNSX1BST1BCQVNFUl9TSEFSRUFCSUxJVFlfTUFTSyB8CisJCQkJIEdJQ1JfUFJPUEJBU0VSX0NBQ0hFQUJJTElUWV9NQVNLKTsKKwkJCXZhbCB8PSBHSUNSX1BST1BCQVNFUl9uQzsKKwkJCXdyaXRlcV9yZWxheGVkKHZhbCwgcmJhc2UgKyBHSUNSX1BST1BCQVNFUik7CisJCX0KIAkJcHJfaW5mb19vbmNlKCJHSUM6IHVzaW5nIGNhY2hlIGZsdXNoaW5nIGZvciBMUEkgcHJvcGVydHkgdGFibGVcbiIpOwogCQlnaWNfcmRpc3RzLT5mbGFncyB8PSBSRElTVF9GTEFHU19QUk9QQkFTRV9ORUVEU19GTFVTSElORzsKIAl9CiAKIAkvKiBzZXQgUEVOREJBU0UgKi8KIAl2YWwgPSAocGFnZV90b19waHlzKHBlbmRfcGFnZSkgfAotCSAgICAgICBHSUNSX1BST1BCQVNFUl9Jbm5lclNoYXJlYWJsZSB8Ci0JICAgICAgIEdJQ1JfUFJPUEJBU0VSX1dhV2IpOworCSAgICAgICBHSUNSX1BFTkRCQVNFUl9Jbm5lclNoYXJlYWJsZSB8CisJICAgICAgIEdJQ1JfUEVOREJBU0VSX1dhV2IpOwogCiAJd3JpdGVxX3JlbGF4ZWQodmFsLCByYmFzZSArIEdJQ1JfUEVOREJBU0VSKTsKKwl0bXAgPSByZWFkcV9yZWxheGVkKHJiYXNlICsgR0lDUl9QRU5EQkFTRVIpOworCisJaWYgKCEodG1wICYgR0lDUl9QRU5EQkFTRVJfU0hBUkVBQklMSVRZX01BU0spKSB7CisJCS8qCisJCSAqIFRoZSBIVyByZXBvcnRzIG5vbi1zaGFyZWFibGUsIHdlIG11c3QgcmVtb3ZlIHRoZQorCQkgKiBjYWNoZWFiaWxpdHkgYXR0cmlidXRlcyBhcyB3ZWxsLgorCQkgKi8KKwkJdmFsICY9IH4oR0lDUl9QRU5EQkFTRVJfU0hBUkVBQklMSVRZX01BU0sgfAorCQkJIEdJQ1JfUEVOREJBU0VSX0NBQ0hFQUJJTElUWV9NQVNLKTsKKwkJdmFsIHw9IEdJQ1JfUEVOREJBU0VSX25DOworCQl3cml0ZXFfcmVsYXhlZCh2YWwsIHJiYXNlICsgR0lDUl9QRU5EQkFTRVIpOworCX0KIAogCS8qIEVuYWJsZSBMUElzICovCiAJdmFsID0gcmVhZGxfcmVsYXhlZChyYmFzZSArIEdJQ1JfQ1RMUik7CkBAIC0xMDI2LDcgKzEwNTMsNyBAQAogCQkJICogVGhpcyBJVFMgd2FudHMgYSBsaW5lYXIgQ1BVIG51bWJlci4KIAkJCSAqLwogCQkJdGFyZ2V0ID0gcmVhZHFfcmVsYXhlZChnaWNfZGF0YV9yZGlzdF9yZF9iYXNlKCkgKyBHSUNSX1RZUEVSKTsKLQkJCXRhcmdldCA9IEdJQ1JfVFlQRVJfQ1BVX05VTUJFUih0YXJnZXQpOworCQkJdGFyZ2V0ID0gR0lDUl9UWVBFUl9DUFVfTlVNQkVSKHRhcmdldCkgPDwgMTY7CiAJCX0KIAogCQkvKiBQZXJmb3JtIGNvbGxlY3Rpb24gbWFwcGluZyAqLwpAQCAtMTQyMiwxNCArMTQ0OSwyNiBAQAogCiAJd3JpdGVxX3JlbGF4ZWQoYmFzZXIsIGl0cy0+YmFzZSArIEdJVFNfQ0JBU0VSKTsKIAl0bXAgPSByZWFkcV9yZWxheGVkKGl0cy0+YmFzZSArIEdJVFNfQ0JBU0VSKTsKLQl3cml0ZXFfcmVsYXhlZCgwLCBpdHMtPmJhc2UgKyBHSVRTX0NXUklURVIpOwotCXdyaXRlbF9yZWxheGVkKEdJVFNfQ1RMUl9FTkFCTEUsIGl0cy0+YmFzZSArIEdJVFNfQ1RMUik7CiAKLQlpZiAoKHRtcCBeIGJhc2VyKSAmIEdJVFNfQkFTRVJfU0hBUkVBQklMSVRZX01BU0spIHsKKwlpZiAoKHRtcCBeIGJhc2VyKSAmIEdJVFNfQ0JBU0VSX1NIQVJFQUJJTElUWV9NQVNLKSB7CisJCWlmICghKHRtcCAmIEdJVFNfQ0JBU0VSX1NIQVJFQUJJTElUWV9NQVNLKSkgeworCQkJLyoKKwkJCSAqIFRoZSBIVyByZXBvcnRzIG5vbi1zaGFyZWFibGUsIHdlIG11c3QKKwkJCSAqIHJlbW92ZSB0aGUgY2FjaGVhYmlsaXR5IGF0dHJpYnV0ZXMgYXMKKwkJCSAqIHdlbGwuCisJCQkgKi8KKwkJCWJhc2VyICY9IH4oR0lUU19DQkFTRVJfU0hBUkVBQklMSVRZX01BU0sgfAorCQkJCSAgIEdJVFNfQ0JBU0VSX0NBQ0hFQUJJTElUWV9NQVNLKTsKKwkJCWJhc2VyIHw9IEdJVFNfQ0JBU0VSX25DOworCQkJd3JpdGVxX3JlbGF4ZWQoYmFzZXIsIGl0cy0+YmFzZSArIEdJVFNfQ0JBU0VSKTsKKwkJfQogCQlwcl9pbmZvKCJJVFM6IHVzaW5nIGNhY2hlIGZsdXNoaW5nIGZvciBjbWQgcXVldWVcbiIpOwogCQlpdHMtPmZsYWdzIHw9IElUU19GTEFHU19DTURRX05FRURTX0ZMVVNISU5HOwogCX0KIAorCXdyaXRlcV9yZWxheGVkKDAsIGl0cy0+YmFzZSArIEdJVFNfQ1dSSVRFUik7CisJd3JpdGVsX3JlbGF4ZWQoR0lUU19DVExSX0VOQUJMRSwgaXRzLT5iYXNlICsgR0lUU19DVExSKTsKKwogCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woaXRzLT5tc2lfY2hpcC5vZl9ub2RlLCAibXNpLWNvbnRyb2xsZXIiKSkgewogCQlpdHMtPmRvbWFpbiA9IGlycV9kb21haW5fYWRkX3RyZWUoTlVMTCwgJml0c19kb21haW5fb3BzLCBpdHMpOwogCQlpZiAoIWl0cy0+ZG9tYWluKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS1naWMtdjMuYwppbmRleCBmZDg4NTBkLi40ZjJmYjYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy12My5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLXYzLmMKQEAgLTE5NSw2ICsxOTUsMTkgQEAKIC8qCiAgKiBSb3V0aW5lcyB0byBkaXNhYmxlLCBlbmFibGUsIEVPSSBhbmQgcm91dGUgaW50ZXJydXB0cwogICovCitzdGF0aWMgaW50IGdpY19wZWVrX2lycShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHUzMiBvZmZzZXQpCit7CisJdTMyIG1hc2sgPSAxIDw8IChnaWNfaXJxKGQpICUgMzIpOworCXZvaWQgX19pb21lbSAqYmFzZTsKKworCWlmIChnaWNfaXJxX2luX3JkaXN0KGQpKQorCQliYXNlID0gZ2ljX2RhdGFfcmRpc3Rfc2dpX2Jhc2UoKTsKKwllbHNlCisJCWJhc2UgPSBnaWNfZGF0YS5kaXN0X2Jhc2U7CisKKwlyZXR1cm4gISEocmVhZGxfcmVsYXhlZChiYXNlICsgb2Zmc2V0ICsgKGdpY19pcnEoZCkgLyAzMikgKiA0KSAmIG1hc2spOworfQorCiBzdGF0aWMgdm9pZCBnaWNfcG9rZV9pcnEoc3RydWN0IGlycV9kYXRhICpkLCB1MzIgb2Zmc2V0KQogewogCXUzMiBtYXNrID0gMSA8PCAoZ2ljX2lycShkKSAlIDMyKTsKQEAgLTIyMyw2ICsyMzYsNjEgQEAKIAlnaWNfcG9rZV9pcnEoZCwgR0lDRF9JU0VOQUJMRVIpOwogfQogCitzdGF0aWMgaW50IGdpY19pcnFfc2V0X2lycWNoaXBfc3RhdGUoc3RydWN0IGlycV9kYXRhICpkLAorCQkJCSAgICAgZW51bSBpcnFjaGlwX2lycV9zdGF0ZSB3aGljaCwgYm9vbCB2YWwpCit7CisJdTMyIHJlZzsKKworCWlmIChkLT5od2lycSA+PSBnaWNfZGF0YS5pcnFfbnIpIC8qIFBQSS9TUEkgb25seSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAod2hpY2gpIHsKKwljYXNlIElSUUNISVBfU1RBVEVfUEVORElORzoKKwkJcmVnID0gdmFsID8gR0lDRF9JU1BFTkRSIDogR0lDRF9JQ1BFTkRSOworCQlicmVhazsKKworCWNhc2UgSVJRQ0hJUF9TVEFURV9BQ1RJVkU6CisJCXJlZyA9IHZhbCA/IEdJQ0RfSVNBQ1RJVkVSIDogR0lDRF9JQ0FDVElWRVI7CisJCWJyZWFrOworCisJY2FzZSBJUlFDSElQX1NUQVRFX01BU0tFRDoKKwkJcmVnID0gdmFsID8gR0lDRF9JQ0VOQUJMRVIgOiBHSUNEX0lTRU5BQkxFUjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlnaWNfcG9rZV9pcnEoZCwgcmVnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnaWNfaXJxX2dldF9pcnFjaGlwX3N0YXRlKHN0cnVjdCBpcnFfZGF0YSAqZCwKKwkJCQkgICAgIGVudW0gaXJxY2hpcF9pcnFfc3RhdGUgd2hpY2gsIGJvb2wgKnZhbCkKK3sKKwlpZiAoZC0+aHdpcnEgPj0gZ2ljX2RhdGEuaXJxX25yKSAvKiBQUEkvU1BJIG9ubHkgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHdoaWNoKSB7CisJY2FzZSBJUlFDSElQX1NUQVRFX1BFTkRJTkc6CisJCSp2YWwgPSBnaWNfcGVla19pcnEoZCwgR0lDRF9JU1BFTkRSKTsKKwkJYnJlYWs7CisKKwljYXNlIElSUUNISVBfU1RBVEVfQUNUSVZFOgorCQkqdmFsID0gZ2ljX3BlZWtfaXJxKGQsIEdJQ0RfSVNBQ1RJVkVSKTsKKwkJYnJlYWs7CisKKwljYXNlIElSUUNISVBfU1RBVEVfTUFTS0VEOgorCQkqdmFsID0gIWdpY19wZWVrX2lycShkLCBHSUNEX0lTRU5BQkxFUik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGdpY19lb2lfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAlnaWNfd3JpdGVfZW9pcihnaWNfaXJxKGQpKTsKQEAgLTQxOCwxOSArNDg2LDYgQEAKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyBpbnQgZ2ljX3BlZWtfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCwgdTMyIG9mZnNldCkKLXsKLQl1MzIgbWFzayA9IDEgPDwgKGdpY19pcnEoZCkgJSAzMik7Ci0Jdm9pZCBfX2lvbWVtICpiYXNlOwotCi0JaWYgKGdpY19pcnFfaW5fcmRpc3QoZCkpCi0JCWJhc2UgPSBnaWNfZGF0YV9yZGlzdF9zZ2lfYmFzZSgpOwotCWVsc2UKLQkJYmFzZSA9IGdpY19kYXRhLmRpc3RfYmFzZTsKLQotCXJldHVybiAhIShyZWFkbF9yZWxheGVkKGJhc2UgKyBvZmZzZXQgKyAoZ2ljX2lycShkKSAvIDMyKSAqIDQpICYgbWFzayk7Ci19Ci0KIHN0YXRpYyBpbnQgZ2ljX3NlY29uZGFyeV9pbml0KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAogCQkJICAgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7CkBAIC02MDEsNiArNjU2LDggQEAKIAkuaXJxX2VvaQkJPSBnaWNfZW9pX2lycSwKIAkuaXJxX3NldF90eXBlCQk9IGdpY19zZXRfdHlwZSwKIAkuaXJxX3NldF9hZmZpbml0eQk9IGdpY19zZXRfYWZmaW5pdHksCisJLmlycV9nZXRfaXJxY2hpcF9zdGF0ZQk9IGdpY19pcnFfZ2V0X2lycWNoaXBfc3RhdGUsCisJLmlycV9zZXRfaXJxY2hpcF9zdGF0ZQk9IGdpY19pcnFfc2V0X2lycWNoaXBfc3RhdGUsCiB9OwogCiAjZGVmaW5lIEdJQ19JRF9OUgkJKDFVIDw8IGdpY19kYXRhLnJkaXN0cy5pZF9iaXRzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtZ2ljLmMKaW5kZXggNDcxZTFjZC4uYTZjZTM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1naWMuYworKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLWdpYy5jCkBAIC0xNTEsMTMgKzE1MSwyNCBAQAogLyoKICAqIFJvdXRpbmVzIHRvIGFja25vd2xlZGdlLCBkaXNhYmxlIGFuZCBlbmFibGUgaW50ZXJydXB0cwogICovCi1zdGF0aWMgdm9pZCBnaWNfbWFza19pcnEoc3RydWN0IGlycV9kYXRhICpkKQorc3RhdGljIHZvaWQgZ2ljX3Bva2VfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCwgdTMyIG9mZnNldCkKIHsKIAl1MzIgbWFzayA9IDEgPDwgKGdpY19pcnEoZCkgJSAzMik7CisJd3JpdGVsX3JlbGF4ZWQobWFzaywgZ2ljX2Rpc3RfYmFzZShkKSArIG9mZnNldCArIChnaWNfaXJxKGQpIC8gMzIpICogNCk7Cit9CisKK3N0YXRpYyBpbnQgZ2ljX3BlZWtfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCwgdTMyIG9mZnNldCkKK3sKKwl1MzIgbWFzayA9IDEgPDwgKGdpY19pcnEoZCkgJSAzMik7CisJcmV0dXJuICEhKHJlYWRsX3JlbGF4ZWQoZ2ljX2Rpc3RfYmFzZShkKSArIG9mZnNldCArIChnaWNfaXJxKGQpIC8gMzIpICogNCkgJiBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgZ2ljX21hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7Ci0Jd3JpdGVsX3JlbGF4ZWQobWFzaywgZ2ljX2Rpc3RfYmFzZShkKSArIEdJQ19ESVNUX0VOQUJMRV9DTEVBUiArIChnaWNfaXJxKGQpIC8gMzIpICogNCk7CisJZ2ljX3Bva2VfaXJxKGQsIEdJQ19ESVNUX0VOQUJMRV9DTEVBUik7CiAJaWYgKGdpY19hcmNoX2V4dG4uaXJxX21hc2spCiAJCWdpY19hcmNoX2V4dG4uaXJxX21hc2soZCk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jb250cm9sbGVyX2xvY2ssIGZsYWdzKTsKQEAgLTE2NSwxMyArMTc2LDEyIEBACiAKIHN0YXRpYyB2b2lkIGdpY191bm1hc2tfaXJxKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKLQl1MzIgbWFzayA9IDEgPDwgKGdpY19pcnEoZCkgJSAzMik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2NvbnRyb2xsZXJfbG9jaywgZmxhZ3MpOwogCWlmIChnaWNfYXJjaF9leHRuLmlycV91bm1hc2spCiAJCWdpY19hcmNoX2V4dG4uaXJxX3VubWFzayhkKTsKLQl3cml0ZWxfcmVsYXhlZChtYXNrLCBnaWNfZGlzdF9iYXNlKGQpICsgR0lDX0RJU1RfRU5BQkxFX1NFVCArIChnaWNfaXJxKGQpIC8gMzIpICogNCk7CisJZ2ljX3Bva2VfaXJxKGQsIEdJQ19ESVNUX0VOQUJMRV9TRVQpOwogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfY29udHJvbGxlcl9sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTE4Niw2ICsxOTYsNTUgQEAKIAl3cml0ZWxfcmVsYXhlZChnaWNfaXJxKGQpLCBnaWNfY3B1X2Jhc2UoZCkgKyBHSUNfQ1BVX0VPSSk7CiB9CiAKK3N0YXRpYyBpbnQgZ2ljX2lycV9zZXRfaXJxY2hpcF9zdGF0ZShzdHJ1Y3QgaXJxX2RhdGEgKmQsCisJCQkJICAgICBlbnVtIGlycWNoaXBfaXJxX3N0YXRlIHdoaWNoLCBib29sIHZhbCkKK3sKKwl1MzIgcmVnOworCisJc3dpdGNoICh3aGljaCkgeworCWNhc2UgSVJRQ0hJUF9TVEFURV9QRU5ESU5HOgorCQlyZWcgPSB2YWwgPyBHSUNfRElTVF9QRU5ESU5HX1NFVCA6IEdJQ19ESVNUX1BFTkRJTkdfQ0xFQVI7CisJCWJyZWFrOworCisJY2FzZSBJUlFDSElQX1NUQVRFX0FDVElWRToKKwkJcmVnID0gdmFsID8gR0lDX0RJU1RfQUNUSVZFX1NFVCA6IEdJQ19ESVNUX0FDVElWRV9DTEVBUjsKKwkJYnJlYWs7CisKKwljYXNlIElSUUNISVBfU1RBVEVfTUFTS0VEOgorCQlyZWcgPSB2YWwgPyBHSUNfRElTVF9FTkFCTEVfQ0xFQVIgOiBHSUNfRElTVF9FTkFCTEVfU0VUOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWdpY19wb2tlX2lycShkLCByZWcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdpY19pcnFfZ2V0X2lycWNoaXBfc3RhdGUoc3RydWN0IGlycV9kYXRhICpkLAorCQkJCSAgICAgIGVudW0gaXJxY2hpcF9pcnFfc3RhdGUgd2hpY2gsIGJvb2wgKnZhbCkKK3sKKwlzd2l0Y2ggKHdoaWNoKSB7CisJY2FzZSBJUlFDSElQX1NUQVRFX1BFTkRJTkc6CisJCSp2YWwgPSBnaWNfcGVla19pcnEoZCwgR0lDX0RJU1RfUEVORElOR19TRVQpOworCQlicmVhazsKKworCWNhc2UgSVJRQ0hJUF9TVEFURV9BQ1RJVkU6CisJCSp2YWwgPSBnaWNfcGVla19pcnEoZCwgR0lDX0RJU1RfQUNUSVZFX1NFVCk7CisJCWJyZWFrOworCisJY2FzZSBJUlFDSElQX1NUQVRFX01BU0tFRDoKKwkJKnZhbCA9ICFnaWNfcGVla19pcnEoZCwgR0lDX0RJU1RfRU5BQkxFX1NFVCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZ2ljX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpCiB7CiAJdm9pZCBfX2lvbWVtICpiYXNlID0gZ2ljX2Rpc3RfYmFzZShkKTsKQEAgLTMyOSw2ICszODgsOCBAQAogCS5pcnFfc2V0X2FmZmluaXR5CT0gZ2ljX3NldF9hZmZpbml0eSwKICNlbmRpZgogCS5pcnFfc2V0X3dha2UJCT0gZ2ljX3NldF93YWtlLAorCS5pcnFfZ2V0X2lycWNoaXBfc3RhdGUJPSBnaWNfaXJxX2dldF9pcnFjaGlwX3N0YXRlLAorCS5pcnFfc2V0X2lycWNoaXBfc3RhdGUJPSBnaWNfaXJxX3NldF9pcnFjaGlwX3N0YXRlLAogfTsKIAogdm9pZCBfX2luaXQgZ2ljX2Nhc2NhZGVfaXJxKHVuc2lnbmVkIGludCBnaWNfbnIsIHVuc2lnbmVkIGludCBpcnEpCkBAIC0zNTMsNyArNDE0LDcgQEAKIAkJCWJyZWFrOwogCX0KIAotCWlmICghbWFzaykKKwlpZiAoIW1hc2sgJiYgbnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDEpCiAJCXByX2NyaXQoIkdJQyBDUFUgbWFzayBub3QgZm91bmQgLSBrZXJuZWwgd2lsbCBmYWlsIHRvIGJvb3QuXG4iKTsKIAogCXJldHVybiBtYXNrOwpAQCAtODAyLDE1ICs4NjMsMTIgQEAKIAkJaXJxX2RvbWFpbl9zZXRfaW5mbyhkLCBpcnEsIGh3LCAmZ2ljX2NoaXAsIGQtPmhvc3RfZGF0YSwKIAkJCQkgICAgaGFuZGxlX2Zhc3Rlb2lfaXJxLCBOVUxMLCBOVUxMKTsKIAkJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQgfCBJUlFGX1BST0JFKTsKLQotCQlnaWNfcm91dGFibGVfaXJxX2RvbWFpbl9vcHMtPm1hcChkLCBpcnEsIGh3KTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGdpY19pcnFfZG9tYWluX3VubWFwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgaXJxKQogewotCWdpY19yb3V0YWJsZV9pcnFfZG9tYWluX29wcy0+dW5tYXAoZCwgaXJxKTsKIH0KIAogc3RhdGljIGludCBnaWNfaXJxX2RvbWFpbl94bGF0ZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwKQEAgLTgyOSwxNiArODg3LDggQEAKIAkqb3V0X2h3aXJxID0gaW50c3BlY1sxXSArIDE2OwogCiAJLyogRm9yIFNQSXMsIHdlIG5lZWQgdG8gYWRkIDE2IG1vcmUgdG8gZ2V0IHRoZSBHSUMgaXJxIElEIG51bWJlciAqLwotCWlmICghaW50c3BlY1swXSkgewotCQlyZXQgPSBnaWNfcm91dGFibGVfaXJxX2RvbWFpbl9vcHMtPnhsYXRlKGQsIGNvbnRyb2xsZXIsCi0JCQkJCQkJIGludHNwZWMsCi0JCQkJCQkJIGludHNpemUsCi0JCQkJCQkJIG91dF9od2lycSwKLQkJCQkJCQkgb3V0X3R5cGUpOwotCi0JCWlmIChJU19FUlJfVkFMVUUocmV0KSkKLQkJCXJldHVybiByZXQ7Ci0JfQorCWlmICghaW50c3BlY1swXSkKKwkJKm91dF9od2lycSArPSAxNjsKIAogCSpvdXRfdHlwZSA9IGludHNwZWNbMl0gJiBJUlFfVFlQRV9TRU5TRV9NQVNLOwogCkBAIC04OTUsMzcgKzk0NSwxMSBAQAogCS54bGF0ZSA9IGdpY19pcnFfZG9tYWluX3hsYXRlLAogfTsKIAotLyogRGVmYXVsdCBmdW5jdGlvbnMgZm9yIHJvdXRhYmxlIGlycSBkb21haW4gKi8KLXN0YXRpYyBpbnQgZ2ljX3JvdXRhYmxlX2lycV9kb21haW5fbWFwKHN0cnVjdCBpcnFfZG9tYWluICpkLCB1bnNpZ25lZCBpbnQgaXJxLAotCQkJICAgICAgaXJxX2h3X251bWJlcl90IGh3KQordm9pZCBnaWNfc2V0X2lycWNoaXBfZmxhZ3ModW5zaWduZWQgbG9uZyBmbGFncykKIHsKLQlyZXR1cm4gMDsKKwlnaWNfY2hpcC5mbGFncyB8PSBmbGFnczsKIH0KIAotc3RhdGljIHZvaWQgZ2ljX3JvdXRhYmxlX2lycV9kb21haW5fdW5tYXAoc3RydWN0IGlycV9kb21haW4gKmQsCi0JCQkJCSAgdW5zaWduZWQgaW50IGlycSkKLXsKLX0KLQotc3RhdGljIGludCBnaWNfcm91dGFibGVfaXJxX2RvbWFpbl94bGF0ZShzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwKLQkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbnRyb2xsZXIsCi0JCQkJY29uc3QgdTMyICppbnRzcGVjLCB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKLQkJCQl1bnNpZ25lZCBsb25nICpvdXRfaHdpcnEsCi0JCQkJdW5zaWduZWQgaW50ICpvdXRfdHlwZSkKLXsKLQkqb3V0X2h3aXJxICs9IDE2OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIGdpY19kZWZhdWx0X3JvdXRhYmxlX2lycV9kb21haW5fb3BzID0gewotCS5tYXAgPSBnaWNfcm91dGFibGVfaXJxX2RvbWFpbl9tYXAsCi0JLnVubWFwID0gZ2ljX3JvdXRhYmxlX2lycV9kb21haW5fdW5tYXAsCi0JLnhsYXRlID0gZ2ljX3JvdXRhYmxlX2lycV9kb21haW5feGxhdGUsCi19OwotCi1jb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgKmdpY19yb3V0YWJsZV9pcnFfZG9tYWluX29wcyA9Ci0JCQkJCSZnaWNfZGVmYXVsdF9yb3V0YWJsZV9pcnFfZG9tYWluX29wczsKLQogdm9pZCBfX2luaXQgZ2ljX2luaXRfYmFzZXModW5zaWduZWQgaW50IGdpY19uciwgaW50IGlycV9zdGFydCwKIAkJCSAgIHZvaWQgX19pb21lbSAqZGlzdF9iYXNlLCB2b2lkIF9faW9tZW0gKmNwdV9iYXNlLAogCQkJICAgdTMyIHBlcmNwdV9vZmZzZXQsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKQEAgLTkzMyw3ICs5NTcsNiBAQAogCWlycV9od19udW1iZXJfdCBod2lycV9iYXNlOwogCXN0cnVjdCBnaWNfY2hpcF9kYXRhICpnaWM7CiAJaW50IGdpY19pcnFzLCBpcnFfYmFzZSwgaTsKLQlpbnQgbnJfcm91dGFibGVfaXJxczsKIAogCUJVR19PTihnaWNfbnIgPj0gTUFYX0dJQ19OUik7CiAKQEAgLTk4OSwxNSArMTAxMiw5IEBACiAJZ2ljLT5naWNfaXJxcyA9IGdpY19pcnFzOwogCiAJaWYgKG5vZGUpIHsJCS8qIERUIGNhc2UgKi8KLQkJY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzICpvcHMgPSAmZ2ljX2lycV9kb21haW5faGllcmFyY2h5X29wczsKLQotCQlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKG5vZGUsICJhcm0scm91dGFibGUtaXJxcyIsCi0JCQkJCSAgJm5yX3JvdXRhYmxlX2lycXMpKSB7Ci0JCQlvcHMgPSAmZ2ljX2lycV9kb21haW5fb3BzOwotCQkJZ2ljX2lycXMgPSBucl9yb3V0YWJsZV9pcnFzOwotCQl9Ci0KLQkJZ2ljLT5kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIobm9kZSwgZ2ljX2lycXMsIG9wcywgZ2ljKTsKKwkJZ2ljLT5kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIobm9kZSwgZ2ljX2lycXMsCisJCQkJCQkgICAgJmdpY19pcnFfZG9tYWluX2hpZXJhcmNoeV9vcHMsCisJCQkJCQkgICAgZ2ljKTsKIAl9IGVsc2UgewkJLyogTm9uLURUIGNhc2UgKi8KIAkJLyoKIAkJICogRm9yIHByaW1hcnkgR0lDcywgc2tpcCBvdmVyIFNHSXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lycWNoaXAvaXJxLW1pcHMtZ2ljLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLW1pcHMtZ2ljLmMKaW5kZXggOWFjZGMwOC4uZjJkMjY5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pcnFjaGlwL2lycS1taXBzLWdpYy5jCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtbWlwcy1naWMuYwpAQCAtMTY2LDYgKzE2NiwyNyBAQAogCiAJcmV0dXJuICgoKGN5Y2xlX3QpIGhpKSA8PCAzMikgKyBsbzsKIH0KKwordm9pZCBnaWNfc3RhcnRfY291bnQodm9pZCkKK3sKKwl1MzIgZ2ljY29uZmlnOworCisJLyogU3RhcnQgdGhlIGNvdW50ZXIgKi8KKwlnaWNjb25maWcgPSBnaWNfcmVhZChHSUNfUkVHKFNIQVJFRCwgR0lDX1NIX0NPTkZJRykpOworCWdpY2NvbmZpZyAmPSB+KDEgPDwgR0lDX1NIX0NPTkZJR19DT1VOVFNUT1BfU0hGKTsKKwlnaWNfd3JpdGUoR0lDX1JFRyhTSEFSRUQsIEdJQ19TSF9DT05GSUcpLCBnaWNjb25maWcpOworfQorCit2b2lkIGdpY19zdG9wX2NvdW50KHZvaWQpCit7CisJdTMyIGdpY2NvbmZpZzsKKworCS8qIFN0b3AgdGhlIGNvdW50ZXIgKi8KKwlnaWNjb25maWcgPSBnaWNfcmVhZChHSUNfUkVHKFNIQVJFRCwgR0lDX1NIX0NPTkZJRykpOworCWdpY2NvbmZpZyB8PSAxIDw8IEdJQ19TSF9DT05GSUdfQ09VTlRTVE9QX1NIRjsKKwlnaWNfd3JpdGUoR0lDX1JFRyhTSEFSRUQsIEdJQ19TSF9DT05GSUcpLCBnaWNjb25maWcpOworfQorCiAjZW5kaWYKIAogc3RhdGljIGJvb2wgZ2ljX2xvY2FsX2lycV9pc19yb3V0YWJsZShpbnQgaW50cikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtcmVuZXNhcy1pcnFjLmMgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXJlbmVzYXMtaXJxYy5jCmluZGV4IDM4NGU2ZWQuLmNkZjgwYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtcmVuZXNhcy1pcnFjLmMKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1yZW5lc2FzLWlycWMuYwpAQCAtMTcsNiArMTcsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogICovCiAKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTI5LDE1ICszMCwyNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2lycS1yZW5lc2FzLWlycWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKLSNkZWZpbmUgSVJRQ19JUlFfTUFYIDMyIC8qIG1heGltdW0gMzIgaW50ZXJydXB0cyBwZXIgZHJpdmVyIGluc3RhbmNlICovCisjZGVmaW5lIElSUUNfSVJRX01BWAkzMgkvKiBtYXhpbXVtIDMyIGludGVycnVwdHMgcGVyIGRyaXZlciBpbnN0YW5jZSAqLwogCi0jZGVmaW5lIElSUUNfUkVRX1NUUyAweDAwCi0jZGVmaW5lIElSUUNfRU5fU1RTIDB4MDQKLSNkZWZpbmUgSVJRQ19FTl9TRVQgMHgwOAorI2RlZmluZSBJUlFDX1JFUV9TVFMJMHgwMAkvKiBJbnRlcnJ1cHQgUmVxdWVzdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSVJRQ19FTl9TVFMJMHgwNAkvKiBJbnRlcnJ1cHQgRW5hYmxlIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBJUlFDX0VOX1NFVAkweDA4CS8qIEludGVycnVwdCBFbmFibGUgU2V0IFJlZ2lzdGVyICovCiAjZGVmaW5lIElSUUNfSU5UX0NQVV9CQVNFKG4pICgweDAwMCArICgobikgKiAweDEwKSkKLSNkZWZpbmUgREVURUNUX1NUQVRVUyAweDEwMAorCQkJCS8qIFNZUy1DUFUgdnMuIFJULUNQVSAqLworI2RlZmluZSBERVRFQ1RfU1RBVFVTCTB4MTAwCS8qIElSUW4gRGV0ZWN0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBNT05JVE9SCQkweDEwNAkvKiBJUlFuIFNpZ25hbCBMZXZlbCBNb25pdG9yIFJlZ2lzdGVyICovCisjZGVmaW5lIEhMVkxfU1RTCTB4MTA4CS8qIElSUW4gSGlnaCBMZXZlbCBEZXRlY3QgU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIExMVkxfU1RTCTB4MTBjCS8qIElSUW4gTG93IExldmVsIERldGVjdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgU19SX0VER0VfU1RTCTB4MTEwCS8qIElSUW4gU3luYyBSaXNpbmcgRWRnZSBEZXRlY3QgU3RhdHVzIFJlZy4gKi8KKyNkZWZpbmUgU19GX0VER0VfU1RTCTB4MTE0CS8qIElSUW4gU3luYyBGYWxsaW5nIEVkZ2UgRGV0ZWN0IFN0YXR1cyBSZWcuICovCisjZGVmaW5lIEFfUl9FREdFX1NUUwkweDExOAkvKiBJUlFuIEFzeW5jIFJpc2luZyBFZGdlIERldGVjdCBTdGF0dXMgUmVnLiAqLworI2RlZmluZSBBX0ZfRURHRV9TVFMJMHgxMWMJLyogSVJRbiBBc3luYyBGYWxsaW5nIEVkZ2UgRGV0ZWN0IFN0YXR1cyBSZWcuICovCisjZGVmaW5lIENIVEVOX1NUUwkweDEyMAkvKiBDaGF0dGVyaW5nIFJlZHVjdGlvbiBTdGF0dXMgUmVnaXN0ZXIgKi8KICNkZWZpbmUgSVJRQ19DT05GSUcobikgKDB4MTgwICsgKChuKSAqIDB4MDQpKQorCQkJCS8qIElSUW4gQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwogCiBzdHJ1Y3QgaXJxY19pcnEgewogCWludCBod19pcnE7CkBAIC01NSw2ICs2Nyw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzdHJ1Y3QgaXJxX2NoaXAgaXJxX2NoaXA7CiAJc3RydWN0IGlycV9kb21haW4gKmlycV9kb21haW47CisJc3RydWN0IGNsayAqY2xrOwogfTsKIAogc3RhdGljIHZvaWQgaXJxY19kYmcoc3RydWN0IGlycWNfaXJxICppLCBjaGFyICpzdHIpCkBAIC05NCw3ICsxMDcsNyBAQAogCXN0cnVjdCBpcnFjX3ByaXYgKnAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAlpbnQgaHdfaXJxID0gaXJxZF90b19od2lycShkKTsKIAl1bnNpZ25lZCBjaGFyIHZhbHVlID0gaXJxY19zZW5zZVt0eXBlICYgSVJRX1RZUEVfU0VOU0VfTUFTS107Ci0JdW5zaWduZWQgbG9uZyB0bXA7CisJdTMyIHRtcDsKIAogCWlycWNfZGJnKCZwLT5pcnFbaHdfaXJxXSwgInNlbnNlIik7CiAKQEAgLTEwOCwxMSArMTIxLDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaXJxY19pcnFfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pCit7CisJc3RydWN0IGlycWNfcHJpdiAqcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCisJaWYgKCFwLT5jbGspCisJCXJldHVybiAwOworCisJaWYgKG9uKQorCQljbGtfZW5hYmxlKHAtPmNsayk7CisJZWxzZQorCQljbGtfZGlzYWJsZShwLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpcnFyZXR1cm5fdCBpcnFjX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgaXJxY19pcnEgKmkgPSBkZXZfaWQ7CiAJc3RydWN0IGlycWNfcHJpdiAqcCA9IGktPnA7Ci0JdW5zaWduZWQgbG9uZyBiaXQgPSBCSVQoaS0+aHdfaXJxKTsKKwl1MzIgYml0ID0gQklUKGktPmh3X2lycSk7CiAKIAlpcnFjX2RiZyhpLCAiZGVtdXgxIik7CiAKQEAgLTE3MCw2ICsxOTgsMTUgQEAKIAlwLT5wZGV2ID0gcGRldjsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwKTsKIAorCXAtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHAtPmNsaykpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgY2xvY2tcbiIpOworCQlwLT5jbGsgPSBOVUxMOworCX0KKworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBkZXYtPmRldik7CisKIAkvKiBnZXQgaG9sZCBvZiBtYW5hZGF0b3J5IElPTUVNICovCiAJaW8gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghaW8pIHsKQEAgLTIxMCw3ICsyNDcsOCBAQAogCWlycV9jaGlwLT5pcnFfbWFzayA9IGlycWNfaXJxX2Rpc2FibGU7CiAJaXJxX2NoaXAtPmlycV91bm1hc2sgPSBpcnFjX2lycV9lbmFibGU7CiAJaXJxX2NoaXAtPmlycV9zZXRfdHlwZSA9IGlycWNfaXJxX3NldF90eXBlOwotCWlycV9jaGlwLT5mbGFncwk9IElSUUNISVBfU0tJUF9TRVRfV0FLRSB8IElSUUNISVBfTUFTS19PTl9TVVNQRU5EOworCWlycV9jaGlwLT5pcnFfc2V0X3dha2UgPSBpcnFjX2lycV9zZXRfd2FrZTsKKwlpcnFfY2hpcC0+ZmxhZ3MJPSBJUlFDSElQX01BU0tfT05fU1VTUEVORDsKIAogCXAtPmlycV9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9zaW1wbGUocGRldi0+ZGV2Lm9mX25vZGUsCiAJCQkJCSAgICAgIHAtPm51bWJlcl9vZl9pcnFzLApAQCAtMjUwLDYgKzI4OCw4IEBACiBlcnIyOgogCWlvdW5tYXAocC0+aW9tZW0pOwogZXJyMToKKwlwbV9ydW50aW1lX3B1dCgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAJa2ZyZWUocCk7CiBlcnIwOgogCXJldHVybiByZXQ7CkBAIC0yNjUsNiArMzA1LDggQEAKIAogCWlycV9kb21haW5fcmVtb3ZlKHAtPmlycV9kb21haW4pOwogCWlvdW5tYXAocC0+aW9tZW0pOworCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAlrZnJlZShwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3QuYyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWY0OGE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9pcnFjaGlwL2lycS1zdC5jCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxNCBTVE1pY3JvZWxlY3Ryb25pY3Mg4oCTIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgQXV0aG9yOiBMZWUgSm9uZXMgPGxlZS5qb25lc0BsaW5hcm8ub3JnPgorICoKKyAqICBUaGlzIGlzIGEgcmUtd3JpdGUgb2YgQ2hyaXN0b3BoZSBLZXJlbGxvJ3MgUE1VIGRyaXZlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9pcnEtc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIFNUSUg0MTVfU1lTQ0ZHXzY0MgkJMHgwYTgKKyNkZWZpbmUgU1RJSDQxNl9TWVNDRkdfNzU0MwkJMHg4N2MKKyNkZWZpbmUgU1RJSDQwN19TWVNDRkdfNTEwMgkJMHgxOTgKKyNkZWZpbmUgU1RJRDEyN19TWVNDRkdfNzM0CQkweDA4OAorCisjZGVmaW5lIFNUX0E5X0lSUV9NQVNLCQkJMHgwMDFGRkZGRgorI2RlZmluZSBTVF9BOV9JUlFfTUFYX0NIQU5TCQkyCisKKyNkZWZpbmUgU1RfQTlfSVJRX0VOX0NUSV8wCQlCSVQoMCkKKyNkZWZpbmUgU1RfQTlfSVJRX0VOX0NUSV8xCQlCSVQoMSkKKyNkZWZpbmUgU1RfQTlfSVJRX0VOX1BNVV8wCQlCSVQoMikKKyNkZWZpbmUgU1RfQTlfSVJRX0VOX1BNVV8xCQlCSVQoMykKKyNkZWZpbmUgU1RfQTlfSVJRX0VOX1BMMzEwX0wyCQlCSVQoNCkKKyNkZWZpbmUgU1RfQTlfSVJRX0VOX0VYVF8wCQlCSVQoNSkKKyNkZWZpbmUgU1RfQTlfSVJRX0VOX0VYVF8xCQlCSVQoNikKKyNkZWZpbmUgU1RfQTlfSVJRX0VOX0VYVF8yCQlCSVQoNykKKworI2RlZmluZSBTVF9BOV9GSVFfTl9TRUwoZGV2LCBjaGFuKQkoZGV2IDw8ICg4ICArIChjaGFuICogMykpKQorI2RlZmluZSBTVF9BOV9JUlFfTl9TRUwoZGV2LCBjaGFuKQkoZGV2IDw8ICgxNCArIChjaGFuICogMykpKQorI2RlZmluZSBTVF9BOV9FWFRJUlFfSU5WX1NFTChkZXYpCShkZXYgPDwgMjApCisKK3N0cnVjdCBzdF9pcnFfc3lzY2ZnIHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJdW5zaWduZWQgaW50IHN5c2NmZzsKKwl1bnNpZ25lZCBpbnQgY29uZmlnOworCWJvb2wgZXh0X2ludmVydGVkOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3RfaXJxX3N5c2NmZ19tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNS1pcnEtc3lzY2ZnIiwKKwkJLmRhdGEgPSAodm9pZCAqKVNUSUg0MTVfU1lTQ0ZHXzY0MiwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1pcnEtc3lzY2ZnIiwKKwkJLmRhdGEgPSAodm9pZCAqKVNUSUg0MTZfU1lTQ0ZHXzc1NDMsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gInN0LHN0aWg0MDctaXJxLXN5c2NmZyIsCisJCS5kYXRhID0gKHZvaWQgKilTVElINDA3X1NZU0NGR181MTAyLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJzdCxzdGlkMTI3LWlycS1zeXNjZmciLAorCQkuZGF0YSA9ICh2b2lkICopU1RJRDEyN19TWVNDRkdfNzM0LAorCX0sCisJe30KK307CisKK3N0YXRpYyBpbnQgc3RfaXJxX3hsYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQlpbnQgZGV2aWNlLCBpbnQgY2hhbm5lbCwgYm9vbCBpcnEpCit7CisJc3RydWN0IHN0X2lycV9zeXNjZmcgKmRkYXRhID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCisJLyogU2V0IHRoZSBkZXZpY2UgZW5hYmxlIGJpdC4gKi8KKwlzd2l0Y2ggKGRldmljZSkgeworCWNhc2UgU1RfSVJRX1NZU0NGR19FWFRfMDoKKwkJZGRhdGEtPmNvbmZpZyB8PSBTVF9BOV9JUlFfRU5fRVhUXzA7CisJCWJyZWFrOworCWNhc2UgU1RfSVJRX1NZU0NGR19FWFRfMToKKwkJZGRhdGEtPmNvbmZpZyB8PSBTVF9BOV9JUlFfRU5fRVhUXzE7CisJCWJyZWFrOworCWNhc2UgU1RfSVJRX1NZU0NGR19FWFRfMjoKKwkJZGRhdGEtPmNvbmZpZyB8PSBTVF9BOV9JUlFfRU5fRVhUXzI7CisJCWJyZWFrOworCWNhc2UgU1RfSVJRX1NZU0NGR19DVElfMDoKKwkJZGRhdGEtPmNvbmZpZyB8PSBTVF9BOV9JUlFfRU5fQ1RJXzA7CisJCWJyZWFrOworCWNhc2UgU1RfSVJRX1NZU0NGR19DVElfMToKKwkJZGRhdGEtPmNvbmZpZyB8PSBTVF9BOV9JUlFfRU5fQ1RJXzE7CisJCWJyZWFrOworCWNhc2UgU1RfSVJRX1NZU0NGR19QTVVfMDoKKwkJZGRhdGEtPmNvbmZpZyB8PSBTVF9BOV9JUlFfRU5fUE1VXzA7CisJCWJyZWFrOworCWNhc2UgU1RfSVJRX1NZU0NGR19QTVVfMToKKwkJZGRhdGEtPmNvbmZpZyB8PSBTVF9BOV9JUlFfRU5fUE1VXzE7CisJCWJyZWFrOworCWNhc2UgU1RfSVJRX1NZU0NGR19wbDMxMF9MMjoKKwkJZGRhdGEtPmNvbmZpZyB8PSBTVF9BOV9JUlFfRU5fUEwzMTBfTDI7CisJCWJyZWFrOworCWNhc2UgU1RfSVJRX1NZU0NGR19ESVNBQkxFRDoKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5yZWNvZ25pc2VkIGRldmljZSAlZFxuIiwgZGV2aWNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogU2VsZWN0IElSUS9GSVEgY2hhbm5lbCBmb3IgZGV2aWNlLiAqLworCWRkYXRhLT5jb25maWcgfD0gaXJxID8KKwkJU1RfQTlfSVJRX05fU0VMKGRldmljZSwgY2hhbm5lbCkgOgorCQlTVF9BOV9GSVFfTl9TRUwoZGV2aWNlLCBjaGFubmVsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0X2lycV9zeXNjZmdfZW5hYmxlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBzdF9pcnFfc3lzY2ZnICpkZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlpbnQgY2hhbm5lbHMsIHJldCwgaTsKKwl1MzIgZGV2aWNlLCBpbnZlcnQ7CisKKwljaGFubmVscyA9IG9mX3Byb3BlcnR5X2NvdW50X3UzMl9lbGVtcyhucCwgInN0LGlycS1kZXZpY2UiKTsKKwlpZiAoY2hhbm5lbHMgIT0gU1RfQTlfSVJRX01BWF9DSEFOUykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJzdCxlbmFibGUtaXJxLWRldmljZSBtdXN0IGhhdmUgMiBlbGVtc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNoYW5uZWxzID0gb2ZfcHJvcGVydHlfY291bnRfdTMyX2VsZW1zKG5wLCAic3QsZmlxLWRldmljZSIpOworCWlmIChjaGFubmVscyAhPSBTVF9BOV9JUlFfTUFYX0NIQU5TKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInN0LGVuYWJsZS1maXEtZGV2aWNlIG11c3QgaGF2ZSAyIGVsZW1zXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFNUX0E5X0lSUV9NQVhfQ0hBTlM7IGkrKykgeworCQlvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChucCwgInN0LGlycS1kZXZpY2UiLCBpLCAmZGV2aWNlKTsKKworCQlyZXQgPSBzdF9pcnFfeGxhdGUocGRldiwgZGV2aWNlLCBpLCB0cnVlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobnAsICJzdCxmaXEtZGV2aWNlIiwgaSwgJmRldmljZSk7CisKKwkJcmV0ID0gc3RfaXJxX3hsYXRlKHBkZXYsIGRldmljZSwgaSwgZmFsc2UpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBFeHRlcm5hbCBJUlFzIG1heSBiZSBpbnZlcnRlZC4gKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInN0LGludmVydC1leHQiLCAmaW52ZXJ0KTsKKwlkZGF0YS0+Y29uZmlnIHw9IFNUX0E5X0VYVElSUV9JTlZfU0VMKGludmVydCk7CisKKwlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKGRkYXRhLT5yZWdtYXAsIGRkYXRhLT5zeXNjZmcsCisJCQkJICBTVF9BOV9JUlFfTUFTSywgZGRhdGEtPmNvbmZpZyk7Cit9CisKK3N0YXRpYyBpbnQgc3RfaXJxX3N5c2NmZ19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKKwlzdHJ1Y3Qgc3RfaXJxX3N5c2NmZyAqZGRhdGE7CisKKwlkZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZShzdF9pcnFfc3lzY2ZnX21hdGNoLCAmcGRldi0+ZGV2KTsKKwlpZiAoIW1hdGNoKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRkYXRhLT5zeXNjZmcgPSAodW5zaWduZWQgaW50KW1hdGNoLT5kYXRhOworCisJZGRhdGEtPnJlZ21hcCA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUobnAsICJzdCxzeXNjZmciKTsKKwlpZiAoSVNfRVJSKGRkYXRhLT5yZWdtYXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInN5c2NmZyBwaGFuZGxlIG1pc3NpbmdcbiIpOworCQlyZXR1cm4gUFRSX0VSUihkZGF0YS0+cmVnbWFwKTsKKwl9CisKKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgZGRhdGEpOworCisJcmV0dXJuIHN0X2lycV9zeXNjZmdfZW5hYmxlKHBkZXYpOworfQorCitzdGF0aWMgaW50IHN0X2lycV9zeXNjZmdfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3RfaXJxX3N5c2NmZyAqZGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiByZWdtYXBfdXBkYXRlX2JpdHMoZGRhdGEtPnJlZ21hcCwgZGRhdGEtPnN5c2NmZywKKwkJCQkgIFNUX0E5X0lSUV9NQVNLLCBkZGF0YS0+Y29uZmlnKTsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKHN0X2lycV9zeXNjZmdfcG1fb3BzLCBOVUxMLCBzdF9pcnFfc3lzY2ZnX3Jlc3VtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN0X2lycV9zeXNjZmdfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInN0X2lycV9zeXNjZmciLAorCQkucG0gPSAmc3RfaXJxX3N5c2NmZ19wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IHN0X2lycV9zeXNjZmdfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBzdF9pcnFfc3lzY2ZnX3Byb2JlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc3RfaXJxX3N5c2NmZ19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3RfaXJxX3N5c2NmZ19kcml2ZXIpOworfQorY29yZV9pbml0Y2FsbChzdF9pcnFfc3lzY2ZnX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pcnFjaGlwL2lycS10ZWdyYS5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS10ZWdyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzQ4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2lycWNoaXAvaXJxLXRlZ3JhLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qCisgKiBEcml2ZXIgY29kZSBmb3IgVGVncmEncyBMZWdhY3kgSW50ZXJydXB0IENvbnRyb2xsZXIKKyAqCisgKiBBdXRob3I6IE1hcmMgWnluZ2llciA8bWFyYy56eW5naWVyQGFybS5jb20+CisgKgorICogSGVhdmlseSBiYXNlZCBvbiB0aGUgb3JpZ2luYWwgYXJjaC9hcm0vbWFjaC10ZWdyYS9pcnEuYyBjb2RlOgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSwgSW5jLgorICoKKyAqIEF1dGhvcjoKKyAqCUNvbGluIENyb3NzIDxjY3Jvc3NAYW5kcm9pZC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLDIwMTMsIE5WSURJQSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY29yZV9vcHMuaD4KKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKworI2luY2x1ZGUgImlycWNoaXAuaCIKKworI2RlZmluZSBJQ1RMUl9DUFVfSUVQX1ZGSVEJMHgwOAorI2RlZmluZSBJQ1RMUl9DUFVfSUVQX0ZJUgkweDE0CisjZGVmaW5lIElDVExSX0NQVV9JRVBfRklSX1NFVAkweDE4CisjZGVmaW5lIElDVExSX0NQVV9JRVBfRklSX0NMUgkweDFjCisKKyNkZWZpbmUgSUNUTFJfQ1BVX0lFUgkJMHgyMAorI2RlZmluZSBJQ1RMUl9DUFVfSUVSX1NFVAkweDI0CisjZGVmaW5lIElDVExSX0NQVV9JRVJfQ0xSCTB4MjgKKyNkZWZpbmUgSUNUTFJfQ1BVX0lFUF9DTEFTUwkweDJDCisKKyNkZWZpbmUgSUNUTFJfQ09QX0lFUgkJMHgzMAorI2RlZmluZSBJQ1RMUl9DT1BfSUVSX1NFVAkweDM0CisjZGVmaW5lIElDVExSX0NPUF9JRVJfQ0xSCTB4MzgKKyNkZWZpbmUgSUNUTFJfQ09QX0lFUF9DTEFTUwkweDNjCisKKyNkZWZpbmUgVEVHUkFfTUFYX05VTV9JQ1RMUlMJNgorCitzdGF0aWMgdW5zaWduZWQgaW50IG51bV9pY3RscnM7CisKK3N0cnVjdCB0ZWdyYV9pY3Rscl9zb2MgeworCXVuc2lnbmVkIGludCBudW1faWN0bHJzOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9pY3Rscl9zb2MgdGVncmEyMF9pY3Rscl9zb2MgPSB7CisJLm51bV9pY3RscnMgPSA0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9pY3Rscl9zb2MgdGVncmEzMF9pY3Rscl9zb2MgPSB7CisJLm51bV9pY3RscnMgPSA1LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9pY3Rscl9zb2MgdGVncmEyMTBfaWN0bHJfc29jID0geworCS5udW1faWN0bHJzID0gNiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGljdGxyX21hdGNoZXNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIxMC1pY3RsciIsIC5kYXRhID0gJnRlZ3JhMjEwX2ljdGxyX3NvYyB9LAorCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMzAtaWN0bHIiLCAuZGF0YSA9ICZ0ZWdyYTMwX2ljdGxyX3NvYyB9LAorCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtaWN0bHIiLCAuZGF0YSA9ICZ0ZWdyYTIwX2ljdGxyX3NvYyB9LAorCXsgfQorfTsKKworc3RydWN0IHRlZ3JhX2ljdGxyX2luZm8geworCXZvaWQgX19pb21lbSAqYmFzZVtURUdSQV9NQVhfTlVNX0lDVExSU107CisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisJdTMyIGNvcF9pZXJbVEVHUkFfTUFYX05VTV9JQ1RMUlNdOworCXUzMiBjb3BfaWVwW1RFR1JBX01BWF9OVU1fSUNUTFJTXTsKKwl1MzIgY3B1X2llcltURUdSQV9NQVhfTlVNX0lDVExSU107CisJdTMyIGNwdV9pZXBbVEVHUkFfTUFYX05VTV9JQ1RMUlNdOworCisJdTMyIGljdGxyX3dha2VfbWFza1tURUdSQV9NQVhfTlVNX0lDVExSU107CisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGVncmFfaWN0bHJfaW5mbyAqbGljOworCitzdGF0aWMgaW5saW5lIHZvaWQgdGVncmFfaWN0bHJfd3JpdGVfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGxvbmcgcmVnKQoreworCXZvaWQgX19pb21lbSAqYmFzZSA9IGQtPmNoaXBfZGF0YTsKKwl1MzIgbWFzazsKKworCW1hc2sgPSBCSVQoZC0+aHdpcnEgJSAzMik7CisJd3JpdGVsX3JlbGF4ZWQobWFzaywgYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX21hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXRlZ3JhX2ljdGxyX3dyaXRlX21hc2soZCwgSUNUTFJfQ1BVX0lFUl9DTFIpOworCWlycV9jaGlwX21hc2tfcGFyZW50KGQpOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV91bm1hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXRlZ3JhX2ljdGxyX3dyaXRlX21hc2soZCwgSUNUTFJfQ1BVX0lFUl9TRVQpOworCWlycV9jaGlwX3VubWFza19wYXJlbnQoZCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX2VvaShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJdGVncmFfaWN0bHJfd3JpdGVfbWFzayhkLCBJQ1RMUl9DUFVfSUVQX0ZJUl9DTFIpOworCWlycV9jaGlwX2VvaV9wYXJlbnQoZCk7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfcmV0cmlnZ2VyKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl0ZWdyYV9pY3Rscl93cml0ZV9tYXNrKGQsIElDVExSX0NQVV9JRVBfRklSX1NFVCk7CisJcmV0dXJuIGlycV9jaGlwX3JldHJpZ2dlcl9oaWVyYXJjaHkoZCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgdGVncmFfc2V0X3dha2Uoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworCXUzMiBpcnEgPSBkLT5od2lycTsKKwl1MzIgaW5kZXgsIG1hc2s7CisKKwlpbmRleCA9IChpcnEgLyAzMik7CisJbWFzayA9IEJJVChpcnEgJSAzMik7CisJaWYgKGVuYWJsZSkKKwkJbGljLT5pY3Rscl93YWtlX21hc2tbaW5kZXhdIHw9IG1hc2s7CisJZWxzZQorCQlsaWMtPmljdGxyX3dha2VfbWFza1tpbmRleF0gJj0gfm1hc2s7CisKKwkvKgorCSAqIERvICpub3QqIGNhbGwgaW50byB0aGUgcGFyZW50LCBhcyB0aGUgR0lDIGRvZXNuJ3QgaGF2ZSBhbnkKKwkgKiB3YWtlLXVwIGZhY2lsaXR5Li4uCisJICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfaWN0bHJfc3VzcGVuZCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IG51bV9pY3RscnM7IGkrKykgeworCQl2b2lkIF9faW9tZW0gKmljdGxyID0gbGljLT5iYXNlW2ldOworCisJCS8qIFNhdmUgaW50ZXJydXB0IHN0YXRlICovCisJCWxpYy0+Y3B1X2llcltpXSA9IHJlYWRsX3JlbGF4ZWQoaWN0bHIgKyBJQ1RMUl9DUFVfSUVSKTsKKwkJbGljLT5jcHVfaWVwW2ldID0gcmVhZGxfcmVsYXhlZChpY3RsciArIElDVExSX0NQVV9JRVBfQ0xBU1MpOworCQlsaWMtPmNvcF9pZXJbaV0gPSByZWFkbF9yZWxheGVkKGljdGxyICsgSUNUTFJfQ09QX0lFUik7CisJCWxpYy0+Y29wX2llcFtpXSA9IHJlYWRsX3JlbGF4ZWQoaWN0bHIgKyBJQ1RMUl9DT1BfSUVQX0NMQVNTKTsKKworCQkvKiBEaXNhYmxlIENPUCBpbnRlcnJ1cHRzICovCisJCXdyaXRlbF9yZWxheGVkKH4wdWwsIGljdGxyICsgSUNUTFJfQ09QX0lFUl9DTFIpOworCisJCS8qIERpc2FibGUgQ1BVIGludGVycnVwdHMgKi8KKwkJd3JpdGVsX3JlbGF4ZWQofjB1bCwgaWN0bHIgKyBJQ1RMUl9DUFVfSUVSX0NMUik7CisKKwkJLyogRW5hYmxlIHRoZSB3YWtldXAgc291cmNlcyBvZiBpY3RsciAqLworCQl3cml0ZWxfcmVsYXhlZChsaWMtPmljdGxyX3dha2VfbWFza1tpXSwgaWN0bHIgKyBJQ1RMUl9DUFVfSUVSX1NFVCk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV9pY3Rscl9yZXN1bWUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBudW1faWN0bHJzOyBpKyspIHsKKwkJdm9pZCBfX2lvbWVtICppY3RsciA9IGxpYy0+YmFzZVtpXTsKKworCQl3cml0ZWxfcmVsYXhlZChsaWMtPmNwdV9pZXBbaV0sCisJCQkgICAgICAgaWN0bHIgKyBJQ1RMUl9DUFVfSUVQX0NMQVNTKTsKKwkJd3JpdGVsX3JlbGF4ZWQofjB1bCwgaWN0bHIgKyBJQ1RMUl9DUFVfSUVSX0NMUik7CisJCXdyaXRlbF9yZWxheGVkKGxpYy0+Y3B1X2llcltpXSwKKwkJCSAgICAgICBpY3RsciArIElDVExSX0NQVV9JRVJfU0VUKTsKKwkJd3JpdGVsX3JlbGF4ZWQobGljLT5jb3BfaWVwW2ldLAorCQkJICAgICAgIGljdGxyICsgSUNUTFJfQ09QX0lFUF9DTEFTUyk7CisJCXdyaXRlbF9yZWxheGVkKH4wdWwsIGljdGxyICsgSUNUTFJfQ09QX0lFUl9DTFIpOworCQl3cml0ZWxfcmVsYXhlZChsaWMtPmNvcF9pZXJbaV0sCisJCQkgICAgICAgaWN0bHIgKyBJQ1RMUl9DT1BfSUVSX1NFVCk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNjb3JlX29wcyB0ZWdyYV9pY3Rscl9zeXNjb3JlX29wcyA9IHsKKwkuc3VzcGVuZAk9IHRlZ3JhX2ljdGxyX3N1c3BlbmQsCisJLnJlc3VtZQkJPSB0ZWdyYV9pY3Rscl9yZXN1bWUsCit9OworCitzdGF0aWMgdm9pZCB0ZWdyYV9pY3Rscl9zeXNjb3JlX2luaXQodm9pZCkKK3sKKwlyZWdpc3Rlcl9zeXNjb3JlX29wcygmdGVncmFfaWN0bHJfc3lzY29yZV9vcHMpOworfQorI2Vsc2UKKyNkZWZpbmUgdGVncmFfc2V0X3dha2UJTlVMTAorc3RhdGljIGlubGluZSB2b2lkIHRlZ3JhX2ljdGxyX3N5c2NvcmVfaW5pdCh2b2lkKSB7fQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdGVncmFfaWN0bHJfY2hpcCA9IHsKKwkubmFtZQkJCT0gIkxJQyIsCisJLmlycV9lb2kJCT0gdGVncmFfZW9pLAorCS5pcnFfbWFzawkJPSB0ZWdyYV9tYXNrLAorCS5pcnFfdW5tYXNrCQk9IHRlZ3JhX3VubWFzaywKKwkuaXJxX3JldHJpZ2dlcgkJPSB0ZWdyYV9yZXRyaWdnZXIsCisJLmlycV9zZXRfd2FrZQkJPSB0ZWdyYV9zZXRfd2FrZSwKKwkuZmxhZ3MJCQk9IElSUUNISVBfTUFTS19PTl9TVVNQRU5ELAorI2lmZGVmIENPTkZJR19TTVAKKwkuaXJxX3NldF9hZmZpbml0eQk9IGlycV9jaGlwX3NldF9hZmZpbml0eV9wYXJlbnQsCisjZW5kaWYKK307CisKK3N0YXRpYyBpbnQgdGVncmFfaWN0bHJfZG9tYWluX3hsYXRlKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sCisJCQkJICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29udHJvbGxlciwKKwkJCQkgICAgY29uc3QgdTMyICppbnRzcGVjLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgaW50c2l6ZSwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyAqb3V0X2h3aXJxLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKm91dF90eXBlKQoreworCWlmIChkb21haW4tPm9mX25vZGUgIT0gY29udHJvbGxlcikKKwkJcmV0dXJuIC1FSU5WQUw7CS8qIFNob3VsZG4ndCBoYXBwZW4sIHJlYWxseS4uLiAqLworCWlmIChpbnRzaXplICE9IDMpCisJCXJldHVybiAtRUlOVkFMOwkvKiBOb3QgR0lDIGNvbXBsaWFudCAqLworCWlmIChpbnRzcGVjWzBdICE9IEdJQ19TUEkpCisJCXJldHVybiAtRUlOVkFMOwkvKiBObyBQUEkgc2hvdWxkIHBvaW50IHRvIHRoaXMgZG9tYWluICovCisKKwkqb3V0X2h3aXJxID0gaW50c3BlY1sxXTsKKwkqb3V0X3R5cGUgPSBpbnRzcGVjWzJdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX2ljdGxyX2RvbWFpbl9hbGxvYyhzdHJ1Y3QgaXJxX2RvbWFpbiAqZG9tYWluLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdmlycSwKKwkJCQkgICAgdW5zaWduZWQgaW50IG5yX2lycXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncyA9IGRhdGE7CisJc3RydWN0IG9mX3BoYW5kbGVfYXJncyBwYXJlbnRfYXJnczsKKwlzdHJ1Y3QgdGVncmFfaWN0bHJfaW5mbyAqaW5mbyA9IGRvbWFpbi0+aG9zdF9kYXRhOworCWlycV9od19udW1iZXJfdCBod2lycTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChhcmdzLT5hcmdzX2NvdW50ICE9IDMpCisJCXJldHVybiAtRUlOVkFMOwkvKiBOb3QgR0lDIGNvbXBsaWFudCAqLworCWlmIChhcmdzLT5hcmdzWzBdICE9IEdJQ19TUEkpCisJCXJldHVybiAtRUlOVkFMOwkvKiBObyBQUEkgc2hvdWxkIHBvaW50IHRvIHRoaXMgZG9tYWluICovCisKKwlod2lycSA9IGFyZ3MtPmFyZ3NbMV07CisJaWYgKGh3aXJxID49IChudW1faWN0bHJzICogMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKKwkJaW50IGljdGxyID0gKGh3aXJxICsgaSkgLyAzMjsKKworCQlpcnFfZG9tYWluX3NldF9od2lycV9hbmRfY2hpcChkb21haW4sIHZpcnEgKyBpLCBod2lycSArIGksCisJCQkJCSAgICAgICZ0ZWdyYV9pY3Rscl9jaGlwLAorCQkJCQkgICAgICAmaW5mby0+YmFzZVtpY3Rscl0pOworCX0KKworCXBhcmVudF9hcmdzID0gKmFyZ3M7CisJcGFyZW50X2FyZ3MubnAgPSBkb21haW4tPnBhcmVudC0+b2Zfbm9kZTsKKwlyZXR1cm4gaXJxX2RvbWFpbl9hbGxvY19pcnFzX3BhcmVudChkb21haW4sIHZpcnEsIG5yX2lycXMsICZwYXJlbnRfYXJncyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX2ljdGxyX2RvbWFpbl9mcmVlKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sCisJCQkJICAgIHVuc2lnbmVkIGludCB2aXJxLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbnJfaXJxcykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspIHsKKwkJc3RydWN0IGlycV9kYXRhICpkID0gaXJxX2RvbWFpbl9nZXRfaXJxX2RhdGEoZG9tYWluLCB2aXJxICsgaSk7CisJCWlycV9kb21haW5fcmVzZXRfaXJxX2RhdGEoZCk7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlycV9kb21haW5fb3BzIHRlZ3JhX2ljdGxyX2RvbWFpbl9vcHMgPSB7CisJLnhsYXRlCT0gdGVncmFfaWN0bHJfZG9tYWluX3hsYXRlLAorCS5hbGxvYwk9IHRlZ3JhX2ljdGxyX2RvbWFpbl9hbGxvYywKKwkuZnJlZQk9IHRlZ3JhX2ljdGxyX2RvbWFpbl9mcmVlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdGVncmFfaWN0bHJfaW5pdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJICAgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQpCit7CisJc3RydWN0IGlycV9kb21haW4gKnBhcmVudF9kb21haW4sICpkb21haW47CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJY29uc3Qgc3RydWN0IHRlZ3JhX2ljdGxyX3NvYyAqc29jOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwlpZiAoIXBhcmVudCkgeworCQlwcl9lcnIoIiVzOiBubyBwYXJlbnQsIGdpdmluZyB1cFxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGFyZW50X2RvbWFpbiA9IGlycV9maW5kX2hvc3QocGFyZW50KTsKKwlpZiAoIXBhcmVudF9kb21haW4pIHsKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIG9idGFpbiBwYXJlbnQgZG9tYWluXG4iLCBub2RlLT5mdWxsX25hbWUpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShpY3Rscl9tYXRjaGVzLCBub2RlKTsKKwlpZiAoIW1hdGNoKQkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4uLiAqLworCQlyZXR1cm4gLUVOT0RFVjsKKworCXNvYyA9IG1hdGNoLT5kYXRhOworCisJbGljID0ga3phbGxvYyhzaXplb2YoKmxpYyksIEdGUF9LRVJORUwpOworCWlmICghbGljKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBURUdSQV9NQVhfTlVNX0lDVExSUzsgaSsrKSB7CisJCXZvaWQgX19pb21lbSAqYmFzZTsKKworCQliYXNlID0gb2ZfaW9tYXAobm9kZSwgaSk7CisJCWlmICghYmFzZSkKKwkJCWJyZWFrOworCisJCWxpYy0+YmFzZVtpXSA9IGJhc2U7CisKKwkJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCQl3cml0ZWxfcmVsYXhlZCh+MFVMLCBiYXNlICsgSUNUTFJfQ1BVX0lFUl9DTFIpOworCQkvKiBBbGwgaW50ZXJydXB0cyB0YXJnZXQgSVJRICovCisJCXdyaXRlbF9yZWxheGVkKDAsIGJhc2UgKyBJQ1RMUl9DUFVfSUVQX0NMQVNTKTsKKworCQludW1faWN0bHJzKys7CisJfQorCisJaWYgKCFudW1faWN0bHJzKSB7CisJCXByX2VycigiJXM6IG5vIHZhbGlkIHJlZ2lvbnMsIGdpdmluZyB1cFxuIiwgbm9kZS0+ZnVsbF9uYW1lKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisKKwlXQVJOKG51bV9pY3RscnMgIT0gc29jLT5udW1faWN0bHJzLAorCSAgICAgIiVzOiBGb3VuZCAldSBpbnRlcnJ1cHQgY29udHJvbGxlcnMgaW4gRFQ7IGV4cGVjdGVkICV1LlxuIiwKKwkgICAgIG5vZGUtPmZ1bGxfbmFtZSwgbnVtX2ljdGxycywgc29jLT5udW1faWN0bHJzKTsKKworCisJZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfaGllcmFyY2h5KHBhcmVudF9kb21haW4sIDAsIG51bV9pY3RscnMgKiAzMiwKKwkJCQkJICBub2RlLCAmdGVncmFfaWN0bHJfZG9tYWluX29wcywKKwkJCQkJICBsaWMpOworCWlmICghZG9tYWluKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZWQgZG9tYWluXG4iLCBub2RlLT5mdWxsX25hbWUpOworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dF91bm1hcDsKKwl9CisKKwl0ZWdyYV9pY3Rscl9zeXNjb3JlX2luaXQoKTsKKworCXByX2luZm8oIiVzOiAlZCBpbnRlcnJ1cHRzIGZvcndhcmRlZCB0byAlc1xuIiwKKwkJbm9kZS0+ZnVsbF9uYW1lLCBudW1faWN0bHJzICogMzIsIHBhcmVudC0+ZnVsbF9uYW1lKTsKKworCXJldHVybiAwOworCitvdXRfdW5tYXA6CisJZm9yIChpID0gMDsgaSA8IG51bV9pY3RscnM7IGkrKykKKwkJaW91bm1hcChsaWMtPmJhc2VbaV0pOworb3V0X2ZyZWU6CisJa2ZyZWUobGljKTsKKwlyZXR1cm4gZXJyOworfQorCitJUlFDSElQX0RFQ0xBUkUodGVncmEyMF9pY3RsciwgIm52aWRpYSx0ZWdyYTIwLWljdGxyIiwgdGVncmFfaWN0bHJfaW5pdCk7CitJUlFDSElQX0RFQ0xBUkUodGVncmEzMF9pY3RsciwgIm52aWRpYSx0ZWdyYTMwLWljdGxyIiwgdGVncmFfaWN0bHJfaW5pdCk7CitJUlFDSElQX0RFQ0xBUkUodGVncmEyMTBfaWN0bHIsICJudmlkaWEsdGVncmEyMTAtaWN0bHIiLCB0ZWdyYV9pY3Rscl9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXJxY2hpcC9pcnEtdmY2MTAtbXNjbS1pci5jIGIvZHJpdmVycy9pcnFjaGlwL2lycS12ZjYxMC1tc2NtLWlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyMTA1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaXJxY2hpcC9pcnEtdmY2MTAtbXNjbS1pci5jCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUgVG9yYWRleCBBRworICogQXV0aG9yOiBTdGVmYW4gQWduZXIgPHN0ZWZhbkBhZ25lci5jaD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqCisgKiBJUlEgY2hpcCBkcml2ZXIgZm9yIE1TQ00gaW50ZXJydXB0IHJvdXRlciBhdmFpbGFibGUgb24gVnlicmlkIFNvQydzLgorICogVGhlIGludGVycnVwdCByb3V0ZXIgaXMgYmV0d2VlbiB0aGUgQ1BVJ3MgaW50ZXJydXB0IGNvbnRyb2xsZXIgYW5kIHRoZQorICogcGVyaXBoZXJhbC4gVGhlIHJvdXRlciBhbGxvd3MgdG8gcm91dGUgdGhlIHBlcmlwaGVyYWwgaW50ZXJydXB0cyB0bworICogb25lIG9mIHRoZSB0d28gYXZhaWxhYmxlIENQVSdzIG9uIFZ5YnJpZCBWRjZ4eCBTb0MncyAoQ29ydGV4LUE1IG9yCisgKiBDb3J0ZXgtTTQpLiBUaGUgcm91dGVyIHdpbGwgYmUgY29uZmlndXJlZCB0cmFuc3BhcmVudGx5IG9uIGEgSVJRCisgKiByZXF1ZXN0LgorICoKKyAqIG8gQWxsIHBlcmlwaGVyYWwgaW50ZXJydXB0cyBvZiB0aGUgVnlicmlkIFNvQyBjYW4gYmUgcm91dGVkIHRvCisgKiAgIENQVSAwLCBDUFUgMSBvciBib3RoLiBUaGUgcm91dGluZyBpcyB1c2VmdWwgZm9yIGR1YWwtY29yZQorICogICB2YXJpYW50cyBvZiBWeWJyaWQgU29DIHN1Y2ggYXMgVkY2eHguIFRoaXMgZHJpdmVyIHJvdXRlcyB0aGUKKyAqICAgcmVxdWVzdGVkIGludGVycnVwdCB0byB0aGUgQ1BVIGN1cnJlbnRseSBydW5uaW5nIG9uLgorICoKKyAqIG8gSXQgaXMgcmVxdWlyZWQgdG8gc2V0dXAgdGhlIGludGVycnVwdCByb3V0ZXIgZXZlbiBvbiBzaW5nbGUtY29yZQorICogICB2YXJpYW50cyBvZiBWeWJyaWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NwdV9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2ludGVycnVwdC1jb250cm9sbGVyL2FybS1naWMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNpbmNsdWRlICJpcnFjaGlwLmgiCisKKyNkZWZpbmUgTVNDTV9DUHhOVU0JCTB4NAorCisjZGVmaW5lIE1TQ01fSVJTUFJDKG4pCQkoMHg4MCArIDIgKiAobikpCisjZGVmaW5lIE1TQ01fSVJTUFJDX0NQRU5fTUFTSwkweDMKKworI2RlZmluZSBNU0NNX0lSU1BSQ19OVU0JCTExMgorCitzdHJ1Y3QgdmY2MTBfbXNjbV9pcl9jaGlwX2RhdGEgeworCXZvaWQgX19pb21lbSAqbXNjbV9pcl9iYXNlOworCXUxNiBjcHVfbWFzazsKKwl1MTYgc2F2ZWRfaXJzcHJjW01TQ01fSVJTUFJDX05VTV07Cit9OworCitzdGF0aWMgc3RydWN0IHZmNjEwX21zY21faXJfY2hpcF9kYXRhICptc2NtX2lyX2RhdGE7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2ZjYxMF9tc2NtX2lyX3NhdmUoc3RydWN0IHZmNjEwX21zY21faXJfY2hpcF9kYXRhICpkYXRhKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1TQ01fSVJTUFJDX05VTTsgaSsrKQorCQlkYXRhLT5zYXZlZF9pcnNwcmNbaV0gPSByZWFkd19yZWxheGVkKGRhdGEtPm1zY21faXJfYmFzZSArIE1TQ01fSVJTUFJDKGkpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZmNjEwX21zY21faXJfcmVzdG9yZShzdHJ1Y3QgdmY2MTBfbXNjbV9pcl9jaGlwX2RhdGEgKmRhdGEpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVNDTV9JUlNQUkNfTlVNOyBpKyspCisJCXdyaXRld19yZWxheGVkKGRhdGEtPnNhdmVkX2lyc3ByY1tpXSwgZGF0YS0+bXNjbV9pcl9iYXNlICsgTVNDTV9JUlNQUkMoaSkpOworfQorCitzdGF0aWMgaW50IHZmNjEwX21zY21faXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkJCSAgdW5zaWduZWQgbG9uZyBjbWQsIHZvaWQgKnYpCit7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIENQVV9DTFVTVEVSX1BNX0VOVEVSOgorCQl2ZjYxMF9tc2NtX2lyX3NhdmUobXNjbV9pcl9kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfQ0xVU1RFUl9QTV9FTlRFUl9GQUlMRUQ6CisJY2FzZSBDUFVfQ0xVU1RFUl9QTV9FWElUOgorCQl2ZjYxMF9tc2NtX2lyX3Jlc3RvcmUobXNjbV9pcl9kYXRhKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtc2NtX2lyX25vdGlmaWVyX2Jsb2NrID0geworCS5ub3RpZmllcl9jYWxsID0gdmY2MTBfbXNjbV9pcl9ub3RpZmllciwKK307CisKK3N0YXRpYyB2b2lkIHZmNjEwX21zY21faXJfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlpcnFfaHdfbnVtYmVyX3QgaHdpcnEgPSBkYXRhLT5od2lycTsKKwlzdHJ1Y3QgdmY2MTBfbXNjbV9pcl9jaGlwX2RhdGEgKmNoaXBfZGF0YSA9IGRhdGEtPmNoaXBfZGF0YTsKKwl1MTYgaXJzcHJjOworCisJaXJzcHJjID0gcmVhZHdfcmVsYXhlZChjaGlwX2RhdGEtPm1zY21faXJfYmFzZSArIE1TQ01fSVJTUFJDKGh3aXJxKSk7CisJaXJzcHJjICY9IE1TQ01fSVJTUFJDX0NQRU5fTUFTSzsKKworCVdBUk5fT04oaXJzcHJjICYgfmNoaXBfZGF0YS0+Y3B1X21hc2spOworCisJd3JpdGV3X3JlbGF4ZWQoY2hpcF9kYXRhLT5jcHVfbWFzaywKKwkJICAgICAgIGNoaXBfZGF0YS0+bXNjbV9pcl9iYXNlICsgTVNDTV9JUlNQUkMoaHdpcnEpKTsKKworCWlycV9jaGlwX3VubWFza19wYXJlbnQoZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIHZmNjEwX21zY21faXJfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJaXJxX2h3X251bWJlcl90IGh3aXJxID0gZGF0YS0+aHdpcnE7CisJc3RydWN0IHZmNjEwX21zY21faXJfY2hpcF9kYXRhICpjaGlwX2RhdGEgPSBkYXRhLT5jaGlwX2RhdGE7CisKKwl3cml0ZXdfcmVsYXhlZCgweDAsIGNoaXBfZGF0YS0+bXNjbV9pcl9iYXNlICsgTVNDTV9JUlNQUkMoaHdpcnEpKTsKKworCWlycV9jaGlwX21hc2tfcGFyZW50KGRhdGEpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHZmNjEwX21zY21faXJfaXJxX2NoaXAgPSB7CisJLm5hbWUJCQk9ICJtc2NtLWlyIiwKKwkuaXJxX21hc2sJCT0gaXJxX2NoaXBfbWFza19wYXJlbnQsCisJLmlycV91bm1hc2sJCT0gaXJxX2NoaXBfdW5tYXNrX3BhcmVudCwKKwkuaXJxX2VvaQkJPSBpcnFfY2hpcF9lb2lfcGFyZW50LAorCS5pcnFfZW5hYmxlCQk9IHZmNjEwX21zY21faXJfZW5hYmxlLAorCS5pcnFfZGlzYWJsZQkJPSB2ZjYxMF9tc2NtX2lyX2Rpc2FibGUsCisJLmlycV9yZXRyaWdnZXIJCT0gaXJxX2NoaXBfcmV0cmlnZ2VyX2hpZXJhcmNoeSwKKwkuaXJxX3NldF9hZmZpbml0eQk9IGlycV9jaGlwX3NldF9hZmZpbml0eV9wYXJlbnQsCit9OworCitzdGF0aWMgaW50IHZmNjEwX21zY21faXJfZG9tYWluX2FsbG9jKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sIHVuc2lnbmVkIGludCB2aXJxLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBucl9pcnFzLCB2b2lkICphcmcpCit7CisJaW50IGk7CisJaXJxX2h3X251bWJlcl90IGh3aXJxOworCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmlycV9kYXRhID0gYXJnOworCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgZ2ljX2RhdGE7CisKKwlpZiAoaXJxX2RhdGEtPmFyZ3NfY291bnQgIT0gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlod2lycSA9IGlycV9kYXRhLT5hcmdzWzBdOworCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyspCisJCWlycV9kb21haW5fc2V0X2h3aXJxX2FuZF9jaGlwKGRvbWFpbiwgdmlycSArIGksIGh3aXJxICsgaSwKKwkJCQkJICAgICAgJnZmNjEwX21zY21faXJfaXJxX2NoaXAsCisJCQkJCSAgICAgIGRvbWFpbi0+aG9zdF9kYXRhKTsKKworCWdpY19kYXRhLm5wID0gZG9tYWluLT5wYXJlbnQtPm9mX25vZGU7CisJZ2ljX2RhdGEuYXJnc19jb3VudCA9IDM7CisJZ2ljX2RhdGEuYXJnc1swXSA9IEdJQ19TUEk7CisJZ2ljX2RhdGEuYXJnc1sxXSA9IGlycV9kYXRhLT5hcmdzWzBdOworCWdpY19kYXRhLmFyZ3NbMl0gPSBpcnFfZGF0YS0+YXJnc1sxXTsKKwlyZXR1cm4gaXJxX2RvbWFpbl9hbGxvY19pcnFzX3BhcmVudChkb21haW4sIHZpcnEsIG5yX2lycXMsICZnaWNfZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgbXNjbV9pcnFfZG9tYWluX29wcyA9IHsKKwkueGxhdGUgPSBpcnFfZG9tYWluX3hsYXRlX3R3b2NlbGwsCisJLmFsbG9jID0gdmY2MTBfbXNjbV9pcl9kb21haW5fYWxsb2MsCisJLmZyZWUgPSBpcnFfZG9tYWluX2ZyZWVfaXJxc19jb21tb24sCit9OworCitzdGF0aWMgaW50IF9faW5pdCB2ZjYxMF9tc2NtX2lyX29mX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqcGFyZW50KQoreworCXN0cnVjdCBpcnFfZG9tYWluICpkb21haW4sICpkb21haW5fcGFyZW50OworCXN0cnVjdCByZWdtYXAgKm1zY21fY3BfcmVnbWFwOworCWludCByZXQsIGNwdWlkOworCisJZG9tYWluX3BhcmVudCA9IGlycV9maW5kX2hvc3QocGFyZW50KTsKKwlpZiAoIWRvbWFpbl9wYXJlbnQpIHsKKwkJcHJfZXJyKCJ2ZjYxMF9tc2NtX2lyOiBpbnRlcnJ1cHQtcGFyZW50IG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1zY21faXJfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCptc2NtX2lyX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zY21faXJfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltc2NtX2lyX2RhdGEtPm1zY21faXJfYmFzZSA9IG9mX2lvX3JlcXVlc3RfYW5kX21hcChub2RlLCAwLCAibXNjbS1pciIpOworCisJaWYgKCFtc2NtX2lyX2RhdGEtPm1zY21faXJfYmFzZSkgeworCQlwcl9lcnIoInZmNjEwX21zY21faXI6IHVuYWJsZSB0byBtYXAgbXNjbSByZWdpc3RlclxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJbXNjbV9jcF9yZWdtYXAgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKG5vZGUsICJmc2wsY3B1Y2ZnIik7CisJaWYgKElTX0VSUihtc2NtX2NwX3JlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihtc2NtX2NwX3JlZ21hcCk7CisJCXByX2VycigidmY2MTBfbXNjbV9pcjogcmVnbWFwIGxvb2t1cCBmb3IgY3B1Y2ZnIGZhaWxlZFxuIik7CisJCWdvdG8gb3V0X3VubWFwOworCX0KKworCXJlZ21hcF9yZWFkKG1zY21fY3BfcmVnbWFwLCBNU0NNX0NQeE5VTSwgJmNwdWlkKTsKKwltc2NtX2lyX2RhdGEtPmNwdV9tYXNrID0gMHgxIDw8IGNwdWlkOworCisJZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfaGllcmFyY2h5KGRvbWFpbl9wYXJlbnQsIDAsCisJCQkJCSAgTVNDTV9JUlNQUkNfTlVNLCBub2RlLAorCQkJCQkgICZtc2NtX2lycV9kb21haW5fb3BzLCBtc2NtX2lyX2RhdGEpOworCWlmICghZG9tYWluKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3VubWFwOworCX0KKworCWNwdV9wbV9yZWdpc3Rlcl9ub3RpZmllcigmbXNjbV9pcl9ub3RpZmllcl9ibG9jayk7CisKKwlyZXR1cm4gMDsKKworb3V0X3VubWFwOgorCWlvdW5tYXAobXNjbV9pcl9kYXRhLT5tc2NtX2lyX2Jhc2UpOworb3V0X2ZyZWU6CisJa2ZyZWUobXNjbV9pcl9kYXRhKTsKKwlyZXR1cm4gcmV0OworfQorSVJRQ0hJUF9ERUNMQVJFKHZmNjEwX21zY21faXIsICJmc2wsdmY2MTAtbXNjbS1pciIsIHZmNjEwX21zY21faXJfb2ZfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9ldi1sYXllci5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvZXYtbGF5ZXIuYwppbmRleCBjOGNlZDEyLi4xY2ZjZWE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9ldi1sYXllci5jCisrKyBiL2RyaXZlcnMvaXNkbi9naWdhc2V0L2V2LWxheWVyLmMKQEAgLTM4OSwyMiArMzg5LDQ5IEBACiAJe05VTEwsCQkJCVpTQVVfVU5LTk9XTn0KIH07CiAKLS8qIHJldHJpZXZlIENJRCBmcm9tIHBhcnNlZCByZXNwb25zZQotICogcmV0dXJucyAwIGlmIG5vIENJRCwgLTEgaWYgaW52YWxpZCBDSUQsIG9yIENJRCB2YWx1ZSAxLi42NTUzNQorLyogY2hlY2sgZm9yIGFuZCByZW1vdmUgZml4ZWQgc3RyaW5nIHByZWZpeAorICogSWYgcyBzdGFydHMgd2l0aCBwcmVmaXggdGVybWluYXRlZCBieSBhIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyLAorICogcmV0dXJuIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGF0LCBvdGhlcndpc2UgcmV0dXJuIE5VTEwuCiAgKi8KLXN0YXRpYyBpbnQgY2lkX29mX3Jlc3BvbnNlKGNoYXIgKnMpCitzdGF0aWMgY2hhciAqc2tpcF9wcmVmaXgoY2hhciAqcywgY29uc3QgY2hhciAqcHJlZml4KQogewotCWludCBjaWQ7Ci0JaW50IHJjOworCXdoaWxlICgqcHJlZml4KQorCQlpZiAoKnMrKyAhPSAqcHJlZml4KyspCisJCQlyZXR1cm4gTlVMTDsKKwlpZiAoaXNhbG51bSgqcykpCisJCXJldHVybiBOVUxMOworCXJldHVybiBzOworfQogCi0JaWYgKHNbLTFdICE9ICc7JykKLQkJcmV0dXJuIDA7CS8qIG5vIENJRCBzZXBhcmF0b3IgKi8KLQlyYyA9IGtzdHJ0b2ludChzLCAxMCwgJmNpZCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gMDsJLyogQ0lEIG5vdCBudW1lcmljICovCi0JaWYgKGNpZCA8IDEgfHwgY2lkID4gNjU1MzUpCi0JCXJldHVybiAtMTsJLyogQ0lEIG91dCBvZiByYW5nZSAqLwotCXJldHVybiBjaWQ7CisvKiBxdWV1ZSBldmVudCB3aXRoIENJRCAqLworc3RhdGljIHZvaWQgYWRkX2NpZF9ldmVudChzdHJ1Y3QgY2FyZHN0YXRlICpjcywgaW50IGNpZCwgaW50IHR5cGUsCisJCQkgIHZvaWQgKnB0ciwgaW50IHBhcmFtZXRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIG5leHQsIHRhaWw7CisJc3RydWN0IGV2ZW50X3QgKmV2ZW50OworCisJZ2lnX2RiZyhERUJVR19FVkVOVCwgInF1ZXVlaW5nIGV2ZW50ICVkIGZvciBjaWQgJWQiLCB0eXBlLCBjaWQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNzLT5ldl9sb2NrLCBmbGFncyk7CisKKwl0YWlsID0gY3MtPmV2X3RhaWw7CisJbmV4dCA9ICh0YWlsICsgMSkgJSBNQVhfRVZFTlRTOworCWlmICh1bmxpa2VseShuZXh0ID09IGNzLT5ldl9oZWFkKSkgeworCQlkZXZfZXJyKGNzLT5kZXYsICJldmVudCBxdWV1ZSBmdWxsXG4iKTsKKwkJa2ZyZWUocHRyKTsKKwl9IGVsc2UgeworCQlldmVudCA9IGNzLT5ldmVudHMgKyB0YWlsOworCQlldmVudC0+dHlwZSA9IHR5cGU7CisJCWV2ZW50LT5jaWQgPSBjaWQ7CisJCWV2ZW50LT5wdHIgPSBwdHI7CisJCWV2ZW50LT5hcmcgPSBOVUxMOworCQlldmVudC0+cGFyYW1ldGVyID0gcGFyYW1ldGVyOworCQlldmVudC0+YXRfc3RhdGUgPSBOVUxMOworCQljcy0+ZXZfdGFpbCA9IG5leHQ7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3MtPmV2X2xvY2ssIGZsYWdzKTsKIH0KIAogLyoqCkBAIC00MTcsMTkwICs0NDQsMTg4IEBACiAgKi8KIHZvaWQgZ2lnYXNldF9oYW5kbGVfbW9kZW1fcmVzcG9uc2Uoc3RydWN0IGNhcmRzdGF0ZSAqY3MpCiB7Ci0JdW5zaWduZWQgY2hhciAqYXJndltNQVhfUkVDX1BBUkFNUyArIDFdOwotCWludCBwYXJhbXM7Ci0JaW50IGksIGo7CisJY2hhciAqZW9jLCAqcHNlcCwgKnB0cjsKIAljb25zdCBzdHJ1Y3QgcmVzcF90eXBlX3QgKnJ0OwogCWNvbnN0IHN0cnVjdCB6c2F1X3Jlc3BfdCAqenI7Ci0JaW50IGN1cmFyZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIG5leHQsIHRhaWwsIGhlYWQ7Ci0Jc3RydWN0IGV2ZW50X3QgKmV2ZW50OwotCWludCByZXNwX2NvZGU7Ci0JaW50IHBhcmFtX3R5cGU7Ci0JaW50IGFib3J0OwotCXNpemVfdCBsZW47Ci0JaW50IGNpZDsKLQlpbnQgcmF3c3RyaW5nOworCWludCBjaWQsIHBhcmFtZXRlcjsKKwl1OCB0eXBlLCB2YWx1ZTsKIAotCWxlbiA9IGNzLT5jYnl0ZXM7Ci0JaWYgKCFsZW4pIHsKKwlpZiAoIWNzLT5jYnl0ZXMpIHsKIAkJLyogaWdub3JlIGFkZGl0aW9uYWwgTEZzL0NScyAoTTEweCBjb25maWcgbW9kZSBvciBjeDEwMCkgKi8KIAkJZ2lnX2RiZyhERUJVR19NQ01ELCAic2tpcHBlZCBFT0wgWyUwMlhdIiwgY3MtPnJlc3BkYXRhWzBdKTsKIAkJcmV0dXJuOwogCX0KLQljcy0+cmVzcGRhdGFbbGVuXSA9IDA7Ci0JYXJndlswXSA9IGNzLT5yZXNwZGF0YTsKLQlwYXJhbXMgPSAxOworCWNzLT5yZXNwZGF0YVtjcy0+Y2J5dGVzXSA9IDA7CisKIAlpZiAoY3MtPmF0X3N0YXRlLmdldHN0cmluZykgewotCQkvKiBnZXRzdHJpbmcgb25seSBhbGxvd2VkIHdpdGhvdXQgY2lkIGF0IHRoZSBtb21lbnQgKi8KKwkJLyogc3RhdGUgbWFjaGluZSB3YW50cyBuZXh0IGxpbmUgdmVyYmF0aW0gKi8KIAkJY3MtPmF0X3N0YXRlLmdldHN0cmluZyA9IDA7Ci0JCXJhd3N0cmluZyA9IDE7Ci0JCWNpZCA9IDA7CisJCXB0ciA9IGtzdHJkdXAoY3MtPnJlc3BkYXRhLCBHRlBfQVRPTUlDKTsKKwkJZ2lnX2RiZyhERUJVR19FVkVOVCwgInN0cmluZz09JXMiLCBwdHIgPyBwdHIgOiAiTlVMTCIpOworCQlhZGRfY2lkX2V2ZW50KGNzLCAwLCBSU1BfU1RSSU5HLCBwdHIsIDApOworCQlyZXR1cm47CisJfQorCisJLyogbG9vayB1cCByZXNwb25zZSB0eXBlICovCisJZm9yIChydCA9IHJlc3BfdHlwZTsgcnQtPnJlc3BvbnNlOyArK3J0KSB7CisJCWVvYyA9IHNraXBfcHJlZml4KGNzLT5yZXNwZGF0YSwgcnQtPnJlc3BvbnNlKTsKKwkJaWYgKGVvYykKKwkJCWJyZWFrOworCX0KKwlpZiAoIXJ0LT5yZXNwb25zZSkgeworCQlhZGRfY2lkX2V2ZW50KGNzLCAwLCBSU1BfTk9ORSwgTlVMTCwgMCk7CisJCWdpZ19kYmcoREVCVUdfRVZFTlQsICJ1bmtub3duIG1vZGVtIHJlc3BvbnNlOiAnJXMnXG4iLAorCQkJY3MtPnJlc3BkYXRhKTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNoZWNrIGZvciBDSUQgKi8KKwlwc2VwID0gc3RycmNocihjcy0+cmVzcGRhdGEsICc7Jyk7CisJaWYgKHBzZXAgJiYKKwkgICAgIWtzdHJ0b2ludChwc2VwICsgMSwgMTAsICZjaWQpICYmCisJICAgIGNpZCA+PSAxICYmIGNpZCA8PSA2NTUzNSkgeworCQkvKiB2YWxpZCBDSUQ6IGNob3AgaXQgb2ZmICovCisJCSpwc2VwID0gMDsKIAl9IGVsc2UgewotCQkvKiBwYXJzZSBsaW5lICovCi0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQkJCXN3aXRjaCAoY3MtPnJlc3BkYXRhW2ldKSB7Ci0JCQljYXNlICc7JzoKLQkJCWNhc2UgJywnOgotCQkJY2FzZSAnPSc6Ci0JCQkJaWYgKHBhcmFtcyA+IE1BWF9SRUNfUEFSQU1TKSB7Ci0JCQkJCWRldl93YXJuKGNzLT5kZXYsCi0JCQkJCQkgInRvbyBtYW55IHBhcmFtZXRlcnMgaW4gcmVzcG9uc2VcbiIpOwotCQkJCQkvKiBuZWVkIGxhc3QgcGFyYW1ldGVyIChtaWdodCBiZSBDSUQpICovCi0JCQkJCXBhcmFtcy0tOwotCQkJCX0KLQkJCQlhcmd2W3BhcmFtcysrXSA9IGNzLT5yZXNwZGF0YSArIGkgKyAxOwotCQkJfQotCi0JCXJhd3N0cmluZyA9IDA7Ci0JCWNpZCA9IHBhcmFtcyA+IDEgPyBjaWRfb2ZfcmVzcG9uc2UoYXJndltwYXJhbXMgLSAxXSkgOiAwOwotCQlpZiAoY2lkIDwgMCkgewotCQkJZ2lnYXNldF9hZGRfZXZlbnQoY3MsICZjcy0+YXRfc3RhdGUsIFJTUF9JTlZBTCwKLQkJCQkJICBOVUxMLCAwLCBOVUxMKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZvciAoaiA9IDE7IGogPCBwYXJhbXM7ICsraikKLQkJCWFyZ3Zbal1bLTFdID0gMDsKLQotCQlnaWdfZGJnKERFQlVHX0VWRU5ULCAiQ01EIHJlY2VpdmVkOiAlcyIsIGFyZ3ZbMF0pOwotCQlpZiAoY2lkKSB7Ci0JCQktLXBhcmFtczsKLQkJCWdpZ19kYmcoREVCVUdfRVZFTlQsICJDSUQ6ICVzIiwgYXJndltwYXJhbXNdKTsKLQkJfQotCQlnaWdfZGJnKERFQlVHX0VWRU5ULCAiYXZhaWxhYmxlIHBhcmFtczogJWQiLCBwYXJhbXMgLSAxKTsKLQkJZm9yIChqID0gMTsgaiA8IHBhcmFtczsgaisrKQotCQkJZ2lnX2RiZyhERUJVR19FVkVOVCwgInBhcmFtICVkOiAlcyIsIGosIGFyZ3Zbal0pOworCQkvKiBubyB2YWxpZCBDSUQ6IGxlYXZlIHVuY2hhbmdlZCAqLworCQljaWQgPSAwOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZjcy0+ZXZfbG9jaywgZmxhZ3MpOwotCWhlYWQgPSBjcy0+ZXZfaGVhZDsKLQl0YWlsID0gY3MtPmV2X3RhaWw7CisJZ2lnX2RiZyhERUJVR19FVkVOVCwgIkNNRCByZWNlaXZlZDogJXMiLCBjcy0+cmVzcGRhdGEpOworCWlmIChjaWQpCisJCWdpZ19kYmcoREVCVUdfRVZFTlQsICJDSUQ6ICVkIiwgY2lkKTsKIAotCWFib3J0ID0gMTsKLQljdXJhcmcgPSAwOwotCXdoaWxlIChjdXJhcmcgPCBwYXJhbXMpIHsKLQkJbmV4dCA9ICh0YWlsICsgMSkgJSBNQVhfRVZFTlRTOwotCQlpZiAodW5saWtlbHkobmV4dCA9PSBoZWFkKSkgewotCQkJZGV2X2Vycihjcy0+ZGV2LCAiZXZlbnQgcXVldWUgZnVsbFxuIik7Ci0JCQlicmVhazsKLQkJfQorCXN3aXRjaCAocnQtPnR5cGUpIHsKKwljYXNlIFJUX05PVEhJTkc6CisJCS8qIGNoZWNrIHBhcmFtZXRlciBzZXBhcmF0b3IgKi8KKwkJaWYgKCplb2MpCisJCQlnb3RvIGJhZF9wYXJhbTsJLyogZXh0cmEgcGFyYW1ldGVyICovCiAKLQkJZXZlbnQgPSBjcy0+ZXZlbnRzICsgdGFpbDsKLQkJZXZlbnQtPmF0X3N0YXRlID0gTlVMTDsKLQkJZXZlbnQtPmNpZCA9IGNpZDsKLQkJZXZlbnQtPnB0ciA9IE5VTEw7Ci0JCWV2ZW50LT5hcmcgPSBOVUxMOwotCQl0YWlsID0gbmV4dDsKKwkJYWRkX2NpZF9ldmVudChjcywgY2lkLCBydC0+cmVzcF9jb2RlLCBOVUxMLCAwKTsKKwkJYnJlYWs7CiAKLQkJaWYgKHJhd3N0cmluZykgewotCQkJcmVzcF9jb2RlID0gUlNQX1NUUklORzsKLQkJCXBhcmFtX3R5cGUgPSBSVF9TVFJJTkc7Ci0JCX0gZWxzZSB7Ci0JCQlmb3IgKHJ0ID0gcmVzcF90eXBlOyBydC0+cmVzcG9uc2U7ICsrcnQpCi0JCQkJaWYgKCFzdHJjbXAoYXJndltjdXJhcmddLCBydC0+cmVzcG9uc2UpKQorCWNhc2UgUlRfUklORzoKKwkJLyogY2hlY2sgcGFyYW1ldGVyIHNlcGFyYXRvciAqLworCQlpZiAoISplb2MpCisJCQllb2MgPSBOVUxMOwkvKiBubyBwYXJhbWV0ZXIgKi8KKwkJZWxzZSBpZiAoKmVvYysrICE9ICcsJykKKwkJCWdvdG8gYmFkX3BhcmFtOworCisJCWFkZF9jaWRfZXZlbnQoY3MsIDAsIHJ0LT5yZXNwX2NvZGUsIE5VTEwsIGNpZCk7CisKKwkJLyogcHJvY2VzcyBwYXJhbWV0ZXJzIGFzIGluZGl2aWR1YWwgcmVzcG9uc2VzICovCisJCXdoaWxlIChlb2MpIHsKKwkJCS8qIGxvb2sgdXAgcGFyYW1ldGVyIHR5cGUgKi8KKwkJCXBzZXAgPSBOVUxMOworCQkJZm9yIChydCA9IHJlc3BfdHlwZTsgcnQtPnJlc3BvbnNlOyArK3J0KSB7CisJCQkJcHNlcCA9IHNraXBfcHJlZml4KGVvYywgcnQtPnJlc3BvbnNlKTsKKwkJCQlpZiAocHNlcCkKIAkJCQkJYnJlYWs7Ci0KLQkJCWlmICghcnQtPnJlc3BvbnNlKSB7Ci0JCQkJZXZlbnQtPnR5cGUgPSBSU1BfTk9ORTsKLQkJCQlnaWdfZGJnKERFQlVHX0VWRU5ULAotCQkJCQkidW5rbm93biBtb2RlbSByZXNwb25zZTogJyVzJ1xuIiwKLQkJCQkJYXJndltjdXJhcmddKTsKLQkJCQlicmVhazsKIAkJCX0KIAotCQkJcmVzcF9jb2RlID0gcnQtPnJlc3BfY29kZTsKLQkJCXBhcmFtX3R5cGUgPSBydC0+dHlwZTsKLQkJCSsrY3VyYXJnOwotCQl9Ci0KLQkJZXZlbnQtPnR5cGUgPSByZXNwX2NvZGU7Ci0KLQkJc3dpdGNoIChwYXJhbV90eXBlKSB7Ci0JCWNhc2UgUlRfTk9USElORzoKLQkJCWJyZWFrOwotCQljYXNlIFJUX1JJTkc6Ci0JCQlpZiAoIWNpZCkgewotCQkJCWRldl9lcnIoY3MtPmRldiwKLQkJCQkJInJlY2VpdmVkIFJJTkcgd2l0aG91dCBDSUQhXG4iKTsKLQkJCQlldmVudC0+dHlwZSA9IFJTUF9JTlZBTDsKLQkJCQlhYm9ydCA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCWV2ZW50LT5jaWQgPSAwOwotCQkJCWV2ZW50LT5wYXJhbWV0ZXIgPSBjaWQ7Ci0JCQkJYWJvcnQgPSAwOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgUlRfWlNBVToKLQkJCWlmIChjdXJhcmcgPj0gcGFyYW1zKSB7Ci0JCQkJZXZlbnQtPnBhcmFtZXRlciA9IFpTQVVfTk9ORTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWZvciAoenIgPSB6c2F1X3Jlc3A7IHpyLT5zdHI7ICsrenIpCi0JCQkJaWYgKCFzdHJjbXAoYXJndltjdXJhcmddLCB6ci0+c3RyKSkKLQkJCQkJYnJlYWs7Ci0JCQlldmVudC0+cGFyYW1ldGVyID0genItPmNvZGU7Ci0JCQlpZiAoIXpyLT5zdHIpCisJCQkvKiBhbGwgbGVnYWwgcGFyYW1ldGVycyBhcmUgb2YgdHlwZSBSVF9TVFJJTkcgKi8KKwkJCWlmICghcHNlcCB8fCBydC0+dHlwZSAhPSBSVF9TVFJJTkcpIHsKIAkJCQlkZXZfd2Fybihjcy0+ZGV2LAotCQkJCQkgIiVzOiB1bmtub3duIHBhcmFtZXRlciAlcyBhZnRlciBaU0FVXG4iLAotCQkJCQkgX19mdW5jX18sIGFyZ3ZbY3VyYXJnXSk7Ci0JCQkrK2N1cmFyZzsKLQkJCWJyZWFrOwotCQljYXNlIFJUX1NUUklORzoKLQkJCWlmIChjdXJhcmcgPCBwYXJhbXMpIHsKLQkJCQlldmVudC0+cHRyID0ga3N0cmR1cChhcmd2W2N1cmFyZ10sIEdGUF9BVE9NSUMpOwotCQkJCWlmICghZXZlbnQtPnB0cikKLQkJCQkJZGV2X2Vycihjcy0+ZGV2LCAib3V0IG9mIG1lbW9yeVxuIik7Ci0JCQkJKytjdXJhcmc7CisJCQkJCSAiaWxsZWdhbCBSSU5HIHBhcmFtZXRlcjogJyVzJ1xuIiwKKwkJCQkJIGVvYyk7CisJCQkJcmV0dXJuOwogCQkJfQotCQkJZ2lnX2RiZyhERUJVR19FVkVOVCwgInN0cmluZz09JXMiLAotCQkJCWV2ZW50LT5wdHIgPyAoY2hhciAqKSBldmVudC0+cHRyIDogIk5VTEwiKTsKLQkJCWJyZWFrOwotCQljYXNlIFJUX1pDQVU6Ci0JCQlldmVudC0+cGFyYW1ldGVyID0gLTE7Ci0JCQlpZiAoY3VyYXJnICsgMSA8IHBhcmFtcykgewotCQkJCXU4IHR5cGUsIHZhbHVlOwogCi0JCQkJaSA9IGtzdHJ0b3U4KGFyZ3ZbY3VyYXJnKytdLCAxNiwgJnR5cGUpOwotCQkJCWogPSBrc3RydG91OChhcmd2W2N1cmFyZysrXSwgMTYsICZ2YWx1ZSk7Ci0JCQkJaWYgKGkgPT0gMCAmJiBqID09IDApCi0JCQkJCWV2ZW50LT5wYXJhbWV0ZXIgPSAodHlwZSA8PCA4KSB8IHZhbHVlOwotCQkJfSBlbHNlCi0JCQkJY3VyYXJnID0gcGFyYW1zIC0gMTsKLQkJCWJyZWFrOwotCQljYXNlIFJUX05VTUJFUjoKLQkJCWlmIChjdXJhcmcgPj0gcGFyYW1zIHx8Ci0JCQkgICAga3N0cnRvaW50KGFyZ3ZbY3VyYXJnKytdLCAxMCwgJmV2ZW50LT5wYXJhbWV0ZXIpKQotCQkJCWV2ZW50LT5wYXJhbWV0ZXIgPSAtMTsKLQkJCWdpZ19kYmcoREVCVUdfRVZFTlQsICJwYXJhbWV0ZXI9PSVkIiwgZXZlbnQtPnBhcmFtZXRlcik7CisJCQkvKiBza2lwIHBhcmFtZXRlciB2YWx1ZSBzZXBhcmF0b3IgKi8KKwkJCWlmICgqcHNlcCsrICE9ICc9JykKKwkJCQlnb3RvIGJhZF9wYXJhbTsKKworCQkJLyogbG9vayB1cCBlbmQgb2YgcGFyYW1ldGVyICovCisJCQllb2MgPSBzdHJjaHIocHNlcCwgJywnKTsKKwkJCWlmIChlb2MpCisJCQkJKmVvYysrID0gMDsKKworCQkJLyogcmV0cmlldmUgcGFyYW1ldGVyIHZhbHVlICovCisJCQlwdHIgPSBrc3RyZHVwKHBzZXAsIEdGUF9BVE9NSUMpOworCisJCQkvKiBxdWV1ZSBldmVudCAqLworCQkJYWRkX2NpZF9ldmVudChjcywgY2lkLCBydC0+cmVzcF9jb2RlLCBwdHIsIDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBSVF9aU0FVOgorCQkvKiBjaGVjayBwYXJhbWV0ZXIgc2VwYXJhdG9yICovCisJCWlmICghKmVvYykgeworCQkJLyogbm8gcGFyYW1ldGVyICovCisJCQlhZGRfY2lkX2V2ZW50KGNzLCBjaWQsIHJ0LT5yZXNwX2NvZGUsIE5VTEwsIFpTQVVfTk9ORSk7CiAJCQlicmVhazsKIAkJfQorCQlpZiAoKmVvYysrICE9ICc9JykKKwkJCWdvdG8gYmFkX3BhcmFtOwogCi0JCWlmIChyZXNwX2NvZGUgPT0gUlNQX1pETEUpCi0JCQljcy0+ZGxlID0gZXZlbnQtPnBhcmFtZXRlcjsKKwkJLyogbG9vayB1cCBwYXJhbWV0ZXIgdmFsdWUgKi8KKwkJZm9yICh6ciA9IHpzYXVfcmVzcDsgenItPnN0cjsgKyt6cikKKwkJCWlmICghc3RyY21wKGVvYywgenItPnN0cikpCisJCQkJYnJlYWs7CisJCWlmICghenItPnN0cikKKwkJCWdvdG8gYmFkX3BhcmFtOwogCi0JCWlmIChhYm9ydCkKLQkJCWJyZWFrOworCQlhZGRfY2lkX2V2ZW50KGNzLCBjaWQsIHJ0LT5yZXNwX2NvZGUsIE5VTEwsIHpyLT5jb2RlKTsKKwkJYnJlYWs7CisKKwljYXNlIFJUX1NUUklORzoKKwkJLyogY2hlY2sgcGFyYW1ldGVyIHNlcGFyYXRvciAqLworCQlpZiAoKmVvYysrICE9ICc9JykKKwkJCWdvdG8gYmFkX3BhcmFtOworCisJCS8qIHJldHJpZXZlIHBhcmFtZXRlciB2YWx1ZSAqLworCQlwdHIgPSBrc3RyZHVwKGVvYywgR0ZQX0FUT01JQyk7CisKKwkJLyogcXVldWUgZXZlbnQgKi8KKwkJYWRkX2NpZF9ldmVudChjcywgY2lkLCBydC0+cmVzcF9jb2RlLCBwdHIsIDApOworCQlicmVhazsKKworCWNhc2UgUlRfWkNBVToKKwkJLyogY2hlY2sgcGFyYW1ldGVyIHNlcGFyYXRvcnMgKi8KKwkJaWYgKCplb2MrKyAhPSAnPScpCisJCQlnb3RvIGJhZF9wYXJhbTsKKwkJcHNlcCA9IHN0cmNocihlb2MsICcsJyk7CisJCWlmICghcHNlcCkKKwkJCWdvdG8gYmFkX3BhcmFtOworCQkqcHNlcCsrID0gMDsKKworCQkvKiBkZWNvZGUgcGFyYW1ldGVyIHZhbHVlcyAqLworCQlpZiAoa3N0cnRvdTgoZW9jLCAxNiwgJnR5cGUpIHx8IGtzdHJ0b3U4KHBzZXAsIDE2LCAmdmFsdWUpKSB7CisJCQkqLS1wc2VwID0gJywnOworCQkJZ290byBiYWRfcGFyYW07CisJCX0KKwkJcGFyYW1ldGVyID0gKHR5cGUgPDwgOCkgfCB2YWx1ZTsKKworCQlhZGRfY2lkX2V2ZW50KGNzLCBjaWQsIHJ0LT5yZXNwX2NvZGUsIE5VTEwsIHBhcmFtZXRlcik7CisJCWJyZWFrOworCisJY2FzZSBSVF9OVU1CRVI6CisJCS8qIGNoZWNrIHBhcmFtZXRlciBzZXBhcmF0b3IgKi8KKwkJaWYgKCplb2MrKyAhPSAnPScpCisJCQlnb3RvIGJhZF9wYXJhbTsKKworCQkvKiBkZWNvZGUgcGFyYW1ldGVyIHZhbHVlICovCisJCWlmIChrc3RydG9pbnQoZW9jLCAxMCwgJnBhcmFtZXRlcikpCisJCQlnb3RvIGJhZF9wYXJhbTsKKworCQkvKiBzcGVjaWFsIGNhc2UgWkRMRTogc2V0IGZsYWcgYmVmb3JlIHF1ZXVlaW5nIGV2ZW50ICovCisJCWlmIChydC0+cmVzcF9jb2RlID09IFJTUF9aRExFKQorCQkJY3MtPmRsZSA9IHBhcmFtZXRlcjsKKworCQlhZGRfY2lkX2V2ZW50KGNzLCBjaWQsIHJ0LT5yZXNwX2NvZGUsIE5VTEwsIHBhcmFtZXRlcik7CisJCWJyZWFrOworCitiYWRfcGFyYW06CisJCS8qIHBhcmFtZXRlciB1bmV4cGVjdGVkLCBpbmNvbXBsZXRlIG9yIG1hbGZvcm1lZCAqLworCQlkZXZfd2Fybihjcy0+ZGV2LCAiYmFkIHBhcmFtZXRlciBpbiByZXNwb25zZSAnJXMnXG4iLAorCQkJIGNzLT5yZXNwZGF0YSk7CisJCWFkZF9jaWRfZXZlbnQoY3MsIGNpZCwgcnQtPnJlc3BfY29kZSwgTlVMTCwgLTEpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoY3MtPmRldiwgIiVzOiBpbnRlcm5hbCBlcnJvciBvbiAnJXMnXG4iLAorCQkJX19mdW5jX18sIGNzLT5yZXNwZGF0YSk7CiAJfQotCi0JY3MtPmV2X3RhaWwgPSB0YWlsOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNzLT5ldl9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoY3VyYXJnICE9IHBhcmFtcykKLQkJZ2lnX2RiZyhERUJVR19FVkVOVCwKLQkJCSJpbnZhbGlkIG51bWJlciBvZiBwcm9jZXNzZWQgcGFyYW1ldGVyczogJWQvJWQiLAotCQkJY3VyYXJnLCBwYXJhbXMpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2lnYXNldF9oYW5kbGVfbW9kZW1fcmVzcG9uc2UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pbmZpbmVvbi5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL21JU0ROaW5maW5lb24uYwppbmRleCBjMTQ5M2Y0Li5kNWJkYmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vbUlTRE5pbmZpbmVvbi5jCisrKyBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9tSVNETmluZmluZW9uLmMKQEAgLTEwOTIsNyArMTA5Miw3IEBACiAJfQogCWNhcmQtPmNpID0gZ2V0X2NhcmRfaW5mbyhlbnQtPmRyaXZlcl9kYXRhKTsKIAlpZiAoIWNhcmQtPmNpKSB7Ci0JCXByX2luZm8oIm1JU0ROOiBkbyBub3QgaGF2ZSBpbmZvcm1hdGlvbnMgYWJvdXQgYWRhcHRlciBhdCAlc1xuIiwKKwkJcHJfaW5mbygibUlTRE46IGRvIG5vdCBoYXZlIGluZm9ybWF0aW9uIGFib3V0IGFkYXB0ZXIgYXQgJXNcbiIsCiAJCQlwY2lfbmFtZShwZGV2KSk7CiAJCWtmcmVlKGNhcmQpOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKaW5kZXggOTRhZmZhNS4uNTQ2YjdlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCisrKyBiL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYwpAQCAtMTk1MSwzOCArMTk1MSw2IEBACiAJcmV0dXJuIGxlbjsKIH0KIAotLyogV2UgZG9uJ3QgbmVlZCB0byBzZW5kIGFycCwgYmVjYXVzZSB3ZSBoYXZlIHBvaW50LXRvLXBvaW50IGNvbm5lY3Rpb25zLiAqLwotc3RhdGljIGludAotaXNkbl9uZXRfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7Ci0JaXNkbl9uZXRfbG9jYWwgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChscC0+cF9lbmNhcCA9PSBJU0ROX05FVF9FTkNBUF9FVEhFUikgewotCQlzdHJ1Y3QgZXRoaGRyICpldGggPSAoc3RydWN0IGV0aGhkciAqKSBza2ItPmRhdGE7Ci0KLQkJLyoKLQkJICogICAgICBPbmx5IEFSUC9JUCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkCi0JCSAqLwotCi0JCWlmIChldGgtPmhfcHJvdG8gIT0gaHRvbnMoRVRIX1BfSVApKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCQkgICAgICAgImlzZG5fbmV0OiAlcyBkb24ndCBrbm93IGhvdyB0byByZXNvbHZlIHR5cGUgJWQgYWRkcmVzc2VzP1xuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUsIChpbnQpIGV0aC0+aF9wcm90byk7Ci0JCQltZW1jcHkoZXRoLT5oX3NvdXJjZSwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQkvKgotCQkgKiAgICAgIFRyeSB0byBnZXQgQVJQIHRvIHJlc29sdmUgdGhlIGhlYWRlci4KLQkJICovCi0jaWZkZWYgQ09ORklHX0lORVQKLQkJcmV0ID0gYXJwX2ZpbmQoZXRoLT5oX2Rlc3QsIHNrYik7Ci0jZW5kaWYKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIGludCBpc2RuX2hlYWRlcl9jYWNoZShjb25zdCBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IGhoX2NhY2hlICpoaCwKIAkJCSAgICAgX19iZTE2IHR5cGUpCiB7CkBAIC0yMDA1LDcgKzE5NzMsNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhlYWRlcl9vcHMgaXNkbl9oZWFkZXJfb3BzID0gewogCS5jcmVhdGUgPSBpc2RuX25ldF9oZWFkZXIsCi0JLnJlYnVpbGQgPSBpc2RuX25ldF9yZWJ1aWxkX2hlYWRlciwKIAkuY2FjaGUgPSBpc2RuX2hlYWRlcl9jYWNoZSwKIAkuY2FjaGVfdXBkYXRlID0gaXNkbl9oZWFkZXJfY2FjaGVfdXBkYXRlLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9pY24vaWNuLmMgYi9kcml2ZXJzL2lzZG4vaWNuL2ljbi5jCmluZGV4IDZhNzQ0N2MuLjM1OGE1NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pY24vaWNuLmMKKysrIGIvZHJpdmVycy9pc2RuL2ljbi9pY24uYwpAQCAtMTYwOSw3ICsxNjA5LDcgQEAKIAlpZiAoaW50c1swXSA+IDEpCiAJCW1lbWJhc2UgPSAodW5zaWduZWQgbG9uZylpbnRzWzJdOwogCWlmIChzdHIgJiYgKnN0cikgewotCQlzdHJjcHkoc2lkLCBzdHIpOworCQlzdHJsY3B5KHNpZCwgc3RyLCBzaXplb2Yoc2lkKSk7CiAJCWljbl9pZCA9IHNpZDsKIAkJaWYgKChwID0gc3RyY2hyKHNpZCwgJywnKSkpIHsKIAkJCSpwKysgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9jbXguYyBiL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY214LmMKaW5kZXggODdmN2RmZi4uNTJjNDM4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL21JU0ROL2RzcF9jbXguYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2NteC5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIAkJfQogCX0KIAlwcmludGsoS0VSTl9XQVJOSU5HCi0JICAgICAgICIlczogZHNwIGlzIG5vdCBwcmVzZW50IGluIGl0cyBvd24gY29uZl9tZWJlciBsaXN0LlxuIiwKKwkgICAgICAgIiVzOiBkc3AgaXMgbm90IHByZXNlbnQgaW4gaXRzIG93biBjb25mX21lbWJlciBsaXN0LlxuIiwKIAkgICAgICAgX19mdW5jX18pOwogCiAJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vbUlTRE4vZHNwX2NvcmUuYyBiL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY29yZS5jCmluZGV4IDc3MDI1ZjUuLjAyMjJiMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY29yZS5jCisrKyBiL2RyaXZlcnMvaXNkbi9tSVNETi9kc3BfY29yZS5jCkBAIC00NjAsNyArNDYwLDcgQEAKIAkJfQogCQlpZiAoZHNwX2RlYnVnICYgREVCVUdfRFNQX0NPUkUpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVuYWJsZSBtaXhpbmcgb2YgIgotCQkJICAgICAgICJ0eC1kYXRhIHdpdGggY29uZiBtZWJlcnNcbiIsIF9fZnVuY19fKTsKKwkJCSAgICAgICAidHgtZGF0YSB3aXRoIGNvbmYgbWVtYmVyc1xuIiwgX19mdW5jX18pOwogCQlkc3AtPnR4X21peCA9IDE7CiAJCWRzcF9jbXhfaGFyZHdhcmUoZHNwLT5jb25mLCBkc3ApOwogCQlkc3Bfcnhfb2ZmKGRzcCk7CkBAIC00NzQsNyArNDc0LDcgQEAKIAkJfQogCQlpZiAoZHNwX2RlYnVnICYgREVCVUdfRFNQX0NPUkUpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGRpc2FibGUgbWl4aW5nIG9mICIKLQkJCSAgICAgICAidHgtZGF0YSB3aXRoIGNvbmYgbWViZXJzXG4iLCBfX2Z1bmNfXyk7CisJCQkgICAgICAgInR4LWRhdGEgd2l0aCBjb25mIG1lbWJlcnNcbiIsIF9fZnVuY19fKTsKIAkJZHNwLT50eF9taXggPSAwOwogCQlkc3BfY214X2hhcmR3YXJlKGRzcC0+Y29uZiwgZHNwKTsKIAkJZHNwX3J4X29mZihkc3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL21JU0ROL3NvY2tldC5jIGIvZHJpdmVycy9pc2RuL21JU0ROL3NvY2tldC5jCmluZGV4IDg0YjM1OTIuLjhkYzcyOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9tSVNETi9zb2NrZXQuYworKysgYi9kcml2ZXJzL2lzZG4vbUlTRE4vc29ja2V0LmMKQEAgLTExMiw4ICsxMTIsOCBAQAogfQogCiBzdGF0aWMgaW50Ci1tSVNETl9zb2NrX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK21JU0ROX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCisJCSAgIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKIAlzdHJ1Y3Qgc29jawkJKnNrID0gc29jay0+c2s7CkBAIC0xNzMsOCArMTczLDcgQEAKIH0KIAogc3RhdGljIGludAotbUlTRE5fc29ja19zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorbUlTRE5fc29ja19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgc29jawkJKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHNrX2J1ZmYJCSpza2I7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvS2NvbmZpZyBiL2RyaXZlcnMvbGVkcy9LY29uZmlnCmluZGV4IDI1YjMyMGQuLjk2NmI5NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbGVkcy9LY29uZmlnCkBAIC01MjYsNiArNTI2LDE0IEBACiAJICBUaGlzIG9wdGlvbiBlbmFibGVkIHN1cHBvcnQgZm9yIHRoZSBMRURzIG9uIHRoZSBBUk0gVmVyc2F0aWxlCiAJICBhbmQgUmVhbFZpZXcgYm9hcmRzLiBTYXkgWSB0byBlbmFibGVkIHRoZXNlLgogCitjb25maWcgTEVEU19QTTg5NDFfV0xFRAorCXRyaXN0YXRlICJMRUQgc3VwcG9ydCBmb3IgdGhlIFF1YWxjb21tIFBNODk0MSBXTEVEIGJsb2NrIgorCWRlcGVuZHMgb24gTEVEU19DTEFTUworCXNlbGVjdCBSRUdNQVAKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSAnV2hpdGUnIExFRCBibG9jaworCSAgb24gUXVhbGNvbW0gUE04OTQxIFBNSUNzLgorCiBjb21tZW50ICJMRUQgVHJpZ2dlcnMiCiBzb3VyY2UgImRyaXZlcnMvbGVkcy90cmlnZ2VyL0tjb25maWciCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9NYWtlZmlsZSBiL2RyaXZlcnMvbGVkcy9NYWtlZmlsZQppbmRleCBjYmJhOTIxLi5iZjQ2MDkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9sZWRzL01ha2VmaWxlCkBAIC01OCw2ICs1OCw3IEBACiBvYmotJChDT05GSUdfTEVEU19TWVNDT04pCQkrPSBsZWRzLXN5c2Nvbi5vCiBvYmotJChDT05GSUdfTEVEU19WRVJTQVRJTEUpCQkrPSBsZWRzLXZlcnNhdGlsZS5vCiBvYmotJChDT05GSUdfTEVEU19NRU5GMjFCTUMpCQkrPSBsZWRzLW1lbmYyMWJtYy5vCitvYmotJChDT05GSUdfTEVEU19QTTg5NDFfV0xFRCkJCSs9IGxlZHMtcG04OTQxLXdsZWQubwogCiAjIExFRCBTUEkgRHJpdmVycwogb2JqLSQoQ09ORklHX0xFRFNfREFDMTI0UzA4NSkJCSs9IGxlZHMtZGFjMTI0czA4NS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkLWNsYXNzLWZsYXNoLmMgYi9kcml2ZXJzL2xlZHMvbGVkLWNsYXNzLWZsYXNoLmMKaW5kZXggNGExOWZkNC4uM2IyNTczNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZC1jbGFzcy1mbGFzaC5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MtZmxhc2guYwpAQCAtMjE2LDc1ICsyMTYsNiBAQAogfQogc3RhdGljIERFVklDRV9BVFRSX1JPKGZsYXNoX2ZhdWx0KTsKIAotc3RhdGljIHNzaXplX3QgYXZhaWxhYmxlX3N5bmNfbGVkc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2ggKmZsZWRfY2RldiA9IGxjZGV2X3RvX2ZsY2RldihsZWRfY2Rldik7Ci0JY2hhciAqcGJ1ZiA9IGJ1ZjsKLQlpbnQgaSwgYnVmX2xlbjsKLQotCWJ1Zl9sZW4gPSBzcHJpbnRmKHBidWYsICJbMDogbm9uZV0gIik7Ci0JcGJ1ZiArPSBidWZfbGVuOwotCi0JZm9yIChpID0gMDsgaSA8IGZsZWRfY2Rldi0+bnVtX3N5bmNfbGVkczsgKytpKSB7Ci0JCWJ1Zl9sZW4gPSBzcHJpbnRmKHBidWYsICJbJWQ6ICVzXSAiLCBpICsgMSwKLQkJCQkgIGZsZWRfY2Rldi0+c3luY19sZWRzW2ldLT5sZWRfY2Rldi5uYW1lKTsKLQkJcGJ1ZiArPSBidWZfbGVuOwotCX0KLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBidWYpOwotfQotc3RhdGljIERFVklDRV9BVFRSX1JPKGF2YWlsYWJsZV9zeW5jX2xlZHMpOwotCi1zdGF0aWMgc3NpemVfdCBmbGFzaF9zeW5jX3N0cm9iZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQotewotCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGxlZF9jbGFzc2Rldl9mbGFzaCAqZmxlZF9jZGV2ID0gbGNkZXZfdG9fZmxjZGV2KGxlZF9jZGV2KTsKLQl1bnNpZ25lZCBsb25nIGxlZF9pZDsKLQlzc2l6ZV90IHJldDsKLQotCW11dGV4X2xvY2soJmxlZF9jZGV2LT5sZWRfYWNjZXNzKTsKLQotCWlmIChsZWRfc3lzZnNfaXNfZGlzYWJsZWQobGVkX2NkZXYpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JcmV0ID0ga3N0cnRvdWwoYnVmLCAxMCwgJmxlZF9pZCk7Ci0JaWYgKHJldCkKLQkJZ290byB1bmxvY2s7Ci0KLQlpZiAobGVkX2lkID4gZmxlZF9jZGV2LT5udW1fc3luY19sZWRzKSB7Ci0JCXJldCA9IC1FUkFOR0U7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQotCWZsZWRfY2Rldi0+c3luY19sZWRfaWQgPSBsZWRfaWQ7Ci0KLQlyZXQgPSBzaXplOwotdW5sb2NrOgotCW11dGV4X3VubG9jaygmbGVkX2NkZXYtPmxlZF9hY2Nlc3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGZsYXNoX3N5bmNfc3Ryb2JlX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGxlZF9jbGFzc2Rldl9mbGFzaCAqZmxlZF9jZGV2ID0gbGNkZXZfdG9fZmxjZGV2KGxlZF9jZGV2KTsKLQlpbnQgc2xlZF9pZCA9IGZsZWRfY2Rldi0+c3luY19sZWRfaWQ7Ci0JY2hhciAqc3luY19sZWRfbmFtZSA9ICJub25lIjsKLQotCWlmIChmbGVkX2NkZXYtPnN5bmNfbGVkX2lkID4gMCkKLQkJc3luY19sZWRfbmFtZSA9IChjaGFyICopCi0JCQlmbGVkX2NkZXYtPnN5bmNfbGVkc1tzbGVkX2lkIC0gMV0tPmxlZF9jZGV2Lm5hbWU7Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICJbJWQ6ICVzXVxuIiwgc2xlZF9pZCwgc3luY19sZWRfbmFtZSk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFJfUlcoZmxhc2hfc3luY19zdHJvYmUpOwotCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbGVkX2ZsYXNoX3N0cm9iZV9hdHRyc1tdID0gewogCSZkZXZfYXR0cl9mbGFzaF9zdHJvYmUuYXR0ciwKIAlOVUxMLApAQCAtMzA3LDEyICsyMzgsNiBAQAogCU5VTEwsCiB9OwogCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbGVkX2ZsYXNoX3N5bmNfc3Ryb2JlX2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX2F2YWlsYWJsZV9zeW5jX2xlZHMuYXR0ciwKLQkmZGV2X2F0dHJfZmxhc2hfc3luY19zdHJvYmUuYXR0ciwKLQlOVUxMLAotfTsKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbGVkX2ZsYXNoX3N0cm9iZV9ncm91cCA9IHsKIAkuYXR0cnMgPSBsZWRfZmxhc2hfc3Ryb2JlX2F0dHJzLAogfTsKQEAgLTMyOSwxMCArMjU0LDYgQEAKIAkuYXR0cnMgPSBsZWRfZmxhc2hfZmF1bHRfYXR0cnMsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsZWRfZmxhc2hfc3luY19zdHJvYmVfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gbGVkX2ZsYXNoX3N5bmNfc3Ryb2JlX2F0dHJzLAotfTsKLQogc3RhdGljIHZvaWQgbGVkX2ZsYXNoX3Jlc3VtZShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldikKIHsKIAlzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoICpmbGVkX2NkZXYgPSBsY2Rldl90b19mbGNkZXYobGVkX2NkZXYpOwpAQCAtMzYxLDkgKzI4Miw2IEBACiAJaWYgKG9wcy0+ZmF1bHRfZ2V0KQogCQlmbGFzaF9ncm91cHNbbnVtX3N5c2ZzX2dyb3VwcysrXSA9ICZsZWRfZmxhc2hfZmF1bHRfZ3JvdXA7CiAKLQlpZiAobGVkX2NkZXYtPmZsYWdzICYgTEVEX0RFVl9DQVBfU1lOQ19TVFJPQkUpCi0JCWZsYXNoX2dyb3Vwc1tudW1fc3lzZnNfZ3JvdXBzKytdID0gJmxlZF9mbGFzaF9zeW5jX3N0cm9iZV9ncm91cDsKLQogCWxlZF9jZGV2LT5ncm91cHMgPSBmbGFzaF9ncm91cHM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYyBiL2RyaXZlcnMvbGVkcy9sZWQtY2xhc3MuYwppbmRleCA3OTVlYzk5Li43Mjg2ODFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkLWNsYXNzLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZC1jbGFzcy5jCkBAIC0yMTIsNiArMjEyLDMxIEBACiAJLnJlc3VtZSAgICAgICAgID0gbGVkX3Jlc3VtZSwKIH07CiAKK3N0YXRpYyBpbnQgbWF0Y2hfbmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJaWYgKCFkZXZfbmFtZShkZXYpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gIXN0cmNtcChkZXZfbmFtZShkZXYpLCAoY2hhciAqKWRhdGEpOworfQorCitzdGF0aWMgaW50IGxlZF9jbGFzc2Rldl9uZXh0X25hbWUoY29uc3QgY2hhciAqaW5pdF9uYW1lLCBjaGFyICpuYW1lLAorCQkJCSAgc2l6ZV90IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJaW50IHJldCA9IDA7CisKKwlzdHJsY3B5KG5hbWUsIGluaXRfbmFtZSwgbGVuKTsKKworCXdoaWxlIChjbGFzc19maW5kX2RldmljZShsZWRzX2NsYXNzLCBOVUxMLCBuYW1lLCBtYXRjaF9uYW1lKSAmJgorCSAgICAgICAocmV0IDwgbGVuKSkKKwkJcmV0ID0gc25wcmludGYobmFtZSwgbGVuLCAiJXNfJXUiLCBpbml0X25hbWUsICsraSk7CisKKwlpZiAocmV0ID49IGxlbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gaTsKK30KKwogLyoqCiAgKiBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIgLSByZWdpc3RlciBhIG5ldyBvYmplY3Qgb2YgbGVkX2NsYXNzZGV2IGNsYXNzLgogICogQHBhcmVudDogVGhlIGRldmljZSB0byByZWdpc3Rlci4KQEAgLTIxOSwxMiArMjQ0LDIyIEBACiAgKi8KIGludCBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LCBzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldikKIHsKKwljaGFyIG5hbWVbNjRdOworCWludCByZXQ7CisKKwlyZXQgPSBsZWRfY2xhc3NkZXZfbmV4dF9uYW1lKGxlZF9jZGV2LT5uYW1lLCBuYW1lLCBzaXplb2YobmFtZSkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJbGVkX2NkZXYtPmRldiA9IGRldmljZV9jcmVhdGVfd2l0aF9ncm91cHMobGVkc19jbGFzcywgcGFyZW50LCAwLAotCQkJCQlsZWRfY2RldiwgbGVkX2NkZXYtPmdyb3VwcywKLQkJCQkJIiVzIiwgbGVkX2NkZXYtPm5hbWUpOworCQkJCWxlZF9jZGV2LCBsZWRfY2Rldi0+Z3JvdXBzLCAiJXMiLCBuYW1lKTsKIAlpZiAoSVNfRVJSKGxlZF9jZGV2LT5kZXYpKQogCQlyZXR1cm4gUFRSX0VSUihsZWRfY2Rldi0+ZGV2KTsKIAorCWlmIChyZXQpCisJCWRldl93YXJuKHBhcmVudCwgIkxlZCAlcyByZW5hbWVkIHRvICVzIGR1ZSB0byBuYW1lIGNvbGxpc2lvbiIsCisJCQkJbGVkX2NkZXYtPm5hbWUsIGRldl9uYW1lKGxlZF9jZGV2LT5kZXYpKTsKKwogI2lmZGVmIENPTkZJR19MRURTX1RSSUdHRVJTCiAJaW5pdF9yd3NlbSgmbGVkX2NkZXYtPnRyaWdnZXJfbG9jayk7CiAjZW5kaWYKQEAgLTI4OCw2ICszMjMsNjMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKTsKIAorc3RhdGljIHZvaWQgZGV2bV9sZWRfY2xhc3NkZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcykKK3sKKwlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigqKHN0cnVjdCBsZWRfY2xhc3NkZXYgKiopcmVzKTsKK30KKworLyoqCisgKiBkZXZtX2xlZF9jbGFzc2Rldl9yZWdpc3RlciAtIHJlc291cmNlIG1hbmFnZWQgbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKCkKKyAqIEBwYXJlbnQ6IFRoZSBkZXZpY2UgdG8gcmVnaXN0ZXIuCisgKiBAbGVkX2NkZXY6IHRoZSBsZWRfY2xhc3NkZXYgc3RydWN0dXJlIGZvciB0aGlzIGRldmljZS4KKyAqLworaW50IGRldm1fbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJCSAgICAgICBzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldikKK3sKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2ICoqZHI7CisJaW50IHJjOworCisJZHIgPSBkZXZyZXNfYWxsb2MoZGV2bV9sZWRfY2xhc3NkZXZfcmVsZWFzZSwgc2l6ZW9mKCpkciksIEdGUF9LRVJORUwpOworCWlmICghZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIocGFyZW50LCBsZWRfY2Rldik7CisJaWYgKHJjKSB7CisJCWRldnJlc19mcmVlKGRyKTsKKwkJcmV0dXJuIHJjOworCX0KKworCSpkciA9IGxlZF9jZGV2OworCWRldnJlc19hZGQocGFyZW50LCBkcik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1fbGVkX2NsYXNzZGV2X3JlZ2lzdGVyKTsKKworc3RhdGljIGludCBkZXZtX2xlZF9jbGFzc2Rldl9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbGVkX2NkZXYgKipwID0gcmVzOworCisJaWYgKFdBUk5fT04oIXAgfHwgISpwKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gKnAgPT0gZGF0YTsKK30KKworLyoqCisgKiBkZXZtX2xlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCkgLSByZXNvdXJjZSBtYW5hZ2VkIGxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCkKKyAqIEBwYXJlbnQ6IFRoZSBkZXZpY2UgdG8gdW5yZWdpc3Rlci4KKyAqIEBsZWRfY2RldjogdGhlIGxlZF9jbGFzc2RldiBzdHJ1Y3R1cmUgZm9yIHRoaXMgZGV2aWNlLgorICovCit2b2lkIGRldm1fbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpCit7CisJV0FSTl9PTihkZXZyZXNfcmVsZWFzZShkZXYsCisJCQkgICAgICAgZGV2bV9sZWRfY2xhc3NkZXZfcmVsZWFzZSwKKwkJCSAgICAgICBkZXZtX2xlZF9jbGFzc2Rldl9tYXRjaCwgbGVkX2NkZXYpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1fbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIpOworCiBzdGF0aWMgaW50IF9faW5pdCBsZWRzX2luaXQodm9pZCkKIHsKIAlsZWRzX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAibGVkcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbHA4NTAxLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDg1MDEuYwppbmRleCAwMGYwNjhiLi5kMzA5OGUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1scDg1MDEuYworKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDg1MDEuYwpAQCAtNDA2LDYgKzQwNiw2IEBACiAKIG1vZHVsZV9pMmNfZHJpdmVyKGxwODUwMV9kcml2ZXIpOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIlRleGFzIEluc3RydW1lbnRzIExQODUwMSBMRUQgZHJ2aWVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRleGFzIEluc3RydW1lbnRzIExQODUwMSBMRUQgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNaWxvIEtpbSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZWRzL2xlZHMtbHA4ODYwLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1scDg4NjAuYwppbmRleCA4NDBlOTNmMy4uOGMyYjdmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZWRzL2xlZHMtbHA4ODYwLmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtbHA4ODYwLmMKQEAgLTM5MSwxMSArMzkxLDEzIEBACiAJCX0KIAl9CiAKLQlsZWQtPmVuYWJsZV9ncGlvID0gZGV2bV9ncGlvZF9nZXQoJmNsaWVudC0+ZGV2LCAiZW5hYmxlIik7Ci0JaWYgKElTX0VSUihsZWQtPmVuYWJsZV9ncGlvKSkKLQkJbGVkLT5lbmFibGVfZ3BpbyA9IE5VTEw7Ci0JZWxzZQotCQlncGlvZF9kaXJlY3Rpb25fb3V0cHV0KGxlZC0+ZW5hYmxlX2dwaW8sIDApOworCWxlZC0+ZW5hYmxlX2dwaW8gPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbCgmY2xpZW50LT5kZXYsCisJCQkJCQkgICAiZW5hYmxlIiwgR1BJT0RfT1VUX0xPVyk7CisJaWYgKElTX0VSUihsZWQtPmVuYWJsZV9ncGlvKSkgeworCQlyZXQgPSBQVFJfRVJSKGxlZC0+ZW5hYmxlX2dwaW8pOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBnZXQgZW5hYmxlIGdwaW86ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KIAogCWxlZC0+cmVndWxhdG9yID0gZGV2bV9yZWd1bGF0b3JfZ2V0KCZjbGllbnQtPmRldiwgInZsZWQiKTsKIAlpZiAoSVNfRVJSKGxlZC0+cmVndWxhdG9yKSkKQEAgLTQ4Niw2ICs0ODgsNiBAQAogfTsKIG1vZHVsZV9pMmNfZHJpdmVyKGxwODg2MF9kcml2ZXIpOwogCi1NT0RVTEVfREVTQ1JJUFRJT04oIlRleGFzIEluc3RydW1lbnRzIExQODg2MCBMRUQgZHJ2aWVyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRleGFzIEluc3RydW1lbnRzIExQODg2MCBMRUQgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJEYW4gTXVycGh5IDxkbXVycGh5QHRpLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXBjYTk2M3guYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXBjYTk2M3guYwppbmRleCBmMTEwYjRjLi5iZWUzZTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xlZHMvbGVkcy1wY2E5NjN4LmMKKysrIGIvZHJpdmVycy9sZWRzL2xlZHMtcGNhOTYzeC5jCkBAIC0yODksNyArMjg5LDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5wLCBjaGlsZCkgewotCQlzdHJ1Y3QgbGVkX2luZm8gbGVkOworCQlzdHJ1Y3QgbGVkX2luZm8gbGVkID0ge307CiAJCXUzMiByZWc7CiAJCWludCByZXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGVkcy9sZWRzLXBtODk0MS13bGVkLmMgYi9kcml2ZXJzL2xlZHMvbGVkcy1wbTg5NDEtd2xlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjRhNTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2xlZHMvbGVkcy1wbTg5NDEtd2xlZC5jCkBAIC0wLDAgKzEsNDM1IEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIFNvbnkgTW9iaWxlIENvbW11bmljYXRpb25zLCBBQi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2RlZmluZSBQTTg5NDFfV0xFRF9SRUdfVkFMX0JBU0UJCTB4NDAKKyNkZWZpbmUgIFBNODk0MV9XTEVEX1JFR19WQUxfTUFYCQkweEZGRgorCisjZGVmaW5lIFBNODk0MV9XTEVEX1JFR19NT0RfRU4JCQkweDQ2CisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfTU9EX0VOX0JJVAkJQklUKDcpCisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfTU9EX0VOX01BU0sJCUJJVCg3KQorCisjZGVmaW5lIFBNODk0MV9XTEVEX1JFR19TWU5DCQkJMHg0NworI2RlZmluZSAgUE04OTQxX1dMRURfUkVHX1NZTkNfTUFTSwkJMHgwNworI2RlZmluZSAgUE04OTQxX1dMRURfUkVHX1NZTkNfTEVEMQkJQklUKDApCisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfU1lOQ19MRUQyCQlCSVQoMSkKKyNkZWZpbmUgIFBNODk0MV9XTEVEX1JFR19TWU5DX0xFRDMJCUJJVCgyKQorI2RlZmluZSAgUE04OTQxX1dMRURfUkVHX1NZTkNfQUxMCQkweDA3CisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfU1lOQ19DTEVBUgkJMHgwMAorCisjZGVmaW5lIFBNODk0MV9XTEVEX1JFR19GUkVRCQkJMHg0YworI2RlZmluZSAgUE04OTQxX1dMRURfUkVHX0ZSRVFfTUFTSwkJMHgwZgorCisjZGVmaW5lIFBNODk0MV9XTEVEX1JFR19PVlAJCQkweDRkCisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfT1ZQX01BU0sJCTB4MDMKKworI2RlZmluZSBQTTg5NDFfV0xFRF9SRUdfQk9PU1QJCQkweDRlCisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfQk9PU1RfTUFTSwkJMHgwNworCisjZGVmaW5lIFBNODk0MV9XTEVEX1JFR19TSU5LCQkJMHg0ZgorI2RlZmluZSAgUE04OTQxX1dMRURfUkVHX1NJTktfTUFTSwkJMHhlMAorI2RlZmluZSAgUE04OTQxX1dMRURfUkVHX1NJTktfU0hGVAkJMHgwNQorCisvKiBQZXItJ3N0cmluZycgcmVnaXN0ZXJzIGJlbG93ICovCisjZGVmaW5lIFBNODk0MV9XTEVEX1JFR19TVFJfT0ZGU0VUCQkweDEwCisKKyNkZWZpbmUgUE04OTQxX1dMRURfUkVHX1NUUl9NT0RfRU5fQkFTRQkJMHg2MAorI2RlZmluZSAgUE04OTQxX1dMRURfUkVHX1NUUl9NT0RfTUFTSwkJQklUKDcpCisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfU1RSX01PRF9FTgkJQklUKDcpCisKKyNkZWZpbmUgUE04OTQxX1dMRURfUkVHX1NUUl9TQ0FMRV9CQVNFCQkweDYyCisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfU1RSX1NDQUxFX01BU0sJCTB4MWYKKworI2RlZmluZSBQTTg5NDFfV0xFRF9SRUdfU1RSX01PRF9TUkNfQkFTRQkweDYzCisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfU1RSX01PRF9TUkNfTUFTSwkweDAxCisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfU1RSX01PRF9TUkNfSU5UCTB4MDAKKyNkZWZpbmUgIFBNODk0MV9XTEVEX1JFR19TVFJfTU9EX1NSQ19FWFQJMHgwMQorCisjZGVmaW5lIFBNODk0MV9XTEVEX1JFR19TVFJfQ0FCQ19CQVNFCQkweDY2CisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfU1RSX0NBQkNfTUFTSwkJQklUKDcpCisjZGVmaW5lICBQTTg5NDFfV0xFRF9SRUdfU1RSX0NBQkNfRU4JCUJJVCg3KQorCitzdHJ1Y3QgcG04OTQxX3dsZWRfY29uZmlnIHsKKwl1MzIgaV9ib29zdF9saW1pdDsKKwl1MzIgb3ZwOworCXUzMiBzd2l0Y2hfZnJlcTsKKwl1MzIgbnVtX3N0cmluZ3M7CisJdTMyIGlfbGltaXQ7CisJYm9vbCBjc19vdXRfZW47CisJYm9vbCBleHRfZ2VuOworCWJvb2wgY2FiY19lbjsKK307CisKK3N0cnVjdCBwbTg5NDFfd2xlZCB7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXUxNiBhZGRyOworCisJc3RydWN0IGxlZF9jbGFzc2RldiBjZGV2OworCisJc3RydWN0IHBtODk0MV93bGVkX2NvbmZpZyBjZmc7Cit9OworCitzdGF0aWMgaW50IHBtODk0MV93bGVkX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpjZGV2LAorCQkJICAgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlzdHJ1Y3QgcG04OTQxX3dsZWQgKndsZWQ7CisJdTggY3RybCA9IDA7CisJdTE2IHZhbDsKKwlpbnQgcmM7CisJaW50IGk7CisKKwl3bGVkID0gY29udGFpbmVyX29mKGNkZXYsIHN0cnVjdCBwbTg5NDFfd2xlZCwgY2Rldik7CisKKwlpZiAodmFsdWUgIT0gMCkKKwkJY3RybCA9IFBNODk0MV9XTEVEX1JFR19NT0RfRU5fQklUOworCisJdmFsID0gdmFsdWUgKiBQTTg5NDFfV0xFRF9SRUdfVkFMX01BWCAvIExFRF9GVUxMOworCisJcmMgPSByZWdtYXBfdXBkYXRlX2JpdHMod2xlZC0+cmVnbWFwLAorCQkJd2xlZC0+YWRkciArIFBNODk0MV9XTEVEX1JFR19NT0RfRU4sCisJCQlQTTg5NDFfV0xFRF9SRUdfTU9EX0VOX01BU0ssIGN0cmwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJZm9yIChpID0gMDsgaSA8IHdsZWQtPmNmZy5udW1fc3RyaW5nczsgKytpKSB7CisJCXU4IHZbMl0gPSB7IHZhbCAmIDB4ZmYsICh2YWwgPj4gOCkgJiAweGYgfTsKKworCQlyYyA9IHJlZ21hcF9idWxrX3dyaXRlKHdsZWQtPnJlZ21hcCwKKwkJCQl3bGVkLT5hZGRyICsgUE04OTQxX1dMRURfUkVHX1ZBTF9CQVNFICsgMiAqIGksCisJCQkJdiwgMik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisKKwlyYyA9IHJlZ21hcF91cGRhdGVfYml0cyh3bGVkLT5yZWdtYXAsCisJCQl3bGVkLT5hZGRyICsgUE04OTQxX1dMRURfUkVHX1NZTkMsCisJCQlQTTg5NDFfV0xFRF9SRUdfU1lOQ19NQVNLLCBQTTg5NDFfV0xFRF9SRUdfU1lOQ19BTEwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSByZWdtYXBfdXBkYXRlX2JpdHMod2xlZC0+cmVnbWFwLAorCQkJd2xlZC0+YWRkciArIFBNODk0MV9XTEVEX1JFR19TWU5DLAorCQkJUE04OTQxX1dMRURfUkVHX1NZTkNfTUFTSywgUE04OTQxX1dMRURfUkVHX1NZTkNfQ0xFQVIpOworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgcG04OTQxX3dsZWRfc2V0X2JyaWdodG5lc3Moc3RydWN0IGxlZF9jbGFzc2RldiAqY2RldiwKKwkJCQkgICAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyB2YWx1ZSkKK3sKKwlpZiAocG04OTQxX3dsZWRfc2V0KGNkZXYsIHZhbHVlKSkgeworCQlkZXZfZXJyKGNkZXYtPmRldiwgIlVuYWJsZSB0byBzZXQgYnJpZ2h0bmVzc1xuIik7CisJCXJldHVybjsKKwl9CisJY2Rldi0+YnJpZ2h0bmVzcyA9IHZhbHVlOworfQorCitzdGF0aWMgaW50IHBtODk0MV93bGVkX3NldHVwKHN0cnVjdCBwbTg5NDFfd2xlZCAqd2xlZCkKK3sKKwlpbnQgcmM7CisJaW50IGk7CisKKwlyYyA9IHJlZ21hcF91cGRhdGVfYml0cyh3bGVkLT5yZWdtYXAsCisJCQl3bGVkLT5hZGRyICsgUE04OTQxX1dMRURfUkVHX09WUCwKKwkJCVBNODk0MV9XTEVEX1JFR19PVlBfTUFTSywgd2xlZC0+Y2ZnLm92cCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHJlZ21hcF91cGRhdGVfYml0cyh3bGVkLT5yZWdtYXAsCisJCQl3bGVkLT5hZGRyICsgUE04OTQxX1dMRURfUkVHX0JPT1NULAorCQkJUE04OTQxX1dMRURfUkVHX0JPT1NUX01BU0ssIHdsZWQtPmNmZy5pX2Jvb3N0X2xpbWl0KTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXJjID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHdsZWQtPnJlZ21hcCwKKwkJCXdsZWQtPmFkZHIgKyBQTTg5NDFfV0xFRF9SRUdfRlJFUSwKKwkJCVBNODk0MV9XTEVEX1JFR19GUkVRX01BU0ssIHdsZWQtPmNmZy5zd2l0Y2hfZnJlcSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlpZiAod2xlZC0+Y2ZnLmNzX291dF9lbikgeworCQl1OCBhbGwgPSAoQklUKHdsZWQtPmNmZy5udW1fc3RyaW5ncykgLSAxKQorCQkJCTw8IFBNODk0MV9XTEVEX1JFR19TSU5LX1NIRlQ7CisKKwkJcmMgPSByZWdtYXBfdXBkYXRlX2JpdHMod2xlZC0+cmVnbWFwLAorCQkJCXdsZWQtPmFkZHIgKyBQTTg5NDFfV0xFRF9SRUdfU0lOSywKKwkJCQlQTTg5NDFfV0xFRF9SRUdfU0lOS19NQVNLLCBhbGwpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHdsZWQtPmNmZy5udW1fc3RyaW5nczsgKytpKSB7CisJCXUxNiBhZGRyID0gd2xlZC0+YWRkciArIFBNODk0MV9XTEVEX1JFR19TVFJfT0ZGU0VUICogaTsKKworCQlyYyA9IHJlZ21hcF91cGRhdGVfYml0cyh3bGVkLT5yZWdtYXAsCisJCQkJYWRkciArIFBNODk0MV9XTEVEX1JFR19TVFJfTU9EX0VOX0JBU0UsCisJCQkJUE04OTQxX1dMRURfUkVHX1NUUl9NT0RfTUFTSywKKwkJCQlQTTg5NDFfV0xFRF9SRUdfU1RSX01PRF9FTik7CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKworCQlpZiAod2xlZC0+Y2ZnLmV4dF9nZW4pIHsKKwkJCXJjID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHdsZWQtPnJlZ21hcCwKKwkJCQkJYWRkciArIFBNODk0MV9XTEVEX1JFR19TVFJfTU9EX1NSQ19CQVNFLAorCQkJCQlQTTg5NDFfV0xFRF9SRUdfU1RSX01PRF9TUkNfTUFTSywKKwkJCQkJUE04OTQxX1dMRURfUkVHX1NUUl9NT0RfU1JDX0VYVCk7CisJCQlpZiAocmMpCisJCQkJcmV0dXJuIHJjOworCQl9CisKKwkJcmMgPSByZWdtYXBfdXBkYXRlX2JpdHMod2xlZC0+cmVnbWFwLAorCQkJCWFkZHIgKyBQTTg5NDFfV0xFRF9SRUdfU1RSX1NDQUxFX0JBU0UsCisJCQkJUE04OTQxX1dMRURfUkVHX1NUUl9TQ0FMRV9NQVNLLAorCQkJCXdsZWQtPmNmZy5pX2xpbWl0KTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCisJCXJjID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHdsZWQtPnJlZ21hcCwKKwkJCQlhZGRyICsgUE04OTQxX1dMRURfUkVHX1NUUl9DQUJDX0JBU0UsCisJCQkJUE04OTQxX1dMRURfUkVHX1NUUl9DQUJDX01BU0ssCisJCQkJd2xlZC0+Y2ZnLmNhYmNfZW4gPworCQkJCQlQTTg5NDFfV0xFRF9SRUdfU1RSX0NBQkNfRU4gOiAwKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBtODk0MV93bGVkX2NvbmZpZyBwbTg5NDFfd2xlZF9jb25maWdfZGVmYXVsdHMgPSB7CisJLmlfYm9vc3RfbGltaXQgPSAzLAorCS5pX2xpbWl0ID0gMjAsCisJLm92cCA9IDIsCisJLnN3aXRjaF9mcmVxID0gNSwKKwkubnVtX3N0cmluZ3MgPSAwLAorCS5jc19vdXRfZW4gPSBmYWxzZSwKKwkuZXh0X2dlbiA9IGZhbHNlLAorCS5jYWJjX2VuID0gZmFsc2UsCit9OworCitzdHJ1Y3QgcG04OTQxX3dsZWRfdmFyX2NmZyB7CisJY29uc3QgdTMyICp2YWx1ZXM7CisJdTMyICgqZm4pKHUzMik7CisJaW50IHNpemU7Cit9OworCitzdGF0aWMgY29uc3QgdTMyIHBtODk0MV93bGVkX2lfYm9vc3RfbGltaXRfdmFsdWVzW10gPSB7CisJMTA1LCAzODUsIDUyNSwgODA1LCA5ODAsIDEyNjAsIDE0MDAsIDE2ODAsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBtODk0MV93bGVkX3Zhcl9jZmcgcG04OTQxX3dsZWRfaV9ib29zdF9saW1pdF9jZmcgPSB7CisJLnZhbHVlcyA9IHBtODk0MV93bGVkX2lfYm9vc3RfbGltaXRfdmFsdWVzLAorCS5zaXplID0gQVJSQVlfU0laRShwbTg5NDFfd2xlZF9pX2Jvb3N0X2xpbWl0X3ZhbHVlcyksCit9OworCitzdGF0aWMgY29uc3QgdTMyIHBtODk0MV93bGVkX292cF92YWx1ZXNbXSA9IHsKKwkzNSwgMzIsIDI5LCAyNywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG04OTQxX3dsZWRfdmFyX2NmZyBwbTg5NDFfd2xlZF9vdnBfY2ZnID0geworCS52YWx1ZXMgPSBwbTg5NDFfd2xlZF9vdnBfdmFsdWVzLAorCS5zaXplID0gQVJSQVlfU0laRShwbTg5NDFfd2xlZF9vdnBfdmFsdWVzKSwKK307CisKK3N0YXRpYyB1MzIgcG04OTQxX3dsZWRfbnVtX3N0cmluZ3NfdmFsdWVzX2ZuKHUzMiBpZHgpCit7CisJcmV0dXJuIGlkeCArIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG04OTQxX3dsZWRfdmFyX2NmZyBwbTg5NDFfd2xlZF9udW1fc3RyaW5nc19jZmcgPSB7CisJLmZuID0gcG04OTQxX3dsZWRfbnVtX3N0cmluZ3NfdmFsdWVzX2ZuLAorCS5zaXplID0gMywKK307CisKK3N0YXRpYyB1MzIgcG04OTQxX3dsZWRfc3dpdGNoX2ZyZXFfdmFsdWVzX2ZuKHUzMiBpZHgpCit7CisJcmV0dXJuIDE5MjAwIC8gKDIgKiAoMSArIGlkeCkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBtODk0MV93bGVkX3Zhcl9jZmcgcG04OTQxX3dsZWRfc3dpdGNoX2ZyZXFfY2ZnID0geworCS5mbiA9IHBtODk0MV93bGVkX3N3aXRjaF9mcmVxX3ZhbHVlc19mbiwKKwkuc2l6ZSA9IDE2LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbTg5NDFfd2xlZF92YXJfY2ZnIHBtODk0MV93bGVkX2lfbGltaXRfY2ZnID0geworCS5zaXplID0gMjYsCit9OworCitzdGF0aWMgdTMyIHBtODk0MV93bGVkX3ZhbHVlcyhjb25zdCBzdHJ1Y3QgcG04OTQxX3dsZWRfdmFyX2NmZyAqY2ZnLCB1MzIgaWR4KQoreworCWlmIChpZHggPj0gY2ZnLT5zaXplKQorCQlyZXR1cm4gVUlOVF9NQVg7CisJaWYgKGNmZy0+Zm4pCisJCXJldHVybiBjZmctPmZuKGlkeCk7CisJaWYgKGNmZy0+dmFsdWVzKQorCQlyZXR1cm4gY2ZnLT52YWx1ZXNbaWR4XTsKKwlyZXR1cm4gaWR4OworfQorCitzdGF0aWMgaW50IHBtODk0MV93bGVkX2NvbmZpZ3VyZShzdHJ1Y3QgcG04OTQxX3dsZWQgKndsZWQsIHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG04OTQxX3dsZWRfY29uZmlnICpjZmcgPSAmd2xlZC0+Y2ZnOworCXUzMiB2YWw7CisJaW50IHJjOworCXUzMiBjOworCWludCBpOworCWludCBqOworCisJY29uc3Qgc3RydWN0IHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKwkJdTMyICp2YWxfcHRyOworCQljb25zdCBzdHJ1Y3QgcG04OTQxX3dsZWRfdmFyX2NmZyAqY2ZnOworCX0gdTMyX29wdHNbXSA9IHsKKwkJeworCQkJInFjb20sY3VycmVudC1ib29zdC1saW1pdCIsCisJCQkmY2ZnLT5pX2Jvb3N0X2xpbWl0LAorCQkJLmNmZyA9ICZwbTg5NDFfd2xlZF9pX2Jvb3N0X2xpbWl0X2NmZywKKwkJfSwKKwkJeworCQkJInFjb20sY3VycmVudC1saW1pdCIsCisJCQkmY2ZnLT5pX2xpbWl0LAorCQkJLmNmZyA9ICZwbTg5NDFfd2xlZF9pX2xpbWl0X2NmZywKKwkJfSwKKwkJeworCQkJInFjb20sb3ZwIiwKKwkJCSZjZmctPm92cCwKKwkJCS5jZmcgPSAmcG04OTQxX3dsZWRfb3ZwX2NmZywKKwkJfSwKKwkJeworCQkJInFjb20sc3dpdGNoaW5nLWZyZXEiLAorCQkJJmNmZy0+c3dpdGNoX2ZyZXEsCisJCQkuY2ZnID0gJnBtODk0MV93bGVkX3N3aXRjaF9mcmVxX2NmZywKKwkJfSwKKwkJeworCQkJInFjb20sbnVtLXN0cmluZ3MiLAorCQkJJmNmZy0+bnVtX3N0cmluZ3MsCisJCQkuY2ZnID0gJnBtODk0MV93bGVkX251bV9zdHJpbmdzX2NmZywKKwkJfSwKKwl9OworCWNvbnN0IHN0cnVjdCB7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWJvb2wgKnZhbF9wdHI7CisJfSBib29sX29wdHNbXSA9IHsKKwkJeyAicWNvbSxjcy1vdXQiLCAmY2ZnLT5jc19vdXRfZW4sIH0sCisJCXsgInFjb20sZXh0LWdlbiIsICZjZmctPmV4dF9nZW4sIH0sCisJCXsgInFjb20sY2FiYyIsICZjZmctPmNhYmNfZW4sIH0sCisJfTsKKworCXJjID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAicmVnIiwgJnZhbCk7CisJaWYgKHJjIHx8IHZhbCA+IDB4ZmZmZikgeworCQlkZXZfZXJyKGRldiwgImludmFsaWQgSU8gcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuIHJjID8gcmMgOiAtRUlOVkFMOworCX0KKwl3bGVkLT5hZGRyID0gdmFsOworCisJcmMgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhkZXYtPm9mX25vZGUsICJsYWJlbCIsICZ3bGVkLT5jZGV2Lm5hbWUpOworCWlmIChyYykKKwkJd2xlZC0+Y2Rldi5uYW1lID0gZGV2LT5vZl9ub2RlLT5uYW1lOworCisJd2xlZC0+Y2Rldi5kZWZhdWx0X3RyaWdnZXIgPSBvZl9nZXRfcHJvcGVydHkoZGV2LT5vZl9ub2RlLAorCQkJImxpbnV4LGRlZmF1bHQtdHJpZ2dlciIsIE5VTEwpOworCisJKmNmZyA9IHBtODk0MV93bGVkX2NvbmZpZ19kZWZhdWx0czsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh1MzJfb3B0cyk7ICsraSkgeworCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgdTMyX29wdHNbaV0ubmFtZSwgJnZhbCk7CisJCWlmIChyYyA9PSAtRUlOVkFMKSB7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChyYykgeworCQkJZGV2X2VycihkZXYsICJlcnJvciByZWFkaW5nICclcydcbiIsIHUzMl9vcHRzW2ldLm5hbWUpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJYyA9IFVJTlRfTUFYOworCQlmb3IgKGogPSAwOyBjICE9IHZhbDsgaisrKSB7CisJCQljID0gcG04OTQxX3dsZWRfdmFsdWVzKHUzMl9vcHRzW2ldLmNmZywgaik7CisJCQlpZiAoYyA9PSBVSU5UX01BWCkgeworCQkJCWRldl9lcnIoZGV2LCAiaW52YWxpZCB2YWx1ZSBmb3IgJyVzJ1xuIiwKKwkJCQkJdTMyX29wdHNbaV0ubmFtZSk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKworCQlkZXZfZGJnKGRldiwgIiclcycgPSAldVxuIiwgdTMyX29wdHNbaV0ubmFtZSwgYyk7CisJCSp1MzJfb3B0c1tpXS52YWxfcHRyID0gajsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShib29sX29wdHMpOyArK2kpIHsKKwkJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChkZXYtPm9mX25vZGUsIGJvb2xfb3B0c1tpXS5uYW1lKSkKKwkJCSpib29sX29wdHNbaV0udmFsX3B0ciA9IHRydWU7CisJfQorCisJY2ZnLT5udW1fc3RyaW5ncyA9IGNmZy0+bnVtX3N0cmluZ3MgKyAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcG04OTQxX3dsZWRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgcG04OTQxX3dsZWQgKndsZWQ7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCWludCByYzsKKworCXJlZ21hcCA9IGRldl9nZXRfcmVnbWFwKHBkZXYtPmRldi5wYXJlbnQsIE5VTEwpOworCWlmICghcmVnbWFwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgcmVnbWFwXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJd2xlZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKndsZWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdsZWQpCisJCXJldHVybiAtRU5PTUVNOworCisJd2xlZC0+cmVnbWFwID0gcmVnbWFwOworCisJcmMgPSBwbTg5NDFfd2xlZF9jb25maWd1cmUod2xlZCwgJnBkZXYtPmRldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlyYyA9IHBtODk0MV93bGVkX3NldHVwKHdsZWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJd2xlZC0+Y2Rldi5icmlnaHRuZXNzX3NldCA9IHBtODk0MV93bGVkX3NldF9icmlnaHRuZXNzOworCisJcmMgPSBkZXZtX2xlZF9jbGFzc2Rldl9yZWdpc3RlcigmcGRldi0+ZGV2LCAmd2xlZC0+Y2Rldik7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3bGVkKTsKKworCXJldHVybiAwOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcG04OTQxX3dsZWRfbWF0Y2hfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20scG04OTQxLXdsZWQiIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBwbTg5NDFfd2xlZF9tYXRjaF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHBtODk0MV93bGVkX2RyaXZlciA9IHsKKwkucHJvYmUgPSBwbTg5NDFfd2xlZF9wcm9iZSwKKwkuZHJpdmVyCT0geworCQkubmFtZSA9ICJwbTg5NDEtd2xlZCIsCisJCS5vZl9tYXRjaF90YWJsZQk9IHBtODk0MV93bGVkX21hdGNoX3RhYmxlLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHBtODk0MV93bGVkX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigicG04OTQxIHdsZWQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnBtODk0MS13bGVkIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2xlZHMvbGVkcy1wd20uYyBiL2RyaXZlcnMvbGVkcy9sZWRzLXB3bS5jCmluZGV4IGY2Njg1MDAuLjFkMDdlM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbGVkcy9sZWRzLXB3bS5jCisrKyBiL2RyaXZlcnMvbGVkcy9sZWRzLXB3bS5jCkBAIC0xMjEsOSArMTIxLDYgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoY2hpbGQpCi0JCWxlZF9kYXRhLT5wZXJpb2QgPSBwd21fZ2V0X3BlcmlvZChsZWRfZGF0YS0+cHdtKTsKLQogCWxlZF9kYXRhLT5jYW5fc2xlZXAgPSBwd21fY2FuX3NsZWVwKGxlZF9kYXRhLT5wd20pOwogCWlmIChsZWRfZGF0YS0+Y2FuX3NsZWVwKQogCQlJTklUX1dPUksoJmxlZF9kYXRhLT53b3JrLCBsZWRfcHdtX3dvcmspOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9sZ3Vlc3QvS2NvbmZpZyBiL2RyaXZlcnMvbGd1ZXN0L0tjb25maWcKaW5kZXggZWUwMzVlYy4uMTY5MTcyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9sZ3Vlc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL2xndWVzdC9LY29uZmlnCkBAIC0xLDYgKzEsNiBAQAogY29uZmlnIExHVUVTVAogCXRyaXN0YXRlICJMaW51eCBoeXBlcnZpc29yIGV4YW1wbGUgY29kZSIKLQlkZXBlbmRzIG9uIFg4Nl8zMiAmJiBFVkVOVEZEICYmIFRUWQorCWRlcGVuZHMgb24gWDg2XzMyICYmIEVWRU5URkQgJiYgVFRZICYmIFBDSV9ESVJFQ1QKIAlzZWxlY3QgSFZDX0RSSVZFUgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSBtb2R1bGUgd2hpY2ggYWxsb3dzIHlvdSB0byBydW4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0taW8uYyBiL2RyaXZlcnMvbWQvZG0taW8uYwppbmRleCAzN2RlMDE3Li43NGFkY2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWlvLmMKKysrIGIvZHJpdmVycy9tZC9kbS1pby5jCkBAIC0yODksOSArMjg5LDE2IEBACiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZSh3aGVyZS0+YmRldik7CiAJdW5zaWduZWQgc2hvcnQgbG9naWNhbF9ibG9ja19zaXplID0gcXVldWVfbG9naWNhbF9ibG9ja19zaXplKHEpOwogCXNlY3Rvcl90IG51bV9zZWN0b3JzOworCXVuc2lnbmVkIGludCB1bmluaXRpYWxpemVkX3ZhcihzcGVjaWFsX2NtZF9tYXhfc2VjdG9ycyk7CiAKLQkvKiBSZWplY3QgdW5zdXBwb3J0ZWQgZGlzY2FyZCByZXF1ZXN0cyAqLwotCWlmICgocncgJiBSRVFfRElTQ0FSRCkgJiYgIWJsa19xdWV1ZV9kaXNjYXJkKHEpKSB7CisJLyoKKwkgKiBSZWplY3QgdW5zdXBwb3J0ZWQgZGlzY2FyZCBhbmQgd3JpdGUgc2FtZSByZXF1ZXN0cy4KKwkgKi8KKwlpZiAocncgJiBSRVFfRElTQ0FSRCkKKwkJc3BlY2lhbF9jbWRfbWF4X3NlY3RvcnMgPSBxLT5saW1pdHMubWF4X2Rpc2NhcmRfc2VjdG9yczsKKwllbHNlIGlmIChydyAmIFJFUV9XUklURV9TQU1FKQorCQlzcGVjaWFsX2NtZF9tYXhfc2VjdG9ycyA9IHEtPmxpbWl0cy5tYXhfd3JpdGVfc2FtZV9zZWN0b3JzOworCWlmICgocncgJiAoUkVRX0RJU0NBUkQgfCBSRVFfV1JJVEVfU0FNRSkpICYmIHNwZWNpYWxfY21kX21heF9zZWN0b3JzID09IDApIHsKIAkJZGVjX2NvdW50KGlvLCByZWdpb24sIC1FT1BOT1RTVVBQKTsKIAkJcmV0dXJuOwogCX0KQEAgLTMxNyw3ICszMjQsNyBAQAogCQlzdG9yZV9pb19hbmRfcmVnaW9uX2luX2JpbyhiaW8sIGlvLCByZWdpb24pOwogCiAJCWlmIChydyAmIFJFUV9ESVNDQVJEKSB7Ci0JCQludW1fc2VjdG9ycyA9IG1pbl90KHNlY3Rvcl90LCBxLT5saW1pdHMubWF4X2Rpc2NhcmRfc2VjdG9ycywgcmVtYWluaW5nKTsKKwkJCW51bV9zZWN0b3JzID0gbWluX3Qoc2VjdG9yX3QsIHNwZWNpYWxfY21kX21heF9zZWN0b3JzLCByZW1haW5pbmcpOwogCQkJYmlvLT5iaV9pdGVyLmJpX3NpemUgPSBudW1fc2VjdG9ycyA8PCBTRUNUT1JfU0hJRlQ7CiAJCQlyZW1haW5pbmcgLT0gbnVtX3NlY3RvcnM7CiAJCX0gZWxzZSBpZiAocncgJiBSRVFfV1JJVEVfU0FNRSkgewpAQCAtMzI2LDcgKzMzMyw3IEBACiAJCQkgKi8KIAkJCWRwLT5nZXRfcGFnZShkcCwgJnBhZ2UsICZsZW4sICZvZmZzZXQpOwogCQkJYmlvX2FkZF9wYWdlKGJpbywgcGFnZSwgbG9naWNhbF9ibG9ja19zaXplLCBvZmZzZXQpOwotCQkJbnVtX3NlY3RvcnMgPSBtaW5fdChzZWN0b3JfdCwgcS0+bGltaXRzLm1heF93cml0ZV9zYW1lX3NlY3RvcnMsIHJlbWFpbmluZyk7CisJCQludW1fc2VjdG9ycyA9IG1pbl90KHNlY3Rvcl90LCBzcGVjaWFsX2NtZF9tYXhfc2VjdG9ycywgcmVtYWluaW5nKTsKIAkJCWJpby0+YmlfaXRlci5iaV9zaXplID0gbnVtX3NlY3RvcnMgPDwgU0VDVE9SX1NISUZUOwogCiAJCQlvZmZzZXQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLmMgYi9kcml2ZXJzL21kL2RtLXNuYXAuYwppbmRleCA4YjIwNGFlMi4uZjgzYTBmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1zbmFwLmMKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLmMKQEAgLTIwLDYgKzIwLDggQEAKICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvZG0ta2NvcHlkLmg+CiAKKyNpbmNsdWRlICJkbS5oIgorCiAjaW5jbHVkZSAiZG0tZXhjZXB0aW9uLXN0b3JlLmgiCiAKICNkZWZpbmUgRE1fTVNHX1BSRUZJWCAic25hcHNob3RzIgpAQCAtMjkxLDEyICsyOTMsMjMgQEAKIH07CiAKIC8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBhbGxvY2F0ZWQgZm9yIGVhY2ggb3JpZ2luIHRhcmdldAorICovCitzdHJ1Y3QgZG1fb3JpZ2luIHsKKwlzdHJ1Y3QgZG1fZGV2ICpkZXY7CisJc3RydWN0IGRtX3RhcmdldCAqdGk7CisJdW5zaWduZWQgc3BsaXRfYm91bmRhcnk7CisJc3RydWN0IGxpc3RfaGVhZCBoYXNoX2xpc3Q7Cit9OworCisvKgogICogU2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSBmb3Igb3JpZ2luIHZvbHVtZXMuIElmIHdlIG1ha2UgdGhpcwogICogdGhlIHNpemUgb2YgdGhlIG1pbm9ycyBsaXN0IHRoZW4gaXQgc2hvdWxkIGJlIG5lYXJseSBwZXJmZWN0CiAgKi8KICNkZWZpbmUgT1JJR0lOX0hBU0hfU0laRSAyNTYKICNkZWZpbmUgT1JJR0lOX01BU0sgICAgICAweEZGCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqX29yaWdpbnM7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqX2RtX29yaWdpbnM7CiBzdGF0aWMgc3RydWN0IHJ3X3NlbWFwaG9yZSBfb3JpZ2luc19sb2NrOwogCiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoX3BlbmRpbmdfZXhjZXB0aW9uc19kb25lKTsKQEAgLTMxMCwxMiArMzIzLDIyIEBACiAJX29yaWdpbnMgPSBrbWFsbG9jKE9SSUdJTl9IQVNIX1NJWkUgKiBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksCiAJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAoIV9vcmlnaW5zKSB7Ci0JCURNRVJSKCJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5Iik7CisJCURNRVJSKCJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBfb3JpZ2lucyIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0KIAlmb3IgKGkgPSAwOyBpIDwgT1JJR0lOX0hBU0hfU0laRTsgaSsrKQogCQlJTklUX0xJU1RfSEVBRChfb3JpZ2lucyArIGkpOworCisJX2RtX29yaWdpbnMgPSBrbWFsbG9jKE9SSUdJTl9IQVNIX1NJWkUgKiBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCksCisJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIV9kbV9vcmlnaW5zKSB7CisJCURNRVJSKCJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBfZG1fb3JpZ2lucyIpOworCQlrZnJlZShfb3JpZ2lucyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgT1JJR0lOX0hBU0hfU0laRTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRChfZG1fb3JpZ2lucyArIGkpOworCiAJaW5pdF9yd3NlbSgmX29yaWdpbnNfbG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTMyNCw2ICszNDcsNyBAQAogc3RhdGljIHZvaWQgZXhpdF9vcmlnaW5faGFzaCh2b2lkKQogewogCWtmcmVlKF9vcmlnaW5zKTsKKwlrZnJlZShfZG1fb3JpZ2lucyk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBvcmlnaW5faGFzaChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2KQpAQCAtMzUwLDYgKzM3NCwzMCBAQAogCWxpc3RfYWRkX3RhaWwoJm8tPmhhc2hfbGlzdCwgc2wpOwogfQogCitzdGF0aWMgc3RydWN0IGRtX29yaWdpbiAqX19sb29rdXBfZG1fb3JpZ2luKHN0cnVjdCBibG9ja19kZXZpY2UgKm9yaWdpbikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpvbDsKKwlzdHJ1Y3QgZG1fb3JpZ2luICpvOworCisJb2wgPSAmX2RtX29yaWdpbnNbb3JpZ2luX2hhc2gob3JpZ2luKV07CisJbGlzdF9mb3JfZWFjaF9lbnRyeSAobywgb2wsIGhhc2hfbGlzdCkKKwkJaWYgKGJkZXZfZXF1YWwoby0+ZGV2LT5iZGV2LCBvcmlnaW4pKQorCQkJcmV0dXJuIG87CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgX19pbnNlcnRfZG1fb3JpZ2luKHN0cnVjdCBkbV9vcmlnaW4gKm8pCit7CisJc3RydWN0IGxpc3RfaGVhZCAqc2wgPSAmX2RtX29yaWdpbnNbb3JpZ2luX2hhc2goby0+ZGV2LT5iZGV2KV07CisJbGlzdF9hZGRfdGFpbCgmby0+aGFzaF9saXN0LCBzbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcmVtb3ZlX2RtX29yaWdpbihzdHJ1Y3QgZG1fb3JpZ2luICpvKQoreworCWxpc3RfZGVsKCZvLT5oYXNoX2xpc3QpOworfQorCiAvKgogICogX29yaWdpbnNfbG9jayBtdXN0IGJlIGhlbGQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCiAgKiBSZXR1cm5zIG51bWJlciBvZiBzbmFwc2hvdHMgcmVnaXN0ZXJlZCB1c2luZyB0aGUgc3VwcGxpZWQgY293IGRldmljZSwgcGx1czoKQEAgLTE4NDAsOSArMTg4OCw0MCBAQAogc3RhdGljIHZvaWQgc25hcHNob3RfcmVzdW1lKHN0cnVjdCBkbV90YXJnZXQgKnRpKQogewogCXN0cnVjdCBkbV9zbmFwc2hvdCAqcyA9IHRpLT5wcml2YXRlOwotCXN0cnVjdCBkbV9zbmFwc2hvdCAqc25hcF9zcmMgPSBOVUxMLCAqc25hcF9kZXN0ID0gTlVMTDsKKwlzdHJ1Y3QgZG1fc25hcHNob3QgKnNuYXBfc3JjID0gTlVMTCwgKnNuYXBfZGVzdCA9IE5VTEwsICpzbmFwX21lcmdpbmcgPSBOVUxMOworCXN0cnVjdCBkbV9vcmlnaW4gKm87CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKm9yaWdpbl9tZCA9IE5VTEw7CisJYm9vbCBtdXN0X3Jlc3RhcnRfbWVyZ2luZyA9IGZhbHNlOwogCiAJZG93bl9yZWFkKCZfb3JpZ2luc19sb2NrKTsKKworCW8gPSBfX2xvb2t1cF9kbV9vcmlnaW4ocy0+b3JpZ2luLT5iZGV2KTsKKwlpZiAobykKKwkJb3JpZ2luX21kID0gZG1fdGFibGVfZ2V0X21kKG8tPnRpLT50YWJsZSk7CisJaWYgKCFvcmlnaW5fbWQpIHsKKwkJKHZvaWQpIF9fZmluZF9zbmFwc2hvdHNfc2hhcmluZ19jb3cocywgTlVMTCwgTlVMTCwgJnNuYXBfbWVyZ2luZyk7CisJCWlmIChzbmFwX21lcmdpbmcpCisJCQlvcmlnaW5fbWQgPSBkbV90YWJsZV9nZXRfbWQoc25hcF9tZXJnaW5nLT50aS0+dGFibGUpOworCX0KKwlpZiAob3JpZ2luX21kID09IGRtX3RhYmxlX2dldF9tZCh0aS0+dGFibGUpKQorCQlvcmlnaW5fbWQgPSBOVUxMOworCWlmIChvcmlnaW5fbWQpIHsKKwkJaWYgKGRtX2hvbGQob3JpZ2luX21kKSkKKwkJCW9yaWdpbl9tZCA9IE5VTEw7CisJfQorCisJdXBfcmVhZCgmX29yaWdpbnNfbG9jayk7CisKKwlpZiAob3JpZ2luX21kKSB7CisJCWRtX2ludGVybmFsX3N1c3BlbmRfZmFzdChvcmlnaW5fbWQpOworCQlpZiAoc25hcF9tZXJnaW5nICYmIHRlc3RfYml0KFJVTk5JTkdfTUVSR0UsICZzbmFwX21lcmdpbmctPnN0YXRlX2JpdHMpKSB7CisJCQltdXN0X3Jlc3RhcnRfbWVyZ2luZyA9IHRydWU7CisJCQlzdG9wX21lcmdlKHNuYXBfbWVyZ2luZyk7CisJCX0KKwl9CisKKwlkb3duX3JlYWQoJl9vcmlnaW5zX2xvY2spOworCiAJKHZvaWQpIF9fZmluZF9zbmFwc2hvdHNfc2hhcmluZ19jb3cocywgJnNuYXBfc3JjLCAmc25hcF9kZXN0LCBOVUxMKTsKIAlpZiAoc25hcF9zcmMgJiYgc25hcF9kZXN0KSB7CiAJCWRvd25fd3JpdGUoJnNuYXBfc3JjLT5sb2NrKTsKQEAgLTE4NTEsOCArMTkzMCwxNiBAQAogCQl1cF93cml0ZSgmc25hcF9kZXN0LT5sb2NrKTsKIAkJdXBfd3JpdGUoJnNuYXBfc3JjLT5sb2NrKTsKIAl9CisKIAl1cF9yZWFkKCZfb3JpZ2luc19sb2NrKTsKIAorCWlmIChvcmlnaW5fbWQpIHsKKwkJaWYgKG11c3RfcmVzdGFydF9tZXJnaW5nKQorCQkJc3RhcnRfbWVyZ2Uoc25hcF9tZXJnaW5nKTsKKwkJZG1faW50ZXJuYWxfcmVzdW1lX2Zhc3Qob3JpZ2luX21kKTsKKwkJZG1fcHV0KG9yaWdpbl9tZCk7CisJfQorCiAJLyogTm93IHdlIGhhdmUgY29ycmVjdCBjaHVuayBzaXplLCByZXJlZ2lzdGVyICovCiAJcmVyZWdpc3Rlcl9zbmFwc2hvdChzKTsKIApAQCAtMjEzMywxMSArMjIyMCw2IEBACiAgKiBPcmlnaW46IG1hcHMgYSBsaW5lYXIgcmFuZ2Ugb2YgYSBkZXZpY2UsIHdpdGggaG9va3MgZm9yIHNuYXBzaG90dGluZy4KICAqLwogCi1zdHJ1Y3QgZG1fb3JpZ2luIHsKLQlzdHJ1Y3QgZG1fZGV2ICpkZXY7Ci0JdW5zaWduZWQgc3BsaXRfYm91bmRhcnk7Ci19OwotCiAvKgogICogQ29uc3RydWN0IGFuIG9yaWdpbiBtYXBwaW5nOiA8ZGV2X3BhdGg+CiAgKiBUaGUgY29udGV4dCBmb3IgYW4gb3JpZ2luIGlzIG1lcmVseSBhICdzdHJ1Y3QgZG1fZGV2IConCkBAIC0yMTY2LDYgKzIyNDgsNyBAQAogCQlnb3RvIGJhZF9vcGVuOwogCX0KIAorCW8tPnRpID0gdGk7CiAJdGktPnByaXZhdGUgPSBvOwogCXRpLT5udW1fZmx1c2hfYmlvcyA9IDE7CiAKQEAgLTIxODAsNiArMjI2Myw3IEBACiBzdGF0aWMgdm9pZCBvcmlnaW5fZHRyKHN0cnVjdCBkbV90YXJnZXQgKnRpKQogewogCXN0cnVjdCBkbV9vcmlnaW4gKm8gPSB0aS0+cHJpdmF0ZTsKKwogCWRtX3B1dF9kZXZpY2UodGksIG8tPmRldik7CiAJa2ZyZWUobyk7CiB9CkBAIC0yMjE2LDYgKzIzMDAsMTkgQEAKIAlzdHJ1Y3QgZG1fb3JpZ2luICpvID0gdGktPnByaXZhdGU7CiAKIAlvLT5zcGxpdF9ib3VuZGFyeSA9IGdldF9vcmlnaW5fbWluaW11bV9jaHVua3NpemUoby0+ZGV2LT5iZGV2KTsKKworCWRvd25fd3JpdGUoJl9vcmlnaW5zX2xvY2spOworCV9faW5zZXJ0X2RtX29yaWdpbihvKTsKKwl1cF93cml0ZSgmX29yaWdpbnNfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG9yaWdpbl9wb3N0c3VzcGVuZChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKK3sKKwlzdHJ1Y3QgZG1fb3JpZ2luICpvID0gdGktPnByaXZhdGU7CisKKwlkb3duX3dyaXRlKCZfb3JpZ2luc19sb2NrKTsKKwlfX3JlbW92ZV9kbV9vcmlnaW4obyk7CisJdXBfd3JpdGUoJl9vcmlnaW5zX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBvcmlnaW5fc3RhdHVzKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdGF0dXNfdHlwZV90IHR5cGUsCkBAIC0yMjU4LDEyICsyMzU1LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgb3JpZ2luX3RhcmdldCA9IHsKIAkubmFtZSAgICA9ICJzbmFwc2hvdC1vcmlnaW4iLAotCS52ZXJzaW9uID0gezEsIDgsIDF9LAorCS52ZXJzaW9uID0gezEsIDksIDB9LAogCS5tb2R1bGUgID0gVEhJU19NT0RVTEUsCiAJLmN0ciAgICAgPSBvcmlnaW5fY3RyLAogCS5kdHIgICAgID0gb3JpZ2luX2R0ciwKIAkubWFwICAgICA9IG9yaWdpbl9tYXAsCiAJLnJlc3VtZSAgPSBvcmlnaW5fcmVzdW1lLAorCS5wb3N0c3VzcGVuZCA9IG9yaWdpbl9wb3N0c3VzcGVuZCwKIAkuc3RhdHVzICA9IG9yaWdpbl9zdGF0dXMsCiAJLm1lcmdlCSA9IG9yaWdpbl9tZXJnZSwKIAkuaXRlcmF0ZV9kZXZpY2VzID0gb3JpZ2luX2l0ZXJhdGVfZGV2aWNlcywKQEAgLTIyNzEsNyArMjM2OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgc25hcHNob3RfdGFyZ2V0ID0gewogCS5uYW1lICAgID0gInNuYXBzaG90IiwKLQkudmVyc2lvbiA9IHsxLCAxMiwgMH0sCisJLnZlcnNpb24gPSB7MSwgMTMsIDB9LAogCS5tb2R1bGUgID0gVEhJU19NT0RVTEUsCiAJLmN0ciAgICAgPSBzbmFwc2hvdF9jdHIsCiAJLmR0ciAgICAgPSBzbmFwc2hvdF9kdHIsCkBAIC0yMjg1LDcgKzIzODMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIG1lcmdlX3RhcmdldCA9IHsKIAkubmFtZSAgICA9IGRtX3NuYXBzaG90X21lcmdlX3RhcmdldF9uYW1lLAotCS52ZXJzaW9uID0gezEsIDIsIDB9LAorCS52ZXJzaW9uID0gezEsIDMsIDB9LAogCS5tb2R1bGUgID0gVEhJU19NT0RVTEUsCiAJLmN0ciAgICAgPSBzbmFwc2hvdF9jdHIsCiAJLmR0ciAgICAgPSBzbmFwc2hvdF9kdHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRoaW4uYyBiL2RyaXZlcnMvbWQvZG0tdGhpbi5jCmluZGV4IDY1NDc3M2MuLjkyMWFhZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGhpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGhpbi5jCkBAIC0yMzU4LDE3ICsyMzU4LDYgQEAKIAkJcmV0dXJuIERNX01BUElPX1JFTUFQUEVEOwogCiAJY2FzZSAtRU5PREFUQToKLQkJaWYgKGdldF9wb29sX21vZGUodGMtPnBvb2wpID09IFBNX1JFQURfT05MWSkgewotCQkJLyoKLQkJCSAqIFRoaXMgYmxvY2sgaXNuJ3QgcHJvdmlzaW9uZWQsIGFuZCB3ZSBoYXZlIG5vIHdheQotCQkJICogb2YgZG9pbmcgc28uCi0JCQkgKi8KLQkJCWhhbmRsZV91bnNlcnZpY2VhYmxlX2Jpbyh0Yy0+cG9vbCwgYmlvKTsKLQkJCWNlbGxfZGVmZXJfbm9faG9sZGVyKHRjLCB2aXJ0X2NlbGwpOwotCQkJcmV0dXJuIERNX01BUElPX1NVQk1JVFRFRDsKLQkJfQotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQogCWNhc2UgLUVXT1VMREJMT0NLOgogCQl0aGluX2RlZmVyX2NlbGwodGMsIHZpcnRfY2VsbCk7CiAJCXJldHVybiBETV9NQVBJT19TVUJNSVRURUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggNzNmMjg4MC4uODAwMWZlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtNDMzLDcgKzQzMyw2IEBACiAKIAlkbV9nZXQobWQpOwogCWF0b21pY19pbmMoJm1kLT5vcGVuX2NvdW50KTsKLQogb3V0OgogCXNwaW5fdW5sb2NrKCZfbWlub3JfbG9jayk7CiAKQEAgLTQ0MiwxNiArNDQxLDIwIEBACiAKIHN0YXRpYyB2b2lkIGRtX2Jsa19jbG9zZShzdHJ1Y3QgZ2VuZGlzayAqZGlzaywgZm1vZGVfdCBtb2RlKQogewotCXN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCA9IGRpc2stPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CiAKIAlzcGluX2xvY2soJl9taW5vcl9sb2NrKTsKIAorCW1kID0gZGlzay0+cHJpdmF0ZV9kYXRhOworCWlmIChXQVJOX09OKCFtZCkpCisJCWdvdG8gb3V0OworCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm1kLT5vcGVuX2NvdW50KSAmJgogCSAgICAodGVzdF9iaXQoRE1GX0RFRkVSUkVEX1JFTU9WRSwgJm1kLT5mbGFncykpKQogCQlxdWV1ZV93b3JrKGRlZmVycmVkX3JlbW92ZV93b3JrcXVldWUsICZkZWZlcnJlZF9yZW1vdmVfd29yayk7CiAKIAlkbV9wdXQobWQpOwotCitvdXQ6CiAJc3Bpbl91bmxvY2soJl9taW5vcl9sb2NrKTsKIH0KIApAQCAtMjI0MSw3ICsyMjQ0LDYgQEAKIAlpbnQgbWlub3IgPSBNSU5PUihkaXNrX2RldnQobWQtPmRpc2spKTsKIAogCXVubG9ja19mcyhtZCk7Ci0JYmRwdXQobWQtPmJkZXYpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKG1kLT53cSk7CiAKIAlpZiAobWQtPmt3b3JrZXJfdGFzaykKQEAgLTIyNTIsMTkgKzIyNTQsMjIgQEAKIAkJbWVtcG9vbF9kZXN0cm95KG1kLT5ycV9wb29sKTsKIAlpZiAobWQtPmJzKQogCQliaW9zZXRfZnJlZShtZC0+YnMpOwotCWJsa19pbnRlZ3JpdHlfdW5yZWdpc3RlcihtZC0+ZGlzayk7Ci0JZGVsX2dlbmRpc2sobWQtPmRpc2spOworCiAJY2xlYW51cF9zcmN1X3N0cnVjdCgmbWQtPmlvX2JhcnJpZXIpOwogCWZyZWVfdGFibGVfZGV2aWNlcygmbWQtPnRhYmxlX2RldmljZXMpOwotCWZyZWVfbWlub3IobWlub3IpOworCWRtX3N0YXRzX2NsZWFudXAoJm1kLT5zdGF0cyk7CiAKIAlzcGluX2xvY2soJl9taW5vcl9sb2NrKTsKIAltZC0+ZGlzay0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKIAlzcGluX3VubG9jaygmX21pbm9yX2xvY2spOwotCisJaWYgKGJsa19nZXRfaW50ZWdyaXR5KG1kLT5kaXNrKSkKKwkJYmxrX2ludGVncml0eV91bnJlZ2lzdGVyKG1kLT5kaXNrKTsKKwlkZWxfZ2VuZGlzayhtZC0+ZGlzayk7CiAJcHV0X2Rpc2sobWQtPmRpc2spOwogCWJsa19jbGVhbnVwX3F1ZXVlKG1kLT5xdWV1ZSk7Ci0JZG1fc3RhdHNfY2xlYW51cCgmbWQtPnN0YXRzKTsKKwliZHB1dChtZC0+YmRldik7CisJZnJlZV9taW5vcihtaW5vcik7CisKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIAlrZnJlZShtZCk7CiB9CkBAIC0yNjE2LDYgKzI2MjEsMTkgQEAKIAlCVUdfT04odGVzdF9iaXQoRE1GX0ZSRUVJTkcsICZtZC0+ZmxhZ3MpKTsKIH0KIAoraW50IGRtX2hvbGQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKQoreworCXNwaW5fbG9jaygmX21pbm9yX2xvY2spOworCWlmICh0ZXN0X2JpdChETUZfRlJFRUlORywgJm1kLT5mbGFncykpIHsKKwkJc3Bpbl91bmxvY2soJl9taW5vcl9sb2NrKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJZG1fZ2V0KG1kKTsKKwlzcGluX3VubG9jaygmX21pbm9yX2xvY2spOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZG1faG9sZCk7CisKIGNvbnN0IGNoYXIgKmRtX2RldmljZV9uYW1lKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKIHsKIAlyZXR1cm4gbWQtPm5hbWU7CkBAIC0yNjI5LDggKzI2NDcsOSBAQAogCiAJbWlnaHRfc2xlZXAoKTsKIAotCXNwaW5fbG9jaygmX21pbm9yX2xvY2spOwogCW1hcCA9IGRtX2dldF9saXZlX3RhYmxlKG1kLCAmc3JjdV9pZHgpOworCisJc3Bpbl9sb2NrKCZfbWlub3JfbG9jayk7CiAJaWRyX3JlcGxhY2UoJl9taW5vcl9pZHIsIE1JTk9SX0FMTE9DRUQsIE1JTk9SKGRpc2tfZGV2dChkbV9kaXNrKG1kKSkpKTsKIAlzZXRfYml0KERNRl9GUkVFSU5HLCAmbWQtPmZsYWdzKTsKIAlzcGluX3VubG9jaygmX21pbm9yX2xvY2spOwpAQCAtMjYzOCwxMCArMjY1NywxNiBAQAogCWlmIChkbV9yZXF1ZXN0X2Jhc2VkKG1kKSkKIAkJZmx1c2hfa3RocmVhZF93b3JrZXIoJm1kLT5rd29ya2VyKTsKIAorCS8qCisJICogVGFrZSBzdXNwZW5kX2xvY2sgc28gdGhhdCBwcmVzdXNwZW5kIGFuZCBwb3N0c3VzcGVuZCBtZXRob2RzCisJICogZG8gbm90IHJhY2Ugd2l0aCBpbnRlcm5hbCBzdXNwZW5kLgorCSAqLworCW11dGV4X2xvY2soJm1kLT5zdXNwZW5kX2xvY2spOwogCWlmICghZG1fc3VzcGVuZGVkX21kKG1kKSkgewogCQlkbV90YWJsZV9wcmVzdXNwZW5kX3RhcmdldHMobWFwKTsKIAkJZG1fdGFibGVfcG9zdHN1c3BlbmRfdGFyZ2V0cyhtYXApOwogCX0KKwltdXRleF91bmxvY2soJm1kLT5zdXNwZW5kX2xvY2spOwogCiAJLyogZG1fcHV0X2xpdmVfdGFibGUgbXVzdCBiZSBiZWZvcmUgbXNsZWVwLCBvdGhlcndpc2UgZGVhZGxvY2sgaXMgcG9zc2libGUgKi8KIAlkbV9wdXRfbGl2ZV90YWJsZShtZCwgc3JjdV9pZHgpOwpAQCAtMzExNSw2ICszMTQwLDcgQEAKIAlmbHVzaF93b3JrcXVldWUobWQtPndxKTsKIAlkbV93YWl0X2Zvcl9jb21wbGV0aW9uKG1kLCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9pbnRlcm5hbF9zdXNwZW5kX2Zhc3QpOwogCiB2b2lkIGRtX2ludGVybmFsX3Jlc3VtZV9mYXN0KHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCkKIHsKQEAgLTMxMjYsNiArMzE1Miw3IEBACiBkb25lOgogCW11dGV4X3VubG9jaygmbWQtPnN1c3BlbmRfbG9jayk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChkbV9pbnRlcm5hbF9yZXN1bWVfZmFzdCk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEV2ZW50IG5vdGlmaWNhdGlvbi4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCBjYWRmOWNjLi5lNjE3ODc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC0yNDksNiArMjQ5LDcgQEAKIAljb25zdCBpbnQgcncgPSBiaW9fZGF0YV9kaXIoYmlvKTsKIAlzdHJ1Y3QgbWRkZXYgKm1kZGV2ID0gcS0+cXVldWVkYXRhOwogCXVuc2lnbmVkIGludCBzZWN0b3JzOworCWludCBjcHU7CiAKIAlpZiAobWRkZXYgPT0gTlVMTCB8fCBtZGRldi0+cGVycyA9PSBOVUxMCiAJICAgIHx8ICFtZGRldi0+cmVhZHkpIHsKQEAgLTI4NCw3ICsyODUsMTAgQEAKIAlzZWN0b3JzID0gYmlvX3NlY3RvcnMoYmlvKTsKIAltZGRldi0+cGVycy0+bWFrZV9yZXF1ZXN0KG1kZGV2LCBiaW8pOwogCi0JZ2VuZXJpY19zdGFydF9pb19hY2N0KHJ3LCBzZWN0b3JzLCAmbWRkZXYtPmdlbmRpc2stPnBhcnQwKTsKKwljcHUgPSBwYXJ0X3N0YXRfbG9jaygpOworCXBhcnRfc3RhdF9pbmMoY3B1LCAmbWRkZXYtPmdlbmRpc2stPnBhcnQwLCBpb3NbcnddKTsKKwlwYXJ0X3N0YXRfYWRkKGNwdSwgJm1kZGV2LT5nZW5kaXNrLT5wYXJ0MCwgc2VjdG9yc1tyd10sIHNlY3RvcnMpOworCXBhcnRfc3RhdF91bmxvY2soKTsKIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZtZGRldi0+YWN0aXZlX2lvKSAmJiBtZGRldi0+c3VzcGVuZGVkKQogCQl3YWtlX3VwKCZtZGRldi0+c2Jfd2FpdCk7CkBAIC01MDgwLDcgKzUwODQsOCBAQAogCX0KIAlpZiAoZXJyKSB7CiAJCW1kZGV2X2RldGFjaChtZGRldik7Ci0JCXBlcnMtPmZyZWUobWRkZXYsIG1kZGV2LT5wcml2YXRlKTsKKwkJaWYgKG1kZGV2LT5wcml2YXRlKQorCQkJcGVycy0+ZnJlZShtZGRldiwgbWRkZXYtPnByaXZhdGUpOwogCQltb2R1bGVfcHV0KHBlcnMtPm93bmVyKTsKIAkJYml0bWFwX2Rlc3Ryb3kobWRkZXYpOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkMC5jIGIvZHJpdmVycy9tZC9yYWlkMC5jCmluZGV4IGExM2Y3MzguLjNiNWQ3ZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvcmFpZDAuYworKysgYi9kcml2ZXJzL21kL3JhaWQwLmMKQEAgLTMxMyw3ICszMTMsNyBAQAogCiAvKgogICogcmVtYXBzIHRoZSBiaW8gdG8gdGhlIHRhcmdldCBkZXZpY2UuIHdlIHNlcGFyYXRlIHR3byBmbG93cy4KLSAqIHBvd2VyIDIgZmxvdyBhbmQgYSBnZW5lcmFsIGZsb3cgZm9yIHRoZSBzYWtlIG9mIHBlcmZyb21hbmNlCisgKiBwb3dlciAyIGZsb3cgYW5kIGEgZ2VuZXJhbCBmbG93IGZvciB0aGUgc2FrZSBvZiBwZXJmb3JtYW5jZQogKi8KIHN0YXRpYyBzdHJ1Y3QgbWRfcmRldiAqbWFwX3NlY3RvcihzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3Qgc3RyaXBfem9uZSAqem9uZSwKIAkJCQlzZWN0b3JfdCBzZWN0b3IsIHNlY3Rvcl90ICpzZWN0b3Jfb2Zmc2V0KQpAQCAtNDY3LDggKzQ2Nyw2IEBACiAJZHVtcF96b25lcyhtZGRldik7CiAKIAlyZXQgPSBtZF9pbnRlZ3JpdHlfcmVnaXN0ZXIobWRkZXYpOwotCWlmIChyZXQpCi0JCXJhaWQwX2ZyZWUobWRkZXYsIGNvbmYpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTUyNiw2ICs1MjQsNyBAQAogCQkJc3BsaXQgPSBiaW87CiAJCX0KIAorCQlzZWN0b3IgPSBiaW8tPmJpX2l0ZXIuYmlfc2VjdG9yOwogCQl6b25lID0gZmluZF96b25lKG1kZGV2LT5wcml2YXRlLCAmc2VjdG9yKTsKIAkJdG1wX2RldiA9IG1hcF9zZWN0b3IobWRkZXYsIHpvbmUsIHNlY3RvciwgJnNlY3Rvcik7CiAJCXNwbGl0LT5iaV9iZGV2ID0gdG1wX2Rldi0+YmRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiLWNvcmUvZHZiX25ldC5jIGIvZHJpdmVycy9tZWRpYS9kdmItY29yZS9kdmJfbmV0LmMKaW5kZXggNjg2ZDMyNy4uNGE3N2NiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmItY29yZS9kdmJfbmV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmItY29yZS9kdmJfbmV0LmMKQEAgLTExOTAsNyArMTE5MCw2IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGhlYWRlcl9vcHMgZHZiX2hlYWRlcl9vcHMgPSB7CiAJLmNyZWF0ZQkJPSBldGhfaGVhZGVyLAogCS5wYXJzZQkJPSBldGhfaGVhZGVyX3BhcnNlLAotCS5yZWJ1aWxkCT0gZXRoX3JlYnVpbGRfaGVhZGVyLAogfTsKIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvbTg4ZHMzMTAzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvbTg4ZHMzMTAzLmMKaW5kZXggYmE0ZWUwYi4uZDNkOTI4ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL204OGRzMzEwMy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9tODhkczMxMDMuYwpAQCAtNjMwLDcgKzYzMCw3IEBACiAJLyogcmVxdWVzdCB0aGUgZmlybXdhcmUsIHRoaXMgd2lsbCBibG9jayBhbmQgdGltZW91dCAqLwogCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19maWxlLCBwcml2LT5pMmMtPmRldi5wYXJlbnQpOwogCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcHJpdi0+aTJjLT5kZXYsICIlczogZmlybWFyZSBmaWxlICclcycgbm90IGZvdW5kXG4iLAorCQlkZXZfZXJyKCZwcml2LT5pMmMtPmRldiwgIiVzOiBmaXJtd2FyZSBmaWxlICclcycgbm90IGZvdW5kXG4iLAogCQkJCUtCVUlMRF9NT0ROQU1FLCBmd19maWxlKTsKIAkJZ290byBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL3J0bDI4MzIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9ydGwyODMyLmMKaW5kZXggNWQyZDhmNC4uNjdmYWE4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL3J0bDI4MzIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvcnRsMjgzMi5jCkBAIC0xMjQwLDcgKzEyNDAsNyBAQAogCWRldi0+cmVnbWFwX2NvbmZpZy5tYXhfcmVnaXN0ZXIgPSA1ICogMHgxMDAsCiAJZGV2LT5yZWdtYXBfY29uZmlnLnJhbmdlcyA9IHJlZ21hcF9yYW5nZV9jZmcsCiAJZGV2LT5yZWdtYXBfY29uZmlnLm51bV9yYW5nZXMgPSBBUlJBWV9TSVpFKHJlZ21hcF9yYW5nZV9jZmcpLAotCWRldi0+cmVnbWFwX2NvbmZpZy5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCWRldi0+cmVnbWFwX2NvbmZpZy5jYWNoZV90eXBlID0gUkVHQ0FDSEVfTk9ORSwKIAlkZXYtPnJlZ21hcCA9IHJlZ21hcF9pbml0KCZjbGllbnQtPmRldiwgJnJlZ21hcF9idXMsIGNsaWVudCwKIAkJCQkgICZkZXYtPnJlZ21hcF9jb25maWcpOwogCWlmIChJU19FUlIoZGV2LT5yZWdtYXApKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvc2kyMTY4X3ByaXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9zaTIxNjhfcHJpdi5oCmluZGV4IGFhZGQxMzYuLmQ3ZWZjZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9zaTIxNjhfcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy9zaTIxNjhfcHJpdi5oCkBAIC00MCw3ICs0MCw3IEBACiAJYm9vbCB0c19jbG9ja19pbnY7CiB9OwogCi0vKiBmaXJtYXJlIGNvbW1hbmQgc3RydWN0ICovCisvKiBmaXJtd2FyZSBjb21tYW5kIHN0cnVjdCAqLwogI2RlZmluZSBTSTIxNjhfQVJHTEVOICAgICAgMzAKIHN0cnVjdCBzaTIxNjhfY21kIHsKIAl1OCBhcmdzW1NJMjE2OF9BUkdMRU5dOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL3RkYTEwMDcxX3ByaXYuaCBiL2RyaXZlcnMvbWVkaWEvZHZiLWZyb250ZW5kcy90ZGExMDA3MV9wcml2LmgKaW5kZXggNDIwNDg2MS4uMDNmODM5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmItZnJvbnRlbmRzL3RkYTEwMDcxX3ByaXYuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi1mcm9udGVuZHMvdGRhMTAwNzFfcHJpdi5oCkBAIC05OSw3ICs5OSw3IEBACiAjZGVmaW5lIENNRF9CRVJfQ09OVFJPTCAgICAgICAgIDB4M2UKICNkZWZpbmUgQ01EX0JFUl9VUERBVEVfQ09VTlRFUlMgMHgzZgogCi0vKiBmaXJtYXJlIGNvbW1hbmQgc3RydWN0ICovCisvKiBmaXJtd2FyZSBjb21tYW5kIHN0cnVjdCAqLwogI2RlZmluZSBUREExMDA3MV9BUkdMRU4gICAgICAzMAogc3RydWN0IHRkYTEwMDcxX2NtZCB7CiAJdTggYXJnc1tUREExMDA3MV9BUkdMRU5dOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wY2kvY3gyMzg4NS9jeDIzODg1LTQxNy5jIGIvZHJpdmVycy9tZWRpYS9wY2kvY3gyMzg4NS9jeDIzODg1LTQxNy5jCmluZGV4IGU0OTAxYTUuLjYzYzBlZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGNpL2N4MjM4ODUvY3gyMzg4NS00MTcuYworKysgYi9kcml2ZXJzL21lZGlhL3BjaS9jeDIzODg1L2N4MjM4ODUtNDE3LmMKQEAgLTEzMzksMTQgKzEzMzksMTMgQEAKIAlzdHJsY3B5KGNhcC0+ZHJpdmVyLCBkZXYtPm5hbWUsIHNpemVvZihjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkoY2FwLT5jYXJkLCBjeDIzODg1X2JvYXJkc1t0c3BvcnQtPmRldi0+Ym9hcmRdLm5hbWUsCiAJCXNpemVvZihjYXAtPmNhcmQpKTsKLQlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0k6JXMiLCBwY2lfbmFtZShkZXYtPnBjaSkpOwotCWNhcC0+Y2FwYWJpbGl0aWVzID0KLQkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8Ci0JCVY0TDJfQ0FQX1JFQURXUklURSAgICAgfAotCQlWNEwyX0NBUF9TVFJFQU1JTkcgICAgIHwKLQkJMDsKKwlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0llOiVzIiwgcGNpX25hbWUoZGV2LT5wY2kpKTsKKwljYXAtPmRldmljZV9jYXBzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1JFQURXUklURSB8CisJCQkgICBWNEwyX0NBUF9TVFJFQU1JTkc7CiAJaWYgKGRldi0+dHVuZXJfdHlwZSAhPSBUVU5FUl9BQlNFTlQpCi0JCWNhcC0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfQ0FQX1RVTkVSOworCQljYXAtPmRldmljZV9jYXBzIHw9IFY0TDJfQ0FQX1RVTkVSOworCWNhcC0+Y2FwYWJpbGl0aWVzID0gY2FwLT5kZXZpY2VfY2FwcyB8IFY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwKKwkJVjRMMl9DQVBfQVVESU8gfCBWNEwyX0NBUF9ERVZJQ0VfQ0FQUzsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWpwZWcvanBlZy1jb3JlLmMKaW5kZXggMTJmNzQ1Mi4uYTkyZmY0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL2pwZWctY29yZS5jCkBAIC0xODQ1LDYgKzE4NDUsOSBAQAogCXN0cnVjdCBzNXBfanBlZ19hZGRyIGpwZWdfYWRkcjsKIAl1MzIgcGl4X3NpemUsIHBhZGRpbmdfYnl0ZXMgPSAwOwogCisJanBlZ19hZGRyLmNiID0gMDsKKwlqcGVnX2FkZHIuY3IgPSAwOworCiAJcGl4X3NpemUgPSBjdHgtPmNhcF9xLncgKiBjdHgtPmNhcF9xLmg7CiAKIAlpZiAoY3R4LT5tb2RlID09IFM1UF9KUEVHX0VOQ09ERSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LWV4eW5vczMyNTAuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLWpwZWcvanBlZy1ody1leHlub3MzMjUwLmMKaW5kZXggZThjMmNhZC4uMDk3NGI5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtanBlZy9qcGVnLWh3LWV4eW5vczMyNTAuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1qcGVnL2pwZWctaHctZXh5bm9zMzI1MC5jCkBAIC0yMCw3ICsyMCw3IEBACiAKIHZvaWQgZXh5bm9zMzI1MF9qcGVnX3Jlc2V0KHZvaWQgX19pb21lbSAqcmVncykKIHsKLQl1MzIgcmVnID0gMDsKKwl1MzIgcmVnID0gMTsKIAlpbnQgY291bnQgPSAxMDAwOwogCiAJd3JpdGVsKDEsIHJlZ3MgKyBFWFlOT1MzMjUwX1NXX1JFU0VUKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLW1mYy9zNXBfbWZjLmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mYy5jCmluZGV4IDhlNDRhNTkuLjk4Mzc0ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLW1mYy9zNXBfbWZjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmMuYwpAQCAtODMzLDYgKzgzMyw3IEBACiAJcS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKIAlxLT5pb19tb2RlcyA9IFZCMl9NTUFQOwogCXEtPmRydl9wcml2ID0gJmN0eC0+Zmg7CisJcS0+bG9jayA9ICZkZXYtPm1mY19tdXRleDsKIAlpZiAodmRldiA9PSBkZXYtPnZmZF9kZWMpIHsKIAkJcS0+aW9fbW9kZXMgPSBWQjJfTU1BUDsKIAkJcS0+b3BzID0gZ2V0X2RlY19xdWV1ZV9vcHMoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLW1mYy9zNXBfbWZjX2NvbW1vbi5oIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmNfY29tbW9uLmgKaW5kZXggMTVmNzY2My4uMjQyNjJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmNfY29tbW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmNfY29tbW9uLmgKQEAgLTI5LDcgKzI5LDcgQEAKIAogLyogT2Zmc2V0IGJhc2UgdXNlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gQ0FQVFVSRSBhbmQgT1VUUFVUCiAqICB3aGlsZSBtbWFwaW5nICovCi0jZGVmaW5lIERTVF9RVUVVRV9PRkZfQkFTRSAgICAgIChUQVNLX1NJWkUgLyAyKQorI2RlZmluZSBEU1RfUVVFVUVfT0ZGX0JBU0UJKDEgPDwgMzApCiAKICNkZWZpbmUgTUZDX0JBTksxX0FMTE9DX0NUWAkwCiAjZGVmaW5lIE1GQ19CQU5LMl9BTExPQ19DVFgJMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmNfb3ByLmggYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mY19vcHIuaAppbmRleCBkZTJiOGM2Li4yMmRmYjNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mY19vcHIuaAorKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mY19vcHIuaApAQCAtMzAyLDcgKzMwMiw3IEBACiAJdm9pZCAoKndyaXRlX2luZm8pKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LCB1bnNpZ25lZCBpbnQgZGF0YSwKIAkJCXVuc2lnbmVkIGludCBvZnMpOwogCXVuc2lnbmVkIGludCAoKnJlYWRfaW5mbykoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsCi0JCQl1bnNpZ25lZCBpbnQgb2ZzKTsKKwkJCXVuc2lnbmVkIGxvbmcgb2ZzKTsKIAlpbnQgKCpnZXRfZHNwbF95X2Fkcikoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpOwogCWludCAoKmdldF9kZWNfeV9hZHIpKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KTsKIAlpbnQgKCpnZXRfZHNwbF9zdGF0dXMpKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLW1mYy9zNXBfbWZjX29wcl92NS5jIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmNfb3ByX3Y1LmMKaW5kZXggMGM0ZmNmMi4uYjA5YmNkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmNfb3ByX3Y1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmNfb3ByX3Y1LmMKQEAgLTI2MywxNSArMjYzLDE1IEBACiBzdGF0aWMgdm9pZCBzNXBfbWZjX3dyaXRlX2luZm9fdjUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsIHVuc2lnbmVkIGludCBkYXRhLAogCQkJdW5zaWduZWQgaW50IG9mcykKIHsKLQl3cml0ZWwoZGF0YSwgKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKShjdHgtPnNobS52aXJ0ICsgb2ZzKSk7CisJd3JpdGVsKGRhdGEsICh2b2lkICopKGN0eC0+c2htLnZpcnQgKyBvZnMpKTsKIAl3bWIoKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBzNXBfbWZjX3JlYWRfaW5mb192NShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKLQkJCQl1bnNpZ25lZCBpbnQgb2ZzKQorCQkJCXVuc2lnbmVkIGxvbmcgb2ZzKQogewogCXJtYigpOwotCXJldHVybiByZWFkbCgodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopKGN0eC0+c2htLnZpcnQgKyBvZnMpKTsKKwlyZXR1cm4gcmVhZGwoKHZvaWQgKikoY3R4LT5zaG0udmlydCArIG9mcykpOwogfQogCiBzdGF0aWMgdm9pZCBzNXBfbWZjX2RlY19jYWxjX2RwYl9zaXplX3Y1KHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtbWZjL3M1cF9tZmNfb3ByX3Y2LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mY19vcHJfdjYuYwppbmRleCBkODI2YzU4Li5jZWZhZDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mY19vcHJfdjYuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC1tZmMvczVwX21mY19vcHJfdjYuYwpAQCAtMTg1MiwxNyArMTg1MiwxNyBAQAogCQl1bnNpZ25lZCBpbnQgb2ZzKQogewogCXM1cF9tZmNfY2xvY2tfb24oKTsKLQl3cml0ZWwoZGF0YSwgKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqKSgodW5zaWduZWQgbG9uZylvZnMpKTsKKwl3cml0ZWwoZGF0YSwgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpb2ZzKSk7CiAJczVwX21mY19jbG9ja19vZmYoKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludAotczVwX21mY19yZWFkX2luZm9fdjYoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsIHVuc2lnbmVkIGludCBvZnMpCitzNXBfbWZjX3JlYWRfaW5mb192NihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwgdW5zaWduZWQgbG9uZyBvZnMpCiB7CiAJaW50IHJldDsKIAogCXM1cF9tZmNfY2xvY2tfb24oKTsKLQlyZXQgPSByZWFkbCgodm9sYXRpbGUgdm9pZCBfX2lvbWVtICopKCh1bnNpZ25lZCBsb25nKW9mcykpOworCXJldCA9IHJlYWRsKCh2b2lkICopb2ZzKTsKIAlzNXBfbWZjX2Nsb2NrX29mZigpOwogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLXR2L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3M1cC10di9LY29uZmlnCmluZGV4IDVhMTgzNWQuLjY5N2FhZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vczVwLXR2L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zNXAtdHYvS2NvbmZpZwpAQCAtMjAsNiArMjAsNyBAQAogY29uZmlnIFZJREVPX1NBTVNVTkdfUzVQX0hETUkKIAl0cmlzdGF0ZSAiU2Ftc3VuZyBIRE1JIERyaXZlciIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIKKwlkZXBlbmRzIG9uIEkyQwogCWRlcGVuZHMgb24gVklERU9fU0FNU1VOR19TNVBfVFYKIAlzZWxlY3QgVklERU9fU0FNU1VOR19TNVBfSERNSVBIWQogCWhlbHAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc2hfdmV1LmMgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3NoX3ZldS5jCmluZGV4IGE5MDFiNjIuLjI1NTRmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc2hfdmV1LmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zaF92ZXUuYwpAQCAtMTE1OCw2ICsxMTU4LDcgQEAKIAl9CiAKIAkqdmRldiA9IHNoX3ZldV92aWRlb2RldjsKKwl2ZGV2LT52NGwyX2RldiA9ICZ2ZXUtPnY0bDJfZGV2OwogCXNwaW5fbG9ja19pbml0KCZ2ZXUtPmxvY2spOwogCW11dGV4X2luaXQoJnZldS0+Zm9wX2xvY2spOwogCXZkZXYtPmxvY2sgPSAmdmV1LT5mb3BfbG9jazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc29jX2NhbWVyYS9hdG1lbC1pc2kuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc29jX2NhbWVyYS9hdG1lbC1pc2kuYwppbmRleCA4NTI2YmY1Li5jODM1YmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3NvY19jYW1lcmEvYXRtZWwtaXNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zb2NfY2FtZXJhL2F0bWVsLWlzaS5jCkBAIC04NDMsNiArODQzLDggQEAKIAlpZiAoaXNpLT5wZGF0YS5mdWxsX21vZGUpCiAJCWNmZzEgfD0gSVNJX0NGRzFfRlVMTF9NT0RFOwogCisJY2ZnMSB8PSBJU0lfQ0ZHMV9USE1BU0tfQkVBVFNfMTY7CisKIAlpc2lfd3JpdGVsKGlzaSwgSVNJX0NUUkwsIElTSV9DVFJMX0RJUyk7CiAJaXNpX3dyaXRlbChpc2ksIElTSV9DRkcxLCBjZmcxKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zb2NfY2FtZXJhL3NvY19jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvcGxhdGZvcm0vc29jX2NhbWVyYS9zb2NfY2FtZXJhLmMKaW5kZXggY2VlN2I1Ni4uNjY2MzRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS9zb2NfY2FtZXJhL3NvY19jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3BsYXRmb3JtL3NvY19jYW1lcmEvc29jX2NhbWVyYS5jCkBAIC0xNjY1LDcgKzE2NjUsNyBAQAogZWFkZHBkZXY6CiAJcGxhdGZvcm1fZGV2aWNlX3B1dChzYXNjLT5wZGV2KTsKIGVhbGxvY3BkZXY6Ci0JZGV2bV9rZnJlZShpY2ktPnY0bDJfZGV2LmRldiwgc2FzYyk7CisJZGV2bV9rZnJlZShpY2ktPnY0bDJfZGV2LmRldiwgaW5mbyk7CiAJZGV2X2VycihpY2ktPnY0bDJfZGV2LmRldiwgImdyb3VwIHByb2JlIGZhaWxlZDogJWRcbiIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9lbmVfaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmMKaW5kZXggZTgwZjJjNi4uOGQ3N2UxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9lbmVfaXIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5jCkBAIC0xMTk1LDE2ICsxMTk1LDYgQEAKIAkuc2h1dGRvd24gPSBlbmVfc2h1dGRvd24sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBlbmVfaW5pdCh2b2lkKQotewotCXJldHVybiBwbnBfcmVnaXN0ZXJfZHJpdmVyKCZlbmVfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgZW5lX2V4aXQodm9pZCkKLXsKLQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJmVuZV9kcml2ZXIpOwotfQotCiBtb2R1bGVfcGFyYW0oc2FtcGxlX3BlcmlvZCwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Moc2FtcGxlX3BlcmlvZCwgIkhhcmR3YXJlIHNhbXBsZSBwZXJpb2QgKDUwIHVzIGRlZmF1bHQpIik7CiAKQEAgLTEyMjYsNSArMTIxNiw0IEBACiBNT0RVTEVfQVVUSE9SKCJNYXhpbSBMZXZpdHNreSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1tb2R1bGVfaW5pdChlbmVfaW5pdCk7Ci1tb2R1bGVfZXhpdChlbmVfZXhpdCk7Cittb2R1bGVfcG5wX2RyaXZlcihlbmVfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvZmludGVrLWNpci5jIGIvZHJpdmVycy9tZWRpYS9yYy9maW50ZWstY2lyLmMKaW5kZXggYjUxNjc1Ny4uNWM2M2MyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9maW50ZWstY2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9maW50ZWstY2lyLmMKQEAgLTY4NCwxNiArNjg0LDYgQEAKIAkuc2h1dGRvd24JPSBmaW50ZWtfc2h1dGRvd24sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBmaW50ZWtfaW5pdCh2b2lkKQotewotCXJldHVybiBwbnBfcmVnaXN0ZXJfZHJpdmVyKCZmaW50ZWtfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZpbnRla19leGl0KHZvaWQpCi17Ci0JcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZmaW50ZWtfZHJpdmVyKTsKLX0KLQogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJFbmFibGUgZGVidWdnaW5nIG91dHB1dCIpOwogCkBAIC03MDMsNSArNjkzLDQgQEAKIE1PRFVMRV9BVVRIT1IoIkphcm9kIFdpbHNvbiA8amFyb2RAcmVkaGF0LmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotbW9kdWxlX2luaXQoZmludGVrX2luaXQpOwotbW9kdWxlX2V4aXQoZmludGVrX2V4aXQpOworbW9kdWxlX3BucF9kcml2ZXIoZmludGVrX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2l0ZS1jaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5jCmluZGV4IDU2YWJmOTEuLjBmMzAxOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5jCkBAIC0xNzA4LDIxICsxNzA4LDEwIEBACiAJLnNodXRkb3duCT0gaXRlX3NodXRkb3duLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgaXRlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcG5wX3JlZ2lzdGVyX2RyaXZlcigmaXRlX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpdGVfZXhpdCh2b2lkKQotewotCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmaXRlX2RyaXZlcik7Ci19Ci0KIE1PRFVMRV9ERVZJQ0VfVEFCTEUocG5wLCBpdGVfaWRzKTsKIE1PRFVMRV9ERVNDUklQVElPTigiSVRFIFRlY2ggSW5jLiBJVDg3MTJGL0lURTg1MTJGIENJUiBkcml2ZXIiKTsKIAogTU9EVUxFX0FVVEhPUigiSnVhbiBKLiBHYXJjaWEgZGUgU29yaWEgPHNrYW5kYWxmb0BnbWFpbC5jb20+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLW1vZHVsZV9pbml0KGl0ZV9pbml0KTsKLW1vZHVsZV9leGl0KGl0ZV9leGl0KTsKK21vZHVsZV9wbnBfZHJpdmVyKGl0ZV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9udXZvdG9uLWNpci5jIGIvZHJpdmVycy9tZWRpYS9yYy9udXZvdG9uLWNpci5jCmluZGV4IDljMmM4NjMuLjg1YWY3YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL251dm90b24tY2lyLmMKQEAgLTEyMTksMTYgKzEyMTksNiBAQAogCS5zaHV0ZG93bgk9IG52dF9zaHV0ZG93biwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IG52dF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBucF9yZWdpc3Rlcl9kcml2ZXIoJm52dF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbnZ0X2V4aXQodm9pZCkKLXsKLQlwbnBfdW5yZWdpc3Rlcl9kcml2ZXIoJm52dF9kcml2ZXIpOwotfQotCiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkVuYWJsZSBkZWJ1Z2dpbmcgb3V0cHV0Iik7CiAKQEAgLTEyMzgsNSArMTIyOCw0IEBACiBNT0RVTEVfQVVUSE9SKCJKYXJvZCBXaWxzb24gPGphcm9kQHJlZGhhdC5jb20+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLW1vZHVsZV9pbml0KG52dF9pbml0KTsKLW1vZHVsZV9leGl0KG52dF9leGl0KTsKK21vZHVsZV9wbnBfZHJpdmVyKG52dF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS90dW5lcnMvbXNpMDAxLmMgYi9kcml2ZXJzL21lZGlhL3R1bmVycy9tc2kwMDEuYwppbmRleCAyNjAxOWU3Li43NGNmYzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3R1bmVycy9tc2kwMDEuYworKysgYi9kcml2ZXJzL21lZGlhL3R1bmVycy9tc2kwMDEuYwpAQCAtNDA4LDcgKzQwOCw3IEBACiAJCQkJcy0+bWl4ZXJfZ2Fpbi0+Y3VyLnZhbCwgcy0+aWZfZ2Fpbi0+dmFsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2RiZygmcy0+c3BpLT5kZXYsICJ1bmtvd24gY29udHJvbCAlZFxuIiwgY3RybC0+aWQpOworCQlkZXZfZGJnKCZzLT5zcGktPmRldiwgInVua25vd24gY29udHJvbCAlZFxuIiwgY3RybC0+aWQpOwogCQlyZXQgPSAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9ydGwyOHh4dS5jIGIvZHJpdmVycy9tZWRpYS91c2IvZHZiLXVzYi12Mi9ydGwyOHh4dS5jCmluZGV4IDc3ZGNmZGYuLjg3ZmMwZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdXNiL2R2Yi11c2ItdjIvcnRsMjh4eHUuYworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9kdmItdXNiLXYyL3J0bDI4eHh1LmMKQEAgLTc4MCw4ICs3ODAsNiBAQAogCQljYXNlIFRVTkVSX1JUTDI4MzJfVFVBOTAwMToKIAkJCXJldHVybiBydGwyODMydV90dWE5MDAxX3R1bmVyX2NhbGxiYWNrKGQsIGNtZCwgYXJnKTsKIAkJfQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdXNiL2dzcGNhL0tjb25maWcKaW5kZXggNjBhZjNiMS4uM2ZkOTRmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS91c2IvZ3NwY2EvS2NvbmZpZworKysgYi9kcml2ZXJzL21lZGlhL3VzYi9nc3BjYS9LY29uZmlnCkBAIC0xLDYgKzEsNyBAQAogbWVudWNvbmZpZyBVU0JfR1NQQ0EKIAl0cmlzdGF0ZSAiR1NQQ0EgYmFzZWQgd2ViY2FtcyIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIKKwlkZXBlbmRzIG9uIElOUFVUIHx8IElOUFVUPW4KIAlkZWZhdWx0IG0KIAktLS1oZWxwLS0tCiAJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBzZWxlY3Rpbmcgd2ViY2FtcyBiYXNlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1jb3JlLmMKaW5kZXggYmMwOGE4Mi4uY2MxNmU3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1ZjItY29yZS5jCkBAIC0zMjMwLDE4ICszMjMwLDEzIEBACiAKIAlpZiAodGhyZWFkaW8gPT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0JY2FsbF92b2lkX3FvcChxLCB3YWl0X2ZpbmlzaCwgcSk7CiAJdGhyZWFkaW8tPnN0b3AgPSB0cnVlOwotCXZiMl9pbnRlcm5hbF9zdHJlYW1vZmYocSwgcS0+dHlwZSk7Ci0JY2FsbF92b2lkX3FvcChxLCB3YWl0X3ByZXBhcmUsIHEpOworCS8qIFdha2UgdXAgYWxsIHBlbmRpbmcgc2xlZXBzIGluIHRoZSB0aHJlYWQgKi8KKwl2YjJfcXVldWVfZXJyb3IocSk7CiAJZXJyID0ga3RocmVhZF9zdG9wKHRocmVhZGlvLT50aHJlYWQpOwotCXEtPmZpbGVpbyA9IE5VTEw7Ci0JZmlsZWlvLT5yZXEuY291bnQgPSAwOwotCXZiMl9yZXFidWZzKHEsICZmaWxlaW8tPnJlcSk7Ci0Ja2ZyZWUoZmlsZWlvKTsKKwlfX3ZiMl9jbGVhbnVwX2ZpbGVpbyhxKTsKIAl0aHJlYWRpby0+dGhyZWFkID0gTlVMTDsKIAlrZnJlZSh0aHJlYWRpbyk7Ci0JcS0+ZmlsZWlvID0gTlVMTDsKIAlxLT50aHJlYWRpbyA9IE5VTEw7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1kbWEtY29udGlnLmMgYi9kcml2ZXJzL21lZGlhL3Y0bDItY29yZS92aWRlb2J1ZjItZG1hLWNvbnRpZy5jCmluZGV4IGI0ODFkMjAuLjY5ZTA0ODMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdjRsMi1jb3JlL3ZpZGVvYnVmMi1kbWEtY29udGlnLmMKKysrIGIvZHJpdmVycy9tZWRpYS92NGwyLWNvcmUvdmlkZW9idWYyLWRtYS1jb250aWcuYwpAQCAtNjMyLDggKzYzMiw3IEBACiAJfQogCiAJLyogZXh0cmFjdCBwYWdlIGxpc3QgZnJvbSB1c2Vyc3BhY2UgbWFwcGluZyAqLwotCXJldCA9IHZiMl9kY19nZXRfdXNlcl9wYWdlcyhzdGFydCwgcGFnZXMsIG5fcGFnZXMsIHZtYSwKLQkJCQkgICAgZG1hX2RpciA9PSBETUFfRlJPTV9ERVZJQ0UpOworCXJldCA9IHZiMl9kY19nZXRfdXNlcl9wYWdlcyhzdGFydCwgcGFnZXMsIG5fcGFnZXMsIHZtYSwgZG1hX2Rpcik7CiAJaWYgKHJldCkgewogCQl1bnNpZ25lZCBsb25nIHBmbjsKIAkJaWYgKHZiMl9kY19nZXRfdXNlcl9wZm4oc3RhcnQsIG5fcGFnZXMsIHZtYSwgJnBmbikgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvS2NvbmZpZyBiL2RyaXZlcnMvbWZkL0tjb25maWcKaW5kZXggMzgzNTZlMy4uZDVhZDA0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvS2NvbmZpZworKysgYi9kcml2ZXJzL21mZC9LY29uZmlnCkBAIC0yODMsNiArMjgzLDE4IEBACiAJICBUaGlzIGRldmljZSBwcm92aWRlcyBpbnB1dCBhbmQgb3V0cHV0IEdQSU9zIHRocm91Z2ggYW4gSTJDCiAJICBpbnRlcmZhY2UgdG8gb25lIG9yIG1vcmUgc3ViLWNoaXBzLgogCitjb25maWcgTUZEX0lOVEVMX1FVQVJLX0kyQ19HUElPCisJdHJpc3RhdGUgIkludGVsIFF1YXJrIE1GRCBJMkMgR1BJTyIKKwlkZXBlbmRzIG9uIFBDSQorCWRlcGVuZHMgb24gWDg2CisJZGVwZW5kcyBvbiBDT01NT05fQ0xLCisJc2VsZWN0IE1GRF9DT1JFCisJaGVscAorCSAgVGhpcyBNRkQgcHJvdmlkZXMgc3VwcG9ydCBmb3IgSTJDIGFuZCBHUElPIHRoYXQgZXhpc3Qgb25seQorCSAgaW4gYSBzaW5nbGUgUENJIGRldmljZS4gSXQgc3BsaXRzIHRoZSAyIElPIGRldmljZXMgdG8KKwkgIHRoZWlyIHJlc3BlY3RpdmUgSU8gZHJpdmVyLgorCSAgVGhlIEdQSU8gZXhwb3J0cyBhIHRvdGFsIGFtb3VudCBvZiA4IGludGVycnVwdC1jYXBhYmxlIEdQSU9zLgorCiBjb25maWcgTFBDX0lDSAogCXRyaXN0YXRlICJJbnRlbCBJQ0ggTFBDIgogCWRlcGVuZHMgb24gUENJCkBAIC0zNjQsNiArMzc2LDcgQEAKIAkJKiBDT01lLWJJUCMKIAkJKiBDT01lLWJQQzIgKEVUWGV4cHJlc3MtUEMpCiAJCSogQ09NZS1iU0MjIChFVFhleHByZXNzLVNDIFQjKQorCQkqIENPTWUtY0JMNgogCQkqIENPTWUtY0JUNgogCQkqIENPTWUtY0NUNgogCQkqIENPTWUtY0RDMiAobWljcm9FVFhleHByZXNzLURDKQpAQCAtNDU1LDYgKzQ2OCwyMCBAQAogCSAgYWRkaXRpb25hbCBkcml2ZXJzIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhlIGZ1bmN0aW9uYWxpdHkKIAkgIG9mIHRoZSBkZXZpY2UuCiAKK2NvbmZpZyBNRkRfTUFYNzc4NDMKKwlib29sICJNYXhpbSBTZW1pY29uZHVjdG9yIE1BWDc3ODQzIFBNSUMgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQz15CisJc2VsZWN0IE1GRF9DT1JFCisJc2VsZWN0IFJFR01BUF9JMkMKKwlzZWxlY3QgUkVHTUFQX0lSUQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBhZGQgc3VwcG9ydCBmb3IgTWF4aW0gU2VtaWNvbmR1Y3RvciBNQVg3Nzg0My4KKwkgIFRoaXMgaXMgY29tcGFuaW9uIFBvd2VyIE1hbmFnZW1lbnQgSUMgd2l0aCBMRURzLCBIYXB0aWMsIENoYXJnZXIsCisJICBGdWVsIEdhdWdlLCBNVUlDKE1pY3JvIFVTQiBJbnRlcmZhY2UgQ29udHJvbGxlcikgY29udHJvbHMgb24gY2hpcC4KKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGNvbW1vbiBzdXBwb3J0IGZvciBhY2Nlc3NpbmcgdGhlIGRldmljZTsKKwkgIGFkZGl0aW9uYWwgZHJpdmVycyBtdXN0IGJlIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIHRoZSBmdW5jdGlvbmFsaXR5CisJICBvZiB0aGUgZGV2aWNlLgorCiBjb25maWcgTUZEX01BWDg5MDcKIAl0cmlzdGF0ZSAiTWF4aW0gU2VtaWNvbmR1Y3RvciBNQVg4OTA3IFBNSUMgU3VwcG9ydCIKIAlzZWxlY3QgTUZEX0NPUkUKQEAgLTUwMiw2ICs1MjksMTYgQEAKIAkgIGFkZGl0aW9uYWwgZHJpdmVycyBtdXN0IGJlIGVuYWJsZWQgaW4gb3JkZXIgdG8gdXNlIHRoZSBmdW5jdGlvbmFsaXR5CiAJICBvZiB0aGUgZGV2aWNlLgogCitjb25maWcgTUZEX01UNjM5NworCXRyaXN0YXRlICJNZWRpYVRlayBNVDYzOTcgUE1JQyBTdXBwb3J0IgorCXNlbGVjdCBNRkRfQ09SRQorCXNlbGVjdCBJUlFfRE9NQUlOCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGFkZCBzdXBwb3J0IGZvciBNZWRpYVRlayBNVDYzOTcgUE1JQy4gVGhpcyBpcworCSAgYSBQb3dlciBNYW5hZ2VtZW50IElDLiBUaGlzIGRyaXZlciBwcm92aWRlcyBjb21tb24gc3VwcG9ydCBmb3IKKwkgIGFjY2Vzc2luZyB0aGUgZGV2aWNlOyBhZGRpdGlvbmFsIGRyaXZlcnMgbXVzdCBiZSBlbmFibGVkIGluIG9yZGVyCisJICB0byB1c2UgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRldmljZS4KKwogY29uZmlnIE1GRF9NRU5GMjFCTUMKIAl0cmlzdGF0ZSAiTUVOIDE0RjAyMVAwMCBCb2FyZCBNYW5hZ2VtZW50IENvbnRyb2xsZXIgU3VwcG9ydCIKIAlkZXBlbmRzIG9uIEkyQwpAQCAtNjU1LDYgKzY5Miw3IEBACiAJZGVwZW5kcyBvbiBJMkM9eQogCXNlbGVjdCBNRkRfQ09SRQogCXNlbGVjdCBSRUdNQVBfSTJDCisJc2VsZWN0IFJFR01BUF9JUlEKIAloZWxwCiAJICBUaGlzIGRyaXZlciBwcm92aWRlcyBmb3IgdGhlIFJpY2h0ZWsgUlQ1MDMzIFBvd2VyIE1hbmFnZW1lbnQgSUMsCiAJICB3aGljaCBpbmNsdWRlcyB0aGUgSTJDIGRyaXZlciBhbmQgdGhlIENvcmUgQVBJcy4gVGhpcyBkcml2ZXIgcHJvdmlkZXMKQEAgLTc1Myw2ICs3OTEsMTggQEAKIAkgbGluZXMgb24gdGhlIFNNNTAxLiBUaGUgcGxhdGZvcm0gZGF0YSBpcyB1c2VkIHRvIHN1cHBseSB0aGUKIAkgYmFzZSBudW1iZXIgZm9yIHRoZSBmaXJzdCBHUElPIGxpbmUgdG8gcmVnaXN0ZXIuCiAKK2NvbmZpZyBNRkRfU0tZODE0NTIKKwl0cmlzdGF0ZSAiU2t5d29ya3MgU29sdXRpb25zIFNLWTgxNDUyIgorCXNlbGVjdCBNRkRfQ09SRQorCXNlbGVjdCBSRUdNQVBfSTJDCisJZGVwZW5kcyBvbiBJMkMKKwloZWxwCisJICBUaGlzIGlzIHRoZSBjb3JlIGRyaXZlciBmb3IgdGhlIFNreXdvcmtzIFNLWTgxNDUyIGJhY2tsaWdodCBhbmQKKwkgIHZvbHRhZ2UgcmVndWxhdG9yIGRldmljZS4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgc2t5ODE0NTIuCisKIGNvbmZpZyBNRkRfU01TQwogICAgICAgIGJvb2wgIlNNU0MgRUNFMTA5OSBzZXJpZXMgY2hpcHMiCiAgICAgICAgZGVwZW5kcyBvbiBJMkM9eQpAQCAtMTIxMCw2ICsxMjYwLDcgQEAKIGNvbmZpZyBNRkRfVEMzNTg5WAogCWJvb2wgIlRvc2hpYmEgVEMzNTg5MiBhbmQgdmFyaWFudHMiCiAJZGVwZW5kcyBvbiBJMkM9eQorCWRlcGVuZHMgb24gT0YKIAlzZWxlY3QgTUZEX0NPUkUKIAloZWxwCiAJICBTdXBwb3J0IGZvciB0aGUgVG9zaGliYSBUQzM1ODkyIGFuZCB2YXJpYW50cyBJL08gRXhwYW5kZXIuCkBAIC0xMjg5LDEwICsxMzQwLDExIEBACiAJICBTdXBwb3J0IGZvciBXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV001MTAyIGxvdyBwb3dlciBhdWRpbyBTb0MKIAogY29uZmlnIE1GRF9XTTUxMTAKLQlib29sICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV001MTEwIgorCWJvb2wgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTUxMTAgYW5kIFdNODI4MC9XTTgyODEiCiAJZGVwZW5kcyBvbiBNRkRfQVJJWk9OQQogCWhlbHAKLQkgIFN1cHBvcnQgZm9yIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTUxMTAgbG93IHBvd2VyIGF1ZGlvIFNvQworCSAgU3VwcG9ydCBmb3IgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNNTExMCBhbmQgV004MjgwL1dNODI4MQorCSAgbG93IHBvd2VyIGF1ZGlvIFNvQwogCiBjb25maWcgTUZEX1dNODk5NwogCWJvb2wgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg5OTciCkBAIC0xMzYyLDcgKzE0MTQsNyBAQAogCWRlcGVuZHMgb24gSTJDCiAJaGVscAogCSAgVGhlIFdNODk5NCBpcyBhIGhpZ2hseSBpbnRlZ3JhdGVkIGhpLWZpIENPREVDIGRlc2lnbmVkIGZvcgotCSAgc21hcnRwaG9uZSBhcHBsaWNhdGlvc24uICBBcyB3ZWxsIGFzIGF1ZGlvIGZ1bmN0aW9uYWxpdHkgaXQKKwkgIHNtYXJ0cGhvbmUgYXBwbGljYXRpb25zLiAgQXMgd2VsbCBhcyBhdWRpbyBmdW5jdGlvbmFsaXR5IGl0CiAJICBoYXMgb24gYm9hcmQgR1BJTyBhbmQgcmVndWxhdG9yIGZ1bmN0aW9uYWxpdHkgd2hpY2ggaXMKIAkgIHN1cHBvcnRlZCB2aWEgdGhlIHJlbGV2YW50IHN1YnN5c3RlbXMuICBUaGlzIGRyaXZlciBwcm92aWRlcwogCSAgY29yZSBzdXBwb3J0IGZvciB0aGUgV004OTk0LCBpbiBvcmRlciB0byB1c2UgdGhlIGFjdHVhbApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvTWFrZWZpbGUgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQppbmRleCAxOWYzZDc0Li4wZTVjZmViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQpAQCAtMTMsNyArMTMsNyBAQAogb2JqLSQoQ09ORklHX01GRF9DUk9TX0VDX0kyQykJKz0gY3Jvc19lY19pMmMubwogb2JqLSQoQ09ORklHX01GRF9DUk9TX0VDX1NQSSkJKz0gY3Jvc19lY19zcGkubwogCi1ydHN4X3BjaS1vYmpzCQkJOj0gcnRzeF9wY3IubyBydHN4X2dvcHMubyBydHM1MjA5Lm8gcnRzNTIyOS5vIHJ0bDg0MTEubyBydHM1MjI3Lm8gcnRzNTI0OS5vCitydHN4X3BjaS1vYmpzCQkJOj0gcnRzeF9wY3IubyBydHM1MjA5Lm8gcnRzNTIyOS5vIHJ0bDg0MTEubyBydHM1MjI3Lm8gcnRzNTI0OS5vCiBvYmotJChDT05GSUdfTUZEX1JUU1hfUENJKQkrPSBydHN4X3BjaS5vCiBvYmotJChDT05GSUdfTUZEX1JUU1hfVVNCKQkrPSBydHN4X3VzYi5vCiAKQEAgLTExNyw2ICsxMTcsNyBAQAogb2JqLSQoQ09ORklHX01GRF9NQVgxNDU3NykJKz0gbWF4MTQ1Nzcubwogb2JqLSQoQ09ORklHX01GRF9NQVg3NzY4NikJKz0gbWF4Nzc2ODYubwogb2JqLSQoQ09ORklHX01GRF9NQVg3NzY5MykJKz0gbWF4Nzc2OTMubworb2JqLSQoQ09ORklHX01GRF9NQVg3Nzg0MykJKz0gbWF4Nzc4NDMubwogb2JqLSQoQ09ORklHX01GRF9NQVg4OTA3KQkrPSBtYXg4OTA3Lm8KIG1heDg5MjUtb2JqcwkJCTo9IG1heDg5MjUtY29yZS5vIG1heDg5MjUtaTJjLm8KIG9iai0kKENPTkZJR19NRkRfTUFYODkyNSkJKz0gbWF4ODkyNS5vCkBAIC0xMzgsNiArMTM5LDcgQEAKIG9iai0kKENPTkZJR19NRkRfVElNQkVSREFMRSkgICAgKz0gdGltYmVyZGFsZS5vCiBvYmotJChDT05GSUdfUE1JQ19BRFA1NTIwKQkrPSBhZHA1NTIwLm8KIG9iai0kKENPTkZJR19NRkRfS0VNUExEKQkrPSBrZW1wbGQtY29yZS5vCitvYmotJChDT05GSUdfTUZEX0lOVEVMX1FVQVJLX0kyQ19HUElPKQkrPSBpbnRlbF9xdWFya19pMmNfZ3Bpby5vCiBvYmotJChDT05GSUdfTFBDX1NDSCkJCSs9IGxwY19zY2gubwogb2JqLSQoQ09ORklHX0xQQ19JQ0gpCQkrPSBscGNfaWNoLm8KIG9iai0kKENPTkZJR19NRkRfUkRDMzIxWCkJKz0gcmRjMzIxeC1zb3V0aGJyaWRnZS5vCkBAIC0xNzgsNiArMTgwLDggQEAKIG9iai0kKENPTkZJR19NRkRfSEk2NDIxX1BNSUMpCSs9IGhpNjQyMS1wbWljLWNvcmUubwogb2JqLSQoQ09ORklHX01GRF9ETE4yKQkJKz0gZGxuMi5vCiBvYmotJChDT05GSUdfTUZEX1JUNTAzMykJKz0gcnQ1MDMzLm8KK29iai0kKENPTkZJR19NRkRfU0tZODE0NTIpCSs9IHNreTgxNDUyLm8KIAogaW50ZWwtc29jLXBtaWMtb2JqcwkJOj0gaW50ZWxfc29jX3BtaWNfY29yZS5vIGludGVsX3NvY19wbWljX2NyYy5vCiBvYmotJChDT05GSUdfSU5URUxfU09DX1BNSUMpCSs9IGludGVsLXNvYy1wbWljLm8KK29iai0kKENPTkZJR19NRkRfTVQ2Mzk3KQkrPSBtdDYzOTctY29yZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjg1MDAtZGVidWdmcy5jIGIvZHJpdmVycy9tZmQvYWI4NTAwLWRlYnVnZnMuYwppbmRleCA5YThlMTg1Li5jZGQ2ZjNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYjg1MDAtZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbWZkL2FiODUwMC1kZWJ1Z2ZzLmMKQEAgLTEyODMsNyArMTI4Myw3IEBACiAKIC8qIFByaW50cyB0byBzZXFfZmlsZSBvciBsb2dfYnVmICovCiBzdGF0aWMgaW50IGFiODUwMF9yZWdpc3RlcnNfcHJpbnQoc3RydWN0IGRldmljZSAqZGV2LCB1MzIgYmFuaywKLQkJCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCisJCQkJICBzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKQEAgLTEzMDQsMjAgKzEzMDQsMTkgQEAKIAkJCX0KIAogCQkJaWYgKHMpIHsKLQkJCQllcnIgPSBzZXFfcHJpbnRmKHMsCi0JCQkJCQkgIiAgWzB4JTAyWC8weCUwMlhdOiAweCUwMlhcbiIsCi0JCQkJCQkgYmFuaywgcmVnLCB2YWx1ZSk7Ci0JCQkJaWYgKGVyciA8IDApIHsKLQkJCQkJLyogRXJyb3IgaXMgbm90IHJldHVybmVkIGhlcmUgc2luY2UKLQkJCQkJICogdGhlIG91dHB1dCBpcyB3YW50ZWQgaW4gYW55IGNhc2UgKi8KKwkJCQlzZXFfcHJpbnRmKHMsICIgIFsweCUwMlgvMHglMDJYXTogMHglMDJYXG4iLAorCQkJCQkgICBiYW5rLCByZWcsIHZhbHVlKTsKKwkJCQkvKiBFcnJvciBpcyBub3QgcmV0dXJuZWQgaGVyZSBzaW5jZQorCQkJCSAqIHRoZSBvdXRwdXQgaXMgd2FudGVkIGluIGFueSBjYXNlICovCisJCQkJaWYgKHNlcV9oYXNfb3ZlcmZsb3dlZChzKSkKIAkJCQkJcmV0dXJuIDA7Ci0JCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlkZXZfaW5mbyhkZXYsICIgWzB4JTAyWC8weCUwMlhdOiAweCUwMlhcbiIsCiAJCQkJCSBiYW5rLCByZWcsIHZhbHVlKTsKIAkJCX0KIAkJfQogCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMzMwLDggKzEzMjksNyBAQAogCiAJc2VxX3ByaW50ZihzLCAiIGJhbmsgMHglMDJYOlxuIiwgYmFuayk7CiAKLQlhYjg1MDBfcmVnaXN0ZXJzX3ByaW50KGRldiwgYmFuaywgcyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGFiODUwMF9yZWdpc3RlcnNfcHJpbnQoZGV2LCBiYW5rLCBzKTsKIH0KIAogc3RhdGljIGludCBhYjg1MDBfcmVnaXN0ZXJzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0xMzU1LDkgKzEzNTMsMTIgQEAKIAlzZXFfcHV0cyhzLCBBQjg1MDBfTkFNRV9TVFJJTkcgIiByZWdpc3RlciB2YWx1ZXM6XG4iKTsKIAogCWZvciAoaSA9IDA7IGkgPCBBQjg1MDBfTlVNX0JBTktTOyBpKyspIHsKLQkJc2VxX3ByaW50ZihzLCAiIGJhbmsgMHglMDJYOlxuIiwgaSk7CisJCWludCBlcnI7CiAKLQkJYWI4NTAwX3JlZ2lzdGVyc19wcmludChkZXYsIGksIHMpOworCQlzZXFfcHJpbnRmKHMsICIgYmFuayAweCUwMlg6XG4iLCBpKTsKKwkJZXJyID0gYWI4NTAwX3JlZ2lzdGVyc19wcmludChkZXYsIGksIHMpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xNDU4LDcgKzE0NTksOCBAQAogCiBzdGF0aWMgaW50IGFiODUwMF9iYW5rX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKIHsKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAiMHglMDJYXG4iLCBkZWJ1Z19iYW5rKTsKKwlzZXFfcHJpbnRmKHMsICIweCUwMlhcbiIsIGRlYnVnX2JhbmspOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFiODUwMF9iYW5rX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0xNDkwLDcgKzE0OTIsOCBAQAogCiBzdGF0aWMgaW50IGFiODUwMF9hZGRyZXNzX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKIHsKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAiMHglMDJYXG4iLCBkZWJ1Z19hZGRyZXNzKTsKKwlzZXFfcHJpbnRmKHMsICIweCUwMlhcbiIsIGRlYnVnX2FkZHJlc3MpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFiODUwMF9hZGRyZXNzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0xNTk4LDcgKzE2MDEsOCBAQAogCWZvciAobGluZSA9IDA7IGxpbmUgPCBudW1faW50ZXJydXB0X2xpbmVzOyBsaW5lKyspIHsKIAkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MobGluZSArIGlycV9maXJzdCk7CiAKLQkJc2VxX3ByaW50ZihzLCAiJTNpOiAgJTZpICU0aSIsIGxpbmUsCisJCXNlcV9wcmludGYocywgIiUzaTogICU2aSAlNGkiLAorCQkJICAgbGluZSwKIAkJCSAgIG51bV9pbnRlcnJ1cHRzW2xpbmVdLAogCQkJICAgbnVtX3dha2VfaW50ZXJydXB0c1tsaW5lXSk7CiAKQEAgLTE3MDUsOCArMTcwOSw3IEBACiAJCQlkZXZfZXJyKGRldiwgImFiLT5yZWFkIGZhaWwgJWRcbiIsIGVycik7CiAJCQlyZXR1cm4gZXJyOwogCQl9Ci0JCWVyciA9IHNlcV9wcmludGYocywgIiAgWzB4JTAyWC8weCUwMlhdOiAweCUwMlhcbiIsCi0JCQliYW5rLCByZWcsIHZhbHVlKTsKKwkJc2VxX3ByaW50ZihzLCAiICBbMHglMDJYLzB4JTAyWF06IDB4JTAyWFxuIiwgYmFuaywgcmVnLCB2YWx1ZSk7CiAJfQogCWVyciA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsCiAJCUFCODUwMF9SRUdVX0NUUkwxLCBBQjg1MDBfU1VQUExZX0NPTlRST0xfUkVHLCBvcmlnX3ZhbHVlKTsKQEAgLTE3NDMsOCArMTc0Niw5IEBACiAJYmF0X2N0cmxfY29udmVydCA9IGFiODUwMF9ncGFkY19hZF90b192b2x0YWdlKGdwYWRjLAogCQlCQVRfQ1RSTCwgYmF0X2N0cmxfcmF3KTsKIAotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iLAotCQliYXRfY3RybF9jb252ZXJ0LCBiYXRfY3RybF9yYXcpOworCXNlcV9wcmludGYocywgIiVkLDB4JVhcbiIsIGJhdF9jdHJsX2NvbnZlcnQsIGJhdF9jdHJsX3Jhdyk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhYjg1MDBfZ3BhZGNfYmF0X2N0cmxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTE3NzMsOCArMTc3Nyw5IEBACiAJYnRlbXBfYmFsbF9jb252ZXJ0ID0gYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2UoZ3BhZGMsIEJURU1QX0JBTEwsCiAJCWJ0ZW1wX2JhbGxfcmF3KTsKIAotCXJldHVybiBzZXFfcHJpbnRmKHMsCi0JCSIlZCwweCVYXG4iLCBidGVtcF9iYWxsX2NvbnZlcnQsIGJ0ZW1wX2JhbGxfcmF3KTsKKwlzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iLCBidGVtcF9iYWxsX2NvbnZlcnQsIGJ0ZW1wX2JhbGxfcmF3KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFiODUwMF9ncGFkY19idGVtcF9iYWxsX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTE4MDQsOCArMTgwOSw5IEBACiAJbWFpbl9jaGFyZ2VyX3ZfY29udmVydCA9IGFiODUwMF9ncGFkY19hZF90b192b2x0YWdlKGdwYWRjLAogCQlNQUlOX0NIQVJHRVJfViwgbWFpbl9jaGFyZ2VyX3ZfcmF3KTsKIAotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iLAotCQkJbWFpbl9jaGFyZ2VyX3ZfY29udmVydCwgbWFpbl9jaGFyZ2VyX3ZfcmF3KTsKKwlzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iLCBtYWluX2NoYXJnZXJfdl9jb252ZXJ0LCBtYWluX2NoYXJnZXJfdl9yYXcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2dwYWRjX21haW5fY2hhcmdlcl92X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTE4MzUsOCArMTg0MSw5IEBACiAJYWNjX2RldGVjdDFfY29udmVydCA9IGFiODUwMF9ncGFkY19hZF90b192b2x0YWdlKGdwYWRjLCBBQ0NfREVURUNUMSwKIAkJYWNjX2RldGVjdDFfcmF3KTsKIAotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iLAotCQlhY2NfZGV0ZWN0MV9jb252ZXJ0LCBhY2NfZGV0ZWN0MV9yYXcpOworCXNlcV9wcmludGYocywgIiVkLDB4JVhcbiIsIGFjY19kZXRlY3QxX2NvbnZlcnQsIGFjY19kZXRlY3QxX3Jhdyk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhYjg1MDBfZ3BhZGNfYWNjX2RldGVjdDFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLApAQCAtMTg2Niw4ICsxODczLDkgQEAKIAlhY2NfZGV0ZWN0Ml9jb252ZXJ0ID0gYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2UoZ3BhZGMsCiAJCUFDQ19ERVRFQ1QyLCBhY2NfZGV0ZWN0Ml9yYXcpOwogCi0JcmV0dXJuIHNlcV9wcmludGYocywgIiVkLDB4JVhcbiIsCi0JCWFjY19kZXRlY3QyX2NvbnZlcnQsIGFjY19kZXRlY3QyX3Jhdyk7CisJc2VxX3ByaW50ZihzLCAiJWQsMHglWFxuIiwgYWNjX2RldGVjdDJfY29udmVydCwgYWNjX2RldGVjdDJfcmF3KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFiODUwMF9ncGFkY19hY2NfZGV0ZWN0Ml9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC0xODk3LDggKzE5MDUsOSBAQAogCWF1eDFfY29udmVydCA9IGFiODUwMF9ncGFkY19hZF90b192b2x0YWdlKGdwYWRjLCBBRENfQVVYMSwKIAkJYXV4MV9yYXcpOwogCi0JcmV0dXJuIHNlcV9wcmludGYocywgIiVkLDB4JVhcbiIsCi0JCWF1eDFfY29udmVydCwgYXV4MV9yYXcpOworCXNlcV9wcmludGYocywgIiVkLDB4JVhcbiIsIGF1eDFfY29udmVydCwgYXV4MV9yYXcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2dwYWRjX2F1eDFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTE5MjYsOCArMTkzNSw5IEBACiAJYXV4Ml9jb252ZXJ0ID0gYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2UoZ3BhZGMsIEFEQ19BVVgyLAogCQlhdXgyX3Jhdyk7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAiJWQsMHglWFxuIiwKLQkJCWF1eDJfY29udmVydCwgYXV4Ml9yYXcpOworCXNlcV9wcmludGYocywgIiVkLDB4JVhcbiIsIGF1eDJfY29udmVydCwgYXV4Ml9yYXcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2dwYWRjX2F1eDJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTE5NTUsOCArMTk2NSw5IEBACiAJbWFpbl9iYXRfdl9jb252ZXJ0ID0gYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2UoZ3BhZGMsIE1BSU5fQkFUX1YsCiAJCW1haW5fYmF0X3ZfcmF3KTsKIAotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iLAotCQltYWluX2JhdF92X2NvbnZlcnQsIG1haW5fYmF0X3ZfcmF3KTsKKwlzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iLCBtYWluX2JhdF92X2NvbnZlcnQsIG1haW5fYmF0X3ZfcmF3KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFiODUwMF9ncGFkY19tYWluX2JhdF92X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTE5ODYsOCArMTk5Nyw5IEBACiAJdmJ1c192X2NvbnZlcnQgPSBhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZShncGFkYywgVkJVU19WLAogCQl2YnVzX3ZfcmF3KTsKIAotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iLAotCQl2YnVzX3ZfY29udmVydCwgdmJ1c192X3Jhdyk7CisJc2VxX3ByaW50ZihzLCAiJWQsMHglWFxuIiwgdmJ1c192X2NvbnZlcnQsIHZidXNfdl9yYXcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2dwYWRjX3ZidXNfdl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMjAxNSw4ICsyMDI3LDkgQEAKIAltYWluX2NoYXJnZXJfY19jb252ZXJ0ID0gYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2UoZ3BhZGMsCiAJCU1BSU5fQ0hBUkdFUl9DLCBtYWluX2NoYXJnZXJfY19yYXcpOwogCi0JcmV0dXJuIHNlcV9wcmludGYocywgIiVkLDB4JVhcbiIsCi0JCW1haW5fY2hhcmdlcl9jX2NvbnZlcnQsIG1haW5fY2hhcmdlcl9jX3Jhdyk7CisJc2VxX3ByaW50ZihzLCAiJWQsMHglWFxuIiwgbWFpbl9jaGFyZ2VyX2NfY29udmVydCwgbWFpbl9jaGFyZ2VyX2NfcmF3KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFiODUwMF9ncGFkY19tYWluX2NoYXJnZXJfY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC0yMDQ2LDggKzIwNTksOSBAQAogCXVzYl9jaGFyZ2VyX2NfY29udmVydCA9IGFiODUwMF9ncGFkY19hZF90b192b2x0YWdlKGdwYWRjLAogCQlVU0JfQ0hBUkdFUl9DLCB1c2JfY2hhcmdlcl9jX3Jhdyk7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAiJWQsMHglWFxuIiwKLQkJdXNiX2NoYXJnZXJfY19jb252ZXJ0LCB1c2JfY2hhcmdlcl9jX3Jhdyk7CisJc2VxX3ByaW50ZihzLCAiJWQsMHglWFxuIiwgdXNiX2NoYXJnZXJfY19jb252ZXJ0LCB1c2JfY2hhcmdlcl9jX3Jhdyk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhYjg1MDBfZ3BhZGNfdXNiX2NoYXJnZXJfY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC0yMDc3LDggKzIwOTEsOSBAQAogCWJrX2JhdF92X2NvbnZlcnQgPSBhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZShncGFkYywKIAkJQktfQkFUX1YsIGJrX2JhdF92X3Jhdyk7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAiJWQsMHglWFxuIiwKLQkJYmtfYmF0X3ZfY29udmVydCwgYmtfYmF0X3ZfcmF3KTsKKwlzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iLCBia19iYXRfdl9jb252ZXJ0LCBia19iYXRfdl9yYXcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2dwYWRjX2JrX2JhdF92X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0yMTA3LDggKzIxMjIsOSBAQAogCWRpZV90ZW1wX2NvbnZlcnQgPSBhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZShncGFkYywgRElFX1RFTVAsCiAJCWRpZV90ZW1wX3Jhdyk7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAiJWQsMHglWFxuIiwKLQkJZGllX3RlbXBfY29udmVydCwgZGllX3RlbXBfcmF3KTsKKwlzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iLCBkaWVfdGVtcF9jb252ZXJ0LCBkaWVfdGVtcF9yYXcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2dwYWRjX2RpZV90ZW1wX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0yMTM3LDggKzIxNTMsOSBAQAogCXVzYl9pZF9jb252ZXJ0ID0gYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2UoZ3BhZGMsIFVTQl9JRCwKIAkJdXNiX2lkX3Jhdyk7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAiJWQsMHglWFxuIiwKLQkJdXNiX2lkX2NvbnZlcnQsIHVzYl9pZF9yYXcpOworCXNlcV9wcmludGYocywgIiVkLDB4JVhcbiIsIHVzYl9pZF9jb252ZXJ0LCB1c2JfaWRfcmF3KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFiODUwMF9ncGFkY191c2JfaWRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTIxNjYsOCArMjE4Myw5IEBACiAJeHRhbF90ZW1wX2NvbnZlcnQgPSBhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZShncGFkYywgWFRBTF9URU1QLAogCQl4dGFsX3RlbXBfcmF3KTsKIAotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iLAotCQl4dGFsX3RlbXBfY29udmVydCwgeHRhbF90ZW1wX3Jhdyk7CisJc2VxX3ByaW50ZihzLCAiJWQsMHglWFxuIiwgeHRhbF90ZW1wX2NvbnZlcnQsIHh0YWxfdGVtcF9yYXcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTQwX2dwYWRjX3h0YWxfdGVtcF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMjE5Nyw4ICsyMjE1LDkgQEAKIAkJYWI4NTAwX2dwYWRjX2FkX3RvX3ZvbHRhZ2UoZ3BhZGMsIFZCQVRfVFJVRV9NRUFTLAogCQkJCQkgICB2YmF0X3RydWVfbWVhc19yYXcpOwogCi0JcmV0dXJuIHNlcV9wcmludGYocywgIiVkLDB4JVhcbiIsCi0JCXZiYXRfdHJ1ZV9tZWFzX2NvbnZlcnQsIHZiYXRfdHJ1ZV9tZWFzX3Jhdyk7CisJc2VxX3ByaW50ZihzLCAiJWQsMHglWFxuIiwgdmJhdF90cnVlX21lYXNfY29udmVydCwgdmJhdF90cnVlX21lYXNfcmF3KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFiODU0MF9ncGFkY192YmF0X3RydWVfbWVhc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC0yMjMzLDkgKzIyNTIsMTMgQEAKIAlpYmF0X2NvbnZlcnQgPSBhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZShncGFkYywgSUJBVF9WSVJUVUFMX0NIQU5ORUwsCiAJCWliYXRfcmF3KTsKIAotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iICAiJWQsMHglWFxuIiwKLQkJYmF0X2N0cmxfY29udmVydCwgYmF0X2N0cmxfcmF3LAotCQlpYmF0X2NvbnZlcnQsIGliYXRfcmF3KTsKKwlzZXFfcHJpbnRmKHMsCisJCSAgICIlZCwweCVYXG4iCisJCSAgICIlZCwweCVYXG4iLAorCQkgICBiYXRfY3RybF9jb252ZXJ0LCBiYXRfY3RybF9yYXcsCisJCSAgIGliYXRfY29udmVydCwgaWJhdF9yYXcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTQwX2dwYWRjX2JhdF9jdHJsX2FuZF9pYmF0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTIyNjksOSArMjI5MiwxMyBAQAogCWliYXRfY29udmVydCA9IGFiODUwMF9ncGFkY19hZF90b192b2x0YWdlKGdwYWRjLCBJQkFUX1ZJUlRVQUxfQ0hBTk5FTCwKIAkJaWJhdF9yYXcpOwogCi0JcmV0dXJuIHNlcV9wcmludGYocywgIiVkLDB4JVhcbiIgICIlZCwweCVYXG4iLAotCQl2YmF0X21lYXNfY29udmVydCwgdmJhdF9tZWFzX3JhdywKLQkJaWJhdF9jb252ZXJ0LCBpYmF0X3Jhdyk7CisJc2VxX3ByaW50ZihzLAorCQkgICAiJWQsMHglWFxuIgorCQkgICAiJWQsMHglWFxuIiwKKwkJICAgdmJhdF9tZWFzX2NvbnZlcnQsIHZiYXRfbWVhc19yYXcsCisJCSAgIGliYXRfY29udmVydCwgaWJhdF9yYXcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTQwX2dwYWRjX3ZiYXRfbWVhc19hbmRfaWJhdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCkBAIC0yMzA3LDkgKzIzMzQsMTMgQEAKIAlpYmF0X2NvbnZlcnQgPSBhYjg1MDBfZ3BhZGNfYWRfdG9fdm9sdGFnZShncGFkYywgSUJBVF9WSVJUVUFMX0NIQU5ORUwsCiAJCWliYXRfcmF3KTsKIAotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlZCwweCVYXG4iICAiJWQsMHglWFxuIiwKLQkJdmJhdF90cnVlX21lYXNfY29udmVydCwgdmJhdF90cnVlX21lYXNfcmF3LAotCQlpYmF0X2NvbnZlcnQsIGliYXRfcmF3KTsKKwlzZXFfcHJpbnRmKHMsCisJCSAgICIlZCwweCVYXG4iCisJCSAgICIlZCwweCVYXG4iLAorCQkgICB2YmF0X3RydWVfbWVhc19jb252ZXJ0LCB2YmF0X3RydWVfbWVhc19yYXcsCisJCSAgIGliYXRfY29udmVydCwgaWJhdF9yYXcpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTQwX2dwYWRjX3ZiYXRfdHJ1ZV9tZWFzX2FuZF9pYmF0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwKQEAgLTIzNDQsOSArMjM3NSwxMyBAQAogCWliYXRfY29udmVydCA9IGFiODUwMF9ncGFkY19hZF90b192b2x0YWdlKGdwYWRjLCBJQkFUX1ZJUlRVQUxfQ0hBTk5FTCwKIAkJaWJhdF9yYXcpOwogCi0JcmV0dXJuIHNlcV9wcmludGYocywgIiVkLDB4JVhcbiIgICIlZCwweCVYXG4iLAotCQliYXRfdGVtcF9jb252ZXJ0LCBiYXRfdGVtcF9yYXcsCi0JCWliYXRfY29udmVydCwgaWJhdF9yYXcpOworCXNlcV9wcmludGYocywKKwkJICAgIiVkLDB4JVhcbiIKKwkJICAgIiVkLDB4JVhcbiIsCisJCSAgIGJhdF90ZW1wX2NvbnZlcnQsIGJhdF90ZW1wX3JhdywKKwkJICAgaWJhdF9jb252ZXJ0LCBpYmF0X3Jhdyk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhYjg1NDBfZ3BhZGNfYmF0X3RlbXBfYW5kX2liYXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLApAQCAtMjM3MywxNiArMjQwOCwxOSBAQAogCWdwYWRjID0gYWI4NTAwX2dwYWRjX2dldCgiYWI4NTAwLWdwYWRjLjAiKTsKIAlhYjg1NDBfZ3BhZGNfZ2V0X290cChncGFkYywgJnZtYWluX2wsICZ2bWFpbl9oLCAmYnRlbXBfbCwgJmJ0ZW1wX2gsCiAJCQkmdmJhdF9sLCAmdmJhdF9oLCAmaWJhdF9sLCAmaWJhdF9oKTsKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAiVk1BSU5fTDoweCVYXG4iCi0JCQkgICJWTUFJTl9IOjB4JVhcbiIKLQkJCSAgIkJURU1QX0w6MHglWFxuIgotCQkJICAiQlRFTVBfSDoweCVYXG4iCi0JCQkgICJWQkFUX0w6MHglWFxuIgotCQkJICAiVkJBVF9IOjB4JVhcbiIKLQkJCSAgIklCQVRfTDoweCVYXG4iCi0JCQkgICJJQkFUX0g6MHglWFxuIiwKLQkJCSAgdm1haW5fbCwgdm1haW5faCwgYnRlbXBfbCwgYnRlbXBfaCwKLQkJCSAgdmJhdF9sLCB2YmF0X2gsIGliYXRfbCwgaWJhdF9oKTsKKwlzZXFfcHJpbnRmKHMsCisJCSAgICJWTUFJTl9MOjB4JVhcbiIKKwkJICAgIlZNQUlOX0g6MHglWFxuIgorCQkgICAiQlRFTVBfTDoweCVYXG4iCisJCSAgICJCVEVNUF9IOjB4JVhcbiIKKwkJICAgIlZCQVRfTDoweCVYXG4iCisJCSAgICJWQkFUX0g6MHglWFxuIgorCQkgICAiSUJBVF9MOjB4JVhcbiIKKwkJICAgIklCQVRfSDoweCVYXG4iLAorCQkgICB2bWFpbl9sLCB2bWFpbl9oLCBidGVtcF9sLCBidGVtcF9oLAorCQkgICB2YmF0X2wsIHZiYXRfaCwgaWJhdF9sLCBpYmF0X2gpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTQwX2dwYWRjX290cF9jYWxfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTI0MDAsNyArMjQzOCw5IEBACiAKIHN0YXRpYyBpbnQgYWI4NTAwX2dwYWRjX2F2Z19zYW1wbGVfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQogewotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlZFxuIiwgYXZnX3NhbXBsZSk7CisJc2VxX3ByaW50ZihzLCAiJWRcbiIsIGF2Z19zYW1wbGUpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2dwYWRjX2F2Z19zYW1wbGVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTI0NDUsNyArMjQ4NSw5IEBACiAKIHN0YXRpYyBpbnQgYWI4NTAwX2dwYWRjX3RyaWdfZWRnZV9wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCiB7Ci0JcmV0dXJuIHNlcV9wcmludGYocywgIiVkXG4iLCB0cmlnX2VkZ2UpOworCXNlcV9wcmludGYocywgIiVkXG4iLCB0cmlnX2VkZ2UpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2dwYWRjX3RyaWdfZWRnZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMjQ5MCw3ICsyNTMyLDkgQEAKIAogc3RhdGljIGludCBhYjg1MDBfZ3BhZGNfdHJpZ190aW1lcl9wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCiB7Ci0JcmV0dXJuIHNlcV9wcmludGYocywgIiVkXG4iLCB0cmlnX3RpbWVyKTsKKwlzZXFfcHJpbnRmKHMsICIlZFxuIiwgdHJpZ190aW1lcik7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhYjg1MDBfZ3BhZGNfdHJpZ190aW1lcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMjUzMyw3ICsyNTc3LDkgQEAKIAogc3RhdGljIGludCBhYjg1MDBfZ3BhZGNfY29udl90eXBlX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKIHsKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAiJWRcbiIsIGNvbnZfdHlwZSk7CisJc2VxX3ByaW50ZihzLCAiJWRcbiIsIGNvbnZfdHlwZSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhYjg1MDBfZ3BhZGNfY29udl90eXBlX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjg1MDAtc3lzY3RybC5jIGIvZHJpdmVycy9tZmQvYWI4NTAwLXN5c2N0cmwuYwppbmRleCBjZmZmMGI2Li4wZDE4MjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYjg1MDAtc3lzY3RybC5jCisrKyBiL2RyaXZlcnMvbWZkL2FiODUwMC1zeXNjdHJsLmMKQEAgLTQ5LDcgKzQ5LDkgQEAKIAkJaWYgKCFwc3kpCiAJCQljb250aW51ZTsKIAotCQlyZXQgPSBwc3ktPmdldF9wcm9wZXJ0eShwc3ksIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwgJnZhbCk7CisJCXJldCA9IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCisJCQkJJnZhbCk7CisJCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIAogCQlpZiAoIXJldCAmJiB2YWwuaW50dmFsKSB7CiAJCQljaGFyZ2VyX3ByZXNlbnQgPSB0cnVlOwpAQCAtNjMsOCArNjUsOCBAQAogCS8qIENoZWNrIGlmIGJhdHRlcnkgaXMga25vd24gKi8KIAlwc3kgPSBwb3dlcl9zdXBwbHlfZ2V0X2J5X25hbWUoImFiODUwMF9idGVtcCIpOwogCWlmIChwc3kpIHsKLQkJcmV0ID0gcHN5LT5nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZLAotCQkJCQkmdmFsKTsKKwkJcmV0ID0gcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShwc3ksCisJCQkJUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWSwgJnZhbCk7CiAJCWlmICghcmV0ICYmIHZhbC5pbnR2YWwgIT0gUE9XRVJfU1VQUExZX1RFQ0hOT0xPR1lfVU5LTk9XTikgewogCQkJcHJpbnRrKEtFUk5fSU5GTwogCQkJICAgICAgICJDaGFyZ2VyIFwiJXNcIiBpcyBjb25uZWN0ZWQgd2l0aCBrbm93biBiYXR0ZXJ5LiIKQEAgLTcyLDYgKzc0LDcgQEAKIAkJCSAgICAgICBwc3NbaV0pOwogCQkJbWFjaGluZV9yZXN0YXJ0KCJjaGFyZ2luZyIpOwogCQl9CisJCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIAl9CiAKIHNodXRkb3duOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYXJpem9uYS1jb3JlLmMgYi9kcml2ZXJzL21mZC9hcml6b25hLWNvcmUuYwppbmRleCAwOWJhOGYxLi42Y2E2ZGZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hcml6b25hLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9hcml6b25hLWNvcmUuYwpAQCAtNTYxLDEyICs1NjEsMjMgQEAKIAkJY291bnQrKzsKIAl9CiAKKwljb3VudCA9IDA7CisJb2ZfcHJvcGVydHlfZm9yX2VhY2hfdTMyKGFyaXpvbmEtPmRldi0+b2Zfbm9kZSwgIndsZixkbWljLXJlZiIsIHByb3AsCisJCQkJIGN1ciwgdmFsKSB7CisJCWlmIChjb3VudCA9PSBBUlJBWV9TSVpFKGFyaXpvbmEtPnBkYXRhLmRtaWNfcmVmKSkKKwkJCWJyZWFrOworCisJCWFyaXpvbmEtPnBkYXRhLmRtaWNfcmVmW2NvdW50XSA9IHZhbDsKKwkJY291bnQrKzsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIAogY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhcml6b25hX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJ3bGYsd201MTAyIiwgLmRhdGEgPSAodm9pZCAqKVdNNTEwMiB9LAogCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtNTExMCIsIC5kYXRhID0gKHZvaWQgKilXTTUxMTAgfSwKKwl7IC5jb21wYXRpYmxlID0gIndsZix3bTgyODAiLCAuZGF0YSA9ICh2b2lkICopV004MjgwIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ3bGYsd204OTk3IiwgLmRhdGEgPSAodm9pZCAqKVdNODk5NyB9LAogCXt9LAogfTsKQEAgLTY3MSw2ICs2ODIsNyBAQAogCXN3aXRjaCAoYXJpem9uYS0+dHlwZSkgewogCWNhc2UgV001MTAyOgogCWNhc2UgV001MTEwOgorCWNhc2UgV004MjgwOgogCWNhc2UgV004OTk3OgogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTUxMDJfY29yZV9zdXBwbGllcyk7IGkrKykKIAkJCWFyaXpvbmEtPmNvcmVfc3VwcGxpZXNbaV0uc3VwcGx5CkBAIC04MzQsMTEgKzg0NiwxOSBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX01GRF9XTTUxMTAKIAljYXNlIDB4NTExMDoKLQkJdHlwZV9uYW1lID0gIldNNTExMCI7Ci0JCWlmIChhcml6b25hLT50eXBlICE9IFdNNTExMCkgeworCQlzd2l0Y2ggKGFyaXpvbmEtPnR5cGUpIHsKKwkJY2FzZSBXTTUxMTA6CisJCQl0eXBlX25hbWUgPSAiV001MTEwIjsKKwkJCWJyZWFrOworCQljYXNlIFdNODI4MDoKKwkJCXR5cGVfbmFtZSA9ICJXTTgyODAiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl0eXBlX25hbWUgPSAiV001MTEwIjsKIAkJCWRldl9lcnIoYXJpem9uYS0+ZGV2LCAiV001MTEwIHJlZ2lzdGVyZWQgYXMgJWRcbiIsCiAJCQkJYXJpem9uYS0+dHlwZSk7CiAJCQlhcml6b25hLT50eXBlID0gV001MTEwOworCQkJYnJlYWs7CiAJCX0KIAkJYXBwbHlfcGF0Y2ggPSB3bTUxMTBfcGF0Y2g7CiAJCWJyZWFrOwpAQCAtMTAxMCw2ICsxMDMwLDcgQEAKIAkJCQkgICAgICBBUlJBWV9TSVpFKHdtNTEwMl9kZXZzKSwgTlVMTCwgMCwgTlVMTCk7CiAJCWJyZWFrOwogCWNhc2UgV001MTEwOgorCWNhc2UgV004MjgwOgogCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoYXJpem9uYS0+ZGV2LCAtMSwgd201MTEwX2RldnMsCiAJCQkJICAgICAgQVJSQVlfU0laRSh3bTUxMTBfZGV2cyksIE5VTEwsIDAsIE5VTEwpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FyaXpvbmEtaTJjLmMgYi9kcml2ZXJzL21mZC9hcml6b25hLWkyYy5jCmluZGV4IDlkNDE1NmYuLmZmNzgyYTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FyaXpvbmEtaTJjLmMKKysrIGIvZHJpdmVycy9tZmQvYXJpem9uYS1pMmMuYwpAQCAtNDQsNiArNDQsNyBAQAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX01GRF9XTTUxMTAKIAljYXNlIFdNNTExMDoKKwljYXNlIFdNODI4MDoKIAkJcmVnbWFwX2NvbmZpZyA9ICZ3bTUxMTBfaTJjX3JlZ21hcDsKIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTg3LDYgKzg4LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhcml6b25hX2kyY19pZFtdID0gewogCXsgIndtNTEwMiIsIFdNNTEwMiB9LAogCXsgIndtNTExMCIsIFdNNTExMCB9LAorCXsgIndtODI4MCIsIFdNODI4MCB9LAogCXsgIndtODk5NyIsIFdNODk5NyB9LAogCXsgfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FyaXpvbmEtaXJxLmMgYi9kcml2ZXJzL21mZC9hcml6b25hLWlycS5jCmluZGV4IDNhM2ZlN2MuLmQwNjNiOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FyaXpvbmEtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvYXJpem9uYS1pcnEuYwpAQCAtMjExLDYgKzIxMSw3IEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTUZEX1dNNTExMAogCWNhc2UgV001MTEwOgorCWNhc2UgV004MjgwOgogCQlhb2QgPSAmd201MTEwX2FvZDsKIAogCQlzd2l0Y2ggKGFyaXpvbmEtPnJldikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYXJpem9uYS1zcGkuYyBiL2RyaXZlcnMvbWZkL2FyaXpvbmEtc3BpLmMKaW5kZXggOGVmNThiYy4uMWU4NDVmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYXJpem9uYS1zcGkuYworKysgYi9kcml2ZXJzL21mZC9hcml6b25hLXNwaS5jCkBAIC00NCw2ICs0NCw3IEBACiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTUZEX1dNNTExMAogCWNhc2UgV001MTEwOgorCWNhc2UgV004MjgwOgogCQlyZWdtYXBfY29uZmlnID0gJndtNTExMF9zcGlfcmVnbWFwOwogCQlicmVhazsKICNlbmRpZgpAQCAtODQsNiArODUsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzcGlfZGV2aWNlX2lkIGFyaXpvbmFfc3BpX2lkc1tdID0gewogCXsgIndtNTEwMiIsIFdNNTEwMiB9LAogCXsgIndtNTExMCIsIFdNNTExMCB9LAorCXsgIndtODI4MCIsIFdNODI4MCB9LAogCXsgfSwKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHNwaSwgYXJpem9uYV9zcGlfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2F4cDIweC5jIGIvZHJpdmVycy9tZmQvYXhwMjB4LmMKaW5kZXggYjFiNTgwYS4uZDE4MDI5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYXhwMjB4LmMKKysrIGIvZHJpdmVycy9tZmQvYXhwMjB4LmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogI2RlZmluZSBBWFAyMFhfT0ZGCTB4ODAKIAotc3RhdGljIGNvbnN0IGNoYXIgY29uc3QgKmF4cDIweF9tb2RlbF9uYW1lc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBheHAyMHhfbW9kZWxfbmFtZXNbXSA9IHsKIAkiQVhQMjAyIiwKIAkiQVhQMjA5IiwKIAkiQVhQMjg4IiwKQEAgLTg3LDcgKzg3LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBheHAyODhfYmF0dGVyeV9yZXNvdXJjZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYXhwMjg4X2Z1ZWxfZ2F1Z2VfcmVzb3VyY2VzW10gPSB7CiAJewogCQkuc3RhcnQgPSBBWFAyODhfSVJRX1FXQlRVLAogCQkuZW5kICAgPSBBWFAyODhfSVJRX1FXQlRVLApAQCAtMjkwLDYgKzI5MCwyOSBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGF4cDI4OF9leHRjb25fcmVzb3VyY2VzW10gPSB7CisJeworCQkuc3RhcnQgPSBBWFAyODhfSVJRX1ZCVVNfRkFMTCwKKwkJLmVuZCAgID0gQVhQMjg4X0lSUV9WQlVTX0ZBTEwsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBBWFAyODhfSVJRX1ZCVVNfUklTRSwKKwkJLmVuZCAgID0gQVhQMjg4X0lSUV9WQlVTX1JJU0UsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkuc3RhcnQgPSBBWFAyODhfSVJRX01WX0NITkcsCisJCS5lbmQgICA9IEFYUDI4OF9JUlFfTVZfQ0hORywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5zdGFydCA9IEFYUDI4OF9JUlFfQkNfVVNCX0NITkcsCisJCS5lbmQgICA9IEFYUDI4OF9JUlFfQkNfVVNCX0NITkcsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGF4cDI4OF9jaGFyZ2VyX3Jlc291cmNlc1tdID0gewogCXsKIAkJLnN0YXJ0ID0gQVhQMjg4X0lSUV9PViwKQEAgLTM0NSwxNCArMzY4LDE5IEBACiAJCS5yZXNvdXJjZXMgPSBheHAyODhfYWRjX3Jlc291cmNlcywKIAl9LAogCXsKKwkJLm5hbWUgPSAiYXhwMjg4X2V4dGNvbiIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShheHAyODhfZXh0Y29uX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBheHAyODhfZXh0Y29uX3Jlc291cmNlcywKKwl9LAorCXsKIAkJLm5hbWUgPSAiYXhwMjg4X2NoYXJnZXIiLAogCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYXhwMjg4X2NoYXJnZXJfcmVzb3VyY2VzKSwKIAkJLnJlc291cmNlcyA9IGF4cDI4OF9jaGFyZ2VyX3Jlc291cmNlcywKIAl9LAogCXsKLQkJLm5hbWUgPSAiYXhwMjg4X2JhdHRlcnkiLAotCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYXhwMjg4X2JhdHRlcnlfcmVzb3VyY2VzKSwKLQkJLnJlc291cmNlcyA9IGF4cDI4OF9iYXR0ZXJ5X3Jlc291cmNlcywKKwkJLm5hbWUgPSAiYXhwMjg4X2Z1ZWxfZ2F1Z2UiLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYXhwMjg4X2Z1ZWxfZ2F1Z2VfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IGF4cDI4OF9mdWVsX2dhdWdlX3Jlc291cmNlcywKIAl9LAogCXsKIAkJLm5hbWUgPSAiYXhwMjg4X3BtaWNfYWNwaSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9kYTkwNTItaXJxLmMgYi9kcml2ZXJzL21mZC9kYTkwNTItaXJxLmMKaW5kZXggNTdhZTc4NC4uZTY1Y2ExOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvZGE5MDUyLWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL2RhOTA1Mi1pcnEuYwpAQCAtMjYyLDYgKzI2Miw4IEBACiAJCWdvdG8gcmVnbWFwX2VycjsKIAl9CiAKKwllbmFibGVfaXJxX3dha2UoZGE5MDUyLT5jaGlwX2lycSk7CisKIAlyZXQgPSBkYTkwNTJfcmVxdWVzdF9pcnEoZGE5MDUyLCBEQTkwNTJfSVJRX0FEQ19FT00sICJhZGMtaXJxIiwKIAkJCSAgICBkYTkwNTJfYXV4YWRjX2lycSwgZGE5MDUyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvZGE5MDUyLXNwaS5jIGIvZHJpdmVycy9tZmQvZGE5MDUyLXNwaS5jCmluZGV4IDQ1YWUwYjcuLmI1ZGU4YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2RhOTA1Mi1zcGkuYworKysgYi9kcml2ZXJzL21mZC9kYTkwNTItc3BpLmMKQEAgLTMyLDcgKzMyLDcgQEAKIAlpZiAoIWRhOTA1MikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGktPm1vZGUgPSBTUElfTU9ERV8wIHwgU1BJX0NQT0w7CisJc3BpLT5tb2RlID0gU1BJX01PREVfMDsKIAlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OwogCXNwaV9zZXR1cChzcGkpOwogCkBAIC00Myw2ICs0MywxMCBAQAogCiAJY29uZmlnID0gZGE5MDUyX3JlZ21hcF9jb25maWc7CiAJY29uZmlnLnJlYWRfZmxhZ19tYXNrID0gMTsKKwljb25maWcucmVnX2JpdHMgPSA3OworCWNvbmZpZy5wYWRfYml0cyA9IDE7CisJY29uZmlnLnZhbF9iaXRzID0gODsKKwljb25maWcudXNlX3NpbmdsZV9ydyA9IDE7CiAKIAlkYTkwNTItPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfc3BpKHNwaSwgJmNvbmZpZyk7CiAJaWYgKElTX0VSUihkYTkwNTItPnJlZ21hcCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RhOTE1MC1jb3JlLmMgYi9kcml2ZXJzL21mZC9kYTkxNTAtY29yZS5jCmluZGV4IDRkNzU3YjkuLjU1NDk4MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2RhOTE1MC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvZGE5MTUwLWNvcmUuYwpAQCAtOTUsNyArOTUsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgZGE5MTUwX3JlZ21hcF9jb25maWcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgZGE5MTUwX3JlZ21hcF9jb25maWcgPSB7CiAJLnJlZ19iaXRzID0gOCwKIAkudmFsX2JpdHMgPSA4LAogCS5yYW5nZXMgPSBkYTkxNTBfcmFuZ2VfY2ZnLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvZGxuMi5jIGIvZHJpdmVycy9tZmQvZGxuMi5jCmluZGV4IDFiZTliZDEuLjcwNGUxODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2RsbjIuYworKysgYi9kcml2ZXJzL21mZC9kbG4yLmMKQEAgLTQzNSw3ICs0MzUsNyBAQAogCXN0cnVjdCBkbG4yX3Jlc3BvbnNlICpyc3A7CiAJc3RydWN0IGRsbjJfcnhfY29udGV4dCAqcnhjOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZkbG4yLT5pbnRlcmZhY2UtPmRldjsKLQljb25zdCB1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBETE4yX1VTQl9USU1FT1VUICogSFogLyAxMDAwOworCWNvbnN0IHVuc2lnbmVkIGxvbmcgdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoRExOMl9VU0JfVElNRU9VVCk7CiAJc3RydWN0IGRsbjJfbW9kX3J4X3Nsb3RzICpyeHMgPSAmZGxuMi0+bW9kX3J4X3Nsb3RzW2hhbmRsZV07CiAJaW50IHNpemU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2hpNjQyMS1wbWljLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2hpNjQyMS1wbWljLWNvcmUuYwppbmRleCA3MjEwYWUyLi45NWIyZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9oaTY0MjEtcG1pYy1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvaGk2NDIxLXBtaWMtY29yZS5jCkBAIC05Myw3ICs5Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX2hpNjQyMV9wbWljX21hdGNoX3RibFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfaGk2NDIxX3BtaWNfbWF0Y2hfdGJsW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJoaXNpbGljb24saGk2NDIxLXBtaWMiLCB9LAogCXsgfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9pbnRlbF9xdWFya19pMmNfZ3Bpby5jIGIvZHJpdmVycy9tZmQvaW50ZWxfcXVhcmtfaTJjX2dwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2UxNjAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvaW50ZWxfcXVhcmtfaTJjX2dwaW8uYwpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIEludGVsIFF1YXJrIE1GRCBQQ0kgZHJpdmVyIGZvciBJMkMgJiBHUElPCisgKgorICogQ29weXJpZ2h0KGMpIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIEludGVsIFF1YXJrIFBDSSBkZXZpY2UgZm9yIEkyQyBhbmQgR1BJTyBjb250cm9sbGVyIHNoYXJpbmcgdGhlIHNhbWUKKyAqIFBDSSBmdW5jdGlvbi4gVGhpcyBQQ0kgZHJpdmVyIHdpbGwgc3BsaXQgdGhlIDIgZGV2aWNlcyBpbnRvIHRoZWlyCisgKiByZXNwZWN0aXZlIGRyaXZlcnMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvY2xrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLXByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9ncGlvLWR3YXBiLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9pMmMtZGVzaWdud2FyZS5oPgorCisvKiBQQ0kgQkFSIGZvciByZWdpc3RlciBiYXNlIGFkZHJlc3MgKi8KKyNkZWZpbmUgTUZEX0kyQ19CQVIJCTAKKyNkZWZpbmUgTUZEX0dQSU9fQkFSCQkxCisKKy8qIFRoZSBiYXNlIEdQSU8gbnVtYmVyIHVuZGVyIEdQSU9MSUIgZnJhbWV3b3JrICovCisjZGVmaW5lIElOVEVMX1FVQVJLX01GRF9HUElPX0JBU0UJOAorCisvKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgU291dGgtQ2x1c3RlciBHUElPIG9uIFF1YXJrLiAqLworI2RlZmluZSBJTlRFTF9RVUFSS19NRkRfTkdQSU8JCTgKKworLyogVGhlIERlc2lnbldhcmUgR1BJTyBwb3J0cyBvbiBRdWFyay4gKi8KKyNkZWZpbmUgSU5URUxfUVVBUktfR1BJT19OUE9SVFMJMQorCisjZGVmaW5lIElOVEVMX1FVQVJLX0lPUkVTX01FTQkwCisjZGVmaW5lIElOVEVMX1FVQVJLX0lPUkVTX0lSUQkxCisKKyNkZWZpbmUgSU5URUxfUVVBUktfSTJDX0NPTlRST0xMRVJfQ0xLICJpMmNfZGVzaWdud2FyZS4wIgorCisvKiBUaGUgUXVhcmsgSTJDIGNvbnRyb2xsZXIgc291cmNlIGNsb2NrICovCisjZGVmaW5lIElOVEVMX1FVQVJLX0kyQ19DTEtfSFoJMzMwMDAwMDAKKworI2RlZmluZSBJTlRFTF9RVUFSS19JMkNfTkNMSwkxCisKK3N0cnVjdCBpbnRlbF9xdWFya19tZmQgeworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwlzdHJ1Y3QgY2xrCQkqaTJjX2NsazsKKwlzdHJ1Y3QgY2xrX2xvb2t1cAkqaTJjX2Nsa19sb29rdXA7Cit9OworCitzdHJ1Y3QgaTJjX21vZGVfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBpbnQgaTJjX3NjbF9mcmVxOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfbW9kZV9pbmZvIHBsYXRmb3JtX2kyY19tb2RlX2luZm9bXSA9IHsKKwl7CisJCS5uYW1lID0gIkdhbGlsZW8iLAorCQkuaTJjX3NjbF9mcmVxID0gMTAwMDAwLAorCX0sCisJeworCQkubmFtZSA9ICJHYWxpbGVvR2VuMiIsCisJCS5pMmNfc2NsX2ZyZXEgPSA0MDAwMDAsCisJfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBpbnRlbF9xdWFya19pMmNfcmVzW10gPSB7CisJW0lOVEVMX1FVQVJLX0lPUkVTX01FTV0gPSB7CisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJW0lOVEVMX1FVQVJLX0lPUkVTX0lSUV0gPSB7CisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGludGVsX3F1YXJrX2dwaW9fcmVzW10gPSB7CisJW0lOVEVMX1FVQVJLX0lPUkVTX01FTV0gPSB7CisJCS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIGludGVsX3F1YXJrX21mZF9jZWxsc1tdID0geworCXsKKwkJLmlkID0gTUZEX0kyQ19CQVIsCisJCS5uYW1lID0gImkyY19kZXNpZ253YXJlIiwKKwkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGludGVsX3F1YXJrX2kyY19yZXMpLAorCQkucmVzb3VyY2VzID0gaW50ZWxfcXVhcmtfaTJjX3JlcywKKwkJLmlnbm9yZV9yZXNvdXJjZV9jb25mbGljdHMgPSB0cnVlLAorCX0sCisJeworCQkuaWQgPSBNRkRfR1BJT19CQVIsCisJCS5uYW1lID0gImdwaW8tZHdhcGIiLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoaW50ZWxfcXVhcmtfZ3Bpb19yZXMpLAorCQkucmVzb3VyY2VzID0gaW50ZWxfcXVhcmtfZ3Bpb19yZXMsCisJCS5pZ25vcmVfcmVzb3VyY2VfY29uZmxpY3RzID0gdHJ1ZSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGludGVsX3F1YXJrX21mZF9pZHNbXSA9IHsKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDA5MzQpLCB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpbnRlbF9xdWFya19tZmRfaWRzKTsKKworc3RhdGljIGludCBpbnRlbF9xdWFya19yZWdpc3Rlcl9pMmNfY2xrKHN0cnVjdCBpbnRlbF9xdWFya19tZmQgKnF1YXJrX21mZCkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHF1YXJrX21mZC0+cGRldjsKKwlzdHJ1Y3QgY2xrX2xvb2t1cCAqaTJjX2Nsa19sb29rdXA7CisJc3RydWN0IGNsayAqaTJjX2NsazsKKwlpbnQgcmV0OworCisJaTJjX2Nsa19sb29rdXAgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgSU5URUxfUVVBUktfSTJDX05DTEssCisJCQkJICAgICAgc2l6ZW9mKCppMmNfY2xrX2xvb2t1cCksIEdGUF9LRVJORUwpOworCWlmICghaTJjX2Nsa19sb29rdXApCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX2Nsa19sb29rdXBbMF0uZGV2X2lkID0gSU5URUxfUVVBUktfSTJDX0NPTlRST0xMRVJfQ0xLOworCisJaTJjX2NsayA9IGNsa19yZWdpc3Rlcl9maXhlZF9yYXRlKCZwZGV2LT5kZXYsCisJCQkJCSAgSU5URUxfUVVBUktfSTJDX0NPTlRST0xMRVJfQ0xLLCBOVUxMLAorCQkJCQkgIENMS19JU19ST09ULCBJTlRFTF9RVUFSS19JMkNfQ0xLX0haKTsKKworCXF1YXJrX21mZC0+aTJjX2Nsa19sb29rdXAgPSBpMmNfY2xrX2xvb2t1cDsKKwlxdWFya19tZmQtPmkyY19jbGsgPSBpMmNfY2xrOworCisJcmV0ID0gY2xrX3JlZ2lzdGVyX2Nsa2RldnMoaTJjX2NsaywgaTJjX2Nsa19sb29rdXAsCisJCQkJICAgSU5URUxfUVVBUktfSTJDX05DTEspOworCWlmIChyZXQpCisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZpeGVkIGNsayByZWdpc3RlciBmYWlsZWQ6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfcXVhcmtfdW5yZWdpc3Rlcl9pMmNfY2xrKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBpbnRlbF9xdWFya19tZmQgKnF1YXJrX21mZCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKworCWlmICghcXVhcmtfbWZkLT5pMmNfY2xrIHx8ICFxdWFya19tZmQtPmkyY19jbGtfbG9va3VwKQorCQlyZXR1cm47CisKKwljbGtkZXZfZHJvcChxdWFya19tZmQtPmkyY19jbGtfbG9va3VwKTsKKwljbGtfdW5yZWdpc3RlcihxdWFya19tZmQtPmkyY19jbGspOworfQorCitzdGF0aWMgaW50IGludGVsX3F1YXJrX2kyY19zZXR1cChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IG1mZF9jZWxsICpjZWxsKQoreworCWNvbnN0IGNoYXIgKmJvYXJkX25hbWUgPSBkbWlfZ2V0X3N5c3RlbV9pbmZvKERNSV9CT0FSRF9OQU1FKTsKKwljb25zdCBzdHJ1Y3QgaTJjX21vZGVfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgZHdfaTJjX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gKHN0cnVjdCByZXNvdXJjZSAqKWNlbGwtPnJlc291cmNlczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCisJcmVzW0lOVEVMX1FVQVJLX0lPUkVTX01FTV0uc3RhcnQgPQorCQlwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgTUZEX0kyQ19CQVIpOworCXJlc1tJTlRFTF9RVUFSS19JT1JFU19NRU1dLmVuZCA9CisJCXBjaV9yZXNvdXJjZV9lbmQocGRldiwgTUZEX0kyQ19CQVIpOworCisJcmVzW0lOVEVMX1FVQVJLX0lPUkVTX0lSUV0uc3RhcnQgPSBwZGV2LT5pcnE7CisJcmVzW0lOVEVMX1FVQVJLX0lPUkVTX0lSUV0uZW5kID0gcGRldi0+aXJxOworCisJcGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBOb3JtYWwgbW9kZSBieSBkZWZhdWx0ICovCisJcGRhdGEtPmkyY19zY2xfZnJlcSA9IDEwMDAwMDsKKworCWlmIChib2FyZF9uYW1lKSB7CisJCWZvciAoaW5mbyA9IHBsYXRmb3JtX2kyY19tb2RlX2luZm87IGluZm8tPm5hbWU7IGluZm8rKykgeworCQkJaWYgKCFzdHJjbXAoYm9hcmRfbmFtZSwgaW5mby0+bmFtZSkpIHsKKwkJCQlwZGF0YS0+aTJjX3NjbF9mcmVxID0gaW5mby0+aTJjX3NjbF9mcmVxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJY2VsbC0+cGxhdGZvcm1fZGF0YSA9IHBkYXRhOworCWNlbGwtPnBkYXRhX3NpemUgPSBzaXplb2YoKnBkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsX3F1YXJrX2dwaW9fc2V0dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBtZmRfY2VsbCAqY2VsbCkKK3sKKwlzdHJ1Y3QgZHdhcGJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSAoc3RydWN0IHJlc291cmNlICopY2VsbC0+cmVzb3VyY2VzOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisKKwlyZXNbSU5URUxfUVVBUktfSU9SRVNfTUVNXS5zdGFydCA9CisJCXBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCBNRkRfR1BJT19CQVIpOworCXJlc1tJTlRFTF9RVUFSS19JT1JFU19NRU1dLmVuZCA9CisJCXBjaV9yZXNvdXJjZV9lbmQocGRldiwgTUZEX0dQSU9fQkFSKTsKKworCXBkYXRhID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghcGRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogRm9yIGludGVsIHF1YXJrIHgxMDAwLCBpdCBoYXMgb25seSBvbmUgcG9ydDogcG9ydEEgKi8KKwlwZGF0YS0+bnBvcnRzID0gSU5URUxfUVVBUktfR1BJT19OUE9SVFM7CisJcGRhdGEtPnByb3BlcnRpZXMgPSBkZXZtX2tjYWxsb2MoZGV2LCBwZGF0YS0+bnBvcnRzLAorCQkJCQkgc2l6ZW9mKCpwZGF0YS0+cHJvcGVydGllcyksCisJCQkJCSBHRlBfS0VSTkVMKTsKKwlpZiAoIXBkYXRhLT5wcm9wZXJ0aWVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFNldCB0aGUgcHJvcGVydGllcyBmb3IgcG9ydEEgKi8KKwlwZGF0YS0+cHJvcGVydGllcy0+bm9kZQkJPSBOVUxMOworCXBkYXRhLT5wcm9wZXJ0aWVzLT5uYW1lCQk9ICJpbnRlbC1xdWFyay14MTAwMC1ncGlvLXBvcnRBIjsKKwlwZGF0YS0+cHJvcGVydGllcy0+aWR4CQk9IDA7CisJcGRhdGEtPnByb3BlcnRpZXMtPm5ncGlvCT0gSU5URUxfUVVBUktfTUZEX05HUElPOworCXBkYXRhLT5wcm9wZXJ0aWVzLT5ncGlvX2Jhc2UJPSBJTlRFTF9RVUFSS19NRkRfR1BJT19CQVNFOworCXBkYXRhLT5wcm9wZXJ0aWVzLT5pcnEJCT0gcGRldi0+aXJxOworCXBkYXRhLT5wcm9wZXJ0aWVzLT5pcnFfc2hhcmVkCT0gdHJ1ZTsKKworCWNlbGwtPnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKKwljZWxsLT5wZGF0YV9zaXplID0gc2l6ZW9mKCpwZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF9xdWFya19tZmRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaW50ZWxfcXVhcmtfbWZkICpxdWFya19tZmQ7CisJaW50IHJldDsKKworCXJldCA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcXVhcmtfbWZkID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcXVhcmtfbWZkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxdWFya19tZmQpCisJCXJldHVybiAtRU5PTUVNOworCXF1YXJrX21mZC0+cGRldiA9IHBkZXY7CisKKwlyZXQgPSBpbnRlbF9xdWFya19yZWdpc3Rlcl9pMmNfY2xrKHF1YXJrX21mZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBxdWFya19tZmQpOworCisJcmV0ID0gaW50ZWxfcXVhcmtfaTJjX3NldHVwKHBkZXYsICZpbnRlbF9xdWFya19tZmRfY2VsbHNbTUZEX0kyQ19CQVJdKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gaW50ZWxfcXVhcmtfZ3Bpb19zZXR1cChwZGV2LAorCQkJCSAgICAgJmludGVsX3F1YXJrX21mZF9jZWxsc1tNRkRfR1BJT19CQVJdKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIG1mZF9hZGRfZGV2aWNlcygmcGRldi0+ZGV2LCAwLCBpbnRlbF9xdWFya19tZmRfY2VsbHMsCisJCQkgICAgICAgQVJSQVlfU0laRShpbnRlbF9xdWFya19tZmRfY2VsbHMpLCBOVUxMLCAwLAorCQkJICAgICAgIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9xdWFya19tZmRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWludGVsX3F1YXJrX3VucmVnaXN0ZXJfaTJjX2NsayhwZGV2KTsKKwltZmRfcmVtb3ZlX2RldmljZXMoJnBkZXYtPmRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpbnRlbF9xdWFya19tZmRfZHJpdmVyID0geworCS5uYW1lCQk9ICJpbnRlbF9xdWFya19tZmRfaTJjX2dwaW8iLAorCS5pZF90YWJsZQk9IGludGVsX3F1YXJrX21mZF9pZHMsCisJLnByb2JlCQk9IGludGVsX3F1YXJrX21mZF9wcm9iZSwKKwkucmVtb3ZlCQk9IGludGVsX3F1YXJrX21mZF9yZW1vdmUsCit9OworCittb2R1bGVfcGNpX2RyaXZlcihpbnRlbF9xdWFya19tZmRfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiUmF5bW9uZCBUYW4gPHJheW1vbmQudGFuQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgUXVhcmsgTUZEIFBDSSBkcml2ZXIgZm9yIEkyQyAmIEdQSU8iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2ludGVsX3NvY19wbWljX2NvcmUuYyBiL2RyaXZlcnMvbWZkL2ludGVsX3NvY19wbWljX2NvcmUuYwppbmRleCA4MGNlZjA0Li43YjUwYjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9pbnRlbF9zb2NfcG1pY19jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvaW50ZWxfc29jX3BtaWNfY29yZS5jCkBAIC0yNiwxOSArMjYsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvaW50ZWxfc29jX3BtaWMuaD4KICNpbmNsdWRlICJpbnRlbF9zb2NfcG1pY19jb3JlLmgiCiAKLS8qCi0gKiBPbiBzb21lIGJvYXJkcyB0aGUgUE1JQyBpbnRlcnJ1cHQgbWF5IGNvbWUgZnJvbSBhIEdQSU8gbGluZS4KLSAqIFRyeSB0byBsb29rdXAgdGhlIEFDUEkgdGFibGUgYW5kIHNlZSBpZiBzdWNoIGNvbm5lY3Rpb24gZXhpc3RzLiBJZiBub3QsCi0gKiByZXR1cm4gLUVOT0VOVCBhbmQgdXNlIHRoZSBJUlEgcHJvdmlkZWQgYnkgSTJDLgotICovCiBzdGF0aWMgaW50IGludGVsX3NvY19wbWljX2ZpbmRfZ3Bpb19pcnEoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBncGlvX2Rlc2MgKmRlc2M7CiAJaW50IGlycTsKIAotCWRlc2MgPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsICJpbnRlbF9zb2NfcG1pYyIsIDApOworCWRlc2MgPSBkZXZtX2dwaW9kX2dldF9pbmRleChkZXYsICJpbnRlbF9zb2NfcG1pYyIsIDAsIEdQSU9EX0lOKTsKIAlpZiAoSVNfRVJSKGRlc2MpKQotCQlyZXR1cm4gLUVOT0VOVDsKKwkJcmV0dXJuIFBUUl9FUlIoZGVzYyk7CiAKIAlpcnEgPSBncGlvZF90b19pcnEoZGVzYyk7CiAJaWYgKGlycSA8IDApCkBAIC03MSw2ICs2NiwxMSBAQAogCiAJcG1pYy0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCBjb25maWctPnJlZ21hcF9jb25maWcpOwogCisJLyoKKwkgKiBPbiBzb21lIGJvYXJkcyB0aGUgUE1JQyBpbnRlcnJ1cHQgbWF5IGNvbWUgZnJvbSBhIEdQSU8gbGluZS4gVHJ5IHRvCisJICogbG9va3VwIHRoZSBBQ1BJIHRhYmxlIGZvciBhIHN1Y2ggY29ubmVjdGlvbiBhbmQgc2V0dXAgYSBHUElPCisJICogaW50ZXJydXB0IGlmIGl0IGV4aXN0cy4gT3RoZXJ3aXNlIHVzZSB0aGUgSVJRIHByb3ZpZGVkIGJ5IEkyQworCSAqLwogCWlycSA9IGludGVsX3NvY19wbWljX2ZpbmRfZ3Bpb19pcnEoZGV2KTsKIAlwbWljLT5pcnEgPSAoaXJxIDwgMCkgPyBpMmMtPmlycSA6IGlycTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQva2VtcGxkLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2tlbXBsZC1jb3JlLmMKaW5kZXggZjM4ZWM0Mi4uODA1Nzg0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQva2VtcGxkLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9rZW1wbGQtY29yZS5jCkBAIC01MDgsOCArNTA4LDE1IEBACiAJCX0sCiAJCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopJmtlbXBsZF9wbGF0Zm9ybV9kYXRhX2dlbmVyaWMsCiAJCS5jYWxsYmFjayA9IGtlbXBsZF9jcmVhdGVfcGxhdGZvcm1fZGV2aWNlLAotCX0sCi0JeworCX0sIHsKKwkJLmlkZW50ID0gIkNCTDYiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiS29udHJvbiIpLAorCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiQ09NZS1jQkw2IiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICh2b2lkICopJmtlbXBsZF9wbGF0Zm9ybV9kYXRhX2dlbmVyaWMsCisJCS5jYWxsYmFjayA9IGtlbXBsZF9jcmVhdGVfcGxhdGZvcm1fZGV2aWNlLAorCX0sIHsKIAkJLmlkZW50ID0gIkNDUjIiLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiS29udHJvbiIpLApAQCAtNzM5LDcgKzc0Niw3IEBACiAJCWZvciAoaWQgPSBrZW1wbGRfZG1pX3RhYmxlOwogCQkgICAgIGlkLT5tYXRjaGVzWzBdLnNsb3QgIT0gRE1JX05PTkU7IGlkKyspCiAJCQlpZiAoc3Ryc3RyKGlkLT5pZGVudCwgZm9yY2VfZGV2aWNlX2lkKSkKLQkJCQlpZiAoaWQtPmNhbGxiYWNrICYmIGlkLT5jYWxsYmFjayhpZCkpCisJCQkJaWYgKGlkLT5jYWxsYmFjayAmJiAhaWQtPmNhbGxiYWNrKGlkKSkKIAkJCQkJYnJlYWs7CiAJCWlmIChpZC0+bWF0Y2hlc1swXS5zbG90ID09IERNSV9OT05FKQogCQkJcmV0dXJuIC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9scGNfaWNoLmMgYi9kcml2ZXJzL21mZC9scGNfaWNoLmMKaW5kZXggZjM1ZDQyOC4uMTJkOTYwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbHBjX2ljaC5jCisrKyBiL2RyaXZlcnMvbWZkL2xwY19pY2guYwpAQCAtNTM5LDcyICs1MzksNyBAQAogICogZnVuY3Rpb25zIHRoYXQgcHJvYmFibHkgd2lsbCBiZSByZWdpc3RlcmVkIGJ5IG90aGVyIGRyaXZlcnMuCiAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBscGNfaWNoX2lkc1tdID0gewotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjQxMCksIExQQ19JQ0h9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjQyMCksIExQQ19JQ0gwfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0NDApLCBMUENfSUNIMn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNDRjKSwgTFBDX0lDSDJNfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0ODApLCBMUENfSUNIM30sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNDhjKSwgTFBDX0lDSDNNfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0YzApLCBMUENfSUNINH0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNGNjKSwgTFBDX0lDSDRNfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0NTApLCBMUENfQ0lDSH0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNGQwKSwgTFBDX0lDSDV9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjVhMSksIExQQ182MzAwRVNCfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NDApLCBMUENfSUNINn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjQxKSwgTFBDX0lDSDZNfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NDIpLCBMUENfSUNINld9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3MCksIExQQ182MzFYRVNCfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzEpLCBMUENfNjMxWEVTQn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjcyKSwgTFBDXzYzMVhFU0J9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3MyksIExQQ182MzFYRVNCfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzQpLCBMUENfNjMxWEVTQn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjc1KSwgTFBDXzYzMVhFU0J9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3NiksIExQQ182MzFYRVNCfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzcpLCBMUENfNjMxWEVTQn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjc4KSwgTFBDXzYzMVhFU0J9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3OSksIExQQ182MzFYRVNCfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2N2EpLCBMUENfNjMxWEVTQn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjdiKSwgTFBDXzYzMVhFU0J9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3YyksIExQQ182MzFYRVNCfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2N2QpLCBMUENfNjMxWEVTQn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjdlKSwgTFBDXzYzMVhFU0J9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3ZiksIExQQ182MzFYRVNCfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI3YjgpLCBMUENfSUNIN30sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyN2IwKSwgTFBDX0lDSDdESH0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyN2I5KSwgTFBDX0lDSDdNfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI3YmQpLCBMUENfSUNIN01ESH0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyN2JjKSwgTFBDX05NMTB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjgxMCksIExQQ19JQ0g4fSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MTIpLCBMUENfSUNIOERIfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MTQpLCBMUENfSUNIOERPfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MTUpLCBMUENfSUNIOE19LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjgxMSksIExQQ19JQ0g4TUV9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkxOCksIExQQ19JQ0g5fSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MTYpLCBMUENfSUNIOVJ9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkxMiksIExQQ19JQ0g5REh9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkxNCksIExQQ19JQ0g5RE99LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkxOSksIExQQ19JQ0g5TX0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyOTE3KSwgTFBDX0lDSDlNRX0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYTE4KSwgTFBDX0lDSDEwfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNhMTYpLCBMUENfSUNIMTBSfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNhMWEpLCBMUENfSUNIMTBEfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNhMTQpLCBMUENfSUNIMTBET30sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjAwKSwgTFBDX1BDSH0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjAxKSwgTFBDX1BDSE19LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwMiksIExQQ19QNTV9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwMyksIExQQ19QTTU1fSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMDYpLCBMUENfSDU1fSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMDcpLCBMUENfUU01N30sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjA4KSwgTFBDX0g1N30sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjA5KSwgTFBDX0hNNTV9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwYSksIExQQ19RNTd9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwYiksIExQQ19ITTU3fSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMGQpLCBMUENfUENITVNGRn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjBmKSwgTFBDX1FTNTd9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IxMiksIExQQ18zNDAwfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMTQpLCBMUENfMzQyMH0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjE2KSwgTFBDXzM0NTB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4NTAzMSksIExQQ19FUDgwNTc5fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDBmMWMpLCBMUENfQkFZVFJBSUx9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWM0MSksIExQQ19DUFR9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWM0MiksIExQQ19DUFREfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNDMpLCBMUENfQ1BUTX0sCkBAIC02MzgsNyArNTczLDYgQEAKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNWYpLCBMUENfQ1BUfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFkNDApLCBMUENfUEJHfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFkNDEpLCBMUENfUEJHfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDIzMTApLCBMUENfREg4OVhYQ0N9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0MCksIExQQ19QUFR9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0MSksIExQQ19QUFR9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0MiksIExQQ19QUFR9LApAQCAtNjcxLDYgKzYwNSw3OSBAQAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1ZCksIExQQ19QUFR9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1ZSksIExQQ19QUFR9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1ZiksIExQQ19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWYzOCksIExQQ19BVk59LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWYzOSksIExQQ19BVk59LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWYzYSksIExQQ19BVk59LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWYzYiksIExQQ19BVk59LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjI5YyksIExQQ19CUkFTV0VMTH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyMzEwKSwgTFBDX0RIODlYWENDfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDIzOTApLCBMUENfQ09MRVRPfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0MTApLCBMUENfSUNIfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0MjApLCBMUENfSUNIMH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNDQwKSwgTFBDX0lDSDJ9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjQ0YyksIExQQ19JQ0gyTX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNDUwKSwgTFBDX0NJQ0h9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjQ4MCksIExQQ19JQ0gzfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0OGMpLCBMUENfSUNIM019LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjRjMCksIExQQ19JQ0g0fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0Y2MpLCBMUENfSUNINE19LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjRkMCksIExQQ19JQ0g1fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI1YTEpLCBMUENfNjMwMEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjQwKSwgTFBDX0lDSDZ9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY0MSksIExQQ19JQ0g2TX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjQyKSwgTFBDX0lDSDZXfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzApLCBMUENfNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjcxKSwgTFBDXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3MiksIExQQ182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzMpLCBMUENfNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjc0KSwgTFBDXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3NSksIExQQ182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzYpLCBMUENfNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjc3KSwgTFBDXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3OCksIExQQ182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzkpLCBMUENfNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjdhKSwgTFBDXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3YiksIExQQ182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2N2MpLCBMUENfNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjdkKSwgTFBDXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3ZSksIExQQ182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2N2YpLCBMUENfNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyN2IwKSwgTFBDX0lDSDdESH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyN2I4KSwgTFBDX0lDSDd9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjdiOSksIExQQ19JQ0g3TX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyN2JjKSwgTFBDX05NMTB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjdiZCksIExQQ19JQ0g3TURIfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MTApLCBMUENfSUNIOH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODExKSwgTFBDX0lDSDhNRX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODEyKSwgTFBDX0lDSDhESH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODE0KSwgTFBDX0lDSDhET30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODE1KSwgTFBDX0lDSDhNfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MTIpLCBMUENfSUNIOURIfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MTQpLCBMUENfSUNIOURPfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MTYpLCBMUENfSUNIOVJ9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkxNyksIExQQ19JQ0g5TUV9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkxOCksIExQQ19JQ0g5fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MTkpLCBMUENfSUNIOU19LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2ExNCksIExQQ19JQ0gxMERPfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNhMTYpLCBMUENfSUNIMTBSfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNhMTgpLCBMUENfSUNIMTB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2ExYSksIExQQ19JQ0gxMER9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwMCksIExQQ19QQ0h9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwMSksIExQQ19QQ0hNfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMDIpLCBMUENfUDU1fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMDMpLCBMUENfUE01NX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjA2KSwgTFBDX0g1NX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjA3KSwgTFBDX1FNNTd9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwOCksIExQQ19INTd9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwOSksIExQQ19ITTU1fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMGEpLCBMUENfUTU3fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMGIpLCBMUENfSE01N30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjBkKSwgTFBDX1BDSE1TRkZ9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwZiksIExQQ19RUzU3fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMTIpLCBMUENfMzQwMH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjE0KSwgTFBDXzM0MjB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IxNiksIExQQ18zNDUwfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDUwMzEpLCBMUENfRVA4MDU3OX0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg4YzQwKSwgTFBDX0xQVH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg4YzQxKSwgTFBDX0xQVH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg4YzQyKSwgTFBDX0xQVH0sCkBAIC03MDMsMTQgKzcxMCwxMSBAQAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OGM1ZCksIExQQ19MUFR9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OGM1ZSksIExQQ19MUFR9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OGM1ZiksIExQQ19MUFR9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OWM0MCksIExQQ19MUFRfTFB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OWM0MSksIExQQ19MUFRfTFB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OWM0MiksIExQQ19MUFRfTFB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OWM0MyksIExQQ19MUFRfTFB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OWM0NCksIExQQ19MUFRfTFB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OWM0NSksIExQQ19MUFRfTFB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OWM0NiksIExQQ19MUFRfTFB9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OWM0NyksIExQQ19MUFRfTFB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OGNjMSksIExQQ185U30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg4Y2MyKSwgTFBDXzlTfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDhjYzMpLCBMUENfOVN9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OGNjNCksIExQQ185U30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg4Y2M2KSwgTFBDXzlTfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDhkNDApLCBMUENfV0JHfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDhkNDEpLCBMUENfV0JHfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDhkNDIpLCBMUENfV0JHfSwKQEAgLTc0MywxMiArNzQ3LDE0IEBACiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg4ZDVkKSwgTFBDX1dCR30sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg4ZDVlKSwgTFBDX1dCR30sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg4ZDVmKSwgTFBDX1dCR30sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxZjM4KSwgTFBDX0FWTn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxZjM5KSwgTFBDX0FWTn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxZjNhKSwgTFBDX0FWTn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxZjNiKSwgTFBDX0FWTn0sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgwZjFjKSwgTFBDX0JBWVRSQUlMfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDIzOTApLCBMUENfQ09MRVRPfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljNDApLCBMUENfTFBUX0xQfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljNDEpLCBMUENfTFBUX0xQfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljNDIpLCBMUENfTFBUX0xQfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljNDMpLCBMUENfTFBUX0xQfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljNDQpLCBMUENfTFBUX0xQfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljNDUpLCBMUENfTFBUX0xQfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljNDYpLCBMUENfTFBUX0xQfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljNDcpLCBMUENfTFBUX0xQfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljYzEpLCBMUENfV1BUX0xQfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljYzIpLCBMUENfV1BUX0xQfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljYzMpLCBMUENfV1BUX0xQfSwKQEAgLTc1NiwxMiArNzYyLDYgQEAKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljYzYpLCBMUENfV1BUX0xQfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljYzcpLCBMUENfV1BUX0xQfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCAweDljYzkpLCBMUENfV1BUX0xQfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDIyOWMpLCBMUENfQlJBU1dFTEx9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OGNjMSksIExQQ185U30sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg4Y2MyKSwgTFBDXzlTfSwKLQl7IFBDSV9WREVWSUNFKElOVEVMLCAweDhjYzMpLCBMUENfOVN9LAotCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4OGNjNCksIExQQ185U30sCi0JeyBQQ0lfVkRFVklDRShJTlRFTCwgMHg4Y2M2KSwgTFBDXzlTfSwKIAl7IDAsIH0sCQkJLyogRW5kIG9mIGxpc3QgKi8KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgbHBjX2ljaF9pZHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWF4Nzc2OTMuYyBiL2RyaXZlcnMvbWZkL21heDc3NjkzLmMKaW5kZXggYTE1OTU5My4uY2IxNGFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWF4Nzc2OTMuYworKysgYi9kcml2ZXJzL21mZC9tYXg3NzY5My5jCkBAIC01Myw4ICs1Myw4IEBACiAJCS5vZl9jb21wYXRpYmxlID0gIm1heGltLG1heDc3NjkzLWhhcHRpYyIsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIm1heDc3NjkzLWZsYXNoIiwKLQkJLm9mX2NvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc2OTMtZmxhc2giLAorCQkubmFtZSA9ICJtYXg3NzY5My1sZWQiLAorCQkub2ZfY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg3NzY5My1sZWQiLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tYXg3Nzg0My5jIGIvZHJpdmVycy9tZmQvbWF4Nzc4NDMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzU0YWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvbWF4Nzc4NDMuYwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIE1GRCBjb3JlIGRyaXZlciBmb3IgdGhlIE1heGltIE1BWDc3ODQzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIEF1dGhvcjogSmFld29uIEtpbSA8amFld29uMDIua2ltQHNhbXN1bmcuY29tPgorICogQXV0aG9yOiBCZW9taG8gU2VvIDxiZW9taG8uc2VvQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg3Nzg0My1wcml2YXRlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWZkX2NlbGwgbWF4Nzc4NDNfZGV2c1tdID0geworCXsKKwkJLm5hbWUgPSAibWF4Nzc4NDMtbXVpYyIsCisJCS5vZl9jb21wYXRpYmxlID0gIm1heGltLG1heDc3ODQzLW11aWMiLAorCX0sIHsKKwkJLm5hbWUgPSAibWF4Nzc4NDMtcmVndWxhdG9yIiwKKwkJLm9mX2NvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc4NDMtcmVndWxhdG9yIiwKKwl9LCB7CisJCS5uYW1lID0gIm1heDc3ODQzLWNoYXJnZXIiLAorCQkub2ZfY29tcGF0aWJsZSA9ICJtYXhpbSxtYXg3Nzg0My1jaGFyZ2VyIgorCX0sIHsKKwkJLm5hbWUgPSAibWF4Nzc4NDMtZnVlbGdhdWdlIiwKKwkJLm9mX2NvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc4NDMtZnVlbGdhdWdlIiwKKwl9LCB7CisJCS5uYW1lID0gIm1heDc3ODQzLWhhcHRpYyIsCisJCS5vZl9jb21wYXRpYmxlID0gIm1heGltLG1heDc3ODQzLWhhcHRpYyIsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBtYXg3Nzg0M19jaGFyZ2VyX3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzCT0gOCwKKwkudmFsX2JpdHMJPSA4LAorCS5tYXhfcmVnaXN0ZXIJPSBNQVg3Nzg0M19DSEdfUkVHX0VORCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBtYXg3Nzg0M19yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cwk9IDgsCisJLnZhbF9iaXRzCT0gOCwKKwkubWF4X3JlZ2lzdGVyCT0gTUFYNzc4NDNfU1lTX1JFR19FTkQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9pcnEgbWF4Nzc4NDNfaXJxc1tdID0geworCS8qIFRPUFNZUyBpbnRlcnJ1cHRzICovCisJeyAucmVnX29mZnNldCA9IDAsIC5tYXNrID0gTUFYNzc4NDNfU1lTX0lSUV9TWVNVVkxPX0lOVCwgfSwKKwl7IC5yZWdfb2Zmc2V0ID0gMCwgLm1hc2sgPSBNQVg3Nzg0M19TWVNfSVJRX1NZU09WTE9fSU5ULCB9LAorCXsgLnJlZ19vZmZzZXQgPSAwLCAubWFzayA9IE1BWDc3ODQzX1NZU19JUlFfVFNIRE5fSU5ULCB9LAorCXsgLnJlZ19vZmZzZXQgPSAwLCAubWFzayA9IE1BWDc3ODQzX1NZU19JUlFfVE1fSU5ULCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfaXJxX2NoaXAgbWF4Nzc4NDNfaXJxX2NoaXAgPSB7CisJLm5hbWUJCT0gIm1heDc3ODQzIiwKKwkuc3RhdHVzX2Jhc2UJPSBNQVg3Nzg0M19TWVNfUkVHX1NZU0lOVFNSQywKKwkubWFza19iYXNlCT0gTUFYNzc4NDNfU1lTX1JFR19TWVNJTlRNQVNLLAorCS5tYXNrX2ludmVydAk9IGZhbHNlLAorCS5udW1fcmVncwk9IDEsCisJLmlycXMJCT0gbWF4Nzc4NDNfaXJxcywKKwkubnVtX2lycXMJPSBBUlJBWV9TSVpFKG1heDc3ODQzX2lycXMpLAorfTsKKworLyogQ2hhcmdlciBhbmQgQ2hhcmdlciByZWd1bGF0b3IgdXNlIHNhbWUgcmVnbWFwLiAqLworc3RhdGljIGludCBtYXg3Nzg0M19jaGdfaW5pdChzdHJ1Y3QgbWF4Nzc4NDMgKm1heDc3ODQzKQoreworCWludCByZXQ7CisKKwltYXg3Nzg0My0+aTJjX2NoZyA9IGkyY19uZXdfZHVtbXkobWF4Nzc4NDMtPmkyYy0+YWRhcHRlciwgSTJDX0FERFJfQ0hHKTsKKwlpZiAoIW1heDc3ODQzLT5pMmNfY2hnKSB7CisJCWRldl9lcnIoJm1heDc3ODQzLT5pMmMtPmRldiwKKwkJCQkiQ2Fubm90IGFsbG9jYXRlIEkyQyBkZXZpY2UgZm9yIENoYXJnZXJcbiIpOworCQlyZXR1cm4gUFRSX0VSUihtYXg3Nzg0My0+aTJjX2NoZyk7CisJfQorCWkyY19zZXRfY2xpZW50ZGF0YShtYXg3Nzg0My0+aTJjX2NoZywgbWF4Nzc4NDMpOworCisJbWF4Nzc4NDMtPnJlZ21hcF9jaGcgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhtYXg3Nzg0My0+aTJjX2NoZywKKwkJCSZtYXg3Nzg0M19jaGFyZ2VyX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIobWF4Nzc4NDMtPnJlZ21hcF9jaGcpKSB7CisJCXJldCA9IFBUUl9FUlIobWF4Nzc4NDMtPnJlZ21hcF9jaGcpOworCQlnb3RvIGVycl9jaGdfaTJjOworCX0KKworCXJldHVybiAwOworCitlcnJfY2hnX2kyYzoKKwlpMmNfdW5yZWdpc3Rlcl9kZXZpY2UobWF4Nzc4NDMtPmkyY19jaGcpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtYXg3Nzg0M19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAorCQkJICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG1heDc3ODQzICptYXg3Nzg0MzsKKwl1bnNpZ25lZCBpbnQgcmVnX2RhdGE7CisJaW50IHJldDsKKworCW1heDc3ODQzID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mKCptYXg3Nzg0MyksIEdGUF9LRVJORUwpOworCWlmICghbWF4Nzc4NDMpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgbWF4Nzc4NDMpOworCW1heDc3ODQzLT5kZXYgPSAmaTJjLT5kZXY7CisJbWF4Nzc4NDMtPmkyYyA9IGkyYzsKKwltYXg3Nzg0My0+aXJxID0gaTJjLT5pcnE7CisKKwltYXg3Nzg0My0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLAorCQkJJm1heDc3ODQzX3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIobWF4Nzc4NDMtPnJlZ21hcCkpIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgdG9wc3lzIHJlZ2lzdGVyIG1hcFxuIik7CisJCXJldHVybiBQVFJfRVJSKG1heDc3ODQzLT5yZWdtYXApOworCX0KKworCXJldCA9IHJlZ21hcF9hZGRfaXJxX2NoaXAobWF4Nzc4NDMtPnJlZ21hcCwgbWF4Nzc4NDMtPmlycSwKKwkJCUlSUUZfVFJJR0dFUl9MT1cgfCBJUlFGX09ORVNIT1QgfCBJUlFGX1NIQVJFRCwKKwkJCTAsICZtYXg3Nzg0M19pcnFfY2hpcCwgJm1heDc3ODQzLT5pcnFfZGF0YSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBhZGQgVE9QU1lTIElSUSBjaGlwXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWdtYXBfcmVhZChtYXg3Nzg0My0+cmVnbWFwLAorCQkJTUFYNzc4NDNfU1lTX1JFR19QTUlDSUQsICZyZWdfZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaTJjLT5kZXYsICJGYWlsZWQgdG8gcmVhZCBQTUlDIElEXG4iKTsKKwkJZ290byBlcnJfcG1pY19pZDsKKwl9CisJZGV2X2luZm8oJmkyYy0+ZGV2LCAiZGV2aWNlIElEOiAweCV4XG4iLCByZWdfZGF0YSk7CisKKwlyZXQgPSBtYXg3Nzg0M19jaGdfaW5pdChtYXg3Nzg0Myk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBpbml0IENoYXJnZXJcbiIpOworCQlnb3RvIGVycl9wbWljX2lkOworCX0KKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhtYXg3Nzg0My0+cmVnbWFwLAorCQkJCSBNQVg3Nzg0M19TWVNfUkVHX0lOVFNSQ01BU0ssCisJCQkJIE1BWDc3ODQzX0lOVFNSQ19NQVNLX01BU0ssCisJCQkJICh1bnNpZ25lZCBpbnQpfk1BWDc3ODQzX0lOVFNSQ19NQVNLX01BU0spOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiRmFpbGVkIHRvIHVubWFzayBpbnRlcnJ1cHQgc291cmNlXG4iKTsKKwkJZ290byBlcnJfcG1pY19pZDsKKwl9CisKKwlyZXQgPSBtZmRfYWRkX2RldmljZXMobWF4Nzc4NDMtPmRldiwgLTEsIG1heDc3ODQzX2RldnMsCisJCQkgICAgICBBUlJBWV9TSVpFKG1heDc3ODQzX2RldnMpLCBOVUxMLCAwLCBOVUxMKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBhZGQgbWZkIGRldmljZVxuIik7CisJCWdvdG8gZXJyX3BtaWNfaWQ7CisJfQorCisJZGV2aWNlX2luaXRfd2FrZXVwKG1heDc3ODQzLT5kZXYsIHRydWUpOworCisJcmV0dXJuIDA7CisKK2Vycl9wbWljX2lkOgorCXJlZ21hcF9kZWxfaXJxX2NoaXAobWF4Nzc4NDMtPmlycSwgbWF4Nzc4NDMtPmlycV9kYXRhKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4Nzc4NDNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCit7CisJc3RydWN0IG1heDc3ODQzICptYXg3Nzg0MyA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmMpOworCisJbWZkX3JlbW92ZV9kZXZpY2VzKG1heDc3ODQzLT5kZXYpOworCisJcmVnbWFwX2RlbF9pcnFfY2hpcChtYXg3Nzg0My0+aXJxLCBtYXg3Nzg0My0+aXJxX2RhdGEpOworCisJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKG1heDc3ODQzLT5pMmNfY2hnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtYXg3Nzg0M19kdF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibWF4aW0sbWF4Nzc4NDMiLCB9LAorCXsgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtYXg3Nzg0M19pZFtdID0geworCXsgIm1heDc3ODQzIiwgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1heDc3ODQzX2lkKTsKKworc3RhdGljIGludCBfX21heWJlX3VudXNlZCBtYXg3Nzg0M19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGkyY19jbGllbnQsIGRldik7CisJc3RydWN0IG1heDc3ODQzICptYXg3Nzg0MyA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmMpOworCisJZGlzYWJsZV9pcnEobWF4Nzc4NDMtPmlycSk7CisJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikpCisJCWVuYWJsZV9pcnFfd2FrZShtYXg3Nzg0My0+aXJxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbWF5YmVfdW51c2VkIG1heDc3ODQzX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBpMmNfY2xpZW50LCBkZXYpOworCXN0cnVjdCBtYXg3Nzg0MyAqbWF4Nzc4NDMgPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjKTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKG1heDc3ODQzLT5pcnEpOworCWVuYWJsZV9pcnEobWF4Nzc4NDMtPmlycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG1heDc3ODQzX3BtLCBtYXg3Nzg0M19zdXNwZW5kLCBtYXg3Nzg0M19yZXN1bWUpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4Nzc4NDNfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZSA9ICJtYXg3Nzg0MyIsCisJCS5wbSA9ICZtYXg3Nzg0M19wbSwKKwkJLm9mX21hdGNoX3RhYmxlID0gbWF4Nzc4NDNfZHRfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSBtYXg3Nzg0M19wcm9iZSwKKwkucmVtb3ZlID0gbWF4Nzc4NDNfcmVtb3ZlLAorCS5pZF90YWJsZSA9IG1heDc3ODQzX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWF4Nzc4NDNfaTJjX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJm1heDc3ODQzX2kyY19kcml2ZXIpOworfQorc3Vic3lzX2luaXRjYWxsKG1heDc3ODQzX2kyY19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1heDc3ODQzX2kyY19leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJm1heDc3ODQzX2kyY19kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobWF4Nzc4NDNfaTJjX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvbWMxM3h4eC1jb3JlLmMgYi9kcml2ZXJzL21mZC9tYzEzeHh4LWNvcmUuYwppbmRleCA2NGRkZTVkLi4yNWZkNzExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9tYzEzeHh4LWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9tYzEzeHh4LWNvcmUuYwpAQCAtNTEsMTkgKzUxLDE5IEBACiB2b2lkIG1jMTN4eHhfbG9jayhzdHJ1Y3QgbWMxM3h4eCAqbWMxM3h4eCkKIHsKIAlpZiAoIW11dGV4X3RyeWxvY2soJm1jMTN4eHgtPmxvY2spKSB7Ci0JCWRldl9kYmcobWMxM3h4eC0+ZGV2LCAid2FpdCBmb3IgJXMgZnJvbSAlcGZcbiIsCisJCWRldl9kYmcobWMxM3h4eC0+ZGV2LCAid2FpdCBmb3IgJXMgZnJvbSAlcHNcbiIsCiAJCQkJX19mdW5jX18sIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAKIAkJbXV0ZXhfbG9jaygmbWMxM3h4eC0+bG9jayk7CiAJfQotCWRldl9kYmcobWMxM3h4eC0+ZGV2LCAiJXMgZnJvbSAlcGZcbiIsCisJZGV2X2RiZyhtYzEzeHh4LT5kZXYsICIlcyBmcm9tICVwc1xuIiwKIAkJCV9fZnVuY19fLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogfQogRVhQT1JUX1NZTUJPTChtYzEzeHh4X2xvY2spOwogCiB2b2lkIG1jMTN4eHhfdW5sb2NrKHN0cnVjdCBtYzEzeHh4ICptYzEzeHh4KQogewotCWRldl9kYmcobWMxM3h4eC0+ZGV2LCAiJXMgZnJvbSAlcGZcbiIsCisJZGV2X2RiZyhtYzEzeHh4LT5kZXYsICIlcyBmcm9tICVwc1xuIiwKIAkJCV9fZnVuY19fLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOwogCW11dGV4X3VubG9jaygmbWMxM3h4eC0+bG9jayk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tZW5lbGF1cy5jIGIvZHJpdmVycy9tZmQvbWVuZWxhdXMuYwppbmRleCA5ZjAxYWVmLi4zYWMzNmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9tZW5lbGF1cy5jCisrKyBiL2RyaXZlcnMvbWZkL21lbmVsYXVzLmMKQEAgLTUzMiwyOSArNTMyLDYgQEAKIAl7IDE0NTAsIDE4IH0sCiB9OwogCi1pbnQgbWVuZWxhdXNfc2V0X3Zjb3JlX3N3KHVuc2lnbmVkIGludCBtVikKLXsKLQlpbnQgdmFsLCByZXQ7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmMgPSB0aGVfbWVuZWxhdXMtPmNsaWVudDsKLQotCXZhbCA9IG1lbmVsYXVzX2dldF92dGdfdmFsdWUobVYsIHZjb3JlX3ZhbHVlcywKLQkJCQkgICAgIEFSUkFZX1NJWkUodmNvcmVfdmFsdWVzKSk7Ci0JaWYgKHZhbCA8IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2X2RiZygmYy0+ZGV2LCAiU2V0dGluZyBWQ09SRSB0byAlZCBtViAodmFsIDB4JTAyeClcbiIsIG1WLCB2YWwpOwotCi0JLyogU2V0IFNXIG1vZGUgYW5kIHRoZSB2b2x0YWdlIGluIG9uZSBnby4gKi8KLQltdXRleF9sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOwotCXJldCA9IG1lbmVsYXVzX3dyaXRlX3JlZyhNRU5FTEFVU19WQ09SRV9DVFJMMSwgdmFsKTsKLQlpZiAocmV0ID09IDApCi0JCXRoZV9tZW5lbGF1cy0+dmNvcmVfaHdfbW9kZSA9IDA7Ci0JbXV0ZXhfdW5sb2NrKCZ0aGVfbWVuZWxhdXMtPmxvY2spOwotCW1zbGVlcCgxKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIGludCBtZW5lbGF1c19zZXRfdmNvcmVfaHcodW5zaWduZWQgaW50IHJvb2ZfbVYsIHVuc2lnbmVkIGludCBmbG9vcl9tVikKIHsKIAlpbnQgZnZhbCwgcnZhbCwgdmFsLCByZXQ7CkBAIC0xMjM5LDcgKzEyMTYsNyBAQAogCWVyciA9IG1lbmVsYXVzX3JlYWRfcmVnKE1FTkVMQVVTX1ZDT1JFX0NUUkwxKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBmYWlsOwotCWlmIChlcnIgJiBCSVQoNykpCisJaWYgKGVyciAmIFZDT1JFX0NUUkwxX0hXX05TVykKIAkJbWVuZWxhdXMtPnZjb3JlX2h3X21vZGUgPSAxOwogCWVsc2UKIAkJbWVuZWxhdXMtPnZjb3JlX2h3X21vZGUgPSAwOwpAQCAtMTI1OSw3ICsxMjM2LDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCBtZW5lbGF1c19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgbWVuZWxhdXNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IG1lbmVsYXVzX2NoaXAJKm1lbmVsYXVzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKQEAgLTEyODAsNyArMTI1Nyw3IEBACiAJCS5uYW1lCQk9IERSSVZFUl9OQU1FLAogCX0sCiAJLnByb2JlCQk9IG1lbmVsYXVzX3Byb2JlLAotCS5yZW1vdmUJCT0gX19leGl0X3AobWVuZWxhdXNfcmVtb3ZlKSwKKwkucmVtb3ZlCQk9IG1lbmVsYXVzX3JlbW92ZSwKIAkuaWRfdGFibGUJPSBtZW5lbGF1c19pZCwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL21mZC1jb3JlLmMgYi9kcml2ZXJzL21mZC9tZmQtY29yZS5jCmluZGV4IDJhODdmNjkuLjFhZWQzYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL21mZC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvbWZkLWNvcmUuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJaW50IHBsYXRmb3JtX2lkOwogCWludCByOwogCi0JaWYgKGlkIDwgMCkKKwlpZiAoaWQgPT0gUExBVEZPUk1fREVWSURfQVVUTykKIAkJcGxhdGZvcm1faWQgPSBpZDsKIAllbHNlCiAJCXBsYXRmb3JtX2lkID0gaWQgKyBjZWxsLT5pZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL210NjM5Ny1jb3JlLmMgYi9kcml2ZXJzL21mZC9tdDYzOTctY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YmM3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9tdDYzOTctY29yZS5jCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IE1lZGlhVGVrIEluYy4KKyAqIEF1dGhvcjogRmxvcmEgRnUsIE1lZGlhVGVrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tdDYzOTcvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tdDYzOTcvcmVnaXN0ZXJzLmg+CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWZkX2NlbGwgbXQ2Mzk3X2RldnNbXSA9IHsKKwl7CisJCS5uYW1lID0gIm10NjM5Ny1ydGMiLAorCQkub2ZfY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDYzOTctcnRjIiwKKwl9LCB7CisJCS5uYW1lID0gIm10NjM5Ny1yZWd1bGF0b3IiLAorCQkub2ZfY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDYzOTctcmVndWxhdG9yIiwKKwl9LCB7CisJCS5uYW1lID0gIm10NjM5Ny1jb2RlYyIsCisJCS5vZl9jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10NjM5Ny1jb2RlYyIsCisJfSwgeworCQkubmFtZSA9ICJtdDYzOTctY2xrIiwKKwkJLm9mX2NvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ2Mzk3LWNsayIsCisJfSwKK307CisKK3N0YXRpYyB2b2lkIG10NjM5N19pcnFfbG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IG10NjM5N19jaGlwICptdDYzOTcgPSBpcnFfZ2V0X2NoaXBfZGF0YShkYXRhLT5pcnEpOworCisJbXV0ZXhfbG9jaygmbXQ2Mzk3LT5pcnFsb2NrKTsKK30KKworc3RhdGljIHZvaWQgbXQ2Mzk3X2lycV9zeW5jX3VubG9jayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IG10NjM5N19jaGlwICptdDYzOTcgPSBpcnFfZ2V0X2NoaXBfZGF0YShkYXRhLT5pcnEpOworCisJcmVnbWFwX3dyaXRlKG10NjM5Ny0+cmVnbWFwLCBNVDYzOTdfSU5UX0NPTjAsIG10NjM5Ny0+aXJxX21hc2tzX2N1clswXSk7CisJcmVnbWFwX3dyaXRlKG10NjM5Ny0+cmVnbWFwLCBNVDYzOTdfSU5UX0NPTjEsIG10NjM5Ny0+aXJxX21hc2tzX2N1clsxXSk7CisKKwltdXRleF91bmxvY2soJm10NjM5Ny0+aXJxbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIG10NjM5N19pcnFfZGlzYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IG10NjM5N19jaGlwICptdDYzOTcgPSBpcnFfZ2V0X2NoaXBfZGF0YShkYXRhLT5pcnEpOworCWludCBzaGlmdCA9IGRhdGEtPmh3aXJxICYgMHhmOworCWludCByZWcgPSBkYXRhLT5od2lycSA+PiA0OworCisJbXQ2Mzk3LT5pcnFfbWFza3NfY3VyW3JlZ10gJj0gfkJJVChzaGlmdCk7Cit9CisKK3N0YXRpYyB2b2lkIG10NjM5N19pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgbXQ2Mzk3X2NoaXAgKm10NjM5NyA9IGlycV9nZXRfY2hpcF9kYXRhKGRhdGEtPmlycSk7CisJaW50IHNoaWZ0ID0gZGF0YS0+aHdpcnEgJiAweGY7CisJaW50IHJlZyA9IGRhdGEtPmh3aXJxID4+IDQ7CisKKwltdDYzOTctPmlycV9tYXNrc19jdXJbcmVnXSB8PSBCSVQoc2hpZnQpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG10NjM5N19pcnFfY2hpcCA9IHsKKwkubmFtZSA9ICJtdDYzOTctaXJxIiwKKwkuaXJxX2J1c19sb2NrID0gbXQ2Mzk3X2lycV9sb2NrLAorCS5pcnFfYnVzX3N5bmNfdW5sb2NrID0gbXQ2Mzk3X2lycV9zeW5jX3VubG9jaywKKwkuaXJxX2VuYWJsZSA9IG10NjM5N19pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZSA9IG10NjM5N19pcnFfZGlzYWJsZSwKK307CisKK3N0YXRpYyB2b2lkIG10NjM5N19pcnFfaGFuZGxlX3JlZyhzdHJ1Y3QgbXQ2Mzk3X2NoaXAgKm10NjM5NywgaW50IHJlZywKKwkJaW50IGlycWJhc2UpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwlpbnQgaSwgaXJxLCByZXQ7CisKKwlyZXQgPSByZWdtYXBfcmVhZChtdDYzOTctPnJlZ21hcCwgcmVnLCAmc3RhdHVzKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIobXQ2Mzk3LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBpcnEgc3RhdHVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWlmIChzdGF0dXMgJiBCSVQoaSkpIHsKKwkJCWlycSA9IGlycV9maW5kX21hcHBpbmcobXQ2Mzk3LT5pcnFfZG9tYWluLCBpcnFiYXNlICsgaSk7CisJCQlpZiAoaXJxKQorCQkJCWhhbmRsZV9uZXN0ZWRfaXJxKGlycSk7CisJCX0KKwl9CisKKwlyZWdtYXBfd3JpdGUobXQ2Mzk3LT5yZWdtYXAsIHJlZywgc3RhdHVzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG10NjM5N19pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG10NjM5N19jaGlwICptdDYzOTcgPSBkYXRhOworCisJbXQ2Mzk3X2lycV9oYW5kbGVfcmVnKG10NjM5NywgTVQ2Mzk3X0lOVF9TVEFUVVMwLCAwKTsKKwltdDYzOTdfaXJxX2hhbmRsZV9yZWcobXQ2Mzk3LCBNVDYzOTdfSU5UX1NUQVRVUzEsIDE2KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBtdDYzOTdfaXJxX2RvbWFpbl9tYXAoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGludCBpcnEsCisJCQkJCWlycV9od19udW1iZXJfdCBodykKK3sKKwlzdHJ1Y3QgbXQ2Mzk3X2NoaXAgKm10NjM5NyA9IGQtPmhvc3RfZGF0YTsKKworCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgbXQ2Mzk3KTsKKwlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaXJxLCAmbXQ2Mzk3X2lycV9jaGlwLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwlpcnFfc2V0X25lc3RlZF90aHJlYWQoaXJxLCAxKTsKKyNpZmRlZiBDT05GSUdfQVJNCisJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOworI2Vsc2UKKwlpcnFfc2V0X25vcHJvYmUoaXJxKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgbXQ2Mzk3X2lycV9kb21haW5fb3BzID0geworCS5tYXAgPSBtdDYzOTdfaXJxX2RvbWFpbl9tYXAsCit9OworCitzdGF0aWMgaW50IG10NjM5N19pcnFfaW5pdChzdHJ1Y3QgbXQ2Mzk3X2NoaXAgKm10NjM5NykKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfaW5pdCgmbXQ2Mzk3LT5pcnFsb2NrKTsKKworCS8qIE1hc2sgYWxsIGludGVycnVwdCBzb3VyY2VzICovCisJcmVnbWFwX3dyaXRlKG10NjM5Ny0+cmVnbWFwLCBNVDYzOTdfSU5UX0NPTjAsIDB4MCk7CisJcmVnbWFwX3dyaXRlKG10NjM5Ny0+cmVnbWFwLCBNVDYzOTdfSU5UX0NPTjEsIDB4MCk7CisKKwltdDYzOTctPmlycV9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIobXQ2Mzk3LT5kZXYtPm9mX25vZGUsCisJCU1UNjM5N19JUlFfTlIsICZtdDYzOTdfaXJxX2RvbWFpbl9vcHMsIG10NjM5Nyk7CisJaWYgKCFtdDYzOTctPmlycV9kb21haW4pIHsKKwkJZGV2X2VycihtdDYzOTctPmRldiwgImNvdWxkIG5vdCBjcmVhdGUgaXJxIGRvbWFpblxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEobXQ2Mzk3LT5kZXYsIG10NjM5Ny0+aXJxLCBOVUxMLAorCQltdDYzOTdfaXJxX3RocmVhZCwgSVJRRl9PTkVTSE9ULCAibXQ2Mzk3LXBtaWMiLCBtdDYzOTcpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihtdDYzOTctPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBpcnE9JWQ7IGVycjogJWRcbiIsCisJCQltdDYzOTctPmlycSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdDYzOTdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBtdDYzOTdfY2hpcCAqbXQ2Mzk3OworCisJbXQ2Mzk3ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbXQ2Mzk3KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdDYzOTcpCisJCXJldHVybiAtRU5PTUVNOworCisJbXQ2Mzk3LT5kZXYgPSAmcGRldi0+ZGV2OworCS8qCisJICogbXQ2Mzk3IE1GRCBpcyBjaGlsZCBkZXZpY2Ugb2Ygc29jIHBtaWMgd3JhcHBlci4KKwkgKiBSZWdtYXAgaXMgc2V0IGZyb20gaXRzIHBhcmVudC4KKwkgKi8KKwltdDYzOTctPnJlZ21hcCA9IGRldl9nZXRfcmVnbWFwKHBkZXYtPmRldi5wYXJlbnQsIE5VTEwpOworCWlmICghbXQ2Mzk3LT5yZWdtYXApCisJCXJldHVybiAtRU5PREVWOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbXQ2Mzk3KTsKKworCW10NjM5Ny0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAobXQ2Mzk3LT5pcnEgPiAwKSB7CisJCXJldCA9IG10NjM5N19pcnFfaW5pdChtdDYzOTcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBtZmRfYWRkX2RldmljZXMoJnBkZXYtPmRldiwgLTEsIG10NjM5N19kZXZzLAorCQkJQVJSQVlfU0laRShtdDYzOTdfZGV2cyksIE5VTEwsIDAsIE5VTEwpOworCWlmIChyZXQpCisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhZGQgY2hpbGQgZGV2aWNlczogJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10NjM5N19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwltZmRfcmVtb3ZlX2RldmljZXMoJnBkZXYtPmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXQ2Mzk3X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDYzOTciIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXQ2Mzk3X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXQ2Mzk3X2RyaXZlciA9IHsKKwkucHJvYmUgPSBtdDYzOTdfcHJvYmUsCisJLnJlbW92ZSA9IG10NjM5N19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibXQ2Mzk3IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG10NjM5N19vZl9tYXRjaCksCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXQ2Mzk3X2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkZsb3JhIEZ1LCBNZWRpYVRlayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIE1lZGlhVGVrIE1UNjM5NyBQTUlDIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm10NjM5NyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcWNvbS1zcG1pLXBtaWMuYyBiL2RyaXZlcnMvbWZkL3Fjb20tc3BtaS1wbWljLmMKaW5kZXggNGI4YmViMi4uYWY2YWMxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvcWNvbS1zcG1pLXBtaWMuYworKysgYi9kcml2ZXJzL21mZC9xY29tLXNwbWktcG1pYy5jCkBAIC0xNyw2ICsxNywxMDAgQEAKICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogCisjZGVmaW5lIFBNSUNfUkVWMgkJMHgxMDEKKyNkZWZpbmUgUE1JQ19SRVYzCQkweDEwMgorI2RlZmluZSBQTUlDX1JFVjQJCTB4MTAzCisjZGVmaW5lIFBNSUNfVFlQRQkJMHgxMDQKKyNkZWZpbmUgUE1JQ19TVUJUWVBFCQkweDEwNQorCisjZGVmaW5lIFBNSUNfVFlQRV9WQUxVRQkJMHg1MQorCisjZGVmaW5lIENPTU1PTl9TVUJUWVBFCQkweDAwCisjZGVmaW5lIFBNODk0MV9TVUJUWVBFCQkweDAxCisjZGVmaW5lIFBNODg0MV9TVUJUWVBFCQkweDAyCisjZGVmaW5lIFBNODAxOV9TVUJUWVBFCQkweDAzCisjZGVmaW5lIFBNODIyNl9TVUJUWVBFCQkweDA0CisjZGVmaW5lIFBNODExMF9TVUJUWVBFCQkweDA1CisjZGVmaW5lIFBNQTgwODRfU1VCVFlQRQkJMHgwNgorI2RlZmluZSBQTUk4OTYyX1NVQlRZUEUJCTB4MDcKKyNkZWZpbmUgUE1EOTYzNV9TVUJUWVBFCQkweDA4CisjZGVmaW5lIFBNODk5NF9TVUJUWVBFCQkweDA5CisjZGVmaW5lIFBNSTg5OTRfU1VCVFlQRQkJMHgwYQorI2RlZmluZSBQTTg5MTZfU1VCVFlQRQkJMHgwYgorI2RlZmluZSBQTTgwMDRfU1VCVFlQRQkJMHgwYworI2RlZmluZSBQTTg5MDlfU1VCVFlQRQkJMHgwZAorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwbWljX3NwbWlfaWRfdGFibGVbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20sc3BtaS1wbWljIiwgLmRhdGEgPSAodm9pZCAqKUNPTU1PTl9TVUJUWVBFIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODk0MSIsICAgIC5kYXRhID0gKHZvaWQgKilQTTg5NDFfU1VCVFlQRSB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbTg4NDEiLCAgICAuZGF0YSA9ICh2b2lkICopUE04ODQxX1NVQlRZUEUgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20scG04MDE5IiwgICAgLmRhdGEgPSAodm9pZCAqKVBNODAxOV9TVUJUWVBFIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODIyNiIsICAgIC5kYXRhID0gKHZvaWQgKilQTTgyMjZfU1VCVFlQRSB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbTgxMTAiLCAgICAuZGF0YSA9ICh2b2lkICopUE04MTEwX1NVQlRZUEUgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20scG1hODA4NCIsICAgLmRhdGEgPSAodm9pZCAqKVBNQTgwODRfU1VCVFlQRSB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbWk4OTYyIiwgICAuZGF0YSA9ICh2b2lkICopUE1JODk2Ml9TVUJUWVBFIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtZDk2MzUiLCAgIC5kYXRhID0gKHZvaWQgKilQTUQ5NjM1X1NVQlRZUEUgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20scG04OTk0IiwgICAgLmRhdGEgPSAodm9pZCAqKVBNODk5NF9TVUJUWVBFIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtaTg5OTQiLCAgIC5kYXRhID0gKHZvaWQgKilQTUk4OTk0X1NVQlRZUEUgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20scG04OTE2IiwgICAgLmRhdGEgPSAodm9pZCAqKVBNODkxNl9TVUJUWVBFIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODAwNCIsICAgIC5kYXRhID0gKHZvaWQgKilQTTgwMDRfU1VCVFlQRSB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbTg5MDkiLCAgICAuZGF0YSA9ICh2b2lkICopUE04OTA5X1NVQlRZUEUgfSwKKwl7IH0KK307CisKK3N0YXRpYyB2b2lkIHBtaWNfc3BtaV9zaG93X3JldmlkKHN0cnVjdCByZWdtYXAgKm1hcCwgc3RydWN0IGRldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGludCByZXYyLCBtaW5vciwgbWFqb3IsIHR5cGUsIHN1YnR5cGU7CisJY29uc3QgY2hhciAqbmFtZSA9ICJ1bmtub3duIjsKKwlpbnQgcmV0LCBpOworCisJcmV0ID0gcmVnbWFwX3JlYWQobWFwLCBQTUlDX1RZUEUsICZ0eXBlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuOworCisJaWYgKHR5cGUgIT0gUE1JQ19UWVBFX1ZBTFVFKQorCQlyZXR1cm47CisKKwlyZXQgPSByZWdtYXBfcmVhZChtYXAsIFBNSUNfU1VCVFlQRSwgJnN1YnR5cGUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwbWljX3NwbWlfaWRfdGFibGUpOyBpKyspIHsKKwkJaWYgKHN1YnR5cGUgPT0gKHVuc2lnbmVkIGxvbmcpcG1pY19zcG1pX2lkX3RhYmxlW2ldLmRhdGEpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSAhPSBBUlJBWV9TSVpFKHBtaWNfc3BtaV9pZF90YWJsZSkpCisJCW5hbWUgPSBwbWljX3NwbWlfaWRfdGFibGVbaV0uY29tcGF0aWJsZTsKKworCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgUE1JQ19SRVYyLCAmcmV2Mik7CisJaWYgKHJldCA8IDApCisJCXJldHVybjsKKworCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgUE1JQ19SRVYzLCAmbWlub3IpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm47CisKKwlyZXQgPSByZWdtYXBfcmVhZChtYXAsIFBNSUNfUkVWNCwgJm1ham9yKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJbiBlYXJseSB2ZXJzaW9ucyBvZiBQTTg5NDEgYW5kIFBNODIyNiwgdGhlIG1ham9yIHJldmlzaW9uIG51bWJlcgorCSAqIHN0YXJ0ZWQgaW5jcmVtZW50aW5nIGZyb20gMCAoZWcgMCA9IHYxLjAsIDEgPSB2Mi4wKS4KKwkgKiBJbmNyZW1lbnQgdGhlIG1ham9yIHJldmlzaW9uIG51bWJlciBoZXJlIGlmIHRoZSBjaGlwIGlzIGFuIGVhcmx5CisJICogdmVyc2lvbiBvZiBQTTg5NDEgb3IgUE04MjI2LgorCSAqLworCWlmICgoc3VidHlwZSA9PSBQTTg5NDFfU1VCVFlQRSB8fCBzdWJ0eXBlID09IFBNODIyNl9TVUJUWVBFKSAmJgorCSAgICBtYWpvciA8IDB4MDIpCisJCW1ham9yKys7CisKKwlpZiAoc3VidHlwZSA9PSBQTTgxMTBfU1VCVFlQRSkKKwkJbWlub3IgPSByZXYyOworCisJZGV2X2RiZyhkZXYsICIleDogJXMgdiVkLiVkXG4iLCBzdWJ0eXBlLCBuYW1lLCBtYWpvciwgbWlub3IpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgc3BtaV9yZWdtYXBfY29uZmlnID0gewogCS5yZWdfYml0cwk9IDE2LAogCS52YWxfYml0cwk9IDgsCkBAIC0zMyw2ICsxMjcsOCBAQAogCWlmIChJU19FUlIocmVnbWFwKSkKIAkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKIAorCXBtaWNfc3BtaV9zaG93X3JldmlkKHJlZ21hcCwgJnNkZXYtPmRldik7CisKIAlyZXR1cm4gb2ZfcGxhdGZvcm1fcG9wdWxhdGUocm9vdCwgTlVMTCwgTlVMTCwgJnNkZXYtPmRldik7CiB9CiAKQEAgLTQxLDEzICsxMzcsNiBAQAogCW9mX3BsYXRmb3JtX2RlcG9wdWxhdGUoJnNkZXYtPmRldik7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBtaWNfc3BtaV9pZF90YWJsZVtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxzcG1pLXBtaWMiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODk0MSIgfSwKLQl7IC5jb21wYXRpYmxlID0gInFjb20scG04ODQxIiB9LAotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbWE4MDg0IiB9LAotCXsgfQotfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHBtaWNfc3BtaV9pZF90YWJsZSk7CiAKIHN0YXRpYyBzdHJ1Y3Qgc3BtaV9kcml2ZXIgcG1pY19zcG1pX2RyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3Fjb21fcnBtLmMgYi9kcml2ZXJzL21mZC9xY29tX3JwbS5jCmluZGV4IGY2OTYzMjguLjEyZTMyNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3Fjb21fcnBtLmMKKysrIGIvZHJpdmVycy9tZmQvcWNvbV9ycG0uYwpAQCAtMzIzLDEwICszMjMsNTEgQEAKIAkubl9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKG1zbTg5NjBfcnBtX3Jlc291cmNlX3RhYmxlKSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcWNvbV9ycG1fcmVzb3VyY2UgaXBxODA2eF9ycG1fcmVzb3VyY2VfdGFibGVbXSA9IHsKKwlbUUNPTV9SUE1fQ1hPX0NMS10gPQkJCXsgMjUsIDksIDUsIDEgfSwKKwlbUUNPTV9SUE1fUFhPX0NMS10gPQkJCXsgMjYsIDEwLCA2LCAxIH0sCisJW1FDT01fUlBNX0FQUFNfRkFCUklDX0NMS10gPQkJeyAyNywgMTEsIDgsIDEgfSwKKwlbUUNPTV9SUE1fU1lTX0ZBQlJJQ19DTEtdID0JCXsgMjgsIDEyLCA5LCAxIH0sCisJW1FDT01fUlBNX05TU19GQUJSSUNfMF9DTEtdID0JCXsgMjksIDEzLCAxMCwgMSB9LAorCVtRQ09NX1JQTV9EQVlUT05BX0ZBQlJJQ19DTEtdID0JCXsgMzAsIDE0LCAxMSwgMSB9LAorCVtRQ09NX1JQTV9TRlBCX0NMS10gPQkJCXsgMzEsIDE1LCAxMiwgMSB9LAorCVtRQ09NX1JQTV9DRlBCX0NMS10gPQkJCXsgMzIsIDE2LCAxMywgMSB9LAorCVtRQ09NX1JQTV9OU1NfRkFCUklDXzFfQ0xLXSA9CQl7IDMzLCAxNywgMTQsIDEgfSwKKwlbUUNPTV9SUE1fRUJJMV9DTEtdID0JCQl7IDM0LCAxOCwgMTYsIDEgfSwKKwlbUUNPTV9SUE1fQVBQU19GQUJSSUNfSEFMVF0gPQkJeyAzNSwgMTksIDE4LCAyIH0sCisJW1FDT01fUlBNX0FQUFNfRkFCUklDX01PREVdID0JCXsgMzcsIDIwLCAxOSwgMyB9LAorCVtRQ09NX1JQTV9BUFBTX0ZBQlJJQ19JT0NUTF0gPQkJeyA0MCwgMjEsIDIwLCAxIH0sCisJW1FDT01fUlBNX0FQUFNfRkFCUklDX0FSQl0gPQkJeyA0MSwgMjIsIDIxLCAxMiB9LAorCVtRQ09NX1JQTV9TWVNfRkFCUklDX0hBTFRdID0JCXsgNTMsIDIzLCAyMiwgMiB9LAorCVtRQ09NX1JQTV9TWVNfRkFCUklDX01PREVdID0JCXsgNTUsIDI0LCAyMywgMyB9LAorCVtRQ09NX1JQTV9TWVNfRkFCUklDX0lPQ1RMXSA9CQl7IDU4LCAyNSwgMjQsIDEgfSwKKwlbUUNPTV9SUE1fU1lTX0ZBQlJJQ19BUkJdID0JCXsgNTksIDI2LCAyNSwgMzAgfSwKKwlbUUNPTV9SUE1fTU1fRkFCUklDX0hBTFRdID0JCXsgODksIDI3LCAyNiwgMiB9LAorCVtRQ09NX1JQTV9NTV9GQUJSSUNfTU9ERV0gPQkJeyA5MSwgMjgsIDI3LCAzIH0sCisJW1FDT01fUlBNX01NX0ZBQlJJQ19JT0NUTF0gPQkJeyA5NCwgMjksIDI4LCAxIH0sCisJW1FDT01fUlBNX01NX0ZBQlJJQ19BUkJdID0JCXsgOTUsIDMwLCAyOSwgMiB9LAorCVtRQ09NX1JQTV9DWE9fQlVGRkVSU10gPQkJeyAyMDksIDMzLCAzMSwgMSB9LAorCVtRQ09NX1JQTV9VU0JfT1RHX1NXSVRDSF0gPQkJeyAyMTAsIDM0LCAzMiwgMSB9LAorCVtRQ09NX1JQTV9IRE1JX1NXSVRDSF0gPQkJeyAyMTEsIDM1LCAzMywgMSB9LAorCVtRQ09NX1JQTV9ERFJfRE1NXSA9CQkJeyAyMTIsIDM2LCAzNCwgMiB9LAorCVtRQ09NX1JQTV9WRERNSU5fR1BJT10gPQkJeyAyMTUsIDQwLCAzOSwgMSB9LAorCVtRQ09NX1JQTV9TTUIyMDhfUzFhXSA9CQkJeyAyMTYsIDQxLCA5MCwgMiB9LAorCVtRQ09NX1JQTV9TTUIyMDhfUzFiXSA9CQkJeyAyMTgsIDQzLCA5MSwgMiB9LAorCVtRQ09NX1JQTV9TTUIyMDhfUzJhXSA9CQkJeyAyMjAsIDQ1LCA5MiwgMiB9LAorCVtRQ09NX1JQTV9TTUIyMDhfUzJiXSA9CQkJeyAyMjIsIDQ3LCA5MywgMiB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBxY29tX3JwbV9kYXRhIGlwcTgwNnhfdGVtcGxhdGUgPSB7CisJLnZlcnNpb24gPSAzLAorCS5yZXNvdXJjZV90YWJsZSA9IGlwcTgwNnhfcnBtX3Jlc291cmNlX3RhYmxlLAorCS5uX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoaXBxODA2eF9ycG1fcmVzb3VyY2VfdGFibGUpLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcWNvbV9ycG1fb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInFjb20scnBtLWFwcTgwNjQiLCAuZGF0YSA9ICZhcHE4MDY0X3RlbXBsYXRlIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHJwbS1tc204NjYwIiwgLmRhdGEgPSAmbXNtODY2MF90ZW1wbGF0ZSB9LAogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxycG0tbXNtODk2MCIsIC5kYXRhID0gJm1zbTg5NjBfdGVtcGxhdGUgfSwKKwl7IC5jb21wYXRpYmxlID0gInFjb20scnBtLWlwcTgwNjQiLCAuZGF0YSA9ICZpcHE4MDZ4X3RlbXBsYXRlIH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcWNvbV9ycG1fb2ZfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcms4MDguYyBiL2RyaXZlcnMvbWZkL3JrODA4LmMKaW5kZXggYmQwMjE1MC4uNGIxZTQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvcms4MDguYworKysgYi9kcml2ZXJzL21mZC9yazgwOC5jCkBAIC04OSw2ICs4OSw3IEBACiAJeyBSSzgwOF9CT09TVF9DT05GSUdfUkVHLCBCT09TVF9JTE1JTl9NQVNLLCBCT09TVF9JTE1JTl8xMDBNQSB9LAogCXsgUks4MDhfQlVDSzFfQ09ORklHX1JFRywgQlVDSzFfUkFURV9NQVNLLCAgQlVDS19JTE1JTl8yMDBNQSB9LAogCXsgUks4MDhfQlVDSzJfQ09ORklHX1JFRywgQlVDSzJfUkFURV9NQVNLLCAgQlVDS19JTE1JTl8yMDBNQSB9LAorCXsgUks4MDhfRENEQ19VVl9BQ1RfUkVHLCAgQlVDS19VVl9BQ1RfTUFTSywgQlVDS19VVl9BQ1RfRElTQUJMRX0sCiAJeyBSSzgwOF9WQl9NT05fUkVHLCAgICAgICBNQVNLX0FMTCwgICAgICAgICBWQl9MT19BQ1QgfAogCQkJCQkJICAgIFZCX0xPX1NFTF8zNTAwTVYgfSwKIH07CkBAIC0yNDUsNyArMjQ2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcms4MDhfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJrODA4X29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxyazgwOCIgfSwKIAl7IH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcnRsODQxMS5jIGIvZHJpdmVycy9tZmQvcnRsODQxMS5jCmluZGV4IGZkZDM0YzguLmIzYWU2NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3J0bDg0MTEuYworKysgYi9kcml2ZXJzL21mZC9ydGw4NDExLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAl1OCByZWczID0gMDsKIAogCXJ0c3hfcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjciwgUENSX1NFVFRJTkdfUkVHMSwgJnJlZzEpOwotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUcxLCByZWcxKTsKKwlwY3JfZGJnKHBjciwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUcxLCByZWcxKTsKIAogCWlmICghcnRzeF92ZW5kb3Jfc2V0dGluZ192YWxpZChyZWcxKSkKIAkJcmV0dXJuOwpAQCAtNjUsNyArNjUsNyBAQAogCXBjci0+Y2FyZF9kcml2ZV9zZWwgfD0gcnRzeF9yZWdfdG9fY2FyZF9kcml2ZV9zZWwocmVnMSk7CiAKIAlydHN4X3BjaV9yZWFkX2NvbmZpZ19ieXRlKHBjciwgUENSX1NFVFRJTkdfUkVHMywgJnJlZzMpOwotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUczLCByZWczKTsKKwlwY3JfZGJnKHBjciwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUczLCByZWczKTsKIAlwY3ItPnNkMzBfZHJpdmVfc2VsXzN2MyA9IHJ0bDg0MTFfcmVnX3RvX3NkMzBfZHJpdmVfc2VsXzN2MyhyZWczKTsKIH0KIApAQCAtNzQsNyArNzQsNyBAQAogCXUzMiByZWcgPSAwOwogCiAJcnRzeF9wY2lfcmVhZF9jb25maWdfZHdvcmQocGNyLCBQQ1JfU0VUVElOR19SRUcxLCAmcmVnKTsKLQlkZXZfZGJnKCYocGNyLT5wY2ktPmRldiksICJDZmcgMHgleDogMHgleFxuIiwgUENSX1NFVFRJTkdfUkVHMSwgcmVnKTsKKwlwY3JfZGJnKHBjciwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUcxLCByZWcpOwogCiAJaWYgKCFydHN4X3ZlbmRvcl9zZXR0aW5nX3ZhbGlkKHJlZykpCiAJCXJldHVybjsKQEAgLTI2MCw5ICsyNjAsOCBAQAogCQlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIENBUkRfUFdSX0NUTCwKIAkJCQlCUFBfUE9XRVJfTUFTSywgQlBQX1BPV0VSX09GRik7CiAKLQkJZGV2X2RiZygmKHBjci0+cGNpLT5kZXYpLAotCQkJCSJBZnRlciBDRCBkZWdsaXRjaCwgY2FyZF9leGlzdCA9IDB4JXhcbiIsCi0JCQkJY2FyZF9leGlzdCk7CisJCXBjcl9kYmcocGNyLCAiQWZ0ZXIgQ0QgZGVnbGl0Y2gsIGNhcmRfZXhpc3QgPSAweCV4XG4iLAorCQkJY2FyZF9leGlzdCk7CiAJfQogCiAJaWYgKGNhcmRfZXhpc3QgJiBNU19FWElTVCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcnRzNTIwOS5jIGIvZHJpdmVycy9tZmQvcnRzNTIwOS5jCmluZGV4IGNiMDQxNzQuLjM3M2UyNTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3J0czUyMDkuYworKysgYi9kcml2ZXJzL21mZC9ydHM1MjA5LmMKQEAgLTM4LDcgKzM4LDcgQEAKIAl1MzIgcmVnOwogCiAJcnRzeF9wY2lfcmVhZF9jb25maWdfZHdvcmQocGNyLCBQQ1JfU0VUVElOR19SRUcxLCAmcmVnKTsKLQlkZXZfZGJnKCYocGNyLT5wY2ktPmRldiksICJDZmcgMHgleDogMHgleFxuIiwgUENSX1NFVFRJTkdfUkVHMSwgcmVnKTsKKwlwY3JfZGJnKHBjciwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUcxLCByZWcpOwogCiAJaWYgKHJ0czUyMDlfdmVuZG9yX3NldHRpbmcxX3ZhbGlkKHJlZykpIHsKIAkJaWYgKHJ0czUyMDlfcmVnX2NoZWNrX21zX3Btb3MocmVnKSkKQEAgLTQ3LDcgKzQ3LDcgQEAKIAl9CiAKIAlydHN4X3BjaV9yZWFkX2NvbmZpZ19kd29yZChwY3IsIFBDUl9TRVRUSU5HX1JFRzIsICZyZWcpOwotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUcyLCByZWcpOworCXBjcl9kYmcocGNyLCAiQ2ZnIDB4JXg6IDB4JXhcbiIsIFBDUl9TRVRUSU5HX1JFRzIsIHJlZyk7CiAKIAlpZiAocnRzNTIwOV92ZW5kb3Jfc2V0dGluZzJfdmFsaWQocmVnKSkgewogCQlwY3ItPnNkMzBfZHJpdmVfc2VsXzF2OCA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9ydHM1MjI3LmMgYi9kcml2ZXJzL21mZC9ydHM1MjI3LmMKaW5kZXggMzI0MDc0MC4uY2UwMTJkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvcnRzNTIyNy5jCisrKyBiL2RyaXZlcnMvbWZkL3J0czUyMjcuYwpAQCAtNjMsNyArNjMsNyBAQAogCXUzMiByZWc7CiAKIAlydHN4X3BjaV9yZWFkX2NvbmZpZ19kd29yZChwY3IsIFBDUl9TRVRUSU5HX1JFRzEsICZyZWcpOwotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUcxLCByZWcpOworCXBjcl9kYmcocGNyLCAiQ2ZnIDB4JXg6IDB4JXhcbiIsIFBDUl9TRVRUSU5HX1JFRzEsIHJlZyk7CiAKIAlpZiAoIXJ0c3hfdmVuZG9yX3NldHRpbmdfdmFsaWQocmVnKSkKIAkJcmV0dXJuOwpAQCAtNzQsNyArNzQsNyBAQAogCXBjci0+Y2FyZF9kcml2ZV9zZWwgfD0gcnRzeF9yZWdfdG9fY2FyZF9kcml2ZV9zZWwocmVnKTsKIAogCXJ0c3hfcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjciwgUENSX1NFVFRJTkdfUkVHMiwgJnJlZyk7Ci0JZGV2X2RiZygmKHBjci0+cGNpLT5kZXYpLCAiQ2ZnIDB4JXg6IDB4JXhcbiIsIFBDUl9TRVRUSU5HX1JFRzIsIHJlZyk7CisJcGNyX2RiZyhwY3IsICJDZmcgMHgleDogMHgleFxuIiwgUENSX1NFVFRJTkdfUkVHMiwgcmVnKTsKIAlwY3ItPnNkMzBfZHJpdmVfc2VsXzN2MyA9IHJ0c3hfcmVnX3RvX3NkMzBfZHJpdmVfc2VsXzN2MyhyZWcpOwogCWlmIChydHN4X3JlZ19jaGVja19yZXZlcnNlX3NvY2tldChyZWcpKQogCQlwY3ItPmZsYWdzIHw9IFBDUl9SRVZFUlNFX1NPQ0tFVDsKQEAgLTExOCwxMSArMTE4LDkgQEAKIAlydHM1MjI3X2ZpbGxfZHJpdmluZyhwY3IsIE9VVFBVVF8zVjMpOwogCS8qIENvbmZpZ3VyZSBmb3JjZV9jbG9ja19yZXEgKi8KIAlpZiAocGNyLT5mbGFncyAmIFBDUl9SRVZFUlNFX1NPQ0tFVCkKLQkJcnRzeF9wY2lfYWRkX2NtZChwY3IsIFdSSVRFX1JFR19DTUQsCi0JCQkJQVVUT0xPQURfQ0ZHX0JBU0UgKyAzLCAweEI4LCAweEI4KTsKKwkJcnRzeF9wY2lfYWRkX2NtZChwY3IsIFdSSVRFX1JFR19DTUQsIFBFVFhDRkcsIDB4QjgsIDB4QjgpOwogCWVsc2UKLQkJcnRzeF9wY2lfYWRkX2NtZChwY3IsIFdSSVRFX1JFR19DTUQsCi0JCQkJQVVUT0xPQURfQ0ZHX0JBU0UgKyAzLCAweEI4LCAweDg4KTsKKwkJcnRzeF9wY2lfYWRkX2NtZChwY3IsIFdSSVRFX1JFR19DTUQsIFBFVFhDRkcsIDB4QjgsIDB4ODgpOwogCXJ0c3hfcGNpX2FkZF9jbWQocGNyLCBXUklURV9SRUdfQ01ELCBQTV9DVFJMMywgMHgxMCwgMHgwMCk7CiAKIAlyZXR1cm4gcnRzeF9wY2lfc2VuZF9jbWQocGNyLCAxMDApOwpAQCAtMTMyLDcgKzEzMCw3IEBACiB7CiAJaW50IGVycjsKIAotCWVyciA9IHJ0c3hfZ29wc19wbV9yZXNldChwY3IpOworCWVyciA9IHJ0c3hfcGNpX3dyaXRlX3JlZ2lzdGVyKHBjciwgUE1fQ1RSTDMsIEQzX0RFTElOS19NT0RFX0VOLCAweDAwKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcnRzNTIyOS5jIGIvZHJpdmVycy9tZmQvcnRzNTIyOS5jCmluZGV4IDYzNTNmNWQuLmFjZTQ1MzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3J0czUyMjkuYworKysgYi9kcml2ZXJzL21mZC9ydHM1MjI5LmMKQEAgLTM4LDcgKzM4LDcgQEAKIAl1MzIgcmVnOwogCiAJcnRzeF9wY2lfcmVhZF9jb25maWdfZHdvcmQocGNyLCBQQ1JfU0VUVElOR19SRUcxLCAmcmVnKTsKLQlkZXZfZGJnKCYocGNyLT5wY2ktPmRldiksICJDZmcgMHgleDogMHgleFxuIiwgUENSX1NFVFRJTkdfUkVHMSwgcmVnKTsKKwlwY3JfZGJnKHBjciwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUcxLCByZWcpOwogCiAJaWYgKCFydHN4X3ZlbmRvcl9zZXR0aW5nX3ZhbGlkKHJlZykpCiAJCXJldHVybjsKQEAgLTUwLDcgKzUwLDcgQEAKIAlwY3ItPmNhcmRfZHJpdmVfc2VsIHw9IHJ0c3hfcmVnX3RvX2NhcmRfZHJpdmVfc2VsKHJlZyk7CiAKIAlydHN4X3BjaV9yZWFkX2NvbmZpZ19kd29yZChwY3IsIFBDUl9TRVRUSU5HX1JFRzIsICZyZWcpOwotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUcyLCByZWcpOworCXBjcl9kYmcocGNyLCAiQ2ZnIDB4JXg6IDB4JXhcbiIsIFBDUl9TRVRUSU5HX1JFRzIsIHJlZyk7CiAJcGNyLT5zZDMwX2RyaXZlX3NlbF8zdjMgPQogCQltYXBfc2RfZHJpdmUocnRzeF9yZWdfdG9fc2QzMF9kcml2ZV9zZWxfM3YzKHJlZykpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcnRzNTI0OS5jIGIvZHJpdmVycy9tZmQvcnRzNTI0OS5jCmluZGV4IGNmNDI1Y2MuLmViMmQ1ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3J0czUyNDkuYworKysgYi9kcml2ZXJzL21mZC9ydHM1MjQ5LmMKQEAgLTM2LDE2ICszNiwxNiBAQAogc3RhdGljIHZvaWQgcnRzNTI0OV9maWxsX2RyaXZpbmcoc3RydWN0IHJ0c3hfcGNyICpwY3IsIHU4IHZvbHRhZ2UpCiB7CiAJdTggZHJpdmluZ18zdjNbNF1bM10gPSB7Ci0JCXsweDExLCAweDExLCAweDExfSwKKwkJezB4MTEsIDB4MTEsIDB4MTh9LAogCQl7MHg1NSwgMHg1NSwgMHg1Q30sCi0JCXsweDk5LCAweDk5LCAweDkyfSwKLQkJezB4OTksIDB4OTksIDB4OTJ9LAorCQl7MHhGRiwgMHhGRiwgMHhGRn0sCisJCXsweDk2LCAweDk2LCAweDk2fSwKIAl9OwogCXU4IGRyaXZpbmdfMXY4WzRdWzNdID0gewotCQl7MHgzQywgMHgzQywgMHgzQ30sCi0JCXsweEIzLCAweEIzLCAweEIzfSwKLQkJezB4RkUsIDB4RkUsIDB4RkV9LAogCQl7MHhDNCwgMHhDNCwgMHhDNH0sCisJCXsweDNDLCAweDNDLCAweDNDfSwKKwkJezB4RkUsIDB4RkUsIDB4RkV9LAorCQl7MHhCMywgMHhCMywgMHhCM30sCiAJfTsKIAl1OCAoKmRyaXZpbmcpWzNdLCBkcml2ZV9zZWw7CiAKQEAgLTY1LDE1ICs2NSwxNyBAQAogCQkJMHhGRiwgZHJpdmluZ1tkcml2ZV9zZWxdWzJdKTsKIH0KIAotc3RhdGljIHZvaWQgcnRzNTI0OV9mZXRjaF92ZW5kb3Jfc2V0dGluZ3Moc3RydWN0IHJ0c3hfcGNyICpwY3IpCitzdGF0aWMgdm9pZCBydHN4X2Jhc2VfZmV0Y2hfdmVuZG9yX3NldHRpbmdzKHN0cnVjdCBydHN4X3BjciAqcGNyKQogewogCXUzMiByZWc7CiAKIAlydHN4X3BjaV9yZWFkX2NvbmZpZ19kd29yZChwY3IsIFBDUl9TRVRUSU5HX1JFRzEsICZyZWcpOwotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUcxLCByZWcpOworCXBjcl9kYmcocGNyLCAiQ2ZnIDB4JXg6IDB4JXhcbiIsIFBDUl9TRVRUSU5HX1JFRzEsIHJlZyk7CiAKLQlpZiAoIXJ0c3hfdmVuZG9yX3NldHRpbmdfdmFsaWQocmVnKSkKKwlpZiAoIXJ0c3hfdmVuZG9yX3NldHRpbmdfdmFsaWQocmVnKSkgeworCQlwY3JfZGJnKHBjciwgInNraXAgZmV0Y2ggdmVuZG9yIHNldHRpbmdcbiIpOwogCQlyZXR1cm47CisJfQogCiAJcGNyLT5hc3BtX2VuID0gcnRzeF9yZWdfdG9fYXNwbShyZWcpOwogCXBjci0+c2QzMF9kcml2ZV9zZWxfMXY4ID0gcnRzeF9yZWdfdG9fc2QzMF9kcml2ZV9zZWxfMXY4KHJlZyk7CkBAIC04MSwxMyArODMsMTMgQEAKIAlwY3ItPmNhcmRfZHJpdmVfc2VsIHw9IHJ0c3hfcmVnX3RvX2NhcmRfZHJpdmVfc2VsKHJlZyk7CiAKIAlydHN4X3BjaV9yZWFkX2NvbmZpZ19kd29yZChwY3IsIFBDUl9TRVRUSU5HX1JFRzIsICZyZWcpOwotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIkNmZyAweCV4OiAweCV4XG4iLCBQQ1JfU0VUVElOR19SRUcyLCByZWcpOworCXBjcl9kYmcocGNyLCAiQ2ZnIDB4JXg6IDB4JXhcbiIsIFBDUl9TRVRUSU5HX1JFRzIsIHJlZyk7CiAJcGNyLT5zZDMwX2RyaXZlX3NlbF8zdjMgPSBydHN4X3JlZ190b19zZDMwX2RyaXZlX3NlbF8zdjMocmVnKTsKIAlpZiAocnRzeF9yZWdfY2hlY2tfcmV2ZXJzZV9zb2NrZXQocmVnKSkKIAkJcGNyLT5mbGFncyB8PSBQQ1JfUkVWRVJTRV9TT0NLRVQ7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0czUyNDlfZm9yY2VfcG93ZXJfZG93bihzdHJ1Y3QgcnRzeF9wY3IgKnBjciwgdTggcG1fc3RhdGUpCitzdGF0aWMgdm9pZCBydHN4X2Jhc2VfZm9yY2VfcG93ZXJfZG93bihzdHJ1Y3QgcnRzeF9wY3IgKnBjciwgdTggcG1fc3RhdGUpCiB7CiAJLyogU2V0IHJlbGlua190aW1lIHRvIDAgKi8KIAlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIEFVVE9MT0FEX0NGR19CQVNFICsgMSwgMHhGRiwgMCk7CkBAIC05NSw3ICs5Nyw4IEBACiAJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBBVVRPTE9BRF9DRkdfQkFTRSArIDMsIDB4MDEsIDApOwogCiAJaWYgKHBtX3N0YXRlID09IEhPU1RfRU5URVJfUzMpCi0JCXJ0c3hfcGNpX3dyaXRlX3JlZ2lzdGVyKHBjciwgUE1fQ1RSTDMsIDB4MTAsIDB4MTApOworCQlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIHBjci0+cmVnX3BtX2N0cmwzLAorCQkJRDNfREVMSU5LX01PREVfRU4sIEQzX0RFTElOS19NT0RFX0VOKTsKIAogCXJ0c3hfcGNpX3dyaXRlX3JlZ2lzdGVyKHBjciwgRlBEQ1RMLCAweDAzLCAweDAzKTsKIH0KQEAgLTEwNCw2ICsxMDcsOCBAQAogewogCXJ0c3hfcGNpX2luaXRfY21kKHBjcik7CiAKKwkvKiBSZXN0IEwxU1VCIENvbmZpZyAqLworCXJ0c3hfcGNpX2FkZF9jbWQocGNyLCBXUklURV9SRUdfQ01ELCBMMVNVQl9DT05GSUczLCAweEZGLCAweDAwKTsKIAkvKiBDb25maWd1cmUgR1BJTyBhcyBvdXRwdXQgKi8KIAlydHN4X3BjaV9hZGRfY21kKHBjciwgV1JJVEVfUkVHX0NNRCwgR1BJT19DVEwsIDB4MDIsIDB4MDIpOwogCS8qIFJlc2V0IEFTUE0gc3RhdGUgdG8gZGVmYXVsdCB2YWx1ZSAqLwpAQCAtMTE2LDEyICsxMjEsOSBAQAogCS8qIENvbmZpZ3VyZSBkcml2aW5nICovCiAJcnRzNTI0OV9maWxsX2RyaXZpbmcocGNyLCBPVVRQVVRfM1YzKTsKIAlpZiAocGNyLT5mbGFncyAmIFBDUl9SRVZFUlNFX1NPQ0tFVCkKLQkJcnRzeF9wY2lfYWRkX2NtZChwY3IsIFdSSVRFX1JFR19DTUQsCi0JCQkJQVVUT0xPQURfQ0ZHX0JBU0UgKyAzLCAweEIwLCAweEIwKTsKKwkJcnRzeF9wY2lfYWRkX2NtZChwY3IsIFdSSVRFX1JFR19DTUQsIFBFVFhDRkcsIDB4QjAsIDB4QjApOwogCWVsc2UKLQkJcnRzeF9wY2lfYWRkX2NtZChwY3IsIFdSSVRFX1JFR19DTUQsCi0JCQkJQVVUT0xPQURfQ0ZHX0JBU0UgKyAzLCAweEIwLCAweDgwKTsKLQlydHN4X3BjaV9hZGRfY21kKHBjciwgV1JJVEVfUkVHX0NNRCwgUE1fQ1RSTDMsIDB4MTAsIDB4MDApOworCQlydHN4X3BjaV9hZGRfY21kKHBjciwgV1JJVEVfUkVHX0NNRCwgUEVUWENGRywgMHhCMCwgMHg4MCk7CiAKIAlyZXR1cm4gcnRzeF9wY2lfc2VuZF9jbWQocGNyLCAxMDApOwogfQpAQCAtMTMwLDE1ICsxMzIsMTYgQEAKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gcnRzeF9nb3BzX3BtX3Jlc2V0KHBjcik7CisJZXJyID0gcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBQTV9DVFJMMywgRDNfREVMSU5LX01PREVfRU4sIDB4MDApOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JZXJyID0gcnRzeF9wY2lfd3JpdGVfcGh5X3JlZ2lzdGVyKHBjciwgUEhZX1JFR19SRVYsCi0JCQlQSFlfUkVHX1JFVl9SRVNWIHwgUEhZX1JFR19SRVZfUlhJRExFX0xBVENIRUQgfAotCQkJUEhZX1JFR19SRVZfUDFfRU4gfCBQSFlfUkVHX1JFVl9SWElETEVfRU4gfAotCQkJUEhZX1JFR19SRVZfUlhfUFdTVCB8IFBIWV9SRUdfUkVWX0NMS1JFUV9ETFlfVElNRVJfMV8wIHwKLQkJCVBIWV9SRUdfUkVWX1NUT1BfQ0xLUkQgfCBQSFlfUkVHX1JFVl9TVE9QX0NMS1dSKTsKKwllcnIgPSBydHN4X3BjaV93cml0ZV9waHlfcmVnaXN0ZXIocGNyLCBQSFlfUkVWLAorCQkJUEhZX1JFVl9SRVNWIHwgUEhZX1JFVl9SWElETEVfTEFUQ0hFRCB8CisJCQlQSFlfUkVWX1AxX0VOIHwgUEhZX1JFVl9SWElETEVfRU4gfAorCQkJUEhZX1JFVl9DTEtSRVFfVFhfRU4gfCBQSFlfUkVWX1JYX1BXU1QgfAorCQkJUEhZX1JFVl9DTEtSRVFfRFRfMV8wIHwgUEhZX1JFVl9TVE9QX0NMS1JEIHwKKwkJCVBIWV9SRVZfU1RPUF9DTEtXUik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTE0OSwxOSArMTUyLDIxIEBACiAJCQlQSFlfQlBDUl9JQl9GSUxURVIgfCBQSFlfQlBDUl9DTUlSUk9SX0VOKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwogCWVyciA9IHJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIFBIWV9QQ1IsCiAJCQlQSFlfUENSX0ZPUkNFX0NPREUgfCBQSFlfUENSX09PQlNfQ0FMSV81MCB8CiAJCQlQSFlfUENSX09PQlNfVkNNXzA4IHwgUEhZX1BDUl9PT0JTX1NFTl85MCB8Ci0JCQlQSFlfUENSX1JTU0lfRU4pOworCQkJUEhZX1BDUl9SU1NJX0VOIHwgUEhZX1BDUl9SWDEwSyk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CisKIAllcnIgPSBydHN4X3BjaV93cml0ZV9waHlfcmVnaXN0ZXIocGNyLCBQSFlfUkNSMiwKIAkJCVBIWV9SQ1IyX0VNUEhBU0VfRU4gfCBQSFlfUkNSMl9OQURKUiB8Ci0JCQlQSFlfUkNSMl9DRFJfQ1BfMTAgfCBQSFlfUkNSMl9DRFJfU1JfMiB8Ci0JCQlQSFlfUkNSMl9GUkVRU0VMXzEyIHwgUEhZX1JDUjJfQ1BBREpFTiB8Ci0JCQlQSFlfUkNSMl9DRFJfU0NfOCB8IFBIWV9SQ1IyX0NBTElCX0xBVEUpOworCQkJUEhZX1JDUjJfQ0RSX1NSXzIgfCBQSFlfUkNSMl9GUkVRU0VMXzEyIHwKKwkJCVBIWV9SQ1IyX0NEUl9TQ18xMlAgfCBQSFlfUkNSMl9DQUxJQl9MQVRFKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwogCWVyciA9IHJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIFBIWV9GTEQ0LAogCQkJUEhZX0ZMRDRfRkxERU5fU0VMIHwgUEhZX0ZMRDRfUkVRX1JFRiB8CiAJCQlQSFlfRkxENF9SWEFNUF9PRkYgfCBQSFlfRkxENF9SRVFfQUREQSB8CkBAIC0xNjksMTEgKzE3NCwxMiBAQAogCQkJUEhZX0ZMRDRfQkVSX0NIS19FTik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7Ci0JZXJyID0gcnRzeF9wY2lfd3JpdGVfcGh5X3JlZ2lzdGVyKHBjciwgUEhZX1JEUiwgUEhZX1JEUl9SWERTRUxfMV85KTsKKwllcnIgPSBydHN4X3BjaV93cml0ZV9waHlfcmVnaXN0ZXIocGNyLCBQSFlfUkRSLAorCQkJUEhZX1JEUl9SWERTRUxfMV85IHwgUEhZX1NTQ19BVVRPX1BXRCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJZXJyID0gcnRzeF9wY2lfd3JpdGVfcGh5X3JlZ2lzdGVyKHBjciwgUEhZX1JDUjEsCi0JCQlQSFlfUkNSMV9BRFBfVElNRSB8IFBIWV9SQ1IxX1ZDT19DT0FSU0UpOworCQkJUEhZX1JDUjFfQURQX1RJTUVfNCB8IFBIWV9SQ1IxX1ZDT19DT0FSU0UpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWVyciA9IHJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIFBIWV9GTEQzLApAQCAtMTgxLDMzICsxODcsMzQgQEAKIAkJCVBIWV9GTEQzX1JYREVMSU5LKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwogCXJldHVybiBydHN4X3BjaV93cml0ZV9waHlfcmVnaXN0ZXIocGNyLCBQSFlfVFVORSwKIAkJCVBIWV9UVU5FX1RVTkVSRUZfMV8wIHwgUEhZX1RVTkVfVkJHU0VMXzEyNTIgfAogCQkJUEhZX1RVTkVfU0RCVVNfMzMgfCBQSFlfVFVORV9UVU5FRDE4IHwKLQkJCVBIWV9UVU5FX1RVTkVEMTIpOworCQkJUEhZX1RVTkVfVFVORUQxMiB8IFBIWV9UVU5FX1RVTkVBMTIpOwogfQogCi1zdGF0aWMgaW50IHJ0czUyNDlfdHVybl9vbl9sZWQoc3RydWN0IHJ0c3hfcGNyICpwY3IpCitzdGF0aWMgaW50IHJ0c3hfYmFzZV90dXJuX29uX2xlZChzdHJ1Y3QgcnRzeF9wY3IgKnBjcikKIHsKIAlyZXR1cm4gcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBHUElPX0NUTCwgMHgwMiwgMHgwMik7CiB9CiAKLXN0YXRpYyBpbnQgcnRzNTI0OV90dXJuX29mZl9sZWQoc3RydWN0IHJ0c3hfcGNyICpwY3IpCitzdGF0aWMgaW50IHJ0c3hfYmFzZV90dXJuX29mZl9sZWQoc3RydWN0IHJ0c3hfcGNyICpwY3IpCiB7CiAJcmV0dXJuIHJ0c3hfcGNpX3dyaXRlX3JlZ2lzdGVyKHBjciwgR1BJT19DVEwsIDB4MDIsIDB4MDApOwogfQogCi1zdGF0aWMgaW50IHJ0czUyNDlfZW5hYmxlX2F1dG9fYmxpbmsoc3RydWN0IHJ0c3hfcGNyICpwY3IpCitzdGF0aWMgaW50IHJ0c3hfYmFzZV9lbmFibGVfYXV0b19ibGluayhzdHJ1Y3QgcnRzeF9wY3IgKnBjcikKIHsKIAlyZXR1cm4gcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBPTFRfTEVEX0NUTCwgMHgwOCwgMHgwOCk7CiB9CiAKLXN0YXRpYyBpbnQgcnRzNTI0OV9kaXNhYmxlX2F1dG9fYmxpbmsoc3RydWN0IHJ0c3hfcGNyICpwY3IpCitzdGF0aWMgaW50IHJ0c3hfYmFzZV9kaXNhYmxlX2F1dG9fYmxpbmsoc3RydWN0IHJ0c3hfcGNyICpwY3IpCiB7CiAJcmV0dXJuIHJ0c3hfcGNpX3dyaXRlX3JlZ2lzdGVyKHBjciwgT0xUX0xFRF9DVEwsIDB4MDgsIDB4MDApOwogfQogCi1zdGF0aWMgaW50IHJ0czUyNDlfY2FyZF9wb3dlcl9vbihzdHJ1Y3QgcnRzeF9wY3IgKnBjciwgaW50IGNhcmQpCitzdGF0aWMgaW50IHJ0c3hfYmFzZV9jYXJkX3Bvd2VyX29uKHN0cnVjdCBydHN4X3BjciAqcGNyLCBpbnQgY2FyZCkKIHsKIAlpbnQgZXJyOwogCkBAIC0yMzQsNyArMjQxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBydHM1MjQ5X2NhcmRfcG93ZXJfb2ZmKHN0cnVjdCBydHN4X3BjciAqcGNyLCBpbnQgY2FyZCkKK3N0YXRpYyBpbnQgcnRzeF9iYXNlX2NhcmRfcG93ZXJfb2ZmKHN0cnVjdCBydHN4X3BjciAqcGNyLCBpbnQgY2FyZCkKIHsKIAlydHN4X3BjaV9pbml0X2NtZChwY3IpOwogCXJ0c3hfcGNpX2FkZF9jbWQocGNyLCBXUklURV9SRUdfQ01ELCBDQVJEX1BXUl9DVEwsCkBAIC0yNDQsMjIgKzI1MSwzNSBAQAogCXJldHVybiBydHN4X3BjaV9zZW5kX2NtZChwY3IsIDEwMCk7CiB9CiAKLXN0YXRpYyBpbnQgcnRzNTI0OV9zd2l0Y2hfb3V0cHV0X3ZvbHRhZ2Uoc3RydWN0IHJ0c3hfcGNyICpwY3IsIHU4IHZvbHRhZ2UpCitzdGF0aWMgaW50IHJ0c3hfYmFzZV9zd2l0Y2hfb3V0cHV0X3ZvbHRhZ2Uoc3RydWN0IHJ0c3hfcGNyICpwY3IsIHU4IHZvbHRhZ2UpCiB7CiAJaW50IGVycjsKKwl1MTYgYXBwZW5kOwogCi0JaWYgKHZvbHRhZ2UgPT0gT1VUUFVUXzNWMykgewotCQllcnIgPSBydHN4X3BjaV93cml0ZV9waHlfcmVnaXN0ZXIocGNyLCBQSFlfVFVORSwgMHg0RkMwIHwgMHgyNCk7CisJc3dpdGNoICh2b2x0YWdlKSB7CisJY2FzZSBPVVRQVVRfM1YzOgorCQllcnIgPSBydHN4X3BjaV91cGRhdGVfcGh5KHBjciwgUEhZX1RVTkUsIFBIWV9UVU5FX1ZPTFRBR0VfTUFTSywKKwkJCVBIWV9UVU5FX1ZPTFRBR0VfM1YzKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwotCX0gZWxzZSBpZiAodm9sdGFnZSA9PSBPVVRQVVRfMVY4KSB7Ci0JCWVyciA9IHJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIFBIWV9CQUNSLCAweDNDMDIpOworCQlicmVhazsKKwljYXNlIE9VVFBVVF8xVjg6CisJCWFwcGVuZCA9IFBIWV9UVU5FX0QxOF8xVjg7CisJCWlmIChDSEtfUENJX1BJRChwY3IsIDB4NTI0OSkpIHsKKwkJCWVyciA9IHJ0c3hfcGNpX3VwZGF0ZV9waHkocGNyLCBQSFlfQkFDUiwKKwkJCQlQSFlfQkFDUl9CQVNJQ19NQVNLLCAwKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQlhcHBlbmQgPSBQSFlfVFVORV9EMThfMVY3OworCQl9CisKKwkJZXJyID0gcnRzeF9wY2lfdXBkYXRlX3BoeShwY3IsIFBIWV9UVU5FLCBQSFlfVFVORV9WT0xUQUdFX01BU0ssCisJCQlhcHBlbmQpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7Ci0JCWVyciA9IHJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIFBIWV9UVU5FLCAweDRDNDAgfCAweDI0KTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCX0gZWxzZSB7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXBjcl9kYmcocGNyLCAidW5rbm93biBvdXRwdXQgdm9sdGFnZSAlZFxuIiwgdm9sdGFnZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjcwLDE3ICsyOTAsMTcgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY3Jfb3BzIHJ0czUyNDlfcGNyX29wcyA9IHsKLQkuZmV0Y2hfdmVuZG9yX3NldHRpbmdzID0gcnRzNTI0OV9mZXRjaF92ZW5kb3Jfc2V0dGluZ3MsCisJLmZldGNoX3ZlbmRvcl9zZXR0aW5ncyA9IHJ0c3hfYmFzZV9mZXRjaF92ZW5kb3Jfc2V0dGluZ3MsCiAJLmV4dHJhX2luaXRfaHcgPSBydHM1MjQ5X2V4dHJhX2luaXRfaHcsCiAJLm9wdGltaXplX3BoeSA9IHJ0czUyNDlfb3B0aW1pemVfcGh5LAotCS50dXJuX29uX2xlZCA9IHJ0czUyNDlfdHVybl9vbl9sZWQsCi0JLnR1cm5fb2ZmX2xlZCA9IHJ0czUyNDlfdHVybl9vZmZfbGVkLAotCS5lbmFibGVfYXV0b19ibGluayA9IHJ0czUyNDlfZW5hYmxlX2F1dG9fYmxpbmssCi0JLmRpc2FibGVfYXV0b19ibGluayA9IHJ0czUyNDlfZGlzYWJsZV9hdXRvX2JsaW5rLAotCS5jYXJkX3Bvd2VyX29uID0gcnRzNTI0OV9jYXJkX3Bvd2VyX29uLAotCS5jYXJkX3Bvd2VyX29mZiA9IHJ0czUyNDlfY2FyZF9wb3dlcl9vZmYsCi0JLnN3aXRjaF9vdXRwdXRfdm9sdGFnZSA9IHJ0czUyNDlfc3dpdGNoX291dHB1dF92b2x0YWdlLAotCS5mb3JjZV9wb3dlcl9kb3duID0gcnRzNTI0OV9mb3JjZV9wb3dlcl9kb3duLAorCS50dXJuX29uX2xlZCA9IHJ0c3hfYmFzZV90dXJuX29uX2xlZCwKKwkudHVybl9vZmZfbGVkID0gcnRzeF9iYXNlX3R1cm5fb2ZmX2xlZCwKKwkuZW5hYmxlX2F1dG9fYmxpbmsgPSBydHN4X2Jhc2VfZW5hYmxlX2F1dG9fYmxpbmssCisJLmRpc2FibGVfYXV0b19ibGluayA9IHJ0c3hfYmFzZV9kaXNhYmxlX2F1dG9fYmxpbmssCisJLmNhcmRfcG93ZXJfb24gPSBydHN4X2Jhc2VfY2FyZF9wb3dlcl9vbiwKKwkuY2FyZF9wb3dlcl9vZmYgPSBydHN4X2Jhc2VfY2FyZF9wb3dlcl9vZmYsCisJLnN3aXRjaF9vdXRwdXRfdm9sdGFnZSA9IHJ0c3hfYmFzZV9zd2l0Y2hfb3V0cHV0X3ZvbHRhZ2UsCisJLmZvcmNlX3Bvd2VyX2Rvd24gPSBydHN4X2Jhc2VfZm9yY2VfcG93ZXJfZG93biwKIH07CiAKIC8qIFNEIFB1bGwgQ29udHJvbCBFbmFibGU6CkBAIC0zNDMsNyArMzYzLDcgQEAKIAogCXBjci0+ZmxhZ3MgPSAwOwogCXBjci0+Y2FyZF9kcml2ZV9zZWwgPSBSVFNYX0NBUkRfRFJJVkVfREVGQVVMVDsKLQlwY3ItPnNkMzBfZHJpdmVfc2VsXzF2OCA9IENGR19EUklWRVJfVFlQRV9DOworCXBjci0+c2QzMF9kcml2ZV9zZWxfMXY4ID0gQ0ZHX0RSSVZFUl9UWVBFX0I7CiAJcGNyLT5zZDMwX2RyaXZlX3NlbF8zdjMgPSBDRkdfRFJJVkVSX1RZUEVfQjsKIAlwY3ItPmFzcG1fZW4gPSBBU1BNX0wxX0VOOwogCXBjci0+dHhfaW5pdGlhbF9waGFzZSA9IFNFVF9DTE9DS19QSEFTRSgxLCAyOSwgMTYpOwpAQCAtMzU0LDQgKzM3NCwyMTkgQEAKIAlwY3ItPnNkX3B1bGxfY3RsX2Rpc2FibGVfdGJsID0gcnRzNTI0OV9zZF9wdWxsX2N0bF9kaXNhYmxlX3RibDsKIAlwY3ItPm1zX3B1bGxfY3RsX2VuYWJsZV90YmwgPSBydHM1MjQ5X21zX3B1bGxfY3RsX2VuYWJsZV90Ymw7CiAJcGNyLT5tc19wdWxsX2N0bF9kaXNhYmxlX3RibCA9IHJ0czUyNDlfbXNfcHVsbF9jdGxfZGlzYWJsZV90Ymw7CisKKwlwY3ItPnJlZ19wbV9jdHJsMyA9IFBNX0NUUkwzOwogfQorCitzdGF0aWMgaW50IHJ0czUyNGFfd3JpdGVfcGh5KHN0cnVjdCBydHN4X3BjciAqcGNyLCB1OCBhZGRyLCB1MTYgdmFsKQoreworCWFkZHIgPSBhZGRyICYgMHg4MCA/IChhZGRyICYgMHg3RikgfCAweDQwIDogYWRkcjsKKworCXJldHVybiBfX3J0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIGFkZHIsIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgcnRzNTI0YV9yZWFkX3BoeShzdHJ1Y3QgcnRzeF9wY3IgKnBjciwgdTggYWRkciwgdTE2ICp2YWwpCit7CisJYWRkciA9IGFkZHIgJiAweDgwID8gKGFkZHIgJiAweDdGKSB8IDB4NDAgOiBhZGRyOworCisJcmV0dXJuIF9fcnRzeF9wY2lfcmVhZF9waHlfcmVnaXN0ZXIocGNyLCBhZGRyLCB2YWwpOworfQorCitzdGF0aWMgaW50IHJ0czUyNGFfb3B0aW1pemVfcGh5KHN0cnVjdCBydHN4X3BjciAqcGNyKQoreworCWludCBlcnI7CisKKwllcnIgPSBydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIFJUUzUyNEFfUE1fQ1RSTDMsCisJCUQzX0RFTElOS19NT0RFX0VOLCAweDAwKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIFBIWV9QQ1IsCisJCVBIWV9QQ1JfRk9SQ0VfQ09ERSB8IFBIWV9QQ1JfT09CU19DQUxJXzUwIHwKKwkJUEhZX1BDUl9PT0JTX1ZDTV8wOCB8IFBIWV9QQ1JfT09CU19TRU5fOTAgfCBQSFlfUENSX1JTU0lfRU4pOworCXJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIFBIWV9TU0NDUjMsCisJCVBIWV9TU0NDUjNfU1RFUF9JTiB8IFBIWV9TU0NDUjNfQ0hFQ0tfREVMQVkpOworCisJaWYgKGlzX3ZlcnNpb24ocGNyLCAweDUyNEEsIElDX1ZFUl9BKSkgeworCQlydHN4X3BjaV93cml0ZV9waHlfcmVnaXN0ZXIocGNyLCBQSFlfU1NDQ1IzLAorCQkJUEhZX1NTQ0NSM19TVEVQX0lOIHwgUEhZX1NTQ0NSM19DSEVDS19ERUxBWSk7CisJCXJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIFBIWV9TU0NDUjIsCisJCQlQSFlfU1NDQ1IyX1BMTF9OQ09ERSB8IFBIWV9TU0NDUjJfVElNRTAgfAorCQkJUEhZX1NTQ0NSMl9USU1FMl9XSURUSCk7CisJCXJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIFBIWV9BTkExQSwKKwkJCVBIWV9BTkExQV9UWFJfTE9PUEJBQ0sgfCBQSFlfQU5BMUFfUlhUX0JJU1QgfAorCQkJUEhZX0FOQTFBX1RYUl9CSVNUIHwgUEhZX0FOQTFBX1JFVik7CisJCXJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIFBIWV9BTkExRCwKKwkJCVBIWV9BTkExRF9ERUJVR19BRERSKTsKKwkJcnRzeF9wY2lfd3JpdGVfcGh5X3JlZ2lzdGVyKHBjciwgUEhZX0RJRzFFLAorCQkJUEhZX0RJRzFFX1JFViB8IFBIWV9ESUcxRV9EMF9YX0QxIHwKKwkJCVBIWV9ESUcxRV9SWF9PTl9IT1NUIHwgUEhZX0RJRzFFX1JDTEtfUkVGX0hPU1QgfAorCQkJUEhZX0RJRzFFX1JDTEtfVFhfRU5fS0VFUCB8CisJCQlQSFlfRElHMUVfUkNMS19UWF9URVJNX0tFRVAgfAorCQkJUEhZX0RJRzFFX1JDTEtfUlhfRUlETEVfT04gfCBQSFlfRElHMUVfVFhfVEVSTV9LRUVQIHwKKwkJCVBIWV9ESUcxRV9SWF9URVJNX0tFRVAgfCBQSFlfRElHMUVfVFhfRU5fS0VFUCB8CisJCQlQSFlfRElHMUVfUlhfRU5fS0VFUCk7CisJfQorCisJcnRzeF9wY2lfd3JpdGVfcGh5X3JlZ2lzdGVyKHBjciwgUEhZX0FOQTA4LAorCQlQSFlfQU5BMDhfUlhfRVFfRENHQUlOIHwgUEhZX0FOQTA4X1NFTF9SWF9FTiB8CisJCVBIWV9BTkEwOF9SWF9FUV9WQUwgfCBQSFlfQU5BMDhfU0NQIHwgUEhZX0FOQTA4X1NFTF9JUEkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRzNTI0YV9leHRyYV9pbml0X2h3KHN0cnVjdCBydHN4X3BjciAqcGNyKQoreworCXJ0czUyNDlfZXh0cmFfaW5pdF9odyhwY3IpOworCisJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBGVU5DX0ZPUkNFX0NUTCwKKwkJRk9SQ0VfQVNQTV9MMV9FTiwgRk9SQ0VfQVNQTV9MMV9FTik7CisJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBQTV9FVkVOVF9ERUJVRywgUE1FX0RFQlVHXzAsIFBNRV9ERUJVR18wKTsKKwlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIExET19WQ0NfQ0ZHMSwgTERPX1ZDQ19MTVRfRU4sCisJCUxET19WQ0NfTE1UX0VOKTsKKwlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIFBDTEtfQ1RMLCBQQ0xLX01PREVfU0VMLCBQQ0xLX01PREVfU0VMKTsKKwlpZiAoaXNfdmVyc2lvbihwY3IsIDB4NTI0QSwgSUNfVkVSX0EpKSB7CisJCXJ0c3hfcGNpX3dyaXRlX3JlZ2lzdGVyKHBjciwgTERPX0RWMThfQ0ZHLAorCQkJTERPX0RWMThfU1JfTUFTSywgTERPX0RWMThfU1JfREYpOworCQlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIExET19WQ0NfQ0ZHMSwKKwkJCUxET19WQ0NfUkVGX1RVTkVfTUFTSywgTERPX1ZDQ19SRUZfMVYyKTsKKwkJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBMRE9fVklPX0NGRywKKwkJCUxET19WSU9fUkVGX1RVTkVfTUFTSywgTERPX1ZJT19SRUZfMVYyKTsKKwkJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBMRE9fVklPX0NGRywKKwkJCUxET19WSU9fU1JfTUFTSywgTERPX1ZJT19TUl9ERik7CisJCXJ0c3hfcGNpX3dyaXRlX3JlZ2lzdGVyKHBjciwgTERPX0RWMTJTX0NGRywKKwkJCUxET19SRUYxMl9UVU5FX01BU0ssIExET19SRUYxMl9UVU5FX0RGKTsKKwkJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBTRDQwX0xET19DVEwxLAorCQkJU0Q0MF9WSU9fVFVORV9NQVNLLCBTRDQwX1ZJT19UVU5FXzFWNyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNyX29wcyBydHM1MjRhX3Bjcl9vcHMgPSB7CisJLndyaXRlX3BoeSA9IHJ0czUyNGFfd3JpdGVfcGh5LAorCS5yZWFkX3BoeSA9IHJ0czUyNGFfcmVhZF9waHksCisJLmZldGNoX3ZlbmRvcl9zZXR0aW5ncyA9IHJ0c3hfYmFzZV9mZXRjaF92ZW5kb3Jfc2V0dGluZ3MsCisJLmV4dHJhX2luaXRfaHcgPSBydHM1MjRhX2V4dHJhX2luaXRfaHcsCisJLm9wdGltaXplX3BoeSA9IHJ0czUyNGFfb3B0aW1pemVfcGh5LAorCS50dXJuX29uX2xlZCA9IHJ0c3hfYmFzZV90dXJuX29uX2xlZCwKKwkudHVybl9vZmZfbGVkID0gcnRzeF9iYXNlX3R1cm5fb2ZmX2xlZCwKKwkuZW5hYmxlX2F1dG9fYmxpbmsgPSBydHN4X2Jhc2VfZW5hYmxlX2F1dG9fYmxpbmssCisJLmRpc2FibGVfYXV0b19ibGluayA9IHJ0c3hfYmFzZV9kaXNhYmxlX2F1dG9fYmxpbmssCisJLmNhcmRfcG93ZXJfb24gPSBydHN4X2Jhc2VfY2FyZF9wb3dlcl9vbiwKKwkuY2FyZF9wb3dlcl9vZmYgPSBydHN4X2Jhc2VfY2FyZF9wb3dlcl9vZmYsCisJLnN3aXRjaF9vdXRwdXRfdm9sdGFnZSA9IHJ0c3hfYmFzZV9zd2l0Y2hfb3V0cHV0X3ZvbHRhZ2UsCisJLmZvcmNlX3Bvd2VyX2Rvd24gPSBydHN4X2Jhc2VfZm9yY2VfcG93ZXJfZG93biwKK307CisKK3ZvaWQgcnRzNTI0YV9pbml0X3BhcmFtcyhzdHJ1Y3QgcnRzeF9wY3IgKnBjcikKK3sKKwlydHM1MjQ5X2luaXRfcGFyYW1zKHBjcik7CisKKwlwY3ItPnJlZ19wbV9jdHJsMyA9IFJUUzUyNEFfUE1fQ1RSTDM7CisJcGNyLT5vcHMgPSAmcnRzNTI0YV9wY3Jfb3BzOworfQorCitzdGF0aWMgaW50IHJ0czUyNWFfY2FyZF9wb3dlcl9vbihzdHJ1Y3QgcnRzeF9wY3IgKnBjciwgaW50IGNhcmQpCit7CisJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBMRE9fVkNDX0NGRzEsCisJCUxET19WQ0NfVFVORV9NQVNLLCBMRE9fVkNDXzNWMyk7CisJcmV0dXJuIHJ0c3hfYmFzZV9jYXJkX3Bvd2VyX29uKHBjciwgY2FyZCk7Cit9CisKK3N0YXRpYyBpbnQgcnRzNTI1YV9zd2l0Y2hfb3V0cHV0X3ZvbHRhZ2Uoc3RydWN0IHJ0c3hfcGNyICpwY3IsIHU4IHZvbHRhZ2UpCit7CisJc3dpdGNoICh2b2x0YWdlKSB7CisJY2FzZSBPVVRQVVRfM1YzOgorCQlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIExET19DT05GSUcyLAorCQkJTERPX0QzMzE4X01BU0ssIExET19EMzMxOF8zM1YpOworCQlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIFNEX1BBRF9DVEwsIFNEX0lPX1VTSU5HXzFWOCwgMCk7CisJCWJyZWFrOworCWNhc2UgT1VUUFVUXzFWODoKKwkJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBMRE9fQ09ORklHMiwKKwkJCUxET19EMzMxOF9NQVNLLCBMRE9fRDMzMThfMThWKTsKKwkJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBTRF9QQURfQ1RMLCBTRF9JT19VU0lOR18xVjgsCisJCQlTRF9JT19VU0lOR18xVjgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlydHN4X3BjaV9pbml0X2NtZChwY3IpOworCXJ0czUyNDlfZmlsbF9kcml2aW5nKHBjciwgdm9sdGFnZSk7CisJcmV0dXJuIHJ0c3hfcGNpX3NlbmRfY21kKHBjciwgMTAwKTsKK30KKworc3RhdGljIGludCBydHM1MjVhX29wdGltaXplX3BoeShzdHJ1Y3QgcnRzeF9wY3IgKnBjcikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBSVFM1MjRBX1BNX0NUUkwzLAorCQlEM19ERUxJTktfTU9ERV9FTiwgMHgwMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlydHN4X3BjaV93cml0ZV9waHlfcmVnaXN0ZXIocGNyLCBfUEhZX0ZMRDAsCisJCV9QSFlfRkxEMF9DTEtfUkVRXzIwQyB8IF9QSFlfRkxEMF9SWF9JRExFX0VOIHwKKwkJX1BIWV9GTEQwX0JJVF9FUlJfUlNUTiB8IF9QSFlfRkxEMF9CRVJfQ09VTlQgfAorCQlfUEhZX0ZMRDBfQkVSX1RJTUVSIHwgX1BIWV9GTEQwX0NIRUNLX0VOKTsKKworCXJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIF9QSFlfQU5BMDMsCisJCV9QSFlfQU5BMDNfVElNRVJfTUFYIHwgX1BIWV9BTkEwM19PT0JTX0RFQl9FTiB8CisJCV9QSFlfQ01VX0RFQlVHX0VOKTsKKworCWlmIChpc192ZXJzaW9uKHBjciwgMHg1MjVBLCBJQ19WRVJfQSkpCisJCXJ0c3hfcGNpX3dyaXRlX3BoeV9yZWdpc3RlcihwY3IsIF9QSFlfUkVWMCwKKwkJCV9QSFlfUkVWMF9GSUxURVJfT1VUIHwgX1BIWV9SRVYwX0NEUl9CWVBBU1NfUEZEIHwKKwkJCV9QSFlfUkVWMF9DRFJfUlhfSURMRV9CWVBBU1MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRzNTI1YV9leHRyYV9pbml0X2h3KHN0cnVjdCBydHN4X3BjciAqcGNyKQoreworCXJ0czUyNDlfZXh0cmFfaW5pdF9odyhwY3IpOworCisJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBQQ0xLX0NUTCwgUENMS19NT0RFX1NFTCwgUENMS19NT0RFX1NFTCk7CisJaWYgKGlzX3ZlcnNpb24ocGNyLCAweDUyNUEsIElDX1ZFUl9BKSkgeworCQlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIEwxU1VCX0NPTkZJRzIsCisJCQlMMVNVQl9BVVRPX0NGRywgTDFTVUJfQVVUT19DRkcpOworCQlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIFJSRUZfQ0ZHLAorCQkJUlJFRl9WQkdTRUxfTUFTSywgUlJFRl9WQkdTRUxfMVYyNSk7CisJCXJ0c3hfcGNpX3dyaXRlX3JlZ2lzdGVyKHBjciwgTERPX1ZJT19DRkcsCisJCQlMRE9fVklPX1RVTkVfTUFTSywgTERPX1ZJT18xVjcpOworCQlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIExET19EVjEyU19DRkcsCisJCQlMRE9fRDEyX1RVTkVfTUFTSywgTERPX0QxMl9UVU5FX0RGKTsKKwkJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBMRE9fQVYxMlNfQ0ZHLAorCQkJTERPX0FWMTJTX1RVTkVfTUFTSywgTERPX0FWMTJTX1RVTkVfREYpOworCQlydHN4X3BjaV93cml0ZV9yZWdpc3RlcihwY3IsIExET19WQ0NfQ0ZHMCwKKwkJCUxET19WQ0NfTE1UVlRIX01BU0ssIExET19WQ0NfTE1UVlRIXzJBKTsKKwkJcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBPT0JTX0NPTkZJRywKKwkJCU9PQlNfQVVUT0tfRElTIHwgT09CU19WQUxfTUFTSywgMHg4OSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGNyX29wcyBydHM1MjVhX3Bjcl9vcHMgPSB7CisJLmZldGNoX3ZlbmRvcl9zZXR0aW5ncyA9IHJ0c3hfYmFzZV9mZXRjaF92ZW5kb3Jfc2V0dGluZ3MsCisJLmV4dHJhX2luaXRfaHcgPSBydHM1MjVhX2V4dHJhX2luaXRfaHcsCisJLm9wdGltaXplX3BoeSA9IHJ0czUyNWFfb3B0aW1pemVfcGh5LAorCS50dXJuX29uX2xlZCA9IHJ0c3hfYmFzZV90dXJuX29uX2xlZCwKKwkudHVybl9vZmZfbGVkID0gcnRzeF9iYXNlX3R1cm5fb2ZmX2xlZCwKKwkuZW5hYmxlX2F1dG9fYmxpbmsgPSBydHN4X2Jhc2VfZW5hYmxlX2F1dG9fYmxpbmssCisJLmRpc2FibGVfYXV0b19ibGluayA9IHJ0c3hfYmFzZV9kaXNhYmxlX2F1dG9fYmxpbmssCisJLmNhcmRfcG93ZXJfb24gPSBydHM1MjVhX2NhcmRfcG93ZXJfb24sCisJLmNhcmRfcG93ZXJfb2ZmID0gcnRzeF9iYXNlX2NhcmRfcG93ZXJfb2ZmLAorCS5zd2l0Y2hfb3V0cHV0X3ZvbHRhZ2UgPSBydHM1MjVhX3N3aXRjaF9vdXRwdXRfdm9sdGFnZSwKKwkuZm9yY2VfcG93ZXJfZG93biA9IHJ0c3hfYmFzZV9mb3JjZV9wb3dlcl9kb3duLAorfTsKKwordm9pZCBydHM1MjVhX2luaXRfcGFyYW1zKHN0cnVjdCBydHN4X3BjciAqcGNyKQoreworCXJ0czUyNDlfaW5pdF9wYXJhbXMocGNyKTsKKworCXBjci0+cmVnX3BtX2N0cmwzID0gUlRTNTI0QV9QTV9DVFJMMzsKKwlwY3ItPm9wcyA9ICZydHM1MjVhX3Bjcl9vcHM7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3J0c3hfZ29wcy5jIGIvZHJpdmVycy9tZmQvcnRzeF9nb3BzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYTk4YzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZmQvcnRzeF9nb3BzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKiBEcml2ZXIgZm9yIFJlYWx0ZWsgUENJLUV4cHJlc3MgY2FyZCByZWFkZXIKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOS0yMDEzIFJlYWx0ZWsgU2VtaWNvbmR1Y3RvciBDb3JwLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAqIGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KLSAqCi0gKiBBdXRob3I6Ci0gKiAgIE1pY2t5IENoaW5nIDxtaWNreV9jaGluZ0ByZWFsc2lsLmNvbS5jbj4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbWZkL3J0c3hfcGNpLmg+Ci0jaW5jbHVkZSAicnRzeF9wY3IuaCIKLQotaW50IHJ0c3hfZ29wc19wbV9yZXNldChzdHJ1Y3QgcnRzeF9wY3IgKnBjcikKLXsKLQlpbnQgZXJyOwotCi0JLyogaW5pdCBhc3BtICovCi0JcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBBU1BNX0ZPUkNFX0NUTCwgMHhGRiwgMHgwMCk7Ci0JZXJyID0gcnRzeF9wY2lfdXBkYXRlX2NmZ19ieXRlKHBjciwgTENUTFIsIH5MQ1RMUl9BU1BNX0NUTF9NQVNLLCAweDAwKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCS8qIHJlc2V0IFBNX0NUUkwzIGJlZm9yZSBzZW5kIGJ1ZmZlciBjbWQgKi8KLQlyZXR1cm4gcnRzeF9wY2lfd3JpdGVfcmVnaXN0ZXIocGNyLCBQTV9DVFJMMywgRDNfREVMSU5LX01PREVfRU4sIDB4MDApOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvcnRzeF9wY3IuYyBiL2RyaXZlcnMvbWZkL3J0c3hfcGNyLmMKaW5kZXggMzBmN2NhOC4uYTY2NTQwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvcnRzeF9wY3IuYworKysgYi9kcml2ZXJzL21mZC9ydHN4X3Bjci5jCkBAIC01OCwxMSArNTgsMjUgQEAKIAl7IFBDSV9ERVZJQ0UoMHgxMEVDLCAweDUyNDkpLCBQQ0lfQ0xBU1NfT1RIRVJTIDw8IDE2LCAweEZGMDAwMCB9LAogCXsgUENJX0RFVklDRSgweDEwRUMsIDB4NTI4NyksIFBDSV9DTEFTU19PVEhFUlMgPDwgMTYsIDB4RkYwMDAwIH0sCiAJeyBQQ0lfREVWSUNFKDB4MTBFQywgMHg1Mjg2KSwgUENJX0NMQVNTX09USEVSUyA8PCAxNiwgMHhGRjAwMDAgfSwKKwl7IFBDSV9ERVZJQ0UoMHgxMEVDLCAweDUyNEEpLCBQQ0lfQ0xBU1NfT1RIRVJTIDw8IDE2LCAweEZGMDAwMCB9LAorCXsgUENJX0RFVklDRSgweDEwRUMsIDB4NTI1QSksIFBDSV9DTEFTU19PVEhFUlMgPDwgMTYsIDB4RkYwMDAwIH0sCiAJeyAwLCB9CiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnRzeF9wY2lfaWRzKTsKIAorc3RhdGljIGlubGluZSB2b2lkIHJ0c3hfcGNpX2VuYWJsZV9hc3BtKHN0cnVjdCBydHN4X3BjciAqcGNyKQoreworCXJ0c3hfcGNpX3VwZGF0ZV9jZmdfYnl0ZShwY3IsIHBjci0+cGNpZV9jYXAgKyBQQ0lfRVhQX0xOS0NUTCwKKwkJMHhGQywgcGNyLT5hc3BtX2VuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ0c3hfcGNpX2Rpc2FibGVfYXNwbShzdHJ1Y3QgcnRzeF9wY3IgKnBjcikKK3sKKwlydHN4X3BjaV91cGRhdGVfY2ZnX2J5dGUocGNyLCBwY3ItPnBjaWVfY2FwICsgUENJX0VYUF9MTktDVEwsCisJCTB4RkMsIDApOworfQorCiB2b2lkIHJ0c3hfcGNpX3N0YXJ0X3J1bihzdHJ1Y3QgcnRzeF9wY3IgKnBjcikKIHsKIAkvKiBJZiBwY2kgZGV2aWNlIHJlbW92ZWQsIGRvbid0IHF1ZXVlIGlkbGUgd29yayBhbnkgbW9yZSAqLwpAQCAtNzUsNyArODksNyBAQAogCQkJcGNyLT5vcHMtPmVuYWJsZV9hdXRvX2JsaW5rKHBjcik7CiAKIAkJaWYgKHBjci0+YXNwbV9lbikKLQkJCXJ0c3hfcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjciwgTENUTFIsIDApOworCQkJcnRzeF9wY2lfZGlzYWJsZV9hc3BtKHBjcik7CiAJfQogCiAJbW9kX2RlbGF5ZWRfd29yayhzeXN0ZW1fd3EsICZwY3ItPmlkbGVfd29yaywgbXNlY3NfdG9famlmZmllcygyMDApKTsKQEAgLTEzMCw3ICsxNDQsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocnRzeF9wY2lfcmVhZF9yZWdpc3Rlcik7CiAKLWludCBydHN4X3BjaV93cml0ZV9waHlfcmVnaXN0ZXIoc3RydWN0IHJ0c3hfcGNyICpwY3IsIHU4IGFkZHIsIHUxNiB2YWwpCitpbnQgX19ydHN4X3BjaV93cml0ZV9waHlfcmVnaXN0ZXIoc3RydWN0IHJ0c3hfcGNyICpwY3IsIHU4IGFkZHIsIHUxNiB2YWwpCiB7CiAJaW50IGVyciwgaSwgZmluaXNoZWQgPSAwOwogCXU4IHRtcDsKQEAgLTE2Miw5ICsxNzYsMTcgQEAKIAogCXJldHVybiAwOwogfQorCitpbnQgcnRzeF9wY2lfd3JpdGVfcGh5X3JlZ2lzdGVyKHN0cnVjdCBydHN4X3BjciAqcGNyLCB1OCBhZGRyLCB1MTYgdmFsKQoreworCWlmIChwY3ItPm9wcy0+d3JpdGVfcGh5KQorCQlyZXR1cm4gcGNyLT5vcHMtPndyaXRlX3BoeShwY3IsIGFkZHIsIHZhbCk7CisKKwlyZXR1cm4gX19ydHN4X3BjaV93cml0ZV9waHlfcmVnaXN0ZXIocGNyLCBhZGRyLCB2YWwpOworfQogRVhQT1JUX1NZTUJPTF9HUEwocnRzeF9wY2lfd3JpdGVfcGh5X3JlZ2lzdGVyKTsKIAotaW50IHJ0c3hfcGNpX3JlYWRfcGh5X3JlZ2lzdGVyKHN0cnVjdCBydHN4X3BjciAqcGNyLCB1OCBhZGRyLCB1MTYgKnZhbCkKK2ludCBfX3J0c3hfcGNpX3JlYWRfcGh5X3JlZ2lzdGVyKHN0cnVjdCBydHN4X3BjciAqcGNyLCB1OCBhZGRyLCB1MTYgKnZhbCkKIHsKIAlpbnQgZXJyLCBpLCBmaW5pc2hlZCA9IDA7CiAJdTE2IGRhdGE7CkBAIC0yMTAsNiArMjMyLDE0IEBACiAKIAlyZXR1cm4gMDsKIH0KKworaW50IHJ0c3hfcGNpX3JlYWRfcGh5X3JlZ2lzdGVyKHN0cnVjdCBydHN4X3BjciAqcGNyLCB1OCBhZGRyLCB1MTYgKnZhbCkKK3sKKwlpZiAocGNyLT5vcHMtPnJlYWRfcGh5KQorCQlyZXR1cm4gcGNyLT5vcHMtPnJlYWRfcGh5KHBjciwgYWRkciwgdmFsKTsKKworCXJldHVybiBfX3J0c3hfcGNpX3JlYWRfcGh5X3JlZ2lzdGVyKHBjciwgYWRkciwgdmFsKTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0c3hfcGNpX3JlYWRfcGh5X3JlZ2lzdGVyKTsKIAogdm9pZCBydHN4X3BjaV9zdG9wX2NtZChzdHJ1Y3QgcnRzeF9wY3IgKnBjcikKQEAgLTI4Niw4ICszMTYsNyBAQAogCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCiAJCQkmdHJhbnNfZG9uZSwgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7CiAJaWYgKHRpbWVsZWZ0IDw9IDApIHsKLQkJZGV2X2RiZygmKHBjci0+cGNpLT5kZXYpLCAiVGltZW91dCAoJXMgJWQpXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXBjcl9kYmcocGNyLCAiVGltZW91dCAoJXMgJWQpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQllcnIgPSAtRVRJTUVET1VUOwogCQlnb3RvIGZpbmlzaF9zZW5kX2NtZDsKIAl9CkBAIC0zMjMsOCArMzUyLDcgQEAKIAl1NjQgdmFsOwogCXU4IG9wdGlvbiA9IFNHX1ZBTElEIHwgU0dfVFJBTlNfREFUQTsKIAotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIkRNQSBhZGRyOiAweCV4LCBMZW46IDB4JXhcbiIsCi0JCQkodW5zaWduZWQgaW50KWFkZHIsIGxlbik7CisJcGNyX2RiZyhwY3IsICJETUEgYWRkcjogMHgleCwgTGVuOiAweCV4XG4iLCAodW5zaWduZWQgaW50KWFkZHIsIGxlbik7CiAKIAlpZiAoZW5kKQogCQlvcHRpb24gfD0gU0dfRU5EOwpAQCAtMzM5LDExICszNjcsMTEgQEAKIHsKIAlpbnQgZXJyID0gMCwgY291bnQ7CiAKLQlkZXZfZGJnKCYocGNyLT5wY2ktPmRldiksICItLT4gJXM6IG51bV9zZyA9ICVkXG4iLCBfX2Z1bmNfXywgbnVtX3NnKTsKKwlwY3JfZGJnKHBjciwgIi0tPiAlczogbnVtX3NnID0gJWRcbiIsIF9fZnVuY19fLCBudW1fc2cpOwogCWNvdW50ID0gcnRzeF9wY2lfZG1hX21hcF9zZyhwY3IsIHNnbGlzdCwgbnVtX3NnLCByZWFkKTsKIAlpZiAoY291bnQgPCAxKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlkZXZfZGJnKCYocGNyLT5wY2ktPmRldiksICJETUEgbWFwcGluZyBjb3VudDogJWRcbiIsIGNvdW50KTsKKwlwY3JfZGJnKHBjciwgIkRNQSBtYXBwaW5nIGNvdW50OiAlZFxuIiwgY291bnQpOwogCiAJZXJyID0gcnRzeF9wY2lfZG1hX3RyYW5zZmVyKHBjciwgc2dsaXN0LCBjb3VudCwgcmVhZCwgdGltZW91dCk7CiAKQEAgLTQxNyw4ICs0NDUsNyBAQAogCXRpbWVsZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoCiAJCQkmdHJhbnNfZG9uZSwgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7CiAJaWYgKHRpbWVsZWZ0IDw9IDApIHsKLQkJZGV2X2RiZygmKHBjci0+cGNpLT5kZXYpLCAiVGltZW91dCAoJXMgJWQpXG4iLAotCQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXBjcl9kYmcocGNyLCAiVGltZW91dCAoJXMgJWQpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQllcnIgPSAtRVRJTUVET1VUOwogCQlnb3RvIG91dDsKIAl9CkBAIC01OTIsNyArNjE5LDcgQEAKIAkvKiBFbmFibGUgQnVzIEludGVycnVwdCAqLwogCXJ0c3hfcGNpX3dyaXRlbChwY3IsIFJUU1hfQklFUiwgcGNyLT5iaWVyKTsKIAotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIlJUU1hfQklFUjogMHglMDh4XG4iLCBwY3ItPmJpZXIpOworCXBjcl9kYmcocGNyLCAiUlRTWF9CSUVSOiAweCUwOHhcbiIsIHBjci0+Ymllcik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTggZG91YmxlX3NzY19kZXB0aCh1OCBkZXB0aCkKQEAgLTYzOCwxNCArNjY1LDEzIEBACiAJCXJldHVybiBlcnI7CiAKIAljYXJkX2Nsb2NrIC89IDEwMDAwMDA7Ci0JZGV2X2RiZygmKHBjci0+cGNpLT5kZXYpLCAiU3dpdGNoIGNhcmQgY2xvY2sgdG8gJWRNSHpcbiIsIGNhcmRfY2xvY2spOworCXBjcl9kYmcocGNyLCAiU3dpdGNoIGNhcmQgY2xvY2sgdG8gJWRNSHpcbiIsIGNhcmRfY2xvY2spOwogCiAJY2xrID0gY2FyZF9jbG9jazsKIAlpZiAoIWluaXRpYWxfbW9kZSAmJiBkb3VibGVfY2xrKQogCQljbGsgPSBjYXJkX2Nsb2NrICogMjsKLQlkZXZfZGJnKCYocGNyLT5wY2ktPmRldiksCi0JCQkiSW50ZXJuYWwgU1NDIGNsb2NrOiAlZE1IeiAoY3VyX2Nsb2NrID0gJWQpXG4iLAotCQkJY2xrLCBwY3ItPmN1cl9jbG9jayk7CisJcGNyX2RiZyhwY3IsICJJbnRlcm5hbCBTU0MgY2xvY2s6ICVkTUh6IChjdXJfY2xvY2sgPSAlZClcbiIsCisJCWNsaywgcGNyLT5jdXJfY2xvY2spOwogCiAJaWYgKGNsayA9PSBwY3ItPmN1cl9jbG9jaykKIAkJcmV0dXJuIDA7CkBAIC02NzQsMTQgKzcwMCwxNCBAQAogCQl9CiAJCWRpdisrOwogCX0KLQlkZXZfZGJnKCYocGNyLT5wY2ktPmRldiksICJuID0gJWQsIGRpdiA9ICVkXG4iLCBuLCBkaXYpOworCXBjcl9kYmcocGNyLCAibiA9ICVkLCBkaXYgPSAlZFxuIiwgbiwgZGl2KTsKIAogCXNzY19kZXB0aCA9IGRlcHRoW3NzY19kZXB0aF07CiAJaWYgKGRvdWJsZV9jbGspCiAJCXNzY19kZXB0aCA9IGRvdWJsZV9zc2NfZGVwdGgoc3NjX2RlcHRoKTsKIAogCXNzY19kZXB0aCA9IHJldmlzZV9zc2NfZGVwdGgoc3NjX2RlcHRoLCBkaXYpOwotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgInNzY19kZXB0aCA9ICVkXG4iLCBzc2NfZGVwdGgpOworCXBjcl9kYmcocGNyLCAic3NjX2RlcHRoID0gJWRcbiIsIHNzY19kZXB0aCk7CiAKIAlydHN4X3BjaV9pbml0X2NtZChwY3IpOwogCXJ0c3hfcGNpX2FkZF9jbWQocGNyLCBXUklURV9SRUdfQ01ELCBDTEtfQ1RMLApAQCAtODAzLDEzICs4MjksMTMgQEAKIAlkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKIAlwY3IgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBydHN4X3BjciwgY2FyZGRldF93b3JrKTsKIAotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIi0tPiAlc1xuIiwgX19mdW5jX18pOworCXBjcl9kYmcocGNyLCAiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAKIAltdXRleF9sb2NrKCZwY3ItPnBjcl9tdXRleCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjci0+bG9jaywgZmxhZ3MpOwogCiAJaXJxX3N0YXR1cyA9IHJ0c3hfcGNpX3JlYWRsKHBjciwgUlRTWF9CSVBSKTsKLQlkZXZfZGJnKCYocGNyLT5wY2ktPmRldiksICJpcnFfc3RhdHVzOiAweCUwOHhcbiIsIGlycV9zdGF0dXMpOworCXBjcl9kYmcocGNyLCAiaXJxX3N0YXR1czogMHglMDh4XG4iLCBpcnFfc3RhdHVzKTsKIAogCWlycV9zdGF0dXMgJj0gQ0FSRF9FWElTVDsKIAljYXJkX2luc2VydGVkID0gcGNyLT5jYXJkX2luc2VydGVkICYgaXJxX3N0YXR1czsKQEAgLTgyMCw5ICs4NDYsOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjci0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGNhcmRfaW5zZXJ0ZWQgfHwgY2FyZF9yZW1vdmVkKSB7Ci0JCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwKLQkJCQkiY2FyZF9pbnNlcnRlZDogMHgleCwgY2FyZF9yZW1vdmVkOiAweCV4XG4iLAotCQkJCWNhcmRfaW5zZXJ0ZWQsIGNhcmRfcmVtb3ZlZCk7CisJCXBjcl9kYmcocGNyLCAiY2FyZF9pbnNlcnRlZDogMHgleCwgY2FyZF9yZW1vdmVkOiAweCV4XG4iLAorCQkJY2FyZF9pbnNlcnRlZCwgY2FyZF9yZW1vdmVkKTsKIAogCQlpZiAocGNyLT5vcHMtPmNkX2RlZ2xpdGNoKQogCQkJY2FyZF9pbnNlcnRlZCA9IHBjci0+b3BzLT5jZF9kZWdsaXRjaChwY3IpOwpAQCAtOTMwLDcgKzk1NSw3IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29yayk7CiAJc3RydWN0IHJ0c3hfcGNyICpwY3IgPSBjb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCBydHN4X3BjciwgaWRsZV93b3JrKTsKIAotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIi0tPiAlc1xuIiwgX19mdW5jX18pOworCXBjcl9kYmcocGNyLCAiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CiAKIAltdXRleF9sb2NrKCZwY3ItPnBjcl9tdXRleCk7CiAKQEAgLTk0Miw3ICs5NjcsNyBAQAogCQlwY3ItPm9wcy0+dHVybl9vZmZfbGVkKHBjcik7CiAKIAlpZiAocGNyLT5hc3BtX2VuKQotCQlydHN4X3BjaV93cml0ZV9jb25maWdfYnl0ZShwY3IsIExDVExSLCBwY3ItPmFzcG1fZW4pOworCQlydHN4X3BjaV9lbmFibGVfYXNwbShwY3IpOwogCiAJbXV0ZXhfdW5sb2NrKCZwY3ItPnBjcl9tdXRleCk7CiB9CkBAIC05NjgsNiArOTkzLDcgQEAKIHsKIAlpbnQgZXJyOwogCisJcGNyLT5wY2llX2NhcCA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGNyLT5wY2ksIFBDSV9DQVBfSURfRVhQKTsKIAlydHN4X3BjaV93cml0ZWwocGNyLCBSVFNYX0hDQkFSLCBwY3ItPmhvc3RfY21kc19hZGRyKTsKIAogCXJ0c3hfcGNpX2VuYWJsZV9idXNfaW50KHBjcik7CkBAIC05ODAsNiArMTAwNiw3IEBACiAJLyogV2FpdCBTU0MgcG93ZXIgc3RhYmxlICovCiAJdWRlbGF5KDIwMCk7CiAKKwlydHN4X3BjaV9kaXNhYmxlX2FzcG0ocGNyKTsKIAlpZiAocGNyLT5vcHMtPm9wdGltaXplX3BoeSkgewogCQllcnIgPSBwY3ItPm9wcy0+b3B0aW1pemVfcGh5KHBjcik7CiAJCWlmIChlcnIgPCAwKQpAQCAtMTAyOCwxMCArMTA1NSw4IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlydHN4X3BjaV93cml0ZV9jb25maWdfYnl0ZShwY3IsIExDVExSLCAwKTsKLQogCS8qIEVuYWJsZSBjbGtfcmVxdWVzdF9uIHRvIGVuYWJsZSBjbG9jayBwb3dlciBtYW5hZ2VtZW50ICovCi0JcnRzeF9wY2lfd3JpdGVfY29uZmlnX2J5dGUocGNyLCAweDgxLCAxKTsKKwlydHN4X3BjaV93cml0ZV9jb25maWdfYnl0ZShwY3IsIHBjci0+cGNpZV9jYXAgKyBQQ0lfRVhQX0xOS0NUTCArIDEsIDEpOwogCS8qIEVudGVyIEwxIHdoZW4gaG9zdCB0eCBpZGxlICovCiAJcnRzeF9wY2lfd3JpdGVfY29uZmlnX2J5dGUocGNyLCAweDcwRiwgMHg1Qik7CiAKQEAgLTEwODEsNiArMTEwNiwxNCBAQAogCQlydHM1MjQ5X2luaXRfcGFyYW1zKHBjcik7CiAJCWJyZWFrOwogCisJY2FzZSAweDUyNEE6CisJCXJ0czUyNGFfaW5pdF9wYXJhbXMocGNyKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4NTI1QToKKwkJcnRzNTI1YV9pbml0X3BhcmFtcyhwY3IpOworCQlicmVhazsKKwogCWNhc2UgMHg1Mjg3OgogCQlydGw4NDExYl9pbml0X3BhcmFtcyhwY3IpOwogCQlicmVhazsKQEAgLTEwOTAsNyArMTEyMyw3IEBACiAJCWJyZWFrOwogCX0KIAotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgIlBJRDogMHglMDR4LCBJQyB2ZXJzaW9uOiAweCUwMnhcbiIsCisJcGNyX2RiZyhwY3IsICJQSUQ6IDB4JTA0eCwgSUMgdmVyc2lvbjogMHglMDJ4XG4iLAogCQkJUENJX1BJRChwY3IpLCBwY3ItPmljX3ZlcnNpb24pOwogCiAJcGNyLT5zbG90cyA9IGtjYWxsb2MocGNyLT5udW1fc2xvdHMsIHNpemVvZihzdHJ1Y3QgcnRzeF9zbG90KSwKQEAgLTExMDEsMTQgKzExMzQsMTQgQEAKIAlpZiAocGNyLT5vcHMtPmZldGNoX3ZlbmRvcl9zZXR0aW5ncykKIAkJcGNyLT5vcHMtPmZldGNoX3ZlbmRvcl9zZXR0aW5ncyhwY3IpOwogCi0JZGV2X2RiZygmKHBjci0+cGNpLT5kZXYpLCAicGNyLT5hc3BtX2VuID0gMHgleFxuIiwgcGNyLT5hc3BtX2VuKTsKLQlkZXZfZGJnKCYocGNyLT5wY2ktPmRldiksICJwY3ItPnNkMzBfZHJpdmVfc2VsXzF2OCA9IDB4JXhcbiIsCisJcGNyX2RiZyhwY3IsICJwY3ItPmFzcG1fZW4gPSAweCV4XG4iLCBwY3ItPmFzcG1fZW4pOworCXBjcl9kYmcocGNyLCAicGNyLT5zZDMwX2RyaXZlX3NlbF8xdjggPSAweCV4XG4iLAogCQkJcGNyLT5zZDMwX2RyaXZlX3NlbF8xdjgpOwotCWRldl9kYmcoJihwY3ItPnBjaS0+ZGV2KSwgInBjci0+c2QzMF9kcml2ZV9zZWxfM3YzID0gMHgleFxuIiwKKwlwY3JfZGJnKHBjciwgInBjci0+c2QzMF9kcml2ZV9zZWxfM3YzID0gMHgleFxuIiwKIAkJCXBjci0+c2QzMF9kcml2ZV9zZWxfM3YzKTsKLQlkZXZfZGJnKCYocGNyLT5wY2ktPmRldiksICJwY3ItPmNhcmRfZHJpdmVfc2VsID0gMHgleFxuIiwKKwlwY3JfZGJnKHBjciwgInBjci0+Y2FyZF9kcml2ZV9zZWwgPSAweCV4XG4iLAogCQkJcGNyLT5jYXJkX2RyaXZlX3NlbCk7Ci0JZGV2X2RiZygmKHBjci0+cGNpLT5kZXYpLCAicGNyLT5mbGFncyA9IDB4JXhcbiIsIHBjci0+ZmxhZ3MpOworCXBjcl9kYmcocGNyLCAicGNyLT5mbGFncyA9IDB4JXhcbiIsIHBjci0+ZmxhZ3MpOwogCiAJcGNyLT5zdGF0ZSA9IFBERVZfU1RBVF9JRExFOwogCWVyciA9IHJ0c3hfcGNpX2luaXRfaHcocGNyKTsKQEAgLTExMjYsNyArMTE1OSw3IEBACiAJc3RydWN0IHJ0c3hfcGNyICpwY3I7CiAJc3RydWN0IHBjcl9oYW5kbGUgKmhhbmRsZTsKIAl1MzIgYmFzZSwgbGVuOwotCWludCByZXQsIGk7CisJaW50IHJldCwgaSwgYmFyID0gMDsKIAogCWRldl9kYmcoJihwY2lkZXYtPmRldiksCiAJCSI6IFJlYWx0ZWsgUENJLUUgQ2FyZCBSZWFkZXIgZm91bmQgYXQgJXMgWyUwNHg6JTA0eF0gKHJldiAleClcbiIsCkBAIC0xMTcxLDggKzEyMDQsMTAgQEAKIAlwY3ItPnBjaSA9IHBjaWRldjsKIAlkZXZfc2V0X2RydmRhdGEoJnBjaWRldi0+ZGV2LCBoYW5kbGUpOwogCi0JbGVuID0gcGNpX3Jlc291cmNlX2xlbihwY2lkZXYsIDApOwotCWJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKKwlpZiAoQ0hLX1BDSV9QSUQocGNyLCAweDUyNUEpKQorCQliYXIgPSAxOworCWxlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGNpZGV2LCBiYXIpOworCWJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCBiYXIpOwogCXBjci0+cmVtYXBfYWRkciA9IGlvcmVtYXBfbm9jYWNoZShiYXNlLCBsZW4pOwogCWlmICghcGNyLT5yZW1hcF9hZGRyKSB7CiAJCXJldCA9IC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9ydHN4X3Bjci5oIGIvZHJpdmVycy9tZmQvcnRzeF9wY3IuaAppbmRleCBmZTJiYmI2Li5jZTQ4ODQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9ydHN4X3Bjci5oCisrKyBiL2RyaXZlcnMvbWZkL3J0c3hfcGNyLmgKQEAgLTI3LDEyICsyNywyMCBAQAogI2RlZmluZSBNSU5fRElWX05fUENSCQk4MAogI2RlZmluZSBNQVhfRElWX05fUENSCQkyMDgKIAorI2RlZmluZSBSVFM1MjRBX1BNRV9GT1JDRV9DVEwJCTB4RkY3OAorI2RlZmluZSBSVFM1MjRBX1BNX0NUUkwzCQkweEZGN0UKKworaW50IF9fcnRzeF9wY2lfd3JpdGVfcGh5X3JlZ2lzdGVyKHN0cnVjdCBydHN4X3BjciAqcGNyLCB1OCBhZGRyLCB1MTYgdmFsKTsKK2ludCBfX3J0c3hfcGNpX3JlYWRfcGh5X3JlZ2lzdGVyKHN0cnVjdCBydHN4X3BjciAqcGNyLCB1OCBhZGRyLCB1MTYgKnZhbCk7CisKIHZvaWQgcnRzNTIwOV9pbml0X3BhcmFtcyhzdHJ1Y3QgcnRzeF9wY3IgKnBjcik7CiB2b2lkIHJ0czUyMjlfaW5pdF9wYXJhbXMoc3RydWN0IHJ0c3hfcGNyICpwY3IpOwogdm9pZCBydGw4NDExX2luaXRfcGFyYW1zKHN0cnVjdCBydHN4X3BjciAqcGNyKTsKIHZvaWQgcnRsODQwMl9pbml0X3BhcmFtcyhzdHJ1Y3QgcnRzeF9wY3IgKnBjcik7CiB2b2lkIHJ0czUyMjdfaW5pdF9wYXJhbXMoc3RydWN0IHJ0c3hfcGNyICpwY3IpOwogdm9pZCBydHM1MjQ5X2luaXRfcGFyYW1zKHN0cnVjdCBydHN4X3BjciAqcGNyKTsKK3ZvaWQgcnRzNTI0YV9pbml0X3BhcmFtcyhzdHJ1Y3QgcnRzeF9wY3IgKnBjcik7Cit2b2lkIHJ0czUyNWFfaW5pdF9wYXJhbXMoc3RydWN0IHJ0c3hfcGNyICpwY3IpOwogdm9pZCBydGw4NDExYl9pbml0X3BhcmFtcyhzdHJ1Y3QgcnRzeF9wY3IgKnBjcik7CiAKIHN0YXRpYyBpbmxpbmUgdTggbWFwX3NkX2RyaXZlKGludCBpZHgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9ydHN4X3VzYi5jIGIvZHJpdmVycy9tZmQvcnRzeF91c2IuYwppbmRleCBlZGU1MDI0Li5kYmQ5MDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9ydHN4X3VzYi5jCisrKyBiL2RyaXZlcnMvbWZkL3J0c3hfdXNiLmMKQEAgLTE5NiwxOCArMTk2LDI3IEBACiBpbnQgcnRzeF91c2JfZXAwX3JlYWRfcmVnaXN0ZXIoc3RydWN0IHJ0c3hfdWNyICp1Y3IsIHUxNiBhZGRyLCB1OCAqZGF0YSkKIHsKIAl1MTYgdmFsdWU7CisJdTggKmJ1ZjsKKwlpbnQgcmV0OwogCiAJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVJTlZBTDsKLQkqZGF0YSA9IDA7CisKKwlidWYgPSBremFsbG9jKHNpemVvZih1OCksIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWFkZHIgfD0gRVAwX1JFQURfUkVHX0NNRCA8PCBFUDBfT1BfU0hJRlQ7CiAJdmFsdWUgPSBzd2FiMTYoYWRkcik7CiAKLQlyZXR1cm4gdXNiX2NvbnRyb2xfbXNnKHVjci0+cHVzYl9kZXYsCisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHVjci0+cHVzYl9kZXYsCiAJCQl1c2JfcmN2Y3RybHBpcGUodWNyLT5wdXNiX2RldiwgMCksIFJUU1hfVVNCX1JFUV9SRUdfT1AsCiAJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKLQkJCXZhbHVlLCAwLCBkYXRhLCAxLCAxMDApOworCQkJdmFsdWUsIDAsIGJ1ZiwgMSwgMTAwKTsKKwkqZGF0YSA9ICpidWY7CisKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChydHN4X3VzYl9lcDBfcmVhZF9yZWdpc3Rlcik7CiAKQEAgLTI4OCwxOCArMjk3LDI3IEBACiBpbnQgcnRzeF91c2JfZ2V0X2NhcmRfc3RhdHVzKHN0cnVjdCBydHN4X3VjciAqdWNyLCB1MTYgKnN0YXR1cykKIHsKIAlpbnQgcmV0OworCXUxNiAqYnVmOwogCiAJaWYgKCFzdGF0dXMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHBvbGxpbmdfcGlwZSA9PSAwKQorCWlmIChwb2xsaW5nX3BpcGUgPT0gMCkgeworCQlidWYgPSBremFsbG9jKHNpemVvZih1MTYpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidWYpCisJCQlyZXR1cm4gLUVOT01FTTsKKwogCQlyZXQgPSB1c2JfY29udHJvbF9tc2codWNyLT5wdXNiX2RldiwKIAkJCQl1c2JfcmN2Y3RybHBpcGUodWNyLT5wdXNiX2RldiwgMCksCiAJCQkJUlRTWF9VU0JfUkVRX1BPTEwsCiAJCQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCi0JCQkJMCwgMCwgc3RhdHVzLCAyLCAxMDApOwotCWVsc2UKKwkJCQkwLCAwLCBidWYsIDIsIDEwMCk7CisJCSpzdGF0dXMgPSAqYnVmOworCisJCWtmcmVlKGJ1Zik7CisJfSBlbHNlIHsKIAkJcmV0ID0gcnRzeF91c2JfZ2V0X3N0YXR1c193aXRoX2J1bGsodWNyLCBzdGF0dXMpOworCX0KIAogCS8qIHVzYl9jb250cm9sX21zZyBtYXkgcmV0dXJuIHBvc2l0aXZlIHdoZW4gc3VjY2VzcyAqLwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvc2VjLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3NlYy1jb3JlLmMKaW5kZXggMGE3YmM0My4uNGE2OWFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvc2VjLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9zZWMtY29yZS5jCkBAIC02OSw2ICs2OSw4IEBACiAJewogCQkubmFtZSA9ICJzMm1wczExLXBtaWMiLAogCX0sIHsKKwkJLm5hbWUgPSAiczJtcHMxNC1ydGMiLAorCX0sIHsKIAkJLm5hbWUgPSAiczJtcHMxMS1jbGsiLAogCQkub2ZfY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMybXBzMTEtY2xrIiwKIAl9CkBAIC0yNjcsMTAgKzI2OSw4IEBACiAJc3RydWN0IHNlY19wbGF0Zm9ybV9kYXRhICpwZDsKIAogCXBkID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwZCksIEdGUF9LRVJORUwpOwotCWlmICghcGQpIHsKLQkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBwZGF0YVxuIik7CisJaWYgKCFwZCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JfQogCiAJLyoKIAkgKiBUb0RvOiB0aGUgJ3dha2V1cCcgbWVtYmVyIGluIHRoZSBwbGF0Zm9ybSBkYXRhIGlzIG1vcmUgb2YgYSBsaW51eApAQCAtMzMzLDcgKzMzMyw2IEBACiAJfQogCWlmIChwZGF0YSkgewogCQlzZWNfcG1pYy0+ZGV2aWNlX3R5cGUgPSBwZGF0YS0+ZGV2aWNlX3R5cGU7Ci0JCXNlY19wbWljLT5vbm8gPSBwZGF0YS0+b25vOwogCQlzZWNfcG1pYy0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CiAJCXNlY19wbWljLT53YWtldXAgPSBwZGF0YS0+d2FrZXVwOwogCQlzZWNfcG1pYy0+cGRhdGEgPSBwZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3NlYy1pcnEuYyBiL2RyaXZlcnMvbWZkL3NlYy1pcnEuYwppbmRleCBiYTg2YTkxLi44MDZmYThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9zZWMtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvc2VjLWlycS5jCkBAIC02MSwxNCArNjEsMTQgQEAKIAkJLnJlZ19vZmZzZXQgPSAxLAogCQkubWFzayA9IFMyTVBTMTFfSVJRX1JUQzYwU19NQVNLLAogCX0sCi0JW1MyTVBTMTFfSVJRX1JUQ0EwXSA9IHsKLQkJLnJlZ19vZmZzZXQgPSAxLAotCQkubWFzayA9IFMyTVBTMTFfSVJRX1JUQ0EwX01BU0ssCi0JfSwKIAlbUzJNUFMxMV9JUlFfUlRDQTFdID0gewogCQkucmVnX29mZnNldCA9IDEsCiAJCS5tYXNrID0gUzJNUFMxMV9JUlFfUlRDQTFfTUFTSywKIAl9LAorCVtTMk1QUzExX0lSUV9SVENBMF0gPSB7CisJCS5yZWdfb2Zmc2V0ID0gMSwKKwkJLm1hc2sgPSBTMk1QUzExX0lSUV9SVENBMF9NQVNLLAorCX0sCiAJW1MyTVBTMTFfSVJRX1NNUExdID0gewogCQkucmVnX29mZnNldCA9IDEsCiAJCS5tYXNrID0gUzJNUFMxMV9JUlFfU01QTF9NQVNLLApAQCAtNDg0LDYgKzQ4NCwxMiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAorCS8qCisJICogVGhlIHJ0Yy1zNW0gZHJpdmVyIHJlcXVlc3RzIFMyTVBTMTRfSVJRX1JUQ0EwIGFsc28gZm9yIFMyTVBTMTEKKwkgKiBzbyB0aGUgaW50ZXJydXB0IG51bWJlciBtdXN0IGJlIGNvbnNpc3RlbnQuCisJICovCisJQlVJTERfQlVHX09OKCgoZW51bSBzMm1wczE0X2lycSlTMk1QUzExX0lSUV9SVENBMCkgIT0gUzJNUFMxNF9JUlFfUlRDQTApOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3NpNDc2eC1pMmMuYyBiL2RyaXZlcnMvbWZkL3NpNDc2eC1pMmMuYwppbmRleCAwZTRhNzZkLi43Zjg3YzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9zaTQ3NngtaTJjLmMKKysrIGIvZHJpdmVycy9tZmQvc2k0NzZ4LWkyYy5jCkBAIC03NjYsNyArNzY2LDcgQEAKIAkJCSAgIHNpemVvZihzdHJ1Y3QgdjRsMl9yZHNfZGF0YSksCiAJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAocnZhbCkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkNvdWxkIG5vdCBhbGxvYXRlIHRoZSBGSUZPXG4iKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgdGhlIEZJRk9cbiIpOwogCQlnb3RvIGZyZWVfZ3BpbzsKIAl9CiAJbXV0ZXhfaW5pdCgmY29yZS0+cmRzX2RyYWluZXJfc3RhdHVzX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvc2t5ODE0NTIuYyBiL2RyaXZlcnMvbWZkL3NreTgxNDUyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjOWIwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWZkL3NreTgxNDUyLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBza3k4MTQ1Mi5jCVNLWTgxNDUyIE1GRCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBTa3l3b3JrcyBTb2x1dGlvbnMgSW5jLgorICogQXV0aG9yIDogR3l1bmdvaCBZb28gPGphY2sueW9vQHNreXdvcmtzaW5jLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc2t5ODE0NTIuaD4KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHNreTgxNDUyX2NvbmZpZyA9IHsKKwkucmVnX2JpdHMgPSA4LAorCS52YWxfYml0cyA9IDgsCit9OworCitzdGF0aWMgaW50IHNreTgxNDUyX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKwljb25zdCBzdHJ1Y3Qgc2t5ODE0NTJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CisJc3RydWN0IG1mZF9jZWxsIGNlbGxzWzJdOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlpbnQgcmV0OworCisJaWYgKCFwZGF0YSkgeworCQlwZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZGF0YSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJnNreTgxNDUyX2NvbmZpZyk7CisJaWYgKElTX0VSUihyZWdtYXApKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUuZXJyPSVsZFxuIiwgUFRSX0VSUihyZWdtYXApKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKwl9CisKKwlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCByZWdtYXApOworCisJbWVtc2V0KGNlbGxzLCAwLCBzaXplb2YoY2VsbHMpKTsKKwljZWxsc1swXS5uYW1lID0gInNreTgxNDUyLWJhY2tsaWdodCI7CisJY2VsbHNbMF0ub2ZfY29tcGF0aWJsZSA9ICJza3l3b3Jrcyxza3k4MTQ1Mi1iYWNrbGlnaHQiOworCWNlbGxzWzBdLnBsYXRmb3JtX2RhdGEgPSBwZGF0YS0+YmxfcGRhdGE7CisJY2VsbHNbMF0ucGRhdGFfc2l6ZSA9IHNpemVvZigqcGRhdGEtPmJsX3BkYXRhKTsKKwljZWxsc1sxXS5uYW1lID0gInNreTgxNDUyLXJlZ3VsYXRvciI7CisJY2VsbHNbMV0ucGxhdGZvcm1fZGF0YSA9IHBkYXRhLT5yZWd1bGF0b3JfaW5pdF9kYXRhOworCWNlbGxzWzFdLnBkYXRhX3NpemUgPSBzaXplb2YoKnBkYXRhLT5yZWd1bGF0b3JfaW5pdF9kYXRhKTsKKworCXJldCA9IG1mZF9hZGRfZGV2aWNlcyhkZXYsIC0xLCBjZWxscywgQVJSQVlfU0laRShjZWxscyksIE5VTEwsIDAsIE5VTEwpOworCWlmIChyZXQpCisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGFkZCBjaGlsZCBkZXZpY2VzLiBlcnI9JWRcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNreTgxNDUyX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCW1mZF9yZW1vdmVfZGV2aWNlcygmY2xpZW50LT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc2t5ODE0NTJfaWRzW10gPSB7CisJeyAic2t5ODE0NTIiIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHNreTgxNDUyX2lkcyk7CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNreTgxNDUyX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJza3l3b3Jrcyxza3k4MTQ1MiIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc2t5ODE0NTJfb2ZfbWF0Y2gpOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBza3k4MTQ1Ml9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2t5ODE0NTIiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoc2t5ODE0NTJfb2ZfbWF0Y2gpLAorCX0sCisJLnByb2JlID0gc2t5ODE0NTJfcHJvYmUsCisJLnJlbW92ZSA9IHNreTgxNDUyX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBza3k4MTQ1Ml9pZHMsCit9OworCittb2R1bGVfaTJjX2RyaXZlcihza3k4MTQ1Ml9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNreXdvcmtzIFNLWTgxNDUyIE1GRCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkd5dW5nb2ggWW9vIDxqYWNrLnlvb0Bza3l3b3Jrc2luYy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90YzM1ODl4LmMgYi9kcml2ZXJzL21mZC90YzM1ODl4LmMKaW5kZXggYWFjYjM3Mi4uY2YzNTYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdGMzNTg5eC5jCisrKyBiL2RyaXZlcnMvbWZkL3RjMzU4OXguYwpAQCAtMzE4LDcgKzMxOCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotI2lmZGVmIENPTkZJR19PRgogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGMzNTg5eF9tYXRjaFtdID0gewogCS8qIExlZ2FjeSBjb21wYXRpYmxlIHN0cmluZyAqLwogCXsgLmNvbXBhdGlibGUgPSAidGMzNTg5eCIsIC5kYXRhID0gKHZvaWQgKikgVEMzNTg5WF9VTktOT1dOIH0sCkBAIC0zNTksMTQgKzM1OCw2IEBACiAKIAlyZXR1cm4gcGRhdGE7CiB9Ci0jZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgdGMzNTg5eF9wbGF0Zm9ybV9kYXRhICoKLXRjMzU4OXhfb2ZfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBlbnVtIHRjMzU4OXhfdmVyc2lvbiAqdmVyc2lvbikKLXsKLQlkZXZfZXJyKGRldiwgIm5vIGRldmljZSB0cmVlIHN1cHBvcnRcbiIpOwotCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwotfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgdGMzNTg5eF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAogCQkJCSAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3RpX2FtMzM1eF90c2NhZGMuYyBiL2RyaXZlcnMvbWZkL3RpX2FtMzM1eF90c2NhZGMuYwppbmRleCA0NjdjODBlLi5lNGU0YjIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90aV9hbTMzNXhfdHNjYWRjLmMKKysrIGIvZHJpdmVycy9tZmQvdGlfYW0zMzV4X3RzY2FkYy5jCkBAIC02OCwxMiArNjgsNiBAQAogCURFRklORV9XQUlUKHdhaXQpOwogCXUzMiByZWc7CiAKLQkvKgotCSAqIGRpc2FibGUgVFNDIHN0ZXBzIHNvIGl0IGRvZXMgbm90IHJ1biB3aGlsZSB0aGUgQURDIGlzIHVzaW5nIGl0LiBJZgotCSAqIHdyaXRlIDAgd2hpbGUgaXQgaXMgcnVubmluZyAoaXQganVzdCBzdGFydGVkIG9yIHdhcyBhbHJlYWR5IHJ1bm5pbmcpCi0JICogdGhlbiBpdCBjb21wbGV0ZXMgYWxsIHN0ZXBzIHRoYXQgd2VyZSBlbmFibGVkIGFuZCBzdG9wcyB0aGVuLgotCSAqLwotCXRzY2FkY193cml0ZWwodHNhZGMsIFJFR19TRSwgMCk7CiAJcmVnID0gdHNjYWRjX3JlYWRsKHRzYWRjLCBSRUdfQURDRlNNKTsKIAlpZiAocmVnICYgU0VRX1NUQVRVUykgewogCQl0c2FkYy0+YWRjX3dhaXRpbmcgPSB0cnVlOwpAQCAtODYsOCArODAsMTIgQEAKIAkJc3Bpbl9sb2NrX2lycSgmdHNhZGMtPnJlZ19sb2NrKTsKIAkJZmluaXNoX3dhaXQoJnRzYWRjLT5yZWdfc2Vfd2FpdCwgJndhaXQpOwogCisJCS8qCisJCSAqIFNlcXVlbmNlciBzaG91bGQgZWl0aGVyIGJlIGlkbGUgb3IKKwkJICogYnVzeSBhcHBseWluZyB0aGUgY2hhcmdlIHN0ZXAuCisJCSAqLwogCQlyZWcgPSB0c2NhZGNfcmVhZGwodHNhZGMsIFJFR19BRENGU00pOwotCQlXQVJOX09OKHJlZyAmIFNFUV9TVEFUVVMpOworCQlXQVJOX09OKChyZWcgJiBTRVFfU1RBVFVTKSAmJiAhKHJlZyAmIENIQVJHRV9TVEVQKSk7CiAJCXRzYWRjLT5hZGNfd2FpdGluZyA9IGZhbHNlOwogCX0KIAl0c2FkYy0+YWRjX2luX3VzZSA9IHRydWU7CkBAIC05Niw3ICs5NCw2IEBACiB2b2lkIGFtMzM1eF90c2Nfc2Vfc2V0X29uY2Uoc3RydWN0IHRpX3RzY2FkY19kZXYgKnRzYWRjLCB1MzIgdmFsKQogewogCXNwaW5fbG9ja19pcnEoJnRzYWRjLT5yZWdfbG9jayk7Ci0JdHNhZGMtPnJlZ19zZV9jYWNoZSB8PSB2YWw7CiAJYW0zMzV4X3RzY2FkY19uZWVkX2FkYyh0c2FkYyk7CiAKIAl0c2NhZGNfd3JpdGVsKHRzYWRjLCBSRUdfU0UsIHZhbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTAxMC5jIGIvZHJpdmVycy9tZmQvdHBzNjUwMTAuYwppbmRleCA3NDNmYjUyLi40NDhmMGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90cHM2NTAxMC5jCisrKyBiL2RyaXZlcnMvbWZkL3RwczY1MDEwLmMKQEAgLTUxNSw3ICs1MTUsNyBAQAogCiBzdGF0aWMgc3RydWN0IHRwczY1MDEwICp0aGVfdHBzOwogCi1zdGF0aWMgaW50IF9fZXhpdCB0cHM2NTAxMF9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgdHBzNjUwMTBfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CiAJc3RydWN0IHRwczY1MDEwCQkqdHBzID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJc3RydWN0IHRwczY1MDEwX2JvYXJkCSpib2FyZCA9IGRldl9nZXRfcGxhdGRhdGEoJmNsaWVudC0+ZGV2KTsKQEAgLTY4NCw3ICs2ODQsNyBAQAogCQkubmFtZQk9ICJ0cHM2NTAxMCIsCiAJfSwKIAkucHJvYmUJPSB0cHM2NTAxMF9wcm9iZSwKLQkucmVtb3ZlCT0gX19leGl0X3AodHBzNjUwMTBfcmVtb3ZlKSwKKwkucmVtb3ZlCT0gdHBzNjUwMTBfcmVtb3ZlLAogCS5pZF90YWJsZSA9IHRwczY1MDEwX2lkLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsNDAzMC1wb3dlci5jIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1wb3dlci5jCmluZGV4IDM5MzUwOTIuLmY0NDBhZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtcG93ZXIuYworKysgYi9kcml2ZXJzL21mZC90d2w0MDMwLXBvd2VyLmMKQEAgLTgyOSw3ICs4MjksNyBAQAogCS5ib2FyZF9jb25maWcJCT0gb3NjX29mZl9yY29uZmlnLAogfTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdHdsNDAzMF9wb3dlcl9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdHdsNDAzMF9wb3dlcl9vZl9tYXRjaFtdID0gewogCXsKIAkJLmNvbXBhdGlibGUgPSAidGksdHdsNDAzMC1wb3dlciIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDYwNDAuYyBiL2RyaXZlcnMvbWZkL3R3bDYwNDAuYwppbmRleCBmNzFlZTNkLi5jNTI2NWMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90d2w2MDQwLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNjA0MC5jCkBAIC04MTQsNCArODE0LDMgQEAKIE1PRFVMRV9BVVRIT1IoIk1pc2FlbCBMb3BleiBDcnV6IDxtaXNhZWwubG9wZXpAdGkuY29tPiIpOwogTU9EVUxFX0FVVEhPUigiSm9yZ2UgRWR1YXJkbyBDYW5kZWxhcmlhIDxqb3JnZS5jYW5kZWxhcmlhQHRpLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06dHdsNjA0MCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdmV4cHJlc3Mtc3lzcmVnLmMgYi9kcml2ZXJzL21mZC92ZXhwcmVzcy1zeXNyZWcuYwppbmRleCA4ZjQzYWI4Li4zZTYyOGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC92ZXhwcmVzcy1zeXNyZWcuYworKysgYi9kcml2ZXJzL21mZC92ZXhwcmVzcy1zeXNyZWcuYwpAQCAtNDcsNzEgKzQ3LDI2IEBACiAjZGVmaW5lIFNZU19IQklfTUFTSwkJMHhmZmYKICNkZWZpbmUgU1lTX1BST0NJRHhfSEJJX1NISUZUCTAKIAotI2RlZmluZSBTWVNfTUNJX0NBUkRJTgkJKDEgPDwgMCkKLSNkZWZpbmUgU1lTX01DSV9XUFJPVAkJKDEgPDwgMSkKLQogI2RlZmluZSBTWVNfTUlTQ19NQVNURVJTSVRFCSgxIDw8IDE0KQogCi0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKl9fdmV4cHJlc3Nfc3lzcmVnX2Jhc2U7Ci0KLXN0YXRpYyB2b2lkIF9faW9tZW0gKnZleHByZXNzX3N5c3JlZ19iYXNlKHZvaWQpCi17Ci0JaWYgKCFfX3ZleHByZXNzX3N5c3JlZ19iYXNlKSB7Ci0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsCi0JCQkJImFybSx2ZXhwcmVzcy1zeXNyZWciKTsKLQotCQlfX3ZleHByZXNzX3N5c3JlZ19iYXNlID0gb2ZfaW9tYXAobm9kZSwgMCk7Ci0JfQotCi0JV0FSTl9PTighX192ZXhwcmVzc19zeXNyZWdfYmFzZSk7Ci0KLQlyZXR1cm4gX192ZXhwcmVzc19zeXNyZWdfYmFzZTsKLX0KLQotCi1zdGF0aWMgaW50IHZleHByZXNzX3N5c3JlZ19nZXRfbWFzdGVyKHZvaWQpCi17Ci0JaWYgKHJlYWRsKHZleHByZXNzX3N5c3JlZ19iYXNlKCkgKyBTWVNfTUlTQykgJiBTWVNfTUlTQ19NQVNURVJTSVRFKQotCQlyZXR1cm4gVkVYUFJFU1NfU0lURV9EQjI7Ci0KLQlyZXR1cm4gVkVYUFJFU1NfU0lURV9EQjE7Ci19Ci0KIHZvaWQgdmV4cHJlc3NfZmxhZ3Nfc2V0KHUzMiBkYXRhKQogewotCXdyaXRlbCh+MCwgdmV4cHJlc3Nfc3lzcmVnX2Jhc2UoKSArIFNZU19GTEFHU0NMUik7Ci0Jd3JpdGVsKGRhdGEsIHZleHByZXNzX3N5c3JlZ19iYXNlKCkgKyBTWVNfRkxBR1NTRVQpOworCXN0YXRpYyB2b2lkIF9faW9tZW0gKmJhc2U7CisKKwlpZiAoIWJhc2UpIHsKKwkJc3RydWN0IGRldmljZV9ub2RlICpub2RlID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwKKwkJCQkiYXJtLHZleHByZXNzLXN5c3JlZyIpOworCisJCWJhc2UgPSBvZl9pb21hcChub2RlLCAwKTsKKwl9CisKKwlpZiAoV0FSTl9PTighYmFzZSkpCisJCXJldHVybjsKKworCXdyaXRlbCh+MCwgYmFzZSArIFNZU19GTEFHU0NMUik7CisJd3JpdGVsKGRhdGEsIGJhc2UgKyBTWVNfRkxBR1NTRVQpOwogfQogCi11bnNpZ25lZCBpbnQgdmV4cHJlc3NfZ2V0X21jaV9jYXJkaW4oc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiByZWFkbCh2ZXhwcmVzc19zeXNyZWdfYmFzZSgpICsgU1lTX01DSSkgJiBTWVNfTUNJX0NBUkRJTjsKLX0KLQotdTMyIHZleHByZXNzX2dldF9wcm9jaWQoaW50IHNpdGUpCi17Ci0JaWYgKHNpdGUgPT0gVkVYUFJFU1NfU0lURV9NQVNURVIpCi0JCXNpdGUgPSB2ZXhwcmVzc19zeXNyZWdfZ2V0X21hc3RlcigpOwotCi0JcmV0dXJuIHJlYWRsKHZleHByZXNzX3N5c3JlZ19iYXNlKCkgKyAoc2l0ZSA9PSBWRVhQUkVTU19TSVRFX0RCMSA/Ci0JCQlTWVNfUFJPQ0lEMCA6IFNZU19QUk9DSUQxKSk7Ci19Ci0KLXZvaWQgX19pb21lbSAqdmV4cHJlc3NfZ2V0XzI0bWh6X2Nsb2NrX2Jhc2Uodm9pZCkKLXsKLQlyZXR1cm4gdmV4cHJlc3Nfc3lzcmVnX2Jhc2UoKSArIFNZU18yNE1IWjsKLX0KLQotCi12b2lkIF9faW5pdCB2ZXhwcmVzc19zeXNyZWdfZWFybHlfaW5pdCh2b2lkIF9faW9tZW0gKmJhc2UpCi17Ci0JX192ZXhwcmVzc19zeXNyZWdfYmFzZSA9IGJhc2U7Ci0KLQl2ZXhwcmVzc19jb25maWdfc2V0X21hc3Rlcih2ZXhwcmVzc19zeXNyZWdfZ2V0X21hc3RlcigpKTsKLX0KLQotCiAvKiBUaGUgc3lzcmVnIGJsb2NrIGlzIGp1c3QgYSByYW5kb20gY29sbGVjdGlvbiBvZiB2YXJpb3VzIGZ1bmN0aW9ucy4uLiAqLwogCiBzdGF0aWMgc3RydWN0IHN5c2Nvbl9wbGF0Zm9ybV9kYXRhIHZleHByZXNzX3N5c3JlZ19zeXNfaWRfcGRhdGEgPSB7CkBAIC0yMTAsNiArMTY1LDcgQEAKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJc3RydWN0IGJncGlvX2NoaXAgKm1tY19ncGlvX2NoaXA7CisJaW50IG1hc3RlcjsKIAl1MzIgZHRfaGJpOwogCiAJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKQEAgLTIyMCwxMSArMTc2LDE0IEBACiAJaWYgKCFiYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXZleHByZXNzX2NvbmZpZ19zZXRfbWFzdGVyKHZleHByZXNzX3N5c3JlZ19nZXRfbWFzdGVyKCkpOworCW1hc3RlciA9IHJlYWRsKGJhc2UgKyBTWVNfTUlTQykgJiBTWVNfTUlTQ19NQVNURVJTSVRFID8KKwkJCVZFWFBSRVNTX1NJVEVfREIyIDogVkVYUFJFU1NfU0lURV9EQjE7CisJdmV4cHJlc3NfY29uZmlnX3NldF9tYXN0ZXIobWFzdGVyKTsKIAogCS8qIENvbmZpcm0gYm9hcmQgdHlwZSBhZ2FpbnN0IERUIHByb3BlcnR5LCBpZiBhdmFpbGFibGUgKi8KIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIob2Zfcm9vdCwgImFybSxoYmkiLCAmZHRfaGJpKSA9PSAwKSB7Ci0JCXUzMiBpZCA9IHZleHByZXNzX2dldF9wcm9jaWQoVkVYUFJFU1NfU0lURV9NQVNURVIpOworCQl1MzIgaWQgPSByZWFkbChiYXNlICsgKG1hc3RlciA9PSBWRVhQUkVTU19TSVRFX0RCMSA/CisJCQkJIFNZU19QUk9DSUQwIDogU1lTX1BST0NJRDEpKTsKIAkJdTMyIGhiaSA9IChpZCA+PiBTWVNfUFJPQ0lEeF9IQklfU0hJRlQpICYgU1lTX0hCSV9NQVNLOwogCiAJCWlmIChXQVJOX09OKGR0X2hiaSAhPSBoYmkpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd201MTAyLXRhYmxlcy5jIGIvZHJpdmVycy9tZmQvd201MTAyLXRhYmxlcy5jCmluZGV4IGIzMjZhODIuLmFlYWU2ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtNTEwMi10YWJsZXMuYworKysgYi9kcml2ZXJzL21mZC93bTUxMDItdGFibGVzLmMKQEAgLTExNzIsOSArMTE3Miw2IEBACiAJY2FzZSBBUklaT05BX0RBQ19ESUdJVEFMX1ZPTFVNRV8zTDoKIAljYXNlIEFSSVpPTkFfREFDX1ZPTFVNRV9MSU1JVF8zTDoKIAljYXNlIEFSSVpPTkFfTk9JU0VfR0FURV9TRUxFQ1RfM0w6Ci0JY2FzZSBBUklaT05BX09VVFBVVF9QQVRIX0NPTkZJR18zUjoKLQljYXNlIEFSSVpPTkFfREFDX0RJR0lUQUxfVk9MVU1FXzNSOgotCWNhc2UgQVJJWk9OQV9EQUNfVk9MVU1FX0xJTUlUXzNSOgogCWNhc2UgQVJJWk9OQV9PVVRQVVRfUEFUSF9DT05GSUdfNEw6CiAJY2FzZSBBUklaT05BX0RBQ19ESUdJVEFMX1ZPTFVNRV80TDoKIAljYXNlIEFSSVpPTkFfT1VUX1ZPTFVNRV80TDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lbmNsb3N1cmUuYyBiL2RyaXZlcnMvbWlzYy9lbmNsb3N1cmUuYwppbmRleCAzODU1MmEzLi42NWZlZDcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvZW5jbG9zdXJlLmMKKysrIGIvZHJpdmVycy9taXNjL2VuY2xvc3VyZS5jCkBAIC0yMDIsMTYgKzIwMiwxNyBAQAogewogCWNoYXIgbmFtZVtFTkNMT1NVUkVfTkFNRV9TSVpFXTsKIAorCWVuY2xvc3VyZV9saW5rX25hbWUoY2RldiwgbmFtZSk7CisKIAkvKgogCSAqIEluIG9kZCBjaXJjdW1zdGFuY2VzLCBsaWtlIG11bHRpcGF0aCBkZXZpY2VzLCBzb21ldGhpbmcgZWxzZSBtYXkKIAkgKiBhbHJlYWR5IGhhdmUgcmVtb3ZlZCB0aGUgbGlua3MsIHNvIGNoZWNrIGZvciB0aGlzIGNvbmRpdGlvbiBmaXJzdC4KIAkgKi8KLQlpZiAoIWNkZXYtPmRldi0+a29iai5zZCkKLQkJcmV0dXJuOworCWlmIChjZGV2LT5kZXYtPmtvYmouc2QpCisJCXN5c2ZzX3JlbW92ZV9saW5rKCZjZGV2LT5kZXYtPmtvYmosIG5hbWUpOwogCi0JZW5jbG9zdXJlX2xpbmtfbmFtZShjZGV2LCBuYW1lKTsKLQlzeXNmc19yZW1vdmVfbGluaygmY2Rldi0+ZGV2LT5rb2JqLCBuYW1lKTsKLQlzeXNmc19yZW1vdmVfbGluaygmY2Rldi0+Y2Rldi5rb2JqLCAiZGV2aWNlIik7CisJaWYgKGNkZXYtPmNkZXYua29iai5zZCkKKwkJc3lzZnNfcmVtb3ZlX2xpbmsoJmNkZXYtPmNkZXYua29iaiwgImRldmljZSIpOwogfQogCiBzdGF0aWMgaW50IGVuY2xvc3VyZV9hZGRfbGlua3Moc3RydWN0IGVuY2xvc3VyZV9jb21wb25lbnQgKmNkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jIGIvZHJpdmVycy9taXNjL21laS9hbXRoaWYuYwppbmRleCBjNGNiOWE5Li40MGVhNjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvbWVpL2FtdGhpZi5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvYW10aGlmLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2MvbWVpL21haW4uYyBiL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCmluZGV4IDNjMDE5YzAuLjQ3NjgwYzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCisrKyBiL2RyaXZlcnMvbWlzYy9tZWkvbWFpbi5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9taXNjL21laS9wY2ktbWUuYyBiL2RyaXZlcnMvbWlzYy9tZWkvcGNpLW1lLmMKaW5kZXggYmQzMDM5YS4uYWY0NGVlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL21laS9wY2ktbWUuYworKysgYi9kcml2ZXJzL21pc2MvbWVpL3BjaS1tZS5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwY19tYWluLmMgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwY19tYWluLmMKaW5kZXggODJkYzU3NC4uN2YzMjcxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NnaS14cC94cGNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBjX21haW4uYwpAQCAtMTIxMCw3ICsxMjEwLDcgQEAKIAogCQlpZiAoKChkaWVfYXJncy0+dHJhcG5yID09IFg4Nl9UUkFQX01GKSB8fAogCQkgICAgIChkaWVfYXJncy0+dHJhcG5yID09IFg4Nl9UUkFQX1hGKSkgJiYKLQkJICAgICF1c2VyX21vZGVfdm0oZGllX2FyZ3MtPnJlZ3MpKQorCQkgICAgIXVzZXJfbW9kZShkaWVfYXJncy0+cmVncykpCiAJCQl4cGNfZGllX2RlYWN0aXZhdGUoKTsKIAogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvY29yZS5jIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKaW5kZXggMjNmMTBmNy4uYzI5NmJjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMKQEAgLTg5Nyw2ICs4OTcsNyBAQAogCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHN0b3A7CisJYm9vbCBwbSA9IGZhbHNlOwogCiAJbWlnaHRfc2xlZXAoKTsKIApAQCAtOTE2LDE1ICs5MTcsMTggQEAKIAkJaG9zdC0+Y2xhaW1lZCA9IDE7CiAJCWhvc3QtPmNsYWltZXIgPSBjdXJyZW50OwogCQlob3N0LT5jbGFpbV9jbnQgKz0gMTsKKwkJaWYgKGhvc3QtPmNsYWltX2NudCA9PSAxKQorCQkJcG0gPSB0cnVlOwogCX0gZWxzZQogCQl3YWtlX3VwKCZob3N0LT53cSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCXJlbW92ZV93YWl0X3F1ZXVlKCZob3N0LT53cSwgJndhaXQpOwotCWlmIChob3N0LT5vcHMtPmVuYWJsZSAmJiAhc3RvcCAmJiBob3N0LT5jbGFpbV9jbnQgPT0gMSkKLQkJaG9zdC0+b3BzLT5lbmFibGUoaG9zdCk7CisKKwlpZiAocG0pCisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMobW1jX2Rldihob3N0KSk7CisKIAlyZXR1cm4gc3RvcDsKIH0KLQogRVhQT1JUX1NZTUJPTChfX21tY19jbGFpbV9ob3N0KTsKIAogLyoqCkBAIC05NDAsOSArOTQ0LDYgQEAKIAogCVdBUk5fT04oIWhvc3QtPmNsYWltZWQpOwogCi0JaWYgKGhvc3QtPm9wcy0+ZGlzYWJsZSAmJiBob3N0LT5jbGFpbV9jbnQgPT0gMSkKLQkJaG9zdC0+b3BzLT5kaXNhYmxlKGhvc3QpOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAlpZiAoLS1ob3N0LT5jbGFpbV9jbnQpIHsKIAkJLyogUmVsZWFzZSBmb3IgbmVzdGVkIGNsYWltICovCkBAIC05NTIsNiArOTUzLDggQEAKIAkJaG9zdC0+Y2xhaW1lciA9IE5VTEw7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAkJd2FrZV91cCgmaG9zdC0+d3EpOworCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KG1tY19kZXYoaG9zdCkpOworCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChtbWNfZGV2KGhvc3QpKTsKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKG1tY19yZWxlYXNlX2hvc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKaW5kZXggMWQ0MWU4NS4uZjM2Yzc2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9tbWMuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL21tYy5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CkBAIC0zMzYsNiArMzM3LDggQEAKIHsKIAlpbnQgZXJyID0gMCwgaWR4OwogCXVuc2lnbmVkIGludCBwYXJ0X3NpemU7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKwlib29sIGJyb2tlbl9ocGkgPSBmYWxzZTsKIAogCS8qIFZlcnNpb24gaXMgY29kZWQgaW4gdGhlIENTRF9TVFJVQ1RVUkUgYnl0ZSBpbiB0aGUgRVhUX0NTRCByZWdpc3RlciAqLwogCWNhcmQtPmV4dF9jc2QucmF3X2V4dF9jc2Rfc3RydWN0dXJlID0gZXh0X2NzZFtFWFRfQ1NEX1NUUlVDVFVSRV07CkBAIC0zNDksNiArMzUyLDExIEBACiAJCX0KIAl9CiAKKwlucCA9IG1tY19vZl9maW5kX2NoaWxkX2RldmljZShjYXJkLT5ob3N0LCAwKTsKKwlpZiAobnAgJiYgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJtbWMtY2FyZCIpKQorCQlicm9rZW5faHBpID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYnJva2VuLWhwaSIpOworCW9mX25vZGVfcHV0KG5wKTsKKwogCS8qCiAJICogVGhlIEVYVF9DU0QgZm9ybWF0IGlzIG1lYW50IHRvIGJlIGZvcndhcmQgY29tcGF0aWJsZS4gQXMgbG9uZwogCSAqIGFzIENTRF9TVFJVQ1RVUkUgZG9lcyBub3QgY2hhbmdlLCBhbGwgdmFsdWVzIGZvciBFWFRfQ1NEX1JFVgpAQCAtNDk0LDcgKzUwMiw3IEBACiAJCX0KIAogCQkvKiBjaGVjayB3aGV0aGVyIHRoZSBlTU1DIGNhcmQgc3VwcG9ydHMgSFBJICovCi0JCWlmIChleHRfY3NkW0VYVF9DU0RfSFBJX0ZFQVRVUkVTXSAmIDB4MSkgeworCQlpZiAoIWJyb2tlbl9ocGkgJiYgKGV4dF9jc2RbRVhUX0NTRF9IUElfRkVBVFVSRVNdICYgMHgxKSkgewogCQkJY2FyZC0+ZXh0X2NzZC5ocGkgPSAxOwogCQkJaWYgKGV4dF9jc2RbRVhUX0NTRF9IUElfRkVBVFVSRVNdICYgMHgyKQogCQkJCWNhcmQtPmV4dF9jc2QuaHBpX2NtZCA9CU1NQ19TVE9QX1RSQU5TTUlTU0lPTjsKQEAgLTE3NTAsNyArMTc1OCw3IEBACiAKIAllcnIgPSBfbW1jX3N1c3BlbmQoaG9zdCwgdHJ1ZSk7CiAJaWYgKGVycikKLQkJcHJfZXJyKCIlczogZXJyb3IgJWQgZG9pbmcgYWdnZXNzaXZlIHN1c3BlbmRcbiIsCisJCXByX2VycigiJXM6IGVycm9yICVkIGRvaW5nIGFnZ3Jlc3NpdmUgc3VzcGVuZFxuIiwKIAkJCW1tY19ob3N0bmFtZShob3N0KSwgZXJyKTsKIAogCXJldHVybiBlcnI7CkBAIC0xNzY4LDcgKzE3NzYsNyBAQAogCiAJZXJyID0gX21tY19yZXN1bWUoaG9zdCk7CiAJaWYgKGVycikKLQkJcHJfZXJyKCIlczogZXJyb3IgJWQgZG9pbmcgYWdnZXNzaXZlIHJlc3VtZVxuIiwKKwkJcHJfZXJyKCIlczogZXJyb3IgJWQgZG9pbmcgYWdncmVzc2l2ZSByZXN1bWVcbiIsCiAJCQltbWNfaG9zdG5hbWUoaG9zdCksIGVycik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvcHdyc2VxLmMgYi9kcml2ZXJzL21tYy9jb3JlL3B3cnNlcS5jCmluZGV4IDg2MjM1NjEuLmFiMjEyOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvcHdyc2VxLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9wd3JzZXEuYwpAQCAtMTksNyArMTksNyBAQAogCiBzdHJ1Y3QgbW1jX3B3cnNlcV9tYXRjaCB7CiAJY29uc3QgY2hhciAqY29tcGF0aWJsZTsKLQlpbnQgKCphbGxvYykoc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpOworCXN0cnVjdCBtbWNfcHdyc2VxICooKmFsbG9jKShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBkZXZpY2UgKmRldik7CiB9OwogCiBzdGF0aWMgc3RydWN0IG1tY19wd3JzZXFfbWF0Y2ggcHdyc2VxX21hdGNoW10gPSB7CkBAIC01Miw2ICs1Miw3IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCXN0cnVjdCBtbWNfcHdyc2VxX21hdGNoICptYXRjaDsKKwlzdHJ1Y3QgbW1jX3B3cnNlcSAqcHdyc2VxOwogCWludCByZXQgPSAwOwogCiAJbnAgPSBvZl9wYXJzZV9waGFuZGxlKGhvc3QtPnBhcmVudC0+b2Zfbm9kZSwgIm1tYy1wd3JzZXEiLCAwKTsKQEAgLTcwLDkgKzcxLDE0IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCXJldCA9IG1hdGNoLT5hbGxvYyhob3N0LCAmcGRldi0+ZGV2KTsKLQlpZiAoIXJldCkKLQkJZGV2X2luZm8oaG9zdC0+cGFyZW50LCAiYWxsb2NhdGVkIG1tYy1wd3JzZXFcbiIpOworCXB3cnNlcSA9IG1hdGNoLT5hbGxvYyhob3N0LCAmcGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKHB3cnNlcSkpIHsKKwkJcmV0ID0gUFRSX0VSUihob3N0LT5wd3JzZXEpOworCQlnb3RvIGVycjsKKwl9CisKKwlob3N0LT5wd3JzZXEgPSBwd3JzZXE7CisJZGV2X2luZm8oaG9zdC0+cGFyZW50LCAiYWxsb2NhdGVkIG1tYy1wd3JzZXFcbiIpOwogCiBlcnI6CiAJb2Zfbm9kZV9wdXQobnApOwpAQCAtMTA5LDQgKzExNSw2IEBACiAKIAlpZiAocHdyc2VxICYmIHB3cnNlcS0+b3BzICYmIHB3cnNlcS0+b3BzLT5mcmVlKQogCQlwd3JzZXEtPm9wcy0+ZnJlZShob3N0KTsKKworCWhvc3QtPnB3cnNlcSA9IE5VTEw7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3B3cnNlcS5oIGIvZHJpdmVycy9tbWMvY29yZS9wd3JzZXEuaAppbmRleCBhYmEzNDA5Li4wOTZkYTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3B3cnNlcS5oCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvcHdyc2VxLmgKQEAgLTI3LDggKzI3LDEwIEBACiB2b2lkIG1tY19wd3JzZXFfcG93ZXJfb2ZmKHN0cnVjdCBtbWNfaG9zdCAqaG9zdCk7CiB2b2lkIG1tY19wd3JzZXFfZnJlZShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwogCi1pbnQgbW1jX3B3cnNlcV9zaW1wbGVfYWxsb2Moc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwotaW50IG1tY19wd3JzZXFfZW1tY19hbGxvYyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBkZXZpY2UgKmRldik7CitzdHJ1Y3QgbW1jX3B3cnNlcSAqbW1jX3B3cnNlcV9zaW1wbGVfYWxsb2Moc3RydWN0IG1tY19ob3N0ICpob3N0LAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RydWN0IG1tY19wd3JzZXEgKm1tY19wd3JzZXFfZW1tY19hbGxvYyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsCisJCQkJCSBzdHJ1Y3QgZGV2aWNlICpkZXYpOwogCiAjZWxzZQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3B3cnNlcV9lbW1jLmMgYi9kcml2ZXJzL21tYy9jb3JlL3B3cnNlcV9lbW1jLmMKaW5kZXggYTJkNTQ1OS4uOWQ2ZDJmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9wd3JzZXFfZW1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvcHdyc2VxX2VtbWMuYwpAQCAtNDksNyArNDksNiBAQAogCXVucmVnaXN0ZXJfcmVzdGFydF9oYW5kbGVyKCZwd3JzZXEtPnJlc2V0X25iKTsKIAlncGlvZF9wdXQocHdyc2VxLT5yZXNldF9ncGlvKTsKIAlrZnJlZShwd3JzZXEpOwotCWhvc3QtPnB3cnNlcSA9IE5VTEw7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbW1jX3B3cnNlcV9vcHMgbW1jX3B3cnNlcV9lbW1jX29wcyA9IHsKQEAgLTY3LDE0ICs2NiwxNSBAQAogCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIAotaW50IG1tY19wd3JzZXFfZW1tY19hbGxvYyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QsIHN0cnVjdCBkZXZpY2UgKmRldikKK3N0cnVjdCBtbWNfcHdyc2VxICptbWNfcHdyc2VxX2VtbWNfYWxsb2Moc3RydWN0IG1tY19ob3N0ICpob3N0LAorCQkJCQkgc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBtbWNfcHdyc2VxX2VtbWMgKnB3cnNlcTsKIAlpbnQgcmV0ID0gMDsKIAogCXB3cnNlcSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtbWNfcHdyc2VxX2VtbWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXB3cnNlcSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJcHdyc2VxLT5yZXNldF9ncGlvID0gZ3Bpb2RfZ2V0X2luZGV4KGRldiwgInJlc2V0IiwgMCwgR1BJT0RfT1VUX0xPVyk7CiAJaWYgKElTX0VSUihwd3JzZXEtPnJlc2V0X2dwaW8pKSB7CkBAIC05MiwxMCArOTIsOSBAQAogCXJlZ2lzdGVyX3Jlc3RhcnRfaGFuZGxlcigmcHdyc2VxLT5yZXNldF9uYik7CiAKIAlwd3JzZXEtPnB3cnNlcS5vcHMgPSAmbW1jX3B3cnNlcV9lbW1jX29wczsKLQlob3N0LT5wd3JzZXEgPSAmcHdyc2VxLT5wd3JzZXE7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gJnB3cnNlcS0+cHdyc2VxOwogZnJlZToKIAlrZnJlZShwd3JzZXEpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvcHdyc2VxX3NpbXBsZS5jIGIvZHJpdmVycy9tbWMvY29yZS9wd3JzZXFfc2ltcGxlLmMKaW5kZXggZTlmMWQ4ZC4uMGIxNGI4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvY29yZS9wd3JzZXFfc2ltcGxlLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9wd3JzZXFfc2ltcGxlLmMKQEAgLTg1LDcgKzg1LDYgQEAKIAkJY2xrX3B1dChwd3JzZXEtPmV4dF9jbGspOwogCiAJa2ZyZWUocHdyc2VxKTsKLQlob3N0LT5wd3JzZXEgPSBOVUxMOwogfQogCiBzdGF0aWMgc3RydWN0IG1tY19wd3JzZXFfb3BzIG1tY19wd3JzZXFfc2ltcGxlX29wcyA9IHsKQEAgLTk1LDcgKzk0LDggQEAKIAkuZnJlZSA9IG1tY19wd3JzZXFfc2ltcGxlX2ZyZWUsCiB9OwogCi1pbnQgbW1jX3B3cnNlcV9zaW1wbGVfYWxsb2Moc3RydWN0IG1tY19ob3N0ICpob3N0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdHJ1Y3QgbW1jX3B3cnNlcSAqbW1jX3B3cnNlcV9zaW1wbGVfYWxsb2Moc3RydWN0IG1tY19ob3N0ICpob3N0LAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1tY19wd3JzZXFfc2ltcGxlICpwd3JzZXE7CiAJaW50IGksIG5yX2dwaW9zLCByZXQgPSAwOwpAQCAtMTA3LDcgKzEwNyw3IEBACiAJcHdyc2VxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG1tY19wd3JzZXFfc2ltcGxlKSArIG5yX2dwaW9zICoKIAkJCSBzaXplb2Yoc3RydWN0IGdwaW9fZGVzYyAqKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwd3JzZXEpCi0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCXB3cnNlcS0+ZXh0X2NsayA9IGNsa19nZXQoZGV2LCAiZXh0X2Nsb2NrIik7CiAJaWYgKElTX0VSUihwd3JzZXEtPmV4dF9jbGspICYmCkBAIC0xMjQsNyArMTI0LDcgQEAKIAkJICAgIFBUUl9FUlIocHdyc2VxLT5yZXNldF9ncGlvc1tpXSkgIT0gLUVOT1NZUykgewogCQkJcmV0ID0gUFRSX0VSUihwd3JzZXEtPnJlc2V0X2dwaW9zW2ldKTsKIAotCQkJd2hpbGUgKC0taSkKKwkJCXdoaWxlIChpLS0pCiAJCQkJZ3Bpb2RfcHV0KHB3cnNlcS0+cmVzZXRfZ3Bpb3NbaV0pOwogCiAJCQlnb3RvIGNsa19wdXQ7CkBAIC0xMzMsMTMgKzEzMywxMiBAQAogCiAJcHdyc2VxLT5ucl9ncGlvcyA9IG5yX2dwaW9zOwogCXB3cnNlcS0+cHdyc2VxLm9wcyA9ICZtbWNfcHdyc2VxX3NpbXBsZV9vcHM7Ci0JaG9zdC0+cHdyc2VxID0gJnB3cnNlcS0+cHdyc2VxOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuICZwd3JzZXEtPnB3cnNlcTsKIGNsa19wdXQ6CiAJaWYgKCFJU19FUlIocHdyc2VxLT5leHRfY2xrKSkKIAkJY2xrX3B1dChwd3JzZXEtPmV4dF9jbGspOwogZnJlZToKIAlrZnJlZShwd3JzZXEpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIEVSUl9QVFIocmV0KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NvcmUvc2QuYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2QuYwppbmRleCBhZDRkNDNlLi4zMWE5ZWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL3NkLmMKKysrIGIvZHJpdmVycy9tbWMvY29yZS9zZC5jCkBAIC0xMTU3LDcgKzExNTcsNyBAQAogCiAJZXJyID0gX21tY19zZF9zdXNwZW5kKGhvc3QpOwogCWlmIChlcnIpCi0JCXByX2VycigiJXM6IGVycm9yICVkIGRvaW5nIGFnZ2Vzc2l2ZSBzdXNwZW5kXG4iLAorCQlwcl9lcnIoIiVzOiBlcnJvciAlZCBkb2luZyBhZ2dyZXNzaXZlIHN1c3BlbmRcbiIsCiAJCQltbWNfaG9zdG5hbWUoaG9zdCksIGVycik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTE3NSw3ICsxMTc1LDcgQEAKIAogCWVyciA9IF9tbWNfc2RfcmVzdW1lKGhvc3QpOwogCWlmIChlcnIpCi0JCXByX2VycigiJXM6IGVycm9yICVkIGRvaW5nIGFnZ2Vzc2l2ZSByZXN1bWVcbiIsCisJCXByX2VycigiJXM6IGVycm9yICVkIGRvaW5nIGFnZ3Jlc3NpdmUgcmVzdW1lXG4iLAogCQkJbW1jX2hvc3RuYW1lKGhvc3QpLCBlcnIpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3NkaW8uYyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jCmluZGV4IGNlNmNjNDcuLjViYzZjN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvc2Rpby5jCkBAIC0yOTMsMTkgKzI5MywyMiBAQAogCWludCBlcnI7CiAKIAlpZiAoY2FyZC0+dHlwZSA9PSBNTUNfVFlQRV9TRElPKQotCQlyZXR1cm4gc2Rpb19lbmFibGVfd2lkZShjYXJkKTsKLQotCWlmICgoY2FyZC0+aG9zdC0+Y2FwcyAmIE1NQ19DQVBfNF9CSVRfREFUQSkgJiYKLQkJKGNhcmQtPnNjci5idXNfd2lkdGhzICYgU0RfU0NSX0JVU19XSURUSF80KSkgeworCQllcnIgPSBzZGlvX2VuYWJsZV93aWRlKGNhcmQpOworCWVsc2UgaWYgKChjYXJkLT5ob3N0LT5jYXBzICYgTU1DX0NBUF80X0JJVF9EQVRBKSAmJgorCQkgKGNhcmQtPnNjci5idXNfd2lkdGhzICYgU0RfU0NSX0JVU19XSURUSF80KSkgewogCQllcnIgPSBtbWNfYXBwX3NldF9idXNfd2lkdGgoY2FyZCwgTU1DX0JVU19XSURUSF80KTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CisJCWVyciA9IHNkaW9fZW5hYmxlX3dpZGUoY2FyZCk7CisJCWlmIChlcnIgPD0gMCkKKwkJCW1tY19hcHBfc2V0X2J1c193aWR0aChjYXJkLCBNTUNfQlVTX1dJRFRIXzEpOwogCX0gZWxzZQogCQlyZXR1cm4gMDsKIAotCWVyciA9IHNkaW9fZW5hYmxlX3dpZGUoY2FyZCk7Ci0JaWYgKGVyciA8PSAwKQotCQltbWNfYXBwX3NldF9idXNfd2lkdGgoY2FyZCwgTU1DX0JVU19XSURUSF8xKTsKKwlpZiAoZXJyID4gMCkgeworCQltbWNfc2V0X2J1c193aWR0aChjYXJkLT5ob3N0LCBNTUNfQlVTX1dJRFRIXzQpOworCQllcnIgPSAwOworCX0KIAogCXJldHVybiBlcnI7CiB9CkBAIC01NDcsMTMgKzU1MCw4IEBACiAJLyoKIAkgKiBTd2l0Y2ggdG8gd2lkZXIgYnVzIChpZiBzdXBwb3J0ZWQpLgogCSAqLwotCWlmIChjYXJkLT5ob3N0LT5jYXBzICYgTU1DX0NBUF80X0JJVF9EQVRBKSB7CisJaWYgKGNhcmQtPmhvc3QtPmNhcHMgJiBNTUNfQ0FQXzRfQklUX0RBVEEpCiAJCWVyciA9IHNkaW9fZW5hYmxlXzRiaXRfYnVzKGNhcmQpOwotCQlpZiAoZXJyID4gMCkgewotCQkJbW1jX3NldF9idXNfd2lkdGgoY2FyZC0+aG9zdCwgTU1DX0JVU19XSURUSF80KTsKLQkJCWVyciA9IDA7Ci0JCX0KLQl9CiAKIAkvKiBTZXQgdGhlIGRyaXZlciBzdHJlbmd0aCBmb3IgdGhlIGNhcmQgKi8KIAlzZGlvX3NlbGVjdF9kcml2ZXJfdHlwZShjYXJkKTsKQEAgLTgwMyw5ICs4MDEsNyBAQAogCQkgKiBTd2l0Y2ggdG8gd2lkZXIgYnVzIChpZiBzdXBwb3J0ZWQpLgogCQkgKi8KIAkJZXJyID0gc2Rpb19lbmFibGVfNGJpdF9idXMoY2FyZCk7Ci0JCWlmIChlcnIgPiAwKQotCQkJbW1jX3NldF9idXNfd2lkdGgoY2FyZC0+aG9zdCwgTU1DX0JVU19XSURUSF80KTsKLQkJZWxzZSBpZiAoZXJyKQorCQlpZiAoZXJyKQogCQkJZ290byByZW1vdmU7CiAJfQogZmluaXNoOgpAQCAtOTgzLDEwICs5NzksNiBAQAogCX0gZWxzZSBpZiAobW1jX2NhcmRfa2VlcF9wb3dlcihob3N0KSAmJiBtbWNfY2FyZF93YWtlX3NkaW9faXJxKGhvc3QpKSB7CiAJCS8qIFdlIG1heSBoYXZlIHN3aXRjaGVkIHRvIDEtYml0IG1vZGUgZHVyaW5nIHN1c3BlbmQgKi8KIAkJZXJyID0gc2Rpb19lbmFibGVfNGJpdF9idXMoaG9zdC0+Y2FyZCk7Ci0JCWlmIChlcnIgPiAwKSB7Ci0JCQltbWNfc2V0X2J1c193aWR0aChob3N0LCBNTUNfQlVTX1dJRFRIXzQpOwotCQkJZXJyID0gMDsKLQkJfQogCX0KIAogCWlmICghZXJyICYmIGhvc3QtPnNkaW9faXJxcykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnIGIvZHJpdmVycy9tbWMvaG9zdC9LY29uZmlnCmluZGV4IDYxYWM2M2EuLjdmNGRiOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvS2NvbmZpZworKysgYi9kcml2ZXJzL21tYy9ob3N0L0tjb25maWcKQEAgLTEzMiw3ICsxMzIsNyBAQAogY29uZmlnIE1NQ19TREhDSV9PRl9FU0RIQwogCXRyaXN0YXRlICJTREhDSSBPRiBzdXBwb3J0IGZvciB0aGUgRnJlZXNjYWxlIGVTREhDIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBNTUNfU0RIQ0lfUExURk0KLQlkZXBlbmRzIG9uIFBQQ19PRgorCWRlcGVuZHMgb24gUFBDCiAJc2VsZWN0IE1NQ19TREhDSV9CSUdfRU5ESUFOXzMyQklUX0JZVEVfU1dBUFBFUgogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgRnJlZXNjYWxlIGVTREhDIGNvbnRyb2xsZXIgc3VwcG9ydC4KQEAgLTE0NCw3ICsxNDQsNyBAQAogY29uZmlnIE1NQ19TREhDSV9PRl9ITFdECiAJdHJpc3RhdGUgIlNESENJIE9GIHN1cHBvcnQgZm9yIHRoZSBOaW50ZW5kbyBXaWkgU0RIQ0kgY29udHJvbGxlcnMiCiAJZGVwZW5kcyBvbiBNTUNfU0RIQ0lfUExURk0KLQlkZXBlbmRzIG9uIFBQQ19PRgorCWRlcGVuZHMgb24gUFBDCiAJc2VsZWN0IE1NQ19TREhDSV9CSUdfRU5ESUFOXzMyQklUX0JZVEVfU1dBUFBFUgogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyIEludGVyZmFjZSAoU0RIQ0kpCkBAIC0yMzAsNyArMjMwLDcgQEAKIAl0cmlzdGF0ZSAiTWFydmVsbCBNTVAyIFNEIEhvc3QgQ29udHJvbGxlciBzdXBwb3J0IChQWEFWMykiCiAJZGVwZW5kcyBvbiBDTEtERVZfTE9PS1VQCiAJZGVwZW5kcyBvbiBNTUNfU0RIQ0lfUExURk0KLQlkZXBlbmRzIG9uIEFSQ0hfTU1QIHx8IENPTVBJTEVfVEVTVAorCWRlcGVuZHMgb24gQVJDSF9CRVJMSU4gfHwgQVJDSF9NTVAgfHwgQVJDSF9NVkVCVSB8fCBDT01QSUxFX1RFU1QKIAlkZWZhdWx0IENQVV9NTVAyCiAJaGVscAogCSAgVGhpcyBzZWxlY3RzIHRoZSBNYXJ2ZWxsKFIpIFBYQVYzIFNEIEhvc3QgQ29udHJvbGxlci4KQEAgLTI1NSw2ICsyNTUsNyBAQAogY29uZmlnIE1NQ19TREhDSV9TUEVBUgogCXRyaXN0YXRlICJTREhDSSBzdXBwb3J0IG9uIFNUIFNQRUFyIHBsYXRmb3JtIgogCWRlcGVuZHMgb24gTU1DX1NESENJICYmIFBMQVRfU1BFQVIKKwlkZXBlbmRzIG9uIE9GCiAJaGVscAogCSAgVGhpcyBzZWxlY3RzIHRoZSBTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlIChTREhDSSkKIAkgIG9mdGVuIHJlZmVycmVyZWQgdG8gYXMgdGhlIEhTTU1DIGJsb2NrIGluIHNvbWUgb2YgdGhlIFNUIFNQRUFSIHJhbmdlCkBAIC0zMDcsNiArMzA4LDIwIEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBNTUNfU0RIQ0lfSVBST0MKKwl0cmlzdGF0ZSAiU0RIQ0kgcGxhdGZvcm0gc3VwcG9ydCBmb3IgdGhlIGlQcm9jIFNEL01NQyBDb250cm9sbGVyIgorCWRlcGVuZHMgb24gQVJDSF9CQ01fSVBST0MgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBNTUNfU0RIQ0lfUExURk0KKwlkZWZhdWx0IEFSQ0hfQkNNX0lQUk9DCisJc2VsZWN0IE1NQ19TREhDSV9JT19BQ0NFU1NPUlMKKwloZWxwCisJICBUaGlzIHNlbGVjdHMgdGhlIGlQcm9jIFNEL01NQyBjb250cm9sbGVyLgorCisJICBJZiB5b3UgaGF2ZSBhbiBJUFJPQyBwbGF0Zm9ybSB3aXRoIFNEIG9yIE1NQyBkZXZpY2VzLAorCSAgc2F5IFkgb3IgTSBoZXJlLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgTU1DX01PWEFSVAogCXRyaXN0YXRlICJNT1hBUlQgU0QvTU1DIEhvc3QgQ29udHJvbGxlciBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9NT1hBUlQgJiYgTU1DCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L01ha2VmaWxlIGIvZHJpdmVycy9tbWMvaG9zdC9NYWtlZmlsZQppbmRleCA2YTdjZmUwLi43MTFlOTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvTWFrZWZpbGUKQEAgLTcxLDYgKzcxLDcgQEAKIG9iai0kKENPTkZJR19NTUNfU0RIQ0lfT0ZfSExXRCkJCSs9IHNkaGNpLW9mLWhsd2Qubwogb2JqLSQoQ09ORklHX01NQ19TREhDSV9CQ01fS09OQSkJKz0gc2RoY2ktYmNtLWtvbmEubwogb2JqLSQoQ09ORklHX01NQ19TREhDSV9CQ00yODM1KQkJKz0gc2RoY2ktYmNtMjgzNS5vCitvYmotJChDT05GSUdfTU1DX1NESENJX0lQUk9DKQkJKz0gc2RoY2ktaXByb2Mubwogb2JqLSQoQ09ORklHX01NQ19TREhDSV9NU00pCQkrPSBzZGhjaS1tc20ubwogb2JqLSQoQ09ORklHX01NQ19TREhDSV9TVCkJCSs9IHNkaGNpLXN0Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2ktcmVncy5oIGIvZHJpdmVycy9tbWMvaG9zdC9hdG1lbC1tY2ktcmVncy5oCmluZGV4IGM5NzAwMWUuLjBhYTQ0ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvYXRtZWwtbWNpLXJlZ3MuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L2F0bWVsLW1jaS1yZWdzLmgKQEAgLTEzNSwxMCArMTM1LDE3IEBACiAjZGVmaW5lIEFUTUNJX1JFR1NfU0laRQkJMHgxMDAKIAogLyogUmVnaXN0ZXIgYWNjZXNzIG1hY3JvcyAqLwotI2RlZmluZSBhdG1jaV9yZWFkbChwb3J0LHJlZykJCQkJXAorI2lmZGVmIENPTkZJR19BVlIzMgorI2RlZmluZSBhdG1jaV9yZWFkbChwb3J0LCByZWcpCQkJXAogCV9fcmF3X3JlYWRsKChwb3J0KS0+cmVncyArIHJlZykKLSNkZWZpbmUgYXRtY2lfd3JpdGVsKHBvcnQscmVnLHZhbHVlKQkJCVwKKyNkZWZpbmUgYXRtY2lfd3JpdGVsKHBvcnQsIHJlZywgdmFsdWUpCQkJXAogCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAocG9ydCktPnJlZ3MgKyByZWcpCisjZWxzZQorI2RlZmluZSBhdG1jaV9yZWFkbChwb3J0LCByZWcpCQkJXAorCXJlYWRsX3JlbGF4ZWQoKHBvcnQpLT5yZWdzICsgcmVnKQorI2RlZmluZSBhdG1jaV93cml0ZWwocG9ydCwgcmVnLCB2YWx1ZSkJCQlcCisJd3JpdGVsX3JlbGF4ZWQoKHZhbHVlKSwgKHBvcnQpLT5yZWdzICsgcmVnKQorI2VuZGlmCiAKIC8qIE9uIEFWUiBjaGlwcyB0aGUgUGVyaXBoZXJhbCBETUEgQ29udHJvbGxlciBpcyBub3QgY29ubmVjdGVkIHRvIE1DSS4gKi8KICNpZmRlZiBDT05GSUdfQVZSMzIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWV4eW5vcy5jIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtZXh5bm9zLmMKaW5kZXggZmUzMjk0OC4uZTc2MWViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtZXh5bm9zLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtZXh5bm9zLmMKQEAgLTQwLDcgKzQwLDEyIEBACiAJdTgJCQkJY2l1X2RpdjsKIAl1MzIJCQkJc2RyX3RpbWluZzsKIAl1MzIJCQkJZGRyX3RpbWluZzsKKwl1MzIJCQkJaHM0MDBfdGltaW5nOworCXUzMgkJCQl0dW5lZF9zYW1wbGU7CiAJdTMyCQkJCWN1cl9zcGVlZDsKKwl1MzIJCQkJZHFzX2RlbGF5OworCXUzMgkJCQlzYXZlZF9kcXNfZW47CisJdTMyCQkJCXNhdmVkX3N0cm9iZV9jdHJsOwogfTsKIAogc3RhdGljIHN0cnVjdCBkd19tY2lfZXh5bm9zX2NvbXBhdGlibGUgewpAQCAtNzEsNiArNzYsMjEgQEAKIAl9LAogfTsKIAorc3RhdGljIGlubGluZSB1OCBkd19tY2lfZXh5bm9zX2dldF9jaXVfZGl2KHN0cnVjdCBkd19tY2kgKmhvc3QpCit7CisJc3RydWN0IGR3X21jaV9leHlub3NfcHJpdl9kYXRhICpwcml2ID0gaG9zdC0+cHJpdjsKKworCWlmIChwcml2LT5jdHJsX3R5cGUgPT0gRFdfTUNJX1RZUEVfRVhZTk9TNDQxMikKKwkJcmV0dXJuIEVYWU5PUzQ0MTJfRklYRURfQ0lVX0NMS19ESVY7CisJZWxzZSBpZiAocHJpdi0+Y3RybF90eXBlID09IERXX01DSV9UWVBFX0VYWU5PUzQyMTApCisJCXJldHVybiBFWFlOT1M0MjEwX0ZJWEVEX0NJVV9DTEtfRElWOworCWVsc2UgaWYgKHByaXYtPmN0cmxfdHlwZSA9PSBEV19NQ0lfVFlQRV9FWFlOT1M3IHx8CisJCQlwcml2LT5jdHJsX3R5cGUgPT0gRFdfTUNJX1RZUEVfRVhZTk9TN19TTVUpCisJCXJldHVybiBTRE1NQ19DTEtTRUxfR0VUX0RJVihtY2lfcmVhZGwoaG9zdCwgQ0xLU0VMNjQpKSArIDE7CisJZWxzZQorCQlyZXR1cm4gU0RNTUNfQ0xLU0VMX0dFVF9ESVYobWNpX3JlYWRsKGhvc3QsIENMS1NFTCkpICsgMTsKK30KKwogc3RhdGljIGludCBkd19tY2lfZXh5bm9zX3ByaXZfaW5pdChzdHJ1Y3QgZHdfbWNpICpob3N0KQogewogCXN0cnVjdCBkd19tY2lfZXh5bm9zX3ByaXZfZGF0YSAqcHJpdiA9IGhvc3QtPnByaXY7CkBAIC04NSw2ICsxMDUsMTYgQEAKIAkJCSAgIFNETU1DX01QU0NUUkxfTk9OX1NFQ1VSRV9XUklURV9CSVQpOwogCX0KIAorCWlmIChwcml2LT5jdHJsX3R5cGUgPj0gRFdfTUNJX1RZUEVfRVhZTk9TNTQyMCkgeworCQlwcml2LT5zYXZlZF9zdHJvYmVfY3RybCA9IG1jaV9yZWFkbChob3N0LCBIUzQwMF9ETElORV9DVFJMKTsKKwkJcHJpdi0+c2F2ZWRfZHFzX2VuID0gbWNpX3JlYWRsKGhvc3QsIEhTNDAwX0RRU19FTik7CisJCXByaXYtPnNhdmVkX2Rxc19lbiB8PSBBWElfTk9OX0JMT0NLSU5HX1dSOworCQltY2lfd3JpdGVsKGhvc3QsIEhTNDAwX0RRU19FTiwgcHJpdi0+c2F2ZWRfZHFzX2VuKTsKKwkJaWYgKCFwcml2LT5kcXNfZGVsYXkpCisJCQlwcml2LT5kcXNfZGVsYXkgPQorCQkJCURRU19DVFJMX0dFVF9SRF9ERUxBWShwcml2LT5zYXZlZF9zdHJvYmVfY3RybCk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk3LDYgKzEyNywyNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBkd19tY2lfZXh5bm9zX3NldF9jbGtzZWxfdGltaW5nKHN0cnVjdCBkd19tY2kgKmhvc3QsIHUzMiB0aW1pbmcpCit7CisJc3RydWN0IGR3X21jaV9leHlub3NfcHJpdl9kYXRhICpwcml2ID0gaG9zdC0+cHJpdjsKKwl1MzIgY2xrc2VsOworCisJaWYgKHByaXYtPmN0cmxfdHlwZSA9PSBEV19NQ0lfVFlQRV9FWFlOT1M3IHx8CisJCXByaXYtPmN0cmxfdHlwZSA9PSBEV19NQ0lfVFlQRV9FWFlOT1M3X1NNVSkKKwkJY2xrc2VsID0gbWNpX3JlYWRsKGhvc3QsIENMS1NFTDY0KTsKKwllbHNlCisJCWNsa3NlbCA9IG1jaV9yZWFkbChob3N0LCBDTEtTRUwpOworCisJY2xrc2VsID0gKGNsa3NlbCAmIH5TRE1NQ19DTEtTRUxfVElNSU5HX01BU0spIHwgdGltaW5nOworCisJaWYgKHByaXYtPmN0cmxfdHlwZSA9PSBEV19NQ0lfVFlQRV9FWFlOT1M3IHx8CisJCXByaXYtPmN0cmxfdHlwZSA9PSBEV19NQ0lfVFlQRV9FWFlOT1M3X1NNVSkKKwkJbWNpX3dyaXRlbChob3N0LCBDTEtTRUw2NCwgY2xrc2VsKTsKKwllbHNlCisJCW1jaV93cml0ZWwoaG9zdCwgQ0xLU0VMLCBjbGtzZWwpOworfQorCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IGR3X21jaV9leHlub3Nfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CkBAIC0xNzIsMzAgKzIyMiwzOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgZHdfbWNpX2V4eW5vc19zZXRfaW9zKHN0cnVjdCBkd19tY2kgKmhvc3QsIHN0cnVjdCBtbWNfaW9zICppb3MpCitzdGF0aWMgdm9pZCBkd19tY2lfZXh5bm9zX2NvbmZpZ19oczQwMChzdHJ1Y3QgZHdfbWNpICpob3N0LCB1MzIgdGltaW5nKQogewogCXN0cnVjdCBkd19tY2lfZXh5bm9zX3ByaXZfZGF0YSAqcHJpdiA9IGhvc3QtPnByaXY7Ci0JdW5zaWduZWQgaW50IHdhbnRlZCA9IGlvcy0+Y2xvY2s7Ci0JdW5zaWduZWQgbG9uZyBhY3R1YWw7Ci0JdTggZGl2ID0gcHJpdi0+Y2l1X2RpdiArIDE7CisJdTMyIGRxcywgc3Ryb2JlOwogCi0JaWYgKGlvcy0+dGltaW5nID09IE1NQ19USU1JTkdfTU1DX0REUjUyKSB7Ci0JCWlmIChwcml2LT5jdHJsX3R5cGUgPT0gRFdfTUNJX1RZUEVfRVhZTk9TNyB8fAotCQkJcHJpdi0+Y3RybF90eXBlID09IERXX01DSV9UWVBFX0VYWU5PUzdfU01VKQotCQkJbWNpX3dyaXRlbChob3N0LCBDTEtTRUw2NCwgcHJpdi0+ZGRyX3RpbWluZyk7Ci0JCWVsc2UKLQkJCW1jaV93cml0ZWwoaG9zdCwgQ0xLU0VMLCBwcml2LT5kZHJfdGltaW5nKTsKLQkJLyogU2hvdWxkIGJlIGRvdWJsZSByYXRlIGZvciBERFIgbW9kZSAqLwotCQlpZiAoaW9zLT5idXNfd2lkdGggPT0gTU1DX0JVU19XSURUSF84KQotCQkJd2FudGVkIDw8PSAxOworCS8qCisJICogTm90IHN1cHBvcnRlZCB0byBjb25maWd1cmUgcmVnaXN0ZXIKKwkgKiByZWxhdGVkIHRvIEhTNDAwCisJICovCisJaWYgKHByaXYtPmN0cmxfdHlwZSA8IERXX01DSV9UWVBFX0VYWU5PUzU0MjApCisJCXJldHVybjsKKworCWRxcyA9IHByaXYtPnNhdmVkX2Rxc19lbjsKKwlzdHJvYmUgPSBwcml2LT5zYXZlZF9zdHJvYmVfY3RybDsKKworCWlmICh0aW1pbmcgPT0gTU1DX1RJTUlOR19NTUNfSFM0MDApIHsKKwkJZHFzIHw9IERBVEFfU1RST0JFX0VOOworCQlzdHJvYmUgPSBEUVNfQ1RSTF9SRF9ERUxBWShzdHJvYmUsIHByaXYtPmRxc19kZWxheSk7CiAJfSBlbHNlIHsKLQkJaWYgKHByaXYtPmN0cmxfdHlwZSA9PSBEV19NQ0lfVFlQRV9FWFlOT1M3IHx8Ci0JCQlwcml2LT5jdHJsX3R5cGUgPT0gRFdfTUNJX1RZUEVfRVhZTk9TN19TTVUpCi0JCQltY2lfd3JpdGVsKGhvc3QsIENMS1NFTDY0LCBwcml2LT5zZHJfdGltaW5nKTsKLQkJZWxzZQotCQkJbWNpX3dyaXRlbChob3N0LCBDTEtTRUwsIHByaXYtPnNkcl90aW1pbmcpOworCQlkcXMgJj0gfkRBVEFfU1RST0JFX0VOOwogCX0KIAorCW1jaV93cml0ZWwoaG9zdCwgSFM0MDBfRFFTX0VOLCBkcXMpOworCW1jaV93cml0ZWwoaG9zdCwgSFM0MDBfRExJTkVfQ1RSTCwgc3Ryb2JlKTsKK30KKworc3RhdGljIHZvaWQgZHdfbWNpX2V4eW5vc19hZGp1c3RfY2xvY2soc3RydWN0IGR3X21jaSAqaG9zdCwgdW5zaWduZWQgaW50IHdhbnRlZCkKK3sKKwlzdHJ1Y3QgZHdfbWNpX2V4eW5vc19wcml2X2RhdGEgKnByaXYgPSBob3N0LT5wcml2OworCXVuc2lnbmVkIGxvbmcgYWN0dWFsOworCXU4IGRpdjsKKwlpbnQgcmV0OwogCS8qCiAJICogRG9uJ3QgY2FyZSBpZiB3YW50ZWQgY2xvY2sgaXMgemVybyBvcgogCSAqIGNpdSBjbG9jayBpcyB1bmF2YWlsYWJsZQpAQCAtMjA3LDE3ICsyNjUsNTIgQEAKIAlpZiAod2FudGVkIDwgRVhZTk9TX0NDTEtJTl9NSU4pCiAJCXdhbnRlZCA9IEVYWU5PU19DQ0xLSU5fTUlOOwogCi0JaWYgKHdhbnRlZCAhPSBwcml2LT5jdXJfc3BlZWQpIHsKLQkJaW50IHJldCA9IGNsa19zZXRfcmF0ZShob3N0LT5jaXVfY2xrLCB3YW50ZWQgKiBkaXYpOwotCQlpZiAocmV0KQotCQkJZGV2X3dhcm4oaG9zdC0+ZGV2LAotCQkJCSJmYWlsZWQgdG8gc2V0IGNsay1yYXRlICV1IGVycm9yOiAlZFxuIiwKLQkJCQkgd2FudGVkICogZGl2LCByZXQpOwotCQlhY3R1YWwgPSBjbGtfZ2V0X3JhdGUoaG9zdC0+Y2l1X2Nsayk7Ci0JCWhvc3QtPmJ1c19oeiA9IGFjdHVhbCAvIGRpdjsKLQkJcHJpdi0+Y3VyX3NwZWVkID0gd2FudGVkOwotCQlob3N0LT5jdXJyZW50X3NwZWVkID0gMDsKKwlpZiAod2FudGVkID09IHByaXYtPmN1cl9zcGVlZCkKKwkJcmV0dXJuOworCisJZGl2ID0gZHdfbWNpX2V4eW5vc19nZXRfY2l1X2Rpdihob3N0KTsKKwlyZXQgPSBjbGtfc2V0X3JhdGUoaG9zdC0+Y2l1X2Nsaywgd2FudGVkICogZGl2KTsKKwlpZiAocmV0KQorCQlkZXZfd2Fybihob3N0LT5kZXYsCisJCQkiZmFpbGVkIHRvIHNldCBjbGstcmF0ZSAldSBlcnJvcjogJWRcbiIsCisJCQl3YW50ZWQgKiBkaXYsIHJldCk7CisJYWN0dWFsID0gY2xrX2dldF9yYXRlKGhvc3QtPmNpdV9jbGspOworCWhvc3QtPmJ1c19oeiA9IGFjdHVhbCAvIGRpdjsKKwlwcml2LT5jdXJfc3BlZWQgPSB3YW50ZWQ7CisJaG9zdC0+Y3VycmVudF9zcGVlZCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGR3X21jaV9leHlub3Nfc2V0X2lvcyhzdHJ1Y3QgZHdfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX2lvcyAqaW9zKQoreworCXN0cnVjdCBkd19tY2lfZXh5bm9zX3ByaXZfZGF0YSAqcHJpdiA9IGhvc3QtPnByaXY7CisJdW5zaWduZWQgaW50IHdhbnRlZCA9IGlvcy0+Y2xvY2s7CisJdTMyIHRpbWluZyA9IGlvcy0+dGltaW5nLCBjbGtzZWw7CisKKwlzd2l0Y2ggKHRpbWluZykgeworCWNhc2UgTU1DX1RJTUlOR19NTUNfSFM0MDA6CisJCS8qIFVwZGF0ZSB0dW5lZCBzYW1wbGUgdGltaW5nICovCisJCWNsa3NlbCA9IFNETU1DX0NMS1NFTF9VUF9TQU1QTEUoCisJCQkJcHJpdi0+aHM0MDBfdGltaW5nLCBwcml2LT50dW5lZF9zYW1wbGUpOworCQl3YW50ZWQgPDw9IDE7CisJCWJyZWFrOworCWNhc2UgTU1DX1RJTUlOR19NTUNfRERSNTI6CisJCWNsa3NlbCA9IHByaXYtPmRkcl90aW1pbmc7CisJCS8qIFNob3VsZCBiZSBkb3VibGUgcmF0ZSBmb3IgRERSIG1vZGUgKi8KKwkJaWYgKGlvcy0+YnVzX3dpZHRoID09IE1NQ19CVVNfV0lEVEhfOCkKKwkJCXdhbnRlZCA8PD0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2xrc2VsID0gcHJpdi0+c2RyX3RpbWluZzsKIAl9CisKKwkvKiBTZXQgY2xvY2sgdGltaW5nIGZvciB0aGUgcmVxdWVzdGVkIHNwZWVkIG1vZGUqLworCWR3X21jaV9leHlub3Nfc2V0X2Nsa3NlbF90aW1pbmcoaG9zdCwgY2xrc2VsKTsKKworCS8qIENvbmZpZ3VyZSBzZXR0aW5nIGZvciBIUzQwMCAqLworCWR3X21jaV9leHlub3NfY29uZmlnX2hzNDAwKGhvc3QsIHRpbWluZyk7CisKKwkvKiBDb25maWd1cmUgY2xvY2sgcmF0ZSAqLworCWR3X21jaV9leHlub3NfYWRqdXN0X2Nsb2NrKGhvc3QsIHdhbnRlZCk7CiB9CiAKIHN0YXRpYyBpbnQgZHdfbWNpX2V4eW5vc19wYXJzZV9kdChzdHJ1Y3QgZHdfbWNpICpob3N0KQpAQCAtMjYwLDYgKzM1MywxNiBAQAogCQlyZXR1cm4gcmV0OwogCiAJcHJpdi0+ZGRyX3RpbWluZyA9IFNETU1DX0NMS1NFTF9USU1JTkcodGltaW5nWzBdLCB0aW1pbmdbMV0sIGRpdik7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShucCwKKwkJCSJzYW1zdW5nLGR3LW1zaGMtaHM0MDAtdGltaW5nIiwgdGltaW5nLCAyKTsKKwlpZiAoIXJldCAmJiBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwKKwkJCQkic2Ftc3VuZyxyZWFkLXN0cm9iZS1kZWxheSIsICZwcml2LT5kcXNfZGVsYXkpKQorCQlkZXZfZGJnKGhvc3QtPmRldiwKKwkJCSJyZWFkLXN0cm9iZS1kZWxheSBpcyBub3QgZm91bmQsIGFzc3VtaW5nIHVzYWdlIG9mIGRlZmF1bHQgdmFsdWVcbiIpOworCisJcHJpdi0+aHM0MDBfdGltaW5nID0gU0RNTUNfQ0xLU0VMX1RJTUlORyh0aW1pbmdbMF0sIHRpbWluZ1sxXSwKKwkJCQkJCUhTNDAwX0ZJWEVEX0NJVV9DTEtfRElWKTsKIAlob3N0LT5wcml2ID0gcHJpdjsKIAlyZXR1cm4gMDsKIH0KQEAgLTI4NSw3ICszODgsNyBAQAogCQljbGtzZWwgPSBtY2lfcmVhZGwoaG9zdCwgQ0xLU0VMNjQpOwogCWVsc2UKIAkJY2xrc2VsID0gbWNpX3JlYWRsKGhvc3QsIENMS1NFTCk7Ci0JY2xrc2VsID0gKGNsa3NlbCAmIH4weDcpIHwgU0RNTUNfQ0xLU0VMX0NDTEtfU0FNUExFKHNhbXBsZSk7CisJY2xrc2VsID0gU0RNTUNfQ0xLU0VMX1VQX1NBTVBMRShjbGtzZWwsIHNhbXBsZSk7CiAJaWYgKHByaXYtPmN0cmxfdHlwZSA9PSBEV19NQ0lfVFlQRV9FWFlOT1M3IHx8CiAJCXByaXYtPmN0cmxfdHlwZSA9PSBEV19NQ0lfVFlQRV9FWFlOT1M3X1NNVSkKIAkJbWNpX3dyaXRlbChob3N0LCBDTEtTRUw2NCwgY2xrc2VsKTsKQEAgLTMwNCwxMyArNDA3LDE2IEBACiAJCWNsa3NlbCA9IG1jaV9yZWFkbChob3N0LCBDTEtTRUw2NCk7CiAJZWxzZQogCQljbGtzZWwgPSBtY2lfcmVhZGwoaG9zdCwgQ0xLU0VMKTsKKwogCXNhbXBsZSA9IChjbGtzZWwgKyAxKSAmIDB4NzsKLQljbGtzZWwgPSAoY2xrc2VsICYgfjB4NykgfCBzYW1wbGU7CisJY2xrc2VsID0gU0RNTUNfQ0xLU0VMX1VQX1NBTVBMRShjbGtzZWwsIHNhbXBsZSk7CisKIAlpZiAocHJpdi0+Y3RybF90eXBlID09IERXX01DSV9UWVBFX0VYWU5PUzcgfHwKIAkJcHJpdi0+Y3RybF90eXBlID09IERXX01DSV9UWVBFX0VYWU5PUzdfU01VKQogCQltY2lfd3JpdGVsKGhvc3QsIENMS1NFTDY0LCBjbGtzZWwpOwogCWVsc2UKIAkJbWNpX3dyaXRlbChob3N0LCBDTEtTRUwsIGNsa3NlbCk7CisKIAlyZXR1cm4gc2FtcGxlOwogfQogCkBAIC0zNDMsNiArNDQ5LDcgQEAKIHN0YXRpYyBpbnQgZHdfbWNpX2V4eW5vc19leGVjdXRlX3R1bmluZyhzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QpCiB7CiAJc3RydWN0IGR3X21jaSAqaG9zdCA9IHNsb3QtPmhvc3Q7CisJc3RydWN0IGR3X21jaV9leHlub3NfcHJpdl9kYXRhICpwcml2ID0gaG9zdC0+cHJpdjsKIAlzdHJ1Y3QgbW1jX2hvc3QgKm1tYyA9IHNsb3QtPm1tYzsKIAl1OCBzdGFydF9zbXBsLCBzbXBsLCBjYW5kaWF0ZXMgPSAwOwogCXM4IGZvdW5kID0gLTE7CkBAIC0zNjAsMTQgKzQ2NywyNyBAQAogCX0gd2hpbGUgKHN0YXJ0X3NtcGwgIT0gc21wbCk7CiAKIAlmb3VuZCA9IGR3X21jaV9leHlub3NfZ2V0X2Jlc3RfY2xrc21wbChjYW5kaWF0ZXMpOwotCWlmIChmb3VuZCA+PSAwKQorCWlmIChmb3VuZCA+PSAwKSB7CiAJCWR3X21jaV9leHlub3Nfc2V0X2Nsa3NtcGwoaG9zdCwgZm91bmQpOwotCWVsc2UKKwkJcHJpdi0+dHVuZWRfc2FtcGxlID0gZm91bmQ7CisJfSBlbHNlIHsKIAkJcmV0ID0gLUVJTzsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGR3X21jaV9leHlub3NfcHJlcGFyZV9oczQwMF90dW5pbmcoc3RydWN0IGR3X21jaSAqaG9zdCwKKwkJCQkJc3RydWN0IG1tY19pb3MgKmlvcykKK3sKKwlzdHJ1Y3QgZHdfbWNpX2V4eW5vc19wcml2X2RhdGEgKnByaXYgPSBob3N0LT5wcml2OworCisJZHdfbWNpX2V4eW5vc19zZXRfY2xrc2VsX3RpbWluZyhob3N0LCBwcml2LT5oczQwMF90aW1pbmcpOworCWR3X21jaV9leHlub3NfYWRqdXN0X2Nsb2NrKGhvc3QsIChpb3MtPmNsb2NrKSA8PCAxKTsKKworCXJldHVybiAwOworfQorCiAvKiBDb21tb24gY2FwYWJpbGl0aWVzIG9mIEV4eW5vczQvRXh5bm9zNSBTb0MgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGV4eW5vc19kd21tY19jYXBzWzRdID0gewogCU1NQ19DQVBfMV84Vl9ERFIgfCBNTUNfQ0FQXzhfQklUX0RBVEEgfCBNTUNfQ0FQX0NNRDIzLApAQCAtMzg0LDYgKzUwNCw3IEBACiAJLnNldF9pb3MJCT0gZHdfbWNpX2V4eW5vc19zZXRfaW9zLAogCS5wYXJzZV9kdAkJPSBkd19tY2lfZXh5bm9zX3BhcnNlX2R0LAogCS5leGVjdXRlX3R1bmluZwkJPSBkd19tY2lfZXh5bm9zX2V4ZWN1dGVfdHVuaW5nLAorCS5wcmVwYXJlX2hzNDAwX3R1bmluZwk9IGR3X21jaV9leHlub3NfcHJlcGFyZV9oczQwMF90dW5pbmcsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBkd19tY2lfZXh5bm9zX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy1leHlub3MuaCBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWV4eW5vcy5oCmluZGV4IDc4NzJjZTUuLjU5NWM5MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWV4eW5vcy5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLWV4eW5vcy5oCkBAIC0xMiwyMCArMTIsMzYgQEAKICNpZm5kZWYgX0RXX01NQ19FWFlOT1NfSF8KICNkZWZpbmUgX0RXX01NQ19FWFlOT1NfSF8KIAotLyogRXh0ZW5kZWQgUmVnaXN0ZXIncyBPZmZzZXQgKi8KICNkZWZpbmUgU0RNTUNfQ0xLU0VMCQkJMHgwOUMKICNkZWZpbmUgU0RNTUNfQ0xLU0VMNjQJCQkweDBBOAogCisvKiBFeHRlbmRlZCBSZWdpc3RlcidzIE9mZnNldCAqLworI2RlZmluZSBTRE1NQ19IUzQwMF9EUVNfRU4JCTB4MTgwCisjZGVmaW5lIFNETU1DX0hTNDAwX0FTWU5DX0ZJRk9fQ1RSTAkweDE4NAorI2RlZmluZSBTRE1NQ19IUzQwMF9ETElORV9DVFJMCQkweDE4OAorCiAvKiBDTEtTRUwgcmVnaXN0ZXIgZGVmaW5lcyAqLwogI2RlZmluZSBTRE1NQ19DTEtTRUxfQ0NMS19TQU1QTEUoeCkJKCgoeCkgJiA3KSA8PCAwKQogI2RlZmluZSBTRE1NQ19DTEtTRUxfQ0NMS19EUklWRSh4KQkoKCh4KSAmIDcpIDw8IDE2KQogI2RlZmluZSBTRE1NQ19DTEtTRUxfQ0NMS19ESVZJREVSKHgpCSgoKHgpICYgNykgPDwgMjQpCiAjZGVmaW5lIFNETU1DX0NMS1NFTF9HRVRfRFJWX1dEMyh4KQkoKCh4KSA+PiAxNikgJiAweDcpCisjZGVmaW5lIFNETU1DX0NMS1NFTF9HRVRfRElWKHgpCQkoKCh4KSA+PiAyNCkgJiAweDcpCisjZGVmaW5lIFNETU1DX0NMS1NFTF9VUF9TQU1QTEUoeCwgeSkJKCgoeCkgJiB+U0RNTUNfQ0xLU0VMX0NDTEtfU0FNUExFKDcpKSB8XAorCQkJCQkgU0RNTUNfQ0xLU0VMX0NDTEtfU0FNUExFKHkpKQogI2RlZmluZSBTRE1NQ19DTEtTRUxfVElNSU5HKHgsIHksIHopCShTRE1NQ19DTEtTRUxfQ0NMS19TQU1QTEUoeCkgfAlcCiAJCQkJCSBTRE1NQ19DTEtTRUxfQ0NMS19EUklWRSh5KSB8CVwKIAkJCQkJIFNETU1DX0NMS1NFTF9DQ0xLX0RJVklERVIoeikpCisjZGVmaW5lIFNETU1DX0NMS1NFTF9USU1JTkdfTUFTSwlTRE1NQ19DTEtTRUxfVElNSU5HKDB4NywgMHg3LCAweDcpCiAjZGVmaW5lIFNETU1DX0NMS1NFTF9XQUtFVVBfSU5UCQlCSVQoMTEpCiAKKy8qIFJDTEtfRU4gcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBEQVRBX1NUUk9CRV9FTgkJCUJJVCgwKQorI2RlZmluZSBBWElfTk9OX0JMT0NLSU5HX1dSCUJJVCg3KQorCisvKiBETElORV9DVFJMIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgRFFTX0NUUkxfUkRfREVMQVkoeCwgeSkJCSgoKHgpICYgfjB4M0ZGKSB8ICgoeSkgJiAweDNGRikpCisjZGVmaW5lIERRU19DVFJMX0dFVF9SRF9ERUxBWSh4KQkoKHgpICYgMHgzRkYpCisKIC8qIFByb3RlY3RvciBSZWdpc3RlciAqLwogI2RlZmluZSBTRE1NQ19FTU1DUF9CQVNFCTB4MTAwMAogI2RlZmluZSBTRE1NQ19NUFNFQ1VSSVRZCShTRE1NQ19FTU1DUF9CQVNFICsgMHgwMDEwKQpAQCAtNDksNiArNjUsNyBAQAogLyogRml4ZWQgY2xvY2sgZGl2aWRlciAqLwogI2RlZmluZSBFWFlOT1M0MjEwX0ZJWEVEX0NJVV9DTEtfRElWCTIKICNkZWZpbmUgRVhZTk9TNDQxMl9GSVhFRF9DSVVfQ0xLX0RJVgk0CisjZGVmaW5lIEhTNDAwX0ZJWEVEX0NJVV9DTEtfRElWCQkxCiAKIC8qIE1pbmltYWwgcmVxdWlyZWQgY2xvY2sgZnJlcXVlbmN5IGZvciBjY2xraW4sIHVuaXQ6IEhaICovCiAjZGVmaW5lIEVYWU5PU19DQ0xLSU5fTUlOCTUwMDAwMDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy1yb2NrY2hpcC5jIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMtcm9ja2NoaXAuYwppbmRleCBlMmE3MjZhLi5kYmYxNjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy1yb2NrY2hpcC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLXJvY2tjaGlwLmMKQEAgLTc2LDEyICs3NiwyMCBAQAogCXJldHVybiAwOwogfQogCisvKiBDb21tb24gY2FwYWJpbGl0aWVzIG9mIFJLMzI4OCBTb0MgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGR3X21jaV9yazMyODhfZHdtbWNfY2Fwc1s0XSA9IHsKKwlNTUNfQ0FQX1JVTlRJTUVfUkVTVU1FLCAvKiBlbW1jICovCisJTU1DX0NBUF9SVU5USU1FX1JFU1VNRSwgLyogc2RtbWMgKi8KKwlNTUNfQ0FQX1JVTlRJTUVfUkVTVU1FLCAvKiBzZGlvMCAqLworCU1NQ19DQVBfUlVOVElNRV9SRVNVTUUsIC8qIHNkaW8xICovCit9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBkd19tY2lfZHJ2X2RhdGEgcmsyOTI4X2Rydl9kYXRhID0gewogCS5wcmVwYXJlX2NvbW1hbmQgICAgICAgID0gZHdfbWNpX3JvY2tjaGlwX3ByZXBhcmVfY29tbWFuZCwKIAkuaW5pdAkJCT0gZHdfbWNpX3JvY2tjaGlwX2luaXQsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGR3X21jaV9kcnZfZGF0YSByazMyODhfZHJ2X2RhdGEgPSB7CisJLmNhcHMJCQk9IGR3X21jaV9yazMyODhfZHdtbWNfY2FwcywKIAkucHJlcGFyZV9jb21tYW5kICAgICAgICA9IGR3X21jaV9yb2NrY2hpcF9wcmVwYXJlX2NvbW1hbmQsCiAJLnNldF9pb3MJCT0gZHdfbWNpX3JrMzI4OF9zZXRfaW9zLAogCS5zZXR1cF9jbG9jayAgICA9IGR3X21jaV9yazMyODhfc2V0dXBfY2xvY2ssCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuYwppbmRleCA0ZDJlM2MyLi4zOGIyOTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmMKQEAgLTY5LDcgKzY5LDggQEAKIAogCXUzMgkJZGVzMjsJLypCdWZmZXIgc2l6ZXMgKi8KICNkZWZpbmUgSURNQUNfNjRBRERSX1NFVF9CVUZGRVIxX1NJWkUoZCwgcykgXAotCSgoZCktPmRlczIgPSAoKGQpLT5kZXMyICYgMHgwM2ZmZTAwMCkgfCAoKHMpICYgMHgxZmZmKSkKKwkoKGQpLT5kZXMyID0gKChkKS0+ZGVzMiAmIGNwdV90b19sZTMyKDB4MDNmZmUwMDApKSB8IFwKKwkgKChjcHVfdG9fbGUzMihzKSkgJiBjcHVfdG9fbGUzMigweDFmZmYpKSkKIAogCXUzMgkJZGVzMzsJLyogUmVzZXJ2ZWQgKi8KIApAQCAtODEsNyArODIsNyBAQAogfTsKIAogc3RydWN0IGlkbWFjX2Rlc2MgewotCXUzMgkJZGVzMDsJLyogQ29udHJvbCBEZXNjcmlwdG9yICovCisJX19sZTMyCQlkZXMwOwkvKiBDb250cm9sIERlc2NyaXB0b3IgKi8KICNkZWZpbmUgSURNQUNfREVTMF9ESUMJQklUKDEpCiAjZGVmaW5lIElETUFDX0RFUzBfTEQJQklUKDIpCiAjZGVmaW5lIElETUFDX0RFUzBfRkQJQklUKDMpCkBAIC05MCwxOCArOTEsMTkgQEAKICNkZWZpbmUgSURNQUNfREVTMF9DRVMJQklUKDMwKQogI2RlZmluZSBJRE1BQ19ERVMwX09XTglCSVQoMzEpCiAKLQl1MzIJCWRlczE7CS8qIEJ1ZmZlciBzaXplcyAqLworCV9fbGUzMgkJZGVzMTsJLyogQnVmZmVyIHNpemVzICovCiAjZGVmaW5lIElETUFDX1NFVF9CVUZGRVIxX1NJWkUoZCwgcykgXAogCSgoZCktPmRlczEgPSAoKGQpLT5kZXMxICYgMHgwM2ZmZTAwMCkgfCAoKHMpICYgMHgxZmZmKSkKIAotCXUzMgkJZGVzMjsJLyogYnVmZmVyIDEgcGh5c2ljYWwgYWRkcmVzcyAqLworCV9fbGUzMgkJZGVzMjsJLyogYnVmZmVyIDEgcGh5c2ljYWwgYWRkcmVzcyAqLwogCi0JdTMyCQlkZXMzOwkvKiBidWZmZXIgMiBwaHlzaWNhbCBhZGRyZXNzICovCisJX19sZTMyCQlkZXMzOwkvKiBidWZmZXIgMiBwaHlzaWNhbCBhZGRyZXNzICovCiB9OwogI2VuZGlmIC8qIENPTkZJR19NTUNfRFdfSURNQUMgKi8KIAogc3RhdGljIGJvb2wgZHdfbWNpX3Jlc2V0KHN0cnVjdCBkd19tY2kgKmhvc3QpOwogc3RhdGljIGJvb2wgZHdfbWNpX2N0cmxfcmVzZXQoc3RydWN0IGR3X21jaSAqaG9zdCwgdTMyIHJlc2V0KTsKK3N0YXRpYyBpbnQgZHdfbWNpX2NhcmRfYnVzeShzdHJ1Y3QgbW1jX2hvc3QgKm1tYyk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykKIHN0YXRpYyBpbnQgZHdfbWNpX3JlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKQEAgLTMzNSw2ICszMzcsMzEgQEAKIAlyZXR1cm4gY21kcjsKIH0KIAorc3RhdGljIHZvaWQgZHdfbWNpX3dhaXRfd2hpbGVfYnVzeShzdHJ1Y3QgZHdfbWNpICpob3N0LCB1MzIgY21kX2ZsYWdzKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMCk7CisKKwkvKgorCSAqIERhdGFib29rIHNheXMgdGhhdCBiZWZvcmUgaXNzdWluZyBhIG5ldyBkYXRhIHRyYW5zZmVyIGNvbW1hbmQKKwkgKiB3ZSBuZWVkIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUgY2FyZCBpcyBidXN5LiAgRGF0YSB0cmFuc2ZlciBjb21tYW5kcworCSAqIGFsbCBoYXZlIFNETU1DX0NNRF9QUlZfREFUX1dBSVQgc2V0LCBzbyB3ZSdsbCBrZXkgb2ZmIHRoYXQuCisJICoKKwkgKiAuLi5hbHNvIGFsbG93IHNlbmRpbmcgZm9yIFNETU1DX0NNRF9WT0xUX1NXSVRDSCB3aGVyZSBidXN5IGlzCisJICogZXhwZWN0ZWQuCisJICovCisJaWYgKChjbWRfZmxhZ3MgJiBTRE1NQ19DTURfUFJWX0RBVF9XQUlUKSAmJgorCSAgICAhKGNtZF9mbGFncyAmIFNETU1DX0NNRF9WT0xUX1NXSVRDSCkpIHsKKwkJd2hpbGUgKG1jaV9yZWFkbChob3N0LCBTVEFUVVMpICYgU0RNTUNfU1RBVFVTX0JVU1kpIHsKKwkJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQkJLyogQ29tbWFuZCB3aWxsIGZhaWw7IHdlJ2xsIHBhc3MgZXJyb3IgdGhlbiAqLworCQkJCWRldl9lcnIoaG9zdC0+ZGV2LCAiQnVzeTsgdHJ5aW5nIGFueXdheVxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1ZGVsYXkoMTApOworCQl9CisJfQorfQorCiBzdGF0aWMgdm9pZCBkd19tY2lfc3RhcnRfY29tbWFuZChzdHJ1Y3QgZHdfbWNpICpob3N0LAogCQkJCSBzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCwgdTMyIGNtZF9mbGFncykKIHsKQEAgLTM0NSw2ICszNzIsNyBAQAogCiAJbWNpX3dyaXRlbChob3N0LCBDTURBUkcsIGNtZC0+YXJnKTsKIAl3bWIoKTsKKwlkd19tY2lfd2FpdF93aGlsZV9idXN5KGhvc3QsIGNtZF9mbGFncyk7CiAKIAltY2lfd3JpdGVsKGhvc3QsIENNRCwgY21kX2ZsYWdzIHwgU0RNTUNfQ01EX1NUQVJUKTsKIH0KQEAgLTQ3NywyMyArNTA1LDIzIEBACiAJCQkgKiBTZXQgdGhlIE9XTiBiaXQgYW5kIGRpc2FibGUgaW50ZXJydXB0cyBmb3IgdGhpcwogCQkJICogZGVzY3JpcHRvcgogCQkJICovCi0JCQlkZXNjLT5kZXMwID0gSURNQUNfREVTMF9PV04gfCBJRE1BQ19ERVMwX0RJQyB8Ci0JCQkJCQlJRE1BQ19ERVMwX0NIOworCQkJZGVzYy0+ZGVzMCA9IGNwdV90b19sZTMyKElETUFDX0RFUzBfT1dOIHwKKwkJCQkJSURNQUNfREVTMF9ESUMgfCBJRE1BQ19ERVMwX0NIKTsKIAkJCS8qIEJ1ZmZlciBsZW5ndGggKi8KIAkJCUlETUFDX1NFVF9CVUZGRVIxX1NJWkUoZGVzYywgbGVuZ3RoKTsKIAogCQkJLyogUGh5c2ljYWwgYWRkcmVzcyB0byBETUEgdG8vZnJvbSAqLwotCQkJZGVzYy0+ZGVzMiA9IG1lbV9hZGRyOworCQkJZGVzYy0+ZGVzMiA9IGNwdV90b19sZTMyKG1lbV9hZGRyKTsKIAkJfQogCiAJCS8qIFNldCBmaXJzdCBkZXNjcmlwdG9yICovCiAJCWRlc2MgPSBob3N0LT5zZ19jcHU7Ci0JCWRlc2MtPmRlczAgfD0gSURNQUNfREVTMF9GRDsKKwkJZGVzYy0+ZGVzMCB8PSBjcHVfdG9fbGUzMihJRE1BQ19ERVMwX0ZEKTsKIAogCQkvKiBTZXQgbGFzdCBkZXNjcmlwdG9yICovCiAJCWRlc2MgPSBob3N0LT5zZ19jcHUgKyAoaSAtIDEpICogc2l6ZW9mKHN0cnVjdCBpZG1hY19kZXNjKTsKLQkJZGVzYy0+ZGVzMCAmPSB+KElETUFDX0RFUzBfQ0ggfCBJRE1BQ19ERVMwX0RJQyk7Ci0JCWRlc2MtPmRlczAgfD0gSURNQUNfREVTMF9MRDsKKwkJZGVzYy0+ZGVzMCAmPSBjcHVfdG9fbGUzMih+KElETUFDX0RFUzBfQ0ggfCBJRE1BQ19ERVMwX0RJQykpOworCQlkZXNjLT5kZXMwIHw9IGNwdV90b19sZTMyKElETUFDX0RFUzBfTEQpOwogCX0KIAogCXdtYigpOwpAQCAtNTYyLDEyICs1OTAsMTIgQEAKIAogCQkvKiBGb3J3YXJkIGxpbmsgdGhlIGRlc2NyaXB0b3IgbGlzdCAqLwogCQlmb3IgKGkgPSAwLCBwID0gaG9zdC0+c2dfY3B1OyBpIDwgaG9zdC0+cmluZ19zaXplIC0gMTsgaSsrLCBwKyspCi0JCQlwLT5kZXMzID0gaG9zdC0+c2dfZG1hICsgKHNpemVvZihzdHJ1Y3QgaWRtYWNfZGVzYykgKgotCQkJCQkJCQkoaSArIDEpKTsKKwkJCXAtPmRlczMgPSBjcHVfdG9fbGUzMihob3N0LT5zZ19kbWEgKworCQkJCQkoc2l6ZW9mKHN0cnVjdCBpZG1hY19kZXNjKSAqIChpICsgMSkpKTsKIAogCQkvKiBTZXQgdGhlIGxhc3QgZGVzY3JpcHRvciBhcyB0aGUgZW5kLW9mLXJpbmcgZGVzY3JpcHRvciAqLwotCQlwLT5kZXMzID0gaG9zdC0+c2dfZG1hOwotCQlwLT5kZXMwID0gSURNQUNfREVTMF9FUjsKKwkJcC0+ZGVzMyA9IGNwdV90b19sZTMyKGhvc3QtPnNnX2RtYSk7CisJCXAtPmRlczAgPSBjcHVfdG9fbGUzMihJRE1BQ19ERVMwX0VSKTsKIAl9CiAKIAlkd19tY2lfaWRtYWNfcmVzZXQoaG9zdCk7CkBAIC03MzcsNiArNzY1LDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGhvc3QtPnRpbWluZyAhPSBNTUNfVElNSU5HX01NQ19IUzIwMCAmJgorCSAgICBob3N0LT50aW1pbmcgIT0gTU1DX1RJTUlOR19NTUNfSFM0MDAgJiYKIAkgICAgaG9zdC0+dGltaW5nICE9IE1NQ19USU1JTkdfVUhTX1NEUjEwNCkKIAkJZ290byBkaXNhYmxlOwogCkBAIC04NzYsNiArOTA1LDcgQEAKIAogCW1jaV93cml0ZWwoaG9zdCwgQ01EQVJHLCBhcmcpOwogCXdtYigpOworCWR3X21jaV93YWl0X3doaWxlX2J1c3koaG9zdCwgY21kKTsKIAltY2lfd3JpdGVsKGhvc3QsIENNRCwgU0RNTUNfQ01EX1NUQVJUIHwgY21kKTsKIAogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewpAQCAtOTkyLDYgKzEwMjIsMjYgQEAKIAogCWR3X21jaV9zdGFydF9jb21tYW5kKGhvc3QsIGNtZCwgY21kZmxhZ3MpOwogCisJaWYgKGNtZC0+b3Bjb2RlID09IFNEX1NXSVRDSF9WT0xUQUdFKSB7CisJCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisKKwkJLyoKKwkJICogRGF0YWJvb2sgc2F5cyB0byBmYWlsIGFmdGVyIDJtcyB3LyBubyByZXNwb25zZSwgYnV0IGV2aWRlbmNlCisJCSAqIHNob3dzIHRoYXQgc29tZXRpbWVzIHRoZSBjbWQxMSBpbnRlcnJ1cHQgdGFrZXMgb3ZlciAxMzBtcy4KKwkJICogV2UnbGwgc2V0IHRvIDUwMG1zLCBwbHVzIGFuIGV4dHJhIGppZmZ5IGp1c3QgaW4gY2FzZSBqaWZmaWVzCisJCSAqIGlzIGp1c3QgYWJvdXQgdG8gcm9sbCBvdmVyLgorCQkgKgorCQkgKiBXZSBkbyB0aGlzIHdob2xlIHRoaW5nIHVuZGVyIHNwaW5sb2NrIGFuZCBvbmx5IGlmIHRoZQorCQkgKiBjb21tYW5kIGhhc24ndCBhbHJlYWR5IGNvbXBsZXRlZCAoaW5kaWNhdGluZyB0aGUgdGhlIGlycQorCQkgKiBhbHJlYWR5IHJhbiBzbyB3ZSBkb24ndCB3YW50IHRoZSB0aW1lb3V0KS4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5pcnFfbG9jaywgaXJxZmxhZ3MpOworCQlpZiAoIXRlc3RfYml0KEVWRU5UX0NNRF9DT01QTEVURSwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkKKwkJCW1vZF90aW1lcigmaG9zdC0+Y21kMTFfdGltZXIsCisJCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSArIDEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5pcnFfbG9jaywgaXJxZmxhZ3MpOworCX0KKwogCWlmIChtcnEtPnN0b3ApCiAJCWhvc3QtPnN0b3BfY21kciA9IGR3X21jaV9wcmVwYXJlX2NvbW1hbmQoc2xvdC0+bW1jLCBtcnEtPnN0b3ApOwogCWVsc2UKQEAgLTEwODQsNyArMTEzNCw4IEBACiAJcmVncyA9IG1jaV9yZWFkbChzbG90LT5ob3N0LCBVSFNfUkVHKTsKIAogCS8qIEREUiBtb2RlIHNldCAqLwotCWlmIChpb3MtPnRpbWluZyA9PSBNTUNfVElNSU5HX01NQ19ERFI1MikKKwlpZiAoaW9zLT50aW1pbmcgPT0gTU1DX1RJTUlOR19NTUNfRERSNTIgfHwKKwkgICAgaW9zLT50aW1pbmcgPT0gTU1DX1RJTUlOR19NTUNfSFM0MDApCiAJCXJlZ3MgfD0gKCgweDEgPDwgc2xvdC0+aWQpIDw8IDE2KTsKIAllbHNlCiAJCXJlZ3MgJj0gfigoMHgxIDw8IHNsb3QtPmlkKSA8PCAxNik7CkBAIC0xMTAxLDEyICsxMTUyLDYgQEAKIAlpZiAoZHJ2X2RhdGEgJiYgZHJ2X2RhdGEtPnNldF9pb3MpCiAJCWRydl9kYXRhLT5zZXRfaW9zKHNsb3QtPmhvc3QsIGlvcyk7CiAKLQkvKiBTbG90IHNwZWNpZmljIHRpbWluZyBhbmQgd2lkdGggYWRqdXN0bWVudCAqLwotCWR3X21jaV9zZXR1cF9idXMoc2xvdCwgZmFsc2UpOwotCi0JaWYgKHNsb3QtPmhvc3QtPnN0YXRlID09IFNUQVRFX1dBSVRJTkdfQ01EMTFfRE9ORSAmJiBpb3MtPmNsb2NrICE9IDApCi0JCXNsb3QtPmhvc3QtPnN0YXRlID0gU1RBVEVfSURMRTsKLQogCXN3aXRjaCAoaW9zLT5wb3dlcl9tb2RlKSB7CiAJY2FzZSBNTUNfUE9XRVJfVVA6CiAJCWlmICghSVNfRVJSKG1tYy0+c3VwcGx5LnZtbWMpKSB7CkBAIC0xMTI1LDIzICsxMTcwLDM5IEBACiAJCW1jaV93cml0ZWwoc2xvdC0+aG9zdCwgUFdSRU4sIHJlZ3MpOwogCQlicmVhazsKIAljYXNlIE1NQ19QT1dFUl9PTjoKLQkJaWYgKCFJU19FUlIobW1jLT5zdXBwbHkudnFtbWMpICYmICFzbG90LT5ob3N0LT52cW1tY19lbmFibGVkKSB7Ci0JCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKG1tYy0+c3VwcGx5LnZxbW1jKTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWRldl9lcnIoc2xvdC0+aG9zdC0+ZGV2LAotCQkJCQkiZmFpbGVkIHRvIGVuYWJsZSB2cW1tYyByZWd1bGF0b3JcbiIpOwotCQkJZWxzZQorCQlpZiAoIXNsb3QtPmhvc3QtPnZxbW1jX2VuYWJsZWQpIHsKKwkJCWlmICghSVNfRVJSKG1tYy0+c3VwcGx5LnZxbW1jKSkgeworCQkJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUobW1jLT5zdXBwbHkudnFtbWMpOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQlkZXZfZXJyKHNsb3QtPmhvc3QtPmRldiwKKwkJCQkJCSJmYWlsZWQgdG8gZW5hYmxlIHZxbW1jXG4iKTsKKwkJCQllbHNlCisJCQkJCXNsb3QtPmhvc3QtPnZxbW1jX2VuYWJsZWQgPSB0cnVlOworCisJCQl9IGVsc2UgeworCQkJCS8qIEtlZXAgdHJhY2sgc28gd2UgZG9uJ3QgcmVzZXQgYWdhaW4gKi8KIAkJCQlzbG90LT5ob3N0LT52cW1tY19lbmFibGVkID0gdHJ1ZTsKKwkJCX0KKworCQkJLyogUmVzZXQgb3VyIHN0YXRlIG1hY2hpbmUgYWZ0ZXIgcG93ZXJpbmcgb24gKi8KKwkJCWR3X21jaV9jdHJsX3Jlc2V0KHNsb3QtPmhvc3QsCisJCQkJCSAgU0RNTUNfQ1RSTF9BTExfUkVTRVRfRkxBR1MpOwogCQl9CisKKwkJLyogQWRqdXN0IGNsb2NrIC8gYnVzIHdpZHRoIGFmdGVyIHBvd2VyIGlzIHVwICovCisJCWR3X21jaV9zZXR1cF9idXMoc2xvdCwgZmFsc2UpOworCiAJCWJyZWFrOwogCWNhc2UgTU1DX1BPV0VSX09GRjoKKwkJLyogVHVybiBjbG9jayBvZmYgYmVmb3JlIHBvd2VyIGdvZXMgZG93biAqLworCQlkd19tY2lfc2V0dXBfYnVzKHNsb3QsIGZhbHNlKTsKKwogCQlpZiAoIUlTX0VSUihtbWMtPnN1cHBseS52bW1jKSkKIAkJCW1tY19yZWd1bGF0b3Jfc2V0X29jcihtbWMsIG1tYy0+c3VwcGx5LnZtbWMsIDApOwogCi0JCWlmICghSVNfRVJSKG1tYy0+c3VwcGx5LnZxbW1jKSAmJiBzbG90LT5ob3N0LT52cW1tY19lbmFibGVkKSB7CisJCWlmICghSVNfRVJSKG1tYy0+c3VwcGx5LnZxbW1jKSAmJiBzbG90LT5ob3N0LT52cW1tY19lbmFibGVkKQogCQkJcmVndWxhdG9yX2Rpc2FibGUobW1jLT5zdXBwbHkudnFtbWMpOwotCQkJc2xvdC0+aG9zdC0+dnFtbWNfZW5hYmxlZCA9IGZhbHNlOwotCQl9CisJCXNsb3QtPmhvc3QtPnZxbW1jX2VuYWJsZWQgPSBmYWxzZTsKIAogCQlyZWdzID0gbWNpX3JlYWRsKHNsb3QtPmhvc3QsIFBXUkVOKTsKIAkJcmVncyAmPSB+KDEgPDwgc2xvdC0+aWQpOwpAQCAtMTE1MCw2ICsxMjExLDkgQEAKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CisKKwlpZiAoc2xvdC0+aG9zdC0+c3RhdGUgPT0gU1RBVEVfV0FJVElOR19DTUQxMV9ET05FICYmIGlvcy0+Y2xvY2sgIT0gMCkKKwkJc2xvdC0+aG9zdC0+c3RhdGUgPSBTVEFURV9JRExFOwogfQogCiBzdGF0aWMgaW50IGR3X21jaV9jYXJkX2J1c3koc3RydWN0IG1tY19ob3N0ICptbWMpCkBAIC0xMzIzLDYgKzEzODcsMTggQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IGR3X21jaV9wcmVwYXJlX2hzNDAwX3R1bmluZyhzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19pb3MgKmlvcykKK3sKKwlzdHJ1Y3QgZHdfbWNpX3Nsb3QgKnNsb3QgPSBtbWNfcHJpdihtbWMpOworCXN0cnVjdCBkd19tY2kgKmhvc3QgPSBzbG90LT5ob3N0OworCWNvbnN0IHN0cnVjdCBkd19tY2lfZHJ2X2RhdGEgKmRydl9kYXRhID0gaG9zdC0+ZHJ2X2RhdGE7CisKKwlpZiAoZHJ2X2RhdGEgJiYgZHJ2X2RhdGEtPnByZXBhcmVfaHM0MDBfdHVuaW5nKQorCQlyZXR1cm4gZHJ2X2RhdGEtPnByZXBhcmVfaHM0MDBfdHVuaW5nKGhvc3QsIGlvcyk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBtbWNfaG9zdF9vcHMgZHdfbWNpX29wcyA9IHsKIAkucmVxdWVzdAkJPSBkd19tY2lfcmVxdWVzdCwKIAkucHJlX3JlcQkJPSBkd19tY2lfcHJlX3JlcSwKQEAgLTEzMzUsNiArMTQxMSw3IEBACiAJLmNhcmRfYnVzeQkJPSBkd19tY2lfY2FyZF9idXN5LAogCS5zdGFydF9zaWduYWxfdm9sdGFnZV9zd2l0Y2ggPSBkd19tY2lfc3dpdGNoX3ZvbHRhZ2UsCiAJLmluaXRfY2FyZAkJPSBkd19tY2lfaW5pdF9jYXJkLAorCS5wcmVwYXJlX2hzNDAwX3R1bmluZwk9IGR3X21jaV9wcmVwYXJlX2hzNDAwX3R1bmluZywKIH07CiAKIHN0YXRpYyB2b2lkIGR3X21jaV9yZXF1ZXN0X2VuZChzdHJ1Y3QgZHdfbWNpICpob3N0LCBzdHJ1Y3QgbW1jX3JlcXVlc3QgKm1ycSkKQEAgLTE1MjAsNyArMTU5NywxMCBAQAogCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChFVkVOVF9EQVRBX0VSUk9SLAogCQkJCQkgICAgICAgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKSkgewogCQkJCWR3X21jaV9zdG9wX2RtYShob3N0KTsKLQkJCQlzZW5kX3N0b3BfYWJvcnQoaG9zdCwgZGF0YSk7CisJCQkJaWYgKGRhdGEtPnN0b3AgfHwKKwkJCQkgICAgIShob3N0LT5kYXRhX3N0YXR1cyAmIChTRE1NQ19JTlRfRFJUTyB8CisJCQkJCQkJICAgU0RNTUNfSU5UX0VCRSkpKQorCQkJCQlzZW5kX3N0b3BfYWJvcnQoaG9zdCwgZGF0YSk7CiAJCQkJc3RhdGUgPSBTVEFURV9EQVRBX0VSUk9SOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMTU0Nyw3ICsxNjI3LDEwIEBACiAJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEVWRU5UX0RBVEFfRVJST1IsCiAJCQkJCSAgICAgICAmaG9zdC0+cGVuZGluZ19ldmVudHMpKSB7CiAJCQkJZHdfbWNpX3N0b3BfZG1hKGhvc3QpOwotCQkJCXNlbmRfc3RvcF9hYm9ydChob3N0LCBkYXRhKTsKKwkJCQlpZiAoZGF0YS0+c3RvcCB8fAorCQkJCSAgICAhKGhvc3QtPmRhdGFfc3RhdHVzICYgKFNETU1DX0lOVF9EUlRPIHwKKwkJCQkJCQkgICBTRE1NQ19JTlRfRUJFKSkpCisJCQkJCXNlbmRfc3RvcF9hYm9ydChob3N0LCBkYXRhKTsKIAkJCQlzdGF0ZSA9IFNUQVRFX0RBVEFfRVJST1I7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xNjg1LDggKzE3NjgsNyBAQAogCQlidWYgKz0gbGVuOwogCQljbnQgLT0gbGVuOwogCQlpZiAoaG9zdC0+cGFydF9idWZfY291bnQgPT0gMikgewotCQkJbWNpX3dyaXRldyhob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwKLQkJCQkJaG9zdC0+cGFydF9idWYxNik7CisJCQltY2lfZmlmb193cml0ZXcoaG9zdC0+Zmlmb19yZWcsIGhvc3QtPnBhcnRfYnVmMTYpOwogCQkJaG9zdC0+cGFydF9idWZfY291bnQgPSAwOwogCQl9CiAJfQpAQCAtMTcwMywxNSArMTc4NSwxNCBAQAogCQkJY250IC09IGxlbjsKIAkJCS8qIHB1c2ggZGF0YSBmcm9tIGFsaWduZWQgYnVmZmVyIGludG8gZmlmbyAqLwogCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1zOyArK2kpCi0JCQkJbWNpX3dyaXRldyhob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwKLQkJCQkJCWFsaWduZWRfYnVmW2ldKTsKKwkJCQltY2lfZmlmb193cml0ZXcoaG9zdC0+Zmlmb19yZWcsIGFsaWduZWRfYnVmW2ldKTsKIAkJfQogCX0gZWxzZQogI2VuZGlmCiAJewogCQl1MTYgKnBkYXRhID0gYnVmOwogCQlmb3IgKDsgY250ID49IDI7IGNudCAtPSAyKQotCQkJbWNpX3dyaXRldyhob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwgKnBkYXRhKyspOworCQkJbWNpX2ZpZm9fd3JpdGV3KGhvc3QtPmZpZm9fcmVnLCAqcGRhdGErKyk7CiAJCWJ1ZiA9IHBkYXRhOwogCX0KIAkvKiBwdXQgYW55dGhpbmcgcmVtYWluaW5nIGluIHRoZSBwYXJ0X2J1ZiAqLwpAQCAtMTcyMCw4ICsxODAxLDcgQEAKIAkJIC8qIFB1c2ggZGF0YSBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGV4cGVjdGVkIGRhdGEgbGVuZ3RoICovCiAJCWlmICgoZGF0YS0+Ynl0ZXNfeGZlcmVkICsgaW5pdF9jbnQpID09CiAJCSAgICAoZGF0YS0+Ymxrc3ogKiBkYXRhLT5ibG9ja3MpKQotCQkJbWNpX3dyaXRldyhob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwKLQkJCQkgICBob3N0LT5wYXJ0X2J1ZjE2KTsKKwkJCW1jaV9maWZvX3dyaXRldyhob3N0LT5maWZvX3JlZywgaG9zdC0+cGFydF9idWYxNik7CiAJfQogfQogCkBAIC0xNzM2LDggKzE4MTYsNyBAQAogCQkJaW50IGl0ZW1zID0gbGVuID4+IDE7CiAJCQlpbnQgaTsKIAkJCWZvciAoaSA9IDA7IGkgPCBpdGVtczsgKytpKQotCQkJCWFsaWduZWRfYnVmW2ldID0gbWNpX3JlYWR3KGhvc3QsCi0JCQkJCQlEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSk7CisJCQkJYWxpZ25lZF9idWZbaV0gPSBtY2lfZmlmb19yZWFkdyhob3N0LT5maWZvX3JlZyk7CiAJCQkvKiBtZW1jcHkgZnJvbSBhbGlnbmVkIGJ1ZmZlciBpbnRvIG91dHB1dCBidWZmZXIgKi8KIAkJCW1lbWNweShidWYsIGFsaWduZWRfYnVmLCBsZW4pOwogCQkJYnVmICs9IGxlbjsKQEAgLTE3NDgsMTEgKzE4MjcsMTEgQEAKIAl7CiAJCXUxNiAqcGRhdGEgPSBidWY7CiAJCWZvciAoOyBjbnQgPj0gMjsgY250IC09IDIpCi0JCQkqcGRhdGErKyA9IG1jaV9yZWFkdyhob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSk7CisJCQkqcGRhdGErKyA9IG1jaV9maWZvX3JlYWR3KGhvc3QtPmZpZm9fcmVnKTsKIAkJYnVmID0gcGRhdGE7CiAJfQogCWlmIChjbnQpIHsKLQkJaG9zdC0+cGFydF9idWYxNiA9IG1jaV9yZWFkdyhob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSk7CisJCWhvc3QtPnBhcnRfYnVmMTYgPSBtY2lfZmlmb19yZWFkdyhob3N0LT5maWZvX3JlZyk7CiAJCWR3X21jaV9wdWxsX2ZpbmFsX2J5dGVzKGhvc3QsIGJ1ZiwgY250KTsKIAl9CiB9CkBAIC0xNzY4LDggKzE4NDcsNyBAQAogCQlidWYgKz0gbGVuOwogCQljbnQgLT0gbGVuOwogCQlpZiAoaG9zdC0+cGFydF9idWZfY291bnQgPT0gNCkgewotCQkJbWNpX3dyaXRlbChob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwKLQkJCQkJaG9zdC0+cGFydF9idWYzMik7CisJCQltY2lfZmlmb193cml0ZWwoaG9zdC0+Zmlmb19yZWcsCWhvc3QtPnBhcnRfYnVmMzIpOwogCQkJaG9zdC0+cGFydF9idWZfY291bnQgPSAwOwogCQl9CiAJfQpAQCAtMTc4NiwxNSArMTg2NCwxNCBAQAogCQkJY250IC09IGxlbjsKIAkJCS8qIHB1c2ggZGF0YSBmcm9tIGFsaWduZWQgYnVmZmVyIGludG8gZmlmbyAqLwogCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1zOyArK2kpCi0JCQkJbWNpX3dyaXRlbChob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwKLQkJCQkJCWFsaWduZWRfYnVmW2ldKTsKKwkJCQltY2lfZmlmb193cml0ZWwoaG9zdC0+Zmlmb19yZWcsCWFsaWduZWRfYnVmW2ldKTsKIAkJfQogCX0gZWxzZQogI2VuZGlmCiAJewogCQl1MzIgKnBkYXRhID0gYnVmOwogCQlmb3IgKDsgY250ID49IDQ7IGNudCAtPSA0KQotCQkJbWNpX3dyaXRlbChob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwgKnBkYXRhKyspOworCQkJbWNpX2ZpZm9fd3JpdGVsKGhvc3QtPmZpZm9fcmVnLCAqcGRhdGErKyk7CiAJCWJ1ZiA9IHBkYXRhOwogCX0KIAkvKiBwdXQgYW55dGhpbmcgcmVtYWluaW5nIGluIHRoZSBwYXJ0X2J1ZiAqLwpAQCAtMTgwMyw4ICsxODgwLDcgQEAKIAkJIC8qIFB1c2ggZGF0YSBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGV4cGVjdGVkIGRhdGEgbGVuZ3RoICovCiAJCWlmICgoZGF0YS0+Ynl0ZXNfeGZlcmVkICsgaW5pdF9jbnQpID09CiAJCSAgICAoZGF0YS0+Ymxrc3ogKiBkYXRhLT5ibG9ja3MpKQotCQkJbWNpX3dyaXRlbChob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwKLQkJCQkgICBob3N0LT5wYXJ0X2J1ZjMyKTsKKwkJCW1jaV9maWZvX3dyaXRlbChob3N0LT5maWZvX3JlZywgaG9zdC0+cGFydF9idWYzMik7CiAJfQogfQogCkBAIC0xODE5LDggKzE4OTUsNyBAQAogCQkJaW50IGl0ZW1zID0gbGVuID4+IDI7CiAJCQlpbnQgaTsKIAkJCWZvciAoaSA9IDA7IGkgPCBpdGVtczsgKytpKQotCQkJCWFsaWduZWRfYnVmW2ldID0gbWNpX3JlYWRsKGhvc3QsCi0JCQkJCQlEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSk7CisJCQkJYWxpZ25lZF9idWZbaV0gPSBtY2lfZmlmb19yZWFkbChob3N0LT5maWZvX3JlZyk7CiAJCQkvKiBtZW1jcHkgZnJvbSBhbGlnbmVkIGJ1ZmZlciBpbnRvIG91dHB1dCBidWZmZXIgKi8KIAkJCW1lbWNweShidWYsIGFsaWduZWRfYnVmLCBsZW4pOwogCQkJYnVmICs9IGxlbjsKQEAgLTE4MzEsMTEgKzE5MDYsMTEgQEAKIAl7CiAJCXUzMiAqcGRhdGEgPSBidWY7CiAJCWZvciAoOyBjbnQgPj0gNDsgY250IC09IDQpCi0JCQkqcGRhdGErKyA9IG1jaV9yZWFkbChob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSk7CisJCQkqcGRhdGErKyA9IG1jaV9maWZvX3JlYWRsKGhvc3QtPmZpZm9fcmVnKTsKIAkJYnVmID0gcGRhdGE7CiAJfQogCWlmIChjbnQpIHsKLQkJaG9zdC0+cGFydF9idWYzMiA9IG1jaV9yZWFkbChob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSk7CisJCWhvc3QtPnBhcnRfYnVmMzIgPSBtY2lfZmlmb19yZWFkbChob3N0LT5maWZvX3JlZyk7CiAJCWR3X21jaV9wdWxsX2ZpbmFsX2J5dGVzKGhvc3QsIGJ1ZiwgY250KTsKIAl9CiB9CkBAIC0xODUyLDggKzE5MjcsNyBAQAogCQljbnQgLT0gbGVuOwogCiAJCWlmIChob3N0LT5wYXJ0X2J1Zl9jb3VudCA9PSA4KSB7Ci0JCQltY2lfd3JpdGVxKGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpLAotCQkJCQlob3N0LT5wYXJ0X2J1Zik7CisJCQltY2lfZmlmb193cml0ZXEoaG9zdC0+Zmlmb19yZWcsCWhvc3QtPnBhcnRfYnVmKTsKIAkJCWhvc3QtPnBhcnRfYnVmX2NvdW50ID0gMDsKIAkJfQogCX0KQEAgLTE4NzAsMTUgKzE5NDQsMTQgQEAKIAkJCWNudCAtPSBsZW47CiAJCQkvKiBwdXNoIGRhdGEgZnJvbSBhbGlnbmVkIGJ1ZmZlciBpbnRvIGZpZm8gKi8KIAkJCWZvciAoaSA9IDA7IGkgPCBpdGVtczsgKytpKQotCQkJCW1jaV93cml0ZXEoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksCi0JCQkJCQlhbGlnbmVkX2J1ZltpXSk7CisJCQkJbWNpX2ZpZm9fd3JpdGVxKGhvc3QtPmZpZm9fcmVnLAlhbGlnbmVkX2J1ZltpXSk7CiAJCX0KIAl9IGVsc2UKICNlbmRpZgogCXsKIAkJdTY0ICpwZGF0YSA9IGJ1ZjsKIAkJZm9yICg7IGNudCA+PSA4OyBjbnQgLT0gOCkKLQkJCW1jaV93cml0ZXEoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCksICpwZGF0YSsrKTsKKwkJCW1jaV9maWZvX3dyaXRlcShob3N0LT5maWZvX3JlZywgKnBkYXRhKyspOwogCQlidWYgPSBwZGF0YTsKIAl9CiAJLyogcHV0IGFueXRoaW5nIHJlbWFpbmluZyBpbiB0aGUgcGFydF9idWYgKi8KQEAgLTE4ODcsOCArMTk2MCw3IEBACiAJCS8qIFB1c2ggZGF0YSBpZiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGV4cGVjdGVkIGRhdGEgbGVuZ3RoICovCiAJCWlmICgoZGF0YS0+Ynl0ZXNfeGZlcmVkICsgaW5pdF9jbnQpID09CiAJCSAgICAoZGF0YS0+Ymxrc3ogKiBkYXRhLT5ibG9ja3MpKQotCQkJbWNpX3dyaXRlcShob3N0LCBEQVRBKGhvc3QtPmRhdGFfb2Zmc2V0KSwKLQkJCQkgICBob3N0LT5wYXJ0X2J1Zik7CisJCQltY2lfZmlmb193cml0ZXEoaG9zdC0+Zmlmb19yZWcsIGhvc3QtPnBhcnRfYnVmKTsKIAl9CiB9CiAKQEAgLTE5MDMsOCArMTk3NSw4IEBACiAJCQlpbnQgaXRlbXMgPSBsZW4gPj4gMzsKIAkJCWludCBpOwogCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1zOyArK2kpCi0JCQkJYWxpZ25lZF9idWZbaV0gPSBtY2lfcmVhZHEoaG9zdCwKLQkJCQkJCURBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpKTsKKwkJCQlhbGlnbmVkX2J1ZltpXSA9IG1jaV9maWZvX3JlYWRxKGhvc3QtPmZpZm9fcmVnKTsKKwogCQkJLyogbWVtY3B5IGZyb20gYWxpZ25lZCBidWZmZXIgaW50byBvdXRwdXQgYnVmZmVyICovCiAJCQltZW1jcHkoYnVmLCBhbGlnbmVkX2J1ZiwgbGVuKTsKIAkJCWJ1ZiArPSBsZW47CkBAIC0xOTE1LDExICsxOTg3LDExIEBACiAJewogCQl1NjQgKnBkYXRhID0gYnVmOwogCQlmb3IgKDsgY250ID49IDg7IGNudCAtPSA4KQotCQkJKnBkYXRhKysgPSBtY2lfcmVhZHEoaG9zdCwgREFUQShob3N0LT5kYXRhX29mZnNldCkpOworCQkJKnBkYXRhKysgPSBtY2lfZmlmb19yZWFkcShob3N0LT5maWZvX3JlZyk7CiAJCWJ1ZiA9IHBkYXRhOwogCX0KIAlpZiAoY250KSB7Ci0JCWhvc3QtPnBhcnRfYnVmID0gbWNpX3JlYWRxKGhvc3QsIERBVEEoaG9zdC0+ZGF0YV9vZmZzZXQpKTsKKwkJaG9zdC0+cGFydF9idWYgPSBtY2lfZmlmb19yZWFkcShob3N0LT5maWZvX3JlZyk7CiAJCWR3X21jaV9wdWxsX2ZpbmFsX2J5dGVzKGhvc3QsIGJ1ZiwgY250KTsKIAl9CiB9CkBAIC0yMDk3LDkgKzIxNjksMjAgQEAKIAkJLyogQ2hlY2sgdm9sdCBzd2l0Y2ggZmlyc3QsIHNpbmNlIGl0IGNhbiBsb29rIGxpa2UgYW4gZXJyb3IgKi8KIAkJaWYgKChob3N0LT5zdGF0ZSA9PSBTVEFURV9TRU5ESU5HX0NNRDExKSAmJgogCQkgICAgKHBlbmRpbmcgJiBTRE1NQ19JTlRfVk9MVF9TV0lUQ0gpKSB7CisJCQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCiAJCQltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIFNETU1DX0lOVF9WT0xUX1NXSVRDSCk7CiAJCQlwZW5kaW5nICY9IH5TRE1NQ19JTlRfVk9MVF9TV0lUQ0g7CisKKwkJCS8qCisJCQkgKiBIb2xkIHRoZSBsb2NrOyB3ZSBrbm93IGNtZDExX3RpbWVyIGNhbid0IGJlIGtpY2tlZAorCQkJICogb2ZmIGFmdGVyIHRoZSBsb2NrIGlzIHJlbGVhc2VkLCBzbyBzYWZlIHRvIGRlbGV0ZS4KKwkJCSAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhvc3QtPmlycV9sb2NrLCBpcnFmbGFncyk7CiAJCQlkd19tY2lfY21kX2ludGVycnVwdChob3N0LCBwZW5kaW5nKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmlycV9sb2NrLCBpcnFmbGFncyk7CisKKwkJCWRlbF90aW1lcigmaG9zdC0+Y21kMTFfdGltZXIpOwogCQl9CiAKIAkJaWYgKHBlbmRpbmcgJiBEV19NQ0lfQ01EX0VSUk9SX0ZMQUdTKSB7CkBAIC0yMTU2LDYgKzIyMzksMTAgQEAKIAkJLyogSGFuZGxlIFNESU8gSW50ZXJydXB0cyAqLwogCQlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bnVtX3Nsb3RzOyBpKyspIHsKIAkJCXN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdCA9IGhvc3QtPnNsb3RbaV07CisKKwkJCWlmICghc2xvdCkKKwkJCQljb250aW51ZTsKKwogCQkJaWYgKHBlbmRpbmcgJiBTRE1NQ19JTlRfU0RJTyhzbG90LT5zZGlvX2lkKSkgewogCQkJCW1jaV93cml0ZWwoaG9zdCwgUklOVFNUUywKIAkJCQkJICAgU0RNTUNfSU5UX1NESU8oc2xvdC0+c2Rpb19pZCkpOwpAQCAtMjUwNiw2ICsyNTkzLDIwIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgZHdfbWNpX2NtZDExX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBkd19tY2kgKmhvc3QgPSAoc3RydWN0IGR3X21jaSAqKWFyZzsKKworCWlmIChob3N0LT5zdGF0ZSAhPSBTVEFURV9TRU5ESU5HX0NNRDExKSB7CisJCWRldl93YXJuKGhvc3QtPmRldiwgIlVuZXhwZWN0ZWQgQ01EMTEgdGltZW91dFxuIik7CisJCXJldHVybjsKKwl9CisKKwlob3N0LT5jbWRfc3RhdHVzID0gU0RNTUNfSU5UX1JUTzsKKwlzZXRfYml0KEVWRU5UX0NNRF9DT01QTEVURSwgJmhvc3QtPnBlbmRpbmdfZXZlbnRzKTsKKwl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT50YXNrbGV0KTsKK30KKwogI2lmZGVmIENPTkZJR19PRgogc3RhdGljIHN0cnVjdCBkd19tY2lfb2ZfcXVpcmtzIHsKIAljaGFyICpxdWlyazsKQEAgLTI1NzQsNiArMjY3NSwzNCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19PRiAqLwogCitzdGF0aWMgdm9pZCBkd19tY2lfZW5hYmxlX2NkKHN0cnVjdCBkd19tY2kgKmhvc3QpCit7CisJc3RydWN0IGR3X21jaV9ib2FyZCAqYnJkID0gaG9zdC0+cGRhdGE7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwl1MzIgdGVtcDsKKwlpbnQgaTsKKworCS8qIE5vIG5lZWQgZm9yIENEIGlmIGJyb2tlbiBjYXJkIGRldGVjdGlvbiAqLworCWlmIChicmQtPnF1aXJrcyAmIERXX01DSV9RVUlSS19CUk9LRU5fQ0FSRF9ERVRFQ1RJT04pCisJCXJldHVybjsKKworCS8qIE5vIG5lZWQgZm9yIENEIGlmIGFsbCBzbG90cyBoYXZlIGEgbm9uLWVycm9yIEdQSU8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaG9zdC0+bnVtX3Nsb3RzOyBpKyspIHsKKwkJc3RydWN0IGR3X21jaV9zbG90ICpzbG90ID0gaG9zdC0+c2xvdFtpXTsKKworCQlpZiAoSVNfRVJSX1ZBTFVFKG1tY19ncGlvX2dldF9jZChzbG90LT5tbWMpKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBob3N0LT5udW1fc2xvdHMpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5pcnFfbG9jaywgaXJxZmxhZ3MpOworCXRlbXAgPSBtY2lfcmVhZGwoaG9zdCwgSU5UTUFTSyk7CisJdGVtcCAgfD0gU0RNTUNfSU5UX0NEOworCW1jaV93cml0ZWwoaG9zdCwgSU5UTUFTSywgdGVtcCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+aXJxX2xvY2ssIGlycWZsYWdzKTsKK30KKwogaW50IGR3X21jaV9wcm9iZShzdHJ1Y3QgZHdfbWNpICpob3N0KQogewogCWNvbnN0IHN0cnVjdCBkd19tY2lfZHJ2X2RhdGEgKmRydl9kYXRhID0gaG9zdC0+ZHJ2X2RhdGE7CkBAIC0yNjUyLDYgKzI3ODEsOSBAQAogCQl9CiAJfQogCisJc2V0dXBfdGltZXIoJmhvc3QtPmNtZDExX3RpbWVyLAorCQkgICAgZHdfbWNpX2NtZDExX3RpbWVyLCAodW5zaWduZWQgbG9uZylob3N0KTsKKwogCWhvc3QtPnF1aXJrcyA9IGhvc3QtPnBkYXRhLT5xdWlya3M7CiAKIAlzcGluX2xvY2tfaW5pdCgmaG9zdC0+bG9jayk7CkBAIC0yNzMxLDkgKzI4NjMsOSBAQAogCWRldl9pbmZvKGhvc3QtPmRldiwgIlZlcnNpb24gSUQgaXMgJTA0eFxuIiwgaG9zdC0+dmVyaWQpOwogCiAJaWYgKGhvc3QtPnZlcmlkIDwgRFdfTU1DXzI0MEEpCi0JCWhvc3QtPmRhdGFfb2Zmc2V0ID0gREFUQV9PRkZTRVQ7CisJCWhvc3QtPmZpZm9fcmVnID0gaG9zdC0+cmVncyArIERBVEFfT0ZGU0VUOwogCWVsc2UKLQkJaG9zdC0+ZGF0YV9vZmZzZXQgPSBEQVRBXzI0MEFfT0ZGU0VUOworCQlob3N0LT5maWZvX3JlZyA9IGhvc3QtPnJlZ3MgKyBEQVRBXzI0MEFfT0ZGU0VUOwogCiAJdGFza2xldF9pbml0KCZob3N0LT50YXNrbGV0LCBkd19tY2lfdGFza2xldF9mdW5jLCAodW5zaWduZWQgbG9uZylob3N0KTsKIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGhvc3QtPmRldiwgaG9zdC0+aXJxLCBkd19tY2lfaW50ZXJydXB0LApAQCAtMjc0NywxMyArMjg3OSwxMyBAQAogCQlob3N0LT5udW1fc2xvdHMgPSAoKG1jaV9yZWFkbChob3N0LCBIQ09OKSA+PiAxKSAmIDB4MUYpICsgMTsKIAogCS8qCi0JICogRW5hYmxlIGludGVycnVwdHMgZm9yIGNvbW1hbmQgZG9uZSwgZGF0YSBvdmVyLCBkYXRhIGVtcHR5LCBjYXJkIGRldCwKKwkgKiBFbmFibGUgaW50ZXJydXB0cyBmb3IgY29tbWFuZCBkb25lLCBkYXRhIG92ZXIsIGRhdGEgZW1wdHksCiAJICogcmVjZWl2ZSByZWFkeSBhbmQgZXJyb3Igc3VjaCBhcyB0cmFuc21pdCwgcmVjZWl2ZSB0aW1lb3V0LCBjcmMgZXJyb3IKIAkgKi8KIAltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIDB4RkZGRkZGRkYpOwogCW1jaV93cml0ZWwoaG9zdCwgSU5UTUFTSywgU0RNTUNfSU5UX0NNRF9ET05FIHwgU0RNTUNfSU5UX0RBVEFfT1ZFUiB8CiAJCSAgIFNETU1DX0lOVF9UWERSIHwgU0RNTUNfSU5UX1JYRFIgfAotCQkgICBEV19NQ0lfRVJST1JfRkxBR1MgfCBTRE1NQ19JTlRfQ0QpOworCQkgICBEV19NQ0lfRVJST1JfRkxBR1MpOwogCW1jaV93cml0ZWwoaG9zdCwgQ1RSTCwgU0RNTUNfQ1RSTF9JTlRfRU5BQkxFKTsgLyogRW5hYmxlIG1jaSBpbnRlcnJ1cHQgKi8KIAogCWRldl9pbmZvKGhvc3QtPmRldiwgIkRXIE1NQyBjb250cm9sbGVyIGF0IGlycSAlZCwgIgpAQCAtMjc3OCw2ICsyOTEwLDkgQEAKIAkJZ290byBlcnJfZG1hdW5tYXA7CiAJfQogCisJLyogTm93IHRoYXQgc2xvdHMgYXJlIGFsbCBzZXR1cCwgd2UgY2FuIGVuYWJsZSBjYXJkIGRldGVjdCAqLworCWR3X21jaV9lbmFibGVfY2QoaG9zdCk7CisKIAlpZiAoaG9zdC0+cXVpcmtzICYgRFdfTUNJX1FVSVJLX0lETUFDX0RUTykKIAkJZGV2X2luZm8oaG9zdC0+ZGV2LCAiSW50ZXJuYWwgRE1BQyBpbnRlcnJ1cHQgZml4IGVuYWJsZWQuXG4iKTsKIApAQCAtMjg2NCw3ICsyOTk5LDcgQEAKIAltY2lfd3JpdGVsKGhvc3QsIFJJTlRTVFMsIDB4RkZGRkZGRkYpOwogCW1jaV93cml0ZWwoaG9zdCwgSU5UTUFTSywgU0RNTUNfSU5UX0NNRF9ET05FIHwgU0RNTUNfSU5UX0RBVEFfT1ZFUiB8CiAJCSAgIFNETU1DX0lOVF9UWERSIHwgU0RNTUNfSU5UX1JYRFIgfAotCQkgICBEV19NQ0lfRVJST1JfRkxBR1MgfCBTRE1NQ19JTlRfQ0QpOworCQkgICBEV19NQ0lfRVJST1JfRkxBR1MpOwogCW1jaV93cml0ZWwoaG9zdCwgQ1RSTCwgU0RNTUNfQ1RSTF9JTlRfRU5BQkxFKTsKIAogCWZvciAoaSA9IDA7IGkgPCBob3N0LT5udW1fc2xvdHM7IGkrKykgewpAQCAtMjg3Niw2ICszMDExLDEwIEBACiAJCQlkd19tY2lfc2V0dXBfYnVzKHNsb3QsIHRydWUpOwogCQl9CiAJfQorCisJLyogTm93IHRoYXQgc2xvdHMgYXJlIGFsbCBzZXR1cCwgd2UgY2FuIGVuYWJsZSBjYXJkIGRldGVjdCAqLworCWR3X21jaV9lbmFibGVfY2QoaG9zdCk7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woZHdfbWNpX3Jlc3VtZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oIGIvZHJpdmVycy9tbWMvaG9zdC9kd19tbWMuaAppbmRleCAxOGM0YWZlLi5mNDVhYjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L2R3X21tYy5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvZHdfbW1jLmgKQEAgLTE2OSwyNCArMTY5LDM0IEBACiAjZGVmaW5lIFNETU1DX0NUUkxfQUxMX1JFU0VUX0ZMQUdTIFwKIAkoU0RNTUNfQ1RSTF9SRVNFVCB8IFNETU1DX0NUUkxfRklGT19SRVNFVCB8IFNETU1DX0NUUkxfRE1BX1JFU0VUKQogCisvKiBGSUZPIHJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MuIFRoZXNlIHNob3VsZCBub3QgY2hhbmdlIHRoZSBkYXRhIGVuZGlhbi1uZXNzCisgKiBhcyB0aGV5IGFyZSB3cml0dGVuIHRvIG1lbW9yeSB0byBiZSBkZWFsdCB3aXRoIGJ5IHRoZSB1cHBlciBsYXllcnMgKi8KKyNkZWZpbmUgbWNpX2ZpZm9fcmVhZHcoX19yZWcpCV9fcmF3X3JlYWR3KF9fcmVnKQorI2RlZmluZSBtY2lfZmlmb19yZWFkbChfX3JlZykJX19yYXdfcmVhZGwoX19yZWcpCisjZGVmaW5lIG1jaV9maWZvX3JlYWRxKF9fcmVnKQlfX3Jhd19yZWFkcShfX3JlZykKKworI2RlZmluZSBtY2lfZmlmb193cml0ZXcoX192YWx1ZSwgX19yZWcpCV9fcmF3X3dyaXRldyhfX3JlZywgX192YWx1ZSkKKyNkZWZpbmUgbWNpX2ZpZm9fd3JpdGVsKF9fdmFsdWUsIF9fcmVnKQlfX3Jhd193cml0ZWwoX19yZWcsIF9fdmFsdWUpCisjZGVmaW5lIG1jaV9maWZvX3dyaXRlcShfX3ZhbHVlLCBfX3JlZykJX19yYXdfd3JpdGVxKF9fcmVnLCBfX3ZhbHVlKQorCiAvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCiAjZGVmaW5lIG1jaV9yZWFkbChkZXYsIHJlZykJCQlcCi0JX19yYXdfcmVhZGwoKGRldiktPnJlZ3MgKyBTRE1NQ18jI3JlZykKKwlyZWFkbF9yZWxheGVkKChkZXYpLT5yZWdzICsgU0RNTUNfIyNyZWcpCiAjZGVmaW5lIG1jaV93cml0ZWwoZGV2LCByZWcsIHZhbHVlKQkJCVwKLQlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKGRldiktPnJlZ3MgKyBTRE1NQ18jI3JlZykKKwl3cml0ZWxfcmVsYXhlZCgodmFsdWUpLCAoZGV2KS0+cmVncyArIFNETU1DXyMjcmVnKQogCiAvKiAxNi1iaXQgRklGTyBhY2Nlc3MgbWFjcm9zICovCiAjZGVmaW5lIG1jaV9yZWFkdyhkZXYsIHJlZykJCQlcCi0JX19yYXdfcmVhZHcoKGRldiktPnJlZ3MgKyBTRE1NQ18jI3JlZykKKwlyZWFkd19yZWxheGVkKChkZXYpLT5yZWdzICsgU0RNTUNfIyNyZWcpCiAjZGVmaW5lIG1jaV93cml0ZXcoZGV2LCByZWcsIHZhbHVlKQkJCVwKLQlfX3Jhd193cml0ZXcoKHZhbHVlKSwgKGRldiktPnJlZ3MgKyBTRE1NQ18jI3JlZykKKwl3cml0ZXdfcmVsYXhlZCgodmFsdWUpLCAoZGV2KS0+cmVncyArIFNETU1DXyMjcmVnKQogCiAvKiA2NC1iaXQgRklGTyBhY2Nlc3MgbWFjcm9zICovCiAjaWZkZWYgcmVhZHEKICNkZWZpbmUgbWNpX3JlYWRxKGRldiwgcmVnKQkJCVwKLQlfX3Jhd19yZWFkcSgoZGV2KS0+cmVncyArIFNETU1DXyMjcmVnKQorCXJlYWRxX3JlbGF4ZWQoKGRldiktPnJlZ3MgKyBTRE1NQ18jI3JlZykKICNkZWZpbmUgbWNpX3dyaXRlcShkZXYsIHJlZywgdmFsdWUpCQkJXAotCV9fcmF3X3dyaXRlcSgodmFsdWUpLCAoZGV2KS0+cmVncyArIFNETU1DXyMjcmVnKQorCXdyaXRlcV9yZWxheGVkKCh2YWx1ZSksIChkZXYpLT5yZWdzICsgU0RNTUNfIyNyZWcpCiAjZWxzZQogLyoKICAqIER1bW15IHJlYWRxIGltcGxlbWVudGF0aW9uIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgZGVmaW5lIGl0LgpAQCAtMjAwLDYgKzIxMCwxMCBAQAogCSgqKHZvbGF0aWxlIHU2NCBfX2ZvcmNlICopKChkZXYpLT5yZWdzICsgU0RNTUNfIyNyZWcpKQogI2RlZmluZSBtY2lfd3JpdGVxKGRldiwgcmVnLCB2YWx1ZSkJCQlcCiAJKCoodm9sYXRpbGUgdTY0IF9fZm9yY2UgKikoKGRldiktPnJlZ3MgKyBTRE1NQ18jI3JlZykgPSAodmFsdWUpKQorCisjZGVmaW5lIF9fcmF3X3dyaXRlcShfX3ZhbHVlLCBfX3JlZykgXAorCSgqKHZvbGF0aWxlIHU2NCBfX2ZvcmNlICopKF9fcmVnKSA9IChfX3ZhbHVlKSkKKyNkZWZpbmUgX19yYXdfcmVhZHEoX19yZWcpICgqKHZvbGF0aWxlIHU2NCBfX2ZvcmNlICopKF9fcmVnKSkKICNlbmRpZgogCiBleHRlcm4gaW50IGR3X21jaV9wcm9iZShzdHJ1Y3QgZHdfbWNpICpob3N0KTsKQEAgLTI3MSw1ICsyODUsNyBAQAogCXZvaWQJCSgqc2V0X2lvcykoc3RydWN0IGR3X21jaSAqaG9zdCwgc3RydWN0IG1tY19pb3MgKmlvcyk7CiAJaW50CQkoKnBhcnNlX2R0KShzdHJ1Y3QgZHdfbWNpICpob3N0KTsKIAlpbnQJCSgqZXhlY3V0ZV90dW5pbmcpKHN0cnVjdCBkd19tY2lfc2xvdCAqc2xvdCk7CisJaW50CQkoKnByZXBhcmVfaHM0MDBfdHVuaW5nKShzdHJ1Y3QgZHdfbWNpICpob3N0LAorCQkJCQkJc3RydWN0IG1tY19pb3MgKmlvcyk7CiB9OwogI2VuZGlmIC8qIF9EV19NTUNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbW1jX3NwaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMKaW5kZXggZTRhMDc1NC4uYWUxOWQ4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9tbWNfc3BpLmMKQEAgLTE1MDcsNyArMTUwNyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1tY19zcGlfb2ZfbWF0Y2hfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1tY19zcGlfb2ZfbWF0Y2hfdGFibGVbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIm1tYy1zcGktc2xvdCIsIH0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuYwppbmRleCA3ZmUxNjE5Li5mYjI2Njc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21tY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuYwpAQCAtMTYxMyw3ICsxNjEzLDEwIEBACiAJZGV2X2RiZyhtbWNfZGV2KG1tYyksICJjbG9ja2luZyBibG9jayBhdCAldSBIelxuIiwgbW1jLT5mX21heCk7CiAKIAkvKiBHZXQgcmVndWxhdG9ycyBhbmQgdGhlIHN1cHBvcnRlZCBPQ1IgbWFzayAqLwotCW1tY19yZWd1bGF0b3JfZ2V0X3N1cHBseShtbWMpOworCXJldCA9IG1tY19yZWd1bGF0b3JfZ2V0X3N1cHBseShtbWMpOworCWlmIChyZXQgPT0gLUVQUk9CRV9ERUZFUikKKwkJZ290byBjbGtfZGlzYWJsZTsKKwogCWlmICghbW1jLT5vY3JfYXZhaWwpCiAJCW1tYy0+b2NyX2F2YWlsID0gcGxhdC0+b2NyX21hc2s7CiAJZWxzZSBpZiAocGxhdC0+b2NyX21hc2spCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L29tYXBfaHNtbWMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCmluZGV4IGY4NGNmYjAuLjlkZjJiNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jCkBAIC0yMjIsMTAgKzIyMiw2IEBACiAJc3RydWN0IG9tYXBfaHNtbWNfbmV4dAluZXh0X2RhdGE7CiAJc3RydWN0CW9tYXBfaHNtbWNfcGxhdGZvcm1fZGF0YQkqcGRhdGE7CiAKLQkvKiBUbyBoYW5kbGUgYm9hcmQgcmVsYXRlZCBzdXNwZW5kL3Jlc3VtZSBmdW5jdGlvbmFsaXR5IGZvciBNTUMgKi8KLQlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKnJlc3VtZSkoc3RydWN0IGRldmljZSAqZGV2KTsKLQogCS8qIHJldHVybiBNTUMgY292ZXIgc3dpdGNoIHN0YXRlLCBjYW4gYmUgTlVMTCBpZiBub3Qgc3VwcG9ydGVkLgogCSAqCiAJICogcG9zc2libGUgcmV0dXJuIHZhbHVlczoKQEAgLTIzNCwxMiArMjMwLDcgQEAKIAkgKi8KIAlpbnQgKCpnZXRfY292ZXJfc3RhdGUpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKLQkvKiBDYXJkIGRldGVjdGlvbiBJUlFzICovCi0JaW50IGNhcmRfZGV0ZWN0X2lycTsKLQogCWludCAoKmNhcmRfZGV0ZWN0KShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotCWludCAoKmdldF9ybykoc3RydWN0IGRldmljZSAqZGV2KTsKLQogfTsKIAogc3RydWN0IG9tYXBfbW1jX29mX2RhdGEgewpAQCAtMjU2LDEzICsyNDcsNiBAQAogCXJldHVybiBtbWNfZ3Bpb19nZXRfY2QoaG9zdC0+bW1jKTsKIH0KIAotc3RhdGljIGludCBvbWFwX2hzbW1jX2dldF93cChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIG1tY19ncGlvX2dldF9ybyhob3N0LT5tbWMpOwotfQotCiBzdGF0aWMgaW50IG9tYXBfaHNtbWNfZ2V0X2NvdmVyX3N0YXRlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgb21hcF9oc21tY19ob3N0ICpob3N0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC00MzQsNyArNDE4LDcgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX2hzbW1jX2RldGVjdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworc3RhdGljIGlycXJldHVybl90IG9tYXBfaHNtbWNfY292ZXJfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiAKIHN0YXRpYyBpbnQgb21hcF9oc21tY19ncGlvX2luaXQoc3RydWN0IG1tY19ob3N0ICptbWMsCiAJCQkJc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCwKQEAgLTQ0MiwyOSArNDI2LDI1IEBACiB7CiAJaW50IHJldDsKIAotCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5zd2l0Y2hfcGluKSkgewotCQlpZiAocGRhdGEtPmNvdmVyKQotCQkJaG9zdC0+Z2V0X2NvdmVyX3N0YXRlID0KLQkJCQlvbWFwX2hzbW1jX2dldF9jb3Zlcl9zdGF0ZTsKLQkJZWxzZQotCQkJaG9zdC0+Y2FyZF9kZXRlY3QgPSBvbWFwX2hzbW1jX2NhcmRfZGV0ZWN0OwotCQlob3N0LT5jYXJkX2RldGVjdF9pcnEgPQotCQkJCWdwaW9fdG9faXJxKHBkYXRhLT5zd2l0Y2hfcGluKTsKLQkJbW1jX2dwaW9fc2V0X2NkX2lzcihtbWMsIG9tYXBfaHNtbWNfZGV0ZWN0KTsKLQkJcmV0ID0gbW1jX2dwaW9fcmVxdWVzdF9jZChtbWMsIHBkYXRhLT5zd2l0Y2hfcGluLCAwKTsKKwlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+Z3Bpb19jb2QpKSB7CisJCXJldCA9IG1tY19ncGlvX3JlcXVlc3RfY2QobW1jLCBwZGF0YS0+Z3Bpb19jb2QsIDApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKLQl9IGVsc2UgewotCQlwZGF0YS0+c3dpdGNoX3BpbiA9IC1FSU5WQUw7CisKKwkJaG9zdC0+Z2V0X2NvdmVyX3N0YXRlID0gb21hcF9oc21tY19nZXRfY292ZXJfc3RhdGU7CisJCW1tY19ncGlvX3NldF9jZF9pc3IobW1jLCBvbWFwX2hzbW1jX2NvdmVyX2lycSk7CisJfSBlbHNlIGlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvX2NkKSkgeworCQlyZXQgPSBtbWNfZ3Bpb19yZXF1ZXN0X2NkKG1tYywgcGRhdGEtPmdwaW9fY2QsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlob3N0LT5jYXJkX2RldGVjdCA9IG9tYXBfaHNtbWNfY2FyZF9kZXRlY3Q7CiAJfQogCiAJaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPmdwaW9fd3ApKSB7Ci0JCWhvc3QtPmdldF9ybyA9IG9tYXBfaHNtbWNfZ2V0X3dwOwogCQlyZXQgPSBtbWNfZ3Bpb19yZXF1ZXN0X3JvKG1tYywgcGRhdGEtPmdwaW9fd3ApOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKLQl9IGVsc2UgewotCQlwZGF0YS0+Z3Bpb193cCA9IC1FSU5WQUw7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC04ODIsNiArODYyLDggQEAKIAkJcmV0dXJuOwogCWhvc3QtPm1ycSA9IE5VTEw7CiAJbW1jX3JlcXVlc3RfZG9uZShob3N0LT5tbWMsIG1ycSk7CisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShob3N0LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGhvc3QtPmRldik7CiB9CiAKIC8qCkBAIC0xMjUyLDI2ICsxMjM0LDE2IEBACiB9CiAKIC8qCi0gKiBpcnEgaGFuZGxlciB0byBub3RpZnkgdGhlIGNvcmUgYWJvdXQgY2FyZCBpbnNlcnRpb24vcmVtb3ZhbAorICogaXJxIGhhbmRsZXIgd2hlbiAoY2VsbC1waG9uZSkgY292ZXIgaXMgbW91bnRlZC9yZW1vdmVkCiAgKi8KLXN0YXRpYyBpcnFyZXR1cm5fdCBvbWFwX2hzbW1jX2RldGVjdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCitzdGF0aWMgaXJxcmV0dXJuX3Qgb21hcF9oc21tY19jb3Zlcl9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBvbWFwX2hzbW1jX2hvc3QgKmhvc3QgPSBkZXZfaWQ7Ci0JaW50IGNhcmRkZXRlY3Q7CiAKIAlzeXNmc19ub3RpZnkoJmhvc3QtPm1tYy0+Y2xhc3NfZGV2LmtvYmosIE5VTEwsICJjb3Zlcl9zd2l0Y2giKTsKIAotCWlmIChob3N0LT5jYXJkX2RldGVjdCkKLQkJY2FyZGRldGVjdCA9IGhvc3QtPmNhcmRfZGV0ZWN0KGhvc3QtPmRldik7Ci0JZWxzZSB7Ci0JCW9tYXBfaHNtbWNfcHJvdGVjdF9jYXJkKGhvc3QpOwotCQljYXJkZGV0ZWN0ID0gLUVOT1NZUzsKLQl9Ci0KLQlpZiAoY2FyZGRldGVjdCkKLQkJbW1jX2RldGVjdF9jaGFuZ2UoaG9zdC0+bW1jLCAoSFogKiAyMDApIC8gMTAwMCk7Ci0JZWxzZQotCQltbWNfZGV0ZWN0X2NoYW5nZShob3N0LT5tbWMsIChIWiAqIDUwKSAvIDEwMDApOworCW9tYXBfaHNtbWNfcHJvdGVjdF9jYXJkKGhvc3QpOworCW1tY19kZXRlY3RfY2hhbmdlKGhvc3QtPm1tYywgKEhaICogMjAwKSAvIDEwMDApOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtMTMwNSw2ICsxMjc3LDggQEAKIAogCQlob3N0LT5tcnEgPSBOVUxMOwogCQltbWNfcmVxdWVzdF9kb25lKGhvc3QtPm1tYywgbXJxKTsKKwkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShob3N0LT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChob3N0LT5kZXYpOwogCX0KIH0KIApAQCAtMTUzNyw2ICsxNTExLDcgQEAKIAogCUJVR19PTihob3N0LT5yZXFfaW5fcHJvZ3Jlc3MpOwogCUJVR19PTihob3N0LT5kbWFfY2ggIT0gLTEpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoaG9zdC0+ZGV2KTsKIAlpZiAoaG9zdC0+cHJvdGVjdF9jYXJkKSB7CiAJCWlmIChob3N0LT5yZXFzX2Jsb2NrZWQgPCAzKSB7CiAJCQkvKgpAQCAtMTU1Myw2ICsxNTI4LDggQEAKIAkJCXJlcS0+ZGF0YS0+ZXJyb3IgPSAtRUJBREY7CiAJCXJlcS0+Y21kLT5yZXRyaWVzID0gMDsKIAkJbW1jX3JlcXVlc3RfZG9uZShtbWMsIHJlcSk7CisJCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koaG9zdC0+ZGV2KTsKKwkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoaG9zdC0+ZGV2KTsKIAkJcmV0dXJuOwogCX0gZWxzZSBpZiAoaG9zdC0+cmVxc19ibG9ja2VkKQogCQlob3N0LT5yZXFzX2Jsb2NrZWQgPSAwOwpAQCAtMTU2Niw2ICsxNTQzLDggQEAKIAkJCXJlcS0+ZGF0YS0+ZXJyb3IgPSBlcnI7CiAJCWhvc3QtPm1ycSA9IE5VTEw7CiAJCW1tY19yZXF1ZXN0X2RvbmUobW1jLCByZXEpOworCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGhvc3QtPmRldik7CisJCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKGhvc3QtPmRldik7CiAJCXJldHVybjsKIAl9CiAJaWYgKHJlcS0+c2JjICYmICEoaG9zdC0+ZmxhZ3MgJiBBVVRPX0NNRDIzKSkgewpAQCAtMTY0MSwxNSArMTYyMCw2IEBACiAJcmV0dXJuIGhvc3QtPmNhcmRfZGV0ZWN0KGhvc3QtPmRldik7CiB9CiAKLXN0YXRpYyBpbnQgb21hcF9oc21tY19nZXRfcm8oc3RydWN0IG1tY19ob3N0ICptbWMpCi17Ci0Jc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7Ci0KLQlpZiAoIWhvc3QtPmdldF9ybykKLQkJcmV0dXJuIC1FTk9TWVM7Ci0JcmV0dXJuIGhvc3QtPmdldF9ybyhob3N0LT5kZXYpOwotfQotCiBzdGF0aWMgdm9pZCBvbWFwX2hzbW1jX2luaXRfY2FyZChzdHJ1Y3QgbW1jX2hvc3QgKm1tYywgc3RydWN0IG1tY19jYXJkICpjYXJkKQogewogCXN0cnVjdCBvbWFwX2hzbW1jX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwpAQCAtMTc3OCwyNSArMTc0OCw2IEBACiAJc2V0X3NkX2J1c19wb3dlcihob3N0KTsKIH0KIAotc3RhdGljIGludCBvbWFwX2hzbW1jX2VuYWJsZV9mY2xrKHN0cnVjdCBtbWNfaG9zdCAqbW1jKQotewotCXN0cnVjdCBvbWFwX2hzbW1jX2hvc3QgKmhvc3QgPSBtbWNfcHJpdihtbWMpOwotCi0JcG1fcnVudGltZV9nZXRfc3luYyhob3N0LT5kZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb21hcF9oc21tY19kaXNhYmxlX2ZjbGsoc3RydWN0IG1tY19ob3N0ICptbWMpCi17Ci0Jc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCA9IG1tY19wcml2KG1tYyk7Ci0KLQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGhvc3QtPmRldik7Ci0JcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoaG9zdC0+ZGV2KTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG9tYXBfaHNtbWNfbXVsdGlfaW9fcXVpcmsoc3RydWN0IG1tY19jYXJkICpjYXJkLAogCQkJCSAgICAgdW5zaWduZWQgaW50IGRpcmVjdGlvbiwgaW50IGJsa19zaXplKQogewpAQCAtMTgwOCwxNCArMTc1OSwxMiBAQAogfQogCiBzdGF0aWMgc3RydWN0IG1tY19ob3N0X29wcyBvbWFwX2hzbW1jX29wcyA9IHsKLQkuZW5hYmxlID0gb21hcF9oc21tY19lbmFibGVfZmNsaywKLQkuZGlzYWJsZSA9IG9tYXBfaHNtbWNfZGlzYWJsZV9mY2xrLAogCS5wb3N0X3JlcSA9IG9tYXBfaHNtbWNfcG9zdF9yZXEsCiAJLnByZV9yZXEgPSBvbWFwX2hzbW1jX3ByZV9yZXEsCiAJLnJlcXVlc3QgPSBvbWFwX2hzbW1jX3JlcXVlc3QsCiAJLnNldF9pb3MgPSBvbWFwX2hzbW1jX3NldF9pb3MsCiAJLmdldF9jZCA9IG9tYXBfaHNtbWNfZ2V0X2NkLAotCS5nZXRfcm8gPSBvbWFwX2hzbW1jX2dldF9ybywKKwkuZ2V0X3JvID0gbW1jX2dwaW9fZ2V0X3JvLAogCS5pbml0X2NhcmQgPSBvbWFwX2hzbW1jX2luaXRfY2FyZCwKIAkuZW5hYmxlX3NkaW9faXJxID0gb21hcF9oc21tY19lbmFibGVfc2Rpb19pcnEsCiB9OwpAQCAtMTkzNyw3ICsxODg2LDggQEAKIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgInRpLGR1YWwtdm9sdCIsIE5VTEwpKQogCQlwZGF0YS0+Y29udHJvbGxlcl9mbGFncyB8PSBPTUFQX0hTTU1DX1NVUFBPUlRTX0RVQUxfVk9MVDsKIAotCXBkYXRhLT5zd2l0Y2hfcGluID0gLUVJTlZBTDsKKwlwZGF0YS0+Z3Bpb19jZCA9IC1FSU5WQUw7CisJcGRhdGEtPmdwaW9fY29kID0gLUVJTlZBTDsKIAlwZGF0YS0+Z3Bpb193cCA9IC1FSU5WQUw7CiAKIAlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgInRpLG5vbi1yZW1vdmFibGUiLCBOVUxMKSkgewpAQCAtMjE3OSw5ICsyMTI5LDkgQEAKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIGVycl9zbG90X25hbWU7CiAJfQotCWlmIChob3N0LT5jYXJkX2RldGVjdF9pcnEgJiYgaG9zdC0+Z2V0X2NvdmVyX3N0YXRlKSB7CisJaWYgKGhvc3QtPmdldF9jb3Zlcl9zdGF0ZSkgewogCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJm1tYy0+Y2xhc3NfZGV2LAotCQkJCQkmZGV2X2F0dHJfY292ZXJfc3dpdGNoKTsKKwkJCQkJICZkZXZfYXR0cl9jb3Zlcl9zd2l0Y2gpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZXJyX3Nsb3RfbmFtZTsKIAl9CkBAIC0yMjM2LDcgKzIxODYsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IG9tYXBfaHNtbWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG9tYXBfaHNtbWNfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwpAQCAtMjI5MiwxMCArMjI0Miw2IEBACiAJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoaG9zdC0+ZGV2KTsKIAlyZXR1cm4gMDsKIH0KLQotI2Vsc2UKLSNkZWZpbmUgb21hcF9oc21tY19zdXNwZW5kCU5VTEwKLSNkZWZpbmUgb21hcF9oc21tY19yZXN1bWUJTlVMTAogI2VuZGlmCiAKIHN0YXRpYyBpbnQgb21hcF9oc21tY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtMjM3Niw4ICsyMzIyLDcgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIG9tYXBfaHNtbWNfZGV2X3BtX29wcyA9IHsKLQkuc3VzcGVuZAk9IG9tYXBfaHNtbWNfc3VzcGVuZCwKLQkucmVzdW1lCQk9IG9tYXBfaHNtbWNfcmVzdW1lLAorCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKG9tYXBfaHNtbWNfc3VzcGVuZCwgb21hcF9oc21tY19yZXN1bWUpCiAJLnJ1bnRpbWVfc3VzcGVuZCA9IG9tYXBfaHNtbWNfcnVudGltZV9zdXNwZW5kLAogCS5ydW50aW1lX3Jlc3VtZSA9IG9tYXBfaHNtbWNfcnVudGltZV9yZXN1bWUsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1hY3BpLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWFjcGkuYwppbmRleCBhNDVlZDM5Li4yMmQ5MjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWFjcGkuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWFjcGkuYwpAQCAtNDAsNyArNDAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3BtLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3Nsb3QtZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L21tYy9zZGhjaS5oPgogCiAjaW5jbHVkZSAic2RoY2kuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1iY20ta29uYS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1iY20ta29uYS5jCmluZGV4IDM0YmI4ZjkuLjJiZDkwZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYmNtLWtvbmEuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWJjbS1rb25hLmMKQEAgLTU0LDcgKzU0LDYgQEAKIAogc3RydWN0IHNkaGNpX2JjbV9rb25hX2RldiB7CiAJc3RydWN0IG11dGV4CXdyaXRlX2xvY2s7IC8qIHByb3RlY3QgYmFjayB0byBiYWNrIHdyaXRlcyAqLwotCXN0cnVjdCBjbGsJKmV4dGVybmFsX2NsazsKIH07CiAKIApAQCAtMTc1LDI0ICsxNzQsNiBAQAogCX0KIH0KIAotLyoKLSAqIEdldCB0aGUgYmFzZSBjbG9jay4gVXNlIGNlbnRyYWwgY2xvY2sgc291cmNlIGZvciBub3cuIE5vdCBzdXJlIGlmIGRpZmZlcmVudAotICogY2xvY2sgc3BlZWQgdG8gZWFjaCBkZXYgaXMgYWxsb3dlZAotICovCi1zdGF0aWMgdW5zaWduZWQgaW50IHNkaGNpX2JjbV9rb25hX2dldF9tYXhfY2xrKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQotewotCXN0cnVjdCBzZGhjaV9iY21fa29uYV9kZXYgKmtvbmFfZGV2OwotCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9wcml2ID0gc2RoY2lfcHJpdihob3N0KTsKLQlrb25hX2RldiA9IHNkaGNpX3BsdGZtX3ByaXYocGx0Zm1fcHJpdik7Ci0KLQlyZXR1cm4gaG9zdC0+bW1jLT5mX21heDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBzZGhjaV9iY21fa29uYV9nZXRfdGltZW91dF9jbG9jayhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKLXsKLQlyZXR1cm4gc2RoY2lfYmNtX2tvbmFfZ2V0X21heF9jbGsoaG9zdCk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNkaGNpX2JjbV9rb25hX2luaXRfNzRfY2xvY2tzKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LAogCQkJCXU4IHBvd2VyX21vZGUpCiB7CkBAIC0yMDcsOCArMTg4LDggQEAKIAogc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfYmNtX2tvbmFfb3BzID0gewogCS5zZXRfY2xvY2sgPSBzZGhjaV9zZXRfY2xvY2ssCi0JLmdldF9tYXhfY2xvY2sgPSBzZGhjaV9iY21fa29uYV9nZXRfbWF4X2NsaywKLQkuZ2V0X3RpbWVvdXRfY2xvY2sgPSBzZGhjaV9iY21fa29uYV9nZXRfdGltZW91dF9jbG9jaywKKwkuZ2V0X21heF9jbG9jayA9IHNkaGNpX3BsdGZtX2Nsa19nZXRfbWF4X2Nsb2NrLAorCS5nZXRfdGltZW91dF9jbG9jayA9IHNkaGNpX3BsdGZtX2Nsa19nZXRfbWF4X2Nsb2NrLAogCS5wbGF0Zm9ybV9zZW5kX2luaXRfNzRfY2xvY2tzID0gc2RoY2lfYmNtX2tvbmFfaW5pdF83NF9jbG9ja3MsCiAJLnNldF9idXNfd2lkdGggPSBzZGhjaV9zZXRfYnVzX3dpZHRoLAogCS5yZXNldCA9IHNkaGNpX3Jlc2V0LApAQCAtMjY0LDIxICsyNDUsMjEgQEAKIAkJZ290byBlcnJfcGx0Zm1fZnJlZTsKIAl9CiAKLQkvKiBHZXQgYW5kIGVuYWJsZSB0aGUgZXh0ZXJuYWwgY2xvY2sgKi8KLQlrb25hX2Rldi0+ZXh0ZXJuYWxfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgTlVMTCk7Ci0JaWYgKElTX0VSUihrb25hX2Rldi0+ZXh0ZXJuYWxfY2xrKSkgewotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgZXh0ZXJuYWwgY2xvY2tcbiIpOwotCQlyZXQgPSBQVFJfRVJSKGtvbmFfZGV2LT5leHRlcm5hbF9jbGspOworCS8qIEdldCBhbmQgZW5hYmxlIHRoZSBjb3JlIGNsb2NrICovCisJcGx0Zm1fcHJpdi0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgTlVMTCk7CisJaWYgKElTX0VSUihwbHRmbV9wcml2LT5jbGspKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBjb3JlIGNsb2NrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihwbHRmbV9wcml2LT5jbGspOwogCQlnb3RvIGVycl9wbHRmbV9mcmVlOwogCX0KIAotCWlmIChjbGtfc2V0X3JhdGUoa29uYV9kZXYtPmV4dGVybmFsX2NsaywgaG9zdC0+bW1jLT5mX21heCkgIT0gMCkgewotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgcmF0ZSBleHRlcm5hbCBjbG9ja1xuIik7CisJaWYgKGNsa19zZXRfcmF0ZShwbHRmbV9wcml2LT5jbGssIGhvc3QtPm1tYy0+Zl9tYXgpICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gc2V0IHJhdGUgY29yZSBjbG9ja1xuIik7CiAJCWdvdG8gZXJyX3BsdGZtX2ZyZWU7CiAJfQogCi0JaWYgKGNsa19wcmVwYXJlX2VuYWJsZShrb25hX2Rldi0+ZXh0ZXJuYWxfY2xrKSAhPSAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBleHRlcm5hbCBjbG9ja1xuIik7CisJaWYgKGNsa19wcmVwYXJlX2VuYWJsZShwbHRmbV9wcml2LT5jbGspICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIGNvcmUgY2xvY2tcbiIpOwogCQlnb3RvIGVycl9wbHRmbV9mcmVlOwogCX0KIApAQCAtMzMzLDcgKzMxNCw3IEBACiAJc2RoY2lfYmNtX2tvbmFfc2RfcmVzZXQoaG9zdCk7CiAKIGVycl9jbGtfZGlzYWJsZToKLQljbGtfZGlzYWJsZV91bnByZXBhcmUoa29uYV9kZXYtPmV4dGVybmFsX2Nsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsdGZtX3ByaXYtPmNsayk7CiAKIGVycl9wbHRmbV9mcmVlOgogCXNkaGNpX3BsdGZtX2ZyZWUocGRldik7CkBAIC0zNDIsMjIgKzMyMyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzZGhjaV9iY21fa29uYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9wcml2ID0gc2RoY2lfcHJpdihob3N0KTsKLQlzdHJ1Y3Qgc2RoY2lfYmNtX2tvbmFfZGV2ICprb25hX2RldiA9IHNkaGNpX3BsdGZtX3ByaXYocGx0Zm1fcHJpdik7Ci0JaW50IGRlYWQgPSAocmVhZGwoaG9zdC0+aW9hZGRyICsgU0RIQ0lfSU5UX1NUQVRVUykgPT0gMHhmZmZmZmZmZik7Ci0KLQlzZGhjaV9yZW1vdmVfaG9zdChob3N0LCBkZWFkKTsKLQotCWNsa19kaXNhYmxlX3VucHJlcGFyZShrb25hX2Rldi0+ZXh0ZXJuYWxfY2xrKTsKLQotCXNkaGNpX3BsdGZtX2ZyZWUocGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RoY2lfYmNtX2tvbmFfZHJpdmVyID0gewogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJzZGhjaS1rb25hIiwKQEAgLTM2NSw3ICszMzAsNyBAQAogCQkub2ZfbWF0Y2hfdGFibGUgPSBzZGhjaV9iY21fa29uYV9vZl9tYXRjaCwKIAl9LAogCS5wcm9iZQkJPSBzZGhjaV9iY21fa29uYV9wcm9iZSwKLQkucmVtb3ZlCQk9IHNkaGNpX2JjbV9rb25hX3JlbW92ZSwKKwkucmVtb3ZlCQk9IHNkaGNpX3BsdGZtX3VucmVnaXN0ZXIsCiB9OwogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzZGhjaV9iY21fa29uYV9kcml2ZXIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWJjbTI4MzUuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYmNtMjgzNS5jCmluZGV4IDQzOWQyNTkuLjBlZjAzNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYmNtMjgzNS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktYmNtMjgzNS5jCkBAIC0xODAsMTEgKzE4MCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBiY20yODM1X3NkaGNpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBzZGhjaV9wbHRmbV91bnJlZ2lzdGVyKHBkZXYpOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBiY20yODM1X3NkaGNpX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJicmNtLGJjbTI4MzUtc2RoY2kiIH0sCiAJeyB9CkBAIC0xOTgsNyArMTkzLDcgQEAKIAkJLnBtID0gU0RIQ0lfUExURk1fUE1PUFMsCiAJfSwKIAkucHJvYmUgPSBiY20yODM1X3NkaGNpX3Byb2JlLAotCS5yZW1vdmUgPSBiY20yODM1X3NkaGNpX3JlbW92ZSwKKwkucmVtb3ZlID0gc2RoY2lfcGx0Zm1fdW5yZWdpc3RlciwKIH07CiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJjbTI4MzVfc2RoY2lfZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1jbnMzeHh4LmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWNuczN4eHguYwppbmRleCBhNzkzNWE4Li41OWYyOTIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWNuczN4eHguYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWNuczN4eHguYwpAQCAtOTgsMTggKzk4LDEzIEBACiAJcmV0dXJuIHNkaGNpX3BsdGZtX3JlZ2lzdGVyKHBkZXYsICZzZGhjaV9jbnMzeHh4X3BkYXRhLCAwKTsKIH0KIAotc3RhdGljIGludCBzZGhjaV9jbnMzeHh4X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiBzZGhjaV9wbHRmbV91bnJlZ2lzdGVyKHBkZXYpOwotfQotCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZGhjaV9jbnMzeHh4X2RyaXZlciA9IHsKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAic2RoY2ktY25zM3h4eCIsCiAJCS5wbQk9IFNESENJX1BMVEZNX1BNT1BTLAogCX0sCiAJLnByb2JlCQk9IHNkaGNpX2NuczN4eHhfcHJvYmUsCi0JLnJlbW92ZQkJPSBzZGhjaV9jbnMzeHh4X3JlbW92ZSwKKwkucmVtb3ZlCQk9IHNkaGNpX3BsdGZtX3VucmVnaXN0ZXIsCiB9OwogCiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNkaGNpX2NuczN4eHhfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZG92ZS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1kb3ZlLmMKaW5kZXggY2E5NjlkMi4uNDA3YzIxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1kb3ZlLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1kb3ZlLmMKQEAgLTI4LDEwICsyOCw2IEBACiAKICNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgogCi1zdHJ1Y3Qgc2RoY2lfZG92ZV9wcml2IHsKLQlzdHJ1Y3QgY2xrICpjbGs7Ci19OwotCiBzdGF0aWMgdTE2IHNkaGNpX2RvdmVfcmVhZHcoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCByZWcpCiB7CiAJdTE2IHJldDsKQEAgLTg0LDI3ICs4MCwxNyBAQAogewogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0OwotCXN0cnVjdCBzZGhjaV9kb3ZlX3ByaXYgKnByaXY7CiAJaW50IHJldDsKIAotCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBzZGhjaV9kb3ZlX3ByaXYpLAotCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghcHJpdikgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gYWxsb2NhdGUgcHJpdmF0ZSBkYXRhIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXByaXYtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKLQogCWhvc3QgPSBzZGhjaV9wbHRmbV9pbml0KHBkZXYsICZzZGhjaV9kb3ZlX3BkYXRhLCAwKTsKIAlpZiAoSVNfRVJSKGhvc3QpKQogCQlyZXR1cm4gUFRSX0VSUihob3N0KTsKIAogCXBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwotCXBsdGZtX2hvc3QtPnByaXYgPSBwcml2OworCXBsdGZtX2hvc3QtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAotCWlmICghSVNfRVJSKHByaXYtPmNsaykpCi0JCWNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5jbGspOworCWlmICghSVNfRVJSKHBsdGZtX2hvc3QtPmNsaykpCisJCWNsa19wcmVwYXJlX2VuYWJsZShwbHRmbV9ob3N0LT5jbGspOwogCiAJcmV0ID0gbW1jX29mX3BhcnNlKGhvc3QtPm1tYyk7CiAJaWYgKHJldCkKQEAgLTExNywyNiArMTAzLDExIEBACiAJcmV0dXJuIDA7CiAKIGVycl9zZGhjaV9hZGQ6Ci0JaWYgKCFJU19FUlIocHJpdi0+Y2xrKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNsayk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsdGZtX2hvc3QtPmNsayk7CiAJc2RoY2lfcGx0Zm1fZnJlZShwZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHNkaGNpX2RvdmVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7Ci0Jc3RydWN0IHNkaGNpX2RvdmVfcHJpdiAqcHJpdiA9IHBsdGZtX2hvc3QtPnByaXY7Ci0KLQlzZGhjaV9wbHRmbV91bnJlZ2lzdGVyKHBkZXYpOwotCi0JaWYgKCFJU19FUlIocHJpdi0+Y2xrKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmNsayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2RoY2lfZG92ZV9vZl9tYXRjaF90YWJsZVtdID0gewogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxkb3ZlLXNkaGNpIiwgfSwKIAl7fQpAQCAtMTUwLDcgKzEyMSw3IEBACiAJCS5vZl9tYXRjaF90YWJsZSA9IHNkaGNpX2RvdmVfb2ZfbWF0Y2hfdGFibGUsCiAJfSwKIAkucHJvYmUJCT0gc2RoY2lfZG92ZV9wcm9iZSwKLQkucmVtb3ZlCQk9IHNkaGNpX2RvdmVfcmVtb3ZlLAorCS5yZW1vdmUJCT0gc2RoY2lfcGx0Zm1fdW5yZWdpc3RlciwKIH07CiAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2RoY2lfZG92ZV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKaW5kZXggMTBlZjgyNC4uODJmNTEyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCkBAIC00MTYsNyArNDE2LDcgQEAKIAkJCW5ld192YWwgfD0gRVNESENfVkVORE9SX1NQRUNfRlJDX1NEQ0xLX09OOwogCQllbHNlCiAJCQluZXdfdmFsICY9IH5FU0RIQ19WRU5ET1JfU1BFQ19GUkNfU0RDTEtfT047Ci0JCQl3cml0ZWwobmV3X3ZhbCwgaG9zdC0+aW9hZGRyICsgRVNESENfVkVORE9SX1NQRUMpOworCQl3cml0ZWwobmV3X3ZhbCwgaG9zdC0+aW9hZGRyICsgRVNESENfVkVORE9SX1NQRUMpOwogCQlyZXR1cm47CiAJY2FzZSBTREhDSV9IT1NUX0NPTlRST0wyOgogCQluZXdfdmFsID0gcmVhZGwoaG9zdC0+aW9hZGRyICsgRVNESENfVkVORE9SX1NQRUMpOwpAQCAtODY0LDYgKzg2NCw3IEBACiAjaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgaW50CiBzZGhjaV9lc2RoY19pbXhfcHJvYmVfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSBzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKIAkJCSBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKQEAgLTkwMCwxMSArOTAxLDE0IEBACiAJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZnNsLGRlbGF5LWxpbmUiLCAmYm9hcmRkYXRhLT5kZWxheV9saW5lKSkKIAkJYm9hcmRkYXRhLT5kZWxheV9saW5lID0gMDsKIAorCW1tY19vZl9wYXJzZV92b2x0YWdlKG5wLCAmaG9zdC0+b2NyX21hc2spOworCiAJcmV0dXJuIDA7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQKIHNkaGNpX2VzZGhjX2lteF9wcm9iZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJIHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LAogCQkJIHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGEpCiB7CiAJcmV0dXJuIC1FTk9ERVY7CkBAIC05OTksNyArMTAwMyw3IEBACiAJCQlob3N0LT5pb2FkZHIgKyBFU0RIQ19UVU5JTkdfQ1RSTCk7CiAKIAlib2FyZGRhdGEgPSAmaW14X2RhdGEtPmJvYXJkZGF0YTsKLQlpZiAoc2RoY2lfZXNkaGNfaW14X3Byb2JlX2R0KHBkZXYsIGJvYXJkZGF0YSkgPCAwKSB7CisJaWYgKHNkaGNpX2VzZGhjX2lteF9wcm9iZV9kdChwZGV2LCBob3N0LCBib2FyZGRhdGEpIDwgMCkgewogCQlpZiAoIWhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhKSB7CiAJCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgIm5vIGJvYXJkIGRhdGEhXG4iKTsKIAkJCWVyciA9IC1FSU5WQUw7CkBAIC0xMDA5LDQwICsxMDEzLDkgQEAKIAkJCQkJaG9zdC0+bW1jLT5wYXJlbnQtPnBsYXRmb3JtX2RhdGEpOwogCX0KIAotCS8qIHdyaXRlX3Byb3RlY3QgKi8KLQlpZiAoYm9hcmRkYXRhLT53cF90eXBlID09IEVTREhDX1dQX0dQSU8pIHsKLQkJZXJyID0gbW1jX2dwaW9fcmVxdWVzdF9ybyhob3N0LT5tbWMsIGJvYXJkZGF0YS0+d3BfZ3Bpbyk7Ci0JCWlmIChlcnIpIHsKLQkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLAotCQkJCSJmYWlsZWQgdG8gcmVxdWVzdCB3cml0ZS1wcm90ZWN0IGdwaW8hXG4iKTsKLQkJCWdvdG8gZGlzYWJsZV9jbGs7Ci0JCX0KLQkJaG9zdC0+bW1jLT5jYXBzMiB8PSBNTUNfQ0FQMl9ST19BQ1RJVkVfSElHSDsKLQl9Ci0KIAkvKiBjYXJkX2RldGVjdCAqLwotCXN3aXRjaCAoYm9hcmRkYXRhLT5jZF90eXBlKSB7Ci0JY2FzZSBFU0RIQ19DRF9HUElPOgotCQllcnIgPSBtbWNfZ3Bpb19yZXF1ZXN0X2NkKGhvc3QtPm1tYywgYm9hcmRkYXRhLT5jZF9ncGlvLCAwKTsKLQkJaWYgKGVycikgewotCQkJZGV2X2VycihtbWNfZGV2KGhvc3QtPm1tYyksCi0JCQkJImZhaWxlZCB0byByZXF1ZXN0IGNhcmQtZGV0ZWN0IGdwaW8hXG4iKTsKLQkJCWdvdG8gZGlzYWJsZV9jbGs7Ci0JCX0KLQkJLyogZmFsbCB0aHJvdWdoICovCi0KLQljYXNlIEVTREhDX0NEX0NPTlRST0xMRVI6Ci0JCS8qIHdlIGhhdmUgYSB3b3JraW5nIGNhcmRfZGV0ZWN0IGJhY2sgKi8KKwlpZiAoYm9hcmRkYXRhLT5jZF90eXBlID09IEVTREhDX0NEX0NPTlRST0xMRVIpCiAJCWhvc3QtPnF1aXJrcyAmPSB+U0RIQ0lfUVVJUktfQlJPS0VOX0NBUkRfREVURUNUSU9OOwotCQlicmVhazsKLQotCWNhc2UgRVNESENfQ0RfUEVSTUFORU5UOgotCQlob3N0LT5tbWMtPmNhcHMgfD0gTU1DX0NBUF9OT05SRU1PVkFCTEU7Ci0JCWJyZWFrOwotCi0JY2FzZSBFU0RIQ19DRF9OT05FOgotCQlicmVhazsKLQl9CiAKIAlzd2l0Y2ggKGJvYXJkZGF0YS0+bWF4X2J1c193aWR0aCkgewogCWNhc2UgODoKQEAgLTEwNzUsNiArMTA0OCwxMSBAQAogCQlob3N0LT5xdWlya3MyIHw9IFNESENJX1FVSVJLMl9OT18xXzhfVjsKIAl9CiAKKwkvKiBjYWxsIHRvIGdlbmVyaWMgbW1jX29mX3BhcnNlIHRvIHN1cHBvcnQgYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgKi8KKwllcnIgPSBtbWNfb2ZfcGFyc2UoaG9zdC0+bW1jKTsKKwlpZiAoZXJyKQorCQlnb3RvIGRpc2FibGVfY2xrOworCiAJZXJyID0gc2RoY2lfYWRkX2hvc3QoaG9zdCk7CiAJaWYgKGVycikKIAkJZ290byBkaXNhYmxlX2NsazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktaXByb2MuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktaXByb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQyM2IwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1pcHJvYy5jCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIGlQcm9jIFNESENJIHBsYXRmb3JtIGRyaXZlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgorCitzdHJ1Y3Qgc2RoY2lfaXByb2NfZGF0YSB7CisJY29uc3Qgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgKnBkYXRhOworCXUzMiBjYXBzOworCXUzMiBjYXBzMTsKK307CisKK3N0cnVjdCBzZGhjaV9pcHJvY19ob3N0IHsKKwljb25zdCBzdHJ1Y3Qgc2RoY2lfaXByb2NfZGF0YSAqZGF0YTsKKwl1MzIgc2hhZG93X2NtZDsKKwl1MzIgc2hhZG93X2JsazsKK307CisKKyNkZWZpbmUgUkVHX09GRlNFVF9JTl9CSVRTKHJlZykgKChyZWcpIDw8IDMgJiAweDE4KQorCitzdGF0aWMgaW5saW5lIHUzMiBzZGhjaV9pcHJvY19yZWFkbChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgaW50IHJlZykKK3sKKwl1MzIgdmFsID0gcmVhZGwoaG9zdC0+aW9hZGRyICsgcmVnKTsKKworCXByX2RlYnVnKCIlczogcmVhZGwgWzB4JTAyeF0gMHglMDh4XG4iLAorCQkgbW1jX2hvc3RuYW1lKGhvc3QtPm1tYyksIHJlZywgdmFsKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdTE2IHNkaGNpX2lwcm9jX3JlYWR3KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQoreworCXUzMiB2YWwgPSBzZGhjaV9pcHJvY19yZWFkbChob3N0LCAocmVnICYgfjMpKTsKKwl1MTYgd29yZCA9IHZhbCA+PiBSRUdfT0ZGU0VUX0lOX0JJVFMocmVnKSAmIDB4ZmZmZjsKKwlyZXR1cm4gd29yZDsKK30KKworc3RhdGljIHU4IHNkaGNpX2lwcm9jX3JlYWRiKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQoreworCXUzMiB2YWwgPSBzZGhjaV9pcHJvY19yZWFkbChob3N0LCAocmVnICYgfjMpKTsKKwl1OCBieXRlID0gdmFsID4+IFJFR19PRkZTRVRfSU5fQklUUyhyZWcpICYgMHhmZjsKKwlyZXR1cm4gYnl0ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNkaGNpX2lwcm9jX3dyaXRlbChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdTMyIHZhbCwgaW50IHJlZykKK3sKKwlwcl9kZWJ1ZygiJXM6IHdyaXRlbCBbMHglMDJ4XSAweCUwOHhcbiIsCisJCSBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgcmVnLCB2YWwpOworCisJd3JpdGVsKHZhbCwgaG9zdC0+aW9hZGRyICsgcmVnKTsKKworCWlmIChob3N0LT5jbG9jayA8PSA0MDAwMDApIHsKKwkJLyogUm91bmQgdXAgdG8gbWljcm8tc2Vjb25kIGZvdXIgU0QgY2xvY2sgZGVsYXkgKi8KKwkJaWYgKGhvc3QtPmNsb2NrKQorCQkJdWRlbGF5KCg0ICogMTAwMDAwMCArIGhvc3QtPmNsb2NrIC0gMSkgLyBob3N0LT5jbG9jayk7CisJCWVsc2UKKwkJCXVkZWxheSgxMCk7CisJfQorfQorCisvKgorICogVGhlIEFyYXNhbiBoYXMgYSBidWdldHRlIHdoZXJlYnkgaXQgbWF5IGxvc2UgdGhlIGNvbnRlbnQgb2Ygc3VjY2Vzc2l2ZQorICogd3JpdGVzIHRvIHRoZSBzYW1lIHJlZ2lzdGVyIHRoYXQgYXJlIHdpdGhpbiB0d28gU0QtY2FyZCBjbG9jayBjeWNsZXMgb2YKKyAqIGVhY2ggb3RoZXIgKGEgY2xvY2sgZG9tYWluIGNyb3NzaW5nIHByb2JsZW0pLiBUaGUgZGF0YQorICogcmVnaXN0ZXIgZG9lcyBub3QgaGF2ZSB0aGlzIHByb2JsZW0sIHdoaWNoIGlzIGp1c3QgYXMgd2VsbCAtIG90aGVyd2lzZSB3ZSdkCisgKiBoYXZlIHRvIG5vYmJsZSB0aGUgRE1BIGVuZ2luZSB0b28uCisgKgorICogVGhpcyB3b3VsZG4ndCBiZSBhIHByb2JsZW0gd2l0aCB0aGUgY29kZSBleGNlcHQgdGhhdCB3ZSBjYW4gb25seSB3cml0ZSB0aGUKKyAqIGNvbnRyb2xsZXIgd2l0aCAzMi1iaXQgd3JpdGVzLiAgU28gdHdvIGRpZmZlcmVudCAxNi1iaXQgcmVnaXN0ZXJzIGFyZQorICogd3JpdHRlbiBiYWNrIHRvIGJhY2sgY3JlYXRlcyB0aGUgcHJvYmxlbS4KKyAqCisgKiBJbiByZWFsaXR5LCB0aGlzIG9ubHkgaGFwcGVucyB3aGVuIFNESENJX0JMT0NLX1NJWkUgYW5kIFNESENJX0JMT0NLX0NPVU5UCisgKiBhcmUgd3JpdHRlbiBmb2xsb3dlZCBieSBTREhDSV9UUkFOU0ZFUl9NT0RFIGFuZCBTREhDSV9DT01NQU5ELgorICogVGhlIEJMT0NLX1NJWkUgYW5kIEJMT0NLX0NPVU5UIGFyZSBtZWFuaW5nbGVzcyB1bnRpbCBhIGNvbW1hbmQgaXNzdWVkIHNvCisgKiB0aGUgd29yayBhcm91bmQgY2FuIGJlIGZ1cnRoZXIgb3B0aW1pemVkLiBXZSBjYW4ga2VlcCBzaGFkb3cgdmFsdWVzIG9mCisgKiBCTE9DS19TSVpFLCBCTE9DS19DT1VOVCwgYW5kIFRSQU5TRkVSX01PREUgdW50aWwgYSBDT01NQU5EIGlzIGlzc3VlZC4KKyAqIFRoZW4sIHdyaXRlIHRoZSBCTE9DS19TSVpFK0JMT0NLX0NPVU5UIGluIGEgc2luZ2xlIDMyLWJpdCB3cml0ZSBmb2xsb3dlZAorICogYnkgdGhlIFRSQU5TRkVSK0NPTU1BTkQgaW4gYW5vdGhlciAzMi1iaXQgd3JpdGUuCisgKi8KK3N0YXRpYyB2b2lkIHNkaGNpX2lwcm9jX3dyaXRldyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdTE2IHZhbCwgaW50IHJlZykKK3sKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJc3RydWN0IHNkaGNpX2lwcm9jX2hvc3QgKmlwcm9jX2hvc3QgPSBzZGhjaV9wbHRmbV9wcml2KHBsdGZtX2hvc3QpOworCXUzMiB3b3JkX3NoaWZ0ID0gUkVHX09GRlNFVF9JTl9CSVRTKHJlZyk7CisJdTMyIG1hc2sgPSAweGZmZmYgPDwgd29yZF9zaGlmdDsKKwl1MzIgb2xkdmFsLCBuZXd2YWw7CisKKwlpZiAocmVnID09IFNESENJX0NPTU1BTkQpIHsKKwkJLyogV3JpdGUgdGhlIGJsb2NrIG5vdyBhcyB3ZSBhcmUgaXNzdWluZyBhIGNvbW1hbmQgKi8KKwkJaWYgKGlwcm9jX2hvc3QtPnNoYWRvd19ibGsgIT0gMCkgeworCQkJc2RoY2lfaXByb2Nfd3JpdGVsKGhvc3QsIGlwcm9jX2hvc3QtPnNoYWRvd19ibGssCisJCQkJU0RIQ0lfQkxPQ0tfU0laRSk7CisJCQlpcHJvY19ob3N0LT5zaGFkb3dfYmxrID0gMDsKKwkJfQorCQlvbGR2YWwgPSBpcHJvY19ob3N0LT5zaGFkb3dfY21kOworCX0gZWxzZSBpZiAocmVnID09IFNESENJX0JMT0NLX1NJWkUgfHwgcmVnID09IFNESENJX0JMT0NLX0NPVU5UKSB7CisJCS8qIEJsb2NrIHNpemUgYW5kIGNvdW50IGFyZSBzdG9yZWQgaW4gc2hhZG93IHJlZyAqLworCQlvbGR2YWwgPSBpcHJvY19ob3N0LT5zaGFkb3dfYmxrOworCX0gZWxzZSB7CisJCS8qIFJlYWQgcmVnLCBhbGwgb3RoZXIgcmVnaXN0ZXJzIGFyZSBub3Qgc2hhZG93ZWQgKi8KKwkJb2xkdmFsID0gc2RoY2lfaXByb2NfcmVhZGwoaG9zdCwgKHJlZyAmIH4zKSk7CisJfQorCW5ld3ZhbCA9IChvbGR2YWwgJiB+bWFzaykgfCAodmFsIDw8IHdvcmRfc2hpZnQpOworCisJaWYgKHJlZyA9PSBTREhDSV9UUkFOU0ZFUl9NT0RFKSB7CisJCS8qIFNhdmUgdGhlIHRyYW5zZmVyIG1vZGUgdW50aWwgdGhlIGNvbW1hbmQgaXMgaXNzdWVkICovCisJCWlwcm9jX2hvc3QtPnNoYWRvd19jbWQgPSBuZXd2YWw7CisJfSBlbHNlIGlmIChyZWcgPT0gU0RIQ0lfQkxPQ0tfU0laRSB8fCByZWcgPT0gU0RIQ0lfQkxPQ0tfQ09VTlQpIHsKKwkJLyogU2F2ZSB0aGUgYmxvY2sgaW5mbyB1bnRpbCB0aGUgY29tbWFuZCBpcyBpc3N1ZWQgKi8KKwkJaXByb2NfaG9zdC0+c2hhZG93X2JsayA9IG5ld3ZhbDsKKwl9IGVsc2UgeworCQkvKiBDb21tYW5kIG9yIG90aGVyIHJlZ3VsYXIgMzItYml0IHdyaXRlICovCisJCXNkaGNpX2lwcm9jX3dyaXRlbChob3N0LCBuZXd2YWwsIHJlZyAmIH4zKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNkaGNpX2lwcm9jX3dyaXRlYihzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgdTggdmFsLCBpbnQgcmVnKQoreworCXUzMiBvbGR2YWwgPSBzZGhjaV9pcHJvY19yZWFkbChob3N0LCAocmVnICYgfjMpKTsKKwl1MzIgYnl0ZV9zaGlmdCA9IFJFR19PRkZTRVRfSU5fQklUUyhyZWcpOworCXUzMiBtYXNrID0gMHhmZiA8PCBieXRlX3NoaWZ0OworCXUzMiBuZXd2YWwgPSAob2xkdmFsICYgfm1hc2spIHwgKHZhbCA8PCBieXRlX3NoaWZ0KTsKKworCXNkaGNpX2lwcm9jX3dyaXRlbChob3N0LCBuZXd2YWwsIHJlZyAmIH4zKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfaXByb2Nfb3BzID0geworCS5yZWFkX2wgPSBzZGhjaV9pcHJvY19yZWFkbCwKKwkucmVhZF93ID0gc2RoY2lfaXByb2NfcmVhZHcsCisJLnJlYWRfYiA9IHNkaGNpX2lwcm9jX3JlYWRiLAorCS53cml0ZV9sID0gc2RoY2lfaXByb2Nfd3JpdGVsLAorCS53cml0ZV93ID0gc2RoY2lfaXByb2Nfd3JpdGV3LAorCS53cml0ZV9iID0gc2RoY2lfaXByb2Nfd3JpdGViLAorCS5zZXRfY2xvY2sgPSBzZGhjaV9zZXRfY2xvY2ssCisJLmdldF9tYXhfY2xvY2sgPSBzZGhjaV9wbHRmbV9jbGtfZ2V0X21heF9jbG9jaywKKwkuc2V0X2J1c193aWR0aCA9IHNkaGNpX3NldF9idXNfd2lkdGgsCisJLnJlc2V0ID0gc2RoY2lfcmVzZXQsCisJLnNldF91aHNfc2lnbmFsaW5nID0gc2RoY2lfc2V0X3Voc19zaWduYWxpbmcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgc2RoY2lfaXByb2NfcGx0Zm1fZGF0YSA9IHsKKwkucXVpcmtzID0gU0RIQ0lfUVVJUktfREFUQV9USU1FT1VUX1VTRVNfU0RDTEssCisJLnF1aXJrczIgPSBTREhDSV9RVUlSSzJfQUNNRDIzX0JST0tFTiwKKwkub3BzID0gJnNkaGNpX2lwcm9jX29wcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RoY2lfaXByb2NfZGF0YSBpcHJvY19kYXRhID0geworCS5wZGF0YSA9ICZzZGhjaV9pcHJvY19wbHRmbV9kYXRhLAorCS5jYXBzID0gMHgwNUU5MDAwMCwKKwkuY2FwczEgPSAweDAwMDAwMDY0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2RoY2lfaXByb2Nfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sc2RoY2ktaXByb2MtY3lnbnVzIiwgLmRhdGEgPSAmaXByb2NfZGF0YSB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNkaGNpX2lwcm9jX29mX21hdGNoKTsKKworc3RhdGljIGludCBzZGhjaV9pcHJvY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCWNvbnN0IHN0cnVjdCBzZGhjaV9pcHJvY19kYXRhICppcHJvY19kYXRhOworCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OworCXN0cnVjdCBzZGhjaV9pcHJvY19ob3N0ICppcHJvY19ob3N0OworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0OworCWludCByZXQ7CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZShzZGhjaV9pcHJvY19vZl9tYXRjaCwgJnBkZXYtPmRldik7CisJaWYgKCFtYXRjaCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaXByb2NfZGF0YSA9IG1hdGNoLT5kYXRhOworCisJaG9zdCA9IHNkaGNpX3BsdGZtX2luaXQocGRldiwgaXByb2NfZGF0YS0+cGRhdGEsIHNpemVvZigqaXByb2NfaG9zdCkpOworCWlmIChJU19FUlIoaG9zdCkpCisJCXJldHVybiBQVFJfRVJSKGhvc3QpOworCisJcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJaXByb2NfaG9zdCA9IHNkaGNpX3BsdGZtX3ByaXYocGx0Zm1faG9zdCk7CisKKwlpcHJvY19ob3N0LT5kYXRhID0gaXByb2NfZGF0YTsKKworCW1tY19vZl9wYXJzZShob3N0LT5tbWMpOworCXNkaGNpX2dldF9vZl9wcm9wZXJ0eShwZGV2KTsKKworCS8qIEVuYWJsZSBFTU1DIDEvOFYgRERSIGNhcGFibGUgKi8KKwlob3N0LT5tbWMtPmNhcHMgfD0gTU1DX0NBUF8xXzhWX0REUjsKKworCXBsdGZtX2hvc3QtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBsdGZtX2hvc3QtPmNsaykpIHsKKwkJcmV0ID0gUFRSX0VSUihwbHRmbV9ob3N0LT5jbGspOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoaXByb2NfaG9zdC0+ZGF0YS0+cGRhdGEtPnF1aXJrcyAmIFNESENJX1FVSVJLX01JU1NJTkdfQ0FQUykgeworCQlob3N0LT5jYXBzID0gaXByb2NfaG9zdC0+ZGF0YS0+Y2FwczsKKwkJaG9zdC0+Y2FwczEgPSBpcHJvY19ob3N0LT5kYXRhLT5jYXBzMTsKKwl9CisKKwlyZXR1cm4gc2RoY2lfYWRkX2hvc3QoaG9zdCk7CisKK2VycjoKKwlzZGhjaV9wbHRmbV9mcmVlKHBkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2RoY2lfaXByb2NfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIHNkaGNpX3BsdGZtX3VucmVnaXN0ZXIocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNkaGNpX2lwcm9jX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzZGhjaS1pcHJvYyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IHNkaGNpX2lwcm9jX29mX21hdGNoLAorCQkucG0gPSBTREhDSV9QTFRGTV9QTU9QUywKKwl9LAorCS5wcm9iZSA9IHNkaGNpX2lwcm9jX3Byb2JlLAorCS5yZW1vdmUgPSBzZGhjaV9pcHJvY19yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzZGhjaV9pcHJvY19kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJUFJPQyBTREhDSSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktbXNtLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW1zbS5jCmluZGV4IDNkMzJjZTguLjRhMDlmNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktbXNtLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1tc20uYwpAQCAtMjIsNiArMjIsMTEgQEAKIAogI2luY2x1ZGUgInNkaGNpLXBsdGZtLmgiCiAKKyNkZWZpbmUgQ09SRV9NQ0lfVkVSU0lPTgkJMHg1MAorI2RlZmluZSBDT1JFX1ZFUlNJT05fTUFKT1JfU0hJRlQJMjgKKyNkZWZpbmUgQ09SRV9WRVJTSU9OX01BSk9SX01BU0sJCSgweGYgPDwgQ09SRV9WRVJTSU9OX01BSk9SX1NISUZUKQorI2RlZmluZSBDT1JFX1ZFUlNJT05fTUlOT1JfTUFTSwkJMHhmZgorCiAjZGVmaW5lIENPUkVfSENfTU9ERQkJMHg3OAogI2RlZmluZSBIQ19NT0RFX0VOCQkweDEKICNkZWZpbmUgQ09SRV9QT1dFUgkJMHgwCkBAIC00MSw2ICs0Niw4IEBACiAjZGVmaW5lIENPUkVfVkVORE9SX1NQRUMJMHgxMGMKICNkZWZpbmUgQ09SRV9DTEtfUFdSU0FWRQlCSVQoMSkKIAorI2RlZmluZSBDT1JFX1ZFTkRPUl9TUEVDX0NBUEFCSUxJVElFUzAJMHgxMWMKKwogI2RlZmluZSBDRFJfU0VMRVhUX1NISUZUCTIwCiAjZGVmaW5lIENEUl9TRUxFWFRfTUFTSwkJKDB4ZiA8PCBDRFJfU0VMRVhUX1NISUZUKQogI2RlZmluZSBDTVVYX1NISUZUX1BIQVNFX1NISUZUCTI0CkBAIC00MjYsNyArNDMzLDkgQEAKIAlzdHJ1Y3Qgc2RoY2lfbXNtX2hvc3QgKm1zbV9ob3N0OwogCXN0cnVjdCByZXNvdXJjZSAqY29yZV9tZW1yZXM7CiAJaW50IHJldDsKLQl1MTYgaG9zdF92ZXJzaW9uOworCXUxNiBob3N0X3ZlcnNpb24sIGNvcmVfbWlub3I7CisJdTMyIGNvcmVfdmVyc2lvbiwgY2FwczsKKwl1OCBjb3JlX21ham9yOwogCiAJbXNtX2hvc3QgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptc21faG9zdCksIEdGUF9LRVJORUwpOwogCWlmICghbXNtX2hvc3QpCkBAIC01MTYsNiArNTI1LDI0IEBACiAJCWhvc3RfdmVyc2lvbiwgKChob3N0X3ZlcnNpb24gJiBTREhDSV9WRU5ET1JfVkVSX01BU0spID4+CiAJCQkgICAgICAgU0RIQ0lfVkVORE9SX1ZFUl9TSElGVCkpOwogCisJY29yZV92ZXJzaW9uID0gcmVhZGxfcmVsYXhlZChtc21faG9zdC0+Y29yZV9tZW0gKyBDT1JFX01DSV9WRVJTSU9OKTsKKwljb3JlX21ham9yID0gKGNvcmVfdmVyc2lvbiAmIENPUkVfVkVSU0lPTl9NQUpPUl9NQVNLKSA+PgorCQkgICAgICBDT1JFX1ZFUlNJT05fTUFKT1JfU0hJRlQ7CisJY29yZV9taW5vciA9IGNvcmVfdmVyc2lvbiAmIENPUkVfVkVSU0lPTl9NSU5PUl9NQVNLOworCWRldl9kYmcoJnBkZXYtPmRldiwgIk1DSSBWZXJzaW9uOiAweCUwOHgsIG1ham9yOiAweCUwNHgsIG1pbm9yOiAweCUwMnhcbiIsCisJCWNvcmVfdmVyc2lvbiwgY29yZV9tYWpvciwgY29yZV9taW5vcik7CisKKwkvKgorCSAqIFN1cHBvcnQgZm9yIHNvbWUgY2FwYWJpbGl0aWVzIGlzIG5vdCBhZHZlcnRpc2VkIGJ5IG5ld2VyCisJICogY29udHJvbGxlciB2ZXJzaW9ucyBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQuCisJICovCisJaWYgKGNvcmVfbWFqb3IgPj0gMSAmJiBjb3JlX21pbm9yICE9IDB4MTEgJiYgY29yZV9taW5vciAhPSAweDEyKSB7CisJCWNhcHMgPSByZWFkbF9yZWxheGVkKGhvc3QtPmlvYWRkciArIFNESENJX0NBUEFCSUxJVElFUyk7CisJCWNhcHMgfD0gU0RIQ0lfQ0FOX1ZERF8zMDAgfCBTREhDSV9DQU5fRE9fOEJJVDsKKwkJd3JpdGVsX3JlbGF4ZWQoY2FwcywgaG9zdC0+aW9hZGRyICsKKwkJCSAgICAgICBDT1JFX1ZFTkRPUl9TUEVDX0NBUEFCSUxJVElFUzApOworCX0KKwogCXJldCA9IHNkaGNpX2FkZF9ob3N0KGhvc3QpOwogCWlmIChyZXQpCiAJCWdvdG8gY2xrX2Rpc2FibGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWFyYXNhbi5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1hcmFzYW4uYwppbmRleCBiY2I1MWU5Li42Mjg3ZDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWFyYXNhbi5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtYXJhc2FuLmMKQEAgLTE3Myw2ICsxNzMsMTIgQEAKIAlwbHRmbV9ob3N0LT5wcml2ID0gc2RoY2lfYXJhc2FuOwogCXBsdGZtX2hvc3QtPmNsayA9IGNsa194aW47CiAKKwlyZXQgPSBtbWNfb2ZfcGFyc2UoaG9zdC0+bW1jKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBhcnNpbmcgZHQgZmFpbGVkICgldSlcbiIsIHJldCk7CisJCWdvdG8gY2xrX2Rpc2FibGVfYWxsOworCX0KKwogCXJldCA9IHNkaGNpX2FkZF9ob3N0KGhvc3QpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3BsdGZtX2ZyZWU7CkBAIC0xOTUsNyArMjAxLDYgQEAKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CiAJc3RydWN0IHNkaGNpX2FyYXNhbl9kYXRhICpzZGhjaV9hcmFzYW4gPSBwbHRmbV9ob3N0LT5wcml2OwogCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsdGZtX2hvc3QtPmNsayk7CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNkaGNpX2FyYXNhbi0+Y2xrX2FoYik7CiAKIAlyZXR1cm4gc2RoY2lfcGx0Zm1fdW5yZWdpc3RlcihwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYwppbmRleCAxN2ZlMDJlLi4yMmU5MTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWVzZGhjLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1lc2RoYy5jCkBAIC0zODYsMTEgKzM4Niw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzZGhjaV9lc2RoY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gc2RoY2lfcGx0Zm1fdW5yZWdpc3RlcihwZGV2KTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2RoY2lfZXNkaGNfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4Mzc5LWVzZGhjIiB9LAogCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtZXNkaGMiIH0sCkBAIC00MDYsNyArNDAxLDcgQEAKIAkJLnBtID0gRVNESENfUE1PUFMsCiAJfSwKIAkucHJvYmUgPSBzZGhjaV9lc2RoY19wcm9iZSwKLQkucmVtb3ZlID0gc2RoY2lfZXNkaGNfcmVtb3ZlLAorCS5yZW1vdmUgPSBzZGhjaV9wbHRmbV91bnJlZ2lzdGVyLAogfTsKIAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzZGhjaV9lc2RoY19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1obHdkLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWhsd2QuYwppbmRleCBiZTQ3OTI3Li40MDc5YTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWhsd2QuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWhsd2QuYwpAQCAtNzUsMTEgKzc1LDYgQEAKIAlyZXR1cm4gc2RoY2lfcGx0Zm1fcmVnaXN0ZXIocGRldiwgJnNkaGNpX2hsd2RfcGRhdGEsIDApOwogfQogCi1zdGF0aWMgaW50IHNkaGNpX2hsd2RfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIHNkaGNpX3BsdGZtX3VucmVnaXN0ZXIocGRldik7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNkaGNpX2hsd2Rfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIm5pbnRlbmRvLGhvbGx5d29vZC1zZGhjaSIgfSwKIAl7IH0KQEAgLTkzLDcgKzg4LDcgQEAKIAkJLnBtID0gU0RIQ0lfUExURk1fUE1PUFMsCiAJfSwKIAkucHJvYmUgPSBzZGhjaV9obHdkX3Byb2JlLAotCS5yZW1vdmUgPSBzZGhjaV9obHdkX3JlbW92ZSwKKwkucmVtb3ZlID0gc2RoY2lfcGx0Zm1fdW5yZWdpc3RlciwKIH07CiAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2RoY2lfaGx3ZF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmMKaW5kZXggMjllYWZmNy4uN2EzZmMxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jCkBAIC02NTAsNiArNjUwLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV9wY2lfZml4ZXMgc2RoY2lfcnRzeCA9IHsKIAkucXVpcmtzMgk9IFNESENJX1FVSVJLMl9QUkVTRVRfVkFMVUVfQlJPS0VOIHwKKwkJCVNESENJX1FVSVJLMl9CUk9LRU5fNjRfQklUX0RNQSB8CiAJCQlTREhDSV9RVUlSSzJfQlJPS0VOX0REUjUwLAogCS5wcm9iZV9zbG90CT0gcnRzeF9wcm9iZV9zbG90LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYwppbmRleCBjNWIwMWQ2Li5hMjA3ZjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCkBAIC03NSw0MyArNzUsNDEgQEAKIAl1MzIgYnVzX3dpZHRoOwogCWludCBzaXplOwogCi0JaWYgKG9mX2RldmljZV9pc19hdmFpbGFibGUobnApKSB7Ci0JCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJzZGhjaSxhdXRvLWNtZDEyIiwgTlVMTCkpCi0JCQlob3N0LT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfTVVMVElCTE9DS19SRUFEX0FDTUQxMjsKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAic2RoY2ksYXV0by1jbWQxMiIsIE5VTEwpKQorCQlob3N0LT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfTVVMVElCTE9DS19SRUFEX0FDTUQxMjsKIAotCQlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAic2RoY2ksMS1iaXQtb25seSIsIE5VTEwpIHx8Ci0JCSAgICAob2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJidXMtd2lkdGgiLCAmYnVzX3dpZHRoKSA9PSAwICYmCi0JCSAgICBidXNfd2lkdGggPT0gMSkpCi0JCQlob3N0LT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfRk9SQ0VfMV9CSVRfREFUQTsKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAic2RoY2ksMS1iaXQtb25seSIsIE5VTEwpIHx8CisJICAgIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImJ1cy13aWR0aCIsICZidXNfd2lkdGgpID09IDAgJiYKKwkgICAgYnVzX3dpZHRoID09IDEpKQorCQlob3N0LT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfRk9SQ0VfMV9CSVRfREFUQTsKIAotCQlpZiAoc2RoY2lfb2Zfd3BfaW52ZXJ0ZWQobnApKQotCQkJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX0lOVkVSVEVEX1dSSVRFX1BST1RFQ1Q7CisJaWYgKHNkaGNpX29mX3dwX2ludmVydGVkKG5wKSkKKwkJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX0lOVkVSVEVEX1dSSVRFX1BST1RFQ1Q7CiAKLQkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImJyb2tlbi1jZCIsIE5VTEwpKQotCQkJaG9zdC0+cXVpcmtzIHw9IFNESENJX1FVSVJLX0JST0tFTl9DQVJEX0RFVEVDVElPTjsKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYnJva2VuLWNkIiwgTlVMTCkpCisJCWhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19CUk9LRU5fQ0FSRF9ERVRFQ1RJT047CiAKLQkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgIm5vLTEtOC12IiwgTlVMTCkpCi0JCQlob3N0LT5xdWlya3MyIHw9IFNESENJX1FVSVJLMl9OT18xXzhfVjsKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAibm8tMS04LXYiLCBOVUxMKSkKKwkJaG9zdC0+cXVpcmtzMiB8PSBTREhDSV9RVUlSSzJfTk9fMV84X1Y7CiAKLQkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLHAyMDIwLXJldjEtZXNkaGMiKSkKLQkJCWhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19CUk9LRU5fRE1BOworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxwMjAyMC1yZXYxLWVzZGhjIikpCisJCWhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19CUk9LRU5fRE1BOwogCi0JCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxwMjAyMC1lc2RoYyIpIHx8Ci0JCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxwMTAxMC1lc2RoYyIpIHx8Ci0JCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCx0NDI0MC1lc2RoYyIpIHx8Ci0JCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxtcGM4NTM2LWVzZGhjIikpCi0JCQlob3N0LT5xdWlya3MgfD0gU0RIQ0lfUVVJUktfQlJPS0VOX1RJTUVPVVRfVkFMOworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxwMjAyMC1lc2RoYyIpIHx8CisJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLHAxMDEwLWVzZGhjIikgfHwKKwkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsdDQyNDAtZXNkaGMiKSB8fAorCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxtcGM4NTM2LWVzZGhjIikpCisJCWhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19CUk9LRU5fVElNRU9VVF9WQUw7CiAKLQkJY2xrID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY2xvY2stZnJlcXVlbmN5IiwgJnNpemUpOwotCQlpZiAoY2xrICYmIHNpemUgPT0gc2l6ZW9mKCpjbGspICYmICpjbGspCi0JCQlwbHRmbV9ob3N0LT5jbG9jayA9IGJlMzJfdG9fY3B1cChjbGspOworCWNsayA9IG9mX2dldF9wcm9wZXJ0eShucCwgImNsb2NrLWZyZXF1ZW5jeSIsICZzaXplKTsKKwlpZiAoY2xrICYmIHNpemUgPT0gc2l6ZW9mKCpjbGspICYmICpjbGspCisJCXBsdGZtX2hvc3QtPmNsb2NrID0gYmUzMl90b19jcHVwKGNsayk7CiAKLQkJaWYgKG9mX2ZpbmRfcHJvcGVydHkobnAsICJrZWVwLXBvd2VyLWluLXN1c3BlbmQiLCBOVUxMKSkKLQkJCWhvc3QtPm1tYy0+cG1fY2FwcyB8PSBNTUNfUE1fS0VFUF9QT1dFUjsKKwlpZiAob2ZfZmluZF9wcm9wZXJ0eShucCwgImtlZXAtcG93ZXItaW4tc3VzcGVuZCIsIE5VTEwpKQorCQlob3N0LT5tbWMtPnBtX2NhcHMgfD0gTU1DX1BNX0tFRVBfUE9XRVI7CiAKLQkJaWYgKG9mX2ZpbmRfcHJvcGVydHkobnAsICJlbmFibGUtc2Rpby13YWtldXAiLCBOVUxMKSkKLQkJCWhvc3QtPm1tYy0+cG1fY2FwcyB8PSBNTUNfUE1fV0FLRV9TRElPX0lSUTsKLQl9CisJaWYgKG9mX2ZpbmRfcHJvcGVydHkobnAsICJlbmFibGUtc2Rpby13YWtldXAiLCBOVUxMKSkKKwkJaG9zdC0+bW1jLT5wbV9jYXBzIHw9IE1NQ19QTV9XQUtFX1NESU9fSVJROwogfQogI2Vsc2UKIHZvaWQgc2RoY2lfZ2V0X29mX3Byb3BlcnR5KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpIHt9CkBAIC0yMjUsOSArMjIzLDExIEBACiBpbnQgc2RoY2lfcGx0Zm1fdW5yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwogCWludCBkZWFkID0gKHJlYWRsKGhvc3QtPmlvYWRkciArIFNESENJX0lOVF9TVEFUVVMpID09IDB4ZmZmZmZmZmYpOwogCiAJc2RoY2lfcmVtb3ZlX2hvc3QoaG9zdCwgZGVhZCk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsdGZtX2hvc3QtPmNsayk7CiAJc2RoY2lfcGx0Zm1fZnJlZShwZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zaXJmLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXNpcmYuYwppbmRleCBmNmY4MmVjLi4zMjg0OGViIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXNpcmYuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXNpcmYuYwpAQCAtMjAsMTcgKzIwLDkgQEAKICNkZWZpbmUgU0lSRl9UVU5JTkdfQ09VTlQgMTI4CiAKIHN0cnVjdCBzZGhjaV9zaXJmX3ByaXYgewotCXN0cnVjdCBjbGsgKmNsazsKIAlpbnQgZ3Bpb19jZDsKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2RoY2lfc2lyZl9nZXRfbWF4X2NsayhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKLXsKLQlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7Ci0Jc3RydWN0IHNkaGNpX3NpcmZfcHJpdiAqcHJpdiA9IHNkaGNpX3BsdGZtX3ByaXYocGx0Zm1faG9zdCk7Ci0JcmV0dXJuIGNsa19nZXRfcmF0ZShwcml2LT5jbGspOwotfQotCiBzdGF0aWMgdm9pZCBzZGhjaV9zaXJmX3NldF9idXNfd2lkdGgoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCB3aWR0aCkKIHsKIAl1OCBjdHJsOwpAQCAtNTYsNyArNDgsNyBAQAogCWludCB0dW5pbmdfc2VxX2NudCA9IDM7CiAJdTggcGhhc2UsIHR1bmVkX3BoYXNlc1tTSVJGX1RVTklOR19DT1VOVF07CiAJdTggdHVuZWRfcGhhc2VfY250ID0gMDsKLQlpbnQgcmMsIGxvbmdlc3RfcmFuZ2UgPSAwOworCWludCByYyA9IDAsIGxvbmdlc3RfcmFuZ2UgPSAwOwogCWludCBzdGFydCA9IC0xLCBlbmQgPSAwLCB0dW5pbmdfdmFsdWUgPSAtMSwgcmFuZ2UgPSAwOwogCXUxNiBjbG9ja19zZXR0aW5nOwogCXN0cnVjdCBtbWNfaG9zdCAqbW1jID0gaG9zdC0+bW1jOwpAQCAtNjgsNyArNjAsNyBAQAogCXBoYXNlID0gMDsKIAlkbyB7CiAJCXNkaGNpX3dyaXRlbChob3N0LAotCQkJY2xvY2tfc2V0dGluZyB8IHBoYXNlIHwgKHBoYXNlIDw8IDcpIHwgKHBoYXNlIDw8IDE2KSwKKwkJCWNsb2NrX3NldHRpbmcgfCBwaGFzZSwKIAkJCVNESENJX0NMS19ERUxBWV9TRVRUSU5HKTsKIAogCQlpZiAoIW1tY19zZW5kX3R1bmluZyhtbWMpKSB7CkBAIC0xMDIsNyArOTQsNyBAQAogCQkgKi8KIAkJcGhhc2UgPSB0dW5pbmdfdmFsdWU7CiAJCXNkaGNpX3dyaXRlbChob3N0LAotCQkJY2xvY2tfc2V0dGluZyB8IHBoYXNlIHwgKHBoYXNlIDw8IDcpIHwgKHBoYXNlIDw8IDE2KSwKKwkJCWNsb2NrX3NldHRpbmcgfCBwaGFzZSwKIAkJCVNESENJX0NMS19ERUxBWV9TRVRUSU5HKTsKIAogCQlkZXZfZGJnKG1tY19kZXYobW1jKSwgIiVzOiBTZXR0aW5nIHRoZSB0dW5pbmcgcGhhc2UgdG8gJWRcbiIsCkBAIC0xMjIsNyArMTE0LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgc2RoY2lfb3BzIHNkaGNpX3NpcmZfb3BzID0gewogCS5wbGF0Zm9ybV9leGVjdXRlX3R1bmluZyA9IHNkaGNpX3NpcmZfZXhlY3V0ZV90dW5pbmcsCiAJLnNldF9jbG9jayA9IHNkaGNpX3NldF9jbG9jaywKLQkuZ2V0X21heF9jbG9jawk9IHNkaGNpX3NpcmZfZ2V0X21heF9jbGssCisJLmdldF9tYXhfY2xvY2sJPSBzZGhjaV9wbHRmbV9jbGtfZ2V0X21heF9jbG9jaywKIAkuc2V0X2J1c193aWR0aCA9IHNkaGNpX3NpcmZfc2V0X2J1c193aWR0aCwKIAkucmVzZXQgPSBzZGhjaV9yZXNldCwKIAkuc2V0X3Voc19zaWduYWxpbmcgPSBzZGhjaV9zZXRfdWhzX3NpZ25hbGluZywKQEAgLTE2MiwxMyArMTU0LDEzIEBACiAJCXJldHVybiBQVFJfRVJSKGhvc3QpOwogCiAJcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJcGx0Zm1faG9zdC0+Y2xrID0gY2xrOwogCXByaXYgPSBzZGhjaV9wbHRmbV9wcml2KHBsdGZtX2hvc3QpOwotCXByaXYtPmNsayA9IGNsazsKIAlwcml2LT5ncGlvX2NkID0gZ3Bpb19jZDsKIAogCXNkaGNpX2dldF9vZl9wcm9wZXJ0eShwZGV2KTsKIAotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwcml2LT5jbGspOworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwbHRmbV9ob3N0LT5jbGspOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2Nsa19wcmVwYXJlOwogCkBAIC0xOTUsMzcgKzE4NywyNCBAQAogZXJyX3JlcXVlc3RfY2Q6CiAJc2RoY2lfcmVtb3ZlX2hvc3QoaG9zdCwgMCk7CiBlcnJfc2RoY2lfYWRkOgotCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShwbHRmbV9ob3N0LT5jbGspOwogZXJyX2Nsa19wcmVwYXJlOgogCXNkaGNpX3BsdGZtX2ZyZWUocGRldik7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBzZGhjaV9zaXJmX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwotCXN0cnVjdCBzZGhjaV9zaXJmX3ByaXYgKnByaXYgPSBzZGhjaV9wbHRmbV9wcml2KHBsdGZtX2hvc3QpOwotCi0Jc2RoY2lfcGx0Zm1fdW5yZWdpc3RlcihwZGV2KTsKLQotCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5jbGspOwotCXJldHVybiAwOwotfQotCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IHNkaGNpX3NpcmZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7Ci0Jc3RydWN0IHNkaGNpX3NpcmZfcHJpdiAqcHJpdiA9IHNkaGNpX3BsdGZtX3ByaXYocGx0Zm1faG9zdCk7CiAJaW50IHJldDsKIAogCXJldCA9IHNkaGNpX3N1c3BlbmRfaG9zdChob3N0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JY2xrX2Rpc2FibGUocHJpdi0+Y2xrKTsKKwljbGtfZGlzYWJsZShwbHRmbV9ob3N0LT5jbGspOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMzQsMTAgKzIxMyw5IEBACiB7CiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7Ci0Jc3RydWN0IHNkaGNpX3NpcmZfcHJpdiAqcHJpdiA9IHNkaGNpX3BsdGZtX3ByaXYocGx0Zm1faG9zdCk7CiAJaW50IHJldDsKIAotCXJldCA9IGNsa19lbmFibGUocHJpdi0+Y2xrKTsKKwlyZXQgPSBjbGtfZW5hYmxlKHBsdGZtX2hvc3QtPmNsayk7CiAJaWYgKHJldCkgewogCQlkZXZfZGJnKGRldiwgIlJlc3VtZTogRXJyb3IgZW5hYmxpbmcgY2xvY2tcbiIpOwogCQlyZXR1cm4gcmV0OwpAQCAtMjY0LDcgKzI0Miw3IEBACiAjZW5kaWYKIAl9LAogCS5wcm9iZQkJPSBzZGhjaV9zaXJmX3Byb2JlLAotCS5yZW1vdmUJCT0gc2RoY2lfc2lyZl9yZW1vdmUsCisJLnJlbW92ZQkJPSBzZGhjaV9wbHRmbV91bnJlZ2lzdGVyLAogfTsKIAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzZGhjaV9zaXJmX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXNwZWFyLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXNwZWFyLmMKaW5kZXggMjJlNTgyNi4uZGYwODgzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zcGVhci5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktc3BlYXIuYwpAQCAtMjYsMTQgKzI2LDEzIEBACiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvc2RoY2ktc3BlYXIuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2xvdC1ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlICJzZGhjaS5oIgogCiBzdHJ1Y3Qgc3BlYXJfc2RoY2kgewogCXN0cnVjdCBjbGsgKmNsazsKLQlzdHJ1Y3Qgc2RoY2lfcGxhdF9kYXRhICpkYXRhOworCWludCBjYXJkX2ludF9ncGlvOwogfTsKIAogLyogc2RoY2kgb3BzICovCkBAIC00NCwzOCArNDMsMjAgQEAKIAkuc2V0X3Voc19zaWduYWxpbmcgPSBzZGhjaV9zZXRfdWhzX3NpZ25hbGluZywKIH07CiAKLSNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBzdHJ1Y3Qgc2RoY2lfcGxhdF9kYXRhICpzZGhjaV9wcm9iZV9jb25maWdfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIHNkaGNpX3Byb2JlX2NvbmZpZ19kdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCXN0cnVjdCBzcGVhcl9zZGhjaSAqaG9zdCkKIHsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0Jc3RydWN0IHNkaGNpX3BsYXRfZGF0YSAqcGRhdGEgPSBOVUxMOwogCWludCBjZF9ncGlvOwogCiAJY2RfZ3BpbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAiY2QtZ3Bpb3MiLCAwKTsKIAlpZiAoIWdwaW9faXNfdmFsaWQoY2RfZ3BpbykpCiAJCWNkX2dwaW8gPSAtMTsKIAotCS8qIElmIHBkYXRhIGlzIHJlcXVpcmVkICovCi0JaWYgKGNkX2dwaW8gIT0gLTEpIHsKLQkJcGRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwotCQlpZiAoIXBkYXRhKQotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRFQ6IGt6YWxsb2MgZmFpbGVkXG4iKTsKLQkJZWxzZQotCQkJcGRhdGEtPmNhcmRfaW50X2dwaW8gPSBjZF9ncGlvOwotCX0KLQotCXJldHVybiBwZGF0YTsKKwlob3N0LT5jYXJkX2ludF9ncGlvID0gY2RfZ3BpbzsKIH0KLSNlbHNlCi1zdGF0aWMgc3RydWN0IHNkaGNpX3BsYXRfZGF0YSAqc2RoY2lfcHJvYmVfY29uZmlnX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT1NZUyk7Ci19Ci0jZW5kaWYKIAogc3RhdGljIGludCBzZGhjaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmlvbWVtOwogCXN0cnVjdCBzcGVhcl9zZGhjaSAqc2RoY2k7CkBAIC0xMjQsMjggKzEwNSwxOCBAQAogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJFcnJvciBzZXR0aW5nIGRlc2lyZWQgY2xrLCBjbGs9JWx1XG4iLAogCQkJCWNsa19nZXRfcmF0ZShzZGhjaS0+Y2xrKSk7CiAKLQlpZiAobnApIHsKLQkJc2RoY2ktPmRhdGEgPSBzZGhjaV9wcm9iZV9jb25maWdfZHQocGRldik7Ci0JCWlmIChJU19FUlIoc2RoY2ktPmRhdGEpKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJEVDogRmFpbGVkIHRvIGdldCBwZGF0YVxuIik7Ci0JCQlnb3RvIGRpc2FibGVfY2xrOwotCQl9Ci0JfSBlbHNlIHsKLQkJc2RoY2ktPmRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwotCX0KLQorCXNkaGNpX3Byb2JlX2NvbmZpZ19kdChwZGV2LT5kZXYub2Zfbm9kZSwgc2RoY2kpOwogCS8qCiAJICogSXQgaXMgb3B0aW9uYWwgdG8gdXNlIEdQSU9zIGZvciBzZGhjaSBjYXJkIGRldGVjdGlvbi4gSWYKLQkgKiBzZGhjaS0+ZGF0YSBpcyBOVUxMLCB0aGVuIHVzZSBvcmlnaW5hbCBzZGhjaSBsaW5lcyBvdGhlcndpc2UKKwkgKiBzZGhjaS0+Y2FyZF9pbnRfZ3BpbyA8IDAsIHRoZW4gdXNlIG9yaWdpbmFsIHNkaGNpIGxpbmVzIG90aGVyd2lzZQogCSAqIEdQSU8gbGluZXMuIFdlIHVzZSB0aGUgYnVpbHQtaW4gR1BJTyBzdXBwb3J0IGZvciB0aGlzLgogCSAqLwotCWlmIChzZGhjaS0+ZGF0YSAmJiBzZGhjaS0+ZGF0YS0+Y2FyZF9pbnRfZ3BpbyA+PSAwKSB7Ci0JCXJldCA9IG1tY19ncGlvX3JlcXVlc3RfY2QoaG9zdC0+bW1jLAotCQkJCQkgIHNkaGNpLT5kYXRhLT5jYXJkX2ludF9ncGlvLCAwKTsKKwlpZiAoc2RoY2ktPmNhcmRfaW50X2dwaW8gPj0gMCkgeworCQlyZXQgPSBtbWNfZ3Bpb19yZXF1ZXN0X2NkKGhvc3QtPm1tYywgc2RoY2ktPmNhcmRfaW50X2dwaW8sIDApOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2RiZygmcGRldi0+ZGV2LAogCQkJCSJmYWlsZWQgdG8gcmVxdWVzdCBjYXJkLWRldGVjdCBncGlvJWRcbiIsCi0JCQkJc2RoY2ktPmRhdGEtPmNhcmRfaW50X2dwaW8pOworCQkJCXNkaGNpLT5jYXJkX2ludF9ncGlvKTsKIAkJCWdvdG8gZGlzYWJsZV9jbGs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXN0LmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXN0LmMKaW5kZXggODgyYjA3ZS4uNjgyZjJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zdC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktc3QuYwpAQCAtMjMsOSArMjMsMjk1IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KLQorI2luY2x1ZGUgPGxpbnV4L3Jlc2V0Lmg+CiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKIAorc3RydWN0IHN0X21tY19wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3QgIHJlc2V0X2NvbnRyb2wgKnJzdGM7CisJdm9pZCBfX2lvbWVtICp0b3BfaW9hZGRyOworfTsKKworLyogTU1DU1MgZ2x1ZSBsb2dpYyB0byBzZXR1cCB0aGUgSEMgb24gc29tZSBTVCBTb0NzIChlLmcuIFNUaUg0MDcgZmFtaWx5KSAqLworCisjZGVmaW5lIFNUX01NQ19DQ09ORklHX1JFR18xCQkweDQwMAorI2RlZmluZSBTVF9NTUNfQ0NPTkZJR19USU1FT1VUX0NMS19VTklUCUJJVCgyNCkKKyNkZWZpbmUgU1RfTU1DX0NDT05GSUdfVElNRU9VVF9DTEtfRlJFUQlCSVQoMTIpCisjZGVmaW5lIFNUX01NQ19DQ09ORklHX1RVTklOR19DT1VOVF9ERUZBVUxUCUJJVCg4KQorI2RlZmluZSBTVF9NTUNfQ0NPTkZJR19BU1lOQ19XQUtFVVAJQklUKDApCisjZGVmaW5lIFNUX01NQ19DQ09ORklHXzFfREVGQVVMVAlcCisJCQkJKChTVF9NTUNfQ0NPTkZJR19USU1FT1VUX0NMS19VTklUKSB8IFwKKwkJCQkgKFNUX01NQ19DQ09ORklHX1RJTUVPVVRfQ0xLX0ZSRVEpIHwgXAorCQkJCSAoU1RfTU1DX0NDT05GSUdfVFVOSU5HX0NPVU5UX0RFRkFVTFQpKQorCisjZGVmaW5lIFNUX01NQ19DQ09ORklHX1JFR18yCQkweDQwNAorI2RlZmluZSBTVF9NTUNfQ0NPTkZJR19ISUdIX1NQRUVECUJJVCgyOCkKKyNkZWZpbmUgU1RfTU1DX0NDT05GSUdfQURNQTIJCUJJVCgyNCkKKyNkZWZpbmUgU1RfTU1DX0NDT05GSUdfOEJJVAkJQklUKDIwKQorI2RlZmluZSBTVF9NTUNfQ0NPTkZJR19NQVhfQkxLX0xFTgkxNgorI2RlZmluZSAgTUFYX0JMS19MRU5fMTAyNAkJMQorI2RlZmluZSAgTUFYX0JMS19MRU5fMjA0OAkJMgorI2RlZmluZSBCQVNFX0NMS19GUkVRXzIwMAkJMHhjOAorI2RlZmluZSBCQVNFX0NMS19GUkVRXzEwMAkJMHg2NAorI2RlZmluZSBCQVNFX0NMS19GUkVRXzUwCQkweDMyCisjZGVmaW5lIFNUX01NQ19DQ09ORklHXzJfREVGQVVMVCBcCisJKFNUX01NQ19DQ09ORklHX0hJR0hfU1BFRUQgfCBTVF9NTUNfQ0NPTkZJR19BRE1BMiB8IFwKKwkgU1RfTU1DX0NDT05GSUdfOEJJVCB8IFwKKwkgKE1BWF9CTEtfTEVOXzEwMjQgPDwgU1RfTU1DX0NDT05GSUdfTUFYX0JMS19MRU4pKQorCisjZGVmaW5lIFNUX01NQ19DQ09ORklHX1JFR18zCQkJMHg0MDgKKyNkZWZpbmUgU1RfTU1DX0NDT05GSUdfRU1NQ19TTE9UX1RZUEUJCUJJVCgyOCkKKyNkZWZpbmUgU1RfTU1DX0NDT05GSUdfNjRCSVQJCQlCSVQoMjQpCisjZGVmaW5lIFNUX01NQ19DQ09ORklHX0FTWU5DSF9JTlRSX1NVUFBPUlQJQklUKDIwKQorI2RlZmluZSBTVF9NTUNfQ0NPTkZJR18xUDhfVk9MVAkJCUJJVCgxNikKKyNkZWZpbmUgU1RfTU1DX0NDT05GSUdfM1AwX1ZPTFQJCQlCSVQoMTIpCisjZGVmaW5lIFNUX01NQ19DQ09ORklHXzNQM19WT0xUCQkJQklUKDgpCisjZGVmaW5lIFNUX01NQ19DQ09ORklHX1NVU1BfUkVTX1NVUFBPUlQJCUJJVCg0KQorI2RlZmluZSBTVF9NTUNfQ0NPTkZJR19TRE1BCQkJQklUKDApCisjZGVmaW5lIFNUX01NQ19DQ09ORklHXzNfREVGQVVMVAlcCisJCQkgKFNUX01NQ19DQ09ORklHX0FTWU5DSF9JTlRSX1NVUFBPUlQJfCBcCisJCQkgIFNUX01NQ19DQ09ORklHXzNQM19WT0xUCQl8IFwKKwkJCSAgU1RfTU1DX0NDT05GSUdfU1VTUF9SRVNfU1VQUE9SVAl8IFwKKwkJCSAgU1RfTU1DX0NDT05GSUdfU0RNQSkKKworI2RlZmluZSBTVF9NTUNfQ0NPTkZJR19SRUdfNAkweDQwYworI2RlZmluZSBTVF9NTUNfQ0NPTkZJR19EX0RSSVZFUglCSVQoMjApCisjZGVmaW5lIFNUX01NQ19DQ09ORklHX0NfRFJJVkVSCUJJVCgxNikKKyNkZWZpbmUgU1RfTU1DX0NDT05GSUdfQV9EUklWRVIJQklUKDEyKQorI2RlZmluZSBTVF9NTUNfQ0NPTkZJR19ERFI1MAlCSVQoOCkKKyNkZWZpbmUgU1RfTU1DX0NDT05GSUdfU0RSMTA0CUJJVCg0KQorI2RlZmluZSBTVF9NTUNfQ0NPTkZJR19TRFI1MAlCSVQoMCkKKyNkZWZpbmUgU1RfTU1DX0NDT05GSUdfNF9ERUZBVUxUCTAKKworI2RlZmluZSBTVF9NTUNfQ0NPTkZJR19SRUdfNQkJMHg0MTAKKyNkZWZpbmUgU1RfTU1DX0NDT05GSUdfVFVOSU5HX0ZPUl9TRFI1MAlCSVQoOCkKKyNkZWZpbmUgUkVUVU5JTkdfVElNRVJfQ05UX01BWAkJMHhmCisjZGVmaW5lIFNUX01NQ19DQ09ORklHXzVfREVGQVVMVAkwCisKKy8qIEkvTyBjb25maWd1cmF0aW9uIGZvciBBcmFzYW4gSVAgKi8KKyNkZWZpbmUgU1RfTU1DX0dQX09VVFBVVAkweDQ1MAorI2RlZmluZSBTVF9NTUNfR1BfT1VUUFVUX0NECUJJVCgxMikKKworI2RlZmluZSBTVF9NTUNfU1RBVFVTX1IJCTB4NDYwCisKKyNkZWZpbmUgU1RfVE9QX01NQ19ETFlfRklYX09GRih4KQkoeCAtIDB4OCkKKworLyogVE9QIGNvbmZpZyByZWdpc3RlcnMgdG8gbWFuYWdlIHN0YXRpYyBhbmQgZHluYW1pYyBkZWxheSAqLworI2RlZmluZSBTVF9UT1BfTU1DX1RYX0NMS19ETFkJCQlTVF9UT1BfTU1DX0RMWV9GSVhfT0ZGKDB4OCkKKyNkZWZpbmUgU1RfVE9QX01NQ19SWF9DTEtfRExZCQkJU1RfVE9QX01NQ19ETFlfRklYX09GRigweGMpCisvKiBNTUMgZGVsYXkgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZSBTVF9UT1BfTU1DX0RMWV9DVFJMCQkJU1RfVE9QX01NQ19ETFlfRklYX09GRigweDE4KQorI2RlZmluZSBTVF9UT1BfTU1DX0RMWV9DVFJMX0RMTF9CWVBBU1NfQ01ECUJJVCgwKQorI2RlZmluZSBTVF9UT1BfTU1DX0RMWV9DVFJMX0RMTF9CWVBBU1NfUEhfU0VMCUJJVCgxKQorI2RlZmluZSBTVF9UT1BfTU1DX0RMWV9DVFJMX1RYX0RMTF9FTkFCTEUJQklUKDgpCisjZGVmaW5lIFNUX1RPUF9NTUNfRExZX0NUUkxfUlhfRExMX0VOQUJMRQlCSVQoOSkKKyNkZWZpbmUgU1RfVE9QX01NQ19ETFlfQ1RSTF9BVFVORV9OT1RfQ0ZHX0RMWQlCSVQoMTApCisjZGVmaW5lIFNUX1RPUF9NTUNfU1RBUlRfRExMX0xPQ0sJCUJJVCgxMSkKKworLyogcmVnaXN0ZXIgdG8gcHJvdmlkZSB0aGUgcGhhc2Utc2hpZnQgdmFsdWUgZm9yIERMTCAqLworI2RlZmluZSBTVF9UT1BfTU1DX1RYX0RMTF9TVEVQX0RMWQkJU1RfVE9QX01NQ19ETFlfRklYX09GRigweDFjKQorI2RlZmluZSBTVF9UT1BfTU1DX1JYX0RMTF9TVEVQX0RMWQkJU1RfVE9QX01NQ19ETFlfRklYX09GRigweDIwKQorI2RlZmluZSBTVF9UT1BfTU1DX1JYX0NNRF9TVEVQX0RMWQkJU1RfVE9QX01NQ19ETFlfRklYX09GRigweDI0KQorCisvKiBwaGFzZSBzaGlmdCBkZWxheSBvbiB0aGUgdHggY2xrIDIuMTg4bnMgKi8KKyNkZWZpbmUgU1RfVE9QX01NQ19UWF9ETExfU1RFUF9ETFlfVkFMSUQJMHg2CisKKyNkZWZpbmUgU1RfVE9QX01NQ19ETFlfTUFYCQkJMHhmCisKKyNkZWZpbmUgU1RfVE9QX01NQ19EWU5fRExZX0NPTkYJXAorCQkoU1RfVE9QX01NQ19ETFlfQ1RSTF9UWF9ETExfRU5BQkxFIHwgXAorCQkgU1RfVE9QX01NQ19ETFlfQ1RSTF9BVFVORV9OT1RfQ0ZHX0RMWSB8IFwKKwkJIFNUX1RPUF9NTUNfU1RBUlRfRExMX0xPQ0spCisKKy8qCisgKiBGb3IgY2xvY2sgc3BlZWRzIGdyZWF0ZXIgdGhhbiA5ME1Ieiwgd2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZQorICogRExMIHByb2NlZHVyZSBoYXMgZmluaXNoZWQgYmVmb3JlIHN3aXRjaGluZyB0byB1bHRyYS1zcGVlZCBtb2Rlcy4KKyAqLworI2RlZmluZQlDTEtfVE9fQ0hFQ0tfRExMX0xPQ0sJOTAwMDAwMDAKKworc3RhdGljIGlubGluZSB2b2lkIHN0X21tY3NzX3NldF9zdGF0aWNfZGVsYXkodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJaWYgKCFpb2FkZHIpCisJCXJldHVybjsKKworCXdyaXRlbF9yZWxheGVkKDB4MCwgaW9hZGRyICsgU1RfVE9QX01NQ19ETFlfQ1RSTCk7CisJd3JpdGVsX3JlbGF4ZWQoU1RfVE9QX01NQ19ETFlfTUFYLAorCQkJaW9hZGRyICsgU1RfVE9QX01NQ19UWF9DTEtfRExZKTsKK30KKworLyoqCisgKiBzdF9tbWNzc19jY29uZmlnOiBjb25maWd1cmUgdGhlIEFyYXNhbiBIQyBpbnNpZGUgdGhlIGZsYXNoU1MuCisgKiBAbnA6IGR0IGRldmljZSBub2RlLgorICogQGhvc3Q6IHNkaGNpIGhvc3QKKyAqIERlc2NyaXB0aW9uOiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGNvbmZpZ3VyZSB0aGUgQXJhc2FuIGhvc3QgY29udHJvbGxlci4KKyAqIE9uIHNvbWUgU1QgU29DcywgaS5lLiBTVGlINDA3IGZhbWlseSwgdGhlIE1NQyBkZXZpY2VzIGluc2lkZSBhIGRlZGljYXRlZAorICogZmxhc2hTUyBzdWItc3lzdGVtIHdoaWNoIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgdG8gYmUgY29tcGxpYW50IHRvIGVNTUMgNC41CisgKiBvciBlTU1DNC4zLiAgVGhpcyBoYXMgdG8gYmUgZG9uZSBiZWZvcmUgcmVnaXN0ZXJpbmcgdGhlIHNkaGNpIGhvc3QuCisgKi8KK3N0YXRpYyB2b2lkIHN0X21tY3NzX2Njb25maWcoc3RydWN0IGRldmljZV9ub2RlICpucCwgc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOworCXN0cnVjdCBtbWNfaG9zdCAqbWhvc3QgPSBob3N0LT5tbWM7CisJdTMyIGNjb25mMiwgY2NvbmYzLCBjY29uZjQsIGNjb25mNTsKKworCWlmICghb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJzdCxzZGhjaS1zdGloNDA3IikpCisJCXJldHVybjsKKworCWNjb25mMiA9IFNUX01NQ19DQ09ORklHXzJfREVGQVVMVDsKKwljY29uZjMgPSBTVF9NTUNfQ0NPTkZJR18zX0RFRkFVTFQ7CisJY2NvbmY0ID0gU1RfTU1DX0NDT05GSUdfNF9ERUZBVUxUOworCWNjb25mNSA9IFNUX01NQ19DQ09ORklHXzVfREVGQVVMVDsKKworCXdyaXRlbF9yZWxheGVkKFNUX01NQ19DQ09ORklHXzFfREVGQVVMVCwKKwkJCWhvc3QtPmlvYWRkciArIFNUX01NQ19DQ09ORklHX1JFR18xKTsKKworCS8qIFNldCBjbG9jayBmcmVxdWVuY3ksIGRlZmF1bHQgdG8gNTBNSHogaWYgbWF4LWZyZXF1ZW5jeSBpcyBub3QKKwkgKiBwcm92aWRlZCAqLworCisJc3dpdGNoIChtaG9zdC0+Zl9tYXgpIHsKKwljYXNlIDIwMDAwMDAwMDoKKwkJY2xrX3NldF9yYXRlKHBsdGZtX2hvc3QtPmNsaywgbWhvc3QtPmZfbWF4KTsKKwkJY2NvbmYyIHw9IEJBU0VfQ0xLX0ZSRVFfMjAwOworCQlicmVhazsKKwljYXNlIDEwMDAwMDAwMDoKKwkJY2xrX3NldF9yYXRlKHBsdGZtX2hvc3QtPmNsaywgbWhvc3QtPmZfbWF4KTsKKwkJY2NvbmYyIHw9IEJBU0VfQ0xLX0ZSRVFfMTAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljbGtfc2V0X3JhdGUocGx0Zm1faG9zdC0+Y2xrLCA1MDAwMDAwMCk7CisJCWNjb25mMiB8PSBCQVNFX0NMS19GUkVRXzUwOworCX0KKworCXdyaXRlbF9yZWxheGVkKGNjb25mMiwgaG9zdC0+aW9hZGRyICsgU1RfTU1DX0NDT05GSUdfUkVHXzIpOworCisJaWYgKG1ob3N0LT5jYXBzICYgTU1DX0NBUF9OT05SRU1PVkFCTEUpCisJCWNjb25mMyB8PSBTVF9NTUNfQ0NPTkZJR19FTU1DX1NMT1RfVFlQRTsKKwllbHNlCisJCS8qIENBUkQgX0QgRVRfQ1RSTCAqLworCQl3cml0ZWxfcmVsYXhlZChTVF9NTUNfR1BfT1VUUFVUX0NELAorCQkJCWhvc3QtPmlvYWRkciArIFNUX01NQ19HUF9PVVRQVVQpOworCisJaWYgKG1ob3N0LT5jYXBzICYgTU1DX0NBUF9VSFNfU0RSNTApIHsKKwkJLyogdXNlIDEuOFYgKi8KKwkJY2NvbmYzIHw9IFNUX01NQ19DQ09ORklHXzFQOF9WT0xUOworCQljY29uZjQgfD0gU1RfTU1DX0NDT05GSUdfU0RSNTA7CisJCS8qIFVzZSB0dW5pbmcgKi8KKwkJY2NvbmY1IHw9IFNUX01NQ19DQ09ORklHX1RVTklOR19GT1JfU0RSNTA7CisJCS8qIE1heCB0aW1lb3V0IGZvciByZXR1bmluZyAqLworCQljY29uZjUgfD0gUkVUVU5JTkdfVElNRVJfQ05UX01BWDsKKwl9CisKKwlpZiAobWhvc3QtPmNhcHMgJiBNTUNfQ0FQX1VIU19TRFIxMDQpIHsKKwkJLyoKKwkJICogU0RSMTA0IGltcGxpZXMgdGhlIEhDIGNhbiBzdXBwb3J0IEhTMjAwIG1vZGUsIHNvCisJCSAqIGl0J3MgbWFuZGF0b3J5IHRvIHVzZSAxLjhWCisJCSAqLworCQljY29uZjMgfD0gU1RfTU1DX0NDT05GSUdfMVA4X1ZPTFQ7CisJCWNjb25mNCB8PSBTVF9NTUNfQ0NPTkZJR19TRFIxMDQ7CisJCS8qIE1heCB0aW1lb3V0IGZvciByZXR1bmluZyAqLworCQljY29uZjUgfD0gUkVUVU5JTkdfVElNRVJfQ05UX01BWDsKKwl9CisKKwlpZiAobWhvc3QtPmNhcHMgJiBNTUNfQ0FQX1VIU19ERFI1MCkKKwkJY2NvbmY0IHw9IFNUX01NQ19DQ09ORklHX0REUjUwOworCisJd3JpdGVsX3JlbGF4ZWQoY2NvbmYzLCBob3N0LT5pb2FkZHIgKyBTVF9NTUNfQ0NPTkZJR19SRUdfMyk7CisJd3JpdGVsX3JlbGF4ZWQoY2NvbmY0LCBob3N0LT5pb2FkZHIgKyBTVF9NTUNfQ0NPTkZJR19SRUdfNCk7CisJd3JpdGVsX3JlbGF4ZWQoY2NvbmY1LCBob3N0LT5pb2FkZHIgKyBTVF9NTUNfQ0NPTkZJR19SRUdfNSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdF9tbWNzc19zZXRfZGxsKHZvaWQgX19pb21lbSAqaW9hZGRyKQoreworCWlmICghaW9hZGRyKQorCQlyZXR1cm47CisKKwl3cml0ZWxfcmVsYXhlZChTVF9UT1BfTU1DX0RZTl9ETFlfQ09ORiwJaW9hZGRyICsgU1RfVE9QX01NQ19ETFlfQ1RSTCk7CisJd3JpdGVsX3JlbGF4ZWQoU1RfVE9QX01NQ19UWF9ETExfU1RFUF9ETFlfVkFMSUQsCisJCQlpb2FkZHIgKyBTVF9UT1BfTU1DX1RYX0RMTF9TVEVQX0RMWSk7Cit9CisKK3N0YXRpYyBpbnQgc3RfbW1jc3NfbG9ja19kbGwodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJdW5zaWduZWQgbG9uZyBjdXJyLCB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIGZpbmlzaCA9IGppZmZpZXMgKyBIWjsKKworCS8qIENoZWNrcyBpZiB0aGUgRExMIHByb2NlZHVyZSBpcyBmaW5pc2hlZCAqLworCWRvIHsKKwkJY3VyciA9IGppZmZpZXM7CisJCXZhbHVlID0gcmVhZGwoaW9hZGRyICsgU1RfTU1DX1NUQVRVU19SKTsKKwkJaWYgKHZhbHVlICYgMHgxKQorCQkJcmV0dXJuIDA7CisKKwkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoIXRpbWVfYWZ0ZXJfZXEoY3VyciwgZmluaXNoKSk7CisKKwlyZXR1cm4gLUVCVVNZOworfQorCitzdGF0aWMgaW50IHNkaGNpX3N0X3NldF9kbGxfZm9yX2Nsb2NrKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3Qgc3RfbW1jX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGx0Zm1faG9zdC0+cHJpdjsKKworCWlmIChob3N0LT5jbG9jayA+IENMS19UT19DSEVDS19ETExfTE9DSykgeworCQlzdF9tbWNzc19zZXRfZGxsKHBkYXRhLT50b3BfaW9hZGRyKTsKKwkJcmV0ID0gc3RfbW1jc3NfbG9ja19kbGwoaG9zdC0+aW9hZGRyKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzZGhjaV9zdF9zZXRfdWhzX3NpZ25hbGluZyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKKwkJCQkJdW5zaWduZWQgaW50IHVocykKK3sKKwlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJc3RydWN0IHN0X21tY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBsdGZtX2hvc3QtPnByaXY7CisJdTE2IGN0cmxfMiA9IHNkaGNpX3JlYWR3KGhvc3QsIFNESENJX0hPU1RfQ09OVFJPTDIpOworCWludCByZXQgPSAwOworCisJLyogU2VsZWN0IEJ1cyBTcGVlZCBNb2RlIGZvciBob3N0ICovCisJY3RybF8yICY9IH5TREhDSV9DVFJMX1VIU19NQVNLOworCXN3aXRjaCAodWhzKSB7CisJLyoKKwkgKiBTZXQgVjE4X0VOIC0tIFVIUyBtb2RlcyBkbyBub3Qgd29yayB3aXRob3V0IHRoaXMuCisJICogZG9lcyBub3QgY2hhbmdlIHNpZ25hbGluZyB2b2x0YWdlCisJICovCisKKwljYXNlIE1NQ19USU1JTkdfVUhTX1NEUjEyOgorCQlzdF9tbWNzc19zZXRfc3RhdGljX2RlbGF5KHBkYXRhLT50b3BfaW9hZGRyKTsKKwkJY3RybF8yIHw9IFNESENJX0NUUkxfVUhTX1NEUjEyIHwgU0RIQ0lfQ1RSTF9WRERfMTgwOworCQlicmVhazsKKwljYXNlIE1NQ19USU1JTkdfVUhTX1NEUjI1OgorCQlzdF9tbWNzc19zZXRfc3RhdGljX2RlbGF5KHBkYXRhLT50b3BfaW9hZGRyKTsKKwkJY3RybF8yIHw9IFNESENJX0NUUkxfVUhTX1NEUjI1IHwgU0RIQ0lfQ1RSTF9WRERfMTgwOworCQlicmVhazsKKwljYXNlIE1NQ19USU1JTkdfVUhTX1NEUjUwOgorCQlzdF9tbWNzc19zZXRfc3RhdGljX2RlbGF5KHBkYXRhLT50b3BfaW9hZGRyKTsKKwkJY3RybF8yIHw9IFNESENJX0NUUkxfVUhTX1NEUjUwIHwgU0RIQ0lfQ1RSTF9WRERfMTgwOworCQlyZXQgPSBzZGhjaV9zdF9zZXRfZGxsX2Zvcl9jbG9jayhob3N0KTsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX1VIU19TRFIxMDQ6CisJY2FzZSBNTUNfVElNSU5HX01NQ19IUzIwMDoKKwkJc3RfbW1jc3Nfc2V0X3N0YXRpY19kZWxheShwZGF0YS0+dG9wX2lvYWRkcik7CisJCWN0cmxfMiB8PSBTREhDSV9DVFJMX1VIU19TRFIxMDQgfCBTREhDSV9DVFJMX1ZERF8xODA7CisJCXJldCA9ICBzZGhjaV9zdF9zZXRfZGxsX2Zvcl9jbG9jayhob3N0KTsKKwkJYnJlYWs7CisJY2FzZSBNTUNfVElNSU5HX1VIU19ERFI1MDoKKwljYXNlIE1NQ19USU1JTkdfTU1DX0REUjUyOgorCQlzdF9tbWNzc19zZXRfc3RhdGljX2RlbGF5KHBkYXRhLT50b3BfaW9hZGRyKTsKKwkJY3RybF8yIHw9IFNESENJX0NUUkxfVUhTX0REUjUwIHwgU0RIQ0lfQ1RSTF9WRERfMTgwOworCQlicmVhazsKKwl9CisKKwlpZiAocmV0KQorCQlkZXZfd2FybihtbWNfZGV2KGhvc3QtPm1tYyksICJFcnJvciBzZXR0aW5nIGRsbCBmb3IgY2xvY2sgIgorCQkJCQkJIih1aHMgJWQpXG4iLCB1aHMpOworCisJZGV2X2RiZyhtbWNfZGV2KGhvc3QtPm1tYyksICJ1aHMgJWQsIGN0cmxfMiAlMDRYXG4iLCB1aHMsIGN0cmxfMik7CisKKwlzZGhjaV93cml0ZXcoaG9zdCwgY3RybF8yLCBTREhDSV9IT1NUX0NPTlRST0wyKTsKK30KKwogc3RhdGljIHUzMiBzZGhjaV9zdF9yZWFkbChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwgaW50IHJlZykKIHsKIAl1MzIgcmV0OwpAQCAtNDgsMjIgKzMzNCwzMyBAQAogCS5zZXRfYnVzX3dpZHRoID0gc2RoY2lfc2V0X2J1c193aWR0aCwKIAkucmVhZF9sID0gc2RoY2lfc3RfcmVhZGwsCiAJLnJlc2V0ID0gc2RoY2lfcmVzZXQsCisJLnNldF91aHNfc2lnbmFsaW5nID0gc2RoY2lfc3Rfc2V0X3Voc19zaWduYWxpbmcsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX3BsdGZtX2RhdGEgc2RoY2lfc3RfcGRhdGEgPSB7CiAJLm9wcyA9ICZzZGhjaV9zdF9vcHMsCiAJLnF1aXJrcyA9IFNESENJX1FVSVJLX05PX0VOREFUVFJfSU5fTk9QREVTQyB8Ci0JICAgIFNESENJX1FVSVJLX0NBUF9DTE9DS19CQVNFX0JST0tFTiwKKwkJU0RIQ0lfUVVJUktfQ0FQX0NMT0NLX0JBU0VfQlJPS0VOIHwKKwkJU0RIQ0lfUVVJUktfTk9fSElTUERfQklULAorCS5xdWlya3MyID0gU0RIQ0lfUVVJUksyX1BSRVNFVF9WQUxVRV9CUk9LRU4gfAorCQlTREhDSV9RVUlSSzJfU1RPUF9XSVRIX1RDLAogfTsKIAogCiBzdGF0aWMgaW50IHNkaGNpX3N0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OworCXN0cnVjdCBzdF9tbWNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3Q7CiAJc3RydWN0IGNsayAqY2xrOwogCWludCByZXQgPSAwOwogCXUxNiBob3N0X3ZlcnNpb247CisJc3RydWN0IHJlc291cmNlICpyZXM7CisKKwlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAljbGsgPSAgZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJtbWMiKTsKIAlpZiAoSVNfRVJSKGNsaykpIHsKQEAgLTcxLDEwICszNjgsMTcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAl9CiAKKwlwZGF0YS0+cnN0YyA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihwZGF0YS0+cnN0YykpCisJCXBkYXRhLT5yc3RjID0gTlVMTDsKKwllbHNlCisJCXJlc2V0X2NvbnRyb2xfZGVhc3NlcnQocGRhdGEtPnJzdGMpOworCiAJaG9zdCA9IHNkaGNpX3BsdGZtX2luaXQocGRldiwgJnNkaGNpX3N0X3BkYXRhLCAwKTsKIAlpZiAoSVNfRVJSKGhvc3QpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCBzZGhjaV9wbHRmbV9pbml0XG4iKTsKLQkJcmV0dXJuIFBUUl9FUlIoaG9zdCk7CisJCXJldCA9IFBUUl9FUlIoaG9zdCk7CisJCWdvdG8gZXJyX3BsdGZtX2luaXQ7CiAJfQogCiAJcmV0ID0gbW1jX29mX3BhcnNlKGhvc3QtPm1tYyk7CkBAIC04NSw5ICszODksMjIgQEAKIAogCWNsa19wcmVwYXJlX2VuYWJsZShjbGspOwogCisJLyogQ29uZmlndXJlIHRoZSBGbGFzaFNTIFRvcCByZWdpc3RlcnMgZm9yIHNldHRpbmcgZU1NQyBUWC9SWCBkZWxheSAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCSAgICJ0b3AtbW1jLWRlbGF5Iik7CisJcGRhdGEtPnRvcF9pb2FkZHIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBkYXRhLT50b3BfaW9hZGRyKSkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiRmxhc2hTUyBUb3AgRGx5IHJlZ2lzdGVycyBub3QgYXZhaWxhYmxlIik7CisJCXBkYXRhLT50b3BfaW9hZGRyID0gTlVMTDsKKwl9CisKIAlwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlwbHRmbV9ob3N0LT5wcml2ID0gcGRhdGE7CiAJcGx0Zm1faG9zdC0+Y2xrID0gY2xrOwogCisJLyogQ29uZmlndXJlIHRoZSBBcmFzYW4gSEMgaW5zaWRlIHRoZSBmbGFzaFNTICovCisJc3RfbW1jc3NfY2NvbmZpZyhucCwgaG9zdCk7CisKIAlyZXQgPSBzZGhjaV9hZGRfaG9zdChob3N0KTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCBzZGhjaV9hZGRfaG9zdFxuIik7CkBAIC0xMDksNiArNDI2LDkgQEAKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoY2xrKTsKIGVycl9vZjoKIAlzZGhjaV9wbHRmbV9mcmVlKHBkZXYpOworZXJyX3BsdGZtX2luaXQ6CisJaWYgKHBkYXRhLT5yc3RjKQorCQlyZXNldF9jb250cm9sX2Fzc2VydChwZGF0YS0+cnN0Yyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTE3LDEwICs0MzcsMTUgQEAKIHsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3Qgc3RfbW1jX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGx0Zm1faG9zdC0+cHJpdjsKKwlpbnQgcmV0OwogCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsdGZtX2hvc3QtPmNsayk7CisJcmV0ID0gc2RoY2lfcGx0Zm1fdW5yZWdpc3RlcihwZGV2KTsKIAotCXJldHVybiBzZGhjaV9wbHRmbV91bnJlZ2lzdGVyKHBkZXYpOworCWlmIChwZGF0YS0+cnN0YykKKwkJcmVzZXRfY29udHJvbF9hc3NlcnQocGRhdGEtPnJzdGMpOworCisJcmV0dXJuIHJldDsKIH0KIAogI2lmZGVmIENPTkZJR19QTV9TTEVFUApAQCAtMTI4LDExICs0NTMsMTUgQEAKIHsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKKwlzdHJ1Y3Qgc3RfbW1jX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGx0Zm1faG9zdC0+cHJpdjsKIAlpbnQgcmV0ID0gc2RoY2lfc3VzcGVuZF9ob3N0KGhvc3QpOwogCiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAKKwlpZiAocGRhdGEtPnJzdGMpCisJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHBkYXRhLT5yc3RjKTsKKwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShwbHRmbV9ob3N0LT5jbGspOwogb3V0OgogCXJldHVybiByZXQ7CkBAIC0xNDIsOSArNDcxLDE2IEBACiB7CiAJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CisJc3RydWN0IHN0X21tY19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBsdGZtX2hvc3QtPnByaXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGRldi0+b2Zfbm9kZTsKIAogCWNsa19wcmVwYXJlX2VuYWJsZShwbHRmbV9ob3N0LT5jbGspOwogCisJaWYgKHBkYXRhLT5yc3RjKQorCQlyZXNldF9jb250cm9sX2RlYXNzZXJ0KHBkYXRhLT5yc3RjKTsKKworCXN0X21tY3NzX2Njb25maWcobnAsIGhvc3QpOworCiAJcmV0dXJuIHNkaGNpX3Jlc3VtZV9ob3N0KGhvc3QpOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMKaW5kZXggZjM3NzhkNS4uYWQyOGI0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYwpAQCAtMjAsMTEgKzIwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zbG90LWdwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CiAKICNpbmNsdWRlICJzZGhjaS1wbHRmbS5oIgogCkBAIC00MSw3ICs0MCw2IEBACiAjZGVmaW5lIE5WUVVJUktfRElTQUJMRV9TRFI1MAkJQklUKDMpCiAjZGVmaW5lIE5WUVVJUktfRElTQUJMRV9TRFIxMDQJCUJJVCg0KQogI2RlZmluZSBOVlFVSVJLX0RJU0FCTEVfRERSNTAJCUJJVCg1KQotI2RlZmluZSBOVlFVSVJLX1NIQURPV19YRkVSX01PREVfUkVHCUJJVCg2KQogCiBzdHJ1Y3Qgc2RoY2lfdGVncmFfc29jX2RhdGEgewogCWNvbnN0IHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhICpwZGF0YTsKQEAgLTUwLDcgKzQ4LDcgQEAKIAogc3RydWN0IHNkaGNpX3RlZ3JhIHsKIAljb25zdCBzdHJ1Y3Qgc2RoY2lfdGVncmFfc29jX2RhdGEgKnNvY19kYXRhOwotCWludCBwb3dlcl9ncGlvOworCXN0cnVjdCBncGlvX2Rlc2MgKnBvd2VyX2dwaW87CiB9OwogCiBzdGF0aWMgdTE2IHRlZ3JhX3NkaGNpX3JlYWR3KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKQpAQCAtNzEsMjMgKzY5LDE5IEBACiBzdGF0aWMgdm9pZCB0ZWdyYV9zZGhjaV93cml0ZXcoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHUxNiB2YWwsIGludCByZWcpCiB7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwotCXN0cnVjdCBzZGhjaV90ZWdyYSAqdGVncmFfaG9zdCA9IHBsdGZtX2hvc3QtPnByaXY7Ci0JY29uc3Qgc3RydWN0IHNkaGNpX3RlZ3JhX3NvY19kYXRhICpzb2NfZGF0YSA9IHRlZ3JhX2hvc3QtPnNvY19kYXRhOwogCi0JaWYgKHNvY19kYXRhLT5udnF1aXJrcyAmIE5WUVVJUktfU0hBRE9XX1hGRVJfTU9ERV9SRUcpIHsKLQkJc3dpdGNoIChyZWcpIHsKLQkJY2FzZSBTREhDSV9UUkFOU0ZFUl9NT0RFOgotCQkJLyoKLQkJCSAqIFBvc3Rwb25lIHRoaXMgd3JpdGUsIHdlIG11c3QgZG8gaXQgdG9nZXRoZXIgd2l0aCBhCi0JCQkgKiBjb21tYW5kIHdyaXRlIHRoYXQgaXMgZG93biBiZWxvdy4KLQkJCSAqLwotCQkJcGx0Zm1faG9zdC0+eGZlcl9tb2RlX3NoYWRvdyA9IHZhbDsKLQkJCXJldHVybjsKLQkJY2FzZSBTREhDSV9DT01NQU5EOgotCQkJd3JpdGVsKCh2YWwgPDwgMTYpIHwgcGx0Zm1faG9zdC0+eGZlcl9tb2RlX3NoYWRvdywKLQkJCQlob3N0LT5pb2FkZHIgKyBTREhDSV9UUkFOU0ZFUl9NT0RFKTsKLQkJCXJldHVybjsKLQkJfQorCXN3aXRjaCAocmVnKSB7CisJY2FzZSBTREhDSV9UUkFOU0ZFUl9NT0RFOgorCQkvKgorCQkgKiBQb3N0cG9uZSB0aGlzIHdyaXRlLCB3ZSBtdXN0IGRvIGl0IHRvZ2V0aGVyIHdpdGggYQorCQkgKiBjb21tYW5kIHdyaXRlIHRoYXQgaXMgZG93biBiZWxvdy4KKwkJICovCisJCXBsdGZtX2hvc3QtPnhmZXJfbW9kZV9zaGFkb3cgPSB2YWw7CisJCXJldHVybjsKKwljYXNlIFNESENJX0NPTU1BTkQ6CisJCXdyaXRlbCgodmFsIDw8IDE2KSB8IHBsdGZtX2hvc3QtPnhmZXJfbW9kZV9zaGFkb3csCisJCQlob3N0LT5pb2FkZHIgKyBTREhDSV9UUkFOU0ZFUl9NT0RFKTsKKwkJcmV0dXJuOwogCX0KIAogCXdyaXRldyh2YWwsIGhvc3QtPmlvYWRkciArIHJlZyk7CkBAIC0xNzMsNyArMTY3LDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RoY2lfb3BzIHRlZ3JhX3NkaGNpX29wcyA9IHsKIAkuZ2V0X3JvICAgICA9IHRlZ3JhX3NkaGNpX2dldF9ybywKIAkucmVhZF93ICAgICA9IHRlZ3JhX3NkaGNpX3JlYWR3LAotCS53cml0ZV93ICAgID0gdGVncmFfc2RoY2lfd3JpdGV3LAogCS53cml0ZV9sICAgID0gdGVncmFfc2RoY2lfd3JpdGVsLAogCS5zZXRfY2xvY2sgID0gc2RoY2lfc2V0X2Nsb2NrLAogCS5zZXRfYnVzX3dpZHRoID0gdGVncmFfc2RoY2lfc2V0X2J1c193aWR0aCwKQEAgLTIxNCw2ICsyMDcsMTggQEAKIAkJICAgIE5WUVVJUktfRElTQUJMRV9TRFIxMDQsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkaGNpX29wcyB0ZWdyYTExNF9zZGhjaV9vcHMgPSB7CisJLmdldF9ybyAgICAgPSB0ZWdyYV9zZGhjaV9nZXRfcm8sCisJLnJlYWRfdyAgICAgPSB0ZWdyYV9zZGhjaV9yZWFkdywKKwkud3JpdGVfdyAgICA9IHRlZ3JhX3NkaGNpX3dyaXRldywKKwkud3JpdGVfbCAgICA9IHRlZ3JhX3NkaGNpX3dyaXRlbCwKKwkuc2V0X2Nsb2NrICA9IHNkaGNpX3NldF9jbG9jaywKKwkuc2V0X2J1c193aWR0aCA9IHRlZ3JhX3NkaGNpX3NldF9idXNfd2lkdGgsCisJLnJlc2V0ICAgICAgPSB0ZWdyYV9zZGhjaV9yZXNldCwKKwkuc2V0X3Voc19zaWduYWxpbmcgPSBzZGhjaV9zZXRfdWhzX3NpZ25hbGluZywKKwkuZ2V0X21heF9jbG9jayA9IHNkaGNpX3BsdGZtX2Nsa19nZXRfbWF4X2Nsb2NrLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzZGhjaV9wbHRmbV9kYXRhIHNkaGNpX3RlZ3JhMTE0X3BkYXRhID0gewogCS5xdWlya3MgPSBTREhDSV9RVUlSS19CUk9LRU5fVElNRU9VVF9WQUwgfAogCQkgIFNESENJX1FVSVJLX0RBVEFfVElNRU9VVF9VU0VTX1NEQ0xLIHwKQEAgLTIyMSwxNSArMjI2LDE0IEBACiAJCSAgU0RIQ0lfUVVJUktfTk9fSElTUERfQklUIHwKIAkJICBTREhDSV9RVUlSS19CUk9LRU5fQURNQV9aRVJPTEVOX0RFU0MgfAogCQkgIFNESENJX1FVSVJLX0NBUF9DTE9DS19CQVNFX0JST0tFTiwKLQkub3BzICA9ICZ0ZWdyYV9zZGhjaV9vcHMsCisJLm9wcyAgPSAmdGVncmExMTRfc2RoY2lfb3BzLAogfTsKIAogc3RhdGljIHN0cnVjdCBzZGhjaV90ZWdyYV9zb2NfZGF0YSBzb2NfZGF0YV90ZWdyYTExNCA9IHsKIAkucGRhdGEgPSAmc2RoY2lfdGVncmExMTRfcGRhdGEsCiAJLm52cXVpcmtzID0gTlZRVUlSS19ESVNBQkxFX1NEUjUwIHwKIAkJICAgIE5WUVVJUktfRElTQUJMRV9ERFI1MCB8Ci0JCSAgICBOVlFVSVJLX0RJU0FCTEVfU0RSMTA0IHwKLQkJICAgIE5WUVVJUktfU0hBRE9XX1hGRVJfTU9ERV9SRUcsCisJCSAgICBOVlFVSVJLX0RJU0FCTEVfU0RSMTA0LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc2RoY2lfdGVncmFfZHRfbWF0Y2hbXSA9IHsKQEAgLTI0MSwxNyArMjQ1LDYgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBzZGhjaV90ZWdyYV9kdF9tYXRjaCk7CiAKLXN0YXRpYyBpbnQgc2RoY2lfdGVncmFfcGFyc2VfZHQoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7Ci0Jc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7Ci0Jc3RydWN0IHNkaGNpX3RlZ3JhICp0ZWdyYV9ob3N0ID0gcGx0Zm1faG9zdC0+cHJpdjsKLQotCXRlZ3JhX2hvc3QtPnBvd2VyX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgInBvd2VyLWdwaW9zIiwgMCk7Ci0JcmV0dXJuIG1tY19vZl9wYXJzZShob3N0LT5tbWMpOwotfQotCiBzdGF0aWMgaW50IHNkaGNpX3RlZ3JhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CkBAIC0yODEsMjEgKzI3NCwxOCBAQAogCXRlZ3JhX2hvc3QtPnNvY19kYXRhID0gc29jX2RhdGE7CiAJcGx0Zm1faG9zdC0+cHJpdiA9IHRlZ3JhX2hvc3Q7CiAKLQlyYyA9IHNkaGNpX3RlZ3JhX3BhcnNlX2R0KCZwZGV2LT5kZXYpOworCXJjID0gbW1jX29mX3BhcnNlKGhvc3QtPm1tYyk7CiAJaWYgKHJjKQogCQlnb3RvIGVycl9wYXJzZV9kdDsKIAotCWlmIChncGlvX2lzX3ZhbGlkKHRlZ3JhX2hvc3QtPnBvd2VyX2dwaW8pKSB7Ci0JCXJjID0gZ3Bpb19yZXF1ZXN0KHRlZ3JhX2hvc3QtPnBvd2VyX2dwaW8sICJzZGhjaV9wb3dlciIpOwotCQlpZiAocmMpIHsKLQkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLAotCQkJCSJmYWlsZWQgdG8gYWxsb2NhdGUgcG93ZXIgZ3Bpb1xuIik7Ci0JCQlnb3RvIGVycl9wb3dlcl9yZXE7Ci0JCX0KLQkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHRlZ3JhX2hvc3QtPnBvd2VyX2dwaW8sIDEpOworCXRlZ3JhX2hvc3QtPnBvd2VyX2dwaW8gPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbCgmcGRldi0+ZGV2LCAicG93ZXIiLAorCQkJCQkJCSBHUElPRF9PVVRfSElHSCk7CisJaWYgKElTX0VSUih0ZWdyYV9ob3N0LT5wb3dlcl9ncGlvKSkgeworCQlyYyA9IFBUUl9FUlIodGVncmFfaG9zdC0+cG93ZXJfZ3Bpbyk7CisJCWdvdG8gZXJyX3Bvd2VyX3JlcTsKIAl9CiAKLQljbGsgPSBjbGtfZ2V0KG1tY19kZXYoaG9zdC0+bW1jKSwgTlVMTCk7CisJY2xrID0gZGV2bV9jbGtfZ2V0KG1tY19kZXYoaG9zdC0+bW1jKSwgTlVMTCk7CiAJaWYgKElTX0VSUihjbGspKSB7CiAJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAiY2xrIGVyclxuIik7CiAJCXJjID0gUFRSX0VSUihjbGspOwpAQCAtMzEyLDEwICszMDIsNyBAQAogCiBlcnJfYWRkX2hvc3Q6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBsdGZtX2hvc3QtPmNsayk7Ci0JY2xrX3B1dChwbHRmbV9ob3N0LT5jbGspOwogZXJyX2Nsa19nZXQ6Ci0JaWYgKGdwaW9faXNfdmFsaWQodGVncmFfaG9zdC0+cG93ZXJfZ3BpbykpCi0JCWdwaW9fZnJlZSh0ZWdyYV9ob3N0LT5wb3dlcl9ncGlvKTsKIGVycl9wb3dlcl9yZXE6CiBlcnJfcGFyc2VfZHQ6CiBlcnJfYWxsb2NfdGVncmFfaG9zdDoKQEAgLTMyMywyNiArMzEwLDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQgc2RoY2lfdGVncmFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7Ci0Jc3RydWN0IHNkaGNpX3RlZ3JhICp0ZWdyYV9ob3N0ID0gcGx0Zm1faG9zdC0+cHJpdjsKLQlpbnQgZGVhZCA9IChyZWFkbChob3N0LT5pb2FkZHIgKyBTREhDSV9JTlRfU1RBVFVTKSA9PSAweGZmZmZmZmZmKTsKLQotCXNkaGNpX3JlbW92ZV9ob3N0KGhvc3QsIGRlYWQpOwotCi0JaWYgKGdwaW9faXNfdmFsaWQodGVncmFfaG9zdC0+cG93ZXJfZ3BpbykpCi0JCWdwaW9fZnJlZSh0ZWdyYV9ob3N0LT5wb3dlcl9ncGlvKTsKLQotCWNsa19kaXNhYmxlX3VucHJlcGFyZShwbHRmbV9ob3N0LT5jbGspOwotCWNsa19wdXQocGx0Zm1faG9zdC0+Y2xrKTsKLQotCXNkaGNpX3BsdGZtX2ZyZWUocGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RoY2lfdGVncmFfZHJpdmVyID0gewogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJzZGhjaS10ZWdyYSIsCkBAIC0zNTAsNyArMzE3LDcgQEAKIAkJLnBtCT0gU0RIQ0lfUExURk1fUE1PUFMsCiAJfSwKIAkucHJvYmUJCT0gc2RoY2lfdGVncmFfcHJvYmUsCi0JLnJlbW92ZQkJPSBzZGhjaV90ZWdyYV9yZW1vdmUsCisJLnJlbW92ZQkJPSBzZGhjaV9wbHRmbV91bnJlZ2lzdGVyLAogfTsKIAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzZGhjaV90ZWdyYV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCmluZGV4IDBhZDQxMmEuLmM4MDI4N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvbW1jLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3Nsb3QtZ3Bpby5oPgogCiAjaW5jbHVkZSAic2RoY2kuaCIKQEAgLTU2LDYgKzU3LDcgQEAKIHN0YXRpYyBpbnQgc2RoY2lfcHJlX2RtYV90cmFuc2ZlcihzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCwKIAkJCQkJc3RydWN0IG1tY19kYXRhICpkYXRhLAogCQkJCQlzdHJ1Y3Qgc2RoY2lfaG9zdF9uZXh0ICpuZXh0KTsKK3N0YXRpYyBpbnQgc2RoY2lfZG9fZ2V0X2NkKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KTsKIAogI2lmZGVmIENPTkZJR19QTQogc3RhdGljIGludCBzZGhjaV9ydW50aW1lX3BtX2dldChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CkBAIC05MzEsNyArOTMzLDggQEAKIAkJICogSWYgd2UgYXJlIHNlbmRpbmcgQ01EMjMsIENNRDEyIG5ldmVyIGdldHMgc2VudAogCQkgKiBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gKHNvIG5vIEF1dG8tQ01EMTIpLgogCQkgKi8KLQkJaWYgKCFob3N0LT5tcnEtPnNiYyAmJiAoaG9zdC0+ZmxhZ3MgJiBTREhDSV9BVVRPX0NNRDEyKSkKKwkJaWYgKCFob3N0LT5tcnEtPnNiYyAmJiAoaG9zdC0+ZmxhZ3MgJiBTREhDSV9BVVRPX0NNRDEyKSAmJgorCQkgICAgKGNtZC0+b3Bjb2RlICE9IFNEX0lPX1JXX0VYVEVOREVEKSkKIAkJCW1vZGUgfD0gU0RIQ0lfVFJOU19BVVRPX0NNRDEyOwogCQllbHNlIGlmIChob3N0LT5tcnEtPnNiYyAmJiAoaG9zdC0+ZmxhZ3MgJiBTREhDSV9BVVRPX0NNRDIzKSkgewogCQkJbW9kZSB8PSBTREhDSV9UUk5TX0FVVE9fQ01EMjM7CkBAIC0xMzU2LDcgKzEzNTksOCBAQAogCiAJc2RoY2lfcnVudGltZV9wbV9nZXQoaG9zdCk7CiAKLQlwcmVzZW50ID0gbW1jX2dwaW9fZ2V0X2NkKGhvc3QtPm1tYyk7CisJLyogRmlyc3RseSBjaGVjayBjYXJkIHByZXNlbmNlICovCisJcHJlc2VudCA9IHNkaGNpX2RvX2dldF9jZChob3N0KTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAKQEAgLTEzNzksMjIgKzEzODMsNiBAQAogCiAJaG9zdC0+bXJxID0gbXJxOwogCi0JLyoKLQkgKiBGaXJzdGx5IGNoZWNrIGNhcmQgcHJlc2VuY2UgZnJvbSBjZC1ncGlvLiAgVGhlIHJldHVybiBjb3VsZAotCSAqIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvc3NpYmlsaXRpZXM6Ci0JICogICAgIG5lZ2F0aXZlOiBjZC1ncGlvIGlzIG5vdCBhdmFpbGFibGUKLQkgKiAgICAgemVybzogY2QtZ3BpbyBpcyB1c2VkLCBhbmQgY2FyZCBpcyByZW1vdmVkCi0JICogICAgIG9uZTogY2QtZ3BpbyBpcyB1c2VkLCBhbmQgY2FyZCBpcyBwcmVzZW50Ci0JICovCi0JaWYgKHByZXNlbnQgPCAwKSB7Ci0JCS8qIElmIHBvbGxpbmcsIGFzc3VtZSB0aGF0IHRoZSBjYXJkIGlzIGFsd2F5cyBwcmVzZW50LiAqLwotCQlpZiAoaG9zdC0+cXVpcmtzICYgU0RIQ0lfUVVJUktfQlJPS0VOX0NBUkRfREVURUNUSU9OKQotCQkJcHJlc2VudCA9IDE7Ci0JCWVsc2UKLQkJCXByZXNlbnQgPSBzZGhjaV9yZWFkbChob3N0LCBTREhDSV9QUkVTRU5UX1NUQVRFKSAmCi0JCQkJCVNESENJX0NBUkRfUFJFU0VOVDsKLQl9Ci0KIAlpZiAoIXByZXNlbnQgfHwgaG9zdC0+ZmxhZ3MgJiBTREhDSV9ERVZJQ0VfREVBRCkgewogCQlob3N0LT5tcnEtPmNtZC0+ZXJyb3IgPSAtRU5PTUVESVVNOwogCQl0YXNrbGV0X3NjaGVkdWxlKCZob3N0LT5maW5pc2hfdGFza2xldCk7CkBAIC0zMTY0LDcgKzMxNTIsOCBAQAogCS8qIEF1dG8tQ01EMjMgc3R1ZmYgb25seSB3b3JrcyBpbiBBRE1BIG9yIFBJTy4gKi8KIAlpZiAoKGhvc3QtPnZlcnNpb24gPj0gU0RIQ0lfU1BFQ18zMDApICYmCiAJICAgICgoaG9zdC0+ZmxhZ3MgJiBTREhDSV9VU0VfQURNQSkgfHwKLQkgICAgICEoaG9zdC0+ZmxhZ3MgJiBTREhDSV9VU0VfU0RNQSkpKSB7CisJICAgICAhKGhvc3QtPmZsYWdzICYgU0RIQ0lfVVNFX1NETUEpKSAmJgorCSAgICAgIShob3N0LT5xdWlya3MyICYgU0RIQ0lfUVVJUksyX0FDTUQyM19CUk9LRU4pKSB7CiAJCWhvc3QtPmZsYWdzIHw9IFNESENJX0FVVE9fQ01EMjM7CiAJCURCRygiJXM6IEF1dG8tQ01EMjMgYXZhaWxhYmxlXG4iLCBtbWNfaG9zdG5hbWUobW1jKSk7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaCBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaAppbmRleCAwMzE1ZTE4Li5lNjM5YjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCi0jaW5jbHVkZSA8bGludXgvbW1jL3NkaGNpLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KIAogLyoKICAqIENvbnRyb2xsZXIgcmVnaXN0ZXJzCkBAIC0zMDksNiArMzA5LDIwNyBAQAogICovCiAjZGVmaW5lIFNESENJX01BWF9TRUdTCQkxMjgKIAorc3RydWN0IHNkaGNpX2hvc3RfbmV4dCB7CisJdW5zaWduZWQgaW50CXNnX2NvdW50OworCXMzMgkJY29va2llOworfTsKKworc3RydWN0IHNkaGNpX2hvc3QgeworCS8qIERhdGEgc2V0IGJ5IGhhcmR3YXJlIGludGVyZmFjZSBkcml2ZXIgKi8KKwljb25zdCBjaGFyICpod19uYW1lOwkvKiBIYXJkd2FyZSBidXMgbmFtZSAqLworCisJdW5zaWduZWQgaW50IHF1aXJrczsJLyogRGV2aWF0aW9ucyBmcm9tIHNwZWMuICovCisKKy8qIENvbnRyb2xsZXIgZG9lc24ndCBob25vciByZXNldHMgdW5sZXNzIHdlIHRvdWNoIHRoZSBjbG9jayByZWdpc3RlciAqLworI2RlZmluZSBTREhDSV9RVUlSS19DTE9DS19CRUZPUkVfUkVTRVQJCQkoMTw8MCkKKy8qIENvbnRyb2xsZXIgaGFzIGJhZCBjYXBzIGJpdHMsIGJ1dCByZWFsbHkgc3VwcG9ydHMgRE1BICovCisjZGVmaW5lIFNESENJX1FVSVJLX0ZPUkNFX0RNQQkJCQkoMTw8MSkKKy8qIENvbnRyb2xsZXIgZG9lc24ndCBsaWtlIHRvIGJlIHJlc2V0IHdoZW4gdGhlcmUgaXMgbm8gY2FyZCBpbnNlcnRlZC4gKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfTk9fQ0FSRF9OT19SRVNFVAkJCSgxPDwyKQorLyogQ29udHJvbGxlciBkb2Vzbid0IGxpa2UgY2xlYXJpbmcgdGhlIHBvd2VyIHJlZyBiZWZvcmUgYSBjaGFuZ2UgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfU0lOR0xFX1BPV0VSX1dSSVRFCQkJKDE8PDMpCisvKiBDb250cm9sbGVyIGhhcyBmbGFreSBpbnRlcm5hbCBzdGF0ZSBzbyByZXNldCBpdCBvbiBlYWNoIGlvcyBjaGFuZ2UgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfUkVTRVRfQ01EX0RBVEFfT05fSU9TCQkoMTw8NCkKKy8qIENvbnRyb2xsZXIgaGFzIGFuIHVudXNhYmxlIERNQSBlbmdpbmUgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfQlJPS0VOX0RNQQkJCQkoMTw8NSkKKy8qIENvbnRyb2xsZXIgaGFzIGFuIHVudXNhYmxlIEFETUEgZW5naW5lICovCisjZGVmaW5lIFNESENJX1FVSVJLX0JST0tFTl9BRE1BCQkJCSgxPDw2KQorLyogQ29udHJvbGxlciBjYW4gb25seSBETUEgZnJvbSAzMi1iaXQgYWxpZ25lZCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfMzJCSVRfRE1BX0FERFIJCQkoMTw8NykKKy8qIENvbnRyb2xsZXIgY2FuIG9ubHkgRE1BIGNodW5rIHNpemVzIHRoYXQgYXJlIGEgbXVsdGlwbGUgb2YgMzIgYml0cyAqLworI2RlZmluZSBTREhDSV9RVUlSS18zMkJJVF9ETUFfU0laRQkJCSgxPDw4KQorLyogQ29udHJvbGxlciBjYW4gb25seSBBRE1BIGNodW5rcyB0aGF0IGFyZSBhIG11bHRpcGxlIG9mIDMyIGJpdHMgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfMzJCSVRfQURNQV9TSVpFCQkJKDE8PDkpCisvKiBDb250cm9sbGVyIG5lZWRzIHRvIGJlIHJlc2V0IGFmdGVyIGVhY2ggcmVxdWVzdCB0byBzdGF5IHN0YWJsZSAqLworI2RlZmluZSBTREhDSV9RVUlSS19SRVNFVF9BRlRFUl9SRVFVRVNUCQkJKDE8PDEwKQorLyogQ29udHJvbGxlciBuZWVkcyB2b2x0YWdlIGFuZCBwb3dlciB3cml0ZXMgdG8gaGFwcGVuIHNlcGFyYXRlbHkgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfTk9fU0lNVUxUX1ZERF9BTkRfUE9XRVIJCSgxPDwxMSkKKy8qIENvbnRyb2xsZXIgcHJvdmlkZXMgYW4gaW5jb3JyZWN0IHRpbWVvdXQgdmFsdWUgZm9yIHRyYW5zZmVycyAqLworI2RlZmluZSBTREhDSV9RVUlSS19CUk9LRU5fVElNRU9VVF9WQUwJCQkoMTw8MTIpCisvKiBDb250cm9sbGVyIGhhcyBhbiBpc3N1ZSB3aXRoIGJ1ZmZlciBiaXRzIGZvciBzbWFsbCB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfQlJPS0VOX1NNQUxMX1BJTwkJCSgxPDwxMykKKy8qIENvbnRyb2xsZXIgZG9lcyBub3QgcHJvdmlkZSB0cmFuc2Zlci1jb21wbGV0ZSBpbnRlcnJ1cHQgd2hlbiBub3QgYnVzeSAqLworI2RlZmluZSBTREhDSV9RVUlSS19OT19CVVNZX0lSUQkJCQkoMTw8MTQpCisvKiBDb250cm9sbGVyIGhhcyB1bnJlbGlhYmxlIGNhcmQgZGV0ZWN0aW9uICovCisjZGVmaW5lIFNESENJX1FVSVJLX0JST0tFTl9DQVJEX0RFVEVDVElPTgkJKDE8PDE1KQorLyogQ29udHJvbGxlciByZXBvcnRzIGludmVydGVkIHdyaXRlLXByb3RlY3Qgc3RhdGUgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfSU5WRVJURURfV1JJVEVfUFJPVEVDVAkJKDE8PDE2KQorLyogQ29udHJvbGxlciBkb2VzIG5vdCBsaWtlIGZhc3QgUElPIHRyYW5zZmVycyAqLworI2RlZmluZSBTREhDSV9RVUlSS19QSU9fTkVFRFNfREVMQVkJCQkoMTw8MTgpCisvKiBDb250cm9sbGVyIGhhcyB0byBiZSBmb3JjZWQgdG8gdXNlIGJsb2NrIHNpemUgb2YgMjA0OCBieXRlcyAqLworI2RlZmluZSBTREhDSV9RVUlSS19GT1JDRV9CTEtfU1pfMjA0OAkJCSgxPDwyMCkKKy8qIENvbnRyb2xsZXIgY2Fubm90IGRvIG11bHRpLWJsb2NrIHRyYW5zZmVycyAqLworI2RlZmluZSBTREhDSV9RVUlSS19OT19NVUxUSUJMT0NLCQkJKDE8PDIxKQorLyogQ29udHJvbGxlciBjYW4gb25seSBoYW5kbGUgMS1iaXQgZGF0YSB0cmFuc2ZlcnMgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfRk9SQ0VfMV9CSVRfREFUQQkJCSgxPDwyMikKKy8qIENvbnRyb2xsZXIgbmVlZHMgMTBtcyBkZWxheSBiZXR3ZWVuIGFwcGx5aW5nIHBvd2VyIGFuZCBjbG9jayAqLworI2RlZmluZSBTREhDSV9RVUlSS19ERUxBWV9BRlRFUl9QT1dFUgkJCSgxPDwyMykKKy8qIENvbnRyb2xsZXIgdXNlcyBTRENMSyBpbnN0ZWFkIG9mIFRNQ0xLIGZvciBkYXRhIHRpbWVvdXRzICovCisjZGVmaW5lIFNESENJX1FVSVJLX0RBVEFfVElNRU9VVF9VU0VTX1NEQ0xLCQkoMTw8MjQpCisvKiBDb250cm9sbGVyIHJlcG9ydHMgd3JvbmcgYmFzZSBjbG9jayBjYXBhYmlsaXR5ICovCisjZGVmaW5lIFNESENJX1FVSVJLX0NBUF9DTE9DS19CQVNFX0JST0tFTgkJKDE8PDI1KQorLyogQ29udHJvbGxlciBjYW5ub3Qgc3VwcG9ydCBFbmQgQXR0cmlidXRlIGluIE5PUCBBRE1BIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfTk9fRU5EQVRUUl9JTl9OT1BERVNDCQkoMTw8MjYpCisvKiBDb250cm9sbGVyIGlzIG1pc3NpbmcgZGV2aWNlIGNhcHMuIFVzZSBjYXBzIHByb3ZpZGVkIGJ5IGhvc3QgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfTUlTU0lOR19DQVBTCQkJKDE8PDI3KQorLyogQ29udHJvbGxlciB1c2VzIEF1dG8gQ01EMTIgY29tbWFuZCB0byBzdG9wIHRoZSB0cmFuc2ZlciAqLworI2RlZmluZSBTREhDSV9RVUlSS19NVUxUSUJMT0NLX1JFQURfQUNNRDEyCQkoMTw8MjgpCisvKiBDb250cm9sbGVyIGRvZXNuJ3QgaGF2ZSBISVNQRCBiaXQgZmllbGQgaW4gSEktU1BFRUQgU0QgY2FyZCAqLworI2RlZmluZSBTREhDSV9RVUlSS19OT19ISVNQRF9CSVQJCQkoMTw8MjkpCisvKiBDb250cm9sbGVyIHRyZWF0cyBBRE1BIGRlc2NyaXB0b3JzIHdpdGggbGVuZ3RoIDAwMDBoIGluY29ycmVjdGx5ICovCisjZGVmaW5lIFNESENJX1FVSVJLX0JST0tFTl9BRE1BX1pFUk9MRU5fREVTQwkJKDE8PDMwKQorLyogVGhlIHJlYWQtb25seSBkZXRlY3Rpb24gdmlhIFNESENJX1BSRVNFTlRfU1RBVEUgcmVnaXN0ZXIgaXMgdW5zdGFibGUgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUktfVU5TVEFCTEVfUk9fREVURUNUCQkJKDE8PDMxKQorCisJdW5zaWduZWQgaW50IHF1aXJrczI7CS8qIE1vcmUgZGV2aWF0aW9ucyBmcm9tIHNwZWMuICovCisKKyNkZWZpbmUgU0RIQ0lfUVVJUksyX0hPU1RfT0ZGX0NBUkRfT04JCQkoMTw8MCkKKyNkZWZpbmUgU0RIQ0lfUVVJUksyX0hPU1RfTk9fQ01EMjMJCQkoMTw8MSkKKy8qIFRoZSBzeXN0ZW0gcGh5c2ljYWxseSBkb2Vzbid0IHN1cHBvcnQgMS44diwgZXZlbiBpZiB0aGUgaG9zdCBkb2VzICovCisjZGVmaW5lIFNESENJX1FVSVJLMl9OT18xXzhfVgkJCQkoMTw8MikKKyNkZWZpbmUgU0RIQ0lfUVVJUksyX1BSRVNFVF9WQUxVRV9CUk9LRU4JCSgxPDwzKQorI2RlZmluZSBTREhDSV9RVUlSSzJfQ0FSRF9PTl9ORUVEU19CVVNfT04JCSgxPDw0KQorLyogQ29udHJvbGxlciBoYXMgYSBub24tc3RhbmRhcmQgaG9zdCBjb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFNESENJX1FVSVJLMl9CUk9LRU5fSE9TVF9DT05UUk9MCQkoMTw8NSkKKy8qIENvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBIUzIwMCAqLworI2RlZmluZSBTREhDSV9RVUlSSzJfQlJPS0VOX0hTMjAwCQkJKDE8PDYpCisvKiBDb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgRERSNTAgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUksyX0JST0tFTl9ERFI1MAkJCSgxPDw3KQorLyogU3RvcCBjb21tYW5kIChDTUQxMikgY2FuIHNldCBUcmFuc2ZlciBDb21wbGV0ZSB3aGVuIG5vdCB1c2luZyBNTUNfUlNQX0JVU1kgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUksyX1NUT1BfV0lUSF9UQwkJCSgxPDw4KQorLyogQ29udHJvbGxlciBkb2VzIG5vdCBzdXBwb3J0IDY0LWJpdCBETUEgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUksyX0JST0tFTl82NF9CSVRfRE1BCQkJKDE8PDkpCisvKiBuZWVkIGNsZWFyIHRyYW5zZmVyIG1vZGUgcmVnaXN0ZXIgYmVmb3JlIHNlbmQgY21kICovCisjZGVmaW5lIFNESENJX1FVSVJLMl9DTEVBUl9UUkFOU0ZFUk1PREVfUkVHX0JFRk9SRV9DTUQJKDE8PDEwKQorLyogQ2FwYWJpbGl0eSByZWdpc3RlciBiaXQtNjMgaW5kaWNhdGVzIEhTNDAwIHN1cHBvcnQgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUksyX0NBUFNfQklUNjNfRk9SX0hTNDAwCQkoMTw8MTEpCisvKiBmb3JjZWQgdHVuZWQgY2xvY2sgKi8KKyNkZWZpbmUgU0RIQ0lfUVVJUksyX1RVTklOR19XT1JLX0FST1VORAkJCSgxPDwxMikKKy8qIGRpc2FibGUgdGhlIGJsb2NrIGNvdW50IGZvciBzaW5nbGUgYmxvY2sgdHJhbnNhY3Rpb25zICovCisjZGVmaW5lIFNESENJX1FVSVJLMl9TVVBQT1JUX1NJTkdMRQkJCSgxPDwxMykKKy8qIENvbnRyb2xsZXIgYnJva2VuIHdpdGggdXNpbmcgQUNNRDIzICovCisjZGVmaW5lIFNESENJX1FVSVJLMl9BQ01EMjNfQlJPS0VOCQkJKDE8PDE0KQorCisJaW50IGlycTsJCS8qIERldmljZSBJUlEgKi8KKwl2b2lkIF9faW9tZW0gKmlvYWRkcjsJLyogTWFwcGVkIGFkZHJlc3MgKi8KKworCWNvbnN0IHN0cnVjdCBzZGhjaV9vcHMgKm9wczsJLyogTG93IGxldmVsIGh3IGludGVyZmFjZSAqLworCisJLyogSW50ZXJuYWwgZGF0YSAqLworCXN0cnVjdCBtbWNfaG9zdCAqbW1jOwkvKiBNTUMgc3RydWN0dXJlICovCisJdTY0IGRtYV9tYXNrOwkJLyogY3VzdG9tIERNQSBtYXNrICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19MRURTX0NMQVNTKSB8fCBkZWZpbmVkKENPTkZJR19MRURTX0NMQVNTX01PRFVMRSkKKwlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGxlZDsJLyogTEVEIGNvbnRyb2wgKi8KKwljaGFyIGxlZF9uYW1lWzMyXTsKKyNlbmRpZgorCisJc3BpbmxvY2tfdCBsb2NrOwkvKiBNdXRleCAqLworCisJaW50IGZsYWdzOwkJLyogSG9zdCBhdHRyaWJ1dGVzICovCisjZGVmaW5lIFNESENJX1VTRV9TRE1BCQkoMTw8MCkJLyogSG9zdCBpcyBTRE1BIGNhcGFibGUgKi8KKyNkZWZpbmUgU0RIQ0lfVVNFX0FETUEJCSgxPDwxKQkvKiBIb3N0IGlzIEFETUEgY2FwYWJsZSAqLworI2RlZmluZSBTREhDSV9SRVFfVVNFX0RNQQkoMTw8MikJLyogVXNlIERNQSBmb3IgdGhpcyByZXEuICovCisjZGVmaW5lIFNESENJX0RFVklDRV9ERUFECSgxPDwzKQkvKiBEZXZpY2UgdW5yZXNwb25zaXZlICovCisjZGVmaW5lIFNESENJX1NEUjUwX05FRURTX1RVTklORyAoMTw8NCkJLyogU0RSNTAgbmVlZHMgdHVuaW5nICovCisjZGVmaW5lIFNESENJX05FRURTX1JFVFVOSU5HCSgxPDw1KQkvKiBIb3N0IG5lZWRzIHJldHVuaW5nICovCisjZGVmaW5lIFNESENJX0FVVE9fQ01EMTIJKDE8PDYpCS8qIEF1dG8gQ01EMTIgc3VwcG9ydCAqLworI2RlZmluZSBTREhDSV9BVVRPX0NNRDIzCSgxPDw3KQkvKiBBdXRvIENNRDIzIHN1cHBvcnQgKi8KKyNkZWZpbmUgU0RIQ0lfUFZfRU5BQkxFRAkoMTw8OCkJLyogUHJlc2V0IHZhbHVlIGVuYWJsZWQgKi8KKyNkZWZpbmUgU0RIQ0lfU0RJT19JUlFfRU5BQkxFRAkoMTw8OSkJLyogU0RJTyBpcnEgZW5hYmxlZCAqLworI2RlZmluZSBTREhDSV9TRFIxMDRfTkVFRFNfVFVOSU5HICgxPDwxMCkJLyogU0RSMTA0L0hTMjAwIG5lZWRzIHR1bmluZyAqLworI2RlZmluZSBTREhDSV9VU0lOR19SRVRVTklOR19USU1FUiAoMTw8MTEpCS8qIEhvc3QgaXMgdXNpbmcgYSByZXR1bmluZyB0aW1lciBmb3IgdGhlIGNhcmQgKi8KKyNkZWZpbmUgU0RIQ0lfVVNFXzY0X0JJVF9ETUEJKDE8PDEyKQkvKiBVc2UgNjQtYml0IERNQSAqLworI2RlZmluZSBTREhDSV9IUzQwMF9UVU5JTkcJKDE8PDEzKQkvKiBUdW5pbmcgZm9yIEhTNDAwICovCisKKwl1bnNpZ25lZCBpbnQgdmVyc2lvbjsJLyogU0RIQ0kgc3BlYy4gdmVyc2lvbiAqLworCisJdW5zaWduZWQgaW50IG1heF9jbGs7CS8qIE1heCBwb3NzaWJsZSBmcmVxIChNSHopICovCisJdW5zaWduZWQgaW50IHRpbWVvdXRfY2xrOwkvKiBUaW1lb3V0IGZyZXEgKEtIeikgKi8KKwl1bnNpZ25lZCBpbnQgY2xrX211bDsJLyogQ2xvY2sgTXVsaXBsaWVyIHZhbHVlICovCisKKwl1bnNpZ25lZCBpbnQgY2xvY2s7CS8qIEN1cnJlbnQgY2xvY2sgKE1IeikgKi8KKwl1OCBwd3I7CQkJLyogQ3VycmVudCB2b2x0YWdlICovCisKKwlib29sIHJ1bnRpbWVfc3VzcGVuZGVkOwkvKiBIb3N0IGlzIHJ1bnRpbWUgc3VzcGVuZGVkICovCisJYm9vbCBidXNfb247CQkvKiBCdXMgcG93ZXIgcHJldmVudHMgcnVudGltZSBzdXNwZW5kICovCisJYm9vbCBwcmVzZXRfZW5hYmxlZDsJLyogUHJlc2V0IGlzIGVuYWJsZWQgKi8KKworCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxOwkvKiBDdXJyZW50IHJlcXVlc3QgKi8KKwlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZDsJLyogQ3VycmVudCBjb21tYW5kICovCisJc3RydWN0IG1tY19kYXRhICpkYXRhOwkvKiBDdXJyZW50IGRhdGEgcmVxdWVzdCAqLworCXVuc2lnbmVkIGludCBkYXRhX2Vhcmx5OjE7CS8qIERhdGEgZmluaXNoZWQgYmVmb3JlIGNtZCAqLworCXVuc2lnbmVkIGludCBidXN5X2hhbmRsZToxOwkvKiBIYW5kbGluZyB0aGUgb3JkZXIgb2YgQnVzeS1lbmQgKi8KKworCXN0cnVjdCBzZ19tYXBwaW5nX2l0ZXIgc2dfbWl0ZXI7CS8qIFNHIHN0YXRlIGZvciBQSU8gKi8KKwl1bnNpZ25lZCBpbnQgYmxvY2tzOwkvKiByZW1haW5pbmcgUElPIGJsb2NrcyAqLworCisJaW50IHNnX2NvdW50OwkJLyogTWFwcGVkIHNnIGVudHJpZXMgKi8KKworCXZvaWQgKmFkbWFfdGFibGU7CS8qIEFETUEgZGVzY3JpcHRvciB0YWJsZSAqLworCXZvaWQgKmFsaWduX2J1ZmZlcjsJLyogQm91bmNlIGJ1ZmZlciAqLworCisJc2l6ZV90IGFkbWFfdGFibGVfc3o7CS8qIEFETUEgZGVzY3JpcHRvciB0YWJsZSBzaXplICovCisJc2l6ZV90IGFsaWduX2J1ZmZlcl9zejsJLyogQm91bmNlIGJ1ZmZlciBzaXplICovCisKKwlkbWFfYWRkcl90IGFkbWFfYWRkcjsJLyogTWFwcGVkIEFETUEgZGVzY3IuIHRhYmxlICovCisJZG1hX2FkZHJfdCBhbGlnbl9hZGRyOwkvKiBNYXBwZWQgYm91bmNlIGJ1ZmZlciAqLworCisJdW5zaWduZWQgaW50IGRlc2Nfc3o7CS8qIEFETUEgZGVzY3JpcHRvciBzaXplICovCisJdW5zaWduZWQgaW50IGFsaWduX3N6OwkvKiBBRE1BIGFsaWdubWVudCAqLworCXVuc2lnbmVkIGludCBhbGlnbl9tYXNrOwkvKiBBRE1BIGFsaWdubWVudCBtYXNrICovCisKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgZmluaXNoX3Rhc2tsZXQ7CS8qIFRhc2tsZXQgc3RydWN0dXJlcyAqLworCisJc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIFRpbWVyIGZvciB0aW1lb3V0cyAqLworCisJdTMyIGNhcHM7CQkvKiBBbHRlcm5hdGl2ZSBDQVBBQklMSVRZXzAgKi8KKwl1MzIgY2FwczE7CQkvKiBBbHRlcm5hdGl2ZSBDQVBBQklMSVRZXzEgKi8KKworCXVuc2lnbmVkIGludCAgICAgICAgICAgIG9jcl9hdmFpbF9zZGlvOwkvKiBPQ1IgYml0IG1hc2tzICovCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgb2NyX2F2YWlsX3NkOworCXVuc2lnbmVkIGludCAgICAgICAgICAgIG9jcl9hdmFpbF9tbWM7CisJdTMyIG9jcl9tYXNrOwkJLyogYXZhaWxhYmxlIHZvbHRhZ2VzICovCisKKwl1bnNpZ25lZAkJdGltaW5nOwkJLyogQ3VycmVudCB0aW1pbmcgKi8KKworCXUzMgkJCXRocmVhZF9pc3I7CisKKwkvKiBjYWNoZWQgcmVnaXN0ZXJzICovCisJdTMyCQkJaWVyOworCisJd2FpdF9xdWV1ZV9oZWFkX3QJYnVmX3JlYWR5X2ludDsJLyogV2FpdHF1ZXVlIGZvciBCdWZmZXIgUmVhZCBSZWFkeSBpbnRlcnJ1cHQgKi8KKwl1bnNpZ25lZCBpbnQJCXR1bmluZ19kb25lOwkvKiBDb25kaXRpb24gZmxhZyBzZXQgd2hlbiBDTUQxOSBzdWNjZWVkcyAqLworCisJdW5zaWduZWQgaW50CQl0dW5pbmdfY291bnQ7CS8qIFRpbWVyIGNvdW50IGZvciByZS10dW5pbmcgKi8KKwl1bnNpZ25lZCBpbnQJCXR1bmluZ19tb2RlOwkvKiBSZS10dW5pbmcgbW9kZSBzdXBwb3J0ZWQgYnkgaG9zdCAqLworI2RlZmluZSBTREhDSV9UVU5JTkdfTU9ERV8xCTAKKwlzdHJ1Y3QgdGltZXJfbGlzdAl0dW5pbmdfdGltZXI7CS8qIFRpbWVyIGZvciB0dW5pbmcgKi8KKworCXN0cnVjdCBzZGhjaV9ob3N0X25leHQJbmV4dF9kYXRhOworCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZVswXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7Cit9OworCiBzdHJ1Y3Qgc2RoY2lfb3BzIHsKICNpZmRlZiBDT05GSUdfTU1DX1NESENJX0lPX0FDQ0VTU09SUwogCXUzMgkJKCpyZWFkX2wpKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCBpbnQgcmVnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW1jaWYuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW1jaWYuYwppbmRleCA3ZDlkNmEzLi4wNzJmNjcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NoX21tY2lmLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zaF9tbWNpZi5jCkBAIC04NzUsNiArODc1LDcgQEAKIAlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZCA9IG1ycS0+Y21kOwogCXUzMiBvcGMgPSBjbWQtPm9wY29kZTsKIAl1MzIgbWFzazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3dpdGNoIChvcGMpIHsKIAkvKiByZXNwb25zZSBidXN5IGNoZWNrICovCkBAIC05MDksMTAgKzkxMCwxMiBAQAogCS8qIHNldCBhcmcgKi8KIAlzaF9tbWNpZl93cml0ZWwoaG9zdC0+YWRkciwgTU1DSUZfQ0VfQVJHLCBjbWQtPmFyZyk7CiAJLyogc2V0IGNtZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CiAJc2hfbW1jaWZfd3JpdGVsKGhvc3QtPmFkZHIsIE1NQ0lGX0NFX0NNRF9TRVQsIG9wYyk7CiAKIAlob3N0LT53YWl0X2ZvciA9IE1NQ0lGX1dBSVRfRk9SX0NNRDsKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmhvc3QtPnRpbWVvdXRfd29yaywgaG9zdC0+dGltZW91dCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBzaF9tbWNpZl9zdG9wX2NtZChzdHJ1Y3Qgc2hfbW1jaWZfaG9zdCAqaG9zdCwKQEAgLTExNzEsNiArMTE3NCwxMiBAQAogCXN0cnVjdCBzaF9tbWNpZl9ob3N0ICpob3N0ID0gZGV2X2lkOwogCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxOwogCWJvb2wgd2FpdCA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdhaXRfd29yazsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7CisJd2FpdF93b3JrID0gaG9zdC0+d2FpdF9mb3I7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZob3N0LT50aW1lb3V0X3dvcmspOwogCkBAIC0xMTg4LDcgKzExOTcsNyBAQAogCSAqIEFsbCBoYW5kbGVycyByZXR1cm4gdHJ1ZSwgaWYgcHJvY2Vzc2luZyBjb250aW51ZXMsIGFuZCBmYWxzZSwgaWYgdGhlCiAJICogcmVxdWVzdCBoYXMgdG8gYmUgY29tcGxldGVkIC0gc3VjY2Vzc2Z1bGx5IG9yIG5vdAogCSAqLwotCXN3aXRjaCAoaG9zdC0+d2FpdF9mb3IpIHsKKwlzd2l0Y2ggKHdhaXRfd29yaykgewogCWNhc2UgTU1DSUZfV0FJVF9GT1JfUkVRVUVTVDoKIAkJLyogV2UncmUgdG9vIGxhdGUsIHRoZSB0aW1lb3V0IGhhcyBhbHJlYWR5IGtpY2tlZCBpbiAqLwogCQltdXRleF91bmxvY2soJmhvc3QtPnRocmVhZF9sb2NrKTsKQEAgLTEzMTIsMTUgKzEzMjEsMTUgQEAKIAkJLyogRG9uJ3QgcnVuIGFmdGVyIG1tY19yZW1vdmVfaG9zdCgpICovCiAJCXJldHVybjsKIAotCWRldl9lcnIoJmhvc3QtPnBkLT5kZXYsICJUaW1lb3V0IHdhaXRpbmcgZm9yICV1IG9uIENNRCV1XG4iLAotCQlob3N0LT53YWl0X2ZvciwgbXJxLT5jbWQtPm9wY29kZSk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCWlmIChob3N0LT5zdGF0ZSA9PSBTVEFURV9JRExFKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhvc3QtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KIAorCWRldl9lcnIoJmhvc3QtPnBkLT5kZXYsICJUaW1lb3V0IHdhaXRpbmcgZm9yICV1IG9uIENNRCV1XG4iLAorCQlob3N0LT53YWl0X2ZvciwgbXJxLT5jbWQtPm9wY29kZSk7CisKIAlob3N0LT5zdGF0ZSA9IFNUQVRFX1RJTUVPVVQ7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaG9zdC0+bG9jaywgZmxhZ3MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3N1bnhpLW1tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9zdW54aS1tbWMuYwppbmRleCBlOGE0MjE4Li40ZDNlMWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3N1bnhpLW1tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc3VueGktbW1jLmMKQEAgLTI5Myw3ICsyOTMsNyBAQAogCQkJCSAgICBzdHJ1Y3QgbW1jX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IHN1bnhpX2lkbWFfZGVzICpwZGVzID0gKHN0cnVjdCBzdW54aV9pZG1hX2RlcyAqKWhvc3QtPnNnX2NwdTsKLQlzdHJ1Y3Qgc3VueGlfaWRtYV9kZXMgKnBkZXNfcGEgPSAoc3RydWN0IHN1bnhpX2lkbWFfZGVzICopaG9zdC0+c2dfZG1hOworCWRtYV9hZGRyX3QgbmV4dF9kZXNjID0gaG9zdC0+c2dfZG1hOwogCWludCBpLCBtYXhfbGVuID0gKDEgPDwgaG9zdC0+aWRtYV9kZXNfc2l6ZV9iaXRzKTsKIAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT5zZ19sZW47IGkrKykgewpAQCAtMzA1LDggKzMwNSw5IEBACiAJCWVsc2UKIAkJCXBkZXNbaV0uYnVmX3NpemUgPSBkYXRhLT5zZ1tpXS5sZW5ndGg7CiAKKwkJbmV4dF9kZXNjICs9IHNpemVvZihzdHJ1Y3Qgc3VueGlfaWRtYV9kZXMpOwogCQlwZGVzW2ldLmJ1Zl9hZGRyX3B0cjEgPSBzZ19kbWFfYWRkcmVzcygmZGF0YS0+c2dbaV0pOwotCQlwZGVzW2ldLmJ1Zl9hZGRyX3B0cjIgPSAodTMyKSZwZGVzX3BhW2kgKyAxXTsKKwkJcGRlc1tpXS5idWZfYWRkcl9wdHIyID0gKHUzMiluZXh0X2Rlc2M7CiAJfQogCiAJcGRlc1swXS5jb25maWcgfD0gU0RYQ19JRE1BQ19ERVMwX0ZEOwpAQCAtOTMwLDcgKzkzMSw5IEBACiAJCXJldHVybiBQVFJfRVJSKGhvc3QtPmNsa19zYW1wbGUpOwogCX0KIAotCWhvc3QtPnJlc2V0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldCgmcGRldi0+ZGV2LCAiYWhiIik7CisJaG9zdC0+cmVzZXQgPSBkZXZtX3Jlc2V0X2NvbnRyb2xfZ2V0X29wdGlvbmFsKCZwZGV2LT5kZXYsICJhaGIiKTsKKwlpZiAoUFRSX0VSUihob3N0LT5yZXNldCkgPT0gLUVQUk9CRV9ERUZFUikKKwkJcmV0dXJuIFBUUl9FUlIoaG9zdC0+cmVzZXQpOwogCiAJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGhvc3QtPmNsa19haGIpOwogCWlmIChyZXQpIHsKQEAgLTEwMjgsNyArMTAzMSw3IEBACiAJbW1jLT5mX21pbgkJPSAgIDQwMDAwMDsKIAltbWMtPmZfbWF4CQk9IDUwMDAwMDAwOwogCW1tYy0+Y2FwcwkgICAgICAgfD0gTU1DX0NBUF9NTUNfSElHSFNQRUVEIHwgTU1DX0NBUF9TRF9ISUdIU1BFRUQgfAotCQkJCSAgTU1DX0NBUF9FUkFTRTsKKwkJCQkgIE1NQ19DQVBfRVJBU0UgfCBNTUNfQ0FQX1NESU9fSVJROwogCiAJcmV0ID0gbW1jX29mX3BhcnNlKG1tYyk7CiAJaWYgKHJldCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMgYi9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jCmluZGV4IGEzMWMzNTcuLmRiYTdlMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYwpAQCAtMTA3Myw4ICsxMDczLDYgQEAKIHZvaWQgdG1pb19tbWNfaG9zdF9mcmVlKHN0cnVjdCB0bWlvX21tY19ob3N0ICpob3N0KQogewogCW1tY19mcmVlX2hvc3QoaG9zdC0+bW1jKTsKLQotCWhvc3QtPm1tYyA9IE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKHRtaW9fbW1jX2hvc3RfZnJlZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvd210LXNkbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L3dtdC1zZG1tYy5jCmluZGV4IGRkMmUxYWEuLjVhZjAwNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvd210LXNkbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC93bXQtc2RtbWMuYwpAQCAtNzQ0LDcgKzc0NCw3IEBACiAJLm1heF9ibGtfc2l6ZSA9IDIwNDgsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB3bXRfbWNpX2R0X2lkc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd210X21jaV9kdF9pZHNbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIndtLHdtODUwNS1zZGhjIiwgLmRhdGEgPSAmd204NTA1X2NhcHMgfSwKIAl7IC8qIFNlbnRpbmVsICovIH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvZ3BtaS1saWIuYyBiL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2dwbWktbGliLmMKaW5kZXggMjdmMjcyZS4uNDNmYTE2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvZ3BtaS1saWIuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL2dwbWktbmFuZC9ncG1pLWxpYi5jCkBAIC0xMTA1LDcgKzExMDUsNyBAQAogCQltYXNrID0gTVgyOF9CRl9HUE1JX1NUQVRfUkVBRFlfQlVTWSgxIDw8IGNoaXApOwogCQlyZWcgPSByZWFkbChyLT5ncG1pX3JlZ3MgKyBIV19HUE1JX1NUQVQpOwogCX0gZWxzZQotCQlkZXZfZXJyKHRoaXMtPmRldiwgInVua25vdyBhcmNoLlxuIik7CisJCWRldl9lcnIodGhpcy0+ZGV2LCAidW5rbm93biBhcmNoLlxuIik7CiAJcmV0dXJuIHJlZyAmIG1hc2s7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvaGlzaTUwNF9uYW5kLmMgYi9kcml2ZXJzL210ZC9uYW5kL2hpc2k1MDRfbmFuZC5jCmluZGV4IDI4OWFkM2EuLjhkY2M3YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL25hbmQvaGlzaTUwNF9uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9oaXNpNTA0X25hbmQuYwpAQCAtNzU4LDggKzc1OCw3IEBACiAKIAloaXNpX25mY19ob3N0X2luaXQoaG9zdCk7CiAKLQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgaXJxLCBoaW5mY19pcnFfaGFuZGxlLCBJUlFGX0RJU0FCTEVELAotCQkJCSJuYW5kYyIsIGhvc3QpOworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoZGV2LCBpcnEsIGhpbmZjX2lycV9oYW5kbGUsIDB4MCwgIm5hbmRjIiwgaG9zdCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IElSUVxuIik7CiAJCWdvdG8gZXJyX3JlczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9hdHRhY2guYyBiL2RyaXZlcnMvbXRkL3ViaS9hdHRhY2guYwppbmRleCA5ZDJlMTZmLi42OGVlYTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvYXR0YWNoLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2F0dGFjaC5jCkBAIC00MTAsNyArNDEwLDcgQEAKIAkJc2Vjb25kX2lzX25ld2VyID0gIXNlY29uZF9pc19uZXdlcjsKIAl9IGVsc2UgewogCQlkYmdfYmxkKCJQRUIgJWQgQ1JDIGlzIE9LIiwgcG51bSk7Ci0JCWJpdGZsaXBzID0gISFlcnI7CisJCWJpdGZsaXBzIHw9ICEhZXJyOwogCX0KIAltdXRleF91bmxvY2soJnViaS0+YnVmX211dGV4KTsKIApAQCAtMTMwMSw2ICsxMzAxLDMwIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHN0cnVjdCB1YmlfYXR0YWNoX2luZm8gKmFsbG9jX2FpKHZvaWQpCit7CisJc3RydWN0IHViaV9hdHRhY2hfaW5mbyAqYWk7CisKKwlhaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1YmlfYXR0YWNoX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFpKQorCQlyZXR1cm4gYWk7CisKKwlJTklUX0xJU1RfSEVBRCgmYWktPmNvcnIpOworCUlOSVRfTElTVF9IRUFEKCZhaS0+ZnJlZSk7CisJSU5JVF9MSVNUX0hFQUQoJmFpLT5lcmFzZSk7CisJSU5JVF9MSVNUX0hFQUQoJmFpLT5hbGllbik7CisJYWktPnZvbHVtZXMgPSBSQl9ST09UOworCWFpLT5hZWJfc2xhYl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJ1YmlfYWViX3NsYWJfY2FjaGUiLAorCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1YmlfYWluZl9wZWIpLAorCQkJCQkgICAgICAgMCwgMCwgTlVMTCk7CisJaWYgKCFhaS0+YWViX3NsYWJfY2FjaGUpIHsKKwkJa2ZyZWUoYWkpOworCQlhaSA9IE5VTEw7CisJfQorCisJcmV0dXJuIGFpOworfQorCiAjaWZkZWYgQ09ORklHX01URF9VQklfRkFTVE1BUAogCiAvKioKQEAgLTEzMTMsNyArMTMzNyw3IEBACiAgKiBVQklfTk9fRkFTVE1BUCBkZW5vdGVzIHRoYXQgbm8gZmFzdG1hcCB3YXMgZm91bmQuCiAgKiBVQklfQkFEX0ZBU1RNQVAgZGVub3RlcyB0aGF0IHRoZSBmb3VuZCBmYXN0bWFwIHdhcyBpbnZhbGlkLgogICovCi1zdGF0aWMgaW50IHNjYW5fZmFzdChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX2F0dGFjaF9pbmZvICphaSkKK3N0YXRpYyBpbnQgc2Nhbl9mYXN0KHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1YmlfYXR0YWNoX2luZm8gKiphaSkKIHsKIAlpbnQgZXJyLCBwbnVtLCBmbV9hbmNob3IgPSAtMTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgbWF4X3NxbnVtID0gMDsKQEAgLTEzMzQsNyArMTM1OCw3IEBACiAJCWNvbmRfcmVzY2hlZCgpOwogCiAJCWRiZ19nZW4oInByb2Nlc3MgUEVCICVkIiwgcG51bSk7Ci0JCWVyciA9IHNjYW5fcGViKHViaSwgYWksIHBudW0sICZ2b2xfaWQsICZzcW51bSk7CisJCWVyciA9IHNjYW5fcGViKHViaSwgKmFpLCBwbnVtLCAmdm9sX2lkLCAmc3FudW0pOwogCQlpZiAoZXJyIDwgMCkKIAkJCWdvdG8gb3V0X3ZpZGg7CiAKQEAgLTEzNTAsNyArMTM3NCwxMiBAQAogCWlmIChmbV9hbmNob3IgPCAwKQogCQlyZXR1cm4gVUJJX05PX0ZBU1RNQVA7CiAKLQlyZXR1cm4gdWJpX3NjYW5fZmFzdG1hcCh1YmksIGFpLCBmbV9hbmNob3IpOworCWRlc3Ryb3lfYWkoKmFpKTsKKwkqYWkgPSBhbGxvY19haSgpOworCWlmICghKmFpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiB1Ymlfc2Nhbl9mYXN0bWFwKHViaSwgKmFpLCBmbV9hbmNob3IpOwogCiBvdXRfdmlkaDoKIAl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkaCk7CkBAIC0xMzYyLDMwICsxMzkxLDYgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3QgdWJpX2F0dGFjaF9pbmZvICphbGxvY19haShjb25zdCBjaGFyICpzbGFiX25hbWUpCi17Ci0Jc3RydWN0IHViaV9hdHRhY2hfaW5mbyAqYWk7Ci0KLQlhaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1YmlfYXR0YWNoX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWFpKQotCQlyZXR1cm4gYWk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmYWktPmNvcnIpOwotCUlOSVRfTElTVF9IRUFEKCZhaS0+ZnJlZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmFpLT5lcmFzZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmFpLT5hbGllbik7Ci0JYWktPnZvbHVtZXMgPSBSQl9ST09UOwotCWFpLT5hZWJfc2xhYl9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKHNsYWJfbmFtZSwKLQkJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdWJpX2FpbmZfcGViKSwKLQkJCQkJICAgICAgIDAsIDAsIE5VTEwpOwotCWlmICghYWktPmFlYl9zbGFiX2NhY2hlKSB7Ci0JCWtmcmVlKGFpKTsKLQkJYWkgPSBOVUxMOwotCX0KLQotCXJldHVybiBhaTsKLX0KLQogLyoqCiAgKiB1YmlfYXR0YWNoIC0gYXR0YWNoIGFuIE1URCBkZXZpY2UuCiAgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0b3IKQEAgLTEzOTksNyArMTQwNCw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3QgdWJpX2F0dGFjaF9pbmZvICphaTsKIAotCWFpID0gYWxsb2NfYWkoInViaV9hZWJfc2xhYl9jYWNoZSIpOworCWFpID0gYWxsb2NfYWkoKTsKIAlpZiAoIWFpKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTQxMywxMSArMTQxOCwxMSBAQAogCWlmIChmb3JjZV9zY2FuKQogCQllcnIgPSBzY2FuX2FsbCh1YmksIGFpLCAwKTsKIAllbHNlIHsKLQkJZXJyID0gc2Nhbl9mYXN0KHViaSwgYWkpOwotCQlpZiAoZXJyID4gMCkgeworCQllcnIgPSBzY2FuX2Zhc3QodWJpLCAmYWkpOworCQlpZiAoZXJyID4gMCB8fCBtdGRfaXNfZWNjZXJyKGVycikpIHsKIAkJCWlmIChlcnIgIT0gVUJJX05PX0ZBU1RNQVApIHsKIAkJCQlkZXN0cm95X2FpKGFpKTsKLQkJCQlhaSA9IGFsbG9jX2FpKCJ1YmlfYWViX3NsYWJfY2FjaGUyIik7CisJCQkJYWkgPSBhbGxvY19haSgpOwogCQkJCWlmICghYWkpCiAJCQkJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNDUzLDEwICsxNDU4LDEwIEBACiAJCWdvdG8gb3V0X3dsOwogCiAjaWZkZWYgQ09ORklHX01URF9VQklfRkFTVE1BUAotCWlmICh1YmktPmZtICYmIHViaV9kYmdfY2hrX2dlbih1YmkpKSB7CisJaWYgKHViaS0+Zm0gJiYgdWJpX2RiZ19jaGtfZmFzdG1hcCh1YmkpKSB7CiAJCXN0cnVjdCB1YmlfYXR0YWNoX2luZm8gKnNjYW5fYWk7CiAKLQkJc2Nhbl9haSA9IGFsbG9jX2FpKCJ1YmlfY2toX2FlYl9zbGFiX2NhY2hlIik7CisJCXNjYW5fYWkgPSBhbGxvY19haSgpOwogCQlpZiAoIXNjYW5fYWkpIHsKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIG91dF93bDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9idWlsZC5jIGIvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKaW5kZXggYmEwMWE4ZC4uOTY5MGNmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2J1aWxkLmMKQEAgLTgxLDYgKzgxLDcgQEAKICNpZmRlZiBDT05GSUdfTVREX1VCSV9GQVNUTUFQCiAvKiBVQkkgbW9kdWxlIHBhcmFtZXRlciB0byBlbmFibGUgZmFzdG1hcCBhdXRvbWF0aWNhbGx5IG9uIG5vbi1mYXN0bWFwIGltYWdlcyAqLwogc3RhdGljIGJvb2wgZm1fYXV0b2NvbnZlcnQ7CitzdGF0aWMgYm9vbCBmbV9kZWJ1ZzsKICNlbmRpZgogLyogUm9vdCBVQkkgImNsYXNzIiBvYmplY3QgKGNvcnJlc3BvbmRzIHRvICcvPHN5c2ZzPi9jbGFzcy91YmkvJykgKi8KIHN0cnVjdCBjbGFzcyAqdWJpX2NsYXNzOwpAQCAtMTU0LDIzICsxNTUsMjIgQEAKICAqLwogaW50IHViaV92b2x1bWVfbm90aWZ5KHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wsIGludCBudHlwZSkKIHsKKwlpbnQgcmV0OwogCXN0cnVjdCB1Ymlfbm90aWZpY2F0aW9uIG50OwogCiAJdWJpX2RvX2dldF9kZXZpY2VfaW5mbyh1YmksICZudC5kaSk7CiAJdWJpX2RvX2dldF92b2x1bWVfaW5mbyh1YmksIHZvbCwgJm50LnZpKTsKIAotI2lmZGVmIENPTkZJR19NVERfVUJJX0ZBU1RNQVAKIAlzd2l0Y2ggKG50eXBlKSB7CiAJY2FzZSBVQklfVk9MVU1FX0FEREVEOgogCWNhc2UgVUJJX1ZPTFVNRV9SRU1PVkVEOgogCWNhc2UgVUJJX1ZPTFVNRV9SRVNJWkVEOgogCWNhc2UgVUJJX1ZPTFVNRV9SRU5BTUVEOgotCQlpZiAodWJpX3VwZGF0ZV9mYXN0bWFwKHViaSkpIHsKLQkJCXViaV9lcnIodWJpLCAiVW5hYmxlIHRvIHVwZGF0ZSBmYXN0bWFwISIpOwotCQkJdWJpX3JvX21vZGUodWJpKTsKLQkJfQorCQlyZXQgPSB1YmlfdXBkYXRlX2Zhc3RtYXAodWJpKTsKKwkJaWYgKHJldCkKKwkJCXViaV9tc2codWJpLCAiVW5hYmxlIHRvIHdyaXRlIGEgbmV3IGZhc3RtYXA6ICVpIiwgcmV0KTsKIAl9Ci0jZW5kaWYKKwogCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9jYWxsX2NoYWluKCZ1Ymlfbm90aWZpZXJzLCBudHlwZSwgJm50KTsKIH0KIApAQCAtOTUwLDggKzk1MCwxMCBAQAogCWlmICh1YmktPmZtX3Bvb2wubWF4X3NpemUgPCBVQklfRk1fTUlOX1BPT0xfU0laRSkKIAkJdWJpLT5mbV9wb29sLm1heF9zaXplID0gVUJJX0ZNX01JTl9QT09MX1NJWkU7CiAKLQl1YmktPmZtX3dsX3Bvb2wubWF4X3NpemUgPSBVQklfRk1fV0xfUE9PTF9TSVpFOworCXViaS0+Zm1fd2xfcG9vbC5tYXhfc2l6ZSA9IHViaS0+Zm1fcG9vbC5tYXhfc2l6ZSAvIDI7CiAJdWJpLT5mbV9kaXNhYmxlZCA9ICFmbV9hdXRvY29udmVydDsKKwlpZiAoZm1fZGVidWcpCisJCXViaV9lbmFibGVfZGJnX2Noa19mYXN0bWFwKHViaSk7CiAKIAlpZiAoIXViaS0+Zm1fZGlzYWJsZWQgJiYgKGludCltdGRfZGl2X2J5X2ViKHViaS0+bXRkLT5zaXplLCB1YmktPm10ZCkKIAkgICAgPD0gVUJJX0ZNX01BWF9TVEFSVCkgewpAQCAtOTcwLDggKzk3Miw4IEBACiAJbXV0ZXhfaW5pdCgmdWJpLT5ja3ZvbF9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmdWJpLT5kZXZpY2VfbXV0ZXgpOwogCXNwaW5fbG9ja19pbml0KCZ1YmktPnZvbHVtZXNfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmdWJpLT5mbV9tdXRleCk7Ci0JaW5pdF9yd3NlbSgmdWJpLT5mbV9zZW0pOworCWluaXRfcndzZW0oJnViaS0+Zm1fcHJvdGVjdCk7CisJaW5pdF9yd3NlbSgmdWJpLT5mbV9lYmFfc2VtKTsKIAogCXViaV9tc2codWJpLCAiYXR0YWNoaW5nIG10ZCVkIiwgbXRkLT5pbmRleCk7CiAKQEAgLTExMTUsOCArMTExNywxMSBAQAogCXViaV9tc2codWJpLCAiZGV0YWNoaW5nIG10ZCVkIiwgdWJpLT5tdGQtPmluZGV4KTsKICNpZmRlZiBDT05GSUdfTVREX1VCSV9GQVNUTUFQCiAJLyogSWYgd2UgZG9uJ3Qgd3JpdGUgYSBuZXcgZmFzdG1hcCBhdCBkZXRhY2ggdGltZSB3ZSBsb3NlIGFsbAotCSAqIEVDIHVwZGF0ZXMgdGhhdCBoYXZlIGJlZW4gbWFkZSBzaW5jZSB0aGUgbGFzdCB3cml0dGVuIGZhc3RtYXAuICovCi0JdWJpX3VwZGF0ZV9mYXN0bWFwKHViaSk7CisJICogRUMgdXBkYXRlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIHNpbmNlIHRoZSBsYXN0IHdyaXR0ZW4gZmFzdG1hcC4KKwkgKiBJbiBjYXNlIG9mIGZhc3RtYXAgZGVidWdnaW5nIHdlIG9taXQgdGhlIHVwZGF0ZSB0byBzaW11bGF0ZSBhbgorCSAqIHVuY2xlYW4gc2h1dGRvd24uICovCisJaWYgKCF1YmlfZGJnX2Noa19mYXN0bWFwKHViaSkpCisJCXViaV91cGRhdGVfZmFzdG1hcCh1YmkpOwogI2VuZGlmCiAJLyoKIAkgKiBCZWZvcmUgZnJlZWluZyBhbnl0aGluZywgd2UgaGF2ZSB0byBzdG9wIHRoZSBiYWNrZ3JvdW5kIHRocmVhZCB0bwpAQCAtMTUwMSw2ICsxNTA2LDggQEAKICNpZmRlZiBDT05GSUdfTVREX1VCSV9GQVNUTUFQCiBtb2R1bGVfcGFyYW0oZm1fYXV0b2NvbnZlcnQsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhmbV9hdXRvY29udmVydCwgIlNldCB0aGlzIHBhcmFtZXRlciB0byBlbmFibGUgZmFzdG1hcCBhdXRvbWF0aWNhbGx5IG9uIGltYWdlcyB3aXRob3V0IGEgZmFzdG1hcC4iKTsKK21vZHVsZV9wYXJhbShmbV9kZWJ1ZywgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGZtX2RlYnVnLCAiU2V0IHRoaXMgcGFyYW1ldGVyIHRvIGVuYWJsZSBmYXN0bWFwIGRlYnVnZ2luZyBieSBkZWZhdWx0LiBXYXJuaW5nLCB0aGlzIHdpbGwgbWFrZSBmYXN0bWFwIHNsb3chIik7CiAjZW5kaWYKIE1PRFVMRV9WRVJTSU9OKF9fc3RyaW5naWZ5KFVCSV9WRVJTSU9OKSk7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlVCSSAtIFVuc29ydGVkIEJsb2NrIEltYWdlcyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2NkZXYuYyBiL2RyaXZlcnMvbXRkL3ViaS9jZGV2LmMKaW5kZXggZDY0N2U1MC4uZDE2ZmNjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2NkZXYuYworKysgYi9kcml2ZXJzL210ZC91YmkvY2Rldi5jCkBAIC00NTUsNyArNDU1LDcgQEAKIAkJLyogVmFsaWRhdGUgdGhlIHJlcXVlc3QgKi8KIAkJZXJyID0gLUVJTlZBTDsKIAkJaWYgKHJlcS5sbnVtIDwgMCB8fCByZXEubG51bSA+PSB2b2wtPnJlc2VydmVkX3BlYnMgfHwKLQkJICAgIHJlcS5ieXRlcyA8IDAgfHwgcmVxLmxudW0gPj0gdm9sLT51c2FibGVfbGViX3NpemUpCisJCSAgICByZXEuYnl0ZXMgPCAwIHx8IHJlcS5ieXRlcyA+IHZvbC0+dXNhYmxlX2xlYl9zaXplKQogCQkJYnJlYWs7CiAKIAkJZXJyID0gZ2V0X2V4Y2x1c2l2ZShkZXNjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5jIGIvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmMKaW5kZXggNzMzNWM5Zi4uYjA3N2U0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2RlYnVnLmMKQEAgLTI2Myw3ICsyNjMsNyBAQAogCXN0cnVjdCBkZW50cnkgKmRlbnQgPSBmaWxlLT5mX3BhdGguZGVudHJ5OwogCXN0cnVjdCB1YmlfZGV2aWNlICp1Ymk7CiAJc3RydWN0IHViaV9kZWJ1Z19pbmZvICpkOwotCWNoYXIgYnVmWzNdOworCWNoYXIgYnVmWzhdOwogCWludCB2YWw7CiAKIAl1YmkgPSB1YmlfZ2V0X2RldmljZSh1YmlfbnVtKTsKQEAgLTI3NSwxMiArMjc1LDMwIEBACiAJCXZhbCA9IGQtPmNoa19nZW47CiAJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2lvKQogCQl2YWwgPSBkLT5jaGtfaW87CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2Zhc3RtYXApCisJCXZhbCA9IGQtPmNoa19mYXN0bWFwOwogCWVsc2UgaWYgKGRlbnQgPT0gZC0+ZGZzX2Rpc2FibGVfYmd0KQogCQl2YWwgPSBkLT5kaXNhYmxlX2JndDsKIAllbHNlIGlmIChkZW50ID09IGQtPmRmc19lbXVsYXRlX2JpdGZsaXBzKQogCQl2YWwgPSBkLT5lbXVsYXRlX2JpdGZsaXBzOwogCWVsc2UgaWYgKGRlbnQgPT0gZC0+ZGZzX2VtdWxhdGVfaW9fZmFpbHVyZXMpCiAJCXZhbCA9IGQtPmVtdWxhdGVfaW9fZmFpbHVyZXM7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfZW11bGF0ZV9wb3dlcl9jdXQpIHsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1XG4iLCBkLT5lbXVsYXRlX3Bvd2VyX2N1dCk7CisJCWNvdW50ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLAorCQkJCQkJYnVmLCBzdHJsZW4oYnVmKSk7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfcG93ZXJfY3V0X21pbikgeworCQlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXVcbiIsIGQtPnBvd2VyX2N1dF9taW4pOworCQljb3VudCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywKKwkJCQkJCWJ1Ziwgc3RybGVuKGJ1ZikpOworCQlnb3RvIG91dDsKKwl9IGVsc2UgaWYgKGRlbnQgPT0gZC0+ZGZzX3Bvd2VyX2N1dF9tYXgpIHsKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1XG4iLCBkLT5wb3dlcl9jdXRfbWF4KTsKKwkJY291bnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsCisJCQkJCQlidWYsIHN0cmxlbihidWYpKTsKKwkJZ290byBvdXQ7CisJfQogCWVsc2UgewogCQljb3VudCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtMzA5LDcgKzMyNyw3IEBACiAJc3RydWN0IHViaV9kZXZpY2UgKnViaTsKIAlzdHJ1Y3QgdWJpX2RlYnVnX2luZm8gKmQ7CiAJc2l6ZV90IGJ1Zl9zaXplOwotCWNoYXIgYnVmWzhdOworCWNoYXIgYnVmWzhdID0gezB9OwogCWludCB2YWw7CiAKIAl1YmkgPSB1YmlfZ2V0X2RldmljZSh1YmlfbnVtKTsKQEAgLTMyMyw2ICszNDEsMjEgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJaWYgKGRlbnQgPT0gZC0+ZGZzX3Bvd2VyX2N1dF9taW4pIHsKKwkJaWYgKGtzdHJ0b3VpbnQoYnVmLCAwLCAmZC0+cG93ZXJfY3V0X21pbikgIT0gMCkKKwkJCWNvdW50ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfSBlbHNlIGlmIChkZW50ID09IGQtPmRmc19wb3dlcl9jdXRfbWF4KSB7CisJCWlmIChrc3RydG91aW50KGJ1ZiwgMCwgJmQtPnBvd2VyX2N1dF9tYXgpICE9IDApCisJCQljb3VudCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0gZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfZW11bGF0ZV9wb3dlcl9jdXQpIHsKKwkJaWYgKGtzdHJ0b2ludChidWYsIDAsICZ2YWwpICE9IDApCisJCQljb3VudCA9IC1FSU5WQUw7CisJCWQtPmVtdWxhdGVfcG93ZXJfY3V0ID0gdmFsOworCQlnb3RvIG91dDsKKwl9CisKIAlpZiAoYnVmWzBdID09ICcxJykKIAkJdmFsID0gMTsKIAllbHNlIGlmIChidWZbMF0gPT0gJzAnKQpAQCAtMzM2LDYgKzM2OSw4IEBACiAJCWQtPmNoa19nZW4gPSB2YWw7CiAJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2lvKQogCQlkLT5jaGtfaW8gPSB2YWw7CisJZWxzZSBpZiAoZGVudCA9PSBkLT5kZnNfY2hrX2Zhc3RtYXApCisJCWQtPmNoa19mYXN0bWFwID0gdmFsOwogCWVsc2UgaWYgKGRlbnQgPT0gZC0+ZGZzX2Rpc2FibGVfYmd0KQogCQlkLT5kaXNhYmxlX2JndCA9IHZhbDsKIAllbHNlIGlmIChkZW50ID09IGQtPmRmc19lbXVsYXRlX2JpdGZsaXBzKQpAQCAtNDA2LDYgKzQ0MSwxMyBAQAogCQlnb3RvIG91dF9yZW1vdmU7CiAJZC0+ZGZzX2Noa19pbyA9IGRlbnQ7CiAKKwlmbmFtZSA9ICJjaGtfZmFzdG1hcCI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVdVU1IsIGQtPmRmc19kaXIsICh2b2lkICopdWJpX251bSwKKwkJCQkgICAmZGZzX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBvdXRfcmVtb3ZlOworCWQtPmRmc19jaGtfZmFzdG1hcCA9IGRlbnQ7CisKIAlmbmFtZSA9ICJ0c3RfZGlzYWJsZV9iZ3QiOwogCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGZuYW1lLCBTX0lXVVNSLCBkLT5kZnNfZGlyLCAodm9pZCAqKXViaV9udW0sCiAJCQkJICAgJmRmc19mb3BzKTsKQEAgLTQyNyw2ICs0NjksMjcgQEAKIAkJZ290byBvdXRfcmVtb3ZlOwogCWQtPmRmc19lbXVsYXRlX2lvX2ZhaWx1cmVzID0gZGVudDsKIAorCWZuYW1lID0gInRzdF9lbXVsYXRlX3Bvd2VyX2N1dCI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVdVU1IsIGQtPmRmc19kaXIsICh2b2lkICopdWJpX251bSwKKwkJCQkgICAmZGZzX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBvdXRfcmVtb3ZlOworCWQtPmRmc19lbXVsYXRlX3Bvd2VyX2N1dCA9IGRlbnQ7CisKKwlmbmFtZSA9ICJ0c3RfZW11bGF0ZV9wb3dlcl9jdXRfbWluIjsKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZShmbmFtZSwgU19JV1VTUiwgZC0+ZGZzX2RpciwgKHZvaWQgKil1YmlfbnVtLAorCQkJCSAgICZkZnNfZm9wcyk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQorCQlnb3RvIG91dF9yZW1vdmU7CisJZC0+ZGZzX3Bvd2VyX2N1dF9taW4gPSBkZW50OworCisJZm5hbWUgPSAidHN0X2VtdWxhdGVfcG93ZXJfY3V0X21heCI7CisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoZm5hbWUsIFNfSVdVU1IsIGQtPmRmc19kaXIsICh2b2lkICopdWJpX251bSwKKwkJCQkgICAmZGZzX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBvdXRfcmVtb3ZlOworCWQtPmRmc19wb3dlcl9jdXRfbWF4ID0gZGVudDsKKwogCXJldHVybiAwOwogCiBvdXRfcmVtb3ZlOgpAQCAtNDQ3LDMgKzUxMCwzNiBAQAogCWlmIChJU19FTkFCTEVEKENPTkZJR19ERUJVR19GUykpCiAJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh1YmktPmRiZy5kZnNfZGlyKTsKIH0KKworLyoqCisgKiB1YmlfZGJnX3Bvd2VyX2N1dCAtIGVtdWxhdGUgYSBwb3dlciBjdXQgaWYgaXQgaXMgdGltZSB0byBkbyBzbworICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBjYWxsZXI6IEZsYWdzIHNldCB0byBpbmRpY2F0ZSBmcm9tIHdoZXJlIHRoZSBmdW5jdGlvbiBpcyBiZWluZyBjYWxsZWQKKyAqCisgKiBSZXR1cm5zIG5vbi16ZXJvIGlmIGEgcG93ZXIgY3V0IHdhcyBlbXVsYXRlZCwgemVybyBpZiBub3QuCisgKi8KK2ludCB1YmlfZGJnX3Bvd2VyX2N1dChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgY2FsbGVyKQoreworCXVuc2lnbmVkIGludCByYW5nZTsKKworCWlmICgodWJpLT5kYmcuZW11bGF0ZV9wb3dlcl9jdXQgJiBjYWxsZXIpID09IDApCisJCXJldHVybiAwOworCisJaWYgKHViaS0+ZGJnLnBvd2VyX2N1dF9jb3VudGVyID09IDApIHsKKwkJdWJpLT5kYmcucG93ZXJfY3V0X2NvdW50ZXIgPSB1YmktPmRiZy5wb3dlcl9jdXRfbWluOworCisJCWlmICh1YmktPmRiZy5wb3dlcl9jdXRfbWF4ID4gdWJpLT5kYmcucG93ZXJfY3V0X21pbikgeworCQkJcmFuZ2UgPSB1YmktPmRiZy5wb3dlcl9jdXRfbWF4IC0gdWJpLT5kYmcucG93ZXJfY3V0X21pbjsKKwkJCXViaS0+ZGJnLnBvd2VyX2N1dF9jb3VudGVyICs9IHByYW5kb21fdTMyKCkgJSByYW5nZTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwl1YmktPmRiZy5wb3dlcl9jdXRfY291bnRlci0tOworCWlmICh1YmktPmRiZy5wb3dlcl9jdXRfY291bnRlcikKKwkJcmV0dXJuIDA7CisKKwl1YmlfbXNnKHViaSwgIlhYWFhYWFhYWFhYWFhYWCBlbXVsYXRpbmcgYSBwb3dlciBjdXQgWFhYWFhYWFhYWFhYWFhYWCIpOworCXViaV9yb19tb2RlKHViaSk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvZGVidWcuaCBiL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5oCmluZGV4IGNiYTg5ZmMuLmViODk4NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvbXRkL3ViaS9kZWJ1Zy5oCkBAIC0xMjcsNCArMTI3LDE2IEBACiB7CiAJcmV0dXJuIHViaS0+ZGJnLmNoa19nZW47CiB9CisKK3N0YXRpYyBpbmxpbmUgaW50IHViaV9kYmdfY2hrX2Zhc3RtYXAoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlyZXR1cm4gdWJpLT5kYmcuY2hrX2Zhc3RtYXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1YmlfZW5hYmxlX2RiZ19jaGtfZmFzdG1hcChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQoreworCXViaS0+ZGJnLmNoa19mYXN0bWFwID0gMTsKK30KKworaW50IHViaV9kYmdfcG93ZXJfY3V0KHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBjYWxsZXIpOwogI2VuZGlmIC8qICFfX1VCSV9ERUJVR19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9lYmEuYyBiL2RyaXZlcnMvbXRkL3ViaS9lYmEuYwppbmRleCBkYTRjNzkyLi41MWJjYTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvZWJhLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2ViYS5jCkBAIC0zNDAsOSArMzQwLDkgQEAKIAogCWRiZ19lYmEoImVyYXNlIExFQiAlZDolZCwgUEVCICVkIiwgdm9sX2lkLCBsbnVtLCBwbnVtKTsKIAotCWRvd25fcmVhZCgmdWJpLT5mbV9zZW0pOworCWRvd25fcmVhZCgmdWJpLT5mbV9lYmFfc2VtKTsKIAl2b2wtPmViYV90YmxbbG51bV0gPSBVQklfTEVCX1VOTUFQUEVEOwotCXVwX3JlYWQoJnViaS0+Zm1fc2VtKTsKKwl1cF9yZWFkKCZ1YmktPmZtX2ViYV9zZW0pOwogCWVyciA9IHViaV93bF9wdXRfcGViKHViaSwgdm9sX2lkLCBsbnVtLCBwbnVtLCAwKTsKIAogb3V0X3VubG9jazoKQEAgLTQyNSw5ICs0MjUsMTAgQEAKIAkJCQkJdWJpX3dhcm4odWJpLCAiY29ycnVwdGVkIFZJRCBoZWFkZXIgYXQgUEVCICVkLCBMRUIgJWQ6JWQiLAogCQkJCQkJIHBudW0sIHZvbF9pZCwgbG51bSk7CiAJCQkJCWVyciA9IC1FQkFETVNHOwotCQkJCX0gZWxzZQorCQkJCX0gZWxzZSB7CiAJCQkJCWVyciA9IC1FSU5WQUw7CiAJCQkJCXViaV9yb19tb2RlKHViaSk7CisJCQkJfQogCQkJfQogCQkJZ290byBvdXRfZnJlZTsKIAkJfSBlbHNlIGlmIChlcnIgPT0gVUJJX0lPX0JJVEZMSVBTKQpAQCAtNTY2LDYgKzU2Nyw3IEBACiAJbmV3X3BudW0gPSB1Ymlfd2xfZ2V0X3BlYih1YmkpOwogCWlmIChuZXdfcG51bSA8IDApIHsKIAkJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOworCQl1cF9yZWFkKCZ1YmktPmZtX2ViYV9zZW0pOwogCQlyZXR1cm4gbmV3X3BudW07CiAJfQogCkBAIC01NzYsMTMgKzU3OCwxNiBAQAogCWlmIChlcnIgJiYgZXJyICE9IFVCSV9JT19CSVRGTElQUykgewogCQlpZiAoZXJyID4gMCkKIAkJCWVyciA9IC1FSU87CisJCXVwX3JlYWQoJnViaS0+Zm1fZWJhX3NlbSk7CiAJCWdvdG8gb3V0X3B1dDsKIAl9CiAKIAl2aWRfaGRyLT5zcW51bSA9IGNwdV90b19iZTY0KHViaV9uZXh0X3NxbnVtKHViaSkpOwogCWVyciA9IHViaV9pb193cml0ZV92aWRfaGRyKHViaSwgbmV3X3BudW0sIHZpZF9oZHIpOwotCWlmIChlcnIpCisJaWYgKGVycikgeworCQl1cF9yZWFkKCZ1YmktPmZtX2ViYV9zZW0pOwogCQlnb3RvIHdyaXRlX2Vycm9yOworCX0KIAogCWRhdGFfc2l6ZSA9IG9mZnNldCArIGxlbjsKIAltdXRleF9sb2NrKCZ1YmktPmJ1Zl9tdXRleCk7CkBAIC01OTEsOCArNTk2LDEwIEBACiAJLyogUmVhZCBldmVyeXRoaW5nIGJlZm9yZSB0aGUgYXJlYSB3aGVyZSB0aGUgd3JpdGUgZmFpbHVyZSBoYXBwZW5lZCAqLwogCWlmIChvZmZzZXQgPiAwKSB7CiAJCWVyciA9IHViaV9pb19yZWFkX2RhdGEodWJpLCB1YmktPnBlYl9idWYsIHBudW0sIDAsIG9mZnNldCk7Ci0JCWlmIChlcnIgJiYgZXJyICE9IFVCSV9JT19CSVRGTElQUykKKwkJaWYgKGVyciAmJiBlcnIgIT0gVUJJX0lPX0JJVEZMSVBTKSB7CisJCQl1cF9yZWFkKCZ1YmktPmZtX2ViYV9zZW0pOwogCQkJZ290byBvdXRfdW5sb2NrOworCQl9CiAJfQogCiAJbWVtY3B5KHViaS0+cGViX2J1ZiArIG9mZnNldCwgYnVmLCBsZW4pOwpAQCAtNjAwLDE1ICs2MDcsMTUgQEAKIAllcnIgPSB1YmlfaW9fd3JpdGVfZGF0YSh1YmksIHViaS0+cGViX2J1ZiwgbmV3X3BudW0sIDAsIGRhdGFfc2l6ZSk7CiAJaWYgKGVycikgewogCQltdXRleF91bmxvY2soJnViaS0+YnVmX211dGV4KTsKKwkJdXBfcmVhZCgmdWJpLT5mbV9lYmFfc2VtKTsKIAkJZ290byB3cml0ZV9lcnJvcjsKIAl9CiAKIAltdXRleF91bmxvY2soJnViaS0+YnVmX211dGV4KTsKIAl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CiAKLQlkb3duX3JlYWQoJnViaS0+Zm1fc2VtKTsKIAl2b2wtPmViYV90YmxbbG51bV0gPSBuZXdfcG51bTsKLQl1cF9yZWFkKCZ1YmktPmZtX3NlbSk7CisJdXBfcmVhZCgmdWJpLT5mbV9lYmFfc2VtKTsKIAl1Ymlfd2xfcHV0X3BlYih1YmksIHZvbF9pZCwgbG51bSwgcG51bSwgMSk7CiAKIAl1YmlfbXNnKHViaSwgImRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWNvdmVyZWQiKTsKQEAgLTcwMyw2ICs3MTAsNyBAQAogCWlmIChwbnVtIDwgMCkgewogCQl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CiAJCWxlYl93cml0ZV91bmxvY2sodWJpLCB2b2xfaWQsIGxudW0pOworCQl1cF9yZWFkKCZ1YmktPmZtX2ViYV9zZW0pOwogCQlyZXR1cm4gcG51bTsKIAl9CiAKQEAgLTcxMyw2ICs3MjEsNyBAQAogCWlmIChlcnIpIHsKIAkJdWJpX3dhcm4odWJpLCAiZmFpbGVkIHRvIHdyaXRlIFZJRCBoZWFkZXIgdG8gTEVCICVkOiVkLCBQRUIgJWQiLAogCQkJIHZvbF9pZCwgbG51bSwgcG51bSk7CisJCXVwX3JlYWQoJnViaS0+Zm1fZWJhX3NlbSk7CiAJCWdvdG8gd3JpdGVfZXJyb3I7CiAJfQogCkBAIC03MjEsMTMgKzczMCwxMyBAQAogCQlpZiAoZXJyKSB7CiAJCQl1Ymlfd2Fybih1YmksICJmYWlsZWQgdG8gd3JpdGUgJWQgYnl0ZXMgYXQgb2Zmc2V0ICVkIG9mIExFQiAlZDolZCwgUEVCICVkIiwKIAkJCQkgbGVuLCBvZmZzZXQsIHZvbF9pZCwgbG51bSwgcG51bSk7CisJCQl1cF9yZWFkKCZ1YmktPmZtX2ViYV9zZW0pOwogCQkJZ290byB3cml0ZV9lcnJvcjsKIAkJfQogCX0KIAotCWRvd25fcmVhZCgmdWJpLT5mbV9zZW0pOwogCXZvbC0+ZWJhX3RibFtsbnVtXSA9IHBudW07Ci0JdXBfcmVhZCgmdWJpLT5mbV9zZW0pOworCXVwX3JlYWQoJnViaS0+Zm1fZWJhX3NlbSk7CiAKIAlsZWJfd3JpdGVfdW5sb2NrKHViaSwgdm9sX2lkLCBsbnVtKTsKIAl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CkBAIC04MjQsNiArODMzLDcgQEAKIAlpZiAocG51bSA8IDApIHsKIAkJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZpZF9oZHIpOwogCQlsZWJfd3JpdGVfdW5sb2NrKHViaSwgdm9sX2lkLCBsbnVtKTsKKwkJdXBfcmVhZCgmdWJpLT5mbV9lYmFfc2VtKTsKIAkJcmV0dXJuIHBudW07CiAJfQogCkBAIC04MzQsNiArODQ0LDcgQEAKIAlpZiAoZXJyKSB7CiAJCXViaV93YXJuKHViaSwgImZhaWxlZCB0byB3cml0ZSBWSUQgaGVhZGVyIHRvIExFQiAlZDolZCwgUEVCICVkIiwKIAkJCSB2b2xfaWQsIGxudW0sIHBudW0pOworCQl1cF9yZWFkKCZ1YmktPmZtX2ViYV9zZW0pOwogCQlnb3RvIHdyaXRlX2Vycm9yOwogCX0KIApAQCAtODQxLDEzICs4NTIsMTMgQEAKIAlpZiAoZXJyKSB7CiAJCXViaV93YXJuKHViaSwgImZhaWxlZCB0byB3cml0ZSAlZCBieXRlcyBvZiBkYXRhIHRvIFBFQiAlZCIsCiAJCQkgbGVuLCBwbnVtKTsKKwkJdXBfcmVhZCgmdWJpLT5mbV9lYmFfc2VtKTsKIAkJZ290byB3cml0ZV9lcnJvcjsKIAl9CiAKIAl1YmlfYXNzZXJ0KHZvbC0+ZWJhX3RibFtsbnVtXSA8IDApOwotCWRvd25fcmVhZCgmdWJpLT5mbV9zZW0pOwogCXZvbC0+ZWJhX3RibFtsbnVtXSA9IHBudW07Ci0JdXBfcmVhZCgmdWJpLT5mbV9zZW0pOworCXVwX3JlYWQoJnViaS0+Zm1fZWJhX3NlbSk7CiAKIAlsZWJfd3JpdGVfdW5sb2NrKHViaSwgdm9sX2lkLCBsbnVtKTsKIAl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7CkBAIC04OTksNyArOTEwLDcgQEAKIGludCB1YmlfZWJhX2F0b21pY19sZWJfY2hhbmdlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIHN0cnVjdCB1Ymlfdm9sdW1lICp2b2wsCiAJCQkgICAgICBpbnQgbG51bSwgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuKQogewotCWludCBlcnIsIHBudW0sIHRyaWVzID0gMCwgdm9sX2lkID0gdm9sLT52b2xfaWQ7CisJaW50IGVyciwgcG51bSwgb2xkX3BudW0sIHRyaWVzID0gMCwgdm9sX2lkID0gdm9sLT52b2xfaWQ7CiAJc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyOwogCXVpbnQzMl90IGNyYzsKIApAQCAtOTQyLDYgKzk1Myw3IEBACiAJcG51bSA9IHViaV93bF9nZXRfcGViKHViaSk7CiAJaWYgKHBudW0gPCAwKSB7CiAJCWVyciA9IHBudW07CisJCXVwX3JlYWQoJnViaS0+Zm1fZWJhX3NlbSk7CiAJCWdvdG8gb3V0X2xlYl91bmxvY2s7CiAJfQogCkBAIC05NTIsNiArOTY0LDcgQEAKIAlpZiAoZXJyKSB7CiAJCXViaV93YXJuKHViaSwgImZhaWxlZCB0byB3cml0ZSBWSUQgaGVhZGVyIHRvIExFQiAlZDolZCwgUEVCICVkIiwKIAkJCSB2b2xfaWQsIGxudW0sIHBudW0pOworCQl1cF9yZWFkKCZ1YmktPmZtX2ViYV9zZW0pOwogCQlnb3RvIHdyaXRlX2Vycm9yOwogCX0KIApAQCAtOTU5LDE5ICs5NzIsMjAgQEAKIAlpZiAoZXJyKSB7CiAJCXViaV93YXJuKHViaSwgImZhaWxlZCB0byB3cml0ZSAlZCBieXRlcyBvZiBkYXRhIHRvIFBFQiAlZCIsCiAJCQkgbGVuLCBwbnVtKTsKKwkJdXBfcmVhZCgmdWJpLT5mbV9lYmFfc2VtKTsKIAkJZ290byB3cml0ZV9lcnJvcjsKIAl9CiAKLQlpZiAodm9sLT5lYmFfdGJsW2xudW1dID49IDApIHsKLQkJZXJyID0gdWJpX3dsX3B1dF9wZWIodWJpLCB2b2xfaWQsIGxudW0sIHZvbC0+ZWJhX3RibFtsbnVtXSwgMCk7CisJb2xkX3BudW0gPSB2b2wtPmViYV90YmxbbG51bV07CisJdm9sLT5lYmFfdGJsW2xudW1dID0gcG51bTsKKwl1cF9yZWFkKCZ1YmktPmZtX2ViYV9zZW0pOworCisJaWYgKG9sZF9wbnVtID49IDApIHsKKwkJZXJyID0gdWJpX3dsX3B1dF9wZWIodWJpLCB2b2xfaWQsIGxudW0sIG9sZF9wbnVtLCAwKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0X2xlYl91bmxvY2s7CiAJfQogCi0JZG93bl9yZWFkKCZ1YmktPmZtX3NlbSk7Ci0Jdm9sLT5lYmFfdGJsW2xudW1dID0gcG51bTsKLQl1cF9yZWFkKCZ1YmktPmZtX3NlbSk7Ci0KIG91dF9sZWJfdW5sb2NrOgogCWxlYl93cml0ZV91bmxvY2sodWJpLCB2b2xfaWQsIGxudW0pOwogb3V0X211dGV4OgpAQCAtMTIxNyw5ICsxMjMxLDkgQEAKIAl9CiAKIAl1YmlfYXNzZXJ0KHZvbC0+ZWJhX3RibFtsbnVtXSA9PSBmcm9tKTsKLQlkb3duX3JlYWQoJnViaS0+Zm1fc2VtKTsKKwlkb3duX3JlYWQoJnViaS0+Zm1fZWJhX3NlbSk7CiAJdm9sLT5lYmFfdGJsW2xudW1dID0gdG87Ci0JdXBfcmVhZCgmdWJpLT5mbV9zZW0pOworCXVwX3JlYWQoJnViaS0+Zm1fZWJhX3NlbSk7CiAKIG91dF91bmxvY2tfYnVmOgogCW11dGV4X3VubG9jaygmdWJpLT5idWZfbXV0ZXgpOwpAQCAtMTQxOCw3ICsxNDMyLDggQEAKIAkJCQkgKiBkdXJpbmcgcmUtc2l6ZS4KIAkJCQkgKi8KIAkJCQl1YmlfbW92ZV9hZWJfdG9fbGlzdChhdiwgYWViLCAmYWktPmVyYXNlKTsKLQkJCXZvbC0+ZWJhX3RibFthZWItPmxudW1dID0gYWViLT5wbnVtOworCQkJZWxzZQorCQkJCXZvbC0+ZWJhX3RibFthZWItPmxudW1dID0gYWViLT5wbnVtOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91YmkvZmFzdG1hcC13bC5jIGIvZHJpdmVycy9tdGQvdWJpL2Zhc3RtYXAtd2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmE2NjUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tdGQvdWJpL2Zhc3RtYXAtd2wuYwpAQCAtMCwwICsxLDM2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBMaW51dHJvbml4IEdtYkgKKyAqIENvcHlyaWdodCAoYykgMjAxNCBzaWdtYSBzdGFyIGdtYmgKKyAqIEF1dGhvcjogUmljaGFyZCBXZWluYmVyZ2VyIDxyaWNoYXJkQG5vZC5hdD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZQorICogdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKy8qKgorICogdXBkYXRlX2Zhc3RtYXBfd29ya19mbiAtIGNhbGxzIHViaV91cGRhdGVfZmFzdG1hcCBmcm9tIGEgd29yayBxdWV1ZQorICogQHdyazogdGhlIHdvcmsgZGVzY3JpcHRpb24gb2JqZWN0CisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9mYXN0bWFwX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3cmspCit7CisJc3RydWN0IHViaV9kZXZpY2UgKnViaSA9IGNvbnRhaW5lcl9vZih3cmssIHN0cnVjdCB1YmlfZGV2aWNlLCBmbV93b3JrKTsKKworCXViaV91cGRhdGVfZmFzdG1hcCh1YmkpOworCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwl1YmktPmZtX3dvcmtfc2NoZWR1bGVkID0gMDsKKwlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKK30KKworLyoqCisgKiBmaW5kX2FuY2hvcl93bF9lbnRyeSAtIGZpbmQgd2Vhci1sZXZlbGluZyBlbnRyeSB0byB1c2VkIGFzIGFuY2hvciBQRUIuCisgKiBAcm9vdDogdGhlIFJCLXRyZWUgd2hlcmUgdG8gbG9vayBmb3IKKyAqLworc3RhdGljIHN0cnVjdCB1Ymlfd2xfZW50cnkgKmZpbmRfYW5jaG9yX3dsX2VudHJ5KHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlICpwOworCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmUsICp2aWN0aW0gPSBOVUxMOworCWludCBtYXhfZWMgPSBVQklfTUFYX0VSQVNFQ09VTlRFUjsKKworCXViaV9yYl9mb3JfZWFjaF9lbnRyeShwLCBlLCByb290LCB1LnJiKSB7CisJCWlmIChlLT5wbnVtIDwgVUJJX0ZNX01BWF9TVEFSVCAmJiBlLT5lYyA8IG1heF9lYykgeworCQkJdmljdGltID0gZTsKKwkJCW1heF9lYyA9IGUtPmVjOworCQl9CisJfQorCisJcmV0dXJuIHZpY3RpbTsKK30KKworLyoqCisgKiByZXR1cm5fdW51c2VkX3Bvb2xfcGVicyAtIHJldHVybnMgdW51c2VkIFBFQiB0byB0aGUgZnJlZSB0cmVlLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBwb29sOiBmYXN0bWFwIHBvb2wgZGVzY3JpcHRpb24gb2JqZWN0CisgKi8KK3N0YXRpYyB2b2lkIHJldHVybl91bnVzZWRfcG9vbF9wZWJzKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksCisJCQkJICAgIHN0cnVjdCB1YmlfZm1fcG9vbCAqcG9vbCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplOworCisJZm9yIChpID0gcG9vbC0+dXNlZDsgaSA8IHBvb2wtPnNpemU7IGkrKykgeworCQllID0gdWJpLT5sb29rdXB0YmxbcG9vbC0+cGVic1tpXV07CisJCXdsX3RyZWVfYWRkKGUsICZ1YmktPmZyZWUpOworCQl1YmktPmZyZWVfY291bnQrKzsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYW5jaG9yX3BlYnNfYXZhbGlibGUoc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKnA7CisJc3RydWN0IHViaV93bF9lbnRyeSAqZTsKKworCXViaV9yYl9mb3JfZWFjaF9lbnRyeShwLCBlLCByb290LCB1LnJiKQorCQlpZiAoZS0+cG51bSA8IFVCSV9GTV9NQVhfU1RBUlQpCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHViaV93bF9nZXRfZm1fcGViIC0gZmluZCBhIHBoeXNpY2FsIGVyYXNlIGJsb2NrIHdpdGggYSBnaXZlbiBtYXhpbWFsIG51bWJlci4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAYW5jaG9yOiBUaGlzIFBFQiB3aWxsIGJlIHVzZWQgYXMgYW5jaG9yIFBFQiBieSBmYXN0bWFwCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwaHlzaWNhbCBlcmFzZSBibG9jayB3aXRoIGEgZ2l2ZW4gbWF4aW1hbCBudW1iZXIKKyAqIGFuZCByZW1vdmVzIGl0IGZyb20gdGhlIHdsIHN1YnN5c3RlbS4KKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggd2xfbG9jayBoZWxkIQorICovCitzdHJ1Y3QgdWJpX3dsX2VudHJ5ICp1Ymlfd2xfZ2V0X2ZtX3BlYihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgYW5jaG9yKQoreworCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmUgPSBOVUxMOworCisJaWYgKCF1YmktPmZyZWUucmJfbm9kZSB8fCAodWJpLT5mcmVlX2NvdW50IC0gdWJpLT5iZWJfcnN2ZF9wZWJzIDwgMSkpCisJCWdvdG8gb3V0OworCisJaWYgKGFuY2hvcikKKwkJZSA9IGZpbmRfYW5jaG9yX3dsX2VudHJ5KCZ1YmktPmZyZWUpOworCWVsc2UKKwkJZSA9IGZpbmRfbWVhbl93bF9lbnRyeSh1YmksICZ1YmktPmZyZWUpOworCisJaWYgKCFlKQorCQlnb3RvIG91dDsKKworCXNlbGZfY2hlY2tfaW5fd2xfdHJlZSh1YmksIGUsICZ1YmktPmZyZWUpOworCisJLyogcmVtb3ZlIGl0IGZyb20gdGhlIGZyZWUgbGlzdCwKKwkgKiB0aGUgd2wgc3Vic3lzdGVtIGRvZXMgbm8gbG9uZ2VyIGtub3cgdGhpcyBlcmFzZSBibG9jayAqLworCXJiX2VyYXNlKCZlLT51LnJiLCAmdWJpLT5mcmVlKTsKKwl1YmktPmZyZWVfY291bnQtLTsKK291dDoKKwlyZXR1cm4gZTsKK30KKworLyoqCisgKiB1YmlfcmVmaWxsX3Bvb2xzIC0gcmVmaWxscyBhbGwgZmFzdG1hcCBQRUIgcG9vbHMuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICovCit2b2lkIHViaV9yZWZpbGxfcG9vbHMoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlzdHJ1Y3QgdWJpX2ZtX3Bvb2wgKndsX3Bvb2wgPSAmdWJpLT5mbV93bF9wb29sOworCXN0cnVjdCB1YmlfZm1fcG9vbCAqcG9vbCA9ICZ1YmktPmZtX3Bvb2w7CisJc3RydWN0IHViaV93bF9lbnRyeSAqZTsKKwlpbnQgZW5vdWdoOworCisJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOworCisJcmV0dXJuX3VudXNlZF9wb29sX3BlYnModWJpLCB3bF9wb29sKTsKKwlyZXR1cm5fdW51c2VkX3Bvb2xfcGVicyh1YmksIHBvb2wpOworCisJd2xfcG9vbC0+c2l6ZSA9IDA7CisJcG9vbC0+c2l6ZSA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWVub3VnaCA9IDA7CisJCWlmIChwb29sLT5zaXplIDwgcG9vbC0+bWF4X3NpemUpIHsKKwkJCWlmICghdWJpLT5mcmVlLnJiX25vZGUpCisJCQkJYnJlYWs7CisKKwkJCWUgPSB3bF9nZXRfd2xlKHViaSk7CisJCQlpZiAoIWUpCisJCQkJYnJlYWs7CisKKwkJCXBvb2wtPnBlYnNbcG9vbC0+c2l6ZV0gPSBlLT5wbnVtOworCQkJcG9vbC0+c2l6ZSsrOworCQl9IGVsc2UKKwkJCWVub3VnaCsrOworCisJCWlmICh3bF9wb29sLT5zaXplIDwgd2xfcG9vbC0+bWF4X3NpemUpIHsKKwkJCWlmICghdWJpLT5mcmVlLnJiX25vZGUgfHwKKwkJCSAgICh1YmktPmZyZWVfY291bnQgLSB1YmktPmJlYl9yc3ZkX3BlYnMgPCA1KSkKKwkJCQlicmVhazsKKworCQkJZSA9IGZpbmRfd2xfZW50cnkodWJpLCAmdWJpLT5mcmVlLCBXTF9GUkVFX01BWF9ESUZGKTsKKwkJCXNlbGZfY2hlY2tfaW5fd2xfdHJlZSh1YmksIGUsICZ1YmktPmZyZWUpOworCQkJcmJfZXJhc2UoJmUtPnUucmIsICZ1YmktPmZyZWUpOworCQkJdWJpLT5mcmVlX2NvdW50LS07CisKKwkJCXdsX3Bvb2wtPnBlYnNbd2xfcG9vbC0+c2l6ZV0gPSBlLT5wbnVtOworCQkJd2xfcG9vbC0+c2l6ZSsrOworCQl9IGVsc2UKKwkJCWVub3VnaCsrOworCisJCWlmIChlbm91Z2ggPT0gMikKKwkJCWJyZWFrOworCX0KKworCXdsX3Bvb2wtPnVzZWQgPSAwOworCXBvb2wtPnVzZWQgPSAwOworCisJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7Cit9CisKKy8qKgorICogdWJpX3dsX2dldF9wZWIgLSBnZXQgYSBwaHlzaWNhbCBlcmFzZWJsb2NrLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwaHlzaWNhbCBlcmFzZWJsb2NrIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYQorICogbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKiBSZXR1cm5zIHdpdGggdWJpLT5mbV9lYmFfc2VtIGhlbGQgaW4gcmVhZCBtb2RlIQorICovCitpbnQgdWJpX3dsX2dldF9wZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlpbnQgcmV0LCByZXRyaWVkID0gMDsKKwlzdHJ1Y3QgdWJpX2ZtX3Bvb2wgKnBvb2wgPSAmdWJpLT5mbV9wb29sOworCXN0cnVjdCB1YmlfZm1fcG9vbCAqd2xfcG9vbCA9ICZ1YmktPmZtX3dsX3Bvb2w7CisKK2FnYWluOgorCWRvd25fcmVhZCgmdWJpLT5mbV9lYmFfc2VtKTsKKwlzcGluX2xvY2soJnViaS0+d2xfbG9jayk7CisKKwkvKiBXZSBjaGVjayBoZXJlIGFsc28gZm9yIHRoZSBXTCBwb29sIGJlY2F1c2UgYXQgdGhpcyBwb2ludCB3ZSBjYW4KKwkgKiByZWZpbGwgdGhlIFdMIHBvb2wgc3luY2hyb25vdXMuICovCisJaWYgKHBvb2wtPnVzZWQgPT0gcG9vbC0+c2l6ZSB8fCB3bF9wb29sLT51c2VkID09IHdsX3Bvb2wtPnNpemUpIHsKKwkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJCXVwX3JlYWQoJnViaS0+Zm1fZWJhX3NlbSk7CisJCXJldCA9IHViaV91cGRhdGVfZmFzdG1hcCh1YmkpOworCQlpZiAocmV0KSB7CisJCQl1YmlfbXNnKHViaSwgIlVuYWJsZSB0byB3cml0ZSBhIG5ldyBmYXN0bWFwOiAlaSIsIHJldCk7CisJCQlkb3duX3JlYWQoJnViaS0+Zm1fZWJhX3NlbSk7CisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJfQorCQlkb3duX3JlYWQoJnViaS0+Zm1fZWJhX3NlbSk7CisJCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwl9CisKKwlpZiAocG9vbC0+dXNlZCA9PSBwb29sLT5zaXplKSB7CisJCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOworCQlpZiAocmV0cmllZCkgeworCQkJdWJpX2Vycih1YmksICJVbmFibGUgdG8gZ2V0IGEgZnJlZSBQRUIgZnJvbSB1c2VyIFdMIHBvb2wiKTsKKwkJCXJldCA9IC1FTk9TUEM7CisJCQlnb3RvIG91dDsKKwkJfQorCQlyZXRyaWVkID0gMTsKKwkJdXBfcmVhZCgmdWJpLT5mbV9lYmFfc2VtKTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwl1YmlfYXNzZXJ0KHBvb2wtPnVzZWQgPCBwb29sLT5zaXplKTsKKwlyZXQgPSBwb29sLT5wZWJzW3Bvb2wtPnVzZWQrK107CisJcHJvdF9xdWV1ZV9hZGQodWJpLCB1YmktPmxvb2t1cHRibFtyZXRdKTsKKwlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBnZXRfcGViX2Zvcl93bCAtIHJldHVybnMgYSBQRUIgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBXTCBzdWItc3lzdGVtLgorICoKKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICpnZXRfcGViX2Zvcl93bChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQoreworCXN0cnVjdCB1YmlfZm1fcG9vbCAqcG9vbCA9ICZ1YmktPmZtX3dsX3Bvb2w7CisJaW50IHBudW07CisKKwlpZiAocG9vbC0+dXNlZCA9PSBwb29sLT5zaXplKSB7CisJCS8qIFdlIGNhbm5vdCB1cGRhdGUgdGhlIGZhc3RtYXAgaGVyZSBiZWNhdXNlIHRoaXMKKwkJICogZnVuY3Rpb24gaXMgY2FsbGVkIGluIGF0b21pYyBjb250ZXh0LgorCQkgKiBMZXQncyBmYWlsIGhlcmUgYW5kIHJlZmlsbC91cGRhdGUgaXQgYXMgc29vbiBhcyBwb3NzaWJsZS4gKi8KKwkJaWYgKCF1YmktPmZtX3dvcmtfc2NoZWR1bGVkKSB7CisJCQl1YmktPmZtX3dvcmtfc2NoZWR1bGVkID0gMTsKKwkJCXNjaGVkdWxlX3dvcmsoJnViaS0+Zm1fd29yayk7CisJCX0KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcG51bSA9IHBvb2wtPnBlYnNbcG9vbC0+dXNlZCsrXTsKKwlyZXR1cm4gdWJpLT5sb29rdXB0YmxbcG51bV07Cit9CisKKy8qKgorICogdWJpX2Vuc3VyZV9hbmNob3JfcGVicyAtIHNjaGVkdWxlIHdlYXItbGV2ZWxpbmcgdG8gcHJvZHVjZSBhbiBhbmNob3IgUEVCLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqLworaW50IHViaV9lbnN1cmVfYW5jaG9yX3BlYnMoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlzdHJ1Y3QgdWJpX3dvcmsgKndyazsKKworCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwlpZiAodWJpLT53bF9zY2hlZHVsZWQpIHsKKwkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJCXJldHVybiAwOworCX0KKwl1YmktPndsX3NjaGVkdWxlZCA9IDE7CisJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisKKwl3cmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdWJpX3dvcmspLCBHRlBfTk9GUyk7CisJaWYgKCF3cmspIHsKKwkJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOworCQl1YmktPndsX3NjaGVkdWxlZCA9IDA7CisJCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl3cmstPmFuY2hvciA9IDE7CisJd3JrLT5mdW5jID0gJndlYXJfbGV2ZWxpbmdfd29ya2VyOworCXNjaGVkdWxlX3ViaV93b3JrKHViaSwgd3JrKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB1Ymlfd2xfcHV0X2ZtX3BlYiAtIHJldHVybnMgYSBQRUIgdXNlZCBpbiBhIGZhc3RtYXAgdG8gdGhlIHdlYXItbGV2ZWxpbmcKKyAqIHN1Yi1zeXN0ZW0uCisgKiBzZWU6IHViaV93bF9wdXRfcGViKCkKKyAqCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQGZtX2U6IHBoeXNpY2FsIGVyYXNlYmxvY2sgdG8gcmV0dXJuCisgKiBAbG51bTogdGhlIGxhc3QgdXNlZCBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyIGZvciB0aGUgUEVCCisgKiBAdG9ydHVyZTogaWYgdGhpcyBwaHlzaWNhbCBlcmFzZWJsb2NrIGhhcyB0byBiZSB0b3J0dXJlZAorICovCitpbnQgdWJpX3dsX3B1dF9mbV9wZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV93bF9lbnRyeSAqZm1fZSwKKwkJICAgICAgaW50IGxudW0sIGludCB0b3J0dXJlKQoreworCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmU7CisJaW50IHZvbF9pZCwgcG51bSA9IGZtX2UtPnBudW07CisKKwlkYmdfd2woIlBFQiAlZCIsIHBudW0pOworCisJdWJpX2Fzc2VydChwbnVtID49IDApOworCXViaV9hc3NlcnQocG51bSA8IHViaS0+cGViX2NvdW50KTsKKworCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwllID0gdWJpLT5sb29rdXB0YmxbcG51bV07CisKKwkvKiBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgcmVjb3ZlcmVkIGZyb20gYSBmYXN0bWFwIHRoZSB2ZXJ5CisJICogZmlyc3QgdGltZSBhbmQgd3JpdGluZyBub3cgYSBuZXcgb25lLiBJbiB0aGlzIGNhc2UgdGhlIHdsIHN5c3RlbQorCSAqIGhhcyBuZXZlciBzZWVuIGFueSBQRUIgdXNlZCBieSB0aGUgb3JpZ2luYWwgZmFzdG1hcC4KKwkgKi8KKwlpZiAoIWUpIHsKKwkJZSA9IGZtX2U7CisJCXViaV9hc3NlcnQoZS0+ZWMgPj0gMCk7CisJCXViaS0+bG9va3VwdGJsW3BudW1dID0gZTsKKwl9CisKKwlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKworCXZvbF9pZCA9IGxudW0gPyBVQklfRk1fREFUQV9WT0xVTUVfSUQgOiBVQklfRk1fU0JfVk9MVU1FX0lEOworCXJldHVybiBzY2hlZHVsZV9lcmFzZSh1YmksIGUsIHZvbF9pZCwgbG51bSwgdG9ydHVyZSk7Cit9CisKKy8qKgorICogdWJpX2lzX2VyYXNlX3dvcmsgLSBjaGVja3Mgd2hldGhlciBhIHdvcmsgaXMgZXJhc2Ugd29yay4KKyAqIEB3cms6IFRoZSB3b3JrIG9iamVjdCB0byBiZSBjaGVja2VkCisgKi8KK2ludCB1YmlfaXNfZXJhc2Vfd29yayhzdHJ1Y3QgdWJpX3dvcmsgKndyaykKK3sKKwlyZXR1cm4gd3JrLT5mdW5jID09IGVyYXNlX3dvcmtlcjsKK30KKworc3RhdGljIHZvaWQgdWJpX2Zhc3RtYXBfY2xvc2Uoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlpbnQgaTsKKworCWZsdXNoX3dvcmsoJnViaS0+Zm1fd29yayk7CisJcmV0dXJuX3VudXNlZF9wb29sX3BlYnModWJpLCAmdWJpLT5mbV9wb29sKTsKKwlyZXR1cm5fdW51c2VkX3Bvb2xfcGVicyh1YmksICZ1YmktPmZtX3dsX3Bvb2wpOworCisJaWYgKHViaS0+Zm0pIHsKKwkJZm9yIChpID0gMDsgaSA8IHViaS0+Zm0tPnVzZWRfYmxvY2tzOyBpKyspCisJCQlrZnJlZSh1YmktPmZtLT5lW2ldKTsKKwl9CisJa2ZyZWUodWJpLT5mbSk7Cit9CisKKy8qKgorICogbWF5X3Jlc2VydmVfZm9yX2ZtIC0gdGVzdHMgd2hldGhlciBhIFBFQiBzaGFsbCBiZSByZXNlcnZlZCBmb3IgZmFzdG1hcC4KKyAqIFNlZSBmaW5kX21lYW5fd2xfZW50cnkoKQorICoKKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAZTogcGh5c2ljYWwgZXJhc2VibG9jayB0byByZXR1cm4KKyAqIEByb290OiBSQiB0cmVlIHRvIHRlc3QgYWdhaW5zdC4KKyAqLworc3RhdGljIHN0cnVjdCB1Ymlfd2xfZW50cnkgKm1heV9yZXNlcnZlX2Zvcl9mbShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLAorCQkJCQkgICBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplLAorCQkJCQkgICBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkgeworCWlmIChlICYmICF1YmktPmZtX2Rpc2FibGVkICYmICF1YmktPmZtICYmCisJICAgIGUtPnBudW0gPCBVQklfRk1fTUFYX1NUQVJUKQorCQllID0gcmJfZW50cnkocmJfbmV4dChyb290LT5yYl9ub2RlKSwKKwkJCSAgICAgc3RydWN0IHViaV93bF9lbnRyeSwgdS5yYik7CisKKwlyZXR1cm4gZTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS9mYXN0bWFwLmMgYi9kcml2ZXJzL210ZC91YmkvZmFzdG1hcC5jCmluZGV4IGRiM2RlZmQuLjAyYTZkZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS9mYXN0bWFwLmMKKysrIGIvZHJpdmVycy9tdGQvdWJpL2Zhc3RtYXAuYwpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTGludXRyb25peCBHbWJICisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgc2lnbWEgc3RhciBnbWJoCiAgKiBBdXRob3I6IFJpY2hhcmQgV2VpbmJlcmdlciA8cmljaGFyZEBub2QuYXQ+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKQEAgLTE3LDYgKzE4LDY5IEBACiAjaW5jbHVkZSAidWJpLmgiCiAKIC8qKgorICogaW5pdF9zZWVuIC0gYWxsb2NhdGUgbWVtb3J5IGZvciB1c2VkIGZvciBkZWJ1Z2dpbmcuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICovCitzdGF0aWMgaW5saW5lIGludCAqaW5pdF9zZWVuKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJaW50ICpyZXQ7CisKKwlpZiAoIXViaV9kYmdfY2hrX2Zhc3RtYXAodWJpKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBrY2FsbG9jKHViaS0+cGViX2NvdW50LCBzaXplb2YoaW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBmcmVlX3NlZW4gLSBmcmVlIHRoZSBzZWVuIGxvZ2ljIGludGVnZXIgYXJyYXkuCisgKiBAc2VlbjogaW50ZWdlciBhcnJheSBvZiBAdWJpLT5wZWJfY291bnQgc2l6ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9zZWVuKGludCAqc2VlbikKK3sKKwlrZnJlZShzZWVuKTsKK30KKworLyoqCisgKiBzZXRfc2VlbiAtIG1hcmsgYSBQRUIgYXMgc2Vlbi4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAcG51bTogVGhlIFBFQiB0byBiZSBtYWtyZWQgYXMgc2VlbgorICogQHNlZW46IGludGVnZXIgYXJyYXkgb2YgQHViaS0+cGViX2NvdW50IHNpemUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF9zZWVuKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtLCBpbnQgKnNlZW4pCit7CisJaWYgKCF1YmlfZGJnX2Noa19mYXN0bWFwKHViaSkgfHwgIXNlZW4pCisJCXJldHVybjsKKworCXNlZW5bcG51bV0gPSAxOworfQorCisvKioKKyAqIHNlbGZfY2hlY2tfc2VlbiAtIGNoZWNrIHdoZXRoZXIgYWxsIFBFQiBoYXZlIGJlZW4gc2VlbiBieSBmYXN0bWFwLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBzZWVuOiBpbnRlZ2VyIGFycmF5IG9mIEB1YmktPnBlYl9jb3VudCBzaXplCisgKi8KK3N0YXRpYyBpbnQgc2VsZl9jaGVja19zZWVuKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCAqc2VlbikKK3sKKwlpbnQgcG51bSwgcmV0ID0gMDsKKworCWlmICghdWJpX2RiZ19jaGtfZmFzdG1hcCh1YmkpIHx8ICFzZWVuKQorCQlyZXR1cm4gMDsKKworCWZvciAocG51bSA9IDA7IHBudW0gPCB1YmktPnBlYl9jb3VudDsgcG51bSsrKSB7CisJCWlmICghc2VlbltwbnVtXSAmJiB1YmktPmxvb2t1cHRibFtwbnVtXSkgeworCQkJdWJpX2Vycih1YmksICJzZWxmLWNoZWNrIGZhaWxlZCBmb3IgUEVCICVkLCBmYXN0bWFwIGRpZG4ndCBzZWUgaXQiLCBwbnVtKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKICAqIHViaV9jYWxjX2ZtX3NpemUgLSBjYWxjdWxhdGVzIHRoZSBmYXN0bWFwIHNpemUgaW4gYnl0ZXMgZm9yIGFuIFVCSSBkZXZpY2UuCiAgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAogICovCkBAIC0xMzYsMTQgKzIwMCwxNSBAQAogCWlmICghYXYpCiAJCWdvdG8gb3V0OwogCi0JYXYtPmhpZ2hlc3RfbG51bSA9IGF2LT5sZWJfY291bnQgPSAwOworCWF2LT5oaWdoZXN0X2xudW0gPSBhdi0+bGViX2NvdW50ID0gYXYtPnVzZWRfZWJzID0gMDsKIAlhdi0+dm9sX2lkID0gdm9sX2lkOwotCWF2LT51c2VkX2VicyA9IHVzZWRfZWJzOwogCWF2LT5kYXRhX3BhZCA9IGRhdGFfcGFkOwogCWF2LT5sYXN0X2RhdGFfc2l6ZSA9IGxhc3RfZWJfYnl0ZXM7CiAJYXYtPmNvbXBhdCA9IDA7CiAJYXYtPnZvbF90eXBlID0gdm9sX3R5cGU7CiAJYXYtPnJvb3QgPSBSQl9ST09UOworCWlmIChhdi0+dm9sX3R5cGUgPT0gVUJJX1NUQVRJQ19WT0xVTUUpCisJCWF2LT51c2VkX2VicyA9IHVzZWRfZWJzOwogCiAJZGJnX2JsZCgiZm91bmQgdm9sdW1lIChJRCAlaSkiLCB2b2xfaWQpOwogCkBAIC0zNjIsNiArNDI3LDcgQEAKIAkJCWFlYiA9IHJiX2VudHJ5KG5vZGUyLCBzdHJ1Y3QgdWJpX2FpbmZfcGViLCB1LnJiKTsKIAkJCWlmIChhZWItPnBudW0gPT0gcG51bSkgewogCQkJCXJiX2VyYXNlKCZhZWItPnUucmIsICZhdi0+cm9vdCk7CisJCQkJYXYtPmxlYl9jb3VudC0tOwogCQkJCWttZW1fY2FjaGVfZnJlZShhaS0+YWViX3NsYWJfY2FjaGUsIGFlYik7CiAJCQkJcmV0dXJuOwogCQkJfQpAQCAtMzc2LDcgKzQ0Miw2IEBACiAgKiBAcGViczogYW4gYXJyYXkgb2YgYWxsIFBFQiBudW1iZXJzIGluIHRoZSB0byBiZSBzY2FubmVkIHBvb2wKICAqIEBwb29sX3NpemU6IHNpemUgb2YgdGhlIHBvb2wgKG51bWJlciBvZiBlbnRyaWVzIGluIEBwZWJzKQogICogQG1heF9zcW51bTogcG9pbnRlciB0byB0aGUgbWF4aW1hbCBzZXF1ZW5jZSBudW1iZXIKLSAqIEBlYmFfb3JwaGFuczogbGlzdCBvZiBQRUJzIHdoaWNoIG5lZWQgdG8gYmUgc2Nhbm5lZAogICogQGZyZWU6IGxpc3Qgb2YgUEVCcyB3aGljaCBhcmUgbW9zdCBsaWtlbHkgZnJlZSAoYW5kIGdvIGludG8gQGFpLT5mcmVlKQogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBpZiB0aGUgcG9vbCBpcyB1bnVzYWJsZSBVQklfQkFEX0ZBU1RNQVAgaXMgcmV0dXJuZWQuCkBAIC0zODQsMTIgKzQ0OSwxMiBAQAogICovCiBzdGF0aWMgaW50IHNjYW5fcG9vbChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX2F0dGFjaF9pbmZvICphaSwKIAkJICAgICBpbnQgKnBlYnMsIGludCBwb29sX3NpemUsIHVuc2lnbmVkIGxvbmcgbG9uZyAqbWF4X3NxbnVtLAotCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmViYV9vcnBoYW5zLCBzdHJ1Y3QgbGlzdF9oZWFkICpmcmVlKQorCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmZyZWUpCiB7CiAJc3RydWN0IHViaV92aWRfaGRyICp2aDsKIAlzdHJ1Y3QgdWJpX2VjX2hkciAqZWNoOwotCXN0cnVjdCB1YmlfYWluZl9wZWIgKm5ld19hZWIsICp0bXBfYWViOwotCWludCBpLCBwbnVtLCBlcnIsIGZvdW5kX29ycGhhbiwgcmV0ID0gMDsKKwlzdHJ1Y3QgdWJpX2FpbmZfcGViICpuZXdfYWViOworCWludCBpLCBwbnVtLCBlcnIsIHJldCA9IDA7CiAKIAllY2ggPSBremFsbG9jKHViaS0+ZWNfaGRyX2Fsc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlY2gpCkBAIC00NTcsMTggKzUyMiw2IEBACiAJCQlpZiAoZXJyID09IFVCSV9JT19CSVRGTElQUykKIAkJCQlzY3J1YiA9IDE7CiAKLQkJCWZvdW5kX29ycGhhbiA9IDA7Ci0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9hZWIsIGViYV9vcnBoYW5zLCB1Lmxpc3QpIHsKLQkJCQlpZiAodG1wX2FlYi0+cG51bSA9PSBwbnVtKSB7Ci0JCQkJCWZvdW5kX29ycGhhbiA9IDE7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmb3VuZF9vcnBoYW4pIHsKLQkJCQlsaXN0X2RlbCgmdG1wX2FlYi0+dS5saXN0KTsKLQkJCQlrbWVtX2NhY2hlX2ZyZWUoYWktPmFlYl9zbGFiX2NhY2hlLCB0bXBfYWViKTsKLQkJCX0KLQogCQkJbmV3X2FlYiA9IGttZW1fY2FjaGVfYWxsb2MoYWktPmFlYl9zbGFiX2NhY2hlLAogCQkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIW5ld19hZWIpIHsKQEAgLTU0MywxMCArNTk2LDkgQEAKIAkJCSAgICAgIHN0cnVjdCB1YmlfYXR0YWNoX2luZm8gKmFpLAogCQkJICAgICAgc3RydWN0IHViaV9mYXN0bWFwX2xheW91dCAqZm0pCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCB1c2VkLCBlYmFfb3JwaGFucywgZnJlZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHVzZWQsIGZyZWU7CiAJc3RydWN0IHViaV9haW5mX3ZvbHVtZSAqYXY7CiAJc3RydWN0IHViaV9haW5mX3BlYiAqYWViLCAqdG1wX2FlYiwgKl90bXBfYWViOwotCXN0cnVjdCB1YmlfZWNfaGRyICplY2g7CiAJc3RydWN0IHViaV9mbV9zYiAqZm1zYjsKIAlzdHJ1Y3QgdWJpX2ZtX2hkciAqZm1oZHI7CiAJc3RydWN0IHViaV9mbV9zY2FuX3Bvb2wgKmZtcGwxLCAqZm1wbDI7CkBAIC01NjAsMjIgKzYxMiw4IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmdXNlZCk7CiAJSU5JVF9MSVNUX0hFQUQoJmZyZWUpOwotCUlOSVRfTElTVF9IRUFEKCZlYmFfb3JwaGFucyk7Ci0JSU5JVF9MSVNUX0hFQUQoJmFpLT5jb3JyKTsKLQlJTklUX0xJU1RfSEVBRCgmYWktPmZyZWUpOwotCUlOSVRfTElTVF9IRUFEKCZhaS0+ZXJhc2UpOwotCUlOSVRfTElTVF9IRUFEKCZhaS0+YWxpZW4pOwotCWFpLT52b2x1bWVzID0gUkJfUk9PVDsKIAlhaS0+bWluX2VjID0gVUJJX01BWF9FUkFTRUNPVU5URVI7CiAKLQlhaS0+YWViX3NsYWJfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidWJpX2FpbmZfcGViX3NsYWIiLAotCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1YmlfYWluZl9wZWIpLAotCQkJCQkgICAgICAgMCwgMCwgTlVMTCk7Ci0JaWYgKCFhaS0+YWViX3NsYWJfY2FjaGUpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmYWlsOwotCX0KLQogCWZtc2IgPSAoc3RydWN0IHViaV9mbV9zYiAqKShmbV9yYXcpOwogCWFpLT5tYXhfc3FudW0gPSBmbXNiLT5zcW51bTsKIAlmbV9wb3MgKz0gc2l6ZW9mKHN0cnVjdCB1YmlfZm1fc2IpOwpAQCAtNzQxLDI4ICs3NzksOSBAQAogCQkJCX0KIAkJCX0KIAotCQkJLyogVGhpcyBjYW4gaGFwcGVuIGlmIGEgUEVCIGlzIGFscmVhZHkgaW4gYW4gRUJBIGtub3duCi0JCQkgKiBieSB0aGlzIGZhc3RtYXAgYnV0IHRoZSBQRUIgaXRzZWxmIGlzIG5vdCBpbiB0aGUgdXNlZAotCQkJICogbGlzdC4KLQkJCSAqIEluIHRoaXMgY2FzZSB0aGUgUEVCIGNhbiBiZSB3aXRoaW4gdGhlIGZhc3RtYXAgcG9vbAotCQkJICogb3Igd2hpbGUgd3JpdGluZyB0aGUgZmFzdG1hcCBpdCB3YXMgaW4gdGhlIHByb3RlY3Rpb24KLQkJCSAqIHF1ZXVlLgotCQkJICovCiAJCQlpZiAoIWFlYikgewotCQkJCWFlYiA9IGttZW1fY2FjaGVfYWxsb2MoYWktPmFlYl9zbGFiX2NhY2hlLAotCQkJCQkJICAgICAgIEdGUF9LRVJORUwpOwotCQkJCWlmICghYWViKSB7Ci0JCQkJCXJldCA9IC1FTk9NRU07Ci0KLQkJCQkJZ290byBmYWlsOwotCQkJCX0KLQotCQkJCWFlYi0+bG51bSA9IGo7Ci0JCQkJYWViLT5wbnVtID0gYmUzMl90b19jcHUoZm1fZWJhLT5wbnVtW2pdKTsKLQkJCQlhZWItPmVjID0gLTE7Ci0JCQkJYWViLT5zY3J1YiA9IGFlYi0+Y29weV9mbGFnID0gYWViLT5zcW51bSA9IDA7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmYWViLT51Lmxpc3QsICZlYmFfb3JwaGFucyk7Ci0JCQkJY29udGludWU7CisJCQkJdWJpX2Vycih1YmksICJQRUIgJWkgaXMgaW4gRUJBIGJ1dCBub3QgaW4gdXNlZCBsaXN0IiwgcG51bSk7CisJCQkJZ290byBmYWlsX2JhZDsKIAkJCX0KIAogCQkJYWViLT5sbnVtID0gajsKQEAgLTc3NSw0OSArNzk0LDEzIEBACiAJCQlkYmdfYmxkKCJpbnNlcnRpbmcgUEVCOiVpIChMRUIgJWkpIHRvIHZvbCAlaSIsCiAJCQkJYWViLT5wbnVtLCBhZWItPmxudW0sIGF2LT52b2xfaWQpOwogCQl9Ci0KLQkJZWNoID0ga3phbGxvYyh1YmktPmVjX2hkcl9hbHNpemUsIEdGUF9LRVJORUwpOwotCQlpZiAoIWVjaCkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0bXBfYWViLCBfdG1wX2FlYiwgJmViYV9vcnBoYW5zLAotCQkJCQkgdS5saXN0KSB7Ci0JCQlpbnQgZXJyOwotCi0JCQlpZiAodWJpX2lvX2lzX2JhZCh1YmksIHRtcF9hZWItPnBudW0pKSB7Ci0JCQkJdWJpX2Vycih1YmksICJiYWQgUEVCIGluIGZhc3RtYXAgRUJBIG9ycGhhbiBsaXN0Iik7Ci0JCQkJcmV0ID0gVUJJX0JBRF9GQVNUTUFQOwotCQkJCWtmcmVlKGVjaCk7Ci0JCQkJZ290byBmYWlsOwotCQkJfQotCi0JCQllcnIgPSB1YmlfaW9fcmVhZF9lY19oZHIodWJpLCB0bXBfYWViLT5wbnVtLCBlY2gsIDApOwotCQkJaWYgKGVyciAmJiBlcnIgIT0gVUJJX0lPX0JJVEZMSVBTKSB7Ci0JCQkJdWJpX2Vycih1YmksICJ1bmFibGUgdG8gcmVhZCBFQyBoZWFkZXIhIFBFQjolaSBlcnI6JWkiLAotCQkJCQl0bXBfYWViLT5wbnVtLCBlcnIpOwotCQkJCXJldCA9IGVyciA+IDAgPyBVQklfQkFEX0ZBU1RNQVAgOiBlcnI7Ci0JCQkJa2ZyZWUoZWNoKTsKLQotCQkJCWdvdG8gZmFpbDsKLQkJCX0gZWxzZSBpZiAoZXJyID09IFVCSV9JT19CSVRGTElQUykKLQkJCQl0bXBfYWViLT5zY3J1YiA9IDE7Ci0KLQkJCXRtcF9hZWItPmVjID0gYmU2NF90b19jcHUoZWNoLT5lYyk7Ci0JCQlhc3NpZ25fYWViX3RvX2F2KGFpLCB0bXBfYWViLCBhdik7Ci0JCX0KLQotCQlrZnJlZShlY2gpOwogCX0KIAotCXJldCA9IHNjYW5fcG9vbCh1YmksIGFpLCBmbXBsMS0+cGVicywgcG9vbF9zaXplLCAmbWF4X3NxbnVtLAotCQkJJmViYV9vcnBoYW5zLCAmZnJlZSk7CisJcmV0ID0gc2Nhbl9wb29sKHViaSwgYWksIGZtcGwxLT5wZWJzLCBwb29sX3NpemUsICZtYXhfc3FudW0sICZmcmVlKTsKIAlpZiAocmV0KQogCQlnb3RvIGZhaWw7CiAKLQlyZXQgPSBzY2FuX3Bvb2wodWJpLCBhaSwgZm1wbDItPnBlYnMsIHdsX3Bvb2xfc2l6ZSwgJm1heF9zcW51bSwKLQkJCSZlYmFfb3JwaGFucywgJmZyZWUpOworCXJldCA9IHNjYW5fcG9vbCh1YmksIGFpLCBmbXBsMi0+cGVicywgd2xfcG9vbF9zaXplLCAmbWF4X3NxbnVtLCAmZnJlZSk7CiAJaWYgKHJldCkKIAkJZ290byBmYWlsOwogCkBAIC04MjcsOCArODEwLDkgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodG1wX2FlYiwgX3RtcF9hZWIsICZmcmVlLCB1Lmxpc3QpCiAJCWxpc3RfbW92ZV90YWlsKCZ0bXBfYWViLT51Lmxpc3QsICZhaS0+ZnJlZSk7CiAKLQl1YmlfYXNzZXJ0KGxpc3RfZW1wdHkoJnVzZWQpKTsKLQl1YmlfYXNzZXJ0KGxpc3RfZW1wdHkoJmViYV9vcnBoYW5zKSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRtcF9hZWIsIF90bXBfYWViLCAmdXNlZCwgdS5saXN0KQorCQlsaXN0X21vdmVfdGFpbCgmdG1wX2FlYi0+dS5saXN0LCAmYWktPmVyYXNlKTsKKwogCXViaV9hc3NlcnQobGlzdF9lbXB0eSgmZnJlZSkpOwogCiAJLyoKQEAgLTg1MCwxMCArODM0LDYgQEAKIAkJbGlzdF9kZWwoJnRtcF9hZWItPnUubGlzdCk7CiAJCWttZW1fY2FjaGVfZnJlZShhaS0+YWViX3NsYWJfY2FjaGUsIHRtcF9hZWIpOwogCX0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodG1wX2FlYiwgX3RtcF9hZWIsICZlYmFfb3JwaGFucywgdS5saXN0KSB7Ci0JCWxpc3RfZGVsKCZ0bXBfYWViLT51Lmxpc3QpOwotCQlrbWVtX2NhY2hlX2ZyZWUoYWktPmFlYl9zbGFiX2NhY2hlLCB0bXBfYWViKTsKLQl9CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRtcF9hZWIsIF90bXBfYWViLCAmZnJlZSwgdS5saXN0KSB7CiAJCWxpc3RfZGVsKCZ0bXBfYWViLT51Lmxpc3QpOwogCQlrbWVtX2NhY2hlX2ZyZWUoYWktPmFlYl9zbGFiX2NhY2hlLCB0bXBfYWViKTsKQEAgLTg4NCw3ICs4NjQsNyBAQAogCV9fYmUzMiBjcmMsIHRtcF9jcmM7CiAJdW5zaWduZWQgbG9uZyBsb25nIHNxbnVtID0gMDsKIAotCW11dGV4X2xvY2soJnViaS0+Zm1fbXV0ZXgpOworCWRvd25fd3JpdGUoJnViaS0+Zm1fcHJvdGVjdCk7CiAJbWVtc2V0KHViaS0+Zm1fYnVmLCAwLCB1YmktPmZtX3NpemUpOwogCiAJZm1zYiA9IGttYWxsb2Moc2l6ZW9mKCpmbXNiKSwgR0ZQX0tFUk5FTCk7CkBAIC0xMDc1LDcgKzEwNTUsNyBAQAogCXViaV9mcmVlX3ZpZF9oZHIodWJpLCB2aCk7CiAJa2ZyZWUoZWNoKTsKIG91dDoKLQltdXRleF91bmxvY2soJnViaS0+Zm1fbXV0ZXgpOworCXVwX3dyaXRlKCZ1YmktPmZtX3Byb3RlY3QpOwogCWlmIChyZXQgPT0gVUJJX0JBRF9GQVNUTUFQKQogCQl1YmlfZXJyKHViaSwgIkF0dGFjaCBieSBmYXN0bWFwIGZhaWxlZCwgZG9pbmcgYSBmdWxsIHNjYW4hIik7CiAJcmV0dXJuIHJldDsKQEAgLTExMDcsMTMgKzEwODcsMTQgQEAKIAlzdHJ1Y3QgdWJpX2ZtX2VjICpmZWM7CiAJc3RydWN0IHViaV9mbV92b2xoZHIgKmZ2aDsKIAlzdHJ1Y3QgdWJpX2ZtX2ViYSAqZmViYTsKLQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICp3bF9lOwogCXN0cnVjdCB1Ymlfdm9sdW1lICp2b2w7CiAJc3RydWN0IHViaV92aWRfaGRyICphdmhkciwgKmR2aGRyOwogCXN0cnVjdCB1Ymlfd29yayAqdWJpX3dyazsKKwlzdHJ1Y3QgcmJfbm9kZSAqdG1wX3JiOwogCWludCByZXQsIGksIGosIGZyZWVfcGViX2NvdW50LCB1c2VkX3BlYl9jb3VudCwgdm9sX2NvdW50OwogCWludCBzY3J1Yl9wZWJfY291bnQsIGVyYXNlX3BlYl9jb3VudDsKKwlpbnQgKnNlZW5fcGVicyA9IE5VTEw7CiAKIAlmbV9yYXcgPSB1YmktPmZtX2J1ZjsKIAltZW1zZXQodWJpLT5mbV9idWYsIDAsIHViaS0+Zm1fc2l6ZSk7CkBAIC0xMTMwLDYgKzExMTEsMTIgQEAKIAkJZ290byBvdXRfa2ZyZWU7CiAJfQogCisJc2Vlbl9wZWJzID0gaW5pdF9zZWVuKHViaSk7CisJaWYgKElTX0VSUihzZWVuX3BlYnMpKSB7CisJCXJldCA9IFBUUl9FUlIoc2Vlbl9wZWJzKTsKKwkJZ290byBvdXRfa2ZyZWU7CisJfQorCiAJc3Bpbl9sb2NrKCZ1YmktPnZvbHVtZXNfbG9jayk7CiAJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOwogCkBAIC0xMTYwLDggKzExNDcsMTAgQEAKIAlmbXBsMS0+c2l6ZSA9IGNwdV90b19iZTE2KHViaS0+Zm1fcG9vbC5zaXplKTsKIAlmbXBsMS0+bWF4X3NpemUgPSBjcHVfdG9fYmUxNih1YmktPmZtX3Bvb2wubWF4X3NpemUpOwogCi0JZm9yIChpID0gMDsgaSA8IHViaS0+Zm1fcG9vbC5zaXplOyBpKyspCisJZm9yIChpID0gMDsgaSA8IHViaS0+Zm1fcG9vbC5zaXplOyBpKyspIHsKIAkJZm1wbDEtPnBlYnNbaV0gPSBjcHVfdG9fYmUzMih1YmktPmZtX3Bvb2wucGVic1tpXSk7CisJCXNldF9zZWVuKHViaSwgdWJpLT5mbV9wb29sLnBlYnNbaV0sIHNlZW5fcGVicyk7CisJfQogCiAJZm1wbDIgPSAoc3RydWN0IHViaV9mbV9zY2FuX3Bvb2wgKikoZm1fcmF3ICsgZm1fcG9zKTsKIAlmbV9wb3MgKz0gc2l6ZW9mKCpmbXBsMik7CkBAIC0xMTY5LDE0ICsxMTU4LDE2IEBACiAJZm1wbDItPnNpemUgPSBjcHVfdG9fYmUxNih1YmktPmZtX3dsX3Bvb2wuc2l6ZSk7CiAJZm1wbDItPm1heF9zaXplID0gY3B1X3RvX2JlMTYodWJpLT5mbV93bF9wb29sLm1heF9zaXplKTsKIAotCWZvciAoaSA9IDA7IGkgPCB1YmktPmZtX3dsX3Bvb2wuc2l6ZTsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCB1YmktPmZtX3dsX3Bvb2wuc2l6ZTsgaSsrKSB7CiAJCWZtcGwyLT5wZWJzW2ldID0gY3B1X3RvX2JlMzIodWJpLT5mbV93bF9wb29sLnBlYnNbaV0pOworCQlzZXRfc2Vlbih1YmksIHViaS0+Zm1fd2xfcG9vbC5wZWJzW2ldLCBzZWVuX3BlYnMpOworCX0KIAotCWZvciAobm9kZSA9IHJiX2ZpcnN0KCZ1YmktPmZyZWUpOyBub2RlOyBub2RlID0gcmJfbmV4dChub2RlKSkgewotCQl3bF9lID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHViaV93bF9lbnRyeSwgdS5yYik7CisJdWJpX2Zvcl9lYWNoX2ZyZWVfcGViKHViaSwgd2xfZSwgdG1wX3JiKSB7CiAJCWZlYyA9IChzdHJ1Y3QgdWJpX2ZtX2VjICopKGZtX3JhdyArIGZtX3Bvcyk7CiAKIAkJZmVjLT5wbnVtID0gY3B1X3RvX2JlMzIod2xfZS0+cG51bSk7CisJCXNldF9zZWVuKHViaSwgd2xfZS0+cG51bSwgc2Vlbl9wZWJzKTsKIAkJZmVjLT5lYyA9IGNwdV90b19iZTMyKHdsX2UtPmVjKTsKIAogCQlmcmVlX3BlYl9jb3VudCsrOwpAQCAtMTE4NSwxMSArMTE3NiwxMSBAQAogCX0KIAlmbWgtPmZyZWVfcGViX2NvdW50ID0gY3B1X3RvX2JlMzIoZnJlZV9wZWJfY291bnQpOwogCi0JZm9yIChub2RlID0gcmJfZmlyc3QoJnViaS0+dXNlZCk7IG5vZGU7IG5vZGUgPSByYl9uZXh0KG5vZGUpKSB7Ci0JCXdsX2UgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgdWJpX3dsX2VudHJ5LCB1LnJiKTsKKwl1YmlfZm9yX2VhY2hfdXNlZF9wZWIodWJpLCB3bF9lLCB0bXBfcmIpIHsKIAkJZmVjID0gKHN0cnVjdCB1YmlfZm1fZWMgKikoZm1fcmF3ICsgZm1fcG9zKTsKIAogCQlmZWMtPnBudW0gPSBjcHVfdG9fYmUzMih3bF9lLT5wbnVtKTsKKwkJc2V0X3NlZW4odWJpLCB3bF9lLT5wbnVtLCBzZWVuX3BlYnMpOwogCQlmZWMtPmVjID0gY3B1X3RvX2JlMzIod2xfZS0+ZWMpOwogCiAJCXVzZWRfcGViX2NvdW50Kys7CkBAIC0xMTk3LDI1ICsxMTg4LDI0IEBACiAJCXViaV9hc3NlcnQoZm1fcG9zIDw9IHViaS0+Zm1fc2l6ZSk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IFVCSV9QUk9UX1FVRVVFX0xFTjsgaSsrKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkod2xfZSwgJnViaS0+cHFbaV0sIHUubGlzdCkgewotCQkJZmVjID0gKHN0cnVjdCB1YmlfZm1fZWMgKikoZm1fcmF3ICsgZm1fcG9zKTsKLQotCQkJZmVjLT5wbnVtID0gY3B1X3RvX2JlMzIod2xfZS0+cG51bSk7Ci0JCQlmZWMtPmVjID0gY3B1X3RvX2JlMzIod2xfZS0+ZWMpOwotCi0JCQl1c2VkX3BlYl9jb3VudCsrOwotCQkJZm1fcG9zICs9IHNpemVvZigqZmVjKTsKLQkJCXViaV9hc3NlcnQoZm1fcG9zIDw9IHViaS0+Zm1fc2l6ZSk7Ci0JCX0KLQl9Ci0JZm1oLT51c2VkX3BlYl9jb3VudCA9IGNwdV90b19iZTMyKHVzZWRfcGViX2NvdW50KTsKLQotCWZvciAobm9kZSA9IHJiX2ZpcnN0KCZ1YmktPnNjcnViKTsgbm9kZTsgbm9kZSA9IHJiX25leHQobm9kZSkpIHsKLQkJd2xfZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCB1Ymlfd2xfZW50cnksIHUucmIpOworCXViaV9mb3JfZWFjaF9wcm90ZWN0ZWRfcGViKHViaSwgaSwgd2xfZSkgewogCQlmZWMgPSAoc3RydWN0IHViaV9mbV9lYyAqKShmbV9yYXcgKyBmbV9wb3MpOwogCiAJCWZlYy0+cG51bSA9IGNwdV90b19iZTMyKHdsX2UtPnBudW0pOworCQlzZXRfc2Vlbih1YmksIHdsX2UtPnBudW0sIHNlZW5fcGVicyk7CisJCWZlYy0+ZWMgPSBjcHVfdG9fYmUzMih3bF9lLT5lYyk7CisKKwkJdXNlZF9wZWJfY291bnQrKzsKKwkJZm1fcG9zICs9IHNpemVvZigqZmVjKTsKKwkJdWJpX2Fzc2VydChmbV9wb3MgPD0gdWJpLT5mbV9zaXplKTsKKwl9CisJZm1oLT51c2VkX3BlYl9jb3VudCA9IGNwdV90b19iZTMyKHVzZWRfcGViX2NvdW50KTsKKworCXViaV9mb3JfZWFjaF9zY3J1Yl9wZWIodWJpLCB3bF9lLCB0bXBfcmIpIHsKKwkJZmVjID0gKHN0cnVjdCB1YmlfZm1fZWMgKikoZm1fcmF3ICsgZm1fcG9zKTsKKworCQlmZWMtPnBudW0gPSBjcHVfdG9fYmUzMih3bF9lLT5wbnVtKTsKKwkJc2V0X3NlZW4odWJpLCB3bF9lLT5wbnVtLCBzZWVuX3BlYnMpOwogCQlmZWMtPmVjID0gY3B1X3RvX2JlMzIod2xfZS0+ZWMpOwogCiAJCXNjcnViX3BlYl9jb3VudCsrOwpAQCAtMTIzMyw2ICsxMjIzLDcgQEAKIAkJCWZlYyA9IChzdHJ1Y3QgdWJpX2ZtX2VjICopKGZtX3JhdyArIGZtX3Bvcyk7CiAKIAkJCWZlYy0+cG51bSA9IGNwdV90b19iZTMyKHdsX2UtPnBudW0pOworCQkJc2V0X3NlZW4odWJpLCB3bF9lLT5wbnVtLCBzZWVuX3BlYnMpOwogCQkJZmVjLT5lYyA9IGNwdV90b19iZTMyKHdsX2UtPmVjKTsKIAogCQkJZXJhc2VfcGViX2NvdW50Kys7CkBAIC0xMjkyLDYgKzEyODMsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG5ld19mbS0+dXNlZF9ibG9ja3M7IGkrKykgewogCQlmbXNiLT5ibG9ja19sb2NbaV0gPSBjcHVfdG9fYmUzMihuZXdfZm0tPmVbaV0tPnBudW0pOworCQlzZXRfc2Vlbih1YmksIG5ld19mbS0+ZVtpXS0+cG51bSwgc2Vlbl9wZWJzKTsKIAkJZm1zYi0+YmxvY2tfZWNbaV0gPSBjcHVfdG9fYmUzMihuZXdfZm0tPmVbaV0tPmVjKTsKIAl9CiAKQEAgLTEzMjUsMTEgKzEzMTcsMTMgQEAKIAl1YmlfYXNzZXJ0KG5ld19mbSk7CiAJdWJpLT5mbSA9IG5ld19mbTsKIAorCXJldCA9IHNlbGZfY2hlY2tfc2Vlbih1YmksIHNlZW5fcGVicyk7CiAJZGJnX2JsZCgiZmFzdG1hcCB3cml0dGVuISIpOwogCiBvdXRfa2ZyZWU6CiAJdWJpX2ZyZWVfdmlkX2hkcih1YmksIGF2aGRyKTsKIAl1YmlfZnJlZV92aWRfaGRyKHViaSwgZHZoZHIpOworCWZyZWVfc2VlbihzZWVuX3BlYnMpOwogb3V0OgogCXJldHVybiByZXQ7CiB9CkBAIC0xMzg0LDMxICsxMzc4LDg3IEBACiAvKioKICAqIGludmFsaWRhdGVfZmFzdG1hcCAtIGRlc3Ryb3lzIGEgZmFzdG1hcC4KICAqIEB1Ymk6IFVCSSBkZXZpY2Ugb2JqZWN0Ci0gKiBAZm06IHRoZSBmYXN0bWFwIHRvIGJlIGRlc3Ryb3llZAogICoKKyAqIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IHVwb24gbmV4dCBVQkkgYXR0YWNoIGEgZnVsbCBzY2FuCisgKiBpcyBpc3N1ZWQuIFdlIG5lZWQgdGhpcyBpZiBVQkkgaXMgYWJvdXQgdG8gd3JpdGUgYSBuZXcgZmFzdG1hcAorICogYnV0IGlzIHVuYWJsZSB0byBkbyBzby4gSW4gdGhpcyBjYXNlIHdlIGhhdmUgdHdvIG9wdGlvbnM6CisgKiBhKSBNYWtlIHN1cmUgdGhhdCB0aGUgY3VycmVudCBmYXN0bWFwIHdpbGwgbm90IGJlIHVzdWVkIHVwb24KKyAqIGF0dGFjaCB0aW1lIGFuZCBjb250aW5lIG9yIGIpIGZhbGwgYmFjayB0byBSTyBtb2RlIHRvIGhhdmUgdGhlCisgKiBjdXJyZW50IGZhc3RtYXAgaW4gYSB2YWxpZCBzdGF0ZS4KICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCA8IDAgaW5kaWNhdGVzIGFuIGludGVybmFsIGVycm9yLgogICovCi1zdGF0aWMgaW50IGludmFsaWRhdGVfZmFzdG1hcChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLAotCQkJICAgICAgc3RydWN0IHViaV9mYXN0bWFwX2xheW91dCAqZm0pCitzdGF0aWMgaW50IGludmFsaWRhdGVfZmFzdG1hcChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQogewogCWludCByZXQ7Ci0Jc3RydWN0IHViaV92aWRfaGRyICp2aDsKKwlzdHJ1Y3QgdWJpX2Zhc3RtYXBfbGF5b3V0ICpmbTsKKwlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplOworCXN0cnVjdCB1YmlfdmlkX2hkciAqdmggPSBOVUxMOwogCi0JcmV0ID0gZXJhc2VfYmxvY2sodWJpLCBmbS0+ZVswXS0+cG51bSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7CisJaWYgKCF1YmktPmZtKQorCQlyZXR1cm4gMDsKKworCXViaS0+Zm0gPSBOVUxMOworCisJcmV0ID0gLUVOT01FTTsKKwlmbSA9IGt6YWxsb2Moc2l6ZW9mKCpmbSksIEdGUF9LRVJORUwpOworCWlmICghZm0pCisJCWdvdG8gb3V0OwogCiAJdmggPSBuZXdfZm1fdmhkcih1YmksIFVCSV9GTV9TQl9WT0xVTUVfSUQpOwogCWlmICghdmgpCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2ZtOwogCi0JLyogZGVsZXRpbmcgdGhlIGN1cnJlbnQgZmFzdG1hcCBTQiBpcyBub3QgZW5vdWdoLCBhbiBvbGQgU0IgbWF5IGV4aXN0LAotCSAqIHNvIGNyZWF0ZSBhIChjb3JydXB0ZWQpIFNCIHN1Y2ggdGhhdCBmYXN0bWFwIHdpbGwgZmluZCBpdCBhbmQgZmFsbAotCSAqIGJhY2sgdG8gc2Nhbm5pbmcgbW9kZSBpbiBhbnkgY2FzZSAqLworCXJldCA9IC1FTk9TUEM7CisJZSA9IHViaV93bF9nZXRfZm1fcGViKHViaSwgMSk7CisJaWYgKCFlKQorCQlnb3RvIG91dF9mcmVlX2ZtOworCisJLyoKKwkgKiBDcmVhdGUgZmFrZSBmYXN0bWFwIHN1Y2ggdGhhdCBVQkkgd2lsbCBmYWxsIGJhY2sKKwkgKiB0byBzY2FubmluZyBtb2RlLgorCSAqLwogCXZoLT5zcW51bSA9IGNwdV90b19iZTY0KHViaV9uZXh0X3NxbnVtKHViaSkpOwotCXJldCA9IHViaV9pb193cml0ZV92aWRfaGRyKHViaSwgZm0tPmVbMF0tPnBudW0sIHZoKTsKKwlyZXQgPSB1YmlfaW9fd3JpdGVfdmlkX2hkcih1YmksIGUtPnBudW0sIHZoKTsKKwlpZiAocmV0IDwgMCkgeworCQl1Ymlfd2xfcHV0X2ZtX3BlYih1YmksIGUsIDAsIDApOworCQlnb3RvIG91dF9mcmVlX2ZtOworCX0KIAorCWZtLT51c2VkX2Jsb2NrcyA9IDE7CisJZm0tPmVbMF0gPSBlOworCisJdWJpLT5mbSA9IGZtOworCitvdXQ6CisJdWJpX2ZyZWVfdmlkX2hkcih1YmksIHZoKTsKIAlyZXR1cm4gcmV0OworCitvdXRfZnJlZV9mbToKKwlrZnJlZShmbSk7CisJZ290byBvdXQ7Cit9CisKKy8qKgorICogcmV0dXJuX2ZtX3BlYnMgLSByZXR1cm5zIGFsbCBQRUJzIHVzZWQgYnkgYSBmYXN0bWFwIGJhY2sgdG8gdGhlCisgKiBXTCBzdWItc3lzdGVtLgorICogQHViaTogVUJJIGRldmljZSBvYmplY3QKKyAqIEBmbTogZmFzdG1hcCBsYXlvdXQgb2JqZWN0CisgKi8KK3N0YXRpYyB2b2lkIHJldHVybl9mbV9wZWJzKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksCisJCQkgICBzdHJ1Y3QgdWJpX2Zhc3RtYXBfbGF5b3V0ICpmbSkKK3sKKwlpbnQgaTsKKworCWlmICghZm0pCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBmbS0+dXNlZF9ibG9ja3M7IGkrKykgeworCQlpZiAoZm0tPmVbaV0pIHsKKwkJCXViaV93bF9wdXRfZm1fcGViKHViaSwgZm0tPmVbaV0sIGksCisJCQkJCSAgZm0tPnRvX2JlX3RvcnR1cmVkW2ldKTsKKwkJCWZtLT5lW2ldID0gTlVMTDsKKwkJfQorCX0KIH0KIAogLyoqCkBAIC0xNDIwLDQ1ICsxNDcwLDMyIEBACiAgKi8KIGludCB1YmlfdXBkYXRlX2Zhc3RtYXAoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKIHsKLQlpbnQgcmV0LCBpOworCWludCByZXQsIGksIGo7CiAJc3RydWN0IHViaV9mYXN0bWFwX2xheW91dCAqbmV3X2ZtLCAqb2xkX2ZtOwogCXN0cnVjdCB1Ymlfd2xfZW50cnkgKnRtcF9lOwogCi0JbXV0ZXhfbG9jaygmdWJpLT5mbV9tdXRleCk7CisJZG93bl93cml0ZSgmdWJpLT5mbV9wcm90ZWN0KTsKIAogCXViaV9yZWZpbGxfcG9vbHModWJpKTsKIAogCWlmICh1YmktPnJvX21vZGUgfHwgdWJpLT5mbV9kaXNhYmxlZCkgewotCQltdXRleF91bmxvY2soJnViaS0+Zm1fbXV0ZXgpOworCQl1cF93cml0ZSgmdWJpLT5mbV9wcm90ZWN0KTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJcmV0ID0gdWJpX2Vuc3VyZV9hbmNob3JfcGVicyh1YmkpOwogCWlmIChyZXQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZ1YmktPmZtX211dGV4KTsKKwkJdXBfd3JpdGUoJnViaS0+Zm1fcHJvdGVjdCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJbmV3X2ZtID0ga3phbGxvYyhzaXplb2YoKm5ld19mbSksIEdGUF9LRVJORUwpOwogCWlmICghbmV3X2ZtKSB7Ci0JCW11dGV4X3VubG9jaygmdWJpLT5mbV9tdXRleCk7CisJCXVwX3dyaXRlKCZ1YmktPmZtX3Byb3RlY3QpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAluZXdfZm0tPnVzZWRfYmxvY2tzID0gdWJpLT5mbV9zaXplIC8gdWJpLT5sZWJfc2l6ZTsKLQotCWZvciAoaSA9IDA7IGkgPCBuZXdfZm0tPnVzZWRfYmxvY2tzOyBpKyspIHsKLQkJbmV3X2ZtLT5lW2ldID0ga21lbV9jYWNoZV9hbGxvYyh1Ymlfd2xfZW50cnlfc2xhYiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmV3X2ZtLT5lW2ldKSB7Ci0JCQl3aGlsZSAoaS0tKQotCQkJCWtmcmVlKG5ld19mbS0+ZVtpXSk7Ci0KLQkJCWtmcmVlKG5ld19mbSk7Ci0JCQltdXRleF91bmxvY2soJnViaS0+Zm1fbXV0ZXgpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0KIAlvbGRfZm0gPSB1YmktPmZtOwogCXViaS0+Zm0gPSBOVUxMOwogCkBAIC0xNDczLDM3ICsxNTEwLDQ5IEBACiAJCXRtcF9lID0gdWJpX3dsX2dldF9mbV9wZWIodWJpLCAwKTsKIAkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CiAKLQkJaWYgKCF0bXBfZSAmJiAhb2xkX2ZtKSB7Ci0JCQlpbnQgajsKLQkJCXViaV9lcnIodWJpLCAiY291bGQgbm90IGdldCBhbnkgZnJlZSBlcmFzZSBibG9jayIpOworCQlpZiAoIXRtcF9lKSB7CisJCQlpZiAob2xkX2ZtICYmIG9sZF9mbS0+ZVtpXSkgeworCQkJCXJldCA9IGVyYXNlX2Jsb2NrKHViaSwgb2xkX2ZtLT5lW2ldLT5wbnVtKTsKKwkJCQlpZiAocmV0IDwgMCkgeworCQkJCQl1YmlfZXJyKHViaSwgImNvdWxkIG5vdCBlcmFzZSBvbGQgZmFzdG1hcCBQRUIiKTsKIAotCQkJZm9yIChqID0gMTsgaiA8IGk7IGorKykKLQkJCQl1Ymlfd2xfcHV0X2ZtX3BlYih1YmksIG5ld19mbS0+ZVtqXSwgaiwgMCk7CisJCQkJCWZvciAoaiA9IDE7IGogPCBpOyBqKyspIHsKKwkJCQkJCXViaV93bF9wdXRfZm1fcGViKHViaSwgbmV3X2ZtLT5lW2pdLAorCQkJCQkJCQkgIGosIDApOworCQkJCQkJbmV3X2ZtLT5lW2pdID0gTlVMTDsKKwkJCQkJfQorCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQkJbmV3X2ZtLT5lW2ldID0gb2xkX2ZtLT5lW2ldOworCQkJCW9sZF9mbS0+ZVtpXSA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCXViaV9lcnIodWJpLCAiY291bGQgbm90IGdldCBhbnkgZnJlZSBlcmFzZSBibG9jayIpOwogCi0JCQlyZXQgPSAtRU5PU1BDOwotCQkJZ290byBlcnI7Ci0JCX0gZWxzZSBpZiAoIXRtcF9lICYmIG9sZF9mbSkgewotCQkJcmV0ID0gZXJhc2VfYmxvY2sodWJpLCBvbGRfZm0tPmVbaV0tPnBudW0pOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlpbnQgajsKKwkJCQlmb3IgKGogPSAxOyBqIDwgaTsgaisrKSB7CisJCQkJCXViaV93bF9wdXRfZm1fcGViKHViaSwgbmV3X2ZtLT5lW2pdLCBqLCAwKTsKKwkJCQkJbmV3X2ZtLT5lW2pdID0gTlVMTDsKKwkJCQl9CiAKLQkJCQlmb3IgKGogPSAxOyBqIDwgaTsgaisrKQotCQkJCQl1Ymlfd2xfcHV0X2ZtX3BlYih1YmksIG5ld19mbS0+ZVtqXSwKLQkJCQkJCQkgIGosIDApOwotCi0JCQkJdWJpX2Vycih1YmksICJjb3VsZCBub3QgZXJhc2Ugb2xkIGZhc3RtYXAgUEVCIik7CisJCQkJcmV0ID0gLUVOT1NQQzsKIAkJCQlnb3RvIGVycjsKIAkJCX0KLQotCQkJbmV3X2ZtLT5lW2ldLT5wbnVtID0gb2xkX2ZtLT5lW2ldLT5wbnVtOwotCQkJbmV3X2ZtLT5lW2ldLT5lYyA9IG9sZF9mbS0+ZVtpXS0+ZWM7CiAJCX0gZWxzZSB7Ci0JCQluZXdfZm0tPmVbaV0tPnBudW0gPSB0bXBfZS0+cG51bTsKLQkJCW5ld19mbS0+ZVtpXS0+ZWMgPSB0bXBfZS0+ZWM7CisJCQluZXdfZm0tPmVbaV0gPSB0bXBfZTsKIAotCQkJaWYgKG9sZF9mbSkKKwkJCWlmIChvbGRfZm0gJiYgb2xkX2ZtLT5lW2ldKSB7CiAJCQkJdWJpX3dsX3B1dF9mbV9wZWIodWJpLCBvbGRfZm0tPmVbaV0sIGksCiAJCQkJCQkgIG9sZF9mbS0+dG9fYmVfdG9ydHVyZWRbaV0pOworCQkJCW9sZF9mbS0+ZVtpXSA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisKKwkvKiBPbGQgZmFzdG1hcCBpcyBsYXJnZXIgdGhhbiB0aGUgbmV3IG9uZSAqLworCWlmIChvbGRfZm0gJiYgbmV3X2ZtLT51c2VkX2Jsb2NrcyA8IG9sZF9mbS0+dXNlZF9ibG9ja3MpIHsKKwkJZm9yIChpID0gbmV3X2ZtLT51c2VkX2Jsb2NrczsgaSA8IG9sZF9mbS0+dXNlZF9ibG9ja3M7IGkrKykgeworCQkJdWJpX3dsX3B1dF9mbV9wZWIodWJpLCBvbGRfZm0tPmVbaV0sIGksCisJCQkJCSAgb2xkX2ZtLT50b19iZV90b3J0dXJlZFtpXSk7CisJCQlvbGRfZm0tPmVbaV0gPSBOVUxMOwogCQl9CiAJfQogCkBAIC0xNTE2LDY3ICsxNTY1LDY3IEBACiAJCWlmICghdG1wX2UpIHsKIAkJCXJldCA9IGVyYXNlX2Jsb2NrKHViaSwgb2xkX2ZtLT5lWzBdLT5wbnVtKTsKIAkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJaW50IGk7CiAJCQkJdWJpX2Vycih1YmksICJjb3VsZCBub3QgZXJhc2Ugb2xkIGFuY2hvciBQRUIiKTsKIAotCQkJCWZvciAoaSA9IDE7IGkgPCBuZXdfZm0tPnVzZWRfYmxvY2tzOyBpKyspCisJCQkJZm9yIChpID0gMTsgaSA8IG5ld19mbS0+dXNlZF9ibG9ja3M7IGkrKykgewogCQkJCQl1Ymlfd2xfcHV0X2ZtX3BlYih1YmksIG5ld19mbS0+ZVtpXSwKIAkJCQkJCQkgIGksIDApOworCQkJCQluZXdfZm0tPmVbaV0gPSBOVUxMOworCQkJCX0KIAkJCQlnb3RvIGVycjsKIAkJCX0KLQotCQkJbmV3X2ZtLT5lWzBdLT5wbnVtID0gb2xkX2ZtLT5lWzBdLT5wbnVtOworCQkJbmV3X2ZtLT5lWzBdID0gb2xkX2ZtLT5lWzBdOwogCQkJbmV3X2ZtLT5lWzBdLT5lYyA9IHJldDsKKwkJCW9sZF9mbS0+ZVswXSA9IE5VTEw7CiAJCX0gZWxzZSB7CiAJCQkvKiB3ZSd2ZSBnb3QgYSBuZXcgYW5jaG9yIFBFQiwgcmV0dXJuIHRoZSBvbGQgb25lICovCiAJCQl1Ymlfd2xfcHV0X2ZtX3BlYih1YmksIG9sZF9mbS0+ZVswXSwgMCwKIAkJCQkJICBvbGRfZm0tPnRvX2JlX3RvcnR1cmVkWzBdKTsKLQotCQkJbmV3X2ZtLT5lWzBdLT5wbnVtID0gdG1wX2UtPnBudW07Ci0JCQluZXdfZm0tPmVbMF0tPmVjID0gdG1wX2UtPmVjOworCQkJbmV3X2ZtLT5lWzBdID0gdG1wX2U7CisJCQlvbGRfZm0tPmVbMF0gPSBOVUxMOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKCF0bXBfZSkgewotCQkJaW50IGk7CiAJCQl1YmlfZXJyKHViaSwgImNvdWxkIG5vdCBmaW5kIGFueSBhbmNob3IgUEVCIik7CiAKLQkJCWZvciAoaSA9IDE7IGkgPCBuZXdfZm0tPnVzZWRfYmxvY2tzOyBpKyspCisJCQlmb3IgKGkgPSAxOyBpIDwgbmV3X2ZtLT51c2VkX2Jsb2NrczsgaSsrKSB7CiAJCQkJdWJpX3dsX3B1dF9mbV9wZWIodWJpLCBuZXdfZm0tPmVbaV0sIGksIDApOworCQkJCW5ld19mbS0+ZVtpXSA9IE5VTEw7CisJCQl9CiAKIAkJCXJldCA9IC1FTk9TUEM7CiAJCQlnb3RvIGVycjsKIAkJfQotCi0JCW5ld19mbS0+ZVswXS0+cG51bSA9IHRtcF9lLT5wbnVtOwotCQluZXdfZm0tPmVbMF0tPmVjID0gdG1wX2UtPmVjOworCQluZXdfZm0tPmVbMF0gPSB0bXBfZTsKIAl9CiAKIAlkb3duX3dyaXRlKCZ1YmktPndvcmtfc2VtKTsKLQlkb3duX3dyaXRlKCZ1YmktPmZtX3NlbSk7CisJZG93bl93cml0ZSgmdWJpLT5mbV9lYmFfc2VtKTsKIAlyZXQgPSB1Ymlfd3JpdGVfZmFzdG1hcCh1YmksIG5ld19mbSk7Ci0JdXBfd3JpdGUoJnViaS0+Zm1fc2VtKTsKKwl1cF93cml0ZSgmdWJpLT5mbV9lYmFfc2VtKTsKIAl1cF93cml0ZSgmdWJpLT53b3JrX3NlbSk7CiAKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAogb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJnViaS0+Zm1fbXV0ZXgpOworCXVwX3dyaXRlKCZ1YmktPmZtX3Byb3RlY3QpOwogCWtmcmVlKG9sZF9mbSk7CiAJcmV0dXJuIHJldDsKIAogZXJyOgotCWtmcmVlKG5ld19mbSk7Ci0KIAl1Ymlfd2Fybih1YmksICJVbmFibGUgdG8gd3JpdGUgbmV3IGZhc3RtYXAsIGVycj0laSIsIHJldCk7CiAKLQlyZXQgPSAwOwotCWlmIChvbGRfZm0pIHsKLQkJcmV0ID0gaW52YWxpZGF0ZV9mYXN0bWFwKHViaSwgb2xkX2ZtKTsKLQkJaWYgKHJldCA8IDApCi0JCQl1YmlfZXJyKHViaSwgIlVuYWJsZSB0byBpbnZhbGlkaWF0ZSBjdXJyZW50IGZhc3RtYXAhIik7Ci0JCWVsc2UgaWYgKHJldCkKLQkJCXJldCA9IDA7CisJcmV0ID0gaW52YWxpZGF0ZV9mYXN0bWFwKHViaSk7CisJaWYgKHJldCA8IDApIHsKKwkJdWJpX2Vycih1YmksICJVbmFibGUgdG8gaW52YWxpZGlhdGUgY3VycmVudCBmYXN0bWFwISIpOworCQl1Ymlfcm9fbW9kZSh1YmkpOworCX0gZWxzZSB7CisJCXJldHVybl9mbV9wZWJzKHViaSwgb2xkX2ZtKTsKKwkJcmV0dXJuX2ZtX3BlYnModWJpLCBuZXdfZm0pOworCQlyZXQgPSAwOwogCX0KKworCWtmcmVlKG5ld19mbSk7CiAJZ290byBvdXRfdW5sb2NrOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL2lvLmMgYi9kcml2ZXJzL210ZC91YmkvaW8uYwppbmRleCBlZDBiY2IzLi41YmJkMWYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvaW8uYworKysgYi9kcml2ZXJzL210ZC91YmkvaW8uYwpAQCAtODU5LDYgKzg1OSw5IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAorCWlmICh1YmlfZGJnX3Bvd2VyX2N1dCh1YmksIFBPV0VSX0NVVF9FQ19XUklURSkpCisJCXJldHVybiAtRVJPRlM7CisKIAllcnIgPSB1YmlfaW9fd3JpdGUodWJpLCBlY19oZHIsIHBudW0sIDAsIHViaS0+ZWNfaGRyX2Fsc2l6ZSk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTExMDYsNiArMTEwOSw5IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAorCWlmICh1YmlfZGJnX3Bvd2VyX2N1dCh1YmksIFBPV0VSX0NVVF9WSURfV1JJVEUpKQorCQlyZXR1cm4gLUVST0ZTOworCiAJcCA9IChjaGFyICopdmlkX2hkciAtIHViaS0+dmlkX2hkcl9zaGlmdDsKIAllcnIgPSB1YmlfaW9fd3JpdGUodWJpLCBwLCBwbnVtLCB1YmktPnZpZF9oZHJfYWxvZmZzZXQsCiAJCQkgICB1YmktPnZpZF9oZHJfYWxzaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL3ViaS91YmktbWVkaWEuaCBiL2RyaXZlcnMvbXRkL3ViaS91YmktbWVkaWEuaAppbmRleCBhYzJiMjRkLi5kMGQwNzJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91YmkvdWJpLW1lZGlhLmgKKysrIGIvZHJpdmVycy9tdGQvdWJpL3ViaS1tZWRpYS5oCkBAIC00MDMsOCArNDAzLDYgQEAKICNkZWZpbmUgVUJJX0ZNX01JTl9QT09MX1NJWkUJOAogI2RlZmluZSBVQklfRk1fTUFYX1BPT0xfU0laRQkyNTYKIAotI2RlZmluZSBVQklfRk1fV0xfUE9PTF9TSVpFCTI1Ci0KIC8qKgogICogc3RydWN0IHViaV9mbV9zYiAtIFVCSSBmYXN0bWFwIHN1cGVyIGJsb2NrCiAgKiBAbWFnaWM6IGZhc3RtYXAgc3VwZXIgYmxvY2sgbWFnaWMgbnVtYmVyICglVUJJX0ZNX1NCX01BR0lDKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3ViaS5oIGIvZHJpdmVycy9tdGQvdWJpL3ViaS5oCmluZGV4IGM1YmU4MmQuLmM5OTgyMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL3ViaS91YmkuaAorKysgYi9kcml2ZXJzL210ZC91YmkvdWJpLmgKQEAgLTE1MSw2ICsxNTEsMTcgQEAKIAlVQklfQkFEX0ZBU1RNQVAsCiB9OwogCisvKgorICogRmxhZ3MgZm9yIGVtdWxhdGVfcG93ZXJfY3V0IGluIHViaV9kZWJ1Z19pbmZvCisgKgorICogUE9XRVJfQ1VUX0VDX1dSSVRFOiBFbXVsYXRlIGEgcG93ZXIgY3V0IHdoZW4gd3JpdGluZyBhbiBFQyBoZWFkZXIKKyAqIFBPV0VSX0NVVF9WSURfV1JJVEU6IEVtdWxhdGUgYSBwb3dlciBjdXQgd2hlbiB3cml0aW5nIGEgVklEIGhlYWRlcgorICovCitlbnVtIHsKKwlQT1dFUl9DVVRfRUNfV1JJVEUgPSAweDAxLAorCVBPV0VSX0NVVF9WSURfV1JJVEUgPSAweDAyLAorfTsKKwogLyoqCiAgKiBzdHJ1Y3QgdWJpX3dsX2VudHJ5IC0gd2Vhci1sZXZlbGluZyBlbnRyeS4KICAqIEB1LnJiOiBsaW5rIGluIHRoZSBjb3JyZXNwb25kaW5nIChmcmVlL3VzZWQpIFJCLXRyZWUKQEAgLTM1NiwzMCArMzY3LDQ4IEBACiAgKgogICogQGNoa19nZW46IGlmIFVCSSBnZW5lcmFsIGV4dHJhIGNoZWNrcyBhcmUgZW5hYmxlZAogICogQGNoa19pbzogaWYgVUJJIEkvTyBleHRyYSBjaGVja3MgYXJlIGVuYWJsZWQKKyAqIEBjaGtfZmFzdG1hcDogaWYgVUJJIGZhc3RtYXAgZXh0cmEgY2hlY2tzIGFyZSBlbmFibGVkCiAgKiBAZGlzYWJsZV9iZ3Q6IGRpc2FibGUgdGhlIGJhY2tncm91bmQgdGFzayBmb3IgdGVzdGluZyBwdXJwb3NlcwogICogQGVtdWxhdGVfYml0ZmxpcHM6IGVtdWxhdGUgYml0LWZsaXBzIGZvciB0ZXN0aW5nIHB1cnBvc2VzCiAgKiBAZW11bGF0ZV9pb19mYWlsdXJlczogZW11bGF0ZSB3cml0ZS9lcmFzZSBmYWlsdXJlcyBmb3IgdGVzdGluZyBwdXJwb3NlcworICogQGVtdWxhdGVfcG93ZXJfY3V0OiBlbXVsYXRlIHBvd2VyIGN1dCBmb3IgdGVzdGluZyBwdXJwb3NlcworICogQHBvd2VyX2N1dF9jb3VudGVyOiBjb3VudCBkb3duIGZvciB3cml0ZXMgbGVmdCB1bnRpbCBlbXVsYXRlZCBwb3dlciBjdXQKKyAqIEBwb3dlcl9jdXRfbWluOiBtaW5pbXVtIG51bWJlciBvZiB3cml0ZXMgYmVmb3JlIGVtdWxhdGluZyBhIHBvd2VyIGN1dAorICogQHBvd2VyX2N1dF9tYXg6IG1heGltdW0gbnVtYmVyIG9mIHdyaXRlcyB1bnRpbCBlbXVsYXRpbmcgYSBwb3dlciBjdXQKICAqIEBkZnNfZGlyX25hbWU6IG5hbWUgb2YgZGVidWdmcyBkaXJlY3RvcnkgY29udGFpbmluZyBmaWxlcyBvZiB0aGlzIFVCSSBkZXZpY2UKICAqIEBkZnNfZGlyOiBkaXJlbnRyeSBvYmplY3Qgb2YgdGhlIFVCSSBkZXZpY2UgZGVidWdmcyBkaXJlY3RvcnkKICAqIEBkZnNfY2hrX2dlbjogZGVidWdmcyBrbm9iIHRvIGVuYWJsZSBVQkkgZ2VuZXJhbCBleHRyYSBjaGVja3MKICAqIEBkZnNfY2hrX2lvOiBkZWJ1Z2ZzIGtub2IgdG8gZW5hYmxlIFVCSSBJL08gZXh0cmEgY2hlY2tzCisgKiBAZGZzX2Noa19mYXN0bWFwOiBkZWJ1Z2ZzIGtub2IgdG8gZW5hYmxlIFVCSSBmYXN0bWFwIGV4dHJhIGNoZWNrcwogICogQGRmc19kaXNhYmxlX2JndDogZGVidWdmcyBrbm9iIHRvIGRpc2FibGUgdGhlIGJhY2tncm91bmQgdGFzawogICogQGRmc19lbXVsYXRlX2JpdGZsaXBzOiBkZWJ1Z2ZzIGtub2IgdG8gZW11bGF0ZSBiaXQtZmxpcHMKICAqIEBkZnNfZW11bGF0ZV9pb19mYWlsdXJlczogZGVidWdmcyBrbm9iIHRvIGVtdWxhdGUgd3JpdGUvZXJhc2UgZmFpbHVyZXMKKyAqIEBkZnNfZW11bGF0ZV9wb3dlcl9jdXQ6IGRlYnVnZnMga25vYiB0byBlbXVsYXRlIHBvd2VyIGN1dHMKKyAqIEBkZnNfcG93ZXJfY3V0X21pbjogZGVidWdmcyBrbm9iIGZvciBtaW5pbXVtIHdyaXRlcyBiZWZvcmUgcG93ZXIgY3V0CisgKiBAZGZzX3Bvd2VyX2N1dF9tYXg6IGRlYnVnZnMga25vYiBmb3IgbWF4aW11bSB3cml0ZXMgdW50aWwgcG93ZXIgY3V0CiAgKi8KIHN0cnVjdCB1YmlfZGVidWdfaW5mbyB7CiAJdW5zaWduZWQgaW50IGNoa19nZW46MTsKIAl1bnNpZ25lZCBpbnQgY2hrX2lvOjE7CisJdW5zaWduZWQgaW50IGNoa19mYXN0bWFwOjE7CiAJdW5zaWduZWQgaW50IGRpc2FibGVfYmd0OjE7CiAJdW5zaWduZWQgaW50IGVtdWxhdGVfYml0ZmxpcHM6MTsKIAl1bnNpZ25lZCBpbnQgZW11bGF0ZV9pb19mYWlsdXJlczoxOworCXVuc2lnbmVkIGludCBlbXVsYXRlX3Bvd2VyX2N1dDoyOworCXVuc2lnbmVkIGludCBwb3dlcl9jdXRfY291bnRlcjsKKwl1bnNpZ25lZCBpbnQgcG93ZXJfY3V0X21pbjsKKwl1bnNpZ25lZCBpbnQgcG93ZXJfY3V0X21heDsKIAljaGFyIGRmc19kaXJfbmFtZVtVQklfREZTX0RJUl9MRU4gKyAxXTsKIAlzdHJ1Y3QgZGVudHJ5ICpkZnNfZGlyOwogCXN0cnVjdCBkZW50cnkgKmRmc19jaGtfZ2VuOwogCXN0cnVjdCBkZW50cnkgKmRmc19jaGtfaW87CisJc3RydWN0IGRlbnRyeSAqZGZzX2Noa19mYXN0bWFwOwogCXN0cnVjdCBkZW50cnkgKmRmc19kaXNhYmxlX2JndDsKIAlzdHJ1Y3QgZGVudHJ5ICpkZnNfZW11bGF0ZV9iaXRmbGlwczsKIAlzdHJ1Y3QgZGVudHJ5ICpkZnNfZW11bGF0ZV9pb19mYWlsdXJlczsKKwlzdHJ1Y3QgZGVudHJ5ICpkZnNfZW11bGF0ZV9wb3dlcl9jdXQ7CisJc3RydWN0IGRlbnRyeSAqZGZzX3Bvd2VyX2N1dF9taW47CisJc3RydWN0IGRlbnRyeSAqZGZzX3Bvd2VyX2N1dF9tYXg7CiB9OwogCiAvKioKQEAgLTQyNiwxMSArNDU1LDEzIEBACiAgKiBAZm1fcG9vbDogaW4tbWVtb3J5IGRhdGEgc3RydWN0dXJlIG9mIHRoZSBmYXN0bWFwIHBvb2wKICAqIEBmbV93bF9wb29sOiBpbi1tZW1vcnkgZGF0YSBzdHJ1Y3R1cmUgb2YgdGhlIGZhc3RtYXAgcG9vbCB1c2VkIGJ5IHRoZSBXTAogICoJCXN1Yi1zeXN0ZW0KLSAqIEBmbV9tdXRleDogc2VyaWFsaXplcyB1YmlfdXBkYXRlX2Zhc3RtYXAoKSBhbmQgcHJvdGVjdHMgQGZtX2J1ZgorICogQGZtX3Byb3RlY3Q6IHNlcmlhbGl6ZXMgdWJpX3VwZGF0ZV9mYXN0bWFwKCksIHByb3RlY3RzIEBmbV9idWYgYW5kIG1ha2VzIHN1cmUKKyAqIHRoYXQgY3JpdGljYWwgc2VjdGlvbnMgY2Fubm90IGJlIGludGVycnVwdGVkIGJ5IHViaV91cGRhdGVfZmFzdG1hcCgpCiAgKiBAZm1fYnVmOiB2bWFsbG9jKCknZCBidWZmZXIgd2hpY2ggaG9sZHMgdGhlIHJhdyBmYXN0bWFwCiAgKiBAZm1fc2l6ZTogZmFzdG1hcCBzaXplIGluIGJ5dGVzCi0gKiBAZm1fc2VtOiBhbGxvd3MgdWJpX3VwZGF0ZV9mYXN0bWFwKCkgdG8gYmxvY2sgRUJBIHRhYmxlIGNoYW5nZXMKKyAqIEBmbV9lYmFfc2VtOiBhbGxvd3MgdWJpX3VwZGF0ZV9mYXN0bWFwKCkgdG8gYmxvY2sgRUJBIHRhYmxlIGNoYW5nZXMKICAqIEBmbV93b3JrOiBmYXN0bWFwIHdvcmsgcXVldWUKKyAqIEBmbV93b3JrX3NjaGVkdWxlZDogbm9uLXplcm8gaWYgZmFzdG1hcCB3b3JrIHdhcyBzY2hlZHVsZWQKICAqCiAgKiBAdXNlZDogUkItdHJlZSBvZiB1c2VkIHBoeXNpY2FsIGVyYXNlYmxvY2tzCiAgKiBAZXJyb25lb3VzOiBSQi10cmVlIG9mIGVycm9uZW91cyB1c2VkIHBoeXNpY2FsIGVyYXNlYmxvY2tzCkBAIC00NDIsNyArNDczLDggQEAKICAqIEBwcV9oZWFkOiBwcm90ZWN0aW9uIHF1ZXVlIGhlYWQKICAqIEB3bF9sb2NrOiBwcm90ZWN0cyB0aGUgQHVzZWQsIEBmcmVlLCBAcHEsIEBwcV9oZWFkLCBAbG9va3VwdGJsLCBAbW92ZV9mcm9tLAogICoJICAgICBAbW92ZV90bywgQG1vdmVfdG9fcHV0IEBlcmFzZV9wZW5kaW5nLCBAd2xfc2NoZWR1bGVkLCBAd29ya3MsCi0gKgkgICAgIEBlcnJvbmVvdXMsIGFuZCBAZXJyb25lb3VzX3BlYl9jb3VudCBmaWVsZHMKKyAqCSAgICAgQGVycm9uZW91cywgQGVycm9uZW91c19wZWJfY291bnQsIEBmbV93b3JrX3NjaGVkdWxlZCwgQGZtX3Bvb2wsCisgKgkgICAgIGFuZCBAZm1fd2xfcG9vbCBmaWVsZHMKICAqIEBtb3ZlX211dGV4OiBzZXJpYWxpemVzIGVyYXNlYmxvY2sgbW92ZXMKICAqIEB3b3JrX3NlbTogdXNlZCB0byB3YWl0IGZvciBhbGwgdGhlIHNjaGVkdWxlZCB3b3JrcyB0byBmaW5pc2ggYW5kIHByZXZlbnQKICAqIG5ldyB3b3JrcyBmcm9tIGJlaW5nIHN1Ym1pdHRlZApAQCAtNDc5LDcgKzUxMSw3IEBACiAgKiBAdmlkX2hkcl9vZmZzZXQ6IHN0YXJ0aW5nIG9mZnNldCBvZiB0aGUgdm9sdW1lIGlkZW50aWZpZXIgaGVhZGVyIChtaWdodCBiZQogICogICAgICAgICAgICAgICAgICB1bmFsaWduZWQpCiAgKiBAdmlkX2hkcl9hbG9mZnNldDogc3RhcnRpbmcgb2Zmc2V0IG9mIHRoZSBWSUQgaGVhZGVyIGFsaWduZWQgdG8KLSAqIEBoZHJzX21pbl9pb19zaXplCisgKiAgICAgICAgICAgICAgICAgICAgQGhkcnNfbWluX2lvX3NpemUKICAqIEB2aWRfaGRyX3NoaWZ0OiBjb250YWlucyBAdmlkX2hkcl9vZmZzZXQgLSBAdmlkX2hkcl9hbG9mZnNldAogICogQGJhZF9hbGxvd2VkOiB3aGV0aGVyIHRoZSBNVEQgZGV2aWNlIGFkbWl0cyBvZiBiYWQgcGh5c2ljYWwgZXJhc2VibG9ja3Mgb3IKICAqICAgICAgICAgICAgICAgbm90CkBAIC01MzIsMTEgKzU2NCwxMiBAQAogCXN0cnVjdCB1YmlfZmFzdG1hcF9sYXlvdXQgKmZtOwogCXN0cnVjdCB1YmlfZm1fcG9vbCBmbV9wb29sOwogCXN0cnVjdCB1YmlfZm1fcG9vbCBmbV93bF9wb29sOwotCXN0cnVjdCByd19zZW1hcGhvcmUgZm1fc2VtOwotCXN0cnVjdCBtdXRleCBmbV9tdXRleDsKKwlzdHJ1Y3Qgcndfc2VtYXBob3JlIGZtX2ViYV9zZW07CisJc3RydWN0IHJ3X3NlbWFwaG9yZSBmbV9wcm90ZWN0OwogCXZvaWQgKmZtX2J1ZjsKIAlzaXplX3QgZm1fc2l6ZTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZm1fd29yazsKKwlpbnQgZm1fd29ya19zY2hlZHVsZWQ7CiAKIAkvKiBXZWFyLWxldmVsaW5nIHN1Yi1zeXN0ZW0ncyBzdHVmZiAqLwogCXN0cnVjdCByYl9yb290IHVzZWQ7CkBAIC04NjgsMTAgKzkwMSwxNCBAQAogCQkgICAgICBpbnQgcG51bSwgY29uc3Qgc3RydWN0IHViaV92aWRfaGRyICp2aWRfaGRyKTsKIAogLyogZmFzdG1hcC5jICovCisjaWZkZWYgQ09ORklHX01URF9VQklfRkFTVE1BUAogc2l6ZV90IHViaV9jYWxjX2ZtX3NpemUoc3RydWN0IHViaV9kZXZpY2UgKnViaSk7CiBpbnQgdWJpX3VwZGF0ZV9mYXN0bWFwKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpOwogaW50IHViaV9zY2FuX2Zhc3RtYXAoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV9hdHRhY2hfaW5mbyAqYWksCiAJCSAgICAgaW50IGZtX2FuY2hvcik7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgdWJpX3VwZGF0ZV9mYXN0bWFwKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgogCiAvKiBibG9jay5jICovCiAjaWZkZWYgQ09ORklHX01URF9VQklfQkxPQ0sKQEAgLTg5Miw2ICs5MjksNDIgQEAKIH0KICNlbmRpZgogCisvKgorICogdWJpX2Zvcl9lYWNoX2ZyZWVfcGViIC0gd2FsayB0aGUgVUJJIGZyZWUgUkIgdHJlZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CisgKiBAZTogYSBwb2ludGVyIHRvIGEgdWJpX3dsX2VudHJ5IHRvIHVzZSBhcyBjdXJzb3IKKyAqIEBwb3M6IGEgcG9pbnRlciB0byBSQi10cmVlIGVudHJ5IHR5cGUgdG8gdXNlIGFzIGEgbG9vcCBjb3VudGVyCisgKi8KKyNkZWZpbmUgdWJpX2Zvcl9lYWNoX2ZyZWVfcGViKHViaSwgZSwgdG1wX3JiKQlcCisJdWJpX3JiX2Zvcl9lYWNoX2VudHJ5KCh0bXBfcmIpLCAoZSksICYodWJpKS0+ZnJlZSwgdS5yYikKKworLyoKKyAqIHViaV9mb3JfZWFjaF91c2VkX3BlYiAtIHdhbGsgdGhlIFVCSSB1c2VkIFJCIHRyZWUuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQGU6IGEgcG9pbnRlciB0byBhIHViaV93bF9lbnRyeSB0byB1c2UgYXMgY3Vyc29yCisgKiBAcG9zOiBhIHBvaW50ZXIgdG8gUkItdHJlZSBlbnRyeSB0eXBlIHRvIHVzZSBhcyBhIGxvb3AgY291bnRlcgorICovCisjZGVmaW5lIHViaV9mb3JfZWFjaF91c2VkX3BlYih1YmksIGUsIHRtcF9yYikJXAorCXViaV9yYl9mb3JfZWFjaF9lbnRyeSgodG1wX3JiKSwgKGUpLCAmKHViaSktPnVzZWQsIHUucmIpCisKKy8qCisgKiB1YmlfZm9yX2VhY2hfc2N1Yl9wZWIgLSB3YWxrIHRoZSBVQkkgc2N1YiBSQiB0cmVlLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBlOiBhIHBvaW50ZXIgdG8gYSB1Ymlfd2xfZW50cnkgdG8gdXNlIGFzIGN1cnNvcgorICogQHBvczogYSBwb2ludGVyIHRvIFJCLXRyZWUgZW50cnkgdHlwZSB0byB1c2UgYXMgYSBsb29wIGNvdW50ZXIKKyAqLworI2RlZmluZSB1YmlfZm9yX2VhY2hfc2NydWJfcGViKHViaSwgZSwgdG1wX3JiKQlcCisJdWJpX3JiX2Zvcl9lYWNoX2VudHJ5KCh0bXBfcmIpLCAoZSksICYodWJpKS0+c2NydWIsIHUucmIpCisKKy8qCisgKiB1YmlfZm9yX2VhY2hfcHJvdGVjdGVkX3BlYiAtIHdhbGsgdGhlIFVCSSBwcm90ZWN0aW9uIHF1ZXVlLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqIEBpOiBhIGludGVnZXIgdXNlZCBhcyBjb3VudGVyCisgKiBAZTogYSBwb2ludGVyIHRvIGEgdWJpX3dsX2VudHJ5IHRvIHVzZSBhcyBjdXJzb3IKKyAqLworI2RlZmluZSB1YmlfZm9yX2VhY2hfcHJvdGVjdGVkX3BlYih1YmksIGksIGUpCVwKKwlmb3IgKChpKSA9IDA7IChpKSA8IFVCSV9QUk9UX1FVRVVFX0xFTjsgKGkpKyspCVwKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSgoZSksICYodWJpLT5wcVsoaSldKSwgdS5saXN0KQogCiAvKgogICogdWJpX3JiX2Zvcl9lYWNoX2VudHJ5IC0gd2FsayBhbiBSQi10cmVlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvdWJpL3dsLmMgYi9kcml2ZXJzL210ZC91Ymkvd2wuYwppbmRleCA4ZjdiZGU2Li4xNjIxNGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC91Ymkvd2wuYworKysgYi9kcml2ZXJzL210ZC91Ymkvd2wuYwpAQCAtMTAzLDYgKzEwMyw3IEBACiAjaW5jbHVkZSA8bGludXgvZnJlZXplci5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlICJ1YmkuaCIKKyNpbmNsdWRlICJ3bC5oIgogCiAvKiBOdW1iZXIgb2YgcGh5c2ljYWwgZXJhc2VibG9ja3MgcmVzZXJ2ZWQgZm9yIHdlYXItbGV2ZWxpbmcgcHVycG9zZXMgKi8KICNkZWZpbmUgV0xfUkVTRVJWRURfUEVCUyAxCkBAIC0xNDAsNDIgKzE0MSw2IEBACiBzdGF0aWMgaW50IHNlbGZfY2hlY2tfaW5fcHEoY29uc3Qgc3RydWN0IHViaV9kZXZpY2UgKnViaSwKIAkJCSAgICBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplKTsKIAotI2lmZGVmIENPTkZJR19NVERfVUJJX0ZBU1RNQVAKLS8qKgotICogdXBkYXRlX2Zhc3RtYXBfd29ya19mbiAtIGNhbGxzIHViaV91cGRhdGVfZmFzdG1hcCBmcm9tIGEgd29yayBxdWV1ZQotICogQHdyazogdGhlIHdvcmsgZGVzY3JpcHRpb24gb2JqZWN0Ci0gKi8KLXN0YXRpYyB2b2lkIHVwZGF0ZV9mYXN0bWFwX3dvcmtfZm4oc3RydWN0IHdvcmtfc3RydWN0ICp3cmspCi17Ci0Jc3RydWN0IHViaV9kZXZpY2UgKnViaSA9IGNvbnRhaW5lcl9vZih3cmssIHN0cnVjdCB1YmlfZGV2aWNlLCBmbV93b3JrKTsKLQl1YmlfdXBkYXRlX2Zhc3RtYXAodWJpKTsKLX0KLQotLyoqCi0gKiAgdWJpX3ViaV9pc19mbV9ibG9jayAtIHJldHVybnMgMSBpZiBhIFBFQiBpcyBjdXJyZW50bHkgdXNlZCBpbiBhIGZhc3RtYXAuCi0gKiAgQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKLSAqICBAcG51bTogdGhlIHRvIGJlIGNoZWNrZWQgUEVCCi0gKi8KLXN0YXRpYyBpbnQgdWJpX2lzX2ZtX2Jsb2NrKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBwbnVtKQotewotCWludCBpOwotCi0JaWYgKCF1YmktPmZtKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDA7IGkgPCB1YmktPmZtLT51c2VkX2Jsb2NrczsgaSsrKQotCQlpZiAodWJpLT5mbS0+ZVtpXS0+cG51bSA9PSBwbnVtKQotCQkJcmV0dXJuIDE7Ci0KLQlyZXR1cm4gMDsKLX0KLSNlbHNlCi1zdGF0aWMgaW50IHViaV9pc19mbV9ibG9jayhzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgcG51bSkKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgotCiAvKioKICAqIHdsX3RyZWVfYWRkIC0gYWRkIGEgd2Vhci1sZXZlbGluZyBlbnRyeSB0byBhIFdMIFJCLXRyZWUuCiAgKiBAZTogdGhlIHdlYXItbGV2ZWxpbmcgZW50cnkgdG8gYWRkCkBAIC0yMTMsNiArMTc4LDIwIEBACiB9CiAKIC8qKgorICogd2xfdHJlZV9kZXN0cm95IC0gZGVzdHJveSBhIHdlYXItbGV2ZWxpbmcgZW50cnkuCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICogQGU6IHRoZSB3ZWFyLWxldmVsaW5nIGVudHJ5IHRvIGFkZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZGVzdHJveXMgYSB3ZWFyIGxldmVsaW5nIGVudHJ5IGFuZCByZW1vdmVzCisgKiB0aGUgcmVmZXJlbmNlIGZyb20gdGhlIGxvb2t1cCB0YWJsZS4KKyAqLworc3RhdGljIHZvaWQgd2xfZW50cnlfZGVzdHJveShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplKQoreworCXViaS0+bG9va3VwdGJsW2UtPnBudW1dID0gTlVMTDsKKwlrbWVtX2NhY2hlX2ZyZWUodWJpX3dsX2VudHJ5X3NsYWIsIGUpOworfQorCisvKioKICAqIGRvX3dvcmsgLSBkbyBvbmUgcGVuZGluZyB3b3JrLgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqCkBAIC0yNjAsMzMgKzIzOSw2IEBACiB9CiAKIC8qKgotICogcHJvZHVjZV9mcmVlX3BlYiAtIHByb2R1Y2UgYSBmcmVlIHBoeXNpY2FsIGVyYXNlYmxvY2suCi0gKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAotICoKLSAqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gbWFrZSBhIGZyZWUgUEVCIGJ5IG1lYW5zIG9mIHN5bmNocm9ub3VzIGV4ZWN1dGlvbiBvZgotICogcGVuZGluZyB3b3Jrcy4gVGhpcyBtYXkgYmUgbmVlZGVkIGlmLCBmb3IgZXhhbXBsZSB0aGUgYmFja2dyb3VuZCB0aHJlYWQgaXMKLSAqIGRpc2FibGVkLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZQotICogb2YgZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBwcm9kdWNlX2ZyZWVfcGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCi17Ci0JaW50IGVycjsKLQotCXdoaWxlICghdWJpLT5mcmVlLnJiX25vZGUgJiYgdWJpLT53b3Jrc19jb3VudCkgewotCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKLQotCQlkYmdfd2woImRvIG9uZSB3b3JrIHN5bmNocm9ub3VzbHkiKTsKLQkJZXJyID0gZG9fd29yayh1YmkpOwotCi0JCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgogICogaW5fd2xfdHJlZSAtIGNoZWNrIGlmIHdlYXItbGV2ZWxpbmcgZW50cnkgaXMgcHJlc2VudCBpbiBhIFdMIFJCLXRyZWUuCiAgKiBAZTogdGhlIHdlYXItbGV2ZWxpbmcgZW50cnkgdG8gY2hlY2sKICAqIEByb290OiB0aGUgcm9vdCBvZiB0aGUgdHJlZQpAQCAtNDA5LDExOSArMzYxLDMyIEBACiAJaWYgKGxhc3QtPmVjIC0gZmlyc3QtPmVjIDwgV0xfRlJFRV9NQVhfRElGRikgewogCQllID0gcmJfZW50cnkocm9vdC0+cmJfbm9kZSwgc3RydWN0IHViaV93bF9lbnRyeSwgdS5yYik7CiAKLSNpZmRlZiBDT05GSUdfTVREX1VCSV9GQVNUTUFQCiAJCS8qIElmIG5vIGZhc3RtYXAgaGFzIGJlZW4gd3JpdHRlbiBhbmQgdGhpcyBXTCBlbnRyeSBjYW4gYmUgdXNlZAogCQkgKiBhcyBhbmNob3IgUEVCLCBob2xkIGl0IGJhY2sgYW5kIHJldHVybiB0aGUgc2Vjb25kIGJlc3QKIAkJICogV0wgZW50cnkgc3VjaCB0aGF0IGZhc3RtYXAgY2FuIHVzZSB0aGUgYW5jaG9yIFBFQiBsYXRlci4gKi8KLQkJaWYgKGUgJiYgIXViaS0+Zm1fZGlzYWJsZWQgJiYgIXViaS0+Zm0gJiYKLQkJICAgIGUtPnBudW0gPCBVQklfRk1fTUFYX1NUQVJUKQotCQkJZSA9IHJiX2VudHJ5KHJiX25leHQocm9vdC0+cmJfbm9kZSksCi0JCQkJICAgICBzdHJ1Y3QgdWJpX3dsX2VudHJ5LCB1LnJiKTsKLSNlbmRpZgorCQllID0gbWF5X3Jlc2VydmVfZm9yX2ZtKHViaSwgZSwgcm9vdCk7CiAJfSBlbHNlCiAJCWUgPSBmaW5kX3dsX2VudHJ5KHViaSwgcm9vdCwgV0xfRlJFRV9NQVhfRElGRi8yKTsKIAogCXJldHVybiBlOwogfQogCi0jaWZkZWYgQ09ORklHX01URF9VQklfRkFTVE1BUAogLyoqCi0gKiBmaW5kX2FuY2hvcl93bF9lbnRyeSAtIGZpbmQgd2Vhci1sZXZlbGluZyBlbnRyeSB0byB1c2VkIGFzIGFuY2hvciBQRUIuCi0gKiBAcm9vdDogdGhlIFJCLXRyZWUgd2hlcmUgdG8gbG9vayBmb3IKLSAqLwotc3RhdGljIHN0cnVjdCB1Ymlfd2xfZW50cnkgKmZpbmRfYW5jaG9yX3dsX2VudHJ5KHN0cnVjdCByYl9yb290ICpyb290KQotewotCXN0cnVjdCByYl9ub2RlICpwOwotCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmUsICp2aWN0aW0gPSBOVUxMOwotCWludCBtYXhfZWMgPSBVQklfTUFYX0VSQVNFQ09VTlRFUjsKLQotCXViaV9yYl9mb3JfZWFjaF9lbnRyeShwLCBlLCByb290LCB1LnJiKSB7Ci0JCWlmIChlLT5wbnVtIDwgVUJJX0ZNX01BWF9TVEFSVCAmJiBlLT5lYyA8IG1heF9lYykgewotCQkJdmljdGltID0gZTsKLQkJCW1heF9lYyA9IGUtPmVjOwotCQl9Ci0JfQotCi0JcmV0dXJuIHZpY3RpbTsKLX0KLQotc3RhdGljIGludCBhbmNob3JfcGVic19hdmFsaWJsZShzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqcDsKLQlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplOwotCi0JdWJpX3JiX2Zvcl9lYWNoX2VudHJ5KHAsIGUsIHJvb3QsIHUucmIpCi0JCWlmIChlLT5wbnVtIDwgVUJJX0ZNX01BWF9TVEFSVCkKLQkJCXJldHVybiAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogdWJpX3dsX2dldF9mbV9wZWIgLSBmaW5kIGEgcGh5c2ljYWwgZXJhc2UgYmxvY2sgd2l0aCBhIGdpdmVuIG1heGltYWwgbnVtYmVyLgotICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKLSAqIEBhbmNob3I6IFRoaXMgUEVCIHdpbGwgYmUgdXNlZCBhcyBhbmNob3IgUEVCIGJ5IGZhc3RtYXAKLSAqCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHBoeXNpY2FsIGVyYXNlIGJsb2NrIHdpdGggYSBnaXZlbiBtYXhpbWFsIG51bWJlcgotICogYW5kIHJlbW92ZXMgaXQgZnJvbSB0aGUgd2wgc3Vic3lzdGVtLgotICogTXVzdCBiZSBjYWxsZWQgd2l0aCB3bF9sb2NrIGhlbGQhCi0gKi8KLXN0cnVjdCB1Ymlfd2xfZW50cnkgKnViaV93bF9nZXRfZm1fcGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCBhbmNob3IpCi17Ci0Jc3RydWN0IHViaV93bF9lbnRyeSAqZSA9IE5VTEw7Ci0KLQlpZiAoIXViaS0+ZnJlZS5yYl9ub2RlIHx8ICh1YmktPmZyZWVfY291bnQgLSB1YmktPmJlYl9yc3ZkX3BlYnMgPCAxKSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoYW5jaG9yKQotCQllID0gZmluZF9hbmNob3Jfd2xfZW50cnkoJnViaS0+ZnJlZSk7Ci0JZWxzZQotCQllID0gZmluZF9tZWFuX3dsX2VudHJ5KHViaSwgJnViaS0+ZnJlZSk7Ci0KLQlpZiAoIWUpCi0JCWdvdG8gb3V0OwotCi0Jc2VsZl9jaGVja19pbl93bF90cmVlKHViaSwgZSwgJnViaS0+ZnJlZSk7Ci0KLQkvKiByZW1vdmUgaXQgZnJvbSB0aGUgZnJlZSBsaXN0LAotCSAqIHRoZSB3bCBzdWJzeXN0ZW0gZG9lcyBubyBsb25nZXIga25vdyB0aGlzIGVyYXNlIGJsb2NrICovCi0JcmJfZXJhc2UoJmUtPnUucmIsICZ1YmktPmZyZWUpOwotCXViaS0+ZnJlZV9jb3VudC0tOwotb3V0OgotCXJldHVybiBlOwotfQotI2VuZGlmCi0KLS8qKgotICogX193bF9nZXRfcGViIC0gZ2V0IGEgcGh5c2ljYWwgZXJhc2VibG9jay4KKyAqIHdsX2dldF93bGUgLSBnZXQgYSBtZWFuIHdsIGVudHJ5IHRvIGJlIHVzZWQgYnkgdWJpX3dsX2dldF9wZWIoKSBvcgorICogcmVmaWxsX3dsX3VzZXJfcG9vbCgpLgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwaHlzaWNhbCBlcmFzZWJsb2NrIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYQotICogbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBhIHdlYXIgbGV2ZWxpbmcgZW50cnkgaW4gY2FzZSBvZiBzdWNjZXNzIGFuZAorICogTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBpbnQgX193bF9nZXRfcGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCitzdGF0aWMgc3RydWN0IHViaV93bF9lbnRyeSAqd2xfZ2V0X3dsZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQogewotCWludCBlcnI7CiAJc3RydWN0IHViaV93bF9lbnRyeSAqZTsKIAotcmV0cnk6Ci0JaWYgKCF1YmktPmZyZWUucmJfbm9kZSkgewotCQlpZiAodWJpLT53b3Jrc19jb3VudCA9PSAwKSB7Ci0JCQl1YmlfZXJyKHViaSwgIm5vIGZyZWUgZXJhc2VibG9ja3MiKTsKLQkJCXViaV9hc3NlcnQobGlzdF9lbXB0eSgmdWJpLT53b3JrcykpOwotCQkJcmV0dXJuIC1FTk9TUEM7Ci0JCX0KLQotCQllcnIgPSBwcm9kdWNlX2ZyZWVfcGViKHViaSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQkJZ290byByZXRyeTsKLQl9Ci0KIAllID0gZmluZF9tZWFuX3dsX2VudHJ5KHViaSwgJnViaS0+ZnJlZSk7CiAJaWYgKCFlKSB7CiAJCXViaV9lcnIodWJpLCAibm8gZnJlZSBlcmFzZWJsb2NrcyIpOwotCQlyZXR1cm4gLUVOT1NQQzsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCiAJc2VsZl9jaGVja19pbl93bF90cmVlKHViaSwgZSwgJnViaS0+ZnJlZSk7CkBAIC01MzMsMTc0ICszOTgsMTAgQEAKIAlyYl9lcmFzZSgmZS0+dS5yYiwgJnViaS0+ZnJlZSk7CiAJdWJpLT5mcmVlX2NvdW50LS07CiAJZGJnX3dsKCJQRUIgJWQgRUMgJWQiLCBlLT5wbnVtLCBlLT5lYyk7Ci0jaWZuZGVmIENPTkZJR19NVERfVUJJX0ZBU1RNQVAKLQkvKiBXZSBoYXZlIHRvIGVucXVldWUgZSBvbmx5IGlmIGZhc3RtYXAgaXMgZGlzYWJsZWQsCi0JICogaXMgZmFzdG1hcCBlbmFibGVkIHByb3RfcXVldWVfYWRkKCkgd2lsbCBiZSBjYWxsZWQgYnkKLQkgKiB1Ymlfd2xfZ2V0X3BlYigpIGFmdGVyIHJlbW92aW5nIGUgZnJvbSB0aGUgcG9vbC4gKi8KLQlwcm90X3F1ZXVlX2FkZCh1YmksIGUpOwotI2VuZGlmCi0JcmV0dXJuIGUtPnBudW07Ci19Ci0KLSNpZmRlZiBDT05GSUdfTVREX1VCSV9GQVNUTUFQCi0vKioKLSAqIHJldHVybl91bnVzZWRfcG9vbF9wZWJzIC0gcmV0dXJucyB1bnVzZWQgUEVCIHRvIHRoZSBmcmVlIHRyZWUuCi0gKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAotICogQHBvb2w6IGZhc3RtYXAgcG9vbCBkZXNjcmlwdGlvbiBvYmplY3QKLSAqLwotc3RhdGljIHZvaWQgcmV0dXJuX3VudXNlZF9wb29sX3BlYnMoc3RydWN0IHViaV9kZXZpY2UgKnViaSwKLQkJCQkgICAgc3RydWN0IHViaV9mbV9wb29sICpwb29sKQotewotCWludCBpOwotCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmU7Ci0KLQlmb3IgKGkgPSBwb29sLT51c2VkOyBpIDwgcG9vbC0+c2l6ZTsgaSsrKSB7Ci0JCWUgPSB1YmktPmxvb2t1cHRibFtwb29sLT5wZWJzW2ldXTsKLQkJd2xfdHJlZV9hZGQoZSwgJnViaS0+ZnJlZSk7Ci0JCXViaS0+ZnJlZV9jb3VudCsrOwotCX0KLX0KLQotLyoqCi0gKiByZWZpbGxfd2xfcG9vbCAtIHJlZmlsbHMgYWxsIHRoZSBmYXN0bWFwIHBvb2wgdXNlZCBieSB0aGUKLSAqIFdMIHN1Yi1zeXN0ZW0uCi0gKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAotICovCi1zdGF0aWMgdm9pZCByZWZpbGxfd2xfcG9vbChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQotewotCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmU7Ci0Jc3RydWN0IHViaV9mbV9wb29sICpwb29sID0gJnViaS0+Zm1fd2xfcG9vbDsKLQotCXJldHVybl91bnVzZWRfcG9vbF9wZWJzKHViaSwgcG9vbCk7Ci0KLQlmb3IgKHBvb2wtPnNpemUgPSAwOyBwb29sLT5zaXplIDwgcG9vbC0+bWF4X3NpemU7IHBvb2wtPnNpemUrKykgewotCQlpZiAoIXViaS0+ZnJlZS5yYl9ub2RlIHx8Ci0JCSAgICh1YmktPmZyZWVfY291bnQgLSB1YmktPmJlYl9yc3ZkX3BlYnMgPCA1KSkKLQkJCWJyZWFrOwotCi0JCWUgPSBmaW5kX3dsX2VudHJ5KHViaSwgJnViaS0+ZnJlZSwgV0xfRlJFRV9NQVhfRElGRik7Ci0JCXNlbGZfY2hlY2tfaW5fd2xfdHJlZSh1YmksIGUsICZ1YmktPmZyZWUpOwotCQlyYl9lcmFzZSgmZS0+dS5yYiwgJnViaS0+ZnJlZSk7Ci0JCXViaS0+ZnJlZV9jb3VudC0tOwotCi0JCXBvb2wtPnBlYnNbcG9vbC0+c2l6ZV0gPSBlLT5wbnVtOwotCX0KLQlwb29sLT51c2VkID0gMDsKLX0KLQotLyoqCi0gKiByZWZpbGxfd2xfdXNlcl9wb29sIC0gcmVmaWxscyBhbGwgdGhlIGZhc3RtYXAgcG9vbCB1c2VkIGJ5IHViaV93bF9nZXRfcGViLgotICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKLSAqLwotc3RhdGljIHZvaWQgcmVmaWxsX3dsX3VzZXJfcG9vbChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQotewotCXN0cnVjdCB1YmlfZm1fcG9vbCAqcG9vbCA9ICZ1YmktPmZtX3Bvb2w7Ci0KLQlyZXR1cm5fdW51c2VkX3Bvb2xfcGVicyh1YmksIHBvb2wpOwotCi0JZm9yIChwb29sLT5zaXplID0gMDsgcG9vbC0+c2l6ZSA8IHBvb2wtPm1heF9zaXplOyBwb29sLT5zaXplKyspIHsKLQkJcG9vbC0+cGVic1twb29sLT5zaXplXSA9IF9fd2xfZ2V0X3BlYih1YmkpOwotCQlpZiAocG9vbC0+cGVic1twb29sLT5zaXplXSA8IDApCi0JCQlicmVhazsKLQl9Ci0JcG9vbC0+dXNlZCA9IDA7Ci19Ci0KLS8qKgotICogdWJpX3JlZmlsbF9wb29scyAtIHJlZmlsbHMgYWxsIGZhc3RtYXAgUEVCIHBvb2xzLgotICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKLSAqLwotdm9pZCB1YmlfcmVmaWxsX3Bvb2xzKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCi17Ci0Jc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOwotCXJlZmlsbF93bF9wb29sKHViaSk7Ci0JcmVmaWxsX3dsX3VzZXJfcG9vbCh1YmkpOwotCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOwotfQotCi0vKiB1Ymlfd2xfZ2V0X3BlYiAtIHdvcmtzIGV4YWNsdHkgbGlrZSBfX3dsX2dldF9wZWIgYnV0IGtlZXBzIHRyYWNrIG9mCi0gKiB0aGUgZmFzdG1hcCBwb29sLgotICovCi1pbnQgdWJpX3dsX2dldF9wZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCB1YmlfZm1fcG9vbCAqcG9vbCA9ICZ1YmktPmZtX3Bvb2w7Ci0Jc3RydWN0IHViaV9mbV9wb29sICp3bF9wb29sID0gJnViaS0+Zm1fd2xfcG9vbDsKLQotCWlmICghcG9vbC0+c2l6ZSB8fCAhd2xfcG9vbC0+c2l6ZSB8fCBwb29sLT51c2VkID09IHBvb2wtPnNpemUgfHwKLQkgICAgd2xfcG9vbC0+dXNlZCA9PSB3bF9wb29sLT5zaXplKQotCQl1YmlfdXBkYXRlX2Zhc3RtYXAodWJpKTsKLQotCS8qIHdlIGdvdCBub3QgYSBzaW5nbGUgZnJlZSBQRUIgKi8KLQlpZiAoIXBvb2wtPnNpemUpCi0JCXJldCA9IC1FTk9TUEM7Ci0JZWxzZSB7Ci0JCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKLQkJcmV0ID0gcG9vbC0+cGVic1twb29sLT51c2VkKytdOwotCQlwcm90X3F1ZXVlX2FkZCh1YmksIHViaS0+bG9va3VwdGJsW3JldF0pOwotCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBnZXRfcGViX2Zvcl93bCAtIHJldHVybnMgYSBQRUIgdG8gYmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBXTCBzdWItc3lzdGVtLgotICoKLSAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICpnZXRfcGViX2Zvcl93bChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQotewotCXN0cnVjdCB1YmlfZm1fcG9vbCAqcG9vbCA9ICZ1YmktPmZtX3dsX3Bvb2w7Ci0JaW50IHBudW07Ci0KLQlpZiAocG9vbC0+dXNlZCA9PSBwb29sLT5zaXplIHx8ICFwb29sLT5zaXplKSB7Ci0JCS8qIFdlIGNhbm5vdCB1cGRhdGUgdGhlIGZhc3RtYXAgaGVyZSBiZWNhdXNlIHRoaXMKLQkJICogZnVuY3Rpb24gaXMgY2FsbGVkIGluIGF0b21pYyBjb250ZXh0LgotCQkgKiBMZXQncyBmYWlsIGhlcmUgYW5kIHJlZmlsbC91cGRhdGUgaXQgYXMgc29vbiBhcyBwb3NzaWJsZS4gKi8KLQkJc2NoZWR1bGVfd29yaygmdWJpLT5mbV93b3JrKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlIHsKLQkJcG51bSA9IHBvb2wtPnBlYnNbcG9vbC0+dXNlZCsrXTsKLQkJcmV0dXJuIHViaS0+bG9va3VwdGJsW3BudW1dOwotCX0KLX0KLSNlbHNlCi1zdGF0aWMgc3RydWN0IHViaV93bF9lbnRyeSAqZ2V0X3BlYl9mb3Jfd2woc3RydWN0IHViaV9kZXZpY2UgKnViaSkKLXsKLQlzdHJ1Y3QgdWJpX3dsX2VudHJ5ICplOwotCi0JZSA9IGZpbmRfd2xfZW50cnkodWJpLCAmdWJpLT5mcmVlLCBXTF9GUkVFX01BWF9ESUZGKTsKLQlzZWxmX2NoZWNrX2luX3dsX3RyZWUodWJpLCBlLCAmdWJpLT5mcmVlKTsKLQl1YmktPmZyZWVfY291bnQtLTsKLQl1YmlfYXNzZXJ0KHViaS0+ZnJlZV9jb3VudCA+PSAwKTsKLQlyYl9lcmFzZSgmZS0+dS5yYiwgJnViaS0+ZnJlZSk7CiAKIAlyZXR1cm4gZTsKIH0KIAotaW50IHViaV93bF9nZXRfcGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCi17Ci0JaW50IHBlYiwgZXJyOwotCi0Jc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOwotCXBlYiA9IF9fd2xfZ2V0X3BlYih1YmkpOwotCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOwotCi0JaWYgKHBlYiA8IDApCi0JCXJldHVybiBwZWI7Ci0KLQllcnIgPSB1Ymlfc2VsZl9jaGVja19hbGxfZmYodWJpLCBwZWIsIHViaS0+dmlkX2hkcl9hbG9mZnNldCwKLQkJCQkgICAgdWJpLT5wZWJfc2l6ZSAtIHViaS0+dmlkX2hkcl9hbG9mZnNldCk7Ci0JaWYgKGVycikgewotCQl1YmlfZXJyKHViaSwgIm5ldyBQRUIgJWQgZG9lcyBub3QgY29udGFpbiBhbGwgMHhGRiBieXRlcyIsCi0JCQlwZWIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiBwZWI7Ci19Ci0jZW5kaWYKLQogLyoqCiAgKiBwcm90X3F1ZXVlX2RlbCAtIHJlbW92ZSBhIHBoeXNpY2FsIGVyYXNlYmxvY2sgZnJvbSB0aGUgcHJvdGVjdGlvbiBxdWV1ZS4KICAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CkBAIC04NjcsMTcgKzU2OCw2IEBACiBzdGF0aWMgaW50IGVyYXNlX3dvcmtlcihzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBzdHJ1Y3QgdWJpX3dvcmsgKndsX3dyaywKIAkJCWludCBzaHV0ZG93bik7CiAKLSNpZmRlZiBDT05GSUdfTVREX1VCSV9GQVNUTUFQCi0vKioKLSAqIHViaV9pc19lcmFzZV93b3JrIC0gY2hlY2tzIHdoZXRoZXIgYSB3b3JrIGlzIGVyYXNlIHdvcmsuCi0gKiBAd3JrOiBUaGUgd29yayBvYmplY3QgdG8gYmUgY2hlY2tlZAotICovCi1pbnQgdWJpX2lzX2VyYXNlX3dvcmsoc3RydWN0IHViaV93b3JrICp3cmspCi17Ci0JcmV0dXJuIHdyay0+ZnVuYyA9PSBlcmFzZV93b3JrZXI7Ci19Ci0jZW5kaWYKLQogLyoqCiAgKiBzY2hlZHVsZV9lcmFzZSAtIHNjaGVkdWxlIGFuIGVyYXNlIHdvcmsuCiAgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdApAQCAtODk1LDcgKzU4NSw2IEBACiAJc3RydWN0IHViaV93b3JrICp3bF93cms7CiAKIAl1YmlfYXNzZXJ0KGUpOwotCXViaV9hc3NlcnQoIXViaV9pc19mbV9ibG9jayh1YmksIGUtPnBudW0pKTsKIAogCWRiZ193bCgic2NoZWR1bGUgZXJhc3VyZSBvZiBQRUIgJWQsIEVDICVkLCB0b3J0dXJlICVkIiwKIAkgICAgICAgZS0+cG51bSwgZS0+ZWMsIHRvcnR1cmUpOwpAQCAtOTQyLDUxICs2MzEsNiBAQAogCXJldHVybiBlcmFzZV93b3JrZXIodWJpLCB3bF93cmssIDApOwogfQogCi0jaWZkZWYgQ09ORklHX01URF9VQklfRkFTVE1BUAotLyoqCi0gKiB1Ymlfd2xfcHV0X2ZtX3BlYiAtIHJldHVybnMgYSBQRUIgdXNlZCBpbiBhIGZhc3RtYXAgdG8gdGhlIHdlYXItbGV2ZWxpbmcKLSAqIHN1Yi1zeXN0ZW0uCi0gKiBzZWU6IHViaV93bF9wdXRfcGViKCkKLSAqCi0gKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAotICogQGZtX2U6IHBoeXNpY2FsIGVyYXNlYmxvY2sgdG8gcmV0dXJuCi0gKiBAbG51bTogdGhlIGxhc3QgdXNlZCBsb2dpY2FsIGVyYXNlYmxvY2sgbnVtYmVyIGZvciB0aGUgUEVCCi0gKiBAdG9ydHVyZTogaWYgdGhpcyBwaHlzaWNhbCBlcmFzZWJsb2NrIGhhcyB0byBiZSB0b3J0dXJlZAotICovCi1pbnQgdWJpX3dsX3B1dF9mbV9wZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHViaV93bF9lbnRyeSAqZm1fZSwKLQkJICAgICAgaW50IGxudW0sIGludCB0b3J0dXJlKQotewotCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmU7Ci0JaW50IHZvbF9pZCwgcG51bSA9IGZtX2UtPnBudW07Ci0KLQlkYmdfd2woIlBFQiAlZCIsIHBudW0pOwotCi0JdWJpX2Fzc2VydChwbnVtID49IDApOwotCXViaV9hc3NlcnQocG51bSA8IHViaS0+cGViX2NvdW50KTsKLQotCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKLQllID0gdWJpLT5sb29rdXB0YmxbcG51bV07Ci0KLQkvKiBUaGlzIGNhbiBoYXBwZW4gaWYgd2UgcmVjb3ZlcmVkIGZyb20gYSBmYXN0bWFwIHRoZSB2ZXJ5Ci0JICogZmlyc3QgdGltZSBhbmQgd3JpdGluZyBub3cgYSBuZXcgb25lLiBJbiB0aGlzIGNhc2UgdGhlIHdsIHN5c3RlbQotCSAqIGhhcyBuZXZlciBzZWVuIGFueSBQRUIgdXNlZCBieSB0aGUgb3JpZ2luYWwgZmFzdG1hcC4KLQkgKi8KLQlpZiAoIWUpIHsKLQkJZSA9IGZtX2U7Ci0JCXViaV9hc3NlcnQoZS0+ZWMgPj0gMCk7Ci0JCXViaS0+bG9va3VwdGJsW3BudW1dID0gZTsKLQl9IGVsc2UgewotCQllLT5lYyA9IGZtX2UtPmVjOwotCQlrZnJlZShmbV9lKTsKLQl9Ci0KLQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKLQotCXZvbF9pZCA9IGxudW0gPyBVQklfRk1fREFUQV9WT0xVTUVfSUQgOiBVQklfRk1fU0JfVk9MVU1FX0lEOwotCXJldHVybiBzY2hlZHVsZV9lcmFzZSh1YmksIGUsIHZvbF9pZCwgbG51bSwgdG9ydHVyZSk7Ci19Ci0jZW5kaWYKLQogLyoqCiAgKiB3ZWFyX2xldmVsaW5nX3dvcmtlciAtIHdlYXItbGV2ZWxpbmcgd29ya2VyIGZ1bmN0aW9uLgogICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKQEAgLTEwMDIsNyArNjQ2LDcgQEAKIAkJCQlpbnQgc2h1dGRvd24pCiB7CiAJaW50IGVyciwgc2NydWJiaW5nID0gMCwgdG9ydHVyZSA9IDAsIHByb3RlY3QgPSAwLCBlcnJvbmVvdXMgPSAwOwotCWludCB2b2xfaWQgPSAtMSwgdW5pbml0aWFsaXplZF92YXIobG51bSk7CisJaW50IHZvbF9pZCA9IC0xLCBsbnVtID0gLTE7CiAjaWZkZWYgQ09ORklHX01URF9VQklfRkFTVE1BUAogCWludCBhbmNob3IgPSB3cmstPmFuY2hvcjsKICNlbmRpZgpAQCAtMTIxNCw3ICs4NTgsNyBAQAogCWVyciA9IGRvX3N5bmNfZXJhc2UodWJpLCBlMSwgdm9sX2lkLCBsbnVtLCAwKTsKIAlpZiAoZXJyKSB7CiAJCWlmIChlMikKLQkJCWttZW1fY2FjaGVfZnJlZSh1Ymlfd2xfZW50cnlfc2xhYiwgZTIpOworCQkJd2xfZW50cnlfZGVzdHJveSh1YmksIGUyKTsKIAkJZ290byBvdXRfcm87CiAJfQogCkBAIC0xMjgyLDggKzkyNiw4IEBACiAJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CiAKIAl1YmlfZnJlZV92aWRfaGRyKHViaSwgdmlkX2hkcik7Ci0Ja21lbV9jYWNoZV9mcmVlKHViaV93bF9lbnRyeV9zbGFiLCBlMSk7Ci0Ja21lbV9jYWNoZV9mcmVlKHViaV93bF9lbnRyeV9zbGFiLCBlMik7CisJd2xfZW50cnlfZGVzdHJveSh1YmksIGUxKTsKKwl3bF9lbnRyeV9kZXN0cm95KHViaSwgZTIpOwogCiBvdXRfcm86CiAJdWJpX3JvX21vZGUodWJpKTsKQEAgLTEzNjksMzggKzEwMTMsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZmRlZiBDT05GSUdfTVREX1VCSV9GQVNUTUFQCi0vKioKLSAqIHViaV9lbnN1cmVfYW5jaG9yX3BlYnMgLSBzY2hlZHVsZSB3ZWFyLWxldmVsaW5nIHRvIHByb2R1Y2UgYW4gYW5jaG9yIFBFQi4KLSAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0Ci0gKi8KLWludCB1YmlfZW5zdXJlX2FuY2hvcl9wZWJzKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCi17Ci0Jc3RydWN0IHViaV93b3JrICp3cms7Ci0KLQlzcGluX2xvY2soJnViaS0+d2xfbG9jayk7Ci0JaWYgKHViaS0+d2xfc2NoZWR1bGVkKSB7Ci0JCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOwotCQlyZXR1cm4gMDsKLQl9Ci0JdWJpLT53bF9zY2hlZHVsZWQgPSAxOwotCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOwotCi0Jd3JrID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHViaV93b3JrKSwgR0ZQX05PRlMpOwotCWlmICghd3JrKSB7Ci0JCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKLQkJdWJpLT53bF9zY2hlZHVsZWQgPSAwOwotCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jd3JrLT5hbmNob3IgPSAxOwotCXdyay0+ZnVuYyA9ICZ3ZWFyX2xldmVsaW5nX3dvcmtlcjsKLQlzY2hlZHVsZV91Ymlfd29yayh1YmksIHdyayk7Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogLyoqCiAgKiBlcmFzZV93b3JrZXIgLSBwaHlzaWNhbCBlcmFzZWJsb2NrIGVyYXNlIHdvcmtlciBmdW5jdGlvbi4KICAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CkBAIC0xNDI1LDE1ICsxMDM3LDEzIEBACiAJaWYgKHNodXRkb3duKSB7CiAJCWRiZ193bCgiY2FuY2VsIGVyYXN1cmUgb2YgUEVCICVkIEVDICVkIiwgcG51bSwgZS0+ZWMpOwogCQlrZnJlZSh3bF93cmspOwotCQlrbWVtX2NhY2hlX2ZyZWUodWJpX3dsX2VudHJ5X3NsYWIsIGUpOworCQl3bF9lbnRyeV9kZXN0cm95KHViaSwgZSk7CiAJCXJldHVybiAwOwogCX0KIAogCWRiZ193bCgiZXJhc2UgUEVCICVkIEVDICVkIExFQiAlZDolZCIsCiAJICAgICAgIHBudW0sIGUtPmVjLCB3bF93cmstPnZvbF9pZCwgd2xfd3JrLT5sbnVtKTsKIAotCXViaV9hc3NlcnQoIXViaV9pc19mbV9ibG9jayh1YmksIGUtPnBudW0pKTsKLQogCWVyciA9IHN5bmNfZXJhc2UodWJpLCBlLCB3bF93cmstPnRvcnR1cmUpOwogCWlmICghZXJyKSB7CiAJCS8qIEZpbmUsIHdlJ3ZlIGVyYXNlZCBpdCBzdWNjZXNzZnVsbHkgKi8KQEAgLTE0NzEsNyArMTA4MSw3IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0Ja21lbV9jYWNoZV9mcmVlKHViaV93bF9lbnRyeV9zbGFiLCBlKTsKKwl3bF9lbnRyeV9kZXN0cm95KHViaSwgZSk7CiAJaWYgKGVyciAhPSAtRUlPKQogCQkvKgogCQkgKiBJZiB0aGlzIGlzIG5vdCAlLUVJTywgd2UgaGF2ZSBubyBpZGVhIHdoYXQgdG8gZG8uIFNjaGVkdWxpbmcKQEAgLTE1NjMsNiArMTE3Myw4IEBACiAJdWJpX2Fzc2VydChwbnVtID49IDApOwogCXViaV9hc3NlcnQocG51bSA8IHViaS0+cGViX2NvdW50KTsKIAorCWRvd25fcmVhZCgmdWJpLT5mbV9wcm90ZWN0KTsKKwogcmV0cnk6CiAJc3Bpbl9sb2NrKCZ1YmktPndsX2xvY2spOwogCWUgPSB1YmktPmxvb2t1cHRibFtwbnVtXTsKQEAgLTE1OTMsNiArMTIwNSw3IEBACiAJCXViaV9hc3NlcnQoIXViaS0+bW92ZV90b19wdXQpOwogCQl1YmktPm1vdmVfdG9fcHV0ID0gMTsKIAkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJCXVwX3JlYWQoJnViaS0+Zm1fcHJvdGVjdCk7CiAJCXJldHVybiAwOwogCX0gZWxzZSB7CiAJCWlmIChpbl93bF90cmVlKGUsICZ1YmktPnVzZWQpKSB7CkBAIC0xNjE0LDYgKzEyMjcsNyBAQAogCQkJCXViaV9lcnIodWJpLCAiUEVCICVkIG5vdCBmb3VuZCIsIHBudW0pOwogCQkJCXViaV9yb19tb2RlKHViaSk7CiAJCQkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJCQkJdXBfcmVhZCgmdWJpLT5mbV9wcm90ZWN0KTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQogCQl9CkBAIC0xNjI3LDYgKzEyNDEsNyBAQAogCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKIAl9CiAKKwl1cF9yZWFkKCZ1YmktPmZtX3Byb3RlY3QpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTE3NTgsOSArMTM3MywxMCBAQAogCiAvKioKICAqIHRyZWVfZGVzdHJveSAtIGRlc3Ryb3kgYW4gUkItdHJlZS4KKyAqIEB1Ymk6IFVCSSBkZXZpY2UgZGVzY3JpcHRpb24gb2JqZWN0CiAgKiBAcm9vdDogdGhlIHJvb3Qgb2YgdGhlIHRyZWUgdG8gZGVzdHJveQogICovCi1zdGF0aWMgdm9pZCB0cmVlX2Rlc3Ryb3koc3RydWN0IHJiX3Jvb3QgKnJvb3QpCitzdGF0aWMgdm9pZCB0cmVlX2Rlc3Ryb3koc3RydWN0IHViaV9kZXZpY2UgKnViaSwgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCiB7CiAJc3RydWN0IHJiX25vZGUgKnJiOwogCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmU7CkBAIC0xNzgyLDcgKzEzOTgsNyBAQAogCQkJCQlyYi0+cmJfcmlnaHQgPSBOVUxMOwogCQkJfQogCi0JCQlrbWVtX2NhY2hlX2ZyZWUodWJpX3dsX2VudHJ5X3NsYWIsIGUpOworCQkJd2xfZW50cnlfZGVzdHJveSh1YmksIGUpOwogCQl9CiAJfQogfQpAQCAtMTg1MCw2ICsxNDY2LDkgQEAKICAqLwogc3RhdGljIHZvaWQgc2h1dGRvd25fd29yayhzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKQogeworI2lmZGVmIENPTkZJR19NVERfVUJJX0ZBU1RNQVAKKwlmbHVzaF93b3JrKCZ1YmktPmZtX3dvcmspOworI2VuZGlmCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZ1YmktPndvcmtzKSkgewogCQlzdHJ1Y3QgdWJpX3dvcmsgKndyazsKIApAQCAtMTg4Myw5ICsxNTAyLDYgQEAKIAlpbml0X3J3c2VtKCZ1YmktPndvcmtfc2VtKTsKIAl1YmktPm1heF9lYyA9IGFpLT5tYXhfZWM7CiAJSU5JVF9MSVNUX0hFQUQoJnViaS0+d29ya3MpOwotI2lmZGVmIENPTkZJR19NVERfVUJJX0ZBU1RNQVAKLQlJTklUX1dPUksoJnViaS0+Zm1fd29yaywgdXBkYXRlX2Zhc3RtYXBfd29ya19mbik7Ci0jZW5kaWYKIAogCXNwcmludGYodWJpLT5iZ3RfbmFtZSwgVUJJX0JHVF9OQU1FX1BBVFRFUk4sIHViaS0+dWJpX251bSk7CiAKQEAgLTE5MDcsMTAgKzE1MjMsOSBAQAogCiAJCWUtPnBudW0gPSBhZWItPnBudW07CiAJCWUtPmVjID0gYWViLT5lYzsKLQkJdWJpX2Fzc2VydCghdWJpX2lzX2ZtX2Jsb2NrKHViaSwgZS0+cG51bSkpOwogCQl1YmktPmxvb2t1cHRibFtlLT5wbnVtXSA9IGU7CiAJCWlmIChzY2hlZHVsZV9lcmFzZSh1YmksIGUsIGFlYi0+dm9sX2lkLCBhZWItPmxudW0sIDApKSB7Ci0JCQlrbWVtX2NhY2hlX2ZyZWUodWJpX3dsX2VudHJ5X3NsYWIsIGUpOworCQkJd2xfZW50cnlfZGVzdHJveSh1YmksIGUpOwogCQkJZ290byBvdXRfZnJlZTsKIAkJfQogCkBAIC0xOTI4LDcgKzE1NDMsNiBAQAogCQllLT5wbnVtID0gYWViLT5wbnVtOwogCQllLT5lYyA9IGFlYi0+ZWM7CiAJCXViaV9hc3NlcnQoZS0+ZWMgPj0gMCk7Ci0JCXViaV9hc3NlcnQoIXViaV9pc19mbV9ibG9jayh1YmksIGUtPnBudW0pKTsKIAogCQl3bF90cmVlX2FkZChlLCAmdWJpLT5mcmVlKTsKIAkJdWJpLT5mcmVlX2NvdW50Kys7CkBAIC0xOTY2LDE3ICsxNTgwLDIwIEBACiAKIAlkYmdfd2woImZvdW5kICVpIFBFQnMiLCBmb3VuZF9wZWJzKTsKIAotCWlmICh1YmktPmZtKQorCWlmICh1YmktPmZtKSB7CiAJCXViaV9hc3NlcnQodWJpLT5nb29kX3BlYl9jb3VudCA9PSBcCiAJCQkgICBmb3VuZF9wZWJzICsgdWJpLT5mbS0+dXNlZF9ibG9ja3MpOworCisJCWZvciAoaSA9IDA7IGkgPCB1YmktPmZtLT51c2VkX2Jsb2NrczsgaSsrKSB7CisJCQllID0gdWJpLT5mbS0+ZVtpXTsKKwkJCXViaS0+bG9va3VwdGJsW2UtPnBudW1dID0gZTsKKwkJfQorCX0KIAllbHNlCiAJCXViaV9hc3NlcnQodWJpLT5nb29kX3BlYl9jb3VudCA9PSBmb3VuZF9wZWJzKTsKIAogCXJlc2VydmVkX3BlYnMgPSBXTF9SRVNFUlZFRF9QRUJTOwotI2lmZGVmIENPTkZJR19NVERfVUJJX0ZBU1RNQVAKLQkvKiBSZXNlcnZlIGVub3VnaCBMRUJzIHRvIHN0b3JlIHR3byBmYXN0bWFwcy4gKi8KLQlyZXNlcnZlZF9wZWJzICs9ICh1YmktPmZtX3NpemUgLyB1YmktPmxlYl9zaXplKSAqIDI7Ci0jZW5kaWYKKwl1YmlfZmFzdG1hcF9pbml0KHViaSwgJnJlc2VydmVkX3BlYnMpOwogCiAJaWYgKHViaS0+YXZhaWxfcGVicyA8IHJlc2VydmVkX3BlYnMpIHsKIAkJdWJpX2Vycih1YmksICJubyBlbm91Z2ggcGh5c2ljYWwgZXJhc2VibG9ja3MgKCVkLCBuZWVkICVkKSIsCkBAIC0xOTk4LDkgKzE2MTUsOSBAQAogCiBvdXRfZnJlZToKIAlzaHV0ZG93bl93b3JrKHViaSk7Ci0JdHJlZV9kZXN0cm95KCZ1YmktPnVzZWQpOwotCXRyZWVfZGVzdHJveSgmdWJpLT5mcmVlKTsKLQl0cmVlX2Rlc3Ryb3koJnViaS0+c2NydWIpOworCXRyZWVfZGVzdHJveSh1YmksICZ1YmktPnVzZWQpOworCXRyZWVfZGVzdHJveSh1YmksICZ1YmktPmZyZWUpOworCXRyZWVfZGVzdHJveSh1YmksICZ1YmktPnNjcnViKTsKIAlrZnJlZSh1YmktPmxvb2t1cHRibCk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIwMTcsNyArMTYzNCw3IEBACiAJZm9yIChpID0gMDsgaSA8IFVCSV9QUk9UX1FVRVVFX0xFTjsgKytpKSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlLCB0bXAsICZ1YmktPnBxW2ldLCB1Lmxpc3QpIHsKIAkJCWxpc3RfZGVsKCZlLT51Lmxpc3QpOwotCQkJa21lbV9jYWNoZV9mcmVlKHViaV93bF9lbnRyeV9zbGFiLCBlKTsKKwkJCXdsX2VudHJ5X2Rlc3Ryb3kodWJpLCBlKTsKIAkJfQogCX0KIH0KQEAgLTIwMjksMTIgKzE2NDYsMTMgQEAKIHZvaWQgdWJpX3dsX2Nsb3NlKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCiB7CiAJZGJnX3dsKCJjbG9zZSB0aGUgV0wgc3ViLXN5c3RlbSIpOworCXViaV9mYXN0bWFwX2Nsb3NlKHViaSk7CiAJc2h1dGRvd25fd29yayh1YmkpOwogCXByb3RlY3Rpb25fcXVldWVfZGVzdHJveSh1YmkpOwotCXRyZWVfZGVzdHJveSgmdWJpLT51c2VkKTsKLQl0cmVlX2Rlc3Ryb3koJnViaS0+ZXJyb25lb3VzKTsKLQl0cmVlX2Rlc3Ryb3koJnViaS0+ZnJlZSk7Ci0JdHJlZV9kZXN0cm95KCZ1YmktPnNjcnViKTsKKwl0cmVlX2Rlc3Ryb3kodWJpLCAmdWJpLT51c2VkKTsKKwl0cmVlX2Rlc3Ryb3kodWJpLCAmdWJpLT5lcnJvbmVvdXMpOworCXRyZWVfZGVzdHJveSh1YmksICZ1YmktPmZyZWUpOworCXRyZWVfZGVzdHJveSh1YmksICZ1YmktPnNjcnViKTsKIAlrZnJlZSh1YmktPmxvb2t1cHRibCk7CiB9CiAKQEAgLTIxMzMsMyArMTc1MSw5NCBAQAogCWR1bXBfc3RhY2soKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KKyNpZm5kZWYgQ09ORklHX01URF9VQklfRkFTVE1BUAorc3RhdGljIHN0cnVjdCB1Ymlfd2xfZW50cnkgKmdldF9wZWJfZm9yX3dsKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJc3RydWN0IHViaV93bF9lbnRyeSAqZTsKKworCWUgPSBmaW5kX3dsX2VudHJ5KHViaSwgJnViaS0+ZnJlZSwgV0xfRlJFRV9NQVhfRElGRik7CisJc2VsZl9jaGVja19pbl93bF90cmVlKHViaSwgZSwgJnViaS0+ZnJlZSk7CisJdWJpLT5mcmVlX2NvdW50LS07CisJdWJpX2Fzc2VydCh1YmktPmZyZWVfY291bnQgPj0gMCk7CisJcmJfZXJhc2UoJmUtPnUucmIsICZ1YmktPmZyZWUpOworCisJcmV0dXJuIGU7Cit9CisKKy8qKgorICogcHJvZHVjZV9mcmVlX3BlYiAtIHByb2R1Y2UgYSBmcmVlIHBoeXNpY2FsIGVyYXNlYmxvY2suCisgKiBAdWJpOiBVQkkgZGV2aWNlIGRlc2NyaXB0aW9uIG9iamVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gdHJpZXMgdG8gbWFrZSBhIGZyZWUgUEVCIGJ5IG1lYW5zIG9mIHN5bmNocm9ub3VzIGV4ZWN1dGlvbiBvZgorICogcGVuZGluZyB3b3Jrcy4gVGhpcyBtYXkgYmUgbmVlZGVkIGlmLCBmb3IgZXhhbXBsZSB0aGUgYmFja2dyb3VuZCB0aHJlYWQgaXMKKyAqIGRpc2FibGVkLiBSZXR1cm5zIHplcm8gaW4gY2FzZSBvZiBzdWNjZXNzIGFuZCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZQorICogb2YgZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBwcm9kdWNlX2ZyZWVfcGViKHN0cnVjdCB1YmlfZGV2aWNlICp1YmkpCit7CisJaW50IGVycjsKKworCXdoaWxlICghdWJpLT5mcmVlLnJiX25vZGUgJiYgdWJpLT53b3Jrc19jb3VudCkgeworCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKworCQlkYmdfd2woImRvIG9uZSB3b3JrIHN5bmNocm9ub3VzbHkiKTsKKwkJZXJyID0gZG9fd29yayh1YmkpOworCisJCXNwaW5fbG9jaygmdWJpLT53bF9sb2NrKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdWJpX3dsX2dldF9wZWIgLSBnZXQgYSBwaHlzaWNhbCBlcmFzZWJsb2NrLgorICogQHViaTogVUJJIGRldmljZSBkZXNjcmlwdGlvbiBvYmplY3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwaHlzaWNhbCBlcmFzZWJsb2NrIGluIGNhc2Ugb2Ygc3VjY2VzcyBhbmQgYQorICogbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUuCisgKiBSZXR1cm5zIHdpdGggdWJpLT5mbV9lYmFfc2VtIGhlbGQgaW4gcmVhZCBtb2RlIQorICovCitpbnQgdWJpX3dsX2dldF9wZWIoc3RydWN0IHViaV9kZXZpY2UgKnViaSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB1Ymlfd2xfZW50cnkgKmU7CisKK3JldHJ5OgorCWRvd25fcmVhZCgmdWJpLT5mbV9lYmFfc2VtKTsKKwlzcGluX2xvY2soJnViaS0+d2xfbG9jayk7CisJaWYgKCF1YmktPmZyZWUucmJfbm9kZSkgeworCQlpZiAodWJpLT53b3Jrc19jb3VudCA9PSAwKSB7CisJCQl1YmlfZXJyKHViaSwgIm5vIGZyZWUgZXJhc2VibG9ja3MiKTsKKwkJCXViaV9hc3NlcnQobGlzdF9lbXB0eSgmdWJpLT53b3JrcykpOworCQkJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJfQorCisJCWVyciA9IHByb2R1Y2VfZnJlZV9wZWIodWJpKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXNwaW5fdW5sb2NrKCZ1YmktPndsX2xvY2spOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlzcGluX3VubG9jaygmdWJpLT53bF9sb2NrKTsKKwkJdXBfcmVhZCgmdWJpLT5mbV9lYmFfc2VtKTsKKwkJZ290byByZXRyeTsKKworCX0KKwllID0gd2xfZ2V0X3dsZSh1YmkpOworCXByb3RfcXVldWVfYWRkKHViaSwgZSk7CisJc3Bpbl91bmxvY2soJnViaS0+d2xfbG9jayk7CisKKwllcnIgPSB1Ymlfc2VsZl9jaGVja19hbGxfZmYodWJpLCBlLT5wbnVtLCB1YmktPnZpZF9oZHJfYWxvZmZzZXQsCisJCQkJICAgIHViaS0+cGViX3NpemUgLSB1YmktPnZpZF9oZHJfYWxvZmZzZXQpOworCWlmIChlcnIpIHsKKwkJdWJpX2Vycih1YmksICJuZXcgUEVCICVkIGRvZXMgbm90IGNvbnRhaW4gYWxsIDB4RkYgYnl0ZXMiLCBlLT5wbnVtKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gZS0+cG51bTsKK30KKyNlbHNlCisjaW5jbHVkZSAiZmFzdG1hcC13bC5jIgorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC91Ymkvd2wuaCBiL2RyaXZlcnMvbXRkL3ViaS93bC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMWYwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL210ZC91Ymkvd2wuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIFVCSV9XTF9ICisjZGVmaW5lIFVCSV9XTF9ICisjaWZkZWYgQ09ORklHX01URF9VQklfRkFTVE1BUAorc3RhdGljIGludCBhbmNob3JfcGVic19hdmFsaWJsZShzdHJ1Y3QgcmJfcm9vdCAqcm9vdCk7CitzdGF0aWMgdm9pZCB1cGRhdGVfZmFzdG1hcF93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3JrKTsKK3N0YXRpYyBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICpmaW5kX2FuY2hvcl93bF9lbnRyeShzdHJ1Y3QgcmJfcm9vdCAqcm9vdCk7CitzdGF0aWMgc3RydWN0IHViaV93bF9lbnRyeSAqZ2V0X3BlYl9mb3Jfd2woc3RydWN0IHViaV9kZXZpY2UgKnViaSk7CitzdGF0aWMgdm9pZCB1YmlfZmFzdG1hcF9jbG9zZShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCB1YmlfZmFzdG1hcF9pbml0KHN0cnVjdCB1YmlfZGV2aWNlICp1YmksIGludCAqY291bnQpCit7CisJLyogUmVzZXJ2ZSBlbm91Z2ggTEVCcyB0byBzdG9yZSB0d28gZmFzdG1hcHMuICovCisJKmNvdW50ICs9ICh1YmktPmZtX3NpemUgLyB1YmktPmxlYl9zaXplKSAqIDI7CisJSU5JVF9XT1JLKCZ1YmktPmZtX3dvcmssIHVwZGF0ZV9mYXN0bWFwX3dvcmtfZm4pOworfQorc3RhdGljIHN0cnVjdCB1Ymlfd2xfZW50cnkgKm1heV9yZXNlcnZlX2Zvcl9mbShzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLAorCQkJCQkgICAgICAgc3RydWN0IHViaV93bF9lbnRyeSAqZSwKKwkJCQkJICAgICAgIHN0cnVjdCByYl9yb290ICpyb290KTsKKyNlbHNlIC8qICFDT05GSUdfTVREX1VCSV9GQVNUTUFQICovCitzdGF0aWMgc3RydWN0IHViaV93bF9lbnRyeSAqZ2V0X3BlYl9mb3Jfd2woc3RydWN0IHViaV9kZXZpY2UgKnViaSk7CitzdGF0aWMgaW5saW5lIHZvaWQgdWJpX2Zhc3RtYXBfY2xvc2Uoc3RydWN0IHViaV9kZXZpY2UgKnViaSkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdWJpX2Zhc3RtYXBfaW5pdChzdHJ1Y3QgdWJpX2RldmljZSAqdWJpLCBpbnQgKmNvdW50KSB7IH0KK3N0YXRpYyBzdHJ1Y3QgdWJpX3dsX2VudHJ5ICptYXlfcmVzZXJ2ZV9mb3JfZm0oc3RydWN0IHViaV9kZXZpY2UgKnViaSwKKwkJCQkJICAgICAgIHN0cnVjdCB1Ymlfd2xfZW50cnkgKmUsCisJCQkJCSAgICAgICBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkgeworCXJldHVybiBlOworfQorI2VuZGlmIC8qIENPTkZJR19NVERfVUJJX0ZBU1RNQVAgKi8KKyNlbmRpZiAvKiBVQklfV0xfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYXJjbmV0L2FyY25ldC5jIGIvZHJpdmVycy9uZXQvYXJjbmV0L2FyY25ldC5jCmluZGV4IDA5ZGU2ODMuLjEwZjcxYzczIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9hcmNuZXQvYXJjbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L2FyY25ldC5jCkBAIC0xMDQsNyArMTA0LDYgQEAKIHN0YXRpYyBpbnQgYXJjbmV0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJIHVuc2lnbmVkIHNob3J0IHR5cGUsIGNvbnN0IHZvaWQgKmRhZGRyLAogCQkJIGNvbnN0IHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pOwotc3RhdGljIGludCBhcmNuZXRfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBzdGF0aWMgaW50IGdvX3R4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiBzdGF0aWMgaW50IGRlYnVnID0gQVJDTkVUX0RFQlVHOwpAQCAtMzEyLDcgKzMxMSw2IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGVhZGVyX29wcyBhcmNuZXRfaGVhZGVyX29wcyA9IHsKIAkuY3JlYXRlID0gYXJjbmV0X2hlYWRlciwKLQkucmVidWlsZCA9IGFyY25ldF9yZWJ1aWxkX2hlYWRlciwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYXJjbmV0X25ldGRldl9vcHMgPSB7CkBAIC01MzgsNTkgKzUzNiw2IEBACiAJcmV0dXJuIHByb3RvLT5idWlsZF9oZWFkZXIoc2tiLCBkZXYsIHR5cGUsIF9kYWRkcik7CiB9CiAKLQotLyogCi0gKiBSZWJ1aWxkIHRoZSBBUkNuZXQgaGFyZCBoZWFkZXIuIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFuIEFSUCAob3IgaW4gdGhlCi0gKiBmdXR1cmUgb3RoZXIgYWRkcmVzcyByZXNvbHV0aW9uKSBoYXMgY29tcGxldGVkIG9uIHRoaXMgc2tfYnVmZi4gV2Ugbm93Ci0gKiBsZXQgQVJQIGZpbGwgaW4gdGhlIGRlc3RpbmF0aW9uIGZpZWxkLgotICovCi1zdGF0aWMgaW50IGFyY25ldF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKLQlzdHJ1Y3QgYXJjbmV0X2xvY2FsICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHN0YXR1cyA9IDA7CQkvKiBkZWZhdWx0IGlzIGZhaWx1cmUgKi8KLQl1bnNpZ25lZCBzaG9ydCB0eXBlOwotCXVpbnQ4X3QgZGFkZHI9MDsKLQlzdHJ1Y3QgQXJjUHJvdG8gKnByb3RvOwotCS8qCi0JICogWFhYOiBXaHkgbm90IHVzZSBza2ItPm1hY19sZW4/Ci0JICovCi0JaWYgKHNrYi0+bmV0d29ya19oZWFkZXIgLSBza2ItPm1hY19oZWFkZXIgIT0gMikgewotCQlCVUdNU0coRF9OT1JNQUwsCi0JCSAgICAgICAicmVidWlsZF9oZWFkZXI6IHNob3VsZG4ndCBiZSBoZXJlISAoaGRyc2l6ZT0lZClcbiIsCi0JCSAgICAgICAoaW50KShza2ItPm5ldHdvcmtfaGVhZGVyIC0gc2tiLT5tYWNfaGVhZGVyKSk7Ci0JCXJldHVybiAwOwotCX0KLQl0eXBlID0gKih1aW50MTZfdCAqKSBza2JfcHVsbChza2IsIDIpOwotCUJVR01TRyhEX0RVUklORywgInJlYnVpbGQgaGVhZGVyIGZvciBwcm90b2NvbCAlWGhcbiIsIHR5cGUpOwotCi0JaWYgKHR5cGUgPT0gRVRIX1BfSVApIHsKLSNpZmRlZiBDT05GSUdfSU5FVAotCQlCVUdNU0coRF9EVVJJTkcsICJyZWJ1aWxkIGhlYWRlciBmb3IgZXRoZXJuZXQgcHJvdG9jb2wgJVhoXG4iLCB0eXBlKTsKLQkJc3RhdHVzID0gYXJwX2ZpbmQoJmRhZGRyLCBza2IpID8gMSA6IDA7Ci0JCUJVR01TRyhEX0RVUklORywgIiByZWJ1aWx0OiBkZXN0IGlzICVkOyBwcm90b2NvbCAlWGhcbiIsCi0JCSAgICAgICBkYWRkciwgdHlwZSk7Ci0jZW5kaWYKLQl9IGVsc2UgewotCQlCVUdNU0coRF9OT1JNQUwsCi0JCSAgICAgICAiSSBkb24ndCB1bmRlcnN0YW5kIGV0aGVybmV0IHByb3RvY29sICVYaCBhZGRyZXNzZXMhXG4iLCB0eXBlKTsKLQkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKLQkJZGV2LT5zdGF0cy50eF9hYm9ydGVkX2Vycm9ycysrOwotCX0KLQotCS8qIGlmIHdlIGNvdWxkbid0IHJlc29sdmUgdGhlIGFkZHJlc3MuLi4gZ2l2ZSB1cC4gKi8KLQlpZiAoIXN0YXR1cykKLQkJcmV0dXJuIDA7Ci0KLQkvKiBhZGQgdGhlIF9yZWFsXyBoZWFkZXIgdGhpcyB0aW1lISAqLwotCXByb3RvID0gYXJjX3Byb3RvX21hcFtscC0+ZGVmYXVsdF9wcm90b1tkYWRkcl1dOwotCXByb3RvLT5idWlsZF9oZWFkZXIoc2tiLCBkZXYsIHR5cGUsIGRhZGRyKTsKLQotCXJldHVybiAxOwkJLyogc3VjY2VzcyAqLwotfQotCi0KLQogLyogQ2FsbGVkIGJ5IHRoZSBrZXJuZWwgaW4gb3JkZXIgdG8gdHJhbnNtaXQgYSBwYWNrZXQuICovCiBuZXRkZXZfdHhfdCBhcmNuZXRfc2VuZF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfM2FkLmMKaW5kZXggY2ZjNGE5Yy4uZmJkNTRmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kXzNhZC5jCisrKyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF8zYWQuYwpAQCAtNzAsNiArNzAsNyBAQAogI2RlZmluZSBBRF9QT1JUX1NUQU5EQlkgICAgICAgICAweDgwCiAjZGVmaW5lIEFEX1BPUlRfU0VMRUNURUQgICAgICAgIDB4MTAwCiAjZGVmaW5lIEFEX1BPUlRfTU9WRUQgICAgICAgICAgIDB4MjAwCisjZGVmaW5lIEFEX1BPUlRfQ0hVUk5FRCAgICAgICAgIChBRF9QT1JUX0FDVE9SX0NIVVJOIHwgQURfUE9SVF9QQVJUTkVSX0NIVVJOKQogCiAvKiBQb3J0IEtleSBkZWZpbml0aW9ucwogICoga2V5IGlzIGRldGVybWluZWQgYWNjb3JkaW5nIHRvIHRoZSBsaW5rIHNwZWVkLCBkdXBsZXggYW5kCkBAIC0xMDEzLDE2ICsxMDE0LDE5IEBACiAJLyogY2hlY2sgaWYgc3RhdGUgbWFjaGluZSBzaG91bGQgY2hhbmdlIHN0YXRlICovCiAKIAkvKiBmaXJzdCwgY2hlY2sgaWYgcG9ydCB3YXMgcmVpbml0aWFsaXplZCAqLwotCWlmIChwb3J0LT5zbV92YXJzICYgQURfUE9SVF9CRUdJTikKKwlpZiAocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfQkVHSU4pIHsKIAkJcG9ydC0+c21fcnhfc3RhdGUgPSBBRF9SWF9JTklUSUFMSVpFOworCQlwb3J0LT5zbV92YXJzIHw9IEFEX1BPUlRfQ0hVUk5FRDsKIAkvKiBjaGVjayBpZiBwb3J0IGlzIG5vdCBlbmFibGVkICovCi0JZWxzZSBpZiAoIShwb3J0LT5zbV92YXJzICYgQURfUE9SVF9CRUdJTikKKwl9IGVsc2UgaWYgKCEocG9ydC0+c21fdmFycyAmIEFEX1BPUlRfQkVHSU4pCiAJCSAmJiAhcG9ydC0+aXNfZW5hYmxlZCAmJiAhKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX01PVkVEKSkKIAkJcG9ydC0+c21fcnhfc3RhdGUgPSBBRF9SWF9QT1JUX0RJU0FCTEVEOwogCS8qIGNoZWNrIGlmIG5ldyBsYWNwZHUgYXJyaXZlZCAqLwogCWVsc2UgaWYgKGxhY3BkdSAmJiAoKHBvcnQtPnNtX3J4X3N0YXRlID09IEFEX1JYX0VYUElSRUQpIHx8CiAJCSAocG9ydC0+c21fcnhfc3RhdGUgPT0gQURfUlhfREVGQVVMVEVEKSB8fAogCQkgKHBvcnQtPnNtX3J4X3N0YXRlID09IEFEX1JYX0NVUlJFTlQpKSkgeworCQlpZiAocG9ydC0+c21fcnhfc3RhdGUgIT0gQURfUlhfQ1VSUkVOVCkKKwkJCXBvcnQtPnNtX3ZhcnMgfD0gQURfUE9SVF9DSFVSTkVEOwogCQlwb3J0LT5zbV9yeF90aW1lcl9jb3VudGVyID0gMDsKIAkJcG9ydC0+c21fcnhfc3RhdGUgPSBBRF9SWF9DVVJSRU5UOwogCX0gZWxzZSB7CkBAIC0xMTAwLDkgKzExMDQsMTEgQEAKIAkJCSAqLwogCQkJcG9ydC0+cGFydG5lcl9vcGVyLnBvcnRfc3RhdGUgJj0gfkFEX1NUQVRFX1NZTkNIUk9OSVpBVElPTjsKIAkJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfTUFUQ0hFRDsKKwkJCXBvcnQtPnBhcnRuZXJfb3Blci5wb3J0X3N0YXRlIHw9IEFEX1NUQVRFX0xBQ1BfVElNRU9VVDsKIAkJCXBvcnQtPnBhcnRuZXJfb3Blci5wb3J0X3N0YXRlIHw9IEFEX1NUQVRFX0xBQ1BfQUNUSVZJVFk7CiAJCQlwb3J0LT5zbV9yeF90aW1lcl9jb3VudGVyID0gX19hZF90aW1lcl90b190aWNrcyhBRF9DVVJSRU5UX1dISUxFX1RJTUVSLCAodTE2KShBRF9TSE9SVF9USU1FT1VUKSk7CiAJCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgfD0gQURfU1RBVEVfRVhQSVJFRDsKKwkJCXBvcnQtPnNtX3ZhcnMgfD0gQURfUE9SVF9DSFVSTkVEOwogCQkJYnJlYWs7CiAJCWNhc2UgQURfUlhfREVGQVVMVEVEOgogCQkJX191cGRhdGVfZGVmYXVsdF9zZWxlY3RlZChwb3J0KTsKQEAgLTExMzIsNiArMTEzOCw0NSBAQAogfQogCiAvKioKKyAqIGFkX2NodXJuX21hY2hpbmUgLSBoYW5kbGUgcG9ydCBjaHVybidzIHN0YXRlIG1hY2hpbmUKKyAqIEBwb3J0OiB0aGUgcG9ydCB3ZSdyZSBsb29raW5nIGF0CisgKgorICovCitzdGF0aWMgdm9pZCBhZF9jaHVybl9tYWNoaW5lKHN0cnVjdCBwb3J0ICpwb3J0KQoreworCWlmIChwb3J0LT5zbV92YXJzICYgQURfUE9SVF9DSFVSTkVEKSB7CisJCXBvcnQtPnNtX3ZhcnMgJj0gfkFEX1BPUlRfQ0hVUk5FRDsKKwkJcG9ydC0+c21fY2h1cm5fYWN0b3Jfc3RhdGUgPSBBRF9DSFVSTl9NT05JVE9SOworCQlwb3J0LT5zbV9jaHVybl9wYXJ0bmVyX3N0YXRlID0gQURfQ0hVUk5fTU9OSVRPUjsKKwkJcG9ydC0+c21fY2h1cm5fYWN0b3JfdGltZXJfY291bnRlciA9CisJCQlfX2FkX3RpbWVyX3RvX3RpY2tzKEFEX0FDVE9SX0NIVVJOX1RJTUVSLCAwKTsKKwkJIHBvcnQtPnNtX2NodXJuX3BhcnRuZXJfdGltZXJfY291bnRlciA9CisJCQkgX19hZF90aW1lcl90b190aWNrcyhBRF9QQVJUTkVSX0NIVVJOX1RJTUVSLCAwKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocG9ydC0+c21fY2h1cm5fYWN0b3JfdGltZXJfY291bnRlciAmJgorCSAgICAhKC0tcG9ydC0+c21fY2h1cm5fYWN0b3JfdGltZXJfY291bnRlcikgJiYKKwkgICAgcG9ydC0+c21fY2h1cm5fYWN0b3Jfc3RhdGUgPT0gQURfQ0hVUk5fTU9OSVRPUikgeworCQlpZiAocG9ydC0+YWN0b3Jfb3Blcl9wb3J0X3N0YXRlICYgQURfU1RBVEVfU1lOQ0hST05JWkFUSU9OKSB7CisJCQlwb3J0LT5zbV9jaHVybl9hY3Rvcl9zdGF0ZSA9IEFEX05PX0NIVVJOOworCQl9IGVsc2UgeworCQkJcG9ydC0+Y2h1cm5fYWN0b3JfY291bnQrKzsKKwkJCXBvcnQtPnNtX2NodXJuX2FjdG9yX3N0YXRlID0gQURfQ0hVUk47CisJCX0KKwl9CisJaWYgKHBvcnQtPnNtX2NodXJuX3BhcnRuZXJfdGltZXJfY291bnRlciAmJgorCSAgICAhKC0tcG9ydC0+c21fY2h1cm5fcGFydG5lcl90aW1lcl9jb3VudGVyKSAmJgorCSAgICBwb3J0LT5zbV9jaHVybl9wYXJ0bmVyX3N0YXRlID09IEFEX0NIVVJOX01PTklUT1IpIHsKKwkJaWYgKHBvcnQtPnBhcnRuZXJfb3Blci5wb3J0X3N0YXRlICYgQURfU1RBVEVfU1lOQ0hST05JWkFUSU9OKSB7CisJCQlwb3J0LT5zbV9jaHVybl9wYXJ0bmVyX3N0YXRlID0gQURfTk9fQ0hVUk47CisJCX0gZWxzZSB7CisJCQlwb3J0LT5jaHVybl9wYXJ0bmVyX2NvdW50Kys7CisJCQlwb3J0LT5zbV9jaHVybl9wYXJ0bmVyX3N0YXRlID0gQURfQ0hVUk47CisJCX0KKwl9Cit9CisKKy8qKgogICogYWRfdHhfbWFjaGluZSAtIGhhbmRsZSBhIHBvcnQncyB0eCBzdGF0ZSBtYWNoaW5lCiAgKiBAcG9ydDogdGhlIHBvcnQgd2UncmUgbG9va2luZyBhdAogICovCkBAIC0xMzgzLDggKzE0MjgsMTAgQEAKIAkJCWVsc2UKIAkJCQlwb3J0LT5hZ2dyZWdhdG9yLT5pc19pbmRpdmlkdWFsID0gdHJ1ZTsKIAotCQkJcG9ydC0+YWdncmVnYXRvci0+YWN0b3JfYWRtaW5fYWdncmVnYXRvcl9rZXkgPSBwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleTsKLQkJCXBvcnQtPmFnZ3JlZ2F0b3ItPmFjdG9yX29wZXJfYWdncmVnYXRvcl9rZXkgPSBwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5OworCQkJcG9ydC0+YWdncmVnYXRvci0+YWN0b3JfYWRtaW5fYWdncmVnYXRvcl9rZXkgPQorCQkJCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5OworCQkJcG9ydC0+YWdncmVnYXRvci0+YWN0b3Jfb3Blcl9hZ2dyZWdhdG9yX2tleSA9CisJCQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X2tleTsKIAkJCXBvcnQtPmFnZ3JlZ2F0b3ItPnBhcnRuZXJfc3lzdGVtID0KIAkJCQlwb3J0LT5wYXJ0bmVyX29wZXIuc3lzdGVtOwogCQkJcG9ydC0+YWdncmVnYXRvci0+cGFydG5lcl9zeXN0ZW1fcHJpb3JpdHkgPQpAQCAtMTcxMCwxNCArMTc1Nyw5IEBACiAJfTsKIAogCWlmIChwb3J0KSB7Ci0JCXBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyID0gMTsKIAkJcG9ydC0+YWN0b3JfcG9ydF9wcmlvcml0eSA9IDB4ZmY7Ci0JCXBvcnQtPmFjdG9yX3N5c3RlbSA9IG51bGxfbWFjX2FkZHI7Ci0JCXBvcnQtPmFjdG9yX3N5c3RlbV9wcmlvcml0eSA9IDB4ZmZmZjsKIAkJcG9ydC0+YWN0b3JfcG9ydF9hZ2dyZWdhdG9yX2lkZW50aWZpZXIgPSAwOwogCQlwb3J0LT5udHQgPSBmYWxzZTsKLQkJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgPSAxOwotCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5ICA9IDE7CiAJCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfc3RhdGUgPSBBRF9TVEFURV9BR0dSRUdBVElPTiB8CiAJCQkJCSAgICAgICBBRF9TVEFURV9MQUNQX0FDVElWSVRZOwogCQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUgID0gQURfU1RBVEVfQUdHUkVHQVRJT04gfApAQCAtMTczMSw3ICsxNzczLDcgQEAKIAogCQlwb3J0LT5pc19lbmFibGVkID0gdHJ1ZTsKIAkJLyogcHJpdmF0ZSBwYXJhbWV0ZXJzICovCi0JCXBvcnQtPnNtX3ZhcnMgPSAweDM7CisJCXBvcnQtPnNtX3ZhcnMgPSBBRF9QT1JUX0JFR0lOIHwgQURfUE9SVF9MQUNQX0VOQUJMRUQ7CiAJCXBvcnQtPnNtX3J4X3N0YXRlID0gMDsKIAkJcG9ydC0+c21fcnhfdGltZXJfY291bnRlciA9IDA7CiAJCXBvcnQtPnNtX3BlcmlvZGljX3N0YXRlID0gMDsKQEAgLTE3MzksMTIgKzE3ODEsMTcgQEAKIAkJcG9ydC0+c21fbXV4X3N0YXRlID0gMDsKIAkJcG9ydC0+c21fbXV4X3RpbWVyX2NvdW50ZXIgPSAwOwogCQlwb3J0LT5zbV90eF9zdGF0ZSA9IDA7Ci0JCXBvcnQtPnNtX3R4X3RpbWVyX2NvdW50ZXIgPSAwOwotCQlwb3J0LT5zbGF2ZSA9IE5VTEw7CiAJCXBvcnQtPmFnZ3JlZ2F0b3IgPSBOVUxMOwogCQlwb3J0LT5uZXh0X3BvcnRfaW5fYWdncmVnYXRvciA9IE5VTEw7CiAJCXBvcnQtPnRyYW5zYWN0aW9uX2lkID0gMDsKIAorCQlwb3J0LT5zbV9jaHVybl9hY3Rvcl90aW1lcl9jb3VudGVyID0gMDsKKwkJcG9ydC0+c21fY2h1cm5fYWN0b3Jfc3RhdGUgPSAwOworCQlwb3J0LT5jaHVybl9hY3Rvcl9jb3VudCA9IDA7CisJCXBvcnQtPnNtX2NodXJuX3BhcnRuZXJfdGltZXJfY291bnRlciA9IDA7CisJCXBvcnQtPnNtX2NodXJuX3BhcnRuZXJfc3RhdGUgPSAwOworCQlwb3J0LT5jaHVybl9wYXJ0bmVyX2NvdW50ID0gMDsKKwogCQltZW1jcHkoJnBvcnQtPmxhY3BkdSwgJmxhY3BkdSwgc2l6ZW9mKGxhY3BkdSkpOwogCX0KIH0KQEAgLTE5MTYsOCArMTk2Myw2IEBACiAJCSAqIGxhY3BkdSdzIGFyZSBzZW50IGluIG9uZSBzZWNvbmQpCiAJCSAqLwogCQlwb3J0LT5zbV90eF90aW1lcl9jb3VudGVyID0gYWRfdGlja3NfcGVyX3NlYy9BRF9NQVhfVFhfSU5fU0VDT05EOwotCQlwb3J0LT5hZ2dyZWdhdG9yID0gTlVMTDsKLQkJcG9ydC0+bmV4dF9wb3J0X2luX2FnZ3JlZ2F0b3IgPSBOVUxMOwogCiAJCV9fZGlzYWJsZV9wb3J0KHBvcnQpOwogCkBAIC0yMTY0LDYgKzIyMDksNyBAQAogCQlhZF9wb3J0X3NlbGVjdGlvbl9sb2dpYyhwb3J0LCAmdXBkYXRlX3NsYXZlX2Fycik7CiAJCWFkX211eF9tYWNoaW5lKHBvcnQsICZ1cGRhdGVfc2xhdmVfYXJyKTsKIAkJYWRfdHhfbWFjaGluZShwb3J0KTsKKwkJYWRfY2h1cm5fbWFjaGluZShwb3J0KTsKIAogCQkvKiB0dXJuIG9mZiB0aGUgQkVHSU4gYml0LCBzaW5jZSB3ZSBhbHJlYWR5IGhhbmRsZWQgaXQgKi8KIAkJaWYgKHBvcnQtPnNtX3ZhcnMgJiBBRF9QT1JUX0JFR0lOKQpAQCAtMjI3OSw4ICsyMzI1LDggQEAKIAlzcGluX2xvY2tfYmgoJnNsYXZlLT5ib25kLT5tb2RlX2xvY2spOwogCiAJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgJj0gfkFEX1NQRUVEX0tFWV9NQVNLUzsKLQlwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfa2V5ID0gcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgfD0KLQkJKF9fZ2V0X2xpbmtfc3BlZWQocG9ydCkgPDwgMSk7CisJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgfD0gX19nZXRfbGlua19zcGVlZChwb3J0KSA8PCAxOworCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXkgPSBwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleTsKIAluZXRkZXZfZGJnKHNsYXZlLT5ib25kLT5kZXYsICJQb3J0ICVkIGNoYW5nZWQgc3BlZWRcbiIsIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyKTsKIAkvKiB0aGVyZSBpcyBubyBuZWVkIHRvIHJlc2VsZWN0IGEgbmV3IGFnZ3JlZ2F0b3IsIGp1c3Qgc2lnbmFsIHRoZQogCSAqIHN0YXRlIG1hY2hpbmVzIHRvIHJlaW5pdGlhbGl6ZQpAQCAtMjMxMiw4ICsyMzU4LDggQEAKIAlzcGluX2xvY2tfYmgoJnNsYXZlLT5ib25kLT5tb2RlX2xvY2spOwogCiAJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgJj0gfkFEX0RVUExFWF9LRVlfTUFTS1M7Ci0JcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X2tleSA9IHBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5IHw9Ci0JCV9fZ2V0X2R1cGxleChwb3J0KTsKKwlwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleSB8PSBfX2dldF9kdXBsZXgocG9ydCk7CisJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X2tleSA9IHBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5OwogCW5ldGRldl9kYmcoc2xhdmUtPmJvbmQtPmRldiwgIlBvcnQgJWQgc2xhdmUgJXMgY2hhbmdlZCBkdXBsZXhcbiIsCiAJCSAgIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyLCBzbGF2ZS0+ZGV2LT5uYW1lKTsKIAlpZiAocG9ydC0+YWN0b3Jfb3Blcl9wb3J0X2tleSAmIEFEX0RVUExFWF9LRVlfTUFTS1MpCkBAIC0yMzU0LDIxICsyNDAwLDE5IEBACiAJICogb24gbGluayB1cCB3ZSBhcmUgZm9yY2luZyByZWNoZWNrIG9uIHRoZSBkdXBsZXggYW5kIHNwZWVkIHNpbmNlCiAJICogc29tZSBvZiBoZSBhZGFwdG9ycyhjZTEwMDAubGFuKSByZXBvcnQuCiAJICovCisJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgJj0gfihBRF9EVVBMRVhfS0VZX01BU0tTfEFEX1NQRUVEX0tFWV9NQVNLUyk7CiAJaWYgKGxpbmsgPT0gQk9ORF9MSU5LX1VQKSB7CiAJCXBvcnQtPmlzX2VuYWJsZWQgPSB0cnVlOwotCQlwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleSAmPSB+QURfRFVQTEVYX0tFWV9NQVNLUzsKLQkJcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X2tleSA9IHBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5IHw9Ci0JCQlfX2dldF9kdXBsZXgocG9ydCk7Ci0JCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5ICY9IH5BRF9TUEVFRF9LRVlfTUFTS1M7Ci0JCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXkgPSBwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleSB8PQotCQkJKF9fZ2V0X2xpbmtfc3BlZWQocG9ydCkgPDwgMSk7CisJCXBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5IHw9CisJCQkoX19nZXRfbGlua19zcGVlZChwb3J0KSA8PCAxKSB8IF9fZ2V0X2R1cGxleChwb3J0KTsKKwkJaWYgKHBvcnQtPmFjdG9yX2FkbWluX3BvcnRfa2V5ICYgQURfRFVQTEVYX0tFWV9NQVNLUykKKwkJCXBvcnQtPnNtX3ZhcnMgfD0gQURfUE9SVF9MQUNQX0VOQUJMRUQ7CiAJfSBlbHNlIHsKIAkJLyogbGluayBoYXMgZmFpbGVkICovCiAJCXBvcnQtPmlzX2VuYWJsZWQgPSBmYWxzZTsKLQkJcG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgJj0gfkFEX0RVUExFWF9LRVlfTUFTS1M7Ci0JCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXkgPSAocG9ydC0+YWN0b3JfYWRtaW5fcG9ydF9rZXkgJj0KLQkJCQkJICAgICB+QURfU1BFRURfS0VZX01BU0tTKTsKKwkJcG9ydC0+c21fdmFycyAmPSB+QURfUE9SVF9MQUNQX0VOQUJMRUQ7CiAJfQorCXBvcnQtPmFjdG9yX29wZXJfcG9ydF9rZXkgPSBwb3J0LT5hY3Rvcl9hZG1pbl9wb3J0X2tleTsKIAluZXRkZXZfZGJnKHNsYXZlLT5ib25kLT5kZXYsICJQb3J0ICVkIGNoYW5nZWQgbGluayBzdGF0dXMgdG8gJXNcbiIsCiAJCSAgIHBvcnQtPmFjdG9yX3BvcnRfbnVtYmVyLAogCQkgICBsaW5rID09IEJPTkRfTElOS19VUCA/ICJVUCIgOiAiRE9XTiIpOwpAQCAtMjQ4NSw2ICsyNTI5LDkgQEAKIAlpZiAoc2tiLT5wcm90b2NvbCAhPSBQS1RfVFlQRV9MQUNQRFUpCiAJCXJldHVybiBSWF9IQU5ETEVSX0FOT1RIRVI7CiAKKwlpZiAoIU1BQ19BRERSRVNTX0VRVUFMKGV0aF9oZHIoc2tiKS0+aF9kZXN0LCBsYWNwZHVfbWNhc3RfYWRkcikpCisJCXJldHVybiBSWF9IQU5ETEVSX0FOT1RIRVI7CisKIAlsYWNwZHUgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCAwLCBzaXplb2YoX2xhY3BkdSksICZfbGFjcGR1KTsKIAlpZiAoIWxhY3BkdSkKIAkJcmV0dXJuIFJYX0hBTkRMRVJfQU5PVEhFUjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCmluZGV4IGI5NzljMjYuLjc4ZGRlNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYwpAQCAtOTI4LDYgKzkyOCwzOSBAQAogCiBzdGF0aWMgdm9pZCBib25kX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYpCiB7CisJc3RydWN0IGJvbmRpbmcgKmJvbmQgPSBuZXRkZXZfcHJpdihib25kX2Rldik7CisJc3RydWN0IHNsYXZlICpzbGF2ZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqaXRlcjsKKwlzdHJ1Y3QgYWRfaW5mbyBhZF9pbmZvOworCXN0cnVjdCBuZXRwb2xsX2luZm8gKm5pOworCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzOworCisJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKQorCQlpZiAoYm9uZF8zYWRfZ2V0X2FjdGl2ZV9hZ2dfaW5mbyhib25kLCAmYWRfaW5mbykpCisJCQlyZXR1cm47CisKKwlyY3VfcmVhZF9sb2NrX2JoKCk7CisJYm9uZF9mb3JfZWFjaF9zbGF2ZV9yY3UoYm9uZCwgc2xhdmUsIGl0ZXIpIHsKKwkJb3BzID0gc2xhdmUtPmRldi0+bmV0ZGV2X29wczsKKwkJaWYgKCFib25kX3NsYXZlX2lzX3VwKHNsYXZlKSB8fCAhb3BzLT5uZG9fcG9sbF9jb250cm9sbGVyKQorCQkJY29udGludWU7CisKKwkJaWYgKEJPTkRfTU9ERShib25kKSA9PSBCT05EX01PREVfODAyM0FEKSB7CisJCQlzdHJ1Y3QgYWdncmVnYXRvciAqYWdnID0KKwkJCSAgICBTTEFWRV9BRF9JTkZPKHNsYXZlKS0+cG9ydC5hZ2dyZWdhdG9yOworCisJCQlpZiAoYWdnICYmCisJCQkgICAgYWdnLT5hZ2dyZWdhdG9yX2lkZW50aWZpZXIgIT0gYWRfaW5mby5hZ2dyZWdhdG9yX2lkKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJbmkgPSByY3VfZGVyZWZlcmVuY2VfYmgoc2xhdmUtPmRldi0+bnBpbmZvKTsKKwkJaWYgKGRvd25fdHJ5bG9jaygmbmktPmRldl9sb2NrKSkKKwkJCWNvbnRpbnVlOworCQlvcHMtPm5kb19wb2xsX2NvbnRyb2xsZXIoc2xhdmUtPmRldik7CisJCXVwKCZuaS0+ZGV2X2xvY2spOworCX0KKwlyY3VfcmVhZF91bmxvY2tfYmgoKTsKIH0KIAogc3RhdGljIHZvaWQgYm9uZF9uZXRwb2xsX2NsZWFudXAoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2KQpAQCAtMjkwMCw2ICsyOTMzLDggQEAKIAkJCWlmIChvbGRfZHVwbGV4ICE9IHNsYXZlLT5kdXBsZXgpCiAJCQkJYm9uZF8zYWRfYWRhcHRlcl9kdXBsZXhfY2hhbmdlZChzbGF2ZSk7CiAJCX0KKwkJLyogRmFsbHRocm91Z2ggKi8KKwljYXNlIE5FVERFVl9ET1dOOgogCQkvKiBSZWZyZXNoIHNsYXZlLWFycmF5IGlmIGFwcGxpY2FibGUhCiAJCSAqIElmIHRoZSBzZXR1cCBkb2VzIG5vdCB1c2UgbWlpbW9uIG9yIGFycG1vbiAobW9kZS1zcGVjaWZpYyEpLAogCQkgKiB0aGVuIHRoZXNlIGV2ZW50cyB3aWxsIG5vdCBjYXVzZSB0aGUgc2xhdmUtYXJyYXkgdG8gYmUKQEAgLTI5MTEsMTAgKzI5NDYsNiBAQAogCQlpZiAoYm9uZF9tb2RlX3VzZXNfeG1pdF9oYXNoKGJvbmQpKQogCQkJYm9uZF91cGRhdGVfc2xhdmVfYXJyKGJvbmQsIE5VTEwpOwogCQlicmVhazsKLQljYXNlIE5FVERFVl9ET1dOOgotCQlpZiAoYm9uZF9tb2RlX3VzZXNfeG1pdF9oYXNoKGJvbmQpKQotCQkJYm9uZF91cGRhdGVfc2xhdmVfYXJyKGJvbmQsIE5VTEwpOwotCQlicmVhazsKIAljYXNlIE5FVERFVl9DSEFOR0VNVFU6CiAJCS8qIFRPRE86IFNob3VsZCBzbGF2ZXMgYmUgYWxsb3dlZCB0bwogCQkgKiBpbmRlcGVuZGVudGx5IGFsdGVyIHRoZWlyIE1UVT8gIEZvcgpAQCAtMzg1MCw3ICszODgxLDggQEAKIAkvKiBGaW5kIG91dCBpZiBhbnkgc2xhdmVzIGhhdmUgdGhlIHNhbWUgbWFwcGluZyBhcyB0aGlzIHNrYi4gKi8KIAlib25kX2Zvcl9lYWNoX3NsYXZlX3JjdShib25kLCBzbGF2ZSwgaXRlcikgewogCQlpZiAoc2xhdmUtPnF1ZXVlX2lkID09IHNrYi0+cXVldWVfbWFwcGluZykgewotCQkJaWYgKGJvbmRfc2xhdmVfY2FuX3R4KHNsYXZlKSkgeworCQkJaWYgKGJvbmRfc2xhdmVfaXNfdXAoc2xhdmUpICYmCisJCQkgICAgc2xhdmUtPmxpbmsgPT0gQk9ORF9MSU5LX1VQKSB7CiAJCQkJYm9uZF9kZXZfcXVldWVfeG1pdChib25kLCBza2IsIHNsYXZlLT5kZXYpOwogCQkJCXJldHVybiAwOwogCQkJfQpAQCAtNDAwNyw2ICs0MDM5LDcgQEAKIAkubmRvX2ZpeF9mZWF0dXJlcwk9IGJvbmRfZml4X2ZlYXR1cmVzLAogCS5uZG9fYnJpZGdlX3NldGxpbmsJPSBuZG9fZGZsdF9uZXRkZXZfc3dpdGNoX3BvcnRfYnJpZGdlX3NldGxpbmssCiAJLm5kb19icmlkZ2VfZGVsbGluawk9IG5kb19kZmx0X25ldGRldl9zd2l0Y2hfcG9ydF9icmlkZ2VfZGVsbGluaywKKwkubmRvX2ZlYXR1cmVzX2NoZWNrCT0gcGFzc3RocnVfZmVhdHVyZXNfY2hlY2ssCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldmljZV90eXBlIGJvbmRfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9wcm9jZnMuYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9wcm9jZnMuYwppbmRleCA5NzZmNWFkLi42MjY5NGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfcHJvY2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX3Byb2Nmcy5jCkBAIC0xNzYsMTggKzE3Niw1MSBAQAogCQkgICBzbGF2ZS0+bGlua19mYWlsdXJlX2NvdW50KTsKIAogCXNlcV9wcmludGYoc2VxLCAiUGVybWFuZW50IEhXIGFkZHI6ICVwTVxuIiwgc2xhdmUtPnBlcm1faHdhZGRyKTsKKwlzZXFfcHJpbnRmKHNlcSwgIlNsYXZlIHF1ZXVlIElEOiAlZFxuIiwgc2xhdmUtPnF1ZXVlX2lkKTsKIAogCWlmIChCT05EX01PREUoYm9uZCkgPT0gQk9ORF9NT0RFXzgwMjNBRCkgewotCQljb25zdCBzdHJ1Y3QgYWdncmVnYXRvciAqYWdnCi0JCQk9IFNMQVZFX0FEX0lORk8oc2xhdmUpLT5wb3J0LmFnZ3JlZ2F0b3I7CisJCWNvbnN0IHN0cnVjdCBwb3J0ICpwb3J0ID0gJlNMQVZFX0FEX0lORk8oc2xhdmUpLT5wb3J0OworCQljb25zdCBzdHJ1Y3QgYWdncmVnYXRvciAqYWdnID0gcG9ydC0+YWdncmVnYXRvcjsKIAotCQlpZiAoYWdnKQorCQlpZiAoYWdnKSB7CiAJCQlzZXFfcHJpbnRmKHNlcSwgIkFnZ3JlZ2F0b3IgSUQ6ICVkXG4iLAogCQkJCSAgIGFnZy0+YWdncmVnYXRvcl9pZGVudGlmaWVyKTsKLQkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsICJBY3RvciBDaHVybiBTdGF0ZTogJXNcbiIsCisJCQkJICAgYm9uZF8zYWRfY2h1cm5fZGVzYyhwb3J0LT5zbV9jaHVybl9hY3Rvcl9zdGF0ZSkpOworCQkJc2VxX3ByaW50ZihzZXEsICJQYXJ0bmVyIENodXJuIFN0YXRlOiAlc1xuIiwKKwkJCQkgICBib25kXzNhZF9jaHVybl9kZXNjKHBvcnQtPnNtX2NodXJuX3BhcnRuZXJfc3RhdGUpKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiQWN0b3IgQ2h1cm5lZCBDb3VudDogJWRcbiIsCisJCQkJICAgcG9ydC0+Y2h1cm5fYWN0b3JfY291bnQpOworCQkJc2VxX3ByaW50ZihzZXEsICJQYXJ0bmVyIENodXJuZWQgQ291bnQ6ICVkXG4iLAorCQkJCSAgIHBvcnQtPmNodXJuX3BhcnRuZXJfY291bnQpOworCisJCQlzZXFfcHV0cyhzZXEsICJkZXRhaWxzIGFjdG9yIGxhY3AgcGR1OlxuIik7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICBzeXN0ZW0gcHJpb3JpdHk6ICVkXG4iLAorCQkJCSAgIHBvcnQtPmFjdG9yX3N5c3RlbV9wcmlvcml0eSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICBwb3J0IGtleTogJWRcbiIsCisJCQkJICAgcG9ydC0+YWN0b3Jfb3Blcl9wb3J0X2tleSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICBwb3J0IHByaW9yaXR5OiAlZFxuIiwKKwkJCQkgICBwb3J0LT5hY3Rvcl9wb3J0X3ByaW9yaXR5KTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgIHBvcnQgbnVtYmVyOiAlZFxuIiwKKwkJCQkgICBwb3J0LT5hY3Rvcl9wb3J0X251bWJlcik7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICBwb3J0IHN0YXRlOiAlZFxuIiwKKwkJCQkgICBwb3J0LT5hY3Rvcl9vcGVyX3BvcnRfc3RhdGUpOworCisJCQlzZXFfcHV0cyhzZXEsICJkZXRhaWxzIHBhcnRuZXIgbGFjcCBwZHU6XG4iKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgIHN5c3RlbSBwcmlvcml0eTogJWRcbiIsCisJCQkJICAgcG9ydC0+cGFydG5lcl9vcGVyLnN5c3RlbV9wcmlvcml0eSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICBvcGVyIGtleTogJWRcbiIsCisJCQkJICAgcG9ydC0+cGFydG5lcl9vcGVyLmtleSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICBwb3J0IHByaW9yaXR5OiAlZFxuIiwKKwkJCQkgICBwb3J0LT5wYXJ0bmVyX29wZXIucG9ydF9wcmlvcml0eSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiAgICBwb3J0IG51bWJlcjogJWRcbiIsCisJCQkJICAgcG9ydC0+cGFydG5lcl9vcGVyLnBvcnRfbnVtYmVyKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICAgIHBvcnQgc3RhdGU6ICVkXG4iLAorCQkJCSAgIHBvcnQtPnBhcnRuZXJfb3Blci5wb3J0X3N0YXRlKTsKKwkJfSBlbHNlIHsKIAkJCXNlcV9wdXRzKHNlcSwgIkFnZ3JlZ2F0b3IgSUQ6IE4vQVxuIik7CisJCX0KIAl9Ci0Jc2VxX3ByaW50ZihzZXEsICJTbGF2ZSBxdWV1ZSBJRDogJWRcbiIsIHNsYXZlLT5xdWV1ZV9pZCk7CiB9CiAKIHN0YXRpYyBpbnQgYm9uZF9pbmZvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NlcmlhbC5jIGIvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NlcmlhbC5jCmluZGV4IDI3YmJjNTYuLjlkYTA2NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zZXJpYWwuYworKysgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc2VyaWFsLmMKQEAgLTcwLDcgKzcwLDYgQEAKIAlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OwogCWJvb2wgdHhfc3RhcnRlZDsKIAl1bnNpZ25lZCBsb25nIHN0YXRlOwotCWNoYXIgKnR0eV9uYW1lOwogI2lmZGVmIENPTkZJR19ERUJVR19GUwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfdHR5X2RpcjsKIAlzdHJ1Y3QgZGVidWdmc19ibG9iX3dyYXBwZXIgdHhfYmxvYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9LY29uZmlnIGIvZHJpdmVycy9uZXQvY2FuL0tjb25maWcKaW5kZXggOThkNzNhYS4uNTg4MDhmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvY2FuL0tjb25maWcKQEAgLTEzMSw3ICsxMzEsNyBAQAogCiBjb25maWcgQ0FOX1hJTElOWENBTgogCXRyaXN0YXRlICJYaWxpbnggQ0FOIgotCWRlcGVuZHMgb24gQVJDSF9aWU5RIHx8IE1JQ1JPQkxBWkUgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBBUkNIX1pZTlEgfHwgQVJNNjQgfHwgTUlDUk9CTEFaRSB8fCBDT01QSUxFX1RFU1QKIAlkZXBlbmRzIG9uIENPTU1PTl9DTEsgJiYgSEFTX0lPTUVNCiAJLS0taGVscC0tLQogCSAgWGlsaW54IENBTiBkcml2ZXIuIFRoaXMgZHJpdmVyIHN1cHBvcnRzIGJvdGggc29mdCBBWEkgQ0FOIElQIGFuZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2F0OTFfY2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vYXQ5MV9jYW4uYwppbmRleCBlZWI0YjhiLi5mNGU0MGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vYXQ5MV9jYW4uYworKysgYi9kcml2ZXJzL25ldC9jYW4vYXQ5MV9jYW4uYwpAQCAtMjkxLDEzICsyOTEsMTMgQEAKIAogc3RhdGljIGlubGluZSB1MzIgYXQ5MV9yZWFkKGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYsIGVudW0gYXQ5MV9yZWcgcmVnKQogewotCXJldHVybiBfX3Jhd19yZWFkbChwcml2LT5yZWdfYmFzZSArIHJlZyk7CisJcmV0dXJuIHJlYWRsX3JlbGF4ZWQocHJpdi0+cmVnX2Jhc2UgKyByZWcpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXQ5MV93cml0ZShjb25zdCBzdHJ1Y3QgYXQ5MV9wcml2ICpwcml2LCBlbnVtIGF0OTFfcmVnIHJlZywKIAkJdTMyIHZhbHVlKQogewotCV9fcmF3X3dyaXRlbCh2YWx1ZSwgcHJpdi0+cmVnX2Jhc2UgKyByZWcpOworCXdyaXRlbF9yZWxheGVkKHZhbHVlLCBwcml2LT5yZWdfYmFzZSArIHJlZyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfbWJfbW9kZV9wcmlvKGNvbnN0IHN0cnVjdCBhdDkxX3ByaXYgKnByaXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vYmZpbl9jYW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi9iZmluX2Nhbi5jCmluZGV4IGU3YTYzNjMuLjI3YWQzMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9iZmluX2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9iZmluX2Nhbi5jCkBAIC0yMCwxMyArMjAsMTIxIEBACiAjaW5jbHVkZSA8bGludXgvY2FuL2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Nhbi9lcnJvci5oPgogCi0jaW5jbHVkZSA8YXNtL2JmaW5fY2FuLmg+CiAjaW5jbHVkZSA8YXNtL3BvcnRtdXguaD4KIAogI2RlZmluZSBEUlZfTkFNRSAiYmZpbl9jYW4iCiAjZGVmaW5lIEJGSU5fQ0FOX1RJTUVPVVQgMTAwCiAjZGVmaW5lIFRYX0VDSE9fU0tCX01BWCAgMQogCisvKiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBjaGFubmVscyAqLworI2RlZmluZSBUUkFOU01JVF9DSEwgMjQKKyNkZWZpbmUgUkVDRUlWRV9TVERfQ0hMIDAKKyNkZWZpbmUgUkVDRUlWRV9FWFRfQ0hMIDQKKyNkZWZpbmUgUkVDRUlWRV9SVFJfQ0hMIDgKKyNkZWZpbmUgUkVDRUlWRV9FWFRfUlRSX0NITCAxMgorI2RlZmluZSBNQVhfQ0hMX05VTUJFUiAzMgorCisvKiBBbGwgQmxhY2tmaW4gc3lzdGVtIE1NUnMgYXJlIHBhZGRlZCB0byAzMmJpdHMgZXZlbiBpZiB0aGUgcmVnaXN0ZXIKKyAqIGl0c2VsZiBpcyBvbmx5IDE2Yml0cy4gIFNvIHVzZSBhIGhlbHBlciBtYWNybyB0byBzdHJlYW1saW5lIHRoaXMKKyAqLworI2RlZmluZSBfX0JGUChtKSB1MTYgbTsgdTE2IF9fcGFkXyMjbQorCisvKiBiZmluIGNhbiByZWdpc3RlcnMgbGF5b3V0ICovCitzdHJ1Y3QgYmZpbl9jYW5fbWFza19yZWdzIHsKKwlfX0JGUChhbWwpOworCV9fQkZQKGFtaCk7Cit9OworCitzdHJ1Y3QgYmZpbl9jYW5fY2hhbm5lbF9yZWdzIHsKKwkvKiBkYXRhWzAsMiw0LDZdIC0+IGRhdGF7MCwxLDIsM30gd2hpbGUgZGF0YVsxLDMsNSw3XSBpcyBwYWRkaW5nICovCisJdTE2IGRhdGFbOF07CisJX19CRlAoZGxjKTsKKwlfX0JGUCh0c3YpOworCV9fQkZQKGlkMCk7CisJX19CRlAoaWQxKTsKK307CisKK3N0cnVjdCBiZmluX2Nhbl9yZWdzIHsKKwkvKiBnbG9iYWwgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycyAqLworCV9fQkZQKG1jMSk7CQkvKiBvZmZzZXQgMHgwMCAqLworCV9fQkZQKG1kMSk7CQkvKiBvZmZzZXQgMHgwNCAqLworCV9fQkZQKHRyczEpOwkJLyogb2Zmc2V0IDB4MDggKi8KKwlfX0JGUCh0cnIxKTsJCS8qIG9mZnNldCAweDBjICovCisJX19CRlAodGExKTsJCS8qIG9mZnNldCAweDEwICovCisJX19CRlAoYWExKTsJCS8qIG9mZnNldCAweDE0ICovCisJX19CRlAocm1wMSk7CQkvKiBvZmZzZXQgMHgxOCAqLworCV9fQkZQKHJtbDEpOwkJLyogb2Zmc2V0IDB4MWMgKi8KKwlfX0JGUChtYnRpZjEpOwkJLyogb2Zmc2V0IDB4MjAgKi8KKwlfX0JGUChtYnJpZjEpOwkJLyogb2Zmc2V0IDB4MjQgKi8KKwlfX0JGUChtYmltMSk7CQkvKiBvZmZzZXQgMHgyOCAqLworCV9fQkZQKHJmaDEpOwkJLyogb2Zmc2V0IDB4MmMgKi8KKwlfX0JGUChvcHNzMSk7CQkvKiBvZmZzZXQgMHgzMCAqLworCXUzMiBfX3BhZDFbM107CisJX19CRlAobWMyKTsJCS8qIG9mZnNldCAweDQwICovCisJX19CRlAobWQyKTsJCS8qIG9mZnNldCAweDQ0ICovCisJX19CRlAodHJzMik7CQkvKiBvZmZzZXQgMHg0OCAqLworCV9fQkZQKHRycjIpOwkJLyogb2Zmc2V0IDB4NGMgKi8KKwlfX0JGUCh0YTIpOwkJLyogb2Zmc2V0IDB4NTAgKi8KKwlfX0JGUChhYTIpOwkJLyogb2Zmc2V0IDB4NTQgKi8KKwlfX0JGUChybXAyKTsJCS8qIG9mZnNldCAweDU4ICovCisJX19CRlAocm1sMik7CQkvKiBvZmZzZXQgMHg1YyAqLworCV9fQkZQKG1idGlmMik7CQkvKiBvZmZzZXQgMHg2MCAqLworCV9fQkZQKG1icmlmMik7CQkvKiBvZmZzZXQgMHg2NCAqLworCV9fQkZQKG1iaW0yKTsJCS8qIG9mZnNldCAweDY4ICovCisJX19CRlAocmZoMik7CQkvKiBvZmZzZXQgMHg2YyAqLworCV9fQkZQKG9wc3MyKTsJCS8qIG9mZnNldCAweDcwICovCisJdTMyIF9fcGFkMlszXTsKKwlfX0JGUChjbG9jayk7CQkvKiBvZmZzZXQgMHg4MCAqLworCV9fQkZQKHRpbWluZyk7CQkvKiBvZmZzZXQgMHg4NCAqLworCV9fQkZQKGRlYnVnKTsJCS8qIG9mZnNldCAweDg4ICovCisJX19CRlAoc3RhdHVzKTsJCS8qIG9mZnNldCAweDhjICovCisJX19CRlAoY2VjKTsJCS8qIG9mZnNldCAweDkwICovCisJX19CRlAoZ2lzKTsJCS8qIG9mZnNldCAweDk0ICovCisJX19CRlAoZ2ltKTsJCS8qIG9mZnNldCAweDk4ICovCisJX19CRlAoZ2lmKTsJCS8qIG9mZnNldCAweDljICovCisJX19CRlAoY29udHJvbCk7CQkvKiBvZmZzZXQgMHhhMCAqLworCV9fQkZQKGludHIpOwkJLyogb2Zmc2V0IDB4YTQgKi8KKwlfX0JGUCh2ZXJzaW9uKTsJCS8qIG9mZnNldCAweGE4ICovCisJX19CRlAobWJ0ZCk7CQkvKiBvZmZzZXQgMHhhYyAqLworCV9fQkZQKGV3cik7CQkvKiBvZmZzZXQgMHhiMCAqLworCV9fQkZQKGVzcik7CQkvKiBvZmZzZXQgMHhiNCAqLworCXUzMiBfX3BhZDNbMl07CisJX19CRlAodWNyZWcpOwkJLyogb2Zmc2V0IDB4YzAgKi8KKwlfX0JGUCh1Y2NudCk7CQkvKiBvZmZzZXQgMHhjNCAqLworCV9fQkZQKHVjcmMpOwkJLyogb2Zmc2V0IDB4YzggKi8KKwlfX0JGUCh1Y2NuZik7CQkvKiBvZmZzZXQgMHhjYyAqLworCXUzMiBfX3BhZDRbMV07CisJX19CRlAodmVyc2lvbjIpOwkvKiBvZmZzZXQgMHhkNCAqLworCXUzMiBfX3BhZDVbMTBdOworCisJLyogY2hhbm5lbChtYWlsYm94KSBtYXNrIGFuZCBtZXNzYWdlIHJlZ2lzdGVycyAqLworCXN0cnVjdCBiZmluX2Nhbl9tYXNrX3JlZ3MgbXNrW01BWF9DSExfTlVNQkVSXTsJCS8qIG9mZnNldCAweDEwMCAqLworCXN0cnVjdCBiZmluX2Nhbl9jaGFubmVsX3JlZ3MgY2hsW01BWF9DSExfTlVNQkVSXTsJLyogb2Zmc2V0IDB4MjAwICovCit9OworCisjdW5kZWYgX19CRlAKKworI2RlZmluZSBTUlMgMHgwMDAxCQkvKiBTb2Z0d2FyZSBSZXNldCAqLworI2RlZmluZSBTRVIgMHgwMDA4CQkvKiBTdHVmZiBFcnJvciAqLworI2RlZmluZSBCT0lNIDB4MDAwOAkJLyogRW5hYmxlIEJ1cyBPZmYgSW50ZXJydXB0ICovCisjZGVmaW5lIENDUiAweDAwODAJCS8qIENBTiBDb25maWd1cmF0aW9uIE1vZGUgUmVxdWVzdCAqLworI2RlZmluZSBDQ0EgMHgwMDgwCQkvKiBDb25maWd1cmF0aW9uIE1vZGUgQWNrbm93bGVkZ2UgKi8KKyNkZWZpbmUgU0FNIDB4MDA4MAkJLyogU2FtcGxpbmcgKi8KKyNkZWZpbmUgQU1FIDB4ODAwMAkJLyogQWNjZXB0YW5jZSBNYXNrIEVuYWJsZSAqLworI2RlZmluZSBSTUxJTSAweDAwODAJCS8qIEVuYWJsZSBSWCBNZXNzYWdlIExvc3QgSW50ZXJydXB0ICovCisjZGVmaW5lIFJNTElTIDB4MDA4MAkJLyogUlggTWVzc2FnZSBMb3N0IElSUSBTdGF0dXMgKi8KKyNkZWZpbmUgUlRSIDB4NDAwMAkJLyogUmVtb3RlIEZyYW1lIFRyYW5zbWlzc2lvbiBSZXF1ZXN0ICovCisjZGVmaW5lIEJPSVMgMHgwMDA4CQkvKiBCdXMgT2ZmIElSUSBTdGF0dXMgKi8KKyNkZWZpbmUgSURFIDB4MjAwMAkJLyogSWRlbnRpZmllciBFeHRlbnNpb24gKi8KKyNkZWZpbmUgRVBJUyAweDAwMDQJCS8qIEVycm9yLVBhc3NpdmUgTW9kZSBJUlEgU3RhdHVzICovCisjZGVmaW5lIEVQSU0gMHgwMDA0CQkvKiBFbmFibGUgRXJyb3ItUGFzc2l2ZSBNb2RlIEludGVycnVwdCAqLworI2RlZmluZSBFV1RJUyAweDAwMDEJCS8qIFRYIEVycm9yIENvdW50IElSUSBTdGF0dXMgKi8KKyNkZWZpbmUgRVdSSVMgMHgwMDAyCQkvKiBSWCBFcnJvciBDb3VudCBJUlEgU3RhdHVzICovCisjZGVmaW5lIEJFRiAweDAwNDAJCS8qIEJpdCBFcnJvciBGbGFnICovCisjZGVmaW5lIEZFUiAweDAwODAJCS8qIEZvcm0gRXJyb3IgRmxhZyAqLworI2RlZmluZSBTTVIgMHgwMDIwCQkvKiBTbGVlcCBNb2RlIFJlcXVlc3QgKi8KKyNkZWZpbmUgU01BQ0sgMHgwMDA4CQkvKiBTbGVlcCBNb2RlIEFja25vd2xlZGdlICovCisKIC8qCiAgKiBiZmluIGNhbiBwcml2YXRlIGRhdGEKICAqLwpAQCAtNzgsOCArMTg2LDggQEAKIAlpZiAocHJpdi0+Y2FuLmN0cmxtb2RlICYgQ0FOX0NUUkxNT0RFXzNfU0FNUExFUykKIAkJdGltaW5nIHw9IFNBTTsKIAotCWJmaW5fd3JpdGUoJnJlZy0+Y2xvY2ssIGNsayk7Ci0JYmZpbl93cml0ZSgmcmVnLT50aW1pbmcsIHRpbWluZyk7CisJd3JpdGV3KGNsaywgJnJlZy0+Y2xvY2spOworCXdyaXRldyh0aW1pbmcsICZyZWctPnRpbWluZyk7CiAKIAluZXRkZXZfaW5mbyhkZXYsICJzZXR0aW5nIENMT0NLPTB4JTA0eCBUSU1JTkc9MHglMDR4XG4iLCBjbGssIHRpbWluZyk7CiAKQEAgLTk0LDE2ICsyMDIsMTQgQEAKIAlpbnQgaTsKIAogCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLwotCWJmaW5fd3JpdGUoJnJlZy0+bWJpbTEsIDApOwotCWJmaW5fd3JpdGUoJnJlZy0+bWJpbTIsIDApOwotCWJmaW5fd3JpdGUoJnJlZy0+Z2ltLCAwKTsKKwl3cml0ZXcoMCwgJnJlZy0+bWJpbTEpOworCXdyaXRldygwLCAmcmVnLT5tYmltMik7CisJd3JpdGV3KDAsICZyZWctPmdpbSk7CiAKIAkvKiByZXNldCBjYW4gYW5kIGVudGVyIGNvbmZpZ3VyYXRpb24gbW9kZSAqLwotCWJmaW5fd3JpdGUoJnJlZy0+Y29udHJvbCwgU1JTIHwgQ0NSKTsKLQlTU1lOQygpOwotCWJmaW5fd3JpdGUoJnJlZy0+Y29udHJvbCwgQ0NSKTsKLQlTU1lOQygpOwotCXdoaWxlICghKGJmaW5fcmVhZCgmcmVnLT5jb250cm9sKSAmIENDQSkpIHsKKwl3cml0ZXcoU1JTIHwgQ0NSLCAmcmVnLT5jb250cm9sKTsKKwl3cml0ZXcoQ0NSLCAmcmVnLT5jb250cm9sKTsKKwl3aGlsZSAoIShyZWFkdygmcmVnLT5jb250cm9sKSAmIENDQSkpIHsKIAkJdWRlbGF5KDEwKTsKIAkJaWYgKC0tdGltZW91dCA9PSAwKSB7CiAJCQluZXRkZXZfZXJyKGRldiwgImZhaWwgdG8gZW50ZXIgY29uZmlndXJhdGlvbiBtb2RlXG4iKTsKQEAgLTExNiwzNCArMjIyLDMzIEBACiAJICogYnkgd3JpdGluZyB0byBDQU4gTWFpbGJveCBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAxIGFuZCAyCiAJICogRm9yIGFsbCBiaXRzOiAwIC0gTWFpbGJveCBkaXNhYmxlZCwgMSAtIE1haWxib3ggZW5hYmxlZAogCSAqLwotCWJmaW5fd3JpdGUoJnJlZy0+bWMxLCAwKTsKLQliZmluX3dyaXRlKCZyZWctPm1jMiwgMCk7CisJd3JpdGV3KDAsICZyZWctPm1jMSk7CisJd3JpdGV3KDAsICZyZWctPm1jMik7CiAKIAkvKiBTZXQgTWFpbGJveCBEaXJlY3Rpb24gKi8KLQliZmluX3dyaXRlKCZyZWctPm1kMSwgMHhGRkZGKTsgICAvKiBtYWlsYm94IDEtMTYgYXJlIFJYICovCi0JYmZpbl93cml0ZSgmcmVnLT5tZDIsIDApOyAgIC8qIG1haWxib3ggMTctMzIgYXJlIFRYICovCisJd3JpdGV3KDB4RkZGRiwgJnJlZy0+bWQxKTsgICAvKiBtYWlsYm94IDEtMTYgYXJlIFJYICovCisJd3JpdGV3KDAsICZyZWctPm1kMik7ICAgLyogbWFpbGJveCAxNy0zMiBhcmUgVFggKi8KIAogCS8qIFJFQ0VJVkVfU1REX0NITCAqLwogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJYmZpbl93cml0ZSgmcmVnLT5jaGxbUkVDRUlWRV9TVERfQ0hMICsgaV0uaWQwLCAwKTsKLQkJYmZpbl93cml0ZSgmcmVnLT5jaGxbUkVDRUlWRV9TVERfQ0hMICsgaV0uaWQxLCBBTUUpOwotCQliZmluX3dyaXRlKCZyZWctPmNobFtSRUNFSVZFX1NURF9DSEwgKyBpXS5kbGMsIDApOwotCQliZmluX3dyaXRlKCZyZWctPm1za1tSRUNFSVZFX1NURF9DSEwgKyBpXS5hbWgsIDB4MUZGRik7Ci0JCWJmaW5fd3JpdGUoJnJlZy0+bXNrW1JFQ0VJVkVfU1REX0NITCArIGldLmFtbCwgMHhGRkZGKTsKKwkJd3JpdGV3KDAsICZyZWctPmNobFtSRUNFSVZFX1NURF9DSEwgKyBpXS5pZDApOworCQl3cml0ZXcoQU1FLCAmcmVnLT5jaGxbUkVDRUlWRV9TVERfQ0hMICsgaV0uaWQxKTsKKwkJd3JpdGV3KDAsICZyZWctPmNobFtSRUNFSVZFX1NURF9DSEwgKyBpXS5kbGMpOworCQl3cml0ZXcoMHgxRkZGLCAmcmVnLT5tc2tbUkVDRUlWRV9TVERfQ0hMICsgaV0uYW1oKTsKKwkJd3JpdGV3KDB4RkZGRiwgJnJlZy0+bXNrW1JFQ0VJVkVfU1REX0NITCArIGldLmFtbCk7CiAJfQogCiAJLyogUkVDRUlWRV9FWFRfQ0hMICovCiAJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQliZmluX3dyaXRlKCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSEwgKyBpXS5pZDAsIDApOwotCQliZmluX3dyaXRlKCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSEwgKyBpXS5pZDEsIEFNRSB8IElERSk7Ci0JCWJmaW5fd3JpdGUoJnJlZy0+Y2hsW1JFQ0VJVkVfRVhUX0NITCArIGldLmRsYywgMCk7Ci0JCWJmaW5fd3JpdGUoJnJlZy0+bXNrW1JFQ0VJVkVfRVhUX0NITCArIGldLmFtaCwgMHgxRkZGKTsKLQkJYmZpbl93cml0ZSgmcmVnLT5tc2tbUkVDRUlWRV9FWFRfQ0hMICsgaV0uYW1sLCAweEZGRkYpOworCQl3cml0ZXcoMCwgJnJlZy0+Y2hsW1JFQ0VJVkVfRVhUX0NITCArIGldLmlkMCk7CisJCXdyaXRldyhBTUUgfCBJREUsICZyZWctPmNobFtSRUNFSVZFX0VYVF9DSEwgKyBpXS5pZDEpOworCQl3cml0ZXcoMCwgJnJlZy0+Y2hsW1JFQ0VJVkVfRVhUX0NITCArIGldLmRsYyk7CisJCXdyaXRldygweDFGRkYsICZyZWctPm1za1tSRUNFSVZFX0VYVF9DSEwgKyBpXS5hbWgpOworCQl3cml0ZXcoMHhGRkZGLCAmcmVnLT5tc2tbUkVDRUlWRV9FWFRfQ0hMICsgaV0uYW1sKTsKIAl9CiAKLQliZmluX3dyaXRlKCZyZWctPm1jMiwgQklUKFRSQU5TTUlUX0NITCAtIDE2KSk7Ci0JYmZpbl93cml0ZSgmcmVnLT5tYzEsIEJJVChSRUNFSVZFX1NURF9DSEwpICsgQklUKFJFQ0VJVkVfRVhUX0NITCkpOwotCVNTWU5DKCk7CisJd3JpdGV3KEJJVChUUkFOU01JVF9DSEwgLSAxNiksICZyZWctPm1jMik7CisJd3JpdGV3KEJJVChSRUNFSVZFX1NURF9DSEwpICsgQklUKFJFQ0VJVkVfRVhUX0NITCksICZyZWctPm1jMSk7CiAKIAlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfU1RPUFBFRDsKIH0KQEAgLTE1Nyw5ICsyNjIsOSBAQAogCS8qCiAJICogbGVhdmUgY29uZmlndXJhdGlvbiBtb2RlCiAJICovCi0JYmZpbl93cml0ZSgmcmVnLT5jb250cm9sLCBiZmluX3JlYWQoJnJlZy0+Y29udHJvbCkgJiB+Q0NSKTsKKwl3cml0ZXcocmVhZHcoJnJlZy0+Y29udHJvbCkgJiB+Q0NSLCAmcmVnLT5jb250cm9sKTsKIAotCXdoaWxlIChiZmluX3JlYWQoJnJlZy0+c3RhdHVzKSAmIENDQSkgeworCXdoaWxlIChyZWFkdygmcmVnLT5zdGF0dXMpICYgQ0NBKSB7CiAJCXVkZWxheSgxMCk7CiAJCWlmICgtLXRpbWVvdXQgPT0gMCkgewogCQkJbmV0ZGV2X2VycihkZXYsICJmYWlsIHRvIGxlYXZlIGNvbmZpZ3VyYXRpb24gbW9kZVxuIik7CkBAIC0xNzAsMjYgKzI3NSwyNSBAQAogCS8qCiAJICogY2xlYXIgX0FsbF8gIHR4IGFuZCByeCBpbnRlcnJ1cHRzCiAJICovCi0JYmZpbl93cml0ZSgmcmVnLT5tYnRpZjEsIDB4RkZGRik7Ci0JYmZpbl93cml0ZSgmcmVnLT5tYnRpZjIsIDB4RkZGRik7Ci0JYmZpbl93cml0ZSgmcmVnLT5tYnJpZjEsIDB4RkZGRik7Ci0JYmZpbl93cml0ZSgmcmVnLT5tYnJpZjIsIDB4RkZGRik7CisJd3JpdGV3KDB4RkZGRiwgJnJlZy0+bWJ0aWYxKTsKKwl3cml0ZXcoMHhGRkZGLCAmcmVnLT5tYnRpZjIpOworCXdyaXRldygweEZGRkYsICZyZWctPm1icmlmMSk7CisJd3JpdGV3KDB4RkZGRiwgJnJlZy0+bWJyaWYyKTsKIAogCS8qCiAJICogY2xlYXIgZ2xvYmFsIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIKIAkgKi8KLQliZmluX3dyaXRlKCZyZWctPmdpcywgMHg3RkYpOyAvKiBvdmVyd3JpdGVzIHdpdGggJzEnICovCisJd3JpdGV3KDB4N0ZGLCAmcmVnLT5naXMpOyAvKiBvdmVyd3JpdGVzIHdpdGggJzEnICovCiAKIAkvKgogCSAqIEluaXRpYWxpemUgSW50ZXJydXB0cwogCSAqIC0gc2V0IGJpdHMgaW4gdGhlIG1haWxib3ggaW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIKIAkgKiAtIGdsb2JhbCBpbnRlcnJ1cHQgbWFzawogCSAqLwotCWJmaW5fd3JpdGUoJnJlZy0+bWJpbTEsIEJJVChSRUNFSVZFX1NURF9DSEwpICsgQklUKFJFQ0VJVkVfRVhUX0NITCkpOwotCWJmaW5fd3JpdGUoJnJlZy0+bWJpbTIsIEJJVChUUkFOU01JVF9DSEwgLSAxNikpOworCXdyaXRldyhCSVQoUkVDRUlWRV9TVERfQ0hMKSArIEJJVChSRUNFSVZFX0VYVF9DSEwpLCAmcmVnLT5tYmltMSk7CisJd3JpdGV3KEJJVChUUkFOU01JVF9DSEwgLSAxNiksICZyZWctPm1iaW0yKTsKIAotCWJmaW5fd3JpdGUoJnJlZy0+Z2ltLCBFUElNIHwgQk9JTSB8IFJNTElNKTsKLQlTU1lOQygpOworCXdyaXRldyhFUElNIHwgQk9JTSB8IFJNTElNLCAmcmVnLT5naW0pOwogfQogCiBzdGF0aWMgdm9pZCBiZmluX2Nhbl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMjI2LDcgKzMzMCw3IEBACiAJc3RydWN0IGJmaW5fY2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBiZmluX2Nhbl9yZWdzIF9faW9tZW0gKnJlZyA9IHByaXYtPm1lbWJhc2U7CiAKLQl1MTYgY2VjID0gYmZpbl9yZWFkKCZyZWctPmNlYyk7CisJdTE2IGNlYyA9IHJlYWR3KCZyZWctPmNlYyk7CiAKIAliZWMtPnR4ZXJyID0gY2VjID4+IDg7CiAJYmVjLT5yeGVyciA9IGNlYzsKQEAgLTI1MiwyOCArMzU2LDI4IEBACiAKIAkvKiBmaWxsIGlkICovCiAJaWYgKGlkICYgQ0FOX0VGRl9GTEFHKSB7Ci0JCWJmaW5fd3JpdGUoJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uaWQwLCBpZCk7CisJCXdyaXRldyhpZCwgJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uaWQwKTsKIAkJdmFsID0gKChpZCAmIDB4MUZGRjAwMDApID4+IDE2KSB8IElERTsKIAl9IGVsc2UKIAkJdmFsID0gKGlkIDw8IDIpOwogCWlmIChpZCAmIENBTl9SVFJfRkxBRykKIAkJdmFsIHw9IFJUUjsKLQliZmluX3dyaXRlKCZyZWctPmNobFtUUkFOU01JVF9DSExdLmlkMSwgdmFsIHwgQU1FKTsKKwl3cml0ZXcodmFsIHwgQU1FLCAmcmVnLT5jaGxbVFJBTlNNSVRfQ0hMXS5pZDEpOwogCiAJLyogZmlsbCBwYXlsb2FkICovCiAJZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMikgewogCQl2YWwgPSAoKDcgLSBpKSA8IGRsYyA/IChkYXRhWzcgLSBpXSkgOiAwKSArCiAJCQkoKDYgLSBpKSA8IGRsYyA/IChkYXRhWzYgLSBpXSA8PCA4KSA6IDApOwotCQliZmluX3dyaXRlKCZyZWctPmNobFtUUkFOU01JVF9DSExdLmRhdGFbaV0sIHZhbCk7CisJCXdyaXRldyh2YWwsICZyZWctPmNobFtUUkFOU01JVF9DSExdLmRhdGFbaV0pOwogCX0KIAogCS8qIGZpbGwgZGF0YSBsZW5ndGggY29kZSAqLwotCWJmaW5fd3JpdGUoJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uZGxjLCBkbGMpOworCXdyaXRldyhkbGMsICZyZWctPmNobFtUUkFOU01JVF9DSExdLmRsYyk7CiAKIAljYW5fcHV0X2VjaG9fc2tiKHNrYiwgZGV2LCAwKTsKIAogCS8qIHNldCB0cmFuc21pdCByZXF1ZXN0ICovCi0JYmZpbl93cml0ZSgmcmVnLT50cnMyLCBCSVQoVFJBTlNNSVRfQ0hMIC0gMTYpKTsKKwl3cml0ZXcoQklUKFRSQU5TTUlUX0NITCAtIDE2KSwgJnJlZy0+dHJzMik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI5NiwyNiArNDAwLDI2IEBACiAJLyogZ2V0IGlkICovCiAJaWYgKGlzcmMgJiBCSVQoUkVDRUlWRV9FWFRfQ0hMKSkgewogCQkvKiBleHRlbmRlZCBmcmFtZSBmb3JtYXQgKEVGRikgKi8KLQkJY2YtPmNhbl9pZCA9ICgoYmZpbl9yZWFkKCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSExdLmlkMSkKKwkJY2YtPmNhbl9pZCA9ICgocmVhZHcoJnJlZy0+Y2hsW1JFQ0VJVkVfRVhUX0NITF0uaWQxKQogCQkJICAgICAmIDB4MUZGRikgPDwgMTYpCi0JCQkgICAgICsgYmZpbl9yZWFkKCZyZWctPmNobFtSRUNFSVZFX0VYVF9DSExdLmlkMCk7CisJCQkgICAgICsgcmVhZHcoJnJlZy0+Y2hsW1JFQ0VJVkVfRVhUX0NITF0uaWQwKTsKIAkJY2YtPmNhbl9pZCB8PSBDQU5fRUZGX0ZMQUc7CiAJCW9iaiA9IFJFQ0VJVkVfRVhUX0NITDsKIAl9IGVsc2UgewogCQkvKiBzdGFuZGFyZCBmcmFtZSBmb3JtYXQgKFNGRikgKi8KLQkJY2YtPmNhbl9pZCA9IChiZmluX3JlYWQoJnJlZy0+Y2hsW1JFQ0VJVkVfU1REX0NITF0uaWQxKQorCQljZi0+Y2FuX2lkID0gKHJlYWR3KCZyZWctPmNobFtSRUNFSVZFX1NURF9DSExdLmlkMSkKIAkJCSAgICAgJiAweDFmZmMpID4+IDI7CiAJCW9iaiA9IFJFQ0VJVkVfU1REX0NITDsKIAl9Ci0JaWYgKGJmaW5fcmVhZCgmcmVnLT5jaGxbb2JqXS5pZDEpICYgUlRSKQorCWlmIChyZWFkdygmcmVnLT5jaGxbb2JqXS5pZDEpICYgUlRSKQogCQljZi0+Y2FuX2lkIHw9IENBTl9SVFJfRkxBRzsKIAogCS8qIGdldCBkYXRhIGxlbmd0aCBjb2RlICovCi0JY2YtPmNhbl9kbGMgPSBnZXRfY2FuX2RsYyhiZmluX3JlYWQoJnJlZy0+Y2hsW29ial0uZGxjKSAmIDB4Rik7CisJY2YtPmNhbl9kbGMgPSBnZXRfY2FuX2RsYyhyZWFkdygmcmVnLT5jaGxbb2JqXS5kbGMpICYgMHhGKTsKIAogCS8qIGdldCBwYXlsb2FkICovCiAJZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gMikgewotCQl2YWwgPSBiZmluX3JlYWQoJnJlZy0+Y2hsW29ial0uZGF0YVtpXSk7CisJCXZhbCA9IHJlYWR3KCZyZWctPmNobFtvYmpdLmRhdGFbaV0pOwogCQljZi0+ZGF0YVs3IC0gaV0gPSAoNyAtIGkpIDwgY2YtPmNhbl9kbGMgPyB2YWwgOiAwOwogCQljZi0+ZGF0YVs2IC0gaV0gPSAoNiAtIGkpIDwgY2YtPmNhbl9kbGMgPyAodmFsID4+IDgpIDogMDsKIAl9CkBAIC0zNjksNyArNDczLDcgQEAKIAogCWlmIChzdGF0ZSAhPSBwcml2LT5jYW4uc3RhdGUgJiYgKHN0YXRlID09IENBTl9TVEFURV9FUlJPUl9XQVJOSU5HIHx8CiAJCQkJc3RhdGUgPT0gQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkUpKSB7Ci0JCXUxNiBjZWMgPSBiZmluX3JlYWQoJnJlZy0+Y2VjKTsKKwkJdTE2IGNlYyA9IHJlYWR3KCZyZWctPmNlYyk7CiAJCXU4IHJ4ZXJyID0gY2VjOwogCQl1OCB0eGVyciA9IGNlYyA+PiA4OwogCkBAIC00MjAsMjMgKzUyNCwyMyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPnN0YXRzOwogCXUxNiBzdGF0dXMsIGlzcmM7CiAKLQlpZiAoKGlycSA9PSBwcml2LT50eF9pcnEpICYmIGJmaW5fcmVhZCgmcmVnLT5tYnRpZjIpKSB7CisJaWYgKChpcnEgPT0gcHJpdi0+dHhfaXJxKSAmJiByZWFkdygmcmVnLT5tYnRpZjIpKSB7CiAJCS8qIHRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQgKi8KLQkJYmZpbl93cml0ZSgmcmVnLT5tYnRpZjIsIDB4RkZGRik7CisJCXdyaXRldygweEZGRkYsICZyZWctPm1idGlmMik7CiAJCXN0YXRzLT50eF9wYWNrZXRzKys7Ci0JCXN0YXRzLT50eF9ieXRlcyArPSBiZmluX3JlYWQoJnJlZy0+Y2hsW1RSQU5TTUlUX0NITF0uZGxjKTsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IHJlYWR3KCZyZWctPmNobFtUUkFOU01JVF9DSExdLmRsYyk7CiAJCWNhbl9nZXRfZWNob19za2IoZGV2LCAwKTsKIAkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwotCX0gZWxzZSBpZiAoKGlycSA9PSBwcml2LT5yeF9pcnEpICYmIGJmaW5fcmVhZCgmcmVnLT5tYnJpZjEpKSB7CisJfSBlbHNlIGlmICgoaXJxID09IHByaXYtPnJ4X2lycSkgJiYgcmVhZHcoJnJlZy0+bWJyaWYxKSkgewogCQkvKiByZWNlaXZlIGludGVycnVwdCAqLwotCQlpc3JjID0gYmZpbl9yZWFkKCZyZWctPm1icmlmMSk7Ci0JCWJmaW5fd3JpdGUoJnJlZy0+bWJyaWYxLCAweEZGRkYpOworCQlpc3JjID0gcmVhZHcoJnJlZy0+bWJyaWYxKTsKKwkJd3JpdGV3KDB4RkZGRiwgJnJlZy0+bWJyaWYxKTsKIAkJYmZpbl9jYW5fcngoZGV2LCBpc3JjKTsKLQl9IGVsc2UgaWYgKChpcnEgPT0gcHJpdi0+ZXJyX2lycSkgJiYgYmZpbl9yZWFkKCZyZWctPmdpcykpIHsKKwl9IGVsc2UgaWYgKChpcnEgPT0gcHJpdi0+ZXJyX2lycSkgJiYgcmVhZHcoJnJlZy0+Z2lzKSkgewogCQkvKiBlcnJvciBpbnRlcnJ1cHQgKi8KLQkJaXNyYyA9IGJmaW5fcmVhZCgmcmVnLT5naXMpOwotCQlzdGF0dXMgPSBiZmluX3JlYWQoJnJlZy0+ZXNyKTsKLQkJYmZpbl93cml0ZSgmcmVnLT5naXMsIDB4N0ZGKTsKKwkJaXNyYyA9IHJlYWR3KCZyZWctPmdpcyk7CisJCXN0YXR1cyA9IHJlYWR3KCZyZWctPmVzcik7CisJCXdyaXRldygweDdGRiwgJnJlZy0+Z2lzKTsKIAkJYmZpbl9jYW5fZXJyKGRldiwgaXNyYywgc3RhdHVzKTsKIAl9IGVsc2UgewogCQlyZXR1cm4gSVJRX05PTkU7CkBAIC01NTYsMTYgKzY2MCwxMCBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzX21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzX21lbSksCi0JCQkJZGV2X25hbWUoJnBkZXYtPmRldikpKSB7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBleGl0OwotCX0KLQogCS8qIHJlcXVlc3QgcGVyaXBoZXJhbCBwaW5zICovCiAJZXJyID0gcGVyaXBoZXJhbF9yZXF1ZXN0X2xpc3QocGRhdGEsIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKIAlpZiAoZXJyKQotCQlnb3RvIGV4aXRfbWVtX3JlbGVhc2U7CisJCWdvdG8gZXhpdDsKIAogCWRldiA9IGFsbG9jX2JmaW5fY2FuZGV2KCk7CiAJaWYgKCFkZXYpIHsKQEAgLTU3NCw3ICs2NzIsMTMgQEAKIAl9CiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlwcml2LT5tZW1iYXNlID0gKHZvaWQgX19pb21lbSAqKXJlc19tZW0tPnN0YXJ0OworCisJcHJpdi0+bWVtYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXNfbWVtKTsKKwlpZiAoSVNfRVJSKHByaXYtPm1lbWJhc2UpKSB7CisJCWVyciA9IFBUUl9FUlIocHJpdi0+bWVtYmFzZSk7CisJCWdvdG8gZXhpdF9wZXJpX3Bpbl9mcmVlOworCX0KKwogCXByaXYtPnJ4X2lycSA9IHJ4X2lycS0+c3RhcnQ7CiAJcHJpdi0+dHhfaXJxID0gdHhfaXJxLT5zdGFydDsKIAlwcml2LT5lcnJfaXJxID0gZXJyX2lycS0+c3RhcnQ7CkBAIC02MDYsOCArNzEwLDYgQEAKIAlmcmVlX2NhbmRldihkZXYpOwogZXhpdF9wZXJpX3Bpbl9mcmVlOgogCXBlcmlwaGVyYWxfZnJlZV9saXN0KHBkYXRhKTsKLWV4aXRfbWVtX3JlbGVhc2U6Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlc19tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlc19tZW0pKTsKIGV4aXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTYxNiwxNSArNzE4LDExIEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBiZmluX2Nhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAogCWJmaW5fY2FuX3NldF9yZXNldF9tb2RlKGRldik7CiAKIAl1bnJlZ2lzdGVyX2NhbmRldihkZXYpOwogCi0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQogCXBlcmlwaGVyYWxfZnJlZV9saXN0KHByaXYtPnBpbl9saXN0KTsKIAogCWZyZWVfY2FuZGV2KGRldik7CkBAIC02NDEsOSArNzM5LDggQEAKIAogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpIHsKIAkJLyogZW50ZXIgc2xlZXAgbW9kZSAqLwotCQliZmluX3dyaXRlKCZyZWctPmNvbnRyb2wsIGJmaW5fcmVhZCgmcmVnLT5jb250cm9sKSB8IFNNUik7Ci0JCVNTWU5DKCk7Ci0JCXdoaWxlICghKGJmaW5fcmVhZCgmcmVnLT5pbnRyKSAmIFNNQUNLKSkgeworCQl3cml0ZXcocmVhZHcoJnJlZy0+Y29udHJvbCkgfCBTTVIsICZyZWctPmNvbnRyb2wpOworCQl3aGlsZSAoIShyZWFkdygmcmVnLT5pbnRyKSAmIFNNQUNLKSkgewogCQkJdWRlbGF5KDEwKTsKIAkJCWlmICgtLXRpbWVvdXQgPT0gMCkgewogCQkJCW5ldGRldl9lcnIoZGV2LCAiZmFpbCB0byBlbnRlciBzbGVlcCBtb2RlXG4iKTsKQEAgLTY2Myw4ICs3NjAsNyBAQAogCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgewogCQkvKiBsZWF2ZSBzbGVlcCBtb2RlICovCi0JCWJmaW5fd3JpdGUoJnJlZy0+aW50ciwgMCk7Ci0JCVNTWU5DKCk7CisJCXdyaXRldygwLCAmcmVnLT5pbnRyKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9jYzc3MC9jYzc3MF9wbGF0Zm9ybS5jIGIvZHJpdmVycy9uZXQvY2FuL2NjNzcwL2NjNzcwX3BsYXRmb3JtLmMKaW5kZXggYjFlODg1MS4uODY2ZTVlMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2NjNzcwL2NjNzcwX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2NjNzcwL2NjNzcwX3BsYXRmb3JtLmMKQEAgLTI1NCw3ICsyNTQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBjYzc3MF9wbGF0Zm9ybV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2M3NzBfcGxhdGZvcm1fdGFibGVbXSA9IHsKIAl7LmNvbXBhdGlibGUgPSAiYm9zY2gsY2M3NzAifSwgLyogQ0M3NzAgZnJvbSBCb3NjaCAqLwogCXsuY29tcGF0aWJsZSA9ICJpbnRjLDgyNTI3In0sICAvKiBBTjgyNTI3IGZyb20gSW50ZWwgQ1AgKi8KIAl7fSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9mbGV4Y2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vZmxleGNhbi5jCmluZGV4IDgwYzQ2YWQuLmFkMGE3ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9mbGV4Y2FuLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2ZsZXhjYW4uYwpAQCAtNTkyLDEzICs1OTIsMTIgQEAKIAkJcnhfc3RhdGUgPSB1bmxpa2VseShyZWdfZXNyICYgRkxFWENBTl9FU1JfUlhfV1JOKSA/CiAJCQkgICBDQU5fU1RBVEVfRVJST1JfV0FSTklORyA6IENBTl9TVEFURV9FUlJPUl9BQ1RJVkU7CiAJCW5ld19zdGF0ZSA9IG1heCh0eF9zdGF0ZSwgcnhfc3RhdGUpOwotCX0gZWxzZSBpZiAodW5saWtlbHkoZmx0ID09IEZMRVhDQU5fRVNSX0ZMVF9DT05GX1BBU1NJVkUpKSB7CisJfSBlbHNlIHsKIAkJX19mbGV4Y2FuX2dldF9iZXJyX2NvdW50ZXIoZGV2LCAmYmVjKTsKLQkJbmV3X3N0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkU7CisJCW5ld19zdGF0ZSA9IGZsdCA9PSBGTEVYQ0FOX0VTUl9GTFRfQ09ORl9QQVNTSVZFID8KKwkJCSAgICBDQU5fU1RBVEVfRVJST1JfUEFTU0lWRSA6IENBTl9TVEFURV9CVVNfT0ZGOwogCQlyeF9zdGF0ZSA9IGJlYy5yeGVyciA+PSBiZWMudHhlcnIgPyBuZXdfc3RhdGUgOiAwOwogCQl0eF9zdGF0ZSA9IGJlYy5yeGVyciA8PSBiZWMudHhlcnIgPyBuZXdfc3RhdGUgOiAwOwotCX0gZWxzZSB7Ci0JCW5ld19zdGF0ZSA9IENBTl9TVEFURV9CVVNfT0ZGOwogCX0KIAogCS8qIHN0YXRlIGhhc24ndCBjaGFuZ2VkICovCkBAIC0xMTU4LDEyICsxMTU3LDE5IEBACiAJY29uc3Qgc3RydWN0IGZsZXhjYW5fZGV2dHlwZV9kYXRhICpkZXZ0eXBlX2RhdGE7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgZmxleGNhbl9wcml2ICpwcml2OworCXN0cnVjdCByZWd1bGF0b3IgKnJlZ194Y2VpdmVyOwogCXN0cnVjdCByZXNvdXJjZSAqbWVtOwogCXN0cnVjdCBjbGsgKmNsa19pcGcgPSBOVUxMLCAqY2xrX3BlciA9IE5VTEw7CiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCWludCBlcnIsIGlycTsKIAl1MzIgY2xvY2tfZnJlcSA9IDA7CiAKKwlyZWdfeGNlaXZlciA9IGRldm1fcmVndWxhdG9yX2dldCgmcGRldi0+ZGV2LCAieGNlaXZlciIpOworCWlmIChQVFJfRVJSKHJlZ194Y2VpdmVyKSA9PSAtRVBST0JFX0RFRkVSKQorCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKKwllbHNlIGlmIChJU19FUlIocmVnX3hjZWl2ZXIpKQorCQlyZWdfeGNlaXZlciA9IE5VTEw7CisKIAlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCiAJCW9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLAogCQkJCQkJImNsb2NrLWZyZXF1ZW5jeSIsICZjbG9ja19mcmVxKTsKQEAgLTEyMjQsOSArMTIzMCw3IEBACiAJcHJpdi0+cGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKCZwZGV2LT5kZXYpOwogCXByaXYtPmRldnR5cGVfZGF0YSA9IGRldnR5cGVfZGF0YTsKIAotCXByaXYtPnJlZ194Y2VpdmVyID0gZGV2bV9yZWd1bGF0b3JfZ2V0KCZwZGV2LT5kZXYsICJ4Y2VpdmVyIik7Ci0JaWYgKElTX0VSUihwcml2LT5yZWdfeGNlaXZlcikpCi0JCXByaXYtPnJlZ194Y2VpdmVyID0gTlVMTDsKKwlwcml2LT5yZWdfeGNlaXZlciA9IHJlZ194Y2VpdmVyOwogCiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmcHJpdi0+bmFwaSwgZmxleGNhbl9wb2xsLCBGTEVYQ0FOX05BUElfV0VJR0hUKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2dyY2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vZ3JjYW4uYwppbmRleCBmZWQxYmJkLi5lM2Q3ZTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vZ3JjYW4uYworKysgYi9kcml2ZXJzL25ldC9jYW4vZ3JjYW4uYwpAQCAtMTcyNSw3ICsxNzI1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgZ3JjYW5fbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGdyY2FuX21hdGNoW10gPSB7CiAJey5uYW1lID0gIkdBSVNMRVJfR1JDQU4ifSwKIAl7Lm5hbWUgPSAiMDFfMDNkIn0sCiAJey5uYW1lID0gIkdBSVNMRVJfR1JIQ0FOIn0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vbGVkLmMgYi9kcml2ZXJzL25ldC9jYW4vbGVkLmMKaW5kZXggYWI3ZjFiMC4uYzFiNjY3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2xlZC5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9sZWQuYwpAQCAtMzAsMjAgKzMwLDI4IEBACiAJY2FzZSBDQU5fTEVEX0VWRU5UX09QRU46CiAJCWxlZF90cmlnZ2VyX2V2ZW50KHByaXYtPnR4X2xlZF90cmlnLCBMRURfRlVMTCk7CiAJCWxlZF90cmlnZ2VyX2V2ZW50KHByaXYtPnJ4X2xlZF90cmlnLCBMRURfRlVMTCk7CisJCWxlZF90cmlnZ2VyX2V2ZW50KHByaXYtPnJ4dHhfbGVkX3RyaWcsIExFRF9GVUxMKTsKIAkJYnJlYWs7CiAJY2FzZSBDQU5fTEVEX0VWRU5UX1NUT1A6CiAJCWxlZF90cmlnZ2VyX2V2ZW50KHByaXYtPnR4X2xlZF90cmlnLCBMRURfT0ZGKTsKIAkJbGVkX3RyaWdnZXJfZXZlbnQocHJpdi0+cnhfbGVkX3RyaWcsIExFRF9PRkYpOworCQlsZWRfdHJpZ2dlcl9ldmVudChwcml2LT5yeHR4X2xlZF90cmlnLCBMRURfT0ZGKTsKIAkJYnJlYWs7CiAJY2FzZSBDQU5fTEVEX0VWRU5UX1RYOgotCQlpZiAobGVkX2RlbGF5KQorCQlpZiAobGVkX2RlbGF5KSB7CiAJCQlsZWRfdHJpZ2dlcl9ibGlua19vbmVzaG90KHByaXYtPnR4X2xlZF90cmlnLAogCQkJCQkJICAmbGVkX2RlbGF5LCAmbGVkX2RlbGF5LCAxKTsKKwkJCWxlZF90cmlnZ2VyX2JsaW5rX29uZXNob3QocHJpdi0+cnh0eF9sZWRfdHJpZywKKwkJCQkJCSAgJmxlZF9kZWxheSwgJmxlZF9kZWxheSwgMSk7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBDQU5fTEVEX0VWRU5UX1JYOgotCQlpZiAobGVkX2RlbGF5KQorCQlpZiAobGVkX2RlbGF5KSB7CiAJCQlsZWRfdHJpZ2dlcl9ibGlua19vbmVzaG90KHByaXYtPnJ4X2xlZF90cmlnLAogCQkJCQkJICAmbGVkX2RlbGF5LCAmbGVkX2RlbGF5LCAxKTsKKwkJCWxlZF90cmlnZ2VyX2JsaW5rX29uZXNob3QocHJpdi0+cnh0eF9sZWRfdHJpZywKKwkJCQkJCSAgJmxlZF9kZWxheSwgJmxlZF9kZWxheSwgMSk7CisJCX0KIAkJYnJlYWs7CiAJfQogfQpAQCAtNTUsNiArNjMsNyBAQAogCiAJbGVkX3RyaWdnZXJfdW5yZWdpc3Rlcl9zaW1wbGUocHJpdi0+dHhfbGVkX3RyaWcpOwogCWxlZF90cmlnZ2VyX3VucmVnaXN0ZXJfc2ltcGxlKHByaXYtPnJ4X2xlZF90cmlnKTsKKwlsZWRfdHJpZ2dlcl91bnJlZ2lzdGVyX3NpbXBsZShwcml2LT5yeHR4X2xlZF90cmlnKTsKIH0KIAogLyogUmVnaXN0ZXIgQ0FOIExFRCB0cmlnZ2VycyBmb3IgYSBDQU4gZGV2aWNlCkBAIC03NiwxMSArODUsMTUgQEAKIAkJICIlcy10eCIsIG5ldGRldi0+bmFtZSk7CiAJc25wcmludGYocHJpdi0+cnhfbGVkX3RyaWdfbmFtZSwgc2l6ZW9mKHByaXYtPnJ4X2xlZF90cmlnX25hbWUpLAogCQkgIiVzLXJ4IiwgbmV0ZGV2LT5uYW1lKTsKKwlzbnByaW50Zihwcml2LT5yeHR4X2xlZF90cmlnX25hbWUsIHNpemVvZihwcml2LT5yeHR4X2xlZF90cmlnX25hbWUpLAorCQkgIiVzLXJ4dHgiLCBuZXRkZXYtPm5hbWUpOwogCiAJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKHByaXYtPnR4X2xlZF90cmlnX25hbWUsCiAJCQkJICAgICZwcml2LT50eF9sZWRfdHJpZyk7CiAJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKHByaXYtPnJ4X2xlZF90cmlnX25hbWUsCiAJCQkJICAgICZwcml2LT5yeF9sZWRfdHJpZyk7CisJbGVkX3RyaWdnZXJfcmVnaXN0ZXJfc2ltcGxlKHByaXYtPnJ4dHhfbGVkX3RyaWdfbmFtZSwKKwkJCQkgICAgJnByaXYtPnJ4dHhfbGVkX3RyaWcpOwogCiAJZGV2cmVzX2FkZCgmbmV0ZGV2LT5kZXYsIHJlcyk7CiB9CkBAIC05Nyw3ICsxMTAsNyBAQAogCWlmICghcHJpdikKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCi0JaWYgKCFwcml2LT50eF9sZWRfdHJpZyB8fCAhcHJpdi0+cnhfbGVkX3RyaWcpCisJaWYgKCFwcml2LT50eF9sZWRfdHJpZyB8fCAhcHJpdi0+cnhfbGVkX3RyaWcgfHwgIXByaXYtPnJ4dHhfbGVkX3RyaWcpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKIAogCWlmIChtc2cgPT0gTkVUREVWX0NIQU5HRU5BTUUpIHsKQEAgLTEwNiw2ICsxMTksOSBAQAogCiAJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzLXJ4IiwgbmV0ZGV2LT5uYW1lKTsKIAkJbGVkX3RyaWdnZXJfcmVuYW1lX3N0YXRpYyhuYW1lLCBwcml2LT5yeF9sZWRfdHJpZyk7CisKKwkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMtcnh0eCIsIG5ldGRldi0+bmFtZSk7CisJCWxlZF90cmlnZ2VyX3JlbmFtZV9zdGF0aWMobmFtZSwgcHJpdi0+cnh0eF9sZWRfdHJpZyk7CiAJfQogCiAJcmV0dXJuIE5PVElGWV9ET05FOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL21fY2FuL21fY2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vbV9jYW4vbV9jYW4uYwppbmRleCAyZTA0YjNhLi5lZjY1NTE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vbV9jYW4vbV9jYW4uYworKysgYi9kcml2ZXJzL25ldC9jYW4vbV9jYW4vbV9jYW4uYwpAQCAtMzEyLDggKzMxMiw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbV9jYW5fZmlmb193cml0ZShjb25zdCBzdHJ1Y3QgbV9jYW5fcHJpdiAqcHJpdiwKIAkJCQkgICAgdTMyIGZwaSwgdW5zaWduZWQgaW50IG9mZnNldCwgdTMyIHZhbCkKIHsKLQlyZXR1cm4gd3JpdGVsKHZhbCwgcHJpdi0+bXJhbV9iYXNlICsgcHJpdi0+bWNmZ1tNUkFNX1RYQl0ub2ZmICsKLQkJICAgICAgZnBpICogVFhCX0VMRU1FTlRfU0laRSArIG9mZnNldCk7CisJd3JpdGVsKHZhbCwgcHJpdi0+bXJhbV9iYXNlICsgcHJpdi0+bWNmZ1tNUkFNX1RYQl0ub2ZmICsKKwkgICAgICAgZnBpICogVFhCX0VMRU1FTlRfU0laRSArIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtX2Nhbl9jb25maWdfZW5kaXNhYmxlKGNvbnN0IHN0cnVjdCBtX2Nhbl9wcml2ICpwcml2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL21zY2FuL21wYzV4eHhfY2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vbXNjYW4vbXBjNXh4eF9jYW4uYwppbmRleCBhZDAyNGU2Li5jNzQyN2JkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vbXNjYW4vbXBjNXh4eF9jYW4uYworKysgYi9kcml2ZXJzL25ldC9jYW4vbXNjYW4vbXBjNXh4eF9jYW4uYwpAQCAtNDMsNyArNDMsNyBAQAogfTsKIAogI2lmZGVmIENPTkZJR19QUENfTVBDNTJ4eAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjNTJ4eF9jZG1faWRzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1Mnh4X2NkbV9pZHNbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM1MjAwLWNkbSIsIH0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9zamExMDAwX3BsYXRmb3JtLmMgYi9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9zamExMDAwX3BsYXRmb3JtLmMKaW5kZXggOTMxMTUyNS4uMDU1MmVkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvc2phMTAwMF9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL3NqYTEwMDBfcGxhdGZvcm0uYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNwX29mX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzcF9vZl90YWJsZVtdID0gewogCXsuY29tcGF0aWJsZSA9ICJueHAsc2phMTAwMCJ9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvZW1zX3VzYi5jIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9lbXNfdXNiLmMKaW5kZXggOTM3NmY1ZS4uODY2YmFjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3VzYi9lbXNfdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9lbXNfdXNiLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogICogQ1BDX01TR19UWVBFX0VYVF9DQU5fRlJBTUUgb3IgQ1BDX01TR19UWVBFX0VYVF9SVFJfRlJBTUUuCiAgKi8KIHN0cnVjdCBjcGNfY2FuX21zZyB7Ci0JdTMyIGlkOworCV9fbGUzMiBpZDsKIAl1OCBsZW5ndGg7CiAJdTggbXNnWzhdOwogfTsKQEAgLTIwMCw4ICsyMDAsOCBAQAogCXU4IHR5cGU7CS8qIHR5cGUgb2YgbWVzc2FnZSAqLwogCXU4IGxlbmd0aDsJLyogbGVuZ3RoIG9mIGRhdGEgd2l0aGluIHVuaW9uICdtc2cnICovCiAJdTggbXNnaWQ7CS8qIGNvbmZpcm1hdGlvbiBoYW5kbGUgKi8KLQl1MzIgdHNfc2VjOwkvKiB0aW1lc3RhbXAgaW4gc2Vjb25kcyAqLwotCXUzMiB0c19uc2VjOwkvKiB0aW1lc3RhbXAgaW4gbmFubyBzZWNvbmRzICovCisJX19sZTMyIHRzX3NlYzsJLyogdGltZXN0YW1wIGluIHNlY29uZHMgKi8KKwlfX2xlMzIgdHNfbnNlYzsJLyogdGltZXN0YW1wIGluIG5hbm8gc2Vjb25kcyAqLwogCiAJdW5pb24gewogCQl1OCBnZW5lcmljWzY0XTsKQEAgLTc2NSw3ICs3NjUsNyBAQAogCiAJbXNnID0gKHN0cnVjdCBlbXNfY3BjX21zZyAqKSZidWZbQ1BDX0hFQURFUl9TSVpFXTsKIAotCW1zZy0+bXNnLmNhbl9tc2cuaWQgPSBjZi0+Y2FuX2lkICYgQ0FOX0VSUl9NQVNLOworCW1zZy0+bXNnLmNhbl9tc2cuaWQgPSBjcHVfdG9fbGUzMihjZi0+Y2FuX2lkICYgQ0FOX0VSUl9NQVNLKTsKIAltc2ctPm1zZy5jYW5fbXNnLmxlbmd0aCA9IGNmLT5jYW5fZGxjOwogCiAJaWYgKGNmLT5jYW5faWQgJiBDQU5fUlRSX0ZMQUcpIHsKQEAgLTc4Myw5ICs3ODMsNiBAQAogCQltc2ctPmxlbmd0aCA9IENQQ19DQU5fTVNHX01JTl9TSVpFICsgY2YtPmNhbl9kbGM7CiAJfQogCi0JLyogUmVzcGVjdCBieXRlIG9yZGVyICovCi0JbXNnLT5tc2cuY2FuX21zZy5pZCA9IGNwdV90b19sZTMyKG1zZy0+bXNnLmNhbl9tc2cuaWQpOwotCiAJZm9yIChpID0gMDsgaSA8IE1BWF9UWF9VUkJTOyBpKyspIHsKIAkJaWYgKGRldi0+dHhfY29udGV4dHNbaV0uZWNob19pbmRleCA9PSBNQVhfVFhfVVJCUykgewogCQkJY29udGV4dCA9ICZkZXYtPnR4X2NvbnRleHRzW2ldOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3VzYi9lc2RfdXNiMi5jIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9lc2RfdXNiMi5jCmluZGV4IGJhY2NhMGIuLjQxMWMxYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvZXNkX3VzYjIuYworKysgYi9kcml2ZXJzL25ldC9jYW4vdXNiL2VzZF91c2IyLmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCXU4IGNtZDsKIAl1OCBuZXQ7CiAJdTggZGxjOwotCV9fbGUzMiBobmQ7CisJdTMyIGhuZDsJLyogb3BhcXVlIGhhbmRsZSwgbm90IHVzZWQgYnkgZGV2aWNlICovCiAJX19sZTMyIGlkOyAvKiB1cHBlciAzIGJpdHMgY29udGFpbiBmbGFncyAqLwogCXU4IGRhdGFbOF07CiB9OwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJdTggY21kOwogCXU4IG5ldDsKIAl1OCBzdGF0dXM7Ci0JX19sZTMyIGhuZDsKKwl1MzIgaG5kOwkvKiBvcGFxdWUgaGFuZGxlLCBub3QgdXNlZCBieSBkZXZpY2UgKi8KIAlfX2xlMzIgdHM7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vdXNiL2dzX3VzYi5jIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9nc191c2IuYwppbmRleCAwMDlhY2M4Li44YjRkM2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vdXNiL2dzX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi91c2IvZ3NfdXNiLmMKQEAgLTkwMSw2ICs5MDEsOCBAQAogCX0KIAogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9NRU07CiAJaW5pdF91c2JfYW5jaG9yKCZkZXYtPnJ4X3N1Ym1pdHRlZCk7CiAKIAlhdG9taWNfc2V0KCZkZXYtPmFjdGl2ZV9jaGFubmVscywgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vdXNiL2t2YXNlcl91c2IuYyBiL2RyaXZlcnMvbmV0L2Nhbi91c2Iva3Zhc2VyX3VzYi5jCmluZGV4IGEzMTZmYTQuLjQ2NDM5MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi91c2Iva3Zhc2VyX3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi91c2Iva3Zhc2VyX3VzYi5jCkBAIC0xNCw2ICsxNCw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVmFsZW8gUy5BLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTI0LDcgKzI1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jYW4vZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY2FuL2Vycm9yLmg+CiAKLSNkZWZpbmUgTUFYX1RYX1VSQlMJCQkxNgogI2RlZmluZSBNQVhfUlhfVVJCUwkJCTQKICNkZWZpbmUgU1RBUlRfVElNRU9VVAkJCTEwMDAgLyogbXNlY3MgKi8KICNkZWZpbmUgU1RPUF9USU1FT1VUCQkJMTAwMCAvKiBtc2VjcyAqLwpAQCAtNDQyLDYgKzQ0Miw3IEBACiAJfTsKIH07CiAKKy8qIENvbnRleHQgZm9yIGFuIG91dHN0YW5kaW5nLCBub3QgeWV0IEFDS2VkLCB0cmFuc21pc3Npb24gKi8KIHN0cnVjdCBrdmFzZXJfdXNiX3R4X3VyYl9jb250ZXh0IHsKIAlzdHJ1Y3Qga3Zhc2VyX3VzYl9uZXRfcHJpdiAqcHJpdjsKIAl1MzIgZWNob19pbmRleDsKQEAgLTQ1NSw4ICs0NTYsMTMgQEAKIAlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmJ1bGtfaW4sICpidWxrX291dDsKIAlzdHJ1Y3QgdXNiX2FuY2hvciByeF9zdWJtaXR0ZWQ7CiAKKwkvKiBAbWF4X3R4X3VyYnM6IEZpcm13YXJlLXJlcG9ydGVkIG1heGltdW0gbnVtYmVyIG9mIG91c3RhbmRpbmcsCisJICogbm90IHlldCBBQ0tlZCwgdHJhbnNtaXNzaW9ucyBvbiB0aGlzIGRldmljZS4gVGhpcyB2YWx1ZSBpcworCSAqIGFsc28gdXNlZCBhcyBhIHNlbnRpbmVsIGZvciBtYXJraW5nIGZyZWUgdHggY29udGV4dHMuCisJICovCiAJdTMyIGZ3X3ZlcnNpb247CiAJdW5zaWduZWQgaW50IG5jaGFubmVsczsKKwl1bnNpZ25lZCBpbnQgbWF4X3R4X3VyYnM7CiAJZW51bSBrdmFzZXJfdXNiX2ZhbWlseSBmYW1pbHk7CiAKIAlib29sIHJ4aW5pdGRvbmU7CkBAIC00NjYsMTggKzQ3MiwxOCBAQAogCiBzdHJ1Y3Qga3Zhc2VyX3VzYl9uZXRfcHJpdiB7CiAJc3RydWN0IGNhbl9wcml2IGNhbjsKLQotCWF0b21pY190IGFjdGl2ZV90eF91cmJzOwotCXN0cnVjdCB1c2JfYW5jaG9yIHR4X3N1Ym1pdHRlZDsKLQlzdHJ1Y3Qga3Zhc2VyX3VzYl90eF91cmJfY29udGV4dCB0eF9jb250ZXh0c1tNQVhfVFhfVVJCU107Ci0KLQlzdHJ1Y3QgY29tcGxldGlvbiBzdGFydF9jb21wLCBzdG9wX2NvbXA7CisJc3RydWN0IGNhbl9iZXJyX2NvdW50ZXIgYmVjOwogCiAJc3RydWN0IGt2YXNlcl91c2IgKmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCWludCBjaGFubmVsOwogCi0Jc3RydWN0IGNhbl9iZXJyX2NvdW50ZXIgYmVjOworCXN0cnVjdCBjb21wbGV0aW9uIHN0YXJ0X2NvbXAsIHN0b3BfY29tcDsKKwlzdHJ1Y3QgdXNiX2FuY2hvciB0eF9zdWJtaXR0ZWQ7CisKKwlzcGlubG9ja190IHR4X2NvbnRleHRzX2xvY2s7CisJaW50IGFjdGl2ZV90eF9jb250ZXh0czsKKwlzdHJ1Y3Qga3Zhc2VyX3VzYl90eF91cmJfY29udGV4dCB0eF9jb250ZXh0c1tdOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkIGt2YXNlcl91c2JfdGFibGVbXSA9IHsKQEAgLTU5MCw4ICs1OTYsOCBAQAogCQkJICogZm9yIGZ1cnRoZXIgZGV0YWlscy4KIAkJCSAqLwogCQkJaWYgKHRtcC0+bGVuID09IDApIHsKLQkJCQlwb3MgPSByb3VuZF91cChwb3MsCi0JCQkJCSAgICAgICBkZXYtPmJ1bGtfaW4tPndNYXhQYWNrZXRTaXplKTsKKwkJCQlwb3MgPSByb3VuZF91cChwb3MsIGxlMTZfdG9fY3B1KGRldi0+YnVsa19pbi0+CisJCQkJCQkJCXdNYXhQYWNrZXRTaXplKSk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKQEAgLTY1NSw5ICs2NjEsMTMgQEAKIAlzd2l0Y2ggKGRldi0+ZmFtaWx5KSB7CiAJY2FzZSBLVkFTRVJfTEVBRjoKIAkJZGV2LT5md192ZXJzaW9uID0gbGUzMl90b19jcHUobXNnLnUubGVhZi5zb2Z0aW5mby5md192ZXJzaW9uKTsKKwkJZGV2LT5tYXhfdHhfdXJicyA9CisJCQlsZTE2X3RvX2NwdShtc2cudS5sZWFmLnNvZnRpbmZvLm1heF9vdXRzdGFuZGluZ190eCk7CiAJCWJyZWFrOwogCWNhc2UgS1ZBU0VSX1VTQkNBTjoKIAkJZGV2LT5md192ZXJzaW9uID0gbGUzMl90b19jcHUobXNnLnUudXNiY2FuLnNvZnRpbmZvLmZ3X3ZlcnNpb24pOworCQlkZXYtPm1heF90eF91cmJzID0KKwkJCWxlMTZfdG9fY3B1KG1zZy51LnVzYmNhbi5zb2Z0aW5mby5tYXhfb3V0c3RhbmRpbmdfdHgpOwogCQlicmVhazsKIAl9CiAKQEAgLTY5NCw2ICs3MDQsNyBAQAogCXN0cnVjdCBrdmFzZXJfdXNiX25ldF9wcml2ICpwcml2OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGNhbl9mcmFtZSAqY2Y7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1OCBjaGFubmVsLCB0aWQ7CiAKIAljaGFubmVsID0gbXNnLT51LnR4X2Fja25vd2xlZGdlX2hlYWRlci5jaGFubmVsOwpAQCAtNzEyLDcgKzcyMyw3IEBACiAKIAlzdGF0cyA9ICZwcml2LT5uZXRkZXYtPnN0YXRzOwogCi0JY29udGV4dCA9ICZwcml2LT50eF9jb250ZXh0c1t0aWQgJSBNQVhfVFhfVVJCU107CisJY29udGV4dCA9ICZwcml2LT50eF9jb250ZXh0c1t0aWQgJSBkZXYtPm1heF90eF91cmJzXTsKIAogCS8qIFNvbWV0aW1lcyB0aGUgc3RhdGUgY2hhbmdlIGRvZXNuJ3QgY29tZSBhZnRlciBhIGJ1cy1vZmYgZXZlbnQgKi8KIAlpZiAocHJpdi0+Y2FuLnJlc3RhcnRfbXMgJiYKQEAgLTczNywxMiArNzQ4LDE1IEBACiAKIAlzdGF0cy0+dHhfcGFja2V0cysrOwogCXN0YXRzLT50eF9ieXRlcyArPSBjb250ZXh0LT5kbGM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfY29udGV4dHNfbG9jaywgZmxhZ3MpOworCiAJY2FuX2dldF9lY2hvX3NrYihwcml2LT5uZXRkZXYsIGNvbnRleHQtPmVjaG9faW5kZXgpOwotCi0JY29udGV4dC0+ZWNob19pbmRleCA9IE1BWF9UWF9VUkJTOwotCWF0b21pY19kZWMoJnByaXYtPmFjdGl2ZV90eF91cmJzKTsKLQorCWNvbnRleHQtPmVjaG9faW5kZXggPSBkZXYtPm1heF90eF91cmJzOworCS0tcHJpdi0+YWN0aXZlX3R4X2NvbnRleHRzOwogCW5ldGlmX3dha2VfcXVldWUocHJpdi0+bmV0ZGV2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2NvbnRleHRzX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQga3Zhc2VyX3VzYl9zaW1wbGVfbXNnX2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKQEAgLTgwMywxNyArODE3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQga3Zhc2VyX3VzYl91bmxpbmtfdHhfdXJicyhzdHJ1Y3Qga3Zhc2VyX3VzYl9uZXRfcHJpdiAqcHJpdikKLXsKLQlpbnQgaTsKLQotCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJnByaXYtPnR4X3N1Ym1pdHRlZCk7Ci0JYXRvbWljX3NldCgmcHJpdi0+YWN0aXZlX3R4X3VyYnMsIDApOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9UWF9VUkJTOyBpKyspCi0JCXByaXYtPnR4X2NvbnRleHRzW2ldLmVjaG9faW5kZXggPSBNQVhfVFhfVVJCUzsKLX0KLQogc3RhdGljIHZvaWQga3Zhc2VyX3VzYl9yeF9lcnJvcl91cGRhdGVfY2FuX3N0YXRlKHN0cnVjdCBrdmFzZXJfdXNiX25ldF9wcml2ICpwcml2LAogCQkJCQkJIGNvbnN0IHN0cnVjdCBrdmFzZXJfdXNiX2Vycm9yX3N1bW1hcnkgKmVzLAogCQkJCQkJIHN0cnVjdCBjYW5fZnJhbWUgKmNmKQpAQCAtMTMzNCw3ICsxMzM3LDggQEAKIAkJICogbnVtYmVyIG9mIGV2ZW50cyBpbiBjYXNlIG9mIGEgaGVhdnkgcnggbG9hZCBvbiB0aGUgYnVzLgogCQkgKi8KIAkJaWYgKG1zZy0+bGVuID09IDApIHsKLQkJCXBvcyA9IHJvdW5kX3VwKHBvcywgZGV2LT5idWxrX2luLT53TWF4UGFja2V0U2l6ZSk7CisJCQlwb3MgPSByb3VuZF91cChwb3MsIGxlMTZfdG9fY3B1KGRldi0+YnVsa19pbi0+CisJCQkJCQkJd01heFBhY2tldFNpemUpKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTE1MTUsNiArMTUxOSwyNiBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyB2b2lkIGt2YXNlcl91c2JfcmVzZXRfdHhfdXJiX2NvbnRleHRzKHN0cnVjdCBrdmFzZXJfdXNiX25ldF9wcml2ICpwcml2KQoreworCWludCBpLCBtYXhfdHhfdXJiczsKKworCW1heF90eF91cmJzID0gcHJpdi0+ZGV2LT5tYXhfdHhfdXJiczsKKworCXByaXYtPmFjdGl2ZV90eF9jb250ZXh0cyA9IDA7CisJZm9yIChpID0gMDsgaSA8IG1heF90eF91cmJzOyBpKyspCisJCXByaXYtPnR4X2NvbnRleHRzW2ldLmVjaG9faW5kZXggPSBtYXhfdHhfdXJiczsKK30KKworLyogVGhpcyBtZXRob2QgbWlnaHQgc2xlZXAuIERvIG5vdCBjYWxsIGl0IGluIHRoZSBhdG9taWMgY29udGV4dAorICogb2YgVVJCIGNvbXBsZXRpb25zLgorICovCitzdGF0aWMgdm9pZCBrdmFzZXJfdXNiX3VubGlua190eF91cmJzKHN0cnVjdCBrdmFzZXJfdXNiX25ldF9wcml2ICpwcml2KQoreworCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJnByaXYtPnR4X3N1Ym1pdHRlZCk7CisJa3Zhc2VyX3VzYl9yZXNldF90eF91cmJfY29udGV4dHMocHJpdik7Cit9CisKIHN0YXRpYyB2b2lkIGt2YXNlcl91c2JfdW5saW5rX2FsbF91cmJzKHN0cnVjdCBrdmFzZXJfdXNiICpkZXYpCiB7CiAJaW50IGk7CkBAIC0xNjM0LDYgKzE2NTgsNyBAQAogCXN0cnVjdCBrdmFzZXJfbXNnICptc2c7CiAJaW50IGksIGVyciwgcmV0ID0gTkVUREVWX1RYX09LOwogCXU4ICptc2dfdHhfY2FuX2ZsYWdzID0gTlVMTDsJCS8qIEdDQyAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoY2FuX2Ryb3BwZWRfaW52YWxpZF9za2IobmV0ZGV2LCBza2IpKQogCQlyZXR1cm4gTkVUREVWX1RYX09LOwpAQCAtMTY4NywxMiArMTcxMiwyMSBAQAogCWlmIChjZi0+Y2FuX2lkICYgQ0FOX1JUUl9GTEFHKQogCQkqbXNnX3R4X2Nhbl9mbGFncyB8PSBNU0dfRkxBR19SRU1PVEVfRlJBTUU7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcml2LT50eF9jb250ZXh0cyk7IGkrKykgewotCQlpZiAocHJpdi0+dHhfY29udGV4dHNbaV0uZWNob19pbmRleCA9PSBNQVhfVFhfVVJCUykgeworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9jb250ZXh0c19sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IGRldi0+bWF4X3R4X3VyYnM7IGkrKykgeworCQlpZiAocHJpdi0+dHhfY29udGV4dHNbaV0uZWNob19pbmRleCA9PSBkZXYtPm1heF90eF91cmJzKSB7CiAJCQljb250ZXh0ID0gJnByaXYtPnR4X2NvbnRleHRzW2ldOworCisJCQljb250ZXh0LT5lY2hvX2luZGV4ID0gaTsKKwkJCWNhbl9wdXRfZWNob19za2Ioc2tiLCBuZXRkZXYsIGNvbnRleHQtPmVjaG9faW5kZXgpOworCQkJKytwcml2LT5hY3RpdmVfdHhfY29udGV4dHM7CisJCQlpZiAocHJpdi0+YWN0aXZlX3R4X2NvbnRleHRzID49IGRldi0+bWF4X3R4X3VyYnMpCisJCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOworCiAJCQlicmVhazsKIAkJfQogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9jb250ZXh0c19sb2NrLCBmbGFncyk7CiAKIAkvKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW47IGl0IGltcGxpZXMgYSBmbG93IGNvbnRyb2wgYnVnICovCiAJaWYgKCFjb250ZXh0KSB7CkBAIC0xNzA0LDcgKzE3MzgsNiBAQAogCX0KIAogCWNvbnRleHQtPnByaXYgPSBwcml2OwotCWNvbnRleHQtPmVjaG9faW5kZXggPSBpOwogCWNvbnRleHQtPmRsYyA9IGNmLT5jYW5fZGxjOwogCiAJbXNnLT51LnR4X2Nhbi50aWQgPSBjb250ZXh0LT5lY2hvX2luZGV4OwpAQCAtMTcxNiwxOCArMTc0OSwxNyBAQAogCQkJICBrdmFzZXJfdXNiX3dyaXRlX2J1bGtfY2FsbGJhY2ssIGNvbnRleHQpOwogCXVzYl9hbmNob3JfdXJiKHVyYiwgJnByaXYtPnR4X3N1Ym1pdHRlZCk7CiAKLQljYW5fcHV0X2VjaG9fc2tiKHNrYiwgbmV0ZGV2LCBjb250ZXh0LT5lY2hvX2luZGV4KTsKLQotCWF0b21pY19pbmMoJnByaXYtPmFjdGl2ZV90eF91cmJzKTsKLQotCWlmIChhdG9taWNfcmVhZCgmcHJpdi0+YWN0aXZlX3R4X3VyYnMpID49IE1BWF9UWF9VUkJTKQotCQluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7Ci0KIAllcnIgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmICh1bmxpa2VseShlcnIpKSB7Ci0JCWNhbl9mcmVlX2VjaG9fc2tiKG5ldGRldiwgY29udGV4dC0+ZWNob19pbmRleCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT50eF9jb250ZXh0c19sb2NrLCBmbGFncyk7CiAKLQkJYXRvbWljX2RlYygmcHJpdi0+YWN0aXZlX3R4X3VyYnMpOworCQljYW5fZnJlZV9lY2hvX3NrYihuZXRkZXYsIGNvbnRleHQtPmVjaG9faW5kZXgpOworCQljb250ZXh0LT5lY2hvX2luZGV4ID0gZGV2LT5tYXhfdHhfdXJiczsKKwkJLS1wcml2LT5hY3RpdmVfdHhfY29udGV4dHM7CisJCW5ldGlmX3dha2VfcXVldWUobmV0ZGV2KTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT50eF9jb250ZXh0c19sb2NrLCBmbGFncyk7CisKIAkJdXNiX3VuYW5jaG9yX3VyYih1cmIpOwogCiAJCXN0YXRzLT50eF9kcm9wcGVkKys7CkBAIC0xODM1LDcgKzE4NjcsNyBAQAogCQlpZiAoIWRldi0+bmV0c1tpXSkKIAkJCWNvbnRpbnVlOwogCi0JCXVucmVnaXN0ZXJfbmV0ZGV2KGRldi0+bmV0c1tpXS0+bmV0ZGV2KTsKKwkJdW5yZWdpc3Rlcl9jYW5kZXYoZGV2LT5uZXRzW2ldLT5uZXRkZXYpOwogCX0KIAogCWt2YXNlcl91c2JfdW5saW5rX2FsbF91cmJzKGRldik7CkBAIC0xODU0LDEzICsxODg2LDE1IEBACiAJc3RydWN0IGt2YXNlcl91c2IgKmRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3Qga3Zhc2VyX3VzYl9uZXRfcHJpdiAqcHJpdjsKLQlpbnQgaSwgZXJyOworCWludCBlcnI7CiAKIAllcnIgPSBrdmFzZXJfdXNiX3NlbmRfc2ltcGxlX21zZyhkZXYsIENNRF9SRVNFVF9DSElQLCBjaGFubmVsKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JbmV0ZGV2ID0gYWxsb2NfY2FuZGV2KHNpemVvZigqcHJpdiksIE1BWF9UWF9VUkJTKTsKKwluZXRkZXYgPSBhbGxvY19jYW5kZXYoc2l6ZW9mKCpwcml2KSArCisJCQkgICAgICBkZXYtPm1heF90eF91cmJzICogc2l6ZW9mKCpwcml2LT50eF9jb250ZXh0cyksCisJCQkgICAgICBkZXYtPm1heF90eF91cmJzKTsKIAlpZiAoIW5ldGRldikgewogCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJDYW5ub3QgYWxsb2MgY2FuZGV2XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xODY4LDE5ICsxOTAyLDE3IEBACiAKIAlwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAorCWluaXRfdXNiX2FuY2hvcigmcHJpdi0+dHhfc3VibWl0dGVkKTsKIAlpbml0X2NvbXBsZXRpb24oJnByaXYtPnN0YXJ0X2NvbXApOwogCWluaXRfY29tcGxldGlvbigmcHJpdi0+c3RvcF9jb21wKTsKIAotCWluaXRfdXNiX2FuY2hvcigmcHJpdi0+dHhfc3VibWl0dGVkKTsKLQlhdG9taWNfc2V0KCZwcml2LT5hY3RpdmVfdHhfdXJicywgMCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcml2LT50eF9jb250ZXh0cyk7IGkrKykKLQkJcHJpdi0+dHhfY29udGV4dHNbaV0uZWNob19pbmRleCA9IE1BWF9UWF9VUkJTOwotCiAJcHJpdi0+ZGV2ID0gZGV2OwogCXByaXYtPm5ldGRldiA9IG5ldGRldjsKIAlwcml2LT5jaGFubmVsID0gY2hhbm5lbDsKIAorCXNwaW5fbG9ja19pbml0KCZwcml2LT50eF9jb250ZXh0c19sb2NrKTsKKwlrdmFzZXJfdXNiX3Jlc2V0X3R4X3VyYl9jb250ZXh0cyhwcml2KTsKKwogCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9TVE9QUEVEOwogCXByaXYtPmNhbi5jbG9jay5mcmVxID0gQ0FOX1VTQl9DTE9DSzsKIAlwcml2LT5jYW4uYml0dGltaW5nX2NvbnN0ID0gJmt2YXNlcl91c2JfYml0dGltaW5nX2NvbnN0OwpAQCAtMTk5MCw2ICsyMDIyLDEzIEBACiAJCXJldHVybiBlcnI7CiAJfQogCisJZGV2X2RiZygmaW50Zi0+ZGV2LCAiRmlybXdhcmUgdmVyc2lvbjogJWQuJWQuJWRcbiIsCisJCSgoZGV2LT5md192ZXJzaW9uID4+IDI0KSAmIDB4ZmYpLAorCQkoKGRldi0+ZndfdmVyc2lvbiA+PiAxNikgJiAweGZmKSwKKwkJKGRldi0+ZndfdmVyc2lvbiAmIDB4ZmZmZikpOworCisJZGV2X2RiZygmaW50Zi0+ZGV2LCAiTWF4IG91c3RhbmRpbmcgdHggPSAlZCBVUkJzXG4iLCBkZXYtPm1heF90eF91cmJzKTsKKwogCWVyciA9IGt2YXNlcl91c2JfZ2V0X2NhcmRfaW5mbyhkZXYpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmaW50Zi0+ZGV2LApAQCAtMTk5NywxMSArMjAzNiw2IEBACiAJCXJldHVybiBlcnI7CiAJfQogCi0JZGV2X2RiZygmaW50Zi0+ZGV2LCAiRmlybXdhcmUgdmVyc2lvbjogJWQuJWQuJWRcbiIsCi0JCSgoZGV2LT5md192ZXJzaW9uID4+IDI0KSAmIDB4ZmYpLAotCQkoKGRldi0+ZndfdmVyc2lvbiA+PiAxNikgJiAweGZmKSwKLQkJKGRldi0+ZndfdmVyc2lvbiAmIDB4ZmZmZikpOwotCiAJZm9yIChpID0gMDsgaSA8IGRldi0+bmNoYW5uZWxzOyBpKyspIHsKIAkJZXJyID0ga3Zhc2VyX3VzYl9pbml0X29uZShpbnRmLCBpZCwgaSk7CiAJCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvcGVha191c2IvcGNhbl91Y2FuLmggYi9kcml2ZXJzL25ldC9jYW4vdXNiL3BlYWtfdXNiL3BjYW5fdWNhbi5oCmluZGV4IDFiYTdjMjUuLmU4ZmM0OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi91c2IvcGVha191c2IvcGNhbl91Y2FuLmgKKysrIGIvZHJpdmVycy9uZXQvY2FuL3VzYi9wZWFrX3VzYi9wY2FuX3VjYW4uaApAQCAtMjYsOCArMjYsOCBAQAogI2RlZmluZSBQVUNBTl9DTURfRklMVEVSX1NURAkJMHgwMDgKICNkZWZpbmUgUFVDQU5fQ01EX1RYX0FCT1JUCQkweDAwOQogI2RlZmluZSBQVUNBTl9DTURfV1JfRVJSX0NOVAkJMHgwMGEKLSNkZWZpbmUgUFVDQU5fQ01EX1JYX0ZSQU1FX0VOQUJMRQkweDAwYgotI2RlZmluZSBQVUNBTl9DTURfUlhfRlJBTUVfRElTQUJMRQkweDAwYworI2RlZmluZSBQVUNBTl9DTURfU0VUX0VOX09QVElPTgkJMHgwMGIKKyNkZWZpbmUgUFVDQU5fQ01EX0NMUl9ESVNfT1BUSU9OCTB4MDBjCiAjZGVmaW5lIFBVQ0FOX0NNRF9FTkRfT0ZfQ09MTEVDVElPTgkweDNmZgogCiAvKiB1Q0FOIHJlY2VpdmVkIG1lc3NhZ2VzIGxpc3QgKi8KQEAgLTEwMSwxNCArMTAxLDE1IEBACiAJdTE2CXVudXNlZDsKIH07CiAKLS8qIHVDQU4gUlhfRlJBTUVfRU5BQkxFIGNvbW1hbmQgZmllbGRzICovCi0jZGVmaW5lIFBVQ0FOX0ZMVEVYVF9FUlJPUgkJMHgwMDAxCi0jZGVmaW5lIFBVQ0FOX0ZMVEVYVF9CVVNMT0FECQkweDAwMDIKKy8qIHVDQU4gU0VUX0VOL0NMUl9ESVMgX09QVElPTiBjb21tYW5kIGZpZWxkcyAqLworI2RlZmluZSBQVUNBTl9PUFRJT05fRVJST1IJCTB4MDAwMQorI2RlZmluZSBQVUNBTl9PUFRJT05fQlVTTE9BRAkJMHgwMDAyCisjZGVmaW5lIFBVQ0FOX09QVElPTl9DQU5ERkRJU08JCTB4MDAwNAogCi1zdHJ1Y3QgX19wYWNrZWQgcHVjYW5fZmlsdGVyX2V4dCB7CitzdHJ1Y3QgX19wYWNrZWQgcHVjYW5fb3B0aW9ucyB7CiAJX19sZTE2CW9wY29kZV9jaGFubmVsOwogCi0JX19sZTE2CWV4dF9tYXNrOworCV9fbGUxNglvcHRpb25zOwogCXUzMgl1bnVzZWQ7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vdXNiL3BlYWtfdXNiL3BjYW5fdXNiX2ZkLmMgYi9kcml2ZXJzL25ldC9jYW4vdXNiL3BlYWtfdXNiL3BjYW5fdXNiX2ZkLmMKaW5kZXggMGJhYzBmMS4uMDlkMTRlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3VzYi9wZWFrX3VzYi9wY2FuX3VzYl9mZC5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi91c2IvcGVha191c2IvcGNhbl91c2JfZmQuYwpAQCAtMTEwLDEzICsxMTAsMTMgQEAKIAl1OAl1bnVzZWRbNV07CiB9OwogCi0vKiBFeHRlbmRlZCB1c2FnZSBvZiB1Q0FOIGNvbW1hbmRzIENNRF9SWF9GUkFNRV94eHhBQkxFIGZvciBQQ0FOLVVTQiBQcm8gRkQgKi8KKy8qIEV4dGVuZGVkIHVzYWdlIG9mIHVDQU4gY29tbWFuZHMgQ01EX3h4eF94eF9PUFRJT04gZm9yIFBDQU4tVVNCIFBybyBGRCAqLwogI2RlZmluZSBQQ0FOX1VGRF9GTFRFWFRfQ0FMSUJSQVRJT04JMHg4MDAwCiAKLXN0cnVjdCBfX3BhY2tlZCBwY2FuX3VmZF9maWx0ZXJfZXh0IHsKK3N0cnVjdCBfX3BhY2tlZCBwY2FuX3VmZF9vcHRpb25zIHsKIAlfX2xlMTYJb3Bjb2RlX2NoYW5uZWw7CiAKLQlfX2xlMTYJZXh0X21hc2s7CisJX19sZTE2CXVjYW5fbWFzazsKIAl1MTYJdW51c2VkOwogCV9fbGUxNgl1c2JfbWFzazsKIH07CkBAIC0xODIsNyArMTgyLDcgQEAKIHN0YXRpYyBpbnQgcGNhbl91c2JfZmRfc2VuZF9jbWQoc3RydWN0IHBlYWtfdXNiX2RldmljZSAqZGV2LCB2b2lkICpjbWRfdGFpbCkKIHsKIAl2b2lkICpjbWRfaGVhZCA9IHBjYW5fdXNiX2ZkX2NtZF9idWZmZXIoZGV2KTsKLQlpbnQgZXJyOworCWludCBlcnIgPSAwOwogCXU4ICpwYWNrZXRfcHRyOwogCWludCBpLCBuID0gMSwgcGFja2V0X2xlbjsKIAlwdHJkaWZmX3QgY21kX2xlbjsKQEAgLTI1MSw2ICsyNTEsMjcgQEAKIAkvKiBtb3ZlcyB0aGUgcG9pbnRlciBmb3J3YXJkICovCiAJcGMgKz0gc2l6ZW9mKHN0cnVjdCBwdWNhbl93cl9lcnJfY250KTsKIAorCS8qIGFkZCBjb21tYW5kIHRvIHN3aXRjaCBmcm9tIElTTyB0byBub24tSVNPIG1vZGUsIGlmIGZ3IGFsbG93cyBpdCAqLworCWlmIChkZXYtPmNhbi5jdHJsbW9kZV9zdXBwb3J0ZWQgJiBDQU5fQ1RSTE1PREVfRkRfTk9OX0lTTykgeworCQlzdHJ1Y3QgcHVjYW5fb3B0aW9ucyAqcHVvID0gKHN0cnVjdCBwdWNhbl9vcHRpb25zICopcGM7CisKKwkJcHVvLT5vcGNvZGVfY2hhbm5lbCA9CisJCQkoZGV2LT5jYW4uY3RybG1vZGUgJiBDQU5fQ1RSTE1PREVfRkRfTk9OX0lTTykgPworCQkJcHVjYW5fY21kX29wY29kZV9jaGFubmVsKGRldiwKKwkJCQkJCSBQVUNBTl9DTURfQ0xSX0RJU19PUFRJT04pIDoKKwkJCXB1Y2FuX2NtZF9vcGNvZGVfY2hhbm5lbChkZXYsIFBVQ0FOX0NNRF9TRVRfRU5fT1BUSU9OKTsKKworCQlwdW8tPm9wdGlvbnMgPSBjcHVfdG9fbGUxNihQVUNBTl9PUFRJT05fQ0FOREZESVNPKTsKKworCQkvKiB0byBiZSBzdXJlIHRoYXQgbm8gb3RoZXIgZXh0ZW5kZWQgYml0cyB3aWxsIGJlIHRha2VuIGludG8KKwkJICogYWNjb3VudAorCQkgKi8KKwkJcHVvLT51bnVzZWQgPSAwOworCisJCS8qIG1vdmVzIHRoZSBwb2ludGVyIGZvcndhcmQgKi8KKwkJcGMgKz0gc2l6ZW9mKHN0cnVjdCBwdWNhbl9vcHRpb25zKTsKKwl9CisKIAkvKiBuZXh0LCBnbyBiYWNrIHRvIG9wZXJhdGlvbmFsIG1vZGUgKi8KIAljbWQgPSAoc3RydWN0IHB1Y2FuX2NvbW1hbmQgKilwYzsKIAljbWQtPm9wY29kZV9jaGFubmVsID0gcHVjYW5fY21kX29wY29kZV9jaGFubmVsKGRldiwKQEAgLTMyMSwyMSArMzQyLDIxIEBACiAJcmV0dXJuIHBjYW5fdXNiX2ZkX3NlbmRfY21kKGRldiwgY21kKTsKIH0KIAotLyogc2V0L3Vuc2V0IG5vdGlmaWNhdGlvbnMgZmlsdGVyOgorLyogc2V0L3Vuc2V0IG9wdGlvbnMKICAqCi0gKglvbm9mZglzZXRzKDEpL3Vuc2V0KDApIG5vdGlmaWNhdGlvbnMKLSAqCW1hc2sJZWFjaCBiaXQgZGVmaW5lcyBhIGtpbmQgb2Ygbm90aWZpY2F0aW9uIHRvIHNldC91bnNldAorICoJb25vZmYJc2V0KDEpL3Vuc2V0KDApIG9wdGlvbnMKKyAqCW1hc2sJZWFjaCBiaXQgZGVmaW5lcyBhIGtpbmQgb2Ygb3B0aW9ucyB0byBzZXQvdW5zZXQKICAqLwotc3RhdGljIGludCBwY2FuX3VzYl9mZF9zZXRfZmlsdGVyX2V4dChzdHJ1Y3QgcGVha191c2JfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgYm9vbCBvbm9mZiwgdTE2IGV4dF9tYXNrLCB1MTYgdXNiX21hc2spCitzdGF0aWMgaW50IHBjYW5fdXNiX2ZkX3NldF9vcHRpb25zKHN0cnVjdCBwZWFrX3VzYl9kZXZpY2UgKmRldiwKKwkJCQkgICBib29sIG9ub2ZmLCB1MTYgdWNhbl9tYXNrLCB1MTYgdXNiX21hc2spCiB7Ci0Jc3RydWN0IHBjYW5fdWZkX2ZpbHRlcl9leHQgKmNtZCA9IHBjYW5fdXNiX2ZkX2NtZF9idWZmZXIoZGV2KTsKKwlzdHJ1Y3QgcGNhbl91ZmRfb3B0aW9ucyAqY21kID0gcGNhbl91c2JfZmRfY21kX2J1ZmZlcihkZXYpOwogCiAJY21kLT5vcGNvZGVfY2hhbm5lbCA9IHB1Y2FuX2NtZF9vcGNvZGVfY2hhbm5lbChkZXYsCi0JCQkJCShvbm9mZikgPyBQVUNBTl9DTURfUlhfRlJBTUVfRU5BQkxFIDoKLQkJCQkJCSAgUFVDQU5fQ01EX1JYX0ZSQU1FX0RJU0FCTEUpOworCQkJCQkob25vZmYpID8gUFVDQU5fQ01EX1NFVF9FTl9PUFRJT04gOgorCQkJCQkJICBQVUNBTl9DTURfQ0xSX0RJU19PUFRJT04pOwogCi0JY21kLT5leHRfbWFzayA9IGNwdV90b19sZTE2KGV4dF9tYXNrKTsKKwljbWQtPnVjYW5fbWFzayA9IGNwdV90b19sZTE2KHVjYW5fbWFzayk7CiAJY21kLT51c2JfbWFzayA9IGNwdV90b19sZTE2KHVzYl9tYXNrKTsKIAogCS8qIHNlbmQgdGhlIGNvbW1hbmQgKi8KQEAgLTc3MCw5ICs3OTEsOSBAQAogCQkJCSAgICAgICAmcGNhbl91c2JfcHJvX2ZkKTsKIAogCQkvKiBlbmFibGUgVVNCIGNhbGlicmF0aW9uIG1lc3NhZ2VzICovCi0JCWVyciA9IHBjYW5fdXNiX2ZkX3NldF9maWx0ZXJfZXh0KGRldiwgMSwKLQkJCQkJCSBQVUNBTl9GTFRFWFRfRVJST1IsCi0JCQkJCQkgUENBTl9VRkRfRkxURVhUX0NBTElCUkFUSU9OKTsKKwkJZXJyID0gcGNhbl91c2JfZmRfc2V0X29wdGlvbnMoZGV2LCAxLAorCQkJCQkgICAgICBQVUNBTl9PUFRJT05fRVJST1IsCisJCQkJCSAgICAgIFBDQU5fVUZEX0ZMVEVYVF9DQUxJQlJBVElPTik7CiAJfQogCiAJcGRldi0+dXNiX2lmLT5kZXZfb3BlbmVkX2NvdW50Kys7CkBAIC04MDYsOSArODI3LDkgQEAKIAogCS8qIHR1cm4gb2ZmIHNwZWNpYWwgbXNncyBmb3IgdGhhdCBpbnRlcmZhY2UgaWYgbm8gb3RoZXIgZGV2IG9wZW5lZCAqLwogCWlmIChwZGV2LT51c2JfaWYtPmRldl9vcGVuZWRfY291bnQgPT0gMSkKLQkJcGNhbl91c2JfZmRfc2V0X2ZpbHRlcl9leHQoZGV2LCAwLAotCQkJCQkgICBQVUNBTl9GTFRFWFRfRVJST1IsCi0JCQkJCSAgIFBDQU5fVUZEX0ZMVEVYVF9DQUxJQlJBVElPTik7CisJCXBjYW5fdXNiX2ZkX3NldF9vcHRpb25zKGRldiwgMCwKKwkJCQkJUFVDQU5fT1BUSU9OX0VSUk9SLAorCQkJCQlQQ0FOX1VGRF9GTFRFWFRfQ0FMSUJSQVRJT04pOwogCXBkZXYtPnVzYl9pZi0+ZGV2X29wZW5lZF9jb3VudC0tOwogCiAJcmV0dXJuIDA7CkBAIC04NjAsOCArODgxLDE0IEBACiAJCQkgcGRldi0+dXNiX2lmLT5md19pbmZvLmZ3X3ZlcnNpb25bMl0sCiAJCQkgZGV2LT5hZGFwdGVyLT5jdHJsX2NvdW50KTsKIAotCQkvKiB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCBodyBpcyBub24tSVNPICovCi0JCWRldi0+Y2FuLmN0cmxtb2RlID0gQ0FOX0NUUkxNT0RFX0ZEX05PTl9JU087CisJCS8qIGNoZWNrIGZvciBhYmlsaXR5IHRvIHN3aXRjaCBiZXR3ZWVuIElTTy9ub24tSVNPIG1vZGVzICovCisJCWlmIChwZGV2LT51c2JfaWYtPmZ3X2luZm8uZndfdmVyc2lvblswXSA+PSAyKSB7CisJCQkvKiBmaXJtd2FyZSA+PSAyLnggc3VwcG9ydHMgSVNPL25vbi1JU08gc3dpdGNoaW5nICovCisJCQlkZXYtPmNhbi5jdHJsbW9kZV9zdXBwb3J0ZWQgfD0gQ0FOX0NUUkxNT0RFX0ZEX05PTl9JU087CisJCX0gZWxzZSB7CisJCQkvKiBmaXJtd2FyZSA8IDIueCBvbmx5IHN1cHBvcnRzIGZpeGVkKCEpIG5vbi1JU08gKi8KKwkJCWRldi0+Y2FuLmN0cmxtb2RlIHw9IENBTl9DVFJMTU9ERV9GRF9OT05fSVNPOworCQl9CiAKIAkJLyogdGVsbCB0aGUgaGFyZHdhcmUgdGhlIGNhbiBkcml2ZXIgaXMgcnVubmluZyAqLwogCQllcnIgPSBwY2FuX3VzYl9mZF9kcnZfbG9hZGVkKGRldiwgMSk7CkBAIC05MzcsOSArOTY0LDkgQEAKIAlpZiAoZGV2LT5jdHJsX2lkeCA9PSAwKSB7CiAJCS8qIHR1cm4gb2ZmIGNhbGlicmF0aW9uIG1lc3NhZ2UgaWYgYW55IGRldmljZSB3ZXJlIG9wZW5lZCAqLwogCQlpZiAocGRldi0+dXNiX2lmLT5kZXZfb3BlbmVkX2NvdW50ID4gMCkKLQkJCXBjYW5fdXNiX2ZkX3NldF9maWx0ZXJfZXh0KGRldiwgMCwKLQkJCQkJCSAgIFBVQ0FOX0ZMVEVYVF9FUlJPUiwKLQkJCQkJCSAgIFBDQU5fVUZEX0ZMVEVYVF9DQUxJQlJBVElPTik7CisJCQlwY2FuX3VzYl9mZF9zZXRfb3B0aW9ucyhkZXYsIDAsCisJCQkJCQlQVUNBTl9PUFRJT05fRVJST1IsCisJCQkJCQlQQ0FOX1VGRF9GTFRFWFRfQ0FMSUJSQVRJT04pOwogCiAJCS8qIHRlbGwgVVNCIGFkYXB0ZXIgdGhhdCB0aGUgZHJpdmVyIGlzIGJlaW5nIHVubG9hZGVkICovCiAJCXBjYW5fdXNiX2ZkX2Rydl9sb2FkZWQoZGV2LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi94aWxpbnhfY2FuLmMgYi9kcml2ZXJzL25ldC9jYW4veGlsaW54X2Nhbi5jCmluZGV4IDZjNjc2NDMuLjZiZGRmZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi94aWxpbnhfY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3hpbGlueF9jYW4uYwpAQCAtMTE4NSw3ICsxMTg1LDcgQEAKIH0KIAogLyogTWF0Y2ggdGFibGUgZm9yIE9GIHBsYXRmb3JtIGJpbmRpbmcgKi8KLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhjYW5fb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhjYW5fb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInhsbngsenlucS1jYW4tMS4wIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInhsbngsYXhpLWNhbi0xLjAwLmEiLCB9LAogCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9LY29uZmlnIGIvZHJpdmVycy9uZXQvZHNhL0tjb25maWcKaW5kZXggNDhlNjJhMy4uMTg1NTBjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZHNhL0tjb25maWcKQEAgLTcsNyArNyw3IEBACiAKIGNvbmZpZyBORVRfRFNBX01WODhFNjA2MAogCXRyaXN0YXRlICJNYXJ2ZWxsIDg4RTYwNjAgZXRoZXJuZXQgc3dpdGNoIGNoaXAgc3VwcG9ydCIKLQlzZWxlY3QgTkVUX0RTQQorCWRlcGVuZHMgb24gTkVUX0RTQQogCXNlbGVjdCBORVRfRFNBX1RBR19UUkFJTEVSCiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNYXJ2ZWxsIDg4RTYwNjAgZXRoZXJuZXQgc3dpdGNoCkBAIC0xOSw3ICsxOSw3IEBACiAKIGNvbmZpZyBORVRfRFNBX01WODhFNjEzMQogCXRyaXN0YXRlICJNYXJ2ZWxsIDg4RTYwODUvNjA5NS82MDk1Ri82MTMxIGV0aGVybmV0IHN3aXRjaCBjaGlwIHN1cHBvcnQiCi0Jc2VsZWN0IE5FVF9EU0EKKwlkZXBlbmRzIG9uIE5FVF9EU0EKIAlzZWxlY3QgTkVUX0RTQV9NVjg4RTZYWFgKIAlzZWxlY3QgTkVUX0RTQV9NVjg4RTZYWFhfTkVFRF9QUFUKIAlzZWxlY3QgTkVUX0RTQV9UQUdfRFNBCkBAIC0yOSw3ICsyOSw3IEBACiAKIGNvbmZpZyBORVRfRFNBX01WODhFNjEyM182MV82NQogCXRyaXN0YXRlICJNYXJ2ZWxsIDg4RTYxMjMvNjE2MS82MTY1IGV0aGVybmV0IHN3aXRjaCBjaGlwIHN1cHBvcnQiCi0Jc2VsZWN0IE5FVF9EU0EKKwlkZXBlbmRzIG9uIE5FVF9EU0EKIAlzZWxlY3QgTkVUX0RTQV9NVjg4RTZYWFgKIAlzZWxlY3QgTkVUX0RTQV9UQUdfRURTQQogCS0tLWhlbHAtLS0KQEAgLTM4LDcgKzM4LDcgQEAKIAogY29uZmlnIE5FVF9EU0FfTVY4OEU2MTcxCiAJdHJpc3RhdGUgIk1hcnZlbGwgODhFNjE3MS82MTcyIGV0aGVybmV0IHN3aXRjaCBjaGlwIHN1cHBvcnQiCi0Jc2VsZWN0IE5FVF9EU0EKKwlkZXBlbmRzIG9uIE5FVF9EU0EKIAlzZWxlY3QgTkVUX0RTQV9NVjg4RTZYWFgKIAlzZWxlY3QgTkVUX0RTQV9UQUdfRURTQQogCS0tLWhlbHAtLS0KQEAgLTQ3LDcgKzQ3LDcgQEAKIAogY29uZmlnIE5FVF9EU0FfTVY4OEU2MzUyCiAJdHJpc3RhdGUgIk1hcnZlbGwgODhFNjE3Ni84OEU2MzUyIGV0aGVybmV0IHN3aXRjaCBjaGlwIHN1cHBvcnQiCi0Jc2VsZWN0IE5FVF9EU0EKKwlkZXBlbmRzIG9uIE5FVF9EU0EKIAlzZWxlY3QgTkVUX0RTQV9NVjg4RTZYWFgKIAlzZWxlY3QgTkVUX0RTQV9UQUdfRURTQQogCS0tLWhlbHAtLS0KQEAgLTU2LDggKzU2LDcgQEAKIAogY29uZmlnIE5FVF9EU0FfQkNNX1NGMgogCXRyaXN0YXRlICJCcm9hZGNvbSBTdGFyZmlnaHRlciAyIEV0aGVybmV0IHN3aXRjaCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSEFTX0lPTUVNCi0Jc2VsZWN0IE5FVF9EU0EKKwlkZXBlbmRzIG9uIEhBU19JT01FTSAmJiBORVRfRFNBCiAJc2VsZWN0IE5FVF9EU0FfVEFHX0JSQ00KIAlzZWxlY3QgRklYRURfUEhZCiAJc2VsZWN0IEJDTTdYWFhfUEhZCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMi5jIGIvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjIuYwppbmRleCA0ZGFmZmIyLi5jZWRiNTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMi5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bmV0L2RzYS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KIAogI2luY2x1ZGUgImJjbV9zZjIuaCIKICNpbmNsdWRlICJiY21fc2YyX3JlZ3MuaCIKQEAgLTI5OSwxMCArMzAwLDE0IEBACiAJaWYgKHBvcnQgPT0gNykKIAkJaW50cmwyXzFfbWFza19jbGVhcihwcml2LCBQX0lSUV9NQVNLKFA3X0lSUV9PRkYpKTsKIAotCS8qIFNldCB0aGlzIHBvcnQsIGFuZCBvbmx5IHRoaXMgb25lIHRvIGJlIGluIHRoZSBkZWZhdWx0IFZMQU4gKi8KKwkvKiBTZXQgdGhpcyBwb3J0LCBhbmQgb25seSB0aGlzIG9uZSB0byBiZSBpbiB0aGUgZGVmYXVsdCBWTEFOLAorCSAqIGlmIG1lbWJlciBvZiBhIGJyaWRnZSwgcmVzdG9yZSBpdHMgbWVtYmVyc2hpcCBwcmlvciB0bworCSAqIGJyaW5naW5nIGRvd24gdGhpcyBwb3J0LgorCSAqLwogCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQocG9ydCkpOwogCXJlZyAmPSB+UE9SVF9WTEFOX0NUUkxfTUFTSzsKIAlyZWcgfD0gKDEgPDwgcG9ydCk7CisJcmVnIHw9IHByaXYtPnBvcnRfc3RzW3BvcnRdLnZsYW5fY3RsX21hc2s7CiAJY29yZV93cml0ZWwocHJpdiwgcmVnLCBDT1JFX1BPUlRfVkxBTl9DVExfUE9SVChwb3J0KSk7CiAKIAliY21fc2YyX2ltcF92bGFuX3NldHVwKGRzLCBjcHVfcG9ydCk7CkBAIC00MDAsNiArNDA1LDE1MSBAQAogCXJldHVybiAwOwogfQogCisvKiBGYXN0LWFnZWluZyBvZiBBUkwgZW50cmllcyBmb3IgYSBnaXZlbiBwb3J0LCBlcXVpdmFsZW50IHRvIGFuIEFSTAorICogZmx1c2ggZm9yIHRoYXQgcG9ydC4KKyAqLworc3RhdGljIGludCBiY21fc2YyX3N3X2Zhc3RfYWdlX3BvcnQoc3RydWN0IGRzYV9zd2l0Y2ggICpkcywgaW50IHBvcnQpCit7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTAwMDsKKwl1MzIgcmVnOworCisJY29yZV93cml0ZWwocHJpdiwgcG9ydCwgQ09SRV9GQVNUX0FHRV9QT1JUKTsKKworCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9GQVNUX0FHRV9DVFJMKTsKKwlyZWcgfD0gRU5fQUdFX1BPUlQgfCBGQVNUX0FHRV9TVFJfRE9ORTsKKwljb3JlX3dyaXRlbChwcml2LCByZWcsIENPUkVfRkFTVF9BR0VfQ1RSTCk7CisKKwlkbyB7CisJCXJlZyA9IGNvcmVfcmVhZGwocHJpdiwgQ09SRV9GQVNUX0FHRV9DVFJMKTsKKwkJaWYgKCEocmVnICYgRkFTVF9BR0VfU1RSX0RPTkUpKQorCQkJYnJlYWs7CisKKwkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAodGltZW91dC0tKTsKKworCWlmICghdGltZW91dCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY21fc2YyX3N3X2JyX2pvaW4oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCSAgICAgIHUzMiBicl9wb3J0X21hc2spCit7CisJc3RydWN0IGJjbV9zZjJfcHJpdiAqcHJpdiA9IGRzX3RvX3ByaXYoZHMpOworCXVuc2lnbmVkIGludCBpOworCXUzMiByZWcsIHBfY3RsOworCisJcF9jdGwgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfUE9SVF9WTEFOX0NUTF9QT1JUKHBvcnQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMubnVtX3BvcnRzOyBpKyspIHsKKwkJaWYgKCEoKDEgPDwgaSkgJiBicl9wb3J0X21hc2spKQorCQkJY29udGludWU7CisKKwkJLyogQWRkIHRoaXMgbG9jYWwgcG9ydCB0byB0aGUgcmVtb3RlIHBvcnQgVkxBTiBjb250cm9sCisJCSAqIG1lbWJlcnNoaXAgYW5kIHVwZGF0ZSB0aGUgcmVtb3RlIHBvcnQgYml0bWFzaworCQkgKi8KKwkJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX1BPUlRfVkxBTl9DVExfUE9SVChpKSk7CisJCXJlZyB8PSAxIDw8IHBvcnQ7CisJCWNvcmVfd3JpdGVsKHByaXYsIHJlZywgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQoaSkpOworCQlwcml2LT5wb3J0X3N0c1tpXS52bGFuX2N0bF9tYXNrID0gcmVnOworCisJCXBfY3RsIHw9IDEgPDwgaTsKKwl9CisKKwkvKiBDb25maWd1cmUgdGhlIGxvY2FsIHBvcnQgVkxBTiBjb250cm9sIG1lbWJlcnNoaXAgdG8gaW5jbHVkZQorCSAqIHJlbW90ZSBwb3J0cyBhbmQgdXBkYXRlIHRoZSBsb2NhbCBwb3J0IGJpdG1hc2sKKwkgKi8KKwljb3JlX3dyaXRlbChwcml2LCBwX2N0bCwgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQocG9ydCkpOworCXByaXYtPnBvcnRfc3RzW3BvcnRdLnZsYW5fY3RsX21hc2sgPSBwX2N0bDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbV9zZjJfc3dfYnJfbGVhdmUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCSAgICAgICB1MzIgYnJfcG9ydF9tYXNrKQoreworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgcmVnLCBwX2N0bDsKKworCXBfY3RsID0gY29yZV9yZWFkbChwcml2LCBDT1JFX1BPUlRfVkxBTl9DVExfUE9SVChwb3J0KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm51bV9wb3J0czsgaSsrKSB7CisJCS8qIERvbid0IHRvdWNoIHRoZSByZW1haW5pbmcgcG9ydHMgKi8KKwkJaWYgKCEoKDEgPDwgaSkgJiBicl9wb3J0X21hc2spKQorCQkJY29udGludWU7CisKKwkJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX1BPUlRfVkxBTl9DVExfUE9SVChpKSk7CisJCXJlZyAmPSB+KDEgPDwgcG9ydCk7CisJCWNvcmVfd3JpdGVsKHByaXYsIHJlZywgQ09SRV9QT1JUX1ZMQU5fQ1RMX1BPUlQoaSkpOworCQlwcml2LT5wb3J0X3N0c1twb3J0XS52bGFuX2N0bF9tYXNrID0gcmVnOworCisJCS8qIFByZXZlbnQgc2VsZiByZW1vdmFsIHRvIHByZXNlcnZlIGlzb2xhdGlvbiAqLworCQlpZiAocG9ydCAhPSBpKQorCQkJcF9jdGwgJj0gfigxIDw8IGkpOworCX0KKworCWNvcmVfd3JpdGVsKHByaXYsIHBfY3RsLCBDT1JFX1BPUlRfVkxBTl9DVExfUE9SVChwb3J0KSk7CisJcHJpdi0+cG9ydF9zdHNbcG9ydF0udmxhbl9jdGxfbWFzayA9IHBfY3RsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtX3NmMl9zd19icl9zZXRfc3RwX3N0YXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkJICAgICAgIHU4IHN0YXRlKQoreworCXN0cnVjdCBiY21fc2YyX3ByaXYgKnByaXYgPSBkc190b19wcml2KGRzKTsKKwl1OCBod19zdGF0ZSwgY3VyX2h3X3N0YXRlOworCWludCByZXQgPSAwOworCXUzMiByZWc7CisKKwlyZWcgPSBjb3JlX3JlYWRsKHByaXYsIENPUkVfR19QQ1RMX1BPUlQocG9ydCkpOworCWN1cl9od19zdGF0ZSA9IHJlZyA+PiBHX01JU1RQX1NUQVRFX1NISUZUOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgQlJfU1RBVEVfRElTQUJMRUQ6CisJCWh3X3N0YXRlID0gR19NSVNUUF9ESVNfU1RBVEU7CisJCWJyZWFrOworCWNhc2UgQlJfU1RBVEVfTElTVEVOSU5HOgorCQlod19zdGF0ZSA9IEdfTUlTVFBfTElTVEVOX1NUQVRFOworCQlicmVhazsKKwljYXNlIEJSX1NUQVRFX0xFQVJOSU5HOgorCQlod19zdGF0ZSA9IEdfTUlTVFBfTEVBUk5fU1RBVEU7CisJCWJyZWFrOworCWNhc2UgQlJfU1RBVEVfRk9SV0FSRElORzoKKwkJaHdfc3RhdGUgPSBHX01JU1RQX0ZXRF9TVEFURTsKKwkJYnJlYWs7CisJY2FzZSBCUl9TVEFURV9CTE9DS0lORzoKKwkJaHdfc3RhdGUgPSBHX01JU1RQX0JMT0NLX1NUQVRFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcl9lcnIoIiVzOiBpbnZhbGlkIFNUUCBzdGF0ZTogJWRcbiIsIF9fZnVuY19fLCBzdGF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZhc3QtYWdlIEFSTCBlbnRyaWVzIGlmIHdlIGFyZSBtb3ZpbmcgYSBwb3J0IGZyb20gTGVhcm5pbmcgb3IKKwkgKiBGb3J3YXJkaW5nIHN0YXRlIHRvIERpc2FibGVkLCBCbG9ja2luZyBvciBMaXN0ZW5pbmcgc3RhdGUKKwkgKi8KKwlpZiAoY3VyX2h3X3N0YXRlICE9IGh3X3N0YXRlKSB7CisJCWlmIChjdXJfaHdfc3RhdGUgJiA0ICYmICEoaHdfc3RhdGUgJiA0KSkgeworCQkJcmV0ID0gYmNtX3NmMl9zd19mYXN0X2FnZV9wb3J0KGRzLCBwb3J0KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcl9lcnIoIiVzOiBmYXN0LWFnZWluZyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJfQorCisJcmVnID0gY29yZV9yZWFkbChwcml2LCBDT1JFX0dfUENUTF9QT1JUKHBvcnQpKTsKKwlyZWcgJj0gfihHX01JU1RQX1NUQVRFX01BU0sgPDwgR19NSVNUUF9TVEFURV9TSElGVCk7CisJcmVnIHw9IGh3X3N0YXRlOworCWNvcmVfd3JpdGVsKHByaXYsIHJlZywgQ09SRV9HX1BDVExfUE9SVChwb3J0KSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlycXJldHVybl90IGJjbV9zZjJfc3dpdGNoXzBfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgYmNtX3NmMl9wcml2ICpwcml2ID0gZGV2X2lkOwpAQCAtOTE2LDYgKzEwNjYsOSBAQAogCS5wb3J0X2Rpc2FibGUJCT0gYmNtX3NmMl9wb3J0X2Rpc2FibGUsCiAJLmdldF9lZWUJCT0gYmNtX3NmMl9zd19nZXRfZWVlLAogCS5zZXRfZWVlCQk9IGJjbV9zZjJfc3dfc2V0X2VlZSwKKwkucG9ydF9qb2luX2JyaWRnZQk9IGJjbV9zZjJfc3dfYnJfam9pbiwKKwkucG9ydF9sZWF2ZV9icmlkZ2UJPSBiY21fc2YyX3N3X2JyX2xlYXZlLAorCS5wb3J0X3N0cF91cGRhdGUJPSBiY21fc2YyX3N3X2JyX3NldF9zdHBfc3RhdGUsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBiY21fc2YyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyLmggYi9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMi5oCmluZGV4IDdiNzA1M2QuLjIyZTJlYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyLmgKKysrIGIvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjIuaApAQCAtNDYsNiArNDYsOCBAQAogCXVuc2lnbmVkIGludCBsaW5rOwogCiAJc3RydWN0IGV0aHRvb2xfZWVlIGVlZTsKKworCXUzMiB2bGFuX2N0bF9tYXNrOwogfTsKIAogc3RydWN0IGJjbV9zZjJfcHJpdiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMl9yZWdzLmggYi9kcml2ZXJzL25ldC9kc2EvYmNtX3NmMl9yZWdzLmgKaW5kZXggY2FiZGZhNS4uZmE0ZTZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL2JjbV9zZjJfcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9iY21fc2YyX3JlZ3MuaApAQCAtMTYzLDYgKzE2MywyMSBAQAogI2RlZmluZSAgRU5fQ0hJUF9SU1QJCQkoMSA8PCA2KQogI2RlZmluZSAgRU5fU1dfUkVTRVQJCQkoMSA8PCA0KQogCisjZGVmaW5lIENPUkVfRkFTVF9BR0VfQ1RSTAkJMHgwMDIyMAorI2RlZmluZSAgRU5fRkFTVF9BR0VfU1RBVElDCQkoMSA8PCAwKQorI2RlZmluZSAgRU5fQUdFX0RZTkFNSUMJCQkoMSA8PCAxKQorI2RlZmluZSAgRU5fQUdFX1BPUlQJCQkoMSA8PCAyKQorI2RlZmluZSAgRU5fQUdFX1ZMQU4JCQkoMSA8PCAzKQorI2RlZmluZSAgRU5fQUdFX1NQVAkJCSgxIDw8IDQpCisjZGVmaW5lICBFTl9BR0VfTUNBU1QJCQkoMSA8PCA1KQorI2RlZmluZSAgRkFTVF9BR0VfU1RSX0RPTkUJCSgxIDw8IDcpCisKKyNkZWZpbmUgQ09SRV9GQVNUX0FHRV9QT1JUCQkweDAwMjI0CisjZGVmaW5lICBBR0VfUE9SVF9NQVNLCQkJMHhmCisKKyNkZWZpbmUgQ09SRV9GQVNUX0FHRV9WSUQJCTB4MDAyMjgKKyNkZWZpbmUgIEFHRV9WSURfTUFTSwkJCTB4M2ZmZgorCiAjZGVmaW5lIENPUkVfTE5LU1RTCQkJMHgwMDQwMAogI2RlZmluZSAgTE5LX1NUU19NQVNLCQkJMHgxZmYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNjEyM182MV82NS5jIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNjEyM182MV82NS5jCmluZGV4IGU5YzczNmUuLmI0YWY2ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYxMjNfNjFfNjUuYworKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MTIzXzYxXzY1LmMKQEAgLTI1LDY2ICsyNSwzMyBAQAogCWlmIChidXMgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXQgPSBfX212ODhlNnh4eF9yZWdfcmVhZChidXMsIHN3X2FkZHIsIFJFR19QT1JUKDApLCAweDAzKTsKKwlyZXQgPSBfX212ODhlNnh4eF9yZWdfcmVhZChidXMsIHN3X2FkZHIsIFJFR19QT1JUKDApLCBQT1JUX1NXSVRDSF9JRCk7CiAJaWYgKHJldCA+PSAwKSB7Ci0JCWlmIChyZXQgPT0gMHgxMjEyKQorCQlpZiAocmV0ID09IFBPUlRfU1dJVENIX0lEXzYxMjNfQTEpCiAJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjEyMyAoQTEpIjsKLQkJaWYgKHJldCA9PSAweDEyMTMpCisJCWlmIChyZXQgPT0gUE9SVF9TV0lUQ0hfSURfNjEyM19BMikKIAkJCXJldHVybiAiTWFydmVsbCA4OEU2MTIzIChBMikiOwotCQlpZiAoKHJldCAmIDB4ZmZmMCkgPT0gMHgxMjEwKQorCQlpZiAoKHJldCAmIDB4ZmZmMCkgPT0gUE9SVF9TV0lUQ0hfSURfNjEyMykKIAkJCXJldHVybiAiTWFydmVsbCA4OEU2MTIzIjsKIAotCQlpZiAocmV0ID09IDB4MTYxMikKKwkJaWYgKHJldCA9PSBQT1JUX1NXSVRDSF9JRF82MTYxX0ExKQogCQkJcmV0dXJuICJNYXJ2ZWxsIDg4RTYxNjEgKEExKSI7Ci0JCWlmIChyZXQgPT0gMHgxNjEzKQorCQlpZiAocmV0ID09IFBPUlRfU1dJVENIX0lEXzYxNjFfQTIpCiAJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjE2MSAoQTIpIjsKLQkJaWYgKChyZXQgJiAweGZmZjApID09IDB4MTYxMCkKKwkJaWYgKChyZXQgJiAweGZmZjApID09IFBPUlRfU1dJVENIX0lEXzYxNjEpCiAJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjE2MSI7CiAKLQkJaWYgKHJldCA9PSAweDE2NTIpCisJCWlmIChyZXQgPT0gUE9SVF9TV0lUQ0hfSURfNjE2NV9BMSkKIAkJCXJldHVybiAiTWFydmVsbCA4OEU2MTY1IChBMSkiOwotCQlpZiAocmV0ID09IDB4MTY1MykKKwkJaWYgKHJldCA9PSBQT1JUX1NXSVRDSF9JRF82MTY1X0EyKQogCQkJcmV0dXJuICJNYXJ2ZWxsIDg4ZTYxNjUgKEEyKSI7Ci0JCWlmICgocmV0ICYgMHhmZmYwKSA9PSAweDE2NTApCisJCWlmICgocmV0ICYgMHhmZmYwKSA9PSBQT1JUX1NXSVRDSF9JRF82MTY1KQogCQkJcmV0dXJuICJNYXJ2ZWxsIDg4RTYxNjUiOwogCX0KIAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IG12ODhlNjEyM182MV82NV9zd2l0Y2hfcmVzZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQotewotCWludCBpOwotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCi0JLyogU2V0IGFsbCBwb3J0cyB0byB0aGUgZGlzYWJsZWQgc3RhdGUuICovCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlyZXQgPSBSRUdfUkVBRChSRUdfUE9SVChpKSwgMHgwNCk7Ci0JCVJFR19XUklURShSRUdfUE9SVChpKSwgMHgwNCwgcmV0ICYgMHhmZmZjKTsKLQl9Ci0KLQkvKiBXYWl0IGZvciB0cmFuc21pdCBxdWV1ZXMgdG8gZHJhaW4uICovCi0JdXNsZWVwX3JhbmdlKDIwMDAsIDQwMDApOwotCi0JLyogUmVzZXQgdGhlIHN3aXRjaC4gKi8KLQlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgwNCwgMHhjNDAwKTsKLQotCS8qIFdhaXQgdXAgdG8gb25lIHNlY29uZCBmb3IgcmVzZXQgdG8gY29tcGxldGUuICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAxICogSFo7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCXJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwsIDB4MDApOwotCQlpZiAoKHJldCAmIDB4YzgwMCkgPT0gMHhjODAwKQotCQkJYnJlYWs7Ci0KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwotCX0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBtdjg4ZTYxMjNfNjFfNjVfc2V0dXBfZ2xvYmFsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKIAlpbnQgcmV0OwpAQCAtMjIyLDI4ICsxODksNiBAQAogCQl2YWwgfD0gMHgwMDBjOwogCVJFR19XUklURShhZGRyLCAweDA0LCB2YWwpOwogCi0JLyogUG9ydCBDb250cm9sIDE6IGRpc2FibGUgdHJ1bmtpbmcuICBBbHNvLCBpZiB0aGlzIGlzIHRoZQotCSAqIENQVSBwb3J0LCBlbmFibGUgbGVhcm4gbWVzc2FnZXMgdG8gYmUgc2VudCB0byB0aGlzIHBvcnQuCi0JICovCi0JUkVHX1dSSVRFKGFkZHIsIDB4MDUsIGRzYV9pc19jcHVfcG9ydChkcywgcCkgPyAweDgwMDAgOiAweDAwMDApOwotCi0JLyogUG9ydCBiYXNlZCBWTEFOIG1hcDogZ2l2ZSBlYWNoIHBvcnQgaXRzIG93biBhZGRyZXNzCi0JICogZGF0YWJhc2UsIGFsbG93IHRoZSBDUFUgcG9ydCB0byB0YWxrIHRvIGVhY2ggb2YgdGhlICdyZWFsJwotCSAqIHBvcnRzLCBhbmQgYWxsb3cgZWFjaCBvZiB0aGUgJ3JlYWwnIHBvcnRzIHRvIG9ubHkgdGFsayB0bwotCSAqIHRoZSB1cHN0cmVhbSBwb3J0LgotCSAqLwotCXZhbCA9IChwICYgMHhmKSA8PCAxMjsKLQlpZiAoZHNhX2lzX2NwdV9wb3J0KGRzLCBwKSkKLQkJdmFsIHw9IGRzLT5waHlzX3BvcnRfbWFzazsKLQllbHNlCi0JCXZhbCB8PSAxIDw8IGRzYV91cHN0cmVhbV9wb3J0KGRzKTsKLQlSRUdfV1JJVEUoYWRkciwgMHgwNiwgdmFsKTsKLQotCS8qIERlZmF1bHQgVkxBTiBJRCBhbmQgcHJpb3JpdHk6IGRvbid0IHNldCBhIGRlZmF1bHQgVkxBTgotCSAqIElELCBhbmQgc2V0IHRoZSBkZWZhdWx0IHBhY2tldCBwcmlvcml0eSB0byB6ZXJvLgotCSAqLwotCVJFR19XUklURShhZGRyLCAweDA3LCAweDAwMDApOwotCiAJLyogUG9ydCBDb250cm9sIDI6IGRvbid0IGZvcmNlIGEgZ29vZCBGQ1MsIHNldCB0aGUgbWF4aW11bQogCSAqIGZyYW1lIHNpemUgdG8gMTAyNDAgYnl0ZXMsIGRvbid0IGxldCB0aGUgc3dpdGNoIGFkZCBvcgogCSAqIHN0cmlwIDgwMi4xcSB0YWdzLCBkb24ndCBkaXNjYXJkIHRhZ2dlZCBvciB1bnRhZ2dlZCBmcmFtZXMKQEAgLTI4OCw3ICsyMzMsNyBAQAogCSAqLwogCVJFR19XUklURShhZGRyLCAweDE5LCAweDc2NTQpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIG12ODhlNnh4eF9zZXR1cF9wb3J0X2NvbW1vbihkcywgcCk7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2MTIzXzYxXzY1X3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKQEAgLTI5NywxMSArMjQyLDIzIEBACiAJaW50IGk7CiAJaW50IHJldDsKIAotCW11dGV4X2luaXQoJnBzLT5zbWlfbXV0ZXgpOwotCW11dGV4X2luaXQoJnBzLT5zdGF0c19tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmcHMtPnBoeV9tdXRleCk7CisJcmV0ID0gbXY4OGU2eHh4X3NldHVwX2NvbW1vbihkcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBtdjg4ZTYxMjNfNjFfNjVfc3dpdGNoX3Jlc2V0KGRzKTsKKwlzd2l0Y2ggKHBzLT5pZCkgeworCWNhc2UgUE9SVF9TV0lUQ0hfSURfNjEyMzoKKwkJcHMtPm51bV9wb3J0cyA9IDM7CisJCWJyZWFrOworCWNhc2UgUE9SVF9TV0lUQ0hfSURfNjE2MToKKwljYXNlIFBPUlRfU1dJVENIX0lEXzYxNjU6CisJCXBzLT5udW1fcG9ydHMgPSA2OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXQgPSBtdjg4ZTZ4eHhfc3dpdGNoX3Jlc2V0KGRzLCBmYWxzZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTMxMSw3ICsyNjgsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBwcy0+bnVtX3BvcnRzOyBpKyspIHsKIAkJcmV0ID0gbXY4OGU2MTIzXzYxXzY1X3NldHVwX3BvcnQoZHMsIGkpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CkBAIC0zMjAsMTA4ICsyNzcsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtdjg4ZTYxMjNfNjFfNjVfcG9ydF90b19waHlfYWRkcihpbnQgcG9ydCkKLXsKLQlpZiAocG9ydCA+PSAwICYmIHBvcnQgPD0gNCkKLQkJcmV0dXJuIHBvcnQ7Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50Ci1tdjg4ZTYxMjNfNjFfNjVfcGh5X3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgaW50IHJlZ251bSkKLXsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7Ci0JaW50IGFkZHIgPSBtdjg4ZTYxMjNfNjFfNjVfcG9ydF90b19waHlfYWRkcihwb3J0KTsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmcHMtPnBoeV9tdXRleCk7Ci0JcmV0ID0gbXY4OGU2eHh4X3BoeV9yZWFkKGRzLCBhZGRyLCByZWdudW0pOwotCW11dGV4X3VubG9jaygmcHMtPnBoeV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludAotbXY4OGU2MTIzXzYxXzY1X3BoeV93cml0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCi0JCQkgICAgICBpbnQgcG9ydCwgaW50IHJlZ251bSwgdTE2IHZhbCkKLXsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7Ci0JaW50IGFkZHIgPSBtdjg4ZTYxMjNfNjFfNjVfcG9ydF90b19waHlfYWRkcihwb3J0KTsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmcHMtPnBoeV9tdXRleCk7Ci0JcmV0ID0gbXY4OGU2eHh4X3BoeV93cml0ZShkcywgYWRkciwgcmVnbnVtLCB2YWwpOwotCW11dGV4X3VubG9jaygmcHMtPnBoeV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCBtdjg4ZTYxMjNfNjFfNjVfaHdfc3RhdHNbXSA9IHsKLQl7ICJpbl9nb29kX29jdGV0cyIsIDgsIDB4MDAsIH0sCi0JeyAiaW5fYmFkX29jdGV0cyIsIDQsIDB4MDIsIH0sCi0JeyAiaW5fdW5pY2FzdCIsIDQsIDB4MDQsIH0sCi0JeyAiaW5fYnJvYWRjYXN0cyIsIDQsIDB4MDYsIH0sCi0JeyAiaW5fbXVsdGljYXN0cyIsIDQsIDB4MDcsIH0sCi0JeyAiaW5fcGF1c2UiLCA0LCAweDE2LCB9LAotCXsgImluX3VuZGVyc2l6ZSIsIDQsIDB4MTgsIH0sCi0JeyAiaW5fZnJhZ21lbnRzIiwgNCwgMHgxOSwgfSwKLQl7ICJpbl9vdmVyc2l6ZSIsIDQsIDB4MWEsIH0sCi0JeyAiaW5famFiYmVyIiwgNCwgMHgxYiwgfSwKLQl7ICJpbl9yeF9lcnJvciIsIDQsIDB4MWMsIH0sCi0JeyAiaW5fZmNzX2Vycm9yIiwgNCwgMHgxZCwgfSwKLQl7ICJvdXRfb2N0ZXRzIiwgOCwgMHgwZSwgfSwKLQl7ICJvdXRfdW5pY2FzdCIsIDQsIDB4MTAsIH0sCi0JeyAib3V0X2Jyb2FkY2FzdHMiLCA0LCAweDEzLCB9LAotCXsgIm91dF9tdWx0aWNhc3RzIiwgNCwgMHgxMiwgfSwKLQl7ICJvdXRfcGF1c2UiLCA0LCAweDE1LCB9LAotCXsgImV4Y2Vzc2l2ZSIsIDQsIDB4MTEsIH0sCi0JeyAiY29sbGlzaW9ucyIsIDQsIDB4MWUsIH0sCi0JeyAiZGVmZXJyZWQiLCA0LCAweDA1LCB9LAotCXsgInNpbmdsZSIsIDQsIDB4MTQsIH0sCi0JeyAibXVsdGlwbGUiLCA0LCAweDE3LCB9LAotCXsgIm91dF9mY3NfZXJyb3IiLCA0LCAweDAzLCB9LAotCXsgImxhdGUiLCA0LCAweDFmLCB9LAotCXsgImhpc3RfNjRieXRlcyIsIDQsIDB4MDgsIH0sCi0JeyAiaGlzdF82NV8xMjdieXRlcyIsIDQsIDB4MDksIH0sCi0JeyAiaGlzdF8xMjhfMjU1Ynl0ZXMiLCA0LCAweDBhLCB9LAotCXsgImhpc3RfMjU2XzUxMWJ5dGVzIiwgNCwgMHgwYiwgfSwKLQl7ICJoaXN0XzUxMl8xMDIzYnl0ZXMiLCA0LCAweDBjLCB9LAotCXsgImhpc3RfMTAyNF9tYXhfYnl0ZXMiLCA0LCAweDBkLCB9LAotCXsgInN3X2luX2Rpc2NhcmRzIiwgNCwgMHgxMTAsIH0sCi0JeyAic3dfaW5fZmlsdGVyZWQiLCAyLCAweDExMiwgfSwKLQl7ICJzd19vdXRfZmlsdGVyZWQiLCAyLCAweDExMywgfSwKLX07Ci0KLXN0YXRpYyB2b2lkCi1tdjg4ZTYxMjNfNjFfNjVfZ2V0X3N0cmluZ3Moc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgdWludDhfdCAqZGF0YSkKLXsKLQltdjg4ZTZ4eHhfZ2V0X3N0cmluZ3MoZHMsIEFSUkFZX1NJWkUobXY4OGU2MTIzXzYxXzY1X2h3X3N0YXRzKSwKLQkJCSAgICAgIG12ODhlNjEyM182MV82NV9od19zdGF0cywgcG9ydCwgZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1tdjg4ZTYxMjNfNjFfNjVfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAotCQkJCSAgaW50IHBvcnQsIHVpbnQ2NF90ICpkYXRhKQotewotCW12ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cyhkcywgQVJSQVlfU0laRShtdjg4ZTYxMjNfNjFfNjVfaHdfc3RhdHMpLAotCQkJCSAgICBtdjg4ZTYxMjNfNjFfNjVfaHdfc3RhdHMsIHBvcnQsIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IG12ODhlNjEyM182MV82NV9nZXRfc3NldF9jb3VudChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCi17Ci0JcmV0dXJuIEFSUkFZX1NJWkUobXY4OGU2MTIzXzYxXzY1X2h3X3N0YXRzKTsKLX0KLQogc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIG12ODhlNjEyM182MV82NV9zd2l0Y2hfZHJpdmVyID0gewogCS50YWdfcHJvdG9jb2wJCT0gRFNBX1RBR19QUk9UT19FRFNBLAogCS5wcml2X3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSksCiAJLnByb2JlCQkJPSBtdjg4ZTYxMjNfNjFfNjVfcHJvYmUsCiAJLnNldHVwCQkJPSBtdjg4ZTYxMjNfNjFfNjVfc2V0dXAsCiAJLnNldF9hZGRyCQk9IG12ODhlNnh4eF9zZXRfYWRkcl9pbmRpcmVjdCwKLQkucGh5X3JlYWQJCT0gbXY4OGU2MTIzXzYxXzY1X3BoeV9yZWFkLAotCS5waHlfd3JpdGUJCT0gbXY4OGU2MTIzXzYxXzY1X3BoeV93cml0ZSwKKwkucGh5X3JlYWQJCT0gbXY4OGU2eHh4X3BoeV9yZWFkLAorCS5waHlfd3JpdGUJCT0gbXY4OGU2eHh4X3BoeV93cml0ZSwKIAkucG9sbF9saW5rCQk9IG12ODhlNnh4eF9wb2xsX2xpbmssCi0JLmdldF9zdHJpbmdzCQk9IG12ODhlNjEyM182MV82NV9nZXRfc3RyaW5ncywKLQkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBtdjg4ZTYxMjNfNjFfNjVfZ2V0X2V0aHRvb2xfc3RhdHMsCi0JLmdldF9zc2V0X2NvdW50CQk9IG12ODhlNjEyM182MV82NV9nZXRfc3NldF9jb3VudCwKKwkuZ2V0X3N0cmluZ3MJCT0gbXY4OGU2eHh4X2dldF9zdHJpbmdzLAorCS5nZXRfZXRodG9vbF9zdGF0cwk9IG12ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3NzZXRfY291bnQJCT0gbXY4OGU2eHh4X2dldF9zc2V0X2NvdW50LAogI2lmZGVmIENPTkZJR19ORVRfRFNBX0hXTU9OCiAJLmdldF90ZW1wCQk9IG12ODhlNnh4eF9nZXRfdGVtcCwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNjEzMS5jIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNjEzMS5jCmluZGV4IDI1NDBlZjAuLmU1NDgyNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYxMzEuYworKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MTMxLmMKQEAgLTE3LDEyICsxNyw2IEBACiAjaW5jbHVkZSA8bmV0L2RzYS5oPgogI2luY2x1ZGUgIm12ODhlNnh4eC5oIgogCi0vKiBTd2l0Y2ggcHJvZHVjdCBJRHMgKi8KLSNkZWZpbmUgSURfNjA4NQkJMHgwNGEwCi0jZGVmaW5lIElEXzYwOTUJCTB4MDk1MAotI2RlZmluZSBJRF82MTMxCQkweDEwNjAKLSNkZWZpbmUgSURfNjEzMV9CMgkweDEwNjYKLQogc3RhdGljIGNoYXIgKm12ODhlNjEzMV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpob3N0X2RldiwgaW50IHN3X2FkZHIpCiB7CiAJc3RydWN0IG1paV9idXMgKmJ1cyA9IGRzYV9ob3N0X2Rldl90b19taWlfYnVzKGhvc3RfZGV2KTsKQEAgLTMxLDU2ICsyNSwyMyBAQAogCWlmIChidXMgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXQgPSBfX212ODhlNnh4eF9yZWdfcmVhZChidXMsIHN3X2FkZHIsIFJFR19QT1JUKDApLCAweDAzKTsKKwlyZXQgPSBfX212ODhlNnh4eF9yZWdfcmVhZChidXMsIHN3X2FkZHIsIFJFR19QT1JUKDApLCBQT1JUX1NXSVRDSF9JRCk7CiAJaWYgKHJldCA+PSAwKSB7CiAJCWludCByZXRfbWFza2VkID0gcmV0ICYgMHhmZmYwOwogCi0JCWlmIChyZXRfbWFza2VkID09IElEXzYwODUpCisJCWlmIChyZXRfbWFza2VkID09IFBPUlRfU1dJVENIX0lEXzYwODUpCiAJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjA4NSI7Ci0JCWlmIChyZXRfbWFza2VkID09IElEXzYwOTUpCisJCWlmIChyZXRfbWFza2VkID09IFBPUlRfU1dJVENIX0lEXzYwOTUpCiAJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjA5NS84OEU2MDk1RiI7Ci0JCWlmIChyZXQgPT0gSURfNjEzMV9CMikKKwkJaWYgKHJldCA9PSBQT1JUX1NXSVRDSF9JRF82MTMxX0IyKQogCQkJcmV0dXJuICJNYXJ2ZWxsIDg4RTYxMzEgKEIyKSI7Ci0JCWlmIChyZXRfbWFza2VkID09IElEXzYxMzEpCisJCWlmIChyZXRfbWFza2VkID09IFBPUlRfU1dJVENIX0lEXzYxMzEpCiAJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjEzMSI7CiAJfQogCiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2MTMxX3N3aXRjaF9yZXNldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCi17Ci0JaW50IGk7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0KLQkvKiBTZXQgYWxsIHBvcnRzIHRvIHRoZSBkaXNhYmxlZCBzdGF0ZS4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykgewotCQlyZXQgPSBSRUdfUkVBRChSRUdfUE9SVChpKSwgMHgwNCk7Ci0JCVJFR19XUklURShSRUdfUE9SVChpKSwgMHgwNCwgcmV0ICYgMHhmZmZjKTsKLQl9Ci0KLQkvKiBXYWl0IGZvciB0cmFuc21pdCBxdWV1ZXMgdG8gZHJhaW4uICovCi0JdXNsZWVwX3JhbmdlKDIwMDAsIDQwMDApOwotCi0JLyogUmVzZXQgdGhlIHN3aXRjaC4gKi8KLQlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgwNCwgMHhjNDAwKTsKLQotCS8qIFdhaXQgdXAgdG8gb25lIHNlY29uZCBmb3IgcmVzZXQgdG8gY29tcGxldGUuICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAxICogSFo7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCXJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwsIDB4MDApOwotCQlpZiAoKHJldCAmIDB4YzgwMCkgPT0gMHhjODAwKQotCQkJYnJlYWs7Ci0KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwotCX0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBtdjg4ZTYxMzFfc2V0dXBfZ2xvYmFsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKIAlpbnQgcmV0OwpAQCAtMTc0LDcgKzEzNSw3IEBACiAJICogKDEwMCBNYi9zIG9uIDYwODUpIGZ1bGwgZHVwbGV4LgogCSAqLwogCWlmIChkc2FfaXNfY3B1X3BvcnQoZHMsIHApIHx8IGRzLT5kc2FfcG9ydF9tYXNrICYgKDEgPDwgcCkpCi0JCWlmIChwcy0+aWQgPT0gSURfNjA4NSkKKwkJaWYgKHBzLT5pZCA9PSBQT1JUX1NXSVRDSF9JRF82MDg1KQogCQkJUkVHX1dSSVRFKGFkZHIsIDB4MDEsIDB4MDAzZCk7IC8qIDEwMCBNYi9zICovCiAJCWVsc2UKIAkJCVJFR19XUklURShhZGRyLCAweDAxLCAweDAwM2UpOyAvKiAxMDAwIE1iL3MgKi8KQEAgLTIwMSwzNSArMTYyLDEzIEBACiAJCS8qIE9uIDYwODUsIHVua25vd24gbXVsdGljYXN0IGZvcndhcmQgaXMgY29udHJvbGxlZAogCQkgKiBoZXJlIHJhdGhlciB0aGFuIGluIFBvcnQgQ29udHJvbCAyIHJlZ2lzdGVyLgogCQkgKi8KLQkJaWYgKHBzLT5pZCA9PSBJRF82MDg1KQorCQlpZiAocHMtPmlkID09IFBPUlRfU1dJVENIX0lEXzYwODUpCiAJCQl2YWwgfD0gMHgwMDA4OwogCX0KIAlpZiAoZHMtPmRzYV9wb3J0X21hc2sgJiAoMSA8PCBwKSkKIAkJdmFsIHw9IDB4MDEwMDsKIAlSRUdfV1JJVEUoYWRkciwgMHgwNCwgdmFsKTsKIAotCS8qIFBvcnQgQ29udHJvbCAxOiBkaXNhYmxlIHRydW5raW5nLiAgQWxzbywgaWYgdGhpcyBpcyB0aGUKLQkgKiBDUFUgcG9ydCwgZW5hYmxlIGxlYXJuIG1lc3NhZ2VzIHRvIGJlIHNlbnQgdG8gdGhpcyBwb3J0LgotCSAqLwotCVJFR19XUklURShhZGRyLCAweDA1LCBkc2FfaXNfY3B1X3BvcnQoZHMsIHApID8gMHg4MDAwIDogMHgwMDAwKTsKLQotCS8qIFBvcnQgYmFzZWQgVkxBTiBtYXA6IGdpdmUgZWFjaCBwb3J0IGl0cyBvd24gYWRkcmVzcwotCSAqIGRhdGFiYXNlLCBhbGxvdyB0aGUgQ1BVIHBvcnQgdG8gdGFsayB0byBlYWNoIG9mIHRoZSAncmVhbCcKLQkgKiBwb3J0cywgYW5kIGFsbG93IGVhY2ggb2YgdGhlICdyZWFsJyBwb3J0cyB0byBvbmx5IHRhbGsgdG8KLQkgKiB0aGUgdXBzdHJlYW0gcG9ydC4KLQkgKi8KLQl2YWwgPSAocCAmIDB4ZikgPDwgMTI7Ci0JaWYgKGRzYV9pc19jcHVfcG9ydChkcywgcCkpCi0JCXZhbCB8PSBkcy0+cGh5c19wb3J0X21hc2s7Ci0JZWxzZQotCQl2YWwgfD0gMSA8PCBkc2FfdXBzdHJlYW1fcG9ydChkcyk7Ci0JUkVHX1dSSVRFKGFkZHIsIDB4MDYsIHZhbCk7Ci0KLQkvKiBEZWZhdWx0IFZMQU4gSUQgYW5kIHByaW9yaXR5OiBkb24ndCBzZXQgYSBkZWZhdWx0IFZMQU4KLQkgKiBJRCwgYW5kIHNldCB0aGUgZGVmYXVsdCBwYWNrZXQgcHJpb3JpdHkgdG8gemVyby4KLQkgKi8KLQlSRUdfV1JJVEUoYWRkciwgMHgwNywgMHgwMDAwKTsKLQogCS8qIFBvcnQgQ29udHJvbCAyOiBkb24ndCBmb3JjZSBhIGdvb2QgRkNTLCBkb24ndCB1c2UKIAkgKiBWTEFOLWJhc2VkLCBzb3VyY2UgYWRkcmVzcy1iYXNlZCBvciBkZXN0aW5hdGlvbgogCSAqIGFkZHJlc3MtYmFzZWQgcHJpb3JpdHkgb3ZlcnJpZGVzLCBkb24ndCBsZXQgdGhlIHN3aXRjaApAQCAtMjQyLDcgKzE4MSw3IEBACiAJICogSWYgdGhpcyBpcyB0aGUgdXBzdHJlYW0gcG9ydCBmb3IgdGhpcyBzd2l0Y2gsIGVuYWJsZQogCSAqIGZvcndhcmRpbmcgb2YgdW5rbm93biBtdWx0aWNhc3QgYWRkcmVzc2VzLgogCSAqLwotCWlmIChwcy0+aWQgPT0gSURfNjA4NSkKKwlpZiAocHMtPmlkID09IFBPUlRfU1dJVENIX0lEXzYwODUpCiAJCS8qIG9uIDYwODUsIGJpdHMgMzowIGFyZSByZXNlcnZlZCwgYml0IDYgY29udHJvbCBBUlAKIAkJICogbWlycm9yaW5nLCBhbmQgbXVsdGljYXN0IGZvcndhcmQgaXMgaGFuZGxlZCBpbgogCQkgKiBQb3J0IENvbnRyb2wgcmVnaXN0ZXIuCkBAIC0yNzgsNyArMjE3LDcgQEAKIAkgKi8KIAlSRUdfV1JJVEUoYWRkciwgMHgxOSwgMHg3NjU0KTsKIAotCXJldHVybiAwOworCXJldHVybiBtdjg4ZTZ4eHhfc2V0dXBfcG9ydF9jb21tb24oZHMsIHApOwogfQogCiBzdGF0aWMgaW50IG12ODhlNjEzMV9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCkBAIC0yODcsMTMgKzIyNiwyOCBAQAogCWludCBpOwogCWludCByZXQ7CiAKLQltdXRleF9pbml0KCZwcy0+c21pX211dGV4KTsKKwlyZXQgPSBtdjg4ZTZ4eHhfc2V0dXBfY29tbW9uKGRzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCW12ODhlNnh4eF9wcHVfc3RhdGVfaW5pdChkcyk7Ci0JbXV0ZXhfaW5pdCgmcHMtPnN0YXRzX211dGV4KTsKIAotCXBzLT5pZCA9IFJFR19SRUFEKFJFR19QT1JUKDApLCAweDAzKSAmIDB4ZmZmMDsKKwlzd2l0Y2ggKHBzLT5pZCkgeworCWNhc2UgUE9SVF9TV0lUQ0hfSURfNjA4NToKKwkJcHMtPm51bV9wb3J0cyA9IDEwOworCQlicmVhazsKKwljYXNlIFBPUlRfU1dJVENIX0lEXzYwOTU6CisJCXBzLT5udW1fcG9ydHMgPSAxMTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX1NXSVRDSF9JRF82MTMxOgorCWNhc2UgUE9SVF9TV0lUQ0hfSURfNjEzMV9CMjoKKwkJcHMtPm51bV9wb3J0cyA9IDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PREVWOworCX0KIAotCXJldCA9IG12ODhlNjEzMV9zd2l0Y2hfcmVzZXQoZHMpOworCXJldCA9IG12ODhlNnh4eF9zd2l0Y2hfcmVzZXQoZHMsIGZhbHNlKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzAzLDcgKzI1Nyw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgMTE7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBwcy0+bnVtX3BvcnRzOyBpKyspIHsKIAkJcmV0ID0gbXY4OGU2MTMxX3NldHVwX3BvcnQoZHMsIGkpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CkBAIC0zMTIsMTcgKzI2NiwyNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG12ODhlNjEzMV9wb3J0X3RvX3BoeV9hZGRyKGludCBwb3J0KQorc3RhdGljIGludCBtdjg4ZTYxMzFfcG9ydF90b19waHlfYWRkcihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQogewotCWlmIChwb3J0ID49IDAgJiYgcG9ydCA8PSAxMSkKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CisKKwlpZiAocG9ydCA+PSAwICYmIHBvcnQgPCBwcy0+bnVtX3BvcnRzKQogCQlyZXR1cm4gcG9ydDsKLQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gLUVJTlZBTDsKIH0KIAogc3RhdGljIGludAogbXY4OGU2MTMxX3BoeV9yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGludCByZWdudW0pCiB7Ci0JaW50IGFkZHIgPSBtdjg4ZTYxMzFfcG9ydF90b19waHlfYWRkcihwb3J0KTsKKwlpbnQgYWRkciA9IG12ODhlNjEzMV9wb3J0X3RvX3BoeV9hZGRyKGRzLCBwb3J0KTsKKworCWlmIChhZGRyIDwgMCkKKwkJcmV0dXJuIGFkZHI7CisKIAlyZXR1cm4gbXY4OGU2eHh4X3BoeV9yZWFkX3BwdShkcywgYWRkciwgcmVnbnVtKTsKIH0KIApAQCAtMzMwLDYzICsyOTEsMTQgQEAKIG12ODhlNjEzMV9waHlfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAogCQkJICAgICAgaW50IHBvcnQsIGludCByZWdudW0sIHUxNiB2YWwpCiB7Ci0JaW50IGFkZHIgPSBtdjg4ZTYxMzFfcG9ydF90b19waHlfYWRkcihwb3J0KTsKKwlpbnQgYWRkciA9IG12ODhlNjEzMV9wb3J0X3RvX3BoeV9hZGRyKGRzLCBwb3J0KTsKKworCWlmIChhZGRyIDwgMCkKKwkJcmV0dXJuIGFkZHI7CisKIAlyZXR1cm4gbXY4OGU2eHh4X3BoeV93cml0ZV9wcHUoZHMsIGFkZHIsIHJlZ251bSwgdmFsKTsKIH0KIAotc3RhdGljIHN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCBtdjg4ZTYxMzFfaHdfc3RhdHNbXSA9IHsKLQl7ICJpbl9nb29kX29jdGV0cyIsIDgsIDB4MDAsIH0sCi0JeyAiaW5fYmFkX29jdGV0cyIsIDQsIDB4MDIsIH0sCi0JeyAiaW5fdW5pY2FzdCIsIDQsIDB4MDQsIH0sCi0JeyAiaW5fYnJvYWRjYXN0cyIsIDQsIDB4MDYsIH0sCi0JeyAiaW5fbXVsdGljYXN0cyIsIDQsIDB4MDcsIH0sCi0JeyAiaW5fcGF1c2UiLCA0LCAweDE2LCB9LAotCXsgImluX3VuZGVyc2l6ZSIsIDQsIDB4MTgsIH0sCi0JeyAiaW5fZnJhZ21lbnRzIiwgNCwgMHgxOSwgfSwKLQl7ICJpbl9vdmVyc2l6ZSIsIDQsIDB4MWEsIH0sCi0JeyAiaW5famFiYmVyIiwgNCwgMHgxYiwgfSwKLQl7ICJpbl9yeF9lcnJvciIsIDQsIDB4MWMsIH0sCi0JeyAiaW5fZmNzX2Vycm9yIiwgNCwgMHgxZCwgfSwKLQl7ICJvdXRfb2N0ZXRzIiwgOCwgMHgwZSwgfSwKLQl7ICJvdXRfdW5pY2FzdCIsIDQsIDB4MTAsIH0sCi0JeyAib3V0X2Jyb2FkY2FzdHMiLCA0LCAweDEzLCB9LAotCXsgIm91dF9tdWx0aWNhc3RzIiwgNCwgMHgxMiwgfSwKLQl7ICJvdXRfcGF1c2UiLCA0LCAweDE1LCB9LAotCXsgImV4Y2Vzc2l2ZSIsIDQsIDB4MTEsIH0sCi0JeyAiY29sbGlzaW9ucyIsIDQsIDB4MWUsIH0sCi0JeyAiZGVmZXJyZWQiLCA0LCAweDA1LCB9LAotCXsgInNpbmdsZSIsIDQsIDB4MTQsIH0sCi0JeyAibXVsdGlwbGUiLCA0LCAweDE3LCB9LAotCXsgIm91dF9mY3NfZXJyb3IiLCA0LCAweDAzLCB9LAotCXsgImxhdGUiLCA0LCAweDFmLCB9LAotCXsgImhpc3RfNjRieXRlcyIsIDQsIDB4MDgsIH0sCi0JeyAiaGlzdF82NV8xMjdieXRlcyIsIDQsIDB4MDksIH0sCi0JeyAiaGlzdF8xMjhfMjU1Ynl0ZXMiLCA0LCAweDBhLCB9LAotCXsgImhpc3RfMjU2XzUxMWJ5dGVzIiwgNCwgMHgwYiwgfSwKLQl7ICJoaXN0XzUxMl8xMDIzYnl0ZXMiLCA0LCAweDBjLCB9LAotCXsgImhpc3RfMTAyNF9tYXhfYnl0ZXMiLCA0LCAweDBkLCB9LAotfTsKLQotc3RhdGljIHZvaWQKLW12ODhlNjEzMV9nZXRfc3RyaW5ncyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1aW50OF90ICpkYXRhKQotewotCW12ODhlNnh4eF9nZXRfc3RyaW5ncyhkcywgQVJSQVlfU0laRShtdjg4ZTYxMzFfaHdfc3RhdHMpLAotCQkJICAgICAgbXY4OGU2MTMxX2h3X3N0YXRzLCBwb3J0LCBkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQKLW12ODhlNjEzMV9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCi0JCQkJICBpbnQgcG9ydCwgdWludDY0X3QgKmRhdGEpCi17Ci0JbXY4OGU2eHh4X2dldF9ldGh0b29sX3N0YXRzKGRzLCBBUlJBWV9TSVpFKG12ODhlNjEzMV9od19zdGF0cyksCi0JCQkJICAgIG12ODhlNjEzMV9od19zdGF0cywgcG9ydCwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgbXY4OGU2MTMxX2dldF9zc2V0X2NvdW50KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKLXsKLQlyZXR1cm4gQVJSQVlfU0laRShtdjg4ZTYxMzFfaHdfc3RhdHMpOwotfQotCiBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgbXY4OGU2MTMxX3N3aXRjaF9kcml2ZXIgPSB7CiAJLnRhZ19wcm90b2NvbAkJPSBEU0FfVEFHX1BST1RPX0RTQSwKIAkucHJpdl9zaXplCQk9IHNpemVvZihzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUpLApAQCAtMzk2LDkgKzMwOCw5IEBACiAJLnBoeV9yZWFkCQk9IG12ODhlNjEzMV9waHlfcmVhZCwKIAkucGh5X3dyaXRlCQk9IG12ODhlNjEzMV9waHlfd3JpdGUsCiAJLnBvbGxfbGluawkJPSBtdjg4ZTZ4eHhfcG9sbF9saW5rLAotCS5nZXRfc3RyaW5ncwkJPSBtdjg4ZTYxMzFfZ2V0X3N0cmluZ3MsCi0JLmdldF9ldGh0b29sX3N0YXRzCT0gbXY4OGU2MTMxX2dldF9ldGh0b29sX3N0YXRzLAotCS5nZXRfc3NldF9jb3VudAkJPSBtdjg4ZTYxMzFfZ2V0X3NzZXRfY291bnQsCisJLmdldF9zdHJpbmdzCQk9IG12ODhlNnh4eF9nZXRfc3RyaW5ncywKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBtdjg4ZTZ4eHhfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9zc2V0X2NvdW50CQk9IG12ODhlNnh4eF9nZXRfc3NldF9jb3VudCwKIH07CiAKIE1PRFVMRV9BTElBUygicGxhdGZvcm06bXY4OGU2MDg1Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MTcxLmMgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MTcxLmMKaW5kZXggYWEzM2QxNi4uOTEwNGVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL212ODhlNjE3MS5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYxNzEuYwpAQCAtMjUsNjkgKzI1LDI3IEBACiAJaWYgKGJ1cyA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldCA9IF9fbXY4OGU2eHh4X3JlZ19yZWFkKGJ1cywgc3dfYWRkciwgUkVHX1BPUlQoMCksIDB4MDMpOworCXJldCA9IF9fbXY4OGU2eHh4X3JlZ19yZWFkKGJ1cywgc3dfYWRkciwgUkVHX1BPUlQoMCksIFBPUlRfU1dJVENIX0lEKTsKIAlpZiAocmV0ID49IDApIHsKLQkJaWYgKChyZXQgJiAweGZmZjApID09IDB4MTcxMCkKKwkJaWYgKChyZXQgJiAweGZmZjApID09IFBPUlRfU1dJVENIX0lEXzYxNzEpCiAJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjE3MSI7Ci0JCWlmICgocmV0ICYgMHhmZmYwKSA9PSAweDE3MjApCisJCWlmICgocmV0ICYgMHhmZmYwKSA9PSBQT1JUX1NXSVRDSF9JRF82MTcyKQogCQkJcmV0dXJuICJNYXJ2ZWxsIDg4RTYxNzIiOwogCX0KIAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IG12ODhlNjE3MV9zd2l0Y2hfcmVzZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQotewotCWludCBpOwotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCi0JLyogU2V0IGFsbCBwb3J0cyB0byB0aGUgZGlzYWJsZWQgc3RhdGUuICovCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotCQlyZXQgPSBSRUdfUkVBRChSRUdfUE9SVChpKSwgMHgwNCk7Ci0JCVJFR19XUklURShSRUdfUE9SVChpKSwgMHgwNCwgcmV0ICYgMHhmZmZjKTsKLQl9Ci0KLQkvKiBXYWl0IGZvciB0cmFuc21pdCBxdWV1ZXMgdG8gZHJhaW4uICovCi0JdXNsZWVwX3JhbmdlKDIwMDAsIDQwMDApOwotCi0JLyogUmVzZXQgdGhlIHN3aXRjaC4gKi8KLQlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgwNCwgMHhjNDAwKTsKLQotCS8qIFdhaXQgdXAgdG8gb25lIHNlY29uZCBmb3IgcmVzZXQgdG8gY29tcGxldGUuICovCi0JdGltZW91dCA9IGppZmZpZXMgKyAxICogSFo7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCXJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwsIDB4MDApOwotCQlpZiAoKHJldCAmIDB4YzgwMCkgPT0gMHhjODAwKQotCQkJYnJlYWs7Ci0KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwotCX0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0KLQkvKiBFbmFibGUgcG9ydHMgbm90IHVuZGVyIERTQSwgZS5nLiBXQU4gcG9ydCAqLwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYgKGRzYV9pc19jcHVfcG9ydChkcywgaSkgfHwgZHMtPnBoeXNfcG9ydF9tYXNrICYgKDEgPDwgaSkpCi0JCQljb250aW51ZTsKLQotCQlyZXQgPSBSRUdfUkVBRChSRUdfUE9SVChpKSwgMHgwNCk7Ci0JCVJFR19XUklURShSRUdfUE9SVChpKSwgMHgwNCwgcmV0IHwgMHgwMyk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgbXY4OGU2MTcxX3NldHVwX2dsb2JhbChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOwogCWludCByZXQ7CiAJaW50IGk7CiAKLQkvKiBEaXNhYmxlIHRoZSBQSFkgcG9sbGluZyB1bml0IChzaW5jZSB0aGVyZSB3b24ndCBiZSBhbnkKLQkgKiBleHRlcm5hbCBQSFlzIHRvIHBvbGwpLCBkb24ndCBkaXNjYXJkIHBhY2tldHMgd2l0aAotCSAqIGV4Y2Vzc2l2ZSBjb2xsaXNpb25zLCBhbmQgbWFzayBhbGwgaW50ZXJydXB0IHNvdXJjZXMuCisJLyogRGlzY2FyZCBwYWNrZXRzIHdpdGggZXhjZXNzaXZlIGNvbGxpc2lvbnMsIG1hc2sgYWxsCisJICogaW50ZXJydXB0IHNvdXJjZXMsIGVuYWJsZSBQUFUuCiAJICovCi0JUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MDQsIDB4MDAwMCk7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MDQsIDB4NjAwMCk7CiAKIAkvKiBTZXQgdGhlIGRlZmF1bHQgYWRkcmVzcyBhZ2luZyB0aW1lIHRvIDUgbWludXRlcywgYW5kCiAJICogZW5hYmxlIGFkZHJlc3MgbGVhcm4gbWVzc2FnZXMgdG8gYmUgc2VudCB0byBhbGwgbWVzc2FnZQpAQCAtMTQ1LDcgKzEwMyw3IEBACiAJfQogCiAJLyogQ2xlYXIgYWxsIHRydW5rIG1hc2tzLiAqLwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJZm9yIChpID0gMDsgaSA8IHBzLT5udW1fcG9ydHM7IGkrKykKIAkJUkVHX1dSSVRFKFJFR19HTE9CQUwyLCAweDA3LCAweDgwMDAgfCAoaSA8PCAxMikgfCAweGZmKTsKIAogCS8qIENsZWFyIGFsbCB0cnVuayBtYXBwaW5ncy4gKi8KQEAgLTIxOSwyOCArMTc3LDYgQEAKIAkJdmFsIHw9IDB4MDAwYzsKIAlSRUdfV1JJVEUoYWRkciwgMHgwNCwgdmFsKTsKIAotCS8qIFBvcnQgQ29udHJvbCAxOiBkaXNhYmxlIHRydW5raW5nLiAgQWxzbywgaWYgdGhpcyBpcyB0aGUKLQkgKiBDUFUgcG9ydCwgZW5hYmxlIGxlYXJuIG1lc3NhZ2VzIHRvIGJlIHNlbnQgdG8gdGhpcyBwb3J0LgotCSAqLwotCVJFR19XUklURShhZGRyLCAweDA1LCBkc2FfaXNfY3B1X3BvcnQoZHMsIHApID8gMHg4MDAwIDogMHgwMDAwKTsKLQotCS8qIFBvcnQgYmFzZWQgVkxBTiBtYXA6IGdpdmUgZWFjaCBwb3J0IGl0cyBvd24gYWRkcmVzcwotCSAqIGRhdGFiYXNlLCBhbGxvdyB0aGUgQ1BVIHBvcnQgdG8gdGFsayB0byBlYWNoIG9mIHRoZSAncmVhbCcKLQkgKiBwb3J0cywgYW5kIGFsbG93IGVhY2ggb2YgdGhlICdyZWFsJyBwb3J0cyB0byBvbmx5IHRhbGsgdG8KLQkgKiB0aGUgdXBzdHJlYW0gcG9ydC4KLQkgKi8KLQl2YWwgPSAocCAmIDB4ZikgPDwgMTI7Ci0JaWYgKGRzYV9pc19jcHVfcG9ydChkcywgcCkpCi0JCXZhbCB8PSBkcy0+cGh5c19wb3J0X21hc2s7Ci0JZWxzZQotCQl2YWwgfD0gMSA8PCBkc2FfdXBzdHJlYW1fcG9ydChkcyk7Ci0JUkVHX1dSSVRFKGFkZHIsIDB4MDYsIHZhbCk7Ci0KLQkvKiBEZWZhdWx0IFZMQU4gSUQgYW5kIHByaW9yaXR5OiBkb24ndCBzZXQgYSBkZWZhdWx0IFZMQU4KLQkgKiBJRCwgYW5kIHNldCB0aGUgZGVmYXVsdCBwYWNrZXQgcHJpb3JpdHkgdG8gemVyby4KLQkgKi8KLQlSRUdfV1JJVEUoYWRkciwgMHgwNywgMHgwMDAwKTsKLQogCS8qIFBvcnQgQ29udHJvbCAyOiBkb24ndCBmb3JjZSBhIGdvb2QgRkNTLCBzZXQgdGhlIG1heGltdW0KIAkgKiBmcmFtZSBzaXplIHRvIDEwMjQwIGJ5dGVzLCBkb24ndCBsZXQgdGhlIHN3aXRjaCBhZGQgb3IKIAkgKiBzdHJpcCA4MDIuMXEgdGFncywgZG9uJ3QgZGlzY2FyZCB0YWdnZWQgb3IgdW50YWdnZWQgZnJhbWVzCkBAIC0yODUsMTkgKzIyMSwyMiBAQAogCSAqLwogCVJFR19XUklURShhZGRyLCAweDE5LCAweDc2NTQpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIG12ODhlNnh4eF9zZXR1cF9wb3J0X2NvbW1vbihkcywgcCk7CiB9CiAKIHN0YXRpYyBpbnQgbXY4OGU2MTcxX3NldHVwKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gKHZvaWQgKikoZHMgKyAxKTsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CiAJaW50IGk7CiAJaW50IHJldDsKIAotCW11dGV4X2luaXQoJnBzLT5zbWlfbXV0ZXgpOwotCW11dGV4X2luaXQoJnBzLT5zdGF0c19tdXRleCk7CisJcmV0ID0gbXY4OGU2eHh4X3NldHVwX2NvbW1vbihkcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBtdjg4ZTYxNzFfc3dpdGNoX3Jlc2V0KGRzKTsKKwlwcy0+bnVtX3BvcnRzID0gNzsKKworCXJldCA9IG12ODhlNnh4eF9zd2l0Y2hfcmVzZXQoZHMsIHRydWUpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zMDcsNyArMjQ2LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgcHMtPm51bV9wb3J0czsgaSsrKSB7CiAJCWlmICghKGRzYV9pc19jcHVfcG9ydChkcywgaSkgfHwgZHMtPnBoeXNfcG9ydF9tYXNrICYgKDEgPDwgaSkpKQogCQkJY29udGludWU7CiAKQEAgLTMxNiw5NiArMjU1LDI5IEBACiAJCQlyZXR1cm4gcmV0OwogCX0KIAotCW11dGV4X2luaXQoJnBzLT5waHlfbXV0ZXgpOwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2MTcxX3BvcnRfdG9fcGh5X2FkZHIoaW50IHBvcnQpCi17Ci0JaWYgKHBvcnQgPj0gMCAmJiBwb3J0IDw9IDQpCi0JCXJldHVybiBwb3J0OwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludAotbXY4OGU2MTcxX3BoeV9yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGludCByZWdudW0pCitzdGF0aWMgaW50IG12ODhlNjE3MV9nZXRfZWVlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkgICAgIHN0cnVjdCBldGh0b29sX2VlZSAqZSkKIHsKIAlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7Ci0JaW50IGFkZHIgPSBtdjg4ZTYxNzFfcG9ydF90b19waHlfYWRkcihwb3J0KTsKLQlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmcHMtPnBoeV9tdXRleCk7Ci0JcmV0ID0gbXY4OGU2eHh4X3BoeV9yZWFkKGRzLCBhZGRyLCByZWdudW0pOwotCW11dGV4X3VubG9jaygmcHMtPnBoeV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKKwlpZiAocHMtPmlkID09IFBPUlRfU1dJVENIX0lEXzYxNzIpCisJCXJldHVybiBtdjg4ZTZ4eHhfZ2V0X2VlZShkcywgcG9ydCwgZSk7CisKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKLXN0YXRpYyBpbnQKLW12ODhlNjE3MV9waHlfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAotCQkgICAgaW50IHBvcnQsIGludCByZWdudW0sIHUxNiB2YWwpCitzdGF0aWMgaW50IG12ODhlNjE3MV9zZXRfZWVlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkgICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYsIHN0cnVjdCBldGh0b29sX2VlZSAqZSkKIHsKIAlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7Ci0JaW50IGFkZHIgPSBtdjg4ZTYxNzFfcG9ydF90b19waHlfYWRkcihwb3J0KTsKLQlpbnQgcmV0OwogCi0JbXV0ZXhfbG9jaygmcHMtPnBoeV9tdXRleCk7Ci0JcmV0ID0gbXY4OGU2eHh4X3BoeV93cml0ZShkcywgYWRkciwgcmVnbnVtLCB2YWwpOwotCW11dGV4X3VubG9jaygmcHMtPnBoeV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KKwlpZiAocHMtPmlkID09IFBPUlRfU1dJVENIX0lEXzYxNzIpCisJCXJldHVybiBtdjg4ZTZ4eHhfc2V0X2VlZShkcywgcG9ydCwgcGh5ZGV2LCBlKTsKIAotc3RhdGljIHN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCBtdjg4ZTYxNzFfaHdfc3RhdHNbXSA9IHsKLQl7ICJpbl9nb29kX29jdGV0cyIsIDgsIDB4MDAsIH0sCi0JeyAiaW5fYmFkX29jdGV0cyIsIDQsIDB4MDIsIH0sCi0JeyAiaW5fdW5pY2FzdCIsIDQsIDB4MDQsIH0sCi0JeyAiaW5fYnJvYWRjYXN0cyIsIDQsIDB4MDYsIH0sCi0JeyAiaW5fbXVsdGljYXN0cyIsIDQsIDB4MDcsIH0sCi0JeyAiaW5fcGF1c2UiLCA0LCAweDE2LCB9LAotCXsgImluX3VuZGVyc2l6ZSIsIDQsIDB4MTgsIH0sCi0JeyAiaW5fZnJhZ21lbnRzIiwgNCwgMHgxOSwgfSwKLQl7ICJpbl9vdmVyc2l6ZSIsIDQsIDB4MWEsIH0sCi0JeyAiaW5famFiYmVyIiwgNCwgMHgxYiwgfSwKLQl7ICJpbl9yeF9lcnJvciIsIDQsIDB4MWMsIH0sCi0JeyAiaW5fZmNzX2Vycm9yIiwgNCwgMHgxZCwgfSwKLQl7ICJvdXRfb2N0ZXRzIiwgOCwgMHgwZSwgfSwKLQl7ICJvdXRfdW5pY2FzdCIsIDQsIDB4MTAsIH0sCi0JeyAib3V0X2Jyb2FkY2FzdHMiLCA0LCAweDEzLCB9LAotCXsgIm91dF9tdWx0aWNhc3RzIiwgNCwgMHgxMiwgfSwKLQl7ICJvdXRfcGF1c2UiLCA0LCAweDE1LCB9LAotCXsgImV4Y2Vzc2l2ZSIsIDQsIDB4MTEsIH0sCi0JeyAiY29sbGlzaW9ucyIsIDQsIDB4MWUsIH0sCi0JeyAiZGVmZXJyZWQiLCA0LCAweDA1LCB9LAotCXsgInNpbmdsZSIsIDQsIDB4MTQsIH0sCi0JeyAibXVsdGlwbGUiLCA0LCAweDE3LCB9LAotCXsgIm91dF9mY3NfZXJyb3IiLCA0LCAweDAzLCB9LAotCXsgImxhdGUiLCA0LCAweDFmLCB9LAotCXsgImhpc3RfNjRieXRlcyIsIDQsIDB4MDgsIH0sCi0JeyAiaGlzdF82NV8xMjdieXRlcyIsIDQsIDB4MDksIH0sCi0JeyAiaGlzdF8xMjhfMjU1Ynl0ZXMiLCA0LCAweDBhLCB9LAotCXsgImhpc3RfMjU2XzUxMWJ5dGVzIiwgNCwgMHgwYiwgfSwKLQl7ICJoaXN0XzUxMl8xMDIzYnl0ZXMiLCA0LCAweDBjLCB9LAotCXsgImhpc3RfMTAyNF9tYXhfYnl0ZXMiLCA0LCAweDBkLCB9LAotfTsKLQotc3RhdGljIHZvaWQKLW12ODhlNjE3MV9nZXRfc3RyaW5ncyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1aW50OF90ICpkYXRhKQotewotCW12ODhlNnh4eF9nZXRfc3RyaW5ncyhkcywgQVJSQVlfU0laRShtdjg4ZTYxNzFfaHdfc3RhdHMpLAotCQkJICAgICAgbXY4OGU2MTcxX2h3X3N0YXRzLCBwb3J0LCBkYXRhKTsKLX0KLQotc3RhdGljIHZvaWQKLW12ODhlNjE3MV9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCi0JCQkgICAgaW50IHBvcnQsIHVpbnQ2NF90ICpkYXRhKQotewotCW12ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cyhkcywgQVJSQVlfU0laRShtdjg4ZTYxNzFfaHdfc3RhdHMpLAotCQkJCSAgICBtdjg4ZTYxNzFfaHdfc3RhdHMsIHBvcnQsIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IG12ODhlNjE3MV9nZXRfc3NldF9jb3VudChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCi17Ci0JcmV0dXJuIEFSUkFZX1NJWkUobXY4OGU2MTcxX2h3X3N0YXRzKTsKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKIHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciBtdjg4ZTYxNzFfc3dpdGNoX2RyaXZlciA9IHsKQEAgLTQxNCwxNyArMjg2LDI1IEBACiAJLnByb2JlCQkJPSBtdjg4ZTYxNzFfcHJvYmUsCiAJLnNldHVwCQkJPSBtdjg4ZTYxNzFfc2V0dXAsCiAJLnNldF9hZGRyCQk9IG12ODhlNnh4eF9zZXRfYWRkcl9pbmRpcmVjdCwKLQkucGh5X3JlYWQJCT0gbXY4OGU2MTcxX3BoeV9yZWFkLAotCS5waHlfd3JpdGUJCT0gbXY4OGU2MTcxX3BoeV93cml0ZSwKKwkucGh5X3JlYWQJCT0gbXY4OGU2eHh4X3BoeV9yZWFkX2luZGlyZWN0LAorCS5waHlfd3JpdGUJCT0gbXY4OGU2eHh4X3BoeV93cml0ZV9pbmRpcmVjdCwKIAkucG9sbF9saW5rCQk9IG12ODhlNnh4eF9wb2xsX2xpbmssCi0JLmdldF9zdHJpbmdzCQk9IG12ODhlNjE3MV9nZXRfc3RyaW5ncywKLQkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBtdjg4ZTYxNzFfZ2V0X2V0aHRvb2xfc3RhdHMsCi0JLmdldF9zc2V0X2NvdW50CQk9IG12ODhlNjE3MV9nZXRfc3NldF9jb3VudCwKKwkuZ2V0X3N0cmluZ3MJCT0gbXY4OGU2eHh4X2dldF9zdHJpbmdzLAorCS5nZXRfZXRodG9vbF9zdGF0cwk9IG12ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3NzZXRfY291bnQJCT0gbXY4OGU2eHh4X2dldF9zc2V0X2NvdW50LAorCS5zZXRfZWVlCQk9IG12ODhlNjE3MV9zZXRfZWVlLAorCS5nZXRfZWVlCQk9IG12ODhlNjE3MV9nZXRfZWVlLAogI2lmZGVmIENPTkZJR19ORVRfRFNBX0hXTU9OCiAJLmdldF90ZW1wICAgICAgICAgICAgICAgPSBtdjg4ZTZ4eHhfZ2V0X3RlbXAsCiAjZW5kaWYKIAkuZ2V0X3JlZ3NfbGVuCQk9IG12ODhlNnh4eF9nZXRfcmVnc19sZW4sCiAJLmdldF9yZWdzCQk9IG12ODhlNnh4eF9nZXRfcmVncywKKwkucG9ydF9qb2luX2JyaWRnZSAgICAgICA9IG12ODhlNnh4eF9qb2luX2JyaWRnZSwKKwkucG9ydF9sZWF2ZV9icmlkZ2UgICAgICA9IG12ODhlNnh4eF9sZWF2ZV9icmlkZ2UsCisJLnBvcnRfc3RwX3VwZGF0ZSAgICAgICAgPSBtdjg4ZTZ4eHhfcG9ydF9zdHBfdXBkYXRlLAorCS5mZGJfYWRkCQk9IG12ODhlNnh4eF9wb3J0X2ZkYl9hZGQsCisJLmZkYl9kZWwJCT0gbXY4OGU2eHh4X3BvcnRfZmRiX2RlbCwKKwkuZmRiX2dldG5leHQJCT0gbXY4OGU2eHh4X3BvcnRfZmRiX2dldG5leHQsCiB9OwogCiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm12ODhlNjE3MSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZHNhL212ODhlNjM1Mi5jIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNjM1Mi5jCmluZGV4IGUxM2FkYzcuLjEyNmMxMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYzNTIuYworKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MzUyLmMKQEAgLTIyLDU5ICsyMiw2IEBACiAjaW5jbHVkZSA8bmV0L2RzYS5oPgogI2luY2x1ZGUgIm12ODhlNnh4eC5oIgogCi1zdGF0aWMgaW50IG12ODhlNjM1Ml93YWl0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHJlZywgaW50IG9mZnNldCwgdTE2IG1hc2spCi17Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaIC8gMTA7Ci0KLQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKLQkJaW50IHJldDsKLQotCQlyZXQgPSBSRUdfUkVBRChyZWcsIG9mZnNldCk7Ci0JCWlmICghKHJldCAmIG1hc2spKQotCQkJcmV0dXJuIDA7Ci0KLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwotCX0KLQlyZXR1cm4gLUVUSU1FRE9VVDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbXY4OGU2MzUyX3BoeV93YWl0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKLXsKLQlyZXR1cm4gbXY4OGU2MzUyX3dhaXQoZHMsIFJFR19HTE9CQUwyLCAweDE4LCAweDgwMDApOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBtdjg4ZTYzNTJfZWVwcm9tX2xvYWRfd2FpdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCi17Ci0JcmV0dXJuIG12ODhlNjM1Ml93YWl0KGRzLCBSRUdfR0xPQkFMMiwgMHgxNCwgMHgwODAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbXY4OGU2MzUyX2VlcHJvbV9idXN5X3dhaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQotewotCXJldHVybiBtdjg4ZTYzNTJfd2FpdChkcywgUkVHX0dMT0JBTDIsIDB4MTQsIDB4ODAwMCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19tdjg4ZTYzNTJfcGh5X3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZ251bSkKLXsKLQlpbnQgcmV0OwotCi0JUkVHX1dSSVRFKFJFR19HTE9CQUwyLCAweDE4LCAweDk4MDAgfCAoYWRkciA8PCA1KSB8IHJlZ251bSk7Ci0KLQlyZXQgPSBtdjg4ZTYzNTJfcGh5X3dhaXQoZHMpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIFJFR19SRUFEKFJFR19HTE9CQUwyLCAweDE5KTsKLX0KLQotc3RhdGljIGludCBfX212ODhlNjM1Ml9waHlfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZ251bSwKLQkJCQkgdTE2IHZhbCkKLXsKLQlSRUdfV1JJVEUoUkVHX0dMT0JBTDIsIDB4MTksIHZhbCk7Ci0JUkVHX1dSSVRFKFJFR19HTE9CQUwyLCAweDE4LCAweDk0MDAgfCAoYWRkciA8PCA1KSB8IHJlZ251bSk7Ci0KLQlyZXR1cm4gbXY4OGU2MzUyX3BoeV93YWl0KGRzKTsKLX0KLQogc3RhdGljIGNoYXIgKm12ODhlNjM1Ml9wcm9iZShzdHJ1Y3QgZGV2aWNlICpob3N0X2RldiwgaW50IHN3X2FkZHIpCiB7CiAJc3RydWN0IG1paV9idXMgKmJ1cyA9IGRzYV9ob3N0X2Rldl90b19taWlfYnVzKGhvc3RfZGV2KTsKQEAgLTgzLDU4ICszMCwyNCBAQAogCWlmIChidXMgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXQgPSBfX212ODhlNnh4eF9yZWdfcmVhZChidXMsIHN3X2FkZHIsIFJFR19QT1JUKDApLCAweDAzKTsKKwlyZXQgPSBfX212ODhlNnh4eF9yZWdfcmVhZChidXMsIHN3X2FkZHIsIFJFR19QT1JUKDApLCBQT1JUX1NXSVRDSF9JRCk7CiAJaWYgKHJldCA+PSAwKSB7Ci0JCWlmICgocmV0ICYgMHhmZmYwKSA9PSAweDE3NjApCisJCWlmICgocmV0ICYgMHhmZmYwKSA9PSBQT1JUX1NXSVRDSF9JRF82MTc2KQogCQkJcmV0dXJuICJNYXJ2ZWxsIDg4RTYxNzYiOwotCQlpZiAocmV0ID09IDB4MzUyMSkKKwkJaWYgKHJldCA9PSBQT1JUX1NXSVRDSF9JRF82MzUyX0EwKQogCQkJcmV0dXJuICJNYXJ2ZWxsIDg4RTYzNTIgKEEwKSI7Ci0JCWlmIChyZXQgPT0gMHgzNTIyKQorCQlpZiAocmV0ID09IFBPUlRfU1dJVENIX0lEXzYzNTJfQTEpCiAJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjM1MiAoQTEpIjsKLQkJaWYgKChyZXQgJiAweGZmZjApID09IDB4MzUyMCkKKwkJaWYgKChyZXQgJiAweGZmZjApID09IFBPUlRfU1dJVENIX0lEXzYzNTIpCiAJCQlyZXR1cm4gIk1hcnZlbGwgODhFNjM1MiI7CiAJfQogCiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2MzUyX3N3aXRjaF9yZXNldChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCi17Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCByZXQ7Ci0JaW50IGk7Ci0KLQkvKiBTZXQgYWxsIHBvcnRzIHRvIHRoZSBkaXNhYmxlZCBzdGF0ZS4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7Ci0JCXJldCA9IFJFR19SRUFEKFJFR19QT1JUKGkpLCAweDA0KTsKLQkJUkVHX1dSSVRFKFJFR19QT1JUKGkpLCAweDA0LCByZXQgJiAweGZmZmMpOwotCX0KLQotCS8qIFdhaXQgZm9yIHRyYW5zbWl0IHF1ZXVlcyB0byBkcmFpbi4gKi8KLQl1c2xlZXBfcmFuZ2UoMjAwMCwgNDAwMCk7Ci0KLQkvKiBSZXNldCB0aGUgc3dpdGNoLiBLZWVwIFBQVSBhY3RpdmUgKGJpdCAxNCwgdW5kb2N1bWVudGVkKS4KLQkgKiBUaGUgUFBVIG5lZWRzIHRvIGJlIGFjdGl2ZSB0byBzdXBwb3J0IGluZGlyZWN0IHBoeSByZWdpc3RlcgotCSAqIGFjY2Vzc2VzIHRocm91Z2ggZ2xvYmFsIHJlZ2lzdGVycyAweDE4IGFuZCAweDE5LgotCSAqLwotCVJFR19XUklURShSRUdfR0xPQkFMLCAweDA0LCAweGMwMDApOwotCi0JLyogV2FpdCB1cCB0byBvbmUgc2Vjb25kIGZvciByZXNldCB0byBjb21wbGV0ZS4gKi8KLQl0aW1lb3V0ID0gamlmZmllcyArIDEgKiBIWjsKLQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKLQkJcmV0ID0gUkVHX1JFQUQoUkVHX0dMT0JBTCwgMHgwMCk7Ci0JCWlmICgocmV0ICYgMHg4ODAwKSA9PSAweDg4MDApCi0JCQlicmVhazsKLQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwotCX0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBtdjg4ZTYzNTJfc2V0dXBfZ2xvYmFsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CiAJaW50IHJldDsKIAlpbnQgaTsKIApAQCAtMjA1LDcgKzExOCw3IEBACiAJLyogRGlzYWJsZSBpbmdyZXNzIHJhdGUgbGltaXRpbmcgYnkgcmVzZXR0aW5nIGFsbCBpbmdyZXNzCiAJICogcmF0ZSBsaW1pdCByZWdpc3RlcnMgdG8gdGhlaXIgaW5pdGlhbCBzdGF0ZS4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBwcy0+bnVtX3BvcnRzOyBpKyspCiAJCVJFR19XUklURShSRUdfR0xPQkFMMiwgMHgwOSwgMHg5MDAwIHwgKGkgPDwgOCkpOwogCiAJLyogSW5pdGlhbGlzZSBjcm9zcy1jaGlwIHBvcnQgVkxBTiB0YWJsZSB0byByZXNldCBkZWZhdWx0cy4gKi8KQEAgLTI2OCwyOCArMTgxLDYgQEAKIAkJdmFsIHw9IDB4MDAwYzsKIAlSRUdfV1JJVEUoYWRkciwgMHgwNCwgdmFsKTsKIAotCS8qIFBvcnQgQ29udHJvbCAxOiBkaXNhYmxlIHRydW5raW5nLiAgQWxzbywgaWYgdGhpcyBpcyB0aGUKLQkgKiBDUFUgcG9ydCwgZW5hYmxlIGxlYXJuIG1lc3NhZ2VzIHRvIGJlIHNlbnQgdG8gdGhpcyBwb3J0LgotCSAqLwotCVJFR19XUklURShhZGRyLCAweDA1LCBkc2FfaXNfY3B1X3BvcnQoZHMsIHApID8gMHg4MDAwIDogMHgwMDAwKTsKLQotCS8qIFBvcnQgYmFzZWQgVkxBTiBtYXA6IGdpdmUgZWFjaCBwb3J0IGl0cyBvd24gYWRkcmVzcwotCSAqIGRhdGFiYXNlLCBhbGxvdyB0aGUgQ1BVIHBvcnQgdG8gdGFsayB0byBlYWNoIG9mIHRoZSAncmVhbCcKLQkgKiBwb3J0cywgYW5kIGFsbG93IGVhY2ggb2YgdGhlICdyZWFsJyBwb3J0cyB0byBvbmx5IHRhbGsgdG8KLQkgKiB0aGUgdXBzdHJlYW0gcG9ydC4KLQkgKi8KLQl2YWwgPSAocCAmIDB4ZikgPDwgMTI7Ci0JaWYgKGRzYV9pc19jcHVfcG9ydChkcywgcCkpCi0JCXZhbCB8PSBkcy0+cGh5c19wb3J0X21hc2s7Ci0JZWxzZQotCQl2YWwgfD0gMSA8PCBkc2FfdXBzdHJlYW1fcG9ydChkcyk7Ci0JUkVHX1dSSVRFKGFkZHIsIDB4MDYsIHZhbCk7Ci0KLQkvKiBEZWZhdWx0IFZMQU4gSUQgYW5kIHByaW9yaXR5OiBkb24ndCBzZXQgYSBkZWZhdWx0IFZMQU4KLQkgKiBJRCwgYW5kIHNldCB0aGUgZGVmYXVsdCBwYWNrZXQgcHJpb3JpdHkgdG8gemVyby4KLQkgKi8KLQlSRUdfV1JJVEUoYWRkciwgMHgwNywgMHgwMDAwKTsKLQogCS8qIFBvcnQgQ29udHJvbCAyOiBkb24ndCBmb3JjZSBhIGdvb2QgRkNTLCBzZXQgdGhlIG1heGltdW0KIAkgKiBmcmFtZSBzaXplIHRvIDEwMjQwIGJ5dGVzLCBkb24ndCBsZXQgdGhlIHN3aXRjaCBhZGQgb3IKIAkgKiBzdHJpcCA4MDIuMXEgdGFncywgZG9uJ3QgZGlzY2FyZCB0YWdnZWQgb3IgdW50YWdnZWQgZnJhbWVzCkBAIC0zMzQsNTMgKzIyNSwxOCBAQAogCSAqLwogCVJFR19XUklURShhZGRyLCAweDE5LCAweDc2NTQpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIG12ODhlNnh4eF9zZXR1cF9wb3J0X2NvbW1vbihkcywgcCk7CiB9CiAKICNpZmRlZiBDT05GSUdfTkVUX0RTQV9IV01PTgogCi1zdGF0aWMgaW50IG12ODhlNjM1Ml9waHlfcGFnZV9yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKLQkJCQkgICBpbnQgcG9ydCwgaW50IHBhZ2UsIGludCByZWcpCi17Ci0Jc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZwcy0+cGh5X211dGV4KTsKLQlyZXQgPSBfX212ODhlNjM1Ml9waHlfd3JpdGUoZHMsIHBvcnQsIDB4MTYsIHBhZ2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCXJldCA9IF9fbXY4OGU2MzUyX3BoeV9yZWFkKGRzLCBwb3J0LCByZWcpOwotZXJyb3I6Ci0JX19tdjg4ZTYzNTJfcGh5X3dyaXRlKGRzLCBwb3J0LCAweDE2LCAweDApOwotCW11dGV4X3VubG9jaygmcHMtPnBoeV9tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtdjg4ZTYzNTJfcGh5X3BhZ2Vfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAotCQkJCSAgICBpbnQgcG9ydCwgaW50IHBhZ2UsIGludCByZWcsIGludCB2YWwpCi17Ci0Jc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZwcy0+cGh5X211dGV4KTsKLQlyZXQgPSBfX212ODhlNjM1Ml9waHlfd3JpdGUoZHMsIHBvcnQsIDB4MTYsIHBhZ2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JcmV0ID0gX19tdjg4ZTYzNTJfcGh5X3dyaXRlKGRzLCBwb3J0LCByZWcsIHZhbCk7Ci1lcnJvcjoKLQlfX212ODhlNjM1Ml9waHlfd3JpdGUoZHMsIHBvcnQsIDB4MTYsIDB4MCk7Ci0JbXV0ZXhfdW5sb2NrKCZwcy0+cGh5X211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IG12ODhlNjM1Ml9nZXRfdGVtcChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCAqdGVtcCkKIHsKIAlpbnQgcmV0OwogCiAJKnRlbXAgPSAwOwogCi0JcmV0ID0gbXY4OGU2MzUyX3BoeV9wYWdlX3JlYWQoZHMsIDAsIDYsIDI3KTsKKwlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3BhZ2VfcmVhZChkcywgMCwgNiwgMjcpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zOTUsNyArMjUxLDcgQEAKIAogCSp0ZW1wID0gMDsKIAotCXJldCA9IG12ODhlNjM1Ml9waHlfcGFnZV9yZWFkKGRzLCAwLCA2LCAyNik7CisJcmV0ID0gbXY4OGU2eHh4X3BoeV9wYWdlX3JlYWQoZHMsIDAsIDYsIDI2KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNDA4LDExICsyNjQsMTEgQEAKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gbXY4OGU2MzUyX3BoeV9wYWdlX3JlYWQoZHMsIDAsIDYsIDI2KTsKKwlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3BhZ2VfcmVhZChkcywgMCwgNiwgMjYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCXRlbXAgPSBjbGFtcF92YWwoRElWX1JPVU5EX0NMT1NFU1QodGVtcCwgNSkgKyA1LCAwLCAweDFmKTsKLQlyZXR1cm4gbXY4OGU2MzUyX3BoeV9wYWdlX3dyaXRlKGRzLCAwLCA2LCAyNiwKKwlyZXR1cm4gbXY4OGU2eHh4X3BoeV9wYWdlX3dyaXRlKGRzLCAwLCA2LCAyNiwKIAkJCQkJKHJldCAmIDB4ZTBmZikgfCAodGVtcCA8PCA4KSk7CiB9CiAKQEAgLTQyMiw3ICsyNzgsNyBAQAogCiAJKmFsYXJtID0gZmFsc2U7CiAKLQlyZXQgPSBtdjg4ZTYzNTJfcGh5X3BhZ2VfcmVhZChkcywgMCwgNiwgMjYpOworCXJldCA9IG12ODhlNnh4eF9waHlfcGFnZV9yZWFkKGRzLCAwLCA2LCAyNik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTQzOCwxNCArMjk0LDE1IEBACiAJaW50IHJldDsKIAlpbnQgaTsKIAotCW11dGV4X2luaXQoJnBzLT5zbWlfbXV0ZXgpOwotCW11dGV4X2luaXQoJnBzLT5zdGF0c19tdXRleCk7Ci0JbXV0ZXhfaW5pdCgmcHMtPnBoeV9tdXRleCk7CisJcmV0ID0gbXY4OGU2eHh4X3NldHVwX2NvbW1vbihkcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlwcy0+bnVtX3BvcnRzID0gNzsKKwogCW11dGV4X2luaXQoJnBzLT5lZXByb21fbXV0ZXgpOwogCi0JcHMtPmlkID0gUkVHX1JFQUQoUkVHX1BPUlQoMCksIDB4MDMpICYgMHhmZmYwOwotCi0JcmV0ID0gbXY4OGU2MzUyX3N3aXRjaF9yZXNldChkcyk7CisJcmV0ID0gbXY4OGU2eHh4X3N3aXRjaF9yZXNldChkcywgdHJ1ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTQ1NSw3ICszMTIsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JZm9yIChpID0gMDsgaSA8IDc7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBwcy0+bnVtX3BvcnRzOyBpKyspIHsKIAkJcmV0ID0gbXY4OGU2MzUyX3NldHVwX3BvcnQoZHMsIGkpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CkBAIC00NjQsODMgKzMyMSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXY4OGU2MzUyX3BvcnRfdG9fcGh5X2FkZHIoaW50IHBvcnQpCi17Ci0JaWYgKHBvcnQgPj0gMCAmJiBwb3J0IDw9IDQpCi0JCXJldHVybiBwb3J0OwotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50Ci1tdjg4ZTYzNTJfcGh5X3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgaW50IHJlZ251bSkKLXsKLQlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7Ci0JaW50IGFkZHIgPSBtdjg4ZTYzNTJfcG9ydF90b19waHlfYWRkcihwb3J0KTsKLQlpbnQgcmV0OwotCi0JaWYgKGFkZHIgPCAwKQotCQlyZXR1cm4gYWRkcjsKLQotCW11dGV4X2xvY2soJnBzLT5waHlfbXV0ZXgpOwotCXJldCA9IF9fbXY4OGU2MzUyX3BoeV9yZWFkKGRzLCBhZGRyLCByZWdudW0pOwotCW11dGV4X3VubG9jaygmcHMtPnBoeV9tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci1tdjg4ZTYzNTJfcGh5X3dyaXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGludCByZWdudW0sIHUxNiB2YWwpCi17Ci0Jc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOwotCWludCBhZGRyID0gbXY4OGU2MzUyX3BvcnRfdG9fcGh5X2FkZHIocG9ydCk7Ci0JaW50IHJldDsKLQotCWlmIChhZGRyIDwgMCkKLQkJcmV0dXJuIGFkZHI7Ci0KLQltdXRleF9sb2NrKCZwcy0+cGh5X211dGV4KTsKLQlyZXQgPSBfX212ODhlNjM1Ml9waHlfd3JpdGUoZHMsIGFkZHIsIHJlZ251bSwgdmFsKTsKLQltdXRleF91bmxvY2soJnBzLT5waHlfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCBtdjg4ZTYzNTJfaHdfc3RhdHNbXSA9IHsKLQl7ICJpbl9nb29kX29jdGV0cyIsIDgsIDB4MDAsIH0sCi0JeyAiaW5fYmFkX29jdGV0cyIsIDQsIDB4MDIsIH0sCi0JeyAiaW5fdW5pY2FzdCIsIDQsIDB4MDQsIH0sCi0JeyAiaW5fYnJvYWRjYXN0cyIsIDQsIDB4MDYsIH0sCi0JeyAiaW5fbXVsdGljYXN0cyIsIDQsIDB4MDcsIH0sCi0JeyAiaW5fcGF1c2UiLCA0LCAweDE2LCB9LAotCXsgImluX3VuZGVyc2l6ZSIsIDQsIDB4MTgsIH0sCi0JeyAiaW5fZnJhZ21lbnRzIiwgNCwgMHgxOSwgfSwKLQl7ICJpbl9vdmVyc2l6ZSIsIDQsIDB4MWEsIH0sCi0JeyAiaW5famFiYmVyIiwgNCwgMHgxYiwgfSwKLQl7ICJpbl9yeF9lcnJvciIsIDQsIDB4MWMsIH0sCi0JeyAiaW5fZmNzX2Vycm9yIiwgNCwgMHgxZCwgfSwKLQl7ICJvdXRfb2N0ZXRzIiwgOCwgMHgwZSwgfSwKLQl7ICJvdXRfdW5pY2FzdCIsIDQsIDB4MTAsIH0sCi0JeyAib3V0X2Jyb2FkY2FzdHMiLCA0LCAweDEzLCB9LAotCXsgIm91dF9tdWx0aWNhc3RzIiwgNCwgMHgxMiwgfSwKLQl7ICJvdXRfcGF1c2UiLCA0LCAweDE1LCB9LAotCXsgImV4Y2Vzc2l2ZSIsIDQsIDB4MTEsIH0sCi0JeyAiY29sbGlzaW9ucyIsIDQsIDB4MWUsIH0sCi0JeyAiZGVmZXJyZWQiLCA0LCAweDA1LCB9LAotCXsgInNpbmdsZSIsIDQsIDB4MTQsIH0sCi0JeyAibXVsdGlwbGUiLCA0LCAweDE3LCB9LAotCXsgIm91dF9mY3NfZXJyb3IiLCA0LCAweDAzLCB9LAotCXsgImxhdGUiLCA0LCAweDFmLCB9LAotCXsgImhpc3RfNjRieXRlcyIsIDQsIDB4MDgsIH0sCi0JeyAiaGlzdF82NV8xMjdieXRlcyIsIDQsIDB4MDksIH0sCi0JeyAiaGlzdF8xMjhfMjU1Ynl0ZXMiLCA0LCAweDBhLCB9LAotCXsgImhpc3RfMjU2XzUxMWJ5dGVzIiwgNCwgMHgwYiwgfSwKLQl7ICJoaXN0XzUxMl8xMDIzYnl0ZXMiLCA0LCAweDBjLCB9LAotCXsgImhpc3RfMTAyNF9tYXhfYnl0ZXMiLCA0LCAweDBkLCB9LAotCXsgInN3X2luX2Rpc2NhcmRzIiwgNCwgMHgxMTAsIH0sCi0JeyAic3dfaW5fZmlsdGVyZWQiLCAyLCAweDExMiwgfSwKLQl7ICJzd19vdXRfZmlsdGVyZWQiLCAyLCAweDExMywgfSwKLX07Ci0KIHN0YXRpYyBpbnQgbXY4OGU2MzUyX3JlYWRfZWVwcm9tX3dvcmQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkcikKIHsKIAlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CkBAIC01NTMsNyArMzMzLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAotCXJldCA9IG12ODhlNjM1Ml9lZXByb21fYnVzeV93YWl0KGRzKTsKKwlyZXQgPSBtdjg4ZTZ4eHhfZWVwcm9tX2J1c3lfd2FpdChkcyk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTU3Niw3ICszNTYsNyBAQAogCiAJZWVwcm9tLT5tYWdpYyA9IDB4YzNlYzQ5NTE7CiAKLQlyZXQgPSBtdjg4ZTYzNTJfZWVwcm9tX2xvYWRfd2FpdChkcyk7CisJcmV0ID0gbXY4OGU2eHh4X2VlcHJvbV9sb2FkX3dhaXQoZHMpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC02NTcsNyArNDM3LDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAotCXJldCA9IG12ODhlNjM1Ml9lZXByb21fYnVzeV93YWl0KGRzKTsKKwlyZXQgPSBtdjg4ZTZ4eHhfZWVwcm9tX2J1c3lfd2FpdChkcyk7CiBlcnJvcjoKIAltdXRleF91bmxvY2soJnBzLT5lZXByb21fbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC02ODEsNyArNDYxLDcgQEAKIAlsZW4gPSBlZXByb20tPmxlbjsKIAllZXByb20tPmxlbiA9IDA7CiAKLQlyZXQgPSBtdjg4ZTYzNTJfZWVwcm9tX2xvYWRfd2FpdChkcyk7CisJcmV0ID0gbXY4OGU2eHh4X2VlcHJvbV9sb2FkX3dhaXQoZHMpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC03MzksMzcgKzUxOSwyMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZAotbXY4OGU2MzUyX2dldF9zdHJpbmdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHVpbnQ4X3QgKmRhdGEpCi17Ci0JbXY4OGU2eHh4X2dldF9zdHJpbmdzKGRzLCBBUlJBWV9TSVpFKG12ODhlNjM1Ml9od19zdGF0cyksCi0JCQkgICAgICBtdjg4ZTYzNTJfaHdfc3RhdHMsIHBvcnQsIGRhdGEpOwotfQotCi1zdGF0aWMgdm9pZAotbXY4OGU2MzUyX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHVpbnQ2NF90ICpkYXRhKQotewotCW12ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cyhkcywgQVJSQVlfU0laRShtdjg4ZTYzNTJfaHdfc3RhdHMpLAotCQkJCSAgICBtdjg4ZTYzNTJfaHdfc3RhdHMsIHBvcnQsIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IG12ODhlNjM1Ml9nZXRfc3NldF9jb3VudChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCi17Ci0JcmV0dXJuIEFSUkFZX1NJWkUobXY4OGU2MzUyX2h3X3N0YXRzKTsKLX0KLQogc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIG12ODhlNjM1Ml9zd2l0Y2hfZHJpdmVyID0gewogCS50YWdfcHJvdG9jb2wJCT0gRFNBX1RBR19QUk9UT19FRFNBLAogCS5wcml2X3NpemUJCT0gc2l6ZW9mKHN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSksCiAJLnByb2JlCQkJPSBtdjg4ZTYzNTJfcHJvYmUsCiAJLnNldHVwCQkJPSBtdjg4ZTYzNTJfc2V0dXAsCiAJLnNldF9hZGRyCQk9IG12ODhlNnh4eF9zZXRfYWRkcl9pbmRpcmVjdCwKLQkucGh5X3JlYWQJCT0gbXY4OGU2MzUyX3BoeV9yZWFkLAotCS5waHlfd3JpdGUJCT0gbXY4OGU2MzUyX3BoeV93cml0ZSwKKwkucGh5X3JlYWQJCT0gbXY4OGU2eHh4X3BoeV9yZWFkX2luZGlyZWN0LAorCS5waHlfd3JpdGUJCT0gbXY4OGU2eHh4X3BoeV93cml0ZV9pbmRpcmVjdCwKIAkucG9sbF9saW5rCQk9IG12ODhlNnh4eF9wb2xsX2xpbmssCi0JLmdldF9zdHJpbmdzCQk9IG12ODhlNjM1Ml9nZXRfc3RyaW5ncywKLQkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBtdjg4ZTYzNTJfZ2V0X2V0aHRvb2xfc3RhdHMsCi0JLmdldF9zc2V0X2NvdW50CQk9IG12ODhlNjM1Ml9nZXRfc3NldF9jb3VudCwKKwkuZ2V0X3N0cmluZ3MJCT0gbXY4OGU2eHh4X2dldF9zdHJpbmdzLAorCS5nZXRfZXRodG9vbF9zdGF0cwk9IG12ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cywKKwkuZ2V0X3NzZXRfY291bnQJCT0gbXY4OGU2eHh4X2dldF9zc2V0X2NvdW50LAorCS5zZXRfZWVlCQk9IG12ODhlNnh4eF9zZXRfZWVlLAorCS5nZXRfZWVlCQk9IG12ODhlNnh4eF9nZXRfZWVlLAogI2lmZGVmIENPTkZJR19ORVRfRFNBX0hXTU9OCiAJLmdldF90ZW1wCQk9IG12ODhlNjM1Ml9nZXRfdGVtcCwKIAkuZ2V0X3RlbXBfbGltaXQJCT0gbXY4OGU2MzUyX2dldF90ZW1wX2xpbWl0LApAQCAtNzgwLDYgKzU0MywxMiBAQAogCS5zZXRfZWVwcm9tCQk9IG12ODhlNjM1Ml9zZXRfZWVwcm9tLAogCS5nZXRfcmVnc19sZW4JCT0gbXY4OGU2eHh4X2dldF9yZWdzX2xlbiwKIAkuZ2V0X3JlZ3MJCT0gbXY4OGU2eHh4X2dldF9yZWdzLAorCS5wb3J0X2pvaW5fYnJpZGdlCT0gbXY4OGU2eHh4X2pvaW5fYnJpZGdlLAorCS5wb3J0X2xlYXZlX2JyaWRnZQk9IG12ODhlNnh4eF9sZWF2ZV9icmlkZ2UsCisJLnBvcnRfc3RwX3VwZGF0ZQk9IG12ODhlNnh4eF9wb3J0X3N0cF91cGRhdGUsCisJLmZkYl9hZGQJCT0gbXY4OGU2eHh4X3BvcnRfZmRiX2FkZCwKKwkuZmRiX2RlbAkJPSBtdjg4ZTZ4eHhfcG9ydF9mZGJfZGVsLAorCS5mZGJfZ2V0bmV4dAkJPSBtdjg4ZTZ4eHhfcG9ydF9mZGJfZ2V0bmV4dCwKIH07CiAKIE1PRFVMRV9BTElBUygicGxhdGZvcm06bXY4OGU2MzUyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4LmMgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4LmMKaW5kZXggM2U3ZTMxYS4uZmM4ZDNiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHguYwpAQCAtOSw2ICs5LDggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zMSwxMSArMzMsMTEgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCXJldCA9IG1kaW9idXNfcmVhZChidXMsIHN3X2FkZHIsIDApOworCQlyZXQgPSBtZGlvYnVzX3JlYWQoYnVzLCBzd19hZGRyLCBTTUlfQ01EKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCWlmICgocmV0ICYgMHg4MDAwKSA9PSAwKQorCQlpZiAoKHJldCAmIFNNSV9DTURfQlVTWSkgPT0gMCkKIAkJCXJldHVybiAwOwogCX0KIApAQCAtNTUsNyArNTcsOCBAQAogCQlyZXR1cm4gcmV0OwogCiAJLyogVHJhbnNtaXQgdGhlIHJlYWQgY29tbWFuZC4gKi8KLQlyZXQgPSBtZGlvYnVzX3dyaXRlKGJ1cywgc3dfYWRkciwgMCwgMHg5ODAwIHwgKGFkZHIgPDwgNSkgfCByZWcpOworCXJldCA9IG1kaW9idXNfd3JpdGUoYnVzLCBzd19hZGRyLCBTTUlfQ01ELAorCQkJICAgIFNNSV9DTURfT1BfMjJfUkVBRCB8IChhZGRyIDw8IDUpIHwgcmVnKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNjUsMjYgKzY4LDIzIEBACiAJCXJldHVybiByZXQ7CiAKIAkvKiBSZWFkIHRoZSBkYXRhLiAqLwotCXJldCA9IG1kaW9idXNfcmVhZChidXMsIHN3X2FkZHIsIDEpOworCXJldCA9IG1kaW9idXNfcmVhZChidXMsIHN3X2FkZHIsIFNNSV9EQVRBKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCXJldHVybiByZXQgJiAweGZmZmY7CiB9CiAKLWludCBtdjg4ZTZ4eHhfcmVnX3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZykKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggU01JIG11dGV4IGhlbGQgKi8KK3N0YXRpYyBpbnQgX212ODhlNnh4eF9yZWdfcmVhZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKIAlzdHJ1Y3QgbWlpX2J1cyAqYnVzID0gZHNhX2hvc3RfZGV2X3RvX21paV9idXMoZHMtPm1hc3Rlcl9kZXYpOwogCWludCByZXQ7CiAKIAlpZiAoYnVzID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbXV0ZXhfbG9jaygmcHMtPnNtaV9tdXRleCk7CiAJcmV0ID0gX19tdjg4ZTZ4eHhfcmVnX3JlYWQoYnVzLCBkcy0+cGQtPnN3X2FkZHIsIGFkZHIsIHJlZyk7Ci0JbXV0ZXhfdW5sb2NrKCZwcy0+c21pX211dGV4KTsKLQogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC05NCw2ICs5NCwxOCBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBtdjg4ZTZ4eHhfcmVnX3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnBzLT5zbWlfbXV0ZXgpOworCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoZHMsIGFkZHIsIHJlZyk7CisJbXV0ZXhfdW5sb2NrKCZwcy0+c21pX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKIGludCBfX212ODhlNnh4eF9yZWdfd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHN3X2FkZHIsIGludCBhZGRyLAogCQkJICBpbnQgcmVnLCB1MTYgdmFsKQogewpAQCAtMTA4LDEyICsxMjAsMTMgQEAKIAkJcmV0dXJuIHJldDsKIAogCS8qIFRyYW5zbWl0IHRoZSBkYXRhIHRvIHdyaXRlLiAqLwotCXJldCA9IG1kaW9idXNfd3JpdGUoYnVzLCBzd19hZGRyLCAxLCB2YWwpOworCXJldCA9IG1kaW9idXNfd3JpdGUoYnVzLCBzd19hZGRyLCBTTUlfREFUQSwgdmFsKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCS8qIFRyYW5zbWl0IHRoZSB3cml0ZSBjb21tYW5kLiAqLwotCXJldCA9IG1kaW9idXNfd3JpdGUoYnVzLCBzd19hZGRyLCAwLCAweDk0MDAgfCAoYWRkciA8PCA1KSB8IHJlZyk7CisJcmV0ID0gbWRpb2J1c193cml0ZShidXMsIHN3X2FkZHIsIFNNSV9DTUQsCisJCQkgICAgU01JX0NNRF9PUF8yMl9XUklURSB8IChhZGRyIDw8IDUpIHwgcmVnKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTI1LDExICsxMzgsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG12ODhlNnh4eF9yZWdfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCkKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggU01JIG11dGV4IGhlbGQgKi8KK3N0YXRpYyBpbnQgX212ODhlNnh4eF9yZWdfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZywKKwkJCQl1MTYgdmFsKQogewotCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKIAlzdHJ1Y3QgbWlpX2J1cyAqYnVzID0gZHNhX2hvc3RfZGV2X3RvX21paV9idXMoZHMtPm1hc3Rlcl9kZXYpOwotCWludCByZXQ7CiAKIAlpZiAoYnVzID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTM3LDggKzE1MCwxNiBAQAogCWRldl9kYmcoZHMtPm1hc3Rlcl9kZXYsICItPiBhZGRyOiAweCUuMnggcmVnOiAweCUuMnggdmFsOiAweCUuNHhcbiIsCiAJCWFkZHIsIHJlZywgdmFsKTsKIAorCXJldHVybiBfX212ODhlNnh4eF9yZWdfd3JpdGUoYnVzLCBkcy0+cGQtPnN3X2FkZHIsIGFkZHIsIHJlZywgdmFsKTsKK30KKworaW50IG12ODhlNnh4eF9yZWdfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZywgdTE2IHZhbCkKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CisJaW50IHJldDsKKwogCW11dGV4X2xvY2soJnBzLT5zbWlfbXV0ZXgpOwotCXJldCA9IF9fbXY4OGU2eHh4X3JlZ193cml0ZShidXMsIGRzLT5wZC0+c3dfYWRkciwgYWRkciwgcmVnLCB2YWwpOworCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGRzLCBhZGRyLCByZWcsIHZhbCk7CiAJbXV0ZXhfdW5sb2NrKCZwcy0+c21pX211dGV4KTsKIAogCXJldHVybiByZXQ7CkBAIC0xNDcsMjYgKzE2OCwyNiBAQAogaW50IG12ODhlNnh4eF9jb25maWdfcHJpbyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCiB7CiAJLyogQ29uZmlndXJlIHRoZSBJUCBUb1MgbWFwcGluZyByZWdpc3RlcnMuICovCi0JUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTAsIDB4MDAwMCk7Ci0JUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTEsIDB4MDAwMCk7Ci0JUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTIsIDB4NTU1NSk7Ci0JUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTMsIDB4NTU1NSk7Ci0JUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTQsIDB4YWFhYSk7Ci0JUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTUsIDB4YWFhYSk7Ci0JUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTYsIDB4ZmZmZik7Ci0JUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MTcsIDB4ZmZmZik7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIEdMT0JBTF9JUF9QUklfMCwgMHgwMDAwKTsKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgR0xPQkFMX0lQX1BSSV8xLCAweDAwMDApOworCVJFR19XUklURShSRUdfR0xPQkFMLCBHTE9CQUxfSVBfUFJJXzIsIDB4NTU1NSk7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIEdMT0JBTF9JUF9QUklfMywgMHg1NTU1KTsKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgR0xPQkFMX0lQX1BSSV80LCAweGFhYWEpOworCVJFR19XUklURShSRUdfR0xPQkFMLCBHTE9CQUxfSVBfUFJJXzUsIDB4YWFhYSk7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwsIEdMT0JBTF9JUF9QUklfNiwgMHhmZmZmKTsKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgR0xPQkFMX0lQX1BSSV83LCAweGZmZmYpOwogCiAJLyogQ29uZmlndXJlIHRoZSBJRUVFIDgwMi4xcCBwcmlvcml0eSBtYXBwaW5nIHJlZ2lzdGVyLiAqLwotCVJFR19XUklURShSRUdfR0xPQkFMLCAweDE4LCAweGZhNDEpOworCVJFR19XUklURShSRUdfR0xPQkFMLCBHTE9CQUxfSUVFRV9QUkksIDB4ZmE0MSk7CiAKIAlyZXR1cm4gMDsKIH0KIAogaW50IG12ODhlNnh4eF9zZXRfYWRkcl9kaXJlY3Qoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCB1OCAqYWRkcikKIHsKLQlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgwMSwgKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdKTsKLQlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgwMiwgKGFkZHJbMl0gPDwgOCkgfCBhZGRyWzNdKTsKLQlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgMHgwMywgKGFkZHJbNF0gPDwgOCkgfCBhZGRyWzVdKTsKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgR0xPQkFMX01BQ18wMSwgKGFkZHJbMF0gPDwgOCkgfCBhZGRyWzFdKTsKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgR0xPQkFMX01BQ18yMywgKGFkZHJbMl0gPDwgOCkgfCBhZGRyWzNdKTsKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgR0xPQkFMX01BQ180NSwgKGFkZHJbNF0gPDwgOCkgfCBhZGRyWzVdKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTgwLDEyICsyMDEsMTMgQEAKIAkJaW50IGo7CiAKIAkJLyogV3JpdGUgdGhlIE1BQyBhZGRyZXNzIGJ5dGUuICovCi0JCVJFR19XUklURShSRUdfR0xPQkFMMiwgMHgwZCwgMHg4MDAwIHwgKGkgPDwgOCkgfCBhZGRyW2ldKTsKKwkJUkVHX1dSSVRFKFJFR19HTE9CQUwyLCBHTE9CQUwyX1NXSVRDSF9NQUMsCisJCQkgIEdMT0JBTDJfU1dJVENIX01BQ19CVVNZIHwgKGkgPDwgOCkgfCBhZGRyW2ldKTsKIAogCQkvKiBXYWl0IGZvciB0aGUgd3JpdGUgdG8gY29tcGxldGUuICovCiAJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7Ci0JCQlyZXQgPSBSRUdfUkVBRChSRUdfR0xPQkFMMiwgMHgwZCk7Ci0JCQlpZiAoKHJldCAmIDB4ODAwMCkgPT0gMCkKKwkJCXJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwyLCBHTE9CQUwyX1NXSVRDSF9NQUMpOworCQkJaWYgKChyZXQgJiBHTE9CQUwyX1NXSVRDSF9NQUNfQlVTWSkgPT0gMCkKIAkJCQlicmVhazsKIAkJfQogCQlpZiAoaiA9PSAxNikKQEAgLTE5NSwxNCArMjE3LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBtdjg4ZTZ4eHhfcGh5X3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZ251bSkKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggcGh5IG11dGV4IGhlbGQgKi8KK3N0YXRpYyBpbnQgX212ODhlNnh4eF9waHlfcmVhZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnbnVtKQogewogCWlmIChhZGRyID49IDApCiAJCXJldHVybiBtdjg4ZTZ4eHhfcmVnX3JlYWQoZHMsIGFkZHIsIHJlZ251bSk7CiAJcmV0dXJuIDB4ZmZmZjsKIH0KIAotaW50IG12ODhlNnh4eF9waHlfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZ251bSwgdTE2IHZhbCkKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggcGh5IG11dGV4IGhlbGQgKi8KK3N0YXRpYyBpbnQgX212ODhlNnh4eF9waHlfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZ251bSwKKwkJCQl1MTYgdmFsKQogewogCWlmIChhZGRyID49IDApCiAJCXJldHVybiBtdjg4ZTZ4eHhfcmVnX3dyaXRlKGRzLCBhZGRyLCByZWdudW0sIHZhbCk7CkBAIC0yMTUsMTQgKzI0MCwxNiBAQAogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCi0JcmV0ID0gUkVHX1JFQUQoUkVHX0dMT0JBTCwgMHgwNCk7Ci0JUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MDQsIHJldCAmIH4weDQwMDApOworCXJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwsIEdMT0JBTF9DT05UUk9MKTsKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgR0xPQkFMX0NPTlRST0wsCisJCSAgcmV0ICYgfkdMT0JBTF9DT05UUk9MX1BQVV9FTkFCTEUpOwogCiAJdGltZW91dCA9IGppZmZpZXMgKyAxICogSFo7CiAJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7Ci0JCXJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwsIDB4MDApOworCQlyZXQgPSBSRUdfUkVBRChSRUdfR0xPQkFMLCBHTE9CQUxfU1RBVFVTKTsKIAkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwotCQlpZiAoKHJldCAmIDB4YzAwMCkgIT0gMHhjMDAwKQorCQlpZiAoKHJldCAmIEdMT0JBTF9TVEFUVVNfUFBVX01BU0spICE9CisJCSAgICBHTE9CQUxfU1RBVFVTX1BQVV9QT0xMSU5HKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMzQsMTQgKzI2MSwxNSBAQAogCWludCByZXQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCi0JcmV0ID0gUkVHX1JFQUQoUkVHX0dMT0JBTCwgMHgwNCk7Ci0JUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MDQsIHJldCB8IDB4NDAwMCk7CisJcmV0ID0gUkVHX1JFQUQoUkVHX0dMT0JBTCwgR0xPQkFMX0NPTlRST0wpOworCVJFR19XUklURShSRUdfR0xPQkFMLCBHTE9CQUxfQ09OVFJPTCwgcmV0IHwgR0xPQkFMX0NPTlRST0xfUFBVX0VOQUJMRSk7CiAKIAl0aW1lb3V0ID0gamlmZmllcyArIDEgKiBIWjsKIAl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKLQkJcmV0ID0gUkVHX1JFQUQoUkVHX0dMT0JBTCwgMHgwMCk7CisJCXJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwsIEdMT0JBTF9TVEFUVVMpOwogCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0JCWlmICgocmV0ICYgMHhjMDAwKSA9PSAweGMwMDApCisJCWlmICgocmV0ICYgR0xPQkFMX1NUQVRVU19QUFVfTUFTSykgPT0KKwkJICAgIEdMT0JBTF9TVEFUVVNfUFBVX1BPTExJTkcpCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM2MiwxMSArMzkwLDEyIEBACiAKIAkJbGluayA9IDA7CiAJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7Ci0JCQlwb3J0X3N0YXR1cyA9IG12ODhlNnh4eF9yZWdfcmVhZChkcywgUkVHX1BPUlQoaSksIDB4MDApOworCQkJcG9ydF9zdGF0dXMgPSBtdjg4ZTZ4eHhfcmVnX3JlYWQoZHMsIFJFR19QT1JUKGkpLAorCQkJCQkJCSBQT1JUX1NUQVRVUyk7CiAJCQlpZiAocG9ydF9zdGF0dXMgPCAwKQogCQkJCWNvbnRpbnVlOwogCi0JCQlsaW5rID0gISEocG9ydF9zdGF0dXMgJiAweDA4MDApOworCQkJbGluayA9ICEhKHBvcnRfc3RhdHVzICYgUE9SVF9TVEFUVVNfTElOSyk7CiAJCX0KIAogCQlpZiAoIWxpbmspIHsKQEAgLTM3NywyMiArNDA2LDIyIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCXN3aXRjaCAocG9ydF9zdGF0dXMgJiAweDAzMDApIHsKLQkJY2FzZSAweDAwMDA6CisJCXN3aXRjaCAocG9ydF9zdGF0dXMgJiBQT1JUX1NUQVRVU19TUEVFRF9NQVNLKSB7CisJCWNhc2UgUE9SVF9TVEFUVVNfU1BFRURfMTA6CiAJCQlzcGVlZCA9IDEwOwogCQkJYnJlYWs7Ci0JCWNhc2UgMHgwMTAwOgorCQljYXNlIFBPUlRfU1RBVFVTX1NQRUVEXzEwMDoKIAkJCXNwZWVkID0gMTAwOwogCQkJYnJlYWs7Ci0JCWNhc2UgMHgwMjAwOgorCQljYXNlIFBPUlRfU1RBVFVTX1NQRUVEXzEwMDA6CiAJCQlzcGVlZCA9IDEwMDA7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXNwZWVkID0gLTE7CiAJCQlicmVhazsKIAkJfQotCQlkdXBsZXggPSAocG9ydF9zdGF0dXMgJiAweDA0MDApID8gMSA6IDA7Ci0JCWZjID0gKHBvcnRfc3RhdHVzICYgMHg4MDAwKSA/IDEgOiAwOworCQlkdXBsZXggPSAocG9ydF9zdGF0dXMgJiBQT1JUX1NUQVRVU19EVVBMRVgpID8gMSA6IDA7CisJCWZjID0gKHBvcnRfc3RhdHVzICYgUE9SVF9TVEFUVVNfUEFVU0VfRU4pID8gMSA6IDA7CiAKIAkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKIAkJCW5ldGRldl9pbmZvKGRldiwKQEAgLTQwNSwxNCArNDM0LDI3IEBACiAJfQogfQogCitzdGF0aWMgYm9vbCBtdjg4ZTZ4eHhfNjM1Ml9mYW1pbHkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKworCXN3aXRjaCAocHMtPmlkKSB7CisJY2FzZSBQT1JUX1NXSVRDSF9JRF82MzUyOgorCWNhc2UgUE9SVF9TV0lUQ0hfSURfNjE3MjoKKwljYXNlIFBPUlRfU1dJVENIX0lEXzYxNzY6CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBpbnQgbXY4OGU2eHh4X3N0YXRzX3dhaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQogewogCWludCByZXQ7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotCQlyZXQgPSBSRUdfUkVBRChSRUdfR0xPQkFMLCAweDFkKTsKLQkJaWYgKChyZXQgJiAweDgwMDApID09IDApCisJCXJldCA9IFJFR19SRUFEKFJFR19HTE9CQUwsIEdMT0JBTF9TVEFUU19PUCk7CisJCWlmICgocmV0ICYgR0xPQkFMX1NUQVRTX09QX0JVU1kpID09IDApCiAJCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTQyMyw4ICs0NjUsMTMgQEAKIHsKIAlpbnQgcmV0OwogCisJaWYgKG12ODhlNnh4eF82MzUyX2ZhbWlseShkcykpCisJCXBvcnQgPSAocG9ydCArIDEpIDw8IDU7CisKIAkvKiBTbmFwc2hvdCB0aGUgaGFyZHdhcmUgc3RhdGlzdGljcyBjb3VudGVycyBmb3IgdGhpcyBwb3J0LiAqLwotCVJFR19XUklURShSRUdfR0xPQkFMLCAweDFkLCAweGRjMDAgfCBwb3J0KTsKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTCwgR0xPQkFMX1NUQVRTX09QLAorCQkgIEdMT0JBTF9TVEFUU19PUF9DQVBUVVJFX1BPUlQgfAorCQkgIEdMT0JBTF9TVEFUU19PUF9ISVNUX1JYX1RYIHwgcG9ydCk7CiAKIAkvKiBXYWl0IGZvciB0aGUgc25hcHNob3R0aW5nIHRvIGNvbXBsZXRlLiAqLwogCXJldCA9IG12ODhlNnh4eF9zdGF0c193YWl0KGRzKTsKQEAgLTQ0MSw3ICs0ODgsOSBAQAogCiAJKnZhbCA9IDA7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfcmVnX3dyaXRlKGRzLCBSRUdfR0xPQkFMLCAweDFkLCAweGNjMDAgfCBzdGF0KTsKKwlyZXQgPSBtdjg4ZTZ4eHhfcmVnX3dyaXRlKGRzLCBSRUdfR0xPQkFMLCBHTE9CQUxfU1RBVFNfT1AsCisJCQkJICBHTE9CQUxfU1RBVFNfT1BfUkVBRF9DQVBUVVJFRCB8CisJCQkJICBHTE9CQUxfU1RBVFNfT1BfSElTVF9SWF9UWCB8IHN0YXQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm47CiAKQEAgLTQ0OSwyMiArNDk4LDc3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybjsKIAotCXJldCA9IG12ODhlNnh4eF9yZWdfcmVhZChkcywgUkVHX0dMT0JBTCwgMHgxZSk7CisJcmV0ID0gbXY4OGU2eHh4X3JlZ19yZWFkKGRzLCBSRUdfR0xPQkFMLCBHTE9CQUxfU1RBVFNfQ09VTlRFUl8zMik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybjsKIAogCV92YWwgPSByZXQgPDwgMTY7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfcmVnX3JlYWQoZHMsIFJFR19HTE9CQUwsIDB4MWYpOworCXJldCA9IG12ODhlNnh4eF9yZWdfcmVhZChkcywgUkVHX0dMT0JBTCwgR0xPQkFMX1NUQVRTX0NPVU5URVJfMDEpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm47CiAKIAkqdmFsID0gX3ZhbCB8IHJldDsKIH0KIAotdm9pZCBtdjg4ZTZ4eHhfZ2V0X3N0cmluZ3Moc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAotCQkJICAgaW50IG5yX3N0YXRzLCBzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgKnN0YXRzLAotCQkJICAgaW50IHBvcnQsIHVpbnQ4X3QgKmRhdGEpCitzdGF0aWMgc3RydWN0IG12ODhlNnh4eF9od19zdGF0IG12ODhlNnh4eF9od19zdGF0c1tdID0geworCXsgImluX2dvb2Rfb2N0ZXRzIiwgOCwgMHgwMCwgfSwKKwl7ICJpbl9iYWRfb2N0ZXRzIiwgNCwgMHgwMiwgfSwKKwl7ICJpbl91bmljYXN0IiwgNCwgMHgwNCwgfSwKKwl7ICJpbl9icm9hZGNhc3RzIiwgNCwgMHgwNiwgfSwKKwl7ICJpbl9tdWx0aWNhc3RzIiwgNCwgMHgwNywgfSwKKwl7ICJpbl9wYXVzZSIsIDQsIDB4MTYsIH0sCisJeyAiaW5fdW5kZXJzaXplIiwgNCwgMHgxOCwgfSwKKwl7ICJpbl9mcmFnbWVudHMiLCA0LCAweDE5LCB9LAorCXsgImluX292ZXJzaXplIiwgNCwgMHgxYSwgfSwKKwl7ICJpbl9qYWJiZXIiLCA0LCAweDFiLCB9LAorCXsgImluX3J4X2Vycm9yIiwgNCwgMHgxYywgfSwKKwl7ICJpbl9mY3NfZXJyb3IiLCA0LCAweDFkLCB9LAorCXsgIm91dF9vY3RldHMiLCA4LCAweDBlLCB9LAorCXsgIm91dF91bmljYXN0IiwgNCwgMHgxMCwgfSwKKwl7ICJvdXRfYnJvYWRjYXN0cyIsIDQsIDB4MTMsIH0sCisJeyAib3V0X211bHRpY2FzdHMiLCA0LCAweDEyLCB9LAorCXsgIm91dF9wYXVzZSIsIDQsIDB4MTUsIH0sCisJeyAiZXhjZXNzaXZlIiwgNCwgMHgxMSwgfSwKKwl7ICJjb2xsaXNpb25zIiwgNCwgMHgxZSwgfSwKKwl7ICJkZWZlcnJlZCIsIDQsIDB4MDUsIH0sCisJeyAic2luZ2xlIiwgNCwgMHgxNCwgfSwKKwl7ICJtdWx0aXBsZSIsIDQsIDB4MTcsIH0sCisJeyAib3V0X2Zjc19lcnJvciIsIDQsIDB4MDMsIH0sCisJeyAibGF0ZSIsIDQsIDB4MWYsIH0sCisJeyAiaGlzdF82NGJ5dGVzIiwgNCwgMHgwOCwgfSwKKwl7ICJoaXN0XzY1XzEyN2J5dGVzIiwgNCwgMHgwOSwgfSwKKwl7ICJoaXN0XzEyOF8yNTVieXRlcyIsIDQsIDB4MGEsIH0sCisJeyAiaGlzdF8yNTZfNTExYnl0ZXMiLCA0LCAweDBiLCB9LAorCXsgImhpc3RfNTEyXzEwMjNieXRlcyIsIDQsIDB4MGMsIH0sCisJeyAiaGlzdF8xMDI0X21heF9ieXRlcyIsIDQsIDB4MGQsIH0sCisJLyogTm90IGFsbCBkZXZpY2VzIGhhdmUgdGhlIGZvbGxvd2luZyBjb3VudGVycyAqLworCXsgInN3X2luX2Rpc2NhcmRzIiwgNCwgMHgxMTAsIH0sCisJeyAic3dfaW5fZmlsdGVyZWQiLCAyLCAweDExMiwgfSwKKwl7ICJzd19vdXRfZmlsdGVyZWQiLCAyLCAweDExMywgfSwKKworfTsKKworc3RhdGljIGJvb2wgaGF2ZV9zd19pbl9kaXNjYXJkcyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOworCisJc3dpdGNoIChwcy0+aWQpIHsKKwljYXNlIFBPUlRfU1dJVENIX0lEXzYwOTU6IGNhc2UgUE9SVF9TV0lUQ0hfSURfNjE2MToKKwljYXNlIFBPUlRfU1dJVENIX0lEXzYxNjU6IGNhc2UgUE9SVF9TV0lUQ0hfSURfNjE3MToKKwljYXNlIFBPUlRfU1dJVENIX0lEXzYxNzI6IGNhc2UgUE9SVF9TV0lUQ0hfSURfNjE3NjoKKwljYXNlIFBPUlRfU1dJVENIX0lEXzYxODI6IGNhc2UgUE9SVF9TV0lUQ0hfSURfNjE4NToKKwljYXNlIFBPUlRfU1dJVENIX0lEXzYzNTI6CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9tdjg4ZTZ4eHhfZ2V0X3N0cmluZ3Moc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAorCQkJCSAgIGludCBucl9zdGF0cywKKwkJCQkgICBzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgKnN0YXRzLAorCQkJCSAgIGludCBwb3J0LCB1aW50OF90ICpkYXRhKQogewogCWludCBpOwogCkBAIC00NzQsOSArNTc4LDEwIEBACiAJfQogfQogCi12b2lkIG12ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCi0JCQkJIGludCBucl9zdGF0cywgc3RydWN0IG12ODhlNnh4eF9od19zdGF0ICpzdGF0cywKLQkJCQkgaW50IHBvcnQsIHVpbnQ2NF90ICpkYXRhKQorc3RhdGljIHZvaWQgX212ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCisJCQkJCSBpbnQgbnJfc3RhdHMsCisJCQkJCSBzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgKnN0YXRzLAorCQkJCQkgaW50IHBvcnQsIHVpbnQ2NF90ICpkYXRhKQogewogCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKIAlpbnQgcmV0OwpAQCAtNTI0LDYgKzYyOSwzOSBAQAogCW11dGV4X3VubG9jaygmcHMtPnN0YXRzX211dGV4KTsKIH0KIAorLyogQWxsIHRoZSBzdGF0aXN0aWNzIGluIHRoZSB0YWJsZSAqLwordm9pZAorbXY4OGU2eHh4X2dldF9zdHJpbmdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHVpbnQ4X3QgKmRhdGEpCit7CisJaWYgKGhhdmVfc3dfaW5fZGlzY2FyZHMoZHMpKQorCQlfbXY4OGU2eHh4X2dldF9zdHJpbmdzKGRzLCBBUlJBWV9TSVpFKG12ODhlNnh4eF9od19zdGF0cyksCisJCQkJICAgICAgIG12ODhlNnh4eF9od19zdGF0cywgcG9ydCwgZGF0YSk7CisJZWxzZQorCQlfbXY4OGU2eHh4X2dldF9zdHJpbmdzKGRzLCBBUlJBWV9TSVpFKG12ODhlNnh4eF9od19zdGF0cykgLSAzLAorCQkJCSAgICAgICBtdjg4ZTZ4eHhfaHdfc3RhdHMsIHBvcnQsIGRhdGEpOworfQorCitpbnQgbXY4OGU2eHh4X2dldF9zc2V0X2NvdW50KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlpZiAoaGF2ZV9zd19pbl9kaXNjYXJkcyhkcykpCisJCXJldHVybiBBUlJBWV9TSVpFKG12ODhlNnh4eF9od19zdGF0cyk7CisJcmV0dXJuIEFSUkFZX1NJWkUobXY4OGU2eHh4X2h3X3N0YXRzKSAtIDM7Cit9CisKK3ZvaWQKK212ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCisJCQkgICAgaW50IHBvcnQsIHVpbnQ2NF90ICpkYXRhKQoreworCWlmIChoYXZlX3N3X2luX2Rpc2NhcmRzKGRzKSkKKwkJX212ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cygKKwkJCWRzLCBBUlJBWV9TSVpFKG12ODhlNnh4eF9od19zdGF0cyksCisJCQltdjg4ZTZ4eHhfaHdfc3RhdHMsIHBvcnQsIGRhdGEpOworCWVsc2UKKwkJX212ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cygKKwkJCWRzLCBBUlJBWV9TSVpFKG12ODhlNnh4eF9od19zdGF0cykgLSAzLAorCQkJbXY4OGU2eHh4X2h3X3N0YXRzLCBwb3J0LCBkYXRhKTsKK30KKwogaW50IG12ODhlNnh4eF9nZXRfcmVnc19sZW4oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKIHsKIAlyZXR1cm4gMzIgKiBzaXplb2YodTE2KTsKQEAgLTU2MCw0MiArNjk4LDc1NCBAQAogCiAJbXV0ZXhfbG9jaygmcHMtPnBoeV9tdXRleCk7CiAKLQlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3dyaXRlKGRzLCAweDAsIDB4MTYsIDB4Nik7CisJcmV0ID0gX212ODhlNnh4eF9waHlfd3JpdGUoZHMsIDB4MCwgMHgxNiwgMHg2KTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAogCS8qIEVuYWJsZSB0ZW1wZXJhdHVyZSBzZW5zb3IgKi8KLQlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3JlYWQoZHMsIDB4MCwgMHgxYSk7CisJcmV0ID0gX212ODhlNnh4eF9waHlfcmVhZChkcywgMHgwLCAweDFhKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAotCXJldCA9IG12ODhlNnh4eF9waHlfd3JpdGUoZHMsIDB4MCwgMHgxYSwgcmV0IHwgKDEgPDwgNSkpOworCXJldCA9IF9tdjg4ZTZ4eHhfcGh5X3dyaXRlKGRzLCAweDAsIDB4MWEsIHJldCB8ICgxIDw8IDUpKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnJvcjsKIAogCS8qIFdhaXQgZm9yIHRlbXBlcmF0dXJlIHRvIHN0YWJpbGl6ZSAqLwogCXVzbGVlcF9yYW5nZSgxMDAwMCwgMTIwMDApOwogCi0JdmFsID0gbXY4OGU2eHh4X3BoeV9yZWFkKGRzLCAweDAsIDB4MWEpOworCXZhbCA9IF9tdjg4ZTZ4eHhfcGh5X3JlYWQoZHMsIDB4MCwgMHgxYSk7CiAJaWYgKHZhbCA8IDApIHsKIAkJcmV0ID0gdmFsOwogCQlnb3RvIGVycm9yOwogCX0KIAogCS8qIERpc2FibGUgdGVtcGVyYXR1cmUgc2Vuc29yICovCi0JcmV0ID0gbXY4OGU2eHh4X3BoeV93cml0ZShkcywgMHgwLCAweDFhLCByZXQgJiB+KDEgPDwgNSkpOworCXJldCA9IF9tdjg4ZTZ4eHhfcGh5X3dyaXRlKGRzLCAweDAsIDB4MWEsIHJldCAmIH4oMSA8PCA1KSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKIAkqdGVtcCA9ICgodmFsICYgMHgxZikgLSA1KSAqIDU7CiAKIGVycm9yOgotCW12ODhlNnh4eF9waHlfd3JpdGUoZHMsIDB4MCwgMHgxNiwgMHgwKTsKKwlfbXY4OGU2eHh4X3BoeV93cml0ZShkcywgMHgwLCAweDE2LCAweDApOwogCW11dGV4X3VubG9jaygmcHMtPnBoeV9tdXRleCk7CiAJcmV0dXJuIHJldDsKIH0KICNlbmRpZiAvKiBDT05GSUdfTkVUX0RTQV9IV01PTiAqLwogCitzdGF0aWMgaW50IG12ODhlNnh4eF93YWl0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHJlZywgaW50IG9mZnNldCwgdTE2IG1hc2spCit7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0ID0gamlmZmllcyArIEhaIC8gMTA7CisKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKKwkJaW50IHJldDsKKworCQlyZXQgPSBSRUdfUkVBRChyZWcsIG9mZnNldCk7CisJCWlmICghKHJldCAmIG1hc2spKQorCQkJcmV0dXJuIDA7CisKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0KKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworaW50IG12ODhlNnh4eF9waHlfd2FpdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCit7CisJcmV0dXJuIG12ODhlNnh4eF93YWl0KGRzLCBSRUdfR0xPQkFMMiwgR0xPQkFMMl9TTUlfT1AsCisJCQkgICAgICBHTE9CQUwyX1NNSV9PUF9CVVNZKTsKK30KKworaW50IG12ODhlNnh4eF9lZXByb21fbG9hZF93YWl0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlyZXR1cm4gbXY4OGU2eHh4X3dhaXQoZHMsIFJFR19HTE9CQUwyLCBHTE9CQUwyX0VFUFJPTV9PUCwKKwkJCSAgICAgIEdMT0JBTDJfRUVQUk9NX09QX0xPQUQpOworfQorCitpbnQgbXY4OGU2eHh4X2VlcHJvbV9idXN5X3dhaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXJldHVybiBtdjg4ZTZ4eHhfd2FpdChkcywgUkVHX0dMT0JBTDIsIEdMT0JBTDJfRUVQUk9NX09QLAorCQkJICAgICAgR0xPQkFMMl9FRVBST01fT1BfQlVTWSk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggU01JIGxvY2sgaGVsZCAqLworc3RhdGljIGludCBfbXY4OGU2eHh4X3dhaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcmVnLCBpbnQgb2Zmc2V0LCB1MTYgbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgSFogLyAxMDsKKworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlpbnQgcmV0OworCisJCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoZHMsIHJlZywgb2Zmc2V0KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAoIShyZXQgJiBtYXNrKSkKKwkJCXJldHVybiAwOworCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwl9CisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggU01JIGxvY2sgaGVsZCAqLworc3RhdGljIGludCBfbXY4OGU2eHh4X2F0dV93YWl0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlyZXR1cm4gX212ODhlNnh4eF93YWl0KGRzLCBSRUdfR0xPQkFMLCBHTE9CQUxfQVRVX09QLAorCQkJICAgICAgIEdMT0JBTF9BVFVfT1BfQlVTWSk7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggcGh5IG11dGV4IGhlbGQgKi8KK3N0YXRpYyBpbnQgX212ODhlNnh4eF9waHlfcmVhZF9pbmRpcmVjdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLAorCQkJCQlpbnQgcmVnbnVtKQoreworCWludCByZXQ7CisKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTDIsIEdMT0JBTDJfU01JX09QLAorCQkgIEdMT0JBTDJfU01JX09QXzIyX1JFQUQgfCAoYWRkciA8PCA1KSB8IHJlZ251bSk7CisKKwlyZXQgPSBtdjg4ZTZ4eHhfcGh5X3dhaXQoZHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIFJFR19SRUFEKFJFR19HTE9CQUwyLCBHTE9CQUwyX1NNSV9EQVRBKTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBwaHkgbXV0ZXggaGVsZCAqLworc3RhdGljIGludCBfbXY4OGU2eHh4X3BoeV93cml0ZV9pbmRpcmVjdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLAorCQkJCQkgaW50IHJlZ251bSwgdTE2IHZhbCkKK3sKKwlSRUdfV1JJVEUoUkVHX0dMT0JBTDIsIEdMT0JBTDJfU01JX0RBVEEsIHZhbCk7CisJUkVHX1dSSVRFKFJFR19HTE9CQUwyLCBHTE9CQUwyX1NNSV9PUCwKKwkJICBHTE9CQUwyX1NNSV9PUF8yMl9XUklURSB8IChhZGRyIDw8IDUpIHwgcmVnbnVtKTsKKworCXJldHVybiBtdjg4ZTZ4eHhfcGh5X3dhaXQoZHMpOworfQorCitpbnQgbXY4OGU2eHh4X2dldF9lZWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgc3RydWN0IGV0aHRvb2xfZWVlICplKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwlpbnQgcmVnOworCisJbXV0ZXhfbG9jaygmcHMtPnBoeV9tdXRleCk7CisKKwlyZWcgPSBfbXY4OGU2eHh4X3BoeV9yZWFkX2luZGlyZWN0KGRzLCBwb3J0LCAxNik7CisJaWYgKHJlZyA8IDApCisJCWdvdG8gb3V0OworCisJZS0+ZWVlX2VuYWJsZWQgPSAhIShyZWcgJiAweDAyMDApOworCWUtPnR4X2xwaV9lbmFibGVkID0gISEocmVnICYgMHgwMTAwKTsKKworCXJlZyA9IG12ODhlNnh4eF9yZWdfcmVhZChkcywgUkVHX1BPUlQocG9ydCksIFBPUlRfU1RBVFVTKTsKKwlpZiAocmVnIDwgMCkKKwkJZ290byBvdXQ7CisKKwllLT5lZWVfYWN0aXZlID0gISEocmVnICYgUE9SVF9TVEFUVVNfRUVFKTsKKwlyZWcgPSAwOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcy0+cGh5X211dGV4KTsKKwlyZXR1cm4gcmVnOworfQorCitpbnQgbXY4OGU2eHh4X3NldF9lZWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJICAgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgc3RydWN0IGV0aHRvb2xfZWVlICplKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwlpbnQgcmVnOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZwcy0+cGh5X211dGV4KTsKKworCXJldCA9IF9tdjg4ZTZ4eHhfcGh5X3JlYWRfaW5kaXJlY3QoZHMsIHBvcnQsIDE2KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZWcgPSByZXQgJiB+MHgwMzAwOworCWlmIChlLT5lZWVfZW5hYmxlZCkKKwkJcmVnIHw9IDB4MDIwMDsKKwlpZiAoZS0+dHhfbHBpX2VuYWJsZWQpCisJCXJlZyB8PSAweDAxMDA7CisKKwlyZXQgPSBfbXY4OGU2eHh4X3BoeV93cml0ZV9pbmRpcmVjdChkcywgcG9ydCwgMTYsIHJlZyk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcy0+cGh5X211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX212ODhlNnh4eF9hdHVfY21kKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IGZpZCwgdTE2IGNtZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoZHMsIFJFR19HTE9CQUwsIDB4MDEsIGZpZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShkcywgUkVHX0dMT0JBTCwgR0xPQkFMX0FUVV9PUCwgY21kKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBfbXY4OGU2eHh4X2F0dV93YWl0KGRzKTsKK30KKworc3RhdGljIGludCBfbXY4OGU2eHh4X2ZsdXNoX2ZpZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBmaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IF9tdjg4ZTZ4eHhfYXR1X3dhaXQoZHMpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIF9tdjg4ZTZ4eHhfYXR1X2NtZChkcywgZmlkLCBHTE9CQUxfQVRVX09QX0ZMVVNIX05PTl9TVEFUSUNfREIpOworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9zZXRfcG9ydF9zdGF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1OCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CisJaW50IHJlZywgcmV0OworCXU4IG9sZHN0YXRlOworCisJbXV0ZXhfbG9jaygmcHMtPnNtaV9tdXRleCk7CisKKwlyZWcgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGRzLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9DT05UUk9MKTsKKwlpZiAocmVnIDwgMCkKKwkJZ290byBhYm9ydDsKKworCW9sZHN0YXRlID0gcmVnICYgUE9SVF9DT05UUk9MX1NUQVRFX01BU0s7CisJaWYgKG9sZHN0YXRlICE9IHN0YXRlKSB7CisJCS8qIEZsdXNoIGZvcndhcmRpbmcgZGF0YWJhc2UgaWYgd2UncmUgbW92aW5nIGEgcG9ydAorCQkgKiBmcm9tIExlYXJuaW5nIG9yIEZvcndhcmRpbmcgc3RhdGUgdG8gRGlzYWJsZWQgb3IKKwkJICogQmxvY2tpbmcgb3IgTGlzdGVuaW5nIHN0YXRlLgorCQkgKi8KKwkJaWYgKG9sZHN0YXRlID49IFBPUlRfQ09OVFJPTF9TVEFURV9MRUFSTklORyAmJgorCQkgICAgc3RhdGUgPD0gUE9SVF9DT05UUk9MX1NUQVRFX0JMT0NLSU5HKSB7CisJCQlyZXQgPSBfbXY4OGU2eHh4X2ZsdXNoX2ZpZChkcywgcHMtPmZpZFtwb3J0XSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gYWJvcnQ7CisJCX0KKwkJcmVnID0gKHJlZyAmIH5QT1JUX0NPTlRST0xfU1RBVEVfTUFTSykgfCBzdGF0ZTsKKwkJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoZHMsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0NPTlRST0wsCisJCQkJCSAgIHJlZyk7CisJfQorCithYm9ydDoKKwltdXRleF91bmxvY2soJnBzLT5zbWlfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE11c3QgYmUgY2FsbGVkIHdpdGggc21pIGxvY2sgaGVsZCAqLworc3RhdGljIGludCBfbXY4OGU2eHh4X3VwZGF0ZV9wb3J0X2NvbmZpZyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwl1OCBmaWQgPSBwcy0+ZmlkW3BvcnRdOworCXUxNiByZWcgPSBmaWQgPDwgMTI7CisKKwlpZiAoZHNhX2lzX2NwdV9wb3J0KGRzLCBwb3J0KSkKKwkJcmVnIHw9IGRzLT5waHlzX3BvcnRfbWFzazsKKwllbHNlCisJCXJlZyB8PSAocHMtPmJyaWRnZV9tYXNrW2ZpZF0gfAorCQkgICAgICAgKDEgPDwgZHNhX3Vwc3RyZWFtX3BvcnQoZHMpKSkgJiB+KDEgPDwgcG9ydCk7CisKKwlyZXR1cm4gX212ODhlNnh4eF9yZWdfd3JpdGUoZHMsIFJFR19QT1JUKHBvcnQpLCBQT1JUX0JBU0VfVkxBTiwgcmVnKTsKK30KKworLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBzbWkgbG9jayBoZWxkICovCitzdGF0aWMgaW50IF9tdjg4ZTZ4eHhfdXBkYXRlX2JyaWRnZV9jb25maWcoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgZmlkKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwlpbnQgcG9ydDsKKwl1MzIgbWFzazsKKwlpbnQgcmV0OworCisJbWFzayA9IGRzLT5waHlzX3BvcnRfbWFzazsKKwl3aGlsZSAobWFzaykgeworCQlwb3J0ID0gX19mZnMobWFzayk7CisJCW1hc2sgJj0gfigxIDw8IHBvcnQpOworCQlpZiAocHMtPmZpZFtwb3J0XSAhPSBmaWQpCisJCQljb250aW51ZTsKKworCQlyZXQgPSBfbXY4OGU2eHh4X3VwZGF0ZV9wb3J0X2NvbmZpZyhkcywgcG9ydCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBfbXY4OGU2eHh4X2ZsdXNoX2ZpZChkcywgZmlkKTsKK30KKworLyogQnJpZGdlIGhhbmRsaW5nIGZ1bmN0aW9ucyAqLworCitpbnQgbXY4OGU2eHh4X2pvaW5fYnJpZGdlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHUzMiBicl9wb3J0X21hc2spCit7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOworCWludCByZXQgPSAwOworCXUzMiBubWFzazsKKwlpbnQgZmlkOworCisJLyogSWYgdGhlIGJyaWRnZSBncm91cCBpcyBub3QgZW1wdHksIGpvaW4gdGhhdCBncm91cC4KKwkgKiBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IGdyb3VwLgorCSAqLworCWZpZCA9IHBzLT5maWRbcG9ydF07CisJbm1hc2sgPSBicl9wb3J0X21hc2sgJiB+KDEgPDwgcG9ydCk7CisJaWYgKG5tYXNrKQorCQlmaWQgPSBwcy0+ZmlkW19fZmZzKG5tYXNrKV07CisKKwlubWFzayA9IHBzLT5icmlkZ2VfbWFza1tmaWRdIHwgKDEgPDwgcG9ydCk7CisJaWYgKG5tYXNrICE9IGJyX3BvcnRfbWFzaykgeworCQluZXRkZXZfZXJyKGRzLT5wb3J0c1twb3J0XSwKKwkJCSAgICJqb2luOiBCcmlkZ2UgcG9ydCBtYXNrIG1pc21hdGNoIGZpZD0lZCBtYXNrPTB4JXggZXhwZWN0ZWQgMHgleFxuIiwKKwkJCSAgIGZpZCwgYnJfcG9ydF9tYXNrLCBubWFzayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X2xvY2soJnBzLT5zbWlfbXV0ZXgpOworCisJcHMtPmJyaWRnZV9tYXNrW2ZpZF0gPSBicl9wb3J0X21hc2s7CisKKwlpZiAoZmlkICE9IHBzLT5maWRbcG9ydF0pIHsKKwkJcHMtPmZpZF9tYXNrIHw9IDEgPDwgcHMtPmZpZFtwb3J0XTsKKwkJcHMtPmZpZFtwb3J0XSA9IGZpZDsKKwkJcmV0ID0gX212ODhlNnh4eF91cGRhdGVfYnJpZGdlX2NvbmZpZyhkcywgZmlkKTsKKwl9CisKKwltdXRleF91bmxvY2soJnBzLT5zbWlfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG12ODhlNnh4eF9sZWF2ZV9icmlkZ2Uoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgdTMyIGJyX3BvcnRfbWFzaykKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CisJdTggZmlkLCBuZXdmaWQ7CisJaW50IHJldDsKKworCWZpZCA9IHBzLT5maWRbcG9ydF07CisKKwlpZiAocHMtPmJyaWRnZV9tYXNrW2ZpZF0gIT0gYnJfcG9ydF9tYXNrKSB7CisJCW5ldGRldl9lcnIoZHMtPnBvcnRzW3BvcnRdLAorCQkJICAgImxlYXZlOiBCcmlkZ2UgcG9ydCBtYXNrIG1pc21hdGNoIGZpZD0lZCBtYXNrPTB4JXggZXhwZWN0ZWQgMHgleFxuIiwKKwkJCSAgIGZpZCwgYnJfcG9ydF9tYXNrLCBwcy0+YnJpZGdlX21hc2tbZmlkXSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElmIHRoZSBwb3J0IHdhcyB0aGUgbGFzdCBwb3J0IG9mIGEgYnJpZGdlLCB3ZSBhcmUgZG9uZS4KKwkgKiBPdGhlcndpc2UgYXNzaWduIGEgbmV3IGZpZCB0byB0aGUgcG9ydCwgYW5kIGZpeCB1cAorCSAqIHRoZSBicmlkZ2UgY29uZmlndXJhdGlvbi4KKwkgKi8KKwlpZiAoYnJfcG9ydF9tYXNrID09ICgxIDw8IHBvcnQpKQorCQlyZXR1cm4gMDsKKworCW11dGV4X2xvY2soJnBzLT5zbWlfbXV0ZXgpOworCisJbmV3ZmlkID0gX19mZnMocHMtPmZpZF9tYXNrKTsKKwlwcy0+ZmlkW3BvcnRdID0gbmV3ZmlkOworCXBzLT5maWRfbWFzayAmPSAoMSA8PCBuZXdmaWQpOworCXBzLT5icmlkZ2VfbWFza1tmaWRdICY9IH4oMSA8PCBwb3J0KTsKKwlwcy0+YnJpZGdlX21hc2tbbmV3ZmlkXSA9IDEgPDwgcG9ydDsKKworCXJldCA9IF9tdjg4ZTZ4eHhfdXBkYXRlX2JyaWRnZV9jb25maWcoZHMsIGZpZCk7CisJaWYgKCFyZXQpCisJCXJldCA9IF9tdjg4ZTZ4eHhfdXBkYXRlX2JyaWRnZV9jb25maWcoZHMsIG5ld2ZpZCk7CisKKwltdXRleF91bmxvY2soJnBzLT5zbWlfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG12ODhlNnh4eF9wb3J0X3N0cF91cGRhdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgdTggc3RhdGUpCit7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOworCWludCBzdHBfc3RhdGU7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBCUl9TVEFURV9ESVNBQkxFRDoKKwkJc3RwX3N0YXRlID0gUE9SVF9DT05UUk9MX1NUQVRFX0RJU0FCTEVEOworCQlicmVhazsKKwljYXNlIEJSX1NUQVRFX0JMT0NLSU5HOgorCWNhc2UgQlJfU1RBVEVfTElTVEVOSU5HOgorCQlzdHBfc3RhdGUgPSBQT1JUX0NPTlRST0xfU1RBVEVfQkxPQ0tJTkc7CisJCWJyZWFrOworCWNhc2UgQlJfU1RBVEVfTEVBUk5JTkc6CisJCXN0cF9zdGF0ZSA9IFBPUlRfQ09OVFJPTF9TVEFURV9MRUFSTklORzsKKwkJYnJlYWs7CisJY2FzZSBCUl9TVEFURV9GT1JXQVJESU5HOgorCWRlZmF1bHQ6CisJCXN0cF9zdGF0ZSA9IFBPUlRfQ09OVFJPTF9TVEFURV9GT1JXQVJESU5HOworCQlicmVhazsKKwl9CisKKwluZXRkZXZfZGJnKGRzLT5wb3J0c1twb3J0XSwgInBvcnQgc3RhdGUgJWQgWyVkXVxuIiwgc3RhdGUsIHN0cF9zdGF0ZSk7CisKKwkvKiBtdjg4ZTZ4eHhfcG9ydF9zdHBfdXBkYXRlIG1heSBiZSBjYWxsZWQgd2l0aCBzb2Z0aXJxcyBkaXNhYmxlZCwKKwkgKiBzbyB3ZSBjYW4gbm90IHVwZGF0ZSB0aGUgcG9ydCBzdGF0ZSBkaXJlY3RseSBidXQgbmVlZCB0byBzY2hlZHVsZSBpdC4KKwkgKi8KKwlwcy0+cG9ydF9zdGF0ZVtwb3J0XSA9IHN0cF9zdGF0ZTsKKwlzZXRfYml0KHBvcnQsICZwcy0+cG9ydF9zdGF0ZV91cGRhdGVfbWFzayk7CisJc2NoZWR1bGVfd29yaygmcHMtPmJyaWRnZV93b3JrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fbXY4OGU2eHh4X3dyaXRlX2FkZHIoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLAorCQkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcikKK3sKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZSgKKwkJCWRzLCBSRUdfR0xPQkFMLCBHTE9CQUxfQVRVX01BQ18wMSArIGksCisJCQkoYWRkcltpICogMl0gPDwgOCkgfCBhZGRyW2kgKiAyICsgMV0pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19tdjg4ZTZ4eHhfcmVhZF9hZGRyKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgdW5zaWduZWQgY2hhciAqYWRkcikKK3sKKwlpbnQgaSwgcmV0OworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlyZXQgPSBfbXY4OGU2eHh4X3JlZ19yZWFkKGRzLCBSRUdfR0xPQkFMLAorCQkJCQkgIEdMT0JBTF9BVFVfTUFDXzAxICsgaSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJYWRkcltpICogMl0gPSByZXQgPj4gODsKKwkJYWRkcltpICogMiArIDFdID0gcmV0ICYgMHhmZjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX212ODhlNnh4eF9wb3J0X2ZkYl9jbWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgaW50IHN0YXRlKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwl1OCBmaWQgPSBwcy0+ZmlkW3BvcnRdOworCWludCByZXQ7CisKKwlyZXQgPSBfbXY4OGU2eHh4X2F0dV93YWl0KGRzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IF9fbXY4OGU2eHh4X3dyaXRlX2FkZHIoZHMsIGFkZHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gX212ODhlNnh4eF9yZWdfd3JpdGUoZHMsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfREFUQSwKKwkJCQkgICAoMHgxMCA8PCBwb3J0KSB8IHN0YXRlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gX212ODhlNnh4eF9hdHVfY21kKGRzLCBmaWQsIEdMT0JBTF9BVFVfT1BfTE9BRF9EQik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgbXY4OGU2eHh4X3BvcnRfZmRiX2FkZChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCkKK3sKKwlpbnQgc3RhdGUgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihhZGRyKSA/CisJCUdMT0JBTF9BVFVfREFUQV9TVEFURV9NQ19TVEFUSUMgOgorCQlHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVUNfU1RBVElDOworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcHMtPnNtaV9tdXRleCk7CisJcmV0ID0gX19tdjg4ZTZ4eHhfcG9ydF9mZGJfY21kKGRzLCBwb3J0LCBhZGRyLCBzdGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZwcy0+c21pX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBtdjg4ZTZ4eHhfcG9ydF9mZGJfZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcHMtPnNtaV9tdXRleCk7CisJcmV0ID0gX19tdjg4ZTZ4eHhfcG9ydF9mZGJfY21kKGRzLCBwb3J0LCBhZGRyLAorCQkJCSAgICAgICBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVU5VU0VEKTsKKwltdXRleF91bmxvY2soJnBzLT5zbWlfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX212ODhlNnh4eF9wb3J0X2dldG5leHQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgICAgdW5zaWduZWQgY2hhciAqYWRkciwgYm9vbCAqaXNfc3RhdGljKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwl1OCBmaWQgPSBwcy0+ZmlkW3BvcnRdOworCWludCByZXQsIHN0YXRlOworCisJcmV0ID0gX212ODhlNnh4eF9hdHVfd2FpdChkcyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBfX212ODhlNnh4eF93cml0ZV9hZGRyKGRzLCBhZGRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRvIHsKKwkJcmV0ID0gX212ODhlNnh4eF9hdHVfY21kKGRzLCBmaWQsICBHTE9CQUxfQVRVX09QX0dFVF9ORVhUX0RCKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3JlYWQoZHMsIFJFR19HTE9CQUwsIEdMT0JBTF9BVFVfREFUQSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJc3RhdGUgPSByZXQgJiBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfTUFTSzsKKwkJaWYgKHN0YXRlID09IEdMT0JBTF9BVFVfREFUQV9TVEFURV9VTlVTRUQpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwl9IHdoaWxlICghKCgocmV0ID4+IDQpICYgMHhmZikgJiAoMSA8PCBwb3J0KSkpOworCisJcmV0ID0gX19tdjg4ZTZ4eHhfcmVhZF9hZGRyKGRzLCBhZGRyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSppc19zdGF0aWMgPSBzdGF0ZSA9PSAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoYWRkcikgPworCQkJICAgICAgIEdMT0JBTF9BVFVfREFUQV9TVEFURV9NQ19TVEFUSUMgOgorCQkJICAgICAgIEdMT0JBTF9BVFVfREFUQV9TVEFURV9VQ19TVEFUSUMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGdldCBuZXh0IGVudHJ5IGZvciBwb3J0ICovCitpbnQgbXY4OGU2eHh4X3BvcnRfZmRiX2dldG5leHQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICphZGRyLCBib29sICppc19zdGF0aWMpCit7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZwcy0+c21pX211dGV4KTsKKwlyZXQgPSBfX212ODhlNnh4eF9wb3J0X2dldG5leHQoZHMsIHBvcnQsIGFkZHIsIGlzX3N0YXRpYyk7CisJbXV0ZXhfdW5sb2NrKCZwcy0+c21pX211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG12ODhlNnh4eF9icmlkZ2Vfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwczsKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHM7CisJaW50IHBvcnQ7CisKKwlwcyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUsIGJyaWRnZV93b3JrKTsKKwlkcyA9ICgoc3RydWN0IGRzYV9zd2l0Y2ggKilwcykgLSAxOworCisJd2hpbGUgKHBzLT5wb3J0X3N0YXRlX3VwZGF0ZV9tYXNrKSB7CisJCXBvcnQgPSBfX2Zmcyhwcy0+cG9ydF9zdGF0ZV91cGRhdGVfbWFzayk7CisJCWNsZWFyX2JpdChwb3J0LCAmcHMtPnBvcnRfc3RhdGVfdXBkYXRlX21hc2spOworCQltdjg4ZTZ4eHhfc2V0X3BvcnRfc3RhdGUoZHMsIHBvcnQsIHBzLT5wb3J0X3N0YXRlW3BvcnRdKTsKKwl9Cit9CisKK2ludCBtdjg4ZTZ4eHhfc2V0dXBfcG9ydF9jb21tb24oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CisJaW50IHJldCwgZmlkOworCisJbXV0ZXhfbG9jaygmcHMtPnNtaV9tdXRleCk7CisKKwkvKiBQb3J0IENvbnRyb2wgMTogZGlzYWJsZSB0cnVua2luZywgZGlzYWJsZSBzZW5kaW5nCisJICogbGVhcm5pbmcgbWVzc2FnZXMgdG8gdGhpcyBwb3J0LgorCSAqLworCXJldCA9IF9tdjg4ZTZ4eHhfcmVnX3dyaXRlKGRzLCBSRUdfUE9SVChwb3J0KSwgUE9SVF9ERUZBVUxUX1ZMQU4sCisJCQkJICAgMHgwMDAwKTsKKwlpZiAocmV0KQorCQlnb3RvIGFib3J0OworCisJLyogUG9ydCBiYXNlZCBWTEFOIG1hcDogZ2l2ZSBlYWNoIHBvcnQgaXRzIG93biBhZGRyZXNzCisJICogZGF0YWJhc2UsIGFsbG93IHRoZSBDUFUgcG9ydCB0byB0YWxrIHRvIGVhY2ggb2YgdGhlICdyZWFsJworCSAqIHBvcnRzLCBhbmQgYWxsb3cgZWFjaCBvZiB0aGUgJ3JlYWwnIHBvcnRzIHRvIG9ubHkgdGFsayB0bworCSAqIHRoZSB1cHN0cmVhbSBwb3J0LgorCSAqLworCWZpZCA9IF9fZmZzKHBzLT5maWRfbWFzayk7CisJcHMtPmZpZFtwb3J0XSA9IGZpZDsKKwlwcy0+ZmlkX21hc2sgJj0gfigxIDw8IGZpZCk7CisKKwlpZiAoIWRzYV9pc19jcHVfcG9ydChkcywgcG9ydCkpCisJCXBzLT5icmlkZ2VfbWFza1tmaWRdID0gMSA8PCBwb3J0OworCisJcmV0ID0gX212ODhlNnh4eF91cGRhdGVfcG9ydF9jb25maWcoZHMsIHBvcnQpOworCWlmIChyZXQpCisJCWdvdG8gYWJvcnQ7CisKKwkvKiBEZWZhdWx0IFZMQU4gSUQgYW5kIHByaW9yaXR5OiBkb24ndCBzZXQgYSBkZWZhdWx0IFZMQU4KKwkgKiBJRCwgYW5kIHNldCB0aGUgZGVmYXVsdCBwYWNrZXQgcHJpb3JpdHkgdG8gemVyby4KKwkgKi8KKwlyZXQgPSBfbXY4OGU2eHh4X3JlZ193cml0ZShkcywgUkVHX1BPUlQocG9ydCksIDB4MDcsIDB4MDAwMCk7CithYm9ydDoKKwltdXRleF91bmxvY2soJnBzLT5zbWlfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBtdjg4ZTZ4eHhfc2V0dXBfY29tbW9uKHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CisKKwltdXRleF9pbml0KCZwcy0+c21pX211dGV4KTsKKwltdXRleF9pbml0KCZwcy0+c3RhdHNfbXV0ZXgpOworCW11dGV4X2luaXQoJnBzLT5waHlfbXV0ZXgpOworCisJcHMtPmlkID0gUkVHX1JFQUQoUkVHX1BPUlQoMCksIFBPUlRfU1dJVENIX0lEKSAmIDB4ZmZmMDsKKworCXBzLT5maWRfbWFzayA9ICgxIDw8IERTQV9NQVhfUE9SVFMpIC0gMTsKKworCUlOSVRfV09SSygmcHMtPmJyaWRnZV93b3JrLCBtdjg4ZTZ4eHhfYnJpZGdlX3dvcmspOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtdjg4ZTZ4eHhfc3dpdGNoX3Jlc2V0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgYm9vbCBwcHVfYWN0aXZlKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwl1MTYgaXNfcmVzZXQgPSAocHB1X2FjdGl2ZSA/IDB4ODgwMCA6IDB4YzgwMCk7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCWludCByZXQ7CisJaW50IGk7CisKKwkvKiBTZXQgYWxsIHBvcnRzIHRvIHRoZSBkaXNhYmxlZCBzdGF0ZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHMtPm51bV9wb3J0czsgaSsrKSB7CisJCXJldCA9IFJFR19SRUFEKFJFR19QT1JUKGkpLCBQT1JUX0NPTlRST0wpOworCQlSRUdfV1JJVEUoUkVHX1BPUlQoaSksIFBPUlRfQ09OVFJPTCwgcmV0ICYgMHhmZmZjKTsKKwl9CisKKwkvKiBXYWl0IGZvciB0cmFuc21pdCBxdWV1ZXMgdG8gZHJhaW4uICovCisJdXNsZWVwX3JhbmdlKDIwMDAsIDQwMDApOworCisJLyogUmVzZXQgdGhlIHN3aXRjaC4gS2VlcCB0aGUgUFBVIGFjdGl2ZSBpZiByZXF1ZXN0ZWQuIFRoZSBQUFUKKwkgKiBuZWVkcyB0byBiZSBhY3RpdmUgdG8gc3VwcG9ydCBpbmRpcmVjdCBwaHkgcmVnaXN0ZXIgYWNjZXNzCisJICogdGhyb3VnaCBnbG9iYWwgcmVnaXN0ZXJzIDB4MTggYW5kIDB4MTkuCisJICovCisJaWYgKHBwdV9hY3RpdmUpCisJCVJFR19XUklURShSRUdfR0xPQkFMLCAweDA0LCAweGMwMDApOworCWVsc2UKKwkJUkVHX1dSSVRFKFJFR19HTE9CQUwsIDB4MDQsIDB4YzQwMCk7CisKKwkvKiBXYWl0IHVwIHRvIG9uZSBzZWNvbmQgZm9yIHJlc2V0IHRvIGNvbXBsZXRlLiAqLworCXRpbWVvdXQgPSBqaWZmaWVzICsgMSAqIEhaOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlyZXQgPSBSRUdfUkVBRChSRUdfR0xPQkFMLCAweDAwKTsKKwkJaWYgKChyZXQgJiBpc19yZXNldCkgPT0gaXNfcmVzZXQpCisJCQlicmVhazsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCX0KKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG12ODhlNnh4eF9waHlfcGFnZV9yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGludCBwYWdlLCBpbnQgcmVnKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmcHMtPnBoeV9tdXRleCk7CisJcmV0ID0gX212ODhlNnh4eF9waHlfd3JpdGVfaW5kaXJlY3QoZHMsIHBvcnQsIDB4MTYsIHBhZ2UpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yOworCXJldCA9IF9tdjg4ZTZ4eHhfcGh5X3JlYWRfaW5kaXJlY3QoZHMsIHBvcnQsIHJlZyk7CitlcnJvcjoKKwlfbXY4OGU2eHh4X3BoeV93cml0ZV9pbmRpcmVjdChkcywgcG9ydCwgMHgxNiwgMHgwKTsKKwltdXRleF91bmxvY2soJnBzLT5waHlfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBtdjg4ZTZ4eHhfcGh5X3BhZ2Vfd3JpdGUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgaW50IHBhZ2UsCisJCQkgICAgIGludCByZWcsIGludCB2YWwpCit7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZwcy0+cGh5X211dGV4KTsKKwlyZXQgPSBfbXY4OGU2eHh4X3BoeV93cml0ZV9pbmRpcmVjdChkcywgcG9ydCwgMHgxNiwgcGFnZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlyZXQgPSBfbXY4OGU2eHh4X3BoeV93cml0ZV9pbmRpcmVjdChkcywgcG9ydCwgcmVnLCB2YWwpOworZXJyb3I6CisJX212ODhlNnh4eF9waHlfd3JpdGVfaW5kaXJlY3QoZHMsIHBvcnQsIDB4MTYsIDB4MCk7CisJbXV0ZXhfdW5sb2NrKCZwcy0+cGh5X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG12ODhlNnh4eF9wb3J0X3RvX3BoeV9hZGRyKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQpCit7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOworCisJaWYgKHBvcnQgPj0gMCAmJiBwb3J0IDwgcHMtPm51bV9wb3J0cykKKwkJcmV0dXJuIHBvcnQ7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludAorbXY4OGU2eHh4X3BoeV9yZWFkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIGludCByZWdudW0pCit7CisJc3RydWN0IG12ODhlNnh4eF9wcml2X3N0YXRlICpwcyA9IGRzX3RvX3ByaXYoZHMpOworCWludCBhZGRyID0gbXY4OGU2eHh4X3BvcnRfdG9fcGh5X2FkZHIoZHMsIHBvcnQpOworCWludCByZXQ7CisKKwlpZiAoYWRkciA8IDApCisJCXJldHVybiBhZGRyOworCisJbXV0ZXhfbG9jaygmcHMtPnBoeV9tdXRleCk7CisJcmV0ID0gX212ODhlNnh4eF9waHlfcmVhZChkcywgYWRkciwgcmVnbnVtKTsKKwltdXRleF91bmxvY2soJnBzLT5waHlfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK2ludAorbXY4OGU2eHh4X3BoeV93cml0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCBpbnQgcmVnbnVtLCB1MTYgdmFsKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwlpbnQgYWRkciA9IG12ODhlNnh4eF9wb3J0X3RvX3BoeV9hZGRyKGRzLCBwb3J0KTsKKwlpbnQgcmV0OworCisJaWYgKGFkZHIgPCAwKQorCQlyZXR1cm4gYWRkcjsKKworCW11dGV4X2xvY2soJnBzLT5waHlfbXV0ZXgpOworCXJldCA9IF9tdjg4ZTZ4eHhfcGh5X3dyaXRlKGRzLCBhZGRyLCByZWdudW0sIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZwcy0+cGh5X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK212ODhlNnh4eF9waHlfcmVhZF9pbmRpcmVjdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCBpbnQgcmVnbnVtKQoreworCXN0cnVjdCBtdjg4ZTZ4eHhfcHJpdl9zdGF0ZSAqcHMgPSBkc190b19wcml2KGRzKTsKKwlpbnQgYWRkciA9IG12ODhlNnh4eF9wb3J0X3RvX3BoeV9hZGRyKGRzLCBwb3J0KTsKKwlpbnQgcmV0OworCisJaWYgKGFkZHIgPCAwKQorCQlyZXR1cm4gYWRkcjsKKworCW11dGV4X2xvY2soJnBzLT5waHlfbXV0ZXgpOworCXJldCA9IF9tdjg4ZTZ4eHhfcGh5X3JlYWRfaW5kaXJlY3QoZHMsIGFkZHIsIHJlZ251bSk7CisJbXV0ZXhfdW5sb2NrKCZwcy0+cGh5X211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK212ODhlNnh4eF9waHlfd3JpdGVfaW5kaXJlY3Qoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgaW50IHJlZ251bSwKKwkJCSAgICAgdTE2IHZhbCkKK3sKKwlzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgKnBzID0gZHNfdG9fcHJpdihkcyk7CisJaW50IGFkZHIgPSBtdjg4ZTZ4eHhfcG9ydF90b19waHlfYWRkcihkcywgcG9ydCk7CisJaW50IHJldDsKKworCWlmIChhZGRyIDwgMCkKKwkJcmV0dXJuIGFkZHI7CisKKwltdXRleF9sb2NrKCZwcy0+cGh5X211dGV4KTsKKwlyZXQgPSBfbXY4OGU2eHh4X3BoeV93cml0ZV9pbmRpcmVjdChkcywgYWRkciwgcmVnbnVtLCB2YWwpOworCW11dGV4X3VubG9jaygmcHMtPnBoeV9tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBfX2luaXQgbXY4OGU2eHh4X2luaXQodm9pZCkKIHsKICNpZiBJU19FTkFCTEVEKENPTkZJR19ORVRfRFNBX01WODhFNjEzMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHguaCBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHguaAppbmRleCAwM2UzOTdlLi5lMDQ1MTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4LmgKKysrIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC5oCkBAIC0xMSw5ICsxMSwxOTkgQEAKICNpZm5kZWYgX19NVjg4RTZYWFhfSAogI2RlZmluZSBfX01WODhFNlhYWF9ICiAKKyNkZWZpbmUgU01JX0NNRAkJCTB4MDAKKyNkZWZpbmUgU01JX0NNRF9CVVNZCQlCSVQoMTUpCisjZGVmaW5lIFNNSV9DTURfQ0xBVVNFXzIyCUJJVCgxMikKKyNkZWZpbmUgU01JX0NNRF9PUF8yMl9XUklURQkoKDEgPDwgMTApIHwgU01JX0NNRF9CVVNZIHwgU01JX0NNRF9DTEFVU0VfMjIpCisjZGVmaW5lIFNNSV9DTURfT1BfMjJfUkVBRAkoKDIgPDwgMTApIHwgU01JX0NNRF9CVVNZIHwgU01JX0NNRF9DTEFVU0VfMjIpCisjZGVmaW5lIFNNSV9DTURfT1BfNDVfV1JJVEVfQUREUgkoKDAgPDwgMTApIHwgU01JX0NNRF9CVVNZKQorI2RlZmluZSBTTUlfQ01EX09QXzQ1X1dSSVRFX0RBVEEJKCgxIDw8IDEwKSB8IFNNSV9DTURfQlVTWSkKKyNkZWZpbmUgU01JX0NNRF9PUF80NV9SRUFEX0RBVEEJCSgoMiA8PCAxMCkgfCBTTUlfQ01EX0JVU1kpCisjZGVmaW5lIFNNSV9DTURfT1BfNDVfUkVBRF9EQVRBX0lOQwkoKDMgPDwgMTApIHwgU01JX0NNRF9CVVNZKQorI2RlZmluZSBTTUlfREFUQQkJMHgwMQorCiAjZGVmaW5lIFJFR19QT1JUKHApCQkoMHgxMCArIChwKSkKKyNkZWZpbmUgUE9SVF9TVEFUVVMJCTB4MDAKKyNkZWZpbmUgUE9SVF9TVEFUVVNfUEFVU0VfRU4JQklUKDE1KQorI2RlZmluZSBQT1JUX1NUQVRVU19NWV9QQVVTRQlCSVQoMTQpCisjZGVmaW5lIFBPUlRfU1RBVFVTX0hEX0ZMT1cJQklUKDEzKQorI2RlZmluZSBQT1JUX1NUQVRVU19QSFlfREVURUNUCUJJVCgxMikKKyNkZWZpbmUgUE9SVF9TVEFUVVNfTElOSwlCSVQoMTEpCisjZGVmaW5lIFBPUlRfU1RBVFVTX0RVUExFWAlCSVQoMTApCisjZGVmaW5lIFBPUlRfU1RBVFVTX1NQRUVEX01BU0sJMHgwMzAwCisjZGVmaW5lIFBPUlRfU1RBVFVTX1NQRUVEXzEwCTB4MDAwMAorI2RlZmluZSBQT1JUX1NUQVRVU19TUEVFRF8xMDAJMHgwMTAwCisjZGVmaW5lIFBPUlRfU1RBVFVTX1NQRUVEXzEwMDAJMHgwMjAwCisjZGVmaW5lIFBPUlRfU1RBVFVTX0VFRQkJQklUKDYpIC8qIDYzNTIgKi8KKyNkZWZpbmUgUE9SVF9TVEFUVVNfQU1fRElTCUJJVCg2KSAvKiA2MTY1ICovCisjZGVmaW5lIFBPUlRfU1RBVFVTX01HTUlJCUJJVCg2KSAvKiA2MTg1ICovCisjZGVmaW5lIFBPUlRfU1RBVFVTX1RYX1BBVVNFRAlCSVQoNSkKKyNkZWZpbmUgUE9SVF9TVEFUVVNfRkxPV19DVFJMCUJJVCg0KQorI2RlZmluZSBQT1JUX1BDU19DVFJMCQkweDAxCisjZGVmaW5lIFBPUlRfU1dJVENIX0lECQkweDAzCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYwODUJMHgwNGEwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYwOTUJMHgwOTUwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxMjMJMHgxMjEwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxMjNfQTEJMHgxMjEyCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxMjNfQTIJMHgxMjEzCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxMzEJMHgxMDYwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxMzFfQjIJMHgxMDY2CisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxNTIJMHgxYTQwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxNTUJMHgxYTUwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxNjEJMHgxNjEwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxNjFfQTEJMHgxNjEyCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxNjFfQTIJMHgxNjEzCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxNjUJMHgxNjUwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxNjVfQTEJMHgxNjUyCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxNjVfQTIJMHgxNjUzCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxNzEJMHgxNzEwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxNzIJMHgxNzIwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxNzYJMHgxNzYwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxODIJMHgxYTYwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYxODUJMHgxYTcwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYzNTIJMHgzNTIwCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYzNTJfQTAJMHgzNTIxCisjZGVmaW5lIFBPUlRfU1dJVENIX0lEXzYzNTJfQTEJMHgzNTIyCisjZGVmaW5lIFBPUlRfQ09OVFJPTAkJMHgwNAorI2RlZmluZSBQT1JUX0NPTlRST0xfU1RBVEVfTUFTSwkJMHgwMworI2RlZmluZSBQT1JUX0NPTlRST0xfU1RBVEVfRElTQUJMRUQJMHgwMAorI2RlZmluZSBQT1JUX0NPTlRST0xfU1RBVEVfQkxPQ0tJTkcJMHgwMQorI2RlZmluZSBQT1JUX0NPTlRST0xfU1RBVEVfTEVBUk5JTkcJMHgwMgorI2RlZmluZSBQT1JUX0NPTlRST0xfU1RBVEVfRk9SV0FSRElORwkweDAzCisjZGVmaW5lIFBPUlRfQ09OVFJPTF8xCQkweDA1CisjZGVmaW5lIFBPUlRfQkFTRV9WTEFOCQkweDA2CisjZGVmaW5lIFBPUlRfREVGQVVMVF9WTEFOCTB4MDcKKyNkZWZpbmUgUE9SVF9DT05UUk9MXzIJCTB4MDgKKyNkZWZpbmUgUE9SVF9SQVRFX0NPTlRST0wJMHgwOQorI2RlZmluZSBQT1JUX1JBVEVfQ09OVFJPTF8yCTB4MGEKKyNkZWZpbmUgUE9SVF9BU1NPQ19WRUNUT1IJMHgwYgorI2RlZmluZSBQT1JUX0lOX0RJU0NBUkRfTE8JMHgxMAorI2RlZmluZSBQT1JUX0lOX0RJU0NBUkRfSEkJMHgxMQorI2RlZmluZSBQT1JUX0lOX0ZJTFRFUkVECTB4MTIKKyNkZWZpbmUgUE9SVF9PVVRfRklMVEVSRUQJMHgxMworI2RlZmluZSBQT1JUX1RBR19SRUdNQVBfMDEyMwkweDE5CisjZGVmaW5lIFBPUlRfVEFHX1JFR01BUF80NTY3CTB4MWEKKwogI2RlZmluZSBSRUdfR0xPQkFMCQkweDFiCisjZGVmaW5lIEdMT0JBTF9TVEFUVVMJCTB4MDAKKyNkZWZpbmUgR0xPQkFMX1NUQVRVU19QUFVfU1RBVEUgQklUKDE1KSAvKiA2MzUxIGFuZCA2MTcxICovCisvKiBUd28gYml0cyBmb3IgNjE2NSwgNjE4NSBldGMgKi8KKyNkZWZpbmUgR0xPQkFMX1NUQVRVU19QUFVfTUFTSwkJKDB4MyA8PCAxNCkKKyNkZWZpbmUgR0xPQkFMX1NUQVRVU19QUFVfRElTQUJMRURfUlNUCSgweDAgPDwgMTQpCisjZGVmaW5lIEdMT0JBTF9TVEFUVVNfUFBVX0lOSVRJQUxJWklORwkoMHgxIDw8IDE0KQorI2RlZmluZSBHTE9CQUxfU1RBVFVTX1BQVV9ESVNBQkxFRAkoMHgyIDw8IDE0KQorI2RlZmluZSBHTE9CQUxfU1RBVFVTX1BQVV9QT0xMSU5HCSgweDMgPDwgMTQpCisjZGVmaW5lIEdMT0JBTF9NQUNfMDEJCTB4MDEKKyNkZWZpbmUgR0xPQkFMX01BQ18yMwkJMHgwMgorI2RlZmluZSBHTE9CQUxfTUFDXzQ1CQkweDAzCisjZGVmaW5lIEdMT0JBTF9DT05UUk9MCQkweDA0CisjZGVmaW5lIEdMT0JBTF9DT05UUk9MX1NXX1JFU0VUCQlCSVQoMTUpCisjZGVmaW5lIEdMT0JBTF9DT05UUk9MX1BQVV9FTkFCTEUJQklUKDE0KQorI2RlZmluZSBHTE9CQUxfQ09OVFJPTF9ESVNDQVJEX0VYQ0VTUwlCSVQoMTMpIC8qIDYzNTIgKi8KKyNkZWZpbmUgR0xPQkFMX0NPTlRST0xfU0NIRURfUFJJTwlCSVQoMTEpIC8qIDYxNTIgKi8KKyNkZWZpbmUgR0xPQkFMX0NPTlRST0xfTUFYX0ZSQU1FXzE2MzIJQklUKDEwKSAvKiA2MTUyICovCisjZGVmaW5lIEdMT0JBTF9DT05UUk9MX1JFTE9BRF9FRVBST00JQklUKDkpICAvKiA2MTUyICovCisjZGVmaW5lIEdMT0JBTF9DT05UUk9MX0RFVklDRV9FTglCSVQoNykKKyNkZWZpbmUgR0xPQkFMX0NPTlRST0xfU1RBVFNfRE9ORV9FTglCSVQoNikKKyNkZWZpbmUgR0xPQkFMX0NPTlRST0xfVlRVX1BST0JMRU1fRU4JQklUKDUpCisjZGVmaW5lIEdMT0JBTF9DT05UUk9MX1ZUVV9ET05FX0VOCUJJVCg0KQorI2RlZmluZSBHTE9CQUxfQ09OVFJPTF9BVFVfUFJPQkxFTV9FTglCSVQoMykKKyNkZWZpbmUgR0xPQkFMX0NPTlRST0xfQVRVX0RPTkVfRU4JQklUKDIpCisjZGVmaW5lIEdMT0JBTF9DT05UUk9MX1RDQU1fRU4JCUJJVCgxKQorI2RlZmluZSBHTE9CQUxfQ09OVFJPTF9FRVBST01fRE9ORV9FTglCSVQoMCkKKyNkZWZpbmUgR0xPQkFMX1ZUVV9PUAkJMHgwNQorI2RlZmluZSBHTE9CQUxfVlRVX1ZJRAkJMHgwNgorI2RlZmluZSBHTE9CQUxfVlRVX0RBVEFfMF8zCTB4MDcKKyNkZWZpbmUgR0xPQkFMX1ZUVV9EQVRBXzRfNwkweDA4CisjZGVmaW5lIEdMT0JBTF9WVFVfREFUQV84XzExCTB4MDkKKyNkZWZpbmUgR0xPQkFMX0FUVV9DT05UUk9MCTB4MGEKKyNkZWZpbmUgR0xPQkFMX0FUVV9PUAkJMHgwYgorI2RlZmluZSBHTE9CQUxfQVRVX09QX0JVU1kJQklUKDE1KQorI2RlZmluZSBHTE9CQUxfQVRVX09QX05PUAkJKDAgPDwgMTIpCisjZGVmaW5lIEdMT0JBTF9BVFVfT1BfRkxVU0hfQUxMCQkoKDEgPDwgMTIpIHwgR0xPQkFMX0FUVV9PUF9CVVNZKQorI2RlZmluZSBHTE9CQUxfQVRVX09QX0ZMVVNIX05PTl9TVEFUSUMJKCgyIDw8IDEyKSB8IEdMT0JBTF9BVFVfT1BfQlVTWSkKKyNkZWZpbmUgR0xPQkFMX0FUVV9PUF9MT0FEX0RCCQkoKDMgPDwgMTIpIHwgR0xPQkFMX0FUVV9PUF9CVVNZKQorI2RlZmluZSBHTE9CQUxfQVRVX09QX0dFVF9ORVhUX0RCCSgoNCA8PCAxMikgfCBHTE9CQUxfQVRVX09QX0JVU1kpCisjZGVmaW5lIEdMT0JBTF9BVFVfT1BfRkxVU0hfREIJCSgoNSA8PCAxMikgfCBHTE9CQUxfQVRVX09QX0JVU1kpCisjZGVmaW5lIEdMT0JBTF9BVFVfT1BfRkxVU0hfTk9OX1NUQVRJQ19EQiAoKDYgPDwgMTIpIHwgR0xPQkFMX0FUVV9PUF9CVVNZKQorI2RlZmluZSBHTE9CQUxfQVRVX09QX0dFVF9DTFJfVklPTEFUSU9OCSAgKCg3IDw8IDEyKSB8IEdMT0JBTF9BVFVfT1BfQlVTWSkKKyNkZWZpbmUgR0xPQkFMX0FUVV9EQVRBCQkweDBjCisjZGVmaW5lIEdMT0JBTF9BVFVfREFUQV9TVEFURV9NQVNLCQkweDBmCisjZGVmaW5lIEdMT0JBTF9BVFVfREFUQV9TVEFURV9VTlVTRUQJCTB4MDAKKyNkZWZpbmUgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VDX01HTVQJCTB4MGQKKyNkZWZpbmUgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX1VDX1NUQVRJQwkJMHgwZQorI2RlZmluZSBHTE9CQUxfQVRVX0RBVEFfU1RBVEVfVUNfUFJJT19PVkVSCTB4MGYKKyNkZWZpbmUgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX01DX05PTkVfUkFURQkweDA1CisjZGVmaW5lIEdMT0JBTF9BVFVfREFUQV9TVEFURV9NQ19TVEFUSUMJCTB4MDcKKyNkZWZpbmUgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX01DX01HTVQJCTB4MGUKKyNkZWZpbmUgR0xPQkFMX0FUVV9EQVRBX1NUQVRFX01DX1BSSU9fT1ZFUgkweDBmCisjZGVmaW5lIEdMT0JBTF9BVFVfTUFDXzAxCTB4MGQKKyNkZWZpbmUgR0xPQkFMX0FUVV9NQUNfMjMJMHgwZQorI2RlZmluZSBHTE9CQUxfQVRVX01BQ180NQkweDBmCisjZGVmaW5lIEdMT0JBTF9JUF9QUklfMAkJMHgxMAorI2RlZmluZSBHTE9CQUxfSVBfUFJJXzEJCTB4MTEKKyNkZWZpbmUgR0xPQkFMX0lQX1BSSV8yCQkweDEyCisjZGVmaW5lIEdMT0JBTF9JUF9QUklfMwkJMHgxMworI2RlZmluZSBHTE9CQUxfSVBfUFJJXzQJCTB4MTQKKyNkZWZpbmUgR0xPQkFMX0lQX1BSSV81CQkweDE1CisjZGVmaW5lIEdMT0JBTF9JUF9QUklfNgkJMHgxNgorI2RlZmluZSBHTE9CQUxfSVBfUFJJXzcJCTB4MTcKKyNkZWZpbmUgR0xPQkFMX0lFRUVfUFJJCQkweDE4CisjZGVmaW5lIEdMT0JBTF9DT1JFX1RBR19UWVBFCTB4MTkKKyNkZWZpbmUgR0xPQkFMX01PTklUT1JfQ09OVFJPTAkweDFhCisjZGVmaW5lIEdMT0JBTF9DT05UUk9MXzIJMHgxYworI2RlZmluZSBHTE9CQUxfU1RBVFNfT1AJCTB4MWQKKyNkZWZpbmUgR0xPQkFMX1NUQVRTX09QX0JVU1kJQklUKDE1KQorI2RlZmluZSBHTE9CQUxfU1RBVFNfT1BfTk9QCQkoMCA8PCAxMikKKyNkZWZpbmUgR0xPQkFMX1NUQVRTX09QX0ZMVVNIX0FMTAkoKDEgPDwgMTIpIHwgR0xPQkFMX1NUQVRTX09QX0JVU1kpCisjZGVmaW5lIEdMT0JBTF9TVEFUU19PUF9GTFVTSF9QT1JUCSgoMiA8PCAxMikgfCBHTE9CQUxfU1RBVFNfT1BfQlVTWSkKKyNkZWZpbmUgR0xPQkFMX1NUQVRTX09QX1JFQURfQ0FQVFVSRUQJKCg0IDw8IDEyKSB8IEdMT0JBTF9TVEFUU19PUF9CVVNZKQorI2RlZmluZSBHTE9CQUxfU1RBVFNfT1BfQ0FQVFVSRV9QT1JUCSgoNSA8PCAxMikgfCBHTE9CQUxfU1RBVFNfT1BfQlVTWSkKKyNkZWZpbmUgR0xPQkFMX1NUQVRTX09QX0hJU1RfUlgJCSgoMSA8PCAxMCkgfCBHTE9CQUxfU1RBVFNfT1BfQlVTWSkKKyNkZWZpbmUgR0xPQkFMX1NUQVRTX09QX0hJU1RfVFgJCSgoMiA8PCAxMCkgfCBHTE9CQUxfU1RBVFNfT1BfQlVTWSkKKyNkZWZpbmUgR0xPQkFMX1NUQVRTX09QX0hJU1RfUlhfVFgJKCgzIDw8IDEwKSB8IEdMT0JBTF9TVEFUU19PUF9CVVNZKQorI2RlZmluZSBHTE9CQUxfU1RBVFNfQ09VTlRFUl8zMgkweDFlCisjZGVmaW5lIEdMT0JBTF9TVEFUU19DT1VOVEVSXzAxCTB4MWYKKwogI2RlZmluZSBSRUdfR0xPQkFMMgkJMHgxYworI2RlZmluZSBHTE9CQUwyX0lOVF9TT1VSQ0UJMHgwMAorI2RlZmluZSBHTE9CQUwyX0lOVF9NQVNLCTB4MDEKKyNkZWZpbmUgR0xPQkFMMl9NR01UX0VOXzJYCTB4MDIKKyNkZWZpbmUgR0xPQkFMMl9NR01UX0VOXzBYCTB4MDMKKyNkZWZpbmUgR0xPQkFMMl9GTE9XX0NPTlRST0wJMHgwNAorI2RlZmluZSBHTE9CQUwyX1NXSVRDSF9NR01UCTB4MDUKKyNkZWZpbmUgR0xPQkFMMl9ERVZJQ0VfTUFQUElORwkweDA2CisjZGVmaW5lIEdMT0JBTDJfVFJVTktfTUFTSwkweDA3CisjZGVmaW5lIEdMT0JBTDJfVFJVTktfTUFQUElORwkweDA4CisjZGVmaW5lIEdMT0JBTDJfSU5HUkVTU19PUAkweDA5CisjZGVmaW5lIEdMT0JBTDJfSU5HUkVTU19EQVRBCTB4MGEKKyNkZWZpbmUgR0xPQkFMMl9QVlRfQUREUgkweDBiCisjZGVmaW5lIEdMT0JBTDJfUFZUX0RBVEEJMHgwYworI2RlZmluZSBHTE9CQUwyX1NXSVRDSF9NQUMJMHgwZAorI2RlZmluZSBHTE9CQUwyX1NXSVRDSF9NQUNfQlVTWSBCSVQoMTUpCisjZGVmaW5lIEdMT0JBTDJfQVRVX1NUQVRTCTB4MGUKKyNkZWZpbmUgR0xPQkFMMl9QUklPX09WRVJSSURFCTB4MGYKKyNkZWZpbmUgR0xPQkFMMl9FRVBST01fT1AJMHgxNAorI2RlZmluZSBHTE9CQUwyX0VFUFJPTV9PUF9CVVNZCUJJVCgxNSkKKyNkZWZpbmUgR0xPQkFMMl9FRVBST01fT1BfTE9BRAlCSVQoMTEpCisjZGVmaW5lIEdMT0JBTDJfRUVQUk9NX0RBVEEJMHgxNQorI2RlZmluZSBHTE9CQUwyX1BUUF9BVkJfT1AJMHgxNgorI2RlZmluZSBHTE9CQUwyX1BUUF9BVkJfREFUQQkweDE3CisjZGVmaW5lIEdMT0JBTDJfU01JX09QCQkweDE4CisjZGVmaW5lIEdMT0JBTDJfU01JX09QX0JVU1kJCUJJVCgxNSkKKyNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfQ0xBVVNFXzIyCUJJVCgxMikKKyNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfMjJfV1JJVEUJCSgoMSA8PCAxMCkgfCBHTE9CQUwyX1NNSV9PUF9CVVNZIHwgXAorCQkJCQkgR0xPQkFMMl9TTUlfT1BfQ0xBVVNFXzIyKQorI2RlZmluZSBHTE9CQUwyX1NNSV9PUF8yMl9SRUFECQkoKDIgPDwgMTApIHwgR0xPQkFMMl9TTUlfT1BfQlVTWSB8IFwKKwkJCQkJIEdMT0JBTDJfU01JX09QX0NMQVVTRV8yMikKKyNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfNDVfV1JJVEVfQUREUgkoKDAgPDwgMTApIHwgR0xPQkFMMl9TTUlfT1BfQlVTWSkKKyNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfNDVfV1JJVEVfREFUQQkoKDEgPDwgMTApIHwgR0xPQkFMMl9TTUlfT1BfQlVTWSkKKyNkZWZpbmUgR0xPQkFMMl9TTUlfT1BfNDVfUkVBRF9EQVRBCSgoMiA8PCAxMCkgfCBHTE9CQUwyX1NNSV9PUF9CVVNZKQorI2RlZmluZSBHTE9CQUwyX1NNSV9EQVRBCTB4MTkKKyNkZWZpbmUgR0xPQkFMMl9TQ1JBVENIX01JU0MJMHgxYQorI2RlZmluZSBHTE9CQUwyX1dET0dfQ09OVFJPTAkweDFiCisjZGVmaW5lIEdMT0JBTDJfUU9TX1dFSUdIVAkweDFjCisjZGVmaW5lIEdMT0JBTDJfTUlTQwkJMHgxZAogCiBzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUgewogCS8qIFdoZW4gdXNpbmcgbXVsdGktY2hpcCBhZGRyZXNzaW5nLCB0aGlzIG11dGV4IHByb3RlY3RzCkBAIC00OSw2ICsyMzksMTggQEAKIAlzdHJ1Y3QgbXV0ZXggZWVwcm9tX211dGV4OwogCiAJaW50CQlpZDsgLyogc3dpdGNoIHByb2R1Y3QgaWQgKi8KKwlpbnQJCW51bV9wb3J0czsJLyogbnVtYmVyIG9mIHN3aXRjaCBwb3J0cyAqLworCisJLyogaHcgYnJpZGdpbmcgKi8KKworCXUzMiBmaWRfbWFzazsKKwl1OCBmaWRbRFNBX01BWF9QT1JUU107CisJdTE2IGJyaWRnZV9tYXNrW0RTQV9NQVhfUE9SVFNdOworCisJdW5zaWduZWQgbG9uZyBwb3J0X3N0YXRlX3VwZGF0ZV9tYXNrOworCXU4IHBvcnRfc3RhdGVbRFNBX01BWF9QT1JUU107CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYnJpZGdlX3dvcms7CiB9OwogCiBzdHJ1Y3QgbXY4OGU2eHh4X2h3X3N0YXQgewpAQCAtNTcsNiArMjU5LDkgQEAKIAlpbnQgcmVnOwogfTsKIAoraW50IG12ODhlNnh4eF9zd2l0Y2hfcmVzZXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBib29sIHBwdV9hY3RpdmUpOworaW50IG12ODhlNnh4eF9zZXR1cF9wb3J0X2NvbW1vbihzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0KTsKK2ludCBtdjg4ZTZ4eHhfc2V0dXBfY29tbW9uKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7CiBpbnQgX19tdjg4ZTZ4eHhfcmVnX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHN3X2FkZHIsIGludCBhZGRyLCBpbnQgcmVnKTsKIGludCBtdjg4ZTZ4eHhfcmVnX3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZyk7CiBpbnQgX19tdjg4ZTZ4eHhfcmVnX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBzd19hZGRyLCBpbnQgYWRkciwKQEAgLTY1LDI0ICsyNzAsNDYgQEAKIGludCBtdjg4ZTZ4eHhfY29uZmlnX3ByaW8oc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKIGludCBtdjg4ZTZ4eHhfc2V0X2FkZHJfZGlyZWN0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgdTggKmFkZHIpOwogaW50IG12ODhlNnh4eF9zZXRfYWRkcl9pbmRpcmVjdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHU4ICphZGRyKTsKLWludCBtdjg4ZTZ4eHhfcGh5X3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgYWRkciwgaW50IHJlZ251bSk7Ci1pbnQgbXY4OGU2eHh4X3BoeV93cml0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnbnVtLCB1MTYgdmFsKTsKK2ludCBtdjg4ZTZ4eHhfcGh5X3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgaW50IHJlZ251bSk7CitpbnQgbXY4OGU2eHh4X3BoeV93cml0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCBpbnQgcmVnbnVtLCB1MTYgdmFsKTsKK2ludCBtdjg4ZTZ4eHhfcGh5X3JlYWRfaW5kaXJlY3Qoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgaW50IHJlZ251bSk7CitpbnQgbXY4OGU2eHh4X3BoeV93cml0ZV9pbmRpcmVjdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCBpbnQgcmVnbnVtLAorCQkJCSB1MTYgdmFsKTsKIHZvaWQgbXY4OGU2eHh4X3BwdV9zdGF0ZV9pbml0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7CiBpbnQgbXY4OGU2eHh4X3BoeV9yZWFkX3BwdShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnbnVtKTsKIGludCBtdjg4ZTZ4eHhfcGh5X3dyaXRlX3BwdShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLAogCQkJICAgIGludCByZWdudW0sIHUxNiB2YWwpOwogdm9pZCBtdjg4ZTZ4eHhfcG9sbF9saW5rKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7Ci12b2lkIG12ODhlNnh4eF9nZXRfc3RyaW5ncyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCi0JCQkgICBpbnQgbnJfc3RhdHMsIHN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCAqc3RhdHMsCi0JCQkgICBpbnQgcG9ydCwgdWludDhfdCAqZGF0YSk7Ci12b2lkIG12ODhlNnh4eF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCi0JCQkJIGludCBucl9zdGF0cywgc3RydWN0IG12ODhlNnh4eF9od19zdGF0ICpzdGF0cywKLQkJCQkgaW50IHBvcnQsIHVpbnQ2NF90ICpkYXRhKTsKK3ZvaWQgbXY4OGU2eHh4X2dldF9zdHJpbmdzKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHVpbnQ4X3QgKmRhdGEpOwordm9pZCBtdjg4ZTZ4eHhfZ2V0X2V0aHRvb2xfc3RhdHMoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgdWludDY0X3QgKmRhdGEpOworaW50IG12ODhlNnh4eF9nZXRfc3NldF9jb3VudChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOworaW50IG12ODhlNnh4eF9nZXRfc3NldF9jb3VudF9iYXNpYyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOwogaW50IG12ODhlNnh4eF9nZXRfcmVnc19sZW4oc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCk7CiB2b2lkIG12ODhlNnh4eF9nZXRfcmVncyhzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqX3ApOwogaW50ICBtdjg4ZTZ4eHhfZ2V0X3RlbXAoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgKnRlbXApOwotCitpbnQgbXY4OGU2eHh4X3BoeV93YWl0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7CitpbnQgbXY4OGU2eHh4X2VlcHJvbV9sb2FkX3dhaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKK2ludCBtdjg4ZTZ4eHhfZWVwcm9tX2J1c3lfd2FpdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOworaW50IG12ODhlNnh4eF9waHlfcmVhZF9pbmRpcmVjdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBhZGRyLCBpbnQgcmVnbnVtKTsKK2ludCBtdjg4ZTZ4eHhfcGh5X3dyaXRlX2luZGlyZWN0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IGFkZHIsIGludCByZWdudW0sCisJCQkJIHUxNiB2YWwpOworaW50IG12ODhlNnh4eF9nZXRfZWVlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHN0cnVjdCBldGh0b29sX2VlZSAqZSk7CitpbnQgbXY4OGU2eHh4X3NldF9lZWUoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJICAgICAgc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwgc3RydWN0IGV0aHRvb2xfZWVlICplKTsKK2ludCBtdjg4ZTZ4eHhfam9pbl9icmlkZ2Uoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgdTMyIGJyX3BvcnRfbWFzayk7CitpbnQgbXY4OGU2eHh4X2xlYXZlX2JyaWRnZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1MzIgYnJfcG9ydF9tYXNrKTsKK2ludCBtdjg4ZTZ4eHhfcG9ydF9zdHBfdXBkYXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsIHU4IHN0YXRlKTsKK2ludCBtdjg4ZTZ4eHhfcG9ydF9mZGJfYWRkKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkKTsKK2ludCBtdjg4ZTZ4eHhfcG9ydF9mZGJfZGVsKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkKTsKK2ludCBtdjg4ZTZ4eHhfcG9ydF9mZGJfZ2V0bmV4dChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgKmFkZHIsIGJvb2wgKmlzX3N0YXRpYyk7CitpbnQgbXY4OGU2eHh4X3BoeV9wYWdlX3JlYWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgaW50IHBhZ2UsIGludCByZWcpOworaW50IG12ODhlNnh4eF9waHlfcGFnZV93cml0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCBpbnQgcGFnZSwKKwkJCSAgICAgaW50IHJlZywgaW50IHZhbCk7CiBleHRlcm4gc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIG12ODhlNjEzMV9zd2l0Y2hfZHJpdmVyOwogZXh0ZXJuIHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciBtdjg4ZTYxMjNfNjFfNjVfc3dpdGNoX2RyaXZlcjsKIGV4dGVybiBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgbXY4OGU2MzUyX3N3aXRjaF9kcml2ZXI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZGkvYmZpbl9tYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkaS9iZmluX21hYy5jCmluZGV4IGVjMjA2MTEuLjA5NjUzMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkaS9iZmluX21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkaS9iZmluX21hYy5jCkBAIC05ODMsMTAgKzk4Myw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmZpbl9wdHBfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgc3RydWN0IHRpbWVzcGVjICp0cykKK3N0YXRpYyBpbnQgYmZpbl9wdHBfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXU2NCBuczsKLQl1MzIgcmVtYWluZGVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGJmaW5fbWFjX2xvY2FsICpscCA9CiAJCWNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBiZmluX21hY19sb2NhbCwgY2Fwcyk7CkBAIC05OTcsMjEgKzk5NiwyMCBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbHAtPnBoY19sb2NrLCBmbGFncyk7CiAKLQl0cy0+dHZfc2VjID0gZGl2X3U2NF9yZW0obnMsIDEwMDAwMDAwMDAsICZyZW1haW5kZXIpOwotCXRzLT50dl9uc2VjID0gcmVtYWluZGVyOworCSp0cyA9IG5zX3RvX3RpbWVzcGVjNjQobnMpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYmZpbl9wdHBfc2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCSAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMpCisJCQkgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJdTY0IG5zOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGJmaW5fbWFjX2xvY2FsICpscCA9CiAJCWNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBiZmluX21hY19sb2NhbCwgY2Fwcyk7CiAKLQlucyA9IHRzLT50dl9zZWMgKiAxMDAwMDAwMDAwVUxMOwotCW5zICs9IHRzLT50dl9uc2VjOworCW5zID0gdGltZXNwZWM2NF90b19ucyh0cyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbHAtPnBoY19sb2NrLCBmbGFncyk7CiAKQEAgLTEwMzksOCArMTAzNyw4IEBACiAJLnBwcwkJPSAwLAogCS5hZGpmcmVxCT0gYmZpbl9wdHBfYWRqZnJlcSwKIAkuYWRqdGltZQk9IGJmaW5fcHRwX2FkanRpbWUsCi0JLmdldHRpbWUJPSBiZmluX3B0cF9nZXR0aW1lLAotCS5zZXR0aW1lCT0gYmZpbl9wdHBfc2V0dGltZSwKKwkuZ2V0dGltZTY0CT0gYmZpbl9wdHBfZ2V0dGltZSwKKwkuc2V0dGltZTY0CT0gYmZpbl9wdHBfc2V0dGltZSwKIAkuZW5hYmxlCQk9IGJmaW5fcHRwX2VuYWJsZSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4L2dyZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC9ncmV0aC5jCmluZGV4IDJiOGJmZWUuLmFlODlkZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4L2dyZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWVyb2ZsZXgvZ3JldGguYwpAQCAtMTU4OCw3ICsxNTg4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgZ3JldGhfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGdyZXRoX29mX21hdGNoW10gPSB7CiAJewogCSAubmFtZSA9ICJHQUlTTEVSX0VUSE1BQyIsCiAJIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbGx3aW5uZXIvc3VuNGktZW1hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWxsd2lubmVyL3N1bjRpLWVtYWMuYwppbmRleCBmMzQ3MGQ5Li5iYWIwMWM4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWxsd2lubmVyL3N1bjRpLWVtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbGx3aW5uZXIvc3VuNGktZW1hYy5jCkBAIC03NTcsNyArNzU3LDcgQEAKIAkvKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHQgKi8KIAl3cml0ZWwoMCwgZGItPm1lbWJhc2UgKyBFTUFDX0lOVF9DVExfUkVHKTsKIAotCS8qIGNsZWFyIGludGVydXB0IHN0YXR1cyAqLworCS8qIGNsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KIAlyZWdfdmFsID0gcmVhZGwoZGItPm1lbWJhc2UgKyBFTUFDX0lOVF9TVEFfUkVHKTsKIAl3cml0ZWwocmVnX3ZhbCwgZGItPm1lbWJhc2UgKyBFTUFDX0lOVF9TVEFfUkVHKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWx0ZXJhL2FsdGVyYV90c2VfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWx0ZXJhL2FsdGVyYV90c2VfbWFpbi5jCmluZGV4IDY3MjVkYzAuLjc5ZWEzNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FsdGVyYS9hbHRlcmFfdHNlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbHRlcmEvYWx0ZXJhX3RzZV9tYWluLmMKQEAgLTg5LDcgKzg5LDcgQEAKIAogI2RlZmluZSBUWFFVRVVFU1RPUF9USFJFU0hIT0xECTIKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYWx0ZXJhX3RzZV9pZHNbXTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFsdGVyYV90c2VfaWRzW107CiAKIHN0YXRpYyBpbmxpbmUgdTMyIHRzZV90eF9hdmFpbChzdHJ1Y3QgYWx0ZXJhX3RzZV9wcml2YXRlICpwcml2KQogewpAQCAtMTA1LDExICsxMDUsMTEgQEAKIAogCS8qIHNldCBNRElPIGFkZHJlc3MgKi8KIAljc3J3cjMyKChtaWlfaWQgJiAweDFmKSwgcHJpdi0+bWFjX2RldiwKLQkJdHNlX2Nzcm9mZnMobWRpb19waHkwX2FkZHIpKTsKKwkJdHNlX2Nzcm9mZnMobWRpb19waHkxX2FkZHIpKTsKIAogCS8qIGdldCB0aGUgZGF0YSAqLwogCXJldHVybiBjc3JyZDMyKHByaXYtPm1hY19kZXYsCi0JCSAgICAgICB0c2VfY3Nyb2ZmcyhtZGlvX3BoeTApICsgcmVnbnVtICogNCkgJiAweGZmZmY7CisJCSAgICAgICB0c2VfY3Nyb2ZmcyhtZGlvX3BoeTEpICsgcmVnbnVtICogNCkgJiAweGZmZmY7CiB9CiAKIHN0YXRpYyBpbnQgYWx0ZXJhX3RzZV9tZGlvX3dyaXRlKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBtaWlfaWQsIGludCByZWdudW0sCkBAIC0xMjAsMTAgKzEyMCwxMCBAQAogCiAJLyogc2V0IE1ESU8gYWRkcmVzcyAqLwogCWNzcndyMzIoKG1paV9pZCAmIDB4MWYpLCBwcml2LT5tYWNfZGV2LAotCQl0c2VfY3Nyb2ZmcyhtZGlvX3BoeTBfYWRkcikpOworCQl0c2VfY3Nyb2ZmcyhtZGlvX3BoeTFfYWRkcikpOwogCiAJLyogd3JpdGUgdGhlIGRhdGEgKi8KLQljc3J3cjMyKHZhbHVlLCBwcml2LT5tYWNfZGV2LCB0c2VfY3Nyb2ZmcyhtZGlvX3BoeTApICsgcmVnbnVtICogNCk7CisJY3Nyd3IzMih2YWx1ZSwgcHJpdi0+bWFjX2RldiwgdHNlX2Nzcm9mZnMobWRpb19waHkxKSArIHJlZ251bSAqIDQpOwogCXJldHVybiAwOwogfQogCkBAIC0xMDk4LDggKzEwOTgsMTIgQEAKIAogCXNwaW5fbG9jaygmcHJpdi0+bWFjX2NmZ19sb2NrKTsKIAlyZXQgPSByZXNldF9tYWMocHJpdik7CisJLyogTm90ZSB0aGF0IHJlc2V0X21hYyB3aWxsIGZhaWwgaWYgdGhlIGNsb2NrcyBhcmUgZ2F0ZWQgYnkgdGhlIFBIWQorCSAqIGR1ZSB0byB0aGUgUEhZIGJlaW5nIHB1dCBpbnRvIGlzb2xhdGlvbiBvciBwb3dlciBkb3duIG1vZGUuCisJICogVGhpcyBpcyBub3QgYW4gZXJyb3IgaWYgcmVzZXQgZmFpbHMgZHVlIHRvIG5vIGNsb2NrLgorCSAqLwogCWlmIChyZXQpCi0JCW5ldGRldl9lcnIoZGV2LCAiQ2Fubm90IHJlc2V0IE1BQyBjb3JlIChlcnJvcjogJWQpXG4iLCByZXQpOworCQluZXRkZXZfZGJnKGRldiwgIkNhbm5vdCByZXNldCBNQUMgY29yZSAoZXJyb3I6ICVkKVxuIiwgcmV0KTsKIAogCXJldCA9IGluaXRfbWFjKHByaXYpOwogCXNwaW5fdW5sb2NrKCZwcml2LT5tYWNfY2ZnX2xvY2spOwpAQCAtMTIwMyw4ICsxMjA3LDEyIEBACiAJc3Bpbl9sb2NrKCZwcml2LT50eF9sb2NrKTsKIAogCXJldCA9IHJlc2V0X21hYyhwcml2KTsKKwkvKiBOb3RlIHRoYXQgcmVzZXRfbWFjIHdpbGwgZmFpbCBpZiB0aGUgY2xvY2tzIGFyZSBnYXRlZCBieSB0aGUgUEhZCisJICogZHVlIHRvIHRoZSBQSFkgYmVpbmcgcHV0IGludG8gaXNvbGF0aW9uIG9yIHBvd2VyIGRvd24gbW9kZS4KKwkgKiBUaGlzIGlzIG5vdCBhbiBlcnJvciBpZiByZXNldCBmYWlscyBkdWUgdG8gbm8gY2xvY2suCisJICovCiAJaWYgKHJldCkKLQkJbmV0ZGV2X2VycihkZXYsICJDYW5ub3QgcmVzZXQgTUFDIGNvcmUgKGVycm9yOiAlZClcbiIsIHJldCk7CisJCW5ldGRldl9kYmcoZGV2LCAiQ2Fubm90IHJlc2V0IE1BQyBjb3JlIChlcnJvcjogJWQpXG4iLCByZXQpOwogCXByaXYtPmRtYW9wcy0+cmVzZXRfZG1hKHByaXYpOwogCWZyZWVfc2tidWZzKGRldik7CiAKQEAgLTE1NjgsNyArMTU3Niw3IEBACiAJLnN0YXJ0X3J4ZG1hID0gbXNnZG1hX3N0YXJ0X3J4ZG1hLAogfTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYWx0ZXJhX3RzZV9pZHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFsdGVyYV90c2VfaWRzW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhbHRyLHRzZS1tc2dkbWEtMS4wIiwgLmRhdGEgPSAmYWx0ZXJhX2R0eXBlX21zZ2RtYSwgfSwKIAl7IC5jb21wYXRpYmxlID0gImFsdHIsdHNlLTEuMCIsIC5kYXRhID0gJmFsdGVyYV9kdHlwZV9zZ2RtYSwgfSwKIAl7IC5jb21wYXRpYmxlID0gIkFMVFIsdHNlLTEuMCIsIC5kYXRhID0gJmFsdGVyYV9kdHlwZV9zZ2RtYSwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hbWQ4MTExZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmMKaW5kZXggNGMyYWUyMi4uOTQ5NjAwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmMKQEAgLTcyMywxMyArNzIzLDEzIEBACiAJCQkgKiB0aGUgbGFzdCBjb3JyZWN0bHkgbm90aW5nIHRoZSBlcnJvci4KIAkJCSAqLwogCQkJaWYoc3RhdHVzICYgRVJSX0JJVCkgewotCQkJCS8qIHJlc2V0aW5nIGZsYWdzICovCisJCQkJLyogcmVzZXR0aW5nIGZsYWdzICovCiAJCQkJbHAtPnJ4X3JpbmdbcnhfaW5kZXhdLnJ4X2ZsYWdzICY9IFJFU0VUX1JYX0ZMQUdTOwogCQkJCWdvdG8gZXJyX25leHRfcGt0OwogCQkJfQogCQkJLyogY2hlY2sgZm9yIFNUUCBhbmQgRU5QICovCiAJCQlpZighKChzdGF0dXMgJiBTVFBfQklUKSAmJiAoc3RhdHVzICYgRU5QX0JJVCkpKXsKLQkJCQkvKiByZXNldGluZyBmbGFncyAqLworCQkJCS8qIHJlc2V0dGluZyBmbGFncyAqLwogCQkJCWxwLT5yeF9yaW5nW3J4X2luZGV4XS5yeF9mbGFncyAmPSBSRVNFVF9SWF9GTEFHUzsKIAkJCQlnb3RvIGVycl9uZXh0X3BrdDsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hbWQ4MTExZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmgKaW5kZXggYTc1MDkyZC4uN2NkYjE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmgKQEAgLTYxNCw3ICs2MTQsNyBAQAogLyogQXNzdW1lIGNvbnRvbGxlciBnZXRzIGRhdGEgMTAgdGltZXMgdGhlIG1heGltdW0gcHJvY2Vzc2luZyB0aW1lICovCiAjZGVmaW5lICBSRVBFQVRfQ05UCQkJMTAKIAotLyogYW1kODExMWUgZGVjcmlwdG9yIGZsYWcgZGVmaW5pdGlvbnMgKi8KKy8qIGFtZDgxMTFlIGRlc2NyaXB0b3IgZmxhZyBkZWZpbml0aW9ucyAqLwogdHlwZWRlZiBlbnVtIHsKIAogCU9XTl9CSVQJCT0JKDEgPDwgMTUpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3BjbmV0MzIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9wY25ldDMyLmMKaW5kZXggMTFkNmU2NS4uYmM4YjA0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3BjbmV0MzIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvcGNuZXQzMi5jCkBAIC0xNTQzLDcgKzE1NDMsNyBAQAogewogCXN0cnVjdCBwY25ldDMyX3ByaXZhdGUgKmxwOwogCWludCBpLCBtZWRpYTsKLQlpbnQgZmR4LCBtaWksIGZzZXQsIGR4c3VmbG87CisJaW50IGZkeCwgbWlpLCBmc2V0LCBkeHN1ZmxvLCBzcmFtOwogCWludCBjaGlwX3ZlcnNpb247CiAJY2hhciAqY2hpcG5hbWU7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKQEAgLTE1ODAsNyArMTU4MCw3IEBACiAJfQogCiAJLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KLQlmZHggPSBtaWkgPSBmc2V0ID0gZHhzdWZsbyA9IDA7CisJZmR4ID0gbWlpID0gZnNldCA9IGR4c3VmbG8gPSBzcmFtID0gMDsKIAljaGlwX3ZlcnNpb24gPSAoY2hpcF92ZXJzaW9uID4+IDEyKSAmIDB4ZmZmZjsKIAogCXN3aXRjaCAoY2hpcF92ZXJzaW9uKSB7CkBAIC0xNjEzLDYgKzE2MTMsNyBAQAogCQljaGlwbmFtZSA9ICJQQ25ldC9GQVNUIElJSSA3OUM5NzMiOwkvKiBQQ0kgKi8KIAkJZmR4ID0gMTsKIAkJbWlpID0gMTsKKwkJc3JhbSA9IDE7CiAJCWJyZWFrOwogCWNhc2UgMHgyNjI2OgogCQljaGlwbmFtZSA9ICJQQ25ldC9Ib21lIDc5Qzk3OCI7CS8qIFBDSSAqLwpAQCAtMTYzNiw2ICsxNjM3LDcgQEAKIAkJY2hpcG5hbWUgPSAiUENuZXQvRkFTVCBJSUkgNzlDOTc1IjsJLyogUENJICovCiAJCWZkeCA9IDE7CiAJCW1paSA9IDE7CisJCXNyYW0gPSAxOwogCQlicmVhazsKIAljYXNlIDB4MjYyODoKIAkJY2hpcG5hbWUgPSAiUENuZXQvUFJPIDc5Qzk3NiI7CkBAIC0xNjY0LDYgKzE2NjYsMzEgQEAKIAkJZHhzdWZsbyA9IDE7CiAJfQogCisJLyoKKwkgKiBUaGUgQW03OUM5NzMvQW03OUM5NzUgY29udHJvbGxlcnMgY29tZSB3aXRoIDEySyBvZiBTUkFNCisJICogd2hpY2ggd2UgY2FuIHVzZSBmb3IgdGhlIFR4L1J4IGJ1ZmZlcnMgYnV0IG1vc3QgaW1wb3J0YW50bHksCisJICogdGhlIHVzZSBvZiBTUkFNIGFsbG93IHVzIHRvIHVzZSB0aGUgQkNSMTg6Tk9VRkxPIGJpdCB0byBhdm9pZAorCSAqIFR4IGZpZm8gdW5kZXJmbG93cy4KKwkgKi8KKwlpZiAoc3JhbSkgeworCQkvKgorCQkgKiBUaGUgU1JBTSBpcyBiZWluZyBjb25maWd1cmVkIGluIHR3byBzdGVwcy4gRmlyc3Qgd2UKKwkJICogc2V0IHRoZSBTUkFNIHNpemUgaW4gdGhlIEJDUjI1OlNSQU1fU0laRSBiaXRzLiBBY2NvcmRpbmcKKwkJICogdG8gdGhlIGRhdGFzaGVldCwgZWFjaCBiaXQgY29ycmVzcG9uZHMgdG8gYSA1MTItYnl0ZQorCQkgKiBwYWdlIHNvIHdlIGNhbiBoYXZlIGF0IG1vc3QgMjQgcGFnZXMuIFRoZSBTUkFNX1NJWkUKKwkJICogaG9sZHMgdGhlIHZhbHVlIG9mIHRoZSB1cHBlciA4IGJpdHMgb2YgdGhlIDE2LWJpdCBTUkFNIHNpemUuCisJCSAqIFRoZSBsb3cgOC1iaXRzIHN0YXJ0IGF0IDB4MDAgYW5kIGVuZCBhdCAweGZmLiBTbyB0aGUKKwkJICogYWRkcmVzcyByYW5nZSBpcyBmcm9tIDB4MDAwMCB1cCB0byAweDE3ZmYuIFRoZXJlZm9yZSwKKwkJICogdGhlIFNSQU1fU0laRSBpcyBzZXQgdG8gMHgxNy4gVGhlIG5leHQgc3RlcCBpcyB0byBzZXQKKwkJICogdGhlIEJDUjI2OlNSQU1fQk5EIG1pZHdheSB0aHJvdWdoIHNvIHRoZSBUeCBhbmQgUngKKwkJICogYnVmZmVycyBjYW4gc2hhcmUgdGhlIFNSQU0gZXF1YWxseS4KKwkJICovCisJCWEtPndyaXRlX2Jjcihpb2FkZHIsIDI1LCAweDE3KTsKKwkJYS0+d3JpdGVfYmNyKGlvYWRkciwgMjYsIDB4Yyk7CisJCS8qIEFuZCBmaW5hbGx5IGVuYWJsZSB0aGUgTk9VRkxPIGJpdCAqLworCQlhLT53cml0ZV9iY3IoaW9hZGRyLCAxOCwgYS0+cmVhZF9iY3IoaW9hZGRyLCAxOCkgfCAoMSA8PCAxMSkpOworCX0KKwogCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZigqbHApKTsKIAlpZiAoIWRldikgewogCQlyZXQgPSAtRU5PTUVNOwpAQCAtMTcwOCw3ICsxNzM1LDcgQEAKIAogCS8qIGlmIHRoZSBldGhlcm5ldCBhZGRyZXNzIGlzIG5vdCB2YWxpZCwgZm9yY2UgdG8gMDA6MDA6MDA6MDA6MDA6MDAgKi8KIAlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcikpCi0JCW1lbXNldChkZXYtPmRldl9hZGRyLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIoZGV2LT5kZXZfYWRkcik7CiAKIAlpZiAocGNuZXQzMl9kZWJ1ZyAmIE5FVElGX01TR19QUk9CRSkgewogCQlwcl9jb250KCIgJXBNIiwgZGV2LT5kZXZfYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWNvbW1vbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1jb21tb24uaAppbmRleCAyOWEwOTI3Li4zNGMyOGFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWNvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtY29tbW9uLmgKQEAgLTM2NSw2ICszNjUsOCBAQAogI2RlZmluZSBNQUNfSFdGMFJfVFhDT0VTRUxfV0lEVEgJMQogI2RlZmluZSBNQUNfSFdGMFJfVkxIQVNIX0lOREVYCQk0CiAjZGVmaW5lIE1BQ19IV0YwUl9WTEhBU0hfV0lEVEgJCTEKKyNkZWZpbmUgTUFDX0hXRjFSX0FERFI2NF9JTkRFWAkJMTQKKyNkZWZpbmUgTUFDX0hXRjFSX0FERFI2NF9XSURUSAkJMgogI2RlZmluZSBNQUNfSFdGMVJfQURWVEhXT1JEX0lOREVYCTEzCiAjZGVmaW5lIE1BQ19IV0YxUl9BRFZUSFdPUkRfV0lEVEgJMQogI2RlZmluZSBNQUNfSFdGMVJfREJHTUVNQV9JTkRFWAkJMTkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWRldi5jCmluZGV4IDQwMDc1N2IuLjIxZDk0OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1kZXYuYwpAQCAtODUzLDYgKzg1MywyMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHhnYmVfY29uZmlnX3J4X21vZGUoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwZGF0YS0+bmV0ZGV2OworCXVuc2lnbmVkIGludCBwcl9tb2RlLCBhbV9tb2RlOworCisJcHJfbW9kZSA9ICgobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSAhPSAwKTsKKwlhbV9tb2RlID0gKChuZXRkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSAhPSAwKTsKKworCXhnYmVfc2V0X3Byb21pc2N1b3VzX21vZGUocGRhdGEsIHByX21vZGUpOworCXhnYmVfc2V0X2FsbF9tdWx0aWNhc3RfbW9kZShwZGF0YSwgYW1fbW9kZSk7CisKKwl4Z2JlX2FkZF9tYWNfYWRkcmVzc2VzKHBkYXRhKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHhnYmVfcmVhZF9tbWRfcmVncyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEsIGludCBwcnRhZCwKIAkJCSAgICAgIGludCBtbWRfcmVnKQogewpAQCAtMTA2OCw3ICsxMDg0LDcgQEAKIAlyZGVzYy0+ZGVzYzMgPSAwOwogCiAJLyogTWFrZSBzdXJlIG93bmVyc2hpcCBpcyB3cml0dGVuIHRvIHRoZSBkZXNjcmlwdG9yICovCi0Jd21iKCk7CisJZG1hX3dtYigpOwogfQogCiBzdGF0aWMgdm9pZCB4Z2JlX3R4X2Rlc2NfaW5pdChzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsKQpAQCAtMTEwMSw5ICsxMTE3LDI0IEBACiAJREJHUFIoIjwtLXR4X2Rlc2NfaW5pdFxuIik7CiB9CiAKLXN0YXRpYyB2b2lkIHhnYmVfcnhfZGVzY19yZXNldChzdHJ1Y3QgeGdiZV9yaW5nX2RhdGEgKnJkYXRhKQorc3RhdGljIHZvaWQgeGdiZV9yeF9kZXNjX3Jlc2V0KHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSwKKwkJCSAgICAgICBzdHJ1Y3QgeGdiZV9yaW5nX2RhdGEgKnJkYXRhLCB1bnNpZ25lZCBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IHhnYmVfcmluZ19kZXNjICpyZGVzYyA9IHJkYXRhLT5yZGVzYzsKKwl1bnNpZ25lZCBpbnQgcnhfdXNlY3MgPSBwZGF0YS0+cnhfdXNlY3M7CisJdW5zaWduZWQgaW50IHJ4X2ZyYW1lcyA9IHBkYXRhLT5yeF9mcmFtZXM7CisJdW5zaWduZWQgaW50IGludGU7CisKKwlpZiAoIXJ4X3VzZWNzICYmICFyeF9mcmFtZXMpIHsKKwkJLyogTm8gY29hbGVzY2luZywgaW50ZXJydXB0IGZvciBldmVyeSBkZXNjcmlwdG9yICovCisJCWludGUgPSAxOworCX0gZWxzZSB7CisJCS8qIFNldCBpbnRlcnJ1cHQgYmFzZWQgb24gUnggZnJhbWUgY29hbGVzY2luZyBzZXR0aW5nICovCisJCWlmIChyeF9mcmFtZXMgJiYgISgoaW5kZXggKyAxKSAlIHJ4X2ZyYW1lcykpCisJCQlpbnRlID0gMTsKKwkJZWxzZQorCQkJaW50ZSA9IDA7CisJfQogCiAJLyogUmVzZXQgdGhlIFJ4IGRlc2NyaXB0b3IKIAkgKiAgIFNldCBidWZmZXIgMSAobG8pIGFkZHJlc3MgdG8gaGVhZGVyIGRtYSBhZGRyZXNzIChsbykKQEAgLTExMTcsMTkgKzExNDgsMTggQEAKIAlyZGVzYy0+ZGVzYzIgPSBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKHJkYXRhLT5yeC5idWYuZG1hKSk7CiAJcmRlc2MtPmRlc2MzID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhyZGF0YS0+cnguYnVmLmRtYSkpOwogCi0JWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBSWF9OT1JNQUxfREVTQzMsIElOVEUsCi0JCQkgIHJkYXRhLT5pbnRlcnJ1cHQgPyAxIDogMCk7CisJWEdNQUNfU0VUX0JJVFNfTEUocmRlc2MtPmRlc2MzLCBSWF9OT1JNQUxfREVTQzMsIElOVEUsIGludGUpOwogCiAJLyogU2luY2UgdGhlIFJ4IERNQSBlbmdpbmUgaXMgbGlrZWx5IHJ1bm5pbmcsIG1ha2Ugc3VyZSBldmVyeXRoaW5nCiAJICogaXMgd3JpdHRlbiB0byB0aGUgZGVzY3JpcHRvcihzKSBiZWZvcmUgc2V0dGluZyB0aGUgT1dOIGJpdAogCSAqIGZvciB0aGUgZGVzY3JpcHRvcgogCSAqLwotCXdtYigpOworCWRtYV93bWIoKTsKIAogCVhHTUFDX1NFVF9CSVRTX0xFKHJkZXNjLT5kZXNjMywgUlhfTk9STUFMX0RFU0MzLCBPV04sIDEpOwogCiAJLyogTWFrZSBzdXJlIG93bmVyc2hpcCBpcyB3cml0dGVuIHRvIHRoZSBkZXNjcmlwdG9yICovCi0Jd21iKCk7CisJZG1hX3dtYigpOwogfQogCiBzdGF0aWMgdm9pZCB4Z2JlX3J4X2Rlc2NfaW5pdChzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsKQpAQCAtMTEzOCwyNiArMTE2OCwxNiBAQAogCXN0cnVjdCB4Z2JlX3JpbmcgKnJpbmcgPSBjaGFubmVsLT5yeF9yaW5nOwogCXN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqcmRhdGE7CiAJdW5zaWduZWQgaW50IHN0YXJ0X2luZGV4ID0gcmluZy0+Y3VyOwotCXVuc2lnbmVkIGludCByeF9jb2FsZXNjZSwgcnhfZnJhbWVzOwogCXVuc2lnbmVkIGludCBpOwogCiAJREJHUFIoIi0tPnJ4X2Rlc2NfaW5pdFxuIik7CiAKLQlyeF9jb2FsZXNjZSA9IChwZGF0YS0+cnhfcml3dCB8fCBwZGF0YS0+cnhfZnJhbWVzKSA/IDEgOiAwOwotCXJ4X2ZyYW1lcyA9IHBkYXRhLT5yeF9mcmFtZXM7Ci0KIAkvKiBJbml0aWFsaXplIGFsbCBkZXNjcmlwdG9ycyAqLwogCWZvciAoaSA9IDA7IGkgPCByaW5nLT5yZGVzY19jb3VudDsgaSsrKSB7CiAJCXJkYXRhID0gWEdCRV9HRVRfREVTQ19EQVRBKHJpbmcsIGkpOwogCi0JCS8qIFNldCBpbnRlcnJ1cHQgb24gY29tcGxldGlvbiBiaXQgYXMgYXBwcm9wcmlhdGUgKi8KLQkJaWYgKHJ4X2NvYWxlc2NlICYmICghcnhfZnJhbWVzIHx8ICgoaSArIDEpICUgcnhfZnJhbWVzKSkpCi0JCQlyZGF0YS0+aW50ZXJydXB0ID0gMDsKLQkJZWxzZQotCQkJcmRhdGEtPmludGVycnVwdCA9IDE7Ci0KIAkJLyogSW5pdGlhbGl6ZSBSeCBkZXNjcmlwdG9yICovCi0JCXhnYmVfcnhfZGVzY19yZXNldChyZGF0YSk7CisJCXhnYmVfcnhfZGVzY19yZXNldChwZGF0YSwgcmRhdGEsIGkpOwogCX0KIAogCS8qIFVwZGF0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIFJ4IGRlc2NyaXB0b3JzICovCkBAIC0xMzU4LDE4ICsxMzc4LDIwIEBACiAJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gY2hhbm5lbC0+cGRhdGE7CiAJc3RydWN0IHhnYmVfcmluZ19kYXRhICpyZGF0YTsKIAorCS8qIE1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSByZWdpc3RlciB3cml0ZSAqLworCXdtYigpOworCiAJLyogSXNzdWUgYSBwb2xsIGNvbW1hbmQgdG8gVHggRE1BIGJ5IHdyaXRpbmcgYWRkcmVzcwogCSAqIG9mIG5leHQgaW1tZWRpYXRlIGZyZWUgZGVzY3JpcHRvciAqLwogCXJkYXRhID0gWEdCRV9HRVRfREVTQ19EQVRBKHJpbmcsIHJpbmctPmN1cik7CiAJWEdNQUNfRE1BX0lPV1JJVEUoY2hhbm5lbCwgRE1BX0NIX1REVFJfTE8sCiAJCQkgIGxvd2VyXzMyX2JpdHMocmRhdGEtPnJkZXNjX2RtYSkpOwogCi0JLyogU3RhcnQgdGhlIFR4IGNvYWxlc2NpbmcgdGltZXIgKi8KKwkvKiBTdGFydCB0aGUgVHggdGltZXIgKi8KIAlpZiAocGRhdGEtPnR4X3VzZWNzICYmICFjaGFubmVsLT50eF90aW1lcl9hY3RpdmUpIHsKIAkJY2hhbm5lbC0+dHhfdGltZXJfYWN0aXZlID0gMTsKLQkJaHJ0aW1lcl9zdGFydCgmY2hhbm5lbC0+dHhfdGltZXIsCi0JCQkgICAgICBrdGltZV9zZXQoMCwgcGRhdGEtPnR4X3VzZWNzICogTlNFQ19QRVJfVVNFQyksCi0JCQkgICAgICBIUlRJTUVSX01PREVfUkVMKTsKKwkJbW9kX3RpbWVyKCZjaGFubmVsLT50eF90aW1lciwKKwkJCSAgamlmZmllcyArIHVzZWNzX3RvX2ppZmZpZXMocGRhdGEtPnR4X3VzZWNzKSk7CiAJfQogCiAJcmluZy0+dHgueG1pdF9tb3JlID0gMDsKQEAgLTE1NjUsNyArMTU4Nyw3IEBACiAJICogaXMgd3JpdHRlbiB0byB0aGUgZGVzY3JpcHRvcihzKSBiZWZvcmUgc2V0dGluZyB0aGUgT1dOIGJpdAogCSAqIGZvciB0aGUgZmlyc3QgZGVzY3JpcHRvcgogCSAqLwotCXdtYigpOworCWRtYV93bWIoKTsKIAogCS8qIFNldCBPV04gYml0IGZvciB0aGUgZmlyc3QgZGVzY3JpcHRvciAqLwogCXJkYXRhID0gWEdCRV9HRVRfREVTQ19EQVRBKHJpbmcsIHN0YXJ0X2luZGV4KTsKQEAgLTE1NzcsNyArMTU5OSw3IEBACiAjZW5kaWYKIAogCS8qIE1ha2Ugc3VyZSBvd25lcnNoaXAgaXMgd3JpdHRlbiB0byB0aGUgZGVzY3JpcHRvciAqLwotCXdtYigpOworCWRtYV93bWIoKTsKIAogCXJpbmctPmN1ciA9IGN1cl9pbmRleCArIDE7CiAJaWYgKCFwYWNrZXQtPnNrYi0+eG1pdF9tb3JlIHx8CkBAIC0xNjEzLDcgKzE2MzUsNyBAQAogCQlyZXR1cm4gMTsKIAogCS8qIE1ha2Ugc3VyZSBkZXNjcmlwdG9yIGZpZWxkcyBhcmUgcmVhZCBhZnRlciByZWFkaW5nIHRoZSBPV04gYml0ICovCi0Jcm1iKCk7CisJZG1hX3JtYigpOwogCiAjaWZkZWYgWEdNQUNfRU5BQkxFX1JYX0RFU0NfRFVNUAogCXhnYmVfZHVtcF9yeF9kZXNjKHJpbmcsIHJkZXNjLCByaW5nLT5jdXIpOwpAQCAtMjAwNCw3ICsyMDI2LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPnR4X3FfY291bnQ7IGkrKykKIAkJWEdNQUNfTVRMX0lPV1JJVEVfQklUUyhwZGF0YSwgaSwgTVRMX1FfVFFPTVIsIFRRUywgZmlmb19zaXplKTsKIAotCW5ldGRldl9ub3RpY2UocGRhdGEtPm5ldGRldiwgIiVkIFR4IHF1ZXVlcywgJWQgYnl0ZSBmaWZvIHBlciBxdWV1ZVxuIiwKKwluZXRkZXZfbm90aWNlKHBkYXRhLT5uZXRkZXYsCisJCSAgICAgICIlZCBUeCBoYXJkd2FyZSBxdWV1ZXMsICVkIGJ5dGUgZmlmbyBwZXIgcXVldWVcbiIsCiAJCSAgICAgIHBkYXRhLT50eF9xX2NvdW50LCAoKGZpZm9fc2l6ZSArIDEpICogMjU2KSk7CiB9CiAKQEAgLTIwMTksNyArMjA0Miw4IEBACiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5yeF9xX2NvdW50OyBpKyspCiAJCVhHTUFDX01UTF9JT1dSSVRFX0JJVFMocGRhdGEsIGksIE1UTF9RX1JRT01SLCBSUVMsIGZpZm9fc2l6ZSk7CiAKLQluZXRkZXZfbm90aWNlKHBkYXRhLT5uZXRkZXYsICIlZCBSeCBxdWV1ZXMsICVkIGJ5dGUgZmlmbyBwZXIgcXVldWVcbiIsCisJbmV0ZGV2X25vdGljZShwZGF0YS0+bmV0ZGV2LAorCQkgICAgICAiJWQgUnggaGFyZHdhcmUgcXVldWVzLCAlZCBieXRlIGZpZm8gcGVyIHF1ZXVlXG4iLAogCQkgICAgICBwZGF0YS0+cnhfcV9jb3VudCwgKChmaWZvX3NpemUgKyAxKSAqIDI1NikpOwogfQogCkBAIC0yODAwLDYgKzI4MjQsNyBAQAogCSAqIEluaXRpYWxpemUgTUFDIHJlbGF0ZWQgZmVhdHVyZXMKIAkgKi8KIAl4Z2JlX2NvbmZpZ19tYWNfYWRkcmVzcyhwZGF0YSk7CisJeGdiZV9jb25maWdfcnhfbW9kZShwZGF0YSk7CiAJeGdiZV9jb25maWdfanVtYm9fZW5hYmxlKHBkYXRhKTsKIAl4Z2JlX2NvbmZpZ19mbG93X2NvbnRyb2wocGRhdGEpOwogCXhnYmVfY29uZmlnX21hY19zcGVlZChwZGF0YSk7CkBAIC0yODE5LDEwICsyODQ0LDggQEAKIAogCWh3X2lmLT50eF9jb21wbGV0ZSA9IHhnYmVfdHhfY29tcGxldGU7CiAKLQlod19pZi0+c2V0X3Byb21pc2N1b3VzX21vZGUgPSB4Z2JlX3NldF9wcm9taXNjdW91c19tb2RlOwotCWh3X2lmLT5zZXRfYWxsX211bHRpY2FzdF9tb2RlID0geGdiZV9zZXRfYWxsX211bHRpY2FzdF9tb2RlOwotCWh3X2lmLT5hZGRfbWFjX2FkZHJlc3NlcyA9IHhnYmVfYWRkX21hY19hZGRyZXNzZXM7CiAJaHdfaWYtPnNldF9tYWNfYWRkcmVzcyA9IHhnYmVfc2V0X21hY19hZGRyZXNzOworCWh3X2lmLT5jb25maWdfcnhfbW9kZSA9IHhnYmVfY29uZmlnX3J4X21vZGU7CiAKIAlod19pZi0+ZW5hYmxlX3J4X2NzdW0gPSB4Z2JlX2VuYWJsZV9yeF9jc3VtOwogCWh3X2lmLT5kaXNhYmxlX3J4X2NzdW0gPSB4Z2JlX2Rpc2FibGVfcnhfY3N1bTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZHJ2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWRydi5jCmluZGV4IDg4NWIwMmIuLmRiODRkZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1kcnYuYwpAQCAtMTI5LDcgKzEyOSw2IEBACiAKIHN0YXRpYyBpbnQgeGdiZV9vbmVfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KTsKIHN0YXRpYyBpbnQgeGdiZV9hbGxfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KTsKLXN0YXRpYyB2b2lkIHhnYmVfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKik7CiAKIHN0YXRpYyBpbnQgeGdiZV9hbGxvY19jaGFubmVscyhzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEpCiB7CkBAIC00MTEsMTEgKzQxMCw5IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCi1zdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgeGdiZV90eF90aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCitzdGF0aWMgdm9pZCB4Z2JlX3R4X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgeGdiZV9jaGFubmVsICpjaGFubmVsID0gY29udGFpbmVyX29mKHRpbWVyLAotCQkJCQkJICAgIHN0cnVjdCB4Z2JlX2NoYW5uZWwsCi0JCQkJCQkgICAgdHhfdGltZXIpOworCXN0cnVjdCB4Z2JlX2NoYW5uZWwgKmNoYW5uZWwgPSAoc3RydWN0IHhnYmVfY2hhbm5lbCAqKWRhdGE7CiAJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gY2hhbm5lbC0+cGRhdGE7CiAJc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpOwogCkBAIC00MzcsOCArNDM0LDYgQEAKIAljaGFubmVsLT50eF90aW1lcl9hY3RpdmUgPSAwOwogCiAJREJHUFIoIjwtLXhnYmVfdHhfdGltZXJcbiIpOwotCi0JcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwogfQogCiBzdGF0aWMgdm9pZCB4Z2JlX2luaXRfdHhfdGltZXJzKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSkKQEAgLTQ1NCw5ICs0NDksOCBAQAogCQkJYnJlYWs7CiAKIAkJREJHUFIoIiAgJXMgYWRkaW5nIHR4IHRpbWVyXG4iLCBjaGFubmVsLT5uYW1lKTsKLQkJaHJ0aW1lcl9pbml0KCZjaGFubmVsLT50eF90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLAotCQkJICAgICBIUlRJTUVSX01PREVfUkVMKTsKLQkJY2hhbm5lbC0+dHhfdGltZXIuZnVuY3Rpb24gPSB4Z2JlX3R4X3RpbWVyOworCQlzZXR1cF90aW1lcigmY2hhbm5lbC0+dHhfdGltZXIsIHhnYmVfdHhfdGltZXIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpY2hhbm5lbCk7CiAJfQogCiAJREJHUFIoIjwtLXhnYmVfaW5pdF90eF90aW1lcnNcbiIpOwpAQCAtNDc1LDggKzQ2OSw3IEBACiAJCQlicmVhazsKIAogCQlEQkdQUigiICAlcyBkZWxldGluZyB0eCB0aW1lclxuIiwgY2hhbm5lbC0+bmFtZSk7Ci0JCWNoYW5uZWwtPnR4X3RpbWVyX2FjdGl2ZSA9IDA7Ci0JCWhydGltZXJfY2FuY2VsKCZjaGFubmVsLT50eF90aW1lcik7CisJCWRlbF90aW1lcl9zeW5jKCZjaGFubmVsLT50eF90aW1lcik7CiAJfQogCiAJREJHUFIoIjwtLXhnYmVfc3RvcF90eF90aW1lcnNcbiIpOwpAQCAtNTE5LDYgKzUxMiw3IEBACiAJCQkJCQlSWEZJRk9TSVpFKTsKIAlod19mZWF0LT50eF9maWZvX3NpemUgID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjEsIE1BQ19IV0YxUiwKIAkJCQkJCVRYRklGT1NJWkUpOworCWh3X2ZlYXQtPmRtYV93aWR0aCAgICAgPSBYR01BQ19HRVRfQklUUyhtYWNfaGZyMSwgTUFDX0hXRjFSLCBBRERSNjQpOwogCWh3X2ZlYXQtPmRjYiAgICAgICAgICAgPSBYR01BQ19HRVRfQklUUyhtYWNfaGZyMSwgTUFDX0hXRjFSLCBEQ0JFTik7CiAJaHdfZmVhdC0+c3BoICAgICAgICAgICA9IFhHTUFDX0dFVF9CSVRTKG1hY19oZnIxLCBNQUNfSFdGMVIsIFNQSEVOKTsKIAlod19mZWF0LT50c28gICAgICAgICAgID0gWEdNQUNfR0VUX0JJVFMobWFjX2hmcjEsIE1BQ19IV0YxUiwgVFNPRU4pOwpAQCAtNTUzLDYgKzU0NywyMSBAQAogCQlicmVhazsKIAl9CiAKKwkvKiBUcmFuc2xhdGUgdGhlIGFkZHJlc3Mgd2lkdGggc2V0dGluZyBpbnRvIGFjdHVhbCBudW1iZXIgKi8KKwlzd2l0Y2ggKGh3X2ZlYXQtPmRtYV93aWR0aCkgeworCWNhc2UgMDoKKwkJaHdfZmVhdC0+ZG1hX3dpZHRoID0gMzI7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaHdfZmVhdC0+ZG1hX3dpZHRoID0gNDA7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaHdfZmVhdC0+ZG1hX3dpZHRoID0gNDg7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWh3X2ZlYXQtPmRtYV93aWR0aCA9IDMyOworCX0KKwogCS8qIFRoZSBRdWV1ZSwgQ2hhbm5lbCBhbmQgVEMgY291bnRzIGFyZSB6ZXJvIGJhc2VkIHNvIGluY3JlbWVudCB0aGVtCiAJICogdG8gZ2V0IHRoZSBhY3R1YWwgbnVtYmVyCiAJICovCkBAIC02OTIsNiArNzAxLDcgQEAKIAlEQkdQUigiLS0+eGdiZV9pbml0X3J4X2NvYWxlc2NlXG4iKTsKIAogCXBkYXRhLT5yeF9yaXd0ID0gaHdfaWYtPnVzZWNfdG9fcml3dChwZGF0YSwgWEdNQUNfSU5JVF9ETUFfUlhfVVNFQ1MpOworCXBkYXRhLT5yeF91c2VjcyA9IFhHTUFDX0lOSVRfRE1BX1JYX1VTRUNTOwogCXBkYXRhLT5yeF9mcmFtZXMgPSBYR01BQ19JTklUX0RNQV9SWF9GUkFNRVM7CiAKIAlod19pZi0+Y29uZmlnX3J4X2NvYWxlc2NlKHBkYXRhKTsKQEAgLTk0MSw4ICs5NTEsNiBAQAogCiAJREJHUFIoIi0tPnhnYmVfc3RhcnRcbiIpOwogCi0JeGdiZV9zZXRfcnhfbW9kZShuZXRkZXYpOwotCiAJaHdfaWYtPmluaXQocGRhdGEpOwogCiAJcGh5X3N0YXJ0KHBkYXRhLT5waHlkZXYpOwpAQCAtMTUyMiwxNyArMTUzMCwxMCBAQAogewogCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKLQl1bnNpZ25lZCBpbnQgcHJfbW9kZSwgYW1fbW9kZTsKIAogCURCR1BSKCItLT54Z2JlX3NldF9yeF9tb2RlXG4iKTsKIAotCXByX21vZGUgPSAoKG5ldGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgIT0gMCk7Ci0JYW1fbW9kZSA9ICgobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgIT0gMCk7Ci0KLQlod19pZi0+c2V0X3Byb21pc2N1b3VzX21vZGUocGRhdGEsIHByX21vZGUpOwotCWh3X2lmLT5zZXRfYWxsX211bHRpY2FzdF9tb2RlKHBkYXRhLCBhbV9tb2RlKTsKLQotCWh3X2lmLT5hZGRfbWFjX2FkZHJlc3NlcyhwZGF0YSk7CisJaHdfaWYtPmNvbmZpZ19yeF9tb2RlKHBkYXRhKTsKIAogCURCR1BSKCI8LS14Z2JlX3NldF9yeF9tb2RlXG4iKTsKIH0KQEAgLTE1OTksNiArMTYwMCwxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCB4Z2JlX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJbmV0ZGV2X3dhcm4obmV0ZGV2LCAidHggdGltZW91dCwgZGV2aWNlIHJlc3RhcnRpbmdcbiIpOworCXNjaGVkdWxlX3dvcmsoJnBkYXRhLT5yZXN0YXJ0X3dvcmspOworfQorCiBzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICp4Z2JlX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkJCQkgIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqcykKIHsKQEAgLTE3NjMsNiArMTc3Miw3IEBACiAJLm5kb192YWxpZGF0ZV9hZGRyCT0gZXRoX3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19kb19pb2N0bAkJPSB4Z2JlX2lvY3RsLAogCS5uZG9fY2hhbmdlX210dQkJPSB4Z2JlX2NoYW5nZV9tdHUsCisJLm5kb190eF90aW1lb3V0CQk9IHhnYmVfdHhfdGltZW91dCwKIAkubmRvX2dldF9zdGF0czY0CT0geGdiZV9nZXRfc3RhdHM2NCwKIAkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IHhnYmVfdmxhbl9yeF9hZGRfdmlkLAogCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IHhnYmVfdmxhbl9yeF9raWxsX3ZpZCwKQEAgLTE3OTUsMTEgKzE4MDUsMTQgQEAKIAkJaWYgKGRlc2NfaWYtPm1hcF9yeF9idWZmZXIocGRhdGEsIHJpbmcsIHJkYXRhKSkKIAkJCWJyZWFrOwogCi0JCWh3X2lmLT5yeF9kZXNjX3Jlc2V0KHJkYXRhKTsKKwkJaHdfaWYtPnJ4X2Rlc2NfcmVzZXQocGRhdGEsIHJkYXRhLCByaW5nLT5kaXJ0eSk7CiAKIAkJcmluZy0+ZGlydHkrKzsKIAl9CiAKKwkvKiBNYWtlIHN1cmUgZXZlcnl0aGluZyBpcyB3cml0dGVuIGJlZm9yZSB0aGUgcmVnaXN0ZXIgd3JpdGUgKi8KKwl3bWIoKTsKKwogCS8qIFVwZGF0ZSB0aGUgUnggVGFpbCBQb2ludGVyIFJlZ2lzdGVyIHdpdGggYWRkcmVzcyBvZgogCSAqIHRoZSBsYXN0IGNsZWFuZWQgZW50cnkgKi8KIAlyZGF0YSA9IFhHQkVfR0VUX0RFU0NfREFUQShyaW5nLCByaW5nLT5kaXJ0eSAtIDEpOwpAQCAtMTgwNywxNiArMTgyMCwxNSBAQAogCQkJICBsb3dlcl8zMl9iaXRzKHJkYXRhLT5yZGVzY19kbWEpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBza19idWZmICp4Z2JlX2NyZWF0ZV9za2Ioc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhLAorc3RhdGljIHN0cnVjdCBza19idWZmICp4Z2JlX2NyZWF0ZV9za2Ioc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpLAogCQkJCSAgICAgICBzdHJ1Y3QgeGdiZV9yaW5nX2RhdGEgKnJkYXRhLAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmxlbikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gcGRhdGEtPm5ldGRldjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXU4ICpwYWNrZXQ7CiAJdW5zaWduZWQgaW50IGNvcHlfbGVuOwogCi0Jc2tiID0gbmV0ZGV2X2FsbG9jX3NrYl9pcF9hbGlnbihuZXRkZXYsIHJkYXRhLT5yeC5oZHIuZG1hX2xlbik7CisJc2tiID0gbmFwaV9hbGxvY19za2IobmFwaSwgcmRhdGEtPnJ4Lmhkci5kbWFfbGVuKTsKIAlpZiAoIXNrYikKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTE4NjMsNyArMTg3NSw3IEBACiAKIAkJLyogTWFrZSBzdXJlIGRlc2NyaXB0b3IgZmllbGRzIGFyZSByZWFkIGFmdGVyIHJlYWRpbmcgdGhlIE9XTgogCQkgKiBiaXQgKi8KLQkJcm1iKCk7CisJCWRtYV9ybWIoKTsKIAogI2lmZGVmIFhHTUFDX0VOQUJMRV9UWF9ERVNDX0RVTVAKIAkJeGdiZV9kdW1wX3R4X2Rlc2MocmluZywgcmluZy0+ZGlydHksIDEsIDApOwpAQCAtMTk4Niw3ICsxOTk4LDcgQEAKIAkJCQkJCQlyZGF0YS0+cnguaGRyLmRtYV9sZW4sCiAJCQkJCQkJRE1BX0ZST01fREVWSUNFKTsKIAotCQkJCXNrYiA9IHhnYmVfY3JlYXRlX3NrYihwZGF0YSwgcmRhdGEsICZwdXRfbGVuKTsKKwkJCQlza2IgPSB4Z2JlX2NyZWF0ZV9za2IobmFwaSwgcmRhdGEsICZwdXRfbGVuKTsKIAkJCQlpZiAoIXNrYikgewogCQkJCQllcnJvciA9IDE7CiAJCQkJCWdvdG8gc2tpcF9kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWV0aHRvb2wuYwppbmRleCBlYmY0ODkzLi41ZjE0OWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWV0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLWV0aHRvb2wuYwpAQCAtMjkxLDcgKzI5MSw2IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJcmV0ID0gcGh5X2V0aHRvb2xfZ3NldChwZGF0YS0+cGh5ZGV2LCBjbWQpOwotCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOwogCiAJREJHUFIoIjwtLXhnYmVfZ2V0X3NldHRpbmdzXG4iKTsKIApAQCAtMzc4LDE4ICszNzcsMTQgQEAKIAkJCSAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQogewogCXN0cnVjdCB4Z2JlX3Bydl9kYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IHhnYmVfaHdfaWYgKmh3X2lmID0gJnBkYXRhLT5od19pZjsKLQl1bnNpZ25lZCBpbnQgcml3dDsKIAogCURCR1BSKCItLT54Z2JlX2dldF9jb2FsZXNjZVxuIik7CiAKIAltZW1zZXQoZWMsIDAsIHNpemVvZihzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSkpOwogCi0Jcml3dCA9IHBkYXRhLT5yeF9yaXd0OwotCWVjLT5yeF9jb2FsZXNjZV91c2VjcyA9IGh3X2lmLT5yaXd0X3RvX3VzZWMocGRhdGEsIHJpd3QpOworCWVjLT5yeF9jb2FsZXNjZV91c2VjcyA9IHBkYXRhLT5yeF91c2VjczsKIAllYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSBwZGF0YS0+cnhfZnJhbWVzOwogCi0JZWMtPnR4X2NvYWxlc2NlX3VzZWNzID0gcGRhdGEtPnR4X3VzZWNzOwogCWVjLT50eF9tYXhfY29hbGVzY2VkX2ZyYW1lcyA9IHBkYXRhLT50eF9mcmFtZXM7CiAKIAlEQkdQUigiPC0teGdiZV9nZXRfY29hbGVzY2VcbiIpOwpAQCAtNDAzLDEzICszOTgsMTQgQEAKIAlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCB4Z2JlX2h3X2lmICpod19pZiA9ICZwZGF0YS0+aHdfaWY7CiAJdW5zaWduZWQgaW50IHJ4X2ZyYW1lcywgcnhfcml3dCwgcnhfdXNlY3M7Ci0JdW5zaWduZWQgaW50IHR4X2ZyYW1lcywgdHhfdXNlY3M7CisJdW5zaWduZWQgaW50IHR4X2ZyYW1lczsKIAogCURCR1BSKCItLT54Z2JlX3NldF9jb2FsZXNjZVxuIik7CiAKIAkvKiBDaGVjayBmb3Igbm90IHN1cHBvcnRlZCBwYXJhbWV0ZXJzICAqLwogCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzX2lycSkgfHwKIAkgICAgKGVjLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lc19pcnEpIHx8CisJICAgIChlYy0+dHhfY29hbGVzY2VfdXNlY3MpIHx8CiAJICAgIChlYy0+dHhfY29hbGVzY2VfdXNlY3NfaXJxKSB8fAogCSAgICAoZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzX2lycSkgfHwKIAkgICAgKGVjLT5zdGF0c19ibG9ja19jb2FsZXNjZV91c2VjcykgfHwKQEAgLTQyOCwyOCArNDI0LDE4IEBACiAJICAgIChlYy0+cmF0ZV9zYW1wbGVfaW50ZXJ2YWwpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQkvKiBDYW4gb25seSBjaGFuZ2UgcngtZnJhbWVzIHdoZW4gaW50ZXJmYWNlIGlzIGRvd24gKHNlZQotCSAqIHJ4X2Rlc2NyaXB0b3JfaW5pdCBpbiB4Z2JlLWRldi5jKQotCSAqLwotCXJ4X2ZyYW1lcyA9IHBkYXRhLT5yeF9mcmFtZXM7Ci0JaWYgKHJ4X2ZyYW1lcyAhPSBlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgJiYgbmV0aWZfcnVubmluZyhuZXRkZXYpKSB7Ci0JCW5ldGRldl9hbGVydChuZXRkZXYsCi0JCQkgICAgICJpbnRlcmZhY2UgbXVzdCBiZSBkb3duIHRvIGNoYW5nZSByeC1mcmFtZXNcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlyeF9yaXd0ID0gaHdfaWYtPnVzZWNfdG9fcml3dChwZGF0YSwgZWMtPnJ4X2NvYWxlc2NlX3VzZWNzKTsKKwlyeF91c2VjcyA9IGVjLT5yeF9jb2FsZXNjZV91c2VjczsKIAlyeF9mcmFtZXMgPSBlYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXM7CiAKIAkvKiBVc2Ugc21hbGxlc3QgcG9zc2libGUgdmFsdWUgaWYgY29udmVyc2lvbiByZXN1bHRlZCBpbiB6ZXJvICovCi0JaWYgKGVjLT5yeF9jb2FsZXNjZV91c2VjcyAmJiAhcnhfcml3dCkKKwlpZiAocnhfdXNlY3MgJiYgIXJ4X3Jpd3QpCiAJCXJ4X3Jpd3QgPSAxOwogCiAJLyogQ2hlY2sgdGhlIGJvdW5kcyBvZiB2YWx1ZXMgZm9yIFJ4ICovCiAJaWYgKHJ4X3Jpd3QgPiBYR01BQ19NQVhfRE1BX1JJV1QpIHsKLQkJcnhfdXNlY3MgPSBod19pZi0+cml3dF90b191c2VjKHBkYXRhLCBYR01BQ19NQVhfRE1BX1JJV1QpOwogCQluZXRkZXZfYWxlcnQobmV0ZGV2LCAicngtdXNlYyBpcyBsaW1pdGVkIHRvICVkIHVzZWNzXG4iLAotCQkJICAgICByeF91c2Vjcyk7CisJCQkgICAgIGh3X2lmLT5yaXd0X3RvX3VzZWMocGRhdGEsIFhHTUFDX01BWF9ETUFfUklXVCkpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJaWYgKHJ4X2ZyYW1lcyA+IHBkYXRhLT5yeF9kZXNjX2NvdW50KSB7CkBAIC00NTgsNyArNDQ0LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JdHhfdXNlY3MgPSBlYy0+dHhfY29hbGVzY2VfdXNlY3M7CiAJdHhfZnJhbWVzID0gZWMtPnR4X21heF9jb2FsZXNjZWRfZnJhbWVzOwogCiAJLyogQ2hlY2sgdGhlIGJvdW5kcyBvZiB2YWx1ZXMgZm9yIFR4ICovCkBAIC00NjksMTAgKzQ1NCwxMCBAQAogCX0KIAogCXBkYXRhLT5yeF9yaXd0ID0gcnhfcml3dDsKKwlwZGF0YS0+cnhfdXNlY3MgPSByeF91c2VjczsKIAlwZGF0YS0+cnhfZnJhbWVzID0gcnhfZnJhbWVzOwogCWh3X2lmLT5jb25maWdfcnhfY29hbGVzY2UocGRhdGEpOwogCi0JcGRhdGEtPnR4X3VzZWNzID0gdHhfdXNlY3M7CiAJcGRhdGEtPnR4X2ZyYW1lcyA9IHR4X2ZyYW1lczsKIAlod19pZi0+Y29uZmlnX3R4X2NvYWxlc2NlKHBkYXRhKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLW1haW4uYwppbmRleCAzMmRkNjUxLi43MTQ5MDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLW1haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLW1haW4uYwpAQCAtMzc0LDE1ICszNzQsNiBAQAogCQlwZGF0YS0+YXdjYWNoZSA9IFhHQkVfRE1BX1NZU19BV0NBQ0hFOwogCX0KIAotCS8qIFNldCB0aGUgRE1BIG1hc2sgKi8KLQlpZiAoIWRldi0+ZG1hX21hc2spCi0JCWRldi0+ZG1hX21hc2sgPSAmZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKLQlyZXQgPSBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KGRldiwgRE1BX0JJVF9NQVNLKDQwKSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGRldiwgImRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQgZmFpbGVkXG4iKTsKLQkJZ290byBlcnJfaW87Ci0JfQotCiAJLyogR2V0IHRoZSBkZXZpY2UgaW50ZXJydXB0ICovCiAJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNDA5LDYgKzQwMCwxNiBAQAogCS8qIFNldCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZGF0YSAqLwogCXhnYmVfZGVmYXVsdF9jb25maWcocGRhdGEpOwogCisJLyogU2V0IHRoZSBETUEgbWFzayAqLworCWlmICghZGV2LT5kbWFfbWFzaykKKwkJZGV2LT5kbWFfbWFzayA9ICZkZXYtPmNvaGVyZW50X2RtYV9tYXNrOworCXJldCA9IGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoZGV2LAorCQkJCQlETUFfQklUX01BU0socGRhdGEtPmh3X2ZlYXQuZG1hX3dpZHRoKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQgZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfaW87CisJfQorCiAJLyogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgVHggYW5kIFJ4IHJpbmdzIHRvIGJlIGNyZWF0ZWQKIAkgKiAgLVR4IChETUEpIENoYW5uZWxzIG1hcCAxLXRvLTEgdG8gVHggUXVldWVzIHNvIHNldAogCSAqICAgdGhlIG51bWJlciBvZiBUeCBxdWV1ZXMgdG8gdGhlIG51bWJlciBvZiBUeCBjaGFubmVscwpAQCAtNDkwLDYgKzQ5MSw5IEBACiAKIAluZXRkZXYtPnByaXZfZmxhZ3MgfD0gSUZGX1VOSUNBU1RfRkxUOwogCisJLyogVXNlIGRlZmF1bHQgd2F0Y2hkb2cgdGltZW91dCAqLworCW5ldGRldi0+d2F0Y2hkb2dfdGltZW8gPSAwOworCiAJeGdiZV9pbml0X3J4X2NvYWxlc2NlKHBkYXRhKTsKIAl4Z2JlX2luaXRfdHhfY29hbGVzY2UocGRhdGEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLXB0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS1wdHAuYwppbmRleCBmMzI2MTc4Li5iMDNlNGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLXB0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUtcHRwLmMKQEAgLTE3OSw3ICsxNzksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHhnYmVfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKmluZm8sIHN0cnVjdCB0aW1lc3BlYyAqdHMpCitzdGF0aWMgaW50IHhnYmVfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKmluZm8sIHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAlzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqcGRhdGEgPSBjb250YWluZXJfb2YoaW5mbywKIAkJCQkJCSAgIHN0cnVjdCB4Z2JlX3Bydl9kYXRhLApAQCAtMTkzLDEyICsxOTMsMTMgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkYXRhLT50c3RhbXBfbG9jaywgZmxhZ3MpOwogCi0JKnRzID0gbnNfdG9fdGltZXNwZWMobnNlYyk7CisJKnRzID0gbnNfdG9fdGltZXNwZWM2NChuc2VjKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHhnYmVfc2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMpCitzdGF0aWMgaW50IHhnYmVfc2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKmluZm8sCisJCQljb25zdCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJc3RydWN0IHhnYmVfcHJ2X2RhdGEgKnBkYXRhID0gY29udGFpbmVyX29mKGluZm8sCiAJCQkJCQkgICBzdHJ1Y3QgeGdiZV9wcnZfZGF0YSwKQEAgLTIwNiw3ICsyMDcsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTY0IG5zZWM7CiAKLQluc2VjID0gdGltZXNwZWNfdG9fbnModHMpOworCW5zZWMgPSB0aW1lc3BlYzY0X3RvX25zKHRzKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwZGF0YS0+dHN0YW1wX2xvY2ssIGZsYWdzKTsKIApAQCAtMjM2LDggKzIzNyw4IEBACiAJaW5mby0+bWF4X2FkaiA9IHBkYXRhLT5wdHBjbGtfcmF0ZTsKIAlpbmZvLT5hZGpmcmVxID0geGdiZV9hZGpmcmVxOwogCWluZm8tPmFkanRpbWUgPSB4Z2JlX2FkanRpbWU7Ci0JaW5mby0+Z2V0dGltZSA9IHhnYmVfZ2V0dGltZTsKLQlpbmZvLT5zZXR0aW1lID0geGdiZV9zZXR0aW1lOworCWluZm8tPmdldHRpbWU2NCA9IHhnYmVfZ2V0dGltZTsKKwlpbmZvLT5zZXR0aW1lNjQgPSB4Z2JlX3NldHRpbWU7CiAJaW5mby0+ZW5hYmxlID0geGdiZV9lbmFibGU7CiAKIAljbG9jayA9IHB0cF9jbG9ja19yZWdpc3RlcihpbmZvLCBwZGF0YS0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC94Z2JlL3hnYmUuaAppbmRleCAxM2U4Zjk1Li5lNjJkZmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQveGdiZS94Z2JlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3hnYmUveGdiZS5oCkBAIC0yMjIsNyArMjIyLDcgQEAKIAkgKChfaWR4KSAmICgoX3JpbmcpLT5yZGVzY19jb3VudCAtIDEpKSkKIAogLyogRGVmYXVsdCBjb2FsZXNjaW5nIHBhcmFtZXRlcnMgKi8KLSNkZWZpbmUgWEdNQUNfSU5JVF9ETUFfVFhfVVNFQ1MJCTUwCisjZGVmaW5lIFhHTUFDX0lOSVRfRE1BX1RYX1VTRUNTCQkxMDAwCiAjZGVmaW5lIFhHTUFDX0lOSVRfRE1BX1RYX0ZSQU1FUwkyNQogCiAjZGVmaW5lIFhHTUFDX01BWF9ETUFfUklXVAkJMHhmZgpAQCAtMzI1LDggKzMyNSw2IEBACiAJc3RydWN0IHhnYmVfdHhfcmluZ19kYXRhIHR4OwkvKiBUeC1yZWxhdGVkIGRhdGEgKi8KIAlzdHJ1Y3QgeGdiZV9yeF9yaW5nX2RhdGEgcng7CS8qIFJ4LXJlbGF0ZWQgZGF0YSAqLwogCi0JdW5zaWduZWQgaW50IGludGVycnVwdDsJCS8qIEludGVycnVwdCBpbmRpY2F0b3IgKi8KLQogCXVuc2lnbmVkIGludCBtYXBwZWRfYXNfcGFnZTsKIAogCS8qIEluY29tcGxldGUgcmVjZWl2ZSBzYXZlIGxvY2F0aW9uLiAgSWYgdGhlIGJ1ZGdldCBpcyBleGhhdXN0ZWQKQEAgLTQxMCw3ICs0MDgsNyBAQAogCXVuc2lnbmVkIGludCBzYXZlZF9pZXI7CiAKIAl1bnNpZ25lZCBpbnQgdHhfdGltZXJfYWN0aXZlOwotCXN0cnVjdCBocnRpbWVyIHR4X3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0IHR4X3RpbWVyOwogCiAJc3RydWN0IHhnYmVfcmluZyAqdHhfcmluZzsKIAlzdHJ1Y3QgeGdiZV9yaW5nICpyeF9yaW5nOwpAQCAtNDk3LDEwICs0OTUsOCBAQAogc3RydWN0IHhnYmVfaHdfaWYgewogCWludCAoKnR4X2NvbXBsZXRlKShzdHJ1Y3QgeGdiZV9yaW5nX2Rlc2MgKik7CiAKLQlpbnQgKCpzZXRfcHJvbWlzY3VvdXNfbW9kZSkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKiwgdW5zaWduZWQgaW50KTsKLQlpbnQgKCpzZXRfYWxsX211bHRpY2FzdF9tb2RlKShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqLCB1bnNpZ25lZCBpbnQpOwotCWludCAoKmFkZF9tYWNfYWRkcmVzc2VzKShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqKTsKIAlpbnQgKCpzZXRfbWFjX2FkZHJlc3MpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICosIHU4ICphZGRyKTsKKwlpbnQgKCpjb25maWdfcnhfbW9kZSkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CiAKIAlpbnQgKCplbmFibGVfcnhfY3N1bSkoc3RydWN0IHhnYmVfcHJ2X2RhdGEgKik7CiAJaW50ICgqZGlzYWJsZV9yeF9jc3VtKShzdHJ1Y3QgeGdiZV9wcnZfZGF0YSAqKTsKQEAgLTUzNiw4ICs1MzIsOSBAQAogCWludCAoKmRldl9yZWFkKShzdHJ1Y3QgeGdiZV9jaGFubmVsICopOwogCXZvaWQgKCp0eF9kZXNjX2luaXQpKHN0cnVjdCB4Z2JlX2NoYW5uZWwgKik7CiAJdm9pZCAoKnJ4X2Rlc2NfaW5pdCkoc3RydWN0IHhnYmVfY2hhbm5lbCAqKTsKLQl2b2lkICgqcnhfZGVzY19yZXNldCkoc3RydWN0IHhnYmVfcmluZ19kYXRhICopOwogCXZvaWQgKCp0eF9kZXNjX3Jlc2V0KShzdHJ1Y3QgeGdiZV9yaW5nX2RhdGEgKik7CisJdm9pZCAoKnJ4X2Rlc2NfcmVzZXQpKHN0cnVjdCB4Z2JlX3Bydl9kYXRhICosIHN0cnVjdCB4Z2JlX3JpbmdfZGF0YSAqLAorCQkJICAgICAgdW5zaWduZWQgaW50KTsKIAlpbnQgKCppc19sYXN0X2Rlc2MpKHN0cnVjdCB4Z2JlX3JpbmdfZGVzYyAqKTsKIAlpbnQgKCppc19jb250ZXh0X2Rlc2MpKHN0cnVjdCB4Z2JlX3JpbmdfZGVzYyAqKTsKIAl2b2lkICgqdHhfc3RhcnRfeG1pdCkoc3RydWN0IHhnYmVfY2hhbm5lbCAqLCBzdHJ1Y3QgeGdiZV9yaW5nICopOwpAQCAtNjIwLDcgKzYxNyw3IEBACiAJdW5zaWduZWQgaW50IG1nazsJCS8qIFBNVCBtYWdpYyBwYWNrZXQgKi8KIAl1bnNpZ25lZCBpbnQgbW1jOwkJLyogUk1PTiBtb2R1bGUgKi8KIAl1bnNpZ25lZCBpbnQgYW9lOwkJLyogQVJQIE9mZmxvYWQgKi8KLQl1bnNpZ25lZCBpbnQgdHM7CQkvKiBJRUVFIDE1ODgtMjAwOCBBZGF2YW5jZWQgVGltZXN0YW1wICovCisJdW5zaWduZWQgaW50IHRzOwkJLyogSUVFRSAxNTg4LTIwMDggQWR2YW5jZWQgVGltZXN0YW1wICovCiAJdW5zaWduZWQgaW50IGVlZTsJCS8qIEVuZXJneSBFZmZpY2llbnQgRXRoZXJuZXQgKi8KIAl1bnNpZ25lZCBpbnQgdHhfY29lOwkJLyogVHggQ2hlY2tzdW0gT2ZmbG9hZCAqLwogCXVuc2lnbmVkIGludCByeF9jb2U7CQkvKiBSeCBDaGVja3N1bSBPZmZsb2FkICovCkBAIC02MzIsNiArNjI5LDcgQEAKIAl1bnNpZ25lZCBpbnQgcnhfZmlmb19zaXplOwkvKiBNVEwgUmVjZWl2ZSBGSUZPIFNpemUgKi8KIAl1bnNpZ25lZCBpbnQgdHhfZmlmb19zaXplOwkvKiBNVEwgVHJhbnNtaXQgRklGTyBTaXplICovCiAJdW5zaWduZWQgaW50IGFkdl90c19oaTsJCS8qIEFkdmFuY2UgVGltZXN0YW1waW5nIEhpZ2ggV29yZCAqLworCXVuc2lnbmVkIGludCBkbWFfd2lkdGg7CQkvKiBETUEgd2lkdGggKi8KIAl1bnNpZ25lZCBpbnQgZGNiOwkJLyogRENCIEZlYXR1cmUgKi8KIAl1bnNpZ25lZCBpbnQgc3BoOwkJLyogU3BsaXQgSGVhZGVyIEZlYXR1cmUgKi8KIAl1bnNpZ25lZCBpbnQgdHNvOwkJLyogVENQIFNlZ21lbnRhdGlvbiBPZmZsb2FkICovCkBAIC03MTUsNiArNzEzLDcgQEAKIAogCS8qIFJ4IGNvYWxlc2Npbmcgc2V0dGluZ3MgKi8KIAl1bnNpZ25lZCBpbnQgcnhfcml3dDsKKwl1bnNpZ25lZCBpbnQgcnhfdXNlY3M7CiAJdW5zaWduZWQgaW50IHJ4X2ZyYW1lczsKIAogCS8qIEN1cnJlbnQgUnggYnVmZmVyIHNpemUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2h3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ody5oCmluZGV4IGVjNDVmMzIuLmQ5YmM4OWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X2h3LmgKQEAgLTk3LDYgKzk3LDggQEAKICNkZWZpbmUgUUNPSEVSRU5UCQlCSVQoNCkKICNkZWZpbmUgUkVDT01CQlVGCQlCSVQoMjcpCiAKKyNkZWZpbmUgTUFDX09GRlNFVAkJCTB4MzAKKwogI2RlZmluZSBCTE9DS19FVEhfQ1NSX09GRlNFVAkJMHgyMDAwCiAjZGVmaW5lIEJMT0NLX0VUSF9SSU5HX0lGX09GRlNFVAkweDkwMDAKICNkZWZpbmUgQkxPQ0tfRVRIX0RJQUdfQ1NSX09GRlNFVAkweEQwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uYwppbmRleCA2MzVhODNiLi40MGQzNTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfbWFpbi5jCkBAIC00MjgsMTMgKzQyOCwyMyBAQAogewogCXN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IG5kZXZfdG9fZGV2KG5kZXYpOworCXN0cnVjdCB4Z2VuZV9lbmV0X2Rlc2NfcmluZyAqcmluZzsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIHBkYXRhLT5yeF9yaW5nLT5pcnEsIHhnZW5lX2VuZXRfcnhfaXJxLAotCQkJICAgICAgIElSUUZfU0hBUkVELCBuZGV2LT5uYW1lLCBwZGF0YS0+cnhfcmluZyk7Ci0JaWYgKHJldCkgewotCQluZXRkZXZfZXJyKG5kZXYsICJyeCVkIGludGVycnVwdCByZXF1ZXN0IGZhaWxlZFxuIiwKLQkJCSAgIHBkYXRhLT5yeF9yaW5nLT5pcnEpOworCXJpbmcgPSBwZGF0YS0+cnhfcmluZzsKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgcmluZy0+aXJxLCB4Z2VuZV9lbmV0X3J4X2lycSwKKwkJCSAgICAgICBJUlFGX1NIQVJFRCwgcmluZy0+aXJxX25hbWUsIHJpbmcpOworCWlmIChyZXQpCisJCW5ldGRldl9lcnIobmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGlycSAlc1xuIiwgcmluZy0+aXJxX25hbWUpOworCisJaWYgKHBkYXRhLT5jcV9jbnQpIHsKKwkJcmluZyA9IHBkYXRhLT50eF9yaW5nLT5jcF9yaW5nOworCQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgcmluZy0+aXJxLCB4Z2VuZV9lbmV0X3J4X2lycSwKKwkJCQkgICAgICAgSVJRRl9TSEFSRUQsIHJpbmctPmlycV9uYW1lLCByaW5nKTsKKwkJaWYgKHJldCkgeworCQkJbmV0ZGV2X2VycihuZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxICVzXG4iLAorCQkJCSAgIHJpbmctPmlycV9uYW1lKTsKKwkJfQogCX0KIAogCXJldHVybiByZXQ7CkBAIC00NDgsNiArNDU4LDM3IEBACiAJcGRhdGEgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlkZXYgPSBuZGV2X3RvX2RldihuZGV2KTsKIAlkZXZtX2ZyZWVfaXJxKGRldiwgcGRhdGEtPnJ4X3JpbmctPmlycSwgcGRhdGEtPnJ4X3JpbmcpOworCisJaWYgKHBkYXRhLT5jcV9jbnQpIHsKKwkJZGV2bV9mcmVlX2lycShkZXYsIHBkYXRhLT50eF9yaW5nLT5jcF9yaW5nLT5pcnEsCisJCQkgICAgICBwZGF0YS0+dHhfcmluZy0+Y3BfcmluZyk7CisJfQorfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9lbmV0X25hcGlfZW5hYmxlKHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGk7CisKKwluYXBpID0gJnBkYXRhLT5yeF9yaW5nLT5uYXBpOworCW5hcGlfZW5hYmxlKG5hcGkpOworCisJaWYgKHBkYXRhLT5jcV9jbnQpIHsKKwkJbmFwaSA9ICZwZGF0YS0+dHhfcmluZy0+Y3BfcmluZy0+bmFwaTsKKwkJbmFwaV9lbmFibGUobmFwaSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB4Z2VuZV9lbmV0X25hcGlfZGlzYWJsZShzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpOworCisJbmFwaSA9ICZwZGF0YS0+cnhfcmluZy0+bmFwaTsKKwluYXBpX2Rpc2FibGUobmFwaSk7CisKKwlpZiAocGRhdGEtPmNxX2NudCkgeworCQluYXBpID0gJnBkYXRhLT50eF9yaW5nLT5jcF9yaW5nLT5uYXBpOworCQluYXBpX2Rpc2FibGUobmFwaSk7CisJfQogfQogCiBzdGF0aWMgaW50IHhnZW5lX2VuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKQEAgLTQ2Miw3ICs1MDMsNyBAQAogCXJldCA9IHhnZW5lX2VuZXRfcmVnaXN0ZXJfaXJxKG5kZXYpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7Ci0JbmFwaV9lbmFibGUoJnBkYXRhLT5yeF9yaW5nLT5uYXBpKTsKKwl4Z2VuZV9lbmV0X25hcGlfZW5hYmxlKHBkYXRhKTsKIAogCWlmIChwZGF0YS0+cGh5X21vZGUgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJKQogCQlwaHlfc3RhcnQocGRhdGEtPnBoeV9kZXYpOwpAQCAtNDg2LDcgKzUyNyw3IEBACiAJZWxzZQogCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnBkYXRhLT5saW5rX3dvcmspOwogCi0JbmFwaV9kaXNhYmxlKCZwZGF0YS0+cnhfcmluZy0+bmFwaSk7CisJeGdlbmVfZW5ldF9uYXBpX2Rpc2FibGUocGRhdGEpOwogCXhnZW5lX2VuZXRfZnJlZV9pcnEobmRldik7CiAJeGdlbmVfZW5ldF9wcm9jZXNzX3JpbmcocGRhdGEtPnJ4X3JpbmcsIC0xKTsKIApAQCAtNTgwLDYgKzYyMSw4IEBACiAJaWYgKHJpbmcpIHsKIAkJaWYgKHJpbmctPmNwX3JpbmcgJiYgcmluZy0+Y3BfcmluZy0+Y3Bfc2tiKQogCQkJZGV2bV9rZnJlZShkZXYsIHJpbmctPmNwX3JpbmctPmNwX3NrYik7CisJCWlmIChyaW5nLT5jcF9yaW5nICYmIHBkYXRhLT5jcV9jbnQpCisJCQl4Z2VuZV9lbmV0X2ZyZWVfZGVzY19yaW5nKHJpbmctPmNwX3JpbmcpOwogCQl4Z2VuZV9lbmV0X2ZyZWVfZGVzY19yaW5nKHJpbmcpOwogCX0KIApAQCAtNjQ1LDkgKzY4OCwxMSBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IG5kZXZfdG9fZGV2KG5kZXYpOwogCXN0cnVjdCB4Z2VuZV9lbmV0X2Rlc2NfcmluZyAqcnhfcmluZywgKnR4X3JpbmcsICpjcF9yaW5nOwogCXN0cnVjdCB4Z2VuZV9lbmV0X2Rlc2NfcmluZyAqYnVmX3Bvb2wgPSBOVUxMOwotCXU4IGNwdV9idWZudW0gPSAwLCBldGhfYnVmbnVtID0gU1RBUlRfRVRIX0JVRk5VTTsKLQl1OCBicF9idWZudW0gPSBTVEFSVF9CUF9CVUZOVU07Ci0JdTE2IHJpbmdfaWQsIHJpbmdfbnVtID0gU1RBUlRfUklOR19OVU07CisJdTggY3B1X2J1Zm51bSA9IHBkYXRhLT5jcHVfYnVmbnVtOworCXU4IGV0aF9idWZudW0gPSBwZGF0YS0+ZXRoX2J1Zm51bTsKKwl1OCBicF9idWZudW0gPSBwZGF0YS0+YnBfYnVmbnVtOworCXUxNiByaW5nX251bSA9IHBkYXRhLT5yaW5nX251bTsKKwl1MTYgcmluZ19pZDsKIAlpbnQgcmV0OwogCiAJLyogYWxsb2NhdGUgcnggZGVzY3JpcHRvciByaW5nICovCkBAIC02NzEsNiArNzE2LDEyIEBACiAJcnhfcmluZy0+bmJ1ZnBvb2wgPSBOVU1fQlVGUE9PTDsKIAlyeF9yaW5nLT5idWZfcG9vbCA9IGJ1Zl9wb29sOwogCXJ4X3JpbmctPmlycSA9IHBkYXRhLT5yeF9pcnE7CisJaWYgKCFwZGF0YS0+Y3FfY250KSB7CisJCXNucHJpbnRmKHJ4X3JpbmctPmlycV9uYW1lLCBJUlFfSURfU0laRSwgIiVzLXJ4LXR4YyIsCisJCQkgbmRldi0+bmFtZSk7CisJfSBlbHNlIHsKKwkJc25wcmludGYocnhfcmluZy0+aXJxX25hbWUsIElSUV9JRF9TSVpFLCAiJXMtcngiLCBuZGV2LT5uYW1lKTsKKwl9CiAJYnVmX3Bvb2wtPnJ4X3NrYiA9IGRldm1fa2NhbGxvYyhkZXYsIGJ1Zl9wb29sLT5zbG90cywKIAkJCQkJc2l6ZW9mKHN0cnVjdCBza19idWZmICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1Zl9wb29sLT5yeF9za2IpIHsKQEAgLTY5Miw3ICs3NDMsMjIgQEAKIAl9CiAJcGRhdGEtPnR4X3JpbmcgPSB0eF9yaW5nOwogCi0JY3BfcmluZyA9IHBkYXRhLT5yeF9yaW5nOworCWlmICghcGRhdGEtPmNxX2NudCkgeworCQljcF9yaW5nID0gcGRhdGEtPnJ4X3Jpbmc7CisJfSBlbHNlIHsKKwkJLyogYWxsb2NhdGUgdHggY29tcGxldGlvbiBkZXNjcmlwdG9yIHJpbmcgKi8KKwkJcmluZ19pZCA9IHhnZW5lX2VuZXRfZ2V0X3JpbmdfaWQoUklOR19PV05FUl9DUFUsIGNwdV9idWZudW0rKyk7CisJCWNwX3JpbmcgPSB4Z2VuZV9lbmV0X2NyZWF0ZV9kZXNjX3JpbmcobmRldiwgcmluZ19udW0rKywKKwkJCQkJCSAgICAgIFJJTkdfQ0ZHU0laRV8xNktCLAorCQkJCQkJICAgICAgcmluZ19pZCk7CisJCWlmICghY3BfcmluZykgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWNwX3JpbmctPmlycSA9IHBkYXRhLT50eGNfaXJxOworCQlzbnByaW50ZihjcF9yaW5nLT5pcnFfbmFtZSwgSVJRX0lEX1NJWkUsICIlcy10eGMiLCBuZGV2LT5uYW1lKTsKKwl9CisKIAljcF9yaW5nLT5jcF9za2IgPSBkZXZtX2tjYWxsb2MoZGV2LCB0eF9yaW5nLT5zbG90cywKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBza19idWZmICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNwX3JpbmctPmNwX3NrYikgewpAQCAtNzUyLDYgKzgxOCwyMiBAQAogCS5uZG9fc2V0X21hY19hZGRyZXNzID0geGdlbmVfZW5ldF9zZXRfbWFjX2FkZHJlc3MsCiB9OwogCitzdGF0aWMgaW50IHhnZW5lX2dldF9wb3J0X2lkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQoreworCXUzMiBpZCA9IDA7CisJaW50IHJldDsKKworCXJldCA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMihkZXYsICJwb3J0LWlkIiwgJmlkKTsKKwlpZiAoIXJldCAmJiBpZCA+IDEpIHsKKwkJZGV2X2VycihkZXYsICJJbmNvcnJlY3QgcG9ydC1pZCBzcGVjaWZpZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlwZGF0YS0+cG9ydF9pZCA9IGlkOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgeGdlbmVfZ2V0X21hY19hZGRyZXNzKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgdW5zaWduZWQgY2hhciAqYWRkcikKIHsKQEAgLTgzNSwxMyArOTE3LDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAocmV0IDw9IDApIHsKLQkJZGV2X2VycihkZXYsICJVbmFibGUgdG8gZ2V0IEVORVQgUnggSVJRXG4iKTsKLQkJcmV0ID0gcmV0ID8gOiAtRU5YSU87CisJcmV0ID0geGdlbmVfZ2V0X3BvcnRfaWQoZGV2LCBwZGF0YSk7CisJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQl9Ci0JcGRhdGEtPnJ4X2lycSA9IHJldDsKIAogCWlmICh4Z2VuZV9nZXRfbWFjX2FkZHJlc3MoZGV2LCBuZGV2LT5kZXZfYWRkcikgIT0gRVRIX0FMRU4pCiAJCWV0aF9od19hZGRyX3JhbmRvbShuZGV2KTsKQEAgLTg2MCwxOSArOTM4LDM3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAorCXJldCA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHJldCA8PSAwKSB7CisJCWRldl9lcnIoZGV2LCAiVW5hYmxlIHRvIGdldCBFTkVUIFJ4IElSUVxuIik7CisJCXJldCA9IHJldCA/IDogLUVOWElPOworCQlyZXR1cm4gcmV0OworCX0KKwlwZGF0YS0+cnhfaXJxID0gcmV0OworCisJaWYgKHBkYXRhLT5waHlfbW9kZSAhPSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUkpIHsKKwkJcmV0ID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwkJaWYgKHJldCA8PSAwKSB7CisJCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBnZXQgRU5FVCBUeCBjb21wbGV0aW9uIElSUVxuIik7CisJCQlyZXQgPSByZXQgPyA6IC1FTlhJTzsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJcGRhdGEtPnR4Y19pcnEgPSByZXQ7CisJfQorCiAJcGRhdGEtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKIAlpZiAoSVNfRVJSKHBkYXRhLT5jbGspKSB7CiAJCS8qIEZpcm13YXJlIG1heSBoYXZlIHNldCB1cCB0aGUgY2xvY2sgYWxyZWFkeS4gKi8KIAkJcGRhdGEtPmNsayA9IE5VTEw7CiAJfQogCi0JYmFzZV9hZGRyID0gcGRhdGEtPmJhc2VfYWRkcjsKKwliYXNlX2FkZHIgPSBwZGF0YS0+YmFzZV9hZGRyIC0gKHBkYXRhLT5wb3J0X2lkICogTUFDX09GRlNFVCk7CiAJcGRhdGEtPmV0aF9jc3JfYWRkciA9IGJhc2VfYWRkciArIEJMT0NLX0VUSF9DU1JfT0ZGU0VUOwogCXBkYXRhLT5ldGhfcmluZ19pZl9hZGRyID0gYmFzZV9hZGRyICsgQkxPQ0tfRVRIX1JJTkdfSUZfT0ZGU0VUOwogCXBkYXRhLT5ldGhfZGlhZ19jc3JfYWRkciA9IGJhc2VfYWRkciArIEJMT0NLX0VUSF9ESUFHX0NTUl9PRkZTRVQ7CiAJaWYgKHBkYXRhLT5waHlfbW9kZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUkgfHwKIAkgICAgcGRhdGEtPnBoeV9tb2RlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSSkgewotCQlwZGF0YS0+bWN4X21hY19hZGRyID0gYmFzZV9hZGRyICsgQkxPQ0tfRVRIX01BQ19PRkZTRVQ7CisJCXBkYXRhLT5tY3hfbWFjX2FkZHIgPSBwZGF0YS0+YmFzZV9hZGRyICsgQkxPQ0tfRVRIX01BQ19PRkZTRVQ7CiAJCXBkYXRhLT5tY3hfbWFjX2Nzcl9hZGRyID0gYmFzZV9hZGRyICsgQkxPQ0tfRVRIX01BQ19DU1JfT0ZGU0VUOwogCX0gZWxzZSB7CiAJCXBkYXRhLT5tY3hfbWFjX2FkZHIgPSBiYXNlX2FkZHIgKyBCTE9DS19BWEdfTUFDX09GRlNFVDsKQEAgLTkyOCwxMyArMTAyNCw2MCBAQAogCQlwZGF0YS0+bWFjX29wcyA9ICZ4Z2VuZV9zZ21hY19vcHM7CiAJCXBkYXRhLT5wb3J0X29wcyA9ICZ4Z2VuZV9zZ3BvcnRfb3BzOwogCQlwZGF0YS0+cm0gPSBSTTE7CisJCXBkYXRhLT5jcV9jbnQgPSBYR0VORV9NQVhfVFhDX1JJTkdTOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwZGF0YS0+bWFjX29wcyA9ICZ4Z2VuZV94Z21hY19vcHM7CiAJCXBkYXRhLT5wb3J0X29wcyA9ICZ4Z2VuZV94Z3BvcnRfb3BzOwogCQlwZGF0YS0+cm0gPSBSTTA7CisJCXBkYXRhLT5jcV9jbnQgPSBYR0VORV9NQVhfVFhDX1JJTkdTOwogCQlicmVhazsKIAl9CisKKwlzd2l0Y2ggKHBkYXRhLT5wb3J0X2lkKSB7CisJY2FzZSAwOgorCQlwZGF0YS0+Y3B1X2J1Zm51bSA9IFNUQVJUX0NQVV9CVUZOVU1fMDsKKwkJcGRhdGEtPmV0aF9idWZudW0gPSBTVEFSVF9FVEhfQlVGTlVNXzA7CisJCXBkYXRhLT5icF9idWZudW0gPSBTVEFSVF9CUF9CVUZOVU1fMDsKKwkJcGRhdGEtPnJpbmdfbnVtID0gU1RBUlRfUklOR19OVU1fMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwZGF0YS0+Y3B1X2J1Zm51bSA9IFNUQVJUX0NQVV9CVUZOVU1fMTsKKwkJcGRhdGEtPmV0aF9idWZudW0gPSBTVEFSVF9FVEhfQlVGTlVNXzE7CisJCXBkYXRhLT5icF9idWZudW0gPSBTVEFSVF9CUF9CVUZOVU1fMTsKKwkJcGRhdGEtPnJpbmdfbnVtID0gU1RBUlRfUklOR19OVU1fMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIHhnZW5lX2VuZXRfbmFwaV9hZGQoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaTsKKworCW5hcGkgPSAmcGRhdGEtPnJ4X3JpbmctPm5hcGk7CisJbmV0aWZfbmFwaV9hZGQocGRhdGEtPm5kZXYsIG5hcGksIHhnZW5lX2VuZXRfbmFwaSwgTkFQSV9QT0xMX1dFSUdIVCk7CisKKwlpZiAocGRhdGEtPmNxX2NudCkgeworCQluYXBpID0gJnBkYXRhLT50eF9yaW5nLT5jcF9yaW5nLT5uYXBpOworCQluZXRpZl9uYXBpX2FkZChwZGF0YS0+bmRldiwgbmFwaSwgeGdlbmVfZW5ldF9uYXBpLAorCQkJICAgICAgIE5BUElfUE9MTF9XRUlHSFQpOworCX0KK30KKworc3RhdGljIHZvaWQgeGdlbmVfZW5ldF9uYXBpX2RlbChzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpOworCisJbmFwaSA9ICZwZGF0YS0+cnhfcmluZy0+bmFwaTsKKwluZXRpZl9uYXBpX2RlbChuYXBpKTsKKworCWlmIChwZGF0YS0+Y3FfY250KSB7CisJCW5hcGkgPSAmcGRhdGEtPnR4X3JpbmctPmNwX3JpbmctPm5hcGk7CisJCW5ldGlmX25hcGlfZGVsKG5hcGkpOworCX0KIH0KIAogc3RhdGljIGludCB4Z2VuZV9lbmV0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC05NDIsNyArMTA4NSw2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnBkYXRhOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7Ci0Jc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpOwogCXN0cnVjdCB4Z2VuZV9tYWNfb3BzICptYWNfb3BzOwogCWludCByZXQ7CiAKQEAgLTk4NCw4ICsxMTI2LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIAotCW5hcGkgPSAmcGRhdGEtPnJ4X3JpbmctPm5hcGk7Ci0JbmV0aWZfbmFwaV9hZGQobmRldiwgbmFwaSwgeGdlbmVfZW5ldF9uYXBpLCBOQVBJX1BPTExfV0VJR0hUKTsKKwl4Z2VuZV9lbmV0X25hcGlfYWRkKHBkYXRhKTsKIAltYWNfb3BzID0gcGRhdGEtPm1hY19vcHM7CiAJaWYgKHBkYXRhLT5waHlfbW9kZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUkdNSUkpCiAJCXJldCA9IHhnZW5lX2VuZXRfbWRpb19jb25maWcocGRhdGEpOwpAQCAtMTAxMiw3ICsxMTUzLDcgQEAKIAltYWNfb3BzLT5yeF9kaXNhYmxlKHBkYXRhKTsKIAltYWNfb3BzLT50eF9kaXNhYmxlKHBkYXRhKTsKIAotCW5ldGlmX25hcGlfZGVsKCZwZGF0YS0+cnhfcmluZy0+bmFwaSk7CisJeGdlbmVfZW5ldF9uYXBpX2RlbChwZGF0YSk7CiAJeGdlbmVfZW5ldF9tZGlvX3JlbW92ZShwZGF0YSk7CiAJeGdlbmVfZW5ldF9kZWxldGVfZGVzY19yaW5ncyhwZGF0YSk7CiAJdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CkBAIC0xMDMzLDcgKzExNzQsNyBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhnZW5lX2VuZXRfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhnZW5lX2VuZXRfb2ZfbWF0Y2hbXSA9IHsKIAl7LmNvbXBhdGlibGUgPSAiYXBtLHhnZW5lLWVuZXQiLH0sCiAJey5jb21wYXRpYmxlID0gImFwbSx4Z2VuZTEtc2dlbmV0Iix9LAogCXsuY29tcGF0aWJsZSA9ICJhcG0seGdlbmUxLXhnZW5ldCIsfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X21haW4uaAppbmRleCBjMmQ0NjVjLi44ZjNkMjMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9tYWluLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfbWFpbi5oCkBAIC00MSw5ICs0MSwxOCBAQAogI2RlZmluZSBTS0JfQlVGRkVSX1NJWkUJCShYR0VORV9FTkVUX01BWF9NVFUgLSBORVRfSVBfQUxJR04pCiAjZGVmaW5lIE5VTV9QS1RfQlVGCTY0CiAjZGVmaW5lIE5VTV9CVUZQT09MCTMyCi0jZGVmaW5lIFNUQVJUX0VUSF9CVUZOVU0JMgotI2RlZmluZSBTVEFSVF9CUF9CVUZOVU0JCTB4MjIKLSNkZWZpbmUgU1RBUlRfUklOR19OVU0JCTgKKworI2RlZmluZSBTVEFSVF9DUFVfQlVGTlVNXzAJMAorI2RlZmluZSBTVEFSVF9FVEhfQlVGTlVNXzAJMgorI2RlZmluZSBTVEFSVF9CUF9CVUZOVU1fMAkweDIyCisjZGVmaW5lIFNUQVJUX1JJTkdfTlVNXzAJOAorI2RlZmluZSBTVEFSVF9DUFVfQlVGTlVNXzEJMTIKKyNkZWZpbmUgU1RBUlRfRVRIX0JVRk5VTV8xCTEwCisjZGVmaW5lIFNUQVJUX0JQX0JVRk5VTV8xCTB4MkEKKyNkZWZpbmUgU1RBUlRfUklOR19OVU1fMQkyNjQKKworI2RlZmluZSBJUlFfSURfU0laRQkJMTYKKyNkZWZpbmUgWEdFTkVfTUFYX1RYQ19SSU5HUwkxCiAKICNkZWZpbmUgUEhZX1BPTExfTElOS19PTgkoMTAgKiBIWikKICNkZWZpbmUgUEhZX1BPTExfTElOS19PRkYJKFBIWV9QT0xMX0xJTktfT04gLyA1KQpAQCAtNTcsNiArNjYsNyBAQAogCXUxNiB0YWlsOwogCXUxNiBzbG90czsKIAl1MTYgaXJxOworCWNoYXIgaXJxX25hbWVbSVJRX0lEX1NJWkVdOwogCXUzMiBzaXplOwogCXUzMiBzdGF0ZVtOVU1fUklOR19DT05GSUddOwogCXZvaWQgX19pb21lbSAqY21kX2Jhc2U7CkBAIC0xMTEsNiArMTIxLDggQEAKIAl1MzIgY3BfcWNudF9oaTsKIAl1MzIgY3BfcWNudF9sb3c7CiAJdTMyIHJ4X2lycTsKKwl1MzIgdHhjX2lycTsKKwl1OCBjcV9jbnQ7CiAJdm9pZCBfX2lvbWVtICpldGhfY3NyX2FkZHI7CiAJdm9pZCBfX2lvbWVtICpldGhfcmluZ19pZl9hZGRyOwogCXZvaWQgX19pb21lbSAqZXRoX2RpYWdfY3NyX2FkZHI7CkBAIC0xMjUsNiArMTM3LDExIEBACiAJc3RydWN0IHhnZW5lX21hY19vcHMgKm1hY19vcHM7CiAJc3RydWN0IHhnZW5lX3BvcnRfb3BzICpwb3J0X29wczsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfd29yazsKKwl1MzIgcG9ydF9pZDsKKwl1OCBjcHVfYnVmbnVtOworCXU4IGV0aF9idWZudW07CisJdTggYnBfYnVmbnVtOworCXUxNiByaW5nX251bTsKIH07CiAKIHN0cnVjdCB4Z2VuZV9pbmRpcmVjdF9jdGwgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfc2dtYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwbS94Z2VuZS94Z2VuZV9lbmV0X3NnbWFjLmMKaW5kZXggZjVkNGY2OC4uZjI3ZmI2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBtL3hnZW5lL3hnZW5lX2VuZXRfc2dtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcG0veGdlbmUveGdlbmVfZW5ldF9zZ21hYy5jCkBAIC0yMjYsNiArMjI2LDcgQEAKIHN0YXRpYyB2b2lkIHhnZW5lX3NnbWFjX2luaXQoc3RydWN0IHhnZW5lX2VuZXRfcGRhdGEgKnApCiB7CiAJdTMyIGRhdGEsIGxvb3AgPSAxMDsKKwl1MzIgb2Zmc2V0ID0gcC0+cG9ydF9pZCAqIDQ7CiAKIAl4Z2VuZV9zZ21hY19yZXNldChwKTsKIApAQCAtMjcyLDkgKzI3Myw5IEBACiAJeGdlbmVfZW5ldF93cl9jc3IocCwgUlNJRl9SQU1fREJHX1JFRzBfQUREUiwgMCk7CiAKIAkvKiBCeXBhc3MgdHJhZmZpYyBnYXRpbmcgKi8KLQl4Z2VuZV9lbmV0X3dyX2NzcihwLCBDRkdfTElOS19BR0dSX1JFU1VNRV8wX0FERFIsIFRYX1BPUlQwKTsKKwl4Z2VuZV9lbmV0X3dyX2NzcihwLCBDRkdfTElOS19BR0dSX1JFU1VNRV8wX0FERFIgKyBvZmZzZXQsIFRYX1BPUlQwKTsKIAl4Z2VuZV9lbmV0X3dyX2NzcihwLCBDRkdfQllQQVNTX0FERFIsIFJFU1VNRV9UWCk7Ci0JeGdlbmVfZW5ldF93cl9jc3IocCwgU0dfUlhfRFZfR0FURV9SRUdfMF9BRERSLCBSRVNVTUVfUlgwKTsKKwl4Z2VuZV9lbmV0X3dyX2NzcihwLCBTR19SWF9EVl9HQVRFX1JFR18wX0FERFIgKyBvZmZzZXQsIFJFU1VNRV9SWDApOwogfQogCiBzdGF0aWMgdm9pZCB4Z2VuZV9zZ21hY19yeHR4KHN0cnVjdCB4Z2VuZV9lbmV0X3BkYXRhICpwLCB1MzIgYml0cywgYm9vbCBzZXQpCkBAIC0zMzAsMTMgKzMzMSwxNCBAQAogCQkJCSAgdTMyIGRzdF9yaW5nX251bSwgdTE2IGJ1ZnBvb2xfaWQpCiB7CiAJdTMyIGRhdGEsIGZwc2VsOworCXUzMiBvZmZzZXQgPSBwLT5wb3J0X2lkICogTUFDX09GRlNFVDsKIAogCWRhdGEgPSBDRkdfQ0xFX0JZUEFTU19FTjA7Ci0JeGdlbmVfZW5ldF93cl9jc3IocCwgQ0xFX0JZUEFTU19SRUcwXzBfQUREUiwgZGF0YSk7CisJeGdlbmVfZW5ldF93cl9jc3IocCwgQ0xFX0JZUEFTU19SRUcwXzBfQUREUiArIG9mZnNldCwgZGF0YSk7CiAKIAlmcHNlbCA9IHhnZW5lX2VuZXRfcmluZ19idWZudW0oYnVmcG9vbF9pZCkgLSAweDIwOwogCWRhdGEgPSBDRkdfQ0xFX0RTVFFJRDAoZHN0X3JpbmdfbnVtKSB8IENGR19DTEVfRlBTRUwwKGZwc2VsKTsKLQl4Z2VuZV9lbmV0X3dyX2NzcihwLCBDTEVfQllQQVNTX1JFRzFfMF9BRERSLCBkYXRhKTsKKwl4Z2VuZV9lbmV0X3dyX2NzcihwLCBDTEVfQllQQVNTX1JFRzFfMF9BRERSICsgb2Zmc2V0LCBkYXRhKTsKIH0KIAogc3RhdGljIHZvaWQgeGdlbmVfZW5ldF9zaHV0ZG93bihzdHJ1Y3QgeGdlbmVfZW5ldF9wZGF0YSAqcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL2JtYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL2JtYWMuYwppbmRleCBjMGJkNjM4Li5hNjVkN2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcHBsZS9ibWFjLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvYm1hYy5jCkBAIC0xNjIxLDcgKzE2MjEsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBibWFjX21hdGNoW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYm1hY19tYXRjaFtdID0KIHsKIAl7CiAJLm5hbWUgCQk9ICJibWFjIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL21hY2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL21hY2UuYwppbmRleCA3M2FmZTQ5Li5lNThhN2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcHBsZS9tYWNlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvbWFjZS5jCkBAIC03MjAsNyArNzIwLDcgQEAKIAkgICAgbWFjZV9yZXNldChkZXYpOwogCQkvKgogCQkgKiBYWFggbWFjZSBsaWtlcyB0byBoYW5nIHRoZSBtYWNoaW5lIGFmdGVyIGEgeG10ZnMgZXJyb3IuCi0JCSAqIFRoaXMgaXMgaGFyZCB0byByZXByb2R1Y2UsIHJlc2V0aW5nICptYXkqIGhlbHAKKwkJICogVGhpcyBpcyBoYXJkIHRvIHJlcHJvZHVjZSwgcmVzZXR0aW5nICptYXkqIGhlbHAKIAkJICovCiAJfQogCWNwID0gbXAtPnR4X2NtZHMgKyBOQ01EU19UWCAqIGk7CkBAIC05ODQsNyArOTg0LDcgQEAKICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1hY2VfbWF0Y2hbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtYWNlX21hdGNoW10gPQogewogCXsKIAkubmFtZSAJCT0gIm1hY2UiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvbWFjbWFjZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXBwbGUvbWFjbWFjZS5jCmluZGV4IDZlNjYxMjcuLjg5OTE0Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FwcGxlL21hY21hY2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hcHBsZS9tYWNtYWNlLmMKQEAgLTU3NSw3ICs1NzUsNyBAQAogCQkJbWFjZV9yZXNldChkZXYpOwogCQkJLyoKIAkJCSAqIFhYWCBtYWNlIGxpa2VzIHRvIGhhbmcgdGhlIG1hY2hpbmUgYWZ0ZXIgYSB4bXRmcyBlcnJvci4KLQkJCSAqIFRoaXMgaXMgaGFyZCB0byByZXByb2R1Y2UsIHJlc2V0aW5nICptYXkqIGhlbHAKKwkJCSAqIFRoaXMgaXMgaGFyZCB0byByZXByb2R1Y2UsIHJlc2V0dGluZyAqbWF5KiBoZWxwCiAJCQkgKi8KIAkJfQogCQkvKiBkbWEgc2hvdWxkIGhhdmUgZmluaXNoZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRsMWMvYXRsMWNfaHcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRsMWMvYXRsMWNfaHcuYwppbmRleCA1MmZkZmUyLi5hOGI4MGM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFjL2F0bDFjX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxYy9hdGwxY19ody5jCkBAIC0zMDcsNyArMzA3LDcgQEAKIAogLyoKICAqIGF0bDFjX3JlYWRfcGh5X2NvcmUKLSAqIGNvcmUgZnVudGlvbiB0byByZWFkIHJlZ2lzdGVyIGluIFBIWSB2aWEgTURJTyBjb250cm9sIHJlZ3NpdGVyLgorICogY29yZSBmdW5jdGlvbiB0byByZWFkIHJlZ2lzdGVyIGluIFBIWSB2aWEgTURJTyBjb250cm9sIHJlZ3NpdGVyLgogICogZXh0OiBleHRlbnNpb24gcmVnaXN0ZXIgKHNlZSBJRUVFIDgwMi4zKQogICogZGV2OiBkZXZpY2UgYWRkcmVzcyAoc2VlIElFRUUgODAyLjMgREVWQUQsIFBSVEFEIGlzIGZpeGVkIHRvIDApCiAgKiByZWc6IHJlZyB0byByZWFkCkBAIC0zNTYsNyArMzU2LDcgQEAKIAogLyoKICAqIGF0bDFjX3dyaXRlX3BoeV9jb3JlCi0gKiBjb3JlIGZ1bnRpb24gdG8gd3JpdGUgdG8gcmVnaXN0ZXIgaW4gUEhZIHZpYSBNRElPIGNvbnRyb2wgcmVnc2l0ZXIuCisgKiBjb3JlIGZ1bmN0aW9uIHRvIHdyaXRlIHRvIHJlZ2lzdGVyIGluIFBIWSB2aWEgTURJTyBjb250cm9sIHJlZ2lzdGVyLgogICogZXh0OiBleHRlbnNpb24gcmVnaXN0ZXIgKHNlZSBJRUVFIDgwMi4zKQogICogZGV2OiBkZXZpY2UgYWRkcmVzcyAoc2VlIElFRUUgODAyLjMgREVWQUQsIFBSVEFEIGlzIGZpeGVkIHRvIDApCiAgKiByZWc6IHJlZyB0byB3cml0ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxYy9hdGwxY19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFjL2F0bDFjX21haW4uYwppbmRleCA1ODdmNjNlLi45MzJiZDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFjL2F0bDFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFjL2F0bDFjX21haW4uYwpAQCAtNzUyLDcgKzc1Miw3IEBACiAKIAlpZiAoaHctPmRldmljZV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FUSEVST1NfTDJDX0IyICYmCiAJICAgIGh3LT5yZXZpc2lvbl9pZCA9PSBMMkNCX1YyMSkgewotCQkvKiBjb25maWcgYWNlc3MgbW9kZSAqLworCQkvKiBjb25maWcgYWNjZXNzIG1vZGUgKi8KIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCBSRUdfUENJRV9JTkRfQUNDX0FERFIsCiAJCQkJICAgICAgIFJFR19QQ0lFX0RFVl9NSVNDX0NUUkwpOwogCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgUkVHX1BDSUVfSU5EX0FDQ19EQVRBLCAmbWlzY19jdHJsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9LY29uZmlnCmluZGV4IDQxYTNjOTguLmE2ZjkxNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vS2NvbmZpZwpAQCAtNzEsMTIgKzcxLDEyIEBACiAJICBCcm9hZGNvbSBCQ003eHh4IFNldCBUb3AgQm94IGZhbWlseSBjaGlwc2V0LgogCiBjb25maWcgQk5YMgotCXRyaXN0YXRlICJRTG9naWMgTmV0WHRyZW1lSUkgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiUUxvZ2ljIGJueDIgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQogCXNlbGVjdCBDUkMzMgogCXNlbGVjdCBGV19MT0FERVIKIAktLS1oZWxwLS0tCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyBRTG9naWMgTmV0WHRyZW1lSUkgZ2lnYWJpdCBFdGhlcm5ldCBjYXJkcy4KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFFMb2dpYyBibngyIGdpZ2FiaXQgRXRoZXJuZXQgY2FyZHMuCiAKIAkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGJueDIuICBUaGlzIGlzIHJlY29tbWVuZGVkLgpAQCAtODcsOCArODcsOCBAQAogCXNlbGVjdCBCTlgyCiAJc2VsZWN0IFVJTwogCS0tLWhlbHAtLS0KLQkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIG9mZmxvYWQgZmVhdHVyZXMgb2YgUUxvZ2ljIE5ldFh0cmVtZUlJCi0JICBnaWdhYml0IEV0aGVybmV0IGNhcmRzLgorCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgb2ZmbG9hZCBmZWF0dXJlcyBvZiBRTG9naWMgYm54MiBnaWdhYml0CisJICBFdGhlcm5ldCBjYXJkcy4KIAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgY25pYy4gIFRoaXMgaXMgcmVjb21tZW5kZWQuCkBAIC0xNDIsNyArMTQyLDcgQEAKIAogY29uZmlnIEJHTUFDCiAJdHJpc3RhdGUgIkJDTUEgYnVzIEdCaXQgY29yZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQkNNQV9IT1NUX1NPQyAmJiBIQVNfRE1BICYmIEJDTTQ3WFgKKwlkZXBlbmRzIG9uIEJDTUFfSE9TVF9TT0MgJiYgSEFTX0RNQSAmJiAoQkNNNDdYWCB8fCBBUkNIX0JDTV81MzAxWCkKIAlzZWxlY3QgUEhZTElCCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgR0JpdCBNQUMgYW5kIEJDTTQ3MDYgR0JpdCBNQUMgY29yZXMgb24gQkNNQSBidXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMuYwppbmRleCAwNDY5ZjcyLi41Y2I5M2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeV9maXhlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8YmNtNDd4eF9udnJhbS5oPgpAQCAtMTE0LDU0ICsxMTUsODkgQEAKIAliZ21hY193cml0ZShiZ21hYywgcmluZy0+bW1pb19iYXNlICsgQkdNQUNfRE1BX1RYX0NUTCwgY3RsKTsKIH0KIAorc3RhdGljIHZvaWQKK2JnbWFjX2RtYV90eF9hZGRfYnVmKHN0cnVjdCBiZ21hYyAqYmdtYWMsIHN0cnVjdCBiZ21hY19kbWFfcmluZyAqcmluZywKKwkJICAgICBpbnQgaSwgaW50IGxlbiwgdTMyIGN0bDApCit7CisJc3RydWN0IGJnbWFjX3Nsb3RfaW5mbyAqc2xvdDsKKwlzdHJ1Y3QgYmdtYWNfZG1hX2Rlc2MgKmRtYV9kZXNjOworCXUzMiBjdGwxOworCisJaWYgKGkgPT0gQkdNQUNfVFhfUklOR19TTE9UUyAtIDEpCisJCWN0bDAgfD0gQkdNQUNfREVTQ19DVEwwX0VPVDsKKworCWN0bDEgPSBsZW4gJiBCR01BQ19ERVNDX0NUTDFfTEVOOworCisJc2xvdCA9ICZyaW5nLT5zbG90c1tpXTsKKwlkbWFfZGVzYyA9ICZyaW5nLT5jcHVfYmFzZVtpXTsKKwlkbWFfZGVzYy0+YWRkcl9sb3cgPSBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKHNsb3QtPmRtYV9hZGRyKSk7CisJZG1hX2Rlc2MtPmFkZHJfaGlnaCA9IGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMoc2xvdC0+ZG1hX2FkZHIpKTsKKwlkbWFfZGVzYy0+Y3RsMCA9IGNwdV90b19sZTMyKGN0bDApOworCWRtYV9kZXNjLT5jdGwxID0gY3B1X3RvX2xlMzIoY3RsMSk7Cit9CisKIHN0YXRpYyBuZXRkZXZfdHhfdCBiZ21hY19kbWFfdHhfYWRkKHN0cnVjdCBiZ21hYyAqYmdtYWMsCiAJCQkJICAgIHN0cnVjdCBiZ21hY19kbWFfcmluZyAqcmluZywKIAkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkbWFfZGV2ID0gYmdtYWMtPmNvcmUtPmRtYV9kZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYgPSBiZ21hYy0+bmV0X2RldjsKLQlzdHJ1Y3QgYmdtYWNfZG1hX2Rlc2MgKmRtYV9kZXNjOwotCXN0cnVjdCBiZ21hY19zbG90X2luZm8gKnNsb3Q7Ci0JdTMyIGN0bDAsIGN0bDE7Ci0JaW50IGZyZWVfc2xvdHM7CisJaW50IGluZGV4ID0gcmluZy0+ZW5kICUgQkdNQUNfVFhfUklOR19TTE9UUzsKKwlzdHJ1Y3QgYmdtYWNfc2xvdF9pbmZvICpzbG90ID0gJnJpbmctPnNsb3RzW2luZGV4XTsKKwlpbnQgbnJfZnJhZ3M7CisJdTMyIGZsYWdzOworCWludCBpOwogCiAJaWYgKHNrYi0+bGVuID4gQkdNQUNfREVTQ19DVEwxX0xFTikgewogCQliZ21hY19lcnIoYmdtYWMsICJUb28gbG9uZyBza2IgKCVkKVxuIiwgc2tiLT5sZW4pOwotCQlnb3RvIGVycl9zdG9wX2Ryb3A7CisJCWdvdG8gZXJyX2Ryb3A7CiAJfQogCi0JaWYgKHJpbmctPnN0YXJ0IDw9IHJpbmctPmVuZCkKLQkJZnJlZV9zbG90cyA9IHJpbmctPnN0YXJ0IC0gcmluZy0+ZW5kICsgQkdNQUNfVFhfUklOR19TTE9UUzsKLQllbHNlCi0JCWZyZWVfc2xvdHMgPSByaW5nLT5zdGFydCAtIHJpbmctPmVuZDsKLQlpZiAoZnJlZV9zbG90cyA9PSAxKSB7CisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCisJCXNrYl9jaGVja3N1bV9oZWxwKHNrYik7CisKKwlucl9mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CisKKwkvKiByaW5nLT5lbmQgLSByaW5nLT5zdGFydCB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIHZhbGlkIHNsb3RzLAorCSAqIGV2ZW4gd2hlbiByaW5nLT5lbmQgb3ZlcmZsb3dzCisJICovCisJaWYgKHJpbmctPmVuZCAtIHJpbmctPnN0YXJ0ICsgbnJfZnJhZ3MgKyAxID49IEJHTUFDX1RYX1JJTkdfU0xPVFMpIHsKIAkJYmdtYWNfZXJyKGJnbWFjLCAiVFggcmluZyBpcyBmdWxsLCBxdWV1ZSBzaG91bGQgYmUgc3RvcHBlZCFcbiIpOwogCQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOwogCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7CiAJfQogCi0Jc2xvdCA9ICZyaW5nLT5zbG90c1tyaW5nLT5lbmRdOwotCXNsb3QtPnNrYiA9IHNrYjsKLQlzbG90LT5kbWFfYWRkciA9IGRtYV9tYXBfc2luZ2xlKGRtYV9kZXYsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCisJc2xvdC0+ZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShkbWFfZGV2LCBza2ItPmRhdGEsIHNrYl9oZWFkbGVuKHNrYiksCiAJCQkJCURNQV9UT19ERVZJQ0UpOwotCWlmIChkbWFfbWFwcGluZ19lcnJvcihkbWFfZGV2LCBzbG90LT5kbWFfYWRkcikpIHsKLQkJYmdtYWNfZXJyKGJnbWFjLCAiTWFwcGluZyBlcnJvciBvZiBza2Igb24gcmluZyAweCVYXG4iLAotCQkJICByaW5nLT5tbWlvX2Jhc2UpOwotCQlnb3RvIGVycl9zdG9wX2Ryb3A7CisJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKGRtYV9kZXYsIHNsb3QtPmRtYV9hZGRyKSkpCisJCWdvdG8gZXJyX2RtYV9oZWFkOworCisJZmxhZ3MgPSBCR01BQ19ERVNDX0NUTDBfU09GOworCWlmICghbnJfZnJhZ3MpCisJCWZsYWdzIHw9IEJHTUFDX0RFU0NfQ1RMMF9FT0YgfCBCR01BQ19ERVNDX0NUTDBfSU9DOworCisJYmdtYWNfZG1hX3R4X2FkZF9idWYoYmdtYWMsIHJpbmcsIGluZGV4LCBza2JfaGVhZGxlbihza2IpLCBmbGFncyk7CisJZmxhZ3MgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG5yX2ZyYWdzOyBpKyspIHsKKwkJc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQlpbnQgbGVuID0gc2tiX2ZyYWdfc2l6ZShmcmFnKTsKKworCQlpbmRleCA9IChpbmRleCArIDEpICUgQkdNQUNfVFhfUklOR19TTE9UUzsKKwkJc2xvdCA9ICZyaW5nLT5zbG90c1tpbmRleF07CisJCXNsb3QtPmRtYV9hZGRyID0gc2tiX2ZyYWdfZG1hX21hcChkbWFfZGV2LCBmcmFnLCAwLAorCQkJCQkJICBsZW4sIERNQV9UT19ERVZJQ0UpOworCQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoZG1hX2Rldiwgc2xvdC0+ZG1hX2FkZHIpKSkKKwkJCWdvdG8gZXJyX2RtYTsKKworCQlpZiAoaSA9PSBucl9mcmFncyAtIDEpCisJCQlmbGFncyB8PSBCR01BQ19ERVNDX0NUTDBfRU9GIHwgQkdNQUNfREVTQ19DVEwwX0lPQzsKKworCQliZ21hY19kbWFfdHhfYWRkX2J1ZihiZ21hYywgcmluZywgaW5kZXgsIGxlbiwgZmxhZ3MpOwogCX0KIAotCWN0bDAgPSBCR01BQ19ERVNDX0NUTDBfSU9DIHwgQkdNQUNfREVTQ19DVEwwX1NPRiB8IEJHTUFDX0RFU0NfQ1RMMF9FT0Y7Ci0JaWYgKHJpbmctPmVuZCA9PSByaW5nLT5udW1fc2xvdHMgLSAxKQotCQljdGwwIHw9IEJHTUFDX0RFU0NfQ1RMMF9FT1Q7Ci0JY3RsMSA9IHNrYi0+bGVuICYgQkdNQUNfREVTQ19DVEwxX0xFTjsKLQotCWRtYV9kZXNjID0gcmluZy0+Y3B1X2Jhc2U7Ci0JZG1hX2Rlc2MgKz0gcmluZy0+ZW5kOwotCWRtYV9kZXNjLT5hZGRyX2xvdyA9IGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMoc2xvdC0+ZG1hX2FkZHIpKTsKLQlkbWFfZGVzYy0+YWRkcl9oaWdoID0gY3B1X3RvX2xlMzIodXBwZXJfMzJfYml0cyhzbG90LT5kbWFfYWRkcikpOwotCWRtYV9kZXNjLT5jdGwwID0gY3B1X3RvX2xlMzIoY3RsMCk7Ci0JZG1hX2Rlc2MtPmN0bDEgPSBjcHVfdG9fbGUzMihjdGwxKTsKLQorCXNsb3QtPnNrYiA9IHNrYjsKKwlyaW5nLT5lbmQgKz0gbnJfZnJhZ3MgKyAxOwogCW5ldGRldl9zZW50X3F1ZXVlKG5ldF9kZXYsIHNrYi0+bGVuKTsKIAogCXdtYigpOwpAQCAtMTY5LDIwICsyMDUsMzQgQEAKIAkvKiBJbmNyZWFzZSByaW5nLT5lbmQgdG8gcG9pbnQgZW1wdHkgc2xvdC4gV2UgdGVsbCBoYXJkd2FyZSB0aGUgZmlyc3QKIAkgKiBzbG90IGl0IHNob3VsZCAqbm90KiByZWFkLgogCSAqLwotCWlmICgrK3JpbmctPmVuZCA+PSBCR01BQ19UWF9SSU5HX1NMT1RTKQotCQlyaW5nLT5lbmQgPSAwOwogCWJnbWFjX3dyaXRlKGJnbWFjLCByaW5nLT5tbWlvX2Jhc2UgKyBCR01BQ19ETUFfVFhfSU5ERVgsCiAJCSAgICByaW5nLT5pbmRleF9iYXNlICsKLQkJICAgIHJpbmctPmVuZCAqIHNpemVvZihzdHJ1Y3QgYmdtYWNfZG1hX2Rlc2MpKTsKKwkJICAgIChyaW5nLT5lbmQgJSBCR01BQ19UWF9SSU5HX1NMT1RTKSAqCisJCSAgICBzaXplb2Yoc3RydWN0IGJnbWFjX2RtYV9kZXNjKSk7CiAKLQkvKiBBbHdheXMga2VlcCBvbmUgc2xvdCBmcmVlIHRvIGFsbG93IGRldGVjdGluZyBidWdnZWQgY2FsbHMuICovCi0JaWYgKC0tZnJlZV9zbG90cyA9PSAxKQorCWlmIChyaW5nLT5lbmQgLSByaW5nLT5zdGFydCA+PSBCR01BQ19UWF9SSU5HX1NMT1RTIC0gOCkKIAkJbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKIAogCXJldHVybiBORVRERVZfVFhfT0s7CiAKLWVycl9zdG9wX2Ryb3A6Ci0JbmV0aWZfc3RvcF9xdWV1ZShuZXRfZGV2KTsKK2Vycl9kbWE6CisJZG1hX3VubWFwX3NpbmdsZShkbWFfZGV2LCBzbG90LT5kbWFfYWRkciwgc2tiX2hlYWRsZW4oc2tiKSwKKwkJCSBETUFfVE9fREVWSUNFKTsKKworCXdoaWxlIChpID4gMCkgeworCQlpbnQgaW5kZXggPSAocmluZy0+ZW5kICsgaSkgJSBCR01BQ19UWF9SSU5HX1NMT1RTOworCQlzdHJ1Y3QgYmdtYWNfc2xvdF9pbmZvICpzbG90ID0gJnJpbmctPnNsb3RzW2luZGV4XTsKKwkJdTMyIGN0bDEgPSBsZTMyX3RvX2NwdShyaW5nLT5jcHVfYmFzZVtpbmRleF0uY3RsMSk7CisJCWludCBsZW4gPSBjdGwxICYgQkdNQUNfREVTQ19DVEwxX0xFTjsKKworCQlkbWFfdW5tYXBfcGFnZShkbWFfZGV2LCBzbG90LT5kbWFfYWRkciwgbGVuLCBETUFfVE9fREVWSUNFKTsKKwl9CisKK2Vycl9kbWFfaGVhZDoKKwliZ21hY19lcnIoYmdtYWMsICJNYXBwaW5nIGVycm9yIG9mIHNrYiBvbiByaW5nIDB4JVhcbiIsCisJCSAgcmluZy0+bW1pb19iYXNlKTsKKworZXJyX2Ryb3A6CiAJZGV2X2tmcmVlX3NrYihza2IpOwogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CkBAIC0yMDIsMzQgKzI1Miw0NSBAQAogCWVtcHR5X3Nsb3QgJj0gQkdNQUNfRE1BX1RYX1NUQVREUFRSOwogCWVtcHR5X3Nsb3QgLz0gc2l6ZW9mKHN0cnVjdCBiZ21hY19kbWFfZGVzYyk7CiAKLQl3aGlsZSAocmluZy0+c3RhcnQgIT0gZW1wdHlfc2xvdCkgewotCQlzdHJ1Y3QgYmdtYWNfc2xvdF9pbmZvICpzbG90ID0gJnJpbmctPnNsb3RzW3JpbmctPnN0YXJ0XTsKKwl3aGlsZSAocmluZy0+c3RhcnQgIT0gcmluZy0+ZW5kKSB7CisJCWludCBzbG90X2lkeCA9IHJpbmctPnN0YXJ0ICUgQkdNQUNfVFhfUklOR19TTE9UUzsKKwkJc3RydWN0IGJnbWFjX3Nsb3RfaW5mbyAqc2xvdCA9ICZyaW5nLT5zbG90c1tzbG90X2lkeF07CisJCXUzMiBjdGwxOworCQlpbnQgbGVuOworCisJCWlmIChzbG90X2lkeCA9PSBlbXB0eV9zbG90KQorCQkJYnJlYWs7CisKKwkJY3RsMSA9IGxlMzJfdG9fY3B1KHJpbmctPmNwdV9iYXNlW3Nsb3RfaWR4XS5jdGwxKTsKKwkJbGVuID0gY3RsMSAmIEJHTUFDX0RFU0NfQ1RMMV9MRU47CisJCWlmIChjdGwxICYgQkdNQUNfREVTQ19DVEwwX1NPRikKKwkJCS8qIFVubWFwIG5vIGxvbmdlciB1c2VkIGJ1ZmZlciAqLworCQkJZG1hX3VubWFwX3NpbmdsZShkbWFfZGV2LCBzbG90LT5kbWFfYWRkciwgbGVuLAorCQkJCQkgRE1BX1RPX0RFVklDRSk7CisJCWVsc2UKKwkJCWRtYV91bm1hcF9wYWdlKGRtYV9kZXYsIHNsb3QtPmRtYV9hZGRyLCBsZW4sCisJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOwogCiAJCWlmIChzbG90LT5za2IpIHsKLQkJCS8qIFVubWFwIG5vIGxvbmdlciB1c2VkIGJ1ZmZlciAqLwotCQkJZG1hX3VubWFwX3NpbmdsZShkbWFfZGV2LCBzbG90LT5kbWFfYWRkciwKLQkJCQkJIHNsb3QtPnNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKLQkJCXNsb3QtPmRtYV9hZGRyID0gMDsKLQogCQkJYnl0ZXNfY29tcGwgKz0gc2xvdC0+c2tiLT5sZW47CiAJCQlwa3RzX2NvbXBsKys7CiAKIAkJCS8qIEZyZWUgbWVtb3J5ISA6KSAqLwogCQkJZGV2X2tmcmVlX3NrYihzbG90LT5za2IpOwogCQkJc2xvdC0+c2tiID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCWJnbWFjX2VycihiZ21hYywgIkhhcmR3YXJlIHJlcG9ydGVkIHRyYW5zbWlzc2lvbiBmb3IgZW1wdHkgVFggcmluZyBzbG90ICVkISBFbmQgb2YgcmluZzogJWRcbiIsCi0JCQkJICByaW5nLT5zdGFydCwgcmluZy0+ZW5kKTsKIAkJfQogCi0JCWlmICgrK3JpbmctPnN0YXJ0ID49IEJHTUFDX1RYX1JJTkdfU0xPVFMpCi0JCQlyaW5nLT5zdGFydCA9IDA7CisJCXNsb3QtPmRtYV9hZGRyID0gMDsKKwkJcmluZy0+c3RhcnQrKzsKIAkJZnJlZWQgPSB0cnVlOwogCX0KIAorCWlmICghcGt0c19jb21wbCkKKwkJcmV0dXJuOworCiAJbmV0ZGV2X2NvbXBsZXRlZF9xdWV1ZShiZ21hYy0+bmV0X2RldiwgcGt0c19jb21wbCwgYnl0ZXNfY29tcGwpOwogCi0JaWYgKGZyZWVkICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoYmdtYWMtPm5ldF9kZXYpKQorCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKGJnbWFjLT5uZXRfZGV2KSkKIAkJbmV0aWZfd2FrZV9xdWV1ZShiZ21hYy0+bmV0X2Rldik7CiB9CiAKQEAgLTI3NSw0MyArMzM2LDUzIEBACiAJCQkJICAgICBzdHJ1Y3QgYmdtYWNfc2xvdF9pbmZvICpzbG90KQogewogCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXYgPSBiZ21hYy0+Y29yZS0+ZG1hX2RldjsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWRtYV9hZGRyX3QgZG1hX2FkZHI7CiAJc3RydWN0IGJnbWFjX3J4X2hlYWRlciAqcng7CisJdm9pZCAqYnVmOwogCiAJLyogQWxsb2Mgc2tiICovCi0Jc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihiZ21hYy0+bmV0X2RldiwgQkdNQUNfUlhfQlVGX1NJWkUpOwotCWlmICghc2tiKQorCWJ1ZiA9IG5ldGRldl9hbGxvY19mcmFnKEJHTUFDX1JYX0FMTE9DX1NJWkUpOworCWlmICghYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIFBvaXNvbiAtIGlmIGV2ZXJ5dGhpbmcgZ29lcyBmaW5lLCBoYXJkd2FyZSB3aWxsIG92ZXJ3cml0ZSBpdCAqLwotCXJ4ID0gKHN0cnVjdCBiZ21hY19yeF9oZWFkZXIgKilza2ItPmRhdGE7CisJcnggPSBidWYgKyBCR01BQ19SWF9CVUZfT0ZGU0VUOwogCXJ4LT5sZW4gPSBjcHVfdG9fbGUxNigweGRlYWQpOwogCXJ4LT5mbGFncyA9IGNwdV90b19sZTE2KDB4YmVlZik7CiAKIAkvKiBNYXAgc2tiIGZvciB0aGUgRE1BICovCi0JZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShkbWFfZGV2LCBza2ItPmRhdGEsCisJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZShkbWFfZGV2LCBidWYgKyBCR01BQ19SWF9CVUZfT0ZGU0VULAogCQkJCSAgQkdNQUNfUlhfQlVGX1NJWkUsIERNQV9GUk9NX0RFVklDRSk7CiAJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRtYV9kZXYsIGRtYV9hZGRyKSkgewogCQliZ21hY19lcnIoYmdtYWMsICJETUEgbWFwcGluZyBlcnJvclxuIik7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcHV0X3BhZ2UodmlydF90b19oZWFkX3BhZ2UoYnVmKSk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCS8qIFVwZGF0ZSB0aGUgc2xvdCAqLwotCXNsb3QtPnNrYiA9IHNrYjsKKwlzbG90LT5idWYgPSBidWY7CiAJc2xvdC0+ZG1hX2FkZHIgPSBkbWFfYWRkcjsKIAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBiZ21hY19kbWFfcnhfdXBkYXRlX2luZGV4KHN0cnVjdCBiZ21hYyAqYmdtYWMsCisJCQkJICAgICAgc3RydWN0IGJnbWFjX2RtYV9yaW5nICpyaW5nKQoreworCWRtYV93bWIoKTsKKworCWJnbWFjX3dyaXRlKGJnbWFjLCByaW5nLT5tbWlvX2Jhc2UgKyBCR01BQ19ETUFfUlhfSU5ERVgsCisJCSAgICByaW5nLT5pbmRleF9iYXNlICsKKwkJICAgIHJpbmctPmVuZCAqIHNpemVvZihzdHJ1Y3QgYmdtYWNfZG1hX2Rlc2MpKTsKK30KKwogc3RhdGljIHZvaWQgYmdtYWNfZG1hX3J4X3NldHVwX2Rlc2Moc3RydWN0IGJnbWFjICpiZ21hYywKIAkJCQkgICAgc3RydWN0IGJnbWFjX2RtYV9yaW5nICpyaW5nLCBpbnQgZGVzY19pZHgpCiB7CiAJc3RydWN0IGJnbWFjX2RtYV9kZXNjICpkbWFfZGVzYyA9IHJpbmctPmNwdV9iYXNlICsgZGVzY19pZHg7CiAJdTMyIGN0bDAgPSAwLCBjdGwxID0gMDsKIAotCWlmIChkZXNjX2lkeCA9PSByaW5nLT5udW1fc2xvdHMgLSAxKQorCWlmIChkZXNjX2lkeCA9PSBCR01BQ19SWF9SSU5HX1NMT1RTIC0gMSkKIAkJY3RsMCB8PSBCR01BQ19ERVNDX0NUTDBfRU9UOwogCWN0bDEgfD0gQkdNQUNfUlhfQlVGX1NJWkUgJiBCR01BQ19ERVNDX0NUTDFfTEVOOwogCS8qIElzIHRoZXJlIGFueSBCR01BQyBkZXZpY2UgdGhhdCByZXF1aXJlcyBleHRlbnNpb24/ICovCkBAIC0zMjMsNiArMzk0LDIxIEBACiAJZG1hX2Rlc2MtPmFkZHJfaGlnaCA9IGNwdV90b19sZTMyKHVwcGVyXzMyX2JpdHMocmluZy0+c2xvdHNbZGVzY19pZHhdLmRtYV9hZGRyKSk7CiAJZG1hX2Rlc2MtPmN0bDAgPSBjcHVfdG9fbGUzMihjdGwwKTsKIAlkbWFfZGVzYy0+Y3RsMSA9IGNwdV90b19sZTMyKGN0bDEpOworCisJcmluZy0+ZW5kID0gZGVzY19pZHg7Cit9CisKK3N0YXRpYyB2b2lkIGJnbWFjX2RtYV9yeF9wb2lzb25fYnVmKHN0cnVjdCBkZXZpY2UgKmRtYV9kZXYsCisJCQkJICAgIHN0cnVjdCBiZ21hY19zbG90X2luZm8gKnNsb3QpCit7CisJc3RydWN0IGJnbWFjX3J4X2hlYWRlciAqcnggPSBzbG90LT5idWYgKyBCR01BQ19SWF9CVUZfT0ZGU0VUOworCisJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoZG1hX2Rldiwgc2xvdC0+ZG1hX2FkZHIsIEJHTUFDX1JYX0JVRl9TSVpFLAorCQkJCURNQV9GUk9NX0RFVklDRSk7CisJcngtPmxlbiA9IGNwdV90b19sZTE2KDB4ZGVhZCk7CisJcngtPmZsYWdzID0gY3B1X3RvX2xlMTYoMHhiZWVmKTsKKwlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShkbWFfZGV2LCBzbG90LT5kbWFfYWRkciwgQkdNQUNfUlhfQlVGX1NJWkUsCisJCQkJICAgRE1BX0ZST01fREVWSUNFKTsKIH0KIAogc3RhdGljIGludCBiZ21hY19kbWFfcnhfcmVhZChzdHJ1Y3QgYmdtYWMgKmJnbWFjLCBzdHJ1Y3QgYmdtYWNfZG1hX3JpbmcgKnJpbmcsCkBAIC0zMzcsNzAgKzQyMyw2MiBAQAogCWVuZF9zbG90ICY9IEJHTUFDX0RNQV9SWF9TVEFURFBUUjsKIAllbmRfc2xvdCAvPSBzaXplb2Yoc3RydWN0IGJnbWFjX2RtYV9kZXNjKTsKIAotCXJpbmctPmVuZCA9IGVuZF9zbG90OwotCi0Jd2hpbGUgKHJpbmctPnN0YXJ0ICE9IHJpbmctPmVuZCkgeworCXdoaWxlIChyaW5nLT5zdGFydCAhPSBlbmRfc2xvdCkgewogCQlzdHJ1Y3QgZGV2aWNlICpkbWFfZGV2ID0gYmdtYWMtPmNvcmUtPmRtYV9kZXY7CiAJCXN0cnVjdCBiZ21hY19zbG90X2luZm8gKnNsb3QgPSAmcmluZy0+c2xvdHNbcmluZy0+c3RhcnRdOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2xvdC0+c2tiOwotCQlzdHJ1Y3QgYmdtYWNfcnhfaGVhZGVyICpyeDsKKwkJc3RydWN0IGJnbWFjX3J4X2hlYWRlciAqcnggPSBzbG90LT5idWYgKyBCR01BQ19SWF9CVUZfT0ZGU0VUOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl2b2lkICpidWYgPSBzbG90LT5idWY7CisJCWRtYV9hZGRyX3QgZG1hX2FkZHIgPSBzbG90LT5kbWFfYWRkcjsKIAkJdTE2IGxlbiwgZmxhZ3M7CiAKLQkJLyogVW5tYXAgYnVmZmVyIHRvIG1ha2UgaXQgYWNjZXNzaWJsZSB0byB0aGUgQ1BVICovCi0JCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGRtYV9kZXYsIHNsb3QtPmRtYV9hZGRyLAotCQkJCQlCR01BQ19SWF9CVUZfU0laRSwgRE1BX0ZST01fREVWSUNFKTsKLQotCQkvKiBHZXQgaW5mbyBmcm9tIHRoZSBoZWFkZXIgKi8KLQkJcnggPSAoc3RydWN0IGJnbWFjX3J4X2hlYWRlciAqKXNrYi0+ZGF0YTsKLQkJbGVuID0gbGUxNl90b19jcHUocngtPmxlbik7Ci0JCWZsYWdzID0gbGUxNl90b19jcHUocngtPmZsYWdzKTsKLQogCQlkbyB7Ci0JCQlkbWFfYWRkcl90IG9sZF9kbWFfYWRkciA9IHNsb3QtPmRtYV9hZGRyOwotCQkJaW50IGVycjsKKwkJCS8qIFByZXBhcmUgbmV3IHNrYiBhcyByZXBsYWNlbWVudCAqLworCQkJaWYgKGJnbWFjX2RtYV9yeF9za2JfZm9yX3Nsb3QoYmdtYWMsIHNsb3QpKSB7CisJCQkJYmdtYWNfZG1hX3J4X3BvaXNvbl9idWYoZG1hX2Rldiwgc2xvdCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIFVubWFwIGJ1ZmZlciB0byBtYWtlIGl0IGFjY2Vzc2libGUgdG8gdGhlIENQVSAqLworCQkJZG1hX3VubWFwX3NpbmdsZShkbWFfZGV2LCBkbWFfYWRkciwKKwkJCQkJIEJHTUFDX1JYX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworCisJCQkvKiBHZXQgaW5mbyBmcm9tIHRoZSBoZWFkZXIgKi8KKwkJCWxlbiA9IGxlMTZfdG9fY3B1KHJ4LT5sZW4pOworCQkJZmxhZ3MgPSBsZTE2X3RvX2NwdShyeC0+ZmxhZ3MpOwogCiAJCQkvKiBDaGVjayBmb3IgcG9pc29uIGFuZCBkcm9wIG9yIHBhc3MgdGhlIHBhY2tldCAqLwogCQkJaWYgKGxlbiA9PSAweGRlYWQgJiYgZmxhZ3MgPT0gMHhiZWVmKSB7CiAJCQkJYmdtYWNfZXJyKGJnbWFjLCAiRm91bmQgcG9pc29uZWQgcGFja2V0IGF0IHNsb3QgJWQsIERNQSBpc3N1ZSFcbiIsCiAJCQkJCSAgcmluZy0+c3RhcnQpOwotCQkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKGRtYV9kZXYsCi0JCQkJCQkJICAgc2xvdC0+ZG1hX2FkZHIsCi0JCQkJCQkJICAgQkdNQUNfUlhfQlVGX1NJWkUsCi0JCQkJCQkJICAgRE1BX0ZST01fREVWSUNFKTsKKwkJCQlwdXRfcGFnZSh2aXJ0X3RvX2hlYWRfcGFnZShidWYpKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGxlbiA+IEJHTUFDX1JYX0FMTE9DX1NJWkUpIHsKKwkJCQliZ21hY19lcnIoYmdtYWMsICJGb3VuZCBvdmVyc2l6ZWQgcGFja2V0IGF0IHNsb3QgJWQsIERNQSBpc3N1ZSFcbiIsCisJCQkJCSAgcmluZy0+c3RhcnQpOworCQkJCXB1dF9wYWdlKHZpcnRfdG9faGVhZF9wYWdlKGJ1ZikpOwogCQkJCWJyZWFrOwogCQkJfQogCiAJCQkvKiBPbWl0IENSQy4gKi8KIAkJCWxlbiAtPSBFVEhfRkNTX0xFTjsKIAotCQkJLyogUHJlcGFyZSBuZXcgc2tiIGFzIHJlcGxhY2VtZW50ICovCi0JCQllcnIgPSBiZ21hY19kbWFfcnhfc2tiX2Zvcl9zbG90KGJnbWFjLCBzbG90KTsKLQkJCWlmIChlcnIpIHsKLQkJCQkvKiBQb2lzb24gdGhlIG9sZCBza2IgKi8KLQkJCQlyeC0+bGVuID0gY3B1X3RvX2xlMTYoMHhkZWFkKTsKLQkJCQlyeC0+ZmxhZ3MgPSBjcHVfdG9fbGUxNigweGJlZWYpOwotCi0JCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UoZG1hX2RldiwKLQkJCQkJCQkgICBzbG90LT5kbWFfYWRkciwKLQkJCQkJCQkgICBCR01BQ19SWF9CVUZfU0laRSwKLQkJCQkJCQkgICBETUFfRlJPTV9ERVZJQ0UpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJYmdtYWNfZG1hX3J4X3NldHVwX2Rlc2MoYmdtYWMsIHJpbmcsIHJpbmctPnN0YXJ0KTsKLQotCQkJLyogVW5tYXAgb2xkIHNrYiwgd2UnbGwgcGFzcyBpdCB0byB0aGUgbmV0ZmlmICovCi0JCQlkbWFfdW5tYXBfc2luZ2xlKGRtYV9kZXYsIG9sZF9kbWFfYWRkciwKLQkJCQkJIEJHTUFDX1JYX0JVRl9TSVpFLCBETUFfRlJPTV9ERVZJQ0UpOwotCi0JCQlza2JfcHV0KHNrYiwgQkdNQUNfUlhfRlJBTUVfT0ZGU0VUICsgbGVuKTsKLQkJCXNrYl9wdWxsKHNrYiwgQkdNQUNfUlhfRlJBTUVfT0ZGU0VUKTsKKwkJCXNrYiA9IGJ1aWxkX3NrYihidWYsIEJHTUFDX1JYX0FMTE9DX1NJWkUpOworCQkJc2tiX3B1dChza2IsIEJHTUFDX1JYX0ZSQU1FX09GRlNFVCArCisJCQkJQkdNQUNfUlhfQlVGX09GRlNFVCArIGxlbik7CisJCQlza2JfcHVsbChza2IsIEJHTUFDX1JYX0ZSQU1FX09GRlNFVCArCisJCQkJIEJHTUFDX1JYX0JVRl9PRkZTRVQpOwogCiAJCQlza2JfY2hlY2tzdW1fbm9uZV9hc3NlcnQoc2tiKTsKIAkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGJnbWFjLT5uZXRfZGV2KTsKLQkJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7CisJCQluYXBpX2dyb19yZWNlaXZlKCZiZ21hYy0+bmFwaSwgc2tiKTsKIAkJCWhhbmRsZWQrKzsKIAkJfSB3aGlsZSAoMCk7CiAKKwkJYmdtYWNfZG1hX3J4X3NldHVwX2Rlc2MoYmdtYWMsIHJpbmcsIHJpbmctPnN0YXJ0KTsKKwogCQlpZiAoKytyaW5nLT5zdGFydCA+PSBCR01BQ19SWF9SSU5HX1NMT1RTKQogCQkJcmluZy0+c3RhcnQgPSAwOwogCkBAIC00MDgsNiArNDg2LDggQEAKIAkJCWJyZWFrOwogCX0KIAorCWJnbWFjX2RtYV9yeF91cGRhdGVfaW5kZXgoYmdtYWMsIHJpbmcpOworCiAJcmV0dXJuIGhhbmRsZWQ7CiB9CiAKQEAgLTQzMyw0MCArNTEzLDkwIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCBiZ21hY19kbWFfcmluZ19mcmVlKHN0cnVjdCBiZ21hYyAqYmdtYWMsCi0JCQkJc3RydWN0IGJnbWFjX2RtYV9yaW5nICpyaW5nKQorc3RhdGljIHZvaWQgYmdtYWNfZG1hX3R4X3JpbmdfZnJlZShzdHJ1Y3QgYmdtYWMgKmJnbWFjLAorCQkJCSAgIHN0cnVjdCBiZ21hY19kbWFfcmluZyAqcmluZykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkbWFfZGV2ID0gYmdtYWMtPmNvcmUtPmRtYV9kZXY7CisJc3RydWN0IGJnbWFjX2RtYV9kZXNjICpkbWFfZGVzYyA9IHJpbmctPmNwdV9iYXNlOworCXN0cnVjdCBiZ21hY19zbG90X2luZm8gKnNsb3Q7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQkdNQUNfVFhfUklOR19TTE9UUzsgaSsrKSB7CisJCWludCBsZW4gPSBkbWFfZGVzY1tpXS5jdGwxICYgQkdNQUNfREVTQ19DVEwxX0xFTjsKKworCQlzbG90ID0gJnJpbmctPnNsb3RzW2ldOworCQlkZXZfa2ZyZWVfc2tiKHNsb3QtPnNrYik7CisKKwkJaWYgKCFzbG90LT5kbWFfYWRkcikKKwkJCWNvbnRpbnVlOworCisJCWlmIChzbG90LT5za2IpCisJCQlkbWFfdW5tYXBfc2luZ2xlKGRtYV9kZXYsIHNsb3QtPmRtYV9hZGRyLAorCQkJCQkgbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJZWxzZQorCQkJZG1hX3VubWFwX3BhZ2UoZG1hX2Rldiwgc2xvdC0+ZG1hX2FkZHIsCisJCQkJICAgICAgIGxlbiwgRE1BX1RPX0RFVklDRSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBiZ21hY19kbWFfcnhfcmluZ19mcmVlKHN0cnVjdCBiZ21hYyAqYmdtYWMsCisJCQkJICAgc3RydWN0IGJnbWFjX2RtYV9yaW5nICpyaW5nKQogewogCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXYgPSBiZ21hYy0+Y29yZS0+ZG1hX2RldjsKIAlzdHJ1Y3QgYmdtYWNfc2xvdF9pbmZvICpzbG90OwotCWludCBzaXplOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IHJpbmctPm51bV9zbG90czsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEJHTUFDX1JYX1JJTkdfU0xPVFM7IGkrKykgewogCQlzbG90ID0gJnJpbmctPnNsb3RzW2ldOwotCQlpZiAoc2xvdC0+c2tiKSB7Ci0JCQlpZiAoc2xvdC0+ZG1hX2FkZHIpCi0JCQkJZG1hX3VubWFwX3NpbmdsZShkbWFfZGV2LCBzbG90LT5kbWFfYWRkciwKLQkJCQkJCSBzbG90LT5za2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JCQlkZXZfa2ZyZWVfc2tiKHNsb3QtPnNrYik7Ci0JCX0KLQl9CisJCWlmICghc2xvdC0+ZG1hX2FkZHIpCisJCQljb250aW51ZTsKIAotCWlmIChyaW5nLT5jcHVfYmFzZSkgewotCQkvKiBGcmVlIHJpbmcgb2YgZGVzY3JpcHRvcnMgKi8KLQkJc2l6ZSA9IHJpbmctPm51bV9zbG90cyAqIHNpemVvZihzdHJ1Y3QgYmdtYWNfZG1hX2Rlc2MpOwotCQlkbWFfZnJlZV9jb2hlcmVudChkbWFfZGV2LCBzaXplLCByaW5nLT5jcHVfYmFzZSwKLQkJCQkgIHJpbmctPmRtYV9iYXNlKTsKKwkJZG1hX3VubWFwX3NpbmdsZShkbWFfZGV2LCBzbG90LT5kbWFfYWRkciwKKwkJCQkgQkdNQUNfUlhfQlVGX1NJWkUsCisJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCXB1dF9wYWdlKHZpcnRfdG9faGVhZF9wYWdlKHNsb3QtPmJ1ZikpOworCQlzbG90LT5kbWFfYWRkciA9IDA7CiAJfQogfQogCitzdGF0aWMgdm9pZCBiZ21hY19kbWFfcmluZ19kZXNjX2ZyZWUoc3RydWN0IGJnbWFjICpiZ21hYywKKwkJCQkgICAgIHN0cnVjdCBiZ21hY19kbWFfcmluZyAqcmluZywKKwkJCQkgICAgIGludCBudW1fc2xvdHMpCit7CisJc3RydWN0IGRldmljZSAqZG1hX2RldiA9IGJnbWFjLT5jb3JlLT5kbWFfZGV2OworCWludCBzaXplOworCisJaWYgKCFyaW5nLT5jcHVfYmFzZSkKKwkgICAgcmV0dXJuOworCisJLyogRnJlZSByaW5nIG9mIGRlc2NyaXB0b3JzICovCisJc2l6ZSA9IG51bV9zbG90cyAqIHNpemVvZihzdHJ1Y3QgYmdtYWNfZG1hX2Rlc2MpOworCWRtYV9mcmVlX2NvaGVyZW50KGRtYV9kZXYsIHNpemUsIHJpbmctPmNwdV9iYXNlLAorCQkJICByaW5nLT5kbWFfYmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJnbWFjX2RtYV9jbGVhbnVwKHN0cnVjdCBiZ21hYyAqYmdtYWMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQkdNQUNfTUFYX1RYX1JJTkdTOyBpKyspCisJCWJnbWFjX2RtYV90eF9yaW5nX2ZyZWUoYmdtYWMsICZiZ21hYy0+dHhfcmluZ1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQkdNQUNfTUFYX1JYX1JJTkdTOyBpKyspCisJCWJnbWFjX2RtYV9yeF9yaW5nX2ZyZWUoYmdtYWMsICZiZ21hYy0+cnhfcmluZ1tpXSk7Cit9CisKIHN0YXRpYyB2b2lkIGJnbWFjX2RtYV9mcmVlKHN0cnVjdCBiZ21hYyAqYmdtYWMpCiB7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQkdNQUNfTUFYX1RYX1JJTkdTOyBpKyspCi0JCWJnbWFjX2RtYV9yaW5nX2ZyZWUoYmdtYWMsICZiZ21hYy0+dHhfcmluZ1tpXSk7CisJCWJnbWFjX2RtYV9yaW5nX2Rlc2NfZnJlZShiZ21hYywgJmJnbWFjLT50eF9yaW5nW2ldLAorCQkJCQkgQkdNQUNfVFhfUklOR19TTE9UUyk7CisKIAlmb3IgKGkgPSAwOyBpIDwgQkdNQUNfTUFYX1JYX1JJTkdTOyBpKyspCi0JCWJnbWFjX2RtYV9yaW5nX2ZyZWUoYmdtYWMsICZiZ21hYy0+cnhfcmluZ1tpXSk7CisJCWJnbWFjX2RtYV9yaW5nX2Rlc2NfZnJlZShiZ21hYywgJmJnbWFjLT5yeF9yaW5nW2ldLAorCQkJCQkgQkdNQUNfUlhfUklOR19TTE9UUyk7CiB9CiAKIHN0YXRpYyBpbnQgYmdtYWNfZG1hX2FsbG9jKHN0cnVjdCBiZ21hYyAqYmdtYWMpCkBAIC00ODksMTEgKzYxOSwxMCBAQAogCiAJZm9yIChpID0gMDsgaSA8IEJHTUFDX01BWF9UWF9SSU5HUzsgaSsrKSB7CiAJCXJpbmcgPSAmYmdtYWMtPnR4X3JpbmdbaV07Ci0JCXJpbmctPm51bV9zbG90cyA9IEJHTUFDX1RYX1JJTkdfU0xPVFM7CiAJCXJpbmctPm1taW9fYmFzZSA9IHJpbmdfYmFzZVtpXTsKIAogCQkvKiBBbGxvYyByaW5nIG9mIGRlc2NyaXB0b3JzICovCi0JCXNpemUgPSByaW5nLT5udW1fc2xvdHMgKiBzaXplb2Yoc3RydWN0IGJnbWFjX2RtYV9kZXNjKTsKKwkJc2l6ZSA9IEJHTUFDX1RYX1JJTkdfU0xPVFMgKiBzaXplb2Yoc3RydWN0IGJnbWFjX2RtYV9kZXNjKTsKIAkJcmluZy0+Y3B1X2Jhc2UgPSBkbWFfemFsbG9jX2NvaGVyZW50KGRtYV9kZXYsIHNpemUsCiAJCQkJCQkgICAgICZyaW5nLT5kbWFfYmFzZSwKIAkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CkBAIC01MTQsMTQgKzY0MywxMSBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBCR01BQ19NQVhfUlhfUklOR1M7IGkrKykgewotCQlpbnQgajsKLQogCQlyaW5nID0gJmJnbWFjLT5yeF9yaW5nW2ldOwotCQlyaW5nLT5udW1fc2xvdHMgPSBCR01BQ19SWF9SSU5HX1NMT1RTOwogCQlyaW5nLT5tbWlvX2Jhc2UgPSByaW5nX2Jhc2VbaV07CiAKIAkJLyogQWxsb2MgcmluZyBvZiBkZXNjcmlwdG9ycyAqLwotCQlzaXplID0gcmluZy0+bnVtX3Nsb3RzICogc2l6ZW9mKHN0cnVjdCBiZ21hY19kbWFfZGVzYyk7CisJCXNpemUgPSBCR01BQ19SWF9SSU5HX1NMT1RTICogc2l6ZW9mKHN0cnVjdCBiZ21hY19kbWFfZGVzYyk7CiAJCXJpbmctPmNwdV9iYXNlID0gZG1hX3phbGxvY19jb2hlcmVudChkbWFfZGV2LCBzaXplLAogCQkJCQkJICAgICAmcmluZy0+ZG1hX2Jhc2UsCiAJCQkJCQkgICAgIEdGUF9LRVJORUwpOwpAQCAtNTM4LDE1ICs2NjQsNiBAQAogCQkJcmluZy0+aW5kZXhfYmFzZSA9IGxvd2VyXzMyX2JpdHMocmluZy0+ZG1hX2Jhc2UpOwogCQllbHNlCiAJCQlyaW5nLT5pbmRleF9iYXNlID0gMDsKLQotCQkvKiBBbGxvYyBSWCBzbG90cyAqLwotCQlmb3IgKGogPSAwOyBqIDwgcmluZy0+bnVtX3Nsb3RzOyBqKyspIHsKLQkJCWVyciA9IGJnbWFjX2RtYV9yeF9za2JfZm9yX3Nsb3QoYmdtYWMsICZyaW5nLT5zbG90c1tqXSk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJYmdtYWNfZXJyKGJnbWFjLCAiQ2FuJ3QgYWxsb2NhdGUgc2tiIGZvciBzbG90IGluIFJYIHJpbmdcbiIpOwotCQkJCWdvdG8gZXJyX2RtYV9mcmVlOwotCQkJfQotCQl9CiAJfQogCiAJcmV0dXJuIDA7CkBAIC01NTYsMTAgKzY3MywxMCBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi1zdGF0aWMgdm9pZCBiZ21hY19kbWFfaW5pdChzdHJ1Y3QgYmdtYWMgKmJnbWFjKQorc3RhdGljIGludCBiZ21hY19kbWFfaW5pdChzdHJ1Y3QgYmdtYWMgKmJnbWFjKQogewogCXN0cnVjdCBiZ21hY19kbWFfcmluZyAqcmluZzsKLQlpbnQgaTsKKwlpbnQgaSwgZXJyOwogCiAJZm9yIChpID0gMDsgaSA8IEJHTUFDX01BWF9UWF9SSU5HUzsgaSsrKSB7CiAJCXJpbmcgPSAmYmdtYWMtPnR4X3JpbmdbaV07CkBAIC01OTEsMTYgKzcwOCwyNCBAQAogCQlpZiAocmluZy0+dW5hbGlnbmVkKQogCQkJYmdtYWNfZG1hX3J4X2VuYWJsZShiZ21hYywgcmluZyk7CiAKLQkJZm9yIChqID0gMDsgaiA8IHJpbmctPm51bV9zbG90czsgaisrKQotCQkJYmdtYWNfZG1hX3J4X3NldHVwX2Rlc2MoYmdtYWMsIHJpbmcsIGopOwotCi0JCWJnbWFjX3dyaXRlKGJnbWFjLCByaW5nLT5tbWlvX2Jhc2UgKyBCR01BQ19ETUFfUlhfSU5ERVgsCi0JCQkgICAgcmluZy0+aW5kZXhfYmFzZSArCi0JCQkgICAgcmluZy0+bnVtX3Nsb3RzICogc2l6ZW9mKHN0cnVjdCBiZ21hY19kbWFfZGVzYykpOwotCiAJCXJpbmctPnN0YXJ0ID0gMDsKIAkJcmluZy0+ZW5kID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IEJHTUFDX1JYX1JJTkdfU0xPVFM7IGorKykgeworCQkJZXJyID0gYmdtYWNfZG1hX3J4X3NrYl9mb3Jfc2xvdChiZ21hYywgJnJpbmctPnNsb3RzW2pdKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJvcjsKKworCQkJYmdtYWNfZG1hX3J4X3NldHVwX2Rlc2MoYmdtYWMsIHJpbmcsIGopOworCQl9CisKKwkJYmdtYWNfZG1hX3J4X3VwZGF0ZV9pbmRleChiZ21hYywgcmluZyk7CiAJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yOgorCWJnbWFjX2RtYV9jbGVhbnVwKGJnbWFjKTsKKwlyZXR1cm4gZXJyOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwMDgsOCArMTEzMyw2IEBACiAJYmdtYWNfcGh5X2luaXQoYmdtYWMpOwogCiAJbmV0ZGV2X3Jlc2V0X3F1ZXVlKGJnbWFjLT5uZXRfZGV2KTsKLQotCWJnbWFjLT5pbnRfc3RhdHVzID0gMDsKIH0KIAogc3RhdGljIHZvaWQgYmdtYWNfY2hpcF9pbnRyc19vbihzdHJ1Y3QgYmdtYWMgKmJnbWFjKQpAQCAtMTA3OCwxMSArMTIwMSw4IEBACiB9CiAKIC8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC9tYWMtZ2JpdC9nbWFjL2NoaXBpbml0ICovCi1zdGF0aWMgdm9pZCBiZ21hY19jaGlwX2luaXQoc3RydWN0IGJnbWFjICpiZ21hYywgYm9vbCBmdWxsX2luaXQpCitzdGF0aWMgdm9pZCBiZ21hY19jaGlwX2luaXQoc3RydWN0IGJnbWFjICpiZ21hYykKIHsKLQlzdHJ1Y3QgYmdtYWNfZG1hX3JpbmcgKnJpbmc7Ci0JaW50IGk7Ci0KIAkvKiAxIGludGVycnVwdCBwZXIgcmVjZWl2ZWQgZnJhbWUgKi8KIAliZ21hY193cml0ZShiZ21hYywgQkdNQUNfSU5UX1JFQ1ZfTEFaWSwgMSA8PCBCR01BQ19JUkxfRkNfU0hJRlQpOwogCkBAIC0xMTAwLDE2ICsxMjIwLDcgQEAKIAogCWJnbWFjX3dyaXRlKGJnbWFjLCBCR01BQ19SWE1BWF9MRU5HVEgsIDMyICsgRVRIRVJfTUFYX0xFTik7CiAKLQlpZiAoZnVsbF9pbml0KSB7Ci0JCWJnbWFjX2RtYV9pbml0KGJnbWFjKTsKLQkJaWYgKDEpIC8qIEZJWE1FOiBpcyB0aGVyZSBhbnkgY2FzZSB3ZSBkb24ndCB3YW50IElSUXM/ICovCi0JCQliZ21hY19jaGlwX2ludHJzX29uKGJnbWFjKTsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgQkdNQUNfTUFYX1JYX1JJTkdTOyBpKyspIHsKLQkJCXJpbmcgPSAmYmdtYWMtPnJ4X3JpbmdbaV07Ci0JCQliZ21hY19kbWFfcnhfZW5hYmxlKGJnbWFjLCByaW5nKTsKLQkJfQotCX0KKwliZ21hY19jaGlwX2ludHJzX29uKGJnbWFjKTsKIAogCWJnbWFjX2VuYWJsZShiZ21hYyk7CiB9CkBAIC0xMTI0LDE0ICsxMjM1LDEzIEBACiAJaWYgKCFpbnRfc3RhdHVzKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKLQkvKiBBY2sgKi8KLQliZ21hY193cml0ZShiZ21hYywgQkdNQUNfSU5UX1NUQVRVUywgaW50X3N0YXR1cyk7CisJaW50X3N0YXR1cyAmPSB+KEJHTUFDX0lTX1RYMCB8IEJHTUFDX0lTX1JYKTsKKwlpZiAoaW50X3N0YXR1cykKKwkJYmdtYWNfZXJyKGJnbWFjLCAiVW5rbm93biBJUlFzOiAweCUwOFhcbiIsIGludF9zdGF0dXMpOwogCiAJLyogRGlzYWJsZSBuZXcgaW50ZXJydXB0cyB1bnRpbCBoYW5kbGluZyBleGlzdGluZyBvbmVzICovCiAJYmdtYWNfY2hpcF9pbnRyc19vZmYoYmdtYWMpOwogCi0JYmdtYWMtPmludF9zdGF0dXMgPSBpbnRfc3RhdHVzOwotCiAJbmFwaV9zY2hlZHVsZSgmYmdtYWMtPm5hcGkpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtMTE0MCwyNSArMTI1MCwxNyBAQAogc3RhdGljIGludCBiZ21hY19wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IHdlaWdodCkKIHsKIAlzdHJ1Y3QgYmdtYWMgKmJnbWFjID0gY29udGFpbmVyX29mKG5hcGksIHN0cnVjdCBiZ21hYywgbmFwaSk7Ci0Jc3RydWN0IGJnbWFjX2RtYV9yaW5nICpyaW5nOwogCWludCBoYW5kbGVkID0gMDsKIAotCWlmIChiZ21hYy0+aW50X3N0YXR1cyAmIEJHTUFDX0lTX1RYMCkgewotCQlyaW5nID0gJmJnbWFjLT50eF9yaW5nWzBdOwotCQliZ21hY19kbWFfdHhfZnJlZShiZ21hYywgcmluZyk7Ci0JCWJnbWFjLT5pbnRfc3RhdHVzICY9IH5CR01BQ19JU19UWDA7Ci0JfQorCS8qIEFjayAqLworCWJnbWFjX3dyaXRlKGJnbWFjLCBCR01BQ19JTlRfU1RBVFVTLCB+MCk7CiAKLQlpZiAoYmdtYWMtPmludF9zdGF0dXMgJiBCR01BQ19JU19SWCkgewotCQlyaW5nID0gJmJnbWFjLT5yeF9yaW5nWzBdOwotCQloYW5kbGVkICs9IGJnbWFjX2RtYV9yeF9yZWFkKGJnbWFjLCByaW5nLCB3ZWlnaHQpOwotCQliZ21hYy0+aW50X3N0YXR1cyAmPSB+QkdNQUNfSVNfUlg7Ci0JfQorCWJnbWFjX2RtYV90eF9mcmVlKGJnbWFjLCAmYmdtYWMtPnR4X3JpbmdbMF0pOworCWhhbmRsZWQgKz0gYmdtYWNfZG1hX3J4X3JlYWQoYmdtYWMsICZiZ21hYy0+cnhfcmluZ1swXSwgd2VpZ2h0KTsKIAotCWlmIChiZ21hYy0+aW50X3N0YXR1cykgewotCQliZ21hY19lcnIoYmdtYWMsICJVbmtub3duIElSUXM6IDB4JTA4WFxuIiwgYmdtYWMtPmludF9zdGF0dXMpOwotCQliZ21hYy0+aW50X3N0YXR1cyA9IDA7Ci0JfQorCS8qIFBvbGwgYWdhaW4gaWYgbW9yZSBldmVudHMgYXJyaXZlZCBpbiB0aGUgbWVhbnRpbWUgKi8KKwlpZiAoYmdtYWNfcmVhZChiZ21hYywgQkdNQUNfSU5UX1NUQVRVUykgJiAoQkdNQUNfSVNfVFgwIHwgQkdNQUNfSVNfUlgpKQorCQlyZXR1cm4gaGFuZGxlZDsKIAogCWlmIChoYW5kbGVkIDwgd2VpZ2h0KSB7CiAJCW5hcGlfY29tcGxldGUobmFwaSk7CkBAIC0xMTc4LDIzICsxMjgwLDI3IEBACiAJaW50IGVyciA9IDA7CiAKIAliZ21hY19jaGlwX3Jlc2V0KGJnbWFjKTsKKworCWVyciA9IGJnbWFjX2RtYV9pbml0KGJnbWFjKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJLyogU3BlY3Mgc2F5IGFib3V0IHJlY2xhaW1pbmcgcmluZ3MgaGVyZSwgYnV0IHdlIGRvIHRoYXQgaW4gRE1BIGluaXQgKi8KLQliZ21hY19jaGlwX2luaXQoYmdtYWMsIHRydWUpOworCWJnbWFjX2NoaXBfaW5pdChiZ21hYyk7CiAKIAllcnIgPSByZXF1ZXN0X2lycShiZ21hYy0+Y29yZS0+aXJxLCBiZ21hY19pbnRlcnJ1cHQsIElSUUZfU0hBUkVELAogCQkJICBLQlVJTERfTU9ETkFNRSwgbmV0X2Rldik7CiAJaWYgKGVyciA8IDApIHsKIAkJYmdtYWNfZXJyKGJnbWFjLCAiSVJRIHJlcXVlc3QgZXJyb3I6ICVkIVxuIiwgZXJyKTsKLQkJZ290byBlcnJfb3V0OworCQliZ21hY19kbWFfY2xlYW51cChiZ21hYyk7CisJCXJldHVybiBlcnI7CiAJfQogCW5hcGlfZW5hYmxlKCZiZ21hYy0+bmFwaSk7CiAKIAlwaHlfc3RhcnQoYmdtYWMtPnBoeV9kZXYpOwogCiAJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKLQotZXJyX291dDoKLQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGJnbWFjX3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCkBAIC0xMjEwLDYgKzEzMTYsNyBAQAogCWZyZWVfaXJxKGJnbWFjLT5jb3JlLT5pcnEsIG5ldF9kZXYpOwogCiAJYmdtYWNfY2hpcF9yZXNldChiZ21hYyk7CisJYmdtYWNfZG1hX2NsZWFudXAoYmdtYWMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzMwLDEzICsxNDM3LDQ2IEBACiAJfQogfQogCitzdGF0aWMgaW50IGJnbWFjX2ZpeGVkX3BoeV9yZWdpc3RlcihzdHJ1Y3QgYmdtYWMgKmJnbWFjKQoreworCXN0cnVjdCBmaXhlZF9waHlfc3RhdHVzIGZwaHlfc3RhdHVzID0geworCQkubGluayA9IDEsCisJCS5zcGVlZCA9IFNQRUVEXzEwMDAsCisJCS5kdXBsZXggPSBEVVBMRVhfRlVMTCwKKwl9OworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlfZGV2OworCWludCBlcnI7CisKKwlwaHlfZGV2ID0gZml4ZWRfcGh5X3JlZ2lzdGVyKFBIWV9QT0xMLCAmZnBoeV9zdGF0dXMsIE5VTEwpOworCWlmICghcGh5X2RldiB8fCBJU19FUlIocGh5X2RldikpIHsKKwkJYmdtYWNfZXJyKGJnbWFjLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGZpeGVkIFBIWSBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwllcnIgPSBwaHlfY29ubmVjdF9kaXJlY3QoYmdtYWMtPm5ldF9kZXYsIHBoeV9kZXYsIGJnbWFjX2FkanVzdF9saW5rLAorCQkJCSBQSFlfSU5URVJGQUNFX01PREVfTUlJKTsKKwlpZiAoZXJyKSB7CisJCWJnbWFjX2VycihiZ21hYywgIkNvbm5lY3RpbmcgUEhZIGZhaWxlZFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJYmdtYWMtPnBoeV9kZXYgPSBwaHlfZGV2OworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBiZ21hY19taWlfcmVnaXN0ZXIoc3RydWN0IGJnbWFjICpiZ21hYykKIHsKKwlzdHJ1Y3QgYmNtYV9jaGlwaW5mbyAqY2kgPSAmYmdtYWMtPmNvcmUtPmJ1cy0+Y2hpcGluZm87CiAJc3RydWN0IG1paV9idXMgKm1paV9idXM7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeV9kZXY7CiAJY2hhciBidXNfaWRbTUlJX0JVU19JRF9TSVpFICsgM107CiAJaW50IGksIGVyciA9IDA7CiAKKwlpZiAoY2ktPmlkID09IEJDTUFfQ0hJUF9JRF9CQ000NzA3IHx8CisJICAgIGNpLT5pZCA9PSBCQ01BX0NISVBfSURfQkNNNTMwMTgpCisJCXJldHVybiBiZ21hY19maXhlZF9waHlfcmVnaXN0ZXIoYmdtYWMpOworCiAJbWlpX2J1cyA9IG1kaW9idXNfYWxsb2MoKTsKIAlpZiAoIW1paV9idXMpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTUxNyw2ICsxNjU3LDEwIEBACiAJCWdvdG8gZXJyX2RtYV9mcmVlOwogCX0KIAorCW5ldF9kZXYtPmZlYXR1cmVzID0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNOworCW5ldF9kZXYtPmh3X2ZlYXR1cmVzID0gbmV0X2Rldi0+ZmVhdHVyZXM7CisJbmV0X2Rldi0+dmxhbl9mZWF0dXJlcyA9IG5ldF9kZXYtPmZlYXR1cmVzOworCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGJnbWFjLT5uZXRfZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWJnbWFjX2VycihiZ21hYywgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iZ21hYy5oCmluZGV4IDg5ZmE1YmMuLmRiMjdmZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JnbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYmdtYWMuaApAQCAtMzQ1LDggKzM0NSw4IEBACiAKICNkZWZpbmUgQkdNQUNfREVTQ19DVEwwX0VPVAkJCTB4MTAwMDAwMDAJLyogRW5kIG9mIHJpbmcgKi8KICNkZWZpbmUgQkdNQUNfREVTQ19DVEwwX0lPQwkJCTB4MjAwMDAwMDAJLyogSVJRIG9uIGNvbXBsZXRlICovCi0jZGVmaW5lIEJHTUFDX0RFU0NfQ1RMMF9TT0YJCQkweDQwMDAwMDAwCS8qIFN0YXJ0IG9mIGZyYW1lICovCi0jZGVmaW5lIEJHTUFDX0RFU0NfQ1RMMF9FT0YJCQkweDgwMDAwMDAwCS8qIEVuZCBvZiBmcmFtZSAqLworI2RlZmluZSBCR01BQ19ERVNDX0NUTDBfRU9GCQkJMHg0MDAwMDAwMAkvKiBFbmQgb2YgZnJhbWUgKi8KKyNkZWZpbmUgQkdNQUNfREVTQ19DVEwwX1NPRgkJCTB4ODAwMDAwMDAJLyogU3RhcnQgb2YgZnJhbWUgKi8KICNkZWZpbmUgQkdNQUNfREVTQ19DVEwxX0xFTgkJCTB4MDAwMDFGRkYKIAogI2RlZmluZSBCR01BQ19QSFlfTk9SRUdTCQkJMHgxRQpAQCAtMzU2LDEyICszNTYsMTYgQEAKICNkZWZpbmUgQkdNQUNfTUFYX1JYX1JJTkdTCQkJMQogCiAjZGVmaW5lIEJHTUFDX1RYX1JJTkdfU0xPVFMJCQkxMjgKLSNkZWZpbmUgQkdNQUNfUlhfUklOR19TTE9UUwkJCTUxMiAtIDEJCS8qIFdoeSAtMT8gV2VsbCwgQnJvYWRjb20gZG9lcyB0aGF0Li4uICovCisjZGVmaW5lIEJHTUFDX1JYX1JJTkdfU0xPVFMJCQk1MTIKIAogI2RlZmluZSBCR01BQ19SWF9IRUFERVJfTEVOCQkJMjgJCS8qIExhc3QgMjQgYnl0ZXMgYXJlIHVudXNlZC4gV2VsbC4uLiAqLwogI2RlZmluZSBCR01BQ19SWF9GUkFNRV9PRkZTRVQJCQkzMAkJLyogVGhlcmUgYXJlIDIgdW51c2VkIGJ5dGVzIGJldHdlZW4gaGVhZGVyIGFuZCByZWFsIGRhdGEgKi8KKyNkZWZpbmUgQkdNQUNfUlhfQlVGX09GRlNFVAkJCShORVRfU0tCX1BBRCArIE5FVF9JUF9BTElHTiAtIFwKKwkJCQkJCSBCR01BQ19SWF9GUkFNRV9PRkZTRVQpCiAjZGVmaW5lIEJHTUFDX1JYX01BWF9GUkFNRV9TSVpFCQkJMTUzNgkJLyogQ29waWVkIGZyb20gYjQ0L3RnMyAqLwogI2RlZmluZSBCR01BQ19SWF9CVUZfU0laRQkJCShCR01BQ19SWF9GUkFNRV9PRkZTRVQgKyBCR01BQ19SWF9NQVhfRlJBTUVfU0laRSkKKyNkZWZpbmUgQkdNQUNfUlhfQUxMT0NfU0laRQkJCShTS0JfREFUQV9BTElHTihCR01BQ19SWF9CVUZfU0laRSArIEJHTUFDX1JYX0JVRl9PRkZTRVQpICsgXAorCQkJCQkJIFNLQl9EQVRBX0FMSUdOKHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSkpCiAKICNkZWZpbmUgQkdNQUNfQkZMX0VORVRST0JPCQkJMHgwMDEwCQkvKiBoYXMgZXBoeSByb2Jvc3dpdGNoIHNwaSAqLwogI2RlZmluZSBCR01BQ19CRkxfRU5FVEFETQkJCTB4MDA4MAkJLyogaGFzIEFETXRlayBzd2l0Y2ggKi8KQEAgLTM4Myw3ICszODcsMTAgQEAKICNkZWZpbmUgRVRIRVJfTUFYX0xFTiAgIDE1MTgKIAogc3RydWN0IGJnbWFjX3Nsb3RfaW5mbyB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bmlvbiB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisJCXZvaWQgKmJ1ZjsKKwl9OwogCWRtYV9hZGRyX3QgZG1hX2FkZHI7CiB9OwogCkBAIC00MDksMTQgKzQxNiwxMyBAQAogICogZW1wdHkuCiAgKi8KIHN0cnVjdCBiZ21hY19kbWFfcmluZyB7Ci0JdTE2IG51bV9zbG90czsKLQl1MTYgc3RhcnQ7Ci0JdTE2IGVuZDsKKwl1MzIgc3RhcnQ7CisJdTMyIGVuZDsKIAotCXUxNiBtbWlvX2Jhc2U7CiAJc3RydWN0IGJnbWFjX2RtYV9kZXNjICpjcHVfYmFzZTsKIAlkbWFfYWRkcl90IGRtYV9iYXNlOwogCXUzMiBpbmRleF9iYXNlOyAvKiBVc2VkIGZvciB1bmFsaWduZWQgcmluZ3Mgb25seSwgb3RoZXJ3aXNlIDAgKi8KKwl1MTYgbW1pb19iYXNlOwogCWJvb2wgdW5hbGlnbmVkOwogCiAJc3RydWN0IGJnbWFjX3Nsb3RfaW5mbyBzbG90c1tCR01BQ19SWF9SSU5HX1NMT1RTXTsKQEAgLTQ0Nyw3ICs0NTMsNiBAQAogCiAJLyogSW50ICovCiAJdTMyIGludF9tYXNrOwotCXUzMiBpbnRfc3RhdHVzOwogCiAJLyogQ3VycmVudCBNQUMgc3RhdGUgKi8KIAlpbnQgbWFjX3NwZWVkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5jCmluZGV4IDAyYmYwYjguLjJiNjZlZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyLmMKQEAgLTEsNyArMSw3IEBACi0vKiBibngyLmM6IFFMb2dpYyBOWDIgbmV0d29yayBkcml2ZXIuCisvKiBibngyLmM6IFFMb2dpYyBibngyIG5ldHdvcmsgZHJpdmVyLgogICoKICAqIENvcHlyaWdodCAoYykgMjAwNC0yMDE0IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTU4LDggKzU4LDggQEAKICNpbmNsdWRlICJibngyX2Z3LmgiCiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiYm54MiIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIyLjIuNSIKLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJEZWNlbWJlciAyMCwgMjAxMyIKKyNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIyLjIuNiIKKyNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKYW51YXJ5IDI5LCAyMDE0IgogI2RlZmluZSBGV19NSVBTX0ZJTEVfMDYJCSJibngyL2JueDItbWlwcy0wNi02LjIuMy5mdyIKICNkZWZpbmUgRldfUlYyUF9GSUxFXzA2CQkiYm54Mi9ibngyLXJ2MnAtMDYtNi4wLjE1LmZ3IgogI2RlZmluZSBGV19NSVBTX0ZJTEVfMDkJCSJibngyL2JueDItbWlwcy0wOS02LjIuMWIuZnciCkBAIC03MiwxMCArNzIsMTAgQEAKICNkZWZpbmUgVFhfVElNRU9VVCAgKDUqSFopCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSA9Ci0JIlFMb2dpYyBOZXRYdHJlbWUgSUkgR2lnYWJpdCBFdGhlcm5ldCBEcml2ZXIgIiBEUlZfTU9EVUxFX05BTUUgIiB2IiBEUlZfTU9EVUxFX1ZFUlNJT04gIiAoIiBEUlZfTU9EVUxFX1JFTERBVEUgIilcbiI7CisJIlFMb2dpYyAiIERSVl9NT0RVTEVfTkFNRSAiIEdpZ2FiaXQgRXRoZXJuZXQgRHJpdmVyIHYiIERSVl9NT0RVTEVfVkVSU0lPTiAiICgiIERSVl9NT0RVTEVfUkVMREFURSAiKVxuIjsKIAogTU9EVUxFX0FVVEhPUigiTWljaGFlbCBDaGFuIDxtY2hhbkBicm9hZGNvbS5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlFMb2dpYyBOZXRYdHJlbWUgSUkgQkNNNTcwNi81NzA4LzU3MDkvNTcxNiBEcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUUxvZ2ljIEJDTTU3MDYvNTcwOC81NzA5LzU3MTYgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfVkVSU0lPTihEUlZfTU9EVUxFX1ZFUlNJT04pOwogTU9EVUxFX0ZJUk1XQVJFKEZXX01JUFNfRklMRV8wNik7CkBAIC00OTg0LDggKzQ5ODQsNiBAQAogCiAJYnAtPmlkbGVfY2hrX3N0YXR1c19pZHggPSAweGZmZmY7CiAKLQlicC0+cnhfbW9kZSA9IEJOWDJfRU1BQ19SWF9NT0RFX1NPUlRfTU9ERTsKLQogCS8qIFNldCB1cCBob3cgdG8gZ2VuZXJhdGUgYSBsaW5rIGNoYW5nZSBpbnRlcnJ1cHQuICovCiAJQk5YMl9XUihicCwgQk5YMl9FTUFDX0FUVEVOVElPTl9FTkEsIEJOWDJfRU1BQ19BVFRFTlRJT05fRU5BX0xJTkspOwogCkBAIC03NzEwLDE3ICs3NzA4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIG5ldGRldl9mZWF0dXJlc190Ci1ibngyX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKLXsKLQlzdHJ1Y3QgYm54MiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKCEoYnAtPmZsYWdzICYgQk5YMl9GTEFHX0NBTl9LRUVQX1ZMQU4pKQotCQlmZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWDsKLQotCXJldHVybiBmZWF0dXJlczsKLX0KLQogc3RhdGljIGludAogYm54Ml9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CkBAIC04NTI3LDcgKzg1MTQsNiBAQAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gYm54Ml9jaGFuZ2VfbWFjX2FkZHIsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IGJueDJfY2hhbmdlX210dSwKLQkubmRvX2ZpeF9mZWF0dXJlcwk9IGJueDJfZml4X2ZlYXR1cmVzLAogCS5uZG9fc2V0X2ZlYXR1cmVzCT0gYm54Ml9zZXRfZmVhdHVyZXMsCiAJLm5kb190eF90aW1lb3V0CQk9IGJueDJfdHhfdGltZW91dCwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgpAQCAtODU3OCw2ICs4NTY0LDkgQEAKIAlkZXYtPmZlYXR1cmVzIHw9IGRldi0+aHdfZmVhdHVyZXM7CiAJZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9VTklDQVNUX0ZMVDsKIAorCWlmICghKGJwLT5mbGFncyAmIEJOWDJfRkxBR19DQU5fS0VFUF9WTEFOKSkKKwkJZGV2LT5od19mZWF0dXJlcyAmPSB+TkVUSUZfRl9IV19WTEFOX0NUQUdfUlg7CisKIAlpZiAoKHJjID0gcmVnaXN0ZXJfbmV0ZGV2KGRldikpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCByZWdpc3RlciBuZXQgZGV2aWNlXG4iKTsKIAkJZ290byBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuaAppbmRleCAyOGRmMzVkLi5mOTJmNzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5oCkBAIC0xLDcgKzEsNyBAQAotLyogYm54Mi5oOiBRTG9naWMgTlgyIG5ldHdvcmsgZHJpdmVyLgorLyogYm54Mi5oOiBRTG9naWMgYm54MiBuZXR3b3JrIGRyaXZlci4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDE0IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyX2Z3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyX2Z3LmgKaW5kZXggN2RiNzljMi4uYjBmMmNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Ml9mdy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJfZncuaApAQCAtMSw3ICsxLDcgQEAKLS8qIGJueDJfZncuaDogUUxvZ2ljIE5YMiBuZXR3b3JrIGRyaXZlci4KKy8qIGJueDJfZncuaDogUUxvZ2ljIGJueDIgbmV0d29yayBkcml2ZXIuCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEJyb2FkY29tIENvcnBvcmF0aW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQgUUxvZ2ljIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeC5oCmluZGV4IDc1NjA1M2MuLjQwODVjNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnguaApAQCAtMTgxMSw3ICsxODExLDcgQEAKIAlpbnQJCQlzdGF0c19zdGF0ZTsKIAogCS8qIHVzZWQgZm9yIHN5bmNocm9uaXphdGlvbiBvZiBjb25jdXJyZW50IHRocmVhZHMgc3RhdGlzdGljcyBoYW5kbGluZyAqLwotCXNwaW5sb2NrX3QJCXN0YXRzX2xvY2s7CisJc3RydWN0IG11dGV4CQlzdGF0c19sb2NrOwogCiAJLyogdXNlZCBieSBkbWFlIGNvbW1hbmQgbG9hZGVyICovCiAJc3RydWN0IGRtYWVfY29tbWFuZAlzdGF0c19kbWFlOwpAQCAtMTkzNSw4ICsxOTM1LDYgQEAKIAogCWludCBmcF9hcnJheV9zaXplOwogCXUzMiBkdW1wX3ByZXNldF9pZHg7Ci0JYm9vbAkJCQkJc3RhdHNfc3RhcnRlZDsKLQlzdHJ1Y3Qgc2VtYXBob3JlCQkJc3RhdHNfc2VtYTsKIAogCXU4CQkJCQlwaHlzX3BvcnRfaWRbRVRIX0FMRU5dOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9ldGh0b29sLmMKaW5kZXggZmZlNGUwMC4uZTNkODUzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2V0aHRvb2wuYwpAQCAtMjQ0Niw3ICsyNDQ2LDcgQEAKIAl9CiAJcGFja2V0ID0gc2tiX3B1dChza2IsIHBrdF9zaXplKTsKIAltZW1jcHkocGFja2V0LCBicC0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbXNldChwYWNrZXQgKyBFVEhfQUxFTiwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIocGFja2V0ICsgRVRIX0FMRU4pOwogCW1lbXNldChwYWNrZXQgKyAyKkVUSF9BTEVOLCAweDc3LCAoRVRIX0hMRU4gLSAyKkVUSF9BTEVOKSk7CiAJZm9yIChpID0gRVRIX0hMRU47IGkgPCBwa3Rfc2l6ZTsgaSsrKQogCQlwYWNrZXRbaV0gPSAodW5zaWduZWQgY2hhcikgKGkgJiAweGZmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2hzaS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfaHNpLmgKaW5kZXggNTgzNTkxZC4uMDU4YmM3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfaHNpLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfaHNpLmgKQEAgLTUyMSw2ICs1MjEsMTcgQEAKIAkgKi8KIAkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1RYX0RSVl9CUk9BRENBU1RfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAKIAkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1RYX0RSVl9CUk9BRENBU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgIDE2CisJLyogIFNldCBub24tZGVmYXVsdCB2YWx1ZXMgZm9yIFRYRklSIGluIFNGUCBtb2RlLiAqLworCSNkZWZpbmUgUE9SVF9IV19DRkdfVFhfRFJWX0lGSVJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMEYwMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfVFhfRFJWX0lGSVJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMjAKKworCS8qICBTZXQgbm9uLWRlZmF1bHQgdmFsdWVzIGZvciBJUFJFRFJJVkVSIGluIFNGUCBtb2RlLiAqLworCSNkZWZpbmUgUE9SVF9IV19DRkdfVFhfRFJWX0lQUkVEUklWRVJfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwRjAwMDAwMAorCSNkZWZpbmUgUE9SVF9IV19DRkdfVFhfRFJWX0lQUkVEUklWRVJfU0hJRlQgICAgICAgICAgICAgICAgICAgMjQKKworCS8qICBTZXQgbm9uLWRlZmF1bHQgdmFsdWVzIGZvciBQT1NUMiBpbiBTRlAgbW9kZS4gKi8KKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1RYX0RSVl9QT1NUMl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjAwMDAwMDAKKwkjZGVmaW5lIFBPUlRfSFdfQ0ZHX1RYX0RSVl9QT1NUMl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDI4CiAKIAl1MzIgcmVzZXJ2ZWQwWzVdOwkJCQkgICAgLyogMHgxN2MgKi8KIApAQCAtMjI0Nyw4ICsyMjU4LDggQEAKIAkjZGVmaW5lIExJTktfU0ZQX0VFUFJPTV9DT01QX0NPREVfTFJNCTB4MDAwMDQwMDAKIAogCXUzMiByZXNlcnZlZDVbMl07Ci0JdTMyIHJlc2VydmVkNltQT1JUX01BWF07Ci0KKwl1MzIgbGlua19jaGFuZ2VfY291bnRbUE9SVF9NQVhdOyAgICAgICAgLyogT2Zmc2V0IDB4MTYwLTB4MTY0ICovCisJI2RlZmluZSBMSU5LX0NIQU5HRV9DT1VOVF9NQVNLIDB4ZmYgICAgIC8qIE9mZnNldCAweDE2OCAqLwogCS8qIGRyaXZlciB2ZXJzaW9uIGZvciBlYWNoIHBlcnNvbmFsaXR5ICovCiAJc3RydWN0IG9zX2Rydl92ZXIgZnVuY19vc19kcnZfdmVyW0UyX0ZVTkNfTUFYXTsgLyogT2Zmc2V0IDB4MTZjICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2luaXQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2luaXQuaAppbmRleCBiZDkwZTUwLi5kNmUxOTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9pbml0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfaW5pdC5oCkBAIC0yNzgsNyArMjc4LDcgQEAKIH0KIAogCi0vKiBjb25nZXN0aW9uIG1hbmFnbWVudCBwb3J0IGluaXQgYXBpIGRlc2NyaXB0aW9uCisvKiBjb25nZXN0aW9uIG1hbmFnZW1lbnQgcG9ydCBpbml0IGFwaSBkZXNjcmlwdGlvbgogICogdGhlIGFwaSB3b3JrcyBhcyBmb2xsb3dzOgogICogdGhlIGRyaXZlciBzaG91bGQgcGFzcyB0aGUgY21uZ19pbml0X2lucHV0IHN0cnVjdCwgdGhlIHBvcnRfaW5pdCBmdW5jdGlvbgogICogd2lsbCBwcmVwYXJlIHRoZSByZXF1aXJlZCBpbnRlcm5hbCByYW0gc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgcGFzc2VkIGJhY2sKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2xpbmsuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2xpbmsuYwppbmRleCA3NzhlNGNkLi4yMWEwZDZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9saW5rLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbGluay5jCkBAIC0xOTUsNiArMTk1LDEwIEBACiAKICNkZWZpbmUgTUFYX1BBQ0tFVF9TSVpFCQkJCQkoOTcwMCkKICNkZWZpbmUgTUFYX0tSX0xJTktfUkVUUlkJCQkJNAorI2RlZmluZSBERUZBVUxUX1RYX0RSVl9CUkRDVAkJMgorI2RlZmluZSBERUZBVUxUX1RYX0RSVl9JRklSCQkwCisjZGVmaW5lIERFRkFVTFRfVFhfRFJWX1BPU1QyCQkzCisjZGVmaW5lIERFRkFVTFRfVFhfRFJWX0lQUkVfRFJJVkVSCTYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU2Myw3ICs1NjcsNyBAQAogKglXaWxsIHJldHVybiB0aGUgTklHIEVUUyByZWdpc3RlcnMgdG8gaW5pdCB2YWx1ZXMuRXhjZXB0CiAqCWNyZWRpdF91cHBlcl9ib3VuZC4KICoJVGhhdCBpc24ndCB1c2VkIGluIHRoaXMgY29uZmlndXJhdGlvbiAoTm8gV0ZRIGlzIGVuYWJsZWQpIGFuZCB3aWxsIGJlCi0qCWNvbmZpZ3VyZWQgYWNvcmRpbmcgdG8gc3BlYworKgljb25maWd1cmVkIGFjY29yZGluZyB0byBzcGVjCiAqLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIHZvaWQgYm54MnhfZXRzX2UzYjBfbmlnX2Rpc2FibGVkKGNvbnN0IHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLApAQCAtNjgwLDcgKzY4NCw3IEBACiAqCVdpbGwgcmV0dXJuIHRoZSBQQkYgRVRTIHJlZ2lzdGVycyB0byBpbml0IHZhbHVlcy5FeGNlcHQKICoJY3JlZGl0X3VwcGVyX2JvdW5kLgogKglUaGF0IGlzbid0IHVzZWQgaW4gdGhpcyBjb25maWd1cmF0aW9uIChObyBXRlEgaXMgZW5hYmxlZCkgYW5kIHdpbGwgYmUKLSoJY29uZmlndXJlZCBhY29yZGluZyB0byBzcGVjCisqCWNvbmZpZ3VyZWQgYWNjb3JkaW5nIHRvIHNwZWMKICouCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBibngyeF9ldHNfZTNiMF9wYmZfZGlzYWJsZWQoY29uc3Qgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMpCkBAIC03MzgsNyArNzQyLDcgQEAKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGVzY3JpcHRpb246Ci0qCUUzQjAgZGlzYWJsZSB3aWxsIHJldHVybiBiYXNpY2x5IHRoZSB2YWx1ZXMgdG8gaW5pdCB2YWx1ZXMuCisqCUUzQjAgZGlzYWJsZSB3aWxsIHJldHVybiBiYXNpY2FsbHkgdGhlIHZhbHVlcyB0byBpbml0IHZhbHVlcy4KICouCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgaW50IGJueDJ4X2V0c19lM2IwX2Rpc2FibGVkKGNvbnN0IHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLApAQCAtNzYxLDcgKzc2NSw3IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRGVzY3JpcHRpb246Ci0qCURpc2FibGUgd2lsbCByZXR1cm4gYmFzaWNseSB0aGUgdmFsdWVzIHRvIGluaXQgdmFsdWVzLgorKglEaXNhYmxlIHdpbGwgcmV0dXJuIGJhc2ljYWxseSB0aGUgdmFsdWVzIHRvIGluaXQgdmFsdWVzLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogaW50IGJueDJ4X2V0c19kaXNhYmxlZChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKQEAgLTI5MzgsNyArMjk0Miw3IEBACiB7CiAJdmFycy0+ZWVlX3N0YXR1cyB8PSAoKHUzMikgbW9kZSkgPDwgU0hNRU1fRUVFX1NVUFBPUlRFRF9TSElGVDsKIAotCS8qIFByb3BvZ2F0ZSBwYXJhbXMnIGJpdHMgLS0+IHZhcnMgKGZvciBtaWdyYXRpb24gZXhwb3N1cmUpICovCisJLyogUHJvcGFnYXRlIHBhcmFtcycgYml0cyAtLT4gdmFycyAoZm9yIG1pZ3JhdGlvbiBleHBvc3VyZSkgKi8KIAlpZiAocGFyYW1zLT5lZWVfbW9kZSAmIEVFRV9NT0RFX0VOQUJMRV9MUEkpCiAJCXZhcnMtPmVlZV9zdGF0dXMgfD0gU0hNRU1fRUVFX0xQSV9SRVFVRVNURURfQklUOwogCWVsc2UKQEAgLTM1OTUsMTAgKzM1OTksMTEgQEAKICAqIGluaXQgY29uZmlndXJhdGlvbiwgYW5kIHNldC9jbGVhciBTR01JSSBmbGFnLiBJbnRlcm5hbAogICogcGh5IGluaXQgaXMgZG9uZSBwdXJlbHkgaW4gcGh5X2luaXQgc3RhZ2UuCiAgKi8KLSNkZWZpbmUgV0NfVFhfRFJJVkVSKHBvc3QyLCBpZHJpdmVyLCBpcHJlKSBcCisjZGVmaW5lIFdDX1RYX0RSSVZFUihwb3N0MiwgaWRyaXZlciwgaXByZSwgaWZpcikgXAogCSgocG9zdDIgPDwgTURJT19XQ19SRUdfVFgwX1RYX0RSSVZFUl9QT1NUMl9DT0VGRl9PRkZTRVQpIHwgXAogCSAoaWRyaXZlciA8PCBNRElPX1dDX1JFR19UWDBfVFhfRFJJVkVSX0lEUklWRVJfT0ZGU0VUKSB8IFwKLQkgKGlwcmUgPDwgTURJT19XQ19SRUdfVFgwX1RYX0RSSVZFUl9JUFJFX0RSSVZFUl9PRkZTRVQpKQorCSAoaXByZSA8PCBNRElPX1dDX1JFR19UWDBfVFhfRFJJVkVSX0lQUkVfRFJJVkVSX09GRlNFVCkgfCBcCisJIChpZmlyIDw8IE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVJfSUZJUl9PRkZTRVQpKQogCiAjZGVmaW5lIFdDX1RYX0ZJUihwb3N0LCBtYWluLCBwcmUpIFwKIAkoKHBvc3QgPDwgTURJT19XQ19SRUdfVFhfRklSX1RBUF9QT1NUX1RBUF9PRkZTRVQpIHwgXApAQCAtMzc2NSwxMiArMzc3MCwxMiBAQAogCWxhbmUgPSBibngyeF9nZXRfd2FycGNvcmVfbGFuZShwaHksIHBhcmFtcyk7CiAJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAogCQkJIE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVIgKyAweDEwKmxhbmUsCi0JCQkgV0NfVFhfRFJJVkVSKDB4MDIsIDB4MDYsIDB4MDkpKTsKKwkJCSBXQ19UWF9EUklWRVIoMHgwMiwgMHgwNiwgMHgwOSwgMCkpOwogCS8qIENvbmZpZ3VyZSB0aGUgbmV4dCBsYW5lIGlmIGR1YWwgbW9kZSAqLwogCWlmIChwaHktPmZsYWdzICYgRkxBR1NfV0NfRFVBTF9NT0RFKQogCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCiAJCQkJIE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVIgKyAweDEwKihsYW5lKzEpLAotCQkJCSBXQ19UWF9EUklWRVIoMHgwMiwgMHgwNiwgMHgwOSkpOworCQkJCSBXQ19UWF9EUklWRVIoMHgwMiwgMHgwNiwgMHgwOSwgMCkpOwogCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKIAkJCSBNRElPX1dDX1JFR19DTDcyX1VTRVJCMF9DTDcyX09TX0RFRl9DVFJMLAogCQkJIDB4MDNmMCk7CkBAIC0zOTMzLDYgKzM5MzgsNyBAQAogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXUxNiBtaXNjMV92YWwsIHRhcF92YWwsIHR4X2RyaXZlcl92YWwsIGxhbmUsIHZhbDsKIAl1MzIgY2ZnX3RhcF92YWwsIHR4X2Rydl9icmRjdCwgdHhfZXF1YWw7CisJdTMyIGlmaXJfdmFsLCBpcG9zdDJfdmFsLCBpcHJlX2RyaXZlcl92YWw7CiAKIAkvKiBIb2xkIHJ4U2VxU3RhcnQgKi8KIAlibngyeF9jbDQ1X3JlYWRfb3Jfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKQEAgLTM5NzgsNyArMzk4NCw3IEBACiAJaWYgKGlzX3hmaSkgewogCQltaXNjMV92YWwgfD0gMHg1OwogCQl0YXBfdmFsID0gV0NfVFhfRklSKDB4MDgsIDB4MzcsIDB4MDApOwotCQl0eF9kcml2ZXJfdmFsID0gV0NfVFhfRFJJVkVSKDB4MDAsIDB4MDIsIDB4MDMpOworCQl0eF9kcml2ZXJfdmFsID0gV0NfVFhfRFJJVkVSKDB4MDAsIDB4MDIsIDB4MDMsIDApOwogCX0gZWxzZSB7CiAJCWNmZ190YXBfdmFsID0gUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKwogCQkJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwgZGV2X2luZm8uCkBAIC0zOTg3LDEwICszOTkzLDYgQEAKIAogCQl0eF9lcXVhbCA9IGNmZ190YXBfdmFsICYgUE9SVF9IV19DRkdfVFhfRVFVQUxJWkFUSU9OX01BU0s7CiAKLQkJdHhfZHJ2X2JyZGN0ID0gKGNmZ190YXBfdmFsICYKLQkJCQlQT1JUX0hXX0NGR19UWF9EUlZfQlJPQURDQVNUX01BU0spID4+Ci0JCQkgICAgICAgUE9SVF9IV19DRkdfVFhfRFJWX0JST0FEQ0FTVF9TSElGVDsKLQogCQltaXNjMV92YWwgfD0gMHg5OwogCiAJCS8qIFRBUCB2YWx1ZXMgYXJlIGNvbnRyb2xsZWQgYnkgbnZyYW0sIGlmIHZhbHVlIHRoZXJlIGlzbid0IDAgKi8KQEAgLTM5OTksMTEgKzQwMDEsMzYgQEAKIAkJZWxzZQogCQkJdGFwX3ZhbCA9IFdDX1RYX0ZJUigweDBmLCAweDJiLCAweDAyKTsKIAotCQlpZiAodHhfZHJ2X2JyZGN0KQotCQkJdHhfZHJpdmVyX3ZhbCA9IFdDX1RYX0RSSVZFUigweDAzLCAodTE2KXR4X2Rydl9icmRjdCwKLQkJCQkJCSAgICAgMHgwNik7Ci0JCWVsc2UKLQkJCXR4X2RyaXZlcl92YWwgPSBXQ19UWF9EUklWRVIoMHgwMywgMHgwMiwgMHgwNik7CisJCWlmaXJfdmFsID0gREVGQVVMVF9UWF9EUlZfSUZJUjsKKwkJaXBvc3QyX3ZhbCA9IERFRkFVTFRfVFhfRFJWX1BPU1QyOworCQlpcHJlX2RyaXZlcl92YWwgPSBERUZBVUxUX1RYX0RSVl9JUFJFX0RSSVZFUjsKKwkJdHhfZHJ2X2JyZGN0ID0gREVGQVVMVF9UWF9EUlZfQlJEQ1Q7CisKKwkJLyogSWYgYW55IG9mIHRoZSBJRklSL0lQUkVfRFJJVkVSL1BPU1RAIGlzIHNldCwgYXBwbHkgYWxsCisJCSAqIGNvbmZpZ3VyYXRpb24uCisJCSAqLworCQlpZiAoY2ZnX3RhcF92YWwgJiAoUE9SVF9IV19DRkdfVFhfRFJWX0lGSVJfTUFTSyB8CisJCQkJICAgUE9SVF9IV19DRkdfVFhfRFJWX0lQUkVEUklWRVJfTUFTSyB8CisJCQkJICAgUE9SVF9IV19DRkdfVFhfRFJWX1BPU1QyX01BU0spKSB7CisJCQlpZmlyX3ZhbCA9IChjZmdfdGFwX3ZhbCAmCisJCQkJICAgIFBPUlRfSFdfQ0ZHX1RYX0RSVl9JRklSX01BU0spID4+CisJCQkJUE9SVF9IV19DRkdfVFhfRFJWX0lGSVJfU0hJRlQ7CisJCQlpcHJlX2RyaXZlcl92YWwgPSAoY2ZnX3RhcF92YWwgJgorCQkJCQkgICBQT1JUX0hXX0NGR19UWF9EUlZfSVBSRURSSVZFUl9NQVNLKQorCQkJPj4gUE9SVF9IV19DRkdfVFhfRFJWX0lQUkVEUklWRVJfU0hJRlQ7CisJCQlpcG9zdDJfdmFsID0gKGNmZ190YXBfdmFsICYKKwkJCQkgICAgICBQT1JUX0hXX0NGR19UWF9EUlZfUE9TVDJfTUFTSykgPj4KKwkJCQlQT1JUX0hXX0NGR19UWF9EUlZfUE9TVDJfU0hJRlQ7CisJCX0KKworCQlpZiAoY2ZnX3RhcF92YWwgJiBQT1JUX0hXX0NGR19UWF9EUlZfQlJPQURDQVNUX01BU0spIHsKKwkJCXR4X2Rydl9icmRjdCA9IChjZmdfdGFwX3ZhbCAmCisJCQkJCVBPUlRfSFdfQ0ZHX1RYX0RSVl9CUk9BRENBU1RfTUFTSykgPj4KKwkJCQlQT1JUX0hXX0NGR19UWF9EUlZfQlJPQURDQVNUX1NISUZUOworCQl9CisKKwkJdHhfZHJpdmVyX3ZhbCA9IFdDX1RYX0RSSVZFUihpcG9zdDJfdmFsLCB0eF9kcnZfYnJkY3QsCisJCQkJCSAgICAgaXByZV9kcml2ZXJfdmFsLCBpZmlyX3ZhbCk7CiAJfQogCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKIAkJCSBNRElPX1dDX1JFR19TRVJERVNESUdJVEFMX01JU0MxLCBtaXNjMV92YWwpOwpAQCAtNDE0NCw3ICs0MTcxLDcgQEAKIAkJCSAgTURJT19XQ19SRUdfVFhfRklSX1RBUF9FTkFCTEUpKTsKIAlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCiAJCQkgTURJT19XQ19SRUdfVFgwX1RYX0RSSVZFUiArIDB4MTAqbGFuZSwKLQkJCSBXQ19UWF9EUklWRVIoMHgwMiwgMHgwMiwgMHgwMikpOworCQkJIFdDX1RYX0RSSVZFUigweDAyLCAweDAyLCAweDAyLCAwKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X3dhcnBjb3JlX3NldF9zZ21paV9zcGVlZChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCkBAIC02NzMxLDYgKzY3NTgsMjUgQEAKIAltc2xlZXAoMjApOwogCXJldHVybiByYzsKIH0KKworc3RhdGljIHZvaWQgYm54MnhfY2huZ19saW5rX2NvdW50KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCBib29sIGNsZWFyKQoreworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCXUzMiBhZGRyLCB2YWw7CisKKwkvKiBWZXJpZnkgdGhlIGxpbmtfY2hhbmdlX2NvdW50IGlzIHN1cHBvcnRlZCBieSB0aGUgTUZXICovCisJaWYgKCEoU0hNRU0yX0hBUyhicCwgbGlua19jaGFuZ2VfY291bnQpKSkKKwkJcmV0dXJuOworCisJYWRkciA9IHBhcmFtcy0+c2htZW0yX2Jhc2UgKworCQlvZmZzZXRvZihzdHJ1Y3Qgc2htZW0yX3JlZ2lvbiwgbGlua19jaGFuZ2VfY291bnRbcGFyYW1zLT5wb3J0XSk7CisJaWYgKGNsZWFyKQorCQl2YWwgPSAwOworCWVsc2UKKwkJdmFsID0gUkVHX1JEKGJwLCBhZGRyKSArIDE7CisJUkVHX1dSKGJwLCBhZGRyLCB2YWwpOworfQorCiAvKiBUaGUgYm54MnhfbGlua191cGRhdGUgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB1cG9uIGxpbmsKICAqIGludGVycnVwdC4KICAqIExpbmsgaXMgY29uc2lkZXJlZCB1cCBhcyBmb2xsb3dzOgpAQCAtNjc0OSw2ICs2Nzk1LDcgQEAKIAlzdHJ1Y3QgbGlua192YXJzIHBoeV92YXJzW01BWF9QSFlTXTsKIAl1OCBwb3J0ID0gcGFyYW1zLT5wb3J0OwogCXU4IGxpbmtfMTBnX3BsdXMsIHBoeV9pbmRleDsKKwl1MzIgcHJldl9saW5rX3N0YXR1cyA9IHZhcnMtPmxpbmtfc3RhdHVzOwogCXU4IGV4dF9waHlfbGlua191cCA9IDAsIGN1cl9saW5rX3VwOwogCWludCByYyA9IDA7CiAJdTggaXNfbWlfaW50ID0gMDsKQEAgLTY5ODgsNiArNzAzNSw5IEBACiAJZWxzZQogCQlyYyA9IGJueDJ4X3VwZGF0ZV9saW5rX2Rvd24ocGFyYW1zLCB2YXJzKTsKIAorCWlmICgocHJldl9saW5rX3N0YXR1cyBeIHZhcnMtPmxpbmtfc3RhdHVzKSAmIExJTktfU1RBVFVTX0xJTktfVVApCisJCWJueDJ4X2NobmdfbGlua19jb3VudChwYXJhbXMsIGZhbHNlKTsKKwogCS8qIFVwZGF0ZSBNQ1AgbGluayBzdGF0dXMgd2FzIGNoYW5nZWQgKi8KIAlpZiAocGFyYW1zLT5mZWF0dXJlX2NvbmZpZ19mbGFncyAmIEZFQVRVUkVfQ09ORklHX0JDX1NVUFBPUlRTX0FGRVgpCiAJCWJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9MSU5LX1NUQVRVU19DSEFOR0VELCAwKTsKQEAgLTEyNjMxLDYgKzEyNjgxLDcgQEAKIAlwYXJhbXMtPmxpbmtfZmxhZ3MgPSBQSFlfSU5JVElBTElaRUQ7CiAJLyogRHJpdmVyIG9wZW5zIE5JRy1CUkIgZmlsdGVycyAqLwogCWJueDJ4X3NldF9yeF9maWx0ZXIocGFyYW1zLCAxKTsKKwlibngyeF9jaG5nX2xpbmtfY291bnQocGFyYW1zLCB0cnVlKTsKIAkvKiBDaGVjayBpZiBsaW5rIGZsYXAgY2FuIGJlIGF2b2lkZWQgKi8KIAlsZmFfc3RhdHVzID0gYm54MnhfY2hlY2tfbGZhKHBhcmFtcyk7CiAKQEAgLTEyNzA1LDYgKzEyNzU2LDcgQEAKIAlEUChORVRJRl9NU0dfTElOSywgIlJlc2V0dGluZyB0aGUgbGluayBvZiBwb3J0ICVkXG4iLCBwb3J0KTsKIAkvKiBEaXNhYmxlIGF0dGVudGlvbnMgKi8KIAl2YXJzLT5saW5rX3N0YXR1cyA9IDA7CisJYm54MnhfY2huZ19saW5rX2NvdW50KHBhcmFtcywgdHJ1ZSk7CiAJYm54MnhfdXBkYXRlX21uZyhwYXJhbXMsIHZhcnMtPmxpbmtfc3RhdHVzKTsKIAl2YXJzLT5lZWVfc3RhdHVzICY9IH4oU0hNRU1fRUVFX0xQX0FEVl9TVEFUVVNfTUFTSyB8CiAJCQkgICAgICBTSE1FTV9FRUVfQUNUSVZFX0JJVCk7CkBAIC0xMzMwOCw3ICsxMzM2MCw3IEBACiAJCXZhcnMtPnBoeV9mbGFncyAmPSB+UEhZX09WRVJfQ1VSUkVOVF9GTEFHOwogfQogCi0vKiBSZXR1cm5zIDAgaWYgbm8gY2hhbmdlIG9jY3VyZWQgc2luY2UgbGFzdCBjaGVjazsgMSBvdGhlcndpc2UuICovCisvKiBSZXR1cm5zIDAgaWYgbm8gY2hhbmdlIG9jY3VycmVkIHNpbmNlIGxhc3QgY2hlY2s7IDEgb3RoZXJ3aXNlLiAqLwogc3RhdGljIHU4IGJueDJ4X2FuYWx5emVfbGlua19lcnJvcihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKIAkJCQkgICAgc3RydWN0IGxpbmtfdmFycyAqdmFycywgdTMyIHN0YXR1cywKIAkJCQkgICAgdTMyIHBoeV9mbGFnLCB1MzIgbGlua19mbGFnLCB1OCBub3RpZnkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9tYWluLmMKaW5kZXggYmVmNzUwYS4uYjlmODVmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9tYWluLmMKQEAgLTEyOSw4ICsxMjksOCBAQAogCXUzMiB4bWFjX3ZhbDsKIAl1MzIgZW1hY19hZGRyOwogCXUzMiBlbWFjX3ZhbDsKLQl1MzIgdW1hY19hZGRyOwotCXUzMiB1bWFjX3ZhbDsKKwl1MzIgdW1hY19hZGRyWzJdOworCXUzMiB1bWFjX3ZhbFsyXTsKIAl1MzIgYm1hY19hZGRyOwogCXUzMiBibWFjX3ZhbFsyXTsKIH07CkBAIC03ODY2LDYgKzc4NjYsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorLyogcHJldmlvdXMgZHJpdmVyIERNQUUgdHJhbnNhY3Rpb24gbWF5IGhhdmUgb2NjdXJyZWQgd2hlbiBwcmUtYm9vdCBzdGFnZSBlbmRlZAorICogYW5kIGJvb3QgYmVnYW4sIG9yIHdoZW4ga2R1bXAga2VybmVsIHdhcyBsb2FkZWQuIEVpdGhlciBjYXNlIHdvdWxkIGludmFsaWRhdGUKKyAqIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHRyYW5zYWN0aW9uLCByZXN1bHRpbmcgaW4gd2FzLWVycm9yIGJpdCBzZXQgaW4gdGhlIHBjaQorICogY2F1c2luZyBhbGwgaHctdG8taG9zdCBwY2llIHRyYW5zYWN0aW9ucyB0byB0aW1lb3V0LiBJZiB0aGlzIGhhcHBlbmVkIHdlIHdhbnQKKyAqIHRvIGNsZWFyIHRoZSBpbnRlcnJ1cHQgd2hpY2ggZGV0ZWN0ZWQgdGhpcyBmcm9tIHRoZSBwZ2x1ZWIgYW5kIHRoZSB3YXMgZG9uZQorICogYml0CisgKi8KK3N0YXRpYyB2b2lkIGJueDJ4X2NsZWFuX3BnbHVlX2Vycm9ycyhzdHJ1Y3QgYm54MnggKmJwKQoreworCWlmICghQ0hJUF9JU19FMXgoYnApKQorCQlSRUdfV1IoYnAsIFBHTFVFX0JfUkVHX1dBU19FUlJPUl9QRl83XzBfQ0xSLAorCQkgICAgICAgMSA8PCBCUF9BQlNfRlVOQyhicCkpOworfQorCiBzdGF0aWMgaW50IGJueDJ4X2luaXRfaHdfZnVuYyhzdHJ1Y3QgYm54MnggKmJwKQogewogCWludCBwb3J0ID0gQlBfUE9SVChicCk7CkBAIC03OTU4LDggKzc5NzIsNyBAQAogCiAJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfUEdMVUVfQiwgaW5pdF9waGFzZSk7CiAKLQlpZiAoIUNISVBfSVNfRTF4KGJwKSkKLQkJUkVHX1dSKGJwLCBQR0xVRV9CX1JFR19XQVNfRVJST1JfUEZfN18wX0NMUiwgZnVuYyk7CisJYm54MnhfY2xlYW5fcGdsdWVfZXJyb3JzKGJwKTsKIAogCWJueDJ4X2luaXRfYmxvY2soYnAsIEJMT0NLX0FUQywgaW5pdF9waGFzZSk7CiAJYm54MnhfaW5pdF9ibG9jayhicCwgQkxPQ0tfRE1BRSwgaW5pdF9waGFzZSk7CkBAIC0xMDE0MSw2ICsxMDE1NCwyNSBAQAogCXJldHVybiBiYXNlICsgKEJQX0FCU19GVU5DKGJwKSkgKiBzdHJpZGU7CiB9CiAKK3N0YXRpYyBib29sIGJueDJ4X3ByZXZfdW5sb2FkX2Nsb3NlX3VtYWMoc3RydWN0IGJueDJ4ICpicCwKKwkJCQkJIHU4IHBvcnQsIHUzMiByZXNldF9yZWcsCisJCQkJCSBzdHJ1Y3QgYm54MnhfbWFjX3ZhbHMgKnZhbHMpCit7CisJdTMyIG1hc2sgPSBNSVNDX1JFR0lTVEVSU19SRVNFVF9SRUdfMl9VTUFDMCA8PCBwb3J0OworCXUzMiBiYXNlX2FkZHI7CisKKwlpZiAoIShtYXNrICYgcmVzZXRfcmVnKSkKKwkJcmV0dXJuIGZhbHNlOworCisJQk5YMlhfREVWX0lORk8oIkRpc2FibGUgdW1hYyBSeCAlMDJ4XG4iLCBwb3J0KTsKKwliYXNlX2FkZHIgPSBwb3J0ID8gR1JDQkFTRV9VTUFDMSA6IEdSQ0JBU0VfVU1BQzA7CisJdmFscy0+dW1hY19hZGRyW3BvcnRdID0gYmFzZV9hZGRyICsgVU1BQ19SRUdfQ09NTUFORF9DT05GSUc7CisJdmFscy0+dW1hY192YWxbcG9ydF0gPSBSRUdfUkQoYnAsIHZhbHMtPnVtYWNfYWRkcltwb3J0XSk7CisJUkVHX1dSKGJwLCB2YWxzLT51bWFjX2FkZHJbcG9ydF0sIDApOworCisJcmV0dXJuIHRydWU7Cit9CisKIHN0YXRpYyB2b2lkIGJueDJ4X3ByZXZfdW5sb2FkX2Nsb3NlX21hYyhzdHJ1Y3QgYm54MnggKmJwLAogCQkJCQlzdHJ1Y3QgYm54MnhfbWFjX3ZhbHMgKnZhbHMpCiB7CkBAIC0xMDE0OSwxMCArMTAxODEsNyBAQAogCXU4IHBvcnQgPSBCUF9QT1JUKGJwKTsKIAogCS8qIHJlc2V0IGFkZHJlc3NlcyBhcyB0aGV5IGFsc28gbWFyayB3aGljaCB2YWx1ZXMgd2VyZSBjaGFuZ2VkICovCi0JdmFscy0+Ym1hY19hZGRyID0gMDsKLQl2YWxzLT51bWFjX2FkZHIgPSAwOwotCXZhbHMtPnhtYWNfYWRkciA9IDA7Ci0JdmFscy0+ZW1hY19hZGRyID0gMDsKKwltZW1zZXQodmFscywgMCwgc2l6ZW9mKCp2YWxzKSk7CiAKIAlyZXNldF9yZWcgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX1JFU0VUX1JFR18yKTsKIApAQCAtMTAyMDEsMTUgKzEwMjMwLDExIEBACiAJCQlSRUdfV1IoYnAsIHZhbHMtPnhtYWNfYWRkciwgMCk7CiAJCQltYWNfc3RvcHBlZCA9IHRydWU7CiAJCX0KLQkJbWFzayA9IE1JU0NfUkVHSVNURVJTX1JFU0VUX1JFR18yX1VNQUMwIDw8IHBvcnQ7Ci0JCWlmIChtYXNrICYgcmVzZXRfcmVnKSB7Ci0JCQlCTlgyWF9ERVZfSU5GTygiRGlzYWJsZSB1bWFjIFJ4XG4iKTsKLQkJCWJhc2VfYWRkciA9IEJQX1BPUlQoYnApID8gR1JDQkFTRV9VTUFDMSA6IEdSQ0JBU0VfVU1BQzA7Ci0JCQl2YWxzLT51bWFjX2FkZHIgPSBiYXNlX2FkZHIgKyBVTUFDX1JFR19DT01NQU5EX0NPTkZJRzsKLQkJCXZhbHMtPnVtYWNfdmFsID0gUkVHX1JEKGJwLCB2YWxzLT51bWFjX2FkZHIpOwotCQkJUkVHX1dSKGJwLCB2YWxzLT51bWFjX2FkZHIsIDApOwotCQkJbWFjX3N0b3BwZWQgPSB0cnVlOwotCQl9CisKKwkJbWFjX3N0b3BwZWQgfD0gYm54MnhfcHJldl91bmxvYWRfY2xvc2VfdW1hYyhicCwgMCwKKwkJCQkJCQkgICAgcmVzZXRfcmVnLCB2YWxzKTsKKwkJbWFjX3N0b3BwZWQgfD0gYm54MnhfcHJldl91bmxvYWRfY2xvc2VfdW1hYyhicCwgMSwKKwkJCQkJCQkgICAgcmVzZXRfcmVnLCB2YWxzKTsKIAl9CiAKIAlpZiAobWFjX3N0b3BwZWQpCkBAIC0xMDUwNSw4ICsxMDUzMCwxMSBAQAogCQkvKiBDbG9zZSB0aGUgTUFDIFJ4IHRvIHByZXZlbnQgQlJCIGZyb20gZmlsbGluZyB1cCAqLwogCQlibngyeF9wcmV2X3VubG9hZF9jbG9zZV9tYWMoYnAsICZtYWNfdmFscyk7CiAKLQkJLyogY2xvc2UgTExIIGZpbHRlcnMgdG93YXJkcyB0aGUgQlJCICovCisJCS8qIGNsb3NlIExMSCBmaWx0ZXJzIGZvciBib3RoIHBvcnRzIHRvd2FyZHMgdGhlIEJSQiAqLwogCQlibngyeF9zZXRfcnhfZmlsdGVyKCZicC0+bGlua19wYXJhbXMsIDApOworCQlicC0+bGlua19wYXJhbXMucG9ydCBePSAxOworCQlibngyeF9zZXRfcnhfZmlsdGVyKCZicC0+bGlua19wYXJhbXMsIDApOworCQlicC0+bGlua19wYXJhbXMucG9ydCBePSAxOwogCiAJCS8qIENoZWNrIGlmIHRoZSBVTkRJIGRyaXZlciB3YXMgcHJldmlvdXNseSBsb2FkZWQgKi8KIAkJaWYgKGJueDJ4X3ByZXZfaXNfYWZ0ZXJfdW5kaShicCkpIHsKQEAgLTEwNTUzLDggKzEwNTgxLDEwIEBACiAKIAlpZiAobWFjX3ZhbHMueG1hY19hZGRyKQogCQlSRUdfV1IoYnAsIG1hY192YWxzLnhtYWNfYWRkciwgbWFjX3ZhbHMueG1hY192YWwpOwotCWlmIChtYWNfdmFscy51bWFjX2FkZHIpCi0JCVJFR19XUihicCwgbWFjX3ZhbHMudW1hY19hZGRyLCBtYWNfdmFscy51bWFjX3ZhbCk7CisJaWYgKG1hY192YWxzLnVtYWNfYWRkclswXSkKKwkJUkVHX1dSKGJwLCBtYWNfdmFscy51bWFjX2FkZHJbMF0sIG1hY192YWxzLnVtYWNfdmFsWzBdKTsKKwlpZiAobWFjX3ZhbHMudW1hY19hZGRyWzFdKQorCQlSRUdfV1IoYnAsIG1hY192YWxzLnVtYWNfYWRkclsxXSwgbWFjX3ZhbHMudW1hY192YWxbMV0pOwogCWlmIChtYWNfdmFscy5lbWFjX2FkZHIpCiAJCVJFR19XUihicCwgbWFjX3ZhbHMuZW1hY19hZGRyLCBtYWNfdmFscy5lbWFjX3ZhbCk7CiAJaWYgKG1hY192YWxzLmJtYWNfYWRkcikgewpAQCAtMTA1NzEsMjYgKzEwNjAxLDYgQEAKIAlyZXR1cm4gYm54MnhfcHJldl9tY3BfZG9uZShicCk7CiB9CiAKLS8qIHByZXZpb3VzIGRyaXZlciBETUFFIHRyYW5zYWN0aW9uIG1heSBoYXZlIG9jY3VycmVkIHdoZW4gcHJlLWJvb3Qgc3RhZ2UgZW5kZWQKLSAqIGFuZCBib290IGJlZ2FuLCBvciB3aGVuIGtkdW1wIGtlcm5lbCB3YXMgbG9hZGVkLiBFaXRoZXIgY2FzZSB3b3VsZCBpbnZhbGlkYXRlCi0gKiB0aGUgYWRkcmVzc2VzIG9mIHRoZSB0cmFuc2FjdGlvbiwgcmVzdWx0aW5nIGluIHdhcy1lcnJvciBiaXQgc2V0IGluIHRoZSBwY2kKLSAqIGNhdXNpbmcgYWxsIGh3LXRvLWhvc3QgcGNpZSB0cmFuc2FjdGlvbnMgdG8gdGltZW91dC4gSWYgdGhpcyBoYXBwZW5lZCB3ZSB3YW50Ci0gKiB0byBjbGVhciB0aGUgaW50ZXJydXB0IHdoaWNoIGRldGVjdGVkIHRoaXMgZnJvbSB0aGUgcGdsdWViIGFuZCB0aGUgd2FzIGRvbmUKLSAqIGJpdAotICovCi1zdGF0aWMgdm9pZCBibngyeF9wcmV2X2ludGVycnVwdGVkX2RtYWUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpZiAoIUNISVBfSVNfRTF4KGJwKSkgewotCQl1MzIgdmFsID0gUkVHX1JEKGJwLCBQR0xVRV9CX1JFR19QR0xVRV9CX0lOVF9TVFMpOwotCQlpZiAodmFsICYgUEdMVUVfQl9QR0xVRV9CX0lOVF9TVFNfUkVHX1dBU19FUlJPUl9BVFROKSB7Ci0JCQlEUChCTlgyWF9NU0dfU1AsCi0JCQkgICAiJ3dhcyBlcnJvcicgYml0IHdhcyBmb3VuZCB0byBiZSBzZXQgaW4gcGdsdWViIHVwb24gc3RhcnR1cC4gQ2xlYXJpbmdcbiIpOwotCQkJUkVHX1dSKGJwLCBQR0xVRV9CX1JFR19XQVNfRVJST1JfUEZfN18wX0NMUiwKLQkJCSAgICAgICAxIDw8IEJQX0ZVTkMoYnApKTsKLQkJfQotCX0KLX0KLQogc3RhdGljIGludCBibngyeF9wcmV2X3VubG9hZChzdHJ1Y3QgYm54MnggKmJwKQogewogCWludCB0aW1lX2NvdW50ZXIgPSAxMDsKQEAgLTEwNjAwLDcgKzEwNjEwLDcgQEAKIAkvKiBjbGVhciBodyBmcm9tIGVycm9ycyB3aGljaCBtYXkgaGF2ZSByZXN1bHRlZCBmcm9tIGFuIGludGVycnVwdGVkCiAJICogZG1hZSB0cmFuc2FjdGlvbi4KIAkgKi8KLQlibngyeF9wcmV2X2ludGVycnVwdGVkX2RtYWUoYnApOworCWJueDJ4X2NsZWFuX3BnbHVlX2Vycm9ycyhicCk7CiAKIAkvKiBSZWxlYXNlIHByZXZpb3VzbHkgaGVsZCBsb2NrcyAqLwogCWh3X2xvY2tfcmVnID0gKEJQX0ZVTkMoYnApIDw9IDUpID8KQEAgLTExNTQ2LDEzICsxMTU1NiwxMyBAQAogCS8qIERpc2FibGUgaVNDU0kgT09PIGlmIE1BQyBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuICovCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGlzY3NpX21hYykpIHsKIAkJYnAtPmZsYWdzIHw9IE5PX0lTQ1NJX09PT19GTEFHIHwgTk9fSVNDU0lfRkxBRzsKLQkJbWVtc2V0KGlzY3NpX21hYywgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKGlzY3NpX21hYyk7CiAJfQogCiAJLyogRGlzYWJsZSBGQ29FIGlmIE1BQyBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuICovCiAJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGZpcF9tYWMpKSB7CiAJCWJwLT5mbGFncyB8PSBOT19GQ09FX0ZMQUc7Ci0JCW1lbXNldChicC0+ZmlwX21hYywgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKGJwLT5maXBfbWFjKTsKIAl9CiB9CiAKQEAgLTExNTYzLDcgKzExNTczLDcgQEAKIAlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwogCiAJLyogWmVybyBwcmltYXJ5IE1BQyBjb25maWd1cmF0aW9uICovCi0JbWVtc2V0KGJwLT5kZXYtPmRldl9hZGRyLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihicC0+ZGV2LT5kZXZfYWRkcik7CiAKIAlpZiAoQlBfTk9NQ1AoYnApKSB7CiAJCUJOWDJYX0VSUk9SKCJ3YXJuaW5nOiByYW5kb20gTUFDIHdvcmthcm91bmQgYWN0aXZlXG4iKTsKQEAgLTExNjEwLDcgKzExNjIwLDcgQEAKIAl1MzIgY2ZnOwogCiAJaWYgKElTX1ZGKGJwKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAogCWlmIChJU19NRihicCkgJiYgIUNISVBfSVNfRTF4KGJwKSkgewogCQkvKiBUYWtlIGZ1bmN0aW9uOiB0bXAgPSBmdW5jICovCkBAIC0xMTY1MCw2ICsxMTY2MCwxMyBAQAogCXUzMiB2YWwgPSAwLCB2YWwyID0gMDsKIAlpbnQgcmMgPSAwOwogCisJLyogVmFsaWRhdGUgdGhhdCBjaGlwIGFjY2VzcyBpcyBmZWFzaWJsZSAqLworCWlmIChSRUdfUkQoYnAsIE1JU0NfUkVHX0NISVBfTlVNKSA9PSAweGZmZmZmZmZmKSB7CisJCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsCisJCQkiQ2hpcCByZWFkIHJldHVybnMgYWxsIEZzLiBQcmV2ZW50aW5nIHByb2JlIGZyb20gY29udGludWluZ1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWJueDJ4X2dldF9jb21tb25faHdpbmZvKGJwKTsKIAogCS8qCkBAIC0xMjAzNyw5ICsxMjA1NCw4IEBACiAJbXV0ZXhfaW5pdCgmYnAtPnBvcnQucGh5X211dGV4KTsKIAltdXRleF9pbml0KCZicC0+ZndfbWJfbXV0ZXgpOwogCW11dGV4X2luaXQoJmJwLT5kcnZfaW5mb19tdXRleCk7CisJbXV0ZXhfaW5pdCgmYnAtPnN0YXRzX2xvY2spOwogCWJwLT5kcnZfaW5mb19tbmdfb3duZXIgPSBmYWxzZTsKLQlzcGluX2xvY2tfaW5pdCgmYnAtPnN0YXRzX2xvY2spOwotCXNlbWFfaW5pdCgmYnAtPnN0YXRzX3NlbWEsIDEpOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmJwLT5zcF90YXNrLCBibngyeF9zcF90YXNrKTsKIAlJTklUX0RFTEFZRURfV09SSygmYnAtPnNwX3J0bmxfdGFzaywgYm54Mnhfc3BfcnRubF90YXNrKTsKQEAgLTEyNTU3LDYgKzEyNTczLDcgQEAKIAkJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJICAgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CisJZmVhdHVyZXMgPSB2bGFuX2ZlYXR1cmVzX2NoZWNrKHNrYiwgZmVhdHVyZXMpOwogCXJldHVybiB2eGxhbl9mZWF0dXJlc19jaGVjayhza2IsIGZlYXR1cmVzKTsKIH0KIApAQCAtMTI3NjksNyArMTI3ODYsNyBAQAogCQlORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPX0VDTiB8IE5FVElGX0ZfVFNPNiB8CiAJCU5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9MUk8gfCBORVRJRl9GX0dSTyB8CiAJCU5FVElGX0ZfUlhIQVNIIHwgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFg7Ci0JaWYgKCFDSElQX0lTX0UxeChicCkpIHsKKwlpZiAoIWNoaXBfaXNfZTF4KSB7CiAJCWRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9HU09fR1JFIHwgTkVUSUZfRl9HU09fVURQX1RVTk5FTCB8CiAJCQkJICAgIE5FVElGX0ZfR1NPX0lQSVAgfCBORVRJRl9GX0dTT19TSVQ7CiAJCWRldi0+aHdfZW5jX2ZlYXR1cmVzID0KQEAgLTEzMjc4LDMwICsxMzI5NSwyNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJueDJ4X3B0cF9nZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorc3RhdGljIGludCBibngyeF9wdHBfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBjb250YWluZXJfb2YocHRwLCBzdHJ1Y3QgYm54MngsIHB0cF9jbG9ja19pbmZvKTsKIAl1NjQgbnM7Ci0JdTMyIHJlbWFpbmRlcjsKIAogCW5zID0gdGltZWNvdW50ZXJfcmVhZCgmYnAtPnRpbWVjb3VudGVyKTsKIAogCURQKEJOWDJYX01TR19QVFAsICJQVFAgZ2V0dGltZSBjYWxsZWQsIG5zID0gJWxsdVxuIiwgbnMpOwogCi0JdHMtPnR2X3NlYyA9IGRpdl91NjRfcmVtKG5zLCAxMDAwMDAwMDAwVUxMLCAmcmVtYWluZGVyKTsKLQl0cy0+dHZfbnNlYyA9IHJlbWFpbmRlcjsKKwkqdHMgPSBuc190b190aW1lc3BlYzY0KG5zKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGJueDJ4X3B0cF9zZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorCQkJICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IGNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBibngyeCwgcHRwX2Nsb2NrX2luZm8pOwogCXU2NCBuczsKIAotCW5zID0gdHMtPnR2X3NlYyAqIDEwMDAwMDAwMDBVTEw7Ci0JbnMgKz0gdHMtPnR2X25zZWM7CisJbnMgPSB0aW1lc3BlYzY0X3RvX25zKHRzKTsKIAogCURQKEJOWDJYX01TR19QVFAsICJQVFAgc2V0dGltZSBjYWxsZWQsIG5zID0gJWxsdVxuIiwgbnMpOwogCkBAIC0xMzMzMyw4ICsxMzM0Nyw4IEBACiAJYnAtPnB0cF9jbG9ja19pbmZvLnBwcyA9IDA7CiAJYnAtPnB0cF9jbG9ja19pbmZvLmFkamZyZXEgPSBibngyeF9wdHBfYWRqZnJlcTsKIAlicC0+cHRwX2Nsb2NrX2luZm8uYWRqdGltZSA9IGJueDJ4X3B0cF9hZGp0aW1lOwotCWJwLT5wdHBfY2xvY2tfaW5mby5nZXR0aW1lID0gYm54MnhfcHRwX2dldHRpbWU7Ci0JYnAtPnB0cF9jbG9ja19pbmZvLnNldHRpbWUgPSBibngyeF9wdHBfc2V0dGltZTsKKwlicC0+cHRwX2Nsb2NrX2luZm8uZ2V0dGltZTY0ID0gYm54MnhfcHRwX2dldHRpbWU7CisJYnAtPnB0cF9jbG9ja19pbmZvLnNldHRpbWU2NCA9IGJueDJ4X3B0cF9zZXR0aW1lOwogCWJwLT5wdHBfY2xvY2tfaW5mby5lbmFibGUgPSBibngyeF9wdHBfZW5hYmxlOwogCiAJYnAtPnB0cF9jbG9jayA9IHB0cF9jbG9ja19yZWdpc3RlcigmYnAtPnB0cF9jbG9ja19pbmZvLCAmYnAtPnBkZXYtPmRldik7CkBAIC0xMzY2OCw5ICsxMzY4Miw5IEBACiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZicC0+c3BfdGFzayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZicC0+cGVyaW9kX3Rhc2spOwogCi0Jc3Bpbl9sb2NrX2JoKCZicC0+c3RhdHNfbG9jayk7CisJbXV0ZXhfbG9jaygmYnAtPnN0YXRzX2xvY2spOwogCWJwLT5zdGF0c19zdGF0ZSA9IFNUQVRTX1NUQVRFX0RJU0FCTEVEOwotCXNwaW5fdW5sb2NrX2JoKCZicC0+c3RhdHNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZicC0+c3RhdHNfbG9jayk7CiAKIAlibngyeF9zYXZlX3N0YXRpc3RpY3MoYnApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9yZWcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3JlZy5oCmluZGV4IDZmZTU0N2MuLjQ5ZDUxMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3JlZy5oCkBAIC0yOSw3ICsyOSw3IEBACiAjZGVmaW5lIEFUQ19BVENfSU5UX1NUU19SRUdfQVRDX1RDUExfVE9fTk9UX1BFTkQJCSAoMHgxPDwxKQogLyogW1JXIDFdIEluaXRpYXRlIHRoZSBBVEMgYXJyYXkgLSByZXNldCBhbGwgdGhlIHZhbGlkIGJpdHMgKi8KICNkZWZpbmUgQVRDX1JFR19BVENfSU5JVF9BUlJBWQkJCQkJIDB4MTEwMGI4Ci0vKiBbUiAxXSBBVEMgaW5pdGFsaXphdGlvbiBkb25lICovCisvKiBbUiAxXSBBVEMgaW5pdGlhbGl6YXRpb24gZG9uZSAqLwogI2RlZmluZSBBVENfUkVHX0FUQ19JTklUX0RPTkUJCQkJCSAweDExMDBiYwogLyogW1JDIDZdIEludGVycnVwdCByZWdpc3RlciAjMCByZWFkIGNsZWFyICovCiAjZGVmaW5lIEFUQ19SRUdfQVRDX0lOVF9TVFNfQ0xSCQkJCQkgMHgxMTAxYzAKQEAgLTczNDEsNiArNzM0MSw4IEBACiAjZGVmaW5lIE1ESU9fV0NfUkVHX1RYMl9BTkFfQ1RSTDAJCQkweDgwODEKICNkZWZpbmUgTURJT19XQ19SRUdfVFgzX0FOQV9DVFJMMAkJCTB4ODA5MQogI2RlZmluZSBNRElPX1dDX1JFR19UWDBfVFhfRFJJVkVSCQkJMHg4MDY3CisjZGVmaW5lIE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVJfSUZJUl9PRkZTRVQJCQkweDAxCisjZGVmaW5lIE1ESU9fV0NfUkVHX1RYMF9UWF9EUklWRVJfSUZJUl9NQVNLCQkJCTB4MDAwZQogI2RlZmluZSBNRElPX1dDX1JFR19UWDBfVFhfRFJJVkVSX0lQUkVfRFJJVkVSX09GRlNFVAkJMHgwNAogI2RlZmluZSBNRElPX1dDX1JFR19UWDBfVFhfRFJJVkVSX0lQUkVfRFJJVkVSX01BU0sJCQkweDAwZjAKICNkZWZpbmUgTURJT19XQ19SRUdfVFgwX1RYX0RSSVZFUl9JRFJJVkVSX09GRlNFVAkJMHgwOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NyaW92LmMKaW5kZXggZTVhY2EyZC4uZjY3MzQ4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3Jpb3YuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcmlvdi5jCkBAIC01OTIsNyArNTkyLDcgQEAKIAkJbWMgPSBremFsbG9jKG1jX251bSAqIHNpemVvZihzdHJ1Y3QgYm54MnhfbWNhc3RfbGlzdF9lbGVtKSwKIAkJCSAgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghbWMpIHsKLQkJCUJOWDJYX0VSUigiQ2Fubm90IENvbmZpZ3VyZSBtdWxpY2FzdHMgZHVlIHRvIGxhY2sgb2YgbWVtb3J5XG4iKTsKKwkJCUJOWDJYX0VSUigiQ2Fubm90IENvbmZpZ3VyZSBtdWx0aWNhc3RzIGR1ZSB0byBsYWNrIG9mIG1lbW9yeVxuIik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0KQEAgLTIyMzgsNyArMjIzOCw5IEBACiAKIAkJY29va2llLnZmID0gdmY7CiAJCWNvb2tpZS5zdGF0ZSA9IFZGX0FDUVVJUkVEOwotCQlibngyeF9zdGF0c19zYWZlX2V4ZWMoYnAsIGJueDJ4X3NldF92Zl9zdGF0ZSwgJmNvb2tpZSk7CisJCXJjID0gYm54Mnhfc3RhdHNfc2FmZV9leGVjKGJwLCBibngyeF9zZXRfdmZfc3RhdGUsICZjb29raWUpOworCQlpZiAocmMpCisJCQlnb3RvIG9wX2VycjsKIAl9CiAKIAlEUChCTlgyWF9NU0dfSU9WLCAic2V0IHN0YXRlIHRvIGFjcXVpcmVkXG4iKTsKQEAgLTI2OTMsNyArMjY5NSw3IEBACiAJCQltZW1jcHkoJml2aS0+bWFjLCBidWxsZXRpbi0+bWFjLCBFVEhfQUxFTik7CiAJCWVsc2UKIAkJCS8qIGZ1bmN0aW9uIGhhcyBub3QgYmVlbiBsb2FkZWQgeWV0LiBTaG93IG1hYyBhcyAwcyAqLwotCQkJbWVtc2V0KCZpdmktPm1hYywgMCwgRVRIX0FMRU4pOworCQkJZXRoX3plcm9fYWRkcihpdmktPm1hYyk7CiAKIAkJLyogdmxhbiAqLwogCQlpZiAoYnVsbGV0aW4tPnZhbGlkX2JpdG1hcCAmICgxIDw8IFZMQU5fVkFMSUQpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3RhdHMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3N0YXRzLmMKaW5kZXggZDE2MDgyOS4uMjY2YjA1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3RhdHMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zdGF0cy5jCkBAIC0xMjMsMzYgKzEyMywyOCBAQAogICovCiBzdGF0aWMgdm9pZCBibngyeF9zdG9ybV9zdGF0c19wb3N0KHN0cnVjdCBibngyeCAqYnApCiB7Ci0JaWYgKCFicC0+c3RhdHNfcGVuZGluZykgewotCQlpbnQgcmM7CisJaW50IHJjOwogCi0JCXNwaW5fbG9ja19iaCgmYnAtPnN0YXRzX2xvY2spOworCWlmIChicC0+c3RhdHNfcGVuZGluZykKKwkJcmV0dXJuOwogCi0JCWlmIChicC0+c3RhdHNfcGVuZGluZykgewotCQkJc3Bpbl91bmxvY2tfYmgoJmJwLT5zdGF0c19sb2NrKTsKLQkJCXJldHVybjsKLQkJfQorCWJwLT5md19zdGF0c19yZXEtPmhkci5kcnZfc3RhdHNfY291bnRlciA9CisJCWNwdV90b19sZTE2KGJwLT5zdGF0c19jb3VudGVyKyspOwogCi0JCWJwLT5md19zdGF0c19yZXEtPmhkci5kcnZfc3RhdHNfY291bnRlciA9Ci0JCQljcHVfdG9fbGUxNihicC0+c3RhdHNfY291bnRlcisrKTsKKwlEUChCTlgyWF9NU0dfU1RBVFMsICJTZW5kaW5nIHN0YXRpc3RpY3MgcmFtcm9kICVkXG4iLAorCSAgIGxlMTZfdG9fY3B1KGJwLT5md19zdGF0c19yZXEtPmhkci5kcnZfc3RhdHNfY291bnRlcikpOwogCi0JCURQKEJOWDJYX01TR19TVEFUUywgIlNlbmRpbmcgc3RhdGlzdGljcyByYW1yb2QgJWRcbiIsCi0JCSAgIGxlMTZfdG9fY3B1KGJwLT5md19zdGF0c19yZXEtPmhkci5kcnZfc3RhdHNfY291bnRlcikpOworCS8qIGFkanVzdCB0aGUgcmFtcm9kIHRvIGluY2x1ZGUgVkYgcXVldWVzIHN0YXRpc3RpY3MgKi8KKwlibngyeF9pb3ZfYWRqdXN0X3N0YXRzX3JlcShicCk7CisJYm54MnhfZHBfc3RhdHMoYnApOwogCi0JCS8qIGFkanVzdCB0aGUgcmFtcm9kIHRvIGluY2x1ZGUgVkYgcXVldWVzIHN0YXRpc3RpY3MgKi8KLQkJYm54MnhfaW92X2FkanVzdF9zdGF0c19yZXEoYnApOwotCQlibngyeF9kcF9zdGF0cyhicCk7Ci0KLQkJLyogc2VuZCBGVyBzdGF0cyByYW1yb2QgKi8KLQkJcmMgPSBibngyeF9zcF9wb3N0KGJwLCBSQU1ST0RfQ01EX0lEX0NPTU1PTl9TVEFUX1FVRVJZLCAwLAotCQkJCSAgIFU2NF9ISShicC0+Zndfc3RhdHNfcmVxX21hcHBpbmcpLAotCQkJCSAgIFU2NF9MTyhicC0+Zndfc3RhdHNfcmVxX21hcHBpbmcpLAotCQkJCSAgIE5PTkVfQ09OTkVDVElPTl9UWVBFKTsKLQkJaWYgKHJjID09IDApCi0JCQlicC0+c3RhdHNfcGVuZGluZyA9IDE7Ci0KLQkJc3Bpbl91bmxvY2tfYmgoJmJwLT5zdGF0c19sb2NrKTsKLQl9CisJLyogc2VuZCBGVyBzdGF0cyByYW1yb2QgKi8KKwlyYyA9IGJueDJ4X3NwX3Bvc3QoYnAsIFJBTVJPRF9DTURfSURfQ09NTU9OX1NUQVRfUVVFUlksIDAsCisJCQkgICBVNjRfSEkoYnAtPmZ3X3N0YXRzX3JlcV9tYXBwaW5nKSwKKwkJCSAgIFU2NF9MTyhicC0+Zndfc3RhdHNfcmVxX21hcHBpbmcpLAorCQkJICAgTk9ORV9DT05ORUNUSU9OX1RZUEUpOworCWlmIChyYyA9PSAwKQorCQlicC0+c3RhdHNfcGVuZGluZyA9IDE7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X2h3X3N0YXRzX3Bvc3Qoc3RydWN0IGJueDJ4ICpicCkKQEAgLTIyMSw3ICsyMTMsNyBAQAogICovCiAKIC8qIHNob3VsZCBiZSBjYWxsZWQgdW5kZXIgc3RhdHNfc2VtYSAqLwotc3RhdGljIHZvaWQgX19ibngyeF9zdGF0c19wbWZfdXBkYXRlKHN0cnVjdCBibngyeCAqYnApCitzdGF0aWMgdm9pZCBibngyeF9zdGF0c19wbWZfdXBkYXRlKHN0cnVjdCBibngyeCAqYnApCiB7CiAJc3RydWN0IGRtYWVfY29tbWFuZCAqZG1hZTsKIAl1MzIgb3Bjb2RlOwpAQCAtNTE5LDcgKzUxMSw3IEBACiB9CiAKIC8qIHNob3VsZCBiZSBjYWxsZWQgdW5kZXIgc3RhdHNfc2VtYSAqLwotc3RhdGljIHZvaWQgX19ibngyeF9zdGF0c19zdGFydChzdHJ1Y3QgYm54MnggKmJwKQorc3RhdGljIHZvaWQgYm54Mnhfc3RhdHNfc3RhcnQoc3RydWN0IGJueDJ4ICpicCkKIHsKIAlpZiAoSVNfUEYoYnApKSB7CiAJCWlmIChicC0+cG9ydC5wbWYpCkBAIC01MzEsMzQgKzUyMywxMyBAQAogCQlibngyeF9od19zdGF0c19wb3N0KGJwKTsKIAkJYm54Mnhfc3Rvcm1fc3RhdHNfcG9zdChicCk7CiAJfQotCi0JYnAtPnN0YXRzX3N0YXJ0ZWQgPSB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBibngyeF9zdGF0c19zdGFydChzdHJ1Y3QgYm54MnggKmJwKQotewotCWlmIChkb3duX3RpbWVvdXQoJmJwLT5zdGF0c19zZW1hLCBIWi8xMCkpCi0JCUJOWDJYX0VSUigiVW5hYmxlIHRvIGFjcXVpcmUgc3RhdHMgbG9ja1xuIik7Ci0JX19ibngyeF9zdGF0c19zdGFydChicCk7Ci0JdXAoJmJwLT5zdGF0c19zZW1hKTsKIH0KIAogc3RhdGljIHZvaWQgYm54Mnhfc3RhdHNfcG1mX3N0YXJ0KHN0cnVjdCBibngyeCAqYnApCiB7Ci0JaWYgKGRvd25fdGltZW91dCgmYnAtPnN0YXRzX3NlbWEsIEhaLzEwKSkKLQkJQk5YMlhfRVJSKCJVbmFibGUgdG8gYWNxdWlyZSBzdGF0cyBsb2NrXG4iKTsKIAlibngyeF9zdGF0c19jb21wKGJwKTsKLQlfX2JueDJ4X3N0YXRzX3BtZl91cGRhdGUoYnApOwotCV9fYm54Mnhfc3RhdHNfc3RhcnQoYnApOwotCXVwKCZicC0+c3RhdHNfc2VtYSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJueDJ4X3N0YXRzX3BtZl91cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpZiAoZG93bl90aW1lb3V0KCZicC0+c3RhdHNfc2VtYSwgSFovMTApKQotCQlCTlgyWF9FUlIoIlVuYWJsZSB0byBhY3F1aXJlIHN0YXRzIGxvY2tcbiIpOwotCV9fYm54Mnhfc3RhdHNfcG1mX3VwZGF0ZShicCk7Ci0JdXAoJmJwLT5zdGF0c19zZW1hKTsKKwlibngyeF9zdGF0c19wbWZfdXBkYXRlKGJwKTsKKwlibngyeF9zdGF0c19zdGFydChicCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X3N0YXRzX3Jlc3RhcnQoc3RydWN0IGJueDJ4ICpicCkKQEAgLTU2OCwxMSArNTM5LDkgQEAKIAkgKi8KIAlpZiAoSVNfVkYoYnApKQogCQlyZXR1cm47Ci0JaWYgKGRvd25fdGltZW91dCgmYnAtPnN0YXRzX3NlbWEsIEhaLzEwKSkKLQkJQk5YMlhfRVJSKCJVbmFibGUgdG8gYWNxdWlyZSBzdGF0cyBsb2NrXG4iKTsKKwogCWJueDJ4X3N0YXRzX2NvbXAoYnApOwotCV9fYm54Mnhfc3RhdHNfc3RhcnQoYnApOwotCXVwKCZicC0+c3RhdHNfc2VtYSk7CisJYm54Mnhfc3RhdHNfc3RhcnQoYnApOwogfQogCiBzdGF0aWMgdm9pZCBibngyeF9ibWFjX3N0YXRzX3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKQpAQCAtMTI0NiwxOCArMTIxNSwxMiBAQAogewogCXUzMiAqc3RhdHNfY29tcCA9IGJueDJ4X3NwKGJwLCBzdGF0c19jb21wKTsKIAotCS8qIHdlIHJ1biB1cGRhdGUgZnJvbSB0aW1lciBjb250ZXh0LCBzbyBnaXZlIHVwCi0JICogaWYgc29tZWJvZHkgaXMgaW4gdGhlIG1pZGRsZSBvZiB0cmFuc2l0aW9uCi0JICovCi0JaWYgKGRvd25fdHJ5bG9jaygmYnAtPnN0YXRzX3NlbWEpKQorCWlmIChibngyeF9lZGVidWdfc3RhdHNfc3RvcHBlZChicCkpCiAJCXJldHVybjsKIAotCWlmIChibngyeF9lZGVidWdfc3RhdHNfc3RvcHBlZChicCkgfHwgIWJwLT5zdGF0c19zdGFydGVkKQotCQlnb3RvIG91dDsKLQogCWlmIChJU19QRihicCkpIHsKIAkJaWYgKCpzdGF0c19jb21wICE9IERNQUVfQ09NUF9WQUwpCi0JCQlnb3RvIG91dDsKKwkJCXJldHVybjsKIAogCQlpZiAoYnAtPnBvcnQucG1mKQogCQkJYm54MnhfaHdfc3RhdHNfdXBkYXRlKGJwKTsKQEAgLTEyNjcsNyArMTIzMCw3IEBACiAJCQkJQk5YMlhfRVJSKCJzdG9ybSBzdGF0cyB3ZXJlIG5vdCB1cGRhdGVkIGZvciAzIHRpbWVzXG4iKTsKIAkJCQlibngyeF9wYW5pYygpOwogCQkJfQotCQkJZ290byBvdXQ7CisJCQlyZXR1cm47CiAJCX0KIAl9IGVsc2UgewogCQkvKiB2ZiBkb2Vzbid0IGNvbGxlY3QgSFcgc3RhdGlzdGljcywgYW5kIGRvZXNuJ3QgZ2V0IGNvbXBsZXRpb25zCkBAIC0xMjgxLDcgKzEyNDQsNyBAQAogCiAJLyogdmYgaXMgZG9uZSAqLwogCWlmIChJU19WRihicCkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAKIAlpZiAobmV0aWZfbXNnX3RpbWVyKGJwKSkgewogCQlzdHJ1Y3QgYm54MnhfZXRoX3N0YXRzICplc3RhdHMgPSAmYnAtPmV0aF9zdGF0czsKQEAgLTEyOTIsOSArMTI1NSw2IEBACiAKIAlibngyeF9od19zdGF0c19wb3N0KGJwKTsKIAlibngyeF9zdG9ybV9zdGF0c19wb3N0KGJwKTsKLQotb3V0OgotCXVwKCZicC0+c3RhdHNfc2VtYSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X3BvcnRfc3RhdHNfc3RvcChzdHJ1Y3QgYm54MnggKmJwKQpAQCAtMTM1OCwxMiArMTMxOCw3IEBACiAKIHN0YXRpYyB2b2lkIGJueDJ4X3N0YXRzX3N0b3Aoc3RydWN0IGJueDJ4ICpicCkKIHsKLQlpbnQgdXBkYXRlID0gMDsKLQotCWlmIChkb3duX3RpbWVvdXQoJmJwLT5zdGF0c19zZW1hLCBIWi8xMCkpCi0JCUJOWDJYX0VSUigiVW5hYmxlIHRvIGFjcXVpcmUgc3RhdHMgbG9ja1xuIik7Ci0KLQlicC0+c3RhdHNfc3RhcnRlZCA9IGZhbHNlOworCWJvb2wgdXBkYXRlID0gZmFsc2U7CiAKIAlibngyeF9zdGF0c19jb21wKGJwKTsKIApAQCAtMTM4MSw4ICsxMzM2LDYgQEAKIAkJYm54MnhfaHdfc3RhdHNfcG9zdChicCk7CiAJCWJueDJ4X3N0YXRzX2NvbXAoYnApOwogCX0KLQotCXVwKCZicC0+c3RhdHNfc2VtYSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X3N0YXRzX2RvX25vdGhpbmcoc3RydWN0IGJueDJ4ICpicCkKQEAgLTE0MTAsMTggKzEzNjMsMjggQEAKIAogdm9pZCBibngyeF9zdGF0c19oYW5kbGUoc3RydWN0IGJueDJ4ICpicCwgZW51bSBibngyeF9zdGF0c19ldmVudCBldmVudCkKIHsKLQllbnVtIGJueDJ4X3N0YXRzX3N0YXRlIHN0YXRlOwotCXZvaWQgKCphY3Rpb24pKHN0cnVjdCBibngyeCAqYnApOworCWVudW0gYm54Mnhfc3RhdHNfc3RhdGUgc3RhdGUgPSBicC0+c3RhdHNfc3RhdGU7CisKIAlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrX2JoKCZicC0+c3RhdHNfbG9jayk7Ci0Jc3RhdGUgPSBicC0+c3RhdHNfc3RhdGU7Ci0JYnAtPnN0YXRzX3N0YXRlID0gYm54Mnhfc3RhdHNfc3RtW3N0YXRlXVtldmVudF0ubmV4dF9zdGF0ZTsKLQlhY3Rpb24gPSBibngyeF9zdGF0c19zdG1bc3RhdGVdW2V2ZW50XS5hY3Rpb247Ci0Jc3Bpbl91bmxvY2tfYmgoJmJwLT5zdGF0c19sb2NrKTsKKwkvKiBTdGF0aXN0aWNzIHVwZGF0ZSBydW4gZnJvbSB0aW1lciBjb250ZXh0LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBzdG9wCisJICogdGhhdCBjb250ZXh0IGluIGNhc2Ugc29tZW9uZSBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgdHJhbnNpdGlvbi4KKwkgKiBGb3Igb3RoZXIgZXZlbnRzLCB3YWl0IGEgYml0IHVudGlsIGxvY2sgaXMgdGFrZW4uCisJICovCisJaWYgKCFtdXRleF90cnlsb2NrKCZicC0+c3RhdHNfbG9jaykpIHsKKwkJaWYgKGV2ZW50ID09IFNUQVRTX0VWRU5UX1VQREFURSkKKwkJCXJldHVybjsKIAotCWFjdGlvbihicCk7CisJCURQKEJOWDJYX01TR19TVEFUUywKKwkJICAgIlVubGlrZWx5IHN0YXRzJyBsb2NrIGNvbnRlbnRpb24gW2V2ZW50ICVkXVxuIiwgZXZlbnQpOworCQltdXRleF9sb2NrKCZicC0+c3RhdHNfbG9jayk7CisJfQorCisJYm54Mnhfc3RhdHNfc3RtW3N0YXRlXVtldmVudF0uYWN0aW9uKGJwKTsKKwlicC0+c3RhdHNfc3RhdGUgPSBibngyeF9zdGF0c19zdG1bc3RhdGVdW2V2ZW50XS5uZXh0X3N0YXRlOworCisJbXV0ZXhfdW5sb2NrKCZicC0+c3RhdHNfbG9jayk7CiAKIAlpZiAoKGV2ZW50ICE9IFNUQVRTX0VWRU5UX1VQREFURSkgfHwgbmV0aWZfbXNnX3RpbWVyKGJwKSkKIAkJRFAoQk5YMlhfTVNHX1NUQVRTLCAic3RhdGUgJWQgLT4gZXZlbnQgJWQgLT4gc3RhdGUgJWRcbiIsCkBAIC0xNjIwLDcgKzE1ODMsNyBAQAogCWlmIChicC0+cG9ydC5wbWYgJiYgYnAtPnBvcnQucG9ydF9zdHgpCiAJCWJueDJ4X3BvcnRfc3RhdHNfYmFzZV9pbml0KGJwKTsKIAotCS8qIG1hcmsgdGhlIGVuZCBvZiBzdGF0aXN0aWNzIGluaXRpYWxpemlhdGlvbiAqLworCS8qIG1hcmsgdGhlIGVuZCBvZiBzdGF0aXN0aWNzIGluaXRpYWxpemF0aW9uICovCiAJYnAtPnN0YXRzX2luaXQgPSBmYWxzZTsKIH0KIApAQCAtMTk5OCwxMyArMTk2MSwzNCBAQAogCX0KIH0KIAotdm9pZCBibngyeF9zdGF0c19zYWZlX2V4ZWMoc3RydWN0IGJueDJ4ICpicCwKLQkJCSAgIHZvaWQgKGZ1bmNfdG9fZXhlYykodm9pZCAqY29va2llKSwKLQkJCSAgIHZvaWQgKmNvb2tpZSl7Ci0JaWYgKGRvd25fdGltZW91dCgmYnAtPnN0YXRzX3NlbWEsIEhaLzEwKSkKLQkJQk5YMlhfRVJSKCJVbmFibGUgdG8gYWNxdWlyZSBzdGF0cyBsb2NrXG4iKTsKK2ludCBibngyeF9zdGF0c19zYWZlX2V4ZWMoc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgdm9pZCAoZnVuY190b19leGVjKSh2b2lkICpjb29raWUpLAorCQkJICB2b2lkICpjb29raWUpCit7CisJaW50IGNudCA9IDEwLCByYyA9IDA7CisKKwkvKiBXYWl0IGZvciBzdGF0aXN0aWNzIHRvIGVuZCBbd2hpbGUgYmxvY2tpbmcgZnVydGhlciByZXF1ZXN0c10sCisJICogdGhlbiBydW4gc3VwcGxpZWQgZnVuY3Rpb24gJ3NhZmVseScuCisJICovCisJbXV0ZXhfbG9jaygmYnAtPnN0YXRzX2xvY2spOworCiAJYm54Mnhfc3RhdHNfY29tcChicCk7CisJd2hpbGUgKGJwLT5zdGF0c19wZW5kaW5nICYmIGNudC0tKQorCQlpZiAoYm54Mnhfc3Rvcm1fc3RhdHNfdXBkYXRlKGJwKSkKKwkJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKwlpZiAoYnAtPnN0YXRzX3BlbmRpbmcpIHsKKwkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gd2FpdCBmb3Igc3RhdHMgcGVuZGluZyB0byBjbGVhciBbcG9zc2libHkgRlcgaXMgc3R1Y2tdXG4iKTsKKwkJcmMgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwogCWZ1bmNfdG9fZXhlYyhjb29raWUpOwotCV9fYm54Mnhfc3RhdHNfc3RhcnQoYnApOwotCXVwKCZicC0+c3RhdHNfc2VtYSk7CisKK291dDoKKwkvKiBObyBuZWVkIHRvIHJlc3RhcnQgc3RhdGlzdGljcyAtIGlmIHRoZXkncmUgZW5hYmxlZCwgdGhlIHRpbWVyCisJICogd2lsbCByZXN0YXJ0IHRoZSBzdGF0aXN0aWNzLgorCSAqLworCW11dGV4X3VubG9jaygmYnAtPnN0YXRzX2xvY2spOworCisJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3RhdHMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3N0YXRzLmgKaW5kZXggMmJlY2VhZS4uOTY1NTM5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3RhdHMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zdGF0cy5oCkBAIC01MzksOSArNTM5LDkgQEAKIHZvaWQgYm54MnhfbWVtc2V0X3N0YXRzKHN0cnVjdCBibngyeCAqYnApOwogdm9pZCBibngyeF9zdGF0c19pbml0KHN0cnVjdCBibngyeCAqYnApOwogdm9pZCBibngyeF9zdGF0c19oYW5kbGUoc3RydWN0IGJueDJ4ICpicCwgZW51bSBibngyeF9zdGF0c19ldmVudCBldmVudCk7Ci12b2lkIGJueDJ4X3N0YXRzX3NhZmVfZXhlYyhzdHJ1Y3QgYm54MnggKmJwLAotCQkJICAgdm9pZCAoZnVuY190b19leGVjKSh2b2lkICpjb29raWUpLAotCQkJICAgdm9pZCAqY29va2llKTsKK2ludCBibngyeF9zdGF0c19zYWZlX2V4ZWMoc3RydWN0IGJueDJ4ICpicCwKKwkJCSAgdm9pZCAoZnVuY190b19leGVjKSh2b2lkICpjb29raWUpLAorCQkJICB2b2lkICpjb29raWUpOwogCiAvKioKICAqIGJueDJ4X3NhdmVfc3RhdGlzdGljcyAtIHNhdmUgc3RhdGlzdGljcyB3aGVuIHVubG9hZGluZy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3ZmcGYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3ZmcGYuYwppbmRleCBiZTQwZWFiLi4xNWIyZDE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF92ZnBmLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfdmZwZi5jCkBAIC04MDAsNyArODAwLDcgQEAKIAlyZXEtPnJzc19rZXlfc2l6ZSA9IFRfRVRIX1JTU19LRVk7CiAJcmVxLT5yc3NfcmVzdWx0X21hc2sgPSBwYXJhbXMtPnJzc19yZXN1bHRfbWFzazsKIAotCS8qIGZsYWdzIGhhbmRsZWQgaW5kaXZpZHVhbGx5IGZvciBiYWNrd2FyZC9mb3J3YXJkIGNvbXBhdGFiaWxpdHkgKi8KKwkvKiBmbGFncyBoYW5kbGVkIGluZGl2aWR1YWxseSBmb3IgYmFja3dhcmQvZm9yd2FyZCBjb21wYXRpYmlsaXR5ICovCiAJaWYgKHBhcmFtcy0+cnNzX2ZsYWdzICYgKDEgPDwgQk5YMlhfUlNTX01PREVfRElTQUJMRUQpKQogCQlyZXEtPnJzc19mbGFncyB8PSBWRlBGX1JTU19NT0RFX0RJU0FCTEVEOwogCWlmIChwYXJhbXMtPnJzc19mbGFncyAmICgxIDw8IEJOWDJYX1JTU19NT0RFX1JFR1VMQVIpKQpAQCAtMTg2OSw3ICsxODY5LDcgQEAKIAlyc3MucnNzX29iaiA9ICZ2Zi0+cnNzX2NvbmZfb2JqOwogCXJzcy5yc3NfcmVzdWx0X21hc2sgPSByc3NfdGx2LT5yc3NfcmVzdWx0X21hc2s7CiAKLQkvKiBmbGFncyBoYW5kbGVkIGluZGl2aWR1YWxseSBmb3IgYmFja3dhcmQvZm9yd2FyZCBjb21wYXRhYmlsaXR5ICovCisJLyogZmxhZ3MgaGFuZGxlZCBpbmRpdmlkdWFsbHkgZm9yIGJhY2t3YXJkL2ZvcndhcmQgY29tcGF0aWJpbGl0eSAqLwogCXJzcy5yc3NfZmxhZ3MgPSAwOwogCXJzcy5yYW1yb2RfZmxhZ3MgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljLmMKaW5kZXggZjA1ZmFiNi4uMTdjMTQ1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWMuYwpAQCAtMSw3ICsxLDcgQEAKIC8qIGNuaWMuYzogUUxvZ2ljIENOSUMgY29yZSBuZXR3b3JrIGRyaXZlci4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDE0IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC01OCwxMSArNTgsMTEgQEAKICNkZWZpbmUgQ05JQ19NT0RVTEVfTkFNRQkiY25pYyIKIAogc3RhdGljIGNoYXIgdmVyc2lvbltdID0KLQkiUUxvZ2ljIE5ldFh0cmVtZSBJSSBDTklDIERyaXZlciAiIENOSUNfTU9EVUxFX05BTUUgIiB2IiBDTklDX01PRFVMRV9WRVJTSU9OICIgKCIgQ05JQ19NT0RVTEVfUkVMREFURSAiKVxuIjsKKwkiUUxvZ2ljICIgQ05JQ19NT0RVTEVfTkFNRSAiRHJpdmVyIHYiIENOSUNfTU9EVUxFX1ZFUlNJT04gIiAoIiBDTklDX01PRFVMRV9SRUxEQVRFICIpXG4iOwogCiBNT0RVTEVfQVVUSE9SKCJNaWNoYWVsIENoYW4gPG1jaGFuQGJyb2FkY29tLmNvbT4gYW5kIEpvaG4oWm9uZ3hpKSAiCiAJICAgICAgIkNoZW4gKHpvbmd4aUBicm9hZGNvbS5jb20iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUUxvZ2ljIE5ldFh0cmVtZSBJSSBDTklDIERyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJRTG9naWMgY25pYyBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKENOSUNfTU9EVUxFX1ZFUlNJT04pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljX2lmLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljX2lmLmgKaW5kZXggOGJiMzZjMS4uZWY2MTI1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19pZi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWNfaWYuaApAQCAtMSw3ICsxLDcgQEAKLS8qIGNuaWNfaWYuaDogUUxvZ2ljIENOSUMgY29yZSBuZXR3b3JrIGRyaXZlci4KKy8qIGNuaWNfaWYuaDogUUxvZ2ljIGNuaWMgY29yZSBuZXR3b3JrIGRyaXZlci4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxNCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICogQ29weXJpZ2h0IChjKSAyMDE0IFFMb2dpYyBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xNSw4ICsxNSw4IEBACiAKICNpbmNsdWRlICJibngyeC9ibngyeF9tZndfcmVxLmgiCiAKLSNkZWZpbmUgQ05JQ19NT0RVTEVfVkVSU0lPTgkiMi41LjIwIgotI2RlZmluZSBDTklDX01PRFVMRV9SRUxEQVRFCSJNYXJjaCAxNCwgMjAxNCIKKyNkZWZpbmUgQ05JQ19NT0RVTEVfVkVSU0lPTgkiMi41LjIxIgorI2RlZmluZSBDTklDX01PRFVMRV9SRUxEQVRFCSJKYW51YXJ5IDI5LCAyMDE1IgogCiAjZGVmaW5lIENOSUNfVUxQX1JETUEJCTAKICNkZWZpbmUgQ05JQ19VTFBfSVNDU0kJCTEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21nZW5ldC5jCmluZGV4IDZiZWZkZTYuLjYwNDM3MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtZ2VuZXQuYwpAQCAtNTQsOCArNTQsMTAgQEAKIC8qIERlZmF1bHQgaGlnaGVzdCBwcmlvcml0eSBxdWV1ZSBmb3IgbXVsdGkgcXVldWUgc3VwcG9ydCAqLwogI2RlZmluZSBHRU5FVF9RMF9QUklPUklUWQkwCiAKLSNkZWZpbmUgR0VORVRfREVGQVVMVF9CRF9DTlQJXAotCShUT1RBTF9ERVNDIC0gcHJpdi0+aHdfcGFyYW1zLT50eF9xdWV1ZXMgKiBwcml2LT5od19wYXJhbXMtPmJkc19jbnQpCisjZGVmaW5lIEdFTkVUX1ExNl9SWF9CRF9DTlQJXAorCShUT1RBTF9ERVNDIC0gcHJpdi0+aHdfcGFyYW1zLT5yeF9xdWV1ZXMgKiBwcml2LT5od19wYXJhbXMtPnJ4X2Jkc19wZXJfcSkKKyNkZWZpbmUgR0VORVRfUTE2X1RYX0JEX0NOVAlcCisJKFRPVEFMX0RFU0MgLSBwcml2LT5od19wYXJhbXMtPnR4X3F1ZXVlcyAqIHByaXYtPmh3X3BhcmFtcy0+dHhfYmRzX3Blcl9xKQogCiAjZGVmaW5lIFJYX0JVRl9MRU5HVEgJCTIwNDgKICNkZWZpbmUgU0tCX0FMSUdOTUVOVAkJMzIKQEAgLTE5NSw2ICsxOTcsMTQgQEAKIAlETUFfUFJJT1JJVFlfMCwKIAlETUFfUFJJT1JJVFlfMSwKIAlETUFfUFJJT1JJVFlfMiwKKwlETUFfSU5ERVgyUklOR18wLAorCURNQV9JTkRFWDJSSU5HXzEsCisJRE1BX0lOREVYMlJJTkdfMiwKKwlETUFfSU5ERVgyUklOR18zLAorCURNQV9JTkRFWDJSSU5HXzQsCisJRE1BX0lOREVYMlJJTkdfNSwKKwlETUFfSU5ERVgyUklOR182LAorCURNQV9JTkRFWDJSSU5HXzcsCiB9OwogCiBzdGF0aWMgY29uc3QgdTggYmNtZ2VuZXRfZG1hX3JlZ3NfdjNwbHVzW10gPSB7CkBAIC0yMDYsNiArMjE2LDE0IEBACiAJW0RNQV9QUklPUklUWV8wXQk9IDB4MzAsCiAJW0RNQV9QUklPUklUWV8xXQk9IDB4MzQsCiAJW0RNQV9QUklPUklUWV8yXQk9IDB4MzgsCisJW0RNQV9JTkRFWDJSSU5HXzBdCT0gMHg3MCwKKwlbRE1BX0lOREVYMlJJTkdfMV0JPSAweDc0LAorCVtETUFfSU5ERVgyUklOR18yXQk9IDB4NzgsCisJW0RNQV9JTkRFWDJSSU5HXzNdCT0gMHg3QywKKwlbRE1BX0lOREVYMlJJTkdfNF0JPSAweDgwLAorCVtETUFfSU5ERVgyUklOR181XQk9IDB4ODQsCisJW0RNQV9JTkRFWDJSSU5HXzZdCT0gMHg4OCwKKwlbRE1BX0lOREVYMlJJTkdfN10JPSAweDhDLAogfTsKIAogc3RhdGljIGNvbnN0IHU4IGJjbWdlbmV0X2RtYV9yZWdzX3YyW10gPSB7CkBAIC04MjksOSArODQ3LDEwIEBACiB9OwogCiAvKiBQb3dlciBkb3duIHRoZSB1bmltYWMsIGJhc2VkIG9uIG1vZGUuICovCi1zdGF0aWMgdm9pZCBiY21nZW5ldF9wb3dlcl9kb3duKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAorc3RhdGljIGludCBiY21nZW5ldF9wb3dlcl9kb3duKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAogCQkJCWVudW0gYmNtZ2VuZXRfcG93ZXJfbW9kZSBtb2RlKQogeworCWludCByZXQgPSAwOwogCXUzMiByZWc7CiAKIAlzd2l0Y2ggKG1vZGUpIHsKQEAgLTg0MCw3ICs4NTksNyBAQAogCQlicmVhazsKIAogCWNhc2UgR0VORVRfUE9XRVJfV09MX01BR0lDOgotCQliY21nZW5ldF93b2xfcG93ZXJfZG93bl9jZmcocHJpdiwgbW9kZSk7CisJCXJldCA9IGJjbWdlbmV0X3dvbF9wb3dlcl9kb3duX2NmZyhwcml2LCBtb2RlKTsKIAkJYnJlYWs7CiAKIAljYXNlIEdFTkVUX1BPV0VSX1BBU1NJVkU6CkBAIC04NTAsMTEgKzg2OSwxNSBAQAogCQkJcmVnIHw9IChFWFRfUFdSX0RPV05fUEhZIHwKIAkJCQlFWFRfUFdSX0RPV05fRExMIHwgRVhUX1BXUl9ET1dOX0JJQVMpOwogCQkJYmNtZ2VuZXRfZXh0X3dyaXRlbChwcml2LCByZWcsIEVYVF9FWFRfUFdSX01HTVQpOworCisJCQliY21nZW5ldF9waHlfcG93ZXJfc2V0KHByaXYtPmRldiwgZmFsc2UpOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBiY21nZW5ldF9wb3dlcl91cChzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiwKQEAgLTkyMyw3ICs5NDYsNyBAQAogCiAJdHhfY2JfcHRyID0gcmluZy0+Y2JzOwogCXR4X2NiX3B0ciArPSByaW5nLT53cml0ZV9wdHIgLSByaW5nLT5jYl9wdHI7Ci0JdHhfY2JfcHRyLT5iZF9hZGRyID0gcHJpdi0+dHhfYmRzICsgcmluZy0+d3JpdGVfcHRyICogRE1BX0RFU0NfU0laRTsKKwogCS8qIEFkdmFuY2luZyBsb2NhbCB3cml0ZSBwb2ludGVyICovCiAJaWYgKHJpbmctPndyaXRlX3B0ciA9PSByaW5nLT5lbmRfcHRyKQogCQlyaW5nLT53cml0ZV9wdHIgPSByaW5nLT5jYl9wdHI7CkBAIC05NDEsMzYgKzk2NCw1NCBAQAogCWRtYV91bm1hcF9hZGRyX3NldChjYiwgZG1hX2FkZHIsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYmNtZ2VuZXRfdHhfcmluZzE2X2ludF9kaXNhYmxlKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAotCQkJCQkJICBzdHJ1Y3QgYmNtZ2VuZXRfdHhfcmluZyAqcmluZykKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21nZW5ldF9yeF9yaW5nMTZfaW50X2Rpc2FibGUoc3RydWN0IGJjbWdlbmV0X3J4X3JpbmcgKnJpbmcpCiB7Ci0JYmNtZ2VuZXRfaW50cmwyXzBfd3JpdGVsKHByaXYsCi0JCQkJIFVNQUNfSVJRX1RYRE1BX0JET05FIHwgVU1BQ19JUlFfVFhETUFfUERPTkUsCisJYmNtZ2VuZXRfaW50cmwyXzBfd3JpdGVsKHJpbmctPnByaXYsIFVNQUNfSVJRX1JYRE1BX0RPTkUsCiAJCQkJIElOVFJMMl9DUFVfTUFTS19TRVQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYmNtZ2VuZXRfdHhfcmluZzE2X2ludF9lbmFibGUoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsCi0JCQkJCQkgc3RydWN0IGJjbWdlbmV0X3R4X3JpbmcgKnJpbmcpCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtZ2VuZXRfcnhfcmluZzE2X2ludF9lbmFibGUoc3RydWN0IGJjbWdlbmV0X3J4X3JpbmcgKnJpbmcpCiB7Ci0JYmNtZ2VuZXRfaW50cmwyXzBfd3JpdGVsKHByaXYsCi0JCQkJIFVNQUNfSVJRX1RYRE1BX0JET05FIHwgVU1BQ19JUlFfVFhETUFfUERPTkUsCisJYmNtZ2VuZXRfaW50cmwyXzBfd3JpdGVsKHJpbmctPnByaXYsIFVNQUNfSVJRX1JYRE1BX0RPTkUsCiAJCQkJIElOVFJMMl9DUFVfTUFTS19DTEVBUik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBiY21nZW5ldF90eF9yaW5nX2ludF9lbmFibGUoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsCi0JCQkJCSAgICAgICBzdHJ1Y3QgYmNtZ2VuZXRfdHhfcmluZyAqcmluZykKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21nZW5ldF9yeF9yaW5nX2ludF9kaXNhYmxlKHN0cnVjdCBiY21nZW5ldF9yeF9yaW5nICpyaW5nKQogewotCWJjbWdlbmV0X2ludHJsMl8xX3dyaXRlbChwcml2LCAoMSA8PCByaW5nLT5pbmRleCksCi0JCQkJIElOVFJMMl9DUFVfTUFTS19DTEVBUik7Ci0JcHJpdi0+aW50MV9tYXNrICY9IH4oMSA8PCByaW5nLT5pbmRleCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiY21nZW5ldF90eF9yaW5nX2ludF9kaXNhYmxlKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAotCQkJCQkJc3RydWN0IGJjbWdlbmV0X3R4X3JpbmcgKnJpbmcpCi17Ci0JYmNtZ2VuZXRfaW50cmwyXzFfd3JpdGVsKHByaXYsICgxIDw8IHJpbmctPmluZGV4KSwKKwliY21nZW5ldF9pbnRybDJfMV93cml0ZWwocmluZy0+cHJpdiwKKwkJCQkgMSA8PCAoVU1BQ19JUlExX1JYX0lOVFJfU0hJRlQgKyByaW5nLT5pbmRleCksCiAJCQkJIElOVFJMMl9DUFVfTUFTS19TRVQpOwotCXByaXYtPmludDFfbWFzayB8PSAoMSA8PCByaW5nLT5pbmRleCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21nZW5ldF9yeF9yaW5nX2ludF9lbmFibGUoc3RydWN0IGJjbWdlbmV0X3J4X3JpbmcgKnJpbmcpCit7CisJYmNtZ2VuZXRfaW50cmwyXzFfd3JpdGVsKHJpbmctPnByaXYsCisJCQkJIDEgPDwgKFVNQUNfSVJRMV9SWF9JTlRSX1NISUZUICsgcmluZy0+aW5kZXgpLAorCQkJCSBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtZ2VuZXRfdHhfcmluZzE2X2ludF9kaXNhYmxlKHN0cnVjdCBiY21nZW5ldF90eF9yaW5nICpyaW5nKQoreworCWJjbWdlbmV0X2ludHJsMl8wX3dyaXRlbChyaW5nLT5wcml2LCBVTUFDX0lSUV9UWERNQV9ET05FLAorCQkJCSBJTlRSTDJfQ1BVX01BU0tfU0VUKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjbWdlbmV0X3R4X3JpbmcxNl9pbnRfZW5hYmxlKHN0cnVjdCBiY21nZW5ldF90eF9yaW5nICpyaW5nKQoreworCWJjbWdlbmV0X2ludHJsMl8wX3dyaXRlbChyaW5nLT5wcml2LCBVTUFDX0lSUV9UWERNQV9ET05FLAorCQkJCSBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtZ2VuZXRfdHhfcmluZ19pbnRfZW5hYmxlKHN0cnVjdCBiY21nZW5ldF90eF9yaW5nICpyaW5nKQoreworCWJjbWdlbmV0X2ludHJsMl8xX3dyaXRlbChyaW5nLT5wcml2LCAxIDw8IHJpbmctPmluZGV4LAorCQkJCSBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtZ2VuZXRfdHhfcmluZ19pbnRfZGlzYWJsZShzdHJ1Y3QgYmNtZ2VuZXRfdHhfcmluZyAqcmluZykKK3sKKwliY21nZW5ldF9pbnRybDJfMV93cml0ZWwocmluZy0+cHJpdiwgMSA8PCByaW5nLT5pbmRleCwKKwkJCQkgSU5UUkwyX0NQVV9NQVNLX1NFVCk7CiB9CiAKIC8qIFVubG9ja2VkIHZlcnNpb24gb2YgdGhlIHJlY2xhaW0gcm91dGluZSAqLwpAQCAtOTc4LDM5ICsxMDE5LDMyIEBACiAJCQkJCSAgc3RydWN0IGJjbWdlbmV0X3R4X3JpbmcgKnJpbmcpCiB7CiAJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBsYXN0X3R4X2NuLCBsYXN0X2NfaW5kZXgsIG51bV90eF9iZHM7CiAJc3RydWN0IGVuZXRfY2IgKnR4X2NiX3B0cjsKIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHE7CiAJdW5zaWduZWQgaW50IHBrdHNfY29tcGwgPSAwOwotCXVuc2lnbmVkIGludCBiZHNfY29tcGw7CiAJdW5zaWduZWQgaW50IGNfaW5kZXg7CisJdW5zaWduZWQgaW50IHR4YmRzX3JlYWR5OworCXVuc2lnbmVkIGludCB0eGJkc19wcm9jZXNzZWQgPSAwOwogCiAJLyogQ29tcHV0ZSBob3cgbWFueSBidWZmZXJzIGFyZSB0cmFuc21pdHRlZCBzaW5jZSBsYXN0IHhtaXQgY2FsbCAqLwogCWNfaW5kZXggPSBiY21nZW5ldF90ZG1hX3JpbmdfcmVhZGwocHJpdiwgcmluZy0+aW5kZXgsIFRETUFfQ09OU19JTkRFWCk7Ci0JdHhxID0gbmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIHJpbmctPnF1ZXVlKTsKKwljX2luZGV4ICY9IERNQV9DX0lOREVYX01BU0s7CiAKLQlsYXN0X2NfaW5kZXggPSByaW5nLT5jX2luZGV4OwotCW51bV90eF9iZHMgPSByaW5nLT5zaXplOwotCi0JY19pbmRleCAmPSAobnVtX3R4X2JkcyAtIDEpOwotCi0JaWYgKGNfaW5kZXggPj0gbGFzdF9jX2luZGV4KQotCQlsYXN0X3R4X2NuID0gY19pbmRleCAtIGxhc3RfY19pbmRleDsKKwlpZiAobGlrZWx5KGNfaW5kZXggPj0gcmluZy0+Y19pbmRleCkpCisJCXR4YmRzX3JlYWR5ID0gY19pbmRleCAtIHJpbmctPmNfaW5kZXg7CiAJZWxzZQotCQlsYXN0X3R4X2NuID0gbnVtX3R4X2JkcyAtIGxhc3RfY19pbmRleCArIGNfaW5kZXg7CisJCXR4YmRzX3JlYWR5ID0gKERNQV9DX0lOREVYX01BU0sgKyAxKSAtIHJpbmctPmNfaW5kZXggKyBjX2luZGV4OwogCiAJbmV0aWZfZGJnKHByaXYsIHR4X2RvbmUsIGRldiwKLQkJICAiJXMgcmluZz0lZCBpbmRleD0lZCBsYXN0X3R4X2NuPSVkIGxhc3RfaW5kZXg9JWRcbiIsCi0JCSAgX19mdW5jX18sIHJpbmctPmluZGV4LAotCQkgIGNfaW5kZXgsIGxhc3RfdHhfY24sIGxhc3RfY19pbmRleCk7CisJCSAgIiVzIHJpbmc9JWQgb2xkX2NfaW5kZXg9JXUgY19pbmRleD0ldSB0eGJkc19yZWFkeT0ldVxuIiwKKwkJICBfX2Z1bmNfXywgcmluZy0+aW5kZXgsIHJpbmctPmNfaW5kZXgsIGNfaW5kZXgsIHR4YmRzX3JlYWR5KTsKIAogCS8qIFJlY2xhaW0gdHJhbnNtaXR0ZWQgYnVmZmVycyAqLwotCXdoaWxlIChsYXN0X3R4X2NuLS0gPiAwKSB7Ci0JCXR4X2NiX3B0ciA9IHJpbmctPmNicyArIGxhc3RfY19pbmRleDsKLQkJYmRzX2NvbXBsID0gMDsKKwl3aGlsZSAodHhiZHNfcHJvY2Vzc2VkIDwgdHhiZHNfcmVhZHkpIHsKKwkJdHhfY2JfcHRyID0gJnByaXYtPnR4X2Nic1tyaW5nLT5jbGVhbl9wdHJdOwogCQlpZiAodHhfY2JfcHRyLT5za2IpIHsKIAkJCXBrdHNfY29tcGwrKzsKLQkJCWJkc19jb21wbCA9IHNrYl9zaGluZm8odHhfY2JfcHRyLT5za2IpLT5ucl9mcmFncyArIDE7CisJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gdHhfY2JfcHRyLT5za2ItPmxlbjsKIAkJCWRtYV91bm1hcF9zaW5nbGUoJmRldi0+ZGV2LAogCQkJCQkgZG1hX3VubWFwX2FkZHIodHhfY2JfcHRyLCBkbWFfYWRkciksCkBAIC0xMDI2LDIwICsxMDYwLDIzIEBACiAJCQkJICAgICAgIERNQV9UT19ERVZJQ0UpOwogCQkJZG1hX3VubWFwX2FkZHJfc2V0KHR4X2NiX3B0ciwgZG1hX2FkZHIsIDApOwogCQl9Ci0JCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwotCQlyaW5nLT5mcmVlX2JkcyArPSBiZHNfY29tcGw7CiAKLQkJbGFzdF9jX2luZGV4Kys7Ci0JCWxhc3RfY19pbmRleCAmPSAobnVtX3R4X2JkcyAtIDEpOworCQl0eGJkc19wcm9jZXNzZWQrKzsKKwkJaWYgKGxpa2VseShyaW5nLT5jbGVhbl9wdHIgPCByaW5nLT5lbmRfcHRyKSkKKwkJCXJpbmctPmNsZWFuX3B0cisrOworCQllbHNlCisJCQlyaW5nLT5jbGVhbl9wdHIgPSByaW5nLT5jYl9wdHI7CiAJfQogCisJcmluZy0+ZnJlZV9iZHMgKz0gdHhiZHNfcHJvY2Vzc2VkOworCXJpbmctPmNfaW5kZXggPSAocmluZy0+Y19pbmRleCArIHR4YmRzX3Byb2Nlc3NlZCkgJiBETUFfQ19JTkRFWF9NQVNLOworCiAJaWYgKHJpbmctPmZyZWVfYmRzID4gKE1BWF9TS0JfRlJBR1MgKyAxKSkgeworCQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgcmluZy0+cXVldWUpOwogCQlpZiAobmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpKQogCQkJbmV0aWZfdHhfd2FrZV9xdWV1ZSh0eHEpOwogCX0KIAotCXJpbmctPmNfaW5kZXggPSBjX2luZGV4OwotCiAJcmV0dXJuIHBrdHNfY29tcGw7CiB9CiAKQEAgLTEwNjYsNyArMTEwMyw3IEBACiAKIAlpZiAod29ya19kb25lID09IDApIHsKIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKLQkJcmluZy0+aW50X2VuYWJsZShyaW5nLT5wcml2LCByaW5nKTsKKwkJcmluZy0+aW50X2VuYWJsZShyaW5nKTsKIAogCQlyZXR1cm4gMDsKIAl9CkBAIC0xMTMyLDExICsxMTY5LDYgQEAKIAogCWRtYWRlc2Nfc2V0KHByaXYsIHR4X2NiX3B0ci0+YmRfYWRkciwgbWFwcGluZywgbGVuZ3RoX3N0YXR1cyk7CiAKLQkvKiBEZWNyZW1lbnQgdG90YWwgQkQgY291bnQgYW5kIGFkdmFuY2Ugb3VyIHdyaXRlIHBvaW50ZXIgKi8KLQlyaW5nLT5mcmVlX2JkcyAtPSAxOwotCXJpbmctPnByb2RfaW5kZXggKz0gMTsKLQlyaW5nLT5wcm9kX2luZGV4ICY9IERNQV9QX0lOREVYX01BU0s7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE3NSwxMSArMTIwNyw2IEBACiAJCSAgICAoZnJhZy0+c2l6ZSA8PCBETUFfQlVGTEVOR1RIX1NISUZUKSB8IGRtYV9kZXNjX2ZsYWdzIHwKIAkJICAgIChwcml2LT5od19wYXJhbXMtPnF0YWdfbWFzayA8PCBETUFfVFhfUVRBR19TSElGVCkpOwogCi0KLQlyaW5nLT5mcmVlX2JkcyAtPSAxOwotCXJpbmctPnByb2RfaW5kZXggKz0gMTsKLQlyaW5nLT5wcm9kX2luZGV4ICY9IERNQV9QX0lOREVYX01BU0s7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTMyMywxMTkgKzEzNTAsMTI4IEBACiAKIAlza2JfdHhfdGltZXN0YW1wKHNrYik7CiAKLQkvKiB3ZSBrZXB0IGEgc29mdHdhcmUgY29weSBvZiBob3cgbXVjaCB3ZSBzaG91bGQgYWR2YW5jZSB0aGUgVERNQQotCSAqIHByb2R1Y2VyIGluZGV4LCBub3cgd3JpdGUgaXQgZG93biB0byB0aGUgaGFyZHdhcmUKLQkgKi8KLQliY21nZW5ldF90ZG1hX3Jpbmdfd3JpdGVsKHByaXYsIHJpbmctPmluZGV4LAotCQkJCSAgcmluZy0+cHJvZF9pbmRleCwgVERNQV9QUk9EX0lOREVYKTsKKwkvKiBEZWNyZW1lbnQgdG90YWwgQkQgY291bnQgYW5kIGFkdmFuY2Ugb3VyIHdyaXRlIHBvaW50ZXIgKi8KKwlyaW5nLT5mcmVlX2JkcyAtPSBucl9mcmFncyArIDE7CisJcmluZy0+cHJvZF9pbmRleCArPSBucl9mcmFncyArIDE7CisJcmluZy0+cHJvZF9pbmRleCAmPSBETUFfUF9JTkRFWF9NQVNLOwogCiAJaWYgKHJpbmctPmZyZWVfYmRzIDw9IChNQVhfU0tCX0ZSQUdTICsgMSkpCiAJCW5ldGlmX3R4X3N0b3BfcXVldWUodHhxKTsKIAorCWlmICghc2tiLT54bWl0X21vcmUgfHwgbmV0aWZfeG1pdF9zdG9wcGVkKHR4cSkpCisJCS8qIFBhY2tldHMgYXJlIHJlYWR5LCB1cGRhdGUgcHJvZHVjZXIgaW5kZXggKi8KKwkJYmNtZ2VuZXRfdGRtYV9yaW5nX3dyaXRlbChwcml2LCByaW5nLT5pbmRleCwKKwkJCQkJICByaW5nLT5wcm9kX2luZGV4LCBURE1BX1BST0RfSU5ERVgpOwogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJpbmctPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLQotc3RhdGljIGludCBiY21nZW5ldF9yeF9yZWZpbGwoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsIHN0cnVjdCBlbmV0X2NiICpjYikKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYmNtZ2VuZXRfcnhfcmVmaWxsKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAorCQkJCQkgIHN0cnVjdCBlbmV0X2NiICpjYikKIHsKIAlzdHJ1Y3QgZGV2aWNlICprZGV2ID0gJnByaXYtPnBkZXYtPmRldjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBza19idWZmICpyeF9za2I7CiAJZG1hX2FkZHJfdCBtYXBwaW5nOwotCWludCByZXQ7CiAKKwkvKiBBbGxvY2F0ZSBhIG5ldyBSeCBza2IgKi8KIAlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHByaXYtPmRldiwgcHJpdi0+cnhfYnVmX2xlbiArIFNLQl9BTElHTk1FTlQpOwotCWlmICghc2tiKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIGEgY2FsbGVyIGRpZCBub3QgcmVsZWFzZSB0aGlzIGNvbnRyb2wgYmxvY2sgKi8KLQlXQVJOX09OKGNiLT5za2IgIT0gTlVMTCk7Ci0JY2ItPnNrYiA9IHNrYjsKLQltYXBwaW5nID0gZG1hX21hcF9zaW5nbGUoa2Rldiwgc2tiLT5kYXRhLAotCQkJCSBwcml2LT5yeF9idWZfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwotCXJldCA9IGRtYV9tYXBwaW5nX2Vycm9yKGtkZXYsIG1hcHBpbmcpOwotCWlmIChyZXQpIHsKLQkJcHJpdi0+bWliLnJ4X2RtYV9mYWlsZWQrKzsKLQkJYmNtZ2VuZXRfZnJlZV9jYihjYik7CisJaWYgKCFza2IpIHsKKwkJcHJpdi0+bWliLmFsbG9jX3J4X2J1ZmZfZmFpbGVkKys7CiAJCW5ldGlmX2Vycihwcml2LCByeF9lcnIsIHByaXYtPmRldiwKLQkJCSAgIiVzIERNQSBtYXAgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiByZXQ7CisJCQkgICIlczogUnggc2tiIGFsbG9jYXRpb24gZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOwogCX0KIAorCS8qIERNQS1tYXAgdGhlIG5ldyBSeCBza2IgKi8KKwltYXBwaW5nID0gZG1hX21hcF9zaW5nbGUoa2Rldiwgc2tiLT5kYXRhLCBwcml2LT5yeF9idWZfbGVuLAorCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihrZGV2LCBtYXBwaW5nKSkgeworCQlwcml2LT5taWIucnhfZG1hX2ZhaWxlZCsrOworCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQluZXRpZl9lcnIocHJpdiwgcnhfZXJyLCBwcml2LT5kZXYsCisJCQkgICIlczogUnggc2tiIERNQSBtYXBwaW5nIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBHcmFiIHRoZSBjdXJyZW50IFJ4IHNrYiBmcm9tIHRoZSByaW5nIGFuZCBETUEtdW5tYXAgaXQgKi8KKwlyeF9za2IgPSBjYi0+c2tiOworCWlmIChsaWtlbHkocnhfc2tiKSkKKwkJZG1hX3VubWFwX3NpbmdsZShrZGV2LCBkbWFfdW5tYXBfYWRkcihjYiwgZG1hX2FkZHIpLAorCQkJCSBwcml2LT5yeF9idWZfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOworCisJLyogUHV0IHRoZSBuZXcgUnggc2tiIG9uIHRoZSByaW5nICovCisJY2ItPnNrYiA9IHNrYjsKIAlkbWFfdW5tYXBfYWRkcl9zZXQoY2IsIGRtYV9hZGRyLCBtYXBwaW5nKTsKLQkvKiBhc3NpZ24gcGFja2V0LCBwcmVwYXJlIGRlc2NyaXB0b3IsIGFuZCBhZHZhbmNlIHBvaW50ZXIgKi8KKwlkbWFkZXNjX3NldF9hZGRyKHByaXYsIGNiLT5iZF9hZGRyLCBtYXBwaW5nKTsKIAotCWRtYWRlc2Nfc2V0X2FkZHIocHJpdiwgcHJpdi0+cnhfYmRfYXNzaWduX3B0ciwgbWFwcGluZyk7Ci0KLQkvKiB0dXJuIG9uIHRoZSBuZXdseSBhc3NpZ25lZCBCRCBmb3IgRE1BIHRvIHVzZSAqLwotCXByaXYtPnJ4X2JkX2Fzc2lnbl9pbmRleCsrOwotCXByaXYtPnJ4X2JkX2Fzc2lnbl9pbmRleCAmPSAocHJpdi0+bnVtX3J4X2JkcyAtIDEpOwotCi0JcHJpdi0+cnhfYmRfYXNzaWduX3B0ciA9IHByaXYtPnJ4X2JkcyArCi0JCShwcml2LT5yeF9iZF9hc3NpZ25faW5kZXggKiBETUFfREVTQ19TSVpFKTsKLQotCXJldHVybiAwOworCS8qIFJldHVybiB0aGUgY3VycmVudCBSeCBza2IgdG8gY2FsbGVyICovCisJcmV0dXJuIHJ4X3NrYjsKIH0KIAogLyogYmNtZ2VuZXRfZGVzY19yeCAtIGRlc2NyaXB0b3IgYmFzZWQgcnggcHJvY2Vzcy4KICAqIHRoaXMgY291bGQgYmUgY2FsbGVkIGZyb20gYm90dG9tIGhhbGYsIG9yIGZyb20gTkFQSSBwb2xsaW5nIG1ldGhvZC4KICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBiY21nZW5ldF9kZXNjX3J4KHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAorc3RhdGljIHVuc2lnbmVkIGludCBiY21nZW5ldF9kZXNjX3J4KHN0cnVjdCBiY21nZW5ldF9yeF9yaW5nICpyaW5nLAogCQkJCSAgICAgdW5zaWduZWQgaW50IGJ1ZGdldCkKIHsKKwlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiA9IHJpbmctPnByaXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHByaXYtPmRldjsKIAlzdHJ1Y3QgZW5ldF9jYiAqY2I7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1MzIgZG1hX2xlbmd0aF9zdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBkbWFfZmxhZzsKLQlpbnQgbGVuLCBlcnI7CisJaW50IGxlbjsKIAl1bnNpZ25lZCBpbnQgcnhwa3Rwcm9jZXNzZWQgPSAwLCByeHBrdHRvcHJvY2VzczsKIAl1bnNpZ25lZCBpbnQgcF9pbmRleDsKKwl1bnNpZ25lZCBpbnQgZGlzY2FyZHM7CiAJdW5zaWduZWQgaW50IGNoa3N1bV9vayA9IDA7CiAKLQlwX2luZGV4ID0gYmNtZ2VuZXRfcmRtYV9yaW5nX3JlYWRsKHByaXYsIERFU0NfSU5ERVgsIFJETUFfUFJPRF9JTkRFWCk7CisJcF9pbmRleCA9IGJjbWdlbmV0X3JkbWFfcmluZ19yZWFkbChwcml2LCByaW5nLT5pbmRleCwgUkRNQV9QUk9EX0lOREVYKTsKKworCWRpc2NhcmRzID0gKHBfaW5kZXggPj4gRE1BX1BfSU5ERVhfRElTQ0FSRF9DTlRfU0hJRlQpICYKKwkJICAgRE1BX1BfSU5ERVhfRElTQ0FSRF9DTlRfTUFTSzsKKwlpZiAoZGlzY2FyZHMgPiByaW5nLT5vbGRfZGlzY2FyZHMpIHsKKwkJZGlzY2FyZHMgPSBkaXNjYXJkcyAtIHJpbmctPm9sZF9kaXNjYXJkczsKKwkJZGV2LT5zdGF0cy5yeF9taXNzZWRfZXJyb3JzICs9IGRpc2NhcmRzOworCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycyArPSBkaXNjYXJkczsKKwkJcmluZy0+b2xkX2Rpc2NhcmRzICs9IGRpc2NhcmRzOworCisJCS8qIENsZWFyIEhXIHJlZ2lzdGVyIHdoZW4gd2UgcmVhY2ggNzUlIG9mIG1heGltdW0gMHhGRkZGICovCisJCWlmIChyaW5nLT5vbGRfZGlzY2FyZHMgPj0gMHhDMDAwKSB7CisJCQlyaW5nLT5vbGRfZGlzY2FyZHMgPSAwOworCQkJYmNtZ2VuZXRfcmRtYV9yaW5nX3dyaXRlbChwcml2LCByaW5nLT5pbmRleCwgMCwKKwkJCQkJCSAgUkRNQV9QUk9EX0lOREVYKTsKKwkJfQorCX0KKwogCXBfaW5kZXggJj0gRE1BX1BfSU5ERVhfTUFTSzsKIAotCWlmIChwX2luZGV4IDwgcHJpdi0+cnhfY19pbmRleCkKLQkJcnhwa3R0b3Byb2Nlc3MgPSAoRE1BX0NfSU5ERVhfTUFTSyArIDEpIC0KLQkJCXByaXYtPnJ4X2NfaW5kZXggKyBwX2luZGV4OworCWlmIChsaWtlbHkocF9pbmRleCA+PSByaW5nLT5jX2luZGV4KSkKKwkJcnhwa3R0b3Byb2Nlc3MgPSBwX2luZGV4IC0gcmluZy0+Y19pbmRleDsKIAllbHNlCi0JCXJ4cGt0dG9wcm9jZXNzID0gcF9pbmRleCAtIHByaXYtPnJ4X2NfaW5kZXg7CisJCXJ4cGt0dG9wcm9jZXNzID0gKERNQV9DX0lOREVYX01BU0sgKyAxKSAtIHJpbmctPmNfaW5kZXggKworCQkJCSBwX2luZGV4OwogCiAJbmV0aWZfZGJnKHByaXYsIHJ4X3N0YXR1cywgZGV2LAogCQkgICJSRE1BOiByeHBrdHRvcHJvY2Vzcz0lZFxuIiwgcnhwa3R0b3Byb2Nlc3MpOwogCiAJd2hpbGUgKChyeHBrdHByb2Nlc3NlZCA8IHJ4cGt0dG9wcm9jZXNzKSAmJgogCSAgICAgICAocnhwa3Rwcm9jZXNzZWQgPCBidWRnZXQpKSB7Ci0JCWNiID0gJnByaXYtPnJ4X2Nic1twcml2LT5yeF9yZWFkX3B0cl07Ci0JCXNrYiA9IGNiLT5za2I7CisJCWNiID0gJnByaXYtPnJ4X2Nic1tyaW5nLT5yZWFkX3B0cl07CisJCXNrYiA9IGJjbWdlbmV0X3J4X3JlZmlsbChwcml2LCBjYik7CiAKLQkJLyogV2UgZG8gbm90IGhhdmUgYSBiYWNraW5nIFNLQiwgc28gd2UgZG8gbm90IGhhdmUgYQotCQkgKiBjb3JyZXNwb25kaW5nIERNQSBtYXBwaW5nIGZvciB0aGlzIGluY29taW5nIHBhY2tldCBzaW5jZQotCQkgKiBiY21nZW5ldF9yeF9yZWZpbGwgYWx3YXlzIGVpdGhlciBoYXMgYm90aCBza2IgYW5kIG1hcHBpbmcgb3IKLQkJICogbm9uZS4KLQkJICovCiAJCWlmICh1bmxpa2VseSghc2tiKSkgewogCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJZ290byByZWZpbGw7CisJCQlnb3RvIG5leHQ7CiAJCX0KIAotCQkvKiBVbm1hcCB0aGUgcGFja2V0IGNvbnRlbnRzIHN1Y2ggdGhhdCB3ZSBjYW4gdXNlIHRoZQotCQkgKiBSU1YgZnJvbSB0aGUgNjQgYnl0ZXMgZGVzY3JpcHRvciB3aGVuIGVuYWJsZWQgYW5kIHNhdmUKLQkJICogYSAzMi1iaXRzIHJlZ2lzdGVyIHJlYWQKLQkJICovCi0JCWRtYV91bm1hcF9zaW5nbGUoJmRldi0+ZGV2LCBkbWFfdW5tYXBfYWRkcihjYiwgZG1hX2FkZHIpLAotCQkJCSBwcml2LT5yeF9idWZfbGVuLCBETUFfRlJPTV9ERVZJQ0UpOwotCiAJCWlmICghcHJpdi0+ZGVzY182NGJfZW4pIHsKIAkJCWRtYV9sZW5ndGhfc3RhdHVzID0KLQkJCQlkbWFkZXNjX2dldF9sZW5ndGhfc3RhdHVzKHByaXYsCi0JCQkJCQkJICBwcml2LT5yeF9iZHMgKwotCQkJCQkJCSAgKHByaXYtPnJ4X3JlYWRfcHRyICoKLQkJCQkJCQkgICBETUFfREVTQ19TSVpFKSk7CisJCQkJZG1hZGVzY19nZXRfbGVuZ3RoX3N0YXR1cyhwcml2LCBjYi0+YmRfYWRkcik7CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3Qgc3RhdHVzXzY0ICpzdGF0dXM7CiAKQEAgLTE0NTEsMTggKzE0ODcsMTggQEAKIAogCQluZXRpZl9kYmcocHJpdiwgcnhfc3RhdHVzLCBkZXYsCiAJCQkgICIlczpwX2luZD0lZCBjX2luZD0lZCByZWFkX3B0cj0lZCBsZW5fc3RhdD0weCUwOHhcbiIsCi0JCQkgIF9fZnVuY19fLCBwX2luZGV4LCBwcml2LT5yeF9jX2luZGV4LAotCQkJICBwcml2LT5yeF9yZWFkX3B0ciwgZG1hX2xlbmd0aF9zdGF0dXMpOworCQkJICBfX2Z1bmNfXywgcF9pbmRleCwgcmluZy0+Y19pbmRleCwKKwkJCSAgcmluZy0+cmVhZF9wdHIsIGRtYV9sZW5ndGhfc3RhdHVzKTsKIAogCQlpZiAodW5saWtlbHkoIShkbWFfZmxhZyAmIERNQV9FT1ApIHx8ICEoZG1hX2ZsYWcgJiBETUFfU09QKSkpIHsKIAkJCW5ldGlmX2Vycihwcml2LCByeF9zdGF0dXMsIGRldiwKIAkJCQkgICJkcm9wcGluZyBmcmFnbWVudGVkIHBhY2tldCFcbiIpOwogCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJZGV2X2tmcmVlX3NrYl9hbnkoY2ItPnNrYik7Ci0JCQljYi0+c2tiID0gTlVMTDsKLQkJCWdvdG8gcmVmaWxsOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCWdvdG8gbmV4dDsKIAkJfQorCiAJCS8qIHJlcG9ydCBlcnJvcnMgKi8KIAkJaWYgKHVubGlrZWx5KGRtYV9mbGFnICYgKERNQV9SWF9DUkNfRVJST1IgfAogCQkJCQkJRE1BX1JYX09WIHwKQEAgLTE0ODEsMTEgKzE1MTcsOCBAQAogCQkJCWRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCQkJZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQlkZXYtPnN0YXRzLnJ4X2Vycm9ycysrOwotCi0JCQkvKiBkaXNjYXJkIHRoZSBwYWNrZXQgYW5kIGFkdmFuY2UgY29uc3VtZXIgaW5kZXguKi8KLQkJCWRldl9rZnJlZV9za2JfYW55KGNiLT5za2IpOwotCQkJY2ItPnNrYiA9IE5VTEw7Ci0JCQlnb3RvIHJlZmlsbDsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlnb3RvIG5leHQ7CiAJCX0gLyogZXJyb3IgcGFja2V0ICovCiAKIAkJY2hrc3VtX29rID0gKGRtYV9mbGFnICYgcHJpdi0+ZG1hX3J4X2Noa19iaXQpICYmCkBAIC0xNTE3LDQ3ICsxNTUwLDYxIEBACiAJCQlkZXYtPnN0YXRzLm11bHRpY2FzdCsrOwogCiAJCS8qIE5vdGlmeSBrZXJuZWwgKi8KLQkJbmFwaV9ncm9fcmVjZWl2ZSgmcHJpdi0+bmFwaSwgc2tiKTsKLQkJY2ItPnNrYiA9IE5VTEw7CisJCW5hcGlfZ3JvX3JlY2VpdmUoJnJpbmctPm5hcGksIHNrYik7CiAJCW5ldGlmX2RiZyhwcml2LCByeF9zdGF0dXMsIGRldiwgInB1c2hlZCB1cCB0byBrZXJuZWxcbiIpOwogCi0JCS8qIHJlZmlsbCBSWCBwYXRoIG9uIHRoZSBjdXJyZW50IGNvbnRyb2wgYmxvY2sgKi8KLXJlZmlsbDoKLQkJZXJyID0gYmNtZ2VuZXRfcnhfcmVmaWxsKHByaXYsIGNiKTsKLQkJaWYgKGVycikgewotCQkJcHJpdi0+bWliLmFsbG9jX3J4X2J1ZmZfZmFpbGVkKys7Ci0JCQluZXRpZl9lcnIocHJpdiwgcnhfZXJyLCBkZXYsICJSeCByZWZpbGwgZmFpbGVkXG4iKTsKLQkJfQotCituZXh0OgogCQlyeHBrdHByb2Nlc3NlZCsrOwotCQlwcml2LT5yeF9yZWFkX3B0cisrOwotCQlwcml2LT5yeF9yZWFkX3B0ciAmPSAocHJpdi0+bnVtX3J4X2JkcyAtIDEpOworCQlpZiAobGlrZWx5KHJpbmctPnJlYWRfcHRyIDwgcmluZy0+ZW5kX3B0cikpCisJCQlyaW5nLT5yZWFkX3B0cisrOworCQllbHNlCisJCQlyaW5nLT5yZWFkX3B0ciA9IHJpbmctPmNiX3B0cjsKKworCQlyaW5nLT5jX2luZGV4ID0gKHJpbmctPmNfaW5kZXggKyAxKSAmIERNQV9DX0lOREVYX01BU0s7CisJCWJjbWdlbmV0X3JkbWFfcmluZ193cml0ZWwocHJpdiwgcmluZy0+aW5kZXgsIHJpbmctPmNfaW5kZXgsIFJETUFfQ09OU19JTkRFWCk7CiAJfQogCiAJcmV0dXJuIHJ4cGt0cHJvY2Vzc2VkOwogfQogCi0vKiBBc3NpZ24gc2tiIHRvIFJYIERNQSBkZXNjcmlwdG9yLiAqLwotc3RhdGljIGludCBiY21nZW5ldF9hbGxvY19yeF9idWZmZXJzKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2KQorLyogUnggTkFQSSBwb2xsaW5nIG1ldGhvZCAqLworc3RhdGljIGludCBiY21nZW5ldF9yeF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKIHsKLQlzdHJ1Y3QgZW5ldF9jYiAqY2I7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGk7CisJc3RydWN0IGJjbWdlbmV0X3J4X3JpbmcgKnJpbmcgPSBjb250YWluZXJfb2YobmFwaSwKKwkJCXN0cnVjdCBiY21nZW5ldF9yeF9yaW5nLCBuYXBpKTsKKwl1bnNpZ25lZCBpbnQgd29ya19kb25lOwogCi0JbmV0aWZfZGJnKHByaXYsIGh3LCBwcml2LT5kZXYsICIlczpcbiIsIF9fZnVuY19fKTsKKwl3b3JrX2RvbmUgPSBiY21nZW5ldF9kZXNjX3J4KHJpbmcsIGJ1ZGdldCk7CiAKLQkvKiBsb29wIGhlcmUgZm9yIGVhY2ggYnVmZmVyIG5lZWRpbmcgYXNzaWduICovCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPm51bV9yeF9iZHM7IGkrKykgewotCQljYiA9ICZwcml2LT5yeF9jYnNbcHJpdi0+cnhfYmRfYXNzaWduX2luZGV4XTsKLQkJaWYgKGNiLT5za2IpCi0JCQljb250aW51ZTsKLQotCQlyZXQgPSBiY21nZW5ldF9yeF9yZWZpbGwocHJpdiwgY2IpOwotCQlpZiAocmV0KQotCQkJYnJlYWs7CisJaWYgKHdvcmtfZG9uZSA8IGJ1ZGdldCkgeworCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCQlyaW5nLT5pbnRfZW5hYmxlKHJpbmcpOwogCX0KIAotCXJldHVybiByZXQ7CisJcmV0dXJuIHdvcmtfZG9uZTsKK30KKworLyogQXNzaWduIHNrYiB0byBSWCBETUEgZGVzY3JpcHRvci4gKi8KK3N0YXRpYyBpbnQgYmNtZ2VuZXRfYWxsb2NfcnhfYnVmZmVycyhzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiwKKwkJCQkgICAgIHN0cnVjdCBiY21nZW5ldF9yeF9yaW5nICpyaW5nKQoreworCXN0cnVjdCBlbmV0X2NiICpjYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBpOworCisJbmV0aWZfZGJnKHByaXYsIGh3LCBwcml2LT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJLyogbG9vcCBoZXJlIGZvciBlYWNoIGJ1ZmZlciBuZWVkaW5nIGFzc2lnbiAqLworCWZvciAoaSA9IDA7IGkgPCByaW5nLT5zaXplOyBpKyspIHsKKwkJY2IgPSByaW5nLT5jYnMgKyBpOworCQlza2IgPSBiY21nZW5ldF9yeF9yZWZpbGwocHJpdiwgY2IpOworCQlpZiAoc2tiKQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJaWYgKCFjYi0+c2tiKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGJjbWdlbmV0X2ZyZWVfcnhfYnVmZmVycyhzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdikKQEAgLTE2NDUsOCArMTY5MiwxMCBAQAogewogCXN0cnVjdCBkZXZpY2UgKmtkZXYgPSAmcHJpdi0+cGRldi0+ZGV2OwogCWludCByZXQ7Ci0JdTMyIHJlZywgY3B1X21hc2tfY2xlYXI7Ci0JaW50IGluZGV4OworCXUzMiByZWc7CisJdTMyIGludDBfZW5hYmxlID0gMDsKKwl1MzIgaW50MV9lbmFibGUgPSAwOworCWludCBpOwogCiAJZGV2X2RiZygmcHJpdi0+cGRldi0+ZGV2LCAiYmNtZ2VuZXQ6IGluaXRfdW1hY1xuIik7CiAKQEAgLTE2NzMsMTYgKzE3MjIsMjEgQEAKIAogCWJjbWdlbmV0X2ludHJfZGlzYWJsZShwcml2KTsKIAotCWNwdV9tYXNrX2NsZWFyID0gVU1BQ19JUlFfUlhETUFfQkRPTkUgfCBVTUFDX0lSUV9UWERNQV9CRE9ORTsKKwkvKiBFbmFibGUgUnggZGVmYXVsdCBxdWV1ZSAxNiBpbnRlcnJ1cHRzICovCisJaW50MF9lbmFibGUgfD0gVU1BQ19JUlFfUlhETUFfRE9ORTsKIAotCWRldl9kYmcoa2RldiwgIiVzOkVuYWJsaW5nIFJYRE1BX0JET05FIGludGVycnVwdFxuIiwgX19mdW5jX18pOworCS8qIEVuYWJsZSBUeCBkZWZhdWx0IHF1ZXVlIDE2IGludGVycnVwdHMgKi8KKwlpbnQwX2VuYWJsZSB8PSBVTUFDX0lSUV9UWERNQV9ET05FOwogCiAJLyogTW9uaXRvciBjYWJsZSBwbHVnL3VucGx1Z2dlZCBldmVudCBmb3IgaW50ZXJuYWwgUEhZICovCiAJaWYgKHBoeV9pc19pbnRlcm5hbChwcml2LT5waHlkZXYpKSB7Ci0JCWNwdV9tYXNrX2NsZWFyIHw9IChVTUFDX0lSUV9MSU5LX0RPV04gfCBVTUFDX0lSUV9MSU5LX1VQKTsKKwkJaW50MF9lbmFibGUgfD0gVU1BQ19JUlFfTElOS19FVkVOVDsKIAl9IGVsc2UgaWYgKHByaXYtPmV4dF9waHkpIHsKLQkJY3B1X21hc2tfY2xlYXIgfD0gKFVNQUNfSVJRX0xJTktfRE9XTiB8IFVNQUNfSVJRX0xJTktfVVApOworCQlpbnQwX2VuYWJsZSB8PSBVTUFDX0lSUV9MSU5LX0VWRU5UOwogCX0gZWxzZSBpZiAocHJpdi0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfTU9DQSkgeworCQlpZiAocHJpdi0+aHdfcGFyYW1zLT5mbGFncyAmIEdFTkVUX0hBU19NT0NBX0xJTktfREVUKQorCQkJaW50MF9lbmFibGUgfD0gVU1BQ19JUlFfTElOS19FVkVOVDsKKwogCQlyZWcgPSBiY21nZW5ldF9icF9tY19nZXQocHJpdik7CiAJCXJlZyB8PSBCSVQocHJpdi0+aHdfcGFyYW1zLT5icF9pbl9lbl9zaGlmdCk7CiAKQEAgLTE2OTYsMTMgKzE3NTAsMTggQEAKIAogCS8qIEVuYWJsZSBNRElPIGludGVycnVwdHMgb24gR0VORVQgdjMrICovCiAJaWYgKHByaXYtPmh3X3BhcmFtcy0+ZmxhZ3MgJiBHRU5FVF9IQVNfTURJT19JTlRSKQotCQljcHVfbWFza19jbGVhciB8PSBVTUFDX0lSUV9NRElPX0RPTkUgfCBVTUFDX0lSUV9NRElPX0VSUk9SOworCQlpbnQwX2VuYWJsZSB8PSAoVU1BQ19JUlFfTURJT19ET05FIHwgVU1BQ19JUlFfTURJT19FUlJPUik7CiAKLQliY21nZW5ldF9pbnRybDJfMF93cml0ZWwocHJpdiwgY3B1X21hc2tfY2xlYXIsIElOVFJMMl9DUFVfTUFTS19DTEVBUik7CisJLyogRW5hYmxlIFJ4IHByaW9yaXR5IHF1ZXVlIGludGVycnVwdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLT5yeF9xdWV1ZXM7ICsraSkKKwkJaW50MV9lbmFibGUgfD0gKDEgPDwgKFVNQUNfSVJRMV9SWF9JTlRSX1NISUZUICsgaSkpOwogCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcHJpdi0+aHdfcGFyYW1zLT50eF9xdWV1ZXM7IGluZGV4KyspCi0JCWJjbWdlbmV0X2ludHJsMl8xX3dyaXRlbChwcml2LCAoMSA8PCBpbmRleCksCi0JCQkJCSBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOworCS8qIEVuYWJsZSBUeCBwcmlvcml0eSBxdWV1ZSBpbnRlcnJ1cHRzICovCisJZm9yIChpID0gMDsgaSA8IHByaXYtPmh3X3BhcmFtcy0+dHhfcXVldWVzOyArK2kpCisJCWludDFfZW5hYmxlIHw9ICgxIDw8IGkpOworCisJYmNtZ2VuZXRfaW50cmwyXzBfd3JpdGVsKHByaXYsIGludDBfZW5hYmxlLCBJTlRSTDJfQ1BVX01BU0tfQ0xFQVIpOworCWJjbWdlbmV0X2ludHJsMl8xX3dyaXRlbChwcml2LCBpbnQxX2VuYWJsZSwgSU5UUkwyX0NQVV9NQVNLX0NMRUFSKTsKIAogCS8qIEVuYWJsZSByeC90eCBlbmdpbmUuKi8KIAlkZXZfZGJnKGtkZXYsICJkb25lIGluaXQgdW1hY1xuIik7CkBAIC0xNzEwLDIxICsxNzY5LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIEluaXRpYWxpemUgYWxsIGhvdXNlLWtlZXBpbmcgdmFyaWFibGVzIGZvciBhIFRYIHJpbmcsIGFsb25nCi0gKiB3aXRoIGNvcnJlc3BvbmRpbmcgaGFyZHdhcmUgcmVnaXN0ZXJzCi0gKi8KKy8qIEluaXRpYWxpemUgYSBUeCByaW5nIGFsb25nIHdpdGggY29ycmVzcG9uZGluZyBoYXJkd2FyZSByZWdpc3RlcnMgKi8KIHN0YXRpYyB2b2lkIGJjbWdlbmV0X2luaXRfdHhfcmluZyhzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiwKIAkJCQkgIHVuc2lnbmVkIGludCBpbmRleCwgdW5zaWduZWQgaW50IHNpemUsCi0JCQkJICB1bnNpZ25lZCBpbnQgd3JpdGVfcHRyLCB1bnNpZ25lZCBpbnQgZW5kX3B0cikKKwkJCQkgIHVuc2lnbmVkIGludCBzdGFydF9wdHIsIHVuc2lnbmVkIGludCBlbmRfcHRyKQogewogCXN0cnVjdCBiY21nZW5ldF90eF9yaW5nICpyaW5nID0gJnByaXYtPnR4X3JpbmdzW2luZGV4XTsKIAl1MzIgd29yZHNfcGVyX2JkID0gV09SRFNfUEVSX0JEKHByaXYpOwogCXUzMiBmbG93X3BlcmlvZF92YWwgPSAwOwotCXVuc2lnbmVkIGludCBmaXJzdF9iZDsKIAogCXNwaW5fbG9ja19pbml0KCZyaW5nLT5sb2NrKTsKIAlyaW5nLT5wcml2ID0gcHJpdjsKLQluZXRpZl9uYXBpX2FkZChwcml2LT5kZXYsICZyaW5nLT5uYXBpLCBiY21nZW5ldF90eF9wb2xsLCA2NCk7CiAJcmluZy0+aW5kZXggPSBpbmRleDsKIAlpZiAoaW5kZXggPT0gREVTQ19JTkRFWCkgewogCQlyaW5nLT5xdWV1ZSA9IDA7CkBAIC0xNzM1LDEyICsxNzkwLDEzIEBACiAJCXJpbmctPmludF9lbmFibGUgPSBiY21nZW5ldF90eF9yaW5nX2ludF9lbmFibGU7CiAJCXJpbmctPmludF9kaXNhYmxlID0gYmNtZ2VuZXRfdHhfcmluZ19pbnRfZGlzYWJsZTsKIAl9Ci0JcmluZy0+Y2JzID0gcHJpdi0+dHhfY2JzICsgd3JpdGVfcHRyOworCXJpbmctPmNicyA9IHByaXYtPnR4X2NicyArIHN0YXJ0X3B0cjsKIAlyaW5nLT5zaXplID0gc2l6ZTsKKwlyaW5nLT5jbGVhbl9wdHIgPSBzdGFydF9wdHI7CiAJcmluZy0+Y19pbmRleCA9IDA7CiAJcmluZy0+ZnJlZV9iZHMgPSBzaXplOwotCXJpbmctPndyaXRlX3B0ciA9IHdyaXRlX3B0cjsKLQlyaW5nLT5jYl9wdHIgPSB3cml0ZV9wdHI7CisJcmluZy0+d3JpdGVfcHRyID0gc3RhcnRfcHRyOworCXJpbmctPmNiX3B0ciA9IHN0YXJ0X3B0cjsKIAlyaW5nLT5lbmRfcHRyID0gZW5kX3B0ciAtIDE7CiAJcmluZy0+cHJvZF9pbmRleCA9IDA7CiAKQEAgLTE3NTQsMTQ5ICsxODEwLDMxOSBAQAogCS8qIERpc2FibGUgcmF0ZSBjb250cm9sIGZvciBub3cgKi8KIAliY21nZW5ldF90ZG1hX3Jpbmdfd3JpdGVsKHByaXYsIGluZGV4LCBmbG93X3BlcmlvZF92YWwsCiAJCQkJICBURE1BX0ZMT1dfUEVSSU9EKTsKLQkvKiBVbmNsYXNzaWZpZWQgdHJhZmZpYyBnb2VzIHRvIHJpbmcgMTYgKi8KIAliY21nZW5ldF90ZG1hX3Jpbmdfd3JpdGVsKHByaXYsIGluZGV4LAogCQkJCSAgKChzaXplIDw8IERNQV9SSU5HX1NJWkVfU0hJRlQpIHwKIAkJCQkgICBSWF9CVUZfTEVOR1RIKSwgRE1BX1JJTkdfQlVGX1NJWkUpOwogCi0JZmlyc3RfYmQgPSB3cml0ZV9wdHI7Ci0KIAkvKiBTZXQgc3RhcnQgYW5kIGVuZCBhZGRyZXNzLCByZWFkIGFuZCB3cml0ZSBwb2ludGVycyAqLwotCWJjbWdlbmV0X3RkbWFfcmluZ193cml0ZWwocHJpdiwgaW5kZXgsIGZpcnN0X2JkICogd29yZHNfcGVyX2JkLAorCWJjbWdlbmV0X3RkbWFfcmluZ193cml0ZWwocHJpdiwgaW5kZXgsIHN0YXJ0X3B0ciAqIHdvcmRzX3Blcl9iZCwKIAkJCQkgIERNQV9TVEFSVF9BRERSKTsKLQliY21nZW5ldF90ZG1hX3Jpbmdfd3JpdGVsKHByaXYsIGluZGV4LCBmaXJzdF9iZCAqIHdvcmRzX3Blcl9iZCwKKwliY21nZW5ldF90ZG1hX3Jpbmdfd3JpdGVsKHByaXYsIGluZGV4LCBzdGFydF9wdHIgKiB3b3Jkc19wZXJfYmQsCiAJCQkJICBURE1BX1JFQURfUFRSKTsKLQliY21nZW5ldF90ZG1hX3Jpbmdfd3JpdGVsKHByaXYsIGluZGV4LCBmaXJzdF9iZCwKKwliY21nZW5ldF90ZG1hX3Jpbmdfd3JpdGVsKHByaXYsIGluZGV4LCBzdGFydF9wdHIgKiB3b3Jkc19wZXJfYmQsCiAJCQkJICBURE1BX1dSSVRFX1BUUik7CiAJYmNtZ2VuZXRfdGRtYV9yaW5nX3dyaXRlbChwcml2LCBpbmRleCwgZW5kX3B0ciAqIHdvcmRzX3Blcl9iZCAtIDEsCiAJCQkJICBETUFfRU5EX0FERFIpOwotCi0JbmFwaV9lbmFibGUoJnJpbmctPm5hcGkpOwotfQotCi1zdGF0aWMgdm9pZCBiY21nZW5ldF9maW5pX3R4X3Jpbmcoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsCi0JCQkJICB1bnNpZ25lZCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGJjbWdlbmV0X3R4X3JpbmcgKnJpbmcgPSAmcHJpdi0+dHhfcmluZ3NbaW5kZXhdOwotCi0JbmFwaV9kaXNhYmxlKCZyaW5nLT5uYXBpKTsKLQluZXRpZl9uYXBpX2RlbCgmcmluZy0+bmFwaSk7CiB9CiAKIC8qIEluaXRpYWxpemUgYSBSRE1BIHJpbmcgKi8KIHN0YXRpYyBpbnQgYmNtZ2VuZXRfaW5pdF9yeF9yaW5nKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAotCQkJCSB1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBzaXplKQorCQkJCSB1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSB1bnNpZ25lZCBpbnQgc3RhcnRfcHRyLCB1bnNpZ25lZCBpbnQgZW5kX3B0cikKIHsKKwlzdHJ1Y3QgYmNtZ2VuZXRfcnhfcmluZyAqcmluZyA9ICZwcml2LT5yeF9yaW5nc1tpbmRleF07CiAJdTMyIHdvcmRzX3Blcl9iZCA9IFdPUkRTX1BFUl9CRChwcml2KTsKIAlpbnQgcmV0OwogCi0JcHJpdi0+bnVtX3J4X2JkcyA9IFRPVEFMX0RFU0M7Ci0JcHJpdi0+cnhfYmRzID0gcHJpdi0+YmFzZSArIHByaXYtPmh3X3BhcmFtcy0+cmRtYV9vZmZzZXQ7Ci0JcHJpdi0+cnhfYmRfYXNzaWduX3B0ciA9IHByaXYtPnJ4X2JkczsKLQlwcml2LT5yeF9iZF9hc3NpZ25faW5kZXggPSAwOwotCXByaXYtPnJ4X2NfaW5kZXggPSAwOwotCXByaXYtPnJ4X3JlYWRfcHRyID0gMDsKLQlwcml2LT5yeF9jYnMgPSBrY2FsbG9jKHByaXYtPm51bV9yeF9iZHMsIHNpemVvZihzdHJ1Y3QgZW5ldF9jYiksCi0JCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2LT5yeF9jYnMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmV0ID0gYmNtZ2VuZXRfYWxsb2NfcnhfYnVmZmVycyhwcml2KTsKLQlpZiAocmV0KSB7Ci0JCWtmcmVlKHByaXYtPnJ4X2Nicyk7Ci0JCXJldHVybiByZXQ7CisJcmluZy0+cHJpdiA9IHByaXY7CisJcmluZy0+aW5kZXggPSBpbmRleDsKKwlpZiAoaW5kZXggPT0gREVTQ19JTkRFWCkgeworCQlyaW5nLT5pbnRfZW5hYmxlID0gYmNtZ2VuZXRfcnhfcmluZzE2X2ludF9lbmFibGU7CisJCXJpbmctPmludF9kaXNhYmxlID0gYmNtZ2VuZXRfcnhfcmluZzE2X2ludF9kaXNhYmxlOworCX0gZWxzZSB7CisJCXJpbmctPmludF9lbmFibGUgPSBiY21nZW5ldF9yeF9yaW5nX2ludF9lbmFibGU7CisJCXJpbmctPmludF9kaXNhYmxlID0gYmNtZ2VuZXRfcnhfcmluZ19pbnRfZGlzYWJsZTsKIAl9CisJcmluZy0+Y2JzID0gcHJpdi0+cnhfY2JzICsgc3RhcnRfcHRyOworCXJpbmctPnNpemUgPSBzaXplOworCXJpbmctPmNfaW5kZXggPSAwOworCXJpbmctPnJlYWRfcHRyID0gc3RhcnRfcHRyOworCXJpbmctPmNiX3B0ciA9IHN0YXJ0X3B0cjsKKwlyaW5nLT5lbmRfcHRyID0gZW5kX3B0ciAtIDE7CiAKLQliY21nZW5ldF9yZG1hX3Jpbmdfd3JpdGVsKHByaXYsIGluZGV4LCAwLCBSRE1BX1dSSVRFX1BUUik7CisJcmV0ID0gYmNtZ2VuZXRfYWxsb2NfcnhfYnVmZmVycyhwcml2LCByaW5nKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJYmNtZ2VuZXRfcmRtYV9yaW5nX3dyaXRlbChwcml2LCBpbmRleCwgMCwgUkRNQV9QUk9EX0lOREVYKTsKIAliY21nZW5ldF9yZG1hX3Jpbmdfd3JpdGVsKHByaXYsIGluZGV4LCAwLCBSRE1BX0NPTlNfSU5ERVgpOworCWJjbWdlbmV0X3JkbWFfcmluZ193cml0ZWwocHJpdiwgaW5kZXgsIDEsIERNQV9NQlVGX0RPTkVfVEhSRVNIKTsKIAliY21nZW5ldF9yZG1hX3Jpbmdfd3JpdGVsKHByaXYsIGluZGV4LAogCQkJCSAgKChzaXplIDw8IERNQV9SSU5HX1NJWkVfU0hJRlQpIHwKIAkJCQkgICBSWF9CVUZfTEVOR1RIKSwgRE1BX1JJTkdfQlVGX1NJWkUpOwotCWJjbWdlbmV0X3JkbWFfcmluZ193cml0ZWwocHJpdiwgaW5kZXgsIDAsIERNQV9TVEFSVF9BRERSKTsKLQliY21nZW5ldF9yZG1hX3Jpbmdfd3JpdGVsKHByaXYsIGluZGV4LAotCQkJCSAgd29yZHNfcGVyX2JkICogc2l6ZSAtIDEsIERNQV9FTkRfQUREUik7CiAJYmNtZ2VuZXRfcmRtYV9yaW5nX3dyaXRlbChwcml2LCBpbmRleCwKIAkJCQkgIChETUFfRkNfVEhSRVNIX0xPIDw8CiAJCQkJICAgRE1BX1hPRkZfVEhSRVNIT0xEX1NISUZUKSB8CiAJCQkJICAgRE1BX0ZDX1RIUkVTSF9ISSwgUkRNQV9YT05fWE9GRl9USFJFU0gpOwotCWJjbWdlbmV0X3JkbWFfcmluZ193cml0ZWwocHJpdiwgaW5kZXgsIDAsIFJETUFfUkVBRF9QVFIpOworCisJLyogU2V0IHN0YXJ0IGFuZCBlbmQgYWRkcmVzcywgcmVhZCBhbmQgd3JpdGUgcG9pbnRlcnMgKi8KKwliY21nZW5ldF9yZG1hX3Jpbmdfd3JpdGVsKHByaXYsIGluZGV4LCBzdGFydF9wdHIgKiB3b3Jkc19wZXJfYmQsCisJCQkJICBETUFfU1RBUlRfQUREUik7CisJYmNtZ2VuZXRfcmRtYV9yaW5nX3dyaXRlbChwcml2LCBpbmRleCwgc3RhcnRfcHRyICogd29yZHNfcGVyX2JkLAorCQkJCSAgUkRNQV9SRUFEX1BUUik7CisJYmNtZ2VuZXRfcmRtYV9yaW5nX3dyaXRlbChwcml2LCBpbmRleCwgc3RhcnRfcHRyICogd29yZHNfcGVyX2JkLAorCQkJCSAgUkRNQV9XUklURV9QVFIpOworCWJjbWdlbmV0X3JkbWFfcmluZ193cml0ZWwocHJpdiwgaW5kZXgsIGVuZF9wdHIgKiB3b3Jkc19wZXJfYmQgLSAxLAorCQkJCSAgRE1BX0VORF9BRERSKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLS8qIGluaXQgbXVsdGkgeG1pdCBxdWV1ZXMsIG9ubHkgYXZhaWxhYmxlIGZvciBHRU5FVDIrCi0gKiB0aGUgcXVldWUgaXMgcGFydGl0aW9uZWQgYXMgZm9sbG93czoKK3N0YXRpYyB2b2lkIGJjbWdlbmV0X2luaXRfdHhfbmFwaShzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgYmNtZ2VuZXRfdHhfcmluZyAqcmluZzsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMtPnR4X3F1ZXVlczsgKytpKSB7CisJCXJpbmcgPSAmcHJpdi0+dHhfcmluZ3NbaV07CisJCW5ldGlmX25hcGlfYWRkKHByaXYtPmRldiwgJnJpbmctPm5hcGksIGJjbWdlbmV0X3R4X3BvbGwsIDY0KTsKKwl9CisKKwlyaW5nID0gJnByaXYtPnR4X3JpbmdzW0RFU0NfSU5ERVhdOworCW5ldGlmX25hcGlfYWRkKHByaXYtPmRldiwgJnJpbmctPm5hcGksIGJjbWdlbmV0X3R4X3BvbGwsIDY0KTsKK30KKworc3RhdGljIHZvaWQgYmNtZ2VuZXRfZW5hYmxlX3R4X25hcGkoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGJjbWdlbmV0X3R4X3JpbmcgKnJpbmc7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLT50eF9xdWV1ZXM7ICsraSkgeworCQlyaW5nID0gJnByaXYtPnR4X3JpbmdzW2ldOworCQluYXBpX2VuYWJsZSgmcmluZy0+bmFwaSk7CisJfQorCisJcmluZyA9ICZwcml2LT50eF9yaW5nc1tERVNDX0lOREVYXTsKKwluYXBpX2VuYWJsZSgmcmluZy0+bmFwaSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbWdlbmV0X2Rpc2FibGVfdHhfbmFwaShzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgYmNtZ2VuZXRfdHhfcmluZyAqcmluZzsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMtPnR4X3F1ZXVlczsgKytpKSB7CisJCXJpbmcgPSAmcHJpdi0+dHhfcmluZ3NbaV07CisJCW5hcGlfZGlzYWJsZSgmcmluZy0+bmFwaSk7CisJfQorCisJcmluZyA9ICZwcml2LT50eF9yaW5nc1tERVNDX0lOREVYXTsKKwluYXBpX2Rpc2FibGUoJnJpbmctPm5hcGkpOworfQorCitzdGF0aWMgdm9pZCBiY21nZW5ldF9maW5pX3R4X25hcGkoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGJjbWdlbmV0X3R4X3JpbmcgKnJpbmc7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLT50eF9xdWV1ZXM7ICsraSkgeworCQlyaW5nID0gJnByaXYtPnR4X3JpbmdzW2ldOworCQluZXRpZl9uYXBpX2RlbCgmcmluZy0+bmFwaSk7CisJfQorCisJcmluZyA9ICZwcml2LT50eF9yaW5nc1tERVNDX0lOREVYXTsKKwluZXRpZl9uYXBpX2RlbCgmcmluZy0+bmFwaSk7Cit9CisKKy8qIEluaXRpYWxpemUgVHggcXVldWVzCiAgKgotICogcXVldWUgMCAtIDMgaXMgcHJpb3JpdHkgYmFzZWQsIGVhY2ggb25lIGhhcyAzMiBkZXNjcmlwdG9ycywKKyAqIFF1ZXVlcyAwLTMgYXJlIHByaW9yaXR5LWJhc2VkLCBlYWNoIG9uZSBoYXMgMzIgZGVzY3JpcHRvcnMsCiAgKiB3aXRoIHF1ZXVlIDAgYmVpbmcgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgcXVldWUuCiAgKgotICogcXVldWUgMTYgaXMgdGhlIGRlZmF1bHQgdHggcXVldWUgd2l0aCBHRU5FVF9ERUZBVUxUX0JEX0NOVAotICogZGVzY3JpcHRvcnM6IDI1NiAtIChudW1iZXIgb2YgdHggcXVldWVzICogYmRzIHBlciBxdWV1ZXMpID0gMTI4Ci0gKiBkZXNjcmlwdG9ycy4KKyAqIFF1ZXVlIDE2IGlzIHRoZSBkZWZhdWx0IFR4IHF1ZXVlIHdpdGgKKyAqIEdFTkVUX1ExNl9UWF9CRF9DTlQgPSAyNTYgLSA0ICogMzIgPSAxMjggZGVzY3JpcHRvcnMuCiAgKgotICogVGhlIHRyYW5zbWl0IGNvbnRyb2wgYmxvY2sgcG9vbCBpcyB0aGVuIHBhcnRpdGlvbmVkIGFzIGZvbGxvd2luZzoKLSAqIC0gdHhfY2JzWzAuLi4xMjddIGFyZSBmb3IgcXVldWUgMTYKLSAqIC0gdHhfcmluZ19jYnNbMF0gcG9pbnRzIHRvIHR4X2Nic1sxMjguLjE1OV0KLSAqIC0gdHhfcmluZ19jYnNbMV0gcG9pbnRzIHRvIHR4X2Nic1sxNjAuLjE5MV0KLSAqIC0gdHhfcmluZ19jYnNbMl0gcG9pbnRzIHRvIHR4X2Nic1sxOTIuLjIyM10KLSAqIC0gdHhfcmluZ19jYnNbM10gcG9pbnRzIHRvIHR4X2Nic1syMjQuLjI1NV0KKyAqIFRoZSB0cmFuc21pdCBjb250cm9sIGJsb2NrIHBvb2wgaXMgdGhlbiBwYXJ0aXRpb25lZCBhcyBmb2xsb3dzOgorICogLSBUeCBxdWV1ZSAwIHVzZXMgdHhfY2JzWzAuLjMxXQorICogLSBUeCBxdWV1ZSAxIHVzZXMgdHhfY2JzWzMyLi42M10KKyAqIC0gVHggcXVldWUgMiB1c2VzIHR4X2Nic1s2NC4uOTVdCisgKiAtIFR4IHF1ZXVlIDMgdXNlcyB0eF9jYnNbOTYuLjEyN10KKyAqIC0gVHggcXVldWUgMTYgdXNlcyB0eF9jYnNbMTI4Li4yNTVdCiAgKi8KLXN0YXRpYyB2b2lkIGJjbWdlbmV0X2luaXRfbXVsdGlxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBiY21nZW5ldF9pbml0X3R4X3F1ZXVlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1bnNpZ25lZCBpbnQgaSwgZG1hX2VuYWJsZTsKLQl1MzIgcmVnLCBkbWFfY3RybCwgcmluZ19jZmcgPSAwOworCXUzMiBpLCBkbWFfZW5hYmxlOworCXUzMiBkbWFfY3RybCwgcmluZ19jZmc7CiAJdTMyIGRtYV9wcmlvcml0eVszXSA9IHswLCAwLCAwfTsKIAotCWlmICghbmV0aWZfaXNfbXVsdGlxdWV1ZShkZXYpKSB7Ci0JCW5ldGRldl93YXJuKGRldiwgImNhbGxlZCB3aXRoIG5vbiBtdWx0aSBxdWV1ZSBhd2FyZSBIV1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KIAlkbWFfY3RybCA9IGJjbWdlbmV0X3RkbWFfcmVhZGwocHJpdiwgRE1BX0NUUkwpOwogCWRtYV9lbmFibGUgPSBkbWFfY3RybCAmIERNQV9FTjsKIAlkbWFfY3RybCAmPSB+RE1BX0VOOwogCWJjbWdlbmV0X3RkbWFfd3JpdGVsKHByaXYsIGRtYV9jdHJsLCBETUFfQ1RSTCk7CiAKKwlkbWFfY3RybCA9IDA7CisJcmluZ19jZmcgPSAwOworCiAJLyogRW5hYmxlIHN0cmljdCBwcmlvcml0eSBhcmJpdGVyIG1vZGUgKi8KIAliY21nZW5ldF90ZG1hX3dyaXRlbChwcml2LCBETUFfQVJCSVRFUl9TUCwgRE1BX0FSQl9DVFJMKTsKIAorCS8qIEluaXRpYWxpemUgVHggcHJpb3JpdHkgcXVldWVzICovCiAJZm9yIChpID0gMDsgaSA8IHByaXYtPmh3X3BhcmFtcy0+dHhfcXVldWVzOyBpKyspIHsKLQkJLyogZmlyc3QgNjQgdHhfY2JzIGFyZSByZXNlcnZlZCBmb3IgZGVmYXVsdCB0eCBxdWV1ZQotCQkgKiAocmluZyAxNikKLQkJICovCi0JCWJjbWdlbmV0X2luaXRfdHhfcmluZyhwcml2LCBpLCBwcml2LT5od19wYXJhbXMtPmJkc19jbnQsCi0JCQkJICAgICAgaSAqIHByaXYtPmh3X3BhcmFtcy0+YmRzX2NudCwKLQkJCQkgICAgICAoaSArIDEpICogcHJpdi0+aHdfcGFyYW1zLT5iZHNfY250KTsKLQotCQkvKiBDb25maWd1cmUgcmluZyBhcyBkZXNjcmlwdG9yIHJpbmcgYW5kIHNldHVwIHByaW9yaXR5ICovCi0JCXJpbmdfY2ZnIHw9IDEgPDwgaTsKLQkJZG1hX2N0cmwgfD0gMSA8PCAoaSArIERNQV9SSU5HX0JVRl9FTl9TSElGVCk7Ci0KKwkJYmNtZ2VuZXRfaW5pdF90eF9yaW5nKHByaXYsIGksIHByaXYtPmh3X3BhcmFtcy0+dHhfYmRzX3Blcl9xLAorCQkJCSAgICAgIGkgKiBwcml2LT5od19wYXJhbXMtPnR4X2Jkc19wZXJfcSwKKwkJCQkgICAgICAoaSArIDEpICogcHJpdi0+aHdfcGFyYW1zLT50eF9iZHNfcGVyX3EpOworCQlyaW5nX2NmZyB8PSAoMSA8PCBpKTsKKwkJZG1hX2N0cmwgfD0gKDEgPDwgKGkgKyBETUFfUklOR19CVUZfRU5fU0hJRlQpKTsKIAkJZG1hX3ByaW9yaXR5W0RNQV9QUklPX1JFR19JTkRFWChpKV0gfD0KIAkJCSgoR0VORVRfUTBfUFJJT1JJVFkgKyBpKSA8PCBETUFfUFJJT19SRUdfU0hJRlQoaSkpOwogCX0KIAotCS8qIFNldCByaW5nIDE2IHByaW9yaXR5IGFuZCBwcm9ncmFtIHRoZSBoYXJkd2FyZSByZWdpc3RlcnMgKi8KKwkvKiBJbml0aWFsaXplIFR4IGRlZmF1bHQgcXVldWUgMTYgKi8KKwliY21nZW5ldF9pbml0X3R4X3JpbmcocHJpdiwgREVTQ19JTkRFWCwgR0VORVRfUTE2X1RYX0JEX0NOVCwKKwkJCSAgICAgIHByaXYtPmh3X3BhcmFtcy0+dHhfcXVldWVzICoKKwkJCSAgICAgIHByaXYtPmh3X3BhcmFtcy0+dHhfYmRzX3Blcl9xLAorCQkJICAgICAgVE9UQUxfREVTQyk7CisJcmluZ19jZmcgfD0gKDEgPDwgREVTQ19JTkRFWCk7CisJZG1hX2N0cmwgfD0gKDEgPDwgKERFU0NfSU5ERVggKyBETUFfUklOR19CVUZfRU5fU0hJRlQpKTsKIAlkbWFfcHJpb3JpdHlbRE1BX1BSSU9fUkVHX0lOREVYKERFU0NfSU5ERVgpXSB8PQogCQkoKEdFTkVUX1EwX1BSSU9SSVRZICsgcHJpdi0+aHdfcGFyYW1zLT50eF9xdWV1ZXMpIDw8CiAJCSBETUFfUFJJT19SRUdfU0hJRlQoREVTQ19JTkRFWCkpOworCisJLyogU2V0IFR4IHF1ZXVlIHByaW9yaXRpZXMgKi8KIAliY21nZW5ldF90ZG1hX3dyaXRlbChwcml2LCBkbWFfcHJpb3JpdHlbMF0sIERNQV9QUklPUklUWV8wKTsKIAliY21nZW5ldF90ZG1hX3dyaXRlbChwcml2LCBkbWFfcHJpb3JpdHlbMV0sIERNQV9QUklPUklUWV8xKTsKIAliY21nZW5ldF90ZG1hX3dyaXRlbChwcml2LCBkbWFfcHJpb3JpdHlbMl0sIERNQV9QUklPUklUWV8yKTsKIAorCS8qIEluaXRpYWxpemUgVHggTkFQSSAqLworCWJjbWdlbmV0X2luaXRfdHhfbmFwaShwcml2KTsKKworCS8qIEVuYWJsZSBUeCBxdWV1ZXMgKi8KKwliY21nZW5ldF90ZG1hX3dyaXRlbChwcml2LCByaW5nX2NmZywgRE1BX1JJTkdfQ0ZHKTsKKworCS8qIEVuYWJsZSBUeCBETUEgKi8KKwlpZiAoZG1hX2VuYWJsZSkKKwkJZG1hX2N0cmwgfD0gRE1BX0VOOworCWJjbWdlbmV0X3RkbWFfd3JpdGVsKHByaXYsIGRtYV9jdHJsLCBETUFfQ1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbWdlbmV0X2luaXRfcnhfbmFwaShzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgYmNtZ2VuZXRfcnhfcmluZyAqcmluZzsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMtPnJ4X3F1ZXVlczsgKytpKSB7CisJCXJpbmcgPSAmcHJpdi0+cnhfcmluZ3NbaV07CisJCW5ldGlmX25hcGlfYWRkKHByaXYtPmRldiwgJnJpbmctPm5hcGksIGJjbWdlbmV0X3J4X3BvbGwsIDY0KTsKKwl9CisKKwlyaW5nID0gJnByaXYtPnJ4X3JpbmdzW0RFU0NfSU5ERVhdOworCW5ldGlmX25hcGlfYWRkKHByaXYtPmRldiwgJnJpbmctPm5hcGksIGJjbWdlbmV0X3J4X3BvbGwsIDY0KTsKK30KKworc3RhdGljIHZvaWQgYmNtZ2VuZXRfZW5hYmxlX3J4X25hcGkoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGJjbWdlbmV0X3J4X3JpbmcgKnJpbmc7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLT5yeF9xdWV1ZXM7ICsraSkgeworCQlyaW5nID0gJnByaXYtPnJ4X3JpbmdzW2ldOworCQluYXBpX2VuYWJsZSgmcmluZy0+bmFwaSk7CisJfQorCisJcmluZyA9ICZwcml2LT5yeF9yaW5nc1tERVNDX0lOREVYXTsKKwluYXBpX2VuYWJsZSgmcmluZy0+bmFwaSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbWdlbmV0X2Rpc2FibGVfcnhfbmFwaShzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgYmNtZ2VuZXRfcnhfcmluZyAqcmluZzsKKworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMtPnJ4X3F1ZXVlczsgKytpKSB7CisJCXJpbmcgPSAmcHJpdi0+cnhfcmluZ3NbaV07CisJCW5hcGlfZGlzYWJsZSgmcmluZy0+bmFwaSk7CisJfQorCisJcmluZyA9ICZwcml2LT5yeF9yaW5nc1tERVNDX0lOREVYXTsKKwluYXBpX2Rpc2FibGUoJnJpbmctPm5hcGkpOworfQorCitzdGF0aWMgdm9pZCBiY21nZW5ldF9maW5pX3J4X25hcGkoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGJjbWdlbmV0X3J4X3JpbmcgKnJpbmc7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLT5yeF9xdWV1ZXM7ICsraSkgeworCQlyaW5nID0gJnByaXYtPnJ4X3JpbmdzW2ldOworCQluZXRpZl9uYXBpX2RlbCgmcmluZy0+bmFwaSk7CisJfQorCisJcmluZyA9ICZwcml2LT5yeF9yaW5nc1tERVNDX0lOREVYXTsKKwluZXRpZl9uYXBpX2RlbCgmcmluZy0+bmFwaSk7Cit9CisKKy8qIEluaXRpYWxpemUgUnggcXVldWVzCisgKgorICogUXVldWVzIDAtMTUgYXJlIHByaW9yaXR5IHF1ZXVlcy4gSGFyZHdhcmUgRmlsdGVyaW5nIEJsb2NrIChIRkIpIGNhbiBiZQorICogdXNlZCB0byBkaXJlY3QgdHJhZmZpYyB0byB0aGVzZSBxdWV1ZXMuCisgKgorICogUXVldWUgMTYgaXMgdGhlIGRlZmF1bHQgUnggcXVldWUgd2l0aCBHRU5FVF9RMTZfUlhfQkRfQ05UIGRlc2NyaXB0b3JzLgorICovCitzdGF0aWMgaW50IGJjbWdlbmV0X2luaXRfcnhfcXVldWVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXUzMiBpOworCXUzMiBkbWFfZW5hYmxlOworCXUzMiBkbWFfY3RybDsKKwl1MzIgcmluZ19jZmc7CisJaW50IHJldDsKKworCWRtYV9jdHJsID0gYmNtZ2VuZXRfcmRtYV9yZWFkbChwcml2LCBETUFfQ1RSTCk7CisJZG1hX2VuYWJsZSA9IGRtYV9jdHJsICYgRE1BX0VOOworCWRtYV9jdHJsICY9IH5ETUFfRU47CisJYmNtZ2VuZXRfcmRtYV93cml0ZWwocHJpdiwgZG1hX2N0cmwsIERNQV9DVFJMKTsKKworCWRtYV9jdHJsID0gMDsKKwlyaW5nX2NmZyA9IDA7CisKKwkvKiBJbml0aWFsaXplIFJ4IHByaW9yaXR5IHF1ZXVlcyAqLworCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMtPnJ4X3F1ZXVlczsgaSsrKSB7CisJCXJldCA9IGJjbWdlbmV0X2luaXRfcnhfcmluZyhwcml2LCBpLAorCQkJCQkgICAgcHJpdi0+aHdfcGFyYW1zLT5yeF9iZHNfcGVyX3EsCisJCQkJCSAgICBpICogcHJpdi0+aHdfcGFyYW1zLT5yeF9iZHNfcGVyX3EsCisJCQkJCSAgICAoaSArIDEpICoKKwkJCQkJICAgIHByaXYtPmh3X3BhcmFtcy0+cnhfYmRzX3Blcl9xKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmluZ19jZmcgfD0gKDEgPDwgaSk7CisJCWRtYV9jdHJsIHw9ICgxIDw8IChpICsgRE1BX1JJTkdfQlVGX0VOX1NISUZUKSk7CisJfQorCisJLyogSW5pdGlhbGl6ZSBSeCBkZWZhdWx0IHF1ZXVlIDE2ICovCisJcmV0ID0gYmNtZ2VuZXRfaW5pdF9yeF9yaW5nKHByaXYsIERFU0NfSU5ERVgsIEdFTkVUX1ExNl9SWF9CRF9DTlQsCisJCQkJICAgIHByaXYtPmh3X3BhcmFtcy0+cnhfcXVldWVzICoKKwkJCQkgICAgcHJpdi0+aHdfcGFyYW1zLT5yeF9iZHNfcGVyX3EsCisJCQkJICAgIFRPVEFMX0RFU0MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyaW5nX2NmZyB8PSAoMSA8PCBERVNDX0lOREVYKTsKKwlkbWFfY3RybCB8PSAoMSA8PCAoREVTQ19JTkRFWCArIERNQV9SSU5HX0JVRl9FTl9TSElGVCkpOworCisJLyogSW5pdGlhbGl6ZSBSeCBOQVBJICovCisJYmNtZ2VuZXRfaW5pdF9yeF9uYXBpKHByaXYpOworCiAJLyogRW5hYmxlIHJpbmdzICovCi0JcmVnID0gYmNtZ2VuZXRfdGRtYV9yZWFkbChwcml2LCBETUFfUklOR19DRkcpOwotCXJlZyB8PSByaW5nX2NmZzsKLQliY21nZW5ldF90ZG1hX3dyaXRlbChwcml2LCByZWcsIERNQV9SSU5HX0NGRyk7CisJYmNtZ2VuZXRfcmRtYV93cml0ZWwocHJpdiwgcmluZ19jZmcsIERNQV9SSU5HX0NGRyk7CiAKIAkvKiBDb25maWd1cmUgcmluZyBhcyBkZXNjcmlwdG9yIHJpbmcgYW5kIHJlLWVuYWJsZSBETUEgaWYgZW5hYmxlZCAqLwotCXJlZyA9IGJjbWdlbmV0X3RkbWFfcmVhZGwocHJpdiwgRE1BX0NUUkwpOwotCXJlZyB8PSBkbWFfY3RybDsKIAlpZiAoZG1hX2VuYWJsZSkKLQkJcmVnIHw9IERNQV9FTjsKLQliY21nZW5ldF90ZG1hX3dyaXRlbChwcml2LCByZWcsIERNQV9DVFJMKTsKKwkJZG1hX2N0cmwgfD0gRE1BX0VOOworCWJjbWdlbmV0X3JkbWFfd3JpdGVsKHByaXYsIGRtYV9jdHJsLCBETUFfQ1RSTCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBiY21nZW5ldF9kbWFfdGVhcmRvd24oc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYpCkBAIC0xOTUwLDEwICsyMTc2LDEzIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgX19iY21nZW5ldF9maW5pX2RtYShzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGJjbWdlbmV0X2ZpbmlfZG1hKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2KQogewogCWludCBpOwogCisJYmNtZ2VuZXRfZmluaV9yeF9uYXBpKHByaXYpOworCWJjbWdlbmV0X2ZpbmlfdHhfbmFwaShwcml2KTsKKwogCS8qIGRpc2FibGUgRE1BICovCiAJYmNtZ2VuZXRfZG1hX3RlYXJkb3duKHByaXYpOwogCkBAIC0xOTY5LDgxICsyMTk4LDYzIEBACiAJa2ZyZWUocHJpdi0+dHhfY2JzKTsKIH0KIAotc3RhdGljIHZvaWQgYmNtZ2VuZXRfZmluaV9kbWEoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYpCi17Ci0JaW50IGk7Ci0KLQliY21nZW5ldF9maW5pX3R4X3JpbmcocHJpdiwgREVTQ19JTkRFWCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLT50eF9xdWV1ZXM7IGkrKykKLQkJYmNtZ2VuZXRfZmluaV90eF9yaW5nKHByaXYsIGkpOwotCi0JX19iY21nZW5ldF9maW5pX2RtYShwcml2KTsKLX0KLQogLyogaW5pdF9lZG1hOiBJbml0aWFsaXplIERNQSBjb250cm9sIHJlZ2lzdGVyICovCiBzdGF0aWMgaW50IGJjbWdlbmV0X2luaXRfZG1hKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2KQogewogCWludCByZXQ7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGVuZXRfY2IgKmNiOwogCi0JbmV0aWZfZGJnKHByaXYsIGh3LCBwcml2LT5kZXYsICJiY21nZW5ldDogaW5pdF9lZG1hXG4iKTsKKwluZXRpZl9kYmcocHJpdiwgaHcsIHByaXYtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKLQkvKiBieSBkZWZhdWx0LCBlbmFibGUgcmluZyAxNiAoZGVzY3JpcHRvciBiYXNlZCkgKi8KLQlyZXQgPSBiY21nZW5ldF9pbml0X3J4X3JpbmcocHJpdiwgREVTQ19JTkRFWCwgVE9UQUxfREVTQyk7Ci0JaWYgKHJldCkgewotCQluZXRkZXZfZXJyKHByaXYtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIFJYIHJpbmdcbiIpOwotCQlyZXR1cm4gcmV0OworCS8qIEluaXRpYWxpemUgY29tbW9uIFJ4IHJpbmcgc3RydWN0dXJlcyAqLworCXByaXYtPnJ4X2JkcyA9IHByaXYtPmJhc2UgKyBwcml2LT5od19wYXJhbXMtPnJkbWFfb2Zmc2V0OworCXByaXYtPm51bV9yeF9iZHMgPSBUT1RBTF9ERVNDOworCXByaXYtPnJ4X2NicyA9IGtjYWxsb2MocHJpdi0+bnVtX3J4X2Jkcywgc2l6ZW9mKHN0cnVjdCBlbmV0X2NiKSwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYtPnJ4X2NicykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bnVtX3J4X2JkczsgaSsrKSB7CisJCWNiID0gcHJpdi0+cnhfY2JzICsgaTsKKwkJY2ItPmJkX2FkZHIgPSBwcml2LT5yeF9iZHMgKyBpICogRE1BX0RFU0NfU0laRTsKIAl9CiAKLQkvKiBpbml0IHJEbWEgKi8KLQliY21nZW5ldF9yZG1hX3dyaXRlbChwcml2LCBETUFfTUFYX0JVUlNUX0xFTkdUSCwgRE1BX1NDQl9CVVJTVF9TSVpFKTsKLQotCS8qIEluaXQgdERtYSAqLwotCWJjbWdlbmV0X3RkbWFfd3JpdGVsKHByaXYsIERNQV9NQVhfQlVSU1RfTEVOR1RILCBETUFfU0NCX0JVUlNUX1NJWkUpOwotCiAJLyogSW5pdGlhbGl6ZSBjb21tb24gVFggcmluZyBzdHJ1Y3R1cmVzICovCiAJcHJpdi0+dHhfYmRzID0gcHJpdi0+YmFzZSArIHByaXYtPmh3X3BhcmFtcy0+dGRtYV9vZmZzZXQ7CiAJcHJpdi0+bnVtX3R4X2JkcyA9IFRPVEFMX0RFU0M7CiAJcHJpdi0+dHhfY2JzID0ga2NhbGxvYyhwcml2LT5udW1fdHhfYmRzLCBzaXplb2Yoc3RydWN0IGVuZXRfY2IpLAogCQkJICAgICAgIEdGUF9LRVJORUwpOwogCWlmICghcHJpdi0+dHhfY2JzKSB7Ci0JCV9fYmNtZ2VuZXRfZmluaV9kbWEocHJpdik7CisJCWtmcmVlKHByaXYtPnJ4X2Nicyk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCS8qIGluaXRpYWxpemUgbXVsdGkgeG1pdCBxdWV1ZSAqLwotCWJjbWdlbmV0X2luaXRfbXVsdGlxKHByaXYtPmRldik7Ci0KLQkvKiBpbml0aWFsaXplIHNwZWNpYWwgcmluZyAxNiAqLwotCWJjbWdlbmV0X2luaXRfdHhfcmluZyhwcml2LCBERVNDX0lOREVYLCBHRU5FVF9ERUZBVUxUX0JEX0NOVCwKLQkJCSAgICAgIHByaXYtPmh3X3BhcmFtcy0+dHhfcXVldWVzICoKLQkJCSAgICAgIHByaXYtPmh3X3BhcmFtcy0+YmRzX2NudCwKLQkJCSAgICAgIFRPVEFMX0RFU0MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIE5BUEkgcG9sbGluZyBtZXRob2QqLwotc3RhdGljIGludCBiY21nZW5ldF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IGJ1ZGdldCkKLXsKLQlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihuYXBpLAotCQkJc3RydWN0IGJjbWdlbmV0X3ByaXYsIG5hcGkpOwotCXVuc2lnbmVkIGludCB3b3JrX2RvbmU7Ci0KLQl3b3JrX2RvbmUgPSBiY21nZW5ldF9kZXNjX3J4KHByaXYsIGJ1ZGdldCk7Ci0KLQkvKiBBZHZhbmNpbmcgb3VyIGNvbnN1bWVyIGluZGV4Ki8KLQlwcml2LT5yeF9jX2luZGV4ICs9IHdvcmtfZG9uZTsKLQlwcml2LT5yeF9jX2luZGV4ICY9IERNQV9DX0lOREVYX01BU0s7Ci0JYmNtZ2VuZXRfcmRtYV9yaW5nX3dyaXRlbChwcml2LCBERVNDX0lOREVYLAotCQkJCSAgcHJpdi0+cnhfY19pbmRleCwgUkRNQV9DT05TX0lOREVYKTsKLQlpZiAod29ya19kb25lIDwgYnVkZ2V0KSB7Ci0JCW5hcGlfY29tcGxldGUobmFwaSk7Ci0JCWJjbWdlbmV0X2ludHJsMl8wX3dyaXRlbChwcml2LCBVTUFDX0lSUV9SWERNQV9CRE9ORSwKLQkJCQkJIElOVFJMMl9DUFVfTUFTS19DTEVBUik7CisJZm9yIChpID0gMDsgaSA8IHByaXYtPm51bV90eF9iZHM7IGkrKykgeworCQljYiA9IHByaXYtPnR4X2NicyArIGk7CisJCWNiLT5iZF9hZGRyID0gcHJpdi0+dHhfYmRzICsgaSAqIERNQV9ERVNDX1NJWkU7CiAJfQogCi0JcmV0dXJuIHdvcmtfZG9uZTsKKwkvKiBJbml0IHJEbWEgKi8KKwliY21nZW5ldF9yZG1hX3dyaXRlbChwcml2LCBETUFfTUFYX0JVUlNUX0xFTkdUSCwgRE1BX1NDQl9CVVJTVF9TSVpFKTsKKworCS8qIEluaXRpYWxpemUgUnggcXVldWVzICovCisJcmV0ID0gYmNtZ2VuZXRfaW5pdF9yeF9xdWV1ZXMocHJpdi0+ZGV2KTsKKwlpZiAocmV0KSB7CisJCW5ldGRldl9lcnIocHJpdi0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgUnggcXVldWVzXG4iKTsKKwkJYmNtZ2VuZXRfZnJlZV9yeF9idWZmZXJzKHByaXYpOworCQlrZnJlZShwcml2LT5yeF9jYnMpOworCQlrZnJlZShwcml2LT50eF9jYnMpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEluaXQgdERtYSAqLworCWJjbWdlbmV0X3RkbWFfd3JpdGVsKHByaXYsIERNQV9NQVhfQlVSU1RfTEVOR1RILCBETUFfU0NCX0JVUlNUX1NJWkUpOworCisJLyogSW5pdGlhbGl6ZSBUeCBxdWV1ZXMgKi8KKwliY21nZW5ldF9pbml0X3R4X3F1ZXVlcyhwcml2LT5kZXYpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIEludGVycnVwdCBib3R0b20gaGFsZiAqLwpAQCAtMjA2Myw4NyArMjI3NCwxMDAgQEAKIAogCS8qIExpbmsgVVAvRE9XTiBldmVudCAqLwogCWlmICgocHJpdi0+aHdfcGFyYW1zLT5mbGFncyAmIEdFTkVUX0hBU19NRElPX0lOVFIpICYmCi0JICAgIChwcml2LT5pcnEwX3N0YXQgJiAoVU1BQ19JUlFfTElOS19VUHxVTUFDX0lSUV9MSU5LX0RPV04pKSkgeworCSAgICAocHJpdi0+aXJxMF9zdGF0ICYgVU1BQ19JUlFfTElOS19FVkVOVCkpIHsKIAkJcGh5X21hY19pbnRlcnJ1cHQocHJpdi0+cGh5ZGV2LAotCQkJCSAgcHJpdi0+aXJxMF9zdGF0ICYgVU1BQ19JUlFfTElOS19VUCk7Ci0JCXByaXYtPmlycTBfc3RhdCAmPSB+KFVNQUNfSVJRX0xJTktfVVB8VU1BQ19JUlFfTElOS19ET1dOKTsKKwkJCQkgICEhKHByaXYtPmlycTBfc3RhdCAmIFVNQUNfSVJRX0xJTktfVVApKTsKKwkJcHJpdi0+aXJxMF9zdGF0ICY9IH5VTUFDX0lSUV9MSU5LX0VWRU5UOwogCX0KIH0KIAotLyogYmNtZ2VuZXRfaXNyMTogaW50ZXJydXB0IGhhbmRsZXIgZm9yIHJpbmcgYnVmZmVyLiAqLworLyogYmNtZ2VuZXRfaXNyMTogaGFuZGxlIFJ4IGFuZCBUeCBwcmlvcml0eSBxdWV1ZXMgKi8KIHN0YXRpYyBpcnFyZXR1cm5fdCBiY21nZW5ldF9pc3IxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiA9IGRldl9pZDsKLQlzdHJ1Y3QgYmNtZ2VuZXRfdHhfcmluZyAqcmluZzsKKwlzdHJ1Y3QgYmNtZ2VuZXRfcnhfcmluZyAqcnhfcmluZzsKKwlzdHJ1Y3QgYmNtZ2VuZXRfdHhfcmluZyAqdHhfcmluZzsKIAl1bnNpZ25lZCBpbnQgaW5kZXg7CiAKIAkvKiBTYXZlIGlycSBzdGF0dXMgZm9yIGJvdHRvbS1oYWxmIHByb2Nlc3NpbmcuICovCiAJcHJpdi0+aXJxMV9zdGF0ID0KIAkJYmNtZ2VuZXRfaW50cmwyXzFfcmVhZGwocHJpdiwgSU5UUkwyX0NQVV9TVEFUKSAmCiAJCX5iY21nZW5ldF9pbnRybDJfMV9yZWFkbChwcml2LCBJTlRSTDJfQ1BVX01BU0tfU1RBVFVTKTsKKwogCS8qIGNsZWFyIGludGVycnVwdHMgKi8KIAliY21nZW5ldF9pbnRybDJfMV93cml0ZWwocHJpdiwgcHJpdi0+aXJxMV9zdGF0LCBJTlRSTDJfQ1BVX0NMRUFSKTsKIAogCW5ldGlmX2RiZyhwcml2LCBpbnRyLCBwcml2LT5kZXYsCiAJCSAgIiVzOiBJUlE9MHgleFxuIiwgX19mdW5jX18sIHByaXYtPmlycTFfc3RhdCk7CiAKLQkvKiBDaGVjayB0aGUgTUJET05FIGludGVycnVwdHMuCi0JICogcGFja2V0IGlzIGRvbmUsIHJlY2xhaW0gZGVzY3JpcHRvcnMKLQkgKi8KKwkvKiBDaGVjayBSeCBwcmlvcml0eSBxdWV1ZSBpbnRlcnJ1cHRzICovCisJZm9yIChpbmRleCA9IDA7IGluZGV4IDwgcHJpdi0+aHdfcGFyYW1zLT5yeF9xdWV1ZXM7IGluZGV4KyspIHsKKwkJaWYgKCEocHJpdi0+aXJxMV9zdGF0ICYgQklUKFVNQUNfSVJRMV9SWF9JTlRSX1NISUZUICsgaW5kZXgpKSkKKwkJCWNvbnRpbnVlOworCisJCXJ4X3JpbmcgPSAmcHJpdi0+cnhfcmluZ3NbaW5kZXhdOworCisJCWlmIChsaWtlbHkobmFwaV9zY2hlZHVsZV9wcmVwKCZyeF9yaW5nLT5uYXBpKSkpIHsKKwkJCXJ4X3JpbmctPmludF9kaXNhYmxlKHJ4X3JpbmcpOworCQkJX19uYXBpX3NjaGVkdWxlKCZyeF9yaW5nLT5uYXBpKTsKKwkJfQorCX0KKworCS8qIENoZWNrIFR4IHByaW9yaXR5IHF1ZXVlIGludGVycnVwdHMgKi8KIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwcml2LT5od19wYXJhbXMtPnR4X3F1ZXVlczsgaW5kZXgrKykgewogCQlpZiAoIShwcml2LT5pcnExX3N0YXQgJiBCSVQoaW5kZXgpKSkKIAkJCWNvbnRpbnVlOwogCi0JCXJpbmcgPSAmcHJpdi0+dHhfcmluZ3NbaW5kZXhdOworCQl0eF9yaW5nID0gJnByaXYtPnR4X3JpbmdzW2luZGV4XTsKIAotCQlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmcmluZy0+bmFwaSkpKSB7Ci0JCQlyaW5nLT5pbnRfZGlzYWJsZShwcml2LCByaW5nKTsKLQkJCV9fbmFwaV9zY2hlZHVsZSgmcmluZy0+bmFwaSk7CisJCWlmIChsaWtlbHkobmFwaV9zY2hlZHVsZV9wcmVwKCZ0eF9yaW5nLT5uYXBpKSkpIHsKKwkJCXR4X3JpbmctPmludF9kaXNhYmxlKHR4X3JpbmcpOworCQkJX19uYXBpX3NjaGVkdWxlKCZ0eF9yaW5nLT5uYXBpKTsKIAkJfQogCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotLyogYmNtZ2VuZXRfaXNyMDogSGFuZGxlIHZhcmlvdXMgaW50ZXJydXB0cy4gKi8KKy8qIGJjbWdlbmV0X2lzcjA6IGhhbmRsZSBSeCBhbmQgVHggZGVmYXVsdCBxdWV1ZXMgKyBvdGhlciBzdHVmZiAqLwogc3RhdGljIGlycXJldHVybl90IGJjbWdlbmV0X2lzcjAoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewogCXN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2ID0gZGV2X2lkOworCXN0cnVjdCBiY21nZW5ldF9yeF9yaW5nICpyeF9yaW5nOworCXN0cnVjdCBiY21nZW5ldF90eF9yaW5nICp0eF9yaW5nOwogCiAJLyogU2F2ZSBpcnEgc3RhdHVzIGZvciBib3R0b20taGFsZiBwcm9jZXNzaW5nLiAqLwogCXByaXYtPmlycTBfc3RhdCA9CiAJCWJjbWdlbmV0X2ludHJsMl8wX3JlYWRsKHByaXYsIElOVFJMMl9DUFVfU1RBVCkgJgogCQl+YmNtZ2VuZXRfaW50cmwyXzBfcmVhZGwocHJpdiwgSU5UUkwyX0NQVV9NQVNLX1NUQVRVUyk7CisKIAkvKiBjbGVhciBpbnRlcnJ1cHRzICovCiAJYmNtZ2VuZXRfaW50cmwyXzBfd3JpdGVsKHByaXYsIHByaXYtPmlycTBfc3RhdCwgSU5UUkwyX0NQVV9DTEVBUik7CiAKIAluZXRpZl9kYmcocHJpdiwgaW50ciwgcHJpdi0+ZGV2LAogCQkgICJJUlE9MHgleFxuIiwgcHJpdi0+aXJxMF9zdGF0KTsKIAotCWlmIChwcml2LT5pcnEwX3N0YXQgJiAoVU1BQ19JUlFfUlhETUFfQkRPTkUgfCBVTUFDX0lSUV9SWERNQV9QRE9ORSkpIHsKLQkJLyogV2UgdXNlIE5BUEkoc29mdHdhcmUgaW50ZXJydXB0IHRocm90dGxpbmcsIGlmCi0JCSAqIFJ4IERlc2NyaXB0b3IgdGhyb3R0bGluZyBpcyBub3QgdXNlZC4KLQkJICogRGlzYWJsZSBpbnRlcnJ1cHQsIHdpbGwgYmUgZW5hYmxlZCBpbiB0aGUgcG9sbCBtZXRob2QuCi0JCSAqLwotCQlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmcHJpdi0+bmFwaSkpKSB7Ci0JCQliY21nZW5ldF9pbnRybDJfMF93cml0ZWwocHJpdiwgVU1BQ19JUlFfUlhETUFfQkRPTkUsCi0JCQkJCQkgSU5UUkwyX0NQVV9NQVNLX1NFVCk7Ci0JCQlfX25hcGlfc2NoZWR1bGUoJnByaXYtPm5hcGkpOwotCQl9Ci0JfQotCWlmIChwcml2LT5pcnEwX3N0YXQgJgotCQkJKFVNQUNfSVJRX1RYRE1BX0JET05FIHwgVU1BQ19JUlFfVFhETUFfUERPTkUpKSB7Ci0JCXN0cnVjdCBiY21nZW5ldF90eF9yaW5nICpyaW5nID0gJnByaXYtPnR4X3JpbmdzW0RFU0NfSU5ERVhdOworCWlmIChwcml2LT5pcnEwX3N0YXQgJiBVTUFDX0lSUV9SWERNQV9ET05FKSB7CisJCXJ4X3JpbmcgPSAmcHJpdi0+cnhfcmluZ3NbREVTQ19JTkRFWF07CiAKLQkJaWYgKGxpa2VseShuYXBpX3NjaGVkdWxlX3ByZXAoJnJpbmctPm5hcGkpKSkgewotCQkJcmluZy0+aW50X2Rpc2FibGUocHJpdiwgcmluZyk7Ci0JCQlfX25hcGlfc2NoZWR1bGUoJnJpbmctPm5hcGkpOworCQlpZiAobGlrZWx5KG5hcGlfc2NoZWR1bGVfcHJlcCgmcnhfcmluZy0+bmFwaSkpKSB7CisJCQlyeF9yaW5nLT5pbnRfZGlzYWJsZShyeF9yaW5nKTsKKwkJCV9fbmFwaV9zY2hlZHVsZSgmcnhfcmluZy0+bmFwaSk7CiAJCX0KIAl9CisKKwlpZiAocHJpdi0+aXJxMF9zdGF0ICYgVU1BQ19JUlFfVFhETUFfRE9ORSkgeworCQl0eF9yaW5nID0gJnByaXYtPnR4X3JpbmdzW0RFU0NfSU5ERVhdOworCisJCWlmIChsaWtlbHkobmFwaV9zY2hlZHVsZV9wcmVwKCZ0eF9yaW5nLT5uYXBpKSkpIHsKKwkJCXR4X3JpbmctPmludF9kaXNhYmxlKHR4X3JpbmcpOworCQkJX19uYXBpX3NjaGVkdWxlKCZ0eF9yaW5nLT5uYXBpKTsKKwkJfQorCX0KKwogCWlmIChwcml2LT5pcnEwX3N0YXQgJiAoVU1BQ19JUlFfUEhZX0RFVF9SIHwKIAkJCQlVTUFDX0lSUV9QSFlfREVUX0YgfAotCQkJCVVNQUNfSVJRX0xJTktfVVAgfAotCQkJCVVNQUNfSVJRX0xJTktfRE9XTiB8CisJCQkJVU1BQ19JUlFfTElOS19FVkVOVCB8CiAJCQkJVU1BQ19JUlFfSEZCX1NNIHwKIAkJCQlVTUFDX0lSUV9IRkJfTU0gfAogCQkJCVVNQUNfSVJRX01QRF9SKSkgewpAQCAtMjIyNywxOCArMjQ1MSwxNzAgQEAKIAliY21nZW5ldF90ZG1hX3dyaXRlbChwcml2LCByZWcsIERNQV9DVFJMKTsKIH0KIAorc3RhdGljIGJvb2wgYmNtZ2VuZXRfaGZiX2lzX2ZpbHRlcl9lbmFibGVkKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAorCQkJCQkgICB1MzIgZl9pbmRleCkKK3sKKwl1MzIgb2Zmc2V0OworCXUzMiByZWc7CisKKwlvZmZzZXQgPSBIRkJfRkxUX0VOQUJMRV9WM1BMVVMgKyAoZl9pbmRleCA8IDMyKSAqIHNpemVvZih1MzIpOworCXJlZyA9IGJjbWdlbmV0X2hmYl9yZWdfcmVhZGwocHJpdiwgb2Zmc2V0KTsKKwlyZXR1cm4gISEocmVnICYgKDEgPDwgKGZfaW5kZXggJSAzMikpKTsKK30KKworc3RhdGljIHZvaWQgYmNtZ2VuZXRfaGZiX2VuYWJsZV9maWx0ZXIoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsIHUzMiBmX2luZGV4KQoreworCXUzMiBvZmZzZXQ7CisJdTMyIHJlZzsKKworCW9mZnNldCA9IEhGQl9GTFRfRU5BQkxFX1YzUExVUyArIChmX2luZGV4IDwgMzIpICogc2l6ZW9mKHUzMik7CisJcmVnID0gYmNtZ2VuZXRfaGZiX3JlZ19yZWFkbChwcml2LCBvZmZzZXQpOworCXJlZyB8PSAoMSA8PCAoZl9pbmRleCAlIDMyKSk7CisJYmNtZ2VuZXRfaGZiX3JlZ193cml0ZWwocHJpdiwgcmVnLCBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBiY21nZW5ldF9oZmJfc2V0X2ZpbHRlcl9yeF9xdWV1ZV9tYXBwaW5nKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAorCQkJCQkJICAgICB1MzIgZl9pbmRleCwgdTMyIHJ4X3F1ZXVlKQoreworCXUzMiBvZmZzZXQ7CisJdTMyIHJlZzsKKworCW9mZnNldCA9IGZfaW5kZXggLyA4OworCXJlZyA9IGJjbWdlbmV0X3JkbWFfcmVhZGwocHJpdiwgRE1BX0lOREVYMlJJTkdfMCArIG9mZnNldCk7CisJcmVnICY9IH4oMHhGIDw8ICg0ICogKGZfaW5kZXggJSA4KSkpOworCXJlZyB8PSAoKHJ4X3F1ZXVlICYgMHhGKSA8PCAoNCAqIChmX2luZGV4ICUgOCkpKTsKKwliY21nZW5ldF9yZG1hX3dyaXRlbChwcml2LCByZWcsIERNQV9JTkRFWDJSSU5HXzAgKyBvZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBiY21nZW5ldF9oZmJfc2V0X2ZpbHRlcl9sZW5ndGgoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYsCisJCQkJCSAgIHUzMiBmX2luZGV4LCB1MzIgZl9sZW5ndGgpCit7CisJdTMyIG9mZnNldDsKKwl1MzIgcmVnOworCisJb2Zmc2V0ID0gSEZCX0ZMVF9MRU5fVjNQTFVTICsKKwkJICgocHJpdi0+aHdfcGFyYW1zLT5oZmJfZmlsdGVyX2NudCAtIDEgLSBmX2luZGV4KSAvIDQpICoKKwkJIHNpemVvZih1MzIpOworCXJlZyA9IGJjbWdlbmV0X2hmYl9yZWdfcmVhZGwocHJpdiwgb2Zmc2V0KTsKKwlyZWcgJj0gfigweEZGIDw8ICg4ICogKGZfaW5kZXggJSA0KSkpOworCXJlZyB8PSAoKGZfbGVuZ3RoICYgMHhGRikgPDwgKDggKiAoZl9pbmRleCAlIDQpKSk7CisJYmNtZ2VuZXRfaGZiX3JlZ193cml0ZWwocHJpdiwgcmVnLCBvZmZzZXQpOworfQorCitzdGF0aWMgaW50IGJjbWdlbmV0X2hmYl9maW5kX3VudXNlZF9maWx0ZXIoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYpCit7CisJdTMyIGZfaW5kZXg7CisKKwlmb3IgKGZfaW5kZXggPSAwOyBmX2luZGV4IDwgcHJpdi0+aHdfcGFyYW1zLT5oZmJfZmlsdGVyX2NudDsgZl9pbmRleCsrKQorCQlpZiAoIWJjbWdlbmV0X2hmYl9pc19maWx0ZXJfZW5hYmxlZChwcml2LCBmX2luZGV4KSkKKwkJCXJldHVybiBmX2luZGV4OworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIGJjbWdlbmV0X2hmYl9hZGRfZmlsdGVyCisgKgorICogQWRkIG5ldyBmaWx0ZXIgdG8gSGFyZHdhcmUgRmlsdGVyIEJsb2NrIHRvIG1hdGNoIGFuZCBkaXJlY3QgUnggdHJhZmZpYyB0bworICogZGVzaXJlZCBSeCBxdWV1ZS4KKyAqCisgKiBmX2RhdGEgaXMgYW4gYXJyYXkgb2YgdW5zaWduZWQgMzItYml0IGludGVnZXJzIHdoZXJlIGVhY2ggMzItYml0IGludGVnZXIKKyAqIHByb3ZpZGVzIGZpbHRlciBkYXRhIGZvciAyIGJ5dGVzICg0IG5pYmJsZXMpIG9mIFJ4IGZyYW1lOgorICoKKyAqIGJpdHMgMzE6MjAgLSB1bnVzZWQKKyAqIGJpdCAgMTkgICAgLSBuaWJibGUgMCBtYXRjaCBlbmFibGUKKyAqIGJpdCAgMTggICAgLSBuaWJibGUgMSBtYXRjaCBlbmFibGUKKyAqIGJpdCAgMTcgICAgLSBuaWJibGUgMiBtYXRjaCBlbmFibGUKKyAqIGJpdCAgMTYgICAgLSBuaWJibGUgMyBtYXRjaCBlbmFibGUKKyAqIGJpdHMgMTU6MTIgLSBuaWJibGUgMCBkYXRhCisgKiBiaXRzIDExOjggIC0gbmliYmxlIDEgZGF0YQorICogYml0cyA3OjQgICAtIG5pYmJsZSAyIGRhdGEKKyAqIGJpdHMgMzowICAgLSBuaWJibGUgMyBkYXRhCisgKgorICogRXhhbXBsZToKKyAqIEluIG9yZGVyIHRvIG1hdGNoOgorICogLSBFdGhlcm5ldCBmcmFtZSB0eXBlID0gMHgwODAwIChJUCkKKyAqIC0gSVAgdmVyc2lvbiBmaWVsZCA9IDQKKyAqIC0gSVAgcHJvdG9jb2wgZmllbGQgPSAweDExIChVRFApCisgKgorICogVGhlIGZvbGxvd2luZyBmaWx0ZXIgaXMgbmVlZGVkOgorICogdTMyIGhmYl9maWx0ZXJfaXB2NF91ZHBbXSA9IHsKKyAqICAgUnggZnJhbWUgb2Zmc2V0IDB4MDA6IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisgKiAgIFJ4IGZyYW1lIG9mZnNldCAweDA4OiAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMEYwODAwLCAweDAwMDg0MDAwLAorICogICBSeCBmcmFtZSBvZmZzZXQgMHgxMDogMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAzMDAxMSwKKyAqIH07CisgKgorICogVG8gYWRkIHRoZSBmaWx0ZXIgdG8gSEZCIGFuZCBkaXJlY3QgdGhlIHRyYWZmaWMgdG8gUnggcXVldWUgMCwgY2FsbDoKKyAqIGJjbWdlbmV0X2hmYl9hZGRfZmlsdGVyKHByaXYsIGhmYl9maWx0ZXJfaXB2NF91ZHAsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBBUlJBWV9TSVpFKGhmYl9maWx0ZXJfaXB2NF91ZHApLCAwKTsKKyAqLworaW50IGJjbWdlbmV0X2hmYl9hZGRfZmlsdGVyKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LCB1MzIgKmZfZGF0YSwKKwkJCSAgICB1MzIgZl9sZW5ndGgsIHUzMiByeF9xdWV1ZSkKK3sKKwlpbnQgZl9pbmRleDsKKwl1MzIgaTsKKworCWZfaW5kZXggPSBiY21nZW5ldF9oZmJfZmluZF91bnVzZWRfZmlsdGVyKHByaXYpOworCWlmIChmX2luZGV4IDwgMCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoZl9sZW5ndGggPiBwcml2LT5od19wYXJhbXMtPmhmYl9maWx0ZXJfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgZl9sZW5ndGg7IGkrKykKKwkJYmNtZ2VuZXRfaGZiX3dyaXRlbChwcml2LCBmX2RhdGFbaV0sCisJCQkoZl9pbmRleCAqIHByaXYtPmh3X3BhcmFtcy0+aGZiX2ZpbHRlcl9zaXplICsgaSkgKgorCQkJc2l6ZW9mKHUzMikpOworCisJYmNtZ2VuZXRfaGZiX3NldF9maWx0ZXJfbGVuZ3RoKHByaXYsIGZfaW5kZXgsIDIgKiBmX2xlbmd0aCk7CisJYmNtZ2VuZXRfaGZiX3NldF9maWx0ZXJfcnhfcXVldWVfbWFwcGluZyhwcml2LCBmX2luZGV4LCByeF9xdWV1ZSk7CisJYmNtZ2VuZXRfaGZiX2VuYWJsZV9maWx0ZXIocHJpdiwgZl9pbmRleCk7CisJYmNtZ2VuZXRfaGZiX3JlZ193cml0ZWwocHJpdiwgMHgxLCBIRkJfQ1RSTCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogYmNtZ2VuZXRfaGZiX2NsZWFyCisgKgorICogQ2xlYXIgSGFyZHdhcmUgRmlsdGVyIEJsb2NrIGFuZCBkaXNhYmxlIGFsbCBmaWx0ZXJpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGJjbWdlbmV0X2hmYl9jbGVhcihzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdikKK3sKKwl1MzIgaTsKKworCWJjbWdlbmV0X2hmYl9yZWdfd3JpdGVsKHByaXYsIDB4MCwgSEZCX0NUUkwpOworCWJjbWdlbmV0X2hmYl9yZWdfd3JpdGVsKHByaXYsIDB4MCwgSEZCX0ZMVF9FTkFCTEVfVjNQTFVTKTsKKwliY21nZW5ldF9oZmJfcmVnX3dyaXRlbChwcml2LCAweDAsIEhGQl9GTFRfRU5BQkxFX1YzUExVUyArIDQpOworCisJZm9yIChpID0gRE1BX0lOREVYMlJJTkdfMDsgaSA8PSBETUFfSU5ERVgyUklOR183OyBpKyspCisJCWJjbWdlbmV0X3JkbWFfd3JpdGVsKHByaXYsIDB4MCwgaSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHByaXYtPmh3X3BhcmFtcy0+aGZiX2ZpbHRlcl9jbnQgLyA0KTsgaSsrKQorCQliY21nZW5ldF9oZmJfcmVnX3dyaXRlbChwcml2LCAweDAsCisJCQkJCUhGQl9GTFRfTEVOX1YzUExVUyArIGkgKiBzaXplb2YodTMyKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLT5oZmJfZmlsdGVyX2NudCAqCisJCQlwcml2LT5od19wYXJhbXMtPmhmYl9maWx0ZXJfc2l6ZTsgaSsrKQorCQliY21nZW5ldF9oZmJfd3JpdGVsKHByaXYsIDB4MCwgaSAqIHNpemVvZih1MzIpKTsKK30KKworc3RhdGljIHZvaWQgYmNtZ2VuZXRfaGZiX2luaXQoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYpCit7CisJaWYgKEdFTkVUX0lTX1YxKHByaXYpIHx8IEdFTkVUX0lTX1YyKHByaXYpKQorCQlyZXR1cm47CisKKwliY21nZW5ldF9oZmJfY2xlYXIocHJpdik7Cit9CisKIHN0YXRpYyB2b2lkIGJjbWdlbmV0X25ldGlmX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJLyogU3RhcnQgdGhlIG5ldHdvcmsgZW5naW5lICovCi0JbmFwaV9lbmFibGUoJnByaXYtPm5hcGkpOworCWJjbWdlbmV0X2VuYWJsZV9yeF9uYXBpKHByaXYpOworCWJjbWdlbmV0X2VuYWJsZV90eF9uYXBpKHByaXYpOwogCiAJdW1hY19lbmFibGVfc2V0KHByaXYsIENNRF9UWF9FTiB8IENNRF9SWF9FTiwgdHJ1ZSk7CiAKLQlpZiAocGh5X2lzX2ludGVybmFsKHByaXYtPnBoeWRldikpCi0JCWJjbWdlbmV0X3Bvd2VyX3VwKHByaXYsIEdFTkVUX1BPV0VSX1BBU1NJVkUpOwotCiAJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhkZXYpOwogCiAJcGh5X3N0YXJ0KHByaXYtPnBoeWRldik7CkBAIC0yMjU3LDYgKzI2MzMsMTIgQEAKIAlpZiAoIUlTX0VSUihwcml2LT5jbGspKQogCQljbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+Y2xrKTsKIAorCS8qIElmIHRoaXMgaXMgYW4gaW50ZXJuYWwgR1BIWSwgcG93ZXIgaXQgYmFjayBvbiBub3csIGJlZm9yZSBVbmlNQUMgaXMKKwkgKiBicm91Z2h0IG91dCBvZiByZXNldCBhcyBhYnNvbHV0ZWx5IG5vIFVuaU1BQyBhY3Rpdml0eSBpcyBhbGxvd2VkCisJICovCisJaWYgKHBoeV9pc19pbnRlcm5hbChwcml2LT5waHlkZXYpKQorCQliY21nZW5ldF9wb3dlcl91cChwcml2LCBHRU5FVF9QT1dFUl9QQVNTSVZFKTsKKwogCS8qIHRha2UgTUFDIG91dCBvZiByZXNldCAqLwogCWJjbWdlbmV0X3VtYWNfcmVzZXQocHJpdik7CiAKQEAgLTIyODYsMTIgKzI2NjgsMTUgQEAKIAlyZXQgPSBiY21nZW5ldF9pbml0X2RtYShwcml2KTsKIAlpZiAocmV0KSB7CiAJCW5ldGRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgRE1BXG4iKTsKLQkJZ290byBlcnJfZmluaV9kbWE7CisJCWdvdG8gZXJyX2Nsa19kaXNhYmxlOwogCX0KIAogCS8qIEFsd2F5cyBlbmFibGUgcmluZyAxNiAtIGRlc2NyaXB0b3IgcmluZyAqLwogCWJjbWdlbmV0X2VuYWJsZV9kbWEocHJpdiwgZG1hX2N0cmwpOwogCisJLyogSEZCIGluaXQgKi8KKwliY21nZW5ldF9oZmJfaW5pdChwcml2KTsKKwogCXJldCA9IHJlcXVlc3RfaXJxKHByaXYtPmlycTAsIGJjbWdlbmV0X2lzcjAsIElSUUZfU0hBUkVELAogCQkJICBkZXYtPm5hbWUsIHByaXYpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0yMzMxLDEwICsyNzE2LDEwIEBACiAJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKGRldik7Ci0JbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKIAlwaHlfc3RvcChwcml2LT5waHlkZXYpOwotCiAJYmNtZ2VuZXRfaW50cl9kaXNhYmxlKHByaXYpOworCWJjbWdlbmV0X2Rpc2FibGVfcnhfbmFwaShwcml2KTsKKwliY21nZW5ldF9kaXNhYmxlX3R4X25hcGkocHJpdik7CiAKIAkvKiBXYWl0IGZvciBwZW5kaW5nIHdvcmsgaXRlbXMgdG8gY29tcGxldGUuIFNpbmNlIGludGVycnVwdHMgYXJlCiAJICogZGlzYWJsZWQgbm8gbmV3IHdvcmsgd2lsbCBiZSBzY2hlZHVsZWQuCkBAIC0yMzc3LDEyICsyNzYyLDEyIEBACiAJZnJlZV9pcnEocHJpdi0+aXJxMSwgcHJpdik7CiAKIAlpZiAocGh5X2lzX2ludGVybmFsKHByaXYtPnBoeWRldikpCi0JCWJjbWdlbmV0X3Bvd2VyX2Rvd24ocHJpdiwgR0VORVRfUE9XRVJfUEFTU0lWRSk7CisJCXJldCA9IGJjbWdlbmV0X3Bvd2VyX2Rvd24ocHJpdiwgR0VORVRfUE9XRVJfUEFTU0lWRSk7CiAKIAlpZiAoIUlTX0VSUihwcml2LT5jbGspKQogCQljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGJjbWdlbmV0X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTI0OTksOCArMjg4NCw5IEBACiBzdGF0aWMgc3RydWN0IGJjbWdlbmV0X2h3X3BhcmFtcyBiY21nZW5ldF9od19wYXJhbXNbXSA9IHsKIAlbR0VORVRfVjFdID0gewogCQkudHhfcXVldWVzID0gMCwKKwkJLnR4X2Jkc19wZXJfcSA9IDAsCiAJCS5yeF9xdWV1ZXMgPSAwLAotCQkuYmRzX2NudCA9IDAsCisJCS5yeF9iZHNfcGVyX3EgPSAwLAogCQkuYnBfaW5fZW5fc2hpZnQgPSAxNiwKIAkJLmJwX2luX21hc2sgPSAweGZmZmYsCiAJCS5oZmJfZmlsdGVyX2NudCA9IDE2LApAQCAtMjUxMiw4ICsyODk4LDkgQEAKIAl9LAogCVtHRU5FVF9WMl0gPSB7CiAJCS50eF9xdWV1ZXMgPSA0LAotCQkucnhfcXVldWVzID0gNCwKLQkJLmJkc19jbnQgPSAzMiwKKwkJLnR4X2Jkc19wZXJfcSA9IDMyLAorCQkucnhfcXVldWVzID0gMCwKKwkJLnJ4X2Jkc19wZXJfcSA9IDAsCiAJCS5icF9pbl9lbl9zaGlmdCA9IDE2LAogCQkuYnBfaW5fbWFzayA9IDB4ZmZmZiwKIAkJLmhmYl9maWx0ZXJfY250ID0gMTYsCkBAIC0yNTI4LDExICsyOTE1LDEzIEBACiAJfSwKIAlbR0VORVRfVjNdID0gewogCQkudHhfcXVldWVzID0gNCwKLQkJLnJ4X3F1ZXVlcyA9IDQsCi0JCS5iZHNfY250ID0gMzIsCisJCS50eF9iZHNfcGVyX3EgPSAzMiwKKwkJLnJ4X3F1ZXVlcyA9IDAsCisJCS5yeF9iZHNfcGVyX3EgPSAwLAogCQkuYnBfaW5fZW5fc2hpZnQgPSAxNywKIAkJLmJwX2luX21hc2sgPSAweDFmZmZmLAogCQkuaGZiX2ZpbHRlcl9jbnQgPSA0OCwKKwkJLmhmYl9maWx0ZXJfc2l6ZSA9IDEyOCwKIAkJLnF0YWdfbWFzayA9IDB4M0YsCiAJCS50YnVmX29mZnNldCA9IDB4MDYwMCwKIAkJLmhmYl9vZmZzZXQgPSAweDgwMDAsCkBAIC0yNTQwLDE1ICsyOTI5LDE4IEBACiAJCS5yZG1hX29mZnNldCA9IDB4MTAwMDAsCiAJCS50ZG1hX29mZnNldCA9IDB4MTEwMDAsCiAJCS53b3Jkc19wZXJfYmQgPSAyLAotCQkuZmxhZ3MgPSBHRU5FVF9IQVNfRVhUIHwgR0VORVRfSEFTX01ESU9fSU5UUiwKKwkJLmZsYWdzID0gR0VORVRfSEFTX0VYVCB8IEdFTkVUX0hBU19NRElPX0lOVFIgfAorCQkJIEdFTkVUX0hBU19NT0NBX0xJTktfREVULAogCX0sCiAJW0dFTkVUX1Y0XSA9IHsKIAkJLnR4X3F1ZXVlcyA9IDQsCi0JCS5yeF9xdWV1ZXMgPSA0LAotCQkuYmRzX2NudCA9IDMyLAorCQkudHhfYmRzX3Blcl9xID0gMzIsCisJCS5yeF9xdWV1ZXMgPSAwLAorCQkucnhfYmRzX3Blcl9xID0gMCwKIAkJLmJwX2luX2VuX3NoaWZ0ID0gMTcsCiAJCS5icF9pbl9tYXNrID0gMHgxZmZmZiwKIAkJLmhmYl9maWx0ZXJfY250ID0gNDgsCisJCS5oZmJfZmlsdGVyX3NpemUgPSAxMjgsCiAJCS5xdGFnX21hc2sgPSAweDNGLAogCQkudGJ1Zl9vZmZzZXQgPSAweDA2MDAsCiAJCS5oZmJfb2Zmc2V0ID0gMHg4MDAwLApAQCAtMjU1Niw3ICsyOTQ4LDggQEAKIAkJLnJkbWFfb2Zmc2V0ID0gMHgyMDAwLAogCQkudGRtYV9vZmZzZXQgPSAweDQwMDAsCiAJCS53b3Jkc19wZXJfYmQgPSAzLAotCQkuZmxhZ3MgPSBHRU5FVF9IQVNfNDBCSVRTIHwgR0VORVRfSEFTX0VYVCB8IEdFTkVUX0hBU19NRElPX0lOVFIsCisJCS5mbGFncyA9IEdFTkVUX0hBU180MEJJVFMgfCBHRU5FVF9IQVNfRVhUIHwKKwkJCSBHRU5FVF9IQVNfTURJT19JTlRSIHwgR0VORVRfSEFTX01PQ0FfTElOS19ERVQsCiAJfSwKIH07CiAKQEAgLTI2NDUsMTQgKzMwMzgsMTUgQEAKICNlbmRpZgogCiAJcHJfZGVidWcoIkNvbmZpZ3VyYXRpb24gZm9yIHZlcnNpb246ICVkXG4iCi0JCSJUWHE6ICUxZCwgUlhxOiAlMWQsIEJEczogJTFkXG4iCisJCSJUWHE6ICUxZCwgVFhxQkRzOiAlMWQsIFJYcTogJTFkLCBSWHFCRHM6ICUxZFxuIgogCQkiQlAgPDwgZW46ICUyZCwgQlAgbXNrOiAweCUwNXhcbiIKIAkJIkhGQiBjb3VudDogJTJkLCBRVEFRIG1zazogMHglMDV4XG4iCiAJCSJUQlVGOiAweCUwNHgsIEhGQjogMHglMDR4LCBIRkJyZWc6IDB4JTA0eFxuIgogCQkiUkRNQTogMHglMDV4LCBURE1BOiAweCUwNXhcbiIKIAkJIldvcmRzL0JEOiAlZFxuIiwKIAkJcHJpdi0+dmVyc2lvbiwKLQkJcGFyYW1zLT50eF9xdWV1ZXMsIHBhcmFtcy0+cnhfcXVldWVzLCBwYXJhbXMtPmJkc19jbnQsCisJCXBhcmFtcy0+dHhfcXVldWVzLCBwYXJhbXMtPnR4X2Jkc19wZXJfcSwKKwkJcGFyYW1zLT5yeF9xdWV1ZXMsIHBhcmFtcy0+cnhfYmRzX3Blcl9xLAogCQlwYXJhbXMtPmJwX2luX2VuX3NoaWZ0LCBwYXJhbXMtPmJwX2luX21hc2ssCiAJCXBhcmFtcy0+aGZiX2ZpbHRlcl9jbnQsIHBhcmFtcy0+cXRhZ19tYXNrLAogCQlwYXJhbXMtPnRidWZfb2Zmc2V0LCBwYXJhbXMtPmhmYl9vZmZzZXQsCkBAIC0yNjgwLDggKzMwNzQsOSBAQAogCXN0cnVjdCByZXNvdXJjZSAqcjsKIAlpbnQgZXJyID0gLUVJTzsKIAotCS8qIFVwIHRvIEdFTkVUX01BWF9NUV9DTlQgKyAxIFRYIHF1ZXVlcyBhbmQgYSBzaW5nbGUgUlggcXVldWUgKi8KLQlkZXYgPSBhbGxvY19ldGhlcmRldl9tcXMoc2l6ZW9mKCpwcml2KSwgR0VORVRfTUFYX01RX0NOVCArIDEsIDEpOworCS8qIFVwIHRvIEdFTkVUX01BWF9NUV9DTlQgKyAxIFRYIHF1ZXVlcyBhbmQgUlggcXVldWVzICovCisJZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXFzKHNpemVvZigqcHJpdiksIEdFTkVUX01BWF9NUV9DTlQgKyAxLAorCQkJCSBHRU5FVF9NQVhfTVFfQ05UICsgMSk7CiAJaWYgKCFkZXYpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgbmV0IGRldmljZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjcyNyw3ICszMTIyLDYgQEAKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gMiAqIEhaOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmYmNtZ2VuZXRfZXRodG9vbF9vcHM7CiAJZGV2LT5uZXRkZXZfb3BzID0gJmJjbWdlbmV0X25ldGRldl9vcHM7Ci0JbmV0aWZfbmFwaV9hZGQoZGV2LCAmcHJpdi0+bmFwaSwgYmNtZ2VuZXRfcG9sbCwgNjQpOwogCiAJcHJpdi0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KC0xLCBHRU5FVF9NU0dfREVGQVVMVCk7CiAKQEAgLTI4NjAsMTQgKzMyNTQsMTYgQEAKIAogCS8qIFByZXBhcmUgdGhlIGRldmljZSBmb3IgV2FrZS1vbi1MQU4gYW5kIHN3aXRjaCB0byB0aGUgc2xvdyBjbG9jayAqLwogCWlmIChkZXZpY2VfbWF5X3dha2V1cChkKSAmJiBwcml2LT53b2xvcHRzKSB7Ci0JCWJjbWdlbmV0X3Bvd2VyX2Rvd24ocHJpdiwgR0VORVRfUE9XRVJfV09MX01BR0lDKTsKKwkJcmV0ID0gYmNtZ2VuZXRfcG93ZXJfZG93bihwcml2LCBHRU5FVF9QT1dFUl9XT0xfTUFHSUMpOwogCQljbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+Y2xrX3dvbCk7CisJfSBlbHNlIGlmIChwaHlfaXNfaW50ZXJuYWwocHJpdi0+cGh5ZGV2KSkgeworCQlyZXQgPSBiY21nZW5ldF9wb3dlcl9kb3duKHByaXYsIEdFTkVUX1BPV0VSX1BBU1NJVkUpOwogCX0KIAogCS8qIFR1cm4gb2ZmIHRoZSBjbG9ja3MgKi8KIAljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+Y2xrKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYmNtZ2VuZXRfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmQpCkBAIC0yODg2LDYgKzMyODIsMTIgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJLyogSWYgdGhpcyBpcyBhbiBpbnRlcm5hbCBHUEhZLCBwb3dlciBpdCBiYWNrIG9uIG5vdywgYmVmb3JlIFVuaU1BQyBpcworCSAqIGJyb3VnaHQgb3V0IG9mIHJlc2V0IGFzIGFic29sdXRlbHkgbm8gVW5pTUFDIGFjdGl2aXR5IGlzIGFsbG93ZWQKKwkgKi8KKwlpZiAocGh5X2lzX2ludGVybmFsKHByaXYtPnBoeWRldikpCisJCWJjbWdlbmV0X3Bvd2VyX3VwKHByaXYsIEdFTkVUX1BPV0VSX1BBU1NJVkUpOworCiAJYmNtZ2VuZXRfdW1hY19yZXNldChwcml2KTsKIAogCXJldCA9IGluaXRfdW1hYyhwcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9nZW5ldC9iY21nZW5ldC5oCmluZGV4IDBkMzcwZDEuLjZmMjg4N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbWdlbmV0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtZ2VuZXQuaApAQCAtMjkzLDYgKzI5Myw3IEBACiAjZGVmaW5lIFVNQUNfSVJRX1BIWV9ERVRfRgkJKDEgPDwgMykKICNkZWZpbmUgVU1BQ19JUlFfTElOS19VUAkJKDEgPDwgNCkKICNkZWZpbmUgVU1BQ19JUlFfTElOS19ET1dOCQkoMSA8PCA1KQorI2RlZmluZSBVTUFDX0lSUV9MSU5LX0VWRU5UCQkoVU1BQ19JUlFfTElOS19VUCB8IFVNQUNfSVJRX0xJTktfRE9XTikKICNkZWZpbmUgVU1BQ19JUlFfVU1BQwkJCSgxIDw8IDYpCiAjZGVmaW5lIFVNQUNfSVJRX1VNQUNfVFNWCQkoMSA8PCA3KQogI2RlZmluZSBVTUFDX0lSUV9UQlVGX1VOREVSUlVOCQkoMSA8PCA4KQpAQCAtMzAzLDEzICszMDQsMjIgQEAKICNkZWZpbmUgVU1BQ19JUlFfUlhETUFfTUJET05FCQkoMSA8PCAxMykKICNkZWZpbmUgVU1BQ19JUlFfUlhETUFfUERPTkUJCSgxIDw8IDE0KQogI2RlZmluZSBVTUFDX0lSUV9SWERNQV9CRE9ORQkJKDEgPDwgMTUpCisjZGVmaW5lIFVNQUNfSVJRX1JYRE1BX0RPTkUJCShVTUFDX0lSUV9SWERNQV9QRE9ORSB8IFwKKwkJCQkJIFVNQUNfSVJRX1JYRE1BX0JET05FKQogI2RlZmluZSBVTUFDX0lSUV9UWERNQV9NQkRPTkUJCSgxIDw8IDE2KQogI2RlZmluZSBVTUFDX0lSUV9UWERNQV9QRE9ORQkJKDEgPDwgMTcpCiAjZGVmaW5lIFVNQUNfSVJRX1RYRE1BX0JET05FCQkoMSA8PCAxOCkKKyNkZWZpbmUgVU1BQ19JUlFfVFhETUFfRE9ORQkJKFVNQUNfSVJRX1RYRE1BX1BET05FIHwgXAorCQkJCQkgVU1BQ19JUlFfVFhETUFfQkRPTkUpCiAvKiBPbmx5IHZhbGlkIGZvciBHRU5FVHYzKyAqLwogI2RlZmluZSBVTUFDX0lSUV9NRElPX0RPTkUJCSgxIDw8IDIzKQogI2RlZmluZSBVTUFDX0lSUV9NRElPX0VSUk9SCQkoMSA8PCAyNCkKIAorLyogSU5UUkwyIGluc3RhbmNlIDEgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVU1BQ19JUlExX1RYX0lOVFJfTUFTSwkJMHhGRkZGCisjZGVmaW5lIFVNQUNfSVJRMV9SWF9JTlRSX01BU0sJCTB4RkZGRgorI2RlZmluZSBVTUFDX0lSUTFfUlhfSU5UUl9TSElGVAkJMTYKKwogLyogUmVnaXN0ZXIgYmxvY2sgb2Zmc2V0cyAqLwogI2RlZmluZSBHRU5FVF9TWVNfT0ZGCQkJMHgwMDAwCiAjZGVmaW5lIEdFTkVUX0dSX0JSSURHRV9PRkYJCTB4MDA0MApAQCAtMzU0LDYgKzM2NCw3IEBACiAjZGVmaW5lIEVYVF9HUEhZX0NUUkwJCQkweDFDCiAjZGVmaW5lICBFWFRfQ0ZHX0lERFFfQklBUwkJKDEgPDwgMCkKICNkZWZpbmUgIEVYVF9DRkdfUFdSX0RPV04JCSgxIDw8IDEpCisjZGVmaW5lICBFWFRfQ0syNV9ESVMJCQkoMSA8PCA0KQogI2RlZmluZSAgRVhUX0dQSFlfUkVTRVQJCQkoMSA8PCA1KQogCiAvKiBETUEgcmluZ3Mgc2l6ZSAqLwpAQCAtNDk3LDE3ICs1MDgsMjAgQEAKICNkZWZpbmUgR0VORVRfSEFTXzQwQklUUwkoMSA8PCAwKQogI2RlZmluZSBHRU5FVF9IQVNfRVhUCQkoMSA8PCAxKQogI2RlZmluZSBHRU5FVF9IQVNfTURJT19JTlRSCSgxIDw8IDIpCisjZGVmaW5lIEdFTkVUX0hBU19NT0NBX0xJTktfREVUCSgxIDw8IDMpCiAKIC8qIEJDTUdFTkVUIGhhcmR3YXJlIHBhcmFtZXRlcnMsIGtlZXAgdGhpcyBzdHJ1Y3R1cmUgbmljZWx5IGFsaWduZWQKICAqIHNpbmNlIGl0IGlzIGdvaW5nIHRvIGJlIHVzZWQgaW4gaG90IHBhdGhzCiAgKi8KIHN0cnVjdCBiY21nZW5ldF9od19wYXJhbXMgewogCXU4CQl0eF9xdWV1ZXM7CisJdTgJCXR4X2Jkc19wZXJfcTsKIAl1OAkJcnhfcXVldWVzOwotCXU4CQliZHNfY250OworCXU4CQlyeF9iZHNfcGVyX3E7CiAJdTgJCWJwX2luX2VuX3NoaWZ0OwogCXUzMgkJYnBfaW5fbWFzazsKIAl1OAkJaGZiX2ZpbHRlcl9jbnQ7CisJdTgJCWhmYl9maWx0ZXJfc2l6ZTsKIAl1OAkJcXRhZ19tYXNrOwogCXUxNgkJdGJ1Zl9vZmZzZXQ7CiAJdTMyCQloZmJfb2Zmc2V0OwpAQCAtNTI1LDE2ICs1MzksMzAgQEAKIAl1bnNpZ25lZCBpbnQJcXVldWU7CQkvKiBxdWV1ZSBpbmRleCAqLwogCXN0cnVjdCBlbmV0X2NiCSpjYnM7CQkvKiB0eCByaW5nIGJ1ZmZlciBjb250cm9sIGJsb2NrKi8KIAl1bnNpZ25lZCBpbnQJc2l6ZTsJCS8qIHNpemUgb2YgZWFjaCB0eCByaW5nICovCisJdW5zaWduZWQgaW50ICAgIGNsZWFuX3B0cjsgICAgICAvKiBUeCByaW5nIGNsZWFuIHBvaW50ZXIgKi8KIAl1bnNpZ25lZCBpbnQJY19pbmRleDsJLyogbGFzdCBjb25zdW1lciBpbmRleCBvZiBlYWNoIHJpbmcqLwogCXVuc2lnbmVkIGludAlmcmVlX2JkczsJLyogIyBvZiBmcmVlIGJkcyBmb3IgZWFjaCByaW5nICovCiAJdW5zaWduZWQgaW50CXdyaXRlX3B0cjsJLyogVHggcmluZyB3cml0ZSBwb2ludGVyIFNXIGNvcHkgKi8KIAl1bnNpZ25lZCBpbnQJcHJvZF9pbmRleDsJLyogVHggcmluZyBwcm9kdWNlciBpbmRleCBTVyBjb3B5ICovCiAJdW5zaWduZWQgaW50CWNiX3B0cjsJCS8qIFR4IHJpbmcgaW5pdGlhbCBDQiBwdHIgKi8KIAl1bnNpZ25lZCBpbnQJZW5kX3B0cjsJLyogVHggcmluZyBlbmQgQ0IgcHRyICovCi0Jdm9pZCAoKmludF9lbmFibGUpKHN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2LAotCQkJICAgc3RydWN0IGJjbWdlbmV0X3R4X3JpbmcgKik7Ci0Jdm9pZCAoKmludF9kaXNhYmxlKShzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgYmNtZ2VuZXRfdHhfcmluZyAqKTsKKwl2b2lkICgqaW50X2VuYWJsZSkoc3RydWN0IGJjbWdlbmV0X3R4X3JpbmcgKik7CisJdm9pZCAoKmludF9kaXNhYmxlKShzdHJ1Y3QgYmNtZ2VuZXRfdHhfcmluZyAqKTsKKwlzdHJ1Y3QgYmNtZ2VuZXRfcHJpdiAqcHJpdjsKK307CisKK3N0cnVjdCBiY21nZW5ldF9yeF9yaW5nIHsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsJLyogUnggTkFQSSBzdHJ1Y3QgKi8KKwl1bnNpZ25lZCBpbnQJaW5kZXg7CQkvKiBSeCByaW5nIGluZGV4ICovCisJc3RydWN0IGVuZXRfY2IJKmNiczsJCS8qIFJ4IHJpbmcgYnVmZmVyIGNvbnRyb2wgYmxvY2sgKi8KKwl1bnNpZ25lZCBpbnQJc2l6ZTsJCS8qIFJ4IHJpbmcgc2l6ZSAqLworCXVuc2lnbmVkIGludAljX2luZGV4OwkvKiBSeCBsYXN0IGNvbnN1bWVyIGluZGV4ICovCisJdW5zaWduZWQgaW50CXJlYWRfcHRyOwkvKiBSeCByaW5nIHJlYWQgcG9pbnRlciAqLworCXVuc2lnbmVkIGludAljYl9wdHI7CQkvKiBSeCByaW5nIGluaXRpYWwgQ0IgcHRyICovCisJdW5zaWduZWQgaW50CWVuZF9wdHI7CS8qIFJ4IHJpbmcgZW5kIENCIHB0ciAqLworCXVuc2lnbmVkIGludAlvbGRfZGlzY2FyZHM7CisJdm9pZCAoKmludF9lbmFibGUpKHN0cnVjdCBiY21nZW5ldF9yeF9yaW5nICopOworCXZvaWQgKCppbnRfZGlzYWJsZSkoc3RydWN0IGJjbWdlbmV0X3J4X3JpbmcgKik7CiAJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXY7CiB9OwogCkBAIC01NDMsMTEgKzU3MSw2IEBACiAJdm9pZCBfX2lvbWVtICpiYXNlOwogCWVudW0gYmNtZ2VuZXRfdmVyc2lvbiB2ZXJzaW9uOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JdTMyIGludDBfbWFzazsKLQl1MzIgaW50MV9tYXNrOwotCi0JLyogTkFQSSBmb3IgZGVzY3JpcHRvciBiYXNlZCByeCAqLwotCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAogCS8qIHRyYW5zbWl0IHZhcmlhYmxlcyAqLwogCXZvaWQgX19pb21lbSAqdHhfYmRzOwpAQCAtNTU4LDEzICs1ODEsMTEgQEAKIAogCS8qIHJlY2VpdmUgdmFyaWFibGVzICovCiAJdm9pZCBfX2lvbWVtICpyeF9iZHM7Ci0Jdm9pZCBfX2lvbWVtICpyeF9iZF9hc3NpZ25fcHRyOwotCWludCByeF9iZF9hc3NpZ25faW5kZXg7CiAJc3RydWN0IGVuZXRfY2IgKnJ4X2NiczsKIAl1bnNpZ25lZCBpbnQgbnVtX3J4X2JkczsKIAl1bnNpZ25lZCBpbnQgcnhfYnVmX2xlbjsKLQl1bnNpZ25lZCBpbnQgcnhfcmVhZF9wdHI7Ci0JdW5zaWduZWQgaW50IHJ4X2NfaW5kZXg7CisKKwlzdHJ1Y3QgYmNtZ2VuZXRfcnhfcmluZyByeF9yaW5nc1tERVNDX0lOREVYICsgMV07CiAKIAkvKiBvdGhlciBtaXNjIHZhcmlhYmxlcyAqLwogCXN0cnVjdCBiY21nZW5ldF9od19wYXJhbXMgKmh3X3BhcmFtczsKQEAgLTY1MSw2ICs2NzIsNyBAQAogaW50IGJjbWdlbmV0X21paV9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCBpbml0KTsKIHZvaWQgYmNtZ2VuZXRfbWlpX2V4aXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiB2b2lkIGJjbWdlbmV0X21paV9yZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3ZvaWQgYmNtZ2VuZXRfcGh5X3Bvd2VyX3NldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIGVuYWJsZSk7CiB2b2lkIGJjbWdlbmV0X21paV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogLyogV2FrZS1vbi1MQU4gcm91dGluZXMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2dlbmV0L2JjbW1paS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtbWlpLmMKaW5kZXggNDQ2ODg5Yy4uZTc2NTFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtbWlpLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vZ2VuZXQvYmNtbWlpLmMKQEAgLTE2OCw3ICsxNjgsNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYmNtZ2VuZXRfZXBoeV9wb3dlcl91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQordm9pZCBiY21nZW5ldF9waHlfcG93ZXJfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQogewogCXN0cnVjdCBiY21nZW5ldF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgcmVnID0gMDsKQEAgLTE3OCwxNCArMTc4LDI1IEBACiAJCXJldHVybjsKIAogCXJlZyA9IGJjbWdlbmV0X2V4dF9yZWFkbChwcml2LCBFWFRfR1BIWV9DVFJMKTsKLQlyZWcgJj0gfihFWFRfQ0ZHX0lERFFfQklBUyB8IEVYVF9DRkdfUFdSX0RPV04pOwotCXJlZyB8PSBFWFRfR1BIWV9SRVNFVDsKLQliY21nZW5ldF9leHRfd3JpdGVsKHByaXYsIHJlZywgRVhUX0dQSFlfQ1RSTCk7Ci0JbWRlbGF5KDIpOworCWlmIChlbmFibGUpIHsKKwkJcmVnICY9IH5FWFRfQ0syNV9ESVM7CisJCWJjbWdlbmV0X2V4dF93cml0ZWwocHJpdiwgcmVnLCBFWFRfR1BIWV9DVFJMKTsKKwkJbWRlbGF5KDEpOwogCi0JcmVnICY9IH5FWFRfR1BIWV9SRVNFVDsKKwkJcmVnICY9IH4oRVhUX0NGR19JRERRX0JJQVMgfCBFWFRfQ0ZHX1BXUl9ET1dOKTsKKwkJcmVnIHw9IEVYVF9HUEhZX1JFU0VUOworCQliY21nZW5ldF9leHRfd3JpdGVsKHByaXYsIHJlZywgRVhUX0dQSFlfQ1RSTCk7CisJCW1kZWxheSgxKTsKKworCQlyZWcgJj0gfkVYVF9HUEhZX1JFU0VUOworCX0gZWxzZSB7CisJCXJlZyB8PSBFWFRfQ0ZHX0lERFFfQklBUyB8IEVYVF9DRkdfUFdSX0RPV04gfCBFWFRfR1BIWV9SRVNFVDsKKwkJYmNtZ2VuZXRfZXh0X3dyaXRlbChwcml2LCByZWcsIEVYVF9HUEhZX0NUUkwpOworCQltZGVsYXkoMSk7CisJCXJlZyB8PSBFWFRfQ0syNV9ESVM7CisJfQogCWJjbWdlbmV0X2V4dF93cml0ZWwocHJpdiwgcmVnLCBFWFRfR1BIWV9DVFJMKTsKLQl1ZGVsYXkoMjApOworCXVkZWxheSg2MCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJjbWdlbmV0X2ludGVybmFsX3BoeV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTkzLDggKzIwNCw4IEBACiAJc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXUzMiByZWc7CiAKLQkvKiBQb3dlciB1cCBFUEhZICovCi0JYmNtZ2VuZXRfZXBoeV9wb3dlcl91cChkZXYpOworCS8qIFBvd2VyIHVwIFBIWSAqLworCWJjbWdlbmV0X3BoeV9wb3dlcl9zZXQoZGV2LCB0cnVlKTsKIAkvKiBlbmFibGUgQVBEICovCiAJcmVnID0gYmNtZ2VuZXRfZXh0X3JlYWRsKHByaXYsIEVYVF9FWFRfUFdSX01HTVQpOwogCXJlZyB8PSBFWFRfUFdSX0ROX0VOX0xEOwpAQCAtNDUxLDYgKzQ2MiwxNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGJjbWdlbmV0X2ZpeGVkX3BoeV9saW5rX3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBmaXhlZF9waHlfc3RhdHVzICpzdGF0dXMpCit7CisJaWYgKGRldiAmJiBkZXYtPnBoeWRldiAmJiBzdGF0dXMpCisJCXN0YXR1cy0+bGluayA9IGRldi0+cGh5ZGV2LT5saW5rOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYmNtZ2VuZXRfbWlpX3BkX2luaXQoc3RydWN0IGJjbWdlbmV0X3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGRldmljZSAqa2RldiA9ICZwcml2LT5wZGV2LT5kZXY7CkBAIC01MDIsNiArNTIyLDEzIEBACiAJCQlkZXZfZXJyKGtkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZml4ZWQgUEhZIGRldmljZVxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQorCisJCWlmIChwcml2LT5od19wYXJhbXMtPmZsYWdzICYgR0VORVRfSEFTX01PQ0FfTElOS19ERVQpIHsKKwkJCXJldCA9IGZpeGVkX3BoeV9zZXRfbGlua191cGRhdGUoCisJCQkJcGh5ZGV2LCBiY21nZW5ldF9maXhlZF9waHlfbGlua191cGRhdGUpOworCQkJaWYgKCFyZXQpCisJCQkJcGh5ZGV2LT5saW5rID0gMDsKKwkJfQogCX0KIAogCXByaXYtPnBoeWRldiA9IHBoeWRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKaW5kZXggMjNhMDE5Yy4uMTI3MGIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKQEAgLTYyMTcsMTAgKzYyMTcsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHRnM19wdHBfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgc3RydWN0IHRpbWVzcGVjICp0cykKK3N0YXRpYyBpbnQgdGczX3B0cF9nZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJdTY0IG5zOwotCXUzMiByZW1haW5kZXI7CiAJc3RydWN0IHRnMyAqdHAgPSBjb250YWluZXJfb2YocHRwLCBzdHJ1Y3QgdGczLCBwdHBfaW5mbyk7CiAKIAl0ZzNfZnVsbF9sb2NrKHRwLCAwKTsKQEAgLTYyMjgsMTkgKzYyMjcsMTggQEAKIAlucyArPSB0cC0+cHRwX2FkanVzdDsKIAl0ZzNfZnVsbF91bmxvY2sodHApOwogCi0JdHMtPnR2X3NlYyA9IGRpdl91NjRfcmVtKG5zLCAxMDAwMDAwMDAwLCAmcmVtYWluZGVyKTsKLQl0cy0+dHZfbnNlYyA9IHJlbWFpbmRlcjsKKwkqdHMgPSBuc190b190aW1lc3BlYzY0KG5zKTsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHRnM19wdHBfc2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCSAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMpCisJCQkgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJdTY0IG5zOwogCXN0cnVjdCB0ZzMgKnRwID0gY29udGFpbmVyX29mKHB0cCwgc3RydWN0IHRnMywgcHRwX2luZm8pOwogCi0JbnMgPSB0aW1lc3BlY190b19ucyh0cyk7CisJbnMgPSB0aW1lc3BlYzY0X3RvX25zKHRzKTsKIAogCXRnM19mdWxsX2xvY2sodHAsIDApOwogCXRnM19yZWZjbGtfd3JpdGUodHAsIG5zKTsKQEAgLTYzMjAsOCArNjMxOCw4IEBACiAJLnBwcwkJPSAwLAogCS5hZGpmcmVxCT0gdGczX3B0cF9hZGpmcmVxLAogCS5hZGp0aW1lCT0gdGczX3B0cF9hZGp0aW1lLAotCS5nZXR0aW1lCT0gdGczX3B0cF9nZXR0aW1lLAotCS5zZXR0aW1lCT0gdGczX3B0cF9zZXR0aW1lLAorCS5nZXR0aW1lNjQJPSB0ZzNfcHRwX2dldHRpbWUsCisJLnNldHRpbWU2NAk9IHRnM19wdHBfc2V0dGltZSwKIAkuZW5hYmxlCQk9IHRnM19wdHBfZW5hYmxlLAogfTsKIApAQCAtNzI0NCw3ICs3MjQyLDcgQEAKIAkJCWlmICh0bmFwaSA9PSAmdHAtPm5hcGlbMV0gJiYgdHAtPnJ4X3JlZmlsbCkKIAkJCQljb250aW51ZTsKIAotCQkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKwkJCW5hcGlfY29tcGxldGVfZG9uZShuYXBpLCB3b3JrX2RvbmUpOwogCQkJLyogUmVlbmFibGUgaW50ZXJydXB0cy4gKi8KIAkJCXR3MzJfbWFpbGJveCh0bmFwaS0+aW50X21ib3gsIHRuYXBpLT5sYXN0X3RhZyA8PCAyNCk7CiAKQEAgLTczMzcsNyArNzMzNSw3IEBACiAJCQlzYmxrLT5zdGF0dXMgJj0gflNEX1NUQVRVU19VUERBVEVEOwogCiAJCWlmIChsaWtlbHkoIXRnM19oYXNfd29yayh0bmFwaSkpKSB7Ci0JCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCQkJbmFwaV9jb21wbGV0ZV9kb25lKG5hcGksIHdvcmtfZG9uZSk7CiAJCQl0ZzNfaW50X3JlZW5hYmxlKHRuYXBpKTsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL0tjb25maWcKaW5kZXggMjY0MTU1Ny4uNGU4YzBiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvS2NvbmZpZwpAQCAtMSw5ICsxLDkgQEAKICMKLSMgQnJvY2FkZSBkZXZpY2UgY29uZmlndXJhdGlvbgorIyBRTG9naWMgQlItc2VyaWVzIGRldmljZSBjb25maWd1cmF0aW9uCiAjCiAKIGNvbmZpZyBORVRfVkVORE9SX0JST0NBREUKLQlib29sICJCcm9jYWRlIGRldmljZXMiCisJYm9vbCAiUUxvZ2ljIEJSLXNlcmllcyBkZXZpY2VzIgogCWRlZmF1bHQgeQogCWRlcGVuZHMgb24gUENJCiAJLS0taGVscC0tLQpAQCAtMTMsOCArMTMsOCBAQAogCiAJICBOb3RlIHRoYXQgdGhlIGFuc3dlciB0byB0aGlzIHF1ZXN0aW9uIGRvZXNuJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQogCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAotCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBCcm9jYWRlIGNhcmRzLiBJZiB5b3Ugc2F5IFksIHlvdSB3aWxsIGJlIGFza2VkIGZvcgotCSAgeW91ciBzcGVjaWZpYyBjYXJkIGluIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zLgorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBRTG9naWMgQlItc2VyaWVzIGNhcmRzLiBJZiB5b3Ugc2F5IFksIHlvdSB3aWxsIGJlCisJICBhc2tlZCBmb3IgeW91ciBzcGVjaWZpYyBjYXJkIGluIHRoZSBmb2xsb3dpbmcgcXVlc3Rpb25zLgogCiBpZiBORVRfVkVORE9SX0JST0NBREUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvTWFrZWZpbGUKaW5kZXggYjU4MjM4ZC4uZmVjMTBmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogIwotIyBNYWtlZmlsZSBmb3IgdGhlIEJyb2NhZGUgZGV2aWNlIGRyaXZlcnMuCisjIE1ha2VmaWxlIGZvciB0aGUgUUxvZ2ljIEJSLXNlcmllcyBkZXZpY2UgZHJpdmVycy4KICMKIAogb2JqLSQoQ09ORklHX0JOQSkgKz0gYm5hLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL0tjb25maWcKaW5kZXggZGMyZWI1Mi4uZmUwMTI3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9LY29uZmlnCkBAIC0xLDE3ICsxLDE3IEBACiAjCi0jIEJyb2NhZGUgbmV0d29yayBkZXZpY2UgY29uZmlndXJhdGlvbgorIyBRTG9naWMgQlItc2VyaWVzIG5ldHdvcmsgZGV2aWNlIGNvbmZpZ3VyYXRpb24KICMKIAogY29uZmlnIEJOQQotCXRyaXN0YXRlICJCcm9jYWRlIDEwMTAvMTAyMCAxMEdiIEV0aGVybmV0IERyaXZlciBzdXBwb3J0IgorCXRyaXN0YXRlICJRTG9naWMgQlItc2VyaWVzIDEwMTAvMTAyMC8xODYwIDEwR2IgRXRoZXJuZXQgRHJpdmVyIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBQQ0kKIAktLS1oZWxwLS0tCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyBCcm9jYWRlIDEwMTAvMTAyMCAxMEdiIENFRSBjYXBhYmxlIEV0aGVybmV0Ci0JICBjYXJkcy4KKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFFMb2dpYyBCUi1zZXJpZXMgMTAxMC8xMDIwLzE4NjAgMTBHYiBDRUUgY2FwYWJsZQorCSAgRXRoZXJuZXQgY2FyZHMuCiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBibmEuCiAKLQkgIEZvciBnZW5lcmFsIGluZm9ybWF0aW9uIGFuZCBzdXBwb3J0LCBnbyB0byB0aGUgQnJvY2FkZSBzdXBwb3J0CisJICBGb3IgZ2VuZXJhbCBpbmZvcm1hdGlvbiBhbmQgc3VwcG9ydCwgZ28gdG8gdGhlIFFMb2dpYyBzdXBwb3J0CiAJICB3ZWJzaXRlIGF0OgogCi0JICA8aHR0cDovL3N1cHBvcnQuYnJvY2FkZS5jb20+CisJICA8aHR0cDovL3N1cHBvcnQucWxvZ2ljLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvTWFrZWZpbGUKaW5kZXggNjAyNzMwMi4uNmUxMGI5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvTWFrZWZpbGUKQEAgLTEsNSArMSw2IEBACiAjCi0jIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorIyBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyMgQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uLgogIyBBbGwgcmlnaHRzIHJlc2VydmVkLgogIwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfY2VlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfY2VlLmMKaW5kZXggNTUwZDI1Mi4uY2Y5ZjM5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2NlZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9jZWUuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgorICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIFFMb2dpYyBCUi1zZXJpZXMgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKQEAgLTExLDkgKzExLDEwIEBACiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDE0IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiB3d3cuYnJvY2FkZS5jb20KKyAqIHd3dy5xbG9naWMuY29tCiAgKi8KIAogI2luY2x1ZGUgImJmYV9jZWUuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9jZWUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9jZWUuaAppbmRleCA5M2ZkZTYzLi5kMDRlZWY1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2NlZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9jZWUuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgorICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIFFMb2dpYyBCUi1zZXJpZXMgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKQEAgLTExLDkgKzExLDEwIEBACiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDE0IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiB3d3cuYnJvY2FkZS5jb20KKyAqIHd3dy5xbG9naWMuY29tCiAgKi8KIAogI2lmbmRlZiBfX0JGQV9DRUVfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfY3MuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9jcy5oCmluZGV4IGFkMDA0YTQuLmFmMjVkOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9jcy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9jcy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBCcm9jYWRlIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCisgKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgUUxvZ2ljIEJSLXNlcmllcyBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcwpAQCAtMTEsOSArMTEsMTAgQEAKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDExIEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTQgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIHd3dy5icm9jYWRlLmNvbQorICogd3d3LnFsb2dpYy5jb20KICAqLwogCiAvKiBCRkEgY29tbW9uIHNlcnZpY2VzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfZGVmcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2RlZnMuaAppbmRleCBiN2Q4MTI3Li4zYmZkOWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfZGVmcy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9kZWZzLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIEJyb2NhZGUgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBRTG9naWMgQlItc2VyaWVzIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCkBAIC0xMSw5ICsxMSwxMCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgogICogQWxsIHJpZ2h0cyByZXNlcnZlZAotICogd3d3LmJyb2NhZGUuY29tCisgKiB3d3cucWxvZ2ljLmNvbQogICovCiAKICNpZm5kZWYgX19CRkFfREVGU19IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9kZWZzX2NuYS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2RlZnNfY25hLmgKaW5kZXggYjM5YzVmMi4uYTM3MzI2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2RlZnNfY25hLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2RlZnNfY25hLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIEJyb2NhZGUgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBRTG9naWMgQlItc2VyaWVzIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCkBAIC0xMSw5ICsxMSwxMCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgogICogQWxsIHJpZ2h0cyByZXNlcnZlZAotICogd3d3LmJyb2NhZGUuY29tCisgKiB3d3cucWxvZ2ljLmNvbQogICovCiAjaWZuZGVmIF9fQkZBX0RFRlNfQ05BX0hfXwogI2RlZmluZSBfX0JGQV9ERUZTX0NOQV9IX18KQEAgLTEzNCw3ICsxMzUsNyBAQAogCXU4IHZhbHVlW0JGQV9DRUVfTExEUF9NQVhfU1RSSU5HX0xFTl07CiB9OwogCi0vKiBMTERQIHBhcmFtdGVycyAqLworLyogTExEUCBwYXJhbWV0ZXJzICovCiBzdHJ1Y3QgYmZhX2NlZV9sbGRwX2NmZyB7CiAJc3RydWN0IGJmYV9jZWVfbGxkcF9zdHIgY2hhc3Npc19pZDsKIAlzdHJ1Y3QgYmZhX2NlZV9sbGRwX3N0ciBwb3J0X2lkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2RlZnNfbWZnX2NvbW0uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9kZWZzX21mZ19jb21tLmgKaW5kZXggN2ZiMzk2Zi4uN2E0NWNkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2RlZnNfbWZnX2NvbW0uaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfZGVmc19tZmdfY29tbS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBCcm9jYWRlIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCisgKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgUUxvZ2ljIEJSLXNlcmllcyBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcwpAQCAtMTEsOSArMTEsMTAgQEAKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTQgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIHd3dy5icm9jYWRlLmNvbQorICogd3d3LnFsb2dpYy5jb20KICAqLwogI2lmbmRlZiBfX0JGQV9ERUZTX01GR19DT01NX0hfXwogI2RlZmluZSBfX0JGQV9ERUZTX01GR19DT01NX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2RlZnNfc3RhdHVzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfZGVmc19zdGF0dXMuaAppbmRleCBlYTlhZjlhLi5hNDNiNTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfZGVmc19zdGF0dXMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfZGVmc19zdGF0dXMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgorICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIFFMb2dpYyBCUi1zZXJpZXMgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKQEAgLTExLDkgKzExLDEwIEBACiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDE0IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiB3d3cuYnJvY2FkZS5jb20KKyAqIHd3dy5xbG9naWMuY29tCiAgKi8KICNpZm5kZWYgX19CRkFfREVGU19TVEFUVVNfSF9fCiAjZGVmaW5lIF9fQkZBX0RFRlNfU1RBVFVTX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2lvYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2lvYy5jCmluZGV4IDM1NGFlOTcuLjU5NGEyYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9pb2MuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfaW9jLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIEJyb2NhZGUgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBRTG9naWMgQlItc2VyaWVzIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCkBAIC0xMSw5ICsxMSwxMCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgogICogQWxsIHJpZ2h0cyByZXNlcnZlZAotICogd3d3LmJyb2NhZGUuY29tCisgKiB3d3cucWxvZ2ljLmNvbQogICovCiAKICNpbmNsdWRlICJiZmFfaW9jLmgiCkBAIC0xMzM5LDcgKzEzNDAsNyBAQAogCXJldHVybiB0cnVlOwogfQogCi0vKiBSZXR1cm5zIFRSVUUgaWYgbWFqb3IgbWlub3IgYW5kIG1haW50YWluZW5jZSBhcmUgc2FtZS4KKy8qIFJldHVybnMgVFJVRSBpZiBtYWpvciBtaW5vciBhbmQgbWFpbnRlbmFuY2UgYXJlIHNhbWUuCiAgKiBJZiBwYXRjaCB2ZXJzaW9uIGFyZSBzYW1lLCBjaGVjayBmb3IgTUQ1IENoZWNrc3VtIHRvIGJlIHNhbWUuCiAgKi8KIHN0YXRpYyBib29sCkBAIC0yNzYzLDcgKzI3NjQsNyBAQAogCWxpc3RfYWRkX3RhaWwoJm5vdGlmeS0+cWUsICZpb2MtPm5vdGlmeV9xKTsKIH0KIAotI2RlZmluZSBCRkFfTUZHX05BTUUgIkJyb2NhZGUiCisjZGVmaW5lIEJGQV9NRkdfTkFNRSAiUUxvZ2ljIgogc3RhdGljIHZvaWQKIGJmYV9pb2NfZ2V0X2FkYXB0ZXJfYXR0cihzdHJ1Y3QgYmZhX2lvYyAqaW9jLAogCQkJIHN0cnVjdCBiZmFfYWRhcHRlcl9hdHRyICphZF9hdHRyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2lvYy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2lvYy5oCmluZGV4IDIwY2ZmN2QuLmVmZmI3MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9pb2MuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfaW9jLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIEJyb2NhZGUgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBRTG9naWMgQlItc2VyaWVzIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCkBAIC0xMSw5ICsxMSwxMCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgogICogQWxsIHJpZ2h0cyByZXNlcnZlZAotICogd3d3LmJyb2NhZGUuY29tCisgKiB3d3cucWxvZ2ljLmNvbQogICovCiAKICNpZm5kZWYgX19CRkFfSU9DX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2lvY19jdC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2lvY19jdC5jCmluZGV4IGQ2Mzk1NTguLjJlNzI0NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9pb2NfY3QuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfaW9jX2N0LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIEJyb2NhZGUgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBRTG9naWMgQlItc2VyaWVzIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCkBAIC0xMSw5ICsxMSwxMCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgogICogQWxsIHJpZ2h0cyByZXNlcnZlZAotICogd3d3LmJyb2NhZGUuY29tCisgKiB3d3cucWxvZ2ljLmNvbQogICovCiAKICNpbmNsdWRlICJiZmFfaW9jLmgiCkBAIC02OTgsNyArNjk5LDcgQEAKIAogCS8qCiAJICogSWdub3JlIG1vZGUgYW5kIHByb2dyYW0gZm9yIHRoZSBtYXggY2xvY2sgKHdoaWNoIGlzIEZDMTYpCi0JICogRmlybXdhcmUvTkZDIHdpbGwgZG8gdGhlIFBMTCBpbml0IGFwcHJvcGlhdGVseQorCSAqIEZpcm13YXJlL05GQyB3aWxsIGRvIHRoZSBQTEwgaW5pdCBhcHByb3ByaWF0ZWx5CiAJICovCiAJcjMyID0gcmVhZGwoKHJiICsgQ1QyX0FQUF9QTExfU0NMS19DVExfUkVHKSk7CiAJcjMyICY9IH4oX19BUFBfUExMX1NDTEtfUkVGQ0xLX1NFTCB8IF9fQVBQX1BMTF9TQ0xLX0NMS19ESVYyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9tc2dxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfbXNncS5jCmluZGV4IDU1MDY3ZDAuLmMwN2Q1YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9tc2dxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX21zZ3EuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgorICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIFFMb2dpYyBCUi1zZXJpZXMgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKQEAgLTExLDkgKzExLDEwIEBACiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDE0IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiB3d3cuYnJvY2FkZS5jb20KKyAqIHd3dy5xbG9naWMuY29tCiAgKi8KIAogLyogTVNHUSBtb2R1bGUgc291cmNlIGZpbGUuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfbXNncS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX21zZ3EuaAppbmRleCBhNmE1NjVhLi42NmJjOGI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfbXNncS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9tc2dxLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIEJyb2NhZGUgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBRTG9naWMgQlItc2VyaWVzIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCkBAIC0xMSw5ICsxMSwxMCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTEgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgogICogQWxsIHJpZ2h0cyByZXNlcnZlZAotICogd3d3LmJyb2NhZGUuY29tCisgKiB3d3cucWxvZ2ljLmNvbQogICovCiAKICNpZm5kZWYgX19CRkFfTVNHUV9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmaS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZpLmgKaW5kZXggOGM1NjNhNy4uMmJjZGU0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZpLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZpLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIEJyb2NhZGUgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBRTG9naWMgQlItc2VyaWVzIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCkBAIC0xMSw5ICsxMSwxMCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgogICogQWxsIHJpZ2h0cyByZXNlcnZlZAotICogd3d3LmJyb2NhZGUuY29tCisgKiB3d3cucWxvZ2ljLmNvbQogICovCiAjaWZuZGVmIF9fQkZJX0hfXwogI2RlZmluZSBfX0JGSV9IX18KQEAgLTE1OCw4ICsxNTksOCBAQAogfTsKIAogZW51bSBiZmlfYXNpY19tb2RlIHsKLQlCRklfQVNJQ19NT0RFX0ZDCT0gMSwJLyogRkMgdXB0byA4RyBzcGVlZAkJKi8KLQlCRklfQVNJQ19NT0RFX0ZDMTYJPSAyLAkvKiBGQyB1cHRvIDE2RyBzcGVlZAkJKi8KKwlCRklfQVNJQ19NT0RFX0ZDCT0gMSwJLyogRkMgdXAgdG8gOEcgc3BlZWQJCSovCisJQkZJX0FTSUNfTU9ERV9GQzE2CT0gMiwJLyogRkMgdXAgdG8gMTZHIHNwZWVkCQkqLwogCUJGSV9BU0lDX01PREVfRVRICT0gMywJLyogRXRoZXJuZXQgcG9ydHMJCSovCiAJQkZJX0FTSUNfTU9ERV9DT01CTwk9IDQsCS8qIEZDIDE2RyBhbmQgRXRoZXJuZXQgMTBHIHBvcnQJKi8KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmlfY25hLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmlfY25hLmgKaW5kZXggNjcwNGE0My4uYmQ2MDViZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZpX2NuYS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmaV9jbmEuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgorICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIFFMb2dpYyBCUi1zZXJpZXMgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKQEAgLTExLDkgKzExLDEwIEBACiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDE0IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiB3d3cuYnJvY2FkZS5jb20KKyAqIHd3dy5xbG9naWMuY29tCiAgKi8KICNpZm5kZWYgX19CRklfQ05BX0hfXwogI2RlZmluZSBfX0JGSV9DTkFfSF9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmlfZW5ldC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZpX2VuZXQuaAppbmRleCBhZTA3MmRjLi5iY2NjYTNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmlfZW5ldC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmaV9lbmV0LmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIEJyb2NhZGUgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBRTG9naWMgQlItc2VyaWVzIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCkBAIC0xMSw5ICsxMSwxMCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTEgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgogICogQWxsIHJpZ2h0cyByZXNlcnZlZAotICogd3d3LmJyb2NhZGUuY29tCisgKiB3d3cucWxvZ2ljLmNvbQogICovCiAKIC8qIEJOQSBIYXJkd2FyZSBhbmQgRmlybXdhcmUgSW50ZXJmYWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmlfcmVnLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmlfcmVnLmgKaW5kZXggYzQ5ZmEzMS4uMjgzNWI1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZpX3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmaV9yZWcuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgorICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIFFMb2dpYyBCUi1zZXJpZXMgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKQEAgLTExLDEzICsxMSwxNCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTEgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgogICogQWxsIHJpZ2h0cyByZXNlcnZlZAotICogd3d3LmJyb2NhZGUuY29tCisgKiB3d3cucWxvZ2ljLmNvbQogICovCiAKIC8qCi0gKiBiZmlfcmVnLmggQVNJQyByZWdpc3RlciBkZWZpbmVzIGZvciBhbGwgQnJvY2FkZSBhZGFwdGVyIEFTSUNzCisgKiBiZmlfcmVnLmggQVNJQyByZWdpc3RlciBkZWZpbmVzIGZvciBhbGwgUUxvZ2ljIEJSLXNlcmllcyBhZGFwdGVyIEFTSUNzCiAgKi8KIAogI2lmbmRlZiBfX0JGSV9SRUdfSF9fCkBAIC0yMjEsNyArMjIyLDcgQEAKICNkZWZpbmUgX19QTU1fMVRfUkVTRVRfUAkJMHgwMDAwMDAwMQogI2RlZmluZSBQTU1fMVRfUkVTRVRfUkVHX1AxCQkweDAwMDIzYzFjCiAKLS8qIEJyb2NhZGUgMTg2MCBBZGFwdGVyIHNwZWNpZmljIGRlZmluZXMgKi8KKy8qIFFMb2dpYyBCUi1zZXJpZXMgMTg2MCBBZGFwdGVyIHNwZWNpZmljIGRlZmluZXMgKi8KICNkZWZpbmUgQ1QyX1BDSV9DUFFfQkFTRQkJMHgwMDAzMDAwMAogI2RlZmluZSBDVDJfUENJX0FQUF9CQVNFCQkweDAwMDMwMTAwCiAjZGVmaW5lIENUMl9QQ0lfRVRIX0JBU0UJCTB4MDAwMzA0MDAKQEAgLTI2NCw3ICsyNjUsNyBAQAogI2RlZmluZSBDVDJfSE9TVEZOX01TSVhfVlRfSU5ERVhfTUJPWF9FUlIJKENUMl9QQ0lfQVBQX0JBU0UgKyAweDM4KQogCiAvKgotICogQnJvY2FkZSAxODYwIGFkYXB0ZXIgQ1BRIGJsb2NrIHJlZ2lzdGVycworICogUUxvZ2ljIEJSLXNlcmllcyAxODYwIGFkYXB0ZXIgQ1BRIGJsb2NrIHJlZ2lzdGVycwogICovCiAjZGVmaW5lIENUMl9IT1NURk5fTFBVMF9NQk9YMAkJKENUMl9QQ0lfQ1BRX0JBU0UgKyAweDAwKQogI2RlZmluZSBDVDJfSE9TVEZOX0xQVTFfTUJPWDAJCShDVDJfUENJX0NQUV9CQVNFICsgMHgyMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hLmgKaW5kZXggMWY1MTIxOS4uOGJhNzJiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIEJyb2NhZGUgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBRTG9naWMgQlItc2VyaWVzIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCkBAIC0xMSw5ICsxMSwxMCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTEgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgogICogQWxsIHJpZ2h0cyByZXNlcnZlZAotICogd3d3LmJyb2NhZGUuY29tCisgKiB3d3cucWxvZ2ljLmNvbQogICovCiAjaWZuZGVmIF9fQk5BX0hfXwogI2RlZmluZSBfX0JOQV9IX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYV9lbmV0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFfZW5ldC5jCmluZGV4IDkwMzQ2NmUuLmRlYjhkYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYV9lbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hX2VuZXQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgorICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIFFMb2dpYyBCUi1zZXJpZXMgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKQEAgLTExLDkgKzExLDEwIEBACiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMSBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDE0IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiB3d3cuYnJvY2FkZS5jb20KKyAqIHd3dy5xbG9naWMuY29tCiAgKi8KICNpbmNsdWRlICJibmEuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hX2h3X2RlZnMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYV9od19kZWZzLmgKaW5kZXggMjcwMmQwMi4uMTc0YWYwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hX2h3X2RlZnMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFfaHdfZGVmcy5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBCcm9jYWRlIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCisgKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgUUxvZ2ljIEJSLXNlcmllcyBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcwpAQCAtMTEsOSArMTEsMTAgQEAKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDExIEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTQgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIHd3dy5icm9jYWRlLmNvbQorICogd3d3LnFsb2dpYy5jb20KICAqLwogCiAvKiBGaWxlIGZvciBpbnRlcnJ1cHQgbWFjcm9zIGFuZCBmdW5jdGlvbnMgKi8KQEAgLTM2Miw3ICszNjMsNyBAQAogCiAvKiAgVHhRIEVudHJ5IFN0cnVjdHVyZQogICoKLSAqICBCRVdBUkU6ICBMb2FkIHZhbHVlcyBpbnRvIHRoaXMgc3RydWN0dXJlIHdpdGggY29ycmVjdCBlbmRpYW5lc3MuCisgKiAgQkVXQVJFOiAgTG9hZCB2YWx1ZXMgaW50byB0aGlzIHN0cnVjdHVyZSB3aXRoIGNvcnJlY3QgZW5kaWFubmVzcy4KICAqLwogc3RydWN0IGJuYV90eHFfZW50cnkgewogCXVuaW9uIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYV90eF9yeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hX3R4X3J4LmMKaW5kZXggNWZhYzQxMS4uOGFiM2E1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hX3R4X3J4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hX3R4X3J4LmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIEJyb2NhZGUgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBRTG9naWMgQlItc2VyaWVzIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCkBAIC0xMSw5ICsxMSwxMCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICAqLwogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDExIEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTQgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIHd3dy5icm9jYWRlLmNvbQorICogd3d3LnFsb2dpYy5jb20KICAqLwogI2luY2x1ZGUgImJuYS5oIgogI2luY2x1ZGUgImJmaS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hX3R5cGVzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFfdHlwZXMuaAppbmRleCA2MjE1NDdjLi5kMGE3YTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFfdHlwZXMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFfdHlwZXMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgorICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIFFMb2dpYyBCUi1zZXJpZXMgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKQEAgLTExLDkgKzExLDEwIEBACiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDE0IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiB3d3cuYnJvY2FkZS5jb20KKyAqIHd3dy5xbG9naWMuY29tCiAgKi8KICNpZm5kZWYgX19CTkFfVFlQRVNfSF9fCiAjZGVmaW5lIF9fQk5BX1RZUEVTX0hfXwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5jCmluZGV4IDc3MTRkNzcuLjM3MDcyYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIEJyb2NhZGUgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KKyAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBRTG9naWMgQlItc2VyaWVzIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyIGFzCkBAIC0xMSw5ICsxMSwxMCBAQAogICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAvKgotICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTAgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxNCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFFMb2dpYyBDb3Jwb3JhdGlvbgogICogQWxsIHJpZ2h0cyByZXNlcnZlZAotICogd3d3LmJyb2NhZGUuY29tCisgKiB3d3cucWxvZ2ljLmNvbQogICovCiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CkBAIC0zODY3LDcgKzM4NjgsNyBAQAogewogCWludCBlcnI7CiAKLQlwcl9pbmZvKCJCcm9jYWRlIDEwRyBFdGhlcm5ldCBkcml2ZXIgLSB2ZXJzaW9uOiAlc1xuIiwKKwlwcl9pbmZvKCJRTG9naWMgQlItc2VyaWVzIDEwRyBFdGhlcm5ldCBkcml2ZXIgLSB2ZXJzaW9uOiAlc1xuIiwKIAkJCUJOQURfVkVSU0lPTik7CiAKIAliZmFfbndfaW9jX2F1dG9fcmVjb3ZlcihibmFkX2lvY19hdXRvX3JlY292ZXIpOwpAQCAtMzg5NCw3ICszODk1LDcgQEAKIAogTU9EVUxFX0FVVEhPUigiQnJvY2FkZSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9jYWRlIDEwRyBQQ0llIEV0aGVybmV0IGRyaXZlciIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJRTG9naWMgQlItc2VyaWVzIDEwRyBQQ0llIEV0aGVybmV0IGRyaXZlciIpOwogTU9EVUxFX1ZFUlNJT04oQk5BRF9WRVJTSU9OKTsKIE1PRFVMRV9GSVJNV0FSRShDTkFfRldfRklMRV9DVCk7CiBNT0RVTEVfRklSTVdBUkUoQ05BX0ZXX0ZJTEVfQ1QyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuaAppbmRleCAyODQyYzE4Li43ZWFkNmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBCcm9jYWRlIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCisgKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgUUxvZ2ljIEJSLXNlcmllcyBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcwpAQCAtMTEsOSArMTEsMTAgQEAKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTQgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIHd3dy5icm9jYWRlLmNvbQorICogd3d3LnFsb2dpYy5jb20KICAqLwogI2lmbmRlZiBfX0JOQURfSF9fCiAjZGVmaW5lIF9fQk5BRF9IX18KQEAgLTcxLDcgKzcyLDcgQEAKICNkZWZpbmUgQk5BRF9OQU1FCQkJImJuYSIKICNkZWZpbmUgQk5BRF9OQU1FX0xFTgkJCTY0CiAKLSNkZWZpbmUgQk5BRF9WRVJTSU9OCQkJIjMuMi4yMy4wIgorI2RlZmluZSBCTkFEX1ZFUlNJT04JCQkiMy4yLjI1LjEiCiAKICNkZWZpbmUgQk5BRF9NQUlMQk9YX01TSVhfSU5ERVgJCTAKICNkZWZpbmUgQk5BRF9NQUlMQk9YX01TSVhfVkVDVE9SUwkxCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWRfZGVidWdmcy5jCmluZGV4IDYxOTA4M2EuLjcyYzg5NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWRfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWRfZGVidWdmcy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBCcm9jYWRlIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCisgKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgUUxvZ2ljIEJSLXNlcmllcyBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcwpAQCAtMTEsOSArMTEsMTAgQEAKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDExIEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTQgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIHd3dy5icm9jYWRlLmNvbQorICogd3d3LnFsb2dpYy5jb20KICAqLwogCiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2V0aHRvb2wuYwppbmRleCBkMjZhZGFjLi4xMmYzNDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2V0aHRvb2wuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgorICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIFFMb2dpYyBCUi1zZXJpZXMgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKQEAgLTExLDkgKzExLDEwIEBACiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNS0yMDE0IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiB3d3cuYnJvY2FkZS5jb20KKyAqIHd3dy5xbG9naWMuY29tCiAgKi8KIAogI2luY2x1ZGUgImNuYS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvY25hLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9jbmEuaAppbmRleCBiM2ZmNmQ1Li4yOGU3ZDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9jbmEuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9jbmEuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgorICogTGludXggbmV0d29yayBkcml2ZXIgZm9yIFFMb2dpYyBCUi1zZXJpZXMgQ29udmVyZ2VkIE5ldHdvcmsgQWRhcHRlci4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIgYXMKQEAgLTExLDkgKzExLDEwIEBACiAgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMCBCcm9jYWRlIENvbW11bmljYXRpb25zIFN5c3RlbXMsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwNi0yMDE0IEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUUxvZ2ljIENvcnBvcmF0aW9uCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkCi0gKiB3d3cuYnJvY2FkZS5jb20KKyAqIHd3dy5xbG9naWMuY29tCiAgKi8KIAogI2lmbmRlZiBfX0NOQV9IX18KQEAgLTM3LDggKzM4LDggQEAKIAogZXh0ZXJuIGNoYXIgYmZhX3ZlcnNpb25bXTsKIAotI2RlZmluZSBDTkFfRldfRklMRV9DVAkiY3Rmdy0zLjIuMy4wLmJpbiIKLSNkZWZpbmUgQ05BX0ZXX0ZJTEVfQ1QyCSJjdDJmdy0zLjIuMy4wLmJpbiIKKyNkZWZpbmUgQ05BX0ZXX0ZJTEVfQ1QJImN0ZnctMy4yLjUuMS5iaW4iCisjZGVmaW5lIENOQV9GV19GSUxFX0NUMgkiY3QyZnctMy4yLjUuMS5iaW4iCiAjZGVmaW5lIEZDX1NZTU5BTUVfTUFYCTI1NgkvKiE8IG1heCBuYW1lIHNlcnZlciBzeW1ib2xpYyBuYW1lIHNpemUgKi8KIAogI3ByYWdtYSBwYWNrKDEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9jbmFfZndpbWcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2NuYV9md2ltZy5jCmluZGV4IDZmNzI3NzEuLmViZjQ2MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2NuYV9md2ltZy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2NuYV9md2ltZy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIExpbnV4IG5ldHdvcmsgZHJpdmVyIGZvciBCcm9jYWRlIENvbnZlcmdlZCBOZXR3b3JrIEFkYXB0ZXIuCisgKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgUUxvZ2ljIEJSLXNlcmllcyBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcwpAQCAtMTEsOSArMTEsMTAgQEAKICAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqLwogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNS0yMDEwIEJyb2NhZGUgQ29tbXVuaWNhdGlvbnMgU3lzdGVtcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTQgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBRTG9naWMgQ29ycG9yYXRpb24KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQKLSAqIHd3dy5icm9jYWRlLmNvbQorICogd3d3LnFsb2dpYy5jb20KICAqLwogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSAiYm5hZC5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9LY29uZmlnCmluZGV4IDMyMWQyYWQuLjFiYTNlM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL0tjb25maWcKQEAgLTQsNyArNCw3IEBACiAKIGNvbmZpZyBORVRfQ0FERU5DRQogCWJvb2wgIkNhZGVuY2UgZGV2aWNlcyIKLQlkZXBlbmRzIG9uIEhBU19JT01FTSAmJiAoQVJNIHx8IEFWUjMyIHx8IE1JQ1JPQkxBWkUgfHwgQ09NUElMRV9URVNUKQorCWRlcGVuZHMgb24gSEFTX0lPTUVNCiAJZGVmYXVsdCB5CiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIChFdGhlcm5ldCkgY2FyZCBiZWxvbmdpbmcgdG8gdGhpcyBjbGFzcywgc2F5IFkuCkBAIC0yMCwxNyArMjAsOSBAQAogCiBpZiBORVRfQ0FERU5DRQogCi1jb25maWcgQVJNX0FUOTFfRVRIRVIKLQl0cmlzdGF0ZSAiQVQ5MVJNOTIwMCBFdGhlcm5ldCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSEFTX0RNQSAmJiAoQVJDSF9BVDkxIHx8IENPTVBJTEVfVEVTVCkKLQlzZWxlY3QgTUFDQgotCS0tLWhlbHAtLS0KLQkgIElmIHlvdSB3aXNoIHRvIGNvbXBpbGUgYSBrZXJuZWwgZm9yIHRoZSBBVDkxUk05MjAwIGFuZCBlbmFibGUKLQkgIGV0aGVybmV0IHN1cHBvcnQsIHRoZW4geW91IHNob3VsZCBhbHdheXMgYW5zd2VyIFkgdG8gdGhpcy4KLQogY29uZmlnIE1BQ0IKIAl0cmlzdGF0ZSAiQ2FkZW5jZSBNQUNCL0dFTSBzdXBwb3J0IgotCWRlcGVuZHMgb24gSEFTX0RNQSAmJiAoUExBVEZPUk1fQVQzMkFQIHx8IEFSQ0hfQVQ5MSB8fCBBUkNIX1BJQ09YQ0VMTCB8fCBBUkNIX1pZTlEgfHwgTUlDUk9CTEFaRSB8fCBDT01QSUxFX1RFU1QpCisJZGVwZW5kcyBvbiBIQVNfRE1BCiAJc2VsZWN0IFBIWUxJQgogCS0tLWhlbHAtLS0KIAkgIFRoZSBDYWRlbmNlIE1BQ0IgZXRoZXJuZXQgaW50ZXJmYWNlIGlzIGZvdW5kIG9uIG1hbnkgQXRtZWwgQVQzMiBhbmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL01ha2VmaWxlCmluZGV4IDkwNjhiODMuLjkxZjc5YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9NYWtlZmlsZQpAQCAtMiw1ICsyLDQgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBBdG1lbCBuZXR3b3JrIGRldmljZSBkcml2ZXJzLgogIwogCi1vYmotJChDT05GSUdfQVJNX0FUOTFfRVRIRVIpICs9IGF0OTFfZXRoZXIubwogb2JqLSQoQ09ORklHX01BQ0IpICs9IG1hY2IubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9hdDkxX2V0aGVyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL2F0OTFfZXRoZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmNTVmNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL2F0OTFfZXRoZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDQ4MSArMCwwIEBACi0vKgotICogRXRoZXJuZXQgZHJpdmVyIGZvciB0aGUgQXRtZWwgQVQ5MVJNOTIwMCAoVGh1bmRlcikKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAzIFNBTiBQZW9wbGUgKFB0eSkgTHRkCi0gKgotICogQmFzZWQgb24gYW4gZWFybGllciBBdG1lbCBFTUFDIG1hY3JvY2VsbCBkcml2ZXIgYnkgQXRtZWwgYW5kIExpbmVvIEluYy4KLSAqIEluaXRpYWwgdmVyc2lvbiBieSBSaWNrIEJyb25zb24gMDEvMTEvMjAwMwotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KLSAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvbWFjYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KLQotI2luY2x1ZGUgIm1hY2IuaCIKLQotLyogMTUxOCByb3VuZGVkIHVwICovCi0jZGVmaW5lIE1BWF9SQlVGRl9TWgkweDYwMAotLyogbWF4IG51bWJlciBvZiByZWNlaXZlIGJ1ZmZlcnMgKi8KLSNkZWZpbmUgTUFYX1JYX0RFU0NSCTkKLQotLyogSW5pdGlhbGl6ZSBhbmQgc3RhcnQgdGhlIFJlY2VpdmVyIGFuZCBUcmFuc21pdCBzdWJzeXN0ZW1zICovCi1zdGF0aWMgaW50IGF0OTFldGhlcl9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBtYWNiICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0JZG1hX2FkZHJfdCBhZGRyOwotCXUzMiBjdGw7Ci0JaW50IGk7Ci0KLQlscC0+cnhfcmluZyA9IGRtYV9hbGxvY19jb2hlcmVudCgmbHAtPnBkZXYtPmRldiwKLQkJCQkJIChNQVhfUlhfREVTQ1IgKgotCQkJCQkgIHNpemVvZihzdHJ1Y3QgbWFjYl9kbWFfZGVzYykpLAotCQkJCQkgJmxwLT5yeF9yaW5nX2RtYSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFscC0+cnhfcmluZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlscC0+cnhfYnVmZmVycyA9IGRtYV9hbGxvY19jb2hlcmVudCgmbHAtPnBkZXYtPmRldiwKLQkJCQkJICAgIE1BWF9SWF9ERVNDUiAqIE1BWF9SQlVGRl9TWiwKLQkJCQkJICAgICZscC0+cnhfYnVmZmVyc19kbWEsIEdGUF9LRVJORUwpOwotCWlmICghbHAtPnJ4X2J1ZmZlcnMpIHsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJmxwLT5wZGV2LT5kZXYsCi0JCQkJICBNQVhfUlhfREVTQ1IgKiBzaXplb2Yoc3RydWN0IG1hY2JfZG1hX2Rlc2MpLAotCQkJCSAgbHAtPnJ4X3JpbmcsIGxwLT5yeF9yaW5nX2RtYSk7Ci0JCWxwLT5yeF9yaW5nID0gTlVMTDsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYWRkciA9IGxwLT5yeF9idWZmZXJzX2RtYTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JYX0RFU0NSOyBpKyspIHsKLQkJbHAtPnJ4X3JpbmdbaV0uYWRkciA9IGFkZHI7Ci0JCWxwLT5yeF9yaW5nW2ldLmN0cmwgPSAwOwotCQlhZGRyICs9IE1BWF9SQlVGRl9TWjsKLQl9Ci0KLQkvKiBTZXQgdGhlIFdyYXAgYml0IG9uIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KLQlscC0+cnhfcmluZ1tNQVhfUlhfREVTQ1IgLSAxXS5hZGRyIHw9IE1BQ0JfQklUKFJYX1dSQVApOwotCi0JLyogUmVzZXQgYnVmZmVyIGluZGV4ICovCi0JbHAtPnJ4X3RhaWwgPSAwOwotCi0JLyogUHJvZ3JhbSBhZGRyZXNzIG9mIGRlc2NyaXB0b3IgbGlzdCBpbiBSeCBCdWZmZXIgUXVldWUgcmVnaXN0ZXIgKi8KLQltYWNiX3dyaXRlbChscCwgUkJRUCwgbHAtPnJ4X3JpbmdfZG1hKTsKLQotCS8qIEVuYWJsZSBSZWNlaXZlIGFuZCBUcmFuc21pdCAqLwotCWN0bCA9IG1hY2JfcmVhZGwobHAsIE5DUik7Ci0JbWFjYl93cml0ZWwobHAsIE5DUiwgY3RsIHwgTUFDQl9CSVQoUkUpIHwgTUFDQl9CSVQoVEUpKTsKLQotCXJldHVybiAwOwotfQotCi0vKiBPcGVuIHRoZSBldGhlcm5ldCBpbnRlcmZhY2UgKi8KLXN0YXRpYyBpbnQgYXQ5MWV0aGVyX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbWFjYiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiBjdGw7Ci0JaW50IHJldDsKLQotCS8qIENsZWFyIGludGVybmFsIHN0YXRpc3RpY3MgKi8KLQljdGwgPSBtYWNiX3JlYWRsKGxwLCBOQ1IpOwotCW1hY2Jfd3JpdGVsKGxwLCBOQ1IsIGN0bCB8IE1BQ0JfQklUKENMUlNUQVQpKTsKLQotCW1hY2Jfc2V0X2h3YWRkcihscCk7Ci0KLQlyZXQgPSBhdDkxZXRoZXJfc3RhcnQoZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogRW5hYmxlIE1BQyBpbnRlcnJ1cHRzICovCi0JbWFjYl93cml0ZWwobHAsIElFUiwgTUFDQl9CSVQoUkNPTVApCXwKLQkJCSAgICAgTUFDQl9CSVQoUlhVQlIpCXwKLQkJCSAgICAgTUFDQl9CSVQoSVNSX1RVTkQpCXwKLQkJCSAgICAgTUFDQl9CSVQoSVNSX1JMRSkJfAotCQkJICAgICBNQUNCX0JJVChUQ09NUCkJfAotCQkJICAgICBNQUNCX0JJVChJU1JfUk9WUikJfAotCQkJICAgICBNQUNCX0JJVChIUkVTUCkpOwotCi0JLyogc2NoZWR1bGUgYSBsaW5rIHN0YXRlIGNoZWNrICovCi0JcGh5X3N0YXJ0KGxwLT5waHlfZGV2KTsKLQotCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogQ2xvc2UgdGhlIGludGVyZmFjZSAqLwotc3RhdGljIGludCBhdDkxZXRoZXJfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgbWFjYiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiBjdGw7Ci0KLQkvKiBEaXNhYmxlIFJlY2VpdmVyIGFuZCBUcmFuc21pdHRlciAqLwotCWN0bCA9IG1hY2JfcmVhZGwobHAsIE5DUik7Ci0JbWFjYl93cml0ZWwobHAsIE5DUiwgY3RsICYgfihNQUNCX0JJVChURSkgfCBNQUNCX0JJVChSRSkpKTsKLQotCS8qIERpc2FibGUgTUFDIGludGVycnVwdHMgKi8KLQltYWNiX3dyaXRlbChscCwgSURSLCBNQUNCX0JJVChSQ09NUCkJfAotCQkJICAgICBNQUNCX0JJVChSWFVCUikJfAotCQkJICAgICBNQUNCX0JJVChJU1JfVFVORCkJfAotCQkJICAgICBNQUNCX0JJVChJU1JfUkxFKQl8Ci0JCQkgICAgIE1BQ0JfQklUKFRDT01QKQl8Ci0JCQkgICAgIE1BQ0JfQklUKElTUl9ST1ZSKSB8Ci0JCQkgICAgIE1BQ0JfQklUKEhSRVNQKSk7Ci0KLQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0KLQlkbWFfZnJlZV9jb2hlcmVudCgmbHAtPnBkZXYtPmRldiwKLQkJCQlNQVhfUlhfREVTQ1IgKiBzaXplb2Yoc3RydWN0IG1hY2JfZG1hX2Rlc2MpLAotCQkJCWxwLT5yeF9yaW5nLCBscC0+cnhfcmluZ19kbWEpOwotCWxwLT5yeF9yaW5nID0gTlVMTDsKLQotCWRtYV9mcmVlX2NvaGVyZW50KCZscC0+cGRldi0+ZGV2LAotCQkJCU1BWF9SWF9ERVNDUiAqIE1BWF9SQlVGRl9TWiwKLQkJCQlscC0+cnhfYnVmZmVycywgbHAtPnJ4X2J1ZmZlcnNfZG1hKTsKLQlscC0+cnhfYnVmZmVycyA9IE5VTEw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogVHJhbnNtaXQgcGFja2V0ICovCi1zdGF0aWMgaW50IGF0OTFldGhlcl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IG1hY2IgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChtYWNiX3JlYWRsKGxwLCBUU1IpICYgTUFDQl9CSVQoUk05MjAwX0JOUSkpIHsKLQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCi0JCS8qIFN0b3JlIHBhY2tldCBpbmZvcm1hdGlvbiAodG8gZnJlZSB3aGVuIFR4IGNvbXBsZXRlZCkgKi8KLQkJbHAtPnNrYiA9IHNrYjsKLQkJbHAtPnNrYl9sZW5ndGggPSBza2ItPmxlbjsKLQkJbHAtPnNrYl9waHlzYWRkciA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sCi0JCQkJCQkJRE1BX1RPX0RFVklDRSk7Ci0KLQkJLyogU2V0IGFkZHJlc3Mgb2YgdGhlIGRhdGEgaW4gdGhlIFRyYW5zbWl0IEFkZHJlc3MgcmVnaXN0ZXIgKi8KLQkJbWFjYl93cml0ZWwobHAsIFRBUiwgbHAtPnNrYl9waHlzYWRkcik7Ci0JCS8qIFNldCBsZW5ndGggb2YgdGhlIHBhY2tldCBpbiB0aGUgVHJhbnNtaXQgQ29udHJvbCByZWdpc3RlciAqLwotCQltYWNiX3dyaXRlbChscCwgVENSLCBza2ItPmxlbik7Ci0KLQl9IGVsc2UgewotCQluZXRkZXZfZXJyKGRldiwgIiVzIGNhbGxlZCwgYnV0IGRldmljZSBpcyBidXN5IVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gTkVUREVWX1RYX0JVU1k7Ci0JfQotCi0JcmV0dXJuIE5FVERFVl9UWF9PSzsKLX0KLQotLyogRXh0cmFjdCByZWNlaXZlZCBmcmFtZSBmcm9tIGJ1ZmZlciBkZXNjcmlwdG9ycyBhbmQgc2VudCB0byB1cHBlciBsYXllcnMuCi0gKiAoQ2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQpCi0gKi8KLXN0YXRpYyB2b2lkIGF0OTFldGhlcl9yeChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBtYWNiICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgY2hhciAqcF9yZWN2OwotCXN0cnVjdCBza19idWZmICpza2I7Ci0JdW5zaWduZWQgaW50IHBrdGxlbjsKLQotCXdoaWxlIChscC0+cnhfcmluZ1tscC0+cnhfdGFpbF0uYWRkciAmIE1BQ0JfQklUKFJYX1VTRUQpKSB7Ci0JCXBfcmVjdiA9IGxwLT5yeF9idWZmZXJzICsgbHAtPnJ4X3RhaWwgKiBNQVhfUkJVRkZfU1o7Ci0JCXBrdGxlbiA9IE1BQ0JfQkYoUlhfRlJNTEVOLCBscC0+cnhfcmluZ1tscC0+cnhfdGFpbF0uY3RybCk7Ci0JCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBwa3RsZW4gKyAyKTsKLQkJaWYgKHNrYikgewotCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKLQkJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0bGVuKSwgcF9yZWN2LCBwa3RsZW4pOwotCi0JCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwotCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47Ci0JCQluZXRpZl9yeChza2IpOwotCQl9IGVsc2UgewotCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLQkJfQotCi0JCWlmIChscC0+cnhfcmluZ1tscC0+cnhfdGFpbF0uY3RybCAmIE1BQ0JfQklUKFJYX01IQVNIX01BVENIKSkKLQkJCWxwLT5zdGF0cy5tdWx0aWNhc3QrKzsKLQotCQkvKiByZXNldCBvd25lcnNoaXAgYml0ICovCi0JCWxwLT5yeF9yaW5nW2xwLT5yeF90YWlsXS5hZGRyICY9IH5NQUNCX0JJVChSWF9VU0VEKTsKLQotCQkvKiB3cmFwIGFmdGVyIGxhc3QgYnVmZmVyICovCi0JCWlmIChscC0+cnhfdGFpbCA9PSBNQVhfUlhfREVTQ1IgLSAxKQotCQkJbHAtPnJ4X3RhaWwgPSAwOwotCQllbHNlCi0JCQlscC0+cnhfdGFpbCsrOwotCX0KLX0KLQotLyogTUFDIGludGVycnVwdCBoYW5kbGVyICovCi1zdGF0aWMgaXJxcmV0dXJuX3QgYXQ5MWV0aGVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9pZDsKLQlzdHJ1Y3QgbWFjYiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiBpbnRzdGF0dXMsIGN0bDsKLQotCS8qIE1BQyBJbnRlcnJ1cHQgU3RhdHVzIHJlZ2lzdGVyIGluZGljYXRlcyB3aGF0IGludGVycnVwdHMgYXJlIHBlbmRpbmcuCi0JICogSXQgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkIG9uY2UgcmVhZC4KLQkgKi8KLQlpbnRzdGF0dXMgPSBtYWNiX3JlYWRsKGxwLCBJU1IpOwotCi0JLyogUmVjZWl2ZSBjb21wbGV0ZSAqLwotCWlmIChpbnRzdGF0dXMgJiBNQUNCX0JJVChSQ09NUCkpCi0JCWF0OTFldGhlcl9yeChkZXYpOwotCi0JLyogVHJhbnNtaXQgY29tcGxldGUgKi8KLQlpZiAoaW50c3RhdHVzICYgTUFDQl9CSVQoVENPTVApKSB7Ci0JCS8qIFRoZSBUQ09NIGJpdCBpcyBzZXQgZXZlbiBpZiB0aGUgdHJhbnNtaXNzaW9uIGZhaWxlZCAqLwotCQlpZiAoaW50c3RhdHVzICYgKE1BQ0JfQklUKElTUl9UVU5EKSB8IE1BQ0JfQklUKElTUl9STEUpKSkKLQkJCWxwLT5zdGF0cy50eF9lcnJvcnMrKzsKLQotCQlpZiAobHAtPnNrYikgewotCQkJZGV2X2tmcmVlX3NrYl9pcnEobHAtPnNrYik7Ci0JCQlscC0+c2tiID0gTlVMTDsKLQkJCWRtYV91bm1hcF9zaW5nbGUoTlVMTCwgbHAtPnNrYl9waHlzYWRkciwgbHAtPnNrYl9sZW5ndGgsIERNQV9UT19ERVZJQ0UpOwotCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJCWxwLT5zdGF0cy50eF9ieXRlcyArPSBscC0+c2tiX2xlbmd0aDsKLQkJfQotCQluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci0JfQotCi0JLyogV29yay1hcm91bmQgZm9yIEVNQUMgRXJyYXRhIHNlY3Rpb24gNDEuMy4xICovCi0JaWYgKGludHN0YXR1cyAmIE1BQ0JfQklUKFJYVUJSKSkgewotCQljdGwgPSBtYWNiX3JlYWRsKGxwLCBOQ1IpOwotCQltYWNiX3dyaXRlbChscCwgTkNSLCBjdGwgJiB+TUFDQl9CSVQoUkUpKTsKLQkJbWFjYl93cml0ZWwobHAsIE5DUiwgY3RsIHwgTUFDQl9CSVQoUkUpKTsKLQl9Ci0KLQlpZiAoaW50c3RhdHVzICYgTUFDQl9CSVQoSVNSX1JPVlIpKQotCQluZXRkZXZfZXJyKGRldiwgIlJPVlIgZXJyb3JcbiIpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLXN0YXRpYyB2b2lkIGF0OTFldGhlcl9wb2xsX2NvbnRyb2xsZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWF0OTFldGhlcl9pbnRlcnJ1cHQoZGV2LT5pcnEsIGRldik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYXQ5MWV0aGVyX25ldGRldl9vcHMgPSB7Ci0JLm5kb19vcGVuCQk9IGF0OTFldGhlcl9vcGVuLAotCS5uZG9fc3RvcAkJPSBhdDkxZXRoZXJfY2xvc2UsCi0JLm5kb19zdGFydF94bWl0CQk9IGF0OTFldGhlcl9zdGFydF94bWl0LAotCS5uZG9fZ2V0X3N0YXRzCQk9IG1hY2JfZ2V0X3N0YXRzLAotCS5uZG9fc2V0X3J4X21vZGUJPSBtYWNiX3NldF9yeF9tb2RlLAotCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAotCS5uZG9fZG9faW9jdGwJCT0gbWFjYl9pb2N0bCwKLQkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKLQkubmRvX2NoYW5nZV9tdHUJCT0gZXRoX2NoYW5nZV9tdHUsCi0jaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQkubmRvX3BvbGxfY29udHJvbGxlcgk9IGF0OTFldGhlcl9wb2xsX2NvbnRyb2xsZXIsCi0jZW5kaWYKLX07Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19PRikKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF0OTFldGhlcl9kdF9pZHNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImNkbnMsYXQ5MXJtOTIwMC1lbWFjIiB9LAotCXsgLmNvbXBhdGlibGUgPSAiY2RucyxlbWFjIiB9LAotCXsgLyogc2VudGluZWwgKi8gfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGF0OTFldGhlcl9kdF9pZHMpOwotI2VuZGlmCi0KLS8qIERldGVjdCBNQUMgJiBQSFkgYW5kIHBlcmZvcm0gZXRoZXJuZXQgaW50ZXJmYWNlIGluaXRpYWxpemF0aW9uICovCi1zdGF0aWMgaW50IF9faW5pdCBhdDkxZXRoZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbWFjYl9wbGF0Zm9ybV9kYXRhICpib2FyZF9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwotCXN0cnVjdCBtYWNiICpscDsKLQlpbnQgcmVzOwotCXUzMiByZWc7Ci0JY29uc3QgY2hhciAqbWFjOwotCi0JcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZWdzKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCWRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgbWFjYikpOwotCWlmICghZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlscC0+cGRldiA9IHBkZXY7Ci0JbHAtPmRldiA9IGRldjsKLQlzcGluX2xvY2tfaW5pdCgmbHAtPmxvY2spOwotCi0JLyogcGh5c2ljYWwgYmFzZSBhZGRyZXNzICovCi0JZGV2LT5iYXNlX2FkZHIgPSByZWdzLT5zdGFydDsKLQlscC0+cmVncyA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCByZWdzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZWdzKSk7Ci0JaWYgKCFscC0+cmVncykgewotCQlyZXMgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9mcmVlX2RldjsKLQl9Ci0KLQkvKiBDbG9jayAqLwotCWxwLT5wY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJldGhlcl9jbGsiKTsKLQlpZiAoSVNfRVJSKGxwLT5wY2xrKSkgewotCQlyZXMgPSBQVFJfRVJSKGxwLT5wY2xrKTsKLQkJZ290byBlcnJfZnJlZV9kZXY7Ci0JfQotCWNsa19wcmVwYXJlX2VuYWJsZShscC0+cGNsayk7Ci0KLQlscC0+aGNsayA9IEVSUl9QVFIoLUVOT0VOVCk7Ci0JbHAtPnR4X2NsayA9IEVSUl9QVFIoLUVOT0VOVCk7Ci0KLQkvKiBJbnN0YWxsIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciAqLwotCWRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlyZXMgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGRldi0+aXJxLCBhdDkxZXRoZXJfaW50ZXJydXB0LCAwLCBkZXYtPm5hbWUsIGRldik7Ci0JaWYgKHJlcykKLQkJZ290byBlcnJfZGlzYWJsZV9jbG9jazsKLQotCWRldi0+bmV0ZGV2X29wcyA9ICZhdDkxZXRoZXJfbmV0ZGV2X29wczsKLQlkZXYtPmV0aHRvb2xfb3BzID0gJm1hY2JfZXRodG9vbF9vcHM7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKLQlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOwotCi0JbWFjID0gb2ZfZ2V0X21hY19hZGRyZXNzKHBkZXYtPmRldi5vZl9ub2RlKTsKLQlpZiAobWFjKQotCQltZW1jcHkobHAtPmRldi0+ZGV2X2FkZHIsIG1hYywgRVRIX0FMRU4pOwotCWVsc2UKLQkJbWFjYl9nZXRfaHdhZGRyKGxwKTsKLQotCXJlcyA9IG9mX2dldF9waHlfbW9kZShwZGV2LT5kZXYub2Zfbm9kZSk7Ci0JaWYgKHJlcyA8IDApIHsKLQkJaWYgKGJvYXJkX2RhdGEgJiYgYm9hcmRfZGF0YS0+aXNfcm1paSkKLQkJCWxwLT5waHlfaW50ZXJmYWNlID0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUk7Ci0JCWVsc2UKLQkJCWxwLT5waHlfaW50ZXJmYWNlID0gUEhZX0lOVEVSRkFDRV9NT0RFX01JSTsKLQl9IGVsc2UgewotCQlscC0+cGh5X2ludGVyZmFjZSA9IHJlczsKLQl9Ci0KLQltYWNiX3dyaXRlbChscCwgTkNSLCAwKTsKLQotCXJlZyA9IE1BQ0JfQkYoQ0xLLCBNQUNCX0NMS19ESVYzMikgfCBNQUNCX0JJVChCSUcpOwotCWlmIChscC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUk1JSSkKLQkJcmVnIHw9IE1BQ0JfQklUKFJNOTIwMF9STUlJKTsKLQotCW1hY2Jfd3JpdGVsKGxwLCBOQ0ZHUiwgcmVnKTsKLQotCS8qIFJlZ2lzdGVyIHRoZSBuZXR3b3JrIGludGVyZmFjZSAqLwotCXJlcyA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChyZXMpCi0JCWdvdG8gZXJyX2Rpc2FibGVfY2xvY2s7Ci0KLQlyZXMgPSBtYWNiX21paV9pbml0KGxwKTsKLQlpZiAocmVzKQotCQlnb3RvIGVycl9vdXRfdW5yZWdpc3Rlcl9uZXRkZXY7Ci0KLQkvKiB3aWxsIGJlIGVuYWJsZWQgaW4gb3BlbigpICovCi0JbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKLQotCXBoeWRldiA9IGxwLT5waHlfZGV2OwotCW5ldGRldl9pbmZvKGRldiwgImF0dGFjaGVkIFBIWSBkcml2ZXIgWyVzXSAobWlpX2J1czpwaHlfYWRkcj0lcywgaXJxPSVkKVxuIiwKLQkJCQlwaHlkZXYtPmRydi0+bmFtZSwgZGV2X25hbWUoJnBoeWRldi0+ZGV2KSwKLQkJCQlwaHlkZXYtPmlycSk7Ci0KLQkvKiBEaXNwbGF5IGV0aGVybmV0IGJhbm5lciAqLwotCW5ldGRldl9pbmZvKGRldiwgIkFUOTEgZXRoZXJuZXQgYXQgMHglMDhseCBpbnQ9JWQgKCVwTSlcbiIsCi0JCQkJZGV2LT5iYXNlX2FkZHIsIGRldi0+aXJxLCBkZXYtPmRldl9hZGRyKTsKLQotCXJldHVybiAwOwotCi1lcnJfb3V0X3VucmVnaXN0ZXJfbmV0ZGV2OgotCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7Ci1lcnJfZGlzYWJsZV9jbG9jazoKLQljbGtfZGlzYWJsZV91bnByZXBhcmUobHAtPnBjbGspOwotZXJyX2ZyZWVfZGV2OgotCWZyZWVfbmV0ZGV2KGRldik7Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGludCBhdDkxZXRoZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBtYWNiICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQlpZiAobHAtPnBoeV9kZXYpCi0JCXBoeV9kaXNjb25uZWN0KGxwLT5waHlfZGV2KTsKLQotCW1kaW9idXNfdW5yZWdpc3RlcihscC0+bWlpX2J1cyk7Ci0Ja2ZyZWUobHAtPm1paV9idXMtPmlycSk7Ci0JbWRpb2J1c19mcmVlKGxwLT5taWlfYnVzKTsKLQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShscC0+cGNsayk7Ci0JZnJlZV9uZXRkZXYoZGV2KTsKLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGF0OTFldGhlcl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG1hY2IgKmxwID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7Ci0KLQlpZiAobmV0aWZfcnVubmluZyhuZXRfZGV2KSkgewotCQluZXRpZl9zdG9wX3F1ZXVlKG5ldF9kZXYpOwotCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldF9kZXYpOwotCi0JCWNsa19kaXNhYmxlX3VucHJlcGFyZShscC0+cGNsayk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0OTFldGhlcl9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBtYWNiICpscCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcobmV0X2RldikpIHsKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKGxwLT5wY2xrKTsKLQotCQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldF9kZXYpOwotCQluZXRpZl9zdGFydF9xdWV1ZShuZXRfZGV2KTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0jZWxzZQotI2RlZmluZSBhdDkxZXRoZXJfc3VzcGVuZAlOVUxMCi0jZGVmaW5lIGF0OTFldGhlcl9yZXN1bWUJTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGF0OTFldGhlcl9kcml2ZXIgPSB7Ci0JLnJlbW92ZQkJPSBhdDkxZXRoZXJfcmVtb3ZlLAotCS5zdXNwZW5kCT0gYXQ5MWV0aGVyX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBhdDkxZXRoZXJfcmVzdW1lLAotCS5kcml2ZXIJCT0gewotCQkubmFtZQk9ICJhdDkxX2V0aGVyIiwKLQkJLm9mX21hdGNoX3RhYmxlCT0gb2ZfbWF0Y2hfcHRyKGF0OTFldGhlcl9kdF9pZHMpLAotCX0sCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyX3Byb2JlKGF0OTFldGhlcl9kcml2ZXIsIGF0OTFldGhlcl9wcm9iZSk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQVQ5MVJNOTIwMCBFTUFDIEV0aGVybmV0IGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiQW5kcmV3IFZpY3RvciIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTphdDkxX2V0aGVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWRlbmNlL21hY2IuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5jCmluZGV4IDgxZDQxNTMuLjlmNTM4NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAlyZXR1cm4gYnAtPnJ4X2J1ZmZlcnMgKyBicC0+cnhfYnVmZmVyX3NpemUgKiBtYWNiX3J4X3Jpbmdfd3JhcChpbmRleCk7CiB9CiAKLXZvaWQgbWFjYl9zZXRfaHdhZGRyKHN0cnVjdCBtYWNiICpicCkKK3N0YXRpYyB2b2lkIG1hY2Jfc2V0X2h3YWRkcihzdHJ1Y3QgbWFjYiAqYnApCiB7CiAJdTMyIGJvdHRvbTsKIAl1MTYgdG9wOwpAQCAtMTIwLDkgKzEyMCw4IEBACiAJbWFjYl9vcl9nZW1fd3JpdGVsKGJwLCBTQTRCLCAwKTsKIAltYWNiX29yX2dlbV93cml0ZWwoYnAsIFNBNFQsIDApOwogfQotRVhQT1JUX1NZTUJPTF9HUEwobWFjYl9zZXRfaHdhZGRyKTsKIAotdm9pZCBtYWNiX2dldF9od2FkZHIoc3RydWN0IG1hY2IgKmJwKQorc3RhdGljIHZvaWQgbWFjYl9nZXRfaHdhZGRyKHN0cnVjdCBtYWNiICpicCkKIHsKIAlzdHJ1Y3QgbWFjYl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAl1MzIgYm90dG9tOwpAQCAtMTYyLDcgKzE2MSw2IEBACiAJbmV0ZGV2X2luZm8oYnAtPmRldiwgImludmFsaWQgaHcgYWRkcmVzcywgdXNpbmcgcmFuZG9tXG4iKTsKIAlldGhfaHdfYWRkcl9yYW5kb20oYnAtPmRldik7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChtYWNiX2dldF9od2FkZHIpOwogCiBzdGF0aWMgaW50IG1hY2JfbWRpb19yZWFkKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBtaWlfaWQsIGludCByZWdudW0pCiB7CkBAIC0yMTMsNiArMjExLDkgQEAKIHsKIAlsb25nIGZlcnIsIHJhdGUsIHJhdGVfcm91bmRlZDsKIAorCWlmICghY2xrKQorCQlyZXR1cm47CisKIAlzd2l0Y2ggKHNwZWVkKSB7CiAJY2FzZSBTUEVFRF8xMDoKIAkJcmF0ZSA9IDI1MDAwMDA7CkBAIC0yOTIsMTEgKzI5MywxMyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnAtPmxvY2ssIGZsYWdzKTsKIAotCWlmICghSVNfRVJSKGJwLT50eF9jbGspKQotCQltYWNiX3NldF90eF9jbGsoYnAtPnR4X2NsaywgcGh5ZGV2LT5zcGVlZCwgZGV2KTsKLQogCWlmIChzdGF0dXNfY2hhbmdlKSB7CiAJCWlmIChwaHlkZXYtPmxpbmspIHsKKwkJCS8qIFVwZGF0ZSB0aGUgVFggY2xvY2sgcmF0ZSBpZiBhbmQgb25seSBpZiB0aGUgbGluayBpcworCQkJICogdXAgYW5kIHRoZXJlIGhhcyBiZWVuIGEgbGluayBjaGFuZ2UuCisJCQkgKi8KKwkJCW1hY2Jfc2V0X3R4X2NsayhicC0+dHhfY2xrLCBwaHlkZXYtPnNwZWVkLCBkZXYpOworCiAJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CiAJCQluZXRkZXZfaW5mbyhkZXYsICJsaW5rIHVwICglZC8lcylcbiIsCiAJCQkJICAgIHBoeWRldi0+c3BlZWQsCkBAIC0zNTcsNyArMzYwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG1hY2JfbWlpX2luaXQoc3RydWN0IG1hY2IgKmJwKQorc3RhdGljIGludCBtYWNiX21paV9pbml0KHN0cnVjdCBtYWNiICpicCkKIHsKIAlzdHJ1Y3QgbWFjYl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwpAQCAtNDM4LDcgKzQ0MSw2IEBACiBlcnJfb3V0OgogCXJldHVybiBlcnI7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChtYWNiX21paV9pbml0KTsKIAogc3RhdGljIHZvaWQgbWFjYl91cGRhdGVfc3RhdHMoc3RydWN0IG1hY2IgKmJwKQogewpAQCAtNDQ5LDcgKzQ1MSw3IEBACiAJV0FSTl9PTigodW5zaWduZWQgbG9uZykoZW5kIC0gcCAtIDEpICE9IChNQUNCX1RQRiAtIE1BQ0JfUEZSKSAvIDQpOwogCiAJZm9yKDsgcCA8IGVuZDsgcCsrLCByZWcrKykKLQkJKnAgKz0gX19yYXdfcmVhZGwocmVnKTsKKwkJKnAgKz0gcmVhZGxfcmVsYXhlZChyZWcpOwogfQogCiBzdGF0aWMgaW50IG1hY2JfaGFsdF90eChzdHJ1Y3QgbWFjYiAqYnApCkBAIC0xNTc4LDYgKzE1ODAsNyBAQAogc3RhdGljIHZvaWQgbWFjYl9jb25maWd1cmVfZG1hKHN0cnVjdCBtYWNiICpicCkKIHsKIAl1MzIgZG1hY2ZnOworCXUzMiB0bXAsIG5jcjsKIAogCWlmIChtYWNiX2lzX2dlbShicCkpIHsKIAkJZG1hY2ZnID0gZ2VtX3JlYWRsKGJwLCBETUFDRkcpICYgfkdFTV9CRihSWEJTLCAtMUwpOwpAQCAtMTU4NSw3ICsxNTg4LDI0IEBACiAJCWlmIChicC0+ZG1hX2J1cnN0X2xlbmd0aCkKIAkJCWRtYWNmZyA9IEdFTV9CRklOUyhGQkxETywgYnAtPmRtYV9idXJzdF9sZW5ndGgsIGRtYWNmZyk7CiAJCWRtYWNmZyB8PSBHRU1fQklUKFRYUEJNUykgfCBHRU1fQkYoUlhCTVMsIC0xTCk7Ci0JCWRtYWNmZyAmPSB+R0VNX0JJVChFTkRJQSk7CisJCWRtYWNmZyAmPSB+R0VNX0JJVChFTkRJQV9QS1QpOworCisJCS8qIEZpbmQgdGhlIENQVSBlbmRpYW5uZXNzIGJ5IHVzaW5nIHRoZSBsb29wYmFjayBiaXQgb2YgbmV0X2N0cmwKKwkJICogcmVnaXN0ZXIuIHNhdmUgaXQgZmlyc3QuIFdoZW4gdGhlIENQVSBpcyBpbiBiaWcgZW5kaWFuIHdlCisJCSAqIG5lZWQgdG8gcHJvZ3JhbSBzd2FwZWQgbW9kZSBmb3IgbWFuYWdlbWVudCBkZXNjcmlwdG9yIGFjY2Vzcy4KKwkJICovCisJCW5jciA9IG1hY2JfcmVhZGwoYnAsIE5DUik7CisJCV9fcmF3X3dyaXRlbChNQUNCX0JJVChMTEIpLCBicC0+cmVncyArIE1BQ0JfTkNSKTsKKwkJdG1wID0gIF9fcmF3X3JlYWRsKGJwLT5yZWdzICsgTUFDQl9OQ1IpOworCisJCWlmICh0bXAgPT0gTUFDQl9CSVQoTExCKSkKKwkJCWRtYWNmZyAmPSB+R0VNX0JJVChFTkRJQV9ERVNDKTsKKwkJZWxzZQorCQkJZG1hY2ZnIHw9IEdFTV9CSVQoRU5ESUFfREVTQyk7IC8qIENQVSBpbiBiaWcgZW5kaWFuICovCisKKwkJLyogUmVzdG9yZSBuZXRfY3RybCAqLworCQltYWNiX3dyaXRlbChicCwgTkNSLCBuY3IpOworCiAJCWlmIChicC0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfQ1NVTSkKIAkJCWRtYWNmZyB8PSBHRU1fQklUKFRYQ09FTik7CiAJCWVsc2UKQEAgLTE3MjMsNyArMTc0Myw3IEBACiAvKgogICogRW5hYmxlL0Rpc2FibGUgcHJvbWlzY3VvdXMgYW5kIG11bHRpY2FzdCBtb2Rlcy4KICAqLwotdm9pZCBtYWNiX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBtYWNiX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBjZmc7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTE3NjQsNyArMTc4NCw2IEBACiAKIAltYWNiX3dyaXRlbChicCwgTkNGR1IsIGNmZyk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChtYWNiX3NldF9yeF9tb2RlKTsKIAogc3RhdGljIGludCBtYWNiX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTE4MzIsMTQgKzE4NTEsMTQgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBHRU1fU1RBVFNfTEVOOyArK2ksICsrcCkgewogCQl1MzIgb2Zmc2V0ID0gZ2VtX3N0YXRpc3RpY3NbaV0ub2Zmc2V0OwotCQl1NjQgdmFsID0gX19yYXdfcmVhZGwoYnAtPnJlZ3MgKyBvZmZzZXQpOworCQl1NjQgdmFsID0gcmVhZGxfcmVsYXhlZChicC0+cmVncyArIG9mZnNldCk7CiAKIAkJYnAtPmV0aHRvb2xfc3RhdHNbaV0gKz0gdmFsOwogCQkqcCArPSB2YWw7CiAKIAkJaWYgKG9mZnNldCA9PSBHRU1fT0NUVFhMIHx8IG9mZnNldCA9PSBHRU1fT0NUUlhMKSB7CiAJCQkvKiBBZGQgR0VNX09DVFRYSCwgR0VNX09DVFJYSCAqLwotCQkJdmFsID0gX19yYXdfcmVhZGwoYnAtPnJlZ3MgKyBvZmZzZXQgKyA0KTsKKwkJCXZhbCA9IHJlYWRsX3JlbGF4ZWQoYnAtPnJlZ3MgKyBvZmZzZXQgKyA0KTsKIAkJCWJwLT5ldGh0b29sX3N0YXRzW2ldICs9ICgodTY0KXZhbCkgPDwgMzI7CiAJCQkqKCsrcCkgKz0gdmFsOwogCQl9CkBAIC0xOTE3LDcgKzE5MzYsNyBAQAogCX0KIH0KIAotc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1hY2JfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKm1hY2JfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbnN0YXQgPSAmYnAtPnN0YXRzOwpAQCAtMTkzNywxMiArMTk1NiwxMiBAQAogCQkJICAgIGh3c3RhdC0+cnhfb3ZlcnNpemVfcGt0cyArCiAJCQkgICAgaHdzdGF0LT5yeF9qYWJiZXJzICsKIAkJCSAgICBod3N0YXQtPnJ4X3VuZGVyc2l6ZV9wa3RzICsKLQkJCSAgICBod3N0YXQtPnNxZV90ZXN0X2Vycm9ycyArCiAJCQkgICAgaHdzdGF0LT5yeF9sZW5ndGhfbWlzbWF0Y2gpOwogCW5zdGF0LT50eF9lcnJvcnMgPSAoaHdzdGF0LT50eF9sYXRlX2NvbHMgKwogCQkJICAgIGh3c3RhdC0+dHhfZXhjZXNzaXZlX2NvbHMgKwogCQkJICAgIGh3c3RhdC0+dHhfdW5kZXJydW5zICsKLQkJCSAgICBod3N0YXQtPnR4X2NhcnJpZXJfZXJyb3JzKTsKKwkJCSAgICBod3N0YXQtPnR4X2NhcnJpZXJfZXJyb3JzICsKKwkJCSAgICBod3N0YXQtPnNxZV90ZXN0X2Vycm9ycyk7CiAJbnN0YXQtPmNvbGxpc2lvbnMgPSAoaHdzdGF0LT50eF9zaW5nbGVfY29scyArCiAJCQkgICAgIGh3c3RhdC0+dHhfbXVsdGlwbGVfY29scyArCiAJCQkgICAgIGh3c3RhdC0+dHhfZXhjZXNzaXZlX2NvbHMpOwpAQCAtMTk2Myw3ICsxOTgyLDYgQEAKIAogCXJldHVybiBuc3RhdDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG1hY2JfZ2V0X3N0YXRzKTsKIAogc3RhdGljIGludCBtYWNiX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKIHsKQEAgLTIwMTksMTMgKzIwMzcsMTMgQEAKIAlyZWdzX2J1ZmZbMTBdID0gbWFjYl90eF9kbWEoJmJwLT5xdWV1ZXNbMF0sIHRhaWwpOwogCXJlZ3NfYnVmZlsxMV0gPSBtYWNiX3R4X2RtYSgmYnAtPnF1ZXVlc1swXSwgaGVhZCk7CiAKKwlyZWdzX2J1ZmZbMTJdID0gbWFjYl9vcl9nZW1fcmVhZGwoYnAsIFVTUklPKTsKIAlpZiAobWFjYl9pc19nZW0oYnApKSB7Ci0JCXJlZ3NfYnVmZlsxMl0gPSBnZW1fcmVhZGwoYnAsIFVTUklPKTsKIAkJcmVnc19idWZmWzEzXSA9IGdlbV9yZWFkbChicCwgRE1BQ0ZHKTsKIAl9CiB9CiAKLWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBtYWNiX2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBtYWNiX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MJCT0gbWFjYl9nZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncwkJPSBtYWNiX3NldF9zZXR0aW5ncywKIAkuZ2V0X3JlZ3NfbGVuCQk9IG1hY2JfZ2V0X3JlZ3NfbGVuLApAQCAtMjAzMyw3ICsyMDUxLDYgQEAKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X3RzX2luZm8JCT0gZXRodG9vbF9vcF9nZXRfdHNfaW5mbywKIH07Ci1FWFBPUlRfU1lNQk9MX0dQTChtYWNiX2V0aHRvb2xfb3BzKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBnZW1fZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncwkJPSBtYWNiX2dldF9zZXR0aW5ncywKQEAgLTIwNDcsNyArMjA2NCw3IEBACiAJLmdldF9zc2V0X2NvdW50CQk9IGdlbV9nZXRfc3NldF9jb3VudCwKIH07CiAKLWludCBtYWNiX2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCitzdGF0aWMgaW50IG1hY2JfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCkKIHsKIAlzdHJ1Y3QgbWFjYiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXYgPSBicC0+cGh5X2RldjsKQEAgLTIwNjAsNyArMjA3Nyw2IEBACiAKIAlyZXR1cm4gcGh5X21paV9pb2N0bChwaHlkZXYsIHJxLCBjbWQpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwobWFjYl9pb2N0bCk7CiAKIHN0YXRpYyBpbnQgbWFjYl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCkBAIC0yMTEyLDYzICsyMTI4LDIwIEBACiAJLm5kb19zZXRfZmVhdHVyZXMJPSBtYWNiX3NldF9mZWF0dXJlcywKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19PRikKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjYl9jb25maWcgcGMzMDJnZW1fY29uZmlnID0gewotCS5jYXBzID0gTUFDQl9DQVBTX1NHX0RJU0FCTEVEIHwgTUFDQl9DQVBTX0dJR0FCSVRfTU9ERV9BVkFJTEFCTEUsCi0JLmRtYV9idXJzdF9sZW5ndGggPSAxNiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjYl9jb25maWcgc2FtYTVkM19jb25maWcgPSB7Ci0JLmNhcHMgPSBNQUNCX0NBUFNfU0dfRElTQUJMRUQgfCBNQUNCX0NBUFNfR0lHQUJJVF9NT0RFX0FWQUlMQUJMRSwKLQkuZG1hX2J1cnN0X2xlbmd0aCA9IDE2LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNiX2NvbmZpZyBzYW1hNWQ0X2NvbmZpZyA9IHsKLQkuY2FwcyA9IDAsCi0JLmRtYV9idXJzdF9sZW5ndGggPSA0LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWFjYl9kdF9pZHNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gImNkbnMsYXQzMmFwNzAwMC1tYWNiIiB9LAotCXsgLmNvbXBhdGlibGUgPSAiY2RucyxhdDkxc2FtOTI2MC1tYWNiIiB9LAotCXsgLmNvbXBhdGlibGUgPSAiY2RucyxtYWNiIiB9LAotCXsgLmNvbXBhdGlibGUgPSAiY2RucyxwYzMwMi1nZW0iLCAuZGF0YSA9ICZwYzMwMmdlbV9jb25maWcgfSwKLQl7IC5jb21wYXRpYmxlID0gImNkbnMsZ2VtIiwgLmRhdGEgPSAmcGMzMDJnZW1fY29uZmlnIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJhdG1lbCxzYW1hNWQzLWdlbSIsIC5kYXRhID0gJnNhbWE1ZDNfY29uZmlnIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJhdG1lbCxzYW1hNWQ0LWdlbSIsIC5kYXRhID0gJnNhbWE1ZDRfY29uZmlnIH0sCi0JeyAvKiBzZW50aW5lbCAqLyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbWFjYl9kdF9pZHMpOwotI2VuZGlmCi0KIC8qCi0gKiBDb25maWd1cmUgcGVyaXBoZXJhbCBjYXBhY2l0aWVzIGFjY29yZGluZyB0byBkZXZpY2UgdHJlZQorICogQ29uZmlndXJlIHBlcmlwaGVyYWwgY2FwYWJpbGl0aWVzIGFjY29yZGluZyB0byBkZXZpY2UgdHJlZQogICogYW5kIGludGVncmF0aW9uIG9wdGlvbnMgdXNlZAogICovCi1zdGF0aWMgdm9pZCBtYWNiX2NvbmZpZ3VyZV9jYXBzKHN0cnVjdCBtYWNiICpicCkKK3N0YXRpYyB2b2lkIG1hY2JfY29uZmlndXJlX2NhcHMoc3RydWN0IG1hY2IgKmJwLCBjb25zdCBzdHJ1Y3QgbWFjYl9jb25maWcgKmR0X2NvbmYpCiB7CiAJdTMyIGRjZmc7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7Ci0JY29uc3Qgc3RydWN0IG1hY2JfY29uZmlnICpjb25maWc7CiAKLQlpZiAoYnAtPnBkZXYtPmRldi5vZl9ub2RlKSB7Ci0JCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShtYWNiX2R0X2lkcywgYnAtPnBkZXYtPmRldi5vZl9ub2RlKTsKLQkJaWYgKG1hdGNoICYmIG1hdGNoLT5kYXRhKSB7Ci0JCQljb25maWcgPSBtYXRjaC0+ZGF0YTsKKwlpZiAoZHRfY29uZikKKwkJYnAtPmNhcHMgPSBkdF9jb25mLT5jYXBzOwogCi0JCQlicC0+Y2FwcyA9IGNvbmZpZy0+Y2FwczsKLQkJCS8qCi0JCQkgKiBBcyB3ZSBoYXZlIGFjY2VzcyB0byB0aGUgbWF0Y2hpbmcgbm9kZSwgY29uZmlndXJlCi0JCQkgKiBETUEgYnVyc3QgbGVuZ3RoIGFzIHdlbGwKLQkJCSAqLwotCQkJYnAtPmRtYV9idXJzdF9sZW5ndGggPSBjb25maWctPmRtYV9idXJzdF9sZW5ndGg7Ci0JCX0KLQl9Ci0KLQlpZiAoTUFDQl9CRkVYVChJRE5VTSwgbWFjYl9yZWFkbChicCwgTUlEKSkgPT0gMHgyKQorCWlmIChtYWNiX2lzX2dlbV9odyhicC0+cmVncykpIHsKIAkJYnAtPmNhcHMgfD0gTUFDQl9DQVBTX01BQ0JfSVNfR0VNOwogCi0JaWYgKG1hY2JfaXNfZ2VtKGJwKSkgewogCQlkY2ZnID0gZ2VtX3JlYWRsKGJwLCBEQ0ZHMSk7CiAJCWlmIChHRU1fQkZFWFQoSVJRQ09SLCBkY2ZnKSA9PSAwKQogCQkJYnAtPmNhcHMgfD0gTUFDQl9DQVBTX0lTUl9DTEVBUl9PTl9XUklURTsKQEAgLTIxODUsMTggKzIxNTgsMjIgQEAKIAkJCSAgICAgIHVuc2lnbmVkIGludCAqbnVtX3F1ZXVlcykKIHsKIAl1bnNpZ25lZCBpbnQgaHdfcTsKLQl1MzIgbWlkOwogCiAJKnF1ZXVlX21hc2sgPSAweDE7CiAJKm51bV9xdWV1ZXMgPSAxOwogCi0JLyogaXMgaXQgbWFjYiBvciBnZW0gPyAqLwotCW1pZCA9IF9fcmF3X3JlYWRsKG1lbSArIE1BQ0JfTUlEKTsKLQlpZiAoTUFDQl9CRkVYVChJRE5VTSwgbWlkKSAhPSAweDIpCisJLyogaXMgaXQgbWFjYiBvciBnZW0gPworCSAqCisJICogV2UgbmVlZCB0byByZWFkIGRpcmVjdGx5IGZyb20gdGhlIGhhcmR3YXJlIGhlcmUgYmVjYXVzZQorCSAqIHdlIGFyZSBlYXJseSBpbiB0aGUgcHJvYmUgcHJvY2VzcyBhbmQgZG9uJ3QgaGF2ZSB0aGUKKwkgKiBNQUNCX0NBUFNfTUFDQl9JU19HRU0gZmxhZyBwb3NpdGlvbmVkCisJICovCisJaWYgKCFtYWNiX2lzX2dlbV9odyhtZW0pKQogCQlyZXR1cm47CiAKIAkvKiBiaXQgMCBpcyBuZXZlciBzZXQgYnV0IHF1ZXVlIDAgYWx3YXlzIGV4aXN0cyAqLwotCSpxdWV1ZV9tYXNrID0gX19yYXdfcmVhZGwobWVtICsgR0VNX0RDRkc2KSAmIDB4ZmY7CisJKnF1ZXVlX21hc2sgPSByZWFkbF9yZWxheGVkKG1lbSArIEdFTV9EQ0ZHNikgJiAweGZmOworCiAJKnF1ZXVlX21hc2sgfD0gMHgxOwogCiAJZm9yIChod19xID0gMTsgaHdfcSA8IE1BQ0JfTUFYX1FVRVVFUzsgKytod19xKQpAQCAtMjIwNCw5NSArMjE4MSw3MyBAQAogCQkJKCpudW1fcXVldWVzKSsrOwogfQogCi1zdGF0aWMgaW50IG1hY2JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgbWFjYl9jbGtfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgY2xrICoqcGNsaywKKwkJCSBzdHJ1Y3QgY2xrICoqaGNsaywgc3RydWN0IGNsayAqKnR4X2NsaykKIHsKLQlzdHJ1Y3QgbWFjYl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbWFjYiAqYnA7Ci0Jc3RydWN0IG1hY2JfcXVldWUgKnF1ZXVlOwotCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7Ci0JdTMyIGNvbmZpZzsKLQlpbnQgZXJyID0gLUVOWElPOwotCWNvbnN0IGNoYXIgKm1hYzsKLQl2b2lkIF9faW9tZW0gKm1lbTsKLQl1bnNpZ25lZCBpbnQgaHdfcSwgcXVldWVfbWFzaywgcSwgbnVtX3F1ZXVlczsKLQlzdHJ1Y3QgY2xrICpwY2xrLCAqaGNsaywgKnR4X2NsazsKKwlpbnQgZXJyOwogCi0JcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyZWdzKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIG1taW8gcmVzb3VyY2UgZGVmaW5lZFxuIik7Ci0JCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlwY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2xrIik7Ci0JaWYgKElTX0VSUihwY2xrKSkgewotCQllcnIgPSBQVFJfRVJSKHBjbGspOworCSpwY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJwY2xrIik7CisJaWYgKElTX0VSUigqcGNsaykpIHsKKwkJZXJyID0gUFRSX0VSUigqcGNsayk7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWFjYl9jbGsgKCV1KVxuIiwgZXJyKTsKLQkJZ290byBlcnJfb3V0OworCQlyZXR1cm4gZXJyOwogCX0KIAotCWhjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImhjbGsiKTsKLQlpZiAoSVNfRVJSKGhjbGspKSB7Ci0JCWVyciA9IFBUUl9FUlIoaGNsayk7CisJKmhjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImhjbGsiKTsKKwlpZiAoSVNfRVJSKCpoY2xrKSkgeworCQllcnIgPSBQVFJfRVJSKCpoY2xrKTsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBoY2xrICgldSlcbiIsIGVycik7Ci0JCWdvdG8gZXJyX291dDsKKwkJcmV0dXJuIGVycjsKIAl9CiAKLQl0eF9jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInR4X2NsayIpOworCSp0eF9jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInR4X2NsayIpOworCWlmIChJU19FUlIoKnR4X2NsaykpCisJCSp0eF9jbGsgPSBOVUxMOwogCi0JZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKHBjbGspOworCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZSgqcGNsayk7CiAJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIHBjbGsgKCV1KVxuIiwgZXJyKTsKLQkJZ290byBlcnJfb3V0OworCQlyZXR1cm4gZXJyOwogCX0KIAotCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZShoY2xrKTsKKwllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoKmhjbGspOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBoY2xrICgldSlcbiIsIGVycik7Ci0JCWdvdG8gZXJyX291dF9kaXNhYmxlX3BjbGs7CisJCWdvdG8gZXJyX2Rpc2FibGVfcGNsazsKIAl9CiAKLQlpZiAoIUlTX0VSUih0eF9jbGspKSB7Ci0JCWVyciA9IGNsa19wcmVwYXJlX2VuYWJsZSh0eF9jbGspOwotCQlpZiAoZXJyKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIHR4X2NsayAoJXUpXG4iLAotCQkJCWVycik7Ci0JCQlnb3RvIGVycl9vdXRfZGlzYWJsZV9oY2xrOwotCQl9CisJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKCp0eF9jbGspOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSB0eF9jbGsgKCV1KVxuIiwgZXJyKTsKKwkJZ290byBlcnJfZGlzYWJsZV9oY2xrOwogCX0KIAotCWVyciA9IC1FTk9NRU07Ci0JbWVtID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlZ3MtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlZ3MpKTsKLQlpZiAoIW1lbSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gbWFwIHJlZ2lzdGVycywgYWJvcnRpbmcuXG4iKTsKLQkJZ290byBlcnJfb3V0X2Rpc2FibGVfY2xvY2tzOwotCX0KKwlyZXR1cm4gMDsKIAotCW1hY2JfcHJvYmVfcXVldWVzKG1lbSwgJnF1ZXVlX21hc2ssICZudW1fcXVldWVzKTsKLQlkZXYgPSBhbGxvY19ldGhlcmRldl9tcShzaXplb2YoKmJwKSwgbnVtX3F1ZXVlcyk7Ci0JaWYgKCFkZXYpCi0JCWdvdG8gZXJyX291dF9kaXNhYmxlX2Nsb2NrczsKK2Vycl9kaXNhYmxlX2hjbGs6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKCpoY2xrKTsKIAotCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CitlcnJfZGlzYWJsZV9wY2xrOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZSgqcGNsayk7CiAKLQlicCA9IG5ldGRldl9wcml2KGRldik7Ci0JYnAtPnBkZXYgPSBwZGV2OwotCWJwLT5kZXYgPSBkZXY7Ci0JYnAtPnJlZ3MgPSBtZW07Ci0JYnAtPm51bV9xdWV1ZXMgPSBudW1fcXVldWVzOwotCWJwLT5wY2xrID0gcGNsazsKLQlicC0+aGNsayA9IGhjbGs7Ci0JYnAtPnR4X2NsayA9IHR4X2NsazsKKwlyZXR1cm4gZXJyOworfQogCi0Jc3Bpbl9sb2NrX2luaXQoJmJwLT5sb2NrKTsKK3N0YXRpYyBpbnQgbWFjYl9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGludCBod19xLCBxOworCXN0cnVjdCBtYWNiICpicCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1hY2JfcXVldWUgKnF1ZXVlOworCWludCBlcnI7CisJdTMyIHZhbDsKIAogCS8qIHNldCB0aGUgcXVldWUgcmVnaXN0ZXIgbWFwcGluZyBvbmNlIGZvciBhbGw6IHF1ZXVlMCBoYXMgYSBzcGVjaWFsCiAJICogcmVnaXN0ZXIgbWFwcGluZyBidXQgd2UgZG9uJ3Qgd2FudCB0byB0ZXN0IHRoZSBxdWV1ZSBpbmRleCB0aGVuCiAJICogY29tcHV0ZSB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RlciBvZmZzZXQgYXQgcnVuIHRpbWUuCiAJICovCiAJZm9yIChod19xID0gMCwgcSA9IDA7IGh3X3EgPCBNQUNCX01BWF9RVUVVRVM7ICsraHdfcSkgewotCQlpZiAoIShxdWV1ZV9tYXNrICYgKDEgPDwgaHdfcSkpKQorCQlpZiAoIShicC0+cXVldWVfbWFzayAmICgxIDw8IGh3X3EpKSkKIAkJCWNvbnRpbnVlOwogCiAJCXF1ZXVlID0gJmJwLT5xdWV1ZXNbcV07CkBAIC0yMzE5LDI3ICsyMjc0LDIxIEBACiAJCSAqLwogCQlxdWV1ZS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBxKTsKIAkJZXJyID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBxdWV1ZS0+aXJxLCBtYWNiX2ludGVycnVwdCwKLQkJCQkgICAgICAgMCwgZGV2LT5uYW1lLCBxdWV1ZSk7CisJCQkJICAgICAgIElSUUZfU0hBUkVELCBkZXYtPm5hbWUsIHF1ZXVlKTsKIAkJaWYgKGVycikgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJCSJVbmFibGUgdG8gcmVxdWVzdCBJUlEgJWQgKGVycm9yICVkKVxuIiwKIAkJCQlxdWV1ZS0+aXJxLCBlcnIpOwotCQkJZ290byBlcnJfb3V0X2ZyZWVfbmV0ZGV2OworCQkJcmV0dXJuIGVycjsKIAkJfQogCiAJCUlOSVRfV09SSygmcXVldWUtPnR4X2Vycm9yX3Rhc2ssIG1hY2JfdHhfZXJyb3JfdGFzayk7CiAJCXErKzsKIAl9Ci0JZGV2LT5pcnEgPSBicC0+cXVldWVzWzBdLmlycTsKIAogCWRldi0+bmV0ZGV2X29wcyA9ICZtYWNiX25ldGRldl9vcHM7CiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmYnAtPm5hcGksIG1hY2JfcG9sbCwgNjQpOwogCi0JZGV2LT5iYXNlX2FkZHIgPSByZWdzLT5zdGFydDsKLQotCS8qIHNldHVwIGNhcGFjaXRpZXMgKi8KLQltYWNiX2NvbmZpZ3VyZV9jYXBzKGJwKTsKLQogCS8qIHNldHVwIGFwcHJvcHJpYXRlZCByb3V0aW5lcyBhY2NvcmRpbmcgdG8gYWRhcHRlciB0eXBlICovCiAJaWYgKG1hY2JfaXNfZ2VtKGJwKSkgewogCQlicC0+bWF4X3R4X2xlbmd0aCA9IEdFTV9NQVhfVFhfTEVOOwpAQCAtMjM2NiwxOCArMjMxNSw0NzAgQEAKIAkJZGV2LT5od19mZWF0dXJlcyAmPSB+TkVUSUZfRl9TRzsKIAlkZXYtPmZlYXR1cmVzID0gZGV2LT5od19mZWF0dXJlczsKIAotCS8qIFNldCBNSUkgbWFuYWdlbWVudCBjbG9jayBkaXZpZGVyICovCi0JY29uZmlnID0gbWFjYl9tZGNfY2xrX2RpdihicCk7Ci0JY29uZmlnIHw9IG1hY2JfZGJ3KGJwKTsKLQltYWNiX3dyaXRlbChicCwgTkNGR1IsIGNvbmZpZyk7CisJdmFsID0gMDsKKwlpZiAoYnAtPnBoeV9pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJKQorCQl2YWwgPSBHRU1fQklUKFJHTUlJKTsKKwllbHNlIGlmIChicC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUk1JSSAmJgorCQkgKGJwLT5jYXBzICYgTUFDQl9DQVBTX1VTUklPX0RFRkFVTFRfSVNfTUlJKSkKKwkJdmFsID0gTUFDQl9CSVQoUk1JSSk7CisJZWxzZSBpZiAoIShicC0+Y2FwcyAmIE1BQ0JfQ0FQU19VU1JJT19ERUZBVUxUX0lTX01JSSkpCisJCXZhbCA9IE1BQ0JfQklUKE1JSSk7CiAKLQltYWMgPSBvZl9nZXRfbWFjX2FkZHJlc3MocGRldi0+ZGV2Lm9mX25vZGUpOworCWlmIChicC0+Y2FwcyAmIE1BQ0JfQ0FQU19VU1JJT19IQVNfQ0xLRU4pCisJCXZhbCB8PSBNQUNCX0JJVChDTEtFTik7CisKKwltYWNiX29yX2dlbV93cml0ZWwoYnAsIFVTUklPLCB2YWwpOworCisJLyogU2V0IE1JSSBtYW5hZ2VtZW50IGNsb2NrIGRpdmlkZXIgKi8KKwl2YWwgPSBtYWNiX21kY19jbGtfZGl2KGJwKTsKKwl2YWwgfD0gbWFjYl9kYncoYnApOworCW1hY2Jfd3JpdGVsKGJwLCBOQ0ZHUiwgdmFsKTsKKworCXJldHVybiAwOworfQorCisjaWYgZGVmaW5lZChDT05GSUdfT0YpCisvKiAxNTE4IHJvdW5kZWQgdXAgKi8KKyNkZWZpbmUgQVQ5MUVUSEVSX01BWF9SQlVGRl9TWgkweDYwMAorLyogbWF4IG51bWJlciBvZiByZWNlaXZlIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgQVQ5MUVUSEVSX01BWF9SWF9ERVNDUgk5CisKKy8qIEluaXRpYWxpemUgYW5kIHN0YXJ0IHRoZSBSZWNlaXZlciBhbmQgVHJhbnNtaXQgc3Vic3lzdGVtcyAqLworc3RhdGljIGludCBhdDkxZXRoZXJfc3RhcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjYiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCWRtYV9hZGRyX3QgYWRkcjsKKwl1MzIgY3RsOworCWludCBpOworCisJbHAtPnJ4X3JpbmcgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmxwLT5wZGV2LT5kZXYsCisJCQkJCSAoQVQ5MUVUSEVSX01BWF9SWF9ERVNDUiAqCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBtYWNiX2RtYV9kZXNjKSksCisJCQkJCSAmbHAtPnJ4X3JpbmdfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxwLT5yeF9yaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxwLT5yeF9idWZmZXJzID0gZG1hX2FsbG9jX2NvaGVyZW50KCZscC0+cGRldi0+ZGV2LAorCQkJCQkgICAgQVQ5MUVUSEVSX01BWF9SWF9ERVNDUiAqCisJCQkJCSAgICBBVDkxRVRIRVJfTUFYX1JCVUZGX1NaLAorCQkJCQkgICAgJmxwLT5yeF9idWZmZXJzX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFscC0+cnhfYnVmZmVycykgeworCQlkbWFfZnJlZV9jb2hlcmVudCgmbHAtPnBkZXYtPmRldiwKKwkJCQkgIEFUOTFFVEhFUl9NQVhfUlhfREVTQ1IgKgorCQkJCSAgc2l6ZW9mKHN0cnVjdCBtYWNiX2RtYV9kZXNjKSwKKwkJCQkgIGxwLT5yeF9yaW5nLCBscC0+cnhfcmluZ19kbWEpOworCQlscC0+cnhfcmluZyA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFkZHIgPSBscC0+cnhfYnVmZmVyc19kbWE7CisJZm9yIChpID0gMDsgaSA8IEFUOTFFVEhFUl9NQVhfUlhfREVTQ1I7IGkrKykgeworCQlscC0+cnhfcmluZ1tpXS5hZGRyID0gYWRkcjsKKwkJbHAtPnJ4X3JpbmdbaV0uY3RybCA9IDA7CisJCWFkZHIgKz0gQVQ5MUVUSEVSX01BWF9SQlVGRl9TWjsKKwl9CisKKwkvKiBTZXQgdGhlIFdyYXAgYml0IG9uIHRoZSBsYXN0IGRlc2NyaXB0b3IgKi8KKwlscC0+cnhfcmluZ1tBVDkxRVRIRVJfTUFYX1JYX0RFU0NSIC0gMV0uYWRkciB8PSBNQUNCX0JJVChSWF9XUkFQKTsKKworCS8qIFJlc2V0IGJ1ZmZlciBpbmRleCAqLworCWxwLT5yeF90YWlsID0gMDsKKworCS8qIFByb2dyYW0gYWRkcmVzcyBvZiBkZXNjcmlwdG9yIGxpc3QgaW4gUnggQnVmZmVyIFF1ZXVlIHJlZ2lzdGVyICovCisJbWFjYl93cml0ZWwobHAsIFJCUVAsIGxwLT5yeF9yaW5nX2RtYSk7CisKKwkvKiBFbmFibGUgUmVjZWl2ZSBhbmQgVHJhbnNtaXQgKi8KKwljdGwgPSBtYWNiX3JlYWRsKGxwLCBOQ1IpOworCW1hY2Jfd3JpdGVsKGxwLCBOQ1IsIGN0bCB8IE1BQ0JfQklUKFJFKSB8IE1BQ0JfQklUKFRFKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogT3BlbiB0aGUgZXRoZXJuZXQgaW50ZXJmYWNlICovCitzdGF0aWMgaW50IGF0OTFldGhlcl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hY2IgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgY3RsOworCWludCByZXQ7CisKKwkvKiBDbGVhciBpbnRlcm5hbCBzdGF0aXN0aWNzICovCisJY3RsID0gbWFjYl9yZWFkbChscCwgTkNSKTsKKwltYWNiX3dyaXRlbChscCwgTkNSLCBjdGwgfCBNQUNCX0JJVChDTFJTVEFUKSk7CisKKwltYWNiX3NldF9od2FkZHIobHApOworCisJcmV0ID0gYXQ5MWV0aGVyX3N0YXJ0KGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEVuYWJsZSBNQUMgaW50ZXJydXB0cyAqLworCW1hY2Jfd3JpdGVsKGxwLCBJRVIsIE1BQ0JfQklUKFJDT01QKQl8CisJCQkgICAgIE1BQ0JfQklUKFJYVUJSKQl8CisJCQkgICAgIE1BQ0JfQklUKElTUl9UVU5EKQl8CisJCQkgICAgIE1BQ0JfQklUKElTUl9STEUpCXwKKwkJCSAgICAgTUFDQl9CSVQoVENPTVApCXwKKwkJCSAgICAgTUFDQl9CSVQoSVNSX1JPVlIpCXwKKwkJCSAgICAgTUFDQl9CSVQoSFJFU1ApKTsKKworCS8qIHNjaGVkdWxlIGEgbGluayBzdGF0ZSBjaGVjayAqLworCXBoeV9zdGFydChscC0+cGh5X2Rldik7CisKKwluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENsb3NlIHRoZSBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgYXQ5MWV0aGVyX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hY2IgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgY3RsOworCisJLyogRGlzYWJsZSBSZWNlaXZlciBhbmQgVHJhbnNtaXR0ZXIgKi8KKwljdGwgPSBtYWNiX3JlYWRsKGxwLCBOQ1IpOworCW1hY2Jfd3JpdGVsKGxwLCBOQ1IsIGN0bCAmIH4oTUFDQl9CSVQoVEUpIHwgTUFDQl9CSVQoUkUpKSk7CisKKwkvKiBEaXNhYmxlIE1BQyBpbnRlcnJ1cHRzICovCisJbWFjYl93cml0ZWwobHAsIElEUiwgTUFDQl9CSVQoUkNPTVApCXwKKwkJCSAgICAgTUFDQl9CSVQoUlhVQlIpCXwKKwkJCSAgICAgTUFDQl9CSVQoSVNSX1RVTkQpCXwKKwkJCSAgICAgTUFDQl9CSVQoSVNSX1JMRSkJfAorCQkJICAgICBNQUNCX0JJVChUQ09NUCkJfAorCQkJICAgICBNQUNCX0JJVChJU1JfUk9WUikgfAorCQkJICAgICBNQUNCX0JJVChIUkVTUCkpOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCisJZG1hX2ZyZWVfY29oZXJlbnQoJmxwLT5wZGV2LT5kZXYsCisJCQkgIEFUOTFFVEhFUl9NQVhfUlhfREVTQ1IgKgorCQkJICBzaXplb2Yoc3RydWN0IG1hY2JfZG1hX2Rlc2MpLAorCQkJICBscC0+cnhfcmluZywgbHAtPnJ4X3JpbmdfZG1hKTsKKwlscC0+cnhfcmluZyA9IE5VTEw7CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmbHAtPnBkZXYtPmRldiwKKwkJCSAgQVQ5MUVUSEVSX01BWF9SWF9ERVNDUiAqIEFUOTFFVEhFUl9NQVhfUkJVRkZfU1osCisJCQkgIGxwLT5yeF9idWZmZXJzLCBscC0+cnhfYnVmZmVyc19kbWEpOworCWxwLT5yeF9idWZmZXJzID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisvKiBUcmFuc21pdCBwYWNrZXQgKi8KK3N0YXRpYyBpbnQgYXQ5MWV0aGVyX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWFjYiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKG1hY2JfcmVhZGwobHAsIFRTUikgJiBNQUNCX0JJVChSTTkyMDBfQk5RKSkgeworCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisKKwkJLyogU3RvcmUgcGFja2V0IGluZm9ybWF0aW9uICh0byBmcmVlIHdoZW4gVHggY29tcGxldGVkKSAqLworCQlscC0+c2tiID0gc2tiOworCQlscC0+c2tiX2xlbmd0aCA9IHNrYi0+bGVuOworCQlscC0+c2tiX3BoeXNhZGRyID0gZG1hX21hcF9zaW5nbGUoTlVMTCwgc2tiLT5kYXRhLCBza2ItPmxlbiwKKwkJCQkJCQlETUFfVE9fREVWSUNFKTsKKworCQkvKiBTZXQgYWRkcmVzcyBvZiB0aGUgZGF0YSBpbiB0aGUgVHJhbnNtaXQgQWRkcmVzcyByZWdpc3RlciAqLworCQltYWNiX3dyaXRlbChscCwgVEFSLCBscC0+c2tiX3BoeXNhZGRyKTsKKwkJLyogU2V0IGxlbmd0aCBvZiB0aGUgcGFja2V0IGluIHRoZSBUcmFuc21pdCBDb250cm9sIHJlZ2lzdGVyICovCisJCW1hY2Jfd3JpdGVsKGxwLCBUQ1IsIHNrYi0+bGVuKTsKKworCX0gZWxzZSB7CisJCW5ldGRldl9lcnIoZGV2LCAiJXMgY2FsbGVkLCBidXQgZGV2aWNlIGlzIGJ1c3khXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBORVRERVZfVFhfQlVTWTsKKwl9CisKKwlyZXR1cm4gTkVUREVWX1RYX09LOworfQorCisvKiBFeHRyYWN0IHJlY2VpdmVkIGZyYW1lIGZyb20gYnVmZmVyIGRlc2NyaXB0b3JzIGFuZCBzZW50IHRvIHVwcGVyIGxheWVycy4KKyAqIChDYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCkKKyAqLworc3RhdGljIHZvaWQgYXQ5MWV0aGVyX3J4KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1hY2IgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBjaGFyICpwX3JlY3Y7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgcGt0bGVuOworCisJd2hpbGUgKGxwLT5yeF9yaW5nW2xwLT5yeF90YWlsXS5hZGRyICYgTUFDQl9CSVQoUlhfVVNFRCkpIHsKKwkJcF9yZWN2ID0gbHAtPnJ4X2J1ZmZlcnMgKyBscC0+cnhfdGFpbCAqIEFUOTFFVEhFUl9NQVhfUkJVRkZfU1o7CisJCXBrdGxlbiA9IE1BQ0JfQkYoUlhfRlJNTEVOLCBscC0+cnhfcmluZ1tscC0+cnhfdGFpbF0uY3RybCk7CisJCXNrYiA9IG5ldGRldl9hbGxvY19za2IoZGV2LCBwa3RsZW4gKyAyKTsKKwkJaWYgKHNrYikgeworCQkJc2tiX3Jlc2VydmUoc2tiLCAyKTsKKwkJCW1lbWNweShza2JfcHV0KHNrYiwgcGt0bGVuKSwgcF9yZWN2LCBwa3RsZW4pOworCisJCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOworCQkJbHAtPnN0YXRzLnJ4X3BhY2tldHMrKzsKKwkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RsZW47CisJCQluZXRpZl9yeChza2IpOworCQl9IGVsc2UgeworCQkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKKwkJfQorCisJCWlmIChscC0+cnhfcmluZ1tscC0+cnhfdGFpbF0uY3RybCAmIE1BQ0JfQklUKFJYX01IQVNIX01BVENIKSkKKwkJCWxwLT5zdGF0cy5tdWx0aWNhc3QrKzsKKworCQkvKiByZXNldCBvd25lcnNoaXAgYml0ICovCisJCWxwLT5yeF9yaW5nW2xwLT5yeF90YWlsXS5hZGRyICY9IH5NQUNCX0JJVChSWF9VU0VEKTsKKworCQkvKiB3cmFwIGFmdGVyIGxhc3QgYnVmZmVyICovCisJCWlmIChscC0+cnhfdGFpbCA9PSBBVDkxRVRIRVJfTUFYX1JYX0RFU0NSIC0gMSkKKwkJCWxwLT5yeF90YWlsID0gMDsKKwkJZWxzZQorCQkJbHAtPnJ4X3RhaWwrKzsKKwl9Cit9CisKKy8qIE1BQyBpbnRlcnJ1cHQgaGFuZGxlciAqLworc3RhdGljIGlycXJldHVybl90IGF0OTFldGhlcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CisJc3RydWN0IG1hY2IgKmxwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgaW50c3RhdHVzLCBjdGw7CisKKwkvKiBNQUMgSW50ZXJydXB0IFN0YXR1cyByZWdpc3RlciBpbmRpY2F0ZXMgd2hhdCBpbnRlcnJ1cHRzIGFyZSBwZW5kaW5nLgorCSAqIEl0IGlzIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBvbmNlIHJlYWQuCisJICovCisJaW50c3RhdHVzID0gbWFjYl9yZWFkbChscCwgSVNSKTsKKworCS8qIFJlY2VpdmUgY29tcGxldGUgKi8KKwlpZiAoaW50c3RhdHVzICYgTUFDQl9CSVQoUkNPTVApKQorCQlhdDkxZXRoZXJfcngoZGV2KTsKKworCS8qIFRyYW5zbWl0IGNvbXBsZXRlICovCisJaWYgKGludHN0YXR1cyAmIE1BQ0JfQklUKFRDT01QKSkgeworCQkvKiBUaGUgVENPTSBiaXQgaXMgc2V0IGV2ZW4gaWYgdGhlIHRyYW5zbWlzc2lvbiBmYWlsZWQgKi8KKwkJaWYgKGludHN0YXR1cyAmIChNQUNCX0JJVChJU1JfVFVORCkgfCBNQUNCX0JJVChJU1JfUkxFKSkpCisJCQlscC0+c3RhdHMudHhfZXJyb3JzKys7CisKKwkJaWYgKGxwLT5za2IpIHsKKwkJCWRldl9rZnJlZV9za2JfaXJxKGxwLT5za2IpOworCQkJbHAtPnNrYiA9IE5VTEw7CisJCQlkbWFfdW5tYXBfc2luZ2xlKE5VTEwsIGxwLT5za2JfcGh5c2FkZHIsCisJCQkJCSBscC0+c2tiX2xlbmd0aCwgRE1BX1RPX0RFVklDRSk7CisJCQlscC0+c3RhdHMudHhfcGFja2V0cysrOworCQkJbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxwLT5za2JfbGVuZ3RoOworCQl9CisJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKKwl9CisKKwkvKiBXb3JrLWFyb3VuZCBmb3IgRU1BQyBFcnJhdGEgc2VjdGlvbiA0MS4zLjEgKi8KKwlpZiAoaW50c3RhdHVzICYgTUFDQl9CSVQoUlhVQlIpKSB7CisJCWN0bCA9IG1hY2JfcmVhZGwobHAsIE5DUik7CisJCW1hY2Jfd3JpdGVsKGxwLCBOQ1IsIGN0bCAmIH5NQUNCX0JJVChSRSkpOworCQltYWNiX3dyaXRlbChscCwgTkNSLCBjdGwgfCBNQUNCX0JJVChSRSkpOworCX0KKworCWlmIChpbnRzdGF0dXMgJiBNQUNCX0JJVChJU1JfUk9WUikpCisJCW5ldGRldl9lcnIoZGV2LCAiUk9WUiBlcnJvclxuIik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgYXQ5MWV0aGVyX3BvbGxfY29udHJvbGxlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJYXQ5MWV0aGVyX2ludGVycnVwdChkZXYtPmlycSwgZGV2KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBhdDkxZXRoZXJfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4JCT0gYXQ5MWV0aGVyX29wZW4sCisJLm5kb19zdG9wCQk9IGF0OTFldGhlcl9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQJCT0gYXQ5MWV0aGVyX3N0YXJ0X3htaXQsCisJLm5kb19nZXRfc3RhdHMJCT0gbWFjYl9nZXRfc3RhdHMsCisJLm5kb19zZXRfcnhfbW9kZQk9IG1hY2Jfc2V0X3J4X21vZGUsCisJLm5kb19zZXRfbWFjX2FkZHJlc3MJPSBldGhfbWFjX2FkZHIsCisJLm5kb19kb19pb2N0bAkJPSBtYWNiX2lvY3RsLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fY2hhbmdlX210dQkJPSBldGhfY2hhbmdlX210dSwKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gYXQ5MWV0aGVyX3BvbGxfY29udHJvbGxlciwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBhdDkxZXRoZXJfY2xrX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IGNsayAqKnBjbGssCisJCQkgICAgICBzdHJ1Y3QgY2xrICoqaGNsaywgc3RydWN0IGNsayAqKnR4X2NsaykKK3sKKwlpbnQgZXJyOworCisJKmhjbGsgPSBOVUxMOworCSp0eF9jbGsgPSBOVUxMOworCisJKnBjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImV0aGVyX2NsayIpOworCWlmIChJU19FUlIoKnBjbGspKQorCQlyZXR1cm4gUFRSX0VSUigqcGNsayk7CisKKwllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoKnBjbGspOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBwY2xrICgldSlcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXQ5MWV0aGVyX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IG1hY2IgKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCXUzMiByZWc7CisKKwlkZXYtPm5ldGRldl9vcHMgPSAmYXQ5MWV0aGVyX25ldGRldl9vcHM7CisJZGV2LT5ldGh0b29sX29wcyA9ICZtYWNiX2V0aHRvb2xfb3BzOworCisJZXJyID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBkZXYtPmlycSwgYXQ5MWV0aGVyX2ludGVycnVwdCwKKwkJCSAgICAgICAwLCBkZXYtPm5hbWUsIGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCW1hY2Jfd3JpdGVsKGJwLCBOQ1IsIDApOworCisJcmVnID0gTUFDQl9CRihDTEssIE1BQ0JfQ0xLX0RJVjMyKSB8IE1BQ0JfQklUKEJJRyk7CisJaWYgKGJwLT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJKQorCQlyZWcgfD0gTUFDQl9CSVQoUk05MjAwX1JNSUkpOworCisJbWFjYl93cml0ZWwoYnAsIE5DRkdSLCByZWcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjYl9jb25maWcgYXQ5MXNhbTkyNjBfY29uZmlnID0geworCS5jYXBzID0gTUFDQl9DQVBTX1VTUklPX0hBU19DTEtFTiB8IE1BQ0JfQ0FQU19VU1JJT19ERUZBVUxUX0lTX01JSSwKKwkuY2xrX2luaXQgPSBtYWNiX2Nsa19pbml0LAorCS5pbml0ID0gbWFjYl9pbml0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNiX2NvbmZpZyBwYzMwMmdlbV9jb25maWcgPSB7CisJLmNhcHMgPSBNQUNCX0NBUFNfU0dfRElTQUJMRUQgfCBNQUNCX0NBUFNfR0lHQUJJVF9NT0RFX0FWQUlMQUJMRSwKKwkuZG1hX2J1cnN0X2xlbmd0aCA9IDE2LAorCS5jbGtfaW5pdCA9IG1hY2JfY2xrX2luaXQsCisJLmluaXQgPSBtYWNiX2luaXQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1hY2JfY29uZmlnIHNhbWE1ZDNfY29uZmlnID0geworCS5jYXBzID0gTUFDQl9DQVBTX1NHX0RJU0FCTEVEIHwgTUFDQl9DQVBTX0dJR0FCSVRfTU9ERV9BVkFJTEFCTEUsCisJLmRtYV9idXJzdF9sZW5ndGggPSAxNiwKKwkuY2xrX2luaXQgPSBtYWNiX2Nsa19pbml0LAorCS5pbml0ID0gbWFjYl9pbml0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNiX2NvbmZpZyBzYW1hNWQ0X2NvbmZpZyA9IHsKKwkuY2FwcyA9IDAsCisJLmRtYV9idXJzdF9sZW5ndGggPSA0LAorCS5jbGtfaW5pdCA9IG1hY2JfY2xrX2luaXQsCisJLmluaXQgPSBtYWNiX2luaXQsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1hY2JfY29uZmlnIGVtYWNfY29uZmlnID0geworCS5jbGtfaW5pdCA9IGF0OTFldGhlcl9jbGtfaW5pdCwKKwkuaW5pdCA9IGF0OTFldGhlcl9pbml0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWFjYl9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImNkbnMsYXQzMmFwNzAwMC1tYWNiIiB9LAorCXsgLmNvbXBhdGlibGUgPSAiY2RucyxhdDkxc2FtOTI2MC1tYWNiIiwgLmRhdGEgPSAmYXQ5MXNhbTkyNjBfY29uZmlnIH0sCisJeyAuY29tcGF0aWJsZSA9ICJjZG5zLG1hY2IiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJjZG5zLHBjMzAyLWdlbSIsIC5kYXRhID0gJnBjMzAyZ2VtX2NvbmZpZyB9LAorCXsgLmNvbXBhdGlibGUgPSAiY2RucyxnZW0iLCAuZGF0YSA9ICZwYzMwMmdlbV9jb25maWcgfSwKKwl7IC5jb21wYXRpYmxlID0gImF0bWVsLHNhbWE1ZDMtZ2VtIiwgLmRhdGEgPSAmc2FtYTVkM19jb25maWcgfSwKKwl7IC5jb21wYXRpYmxlID0gImF0bWVsLHNhbWE1ZDQtZ2VtIiwgLmRhdGEgPSAmc2FtYTVkNF9jb25maWcgfSwKKwl7IC5jb21wYXRpYmxlID0gImNkbnMsYXQ5MXJtOTIwMC1lbWFjIiwgLmRhdGEgPSAmZW1hY19jb25maWcgfSwKKwl7IC5jb21wYXRpYmxlID0gImNkbnMsZW1hYyIsIC5kYXRhID0gJmVtYWNfY29uZmlnIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbWFjYl9kdF9pZHMpOworI2VuZGlmIC8qIENPTkZJR19PRiAqLworCitzdGF0aWMgaW50IG1hY2JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgKCpjbGtfaW5pdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqLCBzdHJ1Y3QgY2xrICoqLAorCQkJc3RydWN0IGNsayAqKiwgc3RydWN0IGNsayAqKikKKwkJCQkJICAgICAgPSBtYWNiX2Nsa19pbml0OworCWludCAoKmluaXQpKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKikgPSBtYWNiX2luaXQ7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCWNvbnN0IHN0cnVjdCBtYWNiX2NvbmZpZyAqbWFjYl9jb25maWcgPSBOVUxMOworCXN0cnVjdCBjbGsgKnBjbGssICpoY2xrLCAqdHhfY2xrOworCXVuc2lnbmVkIGludCBxdWV1ZV9tYXNrLCBudW1fcXVldWVzOworCXN0cnVjdCBtYWNiX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCXN0cnVjdCBwaHlfZGV2aWNlICpwaHlkZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7CisJdm9pZCBfX2lvbWVtICptZW07CisJY29uc3QgY2hhciAqbWFjOworCXN0cnVjdCBtYWNiICpicDsKKwlpbnQgZXJyOworCisJaWYgKG5wKSB7CisJCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCisJCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZShtYWNiX2R0X2lkcywgbnApOworCQlpZiAobWF0Y2ggJiYgbWF0Y2gtPmRhdGEpIHsKKwkJCW1hY2JfY29uZmlnID0gbWF0Y2gtPmRhdGE7CisJCQljbGtfaW5pdCA9IG1hY2JfY29uZmlnLT5jbGtfaW5pdDsKKwkJCWluaXQgPSBtYWNiX2NvbmZpZy0+aW5pdDsKKwkJfQorCX0KKworCWVyciA9IGNsa19pbml0KHBkZXYsICZwY2xrLCAmaGNsaywgJnR4X2Nsayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJlZ3MgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCW1lbSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZWdzKTsKKwlpZiAoSVNfRVJSKG1lbSkpIHsKKwkJZXJyID0gUFRSX0VSUihtZW0pOworCQlnb3RvIGVycl9kaXNhYmxlX2Nsb2NrczsKKwl9CisKKwltYWNiX3Byb2JlX3F1ZXVlcyhtZW0sICZxdWV1ZV9tYXNrLCAmbnVtX3F1ZXVlcyk7CisJZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKCpicCksIG51bV9xdWV1ZXMpOworCWlmICghZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2Rpc2FibGVfY2xvY2tzOworCX0KKworCWRldi0+YmFzZV9hZGRyID0gcmVncy0+c3RhcnQ7CisKKwlTRVRfTkVUREVWX0RFVihkZXYsICZwZGV2LT5kZXYpOworCisJYnAgPSBuZXRkZXZfcHJpdihkZXYpOworCWJwLT5wZGV2ID0gcGRldjsKKwlicC0+ZGV2ID0gZGV2OworCWJwLT5yZWdzID0gbWVtOworCWJwLT5udW1fcXVldWVzID0gbnVtX3F1ZXVlczsKKwlicC0+cXVldWVfbWFzayA9IHF1ZXVlX21hc2s7CisJaWYgKG1hY2JfY29uZmlnKQorCQlicC0+ZG1hX2J1cnN0X2xlbmd0aCA9IG1hY2JfY29uZmlnLT5kbWFfYnVyc3RfbGVuZ3RoOworCWJwLT5wY2xrID0gcGNsazsKKwlicC0+aGNsayA9IGhjbGs7CisJYnAtPnR4X2NsayA9IHR4X2NsazsKKwlzcGluX2xvY2tfaW5pdCgmYnAtPmxvY2spOworCisJLyogc2V0dXAgY2FwYWJpbGl0aWVzICovCisJbWFjYl9jb25maWd1cmVfY2FwcyhicCwgbWFjYl9jb25maWcpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoZGV2LT5pcnEgPCAwKSB7CisJCWVyciA9IGRldi0+aXJxOworCQlnb3RvIGVycl9kaXNhYmxlX2Nsb2NrczsKKwl9CisKKwltYWMgPSBvZl9nZXRfbWFjX2FkZHJlc3MobnApOwogCWlmIChtYWMpCiAJCW1lbWNweShicC0+ZGV2LT5kZXZfYWRkciwgbWFjLCBFVEhfQUxFTik7CiAJZWxzZQogCQltYWNiX2dldF9od2FkZHIoYnApOwogCi0JZXJyID0gb2ZfZ2V0X3BoeV9tb2RlKHBkZXYtPmRldi5vZl9ub2RlKTsKKwllcnIgPSBvZl9nZXRfcGh5X21vZGUobnApOwogCWlmIChlcnIgPCAwKSB7CiAJCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAkJaWYgKHBkYXRhICYmIHBkYXRhLT5pc19ybWlpKQpAQCAtMjM4OCwzNCArMjc4OSwyMSBAQAogCQlicC0+cGh5X2ludGVyZmFjZSA9IGVycjsKIAl9CiAKLQlpZiAoYnAtPnBoeV9pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJKQotCQltYWNiX29yX2dlbV93cml0ZWwoYnAsIFVTUklPLCBHRU1fQklUKFJHTUlJKSk7Ci0JZWxzZSBpZiAoYnAtPnBoeV9pbnRlcmZhY2UgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUkpCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxKQotCQltYWNiX29yX2dlbV93cml0ZWwoYnAsIFVTUklPLCAoTUFDQl9CSVQoUk1JSSkgfAotCQkJCQkgICAgICAgTUFDQl9CSVQoQ0xLRU4pKSk7Ci0jZWxzZQotCQltYWNiX29yX2dlbV93cml0ZWwoYnAsIFVTUklPLCAwKTsKLSNlbmRpZgotCWVsc2UKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTEpCi0JCW1hY2Jfb3JfZ2VtX3dyaXRlbChicCwgVVNSSU8sIE1BQ0JfQklUKENMS0VOKSk7Ci0jZWxzZQotCQltYWNiX29yX2dlbV93cml0ZWwoYnAsIFVTUklPLCBNQUNCX0JJVChNSUkpKTsKLSNlbmRpZgorCS8qIElQIHNwZWNpZmljIGluaXQgKi8KKwllcnIgPSBpbml0KHBkZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKIAogCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwogCWlmIChlcnIpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIG5ldCBkZXZpY2UsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX291dF9mcmVlX25ldGRldjsKKwkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXJfbmV0ZGV2OwogCX0KIAogCWVyciA9IG1hY2JfbWlpX2luaXQoYnApOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX291dF91bnJlZ2lzdGVyX25ldGRldjsKIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7Ci0KIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCiAJbmV0ZGV2X2luZm8oZGV2LCAiQ2FkZW5jZSAlcyByZXYgMHglMDh4IGF0IDB4JTA4bHggaXJxICVkICglcE0pXG4iLApAQCAtMjQzMCwxNiArMjgxOCwxNSBAQAogCiBlcnJfb3V0X3VucmVnaXN0ZXJfbmV0ZGV2OgogCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CisKIGVycl9vdXRfZnJlZV9uZXRkZXY6CiAJZnJlZV9uZXRkZXYoZGV2KTsKLWVycl9vdXRfZGlzYWJsZV9jbG9ja3M6Ci0JaWYgKCFJU19FUlIodHhfY2xrKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHR4X2Nsayk7Ci1lcnJfb3V0X2Rpc2FibGVfaGNsazoKKworZXJyX2Rpc2FibGVfY2xvY2tzOgorCWNsa19kaXNhYmxlX3VucHJlcGFyZSh0eF9jbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShoY2xrKTsKLWVycl9vdXRfZGlzYWJsZV9wY2xrOgogCWNsa19kaXNhYmxlX3VucHJlcGFyZShwY2xrKTsKLWVycl9vdXQ6CisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yNDU4LDggKzI4NDUsNyBAQAogCQlrZnJlZShicC0+bWlpX2J1cy0+aXJxKTsKIAkJbWRpb2J1c19mcmVlKGJwLT5taWlfYnVzKTsKIAkJdW5yZWdpc3Rlcl9uZXRkZXYoZGV2KTsKLQkJaWYgKCFJU19FUlIoYnAtPnR4X2NsaykpCi0JCQljbGtfZGlzYWJsZV91bnByZXBhcmUoYnAtPnR4X2Nsayk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShicC0+dHhfY2xrKTsKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGJwLT5oY2xrKTsKIAkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGJwLT5wY2xrKTsKIAkJZnJlZV9uZXRkZXYoZGV2KTsKQEAgLTI0NzcsOCArMjg2Myw3IEBACiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7CiAKLQlpZiAoIUlTX0VSUihicC0+dHhfY2xrKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGJwLT50eF9jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShicC0+dHhfY2xrKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoYnAtPmhjbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShicC0+cGNsayk7CiAKQEAgLTI0OTMsOCArMjg3OCw3IEBACiAKIAljbGtfcHJlcGFyZV9lbmFibGUoYnAtPnBjbGspOwogCWNsa19wcmVwYXJlX2VuYWJsZShicC0+aGNsayk7Ci0JaWYgKCFJU19FUlIoYnAtPnR4X2NsaykpCi0JCWNsa19wcmVwYXJlX2VuYWJsZShicC0+dHhfY2xrKTsKKwljbGtfcHJlcGFyZV9lbmFibGUoYnAtPnR4X2Nsayk7CiAKIAluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhZGVuY2UvbWFjYi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9tYWNiLmgKaW5kZXggZmY4NTYxOS4uZWI3ZDc2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9tYWNiLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FkZW5jZS9tYWNiLmgKQEAgLTExLDcgKzExLDcgQEAKICNkZWZpbmUgX01BQ0JfSAogCiAjZGVmaW5lIE1BQ0JfR1JFR1NfTkJSIDE2Ci0jZGVmaW5lIE1BQ0JfR1JFR1NfVkVSU0lPTiAxCisjZGVmaW5lIE1BQ0JfR1JFR1NfVkVSU0lPTiAyCiAjZGVmaW5lIE1BQ0JfTUFYX1FVRVVFUyA4CiAKIC8qIE1BQ0IgcmVnaXN0ZXIgb2Zmc2V0cyAqLwpAQCAtMjI5LDggKzIyOSwxMCBAQAogLyogQml0ZmllbGRzIGluIERNQUNGRy4gKi8KICNkZWZpbmUgR0VNX0ZCTERPX09GRlNFVAkwIC8qIGZpeGVkIGJ1cnN0IGxlbmd0aCBmb3IgRE1BICovCiAjZGVmaW5lIEdFTV9GQkxET19TSVpFCQk1Ci0jZGVmaW5lIEdFTV9FTkRJQV9PRkZTRVQJNyAvKiBlbmRpYW4gc3dhcCBtb2RlIGZvciBwYWNrZXQgZGF0YSBhY2Nlc3MgKi8KLSNkZWZpbmUgR0VNX0VORElBX1NJWkUJCTEKKyNkZWZpbmUgR0VNX0VORElBX0RFU0NfT0ZGU0VUCTYgLyogZW5kaWFuIHN3YXAgbW9kZSBmb3IgbWFuYWdlbWVudCBkZXNjcmlwdG9yIGFjY2VzcyAqLworI2RlZmluZSBHRU1fRU5ESUFfREVTQ19TSVpFCTEKKyNkZWZpbmUgR0VNX0VORElBX1BLVF9PRkZTRVQJNyAvKiBlbmRpYW4gc3dhcCBtb2RlIGZvciBwYWNrZXQgZGF0YSBhY2Nlc3MgKi8KKyNkZWZpbmUgR0VNX0VORElBX1BLVF9TSVpFCTEKICNkZWZpbmUgR0VNX1JYQk1TX09GRlNFVAk4IC8qIFJYIHBhY2tldCBidWZmZXIgbWVtb3J5IHNpemUgc2VsZWN0ICovCiAjZGVmaW5lIEdFTV9SWEJNU19TSVpFCQkyCiAjZGVmaW5lIEdFTV9UWFBCTVNfT0ZGU0VUCTEwIC8qIFRYIHBhY2tldCBidWZmZXIgbWVtb3J5IHNpemUgc2VsZWN0ICovCkBAIC0zODksNiArMzkxLDggQEAKIAogLyogQ2FwYWJpbGl0eSBtYXNrIGJpdHMgKi8KICNkZWZpbmUgTUFDQl9DQVBTX0lTUl9DTEVBUl9PTl9XUklURQkJMHgwMDAwMDAwMQorI2RlZmluZSBNQUNCX0NBUFNfVVNSSU9fSEFTX0NMS0VOCQkweDAwMDAwMDAyCisjZGVmaW5lIE1BQ0JfQ0FQU19VU1JJT19ERUZBVUxUX0lTX01JSQkJMHgwMDAwMDAwNAogI2RlZmluZSBNQUNCX0NBUFNfRklGT19NT0RFCQkJMHgxMDAwMDAwMAogI2RlZmluZSBNQUNCX0NBUFNfR0lHQUJJVF9NT0RFX0FWQUlMQUJMRQkweDIwMDAwMDAwCiAjZGVmaW5lIE1BQ0JfQ0FQU19TR19ESVNBQkxFRAkJCTB4NDAwMDAwMDAKQEAgLTQyMywxNyArNDI3LDE3IEBACiAKIC8qIFJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KICNkZWZpbmUgbWFjYl9yZWFkbChwb3J0LHJlZykJCQkJXAotCV9fcmF3X3JlYWRsKChwb3J0KS0+cmVncyArIE1BQ0JfIyNyZWcpCisJcmVhZGxfcmVsYXhlZCgocG9ydCktPnJlZ3MgKyBNQUNCXyMjcmVnKQogI2RlZmluZSBtYWNiX3dyaXRlbChwb3J0LHJlZyx2YWx1ZSkJCQlcCi0JX19yYXdfd3JpdGVsKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIE1BQ0JfIyNyZWcpCisJd3JpdGVsX3JlbGF4ZWQoKHZhbHVlKSwgKHBvcnQpLT5yZWdzICsgTUFDQl8jI3JlZykKICNkZWZpbmUgZ2VtX3JlYWRsKHBvcnQsIHJlZykJCQkJXAotCV9fcmF3X3JlYWRsKChwb3J0KS0+cmVncyArIEdFTV8jI3JlZykKKwlyZWFkbF9yZWxheGVkKChwb3J0KS0+cmVncyArIEdFTV8jI3JlZykKICNkZWZpbmUgZ2VtX3dyaXRlbChwb3J0LCByZWcsIHZhbHVlKQkJCVwKLQlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKHBvcnQpLT5yZWdzICsgR0VNXyMjcmVnKQorCXdyaXRlbF9yZWxheGVkKCh2YWx1ZSksIChwb3J0KS0+cmVncyArIEdFTV8jI3JlZykKICNkZWZpbmUgcXVldWVfcmVhZGwocXVldWUsIHJlZykJCQkJXAotCV9fcmF3X3JlYWRsKChxdWV1ZSktPmJwLT5yZWdzICsgKHF1ZXVlKS0+cmVnKQorCXJlYWRsX3JlbGF4ZWQoKHF1ZXVlKS0+YnAtPnJlZ3MgKyAocXVldWUpLT5yZWcpCiAjZGVmaW5lIHF1ZXVlX3dyaXRlbChxdWV1ZSwgcmVnLCB2YWx1ZSkJCQlcCi0JX19yYXdfd3JpdGVsKCh2YWx1ZSksIChxdWV1ZSktPmJwLT5yZWdzICsgKHF1ZXVlKS0+cmVnKQorCXdyaXRlbF9yZWxheGVkKCh2YWx1ZSksIChxdWV1ZSktPmJwLT5yZWdzICsgKHF1ZXVlKS0+cmVnKQogCiAvKiBDb25kaXRpb25hbCBHRU0vTUFDQiBtYWNyb3MuICBUaGVzZSBwZXJmb3JtIHRoZSBvcGVyYXRpb24gdG8gdGhlIGNvcnJlY3QKICAqIHJlZ2lzdGVyIGRlcGVuZGVudCBvbiB3aGV0aGVyIHRoZSBkZXZpY2UgaXMgYSBHRU0gb3IgYSBNQUNCLiAgRm9yIHJlZ2lzdGVycwpAQCAtNzUwLDYgKzc1NCw5IEBACiBzdHJ1Y3QgbWFjYl9jb25maWcgewogCXUzMgkJCWNhcHM7CiAJdW5zaWduZWQgaW50CQlkbWFfYnVyc3RfbGVuZ3RoOworCWludAkoKmNsa19pbml0KShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgY2xrICoqcGNsaywKKwkJCSAgICBzdHJ1Y3QgY2xrICoqaGNsaywgc3RydWN0IGNsayAqKnR4X2Nsayk7CisJaW50CSgqaW5pdCkoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CiB9OwogCiBzdHJ1Y3QgbWFjYl9xdWV1ZSB7CkBAIC03ODAsNiArNzg3LDcgQEAKIAlzaXplX3QJCQlyeF9idWZmZXJfc2l6ZTsKIAogCXVuc2lnbmVkIGludAkJbnVtX3F1ZXVlczsKKwl1bnNpZ25lZCBpbnQJCXF1ZXVlX21hc2s7CiAJc3RydWN0IG1hY2JfcXVldWUJcXVldWVzW01BQ0JfTUFYX1FVRVVFU107CiAKIAlzcGlubG9ja190CQlsb2NrOwpAQCAtODIwLDE4ICs4MjgsMTQgQEAKIAl1NjQJCQlldGh0b29sX3N0YXRzW0dFTV9TVEFUU19MRU5dOwogfTsKIAotZXh0ZXJuIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBtYWNiX2V0aHRvb2xfb3BzOwotCi1pbnQgbWFjYl9taWlfaW5pdChzdHJ1Y3QgbWFjYiAqYnApOwotaW50IG1hY2JfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7Ci1zdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqbWFjYl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIG1hY2Jfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci12b2lkIG1hY2Jfc2V0X2h3YWRkcihzdHJ1Y3QgbWFjYiAqYnApOwotdm9pZCBtYWNiX2dldF9od2FkZHIoc3RydWN0IG1hY2IgKmJwKTsKLQogc3RhdGljIGlubGluZSBib29sIG1hY2JfaXNfZ2VtKHN0cnVjdCBtYWNiICpicCkKIHsKIAlyZXR1cm4gISEoYnAtPmNhcHMgJiBNQUNCX0NBUFNfTUFDQl9JU19HRU0pOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgbWFjYl9pc19nZW1faHcodm9pZCBfX2lvbWVtICphZGRyKQoreworCXJldHVybiAhIShNQUNCX0JGRVhUKElETlVNLCByZWFkbF9yZWxheGVkKGFkZHIgKyBNQUNCX01JRCkpID49IDB4Mik7Cit9CisKICNlbmRpZiAvKiBfTUFDQl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWx4ZWRhL3hnbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWx4ZWRhL3hnbWFjLmMKaW5kZXggNDdiZmVhMi4uNjNlZmEwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FseGVkYS94Z21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhbHhlZGEveGdtYWMuYwpAQCAtNDcsOSArNDcsOSBAQAogI2RlZmluZSBYR01BQ19SRU1PVEVfV0FLRQkweDAwMDAwNzAwCS8qIFJlbW90ZSBXYWtlLVVwIEZybSBGaWx0ZXIgKi8KICNkZWZpbmUgWEdNQUNfUE1UCQkweDAwMDAwNzA0CS8qIFBNVCBDb250cm9sIGFuZCBTdGF0dXMgKi8KICNkZWZpbmUgWEdNQUNfTU1DX0NUUkwJCTB4MDAwMDA4MDAJLyogWEdNQUMgTU1DIENvbnRyb2wgKi8KLSNkZWZpbmUgWEdNQUNfTU1DX0lOVFJfUlgJMHgwMDAwMDgwNAkvKiBSZWNpZXZlIEludGVycnVwdCAqLworI2RlZmluZSBYR01BQ19NTUNfSU5UUl9SWAkweDAwMDAwODA0CS8qIFJlY2VpdmUgSW50ZXJydXB0ICovCiAjZGVmaW5lIFhHTUFDX01NQ19JTlRSX1RYCTB4MDAwMDA4MDgJLyogVHJhbnNtaXQgSW50ZXJydXB0ICovCi0jZGVmaW5lIFhHTUFDX01NQ19JTlRSX01BU0tfUlgJMHgwMDAwMDgwYwkvKiBSZWNpZXZlIEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIFhHTUFDX01NQ19JTlRSX01BU0tfUlgJMHgwMDAwMDgwYwkvKiBSZWNlaXZlIEludGVycnVwdCBNYXNrICovCiAjZGVmaW5lIFhHTUFDX01NQ19JTlRSX01BU0tfVFgJMHgwMDAwMDgxMAkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgTWFzayAqLwogCiAvKiBIYXJkd2FyZSBUWCBTdGF0aXN0aWNzIENvdW50ZXJzICovCkBAIC0xNTMsNyArMTUzLDcgQEAKICNkZWZpbmUgWEdNQUNfRkxPV19DVFJMX1BUX01BU0sJMHhmZmZmMDAwMAkvKiBQYXVzZSBUaW1lIE1hc2sgKi8KICNkZWZpbmUgWEdNQUNfRkxPV19DVFJMX1BUX1NISUZUCTE2CiAjZGVmaW5lIFhHTUFDX0ZMT1dfQ1RSTF9EWlFQCTB4MDAwMDAwODAJLyogRGlzYWJsZSBaZXJvLVF1YW50YSBQaGFzZSAqLwotI2RlZmluZSBYR01BQ19GTE9XX0NUUkxfUExUCTB4MDAwMDAwMjAJLyogUGF1c2UgTG93IFRocmVzaGhvbGQgKi8KKyNkZWZpbmUgWEdNQUNfRkxPV19DVFJMX1BMVAkweDAwMDAwMDIwCS8qIFBhdXNlIExvdyBUaHJlc2hvbGQgKi8KICNkZWZpbmUgWEdNQUNfRkxPV19DVFJMX1BMVF9NQVNLIDB4MDAwMDAwMzAJLyogUExUIE1BU0sgKi8KICNkZWZpbmUgWEdNQUNfRkxPV19DVFJMX1VQCTB4MDAwMDAwMDgJLyogVW5pY2FzdCBQYXVzZSBGcmFtZSBEZXRlY3QgKi8KICNkZWZpbmUgWEdNQUNfRkxPV19DVFJMX1JGRQkweDAwMDAwMDA0CS8qIFJ4IEZsb3cgQ29udHJvbCBFbmFibGUgKi8KQEAgLTI1NCwxOCArMjU0LDE4IEBACiAvKiBYR01BQyBPcGVyYXRpb24gTW9kZSBSZWdpc3RlciAqLwogI2RlZmluZSBYR01BQ19PTVJfVFNGCQkweDAwMjAwMDAwCS8qIFRYIEZJRk8gU3RvcmUgYW5kIEZvcndhcmQgKi8KICNkZWZpbmUgWEdNQUNfT01SX0ZURgkJMHgwMDEwMDAwMAkvKiBGbHVzaCBUcmFuc21pdCBGSUZPICovCi0jZGVmaW5lIFhHTUFDX09NUl9UVEMJCTB4MDAwMjAwMDAJLyogVHJhbnNtaXQgVGhyZXNoaG9sZCBDdHJsICovCisjZGVmaW5lIFhHTUFDX09NUl9UVEMJCTB4MDAwMjAwMDAJLyogVHJhbnNtaXQgVGhyZXNob2xkIEN0cmwgKi8KICNkZWZpbmUgWEdNQUNfT01SX1RUQ19NQVNLCTB4MDAwMzAwMDAKLSNkZWZpbmUgWEdNQUNfT01SX1JGRAkJMHgwMDAwNjAwMAkvKiBGQyBEZWFjdGl2YXRpb24gVGhyZXNoaG9sZCAqLwotI2RlZmluZSBYR01BQ19PTVJfUkZEX01BU0sJMHgwMDAwNzAwMAkvKiBGQyBEZWFjdCBUaHJlc2hob2xkIE1BU0sgKi8KLSNkZWZpbmUgWEdNQUNfT01SX1JGQQkJMHgwMDAwMDYwMAkvKiBGQyBBY3RpdmF0aW9uIFRocmVzaGhvbGQgKi8KLSNkZWZpbmUgWEdNQUNfT01SX1JGQV9NQVNLCTB4MDAwMDBFMDAJLyogRkMgQWN0IFRocmVzaGhvbGQgTUFTSyAqLworI2RlZmluZSBYR01BQ19PTVJfUkZECQkweDAwMDA2MDAwCS8qIEZDIERlYWN0aXZhdGlvbiBUaHJlc2hvbGQgKi8KKyNkZWZpbmUgWEdNQUNfT01SX1JGRF9NQVNLCTB4MDAwMDcwMDAJLyogRkMgRGVhY3QgVGhyZXNob2xkIE1BU0sgKi8KKyNkZWZpbmUgWEdNQUNfT01SX1JGQQkJMHgwMDAwMDYwMAkvKiBGQyBBY3RpdmF0aW9uIFRocmVzaG9sZCAqLworI2RlZmluZSBYR01BQ19PTVJfUkZBX01BU0sJMHgwMDAwMEUwMAkvKiBGQyBBY3QgVGhyZXNob2xkIE1BU0sgKi8KICNkZWZpbmUgWEdNQUNfT01SX0VGQwkJMHgwMDAwMDEwMAkvKiBFbmFibGUgSGFyZHdhcmUgRkMgKi8KICNkZWZpbmUgWEdNQUNfT01SX0ZFRgkJMHgwMDAwMDA4MAkvKiBGb3J3YXJkIEVycm9yIEZyYW1lcyAqLwogI2RlZmluZSBYR01BQ19PTVJfRFQJCTB4MDAwMDAwNDAJLyogRHJvcCBUQ1AvSVAgY3N1bSBFcnJvcnMgKi8KICNkZWZpbmUgWEdNQUNfT01SX1JTRgkJMHgwMDAwMDAyMAkvKiBSWCBGSUZPIFN0b3JlIGFuZCBGb3J3YXJkICovCi0jZGVmaW5lIFhHTUFDX09NUl9SVENfMjU2CTB4MDAwMDAwMTgJLyogUlggVGhyZXNoaG9sZCBDdHJsICovCi0jZGVmaW5lIFhHTUFDX09NUl9SVENfTUFTSwkweDAwMDAwMDE4CS8qIFJYIFRocmVzaGhvbGQgQ3RybCBNQVNLICovCisjZGVmaW5lIFhHTUFDX09NUl9SVENfMjU2CTB4MDAwMDAwMTgJLyogUlggVGhyZXNob2xkIEN0cmwgKi8KKyNkZWZpbmUgWEdNQUNfT01SX1JUQ19NQVNLCTB4MDAwMDAwMTgJLyogUlggVGhyZXNob2xkIEN0cmwgTUFTSyAqLwogCiAvKiBYR01BQyBIVyBGZWF0dXJlcyBSZWdpc3RlciAqLwogI2RlZmluZSBETUFfSFdfRkVBVF9UWENPRVNFTAkweDAwMDEwMDAwCS8qIFRYIENoZWNrc3VtIG9mZmxvYWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vS2NvbmZpZwppbmRleCBhYzY0NzNmLi43ZGFhMDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9LY29uZmlnCkBAIC05Nyw2ICs5NywxNyBAQAogCiAJICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgQ0hFTFNJT19UNF9GQ09FCisJYm9vbCAiRmlicmUgQ2hhbm5lbCBvdmVyIEV0aGVybmV0IChGQ29FKSBTdXBwb3J0IGZvciBDaGVsc2lvIFQ1IGNhcmRzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQ0hFTFNJT19UNCAmJiBDSEVMU0lPX1Q0X0RDQiAmJiBGQ09FCisJLS0taGVscC0tLQorCSAgRW5hYmxlIEZDb0Ugb2ZmbG9hZCBmZWF0dXJlcy4KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIEZpYnJlIENoYW5uZWwgb3ZlciBFdGhlcm5ldCAoRkNvRSkgc3VwcG9ydAorCSAgaW4gdGhlIGRyaXZlci4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIENIRUxTSU9fVDRWRgogCXRyaXN0YXRlICJDaGVsc2lvIENvbW11bmljYXRpb25zIFQ0L1Q1IFZpcnR1YWwgRnVuY3Rpb24gRXRoZXJuZXQgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiL2N4Z2IyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IvY3hnYjIuYwppbmRleCAxODY1NjZiLi5mNWYxYjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IvY3hnYjIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IvY3hnYjIuYwpAQCAtMzU0LDcgKzM1NCw3IEBACiAJYWRhcHRlci0+bXNnX2VuYWJsZSA9IHZhbDsKIH0KIAotc3RhdGljIGNoYXIgc3RhdHNfc3RyaW5nc1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CitzdGF0aWMgY29uc3QgY2hhciBzdGF0c19zdHJpbmdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKIAkiVHhPY3RldHNPSyIsCiAJIlR4T2N0ZXRzQmFkIiwKIAkiVHhVbmljYXN0RnJhbWVzT0siLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9jeGdiM19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX21haW4uYwppbmRleCBkYjc2ZjcwLi5iOTZlNGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX21haW4uYwpAQCAtMTUzNyw3ICsxNTM3LDcgQEAKIAlhZGFwdGVyLT5tc2dfZW5hYmxlID0gdmFsOwogfQogCi1zdGF0aWMgY2hhciBzdGF0c19zdHJpbmdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyIHN0YXRzX3N0cmluZ3NbXVtFVEhfR1NUUklOR19MRU5dID0gewogCSJUeE9jdGV0c09LICAgICAgICAgIiwKIAkiVHhGcmFtZXNPSyAgICAgICAgICIsCiAJIlR4TXVsdGljYXN0RnJhbWVzT0siLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9zZ2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvc2dlLmMKaW5kZXggZDZhYTYwMi4uZTRiNWIwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL3NnZS5jCkBAIC00MjIsNyArNDIyLDcgQEAKIAogCWQtPmFkZHJfbG8gPSBjcHVfdG9fYmUzMihtYXBwaW5nKTsKIAlkLT5hZGRyX2hpID0gY3B1X3RvX2JlMzIoKHU2NCkgbWFwcGluZyA+PiAzMik7Ci0Jd21iKCk7CisJZG1hX3dtYigpOwogCWQtPmxlbl9nZW4gPSBjcHVfdG9fYmUzMihWX0ZMRF9HRU4xKGdlbikpOwogCWQtPmdlbjIgPSBjcHVfdG9fYmUzMihWX0ZMRF9HRU4yKGdlbikpOwogCXJldHVybiAwOwpAQCAtNDMzLDcgKzQzMyw3IEBACiB7CiAJZC0+YWRkcl9sbyA9IGNwdV90b19iZTMyKG1hcHBpbmcpOwogCWQtPmFkZHJfaGkgPSBjcHVfdG9fYmUzMigodTY0KSBtYXBwaW5nID4+IDMyKTsKLQl3bWIoKTsKKwlkbWFfd21iKCk7CiAJZC0+bGVuX2dlbiA9IGNwdV90b19iZTMyKFZfRkxEX0dFTjEoZ2VuKSk7CiAJZC0+Z2VuMiA9IGNwdV90b19iZTMyKFZfRkxEX0dFTjIoZ2VuKSk7CiAJcmV0dXJuIDA7CkBAIC01NzksNyArNTc5LDcgQEAKIAlxLT5zZGVzY1txLT5waWR4XSA9IHEtPnNkZXNjW2lkeF07CiAJdG8tPmFkZHJfbG8gPSBmcm9tLT5hZGRyX2xvOwkvKiBhbHJlYWR5IGJpZyBlbmRpYW4gKi8KIAl0by0+YWRkcl9oaSA9IGZyb20tPmFkZHJfaGk7CS8qIGxpa2V3aXNlICovCi0Jd21iKCk7CisJZG1hX3dtYigpOwogCXRvLT5sZW5fZ2VuID0gY3B1X3RvX2JlMzIoVl9GTERfR0VOMShxLT5nZW4pKTsKIAl0by0+Z2VuMiA9IGNwdV90b19iZTMyKFZfRkxEX0dFTjIocS0+Z2VuKSk7CiAKQEAgLTEwNjgsNyArMTA2OCw3IEBACiAJCXNkLT5lb3AgPSAxOwogCQl3cnAtPndyX2hpID0gaHRvbmwoRl9XUl9TT1AgfCBGX1dSX0VPUCB8IFZfV1JfREFUQVRZUEUoMSkgfAogCQkJCSAgIFZfV1JfU0dMU0ZMVChmbGl0cykpIHwgd3JfaGk7Ci0JCXdtYigpOworCQlkbWFfd21iKCk7CiAJCXdycC0+d3JfbG8gPSBodG9ubChWX1dSX0xFTihmbGl0cyArIHNnbF9mbGl0cykgfAogCQkJCSAgIFZfV1JfR0VOKGdlbikpIHwgd3JfbG87CiAJCXdyX2dlbjIoZCwgZ2VuKTsKQEAgLTExMTQsNyArMTExNCw3IEBACiAJCX0KIAkJc2QtPmVvcCA9IDE7CiAJCXdycC0+d3JfaGkgfD0gaHRvbmwoRl9XUl9FT1ApOwotCQl3bWIoKTsKKwkJZG1hX3dtYigpOwogCQl3cC0+d3JfbG8gPSBodG9ubChWX1dSX0xFTihXUl9GTElUUykgfCBWX1dSX0dFTihvZ2VuKSkgfCB3cl9sbzsKIAkJd3JfZ2VuMigoc3RydWN0IHR4X2Rlc2MgKil3cCwgb2dlbik7CiAJCVdBUk5fT04obmRlc2MgIT0gMCk7CkBAIC0xMTg0LDcgKzExODQsNyBAQAogCQkJY3BsLT53ci53cl9oaSA9IGh0b25sKFZfV1JfQkNOVExGTFQoc2tiLT5sZW4gJiA3KSB8CiAJCQkJCSAgICAgIFZfV1JfT1AoRldfV1JPUENPREVfVFVOTkVMX1RYX1BLVCkKIAkJCQkJICAgICAgfCBGX1dSX1NPUCB8IEZfV1JfRU9QIHwgY29tcGwpOwotCQkJd21iKCk7CisJCQlkbWFfd21iKCk7CiAJCQljcGwtPndyLndyX2xvID0gaHRvbmwoVl9XUl9MRU4oZmxpdHMpIHwgVl9XUl9HRU4oZ2VuKSB8CiAJCQkJCSAgICAgIFZfV1JfVElEKHEtPnRva2VuKSk7CiAJCQl3cl9nZW4yKGQsIGdlbik7CkBAIC0xMzQyLDcgKzEzNDIsNyBAQAogCiAJdG8tPndyX2hpID0gZnJvbS0+d3JfaGkgfCBodG9ubChGX1dSX1NPUCB8IEZfV1JfRU9QIHwKIAkJCQkJVl9XUl9CQ05UTEZMVChsZW4gJiA3KSk7Ci0Jd21iKCk7CisJZG1hX3dtYigpOwogCXRvLT53cl9sbyA9IGZyb20tPndyX2xvIHwgaHRvbmwoVl9XUl9HRU4oZ2VuKSB8CiAJCQkJCVZfV1JfTEVOKChsZW4gKyA3KSAvIDgpKTsKIAl3cl9nZW4yKGQsIGdlbik7CkBAIC0yMjcxLDcgKzIyNzEsNyBAQAogCQl1MzIgbGVuLCBmbGFnczsKIAkJX19iZTMyIHJzc19oaSwgcnNzX2xvOwogCi0JCXJtYigpOworCQlkbWFfcm1iKCk7CiAJCWV0aCA9IHItPnJzc19oZHIub3Bjb2RlID09IENQTF9SWF9QS1Q7CiAJCXJzc19oaSA9ICooY29uc3QgX19iZTMyICopcjsKIAkJcnNzX2xvID0gci0+cnNzX2hkci5yc3NfaGFzaF92YWw7CkBAIC0yNDg4LDcgKzI0ODgsNyBAQAogCQl9CiAJCWlmICghaXNfbmV3X3Jlc3BvbnNlKHIsIHEpKQogCQkJYnJlYWs7Ci0JCXJtYigpOworCQlkbWFfcm1iKCk7CiAJfSB3aGlsZSAoaXNfcHVyZV9yZXNwb25zZShyKSk7CiAKIAlpZiAoc2xlZXBpbmcpCkBAIC0yNTIzLDcgKzI1MjMsNyBAQAogCiAJaWYgKCFpc19uZXdfcmVzcG9uc2UociwgcSkpCiAJCXJldHVybiAtMTsKLQlybWIoKTsKKwlkbWFfcm1iKCk7CiAJaWYgKGlzX3B1cmVfcmVzcG9uc2UocikgJiYgcHJvY2Vzc19wdXJlX3Jlc3BvbnNlcyhhZGFwLCBxcywgcikgPT0gMCkgewogCQl0M193cml0ZV9yZWcoYWRhcCwgQV9TR19HVFMsIFZfUlNQUShxLT5jbnR4dF9pZCkgfAogCQkJICAgICBWX05FV1RJTUVSKHEtPmhvbGRvZmZfdG1yKSB8IFZfTkVXSU5ERVgocS0+Y2lkeCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy90M19ody5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy90M19ody5jCmluZGV4IDE4NGE4ZDUuLmEyMjc2OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvdDNfaHcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL3QzX2h3LmMKQEAgLTg0MCw3ICs4NDAsNyBAQAogICoJUmVhZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiAzMi1iaXQgd29yZHMgZnJvbSB0aGUgc2VyaWFsIGZsYXNoLgogICoJSWYgQGJ5dGVfb3JpZW50ZWQgaXMgc2V0IHRoZSByZWFkIGRhdGEgaXMgc3RvcmVkIGFzIGEgYnl0ZSBhcnJheQogICoJKGkuZS4sIGJpZy1lbmRpYW4pLCBvdGhlcndpc2UgYXMgMzItYml0IHdvcmRzIGluIHRoZSBwbGF0Zm9ybSdzCi0gKgluYXR1cmFsIGVuZGlhbmVzcy4KKyAqCW5hdHVyYWwgZW5kaWFubmVzcy4KICAqLwogc3RhdGljIGludCB0M19yZWFkX2ZsYXNoKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1bnNpZ25lZCBpbnQgYWRkciwKIAkJCSB1bnNpZ25lZCBpbnQgbndvcmRzLCB1MzIgKmRhdGEsIGludCBieXRlX29yaWVudGVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvTWFrZWZpbGUKaW5kZXggYWU1MGNkNy4uYWNlMGFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L01ha2VmaWxlCkBAIC00LDYgKzQsNyBAQAogCiBvYmotJChDT05GSUdfQ0hFTFNJT19UNCkgKz0gY3hnYjQubwogCi1jeGdiNC1vYmpzIDo9IGN4Z2I0X21haW4ubyBsMnQubyB0NF9ody5vIHNnZS5vIGNsaXBfdGJsLm8KK2N4Z2I0LW9ianMgOj0gY3hnYjRfbWFpbi5vIGwydC5vIHQ0X2h3Lm8gc2dlLm8gY2xpcF90YmwubyBjeGdiNF9ldGh0b29sLm8KIGN4Z2I0LSQoQ09ORklHX0NIRUxTSU9fVDRfRENCKSArPSAgY3hnYjRfZGNiLm8KK2N4Z2I0LSQoQ09ORklHX0NIRUxTSU9fVDRfRkNPRSkgKz0gIGN4Z2I0X2Zjb2UubwogY3hnYjQtJChDT05GSUdfREVCVUdfRlMpICs9IGN4Z2I0X2RlYnVnZnMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNC5oCmluZGV4IDk3ODQyZDAuLjUyNGQxMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0LmgKQEAgLTYwLDYgKzYwLDExIEBACiB9OwogCiBlbnVtIHsKKwlUNF9SRUdNQVBfU0laRSA9ICgxNjAgKiAxMDI0KSwKKwlUNV9SRUdNQVBfU0laRSA9ICgzMzIgKiAxMDI0KSwKK307CisKK2VudW0gewogCU1FTV9FREMwLAogCU1FTV9FREMxLAogCU1FTV9NQywKQEAgLTM2OSwxNSArMzc0LDI0IEBACiAJTUFYX09GTERfUVNFVFMgPSAxNiwgICAgICAgICAgLyogIyBvZiBvZmZsb2FkIFR4L1J4IHF1ZXVlIHNldHMgKi8KIAlNQVhfQ1RSTF9RVUVVRVMgPSBOQ0hBTiwgICAgICAvKiAjIG9mIGNvbnRyb2wgVHggcXVldWVzICovCiAJTUFYX1JETUFfUVVFVUVTID0gTkNIQU4sICAgICAgLyogIyBvZiBzdHJlYW1pbmcgUkRNQSBSeCBxdWV1ZXMgKi8KLQlNQVhfUkRNQV9DSVFTID0gTkNIQU4sICAgICAgICAvKiAjIG9mICBSRE1BIGNvbmNlbnRyYXRvciBJUXMgKi8KKwlNQVhfUkRNQV9DSVFTID0gMzIsICAgICAgICAvKiAjIG9mICBSRE1BIGNvbmNlbnRyYXRvciBJUXMgKi8KIAlNQVhfSVNDU0lfUVVFVUVTID0gTkNIQU4sICAgICAvKiAjIG9mIHN0cmVhbWluZyBpU0NTSSBSeCBxdWV1ZXMgKi8KIH07CiAKIGVudW0geworCU1BWF9UWFFfRU5UUklFUyAgICAgID0gMTYzODQsCisJTUFYX0NUUkxfVFhRX0VOVFJJRVMgPSAxMDI0LAorCU1BWF9SU1BRX0VOVFJJRVMgICAgID0gMTYzODQsCisJTUFYX1JYX0JVRkZFUlMgICAgICAgPSAxNjM4NCwKKwlNSU5fVFhRX0VOVFJJRVMgICAgICA9IDMyLAorCU1JTl9DVFJMX1RYUV9FTlRSSUVTID0gMzIsCisJTUlOX1JTUFFfRU5UUklFUyAgICAgPSAxMjgsCisJTUlOX0ZMX0VOVFJJRVMgICAgICAgPSAxNgorfTsKKworZW51bSB7CiAJSU5HUV9FWFRSQVMgPSAyLCAgICAgICAgLyogZmlybXdhcmUgZXZlbnQgcXVldWUgYW5kICovCiAJCQkJLyogICBmb3J3YXJkZWQgaW50ZXJydXB0cyAqLwotCU1BWF9FR1JRID0gTUFYX0VUSF9RU0VUUyoyICsgTUFYX09GTERfUVNFVFMqMgotCQkgICArIE1BWF9DVFJMX1FVRVVFUyArIE1BWF9SRE1BX1FVRVVFUyArIE1BWF9JU0NTSV9RVUVVRVMsCiAJTUFYX0lOR1EgPSBNQVhfRVRIX1FTRVRTICsgTUFYX09GTERfUVNFVFMgKyBNQVhfUkRNQV9RVUVVRVMKIAkJICAgKyBNQVhfUkRNQV9DSVFTICsgTUFYX0lTQ1NJX1FVRVVFUyArIElOR1FfRVhUUkFTLAogfTsKQEAgLTM4Nyw2ICs0MDEsMTAgQEAKIAogI2luY2x1ZGUgImN4Z2I0X2RjYi5oIgogCisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDRfRkNPRQorI2luY2x1ZGUgImN4Z2I0X2Zjb2UuaCIKKyNlbmRpZiAvKiBDT05GSUdfQ0hFTFNJT19UNF9GQ09FICovCisKIHN0cnVjdCBwb3J0X2luZm8gewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyOwogCXUxNiAgICB2aWlkOwpAQCAtNDA2LDYgKzQyNCw5IEBACiAjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDRfRENCCiAJc3RydWN0IHBvcnRfZGNiX2luZm8gZGNiOyAgICAgLyogRGF0YSBDZW50ZXIgQnJpZGdpbmcgc3VwcG9ydCAqLwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDRfRkNPRQorCXN0cnVjdCBjeGdiX2Zjb2UgZmNvZTsKKyNlbmRpZiAvKiBDT05GSUdfQ0hFTFNJT19UNF9GQ09FICovCiB9OwogCiBzdHJ1Y3QgZGVudHJ5OwpAQCAtNTk5LDggKzYyMCw4IEBACiAJdTE2IHJkbWFxczsgICAgICAgICAgICAgICAgIC8qICMgb2YgYXZhaWxhYmxlIFJETUEgUnggcXVldWVzICovCiAJdTE2IHJkbWFjaXFzOyAgICAgICAgICAgICAgIC8qICMgb2YgYXZhaWxhYmxlIFJETUEgY29uY2VudHJhdG9yIElRcyAqLwogCXUxNiBvZmxkX3J4cVtNQVhfT0ZMRF9RU0VUU107Ci0JdTE2IHJkbWFfcnhxW05DSEFOXTsKLQl1MTYgcmRtYV9jaXFbTkNIQU5dOworCXUxNiByZG1hX3J4cVtNQVhfUkRNQV9RVUVVRVNdOworCXUxNiByZG1hX2NpcVtNQVhfUkRNQV9DSVFTXTsKIAl1MTYgdGltZXJfdmFsW1NHRV9OVElNRVJTXTsKIAl1OCBjb3VudGVyX3ZhbFtTR0VfTkNPVU5URVJTXTsKIAl1MzIgZmxfcGdfb3JkZXI7ICAgICAgICAgICAgLyogbGFyZ2UgcGFnZSBhbGxvY2F0aW9uIHNpemUgKi8KQEAgLTYxNiwxMSArNjM3LDEzIEBACiAJdW5zaWduZWQgaW50IGlkbWFfcWlkWzJdOyAgIC8qIFNHRSBJRE1BIEh1bmcgSW5ncmVzcyBRdWV1ZSBJRCAqLwogCiAJdW5zaWduZWQgaW50IGVncl9zdGFydDsKKwl1bnNpZ25lZCBpbnQgZWdyX3N6OwogCXVuc2lnbmVkIGludCBpbmdyX3N0YXJ0OwotCXZvaWQgKmVncl9tYXBbTUFYX0VHUlFdOyAgICAvKiBxaWQtPnF1ZXVlIGVncmVzcyBxdWV1ZSBtYXAgKi8KLQlzdHJ1Y3Qgc2dlX3JzcHEgKmluZ3JfbWFwW01BWF9JTkdRXTsgLyogcWlkLT5xdWV1ZSBpbmdyZXNzIHF1ZXVlIG1hcCAqLwotCURFQ0xBUkVfQklUTUFQKHN0YXJ2aW5nX2ZsLCBNQVhfRUdSUSk7Ci0JREVDTEFSRV9CSVRNQVAodHhxX21hcGVyciwgTUFYX0VHUlEpOworCXVuc2lnbmVkIGludCBpbmdyX3N6OworCXZvaWQgKiplZ3JfbWFwOyAgICAvKiBxaWQtPnF1ZXVlIGVncmVzcyBxdWV1ZSBtYXAgKi8KKwlzdHJ1Y3Qgc2dlX3JzcHEgKippbmdyX21hcDsgLyogcWlkLT5xdWV1ZSBpbmdyZXNzIHF1ZXVlIG1hcCAqLworCXVuc2lnbmVkIGxvbmcgKnN0YXJ2aW5nX2ZsOworCXVuc2lnbmVkIGxvbmcgKnR4cV9tYXBlcnI7CiAJc3RydWN0IHRpbWVyX2xpc3QgcnhfdGltZXI7IC8qIHJlZmlsbHMgc3RhcnZpbmcgRkxzICovCiAJc3RydWN0IHRpbWVyX2xpc3QgdHhfdGltZXI7IC8qIGNoZWNrcyBUeCBxdWV1ZXMgKi8KIH07CkBAIC05OTMsNiArMTAxNiwzMCBAQAogfQogI2VuZGlmIC8qIENPTkZJR19ORVRfUlhfQlVTWV9QT0xMICovCiAKKy8qIFJldHVybiBhIHZlcnNpb24gbnVtYmVyIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIGFkYXB0ZXIuICBUaGUgc2NoZW1lIGlzOgorICogLSBiaXRzIDAuLjk6IGNoaXAgdmVyc2lvbgorICogLSBiaXRzIDEwLi4xNTogY2hpcCByZXZpc2lvbgorICogLSBiaXRzIDE2Li4yMzogcmVnaXN0ZXIgZHVtcCB2ZXJzaW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1rX2FkYXBfdmVycyhzdHJ1Y3QgYWRhcHRlciAqYXApCit7CisJcmV0dXJuIENIRUxTSU9fQ0hJUF9WRVJTSU9OKGFwLT5wYXJhbXMuY2hpcCkgfAorCQkoQ0hFTFNJT19DSElQX1JFTEVBU0UoYXAtPnBhcmFtcy5jaGlwKSA8PCAxMCkgfCAoMSA8PCAxNik7Cit9CisKKy8qIFJldHVybiBhIHF1ZXVlJ3MgaW50ZXJydXB0IGhvbGQtb2ZmIHRpbWUgaW4gdXMuICAwIG1lYW5zIG5vIHRpbWVyLiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcXRpbWVyX3ZhbChjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2dlX3JzcHEgKnEpCit7CisJdW5zaWduZWQgaW50IGlkeCA9IHEtPmludHJfcGFyYW1zID4+IDE7CisKKwlyZXR1cm4gaWR4IDwgU0dFX05USU1FUlMgPyBhZGFwLT5zZ2UudGltZXJfdmFsW2lkeF0gOiAwOworfQorCisvKiBkcml2ZXIgdmVyc2lvbiAmIG5hbWUgdXNlZCBmb3IgZXRodG9vbF9kcnZpbmZvICovCitleHRlcm4gY2hhciBjeGdiNF9kcml2ZXJfbmFtZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgY3hnYjRfZHJpdmVyX3ZlcnNpb25bXTsKKwogdm9pZCB0NF9vc19wb3J0bW9kX2NoYW5nZWQoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGludCBwb3J0X2lkKTsKIHZvaWQgdDRfb3NfbGlua19jaGFuZ2VkKHN0cnVjdCBhZGFwdGVyICphZGFwLCBpbnQgcG9ydF9pZCwgaW50IGxpbmtfc3RhdCk7CiAKQEAgLTEwMjIsNiArMTA2OSwxMCBAQAogdm9pZCB0NF9zZ2Vfc3RhcnQoc3RydWN0IGFkYXB0ZXIgKmFkYXApOwogdm9pZCB0NF9zZ2Vfc3RvcChzdHJ1Y3QgYWRhcHRlciAqYWRhcCk7CiBpbnQgY3hnYl9idXN5X3BvbGwoc3RydWN0IG5hcGlfc3RydWN0ICpuYXBpKTsKK2ludCBjeGdiNF9zZXRfcnNwcV9pbnRyX3BhcmFtcyhzdHJ1Y3Qgc2dlX3JzcHEgKnEsIHVuc2lnbmVkIGludCB1cywKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY250KTsKK3ZvaWQgY3hnYjRfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOworaW50IGN4Z2I0X3dyaXRlX3Jzcyhjb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSwgY29uc3QgdTE2ICpxdWV1ZXMpOwogZXh0ZXJuIGludCBkYmZpZm9faW50X3RocmVzaDsKIAogI2RlZmluZSBmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGl0ZXIpIFwKQEAgLTExMTAsNiArMTE2MSw5IEBACiAJcmV0dXJuIHQ0X21lbW9yeV9ydyhhZGFwLCAwLCBtdHlwZSwgYWRkciwgbGVuLCBidWYsIDApOwogfQogCit1bnNpZ25lZCBpbnQgdDRfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgdDRfZ2V0X3JlZ3Moc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9zaXplKTsKKwogaW50IHQ0X3NlZXByb21fd3Aoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIGJvb2wgZW5hYmxlKTsKIGludCBnZXRfdnBkX3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHZwZF9wYXJhbXMgKnApOwogaW50IHQ0X3JlYWRfZmxhc2goc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBhZGRyLApAQCAtMTEzNiw2ICsxMTkwLDggQEAKIAogdW5zaWduZWQgaW50IHF0aW1lcl92YWwoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXAsCiAJCQljb25zdCBzdHJ1Y3Qgc2dlX3JzcHEgKnEpOworCitpbnQgdDRfaW5pdF9kZXZsb2dfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKTsKIGludCB0NF9pbml0X3NnZV9wYXJhbXMoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IHQ0X2luaXRfdHBfcGFyYW1zKHN0cnVjdCBhZGFwdGVyICphZGFwKTsKIGludCB0NF9maWx0ZXJfZmllbGRfc2hpZnQoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXAsIGludCBmaWx0ZXJfc2VsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9kZWJ1Z2ZzLmMKaW5kZXggNzg4NTRjZS4uZjAyODViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9kZWJ1Z2ZzLmMKQEAgLTY3MCw5ICs2NzAsMTMgQEAKIAkJIjAuOTM3NSIgfTsKIAogCWludCBpOwotCXUxNiBpbmNyW05NVFVTXVtOQ0NUUkxfV0lOXTsKKwl1MTYgKCppbmNyKVtOQ0NUUkxfV0lOXTsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHNlcS0+cHJpdmF0ZTsKIAorCWluY3IgPSBrbWFsbG9jKHNpemVvZigqaW5jcikgKiBOTVRVUywgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbmNyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXQ0X3JlYWRfY29uZ190YmwoYWRhcCwgaW5jcik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTkNDVFJMX1dJTjsgKytpKSB7CkBAIC02ODUsNiArNjg5LDggQEAKIAkJCSAgIGFkYXAtPnBhcmFtcy5hX3duZFtpXSwKIAkJCSAgIGRlY19mYWNbYWRhcC0+cGFyYW1zLmJfd25kW2ldXSk7CiAJfQorCisJa2ZyZWUoaW5jcik7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE3NjksNiArMTc3NSw4IEBACiAJCWludCBuID0gbWluKDQsIGFkYXAtPnNnZS5yZG1hcXMgLSA0ICogcmRtYV9pZHgpOwogCiAJCVMoIlFUeXBlOiIsICJSRE1BLUNQTCIpOworCQlTKCJJbnRlcmZhY2U6IiwKKwkJICByeFtpXS5yc3BxLm5ldGRldiA/IHJ4W2ldLnJzcHEubmV0ZGV2LT5uYW1lIDogIk4vQSIpOwogCQlSKCJSc3BRIElEOiIsIHJzcHEuYWJzX2lkKTsKIAkJUigiUnNwUSBzaXplOiIsIHJzcHEuc2l6ZSk7CiAJCVIoIlJzcFFFIHNpemU6IiwgcnNwcS5pcWVfbGVuKTsKQEAgLTE3ODgsNiArMTc5Niw4IEBACiAJCWludCBuID0gbWluKDQsIGFkYXAtPnNnZS5yZG1hY2lxcyAtIDQgKiBjaXFfaWR4KTsKIAogCQlTKCJRVHlwZToiLCAiUkRNQS1DSVEiKTsKKwkJUygiSW50ZXJmYWNlOiIsCisJCSAgcnhbaV0ucnNwcS5uZXRkZXYgPyByeFtpXS5yc3BxLm5ldGRldi0+bmFtZSA6ICJOL0EiKTsKIAkJUigiUnNwUSBJRDoiLCByc3BxLmFic19pZCk7CiAJCVIoIlJzcFEgc2l6ZToiLCByc3BxLnNpemUpOwogCQlSKCJSc3BRRSBzaXplOiIsIHJzcHEuaXFlX2xlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZXRodG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDgyYjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X2V0aHRvb2wuYwpAQCAtMCwwICsxLDkxNSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNSBDaGVsc2lvIENvbW11bmljYXRpb25zLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqICBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiAgbW9yZSBkZXRhaWxzLgorICoKKyAqICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgorICogIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L21kaW8uaD4KKworI2luY2x1ZGUgImN4Z2I0LmgiCisjaW5jbHVkZSAidDRfcmVncy5oIgorI2luY2x1ZGUgInQ0ZndfYXBpLmgiCisKKyNkZWZpbmUgRUVQUk9NX01BR0lDIDB4MzhFMkYxMEMKKworc3RhdGljIHUzMiBnZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gbmV0ZGV2MmFkYXAoZGV2KS0+bXNnX2VuYWJsZTsKK30KKworc3RhdGljIHZvaWQgc2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiB2YWwpCit7CisJbmV0ZGV2MmFkYXAoZGV2KS0+bXNnX2VuYWJsZSA9IHZhbDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgc3RhdHNfc3RyaW5nc1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisJIlR4T2N0ZXRzT0sgICAgICAgICAiLAorCSJUeEZyYW1lc09LICAgICAgICAgIiwKKwkiVHhCcm9hZGNhc3RGcmFtZXMgICIsCisJIlR4TXVsdGljYXN0RnJhbWVzICAiLAorCSJUeFVuaWNhc3RGcmFtZXMgICAgIiwKKwkiVHhFcnJvckZyYW1lcyAgICAgICIsCisKKwkiVHhGcmFtZXM2NCAgICAgICAgICIsCisJIlR4RnJhbWVzNjVUbzEyNyAgICAiLAorCSJUeEZyYW1lczEyOFRvMjU1ICAgIiwKKwkiVHhGcmFtZXMyNTZUbzUxMSAgICIsCisJIlR4RnJhbWVzNTEyVG8xMDIzICAiLAorCSJUeEZyYW1lczEwMjRUbzE1MTggIiwKKwkiVHhGcmFtZXMxNTE5VG9NYXggICIsCisKKwkiVHhGcmFtZXNEcm9wcGVkICAgICIsCisJIlR4UGF1c2VGcmFtZXMgICAgICAiLAorCSJUeFBQUDBGcmFtZXMgICAgICAgIiwKKwkiVHhQUFAxRnJhbWVzICAgICAgICIsCisJIlR4UFBQMkZyYW1lcyAgICAgICAiLAorCSJUeFBQUDNGcmFtZXMgICAgICAgIiwKKwkiVHhQUFA0RnJhbWVzICAgICAgICIsCisJIlR4UFBQNUZyYW1lcyAgICAgICAiLAorCSJUeFBQUDZGcmFtZXMgICAgICAgIiwKKwkiVHhQUFA3RnJhbWVzICAgICAgICIsCisKKwkiUnhPY3RldHNPSyAgICAgICAgICIsCisJIlJ4RnJhbWVzT0sgICAgICAgICAiLAorCSJSeEJyb2FkY2FzdEZyYW1lcyAgIiwKKwkiUnhNdWx0aWNhc3RGcmFtZXMgICIsCisJIlJ4VW5pY2FzdEZyYW1lcyAgICAiLAorCisJIlJ4RnJhbWVzVG9vTG9uZyAgICAiLAorCSJSeEphYmJlckVycm9ycyAgICAgIiwKKwkiUnhGQ1NFcnJvcnMgICAgICAgICIsCisJIlJ4TGVuZ3RoRXJyb3JzICAgICAiLAorCSJSeFN5bWJvbEVycm9ycyAgICAgIiwKKwkiUnhSdW50RnJhbWVzICAgICAgICIsCisKKwkiUnhGcmFtZXM2NCAgICAgICAgICIsCisJIlJ4RnJhbWVzNjVUbzEyNyAgICAiLAorCSJSeEZyYW1lczEyOFRvMjU1ICAgIiwKKwkiUnhGcmFtZXMyNTZUbzUxMSAgICIsCisJIlJ4RnJhbWVzNTEyVG8xMDIzICAiLAorCSJSeEZyYW1lczEwMjRUbzE1MTggIiwKKwkiUnhGcmFtZXMxNTE5VG9NYXggICIsCisKKwkiUnhQYXVzZUZyYW1lcyAgICAgICIsCisJIlJ4UFBQMEZyYW1lcyAgICAgICAiLAorCSJSeFBQUDFGcmFtZXMgICAgICAgIiwKKwkiUnhQUFAyRnJhbWVzICAgICAgICIsCisJIlJ4UFBQM0ZyYW1lcyAgICAgICAiLAorCSJSeFBQUDRGcmFtZXMgICAgICAgIiwKKwkiUnhQUFA1RnJhbWVzICAgICAgICIsCisJIlJ4UFBQNkZyYW1lcyAgICAgICAiLAorCSJSeFBQUDdGcmFtZXMgICAgICAgIiwKKworCSJSeEJHMEZyYW1lc0Ryb3BwZWQgIiwKKwkiUnhCRzFGcmFtZXNEcm9wcGVkICIsCisJIlJ4QkcyRnJhbWVzRHJvcHBlZCAiLAorCSJSeEJHM0ZyYW1lc0Ryb3BwZWQgIiwKKwkiUnhCRzBGcmFtZXNUcnVuYyAgICIsCisJIlJ4QkcxRnJhbWVzVHJ1bmMgICAiLAorCSJSeEJHMkZyYW1lc1RydW5jICAgIiwKKwkiUnhCRzNGcmFtZXNUcnVuYyAgICIsCisKKwkiVFNPICAgICAgICAgICAgICAgICIsCisJIlR4Q3N1bU9mZmxvYWQgICAgICAiLAorCSJSeENzdW1Hb29kICAgICAgICAgIiwKKwkiVkxBTmV4dHJhY3Rpb25zICAgICIsCisJIlZMQU5pbnNlcnRpb25zICAgICAiLAorCSJHUk9wYWNrZXRzICAgICAgICAgIiwKKwkiR1JPbWVyZ2VkICAgICAgICAgICIsCisJIldyaXRlQ29hbFN1Y2Nlc3MgICAiLAorCSJXcml0ZUNvYWxGYWlsICAgICAgIiwKK307CisKK3N0YXRpYyBpbnQgZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNzZXQpCit7CisJc3dpdGNoIChzc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCXJldHVybiBBUlJBWV9TSVpFKHN0YXRzX3N0cmluZ3MpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBuZXRkZXYyYWRhcChkZXYpOworCisJcmV0dXJuIHQ0X2dldF9yZWdzX2xlbihhZGFwKTsKK30KKworc3RhdGljIGludCBnZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBFRVBST01TSVpFOworfQorCitzdGF0aWMgdm9pZCBnZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQoreworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKKwl1MzIgZXhwcm9tX3ZlcnM7CisKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgY3hnYjRfZHJpdmVyX25hbWUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIGN4Z2I0X2RyaXZlcl92ZXJzaW9uLAorCQlzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAorCQlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKKworCWlmIChhZGFwdGVyLT5wYXJhbXMuZndfdmVycykKKwkJc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pLAorCQkJICIldS4ldS4ldS4ldSwgVFAgJXUuJXUuJXUuJXUiLAorCQkJIEZXX0hEUl9GV19WRVJfTUFKT1JfRyhhZGFwdGVyLT5wYXJhbXMuZndfdmVycyksCisJCQkgRldfSERSX0ZXX1ZFUl9NSU5PUl9HKGFkYXB0ZXItPnBhcmFtcy5md192ZXJzKSwKKwkJCSBGV19IRFJfRldfVkVSX01JQ1JPX0coYWRhcHRlci0+cGFyYW1zLmZ3X3ZlcnMpLAorCQkJIEZXX0hEUl9GV19WRVJfQlVJTERfRyhhZGFwdGVyLT5wYXJhbXMuZndfdmVycyksCisJCQkgRldfSERSX0ZXX1ZFUl9NQUpPUl9HKGFkYXB0ZXItPnBhcmFtcy50cF92ZXJzKSwKKwkJCSBGV19IRFJfRldfVkVSX01JTk9SX0coYWRhcHRlci0+cGFyYW1zLnRwX3ZlcnMpLAorCQkJIEZXX0hEUl9GV19WRVJfTUlDUk9fRyhhZGFwdGVyLT5wYXJhbXMudHBfdmVycyksCisJCQkgRldfSERSX0ZXX1ZFUl9CVUlMRF9HKGFkYXB0ZXItPnBhcmFtcy50cF92ZXJzKSk7CisKKwlpZiAoIXQ0X2dldF9leHByb21fdmVyc2lvbihhZGFwdGVyLCAmZXhwcm9tX3ZlcnMpKQorCQlzbnByaW50ZihpbmZvLT5lcm9tX3ZlcnNpb24sIHNpemVvZihpbmZvLT5lcm9tX3ZlcnNpb24pLAorCQkJICIldS4ldS4ldS4ldSIsCisJCQkgRldfSERSX0ZXX1ZFUl9NQUpPUl9HKGV4cHJvbV92ZXJzKSwKKwkJCSBGV19IRFJfRldfVkVSX01JTk9SX0coZXhwcm9tX3ZlcnMpLAorCQkJIEZXX0hEUl9GV19WRVJfTUlDUk9fRyhleHByb21fdmVycyksCisJCQkgRldfSERSX0ZXX1ZFUl9CVUlMRF9HKGV4cHJvbV92ZXJzKSk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQoreworCWlmIChzdHJpbmdzZXQgPT0gRVRIX1NTX1NUQVRTKQorCQltZW1jcHkoZGF0YSwgc3RhdHNfc3RyaW5ncywgc2l6ZW9mKHN0YXRzX3N0cmluZ3MpKTsKK30KKworLyogcG9ydCBzdGF0cyBtYWludGFpbmVkIHBlciBxdWV1ZSBvZiB0aGUgcG9ydC4gVGhleSBzaG91bGQgYmUgaW4gdGhlIHNhbWUKKyAqIG9yZGVyIGFzIGluIHN0YXRzX3N0cmluZ3MgYWJvdmUuCisgKi8KK3N0cnVjdCBxdWV1ZV9wb3J0X3N0YXRzIHsKKwl1NjQgdHNvOworCXU2NCB0eF9jc3VtOworCXU2NCByeF9jc3VtOworCXU2NCB2bGFuX2V4OworCXU2NCB2bGFuX2luczsKKwl1NjQgZ3JvX3BrdHM7CisJdTY0IGdyb19tZXJnZWQ7Cit9OworCitzdGF0aWMgdm9pZCBjb2xsZWN0X3NnZV9wb3J0X3N0YXRzKGNvbnN0IHN0cnVjdCBhZGFwdGVyICphZGFwLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnAsCisJCQkJICAgc3RydWN0IHF1ZXVlX3BvcnRfc3RhdHMgKnMpCit7CisJaW50IGk7CisJY29uc3Qgc3RydWN0IHNnZV9ldGhfdHhxICp0eCA9ICZhZGFwLT5zZ2UuZXRodHhxW3AtPmZpcnN0X3FzZXRdOworCWNvbnN0IHN0cnVjdCBzZ2VfZXRoX3J4cSAqcnggPSAmYWRhcC0+c2dlLmV0aHJ4cVtwLT5maXJzdF9xc2V0XTsKKworCW1lbXNldChzLCAwLCBzaXplb2YoKnMpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcC0+bnFzZXRzOyBpKyssIHJ4KyssIHR4KyspIHsKKwkJcy0+dHNvICs9IHR4LT50c287CisJCXMtPnR4X2NzdW0gKz0gdHgtPnR4X2NzbzsKKwkJcy0+cnhfY3N1bSArPSByeC0+c3RhdHMucnhfY3NvOworCQlzLT52bGFuX2V4ICs9IHJ4LT5zdGF0cy52bGFuX2V4OworCQlzLT52bGFuX2lucyArPSB0eC0+dmxhbl9pbnM7CisJCXMtPmdyb19wa3RzICs9IHJ4LT5zdGF0cy5scm9fcGt0czsKKwkJcy0+Z3JvX21lcmdlZCArPSByeC0+c3RhdHMubHJvX21lcmdlZDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsCisJCSAgICAgIHU2NCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwaS0+YWRhcHRlcjsKKwl1MzIgdmFsMSwgdmFsMjsKKworCXQ0X2dldF9wb3J0X3N0YXRzKGFkYXB0ZXIsIHBpLT50eF9jaGFuLCAoc3RydWN0IHBvcnRfc3RhdHMgKilkYXRhKTsKKworCWRhdGEgKz0gc2l6ZW9mKHN0cnVjdCBwb3J0X3N0YXRzKSAvIHNpemVvZih1NjQpOworCWNvbGxlY3Rfc2dlX3BvcnRfc3RhdHMoYWRhcHRlciwgcGksIChzdHJ1Y3QgcXVldWVfcG9ydF9zdGF0cyAqKWRhdGEpOworCWRhdGEgKz0gc2l6ZW9mKHN0cnVjdCBxdWV1ZV9wb3J0X3N0YXRzKSAvIHNpemVvZih1NjQpOworCWlmICghaXNfdDQoYWRhcHRlci0+cGFyYW1zLmNoaXApKSB7CisJCXQ0X3dyaXRlX3JlZyhhZGFwdGVyLCBTR0VfU1RBVF9DRkdfQSwgU1RBVFNPVVJDRV9UNV9WKDcpKTsKKwkJdmFsMSA9IHQ0X3JlYWRfcmVnKGFkYXB0ZXIsIFNHRV9TVEFUX1RPVEFMX0EpOworCQl2YWwyID0gdDRfcmVhZF9yZWcoYWRhcHRlciwgU0dFX1NUQVRfTUFUQ0hfQSk7CisJCSpkYXRhID0gdmFsMSAtIHZhbDI7CisJCWRhdGErKzsKKwkJKmRhdGEgPSB2YWwyOworCQlkYXRhKys7CisJfSBlbHNlIHsKKwkJbWVtc2V0KGRhdGEsIDAsIDIgKiBzaXplb2YodTY0KSk7CisJCSpkYXRhICs9IDI7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLAorCQkgICAgIHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG5ldGRldjJhZGFwKGRldik7CisJc2l6ZV90IGJ1Zl9zaXplOworCisJYnVmX3NpemUgPSB0NF9nZXRfcmVnc19sZW4oYWRhcCk7CisJcmVncy0+dmVyc2lvbiA9IG1rX2FkYXBfdmVycyhhZGFwKTsKKwl0NF9nZXRfcmVncyhhZGFwLCBidWYsIGJ1Zl9zaXplKTsKK30KKworc3RhdGljIGludCByZXN0YXJ0X2F1dG9uZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlpZiAocC0+bGlua19jZmcuYXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJdDRfcmVzdGFydF9hbmVnKHAtPmFkYXB0ZXIsIHAtPmFkYXB0ZXItPmZuLCBwLT50eF9jaGFuKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpZGVudGlmeV9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgZW51bSBldGh0b29sX3BoeXNfaWRfc3RhdGUgc3RhdGUpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG5ldGRldjJhZGFwKGRldik7CisKKwlpZiAoc3RhdGUgPT0gRVRIVE9PTF9JRF9BQ1RJVkUpCisJCXZhbCA9IDB4ZmZmZjsKKwllbHNlIGlmIChzdGF0ZSA9PSBFVEhUT09MX0lEX0lOQUNUSVZFKQorCQl2YWwgPSAwOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdDRfaWRlbnRpZnlfcG9ydChhZGFwLCBhZGFwLT5mbiwgbmV0ZGV2MnBpbmZvKGRldiktPnZpaWQsIHZhbCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnJvbV9md19saW5rY2FwcyhlbnVtIGZ3X3BvcnRfdHlwZSB0eXBlLCB1bnNpZ25lZCBpbnQgY2FwcykKK3sKKwl1bnNpZ25lZCBpbnQgdiA9IDA7CisKKwlpZiAodHlwZSA9PSBGV19QT1JUX1RZUEVfQlRfU0dNSUkgfHwgdHlwZSA9PSBGV19QT1JUX1RZUEVfQlRfWEZJIHx8CisJICAgIHR5cGUgPT0gRldfUE9SVF9UWVBFX0JUX1hBVUkpIHsKKwkJdiB8PSBTVVBQT1JURURfVFA7CisJCWlmIChjYXBzICYgRldfUE9SVF9DQVBfU1BFRURfMTAwTSkKKwkJCXYgfD0gU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGw7CisJCWlmIChjYXBzICYgRldfUE9SVF9DQVBfU1BFRURfMUcpCisJCQl2IHw9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKKwkJaWYgKGNhcHMgJiBGV19QT1JUX0NBUF9TUEVFRF8xMEcpCisJCQl2IHw9IFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGw7CisJfSBlbHNlIGlmICh0eXBlID09IEZXX1BPUlRfVFlQRV9LWDQgfHwgdHlwZSA9PSBGV19QT1JUX1RZUEVfS1gpIHsKKwkJdiB8PSBTVVBQT1JURURfQmFja3BsYW5lOworCQlpZiAoY2FwcyAmIEZXX1BPUlRfQ0FQX1NQRUVEXzFHKQorCQkJdiB8PSBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsOworCQlpZiAoY2FwcyAmIEZXX1BPUlRfQ0FQX1NQRUVEXzEwRykKKwkJCXYgfD0gU1VQUE9SVEVEXzEwMDAwYmFzZUtYNF9GdWxsOworCX0gZWxzZSBpZiAodHlwZSA9PSBGV19QT1JUX1RZUEVfS1IpIHsKKwkJdiB8PSBTVVBQT1JURURfQmFja3BsYW5lIHwgU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGw7CisJfSBlbHNlIGlmICh0eXBlID09IEZXX1BPUlRfVFlQRV9CUF9BUCkgeworCQl2IHw9IFNVUFBPUlRFRF9CYWNrcGxhbmUgfCBTVVBQT1JURURfMTAwMDBiYXNlUl9GRUMgfAorCQkgICAgIFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsIHwgU1VQUE9SVEVEXzEwMDBiYXNlS1hfRnVsbDsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gRldfUE9SVF9UWVBFX0JQNF9BUCkgeworCQl2IHw9IFNVUFBPUlRFRF9CYWNrcGxhbmUgfCBTVVBQT1JURURfMTAwMDBiYXNlUl9GRUMgfAorCQkgICAgIFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsIHwgU1VQUE9SVEVEXzEwMDBiYXNlS1hfRnVsbCB8CisJCSAgICAgU1VQUE9SVEVEXzEwMDAwYmFzZUtYNF9GdWxsOworCX0gZWxzZSBpZiAodHlwZSA9PSBGV19QT1JUX1RZUEVfRklCRVJfWEZJIHx8CisJCSAgIHR5cGUgPT0gRldfUE9SVF9UWVBFX0ZJQkVSX1hBVUkgfHwKKwkJICAgdHlwZSA9PSBGV19QT1JUX1RZUEVfU0ZQIHx8CisJCSAgIHR5cGUgPT0gRldfUE9SVF9UWVBFX1FTRlBfMTBHIHx8CisJCSAgIHR5cGUgPT0gRldfUE9SVF9UWVBFX1FTQSkgeworCQl2IHw9IFNVUFBPUlRFRF9GSUJSRTsKKwkJaWYgKGNhcHMgJiBGV19QT1JUX0NBUF9TUEVFRF8xRykKKwkJCXYgfD0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCQlpZiAoY2FwcyAmIEZXX1BPUlRfQ0FQX1NQRUVEXzEwRykKKwkJCXYgfD0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbDsKKwl9IGVsc2UgaWYgKHR5cGUgPT0gRldfUE9SVF9UWVBFX0JQNDBfQkEgfHwKKwkJICAgdHlwZSA9PSBGV19QT1JUX1RZUEVfUVNGUCkgeworCQl2IHw9IFNVUFBPUlRFRF80MDAwMGJhc2VTUjRfRnVsbDsKKwkJdiB8PSBTVVBQT1JURURfRklCUkU7CisJfQorCisJaWYgKGNhcHMgJiBGV19QT1JUX0NBUF9BTkVHKQorCQl2IHw9IFNVUFBPUlRFRF9BdXRvbmVnOworCXJldHVybiB2OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHRvX2Z3X2xpbmtjYXBzKHVuc2lnbmVkIGludCBjYXBzKQoreworCXVuc2lnbmVkIGludCB2ID0gMDsKKworCWlmIChjYXBzICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQl2IHw9IEZXX1BPUlRfQ0FQX1NQRUVEXzEwME07CisJaWYgKGNhcHMgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQl2IHw9IEZXX1BPUlRfQ0FQX1NQRUVEXzFHOworCWlmIChjYXBzICYgQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwpCisJCXYgfD0gRldfUE9SVF9DQVBfU1BFRURfMTBHOworCWlmIChjYXBzICYgQURWRVJUSVNFRF80MDAwMGJhc2VTUjRfRnVsbCkKKwkJdiB8PSBGV19QT1JUX0NBUF9TUEVFRF80MEc7CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQoreworCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfQlRfU0dNSUkgfHwKKwkgICAgcC0+cG9ydF90eXBlID09IEZXX1BPUlRfVFlQRV9CVF9YRkkgfHwKKwkgICAgcC0+cG9ydF90eXBlID09IEZXX1BPUlRfVFlQRV9CVF9YQVVJKSB7CisJCWNtZC0+cG9ydCA9IFBPUlRfVFA7CisJfSBlbHNlIGlmIChwLT5wb3J0X3R5cGUgPT0gRldfUE9SVF9UWVBFX0ZJQkVSX1hGSSB8fAorCQkgICBwLT5wb3J0X3R5cGUgPT0gRldfUE9SVF9UWVBFX0ZJQkVSX1hBVUkpIHsKKwkJY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKKwl9IGVsc2UgaWYgKHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfU0ZQIHx8CisJCSAgIHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfUVNGUF8xMEcgfHwKKwkJICAgcC0+cG9ydF90eXBlID09IEZXX1BPUlRfVFlQRV9RU0EgfHwKKwkJICAgcC0+cG9ydF90eXBlID09IEZXX1BPUlRfVFlQRV9RU0ZQKSB7CisJCWlmIChwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX0xSIHx8CisJCSAgICBwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX1NSIHx8CisJCSAgICBwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX0VSIHx8CisJCSAgICBwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX0xSTSkKKwkJCWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7CisJCWVsc2UgaWYgKHAtPm1vZF90eXBlID09IEZXX1BPUlRfTU9EX1RZUEVfVFdJTkFYX1BBU1NJVkUgfHwKKwkJCSBwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX1RXSU5BWF9BQ1RJVkUpCisJCQljbWQtPnBvcnQgPSBQT1JUX0RBOworCQllbHNlCisJCQljbWQtPnBvcnQgPSBQT1JUX09USEVSOworCX0gZWxzZSB7CisJCWNtZC0+cG9ydCA9IFBPUlRfT1RIRVI7CisJfQorCisJaWYgKHAtPm1kaW9fYWRkciA+PSAwKSB7CisJCWNtZC0+cGh5X2FkZHJlc3MgPSBwLT5tZGlvX2FkZHI7CisJCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOworCQljbWQtPm1kaW9fc3VwcG9ydCA9IHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfQlRfU0dNSUkgPworCQkJTURJT19TVVBQT1JUU19DMjIgOiBNRElPX1NVUFBPUlRTX0M0NTsKKwl9IGVsc2UgeworCQljbWQtPnBoeV9hZGRyZXNzID0gMDsgIC8qIG5vdCByZWFsbHksIGJ1dCBubyBiZXR0ZXIgb3B0aW9uICovCisJCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOworCQljbWQtPm1kaW9fc3VwcG9ydCA9IDA7CisJfQorCisJY21kLT5zdXBwb3J0ZWQgPSBmcm9tX2Z3X2xpbmtjYXBzKHAtPnBvcnRfdHlwZSwgcC0+bGlua19jZmcuc3VwcG9ydGVkKTsKKwljbWQtPmFkdmVydGlzaW5nID0gZnJvbV9md19saW5rY2FwcyhwLT5wb3J0X3R5cGUsCisJCQkJCSAgICBwLT5saW5rX2NmZy5hZHZlcnRpc2luZyk7CisJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwKKwkJCSAgICAgIG5ldGlmX2NhcnJpZXJfb2soZGV2KSA/IHAtPmxpbmtfY2ZnLnNwZWVkIDogMCk7CisJY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKKwljbWQtPmF1dG9uZWcgPSBwLT5saW5rX2NmZy5hdXRvbmVnOworCWNtZC0+bWF4dHhwa3QgPSAwOworCWNtZC0+bWF4cnhwa3QgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkX3RvX2NhcHMoaW50IHNwZWVkKQoreworCWlmIChzcGVlZCA9PSAxMDApCisJCXJldHVybiBGV19QT1JUX0NBUF9TUEVFRF8xMDBNOworCWlmIChzcGVlZCA9PSAxMDAwKQorCQlyZXR1cm4gRldfUE9SVF9DQVBfU1BFRURfMUc7CisJaWYgKHNwZWVkID09IDEwMDAwKQorCQlyZXR1cm4gRldfUE9SVF9DQVBfU1BFRURfMTBHOworCWlmIChzcGVlZCA9PSA0MDAwMCkKKwkJcmV0dXJuIEZXX1BPUlRfQ0FQX1NQRUVEXzQwRzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJdW5zaWduZWQgaW50IGNhcDsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbGlua19jb25maWcgKmxjID0gJnAtPmxpbmtfY2ZnOworCXUzMiBzcGVlZCA9IGV0aHRvb2xfY21kX3NwZWVkKGNtZCk7CisKKwlpZiAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpICAgICAvKiBvbmx5IGZ1bGwtZHVwbGV4IHN1cHBvcnRlZCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKGxjLT5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9BTkVHKSkgeworCQkvKiBQSFkgb2ZmZXJzIGEgc2luZ2xlIHNwZWVkLiAgU2VlIGlmIHRoYXQncyB3aGF0J3MKKwkJICogYmVpbmcgcmVxdWVzdGVkLgorCQkgKi8KKwkJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUgJiYKKwkJICAgIChsYy0+c3VwcG9ydGVkICYgc3BlZWRfdG9fY2FwcyhzcGVlZCkpKQorCQkJcmV0dXJuIDA7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7CisJCWNhcCA9IHNwZWVkX3RvX2NhcHMoc3BlZWQpOworCisJCWlmICghKGxjLT5zdXBwb3J0ZWQgJiBjYXApIHx8CisJCSAgICAoc3BlZWQgPT0gMTAwMCkgfHwKKwkJICAgIChzcGVlZCA9PSAxMDAwMCkgfHwKKwkJICAgIChzcGVlZCA9PSA0MDAwMCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbGMtPnJlcXVlc3RlZF9zcGVlZCA9IGNhcDsKKwkJbGMtPmFkdmVydGlzaW5nID0gMDsKKwl9IGVsc2UgeworCQljYXAgPSB0b19md19saW5rY2FwcyhjbWQtPmFkdmVydGlzaW5nKTsKKwkJaWYgKCEobGMtPnN1cHBvcnRlZCAmIGNhcCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJbGMtPnJlcXVlc3RlZF9zcGVlZCA9IDA7CisJCWxjLT5hZHZlcnRpc2luZyA9IGNhcCB8IEZXX1BPUlRfQ0FQX0FORUc7CisJfQorCWxjLT5hdXRvbmVnID0gY21kLT5hdXRvbmVnOworCisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIHQ0X2xpbmtfc3RhcnQocC0+YWRhcHRlciwgcC0+YWRhcHRlci0+Zm4sIHAtPnR4X2NoYW4sCisJCQkJICAgICBsYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplcGF1c2UpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcCA9IG5ldGRldl9wcml2KGRldik7CisKKwllcGF1c2UtPmF1dG9uZWcgPSAocC0+bGlua19jZmcucmVxdWVzdGVkX2ZjICYgUEFVU0VfQVVUT05FRykgIT0gMDsKKwllcGF1c2UtPnJ4X3BhdXNlID0gKHAtPmxpbmtfY2ZnLmZjICYgUEFVU0VfUlgpICE9IDA7CisJZXBhdXNlLT50eF9wYXVzZSA9IChwLT5saW5rX2NmZy5mYyAmIFBBVVNFX1RYKSAhPSAwOworfQorCitzdGF0aWMgaW50IHNldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKK3sKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbGlua19jb25maWcgKmxjID0gJnAtPmxpbmtfY2ZnOworCisJaWYgKGVwYXVzZS0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpCisJCWxjLT5yZXF1ZXN0ZWRfZmMgPSAwOworCWVsc2UgaWYgKGxjLT5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9BTkVHKQorCQlsYy0+cmVxdWVzdGVkX2ZjID0gUEFVU0VfQVVUT05FRzsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGVwYXVzZS0+cnhfcGF1c2UpCisJCWxjLT5yZXF1ZXN0ZWRfZmMgfD0gUEFVU0VfUlg7CisJaWYgKGVwYXVzZS0+dHhfcGF1c2UpCisJCWxjLT5yZXF1ZXN0ZWRfZmMgfD0gUEFVU0VfVFg7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJcmV0dXJuIHQ0X2xpbmtfc3RhcnQocC0+YWRhcHRlciwgcC0+YWRhcHRlci0+Zm4sIHAtPnR4X2NoYW4sCisJCQkJICAgICBsYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zZ2VfcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICplKQoreworCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljb25zdCBzdHJ1Y3Qgc2dlICpzID0gJnBpLT5hZGFwdGVyLT5zZ2U7CisKKwllLT5yeF9tYXhfcGVuZGluZyA9IE1BWF9SWF9CVUZGRVJTOworCWUtPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSBNQVhfUlNQUV9FTlRSSUVTOworCWUtPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gMDsKKwllLT50eF9tYXhfcGVuZGluZyA9IE1BWF9UWFFfRU5UUklFUzsKKworCWUtPnJ4X3BlbmRpbmcgPSBzLT5ldGhyeHFbcGktPmZpcnN0X3FzZXRdLmZsLnNpemUgLSA4OworCWUtPnJ4X21pbmlfcGVuZGluZyA9IHMtPmV0aHJ4cVtwaS0+Zmlyc3RfcXNldF0ucnNwcS5zaXplOworCWUtPnJ4X2p1bWJvX3BlbmRpbmcgPSAwOworCWUtPnR4X3BlbmRpbmcgPSBzLT5ldGh0eHFbcGktPmZpcnN0X3FzZXRdLnEuc2l6ZTsKK30KKworc3RhdGljIGludCBzZXRfc2dlX3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqZSkKK3sKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwaS0+YWRhcHRlcjsKKwlzdHJ1Y3Qgc2dlICpzID0gJmFkYXB0ZXItPnNnZTsKKworCWlmIChlLT5yeF9wZW5kaW5nID4gTUFYX1JYX0JVRkZFUlMgfHwgZS0+cnhfanVtYm9fcGVuZGluZyB8fAorCSAgICBlLT50eF9wZW5kaW5nID4gTUFYX1RYUV9FTlRSSUVTIHx8CisJICAgIGUtPnJ4X21pbmlfcGVuZGluZyA+IE1BWF9SU1BRX0VOVFJJRVMgfHwKKwkgICAgZS0+cnhfbWluaV9wZW5kaW5nIDwgTUlOX1JTUFFfRU5UUklFUyB8fAorCSAgICBlLT5yeF9wZW5kaW5nIDwgTUlOX0ZMX0VOVFJJRVMgfHwgZS0+dHhfcGVuZGluZyA8IE1JTl9UWFFfRU5UUklFUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWZvciAoaSA9IDA7IGkgPCBwaS0+bnFzZXRzOyArK2kpIHsKKwkJcy0+ZXRodHhxW3BpLT5maXJzdF9xc2V0ICsgaV0ucS5zaXplID0gZS0+dHhfcGVuZGluZzsKKwkJcy0+ZXRocnhxW3BpLT5maXJzdF9xc2V0ICsgaV0uZmwuc2l6ZSA9IGUtPnJ4X3BlbmRpbmcgKyA4OworCQlzLT5ldGhyeHFbcGktPmZpcnN0X3FzZXQgKyBpXS5yc3BxLnNpemUgPSBlLT5yeF9taW5pX3BlbmRpbmc7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIHNldF9yeF9pbnRyX3BhcmFtcyAtIHNldCBhIG5ldCBkZXZpY2VzJ3MgUlggaW50ZXJydXB0IGhvbGRvZmYgcGFyYW1ldGUhCisgKiBAZGV2OiB0aGUgbmV0d29yayBkZXZpY2UKKyAqIEB1czogdGhlIGhvbGQtb2ZmIHRpbWUgaW4gdXMsIG9yIDAgdG8gZGlzYWJsZSB0aW1lcgorICogQGNudDogdGhlIGhvbGQtb2ZmIHBhY2tldCBjb3VudCwgb3IgMCB0byBkaXNhYmxlIGNvdW50ZXIKKyAqCisgKiBTZXQgdGhlIFJYIGludGVycnVwdCBob2xkLW9mZiBwYXJhbWV0ZXJzIGZvciBhIG5ldHdvcmsgZGV2aWNlLgorICovCitzdGF0aWMgaW50IHNldF9yeF9pbnRyX3BhcmFtcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgdW5zaWduZWQgaW50IHVzLCB1bnNpZ25lZCBpbnQgY250KQoreworCWludCBpLCBlcnI7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7CisJc3RydWN0IHNnZV9ldGhfcnhxICpxID0gJmFkYXAtPnNnZS5ldGhyeHFbcGktPmZpcnN0X3FzZXRdOworCisJZm9yIChpID0gMDsgaSA8IHBpLT5ucXNldHM7IGkrKywgcSsrKSB7CisJCWVyciA9IGN4Z2I0X3NldF9yc3BxX2ludHJfcGFyYW1zKCZxLT5yc3BxLCB1cywgY250KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9hZGFwdGl2ZV9yeF9zZXR0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBhZGFwdGl2ZV9yeCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwaS0+YWRhcHRlcjsKKwlzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnEgPSAmYWRhcC0+c2dlLmV0aHJ4cVtwaS0+Zmlyc3RfcXNldF07CisKKwlmb3IgKGkgPSAwOyBpIDwgcGktPm5xc2V0czsgaSsrLCBxKyspCisJCXEtPnJzcHEuYWRhcHRpdmVfcnggPSBhZGFwdGl2ZV9yeDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9hZGFwdGl2ZV9yeF9zZXR0aW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7CisJc3RydWN0IHNnZV9ldGhfcnhxICpxID0gJmFkYXAtPnNnZS5ldGhyeHFbcGktPmZpcnN0X3FzZXRdOworCisJcmV0dXJuIHEtPnJzcHEuYWRhcHRpdmVfcng7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjKQoreworCXNldF9hZGFwdGl2ZV9yeF9zZXR0aW5nKGRldiwgYy0+dXNlX2FkYXB0aXZlX3J4X2NvYWxlc2NlKTsKKwlyZXR1cm4gc2V0X3J4X2ludHJfcGFyYW1zKGRldiwgYy0+cnhfY29hbGVzY2VfdXNlY3MsCisJCQkJICBjLT5yeF9tYXhfY29hbGVzY2VkX2ZyYW1lcyk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjKQoreworCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwljb25zdCBzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBpLT5hZGFwdGVyOworCWNvbnN0IHN0cnVjdCBzZ2VfcnNwcSAqcnEgPSAmYWRhcC0+c2dlLmV0aHJ4cVtwaS0+Zmlyc3RfcXNldF0ucnNwcTsKKworCWMtPnJ4X2NvYWxlc2NlX3VzZWNzID0gcXRpbWVyX3ZhbChhZGFwLCBycSk7CisJYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMgPSAocnEtPmludHJfcGFyYW1zICYgUUlOVFJfQ05UX0VOKSA/CisJCWFkYXAtPnNnZS5jb3VudGVyX3ZhbFtycS0+cGt0Y250X2lkeF0gOiAwOworCWMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSA9IGdldF9hZGFwdGl2ZV9yeF9zZXR0aW5nKGRldik7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICoJZWVwcm9tX3B0b3YgLSB0cmFuc2xhdGUgYSBwaHlzaWNhbCBFRVBST00gYWRkcmVzcyB0byB2aXJ0dWFsCisgKglAcGh5c19hZGRyOiB0aGUgcGh5c2ljYWwgRUVQUk9NIGFkZHJlc3MKKyAqCUBmbjogdGhlIFBDSSBmdW5jdGlvbiBudW1iZXIKKyAqCUBzejogc2l6ZSBvZiBmdW5jdGlvbi1zcGVjaWZpYyBhcmVhCisgKgorICoJVHJhbnNsYXRlIGEgcGh5c2ljYWwgRUVQUk9NIGFkZHJlc3MgdG8gdmlydHVhbC4gIFRoZSBmaXJzdCAxSyBpcworICoJYWNjZXNzZWQgdGhyb3VnaCB2aXJ0dWFsIGFkZHJlc3NlcyBzdGFydGluZyBhdCAzMUssIHRoZSByZXN0IGlzCisgKglhY2Nlc3NlZCB0aHJvdWdoIHZpcnR1YWwgYWRkcmVzc2VzIHN0YXJ0aW5nIGF0IDAuCisgKgorICoJVGhlIG1hcHBpbmcgaXMgYXMgZm9sbG93czoKKyAqCVswLi4xSykgLT4gWzMxSy4uMzJLKQorICoJWzFLLi4xSytBKSAtPiBbMzFLLUEuLjMxSykKKyAqCVsxSytBLi5FUykgLT4gWzAuLkVTLUEtMUspCisgKgorICoJd2hlcmUgQSA9IEBmbiAqIEBzeiwgYW5kIEVTID0gRUVQUk9NIHNpemUuCisgKi8KK3N0YXRpYyBpbnQgZWVwcm9tX3B0b3YodW5zaWduZWQgaW50IHBoeXNfYWRkciwgdW5zaWduZWQgaW50IGZuLCB1bnNpZ25lZCBpbnQgc3opCit7CisJZm4gKj0gc3o7CisJaWYgKHBoeXNfYWRkciA8IDEwMjQpCisJCXJldHVybiBwaHlzX2FkZHIgKyAoMzEgPDwgMTApOworCWlmIChwaHlzX2FkZHIgPCAxMDI0ICsgZm4pCisJCXJldHVybiAzMTc0NCAtIGZuICsgcGh5c19hZGRyIC0gMTAyNDsKKwlpZiAocGh5c19hZGRyIDwgRUVQUk9NU0laRSkKKwkJcmV0dXJuIHBoeXNfYWRkciAtIDEwMjQgLSBmbjsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogVGhlIG5leHQgdHdvIHJvdXRpbmVzIGltcGxlbWVudCBlZXByb20gcmVhZC93cml0ZSBmcm9tIHBoeXNpY2FsIGFkZHJlc3Nlcy4KKyAqLworc3RhdGljIGludCBlZXByb21fcmRfcGh5cyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgdW5zaWduZWQgaW50IHBoeXNfYWRkciwgdTMyICp2KQoreworCWludCB2YWRkciA9IGVlcHJvbV9wdG92KHBoeXNfYWRkciwgYWRhcC0+Zm4sIEVFUFJPTVBGU0laRSk7CisKKwlpZiAodmFkZHIgPj0gMCkKKwkJdmFkZHIgPSBwY2lfcmVhZF92cGQoYWRhcC0+cGRldiwgdmFkZHIsIHNpemVvZih1MzIpLCB2KTsKKwlyZXR1cm4gdmFkZHIgPCAwID8gdmFkZHIgOiAwOworfQorCitzdGF0aWMgaW50IGVlcHJvbV93cl9waHlzKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgcGh5c19hZGRyLCB1MzIgdikKK3sKKwlpbnQgdmFkZHIgPSBlZXByb21fcHRvdihwaHlzX2FkZHIsIGFkYXAtPmZuLCBFRVBST01QRlNJWkUpOworCisJaWYgKHZhZGRyID49IDApCisJCXZhZGRyID0gcGNpX3dyaXRlX3ZwZChhZGFwLT5wZGV2LCB2YWRkciwgc2l6ZW9mKHUzMiksICZ2KTsKKwlyZXR1cm4gdmFkZHIgPCAwID8gdmFkZHIgOiAwOworfQorCisjZGVmaW5lIEVFUFJPTV9NQUdJQyAweDM4RTJGMTBDCisKK3N0YXRpYyBpbnQgZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmUsCisJCSAgICAgIHU4ICpkYXRhKQoreworCWludCBpLCBlcnIgPSAwOworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKKwl1OCAqYnVmID0ga21hbGxvYyhFRVBST01TSVpFLCBHRlBfS0VSTkVMKTsKKworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWUtPm1hZ2ljID0gRUVQUk9NX01BR0lDOworCWZvciAoaSA9IGUtPm9mZnNldCAmIH4zOyAhZXJyICYmIGkgPCBlLT5vZmZzZXQgKyBlLT5sZW47IGkgKz0gNCkKKwkJZXJyID0gZWVwcm9tX3JkX3BoeXMoYWRhcHRlciwgaSwgKHUzMiAqKSZidWZbaV0pOworCisJaWYgKCFlcnIpCisJCW1lbWNweShkYXRhLCBidWYgKyBlLT5vZmZzZXQsIGUtPmxlbik7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sCisJCSAgICAgIHU4ICpkYXRhKQoreworCXU4ICpidWY7CisJaW50IGVyciA9IDA7CisJdTMyIGFsaWduZWRfb2Zmc2V0LCBhbGlnbmVkX2xlbiwgKnA7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYyYWRhcChkZXYpOworCisJaWYgKGVlcHJvbS0+bWFnaWMgIT0gRUVQUk9NX01BR0lDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWFsaWduZWRfb2Zmc2V0ID0gZWVwcm9tLT5vZmZzZXQgJiB+MzsKKwlhbGlnbmVkX2xlbiA9IChlZXByb20tPmxlbiArIChlZXByb20tPm9mZnNldCAmIDMpICsgMykgJiB+MzsKKworCWlmIChhZGFwdGVyLT5mbiA+IDApIHsKKwkJdTMyIHN0YXJ0ID0gMTAyNCArIGFkYXB0ZXItPmZuICogRUVQUk9NUEZTSVpFOworCisJCWlmIChhbGlnbmVkX29mZnNldCA8IHN0YXJ0IHx8CisJCSAgICBhbGlnbmVkX29mZnNldCArIGFsaWduZWRfbGVuID4gc3RhcnQgKyBFRVBST01QRlNJWkUpCisJCQlyZXR1cm4gLUVQRVJNOworCX0KKworCWlmIChhbGlnbmVkX29mZnNldCAhPSBlZXByb20tPm9mZnNldCB8fCBhbGlnbmVkX2xlbiAhPSBlZXByb20tPmxlbikgeworCQkvKiBSTVcgcG9zc2libHkgbmVlZGVkIGZvciBmaXJzdCBvciBsYXN0IHdvcmRzLgorCQkgKi8KKwkJYnVmID0ga21hbGxvYyhhbGlnbmVkX2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWVyciA9IGVlcHJvbV9yZF9waHlzKGFkYXB0ZXIsIGFsaWduZWRfb2Zmc2V0LCAodTMyICopYnVmKTsKKwkJaWYgKCFlcnIgJiYgYWxpZ25lZF9sZW4gPiA0KQorCQkJZXJyID0gZWVwcm9tX3JkX3BoeXMoYWRhcHRlciwKKwkJCQkJICAgICBhbGlnbmVkX29mZnNldCArIGFsaWduZWRfbGVuIC0gNCwKKwkJCQkJICAgICAodTMyICopJmJ1ZlthbGlnbmVkX2xlbiAtIDRdKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCQltZW1jcHkoYnVmICsgKGVlcHJvbS0+b2Zmc2V0ICYgMyksIGRhdGEsIGVlcHJvbS0+bGVuKTsKKwl9IGVsc2UgeworCQlidWYgPSBkYXRhOworCX0KKworCWVyciA9IHQ0X3NlZXByb21fd3AoYWRhcHRlciwgZmFsc2UpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZm9yIChwID0gKHUzMiAqKWJ1ZjsgIWVyciAmJiBhbGlnbmVkX2xlbjsgYWxpZ25lZF9sZW4gLT0gNCwgcCsrKSB7CisJCWVyciA9IGVlcHJvbV93cl9waHlzKGFkYXB0ZXIsIGFsaWduZWRfb2Zmc2V0LCAqcCk7CisJCWFsaWduZWRfb2Zmc2V0ICs9IDQ7CisJfQorCisJaWYgKCFlcnIpCisJCWVyciA9IHQ0X3NlZXByb21fd3AoYWRhcHRlciwgdHJ1ZSk7CitvdXQ6CisJaWYgKGJ1ZiAhPSBkYXRhKQorCQlrZnJlZShidWYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2ZsYXNoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2ZsYXNoICplZikKK3sKKwlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBuZXRkZXYyYWRhcChuZXRkZXYpOworCXVuc2lnbmVkIGludCBtYm94ID0gUENJRV9GV19NQVNURVJfTSArIDE7CisKKwllZi0+ZGF0YVtzaXplb2YoZWYtPmRhdGEpIC0gMV0gPSAnXDAnOworCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBlZi0+ZGF0YSwgYWRhcC0+cGRldl9kZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogSWYgdGhlIGFkYXB0ZXIgaGFzIGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQgdGhlbiB3ZSdsbCBnbyBhaGVhZCBhbmQKKwkgKiB0cnkgdG8gZ2V0IHRoZSBmaXJtd2FyZSdzIGNvb3BlcmF0aW9uIGluIHVwZ3JhZGluZyB0byB0aGUgbmV3CisJICogZmlybXdhcmUgaW1hZ2Ugb3RoZXJ3aXNlIHdlJ2xsIHRyeSB0byBkbyB0aGUgZW50aXJlIGpvYiBmcm9tIHRoZQorCSAqIGhvc3QgLi4uIGFuZCB3ZSBhbHdheXMgImZvcmNlIiB0aGUgb3BlcmF0aW9uIGluIHRoaXMgcGF0aC4KKwkgKi8KKwlpZiAoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKKwkJbWJveCA9IGFkYXAtPm1ib3g7CisKKwlyZXQgPSB0NF9md191cGdyYWRlKGFkYXAsIG1ib3gsIGZ3LT5kYXRhLCBmdy0+c2l6ZSwgMSk7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJaWYgKCFyZXQpCisJCWRldl9pbmZvKGFkYXAtPnBkZXZfZGV2LAorCQkJICJsb2FkZWQgZmlybXdhcmUgJXMsIHJlbG9hZCBjeGdiNCBkcml2ZXJcbiIsIGVmLT5kYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFdPTF9TVVBQT1JURUQgKFdBS0VfQkNBU1QgfCBXQUtFX01BR0lDKQorI2RlZmluZSBCQ0FTVF9DUkMgMHhhMGNjYzFhNgorCitzdGF0aWMgdm9pZCBnZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwl3b2wtPnN1cHBvcnRlZCA9IFdBS0VfQkNBU1QgfCBXQUtFX01BR0lDOworCXdvbC0+d29sb3B0cyA9IG5ldGRldjJhZGFwKGRldiktPndvbDsKKwltZW1zZXQoJndvbC0+c29wYXNzLCAwLCBzaXplb2Yod29sLT5zb3Bhc3MpKTsKK30KKworc3RhdGljIGludCBzZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAod29sLT53b2xvcHRzICYgfldPTF9TVVBQT1JURUQpCisJCXJldHVybiAtRUlOVkFMOworCXQ0X3dvbF9tYWdpY19lbmFibGUocGktPmFkYXB0ZXIsIHBpLT50eF9jaGFuLAorCQkJICAgICh3b2wtPndvbG9wdHMgJiBXQUtFX01BR0lDKSA/IGRldi0+ZGV2X2FkZHIgOiBOVUxMKTsKKwlpZiAod29sLT53b2xvcHRzICYgV0FLRV9CQ0FTVCkgeworCQllcnIgPSB0NF93b2xfcGF0X2VuYWJsZShwaS0+YWRhcHRlciwgcGktPnR4X2NoYW4sIDB4ZmUsIH4wVUxMLAorCQkJCQl+MFVMTCwgMCwgZmFsc2UpOworCQlpZiAoIWVycikKKwkJCWVyciA9IHQ0X3dvbF9wYXRfZW5hYmxlKHBpLT5hZGFwdGVyLCBwaS0+dHhfY2hhbiwgMSwKKwkJCQkJCX42VUxMLCB+MFVMTCwgQkNBU1RfQ1JDLCB0cnVlKTsKKwl9IGVsc2UgeworCQl0NF93b2xfcGF0X2VuYWJsZShwaS0+YWRhcHRlciwgcGktPnR4X2NoYW4sIDAsIDAsIDAsIDAsIGZhbHNlKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHUzMiBnZXRfcnNzX3RhYmxlX3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gcGktPnJzc19zaXplOworfQorCitzdGF0aWMgaW50IGdldF9yc3NfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICpwLCB1OCAqa2V5LCB1OCAqaGZ1bmMpCit7CisJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBuID0gcGktPnJzc19zaXplOworCisJaWYgKGhmdW5jKQorCQkqaGZ1bmMgPSBFVEhfUlNTX0hBU0hfVE9QOworCWlmICghcCkKKwkJcmV0dXJuIDA7CisJd2hpbGUgKG4tLSkKKwkJcFtuXSA9IHBpLT5yc3Nbbl07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3Jzc190YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1MzIgKnAsIGNvbnN0IHU4ICprZXksCisJCQkgY29uc3QgdTggaGZ1bmMpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogV2UgcmVxdWlyZSBhdCBsZWFzdCBvbmUgc3VwcG9ydGVkIHBhcmFtZXRlciB0byBiZSBjaGFuZ2VkIGFuZCBubworCSAqIGNoYW5nZSBpbiBhbnkgb2YgdGhlIHVuc3VwcG9ydGVkIHBhcmFtZXRlcnMKKwkgKi8KKwlpZiAoa2V5IHx8CisJICAgIChoZnVuYyAhPSBFVEhfUlNTX0hBU0hfTk9fQ0hBTkdFICYmIGhmdW5jICE9IEVUSF9SU1NfSEFTSF9UT1ApKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKCFwKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwaS0+cnNzX3NpemU7IGkrKykKKwkJcGktPnJzc1tpXSA9IHBbaV07CisJaWYgKHBpLT5hZGFwdGVyLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQorCQlyZXR1cm4gY3hnYjRfd3JpdGVfcnNzKHBpLCBwaS0+cnNzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfcnhuZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmluZm8sCisJCSAgICAgdTMyICpydWxlcykKK3sKKwljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CisKKwlzd2l0Y2ggKGluZm8tPmNtZCkgeworCWNhc2UgRVRIVE9PTF9HUlhGSDogeworCQl1bnNpZ25lZCBpbnQgdiA9IHBpLT5yc3NfbW9kZTsKKworCQlpbmZvLT5kYXRhID0gMDsKKwkJc3dpdGNoIChpbmZvLT5mbG93X3R5cGUpIHsKKwkJY2FzZSBUQ1BfVjRfRkxPVzoKKwkJCWlmICh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA0Rk9VUlRVUEVOX0YpCisJCQkJaW5mby0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUIHwKKwkJCQkJICAgICBSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzM7CisJCQllbHNlIGlmICh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA0VFdPVFVQRU5fRikKKwkJCQlpbmZvLT5kYXRhID0gUlhIX0lQX1NSQyB8IFJYSF9JUF9EU1Q7CisJCQlicmVhazsKKwkJY2FzZSBVRFBfVjRfRkxPVzoKKwkJCWlmICgodiAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNEZPVVJUVVBFTl9GKSAmJgorCQkJICAgICh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfVURQRU5fRikpCisJCQkJaW5mby0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUIHwKKwkJCQkJICAgICBSWEhfTDRfQl8wXzEgfCBSWEhfTDRfQl8yXzM7CisJCQllbHNlIGlmICh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA0VFdPVFVQRU5fRikKKwkJCQlpbmZvLT5kYXRhID0gUlhIX0lQX1NSQyB8IFJYSF9JUF9EU1Q7CisJCQlicmVhazsKKwkJY2FzZSBTQ1RQX1Y0X0ZMT1c6CisJCWNhc2UgQUhfRVNQX1Y0X0ZMT1c6CisJCWNhc2UgSVBWNF9GTE9XOgorCQkJaWYgKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9JUDRUV09UVVBFTl9GKQorCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVDsKKwkJCWJyZWFrOworCQljYXNlIFRDUF9WNl9GTE9XOgorCQkJaWYgKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9JUDZGT1VSVFVQRU5fRikKKwkJCQlpbmZvLT5kYXRhID0gUlhIX0lQX1NSQyB8IFJYSF9JUF9EU1QgfAorCQkJCQkgICAgIFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMzsKKwkJCWVsc2UgaWYgKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9JUDZUV09UVVBFTl9GKQorCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVDsKKwkJCWJyZWFrOworCQljYXNlIFVEUF9WNl9GTE9XOgorCQkJaWYgKCh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA2Rk9VUlRVUEVOX0YpICYmCisJCQkgICAgKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9VRFBFTl9GKSkKKwkJCQlpbmZvLT5kYXRhID0gUlhIX0lQX1NSQyB8IFJYSF9JUF9EU1QgfAorCQkJCQkgICAgIFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMzsKKwkJCWVsc2UgaWYgKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9JUDZUV09UVVBFTl9GKQorCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVDsKKwkJCWJyZWFrOworCQljYXNlIFNDVFBfVjZfRkxPVzoKKwkJY2FzZSBBSF9FU1BfVjZfRkxPVzoKKwkJY2FzZSBJUFY2X0ZMT1c6CisJCQlpZiAodiAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNlRXT1RVUEVOX0YpCisJCQkJaW5mby0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgRVRIVE9PTF9HUlhSSU5HUzoKKwkJaW5mby0+ZGF0YSA9IHBpLT5ucXNldHM7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVPUE5PVFNVUFA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgY3hnYl9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzICAgICAgPSBnZXRfc2V0dGluZ3MsCisJLnNldF9zZXR0aW5ncyAgICAgID0gc2V0X3NldHRpbmdzLAorCS5nZXRfZHJ2aW5mbyAgICAgICA9IGdldF9kcnZpbmZvLAorCS5nZXRfbXNnbGV2ZWwgICAgICA9IGdldF9tc2dsZXZlbCwKKwkuc2V0X21zZ2xldmVsICAgICAgPSBzZXRfbXNnbGV2ZWwsCisJLmdldF9yaW5ncGFyYW0gICAgID0gZ2V0X3NnZV9wYXJhbSwKKwkuc2V0X3JpbmdwYXJhbSAgICAgPSBzZXRfc2dlX3BhcmFtLAorCS5nZXRfY29hbGVzY2UgICAgICA9IGdldF9jb2FsZXNjZSwKKwkuc2V0X2NvYWxlc2NlICAgICAgPSBzZXRfY29hbGVzY2UsCisJLmdldF9lZXByb21fbGVuICAgID0gZ2V0X2VlcHJvbV9sZW4sCisJLmdldF9lZXByb20gICAgICAgID0gZ2V0X2VlcHJvbSwKKwkuc2V0X2VlcHJvbSAgICAgICAgPSBzZXRfZWVwcm9tLAorCS5nZXRfcGF1c2VwYXJhbSAgICA9IGdldF9wYXVzZXBhcmFtLAorCS5zZXRfcGF1c2VwYXJhbSAgICA9IHNldF9wYXVzZXBhcmFtLAorCS5nZXRfbGluayAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9zdHJpbmdzICAgICAgID0gZ2V0X3N0cmluZ3MsCisJLnNldF9waHlzX2lkICAgICAgID0gaWRlbnRpZnlfcG9ydCwKKwkubndheV9yZXNldCAgICAgICAgPSByZXN0YXJ0X2F1dG9uZWcsCisJLmdldF9zc2V0X2NvdW50ICAgID0gZ2V0X3NzZXRfY291bnQsCisJLmdldF9ldGh0b29sX3N0YXRzID0gZ2V0X3N0YXRzLAorCS5nZXRfcmVnc19sZW4gICAgICA9IGdldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MgICAgICAgICAgPSBnZXRfcmVncywKKwkuZ2V0X3dvbCAgICAgICAgICAgPSBnZXRfd29sLAorCS5zZXRfd29sICAgICAgICAgICA9IHNldF93b2wsCisJLmdldF9yeG5mYyAgICAgICAgID0gZ2V0X3J4bmZjLAorCS5nZXRfcnhmaF9pbmRpcl9zaXplID0gZ2V0X3Jzc190YWJsZV9zaXplLAorCS5nZXRfcnhmaAkgICA9IGdldF9yc3NfdGFibGUsCisJLnNldF9yeGZoCSAgID0gc2V0X3Jzc190YWJsZSwKKwkuZmxhc2hfZGV2aWNlICAgICAgPSBzZXRfZmxhc2gsCit9OworCit2b2lkIGN4Z2I0X3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmY3hnYl9ldGh0b29sX29wczsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZmNvZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9mY29lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4YTYyZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZmNvZS5jCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIENoZWxzaW8gVDQgRXRoZXJuZXQgZHJpdmVyIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgQ2hlbHNpbyBDb21tdW5pY2F0aW9ucywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCisgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgYXZhaWxhYmxlIGZyb20gdGhlIGZpbGUKKyAqIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUsIG9yIHRoZQorICogT3BlbklCLm9yZyBCU0QgbGljZW5zZSBiZWxvdzoKKyAqCisgKiAgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogICAgIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lci4KKyAqCisgKiAgICAgIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAgICAgICAgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICogRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorICogTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUworICogQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2lmZGVmIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UKKworI2luY2x1ZGUgPHNjc2kvZmMvZmNfZnMuaD4KKyNpbmNsdWRlIDxzY3NpL2xpYmZjb2UuaD4KKyNpbmNsdWRlICJjeGdiNC5oIgorCitib29sIGN4Z2JfZmNvZV9zb2ZfZW9mX3N1cHBvcnRlZChzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgZmNvZV9oZHIgKmZjb2VoID0gKHN0cnVjdCBmY29lX2hkciAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCXU4IHNvZiA9IGZjb2VoLT5mY29lX3NvZjsKKwl1OCBlb2YgPSAwOworCisJaWYgKChzb2YgIT0gRkNfU09GX0kzKSAmJiAoc29mICE9IEZDX1NPRl9OMykpIHsKKwkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwgIlVuc3VwcG9ydGVkIFNPRiAweCV4XG4iLCBzb2YpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJc2tiX2NvcHlfYml0cyhza2IsIHNrYi0+bGVuIC0gNCwgJmVvZiwgMSk7CisKKwlpZiAoKGVvZiAhPSBGQ19FT0ZfTikgJiYgKGVvZiAhPSBGQ19FT0ZfVCkpIHsKKwkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwgIlVuc3VwcG9ydGVkIEVPRiAweCV4XG4iLCBlb2YpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogY3hnYl9mY29lX2VuYWJsZSAtIGVuYWJsZSBGQ29FIG9mZmxvYWQgZmVhdHVyZXMKKyAqIEBuZXRkZXY6IG5ldCBkZXZpY2UKKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtRUlOVkFMIG9uIGZhaWx1cmUuCisgKi8KK2ludCBjeGdiX2Zjb2VfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7CisJc3RydWN0IGN4Z2JfZmNvZSAqZmNvZSA9ICZwaS0+ZmNvZTsKKworCWlmIChpc190NChhZGFwLT5wYXJhbXMuY2hpcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkpCisJCXJldHVybiAtRUlOVkFMOworCisJZGV2X2luZm8oYWRhcC0+cGRldl9kZXYsICJFbmFibGluZyBGQ29FIG9mZmxvYWQgZmVhdHVyZXNcbiIpOworCisJbmV0ZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0ZDT0VfQ1JDOworCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX0ZDT0VfQ1JDOworCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9GQ09FX01UVTsKKwluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9GQ09FX01UVTsKKworCW5ldGRldl9mZWF0dXJlc19jaGFuZ2UobmV0ZGV2KTsKKworCWZjb2UtPmZsYWdzIHw9IENYR0JfRkNPRV9FTkFCTEVEOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY3hnYl9mY29lX2Rpc2FibGUgLSBkaXNhYmxlIEZDb0Ugb2ZmbG9hZAorICogQG5ldGRldjogbmV0IGRldmljZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZmFpbHVyZS4KKyAqLworaW50IGN4Z2JfZmNvZV9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7CisJc3RydWN0IGN4Z2JfZmNvZSAqZmNvZSA9ICZwaS0+ZmNvZTsKKworCWlmICghKGZjb2UtPmZsYWdzICYgQ1hHQl9GQ09FX0VOQUJMRUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9pbmZvKGFkYXAtPnBkZXZfZGV2LCAiRGlzYWJsaW5nIEZDb0Ugb2ZmbG9hZCBmZWF0dXJlc1xuIik7CisKKwlmY29lLT5mbGFncyAmPSB+Q1hHQl9GQ09FX0VOQUJMRUQ7CisKKwluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0ZDT0VfQ1JDOworCW5ldGRldi0+dmxhbl9mZWF0dXJlcyAmPSB+TkVUSUZfRl9GQ09FX0NSQzsKKwluZXRkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0ZDT0VfTVRVOworCW5ldGRldi0+dmxhbl9mZWF0dXJlcyAmPSB+TkVUSUZfRl9GQ09FX01UVTsKKworCW5ldGRldl9mZWF0dXJlc19jaGFuZ2UobmV0ZGV2KTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZmNvZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9mY29lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5MjU4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfZmNvZS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgQ2hlbHNpbyBUNCBFdGhlcm5ldCBkcml2ZXIgZm9yIExpbnV4LgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBDaGVsc2lvIENvbW11bmljYXRpb25zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fQ1hHQjRfRkNPRV9IX18KKyNkZWZpbmUgX19DWEdCNF9GQ09FX0hfXworCisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDRfRkNPRQorCisjZGVmaW5lIENYR0JfRkNPRV9UWFBLVF9DU1VNX1NUQVJUCTI4CisjZGVmaW5lIENYR0JfRkNPRV9UWFBLVF9DU1VNX0VORAk4CisKKy8qIGZjb2UgZmxhZ3MgKi8KK2VudW0geworCUNYR0JfRkNPRV9FTkFCTEVEICAgICA9ICgxIDw8IDApLAorfTsKKworc3RydWN0IGN4Z2JfZmNvZSB7CisJdTgJZmxhZ3M7Cit9OworCitpbnQgY3hnYl9mY29lX2VuYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK2ludCBjeGdiX2Zjb2VfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK2Jvb2wgY3hnYl9mY29lX3NvZl9lb2Zfc3VwcG9ydGVkKHN0cnVjdCBhZGFwdGVyICosIHN0cnVjdCBza19idWZmICopOworCisjZW5kaWYgLyogQ09ORklHX0NIRUxTSU9fVDRfRkNPRSAqLworI2VuZGlmIC8qIF9fQ1hHQjRfRkNPRV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9tYWluLmMKaW5kZXggYTIyY2Y5My4uNmRlMDU0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9jeGdiNF9tYWluLmMKQEAgLTc2LDIzICs3NiwxNSBAQAogI2luY2x1ZGUgImNsaXBfdGJsLmgiCiAjaW5jbHVkZSAibDJ0LmgiCiAKK2NoYXIgY3hnYjRfZHJpdmVyX25hbWVbXSA9IEtCVUlMRF9NT0ROQU1FOworCiAjaWZkZWYgRFJWX1ZFUlNJT04KICN1bmRlZiBEUlZfVkVSU0lPTgogI2VuZGlmCiAjZGVmaW5lIERSVl9WRVJTSU9OICIyLjAuMC1rbyIKK2NvbnN0IGNoYXIgY3hnYjRfZHJpdmVyX3ZlcnNpb25bXSA9IERSVl9WRVJTSU9OOwogI2RlZmluZSBEUlZfREVTQyAiQ2hlbHNpbyBUNC9UNSBOZXR3b3JrIERyaXZlciIKIAotZW51bSB7Ci0JTUFYX1RYUV9FTlRSSUVTICAgICAgPSAxNjM4NCwKLQlNQVhfQ1RSTF9UWFFfRU5UUklFUyA9IDEwMjQsCi0JTUFYX1JTUFFfRU5UUklFUyAgICAgPSAxNjM4NCwKLQlNQVhfUlhfQlVGRkVSUyAgICAgICA9IDE2Mzg0LAotCU1JTl9UWFFfRU5UUklFUyAgICAgID0gMzIsCi0JTUlOX0NUUkxfVFhRX0VOVFJJRVMgPSAzMiwKLQlNSU5fUlNQUV9FTlRSSUVTICAgICA9IDEyOCwKLQlNSU5fRkxfRU5UUklFUyAgICAgICA9IDE2Ci19OwotCiAvKiBIb3N0IHNoYWRvdyBjb3B5IG9mIGluZ3Jlc3MgZmlsdGVyIGVudHJ5LiAgVGhpcyBpcyBpbiBob3N0IG5hdGl2ZSBmb3JtYXQKICAqIGFuZCBkb2Vzbid0IG1hdGNoIHRoZSBvcmRlcmluZyBvciBiaXQgb3JkZXIsIGV0Yy4gb2YgdGhlIGhhcmR3YXJlIG9mIHRoZQogICogZmlybXdhcmUgY29tbWFuZC4gIFRoZSB1c2Ugb2YgYml0LWZpZWxkIHN0cnVjdHVyZSBlbGVtZW50cyBpcyBwdXJlbHkgdG8KQEAgLTEyNCw3ICsxMTYsNyBAQAogLyogTWFjcm9zIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBQQ0kgRGV2aWNlIElEIFRhYmxlIC4uLgogICovCiAjZGVmaW5lIENIX1BDSV9ERVZJQ0VfSURfVEFCTEVfREVGSU5FX0JFR0lOIFwKLQlzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3hnYjRfcGNpX3RibFtdID0geworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeGdiNF9wY2lfdGJsW10gPSB7CiAjZGVmaW5lIENIX1BDSV9ERVZJQ0VfSURfRlVOQ1RJT04gMHg0CiAKIC8qIEluY2x1ZGUgUENJIERldmljZSBJRHMgZm9yIGJvdGggUEY0IGFuZCBQRjAtMyBzbyBvdXIgUENJIHByb2JlKCkgcm91dGluZSBpcwpAQCAtNzMyLDcgKzcyNCw4IEBACiAJCWFkYXAtPnN3aW50ciA9IDE7CiAJCXQ0X3dyaXRlX3JlZyhhZGFwLCBNWVBGX1JFRyhQTF9QRl9JTlRfQ0FVU0VfQSksIHYpOwogCX0KLQl0NF9zbG93X2ludHJfaGFuZGxlcihhZGFwKTsKKwlpZiAoYWRhcC0+ZmxhZ3MgJiBNQVNURVJfUEYpCisJCXQ0X3Nsb3dfaW50cl9oYW5kbGVyKGFkYXApOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtODU3LDE0ICs4NTAsMTQgQEAKIH0KIAogLyoqCi0gKgl3cml0ZV9yc3MgLSB3cml0ZSB0aGUgUlNTIHRhYmxlIGZvciBhIGdpdmVuIHBvcnQKKyAqCWN4Z2I0X3dyaXRlX3JzcyAtIHdyaXRlIHRoZSBSU1MgdGFibGUgZm9yIGEgZ2l2ZW4gcG9ydAogICoJQHBpOiB0aGUgcG9ydAogICoJQHF1ZXVlczogYXJyYXkgb2YgcXVldWUgaW5kaWNlcyBmb3IgUlNTCiAgKgogICoJU2V0cyB1cCB0aGUgcG9ydGlvbiBvZiB0aGUgSFcgUlNTIHRhYmxlIGZvciB0aGUgcG9ydCdzIFZJIHRvIGRpc3RyaWJ1dGUKICAqCXBhY2tldHMgdG8gdGhlIFJ4IHF1ZXVlcyBpbiBAcXVldWVzLgogICovCi1zdGF0aWMgaW50IHdyaXRlX3Jzcyhjb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSwgY29uc3QgdTE2ICpxdWV1ZXMpCitpbnQgY3hnYjRfd3JpdGVfcnNzKGNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpLCBjb25zdCB1MTYgKnF1ZXVlcykKIHsKIAl1MTYgKnJzczsKIAlpbnQgaSwgZXJyOwpAQCAtODk3LDcgKzg5MCw3IEBACiAJZm9yX2VhY2hfcG9ydChhZGFwLCBpKSB7CiAJCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gYWRhcDJwaW5mbyhhZGFwLCBpKTsKIAotCQllcnIgPSB3cml0ZV9yc3MocGksIHBpLT5yc3MpOworCQllcnIgPSBjeGdiNF93cml0ZV9yc3MocGksIHBpLT5yc3MpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CkBAIC05MjAsNyArOTEzLDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkYXAtPnNnZS5pbmdyX21hcCk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBhZGFwLT5zZ2UuaW5ncl9zejsgaSsrKSB7CiAJCXN0cnVjdCBzZ2VfcnNwcSAqcSA9IGFkYXAtPnNnZS5pbmdyX21hcFtpXTsKIAogCQlpZiAocSAmJiBxLT5oYW5kbGVyKSB7CkBAIC05MzQsNiArOTI3LDIxIEBACiAJfQogfQogCisvKiBEaXNhYmxlIGludGVycnVwdCBhbmQgbmFwaSBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBkaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IGFkYXB0ZXIgKmFkYXApCit7CisJaWYgKGFkYXAtPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpIHsKKwkJdDRfaW50cl9kaXNhYmxlKGFkYXApOworCQlpZiAoYWRhcC0+ZmxhZ3MgJiBVU0lOR19NU0lYKSB7CisJCQlmcmVlX21zaXhfcXVldWVfaXJxcyhhZGFwKTsKKwkJCWZyZWVfaXJxKGFkYXAtPm1zaXhfaW5mb1swXS52ZWMsIGFkYXApOworCQl9IGVsc2UgeworCQkJZnJlZV9pcnEoYWRhcC0+cGRldi0+aXJxLCBhZGFwKTsKKwkJfQorCQlxdWllc2NlX3J4KGFkYXApOworCX0KK30KKwogLyoKICAqIEVuYWJsZSBOQVBJIHNjaGVkdWxpbmcgYW5kIGludGVycnVwdCBnZW5lcmF0aW9uIGZvciBhbGwgUnggcXVldWVzLgogICovCkBAIC05NDEsNyArOTQ5LDcgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFkYXAtPnNnZS5pbmdyX21hcCk7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBhZGFwLT5zZ2UuaW5ncl9zejsgaSsrKSB7CiAJCXN0cnVjdCBzZ2VfcnNwcSAqcSA9IGFkYXAtPnNnZS5pbmdyX21hcFtpXTsKIAogCQlpZiAoIXEpCkBAIC05NTcsNiArOTY1LDI4IEBACiAJfQogfQogCitzdGF0aWMgaW50IGFsbG9jX29mbGRfcnhxcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCwgc3RydWN0IHNnZV9vZmxkX3J4cSAqcSwKKwkJCSAgIHVuc2lnbmVkIGludCBucSwgdW5zaWduZWQgaW50IHBlcl9jaGFuLCBpbnQgbXNpX2lkeCwKKwkJCSAgIHUxNiAqaWRzKQoreworCWludCBpLCBlcnI7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnE7IGkrKywgcSsrKSB7CisJCWlmIChtc2lfaWR4ID4gMCkKKwkJCW1zaV9pZHgrKzsKKwkJZXJyID0gdDRfc2dlX2FsbG9jX3J4cShhZGFwLCAmcS0+cnNwcSwgZmFsc2UsCisJCQkJICAgICAgIGFkYXAtPnBvcnRbaSAvIHBlcl9jaGFuXSwKKwkJCQkgICAgICAgbXNpX2lkeCwgcS0+Zmwuc2l6ZSA/ICZxLT5mbCA6IE5VTEwsCisJCQkJICAgICAgIHVsZHJ4X2hhbmRsZXIpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJbWVtc2V0KCZxLT5zdGF0cywgMCwgc2l6ZW9mKHEtPnN0YXRzKSk7CisJCWlmIChpZHMpCisJCQlpZHNbaV0gPSBxLT5yc3BxLmFic19pZDsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICoJc2V0dXBfc2dlX3F1ZXVlcyAtIGNvbmZpZ3VyZSBTR0UgVHgvUngvcmVzcG9uc2UgcXVldWVzCiAgKglAYWRhcDogdGhlIGFkYXB0ZXIKQEAgLTk3MCw4ICsxMDAwLDggQEAKIAlpbnQgZXJyLCBtc2lfaWR4LCBpLCBqOwogCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOwogCi0JYml0bWFwX3plcm8ocy0+c3RhcnZpbmdfZmwsIE1BWF9FR1JRKTsKLQliaXRtYXBfemVybyhzLT50eHFfbWFwZXJyLCBNQVhfRUdSUSk7CisJYml0bWFwX3plcm8ocy0+c3RhcnZpbmdfZmwsIHMtPmVncl9zeik7CisJYml0bWFwX3plcm8ocy0+dHhxX21hcGVyciwgcy0+ZWdyX3N6KTsKIAogCWlmIChhZGFwLT5mbGFncyAmIFVTSU5HX01TSVgpCiAJCW1zaV9pZHggPSAxOyAgICAgICAgIC8qIHZlY3RvciAwIGlzIGZvciBub24tcXVldWUgaW50ZXJydXB0cyAqLwpAQCAtOTgzLDYgKzEwMTMsMTkgQEAKIAkJbXNpX2lkeCA9IC0oKGludClzLT5pbnRycS5hYnNfaWQgKyAxKTsKIAl9CiAKKwkvKiBOT1RFOiBJZiB5b3UgYWRkL2RlbGV0ZSBhbnkgSW5ncmVzcy9FZ3Jlc3MgUXVldWUgYWxsb2NhdGlvbnMgaW4gaGVyZSwKKwkgKiBkb24ndCBmb3JnZXQgdG8gdXBkYXRlIHRoZSBmb2xsb3dpbmcgd2hpY2ggbmVlZCB0byBiZQorCSAqIHN5bmNocm9uaXplZCB0byBhbmQgY2hhbmdlcyBoZXJlLgorCSAqCisJICogMS4gVGhlIGNhbGN1bGF0aW9ucyBvZiBNQVhfSU5HUSBpbiBjeGdiNC5oLgorCSAqCisJICogMi4gVXBkYXRlIGVuYWJsZV9tc2l4L25hbWVfbXNpeF92ZWNzL3JlcXVlc3RfbXNpeF9xdWV1ZV9pcnFzCisJICogICAgdG8gYWNjb21tb2RhdGUgYW55IG5ldy9kZWxldGVkIEluZ3Jlc3MgUXVldWVzCisJICogICAgd2hpY2ggbmVlZCBNU0ktWCBWZWN0b3JzLgorCSAqCisJICogMy4gVXBkYXRlIHNnZV9xaW5mb19zaG93KCkgdG8gaW5jbHVkZSBpbmZvcm1hdGlvbiBvbiB0aGUKKwkgKiAgICBuZXcvZGVsZXRlZCBxdWV1ZXMuCisJICovCiAJZXJyID0gdDRfc2dlX2FsbG9jX3J4cShhZGFwLCAmcy0+ZndfZXZ0cSwgdHJ1ZSwgYWRhcC0+cG9ydFswXSwKIAkJCSAgICAgICBtc2lfaWR4LCBOVUxMLCBmd2V2dHFfaGFuZGxlcik7CiAJaWYgKGVycikgewpAQCAtMTAxOCw1MSArMTA2MSwyNyBAQAogCiAJaiA9IHMtPm9mbGRxc2V0cyAvIGFkYXAtPnBhcmFtcy5ucG9ydHM7IC8qIG9mbGQgcXVldWVzIHBlciBjaGFubmVsICovCiAJZm9yX2VhY2hfb2ZsZHJ4cShzLCBpKSB7Ci0JCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnEgPSAmcy0+b2ZsZHJ4cVtpXTsKLQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFkYXAtPnBvcnRbaSAvIGpdOwotCi0JCWlmIChtc2lfaWR4ID4gMCkKLQkJCW1zaV9pZHgrKzsKLQkJZXJyID0gdDRfc2dlX2FsbG9jX3J4cShhZGFwLCAmcS0+cnNwcSwgZmFsc2UsIGRldiwgbXNpX2lkeCwKLQkJCQkgICAgICAgcS0+Zmwuc2l6ZSA/ICZxLT5mbCA6IE5VTEwsCi0JCQkJICAgICAgIHVsZHJ4X2hhbmRsZXIpOwotCQlpZiAoZXJyKQotCQkJZ290byBmcmVlb3V0OwotCQltZW1zZXQoJnEtPnN0YXRzLCAwLCBzaXplb2YocS0+c3RhdHMpKTsKLQkJcy0+b2ZsZF9yeHFbaV0gPSBxLT5yc3BxLmFic19pZDsKLQkJZXJyID0gdDRfc2dlX2FsbG9jX29mbGRfdHhxKGFkYXAsICZzLT5vZmxkdHhxW2ldLCBkZXYsCisJCWVyciA9IHQ0X3NnZV9hbGxvY19vZmxkX3R4cShhZGFwLCAmcy0+b2ZsZHR4cVtpXSwKKwkJCQkJICAgIGFkYXAtPnBvcnRbaSAvIGpdLAogCQkJCQkgICAgcy0+ZndfZXZ0cS5jbnR4dF9pZCk7CiAJCWlmIChlcnIpCiAJCQlnb3RvIGZyZWVvdXQ7CiAJfQogCi0JZm9yX2VhY2hfcmRtYXJ4cShzLCBpKSB7Ci0JCXN0cnVjdCBzZ2Vfb2ZsZF9yeHEgKnEgPSAmcy0+cmRtYXJ4cVtpXTsKKyNkZWZpbmUgQUxMT0NfT0ZMRF9SWFFTKGZpcnN0cSwgbnEsIHBlcl9jaGFuLCBpZHMpIGRvIHsgXAorCWVyciA9IGFsbG9jX29mbGRfcnhxcyhhZGFwLCBmaXJzdHEsIG5xLCBwZXJfY2hhbiwgbXNpX2lkeCwgaWRzKTsgXAorCWlmIChlcnIpIFwKKwkJZ290byBmcmVlb3V0OyBcCisJaWYgKG1zaV9pZHggPiAwKSBcCisJCW1zaV9pZHggKz0gbnE7IFwKK30gd2hpbGUgKDApCiAKLQkJaWYgKG1zaV9pZHggPiAwKQotCQkJbXNpX2lkeCsrOwotCQllcnIgPSB0NF9zZ2VfYWxsb2NfcnhxKGFkYXAsICZxLT5yc3BxLCBmYWxzZSwgYWRhcC0+cG9ydFtpXSwKLQkJCQkgICAgICAgbXNpX2lkeCwgcS0+Zmwuc2l6ZSA/ICZxLT5mbCA6IE5VTEwsCi0JCQkJICAgICAgIHVsZHJ4X2hhbmRsZXIpOwotCQlpZiAoZXJyKQotCQkJZ290byBmcmVlb3V0OwotCQltZW1zZXQoJnEtPnN0YXRzLCAwLCBzaXplb2YocS0+c3RhdHMpKTsKLQkJcy0+cmRtYV9yeHFbaV0gPSBxLT5yc3BxLmFic19pZDsKLQl9CisJQUxMT0NfT0ZMRF9SWFFTKHMtPm9mbGRyeHEsIHMtPm9mbGRxc2V0cywgaiwgcy0+b2ZsZF9yeHEpOworCUFMTE9DX09GTERfUlhRUyhzLT5yZG1hcnhxLCBzLT5yZG1hcXMsIDEsIHMtPnJkbWFfcnhxKTsKKwlqID0gcy0+cmRtYWNpcXMgLyBhZGFwLT5wYXJhbXMubnBvcnRzOyAvKiByZG1hcSBxdWV1ZXMgcGVyIGNoYW5uZWwgKi8KKwlBTExPQ19PRkxEX1JYUVMocy0+cmRtYWNpcSwgcy0+cmRtYWNpcXMsIGosIHMtPnJkbWFfY2lxKTsKIAotCWZvcl9lYWNoX3JkbWFjaXEocywgaSkgewotCQlzdHJ1Y3Qgc2dlX29mbGRfcnhxICpxID0gJnMtPnJkbWFjaXFbaV07Ci0KLQkJaWYgKG1zaV9pZHggPiAwKQotCQkJbXNpX2lkeCsrOwotCQllcnIgPSB0NF9zZ2VfYWxsb2NfcnhxKGFkYXAsICZxLT5yc3BxLCBmYWxzZSwgYWRhcC0+cG9ydFtpXSwKLQkJCQkgICAgICAgbXNpX2lkeCwgcS0+Zmwuc2l6ZSA/ICZxLT5mbCA6IE5VTEwsCi0JCQkJICAgICAgIHVsZHJ4X2hhbmRsZXIpOwotCQlpZiAoZXJyKQotCQkJZ290byBmcmVlb3V0OwotCQltZW1zZXQoJnEtPnN0YXRzLCAwLCBzaXplb2YocS0+c3RhdHMpKTsKLQkJcy0+cmRtYV9jaXFbaV0gPSBxLT5yc3BxLmFic19pZDsKLQl9CisjdW5kZWYgQUxMT0NfT0ZMRF9SWFFTCiAKIAlmb3JfZWFjaF9wb3J0KGFkYXAsIGkpIHsKIAkJLyoKQEAgLTEyNzMsNiArMTI5MiwxMCBAQAogCQkJdHhxID0gMDsKIAkJfSBlbHNlIHsKIAkJCXR4cSA9ICh2bGFuX3RjaSAmIFZMQU5fUFJJT19NQVNLKSA+PiBWTEFOX1BSSU9fU0hJRlQ7CisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDRfRkNPRQorCQkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfRkNPRSkpCisJCQkJdHhxID0gc2tiLT5wcmlvcml0eSAmIDB4NzsKKyNlbmRpZiAvKiBDT05GSUdfQ0hFTFNJT19UNF9GQ09FICovCiAJCX0KIAkJcmV0dXJuIHR4cTsKIAl9CkBAIC0xMjk3LDExOTIgKzEzMjAsNiBAQAogCXJldHVybiBhZGFwLT5wYXJhbXMub2ZmbG9hZDsKIH0KIAotLyoKLSAqIEltcGxlbWVudGF0aW9uIG9mIGV0aHRvb2wgb3BlcmF0aW9ucy4KLSAqLwotCi1zdGF0aWMgdTMyIGdldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiBuZXRkZXYyYWRhcChkZXYpLT5tc2dfZW5hYmxlOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbCkKLXsKLQluZXRkZXYyYWRhcChkZXYpLT5tc2dfZW5hYmxlID0gdmFsOwotfQotCi1zdGF0aWMgY2hhciBzdGF0c19zdHJpbmdzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKLQkiVHhPY3RldHNPSyAgICAgICAgICIsCi0JIlR4RnJhbWVzT0sgICAgICAgICAiLAotCSJUeEJyb2FkY2FzdEZyYW1lcyAgIiwKLQkiVHhNdWx0aWNhc3RGcmFtZXMgICIsCi0JIlR4VW5pY2FzdEZyYW1lcyAgICAiLAotCSJUeEVycm9yRnJhbWVzICAgICAgIiwKLQotCSJUeEZyYW1lczY0ICAgICAgICAgIiwKLQkiVHhGcmFtZXM2NVRvMTI3ICAgICIsCi0JIlR4RnJhbWVzMTI4VG8yNTUgICAiLAotCSJUeEZyYW1lczI1NlRvNTExICAgIiwKLQkiVHhGcmFtZXM1MTJUbzEwMjMgICIsCi0JIlR4RnJhbWVzMTAyNFRvMTUxOCAiLAotCSJUeEZyYW1lczE1MTlUb01heCAgIiwKLQotCSJUeEZyYW1lc0Ryb3BwZWQgICAgIiwKLQkiVHhQYXVzZUZyYW1lcyAgICAgICIsCi0JIlR4UFBQMEZyYW1lcyAgICAgICAiLAotCSJUeFBQUDFGcmFtZXMgICAgICAgIiwKLQkiVHhQUFAyRnJhbWVzICAgICAgICIsCi0JIlR4UFBQM0ZyYW1lcyAgICAgICAiLAotCSJUeFBQUDRGcmFtZXMgICAgICAgIiwKLQkiVHhQUFA1RnJhbWVzICAgICAgICIsCi0JIlR4UFBQNkZyYW1lcyAgICAgICAiLAotCSJUeFBQUDdGcmFtZXMgICAgICAgIiwKLQotCSJSeE9jdGV0c09LICAgICAgICAgIiwKLQkiUnhGcmFtZXNPSyAgICAgICAgICIsCi0JIlJ4QnJvYWRjYXN0RnJhbWVzICAiLAotCSJSeE11bHRpY2FzdEZyYW1lcyAgIiwKLQkiUnhVbmljYXN0RnJhbWVzICAgICIsCi0KLQkiUnhGcmFtZXNUb29Mb25nICAgICIsCi0JIlJ4SmFiYmVyRXJyb3JzICAgICAiLAotCSJSeEZDU0Vycm9ycyAgICAgICAgIiwKLQkiUnhMZW5ndGhFcnJvcnMgICAgICIsCi0JIlJ4U3ltYm9sRXJyb3JzICAgICAiLAotCSJSeFJ1bnRGcmFtZXMgICAgICAgIiwKLQotCSJSeEZyYW1lczY0ICAgICAgICAgIiwKLQkiUnhGcmFtZXM2NVRvMTI3ICAgICIsCi0JIlJ4RnJhbWVzMTI4VG8yNTUgICAiLAotCSJSeEZyYW1lczI1NlRvNTExICAgIiwKLQkiUnhGcmFtZXM1MTJUbzEwMjMgICIsCi0JIlJ4RnJhbWVzMTAyNFRvMTUxOCAiLAotCSJSeEZyYW1lczE1MTlUb01heCAgIiwKLQotCSJSeFBhdXNlRnJhbWVzICAgICAgIiwKLQkiUnhQUFAwRnJhbWVzICAgICAgICIsCi0JIlJ4UFBQMUZyYW1lcyAgICAgICAiLAotCSJSeFBQUDJGcmFtZXMgICAgICAgIiwKLQkiUnhQUFAzRnJhbWVzICAgICAgICIsCi0JIlJ4UFBQNEZyYW1lcyAgICAgICAiLAotCSJSeFBQUDVGcmFtZXMgICAgICAgIiwKLQkiUnhQUFA2RnJhbWVzICAgICAgICIsCi0JIlJ4UFBQN0ZyYW1lcyAgICAgICAiLAotCi0JIlJ4QkcwRnJhbWVzRHJvcHBlZCAiLAotCSJSeEJHMUZyYW1lc0Ryb3BwZWQgIiwKLQkiUnhCRzJGcmFtZXNEcm9wcGVkICIsCi0JIlJ4QkczRnJhbWVzRHJvcHBlZCAiLAotCSJSeEJHMEZyYW1lc1RydW5jICAgIiwKLQkiUnhCRzFGcmFtZXNUcnVuYyAgICIsCi0JIlJ4QkcyRnJhbWVzVHJ1bmMgICAiLAotCSJSeEJHM0ZyYW1lc1RydW5jICAgIiwKLQotCSJUU08gICAgICAgICAgICAgICAgIiwKLQkiVHhDc3VtT2ZmbG9hZCAgICAgICIsCi0JIlJ4Q3N1bUdvb2QgICAgICAgICAiLAotCSJWTEFOZXh0cmFjdGlvbnMgICAgIiwKLQkiVkxBTmluc2VydGlvbnMgICAgICIsCi0JIkdST3BhY2tldHMgICAgICAgICAiLAotCSJHUk9tZXJnZWQgICAgICAgICAgIiwKLQkiV3JpdGVDb2FsU3VjY2VzcyAgICIsCi0JIldyaXRlQ29hbEZhaWwgICAgICAiLAotfTsKLQotc3RhdGljIGludCBnZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldCkKLXsKLQlzd2l0Y2ggKHNzZXQpIHsKLQljYXNlIEVUSF9TU19TVEFUUzoKLQkJcmV0dXJuIEFSUkFZX1NJWkUoc3RhdHNfc3RyaW5ncyk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KLX0KLQotI2RlZmluZSBUNF9SRUdNQVBfU0laRSAoMTYwICogMTAyNCkKLSNkZWZpbmUgVDVfUkVHTUFQX1NJWkUgKDMzMiAqIDEwMjQpCi0KLXN0YXRpYyBpbnQgZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBuZXRkZXYyYWRhcChkZXYpOwotCWlmIChpc190NChhZGFwLT5wYXJhbXMuY2hpcCkpCi0JCXJldHVybiBUNF9SRUdNQVBfU0laRTsKLQllbHNlCi0JCXJldHVybiBUNV9SRUdNQVBfU0laRTsKLX0KLQotc3RhdGljIGludCBnZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiBFRVBST01TSVpFOwotfQotCi1zdGF0aWMgdm9pZCBnZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQotewotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKLQl1MzIgZXhwcm9tX3ZlcnM7Ci0KLQlzdHJsY3B5KGluZm8tPmRyaXZlciwgS0JVSUxEX01PRE5BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKLQlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwotCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAotCQlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKLQotCWlmIChhZGFwdGVyLT5wYXJhbXMuZndfdmVycykKLQkJc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pLAotCQkJIiV1LiV1LiV1LiV1LCBUUCAldS4ldS4ldS4ldSIsCi0JCQlGV19IRFJfRldfVkVSX01BSk9SX0coYWRhcHRlci0+cGFyYW1zLmZ3X3ZlcnMpLAotCQkJRldfSERSX0ZXX1ZFUl9NSU5PUl9HKGFkYXB0ZXItPnBhcmFtcy5md192ZXJzKSwKLQkJCUZXX0hEUl9GV19WRVJfTUlDUk9fRyhhZGFwdGVyLT5wYXJhbXMuZndfdmVycyksCi0JCQlGV19IRFJfRldfVkVSX0JVSUxEX0coYWRhcHRlci0+cGFyYW1zLmZ3X3ZlcnMpLAotCQkJRldfSERSX0ZXX1ZFUl9NQUpPUl9HKGFkYXB0ZXItPnBhcmFtcy50cF92ZXJzKSwKLQkJCUZXX0hEUl9GV19WRVJfTUlOT1JfRyhhZGFwdGVyLT5wYXJhbXMudHBfdmVycyksCi0JCQlGV19IRFJfRldfVkVSX01JQ1JPX0coYWRhcHRlci0+cGFyYW1zLnRwX3ZlcnMpLAotCQkJRldfSERSX0ZXX1ZFUl9CVUlMRF9HKGFkYXB0ZXItPnBhcmFtcy50cF92ZXJzKSk7Ci0KLQlpZiAoIXQ0X2dldF9leHByb21fdmVyc2lvbihhZGFwdGVyLCAmZXhwcm9tX3ZlcnMpKQotCQlzbnByaW50ZihpbmZvLT5lcm9tX3ZlcnNpb24sIHNpemVvZihpbmZvLT5lcm9tX3ZlcnNpb24pLAotCQkJICIldS4ldS4ldS4ldSIsCi0JCQkgRldfSERSX0ZXX1ZFUl9NQUpPUl9HKGV4cHJvbV92ZXJzKSwKLQkJCSBGV19IRFJfRldfVkVSX01JTk9SX0coZXhwcm9tX3ZlcnMpLAotCQkJIEZXX0hEUl9GV19WRVJfTUlDUk9fRyhleHByb21fdmVycyksCi0JCQkgRldfSERSX0ZXX1ZFUl9CVUlMRF9HKGV4cHJvbV92ZXJzKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQotewotCWlmIChzdHJpbmdzZXQgPT0gRVRIX1NTX1NUQVRTKQotCQltZW1jcHkoZGF0YSwgc3RhdHNfc3RyaW5ncywgc2l6ZW9mKHN0YXRzX3N0cmluZ3MpKTsKLX0KLQotLyoKLSAqIHBvcnQgc3RhdHMgbWFpbnRhaW5lZCBwZXIgcXVldWUgb2YgdGhlIHBvcnQuICBUaGV5IHNob3VsZCBiZSBpbiB0aGUgc2FtZQotICogb3JkZXIgYXMgaW4gc3RhdHNfc3RyaW5ncyBhYm92ZS4KLSAqLwotc3RydWN0IHF1ZXVlX3BvcnRfc3RhdHMgewotCXU2NCB0c287Ci0JdTY0IHR4X2NzdW07Ci0JdTY0IHJ4X2NzdW07Ci0JdTY0IHZsYW5fZXg7Ci0JdTY0IHZsYW5faW5zOwotCXU2NCBncm9fcGt0czsKLQl1NjQgZ3JvX21lcmdlZDsKLX07Ci0KLXN0YXRpYyB2b2lkIGNvbGxlY3Rfc2dlX3BvcnRfc3RhdHMoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXAsCi0JCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnAsIHN0cnVjdCBxdWV1ZV9wb3J0X3N0YXRzICpzKQotewotCWludCBpOwotCWNvbnN0IHN0cnVjdCBzZ2VfZXRoX3R4cSAqdHggPSAmYWRhcC0+c2dlLmV0aHR4cVtwLT5maXJzdF9xc2V0XTsKLQljb25zdCBzdHJ1Y3Qgc2dlX2V0aF9yeHEgKnJ4ID0gJmFkYXAtPnNnZS5ldGhyeHFbcC0+Zmlyc3RfcXNldF07Ci0KLQltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7Ci0JZm9yIChpID0gMDsgaSA8IHAtPm5xc2V0czsgaSsrLCByeCsrLCB0eCsrKSB7Ci0JCXMtPnRzbyArPSB0eC0+dHNvOwotCQlzLT50eF9jc3VtICs9IHR4LT50eF9jc287Ci0JCXMtPnJ4X2NzdW0gKz0gcngtPnN0YXRzLnJ4X2NzbzsKLQkJcy0+dmxhbl9leCArPSByeC0+c3RhdHMudmxhbl9leDsKLQkJcy0+dmxhbl9pbnMgKz0gdHgtPnZsYW5faW5zOwotCQlzLT5ncm9fcGt0cyArPSByeC0+c3RhdHMubHJvX3BrdHM7Ci0JCXMtPmdyb19tZXJnZWQgKz0gcngtPnN0YXRzLmxyb19tZXJnZWQ7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBnZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfc3RhdHMgKnN0YXRzLAotCQkgICAgICB1NjQgKmRhdGEpCi17Ci0Jc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcGktPmFkYXB0ZXI7Ci0JdTMyIHZhbDEsIHZhbDI7Ci0KLQl0NF9nZXRfcG9ydF9zdGF0cyhhZGFwdGVyLCBwaS0+dHhfY2hhbiwgKHN0cnVjdCBwb3J0X3N0YXRzICopZGF0YSk7Ci0KLQlkYXRhICs9IHNpemVvZihzdHJ1Y3QgcG9ydF9zdGF0cykgLyBzaXplb2YodTY0KTsKLQljb2xsZWN0X3NnZV9wb3J0X3N0YXRzKGFkYXB0ZXIsIHBpLCAoc3RydWN0IHF1ZXVlX3BvcnRfc3RhdHMgKilkYXRhKTsKLQlkYXRhICs9IHNpemVvZihzdHJ1Y3QgcXVldWVfcG9ydF9zdGF0cykgLyBzaXplb2YodTY0KTsKLQlpZiAoIWlzX3Q0KGFkYXB0ZXItPnBhcmFtcy5jaGlwKSkgewotCQl0NF93cml0ZV9yZWcoYWRhcHRlciwgU0dFX1NUQVRfQ0ZHX0EsIFNUQVRTT1VSQ0VfVDVfVig3KSk7Ci0JCXZhbDEgPSB0NF9yZWFkX3JlZyhhZGFwdGVyLCBTR0VfU1RBVF9UT1RBTF9BKTsKLQkJdmFsMiA9IHQ0X3JlYWRfcmVnKGFkYXB0ZXIsIFNHRV9TVEFUX01BVENIX0EpOwotCQkqZGF0YSA9IHZhbDEgLSB2YWwyOwotCQlkYXRhKys7Ci0JCSpkYXRhID0gdmFsMjsKLQkJZGF0YSsrOwotCX0gZWxzZSB7Ci0JCW1lbXNldChkYXRhLCAwLCAyICogc2l6ZW9mKHU2NCkpOwotCQkqZGF0YSArPSAyOwotCX0KLX0KLQotLyoKLSAqIFJldHVybiBhIHZlcnNpb24gbnVtYmVyIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIGFkYXB0ZXIuICBUaGUgc2NoZW1lIGlzOgotICogLSBiaXRzIDAuLjk6IGNoaXAgdmVyc2lvbgotICogLSBiaXRzIDEwLi4xNTogY2hpcCByZXZpc2lvbgotICogLSBiaXRzIDE2Li4yMzogcmVnaXN0ZXIgZHVtcCB2ZXJzaW9uCi0gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1rX2FkYXBfdmVycyhjb25zdCBzdHJ1Y3QgYWRhcHRlciAqYXApCi17Ci0JcmV0dXJuIENIRUxTSU9fQ0hJUF9WRVJTSU9OKGFwLT5wYXJhbXMuY2hpcCkgfAotCQkoQ0hFTFNJT19DSElQX1JFTEVBU0UoYXAtPnBhcmFtcy5jaGlwKSA8PCAxMCkgfCAoMSA8PCAxNik7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlZ19ibG9ja19kdW1wKHN0cnVjdCBhZGFwdGVyICphcCwgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgc3RhcnQsCi0JCQkgICB1bnNpZ25lZCBpbnQgZW5kKQotewotCXUzMiAqcCA9IGJ1ZiArIHN0YXJ0OwotCi0JZm9yICggOyBzdGFydCA8PSBlbmQ7IHN0YXJ0ICs9IHNpemVvZih1MzIpKQotCQkqcCsrID0gdDRfcmVhZF9yZWcoYXAsIHN0YXJ0KTsKLX0KLQotc3RhdGljIHZvaWQgZ2V0X3JlZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywKLQkJICAgICB2b2lkICpidWYpCi17Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0NF9yZWdfcmFuZ2VzW10gPSB7Ci0JCTB4MTAwOCwgMHgxMTA4LAotCQkweDExODAsIDB4MTFiNCwKLQkJMHgxMWZjLCAweDEyM2MsCi0JCTB4MTMwMCwgMHgxNzNjLAotCQkweDE4MDAsIDB4MThmYywKLQkJMHgzMDAwLCAweDMwZDgsCi0JCTB4MzBlMCwgMHg1OTI0LAotCQkweDU5NjAsIDB4NTlkNCwKLQkJMHg1YTAwLCAweDVhZjgsCi0JCTB4NjAwMCwgMHg2MDk4LAotCQkweDYxMDAsIDB4NjE1MCwKLQkJMHg2MjAwLCAweDYyMDgsCi0JCTB4NjI0MCwgMHg2MjQ4LAotCQkweDYyODAsIDB4NjMzOCwKLQkJMHg2MzcwLCAweDYzOGMsCi0JCTB4NjQwMCwgMHg2NDNjLAotCQkweDY1MDAsIDB4NjUyNCwKLQkJMHg2YTAwLCAweDZhMzgsCi0JCTB4NmE2MCwgMHg2YTc4LAotCQkweDZiMDAsIDB4NmI4NCwKLQkJMHg2YmYwLCAweDZjODQsCi0JCTB4NmNmMCwgMHg2ZDg0LAotCQkweDZkZjAsIDB4NmU4NCwKLQkJMHg2ZWYwLCAweDZmODQsCi0JCTB4NmZmMCwgMHg3MDg0LAotCQkweDcwZjAsIDB4NzE4NCwKLQkJMHg3MWYwLCAweDcyODQsCi0JCTB4NzJmMCwgMHg3Mzg0LAotCQkweDczZjAsIDB4NzQ1MCwKLQkJMHg3NTAwLCAweDc1MzAsCi0JCTB4NzYwMCwgMHg3NjFjLAotCQkweDc2ODAsIDB4NzZjYywKLQkJMHg3NzAwLCAweDc3OTgsCi0JCTB4NzdjMCwgMHg3N2ZjLAotCQkweDc5MDAsIDB4NzlmYywKLQkJMHg3YjAwLCAweDdjMzgsCi0JCTB4N2QwMCwgMHg3ZWZjLAotCQkweDhkYzAsIDB4OGUxYywKLQkJMHg4ZTMwLCAweDhlNzgsCi0JCTB4OGVhMCwgMHg4ZjZjLAotCQkweDhmYzAsIDB4OTA3NCwKLQkJMHg5MGZjLCAweDkwZmMsCi0JCTB4OTQwMCwgMHg5NDU4LAotCQkweDk2MDAsIDB4OTZiYywKLQkJMHg5ODAwLCAweDk4MDgsCi0JCTB4OTgyMCwgMHg5ODNjLAotCQkweDk4NTAsIDB4OTg2NCwKLQkJMHg5YzAwLCAweDljNmMsCi0JCTB4OWM4MCwgMHg5Y2VjLAotCQkweDlkMDAsIDB4OWQ2YywKLQkJMHg5ZDgwLCAweDlkZWMsCi0JCTB4OWUwMCwgMHg5ZTZjLAotCQkweDllODAsIDB4OWVlYywKLQkJMHg5ZjAwLCAweDlmNmMsCi0JCTB4OWY4MCwgMHg5ZmVjLAotCQkweGQwMDQsIDB4ZDAzYywKLQkJMHhkZmMwLCAweGRmZTAsCi0JCTB4ZTAwMCwgMHhlYTdjLAotCQkweGYwMDAsIDB4MTExMTAsCi0JCTB4MTExMTgsIDB4MTExOTAsCi0JCTB4MTkwNDAsIDB4MTkwNmMsCi0JCTB4MTkwNzgsIDB4MTkwODAsCi0JCTB4MTkwOGMsIDB4MTkxMjQsCi0JCTB4MTkxNTAsIDB4MTkxYjAsCi0JCTB4MTkxZDAsIDB4MTkxZTgsCi0JCTB4MTkyMzgsIDB4MTkyNGMsCi0JCTB4MTkzZjgsIDB4MTk0NzQsCi0JCTB4MTk0OTAsIDB4MTk0ZjgsCi0JCTB4MTk4MDAsIDB4MTlmMzAsCi0JCTB4MWEwMDAsIDB4MWEwNmMsCi0JCTB4MWEwYjAsIDB4MWExMjAsCi0JCTB4MWExMjgsIDB4MWExMzgsCi0JCTB4MWExOTAsIDB4MWExYzQsCi0JCTB4MWExZmMsIDB4MWExZmMsCi0JCTB4MWUwNDAsIDB4MWUwNGMsCi0JCTB4MWUyODQsIDB4MWUyOGMsCi0JCTB4MWUyYzAsIDB4MWUyYzAsCi0JCTB4MWUyZTAsIDB4MWUyZTAsCi0JCTB4MWUzMDAsIDB4MWUzODQsCi0JCTB4MWUzYzAsIDB4MWUzYzgsCi0JCTB4MWU0NDAsIDB4MWU0NGMsCi0JCTB4MWU2ODQsIDB4MWU2OGMsCi0JCTB4MWU2YzAsIDB4MWU2YzAsCi0JCTB4MWU2ZTAsIDB4MWU2ZTAsCi0JCTB4MWU3MDAsIDB4MWU3ODQsCi0JCTB4MWU3YzAsIDB4MWU3YzgsCi0JCTB4MWU4NDAsIDB4MWU4NGMsCi0JCTB4MWVhODQsIDB4MWVhOGMsCi0JCTB4MWVhYzAsIDB4MWVhYzAsCi0JCTB4MWVhZTAsIDB4MWVhZTAsCi0JCTB4MWViMDAsIDB4MWViODQsCi0JCTB4MWViYzAsIDB4MWViYzgsCi0JCTB4MWVjNDAsIDB4MWVjNGMsCi0JCTB4MWVlODQsIDB4MWVlOGMsCi0JCTB4MWVlYzAsIDB4MWVlYzAsCi0JCTB4MWVlZTAsIDB4MWVlZTAsCi0JCTB4MWVmMDAsIDB4MWVmODQsCi0JCTB4MWVmYzAsIDB4MWVmYzgsCi0JCTB4MWYwNDAsIDB4MWYwNGMsCi0JCTB4MWYyODQsIDB4MWYyOGMsCi0JCTB4MWYyYzAsIDB4MWYyYzAsCi0JCTB4MWYyZTAsIDB4MWYyZTAsCi0JCTB4MWYzMDAsIDB4MWYzODQsCi0JCTB4MWYzYzAsIDB4MWYzYzgsCi0JCTB4MWY0NDAsIDB4MWY0NGMsCi0JCTB4MWY2ODQsIDB4MWY2OGMsCi0JCTB4MWY2YzAsIDB4MWY2YzAsCi0JCTB4MWY2ZTAsIDB4MWY2ZTAsCi0JCTB4MWY3MDAsIDB4MWY3ODQsCi0JCTB4MWY3YzAsIDB4MWY3YzgsCi0JCTB4MWY4NDAsIDB4MWY4NGMsCi0JCTB4MWZhODQsIDB4MWZhOGMsCi0JCTB4MWZhYzAsIDB4MWZhYzAsCi0JCTB4MWZhZTAsIDB4MWZhZTAsCi0JCTB4MWZiMDAsIDB4MWZiODQsCi0JCTB4MWZiYzAsIDB4MWZiYzgsCi0JCTB4MWZjNDAsIDB4MWZjNGMsCi0JCTB4MWZlODQsIDB4MWZlOGMsCi0JCTB4MWZlYzAsIDB4MWZlYzAsCi0JCTB4MWZlZTAsIDB4MWZlZTAsCi0JCTB4MWZmMDAsIDB4MWZmODQsCi0JCTB4MWZmYzAsIDB4MWZmYzgsCi0JCTB4MjAwMDAsIDB4MjAwMmMsCi0JCTB4MjAxMDAsIDB4MjAxM2MsCi0JCTB4MjAxOTAsIDB4MjAxYzgsCi0JCTB4MjAyMDAsIDB4MjAzMTgsCi0JCTB4MjA0MDAsIDB4MjA1MjgsCi0JCTB4MjA1NDAsIDB4MjA2MTQsCi0JCTB4MjEwMDAsIDB4MjEwNDAsCi0JCTB4MjEwNGMsIDB4MjEwNjAsCi0JCTB4MjEwYzAsIDB4MjEwZWMsCi0JCTB4MjEyMDAsIDB4MjEyNjgsCi0JCTB4MjEyNzAsIDB4MjEyODQsCi0JCTB4MjEyZmMsIDB4MjEzODgsCi0JCTB4MjE0MDAsIDB4MjE0MDQsCi0JCTB4MjE1MDAsIDB4MjE1MTgsCi0JCTB4MjE1MmMsIDB4MjE1M2MsCi0JCTB4MjE1NTAsIDB4MjE1NTQsCi0JCTB4MjE2MDAsIDB4MjE2MDAsCi0JCTB4MjE2MDgsIDB4MjE2MjgsCi0JCTB4MjE2MzAsIDB4MjE2M2MsCi0JCTB4MjE3MDAsIDB4MjE3MWMsCi0JCTB4MjE3ODAsIDB4MjE3OGMsCi0JCTB4MjE4MDAsIDB4MjFjMzgsCi0JCTB4MjFjODAsIDB4MjFkN2MsCi0JCTB4MjFlMDAsIDB4MjFlMDQsCi0JCTB4MjIwMDAsIDB4MjIwMmMsCi0JCTB4MjIxMDAsIDB4MjIxM2MsCi0JCTB4MjIxOTAsIDB4MjIxYzgsCi0JCTB4MjIyMDAsIDB4MjIzMTgsCi0JCTB4MjI0MDAsIDB4MjI1MjgsCi0JCTB4MjI1NDAsIDB4MjI2MTQsCi0JCTB4MjMwMDAsIDB4MjMwNDAsCi0JCTB4MjMwNGMsIDB4MjMwNjAsCi0JCTB4MjMwYzAsIDB4MjMwZWMsCi0JCTB4MjMyMDAsIDB4MjMyNjgsCi0JCTB4MjMyNzAsIDB4MjMyODQsCi0JCTB4MjMyZmMsIDB4MjMzODgsCi0JCTB4MjM0MDAsIDB4MjM0MDQsCi0JCTB4MjM1MDAsIDB4MjM1MTgsCi0JCTB4MjM1MmMsIDB4MjM1M2MsCi0JCTB4MjM1NTAsIDB4MjM1NTQsCi0JCTB4MjM2MDAsIDB4MjM2MDAsCi0JCTB4MjM2MDgsIDB4MjM2MjgsCi0JCTB4MjM2MzAsIDB4MjM2M2MsCi0JCTB4MjM3MDAsIDB4MjM3MWMsCi0JCTB4MjM3ODAsIDB4MjM3OGMsCi0JCTB4MjM4MDAsIDB4MjNjMzgsCi0JCTB4MjNjODAsIDB4MjNkN2MsCi0JCTB4MjNlMDAsIDB4MjNlMDQsCi0JCTB4MjQwMDAsIDB4MjQwMmMsCi0JCTB4MjQxMDAsIDB4MjQxM2MsCi0JCTB4MjQxOTAsIDB4MjQxYzgsCi0JCTB4MjQyMDAsIDB4MjQzMTgsCi0JCTB4MjQ0MDAsIDB4MjQ1MjgsCi0JCTB4MjQ1NDAsIDB4MjQ2MTQsCi0JCTB4MjUwMDAsIDB4MjUwNDAsCi0JCTB4MjUwNGMsIDB4MjUwNjAsCi0JCTB4MjUwYzAsIDB4MjUwZWMsCi0JCTB4MjUyMDAsIDB4MjUyNjgsCi0JCTB4MjUyNzAsIDB4MjUyODQsCi0JCTB4MjUyZmMsIDB4MjUzODgsCi0JCTB4MjU0MDAsIDB4MjU0MDQsCi0JCTB4MjU1MDAsIDB4MjU1MTgsCi0JCTB4MjU1MmMsIDB4MjU1M2MsCi0JCTB4MjU1NTAsIDB4MjU1NTQsCi0JCTB4MjU2MDAsIDB4MjU2MDAsCi0JCTB4MjU2MDgsIDB4MjU2MjgsCi0JCTB4MjU2MzAsIDB4MjU2M2MsCi0JCTB4MjU3MDAsIDB4MjU3MWMsCi0JCTB4MjU3ODAsIDB4MjU3OGMsCi0JCTB4MjU4MDAsIDB4MjVjMzgsCi0JCTB4MjVjODAsIDB4MjVkN2MsCi0JCTB4MjVlMDAsIDB4MjVlMDQsCi0JCTB4MjYwMDAsIDB4MjYwMmMsCi0JCTB4MjYxMDAsIDB4MjYxM2MsCi0JCTB4MjYxOTAsIDB4MjYxYzgsCi0JCTB4MjYyMDAsIDB4MjYzMTgsCi0JCTB4MjY0MDAsIDB4MjY1MjgsCi0JCTB4MjY1NDAsIDB4MjY2MTQsCi0JCTB4MjcwMDAsIDB4MjcwNDAsCi0JCTB4MjcwNGMsIDB4MjcwNjAsCi0JCTB4MjcwYzAsIDB4MjcwZWMsCi0JCTB4MjcyMDAsIDB4MjcyNjgsCi0JCTB4MjcyNzAsIDB4MjcyODQsCi0JCTB4MjcyZmMsIDB4MjczODgsCi0JCTB4Mjc0MDAsIDB4Mjc0MDQsCi0JCTB4Mjc1MDAsIDB4Mjc1MTgsCi0JCTB4Mjc1MmMsIDB4Mjc1M2MsCi0JCTB4Mjc1NTAsIDB4Mjc1NTQsCi0JCTB4Mjc2MDAsIDB4Mjc2MDAsCi0JCTB4Mjc2MDgsIDB4Mjc2MjgsCi0JCTB4Mjc2MzAsIDB4Mjc2M2MsCi0JCTB4Mjc3MDAsIDB4Mjc3MWMsCi0JCTB4Mjc3ODAsIDB4Mjc3OGMsCi0JCTB4Mjc4MDAsIDB4MjdjMzgsCi0JCTB4MjdjODAsIDB4MjdkN2MsCi0JCTB4MjdlMDAsIDB4MjdlMDQKLQl9OwotCi0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0NV9yZWdfcmFuZ2VzW10gPSB7Ci0JCTB4MTAwOCwgMHgxMTQ4LAotCQkweDExODAsIDB4MTFiNCwKLQkJMHgxMWZjLCAweDEyM2MsCi0JCTB4MTI4MCwgMHgxNzNjLAotCQkweDE4MDAsIDB4MThmYywKLQkJMHgzMDAwLCAweDMwMjgsCi0JCTB4MzA2MCwgMHgzMGQ4LAotCQkweDMwZTAsIDB4MzBmYywKLQkJMHgzMTQwLCAweDM1N2MsCi0JCTB4MzVhOCwgMHgzNWNjLAotCQkweDM1ZWMsIDB4MzVlYywKLQkJMHgzNjAwLCAweDU2MjQsCi0JCTB4NTZjYywgMHg1NzVjLAotCQkweDU4MGMsIDB4NTgxNCwKLQkJMHg1ODkwLCAweDU4YmMsCi0JCTB4NTk0MCwgMHg1OWRjLAotCQkweDU5ZmMsIDB4NWExOCwKLQkJMHg1YTYwLCAweDVhOWMsCi0JCTB4NWI5YywgMHg1YmZjLAotCQkweDYwMDAsIDB4NjA0MCwKLQkJMHg2MDU4LCAweDYxNGMsCi0JCTB4NzcwMCwgMHg3Nzk4LAotCQkweDc3YzAsIDB4NzhmYywKLQkJMHg3YjAwLCAweDdjNTQsCi0JCTB4N2QwMCwgMHg3ZWZjLAotCQkweDhkYzAsIDB4OGRlMCwKLQkJMHg4ZGY4LCAweDhlODQsCi0JCTB4OGVhMCwgMHg4Zjg0LAotCQkweDhmYzAsIDB4OTBmOCwKLQkJMHg5NDAwLCAweDk0NzAsCi0JCTB4OTYwMCwgMHg5NmY0LAotCQkweDk4MDAsIDB4OTgwOCwKLQkJMHg5ODIwLCAweDk4M2MsCi0JCTB4OTg1MCwgMHg5ODY0LAotCQkweDljMDAsIDB4OWM2YywKLQkJMHg5YzgwLCAweDljZWMsCi0JCTB4OWQwMCwgMHg5ZDZjLAotCQkweDlkODAsIDB4OWRlYywKLQkJMHg5ZTAwLCAweDllNmMsCi0JCTB4OWU4MCwgMHg5ZWVjLAotCQkweDlmMDAsIDB4OWY2YywKLQkJMHg5ZjgwLCAweGEwMjAsCi0JCTB4ZDAwNCwgMHhkMDNjLAotCQkweGRmYzAsIDB4ZGZlMCwKLQkJMHhlMDAwLCAweDExMDg4LAotCQkweDExMDljLCAweDExMTEwLAotCQkweDExMTE4LCAweDExMTdjLAotCQkweDExMTkwLCAweDExMjA0LAotCQkweDE5MDQwLCAweDE5MDZjLAotCQkweDE5MDc4LCAweDE5MDgwLAotCQkweDE5MDhjLCAweDE5MTI0LAotCQkweDE5MTUwLCAweDE5MWIwLAotCQkweDE5MWQwLCAweDE5MWU4LAotCQkweDE5MjM4LCAweDE5MjkwLAotCQkweDE5M2Y4LCAweDE5NDc0LAotCQkweDE5NDkwLCAweDE5NGNjLAotCQkweDE5NGYwLCAweDE5NGY4LAotCQkweDE5YzAwLCAweDE5YzYwLAotCQkweDE5Yzk0LCAweDE5ZTEwLAotCQkweDE5ZTUwLCAweDE5ZjM0LAotCQkweDE5ZjQwLCAweDE5ZjUwLAotCQkweDE5ZjkwLCAweDE5ZmU0LAotCQkweDFhMDAwLCAweDFhMDZjLAotCQkweDFhMGIwLCAweDFhMTIwLAotCQkweDFhMTI4LCAweDFhMTM4LAotCQkweDFhMTkwLCAweDFhMWM0LAotCQkweDFhMWZjLCAweDFhMWZjLAotCQkweDFlMDA4LCAweDFlMDBjLAotCQkweDFlMDQwLCAweDFlMDRjLAotCQkweDFlMjg0LCAweDFlMjkwLAotCQkweDFlMmMwLCAweDFlMmMwLAotCQkweDFlMmUwLCAweDFlMmUwLAotCQkweDFlMzAwLCAweDFlMzg0LAotCQkweDFlM2MwLCAweDFlM2M4LAotCQkweDFlNDA4LCAweDFlNDBjLAotCQkweDFlNDQwLCAweDFlNDRjLAotCQkweDFlNjg0LCAweDFlNjkwLAotCQkweDFlNmMwLCAweDFlNmMwLAotCQkweDFlNmUwLCAweDFlNmUwLAotCQkweDFlNzAwLCAweDFlNzg0LAotCQkweDFlN2MwLCAweDFlN2M4LAotCQkweDFlODA4LCAweDFlODBjLAotCQkweDFlODQwLCAweDFlODRjLAotCQkweDFlYTg0LCAweDFlYTkwLAotCQkweDFlYWMwLCAweDFlYWMwLAotCQkweDFlYWUwLCAweDFlYWUwLAotCQkweDFlYjAwLCAweDFlYjg0LAotCQkweDFlYmMwLCAweDFlYmM4LAotCQkweDFlYzA4LCAweDFlYzBjLAotCQkweDFlYzQwLCAweDFlYzRjLAotCQkweDFlZTg0LCAweDFlZTkwLAotCQkweDFlZWMwLCAweDFlZWMwLAotCQkweDFlZWUwLCAweDFlZWUwLAotCQkweDFlZjAwLCAweDFlZjg0LAotCQkweDFlZmMwLCAweDFlZmM4LAotCQkweDFmMDA4LCAweDFmMDBjLAotCQkweDFmMDQwLCAweDFmMDRjLAotCQkweDFmMjg0LCAweDFmMjkwLAotCQkweDFmMmMwLCAweDFmMmMwLAotCQkweDFmMmUwLCAweDFmMmUwLAotCQkweDFmMzAwLCAweDFmMzg0LAotCQkweDFmM2MwLCAweDFmM2M4LAotCQkweDFmNDA4LCAweDFmNDBjLAotCQkweDFmNDQwLCAweDFmNDRjLAotCQkweDFmNjg0LCAweDFmNjkwLAotCQkweDFmNmMwLCAweDFmNmMwLAotCQkweDFmNmUwLCAweDFmNmUwLAotCQkweDFmNzAwLCAweDFmNzg0LAotCQkweDFmN2MwLCAweDFmN2M4LAotCQkweDFmODA4LCAweDFmODBjLAotCQkweDFmODQwLCAweDFmODRjLAotCQkweDFmYTg0LCAweDFmYTkwLAotCQkweDFmYWMwLCAweDFmYWMwLAotCQkweDFmYWUwLCAweDFmYWUwLAotCQkweDFmYjAwLCAweDFmYjg0LAotCQkweDFmYmMwLCAweDFmYmM4LAotCQkweDFmYzA4LCAweDFmYzBjLAotCQkweDFmYzQwLCAweDFmYzRjLAotCQkweDFmZTg0LCAweDFmZTkwLAotCQkweDFmZWMwLCAweDFmZWMwLAotCQkweDFmZWUwLCAweDFmZWUwLAotCQkweDFmZjAwLCAweDFmZjg0LAotCQkweDFmZmMwLCAweDFmZmM4LAotCQkweDMwMDAwLCAweDMwMDMwLAotCQkweDMwMTAwLCAweDMwMTQ0LAotCQkweDMwMTkwLCAweDMwMWQwLAotCQkweDMwMjAwLCAweDMwMzE4LAotCQkweDMwNDAwLCAweDMwNTJjLAotCQkweDMwNTQwLCAweDMwNjFjLAotCQkweDMwODAwLCAweDMwODM0LAotCQkweDMwOGMwLCAweDMwOTA4LAotCQkweDMwOTEwLCAweDMwOWFjLAotCQkweDMwYTAwLCAweDMwYTA0LAotCQkweDMwYTBjLCAweDMwYTJjLAotCQkweDMwYTQ0LCAweDMwYTUwLAotCQkweDMwYTc0LCAweDMwYzI0LAotCQkweDMwZDA4LCAweDMwZDE0LAotCQkweDMwZDFjLCAweDMwZDIwLAotCQkweDMwZDNjLCAweDMwZDUwLAotCQkweDMxMjAwLCAweDMxMjBjLAotCQkweDMxMjIwLCAweDMxMjIwLAotCQkweDMxMjQwLCAweDMxMjQwLAotCQkweDMxNjAwLCAweDMxNjAwLAotCQkweDMxNjA4LCAweDMxNjBjLAotCQkweDMxYTAwLCAweDMxYTFjLAotCQkweDMxZTA0LCAweDMxZTIwLAotCQkweDMxZTM4LCAweDMxZTNjLAotCQkweDMxZTgwLCAweDMxZTgwLAotCQkweDMxZTg4LCAweDMxZWE4LAotCQkweDMxZWIwLCAweDMxZWI0LAotCQkweDMxZWM4LCAweDMxZWQ0LAotCQkweDMxZmI4LCAweDMyMDA0LAotCQkweDMyMjA4LCAweDMyMjNjLAotCQkweDMyNjAwLCAweDMyNjMwLAotCQkweDMyYTAwLCAweDMyYWJjLAotCQkweDMyYjAwLCAweDMyYjcwLAotCQkweDMzMDAwLCAweDMzMDQ4LAotCQkweDMzMDYwLCAweDMzMDljLAotCQkweDMzMGYwLCAweDMzMTQ4LAotCQkweDMzMTYwLCAweDMzMTljLAotCQkweDMzMWYwLCAweDMzMmU0LAotCQkweDMzMmY4LCAweDMzM2U0LAotCQkweDMzM2Y4LCAweDMzNDQ4LAotCQkweDMzNDYwLCAweDMzNDljLAotCQkweDMzNGYwLCAweDMzNTQ4LAotCQkweDMzNTYwLCAweDMzNTljLAotCQkweDMzNWYwLCAweDMzNmU0LAotCQkweDMzNmY4LCAweDMzN2U0LAotCQkweDMzN2Y4LCAweDMzN2ZjLAotCQkweDMzODE0LCAweDMzODE0LAotCQkweDMzODJjLCAweDMzODJjLAotCQkweDMzODgwLCAweDMzODhjLAotCQkweDMzOGU4LCAweDMzOGVjLAotCQkweDMzOTAwLCAweDMzOTQ4LAotCQkweDMzOTYwLCAweDMzOTljLAotCQkweDMzOWYwLCAweDMzYWU0LAotCQkweDMzYWY4LCAweDMzYjEwLAotCQkweDMzYjI4LCAweDMzYjI4LAotCQkweDMzYjNjLCAweDMzYjUwLAotCQkweDMzYmYwLCAweDMzYzEwLAotCQkweDMzYzI4LCAweDMzYzI4LAotCQkweDMzYzNjLCAweDMzYzUwLAotCQkweDMzY2YwLCAweDMzY2ZjLAotCQkweDM0MDAwLCAweDM0MDMwLAotCQkweDM0MTAwLCAweDM0MTQ0LAotCQkweDM0MTkwLCAweDM0MWQwLAotCQkweDM0MjAwLCAweDM0MzE4LAotCQkweDM0NDAwLCAweDM0NTJjLAotCQkweDM0NTQwLCAweDM0NjFjLAotCQkweDM0ODAwLCAweDM0ODM0LAotCQkweDM0OGMwLCAweDM0OTA4LAotCQkweDM0OTEwLCAweDM0OWFjLAotCQkweDM0YTAwLCAweDM0YTA0LAotCQkweDM0YTBjLCAweDM0YTJjLAotCQkweDM0YTQ0LCAweDM0YTUwLAotCQkweDM0YTc0LCAweDM0YzI0LAotCQkweDM0ZDA4LCAweDM0ZDE0LAotCQkweDM0ZDFjLCAweDM0ZDIwLAotCQkweDM0ZDNjLCAweDM0ZDUwLAotCQkweDM1MjAwLCAweDM1MjBjLAotCQkweDM1MjIwLCAweDM1MjIwLAotCQkweDM1MjQwLCAweDM1MjQwLAotCQkweDM1NjAwLCAweDM1NjAwLAotCQkweDM1NjA4LCAweDM1NjBjLAotCQkweDM1YTAwLCAweDM1YTFjLAotCQkweDM1ZTA0LCAweDM1ZTIwLAotCQkweDM1ZTM4LCAweDM1ZTNjLAotCQkweDM1ZTgwLCAweDM1ZTgwLAotCQkweDM1ZTg4LCAweDM1ZWE4LAotCQkweDM1ZWIwLCAweDM1ZWI0LAotCQkweDM1ZWM4LCAweDM1ZWQ0LAotCQkweDM1ZmI4LCAweDM2MDA0LAotCQkweDM2MjA4LCAweDM2MjNjLAotCQkweDM2NjAwLCAweDM2NjMwLAotCQkweDM2YTAwLCAweDM2YWJjLAotCQkweDM2YjAwLCAweDM2YjcwLAotCQkweDM3MDAwLCAweDM3MDQ4LAotCQkweDM3MDYwLCAweDM3MDljLAotCQkweDM3MGYwLCAweDM3MTQ4LAotCQkweDM3MTYwLCAweDM3MTljLAotCQkweDM3MWYwLCAweDM3MmU0LAotCQkweDM3MmY4LCAweDM3M2U0LAotCQkweDM3M2Y4LCAweDM3NDQ4LAotCQkweDM3NDYwLCAweDM3NDljLAotCQkweDM3NGYwLCAweDM3NTQ4LAotCQkweDM3NTYwLCAweDM3NTljLAotCQkweDM3NWYwLCAweDM3NmU0LAotCQkweDM3NmY4LCAweDM3N2U0LAotCQkweDM3N2Y4LCAweDM3N2ZjLAotCQkweDM3ODE0LCAweDM3ODE0LAotCQkweDM3ODJjLCAweDM3ODJjLAotCQkweDM3ODgwLCAweDM3ODhjLAotCQkweDM3OGU4LCAweDM3OGVjLAotCQkweDM3OTAwLCAweDM3OTQ4LAotCQkweDM3OTYwLCAweDM3OTljLAotCQkweDM3OWYwLCAweDM3YWU0LAotCQkweDM3YWY4LCAweDM3YjEwLAotCQkweDM3YjI4LCAweDM3YjI4LAotCQkweDM3YjNjLCAweDM3YjUwLAotCQkweDM3YmYwLCAweDM3YzEwLAotCQkweDM3YzI4LCAweDM3YzI4LAotCQkweDM3YzNjLCAweDM3YzUwLAotCQkweDM3Y2YwLCAweDM3Y2ZjLAotCQkweDM4MDAwLCAweDM4MDMwLAotCQkweDM4MTAwLCAweDM4MTQ0LAotCQkweDM4MTkwLCAweDM4MWQwLAotCQkweDM4MjAwLCAweDM4MzE4LAotCQkweDM4NDAwLCAweDM4NTJjLAotCQkweDM4NTQwLCAweDM4NjFjLAotCQkweDM4ODAwLCAweDM4ODM0LAotCQkweDM4OGMwLCAweDM4OTA4LAotCQkweDM4OTEwLCAweDM4OWFjLAotCQkweDM4YTAwLCAweDM4YTA0LAotCQkweDM4YTBjLCAweDM4YTJjLAotCQkweDM4YTQ0LCAweDM4YTUwLAotCQkweDM4YTc0LCAweDM4YzI0LAotCQkweDM4ZDA4LCAweDM4ZDE0LAotCQkweDM4ZDFjLCAweDM4ZDIwLAotCQkweDM4ZDNjLCAweDM4ZDUwLAotCQkweDM5MjAwLCAweDM5MjBjLAotCQkweDM5MjIwLCAweDM5MjIwLAotCQkweDM5MjQwLCAweDM5MjQwLAotCQkweDM5NjAwLCAweDM5NjAwLAotCQkweDM5NjA4LCAweDM5NjBjLAotCQkweDM5YTAwLCAweDM5YTFjLAotCQkweDM5ZTA0LCAweDM5ZTIwLAotCQkweDM5ZTM4LCAweDM5ZTNjLAotCQkweDM5ZTgwLCAweDM5ZTgwLAotCQkweDM5ZTg4LCAweDM5ZWE4LAotCQkweDM5ZWIwLCAweDM5ZWI0LAotCQkweDM5ZWM4LCAweDM5ZWQ0LAotCQkweDM5ZmI4LCAweDNhMDA0LAotCQkweDNhMjA4LCAweDNhMjNjLAotCQkweDNhNjAwLCAweDNhNjMwLAotCQkweDNhYTAwLCAweDNhYWJjLAotCQkweDNhYjAwLCAweDNhYjcwLAotCQkweDNiMDAwLCAweDNiMDQ4LAotCQkweDNiMDYwLCAweDNiMDljLAotCQkweDNiMGYwLCAweDNiMTQ4LAotCQkweDNiMTYwLCAweDNiMTljLAotCQkweDNiMWYwLCAweDNiMmU0LAotCQkweDNiMmY4LCAweDNiM2U0LAotCQkweDNiM2Y4LCAweDNiNDQ4LAotCQkweDNiNDYwLCAweDNiNDljLAotCQkweDNiNGYwLCAweDNiNTQ4LAotCQkweDNiNTYwLCAweDNiNTljLAotCQkweDNiNWYwLCAweDNiNmU0LAotCQkweDNiNmY4LCAweDNiN2U0LAotCQkweDNiN2Y4LCAweDNiN2ZjLAotCQkweDNiODE0LCAweDNiODE0LAotCQkweDNiODJjLCAweDNiODJjLAotCQkweDNiODgwLCAweDNiODhjLAotCQkweDNiOGU4LCAweDNiOGVjLAotCQkweDNiOTAwLCAweDNiOTQ4LAotCQkweDNiOTYwLCAweDNiOTljLAotCQkweDNiOWYwLCAweDNiYWU0LAotCQkweDNiYWY4LCAweDNiYjEwLAotCQkweDNiYjI4LCAweDNiYjI4LAotCQkweDNiYjNjLCAweDNiYjUwLAotCQkweDNiYmYwLCAweDNiYzEwLAotCQkweDNiYzI4LCAweDNiYzI4LAotCQkweDNiYzNjLCAweDNiYzUwLAotCQkweDNiY2YwLCAweDNiY2ZjLAotCQkweDNjMDAwLCAweDNjMDMwLAotCQkweDNjMTAwLCAweDNjMTQ0LAotCQkweDNjMTkwLCAweDNjMWQwLAotCQkweDNjMjAwLCAweDNjMzE4LAotCQkweDNjNDAwLCAweDNjNTJjLAotCQkweDNjNTQwLCAweDNjNjFjLAotCQkweDNjODAwLCAweDNjODM0LAotCQkweDNjOGMwLCAweDNjOTA4LAotCQkweDNjOTEwLCAweDNjOWFjLAotCQkweDNjYTAwLCAweDNjYTA0LAotCQkweDNjYTBjLCAweDNjYTJjLAotCQkweDNjYTQ0LCAweDNjYTUwLAotCQkweDNjYTc0LCAweDNjYzI0LAotCQkweDNjZDA4LCAweDNjZDE0LAotCQkweDNjZDFjLCAweDNjZDIwLAotCQkweDNjZDNjLCAweDNjZDUwLAotCQkweDNkMjAwLCAweDNkMjBjLAotCQkweDNkMjIwLCAweDNkMjIwLAotCQkweDNkMjQwLCAweDNkMjQwLAotCQkweDNkNjAwLCAweDNkNjAwLAotCQkweDNkNjA4LCAweDNkNjBjLAotCQkweDNkYTAwLCAweDNkYTFjLAotCQkweDNkZTA0LCAweDNkZTIwLAotCQkweDNkZTM4LCAweDNkZTNjLAotCQkweDNkZTgwLCAweDNkZTgwLAotCQkweDNkZTg4LCAweDNkZWE4LAotCQkweDNkZWIwLCAweDNkZWI0LAotCQkweDNkZWM4LCAweDNkZWQ0LAotCQkweDNkZmI4LCAweDNlMDA0LAotCQkweDNlMjA4LCAweDNlMjNjLAotCQkweDNlNjAwLCAweDNlNjMwLAotCQkweDNlYTAwLCAweDNlYWJjLAotCQkweDNlYjAwLCAweDNlYjcwLAotCQkweDNmMDAwLCAweDNmMDQ4LAotCQkweDNmMDYwLCAweDNmMDljLAotCQkweDNmMGYwLCAweDNmMTQ4LAotCQkweDNmMTYwLCAweDNmMTljLAotCQkweDNmMWYwLCAweDNmMmU0LAotCQkweDNmMmY4LCAweDNmM2U0LAotCQkweDNmM2Y4LCAweDNmNDQ4LAotCQkweDNmNDYwLCAweDNmNDljLAotCQkweDNmNGYwLCAweDNmNTQ4LAotCQkweDNmNTYwLCAweDNmNTljLAotCQkweDNmNWYwLCAweDNmNmU0LAotCQkweDNmNmY4LCAweDNmN2U0LAotCQkweDNmN2Y4LCAweDNmN2ZjLAotCQkweDNmODE0LCAweDNmODE0LAotCQkweDNmODJjLCAweDNmODJjLAotCQkweDNmODgwLCAweDNmODhjLAotCQkweDNmOGU4LCAweDNmOGVjLAotCQkweDNmOTAwLCAweDNmOTQ4LAotCQkweDNmOTYwLCAweDNmOTljLAotCQkweDNmOWYwLCAweDNmYWU0LAotCQkweDNmYWY4LCAweDNmYjEwLAotCQkweDNmYjI4LCAweDNmYjI4LAotCQkweDNmYjNjLCAweDNmYjUwLAotCQkweDNmYmYwLCAweDNmYzEwLAotCQkweDNmYzI4LCAweDNmYzI4LAotCQkweDNmYzNjLCAweDNmYzUwLAotCQkweDNmY2YwLCAweDNmY2ZjLAotCQkweDQwMDAwLCAweDQwMDBjLAotCQkweDQwMDQwLCAweDQwMDY4LAotCQkweDQwMDgwLCAweDQwMTQ0LAotCQkweDQwMTgwLCAweDQwMThjLAotCQkweDQwMjAwLCAweDQwMjk4LAotCQkweDQwMmFjLCAweDQwMzNjLAotCQkweDQwM2Y4LCAweDQwM2ZjLAotCQkweDQxMzA0LCAweDQxM2M0LAotCQkweDQxNDAwLCAweDQxNDFjLAotCQkweDQxNDgwLCAweDQxNGQwLAotCQkweDQ0MDAwLCAweDQ0MDc4LAotCQkweDQ0MGMwLCAweDQ0Mjc4LAotCQkweDQ0MmMwLCAweDQ0NDc4LAotCQkweDQ0NGMwLCAweDQ0Njc4LAotCQkweDQ0NmMwLCAweDQ0ODc4LAotCQkweDQ0OGMwLCAweDQ0OWZjLAotCQkweDQ1MDAwLCAweDQ1MDY4LAotCQkweDQ1MDgwLCAweDQ1MDg0LAotCQkweDQ1MGEwLCAweDQ1MGIwLAotCQkweDQ1MjAwLCAweDQ1MjY4LAotCQkweDQ1MjgwLCAweDQ1Mjg0LAotCQkweDQ1MmEwLCAweDQ1MmIwLAotCQkweDQ2MGMwLCAweDQ2MGU0LAotCQkweDQ3MDAwLCAweDQ3MDhjLAotCQkweDQ3MjAwLCAweDQ3MjUwLAotCQkweDQ3NDAwLCAweDQ3NDIwLAotCQkweDQ3NjAwLCAweDQ3NjE4LAotCQkweDQ3ODAwLCAweDQ3ODE0LAotCQkweDQ4MDAwLCAweDQ4MDBjLAotCQkweDQ4MDQwLCAweDQ4MDY4LAotCQkweDQ4MDgwLCAweDQ4MTQ0LAotCQkweDQ4MTgwLCAweDQ4MThjLAotCQkweDQ4MjAwLCAweDQ4Mjk4LAotCQkweDQ4MmFjLCAweDQ4MzNjLAotCQkweDQ4M2Y4LCAweDQ4M2ZjLAotCQkweDQ5MzA0LCAweDQ5M2M0LAotCQkweDQ5NDAwLCAweDQ5NDFjLAotCQkweDQ5NDgwLCAweDQ5NGQwLAotCQkweDRjMDAwLCAweDRjMDc4LAotCQkweDRjMGMwLCAweDRjMjc4LAotCQkweDRjMmMwLCAweDRjNDc4LAotCQkweDRjNGMwLCAweDRjNjc4LAotCQkweDRjNmMwLCAweDRjODc4LAotCQkweDRjOGMwLCAweDRjOWZjLAotCQkweDRkMDAwLCAweDRkMDY4LAotCQkweDRkMDgwLCAweDRkMDg0LAotCQkweDRkMGEwLCAweDRkMGIwLAotCQkweDRkMjAwLCAweDRkMjY4LAotCQkweDRkMjgwLCAweDRkMjg0LAotCQkweDRkMmEwLCAweDRkMmIwLAotCQkweDRlMGMwLCAweDRlMGU0LAotCQkweDRmMDAwLCAweDRmMDhjLAotCQkweDRmMjAwLCAweDRmMjUwLAotCQkweDRmNDAwLCAweDRmNDIwLAotCQkweDRmNjAwLCAweDRmNjE4LAotCQkweDRmODAwLCAweDRmODE0LAotCQkweDUwMDAwLCAweDUwMGNjLAotCQkweDUwNDAwLCAweDUwNDAwLAotCQkweDUwODAwLCAweDUwOGNjLAotCQkweDUwYzAwLCAweDUwYzAwLAotCQkweDUxMDAwLCAweDUxMDFjLAotCQkweDUxMzAwLCAweDUxMzA4LAotCX07Ci0KLQlpbnQgaTsKLQlzdHJ1Y3QgYWRhcHRlciAqYXAgPSBuZXRkZXYyYWRhcChkZXYpOwotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgKnJlZ19yYW5nZXM7Ci0JaW50IGFycl9zaXplID0gMCwgYnVmX3NpemUgPSAwOwotCi0JaWYgKGlzX3Q0KGFwLT5wYXJhbXMuY2hpcCkpIHsKLQkJcmVnX3JhbmdlcyA9ICZ0NF9yZWdfcmFuZ2VzWzBdOwotCQlhcnJfc2l6ZSA9IEFSUkFZX1NJWkUodDRfcmVnX3Jhbmdlcyk7Ci0JCWJ1Zl9zaXplID0gVDRfUkVHTUFQX1NJWkU7Ci0JfSBlbHNlIHsKLQkJcmVnX3JhbmdlcyA9ICZ0NV9yZWdfcmFuZ2VzWzBdOwotCQlhcnJfc2l6ZSA9IEFSUkFZX1NJWkUodDVfcmVnX3Jhbmdlcyk7Ci0JCWJ1Zl9zaXplID0gVDVfUkVHTUFQX1NJWkU7Ci0JfQotCi0JcmVncy0+dmVyc2lvbiA9IG1rX2FkYXBfdmVycyhhcCk7Ci0KLQltZW1zZXQoYnVmLCAwLCBidWZfc2l6ZSk7Ci0JZm9yIChpID0gMDsgaSA8IGFycl9zaXplOyBpICs9IDIpCi0JCXJlZ19ibG9ja19kdW1wKGFwLCBidWYsIHJlZ19yYW5nZXNbaV0sIHJlZ19yYW5nZXNbaSArIDFdKTsKLX0KLQotc3RhdGljIGludCByZXN0YXJ0X2F1dG9uZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQlpZiAocC0+bGlua19jZmcuYXV0b25lZyAhPSBBVVRPTkVHX0VOQUJMRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JdDRfcmVzdGFydF9hbmVnKHAtPmFkYXB0ZXIsIHAtPmFkYXB0ZXItPmZuLCBwLT50eF9jaGFuKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpZGVudGlmeV9wb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgZW51bSBldGh0b29sX3BoeXNfaWRfc3RhdGUgc3RhdGUpCi17Ci0JdW5zaWduZWQgaW50IHZhbDsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG5ldGRldjJhZGFwKGRldik7Ci0KLQlpZiAoc3RhdGUgPT0gRVRIVE9PTF9JRF9BQ1RJVkUpCi0JCXZhbCA9IDB4ZmZmZjsKLQllbHNlIGlmIChzdGF0ZSA9PSBFVEhUT09MX0lEX0lOQUNUSVZFKQotCQl2YWwgPSAwOwotCWVsc2UKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gdDRfaWRlbnRpZnlfcG9ydChhZGFwLCBhZGFwLT5mbiwgbmV0ZGV2MnBpbmZvKGRldiktPnZpaWQsIHZhbCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgZnJvbV9md19saW5rY2FwcyhlbnVtIGZ3X3BvcnRfdHlwZSB0eXBlLCB1bnNpZ25lZCBpbnQgY2FwcykKLXsKLQl1bnNpZ25lZCBpbnQgdiA9IDA7Ci0KLQlpZiAodHlwZSA9PSBGV19QT1JUX1RZUEVfQlRfU0dNSUkgfHwgdHlwZSA9PSBGV19QT1JUX1RZUEVfQlRfWEZJIHx8Ci0JICAgIHR5cGUgPT0gRldfUE9SVF9UWVBFX0JUX1hBVUkpIHsKLQkJdiB8PSBTVVBQT1JURURfVFA7Ci0JCWlmIChjYXBzICYgRldfUE9SVF9DQVBfU1BFRURfMTAwTSkKLQkJCXYgfD0gU1VQUE9SVEVEXzEwMGJhc2VUX0Z1bGw7Ci0JCWlmIChjYXBzICYgRldfUE9SVF9DQVBfU1BFRURfMUcpCi0JCQl2IHw9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKLQkJaWYgKGNhcHMgJiBGV19QT1JUX0NBUF9TUEVFRF8xMEcpCi0JCQl2IHw9IFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGw7Ci0JfSBlbHNlIGlmICh0eXBlID09IEZXX1BPUlRfVFlQRV9LWDQgfHwgdHlwZSA9PSBGV19QT1JUX1RZUEVfS1gpIHsKLQkJdiB8PSBTVVBQT1JURURfQmFja3BsYW5lOwotCQlpZiAoY2FwcyAmIEZXX1BPUlRfQ0FQX1NQRUVEXzFHKQotCQkJdiB8PSBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsOwotCQlpZiAoY2FwcyAmIEZXX1BPUlRfQ0FQX1NQRUVEXzEwRykKLQkJCXYgfD0gU1VQUE9SVEVEXzEwMDAwYmFzZUtYNF9GdWxsOwotCX0gZWxzZSBpZiAodHlwZSA9PSBGV19QT1JUX1RZUEVfS1IpCi0JCXYgfD0gU1VQUE9SVEVEX0JhY2twbGFuZSB8IFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsOwotCWVsc2UgaWYgKHR5cGUgPT0gRldfUE9SVF9UWVBFX0JQX0FQKQotCQl2IHw9IFNVUFBPUlRFRF9CYWNrcGxhbmUgfCBTVVBQT1JURURfMTAwMDBiYXNlUl9GRUMgfAotCQkgICAgIFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsIHwgU1VQUE9SVEVEXzEwMDBiYXNlS1hfRnVsbDsKLQllbHNlIGlmICh0eXBlID09IEZXX1BPUlRfVFlQRV9CUDRfQVApCi0JCXYgfD0gU1VQUE9SVEVEX0JhY2twbGFuZSB8IFNVUFBPUlRFRF8xMDAwMGJhc2VSX0ZFQyB8Ci0JCSAgICAgU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGwgfCBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsIHwKLQkJICAgICBTVVBQT1JURURfMTAwMDBiYXNlS1g0X0Z1bGw7Ci0JZWxzZSBpZiAodHlwZSA9PSBGV19QT1JUX1RZUEVfRklCRVJfWEZJIHx8Ci0JCSB0eXBlID09IEZXX1BPUlRfVFlQRV9GSUJFUl9YQVVJIHx8Ci0JCSB0eXBlID09IEZXX1BPUlRfVFlQRV9TRlAgfHwKLQkJIHR5cGUgPT0gRldfUE9SVF9UWVBFX1FTRlBfMTBHIHx8Ci0JCSB0eXBlID09IEZXX1BPUlRfVFlQRV9RU0EpIHsKLQkJdiB8PSBTVVBQT1JURURfRklCUkU7Ci0JCWlmIChjYXBzICYgRldfUE9SVF9DQVBfU1BFRURfMUcpCi0JCQl2IHw9IFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbDsKLQkJaWYgKGNhcHMgJiBGV19QT1JUX0NBUF9TUEVFRF8xMEcpCi0JCQl2IHw9IFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGw7Ci0JfSBlbHNlIGlmICh0eXBlID09IEZXX1BPUlRfVFlQRV9CUDQwX0JBIHx8Ci0JCSAgIHR5cGUgPT0gRldfUE9SVF9UWVBFX1FTRlApIHsKLQkJdiB8PSBTVVBQT1JURURfNDAwMDBiYXNlU1I0X0Z1bGw7Ci0JCXYgfD0gU1VQUE9SVEVEX0ZJQlJFOwotCX0KLQotCWlmIChjYXBzICYgRldfUE9SVF9DQVBfQU5FRykKLQkJdiB8PSBTVVBQT1JURURfQXV0b25lZzsKLQlyZXR1cm4gdjsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCB0b19md19saW5rY2Fwcyh1bnNpZ25lZCBpbnQgY2FwcykKLXsKLQl1bnNpZ25lZCBpbnQgdiA9IDA7Ci0KLQlpZiAoY2FwcyAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKLQkJdiB8PSBGV19QT1JUX0NBUF9TUEVFRF8xMDBNOwotCWlmIChjYXBzICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKLQkJdiB8PSBGV19QT1JUX0NBUF9TUEVFRF8xRzsKLQlpZiAoY2FwcyAmIEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsKQotCQl2IHw9IEZXX1BPUlRfQ0FQX1NQRUVEXzEwRzsKLQlpZiAoY2FwcyAmIEFEVkVSVElTRURfNDAwMDBiYXNlU1I0X0Z1bGwpCi0JCXYgfD0gRldfUE9SVF9DQVBfU1BFRURfNDBHOwotCXJldHVybiB2OwotfQotCi1zdGF0aWMgaW50IGdldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKLXsKLQljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmIChwLT5wb3J0X3R5cGUgPT0gRldfUE9SVF9UWVBFX0JUX1NHTUlJIHx8Ci0JICAgIHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfQlRfWEZJIHx8Ci0JICAgIHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfQlRfWEFVSSkKLQkJY21kLT5wb3J0ID0gUE9SVF9UUDsKLQllbHNlIGlmIChwLT5wb3J0X3R5cGUgPT0gRldfUE9SVF9UWVBFX0ZJQkVSX1hGSSB8fAotCQkgcC0+cG9ydF90eXBlID09IEZXX1BPUlRfVFlQRV9GSUJFUl9YQVVJKQotCQljbWQtPnBvcnQgPSBQT1JUX0ZJQlJFOwotCWVsc2UgaWYgKHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfU0ZQIHx8Ci0JCSBwLT5wb3J0X3R5cGUgPT0gRldfUE9SVF9UWVBFX1FTRlBfMTBHIHx8Ci0JCSBwLT5wb3J0X3R5cGUgPT0gRldfUE9SVF9UWVBFX1FTQSB8fAotCQkgcC0+cG9ydF90eXBlID09IEZXX1BPUlRfVFlQRV9RU0ZQKSB7Ci0JCWlmIChwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX0xSIHx8Ci0JCSAgICBwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX1NSIHx8Ci0JCSAgICBwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX0VSIHx8Ci0JCSAgICBwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX0xSTSkKLQkJCWNtZC0+cG9ydCA9IFBPUlRfRklCUkU7Ci0JCWVsc2UgaWYgKHAtPm1vZF90eXBlID09IEZXX1BPUlRfTU9EX1RZUEVfVFdJTkFYX1BBU1NJVkUgfHwKLQkJCSBwLT5tb2RfdHlwZSA9PSBGV19QT1JUX01PRF9UWVBFX1RXSU5BWF9BQ1RJVkUpCi0JCQljbWQtPnBvcnQgPSBQT1JUX0RBOwotCQllbHNlCi0JCQljbWQtPnBvcnQgPSBQT1JUX09USEVSOwotCX0gZWxzZQotCQljbWQtPnBvcnQgPSBQT1JUX09USEVSOwotCi0JaWYgKHAtPm1kaW9fYWRkciA+PSAwKSB7Ci0JCWNtZC0+cGh5X2FkZHJlc3MgPSBwLT5tZGlvX2FkZHI7Ci0JCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOwotCQljbWQtPm1kaW9fc3VwcG9ydCA9IHAtPnBvcnRfdHlwZSA9PSBGV19QT1JUX1RZUEVfQlRfU0dNSUkgPwotCQkJTURJT19TVVBQT1JUU19DMjIgOiBNRElPX1NVUFBPUlRTX0M0NTsKLQl9IGVsc2UgewotCQljbWQtPnBoeV9hZGRyZXNzID0gMDsgIC8qIG5vdCByZWFsbHksIGJ1dCBubyBiZXR0ZXIgb3B0aW9uICovCi0JCWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVSTkFMOwotCQljbWQtPm1kaW9fc3VwcG9ydCA9IDA7Ci0JfQotCi0JY21kLT5zdXBwb3J0ZWQgPSBmcm9tX2Z3X2xpbmtjYXBzKHAtPnBvcnRfdHlwZSwgcC0+bGlua19jZmcuc3VwcG9ydGVkKTsKLQljbWQtPmFkdmVydGlzaW5nID0gZnJvbV9md19saW5rY2FwcyhwLT5wb3J0X3R5cGUsCi0JCQkJCSAgICBwLT5saW5rX2NmZy5hZHZlcnRpc2luZyk7Ci0JZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwKLQkJCSAgICAgIG5ldGlmX2NhcnJpZXJfb2soZGV2KSA/IHAtPmxpbmtfY2ZnLnNwZWVkIDogMCk7Ci0JY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQljbWQtPmF1dG9uZWcgPSBwLT5saW5rX2NmZy5hdXRvbmVnOwotCWNtZC0+bWF4dHhwa3QgPSAwOwotCWNtZC0+bWF4cnhwa3QgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHNwZWVkX3RvX2NhcHMoaW50IHNwZWVkKQotewotCWlmIChzcGVlZCA9PSAxMDApCi0JCXJldHVybiBGV19QT1JUX0NBUF9TUEVFRF8xMDBNOwotCWlmIChzcGVlZCA9PSAxMDAwKQotCQlyZXR1cm4gRldfUE9SVF9DQVBfU1BFRURfMUc7Ci0JaWYgKHNwZWVkID09IDEwMDAwKQotCQlyZXR1cm4gRldfUE9SVF9DQVBfU1BFRURfMTBHOwotCWlmIChzcGVlZCA9PSA0MDAwMCkKLQkJcmV0dXJuIEZXX1BPUlRfQ0FQX1NQRUVEXzQwRzsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCi17Ci0JdW5zaWduZWQgaW50IGNhcDsKLQlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbGlua19jb25maWcgKmxjID0gJnAtPmxpbmtfY2ZnOwotCXUzMiBzcGVlZCA9IGV0aHRvb2xfY21kX3NwZWVkKGNtZCk7Ci0KLQlpZiAoY21kLT5kdXBsZXggIT0gRFVQTEVYX0ZVTEwpICAgICAvKiBvbmx5IGZ1bGwtZHVwbGV4IHN1cHBvcnRlZCAqLwotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghKGxjLT5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9BTkVHKSkgewotCQkvKgotCQkgKiBQSFkgb2ZmZXJzIGEgc2luZ2xlIHNwZWVkLiAgU2VlIGlmIHRoYXQncyB3aGF0J3MKLQkJICogYmVpbmcgcmVxdWVzdGVkLgotCQkgKi8KLQkJaWYgKGNtZC0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUgJiYKLQkJICAgIChsYy0+c3VwcG9ydGVkICYgc3BlZWRfdG9fY2FwcyhzcGVlZCkpKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChjbWQtPmF1dG9uZWcgPT0gQVVUT05FR19ESVNBQkxFKSB7Ci0JCWNhcCA9IHNwZWVkX3RvX2NhcHMoc3BlZWQpOwotCi0JCWlmICghKGxjLT5zdXBwb3J0ZWQgJiBjYXApIHx8Ci0JCSAgICAoc3BlZWQgPT0gMTAwMCkgfHwKLQkJICAgIChzcGVlZCA9PSAxMDAwMCkgfHwKLQkJICAgIChzcGVlZCA9PSA0MDAwMCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbGMtPnJlcXVlc3RlZF9zcGVlZCA9IGNhcDsKLQkJbGMtPmFkdmVydGlzaW5nID0gMDsKLQl9IGVsc2UgewotCQljYXAgPSB0b19md19saW5rY2FwcyhjbWQtPmFkdmVydGlzaW5nKTsKLQkJaWYgKCEobGMtPnN1cHBvcnRlZCAmIGNhcCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJbGMtPnJlcXVlc3RlZF9zcGVlZCA9IDA7Ci0JCWxjLT5hZHZlcnRpc2luZyA9IGNhcCB8IEZXX1BPUlRfQ0FQX0FORUc7Ci0JfQotCWxjLT5hdXRvbmVnID0gY21kLT5hdXRvbmVnOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJcmV0dXJuIHQ0X2xpbmtfc3RhcnQocC0+YWRhcHRlciwgcC0+YWRhcHRlci0+Zm4sIHAtPnR4X2NoYW4sCi0JCQkJICAgICBsYyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICplcGF1c2UpCi17Ci0Jc3RydWN0IHBvcnRfaW5mbyAqcCA9IG5ldGRldl9wcml2KGRldik7Ci0KLQllcGF1c2UtPmF1dG9uZWcgPSAocC0+bGlua19jZmcucmVxdWVzdGVkX2ZjICYgUEFVU0VfQVVUT05FRykgIT0gMDsKLQllcGF1c2UtPnJ4X3BhdXNlID0gKHAtPmxpbmtfY2ZnLmZjICYgUEFVU0VfUlgpICE9IDA7Ci0JZXBhdXNlLT50eF9wYXVzZSA9IChwLT5saW5rX2NmZy5mYyAmIFBBVVNFX1RYKSAhPSAwOwotfQotCi1zdGF0aWMgaW50IHNldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKmVwYXVzZSkKLXsKLQlzdHJ1Y3QgcG9ydF9pbmZvICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgbGlua19jb25maWcgKmxjID0gJnAtPmxpbmtfY2ZnOwotCi0JaWYgKGVwYXVzZS0+YXV0b25lZyA9PSBBVVRPTkVHX0RJU0FCTEUpCi0JCWxjLT5yZXF1ZXN0ZWRfZmMgPSAwOwotCWVsc2UgaWYgKGxjLT5zdXBwb3J0ZWQgJiBGV19QT1JUX0NBUF9BTkVHKQotCQlsYy0+cmVxdWVzdGVkX2ZjID0gUEFVU0VfQVVUT05FRzsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGVwYXVzZS0+cnhfcGF1c2UpCi0JCWxjLT5yZXF1ZXN0ZWRfZmMgfD0gUEFVU0VfUlg7Ci0JaWYgKGVwYXVzZS0+dHhfcGF1c2UpCi0JCWxjLT5yZXF1ZXN0ZWRfZmMgfD0gUEFVU0VfVFg7Ci0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJcmV0dXJuIHQ0X2xpbmtfc3RhcnQocC0+YWRhcHRlciwgcC0+YWRhcHRlci0+Zm4sIHAtPnR4X2NoYW4sCi0JCQkJICAgICBsYyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGdldF9zZ2VfcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICplKQotewotCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQljb25zdCBzdHJ1Y3Qgc2dlICpzID0gJnBpLT5hZGFwdGVyLT5zZ2U7Ci0KLQllLT5yeF9tYXhfcGVuZGluZyA9IE1BWF9SWF9CVUZGRVJTOwotCWUtPnJ4X21pbmlfbWF4X3BlbmRpbmcgPSBNQVhfUlNQUV9FTlRSSUVTOwotCWUtPnJ4X2p1bWJvX21heF9wZW5kaW5nID0gMDsKLQllLT50eF9tYXhfcGVuZGluZyA9IE1BWF9UWFFfRU5UUklFUzsKLQotCWUtPnJ4X3BlbmRpbmcgPSBzLT5ldGhyeHFbcGktPmZpcnN0X3FzZXRdLmZsLnNpemUgLSA4OwotCWUtPnJ4X21pbmlfcGVuZGluZyA9IHMtPmV0aHJ4cVtwaS0+Zmlyc3RfcXNldF0ucnNwcS5zaXplOwotCWUtPnJ4X2p1bWJvX3BlbmRpbmcgPSAwOwotCWUtPnR4X3BlbmRpbmcgPSBzLT5ldGh0eHFbcGktPmZpcnN0X3FzZXRdLnEuc2l6ZTsKLX0KLQotc3RhdGljIGludCBzZXRfc2dlX3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqZSkKLXsKLQlpbnQgaTsKLQljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBwaS0+YWRhcHRlcjsKLQlzdHJ1Y3Qgc2dlICpzID0gJmFkYXB0ZXItPnNnZTsKLQotCWlmIChlLT5yeF9wZW5kaW5nID4gTUFYX1JYX0JVRkZFUlMgfHwgZS0+cnhfanVtYm9fcGVuZGluZyB8fAotCSAgICBlLT50eF9wZW5kaW5nID4gTUFYX1RYUV9FTlRSSUVTIHx8Ci0JICAgIGUtPnJ4X21pbmlfcGVuZGluZyA+IE1BWF9SU1BRX0VOVFJJRVMgfHwKLQkgICAgZS0+cnhfbWluaV9wZW5kaW5nIDwgTUlOX1JTUFFfRU5UUklFUyB8fAotCSAgICBlLT5yeF9wZW5kaW5nIDwgTUlOX0ZMX0VOVFJJRVMgfHwgZS0+dHhfcGVuZGluZyA8IE1JTl9UWFFfRU5UUklFUykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWZvciAoaSA9IDA7IGkgPCBwaS0+bnFzZXRzOyArK2kpIHsKLQkJcy0+ZXRodHhxW3BpLT5maXJzdF9xc2V0ICsgaV0ucS5zaXplID0gZS0+dHhfcGVuZGluZzsKLQkJcy0+ZXRocnhxW3BpLT5maXJzdF9xc2V0ICsgaV0uZmwuc2l6ZSA9IGUtPnJ4X3BlbmRpbmcgKyA4OwotCQlzLT5ldGhyeHFbcGktPmZpcnN0X3FzZXQgKyBpXS5yc3BxLnNpemUgPSBlLT5yeF9taW5pX3BlbmRpbmc7Ci0JfQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGNsb3Nlc3RfdGltZXIoY29uc3Qgc3RydWN0IHNnZSAqcywgaW50IHRpbWUpCiB7CiAJaW50IGksIGRlbHRhLCBtYXRjaCA9IDAsIG1pbl9kZWx0YSA9IElOVF9NQVg7CkBAIC0yNTE1LDE5ICsxMzUyLDggQEAKIAlyZXR1cm4gbWF0Y2g7CiB9CiAKLS8qCi0gKiBSZXR1cm4gYSBxdWV1ZSdzIGludGVycnVwdCBob2xkLW9mZiB0aW1lIGluIHVzLiAgMCBtZWFucyBubyB0aW1lci4KLSAqLwotdW5zaWduZWQgaW50IHF0aW1lcl92YWwoY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXAsCi0JCQljb25zdCBzdHJ1Y3Qgc2dlX3JzcHEgKnEpCi17Ci0JdW5zaWduZWQgaW50IGlkeCA9IHEtPmludHJfcGFyYW1zID4+IDE7Ci0KLQlyZXR1cm4gaWR4IDwgU0dFX05USU1FUlMgPyBhZGFwLT5zZ2UudGltZXJfdmFsW2lkeF0gOiAwOwotfQotCiAvKioKLSAqCXNldF9yc3BxX2ludHJfcGFyYW1zIC0gc2V0IGEgcXVldWUncyBpbnRlcnJ1cHQgaG9sZG9mZiBwYXJhbWV0ZXJzCisgKgljeGdiNF9zZXRfcnNwcV9pbnRyX3BhcmFtcyAtIHNldCBhIHF1ZXVlJ3MgaW50ZXJydXB0IGhvbGRvZmYgcGFyYW1ldGVycwogICoJQHE6IHRoZSBSeCBxdWV1ZQogICoJQHVzOiB0aGUgaG9sZC1vZmYgdGltZSBpbiB1cywgb3IgMCB0byBkaXNhYmxlIHRpbWVyCiAgKglAY250OiB0aGUgaG9sZC1vZmYgcGFja2V0IGNvdW50LCBvciAwIHRvIGRpc2FibGUgY291bnRlcgpAQCAtMjUzNSw4ICsxMzYxLDggQEAKICAqCVNldHMgYW4gUnggcXVldWUncyBpbnRlcnJ1cHQgaG9sZC1vZmYgdGltZSBhbmQgcGFja2V0IGNvdW50LiAgQXQgbGVhc3QKICAqCW9uZSBvZiB0aGUgdHdvIG5lZWRzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBxdWV1ZSB0byBnZW5lcmF0ZSBpbnRlcnJ1cHRzLgogICovCi1zdGF0aWMgaW50IHNldF9yc3BxX2ludHJfcGFyYW1zKHN0cnVjdCBzZ2VfcnNwcSAqcSwKLQkJCQl1bnNpZ25lZCBpbnQgdXMsIHVuc2lnbmVkIGludCBjbnQpCitpbnQgY3hnYjRfc2V0X3JzcHFfaW50cl9wYXJhbXMoc3RydWN0IHNnZV9yc3BxICpxLAorCQkJICAgICAgIHVuc2lnbmVkIGludCB1cywgdW5zaWduZWQgaW50IGNudCkKIHsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHEtPmFkYXA7CiAKQEAgLTI1NjcsMjU5ICsxMzkzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqCi0gKiBzZXRfcnhfaW50cl9wYXJhbXMgLSBzZXQgYSBuZXQgZGV2aWNlcydzIFJYIGludGVycnVwdCBob2xkb2ZmIHBhcmFtZXRlIQotICogQGRldjogdGhlIG5ldHdvcmsgZGV2aWNlCi0gKiBAdXM6IHRoZSBob2xkLW9mZiB0aW1lIGluIHVzLCBvciAwIHRvIGRpc2FibGUgdGltZXIKLSAqIEBjbnQ6IHRoZSBob2xkLW9mZiBwYWNrZXQgY291bnQsIG9yIDAgdG8gZGlzYWJsZSBjb3VudGVyCi0gKgotICogU2V0IHRoZSBSWCBpbnRlcnJ1cHQgaG9sZC1vZmYgcGFyYW1ldGVycyBmb3IgYSBuZXR3b3JrIGRldmljZS4KLSAqLwotc3RhdGljIGludCBzZXRfcnhfaW50cl9wYXJhbXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHVuc2lnbmVkIGludCB1cywgdW5zaWduZWQgaW50IGNudCkKLXsKLQlpbnQgaSwgZXJyOwotCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBpLT5hZGFwdGVyOwotCXN0cnVjdCBzZ2VfZXRoX3J4cSAqcSA9ICZhZGFwLT5zZ2UuZXRocnhxW3BpLT5maXJzdF9xc2V0XTsKLQotCWZvciAoaSA9IDA7IGkgPCBwaS0+bnFzZXRzOyBpKyssIHErKykgewotCQllcnIgPSBzZXRfcnNwcV9pbnRyX3BhcmFtcygmcS0+cnNwcSwgdXMsIGNudCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZXRfYWRhcHRpdmVfcnhfc2V0dGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgYWRhcHRpdmVfcngpCi17Ci0JaW50IGk7Ci0Jc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBhZGFwdGVyICphZGFwID0gcGktPmFkYXB0ZXI7Ci0Jc3RydWN0IHNnZV9ldGhfcnhxICpxID0gJmFkYXAtPnNnZS5ldGhyeHFbcGktPmZpcnN0X3FzZXRdOwotCi0JZm9yIChpID0gMDsgaSA8IHBpLT5ucXNldHM7IGkrKywgcSsrKQotCQlxLT5yc3BxLmFkYXB0aXZlX3J4ID0gYWRhcHRpdmVfcng7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZXRfYWRhcHRpdmVfcnhfc2V0dGluZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IHBpLT5hZGFwdGVyOwotCXN0cnVjdCBzZ2VfZXRoX3J4cSAqcSA9ICZhZGFwLT5zZ2UuZXRocnhxW3BpLT5maXJzdF9xc2V0XTsKLQotCXJldHVybiBxLT5yc3BxLmFkYXB0aXZlX3J4OwotfQotCi1zdGF0aWMgaW50IHNldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqYykKLXsKLQlzZXRfYWRhcHRpdmVfcnhfc2V0dGluZyhkZXYsIGMtPnVzZV9hZGFwdGl2ZV9yeF9jb2FsZXNjZSk7Ci0JcmV0dXJuIHNldF9yeF9pbnRyX3BhcmFtcyhkZXYsIGMtPnJ4X2NvYWxlc2NlX3VzZWNzLAotCQkJCSAgYy0+cnhfbWF4X2NvYWxlc2NlZF9mcmFtZXMpOwotfQotCi1zdGF0aWMgaW50IGdldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSAqYykKLXsKLQljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7Ci0JY29uc3Qgc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBwaS0+YWRhcHRlcjsKLQljb25zdCBzdHJ1Y3Qgc2dlX3JzcHEgKnJxID0gJmFkYXAtPnNnZS5ldGhyeHFbcGktPmZpcnN0X3FzZXRdLnJzcHE7Ci0KLQljLT5yeF9jb2FsZXNjZV91c2VjcyA9IHF0aW1lcl92YWwoYWRhcCwgcnEpOwotCWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzID0gKHJxLT5pbnRyX3BhcmFtcyAmIFFJTlRSX0NOVF9FTikgPwotCQlhZGFwLT5zZ2UuY291bnRlcl92YWxbcnEtPnBrdGNudF9pZHhdIDogMDsKLQljLT51c2VfYWRhcHRpdmVfcnhfY29hbGVzY2UgPSBnZXRfYWRhcHRpdmVfcnhfc2V0dGluZyhkZXYpOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqCWVlcHJvbV9wdG92IC0gdHJhbnNsYXRlIGEgcGh5c2ljYWwgRUVQUk9NIGFkZHJlc3MgdG8gdmlydHVhbAotICoJQHBoeXNfYWRkcjogdGhlIHBoeXNpY2FsIEVFUFJPTSBhZGRyZXNzCi0gKglAZm46IHRoZSBQQ0kgZnVuY3Rpb24gbnVtYmVyCi0gKglAc3o6IHNpemUgb2YgZnVuY3Rpb24tc3BlY2lmaWMgYXJlYQotICoKLSAqCVRyYW5zbGF0ZSBhIHBoeXNpY2FsIEVFUFJPTSBhZGRyZXNzIHRvIHZpcnR1YWwuICBUaGUgZmlyc3QgMUsgaXMKLSAqCWFjY2Vzc2VkIHRocm91Z2ggdmlydHVhbCBhZGRyZXNzZXMgc3RhcnRpbmcgYXQgMzFLLCB0aGUgcmVzdCBpcwotICoJYWNjZXNzZWQgdGhyb3VnaCB2aXJ0dWFsIGFkZHJlc3NlcyBzdGFydGluZyBhdCAwLgotICoKLSAqCVRoZSBtYXBwaW5nIGlzIGFzIGZvbGxvd3M6Ci0gKglbMC4uMUspIC0+IFszMUsuLjMySykKLSAqCVsxSy4uMUsrQSkgLT4gWzMxSy1BLi4zMUspCi0gKglbMUsrQS4uRVMpIC0+IFswLi5FUy1BLTFLKQotICoKLSAqCXdoZXJlIEEgPSBAZm4gKiBAc3osIGFuZCBFUyA9IEVFUFJPTSBzaXplLgotICovCi1zdGF0aWMgaW50IGVlcHJvbV9wdG92KHVuc2lnbmVkIGludCBwaHlzX2FkZHIsIHVuc2lnbmVkIGludCBmbiwgdW5zaWduZWQgaW50IHN6KQotewotCWZuICo9IHN6OwotCWlmIChwaHlzX2FkZHIgPCAxMDI0KQotCQlyZXR1cm4gcGh5c19hZGRyICsgKDMxIDw8IDEwKTsKLQlpZiAocGh5c19hZGRyIDwgMTAyNCArIGZuKQotCQlyZXR1cm4gMzE3NDQgLSBmbiArIHBoeXNfYWRkciAtIDEwMjQ7Ci0JaWYgKHBoeXNfYWRkciA8IEVFUFJPTVNJWkUpCi0JCXJldHVybiBwaHlzX2FkZHIgLSAxMDI0IC0gZm47Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qCi0gKiBUaGUgbmV4dCB0d28gcm91dGluZXMgaW1wbGVtZW50IGVlcHJvbSByZWFkL3dyaXRlIGZyb20gcGh5c2ljYWwgYWRkcmVzc2VzLgotICovCi1zdGF0aWMgaW50IGVlcHJvbV9yZF9waHlzKHN0cnVjdCBhZGFwdGVyICphZGFwLCB1bnNpZ25lZCBpbnQgcGh5c19hZGRyLCB1MzIgKnYpCi17Ci0JaW50IHZhZGRyID0gZWVwcm9tX3B0b3YocGh5c19hZGRyLCBhZGFwLT5mbiwgRUVQUk9NUEZTSVpFKTsKLQotCWlmICh2YWRkciA+PSAwKQotCQl2YWRkciA9IHBjaV9yZWFkX3ZwZChhZGFwLT5wZGV2LCB2YWRkciwgc2l6ZW9mKHUzMiksIHYpOwotCXJldHVybiB2YWRkciA8IDAgPyB2YWRkciA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgZWVwcm9tX3dyX3BoeXMoc3RydWN0IGFkYXB0ZXIgKmFkYXAsIHVuc2lnbmVkIGludCBwaHlzX2FkZHIsIHUzMiB2KQotewotCWludCB2YWRkciA9IGVlcHJvbV9wdG92KHBoeXNfYWRkciwgYWRhcC0+Zm4sIEVFUFJPTVBGU0laRSk7Ci0KLQlpZiAodmFkZHIgPj0gMCkKLQkJdmFkZHIgPSBwY2lfd3JpdGVfdnBkKGFkYXAtPnBkZXYsIHZhZGRyLCBzaXplb2YodTMyKSwgJnYpOwotCXJldHVybiB2YWRkciA8IDAgPyB2YWRkciA6IDA7Ci19Ci0KLSNkZWZpbmUgRUVQUk9NX01BR0lDIDB4MzhFMkYxMEMKLQotc3RhdGljIGludCBnZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZSwKLQkJICAgICAgdTggKmRhdGEpCi17Ci0JaW50IGksIGVyciA9IDA7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXYyYWRhcChkZXYpOwotCi0JdTggKmJ1ZiA9IGttYWxsb2MoRUVQUk9NU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZS0+bWFnaWMgPSBFRVBST01fTUFHSUM7Ci0JZm9yIChpID0gZS0+b2Zmc2V0ICYgfjM7ICFlcnIgJiYgaSA8IGUtPm9mZnNldCArIGUtPmxlbjsgaSArPSA0KQotCQllcnIgPSBlZXByb21fcmRfcGh5cyhhZGFwdGVyLCBpLCAodTMyICopJmJ1ZltpXSk7Ci0KLQlpZiAoIWVycikKLQkJbWVtY3B5KGRhdGEsIGJ1ZiArIGUtPm9mZnNldCwgZS0+bGVuKTsKLQlrZnJlZShidWYpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwKLQkJICAgICAgdTggKmRhdGEpCi17Ci0JdTggKmJ1ZjsKLQlpbnQgZXJyID0gMDsKLQl1MzIgYWxpZ25lZF9vZmZzZXQsIGFsaWduZWRfbGVuLCAqcDsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldjJhZGFwKGRldik7Ci0KLQlpZiAoZWVwcm9tLT5tYWdpYyAhPSBFRVBST01fTUFHSUMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JYWxpZ25lZF9vZmZzZXQgPSBlZXByb20tPm9mZnNldCAmIH4zOwotCWFsaWduZWRfbGVuID0gKGVlcHJvbS0+bGVuICsgKGVlcHJvbS0+b2Zmc2V0ICYgMykgKyAzKSAmIH4zOwotCi0JaWYgKGFkYXB0ZXItPmZuID4gMCkgewotCQl1MzIgc3RhcnQgPSAxMDI0ICsgYWRhcHRlci0+Zm4gKiBFRVBST01QRlNJWkU7Ci0KLQkJaWYgKGFsaWduZWRfb2Zmc2V0IDwgc3RhcnQgfHwKLQkJICAgIGFsaWduZWRfb2Zmc2V0ICsgYWxpZ25lZF9sZW4gPiBzdGFydCArIEVFUFJPTVBGU0laRSkKLQkJCXJldHVybiAtRVBFUk07Ci0JfQotCi0JaWYgKGFsaWduZWRfb2Zmc2V0ICE9IGVlcHJvbS0+b2Zmc2V0IHx8IGFsaWduZWRfbGVuICE9IGVlcHJvbS0+bGVuKSB7Ci0JCS8qCi0JCSAqIFJNVyBwb3NzaWJseSBuZWVkZWQgZm9yIGZpcnN0IG9yIGxhc3Qgd29yZHMuCi0JCSAqLwotCQlidWYgPSBrbWFsbG9jKGFsaWduZWRfbGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWYpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQkJZXJyID0gZWVwcm9tX3JkX3BoeXMoYWRhcHRlciwgYWxpZ25lZF9vZmZzZXQsICh1MzIgKilidWYpOwotCQlpZiAoIWVyciAmJiBhbGlnbmVkX2xlbiA+IDQpCi0JCQllcnIgPSBlZXByb21fcmRfcGh5cyhhZGFwdGVyLAotCQkJCQkgICAgIGFsaWduZWRfb2Zmc2V0ICsgYWxpZ25lZF9sZW4gLSA0LAotCQkJCQkgICAgICh1MzIgKikmYnVmW2FsaWduZWRfbGVuIC0gNF0pOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7Ci0JCW1lbWNweShidWYgKyAoZWVwcm9tLT5vZmZzZXQgJiAzKSwgZGF0YSwgZWVwcm9tLT5sZW4pOwotCX0gZWxzZQotCQlidWYgPSBkYXRhOwotCi0JZXJyID0gdDRfc2VlcHJvbV93cChhZGFwdGVyLCBmYWxzZSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLQlmb3IgKHAgPSAodTMyICopYnVmOyAhZXJyICYmIGFsaWduZWRfbGVuOyBhbGlnbmVkX2xlbiAtPSA0LCBwKyspIHsKLQkJZXJyID0gZWVwcm9tX3dyX3BoeXMoYWRhcHRlciwgYWxpZ25lZF9vZmZzZXQsICpwKTsKLQkJYWxpZ25lZF9vZmZzZXQgKz0gNDsKLQl9Ci0KLQlpZiAoIWVycikKLQkJZXJyID0gdDRfc2VlcHJvbV93cChhZGFwdGVyLCB0cnVlKTsKLW91dDoKLQlpZiAoYnVmICE9IGRhdGEpCi0JCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBzZXRfZmxhc2goc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgc3RydWN0IGV0aHRvb2xfZmxhc2ggKmVmKQotewotCWludCByZXQ7Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcCA9IG5ldGRldjJhZGFwKG5ldGRldik7Ci0JdW5zaWduZWQgaW50IG1ib3ggPSBQQ0lFX0ZXX01BU1RFUl9NICsgMTsKLQotCWVmLT5kYXRhW3NpemVvZihlZi0+ZGF0YSkgLSAxXSA9ICdcMCc7Ci0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGVmLT5kYXRhLCBhZGFwLT5wZGV2X2Rldik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBJZiB0aGUgYWRhcHRlciBoYXMgYmVlbiBmdWxseSBpbml0aWFsaXplZCB0aGVuIHdlJ2xsIGdvIGFoZWFkIGFuZAotCSAqIHRyeSB0byBnZXQgdGhlIGZpcm13YXJlJ3MgY29vcGVyYXRpb24gaW4gdXBncmFkaW5nIHRvIHRoZSBuZXcKLQkgKiBmaXJtd2FyZSBpbWFnZSBvdGhlcndpc2Ugd2UnbGwgdHJ5IHRvIGRvIHRoZSBlbnRpcmUgam9iIGZyb20gdGhlCi0JICogaG9zdCAuLi4gYW5kIHdlIGFsd2F5cyAiZm9yY2UiIHRoZSBvcGVyYXRpb24gaW4gdGhpcyBwYXRoLgotCSAqLwotCWlmIChhZGFwLT5mbGFncyAmIEZVTExfSU5JVF9ET05FKQotCQltYm94ID0gYWRhcC0+bWJveDsKLQotCXJldCA9IHQ0X2Z3X3VwZ3JhZGUoYWRhcCwgbWJveCwgZnctPmRhdGEsIGZ3LT5zaXplLCAxKTsKLQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQlpZiAoIXJldCkKLQkJZGV2X2luZm8oYWRhcC0+cGRldl9kZXYsICJsb2FkZWQgZmlybXdhcmUgJXMsIgotCQkJICIgcmVsb2FkIGN4Z2I0IGRyaXZlclxuIiwgZWYtPmRhdGEpOwotCXJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgV09MX1NVUFBPUlRFRCAoV0FLRV9CQ0FTVCB8IFdBS0VfTUFHSUMpCi0jZGVmaW5lIEJDQVNUX0NSQyAweGEwY2NjMWE2Ci0KLXN0YXRpYyB2b2lkIGdldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQotewotCXdvbC0+c3VwcG9ydGVkID0gV0FLRV9CQ0FTVCB8IFdBS0VfTUFHSUM7Ci0Jd29sLT53b2xvcHRzID0gbmV0ZGV2MmFkYXAoZGV2KS0+d29sOwotCW1lbXNldCgmd29sLT5zb3Bhc3MsIDAsIHNpemVvZih3b2wtPnNvcGFzcykpOwotfQotCi1zdGF0aWMgaW50IHNldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQotewotCWludCBlcnIgPSAwOwotCXN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCWlmICh3b2wtPndvbG9wdHMgJiB+V09MX1NVUFBPUlRFRCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JdDRfd29sX21hZ2ljX2VuYWJsZShwaS0+YWRhcHRlciwgcGktPnR4X2NoYW4sCi0JCQkgICAgKHdvbC0+d29sb3B0cyAmIFdBS0VfTUFHSUMpID8gZGV2LT5kZXZfYWRkciA6IE5VTEwpOwotCWlmICh3b2wtPndvbG9wdHMgJiBXQUtFX0JDQVNUKSB7Ci0JCWVyciA9IHQ0X3dvbF9wYXRfZW5hYmxlKHBpLT5hZGFwdGVyLCBwaS0+dHhfY2hhbiwgMHhmZSwgfjBVTEwsCi0JCQkJCX4wVUxMLCAwLCBmYWxzZSk7Ci0JCWlmICghZXJyKQotCQkJZXJyID0gdDRfd29sX3BhdF9lbmFibGUocGktPmFkYXB0ZXIsIHBpLT50eF9jaGFuLCAxLAotCQkJCQkJfjZVTEwsIH4wVUxMLCBCQ0FTVF9DUkMsIHRydWUpOwotCX0gZWxzZQotCQl0NF93b2xfcGF0X2VuYWJsZShwaS0+YWRhcHRlciwgcGktPnR4X2NoYW4sIDAsIDAsIDAsIDAsIGZhbHNlKTsKLQlyZXR1cm4gZXJyOwotfQotCiBzdGF0aWMgaW50IGN4Z2Jfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTI4MzcsMTQ0ICsxNDEwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdTMyIGdldF9yc3NfdGFibGVfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXJldHVybiBwaS0+cnNzX3NpemU7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X3Jzc190YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgKnAsIHU4ICprZXksIHU4ICpoZnVuYykKLXsKLQljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgaW50IG4gPSBwaS0+cnNzX3NpemU7Ci0KLQlpZiAoaGZ1bmMpCi0JCSpoZnVuYyA9IEVUSF9SU1NfSEFTSF9UT1A7Ci0JaWYgKCFwKQotCQlyZXR1cm4gMDsKLQl3aGlsZSAobi0tKQotCQlwW25dID0gcGktPnJzc1tuXTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZXRfcnNzX3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHUzMiAqcCwgY29uc3QgdTggKmtleSwKLQkJCSBjb25zdCB1OCBoZnVuYykKLXsKLQl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7Ci0KLQkvKiBXZSByZXF1aXJlIGF0IGxlYXN0IG9uZSBzdXBwb3J0ZWQgcGFyYW1ldGVyIHRvIGJlIGNoYW5nZWQgYW5kIG5vCi0JICogY2hhbmdlIGluIGFueSBvZiB0aGUgdW5zdXBwb3J0ZWQgcGFyYW1ldGVycwotCSAqLwotCWlmIChrZXkgfHwKLQkgICAgKGhmdW5jICE9IEVUSF9SU1NfSEFTSF9OT19DSEFOR0UgJiYgaGZ1bmMgIT0gRVRIX1JTU19IQVNIX1RPUCkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQlpZiAoIXApCi0JCXJldHVybiAwOwotCi0JZm9yIChpID0gMDsgaSA8IHBpLT5yc3Nfc2l6ZTsgaSsrKQotCQlwaS0+cnNzW2ldID0gcFtpXTsKLQlpZiAocGktPmFkYXB0ZXItPmZsYWdzICYgRlVMTF9JTklUX0RPTkUpCi0JCXJldHVybiB3cml0ZV9yc3MocGksIHBpLT5yc3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldF9yeG5mYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqaW5mbywKLQkJICAgICB1MzIgKnJ1bGVzKQotewotCWNvbnN0IHN0cnVjdCBwb3J0X2luZm8gKnBpID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXN3aXRjaCAoaW5mby0+Y21kKSB7Ci0JY2FzZSBFVEhUT09MX0dSWEZIOiB7Ci0JCXVuc2lnbmVkIGludCB2ID0gcGktPnJzc19tb2RlOwotCi0JCWluZm8tPmRhdGEgPSAwOwotCQlzd2l0Y2ggKGluZm8tPmZsb3dfdHlwZSkgewotCQljYXNlIFRDUF9WNF9GTE9XOgotCQkJaWYgKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9JUDRGT1VSVFVQRU5fRikKLQkJCQlpbmZvLT5kYXRhID0gUlhIX0lQX1NSQyB8IFJYSF9JUF9EU1QgfAotCQkJCQkgICAgIFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMzsKLQkJCWVsc2UgaWYgKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9JUDRUV09UVVBFTl9GKQotCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVDsKLQkJCWJyZWFrOwotCQljYXNlIFVEUF9WNF9GTE9XOgotCQkJaWYgKCh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA0Rk9VUlRVUEVOX0YpICYmCi0JCQkgICAgKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9VRFBFTl9GKSkKLQkJCQlpbmZvLT5kYXRhID0gUlhIX0lQX1NSQyB8IFJYSF9JUF9EU1QgfAotCQkJCQkgICAgIFJYSF9MNF9CXzBfMSB8IFJYSF9MNF9CXzJfMzsKLQkJCWVsc2UgaWYgKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9JUDRUV09UVVBFTl9GKQotCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVDsKLQkJCWJyZWFrOwotCQljYXNlIFNDVFBfVjRfRkxPVzoKLQkJY2FzZSBBSF9FU1BfVjRfRkxPVzoKLQkJY2FzZSBJUFY0X0ZMT1c6Ci0JCQlpZiAodiAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNFRXT1RVUEVOX0YpCi0JCQkJaW5mby0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUOwotCQkJYnJlYWs7Ci0JCWNhc2UgVENQX1Y2X0ZMT1c6Ci0JCQlpZiAodiAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNkZPVVJUVVBFTl9GKQotCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVCB8Ci0JCQkJCSAgICAgUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOwotCQkJZWxzZSBpZiAodiAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNlRXT1RVUEVOX0YpCi0JCQkJaW5mby0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUOwotCQkJYnJlYWs7Ci0JCWNhc2UgVURQX1Y2X0ZMT1c6Ci0JCQlpZiAoKHYgJiBGV19SU1NfVklfQ09ORklHX0NNRF9JUDZGT1VSVFVQRU5fRikgJiYKLQkJCSAgICAodiAmIEZXX1JTU19WSV9DT05GSUdfQ01EX1VEUEVOX0YpKQotCQkJCWluZm8tPmRhdGEgPSBSWEhfSVBfU1JDIHwgUlhIX0lQX0RTVCB8Ci0JCQkJCSAgICAgUlhIX0w0X0JfMF8xIHwgUlhIX0w0X0JfMl8zOwotCQkJZWxzZSBpZiAodiAmIEZXX1JTU19WSV9DT05GSUdfQ01EX0lQNlRXT1RVUEVOX0YpCi0JCQkJaW5mby0+ZGF0YSA9IFJYSF9JUF9TUkMgfCBSWEhfSVBfRFNUOwotCQkJYnJlYWs7Ci0JCWNhc2UgU0NUUF9WNl9GTE9XOgotCQljYXNlIEFIX0VTUF9WNl9GTE9XOgotCQljYXNlIElQVjZfRkxPVzoKLQkJCWlmICh2ICYgRldfUlNTX1ZJX0NPTkZJR19DTURfSVA2VFdPVFVQRU5fRikKLQkJCQlpbmZvLT5kYXRhID0gUlhIX0lQX1NSQyB8IFJYSF9JUF9EU1Q7Ci0JCQlicmVhazsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0JY2FzZSBFVEhUT09MX0dSWFJJTkdTOgotCQlpbmZvLT5kYXRhID0gcGktPm5xc2V0czsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBjeGdiX2V0aHRvb2xfb3BzID0gewotCS5nZXRfc2V0dGluZ3MgICAgICA9IGdldF9zZXR0aW5ncywKLQkuc2V0X3NldHRpbmdzICAgICAgPSBzZXRfc2V0dGluZ3MsCi0JLmdldF9kcnZpbmZvICAgICAgID0gZ2V0X2RydmluZm8sCi0JLmdldF9tc2dsZXZlbCAgICAgID0gZ2V0X21zZ2xldmVsLAotCS5zZXRfbXNnbGV2ZWwgICAgICA9IHNldF9tc2dsZXZlbCwKLQkuZ2V0X3JpbmdwYXJhbSAgICAgPSBnZXRfc2dlX3BhcmFtLAotCS5zZXRfcmluZ3BhcmFtICAgICA9IHNldF9zZ2VfcGFyYW0sCi0JLmdldF9jb2FsZXNjZSAgICAgID0gZ2V0X2NvYWxlc2NlLAotCS5zZXRfY29hbGVzY2UgICAgICA9IHNldF9jb2FsZXNjZSwKLQkuZ2V0X2VlcHJvbV9sZW4gICAgPSBnZXRfZWVwcm9tX2xlbiwKLQkuZ2V0X2VlcHJvbSAgICAgICAgPSBnZXRfZWVwcm9tLAotCS5zZXRfZWVwcm9tICAgICAgICA9IHNldF9lZXByb20sCi0JLmdldF9wYXVzZXBhcmFtICAgID0gZ2V0X3BhdXNlcGFyYW0sCi0JLnNldF9wYXVzZXBhcmFtICAgID0gc2V0X3BhdXNlcGFyYW0sCi0JLmdldF9saW5rICAgICAgICAgID0gZXRodG9vbF9vcF9nZXRfbGluaywKLQkuZ2V0X3N0cmluZ3MgICAgICAgPSBnZXRfc3RyaW5ncywKLQkuc2V0X3BoeXNfaWQgICAgICAgPSBpZGVudGlmeV9wb3J0LAotCS5ud2F5X3Jlc2V0ICAgICAgICA9IHJlc3RhcnRfYXV0b25lZywKLQkuZ2V0X3NzZXRfY291bnQgICAgPSBnZXRfc3NldF9jb3VudCwKLQkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBnZXRfc3RhdHMsCi0JLmdldF9yZWdzX2xlbiAgICAgID0gZ2V0X3JlZ3NfbGVuLAotCS5nZXRfcmVncyAgICAgICAgICA9IGdldF9yZWdzLAotCS5nZXRfd29sICAgICAgICAgICA9IGdldF93b2wsCi0JLnNldF93b2wgICAgICAgICAgID0gc2V0X3dvbCwKLQkuZ2V0X3J4bmZjICAgICAgICAgPSBnZXRfcnhuZmMsCi0JLmdldF9yeGZoX2luZGlyX3NpemUgPSBnZXRfcnNzX3RhYmxlX3NpemUsCi0JLmdldF9yeGZoCSAgID0gZ2V0X3Jzc190YWJsZSwKLQkuc2V0X3J4ZmgJICAgPSBzZXRfcnNzX3RhYmxlLAotCS5mbGFzaF9kZXZpY2UgICAgICA9IHNldF9mbGFzaCwKLX07Ci0KIHN0YXRpYyBpbnQgc2V0dXBfZGVidWdmcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKIHsKIAlpZiAoSVNfRVJSX09SX05VTEwoYWRhcC0+ZGVidWdmc19yb290KSkKQEAgLTQyNDQsMTkgKzI2NzksMTIgQEAKIAogc3RhdGljIHZvaWQgY3hnYl9kb3duKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQogewotCXQ0X2ludHJfZGlzYWJsZShhZGFwdGVyKTsKIAljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT50aWRfcmVsZWFzZV90YXNrKTsKIAljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5kYl9mdWxsX3Rhc2spOwogCWNhbmNlbF93b3JrX3N5bmMoJmFkYXB0ZXItPmRiX2Ryb3BfdGFzayk7CiAJYWRhcHRlci0+dGlkX3JlbGVhc2VfdGFza19idXN5ID0gZmFsc2U7CiAJYWRhcHRlci0+dGlkX3JlbGVhc2VfaGVhZCA9IE5VTEw7CiAKLQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBVU0lOR19NU0lYKSB7Ci0JCWZyZWVfbXNpeF9xdWV1ZV9pcnFzKGFkYXB0ZXIpOwotCQlmcmVlX2lycShhZGFwdGVyLT5tc2l4X2luZm9bMF0udmVjLCBhZGFwdGVyKTsKLQl9IGVsc2UKLQkJZnJlZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxLCBhZGFwdGVyKTsKLQlxdWllc2NlX3J4KGFkYXB0ZXIpOwogCXQ0X3NnZV9zdG9wKGFkYXB0ZXIpOwogCXQ0X2ZyZWVfc2dlX3Jlc291cmNlcyhhZGFwdGVyKTsKIAlhZGFwdGVyLT5mbGFncyAmPSB+RlVMTF9JTklUX0RPTkU7CkBAIC00NTgwLDYgKzMwMDgsMTAgQEAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyICA9IGN4Z2JfbmV0cG9sbCwKICNlbmRpZgorI2lmZGVmIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UKKwkubmRvX2Zjb2VfZW5hYmxlICAgICAgPSBjeGdiX2Zjb2VfZW5hYmxlLAorCS5uZG9fZmNvZV9kaXNhYmxlICAgICA9IGN4Z2JfZmNvZV9kaXNhYmxlLAorI2VuZGlmIC8qIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UgKi8KICNpZmRlZiBDT05GSUdfTkVUX1JYX0JVU1lfUE9MTAogCS5uZG9fYnVzeV9wb2xsICAgICAgICA9IGN4Z2JfYnVzeV9wb2xsLAogI2VuZGlmCkBAIC00NzMzLDggKzMxNjUsOSBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gdDRfY2ZnX3BmdmYoYWRhcCwgYWRhcC0+Zm4sIGFkYXAtPmZuLCAwLCBNQVhfRUdSUSwgNjQsIE1BWF9JTkdRLAotCQkJICAwLCAwLCA0LCAweGYsIDB4ZiwgMTYsIEZXX0NNRF9DQVBfUEYsIEZXX0NNRF9DQVBfUEYpOworCXJldCA9IHQ0X2NmZ19wZnZmKGFkYXAsIGFkYXAtPmZuLCBhZGFwLT5mbiwgMCwgYWRhcC0+c2dlLmVncl9zeiwgNjQsCisJCQkgIE1BWF9JTkdRLCAwLCAwLCA0LCAweGYsIDB4ZiwgMTYsIEZXX0NNRF9DQVBfUEYsCisJCQkgIEZXX0NNRF9DQVBfUEYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC01MDg4LDEwICszNTIxLDE1IEBACiAJZW51bSBkZXZfc3RhdGUgc3RhdGU7CiAJdTMyIHBhcmFtc1s3XSwgdmFsWzddOwogCXN0cnVjdCBmd19jYXBzX2NvbmZpZ19jbWQgY2Fwc19jbWQ7Ci0Jc3RydWN0IGZ3X2RldmxvZ19jbWQgZGV2bG9nX2NtZDsKLQl1MzIgZGV2bG9nX21lbWluZm87CiAJaW50IHJlc2V0ID0gMTsKIAorCS8qIEdyYWIgRmlybXdhcmUgRGV2aWNlIExvZyBwYXJhbWV0ZXJzIGFzIGVhcmx5IGFzIHBvc3NpYmxlIHNvIHdlIGhhdmUKKwkgKiBhY2Nlc3MgdG8gaXQgZm9yIGRlYnVnZ2luZywgZXRjLgorCSAqLworCXJldCA9IHQ0X2luaXRfZGV2bG9nX3BhcmFtcyhhZGFwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwogCS8qIENvbnRhY3QgRlcsIGFkdmVydGlzaW5nIE1hc3RlciBjYXBhYmlsaXR5ICovCiAJcmV0ID0gdDRfZndfaGVsbG8oYWRhcCwgYWRhcC0+bWJveCwgYWRhcC0+bWJveCwgTUFTVEVSX01BWSwgJnN0YXRlKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNTE2OSwzMCArMzYwNyw2IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gYnllOwogCi0JLyogUmVhZCBmaXJtd2FyZSBkZXZpY2UgbG9nIHBhcmFtZXRlcnMuICBXZSByZWFsbHkgbmVlZCB0byBmaW5kIGEgd2F5Ci0JICogdG8gZ2V0IHRoZXNlIHBhcmFtZXRlcnMgaW5pdGlhbGl6ZWQgd2l0aCBzb21lIGRlZmF1bHQgdmFsdWVzICh3aGljaAotCSAqIGFyZSBsaWtlbHkgdG8gYmUgY29ycmVjdCkgZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGVpdGhlciBkb24ndAotCSAqIGF0dGFjaGUgdG8gdGhlIGZpcm13YXJlIG9yIGl0J3MgY3Jhc2hlZCB3aGVuIHdlIHByb2JlIHRoZSBhZGFwdGVyLgotCSAqIFRoYXQgd2F5IHdlJ2xsIHN0aWxsIGJlIGFibGUgdG8gcGVyZm9ybSBlYXJseSBmaXJtd2FyZSBzdGFydHVwCi0JICogZGVidWdnaW5nIC4uLiAgSWYgdGhlIHJlcXVlc3QgdG8gZ2V0IHRoZSBGaXJtd2FyZSdzIERldmljZSBMb2cKLQkgKiBwYXJhbWV0ZXJzIGZhaWxzLCB3ZSdsbCBsaXZlIHNvIHdlIGRvbid0IG1ha2UgdGhhdCBhIGZhdGFsIGVycm9yLgotCSAqLwotCW1lbXNldCgmZGV2bG9nX2NtZCwgMCwgc2l6ZW9mKGRldmxvZ19jbWQpKTsKLQlkZXZsb2dfY21kLm9wX3RvX3dyaXRlID0gaHRvbmwoRldfQ01EX09QX1YoRldfREVWTE9HX0NNRCkgfAotCQkJCSAgICAgICBGV19DTURfUkVRVUVTVF9GIHwgRldfQ01EX1JFQURfRik7Ci0JZGV2bG9nX2NtZC5yZXR2YWxfbGVuMTYgPSBodG9ubChGV19MRU4xNihkZXZsb2dfY21kKSk7Ci0JcmV0ID0gdDRfd3JfbWJveChhZGFwLCBhZGFwLT5tYm94LCAmZGV2bG9nX2NtZCwgc2l6ZW9mKGRldmxvZ19jbWQpLAotCQkJICZkZXZsb2dfY21kKTsKLQlpZiAocmV0ID09IDApIHsKLQkJZGV2bG9nX21lbWluZm8gPQotCQkJbnRvaGwoZGV2bG9nX2NtZC5tZW10eXBlX2RldmxvZ19tZW1hZGRyMTZfZGV2bG9nKTsKLQkJYWRhcC0+cGFyYW1zLmRldmxvZy5tZW10eXBlID0KLQkJCUZXX0RFVkxPR19DTURfTUVNVFlQRV9ERVZMT0dfRyhkZXZsb2dfbWVtaW5mbyk7Ci0JCWFkYXAtPnBhcmFtcy5kZXZsb2cuc3RhcnQgPQotCQkJRldfREVWTE9HX0NNRF9NRU1BRERSMTZfREVWTE9HX0coZGV2bG9nX21lbWluZm8pIDw8IDQ7Ci0JCWFkYXAtPnBhcmFtcy5kZXZsb2cuc2l6ZSA9IG50b2hsKGRldmxvZ19jbWQubWVtc2l6ZV9kZXZsb2cpOwotCX0KLQogCS8qCiAJICogRmluZCBvdXQgd2hhdCBwb3J0cyBhcmUgYXZhaWxhYmxlIHRvIHVzLiAgTm90ZSB0aGF0IHdlIG5lZWQgdG8gZG8KIAkgKiB0aGlzIGJlZm9yZSBjYWxsaW5nIGFkYXBfaW5pdDBfbm9fY29uZmlnKCkgc2luY2UgaXQgbmVlZHMgbnBvcnRzCkBAIC01MjkzLDYgKzM3MDcsNTEgQEAKIAlhZGFwLT50aWRzLm5mdGlkcyA9IHZhbFs0XSAtIHZhbFszXSArIDE7CiAJYWRhcC0+c2dlLmluZ3Jfc3RhcnQgPSB2YWxbNV07CiAKKwkvKiBxaWRzIChpbmdyZXNzL2VncmVzcykgcmV0dXJuZWQgZnJvbSBmaXJtd2FyZSBjYW4gYmUgYW55d2hlcmUKKwkgKiBpbiB0aGUgcmFuZ2UgZnJvbSBFUShJUUZMSU5UKV9TVEFSVCB0byBFUShJUUZMSU5UKV9FTkQuCisJICogSGVuY2UgZHJpdmVyIG5lZWRzIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhpcyByYW5nZSB0bworCSAqIHN0b3JlIHRoZSBxdWV1ZSBpbmZvLiBHZXQgdGhlIGhpZ2hlc3QgSVFGTElOVC9FUSBpbmRleCByZXR1cm5lZAorCSAqIGluIEZXX0VRXypfQ01ELmFsbG9jIGNvbW1hbmQuCisJICovCisJcGFyYW1zWzBdID0gRldfUEFSQU1fUEZWRihFUV9FTkQpOworCXBhcmFtc1sxXSA9IEZXX1BBUkFNX1BGVkYoSVFGTElOVF9FTkQpOworCXJldCA9IHQ0X3F1ZXJ5X3BhcmFtcyhhZGFwLCBhZGFwLT5tYm94LCBhZGFwLT5mbiwgMCwgMiwgcGFyYW1zLCB2YWwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGJ5ZTsKKwlhZGFwLT5zZ2UuZWdyX3N6ID0gdmFsWzBdIC0gYWRhcC0+c2dlLmVncl9zdGFydCArIDE7CisJYWRhcC0+c2dlLmluZ3Jfc3ogPSB2YWxbMV0gLSBhZGFwLT5zZ2UuaW5ncl9zdGFydCArIDE7CisKKwlhZGFwLT5zZ2UuZWdyX21hcCA9IGtjYWxsb2MoYWRhcC0+c2dlLmVncl9zeiwKKwkJCQkgICAgc2l6ZW9mKCphZGFwLT5zZ2UuZWdyX21hcCksIEdGUF9LRVJORUwpOworCWlmICghYWRhcC0+c2dlLmVncl9tYXApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBieWU7CisJfQorCisJYWRhcC0+c2dlLmluZ3JfbWFwID0ga2NhbGxvYyhhZGFwLT5zZ2UuaW5ncl9zeiwKKwkJCQkgICAgIHNpemVvZigqYWRhcC0+c2dlLmluZ3JfbWFwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhZGFwLT5zZ2UuaW5ncl9tYXApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBieWU7CisJfQorCisJLyogQWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGhlIHZhaW91cyBlZ3Jlc3MgcXVldWUgYml0bWFwcworCSAqIGllIHN0YXJ2aW5nX2ZsIGFuZCB0eHFfbWFwZXJyLgorCSAqLworCWFkYXAtPnNnZS5zdGFydmluZ19mbCA9CWtjYWxsb2MoQklUU19UT19MT05HUyhhZGFwLT5zZ2UuZWdyX3N6KSwKKwkJCQkJc2l6ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXAtPnNnZS5zdGFydmluZ19mbCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGJ5ZTsKKwl9CisKKwlhZGFwLT5zZ2UudHhxX21hcGVyciA9IGtjYWxsb2MoQklUU19UT19MT05HUyhhZGFwLT5zZ2UuZWdyX3N6KSwKKwkJCQkgICAgICAgc2l6ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWFkYXAtPnNnZS50eHFfbWFwZXJyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gYnllOworCX0KKwogCXBhcmFtc1swXSA9IEZXX1BBUkFNX1BGVkYoQ0xJUF9TVEFSVCk7CiAJcGFyYW1zWzFdID0gRldfUEFSQU1fUEZWRihDTElQX0VORCk7CiAJcmV0ID0gdDRfcXVlcnlfcGFyYW1zKGFkYXAsIGFkYXAtPm1ib3gsIGFkYXAtPmZuLCAwLCAyLCBwYXJhbXMsIHZhbCk7CkBAIC01MzY4LDcgKzM4MjcsNyBAQAogCQlhZGFwLT50aWRzLnN0aWRfYmFzZSA9IHZhbFsxXTsKIAkJYWRhcC0+dGlkcy5uc3RpZHMgPSB2YWxbMl0gLSB2YWxbMV0gKyAxOwogCQkvKgotCQkgKiBTZXR1cCBzZXJ2ZXIgZmlsdGVyIHJlZ2lvbi4gRGl2aWRlIHRoZSBhdmFpbGJsZSBmaWx0ZXIKKwkJICogU2V0dXAgc2VydmVyIGZpbHRlciByZWdpb24uIERpdmlkZSB0aGUgYXZhaWxhYmxlIGZpbHRlcgogCQkgKiByZWdpb24gaW50byB0d28gcGFydHMuIFJlZ3VsYXIgZmlsdGVycyBnZXQgMS8zcmQgYW5kIHNlcnZlcgogCQkgKiBmaWx0ZXJzIGdldCAyLzNyZCBwYXJ0LiBUaGlzIGlzIG9ubHkgZW5hYmxlZCBpZiB3b3JrYXJvbmQKIAkJICogcGF0aCBpcyBlbmFibGVkLgpAQCAtNTUwMSw2ICszOTYwLDEwIEBACiAJICogaGFwcGVuZWQgdG8gSFcvRlcsIHN0b3AgaXNzdWluZyBjb21tYW5kcy4KIAkgKi8KIGJ5ZToKKwlrZnJlZShhZGFwLT5zZ2UuZWdyX21hcCk7CisJa2ZyZWUoYWRhcC0+c2dlLmluZ3JfbWFwKTsKKwlrZnJlZShhZGFwLT5zZ2Uuc3RhcnZpbmdfZmwpOworCWtmcmVlKGFkYXAtPnNnZS50eHFfbWFwZXJyKTsKIAlpZiAocmV0ICE9IC1FVElNRURPVVQgJiYgcmV0ICE9IC1FSU8pCiAJCXQ0X2Z3X2J5ZShhZGFwLCBhZGFwLT5tYm94KTsKIAlyZXR1cm4gcmV0OwpAQCAtNTUyOCw2ICszOTkxLDcgQEAKIAkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAl9CiAJc3Bpbl91bmxvY2soJmFkYXAtPnN0YXRzX2xvY2spOworCWRpc2FibGVfaW50ZXJydXB0cyhhZGFwKTsKIAlpZiAoYWRhcC0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKIAkJY3hnYl9kb3duKGFkYXApOwogCXJ0bmxfdW5sb2NrKCk7CkBAIC01NjMwLDcgKzQwOTQsNyBAQAogCQkJICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50IGlxZV9zaXplKQogewogCXEtPmFkYXAgPSBhZGFwOwotCXNldF9yc3BxX2ludHJfcGFyYW1zKHEsIHVzLCBjbnQpOworCWN4Z2I0X3NldF9yc3BxX2ludHJfcGFyYW1zKHEsIHVzLCBjbnQpOwogCXEtPmlxZV9sZW4gPSBpcWVfc2l6ZTsKIAlxLT5zaXplID0gc2l6ZTsKIH0KQEAgLTU3MDUsNyArNDE2OSwxNiBAQAogCQkJcy0+b2ZsZHFzZXRzID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKIAkJLyogRm9yIFJETUEgb25lIFJ4IHF1ZXVlIHBlciBjaGFubmVsIHN1ZmZpY2VzICovCiAJCXMtPnJkbWFxcyA9IGFkYXAtPnBhcmFtcy5ucG9ydHM7Ci0JCXMtPnJkbWFjaXFzID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKKwkJLyogVHJ5IGFuZCBhbGxvdyBhdCBsZWFzdCAxIENJUSBwZXIgY3B1IHJvdW5kaW5nIGRvd24KKwkJICogdG8gdGhlIG51bWJlciBvZiBwb3J0cywgd2l0aCBhIG1pbmltdW0gb2YgMSBwZXIgcG9ydC4KKwkJICogQSAyIHBvcnQgY2FyZCBpbiBhIDYgY3B1IHN5c3RlbTogNiBDSVFzLCAzIC8gcG9ydC4KKwkJICogQSA0IHBvcnQgY2FyZCBpbiBhIDYgY3B1IHN5c3RlbTogNCBDSVFzLCAxIC8gcG9ydC4KKwkJICogQSA0IHBvcnQgY2FyZCBpbiBhIDIgY3B1IHN5c3RlbTogNCBDSVFzLCAxIC8gcG9ydC4KKwkJICovCisJCXMtPnJkbWFjaXFzID0gbWluX3QoaW50LCBNQVhfUkRNQV9DSVFTLCBudW1fb25saW5lX2NwdXMoKSk7CisJCXMtPnJkbWFjaXFzID0gKHMtPnJkbWFjaXFzIC8gYWRhcC0+cGFyYW1zLm5wb3J0cykgKgorCQkJCWFkYXAtPnBhcmFtcy5ucG9ydHM7CisJCXMtPnJkbWFjaXFzID0gbWF4X3QoaW50LCBzLT5yZG1hY2lxcywgYWRhcC0+cGFyYW1zLm5wb3J0cyk7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+ZXRocnhxKTsgaSsrKSB7CkBAIC01NzkxLDEyICs0MjY0LDE3IEBACiBzdGF0aWMgaW50IGVuYWJsZV9tc2l4KHN0cnVjdCBhZGFwdGVyICphZGFwKQogewogCWludCBvZmxkX25lZWQgPSAwOwotCWludCBpLCB3YW50LCBuZWVkOworCWludCBpLCB3YW50LCBuZWVkLCBhbGxvY2F0ZWQ7CiAJc3RydWN0IHNnZSAqcyA9ICZhZGFwLT5zZ2U7CiAJdW5zaWduZWQgaW50IG5jaGFuID0gYWRhcC0+cGFyYW1zLm5wb3J0czsKLQlzdHJ1Y3QgbXNpeF9lbnRyeSBlbnRyaWVzW01BWF9JTkdRICsgMV07CisJc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlbnRyaWVzKTsgKytpKQorCWVudHJpZXMgPSBrbWFsbG9jKHNpemVvZigqZW50cmllcykgKiAoTUFYX0lOR1EgKyAxKSwKKwkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbnRyaWVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSU5HUSArIDE7ICsraSkKIAkJZW50cmllc1tpXS5lbnRyeSA9IGk7CiAKIAl3YW50ID0gcy0+bWF4X2V0aHFzZXRzICsgRVhUUkFfVkVDUzsKQEAgLTU4MTMsMjkgKzQyOTEsMzkgQEAKICNlbHNlCiAJbmVlZCA9IGFkYXAtPnBhcmFtcy5ucG9ydHMgKyBFWFRSQV9WRUNTICsgb2ZsZF9uZWVkOwogI2VuZGlmCi0Jd2FudCA9IHBjaV9lbmFibGVfbXNpeF9yYW5nZShhZGFwLT5wZGV2LCBlbnRyaWVzLCBuZWVkLCB3YW50KTsKLQlpZiAod2FudCA8IDApCi0JCXJldHVybiB3YW50OworCWFsbG9jYXRlZCA9IHBjaV9lbmFibGVfbXNpeF9yYW5nZShhZGFwLT5wZGV2LCBlbnRyaWVzLCBuZWVkLCB3YW50KTsKKwlpZiAoYWxsb2NhdGVkIDwgMCkgeworCQlkZXZfaW5mbyhhZGFwLT5wZGV2X2RldiwgIm5vdCBlbm91Z2ggTVNJLVggdmVjdG9ycyBsZWZ0LCIKKwkJCSAiIG5vdCB1c2luZyBNU0ktWFxuIik7CisJCWtmcmVlKGVudHJpZXMpOworCQlyZXR1cm4gYWxsb2NhdGVkOworCX0KIAotCS8qCi0JICogRGlzdHJpYnV0ZSBhdmFpbGFibGUgdmVjdG9ycyB0byB0aGUgdmFyaW91cyBxdWV1ZSBncm91cHMuCisJLyogRGlzdHJpYnV0ZSBhdmFpbGFibGUgdmVjdG9ycyB0byB0aGUgdmFyaW91cyBxdWV1ZSBncm91cHMuCiAJICogRXZlcnkgZ3JvdXAgZ2V0cyBpdHMgbWluaW11bSByZXF1aXJlbWVudCBhbmQgTklDIGdldHMgdG9wCiAJICogcHJpb3JpdHkgZm9yIGxlZnRvdmVycy4KIAkgKi8KLQlpID0gd2FudCAtIEVYVFJBX1ZFQ1MgLSBvZmxkX25lZWQ7CisJaSA9IGFsbG9jYXRlZCAtIEVYVFJBX1ZFQ1MgLSBvZmxkX25lZWQ7CiAJaWYgKGkgPCBzLT5tYXhfZXRocXNldHMpIHsKIAkJcy0+bWF4X2V0aHFzZXRzID0gaTsKIAkJaWYgKGkgPCBzLT5ldGhxc2V0cykKIAkJCXJlZHVjZV9ldGhxcyhhZGFwLCBpKTsKIAl9CiAJaWYgKGlzX29mZmxvYWQoYWRhcCkpIHsKLQkJaSA9IHdhbnQgLSBFWFRSQV9WRUNTIC0gcy0+bWF4X2V0aHFzZXRzOwotCQlpIC09IG9mbGRfbmVlZCAtIG5jaGFuOworCQlpZiAoYWxsb2NhdGVkIDwgd2FudCkgeworCQkJcy0+cmRtYXFzID0gbmNoYW47CisJCQlzLT5yZG1hY2lxcyA9IG5jaGFuOworCQl9CisKKwkJLyogbGVmdG92ZXJzIGdvIHRvIE9GTEQgKi8KKwkJaSA9IGFsbG9jYXRlZCAtIEVYVFJBX1ZFQ1MgLSBzLT5tYXhfZXRocXNldHMgLQorCQkgICAgcy0+cmRtYXFzIC0gcy0+cmRtYWNpcXM7CiAJCXMtPm9mbGRxc2V0cyA9IChpIC8gbmNoYW4pICogbmNoYW47ICAvKiByb3VuZCBkb3duICovCiAJfQotCWZvciAoaSA9IDA7IGkgPCB3YW50OyArK2kpCisJZm9yIChpID0gMDsgaSA8IGFsbG9jYXRlZDsgKytpKQogCQlhZGFwLT5tc2l4X2luZm9baV0udmVjID0gZW50cmllc1tpXS52ZWN0b3I7CiAKKwlrZnJlZShlbnRyaWVzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTkxMiw2ICs0NDAwLDEwIEBACiAKIAl0NF9mcmVlX21lbShhZGFwdGVyLT5sMnQpOwogCXQ0X2ZyZWVfbWVtKGFkYXB0ZXItPnRpZHMudGlkX3RhYik7CisJa2ZyZWUoYWRhcHRlci0+c2dlLmVncl9tYXApOworCWtmcmVlKGFkYXB0ZXItPnNnZS5pbmdyX21hcCk7CisJa2ZyZWUoYWRhcHRlci0+c2dlLnN0YXJ2aW5nX2ZsKTsKKwlrZnJlZShhZGFwdGVyLT5zZ2UudHhxX21hcGVycik7CiAJZGlzYWJsZV9tc2koYWRhcHRlcik7CiAKIAlmb3JfZWFjaF9wb3J0KGFkYXB0ZXIsIGkpCkBAIC02MDk3LDcgKzQ1ODksNyBAQAogCQluZXRkZXYtPmRjYm5sX29wcyA9ICZjeGdiNF9kY2Jfb3BzOwogCQljeGdiNF9kY2Jfc3RhdGVfaW5pdChuZXRkZXYpOwogI2VuZGlmCi0JCW5ldGRldi0+ZXRodG9vbF9vcHMgPSAmY3hnYl9ldGh0b29sX29wczsKKwkJY3hnYjRfc2V0X2V0aHRvb2xfb3BzKG5ldGRldik7CiAJfQogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGFkYXB0ZXIpOwpAQCAtNjIzNyw2ICs0NzI5LDggQEAKIAkJaWYgKGlzX29mZmxvYWQoYWRhcHRlcikpCiAJCQlkZXRhY2hfdWxkcyhhZGFwdGVyKTsKIAorCQlkaXNhYmxlX2ludGVycnVwdHMoYWRhcHRlcik7CisKIAkJZm9yX2VhY2hfcG9ydChhZGFwdGVyLCBpKQogCQkJaWYgKGFkYXB0ZXItPnBvcnRbaV0tPnJlZ19zdGF0ZSA9PSBORVRSRUdfUkVHSVNURVJFRCkKIAkJCQl1bnJlZ2lzdGVyX25ldGRldihhZGFwdGVyLT5wb3J0W2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NnZS5jCmluZGV4IGI0YjlmNjAuLjBkMmVkZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zZ2UuYwpAQCAtNDYsNiArNDYsOSBAQAogI2lmZGVmIENPTkZJR19ORVRfUlhfQlVTWV9QT0xMCiAjaW5jbHVkZSA8bmV0L2J1c3lfcG9sbC5oPgogI2VuZGlmIC8qIENPTkZJR19ORVRfUlhfQlVTWV9QT0xMICovCisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDRfRkNPRQorI2luY2x1ZGUgPHNjc2kvZmMvZmNfZmNvZS5oPgorI2VuZGlmIC8qIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UgKi8KICNpbmNsdWRlICJjeGdiNC5oIgogI2luY2x1ZGUgInQ0X3JlZ3MuaCIKICNpbmNsdWRlICJ0NF92YWx1ZXMuaCIKQEAgLTExOCwxMiArMTIxLDYgQEAKICNkZWZpbmUgTk9NRU1fVE1SX0lEWCAoU0dFX05USU1FUlMgLSAxKQogCiAvKgotICogQW4gRkwgd2l0aCA8PSBGTF9TVEFSVkVfVEhSRVMgYnVmZmVycyBpcyBzdGFydmluZyBhbmQgYSBwZXJpb2RpYyB0aW1lciB3aWxsCi0gKiBhdHRlbXB0IHRvIHJlZmlsbCBpdC4KLSAqLwotI2RlZmluZSBGTF9TVEFSVkVfVEhSRVMgNAotCi0vKgogICogU3VzcGVuZCBhbiBFdGhlcm5ldCBUeCBxdWV1ZSB3aXRoIGZld2VyIGF2YWlsYWJsZSBkZXNjcmlwdG9ycyB0aGFuIHRoaXMuCiAgKiBUaGlzIGlzIHRoZSBzYW1lIGFzIGNhbGNfdHhfZGVzY3MoKSBmb3IgYSBUU08gcGFja2V0IHdpdGgKICAqIG5yX2ZyYWdzID09IE1BWF9TS0JfRlJBR1MuCkBAIC0xNDEsNyArMTM4LDcgQEAKICAqIE1heCBUeCBkZXNjcmlwdG9yIHNwYWNlIHdlIGFsbG93IGZvciBhbiBFdGhlcm5ldCBwYWNrZXQgdG8gYmUgaW5saW5lZAogICogaW50byBhIFdSLgogICovCi0jZGVmaW5lIE1BWF9JTU1fVFhfUEtUX0xFTiAxMjgKKyNkZWZpbmUgTUFYX0lNTV9UWF9QS1RfTEVOIDI1NgogCiAvKgogICogTWF4IHNpemUgb2YgYSBXUiBzZW50IHRocm91Z2ggYSBjb250cm9sIFR4IHF1ZXVlLgpAQCAtMjQ1LDkgKzI0MiwyMSBAQAogCXJldHVybiBmbC0+c2l6ZSAtIDg7ICAgLyogMSBkZXNjcmlwdG9yID0gOCBidWZmZXJzICovCiB9CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBmbF9zdGFydmluZyhjb25zdCBzdHJ1Y3Qgc2dlX2ZsICpmbCkKKy8qKgorICoJZmxfc3RhcnZpbmcgLSByZXR1cm4gd2hldGhlciBhIEZyZWUgTGlzdCBpcyBzdGFydmluZy4KKyAqCUBhZGFwdGVyOiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyCisgKglAZmw6IHRoZSBGcmVlIExpc3QKKyAqCisgKglUZXN0cyBzcGVjaWZpZWQgRnJlZSBMaXN0IHRvIHNlZSB3aGV0aGVyIHRoZSBudW1iZXIgb2YgYnVmZmVycworICoJYXZhaWxhYmxlIHRvIHRoZSBoYXJkd2FyZSBoYXMgZmFsbGVkIGJlbG93IG91ciAic3RhcnZhdGlvbiIKKyAqCXRocmVzaG9sZC4KKyAqLworc3RhdGljIGlubGluZSBib29sIGZsX3N0YXJ2aW5nKGNvbnN0IHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzZ2VfZmwgKmZsKQogewotCXJldHVybiBmbC0+YXZhaWwgLSBmbC0+cGVuZF9jcmVkIDw9IEZMX1NUQVJWRV9USFJFUzsKKwljb25zdCBzdHJ1Y3Qgc2dlICpzID0gJmFkYXB0ZXItPnNnZTsKKworCXJldHVybiBmbC0+YXZhaWwgLSBmbC0+cGVuZF9jcmVkIDw9IHMtPmZsX3N0YXJ2ZV90aHJlczsKIH0KIAogc3RhdGljIGludCBtYXBfc2tiKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTU4Myw4ICs1OTIsMTAgQEAKIAl1bnNpZ25lZCBpbnQgY3JlZCA9IHEtPmF2YWlsOwogCV9fYmU2NCAqZCA9ICZxLT5kZXNjW3EtPnBpZHhdOwogCXN0cnVjdCByeF9zd19kZXNjICpzZCA9ICZxLT5zZGVzY1txLT5waWR4XTsKKwlpbnQgbm9kZTsKIAogCWdmcCB8PSBfX0dGUF9OT1dBUk47CisJbm9kZSA9IGRldl90b19ub2RlKGFkYXAtPnBkZXZfZGV2KTsKIAogCWlmIChzLT5mbF9wZ19vcmRlciA9PSAwKQogCQlnb3RvIGFsbG9jX3NtYWxsX3BhZ2VzOwpAQCAtNTkzLDcgKzYwNCw3IEBACiAJICogUHJlZmVyIGxhcmdlIGJ1ZmZlcnMKIAkgKi8KIAl3aGlsZSAobikgewotCQlwZyA9IF9fZGV2X2FsbG9jX3BhZ2VzKGdmcCwgcy0+ZmxfcGdfb3JkZXIpOworCQlwZyA9IGFsbG9jX3BhZ2VzX25vZGUobm9kZSwgZ2ZwIHwgX19HRlBfQ09NUCwgcy0+ZmxfcGdfb3JkZXIpOwogCQlpZiAodW5saWtlbHkoIXBnKSkgewogCQkJcS0+bGFyZ2VfYWxsb2NfZmFpbGVkKys7CiAJCQlicmVhazsgICAgICAgLyogZmFsbCBiYWNrIHRvIHNpbmdsZSBwYWdlcyAqLwpAQCAtNjIzLDcgKzYzNCw3IEBACiAKIGFsbG9jX3NtYWxsX3BhZ2VzOgogCXdoaWxlIChuLS0pIHsKLQkJcGcgPSBfX2Rldl9hbGxvY19wYWdlKGdmcCk7CisJCXBnID0gYWxsb2NfcGFnZXNfbm9kZShub2RlLCBnZnAsIDApOwogCQlpZiAodW5saWtlbHkoIXBnKSkgewogCQkJcS0+YWxsb2NfZmFpbGVkKys7CiAJCQlicmVhazsKQEAgLTY1Miw3ICs2NjMsNyBAQAogCXEtPnBlbmRfY3JlZCArPSBjcmVkOwogCXJpbmdfZmxfZGIoYWRhcCwgcSk7CiAKLQlpZiAodW5saWtlbHkoZmxfc3RhcnZpbmcocSkpKSB7CisJaWYgKHVubGlrZWx5KGZsX3N0YXJ2aW5nKGFkYXAsIHEpKSkgewogCQlzbXBfd21iKCk7CiAJCXNldF9iaXQocS0+Y250eHRfaWQgLSBhZGFwLT5zZ2UuZWdyX3N0YXJ0LAogCQkJYWRhcC0+c2dlLnN0YXJ2aW5nX2ZsKTsKQEAgLTcxOSw2ICs3MzAsMjIgQEAKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2dsX2xlbih1bnNpZ25lZCBpbnQgbikKIHsKKwkvKiBBIERpcmVjdCBTY2F0dGVyIEdhdGhlciBMaXN0IHVzZXMgMzItYml0IGxlbmd0aHMgYW5kIDY0LWJpdCBQQ0kgRE1BCisJICogYWRkcmVzc2VzLiAgVGhlIERTR0wgV29yayBSZXF1ZXN0IHN0YXJ0cyBvZmYgd2l0aCBhIDMyLWJpdCBEU0dMCisJICogVUxQVFggaGVhZGVyLCB0aGVuIExlbmd0aDAsIHRoZW4gQWRkcmVzczAsIHRoZW4sIGZvciAxIDw9IGkgPD0gTiwKKwkgKiByZXBlYXRlZCBzZXF1ZW5jZXMgb2YgeyBMZW5ndGhbaV0sIExlbmd0aFtpKzFdLCBBZGRyZXNzW2ldLAorCSAqIEFkZHJlc3NbaSsxXSB9ICh0aGlzIGVuc3VyZXMgdGhhdCBhbGwgYWRkcmVzc2VzIGFyZSBvbiA2NC1iaXQKKwkgKiBib3VuZGFyaWVzKS4gIElmIE4gaXMgZXZlbiwgdGhlbiBMZW5ndGhbTisxXSBzaG91bGQgYmUgc2V0IHRvIDAgYW5kCisJICogQWRkcmVzc1tOKzFdIGlzIG9taXR0ZWQuCisJICoKKwkgKiBUaGUgZm9sbG93aW5nIGNhbGN1bGF0aW9uIGluY29ycG9yYXRlcyBhbGwgb2YgdGhlIGFib3ZlLiAgSXQncworCSAqIHNvbWV3aGF0IGhhcmQgdG8gZm9sbG93IGJ1dCwgYnJpZWZseTogdGhlICIrMiIgYWNjb3VudHMgZm9yIHRoZQorCSAqIGZpcnN0IHR3byBmbGl0cyB3aGljaCBpbmNsdWRlIHRoZSBEU0dMIGhlYWRlciwgTGVuZ3RoMCBhbmQKKwkgKiBBZGRyZXNzMDsgdGhlICIoMyoobi0xKSkvMiIgY292ZXJzIHRoZSBtYWluIGJvZHkgb2YgbGlzdCBlbnRyaWVzICgzCisJICogZmxpdHMgZm9yIGV2ZXJ5IHBhaXIgb2YgdGhlIHJlbWFpbmluZyBOKSArMSBpZiAobi0xKSBpcyBvZGQ7IGFuZAorCSAqIGZpbmFsbHkgdGhlICIrKChuLTEpJjEpIiBhZGRzIHRoZSBvbmUgcmVtYWluaW5nIGZsaXQgbmVlZGVkIGlmCisJICogKG4tMSkgaXMgb2RkIC4uLgorCSAqLwogCW4tLTsKIAlyZXR1cm4gKDMgKiBuKSAvIDIgKyAobiAmIDEpICsgMjsKIH0KQEAgLTc2NiwxMiArNzkzLDMwIEBACiAJdW5zaWduZWQgaW50IGZsaXRzOwogCWludCBoZHJsZW4gPSBpc19ldGhfaW1tKHNrYik7CiAKKwkvKiBJZiB0aGUgc2tiIGlzIHNtYWxsIGVub3VnaCwgd2UgY2FuIHB1bXAgaXQgb3V0IGFzIGEgd29yayByZXF1ZXN0CisJICogd2l0aCBvbmx5IGltbWVkaWF0ZSBkYXRhLiAgSW4gdGhhdCBjYXNlIHdlIGp1c3QgaGF2ZSB0byBoYXZlIHRoZQorCSAqIFRYIFBhY2tldCBoZWFkZXIgcGx1cyB0aGUgc2tiIGRhdGEgaW4gdGhlIFdvcmsgUmVxdWVzdC4KKwkgKi8KKwogCWlmIChoZHJsZW4pCiAJCXJldHVybiBESVZfUk9VTkRfVVAoc2tiLT5sZW4gKyBoZHJsZW4sIHNpemVvZihfX2JlNjQpKTsKIAorCS8qIE90aGVyd2lzZSwgd2UncmUgZ29pbmcgdG8gaGF2ZSB0byBjb25zdHJ1Y3QgYSBTY2F0dGVyIGdhdGhlciBsaXN0CisJICogb2YgdGhlIHNrYiBib2R5IGFuZCBmcmFnbWVudHMuICBXZSBhbHNvIGluY2x1ZGUgdGhlIGZsaXRzIG5lY2Vzc2FyeQorCSAqIGZvciB0aGUgVFggUGFja2V0IFdvcmsgUmVxdWVzdCBhbmQgQ1BMLiAgV2UgYWx3YXlzIGhhdmUgYSBmaXJtd2FyZQorCSAqIFdyaXRlIEhlYWRlciAoaW5jb3Jwb3JhdGVkIGFzIHBhcnQgb2YgdGhlIGNwbF90eF9wa3RfbHNvIGFuZAorCSAqIGNwbF90eF9wa3Qgc3RydWN0dXJlcyksIGZvbGxvd2VkIGJ5IGVpdGhlciBhIFRYIFBhY2tldCBXcml0ZSBDUEwKKwkgKiBtZXNzYWdlIG9yLCBpZiB3ZSdyZSBkb2luZyBhIExhcmdlIFNlbmQgT2ZmbG9hZCwgYW4gTFNPIENQTCBtZXNzYWdlCisJICogd2l0aCBhbiBlbWJlZGRlZCBUWCBQYWNrZXQgV3JpdGUgQ1BMIG1lc3NhZ2UuCisJICovCiAJZmxpdHMgPSBzZ2xfbGVuKHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgKyAxKSArIDQ7CiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpCi0JCWZsaXRzICs9IDI7CisJCWZsaXRzICs9IChzaXplb2Yoc3RydWN0IGZ3X2V0aF90eF9wa3Rfd3IpICsKKwkJCSAgc2l6ZW9mKHN0cnVjdCBjcGxfdHhfcGt0X2xzb19jb3JlKSArCisJCQkgIHNpemVvZihzdHJ1Y3QgY3BsX3R4X3BrdF9jb3JlKSkgLyBzaXplb2YoX19iZTY0KTsKKwllbHNlCisJCWZsaXRzICs9IChzaXplb2Yoc3RydWN0IGZ3X2V0aF90eF9wa3Rfd3IpICsKKwkJCSAgc2l6ZW9mKHN0cnVjdCBjcGxfdHhfcGt0X2NvcmUpKSAvIHNpemVvZihfX2JlNjQpOwogCXJldHVybiBmbGl0czsKIH0KIApAQCAtMTA0NCw2ICsxMDg5LDM4IEBACiAJCXEtPnBpZHggLT0gcS0+c2l6ZTsKIH0KIAorI2lmZGVmIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UKK3N0YXRpYyBpbmxpbmUgaW50CitjeGdiX2Zjb2Vfb2ZmbG9hZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgYWRhcHRlciAqYWRhcCwKKwkJICBjb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSwgdTY0ICpjbnRybCkKK3sKKwljb25zdCBzdHJ1Y3QgY3hnYl9mY29lICpmY29lID0gJnBpLT5mY29lOworCisJaWYgKCEoZmNvZS0+ZmxhZ3MgJiBDWEdCX0ZDT0VfRU5BQkxFRCkpCisJCXJldHVybiAwOworCisJaWYgKHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfRkNPRSkpCisJCXJldHVybiAwOworCisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlza2ItPm1hY19sZW4gPSBzaXplb2Yoc3RydWN0IGV0aGhkcik7CisKKwlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKHNrYiwgc2tiLT5tYWNfbGVuKTsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBza2ItPm1hY19sZW4gKyBzaXplb2Yoc3RydWN0IGZjb2VfaGRyKSk7CisKKwlpZiAoIWN4Z2JfZmNvZV9zb2ZfZW9mX3N1cHBvcnRlZChhZGFwLCBza2IpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJLyogRkMgQ1JDIG9mZmxvYWQgKi8KKwkqY250cmwgPSBUWFBLVF9DU1VNX1RZUEUoVFhfQ1NVTV9GQ09FKSB8CisJCSAgICAgVFhQS1RfTDRDU1VNX0RJUyB8IFRYUEtUX0lQQ1NVTV9ESVMgfAorCQkgICAgIFRYUEtUX0NTVU1fU1RBUlQoQ1hHQl9GQ09FX1RYUEtUX0NTVU1fU1RBUlQpIHwKKwkJICAgICBUWFBLVF9DU1VNX0VORChDWEdCX0ZDT0VfVFhQS1RfQ1NVTV9FTkQpIHwKKwkJICAgICBUWFBLVF9DU1VNX0xPQyhDWEdCX0ZDT0VfVFhQS1RfQ1NVTV9FTkQpOworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UgKi8KKwogLyoqCiAgKgl0NF9ldGhfeG1pdCAtIGFkZCBhIHBhY2tldCB0byBhbiBFdGhlcm5ldCBUeCBxdWV1ZQogICoJQHNrYjogdGhlIHBhY2tldApAQCAtMTA2Niw2ICsxMTQzLDkgQEAKIAljb25zdCBzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzc2k7CiAJZG1hX2FkZHJfdCBhZGRyW01BWF9TS0JfRlJBR1MgKyAxXTsKIAlib29sIGltbWVkaWF0ZSA9IGZhbHNlOworI2lmZGVmIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UKKwlpbnQgZXJyOworI2VuZGlmIC8qIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UgKi8KIAogCS8qCiAJICogVGhlIGNoaXAgbWluIHBhY2tldCBsZW5ndGggaXMgMTAgb2N0ZXRzIGJ1dCBwbGF5IHNhZmUgYW5kIHJlamVjdApAQCAtMTA4Miw2ICsxMTYyLDEzIEBACiAJcSA9ICZhZGFwLT5zZ2UuZXRodHhxW3FpZHggKyBwaS0+Zmlyc3RfcXNldF07CiAKIAlyZWNsYWltX2NvbXBsZXRlZF90eChhZGFwLCAmcS0+cSwgdHJ1ZSk7CisJY250cmwgPSBUWFBLVF9MNENTVU1fRElTIHwgVFhQS1RfSVBDU1VNX0RJUzsKKworI2lmZGVmIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UKKwllcnIgPSBjeGdiX2Zjb2Vfb2ZmbG9hZChza2IsIGFkYXAsIHBpLCAmY250cmwpOworCWlmICh1bmxpa2VseShlcnIgPT0gLUVOT1RTVVBQKSkKKwkJZ290byBvdXRfZnJlZTsKKyNlbmRpZiAvKiBDT05GSUdfQ0hFTFNJT19UNF9GQ09FICovCiAKIAlmbGl0cyA9IGNhbGNfdHhfZmxpdHMoc2tiKTsKIAluZGVzYyA9IGZsaXRzX3RvX2Rlc2MoZmxpdHMpOwpAQCAtMTE1MywxMyArMTI0MCwxNyBAQAogCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQkJY250cmwgPSBod2NzdW0oc2tiKSB8IFRYUEtUX0lQQ1NVTV9ESVM7CiAJCQlxLT50eF9jc28rKzsKLQkJfSBlbHNlCi0JCQljbnRybCA9IFRYUEtUX0w0Q1NVTV9ESVMgfCBUWFBLVF9JUENTVU1fRElTOworCQl9CiAJfQogCiAJaWYgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKIAkJcS0+dmxhbl9pbnMrKzsKIAkJY250cmwgfD0gVFhQS1RfVkxBTl9WTEQgfCBUWFBLVF9WTEFOKHNrYl92bGFuX3RhZ19nZXQoc2tiKSk7CisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDRfRkNPRQorCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9GQ09FKSkKKwkJCWNudHJsIHw9IFRYUEtUX1ZMQU4oCisJCQkJICgoc2tiLT5wcmlvcml0eSAmIDB4NykgPDwgVkxBTl9QUklPX1NISUZUKSk7CisjZW5kaWYgLyogQ09ORklHX0NIRUxTSU9fVDRfRkNPRSAqLwogCX0KIAogCWNwbC0+Y3RybDAgPSBodG9ubChUWFBLVF9PUENPREUoQ1BMX1RYX1BLVF9YVCkgfApAQCAtMTc1OSw2ICsxODUwLDkgQEAKIAlzdHJ1Y3Qgc2dlICpzID0gJnEtPmFkYXAtPnNnZTsKIAlpbnQgY3BsX3RyYWNlX3BrdCA9IGlzX3Q0KHEtPmFkYXAtPnBhcmFtcy5jaGlwKSA/CiAJCQkgICAgQ1BMX1RSQUNFX1BLVCA6IENQTF9UUkFDRV9QS1RfVDU7CisjaWZkZWYgQ09ORklHX0NIRUxTSU9fVDRfRkNPRQorCXN0cnVjdCBwb3J0X2luZm8gKnBpOworI2VuZGlmCiAKIAlpZiAodW5saWtlbHkoKih1OCAqKXJzcCA9PSBjcGxfdHJhY2VfcGt0KSkKIAkJcmV0dXJuIGhhbmRsZV90cmFjZV9wa3QocS0+YWRhcCwgc2kpOwpAQCAtMTc5OSw4ICsxODkzLDI0IEBACiAJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX0NPTVBMRVRFOwogCQkJcnhxLT5zdGF0cy5yeF9jc28rKzsKIAkJfQotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXNrYl9jaGVja3N1bV9ub25lX2Fzc2VydChza2IpOworI2lmZGVmIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UKKyNkZWZpbmUgQ1BMX1JYX1BLVF9GTEFHUyAoUlhGX1BTSF9GIHwgUlhGX1NZTl9GIHwgUlhGX1VEUF9GIHwgXAorCQkJICBSWEZfVENQX0YgfCBSWEZfSVBfRiB8IFJYRl9JUDZfRiB8IFJYRl9MUk9fRikKKworCQlwaSA9IG5ldGRldl9wcml2KHNrYi0+ZGV2KTsKKwkJaWYgKCEocGt0LT5sMmluZm8gJiBjcHVfdG9fYmUzMihDUExfUlhfUEtUX0ZMQUdTKSkpIHsKKwkJCWlmICgocGt0LT5sMmluZm8gJiBjcHVfdG9fYmUzMihSWEZfRkNPRV9GKSkgJiYKKwkJCSAgICAocGktPmZjb2UuZmxhZ3MgJiBDWEdCX0ZDT0VfRU5BQkxFRCkpIHsKKwkJCQlpZiAoIShwa3QtPmVycl92ZWMgJiBjcHVfdG9fYmUxNihSWEVSUl9DU1VNX0YpKSkKKwkJCQkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKKwkJCX0KKwkJfQorCisjdW5kZWYgQ1BMX1JYX1BLVF9GTEFHUworI2VuZGlmIC8qIENPTkZJR19DSEVMU0lPX1Q0X0ZDT0UgKi8KKwl9CiAKIAlpZiAodW5saWtlbHkocGt0LT52bGFuX2V4KSkgewogCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgaHRvbnMoRVRIX1BfODAyMVEpLCBudG9ocyhwa3QtPnZsYW4pKTsKQEAgLTE5MDAsNyArMjAxMCw3IEBACiAJCWlmICghaXNfbmV3X3Jlc3BvbnNlKHJjLCBxKSkKIAkJCWJyZWFrOwogCi0JCXJtYigpOworCQlkbWFfcm1iKCk7CiAJCXJzcF90eXBlID0gUlNQRF9UWVBFKHJjLT50eXBlX2dlbik7CiAJCWlmIChsaWtlbHkocnNwX3R5cGUgPT0gUlNQX1RZUEVfRkxCVUYpKSB7CiAJCQlzdHJ1Y3QgcGFnZV9mcmFnICpmcDsKQEAgLTIwOTIsNyArMjIwMiw3IEBACiAJCWlmICghaXNfbmV3X3Jlc3BvbnNlKHJjLCBxKSkKIAkJCWJyZWFrOwogCi0JCXJtYigpOworCQlkbWFfcm1iKCk7CiAJCWlmIChSU1BEX1RZUEUocmMtPnR5cGVfZ2VuKSA9PSBSU1BfVFlQRV9JTlRSKSB7CiAJCQl1bnNpZ25lZCBpbnQgcWlkID0gbnRvaGwocmMtPnBsZGJ1Zmxlbl9xaWQpOwogCkBAIC0yMTI4LDcgKzIyMzgsOCBAQAogewogCXN0cnVjdCBhZGFwdGVyICphZGFwID0gY29va2llOwogCi0JdDRfc2xvd19pbnRyX2hhbmRsZXIoYWRhcCk7CisJaWYgKGFkYXAtPmZsYWdzICYgTUFTVEVSX1BGKQorCQl0NF9zbG93X2ludHJfaGFuZGxlcihhZGFwKTsKIAlwcm9jZXNzX2ludHJxKGFkYXApOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTIxNDMsNyArMjI1NCw4IEBACiAJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSBjb29raWU7CiAKIAl0NF93cml0ZV9yZWcoYWRhcCwgTVlQRl9SRUcoUENJRV9QRl9DTElfQSksIDApOwotCWlmICh0NF9zbG93X2ludHJfaGFuZGxlcihhZGFwKSB8IHByb2Nlc3NfaW50cnEoYWRhcCkpCisJaWYgKCgoYWRhcC0+ZmxhZ3MgJiBNQVNURVJfUEYpICYmIHQ0X3Nsb3dfaW50cl9oYW5kbGVyKGFkYXApKSB8CisJICAgIHByb2Nlc3NfaW50cnEoYWRhcCkpCiAJCXJldHVybiBJUlFfSEFORExFRDsKIAlyZXR1cm4gSVJRX05PTkU7ICAgICAgICAgICAgIC8qIHByb2JhYmx5IHNoYXJlZCBpbnRlcnJ1cHQgKi8KIH0KQEAgLTIxNzEsNyArMjI4Myw3IEBACiAJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwogCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+c3RhcnZpbmdfZmwpOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEJJVFNfVE9fTE9OR1Mocy0+ZWdyX3N6KTsgaSsrKQogCQlmb3IgKG0gPSBzLT5zdGFydmluZ19mbFtpXTsgbTsgbSAmPSBtIC0gMSkgewogCQkJc3RydWN0IHNnZV9ldGhfcnhxICpyeHE7CiAJCQl1bnNpZ25lZCBpbnQgaWQgPSBfX2ZmcyhtKSArIGkgKiBCSVRTX1BFUl9MT05HOwpAQCAtMjE4MCw3ICsyMjkyLDcgQEAKIAkJCWNsZWFyX2JpdChpZCwgcy0+c3RhcnZpbmdfZmwpOwogCQkJc21wX21iX19hZnRlcl9hdG9taWMoKTsKIAotCQkJaWYgKGZsX3N0YXJ2aW5nKGZsKSkgeworCQkJaWYgKGZsX3N0YXJ2aW5nKGFkYXAsIGZsKSkgewogCQkJCXJ4cSA9IGNvbnRhaW5lcl9vZihmbCwgc3RydWN0IHNnZV9ldGhfcnhxLCBmbCk7CiAJCQkJaWYgKG5hcGlfcmVzY2hlZHVsZSgmcnhxLT5yc3BxLm5hcGkpKQogCQkJCQlmbC0+c3RhcnZpbmcrKzsKQEAgLTIyNTksNyArMjM3MSw3IEBACiAJc3RydWN0IGFkYXB0ZXIgKmFkYXAgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwogCXN0cnVjdCBzZ2UgKnMgPSAmYWRhcC0+c2dlOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocy0+dHhxX21hcGVycik7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgQklUU19UT19MT05HUyhzLT5lZ3Jfc3opOyBpKyspCiAJCWZvciAobSA9IHMtPnR4cV9tYXBlcnJbaV07IG07IG0gJj0gbSAtIDEpIHsKIAkJCXVuc2lnbmVkIGxvbmcgaWQgPSBfX2ZmcyhtKSArIGkgKiBCSVRTX1BFUl9MT05HOwogCQkJc3RydWN0IHNnZV9vZmxkX3R4cSAqdHhxID0gcy0+ZWdyX21hcFtpZF07CkBAIC0yNzQxLDcgKzI4NTMsOCBAQAogCQlmcmVlX3JzcHFfZmwoYWRhcCwgJmFkYXAtPnNnZS5pbnRycSwgTlVMTCk7CiAKIAkvKiBjbGVhciB0aGUgcmV2ZXJzZSBlZ3Jlc3MgcXVldWUgbWFwICovCi0JbWVtc2V0KGFkYXAtPnNnZS5lZ3JfbWFwLCAwLCBzaXplb2YoYWRhcC0+c2dlLmVncl9tYXApKTsKKwltZW1zZXQoYWRhcC0+c2dlLmVncl9tYXAsIDAsCisJICAgICAgIGFkYXAtPnNnZS5lZ3Jfc3ogKiBzaXplb2YoKmFkYXAtPnNnZS5lZ3JfbWFwKSk7CiB9CiAKIHZvaWQgdDRfc2dlX3N0YXJ0KHN0cnVjdCBhZGFwdGVyICphZGFwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9ody5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9ody5jCmluZGV4IDg1M2MzODkuLjU5NTllM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfaHcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X2h3LmMKQEAgLTYyNSw2ICs2MjUsNzM0IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICoJdDRfZ2V0X3JlZ3NfbGVuIC0gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBjaGlwcyByZWdpc3RlciBzZXQKKyAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgorICoKKyAqCVJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNoaXAncyBCQVIwIHJlZ2lzdGVyIHNwYWNlLgorICovCit1bnNpZ25lZCBpbnQgdDRfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQoreworCXVuc2lnbmVkIGludCBjaGlwX3ZlcnNpb24gPSBDSEVMU0lPX0NISVBfVkVSU0lPTihhZGFwdGVyLT5wYXJhbXMuY2hpcCk7CisKKwlzd2l0Y2ggKGNoaXBfdmVyc2lvbikgeworCWNhc2UgQ0hFTFNJT19UNDoKKwkJcmV0dXJuIFQ0X1JFR01BUF9TSVpFOworCisJY2FzZSBDSEVMU0lPX1Q1OgorCQlyZXR1cm4gVDVfUkVHTUFQX1NJWkU7CisJfQorCisJZGV2X2VycihhZGFwdGVyLT5wZGV2X2RldiwKKwkJIlVuc3VwcG9ydGVkIGNoaXAgdmVyc2lvbiAlZFxuIiwgY2hpcF92ZXJzaW9uKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKgl0NF9nZXRfcmVncyAtIHJlYWQgY2hpcCByZWdpc3RlcnMgaW50byBwcm92aWRlZCBidWZmZXIKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoJQGJ1ZjogcmVnaXN0ZXIgYnVmZmVyCisgKglAYnVmX3NpemU6IHNpemUgKGluIGJ5dGVzKSBvZiByZWdpc3RlciBidWZmZXIKKyAqCisgKglJZiB0aGUgcHJvdmlkZWQgcmVnaXN0ZXIgYnVmZmVyIGlzbid0IGxhcmdlIGVub3VnaCBmb3IgdGhlIGNoaXAncworICoJZnVsbCByZWdpc3RlciByYW5nZSwgdGhlIHJlZ2lzdGVyIGR1bXAgd2lsbCBiZSB0cnVuY2F0ZWQgdG8gdGhlCisgKglyZWdpc3RlciBidWZmZXIncyBzaXplLgorICovCit2b2lkIHQ0X2dldF9yZWdzKHN0cnVjdCBhZGFwdGVyICphZGFwLCB2b2lkICpidWYsIHNpemVfdCBidWZfc2l6ZSkKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHQ0X3JlZ19yYW5nZXNbXSA9IHsKKwkJMHgxMDA4LCAweDExMDgsCisJCTB4MTE4MCwgMHgxMWI0LAorCQkweDExZmMsIDB4MTIzYywKKwkJMHgxMzAwLCAweDE3M2MsCisJCTB4MTgwMCwgMHgxOGZjLAorCQkweDMwMDAsIDB4MzBkOCwKKwkJMHgzMGUwLCAweDU5MjQsCisJCTB4NTk2MCwgMHg1OWQ0LAorCQkweDVhMDAsIDB4NWFmOCwKKwkJMHg2MDAwLCAweDYwOTgsCisJCTB4NjEwMCwgMHg2MTUwLAorCQkweDYyMDAsIDB4NjIwOCwKKwkJMHg2MjQwLCAweDYyNDgsCisJCTB4NjI4MCwgMHg2MzM4LAorCQkweDYzNzAsIDB4NjM4YywKKwkJMHg2NDAwLCAweDY0M2MsCisJCTB4NjUwMCwgMHg2NTI0LAorCQkweDZhMDAsIDB4NmEzOCwKKwkJMHg2YTYwLCAweDZhNzgsCisJCTB4NmIwMCwgMHg2Yjg0LAorCQkweDZiZjAsIDB4NmM4NCwKKwkJMHg2Y2YwLCAweDZkODQsCisJCTB4NmRmMCwgMHg2ZTg0LAorCQkweDZlZjAsIDB4NmY4NCwKKwkJMHg2ZmYwLCAweDcwODQsCisJCTB4NzBmMCwgMHg3MTg0LAorCQkweDcxZjAsIDB4NzI4NCwKKwkJMHg3MmYwLCAweDczODQsCisJCTB4NzNmMCwgMHg3NDUwLAorCQkweDc1MDAsIDB4NzUzMCwKKwkJMHg3NjAwLCAweDc2MWMsCisJCTB4NzY4MCwgMHg3NmNjLAorCQkweDc3MDAsIDB4Nzc5OCwKKwkJMHg3N2MwLCAweDc3ZmMsCisJCTB4NzkwMCwgMHg3OWZjLAorCQkweDdiMDAsIDB4N2MzOCwKKwkJMHg3ZDAwLCAweDdlZmMsCisJCTB4OGRjMCwgMHg4ZTFjLAorCQkweDhlMzAsIDB4OGU3OCwKKwkJMHg4ZWEwLCAweDhmNmMsCisJCTB4OGZjMCwgMHg5MDc0LAorCQkweDkwZmMsIDB4OTBmYywKKwkJMHg5NDAwLCAweDk0NTgsCisJCTB4OTYwMCwgMHg5NmJjLAorCQkweDk4MDAsIDB4OTgwOCwKKwkJMHg5ODIwLCAweDk4M2MsCisJCTB4OTg1MCwgMHg5ODY0LAorCQkweDljMDAsIDB4OWM2YywKKwkJMHg5YzgwLCAweDljZWMsCisJCTB4OWQwMCwgMHg5ZDZjLAorCQkweDlkODAsIDB4OWRlYywKKwkJMHg5ZTAwLCAweDllNmMsCisJCTB4OWU4MCwgMHg5ZWVjLAorCQkweDlmMDAsIDB4OWY2YywKKwkJMHg5ZjgwLCAweDlmZWMsCisJCTB4ZDAwNCwgMHhkMDNjLAorCQkweGRmYzAsIDB4ZGZlMCwKKwkJMHhlMDAwLCAweGVhN2MsCisJCTB4ZjAwMCwgMHgxMTExMCwKKwkJMHgxMTExOCwgMHgxMTE5MCwKKwkJMHgxOTA0MCwgMHgxOTA2YywKKwkJMHgxOTA3OCwgMHgxOTA4MCwKKwkJMHgxOTA4YywgMHgxOTEyNCwKKwkJMHgxOTE1MCwgMHgxOTFiMCwKKwkJMHgxOTFkMCwgMHgxOTFlOCwKKwkJMHgxOTIzOCwgMHgxOTI0YywKKwkJMHgxOTNmOCwgMHgxOTQ3NCwKKwkJMHgxOTQ5MCwgMHgxOTRmOCwKKwkJMHgxOTgwMCwgMHgxOWYzMCwKKwkJMHgxYTAwMCwgMHgxYTA2YywKKwkJMHgxYTBiMCwgMHgxYTEyMCwKKwkJMHgxYTEyOCwgMHgxYTEzOCwKKwkJMHgxYTE5MCwgMHgxYTFjNCwKKwkJMHgxYTFmYywgMHgxYTFmYywKKwkJMHgxZTA0MCwgMHgxZTA0YywKKwkJMHgxZTI4NCwgMHgxZTI4YywKKwkJMHgxZTJjMCwgMHgxZTJjMCwKKwkJMHgxZTJlMCwgMHgxZTJlMCwKKwkJMHgxZTMwMCwgMHgxZTM4NCwKKwkJMHgxZTNjMCwgMHgxZTNjOCwKKwkJMHgxZTQ0MCwgMHgxZTQ0YywKKwkJMHgxZTY4NCwgMHgxZTY4YywKKwkJMHgxZTZjMCwgMHgxZTZjMCwKKwkJMHgxZTZlMCwgMHgxZTZlMCwKKwkJMHgxZTcwMCwgMHgxZTc4NCwKKwkJMHgxZTdjMCwgMHgxZTdjOCwKKwkJMHgxZTg0MCwgMHgxZTg0YywKKwkJMHgxZWE4NCwgMHgxZWE4YywKKwkJMHgxZWFjMCwgMHgxZWFjMCwKKwkJMHgxZWFlMCwgMHgxZWFlMCwKKwkJMHgxZWIwMCwgMHgxZWI4NCwKKwkJMHgxZWJjMCwgMHgxZWJjOCwKKwkJMHgxZWM0MCwgMHgxZWM0YywKKwkJMHgxZWU4NCwgMHgxZWU4YywKKwkJMHgxZWVjMCwgMHgxZWVjMCwKKwkJMHgxZWVlMCwgMHgxZWVlMCwKKwkJMHgxZWYwMCwgMHgxZWY4NCwKKwkJMHgxZWZjMCwgMHgxZWZjOCwKKwkJMHgxZjA0MCwgMHgxZjA0YywKKwkJMHgxZjI4NCwgMHgxZjI4YywKKwkJMHgxZjJjMCwgMHgxZjJjMCwKKwkJMHgxZjJlMCwgMHgxZjJlMCwKKwkJMHgxZjMwMCwgMHgxZjM4NCwKKwkJMHgxZjNjMCwgMHgxZjNjOCwKKwkJMHgxZjQ0MCwgMHgxZjQ0YywKKwkJMHgxZjY4NCwgMHgxZjY4YywKKwkJMHgxZjZjMCwgMHgxZjZjMCwKKwkJMHgxZjZlMCwgMHgxZjZlMCwKKwkJMHgxZjcwMCwgMHgxZjc4NCwKKwkJMHgxZjdjMCwgMHgxZjdjOCwKKwkJMHgxZjg0MCwgMHgxZjg0YywKKwkJMHgxZmE4NCwgMHgxZmE4YywKKwkJMHgxZmFjMCwgMHgxZmFjMCwKKwkJMHgxZmFlMCwgMHgxZmFlMCwKKwkJMHgxZmIwMCwgMHgxZmI4NCwKKwkJMHgxZmJjMCwgMHgxZmJjOCwKKwkJMHgxZmM0MCwgMHgxZmM0YywKKwkJMHgxZmU4NCwgMHgxZmU4YywKKwkJMHgxZmVjMCwgMHgxZmVjMCwKKwkJMHgxZmVlMCwgMHgxZmVlMCwKKwkJMHgxZmYwMCwgMHgxZmY4NCwKKwkJMHgxZmZjMCwgMHgxZmZjOCwKKwkJMHgyMDAwMCwgMHgyMDAyYywKKwkJMHgyMDEwMCwgMHgyMDEzYywKKwkJMHgyMDE5MCwgMHgyMDFjOCwKKwkJMHgyMDIwMCwgMHgyMDMxOCwKKwkJMHgyMDQwMCwgMHgyMDUyOCwKKwkJMHgyMDU0MCwgMHgyMDYxNCwKKwkJMHgyMTAwMCwgMHgyMTA0MCwKKwkJMHgyMTA0YywgMHgyMTA2MCwKKwkJMHgyMTBjMCwgMHgyMTBlYywKKwkJMHgyMTIwMCwgMHgyMTI2OCwKKwkJMHgyMTI3MCwgMHgyMTI4NCwKKwkJMHgyMTJmYywgMHgyMTM4OCwKKwkJMHgyMTQwMCwgMHgyMTQwNCwKKwkJMHgyMTUwMCwgMHgyMTUxOCwKKwkJMHgyMTUyYywgMHgyMTUzYywKKwkJMHgyMTU1MCwgMHgyMTU1NCwKKwkJMHgyMTYwMCwgMHgyMTYwMCwKKwkJMHgyMTYwOCwgMHgyMTYyOCwKKwkJMHgyMTYzMCwgMHgyMTYzYywKKwkJMHgyMTcwMCwgMHgyMTcxYywKKwkJMHgyMTc4MCwgMHgyMTc4YywKKwkJMHgyMTgwMCwgMHgyMWMzOCwKKwkJMHgyMWM4MCwgMHgyMWQ3YywKKwkJMHgyMWUwMCwgMHgyMWUwNCwKKwkJMHgyMjAwMCwgMHgyMjAyYywKKwkJMHgyMjEwMCwgMHgyMjEzYywKKwkJMHgyMjE5MCwgMHgyMjFjOCwKKwkJMHgyMjIwMCwgMHgyMjMxOCwKKwkJMHgyMjQwMCwgMHgyMjUyOCwKKwkJMHgyMjU0MCwgMHgyMjYxNCwKKwkJMHgyMzAwMCwgMHgyMzA0MCwKKwkJMHgyMzA0YywgMHgyMzA2MCwKKwkJMHgyMzBjMCwgMHgyMzBlYywKKwkJMHgyMzIwMCwgMHgyMzI2OCwKKwkJMHgyMzI3MCwgMHgyMzI4NCwKKwkJMHgyMzJmYywgMHgyMzM4OCwKKwkJMHgyMzQwMCwgMHgyMzQwNCwKKwkJMHgyMzUwMCwgMHgyMzUxOCwKKwkJMHgyMzUyYywgMHgyMzUzYywKKwkJMHgyMzU1MCwgMHgyMzU1NCwKKwkJMHgyMzYwMCwgMHgyMzYwMCwKKwkJMHgyMzYwOCwgMHgyMzYyOCwKKwkJMHgyMzYzMCwgMHgyMzYzYywKKwkJMHgyMzcwMCwgMHgyMzcxYywKKwkJMHgyMzc4MCwgMHgyMzc4YywKKwkJMHgyMzgwMCwgMHgyM2MzOCwKKwkJMHgyM2M4MCwgMHgyM2Q3YywKKwkJMHgyM2UwMCwgMHgyM2UwNCwKKwkJMHgyNDAwMCwgMHgyNDAyYywKKwkJMHgyNDEwMCwgMHgyNDEzYywKKwkJMHgyNDE5MCwgMHgyNDFjOCwKKwkJMHgyNDIwMCwgMHgyNDMxOCwKKwkJMHgyNDQwMCwgMHgyNDUyOCwKKwkJMHgyNDU0MCwgMHgyNDYxNCwKKwkJMHgyNTAwMCwgMHgyNTA0MCwKKwkJMHgyNTA0YywgMHgyNTA2MCwKKwkJMHgyNTBjMCwgMHgyNTBlYywKKwkJMHgyNTIwMCwgMHgyNTI2OCwKKwkJMHgyNTI3MCwgMHgyNTI4NCwKKwkJMHgyNTJmYywgMHgyNTM4OCwKKwkJMHgyNTQwMCwgMHgyNTQwNCwKKwkJMHgyNTUwMCwgMHgyNTUxOCwKKwkJMHgyNTUyYywgMHgyNTUzYywKKwkJMHgyNTU1MCwgMHgyNTU1NCwKKwkJMHgyNTYwMCwgMHgyNTYwMCwKKwkJMHgyNTYwOCwgMHgyNTYyOCwKKwkJMHgyNTYzMCwgMHgyNTYzYywKKwkJMHgyNTcwMCwgMHgyNTcxYywKKwkJMHgyNTc4MCwgMHgyNTc4YywKKwkJMHgyNTgwMCwgMHgyNWMzOCwKKwkJMHgyNWM4MCwgMHgyNWQ3YywKKwkJMHgyNWUwMCwgMHgyNWUwNCwKKwkJMHgyNjAwMCwgMHgyNjAyYywKKwkJMHgyNjEwMCwgMHgyNjEzYywKKwkJMHgyNjE5MCwgMHgyNjFjOCwKKwkJMHgyNjIwMCwgMHgyNjMxOCwKKwkJMHgyNjQwMCwgMHgyNjUyOCwKKwkJMHgyNjU0MCwgMHgyNjYxNCwKKwkJMHgyNzAwMCwgMHgyNzA0MCwKKwkJMHgyNzA0YywgMHgyNzA2MCwKKwkJMHgyNzBjMCwgMHgyNzBlYywKKwkJMHgyNzIwMCwgMHgyNzI2OCwKKwkJMHgyNzI3MCwgMHgyNzI4NCwKKwkJMHgyNzJmYywgMHgyNzM4OCwKKwkJMHgyNzQwMCwgMHgyNzQwNCwKKwkJMHgyNzUwMCwgMHgyNzUxOCwKKwkJMHgyNzUyYywgMHgyNzUzYywKKwkJMHgyNzU1MCwgMHgyNzU1NCwKKwkJMHgyNzYwMCwgMHgyNzYwMCwKKwkJMHgyNzYwOCwgMHgyNzYyOCwKKwkJMHgyNzYzMCwgMHgyNzYzYywKKwkJMHgyNzcwMCwgMHgyNzcxYywKKwkJMHgyNzc4MCwgMHgyNzc4YywKKwkJMHgyNzgwMCwgMHgyN2MzOCwKKwkJMHgyN2M4MCwgMHgyN2Q3YywKKwkJMHgyN2UwMCwgMHgyN2UwNAorCX07CisKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHQ1X3JlZ19yYW5nZXNbXSA9IHsKKwkJMHgxMDA4LCAweDExNDgsCisJCTB4MTE4MCwgMHgxMWI0LAorCQkweDExZmMsIDB4MTIzYywKKwkJMHgxMjgwLCAweDE3M2MsCisJCTB4MTgwMCwgMHgxOGZjLAorCQkweDMwMDAsIDB4MzAyOCwKKwkJMHgzMDYwLCAweDMwZDgsCisJCTB4MzBlMCwgMHgzMGZjLAorCQkweDMxNDAsIDB4MzU3YywKKwkJMHgzNWE4LCAweDM1Y2MsCisJCTB4MzVlYywgMHgzNWVjLAorCQkweDM2MDAsIDB4NTYyNCwKKwkJMHg1NmNjLCAweDU3NWMsCisJCTB4NTgwYywgMHg1ODE0LAorCQkweDU4OTAsIDB4NThiYywKKwkJMHg1OTQwLCAweDU5ZGMsCisJCTB4NTlmYywgMHg1YTE4LAorCQkweDVhNjAsIDB4NWE5YywKKwkJMHg1YjljLCAweDViZmMsCisJCTB4NjAwMCwgMHg2MDQwLAorCQkweDYwNTgsIDB4NjE0YywKKwkJMHg3NzAwLCAweDc3OTgsCisJCTB4NzdjMCwgMHg3OGZjLAorCQkweDdiMDAsIDB4N2M1NCwKKwkJMHg3ZDAwLCAweDdlZmMsCisJCTB4OGRjMCwgMHg4ZGUwLAorCQkweDhkZjgsIDB4OGU4NCwKKwkJMHg4ZWEwLCAweDhmODQsCisJCTB4OGZjMCwgMHg5MGY4LAorCQkweDk0MDAsIDB4OTQ3MCwKKwkJMHg5NjAwLCAweDk2ZjQsCisJCTB4OTgwMCwgMHg5ODA4LAorCQkweDk4MjAsIDB4OTgzYywKKwkJMHg5ODUwLCAweDk4NjQsCisJCTB4OWMwMCwgMHg5YzZjLAorCQkweDljODAsIDB4OWNlYywKKwkJMHg5ZDAwLCAweDlkNmMsCisJCTB4OWQ4MCwgMHg5ZGVjLAorCQkweDllMDAsIDB4OWU2YywKKwkJMHg5ZTgwLCAweDllZWMsCisJCTB4OWYwMCwgMHg5ZjZjLAorCQkweDlmODAsIDB4YTAyMCwKKwkJMHhkMDA0LCAweGQwM2MsCisJCTB4ZGZjMCwgMHhkZmUwLAorCQkweGUwMDAsIDB4MTEwODgsCisJCTB4MTEwOWMsIDB4MTExMTAsCisJCTB4MTExMTgsIDB4MTExN2MsCisJCTB4MTExOTAsIDB4MTEyMDQsCisJCTB4MTkwNDAsIDB4MTkwNmMsCisJCTB4MTkwNzgsIDB4MTkwODAsCisJCTB4MTkwOGMsIDB4MTkxMjQsCisJCTB4MTkxNTAsIDB4MTkxYjAsCisJCTB4MTkxZDAsIDB4MTkxZTgsCisJCTB4MTkyMzgsIDB4MTkyOTAsCisJCTB4MTkzZjgsIDB4MTk0NzQsCisJCTB4MTk0OTAsIDB4MTk0Y2MsCisJCTB4MTk0ZjAsIDB4MTk0ZjgsCisJCTB4MTljMDAsIDB4MTljNjAsCisJCTB4MTljOTQsIDB4MTllMTAsCisJCTB4MTllNTAsIDB4MTlmMzQsCisJCTB4MTlmNDAsIDB4MTlmNTAsCisJCTB4MTlmOTAsIDB4MTlmZTQsCisJCTB4MWEwMDAsIDB4MWEwNmMsCisJCTB4MWEwYjAsIDB4MWExMjAsCisJCTB4MWExMjgsIDB4MWExMzgsCisJCTB4MWExOTAsIDB4MWExYzQsCisJCTB4MWExZmMsIDB4MWExZmMsCisJCTB4MWUwMDgsIDB4MWUwMGMsCisJCTB4MWUwNDAsIDB4MWUwNGMsCisJCTB4MWUyODQsIDB4MWUyOTAsCisJCTB4MWUyYzAsIDB4MWUyYzAsCisJCTB4MWUyZTAsIDB4MWUyZTAsCisJCTB4MWUzMDAsIDB4MWUzODQsCisJCTB4MWUzYzAsIDB4MWUzYzgsCisJCTB4MWU0MDgsIDB4MWU0MGMsCisJCTB4MWU0NDAsIDB4MWU0NGMsCisJCTB4MWU2ODQsIDB4MWU2OTAsCisJCTB4MWU2YzAsIDB4MWU2YzAsCisJCTB4MWU2ZTAsIDB4MWU2ZTAsCisJCTB4MWU3MDAsIDB4MWU3ODQsCisJCTB4MWU3YzAsIDB4MWU3YzgsCisJCTB4MWU4MDgsIDB4MWU4MGMsCisJCTB4MWU4NDAsIDB4MWU4NGMsCisJCTB4MWVhODQsIDB4MWVhOTAsCisJCTB4MWVhYzAsIDB4MWVhYzAsCisJCTB4MWVhZTAsIDB4MWVhZTAsCisJCTB4MWViMDAsIDB4MWViODQsCisJCTB4MWViYzAsIDB4MWViYzgsCisJCTB4MWVjMDgsIDB4MWVjMGMsCisJCTB4MWVjNDAsIDB4MWVjNGMsCisJCTB4MWVlODQsIDB4MWVlOTAsCisJCTB4MWVlYzAsIDB4MWVlYzAsCisJCTB4MWVlZTAsIDB4MWVlZTAsCisJCTB4MWVmMDAsIDB4MWVmODQsCisJCTB4MWVmYzAsIDB4MWVmYzgsCisJCTB4MWYwMDgsIDB4MWYwMGMsCisJCTB4MWYwNDAsIDB4MWYwNGMsCisJCTB4MWYyODQsIDB4MWYyOTAsCisJCTB4MWYyYzAsIDB4MWYyYzAsCisJCTB4MWYyZTAsIDB4MWYyZTAsCisJCTB4MWYzMDAsIDB4MWYzODQsCisJCTB4MWYzYzAsIDB4MWYzYzgsCisJCTB4MWY0MDgsIDB4MWY0MGMsCisJCTB4MWY0NDAsIDB4MWY0NGMsCisJCTB4MWY2ODQsIDB4MWY2OTAsCisJCTB4MWY2YzAsIDB4MWY2YzAsCisJCTB4MWY2ZTAsIDB4MWY2ZTAsCisJCTB4MWY3MDAsIDB4MWY3ODQsCisJCTB4MWY3YzAsIDB4MWY3YzgsCisJCTB4MWY4MDgsIDB4MWY4MGMsCisJCTB4MWY4NDAsIDB4MWY4NGMsCisJCTB4MWZhODQsIDB4MWZhOTAsCisJCTB4MWZhYzAsIDB4MWZhYzAsCisJCTB4MWZhZTAsIDB4MWZhZTAsCisJCTB4MWZiMDAsIDB4MWZiODQsCisJCTB4MWZiYzAsIDB4MWZiYzgsCisJCTB4MWZjMDgsIDB4MWZjMGMsCisJCTB4MWZjNDAsIDB4MWZjNGMsCisJCTB4MWZlODQsIDB4MWZlOTAsCisJCTB4MWZlYzAsIDB4MWZlYzAsCisJCTB4MWZlZTAsIDB4MWZlZTAsCisJCTB4MWZmMDAsIDB4MWZmODQsCisJCTB4MWZmYzAsIDB4MWZmYzgsCisJCTB4MzAwMDAsIDB4MzAwMzAsCisJCTB4MzAxMDAsIDB4MzAxNDQsCisJCTB4MzAxOTAsIDB4MzAxZDAsCisJCTB4MzAyMDAsIDB4MzAzMTgsCisJCTB4MzA0MDAsIDB4MzA1MmMsCisJCTB4MzA1NDAsIDB4MzA2MWMsCisJCTB4MzA4MDAsIDB4MzA4MzQsCisJCTB4MzA4YzAsIDB4MzA5MDgsCisJCTB4MzA5MTAsIDB4MzA5YWMsCisJCTB4MzBhMDAsIDB4MzBhMDQsCisJCTB4MzBhMGMsIDB4MzBhMmMsCisJCTB4MzBhNDQsIDB4MzBhNTAsCisJCTB4MzBhNzQsIDB4MzBjMjQsCisJCTB4MzBkMDgsIDB4MzBkMTQsCisJCTB4MzBkMWMsIDB4MzBkMjAsCisJCTB4MzBkM2MsIDB4MzBkNTAsCisJCTB4MzEyMDAsIDB4MzEyMGMsCisJCTB4MzEyMjAsIDB4MzEyMjAsCisJCTB4MzEyNDAsIDB4MzEyNDAsCisJCTB4MzE2MDAsIDB4MzE2MDAsCisJCTB4MzE2MDgsIDB4MzE2MGMsCisJCTB4MzFhMDAsIDB4MzFhMWMsCisJCTB4MzFlMDQsIDB4MzFlMjAsCisJCTB4MzFlMzgsIDB4MzFlM2MsCisJCTB4MzFlODAsIDB4MzFlODAsCisJCTB4MzFlODgsIDB4MzFlYTgsCisJCTB4MzFlYjAsIDB4MzFlYjQsCisJCTB4MzFlYzgsIDB4MzFlZDQsCisJCTB4MzFmYjgsIDB4MzIwMDQsCisJCTB4MzIyMDgsIDB4MzIyM2MsCisJCTB4MzI2MDAsIDB4MzI2MzAsCisJCTB4MzJhMDAsIDB4MzJhYmMsCisJCTB4MzJiMDAsIDB4MzJiNzAsCisJCTB4MzMwMDAsIDB4MzMwNDgsCisJCTB4MzMwNjAsIDB4MzMwOWMsCisJCTB4MzMwZjAsIDB4MzMxNDgsCisJCTB4MzMxNjAsIDB4MzMxOWMsCisJCTB4MzMxZjAsIDB4MzMyZTQsCisJCTB4MzMyZjgsIDB4MzMzZTQsCisJCTB4MzMzZjgsIDB4MzM0NDgsCisJCTB4MzM0NjAsIDB4MzM0OWMsCisJCTB4MzM0ZjAsIDB4MzM1NDgsCisJCTB4MzM1NjAsIDB4MzM1OWMsCisJCTB4MzM1ZjAsIDB4MzM2ZTQsCisJCTB4MzM2ZjgsIDB4MzM3ZTQsCisJCTB4MzM3ZjgsIDB4MzM3ZmMsCisJCTB4MzM4MTQsIDB4MzM4MTQsCisJCTB4MzM4MmMsIDB4MzM4MmMsCisJCTB4MzM4ODAsIDB4MzM4OGMsCisJCTB4MzM4ZTgsIDB4MzM4ZWMsCisJCTB4MzM5MDAsIDB4MzM5NDgsCisJCTB4MzM5NjAsIDB4MzM5OWMsCisJCTB4MzM5ZjAsIDB4MzNhZTQsCisJCTB4MzNhZjgsIDB4MzNiMTAsCisJCTB4MzNiMjgsIDB4MzNiMjgsCisJCTB4MzNiM2MsIDB4MzNiNTAsCisJCTB4MzNiZjAsIDB4MzNjMTAsCisJCTB4MzNjMjgsIDB4MzNjMjgsCisJCTB4MzNjM2MsIDB4MzNjNTAsCisJCTB4MzNjZjAsIDB4MzNjZmMsCisJCTB4MzQwMDAsIDB4MzQwMzAsCisJCTB4MzQxMDAsIDB4MzQxNDQsCisJCTB4MzQxOTAsIDB4MzQxZDAsCisJCTB4MzQyMDAsIDB4MzQzMTgsCisJCTB4MzQ0MDAsIDB4MzQ1MmMsCisJCTB4MzQ1NDAsIDB4MzQ2MWMsCisJCTB4MzQ4MDAsIDB4MzQ4MzQsCisJCTB4MzQ4YzAsIDB4MzQ5MDgsCisJCTB4MzQ5MTAsIDB4MzQ5YWMsCisJCTB4MzRhMDAsIDB4MzRhMDQsCisJCTB4MzRhMGMsIDB4MzRhMmMsCisJCTB4MzRhNDQsIDB4MzRhNTAsCisJCTB4MzRhNzQsIDB4MzRjMjQsCisJCTB4MzRkMDgsIDB4MzRkMTQsCisJCTB4MzRkMWMsIDB4MzRkMjAsCisJCTB4MzRkM2MsIDB4MzRkNTAsCisJCTB4MzUyMDAsIDB4MzUyMGMsCisJCTB4MzUyMjAsIDB4MzUyMjAsCisJCTB4MzUyNDAsIDB4MzUyNDAsCisJCTB4MzU2MDAsIDB4MzU2MDAsCisJCTB4MzU2MDgsIDB4MzU2MGMsCisJCTB4MzVhMDAsIDB4MzVhMWMsCisJCTB4MzVlMDQsIDB4MzVlMjAsCisJCTB4MzVlMzgsIDB4MzVlM2MsCisJCTB4MzVlODAsIDB4MzVlODAsCisJCTB4MzVlODgsIDB4MzVlYTgsCisJCTB4MzVlYjAsIDB4MzVlYjQsCisJCTB4MzVlYzgsIDB4MzVlZDQsCisJCTB4MzVmYjgsIDB4MzYwMDQsCisJCTB4MzYyMDgsIDB4MzYyM2MsCisJCTB4MzY2MDAsIDB4MzY2MzAsCisJCTB4MzZhMDAsIDB4MzZhYmMsCisJCTB4MzZiMDAsIDB4MzZiNzAsCisJCTB4MzcwMDAsIDB4MzcwNDgsCisJCTB4MzcwNjAsIDB4MzcwOWMsCisJCTB4MzcwZjAsIDB4MzcxNDgsCisJCTB4MzcxNjAsIDB4MzcxOWMsCisJCTB4MzcxZjAsIDB4MzcyZTQsCisJCTB4MzcyZjgsIDB4MzczZTQsCisJCTB4MzczZjgsIDB4Mzc0NDgsCisJCTB4Mzc0NjAsIDB4Mzc0OWMsCisJCTB4Mzc0ZjAsIDB4Mzc1NDgsCisJCTB4Mzc1NjAsIDB4Mzc1OWMsCisJCTB4Mzc1ZjAsIDB4Mzc2ZTQsCisJCTB4Mzc2ZjgsIDB4Mzc3ZTQsCisJCTB4Mzc3ZjgsIDB4Mzc3ZmMsCisJCTB4Mzc4MTQsIDB4Mzc4MTQsCisJCTB4Mzc4MmMsIDB4Mzc4MmMsCisJCTB4Mzc4ODAsIDB4Mzc4OGMsCisJCTB4Mzc4ZTgsIDB4Mzc4ZWMsCisJCTB4Mzc5MDAsIDB4Mzc5NDgsCisJCTB4Mzc5NjAsIDB4Mzc5OWMsCisJCTB4Mzc5ZjAsIDB4MzdhZTQsCisJCTB4MzdhZjgsIDB4MzdiMTAsCisJCTB4MzdiMjgsIDB4MzdiMjgsCisJCTB4MzdiM2MsIDB4MzdiNTAsCisJCTB4MzdiZjAsIDB4MzdjMTAsCisJCTB4MzdjMjgsIDB4MzdjMjgsCisJCTB4MzdjM2MsIDB4MzdjNTAsCisJCTB4MzdjZjAsIDB4MzdjZmMsCisJCTB4MzgwMDAsIDB4MzgwMzAsCisJCTB4MzgxMDAsIDB4MzgxNDQsCisJCTB4MzgxOTAsIDB4MzgxZDAsCisJCTB4MzgyMDAsIDB4MzgzMTgsCisJCTB4Mzg0MDAsIDB4Mzg1MmMsCisJCTB4Mzg1NDAsIDB4Mzg2MWMsCisJCTB4Mzg4MDAsIDB4Mzg4MzQsCisJCTB4Mzg4YzAsIDB4Mzg5MDgsCisJCTB4Mzg5MTAsIDB4Mzg5YWMsCisJCTB4MzhhMDAsIDB4MzhhMDQsCisJCTB4MzhhMGMsIDB4MzhhMmMsCisJCTB4MzhhNDQsIDB4MzhhNTAsCisJCTB4MzhhNzQsIDB4MzhjMjQsCisJCTB4MzhkMDgsIDB4MzhkMTQsCisJCTB4MzhkMWMsIDB4MzhkMjAsCisJCTB4MzhkM2MsIDB4MzhkNTAsCisJCTB4MzkyMDAsIDB4MzkyMGMsCisJCTB4MzkyMjAsIDB4MzkyMjAsCisJCTB4MzkyNDAsIDB4MzkyNDAsCisJCTB4Mzk2MDAsIDB4Mzk2MDAsCisJCTB4Mzk2MDgsIDB4Mzk2MGMsCisJCTB4MzlhMDAsIDB4MzlhMWMsCisJCTB4MzllMDQsIDB4MzllMjAsCisJCTB4MzllMzgsIDB4MzllM2MsCisJCTB4MzllODAsIDB4MzllODAsCisJCTB4MzllODgsIDB4MzllYTgsCisJCTB4MzllYjAsIDB4MzllYjQsCisJCTB4MzllYzgsIDB4MzllZDQsCisJCTB4MzlmYjgsIDB4M2EwMDQsCisJCTB4M2EyMDgsIDB4M2EyM2MsCisJCTB4M2E2MDAsIDB4M2E2MzAsCisJCTB4M2FhMDAsIDB4M2FhYmMsCisJCTB4M2FiMDAsIDB4M2FiNzAsCisJCTB4M2IwMDAsIDB4M2IwNDgsCisJCTB4M2IwNjAsIDB4M2IwOWMsCisJCTB4M2IwZjAsIDB4M2IxNDgsCisJCTB4M2IxNjAsIDB4M2IxOWMsCisJCTB4M2IxZjAsIDB4M2IyZTQsCisJCTB4M2IyZjgsIDB4M2IzZTQsCisJCTB4M2IzZjgsIDB4M2I0NDgsCisJCTB4M2I0NjAsIDB4M2I0OWMsCisJCTB4M2I0ZjAsIDB4M2I1NDgsCisJCTB4M2I1NjAsIDB4M2I1OWMsCisJCTB4M2I1ZjAsIDB4M2I2ZTQsCisJCTB4M2I2ZjgsIDB4M2I3ZTQsCisJCTB4M2I3ZjgsIDB4M2I3ZmMsCisJCTB4M2I4MTQsIDB4M2I4MTQsCisJCTB4M2I4MmMsIDB4M2I4MmMsCisJCTB4M2I4ODAsIDB4M2I4OGMsCisJCTB4M2I4ZTgsIDB4M2I4ZWMsCisJCTB4M2I5MDAsIDB4M2I5NDgsCisJCTB4M2I5NjAsIDB4M2I5OWMsCisJCTB4M2I5ZjAsIDB4M2JhZTQsCisJCTB4M2JhZjgsIDB4M2JiMTAsCisJCTB4M2JiMjgsIDB4M2JiMjgsCisJCTB4M2JiM2MsIDB4M2JiNTAsCisJCTB4M2JiZjAsIDB4M2JjMTAsCisJCTB4M2JjMjgsIDB4M2JjMjgsCisJCTB4M2JjM2MsIDB4M2JjNTAsCisJCTB4M2JjZjAsIDB4M2JjZmMsCisJCTB4M2MwMDAsIDB4M2MwMzAsCisJCTB4M2MxMDAsIDB4M2MxNDQsCisJCTB4M2MxOTAsIDB4M2MxZDAsCisJCTB4M2MyMDAsIDB4M2MzMTgsCisJCTB4M2M0MDAsIDB4M2M1MmMsCisJCTB4M2M1NDAsIDB4M2M2MWMsCisJCTB4M2M4MDAsIDB4M2M4MzQsCisJCTB4M2M4YzAsIDB4M2M5MDgsCisJCTB4M2M5MTAsIDB4M2M5YWMsCisJCTB4M2NhMDAsIDB4M2NhMDQsCisJCTB4M2NhMGMsIDB4M2NhMmMsCisJCTB4M2NhNDQsIDB4M2NhNTAsCisJCTB4M2NhNzQsIDB4M2NjMjQsCisJCTB4M2NkMDgsIDB4M2NkMTQsCisJCTB4M2NkMWMsIDB4M2NkMjAsCisJCTB4M2NkM2MsIDB4M2NkNTAsCisJCTB4M2QyMDAsIDB4M2QyMGMsCisJCTB4M2QyMjAsIDB4M2QyMjAsCisJCTB4M2QyNDAsIDB4M2QyNDAsCisJCTB4M2Q2MDAsIDB4M2Q2MDAsCisJCTB4M2Q2MDgsIDB4M2Q2MGMsCisJCTB4M2RhMDAsIDB4M2RhMWMsCisJCTB4M2RlMDQsIDB4M2RlMjAsCisJCTB4M2RlMzgsIDB4M2RlM2MsCisJCTB4M2RlODAsIDB4M2RlODAsCisJCTB4M2RlODgsIDB4M2RlYTgsCisJCTB4M2RlYjAsIDB4M2RlYjQsCisJCTB4M2RlYzgsIDB4M2RlZDQsCisJCTB4M2RmYjgsIDB4M2UwMDQsCisJCTB4M2UyMDgsIDB4M2UyM2MsCisJCTB4M2U2MDAsIDB4M2U2MzAsCisJCTB4M2VhMDAsIDB4M2VhYmMsCisJCTB4M2ViMDAsIDB4M2ViNzAsCisJCTB4M2YwMDAsIDB4M2YwNDgsCisJCTB4M2YwNjAsIDB4M2YwOWMsCisJCTB4M2YwZjAsIDB4M2YxNDgsCisJCTB4M2YxNjAsIDB4M2YxOWMsCisJCTB4M2YxZjAsIDB4M2YyZTQsCisJCTB4M2YyZjgsIDB4M2YzZTQsCisJCTB4M2YzZjgsIDB4M2Y0NDgsCisJCTB4M2Y0NjAsIDB4M2Y0OWMsCisJCTB4M2Y0ZjAsIDB4M2Y1NDgsCisJCTB4M2Y1NjAsIDB4M2Y1OWMsCisJCTB4M2Y1ZjAsIDB4M2Y2ZTQsCisJCTB4M2Y2ZjgsIDB4M2Y3ZTQsCisJCTB4M2Y3ZjgsIDB4M2Y3ZmMsCisJCTB4M2Y4MTQsIDB4M2Y4MTQsCisJCTB4M2Y4MmMsIDB4M2Y4MmMsCisJCTB4M2Y4ODAsIDB4M2Y4OGMsCisJCTB4M2Y4ZTgsIDB4M2Y4ZWMsCisJCTB4M2Y5MDAsIDB4M2Y5NDgsCisJCTB4M2Y5NjAsIDB4M2Y5OWMsCisJCTB4M2Y5ZjAsIDB4M2ZhZTQsCisJCTB4M2ZhZjgsIDB4M2ZiMTAsCisJCTB4M2ZiMjgsIDB4M2ZiMjgsCisJCTB4M2ZiM2MsIDB4M2ZiNTAsCisJCTB4M2ZiZjAsIDB4M2ZjMTAsCisJCTB4M2ZjMjgsIDB4M2ZjMjgsCisJCTB4M2ZjM2MsIDB4M2ZjNTAsCisJCTB4M2ZjZjAsIDB4M2ZjZmMsCisJCTB4NDAwMDAsIDB4NDAwMGMsCisJCTB4NDAwNDAsIDB4NDAwNjgsCisJCTB4NDAwODAsIDB4NDAxNDQsCisJCTB4NDAxODAsIDB4NDAxOGMsCisJCTB4NDAyMDAsIDB4NDAyOTgsCisJCTB4NDAyYWMsIDB4NDAzM2MsCisJCTB4NDAzZjgsIDB4NDAzZmMsCisJCTB4NDEzMDQsIDB4NDEzYzQsCisJCTB4NDE0MDAsIDB4NDE0MWMsCisJCTB4NDE0ODAsIDB4NDE0ZDAsCisJCTB4NDQwMDAsIDB4NDQwNzgsCisJCTB4NDQwYzAsIDB4NDQyNzgsCisJCTB4NDQyYzAsIDB4NDQ0NzgsCisJCTB4NDQ0YzAsIDB4NDQ2NzgsCisJCTB4NDQ2YzAsIDB4NDQ4NzgsCisJCTB4NDQ4YzAsIDB4NDQ5ZmMsCisJCTB4NDUwMDAsIDB4NDUwNjgsCisJCTB4NDUwODAsIDB4NDUwODQsCisJCTB4NDUwYTAsIDB4NDUwYjAsCisJCTB4NDUyMDAsIDB4NDUyNjgsCisJCTB4NDUyODAsIDB4NDUyODQsCisJCTB4NDUyYTAsIDB4NDUyYjAsCisJCTB4NDYwYzAsIDB4NDYwZTQsCisJCTB4NDcwMDAsIDB4NDcwOGMsCisJCTB4NDcyMDAsIDB4NDcyNTAsCisJCTB4NDc0MDAsIDB4NDc0MjAsCisJCTB4NDc2MDAsIDB4NDc2MTgsCisJCTB4NDc4MDAsIDB4NDc4MTQsCisJCTB4NDgwMDAsIDB4NDgwMGMsCisJCTB4NDgwNDAsIDB4NDgwNjgsCisJCTB4NDgwODAsIDB4NDgxNDQsCisJCTB4NDgxODAsIDB4NDgxOGMsCisJCTB4NDgyMDAsIDB4NDgyOTgsCisJCTB4NDgyYWMsIDB4NDgzM2MsCisJCTB4NDgzZjgsIDB4NDgzZmMsCisJCTB4NDkzMDQsIDB4NDkzYzQsCisJCTB4NDk0MDAsIDB4NDk0MWMsCisJCTB4NDk0ODAsIDB4NDk0ZDAsCisJCTB4NGMwMDAsIDB4NGMwNzgsCisJCTB4NGMwYzAsIDB4NGMyNzgsCisJCTB4NGMyYzAsIDB4NGM0NzgsCisJCTB4NGM0YzAsIDB4NGM2NzgsCisJCTB4NGM2YzAsIDB4NGM4NzgsCisJCTB4NGM4YzAsIDB4NGM5ZmMsCisJCTB4NGQwMDAsIDB4NGQwNjgsCisJCTB4NGQwODAsIDB4NGQwODQsCisJCTB4NGQwYTAsIDB4NGQwYjAsCisJCTB4NGQyMDAsIDB4NGQyNjgsCisJCTB4NGQyODAsIDB4NGQyODQsCisJCTB4NGQyYTAsIDB4NGQyYjAsCisJCTB4NGUwYzAsIDB4NGUwZTQsCisJCTB4NGYwMDAsIDB4NGYwOGMsCisJCTB4NGYyMDAsIDB4NGYyNTAsCisJCTB4NGY0MDAsIDB4NGY0MjAsCisJCTB4NGY2MDAsIDB4NGY2MTgsCisJCTB4NGY4MDAsIDB4NGY4MTQsCisJCTB4NTAwMDAsIDB4NTAwY2MsCisJCTB4NTA0MDAsIDB4NTA0MDAsCisJCTB4NTA4MDAsIDB4NTA4Y2MsCisJCTB4NTBjMDAsIDB4NTBjMDAsCisJCTB4NTEwMDAsIDB4NTEwMWMsCisJCTB4NTEzMDAsIDB4NTEzMDgsCisJfTsKKworCXUzMiAqYnVmX2VuZCA9ICh1MzIgKikoKGNoYXIgKilidWYgKyBidWZfc2l6ZSk7CisJY29uc3QgdW5zaWduZWQgaW50ICpyZWdfcmFuZ2VzOworCWludCByZWdfcmFuZ2VzX3NpemUsIHJhbmdlOworCXVuc2lnbmVkIGludCBjaGlwX3ZlcnNpb24gPSBDSEVMU0lPX0NISVBfVkVSU0lPTihhZGFwLT5wYXJhbXMuY2hpcCk7CisKKwkvKiBTZWxlY3QgdGhlIHJpZ2h0IHNldCBvZiByZWdpc3RlciByYW5nZXMgdG8gZHVtcCBkZXBlbmRpbmcgb24gdGhlCisJICogYWRhcHRlciBjaGlwIHR5cGUuCisJICovCisJc3dpdGNoIChjaGlwX3ZlcnNpb24pIHsKKwljYXNlIENIRUxTSU9fVDQ6CisJCXJlZ19yYW5nZXMgPSB0NF9yZWdfcmFuZ2VzOworCQlyZWdfcmFuZ2VzX3NpemUgPSBBUlJBWV9TSVpFKHQ0X3JlZ19yYW5nZXMpOworCQlicmVhazsKKworCWNhc2UgQ0hFTFNJT19UNToKKwkJcmVnX3JhbmdlcyA9IHQ1X3JlZ19yYW5nZXM7CisJCXJlZ19yYW5nZXNfc2l6ZSA9IEFSUkFZX1NJWkUodDVfcmVnX3Jhbmdlcyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycihhZGFwLT5wZGV2X2RldiwKKwkJCSJVbnN1cHBvcnRlZCBjaGlwIHZlcnNpb24gJWRcbiIsIGNoaXBfdmVyc2lvbik7CisJCXJldHVybjsKKwl9CisKKwkvKiBDbGVhciB0aGUgcmVnaXN0ZXIgYnVmZmVyIGFuZCBpbnNlcnQgdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyCisJICogdmFsdWVzIHNlbGVjdGVkIGJ5IHRoZSBhYm92ZSByZWdpc3RlciByYW5nZXMuCisJICovCisJbWVtc2V0KGJ1ZiwgMCwgYnVmX3NpemUpOworCWZvciAocmFuZ2UgPSAwOyByYW5nZSA8IHJlZ19yYW5nZXNfc2l6ZTsgcmFuZ2UgKz0gMikgeworCQl1bnNpZ25lZCBpbnQgcmVnID0gcmVnX3Jhbmdlc1tyYW5nZV07CisJCXVuc2lnbmVkIGludCBsYXN0X3JlZyA9IHJlZ19yYW5nZXNbcmFuZ2UgKyAxXTsKKwkJdTMyICpidWZwID0gKHUzMiAqKSgoY2hhciAqKWJ1ZiArIHJlZyk7CisKKwkJLyogSXRlcmF0ZSBhY3Jvc3MgdGhlIHJlZ2lzdGVyIHJhbmdlIGZpbGxpbmcgaW4gdGhlIHJlZ2lzdGVyCisJCSAqIGJ1ZmZlciBidXQgZG9uJ3Qgd3JpdGUgcGFzdCB0aGUgZW5kIG9mIHRoZSByZWdpc3RlciBidWZmZXIuCisJCSAqLworCQl3aGlsZSAocmVnIDw9IGxhc3RfcmVnICYmIGJ1ZnAgPCBidWZfZW5kKSB7CisJCQkqYnVmcCsrID0gdDRfcmVhZF9yZWcoYWRhcCwgcmVnKTsKKwkJCXJlZyArPSBzaXplb2YodTMyKTsKKwkJfQorCX0KK30KKwogI2RlZmluZSBFRVBST01fU1RBVF9BRERSICAgMHg3YmZjCiAjZGVmaW5lIFZQRF9CQVNFICAgICAgICAgICAweDQwMAogI2RlZmluZSBWUERfQkFTRV9PTEQgICAgICAgMApAQCAtODY3LDcgKzE1OTUsNyBAQAogICoJUmVhZCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiAzMi1iaXQgd29yZHMgZnJvbSB0aGUgc2VyaWFsIGZsYXNoLgogICoJSWYgQGJ5dGVfb3JpZW50ZWQgaXMgc2V0IHRoZSByZWFkIGRhdGEgaXMgc3RvcmVkIGFzIGEgYnl0ZSBhcnJheQogICoJKGkuZS4sIGJpZy1lbmRpYW4pLCBvdGhlcndpc2UgYXMgMzItYml0IHdvcmRzIGluIHRoZSBwbGF0Zm9ybSdzCi0gKgluYXR1cmFsIGVuZGlhbmVzcy4KKyAqCW5hdHVyYWwgZW5kaWFubmVzcy4KICAqLwogaW50IHQ0X3JlYWRfZmxhc2goc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHVuc2lnbmVkIGludCBhZGRyLAogCQkgIHVuc2lnbmVkIGludCBud29yZHMsIHUzMiAqZGF0YSwgaW50IGJ5dGVfb3JpZW50ZWQpCkBAIC0xMTIwLDcgKzE4NDgsNyBAQAogCQl9CiAKIAkJLyogSW5zdGFsbGVkIHN1Y2Nlc3NmdWxseSwgdXBkYXRlIHRoZSBjYWNoZWQgaGVhZGVyIHRvby4gKi8KLQkJbWVtY3B5KGNhcmRfZncsIGZzX2Z3LCBzaXplb2YoKmNhcmRfZncpKTsKKwkJKmNhcmRfZncgPSAqZnNfZnc7CiAJCWNhcmRfZndfdXNhYmxlID0gMTsKIAkJKnJlc2V0ID0gMDsJLyogYWxyZWFkeSByZXNldCBhcyBwYXJ0IG9mIGxvYWRfZncgKi8KIAl9CkBAIC0zNTU4LDcgKzQyODYsNyBAQAogCSAqIEZvciB0aGUgc2luZ2xlLU1UVSBidWZmZXJzIGluIHVucGFja2VkIG1vZGUgd2UgbmVlZCB0byBpbmNsdWRlCiAJICogc3BhY2UgZm9yIHRoZSBTR0UgQ29udHJvbCBQYWNrZXQgU2hpZnQsIDE0IGJ5dGUgRXRoZXJuZXQgaGVhZGVyLAogCSAqIHBvc3NpYmxlIDQgYnl0ZSBWTEFOIHRhZywgYWxsIHJvdW5kZWQgdXAgdG8gdGhlIG5leHQgSW5ncmVzcyBQYWNrZXQKLQkgKiBQYWRkaW5nIGJvdW5kcnkuICBBbGwgb2YgdGhlc2UgYXJlIGFjY29tbW9kYXRlZCBpbiB0aGUgRmFjdG9yeQorCSAqIFBhZGRpbmcgYm91bmRhcnkuICBBbGwgb2YgdGhlc2UgYXJlIGFjY29tbW9kYXRlZCBpbiB0aGUgRmFjdG9yeQogCSAqIERlZmF1bHQgRmlybXdhcmUgQ29uZmlndXJhdGlvbiBGaWxlIGJ1dCB3ZSBuZWVkIHRvIGFkanVzdCBpdCBmb3IKIAkgKiB0aGlzIGhvc3QncyBjYWNoZSBsaW5lIHNpemUuCiAJICovCkBAIC00NDU5LDYgKzUxODcsNTkgQEAKIH0KIAogLyoqCisgKgl0NF9pbml0X2RldmxvZ19wYXJhbXMgLSBpbml0aWFsaXplIGFkYXB0ZXItPnBhcmFtcy5kZXZsb2cKKyAqCUBhZGFwOiB0aGUgYWRhcHRlcgorICoKKyAqCUluaXRpYWxpemUgdmFyaW91cyBmaWVsZHMgb2YgdGhlIGFkYXB0ZXIncyBGaXJtd2FyZSBEZXZpY2UgTG9nCisgKglQYXJhbWV0ZXJzIHN0cnVjdHVyZS4KKyAqLworaW50IHQ0X2luaXRfZGV2bG9nX3BhcmFtcyhzdHJ1Y3QgYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgZGV2bG9nX3BhcmFtcyAqZHBhcmFtcyA9ICZhZGFwLT5wYXJhbXMuZGV2bG9nOworCXUzMiBwZl9kcGFyYW1zOworCXVuc2lnbmVkIGludCBkZXZsb2dfbWVtaW5mbzsKKwlzdHJ1Y3QgZndfZGV2bG9nX2NtZCBkZXZsb2dfY21kOworCWludCByZXQ7CisKKwkvKiBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggbmV3ZXIgZmlybXdhcmUsIHRoZSBEZXZpY2UgTG9nIFBhcmFtZXJ0ZXJzCisJICogYXJlIHN0b3JlZCBpbiBhIGRlc2lnbmF0ZWQgcmVnaXN0ZXIgd2hpY2ggYWxsb3dzIHVzIHRvIGFjY2VzcyB0aGUKKwkgKiBEZXZpY2UgTG9nIGV2ZW4gaWYgd2UgY2FuJ3QgdGFsayB0byB0aGUgZmlybXdhcmUuCisJICovCisJcGZfZHBhcmFtcyA9CisJCXQ0X3JlYWRfcmVnKGFkYXAsIFBDSUVfRldfUkVHKFBDSUVfRldfUEZfQSwgUENJRV9GV19QRl9ERVZMT0cpKTsKKwlpZiAocGZfZHBhcmFtcykgeworCQl1bnNpZ25lZCBpbnQgbmVudHJpZXMsIG5lbnRyaWVzMTI4OworCisJCWRwYXJhbXMtPm1lbXR5cGUgPSBQQ0lFX0ZXX1BGX0RFVkxPR19NRU1UWVBFX0cocGZfZHBhcmFtcyk7CisJCWRwYXJhbXMtPnN0YXJ0ID0gUENJRV9GV19QRl9ERVZMT0dfQUREUjE2X0cocGZfZHBhcmFtcykgPDwgNDsKKworCQluZW50cmllczEyOCA9IFBDSUVfRldfUEZfREVWTE9HX05FTlRSSUVTMTI4X0cocGZfZHBhcmFtcyk7CisJCW5lbnRyaWVzID0gKG5lbnRyaWVzMTI4ICsgMSkgKiAxMjg7CisJCWRwYXJhbXMtPnNpemUgPSBuZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgZndfZGV2bG9nX2UpOworCisJCXJldHVybiAwOworCX0KKworCS8qIE90aGVyd2lzZSwgYXNrIHRoZSBmaXJtd2FyZSBmb3IgaXQncyBEZXZpY2UgTG9nIFBhcmFtZXRlcnMuCisJICovCisJbWVtc2V0KCZkZXZsb2dfY21kLCAwLCBzaXplb2YoZGV2bG9nX2NtZCkpOworCWRldmxvZ19jbWQub3BfdG9fd3JpdGUgPSBodG9ubChGV19DTURfT1BfVihGV19ERVZMT0dfQ01EKSB8CisJCQkJICAgICAgIEZXX0NNRF9SRVFVRVNUX0YgfCBGV19DTURfUkVBRF9GKTsKKwlkZXZsb2dfY21kLnJldHZhbF9sZW4xNiA9IGh0b25sKEZXX0xFTjE2KGRldmxvZ19jbWQpKTsKKwlyZXQgPSB0NF93cl9tYm94KGFkYXAsIGFkYXAtPm1ib3gsICZkZXZsb2dfY21kLCBzaXplb2YoZGV2bG9nX2NtZCksCisJCQkgJmRldmxvZ19jbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkZXZsb2dfbWVtaW5mbyA9IG50b2hsKGRldmxvZ19jbWQubWVtdHlwZV9kZXZsb2dfbWVtYWRkcjE2X2RldmxvZyk7CisJZHBhcmFtcy0+bWVtdHlwZSA9IEZXX0RFVkxPR19DTURfTUVNVFlQRV9ERVZMT0dfRyhkZXZsb2dfbWVtaW5mbyk7CisJZHBhcmFtcy0+c3RhcnQgPSBGV19ERVZMT0dfQ01EX01FTUFERFIxNl9ERVZMT0dfRyhkZXZsb2dfbWVtaW5mbykgPDwgNDsKKwlkcGFyYW1zLT5zaXplID0gbnRvaGwoZGV2bG9nX2NtZC5tZW1zaXplX2RldmxvZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCiAgKgl0NF9pbml0X3NnZV9wYXJhbXMgLSBpbml0aWFsaXplIGFkYXAtPnBhcmFtcy5zZ2UKICAqCUBhZGFwdGVyOiB0aGUgYWRhcHRlcgogICoKQEAgLTQ1MjksNyArNTMxMCw3IEBACiAJCQkJCQkJICAgICAgIFBST1RPQ09MX0YpOwogCiAJLyogSWYgVFBfSU5HUkVTU19DT05GSUcuVk5JRCA9PSAwLCB0aGVuIFRQX1ZMQU5fUFJJX01BUC5WTklDX0lECi0JICogcmVwcmVzZW50cyB0aGUgcHJlc2Vuc2Ugb2YgYW4gT3V0ZXIgVkxBTiBpbnN0ZWFkIG9mIGEgVk5JQyBJRC4KKwkgKiByZXByZXNlbnRzIHRoZSBwcmVzZW5jZSBvZiBhbiBPdXRlciBWTEFOIGluc3RlYWQgb2YgYSBWTklDIElELgogCSAqLwogCWlmICgoYWRhcC0+cGFyYW1zLnRwLmluZ3Jlc3NfY29uZmlnICYgVk5JQ19GKSA9PSAwKQogCQlhZGFwLT5wYXJhbXMudHAudm5pY19zaGlmdCA9IC0xOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9tc2cuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfbXNnLmgKaW5kZXggMGZiOTc1ZS4uMzBhMmY1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9tc2cuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X21zZy5oCkBAIC03OTQsNiArNzk0LDE0IEBACiAJX19iZTE2IGVycl92ZWM7CiB9OwogCisjZGVmaW5lIFJYRl9QU0hfUyAgICAyMAorI2RlZmluZSBSWEZfUFNIX1YoeCkgKCh4KSA8PCBSWEZfUFNIX1MpCisjZGVmaW5lIFJYRl9QU0hfRiAgICBSWEZfUFNIX1YoMVUpCisKKyNkZWZpbmUgUlhGX1NZTl9TICAgIDIxCisjZGVmaW5lIFJYRl9TWU5fVih4KSAoKHgpIDw8IFJYRl9TWU5fUykKKyNkZWZpbmUgUlhGX1NZTl9GICAgIFJYRl9TWU5fVigxVSkKKwogI2RlZmluZSBSWEZfVURQX1MgICAgMjIKICNkZWZpbmUgUlhGX1VEUF9WKHgpICgoeCkgPDwgUlhGX1VEUF9TKQogI2RlZmluZSBSWEZfVURQX0YgICAgUlhGX1VEUF9WKDFVKQpAQCAtODEwLDYgKzgxOCwxOCBAQAogI2RlZmluZSBSWEZfSVA2X1YoeCkgKCh4KSA8PCBSWEZfSVA2X1MpCiAjZGVmaW5lIFJYRl9JUDZfRiAgICBSWEZfSVA2X1YoMVUpCiAKKyNkZWZpbmUgUlhGX1NZTl9DT09LSUVfUyAgICAyNgorI2RlZmluZSBSWEZfU1lOX0NPT0tJRV9WKHgpICgoeCkgPDwgUlhGX1NZTl9DT09LSUVfUykKKyNkZWZpbmUgUlhGX1NZTl9DT09LSUVfRiAgICBSWEZfU1lOX0NPT0tJRV9WKDFVKQorCisjZGVmaW5lIFJYRl9GQ09FX1MgICAgMjYKKyNkZWZpbmUgUlhGX0ZDT0VfVih4KSAoKHgpIDw8IFJYRl9GQ09FX1MpCisjZGVmaW5lIFJYRl9GQ09FX0YgICAgUlhGX0ZDT0VfVigxVSkKKworI2RlZmluZSBSWEZfTFJPX1MgICAgMjcKKyNkZWZpbmUgUlhGX0xST19WKHgpICgoeCkgPDwgUlhGX0xST19TKQorI2RlZmluZSBSWEZfTFJPX0YgICAgUlhGX0xST19WKDFVKQorCiAvKiByeF9wa3QubDJpbmZvIGZpZWxkcyAqLwogI2RlZmluZSBSWF9FVEhIRFJfTEVOX1MgICAgMAogI2RlZmluZSBSWF9FVEhIRFJfTEVOX00gICAgMHgxRgpAQCAtODQ2LDYgKzg2NiwxMSBAQAogI2RlZmluZSBSWF9JUEhEUl9MRU5fVih4KSAoKHgpIDw8IFJYX0lQSERSX0xFTl9TKQogI2RlZmluZSBSWF9JUEhEUl9MRU5fRyh4KSAoKCh4KSA+PiBSWF9JUEhEUl9MRU5fUykgJiBSWF9JUEhEUl9MRU5fTSkKIAorLyogcnhfcGt0LmVycl92ZWMgZmllbGRzICovCisjZGVmaW5lIFJYRVJSX0NTVU1fUyAgICAxMworI2RlZmluZSBSWEVSUl9DU1VNX1YoeCkgKCh4KSA8PCBSWEVSUl9DU1VNX1MpCisjZGVmaW5lIFJYRVJSX0NTVU1fRiAgICBSWEVSUl9DU1VNX1YoMVUpCisKIHN0cnVjdCBjcGxfdHJhY2VfcGt0IHsKIAl1OCBvcGNvZGU7CiAJdTggaW50ZjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfcGNpX2lkX3RibC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9wY2lfaWRfdGJsLmgKaW5kZXggZGRmYjViOC4uMWE5YTZmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9wY2lfaWRfdGJsLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NF9wY2lfaWRfdGJsLmgKQEAgLTYwLDggKzYwLDYgQEAKICAqICAgLS0gVXNlZCB0byBmaW5pc2ggdGhlIGRlZmluaXRpb24gb2YgdGhlIFBDSSBJRCBUYWJsZS4gIE5vdGUgdGhhdCB3ZQogICogICAtLSB3aWxsIGJlIGFkZGluZyBhIHRyYWlsaW5nIHNlbWktY29sb24gKCI7IikgaGVyZS4KICAqLwotI2lmZGVmIENIX1BDSV9ERVZJQ0VfSURfVEFCTEVfREVGSU5FX0JFR0lOCi0KICNpZm5kZWYgQ0hfUENJX0RFVklDRV9JRF9GVU5DVElPTgogI2Vycm9yIENIX1BDSV9ERVZJQ0VfSURfRlVOQ1RJT04gbm90IGRlZmluZWQhCiAjZW5kaWYKQEAgLTE1NCw4ICsxNTIsNyBAQAogCUNIX1BDSV9JRF9UQUJMRV9GRU5UUlkoMHg1MDg3KSwJLyogQ3VzdG9tIFQ1ODAtQ1IgKi8KIAlDSF9QQ0lfSURfVEFCTEVfRkVOVFJZKDB4NTA4OCksCS8qIEN1c3RvbSBUNTcwLUNSICovCiAJQ0hfUENJX0lEX1RBQkxFX0ZFTlRSWSgweDUwODkpLAkvKiBDdXN0b20gVDUyMC1DUiAqLworCUNIX1BDSV9JRF9UQUJMRV9GRU5UUlkoMHg1MDkwKSwJLyogQ3VzdG9tIFQ1NDAtQ1IgKi8KIENIX1BDSV9ERVZJQ0VfSURfVEFCTEVfREVGSU5FX0VORDsKIAotI2VuZGlmIC8qIENIX1BDSV9ERVZJQ0VfSURfVEFCTEVfREVGSU5FX0JFR0lOICovCi0KICNlbmRpZiAvKiBfX1Q0X1BDSV9JRF9UQkxfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0X3JlZ3MuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfcmVncy5oCmluZGV4IDIzMWE3MjUuLjMyNjY3NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfcmVncy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRfcmVncy5oCkBAIC02Myw2ICs2Myw4IEBACiAjZGVmaW5lIE1DX0JJU1RfU1RBVFVTX1JFRyhyZWdfYWRkciwgaWR4KSAoKHJlZ19hZGRyKSArIChpZHgpICogNCkKICNkZWZpbmUgRURDX0JJU1RfU1RBVFVTX1JFRyhyZWdfYWRkciwgaWR4KSAoKHJlZ19hZGRyKSArIChpZHgpICogNCkKIAorI2RlZmluZSBQQ0lFX0ZXX1JFRyhyZWdfYWRkciwgaWR4KSAoKHJlZ19hZGRyKSArIChpZHgpICogNCkKKwogI2RlZmluZSBTR0VfUEZfS0RPT1JCRUxMX0EgMHgwCiAKICNkZWZpbmUgUUlEX1MgICAgMTUKQEAgLTcwNyw2ICs3MDksNyBAQAogI2RlZmluZSBQRk5VTV9WKHgpICgoeCkgPDwgUEZOVU1fUykKIAogI2RlZmluZSBQQ0lFX0ZXX0EgMHgzMGI4CisjZGVmaW5lIFBDSUVfRldfUEZfQSAweDMwYmMKIAogI2RlZmluZSBQQ0lFX0NPUkVfVVRMX1NZU1RFTV9CVVNfQUdFTlRfU1RBVFVTX0EgMHg1OTA4CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRmd19hcGkuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRmd19hcGkuaAppbmRleCA5YjM1M2E4Li4wM2ZiZmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0ZndfYXBpLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NGZ3X2FwaS5oCkBAIC0zNiw3ICszNiw3IEBACiAjZGVmaW5lIF9UNEZXX0lOVEVSRkFDRV9IXwogCiBlbnVtIGZ3X3JldHZhbCB7Ci0JRldfU1VDQ0VTUwkJPSAwLAkvKiBjb21wbGV0ZWQgc3VjZXNzZnVsbHkgKi8KKwlGV19TVUNDRVNTCQk9IDAsCS8qIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KIAlGV19FUEVSTQkJPSAxLAkvKiBvcGVyYXRpb24gbm90IHBlcm1pdHRlZCAqLwogCUZXX0VOT0VOVAkJPSAyLAkvKiBubyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICovCiAJRldfRUlPCQkJPSA1LAkvKiBpbnB1dC9vdXRwdXQgZXJyb3I7IGh3IGJhZCAqLwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJRldfUklfQklORF9NV19XUiAgICAgICAgICAgICAgID0gMHgxOCwKIAlGV19SSV9GUl9OU01SX1dSICAgICAgICAgICAgICAgPSAweDE5LAogCUZXX1JJX0lOVl9MU1RBR19XUiAgICAgICAgICAgICA9IDB4MWEsCi0JRldfTEFTVEMyRV9XUiAgICAgICAgICAgICAgICAgID0gMHg0MAorCUZXX0xBU1RDMkVfV1IgICAgICAgICAgICAgICAgICA9IDB4NzAKIH07CiAKIHN0cnVjdCBmd193cl9oZHIgewpAQCAtOTkzLDYgKzk5Myw3IEBACiAJRldfTUVNVFlQRV9DRl9FWFRNRU0JCT0gMHgyLAogCUZXX01FTVRZUEVfQ0ZfRkxBU0gJCT0gMHg0LAogCUZXX01FTVRZUEVfQ0ZfSU5URVJOQUwJCT0gMHg1LAorCUZXX01FTVRZUEVfQ0ZfRVhUTUVNMSAgICAgICAgICAgPSAweDYsCiB9OwogCiBzdHJ1Y3QgZndfY2Fwc19jb25maWdfY21kIHsKQEAgLTEwMzUsNiArMTAzNiw3IEBACiAJRldfUEFSQU1TX01ORU1fUEZWRgkJPSAyLAkvKiBmdW5jdGlvbiBwYXJhbXMgKi8KIAlGV19QQVJBTVNfTU5FTV9SRUcJCT0gMywJLyogbGltaXRlZCByZWdpc3RlciBhY2Nlc3MgKi8KIAlGV19QQVJBTVNfTU5FTV9ETUFRCQk9IDQsCS8qIGRtYSBxdWV1ZSBwYXJhbXMgKi8KKwlGV19QQVJBTVNfTU5FTV9DSE5FVCAgICAgICAgICAgID0gNSwgICAgLyogY2huZXQgcGFyYW1zICovCiAJRldfUEFSQU1TX01ORU1fTEFTVAogfTsKIApAQCAtMzEwMiw3ICszMTA0LDggQEAKIAlGV19ERVZMT0dfRkFDSUxJVFlfRkNPRQkJPSAweDJFLAogCUZXX0RFVkxPR19GQUNJTElUWV9GT0lTQ1NJCT0gMHgzMCwKIAlGV19ERVZMT0dfRkFDSUxJVFlfRk9GQ09FCT0gMHgzMiwKLQlGV19ERVZMT0dfRkFDSUxJVFlfTUFYCQk9IDB4MzIsCisJRldfREVWTE9HX0ZBQ0lMSVRZX0NITkVUICAgICAgICA9IDB4MzQsCisJRldfREVWTE9HX0ZBQ0lMSVRZX01BWCAgICAgICAgICA9IDB4MzQsCiB9OwogCiAvKiBsb2cgbWVzc2FnZSBmb3JtYXQgKi8KQEAgLTMxMzksNCArMzE0MiwzNiBAQAogCSgoKHgpID4+IEZXX0RFVkxPR19DTURfTUVNQUREUjE2X0RFVkxPR19TKSAmIFwKIAkgRldfREVWTE9HX0NNRF9NRU1BRERSMTZfREVWTE9HX00pCiAKKy8qIFAgQyBJIEUgICBGIFcgICBQIEYgNyAgIFIgRSBHIEkgUyBUIEUgUiAqLworCisvKiBQRjcgc3RvcmVzIHRoZSBGaXJtd2FyZSBEZXZpY2UgTG9nIHBhcmFtZXRlcnMgd2hpY2ggYWxsb3dzIEhvc3QgRHJpdmVycyB0bworICogYWNjZXNzIHRoZSAiZGV2bG9nIiB3aGljaCBuZWVkaW5nIHRvIGNvbnRhY3QgZmlybXdhcmUuICBUaGUgZW5jb2RpbmcgaXMKKyAqIG1vc3RseSB0aGUgc2FtZSBhcyB0aGF0IHJldHVybmVkIGJ5IHRoZSBERVZMT0cgY29tbWFuZCBleGNlcHQgZm9yIHRoZSBzaXplCisgKiB3aGljaCBpcyBlbmNvZGVkIGFzIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBtdWx0aXBsZXMtMSBvZiAxMjggaGVyZSByYXRoZXIKKyAqIHRoYW4gdGhlIG1lbW9yeSBzaXplIGFzIGlzIGRvbmUgaW4gdGhlIERFVkxPRyBjb21tYW5kLiAgVGh1cywgMCBtZWFucyAxMjgKKyAqIGFuZCAxNSBtZWFucyAyMDQ4LiAgVGhpcyBvZiBjb3Vyc2UgaW4gdHVybiBjb25zdHJhaW5zIHRoZSBhbGxvd2VkIHZhbHVlcworICogZm9yIHRoZSBkZXZsb2cgc2l6ZSAuLi4KKyAqLworI2RlZmluZSBQQ0lFX0ZXX1BGX0RFVkxPRwkJNworCisjZGVmaW5lIFBDSUVfRldfUEZfREVWTE9HX05FTlRSSUVTMTI4X1MJMjgKKyNkZWZpbmUgUENJRV9GV19QRl9ERVZMT0dfTkVOVFJJRVMxMjhfTQkweGYKKyNkZWZpbmUgUENJRV9GV19QRl9ERVZMT0dfTkVOVFJJRVMxMjhfVih4KSBcCisJKCh4KSA8PCBQQ0lFX0ZXX1BGX0RFVkxPR19ORU5UUklFUzEyOF9TKQorI2RlZmluZSBQQ0lFX0ZXX1BGX0RFVkxPR19ORU5UUklFUzEyOF9HKHgpIFwKKwkoKCh4KSA+PiBQQ0lFX0ZXX1BGX0RFVkxPR19ORU5UUklFUzEyOF9TKSAmIFwKKwkgUENJRV9GV19QRl9ERVZMT0dfTkVOVFJJRVMxMjhfTSkKKworI2RlZmluZSBQQ0lFX0ZXX1BGX0RFVkxPR19BRERSMTZfUwk0CisjZGVmaW5lIFBDSUVfRldfUEZfREVWTE9HX0FERFIxNl9NCTB4ZmZmZmZmCisjZGVmaW5lIFBDSUVfRldfUEZfREVWTE9HX0FERFIxNl9WKHgpCSgoeCkgPDwgUENJRV9GV19QRl9ERVZMT0dfQUREUjE2X1MpCisjZGVmaW5lIFBDSUVfRldfUEZfREVWTE9HX0FERFIxNl9HKHgpIFwKKwkoKCh4KSA+PiBQQ0lFX0ZXX1BGX0RFVkxPR19BRERSMTZfUykgJiBQQ0lFX0ZXX1BGX0RFVkxPR19BRERSMTZfTSkKKworI2RlZmluZSBQQ0lFX0ZXX1BGX0RFVkxPR19NRU1UWVBFX1MJMAorI2RlZmluZSBQQ0lFX0ZXX1BGX0RFVkxPR19NRU1UWVBFX00JMHhmCisjZGVmaW5lIFBDSUVfRldfUEZfREVWTE9HX01FTVRZUEVfVih4KQkoKHgpIDw8IFBDSUVfRldfUEZfREVWTE9HX01FTVRZUEVfUykKKyNkZWZpbmUgUENJRV9GV19QRl9ERVZMT0dfTUVNVFlQRV9HKHgpIFwKKwkoKCh4KSA+PiBQQ0lFX0ZXX1BGX0RFVkxPR19NRU1UWVBFX1MpICYgUENJRV9GV19QRl9ERVZMT0dfTUVNVFlQRV9NKQorCiAjZW5kaWYgLyogX1Q0RldfSU5URVJGQUNFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0ZndfdmVyc2lvbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC90NGZ3X3ZlcnNpb24uaAppbmRleCBlMmJkM2Y3Li5iOWQxY2JhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3Q0ZndfdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvdDRmd192ZXJzaW9uLmgKQEAgLTM2LDEzICszNiwxMyBAQAogI2RlZmluZSBfX1Q0RldfVkVSU0lPTl9IX18KIAogI2RlZmluZSBUNEZXX1ZFUlNJT05fTUFKT1IgMHgwMQotI2RlZmluZSBUNEZXX1ZFUlNJT05fTUlOT1IgMHgwQwotI2RlZmluZSBUNEZXX1ZFUlNJT05fTUlDUk8gMHgxOQorI2RlZmluZSBUNEZXX1ZFUlNJT05fTUlOT1IgMHgwRAorI2RlZmluZSBUNEZXX1ZFUlNJT05fTUlDUk8gMHgyMAogI2RlZmluZSBUNEZXX1ZFUlNJT05fQlVJTEQgMHgwMAogCiAjZGVmaW5lIFQ1RldfVkVSU0lPTl9NQUpPUiAweDAxCi0jZGVmaW5lIFQ1RldfVkVSU0lPTl9NSU5PUiAweDBDCi0jZGVmaW5lIFQ1RldfVkVSU0lPTl9NSUNSTyAweDE5CisjZGVmaW5lIFQ1RldfVkVSU0lPTl9NSU5PUiAweDBECisjZGVmaW5lIFQ1RldfVkVSU0lPTl9NSUNSTyAweDIwCiAjZGVmaW5lIFQ1RldfVkVSU0lPTl9CVUlMRCAweDAwCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jCmluZGV4IDEyMmUyOTYuLjFkODkzYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9jeGdiNHZmX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvY3hnYjR2Zl9tYWluLmMKQEAgLTMwMzQsNyArMzAzNCw3IEBACiAvKiBNYWNyb3MgbmVlZGVkIHRvIHN1cHBvcnQgdGhlIFBDSSBEZXZpY2UgSUQgVGFibGUgLi4uCiAgKi8KICNkZWZpbmUgQ0hfUENJX0RFVklDRV9JRF9UQUJMRV9ERUZJTkVfQkVHSU4gXAotCXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjeGdiNHZmX3BjaV90YmxbXSA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3hnYjR2Zl9wY2lfdGJsW10gPSB7CiAjZGVmaW5lIENIX1BDSV9ERVZJQ0VfSURfRlVOQ1RJT04JMHg4CiAKICNkZWZpbmUgQ0hfUENJX0lEX1RBQkxFX0VOVFJZKGRldmlkKSBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvc2dlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvc2dlLmMKaW5kZXggMDU0NWYwZC4uNDgyZjZkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3NnZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9zZ2UuYwpAQCAtODc1LDcgKzg3NSw3IEBACiAJICogV3JpdGUgSGVhZGVyIChpbmNvcnBvcmF0ZWQgYXMgcGFydCBvZiB0aGUgY3BsX3R4X3BrdF9sc28gYW5kCiAJICogY3BsX3R4X3BrdCBzdHJ1Y3R1cmVzKSwgZm9sbG93ZWQgYnkgZWl0aGVyIGEgVFggUGFja2V0IFdyaXRlIENQTAogCSAqIG1lc3NhZ2Ugb3IsIGlmIHdlJ3JlIGRvaW5nIGEgTGFyZ2UgU2VuZCBPZmZsb2FkLCBhbiBMU08gQ1BMIG1lc3NhZ2UKLQkgKiB3aXRoIGFuIGVtYmVkZWQgVFggUGFja2V0IFdyaXRlIENQTCBtZXNzYWdlLgorCSAqIHdpdGggYW4gZW1iZWRkZWQgVFggUGFja2V0IFdyaXRlIENQTCBtZXNzYWdlLgogCSAqLwogCWZsaXRzID0gc2dsX2xlbihza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzICsgMSk7CiAJaWYgKHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUpCkBAIC0xMDA0LDcgKzEwMDQsNyBAQAogCQkJCQkgICAgICA/ICh0cS0+cGlkeCAtIDEpCiAJCQkJCSAgICAgIDogKHRxLT5zaXplIC0gMSkpOwogCQkJX19iZTY0ICpzcmMgPSAoX19iZTY0ICopJnRxLT5kZXNjW2luZGV4XTsKLQkJCV9fYmU2NCBfX2lvbWVtICpkc3QgPSAoX19iZTY0ICopKHRxLT5iYXIyX2FkZHIgKworCQkJX19iZTY0IF9faW9tZW0gKmRzdCA9IChfX2JlNjQgX19pb21lbSAqKSh0cS0+YmFyMl9hZGRyICsKIAkJCQkJCQkgU0dFX1VEQl9XQ0RPT1JCRUxMKTsKIAkJCXVuc2lnbmVkIGludCBjb3VudCA9IEVRX1VOSVQgLyBzaXplb2YoX19iZTY0KTsKIApAQCAtMTAxOCw3ICsxMDE4LDExIEBACiAJCQkgKiBETUEuCiAJCQkgKi8KIAkJCXdoaWxlIChjb3VudCkgewotCQkJCXdyaXRlcSgqc3JjLCBkc3QpOworCQkJCS8qIHRoZSAoX19mb3JjZSB1NjQpIGlzIGJlY2F1c2UgdGhlIGNvbXBpbGVyCisJCQkJICogZG9lc24ndCB1bmRlcnN0YW5kIHRoZSBlbmRpYW4gc3dpenpsaW5nCisJCQkJICogZ29pbmcgb24KKwkJCQkgKi8KKwkJCQl3cml0ZXEoKF9fZm9yY2UgdTY0KSpzcmMsIGRzdCk7CiAJCQkJc3JjKys7CiAJCQkJZHN0Kys7CiAJCQkJY291bnQtLTsKQEAgLTEyNTIsOCArMTI1Niw4IEBACiAJQlVHX09OKERJVl9ST1VORF9VUChFVEhUWFFfTUFYX0hEUiwgVFhEX1BFUl9FUV9VTklUKSA+IDEpOwogCXdyID0gKHZvaWQgKikmdHhxLT5xLmRlc2NbdHhxLT5xLnBpZHhdOwogCXdyLT5lcXVpcV90b19sZW4xNiA9IGNwdV90b19iZTMyKHdyX21pZCk7Ci0Jd3ItPnIzWzBdID0gY3B1X3RvX2JlNjQoMCk7Ci0Jd3ItPnIzWzFdID0gY3B1X3RvX2JlNjQoMCk7CisJd3ItPnIzWzBdID0gY3B1X3RvX2JlMzIoMCk7CisJd3ItPnIzWzFdID0gY3B1X3RvX2JlMzIoMCk7CiAJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsICh2b2lkICopd3ItPmV0aG1hY2RzdCwgZndfaGRyX2NvcHlfbGVuKTsKIAllbmQgPSAodTY0ICopd3IgKyBmbGl0czsKIApAQCAtMTc0Nyw3ICsxNzUxLDcgQEAKIAkJICogRmlndXJlIG91dCB3aGF0IGtpbmQgb2YgcmVzcG9uc2Ugd2UndmUgcmVjZWl2ZWQgZnJvbSB0aGUKIAkJICogU0dFLgogCQkgKi8KLQkJcm1iKCk7CisJCWRtYV9ybWIoKTsKIAkJcnNwX3R5cGUgPSBSU1BEX1RZUEUocmMtPnR5cGVfZ2VuKTsKIAkJaWYgKGxpa2VseShyc3BfdHlwZSA9PSBSU1BfVFlQRV9GTEJVRikpIHsKIAkJCXN0cnVjdCBwYWdlX2ZyYWcgKmZwOwpAQCAtMTkzMSw3ICsxOTM1LDcgQEAKIAkJICogZXJyb3IgYW5kIGdvIG9uIHRvIHRoZSBuZXh0IHJlc3BvbnNlIG1lc3NhZ2UuICBUaGlzIHNob3VsZAogCQkgKiBuZXZlciBoYXBwZW4gLi4uCiAJCSAqLwotCQlybWIoKTsKKwkJZG1hX3JtYigpOwogCQlpZiAodW5saWtlbHkoUlNQRF9UWVBFKHJjLT50eXBlX2dlbikgIT0gUlNQX1RZUEVfSU5UUikpIHsKIAkJCWRldl9lcnIoYWRhcHRlci0+cGRldl9kZXYsCiAJCQkJIlVuZXhwZWN0ZWQgSU5UUlEgcmVzcG9uc2UgdHlwZSAlZFxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi90NHZmX2h3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvdDR2Zl9ody5jCmluZGV4IDFiNTUwNmQuLjk2NmVlOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi90NHZmX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3Q0dmZfaHcuYwpAQCAtMjEwLDEwICsyMTAsMTAgQEAKIAogCQkJaWYgKHJwbCkgewogCQkJCS8qIHJlcXVlc3QgYml0IGluIGhpZ2gtb3JkZXIgQkUgd29yZCAqLwotCQkJCVdBUk5fT04oKGJlMzJfdG9fY3B1KCooY29uc3QgdTMyICopY21kKQorCQkJCVdBUk5fT04oKGJlMzJfdG9fY3B1KCooY29uc3QgX19iZTMyICopY21kKQogCQkJCQkgJiBGV19DTURfUkVRVUVTVF9GKSA9PSAwKTsKIAkJCQlnZXRfbWJveF9ycGwoYWRhcHRlciwgcnBsLCBzaXplLCBtYm94X2RhdGEpOwotCQkJCVdBUk5fT04oKGJlMzJfdG9fY3B1KCoodTMyICopcnBsKQorCQkJCVdBUk5fT04oKGJlMzJfdG9fY3B1KCooX19iZTMyICopcnBsKQogCQkJCQkgJiBGV19DTURfUkVRVUVTVF9GKSAhPSAwKTsKIAkJCX0KIAkJCXQ0X3dyaXRlX3JlZyhhZGFwdGVyLCBtYm94X2N0bCwKQEAgLTMzOSw3ICszMzksNyBAQAogICogICAgICBAYWRhcHRlcjogdGhlIGFkYXB0ZXIKICAqCiAgKglJc3N1ZXMgYSByZXNldCBjb21tYW5kIHRvIEZXLiAgRm9yIGEgUGh5c2ljYWwgRnVuY3Rpb24gdGhpcyB3b3VsZAotICoJcmVzdWx0IGluIHRoZSBGaXJtd2FyZSByZXNldGluZyBhbGwgb2YgaXRzIHN0YXRlLiAgRm9yIGEgVmlydHVhbAorICoJcmVzdWx0IGluIHRoZSBGaXJtd2FyZSByZXNldHRpbmcgYWxsIG9mIGl0cyBzdGF0ZS4gIEZvciBhIFZpcnR1YWwKICAqCUZ1bmN0aW9uIHRoaXMganVzdCByZXNldHMgdGhlIHN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgVkYuCiAgKi8KIGludCB0NHZmX2Z3X3Jlc2V0KHN0cnVjdCBhZGFwdGVyICphZGFwdGVyKQpAQCAtNDg0LDcgKzQ4NCw3IEBACiAJICogIG8gVGhlIEJBUjIgUXVldWUgSUQuCiAJICogIG8gVGhlIEJBUjIgUXVldWUgSUQgT2Zmc2V0IGludG8gdGhlIEJBUjIgcGFnZS4KIAkgKi8KLQliYXIyX3BhZ2Vfb2Zmc2V0ID0gKChxaWQgPj4gcXBwX3NoaWZ0KSA8PCBwYWdlX3NoaWZ0KTsKKwliYXIyX3BhZ2Vfb2Zmc2V0ID0gKCh1NjQpKHFpZCA+PiBxcHBfc2hpZnQpIDw8IHBhZ2Vfc2hpZnQpOwogCWJhcjJfcWlkID0gcWlkICYgcXBwX21hc2s7CiAJYmFyMl9xaWRfb2Zmc2V0ID0gYmFyMl9xaWQgKiBTR0VfVURCX1NJWkU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NpcnJ1cy9jczg5eDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NpcnJ1cy9jczg5eDAuYwppbmRleCBkMWMwMjVmLi42MDM4MzA0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXJydXMvY3M4OXgwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lycnVzL2NzODl4MC5jCkBAIC0xNTc4LDcgKzE1NzgsNyBAQAogCiAjaWZuZGVmIENPTkZJR19DUzg5eDBfUExBVEZPUk0KIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBJL08gcG9ydCBhZGRyZXMgdXNlZCBieSB0aGUgY3M4OXgwX3Byb2JlKCkgYW5kCisgKiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoZSBJL08gcG9ydCBhZGRyZXNzIHVzZWQgYnkgdGhlIGNzODl4MF9wcm9iZSgpIGFuZAogICogaW5pdF9tb2R1bGUoKSBmdW5jdGlvbnMgdG8gdGhlIEkvTyBtZW1vcnkgYWRkcmVzcyB1c2VkIGJ5IHRoZQogICogY3M4OXgwX3Byb2JlMSgpIGZ1bmN0aW9uLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL2VuaWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljX21haW4uYwppbmRleCBhNTE3OWJmLi4yMDRiZDE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL2VuaWNfbWFpbi5jCkBAIC04OTMsNyArODkzLDcgQEAKIAkJfSBlbHNlIHsKIAkJCW1lbXNldChwcCwgMCwgc2l6ZW9mKCpwcCkpOwogCQkJaWYgKHZmID09IFBPUlRfU0VMRl9WRikKLQkJCQltZW1zZXQobmV0ZGV2LT5kZXZfYWRkciwgMCwgRVRIX0FMRU4pOworCQkJCWV0aF96ZXJvX2FkZHIobmV0ZGV2LT5kZXZfYWRkcik7CiAJCX0KIAl9IGVsc2UgewogCQkvKiBTZXQgZmxhZyB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwb3J0IGFzc29jL2Rpc2Fzc29jCkBAIC05MDMsMTQgKzkwMywxNCBAQAogCiAJCS8qIElmIERJU0FTU09DSUFURSwgY2xlYW4gdXAgYWxsIGFzc2lnbmVkL3NhdmVkIG1hY2FkZHJlc3NlcyAqLwogCQlpZiAocHAtPnJlcXVlc3QgPT0gUE9SVF9SRVFVRVNUX0RJU0FTU09DSUFURSkgewotCQkJbWVtc2V0KHBwLT5tYWNfYWRkciwgMCwgRVRIX0FMRU4pOworCQkJZXRoX3plcm9fYWRkcihwcC0+bWFjX2FkZHIpOwogCQkJaWYgKHZmID09IFBPUlRfU0VMRl9WRikKLQkJCQltZW1zZXQobmV0ZGV2LT5kZXZfYWRkciwgMCwgRVRIX0FMRU4pOworCQkJCWV0aF96ZXJvX2FkZHIobmV0ZGV2LT5kZXZfYWRkcik7CiAJCX0KIAl9CiAKIAlpZiAodmYgPT0gUE9SVF9TRUxGX1ZGKQotCQltZW1zZXQocHAtPnZmX21hYywgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKHBwLT52Zl9tYWMpOwogCiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC9kbWZlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZG1mZS5jCmluZGV4IDUwYTAwNzcuLmFmZDhlNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC9kbWZlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RtZmUuYwpAQCAtNjUzLDcgKzY1Myw3IEBACiAJaWYgKCAhKGRiLT5tZWRpYV9tb2RlICYgRE1GRV9BVVRPKSApCiAJCWRiLT5vcF9tb2RlID0gZGItPm1lZGlhX21vZGU7IAkvKiBGb3JjZSBNb2RlICovCiAKLQkvKiBJbml0aWFsaXplIFRyYW5zbWl0L1JlY2VpdmUgZGVjcmlwdG9yIGFuZCBDUjMvNCAqLworCS8qIEluaXRpYWxpemUgVHJhbnNtaXQvUmVjZWl2ZSBkZXNjcmlwdG9yIGFuZCBDUjMvNCAqLwogCWRtZmVfZGVzY3JpcHRvcl9pbml0KGRldik7CiAKIAkvKiBJbml0IENSNiB0byBwcm9ncmFtIERNOTEweCBvcGVyYXRpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC90dWxpcF9jb3JlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvdHVsaXBfY29yZS5jCmluZGV4IDNiNDI1NTYuLmVkNDE1NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC90dWxpcF9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL3R1bGlwX2NvcmUuYwpAQCAtNTg5LDcgKzU4OSw3IEBACiAJCQkgICAgICAgKHVuc2lnbmVkIGludCl0cC0+cnhfcmluZ1tpXS5idWZmZXIxLAogCQkJICAgICAgICh1bnNpZ25lZCBpbnQpdHAtPnJ4X3JpbmdbaV0uYnVmZmVyMiwKIAkJCSAgICAgICBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdKTsKLQkJCWZvciAoaiA9IDA7IGJ1ZltqXSAhPSAweGVlICYmIGogPCAxNjAwOyBqKyspCisJCQlmb3IgKGogPSAwOyAoKGogPCAxNjAwKSAmJiBidWZbal0gIT0gMHhlZSk7IGorKykKIAkJCQlpZiAoaiA8IDEwMCkKIAkJCQkJcHJfY29udCgiICUwMngiLCBidWZbal0pOwogCQkJcHJfY29udCgiIGo9JWRcbiIsIGopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL3VsaTUyNnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC91bGk1MjZ4LmMKaW5kZXggMWM1OTE2Yi4uMmMzMGMwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL3VsaTUyNnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvdWxpNTI2eC5jCkBAIC01NjQsNyArNTY0LDcgQEAKIAlpZiAoICEoZGItPm1lZGlhX21vZGUgJiBVTEk1MjZYX0FVVE8pICkKIAkJZGItPm9wX21vZGUgPSBkYi0+bWVkaWFfbW9kZTsJCS8qIEZvcmNlIE1vZGUgKi8KIAotCS8qIEluaXRpYWxpemUgVHJhbnNtaXQvUmVjZWl2ZSBkZWNyaXB0b3IgYW5kIENSMy80ICovCisJLyogSW5pdGlhbGl6ZSBUcmFuc21pdC9SZWNlaXZlIGRlc2NyaXB0b3IgYW5kIENSMy80ICovCiAJdWxpNTI2eF9kZXNjcmlwdG9yX2luaXQoZGV2LCBpb2FkZHIpOwogCiAJLyogSW5pdCBDUjYgdG8gcHJvZ3JhbSBNNTI2WCBvcGVyYXRpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlLmgKaW5kZXggMjdkZTM3YS4uMWJmMWNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlLmgKQEAgLTMwLDExICszMCwxMiBAQAogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3U2NF9zdGF0c19zeW5jLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogCiAjaW5jbHVkZSAiYmVfaHcuaCIKICNpbmNsdWRlICJiZV9yb2NlLmgiCiAKLSNkZWZpbmUgRFJWX1ZFUgkJCSIxMC40dSIKKyNkZWZpbmUgRFJWX1ZFUgkJCSIxMC42LjAuMSIKICNkZWZpbmUgRFJWX05BTUUJCSJiZTJuZXQiCiAjZGVmaW5lIEJFX05BTUUJCQkiRW11bGV4IEJsYWRlRW5naW5lMiIKICNkZWZpbmUgQkUzX05BTUUJCSJFbXVsZXggQmxhZGVFbmdpbmUzIgpAQCAtODcsNiArODgsNyBAQAogI2RlZmluZSBCRTNfTUFYX0VWVF9RUwkJMTYKICNkZWZpbmUgQkUzX1NSSU9WX01BWF9FVlRfUVMJOAogCisjZGVmaW5lIE1BWF9SU1NfSUZBQ0VTCQkxNQogI2RlZmluZSBNQVhfUlhfUVMJCTMyCiAjZGVmaW5lIE1BWF9FVlRfUVMJCTMyCiAjZGVmaW5lIE1BWF9UWF9RUwkJMzIKQEAgLTk3LDYgKzk5LDcgQEAKICNkZWZpbmUgQkVfTkFQSV9XRUlHSFQJCTY0CiAjZGVmaW5lIE1BWF9SWF9QT1NUCQlCRV9OQVBJX1dFSUdIVCAvKiBGcmFncyBwb3N0ZWQgYXQgYSB0aW1lICovCiAjZGVmaW5lIFJYX0ZSQUdTX1JFRklMTF9XTQkoUlhfUV9MRU4gLSBNQVhfUlhfUE9TVCkKKyNkZWZpbmUgTUFYX05VTV9QT1NUX0VSWF9EQgkyNTV1CiAKICNkZWZpbmUgTUFYX1ZGUwkJCTMwIC8qIE1heCBWRnMgc3VwcG9ydGVkIGJ5IEJFMyBGVyAqLwogI2RlZmluZSBGV19WRVJfTEVOCQkzMgpAQCAtMTgyLDYgKzE4NSw3IEBACiAJdTE2IHNwdXJpb3VzX2ludHI7CiAJc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXI7CisJY3B1bWFza192YXJfdCAgYWZmaW5pdHlfbWFzazsKIAogI2lmZGVmIENPTkZJR19ORVRfUlhfQlVTWV9QT0xMCiAjZGVmaW5lIEJFX0VRX0lETEUJCTAKQEAgLTIzOCwxMCArMjQyLDE3IEBACiAJc3RydWN0IHU2NF9zdGF0c19zeW5jIHN5bmNfY29tcGw7CiB9OwogCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBzb21lIGRhdGEgb2YgaW50ZXJlc3Qgb2J0YWluZWQgZnJvbSBhIFRYIENRRSAqLworc3RydWN0IGJlX3R4X2NvbXBsX2luZm8geworCXU4IHN0YXR1czsJCS8qIENvbXBsZXRpb24gc3RhdHVzICovCisJdTE2IGVuZF9pbmRleDsJCS8qIENvbXBsZXRlZCBUWFEgSW5kZXggKi8KK307CisKIHN0cnVjdCBiZV90eF9vYmogewogCXUzMiBkYl9vZmZzZXQ7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gcTsKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyBjcTsKKwlzdHJ1Y3QgYmVfdHhfY29tcGxfaW5mbyB0eGNwOwogCS8qIFJlbWVtYmVyIHRoZSBza2JzIHRoYXQgd2VyZSB0cmFuc21pdHRlZCAqLwogCXN0cnVjdCBza19idWZmICpzZW50X3NrYl9saXN0W1RYX1FfTEVOXTsKIAlzdHJ1Y3QgYmVfdHhfc3RhdHMgc3RhdHM7CkBAIC0zNTQsNiArMzY1LDcgQEAKIAl1MTYgdmxhbl90YWc7CiAJdTMyIHR4X3JhdGU7CiAJdTMyIHBsaW5rX3RyYWNraW5nOworCXUzMiBwcml2aWxlZ2VzOwogfTsKIAogZW51bSB2Zl9zdGF0ZSB7CkBAIC0zNjksNiArMzgxLDcgQEAKICNkZWZpbmUgQkVfRkxBR1NfVlhMQU5fT0ZGTE9BRFMJCQlCSVQoOCkKICNkZWZpbmUgQkVfRkxBR1NfU0VUVVBfRE9ORQkJCUJJVCg5KQogI2RlZmluZSBCRV9GTEFHU19FVlRfSU5DT01QQVRJQkxFX1NGUAkJQklUKDEwKQorI2RlZmluZSBCRV9GTEFHU19FUlJfREVURUNUSU9OX1NDSEVEVUxFRAlCSVQoMTEpCiAKICNkZWZpbmUgQkVfVUNfUE1BQ19DT1VOVAkJCTMwCiAjZGVmaW5lIEJFX1ZGX1VDX1BNQUNfQ09VTlQJCQkyCkBAIC00MDMsOCArNDE2LDExIEBACiAJdTE2IG1heF90eF9xczsKIAl1MTYgbWF4X3Jzc19xczsKIAl1MTYgbWF4X3J4X3FzOworCXUxNiBtYXhfY3FfY291bnQ7CiAJdTE2IG1heF91Y19tYWM7CQkvKiBNYXggVUMgTUFDcyBwcm9ncmFtbWFibGUgKi8KIAl1MTYgbWF4X3ZsYW5zOwkJLyogTnVtYmVyIG9mIHZsYW5zIHN1cHBvcnRlZCAqLworCXUxNiBtYXhfaWZhY2VfY291bnQ7CisJdTE2IG1heF9tY2NfY291bnQ7CiAJdTE2IG1heF9ldnRfcXM7CiAJdTMyIGlmX2NhcF9mbGFnczsKIAl1MzIgdmZfaWZfY2FwX2ZsYWdzOwkvKiBWRiBpZiBjYXBhYmlsaXR5IGZsYWdzICovCkBAIC00MTcsMTIgKzQzMyw0NiBAQAogCXU4IHJzc19oa2V5W1JTU19IQVNIX0tFWV9MRU5dOwogfTsKIAorLyogTWFjcm9zIHRvIHJlYWQvd3JpdGUgdGhlICdmZWF0dXJlcycgd29yZCBvZiBiZV93cmJfcGFyYW1zIHN0cnVjdHVyZS4KKyAqLworI2RlZmluZQlCRV9XUkJfRl9CSVQobmFtZSkJCQlCRV9XUkJfRl8jI25hbWUjI19CSVQKKyNkZWZpbmUJQkVfV1JCX0ZfTUFTSyhuYW1lKQkJCUJJVF9NQVNLKEJFX1dSQl9GXyMjbmFtZSMjX0JJVCkKKworI2RlZmluZQlCRV9XUkJfRl9HRVQod29yZCwgbmFtZSkJXAorCSgoKHdvcmQpICYgKEJFX1dSQl9GX01BU0sobmFtZSkpKSA+PiBCRV9XUkJfRl9CSVQobmFtZSkpCisKKyNkZWZpbmUJQkVfV1JCX0ZfU0VUKHdvcmQsIG5hbWUsIHZhbCkJXAorCSgod29yZCkgfD0gKCgodmFsKSA8PCBCRV9XUkJfRl9CSVQobmFtZSkpICYgQkVfV1JCX0ZfTUFTSyhuYW1lKSkpCisKKy8qIEZlYXR1cmUvb2ZmbG9hZCBiaXRzICovCitlbnVtIHsKKwlCRV9XUkJfRl9DUkNfQklULAkJLyogRXRoZXJuZXQgQ1JDICovCisJQkVfV1JCX0ZfSVBDU19CSVQsCQkvKiBJUCBjc3VtICovCisJQkVfV1JCX0ZfVENQQ1NfQklULAkJLyogVENQIGNzdW0gKi8KKwlCRV9XUkJfRl9VRFBDU19CSVQsCQkvKiBVRFAgY3N1bSAqLworCUJFX1dSQl9GX0xTT19CSVQsCQkvKiBMU08gKi8KKwlCRV9XUkJfRl9MU082X0JJVCwJCS8qIExTTzYgKi8KKwlCRV9XUkJfRl9WTEFOX0JJVCwJCS8qIFZMQU4gKi8KKwlCRV9XUkJfRl9WTEFOX1NLSVBfSFdfQklUCS8qIFNraXAgVkxBTiB0YWcgKHdvcmthcm91bmQpICovCit9OworCisvKiBUaGUgc3RydWN0dXJlIGJlbG93IHByb3ZpZGVzIGEgSFctYWdub3N0aWMgYWJzdHJhY3Rpb24gb2YgV1JCIHBhcmFtcworICogcmV0cmlldmVkIGZyb20gYSBUWCBza2IuIFRoaXMgaXMgaW4gdHVybiBwYXNzZWQgdG8gY2hpcCBzcGVjaWZpYyByb3V0aW5lcworICogZHVyaW5nIHRyYW5zbWl0LCB0byBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1zIGluIHRoZSBXUkIuCisgKi8KK3N0cnVjdCBiZV93cmJfcGFyYW1zIHsKKwl1MzIgZmVhdHVyZXM7CS8qIEZlYXR1cmUgYml0cyAqLworCXUxNiB2bGFuX3RhZzsJLyogVkxBTiB0YWcgKi8KKwl1MTYgbHNvX21zczsJLyogTVNTIGZvciBMU08gKi8KK307CisKIHN0cnVjdCBiZV9hZGFwdGVyIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCiAJdTggX19pb21lbSAqY3NyOwkvKiBDU1IgQkFSIHVzZWQgb25seSBmb3IgQkUyLzMgKi8KIAl1OCBfX2lvbWVtICpkYjsJCS8qIERvb3IgQmVsbCAqLworCXU4IF9faW9tZW0gKnBjaWNmZzsJLyogT24gU0gsQkV4IG9ubHkuIFNoYWRvdyBvZiBQQ0kgY29uZmlnIHNwYWNlICovCiAKIAlzdHJ1Y3QgbXV0ZXggbWJveF9sb2NrOyAvKiBGb3Igc2VyaWFsaXppbmcgbWJveCBjbWRzIHRvIEJFIGNhcmQgKi8KIAlzdHJ1Y3QgYmVfZG1hX21lbSBtYm94X21lbTsKQEAgLTQ0Nyw2ICs0OTcsOCBAQAogCiAJLyogUnggcmluZ3MgKi8KIAl1MTYgbnVtX3J4X3FzOworCXUxNiBudW1fcnNzX3FzOworCXUxNiBuZWVkX2RlZl9yeHE7CiAJc3RydWN0IGJlX3J4X29iaiByeF9vYmpbTUFYX1JYX1FTXTsKIAl1MzIgYmlnX3BhZ2Vfc2l6ZTsJLyogQ29tcG91bmRlZCBwYWdlIHNpemUgc2hhcmVkIGJ5IHJ4IHdyYnMgKi8KIApAQCAtNDYxLDcgKzUxMyw3IEBACiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwogCXUxNiB3b3JrX2NvdW50ZXI7CiAKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGZ1bmNfcmVjb3Zlcnlfd29yazsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGJlX2Vycl9kZXRlY3Rpb25fd29yazsKIAl1MzIgZmxhZ3M7CiAJdTMyIGNtZF9wcml2aWxlZ2VzOwogCS8qIEV0aHRvb2wga25vYnMgYW5kIGluZm8gKi8KQEAgLTU5NCw5ICs2NDYsOCBAQAogCWZvciAoaSA9IDAsIHJ4byA9ICZhZGFwdGVyLT5yeF9vYmpbaV07IGkgPCBhZGFwdGVyLT5udW1fcnhfcXM7CVwKIAkJaSsrLCByeG8rKykKIAotLyogU2tpcCB0aGUgZGVmYXVsdCBub24tcnNzIHF1ZXVlIChsYXN0IG9uZSkqLwogI2RlZmluZSBmb3JfYWxsX3Jzc19xdWV1ZXMoYWRhcHRlciwgcnhvLCBpKQkJCQlcCi0JZm9yIChpID0gMCwgcnhvID0gJmFkYXB0ZXItPnJ4X29ialtpXTsgaSA8IChhZGFwdGVyLT5udW1fcnhfcXMgLSAxKTtcCisJZm9yIChpID0gMCwgcnhvID0gJmFkYXB0ZXItPnJ4X29ialtpXTsgaSA8IGFkYXB0ZXItPm51bV9yc3NfcXM7CVwKIAkJaSsrLCByeG8rKykKIAogI2RlZmluZSBmb3JfYWxsX3R4X3F1ZXVlcyhhZGFwdGVyLCB0eG8sIGkpCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5jCmluZGV4IDM2OTE2Y2YuLmZiMTQwZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuYwpAQCAtNjM1LDczICs2MzUsMTYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgU0xJUE9SVF9SRUFEWV9USU1FT1VUOyBpKyspIHsKIAkJc2xpcG9ydF9zdGF0dXMgPSBpb3JlYWQzMihhZGFwdGVyLT5kYiArIFNMSVBPUlRfU1RBVFVTX09GRlNFVCk7CiAJCWlmIChzbGlwb3J0X3N0YXR1cyAmIFNMSVBPUlRfU1RBVFVTX1JEWV9NQVNLKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gMDsKKworCQlpZiAoc2xpcG9ydF9zdGF0dXMgJiBTTElQT1JUX1NUQVRVU19FUlJfTUFTSyAmJgorCQkgICAgIShzbGlwb3J0X3N0YXR1cyAmIFNMSVBPUlRfU1RBVFVTX1JOX01BU0spKQorCQkJcmV0dXJuIC1FSU87CiAKIAkJbXNsZWVwKDEwMDApOwogCX0KIAotCWlmIChpID09IFNMSVBPUlRfUkVBRFlfVElNRU9VVCkKLQkJcmV0dXJuIHNsaXBvcnRfc3RhdHVzID8gOiAtMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBsYW5jZXJfcHJvdmlzaW9uaW5nX2Vycm9yKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQotewotCXUzMiBzbGlwb3J0X3N0YXR1cyA9IDAsIHNsaXBvcnRfZXJyMSA9IDAsIHNsaXBvcnRfZXJyMiA9IDA7Ci0KLQlzbGlwb3J0X3N0YXR1cyA9IGlvcmVhZDMyKGFkYXB0ZXItPmRiICsgU0xJUE9SVF9TVEFUVVNfT0ZGU0VUKTsKLQlpZiAoc2xpcG9ydF9zdGF0dXMgJiBTTElQT1JUX1NUQVRVU19FUlJfTUFTSykgewotCQlzbGlwb3J0X2VycjEgPSBpb3JlYWQzMihhZGFwdGVyLT5kYiArIFNMSVBPUlRfRVJST1IxX09GRlNFVCk7Ci0JCXNsaXBvcnRfZXJyMiA9IGlvcmVhZDMyKGFkYXB0ZXItPmRiICsgU0xJUE9SVF9FUlJPUjJfT0ZGU0VUKTsKLQotCQlpZiAoc2xpcG9ydF9lcnIxID09IFNMSVBPUlRfRVJST1JfTk9fUkVTT1VSQ0UxICYmCi0JCSAgICBzbGlwb3J0X2VycjIgPT0gU0xJUE9SVF9FUlJPUl9OT19SRVNPVVJDRTIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1pbnQgbGFuY2VyX3Rlc3RfYW5kX3NldF9yZHlfc3RhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaW50IHN0YXR1czsKLQl1MzIgc2xpcG9ydF9zdGF0dXMsIGVyciwgcmVzZXRfbmVlZGVkOwotCWJvb2wgcmVzb3VyY2VfZXJyb3I7Ci0KLQlyZXNvdXJjZV9lcnJvciA9IGxhbmNlcl9wcm92aXNpb25pbmdfZXJyb3IoYWRhcHRlcik7Ci0JaWYgKHJlc291cmNlX2Vycm9yKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXN0YXR1cyA9IGxhbmNlcl93YWl0X3JlYWR5KGFkYXB0ZXIpOwotCWlmICghc3RhdHVzKSB7Ci0JCXNsaXBvcnRfc3RhdHVzID0gaW9yZWFkMzIoYWRhcHRlci0+ZGIgKyBTTElQT1JUX1NUQVRVU19PRkZTRVQpOwotCQllcnIgPSBzbGlwb3J0X3N0YXR1cyAmIFNMSVBPUlRfU1RBVFVTX0VSUl9NQVNLOwotCQlyZXNldF9uZWVkZWQgPSBzbGlwb3J0X3N0YXR1cyAmIFNMSVBPUlRfU1RBVFVTX1JOX01BU0s7Ci0JCWlmIChlcnIgJiYgcmVzZXRfbmVlZGVkKSB7Ci0JCQlpb3dyaXRlMzIoU0xJX1BPUlRfQ09OVFJPTF9JUF9NQVNLLAotCQkJCSAgYWRhcHRlci0+ZGIgKyBTTElQT1JUX0NPTlRST0xfT0ZGU0VUKTsKLQotCQkJLyogY2hlY2sgaWYgYWRhcHRlciBoYXMgY29ycmVjdGVkIHRoZSBlcnJvciAqLwotCQkJc3RhdHVzID0gbGFuY2VyX3dhaXRfcmVhZHkoYWRhcHRlcik7Ci0JCQlzbGlwb3J0X3N0YXR1cyA9IGlvcmVhZDMyKGFkYXB0ZXItPmRiICsKLQkJCQkJCSAgU0xJUE9SVF9TVEFUVVNfT0ZGU0VUKTsKLQkJCXNsaXBvcnRfc3RhdHVzICY9IChTTElQT1JUX1NUQVRVU19FUlJfTUFTSyB8Ci0JCQkJCQlTTElQT1JUX1NUQVRVU19STl9NQVNLKTsKLQkJCWlmIChzdGF0dXMgfHwgc2xpcG9ydF9zdGF0dXMpCi0JCQkJc3RhdHVzID0gLTE7Ci0JCX0gZWxzZSBpZiAoZXJyIHx8IHJlc2V0X25lZWRlZCkgewotCQkJc3RhdHVzID0gLTE7Ci0JCX0KLQl9Ci0JLyogU3RvcCBlcnJvciByZWNvdmVyeSBpZiBlcnJvciBpcyBub3QgcmVjb3ZlcmFibGUuCi0JICogTm8gcmVzb3VyY2UgZXJyb3IgaXMgdGVtcG9yYXJ5IGVycm9ycyBhbmQgd2lsbCBnbyBhd2F5Ci0JICogd2hlbiBQRiBwcm92aXNpb25zIHJlc291cmNlcy4KLQkgKi8KLQlyZXNvdXJjZV9lcnJvciA9IGxhbmNlcl9wcm92aXNpb25pbmdfZXJyb3IoYWRhcHRlcik7Ci0JaWYgKHJlc291cmNlX2Vycm9yKQotCQlzdGF0dXMgPSAtRUFHQUlOOwotCi0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc2xpcG9ydF9zdGF0dXMgPyA6IC0xOwogfQogCiBpbnQgYmVfZndfd2FpdF9yZWFkeShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTcyMCw2ICs2NjMsMTAgQEAKIAl9CiAKIAlkbyB7CisJCS8qIFRoZXJlJ3Mgbm8gbWVhbnMgdG8gcG9sbCBQT1NUIHN0YXRlIG9uIEJFMi8zIFZGcyAqLworCQlpZiAoQkV4X2NoaXAoYWRhcHRlcikgJiYgYmVfdmlydGZuKGFkYXB0ZXIpKQorCQkJcmV0dXJuIDA7CisKIAkJc3RhZ2UgPSBiZV9QT1NUX3N0YWdlX2dldChhZGFwdGVyKTsKIAkJaWYgKHN0YWdlID09IFBPU1RfU1RBR0VfQVJNRldfUkRZKQogCQkJcmV0dXJuIDA7CkBAIC03MzQsNyArNjgxLDcgQEAKIAogZXJyOgogCWRldl9lcnIoZGV2LCAiUE9TVCB0aW1lb3V0OyBzdGFnZT0lI3hcbiIsIHN0YWdlKTsKLQlyZXR1cm4gLTE7CisJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGJlX3NnZSAqbm9uZW1iZWRkZWRfc2dsKHN0cnVjdCBiZV9tY2Nfd3JiICp3cmIpCkBAIC0xOTAyLDE1ICsxODQ5LDExIEBACiB7CiAJaW50IG51bV9lcXMsIGkgPSAwOwogCi0JaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpICYmIG51bSA+IDgpIHsKLQkJd2hpbGUgKG51bSkgewotCQkJbnVtX2VxcyA9IG1pbihudW0sIDgpOwotCQkJX19iZV9jbWRfbW9kaWZ5X2VxZChhZGFwdGVyLCAmc2V0X2VxZFtpXSwgbnVtX2Vxcyk7Ci0JCQlpICs9IG51bV9lcXM7Ci0JCQludW0gLT0gbnVtX2VxczsKLQkJfQotCX0gZWxzZSB7Ci0JCV9fYmVfY21kX21vZGlmeV9lcWQoYWRhcHRlciwgc2V0X2VxZCwgbnVtKTsKKwl3aGlsZSAobnVtKSB7CisJCW51bV9lcXMgPSBtaW4obnVtLCA4KTsKKwkJX19iZV9jbWRfbW9kaWZ5X2VxZChhZGFwdGVyLCAmc2V0X2VxZFtpXSwgbnVtX2Vxcyk7CisJCWkgKz0gbnVtX2VxczsKKwkJbnVtIC09IG51bV9lcXM7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xOTE4LDcgKzE4NjEsNyBAQAogCiAvKiBVc2VzIHN5Y25ocm9ub3VzIG1jYyAqLwogaW50IGJlX2NtZF92bGFuX2NvbmZpZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGlmX2lkLCB1MTYgKnZ0YWdfYXJyYXksCi0JCSAgICAgICB1MzIgbnVtKQorCQkgICAgICAgdTMyIG51bSwgdTMyIGRvbWFpbikKIHsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCXN0cnVjdCBiZV9jbWRfcmVxX3ZsYW5fY29uZmlnICpyZXE7CkBAIC0xOTM2LDYgKzE4NzksNyBAQAogCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKIAkJCSAgICAgICBPUENPREVfQ09NTU9OX05UV0tfVkxBTl9DT05GSUcsIHNpemVvZigqcmVxKSwKIAkJCSAgICAgICB3cmIsIE5VTEwpOworCXJlcS0+aGRyLmRvbWFpbiA9IGRvbWFpbjsKIAogCXJlcS0+aW50ZXJmYWNlX2lkID0gaWZfaWQ7CiAJcmVxLT51bnRhZ2dlZCA9IEJFX0lGX0ZMQUdTX1VOVEFHR0VEICYgYmVfaWZfY2FwX2ZsYWdzKGFkYXB0ZXIpID8gMSA6IDA7CkBAIC0yMTI2LDE2ICsyMDcwLDEyIEBACiAJaW50IHN0YXR1czsKIAogCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkgeworCQlpb3dyaXRlMzIoU0xJX1BPUlRfQ09OVFJPTF9JUF9NQVNLLAorCQkJICBhZGFwdGVyLT5kYiArIFNMSVBPUlRfQ09OVFJPTF9PRkZTRVQpOwogCQlzdGF0dXMgPSBsYW5jZXJfd2FpdF9yZWFkeShhZGFwdGVyKTsKLQkJaWYgKCFzdGF0dXMpIHsKLQkJCWlvd3JpdGUzMihTTElfUE9SVF9DT05UUk9MX0lQX01BU0ssCi0JCQkJICBhZGFwdGVyLT5kYiArIFNMSVBPUlRfQ09OVFJPTF9PRkZTRVQpOwotCQkJc3RhdHVzID0gbGFuY2VyX3Rlc3RfYW5kX3NldF9yZHlfc3RhdGUoYWRhcHRlcik7Ci0JCX0KLQkJaWYgKHN0YXR1cykgeworCQlpZiAoc3RhdHVzKQogCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAogCQkJCSJBZGFwdGVyIGluIG5vbiByZWNvdmVyYWJsZSBlcnJvclxuIik7Ci0JCX0KIAkJcmV0dXJuIHN0YXR1czsKIAl9CiAKQEAgLTMwNzgsNyArMzAxOCw3IEBACiAKIAkJbWFjX2NvdW50ID0gcmVzcC0+dHJ1ZV9tYWNfY291bnQgKyByZXNwLT5wc2V1ZG9fbWFjX2NvdW50OwogCQkvKiBNYWMgbGlzdCByZXR1cm5lZCBjb3VsZCBjb250YWluIG9uZSBvciBtb3JlIGFjdGl2ZSBtYWNfaWRzCi0JCSAqIG9yIG9uZSBvciBtb3JlIHRydWUgb3IgcHNldWRvIHBlcm1hbmFudCBtYWMgYWRkcmVzc2VzLgorCQkgKiBvciBvbmUgb3IgbW9yZSB0cnVlIG9yIHBzZXVkbyBwZXJtYW5lbnQgbWFjIGFkZHJlc3Nlcy4KIAkJICogSWYgYW4gYWN0aXZlIG1hY19pZCBpcyBwcmVzZW50LCByZXR1cm4gZmlyc3QgYWN0aXZlIG1hY19pZAogCQkgKiBmb3VuZC4KIAkJICovCkBAIC0zMTMzLDcgKzMwNzMsNyBAQAogCWludCBzdGF0dXM7CiAJYm9vbCBwbWFjX3ZhbGlkID0gZmFsc2U7CiAKLQltZW1zZXQobWFjLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihtYWMpOwogCiAJaWYgKEJFeF9jaGlwKGFkYXB0ZXIpKSB7CiAJCWlmIChiZV9waHlzZm4oYWRhcHRlcikpCkBAIC0zNjM0LDEyICszNTc0LDEyIEBACiAJcmVzLT5tYXhfcnNzX3FzID0gbGUxNl90b19jcHUoZGVzYy0+cnNzcV9jb3VudCk7CiAJcmVzLT5tYXhfcnhfcXMgPSBsZTE2X3RvX2NwdShkZXNjLT5ycV9jb3VudCk7CiAJcmVzLT5tYXhfZXZ0X3FzID0gbGUxNl90b19jcHUoZGVzYy0+ZXFfY291bnQpOworCXJlcy0+bWF4X2NxX2NvdW50ID0gbGUxNl90b19jcHUoZGVzYy0+Y3FfY291bnQpOworCXJlcy0+bWF4X2lmYWNlX2NvdW50ID0gbGUxNl90b19jcHUoZGVzYy0+aWZhY2VfY291bnQpOworCXJlcy0+bWF4X21jY19jb3VudCA9IGxlMTZfdG9fY3B1KGRlc2MtPm1jY19jb3VudCk7CiAJLyogQ2xlYXIgZmxhZ3MgdGhhdCBkcml2ZXIgaXMgbm90IGludGVyZXN0ZWQgaW4gKi8KIAlyZXMtPmlmX2NhcF9mbGFncyA9IGxlMzJfdG9fY3B1KGRlc2MtPmNhcF9mbGFncykgJgogCQkJCUJFX0lGX0NBUF9GTEFHU19XQU5UOwotCS8qIE5lZWQgMSBSWFEgYXMgdGhlIGRlZmF1bHQgUlhRICovCi0JaWYgKHJlcy0+bWF4X3Jzc19xcyAmJiByZXMtPm1heF9yc3NfcXMgPT0gcmVzLT5tYXhfcnhfcXMpCi0JCXJlcy0+bWF4X3Jzc19xcyAtPSAxOwogfQogCiAvKiBVc2VzIE1ib3ggKi8KQEAgLTM3MDEsNyArMzY0MSw3IEBACiAKIC8qIFdpbGwgdXNlIE1CT1ggb25seSBpZiBNQ0NRIGhhcyBub3QgYmVlbiBjcmVhdGVkICovCiBpbnQgYmVfY21kX2dldF9wcm9maWxlX2NvbmZpZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCSAgICAgIHN0cnVjdCBiZV9yZXNvdXJjZXMgKnJlcywgdTggZG9tYWluKQorCQkJICAgICAgc3RydWN0IGJlX3Jlc291cmNlcyAqcmVzLCB1OCBxdWVyeSwgdTggZG9tYWluKQogewogCXN0cnVjdCBiZV9jbWRfcmVzcF9nZXRfcHJvZmlsZV9jb25maWcgKnJlc3A7CiAJc3RydWN0IGJlX2NtZF9yZXFfZ2V0X3Byb2ZpbGVfY29uZmlnICpyZXE7CkBAIC0zNzExLDcgKzM2NTEsNyBAQAogCXN0cnVjdCBiZV9uaWNfcmVzX2Rlc2MgKm5pYzsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiB3cmIgPSB7MH07CiAJc3RydWN0IGJlX2RtYV9tZW0gY21kOwotCXUzMiBkZXNjX2NvdW50OworCXUxNiBkZXNjX2NvdW50OwogCWludCBzdGF0dXM7CiAKIAltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKHN0cnVjdCBiZV9kbWFfbWVtKSk7CkBAIC0zNzMwLDEyICszNjcwLDE5IEBACiAJCXJlcS0+aGRyLnZlcnNpb24gPSAxOwogCXJlcS0+dHlwZSA9IEFDVElWRV9QUk9GSUxFX1RZUEU7CiAKKwkvKiBXaGVuIFFVRVJZX01PRElGSUFCTEVfRklFTERTX1RZUEUgYml0IGlzIHNldCwgY21kIHJldHVybnMgdGhlCisJICogZGVzY3JpcHRvcnMgd2l0aCBhbGwgYml0cyBzZXQgdG8gIjEiIGZvciB0aGUgZmllbGRzIHdoaWNoIGNhbiBiZQorCSAqIG1vZGlmaWVkIHVzaW5nIFNFVF9QUk9GSUxFX0NPTkZJRyBjbWQuCisJICovCisJaWYgKHF1ZXJ5ID09IFJFU09VUkNFX01PRElGSUFCTEUpCisJCXJlcS0+dHlwZSB8PSBRVUVSWV9NT0RJRklBQkxFX0ZJRUxEU19UWVBFOworCiAJc3RhdHVzID0gYmVfY21kX25vdGlmeV93YWl0KGFkYXB0ZXIsICZ3cmIpOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyOwogCiAJcmVzcCA9IGNtZC52YTsKLQlkZXNjX2NvdW50ID0gbGUzMl90b19jcHUocmVzcC0+ZGVzY19jb3VudCk7CisJZGVzY19jb3VudCA9IGxlMTZfdG9fY3B1KHJlc3AtPmRlc2NfY291bnQpOwogCiAJcGNpZSA9IGJlX2dldF9wY2llX2Rlc2MoYWRhcHRlci0+cGRldi0+ZGV2Zm4sIHJlc3AtPmZ1bmNfcGFyYW0sCiAJCQkJZGVzY19jb3VudCk7CkBAIC0zODYwLDIzICszODA3LDgwIEBACiAJCQkJCSAxLCB2ZXJzaW9uLCBkb21haW4pOwogfQogCitzdGF0aWMgdm9pZCBiZV9maWxsX3ZmX3Jlc190ZW1wbGF0ZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkgICAgc3RydWN0IGJlX3Jlc291cmNlcyBwb29sX3JlcywKKwkJCQkgICAgdTE2IG51bV92ZnMsIHUxNiBudW1fdmZfcXMsCisJCQkJICAgIHN0cnVjdCBiZV9uaWNfcmVzX2Rlc2MgKm5pY192ZnQpCit7CisJdTMyIHZmX2lmX2NhcF9mbGFncyA9IHBvb2xfcmVzLnZmX2lmX2NhcF9mbGFnczsKKwlzdHJ1Y3QgYmVfcmVzb3VyY2VzIHJlc19tb2QgPSB7MH07CisKKwkvKiBSZXNvdXJjZSB3aXRoIGZpZWxkcyBzZXQgdG8gYWxsICcxJ3MgYnkgR0VUX1BST0ZJTEVfQ09ORklHIGNtZCwKKwkgKiB3aGljaCBhcmUgbW9kaWZpYWJsZSB1c2luZyBTRVRfUFJPRklMRV9DT05GSUcgY21kLgorCSAqLworCWJlX2NtZF9nZXRfcHJvZmlsZV9jb25maWcoYWRhcHRlciwgJnJlc19tb2QsIFJFU09VUkNFX01PRElGSUFCTEUsIDApOworCisJLyogSWYgUlNTIElGQUNFIGNhcGFiaWxpdHkgZmxhZ3MgYXJlIG1vZGlmaWFibGUgZm9yIGEgVkYsIHNldCB0aGUKKwkgKiBjYXBhYmlsaXR5IGZsYWcgYXMgdmFsaWQgYW5kIHNldCBSU1MgYW5kIERFRlFfUlNTIElGQUNFIGZsYWdzIGlmCisJICogbW9yZSB0aGFuIDEgUlNTUSBpcyBhdmFpbGFibGUgZm9yIGEgVkYuCisJICogT3RoZXJ3aXNlLCBwcm92aXNpb24gb25seSAxIHF1ZXVlIHBhaXIgZm9yIFZGLgorCSAqLworCWlmIChyZXNfbW9kLnZmX2lmX2NhcF9mbGFncyAmIEJFX0lGX0ZMQUdTX1JTUykgeworCQluaWNfdmZ0LT5mbGFncyB8PSBCSVQoSUZfQ0FQU19GTEFHU19WQUxJRF9TSElGVCk7CisJCWlmIChudW1fdmZfcXMgPiAxKSB7CisJCQl2Zl9pZl9jYXBfZmxhZ3MgfD0gQkVfSUZfRkxBR1NfUlNTOworCQkJaWYgKHBvb2xfcmVzLmlmX2NhcF9mbGFncyAmIEJFX0lGX0ZMQUdTX0RFRlFfUlNTKQorCQkJCXZmX2lmX2NhcF9mbGFncyB8PSBCRV9JRl9GTEFHU19ERUZRX1JTUzsKKwkJfSBlbHNlIHsKKwkJCXZmX2lmX2NhcF9mbGFncyAmPSB+KEJFX0lGX0ZMQUdTX1JTUyB8CisJCQkJCSAgICAgQkVfSUZfRkxBR1NfREVGUV9SU1MpOworCQl9CisKKwkJbmljX3ZmdC0+Y2FwX2ZsYWdzID0gY3B1X3RvX2xlMzIodmZfaWZfY2FwX2ZsYWdzKTsKKwl9IGVsc2UgeworCQludW1fdmZfcXMgPSAxOworCX0KKworCW5pY192ZnQtPnJxX2NvdW50ID0gY3B1X3RvX2xlMTYobnVtX3ZmX3FzKTsKKwluaWNfdmZ0LT50eHFfY291bnQgPSBjcHVfdG9fbGUxNihudW1fdmZfcXMpOworCW5pY192ZnQtPnJzc3FfY291bnQgPSBjcHVfdG9fbGUxNihudW1fdmZfcXMpOworCW5pY192ZnQtPmNxX2NvdW50ID0gY3B1X3RvX2xlMTYocG9vbF9yZXMubWF4X2NxX2NvdW50IC8KKwkJCQkJKG51bV92ZnMgKyAxKSk7CisKKwkvKiBEaXN0cmlidXRlIHVuaWNhc3QgTUFDcywgVkxBTnMsIElGQUNFIGNvdW50IGFuZCBNQ0NRIGNvdW50IGVxdWFsbHkKKwkgKiBhbW9uZyB0aGUgUEYgYW5kIGl0J3MgVkZzLCBpZiB0aGUgZmllbGRzIGFyZSBjaGFuZ2VhYmxlCisJICovCisJaWYgKHJlc19tb2QubWF4X3VjX21hYyA9PSBGSUVMRF9NT0RJRklBQkxFKQorCQluaWNfdmZ0LT51bmljYXN0X21hY19jb3VudCA9IGNwdV90b19sZTE2KHBvb2xfcmVzLm1heF91Y19tYWMgLworCQkJCQkJCSAobnVtX3ZmcyArIDEpKTsKKworCWlmIChyZXNfbW9kLm1heF92bGFucyA9PSBGSUVMRF9NT0RJRklBQkxFKQorCQluaWNfdmZ0LT52bGFuX2NvdW50ID0gY3B1X3RvX2xlMTYocG9vbF9yZXMubWF4X3ZsYW5zIC8KKwkJCQkJCSAgKG51bV92ZnMgKyAxKSk7CisKKwlpZiAocmVzX21vZC5tYXhfaWZhY2VfY291bnQgPT0gRklFTERfTU9ESUZJQUJMRSkKKwkJbmljX3ZmdC0+aWZhY2VfY291bnQgPSBjcHVfdG9fbGUxNihwb29sX3Jlcy5tYXhfaWZhY2VfY291bnQgLworCQkJCQkJICAgKG51bV92ZnMgKyAxKSk7CisKKwlpZiAocmVzX21vZC5tYXhfbWNjX2NvdW50ID09IEZJRUxEX01PRElGSUFCTEUpCisJCW5pY192ZnQtPm1jY19jb3VudCA9IGNwdV90b19sZTE2KHBvb2xfcmVzLm1heF9tY2NfY291bnQgLworCQkJCQkJIChudW1fdmZzICsgMSkpOworfQorCiBpbnQgYmVfY21kX3NldF9zcmlvdl9jb25maWcoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgc3RydWN0IGJlX3Jlc291cmNlcyByZXMsIHUxNiBudW1fdmZzKQorCQkJICAgIHN0cnVjdCBiZV9yZXNvdXJjZXMgcG9vbF9yZXMsIHUxNiBudW1fdmZzLAorCQkJICAgIHUxNiBudW1fdmZfcXMpCiB7CiAJc3RydWN0IHsKIAkJc3RydWN0IGJlX3BjaWVfcmVzX2Rlc2MgcGNpZTsKIAkJc3RydWN0IGJlX25pY19yZXNfZGVzYyBuaWNfdmZ0OwogCX0gX19wYWNrZWQgZGVzYzsKLQl1MTYgdmZfcV9jb3VudDsKLQotCWlmIChCRXhfY2hpcChhZGFwdGVyKSB8fCBsYW5jZXJfY2hpcChhZGFwdGVyKSkKLQkJcmV0dXJuIDA7CiAKIAkvKiBQRiBQQ0lFIGRlc2NyaXB0b3IgKi8KIAliZV9yZXNldF9wY2llX2Rlc2MoJmRlc2MucGNpZSk7CiAJZGVzYy5wY2llLmhkci5kZXNjX3R5cGUgPSBQQ0lFX1JFU09VUkNFX0RFU0NfVFlQRV9WMTsKIAlkZXNjLnBjaWUuaGRyLmRlc2NfbGVuID0gUkVTT1VSQ0VfREVTQ19TSVpFX1YxOwotCWRlc2MucGNpZS5mbGFncyA9ICgxIDw8IElNTV9TSElGVCkgfCAoMSA8PCBOT1NWX1NISUZUKTsKKwlkZXNjLnBjaWUuZmxhZ3MgPSBCSVQoSU1NX1NISUZUKSB8IEJJVChOT1NWX1NISUZUKTsKIAlkZXNjLnBjaWUucGZfbnVtID0gYWRhcHRlci0+cGRldi0+ZGV2Zm47CiAJZGVzYy5wY2llLnNyaW92X3N0YXRlID0gbnVtX3ZmcyA/IDEgOiAwOwogCWRlc2MucGNpZS5udW1fdmZzID0gY3B1X3RvX2xlMTYobnVtX3Zmcyk7CkBAIC0zODg1LDMyICszODg5LDEyIEBACiAJYmVfcmVzZXRfbmljX2Rlc2MoJmRlc2MubmljX3ZmdCk7CiAJZGVzYy5uaWNfdmZ0Lmhkci5kZXNjX3R5cGUgPSBOSUNfUkVTT1VSQ0VfREVTQ19UWVBFX1YxOwogCWRlc2MubmljX3ZmdC5oZHIuZGVzY19sZW4gPSBSRVNPVVJDRV9ERVNDX1NJWkVfVjE7Ci0JZGVzYy5uaWNfdmZ0LmZsYWdzID0gKDEgPDwgVkZUX1NISUZUKSB8ICgxIDw8IElNTV9TSElGVCkgfAotCQkJCSgxIDw8IE5PU1ZfU0hJRlQpOworCWRlc2MubmljX3ZmdC5mbGFncyA9IEJJVChWRlRfU0hJRlQpIHwgQklUKElNTV9TSElGVCkgfCBCSVQoTk9TVl9TSElGVCk7CiAJZGVzYy5uaWNfdmZ0LnBmX251bSA9IGFkYXB0ZXItPnBkZXYtPmRldmZuOwogCWRlc2MubmljX3ZmdC52Zl9udW0gPSAwOwogCi0JaWYgKG51bV92ZnMgJiYgcmVzLnZmX2lmX2NhcF9mbGFncyAmIEJFX0lGX0ZMQUdTX1JTUykgewotCQkvKiBJZiBudW1iZXIgb2YgVkZzIHJlcXVlc3RlZCBpcyA4IGxlc3MgdGhhbiBtYXggc3VwcG9ydGVkLAotCQkgKiBhc3NpZ24gOCBxdWV1ZSBwYWlycyB0byB0aGUgUEYgYW5kIGRpdmlkZSB0aGUgcmVtYWluaW5nCi0JCSAqIHJlc291cmNlcyBldmVubHkgYW1vbmcgdGhlIFZGcwotCQkgKi8KLQkJaWYgKG51bV92ZnMgPCAoYmVfbWF4X3ZmcyhhZGFwdGVyKSAtIDgpKQotCQkJdmZfcV9jb3VudCA9IChyZXMubWF4X3Jzc19xcyAtIDgpIC8gbnVtX3ZmczsKLQkJZWxzZQotCQkJdmZfcV9jb3VudCA9IHJlcy5tYXhfcnNzX3FzIC8gbnVtX3ZmczsKLQotCQlkZXNjLm5pY192ZnQucnFfY291bnQgPSBjcHVfdG9fbGUxNih2Zl9xX2NvdW50KTsKLQkJZGVzYy5uaWNfdmZ0LnR4cV9jb3VudCA9IGNwdV90b19sZTE2KHZmX3FfY291bnQpOwotCQlkZXNjLm5pY192ZnQucnNzcV9jb3VudCA9IGNwdV90b19sZTE2KHZmX3FfY291bnQgLSAxKTsKLQkJZGVzYy5uaWNfdmZ0LmNxX2NvdW50ID0gY3B1X3RvX2xlMTYoMyAqIHZmX3FfY291bnQpOwotCX0gZWxzZSB7Ci0JCWRlc2MubmljX3ZmdC50eHFfY291bnQgPSBjcHVfdG9fbGUxNigxKTsKLQkJZGVzYy5uaWNfdmZ0LnJxX2NvdW50ID0gY3B1X3RvX2xlMTYoMSk7Ci0JCWRlc2MubmljX3ZmdC5yc3NxX2NvdW50ID0gY3B1X3RvX2xlMTYoMCk7Ci0JCS8qIE9uZSBDUSBmb3IgZWFjaCBUWCwgUlggYW5kIE1DQ1EgKi8KLQkJZGVzYy5uaWNfdmZ0LmNxX2NvdW50ID0gY3B1X3RvX2xlMTYoMyk7Ci0JfQorCWJlX2ZpbGxfdmZfcmVzX3RlbXBsYXRlKGFkYXB0ZXIsIHBvb2xfcmVzLCBudW1fdmZzLCBudW1fdmZfcXMsCisJCQkJJmRlc2MubmljX3ZmdCk7CiAKIAlyZXR1cm4gYmVfY21kX3NldF9wcm9maWxlX2NvbmZpZyhhZGFwdGVyLCAmZGVzYywKIAkJCQkJIDIgKiBSRVNPVVJDRV9ERVNDX1NJWkVfVjEsIDIsIDEsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmgKaW5kZXggZGI3NjFlOGUuLjFlYzIyMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuaApAQCAtNTg4LDE0ICs1ODgsMTUgQEAKIAlCRV9JRl9GTEFHU19NQ0FTVF9QUk9NSVNDVU9VUyA9IDB4MjAwLAogCUJFX0lGX0ZMQUdTX1BBU1NfTDJfRVJST1JTID0gMHg0MDAsCiAJQkVfSUZfRkxBR1NfUEFTU19MM0w0X0VSUk9SUyA9IDB4ODAwLAotCUJFX0lGX0ZMQUdTX01VTFRJQ0FTVCA9IDB4MTAwMAorCUJFX0lGX0ZMQUdTX01VTFRJQ0FTVCA9IDB4MTAwMCwKKwlCRV9JRl9GTEFHU19ERUZRX1JTUyA9IDB4MTAwMDAwMAogfTsKIAogI2RlZmluZSBCRV9JRl9DQVBfRkxBR1NfV0FOVCAoQkVfSUZfRkxBR1NfUlNTIHwgQkVfSUZfRkxBR1NfUFJPTUlTQ1VPVVMgfFwKIAkJCSBCRV9JRl9GTEFHU19CUk9BRENBU1QgfCBCRV9JRl9GTEFHU19WTEFOX1BST01JU0NVT1VTIHxcCiAJCQkgQkVfSUZfRkxBR1NfVkxBTiB8IEJFX0lGX0ZMQUdTX01DQVNUX1BST01JU0NVT1VTIHxcCiAJCQkgQkVfSUZfRkxBR1NfUEFTU19MM0w0X0VSUk9SUyB8IEJFX0lGX0ZMQUdTX01VTFRJQ0FTVCB8XAotCQkJIEJFX0lGX0ZMQUdTX1VOVEFHR0VEKQorCQkJIEJFX0lGX0ZMQUdTX1VOVEFHR0VEIHwgQkVfSUZfRkxBR1NfREVGUV9SU1MpCiAKICNkZWZpbmUgQkVfSUZfRkxBR1NfQUxMX1BST01JU0NVT1VTCShCRV9JRl9GTEFHU19QUk9NSVNDVU9VUyB8IFwKIAkJCQkJIEJFX0lGX0ZMQUdTX1ZMQU5fUFJPTUlTQ1VPVVMgfFwKQEAgLTIwMjEsNiArMjAyMiw3IEBACiAjZGVmaW5lIFBPUlRfUkVTT1VSQ0VfREVTQ19UWVBFX1YxCQkweDU1CiAjZGVmaW5lIE1BWF9SRVNPVVJDRV9ERVNDCQkJMjY0CiAKKyNkZWZpbmUgSUZfQ0FQU19GTEFHU19WQUxJRF9TSElGVAkJMAkvKiBJRiBjYXBzIHZhbGlkICovCiAjZGVmaW5lIFZGVF9TSElGVAkJCQkzCS8qIFZGIHRlbXBsYXRlICovCiAjZGVmaW5lIElNTV9TSElGVAkJCQk2CS8qIEltbWVkaWF0ZSAqLwogI2RlZmluZSBOT1NWX1NISUZUCQkJCTcJLyogTm8gc2F2ZSAqLwpAQCAtMjEzMSwyMCArMjEzMywyOCBAQAogCXU4IGZ1bmNfcGFyYW1bTUFYX1JFU09VUkNFX0RFU0MgKiBSRVNPVVJDRV9ERVNDX1NJWkVfVjFdOwogfTsKIAotI2RlZmluZSBBQ1RJVkVfUFJPRklMRV9UWVBFCQkJMHgyCitlbnVtIHsKKwlSRVNPVVJDRV9MSU1JVFMsCisJUkVTT1VSQ0VfTU9ESUZJQUJMRQorfTsKKwogc3RydWN0IGJlX2NtZF9yZXFfZ2V0X3Byb2ZpbGVfY29uZmlnIHsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOwogCXU4IHJzdmQ7CisjZGVmaW5lIEFDVElWRV9QUk9GSUxFX1RZUEUJCQkweDIKKyNkZWZpbmUgUVVFUllfTU9ESUZJQUJMRV9GSUVMRFNfVFlQRQkJQklUKDMpCiAJdTggdHlwZTsKIAl1MTYgcnN2ZDE7CiB9OwogCiBzdHJ1Y3QgYmVfY21kX3Jlc3BfZ2V0X3Byb2ZpbGVfY29uZmlnIHsKIAlzdHJ1Y3QgYmVfY21kX3Jlc3BfaGRyIGhkcjsKLQl1MzIgZGVzY19jb3VudDsKKwlfX2xlMTYgZGVzY19jb3VudDsKKwl1MTYgcnN2ZDsKIAl1OCBmdW5jX3BhcmFtW01BWF9SRVNPVVJDRV9ERVNDICogUkVTT1VSQ0VfREVTQ19TSVpFX1YxXTsKIH07CiAKKyNkZWZpbmUgRklFTERfTU9ESUZJQUJMRQkJCTB4RkZGRgogc3RydWN0IGJlX2NtZF9yZXFfc2V0X3Byb2ZpbGVfY29uZmlnIHsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOwogCXUzMiByc3ZkOwpAQCAtMjI1Niw3ICsyMjY2LDcgQEAKIGludCBiZV9jbWRfZ2V0X2Z3X3ZlcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgYmVfY21kX21vZGlmeV9lcWQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBiZV9zZXRfZXFkICosIGludCBudW0pOwogaW50IGJlX2NtZF92bGFuX2NvbmZpZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGlmX2lkLCB1MTYgKnZ0YWdfYXJyYXksCi0JCSAgICAgICB1MzIgbnVtKTsKKwkJICAgICAgIHUzMiBudW0sIHUzMiBkb21haW4pOwogaW50IGJlX2NtZF9yeF9maWx0ZXIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBmbGFncywgdTMyIHN0YXR1cyk7CiBpbnQgYmVfY21kX3NldF9mbG93X2NvbnRyb2woc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiB0eF9mYywgdTMyIHJ4X2ZjKTsKIGludCBiZV9jbWRfZ2V0X2Zsb3dfY29udHJvbChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyICp0eF9mYywgdTMyICpyeF9mYyk7CkBAIC0yMzQ0LDcgKzIzNTQsNyBAQAogaW50IGJlX2NtZF9nZXRfZnVuY19jb25maWcoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkgICBzdHJ1Y3QgYmVfcmVzb3VyY2VzICpyZXMpOwogaW50IGJlX2NtZF9nZXRfcHJvZmlsZV9jb25maWcoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkgICAgICBzdHJ1Y3QgYmVfcmVzb3VyY2VzICpyZXMsIHU4IGRvbWFpbik7CisJCQkgICAgICBzdHJ1Y3QgYmVfcmVzb3VyY2VzICpyZXMsIHU4IHF1ZXJ5LCB1OCBkb21haW4pOwogaW50IGJlX2NtZF9nZXRfYWN0aXZlX3Byb2ZpbGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiAqcHJvZmlsZSk7CiBpbnQgYmVfY21kX2dldF9pZl9pZChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGJlX3ZmX2NmZyAqdmZfY2ZnLAogCQkgICAgIGludCB2Zl9udW0pOwpAQCAtMjM1NSw0ICsyMzY1LDUgQEAKIGludCBiZV9jbWRfc2V0X3Z4bGFuX3BvcnQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIF9fYmUxNiBwb3J0KTsKIGludCBiZV9jbWRfbWFuYWdlX2lmYWNlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgaWZhY2UsIHU4IG9wKTsKIGludCBiZV9jbWRfc2V0X3NyaW92X2NvbmZpZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKLQkJCSAgICBzdHJ1Y3QgYmVfcmVzb3VyY2VzIHJlcywgdTE2IG51bV92ZnMpOworCQkJICAgIHN0cnVjdCBiZV9yZXNvdXJjZXMgcmVzLCB1MTYgbnVtX3ZmcywKKwkJCSAgICB1MTYgbnVtX3ZmX3FzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfZXRodG9vbC5jCmluZGV4IDRkMmRlNDcuLmI3NjVjMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2V0aHRvb2wuYwpAQCAtMTA5Nyw3ICsxMDk3LDcgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAogCWlmIChiZV9tdWx0aV9yeHEoYWRhcHRlcikpIHsKLQkJZm9yIChqID0gMDsgaiA8IDEyODsgaiArPSBhZGFwdGVyLT5udW1fcnhfcXMgLSAxKSB7CisJCWZvciAoaiA9IDA7IGogPCAxMjg7IGogKz0gYWRhcHRlci0+bnVtX3Jzc19xcykgewogCQkJZm9yX2FsbF9yc3NfcXVldWVzKGFkYXB0ZXIsIHJ4bywgaSkgewogCQkJCWlmICgoaiArIGkpID49IDEyOCkKIAkJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX21haW4uYwppbmRleCAwYTgxNjg1Li5mYjBiYzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9tYWluLmMKQEAgLTMwLDYgKzMwLDkgQEAKIE1PRFVMRV9BVVRIT1IoIkVtdWxleCBDb3Jwb3JhdGlvbiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCisvKiBudW1fdmZzIG1vZHVsZSBwYXJhbSBpcyBvYnNvbGV0ZS4KKyAqIFVzZSBzeXNmcyBtZXRob2QgdG8gZW5hYmxlL2Rpc2FibGUgVkZzLgorICovCiBzdGF0aWMgdW5zaWduZWQgaW50IG51bV92ZnM7CiBtb2R1bGVfcGFyYW0obnVtX3ZmcywgdWludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG51bV92ZnMsICJOdW1iZXIgb2YgUENJIFZGcyB0byBpbml0aWFsaXplIik7CkBAIC03MjcsNDggKzczMCw4NiBAQAogCQlpcF9oZHIoc2tiKS0+cHJvdG9jb2wgOiBpcHY2X2hkcihza2IpLT5uZXh0aGRyOwogfQogCi1zdGF0aWMgdm9pZCB3cmJfZmlsbF9oZHIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBiZV9ldGhfaGRyX3dyYiAqaGRyLAotCQkJIHN0cnVjdCBza19idWZmICpza2IsIHUzMiB3cmJfY250LCB1MzIgbGVuLAotCQkJIGJvb2wgc2tpcF9od192bGFuKQorc3RhdGljIGlubGluZSBib29sIGJlX2lzX3R4cV9mdWxsKHN0cnVjdCBiZV90eF9vYmogKnR4bykKIHsKLQl1MTYgdmxhbl90YWcsIHByb3RvOworCXJldHVybiBhdG9taWNfcmVhZCgmdHhvLT5xLnVzZWQpICsgQkVfTUFYX1RYX0ZSQUdfQ09VTlQgPj0gdHhvLT5xLmxlbjsKK30KIAotCW1lbXNldChoZHIsIDAsIHNpemVvZigqaGRyKSk7CitzdGF0aWMgaW5saW5lIGJvb2wgYmVfY2FuX3R4cV93YWtlKHN0cnVjdCBiZV90eF9vYmogKnR4bykKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJnR4by0+cS51c2VkKSA8IHR4by0+cS5sZW4gLyAyOworfQogCi0JU0VUX1RYX1dSQl9IRFJfQklUUyhjcmMsIGhkciwgMSk7CitzdGF0aWMgaW5saW5lIGJvb2wgYmVfaXNfdHhfY29tcGxfcGVuZGluZyhzdHJ1Y3QgYmVfdHhfb2JqICp0eG8pCit7CisJcmV0dXJuIGF0b21pY19yZWFkKCZ0eG8tPnEudXNlZCkgPiB0eG8tPnBlbmRfd3JiX2NudDsKK30KKworc3RhdGljIHZvaWQgYmVfZ2V0X3dyYl9wYXJhbXNfZnJvbV9za2Ioc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIHN0cnVjdCBiZV93cmJfcGFyYW1zICp3cmJfcGFyYW1zKQoreworCXUxNiBwcm90bzsKIAogCWlmIChza2JfaXNfZ3NvKHNrYikpIHsKLQkJU0VUX1RYX1dSQl9IRFJfQklUUyhsc28sIGhkciwgMSk7Ci0JCVNFVF9UWF9XUkJfSERSX0JJVFMobHNvX21zcywgaGRyLCBza2Jfc2hpbmZvKHNrYiktPmdzb19zaXplKTsKKwkJQkVfV1JCX0ZfU0VUKHdyYl9wYXJhbXMtPmZlYXR1cmVzLCBMU08sIDEpOworCQl3cmJfcGFyYW1zLT5sc29fbXNzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2l6ZTsKIAkJaWYgKHNrYl9pc19nc29fdjYoc2tiKSAmJiAhbGFuY2VyX2NoaXAoYWRhcHRlcikpCi0JCQlTRVRfVFhfV1JCX0hEUl9CSVRTKGxzbzYsIGhkciwgMSk7CisJCQlCRV9XUkJfRl9TRVQod3JiX3BhcmFtcy0+ZmVhdHVyZXMsIExTTzYsIDEpOwogCX0gZWxzZSBpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgewogCQlpZiAoc2tiLT5lbmNhcHN1bGF0aW9uKSB7Ci0JCQlTRVRfVFhfV1JCX0hEUl9CSVRTKGlwY3MsIGhkciwgMSk7CisJCQlCRV9XUkJfRl9TRVQod3JiX3BhcmFtcy0+ZmVhdHVyZXMsIElQQ1MsIDEpOwogCQkJcHJvdG8gPSBza2JfaW5uZXJfaXBfcHJvdG8oc2tiKTsKIAkJfSBlbHNlIHsKIAkJCXByb3RvID0gc2tiX2lwX3Byb3RvKHNrYik7CiAJCX0KIAkJaWYgKHByb3RvID09IElQUFJPVE9fVENQKQotCQkJU0VUX1RYX1dSQl9IRFJfQklUUyh0Y3BjcywgaGRyLCAxKTsKKwkJCUJFX1dSQl9GX1NFVCh3cmJfcGFyYW1zLT5mZWF0dXJlcywgVENQQ1MsIDEpOwogCQllbHNlIGlmIChwcm90byA9PSBJUFBST1RPX1VEUCkKLQkJCVNFVF9UWF9XUkJfSERSX0JJVFModWRwY3MsIGhkciwgMSk7CisJCQlCRV9XUkJfRl9TRVQod3JiX3BhcmFtcy0+ZmVhdHVyZXMsIFVEUENTLCAxKTsKIAl9CiAKIAlpZiAoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkgewotCQlTRVRfVFhfV1JCX0hEUl9CSVRTKHZsYW4sIGhkciwgMSk7Ci0JCXZsYW5fdGFnID0gYmVfZ2V0X3R4X3ZsYW5fdGFnKGFkYXB0ZXIsIHNrYik7Ci0JCVNFVF9UWF9XUkJfSERSX0JJVFModmxhbl90YWcsIGhkciwgdmxhbl90YWcpOworCQlCRV9XUkJfRl9TRVQod3JiX3BhcmFtcy0+ZmVhdHVyZXMsIFZMQU4sIDEpOworCQl3cmJfcGFyYW1zLT52bGFuX3RhZyA9IGJlX2dldF90eF92bGFuX3RhZyhhZGFwdGVyLCBza2IpOwogCX0KIAotCVNFVF9UWF9XUkJfSERSX0JJVFMobnVtX3dyYiwgaGRyLCB3cmJfY250KTsKLQlTRVRfVFhfV1JCX0hEUl9CSVRTKGxlbiwgaGRyLCBsZW4pOworCUJFX1dSQl9GX1NFVCh3cmJfcGFyYW1zLT5mZWF0dXJlcywgQ1JDLCAxKTsKK30KIAotCS8qIEhhY2sgdG8gc2tpcCBIVyBWTEFOIHRhZ2dpbmcgbmVlZHMgZXZ0ID0gMSwgY29tcGwgPSAwCi0JICogV2hlbiB0aGlzIGhhY2sgaXMgbm90IG5lZWRlZCwgdGhlIGV2dCBiaXQgaXMgc2V0IHdoaWxlIHJpbmdpbmcgREIKK3N0YXRpYyB2b2lkIHdyYl9maWxsX2hkcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCSBzdHJ1Y3QgYmVfZXRoX2hkcl93cmIgKmhkciwKKwkJCSBzdHJ1Y3QgYmVfd3JiX3BhcmFtcyAqd3JiX3BhcmFtcywKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCW1lbXNldChoZHIsIDAsIHNpemVvZigqaGRyKSk7CisKKwlTRVRfVFhfV1JCX0hEUl9CSVRTKGNyYywgaGRyLAorCQkJICAgIEJFX1dSQl9GX0dFVCh3cmJfcGFyYW1zLT5mZWF0dXJlcywgQ1JDKSk7CisJU0VUX1RYX1dSQl9IRFJfQklUUyhpcGNzLCBoZHIsCisJCQkgICAgQkVfV1JCX0ZfR0VUKHdyYl9wYXJhbXMtPmZlYXR1cmVzLCBJUENTKSk7CisJU0VUX1RYX1dSQl9IRFJfQklUUyh0Y3BjcywgaGRyLAorCQkJICAgIEJFX1dSQl9GX0dFVCh3cmJfcGFyYW1zLT5mZWF0dXJlcywgVENQQ1MpKTsKKwlTRVRfVFhfV1JCX0hEUl9CSVRTKHVkcGNzLCBoZHIsCisJCQkgICAgQkVfV1JCX0ZfR0VUKHdyYl9wYXJhbXMtPmZlYXR1cmVzLCBVRFBDUykpOworCisJU0VUX1RYX1dSQl9IRFJfQklUUyhsc28sIGhkciwKKwkJCSAgICBCRV9XUkJfRl9HRVQod3JiX3BhcmFtcy0+ZmVhdHVyZXMsIExTTykpOworCVNFVF9UWF9XUkJfSERSX0JJVFMobHNvNiwgaGRyLAorCQkJICAgIEJFX1dSQl9GX0dFVCh3cmJfcGFyYW1zLT5mZWF0dXJlcywgTFNPNikpOworCVNFVF9UWF9XUkJfSERSX0JJVFMobHNvX21zcywgaGRyLCB3cmJfcGFyYW1zLT5sc29fbXNzKTsKKworCS8qIEhhY2sgdG8gc2tpcCBIVyBWTEFOIHRhZ2dpbmcgbmVlZHMgZXZ0ID0gMSwgY29tcGwgPSAwLiBXaGVuIHRoaXMKKwkgKiBoYWNrIGlzIG5vdCBuZWVkZWQsIHRoZSBldnQgYml0IGlzIHNldCB3aGlsZSByaW5naW5nIERCLgogCSAqLwotCWlmIChza2lwX2h3X3ZsYW4pCi0JCVNFVF9UWF9XUkJfSERSX0JJVFMoZXZlbnQsIGhkciwgMSk7CisJU0VUX1RYX1dSQl9IRFJfQklUUyhldmVudCwgaGRyLAorCQkJICAgIEJFX1dSQl9GX0dFVCh3cmJfcGFyYW1zLT5mZWF0dXJlcywgVkxBTl9TS0lQX0hXKSk7CisJU0VUX1RYX1dSQl9IRFJfQklUUyh2bGFuLCBoZHIsCisJCQkgICAgQkVfV1JCX0ZfR0VUKHdyYl9wYXJhbXMtPmZlYXR1cmVzLCBWTEFOKSk7CisJU0VUX1RYX1dSQl9IRFJfQklUUyh2bGFuX3RhZywgaGRyLCB3cmJfcGFyYW1zLT52bGFuX3RhZyk7CisKKwlTRVRfVFhfV1JCX0hEUl9CSVRTKG51bV93cmIsIGhkciwgc2tiX3dyYl9jbnQoc2tiKSk7CisJU0VUX1RYX1dSQl9IRFJfQklUUyhsZW4sIGhkciwgc2tiLT5sZW4pOwogfQogCiBzdGF0aWMgdm9pZCB1bm1hcF90eF9mcmFnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGJlX2V0aF93cmIgKndyYiwKQEAgLTc4OCw2NiArODI5LDYzIEBACiAJfQogfQogCi0vKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgV1JCcyB1c2VkIHVwIGJ5IHRoZSBza2IgKi8KLXN0YXRpYyB1MzIgYmVfeG1pdF9lbnF1ZXVlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgYmVfdHhfb2JqICp0eG8sCi0JCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBib29sIHNraXBfaHdfdmxhbikKKy8qIEdyYWIgYSBXUkIgaGVhZGVyIGZvciB4bWl0ICovCitzdGF0aWMgdTE2IGJlX3R4X2dldF93cmJfaGRyKHN0cnVjdCBiZV90eF9vYmogKnR4bykKIHsKLQl1MzIgaSwgY29waWVkID0gMCwgd3JiX2NudCA9IHNrYl93cmJfY250KHNrYik7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKKwl1MTYgaGVhZCA9IHR4by0+cS5oZWFkOworCisJcXVldWVfaGVhZF9pbmMoJnR4by0+cSk7CisJcmV0dXJuIGhlYWQ7Cit9CisKKy8qIFNldCB1cCB0aGUgV1JCIGhlYWRlciBmb3IgeG1pdCAqLworc3RhdGljIHZvaWQgYmVfdHhfc2V0dXBfd3JiX2hkcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQlzdHJ1Y3QgYmVfdHhfb2JqICp0eG8sCisJCQkJc3RydWN0IGJlX3dyYl9wYXJhbXMgKndyYl9wYXJhbXMsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGhlYWQpCit7CisJdTMyIG51bV9mcmFncyA9IHNrYl93cmJfY250KHNrYik7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4cSA9ICZ0eG8tPnE7Ci0Jc3RydWN0IGJlX2V0aF9oZHJfd3JiICpoZHI7Ci0JYm9vbCBtYXBfc2luZ2xlID0gZmFsc2U7Ci0Jc3RydWN0IGJlX2V0aF93cmIgKndyYjsKLQlkbWFfYWRkcl90IGJ1c2FkZHI7Ci0JdTE2IGhlYWQgPSB0eHEtPmhlYWQ7CisJc3RydWN0IGJlX2V0aF9oZHJfd3JiICpoZHIgPSBxdWV1ZV9pbmRleF9ub2RlKHR4cSwgaGVhZCk7CiAKLQloZHIgPSBxdWV1ZV9oZWFkX25vZGUodHhxKTsKLQl3cmJfZmlsbF9oZHIoYWRhcHRlciwgaGRyLCBza2IsIHdyYl9jbnQsIHNrYi0+bGVuLCBza2lwX2h3X3ZsYW4pOworCXdyYl9maWxsX2hkcihhZGFwdGVyLCBoZHIsIHdyYl9wYXJhbXMsIHNrYik7CiAJYmVfZHdzX2NwdV90b19sZShoZHIsIHNpemVvZigqaGRyKSk7CiAKLQlxdWV1ZV9oZWFkX2luYyh0eHEpOwotCi0JaWYgKHNrYi0+bGVuID4gc2tiLT5kYXRhX2xlbikgewotCQlpbnQgbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKLQotCQlidXNhZGRyID0gZG1hX21hcF9zaW5nbGUoZGV2LCBza2ItPmRhdGEsIGxlbiwgRE1BX1RPX0RFVklDRSk7Ci0JCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGJ1c2FkZHIpKQotCQkJZ290byBkbWFfZXJyOwotCQltYXBfc2luZ2xlID0gdHJ1ZTsKLQkJd3JiID0gcXVldWVfaGVhZF9ub2RlKHR4cSk7Ci0JCXdyYl9maWxsKHdyYiwgYnVzYWRkciwgbGVuKTsKLQkJcXVldWVfaGVhZF9pbmModHhxKTsKLQkJY29waWVkICs9IGxlbjsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsgaSsrKSB7Ci0JCWNvbnN0IHN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKLQotCQlidXNhZGRyID0gc2tiX2ZyYWdfZG1hX21hcChkZXYsIGZyYWcsIDAsCi0JCQkJCSAgIHNrYl9mcmFnX3NpemUoZnJhZyksIERNQV9UT19ERVZJQ0UpOwotCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCBidXNhZGRyKSkKLQkJCWdvdG8gZG1hX2VycjsKLQkJd3JiID0gcXVldWVfaGVhZF9ub2RlKHR4cSk7Ci0JCXdyYl9maWxsKHdyYiwgYnVzYWRkciwgc2tiX2ZyYWdfc2l6ZShmcmFnKSk7Ci0JCXF1ZXVlX2hlYWRfaW5jKHR4cSk7Ci0JCWNvcGllZCArPSBza2JfZnJhZ19zaXplKGZyYWcpOwotCX0KLQogCUJVR19PTih0eG8tPnNlbnRfc2tiX2xpc3RbaGVhZF0pOwogCXR4by0+c2VudF9za2JfbGlzdFtoZWFkXSA9IHNrYjsKIAl0eG8tPmxhc3RfcmVxX2hkciA9IGhlYWQ7Ci0JYXRvbWljX2FkZCh3cmJfY250LCAmdHhxLT51c2VkKTsKLQl0eG8tPmxhc3RfcmVxX3dyYl9jbnQgPSB3cmJfY250OwotCXR4by0+cGVuZF93cmJfY250ICs9IHdyYl9jbnQ7CisJYXRvbWljX2FkZChudW1fZnJhZ3MsICZ0eHEtPnVzZWQpOworCXR4by0+bGFzdF9yZXFfd3JiX2NudCA9IG51bV9mcmFnczsKKwl0eG8tPnBlbmRfd3JiX2NudCArPSBudW1fZnJhZ3M7Cit9CiAKLQliZV90eF9zdGF0c191cGRhdGUodHhvLCBza2IpOwotCXJldHVybiB3cmJfY250OworLyogU2V0dXAgYSBXUkIgZnJhZ21lbnQgKGJ1ZmZlciBkZXNjcmlwdG9yKSBmb3IgeG1pdCAqLworc3RhdGljIHZvaWQgYmVfdHhfc2V0dXBfd3JiX2ZyYWcoc3RydWN0IGJlX3R4X29iaiAqdHhvLCBkbWFfYWRkcl90IGJ1c2FkZHIsCisJCQkJIGludCBsZW4pCit7CisJc3RydWN0IGJlX2V0aF93cmIgKndyYjsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqdHhxID0gJnR4by0+cTsKIAotZG1hX2VycjoKLQkvKiBCcmluZyB0aGUgcXVldWUgYmFjayB0byB0aGUgc3RhdGUgaXQgd2FzIGluIGJlZm9yZSB0aGlzCi0JICogcm91dGluZSB3YXMgaW52b2tlZC4KLQkgKi8KKwl3cmIgPSBxdWV1ZV9oZWFkX25vZGUodHhxKTsKKwl3cmJfZmlsbCh3cmIsIGJ1c2FkZHIsIGxlbik7CisJcXVldWVfaGVhZF9pbmModHhxKTsKK30KKworLyogQnJpbmcgdGhlIHF1ZXVlIGJhY2sgdG8gdGhlIHN0YXRlIGl0IHdhcyBpbiBiZWZvcmUgYmVfeG1pdF9lbnF1ZXVlKCkgcm91dGluZQorICogd2FzIGludm9rZWQuIFRoZSBwcm9kdWNlciBpbmRleCBpcyByZXN0b3JlZCB0byB0aGUgcHJldmlvdXMgcGFja2V0IGFuZCB0aGUKKyAqIFdSQnMgb2YgdGhlIGN1cnJlbnQgcGFja2V0IGFyZSB1bm1hcHBlZC4gSW52b2tlZCB0byBoYW5kbGUgdHggc2V0dXAgZXJyb3JzLgorICovCitzdGF0aWMgdm9pZCBiZV94bWl0X3Jlc3RvcmUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgc3RydWN0IGJlX3R4X29iaiAqdHhvLCB1MTYgaGVhZCwgYm9vbCBtYXBfc2luZ2xlLAorCQkJICAgIHUzMiBjb3BpZWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBiZV9ldGhfd3JiICp3cmI7CisJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4cSA9ICZ0eG8tPnE7CisKKwlkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwogCXR4cS0+aGVhZCA9IGhlYWQ7CisKIAkvKiBza2lwIHRoZSBmaXJzdCB3cmIgKGhkcik7IGl0J3Mgbm90IG1hcHBlZCAqLwogCXF1ZXVlX2hlYWRfaW5jKHR4cSk7CiAJd2hpbGUgKGNvcGllZCkgewpAQCAtODU1LDEwICs4OTMsNjAgQEAKIAkJdW5tYXBfdHhfZnJhZyhkZXYsIHdyYiwgbWFwX3NpbmdsZSk7CiAJCW1hcF9zaW5nbGUgPSBmYWxzZTsKIAkJY29waWVkIC09IGxlMzJfdG9fY3B1KHdyYi0+ZnJhZ19sZW4pOwotCQlhZGFwdGVyLT5kcnZfc3RhdHMuZG1hX21hcF9lcnJvcnMrKzsKIAkJcXVldWVfaGVhZF9pbmModHhxKTsKIAl9CisKIAl0eHEtPmhlYWQgPSBoZWFkOworfQorCisvKiBFbnF1ZXVlIHRoZSBnaXZlbiBwYWNrZXQgZm9yIHRyYW5zbWl0LiBUaGlzIHJvdXRpbmUgYWxsb2NhdGVzIFdSQnMgZm9yIHRoZQorICogcGFja2V0LCBkbWEgbWFwcyB0aGUgcGFja2V0IGJ1ZmZlcnMgYW5kIHNldHMgdXAgdGhlIFdSQnMuIFJldHVybnMgdGhlIG51bWJlcgorICogb2YgV1JCcyB1c2VkIHVwIGJ5IHRoZSBwYWNrZXQuCisgKi8KK3N0YXRpYyB1MzIgYmVfeG1pdF9lbnF1ZXVlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgYmVfdHhfb2JqICp0eG8sCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgc3RydWN0IGJlX3dyYl9wYXJhbXMgKndyYl9wYXJhbXMpCit7CisJdTMyIGksIGNvcGllZCA9IDAsIHdyYl9jbnQgPSBza2Jfd3JiX2NudChza2IpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7CisJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4cSA9ICZ0eG8tPnE7CisJYm9vbCBtYXBfc2luZ2xlID0gZmFsc2U7CisJdTE2IGhlYWQgPSB0eHEtPmhlYWQ7CisJZG1hX2FkZHJfdCBidXNhZGRyOworCWludCBsZW47CisKKwloZWFkID0gYmVfdHhfZ2V0X3dyYl9oZHIodHhvKTsKKworCWlmIChza2ItPmxlbiA+IHNrYi0+ZGF0YV9sZW4pIHsKKwkJbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKworCQlidXNhZGRyID0gZG1hX21hcF9zaW5nbGUoZGV2LCBza2ItPmRhdGEsIGxlbiwgRE1BX1RPX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcihkZXYsIGJ1c2FkZHIpKQorCQkJZ290byBkbWFfZXJyOworCQltYXBfc2luZ2xlID0gdHJ1ZTsKKwkJYmVfdHhfc2V0dXBfd3JiX2ZyYWcodHhvLCBidXNhZGRyLCBsZW4pOworCQljb3BpZWQgKz0gbGVuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHNrYl9mcmFnX3N0cnVjdCAqZnJhZyA9ICZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2ldOworCQlsZW4gPSBza2JfZnJhZ19zaXplKGZyYWcpOworCisJCWJ1c2FkZHIgPSBza2JfZnJhZ19kbWFfbWFwKGRldiwgZnJhZywgMCwgbGVuLCBETUFfVE9fREVWSUNFKTsKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgYnVzYWRkcikpCisJCQlnb3RvIGRtYV9lcnI7CisJCWJlX3R4X3NldHVwX3dyYl9mcmFnKHR4bywgYnVzYWRkciwgbGVuKTsKKwkJY29waWVkICs9IGxlbjsKKwl9CisKKwliZV90eF9zZXR1cF93cmJfaGRyKGFkYXB0ZXIsIHR4bywgd3JiX3BhcmFtcywgc2tiLCBoZWFkKTsKKworCWJlX3R4X3N0YXRzX3VwZGF0ZSh0eG8sIHNrYik7CisJcmV0dXJuIHdyYl9jbnQ7CisKK2RtYV9lcnI6CisJYWRhcHRlci0+ZHJ2X3N0YXRzLmRtYV9tYXBfZXJyb3JzKys7CisJYmVfeG1pdF9yZXN0b3JlKGFkYXB0ZXIsIHR4bywgaGVhZCwgbWFwX3NpbmdsZSwgY29waWVkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODY5LDcgKzk1Nyw4IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqYmVfaW5zZXJ0X3ZsYW5faW5fcGt0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAogCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgICAgYm9vbCAqc2tpcF9od192bGFuKQorCQkJCQkgICAgIHN0cnVjdCBiZV93cmJfcGFyYW1zCisJCQkJCSAgICAgKndyYl9wYXJhbXMpCiB7CiAJdTE2IHZsYW5fdGFnID0gMDsKIApAQCAtODg2LDggKzk3NSw3IEBACiAJCS8qIGYvdyB3b3JrYXJvdW5kIHRvIHNldCBza2lwX2h3X3ZsYW4gPSAxLCBpbmZvcm1zIHRoZSBGL1cgdG8KIAkJICogc2tpcCBWTEFOIGluc2VydGlvbgogCQkgKi8KLQkJaWYgKHNraXBfaHdfdmxhbikKLQkJCSpza2lwX2h3X3ZsYW4gPSB0cnVlOworCQlCRV9XUkJfRl9TRVQod3JiX3BhcmFtcy0+ZmVhdHVyZXMsIFZMQU5fU0tJUF9IVywgMSk7CiAJfQogCiAJaWYgKHZsYW5fdGFnKSB7CkBAIC05MDUsOCArOTkzLDcgQEAKIAkJCQkJCXZsYW5fdGFnKTsKIAkJaWYgKHVubGlrZWx5KCFza2IpKQogCQkJcmV0dXJuIHNrYjsKLQkJaWYgKHNraXBfaHdfdmxhbikKLQkJCSpza2lwX2h3X3ZsYW4gPSB0cnVlOworCQlCRV9XUkJfRl9TRVQod3JiX3BhcmFtcy0+ZmVhdHVyZXMsIFZMQU5fU0tJUF9IVywgMSk7CiAJfQogCiAJcmV0dXJuIHNrYjsKQEAgLTk0Niw3ICsxMDMzLDggQEAKIAogc3RhdGljIHN0cnVjdCBza19idWZmICpiZV9sYW5jZXJfeG1pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKIAkJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCSAgYm9vbCAqc2tpcF9od192bGFuKQorCQkJCQkJICBzdHJ1Y3QgYmVfd3JiX3BhcmFtcworCQkJCQkJICAqd3JiX3BhcmFtcykKIHsKIAlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZlaCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKilza2ItPmRhdGE7CiAJdW5zaWduZWQgaW50IGV0aF9oZHJfbGVuOwpAQCAtOTcwLDcgKzEwNTgsNyBAQAogCSAqLwogCWlmIChiZV9wdmlkX3RhZ2dpbmdfZW5hYmxlZChhZGFwdGVyKSAmJgogCSAgICB2ZWgtPmhfdmxhbl9wcm90byA9PSBodG9ucyhFVEhfUF84MDIxUSkpCi0JCSpza2lwX2h3X3ZsYW4gPSB0cnVlOworCQlCRV9XUkJfRl9TRVQod3JiX3BhcmFtcy0+ZmVhdHVyZXMsIFZMQU5fU0tJUF9IVywgMSk7CiAKIAkvKiBIVyBoYXMgYSBidWcgd2hlcmVpbiBpdCB3aWxsIGNhbGN1bGF0ZSBDU1VNIGZvciBWTEFOCiAJICogcGt0cyBldmVuIHRob3VnaCBpdCBpcyBkaXNhYmxlZC4KQEAgLTk3OCw3ICsxMDY2LDcgQEAKIAkgKi8KIAlpZiAoc2tiLT5pcF9zdW1tZWQgIT0gQ0hFQ0tTVU1fUEFSVElBTCAmJgogCSAgICBza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSB7Ci0JCXNrYiA9IGJlX2luc2VydF92bGFuX2luX3BrdChhZGFwdGVyLCBza2IsIHNraXBfaHdfdmxhbik7CisJCXNrYiA9IGJlX2luc2VydF92bGFuX2luX3BrdChhZGFwdGVyLCBza2IsIHdyYl9wYXJhbXMpOwogCQlpZiAodW5saWtlbHkoIXNrYikpCiAJCQlnb3RvIGVycjsKIAl9CkBAIC0xMDAwLDcgKzEwODgsNyBAQAogCSAqLwogCWlmIChiZV9pcHY2X3R4X3N0YWxsX2NoayhhZGFwdGVyLCBza2IpICYmCiAJICAgIGJlX3ZsYW5fdGFnX3R4X2NoayhhZGFwdGVyLCBza2IpKSB7Ci0JCXNrYiA9IGJlX2luc2VydF92bGFuX2luX3BrdChhZGFwdGVyLCBza2IsIHNraXBfaHdfdmxhbik7CisJCXNrYiA9IGJlX2luc2VydF92bGFuX2luX3BrdChhZGFwdGVyLCBza2IsIHdyYl9wYXJhbXMpOwogCQlpZiAodW5saWtlbHkoIXNrYikpCiAJCQlnb3RvIGVycjsKIAl9CkBAIC0xMDE0LDcgKzExMDIsNyBAQAogCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmJlX3htaXRfd29ya2Fyb3VuZHMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCiAJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgIGJvb2wgKnNraXBfaHdfdmxhbikKKwkJCQkJICAgc3RydWN0IGJlX3dyYl9wYXJhbXMgKndyYl9wYXJhbXMpCiB7CiAJLyogTGFuY2VyLCBTSC1SIEFTSUNzIGhhdmUgYSBidWcgd2hlcmVpbiBQYWNrZXRzIHRoYXQgYXJlIDMyIGJ5dGVzIG9yCiAJICogbGVzcyBtYXkgY2F1c2UgYSB0cmFuc21pdCBzdGFsbCBvbiB0aGF0IHBvcnQuIFNvIHRoZSB3b3JrLWFyb3VuZCBpcwpAQCAtMTAyNiw3ICsxMTE0LDcgQEAKIAl9CiAKIAlpZiAoQkV4X2NoaXAoYWRhcHRlcikgfHwgbGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKLQkJc2tiID0gYmVfbGFuY2VyX3htaXRfd29ya2Fyb3VuZHMoYWRhcHRlciwgc2tiLCBza2lwX2h3X3ZsYW4pOworCQlza2IgPSBiZV9sYW5jZXJfeG1pdF93b3JrYXJvdW5kcyhhZGFwdGVyLCBza2IsIHdyYl9wYXJhbXMpOwogCQlpZiAoIXNrYikKIAkJCXJldHVybiBOVUxMOwogCX0KQEAgLTEwNjAsMjQgKzExNDgsMjYgQEAKIAogc3RhdGljIG5ldGRldl90eF90IGJlX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlib29sIHNraXBfaHdfdmxhbiA9IGZhbHNlLCBmbHVzaCA9ICFza2ItPnhtaXRfbW9yZTsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdTE2IHFfaWR4ID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CiAJc3RydWN0IGJlX3R4X29iaiAqdHhvID0gJmFkYXB0ZXItPnR4X29ialtxX2lkeF07Ci0Jc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4cSA9ICZ0eG8tPnE7CisJc3RydWN0IGJlX3dyYl9wYXJhbXMgd3JiX3BhcmFtcyA9IHsgMCB9OworCWJvb2wgZmx1c2ggPSAhc2tiLT54bWl0X21vcmU7CiAJdTE2IHdyYl9jbnQ7CiAKLQlza2IgPSBiZV94bWl0X3dvcmthcm91bmRzKGFkYXB0ZXIsIHNrYiwgJnNraXBfaHdfdmxhbik7CisJc2tiID0gYmVfeG1pdF93b3JrYXJvdW5kcyhhZGFwdGVyLCBza2IsICZ3cmJfcGFyYW1zKTsKIAlpZiAodW5saWtlbHkoIXNrYikpCiAJCWdvdG8gZHJvcDsKIAotCXdyYl9jbnQgPSBiZV94bWl0X2VucXVldWUoYWRhcHRlciwgdHhvLCBza2IsIHNraXBfaHdfdmxhbik7CisJYmVfZ2V0X3dyYl9wYXJhbXNfZnJvbV9za2IoYWRhcHRlciwgc2tiLCAmd3JiX3BhcmFtcyk7CisKKwl3cmJfY250ID0gYmVfeG1pdF9lbnF1ZXVlKGFkYXB0ZXIsIHR4bywgc2tiLCAmd3JiX3BhcmFtcyk7CiAJaWYgKHVubGlrZWx5KCF3cmJfY250KSkgewogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQlnb3RvIGRyb3A7CiAJfQogCi0JaWYgKChhdG9taWNfcmVhZCgmdHhxLT51c2VkKSArIEJFX01BWF9UWF9GUkFHX0NPVU5UKSA+PSB0eHEtPmxlbikgeworCWlmIChiZV9pc190eHFfZnVsbCh0eG8pKSB7CiAJCW5ldGlmX3N0b3Bfc3VicXVldWUobmV0ZGV2LCBxX2lkeCk7CiAJCXR4X3N0YXRzKHR4byktPnR4X3N0b3BzKys7CiAJfQpAQCAtMTE3MSw3ICsxMjYxLDcgQEAKIAlmb3JfZWFjaF9zZXRfYml0KGksIGFkYXB0ZXItPnZpZHMsIFZMQU5fTl9WSUQpCiAJCXZpZHNbbnVtKytdID0gY3B1X3RvX2xlMTYoaSk7CiAKLQlzdGF0dXMgPSBiZV9jbWRfdmxhbl9jb25maWcoYWRhcHRlciwgYWRhcHRlci0+aWZfaGFuZGxlLCB2aWRzLCBudW0pOworCXN0YXR1cyA9IGJlX2NtZF92bGFuX2NvbmZpZyhhZGFwdGVyLCBhZGFwdGVyLT5pZl9oYW5kbGUsIHZpZHMsIG51bSwgMCk7CiAJaWYgKHN0YXR1cykgewogCQlkZXZfZXJyKGRldiwgIlNldHRpbmcgSFcgVkxBTiBmaWx0ZXJpbmcgZmFpbGVkXG4iKTsKIAkJLyogU2V0IHRvIFZMQU4gcHJvbWlzYyBtb2RlIGFzIHNldHRpbmcgVkxBTiBmaWx0ZXIgZmFpbGVkICovCkBAIC0xMzgwLDExICsxNDcwLDY3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYmVfc2V0X3ZmX3R2dChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgaW50IHZmLCB1MTYgdmxhbikKK3sKKwlzdHJ1Y3QgYmVfdmZfY2ZnICp2Zl9jZmcgPSAmYWRhcHRlci0+dmZfY2ZnW3ZmXTsKKwl1MTYgdmlkc1tCRV9OVU1fVkxBTlNfU1VQUE9SVEVEXTsKKwlpbnQgdmZfaWZfaWQgPSB2Zl9jZmctPmlmX2hhbmRsZTsKKwlpbnQgc3RhdHVzOworCisJLyogRW5hYmxlIFRyYW5zcGFyZW50IFZMQU4gVGFnZ2luZyAqLworCXN0YXR1cyA9IGJlX2NtZF9zZXRfaHN3X2NvbmZpZyhhZGFwdGVyLCB2bGFuLCB2ZiArIDEsIHZmX2lmX2lkLCAwKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogQ2xlYXIgcHJlLXByb2dyYW1tZWQgVkxBTiBmaWx0ZXJzIG9uIFZGIGlmIGFueSwgaWYgVFZUIGlzIGVuYWJsZWQgKi8KKwl2aWRzWzBdID0gMDsKKwlzdGF0dXMgPSBiZV9jbWRfdmxhbl9jb25maWcoYWRhcHRlciwgdmZfaWZfaWQsIHZpZHMsIDEsIHZmICsgMSk7CisJaWYgKCFzdGF0dXMpCisJCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkgIkNsZWFyZWQgZ3Vlc3QgVkxBTnMgb24gVkYlZCIsIHZmKTsKKworCS8qIEFmdGVyIFRWVCBpcyBlbmFibGVkLCBkaXNhbGxvdyBWRnMgdG8gcHJvZ3JhbSBWTEFOIGZpbHRlcnMgKi8KKwlpZiAodmZfY2ZnLT5wcml2aWxlZ2VzICYgQkVfUFJJVl9GSUxUTUdNVCkgeworCQlzdGF0dXMgPSBiZV9jbWRfc2V0X2ZuX3ByaXZpbGVnZXMoYWRhcHRlciwgdmZfY2ZnLT5wcml2aWxlZ2VzICYKKwkJCQkJCSAgfkJFX1BSSVZfRklMVE1HTVQsIHZmICsgMSk7CisJCWlmICghc3RhdHVzKQorCQkJdmZfY2ZnLT5wcml2aWxlZ2VzICY9IH5CRV9QUklWX0ZJTFRNR01UOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiZV9jbGVhcl92Zl90dnQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCB2ZikKK3sKKwlzdHJ1Y3QgYmVfdmZfY2ZnICp2Zl9jZmcgPSAmYWRhcHRlci0+dmZfY2ZnW3ZmXTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OworCWludCBzdGF0dXM7CisKKwkvKiBSZXNldCBUcmFuc3BhcmVudCBWTEFOIFRhZ2dpbmcuICovCisJc3RhdHVzID0gYmVfY21kX3NldF9oc3dfY29uZmlnKGFkYXB0ZXIsIEJFX1JFU0VUX1ZMQU5fVEFHX0lELCB2ZiArIDEsCisJCQkJICAgICAgIHZmX2NmZy0+aWZfaGFuZGxlLCAwKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogQWxsb3cgVkZzIHRvIHByb2dyYW0gVkxBTiBmaWx0ZXJpbmcgKi8KKwlpZiAoISh2Zl9jZmctPnByaXZpbGVnZXMgJiBCRV9QUklWX0ZJTFRNR01UKSkgeworCQlzdGF0dXMgPSBiZV9jbWRfc2V0X2ZuX3ByaXZpbGVnZXMoYWRhcHRlciwgdmZfY2ZnLT5wcml2aWxlZ2VzIHwKKwkJCQkJCSAgQkVfUFJJVl9GSUxUTUdNVCwgdmYgKyAxKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCXZmX2NmZy0+cHJpdmlsZWdlcyB8PSBCRV9QUklWX0ZJTFRNR01UOworCQkJZGV2X2luZm8oZGV2LCAiVkYlZDogRklMVE1HTVQgcHJpdiBlbmFibGVkIiwgdmYpOworCQl9CisJfQorCisJZGV2X2luZm8oZGV2LAorCQkgIkRpc2FibGUvcmUtZW5hYmxlIGkvZiBpbiBWTSB0byBjbGVhciBUcmFuc3BhcmVudCBWTEFOIHRhZyIpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGJlX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgdTE2IHZsYW4sIHU4IHFvcykKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGJlX3ZmX2NmZyAqdmZfY2ZnID0gJmFkYXB0ZXItPnZmX2NmZ1t2Zl07Ci0JaW50IHN0YXR1cyA9IDA7CisJaW50IHN0YXR1czsKIAogCWlmICghc3Jpb3ZfZW5hYmxlZChhZGFwdGVyKSkKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTEzOTQsMjQgKzE1NDAsMTkgQEAKIAogCWlmICh2bGFuIHx8IHFvcykgewogCQl2bGFuIHw9IHFvcyA8PCBWTEFOX1BSSU9fU0hJRlQ7Ci0JCWlmICh2Zl9jZmctPnZsYW5fdGFnICE9IHZsYW4pCi0JCQlzdGF0dXMgPSBiZV9jbWRfc2V0X2hzd19jb25maWcoYWRhcHRlciwgdmxhbiwgdmYgKyAxLAotCQkJCQkJICAgICAgIHZmX2NmZy0+aWZfaGFuZGxlLCAwKTsKKwkJc3RhdHVzID0gYmVfc2V0X3ZmX3R2dChhZGFwdGVyLCB2Ziwgdmxhbik7CiAJfSBlbHNlIHsKLQkJLyogUmVzZXQgVHJhbnNwYXJlbnQgVmxhbiBUYWdnaW5nLiAqLwotCQlzdGF0dXMgPSBiZV9jbWRfc2V0X2hzd19jb25maWcoYWRhcHRlciwgQkVfUkVTRVRfVkxBTl9UQUdfSUQsCi0JCQkJCSAgICAgICB2ZiArIDEsIHZmX2NmZy0+aWZfaGFuZGxlLCAwKTsKKwkJc3RhdHVzID0gYmVfY2xlYXJfdmZfdHZ0KGFkYXB0ZXIsIHZmKTsKIAl9CiAKIAlpZiAoc3RhdHVzKSB7CiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCSJWTEFOICVkIGNvbmZpZyBvbiBWRiAlZCBmYWlsZWQgOiAlI3hcbiIsIHZsYW4sCi0JCQl2Ziwgc3RhdHVzKTsKKwkJCSJWTEFOICVkIGNvbmZpZyBvbiBWRiAlZCBmYWlsZWQgOiAlI3hcbiIsIHZsYW4sIHZmLAorCQkJc3RhdHVzKTsKIAkJcmV0dXJuIGJlX2NtZF9zdGF0dXMoc3RhdHVzKTsKIAl9CiAKIAl2Zl9jZmctPnZsYW5fdGFnID0gdmxhbjsKLQogCXJldHVybiAwOwogfQogCkBAIC0xOTgxLDcgKzIxMjIsNyBAQAogCQlpZiAocnhvLT5yeF9wb3N0X3N0YXJ2ZWQpCiAJCQlyeG8tPnJ4X3Bvc3Rfc3RhcnZlZCA9IGZhbHNlOwogCQlkbyB7Ci0JCQlub3RpZnkgPSBtaW4oMjU2dSwgcG9zdGVkKTsKKwkJCW5vdGlmeSA9IG1pbihNQVhfTlVNX1BPU1RfRVJYX0RCLCBwb3N0ZWQpOwogCQkJYmVfcnhxX25vdGlmeShhZGFwdGVyLCByeHEtPmlkLCBub3RpZnkpOwogCQkJcG9zdGVkIC09IG5vdGlmeTsKIAkJfSB3aGlsZSAocG9zdGVkKTsKQEAgLTE5OTEsMTggKzIxMzIsMjMgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYmVfZXRoX3R4X2NvbXBsICpiZV90eF9jb21wbF9nZXQoc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4X2NxKQorc3RhdGljIHN0cnVjdCBiZV90eF9jb21wbF9pbmZvICpiZV90eF9jb21wbF9nZXQoc3RydWN0IGJlX3R4X29iaiAqdHhvKQogewotCXN0cnVjdCBiZV9ldGhfdHhfY29tcGwgKnR4Y3AgPSBxdWV1ZV90YWlsX25vZGUodHhfY3EpOworCXN0cnVjdCBiZV9xdWV1ZV9pbmZvICp0eF9jcSA9ICZ0eG8tPmNxOworCXN0cnVjdCBiZV90eF9jb21wbF9pbmZvICp0eGNwID0gJnR4by0+dHhjcDsKKwlzdHJ1Y3QgYmVfZXRoX3R4X2NvbXBsICpjb21wbCA9IHF1ZXVlX3RhaWxfbm9kZSh0eF9jcSk7CiAKLQlpZiAodHhjcC0+ZHdbb2Zmc2V0b2Yoc3RydWN0IGFtYXBfZXRoX3R4X2NvbXBsLCB2YWxpZCkgLyAzMl0gPT0gMCkKKwlpZiAoY29tcGwtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2V0aF90eF9jb21wbCwgdmFsaWQpIC8gMzJdID09IDApCiAJCXJldHVybiBOVUxMOwogCisJLyogRW5zdXJlIGxvYWQgb3JkZXJpbmcgb2YgdmFsaWQgYml0IGR3b3JkIGFuZCBvdGhlciBkd29yZHMgYmVsb3cgKi8KIAlybWIoKTsKLQliZV9kd3NfbGVfdG9fY3B1KHR4Y3AsIHNpemVvZigqdHhjcCkpOworCWJlX2R3c19sZV90b19jcHUoY29tcGwsIHNpemVvZigqY29tcGwpKTsKIAotCXR4Y3AtPmR3W29mZnNldG9mKHN0cnVjdCBhbWFwX2V0aF90eF9jb21wbCwgdmFsaWQpIC8gMzJdID0gMDsKKwl0eGNwLT5zdGF0dXMgPSBHRVRfVFhfQ09NUExfQklUUyhzdGF0dXMsIGNvbXBsKTsKKwl0eGNwLT5lbmRfaW5kZXggPSBHRVRfVFhfQ09NUExfQklUUyh3cmJfaW5kZXgsIGNvbXBsKTsKIAorCWNvbXBsLT5kd1tvZmZzZXRvZihzdHJ1Y3QgYW1hcF9ldGhfdHhfY29tcGwsIHZhbGlkKSAvIDMyXSA9IDA7CiAJcXVldWVfdGFpbF9pbmModHhfY3EpOwogCXJldHVybiB0eGNwOwogfQpAQCAtMjEyMyw5ICsyMjY5LDkgQEAKIHsKIAl1MTYgZW5kX2lkeCwgbm90aWZpZWRfaWR4LCBjbXBsID0gMCwgdGltZW8gPSAwLCBudW1fd3JicyA9IDA7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKLQlzdHJ1Y3QgYmVfdHhfb2JqICp0eG87CisJc3RydWN0IGJlX3R4X2NvbXBsX2luZm8gKnR4Y3A7CiAJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnR4cTsKLQlzdHJ1Y3QgYmVfZXRoX3R4X2NvbXBsICp0eGNwOworCXN0cnVjdCBiZV90eF9vYmogKnR4bzsKIAlpbnQgaSwgcGVuZGluZ190eHFzOwogCiAJLyogU3RvcCBwb2xsaW5nIGZvciBjb21wbHMgd2hlbiBIVyBoYXMgYmVlbiBzaWxlbnQgZm9yIDEwbXMgKi8KQEAgLTIxMzYsMTAgKzIyODIsMTAgQEAKIAkJCWNtcGwgPSAwOwogCQkJbnVtX3dyYnMgPSAwOwogCQkJdHhxID0gJnR4by0+cTsKLQkJCXdoaWxlICgodHhjcCA9IGJlX3R4X2NvbXBsX2dldCgmdHhvLT5jcSkpKSB7Ci0JCQkJZW5kX2lkeCA9IEdFVF9UWF9DT01QTF9CSVRTKHdyYl9pbmRleCwgdHhjcCk7Ci0JCQkJbnVtX3dyYnMgKz0gYmVfdHhfY29tcGxfcHJvY2VzcyhhZGFwdGVyLCB0eG8sCi0JCQkJCQkJCWVuZF9pZHgpOworCQkJd2hpbGUgKCh0eGNwID0gYmVfdHhfY29tcGxfZ2V0KHR4bykpKSB7CisJCQkJbnVtX3dyYnMgKz0KKwkJCQkJYmVfdHhfY29tcGxfcHJvY2VzcyhhZGFwdGVyLCB0eG8sCisJCQkJCQkJICAgIHR4Y3AtPmVuZF9pbmRleCk7CiAJCQkJY21wbCsrOwogCQkJfQogCQkJaWYgKGNtcGwpIHsKQEAgLTIxNDcsNyArMjI5Myw3IEBACiAJCQkJYXRvbWljX3N1YihudW1fd3JicywgJnR4cS0+dXNlZCk7CiAJCQkJdGltZW8gPSAwOwogCQkJfQotCQkJaWYgKGF0b21pY19yZWFkKCZ0eHEtPnVzZWQpID09IHR4by0+cGVuZF93cmJfY250KQorCQkJaWYgKCFiZV9pc190eF9jb21wbF9wZW5kaW5nKHR4bykpCiAJCQkJcGVuZGluZ190eHFzLS07CiAJCX0KIApAQCAtMjE5Niw2ICsyMzQyLDcgQEAKIAkJCW5hcGlfaGFzaF9kZWwoJmVxby0+bmFwaSk7CiAJCQluZXRpZl9uYXBpX2RlbCgmZXFvLT5uYXBpKTsKIAkJfQorCQlmcmVlX2NwdW1hc2tfdmFyKGVxby0+YWZmaW5pdHlfbWFzayk7CiAJCWJlX3F1ZXVlX2ZyZWUoYWRhcHRlciwgJmVxby0+cSk7CiAJfQogfQpAQCAtMjIxMSw2ICsyMzU4LDExIEBACiAJCQkJICAgIGFkYXB0ZXItPmNmZ19udW1fcXMpOwogCiAJZm9yX2FsbF9ldnRfcXVldWVzKGFkYXB0ZXIsIGVxbywgaSkgeworCQlpZiAoIXphbGxvY19jcHVtYXNrX3ZhcigmZXFvLT5hZmZpbml0eV9tYXNrLCBHRlBfS0VSTkVMKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQljcHVtYXNrX3NldF9jcHVfbG9jYWxfZmlyc3QoaSwgZGV2X3RvX25vZGUoJmFkYXB0ZXItPnBkZXYtPmRldiksCisJCQkJCSAgICBlcW8tPmFmZmluaXR5X21hc2spOworCiAJCW5ldGlmX25hcGlfYWRkKGFkYXB0ZXItPm5ldGRldiwgJmVxby0+bmFwaSwgYmVfcG9sbCwKIAkJCSAgICAgICBCRV9OQVBJX1dFSUdIVCk7CiAJCW5hcGlfaGFzaF9hZGQoJmVxby0+bmFwaSk7CkBAIC0yMzAyLDggKzI0NTQsOSBAQAogCiBzdGF0aWMgaW50IGJlX3R4X3FzX2NyZWF0ZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3EsICplcTsKKwlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqY3E7CiAJc3RydWN0IGJlX3R4X29iaiAqdHhvOworCXN0cnVjdCBiZV9lcV9vYmogKmVxbzsKIAlpbnQgc3RhdHVzLCBpOwogCiAJYWRhcHRlci0+bnVtX3R4X3FzID0gbWluKGFkYXB0ZXItPm51bV9ldnRfcXMsIGJlX21heF90eHFzKGFkYXB0ZXIpKTsKQEAgLTIzMjEsOCArMjQ3NCw4IEBACiAJCS8qIElmIG51bV9ldnRfcXMgaXMgbGVzcyB0aGFuIG51bV90eF9xcywgdGhlbiBtb3JlIHRoYW4KIAkJICogb25lIHR4cSBzaGFyZSBhbiBlcQogCQkgKi8KLQkJZXEgPSAmYWRhcHRlci0+ZXFfb2JqW2kgJSBhZGFwdGVyLT5udW1fZXZ0X3FzXS5xOwotCQlzdGF0dXMgPSBiZV9jbWRfY3FfY3JlYXRlKGFkYXB0ZXIsIGNxLCBlcSwgZmFsc2UsIDMpOworCQllcW8gPSAmYWRhcHRlci0+ZXFfb2JqW2kgJSBhZGFwdGVyLT5udW1fZXZ0X3FzXTsKKwkJc3RhdHVzID0gYmVfY21kX2NxX2NyZWF0ZShhZGFwdGVyLCBjcSwgJmVxby0+cSwgZmFsc2UsIDMpOwogCQlpZiAoc3RhdHVzKQogCQkJcmV0dXJuIHN0YXR1czsKIApAQCAtMjMzNCw2ICsyNDg3LDkgQEAKIAkJc3RhdHVzID0gYmVfY21kX3R4cV9jcmVhdGUoYWRhcHRlciwgdHhvKTsKIAkJaWYgKHN0YXR1cykKIAkJCXJldHVybiBzdGF0dXM7CisKKwkJbmV0aWZfc2V0X3hwc19xdWV1ZShhZGFwdGVyLT5uZXRkZXYsIGVxby0+YWZmaW5pdHlfbWFzaywKKwkJCQkgICAgZXFvLT5pZHgpOwogCX0KIAogCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJjcmVhdGVkICVkIFRYIHF1ZXVlKHMpXG4iLApAQCAtMjM2MiwxMyArMjUxOCwxOSBAQAogCWludCByYywgaTsKIAogCS8qIFdlIGNhbiBjcmVhdGUgYXMgbWFueSBSU1MgcmluZ3MgYXMgdGhlcmUgYXJlIEVRcy4gKi8KLQlhZGFwdGVyLT5udW1fcnhfcXMgPSBhZGFwdGVyLT5udW1fZXZ0X3FzOworCWFkYXB0ZXItPm51bV9yc3NfcXMgPSBhZGFwdGVyLT5udW1fZXZ0X3FzOwogCi0JLyogV2UnbGwgdXNlIFJTUyBvbmx5IGlmIGF0bGVhc3QgMiBSU1MgcmluZ3MgYXJlIHN1cHBvcnRlZC4KLQkgKiBXaGVuIFJTUyBpcyB1c2VkLCB3ZSdsbCBuZWVkIGEgZGVmYXVsdCBSWFEgZm9yIG5vbi1JUCB0cmFmZmljLgorCS8qIFdlJ2xsIHVzZSBSU1Mgb25seSBpZiBhdGxlYXN0IDIgUlNTIHJpbmdzIGFyZSBzdXBwb3J0ZWQuICovCisJaWYgKGFkYXB0ZXItPm51bV9yc3NfcXMgPD0gMSkKKwkJYWRhcHRlci0+bnVtX3Jzc19xcyA9IDA7CisKKwlhZGFwdGVyLT5udW1fcnhfcXMgPSBhZGFwdGVyLT5udW1fcnNzX3FzICsgYWRhcHRlci0+bmVlZF9kZWZfcnhxOworCisJLyogV2hlbiB0aGUgaW50ZXJmYWNlIGlzIG5vdCBjYXBhYmxlIG9mIFJTUyByaW5ncyAoYW5kIHRoZXJlIGlzIG5vCisJICogbmVlZCB0byBjcmVhdGUgYSBkZWZhdWx0IFJYUSkgd2UnbGwgc3RpbGwgbmVlZCBvbmUgUlhRCiAJICovCi0JaWYgKGFkYXB0ZXItPm51bV9yeF9xcyA+IDEpCi0JCWFkYXB0ZXItPm51bV9yeF9xcysrOworCWlmIChhZGFwdGVyLT5udW1fcnhfcXMgPT0gMCkKKwkJYWRhcHRlci0+bnVtX3J4X3FzID0gMTsKIAogCWFkYXB0ZXItPmJpZ19wYWdlX3NpemUgPSAoMSA8PCBnZXRfb3JkZXIocnhfZnJhZ19zaXplKSkgKiBQQUdFX1NJWkU7CiAJZm9yX2FsbF9yeF9xdWV1ZXMoYWRhcHRlciwgcnhvLCBpKSB7CkBAIC0yMzg3LDggKzI1NDksNyBAQAogCX0KIAogCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCSAiY3JlYXRlZCAlZCBSU1MgcXVldWUocykgYW5kIDEgZGVmYXVsdCBSWCBxdWV1ZVxuIiwKLQkJIGFkYXB0ZXItPm51bV9yeF9xcyAtIDEpOworCQkgImNyZWF0ZWQgJWQgUlggcXVldWUocylcbiIsIGFkYXB0ZXItPm51bV9yeF9xcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI0OTgsNyArMjY1OSw3IEBACiAJcmV0dXJuIHdvcmtfZG9uZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGJlX3VwZGF0ZV90eF9lcnIoc3RydWN0IGJlX3R4X29iaiAqdHhvLCB1MzIgc3RhdHVzKQorc3RhdGljIGlubGluZSB2b2lkIGJlX3VwZGF0ZV90eF9lcnIoc3RydWN0IGJlX3R4X29iaiAqdHhvLCB1OCBzdGF0dXMpCiB7CiAJc3dpdGNoIChzdGF0dXMpIHsKIAljYXNlIEJFX1RYX0NPTVBfSERSX1BBUlNFX0VSUjoKQEAgLTI1MTMsNyArMjY3NCw3IEBACiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbGFuY2VyX3VwZGF0ZV90eF9lcnIoc3RydWN0IGJlX3R4X29iaiAqdHhvLCB1MzIgc3RhdHVzKQorc3RhdGljIGlubGluZSB2b2lkIGxhbmNlcl91cGRhdGVfdHhfZXJyKHN0cnVjdCBiZV90eF9vYmogKnR4bywgdTggc3RhdHVzKQogewogCXN3aXRjaCAoc3RhdHVzKSB7CiAJY2FzZSBMQU5DRVJfVFhfQ09NUF9MU09fRVJSOgpAQCAtMjUzOCwyMiArMjY5OSwxOCBAQAogc3RhdGljIHZvaWQgYmVfcHJvY2Vzc190eChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IGJlX3R4X29iaiAqdHhvLAogCQkJICBpbnQgaWR4KQogewotCXN0cnVjdCBiZV9ldGhfdHhfY29tcGwgKnR4Y3A7CiAJaW50IG51bV93cmJzID0gMCwgd29ya19kb25lID0gMDsKLQl1MzIgY29tcGxfc3RhdHVzOwotCXUxNiBsYXN0X2lkeDsKKwlzdHJ1Y3QgYmVfdHhfY29tcGxfaW5mbyAqdHhjcDsKIAotCXdoaWxlICgodHhjcCA9IGJlX3R4X2NvbXBsX2dldCgmdHhvLT5jcSkpKSB7Ci0JCWxhc3RfaWR4ID0gR0VUX1RYX0NPTVBMX0JJVFMod3JiX2luZGV4LCB0eGNwKTsKLQkJbnVtX3dyYnMgKz0gYmVfdHhfY29tcGxfcHJvY2VzcyhhZGFwdGVyLCB0eG8sIGxhc3RfaWR4KTsKKwl3aGlsZSAoKHR4Y3AgPSBiZV90eF9jb21wbF9nZXQodHhvKSkpIHsKKwkJbnVtX3dyYnMgKz0gYmVfdHhfY29tcGxfcHJvY2VzcyhhZGFwdGVyLCB0eG8sIHR4Y3AtPmVuZF9pbmRleCk7CiAJCXdvcmtfZG9uZSsrOwogCi0JCWNvbXBsX3N0YXR1cyA9IEdFVF9UWF9DT01QTF9CSVRTKHN0YXR1cywgdHhjcCk7Ci0JCWlmIChjb21wbF9zdGF0dXMpIHsKKwkJaWYgKHR4Y3AtPnN0YXR1cykgewogCQkJaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpKQotCQkJCWxhbmNlcl91cGRhdGVfdHhfZXJyKHR4bywgY29tcGxfc3RhdHVzKTsKKwkJCQlsYW5jZXJfdXBkYXRlX3R4X2Vycih0eG8sIHR4Y3AtPnN0YXR1cyk7CiAJCQllbHNlCi0JCQkJYmVfdXBkYXRlX3R4X2Vycih0eG8sIGNvbXBsX3N0YXR1cyk7CisJCQkJYmVfdXBkYXRlX3R4X2Vycih0eG8sIHR4Y3AtPnN0YXR1cyk7CiAJCX0KIAl9CiAKQEAgLTI1NjQsNyArMjcyMSw3IEBACiAJCS8qIEFzIFR4IHdyYnMgaGF2ZSBiZWVuIGZyZWVkIHVwLCB3YWtlIHVwIG5ldGRldiBxdWV1ZQogCQkgKiBpZiBpdCB3YXMgc3RvcHBlZCBkdWUgdG8gbGFjayBvZiB0eCB3cmJzLiAgKi8KIAkJaWYgKF9fbmV0aWZfc3VicXVldWVfc3RvcHBlZChhZGFwdGVyLT5uZXRkZXYsIGlkeCkgJiYKLQkJICAgIGF0b21pY19yZWFkKCZ0eG8tPnEudXNlZCkgPCB0eG8tPnEubGVuIC8gMikgeworCQkgICAgYmVfY2FuX3R4cV93YWtlKHR4bykpIHsKIAkJCW5ldGlmX3dha2Vfc3VicXVldWUoYWRhcHRlci0+bmV0ZGV2LCBpZHgpOwogCQl9CiAKQEAgLTI3NTYsMTIgKzI5MTMsMTIgQEAKIAkJCXNsaXBvcnRfZXJyMiA9IGlvcmVhZDMyKGFkYXB0ZXItPmRiICsKIAkJCQkJCVNMSVBPUlRfRVJST1IyX09GRlNFVCk7CiAJCQlhZGFwdGVyLT5od19lcnJvciA9IHRydWU7CisJCQllcnJvcl9kZXRlY3RlZCA9IHRydWU7CiAJCQkvKiBEbyBub3QgbG9nIGVycm9yIG1lc3NhZ2VzIGlmIGl0cyBhIEZXIHJlc2V0ICovCiAJCQlpZiAoc2xpcG9ydF9lcnIxID09IFNMSVBPUlRfRVJST1JfRldfUkVTRVQxICYmCiAJCQkgICAgc2xpcG9ydF9lcnIyID09IFNMSVBPUlRfRVJST1JfRldfUkVTRVQyKSB7CiAJCQkJZGV2X2luZm8oZGV2LCAiRmlybXdhcmUgdXBkYXRlIGluIHByb2dyZXNzXG4iKTsKIAkJCX0gZWxzZSB7Ci0JCQkJZXJyb3JfZGV0ZWN0ZWQgPSB0cnVlOwogCQkJCWRldl9lcnIoZGV2LCAiRXJyb3IgZGV0ZWN0ZWQgaW4gdGhlIGNhcmRcbiIpOwogCQkJCWRldl9lcnIoZGV2LCAiRVJSOiBzbGlwb3J0IHN0YXR1cyAweCV4XG4iLAogCQkJCQlzbGlwb3J0X3N0YXR1cyk7CkBAIC0yNzcyLDE0ICsyOTI5LDEyIEBACiAJCQl9CiAJCX0KIAl9IGVsc2UgewotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwKLQkJCQkgICAgICBQQ0lDRkdfVUVfU1RBVFVTX0xPVywgJnVlX2xvKTsKLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGFkYXB0ZXItPnBkZXYsCi0JCQkJICAgICAgUENJQ0ZHX1VFX1NUQVRVU19ISUdILCAmdWVfaGkpOwotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoYWRhcHRlci0+cGRldiwKLQkJCQkgICAgICBQQ0lDRkdfVUVfU1RBVFVTX0xPV19NQVNLLCAmdWVfbG9fbWFzayk7Ci0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LAotCQkJCSAgICAgIFBDSUNGR19VRV9TVEFUVVNfSElfTUFTSywgJnVlX2hpX21hc2spOworCQl1ZV9sbyA9IGlvcmVhZDMyKGFkYXB0ZXItPnBjaWNmZyArIFBDSUNGR19VRV9TVEFUVVNfTE9XKTsKKwkJdWVfaGkgPSBpb3JlYWQzMihhZGFwdGVyLT5wY2ljZmcgKyBQQ0lDRkdfVUVfU1RBVFVTX0hJR0gpOworCQl1ZV9sb19tYXNrID0gaW9yZWFkMzIoYWRhcHRlci0+cGNpY2ZnICsKKwkJCQkgICAgICBQQ0lDRkdfVUVfU1RBVFVTX0xPV19NQVNLKTsKKwkJdWVfaGlfbWFzayA9IGlvcmVhZDMyKGFkYXB0ZXItPnBjaWNmZyArCisJCQkJICAgICAgUENJQ0ZHX1VFX1NUQVRVU19ISV9NQVNLKTsKIAogCQl1ZV9sbyA9ICh1ZV9sbyAmIH51ZV9sb19tYXNrKTsKIAkJdWVfaGkgPSAodWVfaGkgJiB+dWVfaGlfbWFzayk7CkBAIC0yODgzLDYgKzMwMzgsOCBAQAogCQlzdGF0dXMgPSByZXF1ZXN0X2lycSh2ZWMsIGJlX21zaXgsIDAsIGVxby0+ZGVzYywgZXFvKTsKIAkJaWYgKHN0YXR1cykKIAkJCWdvdG8gZXJyX21zaXg7CisKKwkJaXJxX3NldF9hZmZpbml0eV9oaW50KHZlYywgZXFvLT5hZmZpbml0eV9tYXNrKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTI5MjcsNyArMzA4NCw3IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlzdHJ1Y3QgYmVfZXFfb2JqICplcW87Ci0JaW50IGk7CisJaW50IGksIHZlYzsKIAogCWlmICghYWRhcHRlci0+aXNyX3JlZ2lzdGVyZWQpCiAJCXJldHVybjsKQEAgLTI5MzksOCArMzA5NiwxMSBAQAogCX0KIAogCS8qIE1TSXggKi8KLQlmb3JfYWxsX2V2dF9xdWV1ZXMoYWRhcHRlciwgZXFvLCBpKQotCQlmcmVlX2lycShiZV9tc2l4X3ZlY19nZXQoYWRhcHRlciwgZXFvKSwgZXFvKTsKKwlmb3JfYWxsX2V2dF9xdWV1ZXMoYWRhcHRlciwgZXFvLCBpKSB7CisJCXZlYyA9IGJlX21zaXhfdmVjX2dldChhZGFwdGVyLCBlcW8pOworCQlpcnFfc2V0X2FmZmluaXR5X2hpbnQodmVjLCBOVUxMKTsKKwkJZnJlZV9pcnEodmVjLCBlcW8pOworCX0KIAogZG9uZToKIAlhZGFwdGVyLT5pc3JfcmVnaXN0ZXJlZCA9IGZhbHNlOwpAQCAtMzAyMiwxMiArMzE4MiwxNCBAQAogCQkJcmV0dXJuIHJjOwogCX0KIAotCS8qIFRoZSBGVyB3b3VsZCBsaWtlIHRoZSBkZWZhdWx0IFJYUSB0byBiZSBjcmVhdGVkIGZpcnN0ICovCi0JcnhvID0gZGVmYXVsdF9yeG8oYWRhcHRlcik7Ci0JcmMgPSBiZV9jbWRfcnhxX2NyZWF0ZShhZGFwdGVyLCAmcnhvLT5xLCByeG8tPmNxLmlkLCByeF9mcmFnX3NpemUsCi0JCQkgICAgICAgYWRhcHRlci0+aWZfaGFuZGxlLCBmYWxzZSwgJnJ4by0+cnNzX2lkKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKKwlpZiAoYWRhcHRlci0+bmVlZF9kZWZfcnhxIHx8ICFhZGFwdGVyLT5udW1fcnNzX3FzKSB7CisJCXJ4byA9IGRlZmF1bHRfcnhvKGFkYXB0ZXIpOworCQlyYyA9IGJlX2NtZF9yeHFfY3JlYXRlKGFkYXB0ZXIsICZyeG8tPnEsIHJ4by0+Y3EuaWQsCisJCQkJICAgICAgIHJ4X2ZyYWdfc2l6ZSwgYWRhcHRlci0+aWZfaGFuZGxlLAorCQkJCSAgICAgICBmYWxzZSwgJnJ4by0+cnNzX2lkKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOworCX0KIAogCWZvcl9hbGxfcnNzX3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpIHsKIAkJcmMgPSBiZV9jbWRfcnhxX2NyZWF0ZShhZGFwdGVyLCAmcnhvLT5xLCByeG8tPmNxLmlkLApAQCAtMzAzOCw4ICszMjAwLDcgQEAKIAl9CiAKIAlpZiAoYmVfbXVsdGlfcnhxKGFkYXB0ZXIpKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBSU1NfSU5ESVJfVEFCTEVfTEVOOwotCQkJaiArPSBhZGFwdGVyLT5udW1fcnhfcXMgLSAxKSB7CisJCWZvciAoaiA9IDA7IGogPCBSU1NfSU5ESVJfVEFCTEVfTEVOOyBqICs9IGFkYXB0ZXItPm51bV9yc3NfcXMpIHsKIAkJCWZvcl9hbGxfcnNzX3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpIHsKIAkJCQlpZiAoKGogKyBpKSA+PSBSU1NfSU5ESVJfVEFCTEVfTEVOKQogCQkJCQlicmVhazsKQEAgLTMxMzAsNyArMzI5MSw3IEBACiAJaW50IHN0YXR1cyA9IDA7CiAJdTggbWFjW0VUSF9BTEVOXTsKIAotCW1lbXNldChtYWMsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKG1hYyk7CiAKIAljbWQuc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfY21kX3JlcV9hY3BpX3dvbF9tYWdpY19jb25maWcpOwogCWNtZC52YSA9IGRtYV96YWxsb2NfY29oZXJlbnQoJmFkYXB0ZXItPnBkZXYtPmRldiwgY21kLnNpemUsICZjbWQuZG1hLApAQCAtMzI3NSw2ICszNDM2LDE0IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBiZV9jYW5jZWxfZXJyX2RldGVjdGlvbihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBCRV9GTEFHU19FUlJfREVURUNUSU9OX1NDSEVEVUxFRCkgeworCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmFkYXB0ZXItPmJlX2Vycl9kZXRlY3Rpb25fd29yayk7CisJCWFkYXB0ZXItPmZsYWdzICY9IH5CRV9GTEFHU19FUlJfREVURUNUSU9OX1NDSEVEVUxFRDsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGJlX21hY19jbGVhcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpZiAoYWRhcHRlci0+cG1hY19pZCkgewpAQCAtMzMwNiw4ICszNDc1LDM5IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIHUxNiBiZV9jYWxjdWxhdGVfdmZfcXMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBudW1fdmZzKQoreworCXN0cnVjdCBiZV9yZXNvdXJjZXMgcmVzID0gYWRhcHRlci0+cG9vbF9yZXM7CisJdTE2IG51bV92Zl9xcyA9IDE7CisKKwkvKiBEaXN0cmlidXRlIHRoZSBxdWV1ZSByZXNvdXJjZXMgZXF1YWxseSBhbW9uZyB0aGUgUEYgYW5kIGl0J3MgVkZzCisJICogRG8gbm90IGRpc3RyaWJ1dGUgcXVldWUgcmVzb3VyY2VzIGluIG11bHRpLWNoYW5uZWwgY29uZmlndXJhdGlvbi4KKwkgKi8KKwlpZiAobnVtX3ZmcyAmJiAhYmVfaXNfbWMoYWRhcHRlcikpIHsKKwkJLyogSWYgbnVtYmVyIG9mIFZGcyByZXF1ZXN0ZWQgaXMgOCBsZXNzIHRoYW4gbWF4IHN1cHBvcnRlZCwKKwkJICogYXNzaWduIDggcXVldWUgcGFpcnMgdG8gdGhlIFBGIGFuZCBkaXZpZGUgdGhlIHJlbWFpbmluZworCQkgKiByZXNvdXJjZXMgZXZlbmx5IGFtb25nIHRoZSBWRnMKKwkJICovCisJCWlmIChudW1fdmZzIDwgKGJlX21heF92ZnMoYWRhcHRlcikgLSA4KSkKKwkJCW51bV92Zl9xcyA9IChyZXMubWF4X3Jzc19xcyAtIDgpIC8gbnVtX3ZmczsKKwkJZWxzZQorCQkJbnVtX3ZmX3FzID0gcmVzLm1heF9yc3NfcXMgLyBudW1fdmZzOworCisJCS8qIFNreWhhd2stUiBjaGlwIHN1cHBvcnRzIG9ubHkgTUFYX1JTU19JRkFDRVMgUlNTIGNhcGFibGUKKwkJICogaW50ZXJmYWNlcyBwZXIgcG9ydC4gUHJvdmlkZSBSU1Mgb24gVkZzLCBvbmx5IGlmIG51bWJlcgorCQkgKiBvZiBWRnMgcmVxdWVzdGVkIGlzIGxlc3MgdGhhbiBNQVhfUlNTX0lGQUNFUyBsaW1pdC4KKwkJICovCisJCWlmIChudW1fdmZzID49IE1BWF9SU1NfSUZBQ0VTKQorCQkJbnVtX3ZmX3FzID0gMTsKKwl9CisJcmV0dXJuIG51bV92Zl9xczsKK30KKwogc3RhdGljIGludCBiZV9jbGVhcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CisJdTE2IG51bV92Zl9xczsKKwogCWJlX2NhbmNlbF93b3JrZXIoYWRhcHRlcik7CiAKIAlpZiAoc3Jpb3ZfZW5hYmxlZChhZGFwdGVyKSkKQEAgLTMzMTYsOSArMzUxNiwxNCBAQAogCS8qIFJlLWNvbmZpZ3VyZSBGVyB0byBkaXN0cmlidXRlIHJlc291cmNlcyBldmVubHkgYWNyb3NzIG1heC1zdXBwb3J0ZWQKIAkgKiBudW1iZXIgb2YgVkZzLCBvbmx5IHdoZW4gVkZzIGFyZSBub3QgYWxyZWFkeSBlbmFibGVkLgogCSAqLwotCWlmIChiZV9waHlzZm4oYWRhcHRlcikgJiYgIXBjaV92ZnNfYXNzaWduZWQoYWRhcHRlci0+cGRldikpCisJaWYgKHNreWhhd2tfY2hpcChhZGFwdGVyKSAmJiBiZV9waHlzZm4oYWRhcHRlcikgJiYKKwkgICAgIXBjaV92ZnNfYXNzaWduZWQocGRldikpIHsKKwkJbnVtX3ZmX3FzID0gYmVfY2FsY3VsYXRlX3ZmX3FzKGFkYXB0ZXIsCisJCQkJCSAgICAgICBwY2lfc3Jpb3ZfZ2V0X3RvdGFsdmZzKHBkZXYpKTsKIAkJYmVfY21kX3NldF9zcmlvdl9jb25maWcoYWRhcHRlciwgYWRhcHRlci0+cG9vbF9yZXMsCi0JCQkJCXBjaV9zcmlvdl9nZXRfdG90YWx2ZnMoYWRhcHRlci0+cGRldikpOworCQkJCQlwY2lfc3Jpb3ZfZ2V0X3RvdGFsdmZzKHBkZXYpLAorCQkJCQludW1fdmZfcXMpOworCX0KIAogI2lmZGVmIENPTkZJR19CRTJORVRfVlhMQU4KIAliZV9kaXNhYmxlX3Z4bGFuX29mZmxvYWRzKGFkYXB0ZXIpOwpAQCAtMzMzOSwxOCArMzU0NCwxNCBAQAogCQkJdTMyIGNhcF9mbGFncywgdTMyIHZmKQogewogCXUzMiBlbl9mbGFnczsKLQlpbnQgc3RhdHVzOwogCiAJZW5fZmxhZ3MgPSBCRV9JRl9GTEFHU19VTlRBR0dFRCB8IEJFX0lGX0ZMQUdTX0JST0FEQ0FTVCB8CiAJCSAgIEJFX0lGX0ZMQUdTX01VTFRJQ0FTVCB8IEJFX0lGX0ZMQUdTX1BBU1NfTDNMNF9FUlJPUlMgfAotCQkgICBCRV9JRl9GTEFHU19SU1M7CisJCSAgIEJFX0lGX0ZMQUdTX1JTUyB8IEJFX0lGX0ZMQUdTX0RFRlFfUlNTOwogCiAJZW5fZmxhZ3MgJj0gY2FwX2ZsYWdzOwogCi0Jc3RhdHVzID0gYmVfY21kX2lmX2NyZWF0ZShhZGFwdGVyLCBjYXBfZmxhZ3MsIGVuX2ZsYWdzLAotCQkJCSAgaWZfaGFuZGxlLCB2Zik7Ci0KLQlyZXR1cm4gc3RhdHVzOworCXJldHVybiBiZV9jbWRfaWZfY3JlYXRlKGFkYXB0ZXIsIGNhcF9mbGFncywgZW5fZmxhZ3MsIGlmX2hhbmRsZSwgdmYpOwogfQogCiBzdGF0aWMgaW50IGJlX3Zmc19pZl9jcmVhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0zMzY3LDkgKzM1NjgsMTUgQEAKIAlmb3JfYWxsX3ZmcyhhZGFwdGVyLCB2Zl9jZmcsIHZmKSB7CiAJCWlmICghQkUzX2NoaXAoYWRhcHRlcikpIHsKIAkJCXN0YXR1cyA9IGJlX2NtZF9nZXRfcHJvZmlsZV9jb25maWcoYWRhcHRlciwgJnJlcywKKwkJCQkJCQkgICBSRVNPVVJDRV9MSU1JVFMsCiAJCQkJCQkJICAgdmYgKyAxKTsKLQkJCWlmICghc3RhdHVzKQorCQkJaWYgKCFzdGF0dXMpIHsKIAkJCQljYXBfZmxhZ3MgPSByZXMuaWZfY2FwX2ZsYWdzOworCQkJCS8qIFByZXZlbnQgVkZzIGZyb20gZW5hYmxpbmcgVkxBTiBwcm9taXNjdW91cworCQkJCSAqIG1vZGUKKwkJCQkgKi8KKwkJCQljYXBfZmxhZ3MgJj0gfkJFX0lGX0ZMQUdTX1ZMQU5fUFJPTUlTQ1VPVVM7CisJCQl9CiAJCX0KIAogCQlzdGF0dXMgPSBiZV9pZl9jcmVhdGUoYWRhcHRlciwgJnZmX2NmZy0+aWZfaGFuZGxlLApAQCAtMzQwMyw3ICszNjEwLDYgQEAKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwogCXN0cnVjdCBiZV92Zl9jZmcgKnZmX2NmZzsKIAlpbnQgc3RhdHVzLCBvbGRfdmZzLCB2ZjsKLQl1MzIgcHJpdmlsZWdlczsKIAogCW9sZF92ZnMgPSBwY2lfbnVtX3ZmKGFkYXB0ZXItPnBkZXYpOwogCkBAIC0zNDMzLDE1ICszNjM5LDE4IEBACiAKIAlmb3JfYWxsX3ZmcyhhZGFwdGVyLCB2Zl9jZmcsIHZmKSB7CiAJCS8qIEFsbG93IFZGcyB0byBwcm9ncmFtcyBNQUMvVkxBTiBmaWx0ZXJzICovCi0JCXN0YXR1cyA9IGJlX2NtZF9nZXRfZm5fcHJpdmlsZWdlcyhhZGFwdGVyLCAmcHJpdmlsZWdlcywgdmYgKyAxKTsKLQkJaWYgKCFzdGF0dXMgJiYgIShwcml2aWxlZ2VzICYgQkVfUFJJVl9GSUxUTUdNVCkpIHsKKwkJc3RhdHVzID0gYmVfY21kX2dldF9mbl9wcml2aWxlZ2VzKGFkYXB0ZXIsICZ2Zl9jZmctPnByaXZpbGVnZXMsCisJCQkJCQkgIHZmICsgMSk7CisJCWlmICghc3RhdHVzICYmICEodmZfY2ZnLT5wcml2aWxlZ2VzICYgQkVfUFJJVl9GSUxUTUdNVCkpIHsKIAkJCXN0YXR1cyA9IGJlX2NtZF9zZXRfZm5fcHJpdmlsZWdlcyhhZGFwdGVyLAotCQkJCQkJCSAgcHJpdmlsZWdlcyB8CisJCQkJCQkJICB2Zl9jZmctPnByaXZpbGVnZXMgfAogCQkJCQkJCSAgQkVfUFJJVl9GSUxUTUdNVCwKIAkJCQkJCQkgIHZmICsgMSk7Ci0JCQlpZiAoIXN0YXR1cykKKwkJCWlmICghc3RhdHVzKSB7CisJCQkJdmZfY2ZnLT5wcml2aWxlZ2VzIHw9IEJFX1BSSVZfRklMVE1HTVQ7CiAJCQkJZGV2X2luZm8oZGV2LCAiVkYlZCBoYXMgRklMVE1HTVQgcHJpdmlsZWdlXG4iLAogCQkJCQkgdmYpOworCQkJfQogCQl9CiAKIAkJLyogQWxsb3cgZnVsbCBhdmFpbGFibGUgYmFuZHdpZHRoICovCkBAIC0zNTMzLDcgKzM3NDIsOCBAQAogCQkvKiBPbiBhIFN1cGVyTklDIHByb2ZpbGUsIHRoZSBkcml2ZXIgbmVlZHMgdG8gdXNlIHRoZQogCQkgKiBHRVRfUFJPRklMRV9DT05GSUcgY21kIHRvIHF1ZXJ5IHRoZSBwZXItZnVuY3Rpb24gVFhRIGxpbWl0cwogCQkgKi8KLQkJYmVfY21kX2dldF9wcm9maWxlX2NvbmZpZyhhZGFwdGVyLCAmc3VwZXJfbmljX3JlcywgMCk7CisJCWJlX2NtZF9nZXRfcHJvZmlsZV9jb25maWcoYWRhcHRlciwgJnN1cGVyX25pY19yZXMsCisJCQkJCSAgUkVTT1VSQ0VfTElNSVRTLCAwKTsKIAkJLyogU29tZSBvbGQgdmVyc2lvbnMgb2YgQkUzIEZXIGRvbid0IHJlcG9ydCBtYXhfdHhfcXMgdmFsdWUgKi8KIAkJcmVzLT5tYXhfdHhfcXMgPSBzdXBlcl9uaWNfcmVzLm1heF90eF9xcyA/IDogQkUzX01BWF9UWF9RUzsKIAl9IGVsc2UgewpAQCAtMzU1Myw2ICszNzYzLDcgQEAKIAkJcmVzLT5tYXhfZXZ0X3FzID0gMTsKIAogCXJlcy0+aWZfY2FwX2ZsYWdzID0gQkVfSUZfQ0FQX0ZMQUdTX1dBTlQ7CisJcmVzLT5pZl9jYXBfZmxhZ3MgJj0gfkJFX0lGX0ZMQUdTX0RFRlFfUlNTOwogCWlmICghKGFkYXB0ZXItPmZ1bmN0aW9uX2NhcHMgJiBCRV9GVU5DVElPTl9DQVBTX1JTUykpCiAJCXJlcy0+aWZfY2FwX2ZsYWdzICY9IH5CRV9JRl9GTEFHU19SU1M7CiB9CkBAIC0zNTcyLDEzICszNzgzLDEyIEBACiAKIHN0YXRpYyBpbnQgYmVfZ2V0X3NyaW92X2NvbmZpZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwogCXN0cnVjdCBiZV9yZXNvdXJjZXMgcmVzID0gezB9OwogCWludCBtYXhfdmZzLCBvbGRfdmZzOwogCi0JLyogU29tZSBvbGQgdmVyc2lvbnMgb2YgQkUzIEZXIGRvbid0IHJlcG9ydCBtYXhfdmZzIHZhbHVlICovCi0JYmVfY21kX2dldF9wcm9maWxlX2NvbmZpZyhhZGFwdGVyLCAmcmVzLCAwKTsKKwliZV9jbWRfZ2V0X3Byb2ZpbGVfY29uZmlnKGFkYXB0ZXIsICZyZXMsIFJFU09VUkNFX0xJTUlUUywgMCk7CiAKKwkvKiBTb21lIG9sZCB2ZXJzaW9ucyBvZiBCRTMgRlcgZG9uJ3QgcmVwb3J0IG1heF92ZnMgdmFsdWUgKi8KIAlpZiAoQkUzX2NoaXAoYWRhcHRlcikgJiYgIXJlcy5tYXhfdmZzKSB7CiAJCW1heF92ZnMgPSBwY2lfc3Jpb3ZfZ2V0X3RvdGFsdmZzKGFkYXB0ZXItPnBkZXYpOwogCQlyZXMubWF4X3ZmcyA9IG1heF92ZnMgPiAwID8gbWluKE1BWF9WRlMsIG1heF92ZnMpIDogMDsKQEAgLTM1ODYsMzUgKzM3OTYsNDkgQEAKIAogCWFkYXB0ZXItPnBvb2xfcmVzID0gcmVzOwogCi0JaWYgKCFiZV9tYXhfdmZzKGFkYXB0ZXIpKSB7Ci0JCWlmIChudW1fdmZzKQotCQkJZGV2X3dhcm4oZGV2LCAiU1JJT1YgaXMgZGlzYWJsZWQuIElnbm9yaW5nIG51bV92ZnNcbiIpOwotCQlhZGFwdGVyLT5udW1fdmZzID0gMDsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcGNpX3NyaW92X3NldF90b3RhbHZmcyhhZGFwdGVyLT5wZGV2LCBiZV9tYXhfdmZzKGFkYXB0ZXIpKTsKLQotCS8qIHZhbGlkYXRlIG51bV92ZnMgbW9kdWxlIHBhcmFtICovCisJLyogSWYgZHVyaW5nIHByZXZpb3VzIHVubG9hZCBvZiB0aGUgZHJpdmVyLCB0aGUgVkZzIHdlcmUgbm90IGRpc2FibGVkLAorCSAqIHRoZW4gd2UgY2Fubm90IHJlbHkgb24gdGhlIFBGIFBPT0wgbGltaXRzIGZvciB0aGUgVG90YWxWRnMgdmFsdWUuCisJICogSW5zdGVhZCB1c2UgdGhlIFRvdGFsVkZzIHZhbHVlIHN0b3JlZCBpbiB0aGUgcGNpLWRldiBzdHJ1Y3QuCisJICovCiAJb2xkX3ZmcyA9IHBjaV9udW1fdmYoYWRhcHRlci0+cGRldik7CiAJaWYgKG9sZF92ZnMpIHsKLQkJZGV2X2luZm8oZGV2LCAiJWQgVkZzIGFyZSBhbHJlYWR5IGVuYWJsZWRcbiIsIG9sZF92ZnMpOwotCQlpZiAob2xkX3ZmcyAhPSBudW1fdmZzKQotCQkJZGV2X3dhcm4oZGV2LCAiSWdub3JpbmcgbnVtX3Zmcz0lZCBzZXR0aW5nXG4iLCBudW1fdmZzKTsKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVkIFZGcyBhcmUgYWxyZWFkeSBlbmFibGVkXG4iLAorCQkJIG9sZF92ZnMpOworCisJCWFkYXB0ZXItPnBvb2xfcmVzLm1heF92ZnMgPQorCQkJcGNpX3NyaW92X2dldF90b3RhbHZmcyhhZGFwdGVyLT5wZGV2KTsKIAkJYWRhcHRlci0+bnVtX3ZmcyA9IG9sZF92ZnM7Ci0JfSBlbHNlIHsKLQkJaWYgKG51bV92ZnMgPiBiZV9tYXhfdmZzKGFkYXB0ZXIpKSB7Ci0JCQlkZXZfaW5mbyhkZXYsICJSZXNvdXJjZXMgdW5hdmFpbGFibGUgdG8gaW5pdCAlZCBWRnNcbiIsCi0JCQkJIG51bV92ZnMpOwotCQkJZGV2X2luZm8oZGV2LCAiTGltaXRpbmcgdG8gJWQgVkZzXG4iLAotCQkJCSBiZV9tYXhfdmZzKGFkYXB0ZXIpKTsKLQkJfQotCQlhZGFwdGVyLT5udW1fdmZzID0gbWluX3QodTE2LCBudW1fdmZzLCBiZV9tYXhfdmZzKGFkYXB0ZXIpKTsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYmVfYWxsb2Nfc3Jpb3ZfcmVzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBvbGRfdmZzID0gcGNpX251bV92ZihhZGFwdGVyLT5wZGV2KTsKKwl1MTYgbnVtX3ZmX3FzOworCWludCBzdGF0dXM7CisKKwliZV9nZXRfc3Jpb3ZfY29uZmlnKGFkYXB0ZXIpOworCisJaWYgKCFvbGRfdmZzKQorCQlwY2lfc3Jpb3Zfc2V0X3RvdGFsdmZzKGFkYXB0ZXItPnBkZXYsIGJlX21heF92ZnMoYWRhcHRlcikpOworCisJLyogV2hlbiB0aGUgSFcgaXMgaW4gU1JJT1YgY2FwYWJsZSBjb25maWd1cmF0aW9uLCB0aGUgUEYtcG9vbAorCSAqIHJlc291cmNlcyBhcmUgZ2l2ZW4gdG8gUEYgZHVyaW5nIGRyaXZlciBsb2FkLCBpZiB0aGVyZSBhcmUgbm8KKwkgKiBvbGQgVkZzLiBUaGlzIGZhY2lsaXR5IGlzIG5vdCBhdmFpbGFibGUgaW4gQkUzIEZXLgorCSAqIEFsc28sIHRoaXMgaXMgZG9uZSBieSBGVyBpbiBMYW5jZXIgY2hpcC4KKwkgKi8KKwlpZiAoc2t5aGF3a19jaGlwKGFkYXB0ZXIpICYmIGJlX21heF92ZnMoYWRhcHRlcikgJiYgIW9sZF92ZnMpIHsKKwkJbnVtX3ZmX3FzID0gYmVfY2FsY3VsYXRlX3ZmX3FzKGFkYXB0ZXIsIDApOworCQlzdGF0dXMgPSBiZV9jbWRfc2V0X3NyaW92X2NvbmZpZyhhZGFwdGVyLCBhZGFwdGVyLT5wb29sX3JlcywgMCwKKwkJCQkJCSBudW1fdmZfcXMpOworCQlpZiAoc3RhdHVzKQorCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gb3B0aW1pemUgU1JJT1YgcmVzb3VyY2VzXG4iKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgYmVfZ2V0X3Jlc291cmNlcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwpAQCAtMzYzNSwxMiArMzg1OSwyMyBAQAogCQlpZiAoc3RhdHVzKQogCQkJcmV0dXJuIHN0YXR1czsKIAorCQkvKiBJZiBhIGRlYWZhdWx0IFJYUSBtdXN0IGJlIGNyZWF0ZWQsIHdlJ2xsIHVzZSB1cCBvbmUgUlNTUSovCisJCWlmIChyZXMubWF4X3Jzc19xcyAmJiByZXMubWF4X3Jzc19xcyA9PSByZXMubWF4X3J4X3FzICYmCisJCSAgICAhKHJlcy5pZl9jYXBfZmxhZ3MgJiBCRV9JRl9GTEFHU19ERUZRX1JTUykpCisJCQlyZXMubWF4X3Jzc19xcyAtPSAxOworCiAJCS8qIElmIFJvQ0UgbWF5IGJlIGVuYWJsZWQgc3Rhc2ggYXdheSBoYWxmIHRoZSBFUXMgZm9yIFJvQ0UgKi8KIAkJaWYgKGJlX3JvY2Vfc3VwcG9ydGVkKGFkYXB0ZXIpKQogCQkJcmVzLm1heF9ldnRfcXMgLz0gMjsKIAkJYWRhcHRlci0+cmVzID0gcmVzOwogCX0KIAorCS8qIElmIEZXIHN1cHBvcnRzIFJTUyBkZWZhdWx0IHF1ZXVlLCB0aGVuIHNraXAgY3JlYXRpbmcgbm9uLVJTUworCSAqIHF1ZXVlIGZvciBub24tSVAgdHJhZmZpYy4KKwkgKi8KKwlhZGFwdGVyLT5uZWVkX2RlZl9yeHEgPSAoYmVfaWZfY2FwX2ZsYWdzKGFkYXB0ZXIpICYKKwkJCQkgQkVfSUZfRkxBR1NfREVGUV9SU1MpID8gMCA6IDE7CisKIAlkZXZfaW5mbyhkZXYsICJNYXg6IHR4cXMgJWQsIHJ4cXMgJWQsIHJzcyAlZCwgZXFzICVkLCB2ZnMgJWRcbiIsCiAJCSBiZV9tYXhfdHhxcyhhZGFwdGVyKSwgYmVfbWF4X3J4cXMoYWRhcHRlciksCiAJCSBiZV9tYXhfcnNzKGFkYXB0ZXIpLCBiZV9tYXhfZXFzKGFkYXB0ZXIpLApAQCAtMzY0OSw0NyArMzg4NCwzMyBAQAogCQkgYmVfbWF4X3VjKGFkYXB0ZXIpLCBiZV9tYXhfbWMoYWRhcHRlciksCiAJCSBiZV9tYXhfdmxhbnMoYWRhcHRlcikpOwogCisJLyogU2FuaXRpemUgY2ZnX251bV9xcyBiYXNlZCBvbiBIVyBhbmQgcGxhdGZvcm0gbGltaXRzICovCisJYWRhcHRlci0+Y2ZnX251bV9xcyA9IG1pbl90KHUxNiwgbmV0aWZfZ2V0X251bV9kZWZhdWx0X3Jzc19xdWV1ZXMoKSwKKwkJCQkgICAgYmVfbWF4X3FzKGFkYXB0ZXIpKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYmVfc3Jpb3ZfY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZhZGFwdGVyLT5wZGV2LT5kZXY7Ci0JaW50IHN0YXR1czsKLQotCXN0YXR1cyA9IGJlX2dldF9zcmlvdl9jb25maWcoYWRhcHRlcik7Ci0JaWYgKHN0YXR1cykgewotCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBxdWVyeSBTUi1JT1YgY29uZmlndXJhdGlvblxuIik7Ci0JCWRldl9lcnIoZGV2LCAiU1ItSU9WIGNhbm5vdCBiZSBlbmFibGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIFdoZW4gdGhlIEhXIGlzIGluIFNSSU9WIGNhcGFibGUgY29uZmlndXJhdGlvbiwgdGhlIFBGLXBvb2wKLQkgKiByZXNvdXJjZXMgYXJlIGVxdWFsbHkgZGlzdHJpYnV0ZWQgYWNyb3NzIHRoZSBtYXgtbnVtYmVyIG9mCi0JICogVkZzLiBUaGUgdXNlciBtYXkgcmVxdWVzdCBvbmx5IGEgc3Vic2V0IG9mIHRoZSBtYXgtdmZzIHRvIGJlCi0JICogZW5hYmxlZC4gQmFzZWQgb24gbnVtX3ZmcywgcmVkaXN0cmlidXRlIHRoZSByZXNvdXJjZXMgYWNyb3NzCi0JICogbnVtX3ZmcyBzbyB0aGF0IGVhY2ggVkYgd2lsbCBoYXZlIGFjY2VzcyB0byBtb3JlIG51bWJlciBvZgotCSAqIHJlc291cmNlcy4gVGhpcyBmYWNpbGl0eSBpcyBub3QgYXZhaWxhYmxlIGluIEJFMyBGVy4KLQkgKiBBbHNvLCB0aGlzIGlzIGRvbmUgYnkgRlcgaW4gTGFuY2VyIGNoaXAuCi0JICovCi0JaWYgKGJlX21heF92ZnMoYWRhcHRlcikgJiYgIXBjaV9udW1fdmYoYWRhcHRlci0+cGRldikpIHsKLQkJc3RhdHVzID0gYmVfY21kX3NldF9zcmlvdl9jb25maWcoYWRhcHRlciwKLQkJCQkJCSBhZGFwdGVyLT5wb29sX3JlcywKLQkJCQkJCSBhZGFwdGVyLT5udW1fdmZzKTsKLQkJaWYgKHN0YXR1cykKLQkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIG9wdGltaXplIFNSLUlPViByZXNvdXJjZXNcbiIpOwotCX0KLX0KLQogc3RhdGljIGludCBiZV9nZXRfY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogeworCWludCBzdGF0dXMsIGxldmVsOwogCXUxNiBwcm9maWxlX2lkOwotCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBiZV9jbWRfZ2V0X2NudGxfYXR0cmlidXRlcyhhZGFwdGVyKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOwogCiAJc3RhdHVzID0gYmVfY21kX3F1ZXJ5X2Z3X2NmZyhhZGFwdGVyKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCisJaWYgKEJFeF9jaGlwKGFkYXB0ZXIpKSB7CisJCWxldmVsID0gYmVfY21kX2dldF9md19sb2dfbGV2ZWwoYWRhcHRlcik7CisJCWFkYXB0ZXItPm1zZ19lbmFibGUgPQorCQkJbGV2ZWwgPD0gRldfTE9HX0xFVkVMX0RFRkFVTFQgPyBORVRJRl9NU0dfSFcgOiAwOworCX0KKworCWJlX2NtZF9nZXRfYWNwaV93b2xfY2FwKGFkYXB0ZXIpOworCiAJYmVfY21kX3F1ZXJ5X3BvcnRfbmFtZShhZGFwdGVyKTsKIAogCWlmIChiZV9waHlzZm4oYWRhcHRlcikpIHsKQEAgLTM2OTksOSArMzkyMCw2IEBACiAJCQkJICJVc2luZyBwcm9maWxlIDB4JXhcbiIsIHByb2ZpbGVfaWQpOwogCX0KIAotCWlmICghQkUyX2NoaXAoYWRhcHRlcikgJiYgYmVfcGh5c2ZuKGFkYXB0ZXIpKQotCQliZV9zcmlvdl9jb25maWcoYWRhcHRlcik7Ci0KIAlzdGF0dXMgPSBiZV9nZXRfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7CkBAIC0zNzExLDkgKzM5MjksNiBAQAogCWlmICghYWRhcHRlci0+cG1hY19pZCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKiBTYW5pdGl6ZSBjZmdfbnVtX3FzIGJhc2VkIG9uIEhXIGFuZCBwbGF0Zm9ybSBsaW1pdHMgKi8KLQlhZGFwdGVyLT5jZmdfbnVtX3FzID0gbWluKGFkYXB0ZXItPmNmZ19udW1fcXMsIGJlX21heF9xcyhhZGFwdGVyKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzc0Nyw2ICszOTYyLDEzIEBACiAJYWRhcHRlci0+ZmxhZ3MgfD0gQkVfRkxBR1NfV09SS0VSX1NDSEVEVUxFRDsKIH0KIAorc3RhdGljIHZvaWQgYmVfc2NoZWR1bGVfZXJyX2RldGVjdGlvbihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPmJlX2Vycl9kZXRlY3Rpb25fd29yaywKKwkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworCWFkYXB0ZXItPmZsYWdzIHw9IEJFX0ZMQUdTX0VSUl9ERVRFQ1RJT05fU0NIRURVTEVEOworfQorCiBzdGF0aWMgaW50IGJlX3NldHVwX3F1ZXVlcyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwpAQCAtMzgyOSwxNiArNDA1MSw2MSBAQAogCXJldHVybiBmd19tYWpvcjsKIH0KIAorLyogSWYgYW55IFZGcyBhcmUgYWxyZWFkeSBlbmFibGVkIGRvbid0IEZMUiB0aGUgUEYgKi8KK3N0YXRpYyBib29sIGJlX3Jlc2V0X3JlcXVpcmVkKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBwY2lfbnVtX3ZmKGFkYXB0ZXItPnBkZXYpID8gZmFsc2UgOiB0cnVlOworfQorCisvKiBXYWl0IGZvciB0aGUgRlcgdG8gYmUgcmVhZHkgYW5kIHBlcmZvcm0gdGhlIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uICovCitzdGF0aWMgaW50IGJlX2Z1bmNfaW5pdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gYmVfZndfd2FpdF9yZWFkeShhZGFwdGVyKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCisJaWYgKGJlX3Jlc2V0X3JlcXVpcmVkKGFkYXB0ZXIpKSB7CisJCXN0YXR1cyA9IGJlX2NtZF9yZXNldF9mdW5jdGlvbihhZGFwdGVyKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisKKwkJLyogV2FpdCBmb3IgaW50ZXJydXB0cyB0byBxdWllc2NlIGFmdGVyIGFuIEZMUiAqLworCQltc2xlZXAoMTAwKTsKKworCQkvKiBXZSBjYW4gY2xlYXIgYWxsIGVycm9ycyB3aGVuIGZ1bmN0aW9uIHJlc2V0IHN1Y2NlZWRzICovCisJCWJlX2NsZWFyX2FsbF9lcnJvcihhZGFwdGVyKTsKKwl9CisKKwkvKiBUZWxsIEZXIHdlJ3JlIHJlYWR5IHRvIGZpcmUgY21kcyAqLworCXN0YXR1cyA9IGJlX2NtZF9md19pbml0KGFkYXB0ZXIpOworCWlmIChzdGF0dXMpCisJCXJldHVybiBzdGF0dXM7CisKKwkvKiBBbGxvdyBpbnRlcnJ1cHRzIGZvciBvdGhlciBVTFBzIHJ1bm5pbmcgb24gTklDIGZ1bmN0aW9uICovCisJYmVfaW50cl9zZXQoYWRhcHRlciwgdHJ1ZSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBiZV9zZXR1cChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwogCWludCBzdGF0dXM7CiAKKwlzdGF0dXMgPSBiZV9mdW5jX2luaXQoYWRhcHRlcik7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwogCWJlX3NldHVwX2luaXQoYWRhcHRlcik7CiAKIAlpZiAoIWxhbmNlcl9jaGlwKGFkYXB0ZXIpKQogCQliZV9jbWRfcmVxX25hdGl2ZV9tb2RlKGFkYXB0ZXIpOwogCisJaWYgKCFCRTJfY2hpcChhZGFwdGVyKSAmJiBiZV9waHlzZm4oYWRhcHRlcikpCisJCWJlX2FsbG9jX3NyaW92X3JlcyhhZGFwdGVyKTsKKwogCXN0YXR1cyA9IGJlX2dldF9jb25maWcoYWRhcHRlcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnI7CkBAIC0zODc5LDggKzQxNDYsNiBAQAogCiAJYmVfc2V0X3J4X21vZGUoYWRhcHRlci0+bmV0ZGV2KTsKIAotCWJlX2NtZF9nZXRfYWNwaV93b2xfY2FwKGFkYXB0ZXIpOwotCiAJc3RhdHVzID0gYmVfY21kX3NldF9mbG93X2NvbnRyb2woYWRhcHRlciwgYWRhcHRlci0+dHhfZmMsCiAJCQkJCSBhZGFwdGVyLT5yeF9mYyk7CiAJaWYgKHN0YXR1cykKQEAgLTQ3OTAsMjc2ICs1MDU1LDc5IEBACiAJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZiZV9ldGh0b29sX29wczsKIH0KIAotc3RhdGljIHZvaWQgYmVfdW5tYXBfcGNpX2JhcnMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgdm9pZCBiZV9jbGVhbnVwKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewotCWlmIChhZGFwdGVyLT5jc3IpCi0JCXBjaV9pb3VubWFwKGFkYXB0ZXItPnBkZXYsIGFkYXB0ZXItPmNzcik7Ci0JaWYgKGFkYXB0ZXItPmRiKQotCQlwY2lfaW91bm1hcChhZGFwdGVyLT5wZGV2LCBhZGFwdGVyLT5kYik7Ci19CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAotc3RhdGljIGludCBkYl9iYXIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpIHx8ICFiZV9waHlzZm4oYWRhcHRlcikpCi0JCXJldHVybiAwOwotCWVsc2UKLQkJcmV0dXJuIDQ7Ci19Ci0KLXN0YXRpYyBpbnQgYmVfcm9jZV9tYXBfcGNpX2JhcnMoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCi17Ci0JaWYgKHNreWhhd2tfY2hpcChhZGFwdGVyKSkgewotCQlhZGFwdGVyLT5yb2NlX2RiLnNpemUgPSA0MDk2OwotCQlhZGFwdGVyLT5yb2NlX2RiLmlvX2FkZHIgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoYWRhcHRlci0+cGRldiwKLQkJCQkJCQkgICAgICBkYl9iYXIoYWRhcHRlcikpOwotCQlhZGFwdGVyLT5yb2NlX2RiLnRvdGFsX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGFkYXB0ZXItPnBkZXYsCi0JCQkJCQkJICAgICAgIGRiX2JhcihhZGFwdGVyKSk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJlX21hcF9wY2lfYmFycyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKLXsKLQl1OCBfX2lvbWVtICphZGRyOwotCi0JaWYgKEJFeF9jaGlwKGFkYXB0ZXIpICYmIGJlX3BoeXNmbihhZGFwdGVyKSkgewotCQlhZGFwdGVyLT5jc3IgPSBwY2lfaW9tYXAoYWRhcHRlci0+cGRldiwgMiwgMCk7Ci0JCWlmICghYWRhcHRlci0+Y3NyKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYWRkciA9IHBjaV9pb21hcChhZGFwdGVyLT5wZGV2LCBkYl9iYXIoYWRhcHRlciksIDApOwotCWlmICghYWRkcikKLQkJZ290byBwY2lfbWFwX2VycjsKLQlhZGFwdGVyLT5kYiA9IGFkZHI7Ci0KLQliZV9yb2NlX21hcF9wY2lfYmFycyhhZGFwdGVyKTsKLQlyZXR1cm4gMDsKLQotcGNpX21hcF9lcnI6Ci0JZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiRXJyb3IgaW4gbWFwcGluZyBQQ0kgQkFSc1xuIik7Ci0JYmVfdW5tYXBfcGNpX2JhcnMoYWRhcHRlcik7Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXN0YXRpYyB2b2lkIGJlX2N0cmxfY2xlYW51cChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKLXsKLQlzdHJ1Y3QgYmVfZG1hX21lbSAqbWVtID0gJmFkYXB0ZXItPm1ib3hfbWVtX2FsbG9jZWQ7Ci0KLQliZV91bm1hcF9wY2lfYmFycyhhZGFwdGVyKTsKLQotCWlmIChtZW0tPnZhKQotCQlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBtZW0tPnNpemUsIG1lbS0+dmEsCi0JCQkJICBtZW0tPmRtYSk7Ci0KLQltZW0gPSAmYWRhcHRlci0+cnhfZmlsdGVyOwotCWlmIChtZW0tPnZhKQotCQlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBtZW0tPnNpemUsIG1lbS0+dmEsCi0JCQkJICBtZW0tPmRtYSk7Ci19Ci0KLXN0YXRpYyBpbnQgYmVfY3RybF9pbml0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBiZV9kbWFfbWVtICptYm94X21lbV9hbGxvYyA9ICZhZGFwdGVyLT5tYm94X21lbV9hbGxvY2VkOwotCXN0cnVjdCBiZV9kbWFfbWVtICptYm94X21lbV9hbGlnbiA9ICZhZGFwdGVyLT5tYm94X21lbTsKLQlzdHJ1Y3QgYmVfZG1hX21lbSAqcnhfZmlsdGVyID0gJmFkYXB0ZXItPnJ4X2ZpbHRlcjsKLQl1MzIgc2xpX2ludGY7Ci0JaW50IHN0YXR1czsKLQotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LCBTTElfSU5URl9SRUdfT0ZGU0VULCAmc2xpX2ludGYpOwotCWFkYXB0ZXItPnNsaV9mYW1pbHkgPSAoc2xpX2ludGYgJiBTTElfSU5URl9GQU1JTFlfTUFTSykgPj4KLQkJCQkgU0xJX0lOVEZfRkFNSUxZX1NISUZUOwotCWFkYXB0ZXItPnZpcnRmbiA9IChzbGlfaW50ZiAmIFNMSV9JTlRGX0ZUX01BU0spID8gMSA6IDA7Ci0KLQlzdGF0dXMgPSBiZV9tYXBfcGNpX2JhcnMoYWRhcHRlcik7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBkb25lOwotCi0JbWJveF9tZW1fYWxsb2MtPnNpemUgPSBzaXplb2Yoc3RydWN0IGJlX21jY19tYWlsYm94KSArIDE2OwotCW1ib3hfbWVtX2FsbG9jLT52YSA9IGRtYV9hbGxvY19jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCQkJbWJveF9tZW1fYWxsb2MtPnNpemUsCi0JCQkJCQkmbWJveF9tZW1fYWxsb2MtPmRtYSwKLQkJCQkJCUdGUF9LRVJORUwpOwotCWlmICghbWJveF9tZW1fYWxsb2MtPnZhKSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07Ci0JCWdvdG8gdW5tYXBfcGNpX2JhcnM7Ci0JfQotCW1ib3hfbWVtX2FsaWduLT5zaXplID0gc2l6ZW9mKHN0cnVjdCBiZV9tY2NfbWFpbGJveCk7Ci0JbWJveF9tZW1fYWxpZ24tPnZhID0gUFRSX0FMSUdOKG1ib3hfbWVtX2FsbG9jLT52YSwgMTYpOwotCW1ib3hfbWVtX2FsaWduLT5kbWEgPSBQVFJfQUxJR04obWJveF9tZW1fYWxsb2MtPmRtYSwgMTYpOwotCW1lbXNldChtYm94X21lbV9hbGlnbi0+dmEsIDAsIHNpemVvZihzdHJ1Y3QgYmVfbWNjX21haWxib3gpKTsKLQotCXJ4X2ZpbHRlci0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfY21kX3JlcV9yeF9maWx0ZXIpOwotCXJ4X2ZpbHRlci0+dmEgPSBkbWFfemFsbG9jX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkJCSAgICByeF9maWx0ZXItPnNpemUsICZyeF9maWx0ZXItPmRtYSwKLQkJCQkJICAgIEdGUF9LRVJORUwpOwotCWlmICghcnhfZmlsdGVyLT52YSkgewotCQlzdGF0dXMgPSAtRU5PTUVNOwotCQlnb3RvIGZyZWVfbWJveDsKLQl9Ci0KLQltdXRleF9pbml0KCZhZGFwdGVyLT5tYm94X2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5tY2NfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPm1jY19jcV9sb2NrKTsKLQotCWluaXRfY29tcGxldGlvbigmYWRhcHRlci0+ZXRfY21kX2NvbXBsKTsKLQlwY2lfc2F2ZV9zdGF0ZShhZGFwdGVyLT5wZGV2KTsKLQlyZXR1cm4gMDsKLQotZnJlZV9tYm94OgotCWRtYV9mcmVlX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsIG1ib3hfbWVtX2FsbG9jLT5zaXplLAotCQkJICBtYm94X21lbV9hbGxvYy0+dmEsIG1ib3hfbWVtX2FsbG9jLT5kbWEpOwotCi11bm1hcF9wY2lfYmFyczoKLQliZV91bm1hcF9wY2lfYmFycyhhZGFwdGVyKTsKLQotZG9uZToKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgdm9pZCBiZV9zdGF0c19jbGVhbnVwKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBiZV9kbWFfbWVtICpjbWQgPSAmYWRhcHRlci0+c3RhdHNfY21kOwotCi0JaWYgKGNtZC0+dmEpCi0JCWRtYV9mcmVlX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsIGNtZC0+c2l6ZSwKLQkJCQkgIGNtZC0+dmEsIGNtZC0+ZG1hKTsKLX0KLQotc3RhdGljIGludCBiZV9zdGF0c19pbml0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQotewotCXN0cnVjdCBiZV9kbWFfbWVtICpjbWQgPSAmYWRhcHRlci0+c3RhdHNfY21kOwotCi0JaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpKQotCQljbWQtPnNpemUgPSBzaXplb2Yoc3RydWN0IGxhbmNlcl9jbWRfcmVxX3Bwb3J0X3N0YXRzKTsKLQllbHNlIGlmIChCRTJfY2hpcChhZGFwdGVyKSkKLQkJY21kLT5zaXplID0gc2l6ZW9mKHN0cnVjdCBiZV9jbWRfcmVxX2dldF9zdGF0c192MCk7Ci0JZWxzZSBpZiAoQkUzX2NoaXAoYWRhcHRlcikpCi0JCWNtZC0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfc3RhdHNfdjEpOwotCWVsc2UKLQkJLyogQUxMIG5vbi1CRSBBU0lDcyAqLwotCQljbWQtPnNpemUgPSBzaXplb2Yoc3RydWN0IGJlX2NtZF9yZXFfZ2V0X3N0YXRzX3YyKTsKLQotCWNtZC0+dmEgPSBkbWFfemFsbG9jX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsIGNtZC0+c2l6ZSwgJmNtZC0+ZG1hLAotCQkJCSAgICAgIEdGUF9LRVJORUwpOwotCWlmICghY21kLT52YSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKLXsKLQlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCWlmICghYWRhcHRlcikKLQkJcmV0dXJuOwotCi0JYmVfcm9jZV9kZXZfcmVtb3ZlKGFkYXB0ZXIpOwotCWJlX2ludHJfc2V0KGFkYXB0ZXIsIGZhbHNlKTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYWRhcHRlci0+ZnVuY19yZWNvdmVyeV93b3JrKTsKLQotCXVucmVnaXN0ZXJfbmV0ZGV2KGFkYXB0ZXItPm5ldGRldik7CisJcnRubF9sb2NrKCk7CisJbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJCWJlX2Nsb3NlKG5ldGRldik7CisJcnRubF91bmxvY2soKTsKIAogCWJlX2NsZWFyKGFkYXB0ZXIpOwotCi0JLyogdGVsbCBmdyB3ZSdyZSBkb25lIHdpdGggZmlyaW5nIGNtZHMgKi8KLQliZV9jbWRfZndfY2xlYW4oYWRhcHRlcik7Ci0KLQliZV9zdGF0c19jbGVhbnVwKGFkYXB0ZXIpOwotCi0JYmVfY3RybF9jbGVhbnVwKGFkYXB0ZXIpOwotCi0JcGNpX2Rpc2FibGVfcGNpZV9lcnJvcl9yZXBvcnRpbmcocGRldik7Ci0KLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQotCWZyZWVfbmV0ZGV2KGFkYXB0ZXItPm5ldGRldik7CiB9CiAKLXN0YXRpYyBpbnQgYmVfZ2V0X2luaXRpYWxfY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGludCBiZV9yZXN1bWUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaW50IHN0YXR1cywgbGV2ZWw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKKwlpbnQgc3RhdHVzOwogCi0Jc3RhdHVzID0gYmVfY21kX2dldF9jbnRsX2F0dHJpYnV0ZXMoYWRhcHRlcik7CisJc3RhdHVzID0gYmVfc2V0dXAoYWRhcHRlcik7CiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKIAotCS8qIE11c3QgYmUgYSBwb3dlciBvZiAyIG9yIGVsc2UgTU9EVUxPIHdpbGwgQlVHX09OICovCi0JYWRhcHRlci0+YmVfZ2V0X3RlbXBfZnJlcSA9IDY0OwotCi0JaWYgKEJFeF9jaGlwKGFkYXB0ZXIpKSB7Ci0JCWxldmVsID0gYmVfY21kX2dldF9md19sb2dfbGV2ZWwoYWRhcHRlcik7Ci0JCWFkYXB0ZXItPm1zZ19lbmFibGUgPQotCQkJbGV2ZWwgPD0gRldfTE9HX0xFVkVMX0RFRkFVTFQgPyBORVRJRl9NU0dfSFcgOiAwOworCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKKwkJc3RhdHVzID0gYmVfb3BlbihuZXRkZXYpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuIHN0YXR1czsKIAl9CiAKLQlhZGFwdGVyLT5jZmdfbnVtX3FzID0gbmV0aWZfZ2V0X251bV9kZWZhdWx0X3Jzc19xdWV1ZXMoKTsKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsYW5jZXJfcmVjb3Zlcl9mdW5jKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQorc3RhdGljIGludCBiZV9lcnJfcmVjb3ZlcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OwogCWludCBzdGF0dXM7CiAKLQlzdGF0dXMgPSBsYW5jZXJfdGVzdF9hbmRfc2V0X3JkeV9zdGF0ZShhZGFwdGVyKTsKKwlzdGF0dXMgPSBiZV9yZXN1bWUoYWRhcHRlcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnI7CiAKLQlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKQotCQliZV9jbG9zZShhZGFwdGVyLT5uZXRkZXYpOwotCi0JYmVfY2xlYXIoYWRhcHRlcik7Ci0KLQliZV9jbGVhcl9hbGxfZXJyb3IoYWRhcHRlcik7Ci0KLQlzdGF0dXMgPSBiZV9zZXR1cChhZGFwdGVyKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIGVycjsKLQotCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKLQkJc3RhdHVzID0gYmVfb3BlbihhZGFwdGVyLT5uZXRkZXYpOwotCQlpZiAoc3RhdHVzKQotCQkJZ290byBlcnI7Ci0JfQotCi0JZGV2X2VycihkZXYsICJBZGFwdGVyIHJlY292ZXJ5IHN1Y2Nlc3NmdWxcbiIpOworCWRldl9pbmZvKGRldiwgIkFkYXB0ZXIgcmVjb3Zlcnkgc3VjY2Vzc2Z1bFxuIik7CiAJcmV0dXJuIDA7CiBlcnI6Ci0JaWYgKHN0YXR1cyA9PSAtRUFHQUlOKQotCQlkZXZfZXJyKGRldiwgIldhaXRpbmcgZm9yIHJlc291cmNlIHByb3Zpc2lvbmluZ1xuIik7Ci0JZWxzZQorCWlmIChiZV9waHlzZm4oYWRhcHRlcikpCiAJCWRldl9lcnIoZGV2LCAiQWRhcHRlciByZWNvdmVyeSBmYWlsZWRcbiIpOworCWVsc2UKKwkJZGV2X2VycihkZXYsICJSZS10cnlpbmcgYWRhcHRlciByZWNvdmVyeVxuIik7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgdm9pZCBiZV9mdW5jX3JlY292ZXJ5X3Rhc2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgYmVfZXJyX2RldGVjdGlvbl90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfYWRhcHRlciwgIGZ1bmNfcmVjb3Zlcnlfd29yay53b3JrKTsKKwkJCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGJlX2FkYXB0ZXIsCisJCQkJCSAgICAgYmVfZXJyX2RldGVjdGlvbl93b3JrLndvcmspOwogCWludCBzdGF0dXMgPSAwOwogCiAJYmVfZGV0ZWN0X2Vycm9yKGFkYXB0ZXIpOwogCi0JaWYgKGFkYXB0ZXItPmh3X2Vycm9yICYmIGxhbmNlcl9jaGlwKGFkYXB0ZXIpKSB7Ci0JCXJ0bmxfbG9jaygpOwotCQluZXRpZl9kZXZpY2VfZGV0YWNoKGFkYXB0ZXItPm5ldGRldik7Ci0JCXJ0bmxfdW5sb2NrKCk7CisJaWYgKGFkYXB0ZXItPmh3X2Vycm9yKSB7CisJCWJlX2NsZWFudXAoYWRhcHRlcik7CiAKLQkJc3RhdHVzID0gbGFuY2VyX3JlY292ZXJfZnVuYyhhZGFwdGVyKTsKLQkJaWYgKCFzdGF0dXMpCi0JCQluZXRpZl9kZXZpY2VfYXR0YWNoKGFkYXB0ZXItPm5ldGRldik7CisJCS8qIEFzIG9mIG5vdyBlcnJvciByZWNvdmVyeSBzdXBwb3J0IGlzIGluIExhbmNlciBvbmx5ICovCisJCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkKKwkJCXN0YXR1cyA9IGJlX2Vycl9yZWNvdmVyKGFkYXB0ZXIpOwogCX0KIAotCS8qIEluIExhbmNlciwgZm9yIGFsbCBlcnJvcnMgb3RoZXIgdGhhbiBwcm92aXNpb25pbmcgZXJyb3IgKC1FQUdBSU4pLAotCSAqIG5vIG5lZWQgdG8gYXR0ZW1wdCBmdXJ0aGVyIHJlY292ZXJ5LgotCSAqLwotCWlmICghc3RhdHVzIHx8IHN0YXR1cyA9PSAtRUFHQUlOKQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPmZ1bmNfcmVjb3Zlcnlfd29yaywKLQkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwkvKiBBbHdheXMgYXR0ZW1wdCByZWNvdmVyeSBvbiBWRnMgKi8KKwlpZiAoIXN0YXR1cyB8fCBiZV92aXJ0Zm4oYWRhcHRlcikpCisJCWJlX3NjaGVkdWxlX2Vycl9kZXRlY3Rpb24oYWRhcHRlcik7CiB9CiAKIHN0YXRpYyB2b2lkIGJlX2xvZ19zZnBfaW5mbyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTUwODQsNyArNTE1Miw4IEBACiAJaW50IGk7CiAKIAkvKiB3aGVuIGludGVycnVwdHMgYXJlIG5vdCB5ZXQgZW5hYmxlZCwganVzdCByZWFwIGFueSBwZW5kaW5nCi0JKiBtY2MgY29tcGxldGlvbnMgKi8KKwkgKiBtY2MgY29tcGxldGlvbnMKKwkgKi8KIAlpZiAoIW5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgewogCQlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJCWJlX3Byb2Nlc3NfbWNjKGFkYXB0ZXIpOwpAQCAtNTEyMiwxMCArNTE5MSwxOTQgQEAKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwogfQogCi0vKiBJZiBhbnkgVkZzIGFyZSBhbHJlYWR5IGVuYWJsZWQgZG9uJ3QgRkxSIHRoZSBQRiAqLwotc3RhdGljIGJvb2wgYmVfcmVzZXRfcmVxdWlyZWQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCitzdGF0aWMgdm9pZCBiZV91bm1hcF9wY2lfYmFycyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlyZXR1cm4gcGNpX251bV92ZihhZGFwdGVyLT5wZGV2KSA/IGZhbHNlIDogdHJ1ZTsKKwlpZiAoYWRhcHRlci0+Y3NyKQorCQlwY2lfaW91bm1hcChhZGFwdGVyLT5wZGV2LCBhZGFwdGVyLT5jc3IpOworCWlmIChhZGFwdGVyLT5kYikKKwkJcGNpX2lvdW5tYXAoYWRhcHRlci0+cGRldiwgYWRhcHRlci0+ZGIpOworfQorCitzdGF0aWMgaW50IGRiX2JhcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikgfHwgIWJlX3BoeXNmbihhZGFwdGVyKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gNDsKK30KKworc3RhdGljIGludCBiZV9yb2NlX21hcF9wY2lfYmFycyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoc2t5aGF3a19jaGlwKGFkYXB0ZXIpKSB7CisJCWFkYXB0ZXItPnJvY2VfZGIuc2l6ZSA9IDQwOTY7CisJCWFkYXB0ZXItPnJvY2VfZGIuaW9fYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydChhZGFwdGVyLT5wZGV2LAorCQkJCQkJCSAgICAgIGRiX2JhcihhZGFwdGVyKSk7CisJCWFkYXB0ZXItPnJvY2VfZGIudG90YWxfc2l6ZSA9IHBjaV9yZXNvdXJjZV9sZW4oYWRhcHRlci0+cGRldiwKKwkJCQkJCQkgICAgICAgZGJfYmFyKGFkYXB0ZXIpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmVfbWFwX3BjaV9iYXJzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKKwl1OCBfX2lvbWVtICphZGRyOworCXUzMiBzbGlfaW50ZjsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChhZGFwdGVyLT5wZGV2LCBTTElfSU5URl9SRUdfT0ZGU0VULCAmc2xpX2ludGYpOworCWFkYXB0ZXItPnNsaV9mYW1pbHkgPSAoc2xpX2ludGYgJiBTTElfSU5URl9GQU1JTFlfTUFTSykgPj4KKwkJCQlTTElfSU5URl9GQU1JTFlfU0hJRlQ7CisJYWRhcHRlci0+dmlydGZuID0gKHNsaV9pbnRmICYgU0xJX0lOVEZfRlRfTUFTSykgPyAxIDogMDsKKworCWlmIChCRXhfY2hpcChhZGFwdGVyKSAmJiBiZV9waHlzZm4oYWRhcHRlcikpIHsKKwkJYWRhcHRlci0+Y3NyID0gcGNpX2lvbWFwKHBkZXYsIDIsIDApOworCQlpZiAoIWFkYXB0ZXItPmNzcikKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCWFkZHIgPSBwY2lfaW9tYXAocGRldiwgZGJfYmFyKGFkYXB0ZXIpLCAwKTsKKwlpZiAoIWFkZHIpCisJCWdvdG8gcGNpX21hcF9lcnI7CisJYWRhcHRlci0+ZGIgPSBhZGRyOworCisJaWYgKHNreWhhd2tfY2hpcChhZGFwdGVyKSB8fCBCRXhfY2hpcChhZGFwdGVyKSkgeworCQlpZiAoYmVfcGh5c2ZuKGFkYXB0ZXIpKSB7CisJCQkvKiBQQ0lDRkcgaXMgdGhlIDJuZCBCQVIgaW4gQkUyICovCisJCQlhZGRyID0gcGNpX2lvbWFwKHBkZXYsIEJFMl9jaGlwKGFkYXB0ZXIpID8gMSA6IDAsIDApOworCQkJaWYgKCFhZGRyKQorCQkJCWdvdG8gcGNpX21hcF9lcnI7CisJCQlhZGFwdGVyLT5wY2ljZmcgPSBhZGRyOworCQl9IGVsc2UgeworCQkJYWRhcHRlci0+cGNpY2ZnID0gYWRhcHRlci0+ZGIgKyBTUklPVl9WRl9QQ0lDRkdfT0ZGU0VUOworCQl9CisJfQorCisJYmVfcm9jZV9tYXBfcGNpX2JhcnMoYWRhcHRlcik7CisJcmV0dXJuIDA7CisKK3BjaV9tYXBfZXJyOgorCWRldl9lcnIoJnBkZXYtPmRldiwgIkVycm9yIGluIG1hcHBpbmcgUENJIEJBUnNcbiIpOworCWJlX3VubWFwX3BjaV9iYXJzKGFkYXB0ZXIpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCBiZV9kcnZfY2xlYW51cChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqbWVtID0gJmFkYXB0ZXItPm1ib3hfbWVtX2FsbG9jZWQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmFkYXB0ZXItPnBkZXYtPmRldjsKKworCWlmIChtZW0tPnZhKQorCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIG1lbS0+c2l6ZSwgbWVtLT52YSwgbWVtLT5kbWEpOworCisJbWVtID0gJmFkYXB0ZXItPnJ4X2ZpbHRlcjsKKwlpZiAobWVtLT52YSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCBtZW0tPnNpemUsIG1lbS0+dmEsIG1lbS0+ZG1hKTsKKworCW1lbSA9ICZhZGFwdGVyLT5zdGF0c19jbWQ7CisJaWYgKG1lbS0+dmEpCisJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgbWVtLT5zaXplLCBtZW0tPnZhLCBtZW0tPmRtYSk7Cit9CisKKy8qIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHZhcmlvdXMgZmllbGRzIGluIGJlX2FkYXB0ZXIgc3RydWN0ICovCitzdGF0aWMgaW50IGJlX2Rydl9pbml0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV9kbWFfbWVtICptYm94X21lbV9hbGxvYyA9ICZhZGFwdGVyLT5tYm94X21lbV9hbGxvY2VkOworCXN0cnVjdCBiZV9kbWFfbWVtICptYm94X21lbV9hbGlnbiA9ICZhZGFwdGVyLT5tYm94X21lbTsKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqcnhfZmlsdGVyID0gJmFkYXB0ZXItPnJ4X2ZpbHRlcjsKKwlzdHJ1Y3QgYmVfZG1hX21lbSAqc3RhdHNfY21kID0gJmFkYXB0ZXItPnN0YXRzX2NtZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmYWRhcHRlci0+cGRldi0+ZGV2OworCWludCBzdGF0dXMgPSAwOworCisJbWJveF9tZW1fYWxsb2MtPnNpemUgPSBzaXplb2Yoc3RydWN0IGJlX21jY19tYWlsYm94KSArIDE2OworCW1ib3hfbWVtX2FsbG9jLT52YSA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIG1ib3hfbWVtX2FsbG9jLT5zaXplLAorCQkJCQkJJm1ib3hfbWVtX2FsbG9jLT5kbWEsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIW1ib3hfbWVtX2FsbG9jLT52YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltYm94X21lbV9hbGlnbi0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfbWNjX21haWxib3gpOworCW1ib3hfbWVtX2FsaWduLT52YSA9IFBUUl9BTElHTihtYm94X21lbV9hbGxvYy0+dmEsIDE2KTsKKwltYm94X21lbV9hbGlnbi0+ZG1hID0gUFRSX0FMSUdOKG1ib3hfbWVtX2FsbG9jLT5kbWEsIDE2KTsKKwltZW1zZXQobWJveF9tZW1fYWxpZ24tPnZhLCAwLCBzaXplb2Yoc3RydWN0IGJlX21jY19tYWlsYm94KSk7CisKKwlyeF9maWx0ZXItPnNpemUgPSBzaXplb2Yoc3RydWN0IGJlX2NtZF9yZXFfcnhfZmlsdGVyKTsKKwlyeF9maWx0ZXItPnZhID0gZG1hX3phbGxvY19jb2hlcmVudChkZXYsIHJ4X2ZpbHRlci0+c2l6ZSwKKwkJCQkJICAgICZyeF9maWx0ZXItPmRtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeF9maWx0ZXItPnZhKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gZnJlZV9tYm94OworCX0KKworCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkKKwkJc3RhdHNfY21kLT5zaXplID0gc2l6ZW9mKHN0cnVjdCBsYW5jZXJfY21kX3JlcV9wcG9ydF9zdGF0cyk7CisJZWxzZSBpZiAoQkUyX2NoaXAoYWRhcHRlcikpCisJCXN0YXRzX2NtZC0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfc3RhdHNfdjApOworCWVsc2UgaWYgKEJFM19jaGlwKGFkYXB0ZXIpKQorCQlzdGF0c19jbWQtPnNpemUgPSBzaXplb2Yoc3RydWN0IGJlX2NtZF9yZXFfZ2V0X3N0YXRzX3YxKTsKKwllbHNlCisJCXN0YXRzX2NtZC0+c2l6ZSA9IHNpemVvZihzdHJ1Y3QgYmVfY21kX3JlcV9nZXRfc3RhdHNfdjIpOworCXN0YXRzX2NtZC0+dmEgPSBkbWFfemFsbG9jX2NvaGVyZW50KGRldiwgc3RhdHNfY21kLT5zaXplLAorCQkJCQkgICAgJnN0YXRzX2NtZC0+ZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXRzX2NtZC0+dmEpIHsKKwkJc3RhdHVzID0gLUVOT01FTTsKKwkJZ290byBmcmVlX3J4X2ZpbHRlcjsKKwl9CisKKwltdXRleF9pbml0KCZhZGFwdGVyLT5tYm94X2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5tY2NfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPm1jY19jcV9sb2NrKTsKKwlpbml0X2NvbXBsZXRpb24oJmFkYXB0ZXItPmV0X2NtZF9jb21wbCk7CisKKwlwY2lfc2F2ZV9zdGF0ZShhZGFwdGVyLT5wZGV2KTsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZhZGFwdGVyLT53b3JrLCBiZV93b3JrZXIpOworCUlOSVRfREVMQVlFRF9XT1JLKCZhZGFwdGVyLT5iZV9lcnJfZGV0ZWN0aW9uX3dvcmssCisJCQkgIGJlX2Vycl9kZXRlY3Rpb25fdGFzayk7CisKKwlhZGFwdGVyLT5yeF9mYyA9IHRydWU7CisJYWRhcHRlci0+dHhfZmMgPSB0cnVlOworCisJLyogTXVzdCBiZSBhIHBvd2VyIG9mIDIgb3IgZWxzZSBNT0RVTE8gd2lsbCBCVUdfT04gKi8KKwlhZGFwdGVyLT5iZV9nZXRfdGVtcF9mcmVxID0gNjQ7CisKKwlyZXR1cm4gMDsKKworZnJlZV9yeF9maWx0ZXI6CisJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LCByeF9maWx0ZXItPnNpemUsIHJ4X2ZpbHRlci0+dmEsIHJ4X2ZpbHRlci0+ZG1hKTsKK2ZyZWVfbWJveDoKKwlkbWFfZnJlZV9jb2hlcmVudChkZXYsIG1ib3hfbWVtX2FsbG9jLT5zaXplLCBtYm94X21lbV9hbGxvYy0+dmEsCisJCQkgIG1ib3hfbWVtX2FsbG9jLT5kbWEpOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIGJlX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmICghYWRhcHRlcikKKwkJcmV0dXJuOworCisJYmVfcm9jZV9kZXZfcmVtb3ZlKGFkYXB0ZXIpOworCWJlX2ludHJfc2V0KGFkYXB0ZXIsIGZhbHNlKTsKKworCWJlX2NhbmNlbF9lcnJfZGV0ZWN0aW9uKGFkYXB0ZXIpOworCisJdW5yZWdpc3Rlcl9uZXRkZXYoYWRhcHRlci0+bmV0ZGV2KTsKKworCWJlX2NsZWFyKGFkYXB0ZXIpOworCisJLyogdGVsbCBmdyB3ZSdyZSBkb25lIHdpdGggZmlyaW5nIGNtZHMgKi8KKwliZV9jbWRfZndfY2xlYW4oYWRhcHRlcik7CisKKwliZV91bm1hcF9wY2lfYmFycyhhZGFwdGVyKTsKKwliZV9kcnZfY2xlYW51cChhZGFwdGVyKTsKKworCXBjaV9kaXNhYmxlX3BjaWVfZXJyb3JfcmVwb3J0aW5nKHBkZXYpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CisKKwlmcmVlX25ldGRldihhZGFwdGVyLT5uZXRkZXYpOwogfQogCiBzdGF0aWMgY2hhciAqbWNfbmFtZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTUyMjYsNTAgKzU0NzksMTcgQEAKIAlpZiAoIXN0YXR1cykKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwgIlBDSWUgZXJyb3IgcmVwb3J0aW5nIGVuYWJsZWRcbiIpOwogCi0Jc3RhdHVzID0gYmVfY3RybF9pbml0KGFkYXB0ZXIpOworCXN0YXR1cyA9IGJlX21hcF9wY2lfYmFycyhhZGFwdGVyKTsKIAlpZiAoc3RhdHVzKQogCQlnb3RvIGZyZWVfbmV0ZGV2OwogCi0JLyogc3luYyB1cCB3aXRoIGZ3J3MgcmVhZHkgc3RhdGUgKi8KLQlpZiAoYmVfcGh5c2ZuKGFkYXB0ZXIpKSB7Ci0JCXN0YXR1cyA9IGJlX2Z3X3dhaXRfcmVhZHkoYWRhcHRlcik7Ci0JCWlmIChzdGF0dXMpCi0JCQlnb3RvIGN0cmxfY2xlYW47Ci0JfQotCi0JaWYgKGJlX3Jlc2V0X3JlcXVpcmVkKGFkYXB0ZXIpKSB7Ci0JCXN0YXR1cyA9IGJlX2NtZF9yZXNldF9mdW5jdGlvbihhZGFwdGVyKTsKLQkJaWYgKHN0YXR1cykKLQkJCWdvdG8gY3RybF9jbGVhbjsKLQotCQkvKiBXYWl0IGZvciBpbnRlcnJ1cHRzIHRvIHF1aWVzY2UgYWZ0ZXIgYW4gRkxSICovCi0JCW1zbGVlcCgxMDApOwotCX0KLQotCS8qIEFsbG93IGludGVycnVwdHMgZm9yIG90aGVyIFVMUHMgcnVubmluZyBvbiBOSUMgZnVuY3Rpb24gKi8KLQliZV9pbnRyX3NldChhZGFwdGVyLCB0cnVlKTsKLQotCS8qIHRlbGwgZncgd2UncmUgcmVhZHkgdG8gZmlyZSBjbWRzICovCi0Jc3RhdHVzID0gYmVfY21kX2Z3X2luaXQoYWRhcHRlcik7CisJc3RhdHVzID0gYmVfZHJ2X2luaXQoYWRhcHRlcik7CiAJaWYgKHN0YXR1cykKLQkJZ290byBjdHJsX2NsZWFuOwotCi0Jc3RhdHVzID0gYmVfc3RhdHNfaW5pdChhZGFwdGVyKTsKLQlpZiAoc3RhdHVzKQotCQlnb3RvIGN0cmxfY2xlYW47Ci0KLQlzdGF0dXMgPSBiZV9nZXRfaW5pdGlhbF9jb25maWcoYWRhcHRlcik7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBzdGF0c19jbGVhbjsKLQotCUlOSVRfREVMQVlFRF9XT1JLKCZhZGFwdGVyLT53b3JrLCBiZV93b3JrZXIpOwotCUlOSVRfREVMQVlFRF9XT1JLKCZhZGFwdGVyLT5mdW5jX3JlY292ZXJ5X3dvcmssIGJlX2Z1bmNfcmVjb3ZlcnlfdGFzayk7Ci0JYWRhcHRlci0+cnhfZmMgPSB0cnVlOwotCWFkYXB0ZXItPnR4X2ZjID0gdHJ1ZTsKKwkJZ290byB1bm1hcF9iYXJzOwogCiAJc3RhdHVzID0gYmVfc2V0dXAoYWRhcHRlcik7CiAJaWYgKHN0YXR1cykKLQkJZ290byBzdGF0c19jbGVhbjsKKwkJZ290byBkcnZfY2xlYW51cDsKIAogCWJlX25ldGRldl9pbml0KG5ldGRldik7CiAJc3RhdHVzID0gcmVnaXN0ZXJfbmV0ZGV2KG5ldGRldik7CkBAIC01Mjc4LDggKzU0OTgsNyBAQAogCiAJYmVfcm9jZV9kZXZfYWRkKGFkYXB0ZXIpOwogCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZGFwdGVyLT5mdW5jX3JlY292ZXJ5X3dvcmssCi0JCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwliZV9zY2hlZHVsZV9lcnJfZGV0ZWN0aW9uKGFkYXB0ZXIpOwogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzOiAlcyAlcyBwb3J0ICVjXG4iLCBuaWNfbmFtZShwZGV2KSwKIAkJIGZ1bmNfbmFtZShhZGFwdGVyKSwgbWNfbmFtZShhZGFwdGVyKSwgYWRhcHRlci0+cG9ydF9uYW1lKTsKQEAgLTUyODgsMTAgKzU1MDcsMTAgQEAKIAogdW5zZXR1cDoKIAliZV9jbGVhcihhZGFwdGVyKTsKLXN0YXRzX2NsZWFuOgotCWJlX3N0YXRzX2NsZWFudXAoYWRhcHRlcik7Ci1jdHJsX2NsZWFuOgotCWJlX2N0cmxfY2xlYW51cChhZGFwdGVyKTsKK2Rydl9jbGVhbnVwOgorCWJlX2Rydl9jbGVhbnVwKGFkYXB0ZXIpOwordW5tYXBfYmFyczoKKwliZV91bm1hcF9wY2lfYmFycyhhZGFwdGVyKTsKIGZyZWVfbmV0ZGV2OgogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiByZWxfcmVnOgpAQCAtNTMwNiwyMSArNTUyNSwxNCBAQAogc3RhdGljIGludCBiZV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9ICBhZGFwdGVyLT5uZXRkZXY7CiAKIAlpZiAoYWRhcHRlci0+d29sX2VuKQogCQliZV9zZXR1cF93b2woYWRhcHRlciwgdHJ1ZSk7CiAKIAliZV9pbnRyX3NldChhZGFwdGVyLCBmYWxzZSk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZhZGFwdGVyLT5mdW5jX3JlY292ZXJ5X3dvcmspOworCWJlX2NhbmNlbF9lcnJfZGV0ZWN0aW9uKGFkYXB0ZXIpOwogCi0JbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOwotCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKLQkJcnRubF9sb2NrKCk7Ci0JCWJlX2Nsb3NlKG5ldGRldik7Ci0JCXJ0bmxfdW5sb2NrKCk7Ci0JfQotCWJlX2NsZWFyKGFkYXB0ZXIpOworCWJlX2NsZWFudXAoYWRhcHRlcik7CiAKIAlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CkBAIC01MzI4LDEzICs1NTQwLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYmVfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGludCBiZV9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCWludCBzdGF0dXMgPSAwOwogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSAgYWRhcHRlci0+bmV0ZGV2OwotCi0JbmV0aWZfZGV2aWNlX2RldGFjaChuZXRkZXYpOworCWludCBzdGF0dXMgPSAwOwogCiAJc3RhdHVzID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHN0YXR1cykKQEAgLTUzNDMsMzAgKzU1NTIsMTEgQEAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiAKLQlzdGF0dXMgPSBiZV9md193YWl0X3JlYWR5KGFkYXB0ZXIpOworCXN0YXR1cyA9IGJlX3Jlc3VtZShhZGFwdGVyKTsKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCi0Jc3RhdHVzID0gYmVfY21kX3Jlc2V0X2Z1bmN0aW9uKGFkYXB0ZXIpOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7Ci0KLQliZV9pbnRyX3NldChhZGFwdGVyLCB0cnVlKTsKLQkvKiB0ZWxsIGZ3IHdlJ3JlIHJlYWR5IHRvIGZpcmUgY21kcyAqLwotCXN0YXR1cyA9IGJlX2NtZF9md19pbml0KGFkYXB0ZXIpOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7Ci0KLQliZV9zZXR1cChhZGFwdGVyKTsKLQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7Ci0JCXJ0bmxfbG9jaygpOwotCQliZV9vcGVuKG5ldGRldik7Ci0JCXJ0bmxfdW5sb2NrKCk7Ci0JfQotCi0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZhZGFwdGVyLT5mdW5jX3JlY292ZXJ5X3dvcmssCi0JCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKLQluZXRpZl9kZXZpY2VfYXR0YWNoKG5ldGRldik7CisJYmVfc2NoZWR1bGVfZXJyX2RldGVjdGlvbihhZGFwdGVyKTsKIAogCWlmIChhZGFwdGVyLT53b2xfZW4pCiAJCWJlX3NldHVwX3dvbChhZGFwdGVyLCBmYWxzZSk7CkBAIC01Mzg2LDcgKzU1NzYsNyBAQAogCiAJYmVfcm9jZV9kZXZfc2h1dGRvd24oYWRhcHRlcik7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZhZGFwdGVyLT53b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmFkYXB0ZXItPmZ1bmNfcmVjb3Zlcnlfd29yayk7CisJYmVfY2FuY2VsX2Vycl9kZXRlY3Rpb24oYWRhcHRlcik7CiAKIAluZXRpZl9kZXZpY2VfZGV0YWNoKGFkYXB0ZXItPm5ldGRldik7CiAKQEAgLTUzOTksMjIgKzU1ODksMTUgQEAKIAkJCQkJICAgIHBjaV9jaGFubmVsX3N0YXRlX3Qgc3RhdGUpCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9ICBhZGFwdGVyLT5uZXRkZXY7CiAKIAlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJFRUggZXJyb3IgZGV0ZWN0ZWRcbiIpOwogCiAJaWYgKCFhZGFwdGVyLT5lZWhfZXJyb3IpIHsKIAkJYWRhcHRlci0+ZWVoX2Vycm9yID0gdHJ1ZTsKIAotCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmFkYXB0ZXItPmZ1bmNfcmVjb3Zlcnlfd29yayk7CisJCWJlX2NhbmNlbF9lcnJfZGV0ZWN0aW9uKGFkYXB0ZXIpOwogCi0JCXJ0bmxfbG9jaygpOwotCQluZXRpZl9kZXZpY2VfZGV0YWNoKG5ldGRldik7Ci0JCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCi0JCQliZV9jbG9zZShuZXRkZXYpOwotCQlydG5sX3VubG9jaygpOwotCi0JCWJlX2NsZWFyKGFkYXB0ZXIpOworCQliZV9jbGVhbnVwKGFkYXB0ZXIpOwogCX0KIAogCWlmIChzdGF0ZSA9PSBwY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUpCkBAIC01NDY1LDQ1ICs1NjQ4LDc1IEBACiB7CiAJaW50IHN0YXR1cyA9IDA7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9ICBhZGFwdGVyLT5uZXRkZXY7CiAKIAlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiRUVIIHJlc3VtZVxuIik7CiAKIAlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKIAotCXN0YXR1cyA9IGJlX2NtZF9yZXNldF9mdW5jdGlvbihhZGFwdGVyKTsKKwlzdGF0dXMgPSBiZV9yZXN1bWUoYWRhcHRlcik7CiAJaWYgKHN0YXR1cykKIAkJZ290byBlcnI7CiAKLQkvKiBPbiBzb21lIEJFMyBGVyB2ZXJzaW9ucywgYWZ0ZXIgYSBIVyByZXNldCwKLQkgKiBpbnRlcnJ1cHRzIHdpbGwgcmVtYWluIGRpc2FibGVkIGZvciBlYWNoIGZ1bmN0aW9uLgotCSAqIFNvLCBleHBsaWNpdGx5IGVuYWJsZSBpbnRlcnJ1cHRzCi0JICovCi0JYmVfaW50cl9zZXQoYWRhcHRlciwgdHJ1ZSk7Ci0KLQkvKiB0ZWxsIGZ3IHdlJ3JlIHJlYWR5IHRvIGZpcmUgY21kcyAqLwotCXN0YXR1cyA9IGJlX2NtZF9md19pbml0KGFkYXB0ZXIpOwotCWlmIChzdGF0dXMpCi0JCWdvdG8gZXJyOwotCi0Jc3RhdHVzID0gYmVfc2V0dXAoYWRhcHRlcik7Ci0JaWYgKHN0YXR1cykKLQkJZ290byBlcnI7Ci0KLQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKSB7Ci0JCXN0YXR1cyA9IGJlX29wZW4obmV0ZGV2KTsKLQkJaWYgKHN0YXR1cykKLQkJCWdvdG8gZXJyOwotCX0KLQotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYWRhcHRlci0+ZnVuY19yZWNvdmVyeV93b3JrLAotCQkJICAgICAgbXNlY3NfdG9famlmZmllcygxMDAwKSk7Ci0JbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCWJlX3NjaGVkdWxlX2Vycl9kZXRlY3Rpb24oYWRhcHRlcik7CiAJcmV0dXJuOwogZXJyOgogCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkVFSCByZXN1bWUgZmFpbGVkXG4iKTsKIH0KIAorc3RhdGljIGludCBiZV9wY2lfc3Jpb3ZfY29uZmlndXJlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbnVtX3ZmcykKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1MTYgbnVtX3ZmX3FzOworCWludCBzdGF0dXM7CisKKwlpZiAoIW51bV92ZnMpCisJCWJlX3ZmX2NsZWFyKGFkYXB0ZXIpOworCisJYWRhcHRlci0+bnVtX3ZmcyA9IG51bV92ZnM7CisKKwlpZiAoYWRhcHRlci0+bnVtX3ZmcyA9PSAwICYmIHBjaV92ZnNfYXNzaWduZWQocGRldikpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwKKwkJCSAiQ2Fubm90IGRpc2FibGUgVkZzIHdoaWxlIHRoZXkgYXJlIGFzc2lnbmVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBXaGVuIHRoZSBIVyBpcyBpbiBTUklPViBjYXBhYmxlIGNvbmZpZ3VyYXRpb24sIHRoZSBQRi1wb29sIHJlc291cmNlcworCSAqIGFyZSBlcXVhbGx5IGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgbWF4LW51bWJlciBvZiBWRnMuIFRoZSB1c2VyIG1heQorCSAqIHJlcXVlc3Qgb25seSBhIHN1YnNldCBvZiB0aGUgbWF4LXZmcyB0byBiZSBlbmFibGVkLgorCSAqIEJhc2VkIG9uIG51bV92ZnMsIHJlZGlzdHJpYnV0ZSB0aGUgcmVzb3VyY2VzIGFjcm9zcyBudW1fdmZzIHNvIHRoYXQKKwkgKiBlYWNoIFZGIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gbW9yZSBudW1iZXIgb2YgcmVzb3VyY2VzLgorCSAqIFRoaXMgZmFjaWxpdHkgaXMgbm90IGF2YWlsYWJsZSBpbiBCRTMgRlcuCisJICogQWxzbywgdGhpcyBpcyBkb25lIGJ5IEZXIGluIExhbmNlciBjaGlwLgorCSAqLworCWlmIChza3loYXdrX2NoaXAoYWRhcHRlcikgJiYgIXBjaV9udW1fdmYocGRldikpIHsKKwkJbnVtX3ZmX3FzID0gYmVfY2FsY3VsYXRlX3ZmX3FzKGFkYXB0ZXIsIGFkYXB0ZXItPm51bV92ZnMpOworCQlzdGF0dXMgPSBiZV9jbWRfc2V0X3NyaW92X2NvbmZpZyhhZGFwdGVyLCBhZGFwdGVyLT5wb29sX3JlcywKKwkJCQkJCSBhZGFwdGVyLT5udW1fdmZzLCBudW1fdmZfcXMpOworCQlpZiAoc3RhdHVzKQorCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gb3B0aW1pemUgU1ItSU9WIHJlc291cmNlc1xuIik7CisJfQorCisJc3RhdHVzID0gYmVfZ2V0X3Jlc291cmNlcyhhZGFwdGVyKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gYmVfY21kX3N0YXR1cyhzdGF0dXMpOworCisJLyogVXBkYXRpbmcgcmVhbF9udW1fdHgvcnhfcXVldWVzKCkgcmVxdWlyZXMgcnRubF9sb2NrKCkgKi8KKwlydG5sX2xvY2soKTsKKwlzdGF0dXMgPSBiZV91cGRhdGVfcXVldWVzKGFkYXB0ZXIpOworCXJ0bmxfdW5sb2NrKCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIGJlX2NtZF9zdGF0dXMoc3RhdHVzKTsKKworCWlmIChhZGFwdGVyLT5udW1fdmZzKQorCQlzdGF0dXMgPSBiZV92Zl9zZXR1cChhZGFwdGVyKTsKKworCWlmICghc3RhdHVzKQorCQlyZXR1cm4gYWRhcHRlci0+bnVtX3ZmczsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9lcnJvcl9oYW5kbGVycyBiZV9lZWhfaGFuZGxlcnMgPSB7CiAJLmVycm9yX2RldGVjdGVkID0gYmVfZWVoX2Vycl9kZXRlY3RlZCwKIAkuc2xvdF9yZXNldCA9IGJlX2VlaF9yZXNldCwKQEAgLTU1MTYsOCArNTcyOSw5IEBACiAJLnByb2JlID0gYmVfcHJvYmUsCiAJLnJlbW92ZSA9IGJlX3JlbW92ZSwKIAkuc3VzcGVuZCA9IGJlX3N1c3BlbmQsCi0JLnJlc3VtZSA9IGJlX3Jlc3VtZSwKKwkucmVzdW1lID0gYmVfcGNpX3Jlc3VtZSwKIAkuc2h1dGRvd24gPSBiZV9zaHV0ZG93biwKKwkuc3Jpb3ZfY29uZmlndXJlID0gYmVfcGNpX3NyaW92X2NvbmZpZ3VyZSwKIAkuZXJyX2hhbmRsZXIgPSAmYmVfZWVoX2hhbmRsZXJzCiB9OwogCkBAIC01NTMxLDYgKzU3NDUsMTEgQEAKIAkJcnhfZnJhZ19zaXplID0gMjA0ODsKIAl9CiAKKwlpZiAobnVtX3ZmcyA+IDApIHsKKwkJcHJfaW5mbyhEUlZfTkFNRSAiIDogTW9kdWxlIHBhcmFtIG51bV92ZnMgaXMgb2Jzb2xldGUuIik7CisJCXByX2luZm8oRFJWX05BTUUgIiA6IFVzZSBzeXNmcyBtZXRob2QgdG8gZW5hYmxlIFZGc1xuIik7CisJfQorCiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJlX2RyaXZlcik7CiB9CiBtb2R1bGVfaW5pdChiZV9pbml0X21vZHVsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9ldGhvYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZXRob2MuYwppbmRleCBmODhjZmFhLi40NDI0MTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9ldGhvYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2V0aG9jLmMKQEAgLTEyOTksNyArMTI5OSw3IEBACiAjIGRlZmluZSBldGhvY19yZXN1bWUgIE5VTEwKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBldGhvY19tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZXRob2NfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIm9wZW5jb3JlcyxldGhvYyIsIH0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvS2NvbmZpZwppbmRleCBiYTg0YzRhLi4yNWUzNDI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvS2NvbmZpZwpAQCAtNTgsMTQgKzU4LDEyIEBACiAKIGNvbmZpZyBGU0xfUFFfTURJTwogCXRyaXN0YXRlICJGcmVlc2NhbGUgUFEgTURJTyIKLQlkZXBlbmRzIG9uIEZTTF9TT0MKIAlzZWxlY3QgUEhZTElCCiAJLS0taGVscC0tLQogCSAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIE1ESU8gYnVzIHVzZWQgYnkgdGhlIGdpYW5mYXIgYW5kIFVDQyBkcml2ZXJzLgogCiBjb25maWcgRlNMX1hHTUFDX01ESU8KIAl0cmlzdGF0ZSAiRnJlZXNjYWxlIFhHTUFDIE1ESU8iCi0JZGVwZW5kcyBvbiBGU0xfU09DCiAJc2VsZWN0IFBIWUxJQgogCXNlbGVjdCBPRl9NRElPCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZlY19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX21haW4uYwppbmRleCA5OTQ5MmI3Li5mNmEzYTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX21haW4uYwpAQCAtMTE4OSwxMyArMTE4OSwxMiBAQAogZmVjX2VuZXRfdHhfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUxNiBxdWV1ZV9pZCkKIHsKIAlzdHJ1Y3QJZmVjX2VuZXRfcHJpdmF0ZSAqZmVwOwotCXN0cnVjdCBidWZkZXNjICpiZHAsICpiZHBfdDsKKwlzdHJ1Y3QgYnVmZGVzYyAqYmRwOwogCXVuc2lnbmVkIHNob3J0IHN0YXR1czsKIAlzdHJ1Y3QJc2tfYnVmZgkqc2tiOwogCXN0cnVjdCBmZWNfZW5ldF9wcml2X3R4X3EgKnR4cTsKIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpucTsKIAlpbnQJaW5kZXggPSAwOwotCWludAlpLCBiZG51bTsKIAlpbnQJZW50cmllc19mcmVlOwogCiAJZmVwID0gbmV0ZGV2X3ByaXYobmRldik7CkBAIC0xMjE2LDI5ICsxMjE1LDE4IEBACiAJCWlmIChiZHAgPT0gdHhxLT5jdXJfdHgpCiAJCQlicmVhazsKIAotCQliZHBfdCA9IGJkcDsKLQkJYmRudW0gPSAxOwotCQlpbmRleCA9IGZlY19lbmV0X2dldF9iZF9pbmRleCh0eHEtPnR4X2JkX2Jhc2UsIGJkcF90LCBmZXApOwotCQlza2IgPSB0eHEtPnR4X3NrYnVmZltpbmRleF07Ci0JCXdoaWxlICghc2tiKSB7Ci0JCQliZHBfdCA9IGZlY19lbmV0X2dldF9uZXh0ZGVzYyhiZHBfdCwgZmVwLCBxdWV1ZV9pZCk7Ci0JCQlpbmRleCA9IGZlY19lbmV0X2dldF9iZF9pbmRleCh0eHEtPnR4X2JkX2Jhc2UsIGJkcF90LCBmZXApOwotCQkJc2tiID0gdHhxLT50eF9za2J1ZmZbaW5kZXhdOwotCQkJYmRudW0rKzsKLQkJfQotCQlpZiAoc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyAmJgotCQkgICAgKHN0YXR1cyA9IGJkcF90LT5jYmRfc2MpICYgQkRfRU5FVF9UWF9SRUFEWSkKLQkJCWJyZWFrOworCQlpbmRleCA9IGZlY19lbmV0X2dldF9iZF9pbmRleCh0eHEtPnR4X2JkX2Jhc2UsIGJkcCwgZmVwKTsKIAotCQlmb3IgKGkgPSAwOyBpIDwgYmRudW07IGkrKykgewotCQkJaWYgKCFJU19UU09fSEVBREVSKHR4cSwgYmRwLT5jYmRfYnVmYWRkcikpCi0JCQkJZG1hX3VubWFwX3NpbmdsZSgmZmVwLT5wZGV2LT5kZXYsIGJkcC0+Y2JkX2J1ZmFkZHIsCi0JCQkJCQkgYmRwLT5jYmRfZGF0bGVuLCBETUFfVE9fREVWSUNFKTsKLQkJCWJkcC0+Y2JkX2J1ZmFkZHIgPSAwOwotCQkJaWYgKGkgPCBiZG51bSAtIDEpCi0JCQkJYmRwID0gZmVjX2VuZXRfZ2V0X25leHRkZXNjKGJkcCwgZmVwLCBxdWV1ZV9pZCk7Ci0JCX0KKwkJc2tiID0gdHhxLT50eF9za2J1ZmZbaW5kZXhdOwogCQl0eHEtPnR4X3NrYnVmZltpbmRleF0gPSBOVUxMOworCQlpZiAoIUlTX1RTT19IRUFERVIodHhxLCBiZHAtPmNiZF9idWZhZGRyKSkKKwkJCWRtYV91bm1hcF9zaW5nbGUoJmZlcC0+cGRldi0+ZGV2LCBiZHAtPmNiZF9idWZhZGRyLAorCQkJCQliZHAtPmNiZF9kYXRsZW4sIERNQV9UT19ERVZJQ0UpOworCQliZHAtPmNiZF9idWZhZGRyID0gMDsKKwkJaWYgKCFza2IpIHsKKwkJCWJkcCA9IGZlY19lbmV0X2dldF9uZXh0ZGVzYyhiZHAsIGZlcCwgcXVldWVfaWQpOworCQkJY29udGludWU7CisJCX0KIAogCQkvKiBDaGVjayBmb3IgZXJyb3JzLiAqLwogCQlpZiAoc3RhdHVzICYgKEJEX0VORVRfVFhfSEIgfCBCRF9FTkVUX1RYX0xDIHwKQEAgLTE0NzksOCArMTQ2Nyw3IEBACiAKIAkJCXZsYW5fcGFja2V0X3JjdmQgPSB0cnVlOwogCi0JCQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCBWTEFOX0hMRU4sCi0JCQkJCQkgICAgICAgZGF0YSwgKDIgKiBFVEhfQUxFTikpOworCQkJbWVtbW92ZShza2ItPmRhdGEgKyBWTEFOX0hMRU4sIGRhdGEsIEVUSF9BTEVOICogMik7CiAJCQlza2JfcHVsbChza2IsIFZMQU5fSExFTik7CiAJCX0KIApAQCAtMTk2Nyw2ICsxOTU0LDcgQEAKIAlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYobmRldik7CiAJc3RydWN0IGRldmljZV9ub2RlICpub2RlOwogCWludCBlcnIgPSAtRU5YSU8sIGk7CisJdTMyIG1paV9zcGVlZCwgaG9sZHRpbWU7CiAKIAkvKgogCSAqIFRoZSBpLk1YMjggZHVhbCBmZWMgaW50ZXJmYWNlcyBhcmUgbm90IGVxdWFsLgpAQCAtMjAwNCwxMCArMTk5MiwzMyBAQAogCSAqIFJlZmVyZW5jZSBNYW51YWwgaGFzIGFuIGVycm9yIG9uIHRoaXMsIGFuZCBnZXRzIGZpeGVkIG9uIGkuTVg2UQogCSAqIGRvY3VtZW50LgogCSAqLwotCWZlcC0+cGh5X3NwZWVkID0gRElWX1JPVU5EX1VQKGNsa19nZXRfcmF0ZShmZXAtPmNsa19pcGcpLCA1MDAwMDAwKTsKKwltaWlfc3BlZWQgPSBESVZfUk9VTkRfVVAoY2xrX2dldF9yYXRlKGZlcC0+Y2xrX2lwZyksIDUwMDAwMDApOwogCWlmIChmZXAtPnF1aXJrcyAmIEZFQ19RVUlSS19FTkVUX01BQykKLQkJZmVwLT5waHlfc3BlZWQtLTsKLQlmZXAtPnBoeV9zcGVlZCA8PD0gMTsKKwkJbWlpX3NwZWVkLS07CisJaWYgKG1paV9zcGVlZCA+IDYzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJmZWMgY2xvY2sgKCVsdSkgdG8gZmFzdCB0byBnZXQgcmlnaHQgbWlpIHNwZWVkXG4iLAorCQkJY2xrX2dldF9yYXRlKGZlcC0+Y2xrX2lwZykpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJLyoKKwkgKiBUaGUgaS5NWDI4IGFuZCBpLk1YNiB0eXBlcyBoYXZlIGFub3RoZXIgZmlsZWQgaW4gdGhlIE1TQ1IgKGFrYQorCSAqIE1JSV9TUEVFRCkgcmVnaXN0ZXIgdGhhdCBkZWZpbmVzIHRoZSBNRElPIG91dHB1dCBob2xkIHRpbWUuIEVhcmxpZXIKKwkgKiB2ZXJzaW9ucyBhcmUgUkFaIHRoZXJlLCBzbyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBhbmQgd3JpdGUgdGhlCisJICogcmVnaXN0ZXIgYWx3YXlzLgorCSAqIFRoZSBtaW5pbWFsIGhvbGQgdGltZSBhY2NvcmRpbmcgdG8gSUVFODAyLjMgKGNsYXVzZSAyMikgaXMgMTAgbnMuCisJICogSE9MRFRJTUUgKyAxIGlzIHRoZSBudW1iZXIgb2YgY2xrIGN5Y2xlcyB0aGUgZmVjIGlzIGhvbGRpbmcgdGhlCisJICogb3V0cHV0LgorCSAqIFRoZSBIT0xEVElNRSBiaXRmaWVsZCB0YWtlcyB2YWx1ZXMgYmV0d2VlbiAwIGFuZCA3IChpbmNsdXNpdmUpLgorCSAqIEdpdmVuIHRoYXQgY2VpbChjbGtyYXRlIC8gNTAwMDAwMCkgPD0gNjQsIHRoZSBjYWxjdWxhdGlvbiBmb3IKKwkgKiBob2xkdGltZSBjYW5ub3QgcmVzdWx0IGluIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDMuCisJICovCisJaG9sZHRpbWUgPSBESVZfUk9VTkRfVVAoY2xrX2dldF9yYXRlKGZlcC0+Y2xrX2lwZyksIDEwMDAwMDAwMCkgLSAxOworCisJZmVwLT5waHlfc3BlZWQgPSBtaWlfc3BlZWQgPDwgMSB8IGhvbGR0aW1lIDw8IDg7CisKIAl3cml0ZWwoZmVwLT5waHlfc3BlZWQsIGZlcC0+aHdwICsgRkVDX01JSV9TUEVFRCk7CiAKIAlmZXAtPm1paV9idXMgPSBtZGlvYnVzX2FsbG9jKCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX21wYzUyeHguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbXBjNTJ4eC5jCmluZGV4IGY0OTU3OTYuLmFmZTdmMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbXBjNTJ4eC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbXBjNTJ4eC5jCkBAIC0xMDU3LDcgKzEwNTcsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzUyeHhfZmVjX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1Mnh4X2ZlY19tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDBiLWZlYyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1mZWMiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAibXBjNTIwMC1mZWMiLCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZlY19tcGM1Mnh4X3BoeS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZlY19tcGM1Mnh4X3BoeS5jCmluZGV4IGUwNTI4OTAuLjFlNjQ3YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfbXBjNTJ4eF9waHkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX21wYzUyeHhfcGh5LmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1Mnh4X2ZlY19tZGlvX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1Mnh4X2ZlY19tZGlvX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItbWRpbyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1tZGlvIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gIm1wYzUyMDBiLWZlYy1waHkiLCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZlY19wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWNfcHRwLmMKaW5kZXggMWY5Y2YyMy4uYTU4M2Q4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZlY19wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjX3B0cC5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJICovCiAJCXdyaXRlbChGRUNfVF9URl9NQVNLLCBmZXAtPmh3cCArIEZFQ19UQ1NSKGZlcC0+cHBzX2NoYW5uZWwpKTsKIAotCQkvKiBJdCBpcyByZWNvbW1lbmRlZCB0byBkb3VsYmUgY2hlY2sgdGhlIFRNT0RFIGZpZWxkIGluIHRoZQorCQkvKiBJdCBpcyByZWNvbW1lbmRlZCB0byBkb3VibGUgY2hlY2sgdGhlIFRNT0RFIGZpZWxkIGluIHRoZQogCQkgKiBUQ1NSIHJlZ2lzdGVyIHRvIGJlIGNsZWFyZWQgYmVmb3JlIHRoZSBmaXJzdCBjb21wYXJlIGNvdW50ZXIKIAkJICogaXMgd3JpdHRlbiBpbnRvIFRDQ1IgcmVnaXN0ZXIuIEp1c3QgYWRkIGEgZG91YmxlIGNoZWNrLgogCQkgKi8KQEAgLTM5MCwyMCArMzkwLDE4IEBACiAgKiByZWFkIHRoZSB0aW1lY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIG9uIG5zLAogICogYWZ0ZXIgY29udmVydGluZyBpdCBpbnRvIGEgc3RydWN0IHRpbWVzcGVjLgogICovCi1zdGF0aWMgaW50IGZlY19wdHBfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgc3RydWN0IHRpbWVzcGVjICp0cykKK3N0YXRpYyBpbnQgZmVjX3B0cF9nZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJc3RydWN0IGZlY19lbmV0X3ByaXZhdGUgKmFkYXB0ZXIgPQogCSAgICBjb250YWluZXJfb2YocHRwLCBzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSwgcHRwX2NhcHMpOwogCXU2NCBuczsKLQl1MzIgcmVtYWluZGVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+dG1yZWdfbG9jaywgZmxhZ3MpOwogCW5zID0gdGltZWNvdW50ZXJfcmVhZCgmYWRhcHRlci0+dGMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnRtcmVnX2xvY2ssIGZsYWdzKTsKIAotCXRzLT50dl9zZWMgPSBkaXZfdTY0X3JlbShucywgMTAwMDAwMDAwMFVMTCwgJnJlbWFpbmRlcik7Ci0JdHMtPnR2X25zZWMgPSByZW1haW5kZXI7CisJKnRzID0gbnNfdG9fdGltZXNwZWM2NChucyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQxNyw3ICs0MTUsNyBAQAogICogd2FsbCB0aW1lciB2YWx1ZS4KICAqLwogc3RhdGljIGludCBmZWNfcHRwX3NldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCi0JCQkgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorCQkJICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPQogCSAgICBjb250YWluZXJfb2YocHRwLCBzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSwgcHRwX2NhcHMpOwpAQCAtNDMzLDggKzQzMSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW5zID0gdHMtPnR2X3NlYyAqIDEwMDAwMDAwMDBVTEw7Ci0JbnMgKz0gdHMtPnR2X25zZWM7CisJbnMgPSB0aW1lc3BlYzY0X3RvX25zKHRzKTsKIAkvKiBHZXQgdGhlIHRpbWVyIHZhbHVlIGJhc2VkIG9uIHRpbWVzdGFtcC4KIAkgKiBVcGRhdGUgdGhlIGNvdW50ZXIgd2l0aCB0aGUgbWFza2VkIHZhbHVlLgogCSAqLwpAQCAtNTg0LDggKzU4MSw4IEBACiAJZmVwLT5wdHBfY2Fwcy5wcHMgPSAxOwogCWZlcC0+cHRwX2NhcHMuYWRqZnJlcSA9IGZlY19wdHBfYWRqZnJlcTsKIAlmZXAtPnB0cF9jYXBzLmFkanRpbWUgPSBmZWNfcHRwX2FkanRpbWU7Ci0JZmVwLT5wdHBfY2Fwcy5nZXR0aW1lID0gZmVjX3B0cF9nZXR0aW1lOwotCWZlcC0+cHRwX2NhcHMuc2V0dGltZSA9IGZlY19wdHBfc2V0dGltZTsKKwlmZXAtPnB0cF9jYXBzLmdldHRpbWU2NCA9IGZlY19wdHBfZ2V0dGltZTsKKwlmZXAtPnB0cF9jYXBzLnNldHRpbWU2NCA9IGZlY19wdHBfc2V0dGltZTsKIAlmZXAtPnB0cF9jYXBzLmVuYWJsZSA9IGZlY19wdHBfZW5hYmxlOwogCiAJZmVwLT5jeWNsZV9zcGVlZCA9IGNsa19nZXRfcmF0ZShmZXAtPmNsa19wdHApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvZnNfZW5ldC1tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LW1haW4uYwppbmRleCBhMTc2Mjg3Li45YjM2MzllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LW1haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LW1haW4uYwpAQCAtOTE2LDcgKzkxNiw3IEBACiAjZW5kaWYKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzX2VuZXRfbWF0Y2hbXTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzX2VuZXRfbWF0Y2hbXTsKIHN0YXRpYyBpbnQgZnNfZW5ldF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKIHsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKQEAgLTEwODIsNyArMTA4Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzX2VuZXRfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzX2VuZXRfbWF0Y2hbXSA9IHsKICNpZmRlZiBDT05GSUdfRlNfRU5FVF9IQVNfU0NDCiAJewogCQkuY29tcGF0aWJsZSA9ICJmc2wsY3BtMS1zY2MtZW5ldCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9taWktYml0YmFuZy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWlpLWJpdGJhbmcuYwppbmRleCAxZDU2MTdkLi42OGE0MjhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9taWktYml0YmFuZy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21paS1iaXRiYW5nLmMKQEAgLTIxMyw3ICsyMTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBmc19lbmV0X21kaW9fYmJfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzX2VuZXRfbWRpb19iYl9tYXRjaFtdID0gewogCXsKIAkJLmNvbXBhdGlibGUgPSAiZnNsLGNwbTItbWRpby1iaXRiYW5nIiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWlpLWZlYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWlpLWZlYy5jCmluZGV4IDE2NDhlMzUuLjJiZTM4M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21paS1mZWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9taWktZmVjLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBmc19lbmV0X21kaW9fZmVjX21hdGNoW107CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmc19lbmV0X21kaW9fZmVjX21hdGNoW107CiBzdGF0aWMgaW50IGZzX2VuZXRfbWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvZmRldikKIHsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaDsKQEAgLTIwOCw3ICsyMDgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBmc19lbmV0X21kaW9fZmVjX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmc19lbmV0X21kaW9fZmVjX21hdGNoW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJmc2wscHExLWZlYy1tZGlvIiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzbF9wcV9tZGlvLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNsX3BxX21kaW8uYwppbmRleCBkMWE5MWUzLi4zYzQwZjZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNsX3BxX21kaW8uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNsX3BxX21kaW8uYwpAQCAtMjk0LDcgKzI5NCw3IEBACiAKICNlbmRpZgogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBmc2xfcHFfbWRpb19tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX3BxX21kaW9fbWF0Y2hbXSA9IHsKICNpZiBkZWZpbmVkKENPTkZJR19HSUFORkFSKSB8fCBkZWZpbmVkKENPTkZJR19HSUFORkFSX01PRFVMRSkKIAl7CiAJCS5jb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuYwppbmRleCA3YmYzNjgyLi40ZWUwODBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmMKQEAgLTE1OCw3ICsxNTgsNyBAQAogewogCXUzMiBsc3RhdHVzOwogCi0JYmRwLT5idWZQdHIgPSBidWY7CisJYmRwLT5idWZQdHIgPSBjcHVfdG9fYmUzMihidWYpOwogCiAJbHN0YXR1cyA9IEJEX0xGTEFHKFJYQkRfRU1QVFkgfCBSWEJEX0lOVEVSUlVQVCk7CiAJaWYgKGJkcCA9PSByeF9xdWV1ZS0+cnhfYmRfYmFzZSArIHJ4X3F1ZXVlLT5yeF9yaW5nX3NpemUgLSAxKQpAQCAtMTY2LDcgKzE2Niw3IEBACiAKIAlnZmFyX3dtYigpOwogCi0JYmRwLT5sc3RhdHVzID0gbHN0YXR1czsKKwliZHAtPmxzdGF0dXMgPSBjcHVfdG9fYmUzMihsc3RhdHVzKTsKIH0KIAogc3RhdGljIGludCBnZmFyX2luaXRfYmRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQpAQCAtMjAwLDcgKzIwMCw4IEBACiAKIAkJLyogU2V0IHRoZSBsYXN0IGRlc2NyaXB0b3IgaW4gdGhlIHJpbmcgdG8gaW5kaWNhdGUgd3JhcCAqLwogCQl0eGJkcC0tOwotCQl0eGJkcC0+c3RhdHVzIHw9IFRYQkRfV1JBUDsKKwkJdHhiZHAtPnN0YXR1cyA9IGNwdV90b19iZTE2KGJlMTZfdG9fY3B1KHR4YmRwLT5zdGF0dXMpIHwKKwkJCQkJICAgIFRYQkRfV1JBUCk7CiAJfQogCiAJcmZicHRyID0gJnJlZ3MtPnJmYnB0cjA7CkBAIC0yMTQsNyArMjE1LDcgQEAKIAkJCXN0cnVjdCBza19idWZmICpza2IgPSByeF9xdWV1ZS0+cnhfc2tidWZmW2pdOwogCiAJCQlpZiAoc2tiKSB7Ci0JCQkJYnVmYWRkciA9IHJ4YmRwLT5idWZQdHI7CisJCQkJYnVmYWRkciA9IGJlMzJfdG9fY3B1KHJ4YmRwLT5idWZQdHIpOwogCQkJfSBlbHNlIHsKIAkJCQlza2IgPSBnZmFyX25ld19za2IobmRldiwgJmJ1ZmFkZHIpOwogCQkJCWlmICghc2tiKSB7CkBAIC02OTYsMTkgKzY5NywyOCBAQAogCWdycC0+cHJpdiA9IHByaXY7CiAJc3Bpbl9sb2NrX2luaXQoJmdycC0+Z3JwbG9jayk7CiAJaWYgKHByaXYtPm1vZGUgPT0gTVFfTUdfTU9ERSkgewotCQl1MzIgKnJ4cV9tYXNrLCAqdHhxX21hc2s7Ci0JCXJ4cV9tYXNrID0gKHUzMiAqKW9mX2dldF9wcm9wZXJ0eShucCwgImZzbCxyeC1iaXQtbWFwIiwgTlVMTCk7Ci0JCXR4cV9tYXNrID0gKHUzMiAqKW9mX2dldF9wcm9wZXJ0eShucCwgImZzbCx0eC1iaXQtbWFwIiwgTlVMTCk7CisJCXUzMiByeHFfbWFzaywgdHhxX21hc2s7CisJCWludCByZXQ7CisKKwkJZ3JwLT5yeF9iaXRfbWFwID0gKERFRkFVTFRfTUFQUElORyA+PiBwcml2LT5udW1fZ3Jwcyk7CisJCWdycC0+dHhfYml0X21hcCA9IChERUZBVUxUX01BUFBJTkcgPj4gcHJpdi0+bnVtX2dycHMpOworCisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZnNsLHJ4LWJpdC1tYXAiLCAmcnhxX21hc2spOworCQlpZiAoIXJldCkgeworCQkJZ3JwLT5yeF9iaXRfbWFwID0gcnhxX21hc2sgPworCQkJcnhxX21hc2sgOiAoREVGQVVMVF9NQVBQSU5HID4+IHByaXYtPm51bV9ncnBzKTsKKwkJfQorCisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZnNsLHR4LWJpdC1tYXAiLCAmdHhxX21hc2spOworCQlpZiAoIXJldCkgeworCQkJZ3JwLT50eF9iaXRfbWFwID0gdHhxX21hc2sgPworCQkJdHhxX21hc2sgOiAoREVGQVVMVF9NQVBQSU5HID4+IHByaXYtPm51bV9ncnBzKTsKKwkJfQogCiAJCWlmIChwcml2LT5wb2xsX21vZGUgPT0gR0ZBUl9TUV9QT0xMSU5HKSB7CiAJCQkvKiBPbmUgUSBwZXIgaW50ZXJydXB0IGdyb3VwOiBRMCB0byBHMCwgUTEgdG8gRzEgKi8KIAkJCWdycC0+cnhfYml0X21hcCA9IChERUZBVUxUX01BUFBJTkcgPj4gcHJpdi0+bnVtX2dycHMpOwogCQkJZ3JwLT50eF9iaXRfbWFwID0gKERFRkFVTFRfTUFQUElORyA+PiBwcml2LT5udW1fZ3Jwcyk7Ci0JCX0gZWxzZSB7IC8qIEdGQVJfTVFfUE9MTElORyAqLwotCQkJZ3JwLT5yeF9iaXRfbWFwID0gcnhxX21hc2sgPwotCQkJKnJ4cV9tYXNrIDogKERFRkFVTFRfTUFQUElORyA+PiBwcml2LT5udW1fZ3Jwcyk7Ci0JCQlncnAtPnR4X2JpdF9tYXAgPSB0eHFfbWFzayA/Ci0JCQkqdHhxX21hc2sgOiAoREVGQVVMVF9NQVBQSU5HID4+IHByaXYtPm51bV9ncnBzKTsKIAkJfQogCX0gZWxzZSB7CiAJCWdycC0+cnhfYml0X21hcCA9IDB4RkY7CkBAIC03NjksMTEgKzc3OSwxMCBAQAogCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBOVUxMOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBvZmRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCA9IE5VTEw7Ci0JY29uc3QgdTMyICpzdGFzaDsKLQljb25zdCB1MzIgKnN0YXNoX2xlbjsKLQljb25zdCB1MzIgKnN0YXNoX2lkeDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnN0YXNoOworCXUzMiBzdGFzaF9sZW4gPSAwOworCXUzMiBzdGFzaF9pZHggPSAwOwogCXVuc2lnbmVkIGludCBudW1fdHhfcXMsIG51bV9yeF9xczsKLQl1MzIgKnR4X3F1ZXVlcywgKnJ4X3F1ZXVlczsKIAl1bnNpZ25lZCBzaG9ydCBtb2RlLCBwb2xsX21vZGU7CiAKIAlpZiAoIW5wKQpAQCAtNzg3LDEwICs3OTYsNiBAQAogCQlwb2xsX21vZGUgPSBHRkFSX1NRX1BPTExJTkc7CiAJfQogCi0JLyogcGFyc2UgdGhlIG51bSBvZiBIVyB0eCBhbmQgcnggcXVldWVzICovCi0JdHhfcXVldWVzID0gKHUzMiAqKW9mX2dldF9wcm9wZXJ0eShucCwgImZzbCxudW1fdHhfcXVldWVzIiwgTlVMTCk7Ci0JcnhfcXVldWVzID0gKHUzMiAqKW9mX2dldF9wcm9wZXJ0eShucCwgImZzbCxudW1fcnhfcXVldWVzIiwgTlVMTCk7Ci0KIAlpZiAobW9kZSA9PSBTUV9TR19NT0RFKSB7CiAJCW51bV90eF9xcyA9IDE7CiAJCW51bV9yeF9xcyA9IDE7CkBAIC04MDksOCArODE0LDE3IEBACiAJCQludW1fdHhfcXMgPSBudW1fZ3JwczsgLyogb25lIHR4cSBwZXIgaW50IGdyb3VwICovCiAJCQludW1fcnhfcXMgPSBudW1fZ3JwczsgLyogb25lIHJ4cSBwZXIgaW50IGdyb3VwICovCiAJCX0gZWxzZSB7IC8qIEdGQVJfTVFfUE9MTElORyAqLwotCQkJbnVtX3R4X3FzID0gdHhfcXVldWVzID8gKnR4X3F1ZXVlcyA6IDE7Ci0JCQludW1fcnhfcXMgPSByeF9xdWV1ZXMgPyAqcnhfcXVldWVzIDogMTsKKwkJCXUzMiB0eF9xdWV1ZXMsIHJ4X3F1ZXVlczsKKwkJCWludCByZXQ7CisKKwkJCS8qIHBhcnNlIHRoZSBudW0gb2YgSFcgdHggYW5kIHJ4IHF1ZXVlcyAqLworCQkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmc2wsbnVtX3R4X3F1ZXVlcyIsCisJCQkJCQkgICAmdHhfcXVldWVzKTsKKwkJCW51bV90eF9xcyA9IHJldCA/IDEgOiB0eF9xdWV1ZXM7CisKKwkJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZnNsLG51bV9yeF9xdWV1ZXMiLAorCQkJCQkJICAgJnJ4X3F1ZXVlcyk7CisJCQludW1fcnhfcXMgPSByZXQgPyAxIDogcnhfcXVldWVzOwogCQl9CiAJfQogCkBAIC04NTEsMTMgKzg2NSwxNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gcnhfYWxsb2NfZmFpbGVkOwogCisJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnAsICJtb2RlbCIsICZtb2RlbCk7CisJaWYgKGVycikgeworCQlwcl9lcnIoIkRldmljZSBtb2RlbCBwcm9wZXJ0eSBtaXNzaW5nLCBhYm9ydGluZ1xuIik7CisJCWdvdG8gcnhfYWxsb2NfZmFpbGVkOworCX0KKwogCS8qIEluaXQgUnggcXVldWUgZmlsZXIgcnVsZSBzZXQgbGlua2VkIGxpc3QgKi8KIAlJTklUX0xJU1RfSEVBRCgmcHJpdi0+cnhfbGlzdC5saXN0KTsKIAlwcml2LT5yeF9saXN0LmNvdW50ID0gMDsKIAltdXRleF9pbml0KCZwcml2LT5yeF9xdWV1ZV9hY2Nlc3MpOwogCi0JbW9kZWwgPSBvZl9nZXRfcHJvcGVydHkobnAsICJtb2RlbCIsIE5VTEwpOwotCiAJZm9yIChpID0gMDsgaSA8IE1BWEdST1VQUzsgaSsrKQogCQlwcml2LT5nZmFyZ3JwW2ldLnJlZ3MgPSBOVUxMOwogCkBAIC04NzcsMjIgKzg5NSwyMiBAQAogCQkJZ290byBlcnJfZ3JwX2luaXQ7CiAJfQogCi0Jc3Rhc2ggPSBvZl9nZXRfcHJvcGVydHkobnAsICJiZC1zdGFzaCIsIE5VTEwpOworCXN0YXNoID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgImJkLXN0YXNoIiwgTlVMTCk7CiAKIAlpZiAoc3Rhc2gpIHsKIAkJcHJpdi0+ZGV2aWNlX2ZsYWdzIHw9IEZTTF9HSUFORkFSX0RFVl9IQVNfQkRfU1RBU0hJTkc7CiAJCXByaXYtPmJkX3N0YXNoX2VuID0gMTsKIAl9CiAKLQlzdGFzaF9sZW4gPSBvZl9nZXRfcHJvcGVydHkobnAsICJyeC1zdGFzaC1sZW4iLCBOVUxMKTsKKwllcnIgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInJ4LXN0YXNoLWxlbiIsICZzdGFzaF9sZW4pOwogCi0JaWYgKHN0YXNoX2xlbikKLQkJcHJpdi0+cnhfc3Rhc2hfc2l6ZSA9ICpzdGFzaF9sZW47CisJaWYgKGVyciA9PSAwKQorCQlwcml2LT5yeF9zdGFzaF9zaXplID0gc3Rhc2hfbGVuOwogCi0Jc3Rhc2hfaWR4ID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicngtc3Rhc2gtaWR4IiwgTlVMTCk7CisJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyeC1zdGFzaC1pZHgiLCAmc3Rhc2hfaWR4KTsKIAotCWlmIChzdGFzaF9pZHgpCi0JCXByaXYtPnJ4X3N0YXNoX2luZGV4ID0gKnN0YXNoX2lkeDsKKwlpZiAoZXJyID09IDApCisJCXByaXYtPnJ4X3N0YXNoX2luZGV4ID0gc3Rhc2hfaWR4OwogCiAJaWYgKHN0YXNoX2xlbiB8fCBzdGFzaF9pZHgpCiAJCXByaXYtPmRldmljZV9mbGFncyB8PSBGU0xfR0lBTkZBUl9ERVZfSEFTX0JVRl9TVEFTSElORzsKQEAgLTkxOSwxNSArOTM3LDE1IEBACiAJCQkJICAgICBGU0xfR0lBTkZBUl9ERVZfSEFTX0VYVEVOREVEX0hBU0ggfAogCQkJCSAgICAgRlNMX0dJQU5GQVJfREVWX0hBU19USU1FUjsKIAotCWN0eXBlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5LWNvbm5lY3Rpb24tdHlwZSIsIE5VTEwpOworCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAicGh5LWNvbm5lY3Rpb24tdHlwZSIsICZjdHlwZSk7CiAKIAkvKiBXZSBvbmx5IGNhcmUgYWJvdXQgcmdtaWktaWQuICBUaGUgcmVzdCBhcmUgYXV0b2RldGVjdGVkICovCi0JaWYgKGN0eXBlICYmICFzdHJjbXAoY3R5cGUsICJyZ21paS1pZCIpKQorCWlmIChlcnIgPT0gMCAmJiAhc3RyY21wKGN0eXBlLCAicmdtaWktaWQiKSkKIAkJcHJpdi0+aW50ZXJmYWNlID0gUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX0lEOwogCWVsc2UKIAkJcHJpdi0+aW50ZXJmYWNlID0gUEhZX0lOVEVSRkFDRV9NT0RFX01JSTsKIAotCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsbWFnaWMtcGFja2V0IiwgTlVMTCkpCisJaWYgKG9mX2ZpbmRfcHJvcGVydHkobnAsICJmc2wsbWFnaWMtcGFja2V0IiwgTlVMTCkpCiAJCXByaXYtPmRldmljZV9mbGFncyB8PSBGU0xfR0lBTkZBUl9ERVZfSEFTX01BR0lDX1BBQ0tFVDsKIAogCXByaXYtPnBoeV9ub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgInBoeS1oYW5kbGUiLCAwKTsKQEAgLTE4ODQsMTQgKzE5MDIsMTUgQEAKIAkJaWYgKCF0eF9xdWV1ZS0+dHhfc2tidWZmW2ldKQogCQkJY29udGludWU7CiAKLQkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5kZXYsIHR4YmRwLT5idWZQdHIsCi0JCQkJIHR4YmRwLT5sZW5ndGgsIERNQV9UT19ERVZJQ0UpOworCQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmRldiwgYmUzMl90b19jcHUodHhiZHAtPmJ1ZlB0ciksCisJCQkJIGJlMTZfdG9fY3B1KHR4YmRwLT5sZW5ndGgpLCBETUFfVE9fREVWSUNFKTsKIAkJdHhiZHAtPmxzdGF0dXMgPSAwOwogCQlmb3IgKGogPSAwOyBqIDwgc2tiX3NoaW5mbyh0eF9xdWV1ZS0+dHhfc2tidWZmW2ldKS0+bnJfZnJhZ3M7CiAJCSAgICAgaisrKSB7CiAJCQl0eGJkcCsrOwotCQkJZG1hX3VubWFwX3BhZ2UocHJpdi0+ZGV2LCB0eGJkcC0+YnVmUHRyLAotCQkJCSAgICAgICB0eGJkcC0+bGVuZ3RoLCBETUFfVE9fREVWSUNFKTsKKwkJCWRtYV91bm1hcF9wYWdlKHByaXYtPmRldiwgYmUzMl90b19jcHUodHhiZHAtPmJ1ZlB0ciksCisJCQkJICAgICAgIGJlMTZfdG9fY3B1KHR4YmRwLT5sZW5ndGgpLAorCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKIAkJfQogCQl0eGJkcCsrOwogCQlkZXZfa2ZyZWVfc2tiX2FueSh0eF9xdWV1ZS0+dHhfc2tidWZmW2ldKTsKQEAgLTE5MTEsNyArMTkzMCw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgcnhfcXVldWUtPnJ4X3Jpbmdfc2l6ZTsgaSsrKSB7CiAJCWlmIChyeF9xdWV1ZS0+cnhfc2tidWZmW2ldKSB7Ci0JCQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmRldiwgcnhiZHAtPmJ1ZlB0ciwKKwkJCWRtYV91bm1hcF9zaW5nbGUocHJpdi0+ZGV2LCBiZTMyX3RvX2NwdShyeGJkcC0+YnVmUHRyKSwKIAkJCQkJIHByaXYtPnJ4X2J1ZmZlcl9zaXplLAogCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKIAkJCWRldl9rZnJlZV9za2JfYW55KHJ4X3F1ZXVlLT5yeF9za2J1ZmZbaV0pOwpAQCAtMjE2NywxNiArMjE4NiwxNiBAQAogCSAqLwogCWlmIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApIHsKIAkJZmxhZ3MgfD0gVFhGQ0JfVURQOwotCQlmY2ItPnBoY3MgPSB1ZHBfaGRyKHNrYiktPmNoZWNrOworCQlmY2ItPnBoY3MgPSAoX19mb3JjZSBfX2JlMTYpKHVkcF9oZHIoc2tiKS0+Y2hlY2spOwogCX0gZWxzZQotCQlmY2ItPnBoY3MgPSB0Y3BfaGRyKHNrYiktPmNoZWNrOworCQlmY2ItPnBoY3MgPSAoX19mb3JjZSBfX2JlMTYpKHRjcF9oZHIoc2tiKS0+Y2hlY2spOwogCiAJLyogbDNvcyBpcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgc3RhcnQgb2YgdGhlCiAJICogZnJhbWUgKHNrYi0+ZGF0YSkgYW5kIHRoZSBzdGFydCBvZiB0aGUgSVAgaGRyLgogCSAqIGw0b3MgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZQogCSAqIGwzIGhkciBhbmQgdGhlIGw0IGhkcgogCSAqLwotCWZjYi0+bDNvcyA9ICh1MTYpKHNrYl9uZXR3b3JrX29mZnNldChza2IpIC0gZmNiX2xlbmd0aCk7CisJZmNiLT5sM29zID0gKHU4KShza2JfbmV0d29ya19vZmZzZXQoc2tiKSAtIGZjYl9sZW5ndGgpOwogCWZjYi0+bDRvcyA9IHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKIAogCWZjYi0+ZmxhZ3MgPSBmbGFnczsKQEAgLTIxODUsNyArMjIwNCw3IEBACiB2b2lkIGlubGluZSBnZmFyX3R4X3ZsYW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHR4ZmNiICpmY2IpCiB7CiAJZmNiLT5mbGFncyB8PSBUWEZDQl9WTE47Ci0JZmNiLT52bGN0bCA9IHNrYl92bGFuX3RhZ19nZXQoc2tiKTsKKwlmY2ItPnZsY3RsID0gY3B1X3RvX2JlMTYoc2tiX3ZsYW5fdGFnX2dldChza2IpKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdHhiZDggKnNraXBfdHhiZChzdHJ1Y3QgdHhiZDggKmJkcCwgaW50IHN0cmlkZSwKQEAgLTIyOTgsNyArMjMxNyw3IEBACiAJdHhfcXVldWUtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAogCXR4YmRwID0gdHhiZHBfc3RhcnQgPSB0eF9xdWV1ZS0+Y3VyX3R4OwotCWxzdGF0dXMgPSB0eGJkcC0+bHN0YXR1czsKKwlsc3RhdHVzID0gYmUzMl90b19jcHUodHhiZHAtPmxzdGF0dXMpOwogCiAJLyogVGltZSBzdGFtcCBpbnNlcnRpb24gcmVxdWlyZXMgb25lIGFkZGl0aW9uYWwgVHhCRCAqLwogCWlmICh1bmxpa2VseShkb190c3RhbXApKQpAQCAtMjMwNiwxMSArMjMyNSwxNCBAQAogCQkJCQkJIHR4X3F1ZXVlLT50eF9yaW5nX3NpemUpOwogCiAJaWYgKG5yX2ZyYWdzID09IDApIHsKLQkJaWYgKHVubGlrZWx5KGRvX3RzdGFtcCkpCi0JCQl0eGJkcF90c3RhbXAtPmxzdGF0dXMgfD0gQkRfTEZMQUcoVFhCRF9MQVNUIHwKLQkJCQkJCQkgIFRYQkRfSU5URVJSVVBUKTsKLQkJZWxzZQorCQlpZiAodW5saWtlbHkoZG9fdHN0YW1wKSkgeworCQkJdTMyIGxzdGF0dXNfdHMgPSBiZTMyX3RvX2NwdSh0eGJkcF90c3RhbXAtPmxzdGF0dXMpOworCisJCQlsc3RhdHVzX3RzIHw9IEJEX0xGTEFHKFRYQkRfTEFTVCB8IFRYQkRfSU5URVJSVVBUKTsKKwkJCXR4YmRwX3RzdGFtcC0+bHN0YXR1cyA9IGNwdV90b19iZTMyKGxzdGF0dXNfdHMpOworCQl9IGVsc2UgewogCQkJbHN0YXR1cyB8PSBCRF9MRkxBRyhUWEJEX0xBU1QgfCBUWEJEX0lOVEVSUlVQVCk7CisJCX0KIAl9IGVsc2UgewogCQkvKiBQbGFjZSB0aGUgZnJhZ21lbnQgYWRkcmVzc2VzIGFuZCBsZW5ndGhzIGludG8gdGhlIFR4QkRzICovCiAJCWZvciAoaSA9IDA7IGkgPCBucl9mcmFnczsgaSsrKSB7CkBAIC0yMzIwLDcgKzIzNDIsNyBAQAogCiAJCQlmcmFnX2xlbiA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaV0uc2l6ZTsKIAotCQkJbHN0YXR1cyA9IHR4YmRwLT5sc3RhdHVzIHwgZnJhZ19sZW4gfAorCQkJbHN0YXR1cyA9IGJlMzJfdG9fY3B1KHR4YmRwLT5sc3RhdHVzKSB8IGZyYWdfbGVuIHwKIAkJCQkgIEJEX0xGTEFHKFRYQkRfUkVBRFkpOwogCiAJCQkvKiBIYW5kbGUgdGhlIGxhc3QgQkQgc3BlY2lhbGx5ICovCkBAIC0yMzM2LDExICsyMzU4LDExIEBACiAJCQkJZ290byBkbWFfbWFwX2VycjsKIAogCQkJLyogc2V0IHRoZSBUeEJEIGxlbmd0aCBhbmQgYnVmZmVyIHBvaW50ZXIgKi8KLQkJCXR4YmRwLT5idWZQdHIgPSBidWZhZGRyOwotCQkJdHhiZHAtPmxzdGF0dXMgPSBsc3RhdHVzOworCQkJdHhiZHAtPmJ1ZlB0ciA9IGNwdV90b19iZTMyKGJ1ZmFkZHIpOworCQkJdHhiZHAtPmxzdGF0dXMgPSBjcHVfdG9fYmUzMihsc3RhdHVzKTsKIAkJfQogCi0JCWxzdGF0dXMgPSB0eGJkcF9zdGFydC0+bHN0YXR1czsKKwkJbHN0YXR1cyA9IGJlMzJfdG9fY3B1KHR4YmRwX3N0YXJ0LT5sc3RhdHVzKTsKIAl9CiAKIAkvKiBBZGQgVHhQQUwgYmV0d2VlbiBGQ0IgYW5kIGZyYW1lIGlmIHJlcXVpcmVkICovCkBAIC0yMzg4LDcgKzI0MTAsNyBAQAogCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihwcml2LT5kZXYsIGJ1ZmFkZHIpKSkKIAkJZ290byBkbWFfbWFwX2VycjsKIAotCXR4YmRwX3N0YXJ0LT5idWZQdHIgPSBidWZhZGRyOworCXR4YmRwX3N0YXJ0LT5idWZQdHIgPSBjcHVfdG9fYmUzMihidWZhZGRyKTsKIAogCS8qIElmIHRpbWUgc3RhbXBpbmcgaXMgcmVxdWVzdGVkIG9uZSBhZGRpdGlvbmFsIFR4QkQgbXVzdCBiZSBzZXQgdXAuIFRoZQogCSAqIGZpcnN0IFR4QkQgcG9pbnRzIHRvIHRoZSBGQ0IgYW5kIG11c3QgaGF2ZSBhIGRhdGEgbGVuZ3RoIG9mCkBAIC0yMzk2LDkgKzI0MTgsMTUgQEAKIAkgKiB0aGUgZnVsbCBmcmFtZSBsZW5ndGguCiAJICovCiAJaWYgKHVubGlrZWx5KGRvX3RzdGFtcCkpIHsKLQkJdHhiZHBfdHN0YW1wLT5idWZQdHIgPSB0eGJkcF9zdGFydC0+YnVmUHRyICsgZmNiX2xlbjsKLQkJdHhiZHBfdHN0YW1wLT5sc3RhdHVzIHw9IEJEX0xGTEFHKFRYQkRfUkVBRFkpIHwKLQkJCQkJIChza2JfaGVhZGxlbihza2IpIC0gZmNiX2xlbik7CisJCXUzMiBsc3RhdHVzX3RzID0gYmUzMl90b19jcHUodHhiZHBfdHN0YW1wLT5sc3RhdHVzKTsKKworCQlidWZhZGRyID0gYmUzMl90b19jcHUodHhiZHBfc3RhcnQtPmJ1ZlB0cik7CisJCWJ1ZmFkZHIgKz0gZmNiX2xlbjsKKwkJbHN0YXR1c190cyB8PSBCRF9MRkxBRyhUWEJEX1JFQURZKSB8CisJCQkgICAgICAoc2tiX2hlYWRsZW4oc2tiKSAtIGZjYl9sZW4pOworCisJCXR4YmRwX3RzdGFtcC0+YnVmUHRyID0gY3B1X3RvX2JlMzIoYnVmYWRkcik7CisJCXR4YmRwX3RzdGFtcC0+bHN0YXR1cyA9IGNwdV90b19iZTMyKGxzdGF0dXNfdHMpOwogCQlsc3RhdHVzIHw9IEJEX0xGTEFHKFRYQkRfQ1JDIHwgVFhCRF9SRUFEWSkgfCBHTUFDX0ZDQl9MRU47CiAJfSBlbHNlIHsKIAkJbHN0YXR1cyB8PSBCRF9MRkxBRyhUWEJEX0NSQyB8IFRYQkRfUkVBRFkpIHwgc2tiX2hlYWRsZW4oc2tiKTsKQEAgLTI0MjEsNyArMjQ0OSw3IEBACiAKIAlnZmFyX3dtYigpOwogCi0JdHhiZHBfc3RhcnQtPmxzdGF0dXMgPSBsc3RhdHVzOworCXR4YmRwX3N0YXJ0LT5sc3RhdHVzID0gY3B1X3RvX2JlMzIobHN0YXR1cyk7CiAKIAlnZmFyX3dtYigpOyAvKiBmb3JjZSBsc3RhdHVzIHdyaXRlIGJlZm9yZSB0eF9za2J1ZmYgKi8KIApAQCAtMjQ2MCwxMyArMjQ4OCwxNCBAQAogCWlmIChkb190c3RhbXApCiAJCXR4YmRwID0gbmV4dF90eGJkKHR4YmRwLCBiYXNlLCB0eF9xdWV1ZS0+dHhfcmluZ19zaXplKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfZnJhZ3M7IGkrKykgewotCQlsc3RhdHVzID0gdHhiZHAtPmxzdGF0dXM7CisJCWxzdGF0dXMgPSBiZTMyX3RvX2NwdSh0eGJkcC0+bHN0YXR1cyk7CiAJCWlmICghKGxzdGF0dXMgJiBCRF9MRkxBRyhUWEJEX1JFQURZKSkpCiAJCQlicmVhazsKIAotCQl0eGJkcC0+bHN0YXR1cyA9IGxzdGF0dXMgJiB+QkRfTEZMQUcoVFhCRF9SRUFEWSk7Ci0JCWJ1ZmFkZHIgPSB0eGJkcC0+YnVmUHRyOwotCQlkbWFfdW5tYXBfcGFnZShwcml2LT5kZXYsIGJ1ZmFkZHIsIHR4YmRwLT5sZW5ndGgsCisJCWxzdGF0dXMgJj0gfkJEX0xGTEFHKFRYQkRfUkVBRFkpOworCQl0eGJkcC0+bHN0YXR1cyA9IGNwdV90b19iZTMyKGxzdGF0dXMpOworCQlidWZhZGRyID0gYmUzMl90b19jcHUodHhiZHAtPmJ1ZlB0cik7CisJCWRtYV91bm1hcF9wYWdlKHByaXYtPmRldiwgYnVmYWRkciwgYmUxNl90b19jcHUodHhiZHAtPmxlbmd0aCksCiAJCQkgICAgICAgRE1BX1RPX0RFVklDRSk7CiAJCXR4YmRwID0gbmV4dF90eGJkKHR4YmRwLCBiYXNlLCB0eF9xdWV1ZS0+dHhfcmluZ19zaXplKTsKIAl9CkBAIC0yNjA3LDcgKzI2MzYsNyBAQAogCiAJCWxiZHAgPSBza2lwX3R4YmQoYmRwLCBucl90eGJkcyAtIDEsIGJhc2UsIHR4X3Jpbmdfc2l6ZSk7CiAKLQkJbHN0YXR1cyA9IGxiZHAtPmxzdGF0dXM7CisJCWxzdGF0dXMgPSBiZTMyX3RvX2NwdShsYmRwLT5sc3RhdHVzKTsKIAogCQkvKiBPbmx5IGNsZWFuIGNvbXBsZXRlZCBmcmFtZXMgKi8KIAkJaWYgKChsc3RhdHVzICYgQkRfTEZMQUcoVFhCRF9SRUFEWSkpICYmCkBAIC0yNjE2LDExICsyNjQ1LDEyIEBACiAKIAkJaWYgKHVubGlrZWx5KHNrYl9zaGluZm8oc2tiKS0+dHhfZmxhZ3MgJiBTS0JUWF9JTl9QUk9HUkVTUykpIHsKIAkJCW5leHQgPSBuZXh0X3R4YmQoYmRwLCBiYXNlLCB0eF9yaW5nX3NpemUpOwotCQkJYnVmbGVuID0gbmV4dC0+bGVuZ3RoICsgR01BQ19GQ0JfTEVOICsgR01BQ19UWFBBTF9MRU47CisJCQlidWZsZW4gPSBiZTE2X3RvX2NwdShuZXh0LT5sZW5ndGgpICsKKwkJCQkgR01BQ19GQ0JfTEVOICsgR01BQ19UWFBBTF9MRU47CiAJCX0gZWxzZQotCQkJYnVmbGVuID0gYmRwLT5sZW5ndGg7CisJCQlidWZsZW4gPSBiZTE2X3RvX2NwdShiZHAtPmxlbmd0aCk7CiAKLQkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5kZXYsIGJkcC0+YnVmUHRyLAorCQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmRldiwgYmUzMl90b19jcHUoYmRwLT5idWZQdHIpLAogCQkJCSBidWZsZW4sIERNQV9UT19ERVZJQ0UpOwogCiAJCWlmICh1bmxpa2VseShza2Jfc2hpbmZvKHNrYiktPnR4X2ZsYWdzICYgU0tCVFhfSU5fUFJPR1JFU1MpKSB7CkBAIC0yNjMxLDE3ICsyNjYxLDE4IEBACiAJCQlzaGh3dHN0YW1wcy5od3RzdGFtcCA9IG5zX3RvX2t0aW1lKCpucyk7CiAJCQlza2JfcHVsbChza2IsIEdNQUNfRkNCX0xFTiArIEdNQUNfVFhQQUxfTEVOKTsKIAkJCXNrYl90c3RhbXBfdHgoc2tiLCAmc2hod3RzdGFtcHMpOwotCQkJYmRwLT5sc3RhdHVzICY9IEJEX0xGTEFHKFRYQkRfV1JBUCk7CisJCQlnZmFyX2NsZWFyX3R4YmRfc3RhdHVzKGJkcCk7CiAJCQliZHAgPSBuZXh0OwogCQl9CiAKLQkJYmRwLT5sc3RhdHVzICY9IEJEX0xGTEFHKFRYQkRfV1JBUCk7CisJCWdmYXJfY2xlYXJfdHhiZF9zdGF0dXMoYmRwKTsKIAkJYmRwID0gbmV4dF90eGJkKGJkcCwgYmFzZSwgdHhfcmluZ19zaXplKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgZnJhZ3M7IGkrKykgewotCQkJZG1hX3VubWFwX3BhZ2UocHJpdi0+ZGV2LCBiZHAtPmJ1ZlB0ciwKLQkJCQkgICAgICAgYmRwLT5sZW5ndGgsIERNQV9UT19ERVZJQ0UpOwotCQkJYmRwLT5sc3RhdHVzICY9IEJEX0xGTEFHKFRYQkRfV1JBUCk7CisJCQlkbWFfdW5tYXBfcGFnZShwcml2LT5kZXYsIGJlMzJfdG9fY3B1KGJkcC0+YnVmUHRyKSwKKwkJCQkgICAgICAgYmUxNl90b19jcHUoYmRwLT5sZW5ndGgpLAorCQkJCSAgICAgICBETUFfVE9fREVWSUNFKTsKKwkJCWdmYXJfY2xlYXJfdHhiZF9zdGF0dXMoYmRwKTsKIAkJCWJkcCA9IG5leHRfdHhiZChiZHAsIGJhc2UsIHR4X3Jpbmdfc2l6ZSk7CiAJCX0KIApAQCAtMjc5OCwxMyArMjgyOSwxMyBAQAogCSAqIHdlcmUgdmVyaWZpZWQsIHRoZW4gd2UgdGVsbCB0aGUga2VybmVsIHRoYXQgbm8KIAkgKiBjaGVja3N1bW1pbmcgaXMgbmVjZXNzYXJ5LiAgT3RoZXJ3aXNlLCBpdCBpcyBbRklYTUVdCiAJICovCi0JaWYgKChmY2ItPmZsYWdzICYgUlhGQ0JfQ1NVTV9NQVNLKSA9PSAoUlhGQ0JfQ0lQIHwgUlhGQ0JfQ1RVKSkKKwlpZiAoKGJlMTZfdG9fY3B1KGZjYi0+ZmxhZ3MpICYgUlhGQ0JfQ1NVTV9NQVNLKSA9PQorCSAgICAoUlhGQ0JfQ0lQIHwgUlhGQ0JfQ1RVKSkKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAllbHNlCiAJCXNrYl9jaGVja3N1bV9ub25lX2Fzc2VydChza2IpOwogfQogCi0KIC8qIGdmYXJfcHJvY2Vzc19mcmFtZSgpIC0tIGhhbmRsZSBvbmUgaW5jb21pbmcgcGFja2V0IGlmIHNrYiBpc24ndCBOVUxMLiAqLwogc3RhdGljIHZvaWQgZ2Zhcl9wcm9jZXNzX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgICAgaW50IGFtb3VudF9wdWxsLCBzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGkpCkBAIC0yODQ2LDggKzI4NzcsOSBAQAogCSAqIFJYRkNCX1ZMTiBpcyBwc2V1ZG8gcmFuZG9tbHkgc2V0LgogCSAqLwogCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlggJiYKLQkgICAgZmNiLT5mbGFncyAmIFJYRkNCX1ZMTikKLQkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIGh0b25zKEVUSF9QXzgwMjFRKSwgZmNiLT52bGN0bCk7CisJICAgIGJlMTZfdG9fY3B1KGZjYi0+ZmxhZ3MpICYgUlhGQ0JfVkxOKQorCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgaHRvbnMoRVRIX1BfODAyMVEpLAorCQkJCSAgICAgICBiZTE2X3RvX2NwdShmY2ItPnZsY3RsKSk7CiAKIAkvKiBTZW5kIHRoZSBwYWNrZXQgdXAgdGhlIHN0YWNrICovCiAJbmFwaV9ncm9fcmVjZWl2ZShuYXBpLCBza2IpOwpAQCAtMjg3NCw3ICsyOTA2LDcgQEAKIAogCWFtb3VudF9wdWxsID0gcHJpdi0+dXNlc19yeGZjYiA/IEdNQUNfRkNCX0xFTiA6IDA7CiAKLQl3aGlsZSAoISgoYmRwLT5zdGF0dXMgJiBSWEJEX0VNUFRZKSB8fCAoLS1yeF93b3JrX2xpbWl0IDwgMCkpKSB7CisJd2hpbGUgKCEoYmUxNl90b19jcHUoYmRwLT5zdGF0dXMpICYgUlhCRF9FTVBUWSkgJiYgcnhfd29ya19saW1pdC0tKSB7CiAJCXN0cnVjdCBza19idWZmICpuZXdza2I7CiAJCWRtYV9hZGRyX3QgYnVmYWRkcjsKIApAQCAtMjg4NSwyMSArMjkxNywyMiBAQAogCiAJCXNrYiA9IHJ4X3F1ZXVlLT5yeF9za2J1ZmZbcnhfcXVldWUtPnNrYl9jdXJyeF07CiAKLQkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5kZXYsIGJkcC0+YnVmUHRyLAorCQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmRldiwgYmUzMl90b19jcHUoYmRwLT5idWZQdHIpLAogCQkJCSBwcml2LT5yeF9idWZmZXJfc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKIAotCQlpZiAodW5saWtlbHkoIShiZHAtPnN0YXR1cyAmIFJYQkRfRVJSKSAmJgotCQkJICAgICBiZHAtPmxlbmd0aCA+IHByaXYtPnJ4X2J1ZmZlcl9zaXplKSkKLQkJCWJkcC0+c3RhdHVzID0gUlhCRF9MQVJHRTsKKwkJaWYgKHVubGlrZWx5KCEoYmUxNl90b19jcHUoYmRwLT5zdGF0dXMpICYgUlhCRF9FUlIpICYmCisJCQkgICAgIGJlMTZfdG9fY3B1KGJkcC0+bGVuZ3RoKSA+IHByaXYtPnJ4X2J1ZmZlcl9zaXplKSkKKwkJCWJkcC0+c3RhdHVzID0gY3B1X3RvX2JlMTYoUlhCRF9MQVJHRSk7CiAKIAkJLyogV2UgZHJvcCB0aGUgZnJhbWUgaWYgd2UgZmFpbGVkIHRvIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlciAqLwotCQlpZiAodW5saWtlbHkoIW5ld3NrYiB8fCAhKGJkcC0+c3RhdHVzICYgUlhCRF9MQVNUKSB8fAotCQkJICAgICBiZHAtPnN0YXR1cyAmIFJYQkRfRVJSKSkgewotCQkJY291bnRfZXJyb3JzKGJkcC0+c3RhdHVzLCBkZXYpOworCQlpZiAodW5saWtlbHkoIW5ld3NrYiB8fAorCQkJICAgICAhKGJlMTZfdG9fY3B1KGJkcC0+c3RhdHVzKSAmIFJYQkRfTEFTVCkgfHwKKwkJCSAgICAgYmUxNl90b19jcHUoYmRwLT5zdGF0dXMpICYgUlhCRF9FUlIpKSB7CisJCQljb3VudF9lcnJvcnMoYmUxNl90b19jcHUoYmRwLT5zdGF0dXMpLCBkZXYpOwogCiAJCQlpZiAodW5saWtlbHkoIW5ld3NrYikpIHsKIAkJCQluZXdza2IgPSBza2I7Ci0JCQkJYnVmYWRkciA9IGJkcC0+YnVmUHRyOworCQkJCWJ1ZmFkZHIgPSBiZTMyX3RvX2NwdShiZHAtPmJ1ZlB0cik7CiAJCQl9IGVsc2UgaWYgKHNrYikKIAkJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCX0gZWxzZSB7CkBAIC0yOTA4LDcgKzI5NDEsOCBAQAogCQkJaG93bWFueSsrOwogCiAJCQlpZiAobGlrZWx5KHNrYikpIHsKLQkJCQlwa3RfbGVuID0gYmRwLT5sZW5ndGggLSBFVEhfRkNTX0xFTjsKKwkJCQlwa3RfbGVuID0gYmUxNl90b19jcHUoYmRwLT5sZW5ndGgpIC0KKwkJCQkJICBFVEhfRkNTX0xFTjsKIAkJCQkvKiBSZW1vdmUgdGhlIEZDUyBmcm9tIHRoZSBwYWNrZXQgbGVuZ3RoICovCiAJCQkJc2tiX3B1dChza2IsIHBrdF9sZW4pOwogCQkJCXJ4X3F1ZXVlLT5zdGF0cy5yeF9ieXRlcyArPSBwa3RfbGVuOwpAQCAtMzU2MCw3ICszNTk0LDcgQEAKIAkJcGh5X3ByaW50X3N0YXR1cyhwaHlkZXYpOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBnZmFyX21hdGNoW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZ2Zhcl9tYXRjaFtdID0KIHsKIAl7CiAJCS50eXBlID0gIm5ldHdvcmsiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmgKaW5kZXggOWUxODAyNC4uZGFhMWQzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5oCkBAIC01NDQsMTIgKzU0NCwxMiBAQAogewogCXVuaW9uIHsKIAkJc3RydWN0IHsKLQkJCXUxNglzdGF0dXM7CS8qIFN0YXR1cyBGaWVsZHMgKi8KLQkJCXUxNglsZW5ndGg7CS8qIEJ1ZmZlciBsZW5ndGggKi8KKwkJCV9fYmUxNglzdGF0dXM7CS8qIFN0YXR1cyBGaWVsZHMgKi8KKwkJCV9fYmUxNglsZW5ndGg7CS8qIEJ1ZmZlciBsZW5ndGggKi8KIAkJfTsKLQkJdTMyIGxzdGF0dXM7CisJCV9fYmUzMiBsc3RhdHVzOwogCX07Ci0JdTMyCWJ1ZlB0cjsJLyogQnVmZmVyIFBvaW50ZXIgKi8KKwlfX2JlMzIJYnVmUHRyOwkvKiBCdWZmZXIgUG9pbnRlciAqLwogfTsKIAogc3RydWN0IHR4ZmNiIHsKQEAgLTU1NywyOCArNTU3LDI4IEBACiAJdTgJcHRwOyAgICAvKiBGbGFnIHRvIGVuYWJsZSB0eCB0aW1lc3RhbXBpbmcgKi8KIAl1OAlsNG9zOwkvKiBMZXZlbCA0IEhlYWRlciBPZmZzZXQgKi8KIAl1OAlsM29zOyAJLyogTGV2ZWwgMyBIZWFkZXIgT2Zmc2V0ICovCi0JdTE2CXBoY3M7CS8qIFBzZXVkby1oZWFkZXIgQ2hlY2tzdW0gKi8KLQl1MTYJdmxjdGw7CS8qIFZMQU4gY29udHJvbCB3b3JkICovCisJX19iZTE2CXBoY3M7CS8qIFBzZXVkby1oZWFkZXIgQ2hlY2tzdW0gKi8KKwlfX2JlMTYJdmxjdGw7CS8qIFZMQU4gY29udHJvbCB3b3JkICovCiB9OwogCiBzdHJ1Y3QgcnhiZDgKIHsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQl1MTYJc3RhdHVzOwkvKiBTdGF0dXMgRmllbGRzICovCi0JCQl1MTYJbGVuZ3RoOwkvKiBCdWZmZXIgTGVuZ3RoICovCisJCQlfX2JlMTYJc3RhdHVzOwkvKiBTdGF0dXMgRmllbGRzICovCisJCQlfX2JlMTYJbGVuZ3RoOwkvKiBCdWZmZXIgTGVuZ3RoICovCiAJCX07Ci0JCXUzMiBsc3RhdHVzOworCQlfX2JlMzIgbHN0YXR1czsKIAl9OwotCXUzMglidWZQdHI7CS8qIEJ1ZmZlciBQb2ludGVyICovCisJX19iZTMyCWJ1ZlB0cjsJLyogQnVmZmVyIFBvaW50ZXIgKi8KIH07CiAKIHN0cnVjdCByeGZjYiB7Ci0JdTE2CWZsYWdzOworCV9fYmUxNglmbGFnczsKIAl1OAlycTsJLyogUmVjZWl2ZSBRdWV1ZSBpbmRleCAqLwogCXU4CXBybzsJLyogTGF5ZXIgNCBQcm90b2NvbCAqLwogCXUxNglyZXNlcnZlZDsKLQl1MTYJdmxjdGw7CS8qIFZMQU4gY29udHJvbCB3b3JkICovCisJX19iZTE2CXZsY3RsOwkvKiBWTEFOIGNvbnRyb2wgd29yZCAqLwogfTsKIAogc3RydWN0IGdpYW5mYXJfc2tiX2NiIHsKQEAgLTEyODcsNiArMTI4NywxNCBAQAogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZmFyX2NsZWFyX3R4YmRfc3RhdHVzKHN0cnVjdCB0eGJkOCAqYmRwKQoreworCXUzMiBsc3RhdHVzID0gYmUzMl90b19jcHUoYmRwLT5sc3RhdHVzKTsKKworCWxzdGF0dXMgJj0gQkRfTEZMQUcoVFhCRF9XUkFQKTsKKwliZHAtPmxzdGF0dXMgPSBjcHVfdG9fYmUzMihsc3RhdHVzKTsKK30KKwogaXJxcmV0dXJuX3QgZ2Zhcl9yZWNlaXZlKGludCBpcnEsIHZvaWQgKmRldl9pZCk7CiBpbnQgc3RhcnR1cF9nZmFyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCBzdG9wX2dmYXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhcl9wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyX3B0cC5jCmluZGV4IDE2ODI2MzQuLjhlM2NkNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyX3B0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyX3B0cC5jCkBAIC0zMjIsMTAgKzMyMiwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHB0cF9naWFuZmFyX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYyAqdHMpCitzdGF0aWMgaW50IHB0cF9naWFuZmFyX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCisJCQkgICAgICAgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXU2NCBuczsKLQl1MzIgcmVtYWluZGVyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGV0c2VjdHMgKmV0c2VjdHMgPSBjb250YWluZXJfb2YocHRwLCBzdHJ1Y3QgZXRzZWN0cywgY2Fwcyk7CiAKQEAgLTMzNSwyMCArMzM1LDE5IEBACiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZldHNlY3RzLT5sb2NrLCBmbGFncyk7CiAKLQl0cy0+dHZfc2VjID0gZGl2X3U2NF9yZW0obnMsIDEwMDAwMDAwMDAsICZyZW1haW5kZXIpOwotCXRzLT50dl9uc2VjID0gcmVtYWluZGVyOworCSp0cyA9IG5zX3RvX3RpbWVzcGVjNjQobnMpOworCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcHRwX2dpYW5mYXJfc2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorCQkJICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAl1NjQgbnM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgZXRzZWN0cyAqZXRzZWN0cyA9IGNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBldHNlY3RzLCBjYXBzKTsKIAotCW5zID0gdHMtPnR2X3NlYyAqIDEwMDAwMDAwMDBVTEw7Ci0JbnMgKz0gdHMtPnR2X25zZWM7CisJbnMgPSB0aW1lc3BlYzY0X3RvX25zKHRzKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZldHNlY3RzLT5sb2NrLCBmbGFncyk7CiAKQEAgLTQxOCw4ICs0MTcsOCBAQAogCS5wcHMJCT0gMSwKIAkuYWRqZnJlcQk9IHB0cF9naWFuZmFyX2FkamZyZXEsCiAJLmFkanRpbWUJPSBwdHBfZ2lhbmZhcl9hZGp0aW1lLAotCS5nZXR0aW1lCT0gcHRwX2dpYW5mYXJfZ2V0dGltZSwKLQkuc2V0dGltZQk9IHB0cF9naWFuZmFyX3NldHRpbWUsCisJLmdldHRpbWU2NAk9IHB0cF9naWFuZmFyX2dldHRpbWUsCisJLnNldHRpbWU2NAk9IHB0cF9naWFuZmFyX3NldHRpbWUsCiAJLmVuYWJsZQkJPSBwdHBfZ2lhbmZhcl9lbmFibGUsCiB9OwogCkBAIC00NDAsNyArNDM5LDcgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBldHNlY3RzICpldHNlY3RzOwotCXN0cnVjdCB0aW1lc3BlYyBub3c7CisJc3RydWN0IHRpbWVzcGVjNjQgbm93OwogCWludCBlcnIgPSAtRU5PTUVNOwogCXUzMiB0bXJfY3RybDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNDk1LDcgKzQ5NCw3IEBACiAJCXByX2VycigiaW9yZW1hcCBwdHAgcmVnaXN0ZXJzIGZhaWxlZFxuIik7CiAJCWdvdG8gbm9faW9yZW1hcDsKIAl9Ci0JZ2V0bnN0aW1lb2ZkYXkoJm5vdyk7CisJZ2V0bnN0aW1lb2ZkYXk2NCgmbm93KTsKIAlwdHBfZ2lhbmZhcl9zZXR0aW1lKCZldHNlY3RzLT5jYXBzLCAmbm93KTsKIAogCXRtcl9jdHJsID0KQEAgLTU1NCw3ICs1NTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtYXRjaF90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWF0Y2hfdGFibGVbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImZzbCxldHNlYy1wdHAiIH0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvdWNjX2dldGguYwppbmRleCAzNTdlOGI1Ny4uNGRkNDBlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3VjY19nZXRoLmMKQEAgLTM4OTMsNiArMzg5Myw5IEBACiAJdWdldGgtPnBoeV9pbnRlcmZhY2UgPSBwaHlfaW50ZXJmYWNlOwogCXVnZXRoLT5tYXhfc3BlZWQgPSBtYXhfc3BlZWQ7CiAKKwkvKiBDYXJyaWVyIHN0YXJ0cyBkb3duLCBwaHlsaWIgd2lsbCBicmluZyBpdCB1cCAqLworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKIAllcnIgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWlmIChuZXRpZl9tc2dfcHJvYmUodWdldGgpKQpAQCAtMzkzMCw3ICszOTMzLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdWNjX2dldGhfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVjY19nZXRoX21hdGNoW10gPSB7CiAJewogCQkudHlwZSA9ICJuZXR3b3JrIiwKIAkJLmNvbXBhdGlibGUgPSAidWNjX2dldGgiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3hnbWFjX21kaW8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS94Z21hY19tZGlvLmMKaW5kZXggM2E4M2JjMi4uN2I4ZmU4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL3hnbWFjX21kaW8uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUveGdtYWNfbWRpby5jCkBAIC00NiwxNyArNDYsNDMgQEAKICNkZWZpbmUgTURJT19EQVRBKHgpCQkoeCAmIDB4ZmZmZikKICNkZWZpbmUgTURJT19EQVRBX0JTWQkJQklUKDMxKQogCitzdHJ1Y3QgbWRpb19mc2xfcHJpdiB7CisJc3RydWN0CXRnZWNfbWRpb19jb250cm9sbGVyIF9faW9tZW0gKm1kaW9fYmFzZTsKKwlib29sCWlzX2xpdHRsZV9lbmRpYW47Cit9OworCitzdGF0aWMgdTMyIHhnbWFjX3JlYWQzMih2b2lkIF9faW9tZW0gKnJlZ3MsCisJCQlib29sIGlzX2xpdHRsZV9lbmRpYW4pCit7CisJaWYgKGlzX2xpdHRsZV9lbmRpYW4pCisJCXJldHVybiBpb3JlYWQzMihyZWdzKTsKKwllbHNlCisJCXJldHVybiBpb3JlYWQzMmJlKHJlZ3MpOworfQorCitzdGF0aWMgdm9pZCB4Z21hY193cml0ZTMyKHUzMiB2YWx1ZSwKKwkJCSAgdm9pZCBfX2lvbWVtICpyZWdzLAorCQkJICBib29sIGlzX2xpdHRsZV9lbmRpYW4pCit7CisJaWYgKGlzX2xpdHRsZV9lbmRpYW4pCisJCWlvd3JpdGUzMih2YWx1ZSwgcmVncyk7CisJZWxzZQorCQlpb3dyaXRlMzJiZSh2YWx1ZSwgcmVncyk7Cit9CisKIC8qCiAgKiBXYWl0IHVudGlsIHRoZSBNRElPIGJ1cyBpcyBmcmVlCiAgKi8KIHN0YXRpYyBpbnQgeGdtYWNfd2FpdF91bnRpbF9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IHRnZWNfbWRpb19jb250cm9sbGVyIF9faW9tZW0gKnJlZ3MpCisJCQkJIHN0cnVjdCB0Z2VjX21kaW9fY29udHJvbGxlciBfX2lvbWVtICpyZWdzLAorCQkJCSBib29sIGlzX2xpdHRsZV9lbmRpYW4pCiB7CiAJdW5zaWduZWQgaW50IHRpbWVvdXQ7CiAKIAkvKiBXYWl0IHRpbGwgdGhlIGJ1cyBpcyBmcmVlICovCiAJdGltZW91dCA9IFRJTUVPVVQ7Ci0Jd2hpbGUgKChpb3JlYWQzMmJlKCZyZWdzLT5tZGlvX3N0YXQpICYgTURJT19TVEFUX0JTWSkgJiYgdGltZW91dCkgeworCXdoaWxlICgoeGdtYWNfcmVhZDMyKCZyZWdzLT5tZGlvX3N0YXQsIGlzX2xpdHRsZV9lbmRpYW4pICYKKwkJTURJT19TVEFUX0JTWSkgJiYgdGltZW91dCkgewogCQljcHVfcmVsYXgoKTsKIAkJdGltZW91dC0tOwogCX0KQEAgLTczLDEzICs5OSwxNSBAQAogICogV2FpdCB0aWxsIHRoZSBNRElPIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlCiAgKi8KIHN0YXRpYyBpbnQgeGdtYWNfd2FpdF91bnRpbF9kb25lKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IHRnZWNfbWRpb19jb250cm9sbGVyIF9faW9tZW0gKnJlZ3MpCisJCQkJIHN0cnVjdCB0Z2VjX21kaW9fY29udHJvbGxlciBfX2lvbWVtICpyZWdzLAorCQkJCSBib29sIGlzX2xpdHRsZV9lbmRpYW4pCiB7CiAJdW5zaWduZWQgaW50IHRpbWVvdXQ7CiAKIAkvKiBXYWl0IHRpbGwgdGhlIE1ESU8gd3JpdGUgaXMgY29tcGxldGUgKi8KIAl0aW1lb3V0ID0gVElNRU9VVDsKLQl3aGlsZSAoKGlvcmVhZDMyYmUoJnJlZ3MtPm1kaW9fZGF0YSkgJiBNRElPX0RBVEFfQlNZKSAmJiB0aW1lb3V0KSB7CisJd2hpbGUgKCh4Z21hY19yZWFkMzIoJnJlZ3MtPm1kaW9fc3RhdCwgaXNfbGl0dGxlX2VuZGlhbikgJgorCQlNRElPX1NUQVRfQlNZKSAmJiB0aW1lb3V0KSB7CiAJCWNwdV9yZWxheCgpOwogCQl0aW1lb3V0LS07CiAJfQpAQCAtOTksMTIgKzEyNywxNCBAQAogICovCiBzdGF0aWMgaW50IHhnbWFjX21kaW9fd3JpdGUoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeV9pZCwgaW50IHJlZ251bSwgdTE2IHZhbHVlKQogewotCXN0cnVjdCB0Z2VjX21kaW9fY29udHJvbGxlciBfX2lvbWVtICpyZWdzID0gYnVzLT5wcml2OworCXN0cnVjdCBtZGlvX2ZzbF9wcml2ICpwcml2ID0gKHN0cnVjdCBtZGlvX2ZzbF9wcml2ICopYnVzLT5wcml2OworCXN0cnVjdCB0Z2VjX21kaW9fY29udHJvbGxlciBfX2lvbWVtICpyZWdzID0gcHJpdi0+bWRpb19iYXNlOwogCXVpbnQxNl90IGRldl9hZGRyOwogCXUzMiBtZGlvX2N0bCwgbWRpb19zdGF0OwogCWludCByZXQ7CisJYm9vbCBlbmRpYW4gPSBwcml2LT5pc19saXR0bGVfZW5kaWFuOwogCi0JbWRpb19zdGF0ID0gaW9yZWFkMzJiZSgmcmVncy0+bWRpb19zdGF0KTsKKwltZGlvX3N0YXQgPSB4Z21hY19yZWFkMzIoJnJlZ3MtPm1kaW9fc3RhdCwgZW5kaWFuKTsKIAlpZiAocmVnbnVtICYgTUlJX0FERFJfQzQ1KSB7CiAJCS8qIENsYXVzZSA0NSAoaWUgMTBHKSAqLwogCQlkZXZfYWRkciA9IChyZWdudW0gPj4gMTYpICYgMHgxZjsKQEAgLTExNSwyOSArMTQ1LDI5IEBACiAJCW1kaW9fc3RhdCAmPSB+TURJT19TVEFUX0VOQzsKIAl9CiAKLQlpb3dyaXRlMzJiZShtZGlvX3N0YXQsICZyZWdzLT5tZGlvX3N0YXQpOworCXhnbWFjX3dyaXRlMzIobWRpb19zdGF0LCAmcmVncy0+bWRpb19zdGF0LCBlbmRpYW4pOwogCi0JcmV0ID0geGdtYWNfd2FpdF91bnRpbF9mcmVlKCZidXMtPmRldiwgcmVncyk7CisJcmV0ID0geGdtYWNfd2FpdF91bnRpbF9mcmVlKCZidXMtPmRldiwgcmVncywgZW5kaWFuKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJLyogU2V0IHRoZSBwb3J0IGFuZCBkZXYgYWRkciAqLwogCW1kaW9fY3RsID0gTURJT19DVExfUE9SVF9BRERSKHBoeV9pZCkgfCBNRElPX0NUTF9ERVZfQUREUihkZXZfYWRkcik7Ci0JaW93cml0ZTMyYmUobWRpb19jdGwsICZyZWdzLT5tZGlvX2N0bCk7CisJeGdtYWNfd3JpdGUzMihtZGlvX2N0bCwgJnJlZ3MtPm1kaW9fY3RsLCBlbmRpYW4pOwogCiAJLyogU2V0IHRoZSByZWdpc3RlciBhZGRyZXNzICovCiAJaWYgKHJlZ251bSAmIE1JSV9BRERSX0M0NSkgewotCQlpb3dyaXRlMzJiZShyZWdudW0gJiAweGZmZmYsICZyZWdzLT5tZGlvX2FkZHIpOworCQl4Z21hY193cml0ZTMyKHJlZ251bSAmIDB4ZmZmZiwgJnJlZ3MtPm1kaW9fYWRkciwgZW5kaWFuKTsKIAotCQlyZXQgPSB4Z21hY193YWl0X3VudGlsX2ZyZWUoJmJ1cy0+ZGV2LCByZWdzKTsKKwkJcmV0ID0geGdtYWNfd2FpdF91bnRpbF9mcmVlKCZidXMtPmRldiwgcmVncywgZW5kaWFuKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQogCiAJLyogV3JpdGUgdGhlIHZhbHVlIHRvIHRoZSByZWdpc3RlciAqLwotCWlvd3JpdGUzMmJlKE1ESU9fREFUQSh2YWx1ZSksICZyZWdzLT5tZGlvX2RhdGEpOworCXhnbWFjX3dyaXRlMzIoTURJT19EQVRBKHZhbHVlKSwgJnJlZ3MtPm1kaW9fZGF0YSwgZW5kaWFuKTsKIAotCXJldCA9IHhnbWFjX3dhaXRfdW50aWxfZG9uZSgmYnVzLT5kZXYsIHJlZ3MpOworCXJldCA9IHhnbWFjX3dhaXRfdW50aWxfZG9uZSgmYnVzLT5kZXYsIHJlZ3MsIGVuZGlhbik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTUxLDE0ICsxODEsMTYgQEAKICAqLwogc3RhdGljIGludCB4Z21hY19tZGlvX3JlYWQoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHBoeV9pZCwgaW50IHJlZ251bSkKIHsKLQlzdHJ1Y3QgdGdlY19tZGlvX2NvbnRyb2xsZXIgX19pb21lbSAqcmVncyA9IGJ1cy0+cHJpdjsKKwlzdHJ1Y3QgbWRpb19mc2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgbWRpb19mc2xfcHJpdiAqKWJ1cy0+cHJpdjsKKwlzdHJ1Y3QgdGdlY19tZGlvX2NvbnRyb2xsZXIgX19pb21lbSAqcmVncyA9IHByaXYtPm1kaW9fYmFzZTsKIAl1aW50MTZfdCBkZXZfYWRkcjsKIAl1aW50MzJfdCBtZGlvX3N0YXQ7CiAJdWludDMyX3QgbWRpb19jdGw7CiAJdWludDE2X3QgdmFsdWU7CiAJaW50IHJldDsKKwlib29sIGVuZGlhbiA9IHByaXYtPmlzX2xpdHRsZV9lbmRpYW47CiAKLQltZGlvX3N0YXQgPSBpb3JlYWQzMmJlKCZyZWdzLT5tZGlvX3N0YXQpOworCW1kaW9fc3RhdCA9IHhnbWFjX3JlYWQzMigmcmVncy0+bWRpb19zdGF0LCBlbmRpYW4pOwogCWlmIChyZWdudW0gJiBNSUlfQUREUl9DNDUpIHsKIAkJZGV2X2FkZHIgPSAocmVnbnVtID4+IDE2KSAmIDB4MWY7CiAJCW1kaW9fc3RhdCB8PSBNRElPX1NUQVRfRU5DOwpAQCAtMTY3LDQxICsxOTksNDEgQEAKIAkJbWRpb19zdGF0ICY9IH5NRElPX1NUQVRfRU5DOwogCX0KIAotCWlvd3JpdGUzMmJlKG1kaW9fc3RhdCwgJnJlZ3MtPm1kaW9fc3RhdCk7CisJeGdtYWNfd3JpdGUzMihtZGlvX3N0YXQsICZyZWdzLT5tZGlvX3N0YXQsIGVuZGlhbik7CiAKLQlyZXQgPSB4Z21hY193YWl0X3VudGlsX2ZyZWUoJmJ1cy0+ZGV2LCByZWdzKTsKKwlyZXQgPSB4Z21hY193YWl0X3VudGlsX2ZyZWUoJmJ1cy0+ZGV2LCByZWdzLCBlbmRpYW4pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAkvKiBTZXQgdGhlIFBvcnQgYW5kIERldmljZSBBZGRycyAqLwogCW1kaW9fY3RsID0gTURJT19DVExfUE9SVF9BRERSKHBoeV9pZCkgfCBNRElPX0NUTF9ERVZfQUREUihkZXZfYWRkcik7Ci0JaW93cml0ZTMyYmUobWRpb19jdGwsICZyZWdzLT5tZGlvX2N0bCk7CisJeGdtYWNfd3JpdGUzMihtZGlvX2N0bCwgJnJlZ3MtPm1kaW9fY3RsLCBlbmRpYW4pOwogCiAJLyogU2V0IHRoZSByZWdpc3RlciBhZGRyZXNzICovCiAJaWYgKHJlZ251bSAmIE1JSV9BRERSX0M0NSkgewotCQlpb3dyaXRlMzJiZShyZWdudW0gJiAweGZmZmYsICZyZWdzLT5tZGlvX2FkZHIpOworCQl4Z21hY193cml0ZTMyKHJlZ251bSAmIDB4ZmZmZiwgJnJlZ3MtPm1kaW9fYWRkciwgZW5kaWFuKTsKIAotCQlyZXQgPSB4Z21hY193YWl0X3VudGlsX2ZyZWUoJmJ1cy0+ZGV2LCByZWdzKTsKKwkJcmV0ID0geGdtYWNfd2FpdF91bnRpbF9mcmVlKCZidXMtPmRldiwgcmVncywgZW5kaWFuKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJfQogCiAJLyogSW5pdGlhdGUgdGhlIHJlYWQgKi8KLQlpb3dyaXRlMzJiZShtZGlvX2N0bCB8IE1ESU9fQ1RMX1JFQUQsICZyZWdzLT5tZGlvX2N0bCk7CisJeGdtYWNfd3JpdGUzMihtZGlvX2N0bCB8IE1ESU9fQ1RMX1JFQUQsICZyZWdzLT5tZGlvX2N0bCwgZW5kaWFuKTsKIAotCXJldCA9IHhnbWFjX3dhaXRfdW50aWxfZG9uZSgmYnVzLT5kZXYsIHJlZ3MpOworCXJldCA9IHhnbWFjX3dhaXRfdW50aWxfZG9uZSgmYnVzLT5kZXYsIHJlZ3MsIGVuZGlhbik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAogCS8qIFJldHVybiBhbGwgRnMgaWYgbm90aGluZyB3YXMgdGhlcmUgKi8KLQlpZiAoaW9yZWFkMzJiZSgmcmVncy0+bWRpb19zdGF0KSAmIE1ESU9fU1RBVF9SRF9FUikgeworCWlmICh4Z21hY19yZWFkMzIoJnJlZ3MtPm1kaW9fc3RhdCwgZW5kaWFuKSAmIE1ESU9fU1RBVF9SRF9FUikgewogCQlkZXZfZXJyKCZidXMtPmRldiwKIAkJCSJFcnJvciB3aGlsZSByZWFkaW5nIFBIWSVkIHJlZyBhdCAlZC4laGh1XG4iLAogCQkJcGh5X2lkLCBkZXZfYWRkciwgcmVnbnVtKTsKIAkJcmV0dXJuIDB4ZmZmZjsKIAl9CiAKLQl2YWx1ZSA9IGlvcmVhZDMyYmUoJnJlZ3MtPm1kaW9fZGF0YSkgJiAweGZmZmY7CisJdmFsdWUgPSB4Z21hY19yZWFkMzIoJnJlZ3MtPm1kaW9fZGF0YSwgZW5kaWFuKSAmIDB4ZmZmZjsKIAlkZXZfZGJnKCZidXMtPmRldiwgInJlYWQgJTA0eFxuIiwgdmFsdWUpOwogCiAJcmV0dXJuIHZhbHVlOwpAQCAtMjEyLDYgKzI0NCw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBtaWlfYnVzICpidXM7CiAJc3RydWN0IHJlc291cmNlIHJlczsKKwlzdHJ1Y3QgbWRpb19mc2xfcHJpdiAqcHJpdjsKIAlpbnQgcmV0OwogCiAJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcyk7CkBAIC0yMjAsNyArMjUzLDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlidXMgPSBtZGlvYnVzX2FsbG9jKCk7CisJYnVzID0gbWRpb2J1c19hbGxvY19zaXplKHNpemVvZihzdHJ1Y3QgbWRpb19mc2xfcHJpdikpOwogCWlmICghYnVzKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMjMxLDEyICsyNjQsMTkgQEAKIAlzbnByaW50ZihidXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIlbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMuc3RhcnQpOwogCiAJLyogU2V0IHRoZSBQSFkgYmFzZSBhZGRyZXNzICovCi0JYnVzLT5wcml2ID0gb2ZfaW9tYXAobnAsIDApOwotCWlmICghYnVzLT5wcml2KSB7CisJcHJpdiA9IGJ1cy0+cHJpdjsKKwlwcml2LT5tZGlvX2Jhc2UgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKCFwcml2LT5tZGlvX2Jhc2UpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJfaW9yZW1hcDsKIAl9CiAKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KHBkZXYtPmRldi5vZl9ub2RlLAorCQkJICAgICJsaXR0bGUtZW5kaWFuIiwgTlVMTCkpCisJCXByaXYtPmlzX2xpdHRsZV9lbmRpYW4gPSB0cnVlOworCWVsc2UKKwkJcHJpdi0+aXNfbGl0dGxlX2VuZGlhbiA9IGZhbHNlOworCiAJcmV0ID0gb2ZfbWRpb2J1c19yZWdpc3RlcihidXMsIG5wKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCByZWdpc3RlciBNRElPIGJ1c1xuIik7CkBAIC0yNDgsNyArMjg4LDcgQEAKIAlyZXR1cm4gMDsKIAogZXJyX3JlZ2lzdHJhdGlvbjoKLQlpb3VubWFwKGJ1cy0+cHJpdik7CisJaW91bm1hcChwcml2LT5tZGlvX2Jhc2UpOwogCiBlcnJfaW9yZW1hcDoKIAltZGlvYnVzX2ZyZWUoYnVzKTsKQEAgLTI2Nyw3ICszMDcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB4Z21hY19tZGlvX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB4Z21hY19tZGlvX21hdGNoW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJmc2wsZm1hbi14bWRpbyIsCiAJfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9laGVhL2VoZWFfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VoZWEvZWhlYV9tYWluLmMKaW5kZXggYzA1ZTUwNy4uMjkxYzg3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VoZWEvZWhlYV9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VoZWEvZWhlYV9tYWluLmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiBzdGF0aWMgaW50IGVoZWFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldik7CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVoZWFfbW9kdWxlX2RldmljZV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZWhlYV9tb2R1bGVfZGV2aWNlX3RhYmxlW10gPSB7CiAJewogCQkubmFtZSA9ICJsaGVhIiwKIAkJLmNvbXBhdGlibGUgPSAiSUJNLGxoZWEiLApAQCAtMTE2LDcgKzExNiw3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZWhlYV9tb2R1bGVfZGV2aWNlX3RhYmxlKTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgZWhlYV9kZXZpY2VfdGFibGVbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGVoZWFfZGV2aWNlX3RhYmxlW10gPSB7CiAJewogCQkubmFtZSA9ICJsaGVhIiwKIAkJLmNvbXBhdGlibGUgPSAiSUJNLGxoZWEiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvY29yZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvY29yZS5jCmluZGV4IDIyMGJhZTYuLmRlNzkxOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9jb3JlLmMKQEAgLTI5NzMsNyArMjk3Myw3IEBACiB9CiAKIC8qIFhYWCBGZWF0dXJlcyBpbiBoZXJlIHNob3VsZCBiZSByZXBsYWNlZCBieSBwcm9wZXJ0aWVzLi4uICovCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBlbWFjX21hdGNoW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZW1hY19tYXRjaFtdID0KIHsKIAl7CiAJCS50eXBlCQk9ICJuZXR3b3JrIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL21hbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvbWFsLmMKaW5kZXggZGRkYWFiMS4uZmRiNWNkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvbWFsLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvbWFsLmMKQEAgLTc1Myw3ICs3NTMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtYWxfcGxhdGZvcm1fbWF0Y2hbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtYWxfcGxhdGZvcm1fbWF0Y2hbXSA9CiB7CiAJewogCQkuY29tcGF0aWJsZQk9ICJpYm0sbWNtYWwiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvcmdtaWkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL3JnbWlpLmMKaW5kZXggNDU3MDg4Zi4uMjA2Y2NiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvcmdtaWkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9yZ21paS5jCkBAIC0zMDUsNyArMzA1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcmdtaWlfbWF0Y2hbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByZ21paV9tYXRjaFtdID0KIHsKIAl7CiAJCS5jb21wYXRpYmxlCT0gImlibSxyZ21paSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy90YWguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL3RhaC5jCmluZGV4IGNiMThlN2YuLjMyY2I2YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL3RhaC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL3RhaC5jCkBAIC0xNDgsNyArMTQ4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGFoX21hdGNoW10gPQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGFoX21hdGNoW10gPQogewogCXsKIAkJLmNvbXBhdGlibGUJPSAiaWJtLHRhaCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy96bWlpLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy96bWlpLmMKaW5kZXggMzY0MDljYy4uODcyN2I4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvem1paS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL3ptaWkuYwpAQCAtMjk1LDcgKzI5NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHptaWlfbWF0Y2hbXSA9CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB6bWlpX21hdGNoW10gPQogewogCXsKIAkJLmNvbXBhdGlibGUJPSAiaWJtLHptaWkiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmMKaW5kZXggMDcyNDI2YS4uY2Q3Njc1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5jCkBAIC0xMTM2LDYgKzExMzYsOCBAQAogCWlibXZldGhfcmVwbGVuaXNoX3Rhc2soYWRhcHRlcik7CiAKIAlpZiAoZnJhbWVzX3Byb2Nlc3NlZCA8IGJ1ZGdldCkgeworCQluYXBpX2NvbXBsZXRlKG5hcGkpOworCiAJCS8qIFdlIHRoaW5rIHdlIGFyZSBkb25lIC0gcmVlbmFibGUgaW50ZXJydXB0cywKIAkJICogdGhlbiBjaGVjayBvbmNlIG1vcmUgdG8gbWFrZSBzdXJlIHdlIGFyZSBkb25lLgogCQkgKi8KQEAgLTExNDQsOCArMTE0Niw2IEBACiAKIAkJQlVHX09OKGxwYXJfcmMgIT0gSF9TVUNDRVNTKTsKIAotCQluYXBpX2NvbXBsZXRlKG5hcGkpOwotCiAJCWlmIChpYm12ZXRoX3J4cV9wZW5kaW5nX2J1ZmZlcihhZGFwdGVyKSAmJgogCQkgICAgbmFwaV9yZXNjaGVkdWxlKG5hcGkpKSB7CiAJCQlscGFyX3JjID0gaF92aW9fc2lnbmFsKGFkYXB0ZXItPnZkZXYtPnVuaXRfYWRkcmVzcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAuYwppbmRleCBlOWMzYTg3Li4xYTQ1MGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMC5jCkBAIC00MTQsNyArNDE0LDcgQEAKIAogLyoqCiAgKiBjYl9jb21tYW5kIC0gQ29tbWFuZCBCbG9jayBmbGFncwotICogQGNiX3R4X25jOiAgMDogY29udHJvbGVyIGRvZXMgQ1JDIChub3JtYWwpLCAgMTogQ1JDIGZyb20gc2tiIG1lbW9yeQorICogQGNiX3R4X25jOiAgMDogY29udHJvbGxlciBkb2VzIENSQyAobm9ybWFsKSwgIDE6IENSQyBmcm9tIHNrYiBtZW1vcnkKICAqLwogZW51bSBjYl9jb21tYW5kIHsKIAljYl9ub3AgICAgPSAweDAwMDAsCkBAIC04OTksNyArODk5LDcgQEAKIAkvKiBPcmRlciBpcyBpbXBvcnRhbnQgb3RoZXJ3aXNlIHdlJ2xsIGJlIGluIGEgcmFjZSB3aXRoIGgvdzoKIAkgKiBzZXQgUy1iaXQgaW4gY3VycmVudCBmaXJzdCwgdGhlbiBjbGVhciBTLWJpdCBpbiBwcmV2aW91cy4gKi8KIAljYi0+Y29tbWFuZCB8PSBjcHVfdG9fbGUxNihjYl9zKTsKLQl3bWIoKTsKKwlkbWFfd21iKCk7CiAJY2ItPnByZXYtPmNvbW1hbmQgJj0gY3B1X3RvX2xlMTYofmNiX3MpOwogCiAJd2hpbGUgKG5pYy0+Y2JfdG9fc2VuZCAhPSBuaWMtPmNiX3RvX3VzZSkgewpAQCAtMTg0Myw3ICsxODQzLDcgQEAKIAlmb3IgKGNiID0gbmljLT5jYl90b19jbGVhbjsKIAkgICAgY2ItPnN0YXR1cyAmIGNwdV90b19sZTE2KGNiX2NvbXBsZXRlKTsKIAkgICAgY2IgPSBuaWMtPmNiX3RvX2NsZWFuID0gY2ItPm5leHQpIHsKLQkJcm1iKCk7IC8qIHJlYWQgc2tiIGFmdGVyIHN0YXR1cyAqLworCQlkbWFfcm1iKCk7IC8qIHJlYWQgc2tiIGFmdGVyIHN0YXR1cyAqLwogCQluZXRpZl9wcmludGsobmljLCB0eF9kb25lLCBLRVJOX0RFQlVHLCBuaWMtPm5ldGRldiwKIAkJCSAgICAgImNiWyVkXS0+c3RhdHVzID0gMHglMDRYXG4iLAogCQkJICAgICAoaW50KSgoKHZvaWQqKWNiIC0gKHZvaWQqKW5pYy0+Y2JzKS9zaXplb2Yoc3RydWN0IGNiKSksCkBAIC0xOTkzLDcgKzE5OTMsNyBAQAogCiAJbmV0aWZfcHJpbnRrKG5pYywgcnhfc3RhdHVzLCBLRVJOX0RFQlVHLCBuaWMtPm5ldGRldiwKIAkJICAgICAic3RhdHVzPTB4JTA0WFxuIiwgcmZkX3N0YXR1cyk7Ci0Jcm1iKCk7IC8qIHJlYWQgc2l6ZSBhZnRlciBzdGF0dXMgYml0ICovCisJZG1hX3JtYigpOyAvKiByZWFkIHNpemUgYWZ0ZXIgc3RhdHVzIGJpdCAqLwogCiAJLyogSWYgZGF0YSBpc24ndCByZWFkeSwgbm90aGluZyB0byBpbmRpY2F0ZSAqLwogCWlmICh1bmxpa2VseSghKHJmZF9zdGF0dXMgJiBjYl9jb21wbGV0ZSkpKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMC9lMTAwMF9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMC9lMTAwMF9tYWluLmMKaW5kZXggN2Y5OTdkMy4uOTgzZWI0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDAvZTEwMDBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwL2UxMDAwX21haW4uYwpAQCAtMTQ0LDYgKzE0NCwxMSBAQAogc3RhdGljIGJvb2wgZTEwMDBfY2xlYW5fanVtYm9fcnhfaXJxKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAogCQkJCSAgICAgc3RydWN0IGUxMDAwX3J4X3JpbmcgKnJ4X3JpbmcsCiAJCQkJICAgICBpbnQgKndvcmtfZG9uZSwgaW50IHdvcmtfdG9fZG8pOworc3RhdGljIHZvaWQgZTEwMDBfYWxsb2NfZHVtbXlfcnhfYnVmZmVycyhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nLAorCQkJCQkgaW50IGNsZWFuZWRfY291bnQpCit7Cit9CiBzdGF0aWMgdm9pZCBlMTAwMF9hbGxvY19yeF9idWZmZXJzKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyLAogCQkJCSAgIHN0cnVjdCBlMTAwMF9yeF9yaW5nICpyeF9yaW5nLAogCQkJCSAgIGludCBjbGVhbmVkX2NvdW50KTsKQEAgLTUxNiw2ICs1MjEsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJdTMyIHJjdGwsIHRjdGw7CiAKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwogCiAJLyogZGlzYWJsZSByZWNlaXZlcyBpbiB0aGUgaGFyZHdhcmUgKi8KIAlyY3RsID0gZXIzMihSQ1RMKTsKQEAgLTU0NCw3ICs1NTAsNiBAQAogCiAJYWRhcHRlci0+bGlua19zcGVlZCA9IDA7CiAJYWRhcHRlci0+bGlua19kdXBsZXggPSAwOwotCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CiAKIAllMTAwMF9yZXNldChhZGFwdGVyKTsKIAllMTAwMF9jbGVhbl9hbGxfdHhfcmluZ3MoYWRhcHRlcik7CkBAIC0xMTExLDcgKzExMTYsNyBAQAogCQlpZiAoZTEwMDBfcmVhZF9tYWNfYWRkcihodykpCiAJCQllX2Vycihwcm9iZSwgIkVFUFJPTSBSZWFkIEVycm9yXG4iKTsKIAl9Ci0JLyogZG9uJ3QgYmxvY2sgaW5pdGFsaXphdGlvbiBoZXJlIGR1ZSB0byBiYWQgTUFDIGFkZHJlc3MgKi8KKwkvKiBkb24ndCBibG9jayBpbml0aWFsaXphdGlvbiBoZXJlIGR1ZSB0byBiYWQgTUFDIGFkZHJlc3MgKi8KIAltZW1jcHkobmV0ZGV2LT5kZXZfYWRkciwgaHctPm1hY19hZGRyLCBuZXRkZXYtPmFkZHJfbGVuKTsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPmRldl9hZGRyKSkKQEAgLTM1NTIsOCArMzU1NywxMSBAQAogCQltc2xlZXAoMSk7CiAJLyogZTEwMDBfZG93biBoYXMgYSBkZXBlbmRlbmN5IG9uIG1heF9mcmFtZV9zaXplICovCiAJaHctPm1heF9mcmFtZV9zaXplID0gbWF4X2ZyYW1lOwotCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCisJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgeworCQkvKiBwcmV2ZW50IGJ1ZmZlcnMgZnJvbSBiZWluZyByZWFsbG9jYXRlZCAqLworCQlhZGFwdGVyLT5hbGxvY19yeF9idWYgPSBlMTAwMF9hbGxvY19kdW1teV9yeF9idWZmZXJzOwogCQllMTAwMF9kb3duKGFkYXB0ZXIpOworCX0KIAogCS8qIE5PVEU6IG5ldGRldl9hbGxvY19za2IgcmVzZXJ2ZXMgMTYgYnl0ZXMsIGFuZCB0eXBpY2FsbHkgTkVUX0lQX0FMSUdOCiAJICogbWVhbnMgd2UgcmVzZXJ2ZSAyIG1vcmUsIHRoaXMgcHVzaGVzIHVzIHRvIGFsbG9jYXRlIGZyb20gdGhlIG5leHQKQEAgLTM4NDgsNyArMzg1Niw3IEBACiAJd2hpbGUgKChlb3BfZGVzYy0+dXBwZXIuZGF0YSAmIGNwdV90b19sZTMyKEUxMDAwX1RYRF9TVEFUX0REKSkgJiYKIAkgICAgICAgKGNvdW50IDwgdHhfcmluZy0+Y291bnQpKSB7CiAJCWJvb2wgY2xlYW5lZCA9IGZhbHNlOwotCQlybWIoKTsJLyogcmVhZCBidWZmZXJfaW5mbyBhZnRlciBlb3BfZGVzYyAqLworCQlkbWFfcm1iKCk7CS8qIHJlYWQgYnVmZmVyX2luZm8gYWZ0ZXIgZW9wX2Rlc2MgKi8KIAkJZm9yICggOyAhY2xlYW5lZDsgY291bnQrKykgewogCQkJdHhfZGVzYyA9IEUxMDAwX1RYX0RFU0MoKnR4X3JpbmcsIGkpOwogCQkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CkBAIC00MTQ2LDcgKzQxNTQsNyBAQAogCQlpZiAoKndvcmtfZG9uZSA+PSB3b3JrX3RvX2RvKQogCQkJYnJlYWs7CiAJCSgqd29ya19kb25lKSsrOwotCQlybWIoKTsgLyogcmVhZCBkZXNjcmlwdG9yIGFuZCByeF9idWZmZXJfaW5mbyBhZnRlciBzdGF0dXMgREQgKi8KKwkJZG1hX3JtYigpOyAvKiByZWFkIGRlc2NyaXB0b3IgYW5kIHJ4X2J1ZmZlcl9pbmZvIGFmdGVyIHN0YXR1cyBERCAqLwogCiAJCXN0YXR1cyA9IHJ4X2Rlc2MtPnN0YXR1czsKIApAQCAtNDM2Nyw3ICs0Mzc1LDcgQEAKIAkJaWYgKCp3b3JrX2RvbmUgPj0gd29ya190b19kbykKIAkJCWJyZWFrOwogCQkoKndvcmtfZG9uZSkrKzsKLQkJcm1iKCk7IC8qIHJlYWQgZGVzY3JpcHRvciBhbmQgcnhfYnVmZmVyX2luZm8gYWZ0ZXIgc3RhdHVzIEREICovCisJCWRtYV9ybWIoKTsgLyogcmVhZCBkZXNjcmlwdG9yIGFuZCByeF9idWZmZXJfaW5mbyBhZnRlciBzdGF0dXMgREQgKi8KIAogCQlzdGF0dXMgPSByeF9kZXNjLT5zdGF0dXM7CiAJCWxlbmd0aCA9IGxlMTZfdG9fY3B1KHJ4X2Rlc2MtPmxlbmd0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZGVmaW5lcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2RlZmluZXMuaAppbmRleCBiYjdhYjNjLi4wNTcwYzY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZGVmaW5lcy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9kZWZpbmVzLmgKQEAgLTE0MSw2ICsxNDEsNyBAQAogI2RlZmluZSBFMTAwMF9SQ1RMX0xCTV9UQ1ZSICAgICAgIDB4MDAwMDAwQzAgICAgLyogdGN2ciBsb29wYmFjayBtb2RlICovCiAjZGVmaW5lIEUxMDAwX1JDVExfRFRZUF9QUyAgICAgICAgMHgwMDAwMDQwMCAgICAvKiBQYWNrZXQgU3BsaXQgZGVzY3JpcHRvciAqLwogI2RlZmluZSBFMTAwMF9SQ1RMX1JETVRTX0hBTEYgICAgIDB4MDAwMDAwMDAgICAgLyogUnggZGVzYyBtaW4gdGhyZXNob2xkIHNpemUgKi8KKyNkZWZpbmUgRTEwMDBfUkNUTF9SRE1UU19IRVggICAgICAweDAwMDEwMDAwCiAjZGVmaW5lIEUxMDAwX1JDVExfTU9fU0hJRlQgICAgICAgMTIgICAgICAgICAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IHNoaWZ0ICovCiAjZGVmaW5lIEUxMDAwX1JDVExfTU9fMyAgICAgICAgICAgMHgwMDAwMzAwMCAgICAvKiBtdWx0aWNhc3Qgb2Zmc2V0IDE1OjQgKi8KICNkZWZpbmUgRTEwMDBfUkNUTF9CQU0gICAgICAgICAgICAweDAwMDA4MDAwICAgIC8qIGJyb2FkY2FzdCBlbmFibGUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9lMTAwMC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2UxMDAwLmgKaW5kZXggOTQxNmU1YS4uNWQ5Y2ViMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2UxMDAwLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2UxMDAwLmgKQEAgLTEzMiw2ICsxMzIsNyBAQAogCWJvYXJkX3BjaGxhbiwKIAlib2FyZF9wY2gybGFuLAogCWJvYXJkX3BjaF9scHQsCisJYm9hcmRfcGNoX3NwdAogfTsKIAogc3RydWN0IGUxMDAwX3BzX3BhZ2UgewpAQCAtMzQyLDYgKzM0Myw3IEBACiAJc3RydWN0IHRpbWVjb3VudGVyIHRjOwogCXN0cnVjdCBwdHBfY2xvY2sgKnB0cF9jbG9jazsKIAlzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gcHRwX2Nsb2NrX2luZm87CisJc3RydWN0IHBtX3Fvc19yZXF1ZXN0IHBtX3Fvc19yZXE7CiAKIAl1MTYgZWVlX2FkdmVydDsKIH07CkBAIC01MDEsNiArNTAzLDcgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZTEwMDBfaW5mbyBlMTAwMF9wY2hfaW5mbzsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZTEwMDBfaW5mbyBlMTAwMF9wY2gyX2luZm87CiBleHRlcm4gY29uc3Qgc3RydWN0IGUxMDAwX2luZm8gZTEwMDBfcGNoX2xwdF9pbmZvOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBlMTAwMF9pbmZvIGUxMDAwX3BjaF9zcHRfaW5mbzsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZTEwMDBfaW5mbyBlMTAwMF9lczJfaW5mbzsKIAogdm9pZCBlMTAwMGVfcHRwX2luaXQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9ldGh0b29sLmMKaW5kZXggODY1Y2U0NS4uMTFmNDg2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZXRodG9vbC5jCkBAIC04OTYsMTggKzg5NiwyMCBAQAogCWNhc2UgZTEwMDBfcGNobGFuOgogCWNhc2UgZTEwMDBfcGNoMmxhbjoKIAljYXNlIGUxMDAwX3BjaF9scHQ6CisJY2FzZSBlMTAwMF9wY2hfc3B0OgogCQltYXNrIHw9ICgxIDw8IDE4KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCi0JaWYgKG1hYy0+dHlwZSA9PSBlMTAwMF9wY2hfbHB0KQorCWlmICgobWFjLT50eXBlID09IGUxMDAwX3BjaF9scHQpIHx8IChtYWMtPnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkpCiAJCXdsb2NrX21hYyA9IChlcjMyKEZXU00pICYgRTEwMDBfRldTTV9XTE9DS19NQUNfTUFTSykgPj4KIAkJICAgIEUxMDAwX0ZXU01fV0xPQ0tfTUFDX1NISUZUOwogCiAJZm9yIChpID0gMDsgaSA8IG1hYy0+cmFyX2VudHJ5X2NvdW50OyBpKyspIHsKLQkJaWYgKG1hYy0+dHlwZSA9PSBlMTAwMF9wY2hfbHB0KSB7CisJCWlmICgobWFjLT50eXBlID09IGUxMDAwX3BjaF9scHQpIHx8CisJCSAgICAobWFjLT50eXBlID09IGUxMDAwX3BjaF9zcHQpKSB7CiAJCQkvKiBDYW5ub3QgdGVzdCB3cml0ZS1wcm90ZWN0ZWQgU0hSQUxbbl0gcmVnaXN0ZXJzICovCiAJCQlpZiAoKHdsb2NrX21hYyA9PSAxKSB8fCAod2xvY2tfbWFjICYmIChpID4gd2xvY2tfbWFjKSkpCiAJCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaHcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9ody5oCmluZGV4IDcyZjU0NzUuLjE5ZThjNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9ody5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9ody5oCkBAIC04Nyw2ICs4NywxMCBAQAogI2RlZmluZSBFMTAwMF9ERVZfSURfUENIX0kyMThfVjIJCTB4MTVBMQogI2RlZmluZSBFMTAwMF9ERVZfSURfUENIX0kyMThfTE0zCQkweDE1QTIJLyogV2lsZGNhdCBQb2ludCBQQ0ggKi8KICNkZWZpbmUgRTEwMDBfREVWX0lEX1BDSF9JMjE4X1YzCQkweDE1QTMJLyogV2lsZGNhdCBQb2ludCBQQ0ggKi8KKyNkZWZpbmUgRTEwMDBfREVWX0lEX1BDSF9TUFRfSTIxOV9MTQkJMHgxNTZGCS8qIFNQVCBQQ0ggKi8KKyNkZWZpbmUgRTEwMDBfREVWX0lEX1BDSF9TUFRfSTIxOV9WCQkweDE1NzAJLyogU1BUIFBDSCAqLworI2RlZmluZSBFMTAwMF9ERVZfSURfUENIX1NQVF9JMjE5X0xNMgkJMHgxNUI3CS8qIFNQVC1IIFBDSCAqLworI2RlZmluZSBFMTAwMF9ERVZfSURfUENIX1NQVF9JMjE5X1YyCQkweDE1QjgJLyogU1BULUggUENIICovCiAKICNkZWZpbmUgRTEwMDBfUkVWSVNJT05fNAk0CiAKQEAgLTEwOCw2ICsxMTIsNyBAQAogCWUxMDAwX3BjaGxhbiwKIAllMTAwMF9wY2gybGFuLAogCWUxMDAwX3BjaF9scHQsCisJZTEwMDBfcGNoX3NwdCwKIH07CiAKIGVudW0gZTEwMDBfbWVkaWFfdHlwZSB7CkBAIC0xNTMsNiArMTU4LDcgQEAKIAllMTAwMF9idXNfd2lkdGhfcGNpZV94MSwKIAllMTAwMF9idXNfd2lkdGhfcGNpZV94MiwKIAllMTAwMF9idXNfd2lkdGhfcGNpZV94NCA9IDQsCisJZTEwMDBfYnVzX3dpZHRoX3BjaWVfeDggPSA4LAogCWUxMDAwX2J1c193aWR0aF8zMiwKIAllMTAwMF9idXNfd2lkdGhfNjQsCiAJZTEwMDBfYnVzX3dpZHRoX3Jlc2VydmVkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaWNoOGxhbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2ljaDhsYW4uYwppbmRleCA0OGI3NGE1Li45ZDgxYzAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaWNoOGxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9pY2g4bGFuLmMKQEAgLTEyMyw2ICsxMjMsMTQgQEAKIAkJCQkJIHUxNiAqZGF0YSk7CiBzdGF0aWMgczMyIGUxMDAwX3JlYWRfZmxhc2hfZGF0YV9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsCiAJCQkJCSB1OCBzaXplLCB1MTYgKmRhdGEpOworc3RhdGljIHMzMiBlMTAwMF9yZWFkX2ZsYXNoX2RhdGEzMl9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsIHUzMiBvZmZzZXQsCisJCQkJCSAgIHUzMiAqZGF0YSk7CitzdGF0aWMgczMyIGUxMDAwX3JlYWRfZmxhc2hfZHdvcmRfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3LAorCQkJCQkgIHUzMiBvZmZzZXQsIHUzMiAqZGF0YSk7CitzdGF0aWMgczMyIGUxMDAwX3dyaXRlX2ZsYXNoX2RhdGEzMl9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsCisJCQkJCSAgICB1MzIgb2Zmc2V0LCB1MzIgZGF0YSk7CitzdGF0aWMgczMyIGUxMDAwX3JldHJ5X3dyaXRlX2ZsYXNoX2R3b3JkX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodywKKwkJCQkJCSB1MzIgb2Zmc2V0LCB1MzIgZHdvcmQpOwogc3RhdGljIHMzMiBlMTAwMF9rbXJuX2xvY2tfbG9zc193b3JrYXJvdW5kX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodyk7CiBzdGF0aWMgczMyIGUxMDAwX2NsZWFudXBfbGVkX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodyk7CiBzdGF0aWMgczMyIGUxMDAwX2xlZF9vbl9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpOwpAQCAtMjI5LDcgKzIzNyw4IEBACiAJaWYgKHJldF92YWwpCiAJCXJldHVybiBmYWxzZTsKIG91dDoKLQlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9scHQpIHsKKwlpZiAoKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfbHB0KSB8fAorCSAgICAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9zcHQpKSB7CiAJCS8qIFVuZm9yY2UgU01CdXMgbW9kZSBpbiBQSFkgKi8KIAkJZTFlX3JwaHlfbG9ja2VkKGh3LCBDVl9TTUJfQ1RSTCwgJnBoeV9yZWcpOwogCQlwaHlfcmVnICY9IH5DVl9TTUJfQ1RSTF9GT1JDRV9TTUJVUzsKQEAgLTMyMSw2ICszMzAsNyBAQAogCSAqLwogCXN3aXRjaCAoaHctPm1hYy50eXBlKSB7CiAJY2FzZSBlMTAwMF9wY2hfbHB0OgorCWNhc2UgZTEwMDBfcGNoX3NwdDoKIAkJaWYgKGUxMDAwX3BoeV9pc19hY2Nlc3NpYmxlX3BjaGxhbihodykpCiAJCQlicmVhazsKIApAQCAtNDYxLDYgKzQ3MSw3IEBACiAJCQkvKiBmYWxsLXRocm91Z2ggKi8KIAkJY2FzZSBlMTAwMF9wY2gybGFuOgogCQljYXNlIGUxMDAwX3BjaF9scHQ6CisJCWNhc2UgZTEwMDBfcGNoX3NwdDoKIAkJCS8qIEluIGNhc2UgdGhlIFBIWSBuZWVkcyB0byBiZSBpbiBtZGlvIHNsb3cgbW9kZSwKIAkJCSAqIHNldCBzbG93IG1vZGUgYW5kIHRyeSB0byBnZXQgdGhlIFBIWSBpZCBhZ2Fpbi4KIAkJCSAqLwpAQCAtNTkwLDM1ICs2MDEsNTQgQEAKIAlzdHJ1Y3QgZTEwMDBfZGV2X3NwZWNfaWNoOGxhbiAqZGV2X3NwZWMgPSAmaHctPmRldl9zcGVjLmljaDhsYW47CiAJdTMyIGdmcHJlZywgc2VjdG9yX2Jhc2VfYWRkciwgc2VjdG9yX2VuZF9hZGRyOwogCXUxNiBpOwotCi0JLyogQ2FuJ3QgcmVhZCBmbGFzaCByZWdpc3RlcnMgaWYgdGhlIHJlZ2lzdGVyIHNldCBpc24ndCBtYXBwZWQuICovCi0JaWYgKCFody0+Zmxhc2hfYWRkcmVzcykgewotCQllX2RiZygiRVJST1I6IEZsYXNoIHJlZ2lzdGVycyBub3QgbWFwcGVkXG4iKTsKLQkJcmV0dXJuIC1FMTAwMF9FUlJfQ09ORklHOwotCX0KKwl1MzIgbnZtX3NpemU7CiAKIAludm0tPnR5cGUgPSBlMTAwMF9udm1fZmxhc2hfc3c7CiAKLQlnZnByZWcgPSBlcjMyZmxhc2goSUNIX0ZMQVNIX0dGUFJFRyk7CisJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfc3B0KSB7CisJCS8qIGluIFNQVCwgZ2ZwcmVnIGRvZXNuJ3QgZXhpc3QuIE5WTSBzaXplIGlzIHRha2VuIGZyb20gdGhlCisJCSAqIFNUUkFQIHJlZ2lzdGVyLiBUaGlzIGlzIGJlY2F1c2UgaW4gU1BUIHRoZSBHYkUgRmxhc2ggcmVnaW9uCisJCSAqIGlzIG5vIGxvbmdlciBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBmbGFzaCByZWdpc3RlcnMuIEluc3RlYWQsCisJCSAqIHRoZSBtZWNoYW5pc20gaGFzIGNoYW5nZWQsIGFuZCB0aGUgRmxhc2ggcmVnaW9uIGFjY2VzcworCQkgKiByZWdpc3RlcnMgYXJlIG5vdyBpbXBsZW1lbnRlZCBpbiBHYkUgbWVtb3J5IHNwYWNlLgorCQkgKi8KKwkJbnZtLT5mbGFzaF9iYXNlX2FkZHIgPSAwOworCQludm1fc2l6ZSA9ICgoKGVyMzIoU1RSQVApID4+IDEpICYgMHgxRikgKyAxKQorCQkgICAgKiBOVk1fU0laRV9NVUxUSVBMSUVSOworCQludm0tPmZsYXNoX2Jhbmtfc2l6ZSA9IG52bV9zaXplIC8gMjsKKwkJLyogQWRqdXN0IHRvIHdvcmQgY291bnQgKi8KKwkJbnZtLT5mbGFzaF9iYW5rX3NpemUgLz0gc2l6ZW9mKHUxNik7CisJCS8qIFNldCB0aGUgYmFzZSBhZGRyZXNzIGZvciBmbGFzaCByZWdpc3RlciBhY2Nlc3MgKi8KKwkJaHctPmZsYXNoX2FkZHJlc3MgPSBody0+aHdfYWRkciArIEUxMDAwX0ZMQVNIX0JBU0VfQUREUjsKKwl9IGVsc2UgeworCQkvKiBDYW4ndCByZWFkIGZsYXNoIHJlZ2lzdGVycyBpZiByZWdpc3RlciBzZXQgaXNuJ3QgbWFwcGVkLiAqLworCQlpZiAoIWh3LT5mbGFzaF9hZGRyZXNzKSB7CisJCQllX2RiZygiRVJST1I6IEZsYXNoIHJlZ2lzdGVycyBub3QgbWFwcGVkXG4iKTsKKwkJCXJldHVybiAtRTEwMDBfRVJSX0NPTkZJRzsKKwkJfQogCi0JLyogc2VjdG9yX1hfYWRkciBpcyBhICJzZWN0b3IiLWFsaWduZWQgYWRkcmVzcyAoNDA5NiBieXRlcykKLQkgKiBBZGQgMSB0byBzZWN0b3JfZW5kX2FkZHIgc2luY2UgdGhpcyBzZWN0b3IgaXMgaW5jbHVkZWQgaW4KLQkgKiB0aGUgb3ZlcmFsbCBzaXplLgotCSAqLwotCXNlY3Rvcl9iYXNlX2FkZHIgPSBnZnByZWcgJiBGTEFTSF9HRlBSRUdfQkFTRV9NQVNLOwotCXNlY3Rvcl9lbmRfYWRkciA9ICgoZ2ZwcmVnID4+IDE2KSAmIEZMQVNIX0dGUFJFR19CQVNFX01BU0spICsgMTsKKwkJZ2ZwcmVnID0gZXIzMmZsYXNoKElDSF9GTEFTSF9HRlBSRUcpOwogCi0JLyogZmxhc2hfYmFzZV9hZGRyIGlzIGJ5dGUtYWxpZ25lZCAqLwotCW52bS0+Zmxhc2hfYmFzZV9hZGRyID0gc2VjdG9yX2Jhc2VfYWRkciA8PCBGTEFTSF9TRUNUT1JfQUREUl9TSElGVDsKKwkJLyogc2VjdG9yX1hfYWRkciBpcyBhICJzZWN0b3IiLWFsaWduZWQgYWRkcmVzcyAoNDA5NiBieXRlcykKKwkJICogQWRkIDEgdG8gc2VjdG9yX2VuZF9hZGRyIHNpbmNlIHRoaXMgc2VjdG9yIGlzIGluY2x1ZGVkIGluCisJCSAqIHRoZSBvdmVyYWxsIHNpemUuCisJCSAqLworCQlzZWN0b3JfYmFzZV9hZGRyID0gZ2ZwcmVnICYgRkxBU0hfR0ZQUkVHX0JBU0VfTUFTSzsKKwkJc2VjdG9yX2VuZF9hZGRyID0gKChnZnByZWcgPj4gMTYpICYgRkxBU0hfR0ZQUkVHX0JBU0VfTUFTSykgKyAxOwogCi0JLyogZmluZCB0b3RhbCBzaXplIG9mIHRoZSBOVk0sIHRoZW4gY3V0IGluIGhhbGYgc2luY2UgdGhlIHRvdGFsCi0JICogc2l6ZSByZXByZXNlbnRzIHR3byBzZXBhcmF0ZSBOVk0gYmFua3MuCi0JICovCi0JbnZtLT5mbGFzaF9iYW5rX3NpemUgPSAoKHNlY3Rvcl9lbmRfYWRkciAtIHNlY3Rvcl9iYXNlX2FkZHIpCi0JCQkJPDwgRkxBU0hfU0VDVE9SX0FERFJfU0hJRlQpOwotCW52bS0+Zmxhc2hfYmFua19zaXplIC89IDI7Ci0JLyogQWRqdXN0IHRvIHdvcmQgY291bnQgKi8KLQludm0tPmZsYXNoX2Jhbmtfc2l6ZSAvPSBzaXplb2YodTE2KTsKKwkJLyogZmxhc2hfYmFzZV9hZGRyIGlzIGJ5dGUtYWxpZ25lZCAqLworCQludm0tPmZsYXNoX2Jhc2VfYWRkciA9IHNlY3Rvcl9iYXNlX2FkZHIKKwkJICAgIDw8IEZMQVNIX1NFQ1RPUl9BRERSX1NISUZUOworCisJCS8qIGZpbmQgdG90YWwgc2l6ZSBvZiB0aGUgTlZNLCB0aGVuIGN1dCBpbiBoYWxmIHNpbmNlIHRoZSB0b3RhbAorCQkgKiBzaXplIHJlcHJlc2VudHMgdHdvIHNlcGFyYXRlIE5WTSBiYW5rcy4KKwkJICovCisJCW52bS0+Zmxhc2hfYmFua19zaXplID0gKChzZWN0b3JfZW5kX2FkZHIgLSBzZWN0b3JfYmFzZV9hZGRyKQorCQkJCQk8PCBGTEFTSF9TRUNUT1JfQUREUl9TSElGVCk7CisJCW52bS0+Zmxhc2hfYmFua19zaXplIC89IDI7CisJCS8qIEFkanVzdCB0byB3b3JkIGNvdW50ICovCisJCW52bS0+Zmxhc2hfYmFua19zaXplIC89IHNpemVvZih1MTYpOworCX0KIAogCW52bS0+d29yZF9zaXplID0gRTEwMDBfSUNIOF9TSEFET1dfUkFNX1dPUkRTOwogCkBAIC02ODIsNiArNzEyLDcgQEAKIAkJbWFjLT5vcHMucmFyX3NldCA9IGUxMDAwX3Jhcl9zZXRfcGNoMmxhbjsKIAkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSBlMTAwMF9wY2hfbHB0OgorCWNhc2UgZTEwMDBfcGNoX3NwdDoKIAljYXNlIGUxMDAwX3BjaGxhbjoKIAkJLyogY2hlY2sgbWFuYWdlbWVudCBtb2RlICovCiAJCW1hYy0+b3BzLmNoZWNrX21uZ19tb2RlID0gZTEwMDBfY2hlY2tfbW5nX21vZGVfcGNobGFuOwpAQCAtNjk5LDcgKzczMCw3IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChtYWMtPnR5cGUgPT0gZTEwMDBfcGNoX2xwdCkgeworCWlmICgobWFjLT50eXBlID09IGUxMDAwX3BjaF9scHQpIHx8IChtYWMtPnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkpIHsKIAkJbWFjLT5yYXJfZW50cnlfY291bnQgPSBFMTAwMF9QQ0hfTFBUX1JBUl9FTlRSSUVTOwogCQltYWMtPm9wcy5yYXJfc2V0ID0gZTEwMDBfcmFyX3NldF9wY2hfbHB0OwogCQltYWMtPm9wcy5zZXR1cF9waHlzaWNhbF9pbnRlcmZhY2UgPQpAQCAtOTE5LDggKzk1MCw5IEBACiAJCS8qIGNsZWFyIEZFWFROVk02IGJpdCA4IG9uIGxpbmsgZG93biBvciAxMC8xMDAgKi8KIAkJZmV4dG52bTYgJj0gfkUxMDAwX0ZFWFROVk02X1JFUV9QTExfQ0xLOwogCi0JCWlmICghbGluayB8fCAoKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19TUEVFRF8xMDApICYmCi0JCQkgICAgICAoc3RhdHVzICYgRTEwMDBfU1RBVFVTX0ZEKSkpCisJCWlmICgoaHctPnBoeS5yZXZpc2lvbiA+IDUpIHx8ICFsaW5rIHx8CisJCSAgICAoKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19TUEVFRF8xMDApICYmCisJCSAgICAgKHN0YXR1cyAmIEUxMDAwX1NUQVRVU19GRCkpKQogCQkJZ290byB1cGRhdGVfZmV4dG52bTY7CiAKIAkJcmV0X3ZhbCA9IGUxZV9ycGh5KGh3LCBJMjE3X0lOQkFORF9DVFJMLCAmcmVnKTsKQEAgLTExMDAsNiArMTEzMiwyMSBAQAogCWlmIChyZXRfdmFsKQogCQlnb3RvIG91dDsKIAorCS8qIFNpIHdvcmthcm91bmQgZm9yIFVMUCBlbnRyeSBmbG93IG9uIGkxMjcvcmV2NiBoL3cuICBFbmFibGUKKwkgKiBMUExVIGFuZCBkaXNhYmxlIEdpZyBzcGVlZCB3aGVuIGVudGVyaW5nIFVMUAorCSAqLworCWlmICgoaHctPnBoeS50eXBlID09IGUxMDAwX3BoeV9pMjE3KSAmJiAoaHctPnBoeS5yZXZpc2lvbiA9PSA2KSkgeworCQlyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnX2h2X2xvY2tlZChodywgSFZfT0VNX0JJVFMsCisJCQkJCQkgICAgICAgJnBoeV9yZWcpOworCQlpZiAocmV0X3ZhbCkKKwkJCWdvdG8gcmVsZWFzZTsKKwkJcGh5X3JlZyB8PSBIVl9PRU1fQklUU19MUExVIHwgSFZfT0VNX0JJVFNfR0JFX0RJUzsKKwkJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX3BoeV9yZWdfaHZfbG9ja2VkKGh3LCBIVl9PRU1fQklUUywKKwkJCQkJCQlwaHlfcmVnKTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIHJlbGVhc2U7CisJfQorCiAJLyogRm9yY2UgU01CdXMgbW9kZSBpbiBQSFkgKi8KIAlyZXRfdmFsID0gZTEwMDBfcmVhZF9waHlfcmVnX2h2X2xvY2tlZChodywgQ1ZfU01CX0NUUkwsICZwaHlfcmVnKTsKIAlpZiAocmV0X3ZhbCkKQEAgLTEzMDIsNyArMTM0OSw4IEBACiBzdGF0aWMgczMyIGUxMDAwX2NoZWNrX2Zvcl9jb3BwZXJfbGlua19pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CiAJc3RydWN0IGUxMDAwX21hY19pbmZvICptYWMgPSAmaHctPm1hYzsKLQlzMzIgcmV0X3ZhbDsKKwlzMzIgcmV0X3ZhbCwgdGlwZ19yZWcgPSAwOworCXUxNiBlbWlfYWRkciwgZW1pX3ZhbCA9IDA7CiAJYm9vbCBsaW5rOwogCXUxNiBwaHlfcmVnOwogCkBAIC0xMzMzLDQ4ICsxMzgxLDU1IEBACiAJICogdGhlIElQRyBhbmQgcmVkdWNlIFJ4IGxhdGVuY3kgaW4gdGhlIFBIWS4KIAkgKi8KIAlpZiAoKChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoMmxhbikgfHwKLQkgICAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX2xwdCkpICYmIGxpbmspIHsKKwkgICAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX2xwdCkgfHwKKwkgICAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkpICYmIGxpbmspIHsKIAkJdTMyIHJlZzsKIAogCQlyZWcgPSBlcjMyKFNUQVRVUyk7CisJCXRpcGdfcmVnID0gZXIzMihUSVBHKTsKKwkJdGlwZ19yZWcgJj0gfkUxMDAwX1RJUEdfSVBHVF9NQVNLOworCiAJCWlmICghKHJlZyAmIChFMTAwMF9TVEFUVVNfRkQgfCBFMTAwMF9TVEFUVVNfU1BFRURfTUFTSykpKSB7Ci0JCQl1MTYgZW1pX2FkZHI7Ci0KLQkJCXJlZyA9IGVyMzIoVElQRyk7Ci0JCQlyZWcgJj0gfkUxMDAwX1RJUEdfSVBHVF9NQVNLOwotCQkJcmVnIHw9IDB4RkY7Ci0JCQlldzMyKFRJUEcsIHJlZyk7Ci0KKwkJCXRpcGdfcmVnIHw9IDB4RkY7CiAJCQkvKiBSZWR1Y2UgUnggbGF0ZW5jeSBpbiBhbmFsb2cgUEhZICovCi0JCQlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZShodyk7Ci0JCQlpZiAocmV0X3ZhbCkKLQkJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJCWVtaV92YWwgPSAwOworCQl9IGVsc2UgewogCi0JCQlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaDJsYW4pCi0JCQkJZW1pX2FkZHIgPSBJODI1NzlfUlhfQ09ORklHOwotCQkJZWxzZQotCQkJCWVtaV9hZGRyID0gSTIxN19SWF9DT05GSUc7Ci0KLQkJCXJldF92YWwgPSBlMTAwMF93cml0ZV9lbWlfcmVnX2xvY2tlZChodywgZW1pX2FkZHIsIDApOwotCi0JCQlody0+cGh5Lm9wcy5yZWxlYXNlKGh3KTsKLQotCQkJaWYgKHJldF92YWwpCi0JCQkJcmV0dXJuIHJldF92YWw7CisJCQkvKiBSb2xsIGJhY2sgdGhlIGRlZmF1bHQgdmFsdWVzICovCisJCQl0aXBnX3JlZyB8PSAweDA4OworCQkJZW1pX3ZhbCA9IDE7CiAJCX0KKworCQlldzMyKFRJUEcsIHRpcGdfcmVnKTsKKworCQlyZXRfdmFsID0gaHctPnBoeS5vcHMuYWNxdWlyZShodyk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisKKwkJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2gybGFuKQorCQkJZW1pX2FkZHIgPSBJODI1NzlfUlhfQ09ORklHOworCQllbHNlCisJCQllbWlfYWRkciA9IEkyMTdfUlhfQ09ORklHOworCQlyZXRfdmFsID0gZTEwMDBfd3JpdGVfZW1pX3JlZ19sb2NrZWQoaHcsIGVtaV9hZGRyLCBlbWlfdmFsKTsKKworCQlody0+cGh5Lm9wcy5yZWxlYXNlKGh3KTsKKworCQlpZiAocmV0X3ZhbCkKKwkJCXJldHVybiByZXRfdmFsOwogCX0KIAogCS8qIFdvcmstYXJvdW5kIEkyMTggaGFuZyBpc3N1ZSAqLwogCWlmICgoaHctPmFkYXB0ZXItPnBkZXYtPmRldmljZSA9PSBFMTAwMF9ERVZfSURfUENIX0xQVExQX0kyMThfTE0pIHx8CiAJICAgIChody0+YWRhcHRlci0+cGRldi0+ZGV2aWNlID09IEUxMDAwX0RFVl9JRF9QQ0hfTFBUTFBfSTIxOF9WKSB8fAogCSAgICAoaHctPmFkYXB0ZXItPnBkZXYtPmRldmljZSA9PSBFMTAwMF9ERVZfSURfUENIX0kyMThfTE0zKSB8fAotCSAgICAoaHctPmFkYXB0ZXItPnBkZXYtPmRldmljZSA9PSBFMTAwMF9ERVZfSURfUENIX0kyMThfVjMpKSB7CisJICAgIChody0+YWRhcHRlci0+cGRldi0+ZGV2aWNlID09IEUxMDAwX0RFVl9JRF9QQ0hfSTIxOF9WMykgfHwKKwkgICAgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfc3B0KSkgewogCQlyZXRfdmFsID0gZTEwMDBfazFfd29ya2Fyb3VuZF9scHRfbHAoaHcsIGxpbmspOwogCQlpZiAocmV0X3ZhbCkKIAkJCXJldHVybiByZXRfdmFsOwogCX0KLQotCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX2xwdCkgeworCWlmICgoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9scHQpIHx8CisJICAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkpIHsKIAkJLyogU2V0IHBsYXRmb3JtIHBvd2VyIG1hbmFnZW1lbnQgdmFsdWVzIGZvcgogCQkgKiBMYXRlbmN5IFRvbGVyYW5jZSBSZXBvcnRpbmcgKExUUikKIAkJICovCkBAIC0xMzg2LDYgKzE0NDEsMTkgQEAKIAkvKiBDbGVhciBsaW5rIHBhcnRuZXIncyBFRUUgYWJpbGl0eSAqLwogCWh3LT5kZXZfc3BlYy5pY2g4bGFuLmVlZV9scF9hYmlsaXR5ID0gMDsKIAorCS8qIEZFWFROVk02IEsxLW9mZiB3b3JrYXJvdW5kICovCisJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfc3B0KSB7CisJCXUzMiBwY2llYW5hY2ZnID0gZXIzMihQQ0lFQU5BQ0ZHKTsKKwkJdTMyIGZleHRudm02ID0gZXIzMihGRVhUTlZNNik7CisKKwkJaWYgKHBjaWVhbmFjZmcgJiBFMTAwMF9GRVhUTlZNNl9LMV9PRkZfRU5BQkxFKQorCQkJZmV4dG52bTYgfD0gRTEwMDBfRkVYVE5WTTZfSzFfT0ZGX0VOQUJMRTsKKwkJZWxzZQorCQkJZmV4dG52bTYgJj0gfkUxMDAwX0ZFWFROVk02X0sxX09GRl9FTkFCTEU7CisKKwkJZXczMihGRVhUTlZNNiwgZmV4dG52bTYpOworCX0KKwogCWlmICghbGluaykKIAkJcmV0dXJuIDA7CS8qIE5vIGxpbmsgZGV0ZWN0ZWQgKi8KIApAQCAtMTQ3OSw2ICsxNTQ3LDcgQEAKIAljYXNlIGUxMDAwX3BjaGxhbjoKIAljYXNlIGUxMDAwX3BjaDJsYW46CiAJY2FzZSBlMTAwMF9wY2hfbHB0OgorCWNhc2UgZTEwMDBfcGNoX3NwdDoKIAkJcmMgPSBlMTAwMF9pbml0X3BoeV9wYXJhbXNfcGNobGFuKGh3KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE5MjksNiArMTk5OCw3IEBACiAJY2FzZSBlMTAwMF9wY2hsYW46CiAJY2FzZSBlMTAwMF9wY2gybGFuOgogCWNhc2UgZTEwMDBfcGNoX2xwdDoKKwljYXNlIGUxMDAwX3BjaF9zcHQ6CiAJCXN3X2NmZ19tYXNrID0gRTEwMDBfRkVYVE5WTV9TV19DT05GSUdfSUNIOE07CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yOTYxLDYgKzMwMzEsMjAgQEAKIAlzMzIgcmV0X3ZhbDsKIAogCXN3aXRjaCAoaHctPm1hYy50eXBlKSB7CisJCS8qIEluIFNQVCwgcmVhZCBmcm9tIHRoZSBDVFJMX0VYVCByZWcgaW5zdGVhZCBvZgorCQkgKiBhY2Nlc3NpbmcgdGhlIHNlY3RvciB2YWxpZCBiaXRzIGZyb20gdGhlIG52bQorCQkgKi8KKwljYXNlIGUxMDAwX3BjaF9zcHQ6CisJCSpiYW5rID0gZXIzMihDVFJMX0VYVCkKKwkJICAgICYgRTEwMDBfQ1RSTF9FWFRfTlZNVlM7CisJCWlmICgoKmJhbmsgPT0gMCkgfHwgKCpiYW5rID09IDEpKSB7CisJCQllX2RiZygiRVJST1I6IE5vIHZhbGlkIE5WTSBiYW5rIHByZXNlbnRcbiIpOworCQkJcmV0dXJuIC1FMTAwMF9FUlJfTlZNOworCQl9IGVsc2UgeworCQkJKmJhbmsgPSAqYmFuayAtIDI7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKIAljYXNlIGUxMDAwX2ljaDhsYW46CiAJY2FzZSBlMTAwMF9pY2g5bGFuOgogCQllZWNkID0gZXIzMihFRUNEKTsKQEAgLTMwMDgsNiArMzA5Miw5OSBAQAogfQogCiAvKioKKyAqICBlMTAwMF9yZWFkX252bV9zcHQgLSBOVk0gYWNjZXNzIGZvciBTUFQKKyAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICogIEBvZmZzZXQ6IFRoZSBvZmZzZXQgKGluIGJ5dGVzKSBvZiB0aGUgd29yZChzKSB0byByZWFkLgorICogIEB3b3JkczogU2l6ZSBvZiBkYXRhIHRvIHJlYWQgaW4gd29yZHMuCisgKiAgQGRhdGE6IHBvaW50ZXIgdG8gdGhlIHdvcmQocykgdG8gcmVhZCBhdCBvZmZzZXQuCisgKgorICogIFJlYWRzIGEgd29yZChzKSBmcm9tIHRoZSBOVk0KKyAqKi8KK3N0YXRpYyBzMzIgZTEwMDBfcmVhZF9udm1fc3B0KHN0cnVjdCBlMTAwMF9odyAqaHcsIHUxNiBvZmZzZXQsIHUxNiB3b3JkcywKKwkJCSAgICAgIHUxNiAqZGF0YSkKK3sKKwlzdHJ1Y3QgZTEwMDBfbnZtX2luZm8gKm52bSA9ICZody0+bnZtOworCXN0cnVjdCBlMTAwMF9kZXZfc3BlY19pY2g4bGFuICpkZXZfc3BlYyA9ICZody0+ZGV2X3NwZWMuaWNoOGxhbjsKKwl1MzIgYWN0X29mZnNldDsKKwlzMzIgcmV0X3ZhbCA9IDA7CisJdTMyIGJhbmsgPSAwOworCXUzMiBkd29yZCA9IDA7CisJdTE2IG9mZnNldF90b19yZWFkOworCXUxNiBpOworCisJaWYgKChvZmZzZXQgPj0gbnZtLT53b3JkX3NpemUpIHx8ICh3b3JkcyA+IG52bS0+d29yZF9zaXplIC0gb2Zmc2V0KSB8fAorCSAgICAod29yZHMgPT0gMCkpIHsKKwkJZV9kYmcoIm52bSBwYXJhbWV0ZXIocykgb3V0IG9mIGJvdW5kc1xuIik7CisJCXJldF92YWwgPSAtRTEwMDBfRVJSX05WTTsKKwkJZ290byBvdXQ7CisJfQorCisJbnZtLT5vcHMuYWNxdWlyZShodyk7CisKKwlyZXRfdmFsID0gZTEwMDBfdmFsaWRfbnZtX2JhbmtfZGV0ZWN0X2ljaDhsYW4oaHcsICZiYW5rKTsKKwlpZiAocmV0X3ZhbCkgeworCQllX2RiZygiQ291bGQgbm90IGRldGVjdCB2YWxpZCBiYW5rLCBhc3N1bWluZyBiYW5rIDBcbiIpOworCQliYW5rID0gMDsKKwl9CisKKwlhY3Rfb2Zmc2V0ID0gKGJhbmspID8gbnZtLT5mbGFzaF9iYW5rX3NpemUgOiAwOworCWFjdF9vZmZzZXQgKz0gb2Zmc2V0OworCisJcmV0X3ZhbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgd29yZHM7IGkgKz0gMikgeworCQlpZiAod29yZHMgLSBpID09IDEpIHsKKwkJCWlmIChkZXZfc3BlYy0+c2hhZG93X3JhbVtvZmZzZXQgKyBpXS5tb2RpZmllZCkgeworCQkJCWRhdGFbaV0gPQorCQkJCSAgICBkZXZfc3BlYy0+c2hhZG93X3JhbVtvZmZzZXQgKyBpXS52YWx1ZTsKKwkJCX0gZWxzZSB7CisJCQkJb2Zmc2V0X3RvX3JlYWQgPSBhY3Rfb2Zmc2V0ICsgaSAtCisJCQkJICAgICgoYWN0X29mZnNldCArIGkpICUgMik7CisJCQkJcmV0X3ZhbCA9CisJCQkJICBlMTAwMF9yZWFkX2ZsYXNoX2R3b3JkX2ljaDhsYW4oaHcsCisJCQkJCQkJCSBvZmZzZXRfdG9fcmVhZCwKKwkJCQkJCQkJICZkd29yZCk7CisJCQkJaWYgKHJldF92YWwpCisJCQkJCWJyZWFrOworCQkJCWlmICgoYWN0X29mZnNldCArIGkpICUgMiA9PSAwKQorCQkJCQlkYXRhW2ldID0gKHUxNikoZHdvcmQgJiAweEZGRkYpOworCQkJCWVsc2UKKwkJCQkJZGF0YVtpXSA9ICh1MTYpKChkd29yZCA+PiAxNikgJiAweEZGRkYpOworCQkJfQorCQl9IGVsc2UgeworCQkJb2Zmc2V0X3RvX3JlYWQgPSBhY3Rfb2Zmc2V0ICsgaTsKKwkJCWlmICghKGRldl9zcGVjLT5zaGFkb3dfcmFtW29mZnNldCArIGldLm1vZGlmaWVkKSB8fAorCQkJICAgICEoZGV2X3NwZWMtPnNoYWRvd19yYW1bb2Zmc2V0ICsgaSArIDFdLm1vZGlmaWVkKSkgeworCQkJCXJldF92YWwgPQorCQkJCSAgZTEwMDBfcmVhZF9mbGFzaF9kd29yZF9pY2g4bGFuKGh3LAorCQkJCQkJCQkgb2Zmc2V0X3RvX3JlYWQsCisJCQkJCQkJCSAmZHdvcmQpOworCQkJCWlmIChyZXRfdmFsKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChkZXZfc3BlYy0+c2hhZG93X3JhbVtvZmZzZXQgKyBpXS5tb2RpZmllZCkKKwkJCQlkYXRhW2ldID0KKwkJCQkgICAgZGV2X3NwZWMtPnNoYWRvd19yYW1bb2Zmc2V0ICsgaV0udmFsdWU7CisJCQllbHNlCisJCQkJZGF0YVtpXSA9ICh1MTYpKGR3b3JkICYgMHhGRkZGKTsKKwkJCWlmIChkZXZfc3BlYy0+c2hhZG93X3JhbVtvZmZzZXQgKyBpXS5tb2RpZmllZCkKKwkJCQlkYXRhW2kgKyAxXSA9CisJCQkJICAgIGRldl9zcGVjLT5zaGFkb3dfcmFtW29mZnNldCArIGkgKyAxXS52YWx1ZTsKKwkJCWVsc2UKKwkJCQlkYXRhW2kgKyAxXSA9ICh1MTYpKGR3b3JkID4+IDE2ICYgMHhGRkZGKTsKKwkJfQorCX0KKworCW52bS0+b3BzLnJlbGVhc2UoaHcpOworCitvdXQ6CisJaWYgKHJldF92YWwpCisJCWVfZGJnKCJOVk0gcmVhZCBlcnJvcjogJWRcbiIsIHJldF92YWwpOworCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgogICogIGUxMDAwX3JlYWRfbnZtX2ljaDhsYW4gLSBSZWFkIHdvcmQocykgZnJvbSB0aGUgTlZNCiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqICBAb2Zmc2V0OiBUaGUgb2Zmc2V0IChpbiBieXRlcykgb2YgdGhlIHdvcmQocykgdG8gcmVhZC4KQEAgLTMwOTAsOCArMzI2NywxMCBAQAogCS8qIENsZWFyIEZDRVJSIGFuZCBEQUVMIGluIGh3IHN0YXR1cyBieSB3cml0aW5nIDEgKi8KIAloc2ZzdHMuaHNmX3N0YXR1cy5mbGNlcnIgPSAxOwogCWhzZnN0cy5oc2Zfc3RhdHVzLmRhZWwgPSAxOwotCi0JZXcxNmZsYXNoKElDSF9GTEFTSF9IU0ZTVFMsIGhzZnN0cy5yZWd2YWwpOworCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkKKwkJZXczMmZsYXNoKElDSF9GTEFTSF9IU0ZTVFMsIGhzZnN0cy5yZWd2YWwgJiAweEZGRkYpOworCWVsc2UKKwkJZXcxNmZsYXNoKElDSF9GTEFTSF9IU0ZTVFMsIGhzZnN0cy5yZWd2YWwpOwogCiAJLyogRWl0aGVyIHdlIHNob3VsZCBoYXZlIGEgaGFyZHdhcmUgU1BJIGN5Y2xlIGluIHByb2dyZXNzCiAJICogYml0IHRvIGNoZWNrIGFnYWluc3QsIGluIG9yZGVyIHRvIHN0YXJ0IGEgbmV3IGN5Y2xlIG9yCkBAIC0zMTA3LDcgKzMyODYsMTAgQEAKIAkJICogQmVnaW4gYnkgc2V0dGluZyBGbGFzaCBDeWNsZSBEb25lLgogCQkgKi8KIAkJaHNmc3RzLmhzZl9zdGF0dXMuZmxjZG9uZSA9IDE7Ci0JCWV3MTZmbGFzaChJQ0hfRkxBU0hfSFNGU1RTLCBoc2ZzdHMucmVndmFsKTsKKwkJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfc3B0KQorCQkJZXczMmZsYXNoKElDSF9GTEFTSF9IU0ZTVFMsIGhzZnN0cy5yZWd2YWwgJiAweEZGRkYpOworCQllbHNlCisJCQlldzE2Zmxhc2goSUNIX0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7CiAJCXJldF92YWwgPSAwOwogCX0gZWxzZSB7CiAJCXMzMiBpOwpAQCAtMzEyOCw3ICszMzEwLDExIEBACiAJCQkgKiBub3cgc2V0IHRoZSBGbGFzaCBDeWNsZSBEb25lLgogCQkJICovCiAJCQloc2ZzdHMuaHNmX3N0YXR1cy5mbGNkb25lID0gMTsKLQkJCWV3MTZmbGFzaChJQ0hfRkxBU0hfSFNGU1RTLCBoc2ZzdHMucmVndmFsKTsKKwkJCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkKKwkJCQlldzMyZmxhc2goSUNIX0ZMQVNIX0hTRlNUUywKKwkJCQkJICBoc2ZzdHMucmVndmFsICYgMHhGRkZGKTsKKwkJCWVsc2UKKwkJCQlldzE2Zmxhc2goSUNIX0ZMQVNIX0hTRlNUUywgaHNmc3RzLnJlZ3ZhbCk7CiAJCX0gZWxzZSB7CiAJCQllX2RiZygiRmxhc2ggY29udHJvbGxlciBidXN5LCBjYW5ub3QgZ2V0IGFjY2Vzc1xuIik7CiAJCX0KQEAgLTMxNTEsOSArMzMzNywxNiBAQAogCXUzMiBpID0gMDsKIAogCS8qIFN0YXJ0IGEgY3ljbGUgYnkgd3JpdGluZyAxIGluIEZsYXNoIEN5Y2xlIEdvIGluIEh3IEZsYXNoIENvbnRyb2wgKi8KLQloc2ZsY3RsLnJlZ3ZhbCA9IGVyMTZmbGFzaChJQ0hfRkxBU0hfSFNGQ1RMKTsKKwlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9zcHQpCisJCWhzZmxjdGwucmVndmFsID0gZXIzMmZsYXNoKElDSF9GTEFTSF9IU0ZTVFMpID4+IDE2OworCWVsc2UKKwkJaHNmbGN0bC5yZWd2YWwgPSBlcjE2Zmxhc2goSUNIX0ZMQVNIX0hTRkNUTCk7CiAJaHNmbGN0bC5oc2ZfY3RybC5mbGNnbyA9IDE7Ci0JZXcxNmZsYXNoKElDSF9GTEFTSF9IU0ZDVEwsIGhzZmxjdGwucmVndmFsKTsKKworCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkKKwkJZXczMmZsYXNoKElDSF9GTEFTSF9IU0ZTVFMsIGhzZmxjdGwucmVndmFsIDw8IDE2KTsKKwllbHNlCisJCWV3MTZmbGFzaChJQ0hfRkxBU0hfSFNGQ1RMLCBoc2ZsY3RsLnJlZ3ZhbCk7CiAKIAkvKiB3YWl0IHRpbGwgRkRPTkUgYml0IGlzIHNldCB0byAxICovCiAJZG8gewpAQCAtMzE3MCw2ICszMzYzLDIzIEBACiB9CiAKIC8qKgorICogIGUxMDAwX3JlYWRfZmxhc2hfZHdvcmRfaWNoOGxhbiAtIFJlYWQgZHdvcmQgZnJvbSBmbGFzaAorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG9mZnNldDogb2Zmc2V0IHRvIGRhdGEgbG9jYXRpb24KKyAqICBAZGF0YTogcG9pbnRlciB0byB0aGUgbG9jYXRpb24gZm9yIHN0b3JpbmcgdGhlIGRhdGEKKyAqCisgKiAgUmVhZHMgdGhlIGZsYXNoIGR3b3JkIGF0IG9mZnNldCBpbnRvIGRhdGEuICBPZmZzZXQgaXMgY29udmVydGVkCisgKiAgdG8gYnl0ZXMgYmVmb3JlIHJlYWQuCisgKiovCitzdGF0aWMgczMyIGUxMDAwX3JlYWRfZmxhc2hfZHdvcmRfaWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MzIgb2Zmc2V0LAorCQkJCQkgIHUzMiAqZGF0YSkKK3sKKwkvKiBNdXN0IGNvbnZlcnQgd29yZCBvZmZzZXQgaW50byBieXRlcy4gKi8KKwlvZmZzZXQgPDw9IDE7CisJcmV0dXJuIGUxMDAwX3JlYWRfZmxhc2hfZGF0YTMyX2ljaDhsYW4oaHcsIG9mZnNldCwgZGF0YSk7Cit9CisKKy8qKgogICogIGUxMDAwX3JlYWRfZmxhc2hfd29yZF9pY2g4bGFuIC0gUmVhZCB3b3JkIGZyb20gZmxhc2gKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBvZmZzZXQ6IG9mZnNldCB0byBkYXRhIGxvY2F0aW9uCkBAIC0zMjAxLDcgKzM0MTEsMTQgQEAKIAlzMzIgcmV0X3ZhbDsKIAl1MTYgd29yZCA9IDA7CiAKLQlyZXRfdmFsID0gZTEwMDBfcmVhZF9mbGFzaF9kYXRhX2ljaDhsYW4oaHcsIG9mZnNldCwgMSwgJndvcmQpOworCS8qIEluIFNQVCwgb25seSAzMiBiaXRzIGFjY2VzcyBpcyBzdXBwb3J0ZWQsCisJICogc28gdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZC4KKwkgKi8KKwlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9zcHQpCisJCXJldHVybiAtRTEwMDBfRVJSX05WTTsKKwllbHNlCisJCXJldF92YWwgPSBlMTAwMF9yZWFkX2ZsYXNoX2RhdGFfaWNoOGxhbihodywgb2Zmc2V0LCAxLCAmd29yZCk7CisKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CiAKQEAgLTMyODcsNiArMzUwNCw4MiBAQAogfQogCiAvKioKKyAqICBlMTAwMF9yZWFkX2ZsYXNoX2RhdGEzMl9pY2g4bGFuIC0gUmVhZCBkd29yZCBmcm9tIE5WTQorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKiAgQG9mZnNldDogVGhlIG9mZnNldCAoaW4gYnl0ZXMpIG9mIHRoZSBkd29yZCB0byByZWFkLgorICogIEBkYXRhOiBQb2ludGVyIHRvIHRoZSBkd29yZCB0byBzdG9yZSB0aGUgdmFsdWUgcmVhZC4KKyAqCisgKiAgUmVhZHMgYSBieXRlIG9yIHdvcmQgZnJvbSB0aGUgTlZNIHVzaW5nIHRoZSBmbGFzaCBhY2Nlc3MgcmVnaXN0ZXJzLgorICoqLworCitzdGF0aWMgczMyIGUxMDAwX3JlYWRfZmxhc2hfZGF0YTMyX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwKKwkJCQkJICAgdTMyICpkYXRhKQoreworCXVuaW9uIGljaDhfaHdzX2ZsYXNoX3N0YXR1cyBoc2ZzdHM7CisJdW5pb24gaWNoOF9od3NfZmxhc2hfY3RybCBoc2ZsY3RsOworCXUzMiBmbGFzaF9saW5lYXJfYWRkcjsKKwlzMzIgcmV0X3ZhbCA9IC1FMTAwMF9FUlJfTlZNOworCXU4IGNvdW50ID0gMDsKKworCWlmIChvZmZzZXQgPiBJQ0hfRkxBU0hfTElORUFSX0FERFJfTUFTSyB8fAorCSAgICBody0+bWFjLnR5cGUgIT0gZTEwMDBfcGNoX3NwdCkKKwkJcmV0dXJuIC1FMTAwMF9FUlJfTlZNOworCWZsYXNoX2xpbmVhcl9hZGRyID0gKChJQ0hfRkxBU0hfTElORUFSX0FERFJfTUFTSyAmIG9mZnNldCkgKworCQkJICAgICBody0+bnZtLmZsYXNoX2Jhc2VfYWRkcik7CisKKwlkbyB7CisJCXVkZWxheSgxKTsKKwkJLyogU3RlcHMgKi8KKwkJcmV0X3ZhbCA9IGUxMDAwX2ZsYXNoX2N5Y2xlX2luaXRfaWNoOGxhbihodyk7CisJCWlmIChyZXRfdmFsKQorCQkJYnJlYWs7CisJCS8qIEluIFNQVCwgVGhpcyByZWdpc3RlciBpcyBpbiBMYW4gbWVtb3J5IHNwYWNlLCBub3QgZmxhc2guCisJCSAqIFRoZXJlZm9yZSwgb25seSAzMiBiaXQgYWNjZXNzIGlzIHN1cHBvcnRlZAorCQkgKi8KKwkJaHNmbGN0bC5yZWd2YWwgPSBlcjMyZmxhc2goSUNIX0ZMQVNIX0hTRlNUUykgPj4gMTY7CisKKwkJLyogMGIvMWIgY29ycmVzcG9uZHMgdG8gMSBvciAyIGJ5dGUgc2l6ZSwgcmVzcGVjdGl2ZWx5LiAqLworCQloc2ZsY3RsLmhzZl9jdHJsLmZsZGJjb3VudCA9IHNpemVvZih1MzIpIC0gMTsKKwkJaHNmbGN0bC5oc2ZfY3RybC5mbGN5Y2xlID0gSUNIX0NZQ0xFX1JFQUQ7CisJCS8qIEluIFNQVCwgVGhpcyByZWdpc3RlciBpcyBpbiBMYW4gbWVtb3J5IHNwYWNlLCBub3QgZmxhc2guCisJCSAqIFRoZXJlZm9yZSwgb25seSAzMiBiaXQgYWNjZXNzIGlzIHN1cHBvcnRlZAorCQkgKi8KKwkJZXczMmZsYXNoKElDSF9GTEFTSF9IU0ZTVFMsICh1MzIpaHNmbGN0bC5yZWd2YWwgPDwgMTYpOworCQlldzMyZmxhc2goSUNIX0ZMQVNIX0ZBRERSLCBmbGFzaF9saW5lYXJfYWRkcik7CisKKwkJcmV0X3ZhbCA9CisJCSAgIGUxMDAwX2ZsYXNoX2N5Y2xlX2ljaDhsYW4oaHcsCisJCQkJCSAgICAgSUNIX0ZMQVNIX1JFQURfQ09NTUFORF9USU1FT1VUKTsKKworCQkvKiBDaGVjayBpZiBGQ0VSUiBpcyBzZXQgdG8gMSwgaWYgc2V0IHRvIDEsIGNsZWFyIGl0CisJCSAqIGFuZCB0cnkgdGhlIHdob2xlIHNlcXVlbmNlIGEgZmV3IG1vcmUgdGltZXMsIGVsc2UKKwkJICogcmVhZCBpbiAoc2hpZnQgaW4pIHRoZSBGbGFzaCBEYXRhMCwgdGhlIG9yZGVyIGlzCisJCSAqIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgbXNiIHRvIGxzYgorCQkgKi8KKwkJaWYgKCFyZXRfdmFsKSB7CisJCQkqZGF0YSA9IGVyMzJmbGFzaChJQ0hfRkxBU0hfRkRBVEEwKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJLyogSWYgd2UndmUgZ290dGVuIGhlcmUsIHRoZW4gdGhpbmdzIGFyZSBwcm9iYWJseQorCQkJICogY29tcGxldGVseSBob3NlZCwgYnV0IGlmIHRoZSBlcnJvciBjb25kaXRpb24gaXMKKwkJCSAqIGRldGVjdGVkLCBpdCB3b24ndCBodXJ0IHRvIGdpdmUgaXQgYW5vdGhlciB0cnkuLi4KKwkJCSAqIElDSF9GTEFTSF9DWUNMRV9SRVBFQVRfQ09VTlQgdGltZXMuCisJCQkgKi8KKwkJCWhzZnN0cy5yZWd2YWwgPSBlcjE2Zmxhc2goSUNIX0ZMQVNIX0hTRlNUUyk7CisJCQlpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxjZXJyKSB7CisJCQkJLyogUmVwZWF0IGZvciBzb21lIHRpbWUgYmVmb3JlIGdpdmluZyB1cC4gKi8KKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoIWhzZnN0cy5oc2Zfc3RhdHVzLmZsY2RvbmUpIHsKKwkJCQllX2RiZygiVGltZW91dCBlcnJvciAtIGZsYXNoIGN5Y2xlIGRpZCBub3QgY29tcGxldGUuXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKGNvdW50KysgPCBJQ0hfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UKTsKKworCXJldHVybiByZXRfdmFsOworfQorCisvKioKICAqICBlMTAwMF93cml0ZV9udm1faWNoOGxhbiAtIFdyaXRlIHdvcmQocykgdG8gdGhlIE5WTQogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKiAgQG9mZnNldDogVGhlIG9mZnNldCAoaW4gYnl0ZXMpIG9mIHRoZSB3b3JkKHMpIHRvIHdyaXRlLgpAQCAtMzMyMSw3ICszNjE0LDcgQEAKIH0KIAogLyoqCi0gKiAgZTEwMDBfdXBkYXRlX252bV9jaGVja3N1bV9pY2g4bGFuIC0gVXBkYXRlIHRoZSBjaGVja3N1bSBmb3IgTlZNCisgKiAgZTEwMDBfdXBkYXRlX252bV9jaGVja3N1bV9zcHQgLSBVcGRhdGUgdGhlIGNoZWNrc3VtIGZvciBOVk0KICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICoKICAqICBUaGUgTlZNIGNoZWNrc3VtIGlzIHVwZGF0ZWQgYnkgY2FsbGluZyB0aGUgZ2VuZXJpYyB1cGRhdGVfbnZtX2NoZWNrc3VtLApAQCAtMzMzMSwxMyArMzYyNCwxMyBAQAogICogIEFmdGVyIGEgc3VjY2Vzc2Z1bCBjb21taXQsIHRoZSBzaGFkb3cgcmFtIGlzIGNsZWFyZWQgYW5kIGlzIHJlYWR5IGZvcgogICogIGZ1dHVyZSB3cml0ZXMuCiAgKiovCi1zdGF0aWMgczMyIGUxMDAwX3VwZGF0ZV9udm1fY2hlY2tzdW1faWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQorc3RhdGljIHMzMiBlMTAwMF91cGRhdGVfbnZtX2NoZWNrc3VtX3NwdChzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewogCXN0cnVjdCBlMTAwMF9udm1faW5mbyAqbnZtID0gJmh3LT5udm07CiAJc3RydWN0IGUxMDAwX2Rldl9zcGVjX2ljaDhsYW4gKmRldl9zcGVjID0gJmh3LT5kZXZfc3BlYy5pY2g4bGFuOwogCXUzMiBpLCBhY3Rfb2Zmc2V0LCBuZXdfYmFua19vZmZzZXQsIG9sZF9iYW5rX29mZnNldCwgYmFuazsKIAlzMzIgcmV0X3ZhbDsKLQl1MTYgZGF0YTsKKwl1MzIgZHdvcmQgPSAwOwogCiAJcmV0X3ZhbCA9IGUxMDAwZV91cGRhdGVfbnZtX2NoZWNrc3VtX2dlbmVyaWMoaHcpOwogCWlmIChyZXRfdmFsKQpAQCAtMzM3MSwxMiArMzY2NCwxNzUgQEAKIAkJaWYgKHJldF92YWwpCiAJCQlnb3RvIHJlbGVhc2U7CiAJfQotCi0JZm9yIChpID0gMDsgaSA8IEUxMDAwX0lDSDhfU0hBRE9XX1JBTV9XT1JEUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEUxMDAwX0lDSDhfU0hBRE9XX1JBTV9XT1JEUzsgaSArPSAyKSB7CiAJCS8qIERldGVybWluZSB3aGV0aGVyIHRvIHdyaXRlIHRoZSB2YWx1ZSBzdG9yZWQKIAkJICogaW4gdGhlIG90aGVyIE5WTSBiYW5rIG9yIGEgbW9kaWZpZWQgdmFsdWUgc3RvcmVkCiAJCSAqIGluIHRoZSBzaGFkb3cgUkFNCiAJCSAqLworCQlyZXRfdmFsID0gZTEwMDBfcmVhZF9mbGFzaF9kd29yZF9pY2g4bGFuKGh3LAorCQkJCQkJCSBpICsgb2xkX2Jhbmtfb2Zmc2V0LAorCQkJCQkJCSAmZHdvcmQpOworCisJCWlmIChkZXZfc3BlYy0+c2hhZG93X3JhbVtpXS5tb2RpZmllZCkgeworCQkJZHdvcmQgJj0gMHhmZmZmMDAwMDsKKwkJCWR3b3JkIHw9IChkZXZfc3BlYy0+c2hhZG93X3JhbVtpXS52YWx1ZSAmIDB4ZmZmZik7CisJCX0KKwkJaWYgKGRldl9zcGVjLT5zaGFkb3dfcmFtW2kgKyAxXS5tb2RpZmllZCkgeworCQkJZHdvcmQgJj0gMHgwMDAwZmZmZjsKKwkJCWR3b3JkIHw9ICgoZGV2X3NwZWMtPnNoYWRvd19yYW1baSArIDFdLnZhbHVlICYgMHhmZmZmKQorCQkJCSAgPDwgMTYpOworCQl9CisJCWlmIChyZXRfdmFsKQorCQkJYnJlYWs7CisKKwkJLyogSWYgdGhlIHdvcmQgaXMgMHgxMywgdGhlbiBtYWtlIHN1cmUgdGhlIHNpZ25hdHVyZSBiaXRzCisJCSAqICgxNToxNCkgYXJlIDExYiB1bnRpbCB0aGUgY29tbWl0IGhhcyBjb21wbGV0ZWQuCisJCSAqIFRoaXMgd2lsbCBhbGxvdyB1cyB0byB3cml0ZSAxMGIgd2hpY2ggaW5kaWNhdGVzIHRoZQorCQkgKiBzaWduYXR1cmUgaXMgdmFsaWQuICBXZSB3YW50IHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIHdyaXRlCisJCSAqIGhhcyBjb21wbGV0ZWQgc28gdGhhdCB3ZSBkb24ndCBtYXJrIHRoZSBzZWdtZW50IHZhbGlkCisJCSAqIHdoaWxlIHRoZSB3cml0ZSBpcyBzdGlsbCBpbiBwcm9ncmVzcworCQkgKi8KKwkJaWYgKGkgPT0gRTEwMDBfSUNIX05WTV9TSUdfV09SRCAtIDEpCisJCQlkd29yZCB8PSBFMTAwMF9JQ0hfTlZNX1NJR19NQVNLIDw8IDE2OworCisJCS8qIENvbnZlcnQgb2Zmc2V0IHRvIGJ5dGVzLiAqLworCQlhY3Rfb2Zmc2V0ID0gKGkgKyBuZXdfYmFua19vZmZzZXQpIDw8IDE7CisKKwkJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKKworCQkvKiBXcml0ZSB0aGUgZGF0YSB0byB0aGUgbmV3IGJhbmsuIE9mZnNldCBpbiB3b3JkcyAqLworCQlhY3Rfb2Zmc2V0ID0gaSArIG5ld19iYW5rX29mZnNldDsKKwkJcmV0X3ZhbCA9IGUxMDAwX3JldHJ5X3dyaXRlX2ZsYXNoX2R3b3JkX2ljaDhsYW4oaHcsIGFjdF9vZmZzZXQsCisJCQkJCQkJCWR3b3JkKTsKKwkJaWYgKHJldF92YWwpCisJCQlicmVhazsKKwl9CisKKwkvKiBEb24ndCBib3RoZXIgd3JpdGluZyB0aGUgc2VnbWVudCB2YWxpZCBiaXRzIGlmIHNlY3RvcgorCSAqIHByb2dyYW1taW5nIGZhaWxlZC4KKwkgKi8KKwlpZiAocmV0X3ZhbCkgeworCQkvKiBQb3NzaWJseSByZWFkLW9ubHksIHNlZSBlMTAwMGVfd3JpdGVfcHJvdGVjdF9udm1faWNoOGxhbigpICovCisJCWVfZGJnKCJGbGFzaCBjb21taXQgZmFpbGVkLlxuIik7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwkvKiBGaW5hbGx5IHZhbGlkYXRlIHRoZSBuZXcgc2VnbWVudCBieSBzZXR0aW5nIGJpdCAxNToxNAorCSAqIHRvIDEwYiBpbiB3b3JkIDB4MTMgLCB0aGlzIGNhbiBiZSBkb25lIHdpdGhvdXQgYW4KKwkgKiBlcmFzZSBhcyB3ZWxsIHNpbmNlIHRoZXNlIGJpdHMgYXJlIDExIHRvIHN0YXJ0IHdpdGgKKwkgKiBhbmQgd2UgbmVlZCB0byBjaGFuZ2UgYml0IDE0IHRvIDBiCisJICovCisJYWN0X29mZnNldCA9IG5ld19iYW5rX29mZnNldCArIEUxMDAwX0lDSF9OVk1fU0lHX1dPUkQ7CisKKwkvKm9mZnNldCBpbiB3b3JkcyBidXQgd2UgcmVhZCBkd29yZCAqLworCS0tYWN0X29mZnNldDsKKwlyZXRfdmFsID0gZTEwMDBfcmVhZF9mbGFzaF9kd29yZF9pY2g4bGFuKGh3LCBhY3Rfb2Zmc2V0LCAmZHdvcmQpOworCisJaWYgKHJldF92YWwpCisJCWdvdG8gcmVsZWFzZTsKKworCWR3b3JkICY9IDB4QkZGRkZGRkY7CisJcmV0X3ZhbCA9IGUxMDAwX3JldHJ5X3dyaXRlX2ZsYXNoX2R3b3JkX2ljaDhsYW4oaHcsIGFjdF9vZmZzZXQsIGR3b3JkKTsKKworCWlmIChyZXRfdmFsKQorCQlnb3RvIHJlbGVhc2U7CisKKwkvKiBBbmQgaW52YWxpZGF0ZSB0aGUgcHJldmlvdXNseSB2YWxpZCBzZWdtZW50IGJ5IHNldHRpbmcKKwkgKiBpdHMgc2lnbmF0dXJlIHdvcmQgKDB4MTMpIGhpZ2hfYnl0ZSB0byAwYi4gVGhpcyBjYW4gYmUKKwkgKiBkb25lIHdpdGhvdXQgYW4gZXJhc2UgYmVjYXVzZSBmbGFzaCBlcmFzZSBzZXRzIGFsbCBiaXRzCisJICogdG8gMSdzLiBXZSBjYW4gd3JpdGUgMSdzIHRvIDAncyB3aXRob3V0IGFuIGVyYXNlCisJICovCisJYWN0X29mZnNldCA9IChvbGRfYmFua19vZmZzZXQgKyBFMTAwMF9JQ0hfTlZNX1NJR19XT1JEKSAqIDIgKyAxOworCisJLyogb2Zmc2V0IGluIHdvcmRzIGJ1dCB3ZSByZWFkIGR3b3JkICovCisJYWN0X29mZnNldCA9IG9sZF9iYW5rX29mZnNldCArIEUxMDAwX0lDSF9OVk1fU0lHX1dPUkQgLSAxOworCXJldF92YWwgPSBlMTAwMF9yZWFkX2ZsYXNoX2R3b3JkX2ljaDhsYW4oaHcsIGFjdF9vZmZzZXQsICZkd29yZCk7CisKKwlpZiAocmV0X3ZhbCkKKwkJZ290byByZWxlYXNlOworCisJZHdvcmQgJj0gMHgwMEZGRkZGRjsKKwlyZXRfdmFsID0gZTEwMDBfcmV0cnlfd3JpdGVfZmxhc2hfZHdvcmRfaWNoOGxhbihodywgYWN0X29mZnNldCwgZHdvcmQpOworCisJaWYgKHJldF92YWwpCisJCWdvdG8gcmVsZWFzZTsKKworCS8qIEdyZWF0ISAgRXZlcnl0aGluZyB3b3JrZWQsIHdlIGNhbiBub3cgY2xlYXIgdGhlIGNhY2hlZCBlbnRyaWVzLiAqLworCWZvciAoaSA9IDA7IGkgPCBFMTAwMF9JQ0g4X1NIQURPV19SQU1fV09SRFM7IGkrKykgeworCQlkZXZfc3BlYy0+c2hhZG93X3JhbVtpXS5tb2RpZmllZCA9IGZhbHNlOworCQlkZXZfc3BlYy0+c2hhZG93X3JhbVtpXS52YWx1ZSA9IDB4RkZGRjsKKwl9CisKK3JlbGVhc2U6CisJbnZtLT5vcHMucmVsZWFzZShodyk7CisKKwkvKiBSZWxvYWQgdGhlIEVFUFJPTSwgb3IgZWxzZSBtb2RpZmljYXRpb25zIHdpbGwgbm90IGFwcGVhcgorCSAqIHVudGlsIGFmdGVyIHRoZSBuZXh0IGFkYXB0ZXIgcmVzZXQuCisJICovCisJaWYgKCFyZXRfdmFsKSB7CisJCW52bS0+b3BzLnJlbG9hZChodyk7CisJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOworCX0KKworb3V0OgorCWlmIChyZXRfdmFsKQorCQllX2RiZygiTlZNIHVwZGF0ZSBlcnJvcjogJWRcbiIsIHJldF92YWwpOworCisJcmV0dXJuIHJldF92YWw7Cit9CisKKy8qKgorICogIGUxMDAwX3VwZGF0ZV9udm1fY2hlY2tzdW1faWNoOGxhbiAtIFVwZGF0ZSB0aGUgY2hlY2tzdW0gZm9yIE5WTQorICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisgKgorICogIFRoZSBOVk0gY2hlY2tzdW0gaXMgdXBkYXRlZCBieSBjYWxsaW5nIHRoZSBnZW5lcmljIHVwZGF0ZV9udm1fY2hlY2tzdW0sCisgKiAgd2hpY2ggd3JpdGVzIHRoZSBjaGVja3N1bSB0byB0aGUgc2hhZG93IHJhbS4gIFRoZSBjaGFuZ2VzIGluIHRoZSBzaGFkb3cKKyAqICByYW0gYXJlIHRoZW4gY29tbWl0dGVkIHRvIHRoZSBFRVBST00gYnkgcHJvY2Vzc2luZyBlYWNoIGJhbmsgYXQgYSB0aW1lCisgKiAgY2hlY2tpbmcgZm9yIHRoZSBtb2RpZmllZCBiaXQgYW5kIHdyaXRpbmcgb25seSB0aGUgcGVuZGluZyBjaGFuZ2VzLgorICogIEFmdGVyIGEgc3VjY2Vzc2Z1bCBjb21taXQsIHRoZSBzaGFkb3cgcmFtIGlzIGNsZWFyZWQgYW5kIGlzIHJlYWR5IGZvcgorICogIGZ1dHVyZSB3cml0ZXMuCisgKiovCitzdGF0aWMgczMyIGUxMDAwX3VwZGF0ZV9udm1fY2hlY2tzdW1faWNoOGxhbihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQoreworCXN0cnVjdCBlMTAwMF9udm1faW5mbyAqbnZtID0gJmh3LT5udm07CisJc3RydWN0IGUxMDAwX2Rldl9zcGVjX2ljaDhsYW4gKmRldl9zcGVjID0gJmh3LT5kZXZfc3BlYy5pY2g4bGFuOworCXUzMiBpLCBhY3Rfb2Zmc2V0LCBuZXdfYmFua19vZmZzZXQsIG9sZF9iYW5rX29mZnNldCwgYmFuazsKKwlzMzIgcmV0X3ZhbDsKKwl1MTYgZGF0YSA9IDA7CisKKwlyZXRfdmFsID0gZTEwMDBlX3VwZGF0ZV9udm1fY2hlY2tzdW1fZ2VuZXJpYyhodyk7CisJaWYgKHJldF92YWwpCisJCWdvdG8gb3V0OworCisJaWYgKG52bS0+dHlwZSAhPSBlMTAwMF9udm1fZmxhc2hfc3cpCisJCWdvdG8gb3V0OworCisJbnZtLT5vcHMuYWNxdWlyZShodyk7CisKKwkvKiBXZSdyZSB3cml0aW5nIHRvIHRoZSBvcHBvc2l0ZSBiYW5rIHNvIGlmIHdlJ3JlIG9uIGJhbmsgMSwKKwkgKiB3cml0ZSB0byBiYW5rIDAgZXRjLiAgV2UgYWxzbyBuZWVkIHRvIGVyYXNlIHRoZSBzZWdtZW50IHRoYXQKKwkgKiBpcyBnb2luZyB0byBiZSB3cml0dGVuCisJICovCisJcmV0X3ZhbCA9IGUxMDAwX3ZhbGlkX252bV9iYW5rX2RldGVjdF9pY2g4bGFuKGh3LCAmYmFuayk7CisJaWYgKHJldF92YWwpIHsKKwkJZV9kYmcoIkNvdWxkIG5vdCBkZXRlY3QgdmFsaWQgYmFuaywgYXNzdW1pbmcgYmFuayAwXG4iKTsKKwkJYmFuayA9IDA7CisJfQorCisJaWYgKGJhbmsgPT0gMCkgeworCQluZXdfYmFua19vZmZzZXQgPSBudm0tPmZsYXNoX2Jhbmtfc2l6ZTsKKwkJb2xkX2Jhbmtfb2Zmc2V0ID0gMDsKKwkJcmV0X3ZhbCA9IGUxMDAwX2VyYXNlX2ZsYXNoX2JhbmtfaWNoOGxhbihodywgMSk7CisJCWlmIChyZXRfdmFsKQorCQkJZ290byByZWxlYXNlOworCX0gZWxzZSB7CisJCW9sZF9iYW5rX29mZnNldCA9IG52bS0+Zmxhc2hfYmFua19zaXplOworCQluZXdfYmFua19vZmZzZXQgPSAwOworCQlyZXRfdmFsID0gZTEwMDBfZXJhc2VfZmxhc2hfYmFua19pY2g4bGFuKGh3LCAwKTsKKwkJaWYgKHJldF92YWwpCisJCQlnb3RvIHJlbGVhc2U7CisJfQorCWZvciAoaSA9IDA7IGkgPCBFMTAwMF9JQ0g4X1NIQURPV19SQU1fV09SRFM7IGkrKykgewogCQlpZiAoZGV2X3NwZWMtPnNoYWRvd19yYW1baV0ubW9kaWZpZWQpIHsKIAkJCWRhdGEgPSBkZXZfc3BlYy0+c2hhZG93X3JhbVtpXS52YWx1ZTsKIAkJfSBlbHNlIHsKQEAgLTM0OTgsNiArMzk1NCw3IEBACiAJICovCiAJc3dpdGNoIChody0+bWFjLnR5cGUpIHsKIAljYXNlIGUxMDAwX3BjaF9scHQ6CisJY2FzZSBlMTAwMF9wY2hfc3B0OgogCQl3b3JkID0gTlZNX0NPTVBBVDsKIAkJdmFsaWRfY3N1bV9tYXNrID0gTlZNX0NPTVBBVF9WQUxJRF9DU1VNOwogCQlicmVhazsKQEAgLTM1ODMsOSArNDA0MCwxMyBAQAogCXMzMiByZXRfdmFsOwogCXU4IGNvdW50ID0gMDsKIAotCWlmIChzaXplIDwgMSB8fCBzaXplID4gMiB8fCBkYXRhID4gc2l6ZSAqIDB4ZmYgfHwKLQkgICAgb2Zmc2V0ID4gSUNIX0ZMQVNIX0xJTkVBUl9BRERSX01BU0spCi0JCXJldHVybiAtRTEwMDBfRVJSX05WTTsKKwlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9zcHQpIHsKKwkJaWYgKHNpemUgIT0gNCB8fCBvZmZzZXQgPiBJQ0hfRkxBU0hfTElORUFSX0FERFJfTUFTSykKKwkJCXJldHVybiAtRTEwMDBfRVJSX05WTTsKKwl9IGVsc2UgeworCQlpZiAoc2l6ZSA8IDEgfHwgc2l6ZSA+IDIgfHwgb2Zmc2V0ID4gSUNIX0ZMQVNIX0xJTkVBUl9BRERSX01BU0spCisJCQlyZXR1cm4gLUUxMDAwX0VSUl9OVk07CisJfQogCiAJZmxhc2hfbGluZWFyX2FkZHIgPSAoKElDSF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLICYgb2Zmc2V0KSArCiAJCQkgICAgIGh3LT5udm0uZmxhc2hfYmFzZV9hZGRyKTsKQEAgLTM1OTYsMTIgKzQwNTcsMjUgQEAKIAkJcmV0X3ZhbCA9IGUxMDAwX2ZsYXNoX2N5Y2xlX2luaXRfaWNoOGxhbihodyk7CiAJCWlmIChyZXRfdmFsKQogCQkJYnJlYWs7CisJCS8qIEluIFNQVCwgVGhpcyByZWdpc3RlciBpcyBpbiBMYW4gbWVtb3J5IHNwYWNlLCBub3QKKwkJICogZmxhc2guICBUaGVyZWZvcmUsIG9ubHkgMzIgYml0IGFjY2VzcyBpcyBzdXBwb3J0ZWQKKwkJICovCisJCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkKKwkJCWhzZmxjdGwucmVndmFsID0gZXIzMmZsYXNoKElDSF9GTEFTSF9IU0ZTVFMpID4+IDE2OworCQllbHNlCisJCQloc2ZsY3RsLnJlZ3ZhbCA9IGVyMTZmbGFzaChJQ0hfRkxBU0hfSFNGQ1RMKTsKIAotCQloc2ZsY3RsLnJlZ3ZhbCA9IGVyMTZmbGFzaChJQ0hfRkxBU0hfSFNGQ1RMKTsKIAkJLyogMGIvMWIgY29ycmVzcG9uZHMgdG8gMSBvciAyIGJ5dGUgc2l6ZSwgcmVzcGVjdGl2ZWx5LiAqLwogCQloc2ZsY3RsLmhzZl9jdHJsLmZsZGJjb3VudCA9IHNpemUgLSAxOwogCQloc2ZsY3RsLmhzZl9jdHJsLmZsY3ljbGUgPSBJQ0hfQ1lDTEVfV1JJVEU7Ci0JCWV3MTZmbGFzaChJQ0hfRkxBU0hfSFNGQ1RMLCBoc2ZsY3RsLnJlZ3ZhbCk7CisJCS8qIEluIFNQVCwgVGhpcyByZWdpc3RlciBpcyBpbiBMYW4gbWVtb3J5IHNwYWNlLAorCQkgKiBub3QgZmxhc2guICBUaGVyZWZvcmUsIG9ubHkgMzIgYml0IGFjY2VzcyBpcworCQkgKiBzdXBwb3J0ZWQKKwkJICovCisJCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkKKwkJCWV3MzJmbGFzaChJQ0hfRkxBU0hfSFNGU1RTLCBoc2ZsY3RsLnJlZ3ZhbCA8PCAxNik7CisJCWVsc2UKKwkJCWV3MTZmbGFzaChJQ0hfRkxBU0hfSFNGQ1RMLCBoc2ZsY3RsLnJlZ3ZhbCk7CiAKIAkJZXczMmZsYXNoKElDSF9GTEFTSF9GQUREUiwgZmxhc2hfbGluZWFyX2FkZHIpOwogCkBAIC0zNjQwLDYgKzQxMTQsOTAgQEAKIH0KIAogLyoqCisqICBlMTAwMF93cml0ZV9mbGFzaF9kYXRhMzJfaWNoOGxhbiAtIFdyaXRlcyA0IGJ5dGVzIHRvIHRoZSBOVk0KKyogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCisqICBAb2Zmc2V0OiBUaGUgb2Zmc2V0IChpbiBieXRlcykgb2YgdGhlIGR3b3JkcyB0byByZWFkLgorKiAgQGRhdGE6IFRoZSA0IGJ5dGVzIHRvIHdyaXRlIHRvIHRoZSBOVk0uCisqCisqICBXcml0ZXMgb25lL3R3by9mb3VyIGJ5dGVzIHRvIHRoZSBOVk0gdXNpbmcgdGhlIGZsYXNoIGFjY2VzcyByZWdpc3RlcnMuCisqKi8KK3N0YXRpYyBzMzIgZTEwMDBfd3JpdGVfZmxhc2hfZGF0YTMyX2ljaDhsYW4oc3RydWN0IGUxMDAwX2h3ICpodywgdTMyIG9mZnNldCwKKwkJCQkJICAgIHUzMiBkYXRhKQoreworCXVuaW9uIGljaDhfaHdzX2ZsYXNoX3N0YXR1cyBoc2ZzdHM7CisJdW5pb24gaWNoOF9od3NfZmxhc2hfY3RybCBoc2ZsY3RsOworCXUzMiBmbGFzaF9saW5lYXJfYWRkcjsKKwlzMzIgcmV0X3ZhbDsKKwl1OCBjb3VudCA9IDA7CisKKwlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9zcHQpIHsKKwkJaWYgKG9mZnNldCA+IElDSF9GTEFTSF9MSU5FQVJfQUREUl9NQVNLKQorCQkJcmV0dXJuIC1FMTAwMF9FUlJfTlZNOworCX0KKwlmbGFzaF9saW5lYXJfYWRkciA9ICgoSUNIX0ZMQVNIX0xJTkVBUl9BRERSX01BU0sgJiBvZmZzZXQpICsKKwkJCSAgICAgaHctPm52bS5mbGFzaF9iYXNlX2FkZHIpOworCWRvIHsKKwkJdWRlbGF5KDEpOworCQkvKiBTdGVwcyAqLworCQlyZXRfdmFsID0gZTEwMDBfZmxhc2hfY3ljbGVfaW5pdF9pY2g4bGFuKGh3KTsKKwkJaWYgKHJldF92YWwpCisJCQlicmVhazsKKworCQkvKiBJbiBTUFQsIFRoaXMgcmVnaXN0ZXIgaXMgaW4gTGFuIG1lbW9yeSBzcGFjZSwgbm90CisJCSAqIGZsYXNoLiAgVGhlcmVmb3JlLCBvbmx5IDMyIGJpdCBhY2Nlc3MgaXMgc3VwcG9ydGVkCisJCSAqLworCQlpZiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9zcHQpCisJCQloc2ZsY3RsLnJlZ3ZhbCA9IGVyMzJmbGFzaChJQ0hfRkxBU0hfSFNGU1RTKQorCQkJICAgID4+IDE2OworCQllbHNlCisJCQloc2ZsY3RsLnJlZ3ZhbCA9IGVyMTZmbGFzaChJQ0hfRkxBU0hfSFNGQ1RMKTsKKworCQloc2ZsY3RsLmhzZl9jdHJsLmZsZGJjb3VudCA9IHNpemVvZih1MzIpIC0gMTsKKwkJaHNmbGN0bC5oc2ZfY3RybC5mbGN5Y2xlID0gSUNIX0NZQ0xFX1dSSVRFOworCisJCS8qIEluIFNQVCwgVGhpcyByZWdpc3RlciBpcyBpbiBMYW4gbWVtb3J5IHNwYWNlLAorCQkgKiBub3QgZmxhc2guICBUaGVyZWZvcmUsIG9ubHkgMzIgYml0IGFjY2VzcyBpcworCQkgKiBzdXBwb3J0ZWQKKwkJICovCisJCWlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkKKwkJCWV3MzJmbGFzaChJQ0hfRkxBU0hfSFNGU1RTLCBoc2ZsY3RsLnJlZ3ZhbCA8PCAxNik7CisJCWVsc2UKKwkJCWV3MTZmbGFzaChJQ0hfRkxBU0hfSFNGQ1RMLCBoc2ZsY3RsLnJlZ3ZhbCk7CisKKwkJZXczMmZsYXNoKElDSF9GTEFTSF9GQUREUiwgZmxhc2hfbGluZWFyX2FkZHIpOworCisJCWV3MzJmbGFzaChJQ0hfRkxBU0hfRkRBVEEwLCBkYXRhKTsKKworCQkvKiBjaGVjayBpZiBGQ0VSUiBpcyBzZXQgdG8gMSAsIGlmIHNldCB0byAxLCBjbGVhciBpdAorCQkgKiBhbmQgdHJ5IHRoZSB3aG9sZSBzZXF1ZW5jZSBhIGZldyBtb3JlIHRpbWVzIGVsc2UgZG9uZQorCQkgKi8KKwkJcmV0X3ZhbCA9CisJCSAgIGUxMDAwX2ZsYXNoX2N5Y2xlX2ljaDhsYW4oaHcsCisJCQkJCSAgICAgSUNIX0ZMQVNIX1dSSVRFX0NPTU1BTkRfVElNRU9VVCk7CisKKwkJaWYgKCFyZXRfdmFsKQorCQkJYnJlYWs7CisKKwkJLyogSWYgd2UncmUgaGVyZSwgdGhlbiB0aGluZ3MgYXJlIG1vc3QgbGlrZWx5CisJCSAqIGNvbXBsZXRlbHkgaG9zZWQsIGJ1dCBpZiB0aGUgZXJyb3IgY29uZGl0aW9uCisJCSAqIGlzIGRldGVjdGVkLCBpdCB3b24ndCBodXJ0IHRvIGdpdmUgaXQgYW5vdGhlcgorCQkgKiB0cnkuLi5JQ0hfRkxBU0hfQ1lDTEVfUkVQRUFUX0NPVU5UIHRpbWVzLgorCQkgKi8KKwkJaHNmc3RzLnJlZ3ZhbCA9IGVyMTZmbGFzaChJQ0hfRkxBU0hfSFNGU1RTKTsKKworCQlpZiAoaHNmc3RzLmhzZl9zdGF0dXMuZmxjZXJyKQorCQkJLyogUmVwZWF0IGZvciBzb21lIHRpbWUgYmVmb3JlIGdpdmluZyB1cC4gKi8KKwkJCWNvbnRpbnVlOworCQlpZiAoIWhzZnN0cy5oc2Zfc3RhdHVzLmZsY2RvbmUpIHsKKwkJCWVfZGJnKCJUaW1lb3V0IGVycm9yIC0gZmxhc2ggY3ljbGUgZGlkIG5vdCBjb21wbGV0ZS5cbiIpOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChjb3VudCsrIDwgSUNIX0ZMQVNIX0NZQ0xFX1JFUEVBVF9DT1VOVCk7CisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyoqCiAgKiAgZTEwMDBfd3JpdGVfZmxhc2hfYnl0ZV9pY2g4bGFuIC0gV3JpdGUgYSBzaW5nbGUgYnl0ZSB0byBOVk0KICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBvZmZzZXQ6IFRoZSBpbmRleCBvZiB0aGUgYnl0ZSB0byByZWFkLgpAQCAtMzY1Niw2ICs0MjE0LDQwIEBACiB9CiAKIC8qKgorKiAgZTEwMDBfcmV0cnlfd3JpdGVfZmxhc2hfZHdvcmRfaWNoOGxhbiAtIFdyaXRlcyBhIGR3b3JkIHRvIE5WTQorKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyogIEBvZmZzZXQ6IFRoZSBvZmZzZXQgb2YgdGhlIHdvcmQgdG8gd3JpdGUuCisqICBAZHdvcmQ6IFRoZSBkd29yZCB0byB3cml0ZSB0byB0aGUgTlZNLgorKgorKiAgV3JpdGVzIGEgc2luZ2xlIGR3b3JkIHRvIHRoZSBOVk0gdXNpbmcgdGhlIGZsYXNoIGFjY2VzcyByZWdpc3RlcnMuCisqICBHb2VzIHRocm91Z2ggYSByZXRyeSBhbGdvcml0aG0gYmVmb3JlIGdpdmluZyB1cC4KKyoqLworc3RhdGljIHMzMiBlMTAwMF9yZXRyeV93cml0ZV9mbGFzaF9kd29yZF9pY2g4bGFuKHN0cnVjdCBlMTAwMF9odyAqaHcsCisJCQkJCQkgdTMyIG9mZnNldCwgdTMyIGR3b3JkKQoreworCXMzMiByZXRfdmFsOworCXUxNiBwcm9ncmFtX3JldHJpZXM7CisKKwkvKiBNdXN0IGNvbnZlcnQgd29yZCBvZmZzZXQgaW50byBieXRlcy4gKi8KKwlvZmZzZXQgPDw9IDE7CisJcmV0X3ZhbCA9IGUxMDAwX3dyaXRlX2ZsYXNoX2RhdGEzMl9pY2g4bGFuKGh3LCBvZmZzZXQsIGR3b3JkKTsKKworCWlmICghcmV0X3ZhbCkKKwkJcmV0dXJuIHJldF92YWw7CisJZm9yIChwcm9ncmFtX3JldHJpZXMgPSAwOyBwcm9ncmFtX3JldHJpZXMgPCAxMDA7IHByb2dyYW1fcmV0cmllcysrKSB7CisJCWVfZGJnKCJSZXRyeWluZyBCeXRlICU4LjhYIGF0IG9mZnNldCAldVxuIiwgZHdvcmQsIG9mZnNldCk7CisJCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisJCXJldF92YWwgPSBlMTAwMF93cml0ZV9mbGFzaF9kYXRhMzJfaWNoOGxhbihodywgb2Zmc2V0LCBkd29yZCk7CisJCWlmICghcmV0X3ZhbCkKKwkJCWJyZWFrOworCX0KKwlpZiAocHJvZ3JhbV9yZXRyaWVzID09IDEwMCkKKwkJcmV0dXJuIC1FMTAwMF9FUlJfTlZNOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogIGUxMDAwX3JldHJ5X3dyaXRlX2ZsYXNoX2J5dGVfaWNoOGxhbiAtIFdyaXRlcyBhIHNpbmdsZSBieXRlIHRvIE5WTQogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKiAgQG9mZnNldDogVGhlIG9mZnNldCBvZiB0aGUgYnl0ZSB0byB3cml0ZS4KQEAgLTM3NTksOSArNDM1MSwxOCBAQAogCQkJLyogV3JpdGUgYSB2YWx1ZSAxMSAoYmxvY2sgRXJhc2UpIGluIEZsYXNoCiAJCQkgKiBDeWNsZSBmaWVsZCBpbiBodyBmbGFzaCBjb250cm9sCiAJCQkgKi8KLQkJCWhzZmxjdGwucmVndmFsID0gZXIxNmZsYXNoKElDSF9GTEFTSF9IU0ZDVEwpOworCQkJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfc3B0KQorCQkJCWhzZmxjdGwucmVndmFsID0KKwkJCQkgICAgZXIzMmZsYXNoKElDSF9GTEFTSF9IU0ZTVFMpID4+IDE2OworCQkJZWxzZQorCQkJCWhzZmxjdGwucmVndmFsID0gZXIxNmZsYXNoKElDSF9GTEFTSF9IU0ZDVEwpOworCiAJCQloc2ZsY3RsLmhzZl9jdHJsLmZsY3ljbGUgPSBJQ0hfQ1lDTEVfRVJBU0U7Ci0JCQlldzE2Zmxhc2goSUNIX0ZMQVNIX0hTRkNUTCwgaHNmbGN0bC5yZWd2YWwpOworCQkJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfc3B0KQorCQkJCWV3MzJmbGFzaChJQ0hfRkxBU0hfSFNGU1RTLAorCQkJCQkgIGhzZmxjdGwucmVndmFsIDw8IDE2KTsKKwkJCWVsc2UKKwkJCQlldzE2Zmxhc2goSUNIX0ZMQVNIX0hTRkNUTCwgaHNmbGN0bC5yZWd2YWwpOwogCiAJCQkvKiBXcml0ZSB0aGUgbGFzdCAyNCBiaXRzIG9mIGFuIGluZGV4IHdpdGhpbiB0aGUKIAkJCSAqIGJsb2NrIGludG8gRmxhc2ggTGluZWFyIGFkZHJlc3MgZmllbGQgaW4gRmxhc2gKQEAgLTQxODAsNyArNDc4MSw4IEBACiAJZXczMihSRkNUTCwgcmVnKTsKIAogCS8qIEVuYWJsZSBFQ0Mgb24gTHlueHBvaW50ICovCi0JaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfbHB0KSB7CisJaWYgKChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX2xwdCkgfHwKKwkgICAgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfc3B0KSkgewogCQlyZWcgPSBlcjMyKFBCRUNDU1RTKTsKIAkJcmVnIHw9IEUxMDAwX1BCRUNDU1RTX0VDQ19FTkFCTEU7CiAJCWV3MzIoUEJFQ0NTVFMsIHJlZyk7CkBAIC00NTgzLDcgKzUxODUsOCBAQAogCQlpZiAoKGRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfUENIX0xQVExQX0kyMThfTE0pIHx8CiAJCSAgICAoZGV2aWNlX2lkID09IEUxMDAwX0RFVl9JRF9QQ0hfTFBUTFBfSTIxOF9WKSB8fAogCQkgICAgKGRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfUENIX0kyMThfTE0zKSB8fAotCQkgICAgKGRldmljZV9pZCA9PSBFMTAwMF9ERVZfSURfUENIX0kyMThfVjMpKSB7CisJCSAgICAoZGV2aWNlX2lkID09IEUxMDAwX0RFVl9JRF9QQ0hfSTIxOF9WMykgfHwKKwkJICAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkpIHsKIAkJCXUzMiBmZXh0bnZtNiA9IGVyMzIoRkVYVE5WTTYpOwogCiAJCQlldzMyKEZFWFROVk02LCBmZXh0bnZtNiAmIH5FMTAwMF9GRVhUTlZNNl9SRVFfUExMX0NMSyk7CkBAIC01MDU4LDYgKzU2NjEsMTcgQEAKIAkud3JpdGUJCQk9IGUxMDAwX3dyaXRlX252bV9pY2g4bGFuLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBlMTAwMF9udm1fb3BlcmF0aW9ucyBzcHRfbnZtX29wcyA9IHsKKwkuYWNxdWlyZQkJPSBlMTAwMF9hY3F1aXJlX252bV9pY2g4bGFuLAorCS5yZWxlYXNlCQk9IGUxMDAwX3JlbGVhc2VfbnZtX2ljaDhsYW4sCisJLnJlYWQJCQk9IGUxMDAwX3JlYWRfbnZtX3NwdCwKKwkudXBkYXRlCQkJPSBlMTAwMF91cGRhdGVfbnZtX2NoZWNrc3VtX3NwdCwKKwkucmVsb2FkCQkJPSBlMTAwMGVfcmVsb2FkX252bV9nZW5lcmljLAorCS52YWxpZF9sZWRfZGVmYXVsdAk9IGUxMDAwX3ZhbGlkX2xlZF9kZWZhdWx0X2ljaDhsYW4sCisJLnZhbGlkYXRlCQk9IGUxMDAwX3ZhbGlkYXRlX252bV9jaGVja3N1bV9pY2g4bGFuLAorCS53cml0ZQkJCT0gZTEwMDBfd3JpdGVfbnZtX2ljaDhsYW4sCit9OworCiBjb25zdCBzdHJ1Y3QgZTEwMDBfaW5mbyBlMTAwMF9pY2g4X2luZm8gPSB7CiAJLm1hYwkJCT0gZTEwMDBfaWNoOGxhbiwKIAkuZmxhZ3MJCQk9IEZMQUdfSEFTX1dPTApAQCAtNTE2NiwzICs1NzgwLDIzIEBACiAJLnBoeV9vcHMJCT0gJmljaDhfcGh5X29wcywKIAkubnZtX29wcwkJPSAmaWNoOF9udm1fb3BzLAogfTsKKworY29uc3Qgc3RydWN0IGUxMDAwX2luZm8gZTEwMDBfcGNoX3NwdF9pbmZvID0geworCS5tYWMJCQk9IGUxMDAwX3BjaF9zcHQsCisJLmZsYWdzCQkJPSBGTEFHX0lTX0lDSAorCQkJCSAgfCBGTEFHX0hBU19XT0wKKwkJCQkgIHwgRkxBR19IQVNfSFdfVElNRVNUQU1QCisJCQkJICB8IEZMQUdfSEFTX0NUUkxFWFRfT05fTE9BRAorCQkJCSAgfCBGTEFHX0hBU19BTVQKKwkJCQkgIHwgRkxBR19IQVNfRkxBU0gKKwkJCQkgIHwgRkxBR19IQVNfSlVNQk9fRlJBTUVTCisJCQkJICB8IEZMQUdfQVBNRV9JTl9XVUMsCisJLmZsYWdzMgkJCT0gRkxBRzJfSEFTX1BIWV9TVEFUUworCQkJCSAgfCBGTEFHMl9IQVNfRUVFLAorCS5wYmEJCQk9IDI2LAorCS5tYXhfaHdfZnJhbWVfc2l6ZQk9IDkwMTgsCisJLmdldF92YXJpYW50cwkJPSBlMTAwMF9nZXRfdmFyaWFudHNfaWNoOGxhbiwKKwkubWFjX29wcwkJPSAmaWNoOF9tYWNfb3BzLAorCS5waHlfb3BzCQk9ICZpY2g4X3BoeV9vcHMsCisJLm52bV9vcHMJCT0gJnNwdF9udm1fb3BzLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9pY2g4bGFuLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvaWNoOGxhbi5oCmluZGV4IDgwNjZhNDkuLjc3MGE1NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9pY2g4bGFuLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2ljaDhsYW4uaApAQCAtOTUsOSArOTUsMTggQEAKIAogI2RlZmluZSBFMTAwMF9GRVhUTlZNNl9SRVFfUExMX0NMSwkweDAwMDAwMTAwCiAjZGVmaW5lIEUxMDAwX0ZFWFROVk02X0VOQUJMRV9LMV9FTlRSWV9DT05ESVRJT04JMHgwMDAwMDIwMAorI2RlZmluZSBFMTAwMF9GRVhUTlZNNl9LMV9PRkZfRU5BQkxFCTB4ODAwMDAwMDAKKy8qIGJpdCBmb3IgZGlzYWJsaW5nIHBhY2tldCBidWZmZXIgcmVhZCAqLworI2RlZmluZSBFMTAwMF9GRVhUTlZNN19ESVNBQkxFX1BCX1JFQUQJMHgwMDA0MDAwMAogCiAjZGVmaW5lIEUxMDAwX0ZFWFROVk03X0RJU0FCTEVfU01CX1BFUlNUCTB4MDAwMDAwMjAKIAorI2RlZmluZSBLMV9FTlRSWV9MQVRFTkNZCTAKKyNkZWZpbmUgSzFfTUlOX1RJTUUJCTEKKyNkZWZpbmUgTlZNX1NJWkVfTVVMVElQTElFUiA0MDk2CS8qbXVsdGlwbGllciBmb3IgTlZNUyBmaWVsZCAqLworI2RlZmluZSBFMTAwMF9GTEFTSF9CQVNFX0FERFIgMHhFMDAwCS8qb2Zmc2V0IG9mIE5WTSBhY2Nlc3MgcmVncyAqLworI2RlZmluZSBFMTAwMF9DVFJMX0VYVF9OVk1WUyAweDMJLypOVk0gdmFsaWQgc2VjdG9yICovCisKICNkZWZpbmUgUENJRV9JQ0g4X1NOT09QX0FMTAlQQ0lFX05PX1NOT09QX0FMTAogCiAjZGVmaW5lIEUxMDAwX0lDSF9SQVJfRU5UUklFUwk3CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvbmV0ZGV2LmMKaW5kZXggMWU4YzQwZi4uYzUwOWE1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9uZXRkZXYuYwpAQCAtNzAsNiArNzAsNyBAQAogCVtib2FyZF9wY2hsYW5dCQk9ICZlMTAwMF9wY2hfaW5mbywKIAlbYm9hcmRfcGNoMmxhbl0JCT0gJmUxMDAwX3BjaDJfaW5mbywKIAlbYm9hcmRfcGNoX2xwdF0JCT0gJmUxMDAwX3BjaF9scHRfaW5mbywKKwlbYm9hcmRfcGNoX3NwdF0JCT0gJmUxMDAwX3BjaF9zcHRfaW5mbywKIH07CiAKIHN0cnVjdCBlMTAwMF9yZWdfaW5mbyB7CkBAIC05NDYsNyArOTQ3LDcgQEAKIAkJaWYgKCp3b3JrX2RvbmUgPj0gd29ya190b19kbykKIAkJCWJyZWFrOwogCQkoKndvcmtfZG9uZSkrKzsKLQkJcm1iKCk7CS8qIHJlYWQgZGVzY3JpcHRvciBhbmQgcnhfYnVmZmVyX2luZm8gYWZ0ZXIgc3RhdHVzIEREICovCisJCWRtYV9ybWIoKTsJLyogcmVhZCBkZXNjcmlwdG9yIGFuZCByeF9idWZmZXJfaW5mbyBhZnRlciBzdGF0dXMgREQgKi8KIAogCQlza2IgPSBidWZmZXJfaW5mby0+c2tiOwogCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKQEAgLTEyMzEsNyArMTIzMiw3IEBACiAJICAgICAgIChjb3VudCA8IHR4X3JpbmctPmNvdW50KSkgewogCQlib29sIGNsZWFuZWQgPSBmYWxzZTsKIAotCQlybWIoKTsJCS8qIHJlYWQgYnVmZmVyX2luZm8gYWZ0ZXIgZW9wX2Rlc2MgKi8KKwkJZG1hX3JtYigpOwkJLyogcmVhZCBidWZmZXJfaW5mbyBhZnRlciBlb3BfZGVzYyAqLwogCQlmb3IgKDsgIWNsZWFuZWQ7IGNvdW50KyspIHsKIAkJCXR4X2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eF9yaW5nLCBpKTsKIAkJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwpAQCAtMTMzMSw3ICsxMzMyLDcgQEAKIAkJCWJyZWFrOwogCQkoKndvcmtfZG9uZSkrKzsKIAkJc2tiID0gYnVmZmVyX2luZm8tPnNrYjsKLQkJcm1iKCk7CS8qIHJlYWQgZGVzY3JpcHRvciBhbmQgcnhfYnVmZmVyX2luZm8gYWZ0ZXIgc3RhdHVzIEREICovCisJCWRtYV9ybWIoKTsJLyogcmVhZCBkZXNjcmlwdG9yIGFuZCByeF9idWZmZXJfaW5mbyBhZnRlciBzdGF0dXMgREQgKi8KIAogCQkvKiBpbiB0aGUgcGFja2V0IHNwbGl0IGNhc2UgdGhpcyBpcyBoZWFkZXIgb25seSAqLwogCQlwcmVmZXRjaChza2ItPmRhdGEgLSBORVRfSVBfQUxJR04pOwpAQCAtMTUzNSw3ICsxNTM2LDcgQEAKIAkJaWYgKCp3b3JrX2RvbmUgPj0gd29ya190b19kbykKIAkJCWJyZWFrOwogCQkoKndvcmtfZG9uZSkrKzsKLQkJcm1iKCk7CS8qIHJlYWQgZGVzY3JpcHRvciBhbmQgcnhfYnVmZmVyX2luZm8gYWZ0ZXIgc3RhdHVzIEREICovCisJCWRtYV9ybWIoKTsJLyogcmVhZCBkZXNjcmlwdG9yIGFuZCByeF9idWZmZXJfaW5mbyBhZnRlciBzdGF0dXMgREQgKi8KIAogCQlza2IgPSBidWZmZXJfaW5mby0+c2tiOwogCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKQEAgLTE3OTYsNyArMTc5Nyw4IEBACiAJfQogCiAJLyogUmVzZXQgb24gdW5jb3JyZWN0YWJsZSBFQ0MgZXJyb3IgKi8KLQlpZiAoKGljciAmIEUxMDAwX0lDUl9FQ0NFUikgJiYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfbHB0KSkgeworCWlmICgoaWNyICYgRTEwMDBfSUNSX0VDQ0VSKSAmJiAoKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfbHB0KSB8fAorCQkJCQkoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9zcHQpKSkgewogCQl1MzIgcGJlY2NzdHMgPSBlcjMyKFBCRUNDU1RTKTsKIAogCQlhZGFwdGVyLT5jb3JyX2Vycm9ycyArPQpAQCAtMTg3Niw3ICsxODc4LDggQEAKIAl9CiAKIAkvKiBSZXNldCBvbiB1bmNvcnJlY3RhYmxlIEVDQyBlcnJvciAqLwotCWlmICgoaWNyICYgRTEwMDBfSUNSX0VDQ0VSKSAmJiAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9scHQpKSB7CisJaWYgKChpY3IgJiBFMTAwMF9JQ1JfRUNDRVIpICYmICgoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9scHQpIHx8CisJCQkJCShody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkpKSB7CiAJCXUzMiBwYmVjY3N0cyA9IGVyMzIoUEJFQ0NTVFMpOwogCiAJCWFkYXB0ZXItPmNvcnJfZXJyb3JzICs9CkBAIC0yMjU3LDcgKzIyNjAsOCBAQAogCWlmIChhZGFwdGVyLT5tc2l4X2VudHJpZXMpIHsKIAkJZXczMihFSUFDXzgyNTc0LCBhZGFwdGVyLT5laWFjX21hc2sgJiBFMTAwMF9FSUFDX01BU0tfODI1NzQpOwogCQlldzMyKElNUywgYWRhcHRlci0+ZWlhY19tYXNrIHwgRTEwMDBfSU1TX09USEVSIHwgRTEwMDBfSU1TX0xTQyk7Ci0JfSBlbHNlIGlmIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX2xwdCkgeworCX0gZWxzZSBpZiAoKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfbHB0KSB8fAorCQkgICAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9zcHQpKSB7CiAJCWV3MzIoSU1TLCBJTVNfRU5BQkxFX01BU0sgfCBFMTAwMF9JTVNfRUNDRVIpOwogCX0gZWxzZSB7CiAJCWV3MzIoSU1TLCBJTVNfRU5BQkxFX01BU0spOwpAQCAtMzAxNCw2ICszMDE4LDE5IEBACiAJZXczMihUQ1RMLCB0Y3RsKTsKIAogCWh3LT5tYWMub3BzLmNvbmZpZ19jb2xsaXNpb25fZGlzdChodyk7CisKKwkvKiBTUFQgU2kgZXJyYXRhIHdvcmthcm91bmQgdG8gYXZvaWQgZGF0YSBjb3JydXB0aW9uICovCisJaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfc3B0KSB7CisJCXUzMiByZWdfdmFsOworCisJCXJlZ192YWwgPSBlcjMyKElPU0ZQQyk7CisJCXJlZ192YWwgfD0gRTEwMDBfUkNUTF9SRE1UU19IRVg7CisJCWV3MzIoSU9TRlBDLCByZWdfdmFsKTsKKworCQlyZWdfdmFsID0gZXIzMihUQVJDKDApKTsKKwkJcmVnX3ZhbCB8PSBFMTAwMF9UQVJDMF9DQl9NVUxUSVFfM19SRVE7CisJCWV3MzIoVEFSQygwKSwgcmVnX3ZhbCk7CisJfQogfQogCiAvKioKQEAgLTMyODAsOSArMzI5Nyw5IEBACiAJCQlldzMyKFJYRENUTCgwKSwgcnhkY3RsIHwgMHgzKTsKIAkJfQogCi0JCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmYWRhcHRlci0+bmV0ZGV2LT5wbV9xb3NfcmVxLCBsYXQpOworCQlwbV9xb3NfdXBkYXRlX3JlcXVlc3QoJmFkYXB0ZXItPnBtX3Fvc19yZXEsIGxhdCk7CiAJfSBlbHNlIHsKLQkJcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KCZhZGFwdGVyLT5uZXRkZXYtPnBtX3Fvc19yZXEsCisJCXBtX3Fvc191cGRhdGVfcmVxdWVzdCgmYWRhcHRlci0+cG1fcW9zX3JlcSwKIAkJCQkgICAgICBQTV9RT1NfREVGQVVMVF9WQUxVRSk7CiAJfQogCkBAIC0zNDkwLDggKzM1MDcsMTEgQEAKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiBpbmN2YWx1ZSwgaW5jcGVyaW9kLCBzaGlmdDsKIAotCS8qIE1ha2Ugc3VyZSBjbG9jayBpcyBlbmFibGVkIG9uIEkyMTcgYmVmb3JlIGNoZWNraW5nIHRoZSBmcmVxdWVuY3kgKi8KLQlpZiAoKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfbHB0KSAmJgorCS8qIE1ha2Ugc3VyZSBjbG9jayBpcyBlbmFibGVkIG9uIEkyMTcvSTIxOC9JMjE5ICBiZWZvcmUgY2hlY2tpbmcKKwkgKiB0aGUgZnJlcXVlbmN5CisJICovCisJaWYgKCgoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9scHQpIHx8CisJICAgICAoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9zcHQpKSAmJgogCSAgICAhKGVyMzIoVFNZTkNUWENUTCkgJiBFMTAwMF9UU1lOQ1RYQ1RMX0VOQUJMRUQpICYmCiAJICAgICEoZXIzMihUU1lOQ1JYQ1RMKSAmIEUxMDAwX1RTWU5DUlhDVExfRU5BQkxFRCkpIHsKIAkJdTMyIGZleHRudm03ID0gZXIzMihGRVhUTlZNNyk7CkBAIC0zNTA1LDEwICszNTI1LDEzIEBACiAJc3dpdGNoIChody0+bWFjLnR5cGUpIHsKIAljYXNlIGUxMDAwX3BjaDJsYW46CiAJY2FzZSBlMTAwMF9wY2hfbHB0OgotCQkvKiBPbiBJMjE3LCB0aGUgY2xvY2sgZnJlcXVlbmN5IGlzIDI1TUh6IG9yIDk2TUh6IGFzCi0JCSAqIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSBJbmRpY2F0aW9uCisJY2FzZSBlMTAwMF9wY2hfc3B0OgorCQkvKiBPbiBJMjE3LCBJMjE4IGFuZCBJMjE5LCB0aGUgY2xvY2sgZnJlcXVlbmN5IGlzIDI1TUh6CisJCSAqIG9yIDk2TUh6IGFzIGluZGljYXRlZCBieSB0aGUgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeQorCQkgKiBJbmRpY2F0aW9uCiAJCSAqLwotCQlpZiAoKGh3LT5tYWMudHlwZSAhPSBlMTAwMF9wY2hfbHB0KSB8fAorCQlpZiAoKChody0+bWFjLnR5cGUgIT0gZTEwMDBfcGNoX2xwdCkgJiYKKwkJICAgICAoaHctPm1hYy50eXBlICE9IGUxMDAwX3BjaF9zcHQpKSB8fAogCQkgICAgKGVyMzIoVFNZTkNSWENUTCkgJiBFMTAwMF9UU1lOQ1JYQ1RMX1NZU0NGSSkpIHsKIAkJCS8qIFN0YWJsZSA5Nk1IeiBmcmVxdWVuY3kgKi8KIAkJCWluY3BlcmlvZCA9IElOQ1BFUklPRF85Nk1IejsKQEAgLTM4NzUsNiArMzg5OCw3IEBACiAJCWJyZWFrOwogCWNhc2UgZTEwMDBfcGNoMmxhbjoKIAljYXNlIGUxMDAwX3BjaF9scHQ6CisJY2FzZSBlMTAwMF9wY2hfc3B0OgogCQlmYy0+cmVmcmVzaF90aW1lID0gMHgwNDAwOwogCiAJCWlmIChhZGFwdGVyLT5uZXRkZXYtPm10dSA8PSBFVEhfREFUQV9MRU4pIHsKQEAgLTQwNjAsNiArNDA4NCw4IEBACiAJICovCiAJc2V0X2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5zdGF0ZSk7CiAKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCiAJLyogZGlzYWJsZSByZWNlaXZlcyBpbiB0aGUgaGFyZHdhcmUgKi8KIAlyY3RsID0gZXIzMihSQ1RMKTsKIAlpZiAoIShhZGFwdGVyLT5mbGFnczIgJiBGTEFHMl9OT19ESVNBQkxFX1JYKSkKQEAgLTQwODQsOCArNDExMCw2IEBACiAJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPndhdGNoZG9nX3RpbWVyKTsKIAlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+cGh5X2luZm9fdGltZXIpOwogCi0JbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQogCXNwaW5fbG9jaygmYWRhcHRlci0+c3RhdHM2NF9sb2NrKTsKIAllMTAwMGVfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOwogCXNwaW5fdW5sb2NrKCZhZGFwdGVyLT5zdGF0czY0X2xvY2spOwpAQCAtNDM3OSw3ICs0NDAzLDcgQEAKIAkJZTEwMDBfdXBkYXRlX21uZ192bGFuKGFkYXB0ZXIpOwogCiAJLyogRE1BIGxhdGVuY3kgcmVxdWlyZW1lbnQgdG8gd29ya2Fyb3VuZCBqdW1ibyBpc3N1ZSAqLwotCXBtX3Fvc19hZGRfcmVxdWVzdCgmYWRhcHRlci0+bmV0ZGV2LT5wbV9xb3NfcmVxLCBQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZLAorCXBtX3Fvc19hZGRfcmVxdWVzdCgmYWRhcHRlci0+cG1fcW9zX3JlcSwgUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwKIAkJCSAgIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKIAogCS8qIGJlZm9yZSB3ZSBhbGxvY2F0ZSBhbiBpbnRlcnJ1cHQsIHdlIG11c3QgYmUgcmVhZHkgdG8gaGFuZGxlIGl0LgpAQCAtNDQ5MCw3ICs0NTE0LDcgQEAKIAkgICAgIXRlc3RfYml0KF9fRTEwMDBfVEVTVElORywgJmFkYXB0ZXItPnN0YXRlKSkKIAkJZTEwMDBlX3JlbGVhc2VfaHdfY29udHJvbChhZGFwdGVyKTsKIAotCXBtX3Fvc19yZW1vdmVfcmVxdWVzdCgmYWRhcHRlci0+bmV0ZGV2LT5wbV9xb3NfcmVxKTsKKwlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QoJmFkYXB0ZXItPnBtX3Fvc19yZXEpOwogCiAJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIApAQCAtNDc1OSw3ICs0NzgzLDggQEAKIAlhZGFwdGVyLT5zdGF0cy5tZ3BkYyArPSBlcjMyKE1HVFBEQyk7CiAKIAkvKiBDb3JyZWN0YWJsZSBFQ0MgRXJyb3JzICovCi0JaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfbHB0KSB7CisJaWYgKChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX2xwdCkgfHwKKwkgICAgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfc3B0KSkgewogCQl1MzIgcGJlY2NzdHMgPSBlcjMyKFBCRUNDU1RTKTsKIAogCQlhZGFwdGVyLT5jb3JyX2Vycm9ycyArPQpAQCAtNjE0NCw3ICs2MTY5LDggQEAKIAogCWlmIChhZGFwdGVyLT5ody5waHkudHlwZSA9PSBlMTAwMF9waHlfaWdwXzMpIHsKIAkJZTEwMDBlX2lncDNfcGh5X3Bvd2VyZG93bl93b3JrYXJvdW5kX2ljaDhsYW4oJmFkYXB0ZXItPmh3KTsKLQl9IGVsc2UgaWYgKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9wY2hfbHB0KSB7CisJfSBlbHNlIGlmICgoaHctPm1hYy50eXBlID09IGUxMDAwX3BjaF9scHQpIHx8CisJCSAgIChody0+bWFjLnR5cGUgPT0gZTEwMDBfcGNoX3NwdCkpIHsKIAkJaWYgKCEod3VmYyAmIChFMTAwMF9XVUZDX0VYIHwgRTEwMDBfV1VGQ19NQyB8IEUxMDAwX1dVRkNfQkMpKSkKIAkJCS8qIFVMUCBkb2VzIG5vdCBzdXBwb3J0IHdha2UgZnJvbSB1bmljYXN0LCBtdWx0aWNhc3QKIAkJCSAqIG9yIGJyb2FkY2FzdC4KQEAgLTY4MDcsNyArNjgzMyw4IEBACiAJCWdvdG8gZXJyX2lvcmVtYXA7CiAKIAlpZiAoKGFkYXB0ZXItPmZsYWdzICYgRkxBR19IQVNfRkxBU0gpICYmCi0JICAgIChwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgMSkgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkgICAgKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAxKSAmIElPUkVTT1VSQ0VfTUVNKSAmJgorCSAgICAoaHctPm1hYy50eXBlIDwgZTEwMDBfcGNoX3NwdCkpIHsKIAkJZmxhc2hfc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgMSk7CiAJCWZsYXNoX2xlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMSk7CiAJCWFkYXB0ZXItPmh3LmZsYXNoX2FkZHJlc3MgPSBpb3JlbWFwKGZsYXNoX3N0YXJ0LCBmbGFzaF9sZW4pOwpAQCAtNjg0Nyw3ICs2ODc0LDggQEAKIAkJZ290byBlcnJfaHdfaW5pdDsKIAogCWlmICgoYWRhcHRlci0+ZmxhZ3MgJiBGTEFHX0lTX0lDSCkgJiYKLQkgICAgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19SRUFEX09OTFlfTlZNKSkKKwkgICAgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19SRUFEX09OTFlfTlZNKSAmJgorCSAgICAoaHctPm1hYy50eXBlIDwgZTEwMDBfcGNoX3NwdCkpCiAJCWUxMDAwZV93cml0ZV9wcm90ZWN0X252bV9pY2g4bGFuKCZhZGFwdGVyLT5odyk7CiAKIAlody0+bWFjLm9wcy5nZXRfYnVzX2luZm8oJmFkYXB0ZXItPmh3KTsKQEAgLTcwNDMsNyArNzA3MSw3IEBACiAJa2ZyZWUoYWRhcHRlci0+dHhfcmluZyk7CiAJa2ZyZWUoYWRhcHRlci0+cnhfcmluZyk7CiBlcnJfc3dfaW5pdDoKLQlpZiAoYWRhcHRlci0+aHcuZmxhc2hfYWRkcmVzcykKKwlpZiAoKGFkYXB0ZXItPmh3LmZsYXNoX2FkZHJlc3MpICYmIChody0+bWFjLnR5cGUgPCBlMTAwMF9wY2hfc3B0KSkKIAkJaW91bm1hcChhZGFwdGVyLT5ody5mbGFzaF9hZGRyZXNzKTsKIAllMTAwMGVfcmVzZXRfaW50ZXJydXB0X2NhcGFiaWxpdHkoYWRhcHRlcik7CiBlcnJfZmxhc2htYXA6CkBAIC03MTE2LDcgKzcxNDQsOCBAQAogCWtmcmVlKGFkYXB0ZXItPnJ4X3JpbmcpOwogCiAJaW91bm1hcChhZGFwdGVyLT5ody5od19hZGRyKTsKLQlpZiAoYWRhcHRlci0+aHcuZmxhc2hfYWRkcmVzcykKKwlpZiAoKGFkYXB0ZXItPmh3LmZsYXNoX2FkZHJlc3MpICYmCisJICAgIChhZGFwdGVyLT5ody5tYWMudHlwZSA8IGUxMDAwX3BjaF9zcHQpKQogCQlpb3VubWFwKGFkYXB0ZXItPmh3LmZsYXNoX2FkZHJlc3MpOwogCXBjaV9yZWxlYXNlX3NlbGVjdGVkX3JlZ2lvbnMocGRldiwKIAkJCQkgICAgIHBjaV9zZWxlY3RfYmFycyhwZGV2LCBJT1JFU09VUkNFX01FTSkpOwpAQCAtNzIxMyw2ICs3MjQyLDEwIEBACiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEX1BDSF9JMjE4X1YyKSwgYm9hcmRfcGNoX2xwdCB9LAogCXsgUENJX1ZERVZJQ0UoSU5URUwsIEUxMDAwX0RFVl9JRF9QQ0hfSTIxOF9MTTMpLCBib2FyZF9wY2hfbHB0IH0sCiAJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEX1BDSF9JMjE4X1YzKSwgYm9hcmRfcGNoX2xwdCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIEUxMDAwX0RFVl9JRF9QQ0hfU1BUX0kyMTlfTE0pLCBib2FyZF9wY2hfc3B0IH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgRTEwMDBfREVWX0lEX1BDSF9TUFRfSTIxOV9WKSwgYm9hcmRfcGNoX3NwdCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIEUxMDAwX0RFVl9JRF9QQ0hfU1BUX0kyMTlfTE0yKSwgYm9hcmRfcGNoX3NwdCB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIEUxMDAwX0RFVl9JRF9QQ0hfU1BUX0kyMTlfVjIpLCBib2FyZF9wY2hfc3B0IH0sCiAKIAl7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfQkvKiB0ZXJtaW5hdGUgbGlzdCAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9wdHAuYwppbmRleCA5NzhlZjljLi44ZDdiMjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcHRwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3B0cC5jCkBAIC0xMDYsMjAgKzEwNiwxOCBAQAogICogUmVhZCB0aGUgdGltZWNvdW50ZXIgYW5kIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSBpbiBucyBhZnRlciBjb252ZXJ0aW5nCiAgKiBpdCBpbnRvIGEgc3RydWN0IHRpbWVzcGVjLgogICoqLwotc3RhdGljIGludCBlMTAwMGVfcGhjX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYyAqdHMpCitzdGF0aWMgaW50IGUxMDAwZV9waGNfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gY29udGFpbmVyX29mKHB0cCwgc3RydWN0IGUxMDAwX2FkYXB0ZXIsCiAJCQkJCQkgICAgIHB0cF9jbG9ja19pbmZvKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiByZW1haW5kZXI7CiAJdTY0IG5zOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnN5c3RpbV9sb2NrLCBmbGFncyk7CiAJbnMgPSB0aW1lY291bnRlcl9yZWFkKCZhZGFwdGVyLT50Yyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+c3lzdGltX2xvY2ssIGZsYWdzKTsKIAotCXRzLT50dl9zZWMgPSBkaXZfdTY0X3JlbShucywgTlNFQ19QRVJfU0VDLCAmcmVtYWluZGVyKTsKLQl0cy0+dHZfbnNlYyA9IHJlbWFpbmRlcjsKKwkqdHMgPSBuc190b190aW1lc3BlYzY0KG5zKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTMzLDE0ICsxMzEsMTQgQEAKICAqIHdhbGwgdGltZXIgdmFsdWUuCiAgKiovCiBzdGF0aWMgaW50IGUxMDAwZV9waGNfc2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMpCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjb250YWluZXJfb2YocHRwLCBzdHJ1Y3QgZTEwMDBfYWRhcHRlciwKIAkJCQkJCSAgICAgcHRwX2Nsb2NrX2luZm8pOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTY0IG5zOwogCi0JbnMgPSB0aW1lc3BlY190b19ucyh0cyk7CisJbnMgPSB0aW1lc3BlYzY0X3RvX25zKHRzKTsKIAogCS8qIHJlc2V0IHRoZSB0aW1lY291bnRlciAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5zeXN0aW1fbG9jaywgZmxhZ3MpOwpAQCAtMTcxLDExICsxNjksMTIgQEAKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZTEwMDBfYWRhcHRlciwKIAkJCQkJCSAgICAgc3lzdGltX292ZXJmbG93X3dvcmsud29yayk7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHRpbWVzcGVjNjQgdHM7CiAKLQlhZGFwdGVyLT5wdHBfY2xvY2tfaW5mby5nZXR0aW1lKCZhZGFwdGVyLT5wdHBfY2xvY2tfaW5mbywgJnRzKTsKKwlhZGFwdGVyLT5wdHBfY2xvY2tfaW5mby5nZXR0aW1lNjQoJmFkYXB0ZXItPnB0cF9jbG9ja19pbmZvLCAmdHMpOwogCi0JZV9kYmcoIlNZU1RJTSBvdmVyZmxvdyBjaGVjayBhdCAlbGQuJTA5bHVcbiIsIHRzLnR2X3NlYywgdHMudHZfbnNlYyk7CisJZV9kYmcoIlNZU1RJTSBvdmVyZmxvdyBjaGVjayBhdCAlbGxkLiUwOWx1XG4iLAorCSAgICAgIChsb25nIGxvbmcpIHRzLnR2X3NlYywgdHMudHZfbnNlYyk7CiAKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPnN5c3RpbV9vdmVyZmxvd193b3JrLAogCQkJICAgICAgRTEwMDBfU1lTVElNX09WRVJGTE9XX1BFUklPRCk7CkBAIC0xOTAsOCArMTg5LDggQEAKIAkucHBzCQk9IDAsCiAJLmFkamZyZXEJPSBlMTAwMGVfcGhjX2FkamZyZXEsCiAJLmFkanRpbWUJPSBlMTAwMGVfcGhjX2FkanRpbWUsCi0JLmdldHRpbWUJPSBlMTAwMGVfcGhjX2dldHRpbWUsCi0JLnNldHRpbWUJPSBlMTAwMGVfcGhjX3NldHRpbWUsCisJLmdldHRpbWU2NAk9IGUxMDAwZV9waGNfZ2V0dGltZSwKKwkuc2V0dGltZTY0CT0gZTEwMDBlX3BoY19zZXR0aW1lLAogCS5lbmFibGUJCT0gZTEwMDBlX3BoY19lbmFibGUsCiB9OwogCkBAIC0yMjEsNyArMjIwLDkgQEAKIAlzd2l0Y2ggKGh3LT5tYWMudHlwZSkgewogCWNhc2UgZTEwMDBfcGNoMmxhbjoKIAljYXNlIGUxMDAwX3BjaF9scHQ6Ci0JCWlmICgoaHctPm1hYy50eXBlICE9IGUxMDAwX3BjaF9scHQpIHx8CisJY2FzZSBlMTAwMF9wY2hfc3B0OgorCQlpZiAoKChody0+bWFjLnR5cGUgIT0gZTEwMDBfcGNoX2xwdCkgJiYKKwkJICAgICAoaHctPm1hYy50eXBlICE9IGUxMDAwX3BjaF9zcHQpKSB8fAogCQkgICAgKGVyMzIoVFNZTkNSWENUTCkgJiBFMTAwMF9UU1lOQ1JYQ1RMX1NZU0NGSSkpIHsKIAkJCWFkYXB0ZXItPnB0cF9jbG9ja19pbmZvLm1heF9hZGogPSAyNDAwMDAwMCAtIDE7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9yZWdzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvcmVncy5oCmluZGV4IGVhMjM1YmIuLjg1ZWVmYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL3JlZ3MuaApAQCAtMzgsNiArMzgsNyBAQAogI2RlZmluZSBFMTAwMF9GRVhUTlZNNAkweDAwMDI0CS8qIEZ1dHVyZSBFeHRlbmRlZCBOVk0gNCAtIFJXICovCiAjZGVmaW5lIEUxMDAwX0ZFWFROVk02CTB4MDAwMTAJLyogRnV0dXJlIEV4dGVuZGVkIE5WTSA2IC0gUlcgKi8KICNkZWZpbmUgRTEwMDBfRkVYVE5WTTcJMHgwMDBFNAkvKiBGdXR1cmUgRXh0ZW5kZWQgTlZNIDcgLSBSVyAqLworI2RlZmluZSBFMTAwMF9QQ0lFQU5BQ0ZHCTB4MDBGMTgJLyogUENJRSBBbmFsb2cgQ29uZmlnICovCiAjZGVmaW5lIEUxMDAwX0ZDVAkweDAwMDMwCS8qIEZsb3cgQ29udHJvbCBUeXBlIC0gUlcgKi8KICNkZWZpbmUgRTEwMDBfVkVUCTB4MDAwMzgJLyogVkxBTiBFdGhlciBUeXBlIC0gUlcgKi8KICNkZWZpbmUgRTEwMDBfSUNSCTB4MDAwQzAJLyogSW50ZXJydXB0IENhdXNlIFJlYWQgLSBSL2NsciAqLwpAQCAtNjcsNiArNjgsNyBAQAogI2RlZmluZSBFMTAwMF9QQkEJMHgwMTAwMAkvKiBQYWNrZXQgQnVmZmVyIEFsbG9jYXRpb24gLSBSVyAqLwogI2RlZmluZSBFMTAwMF9QQlMJMHgwMTAwOAkvKiBQYWNrZXQgQnVmZmVyIFNpemUgKi8KICNkZWZpbmUgRTEwMDBfUEJFQ0NTVFMJMHgwMTAwQwkvKiBQYWNrZXQgQnVmZmVyIEVDQyBTdGF0dXMgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JT1NGUEMJMHgwMEYyOAkvKiBUWCBjb3JydXB0ZWQgZGF0YSAgKi8KICNkZWZpbmUgRTEwMDBfRUVNTkdDVEwJMHgwMTAxMAkvKiBNTkcgRUVwcm9tIENvbnRyb2wgKi8KICNkZWZpbmUgRTEwMDBfRUVXUgkweDAxMDJDCS8qIEVFUFJPTSBXcml0ZSBSZWdpc3RlciAtIFJXICovCiAjZGVmaW5lIEUxMDAwX0ZMT1AJMHgwMTAzQwkvKiBGTEFTSCBPcGNvZGUgUmVnaXN0ZXIgKi8KQEAgLTEyMSw2ICsxMjMsNyBAQAogCQkJCSAoMHgwNTRFNCArICgoX2kgLSAxNikgKiA4KSkpCiAjZGVmaW5lIEUxMDAwX1NIUkFMKF9pKQkJKDB4MDU0MzggKyAoKF9pKSAqIDgpKQogI2RlZmluZSBFMTAwMF9TSFJBSChfaSkJCSgweDA1NDNDICsgKChfaSkgKiA4KSkKKyNkZWZpbmUgRTEwMDBfVEFSQzBfQ0JfTVVMVElRXzNfUkVRCSgxIDw8IDI4IHwgMSA8PCAyOSkKICNkZWZpbmUgRTEwMDBfVERGSAkJMHgwMzQxMAkvKiBUeCBEYXRhIEZJRk8gSGVhZCAtIFJXICovCiAjZGVmaW5lIEUxMDAwX1RERlQJCTB4MDM0MTgJLyogVHggRGF0YSBGSUZPIFRhaWwgLSBSVyAqLwogI2RlZmluZSBFMTAwMF9UREZIUwkJMHgwMzQyMAkvKiBUeCBEYXRhIEZJRk8gSGVhZCBTYXZlZCAtIFJXICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEway5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGsuaAppbmRleCA0MmViNDM0Li5jOGM4YzViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEway5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrLmgKQEAgLTEsNSArMSw1IEBACiAvKiBJbnRlbCBFdGhlcm5ldCBTd2l0Y2ggSG9zdCBJbnRlcmZhY2UgRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0yMzUsNiArMjM1LDkgQEAKIAlfX2JlMTYJCQlwb3J0OwogfTsKIAorLyogb25lIHdvcmsgcXVldWUgZm9yIGVudGlyZSBkcml2ZXIgKi8KK2V4dGVybiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZm0xMGtfd29ya3F1ZXVlOworCiBzdHJ1Y3QgZm0xMGtfaW50ZmMgewogCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3ZsYW5zW0JJVFNfVE9fTE9OR1MoVkxBTl9OX1ZJRCldOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CkBAIC0yNjYsNyArMjY5LDYgQEAKIAl1NjQgdHhfY3N1bV9lcnJvcnM7CiAJdTY0IGFsbG9jX2ZhaWxlZDsKIAl1NjQgcnhfY3N1bV9lcnJvcnM7Ci0JdTY0IHJ4X2Vycm9yczsKIAogCXU2NCB0eF9ieXRlc19uaWM7CiAJdTY0IHR4X3BhY2tldHNfbmljOwpAQCAtNDM5LDYgKzQ0MSw3IEBACiBleHRlcm4gY29uc3QgY2hhciBmbTEwa19kcml2ZXJfdmVyc2lvbltdOwogaW50IGZtMTBrX2luaXRfcXVldWVpbmdfc2NoZW1lKHN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlKTsKIHZvaWQgZm0xMGtfY2xlYXJfcXVldWVpbmdfc2NoZW1lKHN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlKTsKK19fYmUxNiBmbTEwa190eF9lbmNhcF9vZmZsb2FkKHN0cnVjdCBza19idWZmICpza2IpOwogbmV0ZGV2X3R4X3QgZm0xMGtfeG1pdF9mcmFtZV9yaW5nKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICBzdHJ1Y3QgZm0xMGtfcmluZyAqdHhfcmluZyk7CiB2b2lkIGZtMTBrX3R4X3RpbWVvdXRfcmVzZXQoc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UpOwpAQCAtNDU3LDYgKzQ2MCw5IEBACiB2b2lkIGZtMTBrX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSk7CiB2b2lkIGZtMTBrX3NlcnZpY2VfZXZlbnRfc2NoZWR1bGUoc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UpOwogdm9pZCBmbTEwa191cGRhdGVfcnhfZHJvcF9lbihzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSk7CisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKK3ZvaWQgZm0xMGtfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKKyNlbmRpZgogCiAvKiBOZXRkZXYgKi8KIHN0cnVjdCBuZXRfZGV2aWNlICpmbTEwa19hbGxvY19uZXRkZXYodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19jb21tb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2NvbW1vbi5jCmluZGV4IGJmMTlkY2MuLjZjZmFlNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2NvbW1vbi5jCkBAIC0zOTgsNyArMzk4LDcgQEAKIAkvKiBSZXRyaWV2ZSBSWCBPd25lciBEYXRhICovCiAJaWRfcnggPSBmbTEwa19yZWFkX3JlZyhodywgRk0xMEtfUlhRQ1RMKGlkeCkpOwogCi0JLyogUHJvY2VzcyBSWCBSaW5nKi8KKwkvKiBQcm9jZXNzIFJYIFJpbmcgKi8KIAlkbyB7CiAJCXJ4X2Ryb3BzID0gZm0xMGtfcmVhZF9od19zdGF0c18zMmIoaHcsIEZNMTBLX1FQUkRDKGlkeCksCiAJCQkJCQkgICAmcS0+cnhfZHJvcHMpOwpAQCAtNDY2LDcgKzQ2Niw2IEBACiAgKiAgRnVuY3Rpb24gaW52YWxpZGF0ZXMgdGhlIGluZGV4IHZhbHVlcyBmb3IgdGhlIHF1ZXVlcyBzbyBhbnkgdXBkYXRlcyB0aGF0CiAgKiAgbWF5IGhhdmUgaGFwcGVuZWQgYXJlIGlnbm9yZWQgYW5kIHRoZSBiYXNlIGZvciB0aGUgcXVldWUgc3RhdHMgaXMgcmVzZXQuCiAgKiovCi0KIHZvaWQgZm0xMGtfdW5iaW5kX2h3X3N0YXRzX3Eoc3RydWN0IGZtMTBrX2h3X3N0YXRzX3EgKnEsIHUzMiBpZHgsIHUzMiBjb3VudCkKIHsKIAl1MzIgaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2RjYm5sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19kY2JubC5jCmluZGV4IDIxMmE5MmQuLjVjN2E0ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2RjYm5sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfZGNibmwuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIEludGVsIEV0aGVybmV0IFN3aXRjaCBIb3N0IEludGVyZmFjZSBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTEyOCw3ICsxMjgsNyBAQAogICoKICAqIFJldHVybnMgdGhhdCB3ZSBzdXBwb3J0IG9ubHkgSUVFRSBEQ0IgZm9yIHRoaXMgaW50ZXJmYWNlCiAgKiovCi1zdGF0aWMgdTggZm0xMGtfZGNibmxfZ2V0ZGNieChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHU4IGZtMTBrX2RjYm5sX2dldGRjYngoc3RydWN0IG5ldF9kZXZpY2UgX19hbHdheXNfdW51c2VkICpkZXYpCiB7CiAJcmV0dXJuIERDQl9DQVBfRENCWF9IT1NUIHwgRENCX0NBUF9EQ0JYX1ZFUl9JRUVFOwogfQpAQCAtMTQwLDcgKzE0MCw3IEBACiAgKgogICogUmV0dXJucyBlcnJvciBvbiBhdHRlbXB0IHRvIGVuYWJsZSBhbnl0aGluZyBidXQgSUVFRSBEQ0IgZm9yIHRoaXMgaW50ZXJmYWNlCiAgKiovCi1zdGF0aWMgdTggZm0xMGtfZGNibmxfc2V0ZGNieChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBtb2RlKQorc3RhdGljIHU4IGZtMTBrX2RjYm5sX3NldGRjYngoc3RydWN0IG5ldF9kZXZpY2UgX19hbHdheXNfdW51c2VkICpkZXYsIHU4IG1vZGUpCiB7CiAJcmV0dXJuIChtb2RlICE9IChEQ0JfQ0FQX0RDQlhfSE9TVCB8IERDQl9DQVBfRENCWF9WRVJfSUVFRSkpID8gMSA6IDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19kZWJ1Z2ZzLmMKaW5kZXggNDMyN2Y4Ni4uZjQ1YjRkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2RlYnVnZnMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIEludGVsIEV0aGVybmV0IFN3aXRjaCBIb3N0IEludGVyZmFjZSBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTM2LDE0ICszNiwxNiBAQAogCXJldHVybiAoKnBvcyA8IHJpbmctPmNvdW50KSA/IHBvcyA6IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkICpmbTEwa19kYmdfZGVzY19zZXFfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQorc3RhdGljIHZvaWQgKmZtMTBrX2RiZ19kZXNjX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqcywKKwkJCQkgICAgIHZvaWQgX19hbHdheXNfdW51c2VkICp2LCBsb2ZmX3QgKnBvcykKIHsKIAlzdHJ1Y3QgZm0xMGtfcmluZyAqcmluZyA9IHMtPnByaXZhdGU7CiAKIAlyZXR1cm4gKCsrKCpwb3MpIDwgcmluZy0+Y291bnQpID8gcG9zIDogTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgZm0xMGtfZGJnX2Rlc2Nfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQorc3RhdGljIHZvaWQgZm0xMGtfZGJnX2Rlc2Nfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlIF9fYWx3YXlzX3VudXNlZCAqcywKKwkJCQkgICAgX19hbHdheXNfdW51c2VkIHZvaWQgKnYpCiB7CiAJLyogRG8gbm90aGluZy4gKi8KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2V0aHRvb2wuYwppbmRleCA2NTFmNTNiLi40YjlkOWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfZXRodG9vbC5jCkBAIC0xLDUgKzEsNSBAQAogLyogSW50ZWwgRXRoZXJuZXQgU3dpdGNoIEhvc3QgSW50ZXJmYWNlIERyaXZlcgotICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE1IEludGVsIENvcnBvcmF0aW9uLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtNTcsMTMgKzU3LDEyIEBACiAJLnN0YXRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IGZtMTBrX2ludGZjLCBfc3RhdCkgXAogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZtMTBrX3N0YXRzIGZtMTBrX2dzdHJpbmdzX3N0YXRzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZtMTBrX3N0YXRzIGZtMTBrX2dzdHJpbmdzX2dsb2JhbF9zdGF0c1tdID0gewogCUZNMTBLX1NUQVQoInR4X3Jlc3RhcnRfcXVldWUiLCByZXN0YXJ0X3F1ZXVlKSwKIAlGTTEwS19TVEFUKCJ0eF9idXN5IiwgdHhfYnVzeSksCiAJRk0xMEtfU1RBVCgidHhfY3N1bV9lcnJvcnMiLCB0eF9jc3VtX2Vycm9ycyksCiAJRk0xMEtfU1RBVCgicnhfYWxsb2NfZmFpbGVkIiwgYWxsb2NfZmFpbGVkKSwKIAlGTTEwS19TVEFUKCJyeF9jc3VtX2Vycm9ycyIsIHJ4X2NzdW1fZXJyb3JzKSwKLQlGTTEwS19TVEFUKCJyeF9lcnJvcnMiLCByeF9lcnJvcnMpLAogCiAJRk0xMEtfU1RBVCgidHhfcGFja2V0c19uaWMiLCB0eF9wYWNrZXRzX25pYyksCiAJRk0xMEtfU1RBVCgidHhfYnl0ZXNfbmljIiwgdHhfYnl0ZXNfbmljKSwKQEAgLTczLDYgKzcyLDI0IEBACiAJRk0xMEtfU1RBVCgicnhfb3ZlcnJ1bl9wZiIsIHJ4X292ZXJydW5fcGYpLAogCUZNMTBLX1NUQVQoInJ4X292ZXJydW5fdmYiLCByeF9vdmVycnVuX3ZmKSwKIAorCUZNMTBLX1NUQVQoInN3YXBpX3N0YXR1cyIsIGh3LnN3YXBpLnN0YXR1cyksCisJRk0xMEtfU1RBVCgibWFjX3J1bGVzX3VzZWQiLCBody5zd2FwaS5tYWMudXNlZCksCisJRk0xMEtfU1RBVCgibWFjX3J1bGVzX2F2YWlsIiwgaHcuc3dhcGkubWFjLmF2YWlsKSwKKworCUZNMTBLX1NUQVQoIm1ieF90eF9idXN5IiwgaHcubWJ4LnR4X2J1c3kpLAorCUZNMTBLX1NUQVQoIm1ieF90eF9vdmVyc2l6ZWQiLCBody5tYngudHhfZHJvcHBlZCksCisJRk0xMEtfU1RBVCgibWJ4X3R4X21lc3NhZ2VzIiwgaHcubWJ4LnR4X21lc3NhZ2VzKSwKKwlGTTEwS19TVEFUKCJtYnhfdHhfZHdvcmRzIiwgaHcubWJ4LnR4X2R3b3JkcyksCisJRk0xMEtfU1RBVCgibWJ4X3J4X21lc3NhZ2VzIiwgaHcubWJ4LnJ4X21lc3NhZ2VzKSwKKwlGTTEwS19TVEFUKCJtYnhfcnhfZHdvcmRzIiwgaHcubWJ4LnJ4X2R3b3JkcyksCisJRk0xMEtfU1RBVCgibWJ4X3J4X3BhcnNlX2VyciIsIGh3Lm1ieC5yeF9wYXJzZV9lcnIpLAorCisJRk0xMEtfU1RBVCgidHhfaGFuZ19jb3VudCIsIHR4X3RpbWVvdXRfY291bnQpLAorCisJRk0xMEtfU1RBVCgidHhfaHd0c3RhbXBfdGltZW91dHMiLCB0eF9od3RzdGFtcF90aW1lb3V0cyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZtMTBrX3N0YXRzIGZtMTBrX2dzdHJpbmdzX3BmX3N0YXRzW10gPSB7CiAJRk0xMEtfU1RBVCgidGltZW91dCIsIHN0YXRzLnRpbWVvdXQuY291bnQpLAogCUZNMTBLX1NUQVQoInVyIiwgc3RhdHMudXIuY291bnQpLAogCUZNMTBLX1NUQVQoImNhIiwgc3RhdHMuY2EuY291bnQpLApAQCAtODEsMzAgKzk4LDE2IEBACiAJRk0xMEtfU1RBVCgidmxhbl9kcm9wIiwgc3RhdHMudmxhbl9kcm9wLmNvdW50KSwKIAlGTTEwS19TVEFUKCJsb29wYmFja19kcm9wIiwgc3RhdHMubG9vcGJhY2tfZHJvcC5jb3VudCksCiAJRk0xMEtfU1RBVCgibm9kZXNjX2Ryb3AiLCBzdGF0cy5ub2Rlc2NfZHJvcC5jb3VudCksCi0KLQlGTTEwS19TVEFUKCJzd2FwaV9zdGF0dXMiLCBody5zd2FwaS5zdGF0dXMpLAotCUZNMTBLX1NUQVQoIm1hY19ydWxlc191c2VkIiwgaHcuc3dhcGkubWFjLnVzZWQpLAotCUZNMTBLX1NUQVQoIm1hY19ydWxlc19hdmFpbCIsIGh3LnN3YXBpLm1hYy5hdmFpbCksCi0KLQlGTTEwS19TVEFUKCJtYnhfdHhfYnVzeSIsIGh3Lm1ieC50eF9idXN5KSwKLQlGTTEwS19TVEFUKCJtYnhfdHhfZHJvcHBlZCIsIGh3Lm1ieC50eF9kcm9wcGVkKSwKLQlGTTEwS19TVEFUKCJtYnhfdHhfbWVzc2FnZXMiLCBody5tYngudHhfbWVzc2FnZXMpLAotCUZNMTBLX1NUQVQoIm1ieF90eF9kd29yZHMiLCBody5tYngudHhfZHdvcmRzKSwKLQlGTTEwS19TVEFUKCJtYnhfcnhfbWVzc2FnZXMiLCBody5tYngucnhfbWVzc2FnZXMpLAotCUZNMTBLX1NUQVQoIm1ieF9yeF9kd29yZHMiLCBody5tYngucnhfZHdvcmRzKSwKLQlGTTEwS19TVEFUKCJtYnhfcnhfcGFyc2VfZXJyIiwgaHcubWJ4LnJ4X3BhcnNlX2VyciksCi0KLQlGTTEwS19TVEFUKCJ0eF9od3RzdGFtcF90aW1lb3V0cyIsIHR4X2h3dHN0YW1wX3RpbWVvdXRzKSwKIH07CiAKLSNkZWZpbmUgRk0xMEtfR0xPQkFMX1NUQVRTX0xFTiBBUlJBWV9TSVpFKGZtMTBrX2dzdHJpbmdzX3N0YXRzKQorI2RlZmluZSBGTTEwS19HTE9CQUxfU1RBVFNfTEVOIEFSUkFZX1NJWkUoZm0xMGtfZ3N0cmluZ3NfZ2xvYmFsX3N0YXRzKQorI2RlZmluZSBGTTEwS19QRl9TVEFUU19MRU4gQVJSQVlfU0laRShmbTEwa19nc3RyaW5nc19wZl9zdGF0cykKIAotI2RlZmluZSBGTTEwS19RVUVVRV9TVEFUU19MRU4gXAotCSAgKE1BWF9RVUVVRVMgKiAyICogKHNpemVvZihzdHJ1Y3QgZm0xMGtfcXVldWVfc3RhdHMpIC8gc2l6ZW9mKHU2NCkpKQorI2RlZmluZSBGTTEwS19RVUVVRV9TVEFUU19MRU4oX24pIFwKKwkoIChfbikgKiAyICogKHNpemVvZihzdHJ1Y3QgZm0xMGtfcXVldWVfc3RhdHMpIC8gc2l6ZW9mKHU2NCkpKQogCi0jZGVmaW5lIEZNMTBLX1NUQVRTX0xFTiAoRk0xMEtfR0xPQkFMX1NUQVRTX0xFTiArIFwKLQkJCSBGTTEwS19ORVRERVZfU1RBVFNfTEVOICsgXAotCQkJIEZNMTBLX1FVRVVFX1NUQVRTX0xFTikKKyNkZWZpbmUgRk0xMEtfU1RBVElDX1NUQVRTX0xFTiAoRk0xMEtfR0xPQkFMX1NUQVRTX0xFTiArIFwKKwkJCQlGTTEwS19ORVRERVZfU1RBVFNfTEVOKQogCiBzdGF0aWMgY29uc3QgY2hhciBmbTEwa19nc3RyaW5nc190ZXN0W11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKIAkiTWFpbGJveCB0ZXN0IChvbi9vZmZsaW5lKSIKQEAgLTExNyw5ICsxMjAsOSBAQAogCUZNMTBLX1RFU1RfTUFYID0gRk0xMEtfVEVTVF9MRU4KIH07CiAKLXN0YXRpYyB2b2lkIGZtMTBrX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsCi0JCQkgICAgICB1OCAqZGF0YSkKK3N0YXRpYyB2b2lkIGZtMTBrX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpkYXRhKQogeworCXN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAljaGFyICpwID0gKGNoYXIgKilkYXRhOwogCWludCBpOwogCkBAIC0xMzUsMTIgKzEzOCwxOSBAQAogCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCX0KIAkJZm9yIChpID0gMDsgaSA8IEZNMTBLX0dMT0JBTF9TVEFUU19MRU47IGkrKykgewotCQkJbWVtY3B5KHAsIGZtMTBrX2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfc3RyaW5nLAorCQkJbWVtY3B5KHAsIGZtMTBrX2dzdHJpbmdzX2dsb2JhbF9zdGF0c1tpXS5zdGF0X3N0cmluZywKIAkJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOwogCQkJcCArPSBFVEhfR1NUUklOR19MRU47CiAJCX0KIAotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1FVRVVFUzsgaSsrKSB7CisJCWlmIChpbnRlcmZhY2UtPmh3Lm1hYy50eXBlICE9IGZtMTBrX21hY192ZikKKwkJCWZvciAoaSA9IDA7IGkgPCBGTTEwS19QRl9TVEFUU19MRU47IGkrKykgeworCQkJCW1lbWNweShwLCBmbTEwa19nc3RyaW5nc19wZl9zdGF0c1tpXS5zdGF0X3N0cmluZywKKwkJCQkgICAgICAgRVRIX0dTVFJJTkdfTEVOKTsKKwkJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgaW50ZXJmYWNlLT5ody5tYWMubWF4X3F1ZXVlczsgaSsrKSB7CiAJCQlzcHJpbnRmKHAsICJ0eF9xdWV1ZV8ldV9wYWNrZXRzIiwgaSk7CiAJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKIAkJCXNwcmludGYocCwgInR4X3F1ZXVlXyV1X2J5dGVzIiwgaSk7CkBAIC0xNTYsMTggKzE2NiwyOCBAQAogCiBzdGF0aWMgaW50IGZtMTBrX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzc2V0KQogeworCXN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZm0xMGtfaHcgKmh3ID0gJmludGVyZmFjZS0+aHc7CisJaW50IHN0YXRzX2xlbiA9IEZNMTBLX1NUQVRJQ19TVEFUU19MRU47CisKIAlzd2l0Y2ggKHNzZXQpIHsKIAljYXNlIEVUSF9TU19URVNUOgogCQlyZXR1cm4gRk0xMEtfVEVTVF9MRU47CiAJY2FzZSBFVEhfU1NfU1RBVFM6Ci0JCXJldHVybiBGTTEwS19TVEFUU19MRU47CisJCXN0YXRzX2xlbiArPSBGTTEwS19RVUVVRV9TVEFUU19MRU4oaHctPm1hYy5tYXhfcXVldWVzKTsKKworCQlpZiAoaHctPm1hYy50eXBlICE9IGZtMTBrX21hY192ZikKKwkJCXN0YXRzX2xlbiArPSBGTTEwS19QRl9TVEFUU19MRU47CisKKwkJcmV0dXJuIHN0YXRzX2xlbjsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBmbTEwa19nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotCQkJCSAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsIHU2NCAqZGF0YSkKKwkJCQkgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgX19hbHdheXNfdW51c2VkICpzdGF0cywKKwkJCQkgICAgdTY0ICpkYXRhKQogewogCWNvbnN0IGludCBzdGF0X2NvdW50ID0gc2l6ZW9mKHN0cnVjdCBmbTEwa19xdWV1ZV9zdGF0cykgLyBzaXplb2YodTY0KTsKIAlzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSA9IG5ldGRldl9wcml2KG5ldGRldik7CkBAIC0xODQsMTIgKzIwNCwyMSBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBGTTEwS19HTE9CQUxfU1RBVFNfTEVOOyBpKyspIHsKLQkJcCA9IChjaGFyICopaW50ZXJmYWNlICsgZm0xMGtfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7Ci0JCSooZGF0YSsrKSA9IChmbTEwa19nc3RyaW5nc19zdGF0c1tpXS5zaXplb2Zfc3RhdCA9PQorCQlwID0gKGNoYXIgKilpbnRlcmZhY2UgKworCQkgICAgZm0xMGtfZ3N0cmluZ3NfZ2xvYmFsX3N0YXRzW2ldLnN0YXRfb2Zmc2V0OworCQkqKGRhdGErKykgPSAoZm0xMGtfZ3N0cmluZ3NfZ2xvYmFsX3N0YXRzW2ldLnNpemVvZl9zdGF0ID09CiAJCQlzaXplb2YodTY0KSkgPyAqKHU2NCAqKXAgOiAqKHUzMiAqKXA7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9RVUVVRVM7IGkrKykgeworCWlmIChpbnRlcmZhY2UtPmh3Lm1hYy50eXBlICE9IGZtMTBrX21hY192ZikKKwkJZm9yIChpID0gMDsgaSA8IEZNMTBLX1BGX1NUQVRTX0xFTjsgaSsrKSB7CisJCQlwID0gKGNoYXIgKilpbnRlcmZhY2UgKworCQkJICAgIGZtMTBrX2dzdHJpbmdzX3BmX3N0YXRzW2ldLnN0YXRfb2Zmc2V0OworCQkJKihkYXRhKyspID0gKGZtMTBrX2dzdHJpbmdzX3BmX3N0YXRzW2ldLnNpemVvZl9zdGF0ID09CisJCQkJICAgICBzaXplb2YodTY0KSkgPyAqKHU2NCAqKXAgOiAqKHUzMiAqKXA7CisJCX0KKworCWZvciAoaSA9IDA7IGkgPCBpbnRlcmZhY2UtPmh3Lm1hYy5tYXhfcXVldWVzOyBpKyspIHsKIAkJc3RydWN0IGZtMTBrX3JpbmcgKnJpbmc7CiAJCXU2NCAqcXVldWVfc3RhdDsKIApAQCAtMzY5LDcgKzM5OCw3IEBACiAJc3RybmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoaW50ZXJmYWNlLT5wZGV2KSwKIAkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSAtIDEpOwogCi0JaW5mby0+bl9zdGF0cyA9IEZNMTBLX1NUQVRTX0xFTjsKKwlpbmZvLT5uX3N0YXRzID0gZm0xMGtfZ2V0X3NzZXRfY291bnQoZGV2LCBFVEhfU1NfU1RBVFMpOwogCiAJaW5mby0+cmVnZHVtcF9sZW4gPSBmbTEwa19nZXRfcmVnc19sZW4oZGV2KTsKIH0KQEAgLTY0NSw3ICs2NzQsNyBAQAogfQogCiBzdGF0aWMgaW50IGZtMTBrX2dldF9yeG5mYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqY21kLAotCQkJICAgdTMyICpydWxlX2xvY3MpCisJCQkgICB1MzIgX19hbHdheXNfdW51c2VkICpydWxlX2xvY3MpCiB7CiAJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCByZXQgPSAtRU9QTk9UU1VQUDsKQEAgLTg1MSw3ICs4ODAsNyBAQAogCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogfQogCi1zdGF0aWMgdTMyIGZtMTBrX2dldF9yZXRhX3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3N0YXRpYyB1MzIgZm0xMGtfZ2V0X3JldGFfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSBfX2Fsd2F5c191bnVzZWQgKm5ldGRldikKIHsKIAlyZXR1cm4gRk0xMEtfUkVUQV9TSVpFICogRk0xMEtfUkVUQV9FTlRSSUVTX1BFUl9SRUc7CiB9CkBAIC05MTEsNyArOTQwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUzMiBmbTEwa19nZXRfcnNzcmtfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RhdGljIHUzMiBmbTEwa19nZXRfcnNzcmtfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSBfX2Fsd2F5c191bnVzZWQgKm5ldGRldikKIHsKIAlyZXR1cm4gRk0xMEtfUlNTUktfU0laRSAqIEZNMTBLX1JTU1JLX0VOVFJJRVNfUEVSX1JFRzsKIH0KQEAgLTEwMTksNyArMTA0OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZm0xMGtfZ2V0X3RzX2luZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSAgIHN0cnVjdCBldGh0b29sX3RzX2luZm8gKmluZm8pCisJCQkgICAgIHN0cnVjdCBldGh0b29sX3RzX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UgPSBuZXRkZXZfcHJpdihkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19pb3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2lvdi5jCmluZGV4IDA2MDE5MDguLjViMDhlNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2lvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX2lvdi5jCkBAIC0xLDUgKzEsNSBAQAogLyogSW50ZWwgRXRoZXJuZXQgU3dpdGNoIEhvc3QgSW50ZXJmYWNlIERyaXZlcgotICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE1IEludGVsIENvcnBvcmF0aW9uLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtNDcsNyArNDcsNyBAQAogewogCXN0cnVjdCBmbTEwa19odyAqaHcgPSAmaW50ZXJmYWNlLT5odzsKIAlzdHJ1Y3QgZm0xMGtfaW92X2RhdGEgKmlvdl9kYXRhOwotCXM2NCBtYmljciwgdmZscmU7CisJczY0IHZmbHJlOwogCWludCBpOwogCiAJLyogaWYgdGhlcmUgaXMgbm8gaW92X2RhdGEgdGhlbiB0aGVyZSBpcyBubyBtYWlsYm94ZXMgdG8gcHJvY2VzcyAqLwpAQCAtNjMsNyArNjMsNyBAQAogCQlnb3RvIHJlYWRfdW5sb2NrOwogCiAJaWYgKCEoZm0xMGtfcmVhZF9yZWcoaHcsIEZNMTBLX0VJQ1IpICYgRk0xMEtfRUlDUl9WRkxSKSkKLQkJZ290byBwcm9jZXNzX21ieDsKKwkJZ290byByZWFkX3VubG9jazsKIAogCS8qIHJlYWQgVkZMUkUgdG8gZGV0ZXJtaW5lIGlmIGFueSBWRnMgaGF2ZSBiZWVuIHJlc2V0ICovCiAJZG8gewpAQCAtODYsMzIgKzg2LDYgQEAKIAkJfQogCX0gd2hpbGUgKGkgIT0gaW92X2RhdGEtPm51bV92ZnMpOwogCi1wcm9jZXNzX21ieDoKLQkvKiByZWFkIE1CSUNSIHRvIGRldGVybWluZSB3aGljaCBWRnMgcmVxdWlyZSBhdHRlbnRpb24gKi8KLQltYmljciA9IGZtMTBrX3JlYWRfcmVnKGh3LCBGTTEwS19NQklDUigxKSk7Ci0JbWJpY3IgPDw9IDMyOwotCW1iaWNyIHw9IGZtMTBrX3JlYWRfcmVnKGh3LCBGTTEwS19NQklDUigwKSk7Ci0KLQlpID0gaW92X2RhdGEtPm5leHRfdmZfbWJ4ID8gOiBpb3ZfZGF0YS0+bnVtX3ZmczsKLQotCWZvciAobWJpY3IgPDw9IDY0IC0gaTsgaS0tOyBtYmljciArPSBtYmljcikgewotCQlzdHJ1Y3QgZm0xMGtfbWJ4X2luZm8gKm1ieCA9ICZpb3ZfZGF0YS0+dmZfaW5mb1tpXS5tYng7Ci0KLQkJaWYgKG1iaWNyID49IDApCi0JCQljb250aW51ZTsKLQotCQlpZiAoIWh3LT5tYngub3BzLnR4X3JlYWR5KCZody0+bWJ4LCBGTTEwS19WRk1CWF9NU0dfTVRVKSkKLQkJCWJyZWFrOwotCi0JCW1ieC0+b3BzLnByb2Nlc3MoaHcsIG1ieCk7Ci0JfQotCi0JaWYgKGkgPj0gMCkgewotCQlpb3ZfZGF0YS0+bmV4dF92Zl9tYnggPSBpICsgMTsKLQl9IGVsc2UgaWYgKGlvdl9kYXRhLT5uZXh0X3ZmX21ieCkgewotCQlpb3ZfZGF0YS0+bmV4dF92Zl9tYnggPSAwOwotCQlnb3RvIHByb2Nlc3NfbWJ4OwotCX0KIHJlYWRfdW5sb2NrOgogCXJjdV9yZWFkX3VubG9jaygpOwogCkBAIC0xMzksNiArMTEzLDEzIEBACiAJLyogbG9jayB0aGUgbWFpbGJveCBmb3IgdHJhbnNtaXQgYW5kIHJlY2VpdmUgKi8KIAlmbTEwa19tYnhfbG9jayhpbnRlcmZhY2UpOwogCisJLyogTW9zdCBWRiBtZXNzYWdlcyBzZW50IHRvIHRoZSBQRiBjYXVzZSB0aGUgUEYgdG8gcmVzcG9uZCBieQorCSAqIHJlcXVlc3RpbmcgZnJvbSB0aGUgU00gbWFpbGJveC4gVGhpcyBtZWFucyB0aGF0IHRvbyBtYW55IFZGCisJICogbWVzc2FnZXMgcHJvY2Vzc2VkIGF0IG9uY2UgY291bGQgY2F1c2UgYSBtYWlsYm94IHRpbWVvdXQgb24gdGhlIFBGLgorCSAqIFRvIHByZXZlbnQgdGhpcywgc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBuZXh0IFZGIG1ieCB0byBwcm9jZXNzLiBVc2UKKwkgKiB0aGF0IGFzIHRoZSBzdGFydCBvZiB0aGUgbG9vcCBzbyB0aGF0IHdlIGRvbid0IHN0YXJ2ZSB3aGljaGV2ZXIgVkYKKwkgKiBnb3QgaWdub3JlZCBvbiB0aGUgcHJldmlvdXMgcnVuLgorCSAqLwogcHJvY2Vzc19tYng6CiAJZm9yIChpID0gaW92X2RhdGEtPm5leHRfdmZfbWJ4ID8gOiBpb3ZfZGF0YS0+bnVtX3ZmczsgaS0tOykgewogCQlzdHJ1Y3QgZm0xMGtfdmZfaW5mbyAqdmZfaW5mbyA9ICZpb3ZfZGF0YS0+dmZfaW5mb1tpXTsKQEAgLTE1NSwxMCArMTM2LDYgQEAKIAkJCW1ieC0+b3BzLmNvbm5lY3QoaHcsIG1ieCk7CiAJCX0KIAotCQkvKiBubyB3b3JrIHBlbmRpbmcsIHRoZW4ganVzdCBjb250aW51ZSAqLwotCQlpZiAobWJ4LT5vcHMudHhfY29tcGxldGUobWJ4KSAmJiAhbWJ4LT5vcHMucnhfcmVhZHkobWJ4KSkKLQkJCWNvbnRpbnVlOwotCiAJCS8qIGd1YXJhbnRlZSB3ZSBoYXZlIGZyZWUgc3BhY2UgaW4gdGhlIFNNIG1haWxib3ggKi8KIAkJaWYgKCFody0+bWJ4Lm9wcy50eF9yZWFkeSgmaHctPm1ieCwgRk0xMEtfVkZNQlhfTVNHX01UVSkpCiAJCQlicmVhazsKQEAgLTE2Nyw2ICsxNDQsMTAgQEAKIAkJbWJ4LT5vcHMucHJvY2VzcyhodywgbWJ4KTsKIAl9CiAKKwkvKiBpZiB3ZSBzdG9wcGVkIHByb2Nlc3NpbmcgbWFpbGJveGVzIGVhcmx5LCB1cGRhdGUgbmV4dF92Zl9tYnguCisJICogT3RoZXJ3aXNlLCByZXNldCBuZXh0X3ZmX21ieCwgYW5kIHJlc3RhcnQgbG9vcCBzbyB0aGF0IHdlIHByb2Nlc3MKKwkgKiB0aGUgcmVtYWluaW5nIG1haWxib3hlcyB3ZSBza2lwcGVkIGF0IHRoZSBzdGFydC4KKwkgKi8KIAlpZiAoaSA+PSAwKSB7CiAJCWlvdl9kYXRhLT5uZXh0X3ZmX21ieCA9IGkgKyAxOwogCX0gZWxzZSBpZiAoaW92X2RhdGEtPm5leHRfdmZfbWJ4KSB7CkBAIC0yNzUsNyArMjU2LDcgQEAKIAlpZiAodmZfaWR4ID49IGlvdl9kYXRhLT5udW1fdmZzKQogCQlyZXR1cm4gRk0xMEtfRVJSX1BBUkFNOwogCi0JLyogZGV0ZXJtaW5lIGlmIGFuIHVwZGF0ZSBoYXMgb2NjdXJlZCBhbmQgaWYgc28gbm90aWZ5IHRoZSBWRiAqLworCS8qIGRldGVybWluZSBpZiBhbiB1cGRhdGUgaGFzIG9jY3VycmVkIGFuZCBpZiBzbyBub3RpZnkgdGhlIFZGICovCiAJdmZfaW5mbyA9ICZpb3ZfZGF0YS0+dmZfaW5mb1t2Zl9pZHhdOwogCWlmICh2Zl9pbmZvLT5zd192aWQgIT0gcHZpZCkgewogCQl2Zl9pbmZvLT5zd192aWQgPSBwdmlkOwpAQCAtNDg4LDggKzQ2OSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBmbTEwa19uZG9fc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZHgsIGludCB1bnVzZWQsCi0JCQlpbnQgcmF0ZSkKK2ludCBmbTEwa19uZG9fc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZHgsCisJCQlpbnQgX19hbHdheXNfdW51c2VkIHVudXNlZCwgaW50IHJhdGUpCiB7CiAJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBmbTEwa19pb3ZfZGF0YSAqaW92X2RhdGEgPSBpbnRlcmZhY2UtPmlvdl9kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfbWFpbi5jCmluZGV4IDg0YWI5ZWUuLjFiMDY2MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19tYWluLmMKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2luY2x1ZGUgImZtMTBrLmgiCiAKLSNkZWZpbmUgRFJWX1ZFUlNJT04JIjAuMTIuMi1rIgorI2RlZmluZSBEUlZfVkVSU0lPTgkiMC4xNS4yLWsiCiBjb25zdCBjaGFyIGZtMTBrX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKIGNoYXIgZm0xMGtfZHJpdmVyX25hbWVbXSA9ICJmbTEwayI7CiBzdGF0aWMgY29uc3QgY2hhciBmbTEwa19kcml2ZXJfc3RyaW5nW10gPQpAQCAtNDEsNiArNDEsOSBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwogCisvKiBzaW5nbGUgd29ya3F1ZXVlIGZvciBlbnRpcmUgZm0xMGsgZHJpdmVyICovCitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZm0xMGtfd29ya3F1ZXVlID0gTlVMTDsKKwogLyoqCiAgKiBmbTEwa19pbml0X21vZHVsZSAtIERyaXZlciBSZWdpc3RyYXRpb24gUm91dGluZQogICoKQEAgLTUyLDYgKzU1LDEwIEBACiAJcHJfaW5mbygiJXMgLSB2ZXJzaW9uICVzXG4iLCBmbTEwa19kcml2ZXJfc3RyaW5nLCBmbTEwa19kcml2ZXJfdmVyc2lvbik7CiAJcHJfaW5mbygiJXNcbiIsIGZtMTBrX2NvcHlyaWdodCk7CiAKKwkvKiBjcmVhdGUgZHJpdmVyIHdvcmtxdWV1ZSAqLworCWlmICghZm0xMGtfd29ya3F1ZXVlKQorCQlmbTEwa193b3JrcXVldWUgPSBjcmVhdGVfd29ya3F1ZXVlKCJmbTEwayIpOworCiAJZm0xMGtfZGJnX2luaXQoKTsKIAogCXJldHVybiBmbTEwa19yZWdpc3Rlcl9wY2lfZHJpdmVyKCk7CkBAIC02OSw2ICs3NiwxMSBAQAogCWZtMTBrX3VucmVnaXN0ZXJfcGNpX2RyaXZlcigpOwogCiAJZm0xMGtfZGJnX2V4aXQoKTsKKworCS8qIGRlc3Ryb3kgZHJpdmVyIHdvcmtxdWV1ZSAqLworCWZsdXNoX3dvcmtxdWV1ZShmbTEwa193b3JrcXVldWUpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGZtMTBrX3dvcmtxdWV1ZSk7CisJZm0xMGtfd29ya3F1ZXVlID0gTlVMTDsKIH0KIG1vZHVsZV9leGl0KGZtMTBrX2V4aXRfbW9kdWxlKTsKIApAQCAtMjA5LDcgKzIyMSw3IEBACiAKIHN0YXRpYyBib29sIGZtMTBrX2Nhbl9yZXVzZV9yeF9wYWdlKHN0cnVjdCBmbTEwa19yeF9idWZmZXIgKnJ4X2J1ZmZlciwKIAkJCQkgICAgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJICAgIHVuc2lnbmVkIGludCB0cnVlc2l6ZSkKKwkJCQkgICAgdW5zaWduZWQgaW50IF9fbWF5YmVfdW51c2VkIHRydWVzaXplKQogewogCS8qIGF2b2lkIHJlLXVzaW5nIHJlbW90ZSBwYWdlcyAqLwogCWlmICh1bmxpa2VseShmbTEwa19wYWdlX2lzX3Jlc2VydmVkKHBhZ2UpKSkKQEAgLTI0MCw3ICsyNTIsNiBAQAogCiAvKioKICAqIGZtMTBrX2FkZF9yeF9mcmFnIC0gQWRkIGNvbnRlbnRzIG9mIFJ4IGJ1ZmZlciB0byBza19idWZmCi0gKiBAcnhfcmluZzogcnggZGVzY3JpcHRvciByaW5nIHRvIHRyYW5zYWN0IHBhY2tldHMgb24KICAqIEByeF9idWZmZXI6IGJ1ZmZlciBjb250YWluaW5nIHBhZ2UgdG8gYWRkCiAgKiBAcnhfZGVzYzogZGVzY3JpcHRvciBjb250YWluaW5nIGxlbmd0aCBvZiBidWZmZXIgd3JpdHRlbiBieSBoYXJkd2FyZQogICogQHNrYjogc2tfYnVmZiB0byBwbGFjZSB0aGUgZGF0YSBpbnRvCkBAIC0yNTMsOCArMjY0LDcgQEAKICAqIFRoZSBmdW5jdGlvbiB3aWxsIHRoZW4gdXBkYXRlIHRoZSBwYWdlIG9mZnNldCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybgogICogdHJ1ZSBpZiB0aGUgYnVmZmVyIGNhbiBiZSByZXVzZWQgYnkgdGhlIGludGVyZmFjZS4KICAqKi8KLXN0YXRpYyBib29sIGZtMTBrX2FkZF9yeF9mcmFnKHN0cnVjdCBmbTEwa19yaW5nICpyeF9yaW5nLAotCQkJICAgICAgc3RydWN0IGZtMTBrX3J4X2J1ZmZlciAqcnhfYnVmZmVyLAorc3RhdGljIGJvb2wgZm0xMGtfYWRkX3J4X2ZyYWcoc3RydWN0IGZtMTBrX3J4X2J1ZmZlciAqcnhfYnVmZmVyLAogCQkJICAgICAgdW5pb24gZm0xMGtfcnhfZGVzYyAqcnhfZGVzYywKIAkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0zMzAsNyArMzQwLDcgQEAKIAkJCQkgICAgICBETUFfRlJPTV9ERVZJQ0UpOwogCiAJLyogcHVsbCBwYWdlIGludG8gc2tiICovCi0JaWYgKGZtMTBrX2FkZF9yeF9mcmFnKHJ4X3JpbmcsIHJ4X2J1ZmZlciwgcnhfZGVzYywgc2tiKSkgeworCWlmIChmbTEwa19hZGRfcnhfZnJhZyhyeF9idWZmZXIsIHJ4X2Rlc2MsIHNrYikpIHsKIAkJLyogaGFuZCBzZWNvbmQgaGFsZiBvZiBwYWdlIGJhY2sgdG8gdGhlIHJpbmcgKi8KIAkJZm0xMGtfcmV1c2VfcnhfcGFnZShyeF9yaW5nLCByeF9idWZmZXIpOwogCX0gZWxzZSB7CkBAIC00MTIsNyArNDIyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgZm0xMGtfdHlwZV90cmFucyhzdHJ1Y3QgZm0xMGtfcmluZyAqcnhfcmluZywKLQkJCSAgICAgdW5pb24gZm0xMGtfcnhfZGVzYyAqcnhfZGVzYywKKwkJCSAgICAgdW5pb24gZm0xMGtfcnhfZGVzYyBfX21heWJlX3VudXNlZCAqcnhfZGVzYywKIAkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcnhfcmluZy0+bmV0ZGV2OwpAQCAtNTA5LDggKzUxOSw2IEBACiAKIC8qKgogICogZm0xMGtfcHVsbF90YWlsIC0gZm0xMGsgc3BlY2lmaWMgdmVyc2lvbiBvZiBza2JfcHVsbF90YWlsCi0gKiBAcnhfcmluZzogcnggZGVzY3JpcHRvciByaW5nIHBhY2tldCBpcyBiZWluZyB0cmFuc2FjdGVkIG9uCi0gKiBAcnhfZGVzYzogcG9pbnRlciB0byB0aGUgRU9QIFJ4IGRlc2NyaXB0b3IKICAqIEBza2I6IHBvaW50ZXIgdG8gY3VycmVudCBza2IgYmVpbmcgYWRqdXN0ZWQKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGFuIGZtMTBrIHNwZWNpZmljIHZlcnNpb24gb2YgX19wc2tiX3B1bGxfdGFpbC4gIFRoZQpAQCAtNTIwLDkgKzUyOCw3IEBACiAgKiBBcyBhIHJlc3VsdCB3ZSBjYW4gZG8gdGhpbmdzIGxpa2UgZHJvcCBhIGZyYWcgYW5kIG1haW50YWluIGFuIGFjY3VyYXRlCiAgKiB0cnVlc2l6ZSBmb3IgdGhlIHNrYi4KICAqLwotc3RhdGljIHZvaWQgZm0xMGtfcHVsbF90YWlsKHN0cnVjdCBmbTEwa19yaW5nICpyeF9yaW5nLAotCQkJICAgIHVuaW9uIGZtMTBrX3J4X2Rlc2MgKnJ4X2Rlc2MsCi0JCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIGZtMTBrX3B1bGxfdGFpbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXTsKIAl1bnNpZ25lZCBjaGFyICp2YTsKQEAgLTU3Niw3ICs1ODIsNyBAQAogCiAJLyogcGxhY2UgaGVhZGVyIGluIGxpbmVhciBwb3J0aW9uIG9mIGJ1ZmZlciAqLwogCWlmIChza2JfaXNfbm9ubGluZWFyKHNrYikpCi0JCWZtMTBrX3B1bGxfdGFpbChyeF9yaW5nLCByeF9kZXNjLCBza2IpOworCQlmbTEwa19wdWxsX3RhaWwoc2tiKTsKIAogCS8qIGlmIGV0aF9za2JfcGFkIHJldHVybnMgYW4gZXJyb3IgdGhlIHNrYiB3YXMgZnJlZWQgKi8KIAlpZiAoZXRoX3NrYl9wYWQoc2tiKSkKQEAgLTcxMSwxMCArNzE3LDYgQEAKIAlpZiAobnZncmVfaGRyLT5mbGFncyAmIEZNMTBLX05WR1JFX1JFU0VSVkVEMF9GTEFHUykKIAkJcmV0dXJuIE5VTEw7CiAKLQkvKiB2ZXJpZnkgcHJvdG9jb2wgaXMgdHJhbnNwYXJlbnQgRXRoZXJuZXQgYnJpZGdpbmcgKi8KLQlpZiAobnZncmVfaGRyLT5wcm90byAhPSBodG9ucyhFVEhfUF9URUIpKQotCQlyZXR1cm4gTlVMTDsKLQogCS8qIHJlcG9ydCBzdGFydCBvZiBldGhlcm5ldCBoZWFkZXIgKi8KIAlpZiAobnZncmVfaGRyLT5mbGFncyAmIE5WR1JFX1ROSSkKIAkJcmV0dXJuIChzdHJ1Y3QgZXRoaGRyICopKG52Z3JlX2hkciArIDEpOwpAQCAtNzIyLDE1ICs3MjQsMTMgQEAKIAlyZXR1cm4gKHN0cnVjdCBldGhoZHIgKikoJm52Z3JlX2hkci0+dG5pKTsKIH0KIAotc3RhdGljIF9fYmUxNiBmbTEwa190eF9lbmNhcF9vZmZsb2FkKHN0cnVjdCBza19idWZmICpza2IpCitfX2JlMTYgZm0xMGtfdHhfZW5jYXBfb2ZmbG9hZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXU4IGw0X2hkciA9IDAsIGlubmVyX2w0X2hkciA9IDAsIGlubmVyX2w0X2hsZW47CiAJc3RydWN0IGV0aGhkciAqZXRoX2hkcjsKLQl1OCBsNF9oZHIgPSAwOwogCi0vKiBmbTEwayBzdXBwb3J0cyAxODQgb2N0ZXRzIG9mIG91dGVyK2lubmVyIGhlYWRlcnMuIE1pbnVzIDIwIGZvciBpbm5lciBMNC4gKi8KLSNkZWZpbmUgRk0xMEtfTUFYX0VOQ0FQX1RSQU5TUE9SVF9PRkZTRVQJMTY0Ci0JaWYgKHNrYl9pbm5lcl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLSBza2JfbWFjX2hlYWRlcihza2IpID4KLQkgICAgRk0xMEtfTUFYX0VOQ0FQX1RSQU5TUE9SVF9PRkZTRVQpCisJaWYgKHNrYi0+aW5uZXJfcHJvdG9jb2xfdHlwZSAhPSBFTkNBUF9UWVBFX0VUSEVSIHx8CisJICAgIHNrYi0+aW5uZXJfcHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfVEVCKSkKIAkJcmV0dXJuIDA7CiAKIAlzd2l0Y2ggKHZsYW5fZ2V0X3Byb3RvY29sKHNrYikpIHsKQEAgLTc2MCwxMiArNzYwLDMzIEBACiAKIAlzd2l0Y2ggKGV0aF9oZHItPmhfcHJvdG8pIHsKIAljYXNlIGh0b25zKEVUSF9QX0lQKToKKwkJaW5uZXJfbDRfaGRyID0gaW5uZXJfaXBfaGRyKHNrYiktPnByb3RvY29sOworCQlicmVhazsKIAljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgorCQlpbm5lcl9sNF9oZHIgPSBpbm5lcl9pcHY2X2hkcihza2IpLT5uZXh0aGRyOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKIAl9CiAKKwlzd2l0Y2ggKGlubmVyX2w0X2hkcikgeworCWNhc2UgSVBQUk9UT19UQ1A6CisJCWlubmVyX2w0X2hsZW4gPSBpbm5lcl90Y3BfaGRybGVuKHNrYik7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19VRFA6CisJCWlubmVyX2w0X2hsZW4gPSA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUaGUgaGFyZHdhcmUgYWxsb3dzIHR1bm5lbCBvZmZsb2FkcyBvbmx5IGlmIHRoZSBjb21iaW5lZCBpbm5lciBhbmQKKwkgKiBvdXRlciBoZWFkZXIgaXMgMTg0IGJ5dGVzIG9yIGxlc3MKKwkgKi8KKwlpZiAoc2tiX2lubmVyX3RyYW5zcG9ydF9oZWFkZXIoc2tiKSArIGlubmVyX2w0X2hsZW4gLQorCSAgICBza2JfbWFjX2hlYWRlcihza2IpID4gRk0xMEtfVFVOTkVMX0hFQURFUl9MRU5HVEgpCisJCXJldHVybiAwOworCiAJcmV0dXJuIGV0aF9oZHItPmhfcHJvdG87CiB9CiAKQEAgLTkzNCwxMCArOTU1LDEwIEBACiB7CiAJbmV0aWZfc3RvcF9zdWJxdWV1ZSh0eF9yaW5nLT5uZXRkZXYsIHR4X3JpbmctPnF1ZXVlX2luZGV4KTsKIAorCS8qIE1lbW9yeSBiYXJyaWVyIGJlZm9yZSBjaGVja2luZyBoZWFkIGFuZCB0YWlsICovCiAJc21wX21iKCk7CiAKLQkvKiBXZSBuZWVkIHRvIGNoZWNrIGFnYWluIGluIGEgY2FzZSBhbm90aGVyIENQVSBoYXMganVzdAotCSAqIG1hZGUgcm9vbSBhdmFpbGFibGUuICovCisJLyogQ2hlY2sgYWdhaW4gaW4gYSBjYXNlIGFub3RoZXIgQ1BVIGhhcyBqdXN0IG1hZGUgcm9vbSBhdmFpbGFibGUgKi8KIAlpZiAobGlrZWx5KGZtMTBrX2Rlc2NfdW51c2VkKHR4X3JpbmcpIDwgc2l6ZSkpCiAJCXJldHVybiAtRUJVU1k7CiAKQEAgLTExODIsNyArMTIwMyw2IEBACiB7CiAJLyogRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQgKi8KIAlpZiAoIXRlc3RfYml0KF9fRk0xMEtfRE9XTiwgJmludGVyZmFjZS0+c3RhdGUpKSB7Ci0JCW5ldGRldl9lcnIoaW50ZXJmYWNlLT5uZXRkZXYsICJSZXNldCBpbnRlcmZhY2VcbiIpOwogCQlpbnRlcmZhY2UtPnR4X3RpbWVvdXRfY291bnQrKzsKIAkJaW50ZXJmYWNlLT5mbGFncyB8PSBGTTEwS19GTEFHX1JFU0VUX1JFUVVFU1RFRDsKIAkJZm0xMGtfc2VydmljZV9ldmVudF9zY2hlZHVsZShpbnRlcmZhY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfbWJ4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19tYnguYwppbmRleCA5ZjU0NTdjLi4xYjI3MzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19tYnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19tYnguYwpAQCAtMSw1ICsxLDUgQEAKIC8qIEludGVsIEV0aGVybmV0IFN3aXRjaCBIb3N0IEludGVyZmFjZSBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTcyLDcgKzcyLDcgQEAKICAqICBAZmlmbzogcG9pbnRlciB0byBGSUZPCiAgKiAgQG9mZnNldDogb2Zmc2V0IHRvIGFkZCB0byBoZWFkCiAgKgotICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5kaWNpZXMgaW50byB0aGUgZmlmbyBiYXNlZCBvbiBoZWFkICsgb2Zmc2V0CisgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbmRpY2VzIGludG8gdGhlIGZpZm8gYmFzZWQgb24gaGVhZCArIG9mZnNldAogICoqLwogc3RhdGljIHUxNiBmbTEwa19maWZvX2hlYWRfb2Zmc2V0KHN0cnVjdCBmbTEwa19tYnhfZmlmbyAqZmlmbywgdTE2IG9mZnNldCkKIHsKQEAgLTg0LDcgKzg0LDcgQEAKICAqICBAZmlmbzogcG9pbnRlciB0byBGSUZPCiAgKiAgQG9mZnNldDogb2Zmc2V0IHRvIGFkZCB0byB0YWlsCiAgKgotICogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5kaWNpZXMgaW50byB0aGUgZmlmbyBiYXNlZCBvbiB0YWlsICsgb2Zmc2V0CisgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBpbmRpY2VzIGludG8gdGhlIGZpZm8gYmFzZWQgb24gdGFpbCArIG9mZnNldAogICoqLwogc3RhdGljIHUxNiBmbTEwa19maWZvX3RhaWxfb2Zmc2V0KHN0cnVjdCBmbTEwa19tYnhfZmlmbyAqZmlmbywgdTE2IG9mZnNldCkKIHsKQEAgLTEyNiw2ICsxMjYsMTggQEAKIH0KIAogLyoqCisgKiAgZm0xMGtfZmlmb19kcm9wX2FsbCAtIERyb3AgYWxsIG1lc3NhZ2VzIGluIEZJRk8KKyAqICBAZmlmbzogcG9pbnRlciB0byBGSUZPCisgKgorICogIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBoZWFkIHBvaW50ZXIgdG8gZHJvcCBhbGwgbWVzc2FnZXMgaW4gdGhlIEZJRk8sCisgKiAgYW5kIGVuc3VyZSB0aGUgRklGTyBpcyBlbXB0eS4KKyAqKi8KK3N0YXRpYyB2b2lkIGZtMTBrX2ZpZm9fZHJvcF9hbGwoc3RydWN0IGZtMTBrX21ieF9maWZvICpmaWZvKQoreworCWZpZm8tPmhlYWQgPSBmaWZvLT50YWlsOworfQorCisvKioKICAqICBmbTEwa19tYnhfaW5kZXhfbGVuIC0gQ29udmVydCBhIGhlYWQvdGFpbCBpbmRleCBpbnRvIGEgbGVuZ3RoIHZhbHVlCiAgKiAgQG1ieDogcG9pbnRlciB0byBtYWlsYm94CiAgKiAgQGhlYWQ6IGhlYWQgaW5kZXgKQEAgLTMxNSw3ICszMjcsNyBAQAogCX0gd2hpbGUgKHRvdGFsX2xlbiA8IGxlbik7CiAKIAkvKiBtZXNzYWdlIGV4dGVuZHMgb3V0IG9mIHB1c2hlZCBzZWN0aW9uLCBidXQgZml0cyBpbiBGSUZPICovCi0JaWYgKChsZW4gPCB0b3RhbF9sZW4pICYmIChtc2dfbGVuIDw9IG1ieC0+cnguc2l6ZSkpCisJaWYgKChsZW4gPCB0b3RhbF9sZW4pICYmIChtc2dfbGVuIDw9IG1ieC0+bWF4X3NpemUpKQogCQlyZXR1cm4gMDsKIAogCS8qIHJldHVybiBsZW5ndGggb2YgaW52YWxpZCBzZWN0aW9uICovCkBAIC0zMjYsOCArMzM4LDcgQEAKICAqICBmbTEwa19tYnhfd3JpdGVfY29weSAtIHB1bGxzIGRhdGEgb2ZmIG9mIFR4IEZJRk8gYW5kIHBsYWNlcyBpdCBpbiBtYm1lbQogICogIEBtYng6IHBvaW50ZXIgdG8gbWFpbGJveAogICoKLSAqICBUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSBhIHNlY2l0b24gb2YgdGhlIFJ4IEZJRk8gYW5kIGNvcHkgaXQgaW50byB0aGUKLQkJbWJ4LT50YWlsLS07CisgKiAgVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgYSBzZWN0aW9uIG9mIHRoZSBUeCBGSUZPIGFuZCBjb3B5IGl0IGludG8gdGhlCiAgKiAgbWFpbGJveCBtZW1vcnkuICBUaGUgb2Zmc2V0IGluIG1ibWVtIGlzIGJhc2VkIG9uIHRoZSBsb3dlciBiaXRzIG9mIHRoZQogICogIHRhaWwgYW5kIGxlbiBkZXRlcm1pbmVzIHRoZSBsZW5ndGggdG8gY29weS4KICAqKi8KQEAgLTQxOCw3ICs0MjksNyBAQAogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqICBAbWJ4OiBwb2ludGVyIHRvIG1haWxib3gKICAqCi0gKiAgVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgYSBzZWNpdG9uIG9mIHRoZSBtYWlsYm94IG1lbW9yeSBhbmQgY29weSBpdAorICogIFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIGEgc2VjdGlvbiBvZiB0aGUgbWFpbGJveCBtZW1vcnkgYW5kIGNvcHkgaXQKICAqICBpbnRvIHRoZSBSeCBGSUZPLiAgVGhlIG9mZnNldCBpcyBiYXNlZCBvbiB0aGUgbG93ZXIgYml0cyBvZiB0aGUKICAqICBoZWFkIGFuZCBsZW4gZGV0ZXJtaW5lcyB0aGUgbGVuZ3RoIHRvIGNvcHkuCiAgKiovCkBAIC00NjQsNyArNDc1LDcgQEAKICAqICBAdGFpbDogdGFpbCBpbmRleCBvZiBtZXNzYWdlCiAgKgogICogIFRoaXMgZnVuY3Rpb24gd2lsbCBmaXJzdCB2YWxpZGF0ZSB0aGUgdGFpbCBpbmRleCBhbmQgc2l6ZSBmb3IgdGhlCi0gKiAgaW5jb21pbmcgbWVzc2FnZS4gIEl0IHRoZW4gdXBkYXRlcyB0aGUgYWNrbm93bGVnbWVudCBudW1iZXIgYW5kCisgKiAgaW5jb21pbmcgbWVzc2FnZS4gIEl0IHRoZW4gdXBkYXRlcyB0aGUgYWNrbm93bGVkZ21lbnQgbnVtYmVyIGFuZAogICogIGNvcGllcyB0aGUgZGF0YSBpbnRvIHRoZSBGSUZPLiAgSXQgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBtZXNzYWdlcwogICogIGRlcXVldWVkIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuCiAgKiovCkBAIC03NjEsNyArNzcyLDcgQEAKIAkJZXJyID0gZm0xMGtfZmlmb19lbnF1ZXVlKCZtYngtPnR4LCBtc2cpOwogCX0KIAotCS8qIGlmIHdlIGZhaWxlZCB0cmhlYWQgdGhlIGVycm9yICovCisJLyogaWYgd2UgZmFpbGVkIHRyZWF0IHRoZSBlcnJvciAqLwogCWlmIChlcnIpIHsKIAkJbWJ4LT50aW1lb3V0ID0gMDsKIAkJbWJ4LT50eF9idXN5Kys7CkBAIC04MTUsMTAgKzgyNiwxMCBAQAogewogCXUzMiBtYm1lbSA9IG1ieC0+bWJtZW1fcmVnOwogCi0JLyogd3JpdGUgbmV3IG1zZyBoZWFkZXIgdG8gbm90aWZ5IHJlY2VwaWVudCBvZiBjaGFuZ2UgKi8KKwkvKiB3cml0ZSBuZXcgbXNnIGhlYWRlciB0byBub3RpZnkgcmVjaXBpZW50IG9mIGNoYW5nZSAqLwogCWZtMTBrX3dyaXRlX3JlZyhodywgbWJtZW0sIG1ieC0+bWJ4X2hkcik7CiAKLQkvKiB3cml0ZSBtYWlsYm94IHRvIHNlbnQgaW50ZXJydXB0ICovCisJLyogd3JpdGUgbWFpbGJveCB0byBzZW5kIGludGVycnVwdCAqLwogCWlmIChtYngtPm1ieF9sb2NrKQogCQlmbTEwa193cml0ZV9yZWcoaHcsIG1ieC0+bWJ4X3JlZywgbWJ4LT5tYnhfbG9jayk7CiAKQEAgLTEwNTIsOCArMTA2MywxMSBAQAogICogIEBtYng6IHBvaW50ZXIgdG8gbWFpbGJveAogICogIEBzaXplOiBuZXcgdmFsdWUgZm9yIG1heF9zaXplCiAgKgotICogIFRoaXMgZnVuY3Rpb24gd2lsbCB1cGRhdGUgdGhlIG1heF9zaXplIHZhbHVlIGFuZCBkcm9wIGFueSBvdXRnb2luZyBtZXNzYWdlcwotICogIGZyb20gdGhlIGhlYWQgb2YgdGhlIFR4IEZJRk8gdGhhdCBhcmUgbGFyZ2VyIHRoYW4gbWF4X3NpemUuCisgKiAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBtYXhfc2l6ZSB2YWx1ZSBhbmQgZHJvcHMgYW55IG91dGdvaW5nIG1lc3NhZ2VzCisgKiAgYXQgdGhlIGhlYWQgb2YgdGhlIFR4IEZJRk8gaWYgdGhleSBhcmUgbGFyZ2VyIHRoYW4gbWF4X3NpemUuIEl0IGRvZXMgbm90CisgKiAgZHJvcCBhbGwgbWVzc2FnZXMsIGFzIHRoaXMgaXMgdG9vIGRpZmZpY3VsdCB0byBwYXJzZSBhbmQgcmVtb3ZlIHRoZW0gZnJvbQorICogIHRoZSBGSUZPLiBJbnN0ZWFkLCByZWx5IG9uIHRoZSBjaGVja2luZyB0byBlbnN1cmUgdGhhdCBtZXNzYWdlcyBsYXJnZXIKKyAqICB0aGFuIG1heF9zaXplIGFyZW4ndCBwdXNoZWQgaW50byB0aGUgbWVtb3J5IGJ1ZmZlci4KICAqKi8KIHN0YXRpYyB2b2lkIGZtMTBrX21ieF91cGRhdGVfbWF4X3NpemUoc3RydWN0IGZtMTBrX21ieF9pbmZvICptYngsIHUxNiBzaXplKQogewpAQCAtMTI1MSw3ICsxMjY1LDcgQEAKIAkvKiB3ZSB3aWxsIG5lZWQgdG8gcHVsbCBhbGwgb2YgdGhlIGZpZWxkcyBmb3IgdmVyaWZpY2F0aW9uICovCiAJaGVhZCA9IEZNMTBLX01TR19IRFJfRklFTERfR0VUKCpoZHIsIEhFQUQpOwogCi0JLyogd2Ugb25seSBoYXZlIGxvd2VyIDEwIGJpdHMgb2YgZXJyb3IgbnVtYmVyIG9zIGFkZCB1cHBlciBiaXRzICovCisJLyogd2Ugb25seSBoYXZlIGxvd2VyIDEwIGJpdHMgb2YgZXJyb3IgbnVtYmVyIHNvIGFkZCB1cHBlciBiaXRzICovCiAJZXJyX25vID0gRk0xMEtfTVNHX0hEUl9GSUVMRF9HRVQoKmhkciwgRVJSX05PKTsKIAllcnJfbm8gfD0gfkZNMTBLX01TR19IRFJfTUFTSyhFUlJfTk8pOwogCkBAIC0xMzcxLDkgKzEzODUsMTEgQEAKIAkJdGltZW91dCAtPSBGTTEwS19NQlhfUE9MTF9ERUxBWTsKIAl9IHdoaWxlICgodGltZW91dCA+IDApICYmIChtYngtPnN0YXRlICE9IEZNMTBLX1NUQVRFX0NMT1NFRCkpOwogCi0JLyogaW4gY2FzZSB3ZSBkaWRuJ3QgY2xvc2UganVzdCBmb3JjZSB0aGUgbWFpbGJveCBpbnRvIHNodXRkb3duICovCisJLyogaW4gY2FzZSB3ZSBkaWRuJ3QgY2xvc2UsIGp1c3QgZm9yY2UgdGhlIG1haWxib3ggaW50byBzaHV0ZG93biBhbmQKKwkgKiBkcm9wIGFsbCBsZWZ0IG92ZXIgbWVzc2FnZXMgaW4gdGhlIEZJRk8uCisJICovCiAJZm0xMGtfbWJ4X2Nvbm5lY3RfcmVzZXQobWJ4KTsKLQlmbTEwa19tYnhfdXBkYXRlX21heF9zaXplKG1ieCwgMCk7CisJZm0xMGtfZmlmb19kcm9wX2FsbCgmbWJ4LT50eCk7CiAKIAlmbTEwa193cml0ZV9yZWcoaHcsIG1ieC0+bWJtZW1fcmVnLCAwKTsKIH0KQEAgLTE1NDgsNyArMTU2NCw3IEBACiAJbWJ4LT50aW1lb3V0ID0gMDsKIAltYngtPnVkZWxheSA9IEZNMTBLX01CWF9JTklUX0RFTEFZOwogCi0JLyogaW5pdGFsaXplIHRhaWwgYW5kIGhlYWQgKi8KKwkvKiBpbml0aWFsaXplIHRhaWwgYW5kIGhlYWQgKi8KIAltYngtPnRhaWwgPSAxOwogCW1ieC0+aGVhZCA9IDE7CiAKQEAgLTE2MjcsNyArMTY0Myw3IEBACiAJbWJ4LT5sb2NhbCA9IEZNMTBLX1NNX01CWF9WRVJTSU9OOwogCW1ieC0+cmVtb3RlID0gMDsKIAotCS8qIGluaXRhbGl6ZSB0YWlsIGFuZCBoZWFkICovCisJLyogaW5pdGlhbGl6ZSB0YWlsIGFuZCBoZWFkICovCiAJbWJ4LT50YWlsID0gMTsKIAltYngtPmhlYWQgPSAxOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX25ldGRldi5jCmluZGV4IGNmZGU4YmEuLjJmNGY0MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX25ldGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX25ldGRldi5jCkBAIC0xLDUgKzEsNSBAQAogLyogSW50ZWwgRXRoZXJuZXQgU3dpdGNoIEhvc3QgSW50ZXJmYWNlIERyaXZlcgotICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE1IEludGVsIENvcnBvcmF0aW9uLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMzU2LDcgKzM1Niw3IEBACiAgKiBmbTEwa19yZXF1ZXN0X2dsb3J0X3JhbmdlIC0gUmVxdWVzdCBHTE9SVHMgZm9yIHVzZSBpbiBjb25maWd1cmluZyBydWxlcwogICogQGludGVyZmFjZTogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIHJhbmdlIG9mIGdsb3J0cyBmb3IgdGhpcyBpbnRlZmFjZSB0byB1c2UuCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIHJhbmdlIG9mIGdsb3J0cyBmb3IgdGhpcyBpbnRlcmZhY2UgdG8gdXNlLgogICoqLwogc3RhdGljIHZvaWQgZm0xMGtfcmVxdWVzdF9nbG9ydF9yYW5nZShzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZSkKIHsKQEAgLTc3MCwxOCArNzcwLDE4IEBACiAJaWYgKGh3LT5tYWMudmxhbl9vdmVycmlkZSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKLQkvKiBpZiBkZWZhdWx0IFZMQU4gaXMgYWxyZWFkeSBwcmVzZW50IGRvIG5vdGhpbmcgKi8KLQlpZiAodmlkID09IGh3LT5tYWMuZGVmYXVsdF92aWQpCi0JCXJldHVybiAtRUJVU1k7Ci0KIAkvKiB1cGRhdGUgYWN0aXZlX3ZsYW5zIGJpdG1hc2sgKi8KIAlzZXRfYml0KHZpZCwgaW50ZXJmYWNlLT5hY3RpdmVfdmxhbnMpOwogCWlmICghc2V0KQogCQljbGVhcl9iaXQodmlkLCBpbnRlcmZhY2UtPmFjdGl2ZV92bGFucyk7CiAKKwkvKiBpZiBkZWZhdWx0IFZMQU4gaXMgYWxyZWFkeSBwcmVzZW50IGRvIG5vdGhpbmcgKi8KKwlpZiAodmlkID09IGh3LT5tYWMuZGVmYXVsdF92aWQpCisJCXJldHVybiAwOworCiAJZm0xMGtfbWJ4X2xvY2soaW50ZXJmYWNlKTsKIAotCS8qIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIFZMQU4gaWYgbm90IGluIHByb21pc2NvdXMgbW9kZSAqLworCS8qIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIFZMQU4gaWYgbm90IGluIHByb21pc2N1b3VzIG1vZGUgKi8KIAlpZiAoIShuZXRkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpKSB7CiAJCWVyciA9IGh3LT5tYWMub3BzLnVwZGF0ZV92bGFuKGh3LCB2aWQsIDAsIHNldCk7CiAJCWlmIChlcnIpCkBAIC05NzAsMTQgKzk3MCw3IEBACiAKIAlmbTEwa19tYnhfbG9jayhpbnRlcmZhY2UpOwogCi0JLyogc3luY3Jvbml6ZSBhbGwgb2YgdGhlIGFkZHJlc3NlcyAqLwotCWlmICh4Y2FzdF9tb2RlICE9IEZNMTBLX1hDQVNUX01PREVfUFJPTUlTQykgewotCQlfX2Rldl91Y19zeW5jKGRldiwgZm0xMGtfdWNfc3luYywgZm0xMGtfdWNfdW5zeW5jKTsKLQkJaWYgKHhjYXN0X21vZGUgIT0gRk0xMEtfWENBU1RfTU9ERV9BTExNVUxUSSkKLQkJCV9fZGV2X21jX3N5bmMoZGV2LCBmbTEwa19tY19zeW5jLCBmbTEwa19tY191bnN5bmMpOwotCX0KLQotCS8qIGlmIHdlIGFyZW4ndCBjaGFuZ2luZyBtb2RlcyB0aGVyZSBpcyBub3RoaW5nIHRvIGRvICovCisJLyogdXBkYXRlIHhjYXN0IG1vZGUgZmlyc3QsIGJ1dCBvbmx5IGlmIGl0IGNoYW5nZWQgKi8KIAlpZiAoaW50ZXJmYWNlLT54Y2FzdF9tb2RlICE9IHhjYXN0X21vZGUpIHsKIAkJLyogdXBkYXRlIFZMQU4gdGFibGUgKi8KIAkJaWYgKHhjYXN0X21vZGUgPT0gRk0xMEtfWENBU1RfTU9ERV9QUk9NSVNDKQpAQCAtOTkyLDYgKzk4NSwxMyBAQAogCQlpbnRlcmZhY2UtPnhjYXN0X21vZGUgPSB4Y2FzdF9tb2RlOwogCX0KIAorCS8qIHN5bmNocm9uaXplIGFsbCBvZiB0aGUgYWRkcmVzc2VzICovCisJaWYgKHhjYXN0X21vZGUgIT0gRk0xMEtfWENBU1RfTU9ERV9QUk9NSVNDKSB7CisJCV9fZGV2X3VjX3N5bmMoZGV2LCBmbTEwa191Y19zeW5jLCBmbTEwa191Y191bnN5bmMpOworCQlpZiAoeGNhc3RfbW9kZSAhPSBGTTEwS19YQ0FTVF9NT0RFX0FMTE1VTFRJKQorCQkJX19kZXZfbWNfc3luYyhkZXYsIGZtMTBrX21jX3N5bmMsIGZtMTBrX21jX3Vuc3luYyk7CisJfQorCiAJZm0xMGtfbWJ4X3VubG9jayhpbnRlcmZhY2UpOwogfQogCkBAIC0xMDUxLDE2ICsxMDUxLDE2IEBACiAJCQkJCSAgIHZpZCwgdHJ1ZSwgMCk7CiAJfQogCi0JLyogc3luY3Jvbml6ZSBhbGwgb2YgdGhlIGFkZHJlc3NlcyAqLworCS8qIHVwZGF0ZSB4Y2FzdCBtb2RlIGJlZm9yZSBzeW5jcm9uaXppbmcgYWRkcmVzc2VzICovCisJaHctPm1hYy5vcHMudXBkYXRlX3hjYXN0X21vZGUoaHcsIGdsb3J0LCB4Y2FzdF9tb2RlKTsKKworCS8qIHN5bmNocm9uaXplIGFsbCBvZiB0aGUgYWRkcmVzc2VzICovCiAJaWYgKHhjYXN0X21vZGUgIT0gRk0xMEtfWENBU1RfTU9ERV9QUk9NSVNDKSB7CiAJCV9fZGV2X3VjX3N5bmMobmV0ZGV2LCBmbTEwa191Y19zeW5jLCBmbTEwa191Y191bnN5bmMpOwogCQlpZiAoeGNhc3RfbW9kZSAhPSBGTTEwS19YQ0FTVF9NT0RFX0FMTE1VTFRJKQogCQkJX19kZXZfbWNfc3luYyhuZXRkZXYsIGZtMTBrX21jX3N5bmMsIGZtMTBrX21jX3Vuc3luYyk7CiAJfQogCi0JLyogdXBkYXRlIHhjYXN0IG1vZGUgKi8KLQlody0+bWFjLm9wcy51cGRhdGVfeGNhc3RfbW9kZShodywgZ2xvcnQsIHhjYXN0X21vZGUpOwotCiAJZm0xMGtfbWJ4X3VubG9jayhpbnRlcmZhY2UpOwogCiAJLyogcmVjb3JkIHVwZGF0ZWQgeGNhc3QgbW9kZSBzdGF0ZSAqLwpAQCAtMTEyNiw3ICsxMTI2LDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW50ZXJmYWNlLT5udW1fdHhfcXVldWVzOyBpKyspIHsKLQkJcmluZyA9IEFDQ0VTU19PTkNFKGludGVyZmFjZS0+cnhfcmluZ1tpXSk7CisJCXJpbmcgPSBBQ0NFU1NfT05DRShpbnRlcmZhY2UtPnR4X3JpbmdbaV0pOwogCiAJCWlmICghcmluZykKIAkJCWNvbnRpbnVlOwpAQCAtMTM1MCw2ICsxMzUwLDE2IEBACiAJfQogfQogCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgZm0xMGtfZmVhdHVyZXNfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCit7CisJaWYgKCFza2ItPmVuY2Fwc3VsYXRpb24gfHwgZm0xMGtfdHhfZW5jYXBfb2ZmbG9hZChza2IpKQorCQlyZXR1cm4gZmVhdHVyZXM7CisKKwlyZXR1cm4gZmVhdHVyZXMgJiB+KE5FVElGX0ZfQUxMX0NTVU0gfCBORVRJRl9GX0dTT19NQVNLKTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBmbTEwa19uZXRkZXZfb3BzID0gewogCS5uZG9fb3BlbgkJPSBmbTEwa19vcGVuLAogCS5uZG9fc3RvcAkJPSBmbTEwa19jbG9zZSwKQEAgLTEzNzIsNiArMTM4MiwxMCBAQAogCS5uZG9fZG9faW9jdGwJCT0gZm0xMGtfaW9jdGwsCiAJLm5kb19kZndkX2FkZF9zdGF0aW9uCT0gZm0xMGtfZGZ3ZF9hZGRfc3RhdGlvbiwKIAkubmRvX2Rmd2RfZGVsX3N0YXRpb24JPSBmbTEwa19kZndkX2RlbF9zdGF0aW9uLAorI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJLm5kb19wb2xsX2NvbnRyb2xsZXIJPSBmbTEwa19uZXRwb2xsLAorI2VuZGlmCisJLm5kb19mZWF0dXJlc19jaGVjawk9IGZtMTBrX2ZlYXR1cmVzX2NoZWNrLAogfTsKIAogI2RlZmluZSBERUZBVUxUX0RFQlVHX0xFVkVMX1NISUZUIDMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3BjaS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfcGNpLmMKaW5kZXggNGY1ODkyYy4uZGY5ZmRhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfcGNpLmMKQEAgLTEsNSArMSw1IEBACiAvKiBJbnRlbCBFdGhlcm5ldCBTd2l0Y2ggSG9zdCBJbnRlcmZhY2UgRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC05NCw3ICs5NCw3IEBACiB7CiAJaWYgKCF0ZXN0X2JpdChfX0ZNMTBLX1NFUlZJQ0VfRElTQUJMRSwgJmludGVyZmFjZS0+c3RhdGUpICYmCiAJICAgICF0ZXN0X2FuZF9zZXRfYml0KF9fRk0xMEtfU0VSVklDRV9TQ0hFRCwgJmludGVyZmFjZS0+c3RhdGUpKQotCQlzY2hlZHVsZV93b3JrKCZpbnRlcmZhY2UtPnNlcnZpY2VfdGFzayk7CisJCXF1ZXVlX3dvcmsoZm0xMGtfd29ya3F1ZXVlLCAmaW50ZXJmYWNlLT5zZXJ2aWNlX3Rhc2spOwogfQogCiBzdGF0aWMgdm9pZCBmbTEwa19zZXJ2aWNlX2V2ZW50X2NvbXBsZXRlKHN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlKQpAQCAtMTkxLDcgKzE5MSw2IEBACiAJaW50ZXJmYWNlLT5mbGFncyAmPSB+Rk0xMEtfRkxBR19SRVNFVF9SRVFVRVNURUQ7CiAKIAluZXRkZXZfZXJyKGludGVyZmFjZS0+bmV0ZGV2LCAiUmVzZXQgaW50ZXJmYWNlXG4iKTsKLQlpbnRlcmZhY2UtPnR4X3RpbWVvdXRfY291bnQrKzsKIAogCWZtMTBrX3JlaW5pdChpbnRlcmZhY2UpOwogfQpAQCAtMzU3LDExICszNTYsMTAgQEAKIAluZXRfc3RhdHMtPnJ4X3BhY2tldHMgPSBwa3RzOwogCWludGVyZmFjZS0+YWxsb2NfZmFpbGVkID0gYWxsb2NfZmFpbGVkOwogCWludGVyZmFjZS0+cnhfY3N1bV9lcnJvcnMgPSByeF9jc3VtX2Vycm9yczsKLQlpbnRlcmZhY2UtPnJ4X2Vycm9ycyA9IHJ4X2Vycm9yczsKIAogCWh3LT5tYWMub3BzLnVwZGF0ZV9od19zdGF0cyhodywgJmludGVyZmFjZS0+c3RhdHMpOwogCi0JZm9yIChpID0gMDsgaSA8IEZNMTBLX01BWF9RVUVVRVNfUEY7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBody0+bWFjLm1heF9xdWV1ZXM7IGkrKykgewogCQlzdHJ1Y3QgZm0xMGtfaHdfc3RhdHNfcSAqcSA9ICZpbnRlcmZhY2UtPnN0YXRzLnFbaV07CiAKIAkJdHhfYnl0ZXNfbmljICs9IHEtPnR4X2J5dGVzLmNvdW50OwpAQCAtMzc4LDcgKzM3Niw3IEBACiAJaW50ZXJmYWNlLT5yeF9kcm9wc19uaWMgPSByeF9kcm9wc19uaWM7CiAKIAkvKiBGaWxsIG91dCB0aGUgT1Mgc3RhdGlzdGljcyBzdHJ1Y3R1cmUgKi8KLQluZXRfc3RhdHMtPnJ4X2Vycm9ycyA9IGludGVyZmFjZS0+c3RhdHMueGVjLmNvdW50OworCW5ldF9zdGF0cy0+cnhfZXJyb3JzID0gcnhfZXJyb3JzOwogCW5ldF9zdGF0cy0+cnhfZHJvcHBlZCA9IGludGVyZmFjZS0+c3RhdHMubm9kZXNjX2Ryb3AuY291bnQ7CiB9CiAKQEAgLTY0OCw3ICs2NDYsNyBAQAogCS8qIENvbmZpZ3VyZSB0aGUgUnggYnVmZmVyIHNpemUgZm9yIG9uZSBidWZmIHdpdGhvdXQgc3BsaXQgKi8KIAlzcnJjdGwgfD0gRk0xMEtfUlhfQlVGU1ogPj4gRk0xMEtfU1JSQ1RMX0JTSVpFUEtUX1NISUZUOwogCi0JLyogQ29uZmlndXJlIHRoZSBSeCByaW5nIHRvIHN1cHJlc3MgbG9vcGJhY2sgcGFja2V0cyAqLworCS8qIENvbmZpZ3VyZSB0aGUgUnggcmluZyB0byBzdXBwcmVzcyBsb29wYmFjayBwYWNrZXRzICovCiAJc3JyY3RsIHw9IEZNMTBLX1NSUkNUTF9MT09QQkFDS19TVVBQUkVTUzsKIAlmbTEwa193cml0ZV9yZWcoaHcsIEZNMTBLX1NSUkNUTChyZWdfaWR4KSwgc3JyY3RsKTsKIApAQCAtODA4LDcgKzgwNiw3IEBACiAJfQogfQogCi1zdGF0aWMgaXJxcmV0dXJuX3QgZm0xMGtfbXNpeF9jbGVhbl9yaW5ncyhpbnQgaXJxLCB2b2lkICpkYXRhKQorc3RhdGljIGlycXJldHVybl90IGZtMTBrX21zaXhfY2xlYW5fcmluZ3MoaW50IF9fYWx3YXlzX3VudXNlZCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGZtMTBrX3FfdmVjdG9yICpxX3ZlY3RvciA9IGRhdGE7CiAKQEAgLTgxOCw3ICs4MTYsNyBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGlycXJldHVybl90IGZtMTBrX21zaXhfbWJ4X3ZmKGludCBpcnEsIHZvaWQgKmRhdGEpCitzdGF0aWMgaXJxcmV0dXJuX3QgZm0xMGtfbXNpeF9tYnhfdmYoaW50IF9fYWx3YXlzX3VudXNlZCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UgPSBkYXRhOwogCXN0cnVjdCBmbTEwa19odyAqaHcgPSAmaW50ZXJmYWNlLT5odzsKQEAgLTg0MCw2ICs4MzgsMjggQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorLyoqCisgKiAgZm0xMGtfbmV0cG9sbCAtIEEgUG9sbGluZyAnaW50ZXJydXB0JyBoYW5kbGVyCisgKiAgQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICoKKyAqICBUaGlzIGlzIHVzZWQgYnkgbmV0Y29uc29sZSB0byBzZW5kIHNrYnMgd2l0aG91dCBoYXZpbmcgdG8gcmUtZW5hYmxlCisgKiAgaW50ZXJydXB0cy4gSXQncyBub3QgY2FsbGVkIHdoaWxlIHRoZSBub3JtYWwgaW50ZXJydXB0IHJvdXRpbmUgaXMgZXhlY3V0aW5nLgorICoqLwordm9pZCBmbTEwa19uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2UgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBpOworCisJLyogaWYgaW50ZXJmYWNlIGlzIGRvd24gZG8gbm90aGluZyAqLworCWlmICh0ZXN0X2JpdChfX0ZNMTBLX0RPV04sICZpbnRlcmZhY2UtPnN0YXRlKSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IGludGVyZmFjZS0+bnVtX3FfdmVjdG9yczsgaSsrKQorCQlmbTEwa19tc2l4X2NsZWFuX3JpbmdzKDAsIGludGVyZmFjZS0+cV92ZWN0b3JbaV0pOworfQorCisjZW5kaWYKICNkZWZpbmUgRk0xMEtfRVJSX01TRyh0eXBlKSBjYXNlICh0eXBlKTogZXJyb3IgPSAjdHlwZTsgYnJlYWsKIHN0YXRpYyB2b2lkIGZtMTBrX3ByaW50X2ZhdWx0KHN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlLCBpbnQgdHlwZSwKIAkJCSAgICAgIHN0cnVjdCBmbTEwa19mYXVsdCAqZmF1bHQpCkBAIC05NjQsNyArOTg0LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpcnFyZXR1cm5fdCBmbTEwa19tc2l4X21ieF9wZihpbnQgaXJxLCB2b2lkICpkYXRhKQorc3RhdGljIGlycXJldHVybl90IGZtMTBrX21zaXhfbWJ4X3BmKGludCBfX2Fsd2F5c191bnVzZWQgaXJxLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlID0gZGF0YTsKIAlzdHJ1Y3QgZm0xMGtfaHcgKmh3ID0gJmludGVyZmFjZS0+aHc7CkBAIC05ODYsNiArMTAwNiw3IEBACiAJLyogc2VydmljZSBtYWlsYm94ZXMgKi8KIAlpZiAoZm0xMGtfbWJ4X3RyeWxvY2soaW50ZXJmYWNlKSkgewogCQltYngtPm9wcy5wcm9jZXNzKGh3LCBtYngpOworCQkvKiBoYW5kbGUgVkZMUkUgZXZlbnRzICovCiAJCWZtMTBrX2lvdl9ldmVudChpbnRlcmZhY2UpOwogCQlmbTEwa19tYnhfdW5sb2NrKGludGVyZmFjZSk7CiAJfQpAQCAtMTAwMiw2ICsxMDIzLDggQEAKIAogCS8qIHdlIHNob3VsZCB2YWxpZGF0ZSBob3N0IHN0YXRlIGFmdGVyIGludGVycnVwdCBldmVudCAqLwogCWh3LT5tYWMuZ2V0X2hvc3Rfc3RhdGUgPSAxOworCisJLyogdmFsaWRhdGUgaG9zdCBzdGF0ZSwgYW5kIGhhbmRsZSBWRiBtYWlsYm94ZXMgaW4gdGhlIHNlcnZpY2UgdGFzayAqLwogCWZtMTBrX3NlcnZpY2VfZXZlbnRfc2NoZWR1bGUoaW50ZXJmYWNlKTsKIAogCS8qIHJlLWVuYWJsZSBtYWlsYm94IGludGVycnVwdCBhbmQgaW5kaWNhdGUgMjB1cyBkZWxheSAqLwpAQCAtMTA2OSw3ICsxMDkyLDcgQEAKIH0KIAogc3RhdGljIHMzMiBmbTEwa18xNTg4X21zZ192ZihzdHJ1Y3QgZm0xMGtfaHcgKmh3LCB1MzIgKipyZXN1bHRzLAotCQkJICAgICBzdHJ1Y3QgZm0xMGtfbWJ4X2luZm8gKm1ieCkKKwkJCSAgICAgc3RydWN0IGZtMTBrX21ieF9pbmZvIF9fYWx3YXlzX3VudXNlZCAqbWJ4KQogewogCXN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlOwogCXU2NCB0aW1lc3RhbXA7CkBAIC0xMDg5LDcgKzExMTIsNyBAQAogCiAvKiBnZW5lcmljIGVycm9yIGhhbmRsZXIgZm9yIG1haWxib3ggaXNzdWVzICovCiBzdGF0aWMgczMyIGZtMTBrX21ieF9lcnJvcihzdHJ1Y3QgZm0xMGtfaHcgKmh3LCB1MzIgKipyZXN1bHRzLAotCQkJICAgc3RydWN0IGZtMTBrX21ieF9pbmZvICptYngpCisJCQkgICBzdHJ1Y3QgZm0xMGtfbWJ4X2luZm8gX19hbHdheXNfdW51c2VkICptYngpCiB7CiAJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2U7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CkBAIC0xMTY1LDcgKzExODgsNyBAQAogfQogCiBzdGF0aWMgczMyIGZtMTBrX3VwZGF0ZV9wdmlkKHN0cnVjdCBmbTEwa19odyAqaHcsIHUzMiAqKnJlc3VsdHMsCi0JCQkgICAgIHN0cnVjdCBmbTEwa19tYnhfaW5mbyAqbWJ4KQorCQkJICAgICBzdHJ1Y3QgZm0xMGtfbWJ4X2luZm8gX19hbHdheXNfdW51c2VkICptYngpCiB7CiAJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2U7CiAJdTE2IGdsb3J0LCBwdmlkOwpAQCAtMTIwNiw3ICsxMjI5LDcgQEAKIH0KIAogc3RhdGljIHMzMiBmbTEwa18xNTg4X21zZ19wZihzdHJ1Y3QgZm0xMGtfaHcgKmh3LCB1MzIgKipyZXN1bHRzLAotCQkJICAgICBzdHJ1Y3QgZm0xMGtfbWJ4X2luZm8gKm1ieCkKKwkJCSAgICAgc3RydWN0IGZtMTBrX21ieF9pbmZvIF9fYWx3YXlzX3VudXNlZCAqbWJ4KQogewogCXN0cnVjdCBmbTEwa19zd2FwaV8xNTg4X3RpbWVzdGFtcCB0aW1lc3RhbXA7CiAJc3RydWN0IGZtMTBrX2lvdl9kYXRhICppb3ZfZGF0YTsKQEAgLTE0ODgsNyArMTUxMSw3IEBACiAJLyogZW5hYmxlIHRyYW5zbWl0cyAqLwogCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoaW50ZXJmYWNlLT5uZXRkZXYpOwogCi0JLyoga2ljayBvZmYgdGhlIHNlcnZpY2UgdGltZXIgKi8KKwkvKiBraWNrIG9mZiB0aGUgc2VydmljZSB0aW1lciBub3cgKi8KIAlody0+bWFjLmdldF9ob3N0X3N0YXRlID0gMTsKIAltb2RfdGltZXIoJmludGVyZmFjZS0+c2VydmljZV90aW1lciwgamlmZmllcyk7CiB9CkBAIC0xNTI4LDggKzE1NTEsNiBAQAogCS8qIGRpc2FibGUgcG9sbGluZyByb3V0aW5lcyAqLwogCWZtMTBrX25hcGlfZGlzYWJsZV9hbGwoaW50ZXJmYWNlKTsKIAotCWRlbF90aW1lcl9zeW5jKCZpbnRlcmZhY2UtPnNlcnZpY2VfdGltZXIpOwotCiAJLyogY2FwdHVyZSBzdGF0cyBvbmUgbGFzdCB0aW1lIGJlZm9yZSBzdG9wcGluZyBpbnRlcmZhY2UgKi8KIAlmbTEwa191cGRhdGVfc3RhdHMoaW50ZXJmYWNlKTsKIApAQCAtMTY1NSw2ICsxNjc2LDkgQEAKIAkJICAgICh1bnNpZ25lZCBsb25nKWludGVyZmFjZSk7CiAJSU5JVF9XT1JLKCZpbnRlcmZhY2UtPnNlcnZpY2VfdGFzaywgZm0xMGtfc2VydmljZV90YXNrKTsKIAorCS8qIGtpY2sgb2ZmIHNlcnZpY2UgdGltZXIgbm93LCBldmVuIHdoZW4gaW50ZXJmYWNlIGlzIGRvd24gKi8KKwltb2RfdGltZXIoJmludGVyZmFjZS0+c2VydmljZV90aW1lciwgKEhaICogMikgKyBqaWZmaWVzKTsKKwogCS8qIEludGl0aWFsaXplIHRpbWVzdGFtcCBkYXRhICovCiAJZm0xMGtfdHNfaW5pdChpbnRlcmZhY2UpOwogCkBAIC0xODcxLDYgKzE4OTUsOCBAQAogCXN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBpbnRlcmZhY2UtPm5ldGRldjsKIAorCWRlbF90aW1lcl9zeW5jKCZpbnRlcmZhY2UtPnNlcnZpY2VfdGltZXIpOworCiAJc2V0X2JpdChfX0ZNMTBLX1NFUlZJQ0VfRElTQUJMRSwgJmludGVyZmFjZS0+c3RhdGUpOwogCWNhbmNlbF93b3JrX3N5bmMoJmludGVyZmFjZS0+c2VydmljZV90YXNrKTsKIApAQCAtMTk4NCw3ICsyMDEwLDggQEAKICAqIGEgc2xlZXAgc3RhdGUuICBUaGUgZm0xMGsgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCB3YWtlIG9uIGxhbiBzbyB0aGUKICAqIGRyaXZlciBzaW1wbHkgbmVlZHMgdG8gc2h1dCBkb3duIHRoZSBkZXZpY2Ugc28gaXQgaXMgaW4gYSBsb3cgcG93ZXIgc3RhdGUuCiAgKiovCi1zdGF0aWMgaW50IGZtMTBrX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgZm0xMGtfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCSBwbV9tZXNzYWdlX3QgX19hbHdheXNfdW51c2VkIHN0YXRlKQogewogCXN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBpbnRlcmZhY2UtPm5ldGRldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3BmLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa19wZi5jCmluZGV4IDdlNDcxMTkuLjg5MWUyMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3BmLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfcGYuYwpAQCAtMjM0LDggKzIzNCw3IEBACiAJdmlkID0gKHZpZCA8PCAxNykgPj4gMTc7CiAKIAkvKiB2ZXJpZnkgdGhlIHJlc2VydmVkIDAgZmllbGRzIGFyZSAwICovCi0JaWYgKGxlbiA+PSBGTTEwS19WTEFOX1RBQkxFX1ZJRF9NQVggfHwKLQkgICAgdmlkID49IEZNMTBLX1ZMQU5fVEFCTEVfVklEX01BWCkKKwlpZiAobGVuID49IEZNMTBLX1ZMQU5fVEFCTEVfVklEX01BWCB8fCB2aWQgPj0gRk0xMEtfVkxBTl9UQUJMRV9WSURfTUFYKQogCQlyZXR1cm4gRk0xMEtfRVJSX1BBUkFNOwogCiAJLyogTG9vcCB0aHJvdWdoIHRoZSB0YWJsZSB1cGRhdGluZyBhbGwgcmVxdWlyZWQgVkxBTnMgKi8KQEAgLTMxMiw3ICszMTEsNyBAQAogfQogCiAvKioKLSAqICBmbTEwa191cGRhdGVfdWNfYWRkcl9wZiAtIFVwZGF0ZSBkZXZpY2UgdW5pY2FzdCBhZGRyZXNzcworICogIGZtMTBrX3VwZGF0ZV94Y19hZGRyX3BmIC0gVXBkYXRlIGRldmljZSBhZGRyZXNzZXMKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBnbG9ydDogYmFzZSByZXNvdXJjZSB0YWcgZm9yIHRoaXMgcmVxdWVzdAogICogIEBtYWM6IE1BQyBhZGRyZXNzIHRvIGFkZC9yZW1vdmUgZnJvbSB0YWJsZQpAQCAtMzMwLDYgKzMyOSw5IEBACiAJc3RydWN0IGZtMTBrX21hY191cGRhdGUgbWFjX3VwZGF0ZTsKIAl1MzIgbXNnWzVdOwogCisJLyogY2xlYXIgc2V0IGJpdCBmcm9tIFZMQU4gSUQgKi8KKwl2aWQgJj0gfkZNMTBLX1ZMQU5fQ0xFQVI7CisKIAkvKiBpZiBnbG9ydCBvciB2bGFuIGFyZSBub3QgdmFsaWQgcmV0dXJuIGVycm9yICovCiAJaWYgKCFmbTEwa19nbG9ydF92YWxpZF9wZihodywgZ2xvcnQpIHx8IHZpZCA+PSBGTTEwS19WTEFOX1RBQkxFX1ZJRF9NQVgpCiAJCXJldHVybiBGTTEwS19FUlJfUEFSQU07CkBAIC0zNTYsNyArMzU4LDcgQEAKIH0KIAogLyoqCi0gKiAgZm0xMGtfdXBkYXRlX3VjX2FkZHJfcGYgLSBVcGRhdGUgZGV2aWNlIHVuaWNhc3QgYWRkcmVzc3MKKyAqICBmbTEwa191cGRhdGVfdWNfYWRkcl9wZiAtIFVwZGF0ZSBkZXZpY2UgdW5pY2FzdCBhZGRyZXNzZXMKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBnbG9ydDogYmFzZSByZXNvdXJjZSB0YWcgZm9yIHRoaXMgcmVxdWVzdAogICogIEBtYWM6IE1BQyBhZGRyZXNzIHRvIGFkZC9yZW1vdmUgZnJvbSB0YWJsZQpAQCAtNDU0LDcgKzQ1Niw3IEBACiAJCQlicmVhazsKIAl9CiAKLQkvKiBhbHdheXMgcmVzZXQgVkZJVFIyWzBdIHRvIHBvaW50IHRvIGxhc3QgZW5hYmxlZCBQRiB2ZWN0b3IqLworCS8qIGFsd2F5cyByZXNldCBWRklUUjJbMF0gdG8gcG9pbnQgdG8gbGFzdCBlbmFibGVkIFBGIHZlY3RvciAqLwogCWZtMTBrX3dyaXRlX3JlZyhodywgRk0xMEtfSVRSMihGTTEwS19JVFJfUkVHX0NPVU5UX1BGKSwgaSk7CiAKIAkvKiByZXNldCBJVFIyWzBdIHRvIHBvaW50IHRvIGxhc3QgZW5hYmxlZCBQRiB2ZWN0b3IgKi8KQEAgLTY3Nyw3ICs2NzksOCBAQAogCS8qIGxvb3AgdGhyb3VnaCB1bmFsbG9jYXRlZCByaW5ncyBhc3NpZ25pbmcgdGhlbSBiYWNrIHRvIFBGICovCiAJZm9yIChpID0gRk0xMEtfTUFYX1FVRVVFU19QRjsgaSA8IHZmX3FfaWR4OyBpKyspIHsKIAkJZm0xMGtfd3JpdGVfcmVnKGh3LCBGTTEwS19UWERDVEwoaSksIDApOwotCQlmbTEwa193cml0ZV9yZWcoaHcsIEZNMTBLX1RYUUNUTChpKSwgRk0xMEtfVFhRQ1RMX1BGIHwgdmlkKTsKKwkJZm0xMGtfd3JpdGVfcmVnKGh3LCBGTTEwS19UWFFDVEwoaSksIEZNMTBLX1RYUUNUTF9QRiB8CisJCQkJRk0xMEtfVFhRQ1RMX1VOTElNSVRFRF9CVyB8IHZpZCk7CiAJCWZtMTBrX3dyaXRlX3JlZyhodywgRk0xMEtfUlhRQ1RMKGkpLCBGTTEwS19SWFFDVExfUEYpOwogCX0KIApAQCAtODEyLDcgKzgxNSw3IEBACiAJaWYgKHZmX2lkeCA+PSBody0+aW92Lm51bV92ZnMpCiAJCXJldHVybiBGTTEwS19FUlJfUEFSQU07CiAKLQkvKiBkZXRlcm1pbmUgdmVjdG9yIG9mZnNldCBhbmQgY291bnQqLworCS8qIGRldGVybWluZSB2ZWN0b3Igb2Zmc2V0IGFuZCBjb3VudCAqLwogCXZmX3ZfaWR4ID0gZm0xMGtfdmZfdmVjdG9yX2luZGV4KGh3LCB2Zl9pZHgpOwogCXZmX3ZfbGltaXQgPSB2Zl92X2lkeCArIGZtMTBrX3ZlY3RvcnNfcGVyX3Bvb2woaHcpOwogCkBAIC05NTEsNyArOTU0LDcgQEAKIAlpZiAodmZfaW5mby0+bWJ4Lm9wcy5kaXNjb25uZWN0KQogCQl2Zl9pbmZvLT5tYngub3BzLmRpc2Nvbm5lY3QoaHcsICZ2Zl9pbmZvLT5tYngpOwogCi0JLyogZGV0ZXJtaW5lIHZlY3RvciBvZmZzZXQgYW5kIGNvdW50Ki8KKwkvKiBkZXRlcm1pbmUgdmVjdG9yIG9mZnNldCBhbmQgY291bnQgKi8KIAl2Zl92X2lkeCA9IGZtMTBrX3ZmX3ZlY3Rvcl9pbmRleChodywgdmZfaWR4KTsKIAl2Zl92X2xpbWl0ID0gdmZfdl9pZHggKyBmbTEwa192ZWN0b3JzX3Blcl9wb29sKGh3KTsKIApAQCAtMTAzNSw3ICsxMDM4LDcgQEAKIAkJCSgodTMyKXZmX2luZm8tPm1hY1syXSk7CiAJfQogCi0JLyogbWFwIHF1ZXVlIHBhaXJzIGJhY2sgdG8gVkYgZnJvbSBsYXN0IHRvIGZpcnN0Ki8KKwkvKiBtYXAgcXVldWUgcGFpcnMgYmFjayB0byBWRiBmcm9tIGxhc3QgdG8gZmlyc3QgKi8KIAlmb3IgKGkgPSBxdWV1ZXNfcGVyX3Bvb2w7IGktLTspIHsKIAkJZm0xMGtfd3JpdGVfcmVnKGh3LCBGTTEwS19UREJBTCh2Zl9xX2lkeCArIGkpLCB0ZGJhbCk7CiAJCWZtMTBrX3dyaXRlX3JlZyhodywgRk0xMEtfVERCQUgodmZfcV9pZHggKyBpKSwgdGRiYWgpOwpAQCAtMTE0MSw3ICsxMTQ0LDcgQEAKICAqCiAgKiAgVGhpcyBmdW5jdGlvbiBpcyBhIGRlZmF1bHQgaGFuZGxlciBmb3IgTVNJLVggcmVxdWVzdHMgZnJvbSB0aGUgVkYuICBUaGUKICAqICBhc3N1bXB0aW9uIGlzIHRoYXQgaW4gdGhpcyBjYXNlIGl0IGlzIGFjY2VwdGFibGUgdG8ganVzdCBkaXJlY3RseQotICogIGhhbmQgb2ZmIHRoZSBtZXNzYWdlIGZvcm0gdGhlIFZGIHRvIHRoZSB1bmRlcmx5aW5nIHNoYXJlZCBjb2RlLgorICogIGhhbmQgb2ZmIHRoZSBtZXNzYWdlIGZyb20gdGhlIFZGIHRvIHRoZSB1bmRlcmx5aW5nIHNoYXJlZCBjb2RlLgogICoqLwogczMyIGZtMTBrX2lvdl9tc2dfbXNpeF9wZihzdHJ1Y3QgZm0xMGtfaHcgKmh3LCB1MzIgKipyZXN1bHRzLAogCQkJICBzdHJ1Y3QgZm0xMGtfbWJ4X2luZm8gKm1ieCkKQEAgLTExNjAsNyArMTE2Myw3IEBACiAgKgogICogIFRoaXMgZnVuY3Rpb24gaXMgYSBkZWZhdWx0IGhhbmRsZXIgZm9yIE1BQy9WTEFOIHJlcXVlc3RzIGZyb20gdGhlIFZGLgogICogIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgaW4gdGhpcyBjYXNlIGl0IGlzIGFjY2VwdGFibGUgdG8ganVzdCBkaXJlY3RseQotICogIGhhbmQgb2ZmIHRoZSBtZXNzYWdlIGZvcm0gdGhlIFZGIHRvIHRoZSB1bmRlcmx5aW5nIHNoYXJlZCBjb2RlLgorICogIGhhbmQgb2ZmIHRoZSBtZXNzYWdlIGZyb20gdGhlIFZGIHRvIHRoZSB1bmRlcmx5aW5nIHNoYXJlZCBjb2RlLgogICoqLwogczMyIGZtMTBrX2lvdl9tc2dfbWFjX3ZsYW5fcGYoc3RydWN0IGZtMTBrX2h3ICpodywgdTMyICoqcmVzdWx0cywKIAkJCSAgICAgIHN0cnVjdCBmbTEwa19tYnhfaW5mbyAqbWJ4KQpAQCAtMTI1MCw4ICsxMjUzLDggQEAKIAkJfQogCiAJCS8qIG5vdGlmeSBzd2l0Y2ggb2YgcmVxdWVzdCBmb3IgbmV3IG11bHRpY2FzdCBhZGRyZXNzICovCi0JCWVyciA9IGh3LT5tYWMub3BzLnVwZGF0ZV9tY19hZGRyKGh3LCB2Zl9pbmZvLT5nbG9ydCwgbWFjLAotCQkJCQkJICEodmxhbiAmIEZNMTBLX1ZMQU5fQ0xFQVIpLCAwKTsKKwkJZXJyID0gaHctPm1hYy5vcHMudXBkYXRlX21jX2FkZHIoaHcsIHZmX2luZm8tPmdsb3J0LCBtYWMsIHZsYW4sCisJCQkJCQkgISh2bGFuICYgRk0xMEtfVkxBTl9DTEVBUikpOwogCX0KIAogCXJldHVybiBlcnI7CkBAIC0xNDA0LDcgKzE0MDcsNyBAQAogCQkJCQkJICAgICZzdGF0cy0+dmxhbl9kcm9wKTsKIAkJbG9vcGJhY2tfZHJvcCA9IGZtMTBrX3JlYWRfaHdfc3RhdHNfMzJiKGh3LAogCQkJCQkJCUZNMTBLX1NUQVRTX0xPT1BCQUNLX0RST1AsCi0JCQkJCQkgICAgICZzdGF0cy0+bG9vcGJhY2tfZHJvcCk7CisJCQkJCQkJJnN0YXRzLT5sb29wYmFja19kcm9wKTsKIAkJbm9kZXNjX2Ryb3AgPSBmbTEwa19yZWFkX2h3X3N0YXRzXzMyYihodywKIAkJCQkJCSAgICAgIEZNMTBLX1NUQVRTX05PREVTQ19EUk9QLAogCQkJCQkJICAgICAgJnN0YXRzLT5ub2Rlc2NfZHJvcCk7CkBAIC0xNTczLDcgKzE1NzYsNyBAQAogCXMzMiByZXRfdmFsID0gMDsKIAl1MzIgZG1hX2N0cmwyOwogCi0JLyogdmVyaWZ5IHRoZSBzd2l0Y2ggaXMgcmVhZHkgZm9yIGludGVycmFjdGlvbiAqLworCS8qIHZlcmlmeSB0aGUgc3dpdGNoIGlzIHJlYWR5IGZvciBpbnRlcmFjdGlvbiAqLwogCWRtYV9jdHJsMiA9IGZtMTBrX3JlYWRfcmVnKGh3LCBGTTEwS19ETUFfQ1RSTDIpOwogCWlmICghKGRtYV9jdHJsMiAmIEZNMTBLX0RNQV9DVFJMMl9TV0lUQ0hfUkVBRFkpKQogCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfcHRwLmMKaW5kZXggZDk2NjA0NC4uOTA0MzYzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfcHRwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfcHRwLmMKQEAgLTEsNSArMSw1IEBACiAvKiBJbnRlbCBFdGhlcm5ldCBTd2l0Y2ggSG9zdCBJbnRlcmZhY2UgRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0yODUsNyArMjg1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmbTEwa19wdHBfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgc3RydWN0IHRpbWVzcGVjICp0cykKK3N0YXRpYyBpbnQgZm0xMGtfcHRwX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAlzdHJ1Y3QgZm0xMGtfaW50ZmMgKmludGVyZmFjZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjk3LDE3ICsyOTcsMTcgQEAKIAlub3cgPSBmbTEwa19zeXN0aW1lX3JlYWQoaW50ZXJmYWNlKSArIGludGVyZmFjZS0+cHRwX2FkanVzdDsKIAlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZpbnRlcmZhY2UtPnN5c3RpbWVfbG9jaywgZmxhZ3MpOwogCi0JKnRzID0gbnNfdG9fdGltZXNwZWMobm93KTsKKwkqdHMgPSBuc190b190aW1lc3BlYzY0KG5vdyk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBmbTEwa19wdHBfc2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCSAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cykKKwkJCSAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXN0cnVjdCBmbTEwa19pbnRmYyAqaW50ZXJmYWNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTY0IG5zID0gdGltZXNwZWNfdG9fbnModHMpOworCXU2NCBucyA9IHRpbWVzcGVjNjRfdG9fbnModHMpOwogCiAJaW50ZXJmYWNlID0gY29udGFpbmVyX29mKHB0cCwgc3RydWN0IGZtMTBrX2ludGZjLCBwdHBfY2Fwcyk7CiAKQEAgLTMxOSw3ICszMTksOCBAQAogfQogCiBzdGF0aWMgaW50IGZtMTBrX3B0cF9lbmFibGUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCi0JCQkgICAgc3RydWN0IHB0cF9jbG9ja19yZXF1ZXN0ICpycSwgaW50IG9uKQorCQkJICAgIHN0cnVjdCBwdHBfY2xvY2tfcmVxdWVzdCAqcnEsCisJCQkgICAgaW50IF9fYWx3YXlzX3VudXNlZCBvbikKIHsKIAlzdHJ1Y3QgcHRwX2Nsb2NrX3RpbWUgKnQgPSAmcnEtPnBlcm91dC5wZXJpb2Q7CiAJc3RydWN0IGZtMTBrX2ludGZjICppbnRlcmZhY2U7CkBAIC00MTksOCArNDIwLDggQEAKIAlwdHBfY2Fwcy0+bWF4X2Fkagk9IDk3NjU2MjsKIAlwdHBfY2Fwcy0+YWRqZnJlcQk9IGZtMTBrX3B0cF9hZGpmcmVxOwogCXB0cF9jYXBzLT5hZGp0aW1lCT0gZm0xMGtfcHRwX2FkanRpbWU7Ci0JcHRwX2NhcHMtPmdldHRpbWUJPSBmbTEwa19wdHBfZ2V0dGltZTsKLQlwdHBfY2Fwcy0+c2V0dGltZQk9IGZtMTBrX3B0cF9zZXR0aW1lOworCXB0cF9jYXBzLT5nZXR0aW1lNjQJPSBmbTEwa19wdHBfZ2V0dGltZTsKKwlwdHBfY2Fwcy0+c2V0dGltZTY0CT0gZm0xMGtfcHRwX3NldHRpbWU7CiAKIAkvKiBwcm92aWRlIHBpbnMgaWYgQkFSNCBpcyBhY2Nlc3NpYmxlICovCiAJaWYgKGludGVyZmFjZS0+c3dfYWRkcikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfdGx2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa190bHYuYwppbmRleCBmZDBhMDVmLi45YjI5ZDdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa190bHYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa190bHYuYwpAQCAtNzEwLDcgKzcxMCw3IEBACiAvKioKICAqICBmbTEwa190bHZfbXNnX3Rlc3QgLSBWYWxpZGF0ZSBhbGwgcmVzdWx0cyBvbiB0ZXN0IG1lc3NhZ2UgcmVjZWl2ZQogICogIEBodzogUG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKLSAqICBAcmVzdWx0czogUG9pbnRlciBhcnJheSB0byBhdHRyaWJ1dGVzIGluIHRoZSBtZXNhZ2UKKyAqICBAcmVzdWx0czogUG9pbnRlciBhcnJheSB0byBhdHRyaWJ1dGVzIGluIHRoZSBtZXNzYWdlCiAgKiAgQG1ieDogUG9pbnRlciB0byBtYWlsYm94IGluZm9ybWF0aW9uIHN0cnVjdHVyZQogICoKICAqICBUaGlzIGZ1bmN0aW9uIGRvZXMgYSBjaGVjayB0byB2ZXJpZnkgYWxsIGF0dHJpYnV0ZXMgbWF0Y2ggd2hhdCB0aGUgdGVzdApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfdHlwZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfdHlwZS5oCmluZGV4IDdjNmQ5ZDUuLjRhZjk2NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3R5cGUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa190eXBlLmgKQEAgLTM1Niw2ICszNTYsOSBAQAogI2RlZmluZSBGTTEwS19RVUVVRV9ESVNBQkxFX1RJTUVPVVQJCTEwMAogI2RlZmluZSBGTTEwS19SRVNFVF9USU1FT1VUCQkJMTUwCiAKKy8qIE1heGltdW0gc3VwcG9ydGVkIGNvbWJpbmVkIGlubmVyIGFuZCBvdXRlciBoZWFkZXIgbGVuZ3RoIGZvciBlbmNhcHN1bGF0aW9uICovCisjZGVmaW5lIEZNMTBLX1RVTk5FTF9IRUFERVJfTEVOR1RICTE4NAorCiAvKiBWRiByZWdpc3RlcnMgKi8KICNkZWZpbmUgRk0xMEtfVkZDVFJMCQkweDAwMDAwCiAjZGVmaW5lIEZNMTBLX1ZGQ1RSTF9SU1QJCQkweDAwMDAwMDA4CkBAIC01OTMsNyArNTk2LDcgQEAKIAl1MTYJCQlzd192aWQ7CQkvKiBTd2l0Y2ggQVBJIGFzc2lnbmVkIFZMQU4gKi8KIAl1MTYJCQlwZl92aWQ7CQkvKiBQRiBhc3NpZ25lZCBEZWZhdWx0IFZMQU4gKi8KIAl1OAkJCW1hY1tFVEhfQUxFTl07CS8qIFBGIERlZmF1bHQgTUFDIGFkZHJlc3MgKi8KLQl1OAkJCXZzaTsJCS8qIFZTSSBpZGVuZmlmaWVyICovCisJdTgJCQl2c2k7CQkvKiBWU0kgaWRlbnRpZmllciAqLwogCXU4CQkJdmZfaWR4OwkJLyogd2hpY2ggVkYgdGhpcyBpcyAqLwogCXU4CQkJdmZfZmxhZ3M7CS8qIGZsYWdzIGluZGljYXRpbmcgd2hhdCBtb2RlcwogCQkJCQkJICogYXJlIHN1cHBvcnRlZCBmb3IgdGhlIHBvcnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3ZmLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9mbTEway9mbTEwa192Zi5jCmluZGV4IGYwYWEwZjkuLjk0ZjBmNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2ZtMTBrL2ZtMTBrX3ZmLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZm0xMGsvZm0xMGtfdmYuYwpAQCAtMSw1ICsxLDUgQEAKIC8qIEludGVsIEV0aGVybmV0IFN3aXRjaCBIb3N0IEludGVyZmFjZSBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTM3LDcgKzM3LDcgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JLyogSWYgcGVybWVuYW50IGFkZHJlc3MgaXMgc2V0IHRoZW4gd2UgbmVlZCB0byByZXN0b3JlIGl0ICovCisJLyogSWYgcGVybWFuZW50IGFkZHJlc3MgaXMgc2V0IHRoZW4gd2UgbmVlZCB0byByZXN0b3JlIGl0ICovCiAJaWYgKGlzX3ZhbGlkX2V0aGVyX2FkZHIocGVybV9hZGRyKSkgewogCQliYWwgPSAoKCh1MzIpcGVybV9hZGRyWzNdKSA8PCAyNCkgfAogCQkgICAgICAoKCh1MzIpcGVybV9hZGRyWzRdKSA8PCAxNikgfApAQCAtNjUsNyArNjUsNyBAQAogICogIGZtMTBrX3Jlc2V0X2h3X3ZmIC0gVkYgaGFyZHdhcmUgcmVzZXQKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCiAgKgotICogIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgaGFyZGFyZSB0byBhIHN0YXRlIHNpbWlsYXIgdG8gdGhlCisgKiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBoYXJkd2FyZSB0byBhIHN0YXRlIHNpbWlsYXIgdG8gdGhlCiAgKiAgb25lIGl0IGlzIGluIGFmdGVyIGp1c3QgYmVpbmcgaW5pdGlhbGl6ZWQuCiAgKiovCiBzdGF0aWMgczMyIGZtMTBrX3Jlc2V0X2h3X3ZmKHN0cnVjdCBmbTEwa19odyAqaHcpCkBAIC0xMjQsNiArMTI0LDEwIEBACiAJLyogcmVjb3JkIG1heGltdW0gcXVldWUgY291bnQgKi8KIAlody0+bWFjLm1heF9xdWV1ZXMgPSBpOwogCisJLyogZmV0Y2ggZGVmYXVsdCBWTEFOICovCisJaHctPm1hYy5kZWZhdWx0X3ZpZCA9IChmbTEwa19yZWFkX3JlZyhodywgRk0xMEtfVFhRQ1RMKDApKSAmCisJCQkgICAgICAgRk0xMEtfVFhRQ1RMX1ZJRF9NQVNLKSA+PiBGTTEwS19UWFFDVExfVklEX1NISUZUOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1Miw3ICsyNTYsNyBAQAogfQogCiAvKioKLSAqICBmbTEwa191cGRhdGVfdWNfYWRkcl92ZiAtIFVwZGF0ZSBkZXZpY2UgdW5pY2FzdCBhZGRyZXNzCisgKiAgZm0xMGtfdXBkYXRlX3VjX2FkZHJfdmYgLSBVcGRhdGUgZGV2aWNlIHVuaWNhc3QgYWRkcmVzc2VzCiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqICBAZ2xvcnQ6IHVudXNlZAogICogIEBtYWM6IE1BQyBhZGRyZXNzIHRvIGFkZC9yZW1vdmUgZnJvbSB0YWJsZQpAQCAtMjgyLDcgKzI4Niw3IEBACiAJICAgIG1lbWNtcChody0+bWFjLnBlcm1fYWRkciwgbWFjLCBFVEhfQUxFTikpCiAJCXJldHVybiBGTTEwS19FUlJfUEFSQU07CiAKLQkvKiBhZGQgYml0IHRvIG5vdGlmeSB1cyBpZiB0aGlzIGlzIGEgc2V0IG9mIGNsZWFyIG9wZXJhdGlvbiAqLworCS8qIGFkZCBiaXQgdG8gbm90aWZ5IHVzIGlmIHRoaXMgaXMgYSBzZXQgb3IgY2xlYXIgb3BlcmF0aW9uICovCiAJaWYgKCFhZGQpCiAJCXZpZCB8PSBGTTEwS19WTEFOX0NMRUFSOwogCkBAIC0yOTUsNyArMjk5LDcgQEAKIH0KIAogLyoqCi0gKiAgZm0xMGtfdXBkYXRlX21jX2FkZHJfdmYgLSBVcGRhdGUgZGV2aWNlIG11bHRpY2FzdCBhZGRyZXNzCisgKiAgZm0xMGtfdXBkYXRlX21jX2FkZHJfdmYgLSBVcGRhdGUgZGV2aWNlIG11bHRpY2FzdCBhZGRyZXNzZXMKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBnbG9ydDogdW51c2VkCiAgKiAgQG1hYzogTUFDIGFkZHJlc3MgdG8gYWRkL3JlbW92ZSBmcm9tIHRhYmxlCkBAIC0zMTksNyArMzIzLDcgQEAKIAlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKG1hYykpCiAJCXJldHVybiBGTTEwS19FUlJfUEFSQU07CiAKLQkvKiBhZGQgYml0IHRvIG5vdGlmeSB1cyBpZiB0aGlzIGlzIGEgc2V0IG9mIGNsZWFyIG9wZXJhdGlvbiAqLworCS8qIGFkZCBiaXQgdG8gbm90aWZ5IHVzIGlmIHRoaXMgaXMgYSBzZXQgb3IgY2xlYXIgb3BlcmF0aW9uICovCiAJaWYgKCFhZGQpCiAJCXZpZCB8PSBGTTEwS19WTEFOX0NMRUFSOwogCkBAIC01MTUsNyArNTE5LDcgQEAKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIGhhcmR3YXJlIHN0cnVjdHVyZQogICoKICAqICBGdW5jdGlvbiByZWFkcyB0aGUgY29udGVudCBvZiAyIHJlZ2lzdGVycywgY29tYmluZWQgdG8gcmVwcmVzZW50IGEgNjQgYml0Ci0gKiAgdmFsdWUgbWVhc3VyZWQgaW4gbmFub3NlY29kcy4gIEluIG9yZGVyIHRvIGd1YXJhbnRlZSB0aGUgdmFsdWUgaXMgYWNjdXJhdGUKKyAqICB2YWx1ZSBtZWFzdXJlZCBpbiBuYW5vc2Vjb25kcy4gIEluIG9yZGVyIHRvIGd1YXJhbnRlZSB0aGUgdmFsdWUgaXMgYWNjdXJhdGUKICAqICB3ZSBjaGVjayB0aGUgMzIgbW9zdCBzaWduaWZpY2FudCBiaXRzIGJvdGggYmVmb3JlIGFuZCBhZnRlciByZWFkaW5nIHRoZQogICogIDMyIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgdG8gdmVyaWZ5IHRoZXkgZGlkbid0IGNoYW5nZSBhcyB3ZSB3ZXJlIHJlYWRpbmcKICAqICB0aGUgcmVnaXN0ZXJzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvTWFrZWZpbGUKaW5kZXggYzQwNTgxOS4uYjQ3MjliYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICMKICMgSW50ZWwgRXRoZXJuZXQgQ29udHJvbGxlciBYTDcxMCBGYW1pbHkgTGludXggRHJpdmVyCi0jIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyMgQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE1IEludGVsIENvcnBvcmF0aW9uLgogIwogIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogIyB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGUuaAppbmRleCAyYjY1Y2RjLi4zM2MzNWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGUuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogSW50ZWwgRXRoZXJuZXQgQ29udHJvbGxlciBYTDcxMCBGYW1pbHkgTGludXggRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvYWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9tbXUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgpAQCAtNDksNiArNTAsNyBAQAogI2luY2x1ZGUgPG5ldC9pcDZfY2hlY2tzdW0uaD4KICNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0X3RzdGFtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cF9jbG9ja19rZXJuZWwuaD4KQEAgLTcwLDYgKzcyLDcgQEAKIAogI2RlZmluZSBJNDBFX01BWF9OVU1fREVTQ1JJUFRPUlMgICAgICA0MDk2CiAjZGVmaW5lIEk0MEVfTUFYX1JFR0lTVEVSICAgICAweDgwMDAwMAorI2RlZmluZSBJNDBFX01BWF9DU1JfU1BBQ0UgKDQgKiAxMDI0ICogMTAyNCAtIDY0ICogMTAyNCkKICNkZWZpbmUgSTQwRV9ERUZBVUxUX05VTV9ERVNDUklQVE9SUyAgNTEyCiAjZGVmaW5lIEk0MEVfUkVRX0RFU0NSSVBUT1JfTVVMVElQTEUgIDMyCiAjZGVmaW5lIEk0MEVfTUlOX05VTV9ERVNDUklQVE9SUyAgICAgIDY0CkBAIC05NCw2ICs5Nyw5IEBACiAjZGVmaW5lIEk0MEVfUVVFVUVfV0FJVF9SRVRSWV9MSU1JVCAgIDEwCiAjZGVmaW5lIEk0MEVfSU5UX05BTUVfU1RSX0xFTiAgICAgICAgKElGTkFNU0laICsgOSkKIAorLyogRXRodG9vbCBQcml2YXRlIEZsYWdzICovCisjZGVmaW5lIEk0MEVfUFJJVl9GTEFHU19OUEFSX0ZMQUcJKDEgPDwgMCkKKwogI2RlZmluZSBJNDBFX05WTV9WRVJTSU9OX0xPX1NISUZUICAwCiAjZGVmaW5lIEk0MEVfTlZNX1ZFUlNJT05fTE9fTUFTSyAgICgweGZmIDw8IEk0MEVfTlZNX1ZFUlNJT05fTE9fU0hJRlQpCiAjZGVmaW5lIEk0MEVfTlZNX1ZFUlNJT05fSElfU0hJRlQgIDEyCkBAIC0xNDAsNiArMTQ2LDcgQEAKIAlfX0k0MEVfQ09SRV9SRVNFVF9SRVFVRVNURUQsCiAJX19JNDBFX0dMT0JBTF9SRVNFVF9SRVFVRVNURUQsCiAJX19JNDBFX0VNUF9SRVNFVF9SRVFVRVNURUQsCisJX19JNDBFX0VNUF9SRVNFVF9JTlRSX1JFQ0VJVkVELAogCV9fSTQwRV9GSUxURVJfT1ZFUkZMT1dfUFJPTUlTQywKIAlfX0k0MEVfU1VTUEVOREVELAogCV9fSTQwRV9QVFBfVFhfSU5fUFJPR1JFU1MsCkBAIC0xNjgsNiArMTc1LDkgQEAKICNkZWZpbmUgSTQwRV9GRElSX01BWF9SQVdfUEFDS0VUX1NJWkUJNTEyCiAjZGVmaW5lIEk0MEVfRkRJUl9CVUZGRVJfRlVMTF9NQVJHSU4JMTAKICNkZWZpbmUgSTQwRV9GRElSX0JVRkZFUl9IRUFEX1JPT00JMzIKKyNkZWZpbmUgSTQwRV9GRElSX0JVRkZFUl9IRUFEX1JPT01fRk9SX0FUUiAoSTQwRV9GRElSX0JVRkZFUl9IRUFEX1JPT00gKiA0KQorCisjZGVmaW5lIEk0MEVfSEtFWV9BUlJBWV9TSVpFICgoSTQwRV9QRlFGX0hLRVlfTUFYX0lOREVYICsgMSkgKiA0KQogCiBlbnVtIGk0MGVfZmRfc3RhdF9pZHggewogCUk0MEVfRkRfU1RBVF9BVFIsCkBAIC0yMzIsMTcgKzI0MiwxNyBAQAogCWJvb2wgZmNfYXV0b25lZ19zdGF0dXM7CiAKIAl1MTYgZWVwcm9tX3ZlcnNpb247Ci0JdTE2IG51bV92bWRxX3ZzaXM7ICAgICAgICAgLyogbnVtIHZtZHEgdnNpcyB0aGlzIHBmIGhhcyBzZXQgdXAgKi8KKwl1MTYgbnVtX3ZtZHFfdnNpczsgICAgICAgICAvKiBudW0gdm1kcSB2c2lzIHRoaXMgUEYgaGFzIHNldCB1cCAqLwogCXUxNiBudW1fdm1kcV9xcHM7ICAgICAgICAgIC8qIG51bSBxdWV1ZSBwYWlycyBwZXIgdm1kcSBwb29sICovCiAJdTE2IG51bV92bWRxX21zaXg7ICAgICAgICAgLyogbnVtIHF1ZXVlIHZlY3RvcnMgcGVyIHZtZHEgcG9vbCAqLwotCXUxNiBudW1fcmVxX3ZmczsgICAgICAgICAgIC8qIG51bSB2ZnMgcmVxdWVzdGVkIGZvciB0aGlzIHZmICovCi0JdTE2IG51bV92Zl9xcHM7ICAgICAgICAgICAgLyogbnVtIHF1ZXVlIHBhaXJzIHBlciB2ZiAqLworCXUxNiBudW1fcmVxX3ZmczsgICAgICAgICAgIC8qIG51bSBWRnMgcmVxdWVzdGVkIGZvciB0aGlzIFZGICovCisJdTE2IG51bV92Zl9xcHM7ICAgICAgICAgICAgLyogbnVtIHF1ZXVlIHBhaXJzIHBlciBWRiAqLwogI2lmZGVmIEk0MEVfRkNPRQotCXUxNiBudW1fZmNvZV9xcHM7ICAgICAgICAgIC8qIG51bSBmY29lIHF1ZXVlcyB0aGlzIHBmIGhhcyBzZXQgdXAgKi8KKwl1MTYgbnVtX2Zjb2VfcXBzOyAgICAgICAgICAvKiBudW0gZmNvZSBxdWV1ZXMgdGhpcyBQRiBoYXMgc2V0IHVwICovCiAJdTE2IG51bV9mY29lX21zaXg7ICAgICAgICAgLyogbnVtIHF1ZXVlIHZlY3RvcnMgcGVyIGZjb2UgcG9vbCAqLwogI2VuZGlmIC8qIEk0MEVfRkNPRSAqLwotCXUxNiBudW1fbGFuX3FwczsgICAgICAgICAgIC8qIG51bSBsYW4gcXVldWVzIHRoaXMgcGYgaGFzIHNldCB1cCAqLwotCXUxNiBudW1fbGFuX21zaXg7ICAgICAgICAgIC8qIG51bSBxdWV1ZSB2ZWN0b3JzIGZvciB0aGUgYmFzZSBwZiB2c2kgKi8KKwl1MTYgbnVtX2xhbl9xcHM7ICAgICAgICAgICAvKiBudW0gbGFuIHF1ZXVlcyB0aGlzIFBGIGhhcyBzZXQgdXAgKi8KKwl1MTYgbnVtX2xhbl9tc2l4OyAgICAgICAgICAvKiBudW0gcXVldWUgdmVjdG9ycyBmb3IgdGhlIGJhc2UgUEYgdnNpICovCiAJaW50IHF1ZXVlc19sZWZ0OyAgICAgICAgICAgLyogcXVldWVzIGxlZnQgdW5jbGFpbWVkICovCiAJdTE2IHJzc19zaXplOyAgICAgICAgICAgICAgLyogbnVtIHF1ZXVlcyBpbiB0aGUgUlNTIGFycmF5ICovCiAJdTE2IHJzc19zaXplX21heDsgICAgICAgICAgLyogSFcgZGVmaW5lZCBtYXggUlNTIHF1ZXVlcyAqLwpAQCAtMjY5LDcgKzI3OSw3IEBACiAJZW51bSBpNDBlX2ludGVycnVwdF9wb2xpY3kgaW50X3BvbGljeTsKIAl1MTYgcnhfaXRyX2RlZmF1bHQ7CiAJdTE2IHR4X2l0cl9kZWZhdWx0OwotCXUxNiBtc2dfZW5hYmxlOworCXUzMiBtc2dfZW5hYmxlOwogCWNoYXIgaW50X25hbWVbSTQwRV9JTlRfTkFNRV9TVFJfTEVOXTsKIAl1MTYgYWRtaW5xX3dvcmtfbGltaXQ7IC8qIG51bSBvZiBhZG1pbiByZWNlaXZlIHF1ZXVlIGRlc2MgdG8gcHJvY2VzcyAqLwogCXVuc2lnbmVkIGxvbmcgc2VydmljZV90aW1lcl9wZXJpb2Q7CkBAIC0zODMsNiArMzkzLDkgQEAKIAlib29sIHB0cF90eDsKIAlib29sIHB0cF9yeDsKIAl1MTYgcnNzX3RhYmxlX3NpemU7CisJLyogVGhlc2UgYXJlIG9ubHkgdmFsaWQgaW4gTlBBUiBtb2RlcyAqLworCXUzMiBucGFyX21heF9idzsKKwl1MzIgbnBhcl9taW5fYnc7CiB9OwogCiBzdHJ1Y3QgaTQwZV9tYWNfZmlsdGVyIHsKQEAgLTQwNSw2ICs0MTgsNyBAQAogCXUxNiB1cGxpbmtfc2VpZDsKIAl1MTYgc3RhdHNfaWR4OyAgICAgICAgICAgLyogaW5kZXggb2YgVkVCIHBhcmVudCAqLwogCXU4ICBlbmFibGVkX3RjOworCXUxNiBicmlkZ2VfbW9kZTsJLyogQnJpZGdlIE1vZGUgKFZFQi9WRVBBKSAqLwogCXUxNiBmbGFnczsKIAl1MTYgYndfbGltaXQ7CiAJdTggIGJ3X21heF9xdWFudGE7CkBAIC00NjEsNiArNDc1LDkgQEAKIAl1MTYgcnhfaXRyX3NldHRpbmc7CiAJdTE2IHR4X2l0cl9zZXR0aW5nOwogCisJdTE2IHJzc190YWJsZV9zaXplOworCXUxNiByc3Nfc2l6ZTsKKwogCXUxNiBtYXhfZnJhbWU7CiAJdTE2IHJ4X2hkcl9sZW47CiAJdTE2IHJ4X2J1Zl9sZW47CkBAIC00NzgsNiArNDk1LDcgQEAKIAogCXUxNiBiYXNlX3F1ZXVlOyAgICAgIC8qIHZzaSdzIGZpcnN0IHF1ZXVlIGluIGh3IGFycmF5ICovCiAJdTE2IGFsbG9jX3F1ZXVlX3BhaXJzOyAvKiBBbGxvY2F0ZWQgVHgvUnggcXVldWVzICovCisJdTE2IHJlcV9xdWV1ZV9wYWlyczsgLyogVXNlciByZXF1ZXN0ZWQgcXVldWUgcGFpcnMgKi8KIAl1MTYgbnVtX3F1ZXVlX3BhaXJzOyAvKiBVc2VkIHR4IGFuZCByeCBwYWlycyAqLwogCXUxNiBudW1fZGVzYzsKIAllbnVtIGk0MGVfdnNpX3R5cGUgdHlwZTsgIC8qIFZTSSB0eXBlLCBlLmcuLCBMQU4sIEZDb0UsIGV0YyAqLwpAQCAtNTA0LDYgKzUyMiw5IEBACiAKIAkvKiBWU0kgc3BlY2lmaWMgaGFuZGxlcnMgKi8KIAlpcnFyZXR1cm5fdCAoKmlycV9oYW5kbGVyKShpbnQgaXJxLCB2b2lkICpkYXRhKTsKKworCS8qIGN1cnJlbnQgcnhuZmMgZGF0YSAqLworCXN0cnVjdCBldGh0b29sX3J4bmZjIHJ4bmZjOyAvKiBjdXJyZW50IHJzcyBoYXNoIG9wdHMgKi8KIH0gX19fX2NhY2hlbGluZV9pbnRlcm5vZGVhbGlnbmVkX2luX3NtcDsKIAogc3RydWN0IGk0MGVfbmV0ZGV2X3ByaXYgewpAQCAtNTQ0LDE0ICs1NjUsMTQgQEAKIAlzdGF0aWMgY2hhciBidWZbMzJdOwogCiAJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKLQkJICJmJWQuJWQgYSVkLiVkIG4lMDJ4LiUwMnggZSUwOHgiLAotCQkgaHctPmFxLmZ3X21hal92ZXIsIGh3LT5hcS5md19taW5fdmVyLAorCQkgImYlZC4lZC4lMDVkIGElZC4lZCBuJXguJTAyeCBlJXgiLAorCQkgaHctPmFxLmZ3X21hal92ZXIsIGh3LT5hcS5md19taW5fdmVyLCBody0+YXEuZndfYnVpbGQsCiAJCSBody0+YXEuYXBpX21hal92ZXIsIGh3LT5hcS5hcGlfbWluX3ZlciwKIAkJIChody0+bnZtLnZlcnNpb24gJiBJNDBFX05WTV9WRVJTSU9OX0hJX01BU0spID4+CiAJCQlJNDBFX05WTV9WRVJTSU9OX0hJX1NISUZULAogCQkgKGh3LT5udm0udmVyc2lvbiAmIEk0MEVfTlZNX1ZFUlNJT05fTE9fTUFTSykgPj4KIAkJCUk0MEVfTlZNX1ZFUlNJT05fTE9fU0hJRlQsCi0JCSBody0+bnZtLmVldHJhY2spOworCQkgKGh3LT5udm0uZWV0cmFjayAmIDB4ZmZmZmZmKSk7CiAKIAlyZXR1cm4gYnVmOwogfQpAQCAtNTkzLDcgKzYxNCw3IEBACiAKIC8qKgogICogaTQwZV9nZXRfZmRfY250X2FsbCAtIGdldCB0aGUgdG90YWwgRkQgZmlsdGVyIHNwYWNlIGF2YWlsYWJsZQotICogQHBmOiBwb2ludGVyIHRvIHRoZSBwZiBzdHJ1Y3QKKyAqIEBwZjogcG9pbnRlciB0byB0aGUgUEYgc3RydWN0CiAgKiovCiBzdGF0aWMgaW5saW5lIGludCBpNDBlX2dldF9mZF9jbnRfYWxsKHN0cnVjdCBpNDBlX3BmICpwZikKIHsKQEAgLTYwNyw2ICs2MjgsNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgaTQwZV9kcml2ZXJfdmVyc2lvbl9zdHJbXTsKIHZvaWQgaTQwZV9kb19yZXNldF9zYWZlKHN0cnVjdCBpNDBlX3BmICpwZiwgdTMyIHJlc2V0X2ZsYWdzKTsKIHZvaWQgaTQwZV9kb19yZXNldChzdHJ1Y3QgaTQwZV9wZiAqcGYsIHUzMiByZXNldF9mbGFncyk7CitzdHJ1Y3QgaTQwZV92c2kgKmk0MGVfZmluZF92c2lfZnJvbV9pZChzdHJ1Y3QgaTQwZV9wZiAqcGYsIHUxNiBpZCk7CiB2b2lkIGk0MGVfdXBkYXRlX3N0YXRzKHN0cnVjdCBpNDBlX3ZzaSAqdnNpKTsKIHZvaWQgaTQwZV91cGRhdGVfZXRoX3N0YXRzKHN0cnVjdCBpNDBlX3ZzaSAqdnNpKTsKIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqaTQwZV9nZXRfdnNpX3N0YXRzX3N0cnVjdChzdHJ1Y3QgaTQwZV92c2kgKnZzaSk7CkBAIC02MTgsOSArNjQwLDEwIEBACiBpbnQgaTQwZV9hZGRfZGVsX2ZkaXIoc3RydWN0IGk0MGVfdnNpICp2c2ksCiAJCSAgICAgIHN0cnVjdCBpNDBlX2ZkaXJfZmlsdGVyICppbnB1dCwgYm9vbCBhZGQpOwogdm9pZCBpNDBlX2ZkaXJfY2hlY2tfYW5kX3JlZW5hYmxlKHN0cnVjdCBpNDBlX3BmICpwZik7Ci1pbnQgaTQwZV9nZXRfY3VycmVudF9mZF9jb3VudChzdHJ1Y3QgaTQwZV9wZiAqcGYpOwotaW50IGk0MGVfZ2V0X2N1cl9ndWFyYW50ZWVkX2ZkX2NvdW50KHN0cnVjdCBpNDBlX3BmICpwZik7Ci1pbnQgaTQwZV9nZXRfY3VycmVudF9hdHJfY250KHN0cnVjdCBpNDBlX3BmICpwZik7Cit1MzIgaTQwZV9nZXRfY3VycmVudF9mZF9jb3VudChzdHJ1Y3QgaTQwZV9wZiAqcGYpOwordTMyIGk0MGVfZ2V0X2N1cl9ndWFyYW50ZWVkX2ZkX2NvdW50KHN0cnVjdCBpNDBlX3BmICpwZik7Cit1MzIgaTQwZV9nZXRfY3VycmVudF9hdHJfY250KHN0cnVjdCBpNDBlX3BmICpwZik7Cit1MzIgaTQwZV9nZXRfZ2xvYmFsX2ZkX2NvdW50KHN0cnVjdCBpNDBlX3BmICpwZik7CiBib29sIGk0MGVfc2V0X250dXBsZShzdHJ1Y3QgaTQwZV9wZiAqcGYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKTsKIHZvaWQgaTQwZV9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBzdHJ1Y3QgaTQwZV9tYWNfZmlsdGVyICppNDBlX2FkZF9maWx0ZXIoc3RydWN0IGk0MGVfdnNpICp2c2ksCkBAIC02ODAsNiArNzAzLDcgQEAKIGludCBpNDBlX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgX19hbHdheXNfdW51c2VkIF9fYmUxNiBwcm90bywgdTE2IHZpZCk7CiAjZW5kaWYKK2ludCBpNDBlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBpbnQgaTQwZV92c2lfb3BlbihzdHJ1Y3QgaTQwZV92c2kgKnZzaSk7CiB2b2lkIGk0MGVfdmxhbl9zdHJpcHBpbmdfZGlzYWJsZShzdHJ1Y3QgaTQwZV92c2kgKnZzaSk7CiBpbnQgaTQwZV92c2lfYWRkX3ZsYW4oc3RydWN0IGk0MGVfdnNpICp2c2ksIHMxNiB2aWQpOwpAQCAtNjkwLDcgKzcxNCw2IEBACiBzdHJ1Y3QgaTQwZV9tYWNfZmlsdGVyICppNDBlX2ZpbmRfbWFjKHN0cnVjdCBpNDBlX3ZzaSAqdnNpLCB1OCAqbWFjYWRkciwKIAkJCQkgICAgICBib29sIGlzX3ZmLCBib29sIGlzX25ldGRldik7CiAjaWZkZWYgSTQwRV9GQ09FCi1pbnQgaTQwZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogaW50IGk0MGVfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiBpbnQgaTQwZV9zZXR1cF90YyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1OCB0Yyk7CiB2b2lkIGk0MGVfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKQEAgLTcxMiw2ICs3MzUsNyBAQAogdm9pZCBpNDBlX3ZsYW5fc3RyaXBwaW5nX2VuYWJsZShzdHJ1Y3QgaTQwZV92c2kgKnZzaSk7CiAjaWZkZWYgQ09ORklHX0k0MEVfRENCCiB2b2lkIGk0MGVfZGNibmxfZmx1c2hfYXBwcyhzdHJ1Y3QgaTQwZV9wZiAqcGYsCisJCQkgICBzdHJ1Y3QgaTQwZV9kY2J4X2NvbmZpZyAqb2xkX2NmZywKIAkJCSAgIHN0cnVjdCBpNDBlX2RjYnhfY29uZmlnICpuZXdfY2ZnKTsKIHZvaWQgaTQwZV9kY2JubF9zZXRfYWxsKHN0cnVjdCBpNDBlX3ZzaSAqdnNpKTsKIHZvaWQgaTQwZV9kY2JubF9zZXR1cChzdHJ1Y3QgaTQwZV92c2kgKnZzaSk7CkBAIC03MjcsNCArNzUxLDggQEAKIGludCBpNDBlX3B0cF9nZXRfdHNfY29uZmlnKHN0cnVjdCBpNDBlX3BmICpwZiwgc3RydWN0IGlmcmVxICppZnIpOwogdm9pZCBpNDBlX3B0cF9pbml0KHN0cnVjdCBpNDBlX3BmICpwZik7CiB2b2lkIGk0MGVfcHRwX3N0b3Aoc3RydWN0IGk0MGVfcGYgKnBmKTsKK2ludCBpNDBlX2lzX3ZzaV91cGxpbmtfbW9kZV92ZWIoc3RydWN0IGk0MGVfdnNpICp2c2kpOworaTQwZV9zdGF0dXMgaTQwZV9nZXRfbnBhcl9id19zZXR0aW5nKHN0cnVjdCBpNDBlX3BmICpwZik7CitpNDBlX3N0YXR1cyBpNDBlX3NldF9ucGFyX2J3X3NldHRpbmcoc3RydWN0IGk0MGVfcGYgKnBmKTsKK2k0MGVfc3RhdHVzIGk0MGVfY29tbWl0X25wYXJfYndfc2V0dGluZyhzdHJ1Y3QgaTQwZV9wZiAqcGYpOwogI2VuZGlmIC8qIF9JNDBFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfYWRtaW5xLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfYWRtaW5xLmMKaW5kZXggNzdmNjI1NC4uM2UwZDIwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2FkbWlucS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9hZG1pbnEuYwpAQCAtNTkyLDYgKzU5Miw3IEBACiAJCXJldF9jb2RlID0gaTQwZV9hcV9nZXRfZmlybXdhcmVfdmVyc2lvbihodywKIAkJCQkJCQkmaHctPmFxLmZ3X21hal92ZXIsCiAJCQkJCQkJJmh3LT5hcS5md19taW5fdmVyLAorCQkJCQkJCSZody0+YXEuZndfYnVpbGQsCiAJCQkJCQkJJmh3LT5hcS5hcGlfbWFqX3ZlciwKIAkJCQkJCQkmaHctPmFxLmFwaV9taW5fdmVyLAogCQkJCQkJCU5VTEwpOwpAQCAtNjA1LDcgKzYwNiw4IEBACiAJCWdvdG8gaW5pdF9hZG1pbnFfZnJlZV9hcnE7CiAKIAkvKiBnZXQgdGhlIE5WTSB2ZXJzaW9uIGluZm8gKi8KLQlpNDBlX3JlYWRfbnZtX3dvcmQoaHcsIEk0MEVfU1JfTlZNX0lNQUdFX1ZFUlNJT04sICZody0+bnZtLnZlcnNpb24pOworCWk0MGVfcmVhZF9udm1fd29yZChodywgSTQwRV9TUl9OVk1fREVWX1NUQVJURVJfVkVSU0lPTiwKKwkJCSAgICZody0+bnZtLnZlcnNpb24pOwogCWk0MGVfcmVhZF9udm1fd29yZChodywgSTQwRV9TUl9OVk1fRUVUUkFDS19MTywgJmVldHJhY2tfbG8pOwogCWk0MGVfcmVhZF9udm1fd29yZChodywgSTQwRV9TUl9OVk1fRUVUUkFDS19ISSwgJmVldHJhY2tfaGkpOwogCWh3LT5udm0uZWV0cmFjayA9IChlZXRyYWNrX2hpIDw8IDE2KSB8IGVldHJhY2tfbG87CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfYWRtaW5xLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfYWRtaW5xLmgKaW5kZXggZGUxN2I2Zi4uMjhlNTE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2FkbWlucS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9hZG1pbnEuaApAQCAtOTMsNiArOTMsNyBAQAogCXUxNiBhc3FfYnVmX3NpemU7ICAgICAgICAgICAgICAgLyogc2VuZCBxdWV1ZSBidWZmZXIgc2l6ZSAqLwogCXUxNiBmd19tYWpfdmVyOyAgICAgICAgICAgICAgICAgLyogZmlybXdhcmUgbWFqb3IgdmVyc2lvbiAqLwogCXUxNiBmd19taW5fdmVyOyAgICAgICAgICAgICAgICAgLyogZmlybXdhcmUgbWlub3IgdmVyc2lvbiAqLworCXUzMiBmd19idWlsZDsgICAgICAgICAgICAgICAgICAgLyogZmlybXdhcmUgYnVpbGQgbnVtYmVyICovCiAJdTE2IGFwaV9tYWpfdmVyOyAgICAgICAgICAgICAgICAvKiBhcGkgbWFqb3IgdmVyc2lvbiAqLwogCXUxNiBhcGlfbWluX3ZlcjsgICAgICAgICAgICAgICAgLyogYXBpIG1pbm9yIHZlcnNpb24gKi8KIAlib29sIG52bV9yZWxlYXNlX29uX2RvbmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfY29tbW9uLmMKaW5kZXggNmFlYTY1ZC4uZDU5NmY2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9jb21tb24uYwpAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogSW50ZWwgRXRoZXJuZXQgQ29udHJvbGxlciBYTDcxMCBGYW1pbHkgTGludXggRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC01MSw2ICs1MSw3IEBACiAJCWNhc2UgSTQwRV9ERVZfSURfUVNGUF9COgogCQljYXNlIEk0MEVfREVWX0lEX1FTRlBfQzoKIAkJY2FzZSBJNDBFX0RFVl9JRF8xMEdfQkFTRV9UOgorCQljYXNlIEk0MEVfREVWX0lEXzIwR19LUjI6CiAJCQlody0+bWFjLnR5cGUgPSBJNDBFX01BQ19YTDcxMDsKIAkJCWJyZWFrOwogCQljYXNlIEk0MEVfREVWX0lEX1ZGOgpAQCAtODUsNDYgKzg2LDUzIEBACiB7CiAJc3RydWN0IGk0MGVfYXFfZGVzYyAqYXFfZGVzYyA9IChzdHJ1Y3QgaTQwZV9hcV9kZXNjICopZGVzYzsKIAl1MTYgbGVuID0gbGUxNl90b19jcHUoYXFfZGVzYy0+ZGF0YWxlbik7Ci0JdTggKmFxX2J1ZmZlciA9ICh1OCAqKWJ1ZmZlcjsKLQl1MzIgZGF0YVs0XTsKLQl1MzIgaSA9IDA7CisJdTggKmJ1ZiA9ICh1OCAqKWJ1ZmZlcjsKKwl1MTYgaSA9IDA7CiAKIAlpZiAoKCEobWFzayAmIGh3LT5kZWJ1Z19tYXNrKSkgfHwgKGRlc2MgPT0gTlVMTCkpCiAJCXJldHVybjsKIAogCWk0MGVfZGVidWcoaHcsIG1hc2ssCiAJCSAgICJBUSBDTUQ6IG9wY29kZSAweCUwNFgsIGZsYWdzIDB4JTA0WCwgZGF0YWxlbiAweCUwNFgsIHJldHZhbCAweCUwNFhcbiIsCi0JCSAgIGFxX2Rlc2MtPm9wY29kZSwgYXFfZGVzYy0+ZmxhZ3MsIGFxX2Rlc2MtPmRhdGFsZW4sCi0JCSAgIGFxX2Rlc2MtPnJldHZhbCk7CisJCSAgIGxlMTZfdG9fY3B1KGFxX2Rlc2MtPm9wY29kZSksCisJCSAgIGxlMTZfdG9fY3B1KGFxX2Rlc2MtPmZsYWdzKSwKKwkJICAgbGUxNl90b19jcHUoYXFfZGVzYy0+ZGF0YWxlbiksCisJCSAgIGxlMTZfdG9fY3B1KGFxX2Rlc2MtPnJldHZhbCkpOwogCWk0MGVfZGVidWcoaHcsIG1hc2ssICJcdGNvb2tpZSAoaCxsKSAweCUwOFggMHglMDhYXG4iLAotCQkgICBhcV9kZXNjLT5jb29raWVfaGlnaCwgYXFfZGVzYy0+Y29va2llX2xvdyk7CisJCSAgIGxlMzJfdG9fY3B1KGFxX2Rlc2MtPmNvb2tpZV9oaWdoKSwKKwkJICAgbGUzMl90b19jcHUoYXFfZGVzYy0+Y29va2llX2xvdykpOwogCWk0MGVfZGVidWcoaHcsIG1hc2ssICJcdHBhcmFtICgwLDEpICAweCUwOFggMHglMDhYXG4iLAotCQkgICBhcV9kZXNjLT5wYXJhbXMuaW50ZXJuYWwucGFyYW0wLAotCQkgICBhcV9kZXNjLT5wYXJhbXMuaW50ZXJuYWwucGFyYW0xKTsKKwkJICAgbGUzMl90b19jcHUoYXFfZGVzYy0+cGFyYW1zLmludGVybmFsLnBhcmFtMCksCisJCSAgIGxlMzJfdG9fY3B1KGFxX2Rlc2MtPnBhcmFtcy5pbnRlcm5hbC5wYXJhbTEpKTsKIAlpNDBlX2RlYnVnKGh3LCBtYXNrLCAiXHRhZGRyIChoLGwpICAgMHglMDhYIDB4JTA4WFxuIiwKLQkJICAgYXFfZGVzYy0+cGFyYW1zLmV4dGVybmFsLmFkZHJfaGlnaCwKLQkJICAgYXFfZGVzYy0+cGFyYW1zLmV4dGVybmFsLmFkZHJfbG93KTsKKwkJICAgbGUzMl90b19jcHUoYXFfZGVzYy0+cGFyYW1zLmV4dGVybmFsLmFkZHJfaGlnaCksCisJCSAgIGxlMzJfdG9fY3B1KGFxX2Rlc2MtPnBhcmFtcy5leHRlcm5hbC5hZGRyX2xvdykpOwogCiAJaWYgKChidWZmZXIgIT0gTlVMTCkgJiYgKGFxX2Rlc2MtPmRhdGFsZW4gIT0gMCkpIHsKLQkJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7CiAJCWk0MGVfZGVidWcoaHcsIG1hc2ssICJBUSBDTUQgQnVmZmVyOlxuIik7CiAJCWlmIChidWZfbGVuIDwgbGVuKQogCQkJbGVuID0gYnVmX2xlbjsKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlkYXRhWygoaSAlIDE2KSAvIDQpXSB8PQotCQkJCSgodTMyKWFxX2J1ZmZlcltpXSkgPDwgKDggKiAoaSAlIDQpKTsKLQkJCWlmICgoaSAlIDE2KSA9PSAxNSkgewotCQkJCWk0MGVfZGVidWcoaHcsIG1hc2ssCi0JCQkJCSAgICJcdDB4JTA0WCAgJTA4WCAlMDhYICUwOFggJTA4WFxuIiwKLQkJCQkJICAgaSAtIDE1LCBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLAotCQkJCQkgICBkYXRhWzNdKTsKLQkJCQltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKGRhdGEpKTsKLQkJCX0KKwkJLyogd3JpdGUgdGhlIGZ1bGwgMTYtYnl0ZSBjaHVua3MgKi8KKwkJZm9yIChpID0gMDsgaSA8IChsZW4gLSAxNik7IGkgKz0gMTYpCisJCQlpNDBlX2RlYnVnKGh3LCBtYXNrLAorCQkJCSAgICJcdDB4JTA0WCAgJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKwkJCQkgICBpLCBidWZbaV0sIGJ1ZltpICsgMV0sIGJ1ZltpICsgMl0sCisJCQkJICAgYnVmW2kgKyAzXSwgYnVmW2kgKyA0XSwgYnVmW2kgKyA1XSwKKwkJCQkgICBidWZbaSArIDZdLCBidWZbaSArIDddLCBidWZbaSArIDhdLAorCQkJCSAgIGJ1ZltpICsgOV0sIGJ1ZltpICsgMTBdLCBidWZbaSArIDExXSwKKwkJCQkgICBidWZbaSArIDEyXSwgYnVmW2kgKyAxM10sIGJ1ZltpICsgMTRdLAorCQkJCSAgIGJ1ZltpICsgMTVdKTsKKwkJLyogd3JpdGUgd2hhdGV2ZXIncyBsZWZ0IG92ZXIgd2l0aG91dCBvdmVycnVubmluZyB0aGUgYnVmZmVyICovCisJCWlmIChpIDwgbGVuKSB7CisJCQljaGFyIGRfYnVmWzgwXTsKKwkJCWludCBqID0gMDsKKworCQkJbWVtc2V0KGRfYnVmLCAwLCBzaXplb2YoZF9idWYpKTsKKwkJCWogKz0gc3ByaW50ZihkX2J1ZiwgIlx0MHglMDRYICIsIGkpOworCQkJd2hpbGUgKGkgPCBsZW4pCisJCQkJaiArPSBzcHJpbnRmKCZkX2J1ZltqXSwgIiAlMDJYIiwgYnVmW2krK10pOworCQkJaTQwZV9kZWJ1ZyhodywgbWFzaywgIiVzXG4iLCBkX2J1Zik7CiAJCX0KLQkJaWYgKChpICUgMTYpICE9IDApCi0JCQlpNDBlX2RlYnVnKGh3LCBtYXNrLCAiXHQweCUwNFggICUwOFggJTA4WCAlMDhYICUwOFhcbiIsCi0JCQkJICAgaSAtIChpICUgMTYpLCBkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLAotCQkJCSAgIGRhdGFbM10pOwogCX0KIH0KIApAQCAtNTM0LDcgKzU0Miw2IEBACiAJSTQwRV9QVFRfVU5VU0VEX0VOVFJZKDI1NSkKIH07CiAKLQogLyoqCiAgKiBpNDBlX2luaXRfc2hhcmVkX2NvZGUgLSBJbml0aWFsaXplIHRoZSBzaGFyZWQgY29kZQogICogQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQpAQCAtNjg1LDcgKzY5Miw3IEBACiAvKioKICAqIGk0MGVfcHJlX3R4X3F1ZXVlX2NmZyAtIHByZSB0eCBxdWV1ZSBjb25maWd1cmUKICAqIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCi0gKiBAcXVldWU6IHRhcmdldCBwZiBxdWV1ZSBpbmRleAorICogQHF1ZXVlOiB0YXJnZXQgUEYgcXVldWUgaW5kZXgKICAqIEBlbmFibGU6IHN0YXRlIGNoYW5nZSByZXF1ZXN0CiAgKgogICogSGFuZGxlcyBodyByZXF1aXJlbWVudCB0byBpbmRpY2F0ZSBpbnRlbnRpb24gdG8gZW5hYmxlCkBAIC04MjcsMTIgKzgzNCwxNSBAQAogCWNhc2UgSTQwRV9QSFlfVFlQRV8xMEdCQVNFX0NSMToKIAljYXNlIEk0MEVfUEhZX1RZUEVfNDBHQkFTRV9DUjQ6CiAJY2FzZSBJNDBFX1BIWV9UWVBFXzEwR0JBU0VfU0ZQUF9DVToKKwljYXNlIEk0MEVfUEhZX1RZUEVfNDBHQkFTRV9BT0M6CisJY2FzZSBJNDBFX1BIWV9UWVBFXzEwR0JBU0VfQU9DOgogCQltZWRpYSA9IEk0MEVfTUVESUFfVFlQRV9EQTsKIAkJYnJlYWs7CiAJY2FzZSBJNDBFX1BIWV9UWVBFXzEwMDBCQVNFX0tYOgogCWNhc2UgSTQwRV9QSFlfVFlQRV8xMEdCQVNFX0tYNDoKIAljYXNlIEk0MEVfUEhZX1RZUEVfMTBHQkFTRV9LUjoKIAljYXNlIEk0MEVfUEhZX1RZUEVfNDBHQkFTRV9LUjQ6CisJY2FzZSBJNDBFX1BIWV9UWVBFXzIwR0JBU0VfS1IyOgogCQltZWRpYSA9IEk0MEVfTUVESUFfVFlQRV9CQUNLUExBTkU7CiAJCWJyZWFrOwogCWNhc2UgSTQwRV9QSFlfVFlQRV9TR01JSToKQEAgLTg0OSw3ICs4NTksNyBAQAogfQogCiAjZGVmaW5lIEk0MEVfUEZfUkVTRVRfV0FJVF9DT1VOVF9BMAkyMDAKLSNkZWZpbmUgSTQwRV9QRl9SRVNFVF9XQUlUX0NPVU5UCTExMAorI2RlZmluZSBJNDBFX1BGX1JFU0VUX1dBSVRfQ09VTlQJMjAwCiAvKioKICAqIGk0MGVfcGZfcmVzZXQgLSBSZXNldCB0aGUgUEYKICAqIEBodzogcG9pbnRlciB0byB0aGUgaGFyZHdhcmUgc3RydWN0dXJlCkBAIC05NDcsNyArOTU3LDcgQEAKIAl1MzIgdmFsOwogCXUzMiBlb2wgPSAweDdmZjsKIAotCS8qIGdldCBudW1iZXIgb2YgaW50ZXJydXB0cywgcXVldWVzLCBhbmQgdmZzICovCisJLyogZ2V0IG51bWJlciBvZiBpbnRlcnJ1cHRzLCBxdWV1ZXMsIGFuZCBWRnMgKi8KIAl2YWwgPSByZDMyKGh3LCBJNDBFX0dMUENJX0NORjIpOwogCW51bV9wZl9pbnQgPSAodmFsICYgSTQwRV9HTFBDSV9DTkYyX01TSV9YX1BGX05fTUFTSykgPj4KIAkJICAgICBJNDBFX0dMUENJX0NORjJfTVNJX1hfUEZfTl9TSElGVDsKQEAgLTEwNzYsOCArMTA4NiwxMSBAQAogCXJldHVybiBncGlvX3ZhbDsKIH0KIAotI2RlZmluZSBJNDBFX0xFRDAgMjIKKyNkZWZpbmUgSTQwRV9DT01CSU5FRF9BQ1RJVklUWSAweEEKKyNkZWZpbmUgSTQwRV9GSUxURVJfQUNUSVZJVFkgMHhFCiAjZGVmaW5lIEk0MEVfTElOS19BQ1RJVklUWSAweEMKKyNkZWZpbmUgSTQwRV9NQUNfQUNUSVZJVFkgMHhECisjZGVmaW5lIEk0MEVfTEVEMCAyMgogCiAvKioKICAqIGk0MGVfbGVkX2dldCAtIHJldHVybiBjdXJyZW50IG9uL29mZiBtb2RlCkBAIC0xMDkwLDYgKzExMDMsNyBAQAogICoqLwogdTMyIGk0MGVfbGVkX2dldChzdHJ1Y3QgaTQwZV9odyAqaHcpCiB7CisJdTMyIGN1cnJlbnRfbW9kZSA9IDA7CiAJdTMyIG1vZGUgPSAwOwogCWludCBpOwogCkBAIC0xMTAyLDYgKzExMTYsMjAgQEAKIAkJaWYgKCFncGlvX3ZhbCkKIAkJCWNvbnRpbnVlOwogCisJCS8qIGlnbm9yZSBncGlvIExFRCBzcmMgbW9kZSBlbnRyaWVzIHJlbGF0ZWQgdG8gdGhlIGFjdGl2aXR5CisJCSAqIExFRHMKKwkJICovCisJCWN1cnJlbnRfbW9kZSA9ICgoZ3Bpb192YWwgJiBJNDBFX0dMR0VOX0dQSU9fQ1RMX0xFRF9NT0RFX01BU0spCisJCQkJPj4gSTQwRV9HTEdFTl9HUElPX0NUTF9MRURfTU9ERV9TSElGVCk7CisJCXN3aXRjaCAoY3VycmVudF9tb2RlKSB7CisJCWNhc2UgSTQwRV9DT01CSU5FRF9BQ1RJVklUWToKKwkJY2FzZSBJNDBFX0ZJTFRFUl9BQ1RJVklUWToKKwkJY2FzZSBJNDBFX01BQ19BQ1RJVklUWToKKwkJCWNvbnRpbnVlOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwogCQltb2RlID0gKGdwaW9fdmFsICYgSTQwRV9HTEdFTl9HUElPX0NUTF9MRURfTU9ERV9NQVNLKSA+PgogCQkJSTQwRV9HTEdFTl9HUElPX0NUTF9MRURfTU9ERV9TSElGVDsKIAkJYnJlYWs7CkBAIC0xMTIxLDYgKzExNDksNyBAQAogICoqLwogdm9pZCBpNDBlX2xlZF9zZXQoc3RydWN0IGk0MGVfaHcgKmh3LCB1MzIgbW9kZSwgYm9vbCBibGluaykKIHsKKwl1MzIgY3VycmVudF9tb2RlID0gMDsKIAlpbnQgaTsKIAogCWlmIChtb2RlICYgMHhmZmZmZmZmMCkKQEAgLTExMzUsNiArMTE2NCwyMCBAQAogCQlpZiAoIWdwaW9fdmFsKQogCQkJY29udGludWU7CiAKKwkJLyogaWdub3JlIGdwaW8gTEVEIHNyYyBtb2RlIGVudHJpZXMgcmVsYXRlZCB0byB0aGUgYWN0aXZpdHkKKwkJICogTEVEcworCQkgKi8KKwkJY3VycmVudF9tb2RlID0gKChncGlvX3ZhbCAmIEk0MEVfR0xHRU5fR1BJT19DVExfTEVEX01PREVfTUFTSykKKwkJCQk+PiBJNDBFX0dMR0VOX0dQSU9fQ1RMX0xFRF9NT0RFX1NISUZUKTsKKwkJc3dpdGNoIChjdXJyZW50X21vZGUpIHsKKwkJY2FzZSBJNDBFX0NPTUJJTkVEX0FDVElWSVRZOgorCQljYXNlIEk0MEVfRklMVEVSX0FDVElWSVRZOgorCQljYXNlIEk0MEVfTUFDX0FDVElWSVRZOgorCQkJY29udGludWU7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCiAJCWdwaW9fdmFsICY9IH5JNDBFX0dMR0VOX0dQSU9fQ1RMX0xFRF9NT0RFX01BU0s7CiAJCS8qIHRoaXMgJiBpcyBhIGJpdCBvZiBwYXJhbm9pYSwgYnV0IHNlcnZlcyBhcyBhIHJhbmdlIGNoZWNrICovCiAJCWdwaW9fdmFsIHw9ICgobW9kZSA8PCBJNDBFX0dMR0VOX0dQSU9fQ1RMX0xFRF9NT0RFX1NISUZUKSAmCkBAIC0xMjk4LDE0ICsxMzQxLDE0IEBACiAJCQkqYXFfZmFpbHVyZXMgfD0gSTQwRV9TRVRfRkNfQVFfRkFJTF9TRVQ7CiAJfQogCS8qIFVwZGF0ZSB0aGUgbGluayBpbmZvICovCi0Jc3RhdHVzID0gaTQwZV91cGRhdGVfbGlua19pbmZvKGh3LCB0cnVlKTsKKwlzdGF0dXMgPSBpNDBlX2FxX2dldF9saW5rX2luZm8oaHcsIHRydWUsIE5VTEwsIE5VTEwpOwogCWlmIChzdGF0dXMpIHsKIAkJLyogV2FpdCBhIGxpdHRsZSBiaXQgKG9uIDQwRyBjYXJkcyBpdCBzb21ldGltZXMgdGFrZXMgYSByZWFsbHkKIAkJICogbG9uZyB0aW1lIGZvciBsaW5rIHRvIGNvbWUgYmFjayBmcm9tIHRoZSBhdG9taWMgcmVzZXQpCiAJCSAqIGFuZCB0cnkgb25jZSBtb3JlCiAJCSAqLwogCQltc2xlZXAoMTAwMCk7Ci0JCXN0YXR1cyA9IGk0MGVfdXBkYXRlX2xpbmtfaW5mbyhodywgdHJ1ZSk7CisJCXN0YXR1cyA9IGk0MGVfYXFfZ2V0X2xpbmtfaW5mbyhodywgdHJ1ZSwgTlVMTCwgTlVMTCk7CiAJfQogCWlmIChzdGF0dXMpCiAJCSphcV9mYWlsdXJlcyB8PSBJNDBFX1NFVF9GQ19BUV9GQUlMX1VQREFURTsKQEAgLTE0NDEsNiArMTQ4NCwxMCBAQAogCWVsc2UKIAkJaHdfbGlua19pbmZvLT5sc2VfZW5hYmxlID0gZmFsc2U7CiAKKwlpZiAoKGh3LT5hcS5md19tYWpfdmVyIDwgNCB8fCAoaHctPmFxLmZ3X21hal92ZXIgPT0gNCAmJgorCSAgICAgaHctPmFxLmZ3X21pbl92ZXIgPCA0MCkpICYmIGh3X2xpbmtfaW5mby0+cGh5X3R5cGUgPT0gMHhFKQorCQlod19saW5rX2luZm8tPnBoeV90eXBlID0gSTQwRV9QSFlfVFlQRV8xMEdCQVNFX1NGUFBfQ1U7CisKIAkvKiBzYXZlIGxpbmsgc3RhdHVzIGluZm9ybWF0aW9uICovCiAJaWYgKGxpbmspCiAJCSpsaW5rID0gKmh3X2xpbmtfaW5mbzsKQEAgLTE0NTMsMzUgKzE1MDAsNiBAQAogfQogCiAvKioKLSAqIGk0MGVfdXBkYXRlX2xpbmtfaW5mbwotICogQGh3OiBwb2ludGVyIHRvIHRoZSBodyBzdHJ1Y3QKLSAqIEBlbmFibGVfbHNlOiBlbmFibGUvZGlzYWJsZSBMaW5rU3RhdHVzRXZlbnQgcmVwb3J0aW5nCi0gKgotICogUmV0dXJucyB0aGUgbGluayBzdGF0dXMgb2YgdGhlIGFkYXB0ZXIKLSAqKi8KLWk0MGVfc3RhdHVzIGk0MGVfdXBkYXRlX2xpbmtfaW5mbyhzdHJ1Y3QgaTQwZV9odyAqaHcsIGJvb2wgZW5hYmxlX2xzZSkKLXsKLQlzdHJ1Y3QgaTQwZV9hcV9nZXRfcGh5X2FiaWxpdGllc19yZXNwIGFiaWxpdGllczsKLQlpNDBlX3N0YXR1cyBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBpNDBlX2FxX2dldF9saW5rX2luZm8oaHcsIGVuYWJsZV9sc2UsIE5VTEwsIE5VTEwpOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7Ci0KLQlzdGF0dXMgPSBpNDBlX2FxX2dldF9waHlfY2FwYWJpbGl0aWVzKGh3LCBmYWxzZSwgZmFsc2UsCi0JCQkJCSAgICAgICZhYmlsaXRpZXMsIE5VTEwpOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7Ci0KLQlpZiAoYWJpbGl0aWVzLmFiaWxpdGllcyAmIEk0MEVfQVFfUEhZX0FOX0VOQUJMRUQpCi0JCWh3LT5waHkubGlua19pbmZvLmFuX2VuYWJsZWQgPSB0cnVlOwotCWVsc2UKLQkJaHctPnBoeS5saW5rX2luZm8uYW5fZW5hYmxlZCA9IGZhbHNlOwotCi0JcmV0dXJuIHN0YXR1czsKLX0KLQotLyoqCiAgKiBpNDBlX2FxX3NldF9waHlfaW50X21hc2sKICAqIEBodzogcG9pbnRlciB0byB0aGUgaHcgc3RydWN0CiAgKiBAbWFzazogaW50ZXJydXB0IG1hc2sgdG8gYmUgc2V0CkBAIC0xNzYwLDYgKzE3NzgsNyBAQAogICogQGh3OiBwb2ludGVyIHRvIHRoZSBodyBzdHJ1Y3QKICAqIEBmd19tYWpvcl92ZXJzaW9uOiBmaXJtd2FyZSBtYWpvciB2ZXJzaW9uCiAgKiBAZndfbWlub3JfdmVyc2lvbjogZmlybXdhcmUgbWlub3IgdmVyc2lvbgorICogQGZ3X2J1aWxkOiBmaXJtd2FyZSBidWlsZCBudW1iZXIKICAqIEBhcGlfbWFqb3JfdmVyc2lvbjogbWFqb3IgcXVldWUgdmVyc2lvbgogICogQGFwaV9taW5vcl92ZXJzaW9uOiBtaW5vciBxdWV1ZSB2ZXJzaW9uCiAgKiBAY21kX2RldGFpbHM6IHBvaW50ZXIgdG8gY29tbWFuZCBkZXRhaWxzIHN0cnVjdHVyZSBvciBOVUxMCkBAIC0xNzY4LDYgKzE3ODcsNyBAQAogICoqLwogaTQwZV9zdGF0dXMgaTQwZV9hcV9nZXRfZmlybXdhcmVfdmVyc2lvbihzdHJ1Y3QgaTQwZV9odyAqaHcsCiAJCQkJdTE2ICpmd19tYWpvcl92ZXJzaW9uLCB1MTYgKmZ3X21pbm9yX3ZlcnNpb24sCisJCQkJdTMyICpmd19idWlsZCwKIAkJCQl1MTYgKmFwaV9tYWpvcl92ZXJzaW9uLCB1MTYgKmFwaV9taW5vcl92ZXJzaW9uLAogCQkJCXN0cnVjdCBpNDBlX2FzcV9jbWRfZGV0YWlscyAqY21kX2RldGFpbHMpCiB7CkBAIC0xNzgxLDEzICsxODAxLDE1IEBACiAJc3RhdHVzID0gaTQwZV9hc3Ffc2VuZF9jb21tYW5kKGh3LCAmZGVzYywgTlVMTCwgMCwgY21kX2RldGFpbHMpOwogCiAJaWYgKCFzdGF0dXMpIHsKLQkJaWYgKGZ3X21ham9yX3ZlcnNpb24gIT0gTlVMTCkKKwkJaWYgKGZ3X21ham9yX3ZlcnNpb24pCiAJCQkqZndfbWFqb3JfdmVyc2lvbiA9IGxlMTZfdG9fY3B1KHJlc3AtPmZ3X21ham9yKTsKLQkJaWYgKGZ3X21pbm9yX3ZlcnNpb24gIT0gTlVMTCkKKwkJaWYgKGZ3X21pbm9yX3ZlcnNpb24pCiAJCQkqZndfbWlub3JfdmVyc2lvbiA9IGxlMTZfdG9fY3B1KHJlc3AtPmZ3X21pbm9yKTsKLQkJaWYgKGFwaV9tYWpvcl92ZXJzaW9uICE9IE5VTEwpCisJCWlmIChmd19idWlsZCkKKwkJCSpmd19idWlsZCA9IGxlMzJfdG9fY3B1KHJlc3AtPmZ3X2J1aWxkKTsKKwkJaWYgKGFwaV9tYWpvcl92ZXJzaW9uKQogCQkJKmFwaV9tYWpvcl92ZXJzaW9uID0gbGUxNl90b19jcHUocmVzcC0+YXBpX21ham9yKTsKLQkJaWYgKGFwaV9taW5vcl92ZXJzaW9uICE9IE5VTEwpCisJCWlmIChhcGlfbWlub3JfdmVyc2lvbikKIAkJCSphcGlfbWlub3JfdmVyc2lvbiA9IGxlMTZfdG9fY3B1KHJlc3AtPmFwaV9taW5vcik7CiAJfQogCkBAIC0xODE3LDcgKzE4MzksNyBAQAogCiAJaTQwZV9maWxsX2RlZmF1bHRfZGlyZWN0X2NtZF9kZXNjKCZkZXNjLCBpNDBlX2FxY19vcGNfZHJpdmVyX3ZlcnNpb24pOwogCi0JZGVzYy5mbGFncyB8PSBjcHVfdG9fbGUxNihJNDBFX0FRX0ZMQUdfU0kpOworCWRlc2MuZmxhZ3MgfD0gY3B1X3RvX2xlMTYoSTQwRV9BUV9GTEFHX0JVRiB8IEk0MEVfQVFfRkxBR19SRCk7CiAJY21kLT5kcml2ZXJfbWFqb3JfdmVyID0gZHYtPm1ham9yX3ZlcnNpb247CiAJY21kLT5kcml2ZXJfbWlub3JfdmVyID0gZHYtPm1pbm9yX3ZlcnNpb247CiAJY21kLT5kcml2ZXJfYnVpbGRfdmVyID0gZHYtPmJ1aWxkX3ZlcnNpb247CkBAIC0xOTk3LDcgKzIwMTksNyBAQAogCWlmIChjb3VudCA9PSAwIHx8ICFtdl9saXN0IHx8ICFodykKIAkJcmV0dXJuIEk0MEVfRVJSX1BBUkFNOwogCi0JYnVmX3NpemUgPSBjb3VudCAqIHNpemVvZihzdHJ1Y3QgaTQwZV9hcWNfYWRkX21hY3ZsYW5fZWxlbWVudF9kYXRhKTsKKwlidWZfc2l6ZSA9IGNvdW50ICogc2l6ZW9mKCptdl9saXN0KTsKIAogCS8qIHByZXAgdGhlIHJlc3Qgb2YgdGhlIHJlcXVlc3QgKi8KIAlpNDBlX2ZpbGxfZGVmYXVsdF9kaXJlY3RfY21kX2Rlc2MoJmRlc2MsIGk0MGVfYXFjX29wY19hZGRfbWFjdmxhbik7CkBAIC0yMDM5LDcgKzIwNjEsNyBAQAogCWlmIChjb3VudCA9PSAwIHx8ICFtdl9saXN0IHx8ICFodykKIAkJcmV0dXJuIEk0MEVfRVJSX1BBUkFNOwogCi0JYnVmX3NpemUgPSBjb3VudCAqIHNpemVvZihzdHJ1Y3QgaTQwZV9hcWNfcmVtb3ZlX21hY3ZsYW5fZWxlbWVudF9kYXRhKTsKKwlidWZfc2l6ZSA9IGNvdW50ICogc2l6ZW9mKCptdl9saXN0KTsKIAogCS8qIHByZXAgdGhlIHJlc3Qgb2YgdGhlIHJlcXVlc3QgKi8KIAlpNDBlX2ZpbGxfZGVmYXVsdF9kaXJlY3RfY21kX2Rlc2MoJmRlc2MsIGk0MGVfYXFjX29wY19yZW1vdmVfbWFjdmxhbik7CkBAIC0yMDYxLDcgKzIwODMsNyBAQAogLyoqCiAgKiBpNDBlX2FxX3NlbmRfbXNnX3RvX3ZmCiAgKiBAaHc6IHBvaW50ZXIgdG8gdGhlIGhhcmR3YXJlIHN0cnVjdHVyZQotICogQHZmaWQ6IHZmIGlkIHRvIHNlbmQgbXNnCisgKiBAdmZpZDogVkYgaWQgdG8gc2VuZCBtc2cKICAqIEB2X29wY29kZTogb3Bjb2RlcyBmb3IgVkYtUEYgY29tbXVuaWNhdGlvbgogICogQHZfcmV0dmFsOiByZXR1cm4gZXJyb3IgY29kZQogICogQG1zZzogcG9pbnRlciB0byB0aGUgbXNnIGJ1ZmZlcgpAQCAtMjEwNiw3ICsyMTI4LDcgQEAKICAqIFJlYWQgdGhlIHJlZ2lzdGVyIHVzaW5nIHRoZSBhZG1pbiBxdWV1ZSBjb21tYW5kcwogICoqLwogaTQwZV9zdGF0dXMgaTQwZV9hcV9kZWJ1Z19yZWFkX3JlZ2lzdGVyKHN0cnVjdCBpNDBlX2h3ICpodywKLQkJCQl1MzIgIHJlZ19hZGRyLCB1NjQgKnJlZ192YWwsCisJCQkJdTMyIHJlZ19hZGRyLCB1NjQgKnJlZ192YWwsCiAJCQkJc3RydWN0IGk0MGVfYXNxX2NtZF9kZXRhaWxzICpjbWRfZGV0YWlscykKIHsKIAlzdHJ1Y3QgaTQwZV9hcV9kZXNjIGRlc2M7CkBAIC0yMTE3LDE3ICsyMTM5LDE1IEBACiAJaWYgKHJlZ192YWwgPT0gTlVMTCkKIAkJcmV0dXJuIEk0MEVfRVJSX1BBUkFNOwogCi0JaTQwZV9maWxsX2RlZmF1bHRfZGlyZWN0X2NtZF9kZXNjKCZkZXNjLAotCQkJCQkgIGk0MGVfYXFjX29wY19kZWJ1Z19yZWFkX3JlZyk7CisJaTQwZV9maWxsX2RlZmF1bHRfZGlyZWN0X2NtZF9kZXNjKCZkZXNjLCBpNDBlX2FxY19vcGNfZGVidWdfcmVhZF9yZWcpOwogCiAJY21kX3Jlc3AtPmFkZHJlc3MgPSBjcHVfdG9fbGUzMihyZWdfYWRkcik7CiAKIAlzdGF0dXMgPSBpNDBlX2FzcV9zZW5kX2NvbW1hbmQoaHcsICZkZXNjLCBOVUxMLCAwLCBjbWRfZGV0YWlscyk7CiAKIAlpZiAoIXN0YXR1cykgewotCQkqcmVnX3ZhbCA9ICgodTY0KWNtZF9yZXNwLT52YWx1ZV9oaWdoIDw8IDMyKSB8Ci0JCQkgICAgKHU2NCljbWRfcmVzcC0+dmFsdWVfbG93OwotCQkqcmVnX3ZhbCA9IGxlNjRfdG9fY3B1KCpyZWdfdmFsKTsKKwkJKnJlZ192YWwgPSAoKHU2NClsZTMyX3RvX2NwdShjbWRfcmVzcC0+dmFsdWVfaGlnaCkgPDwgMzIpIHwKKwkJCSAgICh1NjQpbGUzMl90b19jcHUoY21kX3Jlc3AtPnZhbHVlX2xvdyk7CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTMzNzcsNiArMzM5Nyw0NyBAQAogfQogCiAvKioKKyAqIGk0MGVfYXFfYWx0ZXJuYXRlX3JlYWQKKyAqIEBodzogcG9pbnRlciB0byB0aGUgaGFyZHdhcmUgc3RydWN0dXJlCisgKiBAcmVnX2FkZHIwOiBhZGRyZXNzIG9mIGZpcnN0IGR3b3JkIHRvIGJlIHJlYWQKKyAqIEByZWdfdmFsMDogcG9pbnRlciBmb3IgZGF0YSByZWFkIGZyb20gJ3JlZ19hZGRyMCcKKyAqIEByZWdfYWRkcjE6IGFkZHJlc3Mgb2Ygc2Vjb25kIGR3b3JkIHRvIGJlIHJlYWQKKyAqIEByZWdfdmFsMTogcG9pbnRlciBmb3IgZGF0YSByZWFkIGZyb20gJ3JlZ19hZGRyMScKKyAqCisgKiBSZWFkIG9uZSBvciB0d28gZHdvcmRzIGZyb20gYWx0ZXJuYXRlIHN0cnVjdHVyZS4gRmllbGRzIGFyZSBpbmRpY2F0ZWQKKyAqIGJ5ICdyZWdfYWRkcjAnIGFuZCAncmVnX2FkZHIxJyByZWdpc3RlciBudW1iZXJzLiBJZiAncmVnX3ZhbDEnIHBvaW50ZXIKKyAqIGlzIG5vdCBwYXNzZWQgdGhlbiBvbmx5IHJlZ2lzdGVyIGF0ICdyZWdfYWRkcjAnIGlzIHJlYWQuCisgKgorICoqLworc3RhdGljIGk0MGVfc3RhdHVzIGk0MGVfYXFfYWx0ZXJuYXRlX3JlYWQoc3RydWN0IGk0MGVfaHcgKmh3LAorCQkJCQkgIHUzMiByZWdfYWRkcjAsIHUzMiAqcmVnX3ZhbDAsCisJCQkJCSAgdTMyIHJlZ19hZGRyMSwgdTMyICpyZWdfdmFsMSkKK3sKKwlzdHJ1Y3QgaTQwZV9hcV9kZXNjIGRlc2M7CisJc3RydWN0IGk0MGVfYXFjX2FsdGVybmF0ZV93cml0ZSAqY21kX3Jlc3AgPQorCQkoc3RydWN0IGk0MGVfYXFjX2FsdGVybmF0ZV93cml0ZSAqKSZkZXNjLnBhcmFtcy5yYXc7CisJaTQwZV9zdGF0dXMgc3RhdHVzOworCisJaWYgKCFyZWdfdmFsMCkKKwkJcmV0dXJuIEk0MEVfRVJSX1BBUkFNOworCisJaTQwZV9maWxsX2RlZmF1bHRfZGlyZWN0X2NtZF9kZXNjKCZkZXNjLCBpNDBlX2FxY19vcGNfYWx0ZXJuYXRlX3JlYWQpOworCWNtZF9yZXNwLT5hZGRyZXNzMCA9IGNwdV90b19sZTMyKHJlZ19hZGRyMCk7CisJY21kX3Jlc3AtPmFkZHJlc3MxID0gY3B1X3RvX2xlMzIocmVnX2FkZHIxKTsKKworCXN0YXR1cyA9IGk0MGVfYXNxX3NlbmRfY29tbWFuZChodywgJmRlc2MsIE5VTEwsIDAsIE5VTEwpOworCisJaWYgKCFzdGF0dXMpIHsKKwkJKnJlZ192YWwwID0gbGUzMl90b19jcHUoY21kX3Jlc3AtPmRhdGEwKTsKKworCQlpZiAocmVnX3ZhbDEpCisJCQkqcmVnX3ZhbDEgPSBsZTMyX3RvX2NwdShjbWRfcmVzcC0+ZGF0YTEpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgogICogaTQwZV9hcV9yZXN1bWVfcG9ydF90eAogICogQGh3OiBwb2ludGVyIHRvIHRoZSBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqIEBjbWRfZGV0YWlsczogcG9pbnRlciB0byBjb21tYW5kIGRldGFpbHMgc3RydWN0dXJlIG9yIE5VTEwKQEAgLTM0NDAsMyArMzUwMSw3OSBAQAogCQlicmVhazsKIAl9CiB9CisKKy8qKgorICogaTQwZV9yZWFkX2J3X2Zyb21fYWx0X3JhbQorICogQGh3OiBwb2ludGVyIHRvIHRoZSBoYXJkd2FyZSBzdHJ1Y3R1cmUKKyAqIEBtYXhfYnc6IHBvaW50ZXIgZm9yIG1heF9idyByZWFkCisgKiBAbWluX2J3OiBwb2ludGVyIGZvciBtaW5fYncgcmVhZAorICogQG1pbl92YWxpZDogcG9pbnRlciBmb3IgYm9vbCB0aGF0IGlzIHRydWUgaWYgbWluX2J3IGlzIGEgdmFsaWQgdmFsdWUKKyAqIEBtYXhfdmFsaWQ6IHBvaW50ZXIgZm9yIGJvb2wgdGhhdCBpcyB0cnVlIGlmIG1heF9idyBpcyBhIHZhbGlkIHZhbHVlCisgKgorICogUmVhZCBidyBmcm9tIHRoZSBhbHRlcm5hdGUgcmFtIGZvciB0aGUgZ2l2ZW4gcGYKKyAqKi8KK2k0MGVfc3RhdHVzIGk0MGVfcmVhZF9id19mcm9tX2FsdF9yYW0oc3RydWN0IGk0MGVfaHcgKmh3LAorCQkJCSAgICAgIHUzMiAqbWF4X2J3LCB1MzIgKm1pbl9idywKKwkJCQkgICAgICBib29sICptaW5fdmFsaWQsIGJvb2wgKm1heF92YWxpZCkKK3sKKwlpNDBlX3N0YXR1cyBzdGF0dXM7CisJdTMyIG1heF9id19hZGRyLCBtaW5fYndfYWRkcjsKKworCS8qIENhbGN1bGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbWluL21heCBidyByZWdpc3RlcnMgKi8KKwltYXhfYndfYWRkciA9IEk0MEVfQUxUX1NUUlVDVF9GSVJTVF9QRl9PRkZTRVQgKworCQkgICAgICBJNDBFX0FMVF9TVFJVQ1RfTUFYX0JXX09GRlNFVCArCisJCSAgICAgIChJNDBFX0FMVF9TVFJVQ1RfRFdPUkRTX1BFUl9QRiAqIGh3LT5wZl9pZCk7CisJbWluX2J3X2FkZHIgPSBJNDBFX0FMVF9TVFJVQ1RfRklSU1RfUEZfT0ZGU0VUICsKKwkJICAgICAgSTQwRV9BTFRfU1RSVUNUX01JTl9CV19PRkZTRVQgKworCQkgICAgICAoSTQwRV9BTFRfU1RSVUNUX0RXT1JEU19QRVJfUEYgKiBody0+cGZfaWQpOworCisJLyogUmVhZCB0aGUgYmFuZHdpZHRocyBmcm9tIGFsdCByYW0gKi8KKwlzdGF0dXMgPSBpNDBlX2FxX2FsdGVybmF0ZV9yZWFkKGh3LCBtYXhfYndfYWRkciwgbWF4X2J3LAorCQkJCQltaW5fYndfYWRkciwgbWluX2J3KTsKKworCWlmICgqbWluX2J3ICYgSTQwRV9BTFRfQldfVkFMSURfTUFTSykKKwkJKm1pbl92YWxpZCA9IHRydWU7CisJZWxzZQorCQkqbWluX3ZhbGlkID0gZmFsc2U7CisKKwlpZiAoKm1heF9idyAmIEk0MEVfQUxUX0JXX1ZBTElEX01BU0spCisJCSptYXhfdmFsaWQgPSB0cnVlOworCWVsc2UKKwkJKm1heF92YWxpZCA9IGZhbHNlOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBpNDBlX2FxX2NvbmZpZ3VyZV9wYXJ0aXRpb25fYncKKyAqIEBodzogcG9pbnRlciB0byB0aGUgaGFyZHdhcmUgc3RydWN0dXJlCisgKiBAYndfZGF0YTogQnVmZmVyIGhvbGRpbmcgdmFsaWQgcGZzIGFuZCBidyBsaW1pdHMKKyAqIEBjbWRfZGV0YWlsczogcG9pbnRlciB0byBjb21tYW5kIGRldGFpbHMKKyAqCisgKiBDb25maWd1cmUgcGFydGl0aW9ucyBndWFyYW50ZWVkL21heCBidworICoqLworaTQwZV9zdGF0dXMgaTQwZV9hcV9jb25maWd1cmVfcGFydGl0aW9uX2J3KHN0cnVjdCBpNDBlX2h3ICpodywKKwkJCXN0cnVjdCBpNDBlX2FxY19jb25maWd1cmVfcGFydGl0aW9uX2J3X2RhdGEgKmJ3X2RhdGEsCisJCQlzdHJ1Y3QgaTQwZV9hc3FfY21kX2RldGFpbHMgKmNtZF9kZXRhaWxzKQoreworCWk0MGVfc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3QgaTQwZV9hcV9kZXNjIGRlc2M7CisJdTE2IGJ3ZF9zaXplID0gc2l6ZW9mKCpid19kYXRhKTsKKworCWk0MGVfZmlsbF9kZWZhdWx0X2RpcmVjdF9jbWRfZGVzYygmZGVzYywKKwkJCQkJICBpNDBlX2FxY19vcGNfY29uZmlndXJlX3BhcnRpdGlvbl9idyk7CisKKwkvKiBJbmRpcmVjdCBjb21tYW5kICovCisJZGVzYy5mbGFncyB8PSBjcHVfdG9fbGUxNigodTE2KUk0MEVfQVFfRkxBR19CVUYpOworCWRlc2MuZmxhZ3MgfD0gY3B1X3RvX2xlMTYoKHUxNilJNDBFX0FRX0ZMQUdfUkQpOworCisJaWYgKGJ3ZF9zaXplID4gSTQwRV9BUV9MQVJHRV9CVUYpCisJCWRlc2MuZmxhZ3MgfD0gY3B1X3RvX2xlMTYoKHUxNilJNDBFX0FRX0ZMQUdfTEIpOworCisJZGVzYy5kYXRhbGVuID0gY3B1X3RvX2xlMTYoYndkX3NpemUpOworCisJc3RhdHVzID0gaTQwZV9hc3Ffc2VuZF9jb21tYW5kKGh3LCAmZGVzYywgYndfZGF0YSwgYndkX3NpemUsCisJCQkJICAgICAgIGNtZF9kZXRhaWxzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZGNiLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZGNiLmMKaW5kZXggM2NlNDM1OC4uNmUxNDY2NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2RjYi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kY2IuYwpAQCAtNDU5LDcgKzQ1OSw3IEBACiAJc3luYyA9IChzdGF0dXMgJiBJNDBFX1RMVl9TVEFUVVNfU1lOQykgPyAxIDogMDsKIAlvcGVyID0gKHN0YXR1cyAmIEk0MEVfVExWX1NUQVRVU19PUEVSKSA/IDEgOiAwOwogCS8qIEFkZCBBUFBzIGlmIEVycm9yIGlzIEZhbHNlIGFuZCBPcGVyL1N5bmMgaXMgVHJ1ZSAqLwotCWlmICghZXJyICYmIHN5bmMgJiYgb3BlcikgeworCWlmICghZXJyKSB7CiAJCS8qIENFRSBvcGVyYXRpbmcgY29uZmlndXJhdGlvbiBzdXBwb3J0cyBGQ29FL2lTQ1NJL0ZJUCBvbmx5ICovCiAJCWRjYmNmZy0+bnVtYXBwcyA9IEk0MEVfQ0VFX09QRVJfTUFYX0FQUFM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kY2JfbmwuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kY2JfbmwuYwppbmRleCBhMTFjNzBjLi5iZDUwNzlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZGNiX25sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2RjYl9ubC5jCkBAIC0xNzgsNiArMTc4LDEwIEBACiAJaWYgKCEocGYtPmZsYWdzICYgSTQwRV9GTEFHX0RDQl9FTkFCTEVEKSkKIAkJcmV0dXJuOwogCisJLyogTUZQIG1vZGUgYnV0IG5vdCBhbiBpU0NTSSBQRiBzbyByZXR1cm4gKi8KKwlpZiAoKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NRlBfRU5BQkxFRCkgJiYgIShwZi0+aHcuZnVuY19jYXBzLmlzY3NpKSkKKwkJcmV0dXJuOworCiAJZGNieGNmZyA9ICZody0+bG9jYWxfZGNieF9jb25maWc7CiAKIAkvKiBTZXQgdXAgYWxsIHRoZSBBcHAgVExWcyBpZiBEQ0J4IGlzIG5lZ290aWF0ZWQgKi8KQEAgLTIyMyw3ICsyMjcsNyBAQAogCiAvKioKICAqIGk0MGVfZGNibmxfZGVsX2FwcCAtIERlbGV0ZSBBUFAgb24gYWxsIFZTSXMKLSAqIEBwZjogdGhlIGNvcnJlc3BvbmRpbmcgcGYKKyAqIEBwZjogdGhlIGNvcnJlc3BvbmRpbmcgUEYKICAqIEBhcHA6IEFQUCB0byBkZWxldGUKICAqCiAgKiBEZWxldGUgZ2l2ZW4gQVBQIGZyb20gYWxsIHRoZSBWU0lzIGZvciBnaXZlbiBQRgpAQCAtMjY4LDIzICsyNzIsMjYgQEAKIAogLyoqCiAgKiBpNDBlX2RjYm5sX2ZsdXNoX2FwcHMgLSBEZWxldGUgYWxsIHJlbW92ZWQgQVBQcwotICogQHBmOiB0aGUgY29ycmVzcG9uZGluZyBwZgorICogQHBmOiB0aGUgY29ycmVzcG9uZGluZyBQRgorICogQG9sZF9jZmc6IG9sZCBEQ0JYIGNvbmZpZ3VyYXRpb24gZGF0YQogICogQG5ld19jZmc6IG5ldyBEQ0JYIGNvbmZpZ3VyYXRpb24gZGF0YQogICoKICAqIEZpbmQgYW5kIGRlbGV0ZSBhbGwgQVBQcyB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgcGFzc2VkCiAgKiBEQ0IgY29uZmlndXJhdGlvbgogICoqLwogdm9pZCBpNDBlX2RjYm5sX2ZsdXNoX2FwcHMoc3RydWN0IGk0MGVfcGYgKnBmLAorCQkJICAgc3RydWN0IGk0MGVfZGNieF9jb25maWcgKm9sZF9jZmcsCiAJCQkgICBzdHJ1Y3QgaTQwZV9kY2J4X2NvbmZpZyAqbmV3X2NmZykKIHsKIAlzdHJ1Y3QgaTQwZV9kY2JfYXBwX3ByaW9yaXR5X3RhYmxlIGFwcDsKLQlzdHJ1Y3QgaTQwZV9kY2J4X2NvbmZpZyAqZGNieGNmZzsKLQlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmcGYtPmh3OwogCWludCBpOwogCi0JZGNieGNmZyA9ICZody0+bG9jYWxfZGNieF9jb25maWc7Ci0JZm9yIChpID0gMDsgaSA8IGRjYnhjZmctPm51bWFwcHM7IGkrKykgewotCQlhcHAgPSBkY2J4Y2ZnLT5hcHBbaV07CisJLyogTUZQIG1vZGUgYnV0IG5vdCBhbiBpU0NTSSBQRiBzbyByZXR1cm4gKi8KKwlpZiAoKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NRlBfRU5BQkxFRCkgJiYgIShwZi0+aHcuZnVuY19jYXBzLmlzY3NpKSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IG9sZF9jZmctPm51bWFwcHM7IGkrKykgeworCQlhcHAgPSBvbGRfY2ZnLT5hcHBbaV07CiAJCS8qIFRoZSBBUFAgaXMgbm90IGF2YWlsYWJsZSBhbnltb3JlIGRlbGV0ZSBpdCAqLwogCQlpZiAoIWk0MGVfZGNibmxfZmluZF9hcHAobmV3X2NmZywgJmFwcCkpCiAJCQlpNDBlX2RjYm5sX2RlbF9hcHAocGYsICZhcHApOwpAQCAtMzA2LDkgKzMxMyw3IEBACiAJaWYgKCEocGYtPmZsYWdzICYgSTQwRV9GTEFHX0RDQl9DQVBBQkxFKSkKIAkJcmV0dXJuOwogCi0JLyogRG8gbm90IHNldHVwIERDQiBOTCBvcHMgZm9yIE1GUCBtb2RlICovCi0JaWYgKCEocGYtPmZsYWdzICYgSTQwRV9GTEFHX01GUF9FTkFCTEVEKSkKLQkJZGV2LT5kY2JubF9vcHMgPSAmZGNibmxfb3BzOworCWRldi0+ZGNibmxfb3BzID0gJmRjYm5sX29wczsKIAogCS8qIFNldCBpbml0aWFsIElFRUUgRENCIHNldHRpbmdzICovCiAJaTQwZV9kY2JubF9zZXRfYWxsKHZzaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2RlYnVnZnMuYwppbmRleCBjMTdlZTc3Li5kYWE4ODI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9kZWJ1Z2ZzLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogLyoqCiAgKiBpNDBlX2RiZ19maW5kX3ZzaSAtIHNlYXJjaGVzIGZvciB0aGUgdnNpIHdpdGggdGhlIGdpdmVuIHNlaWQKLSAqIEBwZiAtIHRoZSBwZiBzdHJ1Y3R1cmUgdG8gc2VhcmNoIGZvciB0aGUgdnNpCisgKiBAcGYgLSB0aGUgUEYgc3RydWN0dXJlIHRvIHNlYXJjaCBmb3IgdGhlIHZzaQogICogQHNlaWQgLSBzZWlkIG9mIHRoZSB2c2kgaXQgaXMgc2VhcmNoaW5nIGZvcgogICoqLwogc3RhdGljIHN0cnVjdCBpNDBlX3ZzaSAqaTQwZV9kYmdfZmluZF92c2koc3RydWN0IGk0MGVfcGYgKnBmLCBpbnQgc2VpZCkKQEAgLTU0LDcgKzU0LDcgQEAKIAogLyoqCiAgKiBpNDBlX2RiZ19maW5kX3ZlYiAtIHNlYXJjaGVzIGZvciB0aGUgdmViIHdpdGggdGhlIGdpdmVuIHNlaWQKLSAqIEBwZiAtIHRoZSBwZiBzdHJ1Y3R1cmUgdG8gc2VhcmNoIGZvciB0aGUgdmViCisgKiBAcGYgLSB0aGUgUEYgc3RydWN0dXJlIHRvIHNlYXJjaCBmb3IgdGhlIHZlYgogICogQHNlaWQgLSBzZWlkIG9mIHRoZSB2ZWIgaXQgaXMgc2VhcmNoaW5nIGZvcgogICoqLwogc3RhdGljIHN0cnVjdCBpNDBlX3ZlYiAqaTQwZV9kYmdfZmluZF92ZWIoc3RydWN0IGk0MGVfcGYgKnBmLCBpbnQgc2VpZCkKQEAgLTExMiw3ICsxMTIsNyBAQAogCiAvKioKICAqIGk0MGVfZGJnX3ByZXBfZHVtcF9idWYKLSAqIEBwZjogdGhlIHBmIHdlJ3JlIHdvcmtpbmcgd2l0aAorICogQHBmOiB0aGUgUEYgd2UncmUgd29ya2luZyB3aXRoCiAgKiBAYnVmbGVuOiB0aGUgZGVzaXJlZCBidWZmZXIgbGVuZ3RoCiAgKgogICogUmV0dXJuIHBvc2l0aXZlIGlmIHN1Y2Nlc3MsIDAgaWYgZmFpbGVkCkBAIC0zMTgsNyArMzE4LDcgQEAKICAqIHNldHVwLCBhZGRpbmcgb3IgcmVtb3ZpbmcgZmlsdGVycywgb3Igb3RoZXIgdGhpbmdzLiAgTWFueSBvZgogICogdGhlc2Ugd2lsbCBiZSB1c2VmdWwgZm9yIHNvbWUgZm9ybXMgb2YgdW5pdCB0ZXN0aW5nLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNoYXIgaTQwZV9kYmdfY29tbWFuZF9idWZbMjU2XSA9ICJoZWxsbyB3b3JsZCI7CitzdGF0aWMgY2hhciBpNDBlX2RiZ19jb21tYW5kX2J1ZlsyNTZdID0gIiI7CiAKIC8qKgogICogaTQwZV9kYmdfY29tbWFuZF9yZWFkIC0gcmVhZCBmb3IgY29tbWFuZCBkYXR1bQpAQCAtMzkwLDYgKzM5MCwxMSBAQAogCQkgIiAgICBuZXRkZXZfcmVnaXN0ZXJlZCA9ICVpLCBjdXJyZW50X25ldGRldl9mbGFncyA9IDB4JTA0eCwgc3RhdGUgPSAlbGkgZmxhZ3MgPSAweCUwOGx4XG4iLAogCQkgdnNpLT5uZXRkZXZfcmVnaXN0ZXJlZCwKIAkJIHZzaS0+Y3VycmVudF9uZXRkZXZfZmxhZ3MsIHZzaS0+c3RhdGUsIHZzaS0+ZmxhZ3MpOworCWlmICh2c2kgPT0gcGYtPnZzaVtwZi0+bGFuX3ZzaV0pCisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiTUFDIGFkZHJlc3M6ICVwTSBTQU4gTUFDOiAlcE0gUG9ydCBNQUM6ICVwTVxuIiwKKwkJCSBwZi0+aHcubWFjLmFkZHIsCisJCQkgcGYtPmh3Lm1hYy5zYW5fYWRkciwKKwkJCSBwZi0+aHcubWFjLnBvcnRfYWRkcik7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmLCAmdnNpLT5tYWNfZmlsdGVyX2xpc3QsIGxpc3QpIHsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCiAJCQkgIiAgICBtYWNfZmlsdGVyX2xpc3Q6ICVwTSB2aWQ9JWQsIGlzX25ldGRldj0lZCBpc192Zj0lZCBjb3VudGVyPSVkXG4iLApAQCAtNjc1LDcgKzY4MCw3IEBACiAJCSB2c2ktPmluZm8ucmVzcF9yZXNlcnZlZFs4XSwgdnNpLT5pbmZvLnJlc3BfcmVzZXJ2ZWRbOV0sCiAJCSB2c2ktPmluZm8ucmVzcF9yZXNlcnZlZFsxMF0sIHZzaS0+aW5mby5yZXNwX3Jlc2VydmVkWzExXSk7CiAJaWYgKHZzaS0+YmFjaykKLQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgICAgcGYgPSAlcFxuIiwgdnNpLT5iYWNrKTsKKwkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgICAgUEYgPSAlcFxuIiwgdnNpLT5iYWNrKTsKIAlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiAgICBpZHggPSAlZFxuIiwgdnNpLT5pZHgpOwogCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAogCQkgIiAgICB0Y19jb25maWc6IG51bXRjID0gJWQsIGVuYWJsZWRfdGMgPSAweCV4XG4iLApAQCAtOTIxLDkgKzkyNiwxMCBAQAogCQlyZXR1cm47CiAJfQogCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkgInZlYiBpZHg9JWQsJWQgc3RhdHNfaWM9JWQgIHNlaWQ9JWQgdXBsaW5rPSVkXG4iLAorCQkgInZlYiBpZHg9JWQsJWQgc3RhdHNfaWM9JWQgIHNlaWQ9JWQgdXBsaW5rPSVkIG1vZGU9JXNcbiIsCiAJCSB2ZWItPmlkeCwgdmViLT52ZWJfaWR4LCB2ZWItPnN0YXRzX2lkeCwgdmViLT5zZWlkLAotCQkgdmViLT51cGxpbmtfc2VpZCk7CisJCSB2ZWItPnVwbGlua19zZWlkLAorCQkgdmViLT5icmlkZ2VfbW9kZSA9PSBCUklER0VfTU9ERV9WRVBBID8gIlZFUEEiIDogIlZFQiIpOwogCWk0MGVfZGJnX2R1bXBfZXRoX3N0YXRzKHBmLCAmdmViLT5zdGF0cyk7CiB9CiAKQEAgLTk0NSw3ICs5NTEsNyBAQAogCiAvKioKICAqIGk0MGVfZGJnX2NtZF9mZF9jdHJsIC0gRW5hYmxlL2Rpc2FibGUgRkQgc2lkZWJhbmQvQVRSCi0gKiBAcGY6IHRoZSBwZiB0aGF0IHdvdWxkIGJlIGFsdGVyZWQKKyAqIEBwZjogdGhlIFBGIHRoYXQgd291bGQgYmUgYWx0ZXJlZAogICogQGZsYWc6IGZsYWcgdGhhdCBuZWVkcyBlbmFibGluZyBvciBkaXNhYmxpbmcKICAqIEBlbmFibGU6IEVuYWJsZS9kaXNhYmxlIEZEIFNEL0FUUgogICoqLwpAQCAtOTU3LDcgKzk2Myw3IEBACiAJCXBmLT5mbGFncyAmPSB+ZmxhZzsKIAkJcGYtPmF1dG9fZGlzYWJsZV9mbGFncyB8PSBmbGFnOwogCX0KLQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgInJlcXVlc3RpbmcgYSBwZiByZXNldFxuIik7CisJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJyZXF1ZXN0aW5nIGEgUEYgcmVzZXRcbiIpOwogCWk0MGVfZG9fcmVzZXRfc2FmZShwZiwgKDEgPDwgX19JNDBFX1BGX1JFU0VUX1JFUVVFU1RFRCkpOwogfQogCkBAIC0xNDg3LDExICsxNDkzLDE1IEBACiAJCQl9IGVsc2UgewogCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiY2xlYXJfc3RhdHMgdnNpIFtzZWlkXVxuIik7CiAJCQl9Ci0JCX0gZWxzZSBpZiAoc3RybmNtcCgmY21kX2J1ZlsxMl0sICJwZiIsIDIpID09IDApIHsKLQkJCWk0MGVfcGZfcmVzZXRfc3RhdHMocGYpOwotCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJwZiBjbGVhciBzdGF0cyBjYWxsZWRcbiIpOworCQl9IGVsc2UgaWYgKHN0cm5jbXAoJmNtZF9idWZbMTJdLCAicG9ydCIsIDQpID09IDApIHsKKwkJCWlmIChwZi0+aHcucGFydGl0aW9uX2lkID09IDEpIHsKKwkJCQlpNDBlX3BmX3Jlc2V0X3N0YXRzKHBmKTsKKwkJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgInBvcnQgc3RhdHMgY2xlYXJlZFxuIik7CisJCQl9IGVsc2UgeworCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiY2xlYXIgcG9ydCBzdGF0cyBub3QgYWxsb3dlZCBvbiB0aGlzIHBvcnQgcGFydGl0aW9uXG4iKTsKKwkJCX0KIAkJfSBlbHNlIHsKLQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiY2xlYXJfc3RhdHMgdnNpIFtzZWlkXSBvciBjbGVhcl9zdGF0cyBwZlxuIik7CisJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgImNsZWFyX3N0YXRzIHZzaSBbc2VpZF0gb3IgY2xlYXJfc3RhdHMgcG9ydFxuIik7CiAJCX0KIAl9IGVsc2UgaWYgKHN0cm5jbXAoY21kX2J1ZiwgInNlbmQgYXFfY21kIiwgMTEpID09IDApIHsKIAkJc3RydWN0IGk0MGVfYXFfZGVzYyAqZGVzYzsKQEAgLTE4OTcsNyArMTkwNyw3IEBACiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiICByZWFkIDxyZWc+XG4iKTsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIHdyaXRlIDxyZWc+IDx2YWx1ZT5cbiIpOwogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiAgY2xlYXJfc3RhdHMgdnNpIFtzZWlkXVxuIik7Ci0JCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiICBjbGVhcl9zdGF0cyBwZlxuIik7CisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiICBjbGVhcl9zdGF0cyBwb3J0XG4iKTsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIgIHBmclxuIik7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiICBjb3JlclxuIik7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiICBnbG9iclxuIik7CkBAIC0xOTM1LDcgKzE5NDUsNyBAQAogICogVGhlIG5ldGRldl9vcHMgZW50cnkgaW4gZGVidWdmcyBpcyBmb3IgZ2l2aW5nIHRoZSBkcml2ZXIgY29tbWFuZHMKICAqIHRvIGJlIGV4ZWN1dGVkIGZyb20gdGhlIG5ldGRldiBvcGVyYXRpb25zLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIGNoYXIgaTQwZV9kYmdfbmV0ZGV2X29wc19idWZbMjU2XSA9ICJoZWxsbyB3b3JsZCI7CitzdGF0aWMgY2hhciBpNDBlX2RiZ19uZXRkZXZfb3BzX2J1ZlsyNTZdID0gIiI7CiAKIC8qKgogICogaTQwZV9kYmdfbmV0ZGV2X29wcyAtIHJlYWQgZm9yIG5ldGRldl9vcHMgZGF0dW0KQEAgLTIxMjMsOCArMjEzMyw4IEBACiB9OwogCiAvKioKLSAqIGk0MGVfZGJnX3BmX2luaXQgLSBzZXR1cCB0aGUgZGVidWdmcyBkaXJlY3RvcnkgZm9yIHRoZSBwZgotICogQHBmOiB0aGUgcGYgdGhhdCBpcyBzdGFydGluZyB1cAorICogaTQwZV9kYmdfcGZfaW5pdCAtIHNldHVwIHRoZSBkZWJ1Z2ZzIGRpcmVjdG9yeSBmb3IgdGhlIFBGCisgKiBAcGY6IHRoZSBQRiB0aGF0IGlzIHN0YXJ0aW5nIHVwCiAgKiovCiB2b2lkIGk0MGVfZGJnX3BmX2luaXQoc3RydWN0IGk0MGVfcGYgKnBmKQogewpAQCAtMjE2MCw4ICsyMTcwLDggQEAKIH0KIAogLyoqCi0gKiBpNDBlX2RiZ19wZl9leGl0IC0gY2xlYXIgb3V0IHRoZSBwZidzIGRlYnVnZnMgZW50cmllcwotICogQHBmOiB0aGUgcGYgdGhhdCBpcyBzdG9wcGluZworICogaTQwZV9kYmdfcGZfZXhpdCAtIGNsZWFyIG91dCB0aGUgUEYncyBkZWJ1Z2ZzIGVudHJpZXMKKyAqIEBwZjogdGhlIFBGIHRoYXQgaXMgc3RvcHBpbmcKICAqKi8KIHZvaWQgaTQwZV9kYmdfcGZfZXhpdChzdHJ1Y3QgaTQwZV9wZiAqcGYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2V0aHRvb2wuYwppbmRleCBiODIzMGRjLi5jODQ4YjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9ldGh0b29sLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVsIEV0aGVybmV0IENvbnRyb2xsZXIgWEw3MTAgRmFtaWx5IExpbnV4IERyaXZlcgotICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE1IEludGVsIENvcnBvcmF0aW9uLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMTEzLDcgKzExMyw2IEBACiAJSTQwRV9QRl9TVEFUKCJ0eF9icm9hZGNhc3QiLCBzdGF0cy5ldGgudHhfYnJvYWRjYXN0KSwKIAlJNDBFX1BGX1NUQVQoInR4X2Vycm9ycyIsIHN0YXRzLmV0aC50eF9lcnJvcnMpLAogCUk0MEVfUEZfU1RBVCgicnhfZHJvcHBlZCIsIHN0YXRzLmV0aC5yeF9kaXNjYXJkcyksCi0JSTQwRV9QRl9TVEFUKCJ0eF9kcm9wcGVkIiwgc3RhdHMuZXRoLnR4X2Rpc2NhcmRzKSwKIAlJNDBFX1BGX1NUQVQoInR4X2Ryb3BwZWRfbGlua19kb3duIiwgc3RhdHMudHhfZHJvcHBlZF9saW5rX2Rvd24pLAogCUk0MEVfUEZfU1RBVCgiY3JjX2Vycm9ycyIsIHN0YXRzLmNyY19lcnJvcnMpLAogCUk0MEVfUEZfU1RBVCgiaWxsZWdhbF9ieXRlcyIsIHN0YXRzLmlsbGVnYWxfYnl0ZXMpLApAQCAtMjE4LDYgKzIxNywxMyBAQAogCiAjZGVmaW5lIEk0MEVfVEVTVF9MRU4gKHNpemVvZihpNDBlX2dzdHJpbmdzX3Rlc3QpIC8gRVRIX0dTVFJJTkdfTEVOKQogCitzdGF0aWMgY29uc3QgY2hhciBpNDBlX3ByaXZfZmxhZ3Nfc3RyaW5nc1tdW0VUSF9HU1RSSU5HX0xFTl0gPSB7CisJIk5QQVIiLAorfTsKKworI2RlZmluZSBJNDBFX1BSSVZfRkxBR1NfU1RSX0xFTiBcCisJKHNpemVvZihpNDBlX3ByaXZfZmxhZ3Nfc3RyaW5ncykgLyBFVEhfR1NUUklOR19MRU4pCisKIC8qKgogICogaTQwZV9wYXJ0aXRpb25fc2V0dGluZ19jb21wbGFpbnQgLSBnZW5lcmljIGNvbXBsYWludCBmb3IgTUZQIHJlc3RyaWN0aW9uCiAgKiBAcGY6IHRoZSBQRiBzdHJ1Y3QKQEAgLTIyOSw3MyArMjM1LDIwIEBACiB9CiAKIC8qKgotICogaTQwZV9nZXRfc2V0dGluZ3MgLSBHZXQgTGluayBTcGVlZCBhbmQgRHVwbGV4IHNldHRpbmdzCisgKiBpNDBlX2dldF9zZXR0aW5nc19saW5rX3VwIC0gR2V0IHRoZSBMaW5rIHNldHRpbmdzIGZvciB3aGVuIGxpbmsgaXMgdXAKKyAqIEBodzogaHcgc3RydWN0dXJlCisgKiBAZWNtZDogZXRodG9vbCBjb21tYW5kIHRvIGZpbGwgaW4KICAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKLSAqIEBlY21kOiBldGh0b29sIGNvbW1hbmQKICAqCi0gKiBSZXBvcnRzIHNwZWVkL2R1cGxleCBzZXR0aW5ncyBiYXNlZCBvbiBtZWRpYV90eXBlCiAgKiovCi1zdGF0aWMgaW50IGk0MGVfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCQkgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKK3N0YXRpYyB2b2lkIGk0MGVfZ2V0X3NldHRpbmdzX2xpbmtfdXAoc3RydWN0IGk0MGVfaHcgKmh3LAorCQkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCwKKwkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBpNDBlX25ldGRldl9wcml2ICpucCA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RydWN0IGk0MGVfcGYgKnBmID0gbnAtPnZzaS0+YmFjazsKLQlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmcGYtPmh3OwogCXN0cnVjdCBpNDBlX2xpbmtfc3RhdHVzICpod19saW5rX2luZm8gPSAmaHctPnBoeS5saW5rX2luZm87Ci0JYm9vbCBsaW5rX3VwID0gaHdfbGlua19pbmZvLT5saW5rX2luZm8gJiBJNDBFX0FRX0xJTktfVVA7CiAJdTMyIGxpbmtfc3BlZWQgPSBod19saW5rX2luZm8tPmxpbmtfc3BlZWQ7CiAKLQkvKiBoYXJkd2FyZSBpcyBlaXRoZXIgaW4gNDBHIG1vZGUgb3IgMTBHIG1vZGUKLQkgKiBOT1RFOiB0aGlzIHNlY3Rpb24gaW5pdGlhbGl6ZXMgc3VwcG9ydGVkIGFuZCBhZHZlcnRpc2luZwotCSAqLwotCWlmICghbGlua191cCkgewotCQkvKiBsaW5rIGlzIGRvd24gYW5kIHRoZSBkcml2ZXIgbmVlZHMgdG8gZmFsbCBiYWNrIG9uCi0JCSAqIGRldmljZSBJRCB0byBkZXRlcm1pbmUgd2hhdCBraW5kcyBvZiBpbmZvIHRvIGRpc3BsYXksCi0JCSAqIGl0J3MgbW9zdGx5IGEgZ3Vlc3MgdGhhdCBtYXkgY2hhbmdlIHdoZW4gbGluayBpcyB1cAotCQkgKi8KLQkJc3dpdGNoIChody0+ZGV2aWNlX2lkKSB7Ci0JCWNhc2UgSTQwRV9ERVZfSURfUVNGUF9BOgotCQljYXNlIEk0MEVfREVWX0lEX1FTRlBfQjoKLQkJY2FzZSBJNDBFX0RFVl9JRF9RU0ZQX0M6Ci0JCQkvKiBwbHVnZ2FibGUgUVNGUCAqLwotCQkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzQwMDAwYmFzZVNSNF9GdWxsIHwKLQkJCQkJICBTVVBQT1JURURfNDAwMDBiYXNlQ1I0X0Z1bGwgfAotCQkJCQkgIFNVUFBPUlRFRF80MDAwMGJhc2VMUjRfRnVsbDsKLQkJCWVjbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF80MDAwMGJhc2VTUjRfRnVsbCB8Ci0JCQkJCSAgICBBRFZFUlRJU0VEXzQwMDAwYmFzZUNSNF9GdWxsIHwKLQkJCQkJICAgIEFEVkVSVElTRURfNDAwMDBiYXNlTFI0X0Z1bGw7Ci0JCQlicmVhazsKLQkJY2FzZSBJNDBFX0RFVl9JRF9LWF9COgotCQkJLyogYmFja3BsYW5lIDQwRyAqLwotCQkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzQwMDAwYmFzZUtSNF9GdWxsOwotCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEXzQwMDAwYmFzZUtSNF9GdWxsOwotCQkJYnJlYWs7Ci0JCWNhc2UgSTQwRV9ERVZfSURfS1hfQzoKLQkJCS8qIGJhY2twbGFuZSAxMEcgKi8KLQkJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsOwotCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEXzEwMDAwYmFzZUtSX0Z1bGw7Ci0JCQlicmVhazsKLQkJY2FzZSBJNDBFX0RFVl9JRF8xMEdfQkFTRV9UOgotCQkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzEwMDAwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKLQkJCQkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbDsKLQkJCWVjbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwgfAotCQkJCQkgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8Ci0JCQkJCSAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIGFsbCB0aGUgcmVzdCBhcmUgMTBHLzFHICovCi0JCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwKLQkJCQkJICBTVVBQT1JURURfMTAwMGJhc2VUX0Z1bGw7Ci0JCQllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsIHwKLQkJCQkJICAgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIHNraXAgcGh5X3R5cGUgdXNlIGFzIGl0IGlzIHplcm8gd2hlbiBsaW5rIGlzIGRvd24gKi8KLQkJZ290byBub192YWxpZF9waHlfdHlwZTsKLQl9Ci0KKwkvKiBJbml0aWFsaXplIHN1cHBvcnRlZCBhbmQgYWR2ZXJ0aXNlZCBzZXR0aW5ncyBiYXNlZCBvbiBwaHkgc2V0dGluZ3MgKi8KIAlzd2l0Y2ggKGh3X2xpbmtfaW5mby0+cGh5X3R5cGUpIHsKIAljYXNlIEk0MEVfUEhZX1RZUEVfNDBHQkFTRV9DUjQ6CiAJY2FzZSBJNDBFX1BIWV9UWVBFXzQwR0JBU0VfQ1I0X0NVOgpAQCAtMzA0LDYgKzI1NywxMSBAQAogCQllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfQXV0b25lZyB8CiAJCQkJICAgIEFEVkVSVElTRURfNDAwMDBiYXNlQ1I0X0Z1bGw7CiAJCWJyZWFrOworCWNhc2UgSTQwRV9QSFlfVFlQRV9YTEFVSToKKwljYXNlIEk0MEVfUEhZX1RZUEVfWExQUEk6CisJY2FzZSBJNDBFX1BIWV9UWVBFXzQwR0JBU0VfQU9DOgorCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfNDAwMDBiYXNlQ1I0X0Z1bGw7CisJCWJyZWFrOwogCWNhc2UgSTQwRV9QSFlfVFlQRV80MEdCQVNFX0tSNDoKIAkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEX0F1dG9uZWcgfAogCQkJCSAgU1VQUE9SVEVEXzQwMDAwYmFzZUtSNF9GdWxsOwpAQCAtMzExLDEzICsyNjksMTcgQEAKIAkJCQkgICAgQURWRVJUSVNFRF80MDAwMGJhc2VLUjRfRnVsbDsKIAkJYnJlYWs7CiAJY2FzZSBJNDBFX1BIWV9UWVBFXzQwR0JBU0VfU1I0OgotCWNhc2UgSTQwRV9QSFlfVFlQRV9YTFBQSToKLQljYXNlIEk0MEVfUEhZX1RZUEVfWExBVUk6CiAJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF80MDAwMGJhc2VTUjRfRnVsbDsKIAkJYnJlYWs7CiAJY2FzZSBJNDBFX1BIWV9UWVBFXzQwR0JBU0VfTFI0OgogCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfNDAwMDBiYXNlTFI0X0Z1bGw7CiAJCWJyZWFrOworCWNhc2UgSTQwRV9QSFlfVFlQRV8yMEdCQVNFX0tSMjoKKwkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEX0F1dG9uZWcgfAorCQkJCSAgU1VQUE9SVEVEXzIwMDAwYmFzZUtSMl9GdWxsOworCQllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfQXV0b25lZyB8CisJCQkJICAgIEFEVkVSVElTRURfMjAwMDBiYXNlS1IyX0Z1bGw7CisJCWJyZWFrOwogCWNhc2UgSTQwRV9QSFlfVFlQRV8xMEdCQVNFX0tYNDoKIAkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEX0F1dG9uZWcgfAogCQkJCSAgU1VQUE9SVEVEXzEwMDAwYmFzZUtYNF9GdWxsOwpAQCAtMzM0LDU1ICsyOTYsNTYgQEAKIAljYXNlIEk0MEVfUEhZX1RZUEVfMTBHQkFTRV9MUjoKIAljYXNlIEk0MEVfUEhZX1RZUEVfMTAwMEJBU0VfU1g6CiAJY2FzZSBJNDBFX1BIWV9UWVBFXzEwMDBCQVNFX0xYOgotCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsOwotCQllY21kLT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOwotCQlicmVhazsKLQljYXNlIEk0MEVfUEhZX1RZUEVfMTBHQkFTRV9DUjFfQ1U6Ci0JY2FzZSBJNDBFX1BIWV9UWVBFXzEwR0JBU0VfQ1IxOgotCWNhc2UgSTQwRV9QSFlfVFlQRV8xMEdCQVNFX1Q6Ci0JCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF9BdXRvbmVnIHwKLQkJCQkgIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAotCQkJCSAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKLQkJCQkgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsOwotCQllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfQXV0b25lZyB8Ci0JCQkJICAgIEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsIHwKLQkJCQkgICAgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCB8Ci0JCQkJICAgIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKLQkJYnJlYWs7Ci0JY2FzZSBJNDBFX1BIWV9UWVBFX1hBVUk6Ci0JY2FzZSBJNDBFX1BIWV9UWVBFX1hGSToKLQljYXNlIEk0MEVfUEhZX1RZUEVfU0ZJOgotCWNhc2UgSTQwRV9QSFlfVFlQRV8xMEdCQVNFX1NGUFBfQ1U6Ci0JCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGw7CisJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAorCQkJCSAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCQlpZiAoaHdfbGlua19pbmZvLT5yZXF1ZXN0ZWRfc3BlZWRzICYgSTQwRV9MSU5LX1NQRUVEXzEwR0IpCisJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDAwYmFzZVRfRnVsbDsKKwkJaWYgKGh3X2xpbmtfaW5mby0+cmVxdWVzdGVkX3NwZWVkcyAmIEk0MEVfTElOS19TUEVFRF8xR0IpCisJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsOwogCQlicmVhazsKIAljYXNlIEk0MEVfUEhZX1RZUEVfMTAwMEJBU0VfS1g6Ci0JY2FzZSBJNDBFX1BIWV9UWVBFXzEwMDBCQVNFX1Q6CiAJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF9BdXRvbmVnIHwKLQkJCQkgIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAotCQkJCSAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsIHwKLQkJCQkgIFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsOworCQkJCSAgU1VQUE9SVEVEXzEwMDBiYXNlS1hfRnVsbDsKIAkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX0F1dG9uZWcgfAotCQkJCSAgICBBRFZFUlRJU0VEXzEwMDAwYmFzZVRfRnVsbCB8Ci0JCQkJICAgIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwgfAotCQkJCSAgICBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisJCQkJICAgIEFEVkVSVElTRURfMTAwMGJhc2VLWF9GdWxsOwogCQlicmVhazsKKwljYXNlIEk0MEVfUEhZX1RZUEVfMTBHQkFTRV9UOgorCWNhc2UgSTQwRV9QSFlfVFlQRV8xMDAwQkFTRV9UOgogCWNhc2UgSTQwRV9QSFlfVFlQRV8xMDBCQVNFX1RYOgogCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfQXV0b25lZyB8CiAJCQkJICBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwKIAkJCQkgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CiAJCQkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbDsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX0F1dG9uZWc7CisJCWlmIChod19saW5rX2luZm8tPnJlcXVlc3RlZF9zcGVlZHMgJiBJNDBFX0xJTktfU1BFRURfMTBHQikKKwkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsOworCQlpZiAoaHdfbGlua19pbmZvLT5yZXF1ZXN0ZWRfc3BlZWRzICYgSTQwRV9MSU5LX1NQRUVEXzFHQikKKwkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CisJCWlmIChod19saW5rX2luZm8tPnJlcXVlc3RlZF9zcGVlZHMgJiBJNDBFX0xJTktfU1BFRURfMTAwTUIpCisJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CisJCWJyZWFrOworCWNhc2UgSTQwRV9QSFlfVFlQRV8xMEdCQVNFX0NSMV9DVToKKwljYXNlIEk0MEVfUEhZX1RZUEVfMTBHQkFTRV9DUjE6CisJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF9BdXRvbmVnIHwKKwkJCQkgIFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGw7CiAJCWVjbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF9BdXRvbmVnIHwKLQkJCQkgICAgQURWRVJUSVNFRF8xMDAwMGJhc2VUX0Z1bGwgfAotCQkJCSAgICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKLQkJCQkgICAgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOworCQkJCSAgICBBRFZFUlRJU0VEXzEwMDAwYmFzZVRfRnVsbDsKKwkJYnJlYWs7CisJY2FzZSBJNDBFX1BIWV9UWVBFX1hBVUk6CisJY2FzZSBJNDBFX1BIWV9UWVBFX1hGSToKKwljYXNlIEk0MEVfUEhZX1RZUEVfU0ZJOgorCWNhc2UgSTQwRV9QSFlfVFlQRV8xMEdCQVNFX1NGUFBfQ1U6CisJY2FzZSBJNDBFX1BIWV9UWVBFXzEwR0JBU0VfQU9DOgorCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsOwogCQlicmVhazsKIAljYXNlIEk0MEVfUEhZX1RZUEVfU0dNSUk6CiAJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF9BdXRvbmVnIHwKIAkJCQkgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CiAJCQkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbDsKLQkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEX0F1dG9uZWcgfAotCQkJCSAgICBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKLQkJCQkgICAgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOworCQlpZiAoaHdfbGlua19pbmZvLT5yZXF1ZXN0ZWRfc3BlZWRzICYgSTQwRV9MSU5LX1NQRUVEXzFHQikKKwkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CisJCWlmIChod19saW5rX2luZm8tPnJlcXVlc3RlZF9zcGVlZHMgJiBJNDBFX0xJTktfU1BFRURfMTAwTUIpCisJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGw7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIGlmIHdlIGdvdCBoZXJlIGFuZCBsaW5rIGlzIHVwIHNvbWV0aGluZyBiYWQgaXMgYWZvb3QgKi8KQEAgLTM5MCw4ICszNTMsMTI2IEBACiAJCQkgICAgaHdfbGlua19pbmZvLT5waHlfdHlwZSk7CiAJfQogCi1ub192YWxpZF9waHlfdHlwZToKLQkvKiB0aGlzIGlzIGlmIGF1dG9uZWcgaXMgZW5hYmxlZCBvciBkaXNhYmxlZCAqLworCS8qIFNldCBzcGVlZCBhbmQgZHVwbGV4ICovCisJc3dpdGNoIChsaW5rX3NwZWVkKSB7CisJY2FzZSBJNDBFX0xJTktfU1BFRURfNDBHQjoKKwkJLyogbmVlZCBhIFNQRUVEXzQwMDAwIGluIGV0aHRvb2wuaCAqLworCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgNDAwMDApOworCQlicmVhazsKKwljYXNlIEk0MEVfTElOS19TUEVFRF8yMEdCOgorCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfMjAwMDApOworCQlicmVhazsKKwljYXNlIEk0MEVfTElOS19TUEVFRF8xMEdCOgorCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfMTAwMDApOworCQlicmVhazsKKwljYXNlIEk0MEVfTElOS19TUEVFRF8xR0I6CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBTUEVFRF8xMDAwKTsKKwkJYnJlYWs7CisJY2FzZSBJNDBFX0xJTktfU1BFRURfMTAwTUI6CisJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBTUEVFRF8xMDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJZWNtZC0+ZHVwbGV4ID0gRFVQTEVYX0ZVTEw7Cit9CisKKy8qKgorICogaTQwZV9nZXRfc2V0dGluZ3NfbGlua19kb3duIC0gR2V0IHRoZSBMaW5rIHNldHRpbmdzIGZvciB3aGVuIGxpbmsgaXMgZG93bgorICogQGh3OiBodyBzdHJ1Y3R1cmUKKyAqIEBlY21kOiBldGh0b29sIGNvbW1hbmQgdG8gZmlsbCBpbgorICoKKyAqIFJlcG9ydHMgbGluayBzZXR0aW5ncyB0aGF0IGNhbiBiZSBkZXRlcm1pbmVkIHdoZW4gbGluayBpcyBkb3duCisgKiovCitzdGF0aWMgdm9pZCBpNDBlX2dldF9zZXR0aW5nc19saW5rX2Rvd24oc3RydWN0IGk0MGVfaHcgKmh3LAorCQkJCQlzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCit7CisJc3RydWN0IGk0MGVfbGlua19zdGF0dXMgKmh3X2xpbmtfaW5mbyA9ICZody0+cGh5LmxpbmtfaW5mbzsKKworCS8qIGxpbmsgaXMgZG93biBhbmQgdGhlIGRyaXZlciBuZWVkcyB0byBmYWxsIGJhY2sgb24KKwkgKiBkZXZpY2UgSUQgdG8gZGV0ZXJtaW5lIHdoYXQga2luZHMgb2YgaW5mbyB0byBkaXNwbGF5LAorCSAqIGl0J3MgbW9zdGx5IGEgZ3Vlc3MgdGhhdCBtYXkgY2hhbmdlIHdoZW4gbGluayBpcyB1cAorCSAqLworCXN3aXRjaCAoaHctPmRldmljZV9pZCkgeworCWNhc2UgSTQwRV9ERVZfSURfUVNGUF9BOgorCWNhc2UgSTQwRV9ERVZfSURfUVNGUF9COgorCWNhc2UgSTQwRV9ERVZfSURfUVNGUF9DOgorCQkvKiBwbHVnZ2FibGUgUVNGUCAqLworCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfNDAwMDBiYXNlU1I0X0Z1bGwgfAorCQkJCSAgU1VQUE9SVEVEXzQwMDAwYmFzZUNSNF9GdWxsIHwKKwkJCQkgIFNVUFBPUlRFRF80MDAwMGJhc2VMUjRfRnVsbDsKKwkJZWNtZC0+YWR2ZXJ0aXNpbmcgPSBBRFZFUlRJU0VEXzQwMDAwYmFzZVNSNF9GdWxsIHwKKwkJCQkgICAgQURWRVJUSVNFRF80MDAwMGJhc2VDUjRfRnVsbCB8CisJCQkJICAgIEFEVkVSVElTRURfNDAwMDBiYXNlTFI0X0Z1bGw7CisJCWJyZWFrOworCWNhc2UgSTQwRV9ERVZfSURfS1hfQjoKKwkJLyogYmFja3BsYW5lIDQwRyAqLworCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfNDAwMDBiYXNlS1I0X0Z1bGw7CisJCWVjbWQtPmFkdmVydGlzaW5nID0gQURWRVJUSVNFRF80MDAwMGJhc2VLUjRfRnVsbDsKKwkJYnJlYWs7CisJY2FzZSBJNDBFX0RFVl9JRF9LWF9DOgorCQkvKiBiYWNrcGxhbmUgMTBHICovCisJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsOworCQllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMTAwMDBiYXNlS1JfRnVsbDsKKwkJYnJlYWs7CisJY2FzZSBJNDBFX0RFVl9JRF8xMEdfQkFTRV9UOgorCQllY21kLT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfMTAwMDBiYXNlVF9GdWxsIHwKKwkJCQkgIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCB8CisJCQkJICBTVVBQT1JURURfMTAwYmFzZVRfRnVsbDsKKwkJLyogRmlndXJlIG91dCB3aGF0IGhhcyBiZWVuIHJlcXVlc3RlZCAqLworCQlpZiAoaHdfbGlua19pbmZvLT5yZXF1ZXN0ZWRfc3BlZWRzICYgSTQwRV9MSU5LX1NQRUVEXzEwR0IpCisJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDAwYmFzZVRfRnVsbDsKKwkJaWYgKGh3X2xpbmtfaW5mby0+cmVxdWVzdGVkX3NwZWVkcyAmIEk0MEVfTElOS19TUEVFRF8xR0IpCisJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsOworCQlpZiAoaHdfbGlua19pbmZvLT5yZXF1ZXN0ZWRfc3BlZWRzICYgSTQwRV9MSU5LX1NQRUVEXzEwME1CKQorCQkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOworCQlicmVhazsKKwljYXNlIEk0MEVfREVWX0lEXzIwR19LUjI6CisJCS8qIGJhY2twbGFuZSAyMEcgKi8KKwkJZWNtZC0+c3VwcG9ydGVkID0gU1VQUE9SVEVEXzIwMDAwYmFzZUtSMl9GdWxsOworCQllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfMjAwMDBiYXNlS1IyX0Z1bGw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGFsbCB0aGUgcmVzdCBhcmUgMTBHLzFHICovCisJCWVjbWQtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAorCQkJCSAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOworCQkvKiBGaWd1cmUgb3V0IHdoYXQgaGFzIGJlZW4gcmVxdWVzdGVkICovCisJCWlmIChod19saW5rX2luZm8tPnJlcXVlc3RlZF9zcGVlZHMgJiBJNDBFX0xJTktfU1BFRURfMTBHQikKKwkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMDBiYXNlVF9GdWxsOworCQlpZiAoaHdfbGlua19pbmZvLT5yZXF1ZXN0ZWRfc3BlZWRzICYgSTQwRV9MSU5LX1NQRUVEXzFHQikKKwkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CisJCWJyZWFrOworCX0KKworCS8qIFdpdGggbm8gbGluayBzcGVlZCBhbmQgZHVwbGV4IGFyZSB1bmtub3duICovCisJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGVjbWQsIFNQRUVEX1VOS05PV04pOworCWVjbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOworfQorCisvKioKKyAqIGk0MGVfZ2V0X3NldHRpbmdzIC0gR2V0IExpbmsgU3BlZWQgYW5kIER1cGxleCBzZXR0aW5ncworICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQorICogQGVjbWQ6IGV0aHRvb2wgY29tbWFuZAorICoKKyAqIFJlcG9ydHMgc3BlZWQvZHVwbGV4IHNldHRpbmdzIGJhc2VkIG9uIG1lZGlhX3R5cGUKKyAqKi8KK3N0YXRpYyBpbnQgaTQwZV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQoreworCXN0cnVjdCBpNDBlX25ldGRldl9wcml2ICpucCA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGk0MGVfcGYgKnBmID0gbnAtPnZzaS0+YmFjazsKKwlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmcGYtPmh3OworCXN0cnVjdCBpNDBlX2xpbmtfc3RhdHVzICpod19saW5rX2luZm8gPSAmaHctPnBoeS5saW5rX2luZm87CisJYm9vbCBsaW5rX3VwID0gaHdfbGlua19pbmZvLT5saW5rX2luZm8gJiBJNDBFX0FRX0xJTktfVVA7CisKKwlpZiAobGlua191cCkKKwkJaTQwZV9nZXRfc2V0dGluZ3NfbGlua191cChodywgZWNtZCwgbmV0ZGV2KTsKKwllbHNlCisJCWk0MGVfZ2V0X3NldHRpbmdzX2xpbmtfZG93bihodywgZWNtZCk7CisKKwkvKiBOb3cgc2V0IHRoZSBzZXR0aW5ncyB0aGF0IGRvbid0IHJlbHkgb24gbGluayBiZWluZyB1cC9kb3duICovCisKKwkvKiBTZXQgYXV0b25lZyBzZXR0aW5ncyAqLwogCWVjbWQtPmF1dG9uZWcgPSAoKGh3X2xpbmtfaW5mby0+YW5faW5mbyAmIEk0MEVfQVFfQU5fQ09NUExFVEVEKSA/CiAJCQkgIEFVVE9ORUdfRU5BQkxFIDogQVVUT05FR19ESVNBQkxFKTsKIApAQCAtNDI0LDExICs1MDUsMTMgQEAKIAkJYnJlYWs7CiAJfQogCisJLyogU2V0IHRyYW5zY2VpdmVyICovCiAJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0VYVEVSTkFMOwogCisJLyogU2V0IGZsb3cgY29udHJvbCBzZXR0aW5ncyAqLwogCWVjbWQtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfUGF1c2U7CiAKLQlzd2l0Y2ggKGh3LT5mYy5jdXJyZW50X21vZGUpIHsKKwlzd2l0Y2ggKGh3LT5mYy5yZXF1ZXN0ZWRfbW9kZSkgewogCWNhc2UgSTQwRV9GQ19GVUxMOgogCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX1BhdXNlOwogCQlicmVhazsKQEAgLTQ0NSwzMCArNTI4LDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKGxpbmtfdXApIHsKLQkJc3dpdGNoIChsaW5rX3NwZWVkKSB7Ci0JCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzQwR0I6Ci0JCQkvKiBuZWVkIGEgU1BFRURfNDAwMDAgaW4gZXRodG9vbC5oICovCi0JCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgNDAwMDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzEwR0I6Ci0JCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfMTAwMDApOwotCQkJYnJlYWs7Ci0JCWNhc2UgSTQwRV9MSU5LX1NQRUVEXzFHQjoKLQkJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBTUEVFRF8xMDAwKTsKLQkJCWJyZWFrOwotCQljYXNlIEk0MEVfTElOS19TUEVFRF8xMDBNQjoKLQkJCWV0aHRvb2xfY21kX3NwZWVkX3NldChlY21kLCBTUEVFRF8xMDApOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQllY21kLT5kdXBsZXggPSBEVVBMRVhfRlVMTDsKLQl9IGVsc2UgewotCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoZWNtZCwgU1BFRURfVU5LTk9XTik7Ci0JCWVjbWQtPmR1cGxleCA9IERVUExFWF9VTktOT1dOOwotCX0KLQogCXJldHVybiAwOwogfQogCkBAIC01ODgsNiArNjQ3LDggQEAKIAkgICAgYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDAwMGJhc2VLWDRfRnVsbCB8fAogCSAgICBhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMDAwYmFzZUtSX0Z1bGwpCiAJCWNvbmZpZy5saW5rX3NwZWVkIHw9IEk0MEVfTElOS19TUEVFRF8xMEdCOworCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzIwMDAwYmFzZUtSMl9GdWxsKQorCQljb25maWcubGlua19zcGVlZCB8PSBJNDBFX0xJTktfU1BFRURfMjBHQjsKIAlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF80MDAwMGJhc2VLUjRfRnVsbCB8fAogCSAgICBhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzQwMDAwYmFzZUNSNF9GdWxsIHx8CiAJICAgIGFkdmVydGlzZSAmIEFEVkVSVElTRURfNDAwMDBiYXNlU1I0X0Z1bGwgfHwKQEAgLTYwMSw2ICs2NjIsOCBAQAogCQljb25maWcuZWVlciA9IGFiaWxpdGllcy5lZWVyX3ZhbDsKIAkJY29uZmlnLmxvd19wb3dlcl9jdHJsID0gYWJpbGl0aWVzLmQzX2xwYW47CiAKKwkJLyogc2F2ZSB0aGUgcmVxdWVzdGVkIHNwZWVkcyAqLworCQlody0+cGh5LmxpbmtfaW5mby5yZXF1ZXN0ZWRfc3BlZWRzID0gY29uZmlnLmxpbmtfc3BlZWQ7CiAJCS8qIHNldCBsaW5rIGFuZCBhdXRvIG5lZ290aWF0aW9uIHNvIGNoYW5nZXMgdGFrZSBlZmZlY3QgKi8KIAkJY29uZmlnLmFiaWxpdGllcyB8PSBJNDBFX0FRX1BIWV9FTkFCTEVfQVRPTUlDX0xJTks7CiAJCS8qIElmIGxpbmsgaXMgdXAgcHV0IGxpbmsgZG93biAqLwpAQCAtNjIxLDcgKzY4NCw3IEBACiAJCQlyZXR1cm4gLUVBR0FJTjsKIAkJfQogCi0JCXN0YXR1cyA9IGk0MGVfdXBkYXRlX2xpbmtfaW5mbyhodywgdHJ1ZSk7CisJCXN0YXR1cyA9IGk0MGVfYXFfZ2V0X2xpbmtfaW5mbyhodywgdHJ1ZSwgTlVMTCwgTlVMTCk7CiAJCWlmIChzdGF0dXMpCiAJCQluZXRkZXZfaW5mbyhuZXRkZXYsICJVcGRhdGluZyBsaW5rIGluZm8gZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsCiAJCQkJICAgIHN0YXR1cyk7CkBAIC03NjcsNyArODMwLDcgQEAKIAkJZXJyID0gLUVBR0FJTjsKIAl9CiAJaWYgKGFxX2ZhaWx1cmVzICYgSTQwRV9TRVRfRkNfQVFfRkFJTF9VUERBVEUpIHsKLQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiU2V0IGZjIGZhaWxlZCBvbiB0aGUgdXBkYXRlX2xpbmtfaW5mbyBjYWxsIHdpdGggZXJyb3IgJWQgYW5kIHN0YXR1cyAlZFxuIiwKKwkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiU2V0IGZjIGZhaWxlZCBvbiB0aGUgZ2V0X2xpbmtfaW5mbyBjYWxsIHdpdGggZXJyb3IgJWQgYW5kIHN0YXR1cyAlZFxuIiwKIAkJCSAgICBzdGF0dXMsIGh3LT5hcS5hc3FfbGFzdF9zdGF0dXMpOwogCQllcnIgPSAtRUFHQUlOOwogCX0KQEAgLTg3MCw3ICs5MzMsOSBAQAogCiAJCWNtZCA9IChzdHJ1Y3QgaTQwZV9udm1fYWNjZXNzICopZWVwcm9tOwogCQlyZXRfdmFsID0gaTQwZV9udm11cGRfY29tbWFuZChodywgY21kLCBieXRlcywgJmVycm5vKTsKLQkJaWYgKHJldF92YWwpCisJCWlmIChyZXRfdmFsICYmCisJCSAgICAoKGh3LT5hcS5hc3FfbGFzdF9zdGF0dXMgIT0gSTQwRV9BUV9SQ19FQUNDRVMpIHx8CisJCSAgICAgKGh3LT5kZWJ1Z19tYXNrICYgSTQwRV9ERUJVR19OVk0pKSkKIAkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAogCQkJCSAiTlZNVXBkYXRlIHJlYWQgZmFpbGVkIGVycj0lZCBzdGF0dXM9MHgleCBlcnJubz0lZCBtb2R1bGU9JWQgb2Zmc2V0PTB4JXggc2l6ZT0lZFxuIiwKIAkJCQkgcmV0X3ZhbCwgaHctPmFxLmFzcV9sYXN0X3N0YXR1cywgZXJybm8sCkBAIC05NzQsNyArMTAzOSwxMCBAQAogCiAJY21kID0gKHN0cnVjdCBpNDBlX252bV9hY2Nlc3MgKillZXByb207CiAJcmV0X3ZhbCA9IGk0MGVfbnZtdXBkX2NvbW1hbmQoaHcsIGNtZCwgYnl0ZXMsICZlcnJubyk7Ci0JaWYgKHJldF92YWwgJiYgaHctPmFxLmFzcV9sYXN0X3N0YXR1cyAhPSBJNDBFX0FRX1JDX0VCVVNZKQorCWlmIChyZXRfdmFsICYmCisJICAgICgoaHctPmFxLmFzcV9sYXN0X3N0YXR1cyAhPSBJNDBFX0FRX1JDX0VQRVJNICYmCisJICAgICAgaHctPmFxLmFzcV9sYXN0X3N0YXR1cyAhPSBJNDBFX0FRX1JDX0VCVVNZKSB8fAorCSAgICAgKGh3LT5kZWJ1Z19tYXNrICYgSTQwRV9ERUJVR19OVk0pKSkKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCiAJCQkgIk5WTVVwZGF0ZSB3cml0ZSBmYWlsZWQgZXJyPSVkIHN0YXR1cz0weCV4IGVycm5vPSVkIG1vZHVsZT0lZCBvZmZzZXQ9MHgleCBzaXplPSVkXG4iLAogCQkJIHJldF92YWwsIGh3LT5hcS5hc3FfbGFzdF9zdGF0dXMsIGVycm5vLApAQCAtOTk4LDYgKzEwNjYsNyBAQAogCQlzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbikpOwogCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHBmLT5wZGV2KSwKIAkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CisJZHJ2aW5mby0+bl9wcml2X2ZsYWdzID0gSTQwRV9QUklWX0ZMQUdTX1NUUl9MRU47CiB9CiAKIHN0YXRpYyB2b2lkIGk0MGVfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LApAQCAtMTE3Niw3ICsxMjQ1LDcgQEAKIAljYXNlIEVUSF9TU19URVNUOgogCQlyZXR1cm4gSTQwRV9URVNUX0xFTjsKIAljYXNlIEVUSF9TU19TVEFUUzoKLQkJaWYgKHZzaSA9PSBwZi0+dnNpW3BmLT5sYW5fdnNpXSkgeworCQlpZiAodnNpID09IHBmLT52c2lbcGYtPmxhbl92c2ldICYmIHBmLT5ody5wYXJ0aXRpb25faWQgPT0gMSkgewogCQkJaW50IGxlbiA9IEk0MEVfUEZfU1RBVFNfTEVOKG5ldGRldik7CiAKIAkJCWlmIChwZi0+bGFuX3ZlYiAhPSBJNDBFX05PX1ZFQikKQEAgLTExODUsNiArMTI1NCw4IEBACiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gSTQwRV9WU0lfU1RBVFNfTEVOKG5ldGRldik7CiAJCX0KKwljYXNlIEVUSF9TU19QUklWX0ZMQUdTOgorCQlyZXR1cm4gSTQwRV9QUklWX0ZMQUdTX1NUUl9MRU47CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KQEAgLTEyNDcsNyArMTMxOCw3IEBACiAJCWkgKz0gMjsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JaWYgKHZzaSAhPSBwZi0+dnNpW3BmLT5sYW5fdnNpXSkKKwlpZiAodnNpICE9IHBmLT52c2lbcGYtPmxhbl92c2ldIHx8IHBmLT5ody5wYXJ0aXRpb25faWQgIT0gMSkKIAkJcmV0dXJuOwogCiAJaWYgKHBmLT5sYW5fdmViICE9IEk0MEVfTk9fVkVCKSB7CkBAIC0xMzIwLDcgKzEzOTEsNyBAQAogCQkJc25wcmludGYocCwgRVRIX0dTVFJJTkdfTEVOLCAicngtJXUucnhfYnl0ZXMiLCBpKTsKIAkJCXAgKz0gRVRIX0dTVFJJTkdfTEVOOwogCQl9Ci0JCWlmICh2c2kgIT0gcGYtPnZzaVtwZi0+bGFuX3ZzaV0pCisJCWlmICh2c2kgIT0gcGYtPnZzaVtwZi0+bGFuX3ZzaV0gfHwgcGYtPmh3LnBhcnRpdGlvbl9pZCAhPSAxKQogCQkJcmV0dXJuOwogCiAJCWlmIChwZi0+bGFuX3ZlYiAhPSBJNDBFX05PX1ZFQikgewpAQCAtMTM1OCw2ICsxNDI5LDE1IEBACiAJCX0KIAkJLyogQlVHX09OKHAgLSBkYXRhICE9IEk0MEVfU1RBVFNfTEVOICogRVRIX0dTVFJJTkdfTEVOKTsgKi8KIAkJYnJlYWs7CisJY2FzZSBFVEhfU1NfUFJJVl9GTEFHUzoKKwkJZm9yIChpID0gMDsgaSA8IEk0MEVfUFJJVl9GTEFHU19TVFJfTEVOOyBpKyspIHsKKwkJCW1lbWNweShkYXRhLCBpNDBlX3ByaXZfZmxhZ3Nfc3RyaW5nc1tpXSwKKwkJCSAgICAgICBFVEhfR1NUUklOR19MRU4pOworCQkJZGF0YSArPSBFVEhfR1NUUklOR19MRU47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogfQogCkBAIC0xNDczLDYgKzE1NTMsNyBAQAogCQkJICAgc3RydWN0IGV0aHRvb2xfdGVzdCAqZXRoX3Rlc3QsIHU2NCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaTQwZV9uZXRkZXZfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWJvb2wgaWZfcnVubmluZyA9IG5ldGlmX3J1bm5pbmcobmV0ZGV2KTsKIAlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSBucC0+dnNpLT5iYWNrOwogCiAJaWYgKGV0aF90ZXN0LT5mbGFncyA9PSBFVEhfVEVTVF9GTF9PRkZMSU5FKSB7CkBAIC0xNDgwLDYgKzE1NjEsMTIgQEAKIAkJbmV0aWZfaW5mbyhwZiwgZHJ2LCBuZXRkZXYsICJvZmZsaW5lIHRlc3Rpbmcgc3RhcnRpbmdcbiIpOwogCiAJCXNldF9iaXQoX19JNDBFX1RFU1RJTkcsICZwZi0+c3RhdGUpOworCQkvKiBJZiB0aGUgZGV2aWNlIGlzIG9ubGluZSB0aGVuIHRha2UgaXQgb2ZmbGluZSAqLworCQlpZiAoaWZfcnVubmluZykKKwkJCS8qIGluZGljYXRlIHdlJ3JlIGluIHRlc3QgbW9kZSAqLworCQkJZGV2X2Nsb3NlKG5ldGRldik7CisJCWVsc2UKKwkJCWk0MGVfZG9fcmVzZXQocGYsICgxIDw8IF9fSTQwRV9QRl9SRVNFVF9SRVFVRVNURUQpKTsKIAogCQkvKiBMaW5rIHRlc3QgcGVyZm9ybWVkIGJlZm9yZSBoYXJkd2FyZSByZXNldAogCQkgKiBzbyBhdXRvbmVnIGRvZXNuJ3QgaW50ZXJmZXJlIHdpdGggdGVzdCByZXN1bHQKQEAgLTE1MDIsNiArMTU4OSw5IEBACiAKIAkJY2xlYXJfYml0KF9fSTQwRV9URVNUSU5HLCAmcGYtPnN0YXRlKTsKIAkJaTQwZV9kb19yZXNldChwZiwgKDEgPDwgX19JNDBFX1BGX1JFU0VUX1JFUVVFU1RFRCkpOworCisJCWlmIChpZl9ydW5uaW5nKQorCQkJZGV2X29wZW4obmV0ZGV2KTsKIAl9IGVsc2UgewogCQkvKiBPbmxpbmUgdGVzdHMgKi8KIAkJbmV0aWZfaW5mbyhwZiwgZHJ2LCBuZXRkZXYsICJvbmxpbmUgdGVzdGluZyBzdGFydGluZ1xuIik7CkBAIC0xNTk5LDYgKzE2ODksOCBAQAogCWNhc2UgRVRIVE9PTF9JRF9JTkFDVElWRToKIAkJaTQwZV9sZWRfc2V0KGh3LCBwZi0+bGVkX3N0YXR1cywgZmFsc2UpOwogCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTE3MDMsNiArMTc5NSwxMSBAQAogewogCWNtZC0+ZGF0YSA9IDA7CiAKKwlpZiAocGYtPnZzaVtwZi0+bGFuX3ZzaV0tPnJ4bmZjLmRhdGEgIT0gMCkgeworCQljbWQtPmRhdGEgPSBwZi0+dnNpW3BmLT5sYW5fdnNpXS0+cnhuZmMuZGF0YTsKKwkJY21kLT5mbG93X3R5cGUgPSBwZi0+dnNpW3BmLT5sYW5fdnNpXS0+cnhuZmMuZmxvd190eXBlOworCQlyZXR1cm4gMDsKKwl9CiAJLyogUmVwb3J0IGRlZmF1bHQgb3B0aW9ucyBmb3IgUlNTIG9uIGk0MGUgKi8KIAlzd2l0Y2ggKGNtZC0+Zmxvd190eXBlKSB7CiAJY2FzZSBUQ1BfVjRfRkxPVzoKQEAgLTE5NzQsNiArMjA3MSw5IEBACiAJd3IzMihodywgSTQwRV9QRlFGX0hFTkEoMSksICh1MzIpKGhlbmEgPj4gMzIpKTsKIAlpNDBlX2ZsdXNoKGh3KTsKIAorCS8qIFNhdmUgc2V0dGluZyBmb3IgZnV0dXJlIG91dHB1dC91cGRhdGUgKi8KKwlwZi0+dnNpW3BmLT5sYW5fdnNpXS0+cnhuZmMgPSAqbmZjOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIyODEsMTAgKzIzODEsNiBAQAogCS8qIHVwZGF0ZSBmZWF0dXJlIGxpbWl0cyBmcm9tIGxhcmdlc3QgdG8gc21hbGxlc3Qgc3VwcG9ydGVkIHZhbHVlcyAqLwogCS8qIFRPRE86IEZsb3cgZGlyZWN0b3IgbGltaXQsIERDQiBldGMgKi8KIAotCS8qIGNhcCBSU1MgbGltaXQgKi8KLQlpZiAoY291bnQgPiBwZi0+cnNzX3NpemVfbWF4KQotCQljb3VudCA9IHBmLT5yc3Nfc2l6ZV9tYXg7Ci0KIAkvKiB1c2UgcnNzX3JlY29uZmlnIHRvIHJlYnVpbGQgd2l0aCBuZXcgcXVldWUgY291bnQgYW5kIHVwZGF0ZSB0cmFmZmljCiAJICogY2xhc3MgcXVldWUgbWFwcGluZwogCSAqLwpAQCAtMjI5NSw2ICsyMzkxLDEzMyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIH0KIAorI2RlZmluZSBJNDBFX0hMVVRfQVJSQVlfU0laRSAoKEk0MEVfUEZRRl9ITFVUX01BWF9JTkRFWCArIDEpICogNCkKKy8qKgorICogaTQwZV9nZXRfcnhmaF9rZXlfc2l6ZSAtIGdldCB0aGUgUlNTIGhhc2gga2V5IHNpemUKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIHRoZSB0YWJsZSBzaXplLgorICoqLworc3RhdGljIHUzMiBpNDBlX2dldF9yeGZoX2tleV9zaXplKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmV0dXJuIEk0MEVfSEtFWV9BUlJBWV9TSVpFOworfQorCisvKioKKyAqIGk0MGVfZ2V0X3J4ZmhfaW5kaXJfc2l6ZSAtIGdldCB0aGUgcnggZmxvdyBoYXNoIGluZGlyZWN0aW9uIHRhYmxlIHNpemUKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBSZXR1cm5zIHRoZSB0YWJsZSBzaXplLgorICoqLworc3RhdGljIHUzMiBpNDBlX2dldF9yeGZoX2luZGlyX3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gSTQwRV9ITFVUX0FSUkFZX1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgaTQwZV9nZXRfcnhmaChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgKmluZGlyLCB1OCAqa2V5LAorCQkJIHU4ICpoZnVuYykKK3sKKwlzdHJ1Y3QgaTQwZV9uZXRkZXZfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gbnAtPnZzaTsKKwlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7CisJc3RydWN0IGk0MGVfaHcgKmh3ID0gJnBmLT5odzsKKwl1MzIgcmVnX3ZhbDsKKwlpbnQgaSwgajsKKworCWlmIChoZnVuYykKKwkJKmhmdW5jID0gRVRIX1JTU19IQVNIX1RPUDsKKworCWlmICghaW5kaXIpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMCwgaiA9IDA7IGkgPD0gSTQwRV9QRlFGX0hMVVRfTUFYX0lOREVYOyBpKyspIHsKKwkJcmVnX3ZhbCA9IHJkMzIoaHcsIEk0MEVfUEZRRl9ITFVUKGkpKTsKKwkJaW5kaXJbaisrXSA9IHJlZ192YWwgJiAweGZmOworCQlpbmRpcltqKytdID0gKHJlZ192YWwgPj4gOCkgJiAweGZmOworCQlpbmRpcltqKytdID0gKHJlZ192YWwgPj4gMTYpICYgMHhmZjsKKwkJaW5kaXJbaisrXSA9IChyZWdfdmFsID4+IDI0KSAmIDB4ZmY7CisJfQorCisJaWYgKGtleSkgeworCQlmb3IgKGkgPSAwLCBqID0gMDsgaSA8PSBJNDBFX1BGUUZfSEtFWV9NQVhfSU5ERVg7IGkrKykgeworCQkJcmVnX3ZhbCA9IHJkMzIoaHcsIEk0MEVfUEZRRl9IS0VZKGkpKTsKKwkJCWtleVtqKytdID0gKHU4KShyZWdfdmFsICYgMHhmZik7CisJCQlrZXlbaisrXSA9ICh1OCkoKHJlZ192YWwgPj4gOCkgJiAweGZmKTsKKwkJCWtleVtqKytdID0gKHU4KSgocmVnX3ZhbCA+PiAxNikgJiAweGZmKTsKKwkJCWtleVtqKytdID0gKHU4KSgocmVnX3ZhbCA+PiAyNCkgJiAweGZmKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpNDBlX3NldF9yeGZoIC0gc2V0IHRoZSByeCBmbG93IGhhc2ggaW5kaXJlY3Rpb24gdGFibGUKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIEBpbmRpcjogaW5kaXJlY3Rpb24gdGFibGUKKyAqIEBrZXk6IGhhc2gga2V5CisgKgorICogUmV0dXJucyAtRUlOVkFMIGlmIHRoZSB0YWJsZSBzcGVjaWZpZXMgYW4gaW5hdmxpZCBxdWV1ZSBpZCwgb3RoZXJ3aXNlCisgKiByZXR1cm5zIDAgYWZ0ZXIgcHJvZ3JhbW1pbmcgdGhlIHRhYmxlLgorICoqLworc3RhdGljIGludCBpNDBlX3NldF9yeGZoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGNvbnN0IHUzMiAqaW5kaXIsCisJCQkgY29uc3QgdTggKmtleSwgY29uc3QgdTggaGZ1bmMpCit7CisJc3RydWN0IGk0MGVfbmV0ZGV2X3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9IG5wLT52c2k7CisJc3RydWN0IGk0MGVfcGYgKnBmID0gdnNpLT5iYWNrOworCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7CisJdTMyIHJlZ192YWw7CisJaW50IGksIGo7CisKKwlpZiAoaGZ1bmMgIT0gRVRIX1JTU19IQVNIX05PX0NIQU5HRSAmJiBoZnVuYyAhPSBFVEhfUlNTX0hBU0hfVE9QKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIWluZGlyKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDAsIGogPSAwOyBpIDw9IEk0MEVfUEZRRl9ITFVUX01BWF9JTkRFWDsgaSsrKSB7CisJCXJlZ192YWwgPSBpbmRpcltqKytdOworCQlyZWdfdmFsIHw9IGluZGlyW2orK10gPDwgODsKKwkJcmVnX3ZhbCB8PSBpbmRpcltqKytdIDw8IDE2OworCQlyZWdfdmFsIHw9IGluZGlyW2orK10gPDwgMjQ7CisJCXdyMzIoaHcsIEk0MEVfUEZRRl9ITFVUKGkpLCByZWdfdmFsKTsKKwl9CisKKwlpZiAoa2V5KSB7CisJCWZvciAoaSA9IDAsIGogPSAwOyBpIDw9IEk0MEVfUEZRRl9IS0VZX01BWF9JTkRFWDsgaSsrKSB7CisJCQlyZWdfdmFsID0ga2V5W2orK107CisJCQlyZWdfdmFsIHw9IGtleVtqKytdIDw8IDg7CisJCQlyZWdfdmFsIHw9IGtleVtqKytdIDw8IDE2OworCQkJcmVnX3ZhbCB8PSBrZXlbaisrXSA8PCAyNDsKKwkJCXdyMzIoaHcsIEk0MEVfUEZRRl9IS0VZKGkpLCByZWdfdmFsKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpNDBlX2dldF9wcml2X2ZsYWdzIC0gcmVwb3J0IGRldmljZSBwcml2YXRlIGZsYWdzCisgKiBAZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogVGhlIGdldCBzdHJpbmcgc2V0IGNvdW50IGFuZCB0aGUgc3RyaW5nIHNldCBzaG91bGQgYmUgbWF0Y2hlZCBmb3IgZWFjaAorICogZmxhZyByZXR1cm5lZC4gIEFkZCBuZXcgc3RyaW5ncyBmb3IgZWFjaCBmbGFnIHRvIHRoZSBpNDBlX3ByaXZfZmxhZ3Nfc3RyaW5ncworICogYXJyYXkuCisgKgorICogUmV0dXJucyBhIHUzMiBiaXRtYXAgb2YgZmxhZ3MuCisgKiovCitzdGF0aWMgdTMyIGk0MGVfZ2V0X3ByaXZfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTQwZV9uZXRkZXZfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gbnAtPnZzaTsKKwlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7CisJdTMyIHJldF9mbGFncyA9IDA7CisKKwlyZXRfZmxhZ3MgfD0gcGYtPmh3LmZ1bmNfY2Fwcy5ucGFyX2VuYWJsZSA/CisJCUk0MEVfUFJJVl9GTEFHU19OUEFSX0ZMQUcgOiAwOworCisJcmV0dXJuIHJldF9mbGFnczsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBpNDBlX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MJCT0gaTQwZV9nZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncwkJPSBpNDBlX3NldF9zZXR0aW5ncywKQEAgLTIzMjMsOSArMjU0NiwxNCBAQAogCS5nZXRfZXRodG9vbF9zdGF0cwk9IGk0MGVfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9jb2FsZXNjZQkJPSBpNDBlX2dldF9jb2FsZXNjZSwKIAkuc2V0X2NvYWxlc2NlCQk9IGk0MGVfc2V0X2NvYWxlc2NlLAorCS5nZXRfcnhmaF9rZXlfc2l6ZQk9IGk0MGVfZ2V0X3J4Zmhfa2V5X3NpemUsCisJLmdldF9yeGZoX2luZGlyX3NpemUJPSBpNDBlX2dldF9yeGZoX2luZGlyX3NpemUsCisJLmdldF9yeGZoCQk9IGk0MGVfZ2V0X3J4ZmgsCisJLnNldF9yeGZoCQk9IGk0MGVfc2V0X3J4ZmgsCiAJLmdldF9jaGFubmVscwkJPSBpNDBlX2dldF9jaGFubmVscywKIAkuc2V0X2NoYW5uZWxzCQk9IGk0MGVfc2V0X2NoYW5uZWxzLAogCS5nZXRfdHNfaW5mbwkJPSBpNDBlX2dldF90c19pbmZvLAorCS5nZXRfcHJpdl9mbGFncwkJPSBpNDBlX2dldF9wcml2X2ZsYWdzLAogfTsKIAogdm9pZCBpNDBlX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2Zjb2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9mY29lLmMKaW5kZXggMjdjMjA2ZS4uMTgwM2FmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2Zjb2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZmNvZS5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBJbnRlbCBFdGhlcm5ldCBDb250cm9sbGVyIFhMNzEwIEZhbWlseSBMaW51eCBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTI0LDcgKzI0LDYgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RldmljZS5oPgpAQCAtMTUwLDcgKzE0OSw3IEBACiAKIC8qKgogICogaTQwZV9mY29lX2RkcF91bm1hcCAtIHVubWFwIHRoZSBtYXBwZWQgc2dsaXN0IGFzc29jaWF0ZWQKLSAqIEBwZjogcG9pbnRlciB0byBwZgorICogQHBmOiBwb2ludGVyIHRvIFBGCiAgKiBAZGRwOiBzdyBERFAgY29udGV4dAogICoKICAqIFVubWFwIHRoZSBzY2F0dGVyLWdhdGhlciBsaXN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gU1cgRERQIGNvbnRleHQKQEAgLTI2OSw3ICsyNjgsNyBAQAogCiAvKioKICAqIGk0MGVfZmNvZV9zd19pbml0IC0gc2V0cyB1cCB0aGUgSFcgZm9yIEZDb0UKLSAqIEBwZjogcG9pbnRlciB0byBwZgorICogQHBmOiBwb2ludGVyIHRvIFBGCiAgKgogICogUmV0dXJucyAwIGlmIEZDb0UgaXMgc3VwcG9ydGVkIG90aGVyd2lzZSB0aGUgZXJyb3IgY29kZQogICoqLwpAQCAtMzI5LDcgKzMyOCw3IEBACiAKIC8qKgogICogaTQwZV9nZXRfZmNvZV90Y19tYXAgLSBSZXR1cm4gVEMgbWFwIGZvciBGQ29FIEFQUAotICogQHBmOiBwb2ludGVyIHRvIHBmCisgKiBAcGY6IHBvaW50ZXIgdG8gUEYKICAqCiAgKiovCiB1OCBpNDBlX2dldF9mY29lX3RjX21hcChzdHJ1Y3QgaTQwZV9wZiAqcGYpCkBAIC0zODEsMTIgKzM4MCwxMSBAQAogCWN0eHQtPnBmX251bSA9IGh3LT5wZl9pZDsKIAljdHh0LT52Zl9udW0gPSAwOwogCWN0eHQtPnVwbGlua19zZWlkID0gdnNpLT51cGxpbmtfc2VpZDsKLQljdHh0LT5jb25uZWN0aW9uX3R5cGUgPSAweDE7CisJY3R4dC0+Y29ubmVjdGlvbl90eXBlID0gSTQwRV9BUV9WU0lfQ09OTl9UWVBFX05PUk1BTDsKIAljdHh0LT5mbGFncyA9IEk0MEVfQVFfVlNJX1RZUEVfUEY7CiAKIAkvKiBGQ29FIFZTSSB3b3VsZCBuZWVkIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgKi8KLQlpbmZvLT52YWxpZF9zZWN0aW9ucyB8PSBjcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9QUk9QX1NXSVRDSF9WQUxJRCB8Ci0JCQkJCSAgICBJNDBFX0FRX1ZTSV9QUk9QX1FVRVVFX09QVF9WQUxJRCk7CisJaW5mby0+dmFsaWRfc2VjdGlvbnMgfD0gY3B1X3RvX2xlMTYoSTQwRV9BUV9WU0lfUFJPUF9RVUVVRV9PUFRfVkFMSUQpOwogCiAJLyogRkNvRSBWU0kgZG9lcyBub3QgbmVlZCB0aGVzZSBzZWN0aW9ucyAqLwogCWluZm8tPnZhbGlkX3NlY3Rpb25zICY9IGNwdV90b19sZTE2KH4oSTQwRV9BUV9WU0lfUFJPUF9TRUNVUklUWV9WQUxJRCB8CkBAIC0zOTUsNyArMzkzLDEyIEBACiAJCQkJCSAgICBJNDBFX0FRX1ZTSV9QUk9QX0lOR1JFU1NfVVBfVkFMSUQgfAogCQkJCQkgICAgSTQwRV9BUV9WU0lfUFJPUF9FR1JFU1NfVVBfVkFMSUQpKTsKIAotCWluZm8tPnN3aXRjaF9pZCA9IGNwdV90b19sZTE2KEk0MEVfQVFfVlNJX1NXX0lEX0ZMQUdfQUxMT1dfTEIpOworCWlmIChpNDBlX2lzX3ZzaV91cGxpbmtfbW9kZV92ZWIodnNpKSkgeworCQlpbmZvLT52YWxpZF9zZWN0aW9ucyB8PQorCQkJCWNwdV90b19sZTE2KEk0MEVfQVFfVlNJX1BST1BfU1dJVENIX1ZBTElEKTsKKwkJaW5mby0+c3dpdGNoX2lkID0KKwkJCQljcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9TV19JRF9GTEFHX0FMTE9XX0xCKTsKKwl9CiAJZW5hYmxlZF90YyA9IGk0MGVfZ2V0X2Zjb2VfdGNfbWFwKHBmKTsKIAlpNDBlX3ZzaV9zZXR1cF9xdWV1ZV9tYXAodnNpLCBjdHh0LCBlbmFibGVkX3RjLCB0cnVlKTsKIApAQCAtMTMwMyw4ICsxMzA2LDcgQEAKIAkvKiBNQUNMRU4gaXMgZXRoZXIgaGVhZGVyIGxlbmd0aCBpbiB3b3JkcyBub3QgYnl0ZXMgKi8KIAl0ZF9vZmZzZXQgfD0gKG1hY2xlbiA+PiAxKSA8PCBJNDBFX1RYX0RFU0NfTEVOR1RIX01BQ0xFTl9TSElGVDsKIAotCXJldHVybiBpNDBlX3R4X21hcCh0eF9yaW5nLCBza2IsIGZpcnN0LCB0eF9mbGFncywgaGRyX2xlbiwKLQkJCSAgIHRkX2NtZCwgdGRfb2Zmc2V0KTsKKwlpNDBlX3R4X21hcCh0eF9yaW5nLCBza2IsIGZpcnN0LCB0eF9mbGFncywgaGRyX2xlbiwgdGRfY21kLCB0ZF9vZmZzZXQpOwogfQogCiAvKioKQEAgLTE0NDMsNyArMTQ0NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpNDBlX2Zjb2VfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gaTQwZV9vcGVuLAogCS5uZG9fc3RvcAkJPSBpNDBlX2Nsb3NlLApAQCAtMTQ3MCw2ICsxNDcxLDExIEBACiAJLm5kb19zZXRfZmVhdHVyZXMJPSBpNDBlX2Zjb2Vfc2V0X2ZlYXR1cmVzLAogfTsKIAorLyogZmNvZSBuZXR3b3JrIGRldmljZSB0eXBlICovCitzdGF0aWMgc3RydWN0IGRldmljZV90eXBlIGZjb2VfbmV0ZGV2X3R5cGUgPSB7CisJLm5hbWUgPSAiZmNvZSIsCit9OworCiAvKioKICAqIGk0MGVfZmNvZV9jb25maWdfbmV0ZGV2IC0gcHJlcGFyZXMgdGhlIFZTSSBjb250ZXh0IGZvciBjcmVhdGluZyBhIEZDb0UgVlNJCiAgKiBAdnNpOiBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIFZTSSBzdHJ1Y3QKQEAgLTE1MDMsNiArMTUwOSw3IEBACiAJc3RybGNweShuZXRkZXYtPm5hbWUsICJmY29lJWQiLCBJRk5BTVNJWi0xKTsKIAluZXRkZXYtPm10dSA9IEZDT0VfTVRVOwogCVNFVF9ORVRERVZfREVWKG5ldGRldiwgJnBmLT5wZGV2LT5kZXYpOworCVNFVF9ORVRERVZfREVWVFlQRShuZXRkZXYsICZmY29lX25ldGRldl90eXBlKTsKIAkvKiBzZXQgZGlmZmVyZW50IGRldl9wb3J0IHZhbHVlIDEgZm9yIEZDb0UgbmV0ZGV2IHRoYW4gdGhlIGRlZmF1bHQKIAkgKiB6ZXJvIGRldl9wb3J0IHZhbHVlIGZvciBQRiBuZXRkZXYsIHRoaXMgaGVscHMgYmlvc2Rldm5hbWUgdXNlcgogCSAqIHRvb2wgdG8gZGlmZmVyZW50aWF0ZSB0aGVtIGNvcnJlY3RseSB3aGlsZSBib3RoIGF0dGFjaGVkIHRvIHRoZQpAQCAtMTUyMyw3ICsxNTMwLDcgQEAKIAogLyoqCiAgKiBpNDBlX2Zjb2VfdnNpX3NldHVwIC0gYWxsb2NhdGUgYW5kIHNldCB1cCBGQ29FIFZTSQotICogQHBmOiB0aGUgcGYgdGhhdCBWU0kgaXMgYXNzb2NpYXRlZCB3aXRoCisgKiBAcGY6IHRoZSBQRiB0aGF0IFZTSSBpcyBhc3NvY2lhdGVkIHdpdGgKICAqCiAgKiovCiB2b2lkIGk0MGVfZmNvZV92c2lfc2V0dXAoc3RydWN0IGk0MGVfcGYgKnBmKQpAQCAtMTU1MCw3ICsxNTU3LDcgQEAKIAl2c2kgPSBpNDBlX3ZzaV9zZXR1cChwZiwgSTQwRV9WU0lfRkNPRSwgc2VpZCwgMCk7CiAJaWYgKHZzaSkgewogCQlkZXZfZGJnKCZwZi0+cGRldi0+ZGV2LAotCQkJIlN1Y2Nlc3NmdWxseSBjcmVhdGVkIEZDb0UgVlNJIHNlaWQgJWQgaWQgJWQgdXBsaW5rX3NlaWQgJWQgcGYgc2VpZCAlZFxuIiwKKwkJCSJTdWNjZXNzZnVsbHkgY3JlYXRlZCBGQ29FIFZTSSBzZWlkICVkIGlkICVkIHVwbGlua19zZWlkICVkIFBGIHNlaWQgJWRcbiIsCiAJCQl2c2ktPnNlaWQsIHZzaS0+aWQsIHZzaS0+dXBsaW5rX3NlaWQsIHNlaWQpOwogCX0gZWxzZSB7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBGQ29FIFZTSVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZmNvZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2Zjb2UuaAppbmRleCAyMWUwZjU4Li4wZDQ5ZTJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfZmNvZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9mY29lLmgKQEAgLTM3LDcgKzM3LDYgQEAKICNkZWZpbmUgSTQwRV9GSUxURVJfQ09OVEVYVF9ERVNDKFIsIGkpICBcCiAJKCYoKChzdHJ1Y3QgaTQwZV9mY29lX2ZpbHRlcl9jb250ZXh0X2Rlc2MgKikoKFIpLT5kZXNjKSlbaV0pKQogCi0KIC8qIHJlY2VpdmUgcXVldWUgZGVzY3JpcHRvciBmaWx0ZXIgc3RhdHVzIGZvciBGQ29FICovCiAjZGVmaW5lIEk0MEVfUlhfREVTQ19GTFRTVEFUX0ZDTUFTSwkweDMKICNkZWZpbmUgSTQwRV9SWF9ERVNDX0ZMVFNUQVRfTk9NVENICTB4MAkvKiBubyBkZHAgY29udGV4dCBtYXRjaCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2xhbl9obWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9sYW5faG1jLmMKaW5kZXggNDYyNzU4OC4uMDA3OWFkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX2xhbl9obWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbGFuX2htYy5jCkBAIC04NTYsNyArODU2LDcgQEAKIAlpZiAoY2VfaW5mby0+d2lkdGggPCAzMikKIAkJbWFzayA9ICgodTMyKTEgPDwgY2VfaW5mby0+d2lkdGgpIC0gMTsKIAllbHNlCi0JCW1hc2sgPSAweEZGRkZGRkZGOworCQltYXNrID0gfih1MzIpMDsKIAogCS8qIGRvbid0IHN3aXp6bGUgdGhlIGJpdHMgdW50aWwgYWZ0ZXIgdGhlIG1hc2sgYmVjYXVzZSB0aGUgbWFzayBiaXRzCiAJICogd2lsbCBiZSBpbiBhIGRpZmZlcmVudCBiaXQgcG9zaXRpb24gb24gYmlnIGVuZGlhbiBtYWNoaW5lcwpAQCAtOTA4LDcgKzkwOCw3IEBACiAJaWYgKGNlX2luZm8tPndpZHRoIDwgNjQpCiAJCW1hc2sgPSAoKHU2NCkxIDw8IGNlX2luZm8tPndpZHRoKSAtIDE7CiAJZWxzZQotCQltYXNrID0gMHhGRkZGRkZGRkZGRkZGRkZGOworCQltYXNrID0gfih1NjQpMDsKIAogCS8qIGRvbid0IHN3aXp6bGUgdGhlIGJpdHMgdW50aWwgYWZ0ZXIgdGhlIG1hc2sgYmVjYXVzZSB0aGUgbWFzayBiaXRzCiAJICogd2lsbCBiZSBpbiBhIGRpZmZlcmVudCBiaXQgcG9zaXRpb24gb24gYmlnIGVuZGlhbiBtYWNoaW5lcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9tYWluLmMKaW5kZXggZGFkZGEzYy4uNjNkZTNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbWFpbi5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBJbnRlbCBFdGhlcm5ldCBDb250cm9sbGVyIFhMNzEwIEZhbWlseSBMaW51eCBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTM4LDggKzM4LDggQEAKICNkZWZpbmUgRFJWX0tFUk4gIi1rIgogCiAjZGVmaW5lIERSVl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgRFJWX1ZFUlNJT05fTUlOT1IgMgotI2RlZmluZSBEUlZfVkVSU0lPTl9CVUlMRCA2CisjZGVmaW5lIERSVl9WRVJTSU9OX01JTk9SIDMKKyNkZWZpbmUgRFJWX1ZFUlNJT05fQlVJTEQgMQogI2RlZmluZSBEUlZfVkVSU0lPTiBfX3N0cmluZ2lmeShEUlZfVkVSU0lPTl9NQUpPUikgIi4iIFwKIAkgICAgIF9fc3RyaW5naWZ5KERSVl9WRVJTSU9OX01JTk9SKSAiLiIgXAogCSAgICAgX19zdHJpbmdpZnkoRFJWX1ZFUlNJT05fQlVJTEQpICAgIERSVl9LRVJOCkBAIC03NSw2ICs3NSw3IEBACiAJe1BDSV9WREVWSUNFKElOVEVMLCBJNDBFX0RFVl9JRF9RU0ZQX0IpLCAwfSwKIAl7UENJX1ZERVZJQ0UoSU5URUwsIEk0MEVfREVWX0lEX1FTRlBfQyksIDB9LAogCXtQQ0lfVkRFVklDRShJTlRFTCwgSTQwRV9ERVZfSURfMTBHX0JBU0VfVCksIDB9LAorCXtQQ0lfVkRFVklDRShJTlRFTCwgSTQwRV9ERVZfSURfMjBHX0tSMiksIDB9LAogCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KIAl7MCwgfQogfTsKQEAgLTI0OSw2ICsyNTAsMjIgQEAKIH0KIAogLyoqCisgKiBpNDBlX2ZpbmRfdnNpX2Zyb21faWQgLSBzZWFyY2hlcyBmb3IgdGhlIHZzaSB3aXRoIHRoZSBnaXZlbiBpZAorICogQHBmIC0gdGhlIHBmIHN0cnVjdHVyZSB0byBzZWFyY2ggZm9yIHRoZSB2c2kKKyAqIEBpZCAtIGlkIG9mIHRoZSB2c2kgaXQgaXMgc2VhcmNoaW5nIGZvcgorICoqLworc3RydWN0IGk0MGVfdnNpICppNDBlX2ZpbmRfdnNpX2Zyb21faWQoc3RydWN0IGk0MGVfcGYgKnBmLCB1MTYgaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGYtPm51bV9hbGxvY192c2k7IGkrKykKKwkJaWYgKHBmLT52c2lbaV0gJiYgKHBmLT52c2lbaV0tPmlkID09IGlkKSkKKwkJCXJldHVybiBwZi0+dnNpW2ldOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgogICogaTQwZV9zZXJ2aWNlX2V2ZW50X3NjaGVkdWxlIC0gU2NoZWR1bGUgdGhlIHNlcnZpY2UgdGFzayB0byB3YWtlIHVwCiAgKiBAcGY6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKgpAQCAtNDUwLDcgKzQ2Nyw3IEBACiB9CiAKIC8qKgotICogaTQwZV9wZl9yZXNldF9zdGF0cyAtIFJlc2V0IGFsbCBvZiB0aGUgc3RhdHMgZm9yIHRoZSBnaXZlbiBwZgorICogaTQwZV9wZl9yZXNldF9zdGF0cyAtIFJlc2V0IGFsbCBvZiB0aGUgc3RhdHMgZm9yIHRoZSBnaXZlbiBQRgogICogQHBmOiB0aGUgUEYgdG8gYmUgcmVzZXQKICAqKi8KIHZvaWQgaTQwZV9wZl9yZXNldF9zdGF0cyhzdHJ1Y3QgaTQwZV9wZiAqcGYpCkBAIC04OTYsNyArOTEzLDcgQEAKIH0KIAogLyoqCi0gKiBpNDBlX3VwZGF0ZV9wZl9zdGF0cyAtIFVwZGF0ZSB0aGUgcGYgc3RhdGlzdGljcyBjb3VudGVycy4KKyAqIGk0MGVfdXBkYXRlX3BmX3N0YXRzIC0gVXBkYXRlIHRoZSBQRiBzdGF0aXN0aWNzIGNvdW50ZXJzLgogICogQHBmOiB0aGUgUEYgdG8gYmUgdXBkYXRlZAogICoqLwogc3RhdGljIHZvaWQgaTQwZV91cGRhdGVfcGZfc3RhdHMoc3RydWN0IGk0MGVfcGYgKnBmKQpAQCAtOTE5LDExICs5MzYsNiBAQAogCQkJICAgcGYtPnN0YXRfb2Zmc2V0c19sb2FkZWQsCiAJCQkgICAmb3NkLT5ldGgucnhfZGlzY2FyZHMsCiAJCQkgICAmbnNkLT5ldGgucnhfZGlzY2FyZHMpOwotCWk0MGVfc3RhdF91cGRhdGUzMihodywgSTQwRV9HTFBSVF9URFBDKGh3LT5wb3J0KSwKLQkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLAotCQkJICAgJm9zZC0+ZXRoLnR4X2Rpc2NhcmRzLAotCQkJICAgJm5zZC0+ZXRoLnR4X2Rpc2NhcmRzKTsKLQogCWk0MGVfc3RhdF91cGRhdGU0OChodywgSTQwRV9HTFBSVF9VUFJDSChody0+cG9ydCksCiAJCQkgICBJNDBFX0dMUFJUX1VQUkNMKGh3LT5wb3J0KSwKIAkJCSAgIHBmLT5zdGF0X29mZnNldHNfbG9hZGVkLApAQCAtMTEzMyw3ICsxMTQ1LDcgQEAKICAqIEB2c2k6IHRoZSBWU0kgdG8gYmUgc2VhcmNoZWQKICAqIEBtYWNhZGRyOiB0aGUgTUFDIGFkZHJlc3MKICAqIEB2bGFuOiB0aGUgdmxhbgotICogQGlzX3ZmOiBtYWtlIHN1cmUgaXRzIGEgdmYgZmlsdGVyLCBlbHNlIGRvZXNuJ3QgbWF0dGVyCisgKiBAaXNfdmY6IG1ha2Ugc3VyZSBpdHMgYSBWRiBmaWx0ZXIsIGVsc2UgZG9lc24ndCBtYXR0ZXIKICAqIEBpc19uZXRkZXY6IG1ha2Ugc3VyZSBpdHMgYSBuZXRkZXYgZmlsdGVyLCBlbHNlIGRvZXNuJ3QgbWF0dGVyCiAgKgogICogUmV0dXJucyBwdHIgdG8gdGhlIGZpbHRlciBvYmplY3Qgb3IgTlVMTApAQCAtMTE2MSw3ICsxMTczLDcgQEAKICAqIGk0MGVfZmluZF9tYWMgLSBGaW5kIGEgbWFjIGFkZHIgaW4gdGhlIG1hY3ZsYW4gZmlsdGVycyBsaXN0CiAgKiBAdnNpOiB0aGUgVlNJIHRvIGJlIHNlYXJjaGVkCiAgKiBAbWFjYWRkcjogdGhlIE1BQyBhZGRyZXNzIHdlIGFyZSBzZWFyY2hpbmcgZm9yCi0gKiBAaXNfdmY6IG1ha2Ugc3VyZSBpdHMgYSB2ZiBmaWx0ZXIsIGVsc2UgZG9lc24ndCBtYXR0ZXIKKyAqIEBpc192ZjogbWFrZSBzdXJlIGl0cyBhIFZGIGZpbHRlciwgZWxzZSBkb2Vzbid0IG1hdHRlcgogICogQGlzX25ldGRldjogbWFrZSBzdXJlIGl0cyBhIG5ldGRldiBmaWx0ZXIsIGVsc2UgZG9lc24ndCBtYXR0ZXIKICAqCiAgKiBSZXR1cm5zIHRoZSBmaXJzdCBmaWx0ZXIgd2l0aCB0aGUgcHJvdmlkZWQgTUFDIGFkZHJlc3Mgb3IgTlVMTCBpZgpAQCAtMTIwOSw3ICsxMjIxLDcgQEAKICAqIGk0MGVfcHV0X21hY19pbl92bGFuIC0gTWFrZSBtYWN2bGFuIGZpbHRlcnMgZnJvbSBtYWNhZGRycyBhbmQgdmxhbnMKICAqIEB2c2k6IHRoZSBWU0kgdG8gYmUgc2VhcmNoZWQKICAqIEBtYWNhZGRyOiB0aGUgbWFjIGFkZHJlc3MgdG8gYmUgZmlsdGVyZWQKLSAqIEBpc192ZjogdHJ1ZSBpZiBpdCBpcyBhIHZmCisgKiBAaXNfdmY6IHRydWUgaWYgaXQgaXMgYSBWRgogICogQGlzX25ldGRldjogdHJ1ZSBpZiBpdCBpcyBhIG5ldGRldgogICoKICAqIEdvZXMgdGhyb3VnaCBhbGwgdGhlIG1hY3ZsYW4gZmlsdGVycyBhbmQgYWRkcyBhCkBAIC0xMjcwLDcgKzEyODIsNyBAQAogICogQHZzaTogdGhlIFZTSSB0byBiZSBzZWFyY2hlZAogICogQG1hY2FkZHI6IHRoZSBNQUMgYWRkcmVzcwogICogQHZsYW46IHRoZSB2bGFuCi0gKiBAaXNfdmY6IG1ha2Ugc3VyZSBpdHMgYSB2ZiBmaWx0ZXIsIGVsc2UgZG9lc24ndCBtYXR0ZXIKKyAqIEBpc192ZjogbWFrZSBzdXJlIGl0cyBhIFZGIGZpbHRlciwgZWxzZSBkb2Vzbid0IG1hdHRlcgogICogQGlzX25ldGRldjogbWFrZSBzdXJlIGl0cyBhIG5ldGRldiBmaWx0ZXIsIGVsc2UgZG9lc24ndCBtYXR0ZXIKICAqCiAgKiBSZXR1cm5zIHB0ciB0byB0aGUgZmlsdGVyIG9iamVjdCBvciBOVUxMIHdoZW4gbm8gbWVtb3J5IGF2YWlsYWJsZS4KQEAgLTEzMzAsNyArMTM0Miw3IEBACiAgKiBAdnNpOiB0aGUgVlNJIHRvIGJlIHNlYXJjaGVkCiAgKiBAbWFjYWRkcjogdGhlIE1BQyBhZGRyZXNzCiAgKiBAdmxhbjogdGhlIHZsYW4KLSAqIEBpc192ZjogbWFrZSBzdXJlIGl0J3MgYSB2ZiBmaWx0ZXIsIGVsc2UgZG9lc24ndCBtYXR0ZXIKKyAqIEBpc192ZjogbWFrZSBzdXJlIGl0J3MgYSBWRiBmaWx0ZXIsIGVsc2UgZG9lc24ndCBtYXR0ZXIKICAqIEBpc19uZXRkZXY6IG1ha2Ugc3VyZSBpdCdzIGEgbmV0ZGV2IGZpbHRlciwgZWxzZSBkb2Vzbid0IG1hdHRlcgogICoqLwogdm9pZCBpNDBlX2RlbF9maWx0ZXIoc3RydWN0IGk0MGVfdnNpICp2c2ksCkBAIC0xMzU3LDcgKzEzNjksNyBAQAogCQkJZi0+Y291bnRlci0tOwogCQl9CiAJfSBlbHNlIHsKLQkJLyogbWFrZSBzdXJlIHdlIGRvbid0IHJlbW92ZSBhIGZpbHRlciBpbiB1c2UgYnkgdmYgb3IgbmV0ZGV2ICovCisJCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCByZW1vdmUgYSBmaWx0ZXIgaW4gdXNlIGJ5IFZGIG9yIG5ldGRldiAqLwogCQlpbnQgbWluX2YgPSAwOwogCQltaW5fZiArPSAoZi0+aXNfdmYgPyAxIDogMCk7CiAJCW1pbl9mICs9IChmLT5pc19uZXRkZXYgPyAxIDogMCk7CkBAIC0xNTQ2LDcgKzE1NTgsNyBAQAogCQkJdnNpLT50Y19jb25maWcudGNfaW5mb1tpXS5xb2Zmc2V0ID0gb2Zmc2V0OwogCQkJdnNpLT50Y19jb25maWcudGNfaW5mb1tpXS5xY291bnQgPSBxY291bnQ7CiAKLQkJCS8qIGZpbmQgdGhlIHBvd2VyLW9mLTIgb2YgdGhlIG51bWJlciBvZiBxdWV1ZSBwYWlycyAqLworCQkJLyogZmluZCB0aGUgbmV4dCBoaWdoZXIgcG93ZXItb2YtMiBvZiBudW0gcXVldWUgcGFpcnMgKi8KIAkJCW51bV9xcHMgPSBxY291bnQ7CiAJCQlwb3cgPSAwOwogCQkJd2hpbGUgKG51bV9xcHMgJiYgKCgxIDw8IHBvdykgPCBxY291bnQpKSB7CkBAIC0xNTc2LDYgKzE1ODgsMTIgQEAKIAogCS8qIFNldCBhY3R1YWwgVHgvUnggcXVldWUgcGFpcnMgKi8KIAl2c2ktPm51bV9xdWV1ZV9wYWlycyA9IG9mZnNldDsKKwlpZiAoKHZzaS0+dHlwZSA9PSBJNDBFX1ZTSV9NQUlOKSAmJiAobnVtdGMgPT0gMSkpIHsKKwkJaWYgKHZzaS0+cmVxX3F1ZXVlX3BhaXJzID4gMCkKKwkJCXZzaS0+bnVtX3F1ZXVlX3BhaXJzID0gdnNpLT5yZXFfcXVldWVfcGFpcnM7CisJCWVsc2UKKwkJCXZzaS0+bnVtX3F1ZXVlX3BhaXJzID0gcGYtPm51bV9sYW5fbXNpeDsKKwl9CiAKIAkvKiBTY2hlZHVsZXIgc2VjdGlvbiB2YWxpZCBjYW4gb25seSBiZSBzZXQgZm9yIEFERCBWU0kgKi8KIAlpZiAoaXNfYWRkKSB7CkBAIC0xOTY3LDcgKzE5ODUsNyBAQAogCQkJCSAgICBJNDBFX0FRX1ZTSV9QVkxBTl9FTU9EX1NUUl9CT1RIOwogCiAJY3R4dC5zZWlkID0gdnNpLT5zZWlkOwotCW1lbWNweSgmY3R4dC5pbmZvLCAmdnNpLT5pbmZvLCBzaXplb2YodnNpLT5pbmZvKSk7CisJY3R4dC5pbmZvID0gdnNpLT5pbmZvOwogCXJldCA9IGk0MGVfYXFfdXBkYXRlX3ZzaV9wYXJhbXMoJnZzaS0+YmFjay0+aHcsICZjdHh0LCBOVUxMKTsKIAlpZiAocmV0KSB7CiAJCWRldl9pbmZvKCZ2c2ktPmJhY2stPnBkZXYtPmRldiwKQEAgLTE5OTYsNyArMjAxNCw3IEBACiAJCQkJICAgIEk0MEVfQVFfVlNJX1BWTEFOX0VNT0RfTk9USElORzsKIAogCWN0eHQuc2VpZCA9IHZzaS0+c2VpZDsKLQltZW1jcHkoJmN0eHQuaW5mbywgJnZzaS0+aW5mbywgc2l6ZW9mKHZzaS0+aW5mbykpOworCWN0eHQuaW5mbyA9IHZzaS0+aW5mbzsKIAlyZXQgPSBpNDBlX2FxX3VwZGF0ZV92c2lfcGFyYW1zKCZ2c2ktPmJhY2stPmh3LCAmY3R4dCwgTlVMTCk7CiAJaWYgKHJldCkgewogCQlkZXZfaW5mbygmdnNpLT5iYWNrLT5wZGV2LT5kZXYsCkBAIC0yMjgwLDcgKzIyOTgsNyBAQAogCQkJCSAgICBJNDBFX0FRX1ZTSV9QVkxBTl9FTU9EX1NUUjsKIAogCWN0eHQuc2VpZCA9IHZzaS0+c2VpZDsKLQltZW1jcHkoJmN0eHQuaW5mbywgJnZzaS0+aW5mbywgc2l6ZW9mKHZzaS0+aW5mbykpOworCWN0eHQuaW5mbyA9IHZzaS0+aW5mbzsKIAlhcV9yZXQgPSBpNDBlX2FxX3VwZGF0ZV92c2lfcGFyYW1zKCZ2c2ktPmJhY2stPmh3LCAmY3R4dCwgTlVMTCk7CiAJaWYgKGFxX3JldCkgewogCQlkZXZfaW5mbygmdnNpLT5iYWNrLT5wZGV2LT5kZXYsCkBAIC0yMzk4LDIwICsyNDE2LDIwIEBACiAJc3RydWN0IGk0MGVfdnNpICp2c2kgPSByaW5nLT52c2k7CiAJY3B1bWFza192YXJfdCBtYXNrOwogCi0JaWYgKHJpbmctPnFfdmVjdG9yICYmIHJpbmctPm5ldGRldikgewotCQkvKiBTaW5nbGUgVEMgbW9kZSBlbmFibGUgWFBTICovCi0JCWlmICh2c2ktPnRjX2NvbmZpZy5udW10YyA8PSAxICYmCi0JCSAgICAhdGVzdF9hbmRfc2V0X2JpdChfX0k0MEVfVFhfWFBTX0lOSVRfRE9ORSwgJnJpbmctPnN0YXRlKSkgeworCWlmICghcmluZy0+cV92ZWN0b3IgfHwgIXJpbmctPm5ldGRldikKKwkJcmV0dXJuOworCisJLyogU2luZ2xlIFRDIG1vZGUgZW5hYmxlIFhQUyAqLworCWlmICh2c2ktPnRjX2NvbmZpZy5udW10YyA8PSAxKSB7CisJCWlmICghdGVzdF9hbmRfc2V0X2JpdChfX0k0MEVfVFhfWFBTX0lOSVRfRE9ORSwgJnJpbmctPnN0YXRlKSkKIAkJCW5ldGlmX3NldF94cHNfcXVldWUocmluZy0+bmV0ZGV2LAogCQkJCQkgICAgJnJpbmctPnFfdmVjdG9yLT5hZmZpbml0eV9tYXNrLAogCQkJCQkgICAgcmluZy0+cXVldWVfaW5kZXgpOwotCQl9IGVsc2UgaWYgKGFsbG9jX2NwdW1hc2tfdmFyKCZtYXNrLCBHRlBfS0VSTkVMKSkgewotCQkJLyogRGlzYWJsZSBYUFMgdG8gYWxsb3cgc2VsZWN0aW9uIGJhc2VkIG9uIFRDICovCi0JCQliaXRtYXBfemVybyhjcHVtYXNrX2JpdHMobWFzayksIG5yX2NwdW1hc2tfYml0cyk7Ci0JCQluZXRpZl9zZXRfeHBzX3F1ZXVlKHJpbmctPm5ldGRldiwgbWFzaywKLQkJCQkJICAgIHJpbmctPnF1ZXVlX2luZGV4KTsKLQkJCWZyZWVfY3B1bWFza192YXIobWFzayk7Ci0JCX0KKwl9IGVsc2UgaWYgKGFsbG9jX2NwdW1hc2tfdmFyKCZtYXNrLCBHRlBfS0VSTkVMKSkgeworCQkvKiBEaXNhYmxlIFhQUyB0byBhbGxvdyBzZWxlY3Rpb24gYmFzZWQgb24gVEMgKi8KKwkJYml0bWFwX3plcm8oY3B1bWFza19iaXRzKG1hc2spLCBucl9jcHVtYXNrX2JpdHMpOworCQluZXRpZl9zZXRfeHBzX3F1ZXVlKHJpbmctPm5ldGRldiwgbWFzaywgcmluZy0+cXVldWVfaW5kZXgpOworCQlmcmVlX2NwdW1hc2tfdmFyKG1hc2spOwogCX0KIH0KIApAQCAtMjU5Niw3ICsyNjE0LDEyIEBACiAJcmluZy0+dGFpbCA9IGh3LT5od19hZGRyICsgSTQwRV9RUlhfVEFJTChwZl9xKTsKIAl3cml0ZWwoMCwgcmluZy0+dGFpbCk7CiAKLQlpNDBlX2FsbG9jX3J4X2J1ZmZlcnMocmluZywgSTQwRV9ERVNDX1VOVVNFRChyaW5nKSk7CisJaWYgKHJpbmdfaXNfcHNfZW5hYmxlZChyaW5nKSkgeworCQlpNDBlX2FsbG9jX3J4X2hlYWRlcnMocmluZyk7CisJCWk0MGVfYWxsb2NfcnhfYnVmZmVyc19wcyhyaW5nLCBJNDBFX0RFU0NfVU5VU0VEKHJpbmcpKTsKKwl9IGVsc2UgeworCQlpNDBlX2FsbG9jX3J4X2J1ZmZlcnNfMWJ1ZihyaW5nLCBJNDBFX0RFU0NfVU5VU0VEKHJpbmcpKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMxODMsMTMgKzMyMDYsMTYgQEAKIAkJCXBmLT5nbG9icl9jb3VudCsrOwogCQl9IGVsc2UgaWYgKHZhbCA9PSBJNDBFX1JFU0VUX0VNUFIpIHsKIAkJCXBmLT5lbXByX2NvdW50Kys7Ci0JCQlzZXRfYml0KF9fSTQwRV9FTVBfUkVTRVRfUkVRVUVTVEVELCAmcGYtPnN0YXRlKTsKKwkJCXNldF9iaXQoX19JNDBFX0VNUF9SRVNFVF9JTlRSX1JFQ0VJVkVELCAmcGYtPnN0YXRlKTsKIAkJfQogCX0KIAogCWlmIChpY3IwICYgSTQwRV9QRklOVF9JQ1IwX0hNQ19FUlJfTUFTSykgewogCQlpY3IwICY9IH5JNDBFX1BGSU5UX0lDUjBfSE1DX0VSUl9NQVNLOwogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkhNQyBlcnJvciBpbnRlcnJ1cHRcbiIpOworCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkhNQyBlcnJvciBpbmZvIDB4JXgsIEhNQyBlcnJvciBkYXRhIDB4JXhcbiIsCisJCQkgcmQzMihodywgSTQwRV9QRkhNQ19FUlJPUklORk8pLAorCQkJIHJkMzIoaHcsIEk0MEVfUEZITUNfRVJST1JEQVRBKSk7CiAJfQogCiAJaWYgKGljcjAgJiBJNDBFX1BGSU5UX0lDUjBfVElNRVNZTkNfTUFTSykgewpAQCAtMzgyNSw2ICszODUxLDggQEAKIAkJcGNpX2Rpc2FibGVfbXNpeChwZi0+cGRldik7CiAJCWtmcmVlKHBmLT5tc2l4X2VudHJpZXMpOwogCQlwZi0+bXNpeF9lbnRyaWVzID0gTlVMTDsKKwkJa2ZyZWUocGYtPmlycV9waWxlKTsKKwkJcGYtPmlycV9waWxlID0gTlVMTDsKIAl9IGVsc2UgaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NU0lfRU5BQkxFRCkgewogCQlwY2lfZGlzYWJsZV9tc2kocGYtPnBkZXYpOwogCX0KQEAgLTQwMjEsNyArNDA0OSw3IEBACiAjZW5kaWYKIC8qKgogICogaTQwZV9nZXRfaXNjc2lfdGNfbWFwIC0gUmV0dXJuIFRDIG1hcCBmb3IgaVNDU0kgQVBQCi0gKiBAcGY6IHBvaW50ZXIgdG8gcGYKKyAqIEBwZjogcG9pbnRlciB0byBQRgogICoKICAqIEdldCBUQyBtYXAgZm9yIElTQ1NJIFBGIHR5cGUgdGhhdCB3aWxsIGluY2x1ZGUgaVNDU0kgVEMKICAqIGFuZCBMQU4gVEMuCkBAIC00MTE5LDcgKzQxNDcsNyBAQAogCWlmIChwZi0+aHcuZnVuY19jYXBzLmlzY3NpKQogCQllbmFibGVkX3RjID0gIGk0MGVfZ2V0X2lzY3NpX3RjX21hcChwZik7CiAJZWxzZQotCQllbmFibGVkX3RjID0gcGYtPmh3LmZ1bmNfY2Fwcy5lbmFibGVkX3RjbWFwOworCQlyZXR1cm4gMTsgLyogT25seSBUQzAgKi8KIAogCS8qIEF0IGxlYXN0IGhhdmUgVEMwICovCiAJZW5hYmxlZF90YyA9IChlbmFibGVkX3RjID8gZW5hYmxlZF90YyA6IDB4MSk7CkBAIC00MTY5LDExICs0MTk3LDExIEBACiAJaWYgKCEocGYtPmZsYWdzICYgSTQwRV9GTEFHX01GUF9FTkFCTEVEKSkKIAkJcmV0dXJuIGk0MGVfZGNiX2dldF9lbmFibGVkX3RjKCZwZi0+aHcubG9jYWxfZGNieF9jb25maWcpOwogCi0JLyogTVBGIGVuYWJsZWQgYW5kIGlTQ1NJIFBGIHR5cGUgKi8KKwkvKiBNRlAgZW5hYmxlZCBhbmQgaVNDU0kgUEYgdHlwZSAqLwogCWlmIChwZi0+aHcuZnVuY19jYXBzLmlzY3NpKQogCQlyZXR1cm4gaTQwZV9nZXRfaXNjc2lfdGNfbWFwKHBmKTsKIAllbHNlCi0JCXJldHVybiBwZi0+aHcuZnVuY19jYXBzLmVuYWJsZWRfdGNtYXA7CisJCXJldHVybiBpNDBlX3BmX2dldF9kZWZhdWx0X3RjKHBmKTsKIH0KIAogLyoqCkBAIC00MTk2LDcgKzQyMjQsNyBAQAogCWFxX3JldCA9IGk0MGVfYXFfcXVlcnlfdnNpX2J3X2NvbmZpZyhodywgdnNpLT5zZWlkLCAmYndfY29uZmlnLCBOVUxMKTsKIAlpZiAoYXFfcmV0KSB7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkJICJjb3VsZG4ndCBnZXQgcGYgdnNpIGJ3IGNvbmZpZywgZXJyICVkLCBhcV9lcnIgJWRcbiIsCisJCQkgImNvdWxkbid0IGdldCBQRiB2c2kgYncgY29uZmlnLCBlcnIgJWQsIGFxX2VyciAlZFxuIiwKIAkJCSBhcV9yZXQsIHBmLT5ody5hcS5hc3FfbGFzdF9zdGF0dXMpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00MjA2LDcgKzQyMzQsNyBAQAogCQkJCQkJICBOVUxMKTsKIAlpZiAoYXFfcmV0KSB7CiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkJICJjb3VsZG4ndCBnZXQgcGYgdnNpIGV0cyBidyBjb25maWcsIGVyciAlZCwgYXFfZXJyICVkXG4iLAorCQkJICJjb3VsZG4ndCBnZXQgUEYgdnNpIGV0cyBidyBjb25maWcsIGVyciAlZCwgYXFfZXJyICVkXG4iLAogCQkJIGFxX3JldCwgcGYtPmh3LmFxLmFzcV9sYXN0X3N0YXR1cyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQzODMsNyArNDQxMSw3IEBACiAJY3R4dC5wZl9udW0gPSB2c2ktPmJhY2stPmh3LnBmX2lkOwogCWN0eHQudmZfbnVtID0gMDsKIAljdHh0LnVwbGlua19zZWlkID0gdnNpLT51cGxpbmtfc2VpZDsKLQltZW1jcHkoJmN0eHQuaW5mbywgJnZzaS0+aW5mbywgc2l6ZW9mKHZzaS0+aW5mbykpOworCWN0eHQuaW5mbyA9IHZzaS0+aW5mbzsKIAlpNDBlX3ZzaV9zZXR1cF9xdWV1ZV9tYXAodnNpLCAmY3R4dCwgZW5hYmxlZF90YywgZmFsc2UpOwogCiAJLyogVXBkYXRlIHRoZSBWU0kgYWZ0ZXIgdXBkYXRpbmcgdGhlIFZTSSBxdWV1ZS1tYXBwaW5nIGluZm9ybWF0aW9uICovCkBAIC00NTYzLDYgKzQ1OTEsMTEgQEAKIAlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmcGYtPmh3OwogCWludCBlcnIgPSAwOwogCisJLyogRG8gbm90IGVuYWJsZSBEQ0IgZm9yIFNXMSBhbmQgU1cyIGltYWdlcyBldmVuIGlmIHRoZSBGVyBpcyBjYXBhYmxlICovCisJaWYgKCgocGYtPmh3LmFxLmZ3X21hal92ZXIgPT0gNCkgJiYgKHBmLT5ody5hcS5md19taW5fdmVyIDwgMzMpKSB8fAorCSAgICAocGYtPmh3LmFxLmZ3X21hal92ZXIgPCA0KSkKKwkJZ290byBvdXQ7CisKIAkvKiBHZXQgdGhlIGluaXRpYWwgRENCIGNvbmZpZ3VyYXRpb24gKi8KIAllcnIgPSBpNDBlX2luaXRfZGNiKGh3KTsKIAlpZiAoIWVycikgewpAQCAtNDYyNiw2ICs0NjU5LDkgQEAKIAljYXNlIEk0MEVfTElOS19TUEVFRF80MEdCOgogCQlzdHJsY3B5KHNwZWVkLCAiNDAgR2JwcyIsIFNQRUVEX1NJWkUpOwogCQlicmVhazsKKwljYXNlIEk0MEVfTElOS19TUEVFRF8yMEdCOgorCQlzdHJuY3B5KHNwZWVkLCAiMjAgR2JwcyIsIFNQRUVEX1NJWkUpOworCQlicmVhazsKIAljYXNlIEk0MEVfTElOS19TUEVFRF8xMEdCOgogCQlzdHJsY3B5KHNwZWVkLCAiMTAgR2JwcyIsIFNQRUVEX1NJWkUpOwogCQlicmVhazsKQEAgLTQ4NTMsMTEgKzQ4ODksNyBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlCiAgKiovCi0jaWZkZWYgSTQwRV9GQ09FCiBpbnQgaTQwZV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCi0jZWxzZQotc3RhdGljIGludCBpNDBlX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKLSNlbmRpZgogewogCXN0cnVjdCBpNDBlX25ldGRldl9wcml2ICpucCA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGk0MGVfdnNpICp2c2kgPSBucC0+dnNpOwpAQCAtNDk2Nyw3ICs0OTk5LDcgQEAKIAogLyoqCiAgKiBpNDBlX2ZkaXJfZmlsdGVyX2V4aXQgLSBDbGVhbnMgdXAgdGhlIEZsb3cgRGlyZWN0b3IgYWNjb3VudGluZwotICogQHBmOiBQb2ludGVyIHRvIHBmCisgKiBAcGY6IFBvaW50ZXIgdG8gUEYKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGRlc3Ryb3lzIHRoZSBobGlzdCB3aGVyZSBhbGwgdGhlIEZsb3cgRGlyZWN0b3IKICAqIGZpbHRlcnMgd2VyZSBzYXZlZC4KQEAgLTUwNTUsMjQgKzUwODcsNiBAQAogCQl3cjMyKCZwZi0+aHcsIEk0MEVfR0xHRU5fUlRSSUcsIHZhbCk7CiAJCWk0MGVfZmx1c2goJnBmLT5odyk7CiAKLQl9IGVsc2UgaWYgKHJlc2V0X2ZsYWdzICYgKDEgPDwgX19JNDBFX0VNUF9SRVNFVF9SRVFVRVNURUQpKSB7Ci0KLQkJLyogUmVxdWVzdCBhIEZpcm13YXJlIFJlc2V0Ci0JCSAqCi0JCSAqIFNhbWUgYXMgR2xvYmFsIHJlc2V0LCBwbHVzIHJlc3RhcnRpbmcgdGhlCi0JCSAqIGVtYmVkZGVkIGZpcm13YXJlIGVuZ2luZS4KLQkJICovCi0JCS8qIGVuYWJsZSBFTVAgUmVzZXQgKi8KLQkJdmFsID0gcmQzMigmcGYtPmh3LCBJNDBFX0dMR0VOX1JTVEVOQV9FTVApOwotCQl2YWwgfD0gSTQwRV9HTEdFTl9SU1RFTkFfRU1QX0VNUF9SU1RfRU5BX01BU0s7Ci0JCXdyMzIoJnBmLT5odywgSTQwRV9HTEdFTl9SU1RFTkFfRU1QLCB2YWwpOwotCi0JCS8qIGZvcmNlIHRoZSByZXNldCAqLwotCQl2YWwgPSByZDMyKCZwZi0+aHcsIEk0MEVfR0xHRU5fUlRSSUcpOwotCQl2YWwgfD0gSTQwRV9HTEdFTl9SVFJJR19FTVBGV1JfTUFTSzsKLQkJd3IzMigmcGYtPmh3LCBJNDBFX0dMR0VOX1JUUklHLCB2YWwpOwotCQlpNDBlX2ZsdXNoKCZwZi0+aHcpOwotCiAJfSBlbHNlIGlmIChyZXNldF9mbGFncyAmICgxIDw8IF9fSTQwRV9QRl9SRVNFVF9SRVFVRVNURUQpKSB7CiAKIAkJLyogUmVxdWVzdCBhIFBGIFJlc2V0CkBAIC01MTk1LDcgKzUyMDksNiBAQAogCXN0cnVjdCBpNDBlX2FxY19sbGRwX2dldF9taWIgKm1pYiA9CiAJCShzdHJ1Y3QgaTQwZV9hcWNfbGxkcF9nZXRfbWliICopJmUtPmRlc2MucGFyYW1zLnJhdzsKIAlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmcGYtPmh3OwotCXN0cnVjdCBpNDBlX2RjYnhfY29uZmlnICpkY2J4X2NmZyA9ICZody0+bG9jYWxfZGNieF9jb25maWc7CiAJc3RydWN0IGk0MGVfZGNieF9jb25maWcgdG1wX2RjYnhfY2ZnOwogCWJvb2wgbmVlZF9yZWNvbmZpZyA9IGZhbHNlOwogCWludCByZXQgPSAwOwpAQCAtNTIyNiwxMCArNTIzOSwxMSBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JbWVtc2V0KCZ0bXBfZGNieF9jZmcsIDAsIHNpemVvZih0bXBfZGNieF9jZmcpKTsKIAkvKiBTdG9yZSB0aGUgb2xkIGNvbmZpZ3VyYXRpb24gKi8KLQl0bXBfZGNieF9jZmcgPSAqZGNieF9jZmc7CisJdG1wX2RjYnhfY2ZnID0gaHctPmxvY2FsX2RjYnhfY29uZmlnOwogCisJLyogUmVzZXQgdGhlIG9sZCBEQ0J4IGNvbmZpZ3VyYXRpb24gZGF0YSAqLworCW1lbXNldCgmaHctPmxvY2FsX2RjYnhfY29uZmlnLCAwLCBzaXplb2YoaHctPmxvY2FsX2RjYnhfY29uZmlnKSk7CiAJLyogR2V0IHVwZGF0ZWQgRENCWCBkYXRhIGZyb20gZmlybXdhcmUgKi8KIAlyZXQgPSBpNDBlX2dldF9kY2JfY29uZmlnKCZwZi0+aHcpOwogCWlmIChyZXQpIHsKQEAgLTUyMzgsMjAgKzUyNTIsMjIgQEAKIAl9CiAKIAkvKiBObyBjaGFuZ2UgZGV0ZWN0ZWQgaW4gRENCWCBjb25maWdzICovCi0JaWYgKCFtZW1jbXAoJnRtcF9kY2J4X2NmZywgZGNieF9jZmcsIHNpemVvZih0bXBfZGNieF9jZmcpKSkgeworCWlmICghbWVtY21wKCZ0bXBfZGNieF9jZmcsICZody0+bG9jYWxfZGNieF9jb25maWcsCisJCSAgICBzaXplb2YodG1wX2RjYnhfY2ZnKSkpIHsKIAkJZGV2X2RiZygmcGYtPnBkZXYtPmRldiwgIk5vIGNoYW5nZSBkZXRlY3RlZCBpbiBEQ0JYIGNvbmZpZ3VyYXRpb24uXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAotCW5lZWRfcmVjb25maWcgPSBpNDBlX2RjYl9uZWVkX3JlY29uZmlnKHBmLCAmdG1wX2RjYnhfY2ZnLCBkY2J4X2NmZyk7CisJbmVlZF9yZWNvbmZpZyA9IGk0MGVfZGNiX25lZWRfcmVjb25maWcocGYsICZ0bXBfZGNieF9jZmcsCisJCQkJCSAgICAgICAmaHctPmxvY2FsX2RjYnhfY29uZmlnKTsKIAotCWk0MGVfZGNibmxfZmx1c2hfYXBwcyhwZiwgZGNieF9jZmcpOworCWk0MGVfZGNibmxfZmx1c2hfYXBwcyhwZiwgJnRtcF9kY2J4X2NmZywgJmh3LT5sb2NhbF9kY2J4X2NvbmZpZyk7CiAKIAlpZiAoIW5lZWRfcmVjb25maWcpCiAJCWdvdG8gZXhpdDsKIAogCS8qIEVuYWJsZSBEQ0IgdGFnZ2luZyBvbmx5IHdoZW4gbW9yZSB0aGFuIG9uZSBUQyAqLwotCWlmIChpNDBlX2RjYl9nZXRfbnVtX3RjKGRjYnhfY2ZnKSA+IDEpCisJaWYgKGk0MGVfZGNiX2dldF9udW1fdGMoJmh3LT5sb2NhbF9kY2J4X2NvbmZpZykgPiAxKQogCQlwZi0+ZmxhZ3MgfD0gSTQwRV9GTEFHX0RDQl9FTkFCTEVEOwogCWVsc2UKIAkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRENCX0VOQUJMRUQ7CkBAIC01MzUxLDkgKzUzNjcsOSBAQAogICogaTQwZV9nZXRfY3VyX2d1YXJhbnRlZWRfZmRfY291bnQgLSBHZXQgdGhlIGNvbnN1bWVkIGd1YXJhbnRlZWQgRkQgZmlsdGVycwogICogQHBmOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQogICoqLwotaW50IGk0MGVfZ2V0X2N1cl9ndWFyYW50ZWVkX2ZkX2NvdW50KHN0cnVjdCBpNDBlX3BmICpwZikKK3UzMiBpNDBlX2dldF9jdXJfZ3VhcmFudGVlZF9mZF9jb3VudChzdHJ1Y3QgaTQwZV9wZiAqcGYpCiB7Ci0JaW50IHZhbCwgZmNudF9wcm9nOworCXUzMiB2YWwsIGZjbnRfcHJvZzsKIAogCXZhbCA9IHJkMzIoJnBmLT5odywgSTQwRV9QRlFGX0ZEU1RBVCk7CiAJZmNudF9wcm9nID0gKHZhbCAmIEk0MEVfUEZRRl9GRFNUQVRfR1VBUkFOVF9DTlRfTUFTSyk7CkBAIC01MzYxLDEyICs1Mzc3LDEzIEBACiB9CiAKIC8qKgotICogaTQwZV9nZXRfY3VycmVudF9mZF9jb3VudCAtIEdldCB0aGUgY291bnQgb2YgdG90YWwgRkQgZmlsdGVycyBwcm9ncmFtbWVkCisgKiBpNDBlX2dldF9jdXJyZW50X2ZkX2NvdW50IC0gR2V0IHRvdGFsIEZEIGZpbHRlcnMgcHJvZ3JhbW1lZCBmb3IgdGhpcyBQRgogICogQHBmOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQogICoqLwotaW50IGk0MGVfZ2V0X2N1cnJlbnRfZmRfY291bnQoc3RydWN0IGk0MGVfcGYgKnBmKQordTMyIGk0MGVfZ2V0X2N1cnJlbnRfZmRfY291bnQoc3RydWN0IGk0MGVfcGYgKnBmKQogewotCWludCB2YWwsIGZjbnRfcHJvZzsKKwl1MzIgdmFsLCBmY250X3Byb2c7CisKIAl2YWwgPSByZDMyKCZwZi0+aHcsIEk0MEVfUEZRRl9GRFNUQVQpOwogCWZjbnRfcHJvZyA9ICh2YWwgJiBJNDBFX1BGUUZfRkRTVEFUX0dVQVJBTlRfQ05UX01BU0spICsKIAkJICAgICgodmFsICYgSTQwRV9QRlFGX0ZEU1RBVF9CRVNUX0NOVF9NQVNLKSA+PgpAQCAtNTM3NSw2ICs1MzkyLDIxIEBACiB9CiAKIC8qKgorICogaTQwZV9nZXRfZ2xvYmFsX2ZkX2NvdW50IC0gR2V0IHRvdGFsIEZEIGZpbHRlcnMgcHJvZ3JhbW1lZCBvbiBkZXZpY2UKKyAqIEBwZjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKKyAqKi8KK3UzMiBpNDBlX2dldF9nbG9iYWxfZmRfY291bnQoc3RydWN0IGk0MGVfcGYgKnBmKQoreworCXUzMiB2YWwsIGZjbnRfcHJvZzsKKworCXZhbCA9IHJkMzIoJnBmLT5odywgSTQwRV9HTFFGX0ZEQ05UXzApOworCWZjbnRfcHJvZyA9ICh2YWwgJiBJNDBFX0dMUUZfRkRDTlRfMF9HVUFSQU5UX0NOVF9NQVNLKSArCisJCSAgICAoKHZhbCAmIEk0MEVfR0xRRl9GRENOVF8wX0JFU1RDTlRfTUFTSykgPj4KKwkJICAgICBJNDBFX0dMUUZfRkRDTlRfMF9CRVNUQ05UX1NISUZUKTsKKwlyZXR1cm4gZmNudF9wcm9nOworfQorCisvKioKICAqIGk0MGVfZmRpcl9jaGVja19hbmRfcmVlbmFibGUgLSBGdW5jdGlvbiB0byByZWVuYWJlIEZEIEFUUiBvciBTQiBpZiBkaXNhYmxlZAogICogQHBmOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQogICoqLwpAQCAtNTM4OCw3ICs1NDIwLDcgQEAKIAkvKiBDaGVjayBpZiwgRkQgU0Igb3IgQVRSIHdhcyBhdXRvIGRpc2FibGVkIGFuZCBpZiB0aGVyZSBpcyBlbm91Z2ggcm9vbQogCSAqIHRvIHJlLWVuYWJsZQogCSAqLwotCWZjbnRfcHJvZyA9IGk0MGVfZ2V0X2N1cl9ndWFyYW50ZWVkX2ZkX2NvdW50KHBmKTsKKwlmY250X3Byb2cgPSBpNDBlX2dldF9nbG9iYWxfZmRfY291bnQocGYpOwogCWZjbnRfYXZhaWwgPSBwZi0+ZmRpcl9wZl9maWx0ZXJfY291bnQ7CiAJaWYgKChmY250X3Byb2cgPCAoZmNudF9hdmFpbCAtIEk0MEVfRkRJUl9CVUZGRVJfSEVBRF9ST09NKSkgfHwKIAkgICAgKHBmLT5mZF9hZGRfZXJyID09IDApIHx8CkBAIC01NDEwLDEzICs1NDQyLDE3IEBACiB9CiAKICNkZWZpbmUgSTQwRV9NSU5fRkRfRkxVU0hfSU5URVJWQUwgMTAKKyNkZWZpbmUgSTQwRV9NSU5fRkRfRkxVU0hfU0JfQVRSX1VOU1RBQkxFIDMwCiAvKioKICAqIGk0MGVfZmRpcl9mbHVzaF9hbmRfcmVwbGF5IC0gRnVuY3Rpb24gdG8gZmx1c2ggYWxsIEZEIGZpbHRlcnMgYW5kIHJlcGxheSBTQgogICogQHBmOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQogICoqLwogc3RhdGljIHZvaWQgaTQwZV9mZGlyX2ZsdXNoX2FuZF9yZXBsYXkoc3RydWN0IGk0MGVfcGYgKnBmKQogeworCXVuc2lnbmVkIGxvbmcgbWluX2ZsdXNoX3RpbWU7CiAJaW50IGZsdXNoX3dhaXRfcmV0cnkgPSA1MDsKKwlib29sIGRpc2FibGVfYXRyID0gZmFsc2U7CisJaW50IGZkX3Jvb207CiAJaW50IHJlZzsKIAogCWlmICghKHBmLT5mbGFncyAmIChJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCB8IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkpKQpAQCAtNTQyNCw5ICs1NDYwLDIwIEBACiAKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwZi0+ZmRfZmx1c2hfdGltZXN0YW1wICsKIAkJCQkoSTQwRV9NSU5fRkRfRkxVU0hfSU5URVJWQUwgKiBIWikpKSB7Ci0JCXNldF9iaXQoX19JNDBFX0ZEX0ZMVVNIX1JFUVVFU1RFRCwgJnBmLT5zdGF0ZSk7CisJCS8qIElmIHRoZSBmbHVzaCBpcyBoYXBwZW5pbmcgdG9vIHF1aWNrIGFuZCB3ZSBoYXZlIG1vc3RseQorCQkgKiBTQiBydWxlcyB3ZSBzaG91bGQgbm90IHJlLWVuYWJsZSBBVFIgZm9yIHNvbWUgdGltZS4KKwkJICovCisJCW1pbl9mbHVzaF90aW1lID0gcGYtPmZkX2ZsdXNoX3RpbWVzdGFtcAorCQkJCSsgKEk0MEVfTUlOX0ZEX0ZMVVNIX1NCX0FUUl9VTlNUQUJMRSAqIEhaKTsKKwkJZmRfcm9vbSA9IHBmLT5mZGlyX3BmX2ZpbHRlcl9jb3VudCAtIHBmLT5mZGlyX3BmX2FjdGl2ZV9maWx0ZXJzOworCisJCWlmICghKHRpbWVfYWZ0ZXIoamlmZmllcywgbWluX2ZsdXNoX3RpbWUpKSAmJgorCQkgICAgKGZkX3Jvb20gPCBJNDBFX0ZESVJfQlVGRkVSX0hFQURfUk9PTV9GT1JfQVRSKSkgeworCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJBVFIgZGlzYWJsZWQsIG5vdCBlbm91Z2ggRkQgZmlsdGVyIHNwYWNlLlxuIik7CisJCQlkaXNhYmxlX2F0ciA9IHRydWU7CisJCX0KKwogCQlwZi0+ZmRfZmx1c2hfdGltZXN0YW1wID0gamlmZmllczsKLQkJcGYtPmF1dG9fZGlzYWJsZV9mbGFncyB8PSBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRDsKIAkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CiAJCS8qIGZsdXNoIGFsbCBmaWx0ZXJzICovCiAJCXdyMzIoJnBmLT5odywgSTQwRV9QRlFGX0NUTF8xLApAQCAtNTQ0NiwxMCArNTQ5Myw4IEBACiAJCX0gZWxzZSB7CiAJCQkvKiByZXBsYXkgc2lkZWJhbmQgZmlsdGVycyAqLwogCQkJaTQwZV9mZGlyX2ZpbHRlcl9yZXN0b3JlKHBmLT52c2lbcGYtPmxhbl92c2ldKTsKLQotCQkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKLQkJCXBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRDsKLQkJCXBmLT5hdXRvX2Rpc2FibGVfZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9TQl9FTkFCTEVEOworCQkJaWYgKCFkaXNhYmxlX2F0cikKKwkJCQlwZi0+ZmxhZ3MgfD0gSTQwRV9GTEFHX0ZEX0FUUl9FTkFCTEVEOwogCQkJY2xlYXJfYml0KF9fSTQwRV9GRF9GTFVTSF9SRVFVRVNURUQsICZwZi0+c3RhdGUpOwogCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJGRCBGaWx0ZXIgdGFibGUgZmx1c2hlZCBhbmQgRkQtU0IgcmVwbGF5ZWQuXG4iKTsKIAkJfQpAQCAtNTQ2MCw3ICs1NTA1LDcgQEAKICAqIGk0MGVfZ2V0X2N1cnJlbnRfYXRyX2NvdW50IC0gR2V0IHRoZSBjb3VudCBvZiB0b3RhbCBGRCBBVFIgZmlsdGVycyBwcm9ncmFtbWVkCiAgKiBAcGY6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKiovCi1pbnQgaTQwZV9nZXRfY3VycmVudF9hdHJfY250KHN0cnVjdCBpNDBlX3BmICpwZikKK3UzMiBpNDBlX2dldF9jdXJyZW50X2F0cl9jbnQoc3RydWN0IGk0MGVfcGYgKnBmKQogewogCXJldHVybiBpNDBlX2dldF9jdXJyZW50X2ZkX2NvdW50KHBmKSAtIHBmLT5mZGlyX3BmX2FjdGl2ZV9maWx0ZXJzOwogfQpAQCAtNTQ4Niw5ICs1NTMxLDcgQEAKIAlpZiAoIShwZi0+ZmxhZ3MgJiAoSTQwRV9GTEFHX0ZEX1NCX0VOQUJMRUQgfCBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQpKSkKIAkJcmV0dXJuOwogCi0JaWYgKChwZi0+ZmRfYWRkX2VyciA+PSBJNDBFX01BWF9GRF9QUk9HUkFNX0VSUk9SKSAmJgotCSAgICAoaTQwZV9nZXRfY3VycmVudF9hdHJfY250KHBmKSA+PSBwZi0+ZmRfYXRyX2NudCkgJiYKLQkgICAgKGk0MGVfZ2V0X2N1cnJlbnRfYXRyX2NudChwZikgPiBwZi0+ZmRpcl9wZl9maWx0ZXJfY291bnQpKQorCWlmICh0ZXN0X2JpdChfX0k0MEVfRkRfRkxVU0hfUkVRVUVTVEVELCAmcGYtPnN0YXRlKSkKIAkJaTQwZV9mZGlyX2ZsdXNoX2FuZF9yZXBsYXkocGYpOwogCiAJaTQwZV9mZGlyX2NoZWNrX2FuZF9yZWVuYWJsZShwZik7CkBAIC01NzU3LDExICs1ODAwLDkgQEAKIAlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmcGYtPmh3OwogCXN0cnVjdCBpNDBlX2FxY19nZXRfbGlua19zdGF0dXMgKnN0YXR1cyA9CiAJCShzdHJ1Y3QgaTQwZV9hcWNfZ2V0X2xpbmtfc3RhdHVzICopJmUtPmRlc2MucGFyYW1zLnJhdzsKLQlzdHJ1Y3QgaTQwZV9saW5rX3N0YXR1cyAqaHdfbGlua19pbmZvID0gJmh3LT5waHkubGlua19pbmZvOwogCiAJLyogc2F2ZSBvZmYgb2xkIGxpbmsgc3RhdHVzIGluZm9ybWF0aW9uICovCi0JbWVtY3B5KCZwZi0+aHcucGh5LmxpbmtfaW5mb19vbGQsIGh3X2xpbmtfaW5mbywKLQkgICAgICAgc2l6ZW9mKHBmLT5ody5waHkubGlua19pbmZvX29sZCkpOworCWh3LT5waHkubGlua19pbmZvX29sZCA9IGh3LT5waHkubGlua19pbmZvOwogCiAJLyogRG8gYSBuZXcgc3RhdHVzIHJlcXVlc3QgdG8gcmUtZW5hYmxlIExTRSByZXBvcnRpbmcKIAkgKiBhbmQgbG9hZCBuZXcgc3RhdHVzIGluZm9ybWF0aW9uIGludG8gdGhlIGh3IHN0cnVjdApAQCAtNTg3NSw2ICs1OTE2LDEwIEBACiAJCWNhc2UgaTQwZV9hcWNfb3BjX3NlbmRfbXNnX3RvX3BlZXI6CiAJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIkFSUTogTXNnIGZyb20gb3RoZXIgcGZcbiIpOwogCQkJYnJlYWs7CisJCWNhc2UgaTQwZV9hcWNfb3BjX252bV9lcmFzZToKKwkJY2FzZSBpNDBlX2FxY19vcGNfbnZtX3VwZGF0ZToKKwkJCWk0MGVfZGVidWcoJnBmLT5odywgSTQwRV9ERUJVR19OVk0sICJBUlEgTlZNIG9wZXJhdGlvbiBjb21wbGV0ZWRcbiIpOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKIAkJCQkgIkFSUSBFcnJvcjogVW5rbm93biBldmVudCAweCUwNHggcmVjZWl2ZWRcbiIsCkBAIC01OTE5LDYgKzU5NjQsOTQgQEAKIH0KIAogLyoqCisgKiBpNDBlX2VuYWJsZV9wZl9zd2l0Y2hfbGIKKyAqIEBwZjogcG9pbnRlciB0byB0aGUgUEYgc3RydWN0dXJlCisgKgorICogZW5hYmxlIHN3aXRjaCBsb29wIGJhY2sgb3IgZGllIC0gbm8gcG9pbnQgaW4gYSByZXR1cm4gdmFsdWUKKyAqKi8KK3N0YXRpYyB2b2lkIGk0MGVfZW5hYmxlX3BmX3N3aXRjaF9sYihzdHJ1Y3QgaTQwZV9wZiAqcGYpCit7CisJc3RydWN0IGk0MGVfdnNpICp2c2kgPSBwZi0+dnNpW3BmLT5sYW5fdnNpXTsKKwlzdHJ1Y3QgaTQwZV92c2lfY29udGV4dCBjdHh0OworCWludCBhcV9yZXQ7CisKKwljdHh0LnNlaWQgPSBwZi0+bWFpbl92c2lfc2VpZDsKKwljdHh0LnBmX251bSA9IHBmLT5ody5wZl9pZDsKKwljdHh0LnZmX251bSA9IDA7CisJYXFfcmV0ID0gaTQwZV9hcV9nZXRfdnNpX3BhcmFtcygmcGYtPmh3LCAmY3R4dCwgTlVMTCk7CisJaWYgKGFxX3JldCkgeworCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKKwkJCSAiJXMgY291bGRuJ3QgZ2V0IFBGIHZzaSBjb25maWcsIGVyciAlZCwgYXFfZXJyICVkXG4iLAorCQkJIF9fZnVuY19fLCBhcV9yZXQsIHBmLT5ody5hcS5hc3FfbGFzdF9zdGF0dXMpOworCQlyZXR1cm47CisJfQorCWN0eHQuZmxhZ3MgPSBJNDBFX0FRX1ZTSV9UWVBFX1BGOworCWN0eHQuaW5mby52YWxpZF9zZWN0aW9ucyA9IGNwdV90b19sZTE2KEk0MEVfQVFfVlNJX1BST1BfU1dJVENIX1ZBTElEKTsKKwljdHh0LmluZm8uc3dpdGNoX2lkIHw9IGNwdV90b19sZTE2KEk0MEVfQVFfVlNJX1NXX0lEX0ZMQUdfQUxMT1dfTEIpOworCisJYXFfcmV0ID0gaTQwZV9hcV91cGRhdGVfdnNpX3BhcmFtcygmdnNpLT5iYWNrLT5odywgJmN0eHQsIE5VTEwpOworCWlmIChhcV9yZXQpIHsKKwkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCisJCQkgIiVzOiB1cGRhdGUgdnNpIHN3aXRjaCBmYWlsZWQsIGFxX2Vycj0lZFxuIiwKKwkJCSBfX2Z1bmNfXywgdnNpLT5iYWNrLT5ody5hcS5hc3FfbGFzdF9zdGF0dXMpOworCX0KK30KKworLyoqCisgKiBpNDBlX2Rpc2FibGVfcGZfc3dpdGNoX2xiCisgKiBAcGY6IHBvaW50ZXIgdG8gdGhlIFBGIHN0cnVjdHVyZQorICoKKyAqIGRpc2FibGUgc3dpdGNoIGxvb3AgYmFjayBvciBkaWUgLSBubyBwb2ludCBpbiBhIHJldHVybiB2YWx1ZQorICoqLworc3RhdGljIHZvaWQgaTQwZV9kaXNhYmxlX3BmX3N3aXRjaF9sYihzdHJ1Y3QgaTQwZV9wZiAqcGYpCit7CisJc3RydWN0IGk0MGVfdnNpICp2c2kgPSBwZi0+dnNpW3BmLT5sYW5fdnNpXTsKKwlzdHJ1Y3QgaTQwZV92c2lfY29udGV4dCBjdHh0OworCWludCBhcV9yZXQ7CisKKwljdHh0LnNlaWQgPSBwZi0+bWFpbl92c2lfc2VpZDsKKwljdHh0LnBmX251bSA9IHBmLT5ody5wZl9pZDsKKwljdHh0LnZmX251bSA9IDA7CisJYXFfcmV0ID0gaTQwZV9hcV9nZXRfdnNpX3BhcmFtcygmcGYtPmh3LCAmY3R4dCwgTlVMTCk7CisJaWYgKGFxX3JldCkgeworCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKKwkJCSAiJXMgY291bGRuJ3QgZ2V0IFBGIHZzaSBjb25maWcsIGVyciAlZCwgYXFfZXJyICVkXG4iLAorCQkJIF9fZnVuY19fLCBhcV9yZXQsIHBmLT5ody5hcS5hc3FfbGFzdF9zdGF0dXMpOworCQlyZXR1cm47CisJfQorCWN0eHQuZmxhZ3MgPSBJNDBFX0FRX1ZTSV9UWVBFX1BGOworCWN0eHQuaW5mby52YWxpZF9zZWN0aW9ucyA9IGNwdV90b19sZTE2KEk0MEVfQVFfVlNJX1BST1BfU1dJVENIX1ZBTElEKTsKKwljdHh0LmluZm8uc3dpdGNoX2lkICY9IH5jcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9TV19JRF9GTEFHX0FMTE9XX0xCKTsKKworCWFxX3JldCA9IGk0MGVfYXFfdXBkYXRlX3ZzaV9wYXJhbXMoJnZzaS0+YmFjay0+aHcsICZjdHh0LCBOVUxMKTsKKwlpZiAoYXFfcmV0KSB7CisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAorCQkJICIlczogdXBkYXRlIHZzaSBzd2l0Y2ggZmFpbGVkLCBhcV9lcnI9JWRcbiIsCisJCQkgX19mdW5jX18sIHZzaS0+YmFjay0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzKTsKKwl9Cit9CisKKy8qKgorICogaTQwZV9jb25maWdfYnJpZGdlX21vZGUgLSBDb25maWd1cmUgdGhlIEhXIGJyaWRnZSBtb2RlCisgKiBAdmViOiBwb2ludGVyIHRvIHRoZSBicmlkZ2UgaW5zdGFuY2UKKyAqCisgKiBDb25maWd1cmUgdGhlIGxvb3AgYmFjayBtb2RlIGZvciB0aGUgTEFOIFZTSSB0aGF0IGlzIGRvd25saW5rIHRvIHRoZQorICogc3BlY2lmaWVkIEhXIGJyaWRnZSBpbnN0YW5jZS4gSXQgaXMgZXhwZWN0ZWQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAqIHdoZW4gYSBuZXcgSFcgYnJpZGdlIGlzIGluc3RhbnRpYXRlZC4KKyAqKi8KK3N0YXRpYyB2b2lkIGk0MGVfY29uZmlnX2JyaWRnZV9tb2RlKHN0cnVjdCBpNDBlX3ZlYiAqdmViKQoreworCXN0cnVjdCBpNDBlX3BmICpwZiA9IHZlYi0+cGY7CisKKwlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgImVuYWJsaW5nIGJyaWRnZSBtb2RlOiAlc1xuIiwKKwkJIHZlYi0+YnJpZGdlX21vZGUgPT0gQlJJREdFX01PREVfVkVQQSA/ICJWRVBBIiA6ICJWRUIiKTsKKwlpZiAodmViLT5icmlkZ2VfbW9kZSAmIEJSSURHRV9NT0RFX1ZFUEEpCisJCWk0MGVfZGlzYWJsZV9wZl9zd2l0Y2hfbGIocGYpOworCWVsc2UKKwkJaTQwZV9lbmFibGVfcGZfc3dpdGNoX2xiKHBmKTsKK30KKworLyoqCiAgKiBpNDBlX3JlY29uc3RpdHV0ZV92ZWIgLSByZWJ1aWxkIHRoZSBWRUIgYW5kIGFueXRoaW5nIGNvbm5lY3RlZCB0byBpdAogICogQHZlYjogcG9pbnRlciB0byB0aGUgVkVCIGluc3RhbmNlCiAgKgpAQCAtNTk2NCw4ICs2MDk3LDcgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVuZF9yZWNvbnN0aXR1dGU7CiAKLQkvKiBFbmFibGUgTEIgbW9kZSBmb3IgdGhlIG1haW4gVlNJIG5vdyB0aGF0IGl0IGlzIG9uIGEgVkVCICovCi0JaTQwZV9lbmFibGVfcGZfc3dpdGNoX2xiKHBmKTsKKwlpNDBlX2NvbmZpZ19icmlkZ2VfbW9kZSh2ZWIpOwogCiAJLyogY3JlYXRlIHRoZSByZW1haW5pbmcgVlNJcyBhdHRhY2hlZCB0byB0aGlzIFZFQiAqLwogCWZvciAodiA9IDA7IHYgPCBwZi0+bnVtX2FsbG9jX3ZzaTsgdisrKSB7CkBAIC02MTM3LDcgKzYyNjksNyBAQAogICogaTQwZV9wcmVwX2Zvcl9yZXNldCAtIHByZXAgZm9yIHRoZSBjb3JlIHRvIHJlc2V0CiAgKiBAcGY6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKgotICogQ2xvc2UgdXAgdGhlIFZGcyBhbmQgb3RoZXIgdGhpbmdzIGluIHByZXAgZm9yIHBmIFJlc2V0LgorICogQ2xvc2UgdXAgdGhlIFZGcyBhbmQgb3RoZXIgdGhpbmdzIGluIHByZXAgZm9yIFBGIFJlc2V0LgogICAqKi8KIHN0YXRpYyB2b2lkIGk0MGVfcHJlcF9mb3JfcmVzZXQoc3RydWN0IGk0MGVfcGYgKnBmKQogewpAQCAtNjIyMiwxMCArNjM1NCw4IEBACiAJfQogCiAJLyogcmUtdmVyaWZ5IHRoZSBlZXByb20gaWYgd2UganVzdCBoYWQgYW4gRU1QIHJlc2V0ICovCi0JaWYgKHRlc3RfYml0KF9fSTQwRV9FTVBfUkVTRVRfUkVRVUVTVEVELCAmcGYtPnN0YXRlKSkgewotCQljbGVhcl9iaXQoX19JNDBFX0VNUF9SRVNFVF9SRVFVRVNURUQsICZwZi0+c3RhdGUpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoX19JNDBFX0VNUF9SRVNFVF9JTlRSX1JFQ0VJVkVELCAmcGYtPnN0YXRlKSkKIAkJaTQwZV92ZXJpZnlfZWVwcm9tKHBmKTsKLQl9CiAKIAlpNDBlX2NsZWFyX3B4ZV9tb2RlKGh3KTsKIAlyZXQgPSBpNDBlX2dldF9jYXBhYmlsaXRpZXMocGYpOwpAQCAtNjMzNSwxMyArNjQ2NSwxNCBAQAogCQl9CiAJfQogCi0JbXNsZWVwKDc1KTsKLQlyZXQgPSBpNDBlX2FxX3NldF9saW5rX3Jlc3RhcnRfYW4oJnBmLT5odywgdHJ1ZSwgTlVMTCk7Ci0JaWYgKHJldCkgewotCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgImxpbmsgcmVzdGFydCBmYWlsZWQsIGFxX2Vycj0lZFxuIiwKLQkJCSBwZi0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzKTsKKwlpZiAoKChwZi0+aHcuYXEuZndfbWFqX3ZlciA9PSA0KSAmJiAocGYtPmh3LmFxLmZ3X21pbl92ZXIgPCAzMykpIHx8CisJICAgIChwZi0+aHcuYXEuZndfbWFqX3ZlciA8IDQpKSB7CisJCW1zbGVlcCg3NSk7CisJCXJldCA9IGk0MGVfYXFfc2V0X2xpbmtfcmVzdGFydF9hbigmcGYtPmh3LCB0cnVlLCBOVUxMKTsKKwkJaWYgKHJldCkKKwkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAibGluayByZXN0YXJ0IGZhaWxlZCwgYXFfZXJyPSVkXG4iLAorCQkJCSBwZi0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzKTsKIAl9Ci0KIAkvKiByZWluaXQgdGhlIG1pc2MgaW50ZXJydXB0ICovCiAJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NU0lYX0VOQUJMRUQpCiAJCXJldCA9IGk0MGVfc2V0dXBfbWlzY192ZWN0b3IocGYpOwpAQCAtNjM2NCw3ICs2NDk1LDcgQEAKIH0KIAogLyoqCi0gKiBpNDBlX2hhbmRsZV9yZXNldF93YXJuaW5nIC0gcHJlcCBmb3IgdGhlIHBmIHRvIHJlc2V0LCByZXNldCBhbmQgcmVidWlsZAorICogaTQwZV9oYW5kbGVfcmVzZXRfd2FybmluZyAtIHByZXAgZm9yIHRoZSBQRiB0byByZXNldCwgcmVzZXQgYW5kIHJlYnVpbGQKICAqIEBwZjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqCiAgKiBDbG9zZSB1cCB0aGUgVkZzIGFuZCBvdGhlciB0aGluZ3MgaW4gcHJlcCBmb3IgYSBDb3JlIFJlc2V0LApAQCAtNjM3OCw3ICs2NTA5LDcgQEAKIAogLyoqCiAgKiBpNDBlX2hhbmRsZV9tZGRfZXZlbnQKLSAqIEBwZjogcG9pbnRlciB0byB0aGUgcGYgc3RydWN0dXJlCisgKiBAcGY6IHBvaW50ZXIgdG8gdGhlIFBGIHN0cnVjdHVyZQogICoKICAqIENhbGxlZCBmcm9tIHRoZSBNREQgaXJxIGhhbmRsZXIgdG8gaWRlbnRpZnkgcG9zc2libHkgbWFsaWNpb3VzIHZmcwogICoqLwpAQCAtNjQwNyw3ICs2NTM4LDcgQEAKIAkJCQlJNDBFX0dMX01ERVRfVFhfUVVFVUVfU0hJRlQpIC0KIAkJCQlwZi0+aHcuZnVuY19jYXBzLmJhc2VfcXVldWU7CiAJCWlmIChuZXRpZl9tc2dfdHhfZXJyKHBmKSkKLQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiTWFsaWNpb3VzIERyaXZlciBEZXRlY3Rpb24gZXZlbnQgMHglMDJ4IG9uIFRYIHF1ZXVlICVkIHBmIG51bWJlciAweCUwMnggdmYgbnVtYmVyIDB4JTAyeFxuIiwKKwkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiTWFsaWNpb3VzIERyaXZlciBEZXRlY3Rpb24gZXZlbnQgMHglMDJ4IG9uIFRYIHF1ZXVlICVkIFBGIG51bWJlciAweCUwMnggVkYgbnVtYmVyIDB4JTAyeFxuIiwKIAkJCQkgZXZlbnQsIHF1ZXVlLCBwZl9udW0sIHZmX251bSk7CiAJCXdyMzIoaHcsIEk0MEVfR0xfTURFVF9UWCwgMHhmZmZmZmZmZik7CiAJCW1kZF9kZXRlY3RlZCA9IHRydWU7CkBAIC02NDkzLDcgKzY2MjQsNiBAQAogewogCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7CiAJaTQwZV9zdGF0dXMgcmV0OwotCXU4IGZpbHRlcl9pbmRleDsKIAlfX2JlMTYgcG9ydDsKIAlpbnQgaTsKIApAQCAtNjUwNiwyMiArNjYzNiwyMCBAQAogCQlpZiAocGYtPnBlbmRpbmdfdnhsYW5fYml0bWFwICYgKDEgPDwgaSkpIHsKIAkJCXBmLT5wZW5kaW5nX3Z4bGFuX2JpdG1hcCAmPSB+KDEgPDwgaSk7CiAJCQlwb3J0ID0gcGYtPnZ4bGFuX3BvcnRzW2ldOwotCQkJcmV0ID0gcG9ydCA/Ci0JCQkgICAgICBpNDBlX2FxX2FkZF91ZHBfdHVubmVsKGh3LCBudG9ocyhwb3J0KSwKKwkJCWlmIChwb3J0KQorCQkJCXJldCA9IGk0MGVfYXFfYWRkX3VkcF90dW5uZWwoaHcsIG50b2hzKHBvcnQpLAogCQkJCQkJICAgICBJNDBFX0FRQ19UVU5ORUxfVFlQRV9WWExBTiwKLQkJCQkJCSAgICAgJmZpbHRlcl9pbmRleCwgTlVMTCkKLQkJCSAgICAgIDogaTQwZV9hcV9kZWxfdWRwX3R1bm5lbChodywgaSwgTlVMTCk7CisJCQkJCQkgICAgIE5VTEwsIE5VTEwpOworCQkJZWxzZQorCQkJCXJldCA9IGk0MGVfYXFfZGVsX3VkcF90dW5uZWwoaHcsIGksIE5VTEwpOwogCiAJCQlpZiAocmV0KSB7Ci0JCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJGYWlsZWQgdG8gZXhlY3V0ZSBBUSBjb21tYW5kIGZvciAlcyBwb3J0ICVkIHdpdGggaW5kZXggJWRcbiIsCi0JCQkJCSBwb3J0ID8gImFkZGluZyIgOiAiZGVsZXRpbmciLAotCQkJCQkgbnRvaHMocG9ydCksIHBvcnQgPyBpIDogaSk7Ci0KKwkJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKKwkJCQkJICIlcyB2eGxhbiBwb3J0ICVkLCBpbmRleCAlZCBmYWlsZWQsIGVyciAlZCwgYXFfZXJyICVkXG4iLAorCQkJCQkgcG9ydCA/ICJhZGQiIDogImRlbGV0ZSIsCisJCQkJCSBudG9ocyhwb3J0KSwgaSwgcmV0LAorCQkJCQkgcGYtPmh3LmFxLmFzcV9sYXN0X3N0YXR1cyk7CiAJCQkJcGYtPnZ4bGFuX3BvcnRzW2ldID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICIlcyBwb3J0ICVkIHdpdGggQVEgY29tbWFuZCB3aXRoIGluZGV4ICVkXG4iLAotCQkJCQkgcG9ydCA/ICJBZGRlZCIgOiAiRGVsZXRlZCIsCi0JCQkJCSBudG9ocyhwb3J0KSwgcG9ydCA/IGkgOiBmaWx0ZXJfaW5kZXgpOwogCQkJfQogCQl9CiAJfQpAQCAtNjcyOCw2ICs2ODU2LDggQEAKIAl2c2ktPmlkeCA9IHZzaV9pZHg7CiAJdnNpLT5yeF9pdHJfc2V0dGluZyA9IHBmLT5yeF9pdHJfZGVmYXVsdDsKIAl2c2ktPnR4X2l0cl9zZXR0aW5nID0gcGYtPnR4X2l0cl9kZWZhdWx0OworCXZzaS0+cnNzX3RhYmxlX3NpemUgPSAodnNpLT50eXBlID09IEk0MEVfVlNJX01BSU4pID8KKwkJCQlwZi0+cnNzX3RhYmxlX3NpemUgOiA2NDsKIAl2c2ktPm5ldGRldl9yZWdpc3RlcmVkID0gZmFsc2U7CiAJdnNpLT53b3JrX2xpbWl0ID0gSTQwRV9ERUZBVUxUX0lSUV9XT1JLOwogCUlOSVRfTElTVF9IRUFEKCZ2c2ktPm1hY19maWx0ZXJfbGlzdCk7CkBAIC02ODA4LDcgKzY5MzgsNyBAQAogCQlnb3RvIHVubG9ja192c2k7CiAJfQogCi0JLyogdXBkYXRlcyB0aGUgcGYgZm9yIHRoaXMgY2xlYXJlZCB2c2kgKi8KKwkvKiB1cGRhdGVzIHRoZSBQRiBmb3IgdGhpcyBjbGVhcmVkIHZzaSAqLwogCWk0MGVfcHV0X2x1bXAocGYtPnFwX3BpbGUsIHZzaS0+YmFzZV9xdWV1ZSwgdnNpLT5pZHgpOwogCWk0MGVfcHV0X2x1bXAocGYtPmlycV9waWxlLCB2c2ktPmJhc2VfdmVjdG9yLCB2c2ktPmlkeCk7CiAKQEAgLTY5MjEsMTUgKzcwNTEsMTQgQEAKICAqCiAgKiBXb3JrIHdpdGggdGhlIE9TIHRvIHNldCB1cCB0aGUgTVNJWCB2ZWN0b3JzIG5lZWRlZC4KICAqCi0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHZlY3RvcnMgcmVzZXJ2ZWQgb3IgbmVnYXRpdmUgb24gZmFpbHVyZQogICoqLwogc3RhdGljIGludCBpNDBlX2luaXRfbXNpeChzdHJ1Y3QgaTQwZV9wZiAqcGYpCiB7Ci0JaTQwZV9zdGF0dXMgZXJyID0gMDsKIAlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmcGYtPmh3OwotCWludCBvdGhlcl92ZWNzID0gMDsKKwlpbnQgdmVjdG9yc19sZWZ0OwogCWludCB2X2J1ZGdldCwgaTsKLQlpbnQgdmVjOworCWludCB2X2FjdHVhbDsKIAogCWlmICghKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NU0lYX0VOQUJMRUQpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTY5NTEsMjQgKzcwODAsNjIgQEAKIAkgKiBJZiB3ZSBjYW4ndCBnZXQgd2hhdCB3ZSB3YW50LCB3ZSdsbCBzaW1wbGlmeSB0byBuZWFybHkgbm90aGluZwogCSAqIGFuZCB0cnkgYWdhaW4uICBJZiB0aGF0IHN0aWxsIGZhaWxzLCB3ZSBwdW50LgogCSAqLwotCXBmLT5udW1fbGFuX21zaXggPSBwZi0+bnVtX2xhbl9xcHMgLSAocGYtPnJzc19zaXplX21heCAtIHBmLT5yc3Nfc2l6ZSk7Ci0JcGYtPm51bV92bWRxX21zaXggPSBwZi0+bnVtX3ZtZHFfcXBzOwotCW90aGVyX3ZlY3MgPSAxOwotCW90aGVyX3ZlY3MgKz0gKHBmLT5udW1fdm1kcV92c2lzICogcGYtPm51bV92bWRxX21zaXgpOwotCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkKLQkJb3RoZXJfdmVjcysrOworCXZlY3RvcnNfbGVmdCA9IGh3LT5mdW5jX2NhcHMubnVtX21zaXhfdmVjdG9yczsKKwl2X2J1ZGdldCA9IDA7CiAKLQkvKiBTY2FsZSBkb3duIGlmIG5lY2Vzc2FyeSwgYW5kIHRoZSByaW5ncyB3aWxsIHNoYXJlIHZlY3RvcnMgKi8KLQlwZi0+bnVtX2xhbl9tc2l4ID0gbWluX3QoaW50LCBwZi0+bnVtX2xhbl9tc2l4LAotCQkJKGh3LT5mdW5jX2NhcHMubnVtX21zaXhfdmVjdG9ycyAtIG90aGVyX3ZlY3MpKTsKLQl2X2J1ZGdldCA9IHBmLT5udW1fbGFuX21zaXggKyBvdGhlcl92ZWNzOworCS8qIHJlc2VydmUgb25lIHZlY3RvciBmb3IgbWlzY2VsbGFuZW91cyBoYW5kbGVyICovCisJaWYgKHZlY3RvcnNfbGVmdCkgeworCQl2X2J1ZGdldCsrOworCQl2ZWN0b3JzX2xlZnQtLTsKKwl9CisKKwkvKiByZXNlcnZlIHZlY3RvcnMgZm9yIHRoZSBtYWluIFBGIHRyYWZmaWMgcXVldWVzICovCisJcGYtPm51bV9sYW5fbXNpeCA9IG1pbl90KGludCwgbnVtX29ubGluZV9jcHVzKCksIHZlY3RvcnNfbGVmdCk7CisJdmVjdG9yc19sZWZ0IC09IHBmLT5udW1fbGFuX21zaXg7CisJdl9idWRnZXQgKz0gcGYtPm51bV9sYW5fbXNpeDsKKworCS8qIHJlc2VydmUgb25lIHZlY3RvciBmb3Igc2lkZWJhbmQgZmxvdyBkaXJlY3RvciAqLworCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRCkgeworCQlpZiAodmVjdG9yc19sZWZ0KSB7CisJCQl2X2J1ZGdldCsrOworCQkJdmVjdG9yc19sZWZ0LS07CisJCX0gZWxzZSB7CisJCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9TQl9FTkFCTEVEOworCQl9CisJfQogCiAjaWZkZWYgSTQwRV9GQ09FCisJLyogY2FuIHdlIHJlc2VydmUgZW5vdWdoIGZvciBGQ29FPyAqLwogCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfRkNPRV9FTkFCTEVEKSB7Ci0JCXBmLT5udW1fZmNvZV9tc2l4ID0gcGYtPm51bV9mY29lX3FwczsKKwkJaWYgKCF2ZWN0b3JzX2xlZnQpCisJCQlwZi0+bnVtX2Zjb2VfbXNpeCA9IDA7CisJCWVsc2UgaWYgKHZlY3RvcnNfbGVmdCA+PSBwZi0+bnVtX2Zjb2VfcXBzKQorCQkJcGYtPm51bV9mY29lX21zaXggPSBwZi0+bnVtX2Zjb2VfcXBzOworCQllbHNlCisJCQlwZi0+bnVtX2Zjb2VfbXNpeCA9IDE7CiAJCXZfYnVkZ2V0ICs9IHBmLT5udW1fZmNvZV9tc2l4OworCQl2ZWN0b3JzX2xlZnQgLT0gcGYtPm51bV9mY29lX21zaXg7CiAJfQorCiAjZW5kaWYKKwkvKiBhbnkgdmVjdG9ycyBsZWZ0IG92ZXIgZ28gZm9yIFZNRHEgc3VwcG9ydCAqLworCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfVk1EUV9FTkFCTEVEKSB7CisJCWludCB2bWRxX3ZlY3Nfd2FudGVkID0gcGYtPm51bV92bWRxX3ZzaXMgKiBwZi0+bnVtX3ZtZHFfcXBzOworCQlpbnQgdm1kcV92ZWNzID0gbWluX3QoaW50LCB2ZWN0b3JzX2xlZnQsIHZtZHFfdmVjc193YW50ZWQpOworCisJCS8qIGlmIHdlJ3JlIHNob3J0IG9uIHZlY3RvcnMgZm9yIHdoYXQncyBkZXNpcmVkLCB3ZSBsaW1pdAorCQkgKiB0aGUgcXVldWVzIHBlciB2bWRxLiAgSWYgdGhpcyBpcyBzdGlsbCBtb3JlIHRoYW4gYXJlCisJCSAqIGF2YWlsYWJsZSwgdGhlIHVzZXIgd2lsbCBuZWVkIHRvIGNoYW5nZSB0aGUgbnVtYmVyIG9mCisJCSAqIHF1ZXVlcy92ZWN0b3JzIHVzZWQgYnkgdGhlIFBGIGxhdGVyIHdpdGggdGhlIGV0aHRvb2wKKwkJICogY2hhbm5lbHMgY29tbWFuZAorCQkgKi8KKwkJaWYgKHZtZHFfdmVjcyA8IHZtZHFfdmVjc193YW50ZWQpCisJCQlwZi0+bnVtX3ZtZHFfcXBzID0gMTsKKwkJcGYtPm51bV92bWRxX21zaXggPSBwZi0+bnVtX3ZtZHFfcXBzOworCisJCXZfYnVkZ2V0ICs9IHZtZHFfdmVjczsKKwkJdmVjdG9yc19sZWZ0IC09IHZtZHFfdmVjczsKKwl9CiAKIAlwZi0+bXNpeF9lbnRyaWVzID0ga2NhbGxvYyh2X2J1ZGdldCwgc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSwKIAkJCQkgICBHRlBfS0VSTkVMKTsKQEAgLTY5NzcsOSArNzE0NCw5IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgdl9idWRnZXQ7IGkrKykKIAkJcGYtPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7Ci0JdmVjID0gaTQwZV9yZXNlcnZlX21zaXhfdmVjdG9ycyhwZiwgdl9idWRnZXQpOworCXZfYWN0dWFsID0gaTQwZV9yZXNlcnZlX21zaXhfdmVjdG9ycyhwZiwgdl9idWRnZXQpOwogCi0JaWYgKHZlYyAhPSB2X2J1ZGdldCkgeworCWlmICh2X2FjdHVhbCAhPSB2X2J1ZGdldCkgewogCQkvKiBJZiB3ZSBoYXZlIGxpbWl0ZWQgcmVzb3VyY2VzLCB3ZSB3aWxsIHN0YXJ0IHdpdGggbm8gdmVjdG9ycwogCQkgKiBmb3IgdGhlIHNwZWNpYWwgZmVhdHVyZXMgYW5kIHRoZW4gYWxsb2NhdGUgdmVjdG9ycyB0byBzb21lCiAJCSAqIG9mIHRoZXNlIGZlYXR1cmVzIGJhc2VkIG9uIHRoZSBwb2xpY3kgYW5kIGF0IHRoZSBlbmQgZGlzYWJsZQpAQCAtNjk5MiwyNiArNzE1OSwzMCBAQAogCQlwZi0+bnVtX3ZtZHFfbXNpeCA9IDA7CiAJfQogCi0JaWYgKHZlYyA8IEk0MEVfTUlOX01TSVgpIHsKKwlpZiAodl9hY3R1YWwgPCBJNDBFX01JTl9NU0lYKSB7CiAJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX01TSVhfRU5BQkxFRDsKIAkJa2ZyZWUocGYtPm1zaXhfZW50cmllcyk7CiAJCXBmLT5tc2l4X2VudHJpZXMgPSBOVUxMOwogCQlyZXR1cm4gLUVOT0RFVjsKIAotCX0gZWxzZSBpZiAodmVjID09IEk0MEVfTUlOX01TSVgpIHsKKwl9IGVsc2UgaWYgKHZfYWN0dWFsID09IEk0MEVfTUlOX01TSVgpIHsKIAkJLyogQWRqdXN0IGZvciBtaW5pbWFsIE1TSVggdXNlICovCiAJCXBmLT5udW1fdm1kcV92c2lzID0gMDsKIAkJcGYtPm51bV92bWRxX3FwcyA9IDA7CiAJCXBmLT5udW1fbGFuX3FwcyA9IDE7CiAJCXBmLT5udW1fbGFuX21zaXggPSAxOwogCi0JfSBlbHNlIGlmICh2ZWMgIT0gdl9idWRnZXQpIHsKKwl9IGVsc2UgaWYgKHZfYWN0dWFsICE9IHZfYnVkZ2V0KSB7CisJCWludCB2ZWM7CisKIAkJLyogcmVzZXJ2ZSB0aGUgbWlzYyB2ZWN0b3IgKi8KLQkJdmVjLS07CisJCXZlYyA9IHZfYWN0dWFsIC0gMTsKIAogCQkvKiBTY2FsZSB2ZWN0b3IgdXNhZ2UgZG93biAqLwogCQlwZi0+bnVtX3ZtZHFfbXNpeCA9IDE7ICAgIC8qIGZvcmNlIFZNRHFzIHRvIG9ubHkgb25lIHZlY3RvciAqLwogCQlwZi0+bnVtX3ZtZHFfdnNpcyA9IDE7CisJCXBmLT5udW1fdm1kcV9xcHMgPSAxOworCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19GRF9TQl9FTkFCTEVEOwogCiAJCS8qIHBhcnRpdGlvbiBvdXQgdGhlIHJlbWFpbmluZyB2ZWN0b3JzICovCiAJCXN3aXRjaCAodmVjKSB7CkBAIC03MDM3LDEwICs3MjA4LDggQEAKIAkJCQl2ZWMtLTsKIAkJCX0KICNlbmRpZgotCQkJcGYtPm51bV9sYW5fbXNpeCA9IG1pbl90KGludCwgKHZlYyAvIDIpLAotCQkJCQkJIHBmLT5udW1fbGFuX3Fwcyk7Ci0JCQlwZi0+bnVtX3ZtZHFfdnNpcyA9IG1pbl90KGludCwgKHZlYyAtIHBmLT5udW1fbGFuX21zaXgpLAotCQkJCQkJICBJNDBFX0RFRkFVTFRfTlVNX1ZNRFFfVlNJKTsKKwkJCS8qIGdpdmUgdGhlIHJlc3QgdG8gdGhlIFBGICovCisJCQlwZi0+bnVtX2xhbl9tc2l4ID0gbWluX3QoaW50LCB2ZWMsIHBmLT5udW1fbGFuX3Fwcyk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTcwNTcsNyArNzIyNiw3IEBACiAJCXBmLT5mbGFncyAmPSB+STQwRV9GTEFHX0ZDT0VfRU5BQkxFRDsKIAl9CiAjZW5kaWYKLQlyZXR1cm4gZXJyOworCXJldHVybiB2X2FjdHVhbDsKIH0KIAogLyoqCkBAIC03MTM0LDExICs3MzAzLDEyIEBACiAgKiovCiBzdGF0aWMgdm9pZCBpNDBlX2luaXRfaW50ZXJydXB0X3NjaGVtZShzdHJ1Y3QgaTQwZV9wZiAqcGYpCiB7Ci0JaW50IGVyciA9IDA7CisJaW50IHZlY3RvcnMgPSAwOworCXNzaXplX3Qgc2l6ZTsKIAogCWlmIChwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfTVNJWF9FTkFCTEVEKSB7Ci0JCWVyciA9IGk0MGVfaW5pdF9tc2l4KHBmKTsKLQkJaWYgKGVycikgeworCQl2ZWN0b3JzID0gaTQwZV9pbml0X21zaXgocGYpOworCQlpZiAodmVjdG9ycyA8IDApIHsKIAkJCXBmLT5mbGFncyAmPSB+KEk0MEVfRkxBR19NU0lYX0VOQUJMRUQJfAogI2lmZGVmIEk0MEVfRkNPRQogCQkJCSAgICAgICBJNDBFX0ZMQUdfRkNPRV9FTkFCTEVECXwKQEAgLTcxNTgsMTggKzczMjgsMjYgQEAKIAlpZiAoIShwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfTVNJWF9FTkFCTEVEKSAmJgogCSAgICAocGYtPmZsYWdzICYgSTQwRV9GTEFHX01TSV9FTkFCTEVEKSkgewogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIk1TSS1YIG5vdCBhdmFpbGFibGUsIHRyeWluZyBNU0lcbiIpOwotCQllcnIgPSBwY2lfZW5hYmxlX21zaShwZi0+cGRldik7Ci0JCWlmIChlcnIpIHsKLQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiTVNJIGluaXQgZmFpbGVkIC0gJWRcbiIsIGVycik7CisJCXZlY3RvcnMgPSBwY2lfZW5hYmxlX21zaShwZi0+cGRldik7CisJCWlmICh2ZWN0b3JzIDwgMCkgeworCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJNU0kgaW5pdCBmYWlsZWQgLSAlZFxuIiwKKwkJCQkgdmVjdG9ycyk7CiAJCQlwZi0+ZmxhZ3MgJj0gfkk0MEVfRkxBR19NU0lfRU5BQkxFRDsKIAkJfQorCQl2ZWN0b3JzID0gMTsgIC8qIG9uZSBNU0kgb3IgTGVnYWN5IHZlY3RvciAqLwogCX0KIAogCWlmICghKHBmLT5mbGFncyAmIChJNDBFX0ZMQUdfTVNJWF9FTkFCTEVEIHwgSTQwRV9GTEFHX01TSV9FTkFCTEVEKSkpCiAJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiTVNJLVggYW5kIE1TSSBub3QgYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gTGVnYWN5IElSUVxuIik7CiAKKwkvKiBzZXQgdXAgdmVjdG9yIGFzc2lnbm1lbnQgdHJhY2tpbmcgKi8KKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBpNDBlX2x1bXBfdHJhY2tpbmcpICsgKHNpemVvZih1MTYpICogdmVjdG9ycyk7CisJcGYtPmlycV9waWxlID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlwZi0+aXJxX3BpbGUtPm51bV9lbnRyaWVzID0gdmVjdG9yczsKKwlwZi0+aXJxX3BpbGUtPnNlYXJjaF9oaW50ID0gMDsKKwogCS8qIHRyYWNrIGZpcnN0IHZlY3RvciBmb3IgbWlzYyBpbnRlcnJ1cHRzICovCi0JZXJyID0gaTQwZV9nZXRfbHVtcChwZiwgcGYtPmlycV9waWxlLCAxLCBJNDBFX1BJTEVfVkFMSURfQklULTEpOworCSh2b2lkKWk0MGVfZ2V0X2x1bXAocGYsIHBmLT5pcnFfcGlsZSwgMSwgSTQwRV9QSUxFX1ZBTElEX0JJVCAtIDEpOwogfQogCiAvKioKQEAgLTcyMTksNiArNzM5Nyw3IEBACiBzdGF0aWMgaW50IGk0MGVfY29uZmlnX3JzcyhzdHJ1Y3QgaTQwZV9wZiAqcGYpCiB7CiAJdTMyIHJzc19rZXlbSTQwRV9QRlFGX0hLRVlfTUFYX0lOREVYICsgMV07CisJc3RydWN0IGk0MGVfdnNpICp2c2kgPSBwZi0+dnNpW3BmLT5sYW5fdnNpXTsKIAlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmcGYtPmh3OwogCXUzMiBsdXQgPSAwOwogCWludCBpLCBqOwpAQCAtNzIzNiwxNSArNzQxNSwxNCBAQAogCXdyMzIoaHcsIEk0MEVfUEZRRl9IRU5BKDApLCAodTMyKWhlbmEpOwogCXdyMzIoaHcsIEk0MEVfUEZRRl9IRU5BKDEpLCAodTMyKShoZW5hID4+IDMyKSk7CiAKKwl2c2ktPnJzc19zaXplID0gbWluX3QoaW50LCBwZi0+cnNzX3NpemUsIHZzaS0+bnVtX3F1ZXVlX3BhaXJzKTsKKwogCS8qIENoZWNrIGNhcGFiaWxpdHkgYW5kIFNldCB0YWJsZSBzaXplIGFuZCByZWdpc3RlciBwZXIgaHcgZXhwZWN0YXRpb24qLwogCXJlZ192YWwgPSByZDMyKGh3LCBJNDBFX1BGUUZfQ1RMXzApOwotCWlmIChody0+ZnVuY19jYXBzLnJzc190YWJsZV9zaXplID09IDUxMikgeworCWlmIChwZi0+cnNzX3RhYmxlX3NpemUgPT0gNTEyKQogCQlyZWdfdmFsIHw9IEk0MEVfUEZRRl9DVExfMF9IQVNITFVUU0laRV81MTI7Ci0JCXBmLT5yc3NfdGFibGVfc2l6ZSA9IDUxMjsKLQl9IGVsc2UgewotCQlwZi0+cnNzX3RhYmxlX3NpemUgPSAxMjg7CisJZWxzZQogCQlyZWdfdmFsICY9IH5JNDBFX1BGUUZfQ1RMXzBfSEFTSExVVFNJWkVfNTEyOwotCX0KIAl3cjMyKGh3LCBJNDBFX1BGUUZfQ1RMXzAsIHJlZ192YWwpOwogCiAJLyogUG9wdWxhdGUgdGhlIExVVCB3aXRoIG1heCBuby4gb2YgcXVldWVzIGluIHJvdW5kIHJvYmluIGZhc2hpb24gKi8KQEAgLTcyNTcsNyArNzQzNSw3IEBACiAJCSAqIElmIExBTiBWU0kgaXMgdGhlIG9ubHkgY29uc3VtZXIgZm9yIFJTUyB0aGVuIHRoaXMgcmVxdWlyZW1lbnQKIAkJICogaXMgbm90IG5lY2Vzc2FyeS4KIAkJICovCi0JCWlmIChqID09IHBmLT5yc3Nfc2l6ZSkKKwkJaWYgKGogPT0gdnNpLT5yc3Nfc2l6ZSkKIAkJCWogPSAwOwogCQkvKiBsdXQgPSA0LWJ5dGUgc2xpZGluZyB3aW5kb3cgb2YgNCBsdXQgZW50cmllcyAqLwogCQlsdXQgPSAobHV0IDw8IDgpIHwgKGogJgpAQCAtNzI4MSwxNSArNzQ1OSwxOSBAQAogICoqLwogaW50IGk0MGVfcmVjb25maWdfcnNzX3F1ZXVlcyhzdHJ1Y3QgaTQwZV9wZiAqcGYsIGludCBxdWV1ZV9jb3VudCkKIHsKKwlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9IHBmLT52c2lbcGYtPmxhbl92c2ldOworCWludCBuZXdfcnNzX3NpemU7CisKIAlpZiAoIShwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfUlNTX0VOQUJMRUQpKQogCQlyZXR1cm4gMDsKIAotCXF1ZXVlX2NvdW50ID0gbWluX3QoaW50LCBxdWV1ZV9jb3VudCwgcGYtPnJzc19zaXplX21heCk7CisJbmV3X3Jzc19zaXplID0gbWluX3QoaW50LCBxdWV1ZV9jb3VudCwgcGYtPnJzc19zaXplX21heCk7CiAKLQlpZiAocXVldWVfY291bnQgIT0gcGYtPnJzc19zaXplKSB7CisJaWYgKHF1ZXVlX2NvdW50ICE9IHZzaS0+bnVtX3F1ZXVlX3BhaXJzKSB7CisJCXZzaS0+cmVxX3F1ZXVlX3BhaXJzID0gcXVldWVfY291bnQ7CiAJCWk0MGVfcHJlcF9mb3JfcmVzZXQocGYpOwogCi0JCXBmLT5yc3Nfc2l6ZSA9IHF1ZXVlX2NvdW50OworCQlwZi0+cnNzX3NpemUgPSBuZXdfcnNzX3NpemU7CiAKIAkJaTQwZV9yZXNldF9hbmRfcmVidWlsZChwZiwgdHJ1ZSk7CiAJCWk0MGVfY29uZmlnX3JzcyhwZik7CkBAIC03Mjk5LDYgKzc0ODEsMTI4IEBACiB9CiAKIC8qKgorICogaTQwZV9nZXRfbnBhcl9id19zZXR0aW5nIC0gUmV0cmlldmUgQlcgc2V0dGluZ3MgZm9yIHRoaXMgUEYgcGFydGl0aW9uCisgKiBAcGY6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCisgKiovCitpNDBlX3N0YXR1cyBpNDBlX2dldF9ucGFyX2J3X3NldHRpbmcoc3RydWN0IGk0MGVfcGYgKnBmKQoreworCWk0MGVfc3RhdHVzIHN0YXR1czsKKwlib29sIG1pbl92YWxpZCwgbWF4X3ZhbGlkOworCXUzMiBtYXhfYncsIG1pbl9idzsKKworCXN0YXR1cyA9IGk0MGVfcmVhZF9id19mcm9tX2FsdF9yYW0oJnBmLT5odywgJm1heF9idywgJm1pbl9idywKKwkJCQkJICAgJm1pbl92YWxpZCwgJm1heF92YWxpZCk7CisKKwlpZiAoIXN0YXR1cykgeworCQlpZiAobWluX3ZhbGlkKQorCQkJcGYtPm5wYXJfbWluX2J3ID0gbWluX2J3OworCQlpZiAobWF4X3ZhbGlkKQorCQkJcGYtPm5wYXJfbWF4X2J3ID0gbWF4X2J3OworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaTQwZV9zZXRfbnBhcl9id19zZXR0aW5nIC0gU2V0IEJXIHNldHRpbmdzIGZvciB0aGlzIFBGIHBhcnRpdGlvbgorICogQHBmOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworaTQwZV9zdGF0dXMgaTQwZV9zZXRfbnBhcl9id19zZXR0aW5nKHN0cnVjdCBpNDBlX3BmICpwZikKK3sKKwlzdHJ1Y3QgaTQwZV9hcWNfY29uZmlndXJlX3BhcnRpdGlvbl9id19kYXRhIGJ3X2RhdGE7CisJaTQwZV9zdGF0dXMgc3RhdHVzOworCisJLyogU2V0IHRoZSB2YWxpZCBiaXQgZm9yIHRoaXMgUEYgKi8KKwlid19kYXRhLnBmX3ZhbGlkX2JpdHMgPSBjcHVfdG9fbGUxNigxIDw8IHBmLT5ody5wZl9pZCk7CisJYndfZGF0YS5tYXhfYndbcGYtPmh3LnBmX2lkXSA9IHBmLT5ucGFyX21heF9idyAmIEk0MEVfQUxUX0JXX1ZBTFVFX01BU0s7CisJYndfZGF0YS5taW5fYndbcGYtPmh3LnBmX2lkXSA9IHBmLT5ucGFyX21pbl9idyAmIEk0MEVfQUxUX0JXX1ZBTFVFX01BU0s7CisKKwkvKiBTZXQgdGhlIG5ldyBiYW5kd2lkdGhzICovCisJc3RhdHVzID0gaTQwZV9hcV9jb25maWd1cmVfcGFydGl0aW9uX2J3KCZwZi0+aHcsICZid19kYXRhLCBOVUxMKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qKgorICogaTQwZV9jb21taXRfbnBhcl9id19zZXR0aW5nIC0gQ29tbWl0IEJXIHNldHRpbmdzIGZvciB0aGlzIFBGIHBhcnRpdGlvbgorICogQHBmOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQorICoqLworaTQwZV9zdGF0dXMgaTQwZV9jb21taXRfbnBhcl9id19zZXR0aW5nKHN0cnVjdCBpNDBlX3BmICpwZikKK3sKKwkvKiBDb21taXQgdGVtcG9yYXJ5IEJXIHNldHRpbmcgdG8gcGVybWFuZW50IE5WTSBpbWFnZSAqLworCWVudW0gaTQwZV9hZG1pbl9xdWV1ZV9lcnIgbGFzdF9hcV9zdGF0dXM7CisJaTQwZV9zdGF0dXMgcmV0OworCXUxNiBudm1fd29yZDsKKworCWlmIChwZi0+aHcucGFydGl0aW9uX2lkICE9IDEpIHsKKwkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCisJCQkgIkNvbW1pdCBCVyBvbmx5IHdvcmtzIG9uIHBhcnRpdGlvbiAxISBUaGlzIGlzIHBhcnRpdGlvbiAlZCIsCisJCQkgcGYtPmh3LnBhcnRpdGlvbl9pZCk7CisJCXJldCA9IEk0MEVfTk9UX1NVUFBPUlRFRDsKKwkJZ290byBid19jb21taXRfb3V0OworCX0KKworCS8qIEFjcXVpcmUgTlZNIGZvciByZWFkIGFjY2VzcyAqLworCXJldCA9IGk0MGVfYWNxdWlyZV9udm0oJnBmLT5odywgSTQwRV9SRVNPVVJDRV9SRUFEKTsKKwlsYXN0X2FxX3N0YXR1cyA9IHBmLT5ody5hcS5hc3FfbGFzdF9zdGF0dXM7CisJaWYgKHJldCkgeworCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKKwkJCSAiQ2Fubm90IGFjcXVpcmUgTlZNIGZvciByZWFkIGFjY2VzcywgZXJyICVkOiBhcV9lcnIgJWRcbiIsCisJCQkgcmV0LCBsYXN0X2FxX3N0YXR1cyk7CisJCWdvdG8gYndfY29tbWl0X291dDsKKwl9CisKKwkvKiBSZWFkIHdvcmQgMHgxMCBvZiBOVk0gLSBTVyBjb21wYXRpYmlsaXR5IHdvcmQgMSAqLworCXJldCA9IGk0MGVfYXFfcmVhZF9udm0oJnBmLT5odywKKwkJCSAgICAgICBJNDBFX1NSX05WTV9DT05UUk9MX1dPUkQsCisJCQkgICAgICAgMHgxMCwgc2l6ZW9mKG52bV93b3JkKSwgJm52bV93b3JkLAorCQkJICAgICAgIGZhbHNlLCBOVUxMKTsKKwkvKiBTYXZlIG9mZiBsYXN0IGFkbWluIHF1ZXVlIGNvbW1hbmQgc3RhdHVzIGJlZm9yZSByZWxlYXNpbmcKKwkgKiB0aGUgTlZNCisJICovCisJbGFzdF9hcV9zdGF0dXMgPSBwZi0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzOworCWk0MGVfcmVsZWFzZV9udm0oJnBmLT5odyk7CisJaWYgKHJldCkgeworCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIk5WTSByZWFkIGVycm9yLCBlcnIgJWQgYXFfZXJyICVkXG4iLAorCQkJIHJldCwgbGFzdF9hcV9zdGF0dXMpOworCQlnb3RvIGJ3X2NvbW1pdF9vdXQ7CisJfQorCisJLyogV2FpdCBhIGJpdCBmb3IgTlZNIHJlbGVhc2UgdG8gY29tcGxldGUgKi8KKwltc2xlZXAoNTApOworCisJLyogQWNxdWlyZSBOVk0gZm9yIHdyaXRlIGFjY2VzcyAqLworCXJldCA9IGk0MGVfYWNxdWlyZV9udm0oJnBmLT5odywgSTQwRV9SRVNPVVJDRV9XUklURSk7CisJbGFzdF9hcV9zdGF0dXMgPSBwZi0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzOworCWlmIChyZXQpIHsKKwkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCisJCQkgIkNhbm5vdCBhY3F1aXJlIE5WTSBmb3Igd3JpdGUgYWNjZXNzLCBlcnIgJWQ6IGFxX2VyciAlZFxuIiwKKwkJCSByZXQsIGxhc3RfYXFfc3RhdHVzKTsKKwkJZ290byBid19jb21taXRfb3V0OworCX0KKwkvKiBXcml0ZSBpdCBiYWNrIG91dCB1bmNoYW5nZWQgdG8gaW5pdGlhdGUgdXBkYXRlIE5WTSwKKwkgKiB3aGljaCB3aWxsIGZvcmNlIGEgd3JpdGUgb2YgdGhlIHNoYWRvdyAoYWx0KSBSQU0gdG8KKwkgKiB0aGUgTlZNIC0gdGh1cyBzdG9yaW5nIHRoZSBiYW5kd2lkdGggdmFsdWVzIHBlcm1hbmVudGx5LgorCSAqLworCXJldCA9IGk0MGVfYXFfdXBkYXRlX252bSgmcGYtPmh3LAorCQkJCSBJNDBFX1NSX05WTV9DT05UUk9MX1dPUkQsCisJCQkJIDB4MTAsIHNpemVvZihudm1fd29yZCksCisJCQkJICZudm1fd29yZCwgdHJ1ZSwgTlVMTCk7CisJLyogU2F2ZSBvZmYgbGFzdCBhZG1pbiBxdWV1ZSBjb21tYW5kIHN0YXR1cyBiZWZvcmUgcmVsZWFzaW5nCisJICogdGhlIE5WTQorCSAqLworCWxhc3RfYXFfc3RhdHVzID0gcGYtPmh3LmFxLmFzcV9sYXN0X3N0YXR1czsKKwlpNDBlX3JlbGVhc2VfbnZtKCZwZi0+aHcpOworCWlmIChyZXQpCisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAorCQkJICJCVyBzZXR0aW5ncyBOT1QgU0FWRUQsIGVyciAlZCBhcV9lcnIgJWRcbiIsCisJCQkgcmV0LCBsYXN0X2FxX3N0YXR1cyk7Citid19jb21taXRfb3V0OgorCisJcmV0dXJuIHJldDsKK30KKworLyoqCiAgKiBpNDBlX3N3X2luaXQgLSBJbml0aWFsaXplIGdlbmVyYWwgc29mdHdhcmUgc3RydWN0dXJlcyAoc3RydWN0IGk0MGVfcGYpCiAgKiBAcGY6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlIHRvIGluaXRpYWxpemUKICAqCkBAIC03MzI0LDggKzc2MjgsMTIgQEAKIAkvKiBTZXQgZGVmYXVsdCBjYXBhYmlsaXR5IGZsYWdzICovCiAJcGYtPmZsYWdzID0gSTQwRV9GTEFHX1JYX0NTVU1fRU5BQkxFRCB8CiAJCSAgICBJNDBFX0ZMQUdfTVNJX0VOQUJMRUQgICAgIHwKLQkJICAgIEk0MEVfRkxBR19NU0lYX0VOQUJMRUQgICAgfAotCQkgICAgSTQwRV9GTEFHX1JYXzFCVUZfRU5BQkxFRDsKKwkJICAgIEk0MEVfRkxBR19NU0lYX0VOQUJMRUQ7CisKKwlpZiAoaW9tbXVfcHJlc2VudCgmcGNpX2J1c190eXBlKSkKKwkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19SWF9QU19FTkFCTEVEOworCWVsc2UKKwkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19SWF8xQlVGX0VOQUJMRUQ7CiAKIAkvKiBTZXQgZGVmYXVsdCBJVFIgKi8KIAlwZi0+cnhfaXRyX2RlZmF1bHQgPSBJNDBFX0lUUl9EWU5BTUlDIHwgSTQwRV9JVFJfUlhfREVGOwpAQCAtNzMzNiw2ICs3NjQ0LDcgQEAKIAkgKi8KIAlwZi0+cnNzX3NpemVfbWF4ID0gMHgxIDw8IHBmLT5ody5mdW5jX2NhcHMucnNzX3RhYmxlX2VudHJ5X3dpZHRoOwogCXBmLT5yc3Nfc2l6ZSA9IDE7CisJcGYtPnJzc190YWJsZV9zaXplID0gcGYtPmh3LmZ1bmNfY2Fwcy5yc3NfdGFibGVfc2l6ZTsKIAlwZi0+cnNzX3NpemVfbWF4ID0gbWluX3QoaW50LCBwZi0+cnNzX3NpemVfbWF4LAogCQkJCSBwZi0+aHcuZnVuY19jYXBzLm51bV90eF9xcCk7CiAJaWYgKHBmLT5ody5mdW5jX2NhcHMucnNzKSB7CkBAIC03MzQ3LDYgKzc2NTYsMTMgQEAKIAlpZiAocGYtPmh3LmZ1bmNfY2Fwcy5ucGFyX2VuYWJsZSB8fCBwZi0+aHcuZnVuY19jYXBzLm1mcF9tb2RlXzEpIHsKIAkJcGYtPmZsYWdzIHw9IEk0MEVfRkxBR19NRlBfRU5BQkxFRDsKIAkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJNRlAgbW9kZSBFbmFibGVkXG4iKTsKKwkJaWYgKGk0MGVfZ2V0X25wYXJfYndfc2V0dGluZyhwZikpCisJCQlkZXZfd2FybigmcGYtPnBkZXYtPmRldiwKKwkJCQkgIkNvdWxkIG5vdCBnZXQgTlBBUiBidyBzZXR0aW5nc1xuIik7CisJCWVsc2UKKwkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAorCQkJCSAiTWluIEJXID0gJTguOHgsIE1heCBCVyA9ICU4Ljh4XG4iLAorCQkJCSBwZi0+bnBhcl9taW5fYncsIHBmLT5ucGFyX21heF9idyk7CiAJfQogCiAJLyogRlcvTlZNIGlzIG5vdCB5ZXQgZml4ZWQgaW4gdGhpcyByZWdhcmQgKi8KQEAgLTczNTQsMTEgKzc2NzAsMTEgQEAKIAkgICAgKHBmLT5ody5mdW5jX2NhcHMuZmRfZmlsdGVyc19iZXN0X2VmZm9ydCA+IDApKSB7CiAJCXBmLT5mbGFncyB8PSBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CiAJCXBmLT5hdHJfc2FtcGxlX3JhdGUgPSBJNDBFX0RFRkFVTFRfQVRSX1NBTVBMRV9SQVRFOwotCQkvKiBTZXR1cCBhIGNvdW50ZXIgZm9yIGZkX2F0ciBwZXIgcGYgKi8KKwkJLyogU2V0dXAgYSBjb3VudGVyIGZvciBmZF9hdHIgcGVyIFBGICovCiAJCXBmLT5mZF9hdHJfY250X2lkeCA9IEk0MEVfRkRfQVRSX1NUQVRfSURYKHBmLT5ody5wZl9pZCk7CiAJCWlmICghKHBmLT5mbGFncyAmIEk0MEVfRkxBR19NRlBfRU5BQkxFRCkpIHsKIAkJCXBmLT5mbGFncyB8PSBJNDBFX0ZMQUdfRkRfU0JfRU5BQkxFRDsKLQkJCS8qIFNldHVwIGEgY291bnRlciBmb3IgZmRfc2IgcGVyIHBmICovCisJCQkvKiBTZXR1cCBhIGNvdW50ZXIgZm9yIGZkX3NiIHBlciBQRiAqLwogCQkJcGYtPmZkX3NiX2NudF9pZHggPSBJNDBFX0ZEX1NCX1NUQVRfSURYKHBmLT5ody5wZl9pZCk7CiAJCX0gZWxzZSB7CiAJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKQEAgLTc0MDYsMjIgKzc3MjIsMTQgQEAKIAlwZi0+cXBfcGlsZS0+bnVtX2VudHJpZXMgPSBwZi0+aHcuZnVuY19jYXBzLm51bV90eF9xcDsKIAlwZi0+cXBfcGlsZS0+c2VhcmNoX2hpbnQgPSAwOwogCi0JLyogc2V0IHVwIHZlY3RvciBhc3NpZ25tZW50IHRyYWNraW5nICovCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaTQwZV9sdW1wX3RyYWNraW5nKQotCQkrIChzaXplb2YodTE2KSAqIHBmLT5ody5mdW5jX2NhcHMubnVtX21zaXhfdmVjdG9ycyk7Ci0JcGYtPmlycV9waWxlID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBmLT5pcnFfcGlsZSkgewotCQlrZnJlZShwZi0+cXBfcGlsZSk7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gc3dfaW5pdF9kb25lOwotCX0KLQlwZi0+aXJxX3BpbGUtPm51bV9lbnRyaWVzID0gcGYtPmh3LmZ1bmNfY2Fwcy5udW1fbXNpeF92ZWN0b3JzOwotCXBmLT5pcnFfcGlsZS0+c2VhcmNoX2hpbnQgPSAwOwotCiAJcGYtPnR4X3RpbWVvdXRfcmVjb3ZlcnlfbGV2ZWwgPSAxOwogCiAJbXV0ZXhfaW5pdCgmcGYtPnN3aXRjaF9tdXRleCk7CiAKKwkvKiBJZiBOUEFSIGlzIGVuYWJsZWQgbnVkZ2UgdGhlIFR4IHNjaGVkdWxlciAqLworCWlmIChwZi0+aHcuZnVuY19jYXBzLm5wYXJfZW5hYmxlICYmICghaTQwZV9nZXRfbnBhcl9id19zZXR0aW5nKHBmKSkpCisJCWk0MGVfc2V0X25wYXJfYndfc2V0dGluZyhwZik7CisKIHN3X2luaXRfZG9uZToKIAlyZXR1cm4gZXJyOwogfQpAQCAtNzUzNCw3ICs3ODQyLDggQEAKIAogCS8qIENoZWNrIGlmIHBvcnQgYWxyZWFkeSBleGlzdHMgKi8KIAlpZiAoaWR4IDwgSTQwRV9NQVhfUEZfVURQX09GRkxPQURfUE9SVFMpIHsKLQkJbmV0ZGV2X2luZm8obmV0ZGV2LCAiUG9ydCAlZCBhbHJlYWR5IG9mZmxvYWRlZFxuIiwgbnRvaHMocG9ydCkpOworCQluZXRkZXZfaW5mbyhuZXRkZXYsICJ2eGxhbiBwb3J0ICVkIGFscmVhZHkgb2ZmbG9hZGVkXG4iLAorCQkJICAgIG50b2hzKHBvcnQpKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzU0Miw3ICs3ODUxLDcgQEAKIAluZXh0X2lkeCA9IGk0MGVfZ2V0X3Z4bGFuX3BvcnRfaWR4KHBmLCAwKTsKIAogCWlmIChuZXh0X2lkeCA9PSBJNDBFX01BWF9QRl9VRFBfT0ZGTE9BRF9QT1JUUykgewotCQluZXRkZXZfaW5mbyhuZXRkZXYsICJNYXhpbXVtIG51bWJlciBvZiBVRFAgcG9ydHMgcmVhY2hlZCwgbm90IGFkZGluZyBwb3J0ICVkXG4iLAorCQluZXRkZXZfaW5mbyhuZXRkZXYsICJtYXhpbXVtIG51bWJlciBvZiB2eGxhbiBVRFAgcG9ydHMgcmVhY2hlZCwgbm90IGFkZGluZyBwb3J0ICVkXG4iLAogCQkJICAgIG50b2hzKHBvcnQpKTsKIAkJcmV0dXJuOwogCX0KQEAgLTc1NTAsOCArNzg1OSw5IEBACiAJLyogTmV3IHBvcnQ6IGFkZCBpdCBhbmQgbWFyayBpdHMgaW5kZXggaW4gdGhlIGJpdG1hcCAqLwogCXBmLT52eGxhbl9wb3J0c1tuZXh0X2lkeF0gPSBwb3J0OwogCXBmLT5wZW5kaW5nX3Z4bGFuX2JpdG1hcCB8PSAoMSA8PCBuZXh0X2lkeCk7Ci0KIAlwZi0+ZmxhZ3MgfD0gSTQwRV9GTEFHX1ZYTEFOX0ZJTFRFUl9TWU5DOworCisJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJhZGRpbmcgdnhsYW4gcG9ydCAlZFxuIiwgbnRvaHMocG9ydCkpOwogfQogCiAvKioKQEAgLTc1NzksMTIgKzc4ODksMTMgQEAKIAkJICogYW5kIG1ha2UgaXQgcGVuZGluZwogCQkgKi8KIAkJcGYtPnZ4bGFuX3BvcnRzW2lkeF0gPSAwOwotCiAJCXBmLT5wZW5kaW5nX3Z4bGFuX2JpdG1hcCB8PSAoMSA8PCBpZHgpOwotCiAJCXBmLT5mbGFncyB8PSBJNDBFX0ZMQUdfVlhMQU5fRklMVEVSX1NZTkM7CisKKwkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJkZWxldGluZyB2eGxhbiBwb3J0ICVkXG4iLAorCQkJIG50b2hzKHBvcnQpKTsKIAl9IGVsc2UgewotCQluZXRkZXZfd2FybihuZXRkZXYsICJQb3J0ICVkIHdhcyBub3QgZm91bmQsIG5vdCBkZWxldGluZ1xuIiwKKwkJbmV0ZGV2X3dhcm4obmV0ZGV2LCAidnhsYW4gcG9ydCAlZCB3YXMgbm90IGZvdW5kLCBub3QgZGVsZXRpbmdcbiIsCiAJCQkgICAgbnRvaHMocG9ydCkpOwogCX0KIH0KQEAgLTc2NTMsNiArNzk2NCwxMTggQEAKIAlyZXR1cm4gZXJyOwogfQogCisjaWZkZWYgSEFWRV9CUklER0VfQVRUUklCUworLyoqCisgKiBpNDBlX25kb19icmlkZ2Vfc2V0bGluayAtIFNldCB0aGUgaGFyZHdhcmUgYnJpZGdlIG1vZGUKKyAqIEBkZXY6IHRoZSBuZXRkZXYgYmVpbmcgY29uZmlndXJlZAorICogQG5saDogUlROTCBtZXNzYWdlCisgKgorICogSW5zZXJ0cyBhIG5ldyBoYXJkd2FyZSBicmlkZ2UgaWYgbm90IGFscmVhZHkgY3JlYXRlZCBhbmQKKyAqIGVuYWJsZXMgdGhlIGJyaWRnaW5nIG1vZGUgcmVxdWVzdGVkIChWRUIgb3IgVkVQQSkuIElmIHRoZQorICogaGFyZHdhcmUgYnJpZGdlIGhhcyBhbHJlYWR5IGJlZW4gaW5zZXJ0ZWQgYW5kIHRoZSByZXF1ZXN0CisgKiBpcyB0byBjaGFuZ2UgdGhlIG1vZGUgdGhlbiB0aGF0IHJlcXVpcmVzIGEgUEYgcmVzZXQgdG8KKyAqIGFsbG93IHJlYnVpbGQgb2YgdGhlIGNvbXBvbmVudHMgd2l0aCByZXF1aXJlZCBoYXJkd2FyZQorICogYnJpZGdlIG1vZGUgZW5hYmxlZC4KKyAqKi8KK3N0YXRpYyBpbnQgaTQwZV9uZG9fYnJpZGdlX3NldGxpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKK3sKKwlzdHJ1Y3QgaTQwZV9uZXRkZXZfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gbnAtPnZzaTsKKwlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7CisJc3RydWN0IGk0MGVfdmViICp2ZWIgPSBOVUxMOworCXN0cnVjdCBubGF0dHIgKmF0dHIsICpicl9zcGVjOworCWludCBpLCByZW07CisKKwkvKiBPbmx5IGZvciBQRiBWU0kgZm9yIG5vdyAqLworCWlmICh2c2ktPnNlaWQgIT0gcGYtPnZzaVtwZi0+bGFuX3ZzaV0tPnNlaWQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIEZpbmQgdGhlIEhXIGJyaWRnZSBmb3IgUEYgVlNJICovCisJZm9yIChpID0gMDsgaSA8IEk0MEVfTUFYX1ZFQiAmJiAhdmViOyBpKyspIHsKKwkJaWYgKHBmLT52ZWJbaV0gJiYgcGYtPnZlYltpXS0+c2VpZCA9PSB2c2ktPnVwbGlua19zZWlkKQorCQkJdmViID0gcGYtPnZlYltpXTsKKwl9CisKKwlicl9zcGVjID0gbmxtc2dfZmluZF9hdHRyKG5saCwgc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpLCBJRkxBX0FGX1NQRUMpOworCisJbmxhX2Zvcl9lYWNoX25lc3RlZChhdHRyLCBicl9zcGVjLCByZW0pIHsKKwkJX191MTYgbW9kZTsKKworCQlpZiAobmxhX3R5cGUoYXR0cikgIT0gSUZMQV9CUklER0VfTU9ERSkKKwkJCWNvbnRpbnVlOworCisJCW1vZGUgPSBubGFfZ2V0X3UxNihhdHRyKTsKKwkJaWYgKChtb2RlICE9IEJSSURHRV9NT0RFX1ZFUEEpICYmCisJCSAgICAobW9kZSAhPSBCUklER0VfTU9ERV9WRUIpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogSW5zZXJ0IGEgbmV3IEhXIGJyaWRnZSAqLworCQlpZiAoIXZlYikgeworCQkJdmViID0gaTQwZV92ZWJfc2V0dXAocGYsIDAsIHZzaS0+dXBsaW5rX3NlaWQsIHZzaS0+c2VpZCwKKwkJCQkJICAgICB2c2ktPnRjX2NvbmZpZy5lbmFibGVkX3RjKTsKKwkJCWlmICh2ZWIpIHsKKwkJCQl2ZWItPmJyaWRnZV9tb2RlID0gbW9kZTsKKwkJCQlpNDBlX2NvbmZpZ19icmlkZ2VfbW9kZSh2ZWIpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBObyBCcmlkZ2UgSFcgb2ZmbG9hZCBhdmFpbGFibGUgKi8KKwkJCQlyZXR1cm4gLUVOT0VOVDsKKwkJCX0KKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKG1vZGUgIT0gdmViLT5icmlkZ2VfbW9kZSkgeworCQkJLyogRXhpc3RpbmcgSFcgYnJpZGdlIGJ1dCBkaWZmZXJlbnQgbW9kZSBuZWVkcyByZXNldCAqLworCQkJdmViLT5icmlkZ2VfbW9kZSA9IG1vZGU7CisJCQlpNDBlX2RvX3Jlc2V0KHBmLCAoMSA8PCBfX0k0MEVfUEZfUkVTRVRfUkVRVUVTVEVEKSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGk0MGVfbmRvX2JyaWRnZV9nZXRsaW5rIC0gR2V0IHRoZSBoYXJkd2FyZSBicmlkZ2UgbW9kZQorICogQHNrYjogc2tiIGJ1ZmYKKyAqIEBwaWQ6IHByb2Nlc3MgaWQKKyAqIEBzZXE6IFJUTkwgbWVzc2FnZSBzZXEgIworICogQGRldjogdGhlIG5ldGRldiBiZWluZyBjb25maWd1cmVkCisgKiBAZmlsdGVyX21hc2s6IHVudXNlZAorICoKKyAqIFJldHVybiB0aGUgbW9kZSBpbiB3aGljaCB0aGUgaGFyZHdhcmUgYnJpZGdlIGlzIG9wZXJhdGluZyBpbgorICogaS5lIFZFQiBvciBWRVBBLgorICoqLworI2lmZGVmIEhBVkVfQlJJREdFX0ZJTFRFUgorc3RhdGljIGludCBpNDBlX25kb19icmlkZ2VfZ2V0bGluayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgc2VxLAorCQkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgdTMyIF9fYWx3YXlzX3VudXNlZCBmaWx0ZXJfbWFzaykKKyNlbHNlCitzdGF0aWMgaW50IGk0MGVfbmRvX2JyaWRnZV9nZXRsaW5rKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBzZXEsCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKyNlbmRpZiAvKiBIQVZFX0JSSURHRV9GSUxURVIgKi8KK3sKKwlzdHJ1Y3QgaTQwZV9uZXRkZXZfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gbnAtPnZzaTsKKwlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2c2ktPmJhY2s7CisJc3RydWN0IGk0MGVfdmViICp2ZWIgPSBOVUxMOworCWludCBpOworCisJLyogT25seSBmb3IgUEYgVlNJIGZvciBub3cgKi8KKwlpZiAodnNpLT5zZWlkICE9IHBmLT52c2lbcGYtPmxhbl92c2ldLT5zZWlkKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBGaW5kIHRoZSBIVyBicmlkZ2UgZm9yIHRoZSBQRiBWU0kgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSTQwRV9NQVhfVkVCICYmICF2ZWI7IGkrKykgeworCQlpZiAocGYtPnZlYltpXSAmJiBwZi0+dmViW2ldLT5zZWlkID09IHZzaS0+dXBsaW5rX3NlaWQpCisJCQl2ZWIgPSBwZi0+dmViW2ldOworCX0KKworCWlmICghdmViKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBuZG9fZGZsdF9icmlkZ2VfZ2V0bGluayhza2IsIHBpZCwgc2VxLCBkZXYsIHZlYi0+YnJpZGdlX21vZGUpOworfQorI2VuZGlmIC8qIEhBVkVfQlJJREdFX0FUVFJJQlMgKi8KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpNDBlX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCQk9IGk0MGVfb3BlbiwKIAkubmRvX3N0b3AJCT0gaTQwZV9jbG9zZSwKQEAgLTc2ODcsNiArODExMCwxMCBAQAogI2VuZGlmCiAJLm5kb19nZXRfcGh5c19wb3J0X2lkCT0gaTQwZV9nZXRfcGh5c19wb3J0X2lkLAogCS5uZG9fZmRiX2FkZAkJPSBpNDBlX25kb19mZGJfYWRkLAorI2lmZGVmIEhBVkVfQlJJREdFX0FUVFJJQlMKKwkubmRvX2JyaWRnZV9nZXRsaW5rCT0gaTQwZV9uZG9fYnJpZGdlX2dldGxpbmssCisJLm5kb19icmlkZ2Vfc2V0bGluawk9IGk0MGVfbmRvX2JyaWRnZV9zZXRsaW5rLAorI2VuZGlmIC8qIEhBVkVfQlJJREdFX0FUVFJJQlMgKi8KIH07CiAKIC8qKgpAQCAtNzc5OSw2ICs4MjI2LDMwIEBACiB9CiAKIC8qKgorICogaTQwZV9pc192c2lfdXBsaW5rX21vZGVfdmViIC0gQ2hlY2sgaWYgdGhlIFZTSSdzIHVwbGluayBicmlkZ2UgbW9kZSBpcyBWRUIKKyAqIEB2c2k6IHRoZSBWU0kgYmVpbmcgcXVlcmllZAorICoKKyAqIFJldHVybnMgMSBpZiBIVyBicmlkZ2UgbW9kZSBpcyBWRUIgYW5kIHJldHVybiAwIGluIGNhc2Ugb2YgVkVQQSBtb2RlCisgKiovCitpbnQgaTQwZV9pc192c2lfdXBsaW5rX21vZGVfdmViKHN0cnVjdCBpNDBlX3ZzaSAqdnNpKQoreworCXN0cnVjdCBpNDBlX3ZlYiAqdmViOworCXN0cnVjdCBpNDBlX3BmICpwZiA9IHZzaS0+YmFjazsKKworCS8qIFVwbGluayBpcyBub3QgYSBicmlkZ2Ugc28gZGVmYXVsdCB0byBWRUIgKi8KKwlpZiAodnNpLT52ZWJfaWR4ID09IEk0MEVfTk9fVkVCKQorCQlyZXR1cm4gMTsKKworCXZlYiA9IHBmLT52ZWJbdnNpLT52ZWJfaWR4XTsKKwkvKiBVcGxpbmsgaXMgYSBicmlkZ2UgaW4gVkVQQSBtb2RlICovCisJaWYgKHZlYiAmJiAodmViLT5icmlkZ2VfbW9kZSAmIEJSSURHRV9NT0RFX1ZFUEEpKQorCQlyZXR1cm4gMDsKKworCS8qIFVwbGluayBpcyBhIGJyaWRnZSBpbiBWRUIgbW9kZSAqLworCXJldHVybiAxOworfQorCisvKioKICAqIGk0MGVfYWRkX3ZzaSAtIEFkZCBhIFZTSSB0byB0aGUgc3dpdGNoCiAgKiBAdnNpOiB0aGUgVlNJIGJlaW5nIGNvbmZpZ3VyZWQKICAqCkBAIC03ODMwLDExICs4MjgxLDExIEBACiAJCWN0eHQuZmxhZ3MgPSBJNDBFX0FRX1ZTSV9UWVBFX1BGOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKLQkJCQkgImNvdWxkbid0IGdldCBwZiB2c2kgY29uZmlnLCBlcnIgJWQsIGFxX2VyciAlZFxuIiwKKwkJCQkgImNvdWxkbid0IGdldCBQRiB2c2kgY29uZmlnLCBlcnIgJWQsIGFxX2VyciAlZFxuIiwKIAkJCQkgcmV0LCBwZi0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzKTsKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9Ci0JCW1lbWNweSgmdnNpLT5pbmZvLCAmY3R4dC5pbmZvLCBzaXplb2YoY3R4dC5pbmZvKSk7CisJCXZzaS0+aW5mbyA9IGN0eHQuaW5mbzsKIAkJdnNpLT5pbmZvLnZhbGlkX3NlY3Rpb25zID0gMDsKIAogCQl2c2ktPnNlaWQgPSBjdHh0LnNlaWQ7CkBAIC03ODgzLDEyICs4MzM0LDE0IEBACiAJCWN0eHQucGZfbnVtID0gaHctPnBmX2lkOwogCQljdHh0LnZmX251bSA9IDA7CiAJCWN0eHQudXBsaW5rX3NlaWQgPSB2c2ktPnVwbGlua19zZWlkOwotCQljdHh0LmNvbm5lY3Rpb25fdHlwZSA9IDB4MTsgICAgIC8qIHJlZ3VsYXIgZGF0YSBwb3J0ICovCisJCWN0eHQuY29ubmVjdGlvbl90eXBlID0gSTQwRV9BUV9WU0lfQ09OTl9UWVBFX05PUk1BTDsKIAkJY3R4dC5mbGFncyA9IEk0MEVfQVFfVlNJX1RZUEVfUEY7Ci0JCWN0eHQuaW5mby52YWxpZF9zZWN0aW9ucyB8PQorCQlpZiAoaTQwZV9pc192c2lfdXBsaW5rX21vZGVfdmViKHZzaSkpIHsKKwkJCWN0eHQuaW5mby52YWxpZF9zZWN0aW9ucyB8PQogCQkJCWNwdV90b19sZTE2KEk0MEVfQVFfVlNJX1BST1BfU1dJVENIX1ZBTElEKTsKLQkJY3R4dC5pbmZvLnN3aXRjaF9pZCA9CisJCQljdHh0LmluZm8uc3dpdGNoX2lkID0KIAkJCQljcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9TV19JRF9GTEFHX0FMTE9XX0xCKTsKKwkJfQogCQlpNDBlX3ZzaV9zZXR1cF9xdWV1ZV9tYXAodnNpLCAmY3R4dCwgZW5hYmxlZF90YywgdHJ1ZSk7CiAJCWJyZWFrOwogCkBAIC03ODk2LDE2ICs4MzQ5LDE4IEBACiAJCWN0eHQucGZfbnVtID0gaHctPnBmX2lkOwogCQljdHh0LnZmX251bSA9IDA7CiAJCWN0eHQudXBsaW5rX3NlaWQgPSB2c2ktPnVwbGlua19zZWlkOwotCQljdHh0LmNvbm5lY3Rpb25fdHlwZSA9IDB4MTsgICAgIC8qIHJlZ3VsYXIgZGF0YSBwb3J0ICovCisJCWN0eHQuY29ubmVjdGlvbl90eXBlID0gSTQwRV9BUV9WU0lfQ09OTl9UWVBFX05PUk1BTDsKIAkJY3R4dC5mbGFncyA9IEk0MEVfQVFfVlNJX1RZUEVfVk1EUTI7CiAKLQkJY3R4dC5pbmZvLnZhbGlkX3NlY3Rpb25zIHw9IGNwdV90b19sZTE2KEk0MEVfQVFfVlNJX1BST1BfU1dJVENIX1ZBTElEKTsKLQogCQkvKiBUaGlzIFZTSSBpcyBjb25uZWN0ZWQgdG8gVkVCIHNvIHRoZSBzd2l0Y2hfaWQKIAkJICogc2hvdWxkIGJlIHNldCB0byB6ZXJvIGJ5IGRlZmF1bHQuCiAJCSAqLwotCQljdHh0LmluZm8uc3dpdGNoX2lkID0gMDsKLQkJY3R4dC5pbmZvLnN3aXRjaF9pZCB8PSBjcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9TV19JRF9GTEFHX0FMTE9XX0xCKTsKKwkJaWYgKGk0MGVfaXNfdnNpX3VwbGlua19tb2RlX3ZlYih2c2kpKSB7CisJCQljdHh0LmluZm8udmFsaWRfc2VjdGlvbnMgfD0KKwkJCQljcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9QUk9QX1NXSVRDSF9WQUxJRCk7CisJCQljdHh0LmluZm8uc3dpdGNoX2lkID0KKwkJCQljcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9TV19JRF9GTEFHX0FMTE9XX0xCKTsKKwkJfQogCiAJCS8qIFNldHVwIHRoZSBWU0kgdHgvcnggcXVldWUgbWFwIGZvciBUQzAgb25seSBmb3Igbm93ICovCiAJCWk0MGVfdnNpX3NldHVwX3F1ZXVlX21hcCh2c2ksICZjdHh0LCBlbmFibGVkX3RjLCB0cnVlKTsKQEAgLTc5MTUsMTUgKzgzNzAsMTggQEAKIAkJY3R4dC5wZl9udW0gPSBody0+cGZfaWQ7CiAJCWN0eHQudmZfbnVtID0gdnNpLT52Zl9pZCArIGh3LT5mdW5jX2NhcHMudmZfYmFzZV9pZDsKIAkJY3R4dC51cGxpbmtfc2VpZCA9IHZzaS0+dXBsaW5rX3NlaWQ7Ci0JCWN0eHQuY29ubmVjdGlvbl90eXBlID0gMHgxOyAgICAgLyogcmVndWxhciBkYXRhIHBvcnQgKi8KKwkJY3R4dC5jb25uZWN0aW9uX3R5cGUgPSBJNDBFX0FRX1ZTSV9DT05OX1RZUEVfTk9STUFMOwogCQljdHh0LmZsYWdzID0gSTQwRV9BUV9WU0lfVFlQRV9WRjsKIAotCQljdHh0LmluZm8udmFsaWRfc2VjdGlvbnMgfD0gY3B1X3RvX2xlMTYoSTQwRV9BUV9WU0lfUFJPUF9TV0lUQ0hfVkFMSUQpOwotCiAJCS8qIFRoaXMgVlNJIGlzIGNvbm5lY3RlZCB0byBWRUIgc28gdGhlIHN3aXRjaF9pZAogCQkgKiBzaG91bGQgYmUgc2V0IHRvIHplcm8gYnkgZGVmYXVsdC4KIAkJICovCi0JCWN0eHQuaW5mby5zd2l0Y2hfaWQgPSBjcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9TV19JRF9GTEFHX0FMTE9XX0xCKTsKKwkJaWYgKGk0MGVfaXNfdnNpX3VwbGlua19tb2RlX3ZlYih2c2kpKSB7CisJCQljdHh0LmluZm8udmFsaWRfc2VjdGlvbnMgfD0KKwkJCQljcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9QUk9QX1NXSVRDSF9WQUxJRCk7CisJCQljdHh0LmluZm8uc3dpdGNoX2lkID0KKwkJCQljcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9TV19JRF9GTEFHX0FMTE9XX0xCKTsKKwkJfQogCiAJCWN0eHQuaW5mby52YWxpZF9zZWN0aW9ucyB8PSBjcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9QUk9QX1ZMQU5fVkFMSUQpOwogCQljdHh0LmluZm8ucG9ydF92bGFuX2ZsYWdzIHw9IEk0MEVfQVFfVlNJX1BWTEFOX01PREVfQUxMOwpAQCAtNzk2MSw3ICs4NDE5LDcgQEAKIAkJCXJldCA9IC1FTk9FTlQ7CiAJCQlnb3RvIGVycjsKIAkJfQotCQltZW1jcHkoJnZzaS0+aW5mbywgJmN0eHQuaW5mbywgc2l6ZW9mKGN0eHQuaW5mbykpOworCQl2c2ktPmluZm8gPSBjdHh0LmluZm87CiAJCXZzaS0+aW5mby52YWxpZF9zZWN0aW9ucyA9IDA7CiAJCXZzaS0+c2VpZCA9IGN0eHQuc2VpZDsKIAkJdnNpLT5pZCA9IGN0eHQudnNpX251bWJlcjsKQEAgLTgyODEsNyArODczOSw3IEBACiAJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuIE5VTEw7CiAJCQl9Ci0JCQlpNDBlX2VuYWJsZV9wZl9zd2l0Y2hfbGIocGYpOworCQkJaTQwZV9jb25maWdfYnJpZGdlX21vZGUodmViKTsKIAkJfQogCQlmb3IgKGkgPSAwOyBpIDwgSTQwRV9NQVhfVkVCICYmICF2ZWI7IGkrKykgewogCQkJaWYgKHBmLT52ZWJbaV0gJiYgcGYtPnZlYltpXS0+c2VpZCA9PSB2c2ktPnVwbGlua19zZWlkKQpAQCAtODcyNCw3ICs5MTgyLDcgQEAKIH0KIAogLyoqCi0gKiBpNDBlX3NldHVwX3BmX3N3aXRjaF9lbGVtZW50IC0gc2V0IHBmIHZhcnMgYmFzZWQgb24gc3dpdGNoIHR5cGUKKyAqIGk0MGVfc2V0dXBfcGZfc3dpdGNoX2VsZW1lbnQgLSBzZXQgUEYgdmFycyBiYXNlZCBvbiBzd2l0Y2ggdHlwZQogICogQHBmOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQogICogQGVsZTogZWxlbWVudCB3ZSBhcmUgYnVpbGRpbmcgaW5mbyBmcm9tCiAgKiBAbnVtX3JlcG9ydGVkOiB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMKQEAgLTg5MzAsMTUgKzkzODgsNyBAQAogCQlpNDBlX2NvbmZpZ19yc3MocGYpOwogCiAJLyogZmlsbCBpbiBsaW5rIGluZm9ybWF0aW9uIGFuZCBlbmFibGUgTFNFIHJlcG9ydGluZyAqLwotCWk0MGVfdXBkYXRlX2xpbmtfaW5mbygmcGYtPmh3LCB0cnVlKTsKLQlpNDBlX2xpbmtfZXZlbnQocGYpOwotCi0JLyogSW5pdGlhbGl6ZSB1c2VyLXNwZWNpZmljIGxpbmsgcHJvcGVydGllcyAqLwotCXBmLT5mY19hdXRvbmVnX3N0YXR1cyA9ICgocGYtPmh3LnBoeS5saW5rX2luZm8uYW5faW5mbyAmCi0JCQkJICBJNDBFX0FRX0FOX0NPTVBMRVRFRCkgPyB0cnVlIDogZmFsc2UpOwotCi0JLyogZmlsbCBpbiBsaW5rIGluZm9ybWF0aW9uIGFuZCBlbmFibGUgTFNFIHJlcG9ydGluZyAqLwotCWk0MGVfdXBkYXRlX2xpbmtfaW5mbygmcGYtPmh3LCB0cnVlKTsKKwlpNDBlX2FxX2dldF9saW5rX2luZm8oJnBmLT5odywgdHJ1ZSwgTlVMTCwgTlVMTCk7CiAJaTQwZV9saW5rX2V2ZW50KHBmKTsKIAogCS8qIEluaXRpYWxpemUgdXNlci1zcGVjaWZpYyBsaW5rIHByb3BlcnRpZXMgKi8KQEAgLTkwMDgsNyArOTQ1OCwxMSBAQAogCQkJcGYtPmZsYWdzICY9IH5JNDBFX0ZMQUdfRENCX0NBUEFCTEU7CiAJCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIm5vdCBlbm91Z2ggcXVldWVzIGZvciBEQ0IuIERDQiBpcyBkaXNhYmxlZC5cbiIpOwogCQl9Ci0JCXBmLT5udW1fbGFuX3FwcyA9IHBmLT5yc3Nfc2l6ZV9tYXg7CisJCXBmLT5udW1fbGFuX3FwcyA9IG1heF90KGludCwgcGYtPnJzc19zaXplX21heCwKKwkJCQkJbnVtX29ubGluZV9jcHVzKCkpOworCQlwZi0+bnVtX2xhbl9xcHMgPSBtaW5fdChpbnQsIHBmLT5udW1fbGFuX3FwcywKKwkJCQkJcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdHhfcXApOworCiAJCXF1ZXVlc19sZWZ0IC09IHBmLT5udW1fbGFuX3FwczsKIAl9CiAKQEAgLTkwNjEsNyArOTUxNSw3IEBACiAgKiBpNDBlX3NldHVwX3BmX2ZpbHRlcl9jb250cm9sIC0gU2V0dXAgUEYgc3RhdGljIGZpbHRlciBjb250cm9sCiAgKiBAcGY6IFBGIHRvIGJlIHNldHVwCiAgKgotICogaTQwZV9zZXR1cF9wZl9maWx0ZXJfY29udHJvbCBzZXRzIHVwIGEgcGYncyBpbml0aWFsIGZpbHRlciBjb250cm9sCisgKiBpNDBlX3NldHVwX3BmX2ZpbHRlcl9jb250cm9sIHNldHMgdXAgYSBQRidzIGluaXRpYWwgZmlsdGVyIGNvbnRyb2wKICAqIHNldHRpbmdzLiBJZiBQRS9GQ29FIGFyZSBlbmFibGVkIHRoZW4gaXQgd2lsbCBhbHNvIHNldCB0aGUgcGVyIFBGCiAgKiBiYXNlZCBmaWx0ZXIgc2l6ZXMgcmVxdWlyZWQgZm9yIHRoZW0uIEl0IGFsc28gZW5hYmxlcyBGbG93IGRpcmVjdG9yLAogICogZXRoZXJ0eXBlIGFuZCBtYWN2bGFuIHR5cGUgZmlsdGVyIHNldHRpbmdzIGZvciB0aGUgcGYuCkBAIC05MTA2LDggKzk1NjAsMTAgQEAKICNpZmRlZiBDT05GSUdfUENJX0lPVgogCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIlZGczogJWQgIiwgcGYtPm51bV9yZXFfdmZzKTsKICNlbmRpZgotCWJ1ZiArPSBzcHJpbnRmKGJ1ZiwgIlZTSXM6ICVkIFFQOiAlZCAiLCBwZi0+aHcuZnVuY19jYXBzLm51bV92c2lzLAotCQkgICAgICAgcGYtPnZzaVtwZi0+bGFuX3ZzaV0tPm51bV9xdWV1ZV9wYWlycyk7CisJYnVmICs9IHNwcmludGYoYnVmLCAiVlNJczogJWQgUVA6ICVkIFJYOiAlcyAiLAorCQkgICAgICAgcGYtPmh3LmZ1bmNfY2Fwcy5udW1fdnNpcywKKwkJICAgICAgIHBmLT52c2lbcGYtPmxhbl92c2ldLT5udW1fcXVldWVfcGFpcnMsCisJCSAgICAgICBwZi0+ZmxhZ3MgJiBJNDBFX0ZMQUdfUlhfUFNfRU5BQkxFRCA/ICJQUyIgOiAiMUJVRiIpOwogCiAJaWYgKHBmLT5mbGFncyAmIEk0MEVfRkxBR19SU1NfRU5BQkxFRCkKIAkJYnVmICs9IHNwcmludGYoYnVmLCAiUlNTICIpOwpAQCAtOTEzNiwxNCArOTU5MiwxNiBAQAogICogQHBkZXY6IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CiAgKiBAZW50OiBlbnRyeSBpbiBpNDBlX3BjaV90YmwKICAqCi0gKiBpNDBlX3Byb2JlIGluaXRpYWxpemVzIGEgcGYgaWRlbnRpZmllZCBieSBhIHBjaV9kZXYgc3RydWN0dXJlLgotICogVGhlIE9TIGluaXRpYWxpemF0aW9uLCBjb25maWd1cmluZyBvZiB0aGUgcGYgcHJpdmF0ZSBzdHJ1Y3R1cmUsCisgKiBpNDBlX3Byb2JlIGluaXRpYWxpemVzIGEgUEYgaWRlbnRpZmllZCBieSBhIHBjaV9kZXYgc3RydWN0dXJlLgorICogVGhlIE9TIGluaXRpYWxpemF0aW9uLCBjb25maWd1cmluZyBvZiB0aGUgUEYgcHJpdmF0ZSBzdHJ1Y3R1cmUsCiAgKiBhbmQgYSBoYXJkd2FyZSByZXNldCBvY2N1ci4KICAqCiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgb24gZmFpbHVyZQogICoqLwogc3RhdGljIGludCBpNDBlX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQogeworCXN0cnVjdCBpNDBlX2FxX2dldF9waHlfYWJpbGl0aWVzX3Jlc3AgYWJpbGl0aWVzOworCXVuc2lnbmVkIGxvbmcgaW9yZW1hcF9sZW47CiAJc3RydWN0IGk0MGVfcGYgKnBmOwogCXN0cnVjdCBpNDBlX2h3ICpodzsKIAlzdGF0aWMgdTE2IHBmc19mb3VuZDsKQEAgLTkxOTUsOCArOTY1MywxMSBAQAogCiAJaHcgPSAmcGYtPmh3OwogCWh3LT5iYWNrID0gcGY7Ci0JaHctPmh3X2FkZHIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKLQkJCSAgICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCisJaW9yZW1hcF9sZW4gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApLAorCQkJICAgIEk0MEVfTUFYX0NTUl9TUEFDRSk7CisKKwlody0+aHdfYWRkciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCBpb3JlbWFwX2xlbik7CiAJaWYgKCFody0+aHdfYWRkcikgewogCQllcnIgPSAtRUlPOwogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiaW9yZW1hcCgweCUwNHgsIDB4JTA0eCkgZmFpbGVkOiAweCV4XG4iLApAQCAtOTI3NCw3ICs5NzM1LDYgQEAKIAkJZGV2X2luZm8oJnBkZXYtPmRldiwKIAkJCSAiVGhlIGRyaXZlciBmb3IgdGhlIGRldmljZSBkZXRlY3RlZCBhbiBvbGRlciB2ZXJzaW9uIG9mIHRoZSBOVk0gaW1hZ2UgdGhhbiBleHBlY3RlZC4gUGxlYXNlIHVwZGF0ZSB0aGUgTlZNIGltYWdlLlxuIik7CiAKLQogCWk0MGVfdmVyaWZ5X2VlcHJvbShwZik7CiAKIAkvKiBSZXYgMCBoYXJkd2FyZSB3YXMgbmV2ZXIgcHJvZHVjdGl6ZWQgKi8KQEAgLTk0MDksMTMgKzk4NjksMTQgQEAKIAlpZiAoZXJyKQogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgInNldCBwaHkgbWFzayBmYWlsLCBhcV9lcnIgJWRcbiIsIGVycik7CiAKLQltc2xlZXAoNzUpOwotCWVyciA9IGk0MGVfYXFfc2V0X2xpbmtfcmVzdGFydF9hbigmcGYtPmh3LCB0cnVlLCBOVUxMKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAibGluayByZXN0YXJ0IGZhaWxlZCwgYXFfZXJyPSVkXG4iLAotCQkJIHBmLT5ody5hcS5hc3FfbGFzdF9zdGF0dXMpOworCWlmICgoKHBmLT5ody5hcS5md19tYWpfdmVyID09IDQpICYmIChwZi0+aHcuYXEuZndfbWluX3ZlciA8IDMzKSkgfHwKKwkgICAgKHBmLT5ody5hcS5md19tYWpfdmVyIDwgNCkpIHsKKwkJbXNsZWVwKDc1KTsKKwkJZXJyID0gaTQwZV9hcV9zZXRfbGlua19yZXN0YXJ0X2FuKCZwZi0+aHcsIHRydWUsIE5VTEwpOworCQlpZiAoZXJyKQorCQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsICJsaW5rIHJlc3RhcnQgZmFpbGVkLCBhcV9lcnI9JWRcbiIsCisJCQkJIHBmLT5ody5hcS5hc3FfbGFzdF9zdGF0dXMpOwogCX0KLQogCS8qIFRoZSBtYWluIGRyaXZlciBpcyAobW9zdGx5KSB1cCBhbmQgaGFwcHkuIFdlIG5lZWQgdG8gc2V0IHRoaXMgc3RhdGUKIAkgKiBiZWZvcmUgc2V0dGluZyB1cCB0aGUgbWlzYyB2ZWN0b3Igb3Igd2UgZ2V0IGEgcmFjZSBhbmQgdGhlIHZlY3RvcgogCSAqIGVuZHMgdXAgZGlzYWJsZWQgZm9yZXZlci4KQEAgLTk0OTksNiArOTk2MCwxMyBAQAogCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiUGxlYXNlIG1vdmUgdGhlIGRldmljZSB0byBhIGRpZmZlcmVudCBQQ0ktZSBsaW5rIHdpdGggbW9yZSBsYW5lcyBhbmQvb3IgaGlnaGVyIHRyYW5zZmVyIHJhdGUuXG4iKTsKIAl9CiAKKwkvKiBnZXQgdGhlIHJlcXVlc3RlZCBzcGVlZHMgZnJvbSB0aGUgZncgKi8KKwllcnIgPSBpNDBlX2FxX2dldF9waHlfY2FwYWJpbGl0aWVzKGh3LCBmYWxzZSwgZmFsc2UsICZhYmlsaXRpZXMsIE5VTEwpOworCWlmIChlcnIpCisJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiZ2V0IHBoeSBhYmlsaXRpZXMgZmFpbGVkLCBhcV9lcnIgJWQsIGFkdmVydGlzZWQgc3BlZWQgc2V0dGluZ3MgbWF5IG5vdCBiZSBjb3JyZWN0XG4iLAorCQkJIGVycik7CisJcGYtPmh3LnBoeS5saW5rX2luZm8ucmVxdWVzdGVkX3NwZWVkcyA9IGFiaWxpdGllcy5saW5rX3NwZWVkOworCiAJLyogcHJpbnQgYSBzdHJpbmcgc3VtbWFyaXppbmcgZmVhdHVyZXMgKi8KIAlpNDBlX3ByaW50X2ZlYXR1cmVzKHBmKTsKIApAQCAtOTUxNyw3ICs5OTg1LDYgQEAKIAkodm9pZClpNDBlX3NodXRkb3duX2xhbl9obWMoaHcpOwogZXJyX2luaXRfbGFuX2htYzoKIAlrZnJlZShwZi0+cXBfcGlsZSk7Ci0Ja2ZyZWUocGYtPmlycV9waWxlKTsKIGVycl9zd19pbml0OgogZXJyX2FkbWlucV9zZXR1cDoKIAkodm9pZClpNDBlX3NodXRkb3duX2FkbWlucShodyk7CkBAIC05NjE3LDcgKzEwMDg0LDYgQEAKIAl9CiAKIAlrZnJlZShwZi0+cXBfcGlsZSk7Ci0Ja2ZyZWUocGYtPmlycV9waWxlKTsKIAlrZnJlZShwZi0+dnNpKTsKIAogCWlvdW5tYXAocGYtPmh3Lmh3X2FkZHIpOwpAQCAtOTc2MCw2ICsxMDIyNiw4IEBACiAJc2V0X2JpdChfX0k0MEVfRE9XTiwgJnBmLT5zdGF0ZSk7CiAJZGVsX3RpbWVyX3N5bmMoJnBmLT5zZXJ2aWNlX3RpbWVyKTsKIAljYW5jZWxfd29ya19zeW5jKCZwZi0+c2VydmljZV90YXNrKTsKKwlpNDBlX2ZkaXJfdGVhcmRvd24ocGYpOworCiAJcnRubF9sb2NrKCk7CiAJaTQwZV9wcmVwX2Zvcl9yZXNldChwZik7CiAJcnRubF91bmxvY2soKTsKQEAgLTk4NDQsNiArMTAzMTIsNyBAQAogCXByX2luZm8oIiVzOiAlcyAtIHZlcnNpb24gJXNcbiIsIGk0MGVfZHJpdmVyX25hbWUsCiAJCWk0MGVfZHJpdmVyX3N0cmluZywgaTQwZV9kcml2ZXJfdmVyc2lvbl9zdHIpOwogCXByX2luZm8oIiVzOiAlc1xuIiwgaTQwZV9kcml2ZXJfbmFtZSwgaTQwZV9jb3B5cmlnaHQpOworCiAJaTQwZV9kYmdfaW5pdCgpOwogCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpNDBlX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbnZtLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfbnZtLmMKaW5kZXggNWRlZmUwZC4uZTQ5YWNkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX252bS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9udm0uYwpAQCAtMTY0LDE1ICsxNjQsMTUgQEAKIH0KIAogLyoqCi0gKiBpNDBlX3JlYWRfbnZtX3dvcmQgLSBSZWFkcyBTaGFkb3cgUkFNCisgKiBpNDBlX3JlYWRfbnZtX3dvcmRfc3JjdGwgLSBSZWFkcyBTaGFkb3cgUkFNIHZpYSBTUkNUTCByZWdpc3RlcgogICogQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqIEBvZmZzZXQ6IG9mZnNldCBvZiB0aGUgU2hhZG93IFJBTSB3b3JkIHRvIHJlYWQgKDB4MDAwMDAwIC0gMHgwMDFGRkYpCiAgKiBAZGF0YTogd29yZCByZWFkIGZyb20gdGhlIFNoYWRvdyBSQU0KICAqCiAgKiBSZWFkcyBvbmUgMTYgYml0IHdvcmQgZnJvbSB0aGUgU2hhZG93IFJBTSB1c2luZyB0aGUgR0xOVk1fU1JDVEwgcmVnaXN0ZXIuCiAgKiovCi1pNDBlX3N0YXR1cyBpNDBlX3JlYWRfbnZtX3dvcmQoc3RydWN0IGk0MGVfaHcgKmh3LCB1MTYgb2Zmc2V0LAotCQkJCQkgdTE2ICpkYXRhKQorc3RhdGljIGk0MGVfc3RhdHVzIGk0MGVfcmVhZF9udm1fd29yZF9zcmN0bChzdHJ1Y3QgaTQwZV9odyAqaHcsIHUxNiBvZmZzZXQsCisJCQkJCSAgICB1MTYgKmRhdGEpCiB7CiAJaTQwZV9zdGF0dXMgcmV0X2NvZGUgPSBJNDBFX0VSUl9USU1FT1VUOwogCXUzMiBzcl9yZWc7CkBAIC0yMTIsNiArMjEyLDUxIEBACiB9CiAKIC8qKgorICogaTQwZV9yZWFkX252bV93b3JkIC0gUmVhZHMgU2hhZG93IFJBTQorICogQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKKyAqIEBvZmZzZXQ6IG9mZnNldCBvZiB0aGUgU2hhZG93IFJBTSB3b3JkIHRvIHJlYWQgKDB4MDAwMDAwIC0gMHgwMDFGRkYpCisgKiBAZGF0YTogd29yZCByZWFkIGZyb20gdGhlIFNoYWRvdyBSQU0KKyAqCisgKiBSZWFkcyBvbmUgMTYgYml0IHdvcmQgZnJvbSB0aGUgU2hhZG93IFJBTSB1c2luZyB0aGUgR0xOVk1fU1JDVEwgcmVnaXN0ZXIuCisgKiovCitpNDBlX3N0YXR1cyBpNDBlX3JlYWRfbnZtX3dvcmQoc3RydWN0IGk0MGVfaHcgKmh3LCB1MTYgb2Zmc2V0LAorCQkJICAgICAgIHUxNiAqZGF0YSkKK3sKKwlyZXR1cm4gaTQwZV9yZWFkX252bV93b3JkX3NyY3RsKGh3LCBvZmZzZXQsIGRhdGEpOworfQorCisvKioKKyAqIGk0MGVfcmVhZF9udm1fYnVmZmVyX3NyY3RsIC0gUmVhZHMgU2hhZG93IFJBTSBidWZmZXIgdmlhIFNSQ1RMIHJlZ2lzdGVyCisgKiBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICogQG9mZnNldDogb2Zmc2V0IG9mIHRoZSBTaGFkb3cgUkFNIHdvcmQgdG8gcmVhZCAoMHgwMDAwMDAgLSAweDAwMUZGRikuCisgKiBAd29yZHM6IChpbikgbnVtYmVyIG9mIHdvcmRzIHRvIHJlYWQ7IChvdXQpIG51bWJlciBvZiB3b3JkcyBhY3R1YWxseSByZWFkCisgKiBAZGF0YTogd29yZHMgcmVhZCBmcm9tIHRoZSBTaGFkb3cgUkFNCisgKgorICogUmVhZHMgMTYgYml0IHdvcmRzIChkYXRhIGJ1ZmZlcikgZnJvbSB0aGUgU1IgdXNpbmcgdGhlIGk0MGVfcmVhZF9udm1fc3JyZCgpCisgKiBtZXRob2QuIFRoZSBidWZmZXIgcmVhZCBpcyBwcmVjZWRlZCBieSB0aGUgTlZNIG93bmVyc2hpcCB0YWtlCisgKiBhbmQgZm9sbG93ZWQgYnkgdGhlIHJlbGVhc2UuCisgKiovCitzdGF0aWMgaTQwZV9zdGF0dXMgaTQwZV9yZWFkX252bV9idWZmZXJfc3JjdGwoc3RydWN0IGk0MGVfaHcgKmh3LCB1MTYgb2Zmc2V0LAorCQkJCQkgICAgICB1MTYgKndvcmRzLCB1MTYgKmRhdGEpCit7CisJaTQwZV9zdGF0dXMgcmV0X2NvZGUgPSAwOworCXUxNiBpbmRleCwgd29yZDsKKworCS8qIExvb3AgdGhydSB0aGUgc2VsZWN0ZWQgcmVnaW9uICovCisJZm9yICh3b3JkID0gMDsgd29yZCA8ICp3b3Jkczsgd29yZCsrKSB7CisJCWluZGV4ID0gb2Zmc2V0ICsgd29yZDsKKwkJcmV0X2NvZGUgPSBpNDBlX3JlYWRfbnZtX3dvcmRfc3JjdGwoaHcsIGluZGV4LCAmZGF0YVt3b3JkXSk7CisJCWlmIChyZXRfY29kZSkKKwkJCWJyZWFrOworCX0KKworCS8qIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIHdvcmRzIHJlYWQgZnJvbSB0aGUgU2hhZG93IFJBTSAqLworCSp3b3JkcyA9IHdvcmQ7CisKKwlyZXR1cm4gcmV0X2NvZGU7Cit9CisKKy8qKgogICogaTQwZV9yZWFkX252bV9idWZmZXIgLSBSZWFkcyBTaGFkb3cgUkFNIGJ1ZmZlcgogICogQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqIEBvZmZzZXQ6IG9mZnNldCBvZiB0aGUgU2hhZG93IFJBTSB3b3JkIHRvIHJlYWQgKDB4MDAwMDAwIC0gMHgwMDFGRkYpLgpAQCAtMjIzLDIzICsyNjgsOSBAQAogICogYW5kIGZvbGxvd2VkIGJ5IHRoZSByZWxlYXNlLgogICoqLwogaTQwZV9zdGF0dXMgaTQwZV9yZWFkX252bV9idWZmZXIoc3RydWN0IGk0MGVfaHcgKmh3LCB1MTYgb2Zmc2V0LAotCQkJCQkgICB1MTYgKndvcmRzLCB1MTYgKmRhdGEpCisJCQkJIHUxNiAqd29yZHMsIHUxNiAqZGF0YSkKIHsKLQlpNDBlX3N0YXR1cyByZXRfY29kZSA9IDA7Ci0JdTE2IGluZGV4LCB3b3JkOwotCi0JLyogTG9vcCB0aHJ1IHRoZSBzZWxlY3RlZCByZWdpb24gKi8KLQlmb3IgKHdvcmQgPSAwOyB3b3JkIDwgKndvcmRzOyB3b3JkKyspIHsKLQkJaW5kZXggPSBvZmZzZXQgKyB3b3JkOwotCQlyZXRfY29kZSA9IGk0MGVfcmVhZF9udm1fd29yZChodywgaW5kZXgsICZkYXRhW3dvcmRdKTsKLQkJaWYgKHJldF9jb2RlKQotCQkJYnJlYWs7Ci0JfQotCi0JLyogVXBkYXRlIHRoZSBudW1iZXIgb2Ygd29yZHMgcmVhZCBmcm9tIHRoZSBTaGFkb3cgUkFNICovCi0JKndvcmRzID0gd29yZDsKLQotCXJldHVybiByZXRfY29kZTsKKwlyZXR1cm4gaTQwZV9yZWFkX252bV9idWZmZXJfc3JjdGwoaHcsIG9mZnNldCwgd29yZHMsIGRhdGEpOwogfQogCiAvKioKQEAgLTMwMiwxMSArMzMzLDE4IEBACiAJCQkJCQkgICAgdTE2ICpjaGVja3N1bSkKIHsKIAlpNDBlX3N0YXR1cyByZXRfY29kZSA9IDA7CisJc3RydWN0IGk0MGVfdmlydF9tZW0gdm1lbTsKIAl1MTYgcGNpZV9hbHRfbW9kdWxlID0gMDsKIAl1MTYgY2hlY2tzdW1fbG9jYWwgPSAwOwogCXUxNiB2cGRfbW9kdWxlID0gMDsKLQl1MTYgd29yZCA9IDA7Ci0JdTMyIGkgPSAwOworCXUxNiAqZGF0YTsKKwl1MTYgaSA9IDA7CisKKwlyZXRfY29kZSA9IGk0MGVfYWxsb2NhdGVfdmlydF9tZW0oaHcsICZ2bWVtLAorCQkJCSAgICBJNDBFX1NSX1NFQ1RPUl9TSVpFX0lOX1dPUkRTICogc2l6ZW9mKHUxNikpOworCWlmIChyZXRfY29kZSkKKwkJZ290byBpNDBlX2NhbGNfbnZtX2NoZWNrc3VtX2V4aXQ7CisJZGF0YSA9ICh1MTYgKil2bWVtLnZhOwogCiAJLyogcmVhZCBwb2ludGVyIHRvIFZQRCBhcmVhICovCiAJcmV0X2NvZGUgPSBpNDBlX3JlYWRfbnZtX3dvcmQoaHcsIEk0MEVfU1JfVlBEX1BUUiwgJnZwZF9tb2R1bGUpOwpAQCAtMzE3LDcgKzM1NSw3IEBACiAKIAkvKiByZWFkIHBvaW50ZXIgdG8gUENJZSBBbHQgQXV0by1sb2FkIG1vZHVsZSAqLwogCXJldF9jb2RlID0gaTQwZV9yZWFkX252bV93b3JkKGh3LCBJNDBFX1NSX1BDSUVfQUxUX0FVVE9fTE9BRF9QVFIsCi0JCQkJICAgICAgICZwY2llX2FsdF9tb2R1bGUpOworCQkJCSAgICAgICZwY2llX2FsdF9tb2R1bGUpOwogCWlmIChyZXRfY29kZSkgewogCQlyZXRfY29kZSA9IEk0MEVfRVJSX05WTV9DSEVDS1NVTTsKIAkJZ290byBpNDBlX2NhbGNfbnZtX2NoZWNrc3VtX2V4aXQ7CkBAIC0zMjcsMzMgKzM2NSw0MCBAQAogCSAqIGV4Y2VwdCB0aGUgVlBEIGFuZCBQQ0llIEFMVCBBdXRvLWxvYWQgbW9kdWxlcwogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBody0+bnZtLnNyX3NpemU7IGkrKykgewotCQkvKiBTa2lwIENoZWNrc3VtIHdvcmQgKi8KLQkJaWYgKGkgPT0gSTQwRV9TUl9TV19DSEVDS1NVTV9XT1JEKQotCQkJaSsrOwotCQkvKiBTa2lwIFZQRCBtb2R1bGUgKGNvbnZlcnQgYnl0ZSBzaXplIHRvIHdvcmQgY291bnQpICovCi0JCWlmIChpID09ICh1MzIpdnBkX21vZHVsZSkgewotCQkJaSArPSAoSTQwRV9TUl9WUERfTU9EVUxFX01BWF9TSVpFIC8gMik7Ci0JCQlpZiAoaSA+PSBody0+bnZtLnNyX3NpemUpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLyogU2tpcCBQQ0llIEFMVCBtb2R1bGUgKGNvbnZlcnQgYnl0ZSBzaXplIHRvIHdvcmQgY291bnQpICovCi0JCWlmIChpID09ICh1MzIpcGNpZV9hbHRfbW9kdWxlKSB7Ci0JCQlpICs9IChJNDBFX1NSX1BDSUVfQUxUX01PRFVMRV9NQVhfU0laRSAvIDIpOwotCQkJaWYgKGkgPj0gaHctPm52bS5zcl9zaXplKQotCQkJCWJyZWFrOworCQkvKiBSZWFkIFNSIHBhZ2UgKi8KKwkJaWYgKChpICUgSTQwRV9TUl9TRUNUT1JfU0laRV9JTl9XT1JEUykgPT0gMCkgeworCQkJdTE2IHdvcmRzID0gSTQwRV9TUl9TRUNUT1JfU0laRV9JTl9XT1JEUzsKKworCQkJcmV0X2NvZGUgPSBpNDBlX3JlYWRfbnZtX2J1ZmZlcihodywgaSwgJndvcmRzLCBkYXRhKTsKKwkJCWlmIChyZXRfY29kZSkgeworCQkJCXJldF9jb2RlID0gSTQwRV9FUlJfTlZNX0NIRUNLU1VNOworCQkJCWdvdG8gaTQwZV9jYWxjX252bV9jaGVja3N1bV9leGl0OworCQkJfQogCQl9CiAKLQkJcmV0X2NvZGUgPSBpNDBlX3JlYWRfbnZtX3dvcmQoaHcsICh1MTYpaSwgJndvcmQpOwotCQlpZiAocmV0X2NvZGUpIHsKLQkJCXJldF9jb2RlID0gSTQwRV9FUlJfTlZNX0NIRUNLU1VNOwotCQkJZ290byBpNDBlX2NhbGNfbnZtX2NoZWNrc3VtX2V4aXQ7CisJCS8qIFNraXAgQ2hlY2tzdW0gd29yZCAqLworCQlpZiAoaSA9PSBJNDBFX1NSX1NXX0NIRUNLU1VNX1dPUkQpCisJCQljb250aW51ZTsKKwkJLyogU2tpcCBWUEQgbW9kdWxlIChjb252ZXJ0IGJ5dGUgc2l6ZSB0byB3b3JkIGNvdW50KSAqLworCQlpZiAoKGkgPj0gKHUzMil2cGRfbW9kdWxlKSAmJgorCQkgICAgKGkgPCAoKHUzMil2cGRfbW9kdWxlICsKKwkJICAgICAoSTQwRV9TUl9WUERfTU9EVUxFX01BWF9TSVpFIC8gMikpKSkgeworCQkJY29udGludWU7CiAJCX0KLQkJY2hlY2tzdW1fbG9jYWwgKz0gd29yZDsKKwkJLyogU2tpcCBQQ0llIEFMVCBtb2R1bGUgKGNvbnZlcnQgYnl0ZSBzaXplIHRvIHdvcmQgY291bnQpICovCisJCWlmICgoaSA+PSAodTMyKXBjaWVfYWx0X21vZHVsZSkgJiYKKwkJICAgIChpIDwgKCh1MzIpcGNpZV9hbHRfbW9kdWxlICsKKwkJICAgICAoSTQwRV9TUl9QQ0lFX0FMVF9NT0RVTEVfTUFYX1NJWkUgLyAyKSkpKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWNoZWNrc3VtX2xvY2FsICs9IGRhdGFbaSAlIEk0MEVfU1JfU0VDVE9SX1NJWkVfSU5fV09SRFNdOwogCX0KIAogCSpjaGVja3N1bSA9ICh1MTYpSTQwRV9TUl9TV19DSEVDS1NVTV9CQVNFIC0gY2hlY2tzdW1fbG9jYWw7CiAKIGk0MGVfY2FsY19udm1fY2hlY2tzdW1fZXhpdDoKKwlpNDBlX2ZyZWVfdmlydF9tZW0oaHcsICZ2bWVtKTsKIAlyZXR1cm4gcmV0X2NvZGU7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9wcm90b3R5cGUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9wcm90b3R5cGUuaAppbmRleCA2OGU4NTJhLi5mZWEwZDM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfcHJvdG90eXBlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3Byb3RvdHlwZS5oCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBJbnRlbCBFdGhlcm5ldCBDb250cm9sbGVyIFhMNzEwIEZhbWlseSBMaW51eCBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTY2LDYgKzY2LDcgQEAKIAogaTQwZV9zdGF0dXMgaTQwZV9hcV9nZXRfZmlybXdhcmVfdmVyc2lvbihzdHJ1Y3QgaTQwZV9odyAqaHcsCiAJCQkJdTE2ICpmd19tYWpvcl92ZXJzaW9uLCB1MTYgKmZ3X21pbm9yX3ZlcnNpb24sCisJCQkJdTMyICpmd19idWlsZCwKIAkJCQl1MTYgKmFwaV9tYWpvcl92ZXJzaW9uLCB1MTYgKmFwaV9taW5vcl92ZXJzaW9uLAogCQkJCXN0cnVjdCBpNDBlX2FzcV9jbWRfZGV0YWlscyAqY21kX2RldGFpbHMpOwogaTQwZV9zdGF0dXMgaTQwZV9hcV9kZWJ1Z193cml0ZV9yZWdpc3RlcihzdHJ1Y3QgaTQwZV9odyAqaHcsCkBAIC05Nyw3ICs5OCw2IEBACiBpNDBlX3N0YXR1cyBpNDBlX2FxX2dldF9saW5rX2luZm8oc3RydWN0IGk0MGVfaHcgKmh3LAogCQkJCWJvb2wgZW5hYmxlX2xzZSwgc3RydWN0IGk0MGVfbGlua19zdGF0dXMgKmxpbmssCiAJCQkJc3RydWN0IGk0MGVfYXNxX2NtZF9kZXRhaWxzICpjbWRfZGV0YWlscyk7Ci1pNDBlX3N0YXR1cyBpNDBlX3VwZGF0ZV9saW5rX2luZm8oc3RydWN0IGk0MGVfaHcgKmh3LCBib29sIGVuYWJsZV9sc2UpOwogaTQwZV9zdGF0dXMgaTQwZV9hcV9zZXRfbG9jYWxfYWR2dF9yZWcoc3RydWN0IGk0MGVfaHcgKmh3LAogCQkJCXU2NCBhZHZ0X3JlZywKIAkJCQlzdHJ1Y3QgaTQwZV9hc3FfY21kX2RldGFpbHMgKmNtZF9kZXRhaWxzKTsKQEAgLTI0Nyw2ICsyNDcsMTIgQEAKIHZvaWQgaTQwZV9jbGVhcl9weGVfbW9kZShzdHJ1Y3QgaTQwZV9odyAqaHcpOwogYm9vbCBpNDBlX2dldF9saW5rX3N0YXR1cyhzdHJ1Y3QgaTQwZV9odyAqaHcpOwogaTQwZV9zdGF0dXMgaTQwZV9nZXRfbWFjX2FkZHIoc3RydWN0IGk0MGVfaHcgKmh3LCB1OCAqbWFjX2FkZHIpOworaTQwZV9zdGF0dXMgaTQwZV9yZWFkX2J3X2Zyb21fYWx0X3JhbShzdHJ1Y3QgaTQwZV9odyAqaHcsCisJCQkJICAgICAgdTMyICptYXhfYncsIHUzMiAqbWluX2J3LCBib29sICptaW5fdmFsaWQsCisJCQkJICAgICAgYm9vbCAqbWF4X3ZhbGlkKTsKK2k0MGVfc3RhdHVzIGk0MGVfYXFfY29uZmlndXJlX3BhcnRpdGlvbl9idyhzdHJ1Y3QgaTQwZV9odyAqaHcsCisJCQlzdHJ1Y3QgaTQwZV9hcWNfY29uZmlndXJlX3BhcnRpdGlvbl9id19kYXRhICpid19kYXRhLAorCQkJc3RydWN0IGk0MGVfYXNxX2NtZF9kZXRhaWxzICpjbWRfZGV0YWlscyk7CiBpNDBlX3N0YXR1cyBpNDBlX2dldF9wb3J0X21hY19hZGRyKHN0cnVjdCBpNDBlX2h3ICpodywgdTggKm1hY19hZGRyKTsKIGk0MGVfc3RhdHVzIGk0MGVfcmVhZF9wYmFfc3RyaW5nKHN0cnVjdCBpNDBlX2h3ICpodywgdTggKnBiYV9udW0sCiAJCQkJIHUzMiBwYmFfbnVtX3NpemUpOwpAQCAtMjYwLDggKzI2Niw2IEBACiBpNDBlX3N0YXR1cyBpNDBlX2FjcXVpcmVfbnZtKHN0cnVjdCBpNDBlX2h3ICpodywKIAkJCQkgICAgICBlbnVtIGk0MGVfYXFfcmVzb3VyY2VfYWNjZXNzX3R5cGUgYWNjZXNzKTsKIHZvaWQgaTQwZV9yZWxlYXNlX252bShzdHJ1Y3QgaTQwZV9odyAqaHcpOwotaTQwZV9zdGF0dXMgaTQwZV9yZWFkX252bV9zcnJkKHN0cnVjdCBpNDBlX2h3ICpodywgdTE2IG9mZnNldCwKLQkJCQkJIHUxNiAqZGF0YSk7CiBpNDBlX3N0YXR1cyBpNDBlX3JlYWRfbnZtX3dvcmQoc3RydWN0IGk0MGVfaHcgKmh3LCB1MTYgb2Zmc2V0LAogCQkJCQkgdTE2ICpkYXRhKTsKIGk0MGVfc3RhdHVzIGk0MGVfcmVhZF9udm1fYnVmZmVyKHN0cnVjdCBpNDBlX2h3ICpodywgdTE2IG9mZnNldCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9wdHAuYwppbmRleCBmYWJjZmExLi5hOTJiNzcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfcHRwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3B0cC5jCkBAIC01Nyw3ICs1Nyw3IEBACiAgKiB0aW1lc3BlYy4gSG93ZXZlciwgc2luY2UgdGhlIHJlZ2lzdGVycyBhcmUgNjQgYml0cyBvZiBuYW5vc2Vjb25kcywgd2UgbXVzdAogICogY29udmVydCB0aGUgcmVzdWx0IHRvIGEgdGltZXNwZWMgYmVmb3JlIHdlIGNhbiByZXR1cm4uCiAgKiovCi1zdGF0aWMgdm9pZCBpNDBlX3B0cF9yZWFkKHN0cnVjdCBpNDBlX3BmICpwZiwgc3RydWN0IHRpbWVzcGVjICp0cykKK3N0YXRpYyB2b2lkIGk0MGVfcHRwX3JlYWQoc3RydWN0IGk0MGVfcGYgKnBmLCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJc3RydWN0IGk0MGVfaHcgKmh3ID0gJnBmLT5odzsKIAl1MzIgaGksIGxvOwpAQCAtNjksNyArNjksNyBAQAogCiAJbnMgPSAoKCh1NjQpaGkpIDw8IDMyKSB8IGxvOwogCi0JKnRzID0gbnNfdG9fdGltZXNwZWMobnMpOworCSp0cyA9IG5zX3RvX3RpbWVzcGVjNjQobnMpOwogfQogCiAvKioKQEAgLTgxLDEwICs4MSwxMCBAQAogICogd2UgcmVjZWl2ZSBhIHRpbWVzcGVjIGZyb20gdGhlIHN0YWNrLCB3ZSBtdXN0IGNvbnZlcnQgdGhhdCB0aW1lc3BlYyBpbnRvCiAgKiBuYW5vc2Vjb25kcyBiZWZvcmUgcHJvZ3JhbW1pbmcgdGhlIHJlZ2lzdGVycy4KICAqKi8KLXN0YXRpYyB2b2lkIGk0MGVfcHRwX3dyaXRlKHN0cnVjdCBpNDBlX3BmICpwZiwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cykKK3N0YXRpYyB2b2lkIGk0MGVfcHRwX3dyaXRlKHN0cnVjdCBpNDBlX3BmICpwZiwgY29uc3Qgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXN0cnVjdCBpNDBlX2h3ICpodyA9ICZwZi0+aHc7Ci0JdTY0IG5zID0gdGltZXNwZWNfdG9fbnModHMpOworCXU2NCBucyA9IHRpbWVzcGVjNjRfdG9fbnModHMpOwogCiAJLyogVGhlIHRpbWVyIHdpbGwgbm90IHVwZGF0ZSB1bnRpbCB0aGUgaGlnaCByZWdpc3RlciBpcyB3cml0dGVuLCBzbwogCSAqIHdyaXRlIHRoZSBsb3cgcmVnaXN0ZXIgZmlyc3QuCkBAIC0xNTksMTQgKzE1OSwxNCBAQAogc3RhdGljIGludCBpNDBlX3B0cF9hZGp0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzNjQgZGVsdGEpCiB7CiAJc3RydWN0IGk0MGVfcGYgKnBmID0gY29udGFpbmVyX29mKHB0cCwgc3RydWN0IGk0MGVfcGYsIHB0cF9jYXBzKTsKLQlzdHJ1Y3QgdGltZXNwZWMgbm93LCB0aGVuID0gbnNfdG9fdGltZXNwZWMoZGVsdGEpOworCXN0cnVjdCB0aW1lc3BlYzY0IG5vdywgdGhlbiA9IG5zX3RvX3RpbWVzcGVjNjQoZGVsdGEpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGYtPnRtcmVnX2xvY2ssIGZsYWdzKTsKIAogCWk0MGVfcHRwX3JlYWQocGYsICZub3cpOwotCW5vdyA9IHRpbWVzcGVjX2FkZChub3csIHRoZW4pOwotCWk0MGVfcHRwX3dyaXRlKHBmLCAoY29uc3Qgc3RydWN0IHRpbWVzcGVjICopJm5vdyk7CisJbm93ID0gdGltZXNwZWM2NF9hZGQobm93LCB0aGVuKTsKKwlpNDBlX3B0cF93cml0ZShwZiwgKGNvbnN0IHN0cnVjdCB0aW1lc3BlYzY0ICopJm5vdyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZi0+dG1yZWdfbG9jaywgZmxhZ3MpOwogCkBAIC0xODEsNyArMTgxLDcgQEAKICAqIFJlYWQgdGhlIGRldmljZSBjbG9jayBhbmQgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIG9uIG5zLCBhZnRlciBjb252ZXJ0aW5nIGl0CiAgKiBpbnRvIGEgdGltZXNwZWMgc3RydWN0LgogICoqLwotc3RhdGljIGludCBpNDBlX3B0cF9nZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorc3RhdGljIGludCBpNDBlX3B0cF9nZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJc3RydWN0IGk0MGVfcGYgKnBmID0gY29udGFpbmVyX29mKHB0cCwgc3RydWN0IGk0MGVfcGYsIHB0cF9jYXBzKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjAyLDcgKzIwMiw3IEBACiAgKiB0byBucyBoYXBwZW5zIGluIHRoZSB3cml0ZSBmdW5jdGlvbi4KICAqKi8KIHN0YXRpYyBpbnQgaTQwZV9wdHBfc2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorCQkJICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSBjb250YWluZXJfb2YocHRwLCBzdHJ1Y3QgaTQwZV9wZiwgcHRwX2NhcHMpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC02MTMsOCArNjEzLDggQEAKIAlwZi0+cHRwX2NhcHMucHBzID0gMDsKIAlwZi0+cHRwX2NhcHMuYWRqZnJlcSA9IGk0MGVfcHRwX2FkamZyZXE7CiAJcGYtPnB0cF9jYXBzLmFkanRpbWUgPSBpNDBlX3B0cF9hZGp0aW1lOwotCXBmLT5wdHBfY2Fwcy5nZXR0aW1lID0gaTQwZV9wdHBfZ2V0dGltZTsKLQlwZi0+cHRwX2NhcHMuc2V0dGltZSA9IGk0MGVfcHRwX3NldHRpbWU7CisJcGYtPnB0cF9jYXBzLmdldHRpbWU2NCA9IGk0MGVfcHRwX2dldHRpbWU7CisJcGYtPnB0cF9jYXBzLnNldHRpbWU2NCA9IGk0MGVfcHRwX3NldHRpbWU7CiAJcGYtPnB0cF9jYXBzLmVuYWJsZSA9IGk0MGVfcHRwX2ZlYXR1cmVfZW5hYmxlOwogCiAJLyogQXR0ZW1wdCB0byByZWdpc3RlciB0aGUgY2xvY2sgYmVmb3JlIGVuYWJsaW5nIHRoZSBoYXJkd2FyZS4gKi8KQEAgLTY3Myw3ICs2NzMsNyBAQAogCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiJXM6IHB0cF9jbG9ja19yZWdpc3RlciBmYWlsZWRcbiIsCiAJCQlfX2Z1bmNfXyk7CiAJfSBlbHNlIHsKLQkJc3RydWN0IHRpbWVzcGVjIHRzOworCQlzdHJ1Y3QgdGltZXNwZWM2NCB0czsKIAkJdTMyIHJlZ3ZhbDsKIAogCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwgIiVzOiBhZGRlZCBQSEMgb24gJXNcbiIsIF9fZnVuY19fLApAQCAtNjk1LDcgKzY5NSw3IEBACiAJCWk0MGVfcHRwX3NldF90aW1lc3RhbXBfbW9kZShwZiwgJnBmLT50c3RhbXBfY29uZmlnKTsKIAogCQkvKiBTZXQgdGhlIGNsb2NrIHZhbHVlLiAqLwotCQl0cyA9IGt0aW1lX3RvX3RpbWVzcGVjKGt0aW1lX2dldF9yZWFsKCkpOworCQl0cyA9IGt0aW1lX3RvX3RpbWVzcGVjNjQoa3RpbWVfZ2V0X3JlYWwoKSk7CiAJCWk0MGVfcHRwX3NldHRpbWUoJnBmLT5wdHBfY2FwcywgJnRzKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfcmVnaXN0ZXIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9yZWdpc3Rlci5oCmluZGV4IDY1ZDNjOGIuLjUyMmQ2ZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9yZWdpc3Rlci5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV9yZWdpc3Rlci5oCkBAIC0zMTAsNiArMzEwLDEwIEBACiAjZGVmaW5lIEk0MEVfUFJURENCX1JVUDJUQ19VUDZUQ19NQVNLIEk0MEVfTUFTSygweDcsIEk0MEVfUFJURENCX1JVUDJUQ19VUDZUQ19TSElGVCkKICNkZWZpbmUgSTQwRV9QUlREQ0JfUlVQMlRDX1VQN1RDX1NISUZUIDIxCiAjZGVmaW5lIEk0MEVfUFJURENCX1JVUDJUQ19VUDdUQ19NQVNLIEk0MEVfTUFTSygweDcsIEk0MEVfUFJURENCX1JVUDJUQ19VUDdUQ19TSElGVCkKKyNkZWZpbmUgSTQwRV9QUlREQ0JfUlVQVFEoX2kpICgweDAwMTIyNDAwICsgKChfaSkgKiAzMikpIC8qIF9pPTAuLi43ICovIC8qIFJlc2V0OiBDT1JFUiAqLworI2RlZmluZSBJNDBFX1BSVERDQl9SVVBUUV9NQVhfSU5ERVggNworI2RlZmluZSBJNDBFX1BSVERDQl9SVVBUUV9SWFFOVU1fU0hJRlQgMAorI2RlZmluZSBJNDBFX1BSVERDQl9SVVBUUV9SWFFOVU1fTUFTSyBJNDBFX01BU0soMHgzRkZGLCBJNDBFX1BSVERDQl9SVVBUUV9SWFFOVU1fU0hJRlQpCiAjZGVmaW5lIEk0MEVfUFJURENCX1RDMlBGQyAweDAwMUMwOTgwIC8qIFJlc2V0OiBDT1JFUiAqLwogI2RlZmluZSBJNDBFX1BSVERDQl9UQzJQRkNfVEMyUEZDX1NISUZUIDAKICNkZWZpbmUgSTQwRV9QUlREQ0JfVEMyUEZDX1RDMlBGQ19NQVNLIEk0MEVfTUFTSygweEZGLCBJNDBFX1BSVERDQl9UQzJQRkNfVEMyUEZDX1NISUZUKQpAQCAtNDIxLDYgKzQyNSw4IEBACiAjZGVmaW5lIEk0MEVfR0xHRU5fR1BJT19DVExfT1VUX0RFRkFVTFRfTUFTSyBJNDBFX01BU0soMHgxLCBJNDBFX0dMR0VOX0dQSU9fQ1RMX09VVF9ERUZBVUxUX1NISUZUKQogI2RlZmluZSBJNDBFX0dMR0VOX0dQSU9fQ1RMX1BIWV9QSU5fTkFNRV9TSElGVCAyMAogI2RlZmluZSBJNDBFX0dMR0VOX0dQSU9fQ1RMX1BIWV9QSU5fTkFNRV9NQVNLIEk0MEVfTUFTSygweDNGLCBJNDBFX0dMR0VOX0dQSU9fQ1RMX1BIWV9QSU5fTkFNRV9TSElGVCkKKyNkZWZpbmUgSTQwRV9HTEdFTl9HUElPX0NUTF9QUlRfQklUX01BUF9TSElGVCAyNgorI2RlZmluZSBJNDBFX0dMR0VOX0dQSU9fQ1RMX1BSVF9CSVRfTUFQX01BU0sgSTQwRV9NQVNLKDB4RiwgSTQwRV9HTEdFTl9HUElPX0NUTF9QUlRfQklUX01BUF9TSElGVCkKICNkZWZpbmUgSTQwRV9HTEdFTl9HUElPX1NFVCAweDAwMDg4MTg0IC8qIFJlc2V0OiBQT1IgKi8KICNkZWZpbmUgSTQwRV9HTEdFTl9HUElPX1NFVF9HUElPX0lORFhfU0hJRlQgMAogI2RlZmluZSBJNDBFX0dMR0VOX0dQSU9fU0VUX0dQSU9fSU5EWF9NQVNLIEk0MEVfTUFTSygweDFGLCBJNDBFX0dMR0VOX0dQSU9fU0VUX0dQSU9fSU5EWF9TSElGVCkKQEAgLTQ4NCw3ICs0OTAsOSBAQAogI2RlZmluZSBJNDBFX0dMR0VOX01ESU9fQ1RSTF9DT05UTURDX1NISUZUIDE3CiAjZGVmaW5lIEk0MEVfR0xHRU5fTURJT19DVFJMX0NPTlRNRENfTUFTSyBJNDBFX01BU0soMHgxLCBJNDBFX0dMR0VOX01ESU9fQ1RSTF9DT05UTURDX1NISUZUKQogI2RlZmluZSBJNDBFX0dMR0VOX01ESU9fQ1RSTF9MRUdBQ1lfUlNWRDFfU0hJRlQgMTgKLSNkZWZpbmUgSTQwRV9HTEdFTl9NRElPX0NUUkxfTEVHQUNZX1JTVkQxX01BU0sgSTQwRV9NQVNLKDB4M0ZGRiwgSTQwRV9HTEdFTl9NRElPX0NUUkxfTEVHQUNZX1JTVkQxX1NISUZUKQorI2RlZmluZSBJNDBFX0dMR0VOX01ESU9fQ1RSTF9MRUdBQ1lfUlNWRDFfTUFTSyBJNDBFX01BU0soMHg3RkYsIEk0MEVfR0xHRU5fTURJT19DVFJMX0xFR0FDWV9SU1ZEMV9TSElGVCkKKyNkZWZpbmUgSTQwRV9HTEdFTl9NRElPX0NUUkxfTEVHQUNZX1JTVkQwX1NISUZUIDI5CisjZGVmaW5lIEk0MEVfR0xHRU5fTURJT19DVFJMX0xFR0FDWV9SU1ZEMF9NQVNLIEk0MEVfTUFTSygweDcsIEk0MEVfR0xHRU5fTURJT19DVFJMX0xFR0FDWV9SU1ZEMF9TSElGVCkKICNkZWZpbmUgSTQwRV9HTEdFTl9NRElPX0kyQ19TRUwoX2kpICgweDAwMDg4MUMwICsgKChfaSkgKiA0KSkgLyogX2k9MC4uLjMgKi8gLyogUmVzZXQ6IFBPUiAqLwogI2RlZmluZSBJNDBFX0dMR0VOX01ESU9fSTJDX1NFTF9NQVhfSU5ERVggMwogI2RlZmluZSBJNDBFX0dMR0VOX01ESU9fSTJDX1NFTF9NRElPX0kyQ19TRUxfU0hJRlQgMApAQCAtNTQ4LDkgKzU1Niw2IEBACiAjZGVmaW5lIEk0MEVfR0xHRU5fUlNUQ1RMX0dSU1RERUxfTUFTSyBJNDBFX01BU0soMHgzRiwgSTQwRV9HTEdFTl9SU1RDVExfR1JTVERFTF9TSElGVCkKICNkZWZpbmUgSTQwRV9HTEdFTl9SU1RDVExfRUNDX1JTVF9FTkFfU0hJRlQgOAogI2RlZmluZSBJNDBFX0dMR0VOX1JTVENUTF9FQ0NfUlNUX0VOQV9NQVNLIEk0MEVfTUFTSygweDEsIEk0MEVfR0xHRU5fUlNUQ1RMX0VDQ19SU1RfRU5BX1NISUZUKQotI2RlZmluZSBJNDBFX0dMR0VOX1JTVEVOQV9FTVAgMHgwMDBCODE4QyAvKiBSZXNldDogUE9SICovCi0jZGVmaW5lIEk0MEVfR0xHRU5fUlNURU5BX0VNUF9FTVBfUlNUX0VOQV9TSElGVCAwCi0jZGVmaW5lIEk0MEVfR0xHRU5fUlNURU5BX0VNUF9FTVBfUlNUX0VOQV9NQVNLIEk0MEVfTUFTSygweDEsIEk0MEVfR0xHRU5fUlNURU5BX0VNUF9FTVBfUlNUX0VOQV9TSElGVCkKICNkZWZpbmUgSTQwRV9HTEdFTl9SVFJJRyAweDAwMEI4MTkwIC8qIFJlc2V0OiBDT1JFUiAqLwogI2RlZmluZSBJNDBFX0dMR0VOX1JUUklHX0NPUkVSX1NISUZUIDAKICNkZWZpbmUgSTQwRV9HTEdFTl9SVFJJR19DT1JFUl9NQVNLIEk0MEVfTUFTSygweDEsIEk0MEVfR0xHRU5fUlRSSUdfQ09SRVJfU0hJRlQpCkBAIC0xMDY2LDcgKzEwNzEsNyBAQAogI2RlZmluZSBJNDBFX1BGSU5UX1JBVEVOX0lOVEVSVkFMX01BU0sgSTQwRV9NQVNLKDB4M0YsIEk0MEVfUEZJTlRfUkFURU5fSU5URVJWQUxfU0hJRlQpCiAjZGVmaW5lIEk0MEVfUEZJTlRfUkFURU5fSU5UUkxfRU5BX1NISUZUIDYKICNkZWZpbmUgSTQwRV9QRklOVF9SQVRFTl9JTlRSTF9FTkFfTUFTSyBJNDBFX01BU0soMHgxLCBJNDBFX1BGSU5UX1JBVEVOX0lOVFJMX0VOQV9TSElGVCkKLSNkZWZpbmUgSTQwRV9QRklOVF9TVEFUX0NUTDAgMHgwMDAzODQwMCAvKiBSZXNldDogUEZSICovCisjZGVmaW5lIEk0MEVfUEZJTlRfU1RBVF9DVEwwIDB4MDAwMzg0MDAgLyogUmVzZXQ6IENPUkVSICovCiAjZGVmaW5lIEk0MEVfUEZJTlRfU1RBVF9DVEwwX09USEVSX0lUUl9JTkRYX1NISUZUIDIKICNkZWZpbmUgSTQwRV9QRklOVF9TVEFUX0NUTDBfT1RIRVJfSVRSX0lORFhfTUFTSyBJNDBFX01BU0soMHgzLCBJNDBFX1BGSU5UX1NUQVRfQ1RMMF9PVEhFUl9JVFJfSU5EWF9TSElGVCkKICNkZWZpbmUgSTQwRV9RSU5UX1JRQ1RMKF9RKSAoMHgwMDAzQTAwMCArICgoX1EpICogNCkpIC8qIF9pPTAuLi4xNTM1ICovIC8qIFJlc2V0OiBDT1JFUiAqLwpAQCAtMTE3MSw3ICsxMTc2LDcgQEAKICNkZWZpbmUgSTQwRV9WRklOVF9JVFJOX01BWF9JTkRFWCAyCiAjZGVmaW5lIEk0MEVfVkZJTlRfSVRSTl9JTlRFUlZBTF9TSElGVCAwCiAjZGVmaW5lIEk0MEVfVkZJTlRfSVRSTl9JTlRFUlZBTF9NQVNLIEk0MEVfTUFTSygweEZGRiwgSTQwRV9WRklOVF9JVFJOX0lOVEVSVkFMX1NISUZUKQotI2RlZmluZSBJNDBFX1ZGSU5UX1NUQVRfQ1RMMChfVkYpICgweDAwMDJBMDAwICsgKChfVkYpICogNCkpIC8qIF9pPTAuLi4xMjcgKi8gLyogUmVzZXQ6IFZGUiAqLworI2RlZmluZSBJNDBFX1ZGSU5UX1NUQVRfQ1RMMChfVkYpICgweDAwMDJBMDAwICsgKChfVkYpICogNCkpIC8qIF9pPTAuLi4xMjcgKi8gLyogUmVzZXQ6IENPUkVSICovCiAjZGVmaW5lIEk0MEVfVkZJTlRfU1RBVF9DVEwwX01BWF9JTkRFWCAxMjcKICNkZWZpbmUgSTQwRV9WRklOVF9TVEFUX0NUTDBfT1RIRVJfSVRSX0lORFhfU0hJRlQgMgogI2RlZmluZSBJNDBFX1ZGSU5UX1NUQVRfQ1RMMF9PVEhFUl9JVFJfSU5EWF9NQVNLIEk0MEVfTUFTSygweDMsIEk0MEVfVkZJTlRfU1RBVF9DVEwwX09USEVSX0lUUl9JTkRYX1NISUZUKQpAQCAtMTgwMyw5ICsxODA4LDYgQEAKICNkZWZpbmUgSTQwRV9HTFBDSV9HU0NOXzBfM19NQVhfSU5ERVggMwogI2RlZmluZSBJNDBFX0dMUENJX0dTQ05fMF8zX0VWRU5UX0NPVU5URVJfU0hJRlQgMAogI2RlZmluZSBJNDBFX0dMUENJX0dTQ05fMF8zX0VWRU5UX0NPVU5URVJfTUFTSyBJNDBFX01BU0soMHhGRkZGRkZGRiwgSTQwRV9HTFBDSV9HU0NOXzBfM19FVkVOVF9DT1VOVEVSX1NISUZUKQotI2RlZmluZSBJNDBFX0dMUENJX0xBVENUIDB4MDAwOUM0QjQgLyogUmVzZXQ6IFBDSVIgKi8KLSNkZWZpbmUgSTQwRV9HTFBDSV9MQVRDVF9QQ0lfQ09VTlRfTEFUX0NUX1NISUZUIDAKLSNkZWZpbmUgSTQwRV9HTFBDSV9MQVRDVF9QQ0lfQ09VTlRfTEFUX0NUX01BU0sgSTQwRV9NQVNLKDB4RkZGRkZGRkYsIEk0MEVfR0xQQ0lfTEFUQ1RfUENJX0NPVU5UX0xBVF9DVF9TSElGVCkKICNkZWZpbmUgSTQwRV9HTFBDSV9MQkFSQ1RSTCAweDAwMEJFNDg0IC8qIFJlc2V0OiBQT1IgKi8KICNkZWZpbmUgSTQwRV9HTFBDSV9MQkFSQ1RSTF9QUkVGQkFSX1NISUZUIDAKICNkZWZpbmUgSTQwRV9HTFBDSV9MQkFSQ1RSTF9QUkVGQkFSX01BU0sgSTQwRV9NQVNLKDB4MSwgSTQwRV9HTFBDSV9MQkFSQ1RSTF9QUkVGQkFSX1NISUZUKQpAQCAtMTkwMiw2ICsxOTA0LDExIEBACiAjZGVmaW5lIEk0MEVfR0xQQ0lfVkZTVVBfVkZfUFJFRkVUQ0hfTUFTSyBJNDBFX01BU0soMHgxLCBJNDBFX0dMUENJX1ZGU1VQX1ZGX1BSRUZFVENIX1NISUZUKQogI2RlZmluZSBJNDBFX0dMUENJX1ZGU1VQX1ZSX0JBUl9UWVBFX1NISUZUIDEKICNkZWZpbmUgSTQwRV9HTFBDSV9WRlNVUF9WUl9CQVJfVFlQRV9NQVNLIEk0MEVfTUFTSygweDEsIEk0MEVfR0xQQ0lfVkZTVVBfVlJfQkFSX1RZUEVfU0hJRlQpCisjZGVmaW5lIEk0MEVfR0xUUEhfQ1RSTCAweDAwMEJFNDgwIC8qIFJlc2V0OiBQQ0lSICovCisjZGVmaW5lIEk0MEVfR0xUUEhfQ1RSTF9ERVNDX1BIX1NISUZUIDkKKyNkZWZpbmUgSTQwRV9HTFRQSF9DVFJMX0RFU0NfUEhfTUFTSyBJNDBFX01BU0soMHgzLCBJNDBFX0dMVFBIX0NUUkxfREVTQ19QSF9TSElGVCkKKyNkZWZpbmUgSTQwRV9HTFRQSF9DVFJMX0RBVEFfUEhfU0hJRlQgMTEKKyNkZWZpbmUgSTQwRV9HTFRQSF9DVFJMX0RBVEFfUEhfTUFTSyBJNDBFX01BU0soMHgzLCBJNDBFX0dMVFBIX0NUUkxfREFUQV9QSF9TSElGVCkKICNkZWZpbmUgSTQwRV9QRl9GVU5DX1JJRCAweDAwMDlDMDAwIC8qIFJlc2V0OiBQQ0lSICovCiAjZGVmaW5lIEk0MEVfUEZfRlVOQ19SSURfRlVOQ1RJT05fTlVNQkVSX1NISUZUIDAKICNkZWZpbmUgSTQwRV9QRl9GVU5DX1JJRF9GVU5DVElPTl9OVU1CRVJfTUFTSyBJNDBFX01BU0soMHg3LCBJNDBFX1BGX0ZVTkNfUklEX0ZVTkNUSU9OX05VTUJFUl9TSElGVCkKQEAgLTIzNzQsMjAgKzIzODEsMjAgQEAKICNkZWZpbmUgSTQwRV9HTF9SWEVSUjJfTF9GQ09FRElYQUNfTUFTSyBJNDBFX01BU0soMHhGRkZGRkZGRiwgSTQwRV9HTF9SWEVSUjJfTF9GQ09FRElYQUNfU0hJRlQpCiAjZGVmaW5lIEk0MEVfR0xQUlRfQlBSQ0goX2kpICgweDAwMzAwNUU0ICsgKChfaSkgKiA4KSkgLyogX2k9MC4uLjMgKi8gLyogUmVzZXQ6IENPUkVSICovCiAjZGVmaW5lIEk0MEVfR0xQUlRfQlBSQ0hfTUFYX0lOREVYIDMKLSNkZWZpbmUgSTQwRV9HTFBSVF9CUFJDSF9VUFJDSF9TSElGVCAwCi0jZGVmaW5lIEk0MEVfR0xQUlRfQlBSQ0hfVVBSQ0hfTUFTSyBJNDBFX01BU0soMHhGRkZGLCBJNDBFX0dMUFJUX0JQUkNIX1VQUkNIX1NISUZUKQorI2RlZmluZSBJNDBFX0dMUFJUX0JQUkNIX0JQUkNIX1NISUZUIDAKKyNkZWZpbmUgSTQwRV9HTFBSVF9CUFJDSF9CUFJDSF9NQVNLIEk0MEVfTUFTSygweEZGRkYsIEk0MEVfR0xQUlRfQlBSQ0hfQlBSQ0hfU0hJRlQpCiAjZGVmaW5lIEk0MEVfR0xQUlRfQlBSQ0woX2kpICgweDAwMzAwNUUwICsgKChfaSkgKiA4KSkgLyogX2k9MC4uLjMgKi8gLyogUmVzZXQ6IENPUkVSICovCiAjZGVmaW5lIEk0MEVfR0xQUlRfQlBSQ0xfTUFYX0lOREVYIDMKLSNkZWZpbmUgSTQwRV9HTFBSVF9CUFJDTF9VUFJDSF9TSElGVCAwCi0jZGVmaW5lIEk0MEVfR0xQUlRfQlBSQ0xfVVBSQ0hfTUFTSyBJNDBFX01BU0soMHhGRkZGRkZGRiwgSTQwRV9HTFBSVF9CUFJDTF9VUFJDSF9TSElGVCkKKyNkZWZpbmUgSTQwRV9HTFBSVF9CUFJDTF9CUFJDTF9TSElGVCAwCisjZGVmaW5lIEk0MEVfR0xQUlRfQlBSQ0xfQlBSQ0xfTUFTSyBJNDBFX01BU0soMHhGRkZGRkZGRiwgSTQwRV9HTFBSVF9CUFJDTF9CUFJDTF9TSElGVCkKICNkZWZpbmUgSTQwRV9HTFBSVF9CUFRDSChfaSkgKDB4MDAzMDBBMDQgKyAoKF9pKSAqIDgpKSAvKiBfaT0wLi4uMyAqLyAvKiBSZXNldDogQ09SRVIgKi8KICNkZWZpbmUgSTQwRV9HTFBSVF9CUFRDSF9NQVhfSU5ERVggMwotI2RlZmluZSBJNDBFX0dMUFJUX0JQVENIX1VQUkNIX1NISUZUIDAKLSNkZWZpbmUgSTQwRV9HTFBSVF9CUFRDSF9VUFJDSF9NQVNLIEk0MEVfTUFTSygweEZGRkYsIEk0MEVfR0xQUlRfQlBUQ0hfVVBSQ0hfU0hJRlQpCisjZGVmaW5lIEk0MEVfR0xQUlRfQlBUQ0hfQlBUQ0hfU0hJRlQgMAorI2RlZmluZSBJNDBFX0dMUFJUX0JQVENIX0JQVENIX01BU0sgSTQwRV9NQVNLKDB4RkZGRiwgSTQwRV9HTFBSVF9CUFRDSF9CUFRDSF9TSElGVCkKICNkZWZpbmUgSTQwRV9HTFBSVF9CUFRDTChfaSkgKDB4MDAzMDBBMDAgKyAoKF9pKSAqIDgpKSAvKiBfaT0wLi4uMyAqLyAvKiBSZXNldDogQ09SRVIgKi8KICNkZWZpbmUgSTQwRV9HTFBSVF9CUFRDTF9NQVhfSU5ERVggMwotI2RlZmluZSBJNDBFX0dMUFJUX0JQVENMX1VQUkNIX1NISUZUIDAKLSNkZWZpbmUgSTQwRV9HTFBSVF9CUFRDTF9VUFJDSF9NQVNLIEk0MEVfTUFTSygweEZGRkZGRkZGLCBJNDBFX0dMUFJUX0JQVENMX1VQUkNIX1NISUZUKQorI2RlZmluZSBJNDBFX0dMUFJUX0JQVENMX0JQVENMX1NISUZUIDAKKyNkZWZpbmUgSTQwRV9HTFBSVF9CUFRDTF9CUFRDTF9NQVNLIEk0MEVfTUFTSygweEZGRkZGRkZGLCBJNDBFX0dMUFJUX0JQVENMX0JQVENMX1NISUZUKQogI2RlZmluZSBJNDBFX0dMUFJUX0NSQ0VSUlMoX2kpICgweDAwMzAwMDgwICsgKChfaSkgKiA4KSkgLyogX2k9MC4uLjMgKi8gLyogUmVzZXQ6IENPUkVSICovCiAjZGVmaW5lIEk0MEVfR0xQUlRfQ1JDRVJSU19NQVhfSU5ERVggMwogI2RlZmluZSBJNDBFX0dMUFJUX0NSQ0VSUlNfQ1JDRVJSU19TSElGVCAwCkBAIC0yNjIwLDEwICsyNjI3LDYgQEAKICNkZWZpbmUgSTQwRV9HTFBSVF9URE9MRF9NQVhfSU5ERVggMwogI2RlZmluZSBJNDBFX0dMUFJUX1RET0xEX0dMUFJUX1RET0xEX1NISUZUIDAKICNkZWZpbmUgSTQwRV9HTFBSVF9URE9MRF9HTFBSVF9URE9MRF9NQVNLIEk0MEVfTUFTSygweEZGRkZGRkZGLCBJNDBFX0dMUFJUX1RET0xEX0dMUFJUX1RET0xEX1NISUZUKQotI2RlZmluZSBJNDBFX0dMUFJUX1REUEMoX2kpICgweDAwMzc1NDAwICsgKChfaSkgKiA4KSkgLyogX2k9MC4uLjMgKi8gLyogUmVzZXQ6IENPUkVSICovCi0jZGVmaW5lIEk0MEVfR0xQUlRfVERQQ19NQVhfSU5ERVggMwotI2RlZmluZSBJNDBFX0dMUFJUX1REUENfVERQQ19TSElGVCAwCi0jZGVmaW5lIEk0MEVfR0xQUlRfVERQQ19URFBDX01BU0sgSTQwRV9NQVNLKDB4RkZGRkZGRkYsIEk0MEVfR0xQUlRfVERQQ19URFBDX1NISUZUKQogI2RlZmluZSBJNDBFX0dMUFJUX1VQUkNIKF9pKSAoMHgwMDMwMDVBNCArICgoX2kpICogOCkpIC8qIF9pPTAuLi4zICovIC8qIFJlc2V0OiBDT1JFUiAqLwogI2RlZmluZSBJNDBFX0dMUFJUX1VQUkNIX01BWF9JTkRFWCAzCiAjZGVmaW5lIEk0MEVfR0xQUlRfVVBSQ0hfVVBSQ0hfU0hJRlQgMApAQCAtMjk5MCw5ICsyOTkzLDYgQEAKICNkZWZpbmUgSTQwRV9QUlRUU1lOX1RYVElNRV9MIDB4MDAxRTQxQzAgLyogUmVzZXQ6IEdMT0JSICovCiAjZGVmaW5lIEk0MEVfUFJUVFNZTl9UWFRJTUVfTF9UWFRJRU1fTF9TSElGVCAwCiAjZGVmaW5lIEk0MEVfUFJUVFNZTl9UWFRJTUVfTF9UWFRJRU1fTF9NQVNLIEk0MEVfTUFTSygweEZGRkZGRkZGLCBJNDBFX1BSVFRTWU5fVFhUSU1FX0xfVFhUSUVNX0xfU0hJRlQpCi0jZGVmaW5lIEk0MEVfR0xTQ0RfUVVBTlRBIDB4MDAwQjIwODAgLyogUmVzZXQ6IENPUkVSICovCi0jZGVmaW5lIEk0MEVfR0xTQ0RfUVVBTlRBX1RTQ0RRVUFOVEFfU0hJRlQgMAotI2RlZmluZSBJNDBFX0dMU0NEX1FVQU5UQV9UU0NEUVVBTlRBX01BU0sgSTQwRV9NQVNLKDB4NywgSTQwRV9HTFNDRF9RVUFOVEFfVFNDRFFVQU5UQV9TSElGVCkKICNkZWZpbmUgSTQwRV9HTF9NREVUX1JYIDB4MDAxMkE1MTAgLyogUmVzZXQ6IENPUkVSICovCiAjZGVmaW5lIEk0MEVfR0xfTURFVF9SWF9GVU5DVElPTl9TSElGVCAwCiAjZGVmaW5lIEk0MEVfR0xfTURFVF9SWF9GVU5DVElPTl9NQVNLIEk0MEVfTUFTSygweEZGLCBJNDBFX0dMX01ERVRfUlhfRlVOQ1RJT05fU0hJRlQpCkBAIC0zMjU4LDcgKzMyNTgsNyBAQAogI2RlZmluZSBJNDBFX1ZGSU5UX0lUUk4xX01BWF9JTkRFWCAyCiAjZGVmaW5lIEk0MEVfVkZJTlRfSVRSTjFfSU5URVJWQUxfU0hJRlQgMAogI2RlZmluZSBJNDBFX1ZGSU5UX0lUUk4xX0lOVEVSVkFMX01BU0sgSTQwRV9NQVNLKDB4RkZGLCBJNDBFX1ZGSU5UX0lUUk4xX0lOVEVSVkFMX1NISUZUKQotI2RlZmluZSBJNDBFX1ZGSU5UX1NUQVRfQ1RMMDEgMHgwMDAwNTQwMCAvKiBSZXNldDogVkZSICovCisjZGVmaW5lIEk0MEVfVkZJTlRfU1RBVF9DVEwwMSAweDAwMDA1NDAwIC8qIFJlc2V0OiBDT1JFUiAqLwogI2RlZmluZSBJNDBFX1ZGSU5UX1NUQVRfQ1RMMDFfT1RIRVJfSVRSX0lORFhfU0hJRlQgMgogI2RlZmluZSBJNDBFX1ZGSU5UX1NUQVRfQ1RMMDFfT1RIRVJfSVRSX0lORFhfTUFTSyBJNDBFX01BU0soMHgzLCBJNDBFX1ZGSU5UX1NUQVRfQ1RMMDFfT1RIRVJfSVRSX0lORFhfU0hJRlQpCiAjZGVmaW5lIEk0MEVfUVJYX1RBSUwxKF9RKSAoMHgwMDAwMjAwMCArICgoX1EpICogNCkpIC8qIF9pPTAuLi4xNSAqLyAvKiBSZXNldDogQ09SRVIgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eHJ4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHhyeC5jCmluZGV4IGJiZjFiMTIuLjRiZDNhODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R4cnguYwpAQCAtMjUsNiArMjUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bmV0L2J1c3lfcG9sbC5oPgogI2luY2x1ZGUgImk0MGUuaCIKICNpbmNsdWRlICJpNDBlX3Byb3RvdHlwZS5oIgogCkBAIC00NCw3ICs0NSw3IEBACiAgKiBpNDBlX3Byb2dyYW1fZmRpcl9maWx0ZXIgLSBQcm9ncmFtIGEgRmxvdyBEaXJlY3RvciBmaWx0ZXIKICAqIEBmZGlyX2RhdGE6IFBhY2tldCBkYXRhIHRoYXQgd2lsbCBiZSBmaWx0ZXIgcGFyYW1ldGVycwogICogQHJhd19wYWNrZXQ6IHRoZSBwcmUtYWxsb2NhdGVkIHBhY2tldCBidWZmZXIgZm9yIEZEaXIKLSAqIEBwZjogVGhlIHBmIHBvaW50ZXIKKyAqIEBwZjogVGhlIFBGIHBvaW50ZXIKICAqIEBhZGQ6IFRydWUgZm9yIGFkZC91cGRhdGUsIEZhbHNlIGZvciByZW1vdmUKICAqKi8KIGludCBpNDBlX3Byb2dyYW1fZmRpcl9maWx0ZXIoc3RydWN0IGk0MGVfZmRpcl9maWx0ZXIgKmZkaXJfZGF0YSwgdTggKnJhd19wYWNrZXQsCkBAIC0yMjcsNyArMjI4LDcgQEAKIAkJCSAiUENUWVBFOiVkLCBGaWx0ZXIgY29tbWFuZCBzZW5kIGZhaWxlZCBmb3IgZmRfaWQ6JWQgKHJldCA9ICVkKVxuIiwKIAkJCSBmZF9kYXRhLT5wY3R5cGUsIGZkX2RhdGEtPmZkX2lkLCByZXQpOwogCQllcnIgPSB0cnVlOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChJNDBFX0RFQlVHX0ZEICYgcGYtPmh3LmRlYnVnX21hc2spIHsKIAkJaWYgKGFkZCkKIAkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAogCQkJCSAiRmlsdGVyIE9LIGZvciBQQ1RZUEUgJWQgbG9jID0gJWRcbiIsCkBAIC0zMDIsNyArMzAzLDcgQEAKIAkJCSAiUENUWVBFOiVkLCBGaWx0ZXIgY29tbWFuZCBzZW5kIGZhaWxlZCBmb3IgZmRfaWQ6JWQgKHJldCA9ICVkKVxuIiwKIAkJCSBmZF9kYXRhLT5wY3R5cGUsIGZkX2RhdGEtPmZkX2lkLCByZXQpOwogCQllcnIgPSB0cnVlOwotCX0gZWxzZSB7CisJfSBlbHNlIGlmIChJNDBFX0RFQlVHX0ZEICYgcGYtPmh3LmRlYnVnX21hc2spIHsKIAkJaWYgKGFkZCkKIAkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LCAiRmlsdGVyIE9LIGZvciBQQ1RZUEUgJWQgbG9jID0gJWQpXG4iLAogCQkJCSBmZF9kYXRhLT5wY3R5cGUsIGZkX2RhdGEtPmZkX2lkKTsKQEAgLTM3NSw3ICszNzYsNyBAQAogCQkJCSAiUENUWVBFOiVkLCBGaWx0ZXIgY29tbWFuZCBzZW5kIGZhaWxlZCBmb3IgZmRfaWQ6JWQgKHJldCA9ICVkKVxuIiwKIAkJCQkgZmRfZGF0YS0+cGN0eXBlLCBmZF9kYXRhLT5mZF9pZCwgcmV0KTsKIAkJCWVyciA9IHRydWU7Ci0JCX0gZWxzZSB7CisJCX0gZWxzZSBpZiAoSTQwRV9ERUJVR19GRCAmIHBmLT5ody5kZWJ1Z19tYXNrKSB7CiAJCQlpZiAoYWRkKQogCQkJCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAogCQkJCQkgIkZpbHRlciBPSyBmb3IgUENUWVBFICVkIGxvYyA9ICVkXG4iLApAQCAtNDcwLDEyICs0NzEsMjcgQEAKIAkJCWRldl93YXJuKCZwZGV2LT5kZXYsICJudHVwbGUgZmlsdGVyIGxvYyA9ICVkLCBjb3VsZCBub3QgYmUgYWRkZWRcbiIsCiAJCQkJIHJ4X2Rlc2MtPndiLnF3b3JkMC5oaV9kd29yZC5mZF9pZCk7CiAKKwkJLyogQ2hlY2sgaWYgdGhlIHByb2dyYW1taW5nIGVycm9yIGlzIGZvciBBVFIuCisJCSAqIElmIHNvLCBhdXRvIGRpc2FibGUgQVRSIGFuZCBzZXQgYSBzdGF0ZSBmb3IKKwkJICogZmx1c2ggaW4gcHJvZ3Jlc3MuIE5leHQgdGltZSB3ZSBjb21lIGhlcmUgaWYgZmx1c2ggaXMgaW4KKwkJICogcHJvZ3Jlc3MgZG8gbm90aGluZywgb25jZSBmbHVzaCBpcyBjb21wbGV0ZSB0aGUgc3RhdGUgd2lsbAorCQkgKiBiZSBjbGVhcmVkLgorCQkgKi8KKwkJaWYgKHRlc3RfYml0KF9fSTQwRV9GRF9GTFVTSF9SRVFVRVNURUQsICZwZi0+c3RhdGUpKQorCQkJcmV0dXJuOworCiAJCXBmLT5mZF9hZGRfZXJyKys7CiAJCS8qIHN0b3JlIHRoZSBjdXJyZW50IGF0ciBmaWx0ZXIgY291bnQgKi8KIAkJcGYtPmZkX2F0cl9jbnQgPSBpNDBlX2dldF9jdXJyZW50X2F0cl9jbnQocGYpOwogCisJCWlmICgocnhfZGVzYy0+d2IucXdvcmQwLmhpX2R3b3JkLmZkX2lkID09IDApICYmCisJCSAgICAocGYtPmF1dG9fZGlzYWJsZV9mbGFncyAmIEk0MEVfRkxBR19GRF9TQl9FTkFCTEVEKSkgeworCQkJcGYtPmF1dG9fZGlzYWJsZV9mbGFncyB8PSBJNDBFX0ZMQUdfRkRfQVRSX0VOQUJMRUQ7CisJCQlzZXRfYml0KF9fSTQwRV9GRF9GTFVTSF9SRVFVRVNURUQsICZwZi0+c3RhdGUpOworCQl9CisKIAkJLyogZmlsdGVyIHByb2dyYW1taW5nIGZhaWxlZCBtb3N0IGxpa2VseSBkdWUgdG8gdGFibGUgZnVsbCAqLwotCQlmY250X3Byb2cgPSBpNDBlX2dldF9jdXJfZ3VhcmFudGVlZF9mZF9jb3VudChwZik7CisJCWZjbnRfcHJvZyA9IGk0MGVfZ2V0X2dsb2JhbF9mZF9jb3VudChwZik7CiAJCWZjbnRfYXZhaWwgPSBwZi0+ZmRpcl9wZl9maWx0ZXJfY291bnQ7CiAJCS8qIElmIEFUUiBpcyBydW5uaW5nIGZjbnRfcHJvZyBjYW4gcXVpY2tseSBjaGFuZ2UsCiAJCSAqIGlmIHdlIGFyZSB2ZXJ5IGNsb3NlIHRvIGZ1bGwsIGl0IG1ha2VzIHNlbnNlIHRvIGRpc2FibGUKQEAgLTc1NCw2ICs3NzAsOCBAQAogCQkJdHhfZGVzYyA9IEk0MEVfVFhfREVTQyh0eF9yaW5nLCAwKTsKIAkJfQogCisJCXByZWZldGNoKHR4X2Rlc2MpOworCiAJCS8qIHVwZGF0ZSBidWRnZXQgYWNjb3VudGluZyAqLwogCQlidWRnZXQtLTsKIAl9IHdoaWxlIChsaWtlbHkoYnVkZ2V0KSk7CkBAIC04NDEsNiArODU5LDcgQEAKIHN0YXRpYyB2b2lkIGk0MGVfZm9yY2Vfd2Ioc3RydWN0IGk0MGVfdnNpICp2c2ksIHN0cnVjdCBpNDBlX3FfdmVjdG9yICpxX3ZlY3RvcikKIHsKIAl1MzIgdmFsID0gSTQwRV9QRklOVF9EWU5fQ1RMTl9JTlRFTkFfTUFTSyB8CisJCSAgSTQwRV9QRklOVF9EWU5fQ1RMTl9JVFJfSU5EWF9NQVNLIHwgLyogc2V0IG5vaXRyICovCiAJCSAgSTQwRV9QRklOVF9EWU5fQ1RMTl9TV0lOVF9UUklHX01BU0sgfAogCQkgIEk0MEVfUEZJTlRfRFlOX0NUTE5fU1dfSVRSX0lORFhfRU5BX01BU0s7CiAJCSAgLyogYWxsb3cgMDAgdG8gYmUgd3JpdHRlbiB0byB0aGUgaW5kZXggKi8KQEAgLTEwMzEsNiArMTA1MCwyMiBAQAogCWlmICghcnhfcmluZy0+cnhfYmkpCiAJCXJldHVybjsKIAorCWlmIChyaW5nX2lzX3BzX2VuYWJsZWQocnhfcmluZykpIHsKKwkJaW50IGJ1ZnN6ID0gQUxJR04ocnhfcmluZy0+cnhfaGRyX2xlbiwgMjU2KSAqIHJ4X3JpbmctPmNvdW50OworCisJCXJ4X2JpID0gJnJ4X3JpbmctPnJ4X2JpWzBdOworCQlpZiAocnhfYmktPmhkcl9idWYpIHsKKwkJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwKKwkJCQkJICBidWZzeiwKKwkJCQkJICByeF9iaS0+aGRyX2J1ZiwKKwkJCQkJICByeF9iaS0+ZG1hKTsKKwkJCWZvciAoaSA9IDA7IGkgPCByeF9yaW5nLT5jb3VudDsgaSsrKSB7CisJCQkJcnhfYmkgPSAmcnhfcmluZy0+cnhfYmlbaV07CisJCQkJcnhfYmktPmRtYSA9IDA7CisJCQkJcnhfYmktPmhkcl9idWYgPSBOVUxMOworCQkJfQorCQl9CisJfQogCS8qIEZyZWUgYWxsIHRoZSBSeCByaW5nIHNrX2J1ZmZzICovCiAJZm9yIChpID0gMDsgaSA8IHJ4X3JpbmctPmNvdW50OyBpKyspIHsKIAkJcnhfYmkgPSAmcnhfcmluZy0+cnhfYmlbaV07CkBAIC0xMDg5LDYgKzExMjQsMzcgQEAKIH0KIAogLyoqCisgKiBpNDBlX2FsbG9jX3J4X2hlYWRlcnMgLSBhbGxvY2F0ZSByeCBoZWFkZXIgYnVmZmVycworICogQHJ4X3Jpbmc6IHJpbmcgdG8gYWxsb2MgYnVmZmVycworICoKKyAqIEFsbG9jYXRlIHJ4IGhlYWRlciBidWZmZXJzIGZvciB0aGUgZW50aXJlIHJpbmcuIEFzIHRoZXNlIGFyZSBzdGF0aWMsCisgKiB0aGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gc2V0dGluZyB1cCBhIG5ldyByaW5nLgorICoqLwordm9pZCBpNDBlX2FsbG9jX3J4X2hlYWRlcnMoc3RydWN0IGk0MGVfcmluZyAqcnhfcmluZykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByeF9yaW5nLT5kZXY7CisJc3RydWN0IGk0MGVfcnhfYnVmZmVyICpyeF9iaTsKKwlkbWFfYWRkcl90IGRtYTsKKwl2b2lkICpidWZmZXI7CisJaW50IGJ1Zl9zaXplOworCWludCBpOworCisJaWYgKHJ4X3JpbmctPnJ4X2JpWzBdLmhkcl9idWYpCisJCXJldHVybjsKKwkvKiBNYWtlIHN1cmUgdGhlIGJ1ZmZlcnMgZG9uJ3QgY3Jvc3MgY2FjaGUgbGluZSBib3VuZGFyaWVzLiAqLworCWJ1Zl9zaXplID0gQUxJR04ocnhfcmluZy0+cnhfaGRyX2xlbiwgMjU2KTsKKwlidWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBidWZfc2l6ZSAqIHJ4X3JpbmctPmNvdW50LAorCQkJCSAgICAmZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCByeF9yaW5nLT5jb3VudDsgaSsrKSB7CisJCXJ4X2JpID0gJnJ4X3JpbmctPnJ4X2JpW2ldOworCQlyeF9iaS0+ZG1hID0gZG1hICsgKGkgKiBidWZfc2l6ZSk7CisJCXJ4X2JpLT5oZHJfYnVmID0gYnVmZmVyICsgKGkgKiBidWZfc2l6ZSk7CisJfQorfQorCisvKioKICAqIGk0MGVfc2V0dXBfcnhfZGVzY3JpcHRvcnMgLSBBbGxvY2F0ZSBSeCBkZXNjcmlwdG9ycwogICogQHJ4X3Jpbmc6IFJ4IGRlc2NyaXB0b3IgcmluZyAoZm9yIGEgc3BlY2lmaWMgcXVldWUpIHRvIHNldHVwCiAgKgpAQCAtMTE0OCwxMSArMTIxNCw3NiBAQAogfQogCiAvKioKLSAqIGk0MGVfYWxsb2NfcnhfYnVmZmVycyAtIFJlcGxhY2UgdXNlZCByZWNlaXZlIGJ1ZmZlcnM7IHBhY2tldCBzcGxpdAorICogaTQwZV9hbGxvY19yeF9idWZmZXJzX3BzIC0gUmVwbGFjZSB1c2VkIHJlY2VpdmUgYnVmZmVyczsgcGFja2V0IHNwbGl0CiAgKiBAcnhfcmluZzogcmluZyB0byBwbGFjZSBidWZmZXJzIG9uCiAgKiBAY2xlYW5lZF9jb3VudDogbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gcmVwbGFjZQogICoqLwotdm9pZCBpNDBlX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGk0MGVfcmluZyAqcnhfcmluZywgdTE2IGNsZWFuZWRfY291bnQpCit2b2lkIGk0MGVfYWxsb2NfcnhfYnVmZmVyc19wcyhzdHJ1Y3QgaTQwZV9yaW5nICpyeF9yaW5nLCB1MTYgY2xlYW5lZF9jb3VudCkKK3sKKwl1MTYgaSA9IHJ4X3JpbmctPm5leHRfdG9fdXNlOworCXVuaW9uIGk0MGVfcnhfZGVzYyAqcnhfZGVzYzsKKwlzdHJ1Y3QgaTQwZV9yeF9idWZmZXIgKmJpOworCisJLyogZG8gbm90aGluZyBpZiBubyB2YWxpZCBuZXRkZXYgZGVmaW5lZCAqLworCWlmICghcnhfcmluZy0+bmV0ZGV2IHx8ICFjbGVhbmVkX2NvdW50KQorCQlyZXR1cm47CisKKwl3aGlsZSAoY2xlYW5lZF9jb3VudC0tKSB7CisJCXJ4X2Rlc2MgPSBJNDBFX1JYX0RFU0MocnhfcmluZywgaSk7CisJCWJpID0gJnJ4X3JpbmctPnJ4X2JpW2ldOworCisJCWlmIChiaS0+c2tiKSAvKiBkZXNjIGlzIGluIHVzZSAqLworCQkJZ290byBub19idWZmZXJzOworCQlpZiAoIWJpLT5wYWdlKSB7CisJCQliaS0+cGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyk7CisJCQlpZiAoIWJpLT5wYWdlKSB7CisJCQkJcnhfcmluZy0+cnhfc3RhdHMuYWxsb2NfcGFnZV9mYWlsZWQrKzsKKwkJCQlnb3RvIG5vX2J1ZmZlcnM7CisJCQl9CisJCX0KKworCQlpZiAoIWJpLT5wYWdlX2RtYSkgeworCQkJLyogdXNlIGEgaGFsZiBwYWdlIGlmIHdlJ3JlIHJlLXVzaW5nICovCisJCQliaS0+cGFnZV9vZmZzZXQgXj0gUEFHRV9TSVpFIC8gMjsKKwkJCWJpLT5wYWdlX2RtYSA9IGRtYV9tYXBfcGFnZShyeF9yaW5nLT5kZXYsCisJCQkJCQkgICAgYmktPnBhZ2UsCisJCQkJCQkgICAgYmktPnBhZ2Vfb2Zmc2V0LAorCQkJCQkJICAgIFBBR0VfU0laRSAvIDIsCisJCQkJCQkgICAgRE1BX0ZST01fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihyeF9yaW5nLT5kZXYsCisJCQkJCSAgICAgIGJpLT5wYWdlX2RtYSkpIHsKKwkJCQlyeF9yaW5nLT5yeF9zdGF0cy5hbGxvY19wYWdlX2ZhaWxlZCsrOworCQkJCWJpLT5wYWdlX2RtYSA9IDA7CisJCQkJZ290byBub19idWZmZXJzOworCQkJfQorCQl9CisKKwkJZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UocnhfcmluZy0+ZGV2LAorCQkJCQkJIGJpLT5kbWEsCisJCQkJCQkgMCwKKwkJCQkJCSByeF9yaW5nLT5yeF9oZHJfbGVuLAorCQkJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCS8qIFJlZnJlc2ggdGhlIGRlc2MgZXZlbiBpZiBidWZmZXJfYWRkcnMgZGlkbid0IGNoYW5nZQorCQkgKiBiZWNhdXNlIGVhY2ggd3JpdGUtYmFjayBlcmFzZXMgdGhpcyBpbmZvLgorCQkgKi8KKwkJcnhfZGVzYy0+cmVhZC5wa3RfYWRkciA9IGNwdV90b19sZTY0KGJpLT5wYWdlX2RtYSk7CisJCXJ4X2Rlc2MtPnJlYWQuaGRyX2FkZHIgPSBjcHVfdG9fbGU2NChiaS0+ZG1hKTsKKwkJaSsrOworCQlpZiAoaSA9PSByeF9yaW5nLT5jb3VudCkKKwkJCWkgPSAwOworCX0KKworbm9fYnVmZmVyczoKKwlpZiAocnhfcmluZy0+bmV4dF90b191c2UgIT0gaSkKKwkJaTQwZV9yZWxlYXNlX3J4X2Rlc2MocnhfcmluZywgaSk7Cit9CisKKy8qKgorICogaTQwZV9hbGxvY19yeF9idWZmZXJzXzFidWYgLSBSZXBsYWNlIHVzZWQgcmVjZWl2ZSBidWZmZXJzOyBzaW5nbGUgYnVmZmVyCisgKiBAcnhfcmluZzogcmluZyB0byBwbGFjZSBidWZmZXJzIG9uCisgKiBAY2xlYW5lZF9jb3VudDogbnVtYmVyIG9mIGJ1ZmZlcnMgdG8gcmVwbGFjZQorICoqLwordm9pZCBpNDBlX2FsbG9jX3J4X2J1ZmZlcnNfMWJ1ZihzdHJ1Y3QgaTQwZV9yaW5nICpyeF9yaW5nLCB1MTYgY2xlYW5lZF9jb3VudCkKIHsKIAl1MTYgaSA9IHJ4X3JpbmctPm5leHRfdG9fdXNlOwogCXVuaW9uIGk0MGVfcnhfZGVzYyAqcnhfZGVzYzsKQEAgLTExOTIsNDAgKzEzMjMsOCBAQAogCQkJfQogCQl9CiAKLQkJaWYgKHJpbmdfaXNfcHNfZW5hYmxlZChyeF9yaW5nKSkgewotCQkJaWYgKCFiaS0+cGFnZSkgewotCQkJCWJpLT5wYWdlID0gYWxsb2NfcGFnZShHRlBfQVRPTUlDKTsKLQkJCQlpZiAoIWJpLT5wYWdlKSB7Ci0JCQkJCXJ4X3JpbmctPnJ4X3N0YXRzLmFsbG9jX3BhZ2VfZmFpbGVkKys7Ci0JCQkJCWdvdG8gbm9fYnVmZmVyczsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghYmktPnBhZ2VfZG1hKSB7Ci0JCQkJLyogdXNlIGEgaGFsZiBwYWdlIGlmIHdlJ3JlIHJlLXVzaW5nICovCi0JCQkJYmktPnBhZ2Vfb2Zmc2V0IF49IFBBR0VfU0laRSAvIDI7Ci0JCQkJYmktPnBhZ2VfZG1hID0gZG1hX21hcF9wYWdlKHJ4X3JpbmctPmRldiwKLQkJCQkJCQkgICAgYmktPnBhZ2UsCi0JCQkJCQkJICAgIGJpLT5wYWdlX29mZnNldCwKLQkJCQkJCQkgICAgUEFHRV9TSVpFIC8gMiwKLQkJCQkJCQkgICAgRE1BX0ZST01fREVWSUNFKTsKLQkJCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IocnhfcmluZy0+ZGV2LAotCQkJCQkJICAgICAgYmktPnBhZ2VfZG1hKSkgewotCQkJCQlyeF9yaW5nLT5yeF9zdGF0cy5hbGxvY19wYWdlX2ZhaWxlZCsrOwotCQkJCQliaS0+cGFnZV9kbWEgPSAwOwotCQkJCQlnb3RvIG5vX2J1ZmZlcnM7Ci0JCQkJfQotCQkJfQotCi0JCQkvKiBSZWZyZXNoIHRoZSBkZXNjIGV2ZW4gaWYgYnVmZmVyX2FkZHJzIGRpZG4ndCBjaGFuZ2UKLQkJCSAqIGJlY2F1c2UgZWFjaCB3cml0ZS1iYWNrIGVyYXNlcyB0aGlzIGluZm8uCi0JCQkgKi8KLQkJCXJ4X2Rlc2MtPnJlYWQucGt0X2FkZHIgPSBjcHVfdG9fbGU2NChiaS0+cGFnZV9kbWEpOwotCQkJcnhfZGVzYy0+cmVhZC5oZHJfYWRkciA9IGNwdV90b19sZTY0KGJpLT5kbWEpOwotCQl9IGVsc2UgewotCQkJcnhfZGVzYy0+cmVhZC5wa3RfYWRkciA9IGNwdV90b19sZTY0KGJpLT5kbWEpOwotCQkJcnhfZGVzYy0+cmVhZC5oZHJfYWRkciA9IDA7Ci0JCX0KKwkJcnhfZGVzYy0+cmVhZC5wa3RfYWRkciA9IGNwdV90b19sZTY0KGJpLT5kbWEpOworCQlyeF9kZXNjLT5yZWFkLmhkcl9hZGRyID0gMDsKIAkJaSsrOwogCQlpZiAoaSA9PSByeF9yaW5nLT5jb3VudCkKIAkJCWkgPSAwOwpAQCAtMTI3OSwxMCArMTM3OCwxMCBAQAogCXN0cnVjdCBpcGhkciAqaXBoOwogCV9fc3VtMTYgY3N1bTsKIAotCWlwdjRfdHVubmVsID0gKHJ4X3B0eXBlID4gSTQwRV9SWF9QVFlQRV9HUkVOQVQ0X01BQ19QQVkzKSAmJgotCQkgICAgICAocnhfcHR5cGUgPCBJNDBFX1JYX1BUWVBFX0dSRU5BVDRfTUFDVkxBTl9JUFY2X0lDTVBfUEFZNCk7Ci0JaXB2Nl90dW5uZWwgPSAocnhfcHR5cGUgPiBJNDBFX1JYX1BUWVBFX0dSRU5BVDZfTUFDX1BBWTMpICYmCi0JCSAgICAgIChyeF9wdHlwZSA8IEk0MEVfUlhfUFRZUEVfR1JFTkFUNl9NQUNWTEFOX0lQVjZfSUNNUF9QQVk0KTsKKwlpcHY0X3R1bm5lbCA9IChyeF9wdHlwZSA+PSBJNDBFX1JYX1BUWVBFX0dSRU5BVDRfTUFDX1BBWTMpICYmCisJCSAgICAgKHJ4X3B0eXBlIDw9IEk0MEVfUlhfUFRZUEVfR1JFTkFUNF9NQUNWTEFOX0lQVjZfSUNNUF9QQVk0KTsKKwlpcHY2X3R1bm5lbCA9IChyeF9wdHlwZSA+PSBJNDBFX1JYX1BUWVBFX0dSRU5BVDZfTUFDX1BBWTMpICYmCisJCSAgICAgKHJ4X3B0eXBlIDw9IEk0MEVfUlhfUFRZUEVfR1JFTkFUNl9NQUNWTEFOX0lQVjZfSUNNUF9QQVk0KTsKIAogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIApAQCAtMTQxMCwxMyArMTUwOSwxMyBAQAogfQogCiAvKioKLSAqIGk0MGVfY2xlYW5fcnhfaXJxIC0gUmVjbGFpbSByZXNvdXJjZXMgYWZ0ZXIgcmVjZWl2ZSBjb21wbGV0ZXMKKyAqIGk0MGVfY2xlYW5fcnhfaXJxX3BzIC0gUmVjbGFpbSByZXNvdXJjZXMgYWZ0ZXIgcmVjZWl2ZTsgcGFja2V0IHNwbGl0CiAgKiBAcnhfcmluZzogIHJ4IHJpbmcgdG8gY2xlYW4KICAqIEBidWRnZXQ6ICAgaG93IG1hbnkgY2xlYW5zIHdlJ3JlIGFsbG93ZWQKICAqCiAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUncyBhbnkgYnVkZ2V0IGxlZnQgKGUuZy4gdGhlIGNsZWFuIGlzIGZpbmlzaGVkKQogICoqLwotc3RhdGljIGludCBpNDBlX2NsZWFuX3J4X2lycShzdHJ1Y3QgaTQwZV9yaW5nICpyeF9yaW5nLCBpbnQgYnVkZ2V0KQorc3RhdGljIGludCBpNDBlX2NsZWFuX3J4X2lycV9wcyhzdHJ1Y3QgaTQwZV9yaW5nICpyeF9yaW5nLCBpbnQgYnVkZ2V0KQogewogCXVuc2lnbmVkIGludCB0b3RhbF9yeF9ieXRlcyA9IDAsIHRvdGFsX3J4X3BhY2tldHMgPSAwOwogCXUxNiByeF9wYWNrZXRfbGVuLCByeF9oZWFkZXJfbGVuLCByeF9zcGgsIHJ4X2hibzsKQEAgLTE0MzIsMjUgKzE1MzEsNTQgQEAKIAlpZiAoYnVkZ2V0IDw9IDApCiAJCXJldHVybiAwOwogCi0JcnhfZGVzYyA9IEk0MEVfUlhfREVTQyhyeF9yaW5nLCBpKTsKLQlxd29yZCA9IGxlNjRfdG9fY3B1KHJ4X2Rlc2MtPndiLnF3b3JkMS5zdGF0dXNfZXJyb3JfbGVuKTsKLQlyeF9zdGF0dXMgPSAocXdvcmQgJiBJNDBFX1JYRF9RVzFfU1RBVFVTX01BU0spID4+Ci0JCSAgICBJNDBFX1JYRF9RVzFfU1RBVFVTX1NISUZUOwotCi0Jd2hpbGUgKHJ4X3N0YXR1cyAmICgxIDw8IEk0MEVfUlhfREVTQ19TVEFUVVNfRERfU0hJRlQpKSB7Ci0JCXVuaW9uIGk0MGVfcnhfZGVzYyAqbmV4dF9yeGQ7CisJZG8gewogCQlzdHJ1Y3QgaTQwZV9yeF9idWZmZXIgKnJ4X2JpOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCQl1MTYgdmxhbl90YWc7CisJCS8qIHJldHVybiBzb21lIGJ1ZmZlcnMgdG8gaGFyZHdhcmUsIG9uZSBhdCBhIHRpbWUgaXMgdG9vIHNsb3cgKi8KKwkJaWYgKGNsZWFuZWRfY291bnQgPj0gSTQwRV9SWF9CVUZGRVJfV1JJVEUpIHsKKwkJCWk0MGVfYWxsb2NfcnhfYnVmZmVyc19wcyhyeF9yaW5nLCBjbGVhbmVkX2NvdW50KTsKKwkJCWNsZWFuZWRfY291bnQgPSAwOworCQl9CisKKwkJaSA9IHJ4X3JpbmctPm5leHRfdG9fY2xlYW47CisJCXJ4X2Rlc2MgPSBJNDBFX1JYX0RFU0MocnhfcmluZywgaSk7CisJCXF3b3JkID0gbGU2NF90b19jcHUocnhfZGVzYy0+d2IucXdvcmQxLnN0YXR1c19lcnJvcl9sZW4pOworCQlyeF9zdGF0dXMgPSAocXdvcmQgJiBJNDBFX1JYRF9RVzFfU1RBVFVTX01BU0spID4+CisJCQlJNDBFX1JYRF9RVzFfU1RBVFVTX1NISUZUOworCisJCWlmICghKHJ4X3N0YXR1cyAmICgxIDw8IEk0MEVfUlhfREVTQ19TVEFUVVNfRERfU0hJRlQpKSkKKwkJCWJyZWFrOworCisJCS8qIFRoaXMgbWVtb3J5IGJhcnJpZXIgaXMgbmVlZGVkIHRvIGtlZXAgdXMgZnJvbSByZWFkaW5nCisJCSAqIGFueSBvdGhlciBmaWVsZHMgb3V0IG9mIHRoZSByeF9kZXNjIHVudGlsIHdlIGtub3cgdGhlCisJCSAqIEREIGJpdCBpcyBzZXQuCisJCSAqLworCQlkbWFfcm1iKCk7CiAJCWlmIChpNDBlX3J4X2lzX3Byb2dyYW1taW5nX3N0YXR1cyhxd29yZCkpIHsKIAkJCWk0MGVfY2xlYW5fcHJvZ3JhbW1pbmdfc3RhdHVzKHJ4X3JpbmcsIHJ4X2Rlc2MpOwotCQkJSTQwRV9SWF9ORVhUX0RFU0NfUFJFRkVUQ0gocnhfcmluZywgaSwgbmV4dF9yeGQpOwotCQkJZ290byBuZXh0X2Rlc2M7CisJCQlJNDBFX1JYX0lOQ1JFTUVOVChyeF9yaW5nLCBpKTsKKwkJCWNvbnRpbnVlOwogCQl9CiAJCXJ4X2JpID0gJnJ4X3JpbmctPnJ4X2JpW2ldOwogCQlza2IgPSByeF9iaS0+c2tiOwotCQlwcmVmZXRjaChza2ItPmRhdGEpOworCQlpZiAobGlrZWx5KCFza2IpKSB7CisJCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKHJ4X3JpbmctPm5ldGRldiwKKwkJCQkJCQlyeF9yaW5nLT5yeF9oZHJfbGVuKTsKKwkJCWlmICghc2tiKSB7CisJCQkJcnhfcmluZy0+cnhfc3RhdHMuYWxsb2NfYnVmZl9mYWlsZWQrKzsKKwkJCQlicmVhazsKKwkJCX0KIAorCQkJLyogaW5pdGlhbGl6ZSBxdWV1ZSBtYXBwaW5nICovCisJCQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgcnhfcmluZy0+cXVldWVfaW5kZXgpOworCQkJLyogd2UgYXJlIHJldXNpbmcgc28gc3luYyB0aGlzIGJ1ZmZlciBmb3IgQ1BVIHVzZSAqLworCQkJZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9jcHUocnhfcmluZy0+ZGV2LAorCQkJCQkJICAgICAgcnhfYmktPmRtYSwKKwkJCQkJCSAgICAgIDAsCisJCQkJCQkgICAgICByeF9yaW5nLT5yeF9oZHJfbGVuLAorCQkJCQkJICAgICAgRE1BX0ZST01fREVWSUNFKTsKKwkJfQogCQlyeF9wYWNrZXRfbGVuID0gKHF3b3JkICYgSTQwRV9SWERfUVcxX0xFTkdUSF9QQlVGX01BU0spID4+CiAJCQkJSTQwRV9SWERfUVcxX0xFTkdUSF9QQlVGX1NISUZUOwogCQlyeF9oZWFkZXJfbGVuID0gKHF3b3JkICYgSTQwRV9SWERfUVcxX0xFTkdUSF9IQlVGX01BU0spID4+CkBAIC0xNDY1LDQwICsxNTkzLDMwIEBACiAKIAkJcnhfcHR5cGUgPSAocXdvcmQgJiBJNDBFX1JYRF9RVzFfUFRZUEVfTUFTSykgPj4KIAkJCSAgIEk0MEVfUlhEX1FXMV9QVFlQRV9TSElGVDsKKwkJcHJlZmV0Y2gocnhfYmktPnBhZ2UpOwogCQlyeF9iaS0+c2tiID0gTlVMTDsKLQotCQkvKiBUaGlzIG1lbW9yeSBiYXJyaWVyIGlzIG5lZWRlZCB0byBrZWVwIHVzIGZyb20gcmVhZGluZwotCQkgKiBhbnkgb3RoZXIgZmllbGRzIG91dCBvZiB0aGUgcnhfZGVzYyB1bnRpbCB3ZSBrbm93IHRoZQotCQkgKiBTVEFUVVNfREQgYml0IGlzIHNldAotCQkgKi8KLQkJcm1iKCk7Ci0KLQkJLyogR2V0IHRoZSBoZWFkZXIgYW5kIHBvc3NpYmx5IHRoZSB3aG9sZSBwYWNrZXQKLQkJICogSWYgdGhpcyBpcyBhbiBza2IgZnJvbSBwcmV2aW91cyByZWNlaXZlIGRtYSB3aWxsIGJlIDAKLQkJICovCi0JCWlmIChyeF9iaS0+ZG1hKSB7Ci0JCQl1MTYgbGVuOwotCisJCWNsZWFuZWRfY291bnQrKzsKKwkJaWYgKHJ4X2hibyB8fCByeF9zcGgpIHsKKwkJCWludCBsZW47CiAJCQlpZiAocnhfaGJvKQogCQkJCWxlbiA9IEk0MEVfUlhfSERSX1NJWkU7Ci0JCQllbHNlIGlmIChyeF9zcGgpCi0JCQkJbGVuID0gcnhfaGVhZGVyX2xlbjsKLQkJCWVsc2UgaWYgKHJ4X3BhY2tldF9sZW4pCi0JCQkJbGVuID0gcnhfcGFja2V0X2xlbjsgICAvKiAxYnVmL25vIHNwbGl0IGZvdW5kICovCiAJCQllbHNlCi0JCQkJbGVuID0gcnhfaGVhZGVyX2xlbjsgICAvKiBzcGxpdCBhbHdheXMgbW9kZSAqLworCQkJCWxlbiA9IHJ4X2hlYWRlcl9sZW47CisJCQltZW1jcHkoX19za2JfcHV0KHNrYiwgbGVuKSwgcnhfYmktPmhkcl9idWYsIGxlbik7CisJCX0gZWxzZSBpZiAoc2tiLT5sZW4gPT0gMCkgeworCQkJaW50IGxlbjsKIAotCQkJc2tiX3B1dChza2IsIGxlbik7Ci0JCQlkbWFfdW5tYXBfc2luZ2xlKHJ4X3JpbmctPmRldiwKLQkJCQkJIHJ4X2JpLT5kbWEsCi0JCQkJCSByeF9yaW5nLT5yeF9idWZfbGVuLAotCQkJCQkgRE1BX0ZST01fREVWSUNFKTsKLQkJCXJ4X2JpLT5kbWEgPSAwOworCQkJbGVuID0gKHJ4X3BhY2tldF9sZW4gPiBza2JfaGVhZGxlbihza2IpID8KKwkJCQlza2JfaGVhZGxlbihza2IpIDogcnhfcGFja2V0X2xlbik7CisJCQltZW1jcHkoX19za2JfcHV0KHNrYiwgbGVuKSwKKwkJCSAgICAgICByeF9iaS0+cGFnZSArIHJ4X2JpLT5wYWdlX29mZnNldCwKKwkJCSAgICAgICBsZW4pOworCQkJcnhfYmktPnBhZ2Vfb2Zmc2V0ICs9IGxlbjsKKwkJCXJ4X3BhY2tldF9sZW4gLT0gbGVuOwogCQl9CiAKIAkJLyogR2V0IHRoZSByZXN0IG9mIHRoZSBkYXRhIGlmIHRoaXMgd2FzIGEgaGVhZGVyIHNwbGl0ICovCi0JCWlmIChyaW5nX2lzX3BzX2VuYWJsZWQocnhfcmluZykgJiYgcnhfcGFja2V0X2xlbikgewotCisJCWlmIChyeF9wYWNrZXRfbGVuKSB7CiAJCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzLAogCQkJCQkgICByeF9iaS0+cGFnZSwKIAkJCQkJICAgcnhfYmktPnBhZ2Vfb2Zmc2V0LApAQCAtMTUyMCwyMiArMTYzOCwxNiBAQAogCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOwogCQkJcnhfYmktPnBhZ2VfZG1hID0gMDsKIAkJfQotCQlJNDBFX1JYX05FWFRfREVTQ19QUkVGRVRDSChyeF9yaW5nLCBpLCBuZXh0X3J4ZCk7CisJCUk0MEVfUlhfSU5DUkVNRU5UKHJ4X3JpbmcsIGkpOwogCiAJCWlmICh1bmxpa2VseSgKIAkJICAgICEocnhfc3RhdHVzICYgKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19FT0ZfU0hJRlQpKSkpIHsKIAkJCXN0cnVjdCBpNDBlX3J4X2J1ZmZlciAqbmV4dF9idWZmZXI7CiAKIAkJCW5leHRfYnVmZmVyID0gJnJ4X3JpbmctPnJ4X2JpW2ldOwotCi0JCQlpZiAocmluZ19pc19wc19lbmFibGVkKHJ4X3JpbmcpKSB7Ci0JCQkJcnhfYmktPnNrYiA9IG5leHRfYnVmZmVyLT5za2I7Ci0JCQkJcnhfYmktPmRtYSA9IG5leHRfYnVmZmVyLT5kbWE7Ci0JCQkJbmV4dF9idWZmZXItPnNrYiA9IHNrYjsKLQkJCQluZXh0X2J1ZmZlci0+ZG1hID0gMDsKLQkJCX0KKwkJCW5leHRfYnVmZmVyLT5za2IgPSBza2I7CiAJCQlyeF9yaW5nLT5yeF9zdGF0cy5ub25fZW9wX2Rlc2NzKys7Ci0JCQlnb3RvIG5leHRfZGVzYzsKKwkJCWNvbnRpbnVlOwogCQl9CiAKIAkJLyogRVJSX01BU0sgd2lsbCBvbmx5IGhhdmUgdmFsaWQgYml0cyBpZiBFT1Agc2V0ICovCkBAIC0xNTQ0LDcgKzE2NTYsNyBAQAogCQkJLyogVE9ETzogc2hvdWxkbid0IHdlIGluY3JlbWVudCBhIGNvdW50ZXIgaW5kaWNhdGluZyB0aGUKIAkJCSAqIGRyb3A/CiAJCQkgKi8KLQkJCWdvdG8gbmV4dF9kZXNjOworCQkJY29udGludWU7CiAJCX0KIAogCQlza2Jfc2V0X2hhc2goc2tiLCBpNDBlX3J4X2hhc2gocnhfcmluZywgcnhfZGVzYyksCkBAIC0xNTcwLDMzICsxNjgyLDE3IEBACiAjaWZkZWYgSTQwRV9GQ09FCiAJCWlmICghaTQwZV9mY29lX2hhbmRsZV9vZmZsb2FkKHJ4X3JpbmcsIHJ4X2Rlc2MsIHNrYikpIHsKIAkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCQlnb3RvIG5leHRfZGVzYzsKKwkJCWNvbnRpbnVlOwogCQl9CiAjZW5kaWYKKwkJc2tiX21hcmtfbmFwaV9pZChza2IsICZyeF9yaW5nLT5xX3ZlY3Rvci0+bmFwaSk7CiAJCWk0MGVfcmVjZWl2ZV9za2IocnhfcmluZywgc2tiLCB2bGFuX3RhZyk7CiAKIAkJcnhfcmluZy0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKLQkJYnVkZ2V0LS07Ci1uZXh0X2Rlc2M6CiAJCXJ4X2Rlc2MtPndiLnF3b3JkMS5zdGF0dXNfZXJyb3JfbGVuID0gMDsKLQkJaWYgKCFidWRnZXQpCi0JCQlicmVhazsKIAotCQljbGVhbmVkX2NvdW50Kys7Ci0JCS8qIHJldHVybiBzb21lIGJ1ZmZlcnMgdG8gaGFyZHdhcmUsIG9uZSBhdCBhIHRpbWUgaXMgdG9vIHNsb3cgKi8KLQkJaWYgKGNsZWFuZWRfY291bnQgPj0gSTQwRV9SWF9CVUZGRVJfV1JJVEUpIHsKLQkJCWk0MGVfYWxsb2NfcnhfYnVmZmVycyhyeF9yaW5nLCBjbGVhbmVkX2NvdW50KTsKLQkJCWNsZWFuZWRfY291bnQgPSAwOwotCQl9CisJfSB3aGlsZSAobGlrZWx5KHRvdGFsX3J4X3BhY2tldHMgPCBidWRnZXQpKTsKIAotCQkvKiB1c2UgcHJlZmV0Y2hlZCB2YWx1ZXMgKi8KLQkJcnhfZGVzYyA9IG5leHRfcnhkOwotCQlxd29yZCA9IGxlNjRfdG9fY3B1KHJ4X2Rlc2MtPndiLnF3b3JkMS5zdGF0dXNfZXJyb3JfbGVuKTsKLQkJcnhfc3RhdHVzID0gKHF3b3JkICYgSTQwRV9SWERfUVcxX1NUQVRVU19NQVNLKSA+PgotCQkJICAgIEk0MEVfUlhEX1FXMV9TVEFUVVNfU0hJRlQ7Ci0JfQotCi0JcnhfcmluZy0+bmV4dF90b19jbGVhbiA9IGk7CiAJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfcmluZy0+c3luY3ApOwogCXJ4X3JpbmctPnN0YXRzLnBhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKIAlyeF9yaW5nLT5zdGF0cy5ieXRlcyArPSB0b3RhbF9yeF9ieXRlczsKQEAgLTE2MDQsMTAgKzE3MDAsMTM5IEBACiAJcnhfcmluZy0+cV92ZWN0b3ItPnJ4LnRvdGFsX3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKIAlyeF9yaW5nLT5xX3ZlY3Rvci0+cngudG90YWxfYnl0ZXMgKz0gdG90YWxfcnhfYnl0ZXM7CiAKLQlpZiAoY2xlYW5lZF9jb3VudCkKLQkJaTQwZV9hbGxvY19yeF9idWZmZXJzKHJ4X3JpbmcsIGNsZWFuZWRfY291bnQpOworCXJldHVybiB0b3RhbF9yeF9wYWNrZXRzOworfQogCi0JcmV0dXJuIGJ1ZGdldCA+IDA7CisvKioKKyAqIGk0MGVfY2xlYW5fcnhfaXJxXzFidWYgLSBSZWNsYWltIHJlc291cmNlcyBhZnRlciByZWNlaXZlOyBzaW5nbGUgYnVmZmVyCisgKiBAcnhfcmluZzogIHJ4IHJpbmcgdG8gY2xlYW4KKyAqIEBidWRnZXQ6ICAgaG93IG1hbnkgY2xlYW5zIHdlJ3JlIGFsbG93ZWQKKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBwYWNrZXRzIGNsZWFuZWQKKyAqKi8KK3N0YXRpYyBpbnQgaTQwZV9jbGVhbl9yeF9pcnFfMWJ1ZihzdHJ1Y3QgaTQwZV9yaW5nICpyeF9yaW5nLCBpbnQgYnVkZ2V0KQoreworCXVuc2lnbmVkIGludCB0b3RhbF9yeF9ieXRlcyA9IDAsIHRvdGFsX3J4X3BhY2tldHMgPSAwOworCXUxNiBjbGVhbmVkX2NvdW50ID0gSTQwRV9ERVNDX1VOVVNFRChyeF9yaW5nKTsKKwlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9IHJ4X3JpbmctPnZzaTsKKwl1bmlvbiBpNDBlX3J4X2Rlc2MgKnJ4X2Rlc2M7CisJdTMyIHJ4X2Vycm9yLCByeF9zdGF0dXM7CisJdTE2IHJ4X3BhY2tldF9sZW47CisJdTggcnhfcHR5cGU7CisJdTY0IHF3b3JkOworCXUxNiBpOworCisJZG8geworCQlzdHJ1Y3QgaTQwZV9yeF9idWZmZXIgKnJ4X2JpOworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCQl1MTYgdmxhbl90YWc7CisJCS8qIHJldHVybiBzb21lIGJ1ZmZlcnMgdG8gaGFyZHdhcmUsIG9uZSBhdCBhIHRpbWUgaXMgdG9vIHNsb3cgKi8KKwkJaWYgKGNsZWFuZWRfY291bnQgPj0gSTQwRV9SWF9CVUZGRVJfV1JJVEUpIHsKKwkJCWk0MGVfYWxsb2NfcnhfYnVmZmVyc18xYnVmKHJ4X3JpbmcsIGNsZWFuZWRfY291bnQpOworCQkJY2xlYW5lZF9jb3VudCA9IDA7CisJCX0KKworCQlpID0gcnhfcmluZy0+bmV4dF90b19jbGVhbjsKKwkJcnhfZGVzYyA9IEk0MEVfUlhfREVTQyhyeF9yaW5nLCBpKTsKKwkJcXdvcmQgPSBsZTY0X3RvX2NwdShyeF9kZXNjLT53Yi5xd29yZDEuc3RhdHVzX2Vycm9yX2xlbik7CisJCXJ4X3N0YXR1cyA9IChxd29yZCAmIEk0MEVfUlhEX1FXMV9TVEFUVVNfTUFTSykgPj4KKwkJCUk0MEVfUlhEX1FXMV9TVEFUVVNfU0hJRlQ7CisKKwkJaWYgKCEocnhfc3RhdHVzICYgKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19ERF9TSElGVCkpKQorCQkJYnJlYWs7CisKKwkJLyogVGhpcyBtZW1vcnkgYmFycmllciBpcyBuZWVkZWQgdG8ga2VlcCB1cyBmcm9tIHJlYWRpbmcKKwkJICogYW55IG90aGVyIGZpZWxkcyBvdXQgb2YgdGhlIHJ4X2Rlc2MgdW50aWwgd2Uga25vdyB0aGUKKwkJICogREQgYml0IGlzIHNldC4KKwkJICovCisJCWRtYV9ybWIoKTsKKworCQlpZiAoaTQwZV9yeF9pc19wcm9ncmFtbWluZ19zdGF0dXMocXdvcmQpKSB7CisJCQlpNDBlX2NsZWFuX3Byb2dyYW1taW5nX3N0YXR1cyhyeF9yaW5nLCByeF9kZXNjKTsKKwkJCUk0MEVfUlhfSU5DUkVNRU5UKHJ4X3JpbmcsIGkpOworCQkJY29udGludWU7CisJCX0KKwkJcnhfYmkgPSAmcnhfcmluZy0+cnhfYmlbaV07CisJCXNrYiA9IHJ4X2JpLT5za2I7CisJCXByZWZldGNoKHNrYi0+ZGF0YSk7CisKKwkJcnhfcGFja2V0X2xlbiA9IChxd29yZCAmIEk0MEVfUlhEX1FXMV9MRU5HVEhfUEJVRl9NQVNLKSA+PgorCQkJCUk0MEVfUlhEX1FXMV9MRU5HVEhfUEJVRl9TSElGVDsKKworCQlyeF9lcnJvciA9IChxd29yZCAmIEk0MEVfUlhEX1FXMV9FUlJPUl9NQVNLKSA+PgorCQkJICAgSTQwRV9SWERfUVcxX0VSUk9SX1NISUZUOworCQlyeF9lcnJvciAmPSB+KDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX0hCT19TSElGVCk7CisKKwkJcnhfcHR5cGUgPSAocXdvcmQgJiBJNDBFX1JYRF9RVzFfUFRZUEVfTUFTSykgPj4KKwkJCSAgIEk0MEVfUlhEX1FXMV9QVFlQRV9TSElGVDsKKwkJcnhfYmktPnNrYiA9IE5VTEw7CisJCWNsZWFuZWRfY291bnQrKzsKKworCQkvKiBHZXQgdGhlIGhlYWRlciBhbmQgcG9zc2libHkgdGhlIHdob2xlIHBhY2tldAorCQkgKiBJZiB0aGlzIGlzIGFuIHNrYiBmcm9tIHByZXZpb3VzIHJlY2VpdmUgZG1hIHdpbGwgYmUgMAorCQkgKi8KKwkJc2tiX3B1dChza2IsIHJ4X3BhY2tldF9sZW4pOworCQlkbWFfdW5tYXBfc2luZ2xlKHJ4X3JpbmctPmRldiwgcnhfYmktPmRtYSwgcnhfcmluZy0+cnhfYnVmX2xlbiwKKwkJCQkgRE1BX0ZST01fREVWSUNFKTsKKwkJcnhfYmktPmRtYSA9IDA7CisKKwkJSTQwRV9SWF9JTkNSRU1FTlQocnhfcmluZywgaSk7CisKKwkJaWYgKHVubGlrZWx5KAorCQkgICAgIShyeF9zdGF0dXMgJiAoMSA8PCBJNDBFX1JYX0RFU0NfU1RBVFVTX0VPRl9TSElGVCkpKSkgeworCQkJcnhfcmluZy0+cnhfc3RhdHMubm9uX2VvcF9kZXNjcysrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBFUlJfTUFTSyB3aWxsIG9ubHkgaGF2ZSB2YWxpZCBiaXRzIGlmIEVPUCBzZXQgKi8KKwkJaWYgKHVubGlrZWx5KHJ4X2Vycm9yICYgKDEgPDwgSTQwRV9SWF9ERVNDX0VSUk9SX1JYRV9TSElGVCkpKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJLyogVE9ETzogc2hvdWxkbid0IHdlIGluY3JlbWVudCBhIGNvdW50ZXIgaW5kaWNhdGluZyB0aGUKKwkJCSAqIGRyb3A/CisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc2tiX3NldF9oYXNoKHNrYiwgaTQwZV9yeF9oYXNoKHJ4X3JpbmcsIHJ4X2Rlc2MpLAorCQkJICAgICBpNDBlX3B0eXBlX3RvX2hhc2gocnhfcHR5cGUpKTsKKwkJaWYgKHVubGlrZWx5KHJ4X3N0YXR1cyAmIEk0MEVfUlhEX1FXMV9TVEFUVVNfVFNZTlZBTElEX01BU0spKSB7CisJCQlpNDBlX3B0cF9yeF9od3RzdGFtcCh2c2ktPmJhY2ssIHNrYiwgKHJ4X3N0YXR1cyAmCisJCQkJCSAgIEk0MEVfUlhEX1FXMV9TVEFUVVNfVFNZTklORFhfTUFTSykgPj4KKwkJCQkJICAgSTQwRV9SWERfUVcxX1NUQVRVU19UU1lOSU5EWF9TSElGVCk7CisJCQlyeF9yaW5nLT5sYXN0X3J4X3RpbWVzdGFtcCA9IGppZmZpZXM7CisJCX0KKworCQkvKiBwcm9iYWJseSBhIGxpdHRsZSBza2V3ZWQgZHVlIHRvIHJlbW92aW5nIENSQyAqLworCQl0b3RhbF9yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJdG90YWxfcnhfcGFja2V0cysrOworCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHJ4X3JpbmctPm5ldGRldik7CisKKwkJaTQwZV9yeF9jaGVja3N1bSh2c2ksIHNrYiwgcnhfc3RhdHVzLCByeF9lcnJvciwgcnhfcHR5cGUpOworCisJCXZsYW5fdGFnID0gcnhfc3RhdHVzICYgKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19MMlRBRzFQX1NISUZUKQorCQkJID8gbGUxNl90b19jcHUocnhfZGVzYy0+d2IucXdvcmQwLmxvX2R3b3JkLmwydGFnMSkKKwkJCSA6IDA7CisjaWZkZWYgSTQwRV9GQ09FCisJCWlmICghaTQwZV9mY29lX2hhbmRsZV9vZmZsb2FkKHJ4X3JpbmcsIHJ4X2Rlc2MsIHNrYikpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisJCWk0MGVfcmVjZWl2ZV9za2IocnhfcmluZywgc2tiLCB2bGFuX3RhZyk7CisKKwkJcnhfcmluZy0+bmV0ZGV2LT5sYXN0X3J4ID0gamlmZmllczsKKwkJcnhfZGVzYy0+d2IucXdvcmQxLnN0YXR1c19lcnJvcl9sZW4gPSAwOworCX0gd2hpbGUgKGxpa2VseSh0b3RhbF9yeF9wYWNrZXRzIDwgYnVkZ2V0KSk7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CisJcnhfcmluZy0+c3RhdHMucGFja2V0cyArPSB0b3RhbF9yeF9wYWNrZXRzOworCXJ4X3JpbmctPnN0YXRzLmJ5dGVzICs9IHRvdGFsX3J4X2J5dGVzOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisJcnhfcmluZy0+cV92ZWN0b3ItPnJ4LnRvdGFsX3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKKwlyeF9yaW5nLT5xX3ZlY3Rvci0+cngudG90YWxfYnl0ZXMgKz0gdG90YWxfcnhfYnl0ZXM7CisKKwlyZXR1cm4gdG90YWxfcnhfcGFja2V0czsKIH0KIAogLyoqCkBAIC0xNjI4LDYgKzE4NTMsNyBAQAogCWJvb2wgY2xlYW5fY29tcGxldGUgPSB0cnVlOwogCWJvb2wgYXJtX3diID0gZmFsc2U7CiAJaW50IGJ1ZGdldF9wZXJfcmluZzsKKwlpbnQgY2xlYW5lZDsKIAogCWlmICh0ZXN0X2JpdChfX0k0MEVfRE9XTiwgJnZzaS0+c3RhdGUpKSB7CiAJCW5hcGlfY29tcGxldGUobmFwaSk7CkBAIC0xNjQ3LDggKzE4NzMsMTQgQEAKIAkgKi8KIAlidWRnZXRfcGVyX3JpbmcgPSBtYXgoYnVkZ2V0L3FfdmVjdG9yLT5udW1fcmluZ3BhaXJzLCAxKTsKIAotCWk0MGVfZm9yX2VhY2hfcmluZyhyaW5nLCBxX3ZlY3Rvci0+cngpCi0JCWNsZWFuX2NvbXBsZXRlICY9IGk0MGVfY2xlYW5fcnhfaXJxKHJpbmcsIGJ1ZGdldF9wZXJfcmluZyk7CisJaTQwZV9mb3JfZWFjaF9yaW5nKHJpbmcsIHFfdmVjdG9yLT5yeCkgeworCQlpZiAocmluZ19pc19wc19lbmFibGVkKHJpbmcpKQorCQkJY2xlYW5lZCA9IGk0MGVfY2xlYW5fcnhfaXJxX3BzKHJpbmcsIGJ1ZGdldF9wZXJfcmluZyk7CisJCWVsc2UKKwkJCWNsZWFuZWQgPSBpNDBlX2NsZWFuX3J4X2lycV8xYnVmKHJpbmcsIGJ1ZGdldF9wZXJfcmluZyk7CisJCS8qIGlmIHdlIGRpZG4ndCBjbGVhbiBhcyBtYW55IGFzIGJ1ZGdldGVkLCB3ZSBtdXN0IGJlIGRvbmUgKi8KKwkJY2xlYW5fY29tcGxldGUgJj0gKGJ1ZGdldF9wZXJfcmluZyAhPSBjbGVhbmVkKTsKKwl9CiAKIAkvKiBJZiB3b3JrIG5vdCBjb21wbGV0ZWQsIHJldHVybiBidWRnZXQgYW5kIHBvbGxpbmcgd2lsbCByZXR1cm4gKi8KIAlpZiAoIWNsZWFuX2NvbXBsZXRlKSB7CkBAIC0xNzE1LDYgKzE5NDcsOSBAQAogCWlmICghKHBmLT5mbGFncyAmIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkpCiAJCXJldHVybjsKIAorCWlmICgocGYtPmF1dG9fZGlzYWJsZV9mbGFncyAmIEk0MEVfRkxBR19GRF9BVFJfRU5BQkxFRCkpCisJCXJldHVybjsKKwogCS8qIGlmIHNhbXBsaW5nIGlzIGRpc2FibGVkIGRvIG5vdGhpbmcgKi8KIAlpZiAoIXR4X3JpbmctPmF0cl9zYW1wbGVfcmF0ZSkKIAkJcmV0dXJuOwpAQCAtMTgyMiw2ICsyMDU3LDE5IEBACiAJX19iZTE2IHByb3RvY29sID0gc2tiLT5wcm90b2NvbDsKIAl1MzIgIHR4X2ZsYWdzID0gMDsKIAorCWlmIChwcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkgJiYKKwkgICAgISh0eF9yaW5nLT5uZXRkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFgpKSB7CisJCS8qIFdoZW4gSFcgVkxBTiBhY2NlbGVyYXRpb24gaXMgdHVybmVkIG9mZiBieSB0aGUgdXNlciB0aGUKKwkJICogc3RhY2sgc2V0cyB0aGUgcHJvdG9jb2wgdG8gODAyMXEgc28gdGhhdCB0aGUgZHJpdmVyCisJCSAqIGNhbiB0YWtlIGFueSBzdGVwcyByZXF1aXJlZCB0byBzdXBwb3J0IHRoZSBTVyBvbmx5CisJCSAqIFZMQU4gaGFuZGxpbmcuICBJbiBvdXIgY2FzZSB0aGUgZHJpdmVyIGRvZXNuJ3QgbmVlZAorCQkgKiB0byB0YWtlIGFueSBmdXJ0aGVyIHN0ZXBzIHNvIGp1c3Qgc2V0IHRoZSBwcm90b2NvbAorCQkgKiB0byB0aGUgZW5jYXBzdWxhdGVkIGV0aGVydHlwZS4KKwkJICovCisJCXNrYi0+cHJvdG9jb2wgPSB2bGFuX2dldF9wcm90b2NvbChza2IpOworCQlnb3RvIG91dDsKKwl9CisKIAkvKiBpZiB3ZSBoYXZlIGEgSFcgVkxBTiB0YWcgYmVpbmcgYWRkZWQsIGRlZmF1bHQgdG8gdGhlIEhXIG9uZSAqLwogCWlmIChza2Jfdmxhbl90YWdfcHJlc2VudChza2IpKSB7CiAJCXR4X2ZsYWdzIHw9IHNrYl92bGFuX3RhZ19nZXQoc2tiKSA8PCBJNDBFX1RYX0ZMQUdTX1ZMQU5fU0hJRlQ7CkBAIC0xODM4LDYgKzIwODYsOSBAQAogCQl0eF9mbGFncyB8PSBJNDBFX1RYX0ZMQUdTX1NXX1ZMQU47CiAJfQogCisJaWYgKCEodHhfcmluZy0+dnNpLT5iYWNrLT5mbGFncyAmIEk0MEVfRkxBR19EQ0JfRU5BQkxFRCkpCisJCWdvdG8gb3V0OworCiAJLyogSW5zZXJ0IDgwMi4xcCBwcmlvcml0eSBpbnRvIFZMQU4gaGVhZGVyICovCiAJaWYgKCh0eF9mbGFncyAmIChJNDBFX1RYX0ZMQUdTX0hXX1ZMQU4gfCBJNDBFX1RYX0ZMQUdTX1NXX1ZMQU4pKSB8fAogCSAgICAoc2tiLT5wcmlvcml0eSAhPSBUQ19QUklPX0NPTlRST0wpKSB7CkBAIC0xODU4LDYgKzIxMDksOCBAQAogCQkJdHhfZmxhZ3MgfD0gSTQwRV9UWF9GTEFHU19IV19WTEFOOwogCQl9CiAJfQorCitvdXQ6CiAJKmZsYWdzID0gdHhfZmxhZ3M7CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTgyLDggKzIyMzUsMTYgQEAKIAlzdHJ1Y3QgaXBoZHIgKnRoaXNfaXBfaGRyOwogCXUzMiBuZXR3b3JrX2hkcl9sZW47CiAJdTggbDRfaGRyID0gMDsKKwl1MzIgbDRfdHVubmVsID0gMDsKIAogCWlmIChza2ItPmVuY2Fwc3VsYXRpb24pIHsKKwkJc3dpdGNoIChpcF9oZHIoc2tiKS0+cHJvdG9jb2wpIHsKKwkJY2FzZSBJUFBST1RPX1VEUDoKKwkJCWw0X3R1bm5lbCA9IEk0MEVfVFhEX0NUWF9VRFBfVFVOTkVMSU5HOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm47CisJCX0KIAkJbmV0d29ya19oZHJfbGVuID0gc2tiX2lubmVyX25ldHdvcmtfaGVhZGVyX2xlbihza2IpOwogCQl0aGlzX2lwX2hkciA9IGlubmVyX2lwX2hkcihza2IpOwogCQl0aGlzX2lwdjZfaGRyID0gaW5uZXJfaXB2Nl9oZHIoc2tiKTsKQEAgLTIwMDYsOCArMjI2Nyw4IEBACiAKIAkJLyogTm93IHNldCB0aGUgY3R4IGRlc2NyaXB0b3IgZmllbGRzICovCiAJCSpjZF90dW5uZWxpbmcgfD0gKHNrYl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKSA+PiAyKSA8PAotCQkJCQlJNDBFX1RYRF9DVFhfUVcwX0VYVF9JUExFTl9TSElGVCB8Ci0JCQkJICAgSTQwRV9UWERfQ1RYX1VEUF9UVU5ORUxJTkcgICAgICAgICAgICB8CisJCQkJICAgSTQwRV9UWERfQ1RYX1FXMF9FWFRfSVBMRU5fU0hJRlQgICAgICB8CisJCQkJICAgbDRfdHVubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAJCQkJICAgKChza2JfaW5uZXJfbmV0d29ya19vZmZzZXQoc2tiKSAtCiAJCQkJCXNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikpID4+IDEpIDw8CiAJCQkJICAgSTQwRV9UWERfQ1RYX1FXMF9OQVRMRU5fU0hJRlQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHhyeC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R4cnguaAppbmRleCBkZmYwYmFlLi40YjBiODEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHhyeC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eHJ4LmgKQEAgLTk2LDYgKzk2LDE0IEBACiAKIC8qIEhvdyBtYW55IFJ4IEJ1ZmZlcnMgZG8gd2UgYnVuZGxlIGludG8gb25lIHdyaXRlIHRvIHRoZSBoYXJkd2FyZSA/ICovCiAjZGVmaW5lIEk0MEVfUlhfQlVGRkVSX1dSSVRFCTE2CS8qIE11c3QgYmUgcG93ZXIgb2YgMiAqLworI2RlZmluZSBJNDBFX1JYX0lOQ1JFTUVOVChyLCBpKSBcCisJZG8gewkJCQkJXAorCQkoaSkrKzsJCQkJXAorCQlpZiAoKGkpID09IChyKS0+Y291bnQpCQlcCisJCQlpID0gMDsJCQlcCisJCXItPm5leHRfdG9fY2xlYW4gPSBpOwkJXAorCX0gd2hpbGUgKDApCisKICNkZWZpbmUgSTQwRV9SWF9ORVhUX0RFU0MociwgaSwgbikJCVwKIAlkbyB7CQkJCQlcCiAJCShpKSsrOwkJCQlcCkBAIC0xNTIsNiArMTYwLDcgQEAKIAogc3RydWN0IGk0MGVfcnhfYnVmZmVyIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXZvaWQgKmhkcl9idWY7CiAJZG1hX2FkZHJfdCBkbWE7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJZG1hX2FkZHJfdCBwYWdlX2RtYTsKQEAgLTIyNCw4ICsyMzMsOCBAQAogCXUxNiByeF9idWZfbGVuOwogCXU4ICBkdHlwZTsKICNkZWZpbmUgSTQwRV9SWF9EVFlQRV9OT19TUExJVCAgICAgIDAKLSNkZWZpbmUgSTQwRV9SWF9EVFlQRV9TUExJVF9BTFdBWVMgIDEKLSNkZWZpbmUgSTQwRV9SWF9EVFlQRV9IRUFERVJfU1BMSVQgIDIKKyNkZWZpbmUgSTQwRV9SWF9EVFlQRV9IRUFERVJfU1BMSVQgIDEKKyNkZWZpbmUgSTQwRV9SWF9EVFlQRV9TUExJVF9BTFdBWVMgIDIKIAl1OCAgaHNwbGl0OwogI2RlZmluZSBJNDBFX1JYX1NQTElUX0wyICAgICAgMHgxCiAjZGVmaW5lIEk0MEVfUlhfU1BMSVRfSVAgICAgICAweDIKQEAgLTI4MSw3ICsyOTAsOSBAQAogI2RlZmluZSBpNDBlX2Zvcl9lYWNoX3JpbmcocG9zLCBoZWFkKSBcCiAJZm9yIChwb3MgPSAoaGVhZCkucmluZzsgcG9zICE9IE5VTEw7IHBvcyA9IHBvcy0+bmV4dCkKIAotdm9pZCBpNDBlX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGk0MGVfcmluZyAqcnhyLCB1MTYgY2xlYW5lZF9jb3VudCk7Cit2b2lkIGk0MGVfYWxsb2NfcnhfYnVmZmVyc19wcyhzdHJ1Y3QgaTQwZV9yaW5nICpyeHIsIHUxNiBjbGVhbmVkX2NvdW50KTsKK3ZvaWQgaTQwZV9hbGxvY19yeF9idWZmZXJzXzFidWYoc3RydWN0IGk0MGVfcmluZyAqcnhyLCB1MTYgY2xlYW5lZF9jb3VudCk7Cit2b2lkIGk0MGVfYWxsb2NfcnhfaGVhZGVycyhzdHJ1Y3QgaTQwZV9yaW5nICpyeHIpOwogbmV0ZGV2X3R4X3QgaTQwZV9sYW5feG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHZvaWQgaTQwZV9jbGVhbl90eF9yaW5nKHN0cnVjdCBpNDBlX3JpbmcgKnR4X3JpbmcpOwogdm9pZCBpNDBlX2NsZWFuX3J4X3Jpbmcoc3RydWN0IGk0MGVfcmluZyAqcnhfcmluZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdHlwZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R5cGUuaAppbmRleCBlOTkwMWVmLi42N2M3YmM5ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV90eXBlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3R5cGUuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogSW50ZWwgRXRoZXJuZXQgQ29udHJvbGxlciBYTDcxMCBGYW1pbHkgTGludXggRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC00NCw2ICs0NCw3IEBACiAjZGVmaW5lIEk0MEVfREVWX0lEX1FTRlBfQgkJMHgxNTg0CiAjZGVmaW5lIEk0MEVfREVWX0lEX1FTRlBfQwkJMHgxNTg1CiAjZGVmaW5lIEk0MEVfREVWX0lEXzEwR19CQVNFX1QJCTB4MTU4NgorI2RlZmluZSBJNDBFX0RFVl9JRF8yMEdfS1IyCQkweDE1ODcKICNkZWZpbmUgSTQwRV9ERVZfSURfVkYJCQkweDE1NEMKICNkZWZpbmUgSTQwRV9ERVZfSURfVkZfSFYJCTB4MTU3MQogCkBAIC0xNzUsMTIgKzE3NiwxMiBAQAogCXU4IGFuX2luZm87CiAJdTggZXh0X2luZm87CiAJdTggbG9vcGJhY2s7Ci0JYm9vbCBhbl9lbmFibGVkOwogCS8qIGlzIExpbmsgU3RhdHVzIEV2ZW50IG5vdGlmaWNhdGlvbiB0byBTVyBlbmFibGVkICovCiAJYm9vbCBsc2VfZW5hYmxlOwogCXUxNiBtYXhfZnJhbWVfc2l6ZTsKIAlib29sIGNyY19lbmFibGU7CiAJdTggcGFjaW5nOworCXU4IHJlcXVlc3RlZF9zcGVlZHM7CiB9OwogCiBzdHJ1Y3QgaTQwZV9waHlfaW5mbyB7CkBAIC0xMTQzLDcgKzExNDQsNyBAQAogI2RlZmluZSBJNDBFX1NSX0VNUF9NT0RVTEVfUFRSCQkJMHgwRgogI2RlZmluZSBJNDBFX1NSX1BCQV9GTEFHUwkJCTB4MTUKICNkZWZpbmUgSTQwRV9TUl9QQkFfQkxPQ0tfUFRSCQkJMHgxNgotI2RlZmluZSBJNDBFX1NSX05WTV9JTUFHRV9WRVJTSU9OCQkweDE4CisjZGVmaW5lIEk0MEVfU1JfTlZNX0RFVl9TVEFSVEVSX1ZFUlNJT04JCTB4MTgKICNkZWZpbmUgSTQwRV9TUl9OVk1fV0FLRV9PTl9MQU4JCQkweDE5CiAjZGVmaW5lIEk0MEVfU1JfQUxURVJOQVRFX1NBTl9NQUNfQUREUkVTU19QVFIJMHgyNwogI2RlZmluZSBJNDBFX1NSX05WTV9FRVRSQUNLX0xPCQkJMHgyRApAQCAtMTQwMSw2ICsxNDAyLDE5IEBACiAJdTE2IGNyYzg7CiB9OwogCisvKiBPZmZzZXRzIGludG8gQWx0ZXJuYXRlIFJhbSAqLworI2RlZmluZSBJNDBFX0FMVF9TVFJVQ1RfRklSU1RfUEZfT0ZGU0VUCQkwICAgLyogaW4gZHdvcmRzICovCisjZGVmaW5lIEk0MEVfQUxUX1NUUlVDVF9EV09SRFNfUEVSX1BGCQk2NCAgIC8qIGluIGR3b3JkcyAqLworI2RlZmluZSBJNDBFX0FMVF9TVFJVQ1RfT1VURVJfVkxBTl9UQUdfT0ZGU0VUCTB4RCAgLyogaW4gZHdvcmRzICovCisjZGVmaW5lIEk0MEVfQUxUX1NUUlVDVF9VU0VSX1BSSU9SSVRZX09GRlNFVAkweEMgIC8qIGluIGR3b3JkcyAqLworI2RlZmluZSBJNDBFX0FMVF9TVFJVQ1RfTUlOX0JXX09GRlNFVAkJMHhFICAvKiBpbiBkd29yZHMgKi8KKyNkZWZpbmUgSTQwRV9BTFRfU1RSVUNUX01BWF9CV19PRkZTRVQJCTB4RiAgLyogaW4gZHdvcmRzICovCisKKy8qIEFsdGVybmF0ZSBSYW0gQmFuZHdpZHRoIE1hc2tzICovCisjZGVmaW5lIEk0MEVfQUxUX0JXX1ZBTFVFX01BU0sJCTB4RkYKKyNkZWZpbmUgSTQwRV9BTFRfQldfUkVMQVRJVkVfTUFTSwkweDQwMDAwMDAwCisjZGVmaW5lIEk0MEVfQUxUX0JXX1ZBTElEX01BU0sJCTB4ODAwMDAwMDAKKwogLyogUlNTIEhhc2ggVGFibGUgU2l6ZSAqLwogI2RlZmluZSBJNDBFX1BGUUZfQ1RMXzBfSEFTSExVVFNJWkVfNTEyCTB4MDAwMTAwMDAKICNlbmRpZiAvKiBfSTQwRV9UWVBFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmwuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubC5oCmluZGV4IDYxZGQxYjE4Li4yZDIwYWYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmwuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmwuaApAQCAtNTksMzEgKzU5LDI5IEBACiAgKiBvZiB0aGUgdmlydGNobmxfbXNnIHN0cnVjdHVyZS4KICAqLwogZW51bSBpNDBlX3ZpcnRjaG5sX29wcyB7Ci0vKiBWRiBzZW5kcyByZXEuIHRvIHBmIGZvciB0aGUgZm9sbG93aW5nCi0gKiBvcHMuCisvKiBUaGUgUEYgc2VuZHMgc3RhdHVzIGNoYW5nZSBldmVudHMgdG8gVkZzIHVzaW5nCisgKiB0aGUgSTQwRV9WSVJUQ0hOTF9PUF9FVkVOVCBvcGNvZGUuCisgKiBWRnMgc2VuZCByZXF1ZXN0cyB0byB0aGUgUEYgdXNpbmcgdGhlIG90aGVyIG9wcy4KICAqLwogCUk0MEVfVklSVENITkxfT1BfVU5LTk9XTiA9IDAsCiAJSTQwRV9WSVJUQ0hOTF9PUF9WRVJTSU9OID0gMSwgLyogbXVzdCBBTFdBWVMgYmUgMSAqLwotCUk0MEVfVklSVENITkxfT1BfUkVTRVRfVkYsCi0JSTQwRV9WSVJUQ0hOTF9PUF9HRVRfVkZfUkVTT1VSQ0VTLAotCUk0MEVfVklSVENITkxfT1BfQ09ORklHX1RYX1FVRVVFLAotCUk0MEVfVklSVENITkxfT1BfQ09ORklHX1JYX1FVRVVFLAotCUk0MEVfVklSVENITkxfT1BfQ09ORklHX1ZTSV9RVUVVRVMsCi0JSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfSVJRX01BUCwKLQlJNDBFX1ZJUlRDSE5MX09QX0VOQUJMRV9RVUVVRVMsCi0JSTQwRV9WSVJUQ0hOTF9PUF9ESVNBQkxFX1FVRVVFUywKLQlJNDBFX1ZJUlRDSE5MX09QX0FERF9FVEhFUl9BRERSRVNTLAotCUk0MEVfVklSVENITkxfT1BfREVMX0VUSEVSX0FERFJFU1MsCi0JSTQwRV9WSVJUQ0hOTF9PUF9BRERfVkxBTiwKLQlJNDBFX1ZJUlRDSE5MX09QX0RFTF9WTEFOLAotCUk0MEVfVklSVENITkxfT1BfQ09ORklHX1BST01JU0NVT1VTX01PREUsCi0JSTQwRV9WSVJUQ0hOTF9PUF9HRVRfU1RBVFMsCi0JSTQwRV9WSVJUQ0hOTF9PUF9GQ09FLAotCUk0MEVfVklSVENITkxfT1BfQ09ORklHX1JTUywKLS8qIFBGIHNlbmRzIHN0YXR1cyBjaGFuZ2UgZXZlbnRzIHRvIHZmcyB1c2luZwotICogdGhlIGZvbGxvd2luZyBvcC4KLSAqLwotCUk0MEVfVklSVENITkxfT1BfRVZFTlQsCisJSTQwRV9WSVJUQ0hOTF9PUF9SRVNFVF9WRiA9IDIsCisJSTQwRV9WSVJUQ0hOTF9PUF9HRVRfVkZfUkVTT1VSQ0VTID0gMywKKwlJNDBFX1ZJUlRDSE5MX09QX0NPTkZJR19UWF9RVUVVRSA9IDQsCisJSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfUlhfUVVFVUUgPSA1LAorCUk0MEVfVklSVENITkxfT1BfQ09ORklHX1ZTSV9RVUVVRVMgPSA2LAorCUk0MEVfVklSVENITkxfT1BfQ09ORklHX0lSUV9NQVAgPSA3LAorCUk0MEVfVklSVENITkxfT1BfRU5BQkxFX1FVRVVFUyA9IDgsCisJSTQwRV9WSVJUQ0hOTF9PUF9ESVNBQkxFX1FVRVVFUyA9IDksCisJSTQwRV9WSVJUQ0hOTF9PUF9BRERfRVRIRVJfQUREUkVTUyA9IDEwLAorCUk0MEVfVklSVENITkxfT1BfREVMX0VUSEVSX0FERFJFU1MgPSAxMSwKKwlJNDBFX1ZJUlRDSE5MX09QX0FERF9WTEFOID0gMTIsCisJSTQwRV9WSVJUQ0hOTF9PUF9ERUxfVkxBTiA9IDEzLAorCUk0MEVfVklSVENITkxfT1BfQ09ORklHX1BST01JU0NVT1VTX01PREUgPSAxNCwKKwlJNDBFX1ZJUlRDSE5MX09QX0dFVF9TVEFUUyA9IDE1LAorCUk0MEVfVklSVENITkxfT1BfRkNPRSA9IDE2LAorCUk0MEVfVklSVENITkxfT1BfRVZFTlQgPSAxNywKKwlJNDBFX1ZJUlRDSE5MX09QX0NPTkZJR19SU1MgPSAxOCwKIH07CiAKIC8qIFZpcnR1YWwgY2hhbm5lbCBtZXNzYWdlIGRlc2NyaXB0b3IuIFRoaXMgb3ZlcmxheXMgdGhlIGFkbWluIHF1ZXVlCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubF9wZi5jCmluZGV4IDQwZjA0MmEuLjRkNjllMWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubF9wZi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGUvaTQwZV92aXJ0Y2hubF9wZi5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBJbnRlbCBFdGhlcm5ldCBDb250cm9sbGVyIFhMNzEwIEZhbWlseSBMaW51eCBEcml2ZXIKLSAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTMwLDggKzMwLDggQEAKIAogLyoqCiAgKiBpNDBlX3ZjX2Rpc2FibGVfdmYKLSAqIEBwZjogcG9pbnRlciB0byB0aGUgcGYgaW5mbwotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCisgKiBAcGY6IHBvaW50ZXIgdG8gdGhlIFBGIGluZm8KKyAqIEB2ZjogcG9pbnRlciB0byB0aGUgVkYgaW5mbwogICoKICAqIERpc2FibGUgdGhlIFZGIHRocm91Z2ggYSBTVyByZXNldAogICoqLwpAQCAtNDgsMzggKzQ4LDQwIEBACiAKIC8qKgogICogaTQwZV92Y19pc3ZhbGlkX3ZzaV9pZAotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCi0gKiBAdnNpX2lkOiB2ZiByZWxhdGl2ZSB2c2kgaWQKKyAqIEB2ZjogcG9pbnRlciB0byB0aGUgVkYgaW5mbworICogQHZzaV9pZDogVkYgcmVsYXRpdmUgVlNJIGlkCiAgKgotICogY2hlY2sgZm9yIHRoZSB2YWxpZCB2c2kgaWQKKyAqIGNoZWNrIGZvciB0aGUgdmFsaWQgVlNJIGlkCiAgKiovCi1zdGF0aWMgaW5saW5lIGJvb2wgaTQwZV92Y19pc3ZhbGlkX3ZzaV9pZChzdHJ1Y3QgaTQwZV92ZiAqdmYsIHU4IHZzaV9pZCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBpNDBlX3ZjX2lzdmFsaWRfdnNpX2lkKHN0cnVjdCBpNDBlX3ZmICp2ZiwgdTE2IHZzaV9pZCkKIHsKIAlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2Zi0+cGY7CisJc3RydWN0IGk0MGVfdnNpICp2c2kgPSBpNDBlX2ZpbmRfdnNpX2Zyb21faWQocGYsIHZzaV9pZCk7CiAKLQlyZXR1cm4gcGYtPnZzaVt2c2lfaWRdLT52Zl9pZCA9PSB2Zi0+dmZfaWQ7CisJcmV0dXJuICh2c2kgJiYgKHZzaS0+dmZfaWQgPT0gdmYtPnZmX2lkKSk7CiB9CiAKIC8qKgogICogaTQwZV92Y19pc3ZhbGlkX3F1ZXVlX2lkCi0gKiBAdmY6IHBvaW50ZXIgdG8gdGhlIHZmIGluZm8KKyAqIEB2ZjogcG9pbnRlciB0byB0aGUgVkYgaW5mbwogICogQHZzaV9pZDogdnNpIGlkCiAgKiBAcWlkOiB2c2kgcmVsYXRpdmUgcXVldWUgaWQKICAqCiAgKiBjaGVjayBmb3IgdGhlIHZhbGlkIHF1ZXVlIGlkCiAgKiovCi1zdGF0aWMgaW5saW5lIGJvb2wgaTQwZV92Y19pc3ZhbGlkX3F1ZXVlX2lkKHN0cnVjdCBpNDBlX3ZmICp2ZiwgdTggdnNpX2lkLAorc3RhdGljIGlubGluZSBib29sIGk0MGVfdmNfaXN2YWxpZF9xdWV1ZV9pZChzdHJ1Y3QgaTQwZV92ZiAqdmYsIHUxNiB2c2lfaWQsCiAJCQkJCSAgICB1OCBxaWQpCiB7CiAJc3RydWN0IGk0MGVfcGYgKnBmID0gdmYtPnBmOworCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gaTQwZV9maW5kX3ZzaV9mcm9tX2lkKHBmLCB2c2lfaWQpOwogCi0JcmV0dXJuIHFpZCA8IHBmLT52c2lbdnNpX2lkXS0+YWxsb2NfcXVldWVfcGFpcnM7CisJcmV0dXJuICh2c2kgJiYgKHFpZCA8IHZzaS0+YWxsb2NfcXVldWVfcGFpcnMpKTsKIH0KIAogLyoqCiAgKiBpNDBlX3ZjX2lzdmFsaWRfdmVjdG9yX2lkCi0gKiBAdmY6IHBvaW50ZXIgdG8gdGhlIHZmIGluZm8KLSAqIEB2ZWN0b3JfaWQ6IHZmIHJlbGF0aXZlIHZlY3RvciBpZAorICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCisgKiBAdmVjdG9yX2lkOiBWRiByZWxhdGl2ZSB2ZWN0b3IgaWQKICAqCiAgKiBjaGVjayBmb3IgdGhlIHZhbGlkIHZlY3RvciBpZAogICoqLwpAQCAtOTQsMTkgKzk2LDIyIEBACiAKIC8qKgogICogaTQwZV92Y19nZXRfcGZfcXVldWVfaWQKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgaW5mbwotICogQHZzaV9pZHg6IGluZGV4IG9mIFZTSSBpbiBQRiBzdHJ1Y3QKKyAqIEB2ZjogcG9pbnRlciB0byB0aGUgVkYgaW5mbworICogQHZzaV9pZDogaWQgb2YgVlNJIGFzIHByb3ZpZGVkIGJ5IHRoZSBGVwogICogQHZzaV9xdWV1ZV9pZDogdnNpIHJlbGF0aXZlIHF1ZXVlIGlkCiAgKgotICogcmV0dXJuIHBmIHJlbGF0aXZlIHF1ZXVlIGlkCisgKiByZXR1cm4gUEYgcmVsYXRpdmUgcXVldWUgaWQKICAqKi8KLXN0YXRpYyB1MTYgaTQwZV92Y19nZXRfcGZfcXVldWVfaWQoc3RydWN0IGk0MGVfdmYgKnZmLCB1OCB2c2lfaWR4LAorc3RhdGljIHUxNiBpNDBlX3ZjX2dldF9wZl9xdWV1ZV9pZChzdHJ1Y3QgaTQwZV92ZiAqdmYsIHUxNiB2c2lfaWQsCiAJCQkJICAgdTggdnNpX3F1ZXVlX2lkKQogewogCXN0cnVjdCBpNDBlX3BmICpwZiA9IHZmLT5wZjsKLQlzdHJ1Y3QgaTQwZV92c2kgKnZzaSA9IHBmLT52c2lbdnNpX2lkeF07CisJc3RydWN0IGk0MGVfdnNpICp2c2kgPSBpNDBlX2ZpbmRfdnNpX2Zyb21faWQocGYsIHZzaV9pZCk7CiAJdTE2IHBmX3F1ZXVlX2lkID0gSTQwRV9RVUVVRV9FTkRfT0ZfTElTVDsKIAorCWlmICghdnNpKQorCQlyZXR1cm4gcGZfcXVldWVfaWQ7CisKIAlpZiAobGUxNl90b19jcHUodnNpLT5pbmZvLm1hcHBpbmdfZmxhZ3MpICYKIAkgICAgSTQwRV9BUV9WU0lfUVVFX01BUF9OT05DT05USUcpCiAJCXBmX3F1ZXVlX2lkID0KQEAgLTEyMCwxMyArMTI1LDEzIEBACiAKIC8qKgogICogaTQwZV9jb25maWdfaXJxX2xpbmtfbGlzdAotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCi0gKiBAdnNpX2lkeDogaW5kZXggb2YgVlNJIGluIFBGIHN0cnVjdAorICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCisgKiBAdnNpX2lkOiBpZCBvZiBWU0kgYXMgZ2l2ZW4gYnkgdGhlIEZXCiAgKiBAdmVjbWFwOiBpcnEgbWFwIGluZm8KICAqCiAgKiBjb25maWd1cmUgaXJxIGxpbmsgbGlzdCBmcm9tIHRoZSBtYXAKICAqKi8KLXN0YXRpYyB2b2lkIGk0MGVfY29uZmlnX2lycV9saW5rX2xpc3Qoc3RydWN0IGk0MGVfdmYgKnZmLCB1MTYgdnNpX2lkeCwKK3N0YXRpYyB2b2lkIGk0MGVfY29uZmlnX2lycV9saW5rX2xpc3Qoc3RydWN0IGk0MGVfdmYgKnZmLCB1MTYgdnNpX2lkLAogCQkJCSAgICAgIHN0cnVjdCBpNDBlX3ZpcnRjaG5sX3ZlY3Rvcl9tYXAgKnZlY21hcCkKIHsKIAl1bnNpZ25lZCBsb25nIGxpbmtsaXN0bWFwID0gMCwgdGVtcG1hcDsKQEAgLTE3MSw3ICsxNzYsNyBAQAogCQkJCSBJNDBFX1ZJUlRDSE5MX1NVUFBPUlRFRF9RVFlQRVMpKTsKIAl2c2lfcXVldWVfaWQgPSBuZXh0X3EvSTQwRV9WSVJUQ0hOTF9TVVBQT1JURURfUVRZUEVTOwogCXF0eXBlID0gbmV4dF9xJUk0MEVfVklSVENITkxfU1VQUE9SVEVEX1FUWVBFUzsKLQlwZl9xdWV1ZV9pZCA9IGk0MGVfdmNfZ2V0X3BmX3F1ZXVlX2lkKHZmLCB2c2lfaWR4LCB2c2lfcXVldWVfaWQpOworCXBmX3F1ZXVlX2lkID0gaTQwZV92Y19nZXRfcGZfcXVldWVfaWQodmYsIHZzaV9pZCwgdnNpX3F1ZXVlX2lkKTsKIAlyZWcgPSAoKHF0eXBlIDw8IEk0MEVfVlBJTlRfTE5LTFNUTl9GSVJTVFFfVFlQRV9TSElGVCkgfCBwZl9xdWV1ZV9pZCk7CiAKIAl3cjMyKGh3LCByZWdfaWR4LCByZWcpOwpAQCAtMTk4LDcgKzIwMyw3IEBACiAJCSAgICAoSTQwRV9NQVhfVlNJX1FQICogSTQwRV9WSVJUQ0hOTF9TVVBQT1JURURfUVRZUEVTKSkgewogCQkJdnNpX3F1ZXVlX2lkID0gbmV4dF9xIC8gSTQwRV9WSVJUQ0hOTF9TVVBQT1JURURfUVRZUEVTOwogCQkJcXR5cGUgPSBuZXh0X3EgJSBJNDBFX1ZJUlRDSE5MX1NVUFBPUlRFRF9RVFlQRVM7Ci0JCQlwZl9xdWV1ZV9pZCA9IGk0MGVfdmNfZ2V0X3BmX3F1ZXVlX2lkKHZmLCB2c2lfaWR4LAorCQkJcGZfcXVldWVfaWQgPSBpNDBlX3ZjX2dldF9wZl9xdWV1ZV9pZCh2ZiwgdnNpX2lkLAogCQkJCQkJCSAgICAgIHZzaV9xdWV1ZV9pZCk7CiAJCX0gZWxzZSB7CiAJCQlwZl9xdWV1ZV9pZCA9IEk0MEVfUVVFVUVfRU5EX09GX0xJU1Q7CkBAIC0yMjAsMjUgKzIyNSwyNyBAQAogCiAvKioKICAqIGk0MGVfY29uZmlnX3ZzaV90eF9xdWV1ZQotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCi0gKiBAdnNpX2lkeDogaW5kZXggb2YgVlNJIGluIFBGIHN0cnVjdAorICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCisgKiBAdnNpX2lkOiBpZCBvZiBWU0kgYXMgcHJvdmlkZWQgYnkgdGhlIEZXCiAgKiBAdnNpX3F1ZXVlX2lkOiB2c2kgcmVsYXRpdmUgcXVldWUgaW5kZXgKICAqIEBpbmZvOiBjb25maWcuIGluZm8KICAqCiAgKiBjb25maWd1cmUgdHggcXVldWUKICAqKi8KLXN0YXRpYyBpbnQgaTQwZV9jb25maWdfdnNpX3R4X3F1ZXVlKHN0cnVjdCBpNDBlX3ZmICp2ZiwgdTE2IHZzaV9pZHgsCitzdGF0aWMgaW50IGk0MGVfY29uZmlnX3ZzaV90eF9xdWV1ZShzdHJ1Y3QgaTQwZV92ZiAqdmYsIHUxNiB2c2lfaWQsCiAJCQkJICAgIHUxNiB2c2lfcXVldWVfaWQsCiAJCQkJICAgIHN0cnVjdCBpNDBlX3ZpcnRjaG5sX3R4cV9pbmZvICppbmZvKQogewogCXN0cnVjdCBpNDBlX3BmICpwZiA9IHZmLT5wZjsKIAlzdHJ1Y3QgaTQwZV9odyAqaHcgPSAmcGYtPmh3OwogCXN0cnVjdCBpNDBlX2htY19vYmpfdHhxIHR4X2N0eDsKKwlzdHJ1Y3QgaTQwZV92c2kgKnZzaTsKIAl1MTYgcGZfcXVldWVfaWQ7CiAJdTMyIHF0eF9jdGw7CiAJaW50IHJldCA9IDA7CiAKLQlwZl9xdWV1ZV9pZCA9IGk0MGVfdmNfZ2V0X3BmX3F1ZXVlX2lkKHZmLCB2c2lfaWR4LCB2c2lfcXVldWVfaWQpOworCXBmX3F1ZXVlX2lkID0gaTQwZV92Y19nZXRfcGZfcXVldWVfaWQodmYsIHZzaV9pZCwgdnNpX3F1ZXVlX2lkKTsKKwl2c2kgPSBpNDBlX2ZpbmRfdnNpX2Zyb21faWQocGYsIHZzaV9pZCk7CiAKIAkvKiBjbGVhciB0aGUgY29udGV4dCBzdHJ1Y3R1cmUgZmlyc3QgKi8KIAltZW1zZXQoJnR4X2N0eCwgMCwgc2l6ZW9mKHN0cnVjdCBpNDBlX2htY19vYmpfdHhxKSk7CkBAIC0yNDYsNyArMjUzLDcgQEAKIAkvKiBvbmx5IHNldCB0aGUgcmVxdWlyZWQgZmllbGRzICovCiAJdHhfY3R4LmJhc2UgPSBpbmZvLT5kbWFfcmluZ19hZGRyIC8gMTI4OwogCXR4X2N0eC5xbGVuID0gaW5mby0+cmluZ19sZW47Ci0JdHhfY3R4LnJkeWxpc3QgPSBsZTE2X3RvX2NwdShwZi0+dnNpW3ZzaV9pZHhdLT5pbmZvLnFzX2hhbmRsZVswXSk7CisJdHhfY3R4LnJkeWxpc3QgPSBsZTE2X3RvX2NwdSh2c2ktPmluZm8ucXNfaGFuZGxlWzBdKTsKIAl0eF9jdHgucmR5bGlzdF9hY3QgPSAwOwogCXR4X2N0eC5oZWFkX3diX2VuYSA9IGluZm8tPmhlYWR3Yl9lbmFibGVkOwogCXR4X2N0eC5oZWFkX3diX2FkZHIgPSBpbmZvLT5kbWFfaGVhZHdiX2FkZHI7CkBAIC0yODcsMTQgKzI5NCwxNCBAQAogCiAvKioKICAqIGk0MGVfY29uZmlnX3ZzaV9yeF9xdWV1ZQotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCi0gKiBAdnNpX2lkeDogaW5kZXggb2YgVlNJIGluIFBGIHN0cnVjdAorICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCisgKiBAdnNpX2lkOiBpZCBvZiBWU0kgIGFzIHByb3ZpZGVkIGJ5IHRoZSBGVwogICogQHZzaV9xdWV1ZV9pZDogdnNpIHJlbGF0aXZlIHF1ZXVlIGluZGV4CiAgKiBAaW5mbzogY29uZmlnLiBpbmZvCiAgKgogICogY29uZmlndXJlIHJ4IHF1ZXVlCiAgKiovCi1zdGF0aWMgaW50IGk0MGVfY29uZmlnX3ZzaV9yeF9xdWV1ZShzdHJ1Y3QgaTQwZV92ZiAqdmYsIHUxNiB2c2lfaWR4LAorc3RhdGljIGludCBpNDBlX2NvbmZpZ192c2lfcnhfcXVldWUoc3RydWN0IGk0MGVfdmYgKnZmLCB1MTYgdnNpX2lkLAogCQkJCSAgICB1MTYgdnNpX3F1ZXVlX2lkLAogCQkJCSAgICBzdHJ1Y3QgaTQwZV92aXJ0Y2hubF9yeHFfaW5mbyAqaW5mbykKIHsKQEAgLTMwNCw3ICszMTEsNyBAQAogCXUxNiBwZl9xdWV1ZV9pZDsKIAlpbnQgcmV0ID0gMDsKIAotCXBmX3F1ZXVlX2lkID0gaTQwZV92Y19nZXRfcGZfcXVldWVfaWQodmYsIHZzaV9pZHgsIHZzaV9xdWV1ZV9pZCk7CisJcGZfcXVldWVfaWQgPSBpNDBlX3ZjX2dldF9wZl9xdWV1ZV9pZCh2ZiwgdnNpX2lkLCB2c2lfcXVldWVfaWQpOwogCiAJLyogY2xlYXIgdGhlIGNvbnRleHQgc3RydWN0dXJlIGZpcnN0ICovCiAJbWVtc2V0KCZyeF9jdHgsIDAsIHNpemVvZihzdHJ1Y3QgaTQwZV9obWNfb2JqX3J4cSkpOwpAQCAtMzc4LDEwICszODUsMTAgQEAKIAogLyoqCiAgKiBpNDBlX2FsbG9jX3ZzaV9yZXMKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgaW5mbworICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCiAgKiBAdHlwZTogdHlwZSBvZiBWU0kgdG8gYWxsb2NhdGUKICAqCi0gKiBhbGxvYyB2ZiB2c2kgY29udGV4dCAmIHJlc291cmNlcworICogYWxsb2MgVkYgdnNpIGNvbnRleHQgJiByZXNvdXJjZXMKICAqKi8KIHN0YXRpYyBpbnQgaTQwZV9hbGxvY192c2lfcmVzKHN0cnVjdCBpNDBlX3ZmICp2ZiwgZW51bSBpNDBlX3ZzaV90eXBlIHR5cGUpCiB7CkBAIC0zOTQsMTggKzQwMSwxNSBAQAogCiAJaWYgKCF2c2kpIHsKIAkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwKLQkJCSJhZGQgdnNpIGZhaWxlZCBmb3IgdmYgJWQsIGFxX2VyciAlZFxuIiwKKwkJCSJhZGQgdnNpIGZhaWxlZCBmb3IgVkYgJWQsIGFxX2VyciAlZFxuIiwKIAkJCXZmLT52Zl9pZCwgcGYtPmh3LmFxLmFzcV9sYXN0X3N0YXR1cyk7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWdvdG8gZXJyb3JfYWxsb2NfdnNpX3JlczsKIAl9CiAJaWYgKHR5cGUgPT0gSTQwRV9WU0lfU1JJT1YpIHsKIAkJdTggYnJkY2FzdFtFVEhfQUxFTl0gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci0JCXZmLT5sYW5fdnNpX2luZGV4ID0gdnNpLT5pZHg7CisJCXZmLT5sYW5fdnNpX2lkeCA9IHZzaS0+aWR4OwogCQl2Zi0+bGFuX3ZzaV9pZCA9IHZzaS0+aWQ7Ci0JCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkJICJWRiAlZCBhc3NpZ25lZCBMQU4gVlNJIGluZGV4ICVkLCBWU0kgaWQgJWRcbiIsCi0JCQkgdmYtPnZmX2lkLCB2c2ktPmlkeCwgdnNpLT5pZCk7CiAJCS8qIElmIHRoZSBwb3J0IFZMQU4gaGFzIGJlZW4gY29uZmlndXJlZCBhbmQgdGhlbiB0aGUKIAkJICogVkYgZHJpdmVyIHdhcyByZW1vdmVkIHRoZW4gdGhlIFZTSSBwb3J0IFZMQU4KIAkJICogY29uZmlndXJhdGlvbiB3YXMgZGVzdHJveWVkLiAgQ2hlY2sgaWYgdGhlcmUgaXMKQEAgLTQ0Niw5ICs0NTAsOSBAQAogCiAvKioKICAqIGk0MGVfZW5hYmxlX3ZmX21hcHBpbmdzCi0gKiBAdmY6IHBvaW50ZXIgdG8gdGhlIHZmIGluZm8KKyAqIEB2ZjogcG9pbnRlciB0byB0aGUgVkYgaW5mbwogICoKLSAqIGVuYWJsZSB2ZiBtYXBwaW5ncworICogZW5hYmxlIFZGIG1hcHBpbmdzCiAgKiovCiBzdGF0aWMgdm9pZCBpNDBlX2VuYWJsZV92Zl9tYXBwaW5ncyhzdHJ1Y3QgaTQwZV92ZiAqdmYpCiB7CkBAIC00NjksOCArNDczLDggQEAKIAl3cjMyKGh3LCBJNDBFX1ZQTEFOX01BUEVOQSh2Zi0+dmZfaWQpLCByZWcpOwogCiAJLyogbWFwIFBGIHF1ZXVlcyB0byBWRiBxdWV1ZXMgKi8KLQlmb3IgKGogPSAwOyBqIDwgcGYtPnZzaVt2Zi0+bGFuX3ZzaV9pbmRleF0tPmFsbG9jX3F1ZXVlX3BhaXJzOyBqKyspIHsKLQkJdTE2IHFpZCA9IGk0MGVfdmNfZ2V0X3BmX3F1ZXVlX2lkKHZmLCB2Zi0+bGFuX3ZzaV9pbmRleCwgaik7CisJZm9yIChqID0gMDsgaiA8IHBmLT52c2lbdmYtPmxhbl92c2lfaWR4XS0+YWxsb2NfcXVldWVfcGFpcnM7IGorKykgeworCQl1MTYgcWlkID0gaTQwZV92Y19nZXRfcGZfcXVldWVfaWQodmYsIHZmLT5sYW5fdnNpX2lkLCBqKTsKIAkJcmVnID0gKHFpZCAmIEk0MEVfVlBMQU5fUVRBQkxFX1FJTkRFWF9NQVNLKTsKIAkJd3IzMihodywgSTQwRV9WUExBTl9RVEFCTEUodG90YWxfcXVldWVfcGFpcnMsIHZmLT52Zl9pZCksIHJlZyk7CiAJCXRvdGFsX3F1ZXVlX3BhaXJzKys7CkBAIC00NzgsMTMgKzQ4MiwxMyBAQAogCiAJLyogbWFwIFBGIHF1ZXVlcyB0byBWU0kgKi8KIAlmb3IgKGogPSAwOyBqIDwgNzsgaisrKSB7Ci0JCWlmIChqICogMiA+PSBwZi0+dnNpW3ZmLT5sYW5fdnNpX2luZGV4XS0+YWxsb2NfcXVldWVfcGFpcnMpIHsKKwkJaWYgKGogKiAyID49IHBmLT52c2lbdmYtPmxhbl92c2lfaWR4XS0+YWxsb2NfcXVldWVfcGFpcnMpIHsKIAkJCXJlZyA9IDB4MDdGRjA3RkY7CS8qIHVudXNlZCAqLwogCQl9IGVsc2UgewotCQkJdTE2IHFpZCA9IGk0MGVfdmNfZ2V0X3BmX3F1ZXVlX2lkKHZmLCB2Zi0+bGFuX3ZzaV9pbmRleCwKKwkJCXUxNiBxaWQgPSBpNDBlX3ZjX2dldF9wZl9xdWV1ZV9pZCh2ZiwgdmYtPmxhbl92c2lfaWQsCiAJCQkJCQkJICBqICogMik7CiAJCQlyZWcgPSBxaWQ7Ci0JCQlxaWQgPSBpNDBlX3ZjX2dldF9wZl9xdWV1ZV9pZCh2ZiwgdmYtPmxhbl92c2lfaW5kZXgsCisJCQlxaWQgPSBpNDBlX3ZjX2dldF9wZl9xdWV1ZV9pZCh2ZiwgdmYtPmxhbl92c2lfaWQsCiAJCQkJCQkgICAgICAoaiAqIDIpICsgMSk7CiAJCQlyZWcgfD0gcWlkIDw8IDE2OwogCQl9CkBAIC00OTYsOSArNTAwLDkgQEAKIAogLyoqCiAgKiBpNDBlX2Rpc2FibGVfdmZfbWFwcGluZ3MKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgaW5mbworICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCiAgKgotICogZGlzYWJsZSB2ZiBtYXBwaW5ncworICogZGlzYWJsZSBWRiBtYXBwaW5ncwogICoqLwogc3RhdGljIHZvaWQgaTQwZV9kaXNhYmxlX3ZmX21hcHBpbmdzKHN0cnVjdCBpNDBlX3ZmICp2ZikKIHsKQEAgLTUxNiw5ICs1MjAsOSBAQAogCiAvKioKICAqIGk0MGVfZnJlZV92Zl9yZXMKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgaW5mbworICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCiAgKgotICogZnJlZSB2ZiByZXNvdXJjZXMKKyAqIGZyZWUgVkYgcmVzb3VyY2VzCiAgKiovCiBzdGF0aWMgdm9pZCBpNDBlX2ZyZWVfdmZfcmVzKHN0cnVjdCBpNDBlX3ZmICp2ZikKIHsKQEAgLTUyOCw5ICs1MzIsOSBAQAogCWludCBpLCBtc2l4X3ZmOwogCiAJLyogZnJlZSB2c2kgJiBkaXNjb25uZWN0IGl0IGZyb20gdGhlIHBhcmVudCB1cGxpbmsgKi8KLQlpZiAodmYtPmxhbl92c2lfaW5kZXgpIHsKLQkJaTQwZV92c2lfcmVsZWFzZShwZi0+dnNpW3ZmLT5sYW5fdnNpX2luZGV4XSk7Ci0JCXZmLT5sYW5fdnNpX2luZGV4ID0gMDsKKwlpZiAodmYtPmxhbl92c2lfaWR4KSB7CisJCWk0MGVfdnNpX3JlbGVhc2UocGYtPnZzaVt2Zi0+bGFuX3ZzaV9pZHhdKTsKKwkJdmYtPmxhbl92c2lfaWR4ID0gMDsKIAkJdmYtPmxhbl92c2lfaWQgPSAwOwogCX0KIAltc2l4X3ZmID0gcGYtPmh3LmZ1bmNfY2Fwcy5udW1fbXNpeF92ZWN0b3JzX3ZmOwpAQCAtNTcxLDkgKzU3NSw5IEBACiAKIC8qKgogICogaTQwZV9hbGxvY192Zl9yZXMKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgaW5mbworICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCiAgKgotICogYWxsb2NhdGUgdmYgcmVzb3VyY2VzCisgKiBhbGxvY2F0ZSBWRiByZXNvdXJjZXMKICAqKi8KIHN0YXRpYyBpbnQgaTQwZV9hbGxvY192Zl9yZXMoc3RydWN0IGk0MGVfdmYgKnZmKQogewpAQCAtNTg1LDE1ICs1ODksMTUgQEAKIAlyZXQgPSBpNDBlX2FsbG9jX3ZzaV9yZXModmYsIEk0MEVfVlNJX1NSSU9WKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycm9yX2FsbG9jOwotCXRvdGFsX3F1ZXVlX3BhaXJzICs9IHBmLT52c2lbdmYtPmxhbl92c2lfaW5kZXhdLT5hbGxvY19xdWV1ZV9wYWlyczsKKwl0b3RhbF9xdWV1ZV9wYWlycyArPSBwZi0+dnNpW3ZmLT5sYW5fdnNpX2lkeF0tPmFsbG9jX3F1ZXVlX3BhaXJzOwogCXNldF9iaXQoSTQwRV9WSVJUQ0hOTF9WRl9DQVBfUFJJVklMRUdFLCAmdmYtPnZmX2NhcHMpOwogCiAJLyogc3RvcmUgdGhlIHRvdGFsIHFwcyBudW1iZXIgZm9yIHRoZSBydW50aW1lCi0JICogdmYgcmVxIHZhbGlkYXRpb24KKwkgKiBWRiByZXEgdmFsaWRhdGlvbgogCSAqLwogCXZmLT5udW1fcXVldWVfcGFpcnMgPSB0b3RhbF9xdWV1ZV9wYWlyczsKIAotCS8qIHZmIGlzIG5vdyBjb21wbGV0ZWx5IGluaXRpYWxpemVkICovCisJLyogVkYgaXMgbm93IGNvbXBsZXRlbHkgaW5pdGlhbGl6ZWQgKi8KIAlzZXRfYml0KEk0MEVfVkZfU1RBVF9JTklULCAmdmYtPnZmX3N0YXRlcyk7CiAKIGVycm9yX2FsbG9jOgpAQCAtNjA3LDcgKzYxMSw3IEBACiAjZGVmaW5lIFZGX1RSQU5TX1BFTkRJTkdfTUFTSyAweDIwCiAvKioKICAqIGk0MGVfcXVpZXNjZV92Zl9wY2kKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgc3RydWN0dXJlCisgKiBAdmY6IHBvaW50ZXIgdG8gdGhlIFZGIHN0cnVjdHVyZQogICoKICAqIFdhaXQgZm9yIFZGIFBDSSB0cmFuc2FjdGlvbnMgdG8gYmUgY2xlYXJlZCBhZnRlciByZXNldC4gUmV0dXJucyAtRUlPCiAgKiBpZiB0aGUgdHJhbnNhY3Rpb25zIG5ldmVyIGNsZWFyLgpAQCAtNjM0LDEwICs2MzgsMTAgQEAKIAogLyoqCiAgKiBpNDBlX3Jlc2V0X3ZmCi0gKiBAdmY6IHBvaW50ZXIgdG8gdGhlIHZmIHN0cnVjdHVyZQorICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBzdHJ1Y3R1cmUKICAqIEBmbHI6IFZGTFIgd2FzIGlzc3VlZCBvciBub3QKICAqCi0gKiByZXNldCB0aGUgdmYKKyAqIHJlc2V0IHRoZSBWRgogICoqLwogdm9pZCBpNDBlX3Jlc2V0X3ZmKHN0cnVjdCBpNDBlX3ZmICp2ZiwgYm9vbCBmbHIpCiB7CkBAIC02NTcsNyArNjYxLDcgQEAKIAkgKiBqdXN0IG5lZWQgdG8gY2xlYW4gdXAsIHNvIGRvbid0IGhpdCB0aGUgVkZSVFJJRyByZWdpc3Rlci4KIAkgKi8KIAlpZiAoIWZscikgewotCQkvKiByZXNldCB2ZiB1c2luZyBWUEdFTl9WRlJUUklHIHJlZyAqLworCQkvKiByZXNldCBWRiB1c2luZyBWUEdFTl9WRlJUUklHIHJlZyAqLwogCQlyZWcgPSByZDMyKGh3LCBJNDBFX1ZQR0VOX1ZGUlRSSUcodmYtPnZmX2lkKSk7CiAJCXJlZyB8PSBJNDBFX1ZQR0VOX1ZGUlRSSUdfVkZTV1JfTUFTSzsKIAkJd3IzMihodywgSTQwRV9WUEdFTl9WRlJUUklHKHZmLT52Zl9pZCksIHJlZyk7CkBAIC02OTUsMTIgKzY5OSwxMiBAQAogCXdyMzIoaHcsIEk0MEVfVlBHRU5fVkZSVFJJRyh2Zi0+dmZfaWQpLCByZWcpOwogCiAJLyogT24gaW5pdGlhbCByZXNldCwgd2Ugd29uJ3QgaGF2ZSBhbnkgcXVldWVzICovCi0JaWYgKHZmLT5sYW5fdnNpX2luZGV4ID09IDApCisJaWYgKHZmLT5sYW5fdnNpX2lkeCA9PSAwKQogCQlnb3RvIGNvbXBsZXRlX3Jlc2V0OwogCi0JaTQwZV92c2lfY29udHJvbF9yaW5ncyhwZi0+dnNpW3ZmLT5sYW5fdnNpX2luZGV4XSwgZmFsc2UpOworCWk0MGVfdnNpX2NvbnRyb2xfcmluZ3MocGYtPnZzaVt2Zi0+bGFuX3ZzaV9pZHhdLCBmYWxzZSk7CiBjb21wbGV0ZV9yZXNldDoKLQkvKiByZWFsbG9jYXRlIHZmIHJlc291cmNlcyB0byByZXNldCB0aGUgVlNJIHN0YXRlICovCisJLyogcmVhbGxvY2F0ZSBWRiByZXNvdXJjZXMgdG8gcmVzZXQgdGhlIFZTSSBzdGF0ZSAqLwogCWk0MGVfZnJlZV92Zl9yZXModmYpOwogCWk0MGVfYWxsb2NfdmZfcmVzKHZmKTsKIAlpNDBlX2VuYWJsZV92Zl9tYXBwaW5ncyh2Zik7CkBAIC03MTMsNzggKzcxNywxMCBAQAogfQogCiAvKioKLSAqIGk0MGVfZW5hYmxlX3BmX3N3aXRjaF9sYgotICogQHBmOiBwb2ludGVyIHRvIHRoZSBwZiBzdHJ1Y3R1cmUKLSAqCi0gKiBlbmFibGUgc3dpdGNoIGxvb3AgYmFjayBvciBkaWUgLSBubyBwb2ludCBpbiBhIHJldHVybiB2YWx1ZQotICoqLwotdm9pZCBpNDBlX2VuYWJsZV9wZl9zd2l0Y2hfbGIoc3RydWN0IGk0MGVfcGYgKnBmKQotewotCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gcGYtPnZzaVtwZi0+bGFuX3ZzaV07Ci0Jc3RydWN0IGk0MGVfdnNpX2NvbnRleHQgY3R4dDsKLQlpbnQgYXFfcmV0OwotCi0JY3R4dC5zZWlkID0gcGYtPm1haW5fdnNpX3NlaWQ7Ci0JY3R4dC5wZl9udW0gPSBwZi0+aHcucGZfaWQ7Ci0JY3R4dC52Zl9udW0gPSAwOwotCWFxX3JldCA9IGk0MGVfYXFfZ2V0X3ZzaV9wYXJhbXMoJnBmLT5odywgJmN0eHQsIE5VTEwpOwotCWlmIChhcV9yZXQpIHsKLQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCi0JCQkgIiVzIGNvdWxkbid0IGdldCBwZiB2c2kgY29uZmlnLCBlcnIgJWQsIGFxX2VyciAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgYXFfcmV0LCBwZi0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLQljdHh0LmZsYWdzID0gSTQwRV9BUV9WU0lfVFlQRV9QRjsKLQljdHh0LmluZm8udmFsaWRfc2VjdGlvbnMgPSBjcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9QUk9QX1NXSVRDSF9WQUxJRCk7Ci0JY3R4dC5pbmZvLnN3aXRjaF9pZCB8PSBjcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9TV19JRF9GTEFHX0FMTE9XX0xCKTsKLQotCWFxX3JldCA9IGk0MGVfYXFfdXBkYXRlX3ZzaV9wYXJhbXMoJnZzaS0+YmFjay0+aHcsICZjdHh0LCBOVUxMKTsKLQlpZiAoYXFfcmV0KSB7Ci0JCWRldl9pbmZvKCZwZi0+cGRldi0+ZGV2LAotCQkJICIlczogdXBkYXRlIHZzaSBzd2l0Y2ggZmFpbGVkLCBhcV9lcnI9JWRcbiIsCi0JCQkgX19mdW5jX18sIHZzaS0+YmFjay0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzKTsKLQl9Ci19Ci0KLS8qKgotICogaTQwZV9kaXNhYmxlX3BmX3N3aXRjaF9sYgotICogQHBmOiBwb2ludGVyIHRvIHRoZSBwZiBzdHJ1Y3R1cmUKLSAqCi0gKiBkaXNhYmxlIHN3aXRjaCBsb29wIGJhY2sgb3IgZGllIC0gbm8gcG9pbnQgaW4gYSByZXR1cm4gdmFsdWUKLSAqKi8KLXN0YXRpYyB2b2lkIGk0MGVfZGlzYWJsZV9wZl9zd2l0Y2hfbGIoc3RydWN0IGk0MGVfcGYgKnBmKQotewotCXN0cnVjdCBpNDBlX3ZzaSAqdnNpID0gcGYtPnZzaVtwZi0+bGFuX3ZzaV07Ci0Jc3RydWN0IGk0MGVfdnNpX2NvbnRleHQgY3R4dDsKLQlpbnQgYXFfcmV0OwotCi0JY3R4dC5zZWlkID0gcGYtPm1haW5fdnNpX3NlaWQ7Ci0JY3R4dC5wZl9udW0gPSBwZi0+aHcucGZfaWQ7Ci0JY3R4dC52Zl9udW0gPSAwOwotCWFxX3JldCA9IGk0MGVfYXFfZ2V0X3ZzaV9wYXJhbXMoJnBmLT5odywgJmN0eHQsIE5VTEwpOwotCWlmIChhcV9yZXQpIHsKLQkJZGV2X2luZm8oJnBmLT5wZGV2LT5kZXYsCi0JCQkgIiVzIGNvdWxkbid0IGdldCBwZiB2c2kgY29uZmlnLCBlcnIgJWQsIGFxX2VyciAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgYXFfcmV0LCBwZi0+aHcuYXEuYXNxX2xhc3Rfc3RhdHVzKTsKLQkJcmV0dXJuOwotCX0KLQljdHh0LmZsYWdzID0gSTQwRV9BUV9WU0lfVFlQRV9QRjsKLQljdHh0LmluZm8udmFsaWRfc2VjdGlvbnMgPSBjcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9QUk9QX1NXSVRDSF9WQUxJRCk7Ci0JY3R4dC5pbmZvLnN3aXRjaF9pZCAmPSB+Y3B1X3RvX2xlMTYoSTQwRV9BUV9WU0lfU1dfSURfRkxBR19BTExPV19MQik7Ci0KLQlhcV9yZXQgPSBpNDBlX2FxX3VwZGF0ZV92c2lfcGFyYW1zKCZ2c2ktPmJhY2stPmh3LCAmY3R4dCwgTlVMTCk7Ci0JaWYgKGFxX3JldCkgewotCQlkZXZfaW5mbygmcGYtPnBkZXYtPmRldiwKLQkJCSAiJXM6IHVwZGF0ZSB2c2kgc3dpdGNoIGZhaWxlZCwgYXFfZXJyPSVkXG4iLAotCQkJIF9fZnVuY19fLCB2c2ktPmJhY2stPmh3LmFxLmFzcV9sYXN0X3N0YXR1cyk7Ci0JfQotfQotCi0vKioKICAqIGk0MGVfZnJlZV92ZnMKLSAqIEBwZjogcG9pbnRlciB0byB0aGUgcGYgc3RydWN0dXJlCisgKiBAcGY6IHBvaW50ZXIgdG8gdGhlIFBGIHN0cnVjdHVyZQogICoKLSAqIGZyZWUgdmYgcmVzb3VyY2VzCisgKiBmcmVlIFZGIHJlc291cmNlcwogICoqLwogdm9pZCBpNDBlX2ZyZWVfdmZzKHN0cnVjdCBpNDBlX3BmICpwZikKIHsKQEAgLTgwMywxMCArNzM5LDEyIEBACiAJICovCiAJaWYgKCFwY2lfdmZzX2Fzc2lnbmVkKHBmLT5wZGV2KSkKIAkJcGNpX2Rpc2FibGVfc3Jpb3YocGYtPnBkZXYpOworCWVsc2UKKwkJZGV2X3dhcm4oJnBmLT5wZGV2LT5kZXYsICJWRnMgYXJlIGFzc2lnbmVkIC0gbm90IGRpc2FibGluZyBTUi1JT1ZcbiIpOwogCiAJbXNsZWVwKDIwKTsgLyogbGV0IGFueSBtZXNzYWdlcyBpbiB0cmFuc2l0IGdldCBmaW5pc2hlZCB1cCAqLwogCi0JLyogZnJlZSB1cCB2ZiByZXNvdXJjZXMgKi8KKwkvKiBmcmVlIHVwIFZGIHJlc291cmNlcyAqLwogCXRtcCA9IHBmLT5udW1fYWxsb2NfdmZzOwogCXBmLT5udW1fYWxsb2NfdmZzID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgdG1wOyBpKyspIHsKQEAgLTgzMiwxMCArNzcwLDYgQEAKIAkJCWJpdF9pZHggPSAoaHctPmZ1bmNfY2Fwcy52Zl9iYXNlX2lkICsgdmZfaWQpICUgMzI7CiAJCQl3cjMyKGh3LCBJNDBFX0dMR0VOX1ZGTFJTVEFUKHJlZ19pZHgpLCAoMSA8PCBiaXRfaWR4KSk7CiAJCX0KLQkJaTQwZV9kaXNhYmxlX3BmX3N3aXRjaF9sYihwZik7Ci0JfSBlbHNlIHsKLQkJZGV2X3dhcm4oJnBmLT5wZGV2LT5kZXYsCi0JCQkgInVuYWJsZSB0byBkaXNhYmxlIFNSLUlPViBiZWNhdXNlIFZGcyBhcmUgYXNzaWduZWQuXG4iKTsKIAl9CiAJY2xlYXJfYml0KF9fSTQwRV9WRl9ESVNBQkxFLCAmcGYtPnN0YXRlKTsKIH0KQEAgLTg0MywxMCArNzc3LDEwIEBACiAjaWZkZWYgQ09ORklHX1BDSV9JT1YKIC8qKgogICogaTQwZV9hbGxvY192ZnMKLSAqIEBwZjogcG9pbnRlciB0byB0aGUgcGYgc3RydWN0dXJlCi0gKiBAbnVtX2FsbG9jX3ZmczogbnVtYmVyIG9mIHZmcyB0byBhbGxvY2F0ZQorICogQHBmOiBwb2ludGVyIHRvIHRoZSBQRiBzdHJ1Y3R1cmUKKyAqIEBudW1fYWxsb2NfdmZzOiBudW1iZXIgb2YgVkZzIHRvIGFsbG9jYXRlCiAgKgotICogYWxsb2NhdGUgdmYgcmVzb3VyY2VzCisgKiBhbGxvY2F0ZSBWRiByZXNvdXJjZXMKICAqKi8KIGludCBpNDBlX2FsbG9jX3ZmcyhzdHJ1Y3QgaTQwZV9wZiAqcGYsIHUxNiBudW1fYWxsb2NfdmZzKQogewpAQCAtODgzLDE1ICs4MTcsMTQgQEAKIAkJLyogYXNzaWduIGRlZmF1bHQgY2FwYWJpbGl0aWVzICovCiAJCXNldF9iaXQoSTQwRV9WSVJUQ0hOTF9WRl9DQVBfTDIsICZ2ZnNbaV0udmZfY2Fwcyk7CiAJCXZmc1tpXS5zcG9vZmNoayA9IHRydWU7Ci0JCS8qIHZmIHJlc291cmNlcyBnZXQgYWxsb2NhdGVkIGR1cmluZyByZXNldCAqLworCQkvKiBWRiByZXNvdXJjZXMgZ2V0IGFsbG9jYXRlZCBkdXJpbmcgcmVzZXQgKi8KIAkJaTQwZV9yZXNldF92ZigmdmZzW2ldLCBmYWxzZSk7CiAKLQkJLyogZW5hYmxlIHZmIHZwbGFuX3F0YWJsZSBtYXBwaW5ncyAqLworCQkvKiBlbmFibGUgVkYgdnBsYW5fcXRhYmxlIG1hcHBpbmdzICovCiAJCWk0MGVfZW5hYmxlX3ZmX21hcHBpbmdzKCZ2ZnNbaV0pOwogCX0KIAlwZi0+bnVtX2FsbG9jX3ZmcyA9IG51bV9hbGxvY192ZnM7CiAKLQlpNDBlX2VuYWJsZV9wZl9zd2l0Y2hfbGIocGYpOwogZXJyX2FsbG9jOgogCWlmIChyZXQpCiAJCWk0MGVfZnJlZV92ZnMocGYpOwpAQCAtOTA1LDcgKzgzOCw3IEBACiAvKioKICAqIGk0MGVfcGNpX3NyaW92X2VuYWJsZQogICogQHBkZXY6IHBvaW50ZXIgdG8gYSBwY2lfZGV2IHN0cnVjdHVyZQotICogQG51bV92ZnM6IG51bWJlciBvZiB2ZnMgdG8gYWxsb2NhdGUKKyAqIEBudW1fdmZzOiBudW1iZXIgb2YgVkZzIHRvIGFsbG9jYXRlCiAgKgogICogRW5hYmxlIG9yIGNoYW5nZSB0aGUgbnVtYmVyIG9mIFZGcwogICoqLwpAQCAtOTQ1LDcgKzg3OCw3IEBACiAvKioKICAqIGk0MGVfcGNpX3NyaW92X2NvbmZpZ3VyZQogICogQHBkZXY6IHBvaW50ZXIgdG8gYSBwY2lfZGV2IHN0cnVjdHVyZQotICogQG51bV92ZnM6IG51bWJlciBvZiB2ZnMgdG8gYWxsb2NhdGUKKyAqIEBudW1fdmZzOiBudW1iZXIgb2YgVkZzIHRvIGFsbG9jYXRlCiAgKgogICogRW5hYmxlIG9yIGNoYW5nZSB0aGUgbnVtYmVyIG9mIFZGcy4gQ2FsbGVkIHdoZW4gdGhlIHVzZXIgdXBkYXRlcyB0aGUgbnVtYmVyCiAgKiBvZiBWRnMgaW4gc3lzZnMuCkBAIC05NzAsMTMgKzkwMywxMyBAQAogCiAvKioKICAqIGk0MGVfdmNfc2VuZF9tc2dfdG9fdmYKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgaW5mbworICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCiAgKiBAdl9vcGNvZGU6IHZpcnR1YWwgY2hhbm5lbCBvcGNvZGUKICAqIEB2X3JldHZhbDogdmlydHVhbCBjaGFubmVsIHJldHVybiB2YWx1ZQogICogQG1zZzogcG9pbnRlciB0byB0aGUgbXNnIGJ1ZmZlcgogICogQG1zZ2xlbjogbXNnIGxlbmd0aAogICoKLSAqIHNlbmQgbXNnIHRvIHZmCisgKiBzZW5kIG1zZyB0byBWRgogICoqLwogc3RhdGljIGludCBpNDBlX3ZjX3NlbmRfbXNnX3RvX3ZmKHN0cnVjdCBpNDBlX3ZmICp2ZiwgdTMyIHZfb3Bjb2RlLAogCQkJCSAgdTMyIHZfcmV0dmFsLCB1OCAqbXNnLCB1MTYgbXNnbGVuKQpAQCAtMTAyNSwxMSArOTU4LDExIEBACiAKIC8qKgogICogaTQwZV92Y19zZW5kX3Jlc3BfdG9fdmYKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgaW5mbworICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCiAgKiBAb3Bjb2RlOiBvcGVyYXRpb24gY29kZQogICogQHJldHZhbDogcmV0dXJuIHZhbHVlCiAgKgotICogc2VuZCByZXNwIG1zZyB0byB2ZgorICogc2VuZCByZXNwIG1zZyB0byBWRgogICoqLwogc3RhdGljIGludCBpNDBlX3ZjX3NlbmRfcmVzcF90b192ZihzdHJ1Y3QgaTQwZV92ZiAqdmYsCiAJCQkJICAgZW51bSBpNDBlX3ZpcnRjaG5sX29wcyBvcGNvZGUsCkBAIC0xMDQwLDkgKzk3Myw5IEBACiAKIC8qKgogICogaTQwZV92Y19nZXRfdmVyc2lvbl9tc2cKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgaW5mbworICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCiAgKgotICogY2FsbGVkIGZyb20gdGhlIHZmIHRvIHJlcXVlc3QgdGhlIEFQSSB2ZXJzaW9uIHVzZWQgYnkgdGhlIFBGCisgKiBjYWxsZWQgZnJvbSB0aGUgVkYgdG8gcmVxdWVzdCB0aGUgQVBJIHZlcnNpb24gdXNlZCBieSB0aGUgUEYKICAqKi8KIHN0YXRpYyBpbnQgaTQwZV92Y19nZXRfdmVyc2lvbl9tc2coc3RydWN0IGk0MGVfdmYgKnZmKQogewpAQCAtMTA1OCwxMSArOTkxLDExIEBACiAKIC8qKgogICogaTQwZV92Y19nZXRfdmZfcmVzb3VyY2VzX21zZwotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCisgKiBAdmY6IHBvaW50ZXIgdG8gdGhlIFZGIGluZm8KICAqIEBtc2c6IHBvaW50ZXIgdG8gdGhlIG1zZyBidWZmZXIKICAqIEBtc2dsZW46IG1zZyBsZW5ndGgKICAqCi0gKiBjYWxsZWQgZnJvbSB0aGUgdmYgdG8gcmVxdWVzdCBpdHMgcmVzb3VyY2VzCisgKiBjYWxsZWQgZnJvbSB0aGUgVkYgdG8gcmVxdWVzdCBpdHMgcmVzb3VyY2VzCiAgKiovCiBzdGF0aWMgaW50IGk0MGVfdmNfZ2V0X3ZmX3Jlc291cmNlc19tc2coc3RydWN0IGk0MGVfdmYgKnZmKQogewpAQCAtMTA5MCwxOCArMTAyMywxOCBAQAogCX0KIAogCXZmcmVzLT52Zl9vZmZsb2FkX2ZsYWdzID0gSTQwRV9WSVJUQ0hOTF9WRl9PRkZMT0FEX0wyOwotCXZzaSA9IHBmLT52c2lbdmYtPmxhbl92c2lfaW5kZXhdOworCXZzaSA9IHBmLT52c2lbdmYtPmxhbl92c2lfaWR4XTsKIAlpZiAoIXZzaS0+aW5mby5wdmlkKQogCQl2ZnJlcy0+dmZfb2ZmbG9hZF9mbGFncyB8PSBJNDBFX1ZJUlRDSE5MX1ZGX09GRkxPQURfVkxBTjsKIAogCXZmcmVzLT5udW1fdnNpcyA9IG51bV92c2lzOwogCXZmcmVzLT5udW1fcXVldWVfcGFpcnMgPSB2Zi0+bnVtX3F1ZXVlX3BhaXJzOwogCXZmcmVzLT5tYXhfdmVjdG9ycyA9IHBmLT5ody5mdW5jX2NhcHMubnVtX21zaXhfdmVjdG9yc192ZjsKLQlpZiAodmYtPmxhbl92c2lfaW5kZXgpIHsKLQkJdmZyZXMtPnZzaV9yZXNbaV0udnNpX2lkID0gdmYtPmxhbl92c2lfaW5kZXg7CisJaWYgKHZmLT5sYW5fdnNpX2lkeCkgeworCQl2ZnJlcy0+dnNpX3Jlc1tpXS52c2lfaWQgPSB2Zi0+bGFuX3ZzaV9pZDsKIAkJdmZyZXMtPnZzaV9yZXNbaV0udnNpX3R5cGUgPSBJNDBFX1ZTSV9TUklPVjsKIAkJdmZyZXMtPnZzaV9yZXNbaV0ubnVtX3F1ZXVlX3BhaXJzID0KLQkJICAgIHBmLT52c2lbdmYtPmxhbl92c2lfaW5kZXhdLT5hbGxvY19xdWV1ZV9wYWlyczsKKwkJICAgIHBmLT52c2lbdmYtPmxhbl92c2lfaWR4XS0+YWxsb2NfcXVldWVfcGFpcnM7CiAJCW1lbWNweSh2ZnJlcy0+dnNpX3Jlc1tpXS5kZWZhdWx0X21hY19hZGRyLAogCQkgICAgICAgdmYtPmRlZmF1bHRfbGFuX2FkZHIuYWRkciwgRVRIX0FMRU4pOwogCQlpKys7CkBAIC0xMTA5LDcgKzEwNDIsNyBAQAogCXNldF9iaXQoSTQwRV9WRl9TVEFUX0FDVElWRSwgJnZmLT52Zl9zdGF0ZXMpOwogCiBlcnI6Ci0JLyogc2VuZCB0aGUgcmVzcG9uc2UgYmFjayB0byB0aGUgdmYgKi8KKwkvKiBzZW5kIHRoZSByZXNwb25zZSBiYWNrIHRvIHRoZSBWRiAqLwogCXJldCA9IGk0MGVfdmNfc2VuZF9tc2dfdG9fdmYodmYsIEk0MEVfVklSVENITkxfT1BfR0VUX1ZGX1JFU09VUkNFUywKIAkJCQkgICAgIGFxX3JldCwgKHU4ICopdmZyZXMsIGxlbik7CiAKQEAgLTExMTksMTMgKzEwNTIsMTMgQEAKIAogLyoqCiAgKiBpNDBlX3ZjX3Jlc2V0X3ZmX21zZwotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCisgKiBAdmY6IHBvaW50ZXIgdG8gdGhlIFZGIGluZm8KICAqIEBtc2c6IHBvaW50ZXIgdG8gdGhlIG1zZyBidWZmZXIKICAqIEBtc2dsZW46IG1zZyBsZW5ndGgKICAqCi0gKiBjYWxsZWQgZnJvbSB0aGUgdmYgdG8gcmVzZXQgaXRzZWxmLAotICogdW5saWtlIG90aGVyIHZpcnRjaG5sIG1lc3NhZ2VzLCBwZiBkcml2ZXIKLSAqIGRvZXNuJ3Qgc2VuZCB0aGUgcmVzcG9uc2UgYmFjayB0byB0aGUgdmYKKyAqIGNhbGxlZCBmcm9tIHRoZSBWRiB0byByZXNldCBpdHNlbGYsCisgKiB1bmxpa2Ugb3RoZXIgdmlydGNobmwgbWVzc2FnZXMsIFBGIGRyaXZlcgorICogZG9lc24ndCBzZW5kIHRoZSByZXNwb25zZSBiYWNrIHRvIHRoZSBWRgogICoqLwogc3RhdGljIHZvaWQgaTQwZV92Y19yZXNldF92Zl9tc2coc3RydWN0IGk0MGVfdmYgKnZmKQogewpAQCAtMTEzNSwxMiArMTA2OCwxMiBAQAogCiAvKioKICAqIGk0MGVfdmNfY29uZmlnX3Byb21pc2N1b3VzX21vZGVfbXNnCi0gKiBAdmY6IHBvaW50ZXIgdG8gdGhlIHZmIGluZm8KKyAqIEB2ZjogcG9pbnRlciB0byB0aGUgVkYgaW5mbwogICogQG1zZzogcG9pbnRlciB0byB0aGUgbXNnIGJ1ZmZlcgogICogQG1zZ2xlbjogbXNnIGxlbmd0aAogICoKLSAqIGNhbGxlZCBmcm9tIHRoZSB2ZiB0byBjb25maWd1cmUgdGhlIHByb21pc2N1b3VzIG1vZGUgb2YKLSAqIHZmIHZzaXMKKyAqIGNhbGxlZCBmcm9tIHRoZSBWRiB0byBjb25maWd1cmUgdGhlIHByb21pc2N1b3VzIG1vZGUgb2YKKyAqIFZGIHZzaXMKICAqKi8KIHN0YXRpYyBpbnQgaTQwZV92Y19jb25maWdfcHJvbWlzY3VvdXNfbW9kZV9tc2coc3RydWN0IGk0MGVfdmYgKnZmLAogCQkJCQkgICAgICAgdTggKm1zZywgdTE2IG1zZ2xlbikKQEAgLTExNTMsMjEgKzEwODYsMjEgQEAKIAlib29sIGFsbG11bHRpID0gZmFsc2U7CiAJaTQwZV9zdGF0dXMgYXFfcmV0OwogCisJdnNpID0gaTQwZV9maW5kX3ZzaV9mcm9tX2lkKHBmLCBpbmZvLT52c2lfaWQpOwogCWlmICghdGVzdF9iaXQoSTQwRV9WRl9TVEFUX0FDVElWRSwgJnZmLT52Zl9zdGF0ZXMpIHx8CiAJICAgICF0ZXN0X2JpdChJNDBFX1ZJUlRDSE5MX1ZGX0NBUF9QUklWSUxFR0UsICZ2Zi0+dmZfY2FwcykgfHwKIAkgICAgIWk0MGVfdmNfaXN2YWxpZF92c2lfaWQodmYsIGluZm8tPnZzaV9pZCkgfHwKLQkgICAgKHBmLT52c2lbaW5mby0+dnNpX2lkXS0+dHlwZSAhPSBJNDBFX1ZTSV9GQ09FKSkgeworCSAgICAodnNpLT50eXBlICE9IEk0MEVfVlNJX0ZDT0UpKSB7CiAJCWFxX3JldCA9IEk0MEVfRVJSX1BBUkFNOwogCQlnb3RvIGVycm9yX3BhcmFtOwogCX0KLQl2c2kgPSBwZi0+dnNpW2luZm8tPnZzaV9pZF07CiAJaWYgKGluZm8tPmZsYWdzICYgSTQwRV9GTEFHX1ZGX01VTFRJQ0FTVF9QUk9NSVNDKQogCQlhbGxtdWx0aSA9IHRydWU7CiAJYXFfcmV0ID0gaTQwZV9hcV9zZXRfdnNpX211bHRpY2FzdF9wcm9taXNjdW91cyhodywgdnNpLT5zZWlkLAogCQkJCQkJICAgICAgIGFsbG11bHRpLCBOVUxMKTsKIAogZXJyb3JfcGFyYW06Ci0JLyogc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIHZmICovCisJLyogc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIFZGICovCiAJcmV0dXJuIGk0MGVfdmNfc2VuZF9yZXNwX3RvX3ZmKHZmLAogCQkJCSAgICAgICBJNDBFX1ZJUlRDSE5MX09QX0NPTkZJR19QUk9NSVNDVU9VU19NT0RFLAogCQkJCSAgICAgICBhcV9yZXQpOwpAQCAtMTE3NSwxMSArMTEwOCwxMSBAQAogCiAvKioKICAqIGk0MGVfdmNfY29uZmlnX3F1ZXVlc19tc2cKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgaW5mbworICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCiAgKiBAbXNnOiBwb2ludGVyIHRvIHRoZSBtc2cgYnVmZmVyCiAgKiBAbXNnbGVuOiBtc2cgbGVuZ3RoCiAgKgotICogY2FsbGVkIGZyb20gdGhlIHZmIHRvIGNvbmZpZ3VyZSB0aGUgcngvdHgKKyAqIGNhbGxlZCBmcm9tIHRoZSBWRiB0byBjb25maWd1cmUgdGhlIHJ4L3R4CiAgKiBxdWV1ZXMKICAqKi8KIHN0YXRpYyBpbnQgaTQwZV92Y19jb25maWdfcXVldWVzX21zZyhzdHJ1Y3QgaTQwZV92ZiAqdmYsIHU4ICptc2csIHUxNiBtc2dsZW4pCkBAIC0xMjIxLDIyICsxMTU0LDIyIEBACiAJCQlnb3RvIGVycm9yX3BhcmFtOwogCQl9CiAJfQotCS8qIHNldCB2c2kgbnVtX3F1ZXVlX3BhaXJzIGluIHVzZSB0byBudW0gY29uZmlndXJlZCBieSB2ZiAqLwotCXBmLT52c2lbdmYtPmxhbl92c2lfaW5kZXhdLT5udW1fcXVldWVfcGFpcnMgPSBxY2ktPm51bV9xdWV1ZV9wYWlyczsKKwkvKiBzZXQgdnNpIG51bV9xdWV1ZV9wYWlycyBpbiB1c2UgdG8gbnVtIGNvbmZpZ3VyZWQgYnkgVkYgKi8KKwlwZi0+dnNpW3ZmLT5sYW5fdnNpX2lkeF0tPm51bV9xdWV1ZV9wYWlycyA9IHFjaS0+bnVtX3F1ZXVlX3BhaXJzOwogCiBlcnJvcl9wYXJhbToKLQkvKiBzZW5kIHRoZSByZXNwb25zZSB0byB0aGUgdmYgKi8KKwkvKiBzZW5kIHRoZSByZXNwb25zZSB0byB0aGUgVkYgKi8KIAlyZXR1cm4gaTQwZV92Y19zZW5kX3Jlc3BfdG9fdmYodmYsIEk0MEVfVklSVENITkxfT1BfQ09ORklHX1ZTSV9RVUVVRVMsCiAJCQkJICAgICAgIGFxX3JldCk7CiB9CiAKIC8qKgogICogaTQwZV92Y19jb25maWdfaXJxX21hcF9tc2cKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgaW5mbworICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCiAgKiBAbXNnOiBwb2ludGVyIHRvIHRoZSBtc2cgYnVmZmVyCiAgKiBAbXNnbGVuOiBtc2cgbGVuZ3RoCiAgKgotICogY2FsbGVkIGZyb20gdGhlIHZmIHRvIGNvbmZpZ3VyZSB0aGUgaXJxIHRvCisgKiBjYWxsZWQgZnJvbSB0aGUgVkYgdG8gY29uZmlndXJlIHRoZSBpcnEgdG8KICAqIHF1ZXVlIG1hcAogICoqLwogc3RhdGljIGludCBpNDBlX3ZjX2NvbmZpZ19pcnFfbWFwX21zZyhzdHJ1Y3QgaTQwZV92ZiAqdmYsIHU4ICptc2csIHUxNiBtc2dsZW4pCkBAIC0xMjg4LDE4ICsxMjIxLDE4IEBACiAJCWk0MGVfY29uZmlnX2lycV9saW5rX2xpc3QodmYsIHZzaV9pZCwgbWFwKTsKIAl9CiBlcnJvcl9wYXJhbToKLQkvKiBzZW5kIHRoZSByZXNwb25zZSB0byB0aGUgdmYgKi8KKwkvKiBzZW5kIHRoZSByZXNwb25zZSB0byB0aGUgVkYgKi8KIAlyZXR1cm4gaTQwZV92Y19zZW5kX3Jlc3BfdG9fdmYodmYsIEk0MEVfVklSVENITkxfT1BfQ09ORklHX0lSUV9NQVAsCiAJCQkJICAgICAgIGFxX3JldCk7CiB9CiAKIC8qKgogICogaTQwZV92Y19lbmFibGVfcXVldWVzX21zZwotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCisgKiBAdmY6IHBvaW50ZXIgdG8gdGhlIFZGIGluZm8KICAqIEBtc2c6IHBvaW50ZXIgdG8gdGhlIG1zZyBidWZmZXIKICAqIEBtc2dsZW46IG1zZyBsZW5ndGgKICAqCi0gKiBjYWxsZWQgZnJvbSB0aGUgdmYgdG8gZW5hYmxlIGFsbCBvciBzcGVjaWZpYyBxdWV1ZShzKQorICogY2FsbGVkIGZyb20gdGhlIFZGIHRvIGVuYWJsZSBhbGwgb3Igc3BlY2lmaWMgcXVldWUocykKICAqKi8KIHN0YXRpYyBpbnQgaTQwZV92Y19lbmFibGVfcXVldWVzX21zZyhzdHJ1Y3QgaTQwZV92ZiAqdmYsIHU4ICptc2csIHUxNiBtc2dsZW4pCiB7CkBAIC0xMzIzLDIxICsxMjU2LDIyIEBACiAJCWFxX3JldCA9IEk0MEVfRVJSX1BBUkFNOwogCQlnb3RvIGVycm9yX3BhcmFtOwogCX0KLQlpZiAoaTQwZV92c2lfY29udHJvbF9yaW5ncyhwZi0+dnNpW3ZzaV9pZF0sIHRydWUpKQorCisJaWYgKGk0MGVfdnNpX2NvbnRyb2xfcmluZ3MocGYtPnZzaVt2Zi0+bGFuX3ZzaV9pZHhdLCB0cnVlKSkKIAkJYXFfcmV0ID0gSTQwRV9FUlJfVElNRU9VVDsKIGVycm9yX3BhcmFtOgotCS8qIHNlbmQgdGhlIHJlc3BvbnNlIHRvIHRoZSB2ZiAqLworCS8qIHNlbmQgdGhlIHJlc3BvbnNlIHRvIHRoZSBWRiAqLwogCXJldHVybiBpNDBlX3ZjX3NlbmRfcmVzcF90b192Zih2ZiwgSTQwRV9WSVJUQ0hOTF9PUF9FTkFCTEVfUVVFVUVTLAogCQkJCSAgICAgICBhcV9yZXQpOwogfQogCiAvKioKICAqIGk0MGVfdmNfZGlzYWJsZV9xdWV1ZXNfbXNnCi0gKiBAdmY6IHBvaW50ZXIgdG8gdGhlIHZmIGluZm8KKyAqIEB2ZjogcG9pbnRlciB0byB0aGUgVkYgaW5mbwogICogQG1zZzogcG9pbnRlciB0byB0aGUgbXNnIGJ1ZmZlcgogICogQG1zZ2xlbjogbXNnIGxlbmd0aAogICoKLSAqIGNhbGxlZCBmcm9tIHRoZSB2ZiB0byBkaXNhYmxlIGFsbCBvciBzcGVjaWZpYworICogY2FsbGVkIGZyb20gdGhlIFZGIHRvIGRpc2FibGUgYWxsIG9yIHNwZWNpZmljCiAgKiBxdWV1ZShzKQogICoqLwogc3RhdGljIGludCBpNDBlX3ZjX2Rpc2FibGVfcXVldWVzX21zZyhzdHJ1Y3QgaTQwZV92ZiAqdmYsIHU4ICptc2csIHUxNiBtc2dsZW4pCkBAIC0xMzQ1LDcgKzEyNzksNiBAQAogCXN0cnVjdCBpNDBlX3ZpcnRjaG5sX3F1ZXVlX3NlbGVjdCAqdnFzID0KIAkgICAgKHN0cnVjdCBpNDBlX3ZpcnRjaG5sX3F1ZXVlX3NlbGVjdCAqKW1zZzsKIAlzdHJ1Y3QgaTQwZV9wZiAqcGYgPSB2Zi0+cGY7Ci0JdTE2IHZzaV9pZCA9IHZxcy0+dnNpX2lkOwogCWk0MGVfc3RhdHVzIGFxX3JldCA9IDA7CiAKIAlpZiAoIXRlc3RfYml0KEk0MEVfVkZfU1RBVF9BQ1RJVkUsICZ2Zi0+dmZfc3RhdGVzKSkgewpAQCAtMTM2MiwyMiArMTI5NSwyMyBAQAogCQlhcV9yZXQgPSBJNDBFX0VSUl9QQVJBTTsKIAkJZ290byBlcnJvcl9wYXJhbTsKIAl9Ci0JaWYgKGk0MGVfdnNpX2NvbnRyb2xfcmluZ3MocGYtPnZzaVt2c2lfaWRdLCBmYWxzZSkpCisKKwlpZiAoaTQwZV92c2lfY29udHJvbF9yaW5ncyhwZi0+dnNpW3ZmLT5sYW5fdnNpX2lkeF0sIGZhbHNlKSkKIAkJYXFfcmV0ID0gSTQwRV9FUlJfVElNRU9VVDsKIAogZXJyb3JfcGFyYW06Ci0JLyogc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIHZmICovCisJLyogc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIFZGICovCiAJcmV0dXJuIGk0MGVfdmNfc2VuZF9yZXNwX3RvX3ZmKHZmLCBJNDBFX1ZJUlRDSE5MX09QX0RJU0FCTEVfUVVFVUVTLAogCQkJCSAgICAgICBhcV9yZXQpOwogfQogCiAvKioKICAqIGk0MGVfdmNfZ2V0X3N0YXRzX21zZwotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCisgKiBAdmY6IHBvaW50ZXIgdG8gdGhlIFZGIGluZm8KICAqIEBtc2c6IHBvaW50ZXIgdG8gdGhlIG1zZyBidWZmZXIKICAqIEBtc2dsZW46IG1zZyBsZW5ndGgKICAqCi0gKiBjYWxsZWQgZnJvbSB0aGUgdmYgdG8gZ2V0IHZzaSBzdGF0cworICogY2FsbGVkIGZyb20gdGhlIFZGIHRvIGdldCB2c2kgc3RhdHMKICAqKi8KIHN0YXRpYyBpbnQgaTQwZV92Y19nZXRfc3RhdHNfbXNnKHN0cnVjdCBpNDBlX3ZmICp2ZiwgdTggKm1zZywgdTE2IG1zZ2xlbikKIHsKQEAgLTE0MDAsNyArMTMzNCw3IEBACiAJCWdvdG8gZXJyb3JfcGFyYW07CiAJfQogCi0JdnNpID0gcGYtPnZzaVt2cXMtPnZzaV9pZF07CisJdnNpID0gcGYtPnZzaVt2Zi0+bGFuX3ZzaV9pZHhdOwogCWlmICghdnNpKSB7CiAJCWFxX3JldCA9IEk0MEVfRVJSX1BBUkFNOwogCQlnb3RvIGVycm9yX3BhcmFtOwpAQCAtMTQwOSwxNCArMTM0MywxNCBAQAogCXN0YXRzID0gdnNpLT5ldGhfc3RhdHM7CiAKIGVycm9yX3BhcmFtOgotCS8qIHNlbmQgdGhlIHJlc3BvbnNlIGJhY2sgdG8gdGhlIHZmICovCisJLyogc2VuZCB0aGUgcmVzcG9uc2UgYmFjayB0byB0aGUgVkYgKi8KIAlyZXR1cm4gaTQwZV92Y19zZW5kX21zZ190b192Zih2ZiwgSTQwRV9WSVJUQ0hOTF9PUF9HRVRfU1RBVFMsIGFxX3JldCwKIAkJCQkgICAgICAodTggKikmc3RhdHMsIHNpemVvZihzdGF0cykpOwogfQogCiAvKioKICAqIGk0MGVfY2hlY2tfdmZfcGVybWlzc2lvbgotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCisgKiBAdmY6IHBvaW50ZXIgdG8gdGhlIFZGIGluZm8KICAqIEBtYWNhZGRyOiBwb2ludGVyIHRvIHRoZSBNQUMgQWRkcmVzcyBiZWluZyBjaGVja2VkCiAgKgogICogQ2hlY2sgaWYgdGhlIFZGIGhhcyBwZXJtaXNzaW9uIHRvIGFkZCBvciBkZWxldGUgdW5pY2FzdCBNQUMgYWRkcmVzcwpAQCAtMTQ1MCw3ICsxMzg0LDcgQEAKIAogLyoqCiAgKiBpNDBlX3ZjX2FkZF9tYWNfYWRkcl9tc2cKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgaW5mbworICogQHZmOiBwb2ludGVyIHRvIHRoZSBWRiBpbmZvCiAgKiBAbXNnOiBwb2ludGVyIHRvIHRoZSBtc2cgYnVmZmVyCiAgKiBAbXNnbGVuOiBtc2cgbGVuZ3RoCiAgKgpAQCAtMTQ3OCw3ICsxNDEyLDcgQEAKIAkJaWYgKHJldCkKIAkJCWdvdG8gZXJyb3JfcGFyYW07CiAJfQotCXZzaSA9IHBmLT52c2lbdnNpX2lkXTsKKwl2c2kgPSBwZi0+dnNpW3ZmLT5sYW5fdnNpX2lkeF07CiAKIAkvKiBhZGQgbmV3IGFkZHJlc3NlcyB0byB0aGUgbGlzdCAqLwogCWZvciAoaSA9IDA7IGkgPCBhbC0+bnVtX2VsZW1lbnRzOyBpKyspIHsKQEAgLTE1MDcsMTQgKzE0NDEsMTQgQEAKIAkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwgIlVuYWJsZSB0byBwcm9ncmFtIFZGIE1BQyBmaWx0ZXJzXG4iKTsKIAogZXJyb3JfcGFyYW06Ci0JLyogc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIHZmICovCisJLyogc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIFZGICovCiAJcmV0dXJuIGk0MGVfdmNfc2VuZF9yZXNwX3RvX3ZmKHZmLCBJNDBFX1ZJUlRDSE5MX09QX0FERF9FVEhFUl9BRERSRVNTLAogCQkJCSAgICAgICByZXQpOwogfQogCiAvKioKICAqIGk0MGVfdmNfZGVsX21hY19hZGRyX21zZwotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCisgKiBAdmY6IHBvaW50ZXIgdG8gdGhlIFZGIGluZm8KICAqIEBtc2c6IHBvaW50ZXIgdG8gdGhlIG1zZyBidWZmZXIKICAqIEBtc2dsZW46IG1zZyBsZW5ndGgKICAqCkBAIC0xNTQ2LDcgKzE0ODAsNyBAQAogCQkJZ290byBlcnJvcl9wYXJhbTsKIAkJfQogCX0KLQl2c2kgPSBwZi0+dnNpW3ZzaV9pZF07CisJdnNpID0gcGYtPnZzaVt2Zi0+bGFuX3ZzaV9pZHhdOwogCiAJLyogZGVsZXRlIGFkZHJlc3NlcyBmcm9tIHRoZSBsaXN0ICovCiAJZm9yIChpID0gMDsgaSA8IGFsLT5udW1fZWxlbWVudHM7IGkrKykKQEAgLTE1NTgsMTQgKzE0OTIsMTQgQEAKIAkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwgIlVuYWJsZSB0byBwcm9ncmFtIFZGIE1BQyBmaWx0ZXJzXG4iKTsKIAogZXJyb3JfcGFyYW06Ci0JLyogc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIHZmICovCisJLyogc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIFZGICovCiAJcmV0dXJuIGk0MGVfdmNfc2VuZF9yZXNwX3RvX3ZmKHZmLCBJNDBFX1ZJUlRDSE5MX09QX0RFTF9FVEhFUl9BRERSRVNTLAogCQkJCSAgICAgICByZXQpOwogfQogCiAvKioKICAqIGk0MGVfdmNfYWRkX3ZsYW5fbXNnCi0gKiBAdmY6IHBvaW50ZXIgdG8gdGhlIHZmIGluZm8KKyAqIEB2ZjogcG9pbnRlciB0byB0aGUgVkYgaW5mbwogICogQG1zZzogcG9pbnRlciB0byB0aGUgbXNnIGJ1ZmZlcgogICogQG1zZ2xlbjogbXNnIGxlbmd0aAogICoKQEAgLTE1OTYsNyArMTUzMCw3IEBACiAJCQlnb3RvIGVycm9yX3BhcmFtOwogCQl9CiAJfQotCXZzaSA9IHBmLT52c2lbdnNpX2lkXTsKKwl2c2kgPSBwZi0+dnNpW3ZmLT5sYW5fdnNpX2lkeF07CiAJaWYgKHZzaS0+aW5mby5wdmlkKSB7CiAJCWFxX3JldCA9IEk0MEVfRVJSX1BBUkFNOwogCQlnb3RvIGVycm9yX3BhcmFtOwpAQCAtMTYxMywxMyArMTU0NywxMyBAQAogCX0KIAogZXJyb3JfcGFyYW06Ci0JLyogc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIHZmICovCisJLyogc2VuZCB0aGUgcmVzcG9uc2UgdG8gdGhlIFZGICovCiAJcmV0dXJuIGk0MGVfdmNfc2VuZF9yZXNwX3RvX3ZmKHZmLCBJNDBFX1ZJUlRDSE5MX09QX0FERF9WTEFOLCBhcV9yZXQpOwogfQogCiAvKioKICAqIGk0MGVfdmNfcmVtb3ZlX3ZsYW5fbXNnCi0gKiBAdmY6IHBvaW50ZXIgdG8gdGhlIHZmIGluZm8KKyAqIEB2ZjogcG9pbnRlciB0byB0aGUgVkYgaW5mbwogICogQG1zZzogcG9pbnRlciB0byB0aGUgbXNnIGJ1ZmZlcgogICogQG1zZ2xlbjogbXNnIGxlbmd0aAogICoKQEAgLTE2NDksNyArMTU4Myw3IEBACiAJCX0KIAl9CiAKLQl2c2kgPSBwZi0+dnNpW3ZzaV9pZF07CisJdnNpID0gcGYtPnZzaVt2Zi0+bGFuX3ZzaV9pZHhdOwogCWlmICh2c2ktPmluZm8ucHZpZCkgewogCQlhcV9yZXQgPSBJNDBFX0VSUl9QQVJBTTsKIAkJZ290byBlcnJvcl9wYXJhbTsKQEAgLTE2NjQsMTMgKzE1OTgsMTMgQEAKIAl9CiAKIGVycm9yX3BhcmFtOgotCS8qIHNlbmQgdGhlIHJlc3BvbnNlIHRvIHRoZSB2ZiAqLworCS8qIHNlbmQgdGhlIHJlc3BvbnNlIHRvIHRoZSBWRiAqLwogCXJldHVybiBpNDBlX3ZjX3NlbmRfcmVzcF90b192Zih2ZiwgSTQwRV9WSVJUQ0hOTF9PUF9ERUxfVkxBTiwgYXFfcmV0KTsKIH0KIAogLyoqCiAgKiBpNDBlX3ZjX3ZhbGlkYXRlX3ZmX21zZwotICogQHZmOiBwb2ludGVyIHRvIHRoZSB2ZiBpbmZvCisgKiBAdmY6IHBvaW50ZXIgdG8gdGhlIFZGIGluZm8KICAqIEBtc2c6IHBvaW50ZXIgdG8gdGhlIG1zZyBidWZmZXIKICAqIEBtc2dsZW46IG1zZyBsZW5ndGgKICAqIEBtc2dobmRsOiBtc2cgaGFuZGxlCkBAIC0xNzc2LDE0ICsxNzEwLDE0IEBACiAKIC8qKgogICogaTQwZV92Y19wcm9jZXNzX3ZmX21zZwotICogQHBmOiBwb2ludGVyIHRvIHRoZSBwZiBzdHJ1Y3R1cmUKLSAqIEB2Zl9pZDogc291cmNlIHZmIGlkCisgKiBAcGY6IHBvaW50ZXIgdG8gdGhlIFBGIHN0cnVjdHVyZQorICogQHZmX2lkOiBzb3VyY2UgVkYgaWQKICAqIEBtc2c6IHBvaW50ZXIgdG8gdGhlIG1zZyBidWZmZXIKICAqIEBtc2dsZW46IG1zZyBsZW5ndGgKICAqIEBtc2dobmRsOiBtc2cgaGFuZGxlCiAgKgogICogY2FsbGVkIGZyb20gdGhlIGNvbW1vbiBhZXEvYXJxIGhhbmRsZXIgdG8KLSAqIHByb2Nlc3MgcmVxdWVzdCBmcm9tIHZmCisgKiBwcm9jZXNzIHJlcXVlc3QgZnJvbSBWRgogICoqLwogaW50IGk0MGVfdmNfcHJvY2Vzc192Zl9tc2coc3RydWN0IGk0MGVfcGYgKnBmLCB1MTYgdmZfaWQsIHUzMiB2X29wY29kZSwKIAkJCSAgIHUzMiB2X3JldHZhbCwgdTggKm1zZywgdTE2IG1zZ2xlbikKQEAgLTE4MDEsNyArMTczNSw3IEBACiAJcmV0ID0gaTQwZV92Y192YWxpZGF0ZV92Zl9tc2codmYsIHZfb3Bjb2RlLCB2X3JldHZhbCwgbXNnLCBtc2dsZW4pOwogCiAJaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiSW52YWxpZCBtZXNzYWdlIGZyb20gdmYgJWQsIG9wY29kZSAlZCwgbGVuICVkXG4iLAorCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiSW52YWxpZCBtZXNzYWdlIGZyb20gVkYgJWQsIG9wY29kZSAlZCwgbGVuICVkXG4iLAogCQkJbG9jYWxfdmZfaWQsIHZfb3Bjb2RlLCBtc2dsZW4pOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE4NDksNyArMTc4Myw3IEBACiAJCWJyZWFrOwogCWNhc2UgSTQwRV9WSVJUQ0hOTF9PUF9VTktOT1dOOgogCWRlZmF1bHQ6Ci0JCWRldl9lcnIoJnBmLT5wZGV2LT5kZXYsICJVbnN1cHBvcnRlZCBvcGNvZGUgJWQgZnJvbSB2ZiAlZFxuIiwKKwkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwgIlVuc3VwcG9ydGVkIG9wY29kZSAlZCBmcm9tIFZGICVkXG4iLAogCQkJdl9vcGNvZGUsIGxvY2FsX3ZmX2lkKTsKIAkJcmV0ID0gaTQwZV92Y19zZW5kX3Jlc3BfdG9fdmYodmYsIHZfb3Bjb2RlLAogCQkJCQkgICAgICBJNDBFX0VSUl9OT1RfSU1QTEVNRU5URUQpOwpAQCAtMTg2MSwxMCArMTc5NSwxMCBAQAogCiAvKioKICAqIGk0MGVfdmNfcHJvY2Vzc192ZmxyX2V2ZW50Ci0gKiBAcGY6IHBvaW50ZXIgdG8gdGhlIHBmIHN0cnVjdHVyZQorICogQHBmOiBwb2ludGVyIHRvIHRoZSBQRiBzdHJ1Y3R1cmUKICAqCiAgKiBjYWxsZWQgZnJvbSB0aGUgdmxmciBpcnEgaGFuZGxlciB0bwotICogZnJlZSB1cCB2ZiByZXNvdXJjZXMgYW5kIHN0YXRlIHZhcmlhYmxlcworICogZnJlZSB1cCBWRiByZXNvdXJjZXMgYW5kIHN0YXRlIHZhcmlhYmxlcwogICoqLwogaW50IGk0MGVfdmNfcHJvY2Vzc192ZmxyX2V2ZW50KHN0cnVjdCBpNDBlX3BmICpwZikKIHsKQEAgLTE4ODUsNyArMTgxOSw3IEBACiAJZm9yICh2Zl9pZCA9IDA7IHZmX2lkIDwgcGYtPm51bV9hbGxvY192ZnM7IHZmX2lkKyspIHsKIAkJcmVnX2lkeCA9IChody0+ZnVuY19jYXBzLnZmX2Jhc2VfaWQgKyB2Zl9pZCkgLyAzMjsKIAkJYml0X2lkeCA9IChody0+ZnVuY19jYXBzLnZmX2Jhc2VfaWQgKyB2Zl9pZCkgJSAzMjsKLQkJLyogcmVhZCBHTEdFTl9WRkxSU1RBVCByZWdpc3RlciB0byBmaW5kIG91dCB0aGUgZmxyIHZmcyAqLworCQkvKiByZWFkIEdMR0VOX1ZGTFJTVEFUIHJlZ2lzdGVyIHRvIGZpbmQgb3V0IHRoZSBmbHIgVkZzICovCiAJCXZmID0gJnBmLT52Zlt2Zl9pZF07CiAJCXJlZyA9IHJkMzIoaHcsIEk0MEVfR0xHRU5fVkZMUlNUQVQocmVnX2lkeCkpOwogCQlpZiAocmVnICYgKDEgPDwgYml0X2lkeCkpIHsKQEAgLTE5MDIsNyArMTgzNiw3IEBACiAKIC8qKgogICogaTQwZV92Y192Zl9icm9hZGNhc3QKLSAqIEBwZjogcG9pbnRlciB0byB0aGUgcGYgc3RydWN0dXJlCisgKiBAcGY6IHBvaW50ZXIgdG8gdGhlIFBGIHN0cnVjdHVyZQogICogQG9wY29kZTogb3BlcmF0aW9uIGNvZGUKICAqIEByZXR2YWw6IHJldHVybiB2YWx1ZQogICogQG1zZzogcG9pbnRlciB0byB0aGUgbXNnIGJ1ZmZlcgpAQCAtMTkyMSw3ICsxODU1LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBwZi0+bnVtX2FsbG9jX3ZmczsgaSsrLCB2ZisrKSB7CiAJCWludCBhYnNfdmZfaWQgPSB2Zi0+dmZfaWQgKyBody0+ZnVuY19jYXBzLnZmX2Jhc2VfaWQ7Ci0JCS8qIE5vdCBhbGwgdmZzIGFyZSBlbmFibGVkIHNvIHNraXAgdGhlIG9uZXMgdGhhdCBhcmUgbm90ICovCisJCS8qIE5vdCBhbGwgVkZzIGFyZSBlbmFibGVkIHNvIHNraXAgdGhlIG9uZXMgdGhhdCBhcmUgbm90ICovCiAJCWlmICghdGVzdF9iaXQoSTQwRV9WRl9TVEFUX0lOSVQsICZ2Zi0+dmZfc3RhdGVzKSAmJgogCQkgICAgIXRlc3RfYml0KEk0MEVfVkZfU1RBVF9BQ1RJVkUsICZ2Zi0+dmZfc3RhdGVzKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTkzNiw3ICsxODcwLDcgQEAKIAogLyoqCiAgKiBpNDBlX3ZjX25vdGlmeV9saW5rX3N0YXRlCi0gKiBAcGY6IHBvaW50ZXIgdG8gdGhlIHBmIHN0cnVjdHVyZQorICogQHBmOiBwb2ludGVyIHRvIHRoZSBQRiBzdHJ1Y3R1cmUKICAqCiAgKiBzZW5kIGEgbGluayBzdGF0dXMgbWVzc2FnZSB0byBhbGwgVkZzIG9uIGEgZ2l2ZW4gUEYKICAqKi8KQEAgLTE5NjksNyArMTkwMyw3IEBACiAKIC8qKgogICogaTQwZV92Y19ub3RpZnlfcmVzZXQKLSAqIEBwZjogcG9pbnRlciB0byB0aGUgcGYgc3RydWN0dXJlCisgKiBAcGY6IHBvaW50ZXIgdG8gdGhlIFBGIHN0cnVjdHVyZQogICoKICAqIGluZGljYXRlIGEgcGVuZGluZyByZXNldCB0byBhbGwgVkZzIG9uIGEgZ2l2ZW4gUEYKICAqKi8KQEAgLTE5ODUsNyArMTkxOSw3IEBACiAKIC8qKgogICogaTQwZV92Y19ub3RpZnlfdmZfcmVzZXQKLSAqIEB2ZjogcG9pbnRlciB0byB0aGUgdmYgc3RydWN0dXJlCisgKiBAdmY6IHBvaW50ZXIgdG8gdGhlIFZGIHN0cnVjdHVyZQogICoKICAqIGluZGljYXRlIGEgcGVuZGluZyByZXNldCB0byB0aGUgZ2l2ZW4gVkYKICAqKi8KQEAgLTIwMTUsMTAgKzE5NDksMTAgQEAKIC8qKgogICogaTQwZV9uZG9fc2V0X3ZmX21hYwogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICogQHZmX2lkOiB2ZiBpZGVudGlmaWVyCisgKiBAdmZfaWQ6IFZGIGlkZW50aWZpZXIKICAqIEBtYWM6IG1hYyBhZGRyZXNzCiAgKgotICogcHJvZ3JhbSB2ZiBtYWMgYWRkcmVzcworICogcHJvZ3JhbSBWRiBtYWMgYWRkcmVzcwogICoqLwogaW50IGk0MGVfbmRvX3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmX2lkLCB1OCAqbWFjKQogewpAQCAtMjAzOCw3ICsxOTcyLDcgQEAKIAl9CiAKIAl2ZiA9ICYocGYtPnZmW3ZmX2lkXSk7Ci0JdnNpID0gcGYtPnZzaVt2Zi0+bGFuX3ZzaV9pbmRleF07CisJdnNpID0gcGYtPnZzaVt2Zi0+bGFuX3ZzaV9pZHhdOwogCWlmICghdGVzdF9iaXQoSTQwRV9WRl9TVEFUX0lOSVQsICZ2Zi0+dmZfc3RhdGVzKSkgewogCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LAogCQkJIlVuaW5pdGlhbGl6ZWQgVkYgJWRcbiIsIHZmX2lkKTsKQEAgLTIwODMsMTEgKzIwMTcsMTEgQEAKIC8qKgogICogaTQwZV9uZG9fc2V0X3ZmX3BvcnRfdmxhbgogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICogQHZmX2lkOiB2ZiBpZGVudGlmaWVyCisgKiBAdmZfaWQ6IFZGIGlkZW50aWZpZXIKICAqIEB2bGFuX2lkOiBtYWMgYWRkcmVzcwogICogQHFvczogcHJpb3JpdHkgc2V0dGluZwogICoKLSAqIHByb2dyYW0gdmYgdmxhbiBpZCBhbmQvb3IgcW9zCisgKiBwcm9ncmFtIFZGIHZsYW4gaWQgYW5kL29yIHFvcwogICoqLwogaW50IGk0MGVfbmRvX3NldF92Zl9wb3J0X3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgICAgIGludCB2Zl9pZCwgdTE2IHZsYW5faWQsIHU4IHFvcykKQEAgLTIxMTIsNyArMjA0Niw3IEBACiAJfQogCiAJdmYgPSAmKHBmLT52Zlt2Zl9pZF0pOwotCXZzaSA9IHBmLT52c2lbdmYtPmxhbl92c2lfaW5kZXhdOworCXZzaSA9IHBmLT52c2lbdmYtPmxhbl92c2lfaWR4XTsKIAlpZiAoIXRlc3RfYml0KEk0MEVfVkZfU1RBVF9JTklULCAmdmYtPnZmX3N0YXRlcykpIHsKIAkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwgIlVuaW5pdGlhbGl6ZWQgVkYgJWRcbiIsIHZmX2lkKTsKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTIxOTYsMTAgKzIxMzAsMTAgQEAKIC8qKgogICogaTQwZV9uZG9fc2V0X3ZmX2J3CiAgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAdmZfaWQ6IHZmIGlkZW50aWZpZXIKLSAqIEB0eF9yYXRlOiB0eCByYXRlCisgKiBAdmZfaWQ6IFZGIGlkZW50aWZpZXIKKyAqIEB0eF9yYXRlOiBUeCByYXRlCiAgKgotICogY29uZmlndXJlIHZmIHR4IHJhdGUKKyAqIGNvbmZpZ3VyZSBWRiBUeCByYXRlCiAgKiovCiBpbnQgaTQwZV9uZG9fc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2Zl9pZCwgaW50IG1pbl90eF9yYXRlLAogCQkgICAgICAgaW50IG1heF90eF9yYXRlKQpAQCAtMjIxOSwxMyArMjE1MywxMyBAQAogCX0KIAogCWlmIChtaW5fdHhfcmF0ZSkgewotCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiSW52YWxpZCBtaW4gdHggcmF0ZSAoJWQpIChncmVhdGVyIHRoYW4gMCkgc3BlY2lmaWVkIGZvciB2ZiAlZC5cbiIsCisJCWRldl9lcnIoJnBmLT5wZGV2LT5kZXYsICJJbnZhbGlkIG1pbiB0eCByYXRlICglZCkgKGdyZWF0ZXIgdGhhbiAwKSBzcGVjaWZpZWQgZm9yIFZGICVkLlxuIiwKIAkJCW1pbl90eF9yYXRlLCB2Zl9pZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXZmID0gJihwZi0+dmZbdmZfaWRdKTsKLQl2c2kgPSBwZi0+dnNpW3ZmLT5sYW5fdnNpX2luZGV4XTsKKwl2c2kgPSBwZi0+dnNpW3ZmLT5sYW5fdnNpX2lkeF07CiAJaWYgKCF0ZXN0X2JpdChJNDBFX1ZGX1NUQVRfSU5JVCwgJnZmLT52Zl9zdGF0ZXMpKSB7CiAJCWRldl9lcnIoJnBmLT5wZGV2LT5kZXYsICJVbmluaXRpYWxpemVkIFZGICVkLlxuIiwgdmZfaWQpOwogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMjI0Nyw3ICsyMTgxLDcgQEAKIAl9CiAKIAlpZiAobWF4X3R4X3JhdGUgPiBzcGVlZCkgewotCQlkZXZfZXJyKCZwZi0+cGRldi0+ZGV2LCAiSW52YWxpZCBtYXggdHggcmF0ZSAlZCBzcGVjaWZpZWQgZm9yIHZmICVkLiIsCisJCWRldl9lcnIoJnBmLT5wZGV2LT5kZXYsICJJbnZhbGlkIG1heCB0eCByYXRlICVkIHNwZWNpZmllZCBmb3IgVkYgJWQuIiwKIAkJCW1heF90eF9yYXRlLCB2Zi0+dmZfaWQpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycm9yOwpAQCAtMjI3NiwxMCArMjIxMCwxMCBAQAogLyoqCiAgKiBpNDBlX25kb19nZXRfdmZfY29uZmlnCiAgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCi0gKiBAdmZfaWQ6IHZmIGlkZW50aWZpZXIKLSAqIEBpdmk6IHZmIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCisgKiBAdmZfaWQ6IFZGIGlkZW50aWZpZXIKKyAqIEBpdmk6IFZGIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlCiAgKgotICogcmV0dXJuIHZmIGNvbmZpZ3VyYXRpb24KKyAqIHJldHVybiBWRiBjb25maWd1cmF0aW9uCiAgKiovCiBpbnQgaTQwZV9uZG9fZ2V0X3ZmX2NvbmZpZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJICAgaW50IHZmX2lkLCBzdHJ1Y3QgaWZsYV92Zl9pbmZvICppdmkpCkBAIC0yMjk5LDcgKzIyMzMsNyBAQAogCiAJdmYgPSAmKHBmLT52Zlt2Zl9pZF0pOwogCS8qIGZpcnN0IHZzaSBpcyBhbHdheXMgdGhlIExBTiB2c2kgKi8KLQl2c2kgPSBwZi0+dnNpW3ZmLT5sYW5fdnNpX2luZGV4XTsKKwl2c2kgPSBwZi0+dnNpW3ZmLT5sYW5fdnNpX2lkeF07CiAJaWYgKCF0ZXN0X2JpdChJNDBFX1ZGX1NUQVRfSU5JVCwgJnZmLT52Zl9zdGF0ZXMpKSB7CiAJCWRldl9lcnIoJnBmLT5wZGV2LT5kZXYsICJVbmluaXRpYWxpemVkIFZGICVkXG4iLCB2Zl9pZCk7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC0yMzMxLDcgKzIyNjUsNyBAQAogLyoqCiAgKiBpNDBlX25kb19zZXRfdmZfbGlua19zdGF0ZQogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICogQHZmX2lkOiB2ZiBpZGVudGlmaWVyCisgKiBAdmZfaWQ6IFZGIGlkZW50aWZpZXIKICAqIEBsaW5rOiByZXF1aXJlZCBsaW5rIHN0YXRlCiAgKgogICogU2V0IHRoZSBsaW5rIHN0YXRlIG9mIGEgc3BlY2lmaWVkIFZGLCByZWdhcmRsZXNzIG9mIHBoeXNpY2FsIGxpbmsgc3RhdGUKQEAgLTIzOTQsNyArMjMyOCw3IEBACiAvKioKICAqIGk0MGVfbmRvX3NldF92Zl9zcG9vZmNoawogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQotICogQHZmX2lkOiB2ZiBpZGVudGlmaWVyCisgKiBAdmZfaWQ6IFZGIGlkZW50aWZpZXIKICAqIEBlbmFibGU6IGZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgZmVhdHVyZQogICoKICAqIEVuYWJsZSBvciBkaXNhYmxlIFZGIHNwb29mIGNoZWNraW5nCkBAIC0yNDIzLDExICsyMzU3LDEyIEBACiAKIAl2Zi0+c3Bvb2ZjaGsgPSBlbmFibGU7CiAJbWVtc2V0KCZjdHh0LCAwLCBzaXplb2YoY3R4dCkpOwotCWN0eHQuc2VpZCA9IHBmLT52c2lbdmYtPmxhbl92c2lfaW5kZXhdLT5zZWlkOworCWN0eHQuc2VpZCA9IHBmLT52c2lbdmYtPmxhbl92c2lfaWR4XS0+c2VpZDsKIAljdHh0LnBmX251bSA9IHBmLT5ody5wZl9pZDsKIAljdHh0LmluZm8udmFsaWRfc2VjdGlvbnMgPSBjcHVfdG9fbGUxNihJNDBFX0FRX1ZTSV9QUk9QX1NFQ1VSSVRZX1ZBTElEKTsKIAlpZiAoZW5hYmxlKQotCQljdHh0LmluZm8uc2VjX2ZsYWdzIHw9IEk0MEVfQVFfVlNJX1NFQ19GTEFHX0VOQUJMRV9NQUNfQ0hLOworCQljdHh0LmluZm8uc2VjX2ZsYWdzIHw9IChJNDBFX0FRX1ZTSV9TRUNfRkxBR19FTkFCTEVfVkxBTl9DSEsgfAorCQkJCQlJNDBFX0FRX1ZTSV9TRUNfRkxBR19FTkFCTEVfTUFDX0NISyk7CiAJcmV0ID0gaTQwZV9hcV91cGRhdGVfdnNpX3BhcmFtcyhodywgJmN0eHQsIE5VTEwpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGYtPnBkZXYtPmRldiwgIkVycm9yICVkIHVwZGF0aW5nIFZTSSBwYXJhbWV0ZXJzXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZS9pNDBlX3ZpcnRjaG5sX3BmLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuaAppbmRleCA5NDUyZjUyLi4wOTA0M2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBlL2k0MGVfdmlydGNobmxfcGYuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogSW50ZWwgRXRoZXJuZXQgQ29udHJvbGxlciBYTDcxMCBGYW1pbHkgTGludXggRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC03MSwxMiArNzEsMTIgQEAKIHN0cnVjdCBpNDBlX3ZmIHsKIAlzdHJ1Y3QgaTQwZV9wZiAqcGY7CiAKLQkvKiB2ZiBpZCBpbiB0aGUgcGYgc3BhY2UgKi8KKwkvKiBWRiBpZCBpbiB0aGUgUEYgc3BhY2UgKi8KIAl1MTYgdmZfaWQ7Ci0JLyogYWxsIHZmIHZzaXMgY29ubmVjdCB0byB0aGUgc2FtZSBwYXJlbnQgKi8KKwkvKiBhbGwgVkYgdnNpcyBjb25uZWN0IHRvIHRoZSBzYW1lIHBhcmVudCAqLwogCWVudW0gaTQwZV9zd2l0Y2hfZWxlbWVudF90eXBlcyBwYXJlbnRfdHlwZTsKIAotCS8qIHZmIFBvcnQgRXh0ZW5kZXIgKFBFKSBzdGFnIGlmIHVzZWQgKi8KKwkvKiBWRiBQb3J0IEV4dGVuZGVyIChQRSkgc3RhZyBpZiB1c2VkICovCiAJdTE2IHN0YWc7CiAKIAlzdHJ1Y3QgaTQwZV92aXJ0Y2hubF9ldGhlcl9hZGRyIGRlZmF1bHRfbGFuX2FkZHI7CkBAIC04OCwxMCArODgsMTAgQEAKIAkgKiBXaGVuIGFzc2lnbmVkLCB0aGVzZSB3aWxsIGJlIG5vbi16ZXJvLCBiZWNhdXNlIFZTSSAwIGlzIGFsd2F5cwogCSAqIHRoZSBtYWluIExBTiBWU0kgZm9yIHRoZSBQRi4KIAkgKi8KLQl1OCBsYW5fdnNpX2luZGV4OwkvKiBpbmRleCBpbnRvIFBGIHN0cnVjdCAqLworCXU4IGxhbl92c2lfaWR4OwkgICAgICAgIC8qIGluZGV4IGludG8gUEYgc3RydWN0ICovCiAJdTggbGFuX3ZzaV9pZDsJCS8qIElEIGFzIHVzZWQgYnkgZmlybXdhcmUgKi8KIAotCXU4IG51bV9xdWV1ZV9wYWlyczsJLyogbnVtIG9mIHFwcyBhc3NpZ25lZCB0byB2ZiB2c2lzICovCisJdTggbnVtX3F1ZXVlX3BhaXJzOwkvKiBudW0gb2YgcXBzIGFzc2lnbmVkIHRvIFZGIHZzaXMgKi8KIAl1NjQgbnVtX21kZF9ldmVudHM7CS8qIG51bSBvZiBtZGQgZXZlbnRzIGRldGVjdGVkICovCiAJdTY0IG51bV9pbnZhbGlkX21zZ3M7CS8qIG51bSBvZiBtYWxmb3JtZWQgb3IgaW52YWxpZCBtc2dzIGRldGVjdGVkICovCiAJdTY0IG51bV92YWxpZF9tc2dzOwkvKiBudW0gb2YgdmFsaWQgbXNncyBkZXRlY3RlZCAqLwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJdW5zaWduZWQgbG9uZyB2Zl9zdGF0ZXM7CS8qIHZmJ3MgcnVudGltZSBzdGF0ZXMgKi8KIAl1bnNpZ25lZCBpbnQgdHhfcmF0ZTsJLyogVHggYmFuZHdpZHRoIGxpbWl0IGluIE1icHMgKi8KIAlib29sIGxpbmtfZm9yY2VkOwotCWJvb2wgbGlua191cDsJCS8qIG9ubHkgdmFsaWQgaWYgdmYgbGluayBpcyBmb3JjZWQgKi8KKwlib29sIGxpbmtfdXA7CQkvKiBvbmx5IHZhbGlkIGlmIFZGIGxpbmsgaXMgZm9yY2VkICovCiAJYm9vbCBzcG9vZmNoazsKIH07CiAKQEAgLTExMyw3ICsxMTMsNyBAQAogdm9pZCBpNDBlX3Jlc2V0X3ZmKHN0cnVjdCBpNDBlX3ZmICp2ZiwgYm9vbCBmbHIpOwogdm9pZCBpNDBlX3ZjX25vdGlmeV92Zl9yZXNldChzdHJ1Y3QgaTQwZV92ZiAqdmYpOwogCi0vKiB2ZiBjb25maWd1cmF0aW9uIHJlbGF0ZWQgaXBsaW5rIGhhbmRsZXJzICovCisvKiBWRiBjb25maWd1cmF0aW9uIHJlbGF0ZWQgaXBsaW5rIGhhbmRsZXJzICovCiBpbnQgaTQwZV9uZG9fc2V0X3ZmX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmZfaWQsIHU4ICptYWMpOwogaW50IGk0MGVfbmRvX3NldF92Zl9wb3J0X3ZsYW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgICAgIGludCB2Zl9pZCwgdTE2IHZsYW5faWQsIHU4IHFvcyk7CkBAIC0xMjYsNiArMTI2LDUgQEAKIAogdm9pZCBpNDBlX3ZjX25vdGlmeV9saW5rX3N0YXRlKHN0cnVjdCBpNDBlX3BmICpwZik7CiB2b2lkIGk0MGVfdmNfbm90aWZ5X3Jlc2V0KHN0cnVjdCBpNDBlX3BmICpwZik7Ci12b2lkIGk0MGVfZW5hYmxlX3BmX3N3aXRjaF9sYihzdHJ1Y3QgaTQwZV9wZiAqcGYpOwogCiAjZW5kaWYgLyogX0k0MEVfVklSVENITkxfUEZfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX2FkbWlucS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWRtaW5xLmgKaW5kZXggNjBmMDRlOS4uZWY0M2Q2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWRtaW5xLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfYWRtaW5xLmgKQEAgLTkzLDYgKzkzLDcgQEAKIAl1MTYgYXNxX2J1Zl9zaXplOyAgICAgICAgICAgICAgIC8qIHNlbmQgcXVldWUgYnVmZmVyIHNpemUgKi8KIAl1MTYgZndfbWFqX3ZlcjsgICAgICAgICAgICAgICAgIC8qIGZpcm13YXJlIG1ham9yIHZlcnNpb24gKi8KIAl1MTYgZndfbWluX3ZlcjsgICAgICAgICAgICAgICAgIC8qIGZpcm13YXJlIG1pbm9yIHZlcnNpb24gKi8KKwl1MzIgZndfYnVpbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGZpcm13YXJlIGJ1aWxkIG51bWJlciAqLwogCXUxNiBhcGlfbWFqX3ZlcjsgICAgICAgICAgICAgICAgLyogYXBpIG1ham9yIHZlcnNpb24gKi8KIAl1MTYgYXBpX21pbl92ZXI7ICAgICAgICAgICAgICAgIC8qIGFwaSBtaW5vciB2ZXJzaW9uICovCiAJYm9vbCBudm1fcmVsZWFzZV9vbl9kb25lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9jb21tb24uYwppbmRleCAyOGM0MGM1Li4zOWZjYjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9jb21tb24uYwpAQCAtNTEsNiArNTEsNyBAQAogCQljYXNlIEk0MEVfREVWX0lEX1FTRlBfQjoKIAkJY2FzZSBJNDBFX0RFVl9JRF9RU0ZQX0M6CiAJCWNhc2UgSTQwRV9ERVZfSURfMTBHX0JBU0VfVDoKKwkJY2FzZSBJNDBFX0RFVl9JRF8yMEdfS1IyOgogCQkJaHctPm1hYy50eXBlID0gSTQwRV9NQUNfWEw3MTA7CiAJCQlicmVhazsKIAkJY2FzZSBJNDBFX0RFVl9JRF9WRjoKQEAgLTg1LDQ2ICs4Niw1MyBAQAogewogCXN0cnVjdCBpNDBlX2FxX2Rlc2MgKmFxX2Rlc2MgPSAoc3RydWN0IGk0MGVfYXFfZGVzYyAqKWRlc2M7CiAJdTE2IGxlbiA9IGxlMTZfdG9fY3B1KGFxX2Rlc2MtPmRhdGFsZW4pOwotCXU4ICphcV9idWZmZXIgPSAodTggKilidWZmZXI7Ci0JdTMyIGRhdGFbNF07Ci0JdTMyIGkgPSAwOworCXU4ICpidWYgPSAodTggKilidWZmZXI7CisJdTE2IGkgPSAwOwogCiAJaWYgKCghKG1hc2sgJiBody0+ZGVidWdfbWFzaykpIHx8IChkZXNjID09IE5VTEwpKQogCQlyZXR1cm47CiAKIAlpNDBlX2RlYnVnKGh3LCBtYXNrLAogCQkgICAiQVEgQ01EOiBvcGNvZGUgMHglMDRYLCBmbGFncyAweCUwNFgsIGRhdGFsZW4gMHglMDRYLCByZXR2YWwgMHglMDRYXG4iLAotCQkgICBhcV9kZXNjLT5vcGNvZGUsIGFxX2Rlc2MtPmZsYWdzLCBhcV9kZXNjLT5kYXRhbGVuLAotCQkgICBhcV9kZXNjLT5yZXR2YWwpOworCQkgICBsZTE2X3RvX2NwdShhcV9kZXNjLT5vcGNvZGUpLAorCQkgICBsZTE2X3RvX2NwdShhcV9kZXNjLT5mbGFncyksCisJCSAgIGxlMTZfdG9fY3B1KGFxX2Rlc2MtPmRhdGFsZW4pLAorCQkgICBsZTE2X3RvX2NwdShhcV9kZXNjLT5yZXR2YWwpKTsKIAlpNDBlX2RlYnVnKGh3LCBtYXNrLCAiXHRjb29raWUgKGgsbCkgMHglMDhYIDB4JTA4WFxuIiwKLQkJICAgYXFfZGVzYy0+Y29va2llX2hpZ2gsIGFxX2Rlc2MtPmNvb2tpZV9sb3cpOworCQkgICBsZTMyX3RvX2NwdShhcV9kZXNjLT5jb29raWVfaGlnaCksCisJCSAgIGxlMzJfdG9fY3B1KGFxX2Rlc2MtPmNvb2tpZV9sb3cpKTsKIAlpNDBlX2RlYnVnKGh3LCBtYXNrLCAiXHRwYXJhbSAoMCwxKSAgMHglMDhYIDB4JTA4WFxuIiwKLQkJICAgYXFfZGVzYy0+cGFyYW1zLmludGVybmFsLnBhcmFtMCwKLQkJICAgYXFfZGVzYy0+cGFyYW1zLmludGVybmFsLnBhcmFtMSk7CisJCSAgIGxlMzJfdG9fY3B1KGFxX2Rlc2MtPnBhcmFtcy5pbnRlcm5hbC5wYXJhbTApLAorCQkgICBsZTMyX3RvX2NwdShhcV9kZXNjLT5wYXJhbXMuaW50ZXJuYWwucGFyYW0xKSk7CiAJaTQwZV9kZWJ1ZyhodywgbWFzaywgIlx0YWRkciAoaCxsKSAgIDB4JTA4WCAweCUwOFhcbiIsCi0JCSAgIGFxX2Rlc2MtPnBhcmFtcy5leHRlcm5hbC5hZGRyX2hpZ2gsCi0JCSAgIGFxX2Rlc2MtPnBhcmFtcy5leHRlcm5hbC5hZGRyX2xvdyk7CisJCSAgIGxlMzJfdG9fY3B1KGFxX2Rlc2MtPnBhcmFtcy5leHRlcm5hbC5hZGRyX2hpZ2gpLAorCQkgICBsZTMyX3RvX2NwdShhcV9kZXNjLT5wYXJhbXMuZXh0ZXJuYWwuYWRkcl9sb3cpKTsKIAogCWlmICgoYnVmZmVyICE9IE5VTEwpICYmIChhcV9kZXNjLT5kYXRhbGVuICE9IDApKSB7Ci0JCW1lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkpOwogCQlpNDBlX2RlYnVnKGh3LCBtYXNrLCAiQVEgQ01EIEJ1ZmZlcjpcbiIpOwogCQlpZiAoYnVmX2xlbiA8IGxlbikKIAkJCWxlbiA9IGJ1Zl9sZW47Ci0JCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJZGF0YVsoKGkgJSAxNikgLyA0KV0gfD0KLQkJCQkoKHUzMilhcV9idWZmZXJbaV0pIDw8ICg4ICogKGkgJSA0KSk7Ci0JCQlpZiAoKGkgJSAxNikgPT0gMTUpIHsKLQkJCQlpNDBlX2RlYnVnKGh3LCBtYXNrLAotCQkJCQkgICAiXHQweCUwNFggICUwOFggJTA4WCAlMDhYICUwOFhcbiIsCi0JCQkJCSAgIGkgLSAxNSwgZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwKLQkJCQkJICAgZGF0YVszXSk7Ci0JCQkJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihkYXRhKSk7Ci0JCQl9CisJCS8qIHdyaXRlIHRoZSBmdWxsIDE2LWJ5dGUgY2h1bmtzICovCisJCWZvciAoaSA9IDA7IGkgPCAobGVuIC0gMTYpOyBpICs9IDE2KQorCQkJaTQwZV9kZWJ1ZyhodywgbWFzaywKKwkJCQkgICAiXHQweCUwNFggICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQkJICAgaSwgYnVmW2ldLCBidWZbaSArIDFdLCBidWZbaSArIDJdLAorCQkJCSAgIGJ1ZltpICsgM10sIGJ1ZltpICsgNF0sIGJ1ZltpICsgNV0sCisJCQkJICAgYnVmW2kgKyA2XSwgYnVmW2kgKyA3XSwgYnVmW2kgKyA4XSwKKwkJCQkgICBidWZbaSArIDldLCBidWZbaSArIDEwXSwgYnVmW2kgKyAxMV0sCisJCQkJICAgYnVmW2kgKyAxMl0sIGJ1ZltpICsgMTNdLCBidWZbaSArIDE0XSwKKwkJCQkgICBidWZbaSArIDE1XSk7CisJCS8qIHdyaXRlIHdoYXRldmVyJ3MgbGVmdCBvdmVyIHdpdGhvdXQgb3ZlcnJ1bm5pbmcgdGhlIGJ1ZmZlciAqLworCQlpZiAoaSA8IGxlbikgeworCQkJY2hhciBkX2J1Zls4MF07CisJCQlpbnQgaiA9IDA7CisKKwkJCW1lbXNldChkX2J1ZiwgMCwgc2l6ZW9mKGRfYnVmKSk7CisJCQlqICs9IHNwcmludGYoZF9idWYsICJcdDB4JTA0WCAiLCBpKTsKKwkJCXdoaWxlIChpIDwgbGVuKQorCQkJCWogKz0gc3ByaW50ZigmZF9idWZbal0sICIgJTAyWCIsIGJ1ZltpKytdKTsKKwkJCWk0MGVfZGVidWcoaHcsIG1hc2ssICIlc1xuIiwgZF9idWYpOwogCQl9Ci0JCWlmICgoaSAlIDE2KSAhPSAwKQotCQkJaTQwZV9kZWJ1ZyhodywgbWFzaywgIlx0MHglMDRYICAlMDhYICUwOFggJTA4WCAlMDhYXG4iLAotCQkJCSAgIGkgLSAoaSAlIDE2KSwgZGF0YVswXSwgZGF0YVsxXSwgZGF0YVsyXSwKLQkJCQkgICBkYXRhWzNdKTsKIAl9CiB9CiAKQEAgLTUzNSw3ICs1NDMsNiBAQAogCUk0MEVfUFRUX1VOVVNFRF9FTlRSWSgyNTUpCiB9OwogCi0KIC8qKgogICogaTQwZV9hcV9zZW5kX21zZ190b19wZgogICogQGh3OiBwb2ludGVyIHRvIHRoZSBoYXJkd2FyZSBzdHJ1Y3R1cmUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3Byb3RvdHlwZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfcHJvdG90eXBlLmgKaW5kZXggOTE3MzgzNC4uNThlMzdhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfcHJvdG90eXBlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfcHJvdG90eXBlLmgKQEAgLTU5LDggKzU5LDcgQEAKIHZvaWQgaTQwZV9pZGxlX2FxKHN0cnVjdCBpNDBlX2h3ICpodyk7CiB2b2lkIGk0MGV2Zl9yZXN1bWVfYXEoc3RydWN0IGk0MGVfaHcgKmh3KTsKIGJvb2wgaTQwZXZmX2NoZWNrX2FzcV9hbGl2ZShzdHJ1Y3QgaTQwZV9odyAqaHcpOwotaTQwZV9zdGF0dXMgaTQwZXZmX2FxX3F1ZXVlX3NodXRkb3duKHN0cnVjdCBpNDBlX2h3ICpodywKLQkJCQkJICAgICBib29sIHVubG9hZGluZyk7CitpNDBlX3N0YXR1cyBpNDBldmZfYXFfcXVldWVfc2h1dGRvd24oc3RydWN0IGk0MGVfaHcgKmh3LCBib29sIHVubG9hZGluZyk7CiAKIGk0MGVfc3RhdHVzIGk0MGVfc2V0X21hY190eXBlKHN0cnVjdCBpNDBlX2h3ICpodyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3JlZ2lzdGVyLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV9yZWdpc3Rlci5oCmluZGV4IGMxZjZhNTkuLjNjYzczNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3JlZ2lzdGVyLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfcmVnaXN0ZXIuaApAQCAtMzEwLDYgKzMxMCwxMCBAQAogI2RlZmluZSBJNDBFX1BSVERDQl9SVVAyVENfVVA2VENfTUFTSyBJNDBFX01BU0soMHg3LCBJNDBFX1BSVERDQl9SVVAyVENfVVA2VENfU0hJRlQpCiAjZGVmaW5lIEk0MEVfUFJURENCX1JVUDJUQ19VUDdUQ19TSElGVCAyMQogI2RlZmluZSBJNDBFX1BSVERDQl9SVVAyVENfVVA3VENfTUFTSyBJNDBFX01BU0soMHg3LCBJNDBFX1BSVERDQl9SVVAyVENfVVA3VENfU0hJRlQpCisjZGVmaW5lIEk0MEVfUFJURENCX1JVUFRRKF9pKSAoMHgwMDEyMjQwMCArICgoX2kpICogMzIpKSAvKiBfaT0wLi4uNyAqLyAvKiBSZXNldDogQ09SRVIgKi8KKyNkZWZpbmUgSTQwRV9QUlREQ0JfUlVQVFFfTUFYX0lOREVYIDcKKyNkZWZpbmUgSTQwRV9QUlREQ0JfUlVQVFFfUlhRTlVNX1NISUZUIDAKKyNkZWZpbmUgSTQwRV9QUlREQ0JfUlVQVFFfUlhRTlVNX01BU0sgSTQwRV9NQVNLKDB4M0ZGRiwgSTQwRV9QUlREQ0JfUlVQVFFfUlhRTlVNX1NISUZUKQogI2RlZmluZSBJNDBFX1BSVERDQl9UQzJQRkMgMHgwMDFDMDk4MCAvKiBSZXNldDogQ09SRVIgKi8KICNkZWZpbmUgSTQwRV9QUlREQ0JfVEMyUEZDX1RDMlBGQ19TSElGVCAwCiAjZGVmaW5lIEk0MEVfUFJURENCX1RDMlBGQ19UQzJQRkNfTUFTSyBJNDBFX01BU0soMHhGRiwgSTQwRV9QUlREQ0JfVEMyUEZDX1RDMlBGQ19TSElGVCkKQEAgLTQyMSw2ICs0MjUsOCBAQAogI2RlZmluZSBJNDBFX0dMR0VOX0dQSU9fQ1RMX09VVF9ERUZBVUxUX01BU0sgSTQwRV9NQVNLKDB4MSwgSTQwRV9HTEdFTl9HUElPX0NUTF9PVVRfREVGQVVMVF9TSElGVCkKICNkZWZpbmUgSTQwRV9HTEdFTl9HUElPX0NUTF9QSFlfUElOX05BTUVfU0hJRlQgMjAKICNkZWZpbmUgSTQwRV9HTEdFTl9HUElPX0NUTF9QSFlfUElOX05BTUVfTUFTSyBJNDBFX01BU0soMHgzRiwgSTQwRV9HTEdFTl9HUElPX0NUTF9QSFlfUElOX05BTUVfU0hJRlQpCisjZGVmaW5lIEk0MEVfR0xHRU5fR1BJT19DVExfUFJUX0JJVF9NQVBfU0hJRlQgMjYKKyNkZWZpbmUgSTQwRV9HTEdFTl9HUElPX0NUTF9QUlRfQklUX01BUF9NQVNLIEk0MEVfTUFTSygweEYsIEk0MEVfR0xHRU5fR1BJT19DVExfUFJUX0JJVF9NQVBfU0hJRlQpCiAjZGVmaW5lIEk0MEVfR0xHRU5fR1BJT19TRVQgMHgwMDA4ODE4NCAvKiBSZXNldDogUE9SICovCiAjZGVmaW5lIEk0MEVfR0xHRU5fR1BJT19TRVRfR1BJT19JTkRYX1NISUZUIDAKICNkZWZpbmUgSTQwRV9HTEdFTl9HUElPX1NFVF9HUElPX0lORFhfTUFTSyBJNDBFX01BU0soMHgxRiwgSTQwRV9HTEdFTl9HUElPX1NFVF9HUElPX0lORFhfU0hJRlQpCkBAIC00ODQsNyArNDkwLDkgQEAKICNkZWZpbmUgSTQwRV9HTEdFTl9NRElPX0NUUkxfQ09OVE1EQ19TSElGVCAxNwogI2RlZmluZSBJNDBFX0dMR0VOX01ESU9fQ1RSTF9DT05UTURDX01BU0sgSTQwRV9NQVNLKDB4MSwgSTQwRV9HTEdFTl9NRElPX0NUUkxfQ09OVE1EQ19TSElGVCkKICNkZWZpbmUgSTQwRV9HTEdFTl9NRElPX0NUUkxfTEVHQUNZX1JTVkQxX1NISUZUIDE4Ci0jZGVmaW5lIEk0MEVfR0xHRU5fTURJT19DVFJMX0xFR0FDWV9SU1ZEMV9NQVNLIEk0MEVfTUFTSygweDNGRkYsIEk0MEVfR0xHRU5fTURJT19DVFJMX0xFR0FDWV9SU1ZEMV9TSElGVCkKKyNkZWZpbmUgSTQwRV9HTEdFTl9NRElPX0NUUkxfTEVHQUNZX1JTVkQxX01BU0sgSTQwRV9NQVNLKDB4N0ZGLCBJNDBFX0dMR0VOX01ESU9fQ1RSTF9MRUdBQ1lfUlNWRDFfU0hJRlQpCisjZGVmaW5lIEk0MEVfR0xHRU5fTURJT19DVFJMX0xFR0FDWV9SU1ZEMF9TSElGVCAyOQorI2RlZmluZSBJNDBFX0dMR0VOX01ESU9fQ1RSTF9MRUdBQ1lfUlNWRDBfTUFTSyBJNDBFX01BU0soMHg3LCBJNDBFX0dMR0VOX01ESU9fQ1RSTF9MRUdBQ1lfUlNWRDBfU0hJRlQpCiAjZGVmaW5lIEk0MEVfR0xHRU5fTURJT19JMkNfU0VMKF9pKSAoMHgwMDA4ODFDMCArICgoX2kpICogNCkpIC8qIF9pPTAuLi4zICovIC8qIFJlc2V0OiBQT1IgKi8KICNkZWZpbmUgSTQwRV9HTEdFTl9NRElPX0kyQ19TRUxfTUFYX0lOREVYIDMKICNkZWZpbmUgSTQwRV9HTEdFTl9NRElPX0kyQ19TRUxfTURJT19JMkNfU0VMX1NISUZUIDAKQEAgLTU0OCw5ICs1NTYsNiBAQAogI2RlZmluZSBJNDBFX0dMR0VOX1JTVENUTF9HUlNUREVMX01BU0sgSTQwRV9NQVNLKDB4M0YsIEk0MEVfR0xHRU5fUlNUQ1RMX0dSU1RERUxfU0hJRlQpCiAjZGVmaW5lIEk0MEVfR0xHRU5fUlNUQ1RMX0VDQ19SU1RfRU5BX1NISUZUIDgKICNkZWZpbmUgSTQwRV9HTEdFTl9SU1RDVExfRUNDX1JTVF9FTkFfTUFTSyBJNDBFX01BU0soMHgxLCBJNDBFX0dMR0VOX1JTVENUTF9FQ0NfUlNUX0VOQV9TSElGVCkKLSNkZWZpbmUgSTQwRV9HTEdFTl9SU1RFTkFfRU1QIDB4MDAwQjgxOEMgLyogUmVzZXQ6IFBPUiAqLwotI2RlZmluZSBJNDBFX0dMR0VOX1JTVEVOQV9FTVBfRU1QX1JTVF9FTkFfU0hJRlQgMAotI2RlZmluZSBJNDBFX0dMR0VOX1JTVEVOQV9FTVBfRU1QX1JTVF9FTkFfTUFTSyBJNDBFX01BU0soMHgxLCBJNDBFX0dMR0VOX1JTVEVOQV9FTVBfRU1QX1JTVF9FTkFfU0hJRlQpCiAjZGVmaW5lIEk0MEVfR0xHRU5fUlRSSUcgMHgwMDBCODE5MCAvKiBSZXNldDogQ09SRVIgKi8KICNkZWZpbmUgSTQwRV9HTEdFTl9SVFJJR19DT1JFUl9TSElGVCAwCiAjZGVmaW5lIEk0MEVfR0xHRU5fUlRSSUdfQ09SRVJfTUFTSyBJNDBFX01BU0soMHgxLCBJNDBFX0dMR0VOX1JUUklHX0NPUkVSX1NISUZUKQpAQCAtMTA2Niw3ICsxMDcxLDcgQEAKICNkZWZpbmUgSTQwRV9QRklOVF9SQVRFTl9JTlRFUlZBTF9NQVNLIEk0MEVfTUFTSygweDNGLCBJNDBFX1BGSU5UX1JBVEVOX0lOVEVSVkFMX1NISUZUKQogI2RlZmluZSBJNDBFX1BGSU5UX1JBVEVOX0lOVFJMX0VOQV9TSElGVCA2CiAjZGVmaW5lIEk0MEVfUEZJTlRfUkFURU5fSU5UUkxfRU5BX01BU0sgSTQwRV9NQVNLKDB4MSwgSTQwRV9QRklOVF9SQVRFTl9JTlRSTF9FTkFfU0hJRlQpCi0jZGVmaW5lIEk0MEVfUEZJTlRfU1RBVF9DVEwwIDB4MDAwMzg0MDAgLyogUmVzZXQ6IFBGUiAqLworI2RlZmluZSBJNDBFX1BGSU5UX1NUQVRfQ1RMMCAweDAwMDM4NDAwIC8qIFJlc2V0OiBDT1JFUiAqLwogI2RlZmluZSBJNDBFX1BGSU5UX1NUQVRfQ1RMMF9PVEhFUl9JVFJfSU5EWF9TSElGVCAyCiAjZGVmaW5lIEk0MEVfUEZJTlRfU1RBVF9DVEwwX09USEVSX0lUUl9JTkRYX01BU0sgSTQwRV9NQVNLKDB4MywgSTQwRV9QRklOVF9TVEFUX0NUTDBfT1RIRVJfSVRSX0lORFhfU0hJRlQpCiAjZGVmaW5lIEk0MEVfUUlOVF9SUUNUTChfUSkgKDB4MDAwM0EwMDAgKyAoKF9RKSAqIDQpKSAvKiBfaT0wLi4uMTUzNSAqLyAvKiBSZXNldDogQ09SRVIgKi8KQEAgLTExNzEsNyArMTE3Niw3IEBACiAjZGVmaW5lIEk0MEVfVkZJTlRfSVRSTl9NQVhfSU5ERVggMgogI2RlZmluZSBJNDBFX1ZGSU5UX0lUUk5fSU5URVJWQUxfU0hJRlQgMAogI2RlZmluZSBJNDBFX1ZGSU5UX0lUUk5fSU5URVJWQUxfTUFTSyBJNDBFX01BU0soMHhGRkYsIEk0MEVfVkZJTlRfSVRSTl9JTlRFUlZBTF9TSElGVCkKLSNkZWZpbmUgSTQwRV9WRklOVF9TVEFUX0NUTDAoX1ZGKSAoMHgwMDAyQTAwMCArICgoX1ZGKSAqIDQpKSAvKiBfaT0wLi4uMTI3ICovIC8qIFJlc2V0OiBWRlIgKi8KKyNkZWZpbmUgSTQwRV9WRklOVF9TVEFUX0NUTDAoX1ZGKSAoMHgwMDAyQTAwMCArICgoX1ZGKSAqIDQpKSAvKiBfaT0wLi4uMTI3ICovIC8qIFJlc2V0OiBDT1JFUiAqLwogI2RlZmluZSBJNDBFX1ZGSU5UX1NUQVRfQ1RMMF9NQVhfSU5ERVggMTI3CiAjZGVmaW5lIEk0MEVfVkZJTlRfU1RBVF9DVEwwX09USEVSX0lUUl9JTkRYX1NISUZUIDIKICNkZWZpbmUgSTQwRV9WRklOVF9TVEFUX0NUTDBfT1RIRVJfSVRSX0lORFhfTUFTSyBJNDBFX01BU0soMHgzLCBJNDBFX1ZGSU5UX1NUQVRfQ1RMMF9PVEhFUl9JVFJfSU5EWF9TSElGVCkKQEAgLTE4MDMsOSArMTgwOCw2IEBACiAjZGVmaW5lIEk0MEVfR0xQQ0lfR1NDTl8wXzNfTUFYX0lOREVYIDMKICNkZWZpbmUgSTQwRV9HTFBDSV9HU0NOXzBfM19FVkVOVF9DT1VOVEVSX1NISUZUIDAKICNkZWZpbmUgSTQwRV9HTFBDSV9HU0NOXzBfM19FVkVOVF9DT1VOVEVSX01BU0sgSTQwRV9NQVNLKDB4RkZGRkZGRkYsIEk0MEVfR0xQQ0lfR1NDTl8wXzNfRVZFTlRfQ09VTlRFUl9TSElGVCkKLSNkZWZpbmUgSTQwRV9HTFBDSV9MQVRDVCAweDAwMDlDNEI0IC8qIFJlc2V0OiBQQ0lSICovCi0jZGVmaW5lIEk0MEVfR0xQQ0lfTEFUQ1RfUENJX0NPVU5UX0xBVF9DVF9TSElGVCAwCi0jZGVmaW5lIEk0MEVfR0xQQ0lfTEFUQ1RfUENJX0NPVU5UX0xBVF9DVF9NQVNLIEk0MEVfTUFTSygweEZGRkZGRkZGLCBJNDBFX0dMUENJX0xBVENUX1BDSV9DT1VOVF9MQVRfQ1RfU0hJRlQpCiAjZGVmaW5lIEk0MEVfR0xQQ0lfTEJBUkNUUkwgMHgwMDBCRTQ4NCAvKiBSZXNldDogUE9SICovCiAjZGVmaW5lIEk0MEVfR0xQQ0lfTEJBUkNUUkxfUFJFRkJBUl9TSElGVCAwCiAjZGVmaW5lIEk0MEVfR0xQQ0lfTEJBUkNUUkxfUFJFRkJBUl9NQVNLIEk0MEVfTUFTSygweDEsIEk0MEVfR0xQQ0lfTEJBUkNUUkxfUFJFRkJBUl9TSElGVCkKQEAgLTE5MDIsNiArMTkwNCwxMSBAQAogI2RlZmluZSBJNDBFX0dMUENJX1ZGU1VQX1ZGX1BSRUZFVENIX01BU0sgSTQwRV9NQVNLKDB4MSwgSTQwRV9HTFBDSV9WRlNVUF9WRl9QUkVGRVRDSF9TSElGVCkKICNkZWZpbmUgSTQwRV9HTFBDSV9WRlNVUF9WUl9CQVJfVFlQRV9TSElGVCAxCiAjZGVmaW5lIEk0MEVfR0xQQ0lfVkZTVVBfVlJfQkFSX1RZUEVfTUFTSyBJNDBFX01BU0soMHgxLCBJNDBFX0dMUENJX1ZGU1VQX1ZSX0JBUl9UWVBFX1NISUZUKQorI2RlZmluZSBJNDBFX0dMVFBIX0NUUkwgMHgwMDBCRTQ4MCAvKiBSZXNldDogUENJUiAqLworI2RlZmluZSBJNDBFX0dMVFBIX0NUUkxfREVTQ19QSF9TSElGVCA5CisjZGVmaW5lIEk0MEVfR0xUUEhfQ1RSTF9ERVNDX1BIX01BU0sgSTQwRV9NQVNLKDB4MywgSTQwRV9HTFRQSF9DVFJMX0RFU0NfUEhfU0hJRlQpCisjZGVmaW5lIEk0MEVfR0xUUEhfQ1RSTF9EQVRBX1BIX1NISUZUIDExCisjZGVmaW5lIEk0MEVfR0xUUEhfQ1RSTF9EQVRBX1BIX01BU0sgSTQwRV9NQVNLKDB4MywgSTQwRV9HTFRQSF9DVFJMX0RBVEFfUEhfU0hJRlQpCiAjZGVmaW5lIEk0MEVfUEZfRlVOQ19SSUQgMHgwMDA5QzAwMCAvKiBSZXNldDogUENJUiAqLwogI2RlZmluZSBJNDBFX1BGX0ZVTkNfUklEX0ZVTkNUSU9OX05VTUJFUl9TSElGVCAwCiAjZGVmaW5lIEk0MEVfUEZfRlVOQ19SSURfRlVOQ1RJT05fTlVNQkVSX01BU0sgSTQwRV9NQVNLKDB4NywgSTQwRV9QRl9GVU5DX1JJRF9GVU5DVElPTl9OVU1CRVJfU0hJRlQpCkBAIC0yMzc0LDIwICsyMzgxLDIwIEBACiAjZGVmaW5lIEk0MEVfR0xfUlhFUlIyX0xfRkNPRURJWEFDX01BU0sgSTQwRV9NQVNLKDB4RkZGRkZGRkYsIEk0MEVfR0xfUlhFUlIyX0xfRkNPRURJWEFDX1NISUZUKQogI2RlZmluZSBJNDBFX0dMUFJUX0JQUkNIKF9pKSAoMHgwMDMwMDVFNCArICgoX2kpICogOCkpIC8qIF9pPTAuLi4zICovIC8qIFJlc2V0OiBDT1JFUiAqLwogI2RlZmluZSBJNDBFX0dMUFJUX0JQUkNIX01BWF9JTkRFWCAzCi0jZGVmaW5lIEk0MEVfR0xQUlRfQlBSQ0hfVVBSQ0hfU0hJRlQgMAotI2RlZmluZSBJNDBFX0dMUFJUX0JQUkNIX1VQUkNIX01BU0sgSTQwRV9NQVNLKDB4RkZGRiwgSTQwRV9HTFBSVF9CUFJDSF9VUFJDSF9TSElGVCkKKyNkZWZpbmUgSTQwRV9HTFBSVF9CUFJDSF9CUFJDSF9TSElGVCAwCisjZGVmaW5lIEk0MEVfR0xQUlRfQlBSQ0hfQlBSQ0hfTUFTSyBJNDBFX01BU0soMHhGRkZGLCBJNDBFX0dMUFJUX0JQUkNIX0JQUkNIX1NISUZUKQogI2RlZmluZSBJNDBFX0dMUFJUX0JQUkNMKF9pKSAoMHgwMDMwMDVFMCArICgoX2kpICogOCkpIC8qIF9pPTAuLi4zICovIC8qIFJlc2V0OiBDT1JFUiAqLwogI2RlZmluZSBJNDBFX0dMUFJUX0JQUkNMX01BWF9JTkRFWCAzCi0jZGVmaW5lIEk0MEVfR0xQUlRfQlBSQ0xfVVBSQ0hfU0hJRlQgMAotI2RlZmluZSBJNDBFX0dMUFJUX0JQUkNMX1VQUkNIX01BU0sgSTQwRV9NQVNLKDB4RkZGRkZGRkYsIEk0MEVfR0xQUlRfQlBSQ0xfVVBSQ0hfU0hJRlQpCisjZGVmaW5lIEk0MEVfR0xQUlRfQlBSQ0xfQlBSQ0xfU0hJRlQgMAorI2RlZmluZSBJNDBFX0dMUFJUX0JQUkNMX0JQUkNMX01BU0sgSTQwRV9NQVNLKDB4RkZGRkZGRkYsIEk0MEVfR0xQUlRfQlBSQ0xfQlBSQ0xfU0hJRlQpCiAjZGVmaW5lIEk0MEVfR0xQUlRfQlBUQ0goX2kpICgweDAwMzAwQTA0ICsgKChfaSkgKiA4KSkgLyogX2k9MC4uLjMgKi8gLyogUmVzZXQ6IENPUkVSICovCiAjZGVmaW5lIEk0MEVfR0xQUlRfQlBUQ0hfTUFYX0lOREVYIDMKLSNkZWZpbmUgSTQwRV9HTFBSVF9CUFRDSF9VUFJDSF9TSElGVCAwCi0jZGVmaW5lIEk0MEVfR0xQUlRfQlBUQ0hfVVBSQ0hfTUFTSyBJNDBFX01BU0soMHhGRkZGLCBJNDBFX0dMUFJUX0JQVENIX1VQUkNIX1NISUZUKQorI2RlZmluZSBJNDBFX0dMUFJUX0JQVENIX0JQVENIX1NISUZUIDAKKyNkZWZpbmUgSTQwRV9HTFBSVF9CUFRDSF9CUFRDSF9NQVNLIEk0MEVfTUFTSygweEZGRkYsIEk0MEVfR0xQUlRfQlBUQ0hfQlBUQ0hfU0hJRlQpCiAjZGVmaW5lIEk0MEVfR0xQUlRfQlBUQ0woX2kpICgweDAwMzAwQTAwICsgKChfaSkgKiA4KSkgLyogX2k9MC4uLjMgKi8gLyogUmVzZXQ6IENPUkVSICovCiAjZGVmaW5lIEk0MEVfR0xQUlRfQlBUQ0xfTUFYX0lOREVYIDMKLSNkZWZpbmUgSTQwRV9HTFBSVF9CUFRDTF9VUFJDSF9TSElGVCAwCi0jZGVmaW5lIEk0MEVfR0xQUlRfQlBUQ0xfVVBSQ0hfTUFTSyBJNDBFX01BU0soMHhGRkZGRkZGRiwgSTQwRV9HTFBSVF9CUFRDTF9VUFJDSF9TSElGVCkKKyNkZWZpbmUgSTQwRV9HTFBSVF9CUFRDTF9CUFRDTF9TSElGVCAwCisjZGVmaW5lIEk0MEVfR0xQUlRfQlBUQ0xfQlBUQ0xfTUFTSyBJNDBFX01BU0soMHhGRkZGRkZGRiwgSTQwRV9HTFBSVF9CUFRDTF9CUFRDTF9TSElGVCkKICNkZWZpbmUgSTQwRV9HTFBSVF9DUkNFUlJTKF9pKSAoMHgwMDMwMDA4MCArICgoX2kpICogOCkpIC8qIF9pPTAuLi4zICovIC8qIFJlc2V0OiBDT1JFUiAqLwogI2RlZmluZSBJNDBFX0dMUFJUX0NSQ0VSUlNfTUFYX0lOREVYIDMKICNkZWZpbmUgSTQwRV9HTFBSVF9DUkNFUlJTX0NSQ0VSUlNfU0hJRlQgMApAQCAtMjYyMCwxMCArMjYyNyw2IEBACiAjZGVmaW5lIEk0MEVfR0xQUlRfVERPTERfTUFYX0lOREVYIDMKICNkZWZpbmUgSTQwRV9HTFBSVF9URE9MRF9HTFBSVF9URE9MRF9TSElGVCAwCiAjZGVmaW5lIEk0MEVfR0xQUlRfVERPTERfR0xQUlRfVERPTERfTUFTSyBJNDBFX01BU0soMHhGRkZGRkZGRiwgSTQwRV9HTFBSVF9URE9MRF9HTFBSVF9URE9MRF9TSElGVCkKLSNkZWZpbmUgSTQwRV9HTFBSVF9URFBDKF9pKSAoMHgwMDM3NTQwMCArICgoX2kpICogOCkpIC8qIF9pPTAuLi4zICovIC8qIFJlc2V0OiBDT1JFUiAqLwotI2RlZmluZSBJNDBFX0dMUFJUX1REUENfTUFYX0lOREVYIDMKLSNkZWZpbmUgSTQwRV9HTFBSVF9URFBDX1REUENfU0hJRlQgMAotI2RlZmluZSBJNDBFX0dMUFJUX1REUENfVERQQ19NQVNLIEk0MEVfTUFTSygweEZGRkZGRkZGLCBJNDBFX0dMUFJUX1REUENfVERQQ19TSElGVCkKICNkZWZpbmUgSTQwRV9HTFBSVF9VUFJDSChfaSkgKDB4MDAzMDA1QTQgKyAoKF9pKSAqIDgpKSAvKiBfaT0wLi4uMyAqLyAvKiBSZXNldDogQ09SRVIgKi8KICNkZWZpbmUgSTQwRV9HTFBSVF9VUFJDSF9NQVhfSU5ERVggMwogI2RlZmluZSBJNDBFX0dMUFJUX1VQUkNIX1VQUkNIX1NISUZUIDAKQEAgLTI5OTAsOSArMjk5Myw2IEBACiAjZGVmaW5lIEk0MEVfUFJUVFNZTl9UWFRJTUVfTCAweDAwMUU0MUMwIC8qIFJlc2V0OiBHTE9CUiAqLwogI2RlZmluZSBJNDBFX1BSVFRTWU5fVFhUSU1FX0xfVFhUSUVNX0xfU0hJRlQgMAogI2RlZmluZSBJNDBFX1BSVFRTWU5fVFhUSU1FX0xfVFhUSUVNX0xfTUFTSyBJNDBFX01BU0soMHhGRkZGRkZGRiwgSTQwRV9QUlRUU1lOX1RYVElNRV9MX1RYVElFTV9MX1NISUZUKQotI2RlZmluZSBJNDBFX0dMU0NEX1FVQU5UQSAweDAwMEIyMDgwIC8qIFJlc2V0OiBDT1JFUiAqLwotI2RlZmluZSBJNDBFX0dMU0NEX1FVQU5UQV9UU0NEUVVBTlRBX1NISUZUIDAKLSNkZWZpbmUgSTQwRV9HTFNDRF9RVUFOVEFfVFNDRFFVQU5UQV9NQVNLIEk0MEVfTUFTSygweDcsIEk0MEVfR0xTQ0RfUVVBTlRBX1RTQ0RRVUFOVEFfU0hJRlQpCiAjZGVmaW5lIEk0MEVfR0xfTURFVF9SWCAweDAwMTJBNTEwIC8qIFJlc2V0OiBDT1JFUiAqLwogI2RlZmluZSBJNDBFX0dMX01ERVRfUlhfRlVOQ1RJT05fU0hJRlQgMAogI2RlZmluZSBJNDBFX0dMX01ERVRfUlhfRlVOQ1RJT05fTUFTSyBJNDBFX01BU0soMHhGRiwgSTQwRV9HTF9NREVUX1JYX0ZVTkNUSU9OX1NISUZUKQpAQCAtMzI1OCw3ICszMjU4LDcgQEAKICNkZWZpbmUgSTQwRV9WRklOVF9JVFJOMV9NQVhfSU5ERVggMgogI2RlZmluZSBJNDBFX1ZGSU5UX0lUUk4xX0lOVEVSVkFMX1NISUZUIDAKICNkZWZpbmUgSTQwRV9WRklOVF9JVFJOMV9JTlRFUlZBTF9NQVNLIEk0MEVfTUFTSygweEZGRiwgSTQwRV9WRklOVF9JVFJOMV9JTlRFUlZBTF9TSElGVCkKLSNkZWZpbmUgSTQwRV9WRklOVF9TVEFUX0NUTDAxIDB4MDAwMDU0MDAgLyogUmVzZXQ6IFZGUiAqLworI2RlZmluZSBJNDBFX1ZGSU5UX1NUQVRfQ1RMMDEgMHgwMDAwNTQwMCAvKiBSZXNldDogQ09SRVIgKi8KICNkZWZpbmUgSTQwRV9WRklOVF9TVEFUX0NUTDAxX09USEVSX0lUUl9JTkRYX1NISUZUIDIKICNkZWZpbmUgSTQwRV9WRklOVF9TVEFUX0NUTDAxX09USEVSX0lUUl9JTkRYX01BU0sgSTQwRV9NQVNLKDB4MywgSTQwRV9WRklOVF9TVEFUX0NUTDAxX09USEVSX0lUUl9JTkRYX1NISUZUKQogI2RlZmluZSBJNDBFX1FSWF9UQUlMMShfUSkgKDB4MDAwMDIwMDAgKyAoKF9RKSAqIDQpKSAvKiBfaT0wLi4uMTUgKi8gLyogUmVzZXQ6IENPUkVSICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eHJ4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eHJ4LmMKaW5kZXggNzA4ODkxNS4uYjA3N2UwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R4cnguYwpAQCAtMjUsNiArMjUsNyBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bmV0L2J1c3lfcG9sbC5oPgogCiAjaW5jbHVkZSAiaTQwZXZmLmgiCiAjaW5jbHVkZSAiaTQwZV9wcm90b3R5cGUuaCIKQEAgLTI4OCw2ICsyODksOCBAQAogCQkJdHhfZGVzYyA9IEk0MEVfVFhfREVTQyh0eF9yaW5nLCAwKTsKIAkJfQogCisJCXByZWZldGNoKHR4X2Rlc2MpOworCiAJCS8qIHVwZGF0ZSBidWRnZXQgYWNjb3VudGluZyAqLwogCQlidWRnZXQtLTsKIAl9IHdoaWxlIChsaWtlbHkoYnVkZ2V0KSk7CkBAIC0zNjgsNiArMzcxLDcgQEAKIHN0YXRpYyB2b2lkIGk0MGVfZm9yY2Vfd2Ioc3RydWN0IGk0MGVfdnNpICp2c2ksIHN0cnVjdCBpNDBlX3FfdmVjdG9yICpxX3ZlY3RvcikKIHsKIAl1MzIgdmFsID0gSTQwRV9WRklOVF9EWU5fQ1RMTl9JTlRFTkFfTUFTSyB8CisJCSAgSTQwRV9WRklOVF9EWU5fQ1RMTjFfSVRSX0lORFhfTUFTSyB8IC8qIHNldCBub2l0ciAqLwogCQkgIEk0MEVfVkZJTlRfRFlOX0NUTE5fU1dJTlRfVFJJR19NQVNLIHwKIAkJICBJNDBFX1ZGSU5UX0RZTl9DVExOX1NXX0lUUl9JTkRYX0VOQV9NQVNLOwogCQkgIC8qIGFsbG93IDAwIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGluZGV4ICovCkBAIC01MjksNiArNTMzLDIyIEBACiAJaWYgKCFyeF9yaW5nLT5yeF9iaSkKIAkJcmV0dXJuOwogCisJaWYgKHJpbmdfaXNfcHNfZW5hYmxlZChyeF9yaW5nKSkgeworCQlpbnQgYnVmc3ogPSBBTElHTihyeF9yaW5nLT5yeF9oZHJfbGVuLCAyNTYpICogcnhfcmluZy0+Y291bnQ7CisKKwkJcnhfYmkgPSAmcnhfcmluZy0+cnhfYmlbMF07CisJCWlmIChyeF9iaS0+aGRyX2J1ZikgeworCQkJZG1hX2ZyZWVfY29oZXJlbnQoZGV2LAorCQkJCQkgIGJ1ZnN6LAorCQkJCQkgIHJ4X2JpLT5oZHJfYnVmLAorCQkJCQkgIHJ4X2JpLT5kbWEpOworCQkJZm9yIChpID0gMDsgaSA8IHJ4X3JpbmctPmNvdW50OyBpKyspIHsKKwkJCQlyeF9iaSA9ICZyeF9yaW5nLT5yeF9iaVtpXTsKKwkJCQlyeF9iaS0+ZG1hID0gMDsKKwkJCQlyeF9iaS0+aGRyX2J1ZiA9IE5VTEw7CisJCQl9CisJCX0KKwl9CiAJLyogRnJlZSBhbGwgdGhlIFJ4IHJpbmcgc2tfYnVmZnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgcnhfcmluZy0+Y291bnQ7IGkrKykgewogCQlyeF9iaSA9ICZyeF9yaW5nLT5yeF9iaVtpXTsKQEAgLTU4Nyw2ICs2MDcsMzcgQEAKIH0KIAogLyoqCisgKiBpNDBldmZfYWxsb2NfcnhfaGVhZGVycyAtIGFsbG9jYXRlIHJ4IGhlYWRlciBidWZmZXJzCisgKiBAcnhfcmluZzogcmluZyB0byBhbGxvYyBidWZmZXJzCisgKgorICogQWxsb2NhdGUgcnggaGVhZGVyIGJ1ZmZlcnMgZm9yIHRoZSBlbnRpcmUgcmluZy4gQXMgdGhlc2UgYXJlIHN0YXRpYywKKyAqIHRoaXMgaXMgb25seSBjYWxsZWQgd2hlbiBzZXR0aW5nIHVwIGEgbmV3IHJpbmcuCisgKiovCit2b2lkIGk0MGV2Zl9hbGxvY19yeF9oZWFkZXJzKHN0cnVjdCBpNDBlX3JpbmcgKnJ4X3JpbmcpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnhfcmluZy0+ZGV2OworCXN0cnVjdCBpNDBlX3J4X2J1ZmZlciAqcnhfYmk7CisJZG1hX2FkZHJfdCBkbWE7CisJdm9pZCAqYnVmZmVyOworCWludCBidWZfc2l6ZTsKKwlpbnQgaTsKKworCWlmIChyeF9yaW5nLT5yeF9iaVswXS5oZHJfYnVmKQorCQlyZXR1cm47CisJLyogTWFrZSBzdXJlIHRoZSBidWZmZXJzIGRvbid0IGNyb3NzIGNhY2hlIGxpbmUgYm91bmRhcmllcy4gKi8KKwlidWZfc2l6ZSA9IEFMSUdOKHJ4X3JpbmctPnJ4X2hkcl9sZW4sIDI1Nik7CisJYnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgYnVmX3NpemUgKiByeF9yaW5nLT5jb3VudCwKKwkJCQkgICAgJmRtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgcnhfcmluZy0+Y291bnQ7IGkrKykgeworCQlyeF9iaSA9ICZyeF9yaW5nLT5yeF9iaVtpXTsKKwkJcnhfYmktPmRtYSA9IGRtYSArIChpICogYnVmX3NpemUpOworCQlyeF9iaS0+aGRyX2J1ZiA9IGJ1ZmZlciArIChpICogYnVmX3NpemUpOworCX0KK30KKworLyoqCiAgKiBpNDBldmZfc2V0dXBfcnhfZGVzY3JpcHRvcnMgLSBBbGxvY2F0ZSBSeCBkZXNjcmlwdG9ycwogICogQHJ4X3Jpbmc6IFJ4IGRlc2NyaXB0b3IgcmluZyAoZm9yIGEgc3BlY2lmaWMgcXVldWUpIHRvIHNldHVwCiAgKgpAQCAtNjQ2LDExICs2OTcsNzYgQEAKIH0KIAogLyoqCi0gKiBpNDBldmZfYWxsb2NfcnhfYnVmZmVycyAtIFJlcGxhY2UgdXNlZCByZWNlaXZlIGJ1ZmZlcnM7IHBhY2tldCBzcGxpdAorICogaTQwZXZmX2FsbG9jX3J4X2J1ZmZlcnNfcHMgLSBSZXBsYWNlIHVzZWQgcmVjZWl2ZSBidWZmZXJzOyBwYWNrZXQgc3BsaXQKICAqIEByeF9yaW5nOiByaW5nIHRvIHBsYWNlIGJ1ZmZlcnMgb24KICAqIEBjbGVhbmVkX2NvdW50OiBudW1iZXIgb2YgYnVmZmVycyB0byByZXBsYWNlCiAgKiovCi12b2lkIGk0MGV2Zl9hbGxvY19yeF9idWZmZXJzKHN0cnVjdCBpNDBlX3JpbmcgKnJ4X3JpbmcsIHUxNiBjbGVhbmVkX2NvdW50KQordm9pZCBpNDBldmZfYWxsb2NfcnhfYnVmZmVyc19wcyhzdHJ1Y3QgaTQwZV9yaW5nICpyeF9yaW5nLCB1MTYgY2xlYW5lZF9jb3VudCkKK3sKKwl1MTYgaSA9IHJ4X3JpbmctPm5leHRfdG9fdXNlOworCXVuaW9uIGk0MGVfcnhfZGVzYyAqcnhfZGVzYzsKKwlzdHJ1Y3QgaTQwZV9yeF9idWZmZXIgKmJpOworCisJLyogZG8gbm90aGluZyBpZiBubyB2YWxpZCBuZXRkZXYgZGVmaW5lZCAqLworCWlmICghcnhfcmluZy0+bmV0ZGV2IHx8ICFjbGVhbmVkX2NvdW50KQorCQlyZXR1cm47CisKKwl3aGlsZSAoY2xlYW5lZF9jb3VudC0tKSB7CisJCXJ4X2Rlc2MgPSBJNDBFX1JYX0RFU0MocnhfcmluZywgaSk7CisJCWJpID0gJnJ4X3JpbmctPnJ4X2JpW2ldOworCisJCWlmIChiaS0+c2tiKSAvKiBkZXNjIGlzIGluIHVzZSAqLworCQkJZ290byBub19idWZmZXJzOworCQlpZiAoIWJpLT5wYWdlKSB7CisJCQliaS0+cGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyk7CisJCQlpZiAoIWJpLT5wYWdlKSB7CisJCQkJcnhfcmluZy0+cnhfc3RhdHMuYWxsb2NfcGFnZV9mYWlsZWQrKzsKKwkJCQlnb3RvIG5vX2J1ZmZlcnM7CisJCQl9CisJCX0KKworCQlpZiAoIWJpLT5wYWdlX2RtYSkgeworCQkJLyogdXNlIGEgaGFsZiBwYWdlIGlmIHdlJ3JlIHJlLXVzaW5nICovCisJCQliaS0+cGFnZV9vZmZzZXQgXj0gUEFHRV9TSVpFIC8gMjsKKwkJCWJpLT5wYWdlX2RtYSA9IGRtYV9tYXBfcGFnZShyeF9yaW5nLT5kZXYsCisJCQkJCQkgICAgYmktPnBhZ2UsCisJCQkJCQkgICAgYmktPnBhZ2Vfb2Zmc2V0LAorCQkJCQkJICAgIFBBR0VfU0laRSAvIDIsCisJCQkJCQkgICAgRE1BX0ZST01fREVWSUNFKTsKKwkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihyeF9yaW5nLT5kZXYsCisJCQkJCSAgICAgIGJpLT5wYWdlX2RtYSkpIHsKKwkJCQlyeF9yaW5nLT5yeF9zdGF0cy5hbGxvY19wYWdlX2ZhaWxlZCsrOworCQkJCWJpLT5wYWdlX2RtYSA9IDA7CisJCQkJZ290byBub19idWZmZXJzOworCQkJfQorCQl9CisKKwkJZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2UocnhfcmluZy0+ZGV2LAorCQkJCQkJIGJpLT5kbWEsCisJCQkJCQkgMCwKKwkJCQkJCSByeF9yaW5nLT5yeF9oZHJfbGVuLAorCQkJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCS8qIFJlZnJlc2ggdGhlIGRlc2MgZXZlbiBpZiBidWZmZXJfYWRkcnMgZGlkbid0IGNoYW5nZQorCQkgKiBiZWNhdXNlIGVhY2ggd3JpdGUtYmFjayBlcmFzZXMgdGhpcyBpbmZvLgorCQkgKi8KKwkJcnhfZGVzYy0+cmVhZC5wa3RfYWRkciA9IGNwdV90b19sZTY0KGJpLT5wYWdlX2RtYSk7CisJCXJ4X2Rlc2MtPnJlYWQuaGRyX2FkZHIgPSBjcHVfdG9fbGU2NChiaS0+ZG1hKTsKKwkJaSsrOworCQlpZiAoaSA9PSByeF9yaW5nLT5jb3VudCkKKwkJCWkgPSAwOworCX0KKworbm9fYnVmZmVyczoKKwlpZiAocnhfcmluZy0+bmV4dF90b191c2UgIT0gaSkKKwkJaTQwZV9yZWxlYXNlX3J4X2Rlc2MocnhfcmluZywgaSk7Cit9CisKKy8qKgorICogaTQwZXZmX2FsbG9jX3J4X2J1ZmZlcnNfMWJ1ZiAtIFJlcGxhY2UgdXNlZCByZWNlaXZlIGJ1ZmZlcnM7IHNpbmdsZSBidWZmZXIKKyAqIEByeF9yaW5nOiByaW5nIHRvIHBsYWNlIGJ1ZmZlcnMgb24KKyAqIEBjbGVhbmVkX2NvdW50OiBudW1iZXIgb2YgYnVmZmVycyB0byByZXBsYWNlCisgKiovCit2b2lkIGk0MGV2Zl9hbGxvY19yeF9idWZmZXJzXzFidWYoc3RydWN0IGk0MGVfcmluZyAqcnhfcmluZywgdTE2IGNsZWFuZWRfY291bnQpCiB7CiAJdTE2IGkgPSByeF9yaW5nLT5uZXh0X3RvX3VzZTsKIAl1bmlvbiBpNDBlX3J4X2Rlc2MgKnJ4X2Rlc2M7CkBAIC02OTAsNDAgKzgwNiw4IEBACiAJCQl9CiAJCX0KIAotCQlpZiAocmluZ19pc19wc19lbmFibGVkKHJ4X3JpbmcpKSB7Ci0JCQlpZiAoIWJpLT5wYWdlKSB7Ci0JCQkJYmktPnBhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOwotCQkJCWlmICghYmktPnBhZ2UpIHsKLQkJCQkJcnhfcmluZy0+cnhfc3RhdHMuYWxsb2NfcGFnZV9mYWlsZWQrKzsKLQkJCQkJZ290byBub19idWZmZXJzOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFiaS0+cGFnZV9kbWEpIHsKLQkJCQkvKiB1c2UgYSBoYWxmIHBhZ2UgaWYgd2UncmUgcmUtdXNpbmcgKi8KLQkJCQliaS0+cGFnZV9vZmZzZXQgXj0gUEFHRV9TSVpFIC8gMjsKLQkJCQliaS0+cGFnZV9kbWEgPSBkbWFfbWFwX3BhZ2UocnhfcmluZy0+ZGV2LAotCQkJCQkJCSAgICBiaS0+cGFnZSwKLQkJCQkJCQkgICAgYmktPnBhZ2Vfb2Zmc2V0LAotCQkJCQkJCSAgICBQQUdFX1NJWkUgLyAyLAotCQkJCQkJCSAgICBETUFfRlJPTV9ERVZJQ0UpOwotCQkJCWlmIChkbWFfbWFwcGluZ19lcnJvcihyeF9yaW5nLT5kZXYsCi0JCQkJCQkgICAgICBiaS0+cGFnZV9kbWEpKSB7Ci0JCQkJCXJ4X3JpbmctPnJ4X3N0YXRzLmFsbG9jX3BhZ2VfZmFpbGVkKys7Ci0JCQkJCWJpLT5wYWdlX2RtYSA9IDA7Ci0JCQkJCWdvdG8gbm9fYnVmZmVyczsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qIFJlZnJlc2ggdGhlIGRlc2MgZXZlbiBpZiBidWZmZXJfYWRkcnMgZGlkbid0IGNoYW5nZQotCQkJICogYmVjYXVzZSBlYWNoIHdyaXRlLWJhY2sgZXJhc2VzIHRoaXMgaW5mby4KLQkJCSAqLwotCQkJcnhfZGVzYy0+cmVhZC5wa3RfYWRkciA9IGNwdV90b19sZTY0KGJpLT5wYWdlX2RtYSk7Ci0JCQlyeF9kZXNjLT5yZWFkLmhkcl9hZGRyID0gY3B1X3RvX2xlNjQoYmktPmRtYSk7Ci0JCX0gZWxzZSB7Ci0JCQlyeF9kZXNjLT5yZWFkLnBrdF9hZGRyID0gY3B1X3RvX2xlNjQoYmktPmRtYSk7Ci0JCQlyeF9kZXNjLT5yZWFkLmhkcl9hZGRyID0gMDsKLQkJfQorCQlyeF9kZXNjLT5yZWFkLnBrdF9hZGRyID0gY3B1X3RvX2xlNjQoYmktPmRtYSk7CisJCXJ4X2Rlc2MtPnJlYWQuaGRyX2FkZHIgPSAwOwogCQlpKys7CiAJCWlmIChpID09IHJ4X3JpbmctPmNvdW50KQogCQkJaSA9IDA7CkBAIC03NzcsMTAgKzg2MSwxMCBAQAogCXN0cnVjdCBpcGhkciAqaXBoOwogCV9fc3VtMTYgY3N1bTsKIAotCWlwdjRfdHVubmVsID0gKHJ4X3B0eXBlID4gSTQwRV9SWF9QVFlQRV9HUkVOQVQ0X01BQ19QQVkzKSAmJgotCQkgICAgICAocnhfcHR5cGUgPCBJNDBFX1JYX1BUWVBFX0dSRU5BVDRfTUFDVkxBTl9JUFY2X0lDTVBfUEFZNCk7Ci0JaXB2Nl90dW5uZWwgPSAocnhfcHR5cGUgPiBJNDBFX1JYX1BUWVBFX0dSRU5BVDZfTUFDX1BBWTMpICYmCi0JCSAgICAgIChyeF9wdHlwZSA8IEk0MEVfUlhfUFRZUEVfR1JFTkFUNl9NQUNWTEFOX0lQVjZfSUNNUF9QQVk0KTsKKwlpcHY0X3R1bm5lbCA9IChyeF9wdHlwZSA+PSBJNDBFX1JYX1BUWVBFX0dSRU5BVDRfTUFDX1BBWTMpICYmCisJCSAgICAgKHJ4X3B0eXBlIDw9IEk0MEVfUlhfUFRZUEVfR1JFTkFUNF9NQUNWTEFOX0lQVjZfSUNNUF9QQVk0KTsKKwlpcHY2X3R1bm5lbCA9IChyeF9wdHlwZSA+PSBJNDBFX1JYX1BUWVBFX0dSRU5BVDZfTUFDX1BBWTMpICYmCisJCSAgICAgKHJ4X3B0eXBlIDw9IEk0MEVfUlhfUFRZUEVfR1JFTkFUNl9NQUNWTEFOX0lQVjZfSUNNUF9QQVk0KTsKIAogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKIApAQCAtODMxLDkgKzkxNSw3IEBACiAJICogc28gdGhlIHRvdGFsIGxlbmd0aCBvZiBJUHY0IGhlYWRlciBpcyBJSEwqNCBieXRlcwogCSAqIFRoZSBVRFBfMCBiaXQgKm1heSogYmV0IHNldCBpZiB0aGUgKmlubmVyKiBoZWFkZXIgaXMgVURQCiAJICovCi0JaWYgKGlwdjRfdHVubmVsICYmCi0JICAgIChkZWNvZGVkLmlubmVyX3Byb3QgIT0gSTQwRV9SWF9QVFlQRV9JTk5FUl9QUk9UX1VEUCkgJiYKLQkgICAgIShyeF9zdGF0dXMgJiAoMSA8PCBJNDBFX1JYX0RFU0NfU1RBVFVTX1VEUF8wX1NISUZUKSkpIHsKKwlpZiAoaXB2NF90dW5uZWwpIHsKIAkJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5tYWNfaGVhZGVyICsKIAkJCQkJc2l6ZW9mKHN0cnVjdCBldGhoZHIpICsKIAkJCQkJKGlwX2hkcihza2IpLT5paGwgKiA0KTsKQEAgLTg0MywxNSArOTI1LDE5IEBACiAJCQkJCSAgc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxQUQpKQogCQkJCQkgID8gVkxBTl9ITEVOIDogMDsKIAotCQlyeF91ZHBfY3N1bSA9IHVkcF9jc3VtKHNrYik7Ci0JCWlwaCA9IGlwX2hkcihza2IpOwotCQljc3VtID0gY3N1bV90Y3B1ZHBfbWFnaWMoCi0JCQkJaXBoLT5zYWRkciwgaXBoLT5kYWRkciwKLQkJCQkoc2tiLT5sZW4gLSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpKSwKLQkJCQlJUFBST1RPX1VEUCwgcnhfdWRwX2NzdW0pOworCQlpZiAoKGlwX2hkcihza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkgJiYKKwkJICAgICh1ZHBfaGRyKHNrYiktPmNoZWNrICE9IDApKSB7CisJCQlyeF91ZHBfY3N1bSA9IHVkcF9jc3VtKHNrYik7CisJCQlpcGggPSBpcF9oZHIoc2tiKTsKKwkJCWNzdW0gPSBjc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLAorCQkJCQkJIChza2ItPmxlbiAtCisJCQkJCQkgIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikpLAorCQkJCQkJIElQUFJPVE9fVURQLCByeF91ZHBfY3N1bSk7CiAKLQkJaWYgKHVkcF9oZHIoc2tiKS0+Y2hlY2sgIT0gY3N1bSkKLQkJCWdvdG8gY2hlY2tzdW1fZmFpbDsKKwkJCWlmICh1ZHBfaGRyKHNrYiktPmNoZWNrICE9IGNzdW0pCisJCQkJZ290byBjaGVja3N1bV9mYWlsOworCisJCX0gLyogZWxzZSBpdHMgR1JFIGFuZCBzbyBubyBvdXRlciBVRFAgaGVhZGVyICovCiAJfQogCiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKQEAgLTkwNiwxMyArOTkyLDEzIEBACiB9CiAKIC8qKgotICogaTQwZV9jbGVhbl9yeF9pcnEgLSBSZWNsYWltIHJlc291cmNlcyBhZnRlciByZWNlaXZlIGNvbXBsZXRlcworICogaTQwZV9jbGVhbl9yeF9pcnFfcHMgLSBSZWNsYWltIHJlc291cmNlcyBhZnRlciByZWNlaXZlOyBwYWNrZXQgc3BsaXQKICAqIEByeF9yaW5nOiAgcnggcmluZyB0byBjbGVhbgogICogQGJ1ZGdldDogICBob3cgbWFueSBjbGVhbnMgd2UncmUgYWxsb3dlZAogICoKICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSdzIGFueSBidWRnZXQgbGVmdCAoZS5nLiB0aGUgY2xlYW4gaXMgZmluaXNoZWQpCiAgKiovCi1zdGF0aWMgaW50IGk0MGVfY2xlYW5fcnhfaXJxKHN0cnVjdCBpNDBlX3JpbmcgKnJ4X3JpbmcsIGludCBidWRnZXQpCitzdGF0aWMgaW50IGk0MGVfY2xlYW5fcnhfaXJxX3BzKHN0cnVjdCBpNDBlX3JpbmcgKnJ4X3JpbmcsIGludCBidWRnZXQpCiB7CiAJdW5zaWduZWQgaW50IHRvdGFsX3J4X2J5dGVzID0gMCwgdG90YWxfcnhfcGFja2V0cyA9IDA7CiAJdTE2IHJ4X3BhY2tldF9sZW4sIHJ4X2hlYWRlcl9sZW4sIHJ4X3NwaCwgcnhfaGJvOwpAQCAtOTI1LDIwICsxMDExLDQ5IEBACiAJdTggcnhfcHR5cGU7CiAJdTY0IHF3b3JkOwogCi0JcnhfZGVzYyA9IEk0MEVfUlhfREVTQyhyeF9yaW5nLCBpKTsKLQlxd29yZCA9IGxlNjRfdG9fY3B1KHJ4X2Rlc2MtPndiLnF3b3JkMS5zdGF0dXNfZXJyb3JfbGVuKTsKLQlyeF9zdGF0dXMgPSAocXdvcmQgJiBJNDBFX1JYRF9RVzFfU1RBVFVTX01BU0spID4+Ci0JCSAgICBJNDBFX1JYRF9RVzFfU1RBVFVTX1NISUZUOwotCi0Jd2hpbGUgKHJ4X3N0YXR1cyAmICgxIDw8IEk0MEVfUlhfREVTQ19TVEFUVVNfRERfU0hJRlQpKSB7Ci0JCXVuaW9uIGk0MGVfcnhfZGVzYyAqbmV4dF9yeGQ7CisJZG8gewogCQlzdHJ1Y3QgaTQwZV9yeF9idWZmZXIgKnJ4X2JpOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCQl1MTYgdmxhbl90YWc7CisJCS8qIHJldHVybiBzb21lIGJ1ZmZlcnMgdG8gaGFyZHdhcmUsIG9uZSBhdCBhIHRpbWUgaXMgdG9vIHNsb3cgKi8KKwkJaWYgKGNsZWFuZWRfY291bnQgPj0gSTQwRV9SWF9CVUZGRVJfV1JJVEUpIHsKKwkJCWk0MGV2Zl9hbGxvY19yeF9idWZmZXJzX3BzKHJ4X3JpbmcsIGNsZWFuZWRfY291bnQpOworCQkJY2xlYW5lZF9jb3VudCA9IDA7CisJCX0KKworCQlpID0gcnhfcmluZy0+bmV4dF90b19jbGVhbjsKKwkJcnhfZGVzYyA9IEk0MEVfUlhfREVTQyhyeF9yaW5nLCBpKTsKKwkJcXdvcmQgPSBsZTY0X3RvX2NwdShyeF9kZXNjLT53Yi5xd29yZDEuc3RhdHVzX2Vycm9yX2xlbik7CisJCXJ4X3N0YXR1cyA9IChxd29yZCAmIEk0MEVfUlhEX1FXMV9TVEFUVVNfTUFTSykgPj4KKwkJCUk0MEVfUlhEX1FXMV9TVEFUVVNfU0hJRlQ7CisKKwkJaWYgKCEocnhfc3RhdHVzICYgKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19ERF9TSElGVCkpKQorCQkJYnJlYWs7CisKKwkJLyogVGhpcyBtZW1vcnkgYmFycmllciBpcyBuZWVkZWQgdG8ga2VlcCB1cyBmcm9tIHJlYWRpbmcKKwkJICogYW55IG90aGVyIGZpZWxkcyBvdXQgb2YgdGhlIHJ4X2Rlc2MgdW50aWwgd2Uga25vdyB0aGUKKwkJICogREQgYml0IGlzIHNldC4KKwkJICovCisJCWRtYV9ybWIoKTsKIAkJcnhfYmkgPSAmcnhfcmluZy0+cnhfYmlbaV07CiAJCXNrYiA9IHJ4X2JpLT5za2I7Ci0JCXByZWZldGNoKHNrYi0+ZGF0YSk7CisJCWlmIChsaWtlbHkoIXNrYikpIHsKKwkJCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24ocnhfcmluZy0+bmV0ZGV2LAorCQkJCQkJCXJ4X3JpbmctPnJ4X2hkcl9sZW4pOworCQkJaWYgKCFza2IpIHsKKwkJCQlyeF9yaW5nLT5yeF9zdGF0cy5hbGxvY19idWZmX2ZhaWxlZCsrOworCQkJCWJyZWFrOworCQkJfQogCisJCQkvKiBpbml0aWFsaXplIHF1ZXVlIG1hcHBpbmcgKi8KKwkJCXNrYl9yZWNvcmRfcnhfcXVldWUoc2tiLCByeF9yaW5nLT5xdWV1ZV9pbmRleCk7CisJCQkvKiB3ZSBhcmUgcmV1c2luZyBzbyBzeW5jIHRoaXMgYnVmZmVyIGZvciBDUFUgdXNlICovCisJCQlkbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShyeF9yaW5nLT5kZXYsCisJCQkJCQkgICAgICByeF9iaS0+ZG1hLAorCQkJCQkJICAgICAgMCwKKwkJCQkJCSAgICAgIHJ4X3JpbmctPnJ4X2hkcl9sZW4sCisJCQkJCQkgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCQl9CiAJCXJ4X3BhY2tldF9sZW4gPSAocXdvcmQgJiBJNDBFX1JYRF9RVzFfTEVOR1RIX1BCVUZfTUFTSykgPj4KIAkJCQlJNDBFX1JYRF9RVzFfTEVOR1RIX1BCVUZfU0hJRlQ7CiAJCXJ4X2hlYWRlcl9sZW4gPSAocXdvcmQgJiBJNDBFX1JYRF9RVzFfTEVOR1RIX0hCVUZfTUFTSykgPj4KQEAgLTk1Myw0MCArMTA2OCwzMCBAQAogCiAJCXJ4X3B0eXBlID0gKHF3b3JkICYgSTQwRV9SWERfUVcxX1BUWVBFX01BU0spID4+CiAJCQkgICBJNDBFX1JYRF9RVzFfUFRZUEVfU0hJRlQ7CisJCXByZWZldGNoKHJ4X2JpLT5wYWdlKTsKIAkJcnhfYmktPnNrYiA9IE5VTEw7Ci0KLQkJLyogVGhpcyBtZW1vcnkgYmFycmllciBpcyBuZWVkZWQgdG8ga2VlcCB1cyBmcm9tIHJlYWRpbmcKLQkJICogYW55IG90aGVyIGZpZWxkcyBvdXQgb2YgdGhlIHJ4X2Rlc2MgdW50aWwgd2Uga25vdyB0aGUKLQkJICogU1RBVFVTX0REIGJpdCBpcyBzZXQKLQkJICovCi0JCXJtYigpOwotCi0JCS8qIEdldCB0aGUgaGVhZGVyIGFuZCBwb3NzaWJseSB0aGUgd2hvbGUgcGFja2V0Ci0JCSAqIElmIHRoaXMgaXMgYW4gc2tiIGZyb20gcHJldmlvdXMgcmVjZWl2ZSBkbWEgd2lsbCBiZSAwCi0JCSAqLwotCQlpZiAocnhfYmktPmRtYSkgewotCQkJdTE2IGxlbjsKLQorCQljbGVhbmVkX2NvdW50Kys7CisJCWlmIChyeF9oYm8gfHwgcnhfc3BoKSB7CisJCQlpbnQgbGVuOwogCQkJaWYgKHJ4X2hibykKIAkJCQlsZW4gPSBJNDBFX1JYX0hEUl9TSVpFOwotCQkJZWxzZSBpZiAocnhfc3BoKQotCQkJCWxlbiA9IHJ4X2hlYWRlcl9sZW47Ci0JCQllbHNlIGlmIChyeF9wYWNrZXRfbGVuKQotCQkJCWxlbiA9IHJ4X3BhY2tldF9sZW47ICAgLyogMWJ1Zi9ubyBzcGxpdCBmb3VuZCAqLwogCQkJZWxzZQotCQkJCWxlbiA9IHJ4X2hlYWRlcl9sZW47ICAgLyogc3BsaXQgYWx3YXlzIG1vZGUgKi8KKwkJCQlsZW4gPSByeF9oZWFkZXJfbGVuOworCQkJbWVtY3B5KF9fc2tiX3B1dChza2IsIGxlbiksIHJ4X2JpLT5oZHJfYnVmLCBsZW4pOworCQl9IGVsc2UgaWYgKHNrYi0+bGVuID09IDApIHsKKwkJCWludCBsZW47CiAKLQkJCXNrYl9wdXQoc2tiLCBsZW4pOwotCQkJZG1hX3VubWFwX3NpbmdsZShyeF9yaW5nLT5kZXYsCi0JCQkJCSByeF9iaS0+ZG1hLAotCQkJCQkgcnhfcmluZy0+cnhfYnVmX2xlbiwKLQkJCQkJIERNQV9GUk9NX0RFVklDRSk7Ci0JCQlyeF9iaS0+ZG1hID0gMDsKKwkJCWxlbiA9IChyeF9wYWNrZXRfbGVuID4gc2tiX2hlYWRsZW4oc2tiKSA/CisJCQkJc2tiX2hlYWRsZW4oc2tiKSA6IHJ4X3BhY2tldF9sZW4pOworCQkJbWVtY3B5KF9fc2tiX3B1dChza2IsIGxlbiksCisJCQkgICAgICAgcnhfYmktPnBhZ2UgKyByeF9iaS0+cGFnZV9vZmZzZXQsCisJCQkgICAgICAgbGVuKTsKKwkJCXJ4X2JpLT5wYWdlX29mZnNldCArPSBsZW47CisJCQlyeF9wYWNrZXRfbGVuIC09IGxlbjsKIAkJfQogCiAJCS8qIEdldCB0aGUgcmVzdCBvZiB0aGUgZGF0YSBpZiB0aGlzIHdhcyBhIGhlYWRlciBzcGxpdCAqLwotCQlpZiAocmluZ19pc19wc19lbmFibGVkKHJ4X3JpbmcpICYmIHJ4X3BhY2tldF9sZW4pIHsKLQorCQlpZiAocnhfcGFja2V0X2xlbikgewogCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncywKIAkJCQkJICAgcnhfYmktPnBhZ2UsCiAJCQkJCSAgIHJ4X2JpLT5wYWdlX29mZnNldCwKQEAgLTEwMDgsMjIgKzExMTMsMTYgQEAKIAkJCQkgICAgICAgRE1BX0ZST01fREVWSUNFKTsKIAkJCXJ4X2JpLT5wYWdlX2RtYSA9IDA7CiAJCX0KLQkJSTQwRV9SWF9ORVhUX0RFU0NfUFJFRkVUQ0gocnhfcmluZywgaSwgbmV4dF9yeGQpOworCQlJNDBFX1JYX0lOQ1JFTUVOVChyeF9yaW5nLCBpKTsKIAogCQlpZiAodW5saWtlbHkoCiAJCSAgICAhKHJ4X3N0YXR1cyAmICgxIDw8IEk0MEVfUlhfREVTQ19TVEFUVVNfRU9GX1NISUZUKSkpKSB7CiAJCQlzdHJ1Y3QgaTQwZV9yeF9idWZmZXIgKm5leHRfYnVmZmVyOwogCiAJCQluZXh0X2J1ZmZlciA9ICZyeF9yaW5nLT5yeF9iaVtpXTsKLQotCQkJaWYgKHJpbmdfaXNfcHNfZW5hYmxlZChyeF9yaW5nKSkgewotCQkJCXJ4X2JpLT5za2IgPSBuZXh0X2J1ZmZlci0+c2tiOwotCQkJCXJ4X2JpLT5kbWEgPSBuZXh0X2J1ZmZlci0+ZG1hOwotCQkJCW5leHRfYnVmZmVyLT5za2IgPSBza2I7Ci0JCQkJbmV4dF9idWZmZXItPmRtYSA9IDA7Ci0JCQl9CisJCQluZXh0X2J1ZmZlci0+c2tiID0gc2tiOwogCQkJcnhfcmluZy0+cnhfc3RhdHMubm9uX2VvcF9kZXNjcysrOwotCQkJZ290byBuZXh0X2Rlc2M7CisJCQljb250aW51ZTsKIAkJfQogCiAJCS8qIEVSUl9NQVNLIHdpbGwgb25seSBoYXZlIHZhbGlkIGJpdHMgaWYgRU9QIHNldCAqLwpAQCAtMTAzMiw3ICsxMTMxLDEyOSBAQAogCQkJLyogVE9ETzogc2hvdWxkbid0IHdlIGluY3JlbWVudCBhIGNvdW50ZXIgaW5kaWNhdGluZyB0aGUKIAkJCSAqIGRyb3A/CiAJCQkgKi8KLQkJCWdvdG8gbmV4dF9kZXNjOworCQkJY29udGludWU7CisJCX0KKworCQlza2Jfc2V0X2hhc2goc2tiLCBpNDBlX3J4X2hhc2gocnhfcmluZywgcnhfZGVzYyksCisJCQkgICAgIGk0MGVfcHR5cGVfdG9faGFzaChyeF9wdHlwZSkpOworCQkvKiBwcm9iYWJseSBhIGxpdHRsZSBza2V3ZWQgZHVlIHRvIHJlbW92aW5nIENSQyAqLworCQl0b3RhbF9yeF9ieXRlcyArPSBza2ItPmxlbjsKKwkJdG90YWxfcnhfcGFja2V0cysrOworCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHJ4X3JpbmctPm5ldGRldik7CisKKwkJaTQwZV9yeF9jaGVja3N1bSh2c2ksIHNrYiwgcnhfc3RhdHVzLCByeF9lcnJvciwgcnhfcHR5cGUpOworCisJCXZsYW5fdGFnID0gcnhfc3RhdHVzICYgKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19MMlRBRzFQX1NISUZUKQorCQkJID8gbGUxNl90b19jcHUocnhfZGVzYy0+d2IucXdvcmQwLmxvX2R3b3JkLmwydGFnMSkKKwkJCSA6IDA7CisjaWZkZWYgSTQwRV9GQ09FCisJCWlmICghaTQwZV9mY29lX2hhbmRsZV9vZmZsb2FkKHJ4X3JpbmcsIHJ4X2Rlc2MsIHNrYikpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisJCXNrYl9tYXJrX25hcGlfaWQoc2tiLCAmcnhfcmluZy0+cV92ZWN0b3ItPm5hcGkpOworCQlpNDBlX3JlY2VpdmVfc2tiKHJ4X3JpbmcsIHNrYiwgdmxhbl90YWcpOworCisJCXJ4X3JpbmctPm5ldGRldi0+bGFzdF9yeCA9IGppZmZpZXM7CisJCXJ4X2Rlc2MtPndiLnF3b3JkMS5zdGF0dXNfZXJyb3JfbGVuID0gMDsKKworCX0gd2hpbGUgKGxpa2VseSh0b3RhbF9yeF9wYWNrZXRzIDwgYnVkZ2V0KSk7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZyeF9yaW5nLT5zeW5jcCk7CisJcnhfcmluZy0+c3RhdHMucGFja2V0cyArPSB0b3RhbF9yeF9wYWNrZXRzOworCXJ4X3JpbmctPnN0YXRzLmJ5dGVzICs9IHRvdGFsX3J4X2J5dGVzOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZyeF9yaW5nLT5zeW5jcCk7CisJcnhfcmluZy0+cV92ZWN0b3ItPnJ4LnRvdGFsX3BhY2tldHMgKz0gdG90YWxfcnhfcGFja2V0czsKKwlyeF9yaW5nLT5xX3ZlY3Rvci0+cngudG90YWxfYnl0ZXMgKz0gdG90YWxfcnhfYnl0ZXM7CisKKwlyZXR1cm4gdG90YWxfcnhfcGFja2V0czsKK30KKworLyoqCisgKiBpNDBlX2NsZWFuX3J4X2lycV8xYnVmIC0gUmVjbGFpbSByZXNvdXJjZXMgYWZ0ZXIgcmVjZWl2ZTsgc2luZ2xlIGJ1ZmZlcgorICogQHJ4X3Jpbmc6ICByeCByaW5nIHRvIGNsZWFuCisgKiBAYnVkZ2V0OiAgIGhvdyBtYW55IGNsZWFucyB3ZSdyZSBhbGxvd2VkCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgcGFja2V0cyBjbGVhbmVkCisgKiovCitzdGF0aWMgaW50IGk0MGVfY2xlYW5fcnhfaXJxXzFidWYoc3RydWN0IGk0MGVfcmluZyAqcnhfcmluZywgaW50IGJ1ZGdldCkKK3sKKwl1bnNpZ25lZCBpbnQgdG90YWxfcnhfYnl0ZXMgPSAwLCB0b3RhbF9yeF9wYWNrZXRzID0gMDsKKwl1MTYgY2xlYW5lZF9jb3VudCA9IEk0MEVfREVTQ19VTlVTRUQocnhfcmluZyk7CisJc3RydWN0IGk0MGVfdnNpICp2c2kgPSByeF9yaW5nLT52c2k7CisJdW5pb24gaTQwZV9yeF9kZXNjICpyeF9kZXNjOworCXUzMiByeF9lcnJvciwgcnhfc3RhdHVzOworCXUxNiByeF9wYWNrZXRfbGVuOworCXU4IHJ4X3B0eXBlOworCXU2NCBxd29yZDsKKwl1MTYgaTsKKworCWRvIHsKKwkJc3RydWN0IGk0MGVfcnhfYnVmZmVyICpyeF9iaTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJdTE2IHZsYW5fdGFnOworCQkvKiByZXR1cm4gc29tZSBidWZmZXJzIHRvIGhhcmR3YXJlLCBvbmUgYXQgYSB0aW1lIGlzIHRvbyBzbG93ICovCisJCWlmIChjbGVhbmVkX2NvdW50ID49IEk0MEVfUlhfQlVGRkVSX1dSSVRFKSB7CisJCQlpNDBldmZfYWxsb2NfcnhfYnVmZmVyc18xYnVmKHJ4X3JpbmcsIGNsZWFuZWRfY291bnQpOworCQkJY2xlYW5lZF9jb3VudCA9IDA7CisJCX0KKworCQlpID0gcnhfcmluZy0+bmV4dF90b19jbGVhbjsKKwkJcnhfZGVzYyA9IEk0MEVfUlhfREVTQyhyeF9yaW5nLCBpKTsKKwkJcXdvcmQgPSBsZTY0X3RvX2NwdShyeF9kZXNjLT53Yi5xd29yZDEuc3RhdHVzX2Vycm9yX2xlbik7CisJCXJ4X3N0YXR1cyA9IChxd29yZCAmIEk0MEVfUlhEX1FXMV9TVEFUVVNfTUFTSykgPj4KKwkJCUk0MEVfUlhEX1FXMV9TVEFUVVNfU0hJRlQ7CisKKwkJaWYgKCEocnhfc3RhdHVzICYgKDEgPDwgSTQwRV9SWF9ERVNDX1NUQVRVU19ERF9TSElGVCkpKQorCQkJYnJlYWs7CisKKwkJLyogVGhpcyBtZW1vcnkgYmFycmllciBpcyBuZWVkZWQgdG8ga2VlcCB1cyBmcm9tIHJlYWRpbmcKKwkJICogYW55IG90aGVyIGZpZWxkcyBvdXQgb2YgdGhlIHJ4X2Rlc2MgdW50aWwgd2Uga25vdyB0aGUKKwkJICogREQgYml0IGlzIHNldC4KKwkJICovCisJCWRtYV9ybWIoKTsKKworCQlyeF9iaSA9ICZyeF9yaW5nLT5yeF9iaVtpXTsKKwkJc2tiID0gcnhfYmktPnNrYjsKKwkJcHJlZmV0Y2goc2tiLT5kYXRhKTsKKworCQlyeF9wYWNrZXRfbGVuID0gKHF3b3JkICYgSTQwRV9SWERfUVcxX0xFTkdUSF9QQlVGX01BU0spID4+CisJCQkJSTQwRV9SWERfUVcxX0xFTkdUSF9QQlVGX1NISUZUOworCisJCXJ4X2Vycm9yID0gKHF3b3JkICYgSTQwRV9SWERfUVcxX0VSUk9SX01BU0spID4+CisJCQkgICBJNDBFX1JYRF9RVzFfRVJST1JfU0hJRlQ7CisJCXJ4X2Vycm9yICY9IH4oMSA8PCBJNDBFX1JYX0RFU0NfRVJST1JfSEJPX1NISUZUKTsKKworCQlyeF9wdHlwZSA9IChxd29yZCAmIEk0MEVfUlhEX1FXMV9QVFlQRV9NQVNLKSA+PgorCQkJICAgSTQwRV9SWERfUVcxX1BUWVBFX1NISUZUOworCQlyeF9iaS0+c2tiID0gTlVMTDsKKwkJY2xlYW5lZF9jb3VudCsrOworCisJCS8qIEdldCB0aGUgaGVhZGVyIGFuZCBwb3NzaWJseSB0aGUgd2hvbGUgcGFja2V0CisJCSAqIElmIHRoaXMgaXMgYW4gc2tiIGZyb20gcHJldmlvdXMgcmVjZWl2ZSBkbWEgd2lsbCBiZSAwCisJCSAqLworCQlza2JfcHV0KHNrYiwgcnhfcGFja2V0X2xlbik7CisJCWRtYV91bm1hcF9zaW5nbGUocnhfcmluZy0+ZGV2LCByeF9iaS0+ZG1hLCByeF9yaW5nLT5yeF9idWZfbGVuLAorCQkJCSBETUFfRlJPTV9ERVZJQ0UpOworCQlyeF9iaS0+ZG1hID0gMDsKKworCQlJNDBFX1JYX0lOQ1JFTUVOVChyeF9yaW5nLCBpKTsKKworCQlpZiAodW5saWtlbHkoCisJCSAgICAhKHJ4X3N0YXR1cyAmICgxIDw8IEk0MEVfUlhfREVTQ19TVEFUVVNfRU9GX1NISUZUKSkpKSB7CisJCQlyeF9yaW5nLT5yeF9zdGF0cy5ub25fZW9wX2Rlc2NzKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEVSUl9NQVNLIHdpbGwgb25seSBoYXZlIHZhbGlkIGJpdHMgaWYgRU9QIHNldCAqLworCQlpZiAodW5saWtlbHkocnhfZXJyb3IgJiAoMSA8PCBJNDBFX1JYX0RFU0NfRVJST1JfUlhFX1NISUZUKSkpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQkvKiBUT0RPOiBzaG91bGRuJ3Qgd2UgaW5jcmVtZW50IGEgY291bnRlciBpbmRpY2F0aW5nIHRoZQorCQkJICogZHJvcD8KKwkJCSAqLworCQkJY29udGludWU7CiAJCX0KIAogCQlza2Jfc2V0X2hhc2goc2tiLCBpNDBlX3J4X2hhc2gocnhfcmluZywgcnhfZGVzYyksCkBAIC0xMDUxLDI3ICsxMjcyLDkgQEAKIAkJaTQwZV9yZWNlaXZlX3NrYihyeF9yaW5nLCBza2IsIHZsYW5fdGFnKTsKIAogCQlyeF9yaW5nLT5uZXRkZXYtPmxhc3RfcnggPSBqaWZmaWVzOwotCQlidWRnZXQtLTsKLW5leHRfZGVzYzoKIAkJcnhfZGVzYy0+d2IucXdvcmQxLnN0YXR1c19lcnJvcl9sZW4gPSAwOwotCQlpZiAoIWJ1ZGdldCkKLQkJCWJyZWFrOworCX0gd2hpbGUgKGxpa2VseSh0b3RhbF9yeF9wYWNrZXRzIDwgYnVkZ2V0KSk7CiAKLQkJY2xlYW5lZF9jb3VudCsrOwotCQkvKiByZXR1cm4gc29tZSBidWZmZXJzIHRvIGhhcmR3YXJlLCBvbmUgYXQgYSB0aW1lIGlzIHRvbyBzbG93ICovCi0JCWlmIChjbGVhbmVkX2NvdW50ID49IEk0MEVfUlhfQlVGRkVSX1dSSVRFKSB7Ci0JCQlpNDBldmZfYWxsb2NfcnhfYnVmZmVycyhyeF9yaW5nLCBjbGVhbmVkX2NvdW50KTsKLQkJCWNsZWFuZWRfY291bnQgPSAwOwotCQl9Ci0KLQkJLyogdXNlIHByZWZldGNoZWQgdmFsdWVzICovCi0JCXJ4X2Rlc2MgPSBuZXh0X3J4ZDsKLQkJcXdvcmQgPSBsZTY0X3RvX2NwdShyeF9kZXNjLT53Yi5xd29yZDEuc3RhdHVzX2Vycm9yX2xlbik7Ci0JCXJ4X3N0YXR1cyA9IChxd29yZCAmIEk0MEVfUlhEX1FXMV9TVEFUVVNfTUFTSykgPj4KLQkJCSAgICBJNDBFX1JYRF9RVzFfU1RBVFVTX1NISUZUOwotCX0KLQotCXJ4X3JpbmctPm5leHRfdG9fY2xlYW4gPSBpOwogCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJ4X3JpbmctPnN5bmNwKTsKIAlyeF9yaW5nLT5zdGF0cy5wYWNrZXRzICs9IHRvdGFsX3J4X3BhY2tldHM7CiAJcnhfcmluZy0+c3RhdHMuYnl0ZXMgKz0gdG90YWxfcnhfYnl0ZXM7CkBAIC0xMDc5LDEwICsxMjgyLDcgQEAKIAlyeF9yaW5nLT5xX3ZlY3Rvci0+cngudG90YWxfcGFja2V0cyArPSB0b3RhbF9yeF9wYWNrZXRzOwogCXJ4X3JpbmctPnFfdmVjdG9yLT5yeC50b3RhbF9ieXRlcyArPSB0b3RhbF9yeF9ieXRlczsKIAotCWlmIChjbGVhbmVkX2NvdW50KQotCQlpNDBldmZfYWxsb2NfcnhfYnVmZmVycyhyeF9yaW5nLCBjbGVhbmVkX2NvdW50KTsKLQotCXJldHVybiBidWRnZXQgPiAwOworCXJldHVybiB0b3RhbF9yeF9wYWNrZXRzOwogfQogCiAvKioKQEAgLTExMDMsNiArMTMwMyw3IEBACiAJYm9vbCBjbGVhbl9jb21wbGV0ZSA9IHRydWU7CiAJYm9vbCBhcm1fd2IgPSBmYWxzZTsKIAlpbnQgYnVkZ2V0X3Blcl9yaW5nOworCWludCBjbGVhbmVkOwogCiAJaWYgKHRlc3RfYml0KF9fSTQwRV9ET1dOLCAmdnNpLT5zdGF0ZSkpIHsKIAkJbmFwaV9jb21wbGV0ZShuYXBpKTsKQEAgLTExMjIsOCArMTMyMywxNCBAQAogCSAqLwogCWJ1ZGdldF9wZXJfcmluZyA9IG1heChidWRnZXQvcV92ZWN0b3ItPm51bV9yaW5ncGFpcnMsIDEpOwogCi0JaTQwZV9mb3JfZWFjaF9yaW5nKHJpbmcsIHFfdmVjdG9yLT5yeCkKLQkJY2xlYW5fY29tcGxldGUgJj0gaTQwZV9jbGVhbl9yeF9pcnEocmluZywgYnVkZ2V0X3Blcl9yaW5nKTsKKwlpNDBlX2Zvcl9lYWNoX3JpbmcocmluZywgcV92ZWN0b3ItPnJ4KSB7CisJCWlmIChyaW5nX2lzX3BzX2VuYWJsZWQocmluZykpCisJCQljbGVhbmVkID0gaTQwZV9jbGVhbl9yeF9pcnFfcHMocmluZywgYnVkZ2V0X3Blcl9yaW5nKTsKKwkJZWxzZQorCQkJY2xlYW5lZCA9IGk0MGVfY2xlYW5fcnhfaXJxXzFidWYocmluZywgYnVkZ2V0X3Blcl9yaW5nKTsKKwkJLyogaWYgd2UgZGlkbid0IGNsZWFuIGFzIG1hbnkgYXMgYnVkZ2V0ZWQsIHdlIG11c3QgYmUgZG9uZSAqLworCQljbGVhbl9jb21wbGV0ZSAmPSAoYnVkZ2V0X3Blcl9yaW5nICE9IGNsZWFuZWQpOworCX0KIAogCS8qIElmIHdvcmsgbm90IGNvbXBsZXRlZCwgcmV0dXJuIGJ1ZGdldCBhbmQgcG9sbGluZyB3aWxsIHJldHVybiAqLwogCWlmICghY2xlYW5fY29tcGxldGUpIHsKQEAgLTExNjMsNiArMTM3MCwxOSBAQAogCV9fYmUxNiBwcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7CiAJdTMyICB0eF9mbGFncyA9IDA7CiAKKwlpZiAocHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpICYmCisJICAgICEodHhfcmluZy0+bmV0ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYKSkgeworCQkvKiBXaGVuIEhXIFZMQU4gYWNjZWxlcmF0aW9uIGlzIHR1cm5lZCBvZmYgYnkgdGhlIHVzZXIgdGhlCisJCSAqIHN0YWNrIHNldHMgdGhlIHByb3RvY29sIHRvIDgwMjFxIHNvIHRoYXQgdGhlIGRyaXZlcgorCQkgKiBjYW4gdGFrZSBhbnkgc3RlcHMgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGUgU1cgb25seQorCQkgKiBWTEFOIGhhbmRsaW5nLiAgSW4gb3VyIGNhc2UgdGhlIGRyaXZlciBkb2Vzbid0IG5lZWQKKwkJICogdG8gdGFrZSBhbnkgZnVydGhlciBzdGVwcyBzbyBqdXN0IHNldCB0aGUgcHJvdG9jb2wKKwkJICogdG8gdGhlIGVuY2Fwc3VsYXRlZCBldGhlcnR5cGUuCisJCSAqLworCQlza2ItPnByb3RvY29sID0gdmxhbl9nZXRfcHJvdG9jb2woc2tiKTsKKwkJZ290byBvdXQ7CisJfQorCiAJLyogaWYgd2UgaGF2ZSBhIEhXIFZMQU4gdGFnIGJlaW5nIGFkZGVkLCBkZWZhdWx0IHRvIHRoZSBIVyBvbmUgKi8KIAlpZiAoc2tiX3ZsYW5fdGFnX3ByZXNlbnQoc2tiKSkgewogCQl0eF9mbGFncyB8PSBza2Jfdmxhbl90YWdfZ2V0KHNrYikgPDwgSTQwRV9UWF9GTEFHU19WTEFOX1NISUZUOwpAQCAtMTE3OSw2ICsxMzk5LDcgQEAKIAkJdHhfZmxhZ3MgfD0gSTQwRV9UWF9GTEFHU19TV19WTEFOOwogCX0KIAorb3V0OgogCSpmbGFncyA9IHR4X2ZsYWdzOwogCXJldHVybiAwOwogfQpAQCAtMTI2Miw4ICsxNDgzLDE2IEBACiAJc3RydWN0IGlwaGRyICp0aGlzX2lwX2hkcjsKIAl1MzIgbmV0d29ya19oZHJfbGVuOwogCXU4IGw0X2hkciA9IDA7CisJdTMyIGw0X3R1bm5lbCA9IDA7CiAKIAlpZiAoc2tiLT5lbmNhcHN1bGF0aW9uKSB7CisJCXN3aXRjaCAoaXBfaGRyKHNrYiktPnByb3RvY29sKSB7CisJCWNhc2UgSVBQUk9UT19VRFA6CisJCQlsNF90dW5uZWwgPSBJNDBFX1RYRF9DVFhfVURQX1RVTk5FTElORzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuOworCQl9CiAJCW5ldHdvcmtfaGRyX2xlbiA9IHNrYl9pbm5lcl9uZXR3b3JrX2hlYWRlcl9sZW4oc2tiKTsKIAkJdGhpc19pcF9oZHIgPSBpbm5lcl9pcF9oZHIoc2tiKTsKIAkJdGhpc19pcHY2X2hkciA9IGlubmVyX2lwdjZfaGRyKHNrYik7CkBAIC0xMjg2LDggKzE1MTUsOCBAQAogCiAJCS8qIE5vdyBzZXQgdGhlIGN0eCBkZXNjcmlwdG9yIGZpZWxkcyAqLwogCQkqY2RfdHVubmVsaW5nIHw9IChza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYikgPj4gMikgPDwKLQkJCQkJSTQwRV9UWERfQ1RYX1FXMF9FWFRfSVBMRU5fU0hJRlQgfAotCQkJCSAgIEk0MEVfVFhEX0NUWF9VRFBfVFVOTkVMSU5HICAgICAgICAgICAgfAorCQkJCSAgIEk0MEVfVFhEX0NUWF9RVzBfRVhUX0lQTEVOX1NISUZUICAgICAgfAorCQkJCSAgIGw0X3R1bm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogCQkJCSAgICgoc2tiX2lubmVyX25ldHdvcmtfb2Zmc2V0KHNrYikgLQogCQkJCQlza2JfdHJhbnNwb3J0X29mZnNldChza2IpKSA+PiAxKSA8PAogCQkJCSAgIEk0MEVfVFhEX0NUWF9RVzBfTkFUTEVOX1NISUZUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHhyeC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHhyeC5oCmluZGV4IGM5NTBhMDMuLjFlNDliYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R4cnguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eHJ4LmgKQEAgLTk2LDYgKzk2LDE0IEBACiAKIC8qIEhvdyBtYW55IFJ4IEJ1ZmZlcnMgZG8gd2UgYnVuZGxlIGludG8gb25lIHdyaXRlIHRvIHRoZSBoYXJkd2FyZSA/ICovCiAjZGVmaW5lIEk0MEVfUlhfQlVGRkVSX1dSSVRFCTE2CS8qIE11c3QgYmUgcG93ZXIgb2YgMiAqLworI2RlZmluZSBJNDBFX1JYX0lOQ1JFTUVOVChyLCBpKSBcCisJZG8gewkJCQkJXAorCQkoaSkrKzsJCQkJXAorCQlpZiAoKGkpID09IChyKS0+Y291bnQpCQlcCisJCQlpID0gMDsJCQlcCisJCXItPm5leHRfdG9fY2xlYW4gPSBpOwkJXAorCX0gd2hpbGUgKDApCisKICNkZWZpbmUgSTQwRV9SWF9ORVhUX0RFU0MociwgaSwgbikJCVwKIAlkbyB7CQkJCQlcCiAJCShpKSsrOwkJCQlcCkBAIC0xNTEsNiArMTU5LDcgQEAKIAogc3RydWN0IGk0MGVfcnhfYnVmZmVyIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXZvaWQgKmhkcl9idWY7CiAJZG1hX2FkZHJfdCBkbWE7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJZG1hX2FkZHJfdCBwYWdlX2RtYTsKQEAgLTIyMyw4ICsyMzIsOCBAQAogCXUxNiByeF9idWZfbGVuOwogCXU4ICBkdHlwZTsKICNkZWZpbmUgSTQwRV9SWF9EVFlQRV9OT19TUExJVCAgICAgIDAKLSNkZWZpbmUgSTQwRV9SWF9EVFlQRV9TUExJVF9BTFdBWVMgIDEKLSNkZWZpbmUgSTQwRV9SWF9EVFlQRV9IRUFERVJfU1BMSVQgIDIKKyNkZWZpbmUgSTQwRV9SWF9EVFlQRV9IRUFERVJfU1BMSVQgIDEKKyNkZWZpbmUgSTQwRV9SWF9EVFlQRV9TUExJVF9BTFdBWVMgIDIKIAl1OCAgaHNwbGl0OwogI2RlZmluZSBJNDBFX1JYX1NQTElUX0wyICAgICAgMHgxCiAjZGVmaW5lIEk0MEVfUlhfU1BMSVRfSVAgICAgICAweDIKQEAgLTI3OCw3ICsyODcsOSBAQAogI2RlZmluZSBpNDBlX2Zvcl9lYWNoX3JpbmcocG9zLCBoZWFkKSBcCiAJZm9yIChwb3MgPSAoaGVhZCkucmluZzsgcG9zICE9IE5VTEw7IHBvcyA9IHBvcy0+bmV4dCkKIAotdm9pZCBpNDBldmZfYWxsb2NfcnhfYnVmZmVycyhzdHJ1Y3QgaTQwZV9yaW5nICpyeHIsIHUxNiBjbGVhbmVkX2NvdW50KTsKK3ZvaWQgaTQwZXZmX2FsbG9jX3J4X2J1ZmZlcnNfcHMoc3RydWN0IGk0MGVfcmluZyAqcnhyLCB1MTYgY2xlYW5lZF9jb3VudCk7Cit2b2lkIGk0MGV2Zl9hbGxvY19yeF9idWZmZXJzXzFidWYoc3RydWN0IGk0MGVfcmluZyAqcnhyLCB1MTYgY2xlYW5lZF9jb3VudCk7Cit2b2lkIGk0MGV2Zl9hbGxvY19yeF9oZWFkZXJzKHN0cnVjdCBpNDBlX3JpbmcgKnJ4cik7CiBuZXRkZXZfdHhfdCBpNDBldmZfeG1pdF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIHZvaWQgaTQwZXZmX2NsZWFuX3R4X3Jpbmcoc3RydWN0IGk0MGVfcmluZyAqdHhfcmluZyk7CiB2b2lkIGk0MGV2Zl9jbGVhbl9yeF9yaW5nKHN0cnVjdCBpNDBlX3JpbmcgKnJ4X3JpbmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHlwZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdHlwZS5oCmluZGV4IDNkMGZkYWEuLjljNzljYjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3R5cGUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV90eXBlLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVsIEV0aGVybmV0IENvbnRyb2xsZXIgWEw3MTAgRmFtaWx5IExpbnV4IFZpcnR1YWwgRnVuY3Rpb24gRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC00NCw3ICs0NCw4IEBACiAjZGVmaW5lIEk0MEVfREVWX0lEX1FTRlBfQgkJMHgxNTg0CiAjZGVmaW5lIEk0MEVfREVWX0lEX1FTRlBfQwkJMHgxNTg1CiAjZGVmaW5lIEk0MEVfREVWX0lEXzEwR19CQVNFX1QJCTB4MTU4NgotI2RlZmluZSBJNDBFX0RFVl9JRF9WRgkJMHgxNTRDCisjZGVmaW5lIEk0MEVfREVWX0lEXzIwR19LUjIJCTB4MTU4NworI2RlZmluZSBJNDBFX0RFVl9JRF9WRgkJCTB4MTU0QwogI2RlZmluZSBJNDBFX0RFVl9JRF9WRl9IVgkJMHgxNTcxCiAKICNkZWZpbmUgaTQwZV9pc180MEdfZGV2aWNlKGQpCQkoKGQpID09IEk0MEVfREVWX0lEX1FTRlBfQSAgfHwgXApAQCAtMTc1LDEyICsxNzYsMTIgQEAKIAl1OCBhbl9pbmZvOwogCXU4IGV4dF9pbmZvOwogCXU4IGxvb3BiYWNrOwotCWJvb2wgYW5fZW5hYmxlZDsKIAkvKiBpcyBMaW5rIFN0YXR1cyBFdmVudCBub3RpZmljYXRpb24gdG8gU1cgZW5hYmxlZCAqLwogCWJvb2wgbHNlX2VuYWJsZTsKIAl1MTYgbWF4X2ZyYW1lX3NpemU7CiAJYm9vbCBjcmNfZW5hYmxlOwogCXU4IHBhY2luZzsKKwl1OCByZXF1ZXN0ZWRfc3BlZWRzOwogfTsKIAogc3RydWN0IGk0MGVfcGh5X2luZm8gewpAQCAtMTExNiw3ICsxMTE3LDcgQEAKIC8qIENoZWNrc3VtIGFuZCBTaGFkb3cgUkFNIHBvaW50ZXJzICovCiAjZGVmaW5lIEk0MEVfU1JfTlZNX0NPTlRST0xfV09SRAkJMHgwMAogI2RlZmluZSBJNDBFX1NSX0VNUF9NT0RVTEVfUFRSCQkJMHgwRgotI2RlZmluZSBJNDBFX1NSX05WTV9JTUFHRV9WRVJTSU9OCQkweDE4CisjZGVmaW5lIEk0MEVfU1JfTlZNX0RFVl9TVEFSVEVSX1ZFUlNJT04JCTB4MTgKICNkZWZpbmUgSTQwRV9TUl9OVk1fV0FLRV9PTl9MQU4JCQkweDE5CiAjZGVmaW5lIEk0MEVfU1JfQUxURVJOQVRFX1NBTl9NQUNfQUREUkVTU19QVFIJMHgyNwogI2RlZmluZSBJNDBFX1NSX05WTV9FRVRSQUNLX0xPCQkJMHgyRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdmlydGNobmwuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBlX3ZpcnRjaG5sLmgKaW5kZXggZTBjODIwOC4uNTlmNjJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGVfdmlydGNobmwuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZV92aXJ0Y2hubC5oCkBAIC01OSwzMSArNTksMjkgQEAKICAqIG9mIHRoZSB2aXJ0Y2hubF9tc2cgc3RydWN0dXJlLgogICovCiBlbnVtIGk0MGVfdmlydGNobmxfb3BzIHsKLS8qIFZGIHNlbmRzIHJlcS4gdG8gcGYgZm9yIHRoZSBmb2xsb3dpbmcKLSAqIG9wcy4KKy8qIFRoZSBQRiBzZW5kcyBzdGF0dXMgY2hhbmdlIGV2ZW50cyB0byBWRnMgdXNpbmcKKyAqIHRoZSBJNDBFX1ZJUlRDSE5MX09QX0VWRU5UIG9wY29kZS4KKyAqIFZGcyBzZW5kIHJlcXVlc3RzIHRvIHRoZSBQRiB1c2luZyB0aGUgb3RoZXIgb3BzLgogICovCiAJSTQwRV9WSVJUQ0hOTF9PUF9VTktOT1dOID0gMCwKIAlJNDBFX1ZJUlRDSE5MX09QX1ZFUlNJT04gPSAxLCAvKiBtdXN0IEFMV0FZUyBiZSAxICovCi0JSTQwRV9WSVJUQ0hOTF9PUF9SRVNFVF9WRiwKLQlJNDBFX1ZJUlRDSE5MX09QX0dFVF9WRl9SRVNPVVJDRVMsCi0JSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfVFhfUVVFVUUsCi0JSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfUlhfUVVFVUUsCi0JSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfVlNJX1FVRVVFUywKLQlJNDBFX1ZJUlRDSE5MX09QX0NPTkZJR19JUlFfTUFQLAotCUk0MEVfVklSVENITkxfT1BfRU5BQkxFX1FVRVVFUywKLQlJNDBFX1ZJUlRDSE5MX09QX0RJU0FCTEVfUVVFVUVTLAotCUk0MEVfVklSVENITkxfT1BfQUREX0VUSEVSX0FERFJFU1MsCi0JSTQwRV9WSVJUQ0hOTF9PUF9ERUxfRVRIRVJfQUREUkVTUywKLQlJNDBFX1ZJUlRDSE5MX09QX0FERF9WTEFOLAotCUk0MEVfVklSVENITkxfT1BfREVMX1ZMQU4sCi0JSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfUFJPTUlTQ1VPVVNfTU9ERSwKLQlJNDBFX1ZJUlRDSE5MX09QX0dFVF9TVEFUUywKLQlJNDBFX1ZJUlRDSE5MX09QX0ZDT0UsCi0JSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfUlNTLAotLyogUEYgc2VuZHMgc3RhdHVzIGNoYW5nZSBldmVudHMgdG8gdmZzIHVzaW5nCi0gKiB0aGUgZm9sbG93aW5nIG9wLgotICovCi0JSTQwRV9WSVJUQ0hOTF9PUF9FVkVOVCwKKwlJNDBFX1ZJUlRDSE5MX09QX1JFU0VUX1ZGID0gMiwKKwlJNDBFX1ZJUlRDSE5MX09QX0dFVF9WRl9SRVNPVVJDRVMgPSAzLAorCUk0MEVfVklSVENITkxfT1BfQ09ORklHX1RYX1FVRVVFID0gNCwKKwlJNDBFX1ZJUlRDSE5MX09QX0NPTkZJR19SWF9RVUVVRSA9IDUsCisJSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfVlNJX1FVRVVFUyA9IDYsCisJSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfSVJRX01BUCA9IDcsCisJSTQwRV9WSVJUQ0hOTF9PUF9FTkFCTEVfUVVFVUVTID0gOCwKKwlJNDBFX1ZJUlRDSE5MX09QX0RJU0FCTEVfUVVFVUVTID0gOSwKKwlJNDBFX1ZJUlRDSE5MX09QX0FERF9FVEhFUl9BRERSRVNTID0gMTAsCisJSTQwRV9WSVJUQ0hOTF9PUF9ERUxfRVRIRVJfQUREUkVTUyA9IDExLAorCUk0MEVfVklSVENITkxfT1BfQUREX1ZMQU4gPSAxMiwKKwlJNDBFX1ZJUlRDSE5MX09QX0RFTF9WTEFOID0gMTMsCisJSTQwRV9WSVJUQ0hOTF9PUF9DT05GSUdfUFJPTUlTQ1VPVVNfTU9ERSA9IDE0LAorCUk0MEVfVklSVENITkxfT1BfR0VUX1NUQVRTID0gMTUsCisJSTQwRV9WSVJUQ0hOTF9PUF9GQ09FID0gMTYsCisJSTQwRV9WSVJUQ0hOTF9PUF9FVkVOVCA9IDE3LAorCUk0MEVfVklSVENITkxfT1BfQ09ORklHX1JTUyA9IDE4LAogfTsKIAogLyogVmlydHVhbCBjaGFubmVsIG1lc3NhZ2UgZGVzY3JpcHRvci4gVGhpcyBvdmVybGF5cyB0aGUgYWRtaW4gcXVldWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmYuaAppbmRleCA5ODEyMjQ3Li4zNGM4NTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zi5oCkBAIC0yNzIsNiArMjcyLDggQEAKIHZvaWQgaTQwZXZmX3Jlc2V0X2ludGVycnVwdF9jYXBhYmlsaXR5KHN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgaTQwZXZmX2luaXRfaW50ZXJydXB0X3NjaGVtZShzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOwogdm9pZCBpNDBldmZfaXJxX2VuYWJsZV9xdWV1ZXMoc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyLCB1MzIgbWFzayk7Cit2b2lkIGk0MGV2Zl9mcmVlX2FsbF90eF9yZXNvdXJjZXMoc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyKTsKK3ZvaWQgaTQwZXZmX2ZyZWVfYWxsX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCiB2b2lkIGk0MGVfbmFwaV9hZGRfYWxsKHN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlcik7CiB2b2lkIGk0MGVfbmFwaV9kZWxfYWxsKHN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfZXRodG9vbC5jCmluZGV4IDY5Yjk3YmEuLmY0ZTc3NjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfZXRodG9vbC5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBJbnRlbCBFdGhlcm5ldCBDb250cm9sbGVyIFhMNzEwIEZhbWlseSBMaW51eCBWaXJ0dWFsIEZ1bmN0aW9uIERyaXZlcgotICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLgorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE1IEludGVsIENvcnBvcmF0aW9uLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMjksNyArMjksNiBAQAogCiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCi0KIHN0cnVjdCBpNDBldmZfc3RhdHMgewogCWNoYXIgc3RhdF9zdHJpbmdbRVRIX0dTVFJJTkdfTEVOXTsKIAlpbnQgc3RhdF9vZmZzZXQ7CkBAIC0xODAsNyArMTc5LDcgQEAKIH0KIAogLyoqCi0gKiBpNDBldmZfZ2V0X21zZ2xldmVsIC0gU2V0IGRlYnVnIG1lc3NhZ2UgbGV2ZWwKKyAqIGk0MGV2Zl9zZXRfbXNnbGV2ZWwgLSBTZXQgZGVidWcgbWVzc2FnZSBsZXZlbAogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQogICogQGRhdGE6IG1lc3NhZ2UgbGV2ZWwKICAqCkBAIC0xOTEsNiArMTkwLDggQEAKIHsKIAlzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCisJaWYgKEk0MEVfREVCVUdfVVNFUiAmIGRhdGEpCisJCWFkYXB0ZXItPmh3LmRlYnVnX21hc2sgPSBkYXRhOwogCWFkYXB0ZXItPm1zZ19lbmFibGUgPSBkYXRhOwogfQogCkBAIC0yMDgsNyArMjA5LDcgQEAKIAogCXN0cmxjcHkoZHJ2aW5mby0+ZHJpdmVyLCBpNDBldmZfZHJpdmVyX25hbWUsIDMyKTsKIAlzdHJsY3B5KGRydmluZm8tPnZlcnNpb24sIGk0MGV2Zl9kcml2ZXJfdmVyc2lvbiwgMzIpOwotCisJc3RybGNweShkcnZpbmZvLT5md192ZXJzaW9uLCAiTi9BIiwgNCk7CiAJc3RybGNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksIDMyKTsKIH0KIApAQCAtNjQwLDEyICs2NDEsMTQgQEAKIAlpZiAoIWluZGlyKQogCQlyZXR1cm4gMDsKIAotCWZvciAoaSA9IDAsIGogPSAwOyBpIDw9IEk0MEVfVkZRRl9ITFVUX01BWF9JTkRFWDsgaSsrKSB7Ci0JCWhsdXRfdmFsID0gcmQzMihodywgSTQwRV9WRlFGX0hMVVQoaSkpOwotCQlpbmRpcltqKytdID0gaGx1dF92YWwgJiAweGZmOwotCQlpbmRpcltqKytdID0gKGhsdXRfdmFsID4+IDgpICYgMHhmZjsKLQkJaW5kaXJbaisrXSA9IChobHV0X3ZhbCA+PiAxNikgJiAweGZmOwotCQlpbmRpcltqKytdID0gKGhsdXRfdmFsID4+IDI0KSAmIDB4ZmY7CisJaWYgKGluZGlyKSB7CisJCWZvciAoaSA9IDAsIGogPSAwOyBpIDw9IEk0MEVfVkZRRl9ITFVUX01BWF9JTkRFWDsgaSsrKSB7CisJCQlobHV0X3ZhbCA9IHJkMzIoaHcsIEk0MEVfVkZRRl9ITFVUKGkpKTsKKwkJCWluZGlyW2orK10gPSBobHV0X3ZhbCAmIDB4ZmY7CisJCQlpbmRpcltqKytdID0gKGhsdXRfdmFsID4+IDgpICYgMHhmZjsKKwkJCWluZGlyW2orK10gPSAoaGx1dF92YWwgPj4gMTYpICYgMHhmZjsKKwkJCWluZGlyW2orK10gPSAoaGx1dF92YWwgPj4gMjQpICYgMHhmZjsKKwkJfQogCX0KIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl9tYWluLmMKaW5kZXggOGQ4YzIwMS4uNmQ1ZjNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl9tYWluLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIEludGVsIEV0aGVybmV0IENvbnRyb2xsZXIgWEw3MTAgRmFtaWx5IExpbnV4IFZpcnR1YWwgRnVuY3Rpb24gRHJpdmVyCi0gKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgKiBDb3B5cmlnaHQoYykgMjAxMyAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0yOCwxNSArMjgsMTMgQEAKICNpbmNsdWRlICJpNDBlX3Byb3RvdHlwZS5oIgogc3RhdGljIGludCBpNDBldmZfc2V0dXBfYWxsX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIGludCBpNDBldmZfc2V0dXBfYWxsX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIHZvaWQgaTQwZXZmX2ZyZWVfYWxsX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIHZvaWQgaTQwZXZmX2ZyZWVfYWxsX3J4X3Jlc291cmNlcyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIGludCBpNDBldmZfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiAKIGNoYXIgaTQwZXZmX2RyaXZlcl9uYW1lW10gPSAiaTQwZXZmIjsKIHN0YXRpYyBjb25zdCBjaGFyIGk0MGV2Zl9kcml2ZXJfc3RyaW5nW10gPQogCSJJbnRlbChSKSBYTDcxMC9YNzEwIFZpcnR1YWwgRnVuY3Rpb24gTmV0d29yayBEcml2ZXIiOwogCi0jZGVmaW5lIERSVl9WRVJTSU9OICIxLjIuMCIKKyNkZWZpbmUgRFJWX1ZFUlNJT04gIjEuMi4yNSIKIGNvbnN0IGNoYXIgaTQwZXZmX2RyaXZlcl92ZXJzaW9uW10gPSBEUlZfVkVSU0lPTjsKIHN0YXRpYyBjb25zdCBjaGFyIGk0MGV2Zl9jb3B5cmlnaHRbXSA9CiAJIkNvcHlyaWdodCAoYykgMjAxMyAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uIjsKQEAgLTI0NCw2ICsyNDIsNyBAQAogCQlpZiAobWFzayAmICgxIDw8IChpIC0gMSkpKSB7CiAJCQl3cjMyKGh3LCBJNDBFX1ZGSU5UX0RZTl9DVExOMShpIC0gMSksCiAJCQkgICAgIEk0MEVfVkZJTlRfRFlOX0NUTE4xX0lOVEVOQV9NQVNLIHwKKwkJCSAgICAgSTQwRV9WRklOVF9EWU5fQ1RMTjFfSVRSX0lORFhfTUFTSyB8CiAJCQkgICAgIEk0MEVfVkZJTlRfRFlOX0NUTE5fQ0xFQVJQQkFfTUFTSyk7CiAJCX0KIAl9CkBAIC0yNjMsNiArMjYyLDcgQEAKIAlpZiAobWFzayAmIDEpIHsKIAkJZHluX2N0bCA9IHJkMzIoaHcsIEk0MEVfVkZJTlRfRFlOX0NUTDAxKTsKIAkJZHluX2N0bCB8PSBJNDBFX1ZGSU5UX0RZTl9DVExOX1NXSU5UX1RSSUdfTUFTSyB8CisJCQkgICBJNDBFX1ZGSU5UX0RZTl9DVExOMV9JVFJfSU5EWF9NQVNLIHwKIAkJCSAgIEk0MEVfVkZJTlRfRFlOX0NUTE5fQ0xFQVJQQkFfTUFTSzsKIAkJd3IzMihodywgSTQwRV9WRklOVF9EWU5fQ1RMMDEsIGR5bl9jdGwpOwogCX0KQEAgLTI3MCw2ICsyNzAsNyBAQAogCQlpZiAobWFzayAmICgxIDw8IGkpKSB7CiAJCQlkeW5fY3RsID0gcmQzMihodywgSTQwRV9WRklOVF9EWU5fQ1RMTjEoaSAtIDEpKTsKIAkJCWR5bl9jdGwgfD0gSTQwRV9WRklOVF9EWU5fQ1RMTl9TV0lOVF9UUklHX01BU0sgfAorCQkJCSAgIEk0MEVfVkZJTlRfRFlOX0NUTE4xX0lUUl9JTkRYX01BU0sgfAogCQkJCSAgIEk0MEVfVkZJTlRfRFlOX0NUTE5fQ0xFQVJQQkFfTUFTSzsKIAkJCXdyMzIoaHcsIEk0MEVfVkZJTlRfRFlOX0NUTE4xKGkgLSAxKSwgZHluX2N0bCk7CiAJCX0KQEAgLTUyNCw3ICs1MjUsOCBAQAogCWludCBlcnI7CiAKIAlzbnByaW50ZihhZGFwdGVyLT5taXNjX3ZlY3Rvcl9uYW1lLAotCQkgc2l6ZW9mKGFkYXB0ZXItPm1pc2NfdmVjdG9yX25hbWUpIC0gMSwgImk0MGV2ZjptYngiKTsKKwkJIHNpemVvZihhZGFwdGVyLT5taXNjX3ZlY3Rvcl9uYW1lKSAtIDEsICJpNDBldmYtJXM6bWJ4IiwKKwkJIGRldl9uYW1lKCZhZGFwdGVyLT5wZGV2LT5kZXYpKTsKIAllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5tc2l4X2VudHJpZXNbMF0udmVjdG9yLAogCQkJICAmaTQwZXZmX21zaXhfYXEsIDAsCiAJCQkgIGFkYXB0ZXItPm1pc2NfdmVjdG9yX25hbWUsIG5ldGRldik7CkBAIC02NjIsMTMgKzY2NCwyMSBAQAogc3RhdGljIHN0cnVjdAogaTQwZXZmX3ZsYW5fZmlsdGVyICppNDBldmZfYWRkX3ZsYW4oc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyLCB1MTYgdmxhbikKIHsKLQlzdHJ1Y3QgaTQwZXZmX3ZsYW5fZmlsdGVyICpmOworCXN0cnVjdCBpNDBldmZfdmxhbl9maWx0ZXIgKmYgPSBOVUxMOworCWludCBjb3VudCA9IDUwOworCisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoX19JNDBFVkZfSU5fQ1JJVElDQUxfVEFTSywKKwkJCQkmYWRhcHRlci0+Y3JpdF9zZWN0aW9uKSkgeworCQl1ZGVsYXkoMSk7CisJCWlmICgtLWNvdW50ID09IDApCisJCQlnb3RvIG91dDsKKwl9CiAKIAlmID0gaTQwZXZmX2ZpbmRfdmxhbihhZGFwdGVyLCB2bGFuKTsKIAlpZiAoIWYpIHsKIAkJZiA9IGt6YWxsb2Moc2l6ZW9mKCpmKSwgR0ZQX0FUT01JQyk7CiAJCWlmICghZikKLQkJCXJldHVybiBOVUxMOworCQkJZ290byBjbGVhcm91dDsKIAogCQlmLT52bGFuID0gdmxhbjsKIApAQCAtNjc4LDYgKzY4OCw5IEBACiAJCWFkYXB0ZXItPmFxX3JlcXVpcmVkIHw9IEk0MEVWRl9GTEFHX0FRX0FERF9WTEFOX0ZJTFRFUjsKIAl9CiAKK2NsZWFyb3V0OgorCWNsZWFyX2JpdChfX0k0MEVWRl9JTl9DUklUSUNBTF9UQVNLLCAmYWRhcHRlci0+Y3JpdF9zZWN0aW9uKTsKK291dDoKIAlyZXR1cm4gZjsKIH0KIApAQCAtNjg5LDEyICs3MDIsMjEgQEAKIHN0YXRpYyB2b2lkIGk0MGV2Zl9kZWxfdmxhbihzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiB2bGFuKQogewogCXN0cnVjdCBpNDBldmZfdmxhbl9maWx0ZXIgKmY7CisJaW50IGNvdW50ID0gNTA7CisKKwl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChfX0k0MEVWRl9JTl9DUklUSUNBTF9UQVNLLAorCQkJCSZhZGFwdGVyLT5jcml0X3NlY3Rpb24pKSB7CisJCXVkZWxheSgxKTsKKwkJaWYgKC0tY291bnQgPT0gMCkKKwkJCXJldHVybjsKKwl9CiAKIAlmID0gaTQwZXZmX2ZpbmRfdmxhbihhZGFwdGVyLCB2bGFuKTsKIAlpZiAoZikgewogCQlmLT5yZW1vdmUgPSB0cnVlOwogCQlhZGFwdGVyLT5hcV9yZXF1aXJlZCB8PSBJNDBFVkZfRkxBR19BUV9ERUxfVkxBTl9GSUxURVI7CiAJfQorCWNsZWFyX2JpdChfX0k0MEVWRl9JTl9DUklUSUNBTF9UQVNLLCAmYWRhcHRlci0+Y3JpdF9zZWN0aW9uKTsKIH0KIAogLyoqCkBAIC03NjEsMTMgKzc4MywxNyBAQAogCQkJCSAgICAgdTggKm1hY2FkZHIpCiB7CiAJc3RydWN0IGk0MGV2Zl9tYWNfZmlsdGVyICpmOworCWludCBjb3VudCA9IDUwOwogCiAJaWYgKCFtYWNhZGRyKQogCQlyZXR1cm4gTlVMTDsKIAogCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KF9fSTQwRVZGX0lOX0NSSVRJQ0FMX1RBU0ssCi0JCQkJJmFkYXB0ZXItPmNyaXRfc2VjdGlvbikpCisJCQkJJmFkYXB0ZXItPmNyaXRfc2VjdGlvbikpIHsKIAkJdWRlbGF5KDEpOworCQlpZiAoLS1jb3VudCA9PSAwKQorCQkJcmV0dXJuIE5VTEw7CisJfQogCiAJZiA9IGk0MGV2Zl9maW5kX2ZpbHRlcihhZGFwdGVyLCBtYWNhZGRyKTsKIAlpZiAoIWYpIHsKQEAgLTgyOCw2ICs4NTQsNyBAQAogCXN0cnVjdCBpNDBldmZfbWFjX2ZpbHRlciAqZiwgKmZ0bXA7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICp1Y2E7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICptY2E7CisJaW50IGNvdW50ID0gNTA7CiAKIAkvKiBhZGQgYWRkciBpZiBub3QgYWxyZWFkeSBpbiB0aGUgZmlsdGVyIGxpc3QgKi8KIAluZXRkZXZfZm9yX2VhY2hfdWNfYWRkcih1Y2EsIG5ldGRldikgewpAQCAtODM4LDggKzg2NSwxNCBAQAogCX0KIAogCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KF9fSTQwRVZGX0lOX0NSSVRJQ0FMX1RBU0ssCi0JCQkJJmFkYXB0ZXItPmNyaXRfc2VjdGlvbikpCisJCQkJJmFkYXB0ZXItPmNyaXRfc2VjdGlvbikpIHsKIAkJdWRlbGF5KDEpOworCQlpZiAoLS1jb3VudCA9PSAwKSB7CisJCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkJIkZhaWxlZCB0byBnZXQgbG9jayBpbiAlc1xuIiwgX19mdW5jX18pOworCQkJcmV0dXJuOworCQl9CisJfQogCS8qIHJlbW92ZSBmaWx0ZXIgaWYgbm90IGluIG5ldGRldiBsaXN0ICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGYsIGZ0bXAsICZhZGFwdGVyLT5tYWNfZmlsdGVyX2xpc3QsIGxpc3QpIHsKIAkJYm9vbCBmb3VuZCA9IGZhbHNlOwpAQCAtOTIwLDcgKzk1Myw3IEBACiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9hY3RpdmVfcXVldWVzOyBpKyspIHsKIAkJc3RydWN0IGk0MGVfcmluZyAqcmluZyA9IGFkYXB0ZXItPnJ4X3JpbmdzW2ldOwogCi0JCWk0MGV2Zl9hbGxvY19yeF9idWZmZXJzKHJpbmcsIHJpbmctPmNvdW50KTsKKwkJaTQwZXZmX2FsbG9jX3J4X2J1ZmZlcnNfMWJ1ZihyaW5nLCByaW5nLT5jb3VudCk7CiAJCXJpbmctPm5leHRfdG9fdXNlID0gcmluZy0+Y291bnQgLSAxOwogCQl3cml0ZWwocmluZy0+bmV4dF90b191c2UsIHJpbmctPnRhaWwpOwogCX0KQEAgLTk1OCw2ICs5OTEsOSBAQAogCQkJCSZhZGFwdGVyLT5jcml0X3NlY3Rpb24pKQogCQl1c2xlZXBfcmFuZ2UoNTAwLCAxMDAwKTsKIAorCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJbmV0aWZfdHhfZGlzYWJsZShuZXRkZXYpOworCWk0MGV2Zl9uYXBpX2Rpc2FibGVfYWxsKGFkYXB0ZXIpOwogCWk0MGV2Zl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKIAogCS8qIHJlbW92ZSBhbGwgTUFDIGZpbHRlcnMgKi8KQEAgLTk4MSwxNSArMTAxNyw3IEBACiAJCWFkYXB0ZXItPmFxX3JlcXVpcmVkIHw9IEk0MEVWRl9GTEFHX0FRX0RFTF9WTEFOX0ZJTFRFUjsKIAkJYWRhcHRlci0+YXFfcmVxdWlyZWQgfD0gSTQwRVZGX0ZMQUdfQVFfRElTQUJMRV9RVUVVRVM7CiAJfQotCW5ldGlmX3R4X2Rpc2FibGUobmV0ZGV2KTsKIAotCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpOwotCi0JaTQwZXZmX25hcGlfZGlzYWJsZV9hbGwoYWRhcHRlcik7Ci0KLQltc2xlZXAoMjApOwotCi0JbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAljbGVhcl9iaXQoX19JNDBFVkZfSU5fQ1JJVElDQUxfVEFTSywgJmFkYXB0ZXItPmNyaXRfc2VjdGlvbik7CiB9CiAKQEAgLTEzNDQsNiArMTM3MiwxMSBAQAogCQlnb3RvIHdhdGNoZG9nX2RvbmU7CiAJfQogCisJaWYgKGFkYXB0ZXItPmFxX3JlcXVpcmVkICYgSTQwRVZGX0ZMQUdfQVFfRElTQUJMRV9RVUVVRVMpIHsKKwkJaTQwZXZmX2Rpc2FibGVfcXVldWVzKGFkYXB0ZXIpOworCQlnb3RvIHdhdGNoZG9nX2RvbmU7CisJfQorCiAJaWYgKGFkYXB0ZXItPmFxX3JlcXVpcmVkICYgSTQwRVZGX0ZMQUdfQVFfTUFQX1ZFQ1RPUlMpIHsKIAkJaTQwZXZmX21hcF9xdWV1ZXMoYWRhcHRlcik7CiAJCWdvdG8gd2F0Y2hkb2dfZG9uZTsKQEAgLTEzNjksMTEgKzE0MDIsNiBAQAogCQlnb3RvIHdhdGNoZG9nX2RvbmU7CiAJfQogCi0JaWYgKGFkYXB0ZXItPmFxX3JlcXVpcmVkICYgSTQwRVZGX0ZMQUdfQVFfRElTQUJMRV9RVUVVRVMpIHsKLQkJaTQwZXZmX2Rpc2FibGVfcXVldWVzKGFkYXB0ZXIpOwotCQlnb3RvIHdhdGNoZG9nX2RvbmU7Ci0JfQotCiAJaWYgKGFkYXB0ZXItPmFxX3JlcXVpcmVkICYgSTQwRVZGX0ZMQUdfQVFfQ09ORklHVVJFX1FVRVVFUykgewogCQlpNDBldmZfY29uZmlndXJlX3F1ZXVlcyhhZGFwdGVyKTsKIAkJZ290byB3YXRjaGRvZ19kb25lOwpAQCAtMTQwNyw0MSArMTQzNSwyMiBAQAogfQogCiAvKioKLSAqIG5leHRfcXVldWUgLSBpbmNyZW1lbnQgdG8gbmV4dCBhdmFpbGFibGUgdHggcXVldWUKLSAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQotICogQGo6IHF1ZXVlIGNvdW50ZXIKLSAqCi0gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIFJTUyBwcm9ncmFtbWluZyB0byBpbmNyZW1lbnQgdGhyb3VnaCBhdmFpbGFibGUKLSAqIHF1ZXVzLiBSZXR1cm5zIHRoZSBuZXh0IHF1ZXVlIHZhbHVlLgotICoqLwotc3RhdGljIGludCBuZXh0X3F1ZXVlKHN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlciwgaW50IGopCi17Ci0JaiArPSAxOwotCi0JcmV0dXJuIGogPj0gYWRhcHRlci0+bnVtX2FjdGl2ZV9xdWV1ZXMgPyAwIDogajsKLX0KLQotLyoqCi0gKiBpNDBldmZfY29uZmlndXJlX3JzcyAtIFByZXBhcmUgZm9yIFJTUyBpZiB1c2VkCisgKiBpNDBldmZfY29uZmlndXJlX3JzcyAtIFByZXBhcmUgZm9yIFJTUwogICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKiovCiBzdGF0aWMgdm9pZCBpNDBldmZfY29uZmlndXJlX3JzcyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdTMyIHJzc19rZXlbSTQwRV9WRlFGX0hLRVlfTUFYX0lOREVYICsgMV07CiAJc3RydWN0IGk0MGVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiBjcXVldWUgPSAwOwogCXUzMiBsdXQgPSAwOwogCWludCBpLCBqOwogCXU2NCBoZW5hOwogCi0JLyogTm8gUlNTIGZvciBzaW5nbGUgcXVldWUuICovCi0JaWYgKGFkYXB0ZXItPm51bV9hY3RpdmVfcXVldWVzID09IDEpIHsKLQkJd3IzMihodywgSTQwRV9WRlFGX0hFTkEoMCksIDApOwotCQl3cjMyKGh3LCBJNDBFX1ZGUUZfSEVOQSgxKSwgMCk7Ci0JCXJldHVybjsKLQl9Ci0KIAkvKiBIYXNoIHR5cGUgaXMgY29uZmlndXJlZCBieSB0aGUgUEYgLSB3ZSBqdXN0IHN1cHBseSB0aGUga2V5ICovCiAJbmV0ZGV2X3Jzc19rZXlfZmlsbChyc3Nfa2V5LCBzaXplb2YocnNzX2tleSkpOworCisJLyogRmlsbCBvdXQgaGFzaCBmdW5jdGlvbiBzZWVkICovCiAJZm9yIChpID0gMDsgaSA8PSBJNDBFX1ZGUUZfSEtFWV9NQVhfSU5ERVg7IGkrKykKIAkJd3IzMihodywgSTQwRV9WRlFGX0hLRVkoaSksIHJzc19rZXlbaV0pOwogCkBAIC0xNDUxLDE2ICsxNDYwLDE0IEBACiAJd3IzMihodywgSTQwRV9WRlFGX0hFTkEoMSksICh1MzIpKGhlbmEgPj4gMzIpKTsKIAogCS8qIFBvcHVsYXRlIHRoZSBMVVQgd2l0aCBtYXggbm8uIG9mIHF1ZXVlcyBpbiByb3VuZCByb2JpbiBmYXNoaW9uICovCi0JaiA9IGFkYXB0ZXItPm51bV9hY3RpdmVfcXVldWVzOwogCWZvciAoaSA9IDA7IGkgPD0gSTQwRV9WRlFGX0hMVVRfTUFYX0lOREVYOyBpKyspIHsKLQkJaiA9IG5leHRfcXVldWUoYWRhcHRlciwgaik7Ci0JCWx1dCA9IGo7Ci0JCWogPSBuZXh0X3F1ZXVlKGFkYXB0ZXIsIGopOwotCQlsdXQgfD0gaiA8PCA4OwotCQlqID0gbmV4dF9xdWV1ZShhZGFwdGVyLCBqKTsKLQkJbHV0IHw9IGogPDwgMTY7Ci0JCWogPSBuZXh0X3F1ZXVlKGFkYXB0ZXIsIGopOwotCQlsdXQgfD0gaiA8PCAyNDsKKwkJbHV0ID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQkJaWYgKGNxdWV1ZSA9PSBhZGFwdGVyLT52c2lfcmVzLT5udW1fcXVldWVfcGFpcnMpCisJCQkJY3F1ZXVlID0gMDsKKwkJCWx1dCB8PSAoKGNxdWV1ZSkgPDwgKDggKiBqKSk7CisJCQljcXVldWUrKzsKKwkJfQogCQl3cjMyKGh3LCBJNDBFX1ZGUUZfSExVVChpKSwgbHV0KTsKIAl9CiAJaTQwZV9mbHVzaChodyk7CkBAIC0xNDgxLDkgKzE0ODgsMTEgQEAKIAlzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywKIAkJCQkJCSAgICAgIHN0cnVjdCBpNDBldmZfYWRhcHRlciwKIAkJCQkJCSAgICAgIHJlc2V0X3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJc3RydWN0IGk0MGVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCWludCBpID0gMCwgZXJyOworCXN0cnVjdCBpNDBldmZfbWFjX2ZpbHRlciAqZjsKIAl1aW50MzJfdCByc3RhdF92YWw7CisJaW50IGkgPSAwLCBlcnI7CiAKIAl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChfX0k0MEVWRl9JTl9DUklUSUNBTF9UQVNLLAogCQkJCSZhZGFwdGVyLT5jcml0X3NlY3Rpb24pKQpAQCAtMTUyOCw3ICsxNTM3LDExIEBACiAKIAkJaWYgKG5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgewogCQkJc2V0X2JpdChfX0k0MEVfRE9XTiwgJmFkYXB0ZXItPnZzaS5zdGF0ZSk7Ci0JCQlpNDBldmZfZG93bihhZGFwdGVyKTsKKwkJCWk0MGV2Zl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKKwkJCWk0MGV2Zl9uYXBpX2Rpc2FibGVfYWxsKGFkYXB0ZXIpOworCQkJbmV0aWZfdHhfZGlzYWJsZShuZXRkZXYpOworCQkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CisJCQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwogCQkJaTQwZXZmX2ZyZWVfdHJhZmZpY19pcnFzKGFkYXB0ZXIpOwogCQkJaTQwZXZmX2ZyZWVfYWxsX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKIAkJCWk0MGV2Zl9mcmVlX2FsbF9yeF9yZXNvdXJjZXMoYWRhcHRlcik7CkBAIC0xNTYwLDIyICsxNTczLDM4IEBACiBjb250aW51ZV9yZXNldDoKIAlhZGFwdGVyLT5mbGFncyAmPSB+STQwRVZGX0ZMQUdfUkVTRVRfUEVORElORzsKIAotCWk0MGV2Zl9kb3duKGFkYXB0ZXIpOworCWk0MGV2Zl9pcnFfZGlzYWJsZShhZGFwdGVyKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJaTQwZXZmX25hcGlfZGlzYWJsZV9hbGwoYWRhcHRlcik7CisJCW5ldGlmX3R4X2Rpc2FibGUobmV0ZGV2KTsKKwkJbmV0aWZfdHhfc3RvcF9hbGxfcXVldWVzKG5ldGRldik7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CisJfQorCiAJYWRhcHRlci0+c3RhdGUgPSBfX0k0MEVWRl9SRVNFVFRJTkc7CiAKIAkvKiBraWxsIGFuZCByZWluaXQgdGhlIGFkbWluIHF1ZXVlICovCiAJaWYgKGk0MGV2Zl9zaHV0ZG93bl9hZG1pbnEoaHcpKQotCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJICIlczogRmFpbGVkIHRvIGRlc3Ryb3kgdGhlIEFkbWluIFF1ZXVlIHJlc291cmNlc1xuIiwKLQkJCSBfX2Z1bmNfXyk7CisJCWRldl93YXJuKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJGYWlsZWQgdG8gc2h1dCBkb3duIGFkbWlucVxuIik7CisJYWRhcHRlci0+Y3VycmVudF9vcCA9IEk0MEVfVklSVENITkxfT1BfVU5LTk9XTjsKIAllcnIgPSBpNDBldmZfaW5pdF9hZG1pbnEoaHcpOwogCWlmIChlcnIpCi0JCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlczogaW5pdF9hZG1pbnEgZmFpbGVkOiAlZFxuIiwKLQkJCSBfX2Z1bmNfXywgZXJyKTsKKwkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIkZhaWxlZCB0byBpbml0IGFkbWlucTogJWRcbiIsCisJCQkgZXJyKTsKIAotCWFkYXB0ZXItPmFxX3BlbmRpbmcgPSAwOwotCWFkYXB0ZXItPmFxX3JlcXVpcmVkID0gMDsKIAlpNDBldmZfbWFwX3F1ZXVlcyhhZGFwdGVyKTsKKworCS8qIHJlLWFkZCBhbGwgTUFDIGZpbHRlcnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZhZGFwdGVyLT5tYWNfZmlsdGVyX2xpc3QsIGxpc3QpIHsKKwkJZi0+YWRkID0gdHJ1ZTsKKwl9CisJLyogcmUtYWRkIGFsbCBWTEFOIGZpbHRlcnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZhZGFwdGVyLT52bGFuX2ZpbHRlcl9saXN0LCBsaXN0KSB7CisJCWYtPmFkZCA9IHRydWU7CisJfQorCWFkYXB0ZXItPmFxX3JlcXVpcmVkID0gSTQwRVZGX0ZMQUdfQVFfQUREX01BQ19GSUxURVI7CisJYWRhcHRlci0+YXFfcmVxdWlyZWQgfD0gSTQwRVZGX0ZMQUdfQVFfQUREX1ZMQU5fRklMVEVSOwogCWNsZWFyX2JpdChfX0k0MEVWRl9JTl9DUklUSUNBTF9UQVNLLCAmYWRhcHRlci0+Y3JpdF9zZWN0aW9uKTsKIAogCW1vZF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsIGppZmZpZXMgKyAyKTsKQEAgLTE2ODgsNyArMTcxNyw3IEBACiAgKgogICogRnJlZSBhbGwgdHJhbnNtaXQgc29mdHdhcmUgcmVzb3VyY2VzCiAgKiovCi1zdGF0aWMgdm9pZCBpNDBldmZfZnJlZV9hbGxfdHhfcmVzb3VyY2VzKHN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlcikKK3ZvaWQgaTQwZXZmX2ZyZWVfYWxsX3R4X3Jlc291cmNlcyhzdHJ1Y3QgaTQwZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaW50IGk7CiAKQEAgLTE3NTgsNyArMTc4Nyw3IEBACiAgKgogICogRnJlZSBhbGwgcmVjZWl2ZSBzb2Z0d2FyZSByZXNvdXJjZXMKICAqKi8KLXN0YXRpYyB2b2lkIGk0MGV2Zl9mcmVlX2FsbF9yeF9yZXNvdXJjZXMoc3RydWN0IGk0MGV2Zl9hZGFwdGVyICphZGFwdGVyKQordm9pZCBpNDBldmZfZnJlZV9hbGxfcnhfcmVzb3VyY2VzKHN0cnVjdCBpNDBldmZfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlpbnQgaTsKIApAQCAtMTc4OCw3ICsxODE3LDcgQEAKIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAiVW5hYmxlIHRvIG9wZW4gZGV2aWNlIGR1ZSB0byBQRiBkcml2ZXIgZmFpbHVyZS5cbiIpOwogCQlyZXR1cm4gLUVJTzsKIAl9Ci0JaWYgKGFkYXB0ZXItPnN0YXRlICE9IF9fSTQwRVZGX0RPV04pCisJaWYgKGFkYXB0ZXItPnN0YXRlICE9IF9fSTQwRVZGX0RPV04gfHwgYWRhcHRlci0+YXFfcmVxdWlyZWQpCiAJCXJldHVybiAtRUJVU1k7CiAKIAkvKiBhbGxvY2F0ZSB0cmFuc21pdCBkZXNjcmlwdG9ycyAqLwpAQCAtMTg1Miw5ICsxODgxLDYgQEAKIAlhZGFwdGVyLT5zdGF0ZSA9IF9fSTQwRVZGX0RPV047CiAJaTQwZXZmX2ZyZWVfdHJhZmZpY19pcnFzKGFkYXB0ZXIpOwogCi0JaTQwZXZmX2ZyZWVfYWxsX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKLQlpNDBldmZfZnJlZV9hbGxfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5NzcsNyArMjAwMyw3IEBACiAgKgogICogVGhpcyB0YXNrIGNvbXBsZXRlcyB0aGUgd29yayB0aGF0IHdhcyBiZWd1biBpbiBwcm9iZS4gRHVlIHRvIHRoZSBuYXR1cmUKICAqIG9mIFZGLVBGIGNvbW11bmljYXRpb25zLCB3ZSBtYXkgbmVlZCB0byB3YWl0IHRlbnMgb2YgbWlsbGlzZWNvbmRzIHRvIGdldAotICogcmVwb25zZXMgYmFjayBmcm9tIHRoZSBQRi4gUmF0aGVyIHRoYW4gYnVzeS13YWl0IGluIHByb2JlIGFuZCBib2cgZG93biB0aGUKKyAqIHJlc3BvbnNlcyBiYWNrIGZyb20gdGhlIFBGLiBSYXRoZXIgdGhhbiBidXN5LXdhaXQgaW4gcHJvYmUgYW5kIGJvZyBkb3duIHRoZQogICogd2hvbGUgc3lzdGVtLCB3ZSdsbCBkbyBpdCBpbiBhIHRhc2sgc28gd2UgY2FuIHNsZWVwLgogICogVGhpcyB0YXNrIG9ubHkgcnVucyBkdXJpbmcgZHJpdmVyIGluaXQuIE9uY2Ugd2UndmUgZXN0YWJsaXNoZWQKICAqIGNvbW11bmljYXRpb25zIHdpdGggdGhlIFBGIGRyaXZlciBhbmQgc2V0IHVwIG91ciBuZXRkZXYsIHRoZSB3YXRjaGRvZwpAQCAtMjM2OCw3ICsyMzk0LDcgQEAKIH0KIAogLyoqCi0gKiBpNDBldmZfcmVzdW1lIC0gUG93ZXIgbWFuYWdtZW50IHJlc3VtZSByb3V0aW5lCisgKiBpNDBldmZfcmVzdW1lIC0gUG93ZXIgbWFuYWdlbWVudCByZXN1bWUgcm91dGluZQogICogQHBkZXY6IFBDSSBkZXZpY2UgaW5mb3JtYXRpb24gc3RydWN0CiAgKgogICogQ2FsbGVkIHdoZW4gdGhlIHN5c3RlbSAoVk0pIGlzIHJlc3VtZWQgZnJvbSBzbGVlcC9zdXNwZW5kLgpAQCAtMjQ2OCw2ICsyNDk0LDggQEAKIAlpb3VubWFwKGh3LT5od19hZGRyKTsKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwogCisJaTQwZXZmX2ZyZWVfYWxsX3R4X3Jlc291cmNlcyhhZGFwdGVyKTsKKwlpNDBldmZfZnJlZV9hbGxfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCWk0MGV2Zl9mcmVlX3F1ZXVlcyhhZGFwdGVyKTsKIAlrZnJlZShhZGFwdGVyLT52Zl9yZXMpOwogCS8qIElmIHdlIGdvdCByZW1vdmVkIGJlZm9yZSBhbiB1cC9kb3duIHNlcXVlbmNlLCB3ZSd2ZSBnb3QgYSBmaWx0ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfdmlydGNobmwuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2k0MGV2Zi9pNDBldmZfdmlydGNobmwuYwppbmRleCAzZjBjODVlLi40MjQwYTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pNDBldmYvaTQwZXZmX3ZpcnRjaG5sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaTQwZXZmL2k0MGV2Zl92aXJ0Y2hubC5jCkBAIC03NjEsNiArNzYxLDggQEAKIAkJYnJlYWs7CiAJY2FzZSBJNDBFX1ZJUlRDSE5MX09QX0RJU0FCTEVfUVVFVUVTOgogCQlhZGFwdGVyLT5hcV9wZW5kaW5nICY9IH4oSTQwRVZGX0ZMQUdfQVFfRElTQUJMRV9RVUVVRVMpOworCQlpNDBldmZfZnJlZV9hbGxfdHhfcmVzb3VyY2VzKGFkYXB0ZXIpOworCQlpNDBldmZfZnJlZV9hbGxfcnhfcmVzb3VyY2VzKGFkYXB0ZXIpOwogCQlicmVhazsKIAljYXNlIEk0MEVfVklSVENITkxfT1BfQ09ORklHX1ZTSV9RVUVVRVM6CiAJCWFkYXB0ZXItPmFxX3BlbmRpbmcgJj0gfihJNDBFVkZfRkxBR19BUV9DT05GSUdVUkVfUVVFVUVTKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9tYWluLmMKaW5kZXggZjM2NmIzYi4uODQ1N2QwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9tYWluLmMKQEAgLTE3NzYsNiArMTc3Niw3IEBACiAJd3IzMihFMTAwMF9SQ1RMLCByY3RsICYgfkUxMDAwX1JDVExfRU4pOwogCS8qIGZsdXNoIGFuZCBzbGVlcCBiZWxvdyAqLwogCisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMobmV0ZGV2KTsKIAogCS8qIGRpc2FibGUgdHJhbnNtaXRzIGluIHRoZSBoYXJkd2FyZSAqLwpAQCAtMTc5NywxMiArMTc5OCw5IEBACiAJCX0KIAl9CiAKLQogCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CiAJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPnBoeV9pbmZvX3RpbWVyKTsKIAotCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7Ci0KIAkvKiByZWNvcmQgdGhlIHN0YXRzIGJlZm9yZSByZXNldCovCiAJc3Bpbl9sb2NrKCZhZGFwdGVyLT5zdGF0czY0X2xvY2spOwogCWlnYl91cGRhdGVfc3RhdHMoYWRhcHRlciwgJmFkYXB0ZXItPnN0YXRzNjQpOwpAQCAtMjA5NSw2ICsyMDkzLDcgQEAKICNlbmRpZgogCS5uZG9fZml4X2ZlYXR1cmVzCT0gaWdiX2ZpeF9mZWF0dXJlcywKIAkubmRvX3NldF9mZWF0dXJlcwk9IGlnYl9zZXRfZmVhdHVyZXMsCisJLm5kb19mZWF0dXJlc19jaGVjawk9IHBhc3N0aHJ1X2ZlYXR1cmVzX2NoZWNrLAogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9wdHAuYwppbmRleCBkMjBmYzhlLi5lM2I5YjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX3B0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2JfcHRwLmMKQEAgLTMwLDcgKzMwLDcgQEAKICAqCiAgKiBOZWl0aGVyIHRoZSA4MjU3NiBub3IgdGhlIDgyNTgwIG9mZmVyIHJlZ2lzdGVycyB3aWRlIGVub3VnaCB0byBob2xkCiAgKiBuYW5vc2Vjb25kcyB0aW1lIHZhbHVlcyBmb3IgdmVyeSBsb25nLiBGb3IgdGhlIDgyNTgwLCBTWVNUSU0gYWx3YXlzCi0gKiBjb3VudHMgbmFub3NlY29uZHMsIGJ1dCB0aGUgdXBwZXIgMjQgYml0cyBhcmUgbm90IGF2YWlsaWJsZS4gVGhlCisgKiBjb3VudHMgbmFub3NlY29uZHMsIGJ1dCB0aGUgdXBwZXIgMjQgYml0cyBhcmUgbm90IGF2YWlsYWJsZS4gVGhlCiAgKiBmcmVxdWVuY3kgaXMgYWRqdXN0ZWQgYnkgY2hhbmdpbmcgdGhlIDMyIGJpdCBmcmFjdGlvbmFsIG5hbm9zZWNvbmRzCiAgKiByZWdpc3RlciwgVElNSU5DQS4KICAqCkBAIC0xMTYsNyArMTE2LDggQEAKIH0KIAogLyogU1lTVElNIHJlYWQgYWNjZXNzIGZvciBJMjEwL0kyMTEgKi8KLXN0YXRpYyB2b2lkIGlnYl9wdHBfcmVhZF9pMjEwKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwgc3RydWN0IHRpbWVzcGVjICp0cykKK3N0YXRpYyB2b2lkIGlnYl9wdHBfcmVhZF9pMjEwKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwKKwkJCSAgICAgIHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiBzZWMsIG5zZWM7CkBAIC0xMzQsNyArMTM1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaWdiX3B0cF93cml0ZV9pMjEwKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorCQkJICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCkBAIC0yNjksMTMgKzI3MCwxMyBAQAogCXN0cnVjdCBpZ2JfYWRhcHRlciAqaWdiID0gY29udGFpbmVyX29mKHB0cCwgc3RydWN0IGlnYl9hZGFwdGVyLAogCQkJCQkgICAgICAgcHRwX2NhcHMpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHRpbWVzcGVjIG5vdywgdGhlbiA9IG5zX3RvX3RpbWVzcGVjKGRlbHRhKTsKKwlzdHJ1Y3QgdGltZXNwZWM2NCBub3csIHRoZW4gPSBuc190b190aW1lc3BlYzY0KGRlbHRhKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpZ2ItPnRtcmVnX2xvY2ssIGZsYWdzKTsKIAogCWlnYl9wdHBfcmVhZF9pMjEwKGlnYiwgJm5vdyk7Ci0Jbm93ID0gdGltZXNwZWNfYWRkKG5vdywgdGhlbik7Ci0JaWdiX3B0cF93cml0ZV9pMjEwKGlnYiwgKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqKSZub3cpOworCW5vdyA9IHRpbWVzcGVjNjRfYWRkKG5vdywgdGhlbik7CisJaWdiX3B0cF93cml0ZV9pMjEwKGlnYiwgKGNvbnN0IHN0cnVjdCB0aW1lc3BlYzY0ICopJm5vdyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZ2ItPnRtcmVnX2xvY2ssIGZsYWdzKTsKIApAQCAtMjgzLDEzICsyODQsMTIgQEAKIH0KIAogc3RhdGljIGludCBpZ2JfcHRwX2dldHRpbWVfODI1NzYoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCi0JCQkJIHN0cnVjdCB0aW1lc3BlYyAqdHMpCisJCQkJIHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmlnYiA9IGNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBpZ2JfYWRhcHRlciwKIAkJCQkJICAgICAgIHB0cF9jYXBzKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXU2NCBuczsKLQl1MzIgcmVtYWluZGVyOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlnYi0+dG1yZWdfbG9jaywgZmxhZ3MpOwogCkBAIC0yOTcsMTQgKzI5NywxMyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWdiLT50bXJlZ19sb2NrLCBmbGFncyk7CiAKLQl0cy0+dHZfc2VjID0gZGl2X3U2NF9yZW0obnMsIDEwMDAwMDAwMDAsICZyZW1haW5kZXIpOwotCXRzLT50dl9uc2VjID0gcmVtYWluZGVyOworCSp0cyA9IG5zX3RvX3RpbWVzcGVjNjQobnMpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgaWdiX3B0cF9nZXR0aW1lX2kyMTAoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCi0JCQkJc3RydWN0IHRpbWVzcGVjICp0cykKKwkJCQlzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJc3RydWN0IGlnYl9hZGFwdGVyICppZ2IgPSBjb250YWluZXJfb2YocHRwLCBzdHJ1Y3QgaWdiX2FkYXB0ZXIsCiAJCQkJCSAgICAgICBwdHBfY2Fwcyk7CkBAIC0zMjAsMTUgKzMxOSwxNCBAQAogfQogCiBzdGF0aWMgaW50IGlnYl9wdHBfc2V0dGltZV84MjU3NihzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCQkgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cykKKwkJCQkgY29uc3Qgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXN0cnVjdCBpZ2JfYWRhcHRlciAqaWdiID0gY29udGFpbmVyX29mKHB0cCwgc3RydWN0IGlnYl9hZGFwdGVyLAogCQkJCQkgICAgICAgcHRwX2NhcHMpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTY0IG5zOwogCi0JbnMgPSB0cy0+dHZfc2VjICogMTAwMDAwMDAwMFVMTDsKLQlucyArPSB0cy0+dHZfbnNlYzsKKwlucyA9IHRpbWVzcGVjNjRfdG9fbnModHMpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmlnYi0+dG1yZWdfbG9jaywgZmxhZ3MpOwogCkBAIC0zNDAsNyArMzM4LDcgQEAKIH0KIAogc3RhdGljIGludCBpZ2JfcHRwX3NldHRpbWVfaTIxMChzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCQljb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorCQkJCWNvbnN0IHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmlnYiA9IGNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBpZ2JfYWRhcHRlciwKIAkJCQkJICAgICAgIHB0cF9jYXBzKTsKQEAgLTM1OCw3ICszNTYsNyBAQAogc3RhdGljIHZvaWQgaWdiX3Bpbl9kaXJlY3Rpb24oaW50IHBpbiwgaW50IGlucHV0LCB1MzIgKmN0cmwsIHUzMiAqY3RybF9leHQpCiB7CiAJdTMyICpwdHIgPSBwaW4gPCAyID8gY3RybCA6IGN0cmxfZXh0OwotCXUzMiBtYXNrW0lHQl9OX1NEUF0gPSB7CisJc3RhdGljIGNvbnN0IHUzMiBtYXNrW0lHQl9OX1NEUF0gPSB7CiAJCUUxMDAwX0NUUkxfU0RQMF9ESVIsCiAJCUUxMDAwX0NUUkxfU0RQMV9ESVIsCiAJCUUxMDAwX0NUUkxfRVhUX1NEUDJfRElSLApAQCAtMzczLDE2ICszNzEsMTYgQEAKIAogc3RhdGljIHZvaWQgaWdiX3Bpbl9leHR0cyhzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmlnYiwgaW50IGNoYW4sIGludCBwaW4pCiB7Ci0Jc3RydWN0IGUxMDAwX2h3ICpodyA9ICZpZ2ItPmh3OwotCXUzMiBhdXgwX3NlbF9zZHBbSUdCX05fU0RQXSA9IHsKKwlzdGF0aWMgY29uc3QgdTMyIGF1eDBfc2VsX3NkcFtJR0JfTl9TRFBdID0gewogCQlBVVgwX1NFTF9TRFAwLCBBVVgwX1NFTF9TRFAxLCBBVVgwX1NFTF9TRFAyLCBBVVgwX1NFTF9TRFAzLAogCX07Ci0JdTMyIGF1eDFfc2VsX3NkcFtJR0JfTl9TRFBdID0geworCXN0YXRpYyBjb25zdCB1MzIgYXV4MV9zZWxfc2RwW0lHQl9OX1NEUF0gPSB7CiAJCUFVWDFfU0VMX1NEUDAsIEFVWDFfU0VMX1NEUDEsIEFVWDFfU0VMX1NEUDIsIEFVWDFfU0VMX1NEUDMsCiAJfTsKLQl1MzIgdHNfc2RwX2VuW0lHQl9OX1NEUF0gPSB7CisJc3RhdGljIGNvbnN0IHUzMiB0c19zZHBfZW5bSUdCX05fU0RQXSA9IHsKIAkJVFNfU0RQMF9FTiwgVFNfU0RQMV9FTiwgVFNfU0RQMl9FTiwgVFNfU0RQM19FTiwKIAl9OworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmaWdiLT5odzsKIAl1MzIgY3RybCwgY3RybF9leHQsIHRzc2RwID0gMDsKIAogCWN0cmwgPSByZDMyKEUxMDAwX0NUUkwpOwpAQCAtNDA5LDI4ICs0MDcsMjggQEAKIAogc3RhdGljIHZvaWQgaWdiX3Bpbl9wZXJvdXQoc3RydWN0IGlnYl9hZGFwdGVyICppZ2IsIGludCBjaGFuLCBpbnQgcGluKQogewotCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmaWdiLT5odzsKLQl1MzIgYXV4MF9zZWxfc2RwW0lHQl9OX1NEUF0gPSB7CisJc3RhdGljIGNvbnN0IHUzMiBhdXgwX3NlbF9zZHBbSUdCX05fU0RQXSA9IHsKIAkJQVVYMF9TRUxfU0RQMCwgQVVYMF9TRUxfU0RQMSwgQVVYMF9TRUxfU0RQMiwgQVVYMF9TRUxfU0RQMywKIAl9OwotCXUzMiBhdXgxX3NlbF9zZHBbSUdCX05fU0RQXSA9IHsKKwlzdGF0aWMgY29uc3QgdTMyIGF1eDFfc2VsX3NkcFtJR0JfTl9TRFBdID0gewogCQlBVVgxX1NFTF9TRFAwLCBBVVgxX1NFTF9TRFAxLCBBVVgxX1NFTF9TRFAyLCBBVVgxX1NFTF9TRFAzLAogCX07Ci0JdTMyIHRzX3NkcF9lbltJR0JfTl9TRFBdID0geworCXN0YXRpYyBjb25zdCB1MzIgdHNfc2RwX2VuW0lHQl9OX1NEUF0gPSB7CiAJCVRTX1NEUDBfRU4sIFRTX1NEUDFfRU4sIFRTX1NEUDJfRU4sIFRTX1NEUDNfRU4sCiAJfTsKLQl1MzIgdHNfc2RwX3NlbF90dDBbSUdCX05fU0RQXSA9IHsKKwlzdGF0aWMgY29uc3QgdTMyIHRzX3NkcF9zZWxfdHQwW0lHQl9OX1NEUF0gPSB7CiAJCVRTX1NEUDBfU0VMX1RUMCwgVFNfU0RQMV9TRUxfVFQwLAogCQlUU19TRFAyX1NFTF9UVDAsIFRTX1NEUDNfU0VMX1RUMCwKIAl9OwotCXUzMiB0c19zZHBfc2VsX3R0MVtJR0JfTl9TRFBdID0geworCXN0YXRpYyBjb25zdCB1MzIgdHNfc2RwX3NlbF90dDFbSUdCX05fU0RQXSA9IHsKIAkJVFNfU0RQMF9TRUxfVFQxLCBUU19TRFAxX1NFTF9UVDEsCiAJCVRTX1NEUDJfU0VMX1RUMSwgVFNfU0RQM19TRUxfVFQxLAogCX07Ci0JdTMyIHRzX3NkcF9zZWxfY2xyW0lHQl9OX1NEUF0gPSB7CisJc3RhdGljIGNvbnN0IHUzMiB0c19zZHBfc2VsX2NscltJR0JfTl9TRFBdID0gewogCQlUU19TRFAwX1NFTF9GQzEsIFRTX1NEUDFfU0VMX0ZDMSwKIAkJVFNfU0RQMl9TRUxfRkMxLCBUU19TRFAzX1NFTF9GQzEsCiAJfTsKKwlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmlnYi0+aHc7CiAJdTMyIGN0cmwsIGN0cmxfZXh0LCB0c3NkcCA9IDA7CiAKIAljdHJsID0gcmQzMihFMTAwMF9DVFJMKTsKQEAgLTQ2OCw3ICs0NjYsNyBAQAogCXUzMiB0c2F1eGMsIHRzaW0sIHRzYXV4Y19tYXNrLCB0c2ltX21hc2ssIHRyZ3R0aW1sLCB0cmd0dGltaDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB0aW1lc3BlYyB0czsKLQlpbnQgcGluOworCWludCBwaW4gPSAtMTsKIAlzNjQgbnM7CiAKIAlzd2l0Y2ggKHJxLT50eXBlKSB7CkBAIC02MjcsMTEgKzYyNSwxMiBAQAogewogCXN0cnVjdCBpZ2JfYWRhcHRlciAqaWdiID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZ2JfYWRhcHRlciwgcHRwX292ZXJmbG93X3dvcmsud29yayk7Ci0Jc3RydWN0IHRpbWVzcGVjIHRzOworCXN0cnVjdCB0aW1lc3BlYzY0IHRzOwogCi0JaWdiLT5wdHBfY2Fwcy5nZXR0aW1lKCZpZ2ItPnB0cF9jYXBzLCAmdHMpOworCWlnYi0+cHRwX2NhcHMuZ2V0dGltZTY0KCZpZ2ItPnB0cF9jYXBzLCAmdHMpOwogCi0JcHJfZGVidWcoImlnYiBvdmVyZmxvdyBjaGVjayBhdCAlbGQuJTA5bHVcbiIsIHRzLnR2X3NlYywgdHMudHZfbnNlYyk7CisJcHJfZGVidWcoImlnYiBvdmVyZmxvdyBjaGVjayBhdCAlbGxkLiUwOWx1XG4iLAorCQkgKGxvbmcgbG9uZykgdHMudHZfc2VjLCB0cy50dl9uc2VjKTsKIAogCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaWdiLT5wdHBfb3ZlcmZsb3dfd29yaywKIAkJCSAgICAgIElHQl9TWVNUSU1fT1ZFUkZMT1dfUEVSSU9EKTsKQEAgLTk4OSw4ICs5ODgsOCBAQAogCQlhZGFwdGVyLT5wdHBfY2Fwcy5wcHMgPSAwOwogCQlhZGFwdGVyLT5wdHBfY2Fwcy5hZGpmcmVxID0gaWdiX3B0cF9hZGpmcmVxXzgyNTc2OwogCQlhZGFwdGVyLT5wdHBfY2Fwcy5hZGp0aW1lID0gaWdiX3B0cF9hZGp0aW1lXzgyNTc2OwotCQlhZGFwdGVyLT5wdHBfY2Fwcy5nZXR0aW1lID0gaWdiX3B0cF9nZXR0aW1lXzgyNTc2OwotCQlhZGFwdGVyLT5wdHBfY2Fwcy5zZXR0aW1lID0gaWdiX3B0cF9zZXR0aW1lXzgyNTc2OworCQlhZGFwdGVyLT5wdHBfY2Fwcy5nZXR0aW1lNjQgPSBpZ2JfcHRwX2dldHRpbWVfODI1NzY7CisJCWFkYXB0ZXItPnB0cF9jYXBzLnNldHRpbWU2NCA9IGlnYl9wdHBfc2V0dGltZV84MjU3NjsKIAkJYWRhcHRlci0+cHRwX2NhcHMuZW5hYmxlID0gaWdiX3B0cF9mZWF0dXJlX2VuYWJsZTsKIAkJYWRhcHRlci0+Y2MucmVhZCA9IGlnYl9wdHBfcmVhZF84MjU3NjsKIAkJYWRhcHRlci0+Y2MubWFzayA9IENZQ0xFQ09VTlRFUl9NQVNLKDY0KTsKQEAgLTEwMDksOCArMTAwOCw4IEBACiAJCWFkYXB0ZXItPnB0cF9jYXBzLnBwcyA9IDA7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLmFkamZyZXEgPSBpZ2JfcHRwX2FkamZyZXFfODI1ODA7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLmFkanRpbWUgPSBpZ2JfcHRwX2FkanRpbWVfODI1NzY7Ci0JCWFkYXB0ZXItPnB0cF9jYXBzLmdldHRpbWUgPSBpZ2JfcHRwX2dldHRpbWVfODI1NzY7Ci0JCWFkYXB0ZXItPnB0cF9jYXBzLnNldHRpbWUgPSBpZ2JfcHRwX3NldHRpbWVfODI1NzY7CisJCWFkYXB0ZXItPnB0cF9jYXBzLmdldHRpbWU2NCA9IGlnYl9wdHBfZ2V0dGltZV84MjU3NjsKKwkJYWRhcHRlci0+cHRwX2NhcHMuc2V0dGltZTY0ID0gaWdiX3B0cF9zZXR0aW1lXzgyNTc2OwogCQlhZGFwdGVyLT5wdHBfY2Fwcy5lbmFibGUgPSBpZ2JfcHRwX2ZlYXR1cmVfZW5hYmxlOwogCQlhZGFwdGVyLT5jYy5yZWFkID0gaWdiX3B0cF9yZWFkXzgyNTgwOwogCQlhZGFwdGVyLT5jYy5tYXNrID0gQ1lDTEVDT1VOVEVSX01BU0soSUdCX05CSVRTXzgyNTgwKTsKQEAgLTEwMzgsOCArMTAzNyw4IEBACiAJCWFkYXB0ZXItPnB0cF9jYXBzLnBpbl9jb25maWcgPSBhZGFwdGVyLT5zZHBfY29uZmlnOwogCQlhZGFwdGVyLT5wdHBfY2Fwcy5hZGpmcmVxID0gaWdiX3B0cF9hZGpmcmVxXzgyNTgwOwogCQlhZGFwdGVyLT5wdHBfY2Fwcy5hZGp0aW1lID0gaWdiX3B0cF9hZGp0aW1lX2kyMTA7Ci0JCWFkYXB0ZXItPnB0cF9jYXBzLmdldHRpbWUgPSBpZ2JfcHRwX2dldHRpbWVfaTIxMDsKLQkJYWRhcHRlci0+cHRwX2NhcHMuc2V0dGltZSA9IGlnYl9wdHBfc2V0dGltZV9pMjEwOworCQlhZGFwdGVyLT5wdHBfY2Fwcy5nZXR0aW1lNjQgPSBpZ2JfcHRwX2dldHRpbWVfaTIxMDsKKwkJYWRhcHRlci0+cHRwX2NhcHMuc2V0dGltZTY0ID0gaWdiX3B0cF9zZXR0aW1lX2kyMTA7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLmVuYWJsZSA9IGlnYl9wdHBfZmVhdHVyZV9lbmFibGVfaTIxMDsKIAkJYWRhcHRlci0+cHRwX2NhcHMudmVyaWZ5ID0gaWdiX3B0cF92ZXJpZnlfcGluOwogCQkvKiBFbmFibGUgdGhlIHRpbWVyIGZ1bmN0aW9ucyBieSBjbGVhcmluZyBiaXQgMzEuICovCkBAIC0xMDU3LDcgKzEwNTYsNyBAQAogCiAJLyogSW5pdGlhbGl6ZSB0aGUgY2xvY2sgYW5kIG92ZXJmbG93IHdvcmsgZm9yIGRldmljZXMgdGhhdCBuZWVkIGl0LiAqLwogCWlmICgoaHctPm1hYy50eXBlID09IGUxMDAwX2kyMTApIHx8IChody0+bWFjLnR5cGUgPT0gZTEwMDBfaTIxMSkpIHsKLQkJc3RydWN0IHRpbWVzcGVjIHRzID0ga3RpbWVfdG9fdGltZXNwZWMoa3RpbWVfZ2V0X3JlYWwoKSk7CisJCXN0cnVjdCB0aW1lc3BlYzY0IHRzID0ga3RpbWVfdG9fdGltZXNwZWM2NChrdGltZV9nZXRfcmVhbCgpKTsKIAogCQlpZ2JfcHRwX3NldHRpbWVfaTIxMCgmYWRhcHRlci0+cHRwX2NhcHMsICZ0cyk7CiAJfSBlbHNlIHsKQEAgLTExNzEsNyArMTE3MCw3IEBACiAKIAkvKiBSZS1pbml0aWFsaXplIHRoZSB0aW1lci4gKi8KIAlpZiAoKGh3LT5tYWMudHlwZSA9PSBlMTAwMF9pMjEwKSB8fCAoaHctPm1hYy50eXBlID09IGUxMDAwX2kyMTEpKSB7Ci0JCXN0cnVjdCB0aW1lc3BlYyB0cyA9IGt0aW1lX3RvX3RpbWVzcGVjKGt0aW1lX2dldF9yZWFsKCkpOworCQlzdHJ1Y3QgdGltZXNwZWM2NCB0cyA9IGt0aW1lX3RvX3RpbWVzcGVjNjQoa3RpbWVfZ2V0X3JlYWwoKSk7CiAKIAkJaWdiX3B0cF93cml0ZV9pMjEwKGFkYXB0ZXIsICZ0cyk7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL2RlZmluZXMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL2RlZmluZXMuaAppbmRleCBkOWZhOTk5Li5hZTNmMjgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9kZWZpbmVzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvZGVmaW5lcy5oCkBAIC0xMyw4ICsxMyw3IEBACiAgIG1vcmUgZGV0YWlscy4KIAogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIAogICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgpAQCAtMjksOTQgKzI4LDkzIEBACiAjZGVmaW5lIF9FMTAwMF9ERUZJTkVTX0hfCiAKIC8qIE51bWJlciBvZiBUcmFuc21pdCBhbmQgUmVjZWl2ZSBEZXNjcmlwdG9ycyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCAqLwotI2RlZmluZSBSRVFfVFhfREVTQ1JJUFRPUl9NVUxUSVBMRSAgOAotI2RlZmluZSBSRVFfUlhfREVTQ1JJUFRPUl9NVUxUSVBMRSAgOAorI2RlZmluZSBSRVFfVFhfREVTQ1JJUFRPUl9NVUxUSVBMRQk4CisjZGVmaW5lIFJFUV9SWF9ERVNDUklQVE9SX01VTFRJUExFCTgKIAogLyogSVZBUiB2YWxpZCBiaXQgKi8KLSNkZWZpbmUgRTEwMDBfSVZBUl9WQUxJRCAgICAgICAgMHg4MAorI2RlZmluZSBFMTAwMF9JVkFSX1ZBTElECTB4ODAKIAogLyogUmVjZWl2ZSBEZXNjcmlwdG9yIGJpdCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBFMTAwMF9SWERfU1RBVF9ERCAgICAgICAweDAxICAgIC8qIERlc2NyaXB0b3IgRG9uZSAqLwotI2RlZmluZSBFMTAwMF9SWERfU1RBVF9FT1AgICAgICAweDAyICAgIC8qIEVuZCBvZiBQYWNrZXQgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfSVhTTSAgICAgMHgwNCAgICAvKiBJZ25vcmUgY2hlY2tzdW0gKi8KLSNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfVlAgICAgICAgMHgwOCAgICAvKiBJRUVFIFZMQU4gUGFja2V0ICovCi0jZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1VEUENTICAgIDB4MTAgICAgLyogVURQIHhzdW0gY2FsY3VsYXRlZCAqLwotI2RlZmluZSBFMTAwMF9SWERfU1RBVF9UQ1BDUyAgICAweDIwICAgIC8qIFRDUCB4c3VtIGNhbGN1bGF0ZWQgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfSVBDUyAgICAgMHg0MCAgICAvKiBJUCB4c3VtIGNhbGN1bGF0ZWQgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX0VSUl9TRSAgICAgICAgMHgwMiAgICAvKiBTeW1ib2wgRXJyb3IgKi8KLSNkZWZpbmUgRTEwMDBfUlhEX1NQQ19WTEFOX01BU0sgMHgwRkZGICAvKiBWTEFOIElEIGlzIGluIGxvd2VyIDEyIGJpdHMgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfREQJMHgwMSAgICAvKiBEZXNjcmlwdG9yIERvbmUgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfRU9QCTB4MDIgICAgLyogRW5kIG9mIFBhY2tldCAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9JWFNNCTB4MDQgICAgLyogSWdub3JlIGNoZWNrc3VtICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX1ZQCTB4MDggICAgLyogSUVFRSBWTEFOIFBhY2tldCAqLworI2RlZmluZSBFMTAwMF9SWERfU1RBVF9VRFBDUwkweDEwICAgIC8qIFVEUCB4c3VtIGNhbGN1bGF0ZWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX1NUQVRfVENQQ1MJMHgyMCAgICAvKiBUQ1AgeHN1bSBjYWxjdWxhdGVkICovCisjZGVmaW5lIEUxMDAwX1JYRF9TVEFUX0lQQ1MJMHg0MCAgICAvKiBJUCB4c3VtIGNhbGN1bGF0ZWQgKi8KKyNkZWZpbmUgRTEwMDBfUlhEX0VSUl9TRQkweDAyICAgIC8qIFN5bWJvbCBFcnJvciAqLworI2RlZmluZSBFMTAwMF9SWERfU1BDX1ZMQU5fTUFTSwkweDBGRkYgIC8qIFZMQU4gSUQgaXMgaW4gbG93ZXIgMTIgYml0cyAqLwogCi0jZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX0xCICAgIDB4MDAwNDAwMDAKLSNkZWZpbmUgRTEwMDBfUlhERVhUX1NUQVRFUlJfQ0UgICAgMHgwMTAwMDAwMAotI2RlZmluZSBFMTAwMF9SWERFWFRfU1RBVEVSUl9TRSAgICAweDAyMDAwMDAwCi0jZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX1NFUSAgIDB4MDQwMDAwMDAKLSNkZWZpbmUgRTEwMDBfUlhERVhUX1NUQVRFUlJfQ1hFICAgMHgxMDAwMDAwMAotI2RlZmluZSBFMTAwMF9SWERFWFRfU1RBVEVSUl9UQ1BFICAweDIwMDAwMDAwCi0jZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX0lQRSAgIDB4NDAwMDAwMDAKLSNkZWZpbmUgRTEwMDBfUlhERVhUX1NUQVRFUlJfUlhFICAgMHg4MDAwMDAwMAotCisjZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX0xCCTB4MDAwNDAwMDAKKyNkZWZpbmUgRTEwMDBfUlhERVhUX1NUQVRFUlJfQ0UJMHgwMTAwMDAwMAorI2RlZmluZSBFMTAwMF9SWERFWFRfU1RBVEVSUl9TRQkweDAyMDAwMDAwCisjZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX1NFUQkweDA0MDAwMDAwCisjZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX0NYRQkweDEwMDAwMDAwCisjZGVmaW5lIEUxMDAwX1JYREVYVF9TVEFURVJSX1RDUEUJMHgyMDAwMDAwMAorI2RlZmluZSBFMTAwMF9SWERFWFRfU1RBVEVSUl9JUEUJMHg0MDAwMDAwMAorI2RlZmluZSBFMTAwMF9SWERFWFRfU1RBVEVSUl9SWEUJMHg4MDAwMDAwMAogCiAvKiBTYW1lIG1hc2ssIGJ1dCBmb3IgZXh0ZW5kZWQgYW5kIHBhY2tldCBzcGxpdCBkZXNjcmlwdG9ycyAqLwogI2RlZmluZSBFMTAwMF9SWERFWFRfRVJSX0ZSQU1FX0VSUl9NQVNLICggXAotICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX0NFICB8ICAgICAgICAgICAgXAotICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX1NFICB8ICAgICAgICAgICAgXAotICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX1NFUSB8ICAgICAgICAgICAgXAotICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX0NYRSB8ICAgICAgICAgICAgXAotICAgIEUxMDAwX1JYREVYVF9TVEFURVJSX1JYRSkKKwlFMTAwMF9SWERFWFRfU1RBVEVSUl9DRSAgfCBcCisJRTEwMDBfUlhERVhUX1NUQVRFUlJfU0UgIHwgXAorCUUxMDAwX1JYREVYVF9TVEFURVJSX1NFUSB8IFwKKwlFMTAwMF9SWERFWFRfU1RBVEVSUl9DWEUgfCBcCisJRTEwMDBfUlhERVhUX1NUQVRFUlJfUlhFKQogCiAvKiBEZXZpY2UgQ29udHJvbCAqLwotI2RlZmluZSBFMTAwMF9DVFJMX1JTVCAgICAgIDB4MDQwMDAwMDAgIC8qIEdsb2JhbCByZXNldCAqLworI2RlZmluZSBFMTAwMF9DVFJMX1JTVAkJMHgwNDAwMDAwMCAgLyogR2xvYmFsIHJlc2V0ICovCiAKIC8qIERldmljZSBTdGF0dXMgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZEICAgICAgICAgMHgwMDAwMDAwMSAgICAgIC8qIEZ1bGwgZHVwbGV4LjA9aGFsZiwxPWZ1bGwgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX0xVICAgICAgICAgMHgwMDAwMDAwMiAgICAgIC8qIExpbmsgdXAuMD1ubywxPWxpbmsgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX1RYT0ZGICAgICAgMHgwMDAwMDAxMCAgICAgIC8qIHRyYW5zbWlzc2lvbiBwYXVzZWQgKi8KLSNkZWZpbmUgRTEwMDBfU1RBVFVTX1NQRUVEXzEwICAgMHgwMDAwMDAwMCAgICAgIC8qIFNwZWVkIDEwTWIvcyAqLwotI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAwICAweDAwMDAwMDQwICAgICAgLyogU3BlZWQgMTAwTWIvcyAqLwotI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAwMCAweDAwMDAwMDgwICAgICAgLyogU3BlZWQgMTAwME1iL3MgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTX0ZECQkweDAwMDAwMDAxICAgICAgLyogRnVsbCBkdXBsZXguMD1oYWxmLDE9ZnVsbCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfTFUJCTB4MDAwMDAwMDIgICAgICAvKiBMaW5rIHVwLjA9bm8sMT1saW5rICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19UWE9GRgkweDAwMDAwMDEwICAgICAgLyogdHJhbnNtaXNzaW9uIHBhdXNlZCAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAJMHgwMDAwMDAwMCAgICAgIC8qIFNwZWVkIDEwTWIvcyAqLworI2RlZmluZSBFMTAwMF9TVEFUVVNfU1BFRURfMTAwCTB4MDAwMDAwNDAgICAgICAvKiBTcGVlZCAxMDBNYi9zICovCisjZGVmaW5lIEUxMDAwX1NUQVRVU19TUEVFRF8xMDAwCTB4MDAwMDAwODAgICAgICAvKiBTcGVlZCAxMDAwTWIvcyAqLwogCi0jZGVmaW5lIFNQRUVEXzEwICAgIDEwCi0jZGVmaW5lIFNQRUVEXzEwMCAgIDEwMAotI2RlZmluZSBTUEVFRF8xMDAwICAxMDAwCi0jZGVmaW5lIEhBTEZfRFVQTEVYIDEKLSNkZWZpbmUgRlVMTF9EVVBMRVggMgorI2RlZmluZSBTUEVFRF8xMAkxMAorI2RlZmluZSBTUEVFRF8xMDAJMTAwCisjZGVmaW5lIFNQRUVEXzEwMDAJMTAwMAorI2RlZmluZSBIQUxGX0RVUExFWAkxCisjZGVmaW5lIEZVTExfRFVQTEVYCTIKIAogLyogVHJhbnNtaXQgRGVzY3JpcHRvciBiaXQgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgRTEwMDBfVFhEX1BPUFRTX0lYU00gMHgwMSAgICAgICAvKiBJbnNlcnQgSVAgY2hlY2tzdW0gKi8KLSNkZWZpbmUgRTEwMDBfVFhEX1BPUFRTX1RYU00gMHgwMiAgICAgICAvKiBJbnNlcnQgVENQL1VEUCBjaGVja3N1bSAqLwotI2RlZmluZSBFMTAwMF9UWERfQ01EX0RFWFQgICAweDIwMDAwMDAwIC8qIERlc2NyaXB0b3IgZXh0ZW5zaW9uICgwID0gbGVnYWN5KSAqLwotI2RlZmluZSBFMTAwMF9UWERfU1RBVF9ERCAgICAweDAwMDAwMDAxIC8qIERlc2NyaXB0b3IgRG9uZSAqLworI2RlZmluZSBFMTAwMF9UWERfUE9QVFNfSVhTTQkweDAxICAgICAgIC8qIEluc2VydCBJUCBjaGVja3N1bSAqLworI2RlZmluZSBFMTAwMF9UWERfUE9QVFNfVFhTTQkweDAyICAgICAgIC8qIEluc2VydCBUQ1AvVURQIGNoZWNrc3VtICovCisjZGVmaW5lIEUxMDAwX1RYRF9DTURfREVYVAkweDIwMDAwMDAwIC8qIERlc2MgZXh0ZW5zaW9uICgwID0gbGVnYWN5KSAqLworI2RlZmluZSBFMTAwMF9UWERfU1RBVF9ERAkweDAwMDAwMDAxIC8qIERlc2MgRG9uZSAqLwogCi0jZGVmaW5lIE1BWF9KVU1CT19GUkFNRV9TSVpFICAgIDB4M0YwMAorI2RlZmluZSBNQVhfSlVNQk9fRlJBTUVfU0laRQkweDNGMDAKIAogLyogODAyLjFxIFZMQU4gUGFja2V0IFNpemUgKi8KLSNkZWZpbmUgVkxBTl9UQUdfU0laRSAgICAgICAgICAgICAgNCAgICAvKiA4MDIuM2FjIHRhZyAobm90IERNQSdkKSAqLworI2RlZmluZSBWTEFOX1RBR19TSVpFCQk0ICAgIC8qIDgwMi4zYWMgdGFnIChub3QgRE1BJ2QpICovCiAKIC8qIEVycm9yIENvZGVzICovCi0jZGVmaW5lIEUxMDAwX1NVQ0NFU1MgICAgICAwCi0jZGVmaW5lIEUxMDAwX0VSUl9DT05GSUcgICAzCi0jZGVmaW5lIEUxMDAwX0VSUl9NQUNfSU5JVCA1Ci0jZGVmaW5lIEUxMDAwX0VSUl9NQlggICAgICAxNQorI2RlZmluZSBFMTAwMF9TVUNDRVNTCQkwCisjZGVmaW5lIEUxMDAwX0VSUl9DT05GSUcJMworI2RlZmluZSBFMTAwMF9FUlJfTUFDX0lOSVQJNQorI2RlZmluZSBFMTAwMF9FUlJfTUJYCQkxNQogCiAvKiBTUlJDVEwgYml0IGRlZmluaXRpb25zICovCi0jZGVmaW5lIEUxMDAwX1NSUkNUTF9CU0laRVBLVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEwIC8qIFNoaWZ0IF9yaWdodF8gKi8KLSNkZWZpbmUgRTEwMDBfU1JSQ1RMX0JTSVpFSERSU0laRV9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwMEYwMAotI2RlZmluZSBFMTAwMF9TUlJDVExfQlNJWkVIRFJTSVpFX1NISUZUICAgICAgICAgICAgICAgICAyICAvKiBTaGlmdCBfbGVmdF8gKi8KLSNkZWZpbmUgRTEwMDBfU1JSQ1RMX0RFU0NUWVBFX0FEVl9PTkVCVUYgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAotI2RlZmluZSBFMTAwMF9TUlJDVExfREVTQ1RZUEVfSERSX1NQTElUX0FMV0FZUyAgICAgICAgICAweDBBMDAwMDAwCi0jZGVmaW5lIEUxMDAwX1NSUkNUTF9ERVNDVFlQRV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MEUwMDAwMDAKLSNkZWZpbmUgRTEwMDBfU1JSQ1RMX0RST1BfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBFMTAwMF9TUlJDVExfQlNJWkVQS1RfU0hJRlQJCTEwIC8qIFNoaWZ0IF9yaWdodF8gKi8KKyNkZWZpbmUgRTEwMDBfU1JSQ1RMX0JTSVpFSERSU0laRV9NQVNLCQkweDAwMDAwRjAwCisjZGVmaW5lIEUxMDAwX1NSUkNUTF9CU0laRUhEUlNJWkVfU0hJRlQJCTIgIC8qIFNoaWZ0IF9sZWZ0XyAqLworI2RlZmluZSBFMTAwMF9TUlJDVExfREVTQ1RZUEVfQURWX09ORUJVRgkweDAyMDAwMDAwCisjZGVmaW5lIEUxMDAwX1NSUkNUTF9ERVNDVFlQRV9IRFJfU1BMSVRfQUxXQVlTCTB4MEEwMDAwMDAKKyNkZWZpbmUgRTEwMDBfU1JSQ1RMX0RFU0NUWVBFX01BU0sJCTB4MEUwMDAwMDAKKyNkZWZpbmUgRTEwMDBfU1JSQ1RMX0RST1BfRU4JCQkweDgwMDAwMDAwCiAKLSNkZWZpbmUgRTEwMDBfU1JSQ1RMX0JTSVpFUEtUX01BU0sgICAgICAweDAwMDAwMDdGCi0jZGVmaW5lIEUxMDAwX1NSUkNUTF9CU0laRUhEUl9NQVNLICAgICAgMHgwMDAwM0YwMAorI2RlZmluZSBFMTAwMF9TUlJDVExfQlNJWkVQS1RfTUFTSwkweDAwMDAwMDdGCisjZGVmaW5lIEUxMDAwX1NSUkNUTF9CU0laRUhEUl9NQVNLCTB4MDAwMDNGMDAKIAogLyogQWRkaXRpb25hbCBEZXNjcmlwdG9yIENvbnRyb2wgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgRTEwMDBfVFhEQ1RMX1FVRVVFX0VOQUJMRSAgMHgwMjAwMDAwMCAvKiBFbmFibGUgc3BlY2lmaWMgVHggUXVldWUgKi8KLSNkZWZpbmUgRTEwMDBfUlhEQ1RMX1FVRVVFX0VOQUJMRSAgMHgwMjAwMDAwMCAvKiBFbmFibGUgc3BlY2lmaWMgUnggUXVldWUgKi8KKyNkZWZpbmUgRTEwMDBfVFhEQ1RMX1FVRVVFX0VOQUJMRQkweDAyMDAwMDAwIC8qIEVuYWJsZSBzcGVjaWZpYyBUeCBRdWUgKi8KKyNkZWZpbmUgRTEwMDBfUlhEQ1RMX1FVRVVFX0VOQUJMRQkweDAyMDAwMDAwIC8qIEVuYWJsZSBzcGVjaWZpYyBSeCBRdWUgKi8KIAogLyogRGlyZWN0IENhY2hlIEFjY2VzcyAoRENBKSBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBFMTAwMF9EQ0FfVFhDVFJMX1RYX1dCX1JPX0VOICgxIDw8IDExKSAvKiBUeCBEZXNjIHdyaXRlYmFjayBSTyBiaXQgKi8KKyNkZWZpbmUgRTEwMDBfRENBX1RYQ1RSTF9UWF9XQl9ST19FTgkoMSA8PCAxMSkgLyogVHggRGVzYyB3cml0ZWJhY2sgUk8gYml0ICovCiAKLSNkZWZpbmUgRTEwMDBfVkZfSU5JVF9USU1FT1VUIDIwMCAvKiBOdW1iZXIgb2YgcmV0cmllcyB0byBjbGVhciBSU1RJICovCisjZGVmaW5lIEUxMDAwX1ZGX0lOSVRfVElNRU9VVAkyMDAgLyogTnVtYmVyIG9mIHJldHJpZXMgdG8gY2xlYXIgUlNUSSAqLwogCiAjZW5kaWYgLyogX0UxMDAwX0RFRklORVNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL2V0aHRvb2wuYwppbmRleCAyMTc4Zjg3Li5jNjk5NmZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvZXRodG9vbC5jCkBAIC0xMyw4ICsxMyw3IEBACiAgIG1vcmUgZGV0YWlscy4KIAogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIAogICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgpAQCAtMzYsNyArMzUsNiBAQAogI2luY2x1ZGUgImlnYnZmLmgiCiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogCi0KIHN0cnVjdCBpZ2J2Zl9zdGF0cyB7CiAJY2hhciBzdGF0X3N0cmluZ1tFVEhfR1NUUklOR19MRU5dOwogCWludCBzaXplb2Zfc3RhdDsKQEAgLTc0LDcgKzcyLDcgQEAKICNkZWZpbmUgSUdCVkZfVEVTVF9MRU4gQVJSQVlfU0laRShpZ2J2Zl9nc3RyaW5nc190ZXN0KQogCiBzdGF0aWMgaW50IGlnYnZmX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQogewogCXN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtMTExLDE4ICsxMDksMTggQEAKIH0KIAogc3RhdGljIGludCBpZ2J2Zl9zZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NtZCAqZWNtZCkKIHsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKIHN0YXRpYyB2b2lkIGlnYnZmX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtICpwYXVzZSkKKwkJCQkgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCiB7CiB9CiAKIHN0YXRpYyBpbnQgaWdidmZfc2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCisJCQkJc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCiB7CiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQpAQCAtMTMwLDEyICsxMjgsMTQgQEAKIHN0YXRpYyB1MzIgaWdidmZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCiAJcmV0dXJuIGFkYXB0ZXItPm1zZ19lbmFibGU7CiB9CiAKIHN0YXRpYyB2b2lkIGlnYnZmX3NldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKIHsKIAlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKIAlhZGFwdGVyLT5tc2dfZW5hYmxlID0gZGF0YTsKIH0KIApAQCAtMTQ2LDcgKzE0Niw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGlnYnZmX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLCB2b2lkICpwKQorCQkJICAgc3RydWN0IGV0aHRvb2xfcmVncyAqcmVncywgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKQEAgLTE3NSwxOSArMTc1LDE5IEBACiB9CiAKIHN0YXRpYyBpbnQgaWdidmZfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqYnl0ZXMpCisJCQkgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpieXRlcykKIHsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKIHN0YXRpYyBpbnQgaWdidmZfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqYnl0ZXMpCisJCQkgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZXByb20sIHU4ICpieXRlcykKIHsKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKIHN0YXRpYyB2b2lkIGlnYnZmX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKIHsKIAlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKQEAgLTIwMSw3ICsyMDEsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpZ2J2Zl9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKKwkJCQlzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCiB7CiAJc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpZ2J2Zl9yaW5nICp0eF9yaW5nID0gYWRhcHRlci0+dHhfcmluZzsKQEAgLTIxNCw3ICsyMTQsNyBAQAogfQogCiBzdGF0aWMgaW50IGlnYnZmX3NldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9yaW5ncGFyYW0gKnJpbmcpCisJCQkgICAgICAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQogewogCXN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaWdidmZfcmluZyAqdGVtcF9yaW5nOwpAQCAtMjI0LDEyICsyMjQsMTIgQEAKIAlpZiAoKHJpbmctPnJ4X21pbmlfcGVuZGluZykgfHwgKHJpbmctPnJ4X2p1bWJvX3BlbmRpbmcpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW5ld19yeF9jb3VudCA9IG1heChyaW5nLT5yeF9wZW5kaW5nLCAodTMyKUlHQlZGX01JTl9SWEQpOwotCW5ld19yeF9jb3VudCA9IG1pbihuZXdfcnhfY291bnQsICh1MzIpSUdCVkZfTUFYX1JYRCk7CisJbmV3X3J4X2NvdW50ID0gbWF4X3QodTMyLCByaW5nLT5yeF9wZW5kaW5nLCBJR0JWRl9NSU5fUlhEKTsKKwluZXdfcnhfY291bnQgPSBtaW5fdCh1MzIsIG5ld19yeF9jb3VudCwgSUdCVkZfTUFYX1JYRCk7CiAJbmV3X3J4X2NvdW50ID0gQUxJR04obmV3X3J4X2NvdW50LCBSRVFfUlhfREVTQ1JJUFRPUl9NVUxUSVBMRSk7CiAKLQluZXdfdHhfY291bnQgPSBtYXgocmluZy0+dHhfcGVuZGluZywgKHUzMilJR0JWRl9NSU5fVFhEKTsKLQluZXdfdHhfY291bnQgPSBtaW4obmV3X3R4X2NvdW50LCAodTMyKUlHQlZGX01BWF9UWEQpOworCW5ld190eF9jb3VudCA9IG1heF90KHUzMiwgcmluZy0+dHhfcGVuZGluZywgSUdCVkZfTUlOX1RYRCk7CisJbmV3X3R4X2NvdW50ID0gbWluX3QodTMyLCBuZXdfdHhfY291bnQsIElHQlZGX01BWF9UWEQpOwogCW5ld190eF9jb3VudCA9IEFMSUdOKG5ld190eF9jb3VudCwgUkVRX1RYX0RFU0NSSVBUT1JfTVVMVElQTEUpOwogCiAJaWYgKChuZXdfdHhfY291bnQgPT0gYWRhcHRlci0+dHhfcmluZy0+Y291bnQpICYmCkBAIC0yMzksNyArMjM5LDcgQEAKIAl9CiAKIAl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChfX0lHQlZGX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKLQkJbXNsZWVwKDEpOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CiAKIAlpZiAoIW5ldGlmX3J1bm5pbmcoYWRhcHRlci0+bmV0ZGV2KSkgewogCQlhZGFwdGVyLT50eF9yaW5nLT5jb3VudCA9IG5ld190eF9jb3VudDsKQEAgLTI1NSwxMCArMjU1LDkgQEAKIAogCWlnYnZmX2Rvd24oYWRhcHRlcik7CiAKLQkvKgotCSAqIFdlIGNhbid0IGp1c3QgZnJlZSBldmVyeXRoaW5nIGFuZCB0aGVuIHNldHVwIGFnYWluLAorCS8qIFdlIGNhbid0IGp1c3QgZnJlZSBldmVyeXRoaW5nIGFuZCB0aGVuIHNldHVwIGFnYWluLAogCSAqIGJlY2F1c2UgdGhlIElTUnMgaW4gTVNJLVggbW9kZSBnZXQgcGFzc2VkIHBvaW50ZXJzCi0JICogdG8gdGhlIHR4IGFuZCByeCByaW5nIHN0cnVjdHMuCisJICogdG8gdGhlIFR4IGFuZCBSeCByaW5nIHN0cnVjdHMuCiAJICovCiAJaWYgKG5ld190eF9jb3VudCAhPSBhZGFwdGVyLT50eF9yaW5nLT5jb3VudCkgewogCQltZW1jcHkodGVtcF9yaW5nLCBhZGFwdGVyLT50eF9yaW5nLCBzaXplb2Yoc3RydWN0IGlnYnZmX3JpbmcpKTsKQEAgLTI4Myw3ICsyODIsNyBAQAogCiAJCWlnYnZmX2ZyZWVfcnhfcmVzb3VyY2VzKGFkYXB0ZXItPnJ4X3JpbmcpOwogCi0JCW1lbWNweShhZGFwdGVyLT5yeF9yaW5nLCB0ZW1wX3Jpbmcsc2l6ZW9mKHN0cnVjdCBpZ2J2Zl9yaW5nKSk7CisJCW1lbWNweShhZGFwdGVyLT5yeF9yaW5nLCB0ZW1wX3JpbmcsIHNpemVvZihzdHJ1Y3QgaWdidmZfcmluZykpOwogCX0KIGVycl9zZXR1cDoKIAlpZ2J2Zl91cChhZGFwdGVyKTsKQEAgLTMwNywxNCArMzA2LDEzIEBACiB9CiAKIHN0YXRpYyB2b2lkIGlnYnZmX2RpYWdfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3Rlc3QgKmV0aF90ZXN0LCB1NjQgKmRhdGEpCisJCQkgICAgc3RydWN0IGV0aHRvb2xfdGVzdCAqZXRoX3Rlc3QsIHU2NCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlzZXRfYml0KF9fSUdCVkZfVEVTVElORywgJmFkYXB0ZXItPnN0YXRlKTsKIAotCS8qCi0JICogTGluayB0ZXN0IHBlcmZvcm1lZCBiZWZvcmUgaGFyZHdhcmUgcmVzZXQgc28gYXV0b25lZyBkb2Vzbid0CisJLyogTGluayB0ZXN0IHBlcmZvcm1lZCBiZWZvcmUgaGFyZHdhcmUgcmVzZXQgc28gYXV0b25lZyBkb2Vzbid0CiAJICogaW50ZXJmZXJlIHdpdGggdGVzdCByZXN1bHQKIAkgKi8KIAlpZiAoaWdidmZfbGlua190ZXN0KGFkYXB0ZXIsICZkYXRhWzBdKSkKQEAgLTMyNSwyMCArMzIzLDIwIEBACiB9CiAKIHN0YXRpYyB2b2lkIGlnYnZmX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQorCQkJICBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCiB7CiAJd29sLT5zdXBwb3J0ZWQgPSAwOwogCXdvbC0+d29sb3B0cyA9IDA7CiB9CiAKIHN0YXRpYyBpbnQgaWdidmZfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKKwkJCSBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCiB7CiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCiBzdGF0aWMgaW50IGlnYnZmX2dldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmVjKQogewogCXN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApAQCAtMzUxLDEzICszNDksMTMgQEAKIH0KIAogc3RhdGljIGludCBpZ2J2Zl9zZXRfY29hbGVzY2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKKwkJCSAgICAgIHN0cnVjdCBldGh0b29sX2NvYWxlc2NlICplYykKIHsKIAlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAogCWlmICgoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID49IElHQlZGX01JTl9JVFJfVVNFQ1MpICYmCi0JICAgICAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzIDw9IElHQlZGX01BWF9JVFJfVVNFQ1MpKSB7CisJICAgIChlYy0+cnhfY29hbGVzY2VfdXNlY3MgPD0gSUdCVkZfTUFYX0lUUl9VU0VDUykpIHsKIAkJYWRhcHRlci0+Y3VycmVudF9pdHIgPSBlYy0+cnhfY29hbGVzY2VfdXNlY3MgPDwgMjsKIAkJYWRhcHRlci0+cmVxdWVzdGVkX2l0ciA9IDEwMDAwMDAwMDAgLwogCQkJCQkoYWRhcHRlci0+Y3VycmVudF9pdHIgKiAyNTYpOwpAQCAtMzY2LDggKzM2NCw3IEBACiAJCWFkYXB0ZXItPmN1cnJlbnRfaXRyID0gSUdCVkZfU1RBUlRfSVRSOwogCQlhZGFwdGVyLT5yZXF1ZXN0ZWRfaXRyID0gZWMtPnJ4X2NvYWxlc2NlX3VzZWNzOwogCX0gZWxzZSBpZiAoZWMtPnJ4X2NvYWxlc2NlX3VzZWNzID09IDApIHsKLQkJLyoKLQkJICogVGhlIHVzZXIncyBkZXNpcmUgaXMgdG8gdHVybiBvZmYgaW50ZXJydXB0IHRocm90dGxpbmcKKwkJLyogVGhlIHVzZXIncyBkZXNpcmUgaXMgdG8gdHVybiBvZmYgaW50ZXJydXB0IHRocm90dGxpbmcKIAkJICogYWx0b2dldGhlciwgYnV0IGR1ZSB0byBIVyBsaW1pdGF0aW9ucywgd2UgY2FuJ3QgZG8gdGhhdC4KIAkJICogSW5zdGVhZCB3ZSBzZXQgYSB2ZXJ5IHNtYWxsIHZhbHVlIGluIEVJVFIsIHdoaWNoIHdvdWxkCiAJCSAqIGFsbG93IH45NjdrIGludGVycnVwdHMgcGVyIHNlY29uZCwgYnV0IGFsbG93IHRoZSBhZGFwdGVyJ3MKQEAgLTM3Niw4ICszNzMsOSBAQAogCQlhZGFwdGVyLT5jdXJyZW50X2l0ciA9IDQ7CiAJCWFkYXB0ZXItPnJlcXVlc3RlZF9pdHIgPSAxMDAwMDAwMDAwIC8KIAkJCQkJKGFkYXB0ZXItPmN1cnJlbnRfaXRyICogMjU2KTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAl3cml0ZWwoYWRhcHRlci0+Y3VycmVudF9pdHIsCiAJICAgICAgIGh3LT5od19hZGRyICsgYWRhcHRlci0+cnhfcmluZy0+aXRyX3JlZ2lzdGVyKTsKQEAgLTM4OCwxNSArMzg2LDE1IEBACiBzdGF0aWMgaW50IGlnYnZmX253YXlfcmVzZXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKIAlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKIAlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQogCQlpZ2J2Zl9yZWluaXRfbG9ja2VkKGFkYXB0ZXIpOwogCXJldHVybiAwOwogfQogCi0KIHN0YXRpYyB2b2lkIGlnYnZmX2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqc3RhdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1NjQgKmRhdGEpCisJCQkJICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywKKwkJCQkgICAgdTY0ICpkYXRhKQogewogCXN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgaTsKQEAgLTQwNCwxOSArNDAyLDE4IEBACiAJaWdidmZfdXBkYXRlX3N0YXRzKGFkYXB0ZXIpOwogCWZvciAoaSA9IDA7IGkgPCBJR0JWRl9HTE9CQUxfU1RBVFNfTEVOOyBpKyspIHsKIAkJY2hhciAqcCA9IChjaGFyICopYWRhcHRlciArCi0JCSAgICAgICAgICBpZ2J2Zl9nc3RyaW5nc19zdGF0c1tpXS5zdGF0X29mZnNldDsKKwkJCSAgaWdidmZfZ3N0cmluZ3Nfc3RhdHNbaV0uc3RhdF9vZmZzZXQ7CiAJCWNoYXIgKmIgPSAoY2hhciAqKWFkYXB0ZXIgKwotCQkgICAgICAgICAgaWdidmZfZ3N0cmluZ3Nfc3RhdHNbaV0uYmFzZV9zdGF0X29mZnNldDsKKwkJCSAgaWdidmZfZ3N0cmluZ3Nfc3RhdHNbaV0uYmFzZV9zdGF0X29mZnNldDsKIAkJZGF0YVtpXSA9ICgoaWdidmZfZ3N0cmluZ3Nfc3RhdHNbaV0uc2l6ZW9mX3N0YXQgPT0KLQkJICAgICAgICAgICAgc2l6ZW9mKHU2NCkpID8gKCoodTY0ICopcCAtICoodTY0ICopYikgOgotCQkgICAgICAgICAgICAoKih1MzIgKilwIC0gKih1MzIgKiliKSk7CisJCQkgICAgc2l6ZW9mKHU2NCkpID8gKCoodTY0ICopcCAtICoodTY0ICopYikgOgorCQkJICAgICgqKHUzMiAqKXAgLSAqKHUzMiAqKWIpKTsKIAl9Ci0KIH0KIAogc3RhdGljIGludCBpZ2J2Zl9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RyaW5nc2V0KQogewotCXN3aXRjaChzdHJpbmdzZXQpIHsKKwlzd2l0Y2ggKHN0cmluZ3NldCkgewogCWNhc2UgRVRIX1NTX1RFU1Q6CiAJCXJldHVybiBJR0JWRl9URVNUX0xFTjsKIAljYXNlIEVUSF9TU19TVEFUUzoKQEAgLTQyNyw3ICs0MjQsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBpZ2J2Zl9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgc3RyaW5nc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTggKmRhdGEpCisJCQkgICAgICB1OCAqZGF0YSkKIHsKIAl1OCAqcCA9IGRhdGE7CiAJaW50IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9pZ2J2Zi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvaWdidmYuaAppbmRleCA3ZDZhMjVjLi5mMTY2YmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9pZ2J2Zi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL2lnYnZmLmgKQEAgLTEzLDggKzEzLDcgQEAKICAgbW9yZSBkZXRhaWxzLgogCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogCiAgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCiAgIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCkBAIC00MywxMCArNDIsMTAgQEAKIHN0cnVjdCBpZ2J2Zl9hZGFwdGVyOwogCiAvKiBJbnRlcnJ1cHQgZGVmaW5lcyAqLwotI2RlZmluZSBJR0JWRl9TVEFSVF9JVFIgICAgICAgICAgICAgICAgICAgIDQ4OCAvKiB+ODAwMCBpbnRzL3NlYyAqLwotI2RlZmluZSBJR0JWRl80S19JVFIgICAgICAgICAgICAgICAgICAgICAgIDk4MAotI2RlZmluZSBJR0JWRl8yMEtfSVRSICAgICAgICAgICAgICAgICAgICAgIDE5NgotI2RlZmluZSBJR0JWRl83MEtfSVRSICAgICAgICAgICAgICAgICAgICAgICA1NgorI2RlZmluZSBJR0JWRl9TVEFSVF9JVFIJCTQ4OCAvKiB+ODAwMCBpbnRzL3NlYyAqLworI2RlZmluZSBJR0JWRl80S19JVFIJCTk4MAorI2RlZmluZSBJR0JWRl8yMEtfSVRSCQkxOTYKKyNkZWZpbmUgSUdCVkZfNzBLX0lUUgkJNTYKIAogZW51bSBsYXRlbmN5X3JhbmdlIHsKIAlsb3dlc3RfbGF0ZW5jeSA9IDAsCkBAIC01NSw1NiArNTQsNTUgQEAKIAlsYXRlbmN5X2ludmFsaWQgPSAyNTUKIH07CiAKLQogLyogSW50ZXJydXB0IG1vZGVzLCBhcyB1c2VkIGJ5IHRoZSBJbnRNb2RlIHBhcmFtZXRlciAqLwotI2RlZmluZSBJR0JWRl9JTlRfTU9ERV9MRUdBQ1kgICAgICAgICAgIDAKLSNkZWZpbmUgSUdCVkZfSU5UX01PREVfTVNJICAgICAgICAgICAgICAxCi0jZGVmaW5lIElHQlZGX0lOVF9NT0RFX01TSVggICAgICAgICAgICAgMgorI2RlZmluZSBJR0JWRl9JTlRfTU9ERV9MRUdBQ1kJMAorI2RlZmluZSBJR0JWRl9JTlRfTU9ERV9NU0kJMQorI2RlZmluZSBJR0JWRl9JTlRfTU9ERV9NU0lYCTIKIAogLyogVHgvUnggZGVzY3JpcHRvciBkZWZpbmVzICovCi0jZGVmaW5lIElHQlZGX0RFRkFVTFRfVFhEICAgICAgICAgICAgICAgMjU2Ci0jZGVmaW5lIElHQlZGX01BWF9UWEQgICAgICAgICAgICAgICAgICAgNDA5NgotI2RlZmluZSBJR0JWRl9NSU5fVFhEICAgICAgICAgICAgICAgICAgIDgwCisjZGVmaW5lIElHQlZGX0RFRkFVTFRfVFhECTI1NgorI2RlZmluZSBJR0JWRl9NQVhfVFhECQk0MDk2CisjZGVmaW5lIElHQlZGX01JTl9UWEQJCTgwCiAKLSNkZWZpbmUgSUdCVkZfREVGQVVMVF9SWEQgICAgICAgICAgICAgICAyNTYKLSNkZWZpbmUgSUdCVkZfTUFYX1JYRCAgICAgICAgICAgICAgICAgICA0MDk2Ci0jZGVmaW5lIElHQlZGX01JTl9SWEQgICAgICAgICAgICAgICAgICAgODAKKyNkZWZpbmUgSUdCVkZfREVGQVVMVF9SWEQJMjU2CisjZGVmaW5lIElHQlZGX01BWF9SWEQJCTQwOTYKKyNkZWZpbmUgSUdCVkZfTUlOX1JYRAkJODAKIAotI2RlZmluZSBJR0JWRl9NSU5fSVRSX1VTRUNTICAgICAgICAgICAgIDEwIC8qIDEwMDAwMCBpcnEvc2VjICovCi0jZGVmaW5lIElHQlZGX01BWF9JVFJfVVNFQ1MgICAgICAgICAgICAgMTAwMDAgLyogMTAwICAgIGlycS9zZWMgKi8KKyNkZWZpbmUgSUdCVkZfTUlOX0lUUl9VU0VDUwkxMCAvKiAxMDAwMDAgaXJxL3NlYyAqLworI2RlZmluZSBJR0JWRl9NQVhfSVRSX1VTRUNTCTEwMDAwIC8qIDEwMCAgICBpcnEvc2VjICovCiAKIC8qIFJYIGRlc2NyaXB0b3IgY29udHJvbCB0aHJlc2hvbGRzLgogICogUFRIUkVTSCAtIE1BQyB3aWxsIGNvbnNpZGVyIHByZWZldGNoIGlmIGl0IGhhcyBmZXdlciB0aGFuIHRoaXMgbnVtYmVyIG9mCi0gKiAgICAgICAgICAgZGVzY3JpcHRvcnMgYXZhaWxhYmxlIGluIGl0cyBvbmJvYXJkIG1lbW9yeS4KLSAqICAgICAgICAgICBTZXR0aW5nIHRoaXMgdG8gMCBkaXNhYmxlcyBSWCBkZXNjcmlwdG9yIHByZWZldGNoLgorICoJICAgZGVzY3JpcHRvcnMgYXZhaWxhYmxlIGluIGl0cyBvbmJvYXJkIG1lbW9yeS4KKyAqCSAgIFNldHRpbmcgdGhpcyB0byAwIGRpc2FibGVzIFJYIGRlc2NyaXB0b3IgcHJlZmV0Y2guCiAgKiBIVEhSRVNIIC0gTUFDIHdpbGwgb25seSBwcmVmZXRjaCBpZiB0aGVyZSBhcmUgYXQgbGVhc3QgdGhpcyBtYW55IGRlc2NyaXB0b3JzCi0gKiAgICAgICAgICAgYXZhaWxhYmxlIGluIGhvc3QgbWVtb3J5LgotICogICAgICAgICAgIElmIFBUSFJFU0ggaXMgMCwgdGhpcyBzaG91bGQgYWxzbyBiZSAwLgorICoJICAgYXZhaWxhYmxlIGluIGhvc3QgbWVtb3J5LgorICoJICAgSWYgUFRIUkVTSCBpcyAwLCB0aGlzIHNob3VsZCBhbHNvIGJlIDAuCiAgKiBXVEhSRVNIIC0gUlggZGVzY3JpcHRvciB3cml0ZWJhY2sgdGhyZXNob2xkIC0gTUFDIHdpbGwgZGVsYXkgd3JpdGluZyBiYWNrCi0gKiAgICAgICAgICAgZGVzY3JpcHRvcnMgdW50aWwgZWl0aGVyIGl0IGhhcyB0aGlzIG1hbnkgdG8gd3JpdGUgYmFjaywgb3IgdGhlCi0gKiAgICAgICAgICAgSVRSIHRpbWVyIGV4cGlyZXMuCisgKgkgICBkZXNjcmlwdG9ycyB1bnRpbCBlaXRoZXIgaXQgaGFzIHRoaXMgbWFueSB0byB3cml0ZSBiYWNrLCBvciB0aGUKKyAqCSAgIElUUiB0aW1lciBleHBpcmVzLgogICovCi0jZGVmaW5lIElHQlZGX1JYX1BUSFJFU0ggICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgSUdCVkZfUlhfSFRIUkVTSCAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIElHQlZGX1JYX1dUSFJFU0ggICAgICAgICAgICAgICAgMQorI2RlZmluZSBJR0JWRl9SWF9QVEhSRVNICTE2CisjZGVmaW5lIElHQlZGX1JYX0hUSFJFU0gJOAorI2RlZmluZSBJR0JWRl9SWF9XVEhSRVNICTEKIAogLyogdGhpcyBpcyB0aGUgc2l6ZSBwYXN0IHdoaWNoIGhhcmR3YXJlIHdpbGwgZHJvcCBwYWNrZXRzIHdoZW4gc2V0dGluZyBMUEU9MCAqLwotI2RlZmluZSBNQVhJTVVNX0VUSEVSTkVUX1ZMQU5fU0laRSAgICAgIDE1MjIKKyNkZWZpbmUgTUFYSU1VTV9FVEhFUk5FVF9WTEFOX1NJWkUJMTUyMgogCi0jZGVmaW5lIElHQlZGX0ZDX1BBVVNFX1RJTUUgICAgICAgICAgICAgMHgwNjgwIC8qIDg1OCB1c2VjICovCisjZGVmaW5lIElHQlZGX0ZDX1BBVVNFX1RJTUUJMHgwNjgwIC8qIDg1OCB1c2VjICovCiAKIC8qIEhvdyBtYW55IFR4IERlc2NyaXB0b3JzIGRvIHdlIG5lZWQgdG8gY2FsbCBuZXRpZl93YWtlX3F1ZXVlID8gKi8KLSNkZWZpbmUgSUdCVkZfVFhfUVVFVUVfV0FLRSAgICAgICAgICAgICAzMgorI2RlZmluZSBJR0JWRl9UWF9RVUVVRV9XQUtFCTMyCiAvKiBIb3cgbWFueSBSeCBCdWZmZXJzIGRvIHdlIGJ1bmRsZSBpbnRvIG9uZSB3cml0ZSB0byB0aGUgaGFyZHdhcmUgPyAqLwotI2RlZmluZSBJR0JWRl9SWF9CVUZGRVJfV1JJVEUgICAgICAgICAgIDE2IC8qIE11c3QgYmUgcG93ZXIgb2YgMiAqLworI2RlZmluZSBJR0JWRl9SWF9CVUZGRVJfV1JJVEUJMTYgLyogTXVzdCBiZSBwb3dlciBvZiAyICovCiAKLSNkZWZpbmUgQVVUT19BTExfTU9ERVMgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIElHQlZGX0VFUFJPTV9BUE1FICAgICAgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIEFVVE9fQUxMX01PREVTCQkwCisjZGVmaW5lIElHQlZGX0VFUFJPTV9BUE1FCTB4MDQwMAogCi0jZGVmaW5lIElHQlZGX01OR19WTEFOX05PTkUgICAgICAgICAgICAgKC0xKQorI2RlZmluZSBJR0JWRl9NTkdfVkxBTl9OT05FCSgtMSkKIAogLyogTnVtYmVyIG9mIHBhY2tldCBzcGxpdCBkYXRhIGJ1ZmZlcnMgKG5vdCBpbmNsdWRpbmcgdGhlIGhlYWRlciBidWZmZXIpICovCi0jZGVmaW5lIFBTX1BBR0VfQlVGRkVSUyAgICAgICAgICAgICAgICAgKE1BWF9QU19CVUZGRVJTIC0gMSkKKyNkZWZpbmUgUFNfUEFHRV9CVUZGRVJTCQkoTUFYX1BTX0JVRkZFUlMgLSAxKQogCiBlbnVtIGlnYnZmX2JvYXJkcyB7CiAJYm9hcmRfdmYsCkBAIC0xMTYsOCArMTE0LDcgQEAKIAl1NjQgYnl0ZXM7CiB9OwogCi0vKgotICogd3JhcHBlcnMgYXJvdW5kIGEgcG9pbnRlciB0byBhIHNvY2tldCBidWZmZXIsCisvKiB3cmFwcGVycyBhcm91bmQgYSBwb2ludGVyIHRvIGEgc29ja2V0IGJ1ZmZlciwKICAqIHNvIGEgRE1BIGhhbmRsZSBjYW4gYmUgc3RvcmVkIGFsb25nIHdpdGggdGhlIGJ1ZmZlcgogICovCiBzdHJ1Y3QgaWdidmZfYnVmZmVyIHsKQEAgLTE0OCwxMCArMTQ1LDEwIEBACiAKIHN0cnVjdCBpZ2J2Zl9yaW5nIHsKIAlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlcjsgIC8qIGJhY2tsaW5rICovCi0JdW5pb24gaWdidmZfZGVzYyAqZGVzYzsgICAgICAgICAvKiBwb2ludGVyIHRvIHJpbmcgbWVtb3J5ICAqLwotCWRtYV9hZGRyX3QgZG1hOyAgICAgICAgICAgICAgICAgLyogcGh5cyBhZGRyZXNzIG9mIHJpbmcgICAgKi8KLQl1bnNpZ25lZCBpbnQgc2l6ZTsgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiByaW5nIGluIGJ5dGVzICovCi0JdW5zaWduZWQgaW50IGNvdW50OyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGVzYy4gaW4gcmluZyAqLworCXVuaW9uIGlnYnZmX2Rlc2MgKmRlc2M7CS8qIHBvaW50ZXIgdG8gcmluZyBtZW1vcnkgICovCisJZG1hX2FkZHJfdCBkbWE7CQkvKiBwaHlzIGFkZHJlc3Mgb2YgcmluZyAgICAqLworCXVuc2lnbmVkIGludCBzaXplOwkvKiBsZW5ndGggb2YgcmluZyBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBjb3VudDsJLyogbnVtYmVyIG9mIGRlc2MuIGluIHJpbmcgKi8KIAogCXUxNiBuZXh0X3RvX3VzZTsKIAl1MTYgbmV4dF90b19jbGVhbjsKQEAgLTIwMiw5ICsxOTksNyBAQAogCXUzMiByZXF1ZXN0ZWRfaXRyOyAvKiBpbnRzL3NlYyBvciBhZGFwdGl2ZSAqLwogCXUzMiBjdXJyZW50X2l0cjsgLyogQWN0dWFsIElUUiByZWdpc3RlciB2YWx1ZSwgbm90IGludHMvc2VjICovCiAKLQkvKgotCSAqIFR4Ci0JICovCisJLyogVHggKi8KIAlzdHJ1Y3QgaWdidmZfcmluZyAqdHhfcmluZyAvKiBPbmUgcGVyIGFjdGl2ZSBxdWV1ZSAqLwogCV9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiAKQEAgLTIyNiw5ICsyMjEsNyBAQAogCXUzMiB0eF9maWZvX3NpemU7CiAJdTMyIHR4X2RtYV9mYWlsZWQ7CiAKLQkvKgotCSAqIFJ4Ci0JICovCisJLyogUnggKi8KIAlzdHJ1Y3QgaWdidmZfcmluZyAqcnhfcmluZzsKIAogCXUzMiByeF9pbnRfZGVsYXk7CkBAIC0yNDksNyArMjQyLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKLQlzcGlubG9ja190IHN0YXRzX2xvY2s7ICAgICAgLyogcHJldmVudCBjb25jdXJyZW50IHN0YXRzIHVwZGF0ZXMgKi8KKwlzcGlubG9ja190IHN0YXRzX2xvY2s7IC8qIHByZXZlbnQgY29uY3VycmVudCBzdGF0cyB1cGRhdGVzICovCiAKIAkvKiBzdHJ1Y3RzIGRlZmluZWQgaW4gZTEwMDBfaHcuaCAqLwogCXN0cnVjdCBlMTAwMF9odyBodzsKQEAgLTI4NiwxNiArMjc5LDE2IEBACiB9OwogCiBzdHJ1Y3QgaWdidmZfaW5mbyB7Ci0JZW51bSBlMTAwMF9tYWNfdHlwZSAgICAgbWFjOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIGZsYWdzOwotCXUzMiAgICAgICAgICAgICAgICAgICAgIHBiYTsKLQl2b2lkICAgICAgICAgICAgICAgICAgICAoKmluaXRfb3BzKShzdHJ1Y3QgZTEwMDBfaHcgKik7Ci0JczMyICAgICAgICAgICAgICAgICAgICAgKCpnZXRfdmFyaWFudHMpKHN0cnVjdCBpZ2J2Zl9hZGFwdGVyICopOworCWVudW0gZTEwMDBfbWFjX3R5cGUJbWFjOworCXVuc2lnbmVkIGludAkJZmxhZ3M7CisJdTMyCQkJcGJhOworCXZvaWQJCQkoKmluaXRfb3BzKShzdHJ1Y3QgZTEwMDBfaHcgKik7CisJczMyCQkJKCpnZXRfdmFyaWFudHMpKHN0cnVjdCBpZ2J2Zl9hZGFwdGVyICopOwogfTsKIAogLyogaGFyZHdhcmUgY2FwYWJpbGl0eSwgZmVhdHVyZSwgYW5kIHdvcmthcm91bmQgZmxhZ3MgKi8KLSNkZWZpbmUgSUdCVkZfRkxBR19SWF9DU1VNX0RJU0FCTEVEICAgICAgICAgICAgICgxIDw8IDApCi0jZGVmaW5lIElHQlZGX0ZMQUdfUlhfTEJfVkxBTl9CU1dBUAkJKDEgPDwgMSkKKyNkZWZpbmUgSUdCVkZfRkxBR19SWF9DU1VNX0RJU0FCTEVECSgxIDw8IDApCisjZGVmaW5lIElHQlZGX0ZMQUdfUlhfTEJfVkxBTl9CU1dBUAkoMSA8PCAxKQogI2RlZmluZSBJR0JWRl9SWF9ERVNDX0FEVihSLCBpKSAgICAgXAogCSgmKCgoKFIpLmRlc2MpKVtpXS5yeF9kZXNjKSkKICNkZWZpbmUgSUdCVkZfVFhfREVTQ19BRFYoUiwgaSkgICAgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL21ieC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvbWJ4LmMKaW5kZXggYjRiNjViYy4uN2I2Y2I0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvbWJ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvbWJ4LmMKQEAgLTEzLDggKzEzLDcgQEAKICAgbW9yZSBkZXRhaWxzLgogCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogCiAgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCiAgIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCkBAIC01NCwxMCArNTMsMTAgQEAKIH0KIAogLyoqCi0gKiAgZTEwMDBfcG9sbF9mb3JfYWNrIC0gV2FpdCBmb3IgbWVzc2FnZSBhY2tub3dsZWRnZW1lbnQKKyAqICBlMTAwMF9wb2xsX2Zvcl9hY2sgLSBXYWl0IGZvciBtZXNzYWdlIGFja25vd2xlZGdtZW50CiAgKiAgQGh3OiBwb2ludGVyIHRvIHRoZSBIVyBzdHJ1Y3R1cmUKICAqCi0gKiAgcmV0dXJucyBTVUNDRVNTIGlmIGl0IHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBhIG1lc3NhZ2UgYWNrbm93bGVkZ2VtZW50CisgKiAgcmV0dXJucyBTVUNDRVNTIGlmIGl0IHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBhIG1lc3NhZ2UgYWNrbm93bGVkZ21lbnQKICAqKi8KIHN0YXRpYyBzMzIgZTEwMDBfcG9sbF9mb3JfYWNrKHN0cnVjdCBlMTAwMF9odyAqaHcpCiB7CkBAIC0yMTgsNyArMjE3LDcgQEAKIAlzMzIgcmV0X3ZhbCA9IC1FMTAwMF9FUlJfTUJYOwogCiAJaWYgKCFlMTAwMF9jaGVja19mb3JfYml0X3ZmKGh3LCAoRTEwMDBfVjJQTUFJTEJPWF9SU1REIHwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFMTAwMF9WMlBNQUlMQk9YX1JTVEkpKSkgeworCQkJCQkgRTEwMDBfVjJQTUFJTEJPWF9SU1RJKSkpIHsKIAkJcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CiAJCWh3LT5tYnguc3RhdHMucnN0cysrOwogCX0KQEAgLTIzOSw3ICsyMzgsNyBAQAogCS8qIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBidWZmZXIgKi8KIAlldzMyKFYyUE1BSUxCT1goMCksIEUxMDAwX1YyUE1BSUxCT1hfVkZVKTsKIAotCS8qIHJlc2VydmUgbWFpbGJveCBmb3IgdmYgdXNlICovCisJLyogcmVzZXJ2ZSBtYWlsYm94IGZvciBWRiB1c2UgKi8KIAlpZiAoZTEwMDBfcmVhZF92MnBfbWFpbGJveChodykgJiBFMTAwMF9WMlBNQUlMQk9YX1ZGVSkKIAkJcmV0X3ZhbCA9IEUxMDAwX1NVQ0NFU1M7CiAKQEAgLTI4Myw3ICsyODIsNyBAQAogfQogCiAvKioKLSAqICBlMTAwMF9yZWFkX21ieF92ZiAtIFJlYWRzIGEgbWVzc2FnZSBmcm9tIHRoZSBpbmJveCBpbnRlbmRlZCBmb3IgdmYKKyAqICBlMTAwMF9yZWFkX21ieF92ZiAtIFJlYWRzIGEgbWVzc2FnZSBmcm9tIHRoZSBpbmJveCBpbnRlbmRlZCBmb3IgVkYKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBtc2c6IFRoZSBtZXNzYWdlIGJ1ZmZlcgogICogIEBzaXplOiBMZW5ndGggb2YgYnVmZmVyCkBAIC0zMTUsMTcgKzMxNCwxOCBAQAogfQogCiAvKioKLSAqICBlMTAwMF9pbml0X21ieF9wYXJhbXNfdmYgLSBzZXQgaW5pdGlhbCB2YWx1ZXMgZm9yIHZmIG1haWxib3gKKyAqICBlMTAwMF9pbml0X21ieF9wYXJhbXNfdmYgLSBzZXQgaW5pdGlhbCB2YWx1ZXMgZm9yIFZGIG1haWxib3gKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICoKLSAqICBJbml0aWFsaXplcyB0aGUgaHctPm1ieCBzdHJ1Y3QgdG8gY29ycmVjdCB2YWx1ZXMgZm9yIHZmIG1haWxib3gKKyAqICBJbml0aWFsaXplcyB0aGUgaHctPm1ieCBzdHJ1Y3QgdG8gY29ycmVjdCB2YWx1ZXMgZm9yIFZGIG1haWxib3gKICAqLwogczMyIGUxMDAwX2luaXRfbWJ4X3BhcmFtc192ZihzdHJ1Y3QgZTEwMDBfaHcgKmh3KQogewogCXN0cnVjdCBlMTAwMF9tYnhfaW5mbyAqbWJ4ID0gJmh3LT5tYng7CiAKIAkvKiBzdGFydCBtYWlsYm94IGFzIHRpbWVkIG91dCBhbmQgbGV0IHRoZSByZXNldF9odyBjYWxsIHNldCB0aGUgdGltZW91dAotCSAqIHZhbHVlIHRvIGJlaW5nIGNvbW11bmljYXRpb25zICovCisJICogdmFsdWUgdG8gYmVpbmcgY29tbXVuaWNhdGlvbnMKKwkgKi8KIAltYngtPnRpbWVvdXQgPSAwOwogCW1ieC0+dXNlY19kZWxheSA9IEUxMDAwX1ZGX01CWF9JTklUX0RFTEFZOwogCkBAIC0zNDcsNCArMzQ3LDMgQEAKIAogCXJldHVybiBFMTAwMF9TVUNDRVNTOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9tYnguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL21ieC5oCmluZGV4IDI0MzcwYmMuLmY4MDBiZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL21ieC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL21ieC5oCkBAIC0xMyw4ICsxMyw3IEBACiAgIG1vcmUgZGV0YWlscy4KIAogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIAogICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgpAQCAtMzAsNDQgKzI5LDQ0IEBACiAKICNpbmNsdWRlICJ2Zi5oIgogCi0jZGVmaW5lIEUxMDAwX1YyUE1BSUxCT1hfUkVRICAgMHgwMDAwMDAwMSAvKiBSZXF1ZXN0IGZvciBQRiBSZWFkeSBiaXQgKi8KLSNkZWZpbmUgRTEwMDBfVjJQTUFJTEJPWF9BQ0sgICAweDAwMDAwMDAyIC8qIEFjayBQRiBtZXNzYWdlIHJlY2VpdmVkICovCi0jZGVmaW5lIEUxMDAwX1YyUE1BSUxCT1hfVkZVICAgMHgwMDAwMDAwNCAvKiBWRiBvd25zIHRoZSBtYWlsYm94IGJ1ZmZlciAqLwotI2RlZmluZSBFMTAwMF9WMlBNQUlMQk9YX1BGVSAgIDB4MDAwMDAwMDggLyogUEYgb3ducyB0aGUgbWFpbGJveCBidWZmZXIgKi8KLSNkZWZpbmUgRTEwMDBfVjJQTUFJTEJPWF9QRlNUUyAweDAwMDAwMDEwIC8qIFBGIHdyb3RlIGEgbWVzc2FnZSBpbiB0aGUgTUIgKi8KLSNkZWZpbmUgRTEwMDBfVjJQTUFJTEJPWF9QRkFDSyAweDAwMDAwMDIwIC8qIFBGIGFjayB0aGUgcHJldmlvdXMgVkYgbXNnICovCi0jZGVmaW5lIEUxMDAwX1YyUE1BSUxCT1hfUlNUSSAgMHgwMDAwMDA0MCAvKiBQRiBoYXMgcmVzZXQgaW5kaWNhdGlvbiAqLwotI2RlZmluZSBFMTAwMF9WMlBNQUlMQk9YX1JTVEQgIDB4MDAwMDAwODAgLyogUEYgaGFzIGluZGljYXRlZCByZXNldCBkb25lICovCisjZGVmaW5lIEUxMDAwX1YyUE1BSUxCT1hfUkVRCTB4MDAwMDAwMDEgLyogUmVxdWVzdCBmb3IgUEYgUmVhZHkgYml0ICovCisjZGVmaW5lIEUxMDAwX1YyUE1BSUxCT1hfQUNLCTB4MDAwMDAwMDIgLyogQWNrIFBGIG1lc3NhZ2UgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgRTEwMDBfVjJQTUFJTEJPWF9WRlUJMHgwMDAwMDAwNCAvKiBWRiBvd25zIHRoZSBtYWlsYm94IGJ1ZmZlciAqLworI2RlZmluZSBFMTAwMF9WMlBNQUlMQk9YX1BGVQkweDAwMDAwMDA4IC8qIFBGIG93bnMgdGhlIG1haWxib3ggYnVmZmVyICovCisjZGVmaW5lIEUxMDAwX1YyUE1BSUxCT1hfUEZTVFMJMHgwMDAwMDAxMCAvKiBQRiB3cm90ZSBhIG1lc3NhZ2UgaW4gdGhlIE1CICovCisjZGVmaW5lIEUxMDAwX1YyUE1BSUxCT1hfUEZBQ0sJMHgwMDAwMDAyMCAvKiBQRiBhY2sgdGhlIHByZXZpb3VzIFZGIG1zZyAqLworI2RlZmluZSBFMTAwMF9WMlBNQUlMQk9YX1JTVEkJMHgwMDAwMDA0MCAvKiBQRiBoYXMgcmVzZXQgaW5kaWNhdGlvbiAqLworI2RlZmluZSBFMTAwMF9WMlBNQUlMQk9YX1JTVEQJMHgwMDAwMDA4MCAvKiBQRiBoYXMgaW5kaWNhdGVkIHJlc2V0IGRvbmUgKi8KICNkZWZpbmUgRTEwMDBfVjJQTUFJTEJPWF9SMkNfQklUUyAweDAwMDAwMEIwIC8qIEFsbCByZWFkIHRvIGNsZWFyIGJpdHMgKi8KIAotI2RlZmluZSBFMTAwMF9WRk1BSUxCT1hfU0laRSAgIDE2IC8qIDE2IDMyIGJpdCB3b3JkcyAtIDY0IGJ5dGVzICovCisjZGVmaW5lIEUxMDAwX1ZGTUFJTEJPWF9TSVpFCTE2IC8qIDE2IDMyIGJpdCB3b3JkcyAtIDY0IGJ5dGVzICovCiAKIC8qIElmIGl0J3MgYSBFMTAwMF9WRl8qIG1zZyB0aGVuIGl0IG9yaWdpbmF0ZXMgaW4gdGhlIFZGIGFuZCBpcyBzZW50IHRvIHRoZQogICogUEYuICBUaGUgcmV2ZXJzZSBpcyB0cnVlIGlmIGl0IGlzIEUxMDAwX1BGXyouCiAgKiBNZXNzYWdlIEFDSydzIGFyZSB0aGUgdmFsdWUgb3InZCB3aXRoIDB4RjAwMDAwMDAKICAqLwotI2RlZmluZSBFMTAwMF9WVF9NU0dUWVBFX0FDSyAgICAgIDB4ODAwMDAwMDAgIC8qIE1lc3NhZ2VzIGJlbG93IG9yJ2Qgd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMgYXJlIHRoZSBBQ0sgKi8KLSNkZWZpbmUgRTEwMDBfVlRfTVNHVFlQRV9OQUNLICAgICAweDQwMDAwMDAwICAvKiBNZXNzYWdlcyBiZWxvdyBvcidkIHdpdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGlzIGFyZSB0aGUgTkFDSyAqLwotI2RlZmluZSBFMTAwMF9WVF9NU0dUWVBFX0NUUyAgICAgIDB4MjAwMDAwMDAgIC8qIEluZGljYXRlcyB0aGF0IFZGIGlzIHN0aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXIgdG8gc2VuZCByZXF1ZXN0cyAqLworLyogTWVzc2FnZXMgYmVsb3cgb3InZCB3aXRoIHRoaXMgYXJlIHRoZSBBQ0sgKi8KKyNkZWZpbmUgRTEwMDBfVlRfTVNHVFlQRV9BQ0sJMHg4MDAwMDAwMAorLyogTWVzc2FnZXMgYmVsb3cgb3InZCB3aXRoIHRoaXMgYXJlIHRoZSBOQUNLICovCisjZGVmaW5lIEUxMDAwX1ZUX01TR1RZUEVfTkFDSwkweDQwMDAwMDAwCisvKiBJbmRpY2F0ZXMgdGhhdCBWRiBpcyBzdGlsbCBjbGVhciB0byBzZW5kIHJlcXVlc3RzICovCisjZGVmaW5lIEUxMDAwX1ZUX01TR1RZUEVfQ1RTCTB4MjAwMDAwMDAKIAogLyogV2UgaGF2ZSBhIHRvdGFsIHdhaXQgdGltZSBvZiAxcyBmb3IgdmYgbWFpbGJveCBwb3N0ZWQgbWVzc2FnZXMgKi8KLSNkZWZpbmUgRTEwMDBfVkZfTUJYX0lOSVRfVElNRU9VVCAyMDAwIC8qIHJldHJ5IGNvdW50IGZvciBtYWlsYm94IHRpbWVvdXQgKi8KLSNkZWZpbmUgRTEwMDBfVkZfTUJYX0lOSVRfREVMQVkgICA1MDAgIC8qIHVzZWMgZGVsYXkgYmV0d2VlbiByZXRyaWVzICovCisjZGVmaW5lIEUxMDAwX1ZGX01CWF9JTklUX1RJTUVPVVQJMjAwMCAvKiByZXRyeSBjb3VudCBmb3IgbWJ4IHRpbWVvdXQgKi8KKyNkZWZpbmUgRTEwMDBfVkZfTUJYX0lOSVRfREVMQVkJCTUwMCAgLyogdXNlYyBkZWxheSBiZXR3ZWVuIHJldHJpZXMgKi8KIAotI2RlZmluZSBFMTAwMF9WVF9NU0dJTkZPX1NISUZUICAgIDE2CisjZGVmaW5lIEUxMDAwX1ZUX01TR0lORk9fU0hJRlQJMTYKIC8qIGJpdHMgMjM6MTYgYXJlIHVzZWQgZm9yIGV4cmEgaW5mbyBmb3IgY2VydGFpbiBtZXNzYWdlcyAqLwotI2RlZmluZSBFMTAwMF9WVF9NU0dJTkZPX01BU0sgICAgICgweEZGIDw8IEUxMDAwX1ZUX01TR0lORk9fU0hJRlQpCisjZGVmaW5lIEUxMDAwX1ZUX01TR0lORk9fTUFTSwkoMHhGRiA8PCBFMTAwMF9WVF9NU0dJTkZPX1NISUZUKQogCi0jZGVmaW5lIEUxMDAwX1ZGX1JFU0VUICAgICAgICAgICAgMHgwMSAvKiBWRiByZXF1ZXN0cyByZXNldCAqLwotI2RlZmluZSBFMTAwMF9WRl9TRVRfTUFDX0FERFIgICAgIDB4MDIgLyogVkYgcmVxdWVzdHMgUEYgdG8gc2V0IE1BQyBhZGRyICovCi0jZGVmaW5lIEUxMDAwX1ZGX1NFVF9NVUxUSUNBU1QgICAgMHgwMyAvKiBWRiByZXF1ZXN0cyBQRiB0byBzZXQgTUMgYWRkciAqLwotI2RlZmluZSBFMTAwMF9WRl9TRVRfVkxBTiAgICAgICAgIDB4MDQgLyogVkYgcmVxdWVzdHMgUEYgdG8gc2V0IFZMQU4gKi8KLSNkZWZpbmUgRTEwMDBfVkZfU0VUX0xQRSAgICAgICAgICAweDA1IC8qIFZGIHJlcXVlc3RzIFBGIHRvIHNldCBWTU9MUi5MUEUgKi8KKyNkZWZpbmUgRTEwMDBfVkZfUkVTRVQJCTB4MDEgLyogVkYgcmVxdWVzdHMgcmVzZXQgKi8KKyNkZWZpbmUgRTEwMDBfVkZfU0VUX01BQ19BRERSCTB4MDIgLyogVkYgcmVxdWVzdHMgUEYgdG8gc2V0IE1BQyBhZGRyICovCisjZGVmaW5lIEUxMDAwX1ZGX1NFVF9NVUxUSUNBU1QJMHgwMyAvKiBWRiByZXF1ZXN0cyBQRiB0byBzZXQgTUMgYWRkciAqLworI2RlZmluZSBFMTAwMF9WRl9TRVRfVkxBTgkweDA0IC8qIFZGIHJlcXVlc3RzIFBGIHRvIHNldCBWTEFOICovCisjZGVmaW5lIEUxMDAwX1ZGX1NFVF9MUEUJMHgwNSAvKiBWRiByZXF1ZXN0cyBQRiB0byBzZXQgVk1PTFIuTFBFICovCiAKLSNkZWZpbmUgRTEwMDBfUEZfQ09OVFJPTF9NU0cgICAgICAweDAxMDAgLyogUEYgY29udHJvbCBtZXNzYWdlICovCisjZGVmaW5lIEUxMDAwX1BGX0NPTlRST0xfTVNHCTB4MDEwMCAvKiBQRiBjb250cm9sIG1lc3NhZ2UgKi8KIAogdm9pZCBlMTAwMF9pbml0X21ieF9vcHNfZ2VuZXJpYyhzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHMzMiBlMTAwMF9pbml0X21ieF9wYXJhbXNfdmYoc3RydWN0IGUxMDAwX2h3ICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYwppbmRleCBlYmY5ZDRhLi45NWFmMTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYwpAQCAtMTMsOCArMTMsNyBAQAogICBtb3JlIGRldGFpbHMuCiAKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAKICAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KQEAgLTY2LDI2ICs2NSwyNyBAQAogc3RhdGljIHZvaWQgaWdidmZfcmVzZXRfaW50ZXJydXB0X2NhcGFiaWxpdHkoc3RydWN0IGlnYnZmX2FkYXB0ZXIgKik7CiAKIHN0YXRpYyBzdHJ1Y3QgaWdidmZfaW5mbyBpZ2J2Zl92Zl9pbmZvID0gewotCS5tYWMgICAgICAgICAgICAgICAgICAgID0gZTEwMDBfdmZhZGFwdCwKLQkuZmxhZ3MgICAgICAgICAgICAgICAgICA9IDAsCi0JLnBiYSAgICAgICAgICAgICAgICAgICAgPSAxMCwKLQkuaW5pdF9vcHMgICAgICAgICAgICAgICA9IGUxMDAwX2luaXRfZnVuY3Rpb25fcG9pbnRlcnNfdmYsCisJLm1hYwkJPSBlMTAwMF92ZmFkYXB0LAorCS5mbGFncwkJPSAwLAorCS5wYmEJCT0gMTAsCisJLmluaXRfb3BzCT0gZTEwMDBfaW5pdF9mdW5jdGlvbl9wb2ludGVyc192ZiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaWdidmZfaW5mbyBpZ2J2Zl9pMzUwX3ZmX2luZm8gPSB7Ci0JLm1hYwkJCT0gZTEwMDBfdmZhZGFwdF9pMzUwLAotCS5mbGFncwkJCT0gMCwKLQkucGJhCQkJPSAxMCwKLQkuaW5pdF9vcHMJCT0gZTEwMDBfaW5pdF9mdW5jdGlvbl9wb2ludGVyc192ZiwKKwkubWFjCQk9IGUxMDAwX3ZmYWRhcHRfaTM1MCwKKwkuZmxhZ3MJCT0gMCwKKwkucGJhCQk9IDEwLAorCS5pbml0X29wcwk9IGUxMDAwX2luaXRfZnVuY3Rpb25fcG9pbnRlcnNfdmYsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlnYnZmX2luZm8gKmlnYnZmX2luZm9fdGJsW10gPSB7Ci0JW2JvYXJkX3ZmXSAgICAgICAgICAgICAgPSAmaWdidmZfdmZfaW5mbywKLQlbYm9hcmRfaTM1MF92Zl0JCT0gJmlnYnZmX2kzNTBfdmZfaW5mbywKKwlbYm9hcmRfdmZdCT0gJmlnYnZmX3ZmX2luZm8sCisJW2JvYXJkX2kzNTBfdmZdCT0gJmlnYnZmX2kzNTBfdmZfaW5mbywKIH07CiAKIC8qKgogICogaWdidmZfZGVzY191bnVzZWQgLSBjYWxjdWxhdGUgaWYgd2UgaGF2ZSB1bnVzZWQgZGVzY3JpcHRvcnMKKyAqIEByeF9yaW5nOiBhZGRyZXNzIG9mIHJlY2VpdmUgcmluZyBzdHJ1Y3R1cmUKICAqKi8KIHN0YXRpYyBpbnQgaWdidmZfZGVzY191bnVzZWQoc3RydWN0IGlnYnZmX3JpbmcgKnJpbmcpCiB7CkBAIC0xMDMsOSArMTAzLDkgQEAKICAqIEBza2I6IHBvaW50ZXIgdG8gc2tfYnVmZiB0byBiZSBpbmRpY2F0ZWQgdG8gc3RhY2sKICAqKi8KIHN0YXRpYyB2b2lkIGlnYnZmX3JlY2VpdmVfc2tiKHN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgc3RhdHVzLCB1MTYgdmxhbikKKwkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgdTMyIHN0YXR1cywgdTE2IHZsYW4pCiB7CiAJdTE2IHZpZDsKIApAQCAtMTIzLDcgKzEyMyw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpZ2J2Zl9yeF9jaGVja3N1bV9hZHYoc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUzMiBzdGF0dXNfZXJyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkJCQkgdTMyIHN0YXR1c19lcnIsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc2tiX2NoZWNrc3VtX25vbmVfYXNzZXJ0KHNrYik7CiAKQEAgLTE1Myw3ICsxNTMsNyBAQAogICogQGNsZWFuZWRfY291bnQ6IG51bWJlciBvZiBidWZmZXJzIHRvIHJlcG9wdWxhdGUKICAqKi8KIHN0YXRpYyB2b2lkIGlnYnZmX2FsbG9jX3J4X2J1ZmZlcnMoc3RydWN0IGlnYnZmX3JpbmcgKnJ4X3JpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGVhbmVkX2NvdW50KQorCQkJCSAgIGludCBjbGVhbmVkX2NvdW50KQogewogCXN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyID0gcnhfcmluZy0+YWRhcHRlcjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwpAQCAtMTg4LDggKzE4OCw4IEBACiAJCQl9CiAJCQlidWZmZXJfaW5mby0+cGFnZV9kbWEgPQogCQkJCWRtYV9tYXBfcGFnZSgmcGRldi0+ZGV2LCBidWZmZXJfaW5mby0+cGFnZSwKLQkJCQkgICAgICAgICAgICAgYnVmZmVyX2luZm8tPnBhZ2Vfb2Zmc2V0LAotCQkJCSAgICAgICAgICAgICBQQUdFX1NJWkUgLyAyLAorCQkJCQkgICAgIGJ1ZmZlcl9pbmZvLT5wYWdlX29mZnNldCwKKwkJCQkJICAgICBQQUdFX1NJWkUgLyAyLAogCQkJCQkgICAgIERNQV9GUk9NX0RFVklDRSk7CiAJCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJnBkZXYtPmRldiwKIAkJCQkJICAgICAgYnVmZmVyX2luZm8tPnBhZ2VfZG1hKSkgewpAQCAtMjA5LDcgKzIwOSw3IEBACiAKIAkJCWJ1ZmZlcl9pbmZvLT5za2IgPSBza2I7CiAJCQlidWZmZXJfaW5mby0+ZG1hID0gZG1hX21hcF9zaW5nbGUoJnBkZXYtPmRldiwgc2tiLT5kYXRhLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnN6LAorCQkJCQkJCSAgYnVmc3osCiAJCQkJCQkJICBETUFfRlJPTV9ERVZJQ0UpOwogCQkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKCZwZGV2LT5kZXYsIGJ1ZmZlcl9pbmZvLT5kbWEpKSB7CiAJCQkJZGV2X2tmcmVlX3NrYihidWZmZXJfaW5mby0+c2tiKTsKQEAgLTIxOSwxNCArMjE5LDE0IEBACiAJCQl9CiAJCX0KIAkJLyogUmVmcmVzaCB0aGUgZGVzYyBldmVuIGlmIGJ1ZmZlcl9hZGRycyBkaWRuJ3QgY2hhbmdlIGJlY2F1c2UKLQkJICogZWFjaCB3cml0ZS1iYWNrIGVyYXNlcyB0aGlzIGluZm8uICovCisJCSAqIGVhY2ggd3JpdGUtYmFjayBlcmFzZXMgdGhpcyBpbmZvLgorCQkgKi8KIAkJaWYgKGFkYXB0ZXItPnJ4X3BzX2hkcl9zaXplKSB7CiAJCQlyeF9kZXNjLT5yZWFkLnBrdF9hZGRyID0KIAkJCSAgICAgY3B1X3RvX2xlNjQoYnVmZmVyX2luZm8tPnBhZ2VfZG1hKTsKIAkJCXJ4X2Rlc2MtPnJlYWQuaGRyX2FkZHIgPSBjcHVfdG9fbGU2NChidWZmZXJfaW5mby0+ZG1hKTsKIAkJfSBlbHNlIHsKLQkJCXJ4X2Rlc2MtPnJlYWQucGt0X2FkZHIgPQotCQkJICAgICBjcHVfdG9fbGU2NChidWZmZXJfaW5mby0+ZG1hKTsKKwkJCXJ4X2Rlc2MtPnJlYWQucGt0X2FkZHIgPSBjcHVfdG9fbGU2NChidWZmZXJfaW5mby0+ZG1hKTsKIAkJCXJ4X2Rlc2MtPnJlYWQuaGRyX2FkZHIgPSAwOwogCQl9CiAKQEAgLTI0Nyw3ICsyNDcsOCBAQAogCQkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdwogCQkgKiBrbm93IHRoZXJlIGFyZSBuZXcgZGVzY3JpcHRvcnMgdG8gZmV0Y2guICAoT25seQogCQkgKiBhcHBsaWNhYmxlIGZvciB3ZWFrLW9yZGVyZWQgbWVtb3J5IG1vZGVsIGFyY2hzLAotCQkgKiBzdWNoIGFzIElBLTY0KS4gKi8KKwkJICogc3VjaCBhcyBJQS02NCkuCisJCSovCiAJCXdtYigpOwogCQl3cml0ZWwoaSwgYWRhcHRlci0+aHcuaHdfYWRkciArIHJ4X3JpbmctPnRhaWwpOwogCX0KQEAgLTI2MSw3ICsyNjIsNyBAQAogICogaXMgbm8gZ3VhcmFudGVlIHRoYXQgZXZlcnl0aGluZyB3YXMgY2xlYW5lZAogICoqLwogc3RhdGljIGJvb2wgaWdidmZfY2xlYW5fcnhfaXJxKHN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqd29ya19kb25lLCBpbnQgd29ya190b19kbykKKwkJCSAgICAgICBpbnQgKndvcmtfZG9uZSwgaW50IHdvcmtfdG9fZG8pCiB7CiAJc3RydWN0IGlnYnZmX3JpbmcgKnJ4X3JpbmcgPSBhZGFwdGVyLT5yeF9yaW5nOwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CkBAIC0yOTIsOCArMjkzLDkgQEAKIAkJICogdGhhdCBjYXNlLCBpdCBmaWxscyB0aGUgaGVhZGVyIGJ1ZmZlciBhbmQgc3BpbGxzIHRoZSByZXN0CiAJCSAqIGludG8gdGhlIHBhZ2UuCiAJCSAqLwotCQlobGVuID0gKGxlMTZfdG9fY3B1KHJ4X2Rlc2MtPndiLmxvd2VyLmxvX2R3b3JkLmhzX3Jzcy5oZHJfaW5mbykgJgotCQkgIEUxMDAwX1JYREFEVl9IRFJCVUZMRU5fTUFTSykgPj4gRTEwMDBfUlhEQURWX0hEUkJVRkxFTl9TSElGVDsKKwkJaGxlbiA9IChsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5sb3dlci5sb19kd29yZC5oc19yc3MuaGRyX2luZm8pCisJCSAgICAgICAmIEUxMDAwX1JYREFEVl9IRFJCVUZMRU5fTUFTSykgPj4KKwkJICAgICAgIEUxMDAwX1JYREFEVl9IRFJCVUZMRU5fU0hJRlQ7CiAJCWlmIChobGVuID4gYWRhcHRlci0+cnhfcHNfaGRyX3NpemUpCiAJCQlobGVuID0gYWRhcHRlci0+cnhfcHNfaGRyX3NpemU7CiAKQEAgLTMwNiw3ICszMDgsNyBAQAogCQlidWZmZXJfaW5mby0+c2tiID0gTlVMTDsKIAkJaWYgKCFhZGFwdGVyLT5yeF9wc19oZHJfc2l6ZSkgewogCQkJZG1hX3VubWFwX3NpbmdsZSgmcGRldi0+ZGV2LCBidWZmZXJfaW5mby0+ZG1hLAotCQkJICAgICAgICAgICAgICAgICBhZGFwdGVyLT5yeF9idWZmZXJfbGVuLAorCQkJCQkgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiwKIAkJCQkJIERNQV9GUk9NX0RFVklDRSk7CiAJCQlidWZmZXJfaW5mby0+ZG1hID0gMDsKIAkJCXNrYl9wdXQoc2tiLCBsZW5ndGgpOwpAQCAtMzE1LDIxICszMTcsMjEgQEAKIAogCQlpZiAoIXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MpIHsKIAkJCWRtYV91bm1hcF9zaW5nbGUoJnBkZXYtPmRldiwgYnVmZmVyX2luZm8tPmRtYSwKLQkJCSAgICAgICAgICAgICAgICAgYWRhcHRlci0+cnhfcHNfaGRyX3NpemUsCisJCQkJCSBhZGFwdGVyLT5yeF9wc19oZHJfc2l6ZSwKIAkJCQkJIERNQV9GUk9NX0RFVklDRSk7CiAJCQlza2JfcHV0KHNrYiwgaGxlbik7CiAJCX0KIAogCQlpZiAobGVuZ3RoKSB7CiAJCQlkbWFfdW5tYXBfcGFnZSgmcGRldi0+ZGV2LCBidWZmZXJfaW5mby0+cGFnZV9kbWEsCi0JCQkgICAgICAgICAgICAgICBQQUdFX1NJWkUgLyAyLAorCQkJCSAgICAgICBQQUdFX1NJWkUgLyAyLAogCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOwogCQkJYnVmZmVyX2luZm8tPnBhZ2VfZG1hID0gMDsKIAogCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncywKLQkJCSAgICAgICAgICAgICAgICAgICBidWZmZXJfaW5mby0+cGFnZSwKLQkJCSAgICAgICAgICAgICAgICAgICBidWZmZXJfaW5mby0+cGFnZV9vZmZzZXQsCi0JCQkgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKwkJCQkJICAgYnVmZmVyX2luZm8tPnBhZ2UsCisJCQkJCSAgIGJ1ZmZlcl9pbmZvLT5wYWdlX29mZnNldCwKKwkJCQkJICAgbGVuZ3RoKTsKIAogCQkJaWYgKChhZGFwdGVyLT5yeF9idWZmZXJfbGVuID4gKFBBR0VfU0laRSAvIDIpKSB8fAogCQkJICAgIChwYWdlX2NvdW50KGJ1ZmZlcl9pbmZvLT5wYWdlKSAhPSAxKSkKQEAgLTM3MCw3ICszNzIsNyBAQAogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOwogCiAJCWlnYnZmX3JlY2VpdmVfc2tiKGFkYXB0ZXIsIG5ldGRldiwgc2tiLCBzdGF0ZXJyLAotCQkgICAgICAgICAgICAgICAgICByeF9kZXNjLT53Yi51cHBlci52bGFuKTsKKwkJCQkgIHJ4X2Rlc2MtPndiLnVwcGVyLnZsYW4pOwogCiBuZXh0X2Rlc2M6CiAJCXJ4X2Rlc2MtPndiLnVwcGVyLnN0YXR1c19lcnJvciA9IDA7CkBAIC00MDIsNyArNDA0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaWdidmZfcHV0X3R4YnVmKHN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZ2J2Zl9idWZmZXIgKmJ1ZmZlcl9pbmZvKQorCQkJICAgIHN0cnVjdCBpZ2J2Zl9idWZmZXIgKmJ1ZmZlcl9pbmZvKQogewogCWlmIChidWZmZXJfaW5mby0+ZG1hKSB7CiAJCWlmIChidWZmZXJfaW5mby0+bWFwcGVkX2FzX3BhZ2UpCkBAIC00MzEsNyArNDMzLDcgQEAKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGZhaWx1cmUKICAqKi8KIGludCBpZ2J2Zl9zZXR1cF90eF9yZXNvdXJjZXMoc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZ2J2Zl9yaW5nICp0eF9yaW5nKQorCQkJICAgICBzdHJ1Y3QgaWdidmZfcmluZyAqdHhfcmluZykKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFkYXB0ZXItPnBkZXY7CiAJaW50IHNpemU7CkBAIC00NTgsNyArNDYwLDcgQEAKIGVycjoKIAl2ZnJlZSh0eF9yaW5nLT5idWZmZXJfaW5mbyk7CiAJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCSAgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc21pdCBkZXNjcmlwdG9yIHJpbmdcbiIpOworCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHRyYW5zbWl0IGRlc2NyaXB0b3IgcmluZ1xuIik7CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKQEAgLTUwMSw3ICs1MDMsNyBAQAogCXZmcmVlKHJ4X3JpbmctPmJ1ZmZlcl9pbmZvKTsKIAlyeF9yaW5nLT5idWZmZXJfaW5mbyA9IE5VTEw7CiAJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCSAgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgcmluZ1xuIik7CisJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcmVjZWl2ZSBkZXNjcmlwdG9yIHJpbmdcbiIpOwogCXJldHVybiAtRU5PTUVNOwogfQogCkBAIC01NzgsMTMgKzU4MCwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCByeF9yaW5nLT5jb3VudDsgaSsrKSB7CiAJCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldOwogCQlpZiAoYnVmZmVyX2luZm8tPmRtYSkgewotCQkJaWYgKGFkYXB0ZXItPnJ4X3BzX2hkcl9zaXplKXsKKwkJCWlmIChhZGFwdGVyLT5yeF9wc19oZHJfc2l6ZSkgewogCQkJCWRtYV91bm1hcF9zaW5nbGUoJnBkZXYtPmRldiwgYnVmZmVyX2luZm8tPmRtYSwKLQkJCQkgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnJ4X3BzX2hkcl9zaXplLAorCQkJCQkJIGFkYXB0ZXItPnJ4X3BzX2hkcl9zaXplLAogCQkJCQkJIERNQV9GUk9NX0RFVklDRSk7CiAJCQl9IGVsc2UgewogCQkJCWRtYV91bm1hcF9zaW5nbGUoJnBkZXYtPmRldiwgYnVmZmVyX2luZm8tPmRtYSwKLQkJCQkgICAgICAgICAgICAgICAgIGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4sCisJCQkJCQkgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiwKIAkJCQkJCSBETUFfRlJPTV9ERVZJQ0UpOwogCQkJfQogCQkJYnVmZmVyX2luZm8tPmRtYSA9IDA7CkBAIC01OTksNyArNjAxLDcgQEAKIAkJCWlmIChidWZmZXJfaW5mby0+cGFnZV9kbWEpCiAJCQkJZG1hX3VubWFwX3BhZ2UoJnBkZXYtPmRldiwKIAkJCQkJICAgICAgIGJ1ZmZlcl9pbmZvLT5wYWdlX2RtYSwKLQkJCQkgICAgICAgICAgICAgICBQQUdFX1NJWkUgLyAyLAorCQkJCQkgICAgICAgUEFHRV9TSVpFIC8gMiwKIAkJCQkJICAgICAgIERNQV9GUk9NX0RFVklDRSk7CiAJCQlwdXRfcGFnZShidWZmZXJfaW5mby0+cGFnZSk7CiAJCQlidWZmZXJfaW5mby0+cGFnZSA9IE5VTEw7CkBAIC02MzgsNyArNjQwLDcgQEAKIAlyeF9yaW5nLT5idWZmZXJfaW5mbyA9IE5VTEw7CiAKIAlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCByeF9yaW5nLT5zaXplLCByeF9yaW5nLT5kZXNjLAotCSAgICAgICAgICAgICAgICAgIHJ4X3JpbmctPmRtYSk7CisJCQkgIHJ4X3JpbmctPmRtYSk7CiAJcnhfcmluZy0+ZGVzYyA9IE5VTEw7CiB9CiAKQEAgLTY0OSwxMyArNjUxLDEyIEBACiAgKiBAcGFja2V0czogdGhlIG51bWJlciBvZiBwYWNrZXRzIGR1cmluZyB0aGlzIG1lYXN1cmVtZW50IGludGVydmFsCiAgKiBAYnl0ZXM6IHRoZSBudW1iZXIgb2YgYnl0ZXMgZHVyaW5nIHRoaXMgbWVhc3VyZW1lbnQgaW50ZXJ2YWwKICAqCi0gKiAgICAgIFN0b3JlcyBhIG5ldyBJVFIgdmFsdWUgYmFzZWQgb24gcGFja2V0cyBhbmQgYnl0ZQotICogICAgICBjb3VudHMgZHVyaW5nIHRoZSBsYXN0IGludGVycnVwdC4gIFRoZSBhZHZhbnRhZ2Ugb2YgcGVyIGludGVycnVwdAotICogICAgICBjb21wdXRhdGlvbiBpcyBmYXN0ZXIgdXBkYXRlcyBhbmQgbW9yZSBhY2N1cmF0ZSBJVFIgZm9yIHRoZSBjdXJyZW50Ci0gKiAgICAgIHRyYWZmaWMgcGF0dGVybi4gIENvbnN0YW50cyBpbiB0aGlzIGZ1bmN0aW9uIHdlcmUgY29tcHV0ZWQKLSAqICAgICAgYmFzZWQgb24gdGhlb3JldGljYWwgbWF4aW11bSB3aXJlIHNwZWVkIGFuZCB0aHJlc2hvbGRzIHdlcmUgc2V0IGJhc2VkCi0gKiAgICAgIG9uIHRlc3RpbmcgZGF0YSBhcyB3ZWxsIGFzIGF0dGVtcHRpbmcgdG8gbWluaW1pemUgcmVzcG9uc2UgdGltZQotICogICAgICB3aGlsZSBpbmNyZWFzaW5nIGJ1bGsgdGhyb3VnaHB1dC4KKyAqIFN0b3JlcyBhIG5ldyBJVFIgdmFsdWUgYmFzZWQgb24gcGFja2V0cyBhbmQgYnl0ZSBjb3VudHMgZHVyaW5nIHRoZSBsYXN0CisgKiBpbnRlcnJ1cHQuICBUaGUgYWR2YW50YWdlIG9mIHBlciBpbnRlcnJ1cHQgY29tcHV0YXRpb24gaXMgZmFzdGVyIHVwZGF0ZXMKKyAqIGFuZCBtb3JlIGFjY3VyYXRlIElUUiBmb3IgdGhlIGN1cnJlbnQgdHJhZmZpYyBwYXR0ZXJuLiAgQ29uc3RhbnRzIGluIHRoaXMKKyAqIGZ1bmN0aW9uIHdlcmUgY29tcHV0ZWQgYmFzZWQgb24gdGhlb3JldGljYWwgbWF4aW11bSB3aXJlIHNwZWVkIGFuZCB0aHJlc2hvbGRzCisgKiB3ZXJlIHNldCBiYXNlZCBvbiB0ZXN0aW5nIGRhdGEgYXMgd2VsbCBhcyBhdHRlbXB0aW5nIHRvIG1pbmltaXplIHJlc3BvbnNlCisgKiB0aW1lIHdoaWxlIGluY3JlYXNpbmcgYnVsayB0aHJvdWdocHV0LgogICoqLwogc3RhdGljIGVudW0gbGF0ZW5jeV9yYW5nZSBpZ2J2Zl91cGRhdGVfaXRyKHN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyLAogCQkJCQkgICBlbnVtIGxhdGVuY3lfcmFuZ2UgaXRyX3NldHRpbmcsCkBAIC03NDQsMTcgKzc0NSwxNSBAQAogCiAJbmV3X2l0ciA9IGlnYnZmX3JhbmdlX3RvX2l0cihhZGFwdGVyLT50eF9yaW5nLT5pdHJfcmFuZ2UpOwogCi0KIAlpZiAobmV3X2l0ciAhPSBhZGFwdGVyLT50eF9yaW5nLT5pdHJfdmFsKSB7CiAJCXUzMiBjdXJyZW50X2l0ciA9IGFkYXB0ZXItPnR4X3JpbmctPml0cl92YWw7Ci0JCS8qCi0JCSAqIHRoaXMgYXR0ZW1wdHMgdG8gYmlhcyB0aGUgaW50ZXJydXB0IHJhdGUgdG93YXJkcyBCdWxrCisJCS8qIHRoaXMgYXR0ZW1wdHMgdG8gYmlhcyB0aGUgaW50ZXJydXB0IHJhdGUgdG93YXJkcyBCdWxrCiAJCSAqIGJ5IGFkZGluZyBpbnRlcm1lZGlhdGUgc3RlcHMgd2hlbiBpbnRlcnJ1cHQgcmF0ZSBpcwogCQkgKiBpbmNyZWFzaW5nCiAJCSAqLwogCQluZXdfaXRyID0gbmV3X2l0ciA+IGN1cnJlbnRfaXRyID8KLQkJCSAgICAgbWluKGN1cnJlbnRfaXRyICsgKG5ld19pdHIgPj4gMiksIG5ld19pdHIpIDoKLQkJCSAgICAgbmV3X2l0cjsKKwkJCSAgbWluKGN1cnJlbnRfaXRyICsgKG5ld19pdHIgPj4gMiksIG5ld19pdHIpIDoKKwkJCSAgbmV3X2l0cjsKIAkJYWRhcHRlci0+dHhfcmluZy0+aXRyX3ZhbCA9IG5ld19pdHI7CiAKIAkJYWRhcHRlci0+dHhfcmluZy0+c2V0X2l0ciA9IDE7CkBAIC03NzIsOSArNzcxLDEwIEBACiAKIAlpZiAobmV3X2l0ciAhPSBhZGFwdGVyLT5yeF9yaW5nLT5pdHJfdmFsKSB7CiAJCXUzMiBjdXJyZW50X2l0ciA9IGFkYXB0ZXItPnJ4X3JpbmctPml0cl92YWw7CisKIAkJbmV3X2l0ciA9IG5ld19pdHIgPiBjdXJyZW50X2l0ciA/Ci0JCQkgICAgIG1pbihjdXJyZW50X2l0ciArIChuZXdfaXRyID4+IDIpLCBuZXdfaXRyKSA6Ci0JCQkgICAgIG5ld19pdHI7CisJCQkgIG1pbihjdXJyZW50X2l0ciArIChuZXdfaXRyID4+IDIpLCBuZXdfaXRyKSA6CisJCQkgIG5ld19pdHI7CiAJCWFkYXB0ZXItPnJ4X3JpbmctPml0cl92YWwgPSBuZXdfaXRyOwogCiAJCWFkYXB0ZXItPnJ4X3JpbmctPnNldF9pdHIgPSAxOwpAQCAtODI5LDcgKzgyOSw3IEBACiAJCQkJc2VncyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPzogMTsKIAkJCQkvKiBtdWx0aXBseSBkYXRhIGNodW5rcyBieSBzaXplIG9mIGhlYWRlcnMgKi8KIAkJCQlieXRlY291bnQgPSAoKHNlZ3MgLSAxKSAqIHNrYl9oZWFkbGVuKHNrYikpICsKLQkJCQkgICAgICAgICAgICBza2ItPmxlbjsKKwkJCQkJICAgIHNrYi0+bGVuOwogCQkJCXRvdGFsX3BhY2tldHMgKz0gc2VnczsKIAkJCQl0b3RhbF9ieXRlcyArPSBieXRlY291bnQ7CiAJCQl9CkBAIC04NDksOSArODQ5LDggQEAKIAogCXR4X3JpbmctPm5leHRfdG9fY2xlYW4gPSBpOwogCi0JaWYgKHVubGlrZWx5KGNvdW50ICYmCi0JICAgICAgICAgICAgIG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSAmJgotCSAgICAgICAgICAgICBpZ2J2Zl9kZXNjX3VudXNlZCh0eF9yaW5nKSA+PSBJR0JWRl9UWF9RVUVVRV9XQUtFKSkgeworCWlmICh1bmxpa2VseShjb3VudCAmJiBuZXRpZl9jYXJyaWVyX29rKG5ldGRldikgJiYKKwkgICAgaWdidmZfZGVzY191bnVzZWQodHhfcmluZykgPj0gSUdCVkZfVFhfUVVFVUVfV0FLRSkpIHsKIAkJLyogTWFrZSBzdXJlIHRoYXQgYW55Ym9keSBzdG9wcGluZyB0aGUgcXVldWUgYWZ0ZXIgdGhpcwogCQkgKiBzZWVzIHRoZSBuZXcgbmV4dF90b19jbGVhbi4KIAkJICovCkBAIC05MDIsOCArOTAxLDkgQEAKIAlhZGFwdGVyLT50b3RhbF90eF9ieXRlcyA9IDA7CiAJYWRhcHRlci0+dG90YWxfdHhfcGFja2V0cyA9IDA7CiAKLQkvKiBhdXRvIG1hc2sgd2lsbCBhdXRvbWF0aWNhbGx5IHJlZW5hYmxlIHRoZSBpbnRlcnJ1cHQgd2hlbiB3ZSB3cml0ZQotCSAqIEVJQ1MgKi8KKwkvKiBhdXRvIG1hc2sgd2lsbCBhdXRvbWF0aWNhbGx5IHJlLWVuYWJsZSB0aGUgaW50ZXJydXB0IHdoZW4gd2Ugd3JpdGUKKwkgKiBFSUNTCisJICovCiAJaWYgKCFpZ2J2Zl9jbGVhbl90eF9pcnEodHhfcmluZykpCiAJCS8qIFJpbmcgd2FzIG5vdCBjb21wbGV0ZWx5IGNsZWFuZWQsIHNvIGZpcmUgYW5vdGhlciBpbnRlcnJ1cHQgKi8KIAkJZXczMihFSUNTLCB0eF9yaW5nLT5laW1zX3ZhbHVlKTsKQEAgLTk0MSwxNSArOTQxLDE2IEBACiAjZGVmaW5lIElHQlZGX05PX1FVRVVFIC0xCiAKIHN0YXRpYyB2b2lkIGlnYnZmX2Fzc2lnbl92ZWN0b3Ioc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCByeF9xdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR4X3F1ZXVlLCBpbnQgbXNpeF92ZWN0b3IpCisJCQkJaW50IHR4X3F1ZXVlLCBpbnQgbXNpeF92ZWN0b3IpCiB7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1MzIgaXZhciwgaW5kZXg7CiAKIAkvKiA4MjU3NiB1c2VzIGEgdGFibGUtYmFzZWQgbWV0aG9kIGZvciBhc3NpZ25pbmcgdmVjdG9ycy4KLQkgICBFYWNoIHF1ZXVlIGhhcyBhIHNpbmdsZSBlbnRyeSBpbiB0aGUgdGFibGUgdG8gd2hpY2ggd2Ugd3JpdGUKLQkgICBhIHZlY3RvciBudW1iZXIgYWxvbmcgd2l0aCBhICJ2YWxpZCIgYml0LiAgU2FkbHksIHRoZSBsYXlvdXQKLQkgICBvZiB0aGUgdGFibGUgaXMgc29tZXdoYXQgY291bnRlcmludHVpdGl2ZS4gKi8KKwkgKiBFYWNoIHF1ZXVlIGhhcyBhIHNpbmdsZSBlbnRyeSBpbiB0aGUgdGFibGUgdG8gd2hpY2ggd2Ugd3JpdGUKKwkgKiBhIHZlY3RvciBudW1iZXIgYWxvbmcgd2l0aCBhICJ2YWxpZCIgYml0LiAgU2FkbHksIHRoZSBsYXlvdXQKKwkgKiBvZiB0aGUgdGFibGUgaXMgc29tZXdoYXQgY291bnRlcmludHVpdGl2ZS4KKwkgKi8KIAlpZiAocnhfcXVldWUgPiBJR0JWRl9OT19RVUVVRSkgewogCQlpbmRleCA9IChyeF9xdWV1ZSA+PiAxKTsKIAkJaXZhciA9IGFycmF5X2VyMzIoSVZBUjAsIGluZGV4KTsKQEAgLTk4NCw2ICs5ODUsNyBAQAogCiAvKioKICAqIGlnYnZmX2NvbmZpZ3VyZV9tc2l4IC0gQ29uZmlndXJlIE1TSS1YIGhhcmR3YXJlCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqCiAgKiBpZ2J2Zl9jb25maWd1cmVfbXNpeCBzZXRzIHVwIHRoZSBoYXJkd2FyZSB0byBwcm9wZXJseQogICogZ2VuZXJhdGUgTVNJLVggaW50ZXJydXB0cy4KQEAgLTEwMjcsNiArMTAyOSw3IEBACiAKIC8qKgogICogaWdidmZfc2V0X2ludGVycnVwdF9jYXBhYmlsaXR5IC0gc2V0IE1TSSBvciBNU0ktWCBpZiBzdXBwb3J0ZWQKKyAqIEBhZGFwdGVyOiBib2FyZCBwcml2YXRlIHN0cnVjdHVyZQogICoKICAqIEF0dGVtcHQgdG8gY29uZmlndXJlIGludGVycnVwdHMgdXNpbmcgdGhlIGJlc3QgYXZhaWxhYmxlCiAgKiBjYXBhYmlsaXRpZXMgb2YgdGhlIGhhcmR3YXJlIGFuZCBrZXJuZWwuCkBAIC0xMDM2LDI3ICsxMDM5LDI4IEBACiAJaW50IGVyciA9IC1FTk9NRU07CiAJaW50IGk7CiAKLQkvKiB3ZSBhbGxvY2F0ZSAzIHZlY3RvcnMsIDEgZm9yIHR4LCAxIGZvciByeCwgb25lIGZvciBwZiBtZXNzYWdlcyAqLworCS8qIHdlIGFsbG9jYXRlIDMgdmVjdG9ycywgMSBmb3IgVHgsIDEgZm9yIFJ4LCBvbmUgZm9yIFBGIG1lc3NhZ2VzICovCiAJYWRhcHRlci0+bXNpeF9lbnRyaWVzID0ga2NhbGxvYygzLCBzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCk7CisJCQkJCUdGUF9LRVJORUwpOwogCWlmIChhZGFwdGVyLT5tc2l4X2VudHJpZXMpIHsKIAkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKIAkJCWFkYXB0ZXItPm1zaXhfZW50cmllc1tpXS5lbnRyeSA9IGk7CiAKIAkJZXJyID0gcGNpX2VuYWJsZV9tc2l4X3JhbmdlKGFkYXB0ZXItPnBkZXYsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGVyLT5tc2l4X2VudHJpZXMsIDMsIDMpOworCQkJCQkgICAgYWRhcHRlci0+bXNpeF9lbnRyaWVzLCAzLCAzKTsKIAl9CiAKIAlpZiAoZXJyIDwgMCkgewogCQkvKiBNU0ktWCBmYWlsZWQgKi8KIAkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkgICAgICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBNU0ktWCBpbnRlcnJ1cHRzLlxuIik7CisJCQkiRmFpbGVkIHRvIGluaXRpYWxpemUgTVNJLVggaW50ZXJydXB0cy5cbiIpOwogCQlpZ2J2Zl9yZXNldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShhZGFwdGVyKTsKIAl9CiB9CiAKIC8qKgogICogaWdidmZfcmVxdWVzdF9tc2l4IC0gSW5pdGlhbGl6ZSBNU0ktWCBpbnRlcnJ1cHRzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqCiAgKiBpZ2J2Zl9yZXF1ZXN0X21zaXggYWxsb2NhdGVzIE1TSS1YIHZlY3RvcnMgYW5kIHJlcXVlc3RzIGludGVycnVwdHMgZnJvbSB0aGUKICAqIGtlcm5lbC4KQEAgLTEwNzUsOCArMTA3OSw4IEBACiAJfQogCiAJZXJyID0gcmVxdWVzdF9pcnEoYWRhcHRlci0+bXNpeF9lbnRyaWVzW3ZlY3Rvcl0udmVjdG9yLAotCSAgICAgICAgICAgICAgICAgIGlnYnZmX2ludHJfbXNpeF90eCwgMCwgYWRhcHRlci0+dHhfcmluZy0+bmFtZSwKLQkgICAgICAgICAgICAgICAgICBuZXRkZXYpOworCQkJICBpZ2J2Zl9pbnRyX21zaXhfdHgsIDAsIGFkYXB0ZXItPnR4X3JpbmctPm5hbWUsCisJCQkgIG5ldGRldik7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTEwODUsOCArMTA4OSw4IEBACiAJdmVjdG9yKys7CiAKIAllcnIgPSByZXF1ZXN0X2lycShhZGFwdGVyLT5tc2l4X2VudHJpZXNbdmVjdG9yXS52ZWN0b3IsCi0JICAgICAgICAgICAgICAgICAgaWdidmZfaW50cl9tc2l4X3J4LCAwLCBhZGFwdGVyLT5yeF9yaW5nLT5uYW1lLAotCSAgICAgICAgICAgICAgICAgIG5ldGRldik7CisJCQkgIGlnYnZmX2ludHJfbXNpeF9yeCwgMCwgYWRhcHRlci0+cnhfcmluZy0+bmFtZSwKKwkJCSAgbmV0ZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtMTA5NSw3ICsxMDk5LDcgQEAKIAl2ZWN0b3IrKzsKIAogCWVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1t2ZWN0b3JdLnZlY3RvciwKLQkgICAgICAgICAgICAgICAgICBpZ2J2Zl9tc2l4X290aGVyLCAwLCBuZXRkZXYtPm5hbWUsIG5ldGRldik7CisJCQkgIGlnYnZmX21zaXhfb3RoZXIsIDAsIG5ldGRldi0+bmFtZSwgbmV0ZGV2KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtMTEzMCw2ICsxMTM0LDcgQEAKIAogLyoqCiAgKiBpZ2J2Zl9yZXF1ZXN0X2lycSAtIGluaXRpYWxpemUgaW50ZXJydXB0cworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKgogICogQXR0ZW1wdHMgdG8gY29uZmlndXJlIGludGVycnVwdHMgdXNpbmcgdGhlIGJlc3QgYXZhaWxhYmxlCiAgKiBjYXBhYmlsaXRpZXMgb2YgdGhlIGhhcmR3YXJlIGFuZCBrZXJuZWwuCkBAIC0xMTQ2LDcgKzExNTEsNyBAQAogCQlyZXR1cm4gZXJyOwogCiAJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCSAgICAgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBpbnRlcnJ1cHQsIEVycm9yOiAlZFxuIiwgZXJyKTsKKwkJIlVuYWJsZSB0byBhbGxvY2F0ZSBpbnRlcnJ1cHQsIEVycm9yOiAlZFxuIiwgZXJyKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0xMTY0LDYgKzExNjksNyBAQAogCiAvKioKICAqIGlnYnZmX2lycV9kaXNhYmxlIC0gTWFzayBvZmYgaW50ZXJydXB0IGdlbmVyYXRpb24gb24gdGhlIE5JQworICogQGFkYXB0ZXI6IGJvYXJkIHByaXZhdGUgc3RydWN0dXJlCiAgKiovCiBzdGF0aWMgdm9pZCBpZ2J2Zl9pcnFfZGlzYWJsZShzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlcikKIHsKQEAgLTExNzcsNiArMTE4Myw3IEBACiAKIC8qKgogICogaWdidmZfaXJxX2VuYWJsZSAtIEVuYWJsZSBkZWZhdWx0IGludGVycnVwdCBnZW5lcmF0aW9uIHNldHRpbmdzCisgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUKICAqKi8KIHN0YXRpYyB2b2lkIGlnYnZmX2lycV9lbmFibGUoc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CkBAIC0xMjUyLDcgKzEyNTksNyBAQAogCiAJaWYgKGh3LT5tYWMub3BzLnNldF92ZnRhKGh3LCB2aWQsIGZhbHNlKSkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCSAgICAgICAgIkZhaWxlZCB0byByZW1vdmUgdmxhbiBpZCAlZFxuIiwgdmlkKTsKKwkJCSJGYWlsZWQgdG8gcmVtb3ZlIHZsYW4gaWQgJWRcbiIsIHZpZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAljbGVhcl9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOwpAQCAtMTI5OCw3ICsxMzA1LDcgQEAKIAogCS8qIFR1cm4gb2ZmIFJlbGF4ZWQgT3JkZXJpbmcgb24gaGVhZCB3cml0ZS1iYWNrcy4gIFRoZSB3cml0ZWJhY2tzCiAJICogTVVTVCBiZSBkZWxpdmVyZWQgaW4gb3JkZXIgb3IgaXQgd2lsbCBjb21wbGV0ZWx5IHNjcmV3IHVwCi0JICogb3VyIGJvb2tlZXBpbmcuCisJICogb3VyIGJvb2trZWVwaW5nLgogCSAqLwogCWRjYV90eGN0cmwgPSBlcjMyKERDQV9UWENUUkwoMCkpOwogCWRjYV90eGN0cmwgJj0gfkUxMDAwX0RDQV9UWENUUkxfVFhfV0JfUk9fRU47CkBAIC0xMzI1LDE1ICsxMzMyLDE1IEBACiAJdTMyIHNycmN0bCA9IDA7CiAKIAlzcnJjdGwgJj0gfihFMTAwMF9TUlJDVExfREVTQ1RZUEVfTUFTSyB8Ci0JICAgICAgICAgICAgRTEwMDBfU1JSQ1RMX0JTSVpFSERSX01BU0sgfAotCSAgICAgICAgICAgIEUxMDAwX1NSUkNUTF9CU0laRVBLVF9NQVNLKTsKKwkJICAgIEUxMDAwX1NSUkNUTF9CU0laRUhEUl9NQVNLIHwKKwkJICAgIEUxMDAwX1NSUkNUTF9CU0laRVBLVF9NQVNLKTsKIAogCS8qIEVuYWJsZSBxdWV1ZSBkcm9wIHRvIGF2b2lkIGhlYWQgb2YgbGluZSBibG9ja2luZyAqLwogCXNycmN0bCB8PSBFMTAwMF9TUlJDVExfRFJPUF9FTjsKIAogCS8qIFNldHVwIGJ1ZmZlciBzaXplcyAqLwogCXNycmN0bCB8PSBBTElHTihhZGFwdGVyLT5yeF9idWZmZXJfbGVuLCAxMDI0KSA+PgotCSAgICAgICAgICBFMTAwMF9TUlJDVExfQlNJWkVQS1RfU0hJRlQ7CisJCSAgRTEwMDBfU1JSQ1RMX0JTSVpFUEtUX1NISUZUOwogCiAJaWYgKGFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPCAyMDQ4KSB7CiAJCWFkYXB0ZXItPnJ4X3BzX2hkcl9zaXplID0gMDsKQEAgLTEzNDEsNyArMTM0OCw3IEBACiAJfSBlbHNlIHsKIAkJYWRhcHRlci0+cnhfcHNfaGRyX3NpemUgPSAxMjg7CiAJCXNycmN0bCB8PSBhZGFwdGVyLT5yeF9wc19oZHJfc2l6ZSA8PAotCQkgICAgICAgICAgRTEwMDBfU1JSQ1RMX0JTSVpFSERSU0laRV9TSElGVDsKKwkJCSAgRTEwMDBfU1JSQ1RMX0JTSVpFSERSU0laRV9TSElGVDsKIAkJc3JyY3RsIHw9IEUxMDAwX1NSUkNUTF9ERVNDVFlQRV9IRFJfU1BMSVRfQUxXQVlTOwogCX0KIApAQCAtMTM2OSw4ICsxMzc2LDcgQEAKIAogCXJkbGVuID0gcnhfcmluZy0+Y291bnQgKiBzaXplb2YodW5pb24gZTEwMDBfYWR2X3J4X2Rlc2MpOwogCi0JLyoKLQkgKiBTZXR1cCB0aGUgSFcgUnggSGVhZCBhbmQgVGFpbCBEZXNjcmlwdG9yIFBvaW50ZXJzIGFuZAorCS8qIFNldHVwIHRoZSBIVyBSeCBIZWFkIGFuZCBUYWlsIERlc2NyaXB0b3IgUG9pbnRlcnMgYW5kCiAJICogdGhlIEJhc2UgYW5kIExlbmd0aCBvZiB0aGUgUnggRGVzY3JpcHRvciBSaW5nCiAJICovCiAJcmRiYSA9IHJ4X3JpbmctPmRtYTsKQEAgLTE0NDEsMTAgKzE0NDcsMTEgQEAKIAlpZ2J2Zl9zZXR1cF9zcnJjdGwoYWRhcHRlcik7CiAJaWdidmZfY29uZmlndXJlX3J4KGFkYXB0ZXIpOwogCWlnYnZmX2FsbG9jX3J4X2J1ZmZlcnMoYWRhcHRlci0+cnhfcmluZywKLQkgICAgICAgICAgICAgICAgICAgICAgIGlnYnZmX2Rlc2NfdW51c2VkKGFkYXB0ZXItPnJ4X3JpbmcpKTsKKwkJCSAgICAgICBpZ2J2Zl9kZXNjX3VudXNlZChhZGFwdGVyLT5yeF9yaW5nKSk7CiB9CiAKIC8qIGlnYnZmX3Jlc2V0IC0gYnJpbmcgdGhlIGhhcmR3YXJlIGludG8gYSBrbm93biBnb29kIHN0YXRlCisgKiBAYWRhcHRlcjogcHJpdmF0ZSBib2FyZCBzdHJ1Y3R1cmUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGJvb3RzIHRoZSBoYXJkd2FyZSBhbmQgZW5hYmxlcyBzb21lIHNldHRpbmdzIHRoYXQKICAqIHJlcXVpcmUgYSBjb25maWd1cmF0aW9uIGN5Y2xlIG9mIHRoZSBoYXJkd2FyZSAtIHRob3NlIGNhbm5vdCBiZQpAQCAtMTQ5NCw3ICsxNTAxLDYgQEAKIAlody0+bWFjLmdldF9saW5rX3N0YXR1cyA9IDE7CiAJbW9kX3RpbWVyKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lciwgamlmZmllcyArIDEpOwogCi0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTUwNCw4ICsxNTEwLDcgQEAKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiByeGRjdGwsIHR4ZGN0bDsKIAotCS8qCi0JICogc2lnbmFsIHRoYXQgd2UncmUgZG93biBzbyB0aGUgaW50ZXJydXB0IGhhbmRsZXIgZG9lcyBub3QKKwkvKiBzaWduYWwgdGhhdCB3ZSdyZSBkb3duIHNvIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBkb2VzIG5vdAogCSAqIHJlc2NoZWR1bGUgb3VyIHdhdGNoZG9nIHRpbWVyCiAJICovCiAJc2V0X2JpdChfX0lHQlZGX0RPV04sICZhZGFwdGVyLT5zdGF0ZSk7CkBAIC0xNTE0LDYgKzE1MTksNyBAQAogCXJ4ZGN0bCA9IGVyMzIoUlhEQ1RMKDApKTsKIAlldzMyKFJYRENUTCgwKSwgcnhkY3RsICYgfkUxMDAwX1JYRENUTF9RVUVVRV9FTkFCTEUpOwogCisJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CiAKIAkvKiBkaXNhYmxlIHRyYW5zbWl0cyBpbiB0aGUgaGFyZHdhcmUgKi8KQEAgLTE1MzAsOCArMTUzNiw2IEBACiAKIAlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIpOwogCi0JbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQogCS8qIHJlY29yZCB0aGUgc3RhdHMgYmVmb3JlIHJlc2V0Ki8KIAlpZ2J2Zl91cGRhdGVfc3RhdHMoYWRhcHRlcik7CiAKQEAgLTE1NDcsNyArMTU1MSw3IEBACiB7CiAJbWlnaHRfc2xlZXAoKTsKIAl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChfX0lHQlZGX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKLQkJbXNsZWVwKDEpOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CiAJaWdidmZfZG93bihhZGFwdGVyKTsKIAlpZ2J2Zl91cChhZGFwdGVyKTsKIAljbGVhcl9iaXQoX19JR0JWRl9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSk7CkBAIC0xNjYyLDggKzE2NjYsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gZXJyX3NldHVwX3J4OwogCi0JLyoKLQkgKiBiZWZvcmUgd2UgYWxsb2NhdGUgYW4gaW50ZXJydXB0LCB3ZSBtdXN0IGJlIHJlYWR5IHRvIGhhbmRsZSBpdC4KKwkvKiBiZWZvcmUgd2UgYWxsb2NhdGUgYW4gaW50ZXJydXB0LCB3ZSBtdXN0IGJlIHJlYWR5IHRvIGhhbmRsZSBpdC4KIAkgKiBTZXR0aW5nIERFQlVHX1NISVJRIGluIHRoZSBrZXJuZWwgbWFrZXMgaXQgZmlyZSBhbiBpbnRlcnJ1cHQKIAkgKiBhcyBzb29uIGFzIHdlIGNhbGwgcGNpX3JlcXVlc3RfaXJxLCBzbyB3ZSBoYXZlIHRvIHNldHVwIG91cgogCSAqIGNsZWFuX3J4IGhhbmRsZXIgYmVmb3JlIHdlIGRvIHNvLgpAQCAtMTcyNSw2ICsxNzI4LDcgQEAKIAogCXJldHVybiAwOwogfQorCiAvKioKICAqIGlnYnZmX3NldF9tYWMgLSBDaGFuZ2UgdGhlIEV0aGVybmV0IEFkZHJlc3Mgb2YgdGhlIE5JQwogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQpAQCAtMTc1MywxNSArMTc1NywxNSBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIFVQREFURV9WRl9DT1VOVEVSKHJlZywgbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJdTMyIGN1cnJlbnRfY291bnRlciA9IGVyMzIocmVnKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCWlmIChjdXJyZW50X2NvdW50ZXIgPCBhZGFwdGVyLT5zdGF0cy5sYXN0XyMjbmFtZSkgICAgICAgXAotCQkJYWRhcHRlci0+c3RhdHMubmFtZSArPSAweDEwMDAwMDAwMExMOyAgICAgICAgICAgXAotCQlhZGFwdGVyLT5zdGF0cy5sYXN0XyMjbmFtZSA9IGN1cnJlbnRfY291bnRlcjsgICAgICAgICAgIFwKLQkJYWRhcHRlci0+c3RhdHMubmFtZSAmPSAweEZGRkZGRkZGMDAwMDAwMDBMTDsgICAgICAgICAgICBcCi0JCWFkYXB0ZXItPnN0YXRzLm5hbWUgfD0gY3VycmVudF9jb3VudGVyOyAgICAgICAgICAgICAgICAgXAotCX0KKyNkZWZpbmUgVVBEQVRFX1ZGX0NPVU5URVIocmVnLCBuYW1lKSBcCit7IFwKKwl1MzIgY3VycmVudF9jb3VudGVyID0gZXIzMihyZWcpOyBcCisJaWYgKGN1cnJlbnRfY291bnRlciA8IGFkYXB0ZXItPnN0YXRzLmxhc3RfIyNuYW1lKSBcCisJCWFkYXB0ZXItPnN0YXRzLm5hbWUgKz0gMHgxMDAwMDAwMDBMTDsgXAorCWFkYXB0ZXItPnN0YXRzLmxhc3RfIyNuYW1lID0gY3VycmVudF9jb3VudGVyOyBcCisJYWRhcHRlci0+c3RhdHMubmFtZSAmPSAweEZGRkZGRkZGMDAwMDAwMDBMTDsgXAorCWFkYXB0ZXItPnN0YXRzLm5hbWUgfD0gY3VycmVudF9jb3VudGVyOyBcCit9CiAKIC8qKgogICogaWdidmZfdXBkYXRlX3N0YXRzIC0gVXBkYXRlIHRoZSBib2FyZCBzdGF0aXN0aWNzIGNvdW50ZXJzCkBAIC0xNzcyLDggKzE3NzYsNyBAQAogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhZGFwdGVyLT5wZGV2OwogCi0JLyoKLQkgKiBQcmV2ZW50IHN0YXRzIHVwZGF0ZSB3aGlsZSBhZGFwdGVyIGlzIGJlaW5nIHJlc2V0LCBsaW5rIGlzIGRvd24KKwkvKiBQcmV2ZW50IHN0YXRzIHVwZGF0ZSB3aGlsZSBhZGFwdGVyIGlzIGJlaW5nIHJlc2V0LCBsaW5rIGlzIGRvd24KIAkgKiBvciBpZiB0aGUgcGNpIGNvbm5lY3Rpb24gaXMgZG93bi4KIAkgKi8KIAlpZiAoYWRhcHRlci0+bGlua19zcGVlZCA9PSAwKQpAQCAtMTgzMiw3ICsxODM1LDcgQEAKICAqKi8KIHN0YXRpYyB2b2lkIGlnYnZmX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgaWdidmZfYWRhcHRlciAqKSBkYXRhOworCXN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBpZ2J2Zl9hZGFwdGVyICopZGF0YTsKIAogCS8qIERvIHRoZSByZXN0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQgKi8KIAlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT53YXRjaGRvZ190YXNrKTsKQEAgLTE4NDEsOCArMTg0NCw4IEBACiBzdGF0aWMgdm9pZCBpZ2J2Zl93YXRjaGRvZ190YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciA9IGNvbnRhaW5lcl9vZih3b3JrLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZ2J2Zl9hZGFwdGVyLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoZG9nX3Rhc2spOworCQkJCQkJICAgICBzdHJ1Y3QgaWdidmZfYWRhcHRlciwKKwkJCQkJCSAgICAgd2F0Y2hkb2dfdGFzayk7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAlzdHJ1Y3QgZTEwMDBfbWFjX2luZm8gKm1hYyA9ICZhZGFwdGVyLT5ody5tYWM7CiAJc3RydWN0IGlnYnZmX3JpbmcgKnR4X3JpbmcgPSBhZGFwdGVyLT50eF9yaW5nOwpAQCAtMTg1NSw4ICsxODU4LDggQEAKIAlpZiAobGluaykgewogCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkgewogCQkJbWFjLT5vcHMuZ2V0X2xpbmtfdXBfaW5mbygmYWRhcHRlci0+aHcsCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGFwdGVyLT5saW5rX3NwZWVkLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRhcHRlci0+bGlua19kdXBsZXgpOworCQkJCQkJICAmYWRhcHRlci0+bGlua19zcGVlZCwKKwkJCQkJCSAgJmFkYXB0ZXItPmxpbmtfZHVwbGV4KTsKIAkJCWlnYnZmX3ByaW50X2xpbmtfaW5mbyhhZGFwdGVyKTsKIAogCQkJbmV0aWZfY2Fycmllcl9vbihuZXRkZXYpOwpAQCAtMTg3NiwxMCArMTg3OSw5IEBACiAJCWlnYnZmX3VwZGF0ZV9zdGF0cyhhZGFwdGVyKTsKIAl9IGVsc2UgewogCQl0eF9wZW5kaW5nID0gKGlnYnZmX2Rlc2NfdW51c2VkKHR4X3JpbmcpICsgMSA8Ci0JCSAgICAgICAgICAgICAgdHhfcmluZy0+Y291bnQpOworCQkJICAgICAgdHhfcmluZy0+Y291bnQpOwogCQlpZiAodHhfcGVuZGluZykgewotCQkJLyoKLQkJCSAqIFdlJ3ZlIGxvc3QgbGluaywgc28gdGhlIGNvbnRyb2xsZXIgc3RvcHMgRE1BLAorCQkJLyogV2UndmUgbG9zdCBsaW5rLCBzbyB0aGUgY29udHJvbGxlciBzdG9wcyBETUEsCiAJCQkgKiBidXQgd2UndmUgZ290IHF1ZXVlZCBUeCB3b3JrIHRoYXQncyBuZXZlciBnb2luZwogCQkJICogdG8gZ2V0IGRvbmUsIHNvIHJlc2V0IGNvbnRyb2xsZXIgdG8gZmx1c2ggVHguCiAJCQkgKiAoRG8gdGhlIHJlc2V0IG91dHNpZGUgb2YgaW50ZXJydXB0IGNvbnRleHQpLgpAQCAtMTg5OCwxNSArMTkwMCwxNSBAQAogCQkJICByb3VuZF9qaWZmaWVzKGppZmZpZXMgKyAoMiAqIEhaKSkpOwogfQogCi0jZGVmaW5lIElHQlZGX1RYX0ZMQUdTX0NTVU0gICAgICAgICAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBJR0JWRl9UWF9GTEFHU19WTEFOICAgICAgICAgICAgIDB4MDAwMDAwMDIKLSNkZWZpbmUgSUdCVkZfVFhfRkxBR1NfVFNPICAgICAgICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIElHQlZGX1RYX0ZMQUdTX0lQVjQgICAgICAgICAgICAgMHgwMDAwMDAwOAotI2RlZmluZSBJR0JWRl9UWF9GTEFHU19WTEFOX01BU0sgICAgICAgIDB4ZmZmZjAwMDAKLSNkZWZpbmUgSUdCVkZfVFhfRkxBR1NfVkxBTl9TSElGVCAgICAgICAxNgorI2RlZmluZSBJR0JWRl9UWF9GTEFHU19DU1VNCQkweDAwMDAwMDAxCisjZGVmaW5lIElHQlZGX1RYX0ZMQUdTX1ZMQU4JCTB4MDAwMDAwMDIKKyNkZWZpbmUgSUdCVkZfVFhfRkxBR1NfVFNPCQkweDAwMDAwMDA0CisjZGVmaW5lIElHQlZGX1RYX0ZMQUdTX0lQVjQJCTB4MDAwMDAwMDgKKyNkZWZpbmUgSUdCVkZfVFhfRkxBR1NfVkxBTl9NQVNLCTB4ZmZmZjAwMDAKKyNkZWZpbmUgSUdCVkZfVFhfRkxBR1NfVkxBTl9TSElGVAkxNgogCiBzdGF0aWMgaW50IGlnYnZmX3RzbyhzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZ2J2Zl9yaW5nICp0eF9yaW5nLAorCQkgICAgIHN0cnVjdCBpZ2J2Zl9yaW5nICp0eF9yaW5nLAogCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiB0eF9mbGFncywgdTggKmhkcl9sZW4sCiAJCSAgICAgX19iZTE2IHByb3RvY29sKQogewpAQCAtMTkzMCwxNyArMTkzMiwxOCBAQAogCiAJaWYgKHByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgewogCQlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCiAJCWlwaC0+dG90X2xlbiA9IDA7CiAJCWlwaC0+Y2hlY2sgPSAwOwogCQl0Y3BfaGRyKHNrYiktPmNoZWNrID0gfmNzdW1fdGNwdWRwX21hZ2ljKGlwaC0+c2FkZHIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXBoLT5kYWRkciwgMCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUFBST1RPX1RDUCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKwkJCQkJCQkgaXBoLT5kYWRkciwgMCwKKwkJCQkJCQkgSVBQUk9UT19UQ1AsCisJCQkJCQkJIDApOwogCX0gZWxzZSBpZiAoc2tiX2lzX2dzb192Nihza2IpKSB7CiAJCWlwdjZfaGRyKHNrYiktPnBheWxvYWRfbGVuID0gMDsKIAkJdGNwX2hkcihza2IpLT5jaGVjayA9IH5jc3VtX2lwdjZfbWFnaWMoJmlwdjZfaGRyKHNrYiktPnNhZGRyLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIElQUFJPVE9fVENQLCAwKTsKKwkJCQkJCSAgICAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCisJCQkJCQkgICAgICAgMCwgSVBQUk9UT19UQ1AsIDApOwogCX0KIAogCWkgPSB0eF9yaW5nLT5uZXh0X3RvX3VzZTsKQEAgLTE5ODQsNyArMTk4Nyw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpZ2J2Zl90eF9jc3VtKHN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlnYnZmX3JpbmcgKnR4X3JpbmcsCisJCQkJIHN0cnVjdCBpZ2J2Zl9yaW5nICp0eF9yaW5nLAogCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgdHhfZmxhZ3MsCiAJCQkJIF9fYmUxNiBwcm90b2NvbCkKIHsKQEAgLTIwMDUsOCArMjAwOCw3IEBACiAJCWluZm8gfD0gKHNrYl9uZXR3b3JrX29mZnNldChza2IpIDw8IEUxMDAwX0FEVlRYRF9NQUNMRU5fU0hJRlQpOwogCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkKIAkJCWluZm8gfD0gKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYikgLQotCQkJICAgICAgICAgc2tiX25ldHdvcmtfaGVhZGVyKHNrYikpOwotCisJCQkJIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKIAogCQljb250ZXh0X2Rlc2MtPnZsYW5fbWFjaXBfbGVucyA9IGNwdV90b19sZTMyKGluZm8pOwogCkBAIC0yMDU1LDYgKzIwNTcsMTAgQEAKIAogCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKIAorCS8qIEhlcmJlcnQncyBvcmlnaW5hbCBwYXRjaCBoYWQ6CisJICogIHNtcF9tYl9fYWZ0ZXJfbmV0aWZfc3RvcF9xdWV1ZSgpOworCSAqIGJ1dCBzaW5jZSB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0LCBqdXN0IG9wZW4gY29kZSBpdC4KKwkgKi8KIAlzbXBfbWIoKTsKIAogCS8qIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4ganVzdCBpbiBjYXNlIHJvb20gaGFzIGJlZW4gbWFkZSBhdmFpbGFibGUgKi8KQEAgLTIwNjcsMTEgKzIwNzMsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBJR0JWRl9NQVhfVFhEX1BXUiAgICAgICAxNgotI2RlZmluZSBJR0JWRl9NQVhfREFUQV9QRVJfVFhEICAoMSA8PCBJR0JWRl9NQVhfVFhEX1BXUikKKyNkZWZpbmUgSUdCVkZfTUFYX1RYRF9QV1IJMTYKKyNkZWZpbmUgSUdCVkZfTUFYX0RBVEFfUEVSX1RYRAkoMSA8PCBJR0JWRl9NQVhfVFhEX1BXUikKIAogc3RhdGljIGlubGluZSBpbnQgaWdidmZfdHhfbWFwX2FkdihzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlnYnZmX3JpbmcgKnR4X3JpbmcsCisJCQkJICAgc3RydWN0IGlnYnZmX3JpbmcgKnR4X3JpbmcsCiAJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaWdidmZfYnVmZmVyICpidWZmZXJfaW5mbzsKQEAgLTIwOTMsNyArMjA5OSw2IEBACiAJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKCZwZGV2LT5kZXYsIGJ1ZmZlcl9pbmZvLT5kbWEpKQogCQlnb3RvIGRtYV9lcnJvcjsKIAotCiAJZm9yIChmID0gMDsgZiA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGYrKykgewogCQljb25zdCBzdHJ1Y3Qgc2tiX2ZyYWdfc3RydWN0ICpmcmFnOwogCkBAIC0yMTExLDcgKzIxMTYsNyBAQAogCQlidWZmZXJfaW5mby0+dGltZV9zdGFtcCA9IGppZmZpZXM7CiAJCWJ1ZmZlcl9pbmZvLT5tYXBwZWRfYXNfcGFnZSA9IHRydWU7CiAJCWJ1ZmZlcl9pbmZvLT5kbWEgPSBza2JfZnJhZ19kbWFfbWFwKCZwZGV2LT5kZXYsIGZyYWcsIDAsIGxlbiwKLQkJCQkJCURNQV9UT19ERVZJQ0UpOworCQkJCQkJICAgIERNQV9UT19ERVZJQ0UpOwogCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoJnBkZXYtPmRldiwgYnVmZmVyX2luZm8tPmRtYSkpCiAJCQlnb3RvIGRtYV9lcnJvcjsKIAl9CkBAIC0yMTMzLDcgKzIxMzgsNyBAQAogCiAJLyogY2xlYXIgdGltZXN0YW1wIGFuZCBkbWEgbWFwcGluZ3MgZm9yIHJlbWFpbmluZyBwb3J0aW9uIG9mIHBhY2tldCAqLwogCXdoaWxlIChjb3VudC0tKSB7Ci0JCWlmIChpPT0wKQorCQlpZiAoaSA9PSAwKQogCQkJaSArPSB0eF9yaW5nLT5jb3VudDsKIAkJaS0tOwogCQlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKQEAgLTIxNDQsMTAgKzIxNDksMTAgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGlnYnZmX3R4X3F1ZXVlX2FkdihzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlnYnZmX3JpbmcgKnR4X3JpbmcsCisJCQkJICAgICAgc3RydWN0IGlnYnZmX3JpbmcgKnR4X3JpbmcsCiAJCQkJICAgICAgaW50IHR4X2ZsYWdzLCBpbnQgY291bnQsCiAJCQkJICAgICAgdW5zaWduZWQgaW50IGZpcnN0LCB1MzIgcGF5bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBoZHJfbGVuKQorCQkJCSAgICAgIHU4IGhkcl9sZW4pCiB7CiAJdW5pb24gZTEwMDBfYWR2X3R4X2Rlc2MgKnR4X2Rlc2MgPSBOVUxMOwogCXN0cnVjdCBpZ2J2Zl9idWZmZXIgKmJ1ZmZlcl9pbmZvOwpAQCAtMjE1NSw3ICsyMTYwLDcgQEAKIAl1bnNpZ25lZCBpbnQgaTsKIAogCWNtZF90eXBlX2xlbiA9IChFMTAwMF9BRFZUWERfRFRZUF9EQVRBIHwgRTEwMDBfQURWVFhEX0RDTURfSUZDUyB8Ci0JICAgICAgICAgICAgICAgIEUxMDAwX0FEVlRYRF9EQ01EX0RFWFQpOworCQkJRTEwMDBfQURWVFhEX0RDTURfREVYVCk7CiAKIAlpZiAodHhfZmxhZ3MgJiBJR0JWRl9UWF9GTEFHU19WTEFOKQogCQljbWRfdHlwZV9sZW4gfD0gRTEwMDBfQURWVFhEX0RDTURfVkxFOwpAQCAtMjE4Miw3ICsyMTg3LDcgQEAKIAkJdHhfZGVzYyA9IElHQlZGX1RYX0RFU0NfQURWKCp0eF9yaW5nLCBpKTsKIAkJdHhfZGVzYy0+cmVhZC5idWZmZXJfYWRkciA9IGNwdV90b19sZTY0KGJ1ZmZlcl9pbmZvLT5kbWEpOwogCQl0eF9kZXNjLT5yZWFkLmNtZF90eXBlX2xlbiA9Ci0JCSAgICAgICAgIGNwdV90b19sZTMyKGNtZF90eXBlX2xlbiB8IGJ1ZmZlcl9pbmZvLT5sZW5ndGgpOworCQkJIGNwdV90b19sZTMyKGNtZF90eXBlX2xlbiB8IGJ1ZmZlcl9pbmZvLT5sZW5ndGgpOwogCQl0eF9kZXNjLT5yZWFkLm9saW5mb19zdGF0dXMgPSBjcHVfdG9fbGUzMihvbGluZm9fc3RhdHVzKTsKIAkJaSsrOwogCQlpZiAoaSA9PSB0eF9yaW5nLT5jb3VudCkKQEAgLTIxOTMsMTQgKzIxOTgsMTYgQEAKIAkvKiBGb3JjZSBtZW1vcnkgd3JpdGVzIHRvIGNvbXBsZXRlIGJlZm9yZSBsZXR0aW5nIGgvdwogCSAqIGtub3cgdGhlcmUgYXJlIG5ldyBkZXNjcmlwdG9ycyB0byBmZXRjaC4gIChPbmx5CiAJICogYXBwbGljYWJsZSBmb3Igd2Vhay1vcmRlcmVkIG1lbW9yeSBtb2RlbCBhcmNocywKLQkgKiBzdWNoIGFzIElBLTY0KS4gKi8KKwkgKiBzdWNoIGFzIElBLTY0KS4KKwkgKi8KIAl3bWIoKTsKIAogCXR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ZpcnN0XS5uZXh0X3RvX3dhdGNoID0gdHhfZGVzYzsKIAl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IGk7CiAJd3JpdGVsKGksIGFkYXB0ZXItPmh3Lmh3X2FkZHIgKyB0eF9yaW5nLT50YWlsKTsKIAkvKiB3ZSBuZWVkIHRoaXMgaWYgbW9yZSB0aGFuIG9uZSBwcm9jZXNzb3IgY2FuIHdyaXRlIHRvIG91ciB0YWlsCi0JICogYXQgYSB0aW1lLCBpdCBzeW5jcm9uaXplcyBJTyBvbiBJQTY0L0FsdGl4IHN5c3RlbXMgKi8KKwkgKiBhdCBhIHRpbWUsIGl0IHN5bmNocm9uaXplcyBJTyBvbiBJQTY0L0FsdGl4IHN5c3RlbXMKKwkgKi8KIAltbWlvd2IoKTsKIH0KIApAQCAtMjIyNSwxMSArMjIzMiwxMCBAQAogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KIAotCS8qCi0JICogbmVlZDogY291bnQgKyA0IGRlc2MgZ2FwIHRvIGtlZXAgdGFpbCBmcm9tIHRvdWNoaW5nCi0gICAgICAgICAqICAgICAgICsgMiBkZXNjIGdhcCB0byBrZWVwIHRhaWwgZnJvbSB0b3VjaGluZyBoZWFkLAotICAgICAgICAgKiAgICAgICArIDEgZGVzYyBmb3Igc2tiLT5kYXRhLAotICAgICAgICAgKiAgICAgICArIDEgZGVzYyBmb3IgY29udGV4dCBkZXNjcmlwdG9yLAorCS8qIG5lZWQ6IGNvdW50ICsgNCBkZXNjIGdhcCB0byBrZWVwIHRhaWwgZnJvbSB0b3VjaGluZworCSAqICAgICAgICsgMiBkZXNjIGdhcCB0byBrZWVwIHRhaWwgZnJvbSB0b3VjaGluZyBoZWFkLAorCSAqICAgICAgICsgMSBkZXNjIGZvciBza2ItPmRhdGEsCisJICogICAgICAgKyAxIGRlc2MgZm9yIGNvbnRleHQgZGVzY3JpcHRvciwKIAkgKiBoZWFkLCBvdGhlcndpc2UgdHJ5IG5leHQgdGltZQogCSAqLwogCWlmIChpZ2J2Zl9tYXliZV9zdG9wX3R4KG5ldGRldiwgc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyArIDQpKSB7CkBAIC0yMjU4LDExICsyMjY0LDEwIEBACiAJaWYgKHRzbykKIAkJdHhfZmxhZ3MgfD0gSUdCVkZfVFhfRkxBR1NfVFNPOwogCWVsc2UgaWYgKGlnYnZmX3R4X2NzdW0oYWRhcHRlciwgdHhfcmluZywgc2tiLCB0eF9mbGFncywgcHJvdG9jb2wpICYmCi0JICAgICAgICAgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKQorCQkgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKQogCQl0eF9mbGFncyB8PSBJR0JWRl9UWF9GTEFHU19DU1VNOwogCi0JLyoKLQkgKiBjb3VudCByZWZsZWN0cyBkZXNjcmlwdG9ycyBtYXBwZWQsIGlmIDAgdGhlbiBtYXBwaW5nIGVycm9yCisJLyogY291bnQgcmVmbGVjdHMgZGVzY3JpcHRvcnMgbWFwcGVkLCBpZiAwIHRoZW4gbWFwcGluZyBlcnJvcgogCSAqIGhhcyBvY2N1cnJlZCBhbmQgd2UgbmVlZCB0byByZXdpbmQgdGhlIGRlc2NyaXB0b3IgcXVldWUKIAkgKi8KIAljb3VudCA9IGlnYnZmX3R4X21hcF9hZHYoYWRhcHRlciwgdHhfcmluZywgc2tiKTsKQEAgLTIzMTMsNiArMjMxOCw3IEBACiBzdGF0aWMgdm9pZCBpZ2J2Zl9yZXNldF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlcjsKKwogCWFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGlnYnZmX2FkYXB0ZXIsIHJlc2V0X3Rhc2spOwogCiAJaWdidmZfcmVpbml0X2xvY2tlZChhZGFwdGVyKTsKQEAgLTIzNTYsMTQgKzIzNjIsMTMgQEAKIAl9CiAKIAl3aGlsZSAodGVzdF9hbmRfc2V0X2JpdChfX0lHQlZGX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKSkKLQkJbXNsZWVwKDEpOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CiAJLyogaWdidmZfZG93biBoYXMgYSBkZXBlbmRlbmN5IG9uIG1heF9mcmFtZV9zaXplICovCiAJYWRhcHRlci0+bWF4X2ZyYW1lX3NpemUgPSBtYXhfZnJhbWU7CiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJaWdidmZfZG93bihhZGFwdGVyKTsKIAotCS8qCi0JICogTk9URTogbmV0ZGV2X2FsbG9jX3NrYiByZXNlcnZlcyAxNiBieXRlcywgYW5kIHR5cGljYWxseSBORVRfSVBfQUxJR04KKwkvKiBOT1RFOiBuZXRkZXZfYWxsb2Nfc2tiIHJlc2VydmVzIDE2IGJ5dGVzLCBhbmQgdHlwaWNhbGx5IE5FVF9JUF9BTElHTgogCSAqIG1lYW5zIHdlIHJlc2VydmUgMiBtb3JlLCB0aGlzIHB1c2hlcyB1cyB0byBhbGxvY2F0ZSBmcm9tIHRoZSBuZXh0CiAJICogbGFyZ2VyIHNsYWIgc2l6ZS4KIAkgKiBpLmUuIFJYQlVGRkVSXzIwNDggLS0+IHNpemUtNDA5NiBzbGFiCkBAIC0yMzgyLDE1ICsyMzg3LDE0IEBACiAJCWFkYXB0ZXItPnJ4X2J1ZmZlcl9sZW4gPSBQQUdFX1NJWkUgLyAyOwogI2VuZGlmCiAKLQogCS8qIGFkanVzdCBhbGxvY2F0aW9uIGlmIExQRSBwcm90ZWN0cyB1cywgYW5kIHdlIGFyZW4ndCB1c2luZyBTQlAgKi8KIAlpZiAoKG1heF9mcmFtZSA9PSBFVEhfRlJBTUVfTEVOICsgRVRIX0ZDU19MRU4pIHx8Ci0JICAgICAobWF4X2ZyYW1lID09IEVUSF9GUkFNRV9MRU4gKyBWTEFOX0hMRU4gKyBFVEhfRkNTX0xFTikpCisJICAgIChtYXhfZnJhbWUgPT0gRVRIX0ZSQU1FX0xFTiArIFZMQU5fSExFTiArIEVUSF9GQ1NfTEVOKSkKIAkJYWRhcHRlci0+cnhfYnVmZmVyX2xlbiA9IEVUSF9GUkFNRV9MRU4gKyBWTEFOX0hMRU4gKwotCQkgICAgICAgICAgICAgICAgICAgICAgICAgRVRIX0ZDU19MRU47CisJCQkJCSBFVEhfRkNTX0xFTjsKIAogCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJjaGFuZ2luZyBNVFUgZnJvbSAlZCB0byAlZFxuIiwKLQkgICAgICAgICBuZXRkZXYtPm10dSwgbmV3X210dSk7CisJCSBuZXRkZXYtPm10dSwgbmV3X210dSk7CiAJbmV0ZGV2LT5tdHUgPSBuZXdfbXR1OwogCiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKQEAgLTI0NzcsOCArMjQ4MSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgotLyoKLSAqIFBvbGxpbmcgJ2ludGVycnVwdCcgLSB1c2VkIGJ5IHRoaW5ncyBsaWtlIG5ldGNvbnNvbGUgdG8gc2VuZCBza2JzCisvKiBQb2xsaW5nICdpbnRlcnJ1cHQnIC0gdXNlZCBieSB0aGluZ3MgbGlrZSBuZXRjb25zb2xlIHRvIHNlbmQgc2ticwogICogd2l0aG91dCBoYXZpbmcgdG8gcmUtZW5hYmxlIGludGVycnVwdHMuIEl0J3Mgbm90IGNhbGxlZCB3aGlsZQogICogdGhlIGludGVycnVwdCByb3V0aW5lIGlzIGV4ZWN1dGluZy4KICAqLwpAQCAtMjUwMyw3ICsyNTA2LDcgQEAKICAqIHRoaXMgZGV2aWNlIGhhcyBiZWVuIGRldGVjdGVkLgogICovCiBzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBpZ2J2Zl9pb19lcnJvcl9kZXRlY3RlZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBjaV9jaGFubmVsX3N0YXRlX3Qgc3RhdGUpCisJCQkJCQlwY2lfY2hhbm5lbF9zdGF0ZV90IHN0YXRlKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwpAQCAtMjU4Myw3ICsyNTg2LDcgQEAKIH0KIAogc3RhdGljIGludCBpZ2J2Zl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKKwkJCSAgICAgIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApAQCAtMjU5NiwyMSArMjU5OSwyMSBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGlnYnZmX25ldGRldl9vcHMgPSB7Ci0JLm5kb19vcGVuICAgICAgICAgICAgICAgICAgICAgICA9IGlnYnZmX29wZW4sCi0JLm5kb19zdG9wICAgICAgICAgICAgICAgICAgICAgICA9IGlnYnZmX2Nsb3NlLAotCS5uZG9fc3RhcnRfeG1pdCAgICAgICAgICAgICAgICAgPSBpZ2J2Zl94bWl0X2ZyYW1lLAotCS5uZG9fZ2V0X3N0YXRzICAgICAgICAgICAgICAgICAgPSBpZ2J2Zl9nZXRfc3RhdHMsCi0JLm5kb19zZXRfcnhfbW9kZQkJPSBpZ2J2Zl9zZXRfbXVsdGksCi0JLm5kb19zZXRfbWFjX2FkZHJlc3MgICAgICAgICAgICA9IGlnYnZmX3NldF9tYWMsCi0JLm5kb19jaGFuZ2VfbXR1ICAgICAgICAgICAgICAgICA9IGlnYnZmX2NoYW5nZV9tdHUsCi0JLm5kb19kb19pb2N0bCAgICAgICAgICAgICAgICAgICA9IGlnYnZmX2lvY3RsLAotCS5uZG9fdHhfdGltZW91dCAgICAgICAgICAgICAgICAgPSBpZ2J2Zl90eF90aW1lb3V0LAotCS5uZG9fdmxhbl9yeF9hZGRfdmlkICAgICAgICAgICAgPSBpZ2J2Zl92bGFuX3J4X2FkZF92aWQsCi0JLm5kb192bGFuX3J4X2tpbGxfdmlkICAgICAgICAgICA9IGlnYnZmX3ZsYW5fcnhfa2lsbF92aWQsCisJLm5kb19vcGVuCQk9IGlnYnZmX29wZW4sCisJLm5kb19zdG9wCQk9IGlnYnZmX2Nsb3NlLAorCS5uZG9fc3RhcnRfeG1pdAkJPSBpZ2J2Zl94bWl0X2ZyYW1lLAorCS5uZG9fZ2V0X3N0YXRzCQk9IGlnYnZmX2dldF9zdGF0cywKKwkubmRvX3NldF9yeF9tb2RlCT0gaWdidmZfc2V0X211bHRpLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gaWdidmZfc2V0X21hYywKKwkubmRvX2NoYW5nZV9tdHUJCT0gaWdidmZfY2hhbmdlX210dSwKKwkubmRvX2RvX2lvY3RsCQk9IGlnYnZmX2lvY3RsLAorCS5uZG9fdHhfdGltZW91dAkJPSBpZ2J2Zl90eF90aW1lb3V0LAorCS5uZG9fdmxhbl9yeF9hZGRfdmlkCT0gaWdidmZfdmxhbl9yeF9hZGRfdmlkLAorCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IGlnYnZmX3ZsYW5fcnhfa2lsbF92aWQsCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKLQkubmRvX3BvbGxfY29udHJvbGxlciAgICAgICAgICAgID0gaWdidmZfbmV0cG9sbCwKKwkubmRvX3BvbGxfY29udHJvbGxlcgk9IGlnYnZmX25ldHBvbGwsCiAjZW5kaWYKLQkubmRvX3NldF9mZWF0dXJlcyAgICAgICAgICAgICAgID0gaWdidmZfc2V0X2ZlYXR1cmVzLAorCS5uZG9fc2V0X2ZlYXR1cmVzCT0gaWdidmZfc2V0X2ZlYXR1cmVzLAogfTsKIAogLyoqCkBAIC0yNjQ1LDggKzI2NDgsOCBAQAogCX0gZWxzZSB7CiAJCWVyciA9IGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CiAJCWlmIChlcnIpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHVzYWJsZSBETUEgIgotCQkJICAgICAgICAiY29uZmlndXJhdGlvbiwgYWJvcnRpbmdcbiIpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJObyB1c2FibGUgRE1BIGNvbmZpZ3VyYXRpb24sIGFib3J0aW5nXG4iKTsKIAkJCWdvdG8gZXJyX2RtYTsKIAkJfQogCX0KQEAgLTI2ODYsNyArMjY4OSw3IEBACiAKIAllcnIgPSAtRUlPOwogCWFkYXB0ZXItPmh3Lmh3X2FkZHIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKSwKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwkJCQkgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKIAogCWlmICghYWRhcHRlci0+aHcuaHdfYWRkcikKIAkJZ290byBlcnJfaW9yZW1hcDsKQEAgLTI3MTIsMTYgKzI3MTUsMTYgQEAKIAlhZGFwdGVyLT5iZF9udW1iZXIgPSBjYXJkc19mb3VuZCsrOwogCiAJbmV0ZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfAotCSAgICAgICAgICAgICAgICAgICBORVRJRl9GX0lQX0NTVU0gfAorCQkJICAgTkVUSUZfRl9JUF9DU1VNIHwKIAkJCSAgIE5FVElGX0ZfSVBWNl9DU1VNIHwKIAkJCSAgIE5FVElGX0ZfVFNPIHwKIAkJCSAgIE5FVElGX0ZfVFNPNiB8CiAJCQkgICBORVRJRl9GX1JYQ1NVTTsKIAogCW5ldGRldi0+ZmVhdHVyZXMgPSBuZXRkZXYtPmh3X2ZlYXR1cmVzIHwKLQkgICAgICAgICAgICAgICAgICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfAotCSAgICAgICAgICAgICAgICAgICBORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWCB8Ci0JICAgICAgICAgICAgICAgICAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUjsKKwkJCSAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwKKwkJCSAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYIHwKKwkJCSAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUjsKIAogCWlmIChwY2lfdXNpbmdfZGFjKQogCQluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSElHSERNQTsKQEAgLTI3NDIsNyArMjc0NSw4IEBACiAJCWlmIChlcnIpCiAJCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiRXJyb3IgcmVhZGluZyBNQUMgYWRkcmVzcy5cbiIpOwogCQllbHNlIGlmIChpc196ZXJvX2V0aGVyX2FkZHIoYWRhcHRlci0+aHcubWFjLmFkZHIpKQotCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIk1BQyBhZGRyZXNzIG5vdCBhc3NpZ25lZCBieSBhZG1pbmlzdHJhdG9yLlxuIik7CisJCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJCSAiTUFDIGFkZHJlc3Mgbm90IGFzc2lnbmVkIGJ5IGFkbWluaXN0cmF0b3IuXG4iKTsKIAkJbWVtY3B5KG5ldGRldi0+ZGV2X2FkZHIsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyLAogCQkgICAgICAgbmV0ZGV2LT5hZGRyX2xlbik7CiAJfQpAQCAtMjc1MSwxMSArMjc1NSwxMSBAQAogCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiQXNzaWduaW5nIHJhbmRvbSBNQUMgYWRkcmVzcy5cbiIpOwogCQlldGhfaHdfYWRkcl9yYW5kb20obmV0ZGV2KTsKIAkJbWVtY3B5KGFkYXB0ZXItPmh3Lm1hYy5hZGRyLCBuZXRkZXYtPmRldl9hZGRyLAotCQkJbmV0ZGV2LT5hZGRyX2xlbik7CisJCSAgICAgICBuZXRkZXYtPmFkZHJfbGVuKTsKIAl9CiAKIAlzZXR1cF90aW1lcigmYWRhcHRlci0+d2F0Y2hkb2dfdGltZXIsICZpZ2J2Zl93YXRjaGRvZywKLQkgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgYWRhcHRlcik7CisJCSAgICAodW5zaWduZWQgbG9uZylhZGFwdGVyKTsKIAogCUlOSVRfV09SSygmYWRhcHRlci0+cmVzZXRfdGFzaywgaWdidmZfcmVzZXRfdGFzayk7CiAJSU5JVF9XT1JLKCZhZGFwdGVyLT53YXRjaGRvZ190YXNrLCBpZ2J2Zl93YXRjaGRvZ190YXNrKTsKQEAgLTI4MTgsOCArMjgyMiw3IEBACiAJc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAKLQkvKgotCSAqIFRoZSB3YXRjaGRvZyB0aW1lciBtYXkgYmUgcmVzY2hlZHVsZWQsIHNvIGV4cGxpY2l0bHkKKwkvKiBUaGUgd2F0Y2hkb2cgdGltZXIgbWF5IGJlIHJlc2NoZWR1bGVkLCBzbyBleHBsaWNpdGx5CiAJICogZGlzYWJsZSBpdCBmcm9tIGJlaW5nIHJlc2NoZWR1bGVkLgogCSAqLwogCXNldF9iaXQoX19JR0JWRl9ET1dOLCAmYWRhcHRlci0+c3RhdGUpOwpAQCAtMjgzMiw5ICsyODM1LDggQEAKIAogCWlnYnZmX3Jlc2V0X2ludGVycnVwdF9jYXBhYmlsaXR5KGFkYXB0ZXIpOwogCi0JLyoKLQkgKiBpdCBpcyBpbXBvcnRhbnQgdG8gZGVsZXRlIHRoZSBuYXBpIHN0cnVjdCBwcmlvciB0byBmcmVlaW5nIHRoZQotCSAqIHJ4IHJpbmcgc28gdGhhdCB5b3UgZG8gbm90IGVuZCB1cCB3aXRoIG51bGwgcG9pbnRlciByZWZzCisJLyogaXQgaXMgaW1wb3J0YW50IHRvIGRlbGV0ZSB0aGUgTkFQSSBzdHJ1Y3QgcHJpb3IgdG8gZnJlZWluZyB0aGUKKwkgKiBSeCByaW5nIHNvIHRoYXQgeW91IGRvIG5vdCBlbmQgdXAgd2l0aCBudWxsIHBvaW50ZXIgcmVmcwogCSAqLwogCW5ldGlmX25hcGlfZGVsKCZhZGFwdGVyLT5yeF9yaW5nLT5uYXBpKTsKIAlrZnJlZShhZGFwdGVyLT50eF9yaW5nKTsKQEAgLTI4NjYsMTcgKzI4NjgsMTcgQEAKIAogLyogUENJIERldmljZSBBUEkgRHJpdmVyICovCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaWdidmZfZHJpdmVyID0gewotCS5uYW1lICAgICA9IGlnYnZmX2RyaXZlcl9uYW1lLAotCS5pZF90YWJsZSA9IGlnYnZmX3BjaV90YmwsCi0JLnByb2JlICAgID0gaWdidmZfcHJvYmUsCi0JLnJlbW92ZSAgID0gaWdidmZfcmVtb3ZlLAorCS5uYW1lCQk9IGlnYnZmX2RyaXZlcl9uYW1lLAorCS5pZF90YWJsZQk9IGlnYnZmX3BjaV90YmwsCisJLnByb2JlCQk9IGlnYnZmX3Byb2JlLAorCS5yZW1vdmUJCT0gaWdidmZfcmVtb3ZlLAogI2lmZGVmIENPTkZJR19QTQogCS8qIFBvd2VyIE1hbmFnZW1lbnQgSG9va3MgKi8KLQkuc3VzcGVuZCAgPSBpZ2J2Zl9zdXNwZW5kLAotCS5yZXN1bWUgICA9IGlnYnZmX3Jlc3VtZSwKKwkuc3VzcGVuZAk9IGlnYnZmX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBpZ2J2Zl9yZXN1bWUsCiAjZW5kaWYKLQkuc2h1dGRvd24gPSBpZ2J2Zl9zaHV0ZG93biwKLQkuZXJyX2hhbmRsZXIgPSAmaWdidmZfZXJyX2hhbmRsZXIKKwkuc2h1dGRvd24JPSBpZ2J2Zl9zaHV0ZG93biwKKwkuZXJyX2hhbmRsZXIJPSAmaWdidmZfZXJyX2hhbmRsZXIKIH07CiAKIC8qKgpAQCAtMjg4OCw2ICsyODkwLDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGlnYnZmX2luaXRfbW9kdWxlKHZvaWQpCiB7CiAJaW50IHJldDsKKwogCXByX2luZm8oIiVzIC0gdmVyc2lvbiAlc1xuIiwgaWdidmZfZHJpdmVyX3N0cmluZywgaWdidmZfZHJpdmVyX3ZlcnNpb24pOwogCXByX2luZm8oIiVzXG4iLCBpZ2J2Zl9jb3B5cmlnaHQpOwogCkBAIC0yOTA5LDcgKzI5MTIsNiBAQAogfQogbW9kdWxlX2V4aXQoaWdidmZfZXhpdF9tb2R1bGUpOwogCi0KIE1PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uLCA8ZTEwMDAtZGV2ZWxAbGlzdHMuc291cmNlZm9yZ2UubmV0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbChSKSBHaWdhYml0IFZpcnR1YWwgRnVuY3Rpb24gTmV0d29yayBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL3JlZ3MuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL3JlZ3MuaAppbmRleCA3ZGM2MzQxLi44NmE3YzEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvcmVncy5oCkBAIC0xMyw4ICsxMyw3IEBACiAgIG1vcmUgZGV0YWlscy4KIAogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIAogICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgpAQCAtMjgsODEgKzI3LDgxIEBACiAjaWZuZGVmIF9FMTAwMF9SRUdTX0hfCiAjZGVmaW5lIF9FMTAwMF9SRUdTX0hfCiAKLSNkZWZpbmUgRTEwMDBfQ1RSTCAgICAgIDB4MDAwMDAgLyogRGV2aWNlIENvbnRyb2wgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9TVEFUVVMgICAgMHgwMDAwOCAvKiBEZXZpY2UgU3RhdHVzIC0gUk8gKi8KLSNkZWZpbmUgRTEwMDBfSVRSICAgICAgIDB4MDAwQzQgLyogSW50ZXJydXB0IFRocm90dGxpbmcgUmF0ZSAtIFJXICovCi0jZGVmaW5lIEUxMDAwX0VJQ1IgICAgICAweDAxNTgwIC8qIEV4dC4gSW50ZXJydXB0IENhdXNlIFJlYWQgLSBSL2NsciAqLwotI2RlZmluZSBFMTAwMF9FSVRSKF9uKSAgKDB4MDE2ODAgKyAoMHg0ICogKF9uKSkpCi0jZGVmaW5lIEUxMDAwX0VJQ1MgICAgICAweDAxNTIwIC8qIEV4dC4gSW50ZXJydXB0IENhdXNlIFNldCAtIFcwICovCi0jZGVmaW5lIEUxMDAwX0VJTVMgICAgICAweDAxNTI0IC8qIEV4dC4gSW50ZXJydXB0IE1hc2sgU2V0L1JlYWQgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9FSU1DICAgICAgMHgwMTUyOCAvKiBFeHQuIEludGVycnVwdCBNYXNrIENsZWFyIC0gV08gKi8KLSNkZWZpbmUgRTEwMDBfRUlBQyAgICAgIDB4MDE1MkMgLyogRXh0LiBJbnRlcnJ1cHQgQXV0byBDbGVhciAtIFJXICovCi0jZGVmaW5lIEUxMDAwX0VJQU0gICAgICAweDAxNTMwIC8qIEV4dC4gSW50ZXJydXB0IEFjayBBdXRvIENsZWFyIE1hc2sgLSBSVyAqLwotI2RlZmluZSBFMTAwMF9JVkFSMCAgICAgMHgwMTcwMCAvKiBJbnRlcnJ1cHQgVmVjdG9yIEFsbG9jYXRpb24gKGFycmF5KSAtIFJXICovCi0jZGVmaW5lIEUxMDAwX0lWQVJfTUlTQyAweDAxNzQwIC8qIElWQVIgZm9yICJvdGhlciIgY2F1c2VzIC0gUlcgKi8KLS8qCi0gKiBDb252ZW5pZW5jZSBtYWNyb3MKKyNkZWZpbmUgRTEwMDBfQ1RSTAkweDAwMDAwIC8qIERldmljZSBDb250cm9sIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfU1RBVFVTCTB4MDAwMDggLyogRGV2aWNlIFN0YXR1cyAtIFJPICovCisjZGVmaW5lIEUxMDAwX0lUUgkweDAwMEM0IC8qIEludGVycnVwdCBUaHJvdHRsaW5nIFJhdGUgLSBSVyAqLworI2RlZmluZSBFMTAwMF9FSUNSCTB4MDE1ODAgLyogRXh0LiBJbnRlcnJ1cHQgQ2F1c2UgUmVhZCAtIFIvY2xyICovCisjZGVmaW5lIEUxMDAwX0VJVFIoX24pCSgweDAxNjgwICsgKDB4NCAqIChfbikpKQorI2RlZmluZSBFMTAwMF9FSUNTCTB4MDE1MjAgLyogRXh0LiBJbnRlcnJ1cHQgQ2F1c2UgU2V0IC0gVzAgKi8KKyNkZWZpbmUgRTEwMDBfRUlNUwkweDAxNTI0IC8qIEV4dC4gSW50ZXJydXB0IE1hc2sgU2V0L1JlYWQgLSBSVyAqLworI2RlZmluZSBFMTAwMF9FSU1DCTB4MDE1MjggLyogRXh0LiBJbnRlcnJ1cHQgTWFzayBDbGVhciAtIFdPICovCisjZGVmaW5lIEUxMDAwX0VJQUMJMHgwMTUyQyAvKiBFeHQuIEludGVycnVwdCBBdXRvIENsZWFyIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfRUlBTQkweDAxNTMwIC8qIEV4dC4gSW50ZXJydXB0IEFjayBBdXRvIENsZWFyIE1hc2sgLSBSVyAqLworI2RlZmluZSBFMTAwMF9JVkFSMAkweDAxNzAwIC8qIEludGVycnVwdCBWZWN0b3IgQWxsb2NhdGlvbiAoYXJyYXkpIC0gUlcgKi8KKyNkZWZpbmUgRTEwMDBfSVZBUl9NSVNDCTB4MDE3NDAgLyogSVZBUiBmb3IgIm90aGVyIiBjYXVzZXMgLSBSVyAqLworCisvKiBDb252ZW5pZW5jZSBtYWNyb3MKICAqCiAgKiBOb3RlOiAiX24iIGlzIHRoZSBxdWV1ZSBudW1iZXIgb2YgdGhlIHJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4gdG8uCiAgKgogICogRXhhbXBsZSB1c2FnZToKICAqIEUxMDAwX1JEQkFMX1JFRyhjdXJyZW50X3J4X3F1ZXVlKQogICovCi0jZGVmaW5lIEUxMDAwX1JEQkFMKF9uKSAgICAgICgoX24pIDwgNCA/ICgweDAyODAwICsgKChfbikgKiAweDEwMCkpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwQzAwMCArICgoX24pICogMHg0MCkpKQotI2RlZmluZSBFMTAwMF9SREJBSChfbikgICAgICAoKF9uKSA8IDQgPyAoMHgwMjgwNCArICgoX24pICogMHgxMDApKSA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MEMwMDQgKyAoKF9uKSAqIDB4NDApKSkKLSNkZWZpbmUgRTEwMDBfUkRMRU4oX24pICAgICAgKChfbikgPCA0ID8gKDB4MDI4MDggKyAoKF9uKSAqIDB4MTAwKSkgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDBDMDA4ICsgKChfbikgKiAweDQwKSkpCi0jZGVmaW5lIEUxMDAwX1NSUkNUTChfbikgICAgICgoX24pIDwgNCA/ICgweDAyODBDICsgKChfbikgKiAweDEwMCkpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwQzAwQyArICgoX24pICogMHg0MCkpKQotI2RlZmluZSBFMTAwMF9SREgoX24pICAgICAgICAoKF9uKSA8IDQgPyAoMHgwMjgxMCArICgoX24pICogMHgxMDApKSA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MEMwMTAgKyAoKF9uKSAqIDB4NDApKSkKLSNkZWZpbmUgRTEwMDBfUkRUKF9uKSAgICAgICAgKChfbikgPCA0ID8gKDB4MDI4MTggKyAoKF9uKSAqIDB4MTAwKSkgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDBDMDE4ICsgKChfbikgKiAweDQwKSkpCi0jZGVmaW5lIEUxMDAwX1JYRENUTChfbikgICAgICgoX24pIDwgNCA/ICgweDAyODI4ICsgKChfbikgKiAweDEwMCkpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwQzAyOCArICgoX24pICogMHg0MCkpKQotI2RlZmluZSBFMTAwMF9UREJBTChfbikgICAgICAoKF9uKSA8IDQgPyAoMHgwMzgwMCArICgoX24pICogMHgxMDApKSA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MEUwMDAgKyAoKF9uKSAqIDB4NDApKSkKLSNkZWZpbmUgRTEwMDBfVERCQUgoX24pICAgICAgKChfbikgPCA0ID8gKDB4MDM4MDQgKyAoKF9uKSAqIDB4MTAwKSkgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDBFMDA0ICsgKChfbikgKiAweDQwKSkpCi0jZGVmaW5lIEUxMDAwX1RETEVOKF9uKSAgICAgICgoX24pIDwgNCA/ICgweDAzODA4ICsgKChfbikgKiAweDEwMCkpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwRTAwOCArICgoX24pICogMHg0MCkpKQotI2RlZmluZSBFMTAwMF9UREgoX24pICAgICAgICAoKF9uKSA8IDQgPyAoMHgwMzgxMCArICgoX24pICogMHgxMDApKSA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MEUwMTAgKyAoKF9uKSAqIDB4NDApKSkKLSNkZWZpbmUgRTEwMDBfVERUKF9uKSAgICAgICAgKChfbikgPCA0ID8gKDB4MDM4MTggKyAoKF9uKSAqIDB4MTAwKSkgOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDBFMDE4ICsgKChfbikgKiAweDQwKSkpCi0jZGVmaW5lIEUxMDAwX1RYRENUTChfbikgICAgICgoX24pIDwgNCA/ICgweDAzODI4ICsgKChfbikgKiAweDEwMCkpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwRTAyOCArICgoX24pICogMHg0MCkpKQotI2RlZmluZSBFMTAwMF9EQ0FfVFhDVFJMKF9uKSAoMHgwMzgxNCArIChfbiA8PCA4KSkKLSNkZWZpbmUgRTEwMDBfRENBX1JYQ1RSTChfbikgKDB4MDI4MTQgKyAoX24gPDwgOCkpCi0jZGVmaW5lIEUxMDAwX1JBTChfaSkgICgoKF9pKSA8PSAxNSkgPyAoMHgwNTQwMCArICgoX2kpICogOCkpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDU0RTAgKyAoKF9pIC0gMTYpICogOCkpKQotI2RlZmluZSBFMTAwMF9SQUgoX2kpICAoKChfaSkgPD0gMTUpID8gKDB4MDU0MDQgKyAoKF9pKSAqIDgpKSA6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDA1NEU0ICsgKChfaSAtIDE2KSAqIDgpKSkKKyNkZWZpbmUgRTEwMDBfUkRCQUwoX24pCSgoX24pIDwgNCA/ICgweDAyODAwICsgKChfbikgKiAweDEwMCkpIDogXAorCQkJICgweDBDMDAwICsgKChfbikgKiAweDQwKSkpCisjZGVmaW5lIEUxMDAwX1JEQkFIKF9uKQkoKF9uKSA8IDQgPyAoMHgwMjgwNCArICgoX24pICogMHgxMDApKSA6IFwKKwkJCSAoMHgwQzAwNCArICgoX24pICogMHg0MCkpKQorI2RlZmluZSBFMTAwMF9SRExFTihfbikJKChfbikgPCA0ID8gKDB4MDI4MDggKyAoKF9uKSAqIDB4MTAwKSkgOiBcCisJCQkgKDB4MEMwMDggKyAoKF9uKSAqIDB4NDApKSkKKyNkZWZpbmUgRTEwMDBfU1JSQ1RMKF9uKQkoKF9uKSA8IDQgPyAoMHgwMjgwQyArICgoX24pICogMHgxMDApKSA6IFwKKwkJCQkgKDB4MEMwMEMgKyAoKF9uKSAqIDB4NDApKSkKKyNkZWZpbmUgRTEwMDBfUkRIKF9uKQkoKF9uKSA8IDQgPyAoMHgwMjgxMCArICgoX24pICogMHgxMDApKSA6IFwKKwkJCSAoMHgwQzAxMCArICgoX24pICogMHg0MCkpKQorI2RlZmluZSBFMTAwMF9SRFQoX24pCSgoX24pIDwgNCA/ICgweDAyODE4ICsgKChfbikgKiAweDEwMCkpIDogXAorCQkJICgweDBDMDE4ICsgKChfbikgKiAweDQwKSkpCisjZGVmaW5lIEUxMDAwX1JYRENUTChfbikJKChfbikgPCA0ID8gKDB4MDI4MjggKyAoKF9uKSAqIDB4MTAwKSkgOiBcCisJCQkJICgweDBDMDI4ICsgKChfbikgKiAweDQwKSkpCisjZGVmaW5lIEUxMDAwX1REQkFMKF9uKQkoKF9uKSA8IDQgPyAoMHgwMzgwMCArICgoX24pICogMHgxMDApKSA6IFwKKwkJCSAoMHgwRTAwMCArICgoX24pICogMHg0MCkpKQorI2RlZmluZSBFMTAwMF9UREJBSChfbikJKChfbikgPCA0ID8gKDB4MDM4MDQgKyAoKF9uKSAqIDB4MTAwKSkgOiBcCisJCQkgKDB4MEUwMDQgKyAoKF9uKSAqIDB4NDApKSkKKyNkZWZpbmUgRTEwMDBfVERMRU4oX24pCSgoX24pIDwgNCA/ICgweDAzODA4ICsgKChfbikgKiAweDEwMCkpIDogXAorCQkJICgweDBFMDA4ICsgKChfbikgKiAweDQwKSkpCisjZGVmaW5lIEUxMDAwX1RESChfbikJKChfbikgPCA0ID8gKDB4MDM4MTAgKyAoKF9uKSAqIDB4MTAwKSkgOiBcCisJCQkgKDB4MEUwMTAgKyAoKF9uKSAqIDB4NDApKSkKKyNkZWZpbmUgRTEwMDBfVERUKF9uKQkoKF9uKSA8IDQgPyAoMHgwMzgxOCArICgoX24pICogMHgxMDApKSA6IFwKKwkJCSAoMHgwRTAxOCArICgoX24pICogMHg0MCkpKQorI2RlZmluZSBFMTAwMF9UWERDVEwoX24pCSgoX24pIDwgNCA/ICgweDAzODI4ICsgKChfbikgKiAweDEwMCkpIDogXAorCQkJCSAoMHgwRTAyOCArICgoX24pICogMHg0MCkpKQorI2RlZmluZSBFMTAwMF9EQ0FfVFhDVFJMKF9uKQkoMHgwMzgxNCArIChfbiA8PCA4KSkKKyNkZWZpbmUgRTEwMDBfRENBX1JYQ1RSTChfbikJKDB4MDI4MTQgKyAoX24gPDwgOCkpCisjZGVmaW5lIEUxMDAwX1JBTChfaSkJKCgoX2kpIDw9IDE1KSA/ICgweDA1NDAwICsgKChfaSkgKiA4KSkgOiBcCisJCQkgKDB4MDU0RTAgKyAoKF9pIC0gMTYpICogOCkpKQorI2RlZmluZSBFMTAwMF9SQUgoX2kpCSgoKF9pKSA8PSAxNSkgPyAoMHgwNTQwNCArICgoX2kpICogOCkpIDogXAorCQkJICgweDA1NEU0ICsgKChfaSAtIDE2KSAqIDgpKSkKIAogLyogU3RhdGlzdGljcyByZWdpc3RlcnMgKi8KLSNkZWZpbmUgRTEwMDBfVkZHUFJDICAgIDB4MDBGMTAKLSNkZWZpbmUgRTEwMDBfVkZHT1JDICAgIDB4MDBGMTgKLSNkZWZpbmUgRTEwMDBfVkZNUFJDICAgIDB4MDBGM0MKLSNkZWZpbmUgRTEwMDBfVkZHUFRDICAgIDB4MDBGMTQKLSNkZWZpbmUgRTEwMDBfVkZHT1RDICAgIDB4MDBGMzQKLSNkZWZpbmUgRTEwMDBfVkZHT1RMQkMgIDB4MDBGNTAKLSNkZWZpbmUgRTEwMDBfVkZHUFRMQkMgIDB4MDBGNDQKLSNkZWZpbmUgRTEwMDBfVkZHT1JMQkMgIDB4MDBGNDgKLSNkZWZpbmUgRTEwMDBfVkZHUFJMQkMgIDB4MDBGNDAKKyNkZWZpbmUgRTEwMDBfVkZHUFJDCTB4MDBGMTAKKyNkZWZpbmUgRTEwMDBfVkZHT1JDCTB4MDBGMTgKKyNkZWZpbmUgRTEwMDBfVkZNUFJDCTB4MDBGM0MKKyNkZWZpbmUgRTEwMDBfVkZHUFRDCTB4MDBGMTQKKyNkZWZpbmUgRTEwMDBfVkZHT1RDCTB4MDBGMzQKKyNkZWZpbmUgRTEwMDBfVkZHT1RMQkMJMHgwMEY1MAorI2RlZmluZSBFMTAwMF9WRkdQVExCQwkweDAwRjQ0CisjZGVmaW5lIEUxMDAwX1ZGR09STEJDCTB4MDBGNDgKKyNkZWZpbmUgRTEwMDBfVkZHUFJMQkMJMHgwMEY0MAogCiAvKiBUaGVzZSBhY3QgcGVyIFZGIHNvIGFuIGFycmF5IGZyaWVuZGx5IG1hY3JvIGlzIHVzZWQgKi8KLSNkZWZpbmUgRTEwMDBfVjJQTUFJTEJPWChfbikgICAoMHgwMEM0MCArICg0ICogKF9uKSkpCi0jZGVmaW5lIEUxMDAwX1ZNQk1FTShfbikgICAgICAgKDB4MDA4MDAgKyAoNjQgKiAoX24pKSkKKyNkZWZpbmUgRTEwMDBfVjJQTUFJTEJPWChfbikJKDB4MDBDNDAgKyAoNCAqIChfbikpKQorI2RlZmluZSBFMTAwMF9WTUJNRU0oX24pCSgweDAwODAwICsgKDY0ICogKF9uKSkpCiAKIC8qIERlZmluZSBtYWNyb3MgZm9yIGhhbmRsaW5nIHJlZ2lzdGVycyAqLwotI2RlZmluZSBlcjMyKHJlZykgcmVhZGwoaHctPmh3X2FkZHIgKyBFMTAwMF8jI3JlZykKLSNkZWZpbmUgZXczMihyZWcsIHZhbCkgd3JpdGVsKCh2YWwpLCBody0+aHdfYWRkciArICBFMTAwMF8jI3JlZykKKyNkZWZpbmUgZXIzMihyZWcpCXJlYWRsKGh3LT5od19hZGRyICsgRTEwMDBfIyNyZWcpCisjZGVmaW5lIGV3MzIocmVnLCB2YWwpCXdyaXRlbCgodmFsKSwgaHctPmh3X2FkZHIgKyAgRTEwMDBfIyNyZWcpCiAjZGVmaW5lIGFycmF5X2VyMzIocmVnLCBvZmZzZXQpIFwKIAlyZWFkbChody0+aHdfYWRkciArIEUxMDAwXyMjcmVnICsgKG9mZnNldCA8PCAyKSkKICNkZWZpbmUgYXJyYXlfZXczMihyZWcsIG9mZnNldCwgdmFsKSBcCiAJd3JpdGVsKCh2YWwpLCBody0+aHdfYWRkciArICBFMTAwMF8jI3JlZyArIChvZmZzZXQgPDwgMikpCi0jZGVmaW5lIGUxZV9mbHVzaCgpIGVyMzIoU1RBVFVTKQorI2RlZmluZSBlMWVfZmx1c2goKQllcjMyKFNUQVRVUykKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi92Zi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvdmYuYwppbmRleCA5NTVhZDhjLi5hMTNiYWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi92Zi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL3ZmLmMKQEAgLTEzLDggKzEzLDcgQEAKICAgbW9yZSBkZXRhaWxzLgogCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogCiAgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCiAgIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCkBAIC0yNSwxNyArMjQsMTYgQEAKIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiAjaW5jbHVkZSAidmYuaCIKIAogc3RhdGljIHMzMiBlMTAwMF9jaGVja19mb3JfbGlua192ZihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyBzMzIgZTEwMDBfZ2V0X2xpbmtfdXBfaW5mb192ZihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgKnNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAqZHVwbGV4KTsKKwkJCQkgICAgIHUxNiAqZHVwbGV4KTsKIHN0YXRpYyBzMzIgZTEwMDBfaW5pdF9od192ZihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIHN0YXRpYyBzMzIgZTEwMDBfcmVzZXRfaHdfdmYoc3RydWN0IGUxMDAwX2h3ICpodyk7CiAKIHN0YXRpYyB2b2lkIGUxMDAwX3VwZGF0ZV9tY19hZGRyX2xpc3RfdmYoc3RydWN0IGUxMDAwX2h3ICpodywgdTggKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyLCB1MzIsIHUzMik7CisJCQkJCSB1MzIsIHUzMiwgdTMyKTsKIHN0YXRpYyB2b2lkIGUxMDAwX3Jhcl9zZXRfdmYoc3RydWN0IGUxMDAwX2h3ICosIHU4ICosIHUzMik7CiBzdGF0aWMgczMyIGUxMDAwX3JlYWRfbWFjX2FkZHJfdmYoc3RydWN0IGUxMDAwX2h3ICopOwogc3RhdGljIHMzMiBlMTAwMF9zZXRfdmZ0YV92ZihzdHJ1Y3QgZTEwMDBfaHcgKiwgdTE2LCBib29sKTsKQEAgLTk0LDcgKzkyLDcgQEAKICAqICB0aGUgc3RhdHVzIHJlZ2lzdGVyJ3MgZGF0YSB3aGljaCBpcyBvZnRlbiBzdGFsZSBhbmQgaW5hY2N1cmF0ZS4KICAqKi8KIHN0YXRpYyBzMzIgZTEwMDBfZ2V0X2xpbmtfdXBfaW5mb192ZihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1MTYgKnNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiAqZHVwbGV4KQorCQkJCSAgICAgdTE2ICpkdXBsZXgpCiB7CiAJczMyIHN0YXR1czsKIApAQCAtMTMwLDcgKzEyOCw3IEBACiAJdTggKmFkZHIgPSAodTggKikoJm1zZ2J1ZlsxXSk7CiAJdTMyIGN0cmw7CiAKLQkvKiBhc3NlcnQgdmYgcXVldWUvaW50ZXJydXB0IHJlc2V0ICovCisJLyogYXNzZXJ0IFZGIHF1ZXVlL2ludGVycnVwdCByZXNldCAqLwogCWN0cmwgPSBlcjMyKENUUkwpOwogCWV3MzIoQ1RSTCwgY3RybCB8IEUxMDAwX0NUUkxfUlNUKTsKIApAQCAtMTQ0LDcgKzE0Miw3IEBACiAJCS8qIG1haWxib3ggdGltZW91dCBjYW4gbm93IGJlY29tZSBhY3RpdmUgKi8KIAkJbWJ4LT50aW1lb3V0ID0gRTEwMDBfVkZfTUJYX0lOSVRfVElNRU9VVDsKIAotCQkvKiBub3RpZnkgcGYgb2YgdmYgcmVzZXQgY29tcGxldGlvbiAqLworCQkvKiBub3RpZnkgUEYgb2YgVkYgcmVzZXQgY29tcGxldGlvbiAqLwogCQltc2didWZbMF0gPSBFMTAwMF9WRl9SRVNFVDsKIAkJbWJ4LT5vcHMud3JpdGVfcG9zdGVkKGh3LCBtc2didWYsIDEpOwogCkBAIC0xNTMsNyArMTUxLDggQEAKIAkJLyogc2V0IG91ciAicGVybV9hZGRyIiBiYXNlZCBvbiBpbmZvIHByb3ZpZGVkIGJ5IFBGICovCiAJCXJldF92YWwgPSBtYngtPm9wcy5yZWFkX3Bvc3RlZChodywgbXNnYnVmLCAzKTsKIAkJaWYgKCFyZXRfdmFsKSB7Ci0JCQlpZiAobXNnYnVmWzBdID09IChFMTAwMF9WRl9SRVNFVCB8IEUxMDAwX1ZUX01TR1RZUEVfQUNLKSkKKwkJCWlmIChtc2didWZbMF0gPT0gKEUxMDAwX1ZGX1JFU0VUIHwKKwkJCQkJICBFMTAwMF9WVF9NU0dUWVBFX0FDSykpCiAJCQkJbWVtY3B5KGh3LT5tYWMucGVybV9hZGRyLCBhZGRyLCBFVEhfQUxFTik7CiAJCQllbHNlCiAJCQkJcmV0X3ZhbCA9IC1FMTAwMF9FUlJfTUFDX0lOSVQ7CkBAIC0xOTQsMTUgKzE5MywxNCBAQAogCS8qIFJlZ2lzdGVyIGNvdW50IG11bHRpcGxpZWQgYnkgYml0cyBwZXIgcmVnaXN0ZXIgKi8KIAloYXNoX21hc2sgPSAoaHctPm1hYy5tdGFfcmVnX2NvdW50ICogMzIpIC0gMTsKIAotCS8qCi0JICogVGhlIGJpdF9zaGlmdCBpcyB0aGUgbnVtYmVyIG9mIGxlZnQtc2hpZnRzCisJLyogVGhlIGJpdF9zaGlmdCBpcyB0aGUgbnVtYmVyIG9mIGxlZnQtc2hpZnRzCiAJICogd2hlcmUgMHhGRiB3b3VsZCBzdGlsbCBmYWxsIHdpdGhpbiB0aGUgaGFzaCBtYXNrLgogCSAqLwogCXdoaWxlIChoYXNoX21hc2sgPj4gYml0X3NoaWZ0ICE9IDB4RkYpCiAJCWJpdF9zaGlmdCsrOwogCiAJaGFzaF92YWx1ZSA9IGhhc2hfbWFzayAmICgoKG1jX2FkZHJbNF0gPj4gKDggLSBiaXRfc2hpZnQpKSB8Ci0JICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1MTYpIG1jX2FkZHJbNV0pIDw8IGJpdF9zaGlmdCkpKTsKKwkJCQkgICgoKHUxNiltY19hZGRyWzVdKSA8PCBiaXRfc2hpZnQpKSk7CiAKIAlyZXR1cm4gaGFzaF92YWx1ZTsKIH0KQEAgLTIyMSw4ICsyMTksOCBAQAogICogIHVubGVzcyB0aGVyZSBhcmUgd29ya2Fyb3VuZHMgdGhhdCBjaGFuZ2UgdGhpcy4KICAqKi8KIHN0YXRpYyB2b2lkIGUxMDAwX3VwZGF0ZV9tY19hZGRyX2xpc3RfdmYoc3RydWN0IGUxMDAwX2h3ICpodywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqbWNfYWRkcl9saXN0LCB1MzIgbWNfYWRkcl9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MzIgcmFyX3VzZWRfY291bnQsIHUzMiByYXJfY291bnQpCisJCQkJCSB1OCAqbWNfYWRkcl9saXN0LCB1MzIgbWNfYWRkcl9jb3VudCwKKwkJCQkJIHUzMiByYXJfdXNlZF9jb3VudCwgdTMyIHJhcl9jb3VudCkKIHsKIAlzdHJ1Y3QgZTEwMDBfbWJ4X2luZm8gKm1ieCA9ICZody0+bWJ4OwogCXUzMiBtc2didWZbRTEwMDBfVkZNQUlMQk9YX1NJWkVdOwpAQCAtMzA1LDcgKzMwMyw3IEBACiAgKiAgQGFkZHI6IHBvaW50ZXIgdG8gdGhlIHJlY2VpdmUgYWRkcmVzcwogICogIEBpbmRleDogcmVjZWl2ZSBhZGRyZXNzIGFycmF5IHJlZ2lzdGVyCiAgKiovCi1zdGF0aWMgdm9pZCBlMTAwMF9yYXJfc2V0X3ZmKHN0cnVjdCBlMTAwMF9odyAqaHcsIHU4ICogYWRkciwgdTMyIGluZGV4KQorc3RhdGljIHZvaWQgZTEwMDBfcmFyX3NldF92ZihzdHJ1Y3QgZTEwMDBfaHcgKmh3LCB1OCAqYWRkciwgdTMyIGluZGV4KQogewogCXN0cnVjdCBlMTAwMF9tYnhfaW5mbyAqbWJ4ID0gJmh3LT5tYng7CiAJdTMyIG1zZ2J1ZlszXTsKQEAgLTM1NCw4ICszNTIsNyBAQAogCXMzMiByZXRfdmFsID0gRTEwMDBfU1VDQ0VTUzsKIAl1MzIgaW5fbXNnID0gMDsKIAotCS8qCi0JICogV2Ugb25seSB3YW50IHRvIHJ1biB0aGlzIGlmIHRoZXJlIGhhcyBiZWVuIGEgcnN0IGFzc2VydGVkLgorCS8qIFdlIG9ubHkgd2FudCB0byBydW4gdGhpcyBpZiB0aGVyZSBoYXMgYmVlbiBhIHJzdCBhc3NlcnRlZC4KIAkgKiBpbiB0aGlzIGNhc2UgdGhhdCBjb3VsZCBtZWFuIGEgbGluayBjaGFuZ2UsIGRldmljZSByZXNldCwKIAkgKiBvciBhIHZpcnR1YWwgZnVuY3Rpb24gcmVzZXQKIAkgKi8KQEAgLTM2NywzMSArMzY0LDMzIEBACiAJaWYgKCFtYWMtPmdldF9saW5rX3N0YXR1cykKIAkJZ290byBvdXQ7CiAKLQkvKiBpZiBsaW5rIHN0YXR1cyBpcyBkb3duIG5vIHBvaW50IGluIGNoZWNraW5nIHRvIHNlZSBpZiBwZiBpcyB1cCAqLworCS8qIGlmIGxpbmsgc3RhdHVzIGlzIGRvd24gbm8gcG9pbnQgaW4gY2hlY2tpbmcgdG8gc2VlIGlmIFBGIGlzIHVwICovCiAJaWYgKCEoZXIzMihTVEFUVVMpICYgRTEwMDBfU1RBVFVTX0xVKSkKIAkJZ290byBvdXQ7CiAKIAkvKiBpZiB0aGUgcmVhZCBmYWlsZWQgaXQgY291bGQganVzdCBiZSBhIG1haWxib3ggY29sbGlzaW9uLCBiZXN0IHdhaXQKLQkgKiB1bnRpbCB3ZSBhcmUgY2FsbGVkIGFnYWluIGFuZCBkb24ndCByZXBvcnQgYW4gZXJyb3IgKi8KKwkgKiB1bnRpbCB3ZSBhcmUgY2FsbGVkIGFnYWluIGFuZCBkb24ndCByZXBvcnQgYW4gZXJyb3IKKwkgKi8KIAlpZiAobWJ4LT5vcHMucmVhZChodywgJmluX21zZywgMSkpCiAJCWdvdG8gb3V0OwogCiAJLyogaWYgaW5jb21pbmcgbWVzc2FnZSBpc24ndCBjbGVhciB0byBzZW5kIHdlIGFyZSB3YWl0aW5nIG9uIHJlc3BvbnNlICovCiAJaWYgKCEoaW5fbXNnICYgRTEwMDBfVlRfTVNHVFlQRV9DVFMpKSB7Ci0JCS8qIG1lc3NhZ2UgaXMgbm90IENUUyBhbmQgaXMgTkFDSyB3ZSBtdXN0IGhhdmUgbG9zdCBDVFMgc3RhdHVzICovCisJCS8qIG1zZyBpcyBub3QgQ1RTIGFuZCBpcyBOQUNLIHdlIG11c3QgaGF2ZSBsb3N0IENUUyBzdGF0dXMgKi8KIAkJaWYgKGluX21zZyAmIEUxMDAwX1ZUX01TR1RZUEVfTkFDSykKIAkJCXJldF92YWwgPSAtRTEwMDBfRVJSX01BQ19JTklUOwogCQlnb3RvIG91dDsKIAl9CiAKLQkvKiB0aGUgcGYgaXMgdGFsa2luZywgaWYgd2UgdGltZWQgb3V0IGluIHRoZSBwYXN0IHdlIHJlaW5pdCAqLworCS8qIHRoZSBQRiBpcyB0YWxraW5nLCBpZiB3ZSB0aW1lZCBvdXQgaW4gdGhlIHBhc3Qgd2UgcmVpbml0ICovCiAJaWYgKCFtYngtPnRpbWVvdXQpIHsKIAkJcmV0X3ZhbCA9IC1FMTAwMF9FUlJfTUFDX0lOSVQ7CiAJCWdvdG8gb3V0OwogCX0KIAogCS8qIGlmIHdlIHBhc3NlZCBhbGwgdGhlIHRlc3RzIGFib3ZlIHRoZW4gdGhlIGxpbmsgaXMgdXAgYW5kIHdlIG5vCi0JICogbG9uZ2VyIG5lZWQgdG8gY2hlY2sgZm9yIGxpbmsgKi8KKwkgKiBsb25nZXIgbmVlZCB0byBjaGVjayBmb3IgbGluaworCSAqLwogCW1hYy0+Z2V0X2xpbmtfc3RhdHVzID0gZmFsc2U7CiAKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL3ZmLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi92Zi5oCmluZGV4IDU3ZGIzYzYuLjBmMWVjYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL3ZmLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvdmYuaApAQCAtMTMsOCArMTMsNyBAQAogICBtb3JlIGRldGFpbHMuCiAKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAKICAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KQEAgLTM4LDMwICszNywyOSBAQAogCiBzdHJ1Y3QgZTEwMDBfaHc7CiAKLSNkZWZpbmUgRTEwMDBfREVWX0lEXzgyNTc2X1ZGICAgICAgICAgICAgICAgICAweDEwQ0EKLSNkZWZpbmUgRTEwMDBfREVWX0lEX0kzNTBfVkYgICAgICAgICAgICAgICAgICAweDE1MjAKLSNkZWZpbmUgRTEwMDBfUkVWSVNJT05fMCAwCi0jZGVmaW5lIEUxMDAwX1JFVklTSU9OXzEgMQotI2RlZmluZSBFMTAwMF9SRVZJU0lPTl8yIDIKLSNkZWZpbmUgRTEwMDBfUkVWSVNJT05fMyAzCi0jZGVmaW5lIEUxMDAwX1JFVklTSU9OXzQgNAorI2RlZmluZSBFMTAwMF9ERVZfSURfODI1NzZfVkYJCTB4MTBDQQorI2RlZmluZSBFMTAwMF9ERVZfSURfSTM1MF9WRgkJMHgxNTIwCisjZGVmaW5lIEUxMDAwX1JFVklTSU9OXzAJMAorI2RlZmluZSBFMTAwMF9SRVZJU0lPTl8xCTEKKyNkZWZpbmUgRTEwMDBfUkVWSVNJT05fMgkyCisjZGVmaW5lIEUxMDAwX1JFVklTSU9OXzMJMworI2RlZmluZSBFMTAwMF9SRVZJU0lPTl80CTQKIAotI2RlZmluZSBFMTAwMF9GVU5DXzAgICAgIDAKLSNkZWZpbmUgRTEwMDBfRlVOQ18xICAgICAxCisjZGVmaW5lIEUxMDAwX0ZVTkNfMAkwCisjZGVmaW5lIEUxMDAwX0ZVTkNfMQkxCiAKLS8qCi0gKiBSZWNlaXZlIEFkZHJlc3MgUmVnaXN0ZXIgQ291bnQKKy8qIFJlY2VpdmUgQWRkcmVzcyBSZWdpc3RlciBDb3VudAogICogTnVtYmVyIG9mIGhpZ2gvbG93IHJlZ2lzdGVyIHBhaXJzIGluIHRoZSBSQVIuICBUaGUgUkFSIChSZWNlaXZlIEFkZHJlc3MKICAqIFJlZ2lzdGVycykgaG9sZHMgdGhlIGRpcmVjdGVkIGFuZCBtdWx0aWNhc3QgYWRkcmVzc2VzIHRoYXQgd2UgbW9uaXRvci4KICAqIFRoZXNlIGVudHJpZXMgYXJlIGFsc28gdXNlZCBmb3IgTUFDLWJhc2VkIGZpbHRlcmluZy4KICAqLwotI2RlZmluZSBFMTAwMF9SQVJfRU5UUklFU19WRiAgICAgIDEKKyNkZWZpbmUgRTEwMDBfUkFSX0VOVFJJRVNfVkYJMQogCiAvKiBSZWNlaXZlIERlc2NyaXB0b3IgLSBBZHZhbmNlZCAqLwogdW5pb24gZTEwMDBfYWR2X3J4X2Rlc2MgewogCXN0cnVjdCB7Ci0JCXU2NCBwa3RfYWRkcjsgICAgICAgICAgICAgLyogUGFja2V0IGJ1ZmZlciBhZGRyZXNzICovCi0JCXU2NCBoZHJfYWRkcjsgICAgICAgICAgICAgLyogSGVhZGVyIGJ1ZmZlciBhZGRyZXNzICovCisJCXU2NCBwa3RfYWRkcjsgLyogUGFja2V0IGJ1ZmZlciBhZGRyZXNzICovCisJCXU2NCBoZHJfYWRkcjsgLyogSGVhZGVyIGJ1ZmZlciBhZGRyZXNzICovCiAJfSByZWFkOwogCXN0cnVjdCB7CiAJCXN0cnVjdCB7CkBAIC02OSw1MyArNjcsNTMgQEAKIAkJCQl1MzIgZGF0YTsKIAkJCQlzdHJ1Y3QgewogCQkJCQl1MTYgcGt0X2luZm87IC8qIFJTUy9QYWNrZXQgdHlwZSAqLwotCQkJCQl1MTYgaGRyX2luZm87IC8qIFNwbGl0IEhlYWRlciwKLQkJCQkJICAgICAgICAgICAgICAgKiBoZHIgYnVmZmVyIGxlbmd0aCAqLworCQkJCQkvKiBTcGxpdCBIZWFkZXIsIGhkciBidWZmZXIgbGVuZ3RoICovCisJCQkJCXUxNiBoZHJfaW5mbzsKIAkJCQl9IGhzX3JzczsKIAkJCX0gbG9fZHdvcmQ7CiAJCQl1bmlvbiB7Ci0JCQkJdTMyIHJzczsgICAgICAgICAgLyogUlNTIEhhc2ggKi8KKwkJCQl1MzIgcnNzOyAvKiBSU1MgSGFzaCAqLwogCQkJCXN0cnVjdCB7Ci0JCQkJCXUxNiBpcF9pZDsgICAgLyogSVAgaWQgKi8KLQkJCQkJdTE2IGNzdW07ICAgICAvKiBQYWNrZXQgQ2hlY2tzdW0gKi8KKwkJCQkJdTE2IGlwX2lkOyAvKiBJUCBpZCAqLworCQkJCQl1MTYgY3N1bTsgIC8qIFBhY2tldCBDaGVja3N1bSAqLwogCQkJCX0gY3N1bV9pcDsKIAkJCX0gaGlfZHdvcmQ7CiAJCX0gbG93ZXI7CiAJCXN0cnVjdCB7Ci0JCQl1MzIgc3RhdHVzX2Vycm9yOyAgICAgLyogZXh0IHN0YXR1cy9lcnJvciAqLwotCQkJdTE2IGxlbmd0aDsgICAgICAgICAgIC8qIFBhY2tldCBsZW5ndGggKi8KLQkJCXUxNiB2bGFuOyAgICAgICAgICAgICAvKiBWTEFOIHRhZyAqLworCQkJdTMyIHN0YXR1c19lcnJvcjsgLyogZXh0IHN0YXR1cy9lcnJvciAqLworCQkJdTE2IGxlbmd0aDsgLyogUGFja2V0IGxlbmd0aCAqLworCQkJdTE2IHZsYW47ICAgLyogVkxBTiB0YWcgKi8KIAkJfSB1cHBlcjsKIAl9IHdiOyAgLyogd3JpdGViYWNrICovCiB9OwogCi0jZGVmaW5lIEUxMDAwX1JYREFEVl9IRFJCVUZMRU5fTUFTSyAgICAgIDB4N0ZFMAotI2RlZmluZSBFMTAwMF9SWERBRFZfSERSQlVGTEVOX1NISUZUICAgICA1CisjZGVmaW5lIEUxMDAwX1JYREFEVl9IRFJCVUZMRU5fTUFTSwkweDdGRTAKKyNkZWZpbmUgRTEwMDBfUlhEQURWX0hEUkJVRkxFTl9TSElGVAk1CiAKIC8qIFRyYW5zbWl0IERlc2NyaXB0b3IgLSBBZHZhbmNlZCAqLwogdW5pb24gZTEwMDBfYWR2X3R4X2Rlc2MgewogCXN0cnVjdCB7Ci0JCXU2NCBidWZmZXJfYWRkcjsgICAgLyogQWRkcmVzcyBvZiBkZXNjcmlwdG9yJ3MgZGF0YSBidWYgKi8KKwkJdTY0IGJ1ZmZlcl9hZGRyOyAvKiBBZGRyZXNzIG9mIGRlc2NyaXB0b3IncyBkYXRhIGJ1ZiAqLwogCQl1MzIgY21kX3R5cGVfbGVuOwogCQl1MzIgb2xpbmZvX3N0YXR1czsKIAl9IHJlYWQ7CiAJc3RydWN0IHsKLQkJdTY0IHJzdmQ7ICAgICAgIC8qIFJlc2VydmVkICovCisJCXU2NCByc3ZkOyAvKiBSZXNlcnZlZCAqLwogCQl1MzIgbnh0c2VxX3NlZWQ7CiAJCXUzMiBzdGF0dXM7CiAJfSB3YjsKIH07CiAKIC8qIEFkdiBUcmFuc21pdCBEZXNjcmlwdG9yIENvbmZpZyBNYXNrcyAqLwotI2RlZmluZSBFMTAwMF9BRFZUWERfRFRZUF9DVFhUICAgIDB4MDAyMDAwMDAgLyogQWR2YW5jZWQgQ29udGV4dCBEZXNjcmlwdG9yICovCi0jZGVmaW5lIEUxMDAwX0FEVlRYRF9EVFlQX0RBVEEgICAgMHgwMDMwMDAwMCAvKiBBZHZhbmNlZCBEYXRhIERlc2NyaXB0b3IgKi8KLSNkZWZpbmUgRTEwMDBfQURWVFhEX0RDTURfRU9QICAgICAweDAxMDAwMDAwIC8qIEVuZCBvZiBQYWNrZXQgKi8KLSNkZWZpbmUgRTEwMDBfQURWVFhEX0RDTURfSUZDUyAgICAweDAyMDAwMDAwIC8qIEluc2VydCBGQ1MgKEV0aGVybmV0IENSQykgKi8KLSNkZWZpbmUgRTEwMDBfQURWVFhEX0RDTURfUlMgICAgICAweDA4MDAwMDAwIC8qIFJlcG9ydCBTdGF0dXMgKi8KLSNkZWZpbmUgRTEwMDBfQURWVFhEX0RDTURfREVYVCAgICAweDIwMDAwMDAwIC8qIERlc2NyaXB0b3IgZXh0ZW5zaW9uICgxPUFkdikgKi8KLSNkZWZpbmUgRTEwMDBfQURWVFhEX0RDTURfVkxFICAgICAweDQwMDAwMDAwIC8qIFZMQU4gcGt0IGVuYWJsZSAqLwotI2RlZmluZSBFMTAwMF9BRFZUWERfRENNRF9UU0UgICAgIDB4ODAwMDAwMDAgLyogVENQIFNlZyBlbmFibGUgKi8KLSNkZWZpbmUgRTEwMDBfQURWVFhEX1BBWUxFTl9TSElGVCAgICAxNCAvKiBBZHYgZGVzYyBQQVlMRU4gc2hpZnQgKi8KKyNkZWZpbmUgRTEwMDBfQURWVFhEX0RUWVBfQ1RYVAkweDAwMjAwMDAwIC8qIEFkdmFuY2VkIENvbnRleHQgRGVzY3JpcHRvciAqLworI2RlZmluZSBFMTAwMF9BRFZUWERfRFRZUF9EQVRBCTB4MDAzMDAwMDAgLyogQWR2YW5jZWQgRGF0YSBEZXNjcmlwdG9yICovCisjZGVmaW5lIEUxMDAwX0FEVlRYRF9EQ01EX0VPUAkweDAxMDAwMDAwIC8qIEVuZCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgRTEwMDBfQURWVFhEX0RDTURfSUZDUwkweDAyMDAwMDAwIC8qIEluc2VydCBGQ1MgKEV0aGVybmV0IENSQykgKi8KKyNkZWZpbmUgRTEwMDBfQURWVFhEX0RDTURfUlMJMHgwODAwMDAwMCAvKiBSZXBvcnQgU3RhdHVzICovCisjZGVmaW5lIEUxMDAwX0FEVlRYRF9EQ01EX0RFWFQJMHgyMDAwMDAwMCAvKiBEZXNjcmlwdG9yIGV4dGVuc2lvbiAoMT1BZHYpICovCisjZGVmaW5lIEUxMDAwX0FEVlRYRF9EQ01EX1ZMRQkweDQwMDAwMDAwIC8qIFZMQU4gcGt0IGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9BRFZUWERfRENNRF9UU0UJMHg4MDAwMDAwMCAvKiBUQ1AgU2VnIGVuYWJsZSAqLworI2RlZmluZSBFMTAwMF9BRFZUWERfUEFZTEVOX1NISUZUCTE0IC8qIEFkdiBkZXNjIFBBWUxFTiBzaGlmdCAqLwogCiAvKiBDb250ZXh0IGRlc2NyaXB0b3JzICovCiBzdHJ1Y3QgZTEwMDBfYWR2X3R4X2NvbnRleHRfZGVzYyB7CkBAIC0xMjUsMTEgKzEyMywxMSBAQAogCXUzMiBtc3NfbDRsZW5faWR4OwogfTsKIAotI2RlZmluZSBFMTAwMF9BRFZUWERfTUFDTEVOX1NISUZUICAgIDkgIC8qIEFkdiBjdHh0IGRlc2MgbWFjIGxlbiBzaGlmdCAqLwotI2RlZmluZSBFMTAwMF9BRFZUWERfVFVDTURfSVBWNCAgICAweDAwMDAwNDAwICAvKiBJUCBQYWNrZXQgVHlwZTogMT1JUHY0ICovCi0jZGVmaW5lIEUxMDAwX0FEVlRYRF9UVUNNRF9MNFRfVENQIDB4MDAwMDA4MDAgIC8qIEw0IFBhY2tldCBUWVBFIG9mIFRDUCAqLwotI2RlZmluZSBFMTAwMF9BRFZUWERfTDRMRU5fU0hJRlQgICAgIDggIC8qIEFkdiBjdHh0IEw0TEVOIHNoaWZ0ICovCi0jZGVmaW5lIEUxMDAwX0FEVlRYRF9NU1NfU0hJRlQgICAgICAxNiAgLyogQWR2IGN0eHQgTVNTIHNoaWZ0ICovCisjZGVmaW5lIEUxMDAwX0FEVlRYRF9NQUNMRU5fU0hJRlQJOSAgLyogQWR2IGN0eHQgZGVzYyBtYWMgbGVuIHNoaWZ0ICovCisjZGVmaW5lIEUxMDAwX0FEVlRYRF9UVUNNRF9JUFY0CQkweDAwMDAwNDAwIC8qIElQIFBhY2tldCBUeXBlOiAxPUlQdjQgKi8KKyNkZWZpbmUgRTEwMDBfQURWVFhEX1RVQ01EX0w0VF9UQ1AJMHgwMDAwMDgwMCAvKiBMNCBQYWNrZXQgVFlQRSBvZiBUQ1AgKi8KKyNkZWZpbmUgRTEwMDBfQURWVFhEX0w0TEVOX1NISUZUCTggIC8qIEFkdiBjdHh0IEw0TEVOIHNoaWZ0ICovCisjZGVmaW5lIEUxMDAwX0FEVlRYRF9NU1NfU0hJRlQJCTE2IC8qIEFkdiBjdHh0IE1TUyBzaGlmdCAqLwogCiBlbnVtIGUxMDAwX21hY190eXBlIHsKIAllMTAwMF91bmRlZmluZWQgPSAwLApAQCAtMjYyLDUgKzI2MCw0IEBACiB2b2lkIGUxMDAwX3JscG1sX3NldF92ZihzdHJ1Y3QgZTEwMDBfaHcgKiwgdTE2KTsKIHZvaWQgZTEwMDBfaW5pdF9mdW5jdGlvbl9wb2ludGVyc192ZihzdHJ1Y3QgZTEwMDBfaHcgKmh3KTsKIAotCiAjZW5kaWYgLyogX0UxMDAwX1ZGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiL2l4Z2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYi9peGdiX21haW4uYwppbmRleCAxMWExYmRiLi4zMWY5MTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiL2l4Z2JfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2IvaXhnYl9tYWluLmMKQEAgLTI4NSw2ICsyODUsOCBAQAogCS8qIHByZXZlbnQgdGhlIGludGVycnVwdCBoYW5kbGVyIGZyb20gcmVzdGFydGluZyB3YXRjaGRvZyAqLwogCXNldF9iaXQoX19JWEdCX0RPV04sICZhZGFwdGVyLT5mbGFncyk7CiAKKwluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOworCiAJbmFwaV9kaXNhYmxlKCZhZGFwdGVyLT5uYXBpKTsKIAkvKiB3YWl0aW5nIGZvciBOQVBJIHRvIGNvbXBsZXRlIGNhbiByZS1lbmFibGUgaW50ZXJydXB0cyAqLwogCWl4Z2JfaXJxX2Rpc2FibGUoYWRhcHRlcik7CkBAIC0yOTgsNyArMzAwLDYgQEAKIAogCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAwOwogCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gMDsKLQluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwogCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKIAogCWl4Z2JfcmVzZXQoYWRhcHRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmUuaAppbmRleCA3ZGNiYmVjLi42MzZmOWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlLmgKQEAgLTE1MSw2ICsxNTEsNyBAQAogCXUxNiB0eF9yYXRlOwogCXUxNiB2bGFuX2NvdW50OwogCXU4IHNwb29mY2hrX2VuYWJsZWQ7CisJYm9vbCByc3NfcXVlcnlfZW5hYmxlZDsKIAl1bnNpZ25lZCBpbnQgdmZfYXBpOwogfTsKIApAQCAtNjEzLDcgKzYxNCw2IEBACiAjZGVmaW5lIElYR0JFX0ZMQUdfUlhfMUJVRl9DQVBBQkxFICAgICAgICAgICAgICAodTMyKSgxIDw8IDQpCiAjZGVmaW5lIElYR0JFX0ZMQUdfUlhfUFNfQ0FQQUJMRSAgICAgICAgICAgICAgICAodTMyKSgxIDw8IDUpCiAjZGVmaW5lIElYR0JFX0ZMQUdfUlhfUFNfRU5BQkxFRCAgICAgICAgICAgICAgICAodTMyKSgxIDw8IDYpCi0jZGVmaW5lIElYR0JFX0ZMQUdfSU5fTkVUUE9MTCAgICAgICAgICAgICAgICAgICAodTMyKSgxIDw8IDcpCiAjZGVmaW5lIElYR0JFX0ZMQUdfRENBX0VOQUJMRUQgICAgICAgICAgICAgICAgICAodTMyKSgxIDw8IDgpCiAjZGVmaW5lIElYR0JFX0ZMQUdfRENBX0NBUEFCTEUgICAgICAgICAgICAgICAgICAodTMyKSgxIDw8IDkpCiAjZGVmaW5lIElYR0JFX0ZMQUdfSU1JUl9FTkFCTEVEICAgICAgICAgICAgICAgICAodTMyKSgxIDw8IDEwKQpAQCAtNjQzLDcgKzY0Myw2IEBACiAjZGVmaW5lIElYR0JFX0ZMQUcyX1JTU19GSUVMRF9JUFY0X1VEUAkJKHUzMikoMSA8PCA4KQogI2RlZmluZSBJWEdCRV9GTEFHMl9SU1NfRklFTERfSVBWNl9VRFAJCSh1MzIpKDEgPDwgOSkKICNkZWZpbmUgSVhHQkVfRkxBRzJfUFRQX1BQU19FTkFCTEVECQkodTMyKSgxIDw8IDEwKQotI2RlZmluZSBJWEdCRV9GTEFHMl9CUklER0VfTU9ERV9WRUIJCSh1MzIpKDEgPDwgMTEpCiAKIAkvKiBUeCBmYXN0IHBhdGggZGF0YSAqLwogCWludCBudW1fdHhfcXVldWVzOwpAQCAtNzIzLDYgKzcyMiw4IEBACiAJdTggX19pb21lbSAqaW9fYWRkcjsgLyogTWFpbmx5IGZvciBpb3VubWFwIHVzZSAqLwogCXUzMiB3b2w7CiAKKwl1MTYgYnJpZGdlX21vZGU7CisKIAl1MTYgZWVwcm9tX3Zlcmg7CiAJdTE2IGVlcHJvbV92ZXJsOwogCXUxNiBlZXByb21fY2FwOwpAQCAtNzY2LDYgKzc2NywxNSBAQAogCiAJdTggZGVmYXVsdF91cDsKIAl1bnNpZ25lZCBsb25nIGZ3ZF9iaXRtYXNrOyAvKiBCaXRtYXNrIGluZGljYXRpbmcgaW4gdXNlIHBvb2xzICovCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIFJFVEEgZW50cmllcyBhbW9uZyBhbGwgZGV2aWNlcyBzdXBwb3J0ZWQgYnkgaXhnYmUKKyAqIGRyaXZlcjogY3VycmVudGx5IGl0J3MgeDU1MCBkZXZpY2UgaW4gbm9uLVNSSU9WIG1vZGUKKyAqLworI2RlZmluZSBJWEdCRV9NQVhfUkVUQV9FTlRSSUVTIDUxMgorCXU4IHJzc19pbmRpcl90YmxbSVhHQkVfTUFYX1JFVEFfRU5UUklFU107CisKKyNkZWZpbmUgSVhHQkVfUlNTX0tFWV9TSVpFICAgICA0MCAgLyogc2l6ZSBvZiBSU1MgSGFzaCBLZXkgaW4gYnl0ZXMgKi8KKwl1MzIgcnNzX2tleVtJWEdCRV9SU1NfS0VZX1NJWkUgLyBzaXplb2YodTMyKV07CiB9OwogCiBzdGF0aWMgaW5saW5lIHU4IGl4Z2JlX21heF9yc3NfaW5kaWNlcyhzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKQEAgLTk1NSw0ICs5NjUsNSBAQAogbmV0ZGV2X3R4X3QgaXhnYmVfeG1pdF9mcmFtZV9yaW5nKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICBzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwKIAkJCQkgIHN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nKTsKK3UzMiBpeGdiZV9yc3NfaW5kaXJfdGJsX2VudHJpZXMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogI2VuZGlmIC8qIF9JWEdCRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfODI1OTguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlXzgyNTk4LmMKaW5kZXggYzVjOTdiNC4uODI0YTdhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfODI1OTguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV84MjU5OC5jCkBAIC0xNzEsMTcgKzE3MSwyMSBAQAogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqCiAgKiAgU3RhcnRzIHRoZSBoYXJkd2FyZSB1c2luZyB0aGUgZ2VuZXJpYyBzdGFydF9odyBmdW5jdGlvbi4KLSAqICBEaXNhYmxlcyByZWxheGVkIG9yZGVyaW5nIFRoZW4gc2V0IHBjaWUgY29tcGxldGlvbiB0aW1lb3V0CisgKiAgRGlzYWJsZXMgcmVsYXhlZCBvcmRlcmluZyBmb3IgYXJjaHMgb3RoZXIgdGhhbiBTUEFSQworICogIFRoZW4gc2V0IHBjaWUgY29tcGxldGlvbiB0aW1lb3V0CiAgKgogICoqLwogc3RhdGljIHMzMiBpeGdiZV9zdGFydF9od184MjU5OChzdHJ1Y3QgaXhnYmVfaHcgKmh3KQogeworI2lmbmRlZiBDT05GSUdfU1BBUkMKIAl1MzIgcmVndmFsOwogCXUzMiBpOworI2VuZGlmCiAJczMyIHJldF92YWw7CiAKIAlyZXRfdmFsID0gaXhnYmVfc3RhcnRfaHdfZ2VuZXJpYyhodyk7CiAKKyNpZm5kZWYgQ09ORklHX1NQQVJDCiAJLyogRGlzYWJsZSByZWxheGVkIG9yZGVyaW5nICovCiAJZm9yIChpID0gMDsgKChpIDwgaHctPm1hYy5tYXhfdHhfcXVldWVzKSAmJgogCSAgICAgKGkgPCBJWEdCRV9EQ0FfTUFYX1FVRVVFU184MjU5OCkpOyBpKyspIHsKQEAgLTE5Nyw3ICsyMDEsNyBAQAogCQkJICAgIElYR0JFX0RDQV9SWENUUkxfSEVBRF9XUk9fRU4pOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0RDQV9SWENUUkwoaSksIHJlZ3ZhbCk7CiAJfQotCisjZW5kaWYKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CiAKQEAgLTExOTMsNiArMTE5Nyw4IEBACiAJLmluaXRfdGhlcm1hbF9zZW5zb3JfdGhyZXNoID0gTlVMTCwKIAkucHJvdF9hdXRvY19yZWFkCT0gJnByb3RfYXV0b2NfcmVhZF9nZW5lcmljLAogCS5wcm90X2F1dG9jX3dyaXRlCT0gJnByb3RfYXV0b2Nfd3JpdGVfZ2VuZXJpYywKKwkuZW5hYmxlX3J4CQk9ICZpeGdiZV9lbmFibGVfcnhfZ2VuZXJpYywKKwkuZGlzYWJsZV9yeAkJPSAmaXhnYmVfZGlzYWJsZV9yeF9nZW5lcmljLAogfTsKIAogc3RhdGljIHN0cnVjdCBpeGdiZV9lZXByb21fb3BlcmF0aW9ucyBlZXByb21fb3BzXzgyNTk4ID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfODI1OTkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlXzgyNTk5LmMKaW5kZXggY2Y1NWEwZC4uZTBjMzYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfODI1OTkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV84MjU5OS5jCkBAIC0xOTc3LDcgKzE5NzcsMTAgQEAKIAkgKi8KIAlody0+bWFjLm9wcy5kaXNhYmxlX3J4X2J1ZmYoaHcpOwogCi0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SWENUUkwsIHJlZ3ZhbCk7CisJaWYgKHJlZ3ZhbCAmIElYR0JFX1JYQ1RSTF9SWEVOKQorCQlody0+bWFjLm9wcy5lbmFibGVfcngoaHcpOworCWVsc2UKKwkJaHctPm1hYy5vcHMuZGlzYWJsZV9yeChodyk7CiAKIAlody0+bWFjLm9wcy5lbmFibGVfcnhfYnVmZihodyk7CiAKQEAgLTIzMzYsNiArMjMzOSw4IEBACiAJLmluaXRfdGhlcm1hbF9zZW5zb3JfdGhyZXNoID0gJml4Z2JlX2luaXRfdGhlcm1hbF9zZW5zb3JfdGhyZXNoX2dlbmVyaWMsCiAJLnByb3RfYXV0b2NfcmVhZAk9ICZwcm90X2F1dG9jX3JlYWRfODI1OTksCiAJLnByb3RfYXV0b2Nfd3JpdGUJPSAmcHJvdF9hdXRvY193cml0ZV84MjU5OSwKKwkuZW5hYmxlX3J4CQk9ICZpeGdiZV9lbmFibGVfcnhfZ2VuZXJpYywKKwkuZGlzYWJsZV9yeAkJPSAmaXhnYmVfZGlzYWJsZV9yeF9nZW5lcmljLAogfTsKIAogc3RhdGljIHN0cnVjdCBpeGdiZV9lZXByb21fb3BlcmF0aW9ucyBlZXByb21fb3BzXzgyNTk5ID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9jb21tb24uYwppbmRleCA5YzY2YmFiLi4wNmQ4ZjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9jb21tb24uYwpAQCAtMzEyLDcgKzMxMiw2IEBACiBzMzIgaXhnYmVfc3RhcnRfaHdfZ2VuMihzdHJ1Y3QgaXhnYmVfaHcgKmh3KQogewogCXUzMiBpOwotCXUzMiByZWd2YWw7CiAKIAkvKiBDbGVhciB0aGUgcmF0ZSBsaW1pdGVycyAqLwogCWZvciAoaSA9IDA7IGkgPCBody0+bWFjLm1heF90eF9xdWV1ZXM7IGkrKykgewpAQCAtMzIxLDIwICszMjAsMjUgQEAKIAl9CiAJSVhHQkVfV1JJVEVfRkxVU0goaHcpOwogCisjaWZuZGVmIENPTkZJR19TUEFSQwogCS8qIERpc2FibGUgcmVsYXhlZCBvcmRlcmluZyAqLwogCWZvciAoaSA9IDA7IGkgPCBody0+bWFjLm1heF90eF9xdWV1ZXM7IGkrKykgeworCQl1MzIgcmVndmFsOworCiAJCXJlZ3ZhbCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9EQ0FfVFhDVFJMXzgyNTk5KGkpKTsKIAkJcmVndmFsICY9IH5JWEdCRV9EQ0FfVFhDVFJMX0RFU0NfV1JPX0VOOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0RDQV9UWENUUkxfODI1OTkoaSksIHJlZ3ZhbCk7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGh3LT5tYWMubWF4X3J4X3F1ZXVlczsgaSsrKSB7CisJCXUzMiByZWd2YWw7CisKIAkJcmVndmFsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0RDQV9SWENUUkwoaSkpOwogCQlyZWd2YWwgJj0gfihJWEdCRV9EQ0FfUlhDVFJMX0RBVEFfV1JPX0VOIHwKIAkJCSAgICBJWEdCRV9EQ0FfUlhDVFJMX0hFQURfV1JPX0VOKTsKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9EQ0FfUlhDVFJMKGkpLCByZWd2YWwpOwogCX0KLQorI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcwMyw3ICs3MDcsNyBAQAogCWh3LT5hZGFwdGVyX3N0b3BwZWQgPSB0cnVlOwogCiAJLyogRGlzYWJsZSB0aGUgcmVjZWl2ZSB1bml0ICovCi0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SWENUUkwsIDApOworCWh3LT5tYWMub3BzLmRpc2FibGVfcngoaHcpOwogCiAJLyogQ2xlYXIgaW50ZXJydXB0IG1hc2sgdG8gc3RvcCBpbnRlcnJ1cHRzIGZyb20gYmVpbmcgZ2VuZXJhdGVkICovCiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9FSU1DLCBJWEdCRV9JUlFfQ0xFQVJfTUFTSyk7CkBAIC0yNjM5LDcgKzI2NDMsMTAgQEAKICAqKi8KIHMzMiBpeGdiZV9lbmFibGVfcnhfZG1hX2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHJlZ3ZhbCkKIHsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYQ1RSTCwgcmVndmFsKTsKKwlpZiAocmVndmFsICYgSVhHQkVfUlhDVFJMX1JYRU4pCisJCWh3LT5tYWMub3BzLmVuYWJsZV9yeChodyk7CisJZWxzZQorCQlody0+bWFjLm9wcy5kaXNhYmxlX3J4KGh3KTsKIAogCXJldHVybiAwOwogfQpAQCAtMzg1MCwzICszODU3LDQ0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgaXhnYmVfZGlzYWJsZV9yeF9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpCit7CisJdTMyIHJ4Y3RybDsKKworCXJ4Y3RybCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SWENUUkwpOworCWlmIChyeGN0cmwgJiBJWEdCRV9SWENUUkxfUlhFTikgeworCQlpZiAoaHctPm1hYy50eXBlICE9IGl4Z2JlX21hY184MjU5OEVCKSB7CisJCQl1MzIgcGZkdHhnc3djOworCisJCQlwZmR0eGdzd2MgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUEZEVFhHU1dDKTsKKwkJCWlmIChwZmR0eGdzd2MgJiBJWEdCRV9QRkRUWEdTV0NfVlRfTEJFTikgeworCQkJCXBmZHR4Z3N3YyAmPSB+SVhHQkVfUEZEVFhHU1dDX1ZUX0xCRU47CisJCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9QRkRUWEdTV0MsIHBmZHR4Z3N3Yyk7CisJCQkJaHctPm1hYy5zZXRfbGJlbiA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCWh3LT5tYWMuc2V0X2xiZW4gPSBmYWxzZTsKKwkJCX0KKwkJfQorCQlyeGN0cmwgJj0gfklYR0JFX1JYQ1RSTF9SWEVOOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYQ1RSTCwgcnhjdHJsKTsKKwl9Cit9CisKK3ZvaWQgaXhnYmVfZW5hYmxlX3J4X2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodykKK3sKKwl1MzIgcnhjdHJsOworCisJcnhjdHJsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JYQ1RSTCk7CisJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SWENUUkwsIChyeGN0cmwgfCBJWEdCRV9SWENUUkxfUlhFTikpOworCisJaWYgKGh3LT5tYWMudHlwZSAhPSBpeGdiZV9tYWNfODI1OThFQikgeworCQlpZiAoaHctPm1hYy5zZXRfbGJlbikgeworCQkJdTMyIHBmZHR4Z3N3YzsKKworCQkJcGZkdHhnc3djID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1BGRFRYR1NXQyk7CisJCQlwZmR0eGdzd2MgfD0gSVhHQkVfUEZEVFhHU1dDX1ZUX0xCRU47CisJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1BGRFRYR1NXQywgcGZkdHhnc3djKTsKKwkJCWh3LT5tYWMuc2V0X2xiZW4gPSBmYWxzZTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmgKaW5kZXggOGNmYWRjYi4uZjIxZjhhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmgKQEAgLTEzMCw2ICsxMzAsOCBAQAogCiBzMzIgaXhnYmVfZ2V0X3RoZXJtYWxfc2Vuc29yX2RhdGFfZ2VuZXJpYyhzdHJ1Y3QgaXhnYmVfaHcgKmh3KTsKIHMzMiBpeGdiZV9pbml0X3RoZXJtYWxfc2Vuc29yX3RocmVzaF9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOwordm9pZCBpeGdiZV9kaXNhYmxlX3J4X2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodyk7Cit2b2lkIGl4Z2JlX2VuYWJsZV9yeF9nZW5lcmljKHN0cnVjdCBpeGdiZV9odyAqaHcpOwogCiAjZGVmaW5lIElYR0JFX0ZBSUxFRF9SRUFEX1JFRyAweGZmZmZmZmZmVQogI2RlZmluZSBJWEdCRV9GQUlMRURfUkVBRF9DRkdfRFdPUkQgMHhmZmZmZmZmZlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYwppbmRleCBlNWJlMGRkLi5lYWZhOWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZXRodG9vbC5jCkBAIC0xMzUxLDcgKzEzNTEsNyBAQAogCiAJaWYgKGl4Z2JlX3JlbW92ZWQoYWRhcHRlci0+aHcuaHdfYWRkcikpIHsKIAkJKmRhdGEgPSAxOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCWZvciAocGF0ID0gMDsgcGF0IDwgQVJSQVlfU0laRSh0ZXN0X3BhdHRlcm4pOyBwYXQrKykgewogCQliZWZvcmUgPSBpeGdiZV9yZWFkX3JlZygmYWRhcHRlci0+aHcsIHJlZyk7CkBAIC0xMzc2LDcgKzEzNzYsNyBAQAogCiAJaWYgKGl4Z2JlX3JlbW92ZWQoYWRhcHRlci0+aHcuaHdfYWRkcikpIHsKIAkJKmRhdGEgPSAxOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCWJlZm9yZSA9IGl4Z2JlX3JlYWRfcmVnKCZhZGFwdGVyLT5odywgcmVnKTsKIAlpeGdiZV93cml0ZV9yZWcoJmFkYXB0ZXItPmh3LCByZWcsIHdyaXRlICYgbWFzayk7CkBAIC0xNjM3LDkgKzE2MzcsNyBAQAogCS8qIHNodXQgZG93biB0aGUgRE1BIGVuZ2luZXMgbm93IHNvIHRoZXkgY2FuIGJlIHJlaW5pdGlhbGl6ZWQgbGF0ZXIgKi8KIAogCS8qIGZpcnN0IFJ4ICovCi0JcmVnX2N0bCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9SWENUUkwpOwotCXJlZ19jdGwgJj0gfklYR0JFX1JYQ1RSTF9SWEVOOwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlhDVFJMLCByZWdfY3RsKTsKKwlody0+bWFjLm9wcy5kaXNhYmxlX3J4KGh3KTsKIAlpeGdiZV9kaXNhYmxlX3J4X3F1ZXVlKGFkYXB0ZXIsIHJ4X3JpbmcpOwogCiAJLyogbm93IFR4ICovCkBAIC0xNjcwLDYgKzE2NjgsNyBAQAogewogCXN0cnVjdCBpeGdiZV9yaW5nICp0eF9yaW5nID0gJmFkYXB0ZXItPnRlc3RfdHhfcmluZzsKIAlzdHJ1Y3QgaXhnYmVfcmluZyAqcnhfcmluZyA9ICZhZGFwdGVyLT50ZXN0X3J4X3Jpbmc7CisJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1MzIgcmN0bCwgcmVnX2RhdGE7CiAJaW50IHJldF92YWw7CiAJaW50IGVycjsKQEAgLTE3MTMsMTQgKzE3MTIsMTYgQEAKIAkJZ290byBlcnJfbm9tZW07CiAJfQogCi0JcmN0bCA9IElYR0JFX1JFQURfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfUlhDVFJMKTsKLQlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9SWENUUkwsIHJjdGwgJiB+SVhHQkVfUlhDVFJMX1JYRU4pOworCWh3LT5tYWMub3BzLmRpc2FibGVfcngoaHcpOwogCiAJaXhnYmVfY29uZmlndXJlX3J4X3JpbmcoYWRhcHRlciwgcnhfcmluZyk7CiAKLQlyY3RsIHw9IElYR0JFX1JYQ1RSTF9SWEVOIHwgSVhHQkVfUlhDVFJMX0RNQllQUzsKKwlyY3RsID0gSVhHQkVfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9SWENUUkwpOworCXJjdGwgfD0gSVhHQkVfUlhDVFJMX0RNQllQUzsKIAlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9SWENUUkwsIHJjdGwpOwogCisJaHctPm1hYy5vcHMuZW5hYmxlX3J4KGh3KTsKKwogCXJldHVybiAwOwogCiBlcnJfbm9tZW06CkBAIC0yODUyLDYgKzI4NTMsNDUgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdTMyIGl4Z2JlX2dldF9yeGZoX2tleV9zaXplKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJcmV0dXJuIHNpemVvZihhZGFwdGVyLT5yc3Nfa2V5KTsKK30KKworc3RhdGljIHUzMiBpeGdiZV9yc3NfaW5kaXJfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXJldHVybiBpeGdiZV9yc3NfaW5kaXJfdGJsX2VudHJpZXMoYWRhcHRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGl4Z2JlX2dldF9yZXRhKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgKmluZGlyKQoreworCWludCBpLCByZXRhX3NpemUgPSBpeGdiZV9yc3NfaW5kaXJfdGJsX2VudHJpZXMoYWRhcHRlcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgcmV0YV9zaXplOyBpKyspCisJCWluZGlyW2ldID0gYWRhcHRlci0+cnNzX2luZGlyX3RibFtpXTsKK30KKworc3RhdGljIGludCBpeGdiZV9nZXRfcnhmaChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgKmluZGlyLCB1OCAqa2V5LAorCQkJICB1OCAqaGZ1bmMpCit7CisJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKGhmdW5jKQorCQkqaGZ1bmMgPSBFVEhfUlNTX0hBU0hfVE9QOworCisJaWYgKGluZGlyKQorCQlpeGdiZV9nZXRfcmV0YShhZGFwdGVyLCBpbmRpcik7CisKKwlpZiAoa2V5KQorCQltZW1jcHkoa2V5LCBhZGFwdGVyLT5yc3Nfa2V5LCBpeGdiZV9nZXRfcnhmaF9rZXlfc2l6ZShuZXRkZXYpKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGl4Z2JlX2dldF90c19pbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgIHN0cnVjdCBldGh0b29sX3RzX2luZm8gKmluZm8pCiB7CkBAIC0zMTA5LDYgKzMxNDksOSBAQAogCS5zZXRfY29hbGVzY2UgICAgICAgICAgID0gaXhnYmVfc2V0X2NvYWxlc2NlLAogCS5nZXRfcnhuZmMJCT0gaXhnYmVfZ2V0X3J4bmZjLAogCS5zZXRfcnhuZmMJCT0gaXhnYmVfc2V0X3J4bmZjLAorCS5nZXRfcnhmaF9pbmRpcl9zaXplCT0gaXhnYmVfcnNzX2luZGlyX3NpemUsCisJLmdldF9yeGZoX2tleV9zaXplCT0gaXhnYmVfZ2V0X3J4Zmhfa2V5X3NpemUsCisJLmdldF9yeGZoCQk9IGl4Z2JlX2dldF9yeGZoLAogCS5nZXRfY2hhbm5lbHMJCT0gaXhnYmVfZ2V0X2NoYW5uZWxzLAogCS5zZXRfY2hhbm5lbHMJCT0gaXhnYmVfc2V0X2NoYW5uZWxzLAogCS5nZXRfdHNfaW5mbwkJPSBpeGdiZV9nZXRfdHNfaW5mbywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2Zjb2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2Zjb2UuYwppbmRleCAyYWQ5MWNiLi42MzFjNjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9mY29lLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZmNvZS5jCkBAIC03MSw2ICs3MSw3IEBACiAJc3RydWN0IGl4Z2JlX2Zjb2UgKmZjb2U7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXI7CiAJc3RydWN0IGl4Z2JlX2Zjb2VfZGRwICpkZHA7CisJc3RydWN0IGl4Z2JlX2h3ICpodzsKIAl1MzIgZmNidWZmOwogCiAJaWYgKCFuZXRkZXYpCkBAIC04NSwyNSArODYsNTEgQEAKIAlpZiAoIWRkcC0+dWRsKQogCQlyZXR1cm4gMDsKIAorCWh3ID0gJmFkYXB0ZXItPmh3OwogCWxlbiA9IGRkcC0+bGVuOwotCS8qIGlmIHRoZXJlIGFuIGVycm9yLCBmb3JjZSB0byBpbnZhbGlkYXRlIGRkcCBjb250ZXh0ICovCi0JaWYgKGRkcC0+ZXJyKSB7Ci0JCXNwaW5fbG9ja19iaCgmZmNvZS0+bG9jayk7Ci0JCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX0ZDRkxULCAwKTsKLQkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRkNGTFRSVywKKwkvKiBpZiBubyBlcnJvciB0aGVuIHNraXAgZGRwIGNvbnRleHQgaW52YWxpZGF0aW9uICovCisJaWYgKCFkZHAtPmVycikKKwkJZ290byBza2lwX2RkcGludjsKKworCWlmIChody0+bWFjLnR5cGUgPT0gaXhnYmVfbWFjX1g1NTApIHsKKwkJLyogWDU1MCBkb2VzIG5vdCByZXF1aXJlIEREUCBGQ29FIGxvY2sgKi8KKworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDREZDKDAsIHhpZCksIDApOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDREZDKDMsIHhpZCksCiAJCQkJKHhpZCB8IElYR0JFX0ZDRkxUUldfV0UpKTsKLQkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRkNCVUZGLCAwKTsKLQkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfRkNETUFSVywKKworCQkvKiBwcm9ncmFtIEZDQlVGRiAqLworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDRERDKDIsIHhpZCksIDApOworCisJCS8qIHByb2dyYW0gRkNETUFSVyAqLworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDRERDKDMsIHhpZCksCisJCQkJKHhpZCB8IElYR0JFX0ZDRE1BUldfV0UpKTsKKworCQkvKiByZWFkIEZDQlVGRiB0byBjaGVjayBjb250ZXh0IGludmFsaWRhdGVkICovCisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNEREMoMywgeGlkKSwKKwkJCQkoeGlkIHwgSVhHQkVfRkNETUFSV19SRSkpOworCQlmY2J1ZmYgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRkNEREMoMiwgeGlkKSk7CisJfSBlbHNlIHsKKwkJLyogb3RoZXIgaGFyZHdhcmUgcmVxdWlyZXMgRERQIEZDb0UgbG9jayAqLworCQlzcGluX2xvY2tfYmgoJmZjb2UtPmxvY2spOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDRkxULCAwKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ0ZMVFJXLAorCQkJCSh4aWQgfCBJWEdCRV9GQ0ZMVFJXX1dFKSk7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNCVUZGLCAwKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ0RNQVJXLAogCQkJCSh4aWQgfCBJWEdCRV9GQ0RNQVJXX1dFKSk7CiAKIAkJLyogZ3VhcmFudGVlZCB0byBiZSBpbnZhbGlkYXRlZCBhZnRlciAxMDB1cyAqLwotCQlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9GQ0RNQVJXLAorCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDRE1BUlcsCiAJCQkJKHhpZCB8IElYR0JFX0ZDRE1BUldfUkUpKTsKLQkJZmNidWZmID0gSVhHQkVfUkVBRF9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9GQ0JVRkYpOworCQlmY2J1ZmYgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRkNCVUZGKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmZjb2UtPmxvY2spOwotCQlpZiAoZmNidWZmICYgSVhHQkVfRkNCVUZGX1ZBTElEKQotCQkJdWRlbGF5KDEwMCk7Ci0JfQorCQl9CisKKwlpZiAoZmNidWZmICYgSVhHQkVfRkNCVUZGX1ZBTElEKQorCQl1c2xlZXBfcmFuZ2UoMTAwLCAxNTApOworCitza2lwX2RkcGludjoKIAlpZiAoZGRwLT5zZ2wpCiAJCWRtYV91bm1hcF9zZygmYWRhcHRlci0+cGRldi0+ZGV2LCBkZHAtPnNnbCwgZGRwLT5zZ2MsCiAJCQkgICAgIERNQV9GUk9NX0RFVklDRSk7CkBAIC0yNzIsNyArMjk5LDYgQEAKIAogCS8qIHByb2dyYW0gRE1BIGNvbnRleHQgKi8KIAlodyA9ICZhZGFwdGVyLT5odzsKLQlzcGluX2xvY2tfYmgoJmZjb2UtPmxvY2spOwogCiAJLyogdHVybiBvbiBsYXN0IGZyYW1lIGluZGljYXRpb24gZm9yIHRhcmdldCBtb2RlIGFzIEZDUF9SU1B0YXJnZXQgaXMKIAkgKiBzdXBwb3NlZCB0byBzZW5kIEZDUF9SU1Agd2hlbiBpdCBpcyBkb25lLiAqLwpAQCAtMjgzLDE2ICszMDksMzMgQEAKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1JYQ1RSTCwgZmNyeGN0bCk7CiAJfQogCi0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1BUUkwsIGRkcC0+dWRwICYgRE1BX0JJVF9NQVNLKDMyKSk7Ci0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1BUUkgsICh1NjQpZGRwLT51ZHAgPj4gMzIpOwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNCVUZGLCBmY2J1ZmYpOwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNETUFSVywgZmNkbWFydyk7Ci0JLyogcHJvZ3JhbSBmaWx0ZXIgY29udGV4dCAqLwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNQQVJBTSwgMCk7Ci0JSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ0ZMVCwgSVhHQkVfRkNGTFRfVkFMSUQpOwotCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNGTFRSVywgZmNmbHRydyk7CisJaWYgKGh3LT5tYWMudHlwZSA9PSBpeGdiZV9tYWNfWDU1MCkgeworCQkvKiBYNTUwIGRvZXMgbm90IHJlcXVpcmUgRERQIGxvY2sgKi8KIAotCXNwaW5fdW5sb2NrX2JoKCZmY29lLT5sb2NrKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ0REQygwLCB4aWQpLAorCQkJCWRkcC0+dWRwICYgRE1BX0JJVF9NQVNLKDMyKSk7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNEREMoMSwgeGlkKSwgKHU2NClkZHAtPnVkcCA+PiAzMik7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNEREMoMiwgeGlkKSwgZmNidWZmKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ0REQygzLCB4aWQpLCBmY2RtYXJ3KTsKKwkJLyogcHJvZ3JhbSBmaWx0ZXIgY29udGV4dCAqLworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDREZDKDAsIHhpZCksIElYR0JFX0ZDRkxUX1ZBTElEKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ0RGQygxLCB4aWQpLCAwKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ0RGQygzLCB4aWQpLCBmY2ZsdHJ3KTsKKwl9IGVsc2UgeworCQkvKiBERFAgbG9jayBmb3IgaW5kaXJlY3QgRERQIGNvbnRleHQgYWNjZXNzICovCisJCXNwaW5fbG9ja19iaCgmZmNvZS0+bG9jayk7CisKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1BUUkwsIGRkcC0+dWRwICYgRE1BX0JJVF9NQVNLKDMyKSk7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNQVFJILCAodTY0KWRkcC0+dWRwID4+IDMyKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ0JVRkYsIGZjYnVmZik7CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNETUFSVywgZmNkbWFydyk7CisJCS8qIHByb2dyYW0gZmlsdGVyIGNvbnRleHQgKi8KKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1BBUkFNLCAwKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ0ZMVCwgSVhHQkVfRkNGTFRfVkFMSUQpOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0ZDRkxUUlcsIGZjZmx0cncpOworCisJCXNwaW5fdW5sb2NrX2JoKCZmY29lLT5sb2NrKTsKKwl9CiAKIAlyZXR1cm4gMTsKIApAQCAtMzcxLDYgKzQxNCw3IEBACiAJc3RydWN0IGZjb2VfY3JjX2VvZiAqY3JjOwogCV9fbGUzMiBmY2VyciA9IGl4Z2JlX3Rlc3Rfc3RhdGVycihyeF9kZXNjLCBJWEdCRV9SWERBRFZfRVJSX0ZDRVJSKTsKIAlfX2xlMzIgZGRwX2VycjsKKwlpbnQgZGRwX21heDsKIAl1MzIgZmN0bDsKIAl1MTYgeGlkOwogCkBAIC0zOTIsNyArNDM2LDExIEBACiAJZWxzZQogCQl4aWQgPSAgYmUxNl90b19jcHUoZmgtPmZoX3J4X2lkKTsKIAotCWlmICh4aWQgPj0gSVhHQkVfRkNPRV9ERFBfTUFYKQorCWRkcF9tYXggPSBJWEdCRV9GQ09FX0REUF9NQVg7CisJLyogWDU1MCBoYXMgZGlmZmVyZW50IEREUCBNYXggbGltaXQgKi8KKwlpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gaXhnYmVfbWFjX1g1NTApCisJCWRkcF9tYXggPSBJWEdCRV9GQ09FX0REUF9NQVhfWDU1MDsKKwlpZiAoeGlkID49IGRkcF9tYXgpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZmNvZSA9ICZhZGFwdGVyLT5mY29lOwpAQCAtNjEyLDcgKzY2MCw4IEBACiB7CiAJc3RydWN0IGl4Z2JlX3JpbmdfZmVhdHVyZSAqZmNvZSA9ICZhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX0ZDT0VdOwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7Ci0JaW50IGksIGZjb2VfcSwgZmNvZV9pOworCWludCBpLCBmY29lX3EsIGZjb2VfaSwgZmNvZV9xX2ggPSAwOworCWludCBmY3JldGFfc2l6ZTsKIAl1MzIgZXRxZjsKIAogCS8qIE1pbmltYWwgZnVuY3Rpb25hbGl0eSBmb3IgRkNvRSByZXF1aXJlcyBhdCBsZWFzdCBDUkMgb2ZmbG9hZHMgKi8KQEAgLTYzMywxMCArNjgyLDIzIEBACiAJCXJldHVybjsKIAogCS8qIFVzZSBvbmUgb3IgbW9yZSBSeCBxdWV1ZXMgZm9yIEZDb0UgYnkgcmVkaXJlY3Rpb24gdGFibGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgSVhHQkVfRkNSRVRBX1NJWkU7IGkrKykgeworCWZjcmV0YV9zaXplID0gSVhHQkVfRkNSRVRBX1NJWkU7CisJaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID09IGl4Z2JlX21hY19YNTUwKQorCQlmY3JldGFfc2l6ZSA9IElYR0JFX0ZDUkVUQV9TSVpFX1g1NTA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZmNyZXRhX3NpemU7IGkrKykgeworCQlpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gaXhnYmVfbWFjX1g1NTApIHsKKwkJCWludCBmY29lX2lfaCA9IGZjb2UtPm9mZnNldCArICgoaSArIGZjcmV0YV9zaXplKSAlCisJCQkJCQkJZmNvZS0+aW5kaWNlcyk7CisJCQlmY29lX3FfaCA9IGFkYXB0ZXItPnJ4X3JpbmdbZmNvZV9pX2hdLT5yZWdfaWR4OworCQkJZmNvZV9xX2ggPSAoZmNvZV9xX2ggPDwgSVhHQkVfRkNSRVRBX0VOVFJZX0hJR0hfU0hJRlQpICYKKwkJCQkgICBJWEdCRV9GQ1JFVEFfRU5UUllfSElHSF9NQVNLOworCQl9CisKIAkJZmNvZV9pID0gZmNvZS0+b2Zmc2V0ICsgKGkgJSBmY29lLT5pbmRpY2VzKTsKIAkJZmNvZV9pICY9IElYR0JFX0ZDUkVUQV9FTlRSWV9NQVNLOwogCQlmY29lX3EgPSBhZGFwdGVyLT5yeF9yaW5nW2Zjb2VfaV0tPnJlZ19pZHg7CisJCWZjb2VfcSB8PSBmY29lX3FfaDsKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9GQ1JFVEEoaSksIGZjb2VfcSk7CiAJfQogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfRkNSRUNUTCwgSVhHQkVfRkNSRUNUTF9FTkEpOwpAQCAtNjcyLDEzICs3MzQsMTggQEAKIHZvaWQgaXhnYmVfZnJlZV9mY29lX2RkcF9yZXNvdXJjZXMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGl4Z2JlX2Zjb2UgKmZjb2UgPSAmYWRhcHRlci0+ZmNvZTsKLQlpbnQgY3B1LCBpOworCWludCBjcHUsIGksIGRkcF9tYXg7CiAKIAkvKiBkbyBub3RoaW5nIGlmIG5vIEREUCBwb29scyB3ZXJlIGFsbG9jYXRlZCAqLwogCWlmICghZmNvZS0+ZGRwX3Bvb2wpCiAJCXJldHVybjsKIAotCWZvciAoaSA9IDA7IGkgPCBJWEdCRV9GQ09FX0REUF9NQVg7IGkrKykKKwlkZHBfbWF4ID0gSVhHQkVfRkNPRV9ERFBfTUFYOworCS8qIFg1NTAgaGFzIGRpZmZlcmVudCBERFAgTWF4IGxpbWl0ICovCisJaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlID09IGl4Z2JlX21hY19YNTUwKQorCQlkZHBfbWF4ID0gSVhHQkVfRkNPRV9ERFBfTUFYX1g1NTA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGRwX21heDsgaSsrKQogCQlpeGdiZV9mY29lX2RkcF9wdXQoYWRhcHRlci0+bmV0ZGV2LCBpKTsKIAogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCkBAIC03NTgsNiArODI1LDkgQEAKIAl9CiAKIAlhZGFwdGVyLT5uZXRkZXYtPmZjb2VfZGRwX3hpZCA9IElYR0JFX0ZDT0VfRERQX01BWCAtIDE7CisJLyogWDU1MCBoYXMgZGlmZmVyZW50IEREUCBNYXggbGltaXQgKi8KKwlpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gaXhnYmVfbWFjX1g1NTApCisJCWFkYXB0ZXItPm5ldGRldi0+ZmNvZV9kZHBfeGlkID0gSVhHQkVfRkNPRV9ERFBfTUFYX1g1NTAgLSAxOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9mY29lLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9mY29lLmgKaW5kZXggMDc3MmI3Ny4uMzgzODU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZmNvZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2Zjb2UuaApAQCAtNDYsNiArNDYsNyBAQAogI2RlZmluZSBJWEdCRV9GQ0JVRkZfTUFYCTY1NTM2CS8qIDY0S0IgbWF4ICovCiAjZGVmaW5lIElYR0JFX0ZDQlVGRl9NSU4JNDA5NgkvKiA0S0IgbWluICovCiAjZGVmaW5lIElYR0JFX0ZDT0VfRERQX01BWAk1MTIJLyogOSBiaXRzIHhpZCAqLworI2RlZmluZSBJWEdCRV9GQ09FX0REUF9NQVhfWDU1MAkyMDQ4CS8qIDExIGJpdHMgeGlkICovCiAKIC8qIERlZmF1bHQgdHJhZmZpYyBjbGFzcyB0byB1c2UgZm9yIEZDb0UgKi8KICNkZWZpbmUgSVhHQkVfRkNPRV9ERUZUQwkzCkBAIC03Nyw3ICs3OCw3IEBACiAJc3RydWN0IGl4Z2JlX2Zjb2VfZGRwX3Bvb2wgX19wZXJjcHUgKmRkcF9wb29sOwogCWF0b21pY190IHJlZmNudDsKIAlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IGl4Z2JlX2Zjb2VfZGRwIGRkcFtJWEdCRV9GQ09FX0REUF9NQVhdOworCXN0cnVjdCBpeGdiZV9mY29lX2RkcCBkZHBbSVhHQkVfRkNPRV9ERFBfTUFYX1g1NTBdOwogCXZvaWQgKmV4dHJhX2RkcF9idWZmZXI7CiAJZG1hX2FkZHJfdCBleHRyYV9kZHBfYnVmZmVyX2RtYTsKIAl1bnNpZ25lZCBsb25nIG1vZGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMKaW5kZXggNzBjYzRjNS4uZDNmNGIwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYwpAQCAtMTYxOSwxNCArMTYxOSwxMCBAQAogc3RhdGljIHZvaWQgaXhnYmVfcnhfc2tiKHN0cnVjdCBpeGdiZV9xX3ZlY3RvciAqcV92ZWN0b3IsCiAJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IHFfdmVjdG9yLT5hZGFwdGVyOwotCiAJaWYgKGl4Z2JlX3F2X2J1c3lfcG9sbGluZyhxX3ZlY3RvcikpCiAJCW5ldGlmX3JlY2VpdmVfc2tiKHNrYik7Ci0JZWxzZSBpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfSU5fTkVUUE9MTCkpCi0JCW5hcGlfZ3JvX3JlY2VpdmUoJnFfdmVjdG9yLT5uYXBpLCBza2IpOwogCWVsc2UKLQkJbmV0aWZfcngoc2tiKTsKKwkJbmFwaV9ncm9fcmVjZWl2ZSgmcV92ZWN0b3ItPm5hcGksIHNrYik7CiB9CiAKIC8qKgpAQCAtMjYwOSw3ICsyNjA1LDcgQEAKIAllaWNyID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0VJQ1MpOwogCiAJLyogVGhlIGxvd2VyIDE2Yml0cyBvZiB0aGUgRUlDUiByZWdpc3RlciBhcmUgZm9yIHRoZSBxdWV1ZSBpbnRlcnJ1cHRzCi0JICogd2hpY2ggc2hvdWxkIGJlIG1hc2tlZCBoZXJlIGluIG9yZGVyIHRvIG5vdCBhY2NpZGVudGx5IGNsZWFyIHRoZW0gaWYKKwkgKiB3aGljaCBzaG91bGQgYmUgbWFza2VkIGhlcmUgaW4gb3JkZXIgdG8gbm90IGFjY2lkZW50YWxseSBjbGVhciB0aGVtIGlmCiAJICogdGhlIGJpdHMgYXJlIGhpZ2ggd2hlbiBpeGdiZV9tc2l4X290aGVyIGlzIGNhbGxlZC4gVGhlcmUgaXMgYSByYWNlCiAJICogY29uZGl0aW9uIG90aGVyd2lzZSB3aGljaCByZXN1bHRzIGluIHBvc3NpYmxlIHBlcmZvcm1hbmNlIGxvc3MKIAkgKiBlc3BlY2lhbGx5IGlmIHRoZSBpeGdiZV9tc2l4X290aGVyIGludGVycnVwdCBpcyB0cmlnZ2VyaW5nCkBAIC0zMjMyLDE3ICszMjI4LDk4IEBACiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9TUlJDVEwocmVnX2lkeCksIHNycmN0bCk7CiB9CiAKLXN0YXRpYyB2b2lkIGl4Z2JlX3NldHVwX3JldGEoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHUzMiAqc2VlZCkKKy8qKgorICogUmV0dXJuIGEgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIFJTUyBpbmRpcmVjdGlvbiB0YWJsZQorICoKKyAqIEBhZGFwdGVyOiBkZXZpY2UgaGFuZGxlCisgKgorICogIC0gODI1OTgvODI1OTkvWDU0MDogICAgIDEyOAorICogIC0gWDU1MChub24tU1JJT1YgbW9kZSk6IDUxMgorICogIC0gWDU1MChTUklPViBtb2RlKTogICAgIDY0CisgKi8KK3UzMiBpeGdiZV9yc3NfaW5kaXJfdGJsX2VudHJpZXMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CisJaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlIDwgaXhnYmVfbWFjX1g1NTApCisJCXJldHVybiAxMjg7CisJZWxzZSBpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQpCisJCXJldHVybiA2NDsKKwllbHNlCisJCXJldHVybiA1MTI7Cit9CisKKy8qKgorICogV3JpdGUgdGhlIFJFVEEgdGFibGUgdG8gSFcKKyAqCisgKiBAYWRhcHRlcjogZGV2aWNlIGhhbmRsZQorICoKKyAqIFdyaXRlIHRoZSBSU1MgcmVkaXJlY3Rpb24gdGFibGUgc3RvcmVkIGluIGFkYXB0ZXIucnNzX2luZGlyX3RibFtdIHRvIEhXLgorICovCitzdGF0aWMgdm9pZCBpeGdiZV9zdG9yZV9yZXRhKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXUzMiBpLCByZXRhX2VudHJpZXMgPSBpeGdiZV9yc3NfaW5kaXJfdGJsX2VudHJpZXMoYWRhcHRlcik7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1MzIgcmV0YSA9IDA7Ci0JaW50IGksIGo7Ci0JaW50IHJldGFfZW50cmllcyA9IDEyODsKLQl1MTYgcnNzX2kgPSBhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1JTU10uaW5kaWNlczsKLQlpbnQgaW5kaWNlc19tdWx0aTsKKwl1MzIgaW5kaWNlc19tdWx0aTsKKwl1OCAqaW5kaXJfdGJsID0gYWRhcHRlci0+cnNzX2luZGlyX3RibDsKIAotCS8qCi0JICogUHJvZ3JhbSB0YWJsZSBmb3IgYXQgbGVhc3QgMiBxdWV1ZXMgdy8gU1ItSU9WIHNvIHRoYXQgVkZzIGNhbgorCS8qIEZpbGwgb3V0IHRoZSByZWRpcmVjdGlvbiB0YWJsZSBhcyBmb2xsb3dzOgorCSAqICAtIDgyNTk4OiAgICAgIDggYml0IHdpZGUgZW50cmllcyBjb250YWluaW5nIHBhaXIgb2YgNCBiaXQgUlNTCisJICogICAgaW5kaWNlcy4KKwkgKiAgLSA4MjU5OS9YNTQwOiA4IGJpdCB3aWRlIGVudHJpZXMgY29udGFpbmluZyA0IGJpdCBSU1MgaW5kZXgKKwkgKiAgLSBYNTUwOiAgICAgICA4IGJpdCB3aWRlIGVudHJpZXMgY29udGFpbmluZyA2IGJpdCBSU1MgaW5kZXgKKwkgKi8KKwlpZiAoYWRhcHRlci0+aHcubWFjLnR5cGUgPT0gaXhnYmVfbWFjXzgyNTk4RUIpCisJCWluZGljZXNfbXVsdGkgPSAweDExOworCWVsc2UKKwkJaW5kaWNlc19tdWx0aSA9IDB4MTsKKworCS8qIFdyaXRlIHJlZGlyZWN0aW9uIHRhYmxlIHRvIEhXICovCisJZm9yIChpID0gMDsgaSA8IHJldGFfZW50cmllczsgaSsrKSB7CisJCXJldGEgfD0gaW5kaWNlc19tdWx0aSAqIGluZGlyX3RibFtpXSA8PCAoaSAmIDB4MykgKiA4OworCQlpZiAoKGkgJiAzKSA9PSAzKSB7CisJCQlpZiAoaSA8IDEyOCkKKwkJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JFVEEoaSA+PiAyKSwgcmV0YSk7CisJCQllbHNlCisJCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9FUkVUQSgoaSA+PiAyKSAtIDMyKSwKKwkJCQkJCXJldGEpOworCQkJcmV0YSA9IDA7CisJCX0KKwl9Cit9CisKKy8qKgorICogV3JpdGUgdGhlIFJFVEEgdGFibGUgdG8gSFcgKGZvciB4NTUwIGRldmljZXMgaW4gU1JJT1YgbW9kZSkKKyAqCisgKiBAYWRhcHRlcjogZGV2aWNlIGhhbmRsZQorICoKKyAqIFdyaXRlIHRoZSBSU1MgcmVkaXJlY3Rpb24gdGFibGUgc3RvcmVkIGluIGFkYXB0ZXIucnNzX2luZGlyX3RibFtdIHRvIEhXLgorICovCitzdGF0aWMgdm9pZCBpeGdiZV9zdG9yZV92ZnJldGEoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdTMyIGksIHJldGFfZW50cmllcyA9IGl4Z2JlX3Jzc19pbmRpcl90YmxfZW50cmllcyhhZGFwdGVyKTsKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiB2ZnJldGEgPSAwOworCXVuc2lnbmVkIGludCBwZl9wb29sID0gYWRhcHRlci0+bnVtX3ZmczsKKworCS8qIFdyaXRlIHJlZGlyZWN0aW9uIHRhYmxlIHRvIEhXICovCisJZm9yIChpID0gMDsgaSA8IHJldGFfZW50cmllczsgaSsrKSB7CisJCXZmcmV0YSB8PSAodTMyKWFkYXB0ZXItPnJzc19pbmRpcl90YmxbaV0gPDwgKGkgJiAweDMpICogODsKKwkJaWYgKChpICYgMykgPT0gMykgeworCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9QRlZGUkVUQShpID4+IDIsIHBmX3Bvb2wpLAorCQkJCQl2ZnJldGEpOworCQkJdmZyZXRhID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaXhnYmVfc2V0dXBfcmV0YShzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXUzMiBpLCBqOworCXUzMiByZXRhX2VudHJpZXMgPSBpeGdiZV9yc3NfaW5kaXJfdGJsX2VudHJpZXMoYWRhcHRlcik7CisJdTE2IHJzc19pID0gYWRhcHRlci0+cmluZ19mZWF0dXJlW1JJTkdfRl9SU1NdLmluZGljZXM7CisKKwkvKiBQcm9ncmFtIHRhYmxlIGZvciBhdCBsZWFzdCAyIHF1ZXVlcyB3LyBTUi1JT1Ygc28gdGhhdCBWRnMgY2FuCiAJICogbWFrZSBmdWxsIHVzZSBvZiBhbnkgcmluZ3MgdGhleSBtYXkgaGF2ZS4gIFdlIHdpbGwgdXNlIHRoZQogCSAqIFBTUlRZUEUgcmVnaXN0ZXIgdG8gY29udHJvbCBob3cgbWFueSByaW5ncyB3ZSB1c2Ugd2l0aGluIHRoZSBQRi4KIAkgKi8KQEAgLTMyNTEsNzAgKzMzMjgsNDggQEAKIAogCS8qIEZpbGwgb3V0IGhhc2ggZnVuY3Rpb24gc2VlZHMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKLQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9SU1NSSyhpKSwgc2VlZFtpXSk7Ci0KLQkvKiBGaWxsIG91dCB0aGUgcmVkaXJlY3Rpb24gdGFibGUgYXMgZm9sbG93czoKLQkgKiA4MjU5ODogMTI4ICg4IGJpdCB3aWRlKSBlbnRyaWVzIGNvbnRhaW5pbmcgcGFpciBvZiA0IGJpdCBSU1MgaW5kaWNlcwotCSAqIDgyNTk5L1g1NDA6IDEyOCAoOCBiaXQgd2lkZSkgZW50cmllcyBjb250YWluaW5nIDQgYml0IFJTUyBpbmRleAotCSAqIFg1NTA6IDUxMiAoOCBiaXQgd2lkZSkgZW50cmllcyBjb250YWluaW5nIDYgYml0IFJTUyBpbmRleAotCSAqLwotCWlmIChhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBpeGdiZV9tYWNfODI1OThFQikKLQkJaW5kaWNlc19tdWx0aSA9IDB4MTE7Ci0JZWxzZQotCQlpbmRpY2VzX211bHRpID0gMHgxOwotCi0Jc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewotCWNhc2UgaXhnYmVfbWFjX1g1NTA6Ci0JY2FzZSBpeGdiZV9tYWNfWDU1MEVNX3g6Ci0JCWlmICghKGFkYXB0ZXItPmZsYWdzICYgSVhHQkVfRkxBR19TUklPVl9FTkFCTEVEKSkKLQkJCXJldGFfZW50cmllcyA9IDUxMjsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CisJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlNTUksoaSksIGFkYXB0ZXItPnJzc19rZXlbaV0pOwogCiAJLyogRmlsbCBvdXQgcmVkaXJlY3Rpb24gdGFibGUgKi8KKwltZW1zZXQoYWRhcHRlci0+cnNzX2luZGlyX3RibCwgMCwgc2l6ZW9mKGFkYXB0ZXItPnJzc19pbmRpcl90YmwpKTsKKwogCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgcmV0YV9lbnRyaWVzOyBpKyssIGorKykgewogCQlpZiAoaiA9PSByc3NfaSkKIAkJCWogPSAwOwotCQlyZXRhID0gKHJldGEgPDwgOCkgfCAoaiAqIGluZGljZXNfbXVsdGkpOwotCQlpZiAoKGkgJiAzKSA9PSAzKSB7Ci0JCQlpZiAoaSA8IDEyOCkKLQkJCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JFVEEoaSA+PiAyKSwgcmV0YSk7Ci0JCQllbHNlCi0JCQkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9FUkVUQSgoaSA+PiAyKSAtIDMyKSwKLQkJCQkJCXJldGEpOwotCQl9CisKKwkJYWRhcHRlci0+cnNzX2luZGlyX3RibFtpXSA9IGo7CiAJfQorCisJaXhnYmVfc3RvcmVfcmV0YShhZGFwdGVyKTsKIH0KIAotc3RhdGljIHZvaWQgaXhnYmVfc2V0dXBfdmZyZXRhKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1MzIgKnNlZWQpCitzdGF0aWMgdm9pZCBpeGdiZV9zZXR1cF92ZnJldGEoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQl1MzIgdmZyZXRhID0gMDsKIAl1MTYgcnNzX2kgPSBhZGFwdGVyLT5yaW5nX2ZlYXR1cmVbUklOR19GX1JTU10uaW5kaWNlczsKIAl1bnNpZ25lZCBpbnQgcGZfcG9vbCA9IGFkYXB0ZXItPm51bV92ZnM7CiAJaW50IGksIGo7CiAKIAkvKiBGaWxsIG91dCBoYXNoIGZ1bmN0aW9uIHNlZWRzICovCiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCi0JCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUEZWRlJTU1JLKGksIHBmX3Bvb2wpLCBzZWVkW2ldKTsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9QRlZGUlNTUksoaSwgcGZfcG9vbCksCisJCQkJYWRhcHRlci0+cnNzX2tleVtpXSk7CiAKIAkvKiBGaWxsIG91dCB0aGUgcmVkaXJlY3Rpb24gdGFibGUgKi8KIAlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDY0OyBpKyssIGorKykgewogCQlpZiAoaiA9PSByc3NfaSkKIAkJCWogPSAwOwotCQl2ZnJldGEgPSAodmZyZXRhIDw8IDgpIHwgajsKLQkJaWYgKChpICYgMykgPT0gMykKLQkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUEZWRlJFVEEoaSA+PiAyLCBwZl9wb29sKSwKLQkJCQkJdmZyZXRhKTsKKworCQlhZGFwdGVyLT5yc3NfaW5kaXJfdGJsW2ldID0gajsKIAl9CisKKwlpeGdiZV9zdG9yZV92ZnJldGEoYWRhcHRlcik7CiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JlX3NldHVwX21ycWMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAl1MzIgbXJxYyA9IDAsIHJzc19maWVsZCA9IDAsIHZmbXJxYyA9IDA7Ci0JdTMyIHJzc19rZXlbMTBdOwogCXUzMiByeGNzdW07CiAKIAkvKiBEaXNhYmxlIGluZGljYXRpbmcgY2hlY2tzdW0gaW4gZGVzY3JpcHRvciwgZW5hYmxlcyBSU1MgaGFzaCAqLwpAQCAtMzM1OCw3ICszNDEzLDcgQEAKIAlpZiAoYWRhcHRlci0+ZmxhZ3MyICYgSVhHQkVfRkxBRzJfUlNTX0ZJRUxEX0lQVjZfVURQKQogCQlyc3NfZmllbGQgfD0gSVhHQkVfTVJRQ19SU1NfRklFTERfSVBWNl9VRFA7CiAKLQluZXRkZXZfcnNzX2tleV9maWxsKHJzc19rZXksIHNpemVvZihyc3Nfa2V5KSk7CisJbmV0ZGV2X3Jzc19rZXlfZmlsbChhZGFwdGVyLT5yc3Nfa2V5LCBzaXplb2YoYWRhcHRlci0+cnNzX2tleSkpOwogCWlmICgoaHctPm1hYy50eXBlID49IGl4Z2JlX21hY19YNTUwKSAmJgogCSAgICAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX1NSSU9WX0VOQUJMRUQpKSB7CiAJCXVuc2lnbmVkIGludCBwZl9wb29sID0gYWRhcHRlci0+bnVtX3ZmczsKQEAgLTMzNjgsMTIgKzM0MjMsMTIgQEAKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9NUlFDLCBtcnFjKTsKIAogCQkvKiBTZXR1cCBSU1MgdGhyb3VnaCB0aGUgVkYgcmVnaXN0ZXJzICovCi0JCWl4Z2JlX3NldHVwX3ZmcmV0YShhZGFwdGVyLCByc3Nfa2V5KTsKKwkJaXhnYmVfc2V0dXBfdmZyZXRhKGFkYXB0ZXIpOwogCQl2Zm1ycWMgPSBJWEdCRV9NUlFDX1JTU0VOOwogCQl2Zm1ycWMgfD0gcnNzX2ZpZWxkOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1BGVkZNUlFDKHBmX3Bvb2wpLCB2Zm1ycWMpOwogCX0gZWxzZSB7Ci0JCWl4Z2JlX3NldHVwX3JldGEoYWRhcHRlciwgcnNzX2tleSk7CisJCWl4Z2JlX3NldHVwX3JldGEoYWRhcHRlcik7CiAJCW1ycWMgfD0gcnNzX2ZpZWxkOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX01SUUMsIG1ycWMpOwogCX0KQEAgLTM1NTcsNyArMzYxMiw3IEBACiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WRlJFKHJlZ19vZmZzZXQgXiAxKSwgcmVnX29mZnNldCAtIDEpOwogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfVkZURShyZWdfb2Zmc2V0KSwgKH4wKSA8PCB2Zl9zaGlmdCk7CiAJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WRlRFKHJlZ19vZmZzZXQgXiAxKSwgcmVnX29mZnNldCAtIDEpOwotCWlmIChhZGFwdGVyLT5mbGFnczIgJiBJWEdCRV9GTEFHMl9CUklER0VfTU9ERV9WRUIpCisJaWYgKGFkYXB0ZXItPmJyaWRnZV9tb2RlID09IEJSSURHRV9NT0RFX1ZFQikKIAkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9QRkRUWEdTV0MsIElYR0JFX1BGRFRYR1NXQ19WVF9MQkVOKTsKIAogCS8qIE1hcCBQRiBNQUMgYWRkcmVzcyBpbiBSQVIgRW50cnkgMCB0byBmaXJzdCBwb29sIGZvbGxvd2luZyBWRnMgKi8KQEAgLTM2MDMsNiArMzY1OCwxMCBAQAogCQkvKiBlbmFibGUgZXRoZXJ0eXBlIGFudGkgc3Bvb2ZpbmcgaWYgaHcgc3VwcG9ydHMgaXQgKi8KIAkJaWYgKGh3LT5tYWMub3BzLnNldF9ldGhlcnR5cGVfYW50aV9zcG9vZmluZykKIAkJCWh3LT5tYWMub3BzLnNldF9ldGhlcnR5cGVfYW50aV9zcG9vZmluZyhodywgdHJ1ZSwgaSk7CisKKwkJLyogRW5hYmxlL0Rpc2FibGUgUlNTIHF1ZXJ5IGZlYXR1cmUgICovCisJCWl4Z2JlX25kb19zZXRfdmZfcnNzX3F1ZXJ5X2VuKGFkYXB0ZXItPm5ldGRldiwgaSwKKwkJCQkJICBhZGFwdGVyLT52ZmluZm9baV0ucnNzX3F1ZXJ5X2VuYWJsZWQpOwogCX0KIH0KIApAQCAtMzcwNSw4ICszNzY0LDcgQEAKIAl1MzIgcnhjdHJsLCByZmN0bDsKIAogCS8qIGRpc2FibGUgcmVjZWl2ZXMgd2hpbGUgc2V0dGluZyB1cCB0aGUgZGVzY3JpcHRvcnMgKi8KLQlyeGN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUlhDVFJMKTsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYQ1RSTCwgcnhjdHJsICYgfklYR0JFX1JYQ1RSTF9SWEVOKTsKKwlody0+bWFjLm9wcy5kaXNhYmxlX3J4KGh3KTsKIAogCWl4Z2JlX3NldHVwX3BzcnR5cGUoYWRhcHRlcik7CiAJaXhnYmVfc2V0dXBfcmRyeGN0bChhZGFwdGVyKTsKQEAgLTM3MzEsNiArMzc4OSw3IEBACiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykKIAkJaXhnYmVfY29uZmlndXJlX3J4X3JpbmcoYWRhcHRlciwgYWRhcHRlci0+cnhfcmluZ1tpXSk7CiAKKwlyeGN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUlhDVFJMKTsKIAkvKiBkaXNhYmxlIGRyb3AgZW5hYmxlIGZvciA4MjU5OCBwYXJ0cyAqLwogCWlmIChody0+bWFjLnR5cGUgPT0gaXhnYmVfbWFjXzgyNTk4RUIpCiAJCXJ4Y3RybCB8PSBJWEdCRV9SWENUUkxfRE1CWVBTOwpAQCAtMzkyNCw3ICszOTgzLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaHctPm1hYy5udW1fcmFyX2VudHJpZXM7IGkrKykgewogCQlhZGFwdGVyLT5tYWNfdGFibGVbaV0uc3RhdGUgfD0gSVhHQkVfTUFDX1NUQVRFX01PRElGSUVEOwogCQlhZGFwdGVyLT5tYWNfdGFibGVbaV0uc3RhdGUgJj0gfklYR0JFX01BQ19TVEFURV9JTl9VU0U7Ci0JCW1lbXNldChhZGFwdGVyLT5tYWNfdGFibGVbaV0uYWRkciwgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKGFkYXB0ZXItPm1hY190YWJsZVtpXS5hZGRyKTsKIAkJYWRhcHRlci0+bWFjX3RhYmxlW2ldLnF1ZXVlID0gMDsKIAl9CiAJaXhnYmVfc3luY19tYWNfdGFibGUoYWRhcHRlcik7CkBAIC0zOTkyLDcgKzQwNTEsNyBAQAogCQkgICAgYWRhcHRlci0+bWFjX3RhYmxlW2ldLnF1ZXVlID09IHF1ZXVlKSB7CiAJCQlhZGFwdGVyLT5tYWNfdGFibGVbaV0uc3RhdGUgfD0gSVhHQkVfTUFDX1NUQVRFX01PRElGSUVEOwogCQkJYWRhcHRlci0+bWFjX3RhYmxlW2ldLnN0YXRlICY9IH5JWEdCRV9NQUNfU1RBVEVfSU5fVVNFOwotCQkJbWVtc2V0KGFkYXB0ZXItPm1hY190YWJsZVtpXS5hZGRyLCAwLCBFVEhfQUxFTik7CisJCQlldGhfemVyb19hZGRyKGFkYXB0ZXItPm1hY190YWJsZVtpXS5hZGRyKTsKIAkJCWFkYXB0ZXItPm1hY190YWJsZVtpXS5xdWV1ZSA9IDA7CiAJCQlpeGdiZV9zeW5jX21hY190YWJsZShhZGFwdGVyKTsKIAkJCXJldHVybiAwOwpAQCAtNTAxNCw3ICs1MDczLDYgQEAKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXN0cnVjdCBuZXRfZGV2aWNlICp1cHBlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkICppdGVyOwotCXUzMiByeGN0cmw7CiAJaW50IGk7CiAKIAkvKiBzaWduYWwgdGhhdCB3ZSBhcmUgZG93biB0byB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KQEAgLTUwMjIsOCArNTA4MCw3IEBACiAJCXJldHVybjsgLyogZG8gbm90aGluZyBpZiBhbHJlYWR5IGRvd24gKi8KIAogCS8qIGRpc2FibGUgcmVjZWl2ZXMgKi8KLQlyeGN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUlhDVFJMKTsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1JYQ1RSTCwgcnhjdHJsICYgfklYR0JFX1JYQ1RSTF9SWEVOKTsKKwlody0+bWFjLm9wcy5kaXNhYmxlX3J4KGh3KTsKIAogCS8qIGRpc2FibGUgYWxsIGVuYWJsZWQgcnggcXVldWVzICovCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPm51bV9yeF9xdWV1ZXM7IGkrKykKQEAgLTYxNzQsNyArNjIzMSw2IEBACiAKIAkvKiBDYXVzZSBzb2Z0d2FyZSBpbnRlcnJ1cHQgdG8gZW5zdXJlIHJpbmdzIGFyZSBjbGVhbmVkICovCiAJaXhnYmVfaXJxX3JlYXJtX3F1ZXVlcyhhZGFwdGVyLCBlaWNzKTsKLQogfQogCiAvKioKQEAgLTc1MDcsMTQgKzc1NjMsOSBAQAogCWlmICh0ZXN0X2JpdChfX0lYR0JFX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpCiAJCXJldHVybjsKIAotCWFkYXB0ZXItPmZsYWdzIHw9IElYR0JFX0ZMQUdfSU5fTkVUUE9MTDsKLQlpZiAoYWRhcHRlci0+ZmxhZ3MgJiBJWEdCRV9GTEFHX01TSVhfRU5BQkxFRCkgewotCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3FfdmVjdG9yczsgaSsrKQotCQkJaXhnYmVfbXNpeF9jbGVhbl9yaW5ncygwLCBhZGFwdGVyLT5xX3ZlY3RvcltpXSk7Ci0JfSBlbHNlIHsKLQkJaXhnYmVfaW50cihhZGFwdGVyLT5wZGV2LT5pcnEsIG5ldGRldik7Ci0JfQotCWFkYXB0ZXItPmZsYWdzICY9IH5JWEdCRV9GTEFHX0lOX05FVFBPTEw7CisJLyogbG9vcCB0aHJvdWdoIGFuZCBzY2hlZHVsZSBhbGwgYWN0aXZlIHF1ZXVlcyAqLworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcV92ZWN0b3JzOyBpKyspCisJCWl4Z2JlX21zaXhfY2xlYW5fcmluZ3MoMCwgYWRhcHRlci0+cV92ZWN0b3JbaV0pOwogfQogCiAjZW5kaWYKQEAgLTc4ODIsNiArNzkzMyw4MCBAQAogCXJldHVybiBuZG9fZGZsdF9mZGJfYWRkKG5kbSwgdGIsIGRldiwgYWRkciwgdmlkLCBmbGFncyk7CiB9CiAKKy8qKgorICogaXhnYmVfY29uZmlndXJlX2JyaWRnZV9tb2RlIC0gc2V0IHZhcmlvdXMgYnJpZGdlIG1vZGVzCisgKiBAYWRhcHRlciAtIHRoZSBwcml2YXRlIHN0cnVjdHVyZQorICogQG1vZGUgLSByZXF1ZXN0ZWQgYnJpZGdlIG1vZGUKKyAqCisgKiBDb25maWd1cmUgc29tZSBzZXR0aW5ncyByZXF1aXJlIGZvciB2YXJpb3VzIGJyaWRnZSBtb2Rlcy4KKyAqKi8KK3N0YXRpYyBpbnQgaXhnYmVfY29uZmlndXJlX2JyaWRnZV9tb2RlKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyLAorCQkJCSAgICAgICBfX3UxNiBtb2RlKQoreworCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJdW5zaWduZWQgaW50IHAsIG51bV9wb29sczsKKwl1MzIgdm1kY3RsOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBCUklER0VfTU9ERV9WRVBBOgorCQkvKiBkaXNhYmxlIFR4IGxvb3BiYWNrLCByZWx5IG9uIHN3aXRjaCBoYWlycGluIG1vZGUgKi8KKwkJSVhHQkVfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgSVhHQkVfUEZEVFhHU1dDLCAwKTsKKworCQkvKiBtdXN0IGVuYWJsZSBSeCBzd2l0Y2hpbmcgcmVwbGljYXRpb24gdG8gYWxsb3cgbXVsdGljYXN0CisJCSAqIHBhY2tldCByZWNlcHRpb24gb24gYWxsIFZGcywgYW5kIHRvIGVuYWJsZSBzb3VyY2UgYWRkcmVzcworCQkgKiBwcnVuaW5nLgorCQkgKi8KKwkJdm1kY3RsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZNRF9DVEwpOworCQl2bWRjdGwgfD0gSVhHQkVfVlRfQ1RMX1JFUExFTjsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WTURfQ1RMLCB2bWRjdGwpOworCisJCS8qIGVuYWJsZSBSeCBzb3VyY2UgYWRkcmVzcyBwcnVuaW5nLiBOb3RlLCB0aGlzIHJlcXVpcmVzCisJCSAqIHJlcGxpY2F0aW9uIHRvIGJlIGVuYWJsZWQgb3IgZWxzZSBpdCBkb2VzIG5vdGhpbmcuCisJCSAqLworCQludW1fcG9vbHMgPSBhZGFwdGVyLT5udW1fdmZzICsgYWRhcHRlci0+bnVtX3J4X3Bvb2xzOworCQlmb3IgKHAgPSAwOyBwIDwgbnVtX3Bvb2xzOyBwKyspIHsKKwkJCWlmIChody0+bWFjLm9wcy5zZXRfc291cmNlX2FkZHJlc3NfcHJ1bmluZykKKwkJCQlody0+bWFjLm9wcy5zZXRfc291cmNlX2FkZHJlc3NfcHJ1bmluZyhodywKKwkJCQkJCQkJICAgICAgIHRydWUsCisJCQkJCQkJCSAgICAgICBwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEJSSURHRV9NT0RFX1ZFQjoKKwkJLyogZW5hYmxlIFR4IGxvb3BiYWNrIGZvciBpbnRlcm5hbCBWRi9QRiBjb21tdW5pY2F0aW9uICovCisJCUlYR0JFX1dSSVRFX1JFRygmYWRhcHRlci0+aHcsIElYR0JFX1BGRFRYR1NXQywKKwkJCQlJWEdCRV9QRkRUWEdTV0NfVlRfTEJFTik7CisKKwkJLyogZGlzYWJsZSBSeCBzd2l0Y2hpbmcgcmVwbGljYXRpb24gdW5sZXNzIHdlIGhhdmUgU1ItSU9WCisJCSAqIHZpcnR1YWwgZnVuY3Rpb25zCisJCSAqLworCQl2bWRjdGwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVk1EX0NUTCk7CisJCWlmICghYWRhcHRlci0+bnVtX3ZmcykKKwkJCXZtZGN0bCAmPSB+SVhHQkVfVlRfQ1RMX1JFUExFTjsKKwkJSVhHQkVfV1JJVEVfUkVHKGh3LCBJWEdCRV9WTURfQ1RMLCB2bWRjdGwpOworCisJCS8qIGRpc2FibGUgUnggc291cmNlIGFkZHJlc3MgcHJ1bmluZywgc2luY2Ugd2UgZG9uJ3QgZXhwZWN0IHRvCisJCSAqIGJlIHJlY2VpdmluZyBleHRlcm5hbCBsb29wYmFjayBvZiBvdXIgdHJhbnNtaXR0ZWQgZnJhbWVzLgorCQkgKi8KKwkJbnVtX3Bvb2xzID0gYWRhcHRlci0+bnVtX3ZmcyArIGFkYXB0ZXItPm51bV9yeF9wb29sczsKKwkJZm9yIChwID0gMDsgcCA8IG51bV9wb29sczsgcCsrKSB7CisJCQlpZiAoaHctPm1hYy5vcHMuc2V0X3NvdXJjZV9hZGRyZXNzX3BydW5pbmcpCisJCQkJaHctPm1hYy5vcHMuc2V0X3NvdXJjZV9hZGRyZXNzX3BydW5pbmcoaHcsCisJCQkJCQkJCSAgICAgICBmYWxzZSwKKwkJCQkJCQkJICAgICAgIHApOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFkYXB0ZXItPmJyaWRnZV9tb2RlID0gbW9kZTsKKworCWVfaW5mbyhkcnYsICJlbmFibGluZyBicmlkZ2UgbW9kZTogJXNcbiIsCisJICAgICAgIG1vZGUgPT0gQlJJREdFX01PREVfVkVQQSA/ICJWRVBBIiA6ICJWRUIiKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGl4Z2JlX25kb19icmlkZ2Vfc2V0bGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdTE2IGZsYWdzKQogewpAQCAtNzg5Nyw4ICs4MDIyLDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlubGFfZm9yX2VhY2hfbmVzdGVkKGF0dHIsIGJyX3NwZWMsIHJlbSkgeworCQl1MzIgc3RhdHVzOwogCQlfX3UxNiBtb2RlOwotCQl1MzIgcmVnID0gMDsKIAogCQlpZiAobmxhX3R5cGUoYXR0cikgIT0gSUZMQV9CUklER0VfTU9ERSkKIAkJCWNvbnRpbnVlOwpAQCAtNzkwNywxOSArODAzMiwxMSBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJbW9kZSA9IG5sYV9nZXRfdTE2KGF0dHIpOwotCQlpZiAobW9kZSA9PSBCUklER0VfTU9ERV9WRVBBKSB7Ci0JCQlyZWcgPSAwOwotCQkJYWRhcHRlci0+ZmxhZ3MyICY9IH5JWEdCRV9GTEFHMl9CUklER0VfTU9ERV9WRUI7Ci0JCX0gZWxzZSBpZiAobW9kZSA9PSBCUklER0VfTU9ERV9WRUIpIHsKLQkJCXJlZyA9IElYR0JFX1BGRFRYR1NXQ19WVF9MQkVOOwotCQkJYWRhcHRlci0+ZmxhZ3MyIHw9IElYR0JFX0ZMQUcyX0JSSURHRV9NT0RFX1ZFQjsKLQkJfSBlbHNlCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhdHVzID0gaXhnYmVfY29uZmlndXJlX2JyaWRnZV9tb2RlKGFkYXB0ZXIsIG1vZGUpOworCQlpZiAoc3RhdHVzKQorCQkJcmV0dXJuIHN0YXR1czsKIAotCQlJWEdCRV9XUklURV9SRUcoJmFkYXB0ZXItPmh3LCBJWEdCRV9QRkRUWEdTV0MsIHJlZyk7Ci0KLQkJZV9pbmZvKGRydiwgImVuYWJsaW5nIGJyaWRnZSBtb2RlOiAlc1xuIiwKLQkJCW1vZGUgPT0gQlJJREdFX01PREVfVkVQQSA/ICJWRVBBIiA6ICJWRUIiKTsKKwkJYnJlYWs7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC03OTMwLDE3ICs4MDQ3LDEyIEBACiAJCQkJICAgIHUzMiBmaWx0ZXJfbWFzaykKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7Ci0JdTE2IG1vZGU7CiAKIAlpZiAoIShhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfU1JJT1ZfRU5BQkxFRCkpCiAJCXJldHVybiAwOwogCi0JaWYgKGFkYXB0ZXItPmZsYWdzMiAmIElYR0JFX0ZMQUcyX0JSSURHRV9NT0RFX1ZFQikKLQkJbW9kZSA9IEJSSURHRV9NT0RFX1ZFQjsKLQllbHNlCi0JCW1vZGUgPSBCUklER0VfTU9ERV9WRVBBOwotCi0JcmV0dXJuIG5kb19kZmx0X2JyaWRnZV9nZXRsaW5rKHNrYiwgcGlkLCBzZXEsIGRldiwgbW9kZSwgMCwgMCk7CisJcmV0dXJuIG5kb19kZmx0X2JyaWRnZV9nZXRsaW5rKHNrYiwgcGlkLCBzZXEsIGRldiwKKwkJCQkgICAgICAgYWRhcHRlci0+YnJpZGdlX21vZGUsIDAsIDApOwogfQogCiBzdGF0aWMgdm9pZCAqaXhnYmVfZndkX2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqcGRldiwgc3RydWN0IG5ldF9kZXZpY2UgKnZkZXYpCkBAIC04MDUyLDYgKzgxNjQsNyBAQAogCS5uZG9fc2V0X3ZmX3ZsYW4JPSBpeGdiZV9uZG9fc2V0X3ZmX3ZsYW4sCiAJLm5kb19zZXRfdmZfcmF0ZQk9IGl4Z2JlX25kb19zZXRfdmZfYncsCiAJLm5kb19zZXRfdmZfc3Bvb2ZjaGsJPSBpeGdiZV9uZG9fc2V0X3ZmX3Nwb29mY2hrLAorCS5uZG9fc2V0X3ZmX3Jzc19xdWVyeV9lbiA9IGl4Z2JlX25kb19zZXRfdmZfcnNzX3F1ZXJ5X2VuLAogCS5uZG9fZ2V0X3ZmX2NvbmZpZwk9IGl4Z2JlX25kb19nZXRfdmZfY29uZmlnLAogCS5uZG9fZ2V0X3N0YXRzNjQJPSBpeGdiZV9nZXRfc3RhdHM2NCwKICNpZmRlZiBDT05GSUdfSVhHQkVfRENCCkBAIC04NDA2LDcgKzg1MTksNiBAQAogCQkJICAgTkVUSUZfRl9JUFY2X0NTVU0gfAogCQkJICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfAogCQkJICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlggfAotCQkJICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfRklMVEVSIHwKIAkJCSAgIE5FVElGX0ZfVFNPIHwKIAkJCSAgIE5FVElGX0ZfVFNPNiB8CiAJCQkgICBORVRJRl9GX1JYSEFTSCB8CkBAIC04NDI4LDYgKzg1NDAsNyBAQAogCX0KIAogCW5ldGRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9SWEFMTDsKKwluZXRkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9DVEFHX0ZJTFRFUjsKIAogCW5ldGRldi0+dmxhbl9mZWF0dXJlcyB8PSBORVRJRl9GX1RTTzsKIAluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9UU082OwpAQCAtODk4OSw4ICs5MTAyLDYgQEAKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJml4Z2JlX2RyaXZlcik7CiAKIAlpeGdiZV9kYmdfZXhpdCgpOwotCi0JcmN1X2JhcnJpZXIoKTsgLyogV2FpdCBmb3IgY29tcGxldGlvbiBvZiBjYWxsX3JjdSgpJ3MgKi8KIH0KIAogI2lmZGVmIENPTkZJR19JWEdCRV9EQ0EKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21ieC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWJ4LmgKaW5kZXggYTVjYjc1NS4uYjFlNDcwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWJ4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWJ4LmgKQEAgLTczLDYgKzczLDcgQEAKIAlpeGdiZV9tYm94X2FwaV8xMCwJLyogQVBJIHZlcnNpb24gMS4wLCBsaW51eC9mcmVlYnNkIFZGIGRyaXZlciAqLwogCWl4Z2JlX21ib3hfYXBpXzIwLAkvKiBBUEkgdmVyc2lvbiAyLjAsIHNvbGFyaXMgUGhhc2UxIFZGIGRyaXZlciAqLwogCWl4Z2JlX21ib3hfYXBpXzExLAkvKiBBUEkgdmVyc2lvbiAxLjEsIGxpbnV4L2ZyZWVic2QgVkYgZHJpdmVyICovCisJaXhnYmVfbWJveF9hcGlfMTIsCS8qIEFQSSB2ZXJzaW9uIDEuMiwgbGludXgvZnJlZWJzZCBWRiBkcml2ZXIgKi8KIAkvKiBUaGlzIHZhbHVlIHNob3VsZCBhbHdheXMgYmUgbGFzdCAqLwogCWl4Z2JlX21ib3hfYXBpX3Vua25vd24sCS8qIGluZGljYXRlcyB0aGF0IEFQSSB2ZXJzaW9uIGlzIG5vdCBrbm93biAqLwogfTsKQEAgLTk3LDYgKzk4LDEwIEBACiAjZGVmaW5lIElYR0JFX1ZGX1RSQU5TX1ZMQU4JMwkvKiBJbmRpY2F0aW9uIG9mIHBvcnQgdmxhbiAqLwogI2RlZmluZSBJWEdCRV9WRl9ERUZfUVVFVUUJNAkvKiBEZWZhdWx0IHF1ZXVlIG9mZnNldCAqLwogCisvKiBtYWlsYm94IEFQSSwgdmVyc2lvbiAxLjIgVkYgcmVxdWVzdHMgKi8KKyNkZWZpbmUgSVhHQkVfVkZfR0VUX1JFVEEJMHgwYQkvKiBWRiByZXF1ZXN0IGZvciBSRVRBICovCisjZGVmaW5lIElYR0JFX1ZGX0dFVF9SU1NfS0VZCTB4MGIJLyogZ2V0IFJTUyBrZXkgKi8KKwogLyogbGVuZ3RoIG9mIHBlcm1hbmVudCBhZGRyZXNzIG1lc3NhZ2UgcmV0dXJuZWQgZnJvbSBQRiAqLwogI2RlZmluZSBJWEdCRV9WRl9QRVJNQUREUl9NU0dfTEVOIDQKIC8qIHdvcmQgaW4gcGVybWFuZW50IGFkZHJlc3MgbWVzc2FnZSB3aXRoIHRoZSBjdXJyZW50IG11bHRpY2FzdCB0eXBlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3B0cC5jCmluZGV4IDc5YzAwZjUuLmU1YmEwNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3B0cC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3B0cC5jCkBAIC0yNzksMjAgKzI3OSwxOCBAQAogICogcmVhZCB0aGUgdGltZWNvdW50ZXIgYW5kIHJldHVybiB0aGUgY29ycmVjdCB2YWx1ZSBvbiBucywKICAqIGFmdGVyIGNvbnZlcnRpbmcgaXQgaW50byBhIHN0cnVjdCB0aW1lc3BlYy4KICAqLwotc3RhdGljIGludCBpeGdiZV9wdHBfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgc3RydWN0IHRpbWVzcGVjICp0cykKK3N0YXRpYyBpbnQgaXhnYmVfcHRwX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9CiAJCWNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBpeGdiZV9hZGFwdGVyLCBwdHBfY2Fwcyk7CiAJdTY0IG5zOwotCXUzMiByZW1haW5kZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT50bXJlZ19sb2NrLCBmbGFncyk7CiAJbnMgPSB0aW1lY291bnRlcl9yZWFkKCZhZGFwdGVyLT50Yyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+dG1yZWdfbG9jaywgZmxhZ3MpOwogCi0JdHMtPnR2X3NlYyA9IGRpdl91NjRfcmVtKG5zLCAxMDAwMDAwMDAwVUxMLCAmcmVtYWluZGVyKTsKLQl0cy0+dHZfbnNlYyA9IHJlbWFpbmRlcjsKKwkqdHMgPSBuc190b190aW1lc3BlYzY0KG5zKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzA2LDE1ICszMDQsMTQgQEAKICAqIHdhbGwgdGltZXIgdmFsdWUuCiAgKi8KIHN0YXRpYyBpbnQgaXhnYmVfcHRwX3NldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMpCisJCQkgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9CiAJCWNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBpeGdiZV9hZGFwdGVyLCBwdHBfY2Fwcyk7CiAJdTY0IG5zOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlucyA9IHRzLT50dl9zZWMgKiAxMDAwMDAwMDAwVUxMOwotCW5zICs9IHRzLT50dl9uc2VjOworCW5zID0gdGltZXNwZWM2NF90b19ucyh0cyk7CiAKIAkvKiByZXNldCB0aGUgdGltZWNvdW50ZXIgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+dG1yZWdfbG9jaywgZmxhZ3MpOwpAQCAtNDA3LDcgKzQwNCw3IEBACiB7CiAJYm9vbCB0aW1lb3V0ID0gdGltZV9pc19iZWZvcmVfamlmZmllcyhhZGFwdGVyLT5sYXN0X292ZXJmbG93X2NoZWNrICsKIAkJCQkJICAgICBJWEdCRV9PVkVSRkxPV19QRVJJT0QpOwotCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlzdHJ1Y3QgdGltZXNwZWM2NCB0czsKIAogCWlmICh0aW1lb3V0KSB7CiAJCWl4Z2JlX3B0cF9nZXR0aW1lKCZhZGFwdGVyLT5wdHBfY2FwcywgJnRzKTsKQEAgLTQ4OCw3ICs0ODUsNyBAQAogICogQHdvcms6IHBvaW50ZXIgdG8gdGhlIHdvcmsgc3RydWN0CiAgKgogICogVGhpcyB3b3JrIGl0ZW0gcG9sbHMgVFNZTkNUWENUTCB2YWxpZCBiaXQgdG8gZGV0ZXJtaW5lIHdoZW4gYSBUeCBoYXJkd2FyZQotICogdGltZXN0YW1wIGhhcyBiZWVuIHRha2VuIGZvciB0aGUgY3VycmVudCBza2IuIEl0IGlzIG5lY2VzYXJ5LCBiZWNhdXNlIHRoZQorICogdGltZXN0YW1wIGhhcyBiZWVuIHRha2VuIGZvciB0aGUgY3VycmVudCBza2IuIEl0IGlzIG5lY2Vzc2FyeSwgYmVjYXVzZSB0aGUKICAqIGRlc2NyaXB0b3IncyAiZG9uZSIgYml0IGRvZXMgbm90IGNvcnJlbGF0ZSB3aXRoIHRoZSB0aW1lc3RhbXAgZXZlbnQuCiAgKi8KIHN0YXRpYyB2b2lkIGl4Z2JlX3B0cF90eF9od3RzdGFtcF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTg3NCw4ICs4NzEsOCBAQAogCQlhZGFwdGVyLT5wdHBfY2Fwcy5wcHMgPSAxOwogCQlhZGFwdGVyLT5wdHBfY2Fwcy5hZGpmcmVxID0gaXhnYmVfcHRwX2FkamZyZXE7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLmFkanRpbWUgPSBpeGdiZV9wdHBfYWRqdGltZTsKLQkJYWRhcHRlci0+cHRwX2NhcHMuZ2V0dGltZSA9IGl4Z2JlX3B0cF9nZXR0aW1lOwotCQlhZGFwdGVyLT5wdHBfY2Fwcy5zZXR0aW1lID0gaXhnYmVfcHRwX3NldHRpbWU7CisJCWFkYXB0ZXItPnB0cF9jYXBzLmdldHRpbWU2NCA9IGl4Z2JlX3B0cF9nZXR0aW1lOworCQlhZGFwdGVyLT5wdHBfY2Fwcy5zZXR0aW1lNjQgPSBpeGdiZV9wdHBfc2V0dGltZTsKIAkJYWRhcHRlci0+cHRwX2NhcHMuZW5hYmxlID0gaXhnYmVfcHRwX2ZlYXR1cmVfZW5hYmxlOwogCQlicmVhazsKIAljYXNlIGl4Z2JlX21hY184MjU5OUVCOgpAQCAtODkwLDggKzg4Nyw4IEBACiAJCWFkYXB0ZXItPnB0cF9jYXBzLnBwcyA9IDA7CiAJCWFkYXB0ZXItPnB0cF9jYXBzLmFkamZyZXEgPSBpeGdiZV9wdHBfYWRqZnJlcTsKIAkJYWRhcHRlci0+cHRwX2NhcHMuYWRqdGltZSA9IGl4Z2JlX3B0cF9hZGp0aW1lOwotCQlhZGFwdGVyLT5wdHBfY2Fwcy5nZXR0aW1lID0gaXhnYmVfcHRwX2dldHRpbWU7Ci0JCWFkYXB0ZXItPnB0cF9jYXBzLnNldHRpbWUgPSBpeGdiZV9wdHBfc2V0dGltZTsKKwkJYWRhcHRlci0+cHRwX2NhcHMuZ2V0dGltZTY0ID0gaXhnYmVfcHRwX2dldHRpbWU7CisJCWFkYXB0ZXItPnB0cF9jYXBzLnNldHRpbWU2NCA9IGl4Z2JlX3B0cF9zZXR0aW1lOwogCQlhZGFwdGVyLT5wdHBfY2Fwcy5lbmFibGUgPSBpeGdiZV9wdHBfZmVhdHVyZV9lbmFibGU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuYwppbmRleCA3ZjM3ZmU3Li4xZDE3YjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KICNpZmRlZiBORVRJRl9GX0hXX1ZMQU5fQ1RBR19UWAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNlbmRpZgpAQCAtNzksNyArODAsNyBAQAogCiAJLyogSW5pdGlhbGl6ZSBkZWZhdWx0IHN3aXRjaGluZyBtb2RlIFZFQiAqLwogCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUEZEVFhHU1dDLCBJWEdCRV9QRkRUWEdTV0NfVlRfTEJFTik7Ci0JYWRhcHRlci0+ZmxhZ3MyIHw9IElYR0JFX0ZMQUcyX0JSSURHRV9NT0RFX1ZFQjsKKwlhZGFwdGVyLT5icmlkZ2VfbW9kZSA9IEJSSURHRV9NT0RFX1ZFQjsKIAogCS8qIElmIGNhbGwgdG8gZW5hYmxlIFZGcyBzdWNjZWVkZWQgdGhlbiBhbGxvY2F0ZSBtZW1vcnkKIAkgKiBmb3IgcGVyIFZGIGNvbnRyb2wgc3RydWN0dXJlcy4KQEAgLTEwNSw5ICsxMDYsMTggQEAKIAkJYWRhcHRlci0+ZmxhZ3MyICY9IH4oSVhHQkVfRkxBRzJfUlNDX0NBUEFCTEUgfAogCQkJCSAgICAgSVhHQkVfRkxBRzJfUlNDX0VOQUJMRUQpOwogCi0JCS8qIGVuYWJsZSBzcG9vZiBjaGVja2luZyBmb3IgYWxsIFZGcyAqLwotCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3ZmczsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3ZmczsgaSsrKSB7CisJCQkvKiBlbmFibGUgc3Bvb2YgY2hlY2tpbmcgZm9yIGFsbCBWRnMgKi8KIAkJCWFkYXB0ZXItPnZmaW5mb1tpXS5zcG9vZmNoa19lbmFibGVkID0gdHJ1ZTsKKworCQkJLyogV2Ugc3VwcG9ydCBWRiBSU1MgcXVlcnlpbmcgb25seSBmb3IgODI1OTkgYW5kIHg1NDAKKwkJCSAqIGRldmljZXMgYXQgdGhlIG1vbWVudC4gVGhlc2UgZGV2aWNlcyBzaGFyZSBSU1MKKwkJCSAqIGluZGlyZWN0aW9uIHRhYmxlIGFuZCBSU1MgaGFzaCBrZXkgd2l0aCBQRiB0aGVyZWZvcmUKKwkJCSAqIHdlIHdhbnQgdG8gZGlzYWJsZSB0aGUgcXVlcnlpbmcgYnkgZGVmYXVsdC4KKwkJCSAqLworCQkJYWRhcHRlci0+dmZpbmZvW2ldLnJzc19xdWVyeV9lbmFibGVkID0gMDsKKwkJfQorCiAJCXJldHVybiAwOwogCX0KIApAQCAtMTQxLDcgKzE1MSw3IEBACiAJCSAqIFRoZSA4MjU5OSBzdXBwb3J0cyB1cCB0byA2NCBWRnMgcGVyIHBoeXNpY2FsIGZ1bmN0aW9uCiAJCSAqIGJ1dCB0aGlzIGltcGxlbWVudGF0aW9uIGxpbWl0cyBhbGxvY2F0aW9uIHRvIDYzIHNvIHRoYXQKIAkJICogYmFzaWMgbmV0d29ya2luZyByZXNvdXJjZXMgYXJlIHN0aWxsIGF2YWlsYWJsZSB0byB0aGUKLQkJICogcGh5c2ljYWwgZnVuY3Rpb24uICBJZiB0aGUgdXNlciByZXF1ZXN0cyBncmVhdGVyIHRobgorCQkgKiBwaHlzaWNhbCBmdW5jdGlvbi4gIElmIHRoZSB1c2VyIHJlcXVlc3RzIGdyZWF0ZXIgdGhhbgogCQkgKiA2MyBWRnMgdGhlbiBpdCBpcyBhbiBlcnJvciAtIHJlc2V0IHRvIGRlZmF1bHQgb2YgemVyby4KIAkJICovCiAJCWFkYXB0ZXItPm51bV92ZnMgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGFkYXB0ZXItPm51bV92ZnMsIElYR0JFX01BWF9WRlNfRFJWX0xJTUlUKTsKQEAgLTQyNCw2ICs0MzQsNyBAQAogI2VuZGlmIC8qIENPTkZJR19GQ09FICovCiAJCXN3aXRjaCAoYWRhcHRlci0+dmZpbmZvW3ZmXS52Zl9hcGkpIHsKIAkJY2FzZSBpeGdiZV9tYm94X2FwaV8xMToKKwkJY2FzZSBpeGdiZV9tYm94X2FwaV8xMjoKIAkJCS8qCiAJCQkgKiBWZXJzaW9uIDEuMSBzdXBwb3J0cyBqdW1ibyBmcmFtZXMgb24gVkZzIGlmIFBGIGhhcwogCQkJICoganVtYm8gZnJhbWVzIGVuYWJsZWQgd2hpY2ggbWVhbnMgbGVnYWN5IFZGcyBhcmUKQEAgLTg5MSw2ICs5MDIsNyBAQAogCXN3aXRjaCAoYXBpKSB7CiAJY2FzZSBpeGdiZV9tYm94X2FwaV8xMDoKIAljYXNlIGl4Z2JlX21ib3hfYXBpXzExOgorCWNhc2UgaXhnYmVfbWJveF9hcGlfMTI6CiAJCWFkYXB0ZXItPnZmaW5mb1t2Zl0udmZfYXBpID0gYXBpOwogCQlyZXR1cm4gMDsKIAlkZWZhdWx0OgpAQCAtOTE0LDYgKzkyNiw3IEBACiAJc3dpdGNoIChhZGFwdGVyLT52ZmluZm9bdmZdLnZmX2FwaSkgewogCWNhc2UgaXhnYmVfbWJveF9hcGlfMjA6CiAJY2FzZSBpeGdiZV9tYm94X2FwaV8xMToKKwljYXNlIGl4Z2JlX21ib3hfYXBpXzEyOgogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLTE7CkBAIC05NDEsNiArOTU0LDUzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaXhnYmVfZ2V0X3ZmX3JldGEoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiAqbXNnYnVmLCB1MzIgdmYpCit7CisJdTMyIGksIGo7CisJdTMyICpvdXRfYnVmID0gJm1zZ2J1ZlsxXTsKKwljb25zdCB1OCAqcmV0YSA9IGFkYXB0ZXItPnJzc19pbmRpcl90Ymw7CisJdTMyIHJldGFfc2l6ZSA9IGl4Z2JlX3Jzc19pbmRpcl90YmxfZW50cmllcyhhZGFwdGVyKTsKKworCS8qIENoZWNrIGlmIG9wZXJhdGlvbiBpcyBwZXJtaXR0ZWQgKi8KKwlpZiAoIWFkYXB0ZXItPnZmaW5mb1t2Zl0ucnNzX3F1ZXJ5X2VuYWJsZWQpCisJCXJldHVybiAtRVBFUk07CisKKwkvKiB2ZXJpZnkgdGhlIFBGIGlzIHN1cHBvcnRpbmcgdGhlIGNvcnJlY3QgQVBJICovCisJaWYgKGFkYXB0ZXItPnZmaW5mb1t2Zl0udmZfYXBpICE9IGl4Z2JlX21ib3hfYXBpXzEyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkvKiBUaGlzIG1haWxib3ggY29tbWFuZCBpcyBzdXBwb3J0ZWQgKHJlcXVpcmVkKSBvbmx5IGZvciA4MjU5OSBhbmQgeDU0MAorCSAqIFZGcyB3aGljaCBzdXBwb3J0IHVwIHRvIDQgUlNTIHF1ZXVlcy4gVGhlcmVmb3JlIHdlIHdpbGwgY29tcHJlc3MgdGhlCisJICogUkVUQSBieSBzYXZpbmcgb25seSAyIGJpdHMgZnJvbSBlYWNoIGVudHJ5LiBUaGlzIHdheSB3ZSB3aWxsIGJlIGFibGUKKwkgKiB0byB0cmFuc2ZlciB0aGUgd2hvbGUgUkVUQSBpbiBhIHNpbmdsZSBtYWlsYm94IG9wZXJhdGlvbi4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcmV0YV9zaXplIC8gMTY7IGkrKykgeworCQlvdXRfYnVmW2ldID0gMDsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisJCQlvdXRfYnVmW2ldIHw9ICh1MzIpKHJldGFbMTYgKiBpICsgal0gJiAweDMpIDw8ICgyICogaik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXhnYmVfZ2V0X3ZmX3Jzc19rZXkoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJdTMyICptc2didWYsIHUzMiB2ZikKK3sKKwl1MzIgKnJzc19rZXkgPSAmbXNnYnVmWzFdOworCisJLyogQ2hlY2sgaWYgdGhlIG9wZXJhdGlvbiBpcyBwZXJtaXR0ZWQgKi8KKwlpZiAoIWFkYXB0ZXItPnZmaW5mb1t2Zl0ucnNzX3F1ZXJ5X2VuYWJsZWQpCisJCXJldHVybiAtRVBFUk07CisKKwkvKiB2ZXJpZnkgdGhlIFBGIGlzIHN1cHBvcnRpbmcgdGhlIGNvcnJlY3QgQVBJICovCisJaWYgKGFkYXB0ZXItPnZmaW5mb1t2Zl0udmZfYXBpICE9IGl4Z2JlX21ib3hfYXBpXzEyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltZW1jcHkocnNzX2tleSwgYWRhcHRlci0+cnNzX2tleSwgc2l6ZW9mKGFkYXB0ZXItPnJzc19rZXkpKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGl4Z2JlX3Jjdl9tc2dfZnJvbV92ZihzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIHZmKQogewogCXUzMiBtYnhfc2l6ZSA9IElYR0JFX1ZGTUFJTEJPWF9TSVpFOwpAQCAtOTk3LDYgKzEwNTcsMTIgQEAKIAljYXNlIElYR0JFX1ZGX0dFVF9RVUVVRVM6CiAJCXJldHZhbCA9IGl4Z2JlX2dldF92Zl9xdWV1ZXMoYWRhcHRlciwgbXNnYnVmLCB2Zik7CiAJCWJyZWFrOworCWNhc2UgSVhHQkVfVkZfR0VUX1JFVEE6CisJCXJldHZhbCA9IGl4Z2JlX2dldF92Zl9yZXRhKGFkYXB0ZXIsIG1zZ2J1ZiwgdmYpOworCQlicmVhazsKKwljYXNlIElYR0JFX1ZGX0dFVF9SU1NfS0VZOgorCQlyZXR2YWwgPSBpeGdiZV9nZXRfdmZfcnNzX2tleShhZGFwdGVyLCBtc2didWYsIHZmKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZV9lcnIoZHJ2LCAiVW5oYW5kbGVkIE1zZyAlOC44eFxuIiwgbXNnYnVmWzBdKTsKIAkJcmV0dmFsID0gSVhHQkVfRVJSX01CWDsKQEAgLTEzMzAsNiArMTM5NiwyNiBAQAogCXJldHVybiAwOwogfQogCitpbnQgaXhnYmVfbmRvX3NldF92Zl9yc3NfcXVlcnlfZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLAorCQkJCSAgYm9vbCBzZXR0aW5nKQoreworCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIFRoaXMgb3BlcmF0aW9uIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgODI1OTkgYW5kIHg1NDAKKwkgKiBkZXZpY2VzLgorCSAqLworCWlmIChhZGFwdGVyLT5ody5tYWMudHlwZSA8IGl4Z2JlX21hY184MjU5OUVCIHx8CisJICAgIGFkYXB0ZXItPmh3Lm1hYy50eXBlID49IGl4Z2JlX21hY19YNTUwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAodmYgPj0gYWRhcHRlci0+bnVtX3ZmcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhZGFwdGVyLT52ZmluZm9bdmZdLnJzc19xdWVyeV9lbmFibGVkID0gc2V0dGluZzsKKworCXJldHVybiAwOworfQorCiBpbnQgaXhnYmVfbmRvX2dldF92Zl9jb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKIAkJCSAgICBpbnQgdmYsIHN0cnVjdCBpZmxhX3ZmX2luZm8gKml2aSkKIHsKQEAgLTEzNDMsNSArMTQyOSw2IEBACiAJaXZpLT52bGFuID0gYWRhcHRlci0+dmZpbmZvW3ZmXS5wZl92bGFuOwogCWl2aS0+cW9zID0gYWRhcHRlci0+dmZpbmZvW3ZmXS5wZl9xb3M7CiAJaXZpLT5zcG9vZmNoayA9IGFkYXB0ZXItPnZmaW5mb1t2Zl0uc3Bvb2ZjaGtfZW5hYmxlZDsKKwlpdmktPnJzc19xdWVyeV9lbiA9IGFkYXB0ZXItPnZmaW5mb1t2Zl0ucnNzX3F1ZXJ5X2VuYWJsZWQ7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuaAppbmRleCAzMmMyNmQ1Li4yYzE5N2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmgKQEAgLTQ3LDYgKzQ3LDggQEAKIGludCBpeGdiZV9uZG9fc2V0X3ZmX2J3KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgaW50IG1pbl90eF9yYXRlLAogCQkJaW50IG1heF90eF9yYXRlKTsKIGludCBpeGdiZV9uZG9fc2V0X3ZmX3Nwb29mY2hrKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCB2ZiwgYm9vbCBzZXR0aW5nKTsKK2ludCBpeGdiZV9uZG9fc2V0X3ZmX3Jzc19xdWVyeV9lbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgdmYsCisJCQkJICBib29sIHNldHRpbmcpOwogaW50IGl4Z2JlX25kb19nZXRfdmZfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCiAJCQkgICAgaW50IHZmLCBzdHJ1Y3QgaWZsYV92Zl9pbmZvICppdmkpOwogdm9pZCBpeGdiZV9jaGVja192Zl9yYXRlX2xpbWl0KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3R5cGUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3R5cGUuaAppbmRleCBmYzVlY2VlLi5kZDZiYTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV90eXBlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfdHlwZS5oCkBAIC0yODUsNiArMjg1LDggQEAKICNkZWZpbmUgSVhHQkVfVkxWRihfaSkgICgweDBGMTAwICsgKChfaSkgKiA0KSkgIC8qIDY0IG9mIHRoZXNlICgwLTYzKSAqLwogI2RlZmluZSBJWEdCRV9WTFZGQihfaSkgKDB4MEYyMDAgKyAoKF9pKSAqIDQpKSAgLyogMTI4IG9mIHRoZXNlICgwLTEyNykgKi8KICNkZWZpbmUgSVhHQkVfVk1WSVIoX2kpICgweDA4MDAwICsgKChfaSkgKiA0KSkgIC8qIDY0IG9mIHRoZXNlICgwLTYzKSAqLworI2RlZmluZSBJWEdCRV9QRkZMUEwJMHgwNTBCMAorI2RlZmluZSBJWEdCRV9QRkZMUEgJMHgwNTBCNAogI2RlZmluZSBJWEdCRV9WVF9DVEwgICAgICAgICAweDA1MUIwCiAjZGVmaW5lIElYR0JFX1BGTUFJTEJPWChfaSkgICgweDA0QjAwICsgKDQgKiAoX2kpKSkgLyogNjQgdG90YWwgKi8KICNkZWZpbmUgSVhHQkVfUEZNQk1FTShfaSkgICAgKDB4MTMwMDAgKyAoNjQgKiAoX2kpKSkgLyogNjQgTWFpbGJveGVzLCAxNiBEVyBlYWNoICovCkBAIC02MDgsNiArNjEwLDggQEAKICNkZWZpbmUgSVhHQkVfUlRUQkNOUk0gICAgMHgwNDk4MAogI2RlZmluZSBJWEdCRV9SVFRRQ05STSAgICAweDA0OTgwCiAKKy8qIEZDb0UgRGlyZWN0IERNQSBDb250ZXh0ICovCisjZGVmaW5lIElYR0JFX0ZDRERDKF9pLCBfaikJKDB4MjAwMDAgKyAoKF9pKSAqIDB4NCkgKyAoKF9qKSAqIDB4MTApKQogLyogRkNvRSBETUEgQ29udGV4dCBSZWdpc3RlcnMgKi8KICNkZWZpbmUgSVhHQkVfRkNQVFJMICAgIDB4MDI0MTAgLyogRkMgVXNlciBEZXNjLiBQVFIgTG93ICovCiAjZGVmaW5lIElYR0JFX0ZDUFRSSCAgICAweDAyNDE0IC8qIEZDIFVTZXIgRGVzYy4gUFRSIEhpZ2ggKi8KQEAgLTYzNCw2ICs2MzgsOSBAQAogI2RlZmluZSBJWEdCRV9UU09GRiAgICAgMHgwNEE5OCAvKiBUeCBGQyBTT0YgKi8KICNkZWZpbmUgSVhHQkVfUkVPRkYgICAgIDB4MDUxNTggLyogUnggRkMgRU9GICovCiAjZGVmaW5lIElYR0JFX1JTT0ZGICAgICAweDA1MUY4IC8qIFJ4IEZDIFNPRiAqLworLyogRkNvRSBEaXJlY3QgRmlsdGVyIENvbnRleHQgKi8KKyNkZWZpbmUgSVhHQkVfRkNERkMoX2ksIF9qKQkoMHgyODAwMCArICgoX2kpICogMHg0KSArICgoX2opICogMHgxMCkpCisjZGVmaW5lIElYR0JFX0ZDREZDRChfaSkJKDB4MzAwMDAgKyAoKF9pKSAqIDB4NCkpCiAvKiBGQ29FIEZpbHRlciBDb250ZXh0IFJlZ2lzdGVycyAqLwogI2RlZmluZSBJWEdCRV9GQ0ZMVCAgICAgMHgwNTEwOCAvKiBGQyBGTFQgQ29udGV4dCAqLwogI2RlZmluZSBJWEdCRV9GQ0ZMVFJXICAgMHgwNTExMCAvKiBGQyBGaWx0ZXIgUlcgQ29udHJvbCAqLwpAQCAtNjY0LDYgKzY3MSwxMCBAQAogI2RlZmluZSBJWEdCRV9GQ1JFQ1RMX0VOQSAgICAgICAweDEgICAgICAgIC8qIEZDb0UgUmVkaXIgVGFibGUgRW5hYmxlICovCiAjZGVmaW5lIElYR0JFX0ZDUkVUQV9TSVpFICAgICAgIDggICAgICAgICAgLyogTWF4IGVudHJpZXMgaW4gRkNSRVRBICovCiAjZGVmaW5lIElYR0JFX0ZDUkVUQV9FTlRSWV9NQVNLIDB4MDAwMDAwN2YgLyogNyBiaXRzIGZvciB0aGUgcXVldWUgaW5kZXggKi8KKyNkZWZpbmUgSVhHQkVfRkNSRVRBX1NJWkVfWDU1MAkzMiAvKiBNYXggZW50cmllcyBpbiBGQ1JFVEEgKi8KKy8qIEhpZ2hlciA3IGJpdHMgZm9yIHRoZSBxdWV1ZSBpbmRleCAqLworI2RlZmluZSBJWEdCRV9GQ1JFVEFfRU5UUllfSElHSF9NQVNLCTB4MDA3RjAwMDAKKyNkZWZpbmUgSVhHQkVfRkNSRVRBX0VOVFJZX0hJR0hfU0hJRlQJMTYKIAogLyogU3RhdHMgcmVnaXN0ZXJzICovCiAjZGVmaW5lIElYR0JFX0NSQ0VSUlMgICAweDA0MDAwCkBAIC0xNjkwLDcgKzE3MDEsNyBAQAogI2RlZmluZSBJWEdCRV9NQUNDX0ZTICAgICAgICAweDAwMDQwMDAwCiAjZGVmaW5lIElYR0JFX01BQ19SWDJUWF9MUEJLIDB4MDAwMDAwMDIKIAotLyogVmV0byBCaXQgZGVmaW5pdG9uICovCisvKiBWZXRvIEJpdCBkZWZpbml0aW9uICovCiAjZGVmaW5lIElYR0JFX01NTkdDX01OR19WRVRPICAweDAwMDAwMDAxCiAKIC8qIExJTktTIEJpdCBNYXNrcyAqLwpAQCAtMjQ2Miw4ICsyNDczLDggQEAKIAogc3RydWN0IGl4Z2JlX2hpY193cml0ZV9zaGFkb3dfcmFtIHsKIAl1bmlvbiBpeGdiZV9oaWNfaGRyMiBoZHI7Ci0JdTMyIGFkZHJlc3M7Ci0JdTE2IGxlbmd0aDsKKwlfX2JlMzIgYWRkcmVzczsKKwlfX2JlMTYgbGVuZ3RoOwogCXUxNiBwYWQyOwogCXUxNiBkYXRhOwogCXUxNiBwYWQzOwpAQCAtMzA2Nyw2ICszMDc4LDEwIEBACiAJczMyICgqc2V0X2Z3X2Rydl92ZXIpKHN0cnVjdCBpeGdiZV9odyAqLCB1OCwgdTgsIHU4LCB1OCk7CiAJczMyICgqZ2V0X3RoZXJtYWxfc2Vuc29yX2RhdGEpKHN0cnVjdCBpeGdiZV9odyAqKTsKIAlzMzIgKCppbml0X3RoZXJtYWxfc2Vuc29yX3RocmVzaCkoc3RydWN0IGl4Z2JlX2h3ICpodyk7CisJdm9pZCAoKmRpc2FibGVfcngpKHN0cnVjdCBpeGdiZV9odyAqaHcpOworCXZvaWQgKCplbmFibGVfcngpKHN0cnVjdCBpeGdiZV9odyAqaHcpOworCXZvaWQgKCpzZXRfc291cmNlX2FkZHJlc3NfcHJ1bmluZykoc3RydWN0IGl4Z2JlX2h3ICosIGJvb2wsCisJCQkJCSAgIHVuc2lnbmVkIGludCk7CiAJdm9pZCAoKnNldF9ldGhlcnR5cGVfYW50aV9zcG9vZmluZykoc3RydWN0IGl4Z2JlX2h3ICosIGJvb2wsIGludCk7CiAKIAkvKiBETUEgQ29hbGVzY2luZyAqLwpAQCAtMzEzNyw2ICszMTUyLDcgQEAKIAl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOwogCXU4CQkJCXNhbl9tYWNfcmFyX2luZGV4OwogCXN0cnVjdCBpeGdiZV90aGVybWFsX3NlbnNvcl9kYXRhICB0aGVybWFsX3NlbnNvcl9kYXRhOworCWJvb2wJCQkJc2V0X2xiZW47CiB9OwogCiBzdHJ1Y3QgaXhnYmVfcGh5X2luZm8gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfeDU0MC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfeDU0MC5jCmluZGV4IDQ5Mzk1NDIuLmY1Zjk0OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3g1NDAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV94NTQwLmMKQEAgLTgyMCw2ICs4MjAsOCBAQAogCS5pbml0X3RoZXJtYWxfc2Vuc29yX3RocmVzaCA9IE5VTEwsCiAJLnByb3RfYXV0b2NfcmVhZAk9ICZwcm90X2F1dG9jX3JlYWRfZ2VuZXJpYywKIAkucHJvdF9hdXRvY193cml0ZQk9ICZwcm90X2F1dG9jX3dyaXRlX2dlbmVyaWMsCisJLmVuYWJsZV9yeAkJPSAmaXhnYmVfZW5hYmxlX3J4X2dlbmVyaWMsCisJLmRpc2FibGVfcngJCT0gJml4Z2JlX2Rpc2FibGVfcnhfZ2VuZXJpYywKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgaXhnYmVfZWVwcm9tX29wZXJhdGlvbnMgZWVwcm9tX29wc19YNTQwID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfeDU1MC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfeDU1MC5jCmluZGV4IDUwYmY4MTkuLmNmNWNmODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3g1NTAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV94NTUwLmMKQEAgLTU1Nyw2ICs1NTcsNDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCisvKiogaXhnYmVfZGlzYWJsZV9yeF94NTUwIC0gRGlzYWJsZSBSWCB1bml0CisgKgorICogIEVuYWJsZXMgdGhlIFJ4IERNQSB1bml0IGZvciB4NTUwCisgKiovCitzdGF0aWMgdm9pZCBpeGdiZV9kaXNhYmxlX3J4X3g1NTAoc3RydWN0IGl4Z2JlX2h3ICpodykKK3sKKwl1MzIgcnhjdHJsLCBwZmR0eGdzd2M7CisJczMyIHN0YXR1czsKKwlzdHJ1Y3QgaXhnYmVfaGljX2Rpc2FibGVfcnhlbiBmd19jbWQ7CisKKwlyeGN0cmwgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfUlhDVFJMKTsKKwlpZiAocnhjdHJsICYgSVhHQkVfUlhDVFJMX1JYRU4pIHsKKwkJcGZkdHhnc3djID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1BGRFRYR1NXQyk7CisJCWlmIChwZmR0eGdzd2MgJiBJWEdCRV9QRkRUWEdTV0NfVlRfTEJFTikgeworCQkJcGZkdHhnc3djICY9IH5JWEdCRV9QRkRUWEdTV0NfVlRfTEJFTjsKKwkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUEZEVFhHU1dDLCBwZmR0eGdzd2MpOworCQkJaHctPm1hYy5zZXRfbGJlbiA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlody0+bWFjLnNldF9sYmVuID0gZmFsc2U7CisJCX0KKworCQlmd19jbWQuaGRyLmNtZCA9IEZXX0RJU0FCTEVfUlhFTl9DTUQ7CisJCWZ3X2NtZC5oZHIuYnVmX2xlbiA9IEZXX0RJU0FCTEVfUlhFTl9MRU47CisJCWZ3X2NtZC5oZHIuY2hlY2tzdW0gPSBGV19ERUZBVUxUX0NIRUNLU1VNOworCQlmd19jbWQucG9ydF9udW1iZXIgPSAodTgpaHctPmJ1cy5sYW5faWQ7CisKKwkJc3RhdHVzID0gaXhnYmVfaG9zdF9pbnRlcmZhY2VfY29tbWFuZChodywgKHUzMiAqKSZmd19jbWQsCisJCQkJCXNpemVvZihzdHJ1Y3QgaXhnYmVfaGljX2Rpc2FibGVfcnhlbiksCisJCQkJCUlYR0JFX0hJX0NPTU1BTkRfVElNRU9VVCwgdHJ1ZSk7CisKKwkJLyogSWYgd2UgZmFpbCAtIGRpc2FibGUgUlggdXNpbmcgcmVnaXN0ZXIgd3JpdGUgKi8KKwkJaWYgKHN0YXR1cykgeworCQkJcnhjdHJsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1JYQ1RSTCk7CisJCQlpZiAocnhjdHJsICYgSVhHQkVfUlhDVFJMX1JYRU4pIHsKKwkJCQlyeGN0cmwgJj0gfklYR0JFX1JYQ1RSTF9SWEVOOworCQkJCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUlhDVFJMLCByeGN0cmwpOworCQkJfQorCQl9CisJfQorfQorCiAvKiogaXhnYmVfdXBkYXRlX2VlcHJvbV9jaGVja3N1bV9YNTUwIC0gVXBkYXRlcyB0aGUgRUVQUk9NIGNoZWNrc3VtIGFuZCBmbGFzaAogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqCkBAIC0xMzA2LDggKzEzNDcsOCBAQAogICogIEBlbmFibGU6IGVuYWJsZSBvciBkaXNhYmxlIHN3aXRjaCBmb3IgRXRoZXJ0eXBlIGFudGktc3Bvb2ZpbmcKICAqICBAdmY6IFZpcnR1YWwgRnVuY3Rpb24gcG9vbCAtIFZGIFBvb2wgdG8gc2V0IGZvciBFdGhlcnR5cGUgYW50aS1zcG9vZmluZwogICoqLwotdm9pZCBpeGdiZV9zZXRfZXRoZXJ0eXBlX2FudGlfc3Bvb2ZpbmdfWDU1MChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCBib29sIGVuYWJsZSwKLQkJCQkJICAgIGludCB2ZikKK3N0YXRpYyB2b2lkIGl4Z2JlX3NldF9ldGhlcnR5cGVfYW50aV9zcG9vZmluZ19YNTUwKHN0cnVjdCBpeGdiZV9odyAqaHcsCisJCQkJCQkgICBib29sIGVuYWJsZSwgaW50IHZmKQogewogCWludCB2Zl90YXJnZXRfcmVnID0gdmYgPj4gMzsKIAlpbnQgdmZfdGFyZ2V0X3NoaWZ0ID0gdmYgJSA4ICsgSVhHQkVfU1BPT0ZfRVRIRVJUWVBFQVNfU0hJRlQ7CkBAIC0xMzIyLDYgKzEzNjMsMzMgQEAKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1BGVkZTUE9PRih2Zl90YXJnZXRfcmVnKSwgcGZ2ZnNwb29mKTsKIH0KIAorLyoqIGl4Z2JlX3NldF9zb3VyY2VfYWRkcmVzc19wcnVuaW5nX1g1NTAgLSBFbmFibGUvRGlzYmFsZSBzcmMgYWRkcmVzcyBwcnVuaW5nCisgKiAgQGh3OiBwb2ludGVyIHRvIGhhcmR3YXJlIHN0cnVjdHVyZQorICogIEBlbmFibGU6IGVuYWJsZSBvciBkaXNhYmxlIHNvdXJjZSBhZGRyZXNzIHBydW5pbmcKKyAqICBAcG9vbDogUnggcG9vbCB0byBzZXQgc291cmNlIGFkZHJlc3MgcHJ1bmluZyBmb3IKKyAqKi8KK3N0YXRpYyB2b2lkIGl4Z2JlX3NldF9zb3VyY2VfYWRkcmVzc19wcnVuaW5nX1g1NTAoc3RydWN0IGl4Z2JlX2h3ICpodywKKwkJCQkJCSAgYm9vbCBlbmFibGUsCisJCQkJCQkgIHVuc2lnbmVkIGludCBwb29sKQoreworCXU2NCBwZmZscDsKKworCS8qIG1heCByeCBwb29sIGlzIDYzICovCisJaWYgKHBvb2wgPiA2MykKKwkJcmV0dXJuOworCisJcGZmbHAgPSAodTY0KUlYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9QRkZMUEwpOworCXBmZmxwIHw9ICh1NjQpSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1BGRkxQSCkgPDwgMzI7CisKKwlpZiAoZW5hYmxlKQorCQlwZmZscCB8PSAoMVVMTCA8PCBwb29sKTsKKwllbHNlCisJCXBmZmxwICY9IH4oMVVMTCA8PCBwb29sKTsKKworCUlYR0JFX1dSSVRFX1JFRyhodywgSVhHQkVfUEZGTFBMLCAodTMyKXBmZmxwKTsKKwlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1BGRkxQSCwgKHUzMikocGZmbHAgPj4gMzIpKTsKK30KKwogI2RlZmluZSBYNTUwX0NPTU1PTl9NQUMgXAogCS5pbml0X2h3CQkJPSAmaXhnYmVfaW5pdF9od19nZW5lcmljLCBcCiAJLnN0YXJ0X2h3CQkJPSAmaXhnYmVfc3RhcnRfaHdfWDU0MCwgXApAQCAtMTM1Niw2ICsxNDI0LDggQEAKIAkuaW5pdF91dGFfdGFibGVzCQk9ICZpeGdiZV9pbml0X3V0YV90YWJsZXNfZ2VuZXJpYywgXAogCS5zZXRfbWFjX2FudGlfc3Bvb2ZpbmcJCT0gJml4Z2JlX3NldF9tYWNfYW50aV9zcG9vZmluZywgXAogCS5zZXRfdmxhbl9hbnRpX3Nwb29maW5nCQk9ICZpeGdiZV9zZXRfdmxhbl9hbnRpX3Nwb29maW5nLCBcCisJLnNldF9zb3VyY2VfYWRkcmVzc19wcnVuaW5nCT0gXAorCQkJCSZpeGdiZV9zZXRfc291cmNlX2FkZHJlc3NfcHJ1bmluZ19YNTUwLCBcCiAJLnNldF9ldGhlcnR5cGVfYW50aV9zcG9vZmluZwk9IFwKIAkJCQkmaXhnYmVfc2V0X2V0aGVydHlwZV9hbnRpX3Nwb29maW5nX1g1NTAsIFwKIAkuYWNxdWlyZV9zd2Z3X3N5bmMJCT0gJml4Z2JlX2FjcXVpcmVfc3dmd19zeW5jX1g1NDAsIFwKQEAgLTEzNjYsNiArMTQzNiw4IEBACiAJLmluaXRfdGhlcm1hbF9zZW5zb3JfdGhyZXNoCT0gTlVMTCwgXAogCS5wcm90X2F1dG9jX3JlYWQJCT0gJnByb3RfYXV0b2NfcmVhZF9nZW5lcmljLCBcCiAJLnByb3RfYXV0b2Nfd3JpdGUJCT0gJnByb3RfYXV0b2Nfd3JpdGVfZ2VuZXJpYywgXAorCS5lbmFibGVfcngJCQk9ICZpeGdiZV9lbmFibGVfcnhfZ2VuZXJpYywgXAorCS5kaXNhYmxlX3J4CQkJPSAmaXhnYmVfZGlzYWJsZV9yeF94NTUwLCBcCiAKIHN0YXRpYyBzdHJ1Y3QgaXhnYmVfbWFjX29wZXJhdGlvbnMgbWFjX29wc19YNTUwID0gewogCVg1NTBfQ09NTU9OX01BQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9kZWZpbmVzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2RlZmluZXMuaAppbmRleCA3NDEyZDM3Li43NzBlMjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2RlZmluZXMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2RlZmluZXMuaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgODI1OTkgVmlydHVhbCBGdW5jdGlvbiBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDEyIEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTEzLDggKzEzLDcgQEAKICAgbW9yZSBkZXRhaWxzLgogCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogCiAgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCiAgIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCkBAIC0yOSwxMzggKzI4LDEzOCBAQAogI2RlZmluZSBfSVhHQkVWRl9ERUZJTkVTX0hfCiAKIC8qIERldmljZSBJRHMgKi8KLSNkZWZpbmUgSVhHQkVfREVWX0lEXzgyNTk5X1ZGICAgICAgICAgICAweDEwRUQKLSNkZWZpbmUgSVhHQkVfREVWX0lEX1g1NDBfVkYgICAgICAgICAgICAweDE1MTUKKyNkZWZpbmUgSVhHQkVfREVWX0lEXzgyNTk5X1ZGCQkweDEwRUQKKyNkZWZpbmUgSVhHQkVfREVWX0lEX1g1NDBfVkYJCTB4MTUxNQogI2RlZmluZSBJWEdCRV9ERVZfSURfWDU1MF9WRgkJMHgxNTY1CiAjZGVmaW5lIElYR0JFX0RFVl9JRF9YNTUwRU1fWF9WRgkweDE1QTgKIAotI2RlZmluZSBJWEdCRV9WRl9JUlFfQ0xFQVJfTUFTSyAgICAgICAgIDcKLSNkZWZpbmUgSVhHQkVfVkZfTUFYX1RYX1FVRVVFUyAgICAgICAgICA4Ci0jZGVmaW5lIElYR0JFX1ZGX01BWF9SWF9RVUVVRVMgICAgICAgICAgOAorI2RlZmluZSBJWEdCRV9WRl9JUlFfQ0xFQVJfTUFTSwkJNworI2RlZmluZSBJWEdCRV9WRl9NQVhfVFhfUVVFVUVTCQk4CisjZGVmaW5lIElYR0JFX1ZGX01BWF9SWF9RVUVVRVMJCTgKIAogLyogRENCIGRlZmluZSAqLwogI2RlZmluZSBJWEdCRV9WRl9NQVhfVFJBRkZJQ19DTEFTUwk4CiAKIC8qIExpbmsgc3BlZWQgKi8KIHR5cGVkZWYgdTMyIGl4Z2JlX2xpbmtfc3BlZWQ7Ci0jZGVmaW5lIElYR0JFX0xJTktfU1BFRURfMUdCX0ZVTEwgICAgICAgMHgwMDIwCi0jZGVmaW5lIElYR0JFX0xJTktfU1BFRURfMTBHQl9GVUxMICAgICAgMHgwMDgwCisjZGVmaW5lIElYR0JFX0xJTktfU1BFRURfMUdCX0ZVTEwJMHgwMDIwCisjZGVmaW5lIElYR0JFX0xJTktfU1BFRURfMTBHQl9GVUxMCTB4MDA4MAogI2RlZmluZSBJWEdCRV9MSU5LX1NQRUVEXzEwMF9GVUxMCTB4MDAwOAogCi0jZGVmaW5lIElYR0JFX0NUUkxfUlNUICAgICAgICAgICAgICAweDA0MDAwMDAwIC8qIFJlc2V0IChTVykgKi8KLSNkZWZpbmUgSVhHQkVfUlhEQ1RMX0VOQUJMRSAgICAgICAgIDB4MDIwMDAwMDAgLyogRW5hYmxlIHNwZWNpZmljIFJ4IFF1ZXVlICovCi0jZGVmaW5lIElYR0JFX1RYRENUTF9FTkFCTEUgICAgICAgICAweDAyMDAwMDAwIC8qIEVuYWJsZSBzcGVjaWZpYyBUeCBRdWV1ZSAqLwotI2RlZmluZSBJWEdCRV9MSU5LU19VUCAgICAgICAgICAgICAgMHg0MDAwMDAwMAotI2RlZmluZSBJWEdCRV9MSU5LU19TUEVFRF84MjU5OSAgICAgMHgzMDAwMDAwMAotI2RlZmluZSBJWEdCRV9MSU5LU19TUEVFRF8xMEdfODI1OTkgMHgzMDAwMDAwMAotI2RlZmluZSBJWEdCRV9MSU5LU19TUEVFRF8xR184MjU5OSAgMHgyMDAwMDAwMAotI2RlZmluZSBJWEdCRV9MSU5LU19TUEVFRF8xMDBfODI1OTkgMHgxMDAwMDAwMAorI2RlZmluZSBJWEdCRV9DVFJMX1JTVAkJMHgwNDAwMDAwMCAvKiBSZXNldCAoU1cpICovCisjZGVmaW5lIElYR0JFX1JYRENUTF9FTkFCTEUJMHgwMjAwMDAwMCAvKiBFbmFibGUgc3BlY2lmaWMgUnggUXVldWUgKi8KKyNkZWZpbmUgSVhHQkVfVFhEQ1RMX0VOQUJMRQkweDAyMDAwMDAwIC8qIEVuYWJsZSBzcGVjaWZpYyBUeCBRdWV1ZSAqLworI2RlZmluZSBJWEdCRV9MSU5LU19VUAkJMHg0MDAwMDAwMAorI2RlZmluZSBJWEdCRV9MSU5LU19TUEVFRF84MjU5OQkJMHgzMDAwMDAwMAorI2RlZmluZSBJWEdCRV9MSU5LU19TUEVFRF8xMEdfODI1OTkJMHgzMDAwMDAwMAorI2RlZmluZSBJWEdCRV9MSU5LU19TUEVFRF8xR184MjU5OQkweDIwMDAwMDAwCisjZGVmaW5lIElYR0JFX0xJTktTX1NQRUVEXzEwMF84MjU5OQkweDEwMDAwMDAwCiAKIC8qIE51bWJlciBvZiBUcmFuc21pdCBhbmQgUmVjZWl2ZSBEZXNjcmlwdG9ycyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCAqLwotI2RlZmluZSBJWEdCRV9SRVFfVFhfREVTQ1JJUFRPUl9NVUxUSVBMRSAgOAotI2RlZmluZSBJWEdCRV9SRVFfUlhfREVTQ1JJUFRPUl9NVUxUSVBMRSAgOAotI2RlZmluZSBJWEdCRV9SRVFfVFhfQlVGRkVSX0dSQU5VTEFSSVRZICAgMTAyNAorI2RlZmluZSBJWEdCRV9SRVFfVFhfREVTQ1JJUFRPUl9NVUxUSVBMRQk4CisjZGVmaW5lIElYR0JFX1JFUV9SWF9ERVNDUklQVE9SX01VTFRJUExFCTgKKyNkZWZpbmUgSVhHQkVfUkVRX1RYX0JVRkZFUl9HUkFOVUxBUklUWQkJMTAyNAogCiAvKiBJbnRlcnJ1cHQgVmVjdG9yIEFsbG9jYXRpb24gUmVnaXN0ZXJzICovCi0jZGVmaW5lIElYR0JFX0lWQVJfQUxMT0NfVkFMICAgIDB4ODAgLyogSW50ZXJydXB0IEFsbG9jYXRpb24gdmFsaWQgKi8KKyNkZWZpbmUgSVhHQkVfSVZBUl9BTExPQ19WQUwJMHg4MCAvKiBJbnRlcnJ1cHQgQWxsb2NhdGlvbiB2YWxpZCAqLwogCi0jZGVmaW5lIElYR0JFX1ZGX0lOSVRfVElNRU9VVCAgIDIwMCAvKiBOdW1iZXIgb2YgcmV0cmllcyB0byBjbGVhciBSU1RJICovCisjZGVmaW5lIElYR0JFX1ZGX0lOSVRfVElNRU9VVAkyMDAgLyogTnVtYmVyIG9mIHJldHJpZXMgdG8gY2xlYXIgUlNUSSAqLwogCiAvKiBSZWNlaXZlIENvbmZpZyBtYXNrcyAqLwotI2RlZmluZSBJWEdCRV9SWENUUkxfUlhFTiAgICAgICAweDAwMDAwMDAxICAvKiBFbmFibGUgUmVjZWl2ZXIgKi8KLSNkZWZpbmUgSVhHQkVfUlhDVFJMX0RNQllQUyAgICAgMHgwMDAwMDAwMiAgLyogRGVzY3JpcHRvciBNb25pdG9yIEJ5cGFzcyAqLwotI2RlZmluZSBJWEdCRV9SWERDVExfRU5BQkxFICAgICAweDAyMDAwMDAwICAvKiBFbmFibGUgc3BlY2lmaWMgUnggUXVldWUgKi8KLSNkZWZpbmUgSVhHQkVfUlhEQ1RMX1ZNRSAgICAgICAgMHg0MDAwMDAwMCAgLyogVkxBTiBtb2RlIGVuYWJsZSAqLwotI2RlZmluZSBJWEdCRV9SWERDVExfUkxQTUxNQVNLICAweDAwMDAzRkZGICAvKiBPbmx5IHN1cHBvcnRlZCBvbiB0aGUgWDU0MCAqLwotI2RlZmluZSBJWEdCRV9SWERDVExfUkxQTUxfRU4gICAweDAwMDA4MDAwCisjZGVmaW5lIElYR0JFX1JYQ1RSTF9SWEVOCTB4MDAwMDAwMDEgIC8qIEVuYWJsZSBSZWNlaXZlciAqLworI2RlZmluZSBJWEdCRV9SWENUUkxfRE1CWVBTCTB4MDAwMDAwMDIgIC8qIERlc2NyaXB0b3IgTW9uaXRvciBCeXBhc3MgKi8KKyNkZWZpbmUgSVhHQkVfUlhEQ1RMX0VOQUJMRQkweDAyMDAwMDAwICAvKiBFbmFibGUgc3BlY2lmaWMgUnggUXVldWUgKi8KKyNkZWZpbmUgSVhHQkVfUlhEQ1RMX1ZNRQkweDQwMDAwMDAwICAvKiBWTEFOIG1vZGUgZW5hYmxlICovCisjZGVmaW5lIElYR0JFX1JYRENUTF9STFBNTE1BU0sJMHgwMDAwM0ZGRiAgLyogT25seSBzdXBwb3J0ZWQgb24gdGhlIFg1NDAgKi8KKyNkZWZpbmUgSVhHQkVfUlhEQ1RMX1JMUE1MX0VOCTB4MDAwMDgwMDAKIAogLyogRENBIENvbnRyb2wgKi8KICNkZWZpbmUgSVhHQkVfRENBX1RYQ1RSTF9UWF9XQl9ST19FTiAoMSA8PCAxMSkgLyogVHggRGVzYyB3cml0ZWJhY2sgUk8gYml0ICovCiAKIC8qIFBTUlRZUEUgYml0IGRlZmluaXRpb25zICovCi0jZGVmaW5lIElYR0JFX1BTUlRZUEVfVENQSERSICAgIDB4MDAwMDAwMTAKLSNkZWZpbmUgSVhHQkVfUFNSVFlQRV9VRFBIRFIgICAgMHgwMDAwMDAyMAotI2RlZmluZSBJWEdCRV9QU1JUWVBFX0lQVjRIRFIgICAweDAwMDAwMTAwCi0jZGVmaW5lIElYR0JFX1BTUlRZUEVfSVBWNkhEUiAgIDB4MDAwMDAyMDAKLSNkZWZpbmUgSVhHQkVfUFNSVFlQRV9MMkhEUiAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBJWEdCRV9QU1JUWVBFX1RDUEhEUgkweDAwMDAwMDEwCisjZGVmaW5lIElYR0JFX1BTUlRZUEVfVURQSERSCTB4MDAwMDAwMjAKKyNkZWZpbmUgSVhHQkVfUFNSVFlQRV9JUFY0SERSCTB4MDAwMDAxMDAKKyNkZWZpbmUgSVhHQkVfUFNSVFlQRV9JUFY2SERSCTB4MDAwMDAyMDAKKyNkZWZpbmUgSVhHQkVfUFNSVFlQRV9MMkhEUgkweDAwMDAxMDAwCiAKIC8qIFNSUkNUTCBiaXQgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgSVhHQkVfU1JSQ1RMX0JTSVpFUEtUX1NISUZUICAgICAxMCAgICAgLyogc28gbWFueSBLQnMgKi8KLSNkZWZpbmUgSVhHQkVfU1JSQ1RMX1JETVRTX1NISUZUICAgICAgICAyMgotI2RlZmluZSBJWEdCRV9TUlJDVExfUkRNVFNfTUFTSyAgICAgICAgIDB4MDFDMDAwMDAKLSNkZWZpbmUgSVhHQkVfU1JSQ1RMX0RST1BfRU4gICAgICAgICAgICAweDEwMDAwMDAwCi0jZGVmaW5lIElYR0JFX1NSUkNUTF9CU0laRVBLVF9NQVNLICAgICAgMHgwMDAwMDA3RgotI2RlZmluZSBJWEdCRV9TUlJDVExfQlNJWkVIRFJfTUFTSyAgICAgIDB4MDAwMDNGMDAKLSNkZWZpbmUgSVhHQkVfU1JSQ1RMX0RFU0NUWVBFX0xFR0FDWSAgICAweDAwMDAwMDAwCisjZGVmaW5lIElYR0JFX1NSUkNUTF9CU0laRVBLVF9TSElGVAkxMCAgICAgLyogc28gbWFueSBLQnMgKi8KKyNkZWZpbmUgSVhHQkVfU1JSQ1RMX1JETVRTX1NISUZUCTIyCisjZGVmaW5lIElYR0JFX1NSUkNUTF9SRE1UU19NQVNLCQkweDAxQzAwMDAwCisjZGVmaW5lIElYR0JFX1NSUkNUTF9EUk9QX0VOCQkweDEwMDAwMDAwCisjZGVmaW5lIElYR0JFX1NSUkNUTF9CU0laRVBLVF9NQVNLCTB4MDAwMDAwN0YKKyNkZWZpbmUgSVhHQkVfU1JSQ1RMX0JTSVpFSERSX01BU0sJMHgwMDAwM0YwMAorI2RlZmluZSBJWEdCRV9TUlJDVExfREVTQ1RZUEVfTEVHQUNZCTB4MDAwMDAwMDAKICNkZWZpbmUgSVhHQkVfU1JSQ1RMX0RFU0NUWVBFX0FEVl9PTkVCVUYgMHgwMjAwMDAwMAotI2RlZmluZSBJWEdCRV9TUlJDVExfREVTQ1RZUEVfSERSX1NQTElUICAweDA0MDAwMDAwCisjZGVmaW5lIElYR0JFX1NSUkNUTF9ERVNDVFlQRV9IRFJfU1BMSVQJMHgwNDAwMDAwMAogI2RlZmluZSBJWEdCRV9TUlJDVExfREVTQ1RZUEVfSERSX1JFUExJQ0FUSU9OX0xBUkdFX1BLVCAweDA4MDAwMDAwCiAjZGVmaW5lIElYR0JFX1NSUkNUTF9ERVNDVFlQRV9IRFJfU1BMSVRfQUxXQVlTIDB4MEEwMDAwMDAKLSNkZWZpbmUgSVhHQkVfU1JSQ1RMX0RFU0NUWVBFX01BU0sgICAgICAweDBFMDAwMDAwCisjZGVmaW5lIElYR0JFX1NSUkNUTF9ERVNDVFlQRV9NQVNLCTB4MEUwMDAwMDAKIAogLyogUmVjZWl2ZSBEZXNjcmlwdG9yIGJpdCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBJWEdCRV9SWERfU1RBVF9ERCAgICAgICAgIDB4MDEgICAgLyogRGVzY3JpcHRvciBEb25lICovCi0jZGVmaW5lIElYR0JFX1JYRF9TVEFUX0VPUCAgICAgICAgMHgwMiAgICAvKiBFbmQgb2YgUGFja2V0ICovCi0jZGVmaW5lIElYR0JFX1JYRF9TVEFUX0ZMTSAgICAgICAgMHgwNCAgICAvKiBGRGlyIE1hdGNoICovCi0jZGVmaW5lIElYR0JFX1JYRF9TVEFUX1ZQICAgICAgICAgMHgwOCAgICAvKiBJRUVFIFZMQU4gUGFja2V0ICovCi0jZGVmaW5lIElYR0JFX1JYREFEVl9ORVhUUF9NQVNLICAgMHgwMDBGRkZGMCAvKiBOZXh0IERlc2NyaXB0b3IgSW5kZXggKi8KLSNkZWZpbmUgSVhHQkVfUlhEQURWX05FWFRQX1NISUZUICAweDAwMDAwMDA0Ci0jZGVmaW5lIElYR0JFX1JYRF9TVEFUX1VEUENTICAgICAgMHgxMCAgICAvKiBVRFAgeHN1bSBjYWxjdWxhdGVkICovCi0jZGVmaW5lIElYR0JFX1JYRF9TVEFUX0w0Q1MgICAgICAgMHgyMCAgICAvKiBMNCB4c3VtIGNhbGN1bGF0ZWQgKi8KLSNkZWZpbmUgSVhHQkVfUlhEX1NUQVRfSVBDUyAgICAgICAweDQwICAgIC8qIElQIHhzdW0gY2FsY3VsYXRlZCAqLwotI2RlZmluZSBJWEdCRV9SWERfU1RBVF9QSUYgICAgICAgIDB4ODAgICAgLyogcGFzc2VkIGluLWV4YWN0IGZpbHRlciAqLwotI2RlZmluZSBJWEdCRV9SWERfU1RBVF9DUkNWICAgICAgIDB4MTAwICAgLyogU3BlY3VsYXRpdmUgQ1JDIFZhbGlkICovCi0jZGVmaW5lIElYR0JFX1JYRF9TVEFUX1ZFWFQgICAgICAgMHgyMDAgICAvKiAxc3QgVkxBTiBmb3VuZCAqLwotI2RlZmluZSBJWEdCRV9SWERfU1RBVF9VRFBWICAgICAgIDB4NDAwICAgLyogVmFsaWQgVURQIGNoZWNrc3VtICovCi0jZGVmaW5lIElYR0JFX1JYRF9TVEFUX0RZTklOVCAgICAgMHg4MDAgICAvKiBQa3QgY2F1c2VkIElOVCB2aWEgRFlOSU5UICovCi0jZGVmaW5lIElYR0JFX1JYRF9TVEFUX1RTICAgICAgICAgMHgxMDAwMCAvKiBUaW1lIFN0YW1wICovCi0jZGVmaW5lIElYR0JFX1JYRF9TVEFUX1NFQ1AgICAgICAgMHgyMDAwMCAvKiBTZWN1cml0eSBQcm9jZXNzaW5nICovCi0jZGVmaW5lIElYR0JFX1JYRF9TVEFUX0xCICAgICAgICAgMHg0MDAwMCAvKiBMb29wYmFjayBTdGF0dXMgKi8KLSNkZWZpbmUgSVhHQkVfUlhEX1NUQVRfQUNLICAgICAgICAweDgwMDAgIC8qIEFDSyBQYWNrZXQgaW5kaWNhdGlvbiAqLwotI2RlZmluZSBJWEdCRV9SWERfRVJSX0NFICAgICAgICAgIDB4MDEgICAgLyogQ1JDIEVycm9yICovCi0jZGVmaW5lIElYR0JFX1JYRF9FUlJfTEUgICAgICAgICAgMHgwMiAgICAvKiBMZW5ndGggRXJyb3IgKi8KLSNkZWZpbmUgSVhHQkVfUlhEX0VSUl9QRSAgICAgICAgICAweDA4ICAgIC8qIFBhY2tldCBFcnJvciAqLwotI2RlZmluZSBJWEdCRV9SWERfRVJSX09TRSAgICAgICAgIDB4MTAgICAgLyogT3ZlcnNpemUgRXJyb3IgKi8KLSNkZWZpbmUgSVhHQkVfUlhEX0VSUl9VU0UgICAgICAgICAweDIwICAgIC8qIFVuZGVyc2l6ZSBFcnJvciAqLwotI2RlZmluZSBJWEdCRV9SWERfRVJSX1RDUEUgICAgICAgIDB4NDAgICAgLyogVENQL1VEUCBDaGVja3N1bSBFcnJvciAqLwotI2RlZmluZSBJWEdCRV9SWERfRVJSX0lQRSAgICAgICAgIDB4ODAgICAgLyogSVAgQ2hlY2tzdW0gRXJyb3IgKi8KLSNkZWZpbmUgSVhHQkVfUlhEQURWX0VSUl9NQVNLICAgICAweEZGRjAwMDAwIC8qIFJERVNDLkVSUk9SUyBtYXNrICovCi0jZGVmaW5lIElYR0JFX1JYREFEVl9FUlJfU0hJRlQgICAgMjAgICAgICAgICAvKiBSREVTQy5FUlJPUlMgc2hpZnQgKi8KLSNkZWZpbmUgSVhHQkVfUlhEQURWX0VSUl9IQk8gICAgICAweDAwODAwMDAwIC8qSGVhZGVyIEJ1ZmZlciBPdmVyZmxvdyAqLwotI2RlZmluZSBJWEdCRV9SWERBRFZfRVJSX0NFICAgICAgIDB4MDEwMDAwMDAgLyogQ1JDIEVycm9yICovCi0jZGVmaW5lIElYR0JFX1JYREFEVl9FUlJfTEUgICAgICAgMHgwMjAwMDAwMCAvKiBMZW5ndGggRXJyb3IgKi8KLSNkZWZpbmUgSVhHQkVfUlhEQURWX0VSUl9QRSAgICAgICAweDA4MDAwMDAwIC8qIFBhY2tldCBFcnJvciAqLwotI2RlZmluZSBJWEdCRV9SWERBRFZfRVJSX09TRSAgICAgIDB4MTAwMDAwMDAgLyogT3ZlcnNpemUgRXJyb3IgKi8KLSNkZWZpbmUgSVhHQkVfUlhEQURWX0VSUl9VU0UgICAgICAweDIwMDAwMDAwIC8qIFVuZGVyc2l6ZSBFcnJvciAqLwotI2RlZmluZSBJWEdCRV9SWERBRFZfRVJSX1RDUEUgICAgIDB4NDAwMDAwMDAgLyogVENQL1VEUCBDaGVja3N1bSBFcnJvciAqLwotI2RlZmluZSBJWEdCRV9SWERBRFZfRVJSX0lQRSAgICAgIDB4ODAwMDAwMDAgLyogSVAgQ2hlY2tzdW0gRXJyb3IgKi8KLSNkZWZpbmUgSVhHQkVfUlhEX1ZMQU5fSURfTUFTSyAgICAweDBGRkYgIC8qIFZMQU4gSUQgaXMgaW4gbG93ZXIgMTIgYml0cyAqLwotI2RlZmluZSBJWEdCRV9SWERfUFJJX01BU0sgICAgICAgIDB4RTAwMCAgLyogUHJpb3JpdHkgaXMgaW4gdXBwZXIgMyBiaXRzICovCi0jZGVmaW5lIElYR0JFX1JYRF9QUklfU0hJRlQgICAgICAgMTMKLSNkZWZpbmUgSVhHQkVfUlhEX0NGSV9NQVNLICAgICAgICAweDEwMDAgIC8qIENGSSBpcyBiaXQgMTIgKi8KLSNkZWZpbmUgSVhHQkVfUlhEX0NGSV9TSElGVCAgICAgICAxMgorI2RlZmluZSBJWEdCRV9SWERfU1RBVF9ERAkweDAxICAgIC8qIERlc2NyaXB0b3IgRG9uZSAqLworI2RlZmluZSBJWEdCRV9SWERfU1RBVF9FT1AJMHgwMiAgICAvKiBFbmQgb2YgUGFja2V0ICovCisjZGVmaW5lIElYR0JFX1JYRF9TVEFUX0ZMTQkweDA0ICAgIC8qIEZEaXIgTWF0Y2ggKi8KKyNkZWZpbmUgSVhHQkVfUlhEX1NUQVRfVlAJMHgwOCAgICAvKiBJRUVFIFZMQU4gUGFja2V0ICovCisjZGVmaW5lIElYR0JFX1JYREFEVl9ORVhUUF9NQVNLCTB4MDAwRkZGRjAgLyogTmV4dCBEZXNjcmlwdG9yIEluZGV4ICovCisjZGVmaW5lIElYR0JFX1JYREFEVl9ORVhUUF9TSElGVAkweDAwMDAwMDA0CisjZGVmaW5lIElYR0JFX1JYRF9TVEFUX1VEUENTCTB4MTAgICAgLyogVURQIHhzdW0gY2FsY3VsYXRlZCAqLworI2RlZmluZSBJWEdCRV9SWERfU1RBVF9MNENTCTB4MjAgICAgLyogTDQgeHN1bSBjYWxjdWxhdGVkICovCisjZGVmaW5lIElYR0JFX1JYRF9TVEFUX0lQQ1MJMHg0MCAgICAvKiBJUCB4c3VtIGNhbGN1bGF0ZWQgKi8KKyNkZWZpbmUgSVhHQkVfUlhEX1NUQVRfUElGCTB4ODAgICAgLyogcGFzc2VkIGluLWV4YWN0IGZpbHRlciAqLworI2RlZmluZSBJWEdCRV9SWERfU1RBVF9DUkNWCTB4MTAwICAgLyogU3BlY3VsYXRpdmUgQ1JDIFZhbGlkICovCisjZGVmaW5lIElYR0JFX1JYRF9TVEFUX1ZFWFQJMHgyMDAgICAvKiAxc3QgVkxBTiBmb3VuZCAqLworI2RlZmluZSBJWEdCRV9SWERfU1RBVF9VRFBWCTB4NDAwICAgLyogVmFsaWQgVURQIGNoZWNrc3VtICovCisjZGVmaW5lIElYR0JFX1JYRF9TVEFUX0RZTklOVAkweDgwMCAgIC8qIFBrdCBjYXVzZWQgSU5UIHZpYSBEWU5JTlQgKi8KKyNkZWZpbmUgSVhHQkVfUlhEX1NUQVRfVFMJMHgxMDAwMCAvKiBUaW1lIFN0YW1wICovCisjZGVmaW5lIElYR0JFX1JYRF9TVEFUX1NFQ1AJMHgyMDAwMCAvKiBTZWN1cml0eSBQcm9jZXNzaW5nICovCisjZGVmaW5lIElYR0JFX1JYRF9TVEFUX0xCCTB4NDAwMDAgLyogTG9vcGJhY2sgU3RhdHVzICovCisjZGVmaW5lIElYR0JFX1JYRF9TVEFUX0FDSwkweDgwMDAgIC8qIEFDSyBQYWNrZXQgaW5kaWNhdGlvbiAqLworI2RlZmluZSBJWEdCRV9SWERfRVJSX0NFCTB4MDEgICAgLyogQ1JDIEVycm9yICovCisjZGVmaW5lIElYR0JFX1JYRF9FUlJfTEUJMHgwMiAgICAvKiBMZW5ndGggRXJyb3IgKi8KKyNkZWZpbmUgSVhHQkVfUlhEX0VSUl9QRQkweDA4ICAgIC8qIFBhY2tldCBFcnJvciAqLworI2RlZmluZSBJWEdCRV9SWERfRVJSX09TRQkweDEwICAgIC8qIE92ZXJzaXplIEVycm9yICovCisjZGVmaW5lIElYR0JFX1JYRF9FUlJfVVNFCTB4MjAgICAgLyogVW5kZXJzaXplIEVycm9yICovCisjZGVmaW5lIElYR0JFX1JYRF9FUlJfVENQRQkweDQwICAgIC8qIFRDUC9VRFAgQ2hlY2tzdW0gRXJyb3IgKi8KKyNkZWZpbmUgSVhHQkVfUlhEX0VSUl9JUEUJMHg4MCAgICAvKiBJUCBDaGVja3N1bSBFcnJvciAqLworI2RlZmluZSBJWEdCRV9SWERBRFZfRVJSX01BU0sJMHhGRkYwMDAwMCAvKiBSREVTQy5FUlJPUlMgbWFzayAqLworI2RlZmluZSBJWEdCRV9SWERBRFZfRVJSX1NISUZUCTIwICAgICAgICAgLyogUkRFU0MuRVJST1JTIHNoaWZ0ICovCisjZGVmaW5lIElYR0JFX1JYREFEVl9FUlJfSEJPCTB4MDA4MDAwMDAgLypIZWFkZXIgQnVmZmVyIE92ZXJmbG93ICovCisjZGVmaW5lIElYR0JFX1JYREFEVl9FUlJfQ0UJMHgwMTAwMDAwMCAvKiBDUkMgRXJyb3IgKi8KKyNkZWZpbmUgSVhHQkVfUlhEQURWX0VSUl9MRQkweDAyMDAwMDAwIC8qIExlbmd0aCBFcnJvciAqLworI2RlZmluZSBJWEdCRV9SWERBRFZfRVJSX1BFCTB4MDgwMDAwMDAgLyogUGFja2V0IEVycm9yICovCisjZGVmaW5lIElYR0JFX1JYREFEVl9FUlJfT1NFCTB4MTAwMDAwMDAgLyogT3ZlcnNpemUgRXJyb3IgKi8KKyNkZWZpbmUgSVhHQkVfUlhEQURWX0VSUl9VU0UJMHgyMDAwMDAwMCAvKiBVbmRlcnNpemUgRXJyb3IgKi8KKyNkZWZpbmUgSVhHQkVfUlhEQURWX0VSUl9UQ1BFCTB4NDAwMDAwMDAgLyogVENQL1VEUCBDaGVja3N1bSBFcnJvciAqLworI2RlZmluZSBJWEdCRV9SWERBRFZfRVJSX0lQRQkweDgwMDAwMDAwIC8qIElQIENoZWNrc3VtIEVycm9yICovCisjZGVmaW5lIElYR0JFX1JYRF9WTEFOX0lEX01BU0sJMHgwRkZGICAvKiBWTEFOIElEIGlzIGluIGxvd2VyIDEyIGJpdHMgKi8KKyNkZWZpbmUgSVhHQkVfUlhEX1BSSV9NQVNLCTB4RTAwMCAgLyogUHJpb3JpdHkgaXMgaW4gdXBwZXIgMyBiaXRzICovCisjZGVmaW5lIElYR0JFX1JYRF9QUklfU0hJRlQJMTMKKyNkZWZpbmUgSVhHQkVfUlhEX0NGSV9NQVNLCTB4MTAwMCAgLyogQ0ZJIGlzIGJpdCAxMiAqLworI2RlZmluZSBJWEdCRV9SWERfQ0ZJX1NISUZUCTEyCiAKLSNkZWZpbmUgSVhHQkVfUlhEQURWX1NUQVRfREQgICAgICAgICAgICBJWEdCRV9SWERfU1RBVF9ERCAgLyogRG9uZSAqLwotI2RlZmluZSBJWEdCRV9SWERBRFZfU1RBVF9FT1AgICAgICAgICAgIElYR0JFX1JYRF9TVEFUX0VPUCAvKiBFbmQgb2YgUGFja2V0ICovCi0jZGVmaW5lIElYR0JFX1JYREFEVl9TVEFUX0ZMTSAgICAgICAgICAgSVhHQkVfUlhEX1NUQVRfRkxNIC8qIEZEaXIgTWF0Y2ggKi8KLSNkZWZpbmUgSVhHQkVfUlhEQURWX1NUQVRfVlAgICAgICAgICAgICBJWEdCRV9SWERfU1RBVF9WUCAgLyogSUVFRSBWTEFOIFBrdCAqLwotI2RlZmluZSBJWEdCRV9SWERBRFZfU1RBVF9NQVNLICAgICAgICAgIDB4MDAwRkZGRkYgLyogU3RhdC9ORVhUUDogYml0IDAtMTkgKi8KLSNkZWZpbmUgSVhHQkVfUlhEQURWX1NUQVRfRkNFT0ZTICAgICAgICAweDAwMDAwMDQwIC8qIEZDb0UgRU9GL1NPRiBTdGF0ICovCi0jZGVmaW5lIElYR0JFX1JYREFEVl9TVEFUX0ZDU1RBVCAgICAgICAgMHgwMDAwMDAzMCAvKiBGQ29FIFBrdCBTdGF0ICovCi0jZGVmaW5lIElYR0JFX1JYREFEVl9TVEFUX0ZDU1RBVF9OT01UQ0ggMHgwMDAwMDAwMCAvKiAwMDogTm8gQ3R4dCBNYXRjaCAqLwotI2RlZmluZSBJWEdCRV9SWERBRFZfU1RBVF9GQ1NUQVRfTk9ERFAgIDB4MDAwMDAwMTAgLyogMDE6IEN0eHQgdy9vIEREUCAqLwotI2RlZmluZSBJWEdCRV9SWERBRFZfU1RBVF9GQ1NUQVRfRkNQUlNQIDB4MDAwMDAwMjAgLyogMTA6IFJlY3YuIEZDUF9SU1AgKi8KLSNkZWZpbmUgSVhHQkVfUlhEQURWX1NUQVRfRkNTVEFUX0REUCAgICAweDAwMDAwMDMwIC8qIDExOiBDdHh0IHcvIEREUCAqLworI2RlZmluZSBJWEdCRV9SWERBRFZfU1RBVF9ERAkJSVhHQkVfUlhEX1NUQVRfREQgIC8qIERvbmUgKi8KKyNkZWZpbmUgSVhHQkVfUlhEQURWX1NUQVRfRU9QCQlJWEdCRV9SWERfU1RBVF9FT1AgLyogRW5kIG9mIFBhY2tldCAqLworI2RlZmluZSBJWEdCRV9SWERBRFZfU1RBVF9GTE0JCUlYR0JFX1JYRF9TVEFUX0ZMTSAvKiBGRGlyIE1hdGNoICovCisjZGVmaW5lIElYR0JFX1JYREFEVl9TVEFUX1ZQCQlJWEdCRV9SWERfU1RBVF9WUCAgLyogSUVFRSBWTEFOIFBrdCAqLworI2RlZmluZSBJWEdCRV9SWERBRFZfU1RBVF9NQVNLCQkweDAwMEZGRkZGIC8qIFN0YXQvTkVYVFA6IGJpdCAwLTE5ICovCisjZGVmaW5lIElYR0JFX1JYREFEVl9TVEFUX0ZDRU9GUwkweDAwMDAwMDQwIC8qIEZDb0UgRU9GL1NPRiBTdGF0ICovCisjZGVmaW5lIElYR0JFX1JYREFEVl9TVEFUX0ZDU1RBVAkweDAwMDAwMDMwIC8qIEZDb0UgUGt0IFN0YXQgKi8KKyNkZWZpbmUgSVhHQkVfUlhEQURWX1NUQVRfRkNTVEFUX05PTVRDSAkweDAwMDAwMDAwIC8qIDAwOiBObyBDdHh0IE1hdGNoICovCisjZGVmaW5lIElYR0JFX1JYREFEVl9TVEFUX0ZDU1RBVF9OT0REUAkweDAwMDAwMDEwIC8qIDAxOiBDdHh0IHcvbyBERFAgKi8KKyNkZWZpbmUgSVhHQkVfUlhEQURWX1NUQVRfRkNTVEFUX0ZDUFJTUAkweDAwMDAwMDIwIC8qIDEwOiBSZWN2LiBGQ1BfUlNQICovCisjZGVmaW5lIElYR0JFX1JYREFEVl9TVEFUX0ZDU1RBVF9ERFAJMHgwMDAwMDAzMCAvKiAxMTogQ3R4dCB3LyBERFAgKi8KIAotI2RlZmluZSBJWEdCRV9SWERBRFZfUlNTVFlQRV9NQVNLICAgICAgIDB4MDAwMDAwMEYKLSNkZWZpbmUgSVhHQkVfUlhEQURWX1BLVFRZUEVfTUFTSyAgICAgICAweDAwMDBGRkYwCi0jZGVmaW5lIElYR0JFX1JYREFEVl9QS1RUWVBFX01BU0tfRVggICAgMHgwMDAxRkZGMAotI2RlZmluZSBJWEdCRV9SWERBRFZfSERSQlVGTEVOX01BU0sgICAgIDB4MDAwMDdGRTAKLSNkZWZpbmUgSVhHQkVfUlhEQURWX1JTQ0NOVF9NQVNLICAgICAgICAweDAwMUUwMDAwCi0jZGVmaW5lIElYR0JFX1JYREFEVl9SU0NDTlRfU0hJRlQgICAgICAgMTcKLSNkZWZpbmUgSVhHQkVfUlhEQURWX0hEUkJVRkxFTl9TSElGVCAgICA1Ci0jZGVmaW5lIElYR0JFX1JYREFEVl9TUExJVEhFQURFUl9FTiAgICAgMHgwMDAwMTAwMAotI2RlZmluZSBJWEdCRV9SWERBRFZfU1BIICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBJWEdCRV9SWERBRFZfUlNTVFlQRV9NQVNLCTB4MDAwMDAwMEYKKyNkZWZpbmUgSVhHQkVfUlhEQURWX1BLVFRZUEVfTUFTSwkweDAwMDBGRkYwCisjZGVmaW5lIElYR0JFX1JYREFEVl9QS1RUWVBFX01BU0tfRVgJMHgwMDAxRkZGMAorI2RlZmluZSBJWEdCRV9SWERBRFZfSERSQlVGTEVOX01BU0sJMHgwMDAwN0ZFMAorI2RlZmluZSBJWEdCRV9SWERBRFZfUlNDQ05UX01BU0sJMHgwMDFFMDAwMAorI2RlZmluZSBJWEdCRV9SWERBRFZfUlNDQ05UX1NISUZUCTE3CisjZGVmaW5lIElYR0JFX1JYREFEVl9IRFJCVUZMRU5fU0hJRlQJNQorI2RlZmluZSBJWEdCRV9SWERBRFZfU1BMSVRIRUFERVJfRU4JMHgwMDAwMTAwMAorI2RlZmluZSBJWEdCRV9SWERBRFZfU1BICQkweDgwMDAKIAogI2RlZmluZSBJWEdCRV9SWERfRVJSX0ZSQU1FX0VSUl9NQVNLICggXAogCQkJCSAgICAgIElYR0JFX1JYRF9FUlJfQ0UgfCAgXApAQCAtMTc2LDE2ICsxNzUsMTYgQEAKIAkJCQkJIElYR0JFX1JYREFEVl9FUlJfT1NFIHwgXAogCQkJCQkgSVhHQkVfUlhEQURWX0VSUl9VU0UpCiAKLSNkZWZpbmUgSVhHQkVfVFhEX1BPUFRTX0lYU00gMHgwMSAgICAgICAvKiBJbnNlcnQgSVAgY2hlY2tzdW0gKi8KLSNkZWZpbmUgSVhHQkVfVFhEX1BPUFRTX1RYU00gMHgwMiAgICAgICAvKiBJbnNlcnQgVENQL1VEUCBjaGVja3N1bSAqLwotI2RlZmluZSBJWEdCRV9UWERfQ01EX0VPUCAgICAweDAxMDAwMDAwIC8qIEVuZCBvZiBQYWNrZXQgKi8KLSNkZWZpbmUgSVhHQkVfVFhEX0NNRF9JRkNTICAgMHgwMjAwMDAwMCAvKiBJbnNlcnQgRkNTIChFdGhlcm5ldCBDUkMpICovCi0jZGVmaW5lIElYR0JFX1RYRF9DTURfSUMgICAgIDB4MDQwMDAwMDAgLyogSW5zZXJ0IENoZWNrc3VtICovCi0jZGVmaW5lIElYR0JFX1RYRF9DTURfUlMgICAgIDB4MDgwMDAwMDAgLyogUmVwb3J0IFN0YXR1cyAqLwotI2RlZmluZSBJWEdCRV9UWERfQ01EX0RFWFQgICAweDIwMDAwMDAwIC8qIERlc2NyaXB0b3IgZXh0ZW5zaW9uICgwID0gbGVnYWN5KSAqLwotI2RlZmluZSBJWEdCRV9UWERfQ01EX1ZMRSAgICAweDQwMDAwMDAwIC8qIEFkZCBWTEFOIHRhZyAqLwotI2RlZmluZSBJWEdCRV9UWERfU1RBVF9ERCAgICAweDAwMDAwMDAxIC8qIERlc2NyaXB0b3IgRG9uZSAqLwotI2RlZmluZSBJWEdCRV9UWERfQ01ECSAgICAgKElYR0JFX1RYRF9DTURfRU9QIHwgSVhHQkVfVFhEX0NNRF9SUykKKyNkZWZpbmUgSVhHQkVfVFhEX1BPUFRTX0lYU00JMHgwMSAgICAgICAvKiBJbnNlcnQgSVAgY2hlY2tzdW0gKi8KKyNkZWZpbmUgSVhHQkVfVFhEX1BPUFRTX1RYU00JMHgwMiAgICAgICAvKiBJbnNlcnQgVENQL1VEUCBjaGVja3N1bSAqLworI2RlZmluZSBJWEdCRV9UWERfQ01EX0VPUAkweDAxMDAwMDAwIC8qIEVuZCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgSVhHQkVfVFhEX0NNRF9JRkNTCTB4MDIwMDAwMDAgLyogSW5zZXJ0IEZDUyAoRXRoZXJuZXQgQ1JDKSAqLworI2RlZmluZSBJWEdCRV9UWERfQ01EX0lDCTB4MDQwMDAwMDAgLyogSW5zZXJ0IENoZWNrc3VtICovCisjZGVmaW5lIElYR0JFX1RYRF9DTURfUlMJMHgwODAwMDAwMCAvKiBSZXBvcnQgU3RhdHVzICovCisjZGVmaW5lIElYR0JFX1RYRF9DTURfREVYVAkweDIwMDAwMDAwIC8qIERlc2NyaXB0b3IgZXh0ICgwID0gbGVnYWN5KSAqLworI2RlZmluZSBJWEdCRV9UWERfQ01EX1ZMRQkweDQwMDAwMDAwIC8qIEFkZCBWTEFOIHRhZyAqLworI2RlZmluZSBJWEdCRV9UWERfU1RBVF9ERAkweDAwMDAwMDAxIC8qIERlc2NyaXB0b3IgRG9uZSAqLworI2RlZmluZSBJWEdCRV9UWERfQ01ECQkoSVhHQkVfVFhEX0NNRF9FT1AgfCBJWEdCRV9UWERfQ01EX1JTKQogCiAvKiBUcmFuc21pdCBEZXNjcmlwdG9yIC0gQWR2YW5jZWQgKi8KIHVuaW9uIGl4Z2JlX2Fkdl90eF9kZXNjIHsKQEAgLTI0MSw0NCArMjQwLDQ0IEBACiB9OwogCiAvKiBBZHYgVHJhbnNtaXQgRGVzY3JpcHRvciBDb25maWcgTWFza3MgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0RUWVBfTUFTSyAgMHgwMEYwMDAwMCAvKiBEVFlQIG1hc2sgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0RUWVBfQ1RYVCAgMHgwMDIwMDAwMCAvKiBBZHZhbmNlZCBDb250ZXh0IERlc2MgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0RUWVBfREFUQSAgMHgwMDMwMDAwMCAvKiBBZHZhbmNlZCBEYXRhIERlc2NyaXB0b3IgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0RDTURfRU9QICAgSVhHQkVfVFhEX0NNRF9FT1AgIC8qIEVuZCBvZiBQYWNrZXQgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0RDTURfSUZDUyAgSVhHQkVfVFhEX0NNRF9JRkNTIC8qIEluc2VydCBGQ1MgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0RDTURfUlMgICAgSVhHQkVfVFhEX0NNRF9SUyAgIC8qIFJlcG9ydCBTdGF0dXMgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0RDTURfREVYVCAgSVhHQkVfVFhEX0NNRF9ERVhUIC8qIERlc2MgZXh0ICgxPUFkdikgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0RDTURfVkxFICAgSVhHQkVfVFhEX0NNRF9WTEUgIC8qIFZMQU4gcGt0IGVuYWJsZSAqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfRENNRF9UU0UgICAweDgwMDAwMDAwIC8qIFRDUCBTZWcgZW5hYmxlICovCi0jZGVmaW5lIElYR0JFX0FEVlRYRF9TVEFUX0REICAgIElYR0JFX1RYRF9TVEFUX0REICAvKiBEZXNjcmlwdG9yIERvbmUgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX1RVQ01EX0lQVjQgICAgICAweDAwMDAwNDAwICAvKiBJUCBQYWNrZXQgVHlwZTogMT1JUHY0ICovCi0jZGVmaW5lIElYR0JFX0FEVlRYRF9UVUNNRF9JUFY2ICAgICAgMHgwMDAwMDAwMCAgLyogSVAgUGFja2V0IFR5cGU6IDA9SVB2NiAqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfVFVDTURfTDRUX1VEUCAgIDB4MDAwMDAwMDAgIC8qIEw0IFBhY2tldCBUWVBFIG9mIFVEUCAqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfVFVDTURfTDRUX1RDUCAgIDB4MDAwMDA4MDAgIC8qIEw0IFBhY2tldCBUWVBFIG9mIFRDUCAqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfVFVDTURfTDRUX1NDVFAgIDB4MDAwMDEwMDAgIC8qIEw0IFBhY2tldCBUWVBFIG9mIFNDVFAgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0lEWF9TSElGVCAgNCAvKiBBZHYgZGVzYyBJbmRleCBzaGlmdCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfRFRZUF9NQVNLCTB4MDBGMDAwMDAgLyogRFRZUCBtYXNrICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9EVFlQX0NUWFQJMHgwMDIwMDAwMCAvKiBBZHZhbmNlZCBDb250ZXh0IERlc2MgKi8KKyNkZWZpbmUgSVhHQkVfQURWVFhEX0RUWVBfREFUQQkweDAwMzAwMDAwIC8qIEFkdmFuY2VkIERhdGEgRGVzY3JpcHRvciAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfRENNRF9FT1AJSVhHQkVfVFhEX0NNRF9FT1AgIC8qIEVuZCBvZiBQYWNrZXQgKi8KKyNkZWZpbmUgSVhHQkVfQURWVFhEX0RDTURfSUZDUwlJWEdCRV9UWERfQ01EX0lGQ1MgLyogSW5zZXJ0IEZDUyAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfRENNRF9SUwlJWEdCRV9UWERfQ01EX1JTICAgLyogUmVwb3J0IFN0YXR1cyAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfRENNRF9ERVhUCUlYR0JFX1RYRF9DTURfREVYVCAvKiBEZXNjIGV4dCAoMT1BZHYpICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9EQ01EX1ZMRQlJWEdCRV9UWERfQ01EX1ZMRSAgLyogVkxBTiBwa3QgZW5hYmxlICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9EQ01EX1RTRQkweDgwMDAwMDAwIC8qIFRDUCBTZWcgZW5hYmxlICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9TVEFUX0RECUlYR0JFX1RYRF9TVEFUX0REICAvKiBEZXNjcmlwdG9yIERvbmUgKi8KKyNkZWZpbmUgSVhHQkVfQURWVFhEX1RVQ01EX0lQVjQJMHgwMDAwMDQwMCAgLyogSVAgUGFja2V0IFR5cGU6IDE9SVB2NCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfVFVDTURfSVBWNgkweDAwMDAwMDAwICAvKiBJUCBQYWNrZXQgVHlwZTogMD1JUHY2ICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9UVUNNRF9MNFRfVURQCTB4MDAwMDAwMDAgIC8qIEw0IFBhY2tldCBUWVBFIG9mIFVEUCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfVFVDTURfTDRUX1RDUAkweDAwMDAwODAwICAvKiBMNCBQYWNrZXQgVFlQRSBvZiBUQ1AgKi8KKyNkZWZpbmUgSVhHQkVfQURWVFhEX1RVQ01EX0w0VF9TQ1RQCTB4MDAwMDEwMDAgIC8qIEw0IFBhY2tldCBUWVBFIG9mIFNDVFAgKi8KKyNkZWZpbmUgSVhHQkVfQURWVFhEX0lEWF9TSElGVAk0IC8qIEFkdiBkZXNjIEluZGV4IHNoaWZ0ICovCiAjZGVmaW5lIElYR0JFX0FEVlRYRF9DQwkJMHgwMDAwMDA4MCAvKiBDaGVjayBDb250ZXh0ICovCi0jZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19TSElGVCAgICAgIDggIC8qIEFkdiBkZXNjIFBPUFRTIHNoaWZ0ICovCi0jZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19JWFNNIChJWEdCRV9UWERfUE9QVFNfSVhTTSA8PCBcCisjZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19TSElGVAk4ICAvKiBBZHYgZGVzYyBQT1BUUyBzaGlmdCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfUE9QVFNfSVhTTQkoSVhHQkVfVFhEX1BPUFRTX0lYU00gPDwgXAogCQkJCSBJWEdCRV9BRFZUWERfUE9QVFNfU0hJRlQpCi0jZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19UWFNNIChJWEdCRV9UWERfUE9QVFNfVFhTTSA8PCBcCisjZGVmaW5lIElYR0JFX0FEVlRYRF9QT1BUU19UWFNNCShJWEdCRV9UWERfUE9QVFNfVFhTTSA8PCBcCiAJCQkJIElYR0JFX0FEVlRYRF9QT1BUU19TSElGVCkKLSNkZWZpbmUgSVhHQkVfQURWVFhEX1BBWUxFTl9TSElGVCAgICAxNCAvKiBBZHYgZGVzYyBQQVlMRU4gc2hpZnQgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX01BQ0xFTl9TSElGVCAgICA5ICAvKiBBZHYgY3R4dCBkZXNjIG1hYyBsZW4gc2hpZnQgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX1ZMQU5fU0hJRlQgICAgICAxNiAgLyogQWR2IGN0eHQgdmxhbiB0YWcgc2hpZnQgKi8KLSNkZWZpbmUgSVhHQkVfQURWVFhEX0w0TEVOX1NISUZUICAgICA4ICAvKiBBZHYgY3R4dCBMNExFTiBzaGlmdCAqLwotI2RlZmluZSBJWEdCRV9BRFZUWERfTVNTX1NISUZUICAgICAgIDE2ICAvKiBBZHYgY3R4dCBNU1Mgc2hpZnQgKi8KKyNkZWZpbmUgSVhHQkVfQURWVFhEX1BBWUxFTl9TSElGVAkxNCAvKiBBZHYgZGVzYyBQQVlMRU4gc2hpZnQgKi8KKyNkZWZpbmUgSVhHQkVfQURWVFhEX01BQ0xFTl9TSElGVAk5ICAvKiBBZHYgY3R4dCBkZXNjIG1hYyBsZW4gc2hpZnQgKi8KKyNkZWZpbmUgSVhHQkVfQURWVFhEX1ZMQU5fU0hJRlQJCTE2IC8qIEFkdiBjdHh0IHZsYW4gdGFnIHNoaWZ0ICovCisjZGVmaW5lIElYR0JFX0FEVlRYRF9MNExFTl9TSElGVAk4ICAvKiBBZHYgY3R4dCBMNExFTiBzaGlmdCAqLworI2RlZmluZSBJWEdCRV9BRFZUWERfTVNTX1NISUZUCQkxNiAvKiBBZHYgY3R4dCBNU1Mgc2hpZnQgKi8KIAogLyogSW50ZXJydXB0IHJlZ2lzdGVyIGJpdG1hc2tzICovCiAKLSNkZWZpbmUgSVhHQkVfRUlUUl9DTlRfV0RJUyAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBJWEdCRV9FSVRSX0NOVF9XRElTCTB4ODAwMDAwMDAKICNkZWZpbmUgSVhHQkVfTUFYX0VJVFIJCTB4MDAwMDBGRjgKICNkZWZpbmUgSVhHQkVfTUlOX0VJVFIJCTgKIAogLyogRXJyb3IgQ29kZXMgKi8KLSNkZWZpbmUgSVhHQkVfRVJSX0lOVkFMSURfTUFDX0FERFIgICAgICAgICAgICAgIC0xCi0jZGVmaW5lIElYR0JFX0VSUl9SRVNFVF9GQUlMRUQgICAgICAgICAgICAgICAgICAtMgotI2RlZmluZSBJWEdCRV9FUlJfSU5WQUxJRF9BUkdVTUVOVCAgICAgICAgICAgICAgLTMKKyNkZWZpbmUgSVhHQkVfRVJSX0lOVkFMSURfTUFDX0FERFIJLTEKKyNkZWZpbmUgSVhHQkVfRVJSX1JFU0VUX0ZBSUxFRAkJLTIKKyNkZWZpbmUgSVhHQkVfRVJSX0lOVkFMSURfQVJHVU1FTlQJLTMKIAogLyogVHJhbnNtaXQgQ29uZmlnIG1hc2tzICovCiAjZGVmaW5lIElYR0JFX1RYRENUTF9FTkFCTEUJCTB4MDIwMDAwMDAgLyogRW5hIHNwZWNpZmljIFR4IFF1ZXVlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvZXRodG9vbC5jCmluZGV4IGNjMGU1YjcuLmIyZjViMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvZXRodG9vbC5jCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbCA4MjU5OSBWaXJ0dWFsIEZ1bmN0aW9uIGRyaXZlcgotICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMTMsOCArMTMsNyBAQAogICBtb3JlIGRldGFpbHMuCiAKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAKICAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KQEAgLTEwMCw2ICs5OSw3IEBACiAJIlJlZ2lzdGVyIHRlc3QgIChvZmZsaW5lKSIsCiAJIkxpbmsgdGVzdCAgIChvbi9vZmZsaW5lKSIKIH07CisKICNkZWZpbmUgSVhHQkVfVEVTVF9MRU4gKHNpemVvZihpeGdiZV9nc3RyaW5nc190ZXN0KSAvIEVUSF9HU1RSSU5HX0xFTikKIAogc3RhdGljIGludCBpeGdiZXZmX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LApAQCAtMTIwLDYgKzEyMCw3IEBACiAKIAlpZiAobGlua191cCkgewogCQlfX3UzMiBzcGVlZCA9IFNQRUVEXzEwMDAwOworCiAJCXN3aXRjaCAobGlua19zcGVlZCkgewogCQljYXNlIElYR0JFX0xJTktfU1BFRURfMTBHQl9GVUxMOgogCQkJc3BlZWQgPSBTUEVFRF8xMDAwMDsKQEAgLTE0NSwxMiArMTQ2LDE0IEBACiBzdGF0aWMgdTMyIGl4Z2JldmZfZ2V0X21zZ2xldmVsKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKIAlyZXR1cm4gYWRhcHRlci0+bXNnX2VuYWJsZTsKIH0KIAogc3RhdGljIHZvaWQgaXhnYmV2Zl9zZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGRhdGEpCiB7CiAJc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisKIAlhZGFwdGVyLT5tc2dfZW5hYmxlID0gZGF0YTsKIH0KIApAQCAtMTg1LDcgKzE4OCw4IEBACiAKIAkvKiBJbnRlcnJ1cHQgKi8KIAkvKiBkb24ndCByZWFkIEVJQ1IgYmVjYXVzZSBpdCBjYW4gY2xlYXIgaW50ZXJydXB0IGNhdXNlcywgaW5zdGVhZAotCSAqIHJlYWQgRUlDUyB3aGljaCBpcyBhIHNoYWRvdyBidXQgZG9lc24ndCBjbGVhciBFSUNSICovCisJICogcmVhZCBFSUNTIHdoaWNoIGlzIGEgc2hhZG93IGJ1dCBkb2Vzbid0IGNsZWFyIEVJQ1IKKwkgKi8KIAlyZWdzX2J1ZmZbNV0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVlRFSUNTKTsKIAlyZWdzX2J1ZmZbNl0gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVlRFSUNTKTsKIAlyZWdzX2J1ZmZbN10gPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfVlRFSU1TKTsKQEAgLTM5MCwyMSArMzk0LDIxIEBACiAKIHN0YXRpYyBpbnQgaXhnYmV2Zl9nZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3RyaW5nc2V0KQogewotICAgICAgIHN3aXRjaCAoc3RyaW5nc2V0KSB7Ci0gICAgICAgY2FzZSBFVEhfU1NfVEVTVDoKLQkgICAgICAgcmV0dXJuIElYR0JFX1RFU1RfTEVOOwotICAgICAgIGNhc2UgRVRIX1NTX1NUQVRTOgotCSAgICAgICByZXR1cm4gSVhHQkVfR0xPQkFMX1NUQVRTX0xFTjsKLSAgICAgICBkZWZhdWx0OgotCSAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICB9CisJc3dpdGNoIChzdHJpbmdzZXQpIHsKKwljYXNlIEVUSF9TU19URVNUOgorCQlyZXR1cm4gSVhHQkVfVEVTVF9MRU47CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCXJldHVybiBJWEdCRV9HTE9CQUxfU1RBVFNfTEVOOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KIH0KIAogc3RhdGljIHZvaWQgaXhnYmV2Zl9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJCSAgICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0cywgdTY0ICpkYXRhKQogewogCXN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWNoYXIgKmJhc2UgPSAoY2hhciAqKSBhZGFwdGVyOworCWNoYXIgKmJhc2UgPSAoY2hhciAqKWFkYXB0ZXI7CiAJaW50IGk7CiAjaWZkZWYgQlBfRVhURU5ERURfU1RBVFMKIAl1NjQgcnhfeWllbGRzID0gMCwgcnhfY2xlYW5lZCA9IDAsIHJ4X21pc3NlZCA9IDAsCkBAIC01OTQsOCArNTk4LDcgQEAKIAl9CiAJdGVzdCA9IHJlZ190ZXN0X3ZmOwogCi0JLyoKLQkgKiBQZXJmb3JtIHRoZSByZWdpc3RlciB0ZXN0LCBsb29waW5nIHRocm91Z2ggdGhlIHRlc3QgdGFibGUKKwkvKiBQZXJmb3JtIHRoZSByZWdpc3RlciB0ZXN0LCBsb29waW5nIHRocm91Z2ggdGhlIHRlc3QgdGFibGUKIAkgKiB1bnRpbCB3ZSBlaXRoZXIgZmFpbCBvciByZWFjaCB0aGUgbnVsbCBlbnRyeS4KIAkgKi8KIAl3aGlsZSAodGVzdC0+cmVnKSB7CkBAIC02MTcsOCArNjIwLDggQEAKIAkJCQlicmVhazsKIAkJCWNhc2UgV1JJVEVfTk9fVEVTVDoKIAkJCQlpeGdiZV93cml0ZV9yZWcoJmFkYXB0ZXItPmh3LAotCQkJCQkJICB0ZXN0LT5yZWcgKyAoaSAqIDB4NDApLAotCQkJCQkJICB0ZXN0LT53cml0ZSk7CisJCQkJCQl0ZXN0LT5yZWcgKyAoaSAqIDB4NDApLAorCQkJCQkJdGVzdC0+d3JpdGUpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUQUJMRTMyX1RFU1Q6CiAJCQkJYiA9IHJlZ19wYXR0ZXJuX3Rlc3QoYWRhcHRlciwgZGF0YSwKQEAgLTY3MCw3ICs2NzMsOCBAQAogCQlod19kYmcoJmFkYXB0ZXItPmh3LCAib2ZmbGluZSB0ZXN0aW5nIHN0YXJ0aW5nXG4iKTsKIAogCQkvKiBMaW5rIHRlc3QgcGVyZm9ybWVkIGJlZm9yZSBoYXJkd2FyZSByZXNldCBzbyBhdXRvbmVnIGRvZXNuJ3QKLQkJICogaW50ZXJmZXJlIHdpdGggdGVzdCByZXN1bHQgKi8KKwkJICogaW50ZXJmZXJlIHdpdGggdGVzdCByZXN1bHQKKwkJICovCiAJCWlmIChpeGdiZXZmX2xpbmtfdGVzdChhZGFwdGVyLCAmZGF0YVsxXSkpCiAJCQlldGhfdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCkBAIC03MjQsNyArNzI4LDcgQEAKIAllbHNlCiAJCWVjLT5yeF9jb2FsZXNjZV91c2VjcyA9IGFkYXB0ZXItPnJ4X2l0cl9zZXR0aW5nID4+IDI7CiAKLQkvKiBpZiBpbiBtaXhlZCB0eC9yeCBxdWV1ZXMgcGVyIHZlY3RvciBtb2RlLCByZXBvcnQgb25seSByeCBzZXR0aW5ncyAqLworCS8qIGlmIGluIG1peGVkIFR4L1J4IHF1ZXVlcyBwZXIgdmVjdG9yIG1vZGUsIHJlcG9ydCBvbmx5IFJ4IHNldHRpbmdzICovCiAJaWYgKGFkYXB0ZXItPnFfdmVjdG9yWzBdLT50eC5jb3VudCAmJiBhZGFwdGVyLT5xX3ZlY3RvclswXS0+cnguY291bnQpCiAJCXJldHVybiAwOwogCkBAIC03NDUsMTIgKzc0OSwxMSBAQAogCWludCBudW1fdmVjdG9ycywgaTsKIAl1MTYgdHhfaXRyX3BhcmFtLCByeF9pdHJfcGFyYW07CiAKLQkvKiBkb24ndCBhY2NlcHQgdHggc3BlY2lmaWMgY2hhbmdlcyBpZiB3ZSd2ZSBnb3QgbWl4ZWQgUnhUeCB2ZWN0b3JzICovCi0JaWYgKGFkYXB0ZXItPnFfdmVjdG9yWzBdLT50eC5jb3VudCAmJiBhZGFwdGVyLT5xX3ZlY3RvclswXS0+cnguY291bnQKLQkgICAgJiYgZWMtPnR4X2NvYWxlc2NlX3VzZWNzKQorCS8qIGRvbid0IGFjY2VwdCBUeCBzcGVjaWZpYyBjaGFuZ2VzIGlmIHdlJ3ZlIGdvdCBtaXhlZCBSeFR4IHZlY3RvcnMgKi8KKwlpZiAoYWRhcHRlci0+cV92ZWN0b3JbMF0tPnR4LmNvdW50ICYmCisJICAgIGFkYXB0ZXItPnFfdmVjdG9yWzBdLT5yeC5jb3VudCAmJiBlYy0+dHhfY29hbGVzY2VfdXNlY3MpCiAJCXJldHVybiAtRUlOVkFMOwogCi0KIAlpZiAoKGVjLT5yeF9jb2FsZXNjZV91c2VjcyA+IChJWEdCRV9NQVhfRUlUUiA+PiAyKSkgfHwKIAkgICAgKGVjLT50eF9jb2FsZXNjZV91c2VjcyA+IChJWEdCRV9NQVhfRUlUUiA+PiAyKSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNzY1LDcgKzc2OCw2IEBACiAJZWxzZQogCQlyeF9pdHJfcGFyYW0gPSBhZGFwdGVyLT5yeF9pdHJfc2V0dGluZzsKIAotCiAJaWYgKGVjLT50eF9jb2FsZXNjZV91c2VjcyA+IDEpCiAJCWFkYXB0ZXItPnR4X2l0cl9zZXR0aW5nID0gZWMtPnR4X2NvYWxlc2NlX3VzZWNzIDw8IDI7CiAJZWxzZQpAQCAtNzgxLDEwICs3ODMsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX3ZlY3RvcnM7IGkrKykgewogCQlxX3ZlY3RvciA9IGFkYXB0ZXItPnFfdmVjdG9yW2ldOwogCQlpZiAocV92ZWN0b3ItPnR4LmNvdW50ICYmICFxX3ZlY3Rvci0+cnguY291bnQpCi0JCQkvKiB0eCBvbmx5ICovCisJCQkvKiBUeCBvbmx5ICovCiAJCQlxX3ZlY3Rvci0+aXRyID0gdHhfaXRyX3BhcmFtOwogCQllbHNlCi0JCQkvKiByeCBvbmx5IG9yIG1peGVkICovCisJCQkvKiBSeCBvbmx5IG9yIG1peGVkICovCiAJCQlxX3ZlY3Rvci0+aXRyID0gcnhfaXRyX3BhcmFtOwogCQlpeGdiZXZmX3dyaXRlX2VpdHIocV92ZWN0b3IpOwogCX0KQEAgLTc5MiwyMyArNzk0LDkyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaXhnYmV2Zl9nZXRfcnhuZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmluZm8sCisJCQkgICAgIHUzMiAqcnVsZXMgX19hbHdheXNfdW51c2VkKQoreworCXN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOworCisJc3dpdGNoIChpbmZvLT5jbWQpIHsKKwljYXNlIEVUSFRPT0xfR1JYUklOR1M6CisJCWluZm8tPmRhdGEgPSBhZGFwdGVyLT5udW1fcnhfcXVldWVzOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OgorCQlod19kYmcoJmFkYXB0ZXItPmh3LCAiQ29tbWFuZCBwYXJhbWV0ZXJzIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgdTMyIGl4Z2JldmZfZ2V0X3J4ZmhfaW5kaXJfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJLyogV2Ugc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiBvbmx5IGZvciA4MjU5OSBhbmQgeDU0MCBhdCB0aGUgbW9tZW50ICovCisJaWYgKGFkYXB0ZXItPmh3Lm1hYy50eXBlIDwgaXhnYmVfbWFjX1g1NTBfdmYpCisJCXJldHVybiBJWEdCRVZGXzgyNTk5X1JFVEFfU0laRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGl4Z2JldmZfZ2V0X3J4Zmhfa2V5X3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCS8qIFdlIHN1cHBvcnQgdGhpcyBvcGVyYXRpb24gb25seSBmb3IgODI1OTkgYW5kIHg1NDAgYXQgdGhlIG1vbWVudCAqLworCWlmIChhZGFwdGVyLT5ody5tYWMudHlwZSA8IGl4Z2JlX21hY19YNTUwX3ZmKQorCQlyZXR1cm4gSVhHQkVWRl9SU1NfSEFTSF9LRVlfU0laRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl4Z2JldmZfZ2V0X3J4Zmgoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyICppbmRpciwgdTggKmtleSwKKwkJCSAgICB1OCAqaGZ1bmMpCit7CisJc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJaW50IGVyciA9IDA7CisKKwlpZiAoaGZ1bmMpCisJCSpoZnVuYyA9IEVUSF9SU1NfSEFTSF9UT1A7CisKKwkvKiBJZiBuZWl0aGVyIGluZGlyZWN0aW9uIHRhYmxlIG5vciBoYXNoIGtleSB3YXMgcmVxdWVzdGVkIC0ganVzdAorCSAqIHJldHVybiBhIHN1Y2Nlc3MgYXZvaWRpbmcgdGFraW5nIGFueSBsb2Nrcy4KKwkgKi8KKwlpZiAoIWluZGlyICYmICFrZXkpCisJCXJldHVybiAwOworCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tYnhfbG9jayk7CisJaWYgKGluZGlyKQorCQllcnIgPSBpeGdiZXZmX2dldF9yZXRhX2xvY2tlZCgmYWRhcHRlci0+aHcsIGluZGlyLAorCQkJCQkgICAgICBhZGFwdGVyLT5udW1fcnhfcXVldWVzKTsKKworCWlmICghZXJyICYmIGtleSkKKwkJZXJyID0gaXhnYmV2Zl9nZXRfcnNzX2tleV9sb2NrZWQoJmFkYXB0ZXItPmh3LCBrZXkpOworCisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1ieF9sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgaXhnYmV2Zl9ldGh0b29sX29wcyA9IHsKLQkuZ2V0X3NldHRpbmdzICAgICAgICAgICA9IGl4Z2JldmZfZ2V0X3NldHRpbmdzLAotCS5nZXRfZHJ2aW5mbyAgICAgICAgICAgID0gaXhnYmV2Zl9nZXRfZHJ2aW5mbywKLQkuZ2V0X3JlZ3NfbGVuICAgICAgICAgICA9IGl4Z2JldmZfZ2V0X3JlZ3NfbGVuLAotCS5nZXRfcmVncyAgICAgICAgICAgICAgID0gaXhnYmV2Zl9nZXRfcmVncywKLQkubndheV9yZXNldCAgICAgICAgICAgICA9IGl4Z2JldmZfbndheV9yZXNldCwKLQkuZ2V0X2xpbmsgICAgICAgICAgICAgICA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCi0JLmdldF9yaW5ncGFyYW0gICAgICAgICAgPSBpeGdiZXZmX2dldF9yaW5ncGFyYW0sCi0JLnNldF9yaW5ncGFyYW0gICAgICAgICAgPSBpeGdiZXZmX3NldF9yaW5ncGFyYW0sCi0JLmdldF9tc2dsZXZlbCAgICAgICAgICAgPSBpeGdiZXZmX2dldF9tc2dsZXZlbCwKLQkuc2V0X21zZ2xldmVsICAgICAgICAgICA9IGl4Z2JldmZfc2V0X21zZ2xldmVsLAotCS5zZWxmX3Rlc3QgICAgICAgICAgICAgID0gaXhnYmV2Zl9kaWFnX3Rlc3QsCi0JLmdldF9zc2V0X2NvdW50ICAgICAgICAgPSBpeGdiZXZmX2dldF9zc2V0X2NvdW50LAotCS5nZXRfc3RyaW5ncyAgICAgICAgICAgID0gaXhnYmV2Zl9nZXRfc3RyaW5ncywKLQkuZ2V0X2V0aHRvb2xfc3RhdHMgICAgICA9IGl4Z2JldmZfZ2V0X2V0aHRvb2xfc3RhdHMsCi0JLmdldF9jb2FsZXNjZSAgICAgICAgICAgPSBpeGdiZXZmX2dldF9jb2FsZXNjZSwKLQkuc2V0X2NvYWxlc2NlICAgICAgICAgICA9IGl4Z2JldmZfc2V0X2NvYWxlc2NlLAorCS5nZXRfc2V0dGluZ3MJCT0gaXhnYmV2Zl9nZXRfc2V0dGluZ3MsCisJLmdldF9kcnZpbmZvCQk9IGl4Z2JldmZfZ2V0X2RydmluZm8sCisJLmdldF9yZWdzX2xlbgkJPSBpeGdiZXZmX2dldF9yZWdzX2xlbiwKKwkuZ2V0X3JlZ3MJCT0gaXhnYmV2Zl9nZXRfcmVncywKKwkubndheV9yZXNldAkJPSBpeGdiZXZmX253YXlfcmVzZXQsCisJLmdldF9saW5rCQk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9yaW5ncGFyYW0JCT0gaXhnYmV2Zl9nZXRfcmluZ3BhcmFtLAorCS5zZXRfcmluZ3BhcmFtCQk9IGl4Z2JldmZfc2V0X3JpbmdwYXJhbSwKKwkuZ2V0X21zZ2xldmVsCQk9IGl4Z2JldmZfZ2V0X21zZ2xldmVsLAorCS5zZXRfbXNnbGV2ZWwJCT0gaXhnYmV2Zl9zZXRfbXNnbGV2ZWwsCisJLnNlbGZfdGVzdAkJPSBpeGdiZXZmX2RpYWdfdGVzdCwKKwkuZ2V0X3NzZXRfY291bnQJCT0gaXhnYmV2Zl9nZXRfc3NldF9jb3VudCwKKwkuZ2V0X3N0cmluZ3MJCT0gaXhnYmV2Zl9nZXRfc3RyaW5ncywKKwkuZ2V0X2V0aHRvb2xfc3RhdHMJPSBpeGdiZXZmX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfY29hbGVzY2UJCT0gaXhnYmV2Zl9nZXRfY29hbGVzY2UsCisJLnNldF9jb2FsZXNjZQkJPSBpeGdiZXZmX3NldF9jb2FsZXNjZSwKKwkuZ2V0X3J4bmZjCQk9IGl4Z2JldmZfZ2V0X3J4bmZjLAorCS5nZXRfcnhmaF9pbmRpcl9zaXplCT0gaXhnYmV2Zl9nZXRfcnhmaF9pbmRpcl9zaXplLAorCS5nZXRfcnhmaF9rZXlfc2l6ZQk9IGl4Z2JldmZfZ2V0X3J4Zmhfa2V5X3NpemUsCisJLmdldF9yeGZoCQk9IGl4Z2JldmZfZ2V0X3J4ZmgsCiB9OwogCiB2b2lkIGl4Z2JldmZfc2V0X2V0aHRvb2xfb3BzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zi5oCmluZGV4IDNhOWIzNTYuLjc3NWQwODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zi5oCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbCA4MjU5OSBWaXJ0dWFsIEZ1bmN0aW9uIGRyaXZlcgotICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMTMsOCArMTMsNyBAQAogICBtb3JlIGRldGFpbHMuCiAKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAKICAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KQEAgLTUxLDcgKzUwLDggQEAKICNkZWZpbmUgREVTQ19ORUVERUQgKE1BWF9TS0JfRlJBR1MgKyA0KQogCiAvKiB3cmFwcGVyIGFyb3VuZCBhIHBvaW50ZXIgdG8gYSBzb2NrZXQgYnVmZmVyLAotICogc28gYSBETUEgaGFuZGxlIGNhbiBiZSBzdG9yZWQgYWxvbmcgd2l0aCB0aGUgYnVmZmVyICovCisgKiBzbyBhIERNQSBoYW5kbGUgY2FuIGJlIHN0b3JlZCBhbG9uZyB3aXRoIHRoZSBidWZmZXIKKyAqLwogc3RydWN0IGl4Z2JldmZfdHhfYnVmZmVyIHsKIAl1bmlvbiBpeGdiZV9hZHZfdHhfZGVzYyAqbmV4dF90b193YXRjaDsKIAl1bnNpZ25lZCBsb25nIHRpbWVfc3RhbXA7CkBAIC0xMzIsOSArMTMyLDEwIEBACiAJdTggX19pb21lbSAqdGFpbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JdTE2IHJlZ19pZHg7IC8qIGhvbGRzIHRoZSBzcGVjaWFsIHZhbHVlIHRoYXQgZ2V0cyB0aGUgaGFyZHdhcmUgcmVnaXN0ZXIKLQkJICAgICAgKiBvZmZzZXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmluZywgd2hpY2ggaXMgZGlmZmVyZW50Ci0JCSAgICAgICogZm9yIERDQiBhbmQgUlNTIG1vZGVzICovCisJLyogaG9sZHMgdGhlIHNwZWNpYWwgdmFsdWUgdGhhdCBnZXRzIHRoZSBoYXJkd2FyZSByZWdpc3RlciBvZmZzZXQKKwkgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyByaW5nLCB3aGljaCBpcyBkaWZmZXJlbnQgZm9yIERDQiBhbmQgUlNTIG1vZGVzCisJICovCisJdTE2IHJlZ19pZHg7CiAJaW50IHF1ZXVlX2luZGV4OyAvKiBuZWVkZWQgZm9yIG11bHRpcXVldWUgcXVldWUgbWFuYWdlbWVudCAqLwogfTsKIApAQCAtMTQzLDIxICsxNDQsMjMgQEAKIAogI2RlZmluZSBNQVhfUlhfUVVFVUVTIElYR0JFX1ZGX01BWF9SWF9RVUVVRVMKICNkZWZpbmUgTUFYX1RYX1FVRVVFUyBJWEdCRV9WRl9NQVhfVFhfUVVFVUVTCi0jZGVmaW5lIElYR0JFVkZfTUFYX1JTU19RVUVVRVMgMgorI2RlZmluZSBJWEdCRVZGX01BWF9SU1NfUVVFVUVTCTIKKyNkZWZpbmUgSVhHQkVWRl84MjU5OV9SRVRBX1NJWkUJMTI4CisjZGVmaW5lIElYR0JFVkZfUlNTX0hBU0hfS0VZX1NJWkUJNDAKIAotI2RlZmluZSBJWEdCRVZGX0RFRkFVTFRfVFhEICAgMTAyNAotI2RlZmluZSBJWEdCRVZGX0RFRkFVTFRfUlhEICAgNTEyCi0jZGVmaW5lIElYR0JFVkZfTUFYX1RYRCAgICAgICA0MDk2Ci0jZGVmaW5lIElYR0JFVkZfTUlOX1RYRCAgICAgICA2NAotI2RlZmluZSBJWEdCRVZGX01BWF9SWEQgICAgICAgNDA5NgotI2RlZmluZSBJWEdCRVZGX01JTl9SWEQgICAgICAgNjQKKyNkZWZpbmUgSVhHQkVWRl9ERUZBVUxUX1RYRAkxMDI0CisjZGVmaW5lIElYR0JFVkZfREVGQVVMVF9SWEQJNTEyCisjZGVmaW5lIElYR0JFVkZfTUFYX1RYRAkJNDA5NgorI2RlZmluZSBJWEdCRVZGX01JTl9UWEQJCTY0CisjZGVmaW5lIElYR0JFVkZfTUFYX1JYRAkJNDA5NgorI2RlZmluZSBJWEdCRVZGX01JTl9SWEQJCTY0CiAKIC8qIFN1cHBvcnRlZCBSeCBCdWZmZXIgU2l6ZXMgKi8KLSNkZWZpbmUgSVhHQkVWRl9SWEJVRkZFUl8yNTYgICAyNTYgICAgLyogVXNlZCBmb3IgcGFja2V0IHNwbGl0ICovCi0jZGVmaW5lIElYR0JFVkZfUlhCVUZGRVJfMjA0OCAgMjA0OAorI2RlZmluZSBJWEdCRVZGX1JYQlVGRkVSXzI1NgkyNTYgICAgLyogVXNlZCBmb3IgcGFja2V0IHNwbGl0ICovCisjZGVmaW5lIElYR0JFVkZfUlhCVUZGRVJfMjA0OAkyMDQ4CiAKLSNkZWZpbmUgSVhHQkVWRl9SWF9IRFJfU0laRSBJWEdCRVZGX1JYQlVGRkVSXzI1NgotI2RlZmluZSBJWEdCRVZGX1JYX0JVRlNaICAgIElYR0JFVkZfUlhCVUZGRVJfMjA0OAorI2RlZmluZSBJWEdCRVZGX1JYX0hEUl9TSVpFCUlYR0JFVkZfUlhCVUZGRVJfMjU2CisjZGVmaW5lIElYR0JFVkZfUlhfQlVGU1oJSVhHQkVWRl9SWEJVRkZFUl8yMDQ4CiAKICNkZWZpbmUgTUFYSU1VTV9FVEhFUk5FVF9WTEFOX1NJWkUgKFZMQU5fRVRIX0ZSQU1FX0xFTiArIEVUSF9GQ1NfTEVOKQogCkBAIC0xODYsMTAgKzE4OSwxMSBAQAogICovCiBzdHJ1Y3QgaXhnYmV2Zl9xX3ZlY3RvciB7CiAJc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlcjsKLQl1MTYgdl9pZHg7CQkvKiBpbmRleCBvZiBxX3ZlY3RvciB3aXRoaW4gYXJyYXksIGFsc28gdXNlZCBmb3IKLQkJCQkgKiBmaW5kaW5nIHRoZSBiaXQgaW4gRUlDUiBhbmQgZnJpZW5kcyB0aGF0Ci0JCQkJICogcmVwcmVzZW50cyB0aGUgdmVjdG9yIGZvciB0aGlzIHJpbmcgKi8KLQl1MTYgaXRyOwkJLyogSW50ZXJydXB0IHRocm90dGxlIHJhdGUgd3JpdHRlbiB0byBFSVRSICovCisJLyogaW5kZXggb2YgcV92ZWN0b3Igd2l0aGluIGFycmF5LCBhbHNvIHVzZWQgZm9yIGZpbmRpbmcgdGhlIGJpdCBpbgorCSAqIEVJQ1IgYW5kIGZyaWVuZHMgdGhhdCByZXByZXNlbnRzIHRoZSB2ZWN0b3IgZm9yIHRoaXMgcmluZworCSAqLworCXUxNiB2X2lkeDsKKwl1MTYgaXRyOyAvKiBJbnRlcnJ1cHQgdGhyb3R0bGUgcmF0ZSB3cml0dGVuIHRvIEVJVFIgKi8KIAlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKIAlzdHJ1Y3QgaXhnYmV2Zl9yaW5nX2NvbnRhaW5lciByeCwgdHg7CiAJY2hhciBuYW1lW0lGTkFNU0laICsgOV07CkBAIC0xOTksMTkgKzIwMywyMSBAQAogI2RlZmluZSBJWEdCRVZGX1FWX1NUQVRFX05BUEkJCTEgICAgLyogTkFQSSBvd25zIHRoaXMgUVYgKi8KICNkZWZpbmUgSVhHQkVWRl9RVl9TVEFURV9QT0xMCQkyICAgIC8qIHBvbGwgb3ducyB0aGlzIFFWICovCiAjZGVmaW5lIElYR0JFVkZfUVZfU1RBVEVfRElTQUJMRUQJNCAgICAvKiBRViBpcyBkaXNhYmxlZCAqLwotI2RlZmluZSBJWEdCRVZGX1FWX09XTkVEIChJWEdCRVZGX1FWX1NUQVRFX05BUEkgfCBJWEdCRVZGX1FWX1NUQVRFX1BPTEwpCi0jZGVmaW5lIElYR0JFVkZfUVZfTE9DS0VEIChJWEdCRVZGX1FWX09XTkVEIHwgSVhHQkVWRl9RVl9TVEFURV9ESVNBQkxFRCkKKyNkZWZpbmUgSVhHQkVWRl9RVl9PV05FRAkoSVhHQkVWRl9RVl9TVEFURV9OQVBJIHwgSVhHQkVWRl9RVl9TVEFURV9QT0xMKQorI2RlZmluZSBJWEdCRVZGX1FWX0xPQ0tFRAkoSVhHQkVWRl9RVl9PV05FRCB8IElYR0JFVkZfUVZfU1RBVEVfRElTQUJMRUQpCiAjZGVmaW5lIElYR0JFVkZfUVZfU1RBVEVfTkFQSV9ZSUVMRAk4ICAgIC8qIE5BUEkgeWllbGRlZCB0aGlzIFFWICovCiAjZGVmaW5lIElYR0JFVkZfUVZfU1RBVEVfUE9MTF9ZSUVMRAkxNiAgIC8qIHBvbGwgeWllbGRlZCB0aGlzIFFWICovCi0jZGVmaW5lIElYR0JFVkZfUVZfWUlFTEQgKElYR0JFVkZfUVZfU1RBVEVfTkFQSV9ZSUVMRCB8IElYR0JFVkZfUVZfU1RBVEVfUE9MTF9ZSUVMRCkKLSNkZWZpbmUgSVhHQkVWRl9RVl9VU0VSX1BFTkQgKElYR0JFVkZfUVZfU1RBVEVfUE9MTCB8IElYR0JFVkZfUVZfU1RBVEVfUE9MTF9ZSUVMRCkKKyNkZWZpbmUgSVhHQkVWRl9RVl9ZSUVMRAkoSVhHQkVWRl9RVl9TVEFURV9OQVBJX1lJRUxEIHwgXAorCQkJCSBJWEdCRVZGX1FWX1NUQVRFX1BPTExfWUlFTEQpCisjZGVmaW5lIElYR0JFVkZfUVZfVVNFUl9QRU5ECShJWEdCRVZGX1FWX1NUQVRFX1BPTEwgfCBcCisJCQkJIElYR0JFVkZfUVZfU1RBVEVfUE9MTF9ZSUVMRCkKIAlzcGlubG9ja190IGxvY2s7CiAjZW5kaWYgLyogQ09ORklHX05FVF9SWF9CVVNZX1BPTEwgKi8KIH07CisKICNpZmRlZiBDT05GSUdfTkVUX1JYX0JVU1lfUE9MTAogc3RhdGljIGlubGluZSB2b2lkIGl4Z2JldmZfcXZfaW5pdF9sb2NrKHN0cnVjdCBpeGdiZXZmX3FfdmVjdG9yICpxX3ZlY3RvcikKIHsKLQogCXNwaW5fbG9ja19pbml0KCZxX3ZlY3Rvci0+bG9jayk7CiAJcV92ZWN0b3ItPnN0YXRlID0gSVhHQkVWRl9RVl9TVEFURV9JRExFOwogfQpAQCAtMjIwLDYgKzIyNiw3IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgaXhnYmV2Zl9xdl9sb2NrX25hcGkoc3RydWN0IGl4Z2JldmZfcV92ZWN0b3IgKnFfdmVjdG9yKQogewogCWludCByYyA9IHRydWU7CisKIAlzcGluX2xvY2tfYmgoJnFfdmVjdG9yLT5sb2NrKTsKIAlpZiAocV92ZWN0b3ItPnN0YXRlICYgSVhHQkVWRl9RVl9MT0NLRUQpIHsKIAkJV0FSTl9PTihxX3ZlY3Rvci0+c3RhdGUgJiBJWEdCRVZGX1FWX1NUQVRFX05BUEkpOwpAQCAtMjQwLDYgKzI0Nyw3IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgaXhnYmV2Zl9xdl91bmxvY2tfbmFwaShzdHJ1Y3QgaXhnYmV2Zl9xX3ZlY3RvciAqcV92ZWN0b3IpCiB7CiAJaW50IHJjID0gZmFsc2U7CisKIAlzcGluX2xvY2tfYmgoJnFfdmVjdG9yLT5sb2NrKTsKIAlXQVJOX09OKHFfdmVjdG9yLT5zdGF0ZSAmIChJWEdCRVZGX1FWX1NUQVRFX1BPTEwgfAogCQkJCSAgIElYR0JFVkZfUVZfU1RBVEVfTkFQSV9ZSUVMRCkpOwpAQCAtMjU2LDYgKzI2NCw3IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgaXhnYmV2Zl9xdl9sb2NrX3BvbGwoc3RydWN0IGl4Z2JldmZfcV92ZWN0b3IgKnFfdmVjdG9yKQogewogCWludCByYyA9IHRydWU7CisKIAlzcGluX2xvY2tfYmgoJnFfdmVjdG9yLT5sb2NrKTsKIAlpZiAoKHFfdmVjdG9yLT5zdGF0ZSAmIElYR0JFVkZfUVZfTE9DS0VEKSkgewogCQlxX3ZlY3Rvci0+c3RhdGUgfD0gSVhHQkVWRl9RVl9TVEFURV9QT0xMX1lJRUxEOwpAQCAtMjc1LDYgKzI4NCw3IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgaXhnYmV2Zl9xdl91bmxvY2tfcG9sbChzdHJ1Y3QgaXhnYmV2Zl9xX3ZlY3RvciAqcV92ZWN0b3IpCiB7CiAJaW50IHJjID0gZmFsc2U7CisKIAlzcGluX2xvY2tfYmgoJnFfdmVjdG9yLT5sb2NrKTsKIAlXQVJOX09OKHFfdmVjdG9yLT5zdGF0ZSAmIChJWEdCRVZGX1FWX1NUQVRFX05BUEkpKTsKIApAQCAtMjk3LDYgKzMwNyw3IEBACiBzdGF0aWMgaW5saW5lIGJvb2wgaXhnYmV2Zl9xdl9kaXNhYmxlKHN0cnVjdCBpeGdiZXZmX3FfdmVjdG9yICpxX3ZlY3RvcikKIHsKIAlpbnQgcmMgPSB0cnVlOworCiAJc3Bpbl9sb2NrX2JoKCZxX3ZlY3Rvci0+bG9jayk7CiAJaWYgKHFfdmVjdG9yLT5zdGF0ZSAmIElYR0JFVkZfUVZfT1dORUQpCiAJCXJjID0gZmFsc2U7CkBAIC0zMDcsOCArMzE4LDcgQEAKIAogI2VuZGlmIC8qIENPTkZJR19ORVRfUlhfQlVTWV9QT0xMICovCiAKLS8qCi0gKiBtaWNyb3NlY29uZCB2YWx1ZXMgZm9yIHZhcmlvdXMgSVRSIHJhdGVzIHNoaWZ0ZWQgYnkgMiB0byBmaXQgaXRyIHJlZ2lzdGVyCisvKiBtaWNyb3NlY29uZCB2YWx1ZXMgZm9yIHZhcmlvdXMgSVRSIHJhdGVzIHNoaWZ0ZWQgYnkgMiB0byBmaXQgaXRyIHJlZ2lzdGVyCiAgKiB3aXRoIHRoZSBmaXJzdCAzIGJpdHMgcmVzZXJ2ZWQgMAogICovCiAjZGVmaW5lIElYR0JFX01JTl9SU0NfSVRSCTI0CkBAIC0zNDUsMjIgKzM1NSwyMiBAQAogCXdyaXRlbCh2YWx1ZSwgcmluZy0+dGFpbCk7CiB9CiAKLSNkZWZpbmUgSVhHQkVWRl9SWF9ERVNDKFIsIGkpCSAgICBcCisjZGVmaW5lIElYR0JFVkZfUlhfREVTQyhSLCBpKQlcCiAJKCYoKCh1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqKSgoUiktPmRlc2MpKVtpXSkpCi0jZGVmaW5lIElYR0JFVkZfVFhfREVTQyhSLCBpKQkgICAgXAorI2RlZmluZSBJWEdCRVZGX1RYX0RFU0MoUiwgaSkJXAogCSgmKCgodW5pb24gaXhnYmVfYWR2X3R4X2Rlc2MgKikoKFIpLT5kZXNjKSlbaV0pKQotI2RlZmluZSBJWEdCRVZGX1RYX0NUWFRERVNDKFIsIGkpCSAgICBcCisjZGVmaW5lIElYR0JFVkZfVFhfQ1RYVERFU0MoUiwgaSkJXAogCSgmKCgoc3RydWN0IGl4Z2JlX2Fkdl90eF9jb250ZXh0X2Rlc2MgKikoKFIpLT5kZXNjKSlbaV0pKQogCiAjZGVmaW5lIElYR0JFX01BWF9KVU1CT19GUkFNRV9TSVpFCTk3MjggLyogTWF4aW11bSBTdXBwb3J0ZWQgU2l6ZSA5LjVLQiAqLwogCi0jZGVmaW5lIE9USEVSX1ZFQ1RPUiAxCi0jZGVmaW5lIE5PTl9RX1ZFQ1RPUlMgKE9USEVSX1ZFQ1RPUikKKyNkZWZpbmUgT1RIRVJfVkVDVE9SCTEKKyNkZWZpbmUgTk9OX1FfVkVDVE9SUwkoT1RIRVJfVkVDVE9SKQogCi0jZGVmaW5lIE1BWF9NU0lYX1FfVkVDVE9SUyAyCisjZGVmaW5lIE1BWF9NU0lYX1FfVkVDVE9SUwkyCiAKLSNkZWZpbmUgTUlOX01TSVhfUV9WRUNUT1JTIDEKLSNkZWZpbmUgTUlOX01TSVhfQ09VTlQgKE1JTl9NU0lYX1FfVkVDVE9SUyArIE5PTl9RX1ZFQ1RPUlMpCisjZGVmaW5lIE1JTl9NU0lYX1FfVkVDVE9SUwkxCisjZGVmaW5lIE1JTl9NU0lYX0NPVU5UCQkoTUlOX01TSVhfUV9WRUNUT1JTICsgTk9OX1FfVkVDVE9SUykKIAogLyogYm9hcmQgc3BlY2lmaWMgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSAqLwogc3RydWN0IGl4Z2JldmZfYWRhcHRlciB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmX21haW4uYwppbmRleCA0MTg2OTgxLi5hMTZkMjY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIEludGVsIDgyNTk5IFZpcnR1YWwgRnVuY3Rpb24gZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDE1IEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0xMyw4ICsxMyw3IEBACiAgIG1vcmUgZGV0YWlscy4KIAogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIAogICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgpAQCAtMjUsNyArMjQsNiBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBDb3B5cmlnaHQgKGMpMjAwNiAtIDIwMDcgTXlyaWNvbSwgSW5jLiBmb3Igc29tZSBMUk8gc3BlY2lmaWMgY29kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTcwLDEyICsxNjgsMTMgQEAKICAqIEBkaXJlY3Rpb246IDAgZm9yIFJ4LCAxIGZvciBUeCwgLTEgZm9yIG90aGVyIGNhdXNlcwogICogQHF1ZXVlOiBxdWV1ZSB0byBtYXAgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0IHRvCiAgKiBAbXNpeF92ZWN0b3I6IHRoZSB2ZWN0b3IgdG8gbWFwIHRvIHRoZSBjb3JyZXNwb25kaW5nIHF1ZXVlCi0gKi8KKyAqKi8KIHN0YXRpYyB2b2lkIGl4Z2JldmZfc2V0X2l2YXIoc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlciwgczggZGlyZWN0aW9uLAogCQkJICAgICB1OCBxdWV1ZSwgdTggbXNpeF92ZWN0b3IpCiB7CiAJdTMyIGl2YXIsIGluZGV4OwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisKIAlpZiAoZGlyZWN0aW9uID09IC0xKSB7CiAJCS8qIG90aGVyIGNhdXNlcyAqLwogCQltc2l4X3ZlY3RvciB8PSBJWEdCRV9JVkFSX0FMTE9DX1ZBTDsKQEAgLTE4NCw3ICsxODMsNyBAQAogCQlpdmFyIHw9IG1zaXhfdmVjdG9yOwogCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZUSVZBUl9NSVNDLCBpdmFyKTsKIAl9IGVsc2UgewotCQkvKiB0eCBvciByeCBjYXVzZXMgKi8KKwkJLyogVHggb3IgUnggY2F1c2VzICovCiAJCW1zaXhfdmVjdG9yIHw9IElYR0JFX0lWQVJfQUxMT0NfVkFMOwogCQlpbmRleCA9ICgoMTYgKiAocXVldWUgJiAxKSkgKyAoOCAqIGRpcmVjdGlvbikpOwogCQlpdmFyID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX1ZUSVZBUihxdWV1ZSA+PiAxKSk7CkBAIC00NTgsMTEgKzQ1NywxMiBAQAogCW5hcGlfZ3JvX3JlY2VpdmUoJnFfdmVjdG9yLT5uYXBpLCBza2IpOwogfQogCi0vKiBpeGdiZXZmX3J4X2NoZWNrc3VtIC0gaW5kaWNhdGUgaW4gc2tiIGlmIGh3IGluZGljYXRlZCBhIGdvb2QgY2tzdW0KKy8qKgorICogaXhnYmV2Zl9yeF9jaGVja3N1bSAtIGluZGljYXRlIGluIHNrYiBpZiBodyBpbmRpY2F0ZWQgYSBnb29kIGNrc3VtCiAgKiBAcmluZzogc3RydWN0dXJlIGNvbnRhaW5pZyByaW5nIHNwZWNpZmljIGRhdGEKICAqIEByeF9kZXNjOiBjdXJyZW50IFJ4IGRlc2NyaXB0b3IgYmVpbmcgcHJvY2Vzc2VkCiAgKiBAc2tiOiBza2IgY3VycmVudGx5IGJlaW5nIHJlY2VpdmVkIGFuZCBtb2RpZmllZAotICovCisgKiovCiBzdGF0aWMgaW5saW5lIHZvaWQgaXhnYmV2Zl9yeF9jaGVja3N1bShzdHJ1Y3QgaXhnYmV2Zl9yaW5nICpyaW5nLAogCQkJCSAgICAgICB1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqcnhfZGVzYywKIAkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTQ5Miw3ICs0OTIsOCBAQAogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiB9CiAKLS8qIGl4Z2JldmZfcHJvY2Vzc19za2JfZmllbGRzIC0gUG9wdWxhdGUgc2tiIGhlYWRlciBmaWVsZHMgZnJvbSBSeCBkZXNjcmlwdG9yCisvKioKKyAqIGl4Z2JldmZfcHJvY2Vzc19za2JfZmllbGRzIC0gUG9wdWxhdGUgc2tiIGhlYWRlciBmaWVsZHMgZnJvbSBSeCBkZXNjcmlwdG9yCiAgKiBAcnhfcmluZzogcnggZGVzY3JpcHRvciByaW5nIHBhY2tldCBpcyBiZWluZyB0cmFuc2FjdGVkIG9uCiAgKiBAcnhfZGVzYzogcG9pbnRlciB0byB0aGUgRU9QIFJ4IGRlc2NyaXB0b3IKICAqIEBza2I6IHBvaW50ZXIgdG8gY3VycmVudCBza2IgYmVpbmcgcG9wdWxhdGVkCkBAIC01MDAsNyArNTAxLDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSByaW5nLCBkZXNjcmlwdG9yLCBhbmQgcGFja2V0IGluZm9ybWF0aW9uIGluCiAgKiBvcmRlciB0byBwb3B1bGF0ZSB0aGUgY2hlY2tzdW0sIFZMQU4sIHByb3RvY29sLCBhbmQgb3RoZXIgZmllbGRzIHdpdGhpbgogICogdGhlIHNrYi4KLSAqLworICoqLwogc3RhdGljIHZvaWQgaXhnYmV2Zl9wcm9jZXNzX3NrYl9maWVsZHMoc3RydWN0IGl4Z2JldmZfcmluZyAqcnhfcmluZywKIAkJCQkgICAgICAgdW5pb24gaXhnYmVfYWR2X3J4X2Rlc2MgKnJ4X2Rlc2MsCiAJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCkBAIC02NDcsNyArNjQ4LDggQEAKIAl9CiB9CiAKLS8qIGl4Z2JldmZfcHVsbF90YWlsIC0gaXhnYmV2ZiBzcGVjaWZpYyB2ZXJzaW9uIG9mIHNrYl9wdWxsX3RhaWwKKy8qKgorICogaXhnYmV2Zl9wdWxsX3RhaWwgLSBpeGdiZXZmIHNwZWNpZmljIHZlcnNpb24gb2Ygc2tiX3B1bGxfdGFpbAogICogQHJ4X3Jpbmc6IHJ4IGRlc2NyaXB0b3IgcmluZyBwYWNrZXQgaXMgYmVpbmcgdHJhbnNhY3RlZCBvbgogICogQHNrYjogcG9pbnRlciB0byBjdXJyZW50IHNrYiBiZWluZyBhZGp1c3RlZAogICoKQEAgLTY1Nyw3ICs2NTksNyBAQAogICogdGhhdCBhbGxvdyBmb3Igc2lnbmlmaWNhbnQgb3B0aW1pemF0aW9ucyB2ZXJzdXMgdGhlIHN0YW5kYXJkIGZ1bmN0aW9uLgogICogQXMgYSByZXN1bHQgd2UgY2FuIGRvIHRoaW5ncyBsaWtlIGRyb3AgYSBmcmFnIGFuZCBtYWludGFpbiBhbiBhY2N1cmF0ZQogICogdHJ1ZXNpemUgZm9yIHRoZSBza2IuCi0gKi8KKyAqKi8KIHN0YXRpYyB2b2lkIGl4Z2JldmZfcHVsbF90YWlsKHN0cnVjdCBpeGdiZXZmX3JpbmcgKnJ4X3JpbmcsCiAJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNjg2LDcgKzY4OCw4IEBACiAJc2tiLT50YWlsICs9IHB1bGxfbGVuOwogfQogCi0vKiBpeGdiZXZmX2NsZWFudXBfaGVhZGVycyAtIENvcnJlY3QgY29ycnVwdGVkIG9yIGVtcHR5IGhlYWRlcnMKKy8qKgorICogaXhnYmV2Zl9jbGVhbnVwX2hlYWRlcnMgLSBDb3JyZWN0IGNvcnJ1cHRlZCBvciBlbXB0eSBoZWFkZXJzCiAgKiBAcnhfcmluZzogcnggZGVzY3JpcHRvciByaW5nIHBhY2tldCBpcyBiZWluZyB0cmFuc2FjdGVkIG9uCiAgKiBAcnhfZGVzYzogcG9pbnRlciB0byB0aGUgRU9QIFJ4IGRlc2NyaXB0b3IKICAqIEBza2I6IHBvaW50ZXIgdG8gY3VycmVudCBza2IgYmVpbmcgZml4ZWQKQEAgLTcwMiw3ICs3MDUsNyBAQAogICogaXQgaXMgbGFyZ2UgZW5vdWdoIHRvIHF1YWxpZnkgYXMgYSB2YWxpZCBFdGhlcm5ldCBmcmFtZS4KICAqCiAgKiBSZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igd2FzIGVuY291bnRlcmVkIGFuZCBza2Igd2FzIGZyZWVkLgotICovCisgKiovCiBzdGF0aWMgYm9vbCBpeGdiZXZmX2NsZWFudXBfaGVhZGVycyhzdHJ1Y3QgaXhnYmV2Zl9yaW5nICpyeF9yaW5nLAogCQkJCSAgICB1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqcnhfZGVzYywKIAkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTcyOSwxMiArNzMyLDEzIEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0vKiBpeGdiZXZmX3JldXNlX3J4X3BhZ2UgLSBwYWdlIGZsaXAgYnVmZmVyIGFuZCBzdG9yZSBpdCBiYWNrIG9uIHRoZSByaW5nCisvKioKKyAqIGl4Z2JldmZfcmV1c2VfcnhfcGFnZSAtIHBhZ2UgZmxpcCBidWZmZXIgYW5kIHN0b3JlIGl0IGJhY2sgb24gdGhlIHJpbmcKICAqIEByeF9yaW5nOiByeCBkZXNjcmlwdG9yIHJpbmcgdG8gc3RvcmUgYnVmZmVycyBvbgogICogQG9sZF9idWZmOiBkb25vciBidWZmZXIgdG8gaGF2ZSBwYWdlIHJldXNlZAogICoKICAqIFN5bmNocm9uaXplcyBwYWdlIGZvciByZXVzZSBieSB0aGUgYWRhcHRlcgotICovCisgKiovCiBzdGF0aWMgdm9pZCBpeGdiZXZmX3JldXNlX3J4X3BhZ2Uoc3RydWN0IGl4Z2JldmZfcmluZyAqcnhfcmluZywKIAkJCQkgIHN0cnVjdCBpeGdiZXZmX3J4X2J1ZmZlciAqb2xkX2J1ZmYpCiB7CkBAIC03NjQsNyArNzY4LDggQEAKIAlyZXR1cm4gKHBhZ2VfdG9fbmlkKHBhZ2UpICE9IG51bWFfbWVtX2lkKCkpIHx8IHBhZ2UtPnBmbWVtYWxsb2M7CiB9CiAKLS8qIGl4Z2JldmZfYWRkX3J4X2ZyYWcgLSBBZGQgY29udGVudHMgb2YgUnggYnVmZmVyIHRvIHNrX2J1ZmYKKy8qKgorICogaXhnYmV2Zl9hZGRfcnhfZnJhZyAtIEFkZCBjb250ZW50cyBvZiBSeCBidWZmZXIgdG8gc2tfYnVmZgogICogQHJ4X3Jpbmc6IHJ4IGRlc2NyaXB0b3IgcmluZyB0byB0cmFuc2FjdCBwYWNrZXRzIG9uCiAgKiBAcnhfYnVmZmVyOiBidWZmZXIgY29udGFpbmluZyBwYWdlIHRvIGFkZAogICogQHJ4X2Rlc2M6IGRlc2NyaXB0b3IgY29udGFpbmluZyBsZW5ndGggb2YgYnVmZmVyIHdyaXR0ZW4gYnkgaGFyZHdhcmUKQEAgLTc3Nyw3ICs3ODIsNyBAQAogICoKICAqIFRoZSBmdW5jdGlvbiB3aWxsIHRoZW4gdXBkYXRlIHRoZSBwYWdlIG9mZnNldCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybgogICogdHJ1ZSBpZiB0aGUgYnVmZmVyIGNhbiBiZSByZXVzZWQgYnkgdGhlIGFkYXB0ZXIuCi0gKi8KKyAqKi8KIHN0YXRpYyBib29sIGl4Z2JldmZfYWRkX3J4X2ZyYWcoc3RydWN0IGl4Z2JldmZfcmluZyAqcnhfcmluZywKIAkJCQlzdHJ1Y3QgaXhnYmV2Zl9yeF9idWZmZXIgKnJ4X2J1ZmZlciwKIAkJCQl1bmlvbiBpeGdiZV9hZHZfcnhfZGVzYyAqcnhfZGVzYywKQEAgLTk1OCw3ICs5NjMsNyBAQAogCQkgKiBzb3VyY2UgcHJ1bmluZy4KIAkJICovCiAJCWlmICgoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfQlJPQURDQVNUIHx8Ci0JCSAgICBza2ItPnBrdF90eXBlID09IFBBQ0tFVF9NVUxUSUNBU1QpICYmCisJCSAgICAgc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTVVMVElDQVNUKSAmJgogCQkgICAgZXRoZXJfYWRkcl9lcXVhbChyeF9yaW5nLT5uZXRkZXYtPmRldl9hZGRyLAogCQkJCSAgICAgZXRoX2hkcihza2IpLT5oX3NvdXJjZSkpIHsKIAkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CkBAIC0xMDE2LDcgKzEwMjEsOCBAQAogI2VuZGlmCiAKIAkvKiBhdHRlbXB0IHRvIGRpc3RyaWJ1dGUgYnVkZ2V0IHRvIGVhY2ggcXVldWUgZmFpcmx5LCBidXQgZG9uJ3QgYWxsb3cKLQkgKiB0aGUgYnVkZ2V0IHRvIGdvIGJlbG93IDEgYmVjYXVzZSB3ZSdsbCBleGl0IHBvbGxpbmcgKi8KKwkgKiB0aGUgYnVkZ2V0IHRvIGdvIGJlbG93IDEgYmVjYXVzZSB3ZSdsbCBleGl0IHBvbGxpbmcKKwkgKi8KIAlpZiAocV92ZWN0b3ItPnJ4LmNvdW50ID4gMSkKIAkJcGVyX3JpbmdfYnVkZ2V0ID0gbWF4KGJ1ZGdldC9xX3ZlY3Rvci0+cnguY291bnQsIDEpOwogCWVsc2UKQEAgLTEwNDksNyArMTA1NSw3IEBACiAvKioKICAqIGl4Z2JldmZfd3JpdGVfZWl0ciAtIHdyaXRlIFZURUlUUiByZWdpc3RlciBpbiBoYXJkd2FyZSBzcGVjaWZpYyB3YXkKICAqIEBxX3ZlY3Rvcjogc3RydWN0dXJlIGNvbnRhaW5pbmcgaW50ZXJydXB0IGFuZCByaW5nIGluZm9ybWF0aW9uCi0gKi8KKyAqKi8KIHZvaWQgaXhnYmV2Zl93cml0ZV9laXRyKHN0cnVjdCBpeGdiZXZmX3FfdmVjdG9yICpxX3ZlY3RvcikKIHsKIAlzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyID0gcV92ZWN0b3ItPmFkYXB0ZXI7CkBAIC0xMDU3LDggKzEwNjMsNyBAQAogCWludCB2X2lkeCA9IHFfdmVjdG9yLT52X2lkeDsKIAl1MzIgaXRyX3JlZyA9IHFfdmVjdG9yLT5pdHIgJiBJWEdCRV9NQVhfRUlUUjsKIAotCS8qCi0JICogc2V0IHRoZSBXRElTIGJpdCB0byBub3QgY2xlYXIgdGhlIHRpbWVyIGJpdHMgYW5kIGNhdXNlIGFuCisJLyogc2V0IHRoZSBXRElTIGJpdCB0byBub3QgY2xlYXIgdGhlIHRpbWVyIGJpdHMgYW5kIGNhdXNlIGFuCiAJICogaW1tZWRpYXRlIGFzc2VydGlvbiBvZiB0aGUgaW50ZXJydXB0CiAJICovCiAJaXRyX3JlZyB8PSBJWEdCRV9FSVRSX0NOVF9XRElTOwpAQCAtMTExNSwxMiArMTEyMCwxMiBAQAogCXFfdmVjdG9ycyA9IGFkYXB0ZXItPm51bV9tc2l4X3ZlY3RvcnMgLSBOT05fUV9WRUNUT1JTOwogCWFkYXB0ZXItPmVpbXNfZW5hYmxlX21hc2sgPSAwOwogCi0JLyoKLQkgKiBQb3B1bGF0ZSB0aGUgSVZBUiB0YWJsZSBhbmQgc2V0IHRoZSBJVFIgdmFsdWVzIHRvIHRoZQorCS8qIFBvcHVsYXRlIHRoZSBJVkFSIHRhYmxlIGFuZCBzZXQgdGhlIElUUiB2YWx1ZXMgdG8gdGhlCiAJICogY29ycmVzcG9uZGluZyByZWdpc3Rlci4KIAkgKi8KIAlmb3IgKHZfaWR4ID0gMDsgdl9pZHggPCBxX3ZlY3RvcnM7IHZfaWR4KyspIHsKIAkJc3RydWN0IGl4Z2JldmZfcmluZyAqcmluZzsKKwogCQlxX3ZlY3RvciA9IGFkYXB0ZXItPnFfdmVjdG9yW3ZfaWR4XTsKIAogCQlpeGdiZXZmX2Zvcl9lYWNoX3JpbmcocmluZywgcV92ZWN0b3ItPnJ4KQpAQCAtMTEzMCwxMyArMTEzNSwxMyBAQAogCQkJaXhnYmV2Zl9zZXRfaXZhcihhZGFwdGVyLCAxLCByaW5nLT5yZWdfaWR4LCB2X2lkeCk7CiAKIAkJaWYgKHFfdmVjdG9yLT50eC5yaW5nICYmICFxX3ZlY3Rvci0+cngucmluZykgewotCQkJLyogdHggb25seSB2ZWN0b3IgKi8KKwkJCS8qIFR4IG9ubHkgdmVjdG9yICovCiAJCQlpZiAoYWRhcHRlci0+dHhfaXRyX3NldHRpbmcgPT0gMSkKIAkJCQlxX3ZlY3Rvci0+aXRyID0gSVhHQkVfMTBLX0lUUjsKIAkJCWVsc2UKIAkJCQlxX3ZlY3Rvci0+aXRyID0gYWRhcHRlci0+dHhfaXRyX3NldHRpbmc7CiAJCX0gZWxzZSB7Ci0JCQkvKiByeCBvciByeC90eCB2ZWN0b3IgKi8KKwkJCS8qIFJ4IG9yIFJ4L1R4IHZlY3RvciAqLwogCQkJaWYgKGFkYXB0ZXItPnJ4X2l0cl9zZXR0aW5nID09IDEpCiAJCQkJcV92ZWN0b3ItPml0ciA9IElYR0JFXzIwS19JVFI7CiAJCQllbHNlCkBAIC0xMTY3LDEzICsxMTcyLDEzIEBACiAgKiBAcV92ZWN0b3I6IHN0cnVjdHVyZSBjb250YWluaW5nIGludGVycnVwdCBhbmQgcmluZyBpbmZvcm1hdGlvbgogICogQHJpbmdfY29udGFpbmVyOiBzdHJ1Y3R1cmUgY29udGFpbmluZyByaW5nIHBlcmZvcm1hbmNlIGRhdGEKICAqCi0gKiAgICAgIFN0b3JlcyBhIG5ldyBJVFIgdmFsdWUgYmFzZWQgb24gcGFja2V0cyBhbmQgYnl0ZQotICogICAgICBjb3VudHMgZHVyaW5nIHRoZSBsYXN0IGludGVycnVwdC4gIFRoZSBhZHZhbnRhZ2Ugb2YgcGVyIGludGVycnVwdAotICogICAgICBjb21wdXRhdGlvbiBpcyBmYXN0ZXIgdXBkYXRlcyBhbmQgbW9yZSBhY2N1cmF0ZSBJVFIgZm9yIHRoZSBjdXJyZW50Ci0gKiAgICAgIHRyYWZmaWMgcGF0dGVybi4gIENvbnN0YW50cyBpbiB0aGlzIGZ1bmN0aW9uIHdlcmUgY29tcHV0ZWQKLSAqICAgICAgYmFzZWQgb24gdGhlb3JldGljYWwgbWF4aW11bSB3aXJlIHNwZWVkIGFuZCB0aHJlc2hvbGRzIHdlcmUgc2V0IGJhc2VkCi0gKiAgICAgIG9uIHRlc3RpbmcgZGF0YSBhcyB3ZWxsIGFzIGF0dGVtcHRpbmcgdG8gbWluaW1pemUgcmVzcG9uc2UgdGltZQotICogICAgICB3aGlsZSBpbmNyZWFzaW5nIGJ1bGsgdGhyb3VnaHB1dC4KKyAqIFN0b3JlcyBhIG5ldyBJVFIgdmFsdWUgYmFzZWQgb24gcGFja2V0cyBhbmQgYnl0ZQorICogY291bnRzIGR1cmluZyB0aGUgbGFzdCBpbnRlcnJ1cHQuICBUaGUgYWR2YW50YWdlIG9mIHBlciBpbnRlcnJ1cHQKKyAqIGNvbXB1dGF0aW9uIGlzIGZhc3RlciB1cGRhdGVzIGFuZCBtb3JlIGFjY3VyYXRlIElUUiBmb3IgdGhlIGN1cnJlbnQKKyAqIHRyYWZmaWMgcGF0dGVybi4gIENvbnN0YW50cyBpbiB0aGlzIGZ1bmN0aW9uIHdlcmUgY29tcHV0ZWQKKyAqIGJhc2VkIG9uIHRoZW9yZXRpY2FsIG1heGltdW0gd2lyZSBzcGVlZCBhbmQgdGhyZXNob2xkcyB3ZXJlIHNldCBiYXNlZAorICogb24gdGVzdGluZyBkYXRhIGFzIHdlbGwgYXMgYXR0ZW1wdGluZyB0byBtaW5pbWl6ZSByZXNwb25zZSB0aW1lCisgKiB3aGlsZSBpbmNyZWFzaW5nIGJ1bGsgdGhyb3VnaHB1dC4KICAqKi8KIHN0YXRpYyB2b2lkIGl4Z2JldmZfdXBkYXRlX2l0cihzdHJ1Y3QgaXhnYmV2Zl9xX3ZlY3RvciAqcV92ZWN0b3IsCiAJCQkgICAgICAgc3RydWN0IGl4Z2JldmZfcmluZ19jb250YWluZXIgKnJpbmdfY29udGFpbmVyKQpAQCAtMTE4Nyw3ICsxMTkyLDcgQEAKIAlpZiAocGFja2V0cyA9PSAwKQogCQlyZXR1cm47CiAKLQkvKiBzaW1wbGUgdGhyb3R0bGVyYXRlIG1hbmFnZW1lbnQKKwkvKiBzaW1wbGUgdGhyb3R0bGUgcmF0ZSBtYW5hZ2VtZW50CiAJICogICAgMC0yME1CL3MgbG93ZXN0ICgxMDAwMDAgaW50cy9zKQogCSAqICAgMjAtMTAwTUIvcyBsb3cgICAoMjAwMDAgaW50cy9zKQogCSAqICAxMDAtMTI0OU1CL3MgYnVsayAoODAwMCBpbnRzL3MpCkBAIC0xMzMwLDggKzEzMzUsNyBAQAogCiAJcV92ZWN0b3JzID0gYWRhcHRlci0+bnVtX21zaXhfdmVjdG9ycyAtIE5PTl9RX1ZFQ1RPUlM7CiAKLQkvKgotCSAqIFRoZSBpZGVhbCBjb25maWd1cmF0aW9uLi4uCisJLyogVGhlIGlkZWFsIGNvbmZpZ3VyYXRpb24uLi4KIAkgKiBXZSBoYXZlIGVub3VnaCB2ZWN0b3JzIHRvIG1hcCBvbmUgcGVyIHF1ZXVlLgogCSAqLwogCWlmIChxX3ZlY3RvcnMgPT0gYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyArIGFkYXB0ZXItPm51bV90eF9xdWV1ZXMpIHsKQEAgLTEzNDMsOCArMTM0Nyw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCS8qCi0JICogSWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggdmVjdG9ycyBmb3IgYSAxLXRvLTEKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIGVub3VnaCB2ZWN0b3JzIGZvciBhIDEtdG8tMQogCSAqIG1hcHBpbmcsIHdlJ2xsIGhhdmUgdG8gZ3JvdXAgdGhlbSBzbyB0aGVyZSBhcmUKIAkgKiBtdWx0aXBsZSBxdWV1ZXMgcGVyIHZlY3Rvci4KIAkgKi8KQEAgLTE0MDYsOCArMTQwOSw4IEBACiAJCQkJICBxX3ZlY3Rvci0+bmFtZSwgcV92ZWN0b3IpOwogCQlpZiAoZXJyKSB7CiAJCQlod19kYmcoJmFkYXB0ZXItPmh3LAotCQkJICAgICAgICJyZXF1ZXN0X2lycSBmYWlsZWQgZm9yIE1TSVggaW50ZXJydXB0ICIKLQkJCSAgICAgICAiRXJyb3I6ICVkXG4iLCBlcnIpOworCQkJICAgICAgICJyZXF1ZXN0X2lycSBmYWlsZWQgZm9yIE1TSVggaW50ZXJydXB0IEVycm9yOiAlZFxuIiwKKwkJCSAgICAgICBlcnIpOwogCQkJZ290byBmcmVlX3F1ZXVlX2lycXM7CiAJCX0KIAl9CkBAIC0xNDE1LDggKzE0MTgsOCBAQAogCWVyciA9IHJlcXVlc3RfaXJxKGFkYXB0ZXItPm1zaXhfZW50cmllc1t2ZWN0b3JdLnZlY3RvciwKIAkJCSAgJml4Z2JldmZfbXNpeF9vdGhlciwgMCwgbmV0ZGV2LT5uYW1lLCBhZGFwdGVyKTsKIAlpZiAoZXJyKSB7Ci0JCWh3X2RiZygmYWRhcHRlci0+aHcsCi0JCSAgICAgICAicmVxdWVzdF9pcnEgZm9yIG1zaXhfb3RoZXIgZmFpbGVkOiAlZFxuIiwgZXJyKTsKKwkJaHdfZGJnKCZhZGFwdGVyLT5odywgInJlcXVlc3RfaXJxIGZvciBtc2l4X290aGVyIGZhaWxlZDogJWRcbiIsCisJCSAgICAgICBlcnIpOwogCQlnb3RvIGZyZWVfcXVldWVfaXJxczsKIAl9CiAKQEAgLTE0NDgsNiArMTQ1MSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgcV92ZWN0b3JzOyBpKyspIHsKIAkJc3RydWN0IGl4Z2JldmZfcV92ZWN0b3IgKnFfdmVjdG9yID0gYWRhcHRlci0+cV92ZWN0b3JbaV07CisKIAkJcV92ZWN0b3ItPnJ4LnJpbmcgPSBOVUxMOwogCQlxX3ZlY3Rvci0+dHgucmluZyA9IE5VTEw7CiAJCXFfdmVjdG9yLT5yeC5jb3VudCA9IDA7CkBAIC0xNDY5LDggKzE0NzMsNyBAQAogCWVyciA9IGl4Z2JldmZfcmVxdWVzdF9tc2l4X2lycXMoYWRhcHRlcik7CiAKIAlpZiAoZXJyKQotCQlod19kYmcoJmFkYXB0ZXItPmh3LAotCQkgICAgICAgInJlcXVlc3RfaXJxIGZhaWxlZCwgRXJyb3IgJWRcbiIsIGVycik7CisJCWh3X2RiZygmYWRhcHRlci0+aHcsICJyZXF1ZXN0X2lycSBmYWlsZWQsIEVycm9yICVkXG4iLCBlcnIpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE2NTksNyArMTY2Miw3IEBACiAJLyogd3JpdGUgdmFsdWUgYmFjayB3aXRoIFJYRENUTC5FTkFCTEUgYml0IGNsZWFyZWQgKi8KIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZGUlhEQ1RMKHJlZ19pZHgpLCByeGRjdGwpOwogCi0JLyogdGhlIGhhcmR3YXJlIG1heSB0YWtlIHVwIHRvIDEwMHVzIHRvIHJlYWxseSBkaXNhYmxlIHRoZSByeCBxdWV1ZSAqLworCS8qIHRoZSBoYXJkd2FyZSBtYXkgdGFrZSB1cCB0byAxMDB1cyB0byByZWFsbHkgZGlzYWJsZSB0aGUgUnggcXVldWUgKi8KIAlkbyB7CiAJCXVkZWxheSgxMCk7CiAJCXJ4ZGN0bCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9WRlJYRENUTChyZWdfaWR4KSk7CkBAIC0xNzg2LDcgKzE3ODksOCBAQAogCWl4Z2JldmZfcmxwbWxfc2V0X3ZmKGh3LCBuZXRkZXYtPm10dSArIEVUSF9ITEVOICsgRVRIX0ZDU19MRU4pOwogCiAJLyogU2V0dXAgdGhlIEhXIFJ4IEhlYWQgYW5kIFRhaWwgRGVzY3JpcHRvciBQb2ludGVycyBhbmQKLQkgKiB0aGUgQmFzZSBhbmQgTGVuZ3RoIG9mIHRoZSBSeCBEZXNjcmlwdG9yIFJpbmcgKi8KKwkgKiB0aGUgQmFzZSBhbmQgTGVuZ3RoIG9mIHRoZSBSeCBEZXNjcmlwdG9yIFJpbmcKKwkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgaSsrKQogCQlpeGdiZXZmX2NvbmZpZ3VyZV9yeF9yaW5nKGFkYXB0ZXIsIGFkYXB0ZXItPnJ4X3JpbmdbaV0pOwogfQpAQCAtMTg1OCwxNCArMTg2MiwxNCBAQAogCiAJaWYgKCFuZXRkZXZfdWNfZW1wdHkobmV0ZGV2KSkgewogCQlzdHJ1Y3QgbmV0ZGV2X2h3X2FkZHIgKmhhOworCiAJCW5ldGRldl9mb3JfZWFjaF91Y19hZGRyKGhhLCBuZXRkZXYpIHsKIAkJCWh3LT5tYWMub3BzLnNldF91Y19hZGRyKGh3LCArK2NvdW50LCBoYS0+YWRkcik7CiAJCQl1ZGVsYXkoMjAwKTsKIAkJfQogCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBsaXN0IGlzIGVtcHR5IHRoZW4gc2VuZCBtZXNzYWdlIHRvIFBGIGRyaXZlciB0bwotCQkgKiBjbGVhciBhbGwgbWFjdmxhbnMgb24gdGhpcyBWRi4KKwkJLyogSWYgdGhlIGxpc3QgaXMgZW1wdHkgdGhlbiBzZW5kIG1lc3NhZ2UgdG8gUEYgZHJpdmVyIHRvCisJCSAqIGNsZWFyIGFsbCBNQUMgVkxBTnMgb24gdGhpcyBWRi4KIAkJICovCiAJCWh3LT5tYWMub3BzLnNldF91Y19hZGRyKGh3LCAwLCBOVUxMKTsKIAl9CkBAIC0yMDI2LDcgKzIwMzAsOCBAQAogc3RhdGljIHZvaWQgaXhnYmV2Zl9uZWdvdGlhdGVfYXBpKHN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKLQlpbnQgYXBpW10gPSB7IGl4Z2JlX21ib3hfYXBpXzExLAorCWludCBhcGlbXSA9IHsgaXhnYmVfbWJveF9hcGlfMTIsCisJCSAgICAgIGl4Z2JlX21ib3hfYXBpXzExLAogCQkgICAgICBpeGdiZV9tYm94X2FwaV8xMCwKIAkJICAgICAgaXhnYmVfbWJveF9hcGlfdW5rbm93biB9OwogCWludCBlcnIgPSAwLCBpZHggPSAwOwpAQCAtMjE4NCw3ICsyMTg5LDcgQEAKIAlpZiAodGVzdF9hbmRfc2V0X2JpdChfX0lYR0JFVkZfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJcmV0dXJuOyAvKiBkbyBub3RoaW5nIGlmIGFscmVhZHkgZG93biAqLwogCi0JLyogZGlzYWJsZSBhbGwgZW5hYmxlZCByeCBxdWV1ZXMgKi8KKwkvKiBkaXNhYmxlIGFsbCBlbmFibGVkIFJ4IHF1ZXVlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBpKyspCiAJCWl4Z2JldmZfZGlzYWJsZV9yeF9xdWV1ZShhZGFwdGVyLCBhZGFwdGVyLT5yeF9yaW5nW2ldKTsKIApAQCAtMjMyOCw2ICsyMzMzLDcgQEAKIAogCQlzd2l0Y2ggKGh3LT5hcGlfdmVyc2lvbikgewogCQljYXNlIGl4Z2JlX21ib3hfYXBpXzExOgorCQljYXNlIGl4Z2JlX21ib3hfYXBpXzEyOgogCQkJYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyA9IHJzczsKIAkJCWFkYXB0ZXItPm51bV90eF9xdWV1ZXMgPSByc3M7CiAJCWRlZmF1bHQ6CkBAIC0yNDA2LDggKzI0MTIsNyBAQAogCWludCBlcnIgPSAwOwogCWludCB2ZWN0b3IsIHZfYnVkZ2V0OwogCi0JLyoKLQkgKiBJdCdzIGVhc3kgdG8gYmUgZ3JlZWR5IGZvciBNU0ktWCB2ZWN0b3JzLCBidXQgaXQgcmVhbGx5CisJLyogSXQncyBlYXN5IHRvIGJlIGdyZWVkeSBmb3IgTVNJLVggdmVjdG9ycywgYnV0IGl0IHJlYWxseQogCSAqIGRvZXNuJ3QgZG8gdXMgbXVjaCBnb29kIGlmIHdlIGhhdmUgYSBsb3QgbW9yZSB2ZWN0b3JzCiAJICogdGhhbiBDUFUncy4gIFNvIGxldCdzIGJlIGNvbnNlcnZhdGl2ZSBhbmQgb25seSBhc2sgZm9yCiAJICogKHJvdWdobHkpIHRoZSBzYW1lIG51bWJlciBvZiB2ZWN0b3JzIGFzIHRoZXJlIGFyZSBDUFUncy4KQEAgLTI0MTgsNyArMjQyMyw4IEBACiAJdl9idWRnZXQgKz0gTk9OX1FfVkVDVE9SUzsKIAogCS8qIEEgZmFpbHVyZSBpbiBNU0ktWCBlbnRyeSBhbGxvY2F0aW9uIGlzbid0IGZhdGFsLCBidXQgaXQgZG9lcwotCSAqIG1lYW4gd2UgZGlzYWJsZSBNU0ktWCBjYXBhYmlsaXRpZXMgb2YgdGhlIGFkYXB0ZXIuICovCisJICogbWVhbiB3ZSBkaXNhYmxlIE1TSS1YIGNhcGFiaWxpdGllcyBvZiB0aGUgYWRhcHRlci4KKwkgKi8KIAlhZGFwdGVyLT5tc2l4X2VudHJpZXMgPSBrY2FsbG9jKHZfYnVkZ2V0LAogCQkJCQlzaXplb2Yoc3RydWN0IG1zaXhfZW50cnkpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXB0ZXItPm1zaXhfZW50cmllcykgewpAQCAtMjU0NCw4ICsyNTUwLDcgQEAKIAogCWVyciA9IGl4Z2JldmZfYWxsb2NfcV92ZWN0b3JzKGFkYXB0ZXIpOwogCWlmIChlcnIpIHsKLQkJaHdfZGJnKCZhZGFwdGVyLT5odywgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHF1ZXVlICIKLQkJICAgICAgICJ2ZWN0b3JzXG4iKTsKKwkJaHdfZGJnKCZhZGFwdGVyLT5odywgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHF1ZXVlIHZlY3RvcnNcbiIpOwogCQlnb3RvIGVycl9hbGxvY19xX3ZlY3RvcnM7CiAJfQogCkBAIC0yNTU1LDggKzI1NjAsNyBAQAogCQlnb3RvIGVycl9hbGxvY19xdWV1ZXM7CiAJfQogCi0JaHdfZGJnKCZhZGFwdGVyLT5odywgIk11bHRpcXVldWUgJXM6IFJ4IFF1ZXVlIGNvdW50ID0gJXUsICIKLQkgICAgICAgIlR4IFF1ZXVlIGNvdW50ID0gJXVcbiIsCisJaHdfZGJnKCZhZGFwdGVyLT5odywgIk11bHRpcXVldWUgJXM6IFJ4IFF1ZXVlIGNvdW50ID0gJXUsIFR4IFF1ZXVlIGNvdW50ID0gJXVcbiIsCiAJICAgICAgIChhZGFwdGVyLT5udW1fcnhfcXVldWVzID4gMSkgPyAiRW5hYmxlZCIgOgogCSAgICAgICAiRGlzYWJsZWQiLCBhZGFwdGVyLT5udW1fcnhfcXVldWVzLCBhZGFwdGVyLT5udW1fdHhfcXVldWVzKTsKIApAQCAtMjYwMCw3ICsyNjA0LDYgQEAKIAogLyoqCiAgKiBpeGdiZXZmX3N3X2luaXQgLSBJbml0aWFsaXplIGdlbmVyYWwgc29mdHdhcmUgc3RydWN0dXJlcwotICogKHN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIpCiAgKiBAYWRhcHRlcjogYm9hcmQgcHJpdmF0ZSBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZQogICoKICAqIGl4Z2JldmZfc3dfaW5pdCBpbml0aWFsaXplcyB0aGUgQWRhcHRlciBwcml2YXRlIGRhdGEgc3RydWN0dXJlLgpAQCAtMjYxNSw3ICsyNjE4LDYgQEAKIAlpbnQgZXJyOwogCiAJLyogUENJIGNvbmZpZyBzcGFjZSBpbmZvICovCi0KIAlody0+dmVuZG9yX2lkID0gcGRldi0+dmVuZG9yOwogCWh3LT5kZXZpY2VfaWQgPSBwZGV2LT5kZXZpY2U7CiAJaHctPnJldmlzaW9uX2lkID0gcGRldi0+cmV2aXNpb247CkBAIC0yNjg2LDggKzI2ODgsOCBAQAogCXsJCQkJCQkJCSBcCiAJCXU2NCBjdXJyZW50X2NvdW50ZXJfbHNiID0gSVhHQkVfUkVBRF9SRUcoaHcsIHJlZ19sc2IpOwkgXAogCQl1NjQgY3VycmVudF9jb3VudGVyX21zYiA9IElYR0JFX1JFQURfUkVHKGh3LCByZWdfbXNiKTsJIFwKLQkJdTY0IGN1cnJlbnRfY291bnRlciA9IChjdXJyZW50X2NvdW50ZXJfbXNiIDw8IDMyKSB8ICAgICAgXAotCQkJY3VycmVudF9jb3VudGVyX2xzYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJdTY0IGN1cnJlbnRfY291bnRlciA9IChjdXJyZW50X2NvdW50ZXJfbXNiIDw8IDMyKSB8CSBcCisJCQljdXJyZW50X2NvdW50ZXJfbHNiOwkJCQkgXAogCQlpZiAoY3VycmVudF9jb3VudGVyIDwgbGFzdF9jb3VudGVyKQkJCSBcCiAJCQljb3VudGVyICs9IDB4MTAwMDAwMDAwMExMOwkJCSBcCiAJCWxhc3RfY291bnRlciA9IGN1cnJlbnRfY291bnRlcjsJCQkJIFwKQEAgLTI3NTgsMTQgKzI3NjAsMTUgQEAKIAlpeGdiZXZmX3JlaW5pdF9sb2NrZWQoYWRhcHRlcik7CiB9CiAKLS8qIGl4Z2JldmZfY2hlY2tfaGFuZ19zdWJ0YXNrIC0gY2hlY2sgZm9yIGh1bmcgcXVldWVzIGFuZCBkcm9wcGVkIGludGVycnVwdHMKLSAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlIGFkYXB0ZXIgc3RydWN0dXJlCisvKioKKyAqIGl4Z2JldmZfY2hlY2tfaGFuZ19zdWJ0YXNrIC0gY2hlY2sgZm9yIGh1bmcgcXVldWVzIGFuZCBkcm9wcGVkIGludGVycnVwdHMKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgYWRhcHRlciBzdHJ1Y3R1cmUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHNlcnZlcyB0d28gcHVycG9zZXMuICBGaXJzdCBpdCBzdHJvYmVzIHRoZSBpbnRlcnJ1cHQgbGluZXMKICAqIGluIG9yZGVyIHRvIG1ha2UgY2VydGFpbiBpbnRlcnJ1cHRzIGFyZSBvY2N1cnJpbmcuICBTZWNvbmRseSBpdCBzZXRzIHRoZQogICogYml0cyBuZWVkZWQgdG8gY2hlY2sgZm9yIFRYIGhhbmdzLiAgQXMgYSByZXN1bHQgd2Ugc2hvdWxkIGltbWVkaWF0ZWx5CiAgKiBkZXRlcm1pbmUgaWYgYSBoYW5nIGhhcyBvY2N1cnJlZC4KLSAqLworICoqLwogc3RhdGljIHZvaWQgaXhnYmV2Zl9jaGVja19oYW5nX3N1YnRhc2soc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtMjc4Myw3ICsyNzg2LDcgQEAKIAkJCXNldF9jaGVja19mb3JfdHhfaGFuZyhhZGFwdGVyLT50eF9yaW5nW2ldKTsKIAl9CiAKLQkvKiBnZXQgb25lIGJpdCBmb3IgZXZlcnkgYWN0aXZlIHR4L3J4IGludGVycnVwdCB2ZWN0b3IgKi8KKwkvKiBnZXQgb25lIGJpdCBmb3IgZXZlcnkgYWN0aXZlIFR4L1J4IGludGVycnVwdCB2ZWN0b3IgKi8KIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+bnVtX21zaXhfdmVjdG9ycyAtIE5PTl9RX1ZFQ1RPUlM7IGkrKykgewogCQlzdHJ1Y3QgaXhnYmV2Zl9xX3ZlY3RvciAqcXYgPSBhZGFwdGVyLT5xX3ZlY3RvcltpXTsKIApAQCAtMjc5Nyw3ICsyODAwLDcgQEAKIAogLyoqCiAgKiBpeGdiZXZmX3dhdGNoZG9nX3VwZGF0ZV9saW5rIC0gdXBkYXRlIHRoZSBsaW5rIHN0YXR1cwotICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIHRoZSBkZXZpY2UgYWRhcHRlciBzdHJ1Y3R1cmUKICAqKi8KIHN0YXRpYyB2b2lkIGl4Z2JldmZfd2F0Y2hkb2dfdXBkYXRlX2xpbmsoc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlcikKIHsKQEAgLTI4MjUsNyArMjgyOCw3IEBACiAvKioKICAqIGl4Z2JldmZfd2F0Y2hkb2dfbGlua19pc191cCAtIHVwZGF0ZSBuZXRpZl9jYXJyaWVyIHN0YXR1cyBhbmQKICAqCQkJCSBwcmludCBsaW5rIHVwIG1lc3NhZ2UKLSAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byB0aGUgZGV2aWNlIGFkYXB0ZXIgc3RydWN0dXJlCisgKiBAYWRhcHRlcjogcG9pbnRlciB0byB0aGUgZGV2aWNlIGFkYXB0ZXIgc3RydWN0dXJlCiAgKiovCiBzdGF0aWMgdm9pZCBpeGdiZXZmX3dhdGNoZG9nX2xpbmtfaXNfdXAoc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlcikKIHsKQEAgLTI4NTAsNyArMjg1Myw3IEBACiAvKioKICAqIGl4Z2JldmZfd2F0Y2hkb2dfbGlua19pc19kb3duIC0gdXBkYXRlIG5ldGlmX2NhcnJpZXIgc3RhdHVzIGFuZAogICoJCQkJICAgcHJpbnQgbGluayBkb3duIG1lc3NhZ2UKLSAqIEBhZGFwdGVyIC0gcG9pbnRlciB0byB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUKKyAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIHRoZSBhZGFwdGVyIHN0cnVjdHVyZQogICoqLwogc3RhdGljIHZvaWQgaXhnYmV2Zl93YXRjaGRvZ19saW5rX2lzX2Rvd24oc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlcikKIHsKQEAgLTI5NTYsNyArMjk1OSw3IEBACiAKIC8qKgogICogaXhnYmV2Zl9zZXR1cF90eF9yZXNvdXJjZXMgLSBhbGxvY2F0ZSBUeCByZXNvdXJjZXMgKERlc2NyaXB0b3JzKQotICogQHR4X3Jpbmc6ICAgIHR4IGRlc2NyaXB0b3IgcmluZyAoZm9yIGEgc3BlY2lmaWMgcXVldWUpIHRvIHNldHVwCisgKiBAdHhfcmluZzogVHggZGVzY3JpcHRvciByaW5nIChmb3IgYSBzcGVjaWZpYyBxdWV1ZSkgdG8gc2V0dXAKICAqCiAgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCiAgKiovCkBAIC0yOTgzLDggKzI5ODYsNyBAQAogZXJyOgogCXZmcmVlKHR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvKTsKIAl0eF9yaW5nLT50eF9idWZmZXJfaW5mbyA9IE5VTEw7Ci0JaHdfZGJnKCZhZGFwdGVyLT5odywgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc21pdCAiCi0JICAgICAgICJkZXNjcmlwdG9yIHJpbmdcbiIpOworCWh3X2RiZygmYWRhcHRlci0+aHcsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdHJhbnNtaXQgZGVzY3JpcHRvciByaW5nXG4iKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIApAQCAtMzAwNiw4ICszMDA4LDcgQEAKIAkJZXJyID0gaXhnYmV2Zl9zZXR1cF90eF9yZXNvdXJjZXMoYWRhcHRlci0+dHhfcmluZ1tpXSk7CiAJCWlmICghZXJyKQogCQkJY29udGludWU7Ci0JCWh3X2RiZygmYWRhcHRlci0+aHcsCi0JCSAgICAgICAiQWxsb2NhdGlvbiBmb3IgVHggUXVldWUgJXUgZmFpbGVkXG4iLCBpKTsKKwkJaHdfZGJnKCZhZGFwdGVyLT5odywgIkFsbG9jYXRpb24gZm9yIFR4IFF1ZXVlICV1IGZhaWxlZFxuIiwgaSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMzAxNiw3ICszMDE3LDcgQEAKIAogLyoqCiAgKiBpeGdiZXZmX3NldHVwX3J4X3Jlc291cmNlcyAtIGFsbG9jYXRlIFJ4IHJlc291cmNlcyAoRGVzY3JpcHRvcnMpCi0gKiBAcnhfcmluZzogICAgcnggZGVzY3JpcHRvciByaW5nIChmb3IgYSBzcGVjaWZpYyBxdWV1ZSkgdG8gc2V0dXAKKyAqIEByeF9yaW5nOiBSeCBkZXNjcmlwdG9yIHJpbmcgKGZvciBhIHNwZWNpZmljIHF1ZXVlKSB0byBzZXR1cAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvbiBmYWlsdXJlCiAgKiovCkBAIC0zMDY1LDggKzMwNjYsNyBAQAogCQllcnIgPSBpeGdiZXZmX3NldHVwX3J4X3Jlc291cmNlcyhhZGFwdGVyLT5yeF9yaW5nW2ldKTsKIAkJaWYgKCFlcnIpCiAJCQljb250aW51ZTsKLQkJaHdfZGJnKCZhZGFwdGVyLT5odywKLQkJICAgICAgICJBbGxvY2F0aW9uIGZvciBSeCBRdWV1ZSAldSBmYWlsZWRcbiIsIGkpOworCQlod19kYmcoJmFkYXB0ZXItPmh3LCAiQWxsb2NhdGlvbiBmb3IgUnggUXVldWUgJXUgZmFpbGVkXG4iLCBpKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiBlcnI7CkBAIC0zMTM2LDExICszMTM2LDExIEBACiAJaWYgKGh3LT5hZGFwdGVyX3N0b3BwZWQpIHsKIAkJaXhnYmV2Zl9yZXNldChhZGFwdGVyKTsKIAkJLyogaWYgYWRhcHRlciBpcyBzdGlsbCBzdG9wcGVkIHRoZW4gUEYgaXNuJ3QgdXAgYW5kCi0JCSAqIHRoZSB2ZiBjYW4ndCBzdGFydC4gKi8KKwkJICogdGhlIFZGIGNhbid0IHN0YXJ0LgorCQkgKi8KIAkJaWYgKGh3LT5hZGFwdGVyX3N0b3BwZWQpIHsKIAkJCWVyciA9IElYR0JFX0VSUl9NQlg7Ci0JCQlwcl9lcnIoIlVuYWJsZSB0byBzdGFydCAtIHBlcmhhcHMgdGhlIFBGIERyaXZlciBpc24ndCAiCi0JCQkgICAgICAgInVwIHlldFxuIik7CisJCQlwcl9lcnIoIlVuYWJsZSB0byBzdGFydCAtIHBlcmhhcHMgdGhlIFBGIERyaXZlciBpc24ndCB1cCB5ZXRcbiIpOwogCQkJZ290byBlcnJfc2V0dXBfcmVzZXQ7CiAJCX0KIAl9CkBAIC0zMTYzLDggKzMxNjMsNyBAQAogCiAJaXhnYmV2Zl9jb25maWd1cmUoYWRhcHRlcik7CiAKLQkvKgotCSAqIE1hcCB0aGUgVHgvUnggcmluZ3MgdG8gdGhlIHZlY3RvcnMgd2Ugd2VyZSBhbGxvdHRlZC4KKwkvKiBNYXAgdGhlIFR4L1J4IHJpbmdzIHRvIHRoZSB2ZWN0b3JzIHdlIHdlcmUgYWxsb3R0ZWQuCiAJICogaWYgcmVxdWVzdF9pcnEgd2lsbCBiZSBjYWxsZWQgaW4gdGhpcyBmdW5jdGlvbiBtYXBfcmluZ3MKIAkgKiBtdXN0IGJlIGNhbGxlZCAqYmVmb3JlKiB1cF9jb21wbGV0ZQogCSAqLwpAQCAtMzI4OCw2ICszMjg3LDcgQEAKIAogCWlmIChmaXJzdC0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKSB7CiAJCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CisKIAkJaXBoLT50b3RfbGVuID0gMDsKIAkJaXBoLT5jaGVjayA9IDA7CiAJCXRjcF9oZHIoc2tiKS0+Y2hlY2sgPSB+Y3N1bV90Y3B1ZHBfbWFnaWMoaXBoLT5zYWRkciwKQEAgLTMzMTMsNyArMzMxMyw3IEBACiAJKmhkcl9sZW4gKz0gbDRsZW47CiAJKmhkcl9sZW4gPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsgbDRsZW47CiAKLQkvKiB1cGRhdGUgZ3NvIHNpemUgYW5kIGJ5dGVjb3VudCB3aXRoIGhlYWRlciBzaXplICovCisJLyogdXBkYXRlIEdTTyBzaXplIGFuZCBieXRlY291bnQgd2l0aCBoZWFkZXIgc2l6ZSAqLwogCWZpcnN0LT5nc29fc2VncyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3M7CiAJZmlyc3QtPmJ5dGVjb3VudCArPSAoZmlyc3QtPmdzb19zZWdzIC0gMSkgKiAqaGRyX2xlbjsKIApAQCAtMzM0Myw2ICszMzQzLDcgQEAKIAogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKSB7CiAJCXU4IGw0X2hkciA9IDA7CisKIAkJc3dpdGNoIChmaXJzdC0+cHJvdG9jb2wpIHsKIAkJY2FzZSBodG9ucyhFVEhfUF9JUCk6CiAJCQl2bGFuX21hY2lwX2xlbnMgfD0gc2tiX25ldHdvcmtfaGVhZGVyX2xlbihza2IpOwpAQCAtMzM1Niw4ICszMzU3LDggQEAKIAkJZGVmYXVsdDoKIAkJCWlmICh1bmxpa2VseShuZXRfcmF0ZWxpbWl0KCkpKSB7CiAJCQkJZGV2X3dhcm4odHhfcmluZy0+ZGV2LAotCQkJCSAicGFydGlhbCBjaGVja3N1bSBidXQgcHJvdG89JXghXG4iLAotCQkJCSBmaXJzdC0+cHJvdG9jb2wpOworCQkJCQkgInBhcnRpYWwgY2hlY2tzdW0gYnV0IHByb3RvPSV4IVxuIiwKKwkJCQkJIGZpcnN0LT5wcm90b2NvbCk7CiAJCQl9CiAJCQlicmVhazsKIAkJfQpAQCAtMzM4MCw4ICszMzgxLDggQEAKIAkJZGVmYXVsdDoKIAkJCWlmICh1bmxpa2VseShuZXRfcmF0ZWxpbWl0KCkpKSB7CiAJCQkJZGV2X3dhcm4odHhfcmluZy0+ZGV2LAotCQkJCSAicGFydGlhbCBjaGVja3N1bSBidXQgbDQgcHJvdG89JXghXG4iLAotCQkJCSBsNF9oZHIpOworCQkJCQkgInBhcnRpYWwgY2hlY2tzdW0gYnV0IGw0IHByb3RvPSV4IVxuIiwKKwkJCQkJIGw0X2hkcik7CiAJCQl9CiAJCQlicmVhazsKIAkJfQpAQCAtMzQwNSw3ICszNDA2LDcgQEAKIAkJCQkgICAgICBJWEdCRV9BRFZUWERfRENNRF9JRkNTIHwKIAkJCQkgICAgICBJWEdCRV9BRFZUWERfRENNRF9ERVhUKTsKIAotCS8qIHNldCBIVyB2bGFuIGJpdCBpZiB2bGFuIGlzIHByZXNlbnQgKi8KKwkvKiBzZXQgSFcgVkxBTiBiaXQgaWYgVkxBTiBpcyBwcmVzZW50ICovCiAJaWYgKHR4X2ZsYWdzICYgSVhHQkVfVFhfRkxBR1NfVkxBTikKIAkJY21kX3R5cGUgfD0gY3B1X3RvX2xlMzIoSVhHQkVfQURWVFhEX0RDTURfVkxFKTsKIApAQCAtMzU3MiwxMSArMzU3MywxMyBAQAogCW5ldGlmX3N0b3Bfc3VicXVldWUodHhfcmluZy0+bmV0ZGV2LCB0eF9yaW5nLT5xdWV1ZV9pbmRleCk7CiAJLyogSGVyYmVydCdzIG9yaWdpbmFsIHBhdGNoIGhhZDoKIAkgKiAgc21wX21iX19hZnRlcl9uZXRpZl9zdG9wX3F1ZXVlKCk7Ci0JICogYnV0IHNpbmNlIHRoYXQgZG9lc24ndCBleGlzdCB5ZXQsIGp1c3Qgb3BlbiBjb2RlIGl0LiAqLworCSAqIGJ1dCBzaW5jZSB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0LCBqdXN0IG9wZW4gY29kZSBpdC4KKwkgKi8KIAlzbXBfbWIoKTsKIAogCS8qIFdlIG5lZWQgdG8gY2hlY2sgYWdhaW4gaW4gYSBjYXNlIGFub3RoZXIgQ1BVIGhhcyBqdXN0Ci0JICogbWFkZSByb29tIGF2YWlsYWJsZS4gKi8KKwkgKiBtYWRlIHJvb20gYXZhaWxhYmxlLgorCSAqLwogCWlmIChsaWtlbHkoaXhnYmV2Zl9kZXNjX3VudXNlZCh0eF9yaW5nKSA8IHNpemUpKQogCQlyZXR1cm4gLUVCVVNZOwogCkBAIC0zNjE1LDggKzM2MTgsNyBAQAogCiAJdHhfcmluZyA9IGFkYXB0ZXItPnR4X3Jpbmdbc2tiLT5xdWV1ZV9tYXBwaW5nXTsKIAotCS8qCi0JICogbmVlZDogMSBkZXNjcmlwdG9yIHBlciBwYWdlICogUEFHRV9TSVpFL0lYR0JFX01BWF9EQVRBX1BFUl9UWEQsCisJLyogbmVlZDogMSBkZXNjcmlwdG9yIHBlciBwYWdlICogUEFHRV9TSVpFL0lYR0JFX01BWF9EQVRBX1BFUl9UWEQsCiAJICogICAgICAgKyAxIGRlc2MgZm9yIHNrYl9oZWFkbGVuL0lYR0JFX01BWF9EQVRBX1BFUl9UWEQsCiAJICogICAgICAgKyAyIGRlc2MgZ2FwIHRvIGtlZXAgdGFpbCBmcm9tIHRvdWNoaW5nIGhlYWQsCiAJICogICAgICAgKyAxIGRlc2MgZm9yIGNvbnRleHQgZGVzY3JpcHRvciwKQEAgLTM3MTIsNiArMzcxNCw3IEBACiAKIAlzd2l0Y2ggKGFkYXB0ZXItPmh3LmFwaV92ZXJzaW9uKSB7CiAJY2FzZSBpeGdiZV9tYm94X2FwaV8xMToKKwljYXNlIGl4Z2JlX21ib3hfYXBpXzEyOgogCQltYXhfcG9zc2libGVfZnJhbWUgPSBJWEdCRV9NQVhfSlVNQk9fRlJBTUVfU0laRTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTM3OTQsOCArMzc5Nyw3IEBACiAJdTMyIGVycjsKIAogCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOwotCS8qCi0JICogcGNpX3Jlc3RvcmVfc3RhdGUgY2xlYXJzIGRldi0+c3RhdGVfc2F2ZWQgc28gY2FsbAorCS8qIHBjaV9yZXN0b3JlX3N0YXRlIGNsZWFycyBkZXYtPnN0YXRlX3NhdmVkIHNvIGNhbGwKIAkgKiBwY2lfc2F2ZV9zdGF0ZSB0byByZXN0b3JlIGl0LgogCSAqLwogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwpAQCAtMzkzMCw4ICszOTMyLDcgQEAKIAl9IGVsc2UgewogCQllcnIgPSBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAoZXJyKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyB1c2FibGUgRE1BICIKLQkJCQkiY29uZmlndXJhdGlvbiwgYWJvcnRpbmdcbiIpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gdXNhYmxlIERNQSBjb25maWd1cmF0aW9uLCBhYm9ydGluZ1xuIik7CiAJCQlnb3RvIGVycl9kbWE7CiAJCX0KIAkJcGNpX3VzaW5nX2RhYyA9IDA7CkBAIC0zOTYyLDggKzM5NjMsNyBAQAogCWh3LT5iYWNrID0gYWRhcHRlcjsKIAlhZGFwdGVyLT5tc2dfZW5hYmxlID0gbmV0aWZfbXNnX2luaXQoZGVidWcsIERFRkFVTFRfTVNHX0VOQUJMRSk7CiAKLQkvKgotCSAqIGNhbGwgc2F2ZSBzdGF0ZSBoZXJlIGluIHN0YW5kYWxvbmUgZHJpdmVyIGJlY2F1c2UgaXQgcmVsaWVzIG9uCisJLyogY2FsbCBzYXZlIHN0YXRlIGhlcmUgaW4gc3RhbmRhbG9uZSBkcml2ZXIgYmVjYXVzZSBpdCByZWxpZXMgb24KIAkgKiBhZGFwdGVyIHN0cnVjdCB0byBleGlzdCwgYW5kIG5lZWRzIHRvIGNhbGwgbmV0ZGV2X3ByaXYKIAkgKi8KIAlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKQEAgLTM5NzgsNyArMzk3OCw3IEBACiAKIAlpeGdiZXZmX2Fzc2lnbl9uZXRkZXZfb3BzKG5ldGRldik7CiAKLQkvKiBTZXR1cCBodyBhcGkgKi8KKwkvKiBTZXR1cCBIVyBBUEkgKi8KIAltZW1jcHkoJmh3LT5tYWMub3BzLCBpaS0+bWFjX29wcywgc2l6ZW9mKGh3LT5tYWMub3BzKSk7CiAJaHctPm1hYy50eXBlICA9IGlpLT5tYWM7CiAKQEAgLTM5OTgsMTEgKzM5OTgsMTEgQEAKIAl9CiAKIAluZXRkZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8Ci0JCQkgICBORVRJRl9GX0lQX0NTVU0gfAotCQkJICAgTkVUSUZfRl9JUFY2X0NTVU0gfAotCQkJICAgTkVUSUZfRl9UU08gfAotCQkJICAgTkVUSUZfRl9UU082IHwKLQkJCSAgIE5FVElGX0ZfUlhDU1VNOworCQkJICAgICAgTkVUSUZfRl9JUF9DU1VNIHwKKwkJCSAgICAgIE5FVElGX0ZfSVBWNl9DU1VNIHwKKwkJCSAgICAgIE5FVElGX0ZfVFNPIHwKKwkJCSAgICAgIE5FVElGX0ZfVFNPNiB8CisJCQkgICAgICBORVRJRl9GX1JYQ1NVTTsKIAogCW5ldGRldi0+ZmVhdHVyZXMgPSBuZXRkZXYtPmh3X2ZlYXR1cmVzIHwKIAkJCSAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwKQEAgLTQxMzEsNyArNDEzMSw3IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYSBQQ0kgYnVzIGVycm9yIGFmZmVjdGluZwogICogdGhpcyBkZXZpY2UgaGFzIGJlZW4gZGV0ZWN0ZWQuCi0gKi8KKyAqKi8KIHN0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IGl4Z2JldmZfaW9fZXJyb3JfZGV0ZWN0ZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJCQkgIHBjaV9jaGFubmVsX3N0YXRlX3Qgc3RhdGUpCiB7CkBAIC00MTY2LDcgKzQxNjYsNyBAQAogICoKICAqIFJlc3RhcnQgdGhlIGNhcmQgZnJvbSBzY3JhdGNoLCBhcyBpZiBmcm9tIGEgY29sZC1ib290LiBJbXBsZW1lbnRhdGlvbgogICogcmVzZW1ibGVzIHRoZSBmaXJzdC1oYWxmIG9mIHRoZSBpeGdiZXZmX3Jlc3VtZSByb3V0aW5lLgotICovCisgKiovCiBzdGF0aWMgcGNpX2Vyc19yZXN1bHRfdCBpeGdiZXZmX2lvX3Nsb3RfcmVzZXQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTQxOTQsNyArNDE5NCw3IEBACiAgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBlcnJvciByZWNvdmVyeSBkcml2ZXIgdGVsbHMgdXMgdGhhdAogICogaXRzIE9LIHRvIHJlc3VtZSBub3JtYWwgb3BlcmF0aW9uLiBJbXBsZW1lbnRhdGlvbiByZXNlbWJsZXMgdGhlCiAgKiBzZWNvbmQtaGFsZiBvZiB0aGUgaXhnYmV2Zl9yZXN1bWUgcm91dGluZS4KLSAqLworICoqLwogc3RhdGljIHZvaWQgaXhnYmV2Zl9pb19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTQyMTQsMTcgKzQyMTQsMTcgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpeGdiZXZmX2RyaXZlciA9IHsKLQkubmFtZSAgICAgPSBpeGdiZXZmX2RyaXZlcl9uYW1lLAotCS5pZF90YWJsZSA9IGl4Z2JldmZfcGNpX3RibCwKLQkucHJvYmUgICAgPSBpeGdiZXZmX3Byb2JlLAotCS5yZW1vdmUgICA9IGl4Z2JldmZfcmVtb3ZlLAorCS5uYW1lCQk9IGl4Z2JldmZfZHJpdmVyX25hbWUsCisJLmlkX3RhYmxlCT0gaXhnYmV2Zl9wY2lfdGJsLAorCS5wcm9iZQkJPSBpeGdiZXZmX3Byb2JlLAorCS5yZW1vdmUJCT0gaXhnYmV2Zl9yZW1vdmUsCiAjaWZkZWYgQ09ORklHX1BNCiAJLyogUG93ZXIgTWFuYWdlbWVudCBIb29rcyAqLwotCS5zdXNwZW5kICA9IGl4Z2JldmZfc3VzcGVuZCwKLQkucmVzdW1lICAgPSBpeGdiZXZmX3Jlc3VtZSwKKwkuc3VzcGVuZAk9IGl4Z2JldmZfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGl4Z2JldmZfcmVzdW1lLAogI2VuZGlmCi0JLnNodXRkb3duID0gaXhnYmV2Zl9zaHV0ZG93biwKLQkuZXJyX2hhbmRsZXIgPSAmaXhnYmV2Zl9lcnJfaGFuZGxlcgorCS5zaHV0ZG93bgk9IGl4Z2JldmZfc2h1dGRvd24sCisJLmVycl9oYW5kbGVyCT0gJml4Z2JldmZfZXJyX2hhbmRsZXIKIH07CiAKIC8qKgpAQCAtNDIzNiw2ICs0MjM2LDcgQEAKIHN0YXRpYyBpbnQgX19pbml0IGl4Z2JldmZfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgcmV0OworCiAJcHJfaW5mbygiJXMgLSB2ZXJzaW9uICVzXG4iLCBpeGdiZXZmX2RyaXZlcl9zdHJpbmcsCiAJCWl4Z2JldmZfZHJpdmVyX3ZlcnNpb24pOwogCkBAIC00MjY2LDYgKzQyNjcsNyBAQAogY2hhciAqaXhnYmV2Zl9nZXRfaHdfZGV2X25hbWUoc3RydWN0IGl4Z2JlX2h3ICpodykKIHsKIAlzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyID0gaHctPmJhY2s7CisKIAlyZXR1cm4gYWRhcHRlci0+bmV0ZGV2LT5uYW1lOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL21ieC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9tYnguYwppbmRleCBkNTAyOGRkLi5kYzY4ZmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL21ieC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvbWJ4LmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIEludGVsIDgyNTk5IFZpcnR1YWwgRnVuY3Rpb24gZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDE1IEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0xMyw4ICsxMyw3IEBACiAgIG1vcmUgZGV0YWlscy4KIAogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIAogICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgpAQCAtNTIsMTAgKzUxLDEwIEBACiB9CiAKIC8qKgotICogIGl4Z2JldmZfcG9sbF9mb3JfYWNrIC0gV2FpdCBmb3IgbWVzc2FnZSBhY2tub3dsZWRnZW1lbnQKKyAqICBpeGdiZXZmX3BvbGxfZm9yX2FjayAtIFdhaXQgZm9yIG1lc3NhZ2UgYWNrbm93bGVkZ21lbnQKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICoKLSAqICByZXR1cm5zIDAgaWYgaXQgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGEgbWVzc2FnZSBhY2tub3dsZWRnZW1lbnQKKyAqICByZXR1cm5zIDAgaWYgaXQgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGEgbWVzc2FnZSBhY2tub3dsZWRnbWVudAogICoqLwogc3RhdGljIHMzMiBpeGdiZXZmX3BvbGxfZm9yX2FjayhzdHJ1Y3QgaXhnYmVfaHcgKmh3KQogewpAQCAtMjEzLDcgKzIxMiw3IEBACiAJczMyIHJldF92YWwgPSBJWEdCRV9FUlJfTUJYOwogCiAJaWYgKCFpeGdiZXZmX2NoZWNrX2Zvcl9iaXRfdmYoaHcsIChJWEdCRV9WRk1BSUxCT1hfUlNURCB8Ci0JCQkJCSBJWEdCRV9WRk1BSUxCT1hfUlNUSSkpKSB7CisJCQkJCSAgIElYR0JFX1ZGTUFJTEJPWF9SU1RJKSkpIHsKIAkJcmV0X3ZhbCA9IDA7CiAJCWh3LT5tYnguc3RhdHMucnN0cysrOwogCX0KQEAgLTIzNCw3ICsyMzMsNyBAQAogCS8qIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBidWZmZXIgKi8KIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX1ZGTUFJTEJPWCwgSVhHQkVfVkZNQUlMQk9YX1ZGVSk7CiAKLQkvKiByZXNlcnZlIG1haWxib3ggZm9yIHZmIHVzZSAqLworCS8qIHJlc2VydmUgbWFpbGJveCBmb3IgVkYgdXNlICovCiAJaWYgKGl4Z2JldmZfcmVhZF92MnBfbWFpbGJveChodykgJiBJWEdCRV9WRk1BSUxCT1hfVkZVKQogCQlyZXRfdmFsID0gMDsKIApAQCAtMjU0LDggKzI1Myw3IEBACiAJczMyIHJldF92YWw7CiAJdTE2IGk7CiAKLQotCS8qIGxvY2sgdGhlIG1haWxib3ggdG8gcHJldmVudCBwZi92ZiByYWNlIGNvbmRpdGlvbiAqLworCS8qIGxvY2sgdGhlIG1haWxib3ggdG8gcHJldmVudCBQRi9WRiByYWNlIGNvbmRpdGlvbiAqLwogCXJldF92YWwgPSBpeGdiZXZmX29idGFpbl9tYnhfbG9ja192Zihodyk7CiAJaWYgKHJldF92YWwpCiAJCWdvdG8gb3V0X25vX3dyaXRlOwpAQCAtMjc5LDcgKzI3Nyw3IEBACiB9CiAKIC8qKgotICogIGl4Z2JldmZfcmVhZF9tYnhfdmYgLSBSZWFkcyBhIG1lc3NhZ2UgZnJvbSB0aGUgaW5ib3ggaW50ZW5kZWQgZm9yIHZmCisgKiAgaXhnYmV2Zl9yZWFkX21ieF92ZiAtIFJlYWRzIGEgbWVzc2FnZSBmcm9tIHRoZSBpbmJveCBpbnRlbmRlZCBmb3IgVkYKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEBtc2c6IFRoZSBtZXNzYWdlIGJ1ZmZlcgogICogIEBzaXplOiBMZW5ndGggb2YgYnVmZmVyCkBAIC0yOTEsNyArMjg5LDcgQEAKIAlzMzIgcmV0X3ZhbCA9IDA7CiAJdTE2IGk7CiAKLQkvKiBsb2NrIHRoZSBtYWlsYm94IHRvIHByZXZlbnQgcGYvdmYgcmFjZSBjb25kaXRpb24gKi8KKwkvKiBsb2NrIHRoZSBtYWlsYm94IHRvIHByZXZlbnQgUEYvVkYgcmFjZSBjb25kaXRpb24gKi8KIAlyZXRfdmFsID0gaXhnYmV2Zl9vYnRhaW5fbWJ4X2xvY2tfdmYoaHcpOwogCWlmIChyZXRfdmFsKQogCQlnb3RvIG91dF9ub19yZWFkOwpAQCAtMzExLDE3ICszMDksMTggQEAKIH0KIAogLyoqCi0gKiAgaXhnYmV2Zl9pbml0X21ieF9wYXJhbXNfdmYgLSBzZXQgaW5pdGlhbCB2YWx1ZXMgZm9yIHZmIG1haWxib3gKKyAqICBpeGdiZXZmX2luaXRfbWJ4X3BhcmFtc192ZiAtIHNldCBpbml0aWFsIHZhbHVlcyBmb3IgVkYgbWFpbGJveAogICogIEBodzogcG9pbnRlciB0byB0aGUgSFcgc3RydWN0dXJlCiAgKgotICogIEluaXRpYWxpemVzIHRoZSBody0+bWJ4IHN0cnVjdCB0byBjb3JyZWN0IHZhbHVlcyBmb3IgdmYgbWFpbGJveAorICogIEluaXRpYWxpemVzIHRoZSBody0+bWJ4IHN0cnVjdCB0byBjb3JyZWN0IHZhbHVlcyBmb3IgVkYgbWFpbGJveAogICovCiBzdGF0aWMgczMyIGl4Z2JldmZfaW5pdF9tYnhfcGFyYW1zX3ZmKHN0cnVjdCBpeGdiZV9odyAqaHcpCiB7CiAJc3RydWN0IGl4Z2JlX21ieF9pbmZvICptYnggPSAmaHctPm1ieDsKIAogCS8qIHN0YXJ0IG1haWxib3ggYXMgdGltZWQgb3V0IGFuZCBsZXQgdGhlIHJlc2V0X2h3IGNhbGwgc2V0IHRoZSB0aW1lb3V0Ci0JICogdmFsdWUgdG8gYmVnaW4gY29tbXVuaWNhdGlvbnMgKi8KKwkgKiB2YWx1ZSB0byBiZWdpbiBjb21tdW5pY2F0aW9ucworCSAqLwogCW1ieC0+dGltZW91dCA9IDA7CiAJbWJ4LT51ZGVsYXkgPSBJWEdCRV9WRl9NQlhfSU5JVF9ERUxBWTsKIApAQCAtMzM3LDEzICszMzYsMTMgQEAKIH0KIAogY29uc3Qgc3RydWN0IGl4Z2JlX21ieF9vcGVyYXRpb25zIGl4Z2JldmZfbWJ4X29wcyA9IHsKLQkuaW5pdF9wYXJhbXMgICA9IGl4Z2JldmZfaW5pdF9tYnhfcGFyYW1zX3ZmLAotCS5yZWFkICAgICAgICAgID0gaXhnYmV2Zl9yZWFkX21ieF92ZiwKLQkud3JpdGUgICAgICAgICA9IGl4Z2JldmZfd3JpdGVfbWJ4X3ZmLAotCS5yZWFkX3Bvc3RlZCAgID0gaXhnYmV2Zl9yZWFkX3Bvc3RlZF9tYngsCi0JLndyaXRlX3Bvc3RlZCAgPSBpeGdiZXZmX3dyaXRlX3Bvc3RlZF9tYngsCi0JLmNoZWNrX2Zvcl9tc2cgPSBpeGdiZXZmX2NoZWNrX2Zvcl9tc2dfdmYsCi0JLmNoZWNrX2Zvcl9hY2sgPSBpeGdiZXZmX2NoZWNrX2Zvcl9hY2tfdmYsCi0JLmNoZWNrX2Zvcl9yc3QgPSBpeGdiZXZmX2NoZWNrX2Zvcl9yc3RfdmYsCisJLmluaXRfcGFyYW1zCT0gaXhnYmV2Zl9pbml0X21ieF9wYXJhbXNfdmYsCisJLnJlYWQJCT0gaXhnYmV2Zl9yZWFkX21ieF92ZiwKKwkud3JpdGUJCT0gaXhnYmV2Zl93cml0ZV9tYnhfdmYsCisJLnJlYWRfcG9zdGVkCT0gaXhnYmV2Zl9yZWFkX3Bvc3RlZF9tYngsCisJLndyaXRlX3Bvc3RlZAk9IGl4Z2JldmZfd3JpdGVfcG9zdGVkX21ieCwKKwkuY2hlY2tfZm9yX21zZwk9IGl4Z2JldmZfY2hlY2tfZm9yX21zZ192ZiwKKwkuY2hlY2tfZm9yX2Fjawk9IGl4Z2JldmZfY2hlY2tfZm9yX2Fja192ZiwKKwkuY2hlY2tfZm9yX3JzdAk9IGl4Z2JldmZfY2hlY2tfZm9yX3JzdF92ZiwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvbWJ4LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL21ieC5oCmluZGV4IDBiYzMwMDUuLjgyZjQ0ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvbWJ4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9tYnguaApAQCAtMSw3ICsxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICAgSW50ZWwgODI1OTkgVmlydHVhbCBGdW5jdGlvbiBkcml2ZXIKLSAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDEyIEludGVsIENvcnBvcmF0aW9uLgorICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMTUgSW50ZWwgQ29ycG9yYXRpb24uCiAKICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICAgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKQEAgLTEzLDggKzEzLDcgQEAKICAgbW9yZSBkZXRhaWxzLgogCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgogCiAgIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluCiAgIHRoZSBmaWxlIGNhbGxlZCAiQ09QWUlORyIuCkBAIC0zMCw3MSArMjksNzAgQEAKIAogI2luY2x1ZGUgInZmLmgiCiAKLSNkZWZpbmUgSVhHQkVfVkZNQUlMQk9YX1NJWkUgICAgICAgIDE2IC8qIDE2IDMyIGJpdCB3b3JkcyAtIDY0IGJ5dGVzICovCi0jZGVmaW5lIElYR0JFX0VSUl9NQlggICAgICAgICAgICAgICAtMTAwCisjZGVmaW5lIElYR0JFX1ZGTUFJTEJPWF9TSVpFCTE2IC8qIDE2IDMyIGJpdCB3b3JkcyAtIDY0IGJ5dGVzICovCisjZGVmaW5lIElYR0JFX0VSUl9NQlgJCS0xMDAKIAotI2RlZmluZSBJWEdCRV9WRk1BSUxCT1ggICAgICAgICAgICAgMHgwMDJGQwotI2RlZmluZSBJWEdCRV9WRk1CTUVNICAgICAgICAgICAgICAgMHgwMDIwMAorI2RlZmluZSBJWEdCRV9WRk1BSUxCT1gJCTB4MDAyRkMKKyNkZWZpbmUgSVhHQkVfVkZNQk1FTQkJMHgwMDIwMAogCiAvKiBEZWZpbmUgbWFpbGJveCByZWdpc3RlciBiaXRzICovCi0jZGVmaW5lIElYR0JFX1ZGTUFJTEJPWF9SRVEgICAgICAweDAwMDAwMDAxIC8qIFJlcXVlc3QgZm9yIFBGIFJlYWR5IGJpdCAqLwotI2RlZmluZSBJWEdCRV9WRk1BSUxCT1hfQUNLICAgICAgMHgwMDAwMDAwMiAvKiBBY2sgUEYgbWVzc2FnZSByZWNlaXZlZCAqLwotI2RlZmluZSBJWEdCRV9WRk1BSUxCT1hfVkZVICAgICAgMHgwMDAwMDAwNCAvKiBWRiBvd25zIHRoZSBtYWlsYm94IGJ1ZmZlciAqLwotI2RlZmluZSBJWEdCRV9WRk1BSUxCT1hfUEZVICAgICAgMHgwMDAwMDAwOCAvKiBQRiBvd25zIHRoZSBtYWlsYm94IGJ1ZmZlciAqLwotI2RlZmluZSBJWEdCRV9WRk1BSUxCT1hfUEZTVFMgICAgMHgwMDAwMDAxMCAvKiBQRiB3cm90ZSBhIG1lc3NhZ2UgaW4gdGhlIE1CICovCi0jZGVmaW5lIElYR0JFX1ZGTUFJTEJPWF9QRkFDSyAgICAweDAwMDAwMDIwIC8qIFBGIGFjayB0aGUgcHJldmlvdXMgVkYgbXNnICovCi0jZGVmaW5lIElYR0JFX1ZGTUFJTEJPWF9SU1RJICAgICAweDAwMDAwMDQwIC8qIFBGIGhhcyByZXNldCBpbmRpY2F0aW9uICovCi0jZGVmaW5lIElYR0JFX1ZGTUFJTEJPWF9SU1REICAgICAweDAwMDAwMDgwIC8qIFBGIGhhcyBpbmRpY2F0ZWQgcmVzZXQgZG9uZSAqLworI2RlZmluZSBJWEdCRV9WRk1BSUxCT1hfUkVRCTB4MDAwMDAwMDEgLyogUmVxdWVzdCBmb3IgUEYgUmVhZHkgYml0ICovCisjZGVmaW5lIElYR0JFX1ZGTUFJTEJPWF9BQ0sJMHgwMDAwMDAwMiAvKiBBY2sgUEYgbWVzc2FnZSByZWNlaXZlZCAqLworI2RlZmluZSBJWEdCRV9WRk1BSUxCT1hfVkZVCTB4MDAwMDAwMDQgLyogVkYgb3ducyB0aGUgbWFpbGJveCBidWZmZXIgKi8KKyNkZWZpbmUgSVhHQkVfVkZNQUlMQk9YX1BGVQkweDAwMDAwMDA4IC8qIFBGIG93bnMgdGhlIG1haWxib3ggYnVmZmVyICovCisjZGVmaW5lIElYR0JFX1ZGTUFJTEJPWF9QRlNUUwkweDAwMDAwMDEwIC8qIFBGIHdyb3RlIGEgbWVzc2FnZSBpbiB0aGUgTUIgKi8KKyNkZWZpbmUgSVhHQkVfVkZNQUlMQk9YX1BGQUNLCTB4MDAwMDAwMjAgLyogUEYgYWNrIHRoZSBwcmV2aW91cyBWRiBtc2cgKi8KKyNkZWZpbmUgSVhHQkVfVkZNQUlMQk9YX1JTVEkJMHgwMDAwMDA0MCAvKiBQRiBoYXMgcmVzZXQgaW5kaWNhdGlvbiAqLworI2RlZmluZSBJWEdCRV9WRk1BSUxCT1hfUlNURAkweDAwMDAwMDgwIC8qIFBGIGhhcyBpbmRpY2F0ZWQgcmVzZXQgZG9uZSAqLwogI2RlZmluZSBJWEdCRV9WRk1BSUxCT1hfUjJDX0JJVFMgMHgwMDAwMDBCMCAvKiBBbGwgcmVhZCB0byBjbGVhciBiaXRzICovCiAKLSNkZWZpbmUgSVhHQkVfUEZNQUlMQk9YKHgpICAgICAgICAgICgweDA0QjAwICsgKDQgKiAoeCkpKQotI2RlZmluZSBJWEdCRV9QRk1CTUVNKHZmbikgICAgICAgICAgKDB4MTMwMDAgKyAoNjQgKiAodmZuKSkpCisjZGVmaW5lIElYR0JFX1BGTUFJTEJPWCh4KQkoMHgwNEIwMCArICg0ICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfUEZNQk1FTSh2Zm4pCSgweDEzMDAwICsgKDY0ICogKHZmbikpKQogCi0jZGVmaW5lIElYR0JFX1BGTUFJTEJPWF9TVFMgICAweDAwMDAwMDAxIC8qIEluaXRpYXRlIG1lc3NhZ2Ugc2VuZCB0byBWRiAqLwotI2RlZmluZSBJWEdCRV9QRk1BSUxCT1hfQUNLICAgMHgwMDAwMDAwMiAvKiBBY2sgbWVzc2FnZSByZWN2J2QgZnJvbSBWRiAqLwotI2RlZmluZSBJWEdCRV9QRk1BSUxCT1hfVkZVICAgMHgwMDAwMDAwNCAvKiBWRiBvd25zIHRoZSBtYWlsYm94IGJ1ZmZlciAqLwotI2RlZmluZSBJWEdCRV9QRk1BSUxCT1hfUEZVICAgMHgwMDAwMDAwOCAvKiBQRiBvd25zIHRoZSBtYWlsYm94IGJ1ZmZlciAqLwotI2RlZmluZSBJWEdCRV9QRk1BSUxCT1hfUlZGVSAgMHgwMDAwMDAxMCAvKiBSZXNldCBWRlUgLSB1c2VkIHdoZW4gVkYgc3R1Y2sgKi8KKyNkZWZpbmUgSVhHQkVfUEZNQUlMQk9YX1NUUwkweDAwMDAwMDAxIC8qIEluaXRpYXRlIG1lc3NhZ2Ugc2VuZCB0byBWRiAqLworI2RlZmluZSBJWEdCRV9QRk1BSUxCT1hfQUNLCTB4MDAwMDAwMDIgLyogQWNrIG1lc3NhZ2UgcmVjdidkIGZyb20gVkYgKi8KKyNkZWZpbmUgSVhHQkVfUEZNQUlMQk9YX1ZGVQkweDAwMDAwMDA0IC8qIFZGIG93bnMgdGhlIG1haWxib3ggYnVmZmVyICovCisjZGVmaW5lIElYR0JFX1BGTUFJTEJPWF9QRlUJMHgwMDAwMDAwOCAvKiBQRiBvd25zIHRoZSBtYWlsYm94IGJ1ZmZlciAqLworI2RlZmluZSBJWEdCRV9QRk1BSUxCT1hfUlZGVQkweDAwMDAwMDEwIC8qIFJlc2V0IFZGVSAtIHVzZWQgd2hlbiBWRiBzdHVjayAqLwogCiAjZGVmaW5lIElYR0JFX01CVkZJQ1JfVkZSRVFfTUFTSyAweDAwMDBGRkZGIC8qIGJpdHMgZm9yIFZGIG1lc3NhZ2VzICovCi0jZGVmaW5lIElYR0JFX01CVkZJQ1JfVkZSRVFfVkYxICAweDAwMDAwMDAxIC8qIGJpdCBmb3IgVkYgMSBtZXNzYWdlICovCisjZGVmaW5lIElYR0JFX01CVkZJQ1JfVkZSRVFfVkYxCTB4MDAwMDAwMDEgLyogYml0IGZvciBWRiAxIG1lc3NhZ2UgKi8KICNkZWZpbmUgSVhHQkVfTUJWRklDUl9WRkFDS19NQVNLIDB4RkZGRjAwMDAgLyogYml0cyBmb3IgVkYgYWNrcyAqLwotI2RlZmluZSBJWEdCRV9NQlZGSUNSX1ZGQUNLX1ZGMSAgMHgwMDAxMDAwMCAvKiBiaXQgZm9yIFZGIDEgYWNrICovCi0KKyNkZWZpbmUgSVhHQkVfTUJWRklDUl9WRkFDS19WRjEJMHgwMDAxMDAwMCAvKiBiaXQgZm9yIFZGIDEgYWNrICovCiAKIC8qIElmIGl0J3MgYSBJWEdCRV9WRl8qIG1zZyB0aGVuIGl0IG9yaWdpbmF0ZXMgaW4gdGhlIFZGIGFuZCBpcyBzZW50IHRvIHRoZQogICogUEYuICBUaGUgcmV2ZXJzZSBpcyB0cnVlIGlmIGl0IGlzIElYR0JFX1BGXyouCiAgKiBNZXNzYWdlIEFDSydzIGFyZSB0aGUgdmFsdWUgb3InZCB3aXRoIDB4RjAwMDAwMDAKICAqLwotI2RlZmluZSBJWEdCRV9WVF9NU0dUWVBFX0FDSyAgICAgIDB4ODAwMDAwMDAgIC8qIE1lc3NhZ2VzIGJlbG93IG9yJ2Qgd2l0aAotCQkJCQkgICAgICAgKiB0aGlzIGFyZSB0aGUgQUNLICovCi0jZGVmaW5lIElYR0JFX1ZUX01TR1RZUEVfTkFDSyAgICAgMHg0MDAwMDAwMCAgLyogTWVzc2FnZXMgYmVsb3cgb3InZCB3aXRoCi0JCQkJCSAgICAgICAqIHRoaXMgYXJlIHRoZSBOQUNLICovCi0jZGVmaW5lIElYR0JFX1ZUX01TR1RZUEVfQ1RTICAgICAgMHgyMDAwMDAwMCAgLyogSW5kaWNhdGVzIHRoYXQgVkYgaXMgc3RpbGwKLQkJCQkJICAgICAgICogIGNsZWFyIHRvIHNlbmQgcmVxdWVzdHMgKi8KLSNkZWZpbmUgSVhHQkVfVlRfTVNHSU5GT19TSElGVCAgICAxNgorLyogTWVzc2FnZXMgYmVsb3cgb3InZCB3aXRoIHRoaXMgYXJlIHRoZSBBQ0sgKi8KKyNkZWZpbmUgSVhHQkVfVlRfTVNHVFlQRV9BQ0sJMHg4MDAwMDAwMAorLyogTWVzc2FnZXMgYmVsb3cgb3InZCB3aXRoIHRoaXMgYXJlIHRoZSBOQUNLICovCisjZGVmaW5lIElYR0JFX1ZUX01TR1RZUEVfTkFDSwkweDQwMDAwMDAwCisvKiBJbmRpY2F0ZXMgdGhhdCBWRiBpcyBzdGlsbCBjbGVhciB0byBzZW5kIHJlcXVlc3RzICovCisjZGVmaW5lIElYR0JFX1ZUX01TR1RZUEVfQ1RTCTB4MjAwMDAwMDAKKyNkZWZpbmUgSVhHQkVfVlRfTVNHSU5GT19TSElGVAkxNgogLyogYml0cyAyMzoxNiBhcmUgdXNlZCBmb3IgZXhyYSBpbmZvIGZvciBjZXJ0YWluIG1lc3NhZ2VzICovCi0jZGVmaW5lIElYR0JFX1ZUX01TR0lORk9fTUFTSyAgICAgKDB4RkYgPDwgSVhHQkVfVlRfTVNHSU5GT19TSElGVCkKKyNkZWZpbmUgSVhHQkVfVlRfTVNHSU5GT19NQVNLCSgweEZGIDw8IElYR0JFX1ZUX01TR0lORk9fU0hJRlQpCiAKIC8qIGRlZmluaXRpb25zIHRvIHN1cHBvcnQgbWFpbGJveCBBUEkgdmVyc2lvbiBuZWdvdGlhdGlvbiAqLwogCi0vKgotICogZWFjaCBlbGVtZW50IGRlbm90ZXMgYSB2ZXJzaW9uIG9mIHRoZSBBUEk7IGV4aXN0aW5nIG51bWJlcnMgbWF5IG5vdAorLyogZWFjaCBlbGVtZW50IGRlbm90ZXMgYSB2ZXJzaW9uIG9mIHRoZSBBUEk7IGV4aXN0aW5nIG51bWJlcnMgbWF5IG5vdAogICogY2hhbmdlOyBhbnkgYWRkaXRpb25zIG11c3QgZ28gYXQgdGhlIGVuZAogICovCiBlbnVtIGl4Z2JlX3BmdmZfYXBpX3JldiB7CiAJaXhnYmVfbWJveF9hcGlfMTAsCS8qIEFQSSB2ZXJzaW9uIDEuMCwgbGludXgvZnJlZWJzZCBWRiBkcml2ZXIgKi8KIAlpeGdiZV9tYm94X2FwaV8yMCwJLyogQVBJIHZlcnNpb24gMi4wLCBzb2xhcmlzIFBoYXNlMSBWRiBkcml2ZXIgKi8KIAlpeGdiZV9tYm94X2FwaV8xMSwJLyogQVBJIHZlcnNpb24gMS4xLCBsaW51eC9mcmVlYnNkIFZGIGRyaXZlciAqLworCWl4Z2JlX21ib3hfYXBpXzEyLAkvKiBBUEkgdmVyc2lvbiAxLjIsIGxpbnV4L2ZyZWVic2QgVkYgZHJpdmVyICovCiAJLyogVGhpcyB2YWx1ZSBzaG91bGQgYWx3YXlzIGJlIGxhc3QgKi8KIAlpeGdiZV9tYm94X2FwaV91bmtub3duLAkvKiBpbmRpY2F0ZXMgdGhhdCBBUEkgdmVyc2lvbiBpcyBub3Qga25vd24gKi8KIH07CiAKIC8qIG1haWxib3ggQVBJLCBsZWdhY3kgcmVxdWVzdHMgKi8KLSNkZWZpbmUgSVhHQkVfVkZfUkVTRVQgICAgICAgICAgICAweDAxIC8qIFZGIHJlcXVlc3RzIHJlc2V0ICovCi0jZGVmaW5lIElYR0JFX1ZGX1NFVF9NQUNfQUREUiAgICAgMHgwMiAvKiBWRiByZXF1ZXN0cyBQRiB0byBzZXQgTUFDIGFkZHIgKi8KLSNkZWZpbmUgSVhHQkVfVkZfU0VUX01VTFRJQ0FTVCAgICAweDAzIC8qIFZGIHJlcXVlc3RzIFBGIHRvIHNldCBNQyBhZGRyICovCi0jZGVmaW5lIElYR0JFX1ZGX1NFVF9WTEFOICAgICAgICAgMHgwNCAvKiBWRiByZXF1ZXN0cyBQRiB0byBzZXQgVkxBTiAqLworI2RlZmluZSBJWEdCRV9WRl9SRVNFVAkJMHgwMSAvKiBWRiByZXF1ZXN0cyByZXNldCAqLworI2RlZmluZSBJWEdCRV9WRl9TRVRfTUFDX0FERFIJMHgwMiAvKiBWRiByZXF1ZXN0cyBQRiB0byBzZXQgTUFDIGFkZHIgKi8KKyNkZWZpbmUgSVhHQkVfVkZfU0VUX01VTFRJQ0FTVAkweDAzIC8qIFZGIHJlcXVlc3RzIFBGIHRvIHNldCBNQyBhZGRyICovCisjZGVmaW5lIElYR0JFX1ZGX1NFVF9WTEFOCTB4MDQgLyogVkYgcmVxdWVzdHMgUEYgdG8gc2V0IFZMQU4gKi8KIAogLyogbWFpbGJveCBBUEksIHZlcnNpb24gMS4wIFZGIHJlcXVlc3RzICovCiAjZGVmaW5lIElYR0JFX1ZGX1NFVF9MUEUJMHgwNSAvKiBWRiByZXF1ZXN0cyBQRiB0byBzZXQgVk1PTFIuTFBFICovCkBAIC0xMDUsMjAgKzEwMywyNCBAQAogI2RlZmluZSBJWEdCRV9WRl9HRVRfUVVFVUUJMHgwOSAvKiBnZXQgcXVldWUgY29uZmlndXJhdGlvbiAqLwogCiAvKiBHRVRfUVVFVUVTIHJldHVybiBkYXRhIGluZGljZXMgd2l0aGluIHRoZSBtYWlsYm94ICovCi0jZGVmaW5lIElYR0JFX1ZGX1RYX1FVRVVFUwkxCS8qIG51bWJlciBvZiBUeCBxdWV1ZXMgc3VwcG9ydGVkICovCi0jZGVmaW5lIElYR0JFX1ZGX1JYX1FVRVVFUwkyCS8qIG51bWJlciBvZiBSeCBxdWV1ZXMgc3VwcG9ydGVkICovCi0jZGVmaW5lIElYR0JFX1ZGX1RSQU5TX1ZMQU4JMwkvKiBJbmRpY2F0aW9uIG9mIHBvcnQgdmxhbiAqLwotI2RlZmluZSBJWEdCRV9WRl9ERUZfUVVFVUUJNAkvKiBEZWZhdWx0IHF1ZXVlIG9mZnNldCAqLworI2RlZmluZSBJWEdCRV9WRl9UWF9RVUVVRVMJMSAvKiBudW1iZXIgb2YgVHggcXVldWVzIHN1cHBvcnRlZCAqLworI2RlZmluZSBJWEdCRV9WRl9SWF9RVUVVRVMJMiAvKiBudW1iZXIgb2YgUnggcXVldWVzIHN1cHBvcnRlZCAqLworI2RlZmluZSBJWEdCRV9WRl9UUkFOU19WTEFOCTMgLyogSW5kaWNhdGlvbiBvZiBwb3J0IFZMQU4gKi8KKyNkZWZpbmUgSVhHQkVfVkZfREVGX1FVRVVFCTQgLyogRGVmYXVsdCBxdWV1ZSBvZmZzZXQgKi8KKworLyogbWFpbGJveCBBUEksIHZlcnNpb24gMS4yIFZGIHJlcXVlc3RzICovCisjZGVmaW5lIElYR0JFX1ZGX0dFVF9SRVRBCTB4MGEJLyogVkYgcmVxdWVzdCBmb3IgUkVUQSAqLworI2RlZmluZSBJWEdCRV9WRl9HRVRfUlNTX0tFWQkweDBiCS8qIGdldCBSU1MgaGFzaCBrZXkgKi8KIAogLyogbGVuZ3RoIG9mIHBlcm1hbmVudCBhZGRyZXNzIG1lc3NhZ2UgcmV0dXJuZWQgZnJvbSBQRiAqLwotI2RlZmluZSBJWEdCRV9WRl9QRVJNQUREUl9NU0dfTEVOIDQKKyNkZWZpbmUgSVhHQkVfVkZfUEVSTUFERFJfTVNHX0xFTgk0CiAvKiB3b3JkIGluIHBlcm1hbmVudCBhZGRyZXNzIG1lc3NhZ2Ugd2l0aCB0aGUgY3VycmVudCBtdWx0aWNhc3QgdHlwZSAqLwotI2RlZmluZSBJWEdCRV9WRl9NQ19UWVBFX1dPUkQgICAgIDMKKyNkZWZpbmUgSVhHQkVfVkZfTUNfVFlQRV9XT1JECQkzCiAKLSNkZWZpbmUgSVhHQkVfUEZfQ09OVFJPTF9NU0cgICAgICAweDAxMDAgLyogUEYgY29udHJvbCBtZXNzYWdlICovCisjZGVmaW5lIElYR0JFX1BGX0NPTlRST0xfTVNHCQkweDAxMDAgLyogUEYgY29udHJvbCBtZXNzYWdlICovCiAKLSNkZWZpbmUgSVhHQkVfVkZfTUJYX0lOSVRfVElNRU9VVCAyMDAwIC8qIG51bWJlciBvZiByZXRyaWVzIG9uIG1haWxib3ggKi8KLSNkZWZpbmUgSVhHQkVfVkZfTUJYX0lOSVRfREVMQVkgICA1MDAgIC8qIG1pY3Jvc2Vjb25kcyBiZXR3ZWVuIHJldHJpZXMgKi8KKyNkZWZpbmUgSVhHQkVfVkZfTUJYX0lOSVRfVElNRU9VVAkyMDAwIC8qIG51bWJlciBvZiByZXRyaWVzIG9uIG1haWxib3ggKi8KKyNkZWZpbmUgSVhHQkVfVkZfTUJYX0lOSVRfREVMQVkJCTUwMCAgLyogbWljcm9zZWNvbmRzIGJldHdlZW4gcmV0cmllcyAqLwogCiAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBIVyBzdHJ1Y3QgKi8KIHN0cnVjdCBpeGdiZV9odzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvcmVncy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9yZWdzLmgKaW5kZXggM2U3MTJmZC4uMjc2NGZkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9yZWdzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9yZWdzLmgKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIEludGVsIDgyNTk5IFZpcnR1YWwgRnVuY3Rpb24gZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDE1IEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0xMyw4ICsxMyw3IEBACiAgIG1vcmUgZGV0YWlscy4KIAogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIAogICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgpAQCAtMjgsNTggKzI3LDU4IEBACiAjaWZuZGVmIF9JWEdCRVZGX1JFR1NfSF8KICNkZWZpbmUgX0lYR0JFVkZfUkVHU19IXwogCi0jZGVmaW5lIElYR0JFX1ZGQ1RSTCAgICAgICAgICAgMHgwMDAwMAotI2RlZmluZSBJWEdCRV9WRlNUQVRVUyAgICAgICAgIDB4MDAwMDgKLSNkZWZpbmUgSVhHQkVfVkZMSU5LUyAgICAgICAgICAweDAwMDEwCi0jZGVmaW5lIElYR0JFX1ZGRlJUSU1FUiAgICAgICAgMHgwMDA0OAotI2RlZmluZSBJWEdCRV9WRlJYTUVNV1JBUCAgICAgIDB4MDMxOTAKLSNkZWZpbmUgSVhHQkVfVlRFSUNSICAgICAgICAgICAweDAwMTAwCi0jZGVmaW5lIElYR0JFX1ZURUlDUyAgICAgICAgICAgMHgwMDEwNAotI2RlZmluZSBJWEdCRV9WVEVJTVMgICAgICAgICAgIDB4MDAxMDgKLSNkZWZpbmUgSVhHQkVfVlRFSU1DICAgICAgICAgICAweDAwMTBDCi0jZGVmaW5lIElYR0JFX1ZURUlBQyAgICAgICAgICAgMHgwMDExMAotI2RlZmluZSBJWEdCRV9WVEVJQU0gICAgICAgICAgIDB4MDAxMTQKLSNkZWZpbmUgSVhHQkVfVlRFSVRSKHgpICAgICAgICAoMHgwMDgyMCArICg0ICogKHgpKSkKLSNkZWZpbmUgSVhHQkVfVlRJVkFSKHgpICAgICAgICAoMHgwMDEyMCArICg0ICogKHgpKSkKLSNkZWZpbmUgSVhHQkVfVlRJVkFSX01JU0MgICAgICAweDAwMTQwCi0jZGVmaW5lIElYR0JFX1ZUUlNDSU5UKHgpICAgICAgKDB4MDAxODAgKyAoNCAqICh4KSkpCi0jZGVmaW5lIElYR0JFX1ZGUkRCQUwoeCkgICAgICAgKDB4MDEwMDAgKyAoMHg0MCAqICh4KSkpCi0jZGVmaW5lIElYR0JFX1ZGUkRCQUgoeCkgICAgICAgKDB4MDEwMDQgKyAoMHg0MCAqICh4KSkpCi0jZGVmaW5lIElYR0JFX1ZGUkRMRU4oeCkgICAgICAgKDB4MDEwMDggKyAoMHg0MCAqICh4KSkpCi0jZGVmaW5lIElYR0JFX1ZGUkRIKHgpICAgICAgICAgKDB4MDEwMTAgKyAoMHg0MCAqICh4KSkpCi0jZGVmaW5lIElYR0JFX1ZGUkRUKHgpICAgICAgICAgKDB4MDEwMTggKyAoMHg0MCAqICh4KSkpCi0jZGVmaW5lIElYR0JFX1ZGUlhEQ1RMKHgpICAgICAgKDB4MDEwMjggKyAoMHg0MCAqICh4KSkpCi0jZGVmaW5lIElYR0JFX1ZGU1JSQ1RMKHgpICAgICAgKDB4MDEwMTQgKyAoMHg0MCAqICh4KSkpCi0jZGVmaW5lIElYR0JFX1ZGUlNDQ1RMKHgpICAgICAgKDB4MDEwMkMgKyAoMHg0MCAqICh4KSkpCi0jZGVmaW5lIElYR0JFX1ZGUFNSVFlQRSAgICAgICAgMHgwMDMwMAotI2RlZmluZSBJWEdCRV9WRlREQkFMKHgpICAgICAgICgweDAyMDAwICsgKDB4NDAgKiAoeCkpKQotI2RlZmluZSBJWEdCRV9WRlREQkFIKHgpICAgICAgICgweDAyMDA0ICsgKDB4NDAgKiAoeCkpKQotI2RlZmluZSBJWEdCRV9WRlRETEVOKHgpICAgICAgICgweDAyMDA4ICsgKDB4NDAgKiAoeCkpKQotI2RlZmluZSBJWEdCRV9WRlRESCh4KSAgICAgICAgICgweDAyMDEwICsgKDB4NDAgKiAoeCkpKQotI2RlZmluZSBJWEdCRV9WRlREVCh4KSAgICAgICAgICgweDAyMDE4ICsgKDB4NDAgKiAoeCkpKQotI2RlZmluZSBJWEdCRV9WRlRYRENUTCh4KSAgICAgICgweDAyMDI4ICsgKDB4NDAgKiAoeCkpKQotI2RlZmluZSBJWEdCRV9WRlREV0JBTCh4KSAgICAgICgweDAyMDM4ICsgKDB4NDAgKiAoeCkpKQotI2RlZmluZSBJWEdCRV9WRlREV0JBSCh4KSAgICAgICgweDAyMDNDICsgKDB4NDAgKiAoeCkpKQotI2RlZmluZSBJWEdCRV9WRkRDQV9SWENUUkwoeCkgICgweDAxMDBDICsgKDB4NDAgKiAoeCkpKQotI2RlZmluZSBJWEdCRV9WRkRDQV9UWENUUkwoeCkgICgweDAyMDBjICsgKDB4NDAgKiAoeCkpKQotI2RlZmluZSBJWEdCRV9WRkdQUkMgICAgICAgICAgIDB4MDEwMUMKLSNkZWZpbmUgSVhHQkVfVkZHUFRDICAgICAgICAgICAweDAyMDFDCi0jZGVmaW5lIElYR0JFX1ZGR09SQ19MU0IgICAgICAgMHgwMTAyMAotI2RlZmluZSBJWEdCRV9WRkdPUkNfTVNCICAgICAgIDB4MDEwMjQKLSNkZWZpbmUgSVhHQkVfVkZHT1RDX0xTQiAgICAgICAweDAyMDIwCi0jZGVmaW5lIElYR0JFX1ZGR09UQ19NU0IgICAgICAgMHgwMjAyNAotI2RlZmluZSBJWEdCRV9WRk1QUkMgICAgICAgICAgIDB4MDEwMzQKLSNkZWZpbmUgSVhHQkVfVkZNUlFDICAgICAgICAgICAweDMwMDAKLSNkZWZpbmUgSVhHQkVfVkZSU1NSSyh4KSAgICAgICAoMHgzMTAwICsgKCh4KSAqIDQpKQotI2RlZmluZSBJWEdCRV9WRlJFVEEoeCkgICAgICAgICgweDMyMDAgKyAoKHgpICogNCkpCisjZGVmaW5lIElYR0JFX1ZGQ1RSTAkJMHgwMDAwMAorI2RlZmluZSBJWEdCRV9WRlNUQVRVUwkJMHgwMDAwOAorI2RlZmluZSBJWEdCRV9WRkxJTktTCQkweDAwMDEwCisjZGVmaW5lIElYR0JFX1ZGRlJUSU1FUgkJMHgwMDA0OAorI2RlZmluZSBJWEdCRV9WRlJYTUVNV1JBUAkweDAzMTkwCisjZGVmaW5lIElYR0JFX1ZURUlDUgkJMHgwMDEwMAorI2RlZmluZSBJWEdCRV9WVEVJQ1MJCTB4MDAxMDQKKyNkZWZpbmUgSVhHQkVfVlRFSU1TCQkweDAwMTA4CisjZGVmaW5lIElYR0JFX1ZURUlNQwkJMHgwMDEwQworI2RlZmluZSBJWEdCRV9WVEVJQUMJCTB4MDAxMTAKKyNkZWZpbmUgSVhHQkVfVlRFSUFNCQkweDAwMTE0CisjZGVmaW5lIElYR0JFX1ZURUlUUih4KQkJKDB4MDA4MjAgKyAoNCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZUSVZBUih4KQkJKDB4MDAxMjAgKyAoNCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZUSVZBUl9NSVNDCTB4MDAxNDAKKyNkZWZpbmUgSVhHQkVfVlRSU0NJTlQoeCkJKDB4MDAxODAgKyAoNCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUkRCQUwoeCkJKDB4MDEwMDAgKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUkRCQUgoeCkJKDB4MDEwMDQgKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUkRMRU4oeCkJKDB4MDEwMDggKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUkRIKHgpCQkoMHgwMTAxMCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZSRFQoeCkJCSgweDAxMDE4ICsgKDB4NDAgKiAoeCkpKQorI2RlZmluZSBJWEdCRV9WRlJYRENUTCh4KQkoMHgwMTAyOCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZTUlJDVEwoeCkJKDB4MDEwMTQgKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUlNDQ1RMKHgpCSgweDAxMDJDICsgKDB4NDAgKiAoeCkpKQorI2RlZmluZSBJWEdCRV9WRlBTUlRZUEUJCTB4MDAzMDAKKyNkZWZpbmUgSVhHQkVfVkZUREJBTCh4KQkoMHgwMjAwMCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZUREJBSCh4KQkoMHgwMjAwNCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZURExFTih4KQkoMHgwMjAwOCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZUREgoeCkJCSgweDAyMDEwICsgKDB4NDAgKiAoeCkpKQorI2RlZmluZSBJWEdCRV9WRlREVCh4KQkJKDB4MDIwMTggKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGVFhEQ1RMKHgpCSgweDAyMDI4ICsgKDB4NDAgKiAoeCkpKQorI2RlZmluZSBJWEdCRV9WRlREV0JBTCh4KQkoMHgwMjAzOCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZURFdCQUgoeCkJKDB4MDIwM0MgKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGRENBX1JYQ1RSTCh4KQkoMHgwMTAwQyArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZEQ0FfVFhDVFJMKHgpCSgweDAyMDBjICsgKDB4NDAgKiAoeCkpKQorI2RlZmluZSBJWEdCRV9WRkdQUkMJCTB4MDEwMUMKKyNkZWZpbmUgSVhHQkVfVkZHUFRDCQkweDAyMDFDCisjZGVmaW5lIElYR0JFX1ZGR09SQ19MU0IJMHgwMTAyMAorI2RlZmluZSBJWEdCRV9WRkdPUkNfTVNCCTB4MDEwMjQKKyNkZWZpbmUgSVhHQkVfVkZHT1RDX0xTQgkweDAyMDIwCisjZGVmaW5lIElYR0JFX1ZGR09UQ19NU0IJMHgwMjAyNAorI2RlZmluZSBJWEdCRV9WRk1QUkMJCTB4MDEwMzQKKyNkZWZpbmUgSVhHQkVfVkZNUlFDCQkweDMwMDAKKyNkZWZpbmUgSVhHQkVfVkZSU1NSSyh4KQkoMHgzMTAwICsgKCh4KSAqIDQpKQorI2RlZmluZSBJWEdCRV9WRlJFVEEoeCkJCSgweDMyMDAgKyAoKHgpICogNCkpCiAKIC8qIFZGTVJRQyBiaXRzICovCi0jZGVmaW5lIElYR0JFX1ZGTVJRQ19SU1NFTiAgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLyogUlNTIEVuYWJsZSAqLwotI2RlZmluZSBJWEdCRV9WRk1SUUNfUlNTX0ZJRUxEX0lQVjRfVENQIDB4MDAwMTAwMDAKLSNkZWZpbmUgSVhHQkVfVkZNUlFDX1JTU19GSUVMRF9JUFY0ICAgICAweDAwMDIwMDAwCi0jZGVmaW5lIElYR0JFX1ZGTVJRQ19SU1NfRklFTERfSVBWNiAgICAgMHgwMDEwMDAwMAotI2RlZmluZSBJWEdCRV9WRk1SUUNfUlNTX0ZJRUxEX0lQVjZfVENQIDB4MDAyMDAwMDAKKyNkZWZpbmUgSVhHQkVfVkZNUlFDX1JTU0VOCQkweDAwMDAwMDAxICAvKiBSU1MgRW5hYmxlICovCisjZGVmaW5lIElYR0JFX1ZGTVJRQ19SU1NfRklFTERfSVBWNF9UQ1AJMHgwMDAxMDAwMAorI2RlZmluZSBJWEdCRV9WRk1SUUNfUlNTX0ZJRUxEX0lQVjQJMHgwMDAyMDAwMAorI2RlZmluZSBJWEdCRV9WRk1SUUNfUlNTX0ZJRUxEX0lQVjYJMHgwMDEwMDAwMAorI2RlZmluZSBJWEdCRV9WRk1SUUNfUlNTX0ZJRUxEX0lQVjZfVENQCTB4MDAyMDAwMDAKIAotI2RlZmluZSBJWEdCRV9XUklURV9GTFVTSChhKSAoSVhHQkVfUkVBRF9SRUcoYSwgSVhHQkVfVkZTVEFUVVMpKQorI2RlZmluZSBJWEdCRV9XUklURV9GTFVTSChhKQkoSVhHQkVfUkVBRF9SRUcoYSwgSVhHQkVfVkZTVEFUVVMpKQogCiAjZW5kaWYgLyogX0lYR0JFVkZfUkVHU19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi92Zi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi92Zi5jCmluZGV4IGNkYjUzYmUuLmQxMzM5YjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvdmYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL3ZmLmMKQEAgLTEsNyArMSw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAgIEludGVsIDgyNTk5IFZpcnR1YWwgRnVuY3Rpb24gZHJpdmVyCi0gIENvcHlyaWdodChjKSAxOTk5IC0gMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAgQ29weXJpZ2h0KGMpIDE5OTkgLSAyMDE1IEludGVsIENvcnBvcmF0aW9uLgogCiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCkBAIC0xMyw4ICsxMyw3IEBACiAgIG1vcmUgZGV0YWlscy4KIAogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIAogICBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbgogICB0aGUgZmlsZSBjYWxsZWQgIkNPUFlJTkciLgpAQCAtNjUsNyArNjQsNyBAQAogICogIGl4Z2JldmZfcmVzZXRfaHdfdmYgLSBQZXJmb3JtcyBoYXJkd2FyZSByZXNldAogICogIEBodzogcG9pbnRlciB0byBoYXJkd2FyZSBzdHJ1Y3R1cmUKICAqCi0gKiAgUmVzZXRzIHRoZSBoYXJkd2FyZSBieSByZXNldGluZyB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgdW5pdHMsIG1hc2tzIGFuZAorICogIFJlc2V0cyB0aGUgaGFyZHdhcmUgYnkgcmVzZXR0aW5nIHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSB1bml0cywgbWFza3MgYW5kCiAgKiAgY2xlYXJzIGFsbCBpbnRlcnJ1cHRzLgogICoqLwogc3RhdGljIHMzMiBpeGdiZXZmX3Jlc2V0X2h3X3ZmKHN0cnVjdCBpeGdiZV9odyAqaHcpCkBAIC0xMDIsOSArMTAxLDEwIEBACiAKIAltZGVsYXkoMTApOwogCi0JLyogc2V0IG91ciAicGVybV9hZGRyIiBiYXNlZCBvbiBpbmZvIHByb3ZpZGVkIGJ5IFBGICovCi0JLyogYWxzbyBzZXQgdXAgdGhlIG1jX2ZpbHRlcl90eXBlIHdoaWNoIGlzIHBpZ2d5IGJhY2tlZAotCSAqIG9uIHRoZSBtYWMgYWRkcmVzcyBpbiB3b3JkIDMgKi8KKwkvKiBzZXQgb3VyICJwZXJtX2FkZHIiIGJhc2VkIG9uIGluZm8gcHJvdmlkZWQgYnkgUEYKKwkgKiBhbHNvIHNldCB1cCB0aGUgbWNfZmlsdGVyX3R5cGUgd2hpY2ggaXMgcGlnZ3kgYmFja2VkCisJICogb24gdGhlIG1hYyBhZGRyZXNzIGluIHdvcmQgMworCSAqLwogCXJldF92YWwgPSBtYngtPm9wcy5yZWFkX3Bvc3RlZChodywgbXNnYnVmLCBJWEdCRV9WRl9QRVJNQUREUl9NU0dfTEVOKTsKIAlpZiAocmV0X3ZhbCkKIAkJcmV0dXJuIHJldF92YWw7CkBAIC0xMTcsNyArMTE3LDcgQEAKIAkgICAgbXNnYnVmWzBdICE9IChJWEdCRV9WRl9SRVNFVCB8IElYR0JFX1ZUX01TR1RZUEVfTkFDSykpCiAJCXJldHVybiBJWEdCRV9FUlJfSU5WQUxJRF9NQUNfQUREUjsKIAotCW1lbWNweShody0+bWFjLnBlcm1fYWRkciwgYWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShody0+bWFjLnBlcm1fYWRkciwgYWRkcik7CiAJaHctPm1hYy5tY19maWx0ZXJfdHlwZSA9IG1zZ2J1ZltJWEdCRV9WRl9NQ19UWVBFX1dPUkRdOwogCiAJcmV0dXJuIDA7CkBAIC0xMzgsOCArMTM4LDcgQEAKIAl1MzIgcmVnX3ZhbDsKIAl1MTYgaTsKIAotCS8qCi0JICogU2V0IHRoZSBhZGFwdGVyX3N0b3BwZWQgZmxhZyBzbyBvdGhlciBkcml2ZXIgZnVuY3Rpb25zIHN0b3AgdG91Y2hpbmcKKwkvKiBTZXQgdGhlIGFkYXB0ZXJfc3RvcHBlZCBmbGFnIHNvIG90aGVyIGRyaXZlciBmdW5jdGlvbnMgc3RvcCB0b3VjaGluZwogCSAqIHRoZSBoYXJkd2FyZQogCSAqLwogCWh3LT5hZGFwdGVyX3N0b3BwZWQgPSB0cnVlOwpAQCAtMTgyLDcgKzE4MSw3IEBACiAgKgogICogIEV4dHJhY3RzIHRoZSAxMiBiaXRzLCBmcm9tIGEgbXVsdGljYXN0IGFkZHJlc3MsIHRvIGRldGVybWluZSB3aGljaAogICogIGJpdC12ZWN0b3IgdG8gc2V0IGluIHRoZSBtdWx0aWNhc3QgdGFibGUuIFRoZSBoYXJkd2FyZSB1c2VzIDEyIGJpdHMsIGZyb20KLSAqICBpbmNvbWluZyByeCBtdWx0aWNhc3QgYWRkcmVzc2VzLCB0byBkZXRlcm1pbmUgdGhlIGJpdC12ZWN0b3IgdG8gY2hlY2sgaW4KKyAqICBpbmNvbWluZyBSeCBtdWx0aWNhc3QgYWRkcmVzc2VzLCB0byBkZXRlcm1pbmUgdGhlIGJpdC12ZWN0b3IgdG8gY2hlY2sgaW4KICAqICB0aGUgTVRBLiBXaGljaCBvZiB0aGUgNCBjb21iaW5hdGlvbiwgb2YgMTItYml0cywgdGhlIGhhcmR3YXJlIHVzZXMgaXMgc2V0CiAgKiAgYnkgdGhlIE1PIGZpZWxkIG9mIHRoZSBNQ1NUQ1RSTC4gVGhlIE1PIGZpZWxkIGlzIHNldCBkdXJpbmcgaW5pdGlhbGl6YXRpb24KICAqICB0byBtY19maWx0ZXJfdHlwZS4KQEAgLTIyMCw3ICsyMTksNyBAQAogICoqLwogc3RhdGljIHMzMiBpeGdiZXZmX2dldF9tYWNfYWRkcl92ZihzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1OCAqbWFjX2FkZHIpCiB7Ci0JbWVtY3B5KG1hY19hZGRyLCBody0+bWFjLnBlcm1fYWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShtYWNfYWRkciwgaHctPm1hYy5wZXJtX2FkZHIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMzMsOCArMjMyLDcgQEAKIAlzMzIgcmV0X3ZhbDsKIAogCW1lbXNldChtc2didWYsIDAsIHNpemVvZihtc2didWYpKTsKLQkvKgotCSAqIElmIGluZGV4IGlzIG9uZSB0aGVuIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IGxpc3QgYW5kIG5lZWRzCisJLyogSWYgaW5kZXggaXMgb25lIHRoZW4gdGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBuZXcgbGlzdCBhbmQgbmVlZHMKIAkgKiBpbmRpY2F0aW9uIHRvIHRoZSBQRiBzbyBpdCBjYW4gZG8gaXQncyBvd24gbGlzdCBtYW5hZ2VtZW50LgogCSAqIElmIGl0IGlzIHplcm8gdGhlbiB0aGF0IHRlbGxzIHRoZSBQRiB0byBqdXN0IGNsZWFyIGFsbCBvZgogCSAqIHRoaXMgVkYncyBtYWN2bGFucyBhbmQgdGhlcmUgaXMgbm8gbmV3IGxpc3QuCkBAIC0yNDIsNyArMjQwLDcgQEAKIAltc2didWZbMF0gfD0gaW5kZXggPDwgSVhHQkVfVlRfTVNHSU5GT19TSElGVDsKIAltc2didWZbMF0gfD0gSVhHQkVfVkZfU0VUX01BQ1ZMQU47CiAJaWYgKGFkZHIpCi0JCW1lbWNweShtc2dfYWRkciwgYWRkciwgRVRIX0FMRU4pOworCQlldGhlcl9hZGRyX2NvcHkobXNnX2FkZHIsIGFkZHIpOwogCXJldF92YWwgPSBtYngtPm9wcy53cml0ZV9wb3N0ZWQoaHcsIG1zZ2J1ZiwgMyk7CiAKIAlpZiAoIXJldF92YWwpCkBAIC0yNTksNiArMjU3LDEyOSBAQAogfQogCiAvKioKKyAqIGl4Z2JldmZfZ2V0X3JldGFfbG9ja2VkIC0gZ2V0IHRoZSBSU1MgcmVkaXJlY3Rpb24gdGFibGUgKFJFVEEpIGNvbnRlbnRzLgorICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gdGhlIHBvcnQgaGFuZGxlCisgKiBAcmV0YTogYnVmZmVyIHRvIGZpbGwgd2l0aCBSRVRBIGNvbnRlbnRzLgorICogQG51bV9yeF9xdWV1ZXM6IE51bWJlciBvZiBSeCBxdWV1ZXMgY29uZmlndXJlZCBmb3IgdGhpcyBwb3J0CisgKgorICogVGhlICJyZXRhIiBidWZmZXIgc2hvdWxkIGJlIGJpZyBlbm91Z2ggdG8gY29udGFpbiAzMiByZWdpc3RlcnMuCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLgorICogICAgICAgICAgaWYgQVBJIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIG9wZXJhdGlvbiAtICgtRU9QTk9UU1VQUCkuCisgKi8KK2ludCBpeGdiZXZmX2dldF9yZXRhX2xvY2tlZChzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgKnJldGEsIGludCBudW1fcnhfcXVldWVzKQoreworCWludCBlcnIsIGksIGo7CisJdTMyIG1zZ2J1ZltJWEdCRV9WRk1BSUxCT1hfU0laRV07CisJdTMyICpod19yZXRhID0gJm1zZ2J1ZlsxXTsKKwl1MzIgbWFzayA9IDA7CisKKwkvKiBXZSBoYXZlIHRvIHVzZSBhIG1haWxib3ggZm9yIDgyNTk5IGFuZCB4NTQwIGRldmljZXMgb25seS4KKwkgKiBGb3IgdGhlc2UgZGV2aWNlcyBSRVRBIGhhcyAxMjggZW50cmllcy4KKwkgKiBBbHNvIHRoZXNlIFZGcyBzdXBwb3J0IHVwIHRvIDQgUlNTIHF1ZXVlcy4gVGhlcmVmb3JlIFBGIHdpbGwgY29tcHJlc3MKKwkgKiAxNiBSRVRBIGVudHJpZXMgaW4gZWFjaCBEV09SRCBnaXZpbmcgMiBiaXRzIHRvIGVhY2ggZW50cnkuCisJICovCisJaW50IGR3b3JkcyA9IElYR0JFVkZfODI1OTlfUkVUQV9TSVpFIC8gMTY7CisKKwkvKiBXZSBzdXBwb3J0IHRoZSBSU1MgcXVlcnlpbmcgZm9yIDgyNTk5IGFuZCB4NTQwIGRldmljZXMgb25seS4KKwkgKiBUaHVzIHJldHVybiBhbiBlcnJvciBpZiBBUEkgZG9lc24ndCBzdXBwb3J0IFJFVEEgcXVlcnlpbmcgb3IgcXVlcnlpbmcKKwkgKiBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGRldmljZSB0eXBlLgorCSAqLworCWlmIChody0+YXBpX3ZlcnNpb24gIT0gaXhnYmVfbWJveF9hcGlfMTIgfHwKKwkgICAgaHctPm1hYy50eXBlID49IGl4Z2JlX21hY19YNTUwX3ZmKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwltc2didWZbMF0gPSBJWEdCRV9WRl9HRVRfUkVUQTsKKworCWVyciA9IGh3LT5tYngub3BzLndyaXRlX3Bvc3RlZChodywgbXNnYnVmLCAxKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBody0+bWJ4Lm9wcy5yZWFkX3Bvc3RlZChodywgbXNnYnVmLCBkd29yZHMgKyAxKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwltc2didWZbMF0gJj0gfklYR0JFX1ZUX01TR1RZUEVfQ1RTOworCisJLyogSWYgdGhlIG9wZXJhdGlvbiBoYXMgYmVlbiByZWZ1c2VkIGJ5IGEgUEYgcmV0dXJuIC1FUEVSTSAqLworCWlmIChtc2didWZbMF0gPT0gKElYR0JFX1ZGX0dFVF9SRVRBIHwgSVhHQkVfVlRfTVNHVFlQRV9OQUNLKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qIElmIHdlIGRpZG4ndCBnZXQgYW4gQUNLIHRoZXJlIG11c3QgaGF2ZSBiZWVuCisJICogc29tZSBzb3J0IG9mIG1haWxib3ggZXJyb3Igc28gd2Ugc2hvdWxkIHRyZWF0IGl0CisJICogYXMgc3VjaC4KKwkgKi8KKwlpZiAobXNnYnVmWzBdICE9IChJWEdCRV9WRl9HRVRfUkVUQSB8IElYR0JFX1ZUX01TR1RZUEVfQUNLKSkKKwkJcmV0dXJuIElYR0JFX0VSUl9NQlg7CisKKwkvKiBpeGdiZXZmIGRvZXNuJ3Qgc3VwcG9ydCBtb3JlIHRoYW4gMiBxdWV1ZXMgYXQgdGhlIG1vbWVudCAqLworCWlmIChudW1fcnhfcXVldWVzID4gMSkKKwkJbWFzayA9IDB4MTsKKworCWZvciAoaSA9IDA7IGkgPCBkd29yZHM7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisJCQlyZXRhW2kgKiAxNiArIGpdID0gKGh3X3JldGFbaV0gPj4gKDIgKiBqKSkgJiBtYXNrOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaXhnYmV2Zl9nZXRfcnNzX2tleV9sb2NrZWQgLSBnZXQgdGhlIFJTUyBSYW5kb20gS2V5CisgKiBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQorICogQHJzc19rZXk6IGJ1ZmZlciB0byBmaWxsIHdpdGggUlNTIEhhc2ggS2V5IGNvbnRlbnRzLgorICoKKyAqIFRoZSAicnNzX2tleSIgYnVmZmVyIHNob3VsZCBiZSBiaWcgZW5vdWdoIHRvIGNvbnRhaW4gMTAgcmVnaXN0ZXJzLgorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgIGlmIEFQSSBkb2Vzbid0IHN1cHBvcnQgdGhpcyBvcGVyYXRpb24gLSAoLUVPUE5PVFNVUFApLgorICovCitpbnQgaXhnYmV2Zl9nZXRfcnNzX2tleV9sb2NrZWQoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggKnJzc19rZXkpCit7CisJaW50IGVycjsKKwl1MzIgbXNnYnVmW0lYR0JFX1ZGTUFJTEJPWF9TSVpFXTsKKworCS8qIFdlIGN1cnJlbnRseSBzdXBwb3J0IHRoZSBSU1MgUmFuZG9tIEtleSByZXRyaWV2YWwgZm9yIDgyNTk5IGFuZCB4NTQwCisJICogZGV2aWNlcyBvbmx5LgorCSAqCisJICogVGh1cyByZXR1cm4gYW4gZXJyb3IgaWYgQVBJIGRvZXNuJ3Qgc3VwcG9ydCBSU1MgUmFuZG9tIEtleSByZXRyaWV2YWwKKwkgKiBvciBpZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgZGV2aWNlIHR5cGUuCisJICovCisJaWYgKGh3LT5hcGlfdmVyc2lvbiAhPSBpeGdiZV9tYm94X2FwaV8xMiB8fAorCSAgICBody0+bWFjLnR5cGUgPj0gaXhnYmVfbWFjX1g1NTBfdmYpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCW1zZ2J1ZlswXSA9IElYR0JFX1ZGX0dFVF9SU1NfS0VZOworCWVyciA9IGh3LT5tYngub3BzLndyaXRlX3Bvc3RlZChodywgbXNnYnVmLCAxKTsKKworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBody0+bWJ4Lm9wcy5yZWFkX3Bvc3RlZChodywgbXNnYnVmLCAxMSk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJbXNnYnVmWzBdICY9IH5JWEdCRV9WVF9NU0dUWVBFX0NUUzsKKworCS8qIElmIHRoZSBvcGVyYXRpb24gaGFzIGJlZW4gcmVmdXNlZCBieSBhIFBGIHJldHVybiAtRVBFUk0gKi8KKwlpZiAobXNnYnVmWzBdID09IChJWEdCRV9WRl9HRVRfUkVUQSB8IElYR0JFX1ZUX01TR1RZUEVfTkFDSykpCisJCXJldHVybiAtRVBFUk07CisKKwkvKiBJZiB3ZSBkaWRuJ3QgZ2V0IGFuIEFDSyB0aGVyZSBtdXN0IGhhdmUgYmVlbgorCSAqIHNvbWUgc29ydCBvZiBtYWlsYm94IGVycm9yIHNvIHdlIHNob3VsZCB0cmVhdCBpdAorCSAqIGFzIHN1Y2guCisJICovCisJaWYgKG1zZ2J1ZlswXSAhPSAoSVhHQkVfVkZfR0VUX1JTU19LRVkgfCBJWEdCRV9WVF9NU0dUWVBFX0FDSykpCisJCXJldHVybiBJWEdCRV9FUlJfTUJYOworCisJbWVtY3B5KHJzc19rZXksIG1zZ2J1ZiArIDEsIElYR0JFVkZfUlNTX0hBU0hfS0VZX1NJWkUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgogICogIGl4Z2JldmZfc2V0X3Jhcl92ZiAtIHNldCBkZXZpY2UgTUFDIGFkZHJlc3MKICAqICBAaHc6IHBvaW50ZXIgdG8gaGFyZHdhcmUgc3RydWN0dXJlCiAgKiAgQGluZGV4OiBSZWNlaXZlIGFkZHJlc3MgcmVnaXN0ZXIgdG8gd3JpdGUKQEAgLTI3NSw3ICszOTYsNyBAQAogCiAJbWVtc2V0KG1zZ2J1ZiwgMCwgc2l6ZW9mKG1zZ2J1ZikpOwogCW1zZ2J1ZlswXSA9IElYR0JFX1ZGX1NFVF9NQUNfQUREUjsKLQltZW1jcHkobXNnX2FkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkobXNnX2FkZHIsIGFkZHIpOwogCXJldF92YWwgPSBtYngtPm9wcy53cml0ZV9wb3N0ZWQoaHcsIG1zZ2J1ZiwgMyk7CiAKIAlpZiAoIXJldF92YWwpCkBAIC0yOTIsNyArNDEzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgaXhnYmV2Zl93cml0ZV9tc2dfcmVhZF9hY2soc3RydWN0IGl4Z2JlX2h3ICpodywKLQkJCQkJdTMyICptc2csIHUxNiBzaXplKQorCQkJCSAgICAgICB1MzIgKm1zZywgdTE2IHNpemUpCiB7CiAJc3RydWN0IGl4Z2JlX21ieF9pbmZvICptYnggPSAmaHctPm1ieDsKIAl1MzIgcmV0bXNnW0lYR0JFX1ZGTUFJTEJPWF9TSVpFXTsKQEAgLTM0OCw3ICs0NjksNyBAQAogfQogCiAvKioKLSAqICBpeGdiZXZmX3NldF92ZnRhX3ZmIC0gU2V0L1Vuc2V0IHZsYW4gZmlsdGVyIHRhYmxlIGFkZHJlc3MKKyAqICBpeGdiZXZmX3NldF92ZnRhX3ZmIC0gU2V0L1Vuc2V0IFZMQU4gZmlsdGVyIHRhYmxlIGFkZHJlc3MKICAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQogICogIEB2bGFuOiAxMiBiaXQgVkxBTiBJRAogICogIEB2aW5kOiB1bnVzZWQgYnkgVkYgZHJpdmVycwpAQCAtNDYyLDcgKzU4Myw4IEBACiAJfQogCiAJLyogaWYgdGhlIHJlYWQgZmFpbGVkIGl0IGNvdWxkIGp1c3QgYmUgYSBtYWlsYm94IGNvbGxpc2lvbiwgYmVzdCB3YWl0Ci0JICogdW50aWwgd2UgYXJlIGNhbGxlZCBhZ2FpbiBhbmQgZG9uJ3QgcmVwb3J0IGFuIGVycm9yICovCisJICogdW50aWwgd2UgYXJlIGNhbGxlZCBhZ2FpbiBhbmQgZG9uJ3QgcmVwb3J0IGFuIGVycm9yCisJICovCiAJaWYgKG1ieC0+b3BzLnJlYWQoaHcsICZpbl9tc2csIDEpKQogCQlnb3RvIG91dDsKIApAQCAtNDgwLDcgKzYwMiw4IEBACiAJfQogCiAJLyogaWYgd2UgcGFzc2VkIGFsbCB0aGUgdGVzdHMgYWJvdmUgdGhlbiB0aGUgbGluayBpcyB1cCBhbmQgd2Ugbm8KLQkgKiBsb25nZXIgbmVlZCB0byBjaGVjayBmb3IgbGluayAqLworCSAqIGxvbmdlciBuZWVkIHRvIGNoZWNrIGZvciBsaW5rCisJICovCiAJbWFjLT5nZXRfbGlua19zdGF0dXMgPSBmYWxzZTsKIAogb3V0OgpAQCAtNTQ1LDYgKzY2OCw3IEBACiAJLyogZG8gbm90aGluZyBpZiBBUEkgZG9lc24ndCBzdXBwb3J0IGl4Z2JldmZfZ2V0X3F1ZXVlcyAqLwogCXN3aXRjaCAoaHctPmFwaV92ZXJzaW9uKSB7CiAJY2FzZSBpeGdiZV9tYm94X2FwaV8xMToKKwljYXNlIGl4Z2JlX21ib3hfYXBpXzEyOgogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKQEAgLTU2MSw4ICs2ODUsNyBAQAogCWlmICghZXJyKSB7CiAJCW1zZ1swXSAmPSB+SVhHQkVfVlRfTVNHVFlQRV9DVFM7CiAKLQkJLyoKLQkJICogaWYgd2Ugd2UgZGlkbid0IGdldCBhbiBBQ0sgdGhlcmUgbXVzdCBoYXZlIGJlZW4KKwkJLyogaWYgd2Ugd2UgZGlkbid0IGdldCBhbiBBQ0sgdGhlcmUgbXVzdCBoYXZlIGJlZW4KIAkJICogc29tZSBzb3J0IG9mIG1haWxib3ggZXJyb3Igc28gd2Ugc2hvdWxkIHRyZWF0IGl0CiAJCSAqIGFzIHN1Y2gKIAkJICovCkBAIC01OTUsMTcgKzcxOCwxNyBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGl4Z2JlX21hY19vcGVyYXRpb25zIGl4Z2JldmZfbWFjX29wcyA9IHsKLQkuaW5pdF9odyAgICAgICAgICAgICA9IGl4Z2JldmZfaW5pdF9od192ZiwKLQkucmVzZXRfaHcgICAgICAgICAgICA9IGl4Z2JldmZfcmVzZXRfaHdfdmYsCi0JLnN0YXJ0X2h3ICAgICAgICAgICAgPSBpeGdiZXZmX3N0YXJ0X2h3X3ZmLAotCS5nZXRfbWFjX2FkZHIgICAgICAgID0gaXhnYmV2Zl9nZXRfbWFjX2FkZHJfdmYsCi0JLnN0b3BfYWRhcHRlciAgICAgICAgPSBpeGdiZXZmX3N0b3BfaHdfdmYsCi0JLnNldHVwX2xpbmsgICAgICAgICAgPSBpeGdiZXZmX3NldHVwX21hY19saW5rX3ZmLAotCS5jaGVja19saW5rICAgICAgICAgID0gaXhnYmV2Zl9jaGVja19tYWNfbGlua192ZiwKLQkuc2V0X3JhciAgICAgICAgICAgICA9IGl4Z2JldmZfc2V0X3Jhcl92ZiwKLQkudXBkYXRlX21jX2FkZHJfbGlzdCA9IGl4Z2JldmZfdXBkYXRlX21jX2FkZHJfbGlzdF92ZiwKLQkuc2V0X3VjX2FkZHIgICAgICAgICA9IGl4Z2JldmZfc2V0X3VjX2FkZHJfdmYsCi0JLnNldF92ZnRhICAgICAgICAgICAgPSBpeGdiZXZmX3NldF92ZnRhX3ZmLAorCS5pbml0X2h3CQk9IGl4Z2JldmZfaW5pdF9od192ZiwKKwkucmVzZXRfaHcJCT0gaXhnYmV2Zl9yZXNldF9od192ZiwKKwkuc3RhcnRfaHcJCT0gaXhnYmV2Zl9zdGFydF9od192ZiwKKwkuZ2V0X21hY19hZGRyCQk9IGl4Z2JldmZfZ2V0X21hY19hZGRyX3ZmLAorCS5zdG9wX2FkYXB0ZXIJCT0gaXhnYmV2Zl9zdG9wX2h3X3ZmLAorCS5zZXR1cF9saW5rCQk9IGl4Z2JldmZfc2V0dXBfbWFjX2xpbmtfdmYsCisJLmNoZWNrX2xpbmsJCT0gaXhnYmV2Zl9jaGVja19tYWNfbGlua192ZiwKKwkuc2V0X3JhcgkJPSBpeGdiZXZmX3NldF9yYXJfdmYsCisJLnVwZGF0ZV9tY19hZGRyX2xpc3QJPSBpeGdiZXZmX3VwZGF0ZV9tY19hZGRyX2xpc3RfdmYsCisJLnNldF91Y19hZGRyCQk9IGl4Z2JldmZfc2V0X3VjX2FkZHJfdmYsCisJLnNldF92ZnRhCQk9IGl4Z2JldmZfc2V0X3ZmdGFfdmYsCiB9OwogCiBjb25zdCBzdHJ1Y3QgaXhnYmV2Zl9pbmZvIGl4Z2JldmZfODI1OTlfdmZfaW5mbyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvdmYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvdmYuaAppbmRleCA1YjE3MjQyLi5kNDBmMDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL3ZmLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi92Zi5oCkBAIC0xLDcgKzEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAogICBJbnRlbCA4MjU5OSBWaXJ0dWFsIEZ1bmN0aW9uIGRyaXZlcgotICBDb3B5cmlnaHQoYykgMTk5OSAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uCisgIENvcHlyaWdodChjKSAxOTk5IC0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbi4KIAogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLApAQCAtMTMsOCArMTMsNyBAQAogICBtb3JlIGRldGFpbHMuCiAKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAgNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAKICAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KICAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KQEAgLTE2OSw3ICsxNjgsNyBAQAogfTsKIAogc3RydWN0IGl4Z2JldmZfaW5mbyB7Ci0JZW51bSBpeGdiZV9tYWNfdHlwZQkJbWFjOworCWVudW0gaXhnYmVfbWFjX3R5cGUgbWFjOwogCWNvbnN0IHN0cnVjdCBpeGdiZV9tYWNfb3BlcmF0aW9ucyAqbWFjX29wczsKIH07CiAKQEAgLTE4NSwyOCArMTg0LDMyIEBACiAJCXJldHVybjsKIAl3cml0ZWwodmFsdWUsIHJlZ19hZGRyICsgcmVnKTsKIH0KKwogI2RlZmluZSBJWEdCRV9XUklURV9SRUcoaCwgciwgdikgaXhnYmVfd3JpdGVfcmVnKGgsIHIsIHYpCiAKIHUzMiBpeGdiZXZmX3JlYWRfcmVnKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUzMiByZWcpOwogI2RlZmluZSBJWEdCRV9SRUFEX1JFRyhoLCByKSBpeGdiZXZmX3JlYWRfcmVnKGgsIHIpCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpeGdiZV93cml0ZV9yZWdfYXJyYXkoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIHJlZywKLQkJCQkJICB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpCisJCQkJCSB1MzIgb2Zmc2V0LCB1MzIgdmFsdWUpCiB7CiAJaXhnYmVfd3JpdGVfcmVnKGh3LCByZWcgKyAob2Zmc2V0IDw8IDIpLCB2YWx1ZSk7CiB9CisKICNkZWZpbmUgSVhHQkVfV1JJVEVfUkVHX0FSUkFZKGgsIHIsIG8sIHYpIGl4Z2JlX3dyaXRlX3JlZ19hcnJheShoLCByLCBvLCB2KQogCiBzdGF0aWMgaW5saW5lIHUzMiBpeGdiZV9yZWFkX3JlZ19hcnJheShzdHJ1Y3QgaXhnYmVfaHcgKmh3LCB1MzIgcmVnLAotCQkJCQl1MzIgb2Zmc2V0KQorCQkJCSAgICAgICB1MzIgb2Zmc2V0KQogewogCXJldHVybiBpeGdiZXZmX3JlYWRfcmVnKGh3LCByZWcgKyAob2Zmc2V0IDw8IDIpKTsKIH0KKwogI2RlZmluZSBJWEdCRV9SRUFEX1JFR19BUlJBWShoLCByLCBvKSBpeGdiZV9yZWFkX3JlZ19hcnJheShoLCByLCBvKQogCiB2b2lkIGl4Z2JldmZfcmxwbWxfc2V0X3ZmKHN0cnVjdCBpeGdiZV9odyAqaHcsIHUxNiBtYXhfc2l6ZSk7CiBpbnQgaXhnYmV2Zl9uZWdvdGlhdGVfYXBpX3ZlcnNpb24oc3RydWN0IGl4Z2JlX2h3ICpodywgaW50IGFwaSk7CiBpbnQgaXhnYmV2Zl9nZXRfcXVldWVzKHN0cnVjdCBpeGdiZV9odyAqaHcsIHVuc2lnbmVkIGludCAqbnVtX3RjcywKIAkJICAgICAgIHVuc2lnbmVkIGludCAqZGVmYXVsdF90Yyk7CitpbnQgaXhnYmV2Zl9nZXRfcmV0YV9sb2NrZWQoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyICpyZXRhLCBpbnQgbnVtX3J4X3F1ZXVlcyk7CitpbnQgaXhnYmV2Zl9nZXRfcnNzX2tleV9sb2NrZWQoc3RydWN0IGl4Z2JlX2h3ICpodywgdTggKnJzc19rZXkpOwogI2VuZGlmIC8qIF9fSVhHQkVfVkZfSF9fICovCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212bmV0YS5jCmluZGV4IDk2MjA4ZjEuLmNlNWY3ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZuZXRhLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdm5ldGEuYwpAQCAtMTAwLDYgKzEwMCw4IEBACiAjZGVmaW5lIE1WTkVUQV9UWFFfQ01EICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNDQ4CiAjZGVmaW5lICAgICAgTVZORVRBX1RYUV9ESVNBQkxFX1NISUZUICAgICAgICAgICAgOAogI2RlZmluZSAgICAgIE1WTkVUQV9UWFFfRU5BQkxFX01BU0sgICAgICAgICAgICAgIDB4MDAwMDAwZmYKKyNkZWZpbmUgTVZORVRBX0dNQUNfQ0xPQ0tfRElWSURFUiAgICAgICAgICAgICAgICAweDI0ZjQKKyNkZWZpbmUgICAgICBNVk5FVEFfR01BQ18xTVNfQ0xPQ0tfRU5BQkxFICAgICAgICBCSVQoMzEpCiAjZGVmaW5lIE1WTkVUQV9BQ0NfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNTAwCiAjZGVmaW5lIE1WTkVUQV9DUFVfTUFQKGNwdSkgICAgICAgICAgICAgICAgICAgICAgKDB4MjU0MCArICgoY3B1KSA8PCAyKSkKICNkZWZpbmUgICAgICBNVk5FVEFfQ1BVX1JYUV9BQ0NFU1NfQUxMX01BU0sgICAgICAweDAwMDAwMGZmCkBAIC0xMjIsNiArMTI0LDcgQEAKICNkZWZpbmUgICAgICBNVk5FVEFfVFhfSU5UUl9NQVNLX0FMTCAgICAgICAgICAgICAoMHhmZiA8PCAwKQogI2RlZmluZSAgICAgIE1WTkVUQV9SWF9JTlRSX01BU0sobnJfcnhxcykgICAgICAgICgoKDEgPDwgbnJfcnhxcykgLSAxKSA8PCA4KQogI2RlZmluZSAgICAgIE1WTkVUQV9SWF9JTlRSX01BU0tfQUxMICAgICAgICAgICAgICgweGZmIDw8IDgpCisjZGVmaW5lICAgICAgTVZORVRBX01JU0NJTlRSX0lOVFJfTUFTSyAgICAgICAgICAgQklUKDMxKQogCiAjZGVmaW5lIE1WTkVUQV9JTlRSX09MRF9DQVVTRSAgICAgICAgICAgICAgICAgICAgMHgyNWE4CiAjZGVmaW5lIE1WTkVUQV9JTlRSX09MRF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgyNWFjCkBAIC0xNjUsNiArMTY4LDcgQEAKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQ19NQVhfUlhfU0laRV9NQVNLICAgICAgICAweDdmZmMKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQzBfUE9SVF9FTkFCTEUgICAgICAgICAgICBCSVQoMCkKICNkZWZpbmUgTVZORVRBX0dNQUNfQ1RSTF8yICAgICAgICAgICAgICAgICAgICAgICAweDJjMDgKKyNkZWZpbmUgICAgICBNVk5FVEFfR01BQzJfSU5CQU5EX0FOX0VOQUJMRSAgICAgICBCSVQoMCkKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQzJfUENTX0VOQUJMRSAgICAgICAgICAgICBCSVQoMykKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQzJfUE9SVF9SR01JSSAgICAgICAgICAgICBCSVQoNCkKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQzJfUE9SVF9SRVNFVCAgICAgICAgICAgICBCSVQoNikKQEAgLTE4MCw5ICsxODQsMTEgQEAKICNkZWZpbmUgTVZORVRBX0dNQUNfQVVUT05FR19DT05GSUcgICAgICAgICAgICAgICAweDJjMGMKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQ19GT1JDRV9MSU5LX0RPV04gICAgICAgICBCSVQoMCkKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQ19GT1JDRV9MSU5LX1BBU1MgICAgICAgICBCSVQoMSkKKyNkZWZpbmUgICAgICBNVk5FVEFfR01BQ19JTkJBTkRfQU5fRU5BQkxFICAgICAgICBCSVQoMikKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQ19DT05GSUdfTUlJX1NQRUVEICAgICAgICBCSVQoNSkKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQ19DT05GSUdfR01JSV9TUEVFRCAgICAgICBCSVQoNikKICNkZWZpbmUgICAgICBNVk5FVEFfR01BQ19BTl9TUEVFRF9FTiAgICAgICAgICAgICBCSVQoNykKKyNkZWZpbmUgICAgICBNVk5FVEFfR01BQ19BTl9GTE9XX0NUUkxfRU4gICAgICAgICBCSVQoMTEpCiAjZGVmaW5lICAgICAgTVZORVRBX0dNQUNfQ09ORklHX0ZVTExfRFVQTEVYICAgICAgQklUKDEyKQogI2RlZmluZSAgICAgIE1WTkVUQV9HTUFDX0FOX0RVUExFWF9FTiAgICAgICAgICAgIEJJVCgxMykKICNkZWZpbmUgTVZORVRBX01JQl9DT1VOVEVSU19CQVNFICAgICAgICAgICAgICAgICAweDMwODAKQEAgLTMwNCw2ICszMTAsNyBAQAogCXVuc2lnbmVkIGludCBsaW5rOwogCXVuc2lnbmVkIGludCBkdXBsZXg7CiAJdW5zaWduZWQgaW50IHNwZWVkOworCWludCB1c2VfaW5iYW5kX3N0YXR1czoxOwogfTsKIAogLyogVGhlIG12bmV0YV90eF9kZXNjIGFuZCBtdm5ldGFfcnhfZGVzYyBzdHJ1Y3R1cmVzIGRlc2NyaWJlIHRoZQpAQCAtOTk0LDYgKzEwMDEsMjAgQEAKIAl2YWwgJj0gfk1WTkVUQV9QSFlfUE9MTElOR19FTkFCTEU7CiAJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9VTklUX0NPTlRST0wsIHZhbCk7CiAKKwlpZiAocHAtPnVzZV9pbmJhbmRfc3RhdHVzKSB7CisJCXZhbCA9IG12cmVnX3JlYWQocHAsIE1WTkVUQV9HTUFDX0FVVE9ORUdfQ09ORklHKTsKKwkJdmFsICY9IH4oTVZORVRBX0dNQUNfRk9SQ0VfTElOS19QQVNTIHwKKwkJCSBNVk5FVEFfR01BQ19GT1JDRV9MSU5LX0RPV04gfAorCQkJIE1WTkVUQV9HTUFDX0FOX0ZMT1dfQ1RSTF9FTik7CisJCXZhbCB8PSBNVk5FVEFfR01BQ19JTkJBTkRfQU5fRU5BQkxFIHwKKwkJICAgICAgIE1WTkVUQV9HTUFDX0FOX1NQRUVEX0VOIHwKKwkJICAgICAgIE1WTkVUQV9HTUFDX0FOX0RVUExFWF9FTjsKKwkJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9HTUFDX0FVVE9ORUdfQ09ORklHLCB2YWwpOworCQl2YWwgPSBtdnJlZ19yZWFkKHBwLCBNVk5FVEFfR01BQ19DTE9DS19ESVZJREVSKTsKKwkJdmFsIHw9IE1WTkVUQV9HTUFDXzFNU19DTE9DS19FTkFCTEU7CisJCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfR01BQ19DTE9DS19ESVZJREVSLCB2YWwpOworCX0KKwogCW12bmV0YV9zZXRfdWNhc3RfdGFibGUocHAsIC0xKTsKIAltdm5ldGFfc2V0X3NwZWNpYWxfbWNhc3RfdGFibGUocHAsIC0xKTsKIAltdm5ldGFfc2V0X290aGVyX21jYXN0X3RhYmxlKHBwLCAtMSk7CkBAIC0yMDQzLDYgKzIwNjQsMjggQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyBpbnQgbXZuZXRhX2ZpeGVkX2xpbmtfdXBkYXRlKHN0cnVjdCBtdm5ldGFfcG9ydCAqcHAsCisJCQkJICAgIHN0cnVjdCBwaHlfZGV2aWNlICpwaHkpCit7CisJc3RydWN0IGZpeGVkX3BoeV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBmaXhlZF9waHlfc3RhdHVzIGNoYW5nZWQgPSB7fTsKKwl1MzIgZ21hY19zdGF0ID0gbXZyZWdfcmVhZChwcCwgTVZORVRBX0dNQUNfU1RBVFVTKTsKKworCXN0YXR1cy5saW5rID0gISEoZ21hY19zdGF0ICYgTVZORVRBX0dNQUNfTElOS19VUCk7CisJaWYgKGdtYWNfc3RhdCAmIE1WTkVUQV9HTUFDX1NQRUVEXzEwMDApCisJCXN0YXR1cy5zcGVlZCA9IFNQRUVEXzEwMDA7CisJZWxzZSBpZiAoZ21hY19zdGF0ICYgTVZORVRBX0dNQUNfU1BFRURfMTAwKQorCQlzdGF0dXMuc3BlZWQgPSBTUEVFRF8xMDA7CisJZWxzZQorCQlzdGF0dXMuc3BlZWQgPSBTUEVFRF8xMDsKKwlzdGF0dXMuZHVwbGV4ID0gISEoZ21hY19zdGF0ICYgTVZORVRBX0dNQUNfRlVMTF9EVVBMRVgpOworCWNoYW5nZWQubGluayA9IDE7CisJY2hhbmdlZC5zcGVlZCA9IDE7CisJY2hhbmdlZC5kdXBsZXggPSAxOworCWZpeGVkX3BoeV91cGRhdGVfc3RhdGUocGh5LCAmc3RhdHVzLCAmY2hhbmdlZCk7CisJcmV0dXJuIDA7Cit9CisKIC8qIE5BUEkgaGFuZGxlcgogICogQml0cyAwIC0gNyBvZiB0aGUgY2F1c2VSeFR4IHJlZ2lzdGVyIGluZGljYXRlIHRoYXQgYXJlIHRyYW5zbWl0dGVkCiAgKiBwYWNrZXRzIG9uIHRoZSBjb3JyZXNwb25kaW5nIFRYUSAoQml0IDAgaXMgZm9yIFRYIHF1ZXVlIDEpLgpAQCAtMjA2Myw4ICsyMTA2LDE4IEBACiAJfQogCiAJLyogUmVhZCBjYXVzZSByZWdpc3RlciAqLwotCWNhdXNlX3J4X3R4ID0gbXZyZWdfcmVhZChwcCwgTVZORVRBX0lOVFJfTkVXX0NBVVNFKSAmCi0JCShNVk5FVEFfUlhfSU5UUl9NQVNLKHJ4cV9udW1iZXIpIHwgTVZORVRBX1RYX0lOVFJfTUFTSyh0eHFfbnVtYmVyKSk7CisJY2F1c2VfcnhfdHggPSBtdnJlZ19yZWFkKHBwLCBNVk5FVEFfSU5UUl9ORVdfQ0FVU0UpOworCWlmIChjYXVzZV9yeF90eCAmIE1WTkVUQV9NSVNDSU5UUl9JTlRSX01BU0spIHsKKwkJdTMyIGNhdXNlX21pc2MgPSBtdnJlZ19yZWFkKHBwLCBNVk5FVEFfSU5UUl9NSVNDX0NBVVNFKTsKKworCQltdnJlZ193cml0ZShwcCwgTVZORVRBX0lOVFJfTUlTQ19DQVVTRSwgMCk7CisJCWlmIChwcC0+dXNlX2luYmFuZF9zdGF0dXMgJiYgKGNhdXNlX21pc2MgJgorCQkJCShNVk5FVEFfQ0FVU0VfUEhZX1NUQVRVU19DSEFOR0UgfAorCQkJCSBNVk5FVEFfQ0FVU0VfTElOS19DSEFOR0UgfAorCQkJCSBNVk5FVEFfQ0FVU0VfUFNDX1NZTkNfQ0hBTkdFKSkpIHsKKwkJCW12bmV0YV9maXhlZF9saW5rX3VwZGF0ZShwcCwgcHAtPnBoeV9kZXYpOworCQl9CisJfQogCiAJLyogUmVsZWFzZSBUeCBkZXNjcmlwdG9ycyAqLwogCWlmIChjYXVzZV9yeF90eCAmIE1WTkVUQV9UWF9JTlRSX01BU0tfQUxMKSB7CkBAIC0yMTA5LDcgKzIxNjIsOSBAQAogCQluYXBpX2NvbXBsZXRlKG5hcGkpOwogCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfSU5UUl9ORVdfTUFTSywKLQkJCSAgICBNVk5FVEFfUlhfSU5UUl9NQVNLKHJ4cV9udW1iZXIpIHwgTVZORVRBX1RYX0lOVFJfTUFTSyh0eHFfbnVtYmVyKSk7CisJCQkgICAgTVZORVRBX1JYX0lOVFJfTUFTSyhyeHFfbnVtYmVyKSB8CisJCQkgICAgTVZORVRBX1RYX0lOVFJfTUFTSyh0eHFfbnVtYmVyKSB8CisJCQkgICAgTVZORVRBX01JU0NJTlRSX0lOVFJfTUFTSyk7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiAKQEAgLTIzNzMsNyArMjQyOCwxMyBAQAogCiAJLyogVW5tYXNrIGludGVycnVwdHMgKi8KIAltdnJlZ193cml0ZShwcCwgTVZORVRBX0lOVFJfTkVXX01BU0ssCi0JCSAgICBNVk5FVEFfUlhfSU5UUl9NQVNLKHJ4cV9udW1iZXIpIHwgTVZORVRBX1RYX0lOVFJfTUFTSyh0eHFfbnVtYmVyKSk7CisJCSAgICBNVk5FVEFfUlhfSU5UUl9NQVNLKHJ4cV9udW1iZXIpIHwKKwkJICAgIE1WTkVUQV9UWF9JTlRSX01BU0sodHhxX251bWJlcikgfAorCQkgICAgTVZORVRBX01JU0NJTlRSX0lOVFJfTUFTSyk7CisJbXZyZWdfd3JpdGUocHAsIE1WTkVUQV9JTlRSX01JU0NfTUFTSywKKwkJICAgIE1WTkVUQV9DQVVTRV9QSFlfU1RBVFVTX0NIQU5HRSB8CisJCSAgICBNVk5FVEFfQ0FVU0VfTElOS19DSEFOR0UgfAorCQkgICAgTVZORVRBX0NBVVNFX1BTQ19TWU5DX0NIQU5HRSk7CiAKIAlwaHlfc3RhcnQocHAtPnBoeV9kZXYpOwogCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMocHAtPmRldik7CkBAIC0yNTIzLDkgKzI1ODQsNyBAQAogCQkJdmFsID0gbXZyZWdfcmVhZChwcCwgTVZORVRBX0dNQUNfQVVUT05FR19DT05GSUcpOwogCQkJdmFsICY9IH4oTVZORVRBX0dNQUNfQ09ORklHX01JSV9TUEVFRCB8CiAJCQkJIE1WTkVUQV9HTUFDX0NPTkZJR19HTUlJX1NQRUVEIHwKLQkJCQkgTVZORVRBX0dNQUNfQ09ORklHX0ZVTExfRFVQTEVYIHwKLQkJCQkgTVZORVRBX0dNQUNfQU5fU1BFRURfRU4gfAotCQkJCSBNVk5FVEFfR01BQ19BTl9EVVBMRVhfRU4pOworCQkJCSBNVk5FVEFfR01BQ19DT05GSUdfRlVMTF9EVVBMRVgpOwogCiAJCQlpZiAocGh5ZGV2LT5kdXBsZXgpCiAJCQkJdmFsIHw9IE1WTkVUQV9HTUFDX0NPTkZJR19GVUxMX0RVUExFWDsKQEAgLTI1NTQsMTIgKzI2MTMsMjQgQEAKIAogCWlmIChzdGF0dXNfY2hhbmdlKSB7CiAJCWlmIChwaHlkZXYtPmxpbmspIHsKLQkJCXUzMiB2YWwgPSBtdnJlZ19yZWFkKHBwLCBNVk5FVEFfR01BQ19BVVRPTkVHX0NPTkZJRyk7Ci0JCQl2YWwgfD0gKE1WTkVUQV9HTUFDX0ZPUkNFX0xJTktfUEFTUyB8Ci0JCQkJTVZORVRBX0dNQUNfRk9SQ0VfTElOS19ET1dOKTsKLQkJCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfR01BQ19BVVRPTkVHX0NPTkZJRywgdmFsKTsKKwkJCWlmICghcHAtPnVzZV9pbmJhbmRfc3RhdHVzKSB7CisJCQkJdTMyIHZhbCA9IG12cmVnX3JlYWQocHAsCisJCQkJCQkgIE1WTkVUQV9HTUFDX0FVVE9ORUdfQ09ORklHKTsKKwkJCQl2YWwgJj0gfk1WTkVUQV9HTUFDX0ZPUkNFX0xJTktfRE9XTjsKKwkJCQl2YWwgfD0gTVZORVRBX0dNQUNfRk9SQ0VfTElOS19QQVNTOworCQkJCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfR01BQ19BVVRPTkVHX0NPTkZJRywKKwkJCQkJICAgIHZhbCk7CisJCQl9CiAJCQltdm5ldGFfcG9ydF91cChwcCk7CiAJCX0gZWxzZSB7CisJCQlpZiAoIXBwLT51c2VfaW5iYW5kX3N0YXR1cykgeworCQkJCXUzMiB2YWwgPSBtdnJlZ19yZWFkKHBwLAorCQkJCQkJICBNVk5FVEFfR01BQ19BVVRPTkVHX0NPTkZJRyk7CisJCQkJdmFsICY9IH5NVk5FVEFfR01BQ19GT1JDRV9MSU5LX1BBU1M7CisJCQkJdmFsIHw9IE1WTkVUQV9HTUFDX0ZPUkNFX0xJTktfRE9XTjsKKwkJCQltdnJlZ193cml0ZShwcCwgTVZORVRBX0dNQUNfQVVUT05FR19DT05GSUcsCisJCQkJCSAgICB2YWwpOworCQkJfQogCQkJbXZuZXRhX3BvcnRfZG93bihwcCk7CiAJCX0KIAkJcGh5X3ByaW50X3N0YXR1cyhwaHlkZXYpOwpAQCAtMjY1OCwxNiArMjcyOSwxMSBAQAogc3RhdGljIGludCBtdm5ldGFfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7CiAJc3RydWN0IG12bmV0YV9wb3J0ICpwcCA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHJldDsKIAogCWlmICghcHAtPnBoeV9kZXYpCiAJCXJldHVybiAtRU5PVFNVUFA7CiAKLQlyZXQgPSBwaHlfbWlpX2lvY3RsKHBwLT5waHlfZGV2LCBpZnIsIGNtZCk7Ci0JaWYgKCFyZXQpCi0JCW12bmV0YV9hZGp1c3RfbGluayhkZXYpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcGh5X21paV9pb2N0bChwcC0+cGh5X2RldiwgaWZyLCBjbWQpOwogfQogCiAvKiBFdGh0b29sIG1ldGhvZHMgKi8KQEAgLTI5MTAsNiArMjk3Niw5IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCWlmIChwcC0+dXNlX2luYmFuZF9zdGF0dXMpCisJCWN0cmwgfD0gTVZORVRBX0dNQUMyX0lOQkFORF9BTl9FTkFCTEU7CisKIAkvKiBDYW5jZWwgUG9ydCBSZXNldCAqLwogCWN0cmwgJj0gfk1WTkVUQV9HTUFDMl9QT1JUX1JFU0VUOwogCW12cmVnX3dyaXRlKHBwLCBNVk5FVEFfR01BQ19DVFJMXzIsIGN0cmwpOwpAQCAtMjkzNCw2ICszMDAzLDcgQEAKIAljaGFyIGh3X21hY19hZGRyW0VUSF9BTEVOXTsKIAljb25zdCBjaGFyICptYWNfZnJvbTsKIAlpbnQgcGh5X21vZGU7CisJaW50IGZpeGVkX3BoeSA9IDA7CiAJaW50IGVycjsKIAogCS8qIE91ciBtdWx0aXF1ZXVlIHN1cHBvcnQgaXMgbm90IGNvbXBsZXRlLCBzbyBmb3Igbm93LCBvbmx5CkBAIC0yOTY3LDYgKzMwMzcsNyBAQAogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IHJlZ2lzdGVyIGZpeGVkIFBIWVxuIik7CiAJCQlnb3RvIGVycl9mcmVlX2lycTsKIAkJfQorCQlmaXhlZF9waHkgPSAxOwogCiAJCS8qIEluIHRoZSBjYXNlIG9mIGEgZml4ZWQgUEhZLCB0aGUgRFQgbm9kZSBhc3NvY2lhdGVkCiAJCSAqIHRvIHRoZSBQSFkgaXMgdGhlIEV0aGVybmV0IE1BQyBEVCBub2RlLgpAQCAtMjk5MCw2ICszMDYxLDggQEAKIAlwcCA9IG5ldGRldl9wcml2KGRldik7CiAJcHAtPnBoeV9ub2RlID0gcGh5X25vZGU7CiAJcHAtPnBoeV9pbnRlcmZhY2UgPSBwaHlfbW9kZTsKKwlwcC0+dXNlX2luYmFuZF9zdGF0dXMgPSAocGh5X21vZGUgPT0gUEhZX0lOVEVSRkFDRV9NT0RFX1NHTUlJKSAmJgorCQkJCWZpeGVkX3BoeTsKIAogCXBwLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihwcC0+Y2xrKSkgewpAQCAtMzA2Nyw2ICszMTQwLDEyIEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcC0+ZGV2KTsKIAorCWlmIChwcC0+dXNlX2luYmFuZF9zdGF0dXMpIHsKKwkJc3RydWN0IHBoeV9kZXZpY2UgKnBoeSA9IG9mX3BoeV9maW5kX2RldmljZShkbik7CisKKwkJbXZuZXRhX2ZpeGVkX2xpbmtfdXBkYXRlKHBwLCBwaHkpOworCX0KKwogCXJldHVybiAwOwogCiBlcnJfZnJlZV9zdGF0czoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZwcDIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXZwcDIuYwppbmRleCBmZGYzZTM4Li4zZThiMWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212cHAyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdnBwMi5jCkBAIC0xNDIzLDcgKzE0MjMsNyBAQAogewogCXN0cnVjdCBtdnBwMl9wcnNfZW50cnkgcGU7CiAKLQkvKiBQcm9taXNjb3VzIG1vZGUgLSBBY2NlcHQgdW5rbm93biBwYWNrZXRzICovCisJLyogUHJvbWlzY3VvdXMgbW9kZSAtIEFjY2VwdCB1bmtub3duIHBhY2tldHMgKi8KIAogCWlmIChwcml2LT5wcnNfc2hhZG93W01WUFAyX1BFX01BQ19QUk9NSVNDVU9VU10udmFsaWQpIHsKIAkJLyogRW50cnkgZXhpc3QgLSB1cGRhdGUgcG9ydCBvbmx5ICovCkBAIC0zNDAyLDcgKzM0MDIsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBibV9wb29sLT5idWZfbnVtOyBpKyspIHsKIAkJdTMyIHZhZGRyOwogCi0JCS8qIEdldCBidWZmZXIgdmlydHVhbCBhZHJlc3MgKGluZGlyZWN0IGFjY2VzcykgKi8KKwkJLyogR2V0IGJ1ZmZlciB2aXJ0dWFsIGFkZHJlc3MgKGluZGlyZWN0IGFjY2VzcykgKi8KIAkJbXZwcDJfcmVhZChwcml2LCBNVlBQMl9CTV9QSFlfQUxMT0NfUkVHKGJtX3Bvb2wtPmlkKSk7CiAJCXZhZGRyID0gbXZwcDJfcmVhZChwcml2LCBNVlBQMl9CTV9WSVJUX0FMTE9DX1JFRyk7CiAJCWlmICghdmFkZHIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9NYWtlZmlsZQppbmRleCAzZTljNzBmLi5jODIyMTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvTWFrZWZpbGUKQEAgLTEsNyArMSw4IEBACiBvYmotJChDT05GSUdfTUxYNF9DT1JFKQkJKz0gbWx4NF9jb3JlLm8KIAotbWx4NF9jb3JlLXkgOj0JYWxsb2MubyBjYXRhcy5vIGNtZC5vIGNxLm8gZXEubyBmdy5vIGljbS5vIGludGYubyBtYWluLm8gbWNnLm8gXAotCQltci5vIHBkLm8gcG9ydC5vIHByb2ZpbGUubyBxcC5vIHJlc2V0Lm8gc2Vuc2UubyBzcnEubyByZXNvdXJjZV90cmFja2VyLm8KK21seDRfY29yZS15IDo9CWFsbG9jLm8gY2F0YXMubyBjbWQubyBjcS5vIGVxLm8gZncubyBmd19xb3MubyBpY20ubyBpbnRmLm8gXAorCQltYWluLm8gbWNnLm8gbXIubyBwZC5vIHBvcnQubyBwcm9maWxlLm8gcXAubyByZXNldC5vIHNlbnNlLm8gXAorCQlzcnEubyByZXNvdXJjZV90cmFja2VyLm8KIAogb2JqLSQoQ09ORklHX01MWDRfRU4pICAgICAgICAgICAgICAgKz0gbWx4NF9lbi5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY21kLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NtZC5jCmluZGV4IGE2ODFkN2MuLmYwZmJiNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jbWQuYwpAQCAtNDgsNiArNDgsNyBAQAogCiAjaW5jbHVkZSAibWx4NC5oIgogI2luY2x1ZGUgImZ3LmgiCisjaW5jbHVkZSAiZndfcW9zLmgiCiAKICNkZWZpbmUgQ01EX1BPTExfVE9LRU4gMHhmZmZmCiAjZGVmaW5lIElOQk9YX01BU0sJMHhmZmZmZmZmZmZmZmZmZjAwVUxMCkBAIC03MjQsOCArNzI1LDEwIEBACiAJCSAqIG9uIHRoZSBob3N0LCB3ZSBkZXByZWNhdGUgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMKIAkJICogc3BlY2lmaWMgY29tbWFuZC9pbnB1dF9tb2Qvb3Bjb2RlX21vZC9mdy1zdGF0dXMgdG8gYmUgZGVidWcuCiAJCSAqLwotCQlpZiAob3AgPT0gTUxYNF9DTURfU0VUX1BPUlQgJiYgaW5fbW9kaWZpZXIgPT0gMSAmJgotCQkgICAgb3BfbW9kaWZpZXIgPT0gMCAmJiBjb250ZXh0LT5md19zdGF0dXMgPT0gQ01EX1NUQVRfQkFEX1NJWkUpCisJCWlmIChvcCA9PSBNTFg0X0NNRF9TRVRfUE9SVCAmJgorCQkgICAgKGluX21vZGlmaWVyID09IDEgfHwgaW5fbW9kaWZpZXIgPT0gMikgJiYKKwkJICAgIG9wX21vZGlmaWVyID09IE1MWDRfU0VUX1BPUlRfSUJfT1BDT0RFICYmCisJCSAgICBjb250ZXh0LT5md19zdGF0dXMgPT0gQ01EX1NUQVRfQkFEX1NJWkUpCiAJCQltbHg0X2RiZyhkZXYsICJjb21tYW5kIDB4JXggZmFpbGVkOiBmdyBzdGF0dXMgPSAweCV4XG4iLAogCQkJCSBvcCwgY29udGV4dC0+Zndfc3RhdHVzKTsKIAkJZWxzZQpAQCAtMTQ1NSw2ICsxNDU4LDI0IEBACiAJCS53cmFwcGVyID0gbWx4NF9DTURfRVBFUk1fd3JhcHBlciwKIAl9LAogCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX0FMTE9DQVRFX1ZQUCwKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IHRydWUsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSBmYWxzZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF9DTURfRVBFUk1fd3JhcHBlciwKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1NFVF9WUE9SVF9RT1MsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSB0cnVlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfQ01EX0VQRVJNX3dyYXBwZXIsCisJfSwKKwl7CiAJCS5vcGNvZGUgPSBNTFg0X0NNRF9DT05GX1NQRUNJQUxfUVAsCiAJCS5oYXNfaW5ib3ggPSBmYWxzZSwKIAkJLmhhc19vdXRib3ggPSBmYWxzZSwKQEAgLTE0OTksNiArMTUyMCwxNSBAQAogCQkudmVyaWZ5ID0gTlVMTCwKIAkJLndyYXBwZXIgPSBtbHg0X0FDQ0VTU19SRUdfd3JhcHBlciwKIAl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX0NPTkdFU1RJT05fQ1RSTF9PUENPREUsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X0NNRF9FUEVSTV93cmFwcGVyLAorCX0sCiAJLyogTmF0aXZlIG11bHRpY2FzdCBjb21tYW5kcyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgZ3Vlc3RzICovCiAJewogCQkub3Bjb2RlID0gTUxYNF9DTURfUVBfQVRUQUNILApAQCAtMTc4MSw3ICsxODExLDggQEAKIAogCWlmICh2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW4gPT0gdnBfYWRtaW4tPmRlZmF1bHRfdmxhbiAmJgogCSAgICB2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3FvcyA9PSB2cF9hZG1pbi0+ZGVmYXVsdF9xb3MgJiYKLQkgICAgdnBfb3Blci0+c3RhdGUubGlua19zdGF0ZSA9PSB2cF9hZG1pbi0+bGlua19zdGF0ZSkKKwkgICAgdnBfb3Blci0+c3RhdGUubGlua19zdGF0ZSA9PSB2cF9hZG1pbi0+bGlua19zdGF0ZSAmJgorCSAgICB2cF9vcGVyLT5zdGF0ZS5xb3NfdnBvcnQgPT0gdnBfYWRtaW4tPnFvc192cG9ydCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIShwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbc2xhdmVdLmFjdGl2ZSAmJgpAQCAtMTgzOSw2ICsxODcwLDcgQEAKIAl2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW4gPSB2cF9hZG1pbi0+ZGVmYXVsdF92bGFuOwogCXZwX29wZXItPnN0YXRlLmRlZmF1bHRfcW9zID0gdnBfYWRtaW4tPmRlZmF1bHRfcW9zOwogCXZwX29wZXItPnN0YXRlLmxpbmtfc3RhdGUgPSB2cF9hZG1pbi0+bGlua19zdGF0ZTsKKwl2cF9vcGVyLT5zdGF0ZS5xb3NfdnBvcnQgPSB2cF9hZG1pbi0+cW9zX3Zwb3J0OwogCiAJaWYgKHZwX2FkbWluLT5saW5rX3N0YXRlID09IElGTEFfVkZfTElOS19TVEFURV9ESVNBQkxFKQogCQl3b3JrLT5mbGFncyB8PSBNTFg0X1ZGX0lNTUVEX1ZMQU5fRkxBR19MSU5LX0RJU0FCTEU7CkBAIC0xODQ3LDYgKzE4NzksNyBAQAogCXdvcmstPnBvcnQgPSBwb3J0OwogCXdvcmstPnNsYXZlID0gc2xhdmU7CiAJd29yay0+cW9zID0gdnBfb3Blci0+c3RhdGUuZGVmYXVsdF9xb3M7CisJd29yay0+cW9zX3Zwb3J0ID0gdnBfb3Blci0+c3RhdGUucW9zX3Zwb3J0OwogCXdvcmstPnZsYW5faWQgPSB2cF9vcGVyLT5zdGF0ZS5kZWZhdWx0X3ZsYW47CiAJd29yay0+dmxhbl9peCA9IHZwX29wZXItPnZsYW5faWR4OwogCXdvcmstPnByaXYgPSBwcml2OwpAQCAtMTg1Niw2ICsxODg5LDYzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG1seDRfc2V0X2RlZmF1bHRfcG9ydF9xb3Moc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0KQoreworCXN0cnVjdCBtbHg0X3Fvc19tYW5hZ2VyICpwb3J0X3Fvc19jdGw7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCisJcG9ydF9xb3NfY3RsID0gJnByaXYtPm1mdW5jLm1hc3Rlci5xb3NfY3RsW3BvcnRdOworCWJpdG1hcF96ZXJvKHBvcnRfcW9zX2N0bC0+cHJpb3JpdHlfYm0sIE1MWDRfTlVNX1VQKTsKKworCS8qIEVuYWJsZSBvbmx5IGRlZmF1bHQgcHJpbyBhdCBQRiBpbml0IHJvdXRpbmUgKi8KKwlzZXRfYml0KE1MWDRfREVGQVVMVF9RT1NfUFJJTywgcG9ydF9xb3NfY3RsLT5wcmlvcml0eV9ibSk7Cit9CisKK3N0YXRpYyB2b2lkIG1seDRfYWxsb2NhdGVfcG9ydF92cHBzKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyOworCWludCBudW1fdmZzOworCXUxNiBhdmFpbGlibGVfdnBwOworCXU4IHZwcF9wYXJhbVtNTFg0X05VTV9VUF07CisJc3RydWN0IG1seDRfcW9zX21hbmFnZXIgKnBvcnRfcW9zOworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKworCWVyciA9IG1seDRfQUxMT0NBVEVfVlBQX2dldChkZXYsIHBvcnQsICZhdmFpbGlibGVfdnBwLCB2cHBfcGFyYW0pOworCWlmIChlcnIpIHsKKwkJbWx4NF9pbmZvKGRldiwgIkZhaWxlZCBxdWVyeSBhdmFpbGlibGUgVlBQc1xuIik7CisJCXJldHVybjsKKwl9CisKKwlwb3J0X3FvcyA9ICZwcml2LT5tZnVuYy5tYXN0ZXIucW9zX2N0bFtwb3J0XTsKKwludW1fdmZzID0gKGF2YWlsaWJsZV92cHAgLworCQkgICBiaXRtYXBfd2VpZ2h0KHBvcnRfcW9zLT5wcmlvcml0eV9ibSwgTUxYNF9OVU1fVVApKTsKKworCWZvciAoaSA9IDA7IGkgPCBNTFg0X05VTV9VUDsgaSsrKSB7CisJCWlmICh0ZXN0X2JpdChpLCBwb3J0X3Fvcy0+cHJpb3JpdHlfYm0pKQorCQkJdnBwX3BhcmFtW2ldID0gbnVtX3ZmczsKKwl9CisKKwllcnIgPSBtbHg0X0FMTE9DQVRFX1ZQUF9zZXQoZGV2LCBwb3J0LCB2cHBfcGFyYW0pOworCWlmIChlcnIpIHsKKwkJbWx4NF9pbmZvKGRldiwgIkZhaWxlZCBhbGxvY2F0aW5nIFZQUHNcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogUXVlcnkgYWN0dWFsIGFsbG9jYXRlZCBWUFAsIGp1c3QgdG8gbWFrZSBzdXJlICovCisJZXJyID0gbWx4NF9BTExPQ0FURV9WUFBfZ2V0KGRldiwgcG9ydCwgJmF2YWlsaWJsZV92cHAsIHZwcF9wYXJhbSk7CisJaWYgKGVycikgeworCQltbHg0X2luZm8oZGV2LCAiRmFpbGVkIHF1ZXJ5IGF2YWlsaWJsZSBWUFBzXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXBvcnRfcW9zLT5udW1fb2ZfcW9zX3ZmcyA9IG51bV92ZnM7CisJbWx4NF9kYmcoZGV2LCAiUG9ydCAlZCBBdmFpbGlibGUgVlBQcyAlZFxuIiwgcG9ydCwgYXZhaWxpYmxlX3ZwcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUxYNF9OVU1fVVA7IGkrKykKKwkJbWx4NF9kYmcoZGV2LCAiUG9ydCAlZCBVUCAlZCBBbGxvY2F0ZWQgJWQgVlBQc1xuIiwgcG9ydCwgaSwKKwkJCSB2cHBfcGFyYW1baV0pOworfQogCiBzdGF0aWMgaW50IG1seDRfbWFzdGVyX2FjdGl2YXRlX2FkbWluX3N0YXRlKHN0cnVjdCBtbHg0X3ByaXYgKnByaXYsIGludCBzbGF2ZSkKIHsKQEAgLTE5OTMsNyArMjA4Myw2IEBACiAJCQlnb3RvIHJlc2V0X3NsYXZlOwogCQlzbGF2ZV9zdGF0ZVtzbGF2ZV0udmhjcl9kbWEgPSAoKHU2NCkgcGFyYW0pIDw8IDQ4OwogCQlwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbc2xhdmVdLmNvb2tpZSA9IDA7Ci0JCW11dGV4X2luaXQoJnByaXYtPm1mdW5jLm1hc3Rlci5nZW5fZXFlX211dGV4W3NsYXZlXSk7CiAJCWJyZWFrOwogCWNhc2UgTUxYNF9DT01NX0NNRF9WSENSMToKIAkJaWYgKHNsYXZlX3N0YXRlW3NsYXZlXS5sYXN0X2NtZCAhPSBNTFg0X0NPTU1fQ01EX1ZIQ1IwKQpAQCAtMjIwNCw2ICsyMjkzLDkgQEAKIAl9CiAKIAlpZiAobWx4NF9pc19tYXN0ZXIoZGV2KSkgeworCQlzdHJ1Y3QgbWx4NF92Zl9vcGVyX3N0YXRlICp2Zl9vcGVyOworCQlzdHJ1Y3QgbWx4NF92Zl9hZG1pbl9zdGF0ZSAqdmZfYWRtaW47CisKIAkJcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlID0KIAkJCWt6YWxsb2MoZGV2LT5udW1fc2xhdmVzICoKIAkJCQlzaXplb2Yoc3RydWN0IG1seDRfc2xhdmVfc3RhdGUpLCBHRlBfS0VSTkVMKTsKQEAgLTIyMjMsOCArMjMxNSwxMSBAQAogCQkJZ290byBlcnJfY29tbV9vcGVyOwogCiAJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9zbGF2ZXM7ICsraSkgeworCQkJdmZfYWRtaW4gPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnZmX2FkbWluW2ldOworCQkJdmZfb3BlciA9ICZwcml2LT5tZnVuYy5tYXN0ZXIudmZfb3BlcltpXTsKIAkJCXNfc3RhdGUgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW2ldOwogCQkJc19zdGF0ZS0+bGFzdF9jbWQgPSBNTFg0X0NPTU1fQ01EX1JFU0VUOworCQkJbXV0ZXhfaW5pdCgmcHJpdi0+bWZ1bmMubWFzdGVyLmdlbl9lcWVfbXV0ZXhbaV0pOwogCQkJZm9yIChqID0gMDsgaiA8IE1MWDRfRVZFTlRfVFlQRVNfTlVNOyArK2opCiAJCQkJc19zdGF0ZS0+ZXZlbnRfZXFbal0uZXFuID0gLTE7CiAJCQlfX3Jhd193cml0ZWwoKF9fZm9yY2UgdTMyKSAwLApAQCAtMjIzMyw2ICsyMzI4LDkgQEAKIAkJCQkgICAgICZwcml2LT5tZnVuYy5jb21tW2ldLnNsYXZlX3JlYWQpOwogCQkJbW1pb3diKCk7CiAJCQlmb3IgKHBvcnQgPSAxOyBwb3J0IDw9IE1MWDRfTUFYX1BPUlRTOyBwb3J0KyspIHsKKwkJCQlzdHJ1Y3QgbWx4NF92cG9ydF9zdGF0ZSAqYWRtaW5fdnBvcnQ7CisJCQkJc3RydWN0IG1seDRfdnBvcnRfc3RhdGUgKm9wZXJfdnBvcnQ7CisKIAkJCQlzX3N0YXRlLT52bGFuX2ZpbHRlcltwb3J0XSA9CiAJCQkJCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtbHg0X3ZsYW5fZmx0ciksCiAJCQkJCQlHRlBfS0VSTkVMKTsKQEAgLTIyNDEsMTUgKzIzMzksMzAgQEAKIAkJCQkJCWtmcmVlKHNfc3RhdGUtPnZsYW5fZmlsdGVyW3BvcnRdKTsKIAkJCQkJZ290byBlcnJfc2xhdmVzOwogCQkJCX0KKworCQkJCWFkbWluX3Zwb3J0ID0gJnZmX2FkbWluLT52cG9ydFtwb3J0XTsKKwkJCQlvcGVyX3Zwb3J0ID0gJnZmX29wZXItPnZwb3J0W3BvcnRdLnN0YXRlOwogCQkJCUlOSVRfTElTVF9IRUFEKCZzX3N0YXRlLT5tY2FzdF9maWx0ZXJzW3BvcnRdKTsKLQkJCQlwcml2LT5tZnVuYy5tYXN0ZXIudmZfYWRtaW5baV0udnBvcnRbcG9ydF0uZGVmYXVsdF92bGFuID0gTUxYNF9WR1Q7Ci0JCQkJcHJpdi0+bWZ1bmMubWFzdGVyLnZmX29wZXJbaV0udnBvcnRbcG9ydF0uc3RhdGUuZGVmYXVsdF92bGFuID0gTUxYNF9WR1Q7Ci0JCQkJcHJpdi0+bWZ1bmMubWFzdGVyLnZmX29wZXJbaV0udnBvcnRbcG9ydF0udmxhbl9pZHggPSBOT19JTkRYOwotCQkJCXByaXYtPm1mdW5jLm1hc3Rlci52Zl9vcGVyW2ldLnZwb3J0W3BvcnRdLm1hY19pZHggPSBOT19JTkRYOworCQkJCWFkbWluX3Zwb3J0LT5kZWZhdWx0X3ZsYW4gPSBNTFg0X1ZHVDsKKwkJCQlvcGVyX3Zwb3J0LT5kZWZhdWx0X3ZsYW4gPSBNTFg0X1ZHVDsKKwkJCQlhZG1pbl92cG9ydC0+cW9zX3Zwb3J0ID0KKwkJCQkJCU1MWDRfVlBQX0RFRkFVTFRfVlBPUlQ7CisJCQkJb3Blcl92cG9ydC0+cW9zX3Zwb3J0ID0gTUxYNF9WUFBfREVGQVVMVF9WUE9SVDsKKwkJCQl2Zl9vcGVyLT52cG9ydFtwb3J0XS52bGFuX2lkeCA9IE5PX0lORFg7CisJCQkJdmZfb3Blci0+dnBvcnRbcG9ydF0ubWFjX2lkeCA9IE5PX0lORFg7CiAJCQl9CiAJCQlzcGluX2xvY2tfaW5pdCgmc19zdGF0ZS0+bG9jayk7CiAJCX0KIAorCQlpZiAoZGV2LT5jYXBzLmZsYWdzMiAmIE1MWDRfREVWX0NBUF9GTEFHMl9RT1NfVlBQKSB7CisJCQlmb3IgKHBvcnQgPSAxOyBwb3J0IDw9IGRldi0+Y2Fwcy5udW1fcG9ydHM7IHBvcnQrKykgeworCQkJCWlmIChtbHg0X2lzX2V0aChkZXYsIHBvcnQpKSB7CisJCQkJCW1seDRfc2V0X2RlZmF1bHRfcG9ydF9xb3MoZGV2LCBwb3J0KTsKKwkJCQkJbWx4NF9hbGxvY2F0ZV9wb3J0X3ZwcHMoZGV2LCBwb3J0KTsKKwkJCQl9CisJCQl9CisJCX0KKwogCQltZW1zZXQoJnByaXYtPm1mdW5jLm1hc3Rlci5jbWRfZXFlLCAwLCBkZXYtPmNhcHMuZXFlX3NpemUpOwogCQlwcml2LT5tZnVuYy5tYXN0ZXIuY21kX2VxZS50eXBlID0gTUxYNF9FVkVOVF9UWVBFX0NNRDsKIAkJSU5JVF9XT1JLKCZwcml2LT5tZnVuYy5tYXN0ZXIuY29tbV93b3JrLApAQCAtMjY3MCw2ICsyNzgzLDEwMyBAQAogCXJldHVybiBwb3J0OwogfQogCitzdGF0aWMgaW50IG1seDRfc2V0X3Zwb3J0X3FvcyhzdHJ1Y3QgbWx4NF9wcml2ICpwcml2LCBpbnQgc2xhdmUsIGludCBwb3J0LAorCQkJICAgICAgaW50IG1heF90eF9yYXRlKQoreworCWludCBpOworCWludCBlcnI7CisJc3RydWN0IG1seDRfcW9zX21hbmFnZXIgKnBvcnRfcW9zOworCXN0cnVjdCBtbHg0X2RldiAqZGV2ID0gJnByaXYtPmRldjsKKwlzdHJ1Y3QgbWx4NF92cG9ydF9xb3NfcGFyYW0gdnBwX3Fvc1tNTFg0X05VTV9VUF07CisKKwlwb3J0X3FvcyA9ICZwcml2LT5tZnVuYy5tYXN0ZXIucW9zX2N0bFtwb3J0XTsKKwltZW1zZXQodnBwX3FvcywgMCwgc2l6ZW9mKHN0cnVjdCBtbHg0X3Zwb3J0X3Fvc19wYXJhbSkgKiBNTFg0X05VTV9VUCk7CisKKwlpZiAoc2xhdmUgPiBwb3J0X3Fvcy0+bnVtX29mX3Fvc192ZnMpIHsKKwkJbWx4NF9pbmZvKGRldiwgIk5vIGF2YWlsaWJsZSBWUFAgcmVzb3VyY2VzIGZvciB0aGlzIFZGXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUXVlcnkgZm9yIGRlZmF1bHQgUW9TIHZhbHVlcyBmcm9tIFZwb3J0IDAgaXMgbmVlZGVkICovCisJZXJyID0gbWx4NF9TRVRfVlBPUlRfUU9TX2dldChkZXYsIHBvcnQsIDAsIHZwcF9xb3MpOworCWlmIChlcnIpIHsKKwkJbWx4NF9pbmZvKGRldiwgIkZhaWxlZCB0byBxdWVyeSBWcG9ydCAwIFFvUyB2YWx1ZXNcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNTFg0X05VTV9VUDsgaSsrKSB7CisJCWlmICh0ZXN0X2JpdChpLCBwb3J0X3Fvcy0+cHJpb3JpdHlfYm0pICYmIG1heF90eF9yYXRlKSB7CisJCQl2cHBfcW9zW2ldLm1heF9hdmdfYncgPSBtYXhfdHhfcmF0ZTsKKwkJCXZwcF9xb3NbaV0uZW5hYmxlID0gMTsKKwkJfSBlbHNlIHsKKwkJCS8qIGlmIHVzZXIgc3VwcGxpZWQgdHhfcmF0ZSA9PSAwLCBtZWFuaW5nIG5vIHJhdGUgbGltaXQKKwkJCSAqIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQuIHNvIHdlIGFyZSBsZWF2aW5nIHRoZQorCQkJICogdmFsdWUgb2YgbWF4X2F2Z19idyBhcyBxdWVyaWVkIGZyb20gVnBvcnQgMC4KKwkJCSAqLworCQkJdnBwX3Fvc1tpXS5lbmFibGUgPSAwOworCQl9CisJfQorCisJZXJyID0gbWx4NF9TRVRfVlBPUlRfUU9TX3NldChkZXYsIHBvcnQsIHNsYXZlLCB2cHBfcW9zKTsKKwlpZiAoZXJyKSB7CisJCW1seDRfaW5mbyhkZXYsICJGYWlsZWQgdG8gc2V0IFZwb3J0ICVkIFFvUyB2YWx1ZXNcbiIsIHNsYXZlKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgbWx4NF9pc192Zl92c3RfYW5kX3ByaW9fcW9zKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwKKwkJCQkJc3RydWN0IG1seDRfdnBvcnRfc3RhdGUgKnZmX2FkbWluKQoreworCXN0cnVjdCBtbHg0X3Fvc19tYW5hZ2VyICppbmZvOworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKworCWlmICghbWx4NF9pc19tYXN0ZXIoZGV2KSB8fAorCSAgICAhKGRldi0+Y2Fwcy5mbGFnczIgJiBNTFg0X0RFVl9DQVBfRkxBRzJfUU9TX1ZQUCkpCisJCXJldHVybiBmYWxzZTsKKworCWluZm8gPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnFvc19jdGxbcG9ydF07CisKKwlpZiAodmZfYWRtaW4tPmRlZmF1bHRfdmxhbiAhPSBNTFg0X1ZHVCAmJgorCSAgICB0ZXN0X2JpdCh2Zl9hZG1pbi0+ZGVmYXVsdF9xb3MsIGluZm8tPnByaW9yaXR5X2JtKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIG1seDRfdmFsaWRfdmZfc3RhdGVfY2hhbmdlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwKKwkJCQkgICAgICAgc3RydWN0IG1seDRfdnBvcnRfc3RhdGUgKnZmX2FkbWluLAorCQkJCSAgICAgICBpbnQgdmxhbiwgaW50IHFvcykKK3sKKwlzdHJ1Y3QgbWx4NF92cG9ydF9zdGF0ZSBkdW1teV9hZG1pbiA9IHswfTsKKworCWlmICghbWx4NF9pc192Zl92c3RfYW5kX3ByaW9fcW9zKGRldiwgcG9ydCwgdmZfYWRtaW4pIHx8CisJICAgICF2Zl9hZG1pbi0+dHhfcmF0ZSkKKwkJcmV0dXJuIHRydWU7CisKKwlkdW1teV9hZG1pbi5kZWZhdWx0X3FvcyA9IHFvczsKKwlkdW1teV9hZG1pbi5kZWZhdWx0X3ZsYW4gPSB2bGFuOworCisJLyogVkYgd2FudHMgdG8gbW92ZSB0byBvdGhlciBWU1Qgc3RhdGUgd2hpY2ggaXMgdmFsaWQgd2l0aCBjdXJyZW50CisJICogcmF0ZSBsaW1pdC4gRWl0aGVyIGRpZmZlcm50IGRlZmF1bHQgdmxhbiBpbiBWU1Qgb3Igb3RoZXIKKwkgKiBzdXBwb3J0ZWQgUW9TIHByaW9yaXR5LiBPdGhlcndpc2Ugd2UgZG9uJ3QgYWxsb3cgdGhpcyBjaGFuZ2Ugd2hlbgorCSAqIHRoZSBUWCByYXRlIGlzIHN0aWxsIGNvbmZpZ3VyZWQuCisJICovCisJaWYgKG1seDRfaXNfdmZfdnN0X2FuZF9wcmlvX3FvcyhkZXYsIHBvcnQsICZkdW1teV9hZG1pbikpCisJCXJldHVybiB0cnVlOworCisJbWx4NF9pbmZvKGRldiwgIkNhbm5vdCBjaGFuZ2UgVkYgc3RhdGUgdG8gJXMgd2hpbGUgcmF0ZSBpcyBzZXRcbiIsCisJCSAgKHZsYW4gPT0gTUxYNF9WR1QpID8gIlZHVCIgOiAiVlNUIik7CisKKwlpZiAodmxhbiAhPSBNTFg0X1ZHVCkKKwkJbWx4NF9pbmZvKGRldiwgIlZTVCBwcmlvcml0eSAlZCBub3Qgc3VwcG9ydGVkIGZvciBRb1NcbiIsIHFvcyk7CisKKwltbHg0X2luZm8oZGV2LCAiUGxlYXNlIHNldCByYXRlIHRvIDAgcHJpb3IgdG8gdGhpcyBWRiBzdGF0ZSBjaGFuZ2VcbiIpOworCisJcmV0dXJuIGZhbHNlOworfQorCiBpbnQgbWx4NF9zZXRfdmZfbWFjKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgaW50IHZmLCB1NjQgbWFjKQogewogCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKQEAgLTI3MTMsMTIgKzI5MjMsMjIgQEAKIAlwb3J0ID0gbWx4NF9zbGF2ZXNfY2xvc2VzdF9wb3J0KGRldiwgc2xhdmUsIHBvcnQpOwogCXZmX2FkbWluID0gJnByaXYtPm1mdW5jLm1hc3Rlci52Zl9hZG1pbltzbGF2ZV0udnBvcnRbcG9ydF07CiAKKwlpZiAoIW1seDRfdmFsaWRfdmZfc3RhdGVfY2hhbmdlKGRldiwgcG9ydCwgdmZfYWRtaW4sIHZsYW4sIHFvcykpCisJCXJldHVybiAtRVBFUk07CisKIAlpZiAoKDAgPT0gdmxhbikgJiYgKDAgPT0gcW9zKSkKIAkJdmZfYWRtaW4tPmRlZmF1bHRfdmxhbiA9IE1MWDRfVkdUOwogCWVsc2UKIAkJdmZfYWRtaW4tPmRlZmF1bHRfdmxhbiA9IHZsYW47CiAJdmZfYWRtaW4tPmRlZmF1bHRfcW9zID0gcW9zOwogCisJLyogSWYgcmF0ZSB3YXMgY29uZmlndXJlZCBwcmlvciB0byBWU1QsIHdlIHNhdmVkIHRoZSBjb25maWd1cmVkIHJhdGUKKwkgKiBpbiB2Zl9hZG1pbi0+cmF0ZSBhbmQgbm93LCBpZiBwcmlvcml0eSBzdXBwb3J0ZWQgd2UgZW5mb3JjZSB0aGUgUW9TCisJICovCisJaWYgKG1seDRfaXNfdmZfdnN0X2FuZF9wcmlvX3FvcyhkZXYsIHBvcnQsIHZmX2FkbWluKSAmJgorCSAgICB2Zl9hZG1pbi0+dHhfcmF0ZSkKKwkJdmZfYWRtaW4tPnFvc192cG9ydCA9IHNsYXZlOworCiAJaWYgKG1seDRfbWFzdGVyX2ltbWVkaWF0ZV9hY3RpdmF0ZV92bGFuX3Fvcyhwcml2LCBzbGF2ZSwgcG9ydCkpCiAJCW1seDRfaW5mbyhkZXYsCiAJCQkgICJ1cGRhdGluZyB2ZiAlZCBwb3J0ICVkIGNvbmZpZyB3aWxsIHRha2UgZWZmZWN0IG9uIG5leHQgVkYgcmVzdGFydFxuIiwKQEAgLTI3MjcsNiArMjk0Nyw2OSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9zZXRfdmZfdmxhbik7CiAKK2ludCBtbHg0X3NldF92Zl9yYXRlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgaW50IHZmLCBpbnQgbWluX3R4X3JhdGUsCisJCSAgICAgaW50IG1heF90eF9yYXRlKQoreworCWludCBlcnI7CisJaW50IHNsYXZlOworCXN0cnVjdCBtbHg0X3Zwb3J0X3N0YXRlICp2Zl9hZG1pbjsKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisKKwlpZiAoIW1seDRfaXNfbWFzdGVyKGRldikgfHwKKwkgICAgIShkZXYtPmNhcHMuZmxhZ3MyICYgTUxYNF9ERVZfQ0FQX0ZMQUcyX1FPU19WUFApKQorCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKKworCWlmIChtaW5fdHhfcmF0ZSkgeworCQltbHg0X2luZm8oZGV2LCAiTWluaW11bSBCVyBzaGFyZSBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FUFJPVE9OT1NVUFBPUlQ7CisJfQorCisJc2xhdmUgPSBtbHg0X2dldF9zbGF2ZV9pbmR4KGRldiwgdmYpOworCWlmIChzbGF2ZSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcG9ydCA9IG1seDRfc2xhdmVzX2Nsb3Nlc3RfcG9ydChkZXYsIHNsYXZlLCBwb3J0KTsKKwl2Zl9hZG1pbiA9ICZwcml2LT5tZnVuYy5tYXN0ZXIudmZfYWRtaW5bc2xhdmVdLnZwb3J0W3BvcnRdOworCisJZXJyID0gbWx4NF9zZXRfdnBvcnRfcW9zKHByaXYsIHNsYXZlLCBwb3J0LCBtYXhfdHhfcmF0ZSk7CisJaWYgKGVycikgeworCQltbHg0X2luZm8oZGV2LCAidmYgJWQgZmFpbGVkIHRvIHNldCByYXRlICVkXG4iLCB2ZiwKKwkJCSAgbWF4X3R4X3JhdGUpOworCQlyZXR1cm4gZXJyOworCX0KKworCXZmX2FkbWluLT50eF9yYXRlID0gbWF4X3R4X3JhdGU7CisJLyogaWYgVkYgaXMgbm90IGluIHN1cHBvcnRlZCBtb2RlIChWU1Qgd2l0aCBzdXBwb3J0ZWQgcHJpbyksCisJICogd2UgZG8gbm90IGNoYW5nZSB2cG9ydCBjb25maWd1cmF0aW9uIGZvciBpdHMgUVBzLCBidXQgc2F2ZQorCSAqIHRoZSByYXRlLCBzbyBpdCB3aWxsIGJlIGVuZm9yY2VkIHdoZW4gaXQgbW92ZXMgdG8gc3VwcG9ydGVkCisJICogbW9kZSBuZXh0IHRpbWUuCisJICovCisJaWYgKCFtbHg0X2lzX3ZmX3ZzdF9hbmRfcHJpb19xb3MoZGV2LCBwb3J0LCB2Zl9hZG1pbikpIHsKKwkJbWx4NF9pbmZvKGRldiwKKwkJCSAgInJhdGUgc2V0IGZvciBWRiAlZCB3aGVuIG5vdCBpbiB2YWxpZCBzdGF0ZVxuIiwgdmYpOworCisJCWlmICh2Zl9hZG1pbi0+ZGVmYXVsdF92bGFuICE9IE1MWDRfVkdUKQorCQkJbWx4NF9pbmZvKGRldiwgIlZTVCBwcmlvcml0eSBub3Qgc3VwcG9ydGVkIGJ5IFFvU1xuIik7CisJCWVsc2UKKwkJCW1seDRfaW5mbyhkZXYsICJWRiBpbiBWR1QgbW9kZSAobmVlZGVkIFZTVClcbiIpOworCisJCW1seDRfaW5mbyhkZXYsCisJCQkgICJyYXRlICVkIHRha2UgYWZmZWN0IHdoZW4gVkYgbW92ZXMgdG8gdmFsaWQgc3RhdGVcbiIsCisJCQkgIG1heF90eF9yYXRlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgdXNlciBzZXRzIHJhdGUgMCBhc3NpZ25pbmcgZGVmYXVsdCB2cG9ydCBmb3IgaXRzIFFQcyAqLworCXZmX2FkbWluLT5xb3NfdnBvcnQgPSBtYXhfdHhfcmF0ZSA/IHNsYXZlIDogTUxYNF9WUFBfREVGQVVMVF9WUE9SVDsKKworCWlmIChwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbc2xhdmVdLmFjdGl2ZSAmJgorCSAgICBkZXYtPmNhcHMuZmxhZ3MyICYgTUxYNF9ERVZfQ0FQX0ZMQUcyX1VQREFURV9RUCkKKwkJbWx4NF9tYXN0ZXJfaW1tZWRpYXRlX2FjdGl2YXRlX3ZsYW5fcW9zKHByaXYsIHNsYXZlLCBwb3J0KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9zZXRfdmZfcmF0ZSk7CisKICAvKiBtbHg0X2dldF9zbGF2ZV9kZWZhdWx0X3ZsYW4gLQogICogcmV0dXJuIHRydWUgaWYgVlNUICggZGVmYXVsdCB2bGFuKQogICogaWYgVlNULCB3aWxsIHJldHVybiB2bGFuICYgcW9zIChpZiBub3QgTlVMTCkKQEAgLTI4MDAsNyArMzA4MywxMiBAQAogCiAJaXZmLT52bGFuCQk9IHNfaW5mby0+ZGVmYXVsdF92bGFuOwogCWl2Zi0+cW9zCQk9IHNfaW5mby0+ZGVmYXVsdF9xb3M7Ci0JaXZmLT5tYXhfdHhfcmF0ZQk9IHNfaW5mby0+dHhfcmF0ZTsKKworCWlmIChtbHg0X2lzX3ZmX3ZzdF9hbmRfcHJpb19xb3MoZGV2LCBwb3J0LCBzX2luZm8pKQorCQlpdmYtPm1heF90eF9yYXRlID0gc19pbmZvLT50eF9yYXRlOworCWVsc2UKKwkJaXZmLT5tYXhfdHhfcmF0ZSA9IDA7CisKIAlpdmYtPm1pbl90eF9yYXRlCT0gMDsKIAlpdmYtPnNwb29mY2hrCQk9IHNfaW5mby0+c3Bvb2ZjaGs7CiAJaXZmLT5saW5rc3RhdGUJCT0gc19pbmZvLT5saW5rX3N0YXRlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9jbG9jay5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9jbG9jay5jCmluZGV4IDkwYjUzMDkuLjhhMDgzZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fY2xvY2suYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2Nsb2NrLmMKQEAgLTE2NCwyMCArMTY0LDE5IEBACiAgKiBSZWFkIHRoZSB0aW1lY291bnRlciBhbmQgcmV0dXJuIHRoZSBjb3JyZWN0IHZhbHVlIGluIG5zIGFmdGVyIGNvbnZlcnRpbmcKICAqIGl0IGludG8gYSBzdHJ1Y3QgdGltZXNwZWMuCiAgKiovCi1zdGF0aWMgaW50IG1seDRfZW5fcGhjX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYyAqdHMpCitzdGF0aWMgaW50IG1seDRfZW5fcGhjX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCisJCQkgICAgICAgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXN0cnVjdCBtbHg0X2VuX2RldiAqbWRldiA9IGNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBtbHg0X2VuX2RldiwKIAkJCQkJCXB0cF9jbG9ja19pbmZvKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiByZW1haW5kZXI7CiAJdTY0IG5zOwogCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZtZGV2LT5jbG9ja19sb2NrLCBmbGFncyk7CiAJbnMgPSB0aW1lY291bnRlcl9yZWFkKCZtZGV2LT5jbG9jayk7CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPmNsb2NrX2xvY2ssIGZsYWdzKTsKIAotCXRzLT50dl9zZWMgPSBkaXZfdTY0X3JlbShucywgTlNFQ19QRVJfU0VDLCAmcmVtYWluZGVyKTsKLQl0cy0+dHZfbnNlYyA9IHJlbWFpbmRlcjsKKwkqdHMgPSBuc190b190aW1lc3BlYzY0KG5zKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTkxLDExICsxOTAsMTEgQEAKICAqIHdhbGwgdGltZXIgdmFsdWUuCiAgKiovCiBzdGF0aWMgaW50IG1seDRfZW5fcGhjX3NldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cykKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJc3RydWN0IG1seDRfZW5fZGV2ICptZGV2ID0gY29udGFpbmVyX29mKHB0cCwgc3RydWN0IG1seDRfZW5fZGV2LAogCQkJCQkJcHRwX2Nsb2NrX2luZm8pOwotCXU2NCBucyA9IHRpbWVzcGVjX3RvX25zKHRzKTsKKwl1NjQgbnMgPSB0aW1lc3BlYzY0X3RvX25zKHRzKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogcmVzZXQgdGhlIHRpbWVjb3VudGVyICovCkBAIC0yMzIsOCArMjMxLDggQEAKIAkucHBzCQk9IDAsCiAJLmFkamZyZXEJPSBtbHg0X2VuX3BoY19hZGpmcmVxLAogCS5hZGp0aW1lCT0gbWx4NF9lbl9waGNfYWRqdGltZSwKLQkuZ2V0dGltZQk9IG1seDRfZW5fcGhjX2dldHRpbWUsCi0JLnNldHRpbWUJPSBtbHg0X2VuX3BoY19zZXR0aW1lLAorCS5nZXR0aW1lNjQJPSBtbHg0X2VuX3BoY19nZXR0aW1lLAorCS5zZXR0aW1lNjQJPSBtbHg0X2VuX3BoY19zZXR0aW1lLAogCS5lbmFibGUJCT0gbWx4NF9lbl9waGNfZW5hYmxlLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9kY2JfbmwuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fZGNiX25sLmMKaW5kZXggYzk1Y2EyNS4uZjAxOTE4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9kY2JfbmwuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2RjYl9ubC5jCkBAIC0zNSw2ICszNSw1MCBAQAogI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogCiAjaW5jbHVkZSAibWx4NF9lbi5oIgorI2luY2x1ZGUgImZ3X3Fvcy5oIgorCisvKiBEZWZpbml0aW9ucyBmb3IgUUNOCisgKi8KKworc3RydWN0IG1seDRfY29uZ2VzdGlvbl9jb250cm9sX21iX3ByaW9fODAyXzFfcWF1X3BhcmFtcyB7CisJX19iZTMyIG1vZGlmeV9lbmFibGVfaGlnaDsKKwlfX2JlMzIgbW9kaWZ5X2VuYWJsZV9sb3c7CisJX19iZTMyIHJlc2VydmVkMTsKKwlfX2JlMzIgZXh0ZW5kZWRfZW5hYmxlOworCV9fYmUzMiBycHBwX21heF9ycHM7CisJX19iZTMyIHJwZ190aW1lX3Jlc2V0OworCV9fYmUzMiBycGdfYnl0ZV9yZXNldDsKKwlfX2JlMzIgcnBnX3RocmVzaG9sZDsKKwlfX2JlMzIgcnBnX21heF9yYXRlOworCV9fYmUzMiBycGdfYWlfcmF0ZTsKKwlfX2JlMzIgcnBnX2hhaV9yYXRlOworCV9fYmUzMiBycGdfZ2Q7CisJX19iZTMyIHJwZ19taW5fZGVjX2ZhYzsKKwlfX2JlMzIgcnBnX21pbl9yYXRlOworCV9fYmUzMiBtYXhfdGltZV9yaXNlOworCV9fYmUzMiBtYXhfYnl0ZV9yaXNlOworCV9fYmUzMiBtYXhfcWRlbHRhOworCV9fYmUzMiBtaW5fcW9mZnNldDsKKwlfX2JlMzIgZ2RfY29lZmZpY2llbnQ7CisJX19iZTMyIHJlc2VydmVkMls1XTsKKwlfX2JlMzIgY3Bfc2FtcGxlX2Jhc2U7CisJX19iZTMyIHJlc2VydmVkM1szOV07Cit9OworCitzdHJ1Y3QgbWx4NF9jb25nZXN0aW9uX2NvbnRyb2xfbWJfcHJpb184MDJfMV9xYXVfc3RhdGlzdGljcyB7CisJX19iZTY0IHJwcHBfcnBfY2VudGlzZWNvbmRzOworCV9fYmUzMiByZXNlcnZlZDE7CisJX19iZTMyIGlnbm9yZWRfY25tOworCV9fYmUzMiBycHBwX2NyZWF0ZWRfcnBzOworCV9fYmUzMiBlc3RpbWF0ZWRfdG90YWxfcmF0ZTsKKwlfX2JlMzIgbWF4X2FjdGl2ZV9yYXRlX2xpbWl0ZXJfaW5kZXg7CisJX19iZTMyIGRyb3BwZWRfY25tc19idXN5X2Z3OworCV9fYmUzMiByZXNlcnZlZDI7CisJX19iZTMyIGNubXNfaGFuZGxlZF9zdWNjZXNzZnVsbHk7CisJX19iZTMyIG1pbl90b3RhbF9saW1pdGVyc19yYXRlOworCV9fYmUzMiBtYXhfdG90YWxfbGltaXRlcnNfcmF0ZTsKKwlfX2JlMzIgcmVzZXJ2ZWQzWzRdOworfTsKIAogc3RhdGljIGludCBtbHg0X2VuX2RjYm5sX2llZWVfZ2V0ZXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgc3RydWN0IGllZWVfZXRzICpldHMpCkBAIC0xODMsNiArMjI3LDEwIEBACiAJCQkJICAgIHByb2YtPnJ4X3BwcCk7CiAJaWYgKGVycikKIAkJZW5fZXJyKHByaXYsICJGYWlsZWQgc2V0dGluZyBwYXVzZSBwYXJhbXNcbiIpOworCWVsc2UKKwkJbWx4NF9lbl91cGRhdGVfcGZjX3N0YXRzX2JpdG1hcChtZGV2LT5kZXYsICZwcml2LT5zdGF0c19iaXRtYXAsCisJCQkJCQlwcm9mLT5yeF9wcHAsIHByb2YtPnJ4X3BhdXNlLAorCQkJCQkJcHJvZi0+dHhfcHBwLCBwcm9mLT50eF9wYXVzZSk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjQyLDYgKzI5MCwxNzggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBSUEdfRU5BQkxFX0JJVAkzMQorI2RlZmluZSBDTl9UQUdfQklUCTMwCisKK3N0YXRpYyBpbnQgbWx4NF9lbl9kY2JubF9pZWVlX2dldHFjbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGllZWVfcWNuICpxY24pCit7CisJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1seDRfY29uZ2VzdGlvbl9jb250cm9sX21iX3ByaW9fODAyXzFfcWF1X3BhcmFtcyAqaHdfcWNuOworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94X291dCA9IE5VTEw7CisJdTY0IG1haWxib3hfaW5fZG1hID0gMDsKKwl1MzIgaW5tb2QgPSAwOworCWludCBpLCBlcnI7CisKKwlpZiAoIShwcml2LT5tZGV2LT5kZXYtPmNhcHMuZmxhZ3MyICYgTUxYNF9ERVZfQ0FQX0ZMQUcyX1FDTikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCW1haWxib3hfb3V0ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChwcml2LT5tZGV2LT5kZXYpOworCWlmIChJU19FUlIobWFpbGJveF9vdXQpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlod19xY24gPQorCShzdHJ1Y3QgbWx4NF9jb25nZXN0aW9uX2NvbnRyb2xfbWJfcHJpb184MDJfMV9xYXVfcGFyYW1zICopCisJbWFpbGJveF9vdXQtPmJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBJRUVFXzgwMjFRQVpfTUFYX1RDUzsgaSsrKSB7CisJCWlubW9kID0gcHJpdi0+cG9ydCB8ICgoMSA8PCBpKSA8PCA4KSB8CisJCQkgKE1MWDRfQ1RSTF9BTEdPXzgwMl8xX1FBVV9SRUFDVElPTl9QT0lOVCA8PCAxNik7CisJCWVyciA9IG1seDRfY21kX2JveChwcml2LT5tZGV2LT5kZXYsIG1haWxib3hfaW5fZG1hLAorCQkJCSAgIG1haWxib3hfb3V0LT5kbWEsCisJCQkJICAgaW5tb2QsIE1MWDRfQ09OR0VTVElPTl9DT05UUk9MX0dFVF9QQVJBTVMsCisJCQkJICAgTUxYNF9DTURfQ09OR0VTVElPTl9DVFJMX09QQ09ERSwKKwkJCQkgICBNTFg0X0NNRF9USU1FX0NMQVNTX0MsCisJCQkJICAgTUxYNF9DTURfTkFUSVZFKTsKKwkJaWYgKGVycikgeworCQkJbWx4NF9mcmVlX2NtZF9tYWlsYm94KHByaXYtPm1kZXYtPmRldiwgbWFpbGJveF9vdXQpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCXFjbi0+cnBnX2VuYWJsZVtpXSA9CisJCQliZTMyX3RvX2NwdShod19xY24tPmV4dGVuZGVkX2VuYWJsZSkgPj4gUlBHX0VOQUJMRV9CSVQ7CisJCXFjbi0+cnBwcF9tYXhfcnBzW2ldID0KKwkJCWJlMzJfdG9fY3B1KGh3X3Fjbi0+cnBwcF9tYXhfcnBzKTsKKwkJcWNuLT5ycGdfdGltZV9yZXNldFtpXSA9CisJCQliZTMyX3RvX2NwdShod19xY24tPnJwZ190aW1lX3Jlc2V0KTsKKwkJcWNuLT5ycGdfYnl0ZV9yZXNldFtpXSA9CisJCQliZTMyX3RvX2NwdShod19xY24tPnJwZ19ieXRlX3Jlc2V0KTsKKwkJcWNuLT5ycGdfdGhyZXNob2xkW2ldID0KKwkJCWJlMzJfdG9fY3B1KGh3X3Fjbi0+cnBnX3RocmVzaG9sZCk7CisJCXFjbi0+cnBnX21heF9yYXRlW2ldID0KKwkJCWJlMzJfdG9fY3B1KGh3X3Fjbi0+cnBnX21heF9yYXRlKTsKKwkJcWNuLT5ycGdfYWlfcmF0ZVtpXSA9CisJCQliZTMyX3RvX2NwdShod19xY24tPnJwZ19haV9yYXRlKTsKKwkJcWNuLT5ycGdfaGFpX3JhdGVbaV0gPQorCQkJYmUzMl90b19jcHUoaHdfcWNuLT5ycGdfaGFpX3JhdGUpOworCQlxY24tPnJwZ19nZFtpXSA9CisJCQliZTMyX3RvX2NwdShod19xY24tPnJwZ19nZCk7CisJCXFjbi0+cnBnX21pbl9kZWNfZmFjW2ldID0KKwkJCWJlMzJfdG9fY3B1KGh3X3Fjbi0+cnBnX21pbl9kZWNfZmFjKTsKKwkJcWNuLT5ycGdfbWluX3JhdGVbaV0gPQorCQkJYmUzMl90b19jcHUoaHdfcWNuLT5ycGdfbWluX3JhdGUpOworCQlxY24tPmNuZGRfc3RhdGVfbWFjaGluZVtpXSA9CisJCQlwcml2LT5jbmRkX3N0YXRlW2ldOworCX0KKwltbHg0X2ZyZWVfY21kX21haWxib3gocHJpdi0+bWRldi0+ZGV2LCBtYWlsYm94X291dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWx4NF9lbl9kY2JubF9pZWVlX3NldHFjbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgc3RydWN0IGllZWVfcWNuICpxY24pCit7CisJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG1seDRfY29uZ2VzdGlvbl9jb250cm9sX21iX3ByaW9fODAyXzFfcWF1X3BhcmFtcyAqaHdfcWNuOworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94X2luID0gTlVMTDsKKwl1NjQgbWFpbGJveF9pbl9kbWEgPSAwOworCXUzMiBpbm1vZCA9IDA7CisJaW50IGksIGVycjsKKyNkZWZpbmUgTU9ESUZZX0VOQUJMRV9ISUdIX01BU0sgMHhjMDAwMDAwMAorI2RlZmluZSBNT0RJRllfRU5BQkxFX0xPV19NQVNLIDB4ZmZjMDAwMDAKKworCWlmICghKHByaXYtPm1kZXYtPmRldi0+Y2Fwcy5mbGFnczIgJiBNTFg0X0RFVl9DQVBfRkxBRzJfUUNOKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbWFpbGJveF9pbiA9IG1seDRfYWxsb2NfY21kX21haWxib3gocHJpdi0+bWRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKG1haWxib3hfaW4pKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1haWxib3hfaW5fZG1hID0gbWFpbGJveF9pbi0+ZG1hOworCWh3X3FjbiA9CisJKHN0cnVjdCBtbHg0X2Nvbmdlc3Rpb25fY29udHJvbF9tYl9wcmlvXzgwMl8xX3FhdV9wYXJhbXMgKiltYWlsYm94X2luLT5idWY7CisJZm9yIChpID0gMDsgaSA8IElFRUVfODAyMVFBWl9NQVhfVENTOyBpKyspIHsKKwkJaW5tb2QgPSBwcml2LT5wb3J0IHwgKCgxIDw8IGkpIDw8IDgpIHwKKwkJCSAoTUxYNF9DVFJMX0FMR09fODAyXzFfUUFVX1JFQUNUSU9OX1BPSU5UIDw8IDE2KTsKKworCQkvKiBCZWZvcmUgdXBkYXRpbmcgUUNOIHBhcmFtZXRlciwKKwkJICogbmVlZCB0byBzZXQgaXQncyBtb2RpZnkgZW5hYmxlIGJpdCB0byAxCisJCSAqLworCisJCWh3X3Fjbi0+bW9kaWZ5X2VuYWJsZV9oaWdoID0gY3B1X3RvX2JlMzIoCisJCQkJCQlNT0RJRllfRU5BQkxFX0hJR0hfTUFTSyk7CisJCWh3X3Fjbi0+bW9kaWZ5X2VuYWJsZV9sb3cgPSBjcHVfdG9fYmUzMihNT0RJRllfRU5BQkxFX0xPV19NQVNLKTsKKworCQlod19xY24tPmV4dGVuZGVkX2VuYWJsZSA9IGNwdV90b19iZTMyKHFjbi0+cnBnX2VuYWJsZVtpXSA8PCBSUEdfRU5BQkxFX0JJVCk7CisJCWh3X3Fjbi0+cnBwcF9tYXhfcnBzID0gY3B1X3RvX2JlMzIocWNuLT5ycHBwX21heF9ycHNbaV0pOworCQlod19xY24tPnJwZ190aW1lX3Jlc2V0ID0gY3B1X3RvX2JlMzIocWNuLT5ycGdfdGltZV9yZXNldFtpXSk7CisJCWh3X3Fjbi0+cnBnX2J5dGVfcmVzZXQgPSBjcHVfdG9fYmUzMihxY24tPnJwZ19ieXRlX3Jlc2V0W2ldKTsKKwkJaHdfcWNuLT5ycGdfdGhyZXNob2xkID0gY3B1X3RvX2JlMzIocWNuLT5ycGdfdGhyZXNob2xkW2ldKTsKKwkJaHdfcWNuLT5ycGdfbWF4X3JhdGUgPSBjcHVfdG9fYmUzMihxY24tPnJwZ19tYXhfcmF0ZVtpXSk7CisJCWh3X3Fjbi0+cnBnX2FpX3JhdGUgPSBjcHVfdG9fYmUzMihxY24tPnJwZ19haV9yYXRlW2ldKTsKKwkJaHdfcWNuLT5ycGdfaGFpX3JhdGUgPSBjcHVfdG9fYmUzMihxY24tPnJwZ19oYWlfcmF0ZVtpXSk7CisJCWh3X3Fjbi0+cnBnX2dkID0gY3B1X3RvX2JlMzIocWNuLT5ycGdfZ2RbaV0pOworCQlod19xY24tPnJwZ19taW5fZGVjX2ZhYyA9IGNwdV90b19iZTMyKHFjbi0+cnBnX21pbl9kZWNfZmFjW2ldKTsKKwkJaHdfcWNuLT5ycGdfbWluX3JhdGUgPSBjcHVfdG9fYmUzMihxY24tPnJwZ19taW5fcmF0ZVtpXSk7CisJCXByaXYtPmNuZGRfc3RhdGVbaV0gPSBxY24tPmNuZGRfc3RhdGVfbWFjaGluZVtpXTsKKwkJaWYgKHFjbi0+Y25kZF9zdGF0ZV9tYWNoaW5lW2ldID09IERDQl9DTkREX0lOVEVSSU9SX1JFQURZKQorCQkJaHdfcWNuLT5leHRlbmRlZF9lbmFibGUgfD0gY3B1X3RvX2JlMzIoMSA8PCBDTl9UQUdfQklUKTsKKworCQllcnIgPSBtbHg0X2NtZChwcml2LT5tZGV2LT5kZXYsIG1haWxib3hfaW5fZG1hLCBpbm1vZCwKKwkJCSAgICAgICBNTFg0X0NPTkdFU1RJT05fQ09OVFJPTF9TRVRfUEFSQU1TLAorCQkJICAgICAgIE1MWDRfQ01EX0NPTkdFU1RJT05fQ1RSTF9PUENPREUsCisJCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19DLAorCQkJICAgICAgIE1MWDRfQ01EX05BVElWRSk7CisJCWlmIChlcnIpIHsKKwkJCW1seDRfZnJlZV9jbWRfbWFpbGJveChwcml2LT5tZGV2LT5kZXYsIG1haWxib3hfaW4pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwltbHg0X2ZyZWVfY21kX21haWxib3gocHJpdi0+bWRldi0+ZGV2LCBtYWlsYm94X2luKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtbHg0X2VuX2RjYm5sX2llZWVfZ2V0cWNuc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICBzdHJ1Y3QgaWVlZV9xY25fc3RhdHMgKnFjbl9zdGF0cykKK3sKKwlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9jb25nZXN0aW9uX2NvbnRyb2xfbWJfcHJpb184MDJfMV9xYXVfc3RhdGlzdGljcyAqaHdfcWNuX3N0YXRzOworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94X291dCA9IE5VTEw7CisJdTY0IG1haWxib3hfaW5fZG1hID0gMDsKKwl1MzIgaW5tb2QgPSAwOworCWludCBpLCBlcnI7CisKKwlpZiAoIShwcml2LT5tZGV2LT5kZXYtPmNhcHMuZmxhZ3MyICYgTUxYNF9ERVZfQ0FQX0ZMQUcyX1FDTikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCW1haWxib3hfb3V0ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChwcml2LT5tZGV2LT5kZXYpOworCWlmIChJU19FUlIobWFpbGJveF9vdXQpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWh3X3Fjbl9zdGF0cyA9CisJKHN0cnVjdCBtbHg0X2Nvbmdlc3Rpb25fY29udHJvbF9tYl9wcmlvXzgwMl8xX3FhdV9zdGF0aXN0aWNzICopCisJbWFpbGJveF9vdXQtPmJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBJRUVFXzgwMjFRQVpfTUFYX1RDUzsgaSsrKSB7CisJCWlubW9kID0gcHJpdi0+cG9ydCB8ICgoMSA8PCBpKSA8PCA4KSB8CisJCQkgKE1MWDRfQ1RSTF9BTEdPXzgwMl8xX1FBVV9SRUFDVElPTl9QT0lOVCA8PCAxNik7CisJCWVyciA9IG1seDRfY21kX2JveChwcml2LT5tZGV2LT5kZXYsIG1haWxib3hfaW5fZG1hLAorCQkJCSAgIG1haWxib3hfb3V0LT5kbWEsIGlubW9kLAorCQkJCSAgIE1MWDRfQ09OR0VTVElPTl9DT05UUk9MX0dFVF9TVEFUSVNUSUNTLAorCQkJCSAgIE1MWDRfQ01EX0NPTkdFU1RJT05fQ1RSTF9PUENPREUsCisJCQkJICAgTUxYNF9DTURfVElNRV9DTEFTU19DLAorCQkJCSAgIE1MWDRfQ01EX05BVElWRSk7CisJCWlmIChlcnIpIHsKKwkJCW1seDRfZnJlZV9jbWRfbWFpbGJveChwcml2LT5tZGV2LT5kZXYsIG1haWxib3hfb3V0KTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJcWNuX3N0YXRzLT5ycHBwX3JwX2NlbnRpc2Vjb25kc1tpXSA9CisJCQliZTY0X3RvX2NwdShod19xY25fc3RhdHMtPnJwcHBfcnBfY2VudGlzZWNvbmRzKTsKKwkJcWNuX3N0YXRzLT5ycHBwX2NyZWF0ZWRfcnBzW2ldID0KKwkJCWJlMzJfdG9fY3B1KGh3X3Fjbl9zdGF0cy0+cnBwcF9jcmVhdGVkX3Jwcyk7CisJfQorCW1seDRfZnJlZV9jbWRfbWFpbGJveChwcml2LT5tZGV2LT5kZXYsIG1haWxib3hfb3V0KTsKKwlyZXR1cm4gMDsKK30KKwogY29uc3Qgc3RydWN0IGRjYm5sX3J0bmxfb3BzIG1seDRfZW5fZGNibmxfb3BzID0gewogCS5pZWVlX2dldGV0cwk9IG1seDRfZW5fZGNibmxfaWVlZV9nZXRldHMsCiAJLmllZWVfc2V0ZXRzCT0gbWx4NF9lbl9kY2JubF9pZWVlX3NldGV0cywKQEAgLTI1Miw2ICs0NzIsOSBAQAogCiAJLmdldGRjYngJPSBtbHg0X2VuX2RjYm5sX2dldGRjYngsCiAJLnNldGRjYngJPSBtbHg0X2VuX2RjYm5sX3NldGRjYngsCisJLmllZWVfZ2V0cWNuCT0gbWx4NF9lbl9kY2JubF9pZWVlX2dldHFjbiwKKwkuaWVlZV9zZXRxY24JPSBtbHg0X2VuX2RjYm5sX2llZWVfc2V0cWNuLAorCS5pZWVlX2dldHFjbnN0YXRzID0gbWx4NF9lbl9kY2JubF9pZWVlX2dldHFjbnN0YXRzLAogfTsKIAogY29uc3Qgc3RydWN0IGRjYm5sX3J0bmxfb3BzIG1seDRfZW5fZGNibmxfcGZjX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9ldGh0b29sLmMKaW5kZXggYTdiNThiYS4uM2Y0NGUyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9ldGh0b29sLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAKICNpbmNsdWRlICJtbHg0X2VuLmgiCiAjaW5jbHVkZSAiZW5fcG9ydC5oIgpAQCAtMTA0LDYgKzEwNSw3IEBACiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciBtYWluX3N0cmluZ3NbXVtFVEhfR1NUUklOR19MRU5dID0geworCS8qIG1haW4gc3RhdGlzdGljcyAqLwogCSJyeF9wYWNrZXRzIiwgInR4X3BhY2tldHMiLCAicnhfYnl0ZXMiLCAidHhfYnl0ZXMiLCAicnhfZXJyb3JzIiwKIAkidHhfZXJyb3JzIiwgInJ4X2Ryb3BwZWQiLCAidHhfZHJvcHBlZCIsICJtdWx0aWNhc3QiLCAiY29sbGlzaW9ucyIsCiAJInJ4X2xlbmd0aF9lcnJvcnMiLCAicnhfb3Zlcl9lcnJvcnMiLCAicnhfY3JjX2Vycm9ycyIsCkBAIC0xMTcsMTQgKzExOSw3NiBAQAogCSJxdWV1ZV9zdG9wcGVkIiwgIndha2VfcXVldWUiLCAidHhfdGltZW91dCIsICJyeF9hbGxvY19mYWlsZWQiLAogCSJyeF9jc3VtX2dvb2QiLCAicnhfY3N1bV9ub25lIiwgInJ4X2NzdW1fY29tcGxldGUiLCAidHhfY2hrc3VtX29mZmxvYWQiLAogCisJLyogcHJpb3JpdHkgZmxvdyBjb250cm9sIHN0YXRpc3RpY3MgcnggKi8KKwkicnhfcGF1c2VfcHJpb18wIiwgInJ4X3BhdXNlX2R1cmF0aW9uX3ByaW9fMCIsCisJInJ4X3BhdXNlX3RyYW5zaXRpb25fcHJpb18wIiwKKwkicnhfcGF1c2VfcHJpb18xIiwgInJ4X3BhdXNlX2R1cmF0aW9uX3ByaW9fMSIsCisJInJ4X3BhdXNlX3RyYW5zaXRpb25fcHJpb18xIiwKKwkicnhfcGF1c2VfcHJpb18yIiwgInJ4X3BhdXNlX2R1cmF0aW9uX3ByaW9fMiIsCisJInJ4X3BhdXNlX3RyYW5zaXRpb25fcHJpb18yIiwKKwkicnhfcGF1c2VfcHJpb18zIiwgInJ4X3BhdXNlX2R1cmF0aW9uX3ByaW9fMyIsCisJInJ4X3BhdXNlX3RyYW5zaXRpb25fcHJpb18zIiwKKwkicnhfcGF1c2VfcHJpb180IiwgInJ4X3BhdXNlX2R1cmF0aW9uX3ByaW9fNCIsCisJInJ4X3BhdXNlX3RyYW5zaXRpb25fcHJpb180IiwKKwkicnhfcGF1c2VfcHJpb181IiwgInJ4X3BhdXNlX2R1cmF0aW9uX3ByaW9fNSIsCisJInJ4X3BhdXNlX3RyYW5zaXRpb25fcHJpb181IiwKKwkicnhfcGF1c2VfcHJpb182IiwgInJ4X3BhdXNlX2R1cmF0aW9uX3ByaW9fNiIsCisJInJ4X3BhdXNlX3RyYW5zaXRpb25fcHJpb182IiwKKwkicnhfcGF1c2VfcHJpb183IiwgInJ4X3BhdXNlX2R1cmF0aW9uX3ByaW9fNyIsCisJInJ4X3BhdXNlX3RyYW5zaXRpb25fcHJpb183IiwKKworCS8qIGZsb3cgY29udHJvbCBzdGF0aXN0aWNzIHJ4ICovCisJInJ4X3BhdXNlIiwgInJ4X3BhdXNlX2R1cmF0aW9uIiwgInJ4X3BhdXNlX3RyYW5zaXRpb24iLAorCisJLyogcHJpb3JpdHkgZmxvdyBjb250cm9sIHN0YXRpc3RpY3MgdHggKi8KKwkidHhfcGF1c2VfcHJpb18wIiwgInR4X3BhdXNlX2R1cmF0aW9uX3ByaW9fMCIsCisJInR4X3BhdXNlX3RyYW5zaXRpb25fcHJpb18wIiwKKwkidHhfcGF1c2VfcHJpb18xIiwgInR4X3BhdXNlX2R1cmF0aW9uX3ByaW9fMSIsCisJInR4X3BhdXNlX3RyYW5zaXRpb25fcHJpb18xIiwKKwkidHhfcGF1c2VfcHJpb18yIiwgInR4X3BhdXNlX2R1cmF0aW9uX3ByaW9fMiIsCisJInR4X3BhdXNlX3RyYW5zaXRpb25fcHJpb18yIiwKKwkidHhfcGF1c2VfcHJpb18zIiwgInR4X3BhdXNlX2R1cmF0aW9uX3ByaW9fMyIsCisJInR4X3BhdXNlX3RyYW5zaXRpb25fcHJpb18zIiwKKwkidHhfcGF1c2VfcHJpb180IiwgInR4X3BhdXNlX2R1cmF0aW9uX3ByaW9fNCIsCisJInR4X3BhdXNlX3RyYW5zaXRpb25fcHJpb180IiwKKwkidHhfcGF1c2VfcHJpb181IiwgInR4X3BhdXNlX2R1cmF0aW9uX3ByaW9fNSIsCisJInR4X3BhdXNlX3RyYW5zaXRpb25fcHJpb181IiwKKwkidHhfcGF1c2VfcHJpb182IiwgInR4X3BhdXNlX2R1cmF0aW9uX3ByaW9fNiIsCisJInR4X3BhdXNlX3RyYW5zaXRpb25fcHJpb182IiwKKwkidHhfcGF1c2VfcHJpb183IiwgInR4X3BhdXNlX2R1cmF0aW9uX3ByaW9fNyIsCisJInR4X3BhdXNlX3RyYW5zaXRpb25fcHJpb183IiwKKworCS8qIGZsb3cgY29udHJvbCBzdGF0aXN0aWNzIHR4ICovCisJInR4X3BhdXNlIiwgInR4X3BhdXNlX2R1cmF0aW9uIiwgInR4X3BhdXNlX3RyYW5zaXRpb24iLAorCiAJLyogcGFja2V0IHN0YXRpc3RpY3MgKi8KLQkiYnJvYWRjYXN0IiwgInJ4X3ByaW9fMCIsICJyeF9wcmlvXzEiLCAicnhfcHJpb18yIiwgInJ4X3ByaW9fMyIsCi0JInJ4X3ByaW9fNCIsICJyeF9wcmlvXzUiLCAicnhfcHJpb182IiwgInJ4X3ByaW9fNyIsICJ0eF9wcmlvXzAiLAotCSJ0eF9wcmlvXzEiLCAidHhfcHJpb18yIiwgInR4X3ByaW9fMyIsICJ0eF9wcmlvXzQiLCAidHhfcHJpb181IiwKLQkidHhfcHJpb182IiwgInR4X3ByaW9fNyIsCisJInJ4X211bHRpY2FzdF9wYWNrZXRzIiwKKwkicnhfYnJvYWRjYXN0X3BhY2tldHMiLAorCSJyeF9qYWJiZXJzIiwKKwkicnhfaW5fcmFuZ2VfbGVuZ3RoX2Vycm9yIiwKKwkicnhfb3V0X3JhbmdlX2xlbmd0aF9lcnJvciIsCisJInR4X211bHRpY2FzdF9wYWNrZXRzIiwKKwkidHhfYnJvYWRjYXN0X3BhY2tldHMiLAorCSJyeF9wcmlvXzBfcGFja2V0cyIsICJyeF9wcmlvXzBfYnl0ZXMiLAorCSJyeF9wcmlvXzFfcGFja2V0cyIsICJyeF9wcmlvXzFfYnl0ZXMiLAorCSJyeF9wcmlvXzJfcGFja2V0cyIsICJyeF9wcmlvXzJfYnl0ZXMiLAorCSJyeF9wcmlvXzNfcGFja2V0cyIsICJyeF9wcmlvXzNfYnl0ZXMiLAorCSJyeF9wcmlvXzRfcGFja2V0cyIsICJyeF9wcmlvXzRfYnl0ZXMiLAorCSJyeF9wcmlvXzVfcGFja2V0cyIsICJyeF9wcmlvXzVfYnl0ZXMiLAorCSJyeF9wcmlvXzZfcGFja2V0cyIsICJyeF9wcmlvXzZfYnl0ZXMiLAorCSJyeF9wcmlvXzdfcGFja2V0cyIsICJyeF9wcmlvXzdfYnl0ZXMiLAorCSJyeF9ub3ZsYW5fcGFja2V0cyIsICJyeF9ub3ZsYW5fYnl0ZXMiLAorCSJ0eF9wcmlvXzBfcGFja2V0cyIsICJ0eF9wcmlvXzBfYnl0ZXMiLAorCSJ0eF9wcmlvXzFfcGFja2V0cyIsICJ0eF9wcmlvXzFfYnl0ZXMiLAorCSJ0eF9wcmlvXzJfcGFja2V0cyIsICJ0eF9wcmlvXzJfYnl0ZXMiLAorCSJ0eF9wcmlvXzNfcGFja2V0cyIsICJ0eF9wcmlvXzNfYnl0ZXMiLAorCSJ0eF9wcmlvXzRfcGFja2V0cyIsICJ0eF9wcmlvXzRfYnl0ZXMiLAorCSJ0eF9wcmlvXzVfcGFja2V0cyIsICJ0eF9wcmlvXzVfYnl0ZXMiLAorCSJ0eF9wcmlvXzZfcGFja2V0cyIsICJ0eF9wcmlvXzZfYnl0ZXMiLAorCSJ0eF9wcmlvXzdfcGFja2V0cyIsICJ0eF9wcmlvXzdfYnl0ZXMiLAorCSJ0eF9ub3ZsYW5fcGFja2V0cyIsICJ0eF9ub3ZsYW5fYnl0ZXMiLAorCiB9OwotI2RlZmluZSBOVU1fTUFJTl9TVEFUUwkyMQotI2RlZmluZSBOVU1fQUxMX1NUQVRTCShOVU1fTUFJTl9TVEFUUyArIE5VTV9QT1JUX1NUQVRTICsgTlVNX1BLVF9TVEFUUyArIE5VTV9QRVJGX1NUQVRTKQogCiBzdGF0aWMgY29uc3QgY2hhciBtbHg0X2VuX3Rlc3RfbmFtZXNbXVtFVEhfR1NUUklOR19MRU5dPSB7CiAJIkludGVycnVwdCBUZXN0IiwKQEAgLTIyNCwxNCArMjg4LDUwIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RydWN0IGJpdG1hcF9pdGVyYXRvciB7CisJdW5zaWduZWQgbG9uZyAqc3RhdHNfYml0bWFwOworCXVuc2lnbmVkIGludCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgaXRlcmF0b3I7CisJYm9vbCBhZHZhbmNlX2FycmF5OyAvKiBpZiBzZXQsIGZvcmNlIG5vIGluY3JlbWVudHMgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiaXRtYXBfaXRlcmF0b3JfaW5pdChzdHJ1Y3QgYml0bWFwX2l0ZXJhdG9yICpoLAorCQkJCQl1bnNpZ25lZCBsb25nICpzdGF0c19iaXRtYXAsCisJCQkJCWludCBjb3VudCkKK3sKKwloLT5pdGVyYXRvciA9IDA7CisJaC0+YWR2YW5jZV9hcnJheSA9ICFiaXRtYXBfZW1wdHkoc3RhdHNfYml0bWFwLCBjb3VudCk7CisJaC0+Y291bnQgPSBoLT5hZHZhbmNlX2FycmF5ID8gYml0bWFwX3dlaWdodChzdGF0c19iaXRtYXAsIGNvdW50KQorCQk6IGNvdW50OworCWgtPnN0YXRzX2JpdG1hcCA9IHN0YXRzX2JpdG1hcDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYml0bWFwX2l0ZXJhdG9yX3Rlc3Qoc3RydWN0IGJpdG1hcF9pdGVyYXRvciAqaCkKK3sKKwlyZXR1cm4gIWgtPmFkdmFuY2VfYXJyYXkgPyAxIDogdGVzdF9iaXQoaC0+aXRlcmF0b3IsIGgtPnN0YXRzX2JpdG1hcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGJpdG1hcF9pdGVyYXRvcl9pbmMoc3RydWN0IGJpdG1hcF9pdGVyYXRvciAqaCkKK3sKKwlyZXR1cm4gaC0+aXRlcmF0b3IrKzsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2JpdG1hcF9pdGVyYXRvcl9jb3VudChzdHJ1Y3QgYml0bWFwX2l0ZXJhdG9yICpoKQoreworCXJldHVybiBoLT5jb3VudDsKK30KKwogc3RhdGljIGludCBtbHg0X2VuX2dldF9zc2V0X2NvdW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBzc2V0KQogewogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBiaXRfY291bnQgPSBod2VpZ2h0NjQocHJpdi0+c3RhdHNfYml0bWFwKTsKKwlzdHJ1Y3QgYml0bWFwX2l0ZXJhdG9yIGl0OworCisJYml0bWFwX2l0ZXJhdG9yX2luaXQoJml0LCBwcml2LT5zdGF0c19iaXRtYXAuYml0bWFwLCBOVU1fQUxMX1NUQVRTKTsKIAogCXN3aXRjaCAoc3NldCkgewogCWNhc2UgRVRIX1NTX1NUQVRTOgotCQlyZXR1cm4gKHByaXYtPnN0YXRzX2JpdG1hcCA/IGJpdF9jb3VudCA6IE5VTV9BTExfU1RBVFMpICsKKwkJcmV0dXJuIGJpdG1hcF9pdGVyYXRvcl9jb3VudCgmaXQpICsKIAkJCShwcml2LT50eF9yaW5nX251bSAqIDIpICsKICNpZmRlZiBDT05GSUdfTkVUX1JYX0JVU1lfUE9MTAogCQkJKHByaXYtPnJ4X3JpbmdfbnVtICogNSk7CkBAIC0yNTMsMzQgKzM1Myw0NSBAQAogewogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpbmRleCA9IDA7Ci0JaW50IGksIGogPSAwOworCWludCBpOworCXN0cnVjdCBiaXRtYXBfaXRlcmF0b3IgaXQ7CisKKwliaXRtYXBfaXRlcmF0b3JfaW5pdCgmaXQsIHByaXYtPnN0YXRzX2JpdG1hcC5iaXRtYXAsIE5VTV9BTExfU1RBVFMpOwogCiAJc3Bpbl9sb2NrX2JoKCZwcml2LT5zdGF0c19sb2NrKTsKIAotCWlmICghKHByaXYtPnN0YXRzX2JpdG1hcCkpIHsKLQkJZm9yIChpID0gMDsgaSA8IE5VTV9NQUlOX1NUQVRTOyBpKyspCisJZm9yIChpID0gMDsgaSA8IE5VTV9NQUlOX1NUQVRTOyBpKyssIGJpdG1hcF9pdGVyYXRvcl9pbmMoJml0KSkKKwkJaWYgKGJpdG1hcF9pdGVyYXRvcl90ZXN0KCZpdCkpCisJCQlkYXRhW2luZGV4KytdID0gKCh1bnNpZ25lZCBsb25nICopJnByaXYtPnN0YXRzKVtpXTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fUE9SVF9TVEFUUzsgaSsrLCBiaXRtYXBfaXRlcmF0b3JfaW5jKCZpdCkpCisJCWlmIChiaXRtYXBfaXRlcmF0b3JfdGVzdCgmaXQpKQorCQkJZGF0YVtpbmRleCsrXSA9ICgodW5zaWduZWQgbG9uZyAqKSZwcml2LT5wb3J0X3N0YXRzKVtpXTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRkxPV19QUklPUklUWV9TVEFUU19SWDsKKwkgICAgIGkrKywgYml0bWFwX2l0ZXJhdG9yX2luYygmaXQpKQorCQlpZiAoYml0bWFwX2l0ZXJhdG9yX3Rlc3QoJml0KSkKIAkJCWRhdGFbaW5kZXgrK10gPQotCQkJCSgodW5zaWduZWQgbG9uZyAqKSAmcHJpdi0+c3RhdHMpW2ldOwotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1BPUlRfU1RBVFM7IGkrKykKKwkJCQkoKHU2NCAqKSZwcml2LT5yeF9wcmlvcml0eV9mbG93c3RhdHMpW2ldOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GTE9XX1NUQVRTX1JYOyBpKyssIGJpdG1hcF9pdGVyYXRvcl9pbmMoJml0KSkKKwkJaWYgKGJpdG1hcF9pdGVyYXRvcl90ZXN0KCZpdCkpCisJCQlkYXRhW2luZGV4KytdID0gKCh1NjQgKikmcHJpdi0+cnhfZmxvd3N0YXRzKVtpXTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fRkxPV19QUklPUklUWV9TVEFUU19UWDsKKwkgICAgIGkrKywgYml0bWFwX2l0ZXJhdG9yX2luYygmaXQpKQorCQlpZiAoYml0bWFwX2l0ZXJhdG9yX3Rlc3QoJml0KSkKIAkJCWRhdGFbaW5kZXgrK10gPQotCQkJCSgodW5zaWduZWQgbG9uZyAqKSAmcHJpdi0+cG9ydF9zdGF0cylbaV07Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fUEtUX1NUQVRTOyBpKyspCi0JCQlkYXRhW2luZGV4KytdID0KLQkJCQkoKHVuc2lnbmVkIGxvbmcgKikgJnByaXYtPnBrc3RhdHMpW2ldOwotCX0gZWxzZSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fTUFJTl9TVEFUUzsgaSsrKSB7Ci0JCQlpZiAoKHByaXYtPnN0YXRzX2JpdG1hcCA+PiBqKSAmIDEpCi0JCQkJZGF0YVtpbmRleCsrXSA9Ci0JCQkJKCh1bnNpZ25lZCBsb25nICopICZwcml2LT5zdGF0cylbaV07Ci0JCQlqKys7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IE5VTV9QT1JUX1NUQVRTOyBpKyspIHsKLQkJCWlmICgocHJpdi0+c3RhdHNfYml0bWFwID4+IGopICYgMSkKLQkJCQlkYXRhW2luZGV4KytdID0KLQkJCQkoKHVuc2lnbmVkIGxvbmcgKikgJnByaXYtPnBvcnRfc3RhdHMpW2ldOwotCQkJaisrOwotCQl9Ci0JfQorCQkJCSgodTY0ICopJnByaXYtPnR4X3ByaW9yaXR5X2Zsb3dzdGF0cylbaV07CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZMT1dfU1RBVFNfVFg7IGkrKywgYml0bWFwX2l0ZXJhdG9yX2luYygmaXQpKQorCQlpZiAoYml0bWFwX2l0ZXJhdG9yX3Rlc3QoJml0KSkKKwkJCWRhdGFbaW5kZXgrK10gPSAoKHU2NCAqKSZwcml2LT50eF9mbG93c3RhdHMpW2ldOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9QS1RfU1RBVFM7IGkrKywgYml0bWFwX2l0ZXJhdG9yX2luYygmaXQpKQorCQlpZiAoYml0bWFwX2l0ZXJhdG9yX3Rlc3QoJml0KSkKKwkJCWRhdGFbaW5kZXgrK10gPSAoKHVuc2lnbmVkIGxvbmcgKikmcHJpdi0+cGtzdGF0cylbaV07CisKIAlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+dHhfcmluZ19udW07IGkrKykgewogCQlkYXRhW2luZGV4KytdID0gcHJpdi0+dHhfcmluZ1tpXS0+cGFja2V0czsKIAkJZGF0YVtpbmRleCsrXSA9IHByaXYtPnR4X3JpbmdbaV0tPmJ5dGVzOwpAQCAtMzA5LDcgKzQyMCwxMCBAQAogewogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpbmRleCA9IDA7Ci0JaW50IGk7CisJaW50IGksIHN0cmluZ3MgPSAwOworCXN0cnVjdCBiaXRtYXBfaXRlcmF0b3IgaXQ7CisKKwliaXRtYXBfaXRlcmF0b3JfaW5pdCgmaXQsIHByaXYtPnN0YXRzX2JpdG1hcC5iaXRtYXAsIE5VTV9BTExfU1RBVFMpOwogCiAJc3dpdGNoIChzdHJpbmdzZXQpIHsKIAljYXNlIEVUSF9TU19URVNUOgpAQCAtMzIyLDI5ICs0MzYsMzAgQEAKIAogCWNhc2UgRVRIX1NTX1NUQVRTOgogCQkvKiBBZGQgbWFpbiBjb3VudGVycyAqLwotCQlpZiAoIXByaXYtPnN0YXRzX2JpdG1hcCkgewotCQkJZm9yIChpID0gMDsgaSA8IE5VTV9NQUlOX1NUQVRTOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fTUFJTl9TVEFUUzsgaSsrLCBzdHJpbmdzKyssCisJCSAgICAgYml0bWFwX2l0ZXJhdG9yX2luYygmaXQpKQorCQkJaWYgKGJpdG1hcF9pdGVyYXRvcl90ZXN0KCZpdCkpCiAJCQkJc3RyY3B5KGRhdGEgKyAoaW5kZXgrKykgKiBFVEhfR1NUUklOR19MRU4sCi0JCQkJCW1haW5fc3RyaW5nc1tpXSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1BPUlRfU1RBVFM7IGkrKykKKwkJCQkgICAgICAgbWFpbl9zdHJpbmdzW3N0cmluZ3NdKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1BPUlRfU1RBVFM7IGkrKywgc3RyaW5ncysrLAorCQkgICAgIGJpdG1hcF9pdGVyYXRvcl9pbmMoJml0KSkKKwkJCWlmIChiaXRtYXBfaXRlcmF0b3JfdGVzdCgmaXQpKQogCQkJCXN0cmNweShkYXRhICsgKGluZGV4KyspICogRVRIX0dTVFJJTkdfTEVOLAotCQkJCQltYWluX3N0cmluZ3NbaSArCi0JCQkJCU5VTV9NQUlOX1NUQVRTXSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1BLVF9TVEFUUzsgaSsrKQorCQkJCSAgICAgICBtYWluX3N0cmluZ3Nbc3RyaW5nc10pOworCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRkxPV19TVEFUUzsgaSsrLCBzdHJpbmdzKyssCisJCSAgICAgYml0bWFwX2l0ZXJhdG9yX2luYygmaXQpKQorCQkJaWYgKGJpdG1hcF9pdGVyYXRvcl90ZXN0KCZpdCkpCiAJCQkJc3RyY3B5KGRhdGEgKyAoaW5kZXgrKykgKiBFVEhfR1NUUklOR19MRU4sCi0JCQkJCW1haW5fc3RyaW5nc1tpICsKLQkJCQkJTlVNX01BSU5fU1RBVFMgKwotCQkJCQlOVU1fUE9SVF9TVEFUU10pOwotCQl9IGVsc2UKLQkJCWZvciAoaSA9IDA7IGkgPCBOVU1fTUFJTl9TVEFUUyArIE5VTV9QT1JUX1NUQVRTOyBpKyspIHsKLQkJCQlpZiAoKHByaXYtPnN0YXRzX2JpdG1hcCA+PiBpKSAmIDEpIHsKLQkJCQkJc3RyY3B5KGRhdGEgKwotCQkJCQkgICAgICAgKGluZGV4KyspICogRVRIX0dTVFJJTkdfTEVOLAotCQkJCQkgICAgICAgbWFpbl9zdHJpbmdzW2ldKTsKLQkJCQl9Ci0JCQkJaWYgKCEocHJpdi0+c3RhdHNfYml0bWFwID4+IGkpKQotCQkJCQlicmVhazsKLQkJCX0KKwkJCQkgICAgICAgbWFpbl9zdHJpbmdzW3N0cmluZ3NdKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1BLVF9TVEFUUzsgaSsrLCBzdHJpbmdzKyssCisJCSAgICAgYml0bWFwX2l0ZXJhdG9yX2luYygmaXQpKQorCQkJaWYgKGJpdG1hcF9pdGVyYXRvcl90ZXN0KCZpdCkpCisJCQkJc3RyY3B5KGRhdGEgKyAoaW5kZXgrKykgKiBFVEhfR1NUUklOR19MRU4sCisJCQkJICAgICAgIG1haW5fc3RyaW5nc1tzdHJpbmdzXSk7CisKIAkJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4X3JpbmdfbnVtOyBpKyspIHsKIAkJCXNwcmludGYoZGF0YSArIChpbmRleCsrKSAqIEVUSF9HU1RSSU5HX0xFTiwKIAkJCQkidHglZF9wYWNrZXRzIiwgaSk7CkBAIC04ODUsNiArMTAwMCwxMiBAQAogCQkJCSAgICBwcml2LT5wcm9mLT5yeF9wcHApOwogCWlmIChlcnIpCiAJCWVuX2Vycihwcml2LCAiRmFpbGVkIHNldHRpbmcgcGF1c2UgcGFyYW1zXG4iKTsKKwllbHNlCisJCW1seDRfZW5fdXBkYXRlX3BmY19zdGF0c19iaXRtYXAobWRldi0+ZGV2LCAmcHJpdi0+c3RhdHNfYml0bWFwLAorCQkJCQkJcHJpdi0+cHJvZi0+cnhfcHBwLAorCQkJCQkJcHJpdi0+cHJvZi0+cnhfcGF1c2UsCisJCQkJCQlwcml2LT5wcm9mLT50eF9wcHAsCisJCQkJCQlwcml2LT5wcm9mLT50eF9wYXVzZSk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTgxOCw2ICsxOTM5LDMyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbWx4NF9lbl9zZXRfcGh5c19pZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgIGVudW0gZXRodG9vbF9waHlzX2lkX3N0YXRlIHN0YXRlKQoreworCWludCBlcnI7CisJdTE2IGJlYWNvbl9kdXJhdGlvbjsKKwlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9lbl9kZXYgKm1kZXYgPSBwcml2LT5tZGV2OworCisJaWYgKCEobWRldi0+ZGV2LT5jYXBzLmZsYWdzMiAmIE1MWDRfREVWX0NBUF9GTEFHMl9QT1JUX0JFQUNPTikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEVUSFRPT0xfSURfQUNUSVZFOgorCQliZWFjb25fZHVyYXRpb24gPSBQT1JUX0JFQUNPTl9NQVhfTElNSVQ7CisJCWJyZWFrOworCWNhc2UgRVRIVE9PTF9JRF9JTkFDVElWRToKKwkJYmVhY29uX2R1cmF0aW9uID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCWVyciA9IG1seDRfU0VUX1BPUlRfQkVBQ09OKG1kZXYtPmRldiwgcHJpdi0+cG9ydCwgYmVhY29uX2R1cmF0aW9uKTsKKwlyZXR1cm4gZXJyOworfQorCiBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbWx4NF9lbl9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2RydmluZm8gPSBtbHg0X2VuX2dldF9kcnZpbmZvLAogCS5nZXRfc2V0dGluZ3MgPSBtbHg0X2VuX2dldF9zZXR0aW5ncywKQEAgLTE4MjcsNiArMTk3NCw3IEBACiAJLmdldF9zc2V0X2NvdW50ID0gbWx4NF9lbl9nZXRfc3NldF9jb3VudCwKIAkuZ2V0X2V0aHRvb2xfc3RhdHMgPSBtbHg0X2VuX2dldF9ldGh0b29sX3N0YXRzLAogCS5zZWxmX3Rlc3QgPSBtbHg0X2VuX3NlbGZfdGVzdCwKKwkuc2V0X3BoeXNfaWQgPSBtbHg0X2VuX3NldF9waHlzX2lkLAogCS5nZXRfd29sID0gbWx4NF9lbl9nZXRfd29sLAogCS5zZXRfd29sID0gbWx4NF9lbl9zZXRfd29sLAogCS5nZXRfbXNnbGV2ZWwgPSBtbHg0X2VuX2dldF9tc2dsZXZlbCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9tYWluLmMKaW5kZXggNThkNWEwNy4uOTEzYjcxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9tYWluLmMKQEAgLTEwMyw2ICsxMDMsMTEgQEAKIHsKIAlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfTE9PUEJBQ0spCisJCXByaXYtPmN0cmxfZmxhZ3MgfD0gY3B1X3RvX2JlMzIoTUxYNF9XUUVfQ1RSTF9GT1JDRV9MT09QQkFDSyk7CisJZWxzZQorCQlwcml2LT5jdHJsX2ZsYWdzICY9IGNwdV90b19iZTMyKH5NTFg0X1dRRV9DVFJMX0ZPUkNFX0xPT1BCQUNLKTsKKwogCXByaXYtPmZsYWdzICY9IH4oTUxYNF9FTl9GTEFHX1JYX0ZJTFRFUl9ORUVERUR8CiAJCQlNTFg0X0VOX0ZMQUdfRU5BQkxFX0hXX0xPT1BCQUNLKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9uZXRkZXYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fbmV0ZGV2LmMKaW5kZXggMmEyMTBjNC4uMGYxYWZjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX25ldGRldi5jCkBAIC0xNjg1LDcgKzE2ODUsNyBAQAogCX0KIAogCS8qIEF0dGFjaCByeCBRUCB0byBicmFkY2FzdCBhZGRyZXNzICovCi0JbWVtc2V0KCZtY19saXN0WzEwXSwgMHhmZiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcigmbWNfbGlzdFsxMF0pOwogCW1jX2xpc3RbNV0gPSBwcml2LT5wb3J0OyAvKiBuZWVkZWQgZm9yIEIwIHN0ZWVyaW5nIHN1cHBvcnQgKi8KIAlpZiAobWx4NF9tdWx0aWNhc3RfYXR0YWNoKG1kZXYtPmRldiwgJnByaXYtPnJzc19tYXAuaW5kaXJfcXAsIG1jX2xpc3QsCiAJCQkJICBwcml2LT5wb3J0LCAwLCBNTFg0X1BST1RfRVRILApAQCAtMTY5OCw4ICsxNjk4LDYgQEAKIAkvKiBTY2hlZHVsZSBtdWx0aWNhc3QgdGFzayB0byBwb3B1bGF0ZSBtdWx0aWNhc3QgbGlzdCAqLwogCXF1ZXVlX3dvcmsobWRldi0+d29ya3F1ZXVlLCAmcHJpdi0+cnhfbW9kZV90YXNrKTsKIAotCW1seDRfc2V0X3N0YXRzX2JpdG1hcChtZGV2LT5kZXYsICZwcml2LT5zdGF0c19iaXRtYXApOwotCiAjaWZkZWYgQ09ORklHX01MWDRfRU5fVlhMQU4KIAlpZiAocHJpdi0+bWRldi0+ZGV2LT5jYXBzLnR1bm5lbF9vZmZsb2FkX21vZGUgPT0gTUxYNF9UVU5ORUxfT0ZGTE9BRF9NT0RFX1ZYTEFOKQogCQl2eGxhbl9nZXRfcnhfcG9ydChkZXYpOwpAQCAtMTc4OCw3ICsxNzg2LDcgQEAKIAl9CiAKIAkvKiBEZXRhY2ggQWxsIG11bHRpY2FzdHMgKi8KLQltZW1zZXQoJm1jX2xpc3RbMTBdLCAweGZmLCBFVEhfQUxFTik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKCZtY19saXN0WzEwXSk7CiAJbWNfbGlzdFs1XSA9IHByaXYtPnBvcnQ7IC8qIG5lZWRlZCBmb3IgQjAgc3RlZXJpbmcgc3VwcG9ydCAqLwogCW1seDRfbXVsdGljYXN0X2RldGFjaChtZGV2LT5kZXYsICZwcml2LT5yc3NfbWFwLmluZGlyX3FwLCBtY19saXN0LAogCQkJICAgICAgTUxYNF9QUk9UX0VUSCwgcHJpdi0+YnJvYWRjYXN0X2lkKTsKQEAgLTE4OTAsNiArMTg4OCwxMiBAQAogCW1lbXNldCgmcHJpdi0+cHN0YXRzLCAwLCBzaXplb2YocHJpdi0+cHN0YXRzKSk7CiAJbWVtc2V0KCZwcml2LT5wa3N0YXRzLCAwLCBzaXplb2YocHJpdi0+cGtzdGF0cykpOwogCW1lbXNldCgmcHJpdi0+cG9ydF9zdGF0cywgMCwgc2l6ZW9mKHByaXYtPnBvcnRfc3RhdHMpKTsKKwltZW1zZXQoJnByaXYtPnJ4X2Zsb3dzdGF0cywgMCwgc2l6ZW9mKHByaXYtPnJ4X2Zsb3dzdGF0cykpOworCW1lbXNldCgmcHJpdi0+dHhfZmxvd3N0YXRzLCAwLCBzaXplb2YocHJpdi0+dHhfZmxvd3N0YXRzKSk7CisJbWVtc2V0KCZwcml2LT5yeF9wcmlvcml0eV9mbG93c3RhdHMsIDAsCisJICAgICAgIHNpemVvZihwcml2LT5yeF9wcmlvcml0eV9mbG93c3RhdHMpKTsKKwltZW1zZXQoJnByaXYtPnR4X3ByaW9yaXR5X2Zsb3dzdGF0cywgMCwKKwkgICAgICAgc2l6ZW9mKHByaXYtPnR4X3ByaW9yaXR5X2Zsb3dzdGF0cykpOwogCiAJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4X3JpbmdfbnVtOyBpKyspIHsKIAkJcHJpdi0+dHhfcmluZ1tpXS0+Ynl0ZXMgPSAwOwpAQCAtMjE5MSwzMSArMjE5NSw1MCBAQAogCQluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlib29sIHJlc2V0ID0gZmFsc2U7CiAJaW50IHJldCA9IDA7CiAKKwlpZiAoREVWX0ZFQVRVUkVfQ0hBTkdFRChuZXRkZXYsIGZlYXR1cmVzLCBORVRJRl9GX1JYRkNTKSkgeworCQllbl9pbmZvKHByaXYsICJUdXJuICVzIFJYLUZDU1xuIiwKKwkJCShmZWF0dXJlcyAmIE5FVElGX0ZfUlhGQ1MpID8gIk9OIiA6ICJPRkYiKTsKKwkJcmVzZXQgPSB0cnVlOworCX0KKworCWlmIChERVZfRkVBVFVSRV9DSEFOR0VEKG5ldGRldiwgZmVhdHVyZXMsIE5FVElGX0ZfUlhBTEwpKSB7CisJCXU4IGlnbm9yZV9mY3NfdmFsdWUgPSAoZmVhdHVyZXMgJiBORVRJRl9GX1JYQUxMKSA/IDEgOiAwOworCisJCWVuX2luZm8ocHJpdiwgIlR1cm4gJXMgUlgtQUxMXG4iLAorCQkJaWdub3JlX2Zjc192YWx1ZSA/ICJPTiIgOiAiT0ZGIik7CisJCXJldCA9IG1seDRfU0VUX1BPUlRfZmNzX2NoZWNrKHByaXYtPm1kZXYtPmRldiwKKwkJCQkJICAgICAgcHJpdi0+cG9ydCwgaWdub3JlX2Zjc192YWx1ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwogCWlmIChERVZfRkVBVFVSRV9DSEFOR0VEKG5ldGRldiwgZmVhdHVyZXMsIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKSkgewogCQllbl9pbmZvKHByaXYsICJUdXJuICVzIFJYIHZsYW4gc3RyaXAgb2ZmbG9hZFxuIiwKIAkJCShmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKSA/ICJPTiIgOiAiT0ZGIik7Ci0JCXJldCA9IG1seDRfZW5fcmVzZXRfY29uZmlnKG5ldGRldiwgcHJpdi0+aHd0c3RhbXBfY29uZmlnLAotCQkJCQkgICBmZWF0dXJlcyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQlyZXNldCA9IHRydWU7CiAJfQogCiAJaWYgKERFVl9GRUFUVVJFX0NIQU5HRUQobmV0ZGV2LCBmZWF0dXJlcywgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFgpKQogCQllbl9pbmZvKHByaXYsICJUdXJuICVzIFRYIHZsYW4gc3RyaXAgb2ZmbG9hZFxuIiwKIAkJCShmZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYKSA/ICJPTiIgOiAiT0ZGIik7CiAKLQlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0xPT1BCQUNLKQotCQlwcml2LT5jdHJsX2ZsYWdzIHw9IGNwdV90b19iZTMyKE1MWDRfV1FFX0NUUkxfRk9SQ0VfTE9PUEJBQ0spOwotCWVsc2UKLQkJcHJpdi0+Y3RybF9mbGFncyAmPQotCQkJY3B1X3RvX2JlMzIofk1MWDRfV1FFX0NUUkxfRk9SQ0VfTE9PUEJBQ0spOworCWlmIChERVZfRkVBVFVSRV9DSEFOR0VEKG5ldGRldiwgZmVhdHVyZXMsIE5FVElGX0ZfTE9PUEJBQ0spKSB7CisJCWVuX2luZm8ocHJpdiwgIlR1cm4gJXMgbG9vcGJhY2tcbiIsCisJCQkoZmVhdHVyZXMgJiBORVRJRl9GX0xPT1BCQUNLKSA/ICJPTiIgOiAiT0ZGIik7CisJCW1seDRfZW5fdXBkYXRlX2xvb3BiYWNrX3N0YXRlKG5ldGRldiwgZmVhdHVyZXMpOworCX0KIAotCW1seDRfZW5fdXBkYXRlX2xvb3BiYWNrX3N0YXRlKG5ldGRldiwgZmVhdHVyZXMpOworCWlmIChyZXNldCkgeworCQlyZXQgPSBtbHg0X2VuX3Jlc2V0X2NvbmZpZyhuZXRkZXYsIHByaXYtPmh3dHN0YW1wX2NvbmZpZywKKwkJCQkJICAgZmVhdHVyZXMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXR1cm4gMDsKLQogfQogCiBzdGF0aWMgaW50IG1seDRfZW5fc2V0X3ZmX21hYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgcXVldWUsIHU4ICptYWMpCkBAIC0yMjM4LDYgKzIyNjEsMTYgQEAKIAlyZXR1cm4gbWx4NF9zZXRfdmZfdmxhbihtZGV2LT5kZXYsIGVuX3ByaXYtPnBvcnQsIHZmLCB2bGFuLCBxb3MpOwogfQogCitzdGF0aWMgaW50IG1seDRfZW5fc2V0X3ZmX3JhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLCBpbnQgbWluX3R4X3JhdGUsCisJCQkgICAgICAgaW50IG1heF90eF9yYXRlKQoreworCXN0cnVjdCBtbHg0X2VuX3ByaXYgKmVuX3ByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X2VuX2RldiAqbWRldiA9IGVuX3ByaXYtPm1kZXY7CisKKwlyZXR1cm4gbWx4NF9zZXRfdmZfcmF0ZShtZGV2LT5kZXYsIGVuX3ByaXYtPnBvcnQsIHZmLCBtaW5fdHhfcmF0ZSwKKwkJCQltYXhfdHhfcmF0ZSk7Cit9CisKIHN0YXRpYyBpbnQgbWx4NF9lbl9zZXRfdmZfc3Bvb2ZjaGsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLCBib29sIHNldHRpbmcpCiB7CiAJc3RydWN0IG1seDRfZW5fcHJpdiAqZW5fcHJpdiA9IG5ldGRldl9wcml2KGRldik7CkBAIC0yMzc1LDEwICsyNDA4LDM4IEBACiAJCQkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CisJZmVhdHVyZXMgPSB2bGFuX2ZlYXR1cmVzX2NoZWNrKHNrYiwgZmVhdHVyZXMpOwogCXJldHVybiB2eGxhbl9mZWF0dXJlc19jaGVjayhza2IsIGZlYXR1cmVzKTsKIH0KICNlbmRpZgogCitzdGF0aWMgaW50IG1seDRfZW5fc2V0X3R4X21heHJhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHF1ZXVlX2luZGV4LCB1MzIgbWF4cmF0ZSkKK3sKKwlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9lbl90eF9yaW5nICp0eF9yaW5nID0gcHJpdi0+dHhfcmluZ1txdWV1ZV9pbmRleF07CisJc3RydWN0IG1seDRfdXBkYXRlX3FwX3BhcmFtcyBwYXJhbXM7CisJaW50IGVycjsKKworCWlmICghKHByaXYtPm1kZXYtPmRldi0+Y2Fwcy5mbGFnczIgJiBNTFg0X0RFVl9DQVBfRkxBRzJfUVBfUkFURV9MSU1JVCkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIHJhdGUgcHJvdmlkZWQgdG8gdXMgaW4gTWJzLCBjaGVjayBpZiBpdCBmaXRzIGludG8gMTIgYml0cywgaWYgbm90IHVzZSBHYnMgKi8KKwlpZiAobWF4cmF0ZSA+PiAxMikgeworCQlwYXJhbXMucmF0ZV91bml0ID0gTUxYNF9RUF9SQVRFX0xJTUlUX0dCUzsKKwkJcGFyYW1zLnJhdGVfdmFsICA9IG1heHJhdGUgLyAxMDAwOworCX0gZWxzZSBpZiAobWF4cmF0ZSkgeworCQlwYXJhbXMucmF0ZV91bml0ID0gTUxYNF9RUF9SQVRFX0xJTUlUX01CUzsKKwkJcGFyYW1zLnJhdGVfdmFsICA9IG1heHJhdGU7CisJfSBlbHNlIHsgLyogemVybyBzZXJ2ZXMgdG8gcmV2b2tlIHRoZSBRUCByYXRlLWxpbWl0YXRpb24gKi8KKwkJcGFyYW1zLnJhdGVfdW5pdCA9IDA7CisJCXBhcmFtcy5yYXRlX3ZhbCAgPSAwOworCX0KKworCWVyciA9IG1seDRfdXBkYXRlX3FwKHByaXYtPm1kZXYtPmRldiwgdHhfcmluZy0+cXBuLCBNTFg0X1VQREFURV9RUF9SQVRFX0xJTUlULAorCQkJICAgICAmcGFyYW1zKTsKKwlyZXR1cm4gZXJyOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG1seDRfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gbWx4NF9lbl9vcGVuLAogCS5uZG9fc3RvcAkJPSBtbHg0X2VuX2Nsb3NlLApAQCAtMjQxMCw2ICsyNDcxLDcgQEAKIAkubmRvX2RlbF92eGxhbl9wb3J0CT0gbWx4NF9lbl9kZWxfdnhsYW5fcG9ydCwKIAkubmRvX2ZlYXR1cmVzX2NoZWNrCT0gbWx4NF9lbl9mZWF0dXJlc19jaGVjaywKICNlbmRpZgorCS5uZG9fc2V0X3R4X21heHJhdGUJPSBtbHg0X2VuX3NldF90eF9tYXhyYXRlLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBtbHg0X25ldGRldl9vcHNfbWFzdGVyID0gewpAQCAtMjQyNyw2ICsyNDg5LDcgQEAKIAkubmRvX3ZsYW5fcnhfa2lsbF92aWQJPSBtbHg0X2VuX3ZsYW5fcnhfa2lsbF92aWQsCiAJLm5kb19zZXRfdmZfbWFjCQk9IG1seDRfZW5fc2V0X3ZmX21hYywKIAkubmRvX3NldF92Zl92bGFuCT0gbWx4NF9lbl9zZXRfdmZfdmxhbiwKKwkubmRvX3NldF92Zl9yYXRlCT0gbWx4NF9lbl9zZXRfdmZfcmF0ZSwKIAkubmRvX3NldF92Zl9zcG9vZmNoawk9IG1seDRfZW5fc2V0X3ZmX3Nwb29mY2hrLAogCS5uZG9fc2V0X3ZmX2xpbmtfc3RhdGUJPSBtbHg0X2VuX3NldF92Zl9saW5rX3N0YXRlLAogCS5uZG9fZ2V0X3ZmX2NvbmZpZwk9IG1seDRfZW5fZ2V0X3ZmX2NvbmZpZywKQEAgLTI0NDQsNiArMjUwNyw3IEBACiAJLm5kb19kZWxfdnhsYW5fcG9ydAk9IG1seDRfZW5fZGVsX3Z4bGFuX3BvcnQsCiAJLm5kb19mZWF0dXJlc19jaGVjawk9IG1seDRfZW5fZmVhdHVyZXNfY2hlY2ssCiAjZW5kaWYKKwkubmRvX3NldF90eF9tYXhyYXRlCT0gbWx4NF9lbl9zZXRfdHhfbWF4cmF0ZSwKIH07CiAKIHN0cnVjdCBtbHg0X2VuX2JvbmQgewpAQCAtMjYyMCw2ICsyNjg0LDgyIEBACiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCit2b2lkIG1seDRfZW5fdXBkYXRlX3BmY19zdGF0c19iaXRtYXAoc3RydWN0IG1seDRfZGV2ICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgbWx4NF9lbl9zdGF0c19iaXRtYXAgKnN0YXRzX2JpdG1hcCwKKwkJCQkgICAgIHU4IHJ4X3BwcCwgdTggcnhfcGF1c2UsCisJCQkJICAgICB1OCB0eF9wcHAsIHU4IHR4X3BhdXNlKQoreworCWludCBsYXN0X2kgPSBOVU1fTUFJTl9TVEFUUyArIE5VTV9QT1JUX1NUQVRTOworCisJaWYgKCFtbHg0X2lzX3NsYXZlKGRldikgJiYKKwkgICAgKGRldi0+Y2Fwcy5mbGFnczIgJiBNTFg0X0RFVl9DQVBfRkxBRzJfRkxPV1NUQVRTX0VOKSkgeworCQltdXRleF9sb2NrKCZzdGF0c19iaXRtYXAtPm11dGV4KTsKKwkJYml0bWFwX2NsZWFyKHN0YXRzX2JpdG1hcC0+Yml0bWFwLCBsYXN0X2ksIE5VTV9GTE9XX1NUQVRTKTsKKworCQlpZiAocnhfcHBwKQorCQkJYml0bWFwX3NldChzdGF0c19iaXRtYXAtPmJpdG1hcCwgbGFzdF9pLAorCQkJCSAgIE5VTV9GTE9XX1BSSU9SSVRZX1NUQVRTX1JYKTsKKwkJbGFzdF9pICs9IE5VTV9GTE9XX1BSSU9SSVRZX1NUQVRTX1JYOworCisJCWlmIChyeF9wYXVzZSAmJiAhKHJ4X3BwcCkpCisJCQliaXRtYXBfc2V0KHN0YXRzX2JpdG1hcC0+Yml0bWFwLCBsYXN0X2ksCisJCQkJICAgTlVNX0ZMT1dfU1RBVFNfUlgpOworCQlsYXN0X2kgKz0gTlVNX0ZMT1dfU1RBVFNfUlg7CisKKwkJaWYgKHR4X3BwcCkKKwkJCWJpdG1hcF9zZXQoc3RhdHNfYml0bWFwLT5iaXRtYXAsIGxhc3RfaSwKKwkJCQkgICBOVU1fRkxPV19QUklPUklUWV9TVEFUU19UWCk7CisJCWxhc3RfaSArPSBOVU1fRkxPV19QUklPUklUWV9TVEFUU19UWDsKKworCQlpZiAodHhfcGF1c2UgJiYgISh0eF9wcHApKQorCQkJYml0bWFwX3NldChzdGF0c19iaXRtYXAtPmJpdG1hcCwgbGFzdF9pLAorCQkJCSAgIE5VTV9GTE9XX1NUQVRTX1RYKTsKKwkJbGFzdF9pICs9IE5VTV9GTE9XX1NUQVRTX1RYOworCisJCW11dGV4X3VubG9jaygmc3RhdHNfYml0bWFwLT5tdXRleCk7CisJfQorfQorCit2b2lkIG1seDRfZW5fc2V0X3N0YXRzX2JpdG1hcChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwKKwkJCSAgICAgIHN0cnVjdCBtbHg0X2VuX3N0YXRzX2JpdG1hcCAqc3RhdHNfYml0bWFwLAorCQkJICAgICAgdTggcnhfcHBwLCB1OCByeF9wYXVzZSwKKwkJCSAgICAgIHU4IHR4X3BwcCwgdTggdHhfcGF1c2UpCit7CisJaW50IGxhc3RfaSA9IDA7CisKKwltdXRleF9pbml0KCZzdGF0c19iaXRtYXAtPm11dGV4KTsKKwliaXRtYXBfemVybyhzdGF0c19iaXRtYXAtPmJpdG1hcCwgTlVNX0FMTF9TVEFUUyk7CisKKwlpZiAobWx4NF9pc19zbGF2ZShkZXYpKSB7CisJCWJpdG1hcF9zZXQoc3RhdHNfYml0bWFwLT5iaXRtYXAsIGxhc3RfaSArCisJCQkJCSBNTFg0X0ZJTkRfTkVUREVWX1NUQVQocnhfcGFja2V0cyksIDEpOworCQliaXRtYXBfc2V0KHN0YXRzX2JpdG1hcC0+Yml0bWFwLCBsYXN0X2kgKworCQkJCQkgTUxYNF9GSU5EX05FVERFVl9TVEFUKHR4X3BhY2tldHMpLCAxKTsKKwkJYml0bWFwX3NldChzdGF0c19iaXRtYXAtPmJpdG1hcCwgbGFzdF9pICsKKwkJCQkJIE1MWDRfRklORF9ORVRERVZfU1RBVChyeF9ieXRlcyksIDEpOworCQliaXRtYXBfc2V0KHN0YXRzX2JpdG1hcC0+Yml0bWFwLCBsYXN0X2kgKworCQkJCQkgTUxYNF9GSU5EX05FVERFVl9TVEFUKHR4X2J5dGVzKSwgMSk7CisJCWJpdG1hcF9zZXQoc3RhdHNfYml0bWFwLT5iaXRtYXAsIGxhc3RfaSArCisJCQkJCSBNTFg0X0ZJTkRfTkVUREVWX1NUQVQocnhfZHJvcHBlZCksIDEpOworCQliaXRtYXBfc2V0KHN0YXRzX2JpdG1hcC0+Yml0bWFwLCBsYXN0X2kgKworCQkJCQkgTUxYNF9GSU5EX05FVERFVl9TVEFUKHR4X2Ryb3BwZWQpLCAxKTsKKwl9IGVsc2UgeworCQliaXRtYXBfc2V0KHN0YXRzX2JpdG1hcC0+Yml0bWFwLCBsYXN0X2ksIE5VTV9NQUlOX1NUQVRTKTsKKwl9CisJbGFzdF9pICs9IE5VTV9NQUlOX1NUQVRTOworCisJYml0bWFwX3NldChzdGF0c19iaXRtYXAtPmJpdG1hcCwgbGFzdF9pLCBOVU1fUE9SVF9TVEFUUyk7CisJbGFzdF9pICs9IE5VTV9QT1JUX1NUQVRTOworCisJbWx4NF9lbl91cGRhdGVfcGZjX3N0YXRzX2JpdG1hcChkZXYsIHN0YXRzX2JpdG1hcCwKKwkJCQkJcnhfcHBwLCByeF9wYXVzZSwKKwkJCQkJdHhfcHBwLCB0eF9wYXVzZSk7CisJbGFzdF9pICs9IE5VTV9GTE9XX1NUQVRTOworCisJaWYgKCFtbHg0X2lzX3NsYXZlKGRldikpCisJCWJpdG1hcF9zZXQoc3RhdHNfYml0bWFwLT5iaXRtYXAsIGxhc3RfaSwgTlVNX1BLVF9TVEFUUyk7Cit9CisKIGludCBtbHg0X2VuX2luaXRfbmV0ZGV2KHN0cnVjdCBtbHg0X2VuX2RldiAqbWRldiwgaW50IHBvcnQsCiAJCQlzdHJ1Y3QgbWx4NF9lbl9wb3J0X3Byb2ZpbGUgKnByb2YpCiB7CkBAIC0yNjk1LDcgKzI4MzUsNyBAQAogCXByaXYtPm1zZ19lbmFibGUgPSBNTFg0X0VOX01TR19MRVZFTDsKICNpZmRlZiBDT05GSUdfTUxYNF9FTl9EQ0IKIAlpZiAoIW1seDRfaXNfc2xhdmUocHJpdi0+bWRldi0+ZGV2KSkgewotCQlpZiAobWRldi0+ZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfU0VUX0VUSF9TQ0hFRCkgeworCQlpZiAobWRldi0+ZGV2LT5jYXBzLmZsYWdzMiAmIE1MWDRfREVWX0NBUF9GTEFHMl9FVFNfQ0ZHKSB7CiAJCQlkZXYtPmRjYm5sX29wcyA9ICZtbHg0X2VuX2RjYm5sX29wczsKIAkJfSBlbHNlIHsKIAkJCWVuX2luZm8ocHJpdiwgImVuYWJsaW5nIG9ubHkgUEZDIERDQiBvcHNcbiIpOwpAQCAtMjc4Miw2ICsyOTIyLDEyIEBACiAJZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX0xPT1BCQUNLIHwKIAkJCU5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlg7CiAKKwlpZiAobWRldi0+ZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfRkNTX0tFRVApCisJCWRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9SWEZDUzsKKworCWlmIChtZGV2LT5kZXYtPmNhcHMuZmxhZ3MyICYgTUxYNF9ERVZfQ0FQX0ZMQUcyX0lHTk9SRV9GQ1MpCisJCWRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9SWEFMTDsKKwogCWlmIChtZGV2LT5kZXYtPmNhcHMuc3RlZXJpbmdfbW9kZSA9PQogCSAgICBNTFg0X1NURUVSSU5HX01PREVfREVWSUNFX01BTkFHRUQgJiYKIAkgICAgbWRldi0+ZGV2LT5jYXBzLmRtZnNfaGlnaF9zdGVlcl9tb2RlICE9IE1MWDRfU1RFRVJJTkdfRE1GU19BMF9TVEFUSUMpCkBAIC0yODA3LDEzICsyOTUzLDYgQEAKIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCW1seDRfZW5fc2V0X2RlZmF1bHRfbW9kZXJhdGlvbihwcml2KTsKIAotCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOwotCWlmIChlcnIpIHsKLQkJZW5fZXJyKHByaXYsICJOZXRkZXYgcmVnaXN0cmF0aW9uIGZhaWxlZCBmb3IgcG9ydCAlZFxuIiwgcG9ydCk7Ci0JCWdvdG8gb3V0OwotCX0KLQlwcml2LT5yZWdpc3RlcmVkID0gMTsKLQogCWVuX3dhcm4ocHJpdiwgIlVzaW5nICVkIFRYIHJpbmdzXG4iLCBwcm9mLT50eF9yaW5nX251bSk7CiAJZW5fd2Fybihwcml2LCAiVXNpbmcgJWQgUlggcmluZ3NcbiIsIHByb2YtPnJ4X3JpbmdfbnVtKTsKIApAQCAtMjg1Myw2ICsyOTkyLDIwIEBACiAJCXF1ZXVlX2RlbGF5ZWRfd29yayhtZGV2LT53b3JrcXVldWUsICZwcml2LT5zZXJ2aWNlX3Rhc2ssCiAJCQkJICAgU0VSVklDRV9UQVNLX0RFTEFZKTsKIAorCW1seDRfZW5fc2V0X3N0YXRzX2JpdG1hcChtZGV2LT5kZXYsICZwcml2LT5zdGF0c19iaXRtYXAsCisJCQkJIG1kZXYtPnByb2ZpbGUucHJvZltwcml2LT5wb3J0XS5yeF9wcHAsCisJCQkJIG1kZXYtPnByb2ZpbGUucHJvZltwcml2LT5wb3J0XS5yeF9wYXVzZSwKKwkJCQkgbWRldi0+cHJvZmlsZS5wcm9mW3ByaXYtPnBvcnRdLnR4X3BwcCwKKwkJCQkgbWRldi0+cHJvZmlsZS5wcm9mW3ByaXYtPnBvcnRdLnR4X3BhdXNlKTsKKworCWVyciA9IHJlZ2lzdGVyX25ldGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJZW5fZXJyKHByaXYsICJOZXRkZXYgcmVnaXN0cmF0aW9uIGZhaWxlZCBmb3IgcG9ydCAlZFxuIiwgcG9ydCk7CisJCWdvdG8gb3V0OworCX0KKworCXByaXYtPnJlZ2lzdGVyZWQgPSAxOworCiAJcmV0dXJuIDA7CiAKIG91dDoKQEAgLTI4NzEsNyArMzAyNCw4IEBACiAKIAlpZiAocHJpdi0+aHd0c3RhbXBfY29uZmlnLnR4X3R5cGUgPT0gdHNfY29uZmlnLnR4X3R5cGUgJiYKIAkgICAgcHJpdi0+aHd0c3RhbXBfY29uZmlnLnJ4X2ZpbHRlciA9PSB0c19jb25maWcucnhfZmlsdGVyICYmCi0JICAgICFERVZfRkVBVFVSRV9DSEFOR0VEKGRldiwgZmVhdHVyZXMsIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKSkKKwkgICAgIURFVl9GRUFUVVJFX0NIQU5HRUQoZGV2LCBmZWF0dXJlcywgTkVUSUZfRl9IV19WTEFOX0NUQUdfUlgpICYmCisJICAgICFERVZfRkVBVFVSRV9DSEFOR0VEKGRldiwgZmVhdHVyZXMsIE5FVElGX0ZfUlhGQ1MpKQogCQlyZXR1cm4gMDsgLyogTm90aGluZyB0byBjaGFuZ2UgKi8KIAogCWlmIChERVZfRkVBVFVSRV9DSEFOR0VEKGRldiwgZmVhdHVyZXMsIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1JYKSAmJgpAQCAtMjkxMCw2ICszMDY0LDEzIEBACiAJCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0hXX1ZMQU5fQ1RBR19SWDsKIAl9CiAKKwlpZiAoREVWX0ZFQVRVUkVfQ0hBTkdFRChkZXYsIGZlYXR1cmVzLCBORVRJRl9GX1JYRkNTKSkgeworCQlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX1JYRkNTKQorCQkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX1JYRkNTOworCQllbHNlCisJCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1JYRkNTOworCX0KKwogCS8qIFJYIHZsYW4gb2ZmbG9hZCBhbmQgUlggdGltZS1zdGFtcGluZyBjYW4ndCBjby1leGlzdCAhCiAJICogUmVnYXJkbGVzcyBvZiB0aGUgY2FsbGVyJ3MgY2hvaWNlLAogCSAqIFR1cm4gT2ZmIFJYIHZsYW4gb2ZmbG9hZCBpbiBjYXNlIG9mIHRpbWUtc3RhbXBpbmcgaXMgT04KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fcG9ydC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9wb3J0LmMKaW5kZXggNmNiODAwNy4uNTRmMGU1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9wb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9wb3J0LmMKQEAgLTEyOCw5ICsxMjgsMjkgQEAKIAlyZXR1cm4gZXJyOwogfQogCisvKiBFYWNoIGNvdW50ZXIgc2V0IGlzIGxvY2F0ZWQgaW4gc3RydWN0IG1seDRfZW5fc3RhdF9vdXRfbWJveAorICogd2l0aCBhIGNvbnN0IG9mZnNldCBiZXR3ZWVuIGl0cyBwcmlvIGNvbXBvbmVudHMuCisgKiBUaGlzIGZ1bmN0aW9uIHJ1bnMgb3ZlciBhIGNvdW50ZXIgc2V0IGFuZCBzdW0gYWxsIG9mIGl0J3MgcHJpbyBjb21wb25lbnRzLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBlbl9zdGF0c19hZGRlcihfX2JlNjQgKnN0YXJ0LCBfX2JlNjQgKm5leHQsIGludCBudW0pCit7CisJX19iZTY0ICpjdXJyID0gc3RhcnQ7CisJdW5zaWduZWQgbG9uZyByZXQgPSAwOworCWludCBpOworCWludCBvZmZzZXQgPSBuZXh0IC0gc3RhcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDw9IG51bTsgaSsrKSB7CisJCXJldCArPSBiZTY0X3RvX2NwdSgqY3Vycik7CisJCWN1cnIgKz0gb2Zmc2V0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKIGludCBtbHg0X2VuX0RVTVBfRVRIX1NUQVRTKHN0cnVjdCBtbHg0X2VuX2RldiAqbWRldiwgdTggcG9ydCwgdTggcmVzZXQpCiB7CiAJc3RydWN0IG1seDRfZW5fc3RhdF9vdXRfbWJveCAqbWx4NF9lbl9zdGF0czsKKwlzdHJ1Y3QgbWx4NF9lbl9zdGF0X291dF9mbG93X2NvbnRyb2xfbWJveCAqZmxvd3N0YXRzOwogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihtZGV2LT5wbmRldltwb3J0XSk7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJnByaXYtPnN0YXRzOwogCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OwpAQCAtMTgzLDIyICsyMDMsMjUgQEAKIAkJcHJpdi0+cG9ydF9zdGF0cy54bWl0X21vcmUgICAgICAgICArPSByaW5nLT54bWl0X21vcmU7CiAJfQogCisJLyogbmV0IGRldmljZSBzdGF0cyAqLwogCXN0YXRzLT5yeF9lcnJvcnMgPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5QQ1MpICsKLQkJCSAgIGJlMzJfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJkcm9wTGVuZ3RoKSArCiAJCQkgICBiZTMyX3RvX2NwdShtbHg0X2VuX3N0YXRzLT5SSkJCUikgKwogCQkJICAgYmUzMl90b19jcHUobWx4NF9lbl9zdGF0cy0+UkNSQykgKwotCQkJICAgYmUzMl90b19jcHUobWx4NF9lbl9zdGF0cy0+UlJVTlQpOwotCXN0YXRzLT50eF9lcnJvcnMgPSBiZTMyX3RvX2NwdShtbHg0X2VuX3N0YXRzLT5URFJPUCk7Ci0Jc3RhdHMtPm11bHRpY2FzdCA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPk1DQVNUX3ByaW9fMCkgKwotCQkJICAgYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+TUNBU1RfcHJpb18xKSArCi0JCQkgICBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5NQ0FTVF9wcmlvXzIpICsKLQkJCSAgIGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPk1DQVNUX3ByaW9fMykgKwotCQkJICAgYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+TUNBU1RfcHJpb180KSArCi0JCQkgICBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5NQ0FTVF9wcmlvXzUpICsKLQkJCSAgIGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPk1DQVNUX3ByaW9fNikgKwotCQkJICAgYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+TUNBU1RfcHJpb183KSArCi0JCQkgICBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5NQ0FTVF9ub3ZsYW4pOworCQkJICAgYmUzMl90b19jcHUobWx4NF9lbl9zdGF0cy0+UlJVTlQpICsKKwkJCSAgIGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJJblJhbmdlTGVuZ3RoRXJyKSArCisJCQkgICBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5ST3V0UmFuZ2VMZW5ndGhFcnIpICsKKwkJCSAgIGJlMzJfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJTSE9SVCkgKworCQkJICAgZW5fc3RhdHNfYWRkZXIoJm1seDRfZW5fc3RhdHMtPlJHSUFOVF9wcmlvXzAsCisJCQkJCSAgJm1seDRfZW5fc3RhdHMtPlJHSUFOVF9wcmlvXzEsCisJCQkJCSAgTlVNX1BSSU9SSVRJRVMpOworCXN0YXRzLT50eF9lcnJvcnMgPSBlbl9zdGF0c19hZGRlcigmbWx4NF9lbl9zdGF0cy0+VEdJQU5UX3ByaW9fMCwKKwkJCQkJICAmbWx4NF9lbl9zdGF0cy0+VEdJQU5UX3ByaW9fMSwKKwkJCQkJICBOVU1fUFJJT1JJVElFUyk7CisJc3RhdHMtPm11bHRpY2FzdCA9IGVuX3N0YXRzX2FkZGVyKCZtbHg0X2VuX3N0YXRzLT5NQ0FTVF9wcmlvXzAsCisJCQkJCSAgJm1seDRfZW5fc3RhdHMtPk1DQVNUX3ByaW9fMSwKKwkJCQkJICBOVU1fUFJJT1JJVElFUyk7CiAJc3RhdHMtPmNvbGxpc2lvbnMgPSAwOworCXN0YXRzLT5yeF9kcm9wcGVkID0gYmUzMl90b19jcHUobWx4NF9lbl9zdGF0cy0+UkRST1ApOwogCXN0YXRzLT5yeF9sZW5ndGhfZXJyb3JzID0gYmUzMl90b19jcHUobWx4NF9lbl9zdGF0cy0+UmRyb3BMZW5ndGgpOwogCXN0YXRzLT5yeF9vdmVyX2Vycm9ycyA9IGJlMzJfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJkcm9wT3ZmbHcpOwogCXN0YXRzLT5yeF9jcmNfZXJyb3JzID0gYmUzMl90b19jcHUobWx4NF9lbl9zdGF0cy0+UkNSQyk7CkBAIC0yMTAsMzMgKzIzMywxMTYgQEAKIAlzdGF0cy0+dHhfZmlmb19lcnJvcnMgPSAwOwogCXN0YXRzLT50eF9oZWFydGJlYXRfZXJyb3JzID0gMDsKIAlzdGF0cy0+dHhfd2luZG93X2Vycm9ycyA9IDA7CisJc3RhdHMtPnR4X2Ryb3BwZWQgPSBiZTMyX3RvX2NwdShtbHg0X2VuX3N0YXRzLT5URFJPUCk7CiAKLQlwcml2LT5wa3N0YXRzLmJyb2FkY2FzdCA9Ci0JCQkJYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+UkJDQVNUX3ByaW9fMCkgKwotCQkJCWJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJCQ0FTVF9wcmlvXzEpICsKLQkJCQliZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5SQkNBU1RfcHJpb18yKSArCi0JCQkJYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+UkJDQVNUX3ByaW9fMykgKwotCQkJCWJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJCQ0FTVF9wcmlvXzQpICsKLQkJCQliZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5SQkNBU1RfcHJpb181KSArCi0JCQkJYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+UkJDQVNUX3ByaW9fNikgKwotCQkJCWJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJCQ0FTVF9wcmlvXzcpICsKLQkJCQliZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5SQkNBU1Rfbm92bGFuKTsKLQlwcml2LT5wa3N0YXRzLnJ4X3ByaW9bMF0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5SVE9UX3ByaW9fMCk7Ci0JcHJpdi0+cGtzdGF0cy5yeF9wcmlvWzFdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+UlRPVF9wcmlvXzEpOwotCXByaXYtPnBrc3RhdHMucnhfcHJpb1syXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJUT1RfcHJpb18yKTsKLQlwcml2LT5wa3N0YXRzLnJ4X3ByaW9bM10gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5SVE9UX3ByaW9fMyk7Ci0JcHJpdi0+cGtzdGF0cy5yeF9wcmlvWzRdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+UlRPVF9wcmlvXzQpOwotCXByaXYtPnBrc3RhdHMucnhfcHJpb1s1XSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJUT1RfcHJpb181KTsKLQlwcml2LT5wa3N0YXRzLnJ4X3ByaW9bNl0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5SVE9UX3ByaW9fNik7Ci0JcHJpdi0+cGtzdGF0cy5yeF9wcmlvWzddID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+UlRPVF9wcmlvXzcpOwotCXByaXYtPnBrc3RhdHMudHhfcHJpb1swXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlRUT1RfcHJpb18wKTsKLQlwcml2LT5wa3N0YXRzLnR4X3ByaW9bMV0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5UVE9UX3ByaW9fMSk7Ci0JcHJpdi0+cGtzdGF0cy50eF9wcmlvWzJdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+VFRPVF9wcmlvXzIpOwotCXByaXYtPnBrc3RhdHMudHhfcHJpb1szXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlRUT1RfcHJpb18zKTsKLQlwcml2LT5wa3N0YXRzLnR4X3ByaW9bNF0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5UVE9UX3ByaW9fNCk7Ci0JcHJpdi0+cGtzdGF0cy50eF9wcmlvWzVdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+VFRPVF9wcmlvXzUpOwotCXByaXYtPnBrc3RhdHMudHhfcHJpb1s2XSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlRUT1RfcHJpb182KTsKLQlwcml2LT5wa3N0YXRzLnR4X3ByaW9bN10gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5UVE9UX3ByaW9fNyk7CisJLyogUlggc3RhdHMgKi8KKwlwcml2LT5wa3N0YXRzLnJ4X211bHRpY2FzdF9wYWNrZXRzID0gc3RhdHMtPm11bHRpY2FzdDsKKwlwcml2LT5wa3N0YXRzLnJ4X2Jyb2FkY2FzdF9wYWNrZXRzID0KKwkJCWVuX3N0YXRzX2FkZGVyKCZtbHg0X2VuX3N0YXRzLT5SQkNBU1RfcHJpb18wLAorCQkJCSAgICAgICAmbWx4NF9lbl9zdGF0cy0+UkJDQVNUX3ByaW9fMSwKKwkJCQkgICAgICAgTlVNX1BSSU9SSVRJRVMpOworCXByaXYtPnBrc3RhdHMucnhfamFiYmVycyA9IGJlMzJfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJKQkJSKTsKKwlwcml2LT5wa3N0YXRzLnJ4X2luX3JhbmdlX2xlbmd0aF9lcnJvciA9CisJCWJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJJblJhbmdlTGVuZ3RoRXJyKTsKKwlwcml2LT5wa3N0YXRzLnJ4X291dF9yYW5nZV9sZW5ndGhfZXJyb3IgPQorCQliZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5ST3V0UmFuZ2VMZW5ndGhFcnIpOworCisJLyogVHggc3RhdHMgKi8KKwlwcml2LT5wa3N0YXRzLnR4X211bHRpY2FzdF9wYWNrZXRzID0KKwkJZW5fc3RhdHNfYWRkZXIoJm1seDRfZW5fc3RhdHMtPlRNQ0FTVF9wcmlvXzAsCisJCQkgICAgICAgJm1seDRfZW5fc3RhdHMtPlRNQ0FTVF9wcmlvXzEsCisJCQkgICAgICAgTlVNX1BSSU9SSVRJRVMpOworCXByaXYtPnBrc3RhdHMudHhfYnJvYWRjYXN0X3BhY2tldHMgPQorCQllbl9zdGF0c19hZGRlcigmbWx4NF9lbl9zdGF0cy0+VEJDQVNUX3ByaW9fMCwKKwkJCSAgICAgICAmbWx4NF9lbl9zdGF0cy0+VEJDQVNUX3ByaW9fMSwKKwkJCSAgICAgICBOVU1fUFJJT1JJVElFUyk7CisKKwlwcml2LT5wa3N0YXRzLnJ4X3ByaW9bMF1bMF0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5SVE9UX3ByaW9fMCk7CisJcHJpdi0+cGtzdGF0cy5yeF9wcmlvWzBdWzFdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+Uk9DVF9wcmlvXzApOworCXByaXYtPnBrc3RhdHMucnhfcHJpb1sxXVswXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJUT1RfcHJpb18xKTsKKwlwcml2LT5wa3N0YXRzLnJ4X3ByaW9bMV1bMV0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5ST0NUX3ByaW9fMSk7CisJcHJpdi0+cGtzdGF0cy5yeF9wcmlvWzJdWzBdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+UlRPVF9wcmlvXzIpOworCXByaXYtPnBrc3RhdHMucnhfcHJpb1syXVsxXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJPQ1RfcHJpb18yKTsKKwlwcml2LT5wa3N0YXRzLnJ4X3ByaW9bM11bMF0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5SVE9UX3ByaW9fMyk7CisJcHJpdi0+cGtzdGF0cy5yeF9wcmlvWzNdWzFdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+Uk9DVF9wcmlvXzMpOworCXByaXYtPnBrc3RhdHMucnhfcHJpb1s0XVswXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJUT1RfcHJpb180KTsKKwlwcml2LT5wa3N0YXRzLnJ4X3ByaW9bNF1bMV0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5ST0NUX3ByaW9fNCk7CisJcHJpdi0+cGtzdGF0cy5yeF9wcmlvWzVdWzBdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+UlRPVF9wcmlvXzUpOworCXByaXYtPnBrc3RhdHMucnhfcHJpb1s1XVsxXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJPQ1RfcHJpb181KTsKKwlwcml2LT5wa3N0YXRzLnJ4X3ByaW9bNl1bMF0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5SVE9UX3ByaW9fNik7CisJcHJpdi0+cGtzdGF0cy5yeF9wcmlvWzZdWzFdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+Uk9DVF9wcmlvXzYpOworCXByaXYtPnBrc3RhdHMucnhfcHJpb1s3XVswXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJUT1RfcHJpb183KTsKKwlwcml2LT5wa3N0YXRzLnJ4X3ByaW9bN11bMV0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5ST0NUX3ByaW9fNyk7CisJcHJpdi0+cGtzdGF0cy5yeF9wcmlvWzhdWzBdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+UlRPVF9ub3ZsYW4pOworCXByaXYtPnBrc3RhdHMucnhfcHJpb1s4XVsxXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlJPQ1Rfbm92bGFuKTsKKwlwcml2LT5wa3N0YXRzLnR4X3ByaW9bMF1bMF0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5UVE9UX3ByaW9fMCk7CisJcHJpdi0+cGtzdGF0cy50eF9wcmlvWzBdWzFdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+VE9DVF9wcmlvXzApOworCXByaXYtPnBrc3RhdHMudHhfcHJpb1sxXVswXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlRUT1RfcHJpb18xKTsKKwlwcml2LT5wa3N0YXRzLnR4X3ByaW9bMV1bMV0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5UT0NUX3ByaW9fMSk7CisJcHJpdi0+cGtzdGF0cy50eF9wcmlvWzJdWzBdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+VFRPVF9wcmlvXzIpOworCXByaXYtPnBrc3RhdHMudHhfcHJpb1syXVsxXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlRPQ1RfcHJpb18yKTsKKwlwcml2LT5wa3N0YXRzLnR4X3ByaW9bM11bMF0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5UVE9UX3ByaW9fMyk7CisJcHJpdi0+cGtzdGF0cy50eF9wcmlvWzNdWzFdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+VE9DVF9wcmlvXzMpOworCXByaXYtPnBrc3RhdHMudHhfcHJpb1s0XVswXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlRUT1RfcHJpb180KTsKKwlwcml2LT5wa3N0YXRzLnR4X3ByaW9bNF1bMV0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5UT0NUX3ByaW9fNCk7CisJcHJpdi0+cGtzdGF0cy50eF9wcmlvWzVdWzBdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+VFRPVF9wcmlvXzUpOworCXByaXYtPnBrc3RhdHMudHhfcHJpb1s1XVsxXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlRPQ1RfcHJpb181KTsKKwlwcml2LT5wa3N0YXRzLnR4X3ByaW9bNl1bMF0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5UVE9UX3ByaW9fNik7CisJcHJpdi0+cGtzdGF0cy50eF9wcmlvWzZdWzFdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+VE9DVF9wcmlvXzYpOworCXByaXYtPnBrc3RhdHMudHhfcHJpb1s3XVswXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlRUT1RfcHJpb183KTsKKwlwcml2LT5wa3N0YXRzLnR4X3ByaW9bN11bMV0gPSBiZTY0X3RvX2NwdShtbHg0X2VuX3N0YXRzLT5UT0NUX3ByaW9fNyk7CisJcHJpdi0+cGtzdGF0cy50eF9wcmlvWzhdWzBdID0gYmU2NF90b19jcHUobWx4NF9lbl9zdGF0cy0+VFRPVF9ub3ZsYW4pOworCXByaXYtPnBrc3RhdHMudHhfcHJpb1s4XVsxXSA9IGJlNjRfdG9fY3B1KG1seDRfZW5fc3RhdHMtPlRPQ1Rfbm92bGFuKTsKKworCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zdGF0c19sb2NrKTsKKworCS8qIDB4ZmZzIGluZGljYXRlcyBpbnZhbGlkIHZhbHVlICovCisJbWVtc2V0KG1haWxib3gtPmJ1ZiwgMHhmZiwgc2l6ZW9mKCpmbG93c3RhdHMpICogTUxYNF9OVU1fUFJJT1JJVElFUyk7CisKKwlpZiAobWRldi0+ZGV2LT5jYXBzLmZsYWdzMiAmIE1MWDRfREVWX0NBUF9GTEFHMl9GTE9XU1RBVFNfRU4pIHsKKwkJbWVtc2V0KG1haWxib3gtPmJ1ZiwgMCwKKwkJICAgICAgIHNpemVvZigqZmxvd3N0YXRzKSAqIE1MWDRfTlVNX1BSSU9SSVRJRVMpOworCQllcnIgPSBtbHg0X2NtZF9ib3gobWRldi0+ZGV2LCAwLCBtYWlsYm94LT5kbWEsCisJCQkJICAgaW5fbW9kIHwgTUxYNF9EVU1QX0VUSF9TVEFUU19GTE9XX0NPTlRST0wsCisJCQkJICAgMCwgTUxYNF9DTURfRFVNUF9FVEhfU1RBVFMsCisJCQkJICAgTUxYNF9DTURfVElNRV9DTEFTU19CLCBNTFg0X0NNRF9XUkFQUEVEKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCX0KKworCWZsb3dzdGF0cyA9IG1haWxib3gtPmJ1ZjsKKworCXNwaW5fbG9ja19iaCgmcHJpdi0+c3RhdHNfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUxYNF9OVU1fUFJJT1JJVElFUzsgaSsrKQl7CisJCXByaXYtPnJ4X3ByaW9yaXR5X2Zsb3dzdGF0c1tpXS5yeF9wYXVzZSA9CisJCQliZTY0X3RvX2NwdShmbG93c3RhdHNbaV0ucnhfcGF1c2UpOworCQlwcml2LT5yeF9wcmlvcml0eV9mbG93c3RhdHNbaV0ucnhfcGF1c2VfZHVyYXRpb24gPQorCQkJYmU2NF90b19jcHUoZmxvd3N0YXRzW2ldLnJ4X3BhdXNlX2R1cmF0aW9uKTsKKwkJcHJpdi0+cnhfcHJpb3JpdHlfZmxvd3N0YXRzW2ldLnJ4X3BhdXNlX3RyYW5zaXRpb24gPQorCQkJYmU2NF90b19jcHUoZmxvd3N0YXRzW2ldLnJ4X3BhdXNlX3RyYW5zaXRpb24pOworCQlwcml2LT50eF9wcmlvcml0eV9mbG93c3RhdHNbaV0udHhfcGF1c2UgPQorCQkJYmU2NF90b19jcHUoZmxvd3N0YXRzW2ldLnR4X3BhdXNlKTsKKwkJcHJpdi0+dHhfcHJpb3JpdHlfZmxvd3N0YXRzW2ldLnR4X3BhdXNlX2R1cmF0aW9uID0KKwkJCWJlNjRfdG9fY3B1KGZsb3dzdGF0c1tpXS50eF9wYXVzZV9kdXJhdGlvbik7CisJCXByaXYtPnR4X3ByaW9yaXR5X2Zsb3dzdGF0c1tpXS50eF9wYXVzZV90cmFuc2l0aW9uID0KKwkJCWJlNjRfdG9fY3B1KGZsb3dzdGF0c1tpXS50eF9wYXVzZV90cmFuc2l0aW9uKTsKKwl9CisKKwkvKiBpZiBwZmMgaXMgbm90IGluIHVzZSwgYWxsIHByaW9yaXRpZXMgY291bnRlcnMgaGF2ZSB0aGUgc2FtZSB2YWx1ZSAqLworCXByaXYtPnJ4X2Zsb3dzdGF0cy5yeF9wYXVzZSA9CisJCWJlNjRfdG9fY3B1KGZsb3dzdGF0c1swXS5yeF9wYXVzZSk7CisJcHJpdi0+cnhfZmxvd3N0YXRzLnJ4X3BhdXNlX2R1cmF0aW9uID0KKwkJYmU2NF90b19jcHUoZmxvd3N0YXRzWzBdLnJ4X3BhdXNlX2R1cmF0aW9uKTsKKwlwcml2LT5yeF9mbG93c3RhdHMucnhfcGF1c2VfdHJhbnNpdGlvbiA9CisJCWJlNjRfdG9fY3B1KGZsb3dzdGF0c1swXS5yeF9wYXVzZV90cmFuc2l0aW9uKTsKKwlwcml2LT50eF9mbG93c3RhdHMudHhfcGF1c2UgPQorCQliZTY0X3RvX2NwdShmbG93c3RhdHNbMF0udHhfcGF1c2UpOworCXByaXYtPnR4X2Zsb3dzdGF0cy50eF9wYXVzZV9kdXJhdGlvbiA9CisJCWJlNjRfdG9fY3B1KGZsb3dzdGF0c1swXS50eF9wYXVzZV9kdXJhdGlvbik7CisJcHJpdi0+dHhfZmxvd3N0YXRzLnR4X3BhdXNlX3RyYW5zaXRpb24gPQorCQliZTY0X3RvX2NwdShmbG93c3RhdHNbMF0udHhfcGF1c2VfdHJhbnNpdGlvbik7CisKIAlzcGluX3VubG9ja19iaCgmcHJpdi0+c3RhdHNfbG9jayk7CiAKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fcnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fcnguYwppbmRleCA2OThkNjBkLi40ZmRkM2MzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3J4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9yeC5jCkBAIC03NzEsNyArNzcxLDcgQEAKIAkJLyoKIAkJICogbWFrZSBzdXJlIHdlIHJlYWQgdGhlIENRRSBhZnRlciB3ZSByZWFkIHRoZSBvd25lcnNoaXAgYml0CiAJCSAqLwotCQlybWIoKTsKKwkJZG1hX3JtYigpOwogCiAJCS8qIERyb3AgcGFja2V0IG9uIGJhZCByZWNlaXZlIG9yIGJhZCBjaGVja3N1bSAqLwogCQlpZiAodW5saWtlbHkoKGNxZS0+b3duZXJfc3Jfb3Bjb2RlICYgTUxYNF9DUUVfT1BDT0RFX01BU0spID09CkBAIC0xMTE2LDcgKzExMTYsMTAgQEAKIAkvKiBDYW5jZWwgRkNTIHJlbW92YWwgaWYgRlcgYWxsb3dzICovCiAJaWYgKG1kZXYtPmRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX0ZDU19LRUVQKSB7CiAJCWNvbnRleHQtPnBhcmFtMyB8PSBjcHVfdG9fYmUzMigxIDw8IDI5KTsKLQkJcmluZy0+ZmNzX2RlbCA9IEVUSF9GQ1NfTEVOOworCQlpZiAocHJpdi0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhGQ1MpCisJCQlyaW5nLT5mY3NfZGVsID0gMDsKKwkJZWxzZQorCQkJcmluZy0+ZmNzX2RlbCA9IEVUSF9GQ1NfTEVOOwogCX0gZWxzZQogCQlyaW5nLT5mY3NfZGVsID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9zZWxmdGVzdC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9zZWxmdGVzdC5jCmluZGV4IGE2MTAwOWYuLmI2NmUwM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fc2VsZnRlc3QuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3NlbGZ0ZXN0LmMKQEAgLTY2LDcgKzY2LDcgQEAKIAlldGhoID0gKHN0cnVjdCBldGhoZHIgKilza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBldGhoZHIpKTsKIAlwYWNrZXQJPSAodW5zaWduZWQgY2hhciAqKXNrYl9wdXQoc2tiLCBwYWNrZXRfc2l6ZSk7CiAJbWVtY3B5KGV0aGgtPmhfZGVzdCwgcHJpdi0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCW1lbXNldChldGhoLT5oX3NvdXJjZSwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIoZXRoaC0+aF9zb3VyY2UpOwogCWV0aGgtPmhfcHJvdG8gPSBodG9ucyhFVEhfUF9BUlApOwogCXNrYl9zZXRfbWFjX2hlYWRlcihza2IsIDApOwogCWZvciAoaSA9IDA7IGkgPCBwYWNrZXRfc2l6ZTsgKytpKQkvKiBmaWxsIG91ciBwYWNrZXQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fdHguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fdHguYwppbmRleCA1NWY5ZjVjLi4xNzgzNzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3R4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl90eC5jCkBAIC00MTYsNyArNDE2LDcgQEAKIAkJICogbWFrZSBzdXJlIHdlIHJlYWQgdGhlIENRRSBhZnRlciB3ZSByZWFkIHRoZQogCQkgKiBvd25lcnNoaXAgYml0CiAJCSAqLwotCQlybWIoKTsKKwkJZG1hX3JtYigpOwogCiAJCWlmICh1bmxpa2VseSgoY3FlLT5vd25lcl9zcl9vcGNvZGUgJiBNTFg0X0NRRV9PUENPREVfTUFTSykgPT0KIAkJCSAgICAgTUxYNF9DUUVfT1BDT0RFX0VSUk9SKSkgewpAQCAtNjY3LDcgKzY2Nyw3IEBACiAJCQkJICAgICAgIHNrYl9mcmFnX3NpemUoJnNoaW5mby0+ZnJhZ3NbMF0pKTsKIAkJfQogCi0JCXdtYigpOworCQlkbWFfd21iKCk7CiAJCWlubC0+Ynl0ZV9jb3VudCA9IGNwdV90b19iZTMyKDEgPDwgMzEgfCAoc2tiLT5sZW4gLSBzcGMpKTsKIAl9CiB9CkBAIC04MDQsNyArODA0LDcgQEAKIAogCQkJZGF0YS0+YWRkciA9IGNwdV90b19iZTY0KGRtYSk7CiAJCQlkYXRhLT5sa2V5ID0gcmluZy0+bXJfa2V5OwotCQkJd21iKCk7CisJCQlkbWFfd21iKCk7CiAJCQlkYXRhLT5ieXRlX2NvdW50ID0gY3B1X3RvX2JlMzIoYnl0ZV9jb3VudCk7CiAJCQktLWRhdGE7CiAJCX0KQEAgLTgyMSw3ICs4MjEsNyBAQAogCiAJCQlkYXRhLT5hZGRyID0gY3B1X3RvX2JlNjQoZG1hKTsKIAkJCWRhdGEtPmxrZXkgPSByaW5nLT5tcl9rZXk7Ci0JCQl3bWIoKTsKKwkJCWRtYV93bWIoKTsKIAkJCWRhdGEtPmJ5dGVfY291bnQgPSBjcHVfdG9fYmUzMihieXRlX2NvdW50KTsKIAkJfQogCQkvKiB0eCBjb21wbGV0aW9uIGNhbiBhdm9pZCBjYWNoZSBsaW5lIG1pc3MgZm9yIGNvbW1vbiBjYXNlcyAqLwpAQCAtOTM4LDcgKzkzOCw3IEBACiAJCS8qIEVuc3VyZSBuZXcgZGVzY3JpcHRvciBoaXRzIG1lbW9yeQogCQkgKiBiZWZvcmUgc2V0dGluZyBvd25lcnNoaXAgb2YgdGhpcyBkZXNjcmlwdG9yIHRvIEhXCiAJCSAqLwotCQl3bWIoKTsKKwkJZG1hX3dtYigpOwogCQl0eF9kZXNjLT5jdHJsLm93bmVyX29wY29kZSA9IG9wX293bjsKIAogCQl3bWIoKTsKQEAgLTk1OCw3ICs5NTgsNyBAQAogCQkvKiBFbnN1cmUgbmV3IGRlc2NyaXB0b3IgaGl0cyBtZW1vcnkKIAkJICogYmVmb3JlIHNldHRpbmcgb3duZXJzaGlwIG9mIHRoaXMgZGVzY3JpcHRvciB0byBIVwogCQkgKi8KLQkJd21iKCk7CisJCWRtYV93bWIoKTsKIAkJdHhfZGVzYy0+Y3RybC5vd25lcl9vcGNvZGUgPSBvcF9vd247CiAJCWlmIChzZW5kX2Rvb3JiZWxsKSB7CiAJCQl3bWIoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZXEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZXEuYwppbmRleCAyNjRiYzE1Li4xOTBmZDYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lcS5jCkBAIC0xNTMsMTIgKzE1MywxMCBAQAogCiAJCS8qIEFsbCBhY3RpdmUgc2xhdmVzIG5lZWQgdG8gcmVjZWl2ZSB0aGUgZXZlbnQgKi8KIAkJaWYgKHNsYXZlID09IEFMTF9TTEFWRVMpIHsKLQkJCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9zbGF2ZXM7IGkrKykgewotCQkJCWlmIChpICE9IGRldi0+Y2Fwcy5mdW5jdGlvbiAmJgotCQkJCSAgICBtYXN0ZXItPnNsYXZlX3N0YXRlW2ldLmFjdGl2ZSkKLQkJCQkJaWYgKG1seDRfR0VOX0VRRShkZXYsIGksIGVxZSkpCi0JCQkJCQltbHg0X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGdlbmVyYXRlIGV2ZW50IGZvciBzbGF2ZSAlZFxuIiwKLQkJCQkJCQkgIGkpOworCQkJZm9yIChpID0gMDsgaSA8PSBkZXYtPnBlcnNpc3QtPm51bV92ZnM7IGkrKykgeworCQkJCWlmIChtbHg0X0dFTl9FUUUoZGV2LCBpLCBlcWUpKQorCQkJCQltbHg0X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGdlbmVyYXRlIGV2ZW50IGZvciBzbGF2ZSAlZFxuIiwKKwkJCQkJCSAgaSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAobWx4NF9HRU5fRVFFKGRldiwgc2xhdmUsIGVxZSkpCkBAIC0xOTAsNyArMTg4LDcgQEAKIAltZW1jcHkoc19lcWUsIGVxZSwgZGV2LT5jYXBzLmVxZV9zaXplIC0gMSk7CiAJc19lcWUtPnNsYXZlX2lkID0gc2xhdmU7CiAJLyogZW5zdXJlIGFsbCBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIGJlZm9yZSBzZXR0aW5nIHRoZSBvd25lcnNpcCBiaXQgKi8KLQl3bWIoKTsKKwlkbWFfd21iKCk7CiAJc19lcWUtPm93bmVyID0gISEoc2xhdmVfZXEtPnByb2QgJiBTTEFWRV9FVkVOVF9FUV9TSVpFKSA/IDB4MCA6IDB4ODA7CiAJKytzbGF2ZV9lcS0+cHJvZDsKIApAQCAtMjAzLDEzICsyMDEsMTEgQEAKIAkJCSAgICAgc3RydWN0IG1seDRfZXFlICplcWUpCiB7CiAJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwotCXN0cnVjdCBtbHg0X3NsYXZlX3N0YXRlICpzX3NsYXZlID0KLQkJJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtzbGF2ZV07CiAKLQlpZiAoIXNfc2xhdmUtPmFjdGl2ZSkgewotCQkvKm1seDRfd2FybihkZXYsICJUcnlpbmcgdG8gcGFzcyBldmVudCB0byBpbmFjdGl2ZSBzbGF2ZVxuIik7Ki8KKwlpZiAoc2xhdmUgPCAwIHx8IHNsYXZlID4gZGV2LT5wZXJzaXN0LT5udW1fdmZzIHx8CisJICAgIHNsYXZlID09IGRldi0+Y2Fwcy5mdW5jdGlvbiB8fAorCSAgICAhcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW3NsYXZlXS5hY3RpdmUpCiAJCXJldHVybjsKLQl9CiAKIAlzbGF2ZV9ldmVudChkZXYsIHNsYXZlLCBlcWUpOwogfQpAQCAtNDc3LDcgKzQ3Myw3IEBACiAJCSAqIE1ha2Ugc3VyZSB3ZSByZWFkIEVRIGVudHJ5IGNvbnRlbnRzIGFmdGVyIHdlJ3ZlCiAJCSAqIGNoZWNrZWQgdGhlIG93bmVyc2hpcCBiaXQuCiAJCSAqLwotCQlybWIoKTsKKwkJZG1hX3JtYigpOwogCiAJCXN3aXRjaCAoZXFlLT50eXBlKSB7CiAJCWNhc2UgTUxYNF9FVkVOVF9UWVBFX0NPTVA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmMKaW5kZXggNWEyMWU1ZC4uYjk4ODFmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuYwpAQCAtNDksOSArNDksOSBAQAogZXh0ZXJuIHZvaWQgX19idWdneV91c2Vfb2ZfTUxYNF9HRVQodm9pZCk7CiBleHRlcm4gdm9pZCBfX2J1Z2d5X3VzZV9vZl9NTFg0X1BVVCh2b2lkKTsKIAotc3RhdGljIGJvb2wgZW5hYmxlX3FvczsKK3N0YXRpYyBib29sIGVuYWJsZV9xb3MgPSB0cnVlOwogbW9kdWxlX3BhcmFtKGVuYWJsZV9xb3MsIGJvb2wsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfcW9zLCAiRW5hYmxlIFF1YWxpdHkgb2YgU2VydmljZSBzdXBwb3J0IGluIHRoZSBIQ0EgKGRlZmF1bHQ6IG9mZikiKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX3FvcywgIkVuYWJsZSBFbmhhbmNlZCBRb1Mgc3VwcG9ydCAoZGVmYXVsdDogb24pIik7CiAKICNkZWZpbmUgTUxYNF9HRVQoZGVzdCwgc291cmNlLCBvZmZzZXQpCQkJCSAgICAgIFwKIAlkbyB7CQkJCQkJCSAgICAgIFwKQEAgLTEwNSw2ICsxMDUsNyBAQAogCQlbNDFdID0gIlVuaWNhc3QgVkVQIHN0ZWVyaW5nIHN1cHBvcnQiLAogCQlbNDJdID0gIk11bHRpY2FzdCBWRVAgc3RlZXJpbmcgc3VwcG9ydCIsCiAJCVs0OF0gPSAiQ291bnRlcnMgc3VwcG9ydCIsCisJCVs1Ml0gPSAiUlNTIElQIGZyYWdtZW50cyBzdXBwb3J0IiwKIAkJWzUzXSA9ICJQb3J0IEVUUyBTY2hlZHVsZXIgc3VwcG9ydCIsCiAJCVs1NV0gPSAiUG9ydCBsaW5rIHR5cGUgc2Vuc2luZyBzdXBwb3J0IiwKIAkJWzU5XSA9ICJQb3J0IG1hbmFnZW1lbnQgY2hhbmdlIGV2ZW50IHN1cHBvcnQiLApAQCAtMTQzLDcgKzE0NCwxNCBAQAogCQlbMThdID0gIk1vcmUgdGhhbiA4MCBWRnMgc3VwcG9ydCIsCiAJCVsxOV0gPSAiUGVyZm9ybWFuY2Ugb3B0aW1pemVkIGZvciBsaW1pdGVkIHJ1bGUgY29uZmlndXJhdGlvbiBmbG93IHN0ZWVyaW5nIHN1cHBvcnQiLAogCQlbMjBdID0gIlJlY292ZXJhYmxlIGVycm9yIGV2ZW50cyBzdXBwb3J0IiwKLQkJWzIxXSA9ICJQb3J0IFJlbWFwIHN1cHBvcnQiCisJCVsyMV0gPSAiUG9ydCBSZW1hcCBzdXBwb3J0IiwKKwkJWzIyXSA9ICJRQ04gc3VwcG9ydCIsCisJCVsyM10gPSAiUVAgcmF0ZSBsaW1pdGluZyBzdXBwb3J0IiwKKwkJWzI0XSA9ICJFdGhlcm5ldCBGbG93IGNvbnRyb2wgc3RhdGlzdGljcyBzdXBwb3J0IiwKKwkJWzI1XSA9ICJHcmFudWxhciBRb1MgcGVyIFZGIHN1cHBvcnQiLAorCQlbMjZdID0gIlBvcnQgRVRTIFNjaGVkdWxlciBzdXBwb3J0IiwKKwkJWzI3XSA9ICJQb3J0IGJlYWNvbiBzdXBwb3J0IiwKKwkJWzI4XSA9ICJSWC1BTEwgc3VwcG9ydCIsCiAJfTsKIAlpbnQgaTsKIApAQCAtNjQxLDYgKzY0OSw3IEBACiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUlNTX09GRlNFVAkJMHgyZQogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX01BWF9SRE1BX09GRlNFVAkJMHgyZgogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX1JTWl9TUlFfT0ZGU0VUCQkweDMzCisjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUE9SVF9CRUFDT05fT0ZGU0VUCTB4MzQKICNkZWZpbmUgUVVFUllfREVWX0NBUF9BQ0tfREVMQVlfT0ZGU0VUCQkweDM1CiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfTVRVX1dJRFRIX09GRlNFVAkJMHgzNgogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX1ZMX1BPUlRfT0ZGU0VUCQkweDM3CkBAIC02NzAsMTIgKzY3OSwxMyBAQAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX1JTVkRfWFJDX09GRlNFVAkJMHg2NgogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX01BWF9YUkNfT0ZGU0VUCQkweDY3CiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfTUFYX0NPVU5URVJTX09GRlNFVAkweDY4CisjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUE9SVF9GTE9XU1RBVFNfQ09VTlRFUlNfT0ZGU0VUCTB4NzAKICNkZWZpbmUgUVVFUllfREVWX0NBUF9FWFRfMl9GTEFHU19PRkZTRVQJMHg3MAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX0ZMT1dfU1RFRVJJTkdfSVBPSUJfT0ZGU0VUCTB4NzQKICNkZWZpbmUgUVVFUllfREVWX0NBUF9GTE9XX1NURUVSSU5HX1JBTkdFX0VOX09GRlNFVAkweDc2CiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfRkxPV19TVEVFUklOR19NQVhfUVBfT0ZGU0VUCTB4NzcKICNkZWZpbmUgUVVFUllfREVWX0NBUF9DUV9FUV9DQUNIRV9MSU5FX1NUUklERQkweDdhCi0jZGVmaW5lIFFVRVJZX0RFVl9DQVBfRVRIX1BST1RfQ1RSTF9PRkZTRVQJMHg3YQorI2RlZmluZSBRVUVSWV9ERVZfQ0FQX0VDTl9RQ05fVkVSX09GRlNFVAkweDdiCiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUkRNQVJDX0VOVFJZX1NaX09GRlNFVAkweDgwCiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUVBDX0VOVFJZX1NaX09GRlNFVAkweDgyCiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfQVVYX0VOVFJZX1NaX09GRlNFVAkweDg0CkBAIC02OTYsNiArNzA2LDEwIEBACiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfTUFEX0RFTVVYX09GRlNFVAkJMHhiMAogI2RlZmluZSBRVUVSWV9ERVZfQ0FQX0RNRlNfSElHSF9SQVRFX1FQTl9CQVNFX09GRlNFVAkweGE4CiAjZGVmaW5lIFFVRVJZX0RFVl9DQVBfRE1GU19ISUdIX1JBVEVfUVBOX1JBTkdFX09GRlNFVAkweGFjCisjZGVmaW5lIFFVRVJZX0RFVl9DQVBfUVBfUkFURV9MSU1JVF9OVU1fT0ZGU0VUCTB4Y2MKKyNkZWZpbmUgUVVFUllfREVWX0NBUF9RUF9SQVRFX0xJTUlUX01BWF9PRkZTRVQJMHhkMAorI2RlZmluZSBRVUVSWV9ERVZfQ0FQX1FQX1JBVEVfTElNSVRfTUlOX09GRlNFVAkweGQyCisKIAogCWRldl9jYXAtPmZsYWdzMiA9IDA7CiAJbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKQEAgLTc2NywxNiArNzgxLDI1IEBACiAJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9WTF9QT1JUX09GRlNFVCk7CiAJZGV2X2NhcC0+bnVtX3BvcnRzID0gZmllbGQgJiAweGY7CiAJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9NQVhfTVNHX1NaX09GRlNFVCk7CisJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfREVWX0NBUF9QT1JUX0ZMT1dTVEFUU19DT1VOVEVSU19PRkZTRVQpOworCWlmIChmaWVsZCAmIDB4MTApCisJCWRldl9jYXAtPmZsYWdzMiB8PSBNTFg0X0RFVl9DQVBfRkxBRzJfRkxPV1NUQVRTX0VOOwogCWRldl9jYXAtPm1heF9tc2dfc3ogPSAxIDw8IChmaWVsZCAmIDB4MWYpOwogCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfRkxPV19TVEVFUklOR19SQU5HRV9FTl9PRkZTRVQpOwogCWlmIChmaWVsZCAmIDB4ODApCiAJCWRldl9jYXAtPmZsYWdzMiB8PSBNTFg0X0RFVl9DQVBfRkxBRzJfRlNfRU47CiAJZGV2X2NhcC0+ZnNfbG9nX21heF91Y2FzdF9xcF9yYW5nZV9zaXplID0gZmllbGQgJiAweDFmOworCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfUE9SVF9CRUFDT05fT0ZGU0VUKTsKKwlpZiAoZmllbGQgJiAweDgwKQorCQlkZXZfY2FwLT5mbGFnczIgfD0gTUxYNF9ERVZfQ0FQX0ZMQUcyX1BPUlRfQkVBQ09OOwogCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfRkxPV19TVEVFUklOR19JUE9JQl9PRkZTRVQpOwogCWlmIChmaWVsZCAmIDB4ODApCiAJCWRldl9jYXAtPmZsYWdzMiB8PSBNTFg0X0RFVl9DQVBfRkxBRzJfRE1GU19JUE9JQjsKIAlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX0ZMT1dfU1RFRVJJTkdfTUFYX1FQX09GRlNFVCk7CiAJZGV2X2NhcC0+ZnNfbWF4X251bV9xcF9wZXJfZW50cnkgPSBmaWVsZDsKKwlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX0VDTl9RQ05fVkVSX09GRlNFVCk7CisJaWYgKGZpZWxkICYgMHgxKQorCQlkZXZfY2FwLT5mbGFnczIgfD0gTUxYNF9ERVZfQ0FQX0ZMQUcyX1FDTjsKIAlNTFg0X0dFVChzdGF0X3JhdGUsIG91dGJveCwgUVVFUllfREVWX0NBUF9SQVRFX1NVUFBPUlRfT0ZGU0VUKTsKIAlkZXZfY2FwLT5zdGF0X3JhdGVfc3VwcG9ydCA9IHN0YXRfcmF0ZTsKIAlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX0NRX1RTX1NVUFBPUlRfT0ZGU0VUKTsKQEAgLTg1Niw2ICs4NzksOCBAQAogCU1MWDRfR0VUKHNpemUsIG91dGJveCwgUVVFUllfREVWX0NBUF9NQVhfREVTQ19TWl9SUV9PRkZTRVQpOwogCWRldl9jYXAtPm1heF9ycV9kZXNjX3N6ID0gc2l6ZTsKIAlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX0NRX0VRX0NBQ0hFX0xJTkVfU1RSSURFKTsKKwlpZiAoZmllbGQgJiAoMSA8PCA0KSkKKwkJZGV2X2NhcC0+ZmxhZ3MyIHw9IE1MWDRfREVWX0NBUF9GTEFHMl9RT1NfVlBQOwogCWlmIChmaWVsZCAmICgxIDw8IDUpKQogCQlkZXZfY2FwLT5mbGFnczIgfD0gTUxYNF9ERVZfQ0FQX0ZMQUcyX0VUSF9QUk9UX0NUUkw7CiAJaWYgKGZpZWxkICYgKDEgPDwgNikpCkBAIC04NjksNiArODk0LDggQEAKIAlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX0NPTkZJR19ERVZfT0ZGU0VUKTsKIAlpZiAoZmllbGQgJiAweDIwKQogCQlkZXZfY2FwLT5mbGFnczIgfD0gTUxYNF9ERVZfQ0FQX0ZMQUcyX0NPTkZJR19ERVY7CisJaWYgKGZpZWxkICYgKDEgPDwgMikpCisJCWRldl9jYXAtPmZsYWdzMiB8PSBNTFg0X0RFVl9DQVBfRkxBRzJfSUdOT1JFX0ZDUzsKIAlNTFg0X0dFVChkZXZfY2FwLT5yZXNlcnZlZF9sa2V5LCBvdXRib3gsCiAJCSBRVUVSWV9ERVZfQ0FQX1JTVkRfTEtFWV9PRkZTRVQpOwogCU1MWDRfR0VUKGZpZWxkMzIsIG91dGJveCwgUVVFUllfREVWX0NBUF9FVEhfQkFDS1BMX09GRlNFVCk7CkBAIC04ODIsNiArOTA5LDggQEAKIAlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX1ZYTEFOKTsKIAlpZiAoZmllbGQgJiAxPDwzKQogCQlkZXZfY2FwLT5mbGFnczIgfD0gTUxYNF9ERVZfQ0FQX0ZMQUcyX1ZYTEFOX09GRkxPQURTOworCWlmIChmaWVsZCAmICgxIDw8IDUpKQorCQlkZXZfY2FwLT5mbGFnczIgfD0gTUxYNF9ERVZfQ0FQX0ZMQUcyX0VUU19DRkc7CiAJTUxYNF9HRVQoZGV2X2NhcC0+bWF4X2ljbV9zeiwgb3V0Ym94LAogCQkgUVVFUllfREVWX0NBUF9NQVhfSUNNX1NaX09GRlNFVCk7CiAJaWYgKGRldl9jYXAtPmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfQ09VTlRFUlMpCkBAIC05MDAsNiArOTI5LDE4IEBACiAJCSBRVUVSWV9ERVZfQ0FQX0RNRlNfSElHSF9SQVRFX1FQTl9SQU5HRV9PRkZTRVQpOwogCWRldl9jYXAtPmRtZnNfaGlnaF9yYXRlX3Fwbl9yYW5nZSAmPSBNR01fUVBOX01BU0s7CiAKKwlNTFg0X0dFVChzaXplLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfUVBfUkFURV9MSU1JVF9OVU1fT0ZGU0VUKTsKKwlkZXZfY2FwLT5ybF9jYXBzLm51bV9yYXRlcyA9IHNpemU7CisJaWYgKGRldl9jYXAtPnJsX2NhcHMubnVtX3JhdGVzKSB7CisJCWRldl9jYXAtPmZsYWdzMiB8PSBNTFg0X0RFVl9DQVBfRkxBRzJfUVBfUkFURV9MSU1JVDsKKwkJTUxYNF9HRVQoc2l6ZSwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX1FQX1JBVEVfTElNSVRfTUFYX09GRlNFVCk7CisJCWRldl9jYXAtPnJsX2NhcHMubWF4X3ZhbCAgPSBzaXplICYgMHhmZmY7CisJCWRldl9jYXAtPnJsX2NhcHMubWF4X3VuaXQgPSBzaXplID4+IDE0OworCQlNTFg0X0dFVChzaXplLCBvdXRib3gsIFFVRVJZX0RFVl9DQVBfUVBfUkFURV9MSU1JVF9NSU5fT0ZGU0VUKTsKKwkJZGV2X2NhcC0+cmxfY2Fwcy5taW5fdmFsICA9IHNpemUgJiAweGZmZjsKKwkJZGV2X2NhcC0+cmxfY2Fwcy5taW5fdW5pdCA9IHNpemUgPj4gMTQ7CisJfQorCiAJTUxYNF9HRVQoZmllbGQzMiwgb3V0Ym94LCBRVUVSWV9ERVZfQ0FQX0VYVF8yX0ZMQUdTX09GRlNFVCk7CiAJaWYgKGZpZWxkMzIgJiAoMSA8PCAxNikpCiAJCWRldl9jYXAtPmZsYWdzMiB8PSBNTFg0X0RFVl9DQVBfRkxBRzJfVVBEQVRFX1FQOwpAQCAtOTc1LDYgKzEwMTYsMTUgQEAKIAkJIGRldl9jYXAtPmRtZnNfaGlnaF9yYXRlX3Fwbl9iYXNlKTsKIAltbHg0X2RiZyhkZXYsICJETUZTIGhpZ2ggcmF0ZSBzdGVlciBRUG4gcmFuZ2U6ICVkXG4iLAogCQkgZGV2X2NhcC0+ZG1mc19oaWdoX3JhdGVfcXBuX3JhbmdlKTsKKworCWlmIChkZXZfY2FwLT5mbGFnczIgJiBNTFg0X0RFVl9DQVBfRkxBRzJfUVBfUkFURV9MSU1JVCkgeworCQlzdHJ1Y3QgbWx4NF9yYXRlX2xpbWl0X2NhcHMgKnJsX2NhcHMgPSAmZGV2X2NhcC0+cmxfY2FwczsKKworCQltbHg0X2RiZyhkZXYsICJRUCBSYXRlLUxpbWl0OiAjcmF0ZXMgJWQsIHVuaXQvdmFsIG1heCAlZC8lZCwgbWluICVkLyVkXG4iLAorCQkJIHJsX2NhcHMtPm51bV9yYXRlcywgcmxfY2Fwcy0+bWF4X3VuaXQsIHJsX2NhcHMtPm1heF92YWwsCisJCQkgcmxfY2Fwcy0+bWluX3VuaXQsIHJsX2NhcHMtPm1pbl92YWwpOworCX0KKwogCWR1bXBfZGV2X2NhcF9mbGFncyhkZXYsIGRldl9jYXAtPmZsYWdzKTsKIAlkdW1wX2Rldl9jYXBfZmxhZ3MyKGRldiwgZGV2X2NhcC0+ZmxhZ3MyKTsKIH0KQEAgLTEwNTgsNiArMTEwOCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAorI2RlZmluZSBERVZfQ0FQX0VYVF8yX0ZMQUdfUEZDX0NPVU5URVJTCSgxIDw8IDI4KQogI2RlZmluZSBERVZfQ0FQX0VYVF8yX0ZMQUdfVkxBTl9DT05UUk9MICgxIDw8IDI2KQogI2RlZmluZSBERVZfQ0FQX0VYVF8yX0ZMQUdfODBfVkZTCSgxIDw8IDIxKQogI2RlZmluZSBERVZfQ0FQX0VYVF8yX0ZMQUdfRlNNCQkoMSA8PCAyMCkKQEAgLTEwNzEsNiArMTEyMiw3IEBACiAJdTY0CWZsYWdzOwogCWludAllcnIgPSAwOwogCXU4CWZpZWxkOworCXUxNglmaWVsZDE2OwogCXUzMglibW1lX2ZsYWdzLCBmaWVsZDMyOwogCWludAlyZWFsX3BvcnQ7CiAJaW50CXNsYXZlX3BvcnQ7CkBAIC0xMTAxLDYgKzExNTMsOSBAQAogCX0KIAlmb3IgKDsgc2xhdmVfcG9ydCA8IGRldi0+Y2Fwcy5udW1fcG9ydHM7ICsrc2xhdmVfcG9ydCkKIAkJZmxhZ3MgJj0gfihNTFg0X0RFVl9DQVBfRkxBR19XT0xfUE9SVDEgPDwgc2xhdmVfcG9ydCk7CisKKwkvKiBOb3QgZXhwb3NpbmcgUlNTIElQIGZyYWdtZW50cyB0byBndWVzdHMgKi8KKwlmbGFncyAmPSB+TUxYNF9ERVZfQ0FQX0ZMQUdfUlNTX0lQX0ZSQUc7CiAJTUxYNF9QVVQob3V0Ym94LT5idWYsIGZsYWdzLCBRVUVSWV9ERVZfQ0FQX0VYVF9GTEFHU19PRkZTRVQpOwogCiAJTUxYNF9HRVQoZmllbGQsIG91dGJveC0+YnVmLCBRVUVSWV9ERVZfQ0FQX1ZMX1BPUlRfT0ZGU0VUKTsKQEAgLTExMTMsMTEgKzExNjgsMTYgQEAKIAlmaWVsZCAmPSAweDdmOwogCU1MWDRfUFVUKG91dGJveC0+YnVmLCBmaWVsZCwgUVVFUllfREVWX0NBUF9DUV9UU19TVVBQT1JUX09GRlNFVCk7CiAKLQkvKiBGb3IgZ3Vlc3RzLCBkaXNhYmxlIHZ4bGFuIHR1bm5lbGluZyAqLworCS8qIEZvciBndWVzdHMsIGRpc2FibGUgdnhsYW4gdHVubmVsaW5nIGFuZCBRb1Mgc3VwcG9ydCAqLwogCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gtPmJ1ZiwgUVVFUllfREVWX0NBUF9WWExBTik7Ci0JZmllbGQgJj0gMHhmNzsKKwlmaWVsZCAmPSAweGQ3OwogCU1MWDRfUFVUKG91dGJveC0+YnVmLCBmaWVsZCwgUVVFUllfREVWX0NBUF9WWExBTik7CiAKKwkvKiBGb3IgZ3Vlc3RzLCBkaXNhYmxlIHBvcnQgQkVBQ09OICovCisJTUxYNF9HRVQoZmllbGQsIG91dGJveC0+YnVmLCBRVUVSWV9ERVZfQ0FQX1BPUlRfQkVBQ09OX09GRlNFVCk7CisJZmllbGQgJj0gMHg3ZjsKKwlNTFg0X1BVVChvdXRib3gtPmJ1ZiwgZmllbGQsIFFVRVJZX0RFVl9DQVBfUE9SVF9CRUFDT05fT0ZGU0VUKTsKKwogCS8qIEZvciBndWVzdHMsIHJlcG9ydCBCbHVlZmxhbWUgZGlzYWJsZWQgKi8KIAlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LT5idWYsIFFVRVJZX0RFVl9DQVBfQkZfT0ZGU0VUKTsKIAlmaWVsZCAmPSAweDdmOwpAQCAtMTE0Niw5ICsxMjA2LDI4IEBACiAJLyogdHVybiBvZmYgaG9zdCBzaWRlIHZpcnQgZmVhdHVyZXMgKFZTVCwgRlNNLCBldGMpIGZvciBndWVzdHMgKi8KIAlNTFg0X0dFVChmaWVsZDMyLCBvdXRib3gtPmJ1ZiwgUVVFUllfREVWX0NBUF9FWFRfMl9GTEFHU19PRkZTRVQpOwogCWZpZWxkMzIgJj0gfihERVZfQ0FQX0VYVF8yX0ZMQUdfVkxBTl9DT05UUk9MIHwgREVWX0NBUF9FWFRfMl9GTEFHXzgwX1ZGUyB8Ci0JCSAgICAgREVWX0NBUF9FWFRfMl9GTEFHX0ZTTSk7CisJCSAgICAgREVWX0NBUF9FWFRfMl9GTEFHX0ZTTSB8IERFVl9DQVBfRVhUXzJfRkxBR19QRkNfQ09VTlRFUlMpOwogCU1MWDRfUFVUKG91dGJveC0+YnVmLCBmaWVsZDMyLCBRVUVSWV9ERVZfQ0FQX0VYVF8yX0ZMQUdTX09GRlNFVCk7CiAKKwkvKiB0dXJuIG9mZiBRQ04gZm9yIGd1ZXN0cyAqLworCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gtPmJ1ZiwgUVVFUllfREVWX0NBUF9FQ05fUUNOX1ZFUl9PRkZTRVQpOworCWZpZWxkICY9IDB4ZmU7CisJTUxYNF9QVVQob3V0Ym94LT5idWYsIGZpZWxkLCBRVUVSWV9ERVZfQ0FQX0VDTl9RQ05fVkVSX09GRlNFVCk7CisKKwkvKiB0dXJuIG9mZiBRUCBtYXgtcmF0ZSBsaW1pdGluZyBmb3IgZ3Vlc3RzICovCisJZmllbGQxNiA9IDA7CisJTUxYNF9QVVQob3V0Ym94LT5idWYsIGZpZWxkMTYsIFFVRVJZX0RFVl9DQVBfUVBfUkFURV9MSU1JVF9OVU1fT0ZGU0VUKTsKKworCS8qIHR1cm4gb2ZmIFFvUyBwZXIgVkYgc3VwcG9ydCBmb3IgZ3Vlc3RzICovCisJTUxYNF9HRVQoZmllbGQsIG91dGJveC0+YnVmLCBRVUVSWV9ERVZfQ0FQX0NRX0VRX0NBQ0hFX0xJTkVfU1RSSURFKTsKKwlmaWVsZCAmPSAweGVmOworCU1MWDRfUFVUKG91dGJveC0+YnVmLCBmaWVsZCwgUVVFUllfREVWX0NBUF9DUV9FUV9DQUNIRV9MSU5FX1NUUklERSk7CisKKwkvKiB0dXJuIG9mZiBpZ25vcmUgRkNTIGZlYXR1cmUgZm9yIGd1ZXN0cyAqLworCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gtPmJ1ZiwgUVVFUllfREVWX0NBUF9DT05GSUdfREVWX09GRlNFVCk7CisJZmllbGQgJj0gMHhmYjsKKwlNTFg0X1BVVChvdXRib3gtPmJ1ZiwgZmllbGQsIFFVRVJZX0RFVl9DQVBfQ09ORklHX0RFVl9PRkZTRVQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2NDgsMTMgKzE3MjcsMTcgQEAKIAkJKihpbmJveCArIElOSVRfSENBX0ZMQUdTX09GRlNFVCAvIDQpIHw9IGNwdV90b19iZTMyKDEgPDwgMyk7CiAKIAkvKiBFbmFibGUgUW9TIHN1cHBvcnQgaWYgbW9kdWxlIHBhcmFtZXRlciBzZXQgKi8KLQlpZiAoZW5hYmxlX3FvcykKKwlpZiAoZGV2LT5jYXBzLmZsYWdzMiAmIE1MWDRfREVWX0NBUF9GTEFHMl9FVFNfQ0ZHICYmIGVuYWJsZV9xb3MpCiAJCSooaW5ib3ggKyBJTklUX0hDQV9GTEFHU19PRkZTRVQgLyA0KSB8PSBjcHVfdG9fYmUzMigxIDw8IDIpOwogCiAJLyogZW5hYmxlIGNvdW50ZXJzICovCiAJaWYgKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX0NPVU5URVJTKQogCQkqKGluYm94ICsgSU5JVF9IQ0FfRkxBR1NfT0ZGU0VUIC8gNCkgfD0gY3B1X3RvX2JlMzIoMSA8PCA0KTsKIAorCS8qIEVuYWJsZSBSU1Mgc3ByZWFkIHRvIGZyYWdtZW50ZWQgSVAgcGFja2V0cyB3aGVuIHN1cHBvcnRlZCAqLworCWlmIChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19SU1NfSVBfRlJBRykKKwkJKihpbmJveCArIElOSVRfSENBX0ZMQUdTX09GRlNFVCAvIDQpIHw9IGNwdV90b19iZTMyKDEgPDwgMTMpOworCiAJLyogQ1gzIGlzIGNhcGFibGUgb2YgZXh0ZW5kaW5nIENRRXMvRVFFcyBmcm9tIDMyIHRvIDY0IGJ5dGVzICovCiAJaWYgKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHXzY0Ql9FUUUpIHsKIAkJKihpbmJveCArIElOSVRfSENBX0VRRV9DUUVfT0ZGU0VUUyAvIDQpIHw9IGNwdV90b19iZTMyKDEgPDwgMjkpOwpAQCAtMTg0Myw2ICsxOTI2LDEwIEBACiAJCWVsc2UKIAkJCXBhcmFtLT5zdGVlcmluZ19tb2RlID0gTUxYNF9TVEVFUklOR19NT0RFX0EwOwogCX0KKworCWlmIChkd29yZF9maWVsZCAmICgxIDw8IDEzKSkKKwkJcGFyYW0tPnJzc19pcF9mcmFncyA9IDE7CisKIAkvKiBzdGVlcmluZyBhdHRyaWJ1dGVzICovCiAJaWYgKHBhcmFtLT5zdGVlcmluZ19tb2RlID09IE1MWDRfU1RFRVJJTkdfTU9ERV9ERVZJQ0VfTUFOQUdFRCkgewogCQlNTFg0X0dFVChwYXJhbS0+bWNfYmFzZSwgb3V0Ym94LCBJTklUX0hDQV9GU19CQVNFX09GRlNFVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmgKaW5kZXggZjQ0ZjdmNi4uMDdjYjdjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuaApAQCAtMTI3LDYgKzEyNyw3IEBACiAJdTMyIG1heF9jb3VudGVyczsKIAl1MzIgZG1mc19oaWdoX3JhdGVfcXBuX2Jhc2U7CiAJdTMyIGRtZnNfaGlnaF9yYXRlX3Fwbl9yYW5nZTsKKwlzdHJ1Y3QgbWx4NF9yYXRlX2xpbWl0X2NhcHMgcmxfY2FwczsKIAlzdHJ1Y3QgbWx4NF9wb3J0X2NhcCBwb3J0X2NhcFtNTFg0X01BWF9QT1JUUyArIDFdOwogfTsKIApAQCAtMjAyLDYgKzIwMyw3IEBACiAJdTY0IGRldl9jYXBfZW5hYmxlZDsKIAl1MTYgY3FlX3NpemU7IC8qIEZvciB1c2Ugb25seSB3aGVuIENRRSBzdHJpZGUgZmVhdHVyZSBlbmFibGVkICovCiAJdTE2IGVxZV9zaXplOyAvKiBGb3IgdXNlIG9ubHkgd2hlbiBFUUUgc3RyaWRlIGZlYXR1cmUgZW5hYmxlZCAqLworCXU4IHJzc19pcF9mcmFnczsKIH07CiAKIHN0cnVjdCBtbHg0X2luaXRfaWJfcGFyYW0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9md19xb3MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZndfcW9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyZmRlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZndfcW9zLmMKQEAgLTAsMCArMSwyODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgVG9wc3BpbiBDb21tdW5pY2F0aW9ucy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDggTWVsbGFub3ggVGVjaG5vbG9naWVzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlICJmd19xb3MuaCIKKyNpbmNsdWRlICJmdy5oIgorCitlbnVtIHsKKwkvKiBhbGxvY2F0ZSB2cHAgb3Bjb2RlIG1vZGlmaWVycyAqLworCU1MWDRfQUxMT0NBVEVfVlBQX0FMTE9DQVRFCT0gMHgwLAorCU1MWDRfQUxMT0NBVEVfVlBQX1FVRVJZCQk9IDB4MQorfTsKKworZW51bSB7CisJLyogc2V0IHZwb3J0IHFvcyBvcGNvZGUgbW9kaWZpZXJzICovCisJTUxYNF9TRVRfVlBPUlRfUU9TX1NFVAkJPSAweDAsCisJTUxYNF9TRVRfVlBPUlRfUU9TX1FVRVJZCT0gMHgxCit9OworCitzdHJ1Y3QgbWx4NF9zZXRfcG9ydF9wcmlvMnRjX2NvbnRleHQgeworCXU4IHByaW8ydGNbNF07Cit9OworCitzdHJ1Y3QgbWx4NF9wb3J0X3NjaGVkdWxlcl90Y19jZmdfYmUgeworCV9fYmUxNiBwZzsKKwlfX2JlMTYgYndfcHJlY2VudGFnZTsKKwlfX2JlMTYgbWF4X2J3X3VuaXRzOyAvKiAzLTEwME1icHMsIDQtMUdicHMsIG90aGVyIHZhbHVlcyAtIHJlc2VydmVkICovCisJX19iZTE2IG1heF9id192YWx1ZTsKK307CisKK3N0cnVjdCBtbHg0X3NldF9wb3J0X3NjaGVkdWxlcl9jb250ZXh0IHsKKwlzdHJ1Y3QgbWx4NF9wb3J0X3NjaGVkdWxlcl90Y19jZmdfYmUgdGNbTUxYNF9OVU1fVENdOworfTsKKworLyogR3JhbnVsYXIgUW9zIChwZXIgVkYpIHNlY3Rpb24gKi8KK3N0cnVjdCBtbHg0X2FsbG9jX3ZwcF9wYXJhbSB7CisJX19iZTMyIGF2YWlsaWJsZV92cHA7CisJX19iZTMyIHZwcF9wX3VwW01MWDRfTlVNX1VQXTsKK307CisKK3N0cnVjdCBtbHg0X3ByaW9fcW9zX3BhcmFtIHsKKwlfX2JlMzIgYndfc2hhcmU7CisJX19iZTMyIG1heF9hdmdfYnc7CisJX19iZTMyIHJlc2VydmVkOworCV9fYmUzMiBlbmFibGU7CisJX19iZTMyIHJlc2VydmVkMVs0XTsKK307CisKK3N0cnVjdCBtbHg0X3NldF92cG9ydF9jb250ZXh0IHsKKwlfX2JlMzIgcmVzZXJ2ZWRbOF07CisJc3RydWN0IG1seDRfcHJpb19xb3NfcGFyYW0gcW9zX3BfdXBbTUxYNF9OVU1fVVBdOworfTsKKworaW50IG1seDRfU0VUX1BPUlRfUFJJTzJUQyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTggKnByaW8ydGMpCit7CisJc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7CisJc3RydWN0IG1seDRfc2V0X3BvcnRfcHJpbzJ0Y19jb250ZXh0ICpjb250ZXh0OworCWludCBlcnI7CisJdTMyIGluX21vZDsKKwlpbnQgaTsKKworCW1haWxib3ggPSBtbHg0X2FsbG9jX2NtZF9tYWlsYm94KGRldik7CisJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CisKKwljb250ZXh0ID0gbWFpbGJveC0+YnVmOworCisJZm9yIChpID0gMDsgaSA8IE1MWDRfTlVNX1VQOyBpICs9IDIpCisJCWNvbnRleHQtPnByaW8ydGNbaSA+PiAxXSA9IHByaW8ydGNbaV0gPDwgNCB8IHByaW8ydGNbaSArIDFdOworCisJaW5fbW9kID0gTUxYNF9TRVRfUE9SVF9QUklPMlRDIDw8IDggfCBwb3J0OworCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBpbl9tb2QsIDEsIE1MWDRfQ01EX1NFVF9QT1JULAorCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19CLCBNTFg0X0NNRF9OQVRJVkUpOworCisJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobWx4NF9TRVRfUE9SVF9QUklPMlRDKTsKKworaW50IG1seDRfU0VUX1BPUlRfU0NIRURVTEVSKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1OCAqdGNfdHhfYncsCisJCQkgICAgdTggKnBnLCB1MTYgKnJhdGVsaW1pdCkKK3sKKwlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveDsKKwlzdHJ1Y3QgbWx4NF9zZXRfcG9ydF9zY2hlZHVsZXJfY29udGV4dCAqY29udGV4dDsKKwlpbnQgZXJyOworCXUzMiBpbl9tb2Q7CisJaW50IGk7CisKKwltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCisJY29udGV4dCA9IG1haWxib3gtPmJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBNTFg0X05VTV9UQzsgaSsrKSB7CisJCXN0cnVjdCBtbHg0X3BvcnRfc2NoZWR1bGVyX3RjX2NmZ19iZSAqdGMgPSAmY29udGV4dC0+dGNbaV07CisJCXUxNiByOworCisJCWlmIChyYXRlbGltaXQgJiYgcmF0ZWxpbWl0W2ldKSB7CisJCQlpZiAocmF0ZWxpbWl0W2ldIDw9IE1MWDRfTUFYXzEwME1fVU5JVFNfVkFMKSB7CisJCQkJciA9IHJhdGVsaW1pdFtpXTsKKwkJCQl0Yy0+bWF4X2J3X3VuaXRzID0KKwkJCQkJaHRvbnMoTUxYNF9SQVRFTElNSVRfMTAwTV9VTklUUyk7CisJCQl9IGVsc2UgeworCQkJCXIgPSByYXRlbGltaXRbaV0gLyAxMDsKKwkJCQl0Yy0+bWF4X2J3X3VuaXRzID0KKwkJCQkJaHRvbnMoTUxYNF9SQVRFTElNSVRfMUdfVU5JVFMpOworCQkJfQorCQkJdGMtPm1heF9id192YWx1ZSA9IGh0b25zKHIpOworCQl9IGVsc2UgeworCQkJdGMtPm1heF9id192YWx1ZSA9IGh0b25zKE1MWDRfUkFURUxJTUlUX0RFRkFVTFQpOworCQkJdGMtPm1heF9id191bml0cyA9IGh0b25zKE1MWDRfUkFURUxJTUlUXzFHX1VOSVRTKTsKKwkJfQorCisJCXRjLT5wZyA9IGh0b25zKHBnW2ldKTsKKwkJdGMtPmJ3X3ByZWNlbnRhZ2UgPSBodG9ucyh0Y190eF9id1tpXSk7CisJfQorCisJaW5fbW9kID0gTUxYNF9TRVRfUE9SVF9TQ0hFRFVMRVIgPDwgOCB8IHBvcnQ7CisJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGluX21vZCwgMSwgTUxYNF9DTURfU0VUX1BPUlQsCisJCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0IsIE1MWDRfQ01EX05BVElWRSk7CisKKwltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChtbHg0X1NFVF9QT1JUX1NDSEVEVUxFUik7CisKK2ludCBtbHg0X0FMTE9DQVRFX1ZQUF9nZXQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsCisJCQkgIHUxNiAqYXZhaWxpYmxlX3ZwcCwgdTggKnZwcF9wX3VwKQoreworCWludCBpOworCWludCBlcnI7CisJc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7CisJc3RydWN0IG1seDRfYWxsb2NfdnBwX3BhcmFtICpvdXRfcGFyYW07CisKKwltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCisJb3V0X3BhcmFtID0gbWFpbGJveC0+YnVmOworCisJZXJyID0gbWx4NF9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCBwb3J0LAorCQkJICAgTUxYNF9BTExPQ0FURV9WUFBfUVVFUlksCisJCQkgICBNTFg0X0NNRF9BTExPQ0FURV9WUFAsCisJCQkgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EsCisJCQkgICBNTFg0X0NNRF9OQVRJVkUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJLyogVG90YWwgbnVtYmVyIG9mIHN1cHBvcnRlZCBWUFBzICovCisJKmF2YWlsaWJsZV92cHAgPSAodTE2KWJlMzJfdG9fY3B1KG91dF9wYXJhbS0+YXZhaWxpYmxlX3ZwcCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUxYNF9OVU1fVVA7IGkrKykKKwkJdnBwX3BfdXBbaV0gPSAodTgpYmUzMl90b19jcHUob3V0X3BhcmFtLT52cHBfcF91cFtpXSk7CisKK291dDoKKwltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKG1seDRfQUxMT0NBVEVfVlBQX2dldCk7CisKK2ludCBtbHg0X0FMTE9DQVRFX1ZQUF9zZXQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU4ICp2cHBfcF91cCkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyOworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OworCXN0cnVjdCBtbHg0X2FsbG9jX3ZwcF9wYXJhbSAqaW5fcGFyYW07CisKKwltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCisJaW5fcGFyYW0gPSBtYWlsYm94LT5idWY7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUxYNF9OVU1fVVA7IGkrKykKKwkJaW5fcGFyYW0tPnZwcF9wX3VwW2ldID0gY3B1X3RvX2JlMzIodnBwX3BfdXBbaV0pOworCisJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIHBvcnQsCisJCSAgICAgICBNTFg0X0FMTE9DQVRFX1ZQUF9BTExPQ0FURSwKKwkJICAgICAgIE1MWDRfQ01EX0FMTE9DQVRFX1ZQUCwKKwkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJICAgICAgIE1MWDRfQ01EX05BVElWRSk7CisKKwltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChtbHg0X0FMTE9DQVRFX1ZQUF9zZXQpOworCitpbnQgbWx4NF9TRVRfVlBPUlRfUU9TX2dldChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTggdnBvcnQsCisJCQkgICBzdHJ1Y3QgbWx4NF92cG9ydF9xb3NfcGFyYW0gKm91dF9wYXJhbSkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyOworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OworCXN0cnVjdCBtbHg0X3NldF92cG9ydF9jb250ZXh0ICpjdHg7CisKKwltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCisJY3R4ID0gbWFpbGJveC0+YnVmOworCisJZXJyID0gbWx4NF9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCAodnBvcnQgPDwgOCkgfCBwb3J0LAorCQkJICAgTUxYNF9TRVRfVlBPUlRfUU9TX1FVRVJZLAorCQkJICAgTUxYNF9DTURfU0VUX1ZQT1JUX1FPUywKKwkJCSAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJCSAgIE1MWDRfQ01EX05BVElWRSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUxYNF9OVU1fVVA7IGkrKykgeworCQlvdXRfcGFyYW1baV0uYndfc2hhcmUgPSBiZTMyX3RvX2NwdShjdHgtPnFvc19wX3VwW2ldLmJ3X3NoYXJlKTsKKwkJb3V0X3BhcmFtW2ldLm1heF9hdmdfYncgPQorCQkJYmUzMl90b19jcHUoY3R4LT5xb3NfcF91cFtpXS5tYXhfYXZnX2J3KTsKKwkJb3V0X3BhcmFtW2ldLmVuYWJsZSA9CisJCQkhIShiZTMyX3RvX2NwdShjdHgtPnFvc19wX3VwW2ldLmVuYWJsZSkgJiAzMSk7CisJfQorCitvdXQ6CisJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChtbHg0X1NFVF9WUE9SVF9RT1NfZ2V0KTsKKworaW50IG1seDRfU0VUX1ZQT1JUX1FPU19zZXQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU4IHZwb3J0LAorCQkJICAgc3RydWN0IG1seDRfdnBvcnRfcW9zX3BhcmFtICppbl9wYXJhbSkKK3sKKwlpbnQgaTsKKwlpbnQgZXJyOworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OworCXN0cnVjdCBtbHg0X3NldF92cG9ydF9jb250ZXh0ICpjdHg7CisKKwltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCisJY3R4ID0gbWFpbGJveC0+YnVmOworCisJZm9yIChpID0gMDsgaSA8IE1MWDRfTlVNX1VQOyBpKyspIHsKKwkJY3R4LT5xb3NfcF91cFtpXS5id19zaGFyZSA9IGNwdV90b19iZTMyKGluX3BhcmFtW2ldLmJ3X3NoYXJlKTsKKwkJY3R4LT5xb3NfcF91cFtpXS5tYXhfYXZnX2J3ID0KKwkJCQljcHVfdG9fYmUzMihpbl9wYXJhbVtpXS5tYXhfYXZnX2J3KTsKKwkJY3R4LT5xb3NfcF91cFtpXS5lbmFibGUgPQorCQkJCWNwdV90b19iZTMyKGluX3BhcmFtW2ldLmVuYWJsZSA8PCAzMSk7CisJfQorCisJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsICh2cG9ydCA8PCA4KSB8IHBvcnQsCisJCSAgICAgICBNTFg0X1NFVF9WUE9SVF9RT1NfU0VULAorCQkgICAgICAgTUxYNF9DTURfU0VUX1ZQT1JUX1FPUywKKwkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJICAgICAgIE1MWDRfQ01EX05BVElWRSk7CisKKwltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChtbHg0X1NFVF9WUE9SVF9RT1Nfc2V0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZndfcW9zLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3X3Fvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMWYzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3X3Fvcy5oCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IE1lbGxhbm94IFRlY2hub2xvZ2llcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KKyAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgVmVyc2lvbiAyLCBhdmFpbGFibGUgZnJvbSB0aGUgZmlsZQorICogQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZSwgb3IgdGhlCisgKiBPcGVuSUIub3JnIEJTRCBsaWNlbnNlIGJlbG93OgorICoKKyAqICAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCisgKiAgICAgd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiAgICAgY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyLgorICoKKyAqICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKKyAqICAgICAgICBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIE1MWDRfRldfUU9TX0gKKyNkZWZpbmUgTUxYNF9GV19RT1NfSAorCisjaW5jbHVkZSA8bGludXgvbWx4NC9jbWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbHg0L2RldmljZS5oPgorCisjZGVmaW5lIE1MWDRfTlVNX1VQIDgKKyNkZWZpbmUgTUxYNF9OVU1fVEMgOAorCisvKiBEZWZhdWx0IHN1cHBvcnRlZCBwcmlvcml0aWVzIGZvciBWUFAgYWxsb2NhdGlvbiAqLworI2RlZmluZSBNTFg0X0RFRkFVTFRfUU9TX1BSSU8gKDApCisKKy8qIERlcml2ZWQgZnJvbSBGVyBmZWF0dXJlIGRlZmluaXRpb24sIDAgaXMgdGhlIGRlZmF1bHQgdnBvcnQgZm8gYWxsIFFQcyAqLworI2RlZmluZSBNTFg0X1ZQUF9ERUZBVUxUX1ZQT1JUICgwKQorCitzdHJ1Y3QgbWx4NF92cG9ydF9xb3NfcGFyYW0geworCXUzMiBid19zaGFyZTsKKwl1MzIgbWF4X2F2Z19idzsKKwl1OCBlbmFibGU7Cit9OworCisvKioKKyAqIG1seDRfU0VUX1BPUlRfUFJJTzJUQyAtIFRoaXMgcm91dGluZSBtYXBzIHVzZXIgcHJpb3JpdGllcyB0byB0cmFmZmljCisgKiBjbGFzc2VzIG9mIGEgZ2l2ZW4gcG9ydCBhbmQgZGV2aWNlLgorICoKKyAqIEBkZXY6IG1seDRfZGV2LgorICogQHBvcnQ6IFBoeXNpY2FsIHBvcnQgbnVtYmVyLgorICogQHByaW8ydGM6IEFycmF5IG9mIFRDIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHByaW9yaXRpZXMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBtbHg0X2NvcmUgZXJybm8gY29kZS4KKyAqKi8KK2ludCBtbHg0X1NFVF9QT1JUX1BSSU8yVEMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU4ICpwcmlvMnRjKTsKKworLyoqCisgKiBtbHg0X1NFVF9QT1JUX1NDSEVEVUxFUiAtIFRoaXMgcm91dGluZSBjb25maWd1cmVzIHRoZSBhcmJpdHJhdGlvbiBiZXR3ZWVuCisgKiB0cmFmZmljIGNsYXNzZXMgKEVUUykgYW5kIGNvbmZpZ3VyZWQgcmF0ZSBsaW1pdCBmb3IgdHJhZmZpYyBjbGFzc2VzLgorICogdGNfdHhfYncsIHBnIGFuZCByYXRlbGltaXQgYXJlIGFycmF5cyB3aGVyZSBlYWNoIGluZGV4IHJlcHJlc2VudHMgYSBUQy4KKyAqIFRoZSBkZXNjcmlwdGlvbiBmb3IgdGhvc2UgcGFyYW1ldGVycyBiZWxvdyByZWZlcnMgdG8gYSBzaW5nbGUgVEMuCisgKgorICogQGRldjogbWx4NF9kZXYuCisgKiBAcG9ydDogUGh5c2ljYWwgcG9ydCBudW1iZXIuCisgKiBAdGNfdHhfYnc6IFRoZSBwZXJjZW50YWdlIG9mIHRoZSBiYW5kd2lkdGggYWxsb2NhdGVkIGZvciB0cmFmZmljIGNsYXNzCisgKiAgd2l0aGluIGEgVEMgZ3JvdXAuIFRoZSBzdW0gb2YgdGhlIGJ3X3BlcmNlbnRhZ2Ugb2YgYWxsIHRoZSB0cmFmZmljCisgKiAgY2xhc3NlcyB3aXRoaW4gYSBUQyBncm91cCBtdXN0IGVxdWFsIDEwMCUgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLgorICogQHBnOiBUaGUgVEMgZ3JvdXAgdGhlIHRyYWZmaWMgY2xhc3MgaXMgYXNzb2NpYXRlZCB3aXRoLgorICogQHJhdGVsaW1pdDogVGhlIG1heGltYWwgYmFuZHdpZHRoIGFsbG93ZWQgZm9yIHRoZSB1c2UgYnkgdGhpcyB0cmFmZmljIGNsYXNzLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbWx4NF9jb3JlIGVycm5vIGNvZGUuCisgKiovCitpbnQgbWx4NF9TRVRfUE9SVF9TQ0hFRFVMRVIoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU4ICp0Y190eF9idywKKwkJCSAgICB1OCAqcGcsIHUxNiAqcmF0ZWxpbWl0KTsKKy8qKgorICogbWx4NF9BTExPQ0FURV9WUFBfZ2V0IC0gUXVlcnkgcG9ydCBWUFAgYXZhaWxpYmxlIHJlc291cmNlcyBhbmQgYWxsb2NhdGlvbi4KKyAqIEJlZm9yZSBkaXN0cmlidXRpb24gb2YgVlBQcyB0byBwcmlvcml0aWVzLCBvbmx5IGF2YWlsaWJsZV92cHAgaXMgcmV0dXJuZWQuCisgKiBBZnRlciBpbml0aWFsaXphdGlvbiBpdCByZXR1cm5zIHRoZSBkaXN0cmlidXRpb24gb2YgVlBQcyBhbW9uZyBwcmlvcml0aWVzLgorICoKKyAqIEBkZXY6IG1seDRfZGV2LgorICogQHBvcnQ6IFBoeXNpY2FsIHBvcnQgbnVtYmVyLgorICogQGF2YWlsaWJsZV92cHA6IFBvaW50ZXIgdG8gdmFyaWFibGUgd2hlcmUgbnVtYmVyIG9mIGF2YWlsaWJsZSBWUFBzIGlzIHN0b3JlZAorICogQHZwcF9wX3VwOiBEaXN0cmlidXRpb24gb2YgVlBQcyB0byBwcmlvcml0aWVzIGlzIHN0b3JlZCBpbiB0aGlzIGFycmF5CisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBtbHg0X2NvcmUgZXJybm8gY29kZS4KKyAqKi8KK2ludCBtbHg0X0FMTE9DQVRFX1ZQUF9nZXQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsCisJCQkgIHUxNiAqYXZhaWxpYmxlX3ZwcCwgdTggKnZwcF9wX3VwKTsKKy8qKgorICogbWx4NF9BTExPQ0FURV9WUFBfc2V0IC0gRGlzdHJpYnV0aW9uIG9mIFZQUHMgYW1vbmcgZGlmZmVybnQgcHJpb3JpdGllcy4KKyAqIFRoZSB0b3RhbCBudW1iZXIgb2YgVlBQcyBhc3NpZ25lZCB0byBhbGwgZm9yIGEgcG9ydCBtdXN0IG5vdCBleGNlZWQKKyAqIHRoZSB2YWx1ZSByZXBvcnRlZCBieSBhdmFpbGlibGVfdnBwIGluIG1seDRfQUxMT0NBVEVfVlBQX2dldC4KKyAqIFZQUCBhbGxvY2F0aW9uIGlzIGFsbG93ZWQgb25seSBhZnRlciB0aGUgcG9ydCB0eXBlIGhhcyBiZWVuIHNldCwKKyAqIGFuZCB3aGlsZSBubyBRUHMgYXJlIG9wZW4gZm9yIHRoaXMgcG9ydC4KKyAqCisgKiBAZGV2OiBtbHg0X2Rldi4KKyAqIEBwb3J0OiBQaHlzaWNhbCBwb3J0IG51bWJlci4KKyAqIEB2cHBfcF91cDogQWxsb2NhdGlvbiBvZiBWUFBzIHRvIGRpZmZlcmVudCBwcmlvcml0aWVzLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbWx4NF9jb3JlIGVycm5vIGNvZGUuCisgKiovCitpbnQgbWx4NF9BTExPQ0FURV9WUFBfc2V0KHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1OCAqdnBwX3BfdXApOworCisvKioKKyAqIG1seDRfU0VUX1ZQT1JUX1FPU19nZXQgLSBRdWVyeSBRb1MgcHJvcG9ydGllcyBvZiBhIFZwb3J0LgorICogRWFjaCBwcmlvcml0eSBhbGxvd2VkIGZvciB0aGUgVnBvcnQgaXMgYXNzaWduZWQgd2l0aCBhIHNoYXJlIG9mIHRoZSBCVywKKyAqIGFuZCBhIEJXIGxpbWl0YXRpb24uIFRoaXMgY29tbWFuZHMgcXVlcnkgdGhlIGN1cnJlbnQgUW9TIHZhbHVlcy4KKyAqCisgKiBAZGV2OiBtbHg0X2Rldi4KKyAqIEBwb3J0OiBQaHlzaWNhbCBwb3J0IG51bWJlci4KKyAqIEB2cG9ydDogVnBvcnQgaWQuCisgKiBAb3V0X3BhcmFtOiBBcnJheSBvZiBtbHg0X3Zwb3J0X3Fvc19wYXJhbSB0aGF0IHdpbGwgY29udGFpbiB0aGUgdmFsdWVzLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbWx4NF9jb3JlIGVycm5vIGNvZGUuCisgKiovCitpbnQgbWx4NF9TRVRfVlBPUlRfUU9TX2dldChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTggdnBvcnQsCisJCQkgICBzdHJ1Y3QgbWx4NF92cG9ydF9xb3NfcGFyYW0gKm91dF9wYXJhbSk7CisKKy8qKgorICogbWx4NF9TRVRfVlBPUlRfUU9TX3NldCAtIFNldCBRb1MgcHJvcG9ydGllcyBvZiBhIFZwb3J0LgorICogUW9TIHBhcmFtZXRlcnMgY2FuIGJlIG1vZGlmaWVkIGF0IGFueSB0aW1lLCBidXQgbXVzdCBiZSBpbml0aWFsaXplZAorICogYmVmb3JlIGFueSBRUCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIFZQb3J0LgorICoKKyAqIEBkZXY6IG1seDRfZGV2LgorICogQHBvcnQ6IFBoeXNpY2FsIHBvcnQgbnVtYmVyLgorICogQHZwb3J0OiBWcG9ydCBpZC4KKyAqIEBvdXRfcGFyYW06IEFycmF5IG9mIG1seDRfdnBvcnRfcW9zX3BhcmFtIHdoaWNoIGhvbGRzIHRoZSByZXF1ZXN0ZWQgdmFsdWVzLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgbWx4NF9jb3JlIGVycm5vIGNvZGUuCisgKiovCitpbnQgbWx4NF9TRVRfVlBPUlRfUU9TX3NldChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTggdnBvcnQsCisJCQkgICBzdHJ1Y3QgbWx4NF92cG9ydF9xb3NfcGFyYW0gKmluX3BhcmFtKTsKKworI2VuZGlmIC8qIE1MWDRfRldfUU9TX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMKaW5kZXggN2U0ODcyMi4uYWNjZWI3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMKQEAgLTI5Nyw2ICsyOTcsMjUgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgbWx4NF9lbmFibGVfaWdub3JlX2ZjcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldikKK3sKKwlpZiAoIShkZXYtPmNhcHMuZmxhZ3MyICYgTUxYNF9ERVZfQ0FQX0ZMQUcyX0lHTk9SRV9GQ1MpKQorCQlyZXR1cm47CisKKwlpZiAobWx4NF9pc19tZnVuYyhkZXYpKSB7CisJCW1seDRfZGJnKGRldiwgIlNSSU9WIG1vZGUgLSBEaXNhYmxpbmcgSWdub3JlIEZDUyIpOworCQlkZXYtPmNhcHMuZmxhZ3MyICY9IH5NTFg0X0RFVl9DQVBfRkxBRzJfSUdOT1JFX0ZDUzsKKwkJcmV0dXJuOworCX0KKworCWlmICghKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX0ZDU19LRUVQKSkgeworCQltbHg0X2RiZyhkZXYsCisJCQkgIktlZXAgRkNTIGlzIG5vdCBzdXBwb3J0ZWQgLSBEaXNhYmxpbmcgSWdub3JlIEZDUyIpOworCQlkZXYtPmNhcHMuZmxhZ3MyICY9IH5NTFg0X0RFVl9DQVBfRkxBRzJfSUdOT1JFX0ZDUzsKKwkJcmV0dXJuOworCX0KK30KKwogI2RlZmluZSBNTFg0X0EwX1NURUVSSU5HX1RBQkxFX1NJWkUJMjU2CiBzdGF0aWMgaW50IG1seDRfZGV2X2NhcChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfZGV2X2NhcCAqZGV2X2NhcCkKIHsKQEAgLTQ4OSw2ICs1MDgsOCBAQAogCQlkZXYtPmNhcHMuZG1mc19oaWdoX3JhdGVfcXBuX3JhbmdlID0gTUxYNF9BMF9TVEVFUklOR19UQUJMRV9TSVpFOwogCX0KIAorCWRldi0+Y2Fwcy5ybF9jYXBzID0gZGV2X2NhcC0+cmxfY2FwczsKKwogCWRldi0+Y2Fwcy5yZXNlcnZlZF9xcHNfY250W01MWDRfUVBfUkVHSU9OX1JTU19SQVdfRVRIXSA9CiAJCWRldi0+Y2Fwcy5kbWZzX2hpZ2hfcmF0ZV9xcG5fcmFuZ2U7CiAKQEAgLTUyNiwxMCArNTQ3LDIwIEBACiAJCWRldi0+Y2Fwcy5hbGxvY19yZXNfcXBfbWFzayA9CiAJCQkoZGV2LT5jYXBzLmJmX3JlZ19zaXplID8gTUxYNF9SRVNFUlZFX0VUSF9CRl9RUCA6IDApIHwKIAkJCU1MWDRfUkVTRVJWRV9BMF9RUDsKKworCQlpZiAoIShkZXYtPmNhcHMuZmxhZ3MyICYgTUxYNF9ERVZfQ0FQX0ZMQUcyX0VUU19DRkcpICYmCisJCSAgICBkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19TRVRfRVRIX1NDSEVEKSB7CisJCQltbHg0X3dhcm4oZGV2LCAiT2xkIGRldmljZSBFVFMgc3VwcG9ydCBkZXRlY3RlZFxuIik7CisJCQltbHg0X3dhcm4oZGV2LCAiQ29uc2lkZXIgdXBncmFkaW5nIGRldmljZSBGVy5cbiIpOworCQkJZGV2LT5jYXBzLmZsYWdzMiB8PSBNTFg0X0RFVl9DQVBfRkxBRzJfRVRTX0NGRzsKKwkJfQorCiAJfSBlbHNlIHsKIAkJZGV2LT5jYXBzLmFsbG9jX3Jlc19xcF9tYXNrID0gMDsKIAl9CiAKKwltbHg0X2VuYWJsZV9pZ25vcmVfZmNzKGRldik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtODgzLDYgKzkxNCw4IEBACiAJbWx4NF93YXJuKGRldiwgIlRpbWVzdGFtcGluZyBpcyBub3Qgc3VwcG9ydGVkIGluIHNsYXZlIG1vZGVcbiIpOwogCiAJc2xhdmVfYWRqdXN0X3N0ZWVyaW5nX21vZGUoZGV2LCAmZGV2X2NhcCwgJmhjYV9wYXJhbSk7CisJbWx4NF9kYmcoZGV2LCAiUlNTIHN1cHBvcnQgZm9yIElQIGZyYWdtZW50cyBpcyAlc1xuIiwKKwkJIGhjYV9wYXJhbS5yc3NfaXBfZnJhZ3MgPyAib24iIDogIm9mZiIpOwogCiAJaWYgKGZ1bmNfY2FwLmV4dHJhX2ZsYWdzICYgTUxYNF9RVUVSWV9GVU5DX0ZMQUdTX0JGX1JFU19RUCAmJgogCSAgICBkZXYtPmNhcHMuYmZfcmVnX3NpemUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDQuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NC5oCmluZGV4IDE0MDlkMGNkNi4uZjMwZWViNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0LmgKQEAgLTUwLDYgKzUwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbHg0L2RyaXZlci5oPgogI2luY2x1ZGUgPGxpbnV4L21seDQvZG9vcmJlbGwuaD4KICNpbmNsdWRlIDxsaW51eC9tbHg0L2NtZC5oPgorI2luY2x1ZGUgImZ3X3Fvcy5oIgogCiAjZGVmaW5lIERSVl9OQU1FCSJtbHg0X2NvcmUiCiAjZGVmaW5lIFBGWAkJRFJWX05BTUUgIjogIgpAQCAtNjQsMjEgKzY1LDYgQEAKIAogI2RlZmluZSBJTklUX0hDQV9UUFRfTVdfRU5BQkxFICAgICAgICAgICgxIDw8IDcpCiAKLXN0cnVjdCBtbHg0X3NldF9wb3J0X3ByaW8ydGNfY29udGV4dCB7Ci0JdTggcHJpbzJ0Y1s0XTsKLX07Ci0KLXN0cnVjdCBtbHg0X3BvcnRfc2NoZWR1bGVyX3RjX2NmZ19iZSB7Ci0JX19iZTE2IHBnOwotCV9fYmUxNiBid19wcmVjZW50YWdlOwotCV9fYmUxNiBtYXhfYndfdW5pdHM7IC8qIDMtMTAwTWJwcywgNC0xR2Jwcywgb3RoZXIgdmFsdWVzIC0gcmVzZXJ2ZWQgKi8KLQlfX2JlMTYgbWF4X2J3X3ZhbHVlOwotfTsKLQotc3RydWN0IG1seDRfc2V0X3BvcnRfc2NoZWR1bGVyX2NvbnRleHQgewotCXN0cnVjdCBtbHg0X3BvcnRfc2NoZWR1bGVyX3RjX2NmZ19iZSB0Y1tNTFg0X05VTV9UQ107Ci19OwotCiBlbnVtIHsKIAlNTFg0X0hDUl9CQVNFCQk9IDB4ODA2ODAsCiAJTUxYNF9IQ1JfU0laRQkJPSAweDAwMDFjLApAQCAtMTc1LDcgKzE2MSw3IEBACiAKIC8qCiAgKlZpcnR1YWwgSENSIHN0cnVjdHVyZXMuCi0gKiBtbHg0X3ZoY3IgaXMgdGhlIHN3IHJlcHJlc2VudGF0aW9uLCBpbiBtYWNoaW5lIGVuZGlhbmVzcworICogbWx4NF92aGNyIGlzIHRoZSBzdyByZXByZXNlbnRhdGlvbiwgaW4gbWFjaGluZSBlbmRpYW5uZXNzCiAgKgogICogbWx4NF92aGNyX2NtZCBpcyB0aGUgZm9ybWFsaXplZCBzdHJ1Y3R1cmUsIHRoZSBvbmUgdGhhdCBpcyBwYXNzZWQKICAqIHRvIEZXIHRvIGdvIHRocm91Z2ggY29tbXVuaWNhdGlvbiBjaGFubmVsLgpAQCAtNTEyLDYgKzQ5OCw3IEBACiAJdTMyIHR4X3JhdGU7CiAJYm9vbCBzcG9vZmNoazsKIAl1MzIgbGlua19zdGF0ZTsKKwl1OCBxb3NfdnBvcnQ7CiB9OwogCiBzdHJ1Y3QgbWx4NF92Zl9hZG1pbl9zdGF0ZSB7CkBAIC01NjgsNiArNTU1LDExIEBACiAJc3RydWN0IG1seDRfZXFlIGV2ZW50X2VxZVtTTEFWRV9FVkVOVF9FUV9TSVpFXTsKIH07CiAKK3N0cnVjdCBtbHg0X3Fvc19tYW5hZ2VyIHsKKwlpbnQgbnVtX29mX3Fvc192ZnM7CisJREVDTEFSRV9CSVRNQVAocHJpb3JpdHlfYm0sIE1MWDRfTlVNX1VQKTsKK307CisKIHN0cnVjdCBtbHg0X21hc3Rlcl9xcDBfc3RhdGUgewogCWludCBwcm94eV9xcDBfYWN0aXZlOwogCWludCBxcDBfYWN0aXZlOwpAQCAtNTkyLDYgKzU4NCw3IEBACiAJc3RydWN0IG1seDRfZXFlCQljbWRfZXFlOwogCXN0cnVjdCBtbHg0X3NsYXZlX2V2ZW50X2VxIHNsYXZlX2VxOwogCXN0cnVjdCBtdXRleAkJZ2VuX2VxZV9tdXRleFtNTFg0X01GVU5DX01BWF07CisJc3RydWN0IG1seDRfcW9zX21hbmFnZXIgcW9zX2N0bFtNTFg0X01BWF9QT1JUUyArIDFdOwogfTsKIAogc3RydWN0IG1seDRfbWZ1bmMgewpAQCAtNjQ0LDYgKzYzNyw3IEBACiAJaW50CQkJb3JpZ192bGFuX2l4OwogCXU4CQkJcG9ydDsKIAl1OAkJCXFvczsKKwl1OCAgICAgICAgICAgICAgICAgICAgICBxb3NfdnBvcnQ7CiAJdTE2CQkJdmxhbl9pZDsKIAl1MTYJCQlvcmlnX3ZsYW5faWQ7CiB9OwpAQCAtNzY5LDkgKzc2MywxMSBAQAogCiAKIHN0cnVjdCBtbHg0X3NldF9wb3J0X2dlbmVyYWxfY29udGV4dCB7Ci0JdTggcmVzZXJ2ZWRbM107CisJdTE2IHJlc2VydmVkMTsKKwl1OCB2X2lnbm9yZV9mY3M7CiAJdTggZmxhZ3M7Ci0JdTE2IHJlc2VydmVkMjsKKwl1OCBpZ25vcmVfZmNzOworCXU4IHJlc2VydmVkMjsKIAlfX2JlMTYgbXR1OwogCXU4IHBwdHg7CiAJdTggcGZjdHg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDRfZW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oCmluZGV4IDJhODI2OGUuLjlkZTMwMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oCkBAIC01NSw2ICs1NSw3IEBACiAjaW5jbHVkZSA8bGludXgvbWx4NC9jbWQuaD4KIAogI2luY2x1ZGUgImVuX3BvcnQuaCIKKyNpbmNsdWRlICJtbHg0X3N0YXRzLmgiCiAKICNkZWZpbmUgRFJWX05BTUUJIm1seDRfZW4iCiAjZGVmaW5lIERSVl9WRVJTSU9OCSIyLjItMSIKQEAgLTE3MSw3ICsxNzIsNiBAQAogLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gJ2F2ZXJhZ2UnICovCiAjZGVmaW5lIEFWR19TSVpFCQkJMTI4CiAjZGVmaW5lIEFWR19GQUNUT1IJCQkxMDI0Ci0jZGVmaW5lIE5VTV9QRVJGX1NUQVRTCQkJTlVNX1BFUkZfQ09VTlRFUlMKIAogI2RlZmluZSBJTkNfUEVSRl9DT1VOVEVSKGNudCkJCSgrKyhjbnQpKQogI2RlZmluZSBBRERfUEVSRl9DT1VOVEVSKGNudCwgYWRkKQkoKGNudCkgKz0gKGFkZCkpCkBAIC0xODIsNyArMTgyLDYgQEAKIAogI2Vsc2UKIAotI2RlZmluZSBOVU1fUEVSRl9TVEFUUwkJCTAKICNkZWZpbmUgSU5DX1BFUkZfQ09VTlRFUihjbnQpCQlkbyB7fSB3aGlsZSAoMCkKICNkZWZpbmUgQUREX1BFUkZfQ09VTlRFUihjbnQsIGFkZCkJZG8ge30gd2hpbGUgKDApCiAjZGVmaW5lIEFWR19QRVJGX0NPVU5URVIoY250LCBzYW1wbGUpCWRvIHt9IHdoaWxlICgwKQpAQCAtNDM1LDM3ICs0MzQsNiBAQAogCXUzMiBmbGFnczsKIH07CiAKLXN0cnVjdCBtbHg0X2VuX3BrdF9zdGF0cyB7Ci0JdW5zaWduZWQgbG9uZyBicm9hZGNhc3Q7Ci0JdW5zaWduZWQgbG9uZyByeF9wcmlvWzhdOwotCXVuc2lnbmVkIGxvbmcgdHhfcHJpb1s4XTsKLSNkZWZpbmUgTlVNX1BLVF9TVEFUUwkJMTcKLX07Ci0KLXN0cnVjdCBtbHg0X2VuX3BvcnRfc3RhdHMgewotCXVuc2lnbmVkIGxvbmcgdHNvX3BhY2tldHM7Ci0JdW5zaWduZWQgbG9uZyB4bWl0X21vcmU7Ci0JdW5zaWduZWQgbG9uZyBxdWV1ZV9zdG9wcGVkOwotCXVuc2lnbmVkIGxvbmcgd2FrZV9xdWV1ZTsKLQl1bnNpZ25lZCBsb25nIHR4X3RpbWVvdXQ7Ci0JdW5zaWduZWQgbG9uZyByeF9hbGxvY19mYWlsZWQ7Ci0JdW5zaWduZWQgbG9uZyByeF9jaGtzdW1fZ29vZDsKLQl1bnNpZ25lZCBsb25nIHJ4X2Noa3N1bV9ub25lOwotCXVuc2lnbmVkIGxvbmcgcnhfY2hrc3VtX2NvbXBsZXRlOwotCXVuc2lnbmVkIGxvbmcgdHhfY2hrc3VtX29mZmxvYWQ7Ci0jZGVmaW5lIE5VTV9QT1JUX1NUQVRTCQk5Ci19OwotCi1zdHJ1Y3QgbWx4NF9lbl9wZXJmX3N0YXRzIHsKLQl1MzIgdHhfcG9sbDsKLQl1NjQgdHhfcGt0c3pfYXZnOwotCXUzMiBpbmZsaWdodF9hdmc7Ci0JdTE2IHR4X2NvYWxfYXZnOwotCXUxNiByeF9jb2FsX2F2ZzsKLQl1MzIgbmFwaV9xdW90YTsKLSNkZWZpbmUgTlVNX1BFUkZfQ09VTlRFUlMJCTYKLX07Ci0KIGVudW0gbWx4NF9lbl9tY2xpc3RfYWN0IHsKIAlNQ0xJU1RfTk9ORSwKIAlNQ0xJU1RfUkVNLApAQCAtNTE0LDkgKzQ4MiwxNSBAQAogCU1MWDRfRU5fRkxBR19SWF9DU1VNX05PTl9UQ1BfVURQCT0gKDEgPDwgNSksCiB9OwogCisjZGVmaW5lIFBPUlRfQkVBQ09OX01BWF9MSU1JVCAoNjU1MzUpCiAjZGVmaW5lIE1MWDRfRU5fTUFDX0hBU0hfU0laRSAoMSA8PCBCSVRTX1BFUl9CWVRFKQogI2RlZmluZSBNTFg0X0VOX01BQ19IQVNIX0lEWCA1CiAKK3N0cnVjdCBtbHg0X2VuX3N0YXRzX2JpdG1hcCB7CisJREVDTEFSRV9CSVRNQVAoYml0bWFwLCBOVU1fQUxMX1NUQVRTKTsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7IC8qIGZvciBtdXR1YWwgYWNjZXNzIHRvIHN0YXRzIGJpdG1hcCAqLworfTsKKwogc3RydWN0IG1seDRfZW5fcHJpdiB7CiAJc3RydWN0IG1seDRfZW5fZGV2ICptZGV2OwogCXN0cnVjdCBtbHg0X2VuX3BvcnRfcHJvZmlsZSAqcHJvZjsKQEAgLTU5Miw4ICs1NjYsMTIgQEAKICNlbmRpZgogCXN0cnVjdCBtbHg0X2VuX3BlcmZfc3RhdHMgcHN0YXRzOwogCXN0cnVjdCBtbHg0X2VuX3BrdF9zdGF0cyBwa3N0YXRzOworCXN0cnVjdCBtbHg0X2VuX2Zsb3dfc3RhdHNfcnggcnhfcHJpb3JpdHlfZmxvd3N0YXRzW01MWDRfTlVNX1BSSU9SSVRJRVNdOworCXN0cnVjdCBtbHg0X2VuX2Zsb3dfc3RhdHNfdHggdHhfcHJpb3JpdHlfZmxvd3N0YXRzW01MWDRfTlVNX1BSSU9SSVRJRVNdOworCXN0cnVjdCBtbHg0X2VuX2Zsb3dfc3RhdHNfcnggcnhfZmxvd3N0YXRzOworCXN0cnVjdCBtbHg0X2VuX2Zsb3dfc3RhdHNfdHggdHhfZmxvd3N0YXRzOwogCXN0cnVjdCBtbHg0X2VuX3BvcnRfc3RhdHMgcG9ydF9zdGF0czsKLQl1NjQgc3RhdHNfYml0bWFwOworCXN0cnVjdCBtbHg0X2VuX3N0YXRzX2JpdG1hcCBzdGF0c19iaXRtYXA7CiAJc3RydWN0IGxpc3RfaGVhZCBtY19saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQgY3Vycl9saXN0OwogCXU2NCBicm9hZGNhc3RfaWQ7CkBAIC02MDgsNiArNTg2LDcgQEAKICNpZmRlZiBDT05GSUdfTUxYNF9FTl9EQ0IKIAlzdHJ1Y3QgaWVlZV9ldHMgZXRzOwogCXUxNiBtYXhyYXRlW0lFRUVfODAyMVFBWl9NQVhfVENTXTsKKwllbnVtIGRjYm5sX2NuZGRfc3RhdGVzIGNuZGRfc3RhdGVbSUVFRV84MDIxUUFaX01BWF9UQ1NdOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1JGU19BQ0NFTAogCXNwaW5sb2NrX3QgZmlsdGVyc19sb2NrOwpAQCAtNzYxLDYgKzc0MCwxMSBAQAogaW50IG1seDRfZW5fc3RhcnRfcG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgbWx4NF9lbl9zdG9wX3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGRldGFjaCk7CiAKK3ZvaWQgbWx4NF9lbl9zZXRfc3RhdHNfYml0bWFwKHN0cnVjdCBtbHg0X2RldiAqZGV2LAorCQkJICAgICAgc3RydWN0IG1seDRfZW5fc3RhdHNfYml0bWFwICpzdGF0c19iaXRtYXAsCisJCQkgICAgICB1OCByeF9wcHAsIHU4IHJ4X3BhdXNlLAorCQkJICAgICAgdTggdHhfcHBwLCB1OCB0eF9wYXVzZSk7CisKIHZvaWQgbWx4NF9lbl9mcmVlX3Jlc291cmNlcyhzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2KTsKIGludCBtbHg0X2VuX2FsbG9jX3Jlc291cmNlcyhzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2KTsKIApAQCAtODQ2LDcgKzgzMCwxMCBAQAogaW50IG1seDRfZW5fcmVzZXRfY29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgc3RydWN0IGh3dHN0YW1wX2NvbmZpZyB0c19jb25maWcsCiAJCQkgbmV0ZGV2X2ZlYXR1cmVzX3QgbmV3X2ZlYXR1cmVzKTsKLQordm9pZCBtbHg0X2VuX3VwZGF0ZV9wZmNfc3RhdHNfYml0bWFwKHN0cnVjdCBtbHg0X2RldiAqZGV2LAorCQkJCSAgICAgc3RydWN0IG1seDRfZW5fc3RhdHNfYml0bWFwICpzdGF0c19iaXRtYXAsCisJCQkJICAgICB1OCByeF9wcHAsIHU4IHJ4X3BhdXNlLAorCQkJCSAgICAgdTggdHhfcHBwLCB1OCB0eF9wYXVzZSk7CiBpbnQgbWx4NF9lbl9uZXRkZXZfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLAogCQkJIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9zdGF0cy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0X3N0YXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA1NTU4MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9zdGF0cy5oCkBAIC0wLDAgKzEsMTA3IEBACisjaWZuZGVmIF9NTFg0X1NUQVRTXworI2RlZmluZSBfTUxYNF9TVEFUU18KKworI2lmZGVmIE1MWDRfRU5fUEVSRl9TVEFUCisjZGVmaW5lIE5VTV9QRVJGX1NUQVRTCQkJTlVNX1BFUkZfQ09VTlRFUlMKKyNlbHNlCisjZGVmaW5lIE5VTV9QRVJGX1NUQVRTCQkJMAorI2VuZGlmCisKKyNkZWZpbmUgTlVNX1BSSU9SSVRJRVMJOQorI2RlZmluZSBOVU1fUFJJT1JJVFlfU1RBVFMgMgorCitzdHJ1Y3QgbWx4NF9lbl9wa3Rfc3RhdHMgeworCXVuc2lnbmVkIGxvbmcgcnhfbXVsdGljYXN0X3BhY2tldHM7CisJdW5zaWduZWQgbG9uZyByeF9icm9hZGNhc3RfcGFja2V0czsKKwl1bnNpZ25lZCBsb25nIHJ4X2phYmJlcnM7CisJdW5zaWduZWQgbG9uZyByeF9pbl9yYW5nZV9sZW5ndGhfZXJyb3I7CisJdW5zaWduZWQgbG9uZyByeF9vdXRfcmFuZ2VfbGVuZ3RoX2Vycm9yOworCXVuc2lnbmVkIGxvbmcgdHhfbXVsdGljYXN0X3BhY2tldHM7CisJdW5zaWduZWQgbG9uZyB0eF9icm9hZGNhc3RfcGFja2V0czsKKwl1bnNpZ25lZCBsb25nIHJ4X3ByaW9bTlVNX1BSSU9SSVRJRVNdW05VTV9QUklPUklUWV9TVEFUU107CisJdW5zaWduZWQgbG9uZyB0eF9wcmlvW05VTV9QUklPUklUSUVTXVtOVU1fUFJJT1JJVFlfU1RBVFNdOworI2RlZmluZSBOVU1fUEtUX1NUQVRTCQk0MworfTsKKworc3RydWN0IG1seDRfZW5fcG9ydF9zdGF0cyB7CisJdW5zaWduZWQgbG9uZyB0c29fcGFja2V0czsKKwl1bnNpZ25lZCBsb25nIHhtaXRfbW9yZTsKKwl1bnNpZ25lZCBsb25nIHF1ZXVlX3N0b3BwZWQ7CisJdW5zaWduZWQgbG9uZyB3YWtlX3F1ZXVlOworCXVuc2lnbmVkIGxvbmcgdHhfdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIHJ4X2FsbG9jX2ZhaWxlZDsKKwl1bnNpZ25lZCBsb25nIHJ4X2Noa3N1bV9nb29kOworCXVuc2lnbmVkIGxvbmcgcnhfY2hrc3VtX25vbmU7CisJdW5zaWduZWQgbG9uZyByeF9jaGtzdW1fY29tcGxldGU7CisJdW5zaWduZWQgbG9uZyB0eF9jaGtzdW1fb2ZmbG9hZDsKKyNkZWZpbmUgTlVNX1BPUlRfU1RBVFMJCTEwCit9OworCitzdHJ1Y3QgbWx4NF9lbl9wZXJmX3N0YXRzIHsKKwl1MzIgdHhfcG9sbDsKKwl1NjQgdHhfcGt0c3pfYXZnOworCXUzMiBpbmZsaWdodF9hdmc7CisJdTE2IHR4X2NvYWxfYXZnOworCXUxNiByeF9jb2FsX2F2ZzsKKwl1MzIgbmFwaV9xdW90YTsKKyNkZWZpbmUgTlVNX1BFUkZfQ09VTlRFUlMJCTYKK307CisKKyNkZWZpbmUgTlVNX01BSU5fU1RBVFMJMjEKKworI2RlZmluZSBNTFg0X05VTV9QUklPUklUSUVTCTgKKworc3RydWN0IG1seDRfZW5fZmxvd19zdGF0c19yeCB7CisJdTY0IHJ4X3BhdXNlOworCXU2NCByeF9wYXVzZV9kdXJhdGlvbjsKKwl1NjQgcnhfcGF1c2VfdHJhbnNpdGlvbjsKKyNkZWZpbmUgTlVNX0ZMT1dfU1RBVFNfUlgJMworI2RlZmluZSBOVU1fRkxPV19QUklPUklUWV9TVEFUU19SWAkoTlVNX0ZMT1dfU1RBVFNfUlggKiBcCisJCQkJCSBNTFg0X05VTV9QUklPUklUSUVTKQorfTsKKworc3RydWN0IG1seDRfZW5fZmxvd19zdGF0c190eCB7CisJdTY0IHR4X3BhdXNlOworCXU2NCB0eF9wYXVzZV9kdXJhdGlvbjsKKwl1NjQgdHhfcGF1c2VfdHJhbnNpdGlvbjsKKyNkZWZpbmUgTlVNX0ZMT1dfU1RBVFNfVFgJMworI2RlZmluZSBOVU1fRkxPV19QUklPUklUWV9TVEFUU19UWAkoTlVNX0ZMT1dfU1RBVFNfVFggKiBcCisJCQkJCSBNTFg0X05VTV9QUklPUklUSUVTKQorfTsKKworI2RlZmluZSBOVU1fRkxPV19TVEFUUyAoTlVNX0ZMT1dfU1RBVFNfUlggKyBOVU1fRkxPV19TVEFUU19UWCArIFwKKwkJCU5VTV9GTE9XX1BSSU9SSVRZX1NUQVRTX1RYICsgXAorCQkJTlVNX0ZMT1dfUFJJT1JJVFlfU1RBVFNfUlgpCisKK3N0cnVjdCBtbHg0X2VuX3N0YXRfb3V0X2Zsb3dfY29udHJvbF9tYm94IHsKKwkvKiBUb3RhbCBudW1iZXIgb2YgUEFVU0UgZnJhbWVzIHJlY2VpdmVkIGZyb20gdGhlIGZhci1lbmQgcG9ydCAqLworCV9fYmU2NCByeF9wYXVzZTsKKwkvKiBUb3RhbCBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHRoYXQgZmFyLWVuZCBwb3J0IHJlcXVlc3RlZCB0byBwYXVzZQorCSogdHJhbnNtaXNzaW9uIG9mIHBhY2tldHMKKwkqLworCV9fYmU2NCByeF9wYXVzZV9kdXJhdGlvbjsKKwkvKiBOdW1iZXIgb2YgcmVjZWl2ZWQgdHJhbnNtaXNzaW9uIGZyb20gWE9GRiBzdGF0ZSB0byBYT04gc3RhdGUgKi8KKwlfX2JlNjQgcnhfcGF1c2VfdHJhbnNpdGlvbjsKKwkvKiBUb3RhbCBudW1iZXIgb2YgUEFVU0UgZnJhbWVzIHNlbnQgZnJvbSB0aGUgZmFyLWVuZCBwb3J0ICovCisJX19iZTY0IHR4X3BhdXNlOworCS8qIFRvdGFsIHRpbWUgaW4gbWljcm9zZWNvbmRzIHRoYXQgdHJhbnNtaXNzaW9uIG9mIHBhY2tldHMgaGFzIGJlZW4KKwkqIHBhdXNlZAorCSovCisJX19iZTY0IHR4X3BhdXNlX2R1cmF0aW9uOworCS8qIE51bWJlciBvZiB0cmFuc21pdHRlciB0cmFuc2l0aW9ucyBmcm9tIFhPRkYgc3RhdGUgdG8gWE9OIHN0YXRlICovCisJX19iZTY0IHR4X3BhdXNlX3RyYW5zaXRpb247CisJLyogUmVzZXJ2ZXJkICovCisJX19iZTY0IHJlc2VydmVkWzJdOworfTsKKworZW51bSB7CisJTUxYNF9EVU1QX0VUSF9TVEFUU19GTE9XX0NPTlRST0wgPSAxIDw8IDEyCit9OworCisjZGVmaW5lIE5VTV9BTExfU1RBVFMJKE5VTV9NQUlOX1NUQVRTICsgTlVNX1BPUlRfU1RBVFMgKyBOVU1fUEtUX1NUQVRTICsgXAorCQkJIE5VTV9GTE9XX1NUQVRTICsgTlVNX1BFUkZfU1RBVFMpCisKKyNkZWZpbmUgTUxYNF9GSU5EX05FVERFVl9TVEFUKG4pIChvZmZzZXRvZihzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cywgbikgLyBcCisJCQkJICBzaXplb2YoKChzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqKTApLT5uKSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3BvcnQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCmluZGV4IDlmMjY4ZjAuLmMyYjIxMzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCkBAIC0zOCw2ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvbWx4NC9jbWQuaD4KIAogI2luY2x1ZGUgIm1seDQuaCIKKyNpbmNsdWRlICJtbHg0X3N0YXRzLmgiCiAKICNkZWZpbmUgTUxYNF9NQUNfVkFMSUQJCSgxdWxsIDw8IDYzKQogCkBAIC00OSw2ICs1MCw5IEBACiAjZGVmaW5lIE1MWDRfU1RBVFNfRVJST1JfQ09VTlRFUlNfTUFTSwkJMHgxZmZjMzBVTEwKICNkZWZpbmUgTUxYNF9TVEFUU19QT1JUX0NPVU5URVJTX01BU0sJCTB4MWZlMDAwMDBVTEwKIAorI2RlZmluZSBNTFg0X0ZMQUdfVl9JR05PUkVfRkNTX01BU0sJCTB4MgorI2RlZmluZSBNTFg0X0lHTk9SRV9GQ1NfTUFTSwkJCTB4MQorCiB2b2lkIG1seDRfaW5pdF9tYWNfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X21hY190YWJsZSAqdGFibGUpCiB7CiAJaW50IGk7CkBAIC0xMjcsOCArMTMxLDkgQEAKIAogCWluX21vZCA9IE1MWDRfU0VUX1BPUlRfTUFDX1RBQkxFIDw8IDggfCBwb3J0OwogCi0JZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGluX21vZCwgMSwgTUxYNF9DTURfU0VUX1BPUlQsCi0JCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0IsIE1MWDRfQ01EX05BVElWRSk7CisJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGluX21vZCwgTUxYNF9TRVRfUE9SVF9FVEhfT1BDT0RFLAorCQkgICAgICAgTUxYNF9DTURfU0VUX1BPUlQsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwKKwkJICAgICAgIE1MWDRfQ01EX05BVElWRSk7CiAKIAltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwpAQCAtMzQxLDggKzM0Niw5IEBACiAKIAltZW1jcHkobWFpbGJveC0+YnVmLCBlbnRyaWVzLCBNTFg0X1ZMQU5fVEFCTEVfU0laRSk7CiAJaW5fbW9kID0gTUxYNF9TRVRfUE9SVF9WTEFOX1RBQkxFIDw8IDggfCBwb3J0OwotCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBpbl9tb2QsIDEsIE1MWDRfQ01EX1NFVF9QT1JULAotCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19CLCBNTFg0X0NNRF9OQVRJVkUpOworCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBpbl9tb2QsIE1MWDRfU0VUX1BPUlRfRVRIX09QQ09ERSwKKwkJICAgICAgIE1MWDRfQ01EX1NFVF9QT1JULCBNTFg0X0NNRF9USU1FX0NMQVNTX0IsCisJCSAgICAgICBNTFg0X0NNRF9OQVRJVkUpOwogCiAJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAKQEAgLTYyOSw5ICs2MzUsOSBAQAogCQkgICAgICAgTUxYNF9ST0NFX0dJRF9FTlRSWV9TSVpFKTsKIAogCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLAotCQkgICAgICAgKCh1MzIpcG9ydCkgfCAoTUxYNF9TRVRfUE9SVF9HSURfVEFCTEUgPDwgOCksIDEsCi0JCSAgICAgICBNTFg0X0NNRF9TRVRfUE9SVCwgTUxYNF9DTURfVElNRV9DTEFTU19CLAotCQkgICAgICAgTUxYNF9DTURfTkFUSVZFKTsKKwkJICAgICAgICgodTMyKXBvcnQpIHwgKE1MWDRfU0VUX1BPUlRfR0lEX1RBQkxFIDw8IDgpLAorCQkgICAgICAgTUxYNF9TRVRfUE9SVF9FVEhfT1BDT0RFLCBNTFg0X0NNRF9TRVRfUE9SVCwKKwkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwgTUxYNF9DTURfTkFUSVZFKTsKIAltdXRleF91bmxvY2soJihwcml2LT5wb3J0W3BvcnRdLmdpZF90YWJsZS5tdXRleCkpOwogCXJldHVybiBlcnI7CiB9CkBAIC04MzcsNiArODQzLDEyIEBACiAJCQkJTUxYNF9DTURfTkFUSVZFKTsKIAl9CiAKKwkvKiBTbGF2ZXMgYXJlIG5vdCBhbGxvd2VkIHRvIFNFVF9QT1JUIGJlYWNvbiAoTEVEKSBibGluayAqLworCWlmIChvcF9tb2QgPT0gTUxYNF9TRVRfUE9SVF9CRUFDT05fT1BDT0RFKSB7CisJCW1seDRfd2FybihkZXYsICJkZW55aW5nIFNFVF9QT1JUIEJlYWNvbiBzbGF2ZTolZFxuIiwgc2xhdmUpOworCQlyZXR1cm4gLUVQRVJNOworCX0KKwogCS8qIEZvciBJQiwgd2Ugb25seSBjb25zaWRlcjoKIAkgKiAtIFRoZSBjYXBhYmlsaXR5IG1hc2ssIHdoaWNoIGlzIHNldCB0byB0aGUgYWdncmVnYXRlIG9mIGFsbAogCSAqICAgc2xhdmUgZnVuY3Rpb24gY2FwYWJpbGl0aWVzCkBAIC05NDUsOCArOTU3LDkgQEAKIAkJCShwa2V5X3RibF9mbGFnIDw8IE1MWDRfQ0hBTkdFX1BPUlRfUEtFWV9UQkxfU1opIHwKIAkJCShkZXYtPmNhcHMucG9ydF9pYl9tdHVbcG9ydF0gPDwgTUxYNF9TRVRfUE9SVF9NVFVfQ0FQKSB8CiAJCQkodmxfY2FwIDw8IE1MWDRfU0VUX1BPUlRfVkxfQ0FQKSk7Ci0JCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBwb3J0LCAwLCBNTFg0X0NNRF9TRVRfUE9SVCwKLQkJCQlNTFg0X0NNRF9USU1FX0NMQVNTX0IsIE1MWDRfQ01EX1dSQVBQRUQpOworCQllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgcG9ydCwKKwkJCSAgICAgICBNTFg0X1NFVF9QT1JUX0lCX09QQ09ERSwgTUxYNF9DTURfU0VUX1BPUlQsCisJCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19CLCBNTFg0X0NNRF9XUkFQUEVEKTsKIAkJaWYgKGVyciAhPSAtRU5PTUVNKQogCQkJYnJlYWs7CiAJfQpAQCAtOTc1LDggKzk4OCw5IEBACiAJY29udGV4dC0+cGZjcnggPSBwZmNyeDsKIAogCWluX21vZCA9IE1MWDRfU0VUX1BPUlRfR0VORVJBTCA8PCA4IHwgcG9ydDsKLQllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgaW5fbW9kLCAxLCBNTFg0X0NNRF9TRVRfUE9SVCwKLQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwgIE1MWDRfQ01EX1dSQVBQRUQpOworCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBpbl9tb2QsIE1MWDRfU0VUX1BPUlRfRVRIX09QQ09ERSwKKwkJICAgICAgIE1MWDRfQ01EX1NFVF9QT1JULCBNTFg0X0NNRF9USU1FX0NMQVNTX0IsCisJCSAgICAgICBNTFg0X0NNRF9XUkFQUEVEKTsKIAogCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CkBAIC0xMDEyLDg0ICsxMDI2LDQwIEBACiAJY29udGV4dC0+dmxhbl9taXNzID0gTUxYNF9WTEFOX01JU1NfSURYOwogCiAJaW5fbW9kID0gTUxYNF9TRVRfUE9SVF9SUVBfQ0FMQyA8PCA4IHwgcG9ydDsKLQllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgaW5fbW9kLCAxLCBNTFg0X0NNRF9TRVRfUE9SVCwKLQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwgIE1MWDRfQ01EX1dSQVBQRUQpOworCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBpbl9tb2QsIE1MWDRfU0VUX1BPUlRfRVRIX09QQ09ERSwKKwkJICAgICAgIE1MWDRfQ01EX1NFVF9QT1JULCBNTFg0X0NNRF9USU1FX0NMQVNTX0IsCisJCSAgICAgICBNTFg0X0NNRF9XUkFQUEVEKTsKIAogCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKG1seDRfU0VUX1BPUlRfcXBuX2NhbGMpOwogCi1pbnQgbWx4NF9TRVRfUE9SVF9QUklPMlRDKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1OCAqcHJpbzJ0YykKK2ludCBtbHg0X1NFVF9QT1JUX2Zjc19jaGVjayhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTggaWdub3JlX2Zjc192YWx1ZSkKIHsKIAlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveDsKLQlzdHJ1Y3QgbWx4NF9zZXRfcG9ydF9wcmlvMnRjX2NvbnRleHQgKmNvbnRleHQ7Ci0JaW50IGVycjsKKwlzdHJ1Y3QgbWx4NF9zZXRfcG9ydF9nZW5lcmFsX2NvbnRleHQgKmNvbnRleHQ7CiAJdTMyIGluX21vZDsKLQlpbnQgaTsKKwlpbnQgZXJyOwogCiAJbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKIAlpZiAoSVNfRVJSKG1haWxib3gpKQogCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKIAljb250ZXh0ID0gbWFpbGJveC0+YnVmOwotCWZvciAoaSA9IDA7IGkgPCBNTFg0X05VTV9VUDsgaSArPSAyKQotCQljb250ZXh0LT5wcmlvMnRjW2kgPj4gMV0gPSBwcmlvMnRjW2ldIDw8IDQgfCBwcmlvMnRjW2kgKyAxXTsKKwljb250ZXh0LT52X2lnbm9yZV9mY3MgfD0gTUxYNF9GTEFHX1ZfSUdOT1JFX0ZDU19NQVNLOworCWlmIChpZ25vcmVfZmNzX3ZhbHVlKQorCQljb250ZXh0LT5pZ25vcmVfZmNzIHw9IE1MWDRfSUdOT1JFX0ZDU19NQVNLOworCWVsc2UKKwkJY29udGV4dC0+aWdub3JlX2ZjcyAmPSB+TUxYNF9JR05PUkVfRkNTX01BU0s7CiAKLQlpbl9tb2QgPSBNTFg0X1NFVF9QT1JUX1BSSU8yVEMgPDwgOCB8IHBvcnQ7CisJaW5fbW9kID0gTUxYNF9TRVRfUE9SVF9HRU5FUkFMIDw8IDggfCBwb3J0OwogCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBpbl9tb2QsIDEsIE1MWDRfQ01EX1NFVF9QT1JULAogCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19CLCBNTFg0X0NNRF9OQVRJVkUpOwogCiAJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0wobWx4NF9TRVRfUE9SVF9QUklPMlRDKTsKLQotaW50IG1seDRfU0VUX1BPUlRfU0NIRURVTEVSKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1OCAqdGNfdHhfYncsCi0JCXU4ICpwZywgdTE2ICpyYXRlbGltaXQpCi17Ci0Jc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7Ci0Jc3RydWN0IG1seDRfc2V0X3BvcnRfc2NoZWR1bGVyX2NvbnRleHQgKmNvbnRleHQ7Ci0JaW50IGVycjsKLQl1MzIgaW5fbW9kOwotCWludCBpOwotCi0JbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKLQlpZiAoSVNfRVJSKG1haWxib3gpKQotCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKLQljb250ZXh0ID0gbWFpbGJveC0+YnVmOwotCi0JZm9yIChpID0gMDsgaSA8IE1MWDRfTlVNX1RDOyBpKyspIHsKLQkJc3RydWN0IG1seDRfcG9ydF9zY2hlZHVsZXJfdGNfY2ZnX2JlICp0YyA9ICZjb250ZXh0LT50Y1tpXTsKLQkJdTE2IHI7Ci0KLQkJaWYgKHJhdGVsaW1pdCAmJiByYXRlbGltaXRbaV0pIHsKLQkJCWlmIChyYXRlbGltaXRbaV0gPD0gTUxYNF9NQVhfMTAwTV9VTklUU19WQUwpIHsKLQkJCQlyID0gcmF0ZWxpbWl0W2ldOwotCQkJCXRjLT5tYXhfYndfdW5pdHMgPQotCQkJCQlodG9ucyhNTFg0X1JBVEVMSU1JVF8xMDBNX1VOSVRTKTsKLQkJCX0gZWxzZSB7Ci0JCQkJciA9IHJhdGVsaW1pdFtpXS8xMDsKLQkJCQl0Yy0+bWF4X2J3X3VuaXRzID0KLQkJCQkJaHRvbnMoTUxYNF9SQVRFTElNSVRfMUdfVU5JVFMpOwotCQkJfQotCQkJdGMtPm1heF9id192YWx1ZSA9IGh0b25zKHIpOwotCQl9IGVsc2UgewotCQkJdGMtPm1heF9id192YWx1ZSA9IGh0b25zKE1MWDRfUkFURUxJTUlUX0RFRkFVTFQpOwotCQkJdGMtPm1heF9id191bml0cyA9IGh0b25zKE1MWDRfUkFURUxJTUlUXzFHX1VOSVRTKTsKLQkJfQotCi0JCXRjLT5wZyA9IGh0b25zKHBnW2ldKTsKLQkJdGMtPmJ3X3ByZWNlbnRhZ2UgPSBodG9ucyh0Y190eF9id1tpXSk7Ci0JfQotCi0JaW5fbW9kID0gTUxYNF9TRVRfUE9SVF9TQ0hFRFVMRVIgPDwgOCB8IHBvcnQ7Ci0JZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGluX21vZCwgMSwgTUxYNF9DTURfU0VUX1BPUlQsCi0JCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0IsIE1MWDRfQ01EX05BVElWRSk7Ci0KLQltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTChtbHg0X1NFVF9QT1JUX1NDSEVEVUxFUik7CitFWFBPUlRfU1lNQk9MKG1seDRfU0VUX1BPUlRfZmNzX2NoZWNrKTsKIAogZW51bSB7CiAJVlhMQU5fRU5BQkxFX01PRElGWQk9IDEgPDwgNywKQEAgLTExMjUsMTQgKzEwOTUsMzUgQEAKIAljb250ZXh0LT5zdGVlcmluZyAgPSBzdGVlcmluZzsKIAogCWluX21vZCA9IE1MWDRfU0VUX1BPUlRfVlhMQU4gPDwgOCB8IHBvcnQ7Ci0JZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGluX21vZCwgMSwgTUxYNF9DTURfU0VUX1BPUlQsCi0JCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0IsIE1MWDRfQ01EX05BVElWRSk7CisJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGluX21vZCwgTUxYNF9TRVRfUE9SVF9FVEhfT1BDT0RFLAorCQkgICAgICAgTUxYNF9DTURfU0VUX1BPUlQsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwKKwkJICAgICAgIE1MWDRfQ01EX05BVElWRSk7CiAKIAltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChtbHg0X1NFVF9QT1JUX1ZYTEFOKTsKIAoraW50IG1seDRfU0VUX1BPUlRfQkVBQ09OKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1MTYgdGltZSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OworCisJbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKworCSooKF9fYmUzMiAqKW1haWxib3gtPmJ1ZikgPSBjcHVfdG9fYmUzMih0aW1lKTsKKworCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBwb3J0LCBNTFg0X1NFVF9QT1JUX0JFQUNPTl9PUENPREUsCisJCSAgICAgICBNTFg0X0NNRF9TRVRfUE9SVCwgTUxYNF9DTURfVElNRV9DTEFTU19CLAorCQkgICAgICAgTUxYNF9DTURfTkFUSVZFKTsKKworCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIG1haWxib3gpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKG1seDRfU0VUX1BPUlRfQkVBQ09OKTsKKwogaW50IG1seDRfU0VUX01DQVNUX0ZMVFJfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAogCQkJCXN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCiAJCQkJc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LApAQCAtMTE4NCwyMiArMTE3NSw2IEBACiAJCQkJCSAgdmhjci0+aW5fbW9kaWZpZXIsIG91dGJveCk7CiB9CiAKLXZvaWQgbWx4NF9zZXRfc3RhdHNfYml0bWFwKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1NjQgKnN0YXRzX2JpdG1hcCkKLXsKLQlpZiAoIW1seDRfaXNfbWZ1bmMoZGV2KSkgewotCQkqc3RhdHNfYml0bWFwID0gMDsKLQkJcmV0dXJuOwotCX0KLQotCSpzdGF0c19iaXRtYXAgPSAoTUxYNF9TVEFUU19UUkFGRklDX0NPVU5URVJTX01BU0sgfAotCQkJIE1MWDRfU1RBVFNfVFJBRkZJQ19EUk9QU19NQVNLIHwKLQkJCSBNTFg0X1NUQVRTX1BPUlRfQ09VTlRFUlNfTUFTSyk7Ci0KLQlpZiAobWx4NF9pc19tYXN0ZXIoZGV2KSkKLQkJKnN0YXRzX2JpdG1hcCB8PSBNTFg0X1NUQVRTX0VSUk9SX0NPVU5URVJTX01BU0s7Ci19Ci1FWFBPUlRfU1lNQk9MKG1seDRfc2V0X3N0YXRzX2JpdG1hcCk7Ci0KIGludCBtbHg0X2dldF9zbGF2ZV9mcm9tX3JvY2VfZ2lkKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgdTggKmdpZCwKIAkJCQkgaW50ICpzbGF2ZV9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcXAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcXAuYwppbmRleCBlZGEyOWRiLi5iNzUyMTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3FwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9xcC5jCkBAIC00NDIsNiArNDQyLDE2IEBACiAJCQljbWQtPnFwX2NvbnRleHQucGFyYW0zIHw9IGNwdV90b19iZTMyKE1MWDRfU1RSSVBfVkxBTik7CiAJfQogCisJaWYgKGF0dHIgJiBNTFg0X1VQREFURV9RUF9SQVRFX0xJTUlUKSB7CisJCXFwX21hc2sgfD0gMVVMTCA8PCBNTFg0X1VQRF9RUF9NQVNLX1JBVEVfTElNSVQ7CisJCWNtZC0+cXBfY29udGV4dC5yYXRlX2xpbWl0X3BhcmFtcyA9IGNwdV90b19iZTE2KChwYXJhbXMtPnJhdGVfdW5pdCA8PCAxNCkgfCBwYXJhbXMtPnJhdGVfdmFsKTsKKwl9CisKKwlpZiAoYXR0ciAmIE1MWDRfVVBEQVRFX1FQX1FPU19WUE9SVCkgeworCQlxcF9tYXNrIHw9IDFVTEwgPDwgTUxYNF9VUERfUVBfTUFTS19RT1NfVlBQOworCQljbWQtPnFwX2NvbnRleHQucW9zX3Zwb3J0ID0gcGFyYW1zLT5xb3NfdnBvcnQ7CisJfQorCiAJY21kLT5wcmltYXJ5X2FkZHJfcGF0aF9tYXNrID0gY3B1X3RvX2JlNjQocHJpX2FkZHJfcGF0aF9tYXNrKTsKIAljbWQtPnFwX21hc2sgPSBjcHVfdG9fYmU2NChxcF9tYXNrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9yZXNvdXJjZV90cmFja2VyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Jlc291cmNlX3RyYWNrZXIuYwppbmRleCBkOTdjYTg4Li5jN2YyOGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Jlc291cmNlX3RyYWNrZXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Jlc291cmNlX3RyYWNrZXIuYwpAQCAtMjIxLDExICsyMjEsNiBAQAogCWludAkJCXFwbjsKIH07CiAKLXN0YXRpYyBpbnQgbWx4NF9pc19ldGgoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0KQotewotCXJldHVybiBkZXYtPmNhcHMucG9ydF9tYXNrW3BvcnRdID09IE1MWDRfUE9SVF9UWVBFX0lCID8gMCA6IDE7Ci19Ci0KIHN0YXRpYyB2b2lkICpyZXNfdHJhY2tlcl9sb29rdXAoc3RydWN0IHJiX3Jvb3QgKnJvb3QsIHU2NCByZXNfaWQpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5vZGUgPSByb290LT5yYl9ub2RlOwpAQCAtNzcwLDYgKzc2NSw3IEBACiAJCXFwYy0+cHJpX3BhdGguZmV1cCB8PSBNTFg0X0ZFVVBfRk9SQ0VfRVRIX1VQIHwgTUxYNF9GVkxfRk9SQ0VfRVRIX1ZMQU47CiAJCXFwYy0+cHJpX3BhdGguc2NoZWRfcXVldWUgJj0gMHhDNzsKIAkJcXBjLT5wcmlfcGF0aC5zY2hlZF9xdWV1ZSB8PSAodnBfb3Blci0+c3RhdGUuZGVmYXVsdF9xb3MpIDw8IDM7CisJCXFwYy0+cW9zX3Zwb3J0ID0gdnBfb3Blci0+c3RhdGUucW9zX3Zwb3J0OwogCX0KIAlpZiAodnBfb3Blci0+c3RhdGUuc3Bvb2ZjaGspIHsKIAkJcXBjLT5wcmlfcGF0aC5mZXVwIHw9IE1MWDRfRlNNX0ZPUkNFX0VUSF9TUkNfTUFDOwpAQCAtMjk0Nyw4ICsyOTQzLDEyIEBACiAJcXBfdHlwZQk9IChiZTMyX3RvX2NwdShxcF9jdHgtPmZsYWdzKSA+PiAxNikgJiAweGZmOwogCW9wdHBhcgk9IGJlMzJfdG9fY3B1KCooX19iZTMyICopIGluYm94LT5idWYpOwogCi0JaWYgKHNsYXZlICE9IG1seDRfbWFzdGVyX2Z1bmNfbnVtKGRldikpCisJaWYgKHNsYXZlICE9IG1seDRfbWFzdGVyX2Z1bmNfbnVtKGRldikpIHsKIAkJcXBfY3R4LT5wYXJhbXMyICY9IH5NTFg0X1FQX0JJVF9GUFA7CisJCS8qIHNldHRpbmcgUVAgcmF0ZS1saW1pdCBpcyBkaXNhbGxvd2VkIGZvciBWRnMgKi8KKwkJaWYgKHFwX2N0eC0+cmF0ZV9saW1pdF9wYXJhbXMpCisJCQlyZXR1cm4gLUVQRVJNOworCX0KIAogCXN3aXRjaCAocXBfdHlwZSkgewogCWNhc2UgTUxYNF9RUF9TVF9SQzoKQEAgLTMwMjcsNyArMzAyNyw3IEBACiAKIAkvKiBDYWxsIHRoZSBTVyBpbXBsZW1lbnRhdGlvbiBvZiB3cml0ZV9tdHQ6CiAJICogLSBQcmVwYXJlIGEgZHVtbXkgbXR0IHN0cnVjdAotCSAqIC0gVHJhbnNsYXRlIGluYm94IGNvbnRlbnRzIHRvIHNpbXBsZSBhZGRyZXNzZXMgaW4gaG9zdCBlbmRpYW5lc3MgKi8KKwkgKiAtIFRyYW5zbGF0ZSBpbmJveCBjb250ZW50cyB0byBzaW1wbGUgYWRkcmVzc2VzIGluIGhvc3QgZW5kaWFubmVzcyAqLwogCW10dC5vZmZzZXQgPSAwOyAgLyogVEJEIHRoaXMgaXMgYnJva2VuIGJ1dCBJIGRvbid0IGhhbmRsZSBpdCBzaW5jZQogCQkJICAgIHdlIGRvbid0IHJlYWxseSB1c2UgaXQgKi8KIAltdHQub3JkZXIgPSAwOwpAQCAtMzA5NSw2ICszMDk1LDEyIEBACiAJaWYgKCFwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGUpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogY2hlY2sgZm9yIHNsYXZlIHZhbGlkLCBzbGF2ZSBub3QgUEYsIGFuZCBzbGF2ZSBhY3RpdmUgKi8KKwlpZiAoc2xhdmUgPCAwIHx8IHNsYXZlID4gZGV2LT5wZXJzaXN0LT5udW1fdmZzIHx8CisJICAgIHNsYXZlID09IGRldi0+Y2Fwcy5mdW5jdGlvbiB8fAorCSAgICAhcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW3NsYXZlXS5hY3RpdmUpCisJCXJldHVybiAwOworCiAJZXZlbnRfZXEgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW3NsYXZlXS5ldmVudF9lcVtlcWUtPnR5cGVdOwogCiAJLyogQ3JlYXRlIHRoZSBldmVudCBvbmx5IGlmIHRoZSBzbGF2ZSBpcyByZWdpc3RlcmVkICovCkBAIC00OTEyLDYgKzQ5MTgsMTEgQEAKIAkJCQkJcXAtPnNjaGVkX3F1ZXVlICYgMHhDNzsKIAkJCQl1cGRfY29udGV4dC0+cXBfY29udGV4dC5wcmlfcGF0aC5zY2hlZF9xdWV1ZSB8PQogCQkJCQkoKHdvcmstPnFvcyAmIDB4NykgPDwgMyk7CisJCQkJdXBkX2NvbnRleHQtPnFwX21hc2sgfD0KKwkJCQkJY3B1X3RvX2JlNjQoMVVMTCA8PAorCQkJCQkJICAgIE1MWDRfVVBEX1FQX01BU0tfUU9TX1ZQUCk7CisJCQkJdXBkX2NvbnRleHQtPnFwX2NvbnRleHQucW9zX3Zwb3J0ID0KKwkJCQkJd29yay0+cW9zX3Zwb3J0OwogCQkJfQogCiAJCQllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9hbGxvYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2FsbG9jLmMKaW5kZXggMjAxY2E2ZC4uYWMwZjdiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2FsbG9jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2FsbG9jLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTE3MSw2ICsxNzEsOSBAQAogCWRiLT5kYiAgICAgID0gcGdkaXItPmRiX3BhZ2UgKyBvZmZzZXQgLyBzaXplb2YoKnBnZGlyLT5kYl9wYWdlKTsKIAlkYi0+ZG1hICAgICA9IHBnZGlyLT5kYl9kbWEgICsgb2Zmc2V0OwogCisJZGItPmRiWzBdID0gMDsKKwlkYi0+ZGJbMV0gPSAwOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jbWQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jbWQuYwppbmRleCBhMjg1MzA1Li5lMzI3M2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NtZC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTWVsbGFub3ggVGVjaG5vbG9naWVzIGluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0xMjUsNyArMTI1LDEwIEBACiAJdTggdG9rZW47CiAKIAlzcGluX2xvY2soJmNtZC0+dG9rZW5fbG9jayk7Ci0JdG9rZW4gPSBjbWQtPnRva2VuKysgJSAyNTUgKyAxOworCWNtZC0+dG9rZW4rKzsKKwlpZiAoY21kLT50b2tlbiA9PSAwKQorCQljbWQtPnRva2VuKys7CisJdG9rZW4gPSBjbWQtPnRva2VuOwogCXNwaW5fdW5sb2NrKCZjbWQtPnRva2VuX2xvY2spOwogCiAJcmV0dXJuIHRva2VuOwpAQCAtNTE1LDEwICs1MTgsMTEgQEAKIAllbnQtPnRzMSA9IGt0aW1lX2dldF9ucygpOwogCiAJLyogcmluZyBkb29yYmVsbCBhZnRlciB0aGUgZGVzY3JpcHRvciBpcyB2YWxpZCAqLworCW1seDVfY29yZV9kYmcoZGV2LCAid3JpdGluZyAweCV4IHRvIGNvbW1hbmQgZG9vcmJlbGxcbiIsIDEgPDwgZW50LT5pZHgpOwogCXdtYigpOwogCWlvd3JpdGUzMmJlKDEgPDwgZW50LT5pZHgsICZkZXYtPmlzZWctPmNtZF9kYmVsbCk7Ci0JbWx4NV9jb3JlX2RiZyhkZXYsICJ3cml0ZSAweCV4IHRvIGNvbW1hbmQgZG9vcmJlbGxcbiIsIDEgPDwgZW50LT5pZHgpOwogCW1taW93YigpOworCS8qIGlmIG5vdCBpbiBwb2xsaW5nIGRvbid0IHVzZSBlbnQgYWZ0ZXIgdGhpcyBwb2ludCAqLwogCWlmIChjbWQtPm1vZGUgPT0gQ01EX01PREVfUE9MTElORykgewogCQlwb2xsX3RpbWVvdXQoZW50KTsKIAkJLyogbWFrZSBzdXJlIHdlIHJlYWQgdGhlIGRlc2NyaXB0b3IgYWZ0ZXIgb3duZXJzaGlwIGlzIFNXICovCkBAIC0xMjM2LDcgKzEyNDAsOCBAQAogCQlnb3RvIG91dF9vdXQ7CiAJfQogCi0JZXJyID0gbWx4NV9jb3B5X2Zyb21fbXNnKG91dCwgb3V0Yiwgb3V0X3NpemUpOworCWlmICghY2FsbGJhY2spCisJCWVyciA9IG1seDVfY29weV9mcm9tX21zZyhvdXQsIG91dGIsIG91dF9zaXplKTsKIAogb3V0X291dDoKIAlpZiAoIWNhbGxiYWNrKQpAQCAtMTMxOSw2ICsxMzI0LDQ1IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBhbGxvY19jbWRfcGFnZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZGV2ID0gJmRldi0+cGRldi0+ZGV2OworCisJY21kLT5jbWRfYWxsb2NfYnVmID0gZG1hX3phbGxvY19jb2hlcmVudChkZGV2LCBNTFg1X0FEQVBURVJfUEFHRV9TSVpFLAorCQkJCQkJICZjbWQtPmFsbG9jX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjbWQtPmNtZF9hbGxvY19idWYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogbWFrZSBzdXJlIGl0IGlzIGFsaWduZWQgdG8gNEsgKi8KKwlpZiAoISgodWludHB0cl90KWNtZC0+Y21kX2FsbG9jX2J1ZiAmIChNTFg1X0FEQVBURVJfUEFHRV9TSVpFIC0gMSkpKSB7CisJCWNtZC0+Y21kX2J1ZiA9IGNtZC0+Y21kX2FsbG9jX2J1ZjsKKwkJY21kLT5kbWEgPSBjbWQtPmFsbG9jX2RtYTsKKwkJY21kLT5hbGxvY19zaXplID0gTUxYNV9BREFQVEVSX1BBR0VfU0laRTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG1hX2ZyZWVfY29oZXJlbnQoZGRldiwgTUxYNV9BREFQVEVSX1BBR0VfU0laRSwgY21kLT5jbWRfYWxsb2NfYnVmLAorCQkJICBjbWQtPmFsbG9jX2RtYSk7CisJY21kLT5jbWRfYWxsb2NfYnVmID0gZG1hX3phbGxvY19jb2hlcmVudChkZGV2LAorCQkJCQkJIDIgKiBNTFg1X0FEQVBURVJfUEFHRV9TSVpFIC0gMSwKKwkJCQkJCSAmY21kLT5hbGxvY19kbWEsIEdGUF9LRVJORUwpOworCWlmICghY21kLT5jbWRfYWxsb2NfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZC0+Y21kX2J1ZiA9IFBUUl9BTElHTihjbWQtPmNtZF9hbGxvY19idWYsIE1MWDVfQURBUFRFUl9QQUdFX1NJWkUpOworCWNtZC0+ZG1hID0gQUxJR04oY21kLT5hbGxvY19kbWEsIE1MWDVfQURBUFRFUl9QQUdFX1NJWkUpOworCWNtZC0+YWxsb2Nfc2l6ZSA9IDIgKiBNTFg1X0FEQVBURVJfUEFHRV9TSVpFIC0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9jbWRfcGFnZShzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgbWx4NV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZGV2ID0gJmRldi0+cGRldi0+ZGV2OworCisJZG1hX2ZyZWVfY29oZXJlbnQoZGRldiwgY21kLT5hbGxvY19zaXplLCBjbWQtPmNtZF9hbGxvY19idWYsCisJCQkgIGNtZC0+YWxsb2NfZG1hKTsKK30KKwogaW50IG1seDVfY21kX2luaXQoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKIHsKIAlpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbWx4NV9jbWRfcHJvdF9ibG9jayk7CkBAIC0xMzQxLDE3ICsxMzg1LDkgQEAKIAlpZiAoIWNtZC0+cG9vbCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQljbWQtPmNtZF9idWYgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0FUT01JQywgMCk7Ci0JaWYgKCFjbWQtPmNtZF9idWYpIHsKLQkJZXJyID0gLUVOT01FTTsKKwllcnIgPSBhbGxvY19jbWRfcGFnZShkZXYsIGNtZCk7CisJaWYgKGVycikKIAkJZ290byBlcnJfZnJlZV9wb29sOwotCX0KLQljbWQtPmRtYSA9IGRtYV9tYXBfc2luZ2xlKCZkZXYtPnBkZXYtPmRldiwgY21kLT5jbWRfYnVmLCBQQUdFX1NJWkUsCi0JCQkJICBETUFfQklESVJFQ1RJT05BTCk7Ci0JaWYgKGRtYV9tYXBwaW5nX2Vycm9yKCZkZXYtPnBkZXYtPmRldiwgY21kLT5kbWEpKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2ZyZWU7Ci0JfQogCiAJY21kX2wgPSBpb3JlYWQzMmJlKCZkZXYtPmlzZWctPmNtZHFfYWRkcl9sX3N6KSAmIDB4ZmY7CiAJY21kLT5sb2dfc3ogPSBjbWRfbCA+PiA0ICYgMHhmOwpAQCAtMTM2MCwxMyArMTM5NiwxMyBAQAogCQlkZXZfZXJyKCZkZXYtPnBkZXYtPmRldiwgImZpcm13YXJlIHJlcG9ydHMgdG9vIG1hbnkgb3V0c3RhbmRpbmcgY29tbWFuZHMgJWRcbiIsCiAJCQkxIDw8IGNtZC0+bG9nX3N6KTsKIAkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBlcnJfbWFwOworCQlnb3RvIGVycl9mcmVlX3BhZ2U7CiAJfQogCiAJaWYgKGNtZC0+bG9nX3N6ICsgY21kLT5sb2dfc3RyaWRlID4gTUxYNV9BREFQVEVSX1BBR0VfU0hJRlQpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJjb21tYW5kIHF1ZXVlIHNpemUgb3ZlcmZsb3dcbiIpOwogCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9tYXA7CisJCWdvdG8gZXJyX2ZyZWVfcGFnZTsKIAl9CiAKIAljbWQtPmNoZWNrc3VtX2Rpc2FibGVkID0gMTsKQEAgLTEzNzgsNyArMTQxNCw3IEBACiAJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgY29tbWFuZCBpbnRlcmZhY2UgdmVyc2lvbi4gZHJpdmVyICVkLCBmaXJtd2FyZSAlZFxuIiwKIAkJCUNNRF9JRl9SRVYsIGNtZC0+Y21kaWZfcmV2KTsKIAkJZXJyID0gLUVOT1RTVVBQOwotCQlnb3RvIGVycl9tYXA7CisJCWdvdG8gZXJyX2ZyZWVfcGFnZTsKIAl9CiAKIAlzcGluX2xvY2tfaW5pdCgmY21kLT5hbGxvY19sb2NrKTsKQEAgLTEzOTQsNyArMTQzMCw3IEBACiAJaWYgKGNtZF9sICYgMHhmZmYpIHsKIAkJZGV2X2VycigmZGV2LT5wZGV2LT5kZXYsICJpbnZhbGlkIGNvbW1hbmQgcXVldWUgYWRkcmVzc1xuIik7CiAJCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX21hcDsKKwkJZ290byBlcnJfZnJlZV9wYWdlOwogCX0KIAogCWlvd3JpdGUzMmJlKGNtZF9oLCAmZGV2LT5pc2VnLT5jbWRxX2FkZHJfaCk7CkBAIC0xNDEwLDcgKzE0NDYsNyBAQAogCWVyciA9IGNyZWF0ZV9tc2dfY2FjaGUoZGV2KTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJmRldi0+cGRldi0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBjb21tYW5kIGNhY2hlXG4iKTsKLQkJZ290byBlcnJfbWFwOworCQlnb3RvIGVycl9mcmVlX3BhZ2U7CiAJfQogCiAJc2V0X3dxbmFtZShkZXYpOwpAQCAtMTQzNSwxMSArMTQ3MSw4IEBACiBlcnJfY2FjaGU6CiAJZGVzdHJveV9tc2dfY2FjaGUoZGV2KTsKIAotZXJyX21hcDoKLQlkbWFfdW5tYXBfc2luZ2xlKCZkZXYtPnBkZXYtPmRldiwgY21kLT5kbWEsIFBBR0VfU0laRSwKLQkJCSBETUFfQklESVJFQ1RJT05BTCk7Ci1lcnJfZnJlZToKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWNtZC0+Y21kX2J1ZiwgMCk7CitlcnJfZnJlZV9wYWdlOgorCWZyZWVfY21kX3BhZ2UoZGV2LCBjbWQpOwogCiBlcnJfZnJlZV9wb29sOgogCXBjaV9wb29sX2Rlc3Ryb3koY21kLT5wb29sKTsKQEAgLTE0NTUsOSArMTQ4OCw3IEBACiAJY2xlYW5fZGVidWdfZmlsZXMoZGV2KTsKIAlkZXN0cm95X3dvcmtxdWV1ZShjbWQtPndxKTsKIAlkZXN0cm95X21zZ19jYWNoZShkZXYpOwotCWRtYV91bm1hcF9zaW5nbGUoJmRldi0+cGRldi0+ZGV2LCBjbWQtPmRtYSwgUEFHRV9TSVpFLAotCQkJIERNQV9CSURJUkVDVElPTkFMKTsKLQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWNtZC0+Y21kX2J1ZiwgMCk7CisJZnJlZV9jbWRfcGFnZShkZXYsIGNtZCk7CiAJcGNpX3Bvb2xfZGVzdHJveShjbWQtPnBvb2wpOwogfQogRVhQT1JUX1NZTUJPTChtbHg1X2NtZF9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9jcS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NxLmMKaW5kZXggNDNjNWY0OC4uZWIwY2Y4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2NxLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZGVidWdmcy5jCmluZGV4IDQ4NzgwMjUuLjUyMTBkOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2RlYnVnZnMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2VxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXEuYwppbmRleCBkYTgyOTkxLi41ODgwMGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZXEuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMjA4LDcgKzIwOCw3IEBACiAJCSAqIE1ha2Ugc3VyZSB3ZSByZWFkIEVRIGVudHJ5IGNvbnRlbnRzIGFmdGVyIHdlJ3ZlCiAJCSAqIGNoZWNrZWQgdGhlIG93bmVyc2hpcCBiaXQuCiAJCSAqLwotCQlybWIoKTsKKwkJZG1hX3JtYigpOwogCiAJCW1seDVfY29yZV9kYmcoZXEtPmRldiwgImVxbiAlZCwgZXFlIHR5cGUgJXNcbiIsCiAJCQkgICAgICBlcS0+ZXFuLCBlcWVfdHlwZV9zdHIoZXFlLT50eXBlKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvZncuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mdy5jCmluZGV4IDA2ZjkwMzYuLjRiNGNkYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9mdy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTWVsbGFub3ggVGVjaG5vbG9naWVzIGluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvaGVhbHRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvaGVhbHRoLmMKaW5kZXggM2U2NjcwYy4uMjkyZDc2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL2hlYWx0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9oZWFsdGguYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21hZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21hZC5jCmluZGV4IGZkODBlY2YuLmVlMWIwYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tYWQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWFkLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWFpbi5jCmluZGV4IDUzOTRhODQuLjI4NDI1ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21haW4uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtNDgsMTEgKzQ4LDExIEBACiAjaW5jbHVkZSAibWx4NV9jb3JlLmgiCiAKICNkZWZpbmUgRFJJVkVSX05BTUUgIm1seDVfY29yZSIKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjIuMi0xIgotI2RlZmluZSBEUklWRVJfUkVMREFURQkiRmViIDIwMTQiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIzLjAiCisjZGVmaW5lIERSSVZFUl9SRUxEQVRFICAiSmFudWFyeSAyMDE1IgogCiBNT0RVTEVfQVVUSE9SKCJFbGkgQ29oZW4gPGVsaUBtZWxsYW5veC5jb20+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIk1lbGxhbm94IENvbm5lY3RYLUlCIEhDQSBjb3JlIGxpYnJhcnkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWVsbGFub3ggQ29ubmVjdC1JQiwgQ29ubmVjdFgtNCBjb3JlIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwogTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwogCkBAIC0yODgsOCArMjg4LDYgQEAKIAlNTFg1X1NFVChjbWRfaGNhX2NhcCwgdG8sIGxvZ19tYXhfcmFfcmVxX3FwLCBmcm9tLT5nZW4ubG9nX21heF9yYV9yZXFfcXApOwogCU1MWDVfU0VUKGNtZF9oY2FfY2FwLCB0bywgbG9nX21heF9yYV9yZXNfcXAsIGZyb20tPmdlbi5sb2dfbWF4X3JhX3Jlc19xcCk7CiAJTUxYNV9TRVQoY21kX2hjYV9jYXAsIHRvLCBwa2V5X3RhYmxlX3NpemUsIGZyb20tPmdlbi5wa2V5X3RhYmxlX3NpemUpOwotCU1MWDVfU0VUKGNtZF9oY2FfY2FwLCB0bywgbG9nX21heF9yYV9yZXFfZGMsIGZyb20tPmdlbi5sb2dfbWF4X3JhX3JlcV9kYyk7Ci0JTUxYNV9TRVQoY21kX2hjYV9jYXAsIHRvLCBsb2dfbWF4X3JhX3Jlc19kYywgZnJvbS0+Z2VuLmxvZ19tYXhfcmFfcmVzX2RjKTsKIAlNTFg1X1NFVChjbWRfaGNhX2NhcCwgdG8sIHBrZXlfdGFibGVfc2l6ZSwgdG9fZndfcGtleV9zeihmcm9tLT5nZW4ucGtleV90YWJsZV9zaXplKSk7CiAJTUxYNV9TRVQoY21kX2hjYV9jYXAsIHRvLCBsb2dfdWFyX3BhZ2Vfc3osIFBBR0VfU0hJRlQgLSAxMik7CiAJdjY0ID0gZnJvbS0+Z2VuLmZsYWdzICYgTUxYNV9DQVBfQklUU19SV19NQVNLOwpAQCAtNTA5LDYgKzUwNyw4NyBAQAogCXJldHVybiAwOwogfQogCitpbnQgbWx4NV92ZWN0b3IyZXFuKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGludCB2ZWN0b3IsIGludCAqZXFuLCBpbnQgKmlycW4pCit7CisJc3RydWN0IG1seDVfZXFfdGFibGUgKnRhYmxlID0gJmRldi0+cHJpdi5lcV90YWJsZTsKKwlzdHJ1Y3QgbWx4NV9lcSAqZXEsICpuOworCWludCBlcnIgPSAtRU5PRU5UOworCisJc3Bpbl9sb2NrKCZ0YWJsZS0+bG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVxLCBuLCAmdGFibGUtPmNvbXBfZXFzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGVxLT5pbmRleCA9PSB2ZWN0b3IpIHsKKwkJCSplcW4gPSBlcS0+ZXFuOworCQkJKmlycW4gPSBlcS0+aXJxbjsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmdGFibGUtPmxvY2spOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobWx4NV92ZWN0b3IyZXFuKTsKKworc3RhdGljIHZvaWQgZnJlZV9jb21wX2VxcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg1X2VxX3RhYmxlICp0YWJsZSA9ICZkZXYtPnByaXYuZXFfdGFibGU7CisJc3RydWN0IG1seDVfZXEgKmVxLCAqbjsKKworCXNwaW5fbG9jaygmdGFibGUtPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShlcSwgbiwgJnRhYmxlLT5jb21wX2Vxc19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZlcS0+bGlzdCk7CisJCXNwaW5fdW5sb2NrKCZ0YWJsZS0+bG9jayk7CisJCWlmIChtbHg1X2Rlc3Ryb3lfdW5tYXBfZXEoZGV2LCBlcSkpCisJCQltbHg1X2NvcmVfd2FybihkZXYsICJmYWlsZWQgdG8gZGVzdHJveSBFUSAweCV4XG4iLAorCQkJCSAgICAgICBlcS0+ZXFuKTsKKwkJa2ZyZWUoZXEpOworCQlzcGluX2xvY2soJnRhYmxlLT5sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJnRhYmxlLT5sb2NrKTsKK30KKworc3RhdGljIGludCBhbGxvY19jb21wX2VxcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg1X2VxX3RhYmxlICp0YWJsZSA9ICZkZXYtPnByaXYuZXFfdGFibGU7CisJY2hhciBuYW1lW01MWDVfTUFYX0VRX05BTUVdOworCXN0cnVjdCBtbHg1X2VxICplcTsKKwlpbnQgbmNvbXBfdmVjOworCWludCBuZW50OworCWludCBlcnI7CisJaW50IGk7CisKKwlJTklUX0xJU1RfSEVBRCgmdGFibGUtPmNvbXBfZXFzX2xpc3QpOworCW5jb21wX3ZlYyA9IHRhYmxlLT5udW1fY29tcF92ZWN0b3JzOworCW5lbnQgPSBNTFg1X0NPTVBfRVFfU0laRTsKKwlmb3IgKGkgPSAwOyBpIDwgbmNvbXBfdmVjOyBpKyspIHsKKwkJZXEgPSBremFsbG9jKHNpemVvZigqZXEpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFlcSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gY2xlYW47CisJCX0KKworCQlzbnByaW50ZihuYW1lLCBNTFg1X01BWF9FUV9OQU1FLCAibWx4NV9jb21wJWQiLCBpKTsKKwkJZXJyID0gbWx4NV9jcmVhdGVfbWFwX2VxKGRldiwgZXEsCisJCQkJCSBpICsgTUxYNV9FUV9WRUNfQ09NUF9CQVNFLCBuZW50LCAwLAorCQkJCQkgbmFtZSwgJmRldi0+cHJpdi51dWFyaS51YXJzWzBdKTsKKwkJaWYgKGVycikgeworCQkJa2ZyZWUoZXEpOworCQkJZ290byBjbGVhbjsKKwkJfQorCQltbHg1X2NvcmVfZGJnKGRldiwgImFsbG9jYXRlZCBjb21wbGV0aW9uIEVRTiAlZFxuIiwgZXEtPmVxbik7CisJCWVxLT5pbmRleCA9IGk7CisJCXNwaW5fbG9jaygmdGFibGUtPmxvY2spOworCQlsaXN0X2FkZF90YWlsKCZlcS0+bGlzdCwgJnRhYmxlLT5jb21wX2Vxc19saXN0KTsKKwkJc3Bpbl91bmxvY2soJnRhYmxlLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKKworY2xlYW46CisJZnJlZV9jb21wX2VxcyhkZXYpOworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBpbnQgbWx4NV9kZXZfaW5pdChzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2ID0gJmRldi0+cHJpdjsKQEAgLTY0NSw2ICs3MjQsMTIgQEAKIAkJZ290byBlcnJfZnJlZV91YXI7CiAJfQogCisJZXJyID0gYWxsb2NfY29tcF9lcXMoZGV2KTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvYyBjb21wbGV0aW9uIEVRc1xuIik7CisJCWdvdG8gZXJyX3N0b3BfZXFzOworCX0KKwogCU1MWDVfSU5JVF9ET09SQkVMTF9MT0NLKCZwcml2LT5jcV91YXJfbG9jayk7CiAKIAltbHg1X2luaXRfY3FfdGFibGUoZGV2KTsKQEAgLTY1NCw2ICs3MzksOSBAQAogCiAJcmV0dXJuIDA7CiAKK2Vycl9zdG9wX2VxczoKKwltbHg1X3N0b3BfZXFzKGRldik7CisKIGVycl9mcmVlX3VhcjoKIAltbHg1X2ZyZWVfdXVhcnMoZGV2LCAmcHJpdi0+dXVhcmkpOwogCkBAIC02OTcsNyArNzg1LDYgQEAKIAlkZWJ1Z2ZzX3JlbW92ZShwcml2LT5kYmdfcm9vdCk7CiAJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0wobWx4NV9kZXZfaW5pdCk7CiAKIHN0YXRpYyB2b2lkIG1seDVfZGV2X2NsZWFudXAoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldikKIHsKQEAgLTcwNiw2ICs3OTMsNyBAQAogCW1seDVfY2xlYW51cF9zcnFfdGFibGUoZGV2KTsKIAltbHg1X2NsZWFudXBfcXBfdGFibGUoZGV2KTsKIAltbHg1X2NsZWFudXBfY3FfdGFibGUoZGV2KTsKKwlmcmVlX2NvbXBfZXFzKGRldik7CiAJbWx4NV9zdG9wX2VxcyhkZXYpOwogCW1seDVfZnJlZV91dWFycyhkZXYsICZwcml2LT51dWFyaSk7CiAJbWx4NV9lcV9jbGVhbnVwKGRldik7CkBAIC04MjAsNiArOTA4LDI4IEBACiB9CiBFWFBPUlRfU1lNQk9MKG1seDVfdW5yZWdpc3Rlcl9pbnRlcmZhY2UpOwogCit2b2lkICptbHg1X2dldF9wcm90b2NvbF9kZXYoc3RydWN0IG1seDVfY29yZV9kZXYgKm1kZXYsIGludCBwcm90b2NvbCkKK3sKKwlzdHJ1Y3QgbWx4NV9wcml2ICpwcml2ID0gJm1kZXYtPnByaXY7CisJc3RydWN0IG1seDVfZGV2aWNlX2NvbnRleHQgKmRldl9jdHg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICpyZXN1bHQgPSBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmN0eF9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldl9jdHgsICZtZGV2LT5wcml2LmN0eF9saXN0LCBsaXN0KQorCQlpZiAoKGRldl9jdHgtPmludGYtPnByb3RvY29sID09IHByb3RvY29sKSAmJgorCQkgICAgZGV2X2N0eC0+aW50Zi0+Z2V0X2RldikgeworCQkJcmVzdWx0ID0gZGV2X2N0eC0+aW50Zi0+Z2V0X2RldihkZXZfY3R4LT5jb250ZXh0KTsKKwkJCWJyZWFrOworCQl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5jdHhfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0wobWx4NV9nZXRfcHJvdG9jb2xfZGV2KTsKKwogc3RhdGljIHZvaWQgbWx4NV9jb3JlX2V2ZW50KHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIGVudW0gbWx4NV9kZXZfZXZlbnQgZXZlbnQsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBwYXJhbSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tY2cuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tY2cuYwppbmRleCA0NDgzNzY0Li5kNzlmZDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWNnLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21jZy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTWVsbGFub3ggVGVjaG5vbG9naWVzIGluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWx4NV9jb3JlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbWx4NV9jb3JlLmgKaW5kZXggZjBjOWY5YS4uYTA1MWI5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21seDVfY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9tbHg1X2NvcmUuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL21yLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbXIuYwppbmRleCAxODRjMzYxLi4xYWRiMzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvbXIuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMTQxLDcgKzE0MSw3IEBACiBpbnQgbWx4NV9jb3JlX3F1ZXJ5X21rZXkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfY29yZV9tciAqbXIsCiAJCQkgc3RydWN0IG1seDVfcXVlcnlfbWtleV9tYm94X291dCAqb3V0LCBpbnQgb3V0bGVuKQogewotCXN0cnVjdCBtbHg1X2Rlc3Ryb3lfbWtleV9tYm94X2luIGluOworCXN0cnVjdCBtbHg1X3F1ZXJ5X21rZXlfbWJveF9pbiBpbjsKIAlpbnQgZXJyOwogCiAJbWVtc2V0KCZpbiwgMCwgc2l6ZW9mKGluKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcGFnZWFsbG9jLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcGFnZWFsbG9jLmMKaW5kZXggNGZkYWFlOS4uZGYyMjM4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BhZ2VhbGxvYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wYWdlYWxsb2MuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpAQCAtMjQzLDggKzI0Myw5IEBACiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdTY0IGFkZHI7CiAJaW50IGVycjsKKwlpbnQgbmlkID0gZGV2X3RvX25vZGUoJmRldi0+cGRldi0+ZGV2KTsKIAotCXBhZ2UgPSBhbGxvY19wYWdlKEdGUF9ISUdIVVNFUik7CisJcGFnZSA9IGFsbG9jX3BhZ2VzX25vZGUobmlkLCBHRlBfSElHSFVTRVIsIDApOwogCWlmICghcGFnZSkgewogCQltbHg1X2NvcmVfd2FybihkZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcGFnZVxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BkLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcGQuYwppbmRleCA3OTBkYTVjLi5mMmQzYWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcGQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcGQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BvcnQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9wb3J0LmMKaW5kZXggNzJjMmQwMC4uNDllOTBmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3BvcnQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcG9ydC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTWVsbGFub3ggVGVjaG5vbG9naWVzIGluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvcXAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9xcC5jCmluZGV4IDU3NWQ4NTMuLmRjN2RiZjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9xcC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9xcC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTWVsbGFub3ggVGVjaG5vbG9naWVzIGluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvc3JxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvc3JxLmMKaW5kZXggMzhiY2U5My4uZjlkMjVkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3NycS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS9zcnEuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMsIE1lbGxhbm94IFRlY2hub2xvZ2llcyBpbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUsIE1lbGxhbm94IFRlY2hub2xvZ2llcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bwogICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3Vhci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NS9jb3JlL3Vhci5jCmluZGV4IDA2ODAxZDYuLjVhODliYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDUvY29yZS91YXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg1L2NvcmUvdWFyLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9rc3o4ODR4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3N6ODg0eC5jCmluZGV4IDEwOTg4ZmIuLjZmMzMyZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9rc3o4ODR4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzejg4NHguYwpAQCAtNDE0NCw3ICs0MTQ0LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBody0+YWRkcl9saXN0X3NpemU7IGkrKykgewogCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChody0+YWRkcmVzc1tpXSwgbWFjX2FkZHIpKSB7Ci0JCQltZW1zZXQoaHctPmFkZHJlc3NbaV0sIDAsIEVUSF9BTEVOKTsKKwkJCWV0aF96ZXJvX2FkZHIoaHctPmFkZHJlc3NbaV0pOwogCQkJd3JpdGVsKDAsIGh3LT5pbyArIEFERF9BRERSX0lOQ1IgKiBpICsKIAkJCQlLU19BRERfQUREUl8wX0hJKTsKIAkJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbW94YS9tb3hhcnRfZXRoZXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21veGEvbW94YXJ0X2V0aGVyLmMKaW5kZXggNmM3MmU3NC4uODFkMGYxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbW94YS9tb3hhcnRfZXRoZXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tb3hhL21veGFydF9ldGhlci5jCkBAIC0xNTAsNyArMTUwLDcgQEAKIAogCXByaXYtPnJ4X2hlYWQgPSAwOwogCi0JLyogcmVzZXQgdGhlIE1BQyBjb250cm9sZXIgVFgvUlggZGVzY2lwdG9yIGJhc2UgYWRkcmVzcyAqLworCS8qIHJlc2V0IHRoZSBNQUMgY29udHJvbGxlciBUWC9SWCBkZXNjaXB0b3IgYmFzZSBhZGRyZXNzICovCiAJd3JpdGVsKHByaXYtPnR4X2Jhc2UsIHByaXYtPmJhc2UgKyBSRUdfVFhSX0JBU0VfQUREUkVTUyk7CiAJd3JpdGVsKHByaXYtPnJ4X2Jhc2UsIHByaXYtPmJhc2UgKyBSRUdfUlhSX0JBU0VfQUREUkVTUyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi9zMmlvLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi9zMmlvLmMKaW5kZXggYTRjZGYyZi4uMWUwZjcyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vczJpby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3MyaW8uYwpAQCAtMTM0Myw3ICsxMzQzLDcgQEAKIAkJVFhfUEFfQ0ZHX0lHTk9SRV9MMl9FUlI7CiAJd3JpdGVxKHZhbDY0LCAmYmFyMC0+dHhfcGFfY2ZnKTsKIAotCS8qIFJ4IERNQSBpbnRpYWxpemF0aW9uLiAqLworCS8qIFJ4IERNQSBpbml0aWFsaXphdGlvbi4gKi8KIAl2YWw2NCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IGNvbmZpZy0+cnhfcmluZ19udW07IGkrKykgewogCQlzdHJ1Y3QgcnhfcmluZ19jb25maWcgKnJ4X2NmZyA9ICZjb25maWctPnJ4X2NmZ1tpXTsKQEAgLTI1MjAsNyArMjUyMCw3IEBACiAJCQlEQkdfUFJJTlQoSU5GT19EQkcsICIlczogQ291bGQgbm90IGFsbG9jYXRlIHNrYlxuIiwKIAkJCQkgIHJpbmctPmRldi0+bmFtZSk7CiAJCQlpZiAoZmlyc3RfcnhkcCkgewotCQkJCXdtYigpOworCQkJCWRtYV93bWIoKTsKIAkJCQlmaXJzdF9yeGRwLT5Db250cm9sXzEgfD0gUlhEX09XTl9YRU5BOwogCQkJfQogCQkJc3dzdGF0cy0+bWVtX2FsbG9jX2ZhaWxfY250Kys7CkBAIC0yNjM0LDcgKzI2MzQsNyBAQAogCQlyeGRwLT5Db250cm9sXzIgfD0gU0VUX1JYRF9NQVJLRVI7CiAJCWlmICghKGFsbG9jX3RhYiAmICgoMSA8PCByeHN5bmNfZnJlcXVlbmN5KSAtIDEpKSkgewogCQkJaWYgKGZpcnN0X3J4ZHApIHsKLQkJCQl3bWIoKTsKKwkJCQlkbWFfd21iKCk7CiAJCQkJZmlyc3RfcnhkcC0+Q29udHJvbF8xIHw9IFJYRF9PV05fWEVOQTsKIAkJCX0KIAkJCWZpcnN0X3J4ZHAgPSByeGRwOwpAQCAtMjY0OSw3ICsyNjQ5LDcgQEAKIAkgKiBhbmQgb3RoZXIgZmllbGRzIGFyZSBzZWVuIGJ5IGFkYXB0ZXIgY29ycmVjdGx5LgogCSAqLwogCWlmIChmaXJzdF9yeGRwKSB7Ci0JCXdtYigpOworCQlkbWFfd21iKCk7CiAJCWZpcnN0X3J4ZHAtPkNvbnRyb2xfMSB8PSBSWERfT1dOX1hFTkE7CiAJfQogCkBAIC02OTUwLDcgKzY5NTAsNyBAQAogCQkJCX0KIAogCQkJCXNldF9yeGRfYnVmZmVyX3NpemUoc3AsIHJ4ZHAsIHNpemUpOwotCQkJCXdtYigpOworCQkJCWRtYV93bWIoKTsKIAkJCQkvKiBmbGlwIHRoZSBPd25lcnNoaXAgYml0IHRvIEhhcmR3YXJlICovCiAJCQkJcnhkcC0+Q29udHJvbF8xIHw9IFJYRF9PV05fWEVOQTsKIAkJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi92eGdlL3Z4Z2UtZXRodG9vbC5jCmluZGV4IGIwN2Q1NTIuLmJlOTE2ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vdnhnZS92eGdlLWV0aHRvb2wuYwpAQCAtMTgsNiArMTgsMjUgQEAKIAogI2luY2x1ZGUgInZ4Z2UtZXRodG9vbC5oIgogCitzdGF0aWMgY29uc3QgY2hhciBldGh0b29sX2RyaXZlcl9zdGF0c19rZXlzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwl7IlxuIERSSVZFUiBTVEFUSVNUSUNTIn0sCisJeyJ2cGF0aHNfb3BlbmVkIn0sCisJeyJ2cGF0aF9vcGVuX2ZhaWxfY250In0sCisJeyJsaW5rX3VwX2NudCJ9LAorCXsibGlua19kb3duX2NudCJ9LAorCXsidHhfZnJtcyJ9LAorCXsidHhfZXJyb3JzIn0sCisJeyJ0eF9ieXRlcyJ9LAorCXsidHhkX25vdF9mcmVlIn0sCisJeyJ0eGRfb3V0X29mX2Rlc2MifSwKKwl7InJ4X2ZybXMifSwKKwl7InJ4X2Vycm9ycyJ9LAorCXsicnhfYnl0ZXMifSwKKwl7InJ4X21jYXN0In0sCisJeyJwY2lfbWFwX2ZhaWxfY250In0sCisJeyJza2JfYWxsb2NfZmFpbF9jbnQifQorfTsKKwogLyoqCiAgKiB2eGdlX2V0aHRvb2xfc3NldCAtIFNldHMgZGlmZmVyZW50IGxpbmsgcGFyYW1ldGVycy4KICAqIEBkZXY6IGRldmljZSBwb2ludGVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vdnhnZS92eGdlLWV0aHRvb2wuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1ldGh0b29sLmgKaW5kZXggNmNmMzA0NC4uMDY1YTJjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vdnhnZS92eGdlLWV0aHRvb2wuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi92eGdlL3Z4Z2UtZXRodG9vbC5oCkBAIC0xOSwyNSArMTksNiBAQAogLyogRXRodG9vbCByZWxhdGVkIHZhcmlhYmxlcyBhbmQgTWFjcm9zLiAqLwogc3RhdGljIGludCB2eGdlX2V0aHRvb2xfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNzZXQpOwogCi1zdGF0aWMgY2hhciBldGh0b29sX2RyaXZlcl9zdGF0c19rZXlzW11bRVRIX0dTVFJJTkdfTEVOXSA9IHsKLQl7IlxuIERSSVZFUiBTVEFUSVNUSUNTIn0sCi0JeyJ2cGF0aHNfb3BlbmVkIn0sCi0JeyJ2cGF0aF9vcGVuX2ZhaWxfY250In0sCi0JeyJsaW5rX3VwX2NudCJ9LAotCXsibGlua19kb3duX2NudCJ9LAotCXsidHhfZnJtcyJ9LAotCXsidHhfZXJyb3JzIn0sCi0JeyJ0eF9ieXRlcyJ9LAotCXsidHhkX25vdF9mcmVlIn0sCi0JeyJ0eGRfb3V0X29mX2Rlc2MifSwKLQl7InJ4X2ZybXMifSwKLQl7InJ4X2Vycm9ycyJ9LAotCXsicnhfYnl0ZXMifSwKLQl7InJ4X21jYXN0In0sCi0JeyJwY2lfbWFwX2ZhaWxfY250In0sCi0JeyJza2JfYWxsb2NfZmFpbF9jbnQifQotfTsKLQogI2RlZmluZSBWWEdFX1RJVExFX0xFTgkJCTUKICNkZWZpbmUgVlhHRV9IV19WUEFUSF9TVEFUU19MRU4gCTI3CiAjZGVmaW5lIFZYR0VfSFdfQUdHUl9TVEFUU19MRU4gIAkxMwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2N0ZW9uL29jdGVvbl9tZ210LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9vY3Rlb24vb2N0ZW9uX21nbXQuYwppbmRleCBkMzY1OTlmLi43YmY5YzAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9vY3Rlb24vb2N0ZW9uX21nbXQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9vY3Rlb24vb2N0ZW9uX21nbXQuYwpAQCAtMTU1Nyw3ICsxNTU3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgb2N0ZW9uX21nbXRfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9jdGVvbl9tZ210X21hdGNoW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJjYXZpdW0sb2N0ZW9uLTU3NTAtbWl4IiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2tpLXNlbWkvcGNoX2diZS9wY2hfZ2JlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvcGNoX2diZV9ldGh0b29sLmMKaW5kZXggNGZlOGVhOS4uZjZmY2Y3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2tpLXNlbWkvcGNoX2diZS9wY2hfZ2JlX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfZXRodG9vbC5jCkBAIC0zOTQsNyArMzk0LDcgQEAKIH0KIAogLyoqCi0gKiBwY2hfZ2JlX3NldF9wYXVzZXBhcmFtIC0gU2V0IHBhdXNlIHBhcmFtdGVycworICogcGNoX2diZV9zZXRfcGF1c2VwYXJhbSAtIFNldCBwYXVzZSBwYXJhbWV0ZXJzCiAgKiBAbmV0ZGV2OiAgTmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQogICogQHBhdXNlOiAgIFBhdXNlIHBhcmFtZXRlcnMgc3RydWN0dXJlCiAgKiBSZXR1cm5zOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcGFja2V0ZW5naW5lcy9oYW1hY2hpLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9wYWNrZXRlbmdpbmVzL2hhbWFjaGkuYwppbmRleCAzMTlkOWQ0Li4xM2Q4OGE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9wYWNrZXRlbmdpbmVzL2hhbWFjaGkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9wYWNrZXRlbmdpbmVzL2hhbWFjaGkuYwpAQCAtMzUwLDcgKzM1MCw3IEBACiAgICAgaW5jb3JyZWN0bHkgZGVmaW5lZCBhbmQgY29ycmVjdGVkIChhcyBwZXIgTWljaGVsIE11ZWxsZXIpLgogCiAwMi8yMy8xOTk5IEVQSyBDb3JyZWN0ZWQgdGhlIFR4IGZ1bGwgY2hlY2sgdG8gY2hlY2sgdGhhdCBhdCBsZWFzdCA0IHNsb3RzCi0gICAgd2VyZSBhdmFpbGFibGUgYmVmb3JlIHJlc2V0aW5nIHRoZSB0YnVzeSBhbmQgdHhfZnVsbCBmbGFncworICAgIHdlcmUgYXZhaWxhYmxlIGJlZm9yZSByZXNldHRpbmcgdGhlIHRidXN5IGFuZCB0eF9mdWxsIGZsYWdzCiAgICAgKGFzIHBlciBNaWNoZWwgTXVlbGxlcikuCiAKIDAzLzExLzE5OTkgRVBLIEFkZGVkIFBldGUgV3lja29mZidzIGhhcmR3YXJlIGNoZWNrc3VtbWluZyBzdXBwb3J0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL25ldHhlbi9uZXR4ZW5fbmljX2h3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvbmV0eGVuL25ldHhlbl9uaWNfaHcuYwppbmRleCA3MTZmYzM3Li5kYjgwZWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvbmV0eGVuL25ldHhlbl9uaWNfaHcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvbmV0eGVuL25ldHhlbl9uaWNfaHcuYwpAQCAtNTM3LDcgKzUzNyw3IEBACiAJdTggbnVsbF9hZGRyW0VUSF9BTEVOXTsKIAlpbnQgaTsKIAotCW1lbXNldChudWxsX2FkZHIsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKG51bGxfYWRkcik7CiAKIAlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljXzgzeHhfaHcuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljXzgzeHhfaHcuaAppbmRleCBmMzM0NmEzLi42OWY4MjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY184M3h4X2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfODN4eF9ody5oCkBAIC0yMDUsNyArMjA1LDcgQEAKICAqIEBwaHlzX2FkZHJfe2xvd3xoaWdofTogRE1BIGFkZHJlc3Mgb2YgdGhlIHRyYW5zbWl0IGJ1ZmZlcgogICogQGNuc21yX2luZGV4X3tsb3d8aGlnaH06IGhvc3QgY29uc3VtZXIgaW5kZXgKICAqIEBzaXplOiBsZWd0aCBvZiB0cmFuc21pdCBidWZmZXIgcmluZwotICogQGludHJfaWQ6IGludGVycnB1dCBpZAorICogQGludHJfaWQ6IGludGVycnVwdCBpZAogICogQHNyYzogc3JjIG9mIGludGVycnVwdAogICovCiBzdHJ1Y3QgcWxjbmljX3R4X21ieCB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY184M3h4X2luaXQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljXzgzeHhfaW5pdC5jCmluZGV4IDJiYjQ4ZDUuLjMzNjY5YzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljXzgzeHhfaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljXzgzeHhfaW5pdC5jCkBAIC0yNjksNyArMjY5LDcgQEAKIAl9CiAKIAlRTENXUlgoYWRhcHRlci0+YWh3LCBRTENfODNYWF9JRENfRFJWX0FDSywgMCk7Ci0JLyogQ2xlYXIgZ3JhY2VmdWxsIHJlc2V0IGJpdCAqLworCS8qIENsZWFyIGdyYWNlZnVsIHJlc2V0IGJpdCAqLwogCXZhbCA9IFFMQ1JEWChhZGFwdGVyLT5haHcsIFFMQ184M1hYX0lEQ19DVFJMKTsKIAl2YWwgJj0gflFMQ184M1hYX0lEQ19HUkFDRUZVTExfUkVTRVQ7CiAJUUxDV1JYKGFkYXB0ZXItPmFodywgUUxDXzgzWFhfSURDX0NUUkwsIHZhbCk7CkBAIC04ODksNyArODg5LDcgQEAKICAqIEBhZGFwdGVyOiBhZGFwdGVyIHN0cnVjdHVyZQogICoKICAqIERldmljZSB3aWxsIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsOgotICoJUmVzZXQgcmVxdWVzdCBBQ0sncyBhcmUgcmVjaWV2ZWQgZnJvbSBhbGwgdGhlIGZ1bmN0aW9ucworICoJUmVzZXQgcmVxdWVzdCBBQ0sncyBhcmUgcmVjZWl2ZWQgZnJvbSBhbGwgdGhlIGZ1bmN0aW9ucwogICoJV2FpdCB0aW1lIGV4Y2VlZHMgbWF4IHRpbWUgbGltaXQKICAqCiAgKiBSZXR1cm5zOiBFcnJvciBjb2RlIG9yIFN1Y2Nlc3MoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2h3LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19ody5jCmluZGV4IDNlMGY3MDUuLjc1ZWU5ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2h3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfaHcuYwpAQCAtODE4LDcgKzgxOCw3IEBACiAKIAlpZiAocnYpCiAJCW5ldGRldl9lcnIoYWRhcHRlci0+bmV0ZGV2LAotCQkJICAgIkZhaWxlZCB0byBzZXQgUnggY29hbGVzY2luZyBwYXJhbWV0cnNcbiIpOworCQkJICAgIkZhaWxlZCB0byBzZXQgUnggY29hbGVzY2luZyBwYXJhbWV0ZXJzXG4iKTsKIAogCXJldHVybiBydjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21haW4uYwppbmRleCBhNDMwYTM0YS4uMzY3ZjM5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21haW4uYwpAQCAtNTA3LDYgKzUwNyw3IEBACiAJCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkgICAgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CisJZmVhdHVyZXMgPSB2bGFuX2ZlYXR1cmVzX2NoZWNrKHNrYiwgZmVhdHVyZXMpOwogCXJldHVybiB2eGxhbl9mZWF0dXJlc19jaGVjayhza2IsIGZlYXR1cmVzKTsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsZ2UvcWxnZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxnZS9xbGdlX21haW4uYwppbmRleCA4MDExZWYzLi4yNTgwMGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxnZS9xbGdlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxnZS9xbGdlX21haW4uYwpAQCAtNDYwLDcgKzQ2MCw3IEBACiAJCW5ldGlmX3ByaW50ayhxZGV2LCBpZnVwLCBLRVJOX0RFQlVHLCBxZGV2LT5uZGV2LAogCQkJICAgICAiU2V0IE1hYyBhZGRyICVwTVxuIiwgYWRkcik7CiAJfSBlbHNlIHsKLQkJbWVtc2V0KHplcm9fbWFjX2FkZHIsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcih6ZXJvX21hY19hZGRyKTsKIAkJYWRkciA9ICZ6ZXJvX21hY19hZGRyWzBdOwogCQluZXRpZl9wcmludGsocWRldiwgaWZ1cCwgS0VSTl9ERUJVRywgcWRldi0+bmRldiwKIAkJCSAgICAgIkNsZWFyaW5nIE1BQyBhZGRyZXNzXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL3FjYV9zcGkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3F1YWxjb21tL3FjYV9zcGkuYwppbmRleCAyYzgxMWY2Li40YTQyZTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xdWFsY29tbS9xY2Ffc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcXVhbGNvbW0vcWNhX3NwaS5jCkBAIC01NzEsNyArNTcxLDcgQEAKIAkJCX0KIAogCQkJLyogY2FuIG9ubHkgaGFuZGxlIG90aGVyIGludGVycnVwdHMKLQkJCSAqIGlmIHN5bmMgaGFzIG9jY3VyZWQKKwkJCSAqIGlmIHN5bmMgaGFzIG9jY3VycmVkCiAJCQkgKi8KIAkJCWlmIChxY2EtPnN5bmMgPT0gUUNBU1BJX1NZTkNfUkVBRFkpIHsKIAkJCQlpZiAoaW50cl9jYXVzZSAmIFNQSV9JTlRfUEtUX0FWTEJMKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmMKaW5kZXggNzM2ZDVkMS4uN2ZiMjQ0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5jCkBAIC01Miw3ICs1MiwxMiBAQAogCQlORVRJRl9NU0dfUlhfRVJSfCBcCiAJCU5FVElGX01TR19UWF9FUlIpCiAKKyNkZWZpbmUgU0hfRVRIX09GRlNFVF9ERUZBVUxUUwkJCVwKKwlbMCAuLi4gU0hfRVRIX01BWF9SRUdJU1RFUl9PRkZTRVQgLSAxXSA9IFNIX0VUSF9PRkZTRVRfSU5WQUxJRAorCiBzdGF0aWMgY29uc3QgdTE2IHNoX2V0aF9vZmZzZXRfZ2lnYWJpdFtTSF9FVEhfTUFYX1JFR0lTVEVSX09GRlNFVF0gPSB7CisJU0hfRVRIX09GRlNFVF9ERUZBVUxUUywKKwogCVtFRFNSXQkJPSAweDAwMDAsCiAJW0VETVJdCQk9IDB4MDQwMCwKIAlbRURUUlJdCQk9IDB4MDQwOCwKQEAgLTEzMiw5ICsxMzcsNiBAQAogCVtUU1VfUE9TVDNdCT0gMHgwMDc4LAogCVtUU1VfUE9TVDRdCT0gMHgwMDdjLAogCVtUU1VfQURSSDBdCT0gMHgwMTAwLAotCVtUU1VfQURSTDBdCT0gMHgwMTA0LAotCVtUU1VfQURSSDMxXQk9IDB4MDFmOCwKLQlbVFNVX0FEUkwzMV0JPSAweDAxZmMsCiAKIAlbVFhOTENSMF0JPSAweDAwODAsCiAJW1RYQUxDUjBdCT0gMHgwMDg0LApAQCAtMTUxLDYgKzE1Myw4IEBACiB9OwogCiBzdGF0aWMgY29uc3QgdTE2IHNoX2V0aF9vZmZzZXRfZmFzdF9yeltTSF9FVEhfTUFYX1JFR0lTVEVSX09GRlNFVF0gPSB7CisJU0hfRVRIX09GRlNFVF9ERUZBVUxUUywKKwogCVtFRFNSXQkJPSAweDAwMDAsCiAJW0VETVJdCQk9IDB4MDQwMCwKIAlbRURUUlJdCQk9IDB4MDQwOCwKQEAgLTE5OSw5ICsyMDMsNiBAQAogCVtUU1VfQURTQlNZXQk9IDB4MDA2MCwKIAlbVFNVX1RFTl0JPSAweDAwNjQsCiAJW1RTVV9BRFJIMF0JPSAweDAxMDAsCi0JW1RTVV9BRFJMMF0JPSAweDAxMDQsCi0JW1RTVV9BRFJIMzFdCT0gMHgwMWY4LAotCVtUU1VfQURSTDMxXQk9IDB4MDFmYywKIAogCVtUWE5MQ1IwXQk9IDB4MDA4MCwKIAlbVFhBTENSMF0JPSAweDAwODQsCkBAIC0yMTAsNiArMjExLDggQEAKIH07CiAKIHN0YXRpYyBjb25zdCB1MTYgc2hfZXRoX29mZnNldF9mYXN0X3JjYXJbU0hfRVRIX01BWF9SRUdJU1RFUl9PRkZTRVRdID0geworCVNIX0VUSF9PRkZTRVRfREVGQVVMVFMsCisKIAlbRUNNUl0JCT0gMHgwMzAwLAogCVtSRkxSXQkJPSAweDAzMDgsCiAJW0VDU1JdCQk9IDB4MDMxMCwKQEAgLTI1Niw2ICsyNTksOCBAQAogfTsKIAogc3RhdGljIGNvbnN0IHUxNiBzaF9ldGhfb2Zmc2V0X2Zhc3Rfc2g0W1NIX0VUSF9NQVhfUkVHSVNURVJfT0ZGU0VUXSA9IHsKKwlTSF9FVEhfT0ZGU0VUX0RFRkFVTFRTLAorCiAJW0VDTVJdCQk9IDB4MDEwMCwKIAlbUkZMUl0JCT0gMHgwMTA4LAogCVtFQ1NSXQkJPSAweDAxMTAsCkBAIC0zMDgsNiArMzEzLDggQEAKIH07CiAKIHN0YXRpYyBjb25zdCB1MTYgc2hfZXRoX29mZnNldF9mYXN0X3NoM19zaDJbU0hfRVRIX01BWF9SRUdJU1RFUl9PRkZTRVRdID0geworCVNIX0VUSF9PRkZTRVRfREVGQVVMVFMsCisKIAlbRURNUl0JCT0gMHgwMDAwLAogCVtFRFRSUl0JCT0gMHgwMDA0LAogCVtFRFJSUl0JCT0gMHgwMDA4LApAQCAtMzkyLDggKzM5OSw2IEBACiAJW0ZXQUxDUjFdCT0gMHgwMGI0LAogCiAJW1RTVV9BRFJIMF0JPSAweDAxMDAsCi0JW1RTVV9BRFJMMF0JPSAweDAxMDQsCi0JW1RTVV9BRFJMMzFdCT0gMHgwMWZjLAogfTsKIAogc3RhdGljIHZvaWQgc2hfZXRoX3Jjdl9zbmRfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldik7CkBAIC01ODgsNiArNTkzLDcgQEAKIAkubm9fYWRlCQk9IDEsCiAJLnJwYWRpcgkJPSAxLAogCS5ycGFkaXJfdmFsdWUgICA9IDIgPDwgMTYsCisJLnJ0cmF0ZQkJPSAxLAogfTsKIAogI2RlZmluZSBTSF9HSUdBX0VUSF9CQVNFCTB4ZmVlMDAwMDBVTApAQCAtMTQxMSw2ICsxNDE3LDkgQEAKIAkJCWJyZWFrOwogCQkvKiBUQUNUIGJpdCBtdXN0IGJlIGNoZWNrZWQgYmVmb3JlIGFsbCB0aGUgZm9sbG93aW5nIHJlYWRzICovCiAJCXJtYigpOworCQluZXRpZl9pbmZvKG1kcCwgdHhfZG9uZSwgbmRldiwKKwkJCSAgICJ0eCBlbnRyeSAlZCBzdGF0dXMgMHglMDh4XG4iLAorCQkJICAgZW50cnksIGVkbWFjX3RvX2NwdShtZHAsIHR4ZGVzYy0+c3RhdHVzKSk7CiAJCS8qIEZyZWUgdGhlIG9yaWdpbmFsIHNrYi4gKi8KIAkJaWYgKG1kcC0+dHhfc2tidWZmW2VudHJ5XSkgewogCQkJZG1hX3VubWFwX3NpbmdsZSgmbmRldi0+ZGV2LCB0eGRlc2MtPmFkZHIsCkBAIC0xNDU2LDYgKzE0NjUsMTAgQEAKIAkJaWYgKC0tYm9ndXNjbnQgPCAwKQogCQkJYnJlYWs7CiAKKwkJbmV0aWZfaW5mbyhtZHAsIHJ4X3N0YXR1cywgbmRldiwKKwkJCSAgICJyeCBlbnRyeSAlZCBzdGF0dXMgMHglMDh4IGxlbiAlZFxuIiwKKwkJCSAgIGVudHJ5LCBkZXNjX3N0YXR1cywgcGt0X2xlbik7CisKIAkJaWYgKCEoZGVzY19zdGF0dXMgJiBSREZFTkQpKQogCQkJbmRldi0+c3RhdHMucnhfbGVuZ3RoX2Vycm9ycysrOwogCkBAIC0xNTAwLDYgKzE1MTMsOCBAQAogCQkJbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIAkJCW5kZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKIAkJCW5kZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHBrdF9sZW47CisJCQlpZiAoZGVzY19zdGF0dXMgJiBSRF9SRlM4KQorCQkJCW5kZXYtPnN0YXRzLm11bHRpY2FzdCsrOwogCQl9CiAJCWVudHJ5ID0gKCsrbWRwLT5jdXJfcngpICUgbWRwLT5udW1fcnhfcmluZzsKIAkJcnhkZXNjID0gJm1kcC0+cnhfcmluZ1tlbnRyeV07CkBAIC0xNTQyLDcgKzE1NTcsOCBAQAogCS8qIElmIHdlIGRvbid0IG5lZWQgdG8gY2hlY2sgc3RhdHVzLCBkb24ndC4gLUtEVSAqLwogCWlmICghKHNoX2V0aF9yZWFkKG5kZXYsIEVEUlJSKSAmIEVEUlJSX1IpKSB7CiAJCS8qIGZpeCB0aGUgdmFsdWVzIGZvciB0aGUgbmV4dCByZWNlaXZpbmcgaWYgUkRFIGlzIHNldCAqLwotCQlpZiAoaW50cl9zdGF0dXMgJiBFRVNSX1JERSAmJiBtZHAtPnJlZ19vZmZzZXRbUkRGQVJdICE9IDApIHsKKwkJaWYgKGludHJfc3RhdHVzICYgRUVTUl9SREUgJiYKKwkJICAgIG1kcC0+cmVnX29mZnNldFtSREZBUl0gIT0gU0hfRVRIX09GRlNFVF9JTlZBTElEKSB7CiAJCQl1MzIgY291bnQgPSAoc2hfZXRoX3JlYWQobmRldiwgUkRGQVIpIC0KIAkJCQkgICAgIHNoX2V0aF9yZWFkKG5kZXYsIFJETEFSKSkgPj4gNDsKIApAQCAtMTkyOSw2ICsxOTQ1LDE5MiBAQAogCXJldHVybiByZXQ7CiB9CiAKKy8qIElmIGl0IGlzIGV2ZXIgbmVjZXNzYXJ5IHRvIGluY3JlYXNlIFNIX0VUSF9SRUdfRFVNUF9NQVhfUkVHUywgdGhlCisgKiB2ZXJzaW9uIG11c3QgYmUgYnVtcGVkIGFzIHdlbGwuICBKdXN0IGFkZGluZyByZWdpc3RlcnMgdXAgdG8gdGhhdAorICogbGltaXQgaXMgZmluZSwgYXMgbG9uZyBhcyB0aGUgZXhpc3RpbmcgcmVnaXN0ZXIgaW5kaWNlcyBkb24ndAorICogY2hhbmdlLgorICovCisjZGVmaW5lIFNIX0VUSF9SRUdfRFVNUF9WRVJTSU9OCQkxCisjZGVmaW5lIFNIX0VUSF9SRUdfRFVNUF9NQVhfUkVHUwkyNTYKKworc3RhdGljIHNpemVfdCBfX3NoX2V0aF9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyICpidWYpCit7CisJc3RydWN0IHNoX2V0aF9wcml2YXRlICptZHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3Qgc2hfZXRoX2NwdV9kYXRhICpjZCA9IG1kcC0+Y2Q7CisJdTMyICp2YWxpZF9tYXA7CisJc2l6ZV90IGxlbjsKKworCUJVSUxEX0JVR19PTihTSF9FVEhfTUFYX1JFR0lTVEVSX09GRlNFVCA+IFNIX0VUSF9SRUdfRFVNUF9NQVhfUkVHUyk7CisKKwkvKiBEdW1wIHN0YXJ0cyB3aXRoIGEgYml0bWFwIHRoYXQgdGVsbHMgZXRodG9vbCB3aGljaAorCSAqIHJlZ2lzdGVycyBhcmUgZGVmaW5lZCBmb3IgdGhpcyBjaGlwLgorCSAqLworCWxlbiA9IERJVl9ST1VORF9VUChTSF9FVEhfUkVHX0RVTVBfTUFYX1JFR1MsIDMyKTsKKwlpZiAoYnVmKSB7CisJCXZhbGlkX21hcCA9IGJ1ZjsKKwkJYnVmICs9IGxlbjsKKwl9IGVsc2UgeworCQl2YWxpZF9tYXAgPSBOVUxMOworCX0KKworCS8qIEFkZCBhIHJlZ2lzdGVyIHRvIHRoZSBkdW1wLCBpZiBpdCBoYXMgYSBkZWZpbmVkIG9mZnNldC4KKwkgKiBUaGlzIGF1dG9tYXRpY2FsbHkgc2tpcHMgbW9zdCB1bmRlZmluZWQgcmVnaXN0ZXJzLCBidXQgZm9yCisJICogc29tZSBpdCBpcyBhbHNvIG5lY2Vzc2FyeSB0byBjaGVjayBhIGNhcGFiaWxpdHkgZmxhZyBpbgorCSAqIHN0cnVjdCBzaF9ldGhfY3B1X2RhdGEuCisJICovCisjZGVmaW5lIG1hcmtfcmVnX3ZhbGlkKHJlZykgdmFsaWRfbWFwW3JlZyAvIDMyXSB8PSAxVSA8PCAocmVnICUgMzIpCisjZGVmaW5lIGFkZF9yZWdfZnJvbShyZWcsIHJlYWRfZXhwcikgZG8gewkJCQlcCisJCWlmIChtZHAtPnJlZ19vZmZzZXRbcmVnXSAhPSBTSF9FVEhfT0ZGU0VUX0lOVkFMSUQpIHsJXAorCQkJaWYgKGJ1ZikgewkJCQkJXAorCQkJCW1hcmtfcmVnX3ZhbGlkKHJlZyk7CQkJXAorCQkJCSpidWYrKyA9IHJlYWRfZXhwcjsJCQlcCisJCQl9CQkJCQkJXAorCQkJKytsZW47CQkJCQkJXAorCQl9CQkJCQkJCVwKKwl9IHdoaWxlICgwKQorI2RlZmluZSBhZGRfcmVnKHJlZykgYWRkX3JlZ19mcm9tKHJlZywgc2hfZXRoX3JlYWQobmRldiwgcmVnKSkKKyNkZWZpbmUgYWRkX3RzdV9yZWcocmVnKSBhZGRfcmVnX2Zyb20ocmVnLCBzaF9ldGhfdHN1X3JlYWQobWRwLCByZWcpKQorCisJYWRkX3JlZyhFRFNSKTsKKwlhZGRfcmVnKEVETVIpOworCWFkZF9yZWcoRURUUlIpOworCWFkZF9yZWcoRURSUlIpOworCWFkZF9yZWcoRUVTUik7CisJYWRkX3JlZyhFRVNJUFIpOworCWFkZF9yZWcoVERMQVIpOworCWFkZF9yZWcoVERGQVIpOworCWFkZF9yZWcoVERGWFIpOworCWFkZF9yZWcoVERGRlIpOworCWFkZF9yZWcoUkRMQVIpOworCWFkZF9yZWcoUkRGQVIpOworCWFkZF9yZWcoUkRGWFIpOworCWFkZF9yZWcoUkRGRlIpOworCWFkZF9yZWcoVFJTQ0VSKTsKKwlhZGRfcmVnKFJNRkNSKTsKKwlhZGRfcmVnKFRGVFIpOworCWFkZF9yZWcoRkRSKTsKKwlhZGRfcmVnKFJNQ1IpOworCWFkZF9yZWcoVEZVQ1IpOworCWFkZF9yZWcoUkZPQ1IpOworCWlmIChjZC0+cm1paW1vZGUpCisJCWFkZF9yZWcoUk1JSU1PREUpOworCWFkZF9yZWcoRkNGVFIpOworCWlmIChjZC0+cnBhZGlyKQorCQlhZGRfcmVnKFJQQURJUik7CisJaWYgKCFjZC0+bm9fdHJpbWQpCisJCWFkZF9yZWcoVFJJTUQpOworCWFkZF9yZWcoRUNNUik7CisJYWRkX3JlZyhFQ1NSKTsKKwlhZGRfcmVnKEVDU0lQUik7CisJYWRkX3JlZyhQSVIpOworCWlmICghY2QtPm5vX3BzcikKKwkJYWRkX3JlZyhQU1IpOworCWFkZF9yZWcoUkRNTFIpOworCWFkZF9yZWcoUkZMUik7CisJYWRkX3JlZyhJUEdSKTsKKwlpZiAoY2QtPmFwcikKKwkJYWRkX3JlZyhBUFIpOworCWlmIChjZC0+bXByKQorCQlhZGRfcmVnKE1QUik7CisJYWRkX3JlZyhSRkNSKTsKKwlhZGRfcmVnKFJGQ0YpOworCWlmIChjZC0+dHBhdXNlcikKKwkJYWRkX3JlZyhUUEFVU0VSKTsKKwlhZGRfcmVnKFRQQVVTRUNSKTsKKwlhZGRfcmVnKEdFQ01SKTsKKwlpZiAoY2QtPmJjdWxyKQorCQlhZGRfcmVnKEJDVUxSKTsKKwlhZGRfcmVnKE1BSFIpOworCWFkZF9yZWcoTUFMUik7CisJYWRkX3JlZyhUUk9DUik7CisJYWRkX3JlZyhDRENSKTsKKwlhZGRfcmVnKExDQ1IpOworCWFkZF9yZWcoQ05EQ1IpOworCWFkZF9yZWcoQ0VGQ1IpOworCWFkZF9yZWcoRlJFQ1IpOworCWFkZF9yZWcoVFNGUkNSKTsKKwlhZGRfcmVnKFRMRlJDUik7CisJYWRkX3JlZyhDRVJDUik7CisJYWRkX3JlZyhDRUVDUik7CisJYWRkX3JlZyhNQUZDUik7CisJaWYgKGNkLT5ydHJhdGUpCisJCWFkZF9yZWcoUlRSQVRFKTsKKwlpZiAoY2QtPmh3X2NyYykKKwkJYWRkX3JlZyhDU01SKTsKKwlpZiAoY2QtPnNlbGVjdF9taWkpCisJCWFkZF9yZWcoUk1JSV9NSUkpOworCWFkZF9yZWcoQVJTVFIpOworCWlmIChjZC0+dHN1KSB7CisJCWFkZF90c3VfcmVnKFRTVV9DVFJTVCk7CisJCWFkZF90c3VfcmVnKFRTVV9GV0VOMCk7CisJCWFkZF90c3VfcmVnKFRTVV9GV0VOMSk7CisJCWFkZF90c3VfcmVnKFRTVV9GQ00pOworCQlhZGRfdHN1X3JlZyhUU1VfQlNZU0wwKTsKKwkJYWRkX3RzdV9yZWcoVFNVX0JTWVNMMSk7CisJCWFkZF90c3VfcmVnKFRTVV9QUklTTDApOworCQlhZGRfdHN1X3JlZyhUU1VfUFJJU0wxKTsKKwkJYWRkX3RzdV9yZWcoVFNVX0ZXU0wwKTsKKwkJYWRkX3RzdV9yZWcoVFNVX0ZXU0wxKTsKKwkJYWRkX3RzdV9yZWcoVFNVX0ZXU0xDKTsKKwkJYWRkX3RzdV9yZWcoVFNVX1FUQUcwKTsKKwkJYWRkX3RzdV9yZWcoVFNVX1FUQUcxKTsKKwkJYWRkX3RzdV9yZWcoVFNVX1FUQUdNMCk7CisJCWFkZF90c3VfcmVnKFRTVV9RVEFHTTEpOworCQlhZGRfdHN1X3JlZyhUU1VfRldTUik7CisJCWFkZF90c3VfcmVnKFRTVV9GV0lOTUspOworCQlhZGRfdHN1X3JlZyhUU1VfQURRVDApOworCQlhZGRfdHN1X3JlZyhUU1VfQURRVDEpOworCQlhZGRfdHN1X3JlZyhUU1VfVlRBRzApOworCQlhZGRfdHN1X3JlZyhUU1VfVlRBRzEpOworCQlhZGRfdHN1X3JlZyhUU1VfQURTQlNZKTsKKwkJYWRkX3RzdV9yZWcoVFNVX1RFTik7CisJCWFkZF90c3VfcmVnKFRTVV9QT1NUMSk7CisJCWFkZF90c3VfcmVnKFRTVV9QT1NUMik7CisJCWFkZF90c3VfcmVnKFRTVV9QT1NUMyk7CisJCWFkZF90c3VfcmVnKFRTVV9QT1NUNCk7CisJCWlmIChtZHAtPnJlZ19vZmZzZXRbVFNVX0FEUkgwXSAhPSBTSF9FVEhfT0ZGU0VUX0lOVkFMSUQpIHsKKwkJCS8qIFRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgdGFibGUsIG5vdCBqdXN0IGEgc2luZ2xlCisJCQkgKiByZWdpc3Rlci4KKwkJCSAqLworCQkJaWYgKGJ1ZikgeworCQkJCXVuc2lnbmVkIGludCBpOworCisJCQkJbWFya19yZWdfdmFsaWQoVFNVX0FEUkgwKTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgU0hfRVRIX1RTVV9DQU1fRU5UUklFUyAqIDI7IGkrKykKKwkJCQkJKmJ1ZisrID0gaW9yZWFkMzIoCisJCQkJCQltZHAtPnRzdV9hZGRyICsKKwkJCQkJCW1kcC0+cmVnX29mZnNldFtUU1VfQURSSDBdICsKKwkJCQkJCWkgKiA0KTsKKwkJCX0KKwkJCWxlbiArPSBTSF9FVEhfVFNVX0NBTV9FTlRSSUVTICogMjsKKwkJfQorCX0KKworI3VuZGVmIG1hcmtfcmVnX3ZhbGlkCisjdW5kZWYgYWRkX3JlZ19mcm9tCisjdW5kZWYgYWRkX3JlZworI3VuZGVmIGFkZF90c3VfcmVnCisKKwlyZXR1cm4gbGVuICogNDsKK30KKworc3RhdGljIGludCBzaF9ldGhfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQoreworCXJldHVybiBfX3NoX2V0aF9nZXRfcmVncyhuZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHZvaWQgc2hfZXRoX2dldF9yZWdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9yZWdzICpyZWdzLAorCQkJICAgIHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc2hfZXRoX3ByaXZhdGUgKm1kcCA9IG5ldGRldl9wcml2KG5kZXYpOworCisJcmVncy0+dmVyc2lvbiA9IFNIX0VUSF9SRUdfRFVNUF9WRVJTSU9OOworCisJcG1fcnVudGltZV9nZXRfc3luYygmbWRwLT5wZGV2LT5kZXYpOworCV9fc2hfZXRoX2dldF9yZWdzKG5kZXYsIGJ1Zik7CisJcG1fcnVudGltZV9wdXRfc3luYygmbWRwLT5wZGV2LT5kZXYpOworfQorCiBzdGF0aWMgaW50IHNoX2V0aF9ud2F5X3Jlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCXN0cnVjdCBzaF9ldGhfcHJpdmF0ZSAqbWRwID0gbmV0ZGV2X3ByaXYobmRldik7CkBAIC0yMDc0LDYgKzIyNzYsOCBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBzaF9ldGhfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncwk9IHNoX2V0aF9nZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncwk9IHNoX2V0aF9zZXRfc2V0dGluZ3MsCisJLmdldF9yZWdzX2xlbgk9IHNoX2V0aF9nZXRfcmVnc19sZW4sCisJLmdldF9yZWdzCT0gc2hfZXRoX2dldF9yZWdzLAogCS5ud2F5X3Jlc2V0CT0gc2hfZXRoX253YXlfcmVzZXQsCiAJLmdldF9tc2dsZXZlbAk9IHNoX2V0aF9nZXRfbXNnbGV2ZWwsCiAJLnNldF9tc2dsZXZlbAk9IHNoX2V0aF9zZXRfbXNnbGV2ZWwsCkBAIC0yMjEzLDYgKzI0MTcsMjIgQEAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCisvKiBUaGUgc3RhdGlzdGljcyByZWdpc3RlcnMgaGF2ZSB3cml0ZS1jbGVhciBiZWhhdmlvdXIsIHdoaWNoIG1lYW5zIHdlCisgKiB3aWxsIGxvc2UgYW55IGluY3JlbWVudCBiZXR3ZWVuIHRoZSByZWFkIGFuZCB3cml0ZS4gIFdlIG1pdGlnYXRlCisgKiB0aGlzIGJ5IG9ubHkgY2xlYXJpbmcgd2hlbiB3ZSByZWFkIGEgbm9uLXplcm8gdmFsdWUsIHNvIHdlIHdpbGwKKyAqIG5ldmVyIGZhbHNlbHkgcmVwb3J0IGEgdG90YWwgb2YgemVyby4KKyAqLworc3RhdGljIHZvaWQKK3NoX2V0aF91cGRhdGVfc3RhdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdW5zaWduZWQgbG9uZyAqc3RhdCwgaW50IHJlZykKK3sKKwl1MzIgZGVsdGEgPSBzaF9ldGhfcmVhZChuZGV2LCByZWcpOworCisJaWYgKGRlbHRhKSB7CisJCSpzdGF0ICs9IGRlbHRhOworCQlzaF9ldGhfd3JpdGUobmRldiwgMCwgcmVnKTsKKwl9Cit9CisKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc2hfZXRoX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKIAlzdHJ1Y3Qgc2hfZXRoX3ByaXZhdGUgKm1kcCA9IG5ldGRldl9wcml2KG5kZXYpOwpAQCAtMjIyMywyMSArMjQ0MywxOCBAQAogCWlmICghbWRwLT5pc19vcGVuZWQpCiAJCXJldHVybiAmbmRldi0+c3RhdHM7CiAKLQluZGV2LT5zdGF0cy50eF9kcm9wcGVkICs9IHNoX2V0aF9yZWFkKG5kZXYsIFRST0NSKTsKLQlzaF9ldGhfd3JpdGUobmRldiwgMCwgVFJPQ1IpOwkvKiAod3JpdGUgY2xlYXIpICovCi0JbmRldi0+c3RhdHMuY29sbGlzaW9ucyArPSBzaF9ldGhfcmVhZChuZGV2LCBDRENSKTsKLQlzaF9ldGhfd3JpdGUobmRldiwgMCwgQ0RDUik7CS8qICh3cml0ZSBjbGVhcikgKi8KLQluZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPSBzaF9ldGhfcmVhZChuZGV2LCBMQ0NSKTsKLQlzaF9ldGhfd3JpdGUobmRldiwgMCwgTENDUik7CS8qICh3cml0ZSBjbGVhcikgKi8KKwlzaF9ldGhfdXBkYXRlX3N0YXQobmRldiwgJm5kZXYtPnN0YXRzLnR4X2Ryb3BwZWQsIFRST0NSKTsKKwlzaF9ldGhfdXBkYXRlX3N0YXQobmRldiwgJm5kZXYtPnN0YXRzLmNvbGxpc2lvbnMsIENEQ1IpOworCXNoX2V0aF91cGRhdGVfc3RhdChuZGV2LCAmbmRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMsIExDQ1IpOwogCiAJaWYgKHNoX2V0aF9pc19nZXRoZXIobWRwKSkgewotCQluZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPSBzaF9ldGhfcmVhZChuZGV2LCBDRVJDUik7Ci0JCXNoX2V0aF93cml0ZShuZGV2LCAwLCBDRVJDUik7CS8qICh3cml0ZSBjbGVhcikgKi8KLQkJbmRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMgKz0gc2hfZXRoX3JlYWQobmRldiwgQ0VFQ1IpOwotCQlzaF9ldGhfd3JpdGUobmRldiwgMCwgQ0VFQ1IpOwkvKiAod3JpdGUgY2xlYXIpICovCisJCXNoX2V0aF91cGRhdGVfc3RhdChuZGV2LCAmbmRldi0+c3RhdHMudHhfY2Fycmllcl9lcnJvcnMsCisJCQkJICAgQ0VSQ1IpOworCQlzaF9ldGhfdXBkYXRlX3N0YXQobmRldiwgJm5kZXYtPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzLAorCQkJCSAgIENFRUNSKTsKIAl9IGVsc2UgewotCQluZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyArPSBzaF9ldGhfcmVhZChuZGV2LCBDTkRDUik7Ci0JCXNoX2V0aF93cml0ZShuZGV2LCAwLCBDTkRDUik7CS8qICh3cml0ZSBjbGVhcikgKi8KKwkJc2hfZXRoX3VwZGF0ZV9zdGF0KG5kZXYsICZuZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycywKKwkJCQkgICBDTkRDUik7CiAJfQogCiAJcmV0dXJuICZuZGV2LT5zdGF0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5oCmluZGV4IDI1OWQwM2YuLjA2ZGJiZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguaApAQCAtMzIsNiArMzIsMTAgQEAKICNkZWZpbmUgU0hfRVRIX1RTVV9DQU1fRU5UUklFUwkzMgogCiBlbnVtIHsKKwkvKiBJTVBPUlRBTlQ6IFRvIGtlZXAgZXRodG9vbCByZWdpc3RlciBkdW1wIHdvcmtpbmcsIGFkZCBuZXcKKwkgKiByZWdpc3RlciBuYW1lcyBpbW1lZGlhdGVseSBiZWZvcmUgU0hfRVRIX01BWF9SRUdJU1RFUl9PRkZTRVQuCisJICovCisKIAkvKiBFLURNQUMgcmVnaXN0ZXJzICovCiAJRURTUiA9IDAsCiAJRURNUiwKQEAgLTEzMSw5ICsxMzUsNyBAQAogCVRTVV9QT1NUMywKIAlUU1VfUE9TVDQsCiAJVFNVX0FEUkgwLAotCVRTVV9BRFJMMCwKLQlUU1VfQURSSDMxLAotCVRTVV9BRFJMMzEsCisJLyogVFNVX0FEUntILEx9ezAuLjMxfSBhcmUgYXNzdW1lZCB0byBiZSBjb250aWd1b3VzICovCiAKIAlUWE5MQ1IwLAogCVRYQUxDUjAsCkBAIC00OTEsNiArNDkzLDcgQEAKIAl1bnNpZ25lZCBzZWxlY3RfbWlpOjE7CS8qIEV0aGVyQyBoYXZlIFJNSUlfTUlJIChNSUkgc2VsZWN0IHJlZ2lzdGVyKSAqLwogCXVuc2lnbmVkIHNoaWZ0X3JkMDoxOwkvKiBzaGlmdCBSeCBkZXNjcmlwdG9yIHdvcmQgMCByaWdodCBieSAxNiAqLwogCXVuc2lnbmVkIHJtaWltb2RlOjE7CS8qIEV0aGVyQyBoYXMgUk1JSU1PREUgcmVnaXN0ZXIgKi8KKwl1bnNpZ25lZCBydHJhdGU6MTsJLyogRXRoZXJDIGhhcyBSVFJBVEUgcmVnaXN0ZXIgKi8KIH07CiAKIHN0cnVjdCBzaF9ldGhfcHJpdmF0ZSB7CkBAIC01NDMsMTkgKzU0NiwyOSBAQAogI2VuZGlmCiB9CiAKKyNkZWZpbmUgU0hfRVRIX09GRlNFVF9JTlZBTElECSgodTE2KSB+MCkKKwogc3RhdGljIGlubGluZSB2b2lkIHNoX2V0aF93cml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIGRhdGEsCiAJCQkJaW50IGVudW1faW5kZXgpCiB7CiAJc3RydWN0IHNoX2V0aF9wcml2YXRlICptZHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MTYgb2Zmc2V0ID0gbWRwLT5yZWdfb2Zmc2V0W2VudW1faW5kZXhdOwogCi0JaW93cml0ZTMyKGRhdGEsIG1kcC0+YWRkciArIG1kcC0+cmVnX29mZnNldFtlbnVtX2luZGV4XSk7CisJaWYgKFdBUk5fT04ob2Zmc2V0ID09IFNIX0VUSF9PRkZTRVRfSU5WQUxJRCkpCisJCXJldHVybjsKKworCWlvd3JpdGUzMihkYXRhLCBtZHAtPmFkZHIgKyBvZmZzZXQpOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBzaF9ldGhfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IGVudW1faW5kZXgpCiB7CiAJc3RydWN0IHNoX2V0aF9wcml2YXRlICptZHAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MTYgb2Zmc2V0ID0gbWRwLT5yZWdfb2Zmc2V0W2VudW1faW5kZXhdOwogCi0JcmV0dXJuIGlvcmVhZDMyKG1kcC0+YWRkciArIG1kcC0+cmVnX29mZnNldFtlbnVtX2luZGV4XSk7CisJaWYgKFdBUk5fT04ob2Zmc2V0ID09IFNIX0VUSF9PRkZTRVRfSU5WQUxJRCkpCisJCXJldHVybiB+MFU7CisKKwlyZXR1cm4gaW9yZWFkMzIobWRwLT5hZGRyICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkICpzaF9ldGhfdHN1X2dldF9vZmZzZXQoc3RydWN0IHNoX2V0aF9wcml2YXRlICptZHAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyLmMKaW5kZXggOWZiNjk0OC4uYTg3YjE3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXIuYwpAQCAtMzAsOCArMzAsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYnJpZGdlLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KICNpbmNsdWRlIDxuZXQvc3dpdGNoZGV2Lmg+CiAjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9pcF9maWIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZXZlbnQuaD4KKyNpbmNsdWRlIDxuZXQvYXJwLmg+CiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW8tNjQtbm9uYXRvbWljLWxvLWhpLmg+CiAjaW5jbHVkZSA8Z2VuZXJhdGVkL3V0c3JlbGVhc2UuaD4KIApAQCAtNDksMTIgKzUzLDEyIEBACiAJZW51bSByb2NrZXJfb2ZfZHBhX3RhYmxlX2lkIHRibF9pZDsKIAl1bmlvbiB7CiAJCXN0cnVjdCB7Ci0JCQl1MzIgaW5fbHBvcnQ7Ci0JCQl1MzIgaW5fbHBvcnRfbWFzazsKKwkJCXUzMiBpbl9wcG9ydDsKKwkJCXUzMiBpbl9wcG9ydF9tYXNrOwogCQkJZW51bSByb2NrZXJfb2ZfZHBhX3RhYmxlX2lkIGdvdG9fdGJsOwogCQl9IGlnX3BvcnQ7CiAJCXN0cnVjdCB7Ci0JCQl1MzIgaW5fbHBvcnQ7CisJCQl1MzIgaW5fcHBvcnQ7CiAJCQlfX2JlMTYgdmxhbl9pZDsKIAkJCV9fYmUxNiB2bGFuX2lkX21hc2s7CiAJCQllbnVtIHJvY2tlcl9vZl9kcGFfdGFibGVfaWQgZ290b190Ymw7CkBAIC02Miw4ICs2Niw4IEBACiAJCQlfX2JlMTYgbmV3X3ZsYW5faWQ7CiAJCX0gdmxhbjsKIAkJc3RydWN0IHsKLQkJCXUzMiBpbl9scG9ydDsKLQkJCXUzMiBpbl9scG9ydF9tYXNrOworCQkJdTMyIGluX3Bwb3J0OworCQkJdTMyIGluX3Bwb3J0X21hc2s7CiAJCQlfX2JlMTYgZXRoX3R5cGU7CiAJCQl1OCBldGhfZHN0W0VUSF9BTEVOXTsKIAkJCXU4IGV0aF9kc3RfbWFza1tFVEhfQUxFTl07CkBAIC05MSw4ICs5NSw4IEBACiAJCQlib29sIGNvcHlfdG9fY3B1OwogCQl9IGJyaWRnZTsKIAkJc3RydWN0IHsKLQkJCXUzMiBpbl9scG9ydDsKLQkJCXUzMiBpbl9scG9ydF9tYXNrOworCQkJdTMyIGluX3Bwb3J0OworCQkJdTMyIGluX3Bwb3J0X21hc2s7CiAJCQl1OCBldGhfc3JjW0VUSF9BTEVOXTsKIAkJCXU4IGV0aF9zcmNfbWFza1tFVEhfQUxFTl07CiAJCQl1OCBldGhfZHN0W0VUSF9BTEVOXTsKQEAgLTExMSw5ICsxMTUsMTAgQEAKIAogc3RydWN0IHJvY2tlcl9mbG93X3RibF9lbnRyeSB7CiAJc3RydWN0IGhsaXN0X25vZGUgZW50cnk7Ci0JdTMyIHJlZl9jb3VudDsKKwl1MzIgY21kOwogCXU2NCBjb29raWU7CiAJc3RydWN0IHJvY2tlcl9mbG93X3RibF9rZXkga2V5OworCXNpemVfdCBrZXlfbGVuOwogCXUzMiBrZXlfY3JjMzI7IC8qIGtleSAqLwogfTsKIApAQCAtMTQ4LDcgKzE1Myw3IEBACiAJdTMyIGtleV9jcmMzMjsgLyoga2V5ICovCiAJYm9vbCBsZWFybmVkOwogCXN0cnVjdCByb2NrZXJfZmRiX3RibF9rZXkgewotCQl1MzIgbHBvcnQ7CisJCXUzMiBwcG9ydDsKIAkJdTggYWRkcltFVEhfQUxFTl07CiAJCV9fYmUxNiB2bGFuX2lkOwogCX0ga2V5OwpAQCAtMTYxLDYgKzE2NiwxNiBAQAogCV9fYmUxNiB2bGFuX2lkOwogfTsKIAorc3RydWN0IHJvY2tlcl9uZWlnaF90YmxfZW50cnkgeworCXN0cnVjdCBobGlzdF9ub2RlIGVudHJ5OworCV9fYmUzMiBpcF9hZGRyOyAvKiBrZXkgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXUzMiByZWZfY291bnQ7CisJdTMyIGluZGV4OworCXU4IGV0aF9kc3RbRVRIX0FMRU5dOworCWJvb2wgdHRsX2NoZWNrOworfTsKKwogc3RydWN0IHJvY2tlcl9kZXNjX2luZm8gewogCWNoYXIgKmRhdGE7IC8qIG1hcHBlZCAqLwogCXNpemVfdCBkYXRhX3NpemU7CkBAIC0yMDAsNyArMjE1LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqYnJpZGdlX2RldjsKIAlzdHJ1Y3Qgcm9ja2VyICpyb2NrZXI7CiAJdW5zaWduZWQgaW50IHBvcnRfbnVtYmVyOwotCXUzMiBscG9ydDsKKwl1MzIgcHBvcnQ7CiAJX19iZTE2IGludGVybmFsX3ZsYW5faWQ7CiAJaW50IHN0cF9zdGF0ZTsKIAl1MzIgYnJwb3J0X2ZsYWdzOwpAQCAtMjM0LDYgKzI0OSw5IEBACiAJdW5zaWduZWQgbG9uZyBpbnRlcm5hbF92bGFuX2JpdG1hcFtST0NLRVJfSU5URVJOQUxfVkxBTl9CSVRNQVBfTEVOXTsKIAlERUNMQVJFX0hBU0hUQUJMRShpbnRlcm5hbF92bGFuX3RibCwgOCk7CiAJc3BpbmxvY2tfdCBpbnRlcm5hbF92bGFuX3RibF9sb2NrOworCURFQ0xBUkVfSEFTSFRBQkxFKG5laWdoX3RibCwgMTYpOworCXNwaW5sb2NrX3QgbmVpZ2hfdGJsX2xvY2s7CisJdTMyIG5laWdoX3RibF9uZXh0X2luZGV4OwogfTsKIAogc3RhdGljIGNvbnN0IHU4IHplcm9fbWFjW0VUSF9BTEVOXSAgID0geyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH07CkBAIC0yNTYsNyArMjc0LDYgQEAKIAlST0NLRVJfUFJJT1JJVFlfVkxBTiA9IDEsCiAJUk9DS0VSX1BSSU9SSVRZX1RFUk1fTUFDX1VDQVNUID0gMCwKIAlST0NLRVJfUFJJT1JJVFlfVEVSTV9NQUNfTUNBU1QgPSAxLAotCVJPQ0tFUl9QUklPUklUWV9VTklDQVNUX1JPVVRJTkcgPSAxLAogCVJPQ0tFUl9QUklPUklUWV9CUklER0lOR19WTEFOX0RGTFRfRVhBQ1QgPSAxLAogCVJPQ0tFUl9QUklPUklUWV9CUklER0lOR19WTEFOX0RGTFRfV0lMRCA9IDIsCiAJUk9DS0VSX1BSSU9SSVRZX0JSSURHSU5HX1ZMQU4gPSAzLApAQCAtNzg5LDcgKzgwNiwzMCBAQAogCiBzdGF0aWMgaW50IHJvY2tlcl9kZXNjX2VycihzdHJ1Y3Qgcm9ja2VyX2Rlc2NfaW5mbyAqZGVzY19pbmZvKQogewotCXJldHVybiAtKGRlc2NfaW5mby0+ZGVzYy0+Y29tcF9lcnIgJiB+Uk9DS0VSX0RNQV9ERVNDX0NPTVBfRVJSX0dFTik7CisJaW50IGVyciA9IGRlc2NfaW5mby0+ZGVzYy0+Y29tcF9lcnIgJiB+Uk9DS0VSX0RNQV9ERVNDX0NPTVBfRVJSX0dFTjsKKworCXN3aXRjaCAoZXJyKSB7CisJY2FzZSBST0NLRVJfT0s6CisJCXJldHVybiAwOworCWNhc2UgLVJPQ0tFUl9FTk9FTlQ6CisJCXJldHVybiAtRU5PRU5UOworCWNhc2UgLVJPQ0tFUl9FTlhJTzoKKwkJcmV0dXJuIC1FTlhJTzsKKwljYXNlIC1ST0NLRVJfRU5PTUVNOgorCQlyZXR1cm4gLUVOT01FTTsKKwljYXNlIC1ST0NLRVJfRUVYSVNUOgorCQlyZXR1cm4gLUVFWElTVDsKKwljYXNlIC1ST0NLRVJfRUlOVkFMOgorCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIC1ST0NLRVJfRU1TR1NJWkU6CisJCXJldHVybiAtRU1TR1NJWkU7CisJY2FzZSAtUk9DS0VSX0VOT1RTVVA6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwljYXNlIC1ST0NLRVJfRU5PQlVGUzoKKwkJcmV0dXJuIC1FTk9CVUZTOworCX0KKworCXJldHVybiAtRUlOVkFMOwogfQogCiBzdGF0aWMgdm9pZCByb2NrZXJfZGVzY19nZW5fY2xlYXIoc3RydWN0IHJvY2tlcl9kZXNjX2luZm8gKmRlc2NfaW5mbykKQEAgLTEyNTcsOSArMTI5Nyw5IEBACiAJdTY0IHZhbCA9IHJvY2tlcl9yZWFkNjQocm9ja2VyX3BvcnQtPnJvY2tlciwgUE9SVF9QSFlTX0VOQUJMRSk7CiAKIAlpZiAoZW5hYmxlKQotCQl2YWwgfD0gMVVMTCA8PCByb2NrZXJfcG9ydC0+bHBvcnQ7CisJCXZhbCB8PSAxVUxMIDw8IHJvY2tlcl9wb3J0LT5wcG9ydDsKIAllbHNlCi0JCXZhbCAmPSB+KDFVTEwgPDwgcm9ja2VyX3BvcnQtPmxwb3J0KTsKKwkJdmFsICY9IH4oMVVMTCA8PCByb2NrZXJfcG9ydC0+cHBvcnQpOwogCXJvY2tlcl93cml0ZTY0KHJvY2tlcl9wb3J0LT5yb2NrZXIsIFBPUlRfUEhZU19FTkFCTEUsIHZhbCk7CiB9CiAKQEAgLTEzMTIsMTEgKzEzNTIsMTEgQEAKIAlzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0OwogCiAJcm9ja2VyX3Rsdl9wYXJzZV9uZXN0ZWQoYXR0cnMsIFJPQ0tFUl9UTFZfRVZFTlRfTElOS19DSEFOR0VEX01BWCwgaW5mbyk7Ci0JaWYgKCFhdHRyc1tST0NLRVJfVExWX0VWRU5UX0xJTktfQ0hBTkdFRF9MUE9SVF0gfHwKKwlpZiAoIWF0dHJzW1JPQ0tFUl9UTFZfRVZFTlRfTElOS19DSEFOR0VEX1BQT1JUXSB8fAogCSAgICAhYXR0cnNbUk9DS0VSX1RMVl9FVkVOVF9MSU5LX0NIQU5HRURfTElOS1VQXSkKIAkJcmV0dXJuIC1FSU87CiAJcG9ydF9udW1iZXIgPQotCQlyb2NrZXJfdGx2X2dldF91MzIoYXR0cnNbUk9DS0VSX1RMVl9FVkVOVF9MSU5LX0NIQU5HRURfTFBPUlRdKSAtIDE7CisJCXJvY2tlcl90bHZfZ2V0X3UzMihhdHRyc1tST0NLRVJfVExWX0VWRU5UX0xJTktfQ0hBTkdFRF9QUE9SVF0pIC0gMTsKIAlsaW5rX3VwID0gcm9ja2VyX3Rsdl9nZXRfdTgoYXR0cnNbUk9DS0VSX1RMVl9FVkVOVF9MSU5LX0NIQU5HRURfTElOS1VQXSk7CiAKIAlpZiAocG9ydF9udW1iZXIgPj0gcm9ja2VyLT5wb3J0X2NvdW50KQpAQCAtMTM1MywxMiArMTM5MywxMiBAQAogCV9fYmUxNiB2bGFuX2lkOwogCiAJcm9ja2VyX3Rsdl9wYXJzZV9uZXN0ZWQoYXR0cnMsIFJPQ0tFUl9UTFZfRVZFTlRfTUFDX1ZMQU5fTUFYLCBpbmZvKTsKLQlpZiAoIWF0dHJzW1JPQ0tFUl9UTFZfRVZFTlRfTUFDX1ZMQU5fTFBPUlRdIHx8CisJaWYgKCFhdHRyc1tST0NLRVJfVExWX0VWRU5UX01BQ19WTEFOX1BQT1JUXSB8fAogCSAgICAhYXR0cnNbUk9DS0VSX1RMVl9FVkVOVF9NQUNfVkxBTl9NQUNdIHx8CiAJICAgICFhdHRyc1tST0NLRVJfVExWX0VWRU5UX01BQ19WTEFOX1ZMQU5fSURdKQogCQlyZXR1cm4gLUVJTzsKIAlwb3J0X251bWJlciA9Ci0JCXJvY2tlcl90bHZfZ2V0X3UzMihhdHRyc1tST0NLRVJfVExWX0VWRU5UX01BQ19WTEFOX0xQT1JUXSkgLSAxOworCQlyb2NrZXJfdGx2X2dldF91MzIoYXR0cnNbUk9DS0VSX1RMVl9FVkVOVF9NQUNfVkxBTl9QUE9SVF0pIC0gMTsKIAlhZGRyID0gcm9ja2VyX3Rsdl9kYXRhKGF0dHJzW1JPQ0tFUl9UTFZfRVZFTlRfTUFDX1ZMQU5fTUFDXSk7CiAJdmxhbl9pZCA9IHJvY2tlcl90bHZfZ2V0X2JlMTYoYXR0cnNbUk9DS0VSX1RMVl9FVkVOVF9NQUNfVkxBTl9WTEFOX0lEXSk7CiAKQEAgLTE1MTcsOCArMTU1Nyw4IEBACiAJY21kX2luZm8gPSByb2NrZXJfdGx2X25lc3Rfc3RhcnQoZGVzY19pbmZvLCBST0NLRVJfVExWX0NNRF9JTkZPKTsKIAlpZiAoIWNtZF9pbmZvKQogCQlyZXR1cm4gLUVNU0dTSVpFOwotCWlmIChyb2NrZXJfdGx2X3B1dF91MzIoZGVzY19pbmZvLCBST0NLRVJfVExWX0NNRF9QT1JUX1NFVFRJTkdTX0xQT1JULAotCQkJICAgICAgIHJvY2tlcl9wb3J0LT5scG9ydCkpCisJaWYgKHJvY2tlcl90bHZfcHV0X3UzMihkZXNjX2luZm8sIFJPQ0tFUl9UTFZfQ01EX1BPUlRfU0VUVElOR1NfUFBPUlQsCisJCQkgICAgICAgcm9ja2VyX3BvcnQtPnBwb3J0KSkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAlyb2NrZXJfdGx2X25lc3RfZW5kKGRlc2NfaW5mbywgY21kX2luZm8pOwogCXJldHVybiAwOwpAQCAtMTU5MSw2ICsxNjMxLDUzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0cnVjdCBwb3J0X25hbWUgeworCWNoYXIgKmJ1ZjsKKwlzaXplX3QgbGVuOworfTsKKworc3RhdGljIGludAorcm9ja2VyX2NtZF9nZXRfcG9ydF9zZXR0aW5nc19waHlzX25hbWVfcHJvYyhzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsCisJCQkJCSAgICBzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAorCQkJCQkgICAgc3RydWN0IHJvY2tlcl9kZXNjX2luZm8gKmRlc2NfaW5mbywKKwkJCQkJICAgIHZvaWQgKnByaXYpCit7CisJc3RydWN0IHJvY2tlcl90bHYgKmluZm9fYXR0cnNbUk9DS0VSX1RMVl9DTURfUE9SVF9TRVRUSU5HU19NQVggKyAxXTsKKwlzdHJ1Y3Qgcm9ja2VyX3RsdiAqYXR0cnNbUk9DS0VSX1RMVl9DTURfTUFYICsgMV07CisJc3RydWN0IHBvcnRfbmFtZSAqbmFtZSA9IHByaXY7CisJc3RydWN0IHJvY2tlcl90bHYgKmF0dHI7CisJc2l6ZV90IGksIGosIGxlbjsKKwljaGFyICpzdHI7CisKKwlyb2NrZXJfdGx2X3BhcnNlX2Rlc2MoYXR0cnMsIFJPQ0tFUl9UTFZfQ01EX01BWCwgZGVzY19pbmZvKTsKKwlpZiAoIWF0dHJzW1JPQ0tFUl9UTFZfQ01EX0lORk9dKQorCQlyZXR1cm4gLUVJTzsKKworCXJvY2tlcl90bHZfcGFyc2VfbmVzdGVkKGluZm9fYXR0cnMsIFJPQ0tFUl9UTFZfQ01EX1BPUlRfU0VUVElOR1NfTUFYLAorCQkJCWF0dHJzW1JPQ0tFUl9UTFZfQ01EX0lORk9dKTsKKwlhdHRyID0gaW5mb19hdHRyc1tST0NLRVJfVExWX0NNRF9QT1JUX1NFVFRJTkdTX1BIWVNfTkFNRV07CisJaWYgKCFhdHRyKQorCQlyZXR1cm4gLUVJTzsKKworCWxlbiA9IG1pbl90KHNpemVfdCwgcm9ja2VyX3Rsdl9sZW4oYXR0ciksIG5hbWUtPmxlbik7CisJc3RyID0gcm9ja2VyX3Rsdl9kYXRhKGF0dHIpOworCisJLyogbWFrZSBzdXJlIG5hbWUgb25seSBjb250YWlucyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyAqLworCWZvciAoaSA9IGogPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJaWYgKGlzYWxudW0oc3RyW2ldKSkgeworCQkJbmFtZS0+YnVmW2pdID0gc3RyW2ldOworCQkJaisrOworCQl9CisJfQorCisJaWYgKGogPT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwluYW1lLT5idWZbal0gPSAnXDAnOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQKIHJvY2tlcl9jbWRfc2V0X3BvcnRfc2V0dGluZ3NfZXRodG9vbF9wcmVwKHN0cnVjdCByb2NrZXIgKnJvY2tlciwKIAkJCQkJICBzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LApAQCAtMTYwNiw4ICsxNjkzLDggQEAKIAljbWRfaW5mbyA9IHJvY2tlcl90bHZfbmVzdF9zdGFydChkZXNjX2luZm8sIFJPQ0tFUl9UTFZfQ01EX0lORk8pOwogCWlmICghY21kX2luZm8pCiAJCXJldHVybiAtRU1TR1NJWkU7Ci0JaWYgKHJvY2tlcl90bHZfcHV0X3UzMihkZXNjX2luZm8sIFJPQ0tFUl9UTFZfQ01EX1BPUlRfU0VUVElOR1NfTFBPUlQsCi0JCQkgICAgICAgcm9ja2VyX3BvcnQtPmxwb3J0KSkKKwlpZiAocm9ja2VyX3Rsdl9wdXRfdTMyKGRlc2NfaW5mbywgUk9DS0VSX1RMVl9DTURfUE9SVF9TRVRUSU5HU19QUE9SVCwKKwkJCSAgICAgICByb2NrZXJfcG9ydC0+cHBvcnQpKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCWlmIChyb2NrZXJfdGx2X3B1dF91MzIoZGVzY19pbmZvLCBST0NLRVJfVExWX0NNRF9QT1JUX1NFVFRJTkdTX1NQRUVELAogCQkJICAgICAgIGV0aHRvb2xfY21kX3NwZWVkKGVjbWQpKSkKQEAgLTE2MzcsOCArMTcyNCw4IEBACiAJY21kX2luZm8gPSByb2NrZXJfdGx2X25lc3Rfc3RhcnQoZGVzY19pbmZvLCBST0NLRVJfVExWX0NNRF9JTkZPKTsKIAlpZiAoIWNtZF9pbmZvKQogCQlyZXR1cm4gLUVNU0dTSVpFOwotCWlmIChyb2NrZXJfdGx2X3B1dF91MzIoZGVzY19pbmZvLCBST0NLRVJfVExWX0NNRF9QT1JUX1NFVFRJTkdTX0xQT1JULAotCQkJICAgICAgIHJvY2tlcl9wb3J0LT5scG9ydCkpCisJaWYgKHJvY2tlcl90bHZfcHV0X3UzMihkZXNjX2luZm8sIFJPQ0tFUl9UTFZfQ01EX1BPUlRfU0VUVElOR1NfUFBPUlQsCisJCQkgICAgICAgcm9ja2VyX3BvcnQtPnBwb3J0KSkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAlpZiAocm9ja2VyX3Rsdl9wdXQoZGVzY19pbmZvLCBST0NLRVJfVExWX0NNRF9QT1JUX1NFVFRJTkdTX01BQ0FERFIsCiAJCQkgICBFVEhfQUxFTiwgbWFjYWRkcikpCkBAIC0xNjYxLDggKzE3NDgsOCBAQAogCWNtZF9pbmZvID0gcm9ja2VyX3Rsdl9uZXN0X3N0YXJ0KGRlc2NfaW5mbywgUk9DS0VSX1RMVl9DTURfSU5GTyk7CiAJaWYgKCFjbWRfaW5mbykKIAkJcmV0dXJuIC1FTVNHU0laRTsKLQlpZiAocm9ja2VyX3Rsdl9wdXRfdTMyKGRlc2NfaW5mbywgUk9DS0VSX1RMVl9DTURfUE9SVF9TRVRUSU5HU19MUE9SVCwKLQkJCSAgICAgICByb2NrZXJfcG9ydC0+bHBvcnQpKQorCWlmIChyb2NrZXJfdGx2X3B1dF91MzIoZGVzY19pbmZvLCBST0NLRVJfVExWX0NNRF9QT1JUX1NFVFRJTkdTX1BQT1JULAorCQkJICAgICAgIHJvY2tlcl9wb3J0LT5wcG9ydCkpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAJaWYgKHJvY2tlcl90bHZfcHV0X3U4KGRlc2NfaW5mbywgUk9DS0VSX1RMVl9DTURfUE9SVF9TRVRUSU5HU19MRUFSTklORywKIAkJCSAgICAgICEhKHJvY2tlcl9wb3J0LT5icnBvcnRfZmxhZ3MgJiBCUl9MRUFSTklORykpKQpAQCAtMTcxNSwxMSArMTgwMiwxMSBAQAogc3RhdGljIGludCByb2NrZXJfY21kX2Zsb3dfdGJsX2FkZF9pZ19wb3J0KHN0cnVjdCByb2NrZXJfZGVzY19pbmZvICpkZXNjX2luZm8sCiAJCQkJCSAgIHN0cnVjdCByb2NrZXJfZmxvd190YmxfZW50cnkgKmVudHJ5KQogewotCWlmIChyb2NrZXJfdGx2X3B1dF91MzIoZGVzY19pbmZvLCBST0NLRVJfVExWX09GX0RQQV9JTl9MUE9SVCwKLQkJCSAgICAgICBlbnRyeS0+a2V5LmlnX3BvcnQuaW5fbHBvcnQpKQorCWlmIChyb2NrZXJfdGx2X3B1dF91MzIoZGVzY19pbmZvLCBST0NLRVJfVExWX09GX0RQQV9JTl9QUE9SVCwKKwkJCSAgICAgICBlbnRyeS0+a2V5LmlnX3BvcnQuaW5fcHBvcnQpKQogCQlyZXR1cm4gLUVNU0dTSVpFOwotCWlmIChyb2NrZXJfdGx2X3B1dF91MzIoZGVzY19pbmZvLCBST0NLRVJfVExWX09GX0RQQV9JTl9MUE9SVF9NQVNLLAotCQkJICAgICAgIGVudHJ5LT5rZXkuaWdfcG9ydC5pbl9scG9ydF9tYXNrKSkKKwlpZiAocm9ja2VyX3Rsdl9wdXRfdTMyKGRlc2NfaW5mbywgUk9DS0VSX1RMVl9PRl9EUEFfSU5fUFBPUlRfTUFTSywKKwkJCSAgICAgICBlbnRyeS0+a2V5LmlnX3BvcnQuaW5fcHBvcnRfbWFzaykpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAJaWYgKHJvY2tlcl90bHZfcHV0X3UxNihkZXNjX2luZm8sIFJPQ0tFUl9UTFZfT0ZfRFBBX0dPVE9fVEFCTEVfSUQsCiAJCQkgICAgICAgZW50cnktPmtleS5pZ19wb3J0LmdvdG9fdGJsKSkKQEAgLTE3MzEsOCArMTgxOCw4IEBACiBzdGF0aWMgaW50IHJvY2tlcl9jbWRfZmxvd190YmxfYWRkX3ZsYW4oc3RydWN0IHJvY2tlcl9kZXNjX2luZm8gKmRlc2NfaW5mbywKIAkJCQkJc3RydWN0IHJvY2tlcl9mbG93X3RibF9lbnRyeSAqZW50cnkpCiB7Ci0JaWYgKHJvY2tlcl90bHZfcHV0X3UzMihkZXNjX2luZm8sIFJPQ0tFUl9UTFZfT0ZfRFBBX0lOX0xQT1JULAotCQkJICAgICAgIGVudHJ5LT5rZXkudmxhbi5pbl9scG9ydCkpCisJaWYgKHJvY2tlcl90bHZfcHV0X3UzMihkZXNjX2luZm8sIFJPQ0tFUl9UTFZfT0ZfRFBBX0lOX1BQT1JULAorCQkJICAgICAgIGVudHJ5LT5rZXkudmxhbi5pbl9wcG9ydCkpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAJaWYgKHJvY2tlcl90bHZfcHV0X2JlMTYoZGVzY19pbmZvLCBST0NLRVJfVExWX09GX0RQQV9WTEFOX0lELAogCQkJCWVudHJ5LT5rZXkudmxhbi52bGFuX2lkKSkKQEAgLTE3NTQsMTEgKzE4NDEsMTEgQEAKIHN0YXRpYyBpbnQgcm9ja2VyX2NtZF9mbG93X3RibF9hZGRfdGVybV9tYWMoc3RydWN0IHJvY2tlcl9kZXNjX2luZm8gKmRlc2NfaW5mbywKIAkJCQkJICAgIHN0cnVjdCByb2NrZXJfZmxvd190YmxfZW50cnkgKmVudHJ5KQogewotCWlmIChyb2NrZXJfdGx2X3B1dF91MzIoZGVzY19pbmZvLCBST0NLRVJfVExWX09GX0RQQV9JTl9MUE9SVCwKLQkJCSAgICAgICBlbnRyeS0+a2V5LnRlcm1fbWFjLmluX2xwb3J0KSkKKwlpZiAocm9ja2VyX3Rsdl9wdXRfdTMyKGRlc2NfaW5mbywgUk9DS0VSX1RMVl9PRl9EUEFfSU5fUFBPUlQsCisJCQkgICAgICAgZW50cnktPmtleS50ZXJtX21hYy5pbl9wcG9ydCkpCiAJCXJldHVybiAtRU1TR1NJWkU7Ci0JaWYgKHJvY2tlcl90bHZfcHV0X3UzMihkZXNjX2luZm8sIFJPQ0tFUl9UTFZfT0ZfRFBBX0lOX0xQT1JUX01BU0ssCi0JCQkgICAgICAgZW50cnktPmtleS50ZXJtX21hYy5pbl9scG9ydF9tYXNrKSkKKwlpZiAocm9ja2VyX3Rsdl9wdXRfdTMyKGRlc2NfaW5mbywgUk9DS0VSX1RMVl9PRl9EUEFfSU5fUFBPUlRfTUFTSywKKwkJCSAgICAgICBlbnRyeS0+a2V5LnRlcm1fbWFjLmluX3Bwb3J0X21hc2spKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCWlmIChyb2NrZXJfdGx2X3B1dF9iZTE2KGRlc2NfaW5mbywgUk9DS0VSX1RMVl9PRl9EUEFfRVRIRVJUWVBFLAogCQkJCWVudHJ5LT5rZXkudGVybV9tYWMuZXRoX3R5cGUpKQpAQCAtMTg0NSwxMSArMTkzMiwxMSBAQAogc3RhdGljIGludCByb2NrZXJfY21kX2Zsb3dfdGJsX2FkZF9hY2woc3RydWN0IHJvY2tlcl9kZXNjX2luZm8gKmRlc2NfaW5mbywKIAkJCQkgICAgICAgc3RydWN0IHJvY2tlcl9mbG93X3RibF9lbnRyeSAqZW50cnkpCiB7Ci0JaWYgKHJvY2tlcl90bHZfcHV0X3UzMihkZXNjX2luZm8sIFJPQ0tFUl9UTFZfT0ZfRFBBX0lOX0xQT1JULAotCQkJICAgICAgIGVudHJ5LT5rZXkuYWNsLmluX2xwb3J0KSkKKwlpZiAocm9ja2VyX3Rsdl9wdXRfdTMyKGRlc2NfaW5mbywgUk9DS0VSX1RMVl9PRl9EUEFfSU5fUFBPUlQsCisJCQkgICAgICAgZW50cnktPmtleS5hY2wuaW5fcHBvcnQpKQogCQlyZXR1cm4gLUVNU0dTSVpFOwotCWlmIChyb2NrZXJfdGx2X3B1dF91MzIoZGVzY19pbmZvLCBST0NLRVJfVExWX09GX0RQQV9JTl9MUE9SVF9NQVNLLAotCQkJICAgICAgIGVudHJ5LT5rZXkuYWNsLmluX2xwb3J0X21hc2spKQorCWlmIChyb2NrZXJfdGx2X3B1dF91MzIoZGVzY19pbmZvLCBST0NLRVJfVExWX09GX0RQQV9JTl9QUE9SVF9NQVNLLAorCQkJICAgICAgIGVudHJ5LT5rZXkuYWNsLmluX3Bwb3J0X21hc2spKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCWlmIChyb2NrZXJfdGx2X3B1dChkZXNjX2luZm8sIFJPQ0tFUl9UTFZfT0ZfRFBBX1NSQ19NQUMsCiAJCQkgICBFVEhfQUxFTiwgZW50cnktPmtleS5hY2wuZXRoX3NyYykpCkBAIC0xOTE3LDggKzIwMDQsNyBAQAogCXN0cnVjdCByb2NrZXJfdGx2ICpjbWRfaW5mbzsKIAlpbnQgZXJyID0gMDsKIAotCWlmIChyb2NrZXJfdGx2X3B1dF91MTYoZGVzY19pbmZvLCBST0NLRVJfVExWX0NNRF9UWVBFLAotCQkJICAgICAgIFJPQ0tFUl9UTFZfQ01EX1RZUEVfT0ZfRFBBX0ZMT1dfQUREKSkKKwlpZiAocm9ja2VyX3Rsdl9wdXRfdTE2KGRlc2NfaW5mbywgUk9DS0VSX1RMVl9DTURfVFlQRSwgZW50cnktPmNtZCkpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAJY21kX2luZm8gPSByb2NrZXJfdGx2X25lc3Rfc3RhcnQoZGVzY19pbmZvLCBST0NLRVJfVExWX0NNRF9JTkZPKTsKIAlpZiAoIWNtZF9pbmZvKQpAQCAtMTk3NSw4ICsyMDYxLDcgQEAKIAljb25zdCBzdHJ1Y3Qgcm9ja2VyX2Zsb3dfdGJsX2VudHJ5ICplbnRyeSA9IHByaXY7CiAJc3RydWN0IHJvY2tlcl90bHYgKmNtZF9pbmZvOwogCi0JaWYgKHJvY2tlcl90bHZfcHV0X3UxNihkZXNjX2luZm8sIFJPQ0tFUl9UTFZfQ01EX1RZUEUsCi0JCQkgICAgICAgUk9DS0VSX1RMVl9DTURfVFlQRV9PRl9EUEFfRkxPV19ERUwpKQorCWlmIChyb2NrZXJfdGx2X3B1dF91MTYoZGVzY19pbmZvLCBST0NLRVJfVExWX0NNRF9UWVBFLCBlbnRyeS0+Y21kKSkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAljbWRfaW5mbyA9IHJvY2tlcl90bHZfbmVzdF9zdGFydChkZXNjX2luZm8sIFJPQ0tFUl9UTFZfQ01EX0lORk8pOwogCWlmICghY21kX2luZm8pCkBAIC0xOTkzLDcgKzIwNzgsNyBAQAogcm9ja2VyX2NtZF9ncm91cF90YmxfYWRkX2wyX2ludGVyZmFjZShzdHJ1Y3Qgcm9ja2VyX2Rlc2NfaW5mbyAqZGVzY19pbmZvLAogCQkJCSAgICAgIHN0cnVjdCByb2NrZXJfZ3JvdXBfdGJsX2VudHJ5ICplbnRyeSkKIHsKLQlpZiAocm9ja2VyX3Rsdl9wdXRfdTMyKGRlc2NfaW5mbywgUk9DS0VSX1RMVl9PRl9EUEFfT1VUX0xQT1JULAorCWlmIChyb2NrZXJfdGx2X3B1dF91MzIoZGVzY19pbmZvLCBST0NLRVJfVExWX09GX0RQQV9PVVRfUFBPUlQsCiAJCQkgICAgICAgUk9DS0VSX0dST1VQX1BPUlRfR0VUKGVudHJ5LT5ncm91cF9pZCkpKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCWlmIChyb2NrZXJfdGx2X3B1dF91OChkZXNjX2luZm8sIFJPQ0tFUl9UTFZfT0ZfRFBBX1BPUF9WTEFOLApAQCAtMjE0NSw5ICsyMjMwLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBGbG93LCBncm91cCwgRkRCLCBpbnRlcm5hbCBWTEFOIHRhYmxlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRmxvdywgZ3JvdXAsIEZEQiwgaW50ZXJuYWwgVkxBTiBhbmQgbmVpZ2ggdGFibGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBzdGF0aWMgaW50IHJvY2tlcl9pbml0X3RibHMoc3RydWN0IHJvY2tlciAqcm9ja2VyKQogewpAQCAtMjE2Myw2ICsyMjQ4LDkgQEAKIAloYXNoX2luaXQocm9ja2VyLT5pbnRlcm5hbF92bGFuX3RibCk7CiAJc3Bpbl9sb2NrX2luaXQoJnJvY2tlci0+aW50ZXJuYWxfdmxhbl90YmxfbG9jayk7CiAKKwloYXNoX2luaXQocm9ja2VyLT5uZWlnaF90YmwpOworCXNwaW5fbG9ja19pbml0KCZyb2NrZXItPm5laWdoX3RibF9sb2NrKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0yMTczLDYgKzIyNjEsNyBAQAogCXN0cnVjdCByb2NrZXJfZ3JvdXBfdGJsX2VudHJ5ICpncm91cF9lbnRyeTsKIAlzdHJ1Y3Qgcm9ja2VyX2ZkYl90YmxfZW50cnkgKmZkYl9lbnRyeTsKIAlzdHJ1Y3Qgcm9ja2VyX2ludGVybmFsX3ZsYW5fdGJsX2VudHJ5ICppbnRlcm5hbF92bGFuX2VudHJ5OworCXN0cnVjdCByb2NrZXJfbmVpZ2hfdGJsX2VudHJ5ICpuZWlnaF9lbnRyeTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOwogCWludCBia3Q7CiAKQEAgLTIxOTYsMTYgKzIyODUsMjIgQEAKIAkJCSAgIHRtcCwgaW50ZXJuYWxfdmxhbl9lbnRyeSwgZW50cnkpCiAJCWhhc2hfZGVsKCZpbnRlcm5hbF92bGFuX2VudHJ5LT5lbnRyeSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm9ja2VyLT5pbnRlcm5hbF92bGFuX3RibF9sb2NrLCBmbGFncyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcm9ja2VyLT5uZWlnaF90YmxfbG9jaywgZmxhZ3MpOworCWhhc2hfZm9yX2VhY2hfc2FmZShyb2NrZXItPm5laWdoX3RibCwgYmt0LCB0bXAsIG5laWdoX2VudHJ5LCBlbnRyeSkKKwkJaGFzaF9kZWwoJm5laWdoX2VudHJ5LT5lbnRyeSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm9ja2VyLT5uZWlnaF90YmxfbG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgc3RydWN0IHJvY2tlcl9mbG93X3RibF9lbnRyeSAqCiByb2NrZXJfZmxvd190YmxfZmluZChzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsIHN0cnVjdCByb2NrZXJfZmxvd190YmxfZW50cnkgKm1hdGNoKQogewogCXN0cnVjdCByb2NrZXJfZmxvd190YmxfZW50cnkgKmZvdW5kOworCXNpemVfdCBrZXlfbGVuID0gbWF0Y2gtPmtleV9sZW4gPyBtYXRjaC0+a2V5X2xlbiA6IHNpemVvZihmb3VuZC0+a2V5KTsKIAogCWhhc2hfZm9yX2VhY2hfcG9zc2libGUocm9ja2VyLT5mbG93X3RibCwgZm91bmQsCiAJCQkgICAgICAgZW50cnksIG1hdGNoLT5rZXlfY3JjMzIpIHsKLQkJaWYgKG1lbWNtcCgmZm91bmQtPmtleSwgJm1hdGNoLT5rZXksIHNpemVvZihmb3VuZC0+a2V5KSkgPT0gMCkKKwkJaWYgKG1lbWNtcCgmZm91bmQtPmtleSwgJm1hdGNoLT5rZXksIGtleV9sZW4pID09IDApCiAJCQlyZXR1cm4gZm91bmQ7CiAJfQogCkBAIC0yMjE4LDQyICsyMzEzLDM0IEBACiB7CiAJc3RydWN0IHJvY2tlciAqcm9ja2VyID0gcm9ja2VyX3BvcnQtPnJvY2tlcjsKIAlzdHJ1Y3Qgcm9ja2VyX2Zsb3dfdGJsX2VudHJ5ICpmb3VuZDsKKwlzaXplX3Qga2V5X2xlbiA9IG1hdGNoLT5rZXlfbGVuID8gbWF0Y2gtPmtleV9sZW4gOiBzaXplb2YoZm91bmQtPmtleSk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlib29sIGFkZF90b19odyA9IGZhbHNlOwotCWludCBlcnIgPSAwOwogCi0JbWF0Y2gtPmtleV9jcmMzMiA9IGNyYzMyKH4wLCAmbWF0Y2gtPmtleSwgc2l6ZW9mKG1hdGNoLT5rZXkpKTsKKwltYXRjaC0+a2V5X2NyYzMyID0gY3JjMzIofjAsICZtYXRjaC0+a2V5LCBrZXlfbGVuKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZyb2NrZXItPmZsb3dfdGJsX2xvY2ssIGZsYWdzKTsKIAogCWZvdW5kID0gcm9ja2VyX2Zsb3dfdGJsX2ZpbmQocm9ja2VyLCBtYXRjaCk7CiAKIAlpZiAoZm91bmQpIHsKLQkJa2ZyZWUobWF0Y2gpOworCQltYXRjaC0+Y29va2llID0gZm91bmQtPmNvb2tpZTsKKwkJaGFzaF9kZWwoJmZvdW5kLT5lbnRyeSk7CisJCWtmcmVlKGZvdW5kKTsKKwkJZm91bmQgPSBtYXRjaDsKKwkJZm91bmQtPmNtZCA9IFJPQ0tFUl9UTFZfQ01EX1RZUEVfT0ZfRFBBX0ZMT1dfTU9EOwogCX0gZWxzZSB7CiAJCWZvdW5kID0gbWF0Y2g7CiAJCWZvdW5kLT5jb29raWUgPSByb2NrZXItPmZsb3dfdGJsX25leHRfY29va2llKys7Ci0JCWhhc2hfYWRkKHJvY2tlci0+Zmxvd190YmwsICZmb3VuZC0+ZW50cnksIGZvdW5kLT5rZXlfY3JjMzIpOwotCQlhZGRfdG9faHcgPSB0cnVlOworCQlmb3VuZC0+Y21kID0gUk9DS0VSX1RMVl9DTURfVFlQRV9PRl9EUEFfRkxPV19BREQ7CiAJfQogCi0JZm91bmQtPnJlZl9jb3VudCsrOworCWhhc2hfYWRkKHJvY2tlci0+Zmxvd190YmwsICZmb3VuZC0+ZW50cnksIGZvdW5kLT5rZXlfY3JjMzIpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm9ja2VyLT5mbG93X3RibF9sb2NrLCBmbGFncyk7CiAKLQlpZiAoYWRkX3RvX2h3KSB7Ci0JCWVyciA9IHJvY2tlcl9jbWRfZXhlYyhyb2NrZXIsIHJvY2tlcl9wb3J0LAotCQkJCSAgICAgIHJvY2tlcl9jbWRfZmxvd190YmxfYWRkLAotCQkJCSAgICAgIGZvdW5kLCBOVUxMLCBOVUxMLCBub3dhaXQpOwotCQlpZiAoZXJyKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmcm9ja2VyLT5mbG93X3RibF9sb2NrLCBmbGFncyk7Ci0JCQloYXNoX2RlbCgmZm91bmQtPmVudHJ5KTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJvY2tlci0+Zmxvd190YmxfbG9jaywgZmxhZ3MpOwotCQkJa2ZyZWUoZm91bmQpOwotCQl9Ci0JfQotCi0JcmV0dXJuIGVycjsKKwlyZXR1cm4gcm9ja2VyX2NtZF9leGVjKHJvY2tlciwgcm9ja2VyX3BvcnQsCisJCQkgICAgICAgcm9ja2VyX2NtZF9mbG93X3RibF9hZGQsCisJCQkgICAgICAgZm91bmQsIE5VTEwsIE5VTEwsIG5vd2FpdCk7CiB9CiAKIHN0YXRpYyBpbnQgcm9ja2VyX2Zsb3dfdGJsX2RlbChzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LApAQCAtMjI2MiwyOSArMjM0OSwyNiBAQAogewogCXN0cnVjdCByb2NrZXIgKnJvY2tlciA9IHJvY2tlcl9wb3J0LT5yb2NrZXI7CiAJc3RydWN0IHJvY2tlcl9mbG93X3RibF9lbnRyeSAqZm91bmQ7CisJc2l6ZV90IGtleV9sZW4gPSBtYXRjaC0+a2V5X2xlbiA/IG1hdGNoLT5rZXlfbGVuIDogc2l6ZW9mKGZvdW5kLT5rZXkpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYm9vbCBkZWxfZnJvbV9odyA9IGZhbHNlOwogCWludCBlcnIgPSAwOwogCi0JbWF0Y2gtPmtleV9jcmMzMiA9IGNyYzMyKH4wLCAmbWF0Y2gtPmtleSwgc2l6ZW9mKG1hdGNoLT5rZXkpKTsKKwltYXRjaC0+a2V5X2NyYzMyID0gY3JjMzIofjAsICZtYXRjaC0+a2V5LCBrZXlfbGVuKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZyb2NrZXItPmZsb3dfdGJsX2xvY2ssIGZsYWdzKTsKIAogCWZvdW5kID0gcm9ja2VyX2Zsb3dfdGJsX2ZpbmQocm9ja2VyLCBtYXRjaCk7CiAKIAlpZiAoZm91bmQpIHsKLQkJZm91bmQtPnJlZl9jb3VudC0tOwotCQlpZiAoZm91bmQtPnJlZl9jb3VudCA9PSAwKSB7Ci0JCQloYXNoX2RlbCgmZm91bmQtPmVudHJ5KTsKLQkJCWRlbF9mcm9tX2h3ID0gdHJ1ZTsKLQkJfQorCQloYXNoX2RlbCgmZm91bmQtPmVudHJ5KTsKKwkJZm91bmQtPmNtZCA9IFJPQ0tFUl9UTFZfQ01EX1RZUEVfT0ZfRFBBX0ZMT1dfREVMOwogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJvY2tlci0+Zmxvd190YmxfbG9jaywgZmxhZ3MpOwogCiAJa2ZyZWUobWF0Y2gpOwogCi0JaWYgKGRlbF9mcm9tX2h3KSB7CisJaWYgKGZvdW5kKSB7CiAJCWVyciA9IHJvY2tlcl9jbWRfZXhlYyhyb2NrZXIsIHJvY2tlcl9wb3J0LAogCQkJCSAgICAgIHJvY2tlcl9jbWRfZmxvd190YmxfZGVsLAogCQkJCSAgICAgIGZvdW5kLCBOVUxMLCBOVUxMLCBub3dhaXQpOwpAQCAtMjMxMSw3ICsyMzk1LDcgQEAKIH0KIAogc3RhdGljIGludCByb2NrZXJfZmxvd190YmxfaWdfcG9ydChzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAotCQkJCSAgIGludCBmbGFncywgdTMyIGluX2xwb3J0LCB1MzIgaW5fbHBvcnRfbWFzaywKKwkJCQkgICBpbnQgZmxhZ3MsIHUzMiBpbl9wcG9ydCwgdTMyIGluX3Bwb3J0X21hc2ssCiAJCQkJICAgZW51bSByb2NrZXJfb2ZfZHBhX3RhYmxlX2lkIGdvdG9fdGJsKQogewogCXN0cnVjdCByb2NrZXJfZmxvd190YmxfZW50cnkgKmVudHJ5OwpAQCAtMjMyMiwxNSArMjQwNiwxNSBAQAogCiAJZW50cnktPmtleS5wcmlvcml0eSA9IFJPQ0tFUl9QUklPUklUWV9JR19QT1JUOwogCWVudHJ5LT5rZXkudGJsX2lkID0gUk9DS0VSX09GX0RQQV9UQUJMRV9JRF9JTkdSRVNTX1BPUlQ7Ci0JZW50cnktPmtleS5pZ19wb3J0LmluX2xwb3J0ID0gaW5fbHBvcnQ7Ci0JZW50cnktPmtleS5pZ19wb3J0LmluX2xwb3J0X21hc2sgPSBpbl9scG9ydF9tYXNrOworCWVudHJ5LT5rZXkuaWdfcG9ydC5pbl9wcG9ydCA9IGluX3Bwb3J0OworCWVudHJ5LT5rZXkuaWdfcG9ydC5pbl9wcG9ydF9tYXNrID0gaW5fcHBvcnRfbWFzazsKIAllbnRyeS0+a2V5LmlnX3BvcnQuZ290b190YmwgPSBnb3RvX3RibDsKIAogCXJldHVybiByb2NrZXJfZmxvd190YmxfZG8ocm9ja2VyX3BvcnQsIGZsYWdzLCBlbnRyeSk7CiB9CiAKIHN0YXRpYyBpbnQgcm9ja2VyX2Zsb3dfdGJsX3ZsYW4oc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKLQkJCQlpbnQgZmxhZ3MsIHUzMiBpbl9scG9ydCwKKwkJCQlpbnQgZmxhZ3MsIHUzMiBpbl9wcG9ydCwKIAkJCQlfX2JlMTYgdmxhbl9pZCwgX19iZTE2IHZsYW5faWRfbWFzaywKIAkJCQllbnVtIHJvY2tlcl9vZl9kcGFfdGFibGVfaWQgZ290b190YmwsCiAJCQkJYm9vbCB1bnRhZ2dlZCwgX19iZTE2IG5ld192bGFuX2lkKQpAQCAtMjM0Myw3ICsyNDI3LDcgQEAKIAogCWVudHJ5LT5rZXkucHJpb3JpdHkgPSBST0NLRVJfUFJJT1JJVFlfVkxBTjsKIAllbnRyeS0+a2V5LnRibF9pZCA9IFJPQ0tFUl9PRl9EUEFfVEFCTEVfSURfVkxBTjsKLQllbnRyeS0+a2V5LnZsYW4uaW5fbHBvcnQgPSBpbl9scG9ydDsKKwllbnRyeS0+a2V5LnZsYW4uaW5fcHBvcnQgPSBpbl9wcG9ydDsKIAllbnRyeS0+a2V5LnZsYW4udmxhbl9pZCA9IHZsYW5faWQ7CiAJZW50cnktPmtleS52bGFuLnZsYW5faWRfbWFzayA9IHZsYW5faWRfbWFzazsKIAllbnRyeS0+a2V5LnZsYW4uZ290b190YmwgPSBnb3RvX3RibDsKQEAgLTIzNTUsNyArMjQzOSw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcm9ja2VyX2Zsb3dfdGJsX3Rlcm1fbWFjKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCi0JCQkJICAgIHUzMiBpbl9scG9ydCwgdTMyIGluX2xwb3J0X21hc2ssCisJCQkJICAgIHUzMiBpbl9wcG9ydCwgdTMyIGluX3Bwb3J0X21hc2ssCiAJCQkJICAgIF9fYmUxNiBldGhfdHlwZSwgY29uc3QgdTggKmV0aF9kc3QsCiAJCQkJICAgIGNvbnN0IHU4ICpldGhfZHN0X21hc2ssIF9fYmUxNiB2bGFuX2lkLAogCQkJCSAgICBfX2JlMTYgdmxhbl9pZF9tYXNrLCBib29sIGNvcHlfdG9fY3B1LApAQCAtMjM3OCw4ICsyNDYyLDggQEAKIAl9CiAKIAllbnRyeS0+a2V5LnRibF9pZCA9IFJPQ0tFUl9PRl9EUEFfVEFCTEVfSURfVEVSTUlOQVRJT05fTUFDOwotCWVudHJ5LT5rZXkudGVybV9tYWMuaW5fbHBvcnQgPSBpbl9scG9ydDsKLQllbnRyeS0+a2V5LnRlcm1fbWFjLmluX2xwb3J0X21hc2sgPSBpbl9scG9ydF9tYXNrOworCWVudHJ5LT5rZXkudGVybV9tYWMuaW5fcHBvcnQgPSBpbl9wcG9ydDsKKwllbnRyeS0+a2V5LnRlcm1fbWFjLmluX3Bwb3J0X21hc2sgPSBpbl9wcG9ydF9tYXNrOwogCWVudHJ5LT5rZXkudGVybV9tYWMuZXRoX3R5cGUgPSBldGhfdHlwZTsKIAlldGhlcl9hZGRyX2NvcHkoZW50cnktPmtleS50ZXJtX21hYy5ldGhfZHN0LCBldGhfZHN0KTsKIAlldGhlcl9hZGRyX2NvcHkoZW50cnktPmtleS50ZXJtX21hYy5ldGhfZHN0X21hc2ssIGV0aF9kc3RfbWFzayk7CkBAIC0yNDQ0LDkgKzI1MjgsMzQgQEAKIAlyZXR1cm4gcm9ja2VyX2Zsb3dfdGJsX2RvKHJvY2tlcl9wb3J0LCBmbGFncywgZW50cnkpOwogfQogCitzdGF0aWMgaW50IHJvY2tlcl9mbG93X3RibF91Y2FzdDRfcm91dGluZyhzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAorCQkJCQkgIF9fYmUxNiBldGhfdHlwZSwgX19iZTMyIGRzdCwKKwkJCQkJICBfX2JlMzIgZHN0X21hc2ssIHUzMiBwcmlvcml0eSwKKwkJCQkJICBlbnVtIHJvY2tlcl9vZl9kcGFfdGFibGVfaWQgZ290b190YmwsCisJCQkJCSAgdTMyIGdyb3VwX2lkLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHJvY2tlcl9mbG93X3RibF9lbnRyeSAqZW50cnk7CisKKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIHJvY2tlcl9vcF9mbGFnc19nZnAoZmxhZ3MpKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVudHJ5LT5rZXkudGJsX2lkID0gUk9DS0VSX09GX0RQQV9UQUJMRV9JRF9VTklDQVNUX1JPVVRJTkc7CisJZW50cnktPmtleS5wcmlvcml0eSA9IHByaW9yaXR5OworCWVudHJ5LT5rZXkudWNhc3Rfcm91dGluZy5ldGhfdHlwZSA9IGV0aF90eXBlOworCWVudHJ5LT5rZXkudWNhc3Rfcm91dGluZy5kc3Q0ID0gZHN0OworCWVudHJ5LT5rZXkudWNhc3Rfcm91dGluZy5kc3Q0X21hc2sgPSBkc3RfbWFzazsKKwllbnRyeS0+a2V5LnVjYXN0X3JvdXRpbmcuZ290b190YmwgPSBnb3RvX3RibDsKKwllbnRyeS0+a2V5LnVjYXN0X3JvdXRpbmcuZ3JvdXBfaWQgPSBncm91cF9pZDsKKwllbnRyeS0+a2V5X2xlbiA9IG9mZnNldG9mKHN0cnVjdCByb2NrZXJfZmxvd190Ymxfa2V5LAorCQkJCSAgdWNhc3Rfcm91dGluZy5ncm91cF9pZCk7CisKKwlyZXR1cm4gcm9ja2VyX2Zsb3dfdGJsX2RvKHJvY2tlcl9wb3J0LCBmbGFncywgZW50cnkpOworfQorCiBzdGF0aWMgaW50IHJvY2tlcl9mbG93X3RibF9hY2woc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKLQkJCSAgICAgICBpbnQgZmxhZ3MsIHUzMiBpbl9scG9ydCwKLQkJCSAgICAgICB1MzIgaW5fbHBvcnRfbWFzaywKKwkJCSAgICAgICBpbnQgZmxhZ3MsIHUzMiBpbl9wcG9ydCwKKwkJCSAgICAgICB1MzIgaW5fcHBvcnRfbWFzaywKIAkJCSAgICAgICBjb25zdCB1OCAqZXRoX3NyYywgY29uc3QgdTggKmV0aF9zcmNfbWFzaywKIAkJCSAgICAgICBjb25zdCB1OCAqZXRoX2RzdCwgY29uc3QgdTggKmV0aF9kc3RfbWFzaywKIAkJCSAgICAgICBfX2JlMTYgZXRoX3R5cGUsCkBAIC0yNDcyLDggKzI1ODEsOCBAQAogCiAJZW50cnktPmtleS5wcmlvcml0eSA9IHByaW9yaXR5OwogCWVudHJ5LT5rZXkudGJsX2lkID0gUk9DS0VSX09GX0RQQV9UQUJMRV9JRF9BQ0xfUE9MSUNZOwotCWVudHJ5LT5rZXkuYWNsLmluX2xwb3J0ID0gaW5fbHBvcnQ7Ci0JZW50cnktPmtleS5hY2wuaW5fbHBvcnRfbWFzayA9IGluX2xwb3J0X21hc2s7CisJZW50cnktPmtleS5hY2wuaW5fcHBvcnQgPSBpbl9wcG9ydDsKKwllbnRyeS0+a2V5LmFjbC5pbl9wcG9ydF9tYXNrID0gaW5fcHBvcnRfbWFzazsKIAogCWlmIChldGhfc3JjKQogCQlldGhlcl9hZGRyX2NvcHkoZW50cnktPmtleS5hY2wuZXRoX3NyYywgZXRoX3NyYyk7CkBAIC0yNTMxLDcgKzI2NDAsNiBAQAogCXN0cnVjdCByb2NrZXIgKnJvY2tlciA9IHJvY2tlcl9wb3J0LT5yb2NrZXI7CiAJc3RydWN0IHJvY2tlcl9ncm91cF90YmxfZW50cnkgKmZvdW5kOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGVyciA9IDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcm9ja2VyLT5ncm91cF90YmxfbG9jaywgZmxhZ3MpOwogCkBAIC0yNTUxLDEyICsyNjU5LDkgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJvY2tlci0+Z3JvdXBfdGJsX2xvY2ssIGZsYWdzKTsKIAotCWlmIChmb3VuZC0+Y21kKQotCQllcnIgPSByb2NrZXJfY21kX2V4ZWMocm9ja2VyLCByb2NrZXJfcG9ydCwKLQkJCQkgICAgICByb2NrZXJfY21kX2dyb3VwX3RibF9hZGQsCi0JCQkJICAgICAgZm91bmQsIE5VTEwsIE5VTEwsIG5vd2FpdCk7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiByb2NrZXJfY21kX2V4ZWMocm9ja2VyLCByb2NrZXJfcG9ydCwKKwkJCSAgICAgICByb2NrZXJfY21kX2dyb3VwX3RibF9hZGQsCisJCQkgICAgICAgZm91bmQsIE5VTEwsIE5VTEwsIG5vd2FpdCk7CiB9CiAKIHN0YXRpYyBpbnQgcm9ja2VyX2dyb3VwX3RibF9kZWwoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKQEAgLTI2MDQsNyArMjcwOSw3IEBACiAKIHN0YXRpYyBpbnQgcm9ja2VyX2dyb3VwX2wyX2ludGVyZmFjZShzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAogCQkJCSAgICAgaW50IGZsYWdzLCBfX2JlMTYgdmxhbl9pZCwKLQkJCQkgICAgIHUzMiBvdXRfbHBvcnQsIGludCBwb3BfdmxhbikKKwkJCQkgICAgIHUzMiBvdXRfcHBvcnQsIGludCBwb3BfdmxhbikKIHsKIAlzdHJ1Y3Qgcm9ja2VyX2dyb3VwX3RibF9lbnRyeSAqZW50cnk7CiAKQEAgLTI2MTIsNyArMjcxNyw3IEBACiAJaWYgKCFlbnRyeSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQllbnRyeS0+Z3JvdXBfaWQgPSBST0NLRVJfR1JPVVBfTDJfSU5URVJGQUNFKHZsYW5faWQsIG91dF9scG9ydCk7CisJZW50cnktPmdyb3VwX2lkID0gUk9DS0VSX0dST1VQX0wyX0lOVEVSRkFDRSh2bGFuX2lkLCBvdXRfcHBvcnQpOwogCWVudHJ5LT5sMl9pbnRlcmZhY2UucG9wX3ZsYW4gPSBwb3BfdmxhbjsKIAogCXJldHVybiByb2NrZXJfZ3JvdXBfdGJsX2RvKHJvY2tlcl9wb3J0LCBmbGFncywgZW50cnkpOwpAQCAtMjY1MiwxNyArMjc1NywyNjIgQEAKIAkJCQkgICAgICAgZ3JvdXBfaWQpOwogfQogCitzdGF0aWMgaW50IHJvY2tlcl9ncm91cF9sM191bmljYXN0KHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCisJCQkJICAgaW50IGZsYWdzLCB1MzIgaW5kZXgsIHU4ICpzcmNfbWFjLAorCQkJCSAgIHU4ICpkc3RfbWFjLCBfX2JlMTYgdmxhbl9pZCwKKwkJCQkgICBib29sIHR0bF9jaGVjaywgdTMyIHBwb3J0KQoreworCXN0cnVjdCByb2NrZXJfZ3JvdXBfdGJsX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgcm9ja2VyX29wX2ZsYWdzX2dmcChmbGFncykpOworCWlmICghZW50cnkpCisJCXJldHVybiAtRU5PTUVNOworCisJZW50cnktPmdyb3VwX2lkID0gUk9DS0VSX0dST1VQX0wzX1VOSUNBU1QoaW5kZXgpOworCWlmIChzcmNfbWFjKQorCQlldGhlcl9hZGRyX2NvcHkoZW50cnktPmwzX3VuaWNhc3QuZXRoX3NyYywgc3JjX21hYyk7CisJaWYgKGRzdF9tYWMpCisJCWV0aGVyX2FkZHJfY29weShlbnRyeS0+bDNfdW5pY2FzdC5ldGhfZHN0LCBkc3RfbWFjKTsKKwllbnRyeS0+bDNfdW5pY2FzdC52bGFuX2lkID0gdmxhbl9pZDsKKwllbnRyeS0+bDNfdW5pY2FzdC50dGxfY2hlY2sgPSB0dGxfY2hlY2s7CisJZW50cnktPmwzX3VuaWNhc3QuZ3JvdXBfaWQgPSBST0NLRVJfR1JPVVBfTDJfSU5URVJGQUNFKHZsYW5faWQsIHBwb3J0KTsKKworCXJldHVybiByb2NrZXJfZ3JvdXBfdGJsX2RvKHJvY2tlcl9wb3J0LCBmbGFncywgZW50cnkpOworfQorCitzdGF0aWMgc3RydWN0IHJvY2tlcl9uZWlnaF90YmxfZW50cnkgKgorCXJvY2tlcl9uZWlnaF90YmxfZmluZChzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsIF9fYmUzMiBpcF9hZGRyKQoreworCXN0cnVjdCByb2NrZXJfbmVpZ2hfdGJsX2VudHJ5ICpmb3VuZDsKKworCWhhc2hfZm9yX2VhY2hfcG9zc2libGUocm9ja2VyLT5uZWlnaF90YmwsIGZvdW5kLAorCQkJICAgICAgIGVudHJ5LCBiZTMyX3RvX2NwdShpcF9hZGRyKSkKKwkJaWYgKGZvdW5kLT5pcF9hZGRyID09IGlwX2FkZHIpCisJCQlyZXR1cm4gZm91bmQ7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgX3JvY2tlcl9uZWlnaF9hZGQoc3RydWN0IHJvY2tlciAqcm9ja2VyLAorCQkJICAgICAgc3RydWN0IHJvY2tlcl9uZWlnaF90YmxfZW50cnkgKmVudHJ5KQoreworCWVudHJ5LT5pbmRleCA9IHJvY2tlci0+bmVpZ2hfdGJsX25leHRfaW5kZXgrKzsKKwllbnRyeS0+cmVmX2NvdW50Kys7CisJaGFzaF9hZGQocm9ja2VyLT5uZWlnaF90YmwsICZlbnRyeS0+ZW50cnksCisJCSBiZTMyX3RvX2NwdShlbnRyeS0+aXBfYWRkcikpOworfQorCitzdGF0aWMgdm9pZCBfcm9ja2VyX25laWdoX2RlbChzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsCisJCQkgICAgICBzdHJ1Y3Qgcm9ja2VyX25laWdoX3RibF9lbnRyeSAqZW50cnkpCit7CisJaWYgKC0tZW50cnktPnJlZl9jb3VudCA9PSAwKSB7CisJCWhhc2hfZGVsKCZlbnRyeS0+ZW50cnkpOworCQlrZnJlZShlbnRyeSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfcm9ja2VyX25laWdoX3VwZGF0ZShzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsCisJCQkJIHN0cnVjdCByb2NrZXJfbmVpZ2hfdGJsX2VudHJ5ICplbnRyeSwKKwkJCQkgdTggKmV0aF9kc3QsIGJvb2wgdHRsX2NoZWNrKQoreworCWlmIChldGhfZHN0KSB7CisJCWV0aGVyX2FkZHJfY29weShlbnRyeS0+ZXRoX2RzdCwgZXRoX2RzdCk7CisJCWVudHJ5LT50dGxfY2hlY2sgPSB0dGxfY2hlY2s7CisJfSBlbHNlIHsKKwkJZW50cnktPnJlZl9jb3VudCsrOworCX0KK30KKworc3RhdGljIGludCByb2NrZXJfcG9ydF9pcHY0X25laWdoKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCisJCQkJICBpbnQgZmxhZ3MsIF9fYmUzMiBpcF9hZGRyLCB1OCAqZXRoX2RzdCkKK3sKKwlzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIgPSByb2NrZXJfcG9ydC0+cm9ja2VyOworCXN0cnVjdCByb2NrZXJfbmVpZ2hfdGJsX2VudHJ5ICplbnRyeTsKKwlzdHJ1Y3Qgcm9ja2VyX25laWdoX3RibF9lbnRyeSAqZm91bmQ7CisJdW5zaWduZWQgbG9uZyBsb2NrX2ZsYWdzOworCV9fYmUxNiBldGhfdHlwZSA9IGh0b25zKEVUSF9QX0lQKTsKKwllbnVtIHJvY2tlcl9vZl9kcGFfdGFibGVfaWQgZ290b190YmwgPQorCQlST0NLRVJfT0ZfRFBBX1RBQkxFX0lEX0FDTF9QT0xJQ1k7CisJdTMyIGdyb3VwX2lkOworCXUzMiBwcmlvcml0eSA9IDA7CisJYm9vbCBhZGRpbmcgPSAhKGZsYWdzICYgUk9DS0VSX09QX0ZMQUdfUkVNT1ZFKTsKKwlib29sIHVwZGF0aW5nOworCWJvb2wgcmVtb3Zpbmc7CisJaW50IGVyciA9IDA7CisKKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIHJvY2tlcl9vcF9mbGFnc19nZnAoZmxhZ3MpKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyb2NrZXItPm5laWdoX3RibF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWZvdW5kID0gcm9ja2VyX25laWdoX3RibF9maW5kKHJvY2tlciwgaXBfYWRkcik7CisKKwl1cGRhdGluZyA9IGZvdW5kICYmIGFkZGluZzsKKwlyZW1vdmluZyA9IGZvdW5kICYmICFhZGRpbmc7CisJYWRkaW5nID0gIWZvdW5kICYmIGFkZGluZzsKKworCWlmIChhZGRpbmcpIHsKKwkJZW50cnktPmlwX2FkZHIgPSBpcF9hZGRyOworCQllbnRyeS0+ZGV2ID0gcm9ja2VyX3BvcnQtPmRldjsKKwkJZXRoZXJfYWRkcl9jb3B5KGVudHJ5LT5ldGhfZHN0LCBldGhfZHN0KTsKKwkJZW50cnktPnR0bF9jaGVjayA9IHRydWU7CisJCV9yb2NrZXJfbmVpZ2hfYWRkKHJvY2tlciwgZW50cnkpOworCX0gZWxzZSBpZiAocmVtb3ZpbmcpIHsKKwkJbWVtY3B5KGVudHJ5LCBmb3VuZCwgc2l6ZW9mKCplbnRyeSkpOworCQlfcm9ja2VyX25laWdoX2RlbChyb2NrZXIsIGZvdW5kKTsKKwl9IGVsc2UgaWYgKHVwZGF0aW5nKSB7CisJCV9yb2NrZXJfbmVpZ2hfdXBkYXRlKHJvY2tlciwgZm91bmQsIGV0aF9kc3QsIHRydWUpOworCQltZW1jcHkoZW50cnksIGZvdW5kLCBzaXplb2YoKmVudHJ5KSk7CisJfSBlbHNlIHsKKwkJZXJyID0gLUVOT0VOVDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyb2NrZXItPm5laWdoX3RibF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWlmIChlcnIpCisJCWdvdG8gZXJyX291dDsKKworCS8qIEZvciBlYWNoIGFjdGl2ZSBuZWlnaGJvciwgd2UgaGF2ZSBhbiBMMyB1bmljYXN0IGdyb3VwIGFuZAorCSAqIGEgLzMyIHJvdXRlIHRvIHRoZSBuZWlnaGJvciwgd2hpY2ggdXNlcyB0aGUgTDMgdW5pY2FzdAorCSAqIGdyb3VwLiAgVGhlIEwzIHVuaWNhc3QgZ3JvdXAgY2FuIGFsc28gYmUgcmVmZXJyZWQgdG8gYnkKKwkgKiBvdGhlciByb3V0ZXMnIG5leHRob3BzLgorCSAqLworCisJZXJyID0gcm9ja2VyX2dyb3VwX2wzX3VuaWNhc3Qocm9ja2VyX3BvcnQsIGZsYWdzLAorCQkJCSAgICAgIGVudHJ5LT5pbmRleCwKKwkJCQkgICAgICByb2NrZXJfcG9ydC0+ZGV2LT5kZXZfYWRkciwKKwkJCQkgICAgICBlbnRyeS0+ZXRoX2RzdCwKKwkJCQkgICAgICByb2NrZXJfcG9ydC0+aW50ZXJuYWxfdmxhbl9pZCwKKwkJCQkgICAgICBlbnRyeS0+dHRsX2NoZWNrLAorCQkJCSAgICAgIHJvY2tlcl9wb3J0LT5wcG9ydCk7CisJaWYgKGVycikgeworCQluZXRkZXZfZXJyKHJvY2tlcl9wb3J0LT5kZXYsCisJCQkgICAiRXJyb3IgKCVkKSBMMyB1bmljYXN0IGdyb3VwIGluZGV4ICVkXG4iLAorCQkJICAgZXJyLCBlbnRyeS0+aW5kZXgpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKGFkZGluZyB8fCByZW1vdmluZykgeworCQlncm91cF9pZCA9IFJPQ0tFUl9HUk9VUF9MM19VTklDQVNUKGVudHJ5LT5pbmRleCk7CisJCWVyciA9IHJvY2tlcl9mbG93X3RibF91Y2FzdDRfcm91dGluZyhyb2NrZXJfcG9ydCwKKwkJCQkJCSAgICAgZXRoX3R5cGUsIGlwX2FkZHIsCisJCQkJCQkgICAgIGluZXRfbWFrZV9tYXNrKDMyKSwKKwkJCQkJCSAgICAgcHJpb3JpdHksIGdvdG9fdGJsLAorCQkJCQkJICAgICBncm91cF9pZCwgZmxhZ3MpOworCisJCWlmIChlcnIpCisJCQluZXRkZXZfZXJyKHJvY2tlcl9wb3J0LT5kZXYsCisJCQkJICAgIkVycm9yICglZCkgLzMyIHVuaWNhc3Qgcm91dGUgJXBJNCBncm91cCAweCUwOHhcbiIsCisJCQkJICAgZXJyLCAmZW50cnktPmlwX2FkZHIsIGdyb3VwX2lkKTsKKwl9CisKK2Vycl9vdXQ6CisJaWYgKCFhZGRpbmcpCisJCWtmcmVlKGVudHJ5KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2VyX3BvcnRfaXB2NF9yZXNvbHZlKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQsCisJCQkJICAgIF9fYmUzMiBpcF9hZGRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSByb2NrZXJfcG9ydC0+ZGV2OworCXN0cnVjdCBuZWlnaGJvdXIgKm4gPSBfX2lwdjRfbmVpZ2hfbG9va3VwKGRldiwgKF9fZm9yY2UgdTMyKWlwX2FkZHIpOworCWludCBlcnIgPSAwOworCisJaWYgKCFuKQorCQluID0gbmVpZ2hfY3JlYXRlKCZhcnBfdGJsLCAmaXBfYWRkciwgZGV2KTsKKwlpZiAoIW4pCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSWYgdGhlIG5laWdoIGlzIGFscmVhZHkgcmVzb2x2ZWQsIHRoZW4gZ28gYWhlYWQgYW5kCisJICogaW5zdGFsbCB0aGUgZW50cnksIG90aGVyd2lzZSBzdGFydCB0aGUgQVJQIHByb2Nlc3MgdG8KKwkgKiByZXNvbHZlIHRoZSBuZWlnaC4KKwkgKi8KKworCWlmIChuLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpCisJCWVyciA9IHJvY2tlcl9wb3J0X2lwdjRfbmVpZ2gocm9ja2VyX3BvcnQsIDAsIGlwX2FkZHIsIG4tPmhhKTsKKwllbHNlCisJCW5laWdoX2V2ZW50X3NlbmQobiwgTlVMTCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJvY2tlcl9wb3J0X2lwdjRfbmgoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwgaW50IGZsYWdzLAorCQkJICAgICAgIF9fYmUzMiBpcF9hZGRyLCB1MzIgKmluZGV4KQoreworCXN0cnVjdCByb2NrZXIgKnJvY2tlciA9IHJvY2tlcl9wb3J0LT5yb2NrZXI7CisJc3RydWN0IHJvY2tlcl9uZWlnaF90YmxfZW50cnkgKmVudHJ5OworCXN0cnVjdCByb2NrZXJfbmVpZ2hfdGJsX2VudHJ5ICpmb3VuZDsKKwl1bnNpZ25lZCBsb25nIGxvY2tfZmxhZ3M7CisJYm9vbCBhZGRpbmcgPSAhKGZsYWdzICYgUk9DS0VSX09QX0ZMQUdfUkVNT1ZFKTsKKwlib29sIHVwZGF0aW5nOworCWJvb2wgcmVtb3Zpbmc7CisJYm9vbCByZXNvbHZlZCA9IHRydWU7CisJaW50IGVyciA9IDA7CisKKwllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIHJvY2tlcl9vcF9mbGFnc19nZnAoZmxhZ3MpKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyb2NrZXItPm5laWdoX3RibF9sb2NrLCBsb2NrX2ZsYWdzKTsKKworCWZvdW5kID0gcm9ja2VyX25laWdoX3RibF9maW5kKHJvY2tlciwgaXBfYWRkcik7CisJaWYgKGZvdW5kKQorCQkqaW5kZXggPSBmb3VuZC0+aW5kZXg7CisKKwl1cGRhdGluZyA9IGZvdW5kICYmIGFkZGluZzsKKwlyZW1vdmluZyA9IGZvdW5kICYmICFhZGRpbmc7CisJYWRkaW5nID0gIWZvdW5kICYmIGFkZGluZzsKKworCWlmIChhZGRpbmcpIHsKKwkJZW50cnktPmlwX2FkZHIgPSBpcF9hZGRyOworCQllbnRyeS0+ZGV2ID0gcm9ja2VyX3BvcnQtPmRldjsKKwkJX3JvY2tlcl9uZWlnaF9hZGQocm9ja2VyLCBlbnRyeSk7CisJCSppbmRleCA9IGVudHJ5LT5pbmRleDsKKwkJcmVzb2x2ZWQgPSBmYWxzZTsKKwl9IGVsc2UgaWYgKHJlbW92aW5nKSB7CisJCV9yb2NrZXJfbmVpZ2hfZGVsKHJvY2tlciwgZm91bmQpOworCX0gZWxzZSBpZiAodXBkYXRpbmcpIHsKKwkJX3JvY2tlcl9uZWlnaF91cGRhdGUocm9ja2VyLCBmb3VuZCwgTlVMTCwgZmFsc2UpOworCQlyZXNvbHZlZCA9ICFpc196ZXJvX2V0aGVyX2FkZHIoZm91bmQtPmV0aF9kc3QpOworCX0gZWxzZSB7CisJCWVyciA9IC1FTk9FTlQ7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm9ja2VyLT5uZWlnaF90YmxfbG9jaywgbG9ja19mbGFncyk7CisKKwlpZiAoIWFkZGluZykKKwkJa2ZyZWUoZW50cnkpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFJlc29sdmVkIG1lYW5zIG5laWdoIGlwX2FkZHIgaXMgcmVzb2x2ZWQgdG8gbmVpZ2ggbWFjLiAqLworCisJaWYgKCFyZXNvbHZlZCkKKwkJZXJyID0gcm9ja2VyX3BvcnRfaXB2NF9yZXNvbHZlKHJvY2tlcl9wb3J0LCBpcF9hZGRyKTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBpbnQgcm9ja2VyX3BvcnRfdmxhbl9mbG9vZF9ncm91cChzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LAogCQkJCQlpbnQgZmxhZ3MsIF9fYmUxNiB2bGFuX2lkKQogewogCXN0cnVjdCByb2NrZXJfcG9ydCAqcDsKIAlzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIgPSByb2NrZXJfcG9ydC0+cm9ja2VyOwogCXUzMiBncm91cF9pZCA9IFJPQ0tFUl9HUk9VUF9MMl9GTE9PRCh2bGFuX2lkLCAwKTsKLQl1MzIgZ3JvdXBfaWRzW3JvY2tlci0+cG9ydF9jb3VudF07CisJdTMyICpncm91cF9pZHM7CiAJdTggZ3JvdXBfY291bnQgPSAwOwotCWludCBlcnI7CisJaW50IGVyciA9IDA7CiAJaW50IGk7CiAKKwlncm91cF9pZHMgPSBrY2FsbG9jKHJvY2tlci0+cG9ydF9jb3VudCwgc2l6ZW9mKHUzMiksCisJCQkgICAgcm9ja2VyX29wX2ZsYWdzX2dmcChmbGFncykpOworCWlmICghZ3JvdXBfaWRzKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCS8qIEFkanVzdCB0aGUgZmxvb2QgZ3JvdXAgZm9yIHRoaXMgVkxBTi4gIFRoZSBmbG9vZCBncm91cAogCSAqIHJlZmVyZW5jZXMgYW4gTDIgaW50ZXJmYWNlIGdyb3VwIGZvciBlYWNoIHBvcnQgaW4gdGhpcwogCSAqIFZMQU4uCkBAIC0yNjc0LDE0ICszMDI0LDEzIEBACiAJCQljb250aW51ZTsKIAkJaWYgKHRlc3RfYml0KG50b2hzKHZsYW5faWQpLCBwLT52bGFuX2JpdG1hcCkpIHsKIAkJCWdyb3VwX2lkc1tncm91cF9jb3VudCsrXSA9Ci0JCQkJUk9DS0VSX0dST1VQX0wyX0lOVEVSRkFDRSh2bGFuX2lkLAotCQkJCQkJCSAgcC0+bHBvcnQpOworCQkJCVJPQ0tFUl9HUk9VUF9MMl9JTlRFUkZBQ0Uodmxhbl9pZCwgcC0+cHBvcnQpOwogCQl9CiAJfQogCiAJLyogSWYgdGhlcmUgYXJlIG5vIGJyaWRnZWQgcG9ydHMgaW4gdGhpcyBWTEFOLCB3ZSdyZSBkb25lICovCiAJaWYgKGdyb3VwX2NvdW50ID09IDApCi0JCXJldHVybiAwOworCQlnb3RvIG5vX3BvcnRzX2luX3ZsYW47CiAKIAllcnIgPSByb2NrZXJfZ3JvdXBfbDJfZmxvb2Qocm9ja2VyX3BvcnQsIGZsYWdzLCB2bGFuX2lkLAogCQkJCSAgICBncm91cF9jb3VudCwgZ3JvdXBfaWRzLApAQCAtMjY5MCw2ICszMDM5LDggQEAKIAkJbmV0ZGV2X2Vycihyb2NrZXJfcG9ydC0+ZGV2LAogCQkJICAgIkVycm9yICglZCkgcG9ydCBWTEFOIGwyIGZsb29kIGdyb3VwXG4iLCBlcnIpOwogCitub19wb3J0c19pbl92bGFuOgorCWtmcmVlKGdyb3VwX2lkcyk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjcwMCw3ICszMDUxLDcgQEAKIAlzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIgPSByb2NrZXJfcG9ydC0+cm9ja2VyOwogCXN0cnVjdCByb2NrZXJfcG9ydCAqcDsKIAlib29sIGFkZGluZyA9ICEoZmxhZ3MgJiBST0NLRVJfT1BfRkxBR19SRU1PVkUpOwotCXUzMiBvdXRfbHBvcnQ7CisJdTMyIG91dF9wcG9ydDsKIAlpbnQgcmVmID0gMDsKIAlpbnQgZXJyOwogCWludCBpOwpAQCAtMjcxMSwxNCArMzA2MiwxNCBAQAogCiAJaWYgKHJvY2tlcl9wb3J0LT5zdHBfc3RhdGUgPT0gQlJfU1RBVEVfTEVBUk5JTkcgfHwKIAkgICAgcm9ja2VyX3BvcnQtPnN0cF9zdGF0ZSA9PSBCUl9TVEFURV9GT1JXQVJESU5HKSB7Ci0JCW91dF9scG9ydCA9IHJvY2tlcl9wb3J0LT5scG9ydDsKKwkJb3V0X3Bwb3J0ID0gcm9ja2VyX3BvcnQtPnBwb3J0OwogCQllcnIgPSByb2NrZXJfZ3JvdXBfbDJfaW50ZXJmYWNlKHJvY2tlcl9wb3J0LCBmbGFncywKLQkJCQkJCXZsYW5faWQsIG91dF9scG9ydCwKKwkJCQkJCXZsYW5faWQsIG91dF9wcG9ydCwKIAkJCQkJCXBvcF92bGFuKTsKIAkJaWYgKGVycikgewogCQkJbmV0ZGV2X2Vycihyb2NrZXJfcG9ydC0+ZGV2LAotCQkJCSAgICJFcnJvciAoJWQpIHBvcnQgVkxBTiBsMiBncm91cCBmb3IgbHBvcnQgJWRcbiIsCi0JCQkJICAgZXJyLCBvdXRfbHBvcnQpOworCQkJCSAgICJFcnJvciAoJWQpIHBvcnQgVkxBTiBsMiBncm91cCBmb3IgcHBvcnQgJWRcbiIsCisJCQkJICAgZXJyLCBvdXRfcHBvcnQpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTI3MzcsOSArMzA4OCw5IEBACiAJaWYgKCghYWRkaW5nIHx8IHJlZiAhPSAxKSAmJiAoYWRkaW5nIHx8IHJlZiAhPSAwKSkKIAkJcmV0dXJuIDA7CiAKLQlvdXRfbHBvcnQgPSAwOworCW91dF9wcG9ydCA9IDA7CiAJZXJyID0gcm9ja2VyX2dyb3VwX2wyX2ludGVyZmFjZShyb2NrZXJfcG9ydCwgZmxhZ3MsCi0JCQkJCXZsYW5faWQsIG91dF9scG9ydCwKKwkJCQkJdmxhbl9pZCwgb3V0X3Bwb3J0LAogCQkJCQlwb3Bfdmxhbik7CiAJaWYgKGVycikgewogCQluZXRkZXZfZXJyKHJvY2tlcl9wb3J0LT5kZXYsCkBAIC0yNzk5LDkgKzMxNTAsOSBAQAogCQkJCSAgICAgaW50IGZsYWdzLCBzdHJ1Y3Qgcm9ja2VyX2N0cmwgKmN0cmwsCiAJCQkJICAgICBfX2JlMTYgdmxhbl9pZCkKIHsKLQl1MzIgaW5fbHBvcnQgPSByb2NrZXJfcG9ydC0+bHBvcnQ7Ci0JdTMyIGluX2xwb3J0X21hc2sgPSAweGZmZmZmZmZmOwotCXUzMiBvdXRfbHBvcnQgPSAwOworCXUzMiBpbl9wcG9ydCA9IHJvY2tlcl9wb3J0LT5wcG9ydDsKKwl1MzIgaW5fcHBvcnRfbWFzayA9IDB4ZmZmZmZmZmY7CisJdTMyIG91dF9wcG9ydCA9IDA7CiAJdTggKmV0aF9zcmMgPSBOVUxMOwogCXU4ICpldGhfc3JjX21hc2sgPSBOVUxMOwogCV9fYmUxNiB2bGFuX2lkX21hc2sgPSBodG9ucygweGZmZmYpOwpAQCAtMjgwOSwxMSArMzE2MCwxMSBAQAogCXU4IGlwX3Byb3RvX21hc2sgPSAwOwogCXU4IGlwX3RvcyA9IDA7CiAJdTggaXBfdG9zX21hc2sgPSAwOwotCXUzMiBncm91cF9pZCA9IFJPQ0tFUl9HUk9VUF9MMl9JTlRFUkZBQ0Uodmxhbl9pZCwgb3V0X2xwb3J0KTsKKwl1MzIgZ3JvdXBfaWQgPSBST0NLRVJfR1JPVVBfTDJfSU5URVJGQUNFKHZsYW5faWQsIG91dF9wcG9ydCk7CiAJaW50IGVycjsKIAogCWVyciA9IHJvY2tlcl9mbG93X3RibF9hY2wocm9ja2VyX3BvcnQsIGZsYWdzLAotCQkJCSAgaW5fbHBvcnQsIGluX2xwb3J0X21hc2ssCisJCQkJICBpbl9wcG9ydCwgaW5fcHBvcnRfbWFzaywKIAkJCQkgIGV0aF9zcmMsIGV0aF9zcmNfbWFzaywKIAkJCQkgIGN0cmwtPmV0aF9kc3QsIGN0cmwtPmV0aF9kc3RfbWFzaywKIAkJCQkgIGN0cmwtPmV0aF90eXBlLApAQCAtMjg1Niw3ICszMjA3LDcgQEAKIAkJCQkgICAgICBpbnQgZmxhZ3MsIHN0cnVjdCByb2NrZXJfY3RybCAqY3RybCwKIAkJCQkgICAgICBfX2JlMTYgdmxhbl9pZCkKIHsKLQl1MzIgaW5fbHBvcnRfbWFzayA9IDB4ZmZmZmZmZmY7CisJdTMyIGluX3Bwb3J0X21hc2sgPSAweGZmZmZmZmZmOwogCV9fYmUxNiB2bGFuX2lkX21hc2sgPSBodG9ucygweGZmZmYpOwogCWludCBlcnI7CiAKQEAgLTI4NjQsNyArMzIxNSw3IEBACiAJCXZsYW5faWQgPSByb2NrZXJfcG9ydC0+aW50ZXJuYWxfdmxhbl9pZDsKIAogCWVyciA9IHJvY2tlcl9mbG93X3RibF90ZXJtX21hYyhyb2NrZXJfcG9ydCwKLQkJCQkgICAgICAgcm9ja2VyX3BvcnQtPmxwb3J0LCBpbl9scG9ydF9tYXNrLAorCQkJCSAgICAgICByb2NrZXJfcG9ydC0+cHBvcnQsIGluX3Bwb3J0X21hc2ssCiAJCQkJICAgICAgIGN0cmwtPmV0aF90eXBlLCBjdHJsLT5ldGhfZHN0LAogCQkJCSAgICAgICBjdHJsLT5ldGhfZHN0X21hc2ssIHZsYW5faWQsCiAJCQkJICAgICAgIHZsYW5faWRfbWFzaywgY3RybC0+Y29weV90b19jcHUsCkBAIC0yOTM0LDcgKzMyODUsNyBAQAogewogCWVudW0gcm9ja2VyX29mX2RwYV90YWJsZV9pZCBnb3RvX3RibCA9CiAJCVJPQ0tFUl9PRl9EUEFfVEFCTEVfSURfVEVSTUlOQVRJT05fTUFDOwotCXUzMiBpbl9scG9ydCA9IHJvY2tlcl9wb3J0LT5scG9ydDsKKwl1MzIgaW5fcHBvcnQgPSByb2NrZXJfcG9ydC0+cHBvcnQ7CiAJX19iZTE2IHZsYW5faWQgPSBodG9ucyh2aWQpOwogCV9fYmUxNiB2bGFuX2lkX21hc2sgPSBodG9ucygweGZmZmYpOwogCV9fYmUxNiBpbnRlcm5hbF92bGFuX2lkOwpAQCAtMjk3OCw3ICszMzI5LDcgQEAKIAl9CiAKIAllcnIgPSByb2NrZXJfZmxvd190Ymxfdmxhbihyb2NrZXJfcG9ydCwgZmxhZ3MsCi0JCQkJICAgaW5fbHBvcnQsIHZsYW5faWQsIHZsYW5faWRfbWFzaywKKwkJCQkgICBpbl9wcG9ydCwgdmxhbl9pZCwgdmxhbl9pZF9tYXNrLAogCQkJCSAgIGdvdG9fdGJsLCB1bnRhZ2dlZCwgaW50ZXJuYWxfdmxhbl9pZCk7CiAJaWYgKGVycikKIAkJbmV0ZGV2X2Vycihyb2NrZXJfcG9ydC0+ZGV2LApAQCAtMjk5MCwyMCArMzM0MSwyMCBAQAogc3RhdGljIGludCByb2NrZXJfcG9ydF9pZ190Ymwoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwgaW50IGZsYWdzKQogewogCWVudW0gcm9ja2VyX29mX2RwYV90YWJsZV9pZCBnb3RvX3RibDsKLQl1MzIgaW5fbHBvcnQ7Ci0JdTMyIGluX2xwb3J0X21hc2s7CisJdTMyIGluX3Bwb3J0OworCXUzMiBpbl9wcG9ydF9tYXNrOwogCWludCBlcnI7CiAKIAkvKiBOb3JtYWwgRXRoZXJuZXQgRnJhbWVzLiAgTWF0Y2hlcyBwa3RzIGZyb20gYW55IGxvY2FsIHBoeXNpY2FsCiAJICogcG9ydHMuICBHb3RvIFZMQU4gdGJsLgogCSAqLwogCi0JaW5fbHBvcnQgPSAwOwotCWluX2xwb3J0X21hc2sgPSAweGZmZmYwMDAwOworCWluX3Bwb3J0ID0gMDsKKwlpbl9wcG9ydF9tYXNrID0gMHhmZmZmMDAwMDsKIAlnb3RvX3RibCA9IFJPQ0tFUl9PRl9EUEFfVEFCTEVfSURfVkxBTjsKIAogCWVyciA9IHJvY2tlcl9mbG93X3RibF9pZ19wb3J0KHJvY2tlcl9wb3J0LCBmbGFncywKLQkJCQkgICAgICBpbl9scG9ydCwgaW5fbHBvcnRfbWFzaywKKwkJCQkgICAgICBpbl9wcG9ydCwgaW5fcHBvcnRfbWFzaywKIAkJCQkgICAgICBnb3RvX3RibCk7CiAJaWYgKGVycikKIAkJbmV0ZGV2X2Vycihyb2NrZXJfcG9ydC0+ZGV2LApAQCAtMzA0Nyw3ICszMzk4LDcgQEAKIAlzdHJ1Y3Qgcm9ja2VyX2ZkYl9sZWFybl93b3JrICpsdzsKIAllbnVtIHJvY2tlcl9vZl9kcGFfdGFibGVfaWQgZ290b190YmwgPQogCQlST0NLRVJfT0ZfRFBBX1RBQkxFX0lEX0FDTF9QT0xJQ1k7Ci0JdTMyIG91dF9scG9ydCA9IHJvY2tlcl9wb3J0LT5scG9ydDsKKwl1MzIgb3V0X3Bwb3J0ID0gcm9ja2VyX3BvcnQtPnBwb3J0OwogCXUzMiB0dW5uZWxfaWQgPSAwOwogCXUzMiBncm91cF9pZCA9IFJPQ0tFUl9HUk9VUF9OT05FOwogCWJvb2wgc3luY2luZyA9ICEhKHJvY2tlcl9wb3J0LT5icnBvcnRfZmxhZ3MgJiBCUl9MRUFSTklOR19TWU5DKTsKQEAgLTMwNTUsNyArMzQwNiw3IEBACiAJaW50IGVycjsKIAogCWlmIChyb2NrZXJfcG9ydF9pc19icmlkZ2VkKHJvY2tlcl9wb3J0KSkKLQkJZ3JvdXBfaWQgPSBST0NLRVJfR1JPVVBfTDJfSU5URVJGQUNFKHZsYW5faWQsIG91dF9scG9ydCk7CisJCWdyb3VwX2lkID0gUk9DS0VSX0dST1VQX0wyX0lOVEVSRkFDRSh2bGFuX2lkLCBvdXRfcHBvcnQpOwogCiAJaWYgKCEoZmxhZ3MgJiBST0NLRVJfT1BfRkxBR19SRUZSRVNIKSkgewogCQllcnIgPSByb2NrZXJfZmxvd190YmxfYnJpZGdlKHJvY2tlcl9wb3J0LCBmbGFncywgYWRkciwgTlVMTCwKQEAgLTMxMTQsNyArMzQ2NSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZmRiLT5sZWFybmVkID0gKGZsYWdzICYgUk9DS0VSX09QX0ZMQUdfTEVBUk5FRCk7Ci0JZmRiLT5rZXkubHBvcnQgPSByb2NrZXJfcG9ydC0+bHBvcnQ7CisJZmRiLT5rZXkucHBvcnQgPSByb2NrZXJfcG9ydC0+cHBvcnQ7CiAJZXRoZXJfYWRkcl9jb3B5KGZkYi0+a2V5LmFkZHIsIGFkZHIpOwogCWZkYi0+a2V5LnZsYW5faWQgPSB2bGFuX2lkOwogCWZkYi0+a2V5X2NyYzMyID0gY3JjMzIofjAsICZmZGItPmtleSwgc2l6ZW9mKGZkYi0+a2V5KSk7CkBAIC0zMTYxLDcgKzM1MTIsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZyb2NrZXItPmZkYl90YmxfbG9jaywgbG9ja19mbGFncyk7CiAKIAloYXNoX2Zvcl9lYWNoX3NhZmUocm9ja2VyLT5mZGJfdGJsLCBia3QsIHRtcCwgZm91bmQsIGVudHJ5KSB7Ci0JCWlmIChmb3VuZC0+a2V5Lmxwb3J0ICE9IHJvY2tlcl9wb3J0LT5scG9ydCkKKwkJaWYgKGZvdW5kLT5rZXkucHBvcnQgIT0gcm9ja2VyX3BvcnQtPnBwb3J0KQogCQkJY29udGludWU7CiAJCWlmICghZm91bmQtPmxlYXJuZWQpCiAJCQljb250aW51ZTsKQEAgLTMxODIsNyArMzUzMyw3IEBACiBzdGF0aWMgaW50IHJvY2tlcl9wb3J0X3JvdXRlcl9tYWMoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCwKIAkJCQkgIGludCBmbGFncywgX19iZTE2IHZsYW5faWQpCiB7Ci0JdTMyIGluX2xwb3J0X21hc2sgPSAweGZmZmZmZmZmOworCXUzMiBpbl9wcG9ydF9tYXNrID0gMHhmZmZmZmZmZjsKIAlfX2JlMTYgZXRoX3R5cGU7CiAJY29uc3QgdTggKmRzdF9tYWNfbWFzayA9IGZmX21hYzsKIAlfX2JlMTYgdmxhbl9pZF9tYXNrID0gaHRvbnMoMHhmZmZmKTsKQEAgLTMxOTQsNyArMzU0NSw3IEBACiAKIAlldGhfdHlwZSA9IGh0b25zKEVUSF9QX0lQKTsKIAllcnIgPSByb2NrZXJfZmxvd190YmxfdGVybV9tYWMocm9ja2VyX3BvcnQsCi0JCQkJICAgICAgIHJvY2tlcl9wb3J0LT5scG9ydCwgaW5fbHBvcnRfbWFzaywKKwkJCQkgICAgICAgcm9ja2VyX3BvcnQtPnBwb3J0LCBpbl9wcG9ydF9tYXNrLAogCQkJCSAgICAgICBldGhfdHlwZSwgcm9ja2VyX3BvcnQtPmRldi0+ZGV2X2FkZHIsCiAJCQkJICAgICAgIGRzdF9tYWNfbWFzaywgdmxhbl9pZCwgdmxhbl9pZF9tYXNrLAogCQkJCSAgICAgICBjb3B5X3RvX2NwdSwgZmxhZ3MpOwpAQCAtMzIwMyw3ICszNTU0LDcgQEAKIAogCWV0aF90eXBlID0gaHRvbnMoRVRIX1BfSVBWNik7CiAJZXJyID0gcm9ja2VyX2Zsb3dfdGJsX3Rlcm1fbWFjKHJvY2tlcl9wb3J0LAotCQkJCSAgICAgICByb2NrZXJfcG9ydC0+bHBvcnQsIGluX2xwb3J0X21hc2ssCisJCQkJICAgICAgIHJvY2tlcl9wb3J0LT5wcG9ydCwgaW5fcHBvcnRfbWFzaywKIAkJCQkgICAgICAgZXRoX3R5cGUsIHJvY2tlcl9wb3J0LT5kZXYtPmRldl9hZGRyLAogCQkJCSAgICAgICBkc3RfbWFjX21hc2ssIHZsYW5faWQsIHZsYW5faWRfbWFzaywKIAkJCQkgICAgICAgY29weV90b19jcHUsIGZsYWdzKTsKQEAgLTMyMTQsNyArMzU2NSw3IEBACiBzdGF0aWMgaW50IHJvY2tlcl9wb3J0X2Z3ZGluZyhzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0KQogewogCWJvb2wgcG9wX3ZsYW47Ci0JdTMyIG91dF9scG9ydDsKKwl1MzIgb3V0X3Bwb3J0OwogCV9fYmUxNiB2bGFuX2lkOwogCXUxNiB2aWQ7CiAJaW50IGZsYWdzID0gUk9DS0VSX09QX0ZMQUdfTk9XQUlUOwpAQCAtMzIzMSwxOSArMzU4MiwxOSBAQAogCSAgICByb2NrZXJfcG9ydC0+c3RwX3N0YXRlICE9IEJSX1NUQVRFX0ZPUldBUkRJTkcpCiAJCWZsYWdzIHw9IFJPQ0tFUl9PUF9GTEFHX1JFTU9WRTsKIAotCW91dF9scG9ydCA9IHJvY2tlcl9wb3J0LT5scG9ydDsKKwlvdXRfcHBvcnQgPSByb2NrZXJfcG9ydC0+cHBvcnQ7CiAJZm9yICh2aWQgPSAxOyB2aWQgPCBWTEFOX05fVklEOyB2aWQrKykgewogCQlpZiAoIXRlc3RfYml0KHZpZCwgcm9ja2VyX3BvcnQtPnZsYW5fYml0bWFwKSkKIAkJCWNvbnRpbnVlOwogCQl2bGFuX2lkID0gaHRvbnModmlkKTsKIAkJcG9wX3ZsYW4gPSByb2NrZXJfdmxhbl9pZF9pc19pbnRlcm5hbCh2bGFuX2lkKTsKIAkJZXJyID0gcm9ja2VyX2dyb3VwX2wyX2ludGVyZmFjZShyb2NrZXJfcG9ydCwgZmxhZ3MsCi0JCQkJCQl2bGFuX2lkLCBvdXRfbHBvcnQsCisJCQkJCQl2bGFuX2lkLCBvdXRfcHBvcnQsCiAJCQkJCQlwb3Bfdmxhbik7CiAJCWlmIChlcnIpIHsKIAkJCW5ldGRldl9lcnIocm9ja2VyX3BvcnQtPmRldiwKLQkJCQkgICAiRXJyb3IgKCVkKSBwb3J0IFZMQU4gbDIgZ3JvdXAgZm9yIGxwb3J0ICVkXG4iLAotCQkJCSAgIGVyciwgb3V0X2xwb3J0KTsKKwkJCQkgICAiRXJyb3IgKCVkKSBwb3J0IFZMQU4gbDIgZ3JvdXAgZm9yIHBwb3J0ICVkXG4iLAorCQkJCSAgIGVyciwgb3V0X3Bwb3J0KTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9CkBAIC0zMzAyLDYgKzM2NTMsMjYgQEAKIAlyZXR1cm4gcm9ja2VyX3BvcnRfZndkaW5nKHJvY2tlcl9wb3J0KTsKIH0KIAorc3RhdGljIGludCByb2NrZXJfcG9ydF9md2RfZW5hYmxlKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQpCit7CisJaWYgKHJvY2tlcl9wb3J0X2lzX2JyaWRnZWQocm9ja2VyX3BvcnQpKQorCQkvKiBicmlkZ2UgU1RQIHdpbGwgZW5hYmxlIHBvcnQgKi8KKwkJcmV0dXJuIDA7CisKKwkvKiBwb3J0IGlzIG5vdCBicmlkZ2VkLCBzbyBzaW11bGF0ZSBnb2luZyB0byBGT1JXQVJESU5HIHN0YXRlICovCisJcmV0dXJuIHJvY2tlcl9wb3J0X3N0cF91cGRhdGUocm9ja2VyX3BvcnQsIEJSX1NUQVRFX0ZPUldBUkRJTkcpOworfQorCitzdGF0aWMgaW50IHJvY2tlcl9wb3J0X2Z3ZF9kaXNhYmxlKHN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQpCit7CisJaWYgKHJvY2tlcl9wb3J0X2lzX2JyaWRnZWQocm9ja2VyX3BvcnQpKQorCQkvKiBicmlkZ2UgU1RQIHdpbGwgZGlzYWJsZSBwb3J0ICovCisJCXJldHVybiAwOworCisJLyogcG9ydCBpcyBub3QgYnJpZGdlZCwgc28gc2ltdWxhdGUgZ29pbmcgdG8gRElTQUJMRUQgc3RhdGUgKi8KKwlyZXR1cm4gcm9ja2VyX3BvcnRfc3RwX3VwZGF0ZShyb2NrZXJfcG9ydCwgQlJfU1RBVEVfRElTQUJMRUQpOworfQorCiBzdGF0aWMgc3RydWN0IHJvY2tlcl9pbnRlcm5hbF92bGFuX3RibF9lbnRyeSAqCiByb2NrZXJfaW50ZXJuYWxfdmxhbl90YmxfZmluZChzdHJ1Y3Qgcm9ja2VyICpyb2NrZXIsIGludCBpZmluZGV4KQogewpAQCAtMzM4Nyw2ICszNzU4LDUxIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm9ja2VyLT5pbnRlcm5hbF92bGFuX3RibF9sb2NrLCBsb2NrX2ZsYWdzKTsKIH0KIAorc3RhdGljIGludCByb2NrZXJfcG9ydF9maWJfaXB2NChzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0LCBfX2JlMzIgZHN0LAorCQkJCWludCBkc3RfbGVuLCBzdHJ1Y3QgZmliX2luZm8gKmZpLCB1MzIgdGJfaWQsCisJCQkJaW50IGZsYWdzKQoreworCXN0cnVjdCBmaWJfbmggKm5oOworCV9fYmUxNiBldGhfdHlwZSA9IGh0b25zKEVUSF9QX0lQKTsKKwlfX2JlMzIgZHN0X21hc2sgPSBpbmV0X21ha2VfbWFzayhkc3RfbGVuKTsKKwlfX2JlMTYgaW50ZXJuYWxfdmxhbl9pZCA9IHJvY2tlcl9wb3J0LT5pbnRlcm5hbF92bGFuX2lkOworCXUzMiBwcmlvcml0eSA9IGZpLT5maWJfcHJpb3JpdHk7CisJZW51bSByb2NrZXJfb2ZfZHBhX3RhYmxlX2lkIGdvdG9fdGJsID0KKwkJUk9DS0VSX09GX0RQQV9UQUJMRV9JRF9BQ0xfUE9MSUNZOworCXUzMiBncm91cF9pZDsKKwlib29sIG5oX29uX3BvcnQ7CisJYm9vbCBoYXNfZ3c7CisJdTMyIGluZGV4OworCWludCBlcnI7CisKKwkvKiBYWFggc3VwcG9ydCBFQ01QICovCisKKwluaCA9IGZpLT5maWJfbmg7CisJbmhfb25fcG9ydCA9IChmaS0+ZmliX2RldiA9PSByb2NrZXJfcG9ydC0+ZGV2KTsKKwloYXNfZ3cgPSAhIW5oLT5uaF9ndzsKKworCWlmIChoYXNfZ3cgJiYgbmhfb25fcG9ydCkgeworCQllcnIgPSByb2NrZXJfcG9ydF9pcHY0X25oKHJvY2tlcl9wb3J0LCBmbGFncywKKwkJCQkJICBuaC0+bmhfZ3csICZpbmRleCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCWdyb3VwX2lkID0gUk9DS0VSX0dST1VQX0wzX1VOSUNBU1QoaW5kZXgpOworCX0gZWxzZSB7CisJCS8qIFNlbmQgdG8gQ1BVIGZvciBwcm9jZXNzaW5nICovCisJCWdyb3VwX2lkID0gUk9DS0VSX0dST1VQX0wyX0lOVEVSRkFDRShpbnRlcm5hbF92bGFuX2lkLCAwKTsKKwl9CisKKwllcnIgPSByb2NrZXJfZmxvd190YmxfdWNhc3Q0X3JvdXRpbmcocm9ja2VyX3BvcnQsIGV0aF90eXBlLCBkc3QsCisJCQkJCSAgICAgZHN0X21hc2ssIHByaW9yaXR5LCBnb3RvX3RibCwKKwkJCQkJICAgICBncm91cF9pZCwgZmxhZ3MpOworCWlmIChlcnIpCisJCW5ldGRldl9lcnIocm9ja2VyX3BvcnQtPmRldiwgIkVycm9yICglZCkgSVB2NCByb3V0ZSAlcEk0XG4iLAorCQkJICAgZXJyLCAmZHN0KTsKKworCXJldHVybiBlcnI7Cit9CisKIC8qKioqKioqKioqKioqKioqKgogICogTmV0IGRldmljZSBvcHMKICAqKioqKioqKioqKioqKioqKi8KQEAgLTMzOTQsOCArMzgxMCw2IEBACiBzdGF0aWMgaW50IHJvY2tlcl9wb3J0X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1OCBzdHBfc3RhdGUgPSByb2NrZXJfcG9ydF9pc19icmlkZ2VkKHJvY2tlcl9wb3J0KSA/Ci0JCUJSX1NUQVRFX0JMT0NLSU5HIDogQlJfU1RBVEVfRk9SV0FSRElORzsKIAlpbnQgZXJyOwogCiAJZXJyID0gcm9ja2VyX3BvcnRfZG1hX3JpbmdzX2luaXQocm9ja2VyX3BvcnQpOwpAQCAtMzQxOCw5ICszODMyLDkgQEAKIAkJZ290byBlcnJfcmVxdWVzdF9yeF9pcnE7CiAJfQogCi0JZXJyID0gcm9ja2VyX3BvcnRfc3RwX3VwZGF0ZShyb2NrZXJfcG9ydCwgc3RwX3N0YXRlKTsKKwllcnIgPSByb2NrZXJfcG9ydF9md2RfZW5hYmxlKHJvY2tlcl9wb3J0KTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9zdHBfdXBkYXRlOworCQlnb3RvIGVycl9md2RfZW5hYmxlOwogCiAJbmFwaV9lbmFibGUoJnJvY2tlcl9wb3J0LT5uYXBpX3R4KTsKIAluYXBpX2VuYWJsZSgmcm9ja2VyX3BvcnQtPm5hcGlfcngpOwpAQCAtMzQyOCw3ICszODQyLDcgQEAKIAluZXRpZl9zdGFydF9xdWV1ZShkZXYpOwogCXJldHVybiAwOwogCi1lcnJfc3RwX3VwZGF0ZToKK2Vycl9md2RfZW5hYmxlOgogCWZyZWVfaXJxKHJvY2tlcl9tc2l4X3J4X3ZlY3Rvcihyb2NrZXJfcG9ydCksIHJvY2tlcl9wb3J0KTsKIGVycl9yZXF1ZXN0X3J4X2lycToKIAlmcmVlX2lycShyb2NrZXJfbXNpeF90eF92ZWN0b3Iocm9ja2VyX3BvcnQpLCByb2NrZXJfcG9ydCk7CkBAIC0zNDQ1LDcgKzM4NTksNyBAQAogCXJvY2tlcl9wb3J0X3NldF9lbmFibGUocm9ja2VyX3BvcnQsIGZhbHNlKTsKIAluYXBpX2Rpc2FibGUoJnJvY2tlcl9wb3J0LT5uYXBpX3J4KTsKIAluYXBpX2Rpc2FibGUoJnJvY2tlcl9wb3J0LT5uYXBpX3R4KTsKLQlyb2NrZXJfcG9ydF9zdHBfdXBkYXRlKHJvY2tlcl9wb3J0LCBCUl9TVEFURV9ESVNBQkxFRCk7CisJcm9ja2VyX3BvcnRfZndkX2Rpc2FibGUocm9ja2VyX3BvcnQpOwogCWZyZWVfaXJxKHJvY2tlcl9tc2l4X3J4X3ZlY3Rvcihyb2NrZXJfcG9ydCksIHJvY2tlcl9wb3J0KTsKIAlmcmVlX2lycShyb2NrZXJfbXNpeF90eF92ZWN0b3Iocm9ja2VyX3BvcnQpLCByb2NrZXJfcG9ydCk7CiAJcm9ja2VyX3BvcnRfZG1hX3JpbmdzX2Zpbmkocm9ja2VyX3BvcnQpOwpAQCAtMzcwMiw3ICs0MTE2LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZyb2NrZXItPmZkYl90YmxfbG9jaywgbG9ja19mbGFncyk7CiAJaGFzaF9mb3JfZWFjaF9zYWZlKHJvY2tlci0+ZmRiX3RibCwgYmt0LCB0bXAsIGZvdW5kLCBlbnRyeSkgewotCQlpZiAoZm91bmQtPmtleS5scG9ydCAhPSByb2NrZXJfcG9ydC0+bHBvcnQpCisJCWlmIChmb3VuZC0+a2V5LnBwb3J0ICE9IHJvY2tlcl9wb3J0LT5wcG9ydCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoaWR4IDwgY2ItPmFyZ3NbMF0pCiAJCQlnb3RvIHNraXA7CkBAIC0zNzcyLDIyICs0MTg2LDE5IEBACiAJCQkJICAgICAgIHJvY2tlcl9wb3J0LT5icnBvcnRfZmxhZ3MsIG1hc2spOwogfQogCi1zdGF0aWMgaW50IHJvY2tlcl9wb3J0X3N3aXRjaF9wYXJlbnRfaWRfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCSAgICBzdHJ1Y3QgbmV0ZGV2X3BoeXNfaXRlbV9pZCAqcHNpZCkKK3N0YXRpYyBpbnQgcm9ja2VyX3BvcnRfZ2V0X3BoeXNfcG9ydF9uYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCByb2NrZXIgKnJvY2tlciA9IHJvY2tlcl9wb3J0LT5yb2NrZXI7CisJc3RydWN0IHBvcnRfbmFtZSBuYW1lID0geyAuYnVmID0gYnVmLCAubGVuID0gbGVuIH07CisJaW50IGVycjsKIAotCXBzaWQtPmlkX2xlbiA9IHNpemVvZihyb2NrZXItPmh3LmlkKTsKLQltZW1jcHkoJnBzaWQtPmlkLCAmcm9ja2VyLT5ody5pZCwgcHNpZC0+aWRfbGVuKTsKLQlyZXR1cm4gMDsKLX0KKwllcnIgPSByb2NrZXJfY21kX2V4ZWMocm9ja2VyX3BvcnQtPnJvY2tlciwgcm9ja2VyX3BvcnQsCisJCQkgICAgICByb2NrZXJfY21kX2dldF9wb3J0X3NldHRpbmdzX3ByZXAsIE5VTEwsCisJCQkgICAgICByb2NrZXJfY21kX2dldF9wb3J0X3NldHRpbmdzX3BoeXNfbmFtZV9wcm9jLAorCQkJICAgICAgJm5hbWUsIGZhbHNlKTsKIAotc3RhdGljIGludCByb2NrZXJfcG9ydF9zd2l0Y2hfcG9ydF9zdHBfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHN0YXRlKQotewotCXN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JcmV0dXJuIHJvY2tlcl9wb3J0X3N0cF91cGRhdGUocm9ja2VyX3BvcnQsIHN0YXRlKTsKKwlyZXR1cm4gZXJyID8gLUVPUE5PVFNVUFAgOiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHJvY2tlcl9wb3J0X25ldGRldl9vcHMgPSB7CkBAIC0zODAyLDggKzQyMTMsNjEgQEAKIAkubmRvX2ZkYl9kdW1wCQkJPSByb2NrZXJfcG9ydF9mZGJfZHVtcCwKIAkubmRvX2JyaWRnZV9zZXRsaW5rCQk9IHJvY2tlcl9wb3J0X2JyaWRnZV9zZXRsaW5rLAogCS5uZG9fYnJpZGdlX2dldGxpbmsJCT0gcm9ja2VyX3BvcnRfYnJpZGdlX2dldGxpbmssCi0JLm5kb19zd2l0Y2hfcGFyZW50X2lkX2dldAk9IHJvY2tlcl9wb3J0X3N3aXRjaF9wYXJlbnRfaWRfZ2V0LAotCS5uZG9fc3dpdGNoX3BvcnRfc3RwX3VwZGF0ZQk9IHJvY2tlcl9wb3J0X3N3aXRjaF9wb3J0X3N0cF91cGRhdGUsCisJLm5kb19nZXRfcGh5c19wb3J0X25hbWUJCT0gcm9ja2VyX3BvcnRfZ2V0X3BoeXNfcG9ydF9uYW1lLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqCisgKiBzd2RldiBpbnRlcmZhY2UKKyAqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCByb2NrZXJfcG9ydF9zd2Rldl9wYXJlbnRfaWRfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBuZXRkZXZfcGh5c19pdGVtX2lkICpwc2lkKQoreworCXN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCByb2NrZXIgKnJvY2tlciA9IHJvY2tlcl9wb3J0LT5yb2NrZXI7CisKKwlwc2lkLT5pZF9sZW4gPSBzaXplb2Yocm9ja2VyLT5ody5pZCk7CisJbWVtY3B5KCZwc2lkLT5pZCwgJnJvY2tlci0+aHcuaWQsIHBzaWQtPmlkX2xlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2VyX3BvcnRfc3dkZXZfcG9ydF9zdHBfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHN0YXRlKQoreworCXN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIHJvY2tlcl9wb3J0X3N0cF91cGRhdGUocm9ja2VyX3BvcnQsIHN0YXRlKTsKK30KKworc3RhdGljIGludCByb2NrZXJfcG9ydF9zd2Rldl9maWJfaXB2NF9hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICBfX2JlMzIgZHN0LCBpbnQgZHN0X2xlbiwKKwkJCQkJICBzdHJ1Y3QgZmliX2luZm8gKmZpLAorCQkJCQkgIHU4IHRvcywgdTggdHlwZSwKKwkJCQkJICB1MzIgbmxmbGFncywgdTMyIHRiX2lkKQoreworCXN0cnVjdCByb2NrZXJfcG9ydCAqcm9ja2VyX3BvcnQgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBmbGFncyA9IDA7CisKKwlyZXR1cm4gcm9ja2VyX3BvcnRfZmliX2lwdjQocm9ja2VyX3BvcnQsIGRzdCwgZHN0X2xlbiwKKwkJCQkgICAgZmksIHRiX2lkLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2VyX3BvcnRfc3dkZXZfZmliX2lwdjRfZGVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgX19iZTMyIGRzdCwgaW50IGRzdF9sZW4sCisJCQkJCSAgc3RydWN0IGZpYl9pbmZvICpmaSwKKwkJCQkJICB1OCB0b3MsIHU4IHR5cGUsIHUzMiB0Yl9pZCkKK3sKKwlzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZmxhZ3MgPSBST0NLRVJfT1BfRkxBR19SRU1PVkU7CisKKwlyZXR1cm4gcm9ja2VyX3BvcnRfZmliX2lwdjQocm9ja2VyX3BvcnQsIGRzdCwgZHN0X2xlbiwKKwkJCQkgICAgZmksIHRiX2lkLCBmbGFncyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3dkZXZfb3BzIHJvY2tlcl9wb3J0X3N3ZGV2X29wcyA9IHsKKwkuc3dkZXZfcGFyZW50X2lkX2dldAkJPSByb2NrZXJfcG9ydF9zd2Rldl9wYXJlbnRfaWRfZ2V0LAorCS5zd2Rldl9wb3J0X3N0cF91cGRhdGUJCT0gcm9ja2VyX3BvcnRfc3dkZXZfcG9ydF9zdHBfdXBkYXRlLAorCS5zd2Rldl9maWJfaXB2NF9hZGQJCT0gcm9ja2VyX3BvcnRfc3dkZXZfZmliX2lwdjRfYWRkLAorCS5zd2Rldl9maWJfaXB2NF9kZWwJCT0gcm9ja2VyX3BvcnRfc3dkZXZfZmliX2lwdjRfZGVsLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqCkBAIC0zODgyLDggKzQzNDYsOCBAQAogCWlmICghY21kX3N0YXRzKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCi0JaWYgKHJvY2tlcl90bHZfcHV0X3UzMihkZXNjX2luZm8sIFJPQ0tFUl9UTFZfQ01EX1BPUlRfU1RBVFNfTFBPUlQsCi0JCQkgICAgICAgcm9ja2VyX3BvcnQtPmxwb3J0KSkKKwlpZiAocm9ja2VyX3Rsdl9wdXRfdTMyKGRlc2NfaW5mbywgUk9DS0VSX1RMVl9DTURfUE9SVF9TVEFUU19QUE9SVCwKKwkJCSAgICAgICByb2NrZXJfcG9ydC0+cHBvcnQpKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJcm9ja2VyX3Rsdl9uZXN0X2VuZChkZXNjX2luZm8sIGNtZF9zdGF0cyk7CkBAIC0zOTAwLDcgKzQzNjQsNyBAQAogCXN0cnVjdCByb2NrZXJfdGx2ICphdHRyc1tST0NLRVJfVExWX0NNRF9NQVggKyAxXTsKIAlzdHJ1Y3Qgcm9ja2VyX3RsdiAqc3RhdHNfYXR0cnNbUk9DS0VSX1RMVl9DTURfUE9SVF9TVEFUU19NQVggKyAxXTsKIAlzdHJ1Y3Qgcm9ja2VyX3RsdiAqcGF0dHI7Ci0JdTMyIGxwb3J0OworCXUzMiBwcG9ydDsKIAl1NjQgKmRhdGEgPSBwcml2OwogCWludCBpOwogCkBAIC0zOTEyLDExICs0Mzc2LDExIEBACiAJcm9ja2VyX3Rsdl9wYXJzZV9uZXN0ZWQoc3RhdHNfYXR0cnMsIFJPQ0tFUl9UTFZfQ01EX1BPUlRfU1RBVFNfTUFYLAogCQkJCWF0dHJzW1JPQ0tFUl9UTFZfQ01EX0lORk9dKTsKIAotCWlmICghc3RhdHNfYXR0cnNbUk9DS0VSX1RMVl9DTURfUE9SVF9TVEFUU19MUE9SVF0pCisJaWYgKCFzdGF0c19hdHRyc1tST0NLRVJfVExWX0NNRF9QT1JUX1NUQVRTX1BQT1JUXSkKIAkJcmV0dXJuIC1FSU87CiAKLQlscG9ydCA9IHJvY2tlcl90bHZfZ2V0X3UzMihzdGF0c19hdHRyc1tST0NLRVJfVExWX0NNRF9QT1JUX1NUQVRTX0xQT1JUXSk7Ci0JaWYgKGxwb3J0ICE9IHJvY2tlcl9wb3J0LT5scG9ydCkKKwlwcG9ydCA9IHJvY2tlcl90bHZfZ2V0X3UzMihzdGF0c19hdHRyc1tST0NLRVJfVExWX0NNRF9QT1JUX1NUQVRTX1BQT1JUXSk7CisJaWYgKHBwb3J0ICE9IHJvY2tlcl9wb3J0LT5wcG9ydCkKIAkJcmV0dXJuIC1FSU87CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyb2NrZXJfcG9ydF9zdGF0cyk7IGkrKykgewpAQCAtNDEwNCw3ICs0NTY4LDcgQEAKIAl1NjQgbGlua19zdGF0dXMgPSByb2NrZXJfcmVhZDY0KHJvY2tlciwgUE9SVF9QSFlTX0xJTktfU1RBVFVTKTsKIAlib29sIGxpbmtfdXA7CiAKLQlsaW5rX3VwID0gbGlua19zdGF0dXMgJiAoMSA8PCByb2NrZXJfcG9ydC0+bHBvcnQpOworCWxpbmtfdXAgPSBsaW5rX3N0YXR1cyAmICgxIDw8IHJvY2tlcl9wb3J0LT5wcG9ydCk7CiAJaWYgKGxpbmtfdXApCiAJCW5ldGlmX2NhcnJpZXJfb24ocm9ja2VyX3BvcnQtPmRldik7CiAJZWxzZQpAQCAtNDE1MiwyMCArNDYxNiwyMiBAQAogCXJvY2tlcl9wb3J0LT5kZXYgPSBkZXY7CiAJcm9ja2VyX3BvcnQtPnJvY2tlciA9IHJvY2tlcjsKIAlyb2NrZXJfcG9ydC0+cG9ydF9udW1iZXIgPSBwb3J0X251bWJlcjsKLQlyb2NrZXJfcG9ydC0+bHBvcnQgPSBwb3J0X251bWJlciArIDE7CisJcm9ja2VyX3BvcnQtPnBwb3J0ID0gcG9ydF9udW1iZXIgKyAxOwogCXJvY2tlcl9wb3J0LT5icnBvcnRfZmxhZ3MgPSBCUl9MRUFSTklORyB8IEJSX0xFQVJOSU5HX1NZTkM7CiAKIAlyb2NrZXJfcG9ydF9kZXZfYWRkcl9pbml0KHJvY2tlciwgcm9ja2VyX3BvcnQpOwogCWRldi0+bmV0ZGV2X29wcyA9ICZyb2NrZXJfcG9ydF9uZXRkZXZfb3BzOwogCWRldi0+ZXRodG9vbF9vcHMgPSAmcm9ja2VyX3BvcnRfZXRodG9vbF9vcHM7CisJZGV2LT5zd2Rldl9vcHMgPSAmcm9ja2VyX3BvcnRfc3dkZXZfb3BzOwogCW5ldGlmX25hcGlfYWRkKGRldiwgJnJvY2tlcl9wb3J0LT5uYXBpX3R4LCByb2NrZXJfcG9ydF9wb2xsX3R4LAogCQkgICAgICAgTkFQSV9QT0xMX1dFSUdIVCk7CiAJbmV0aWZfbmFwaV9hZGQoZGV2LCAmcm9ja2VyX3BvcnQtPm5hcGlfcngsIHJvY2tlcl9wb3J0X3BvbGxfcngsCiAJCSAgICAgICBOQVBJX1BPTExfV0VJR0hUKTsKIAlyb2NrZXJfY2Fycmllcl9pbml0KHJvY2tlcl9wb3J0KTsKIAotCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX0NUQUdfRklMVEVSIHwKLQkJCQlORVRJRl9GX0hXX1NXSVRDSF9PRkZMT0FEOworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ORVROU19MT0NBTCB8CisJCQkgTkVUSUZfRl9IV19WTEFOX0NUQUdfRklMVEVSIHwKKwkJCSBORVRJRl9GX0hXX1NXSVRDSF9PRkZMT0FEOwogCiAJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJaWYgKGVycikgewpAQCAtNDQzNiw5ICs0OTAyLDcgQEAKIAlyb2NrZXJfcG9ydC0+aW50ZXJuYWxfdmxhbl9pZCA9CiAJCXJvY2tlcl9wb3J0X2ludGVybmFsX3ZsYW5faWRfZ2V0KHJvY2tlcl9wb3J0LAogCQkJCQkJIGJyaWRnZS0+aWZpbmRleCk7Ci0JZXJyID0gcm9ja2VyX3BvcnRfdmxhbihyb2NrZXJfcG9ydCwgMCwgMCk7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiByb2NrZXJfcG9ydF92bGFuKHJvY2tlcl9wb3J0LCAwLCAwKTsKIH0KIAogc3RhdGljIGludCByb2NrZXJfcG9ydF9icmlkZ2VfbGVhdmUoc3RydWN0IHJvY2tlcl9wb3J0ICpyb2NrZXJfcG9ydCkKQEAgLTQ0NTgsNiArNDkyMiwxMSBAQAogCQlyb2NrZXJfcG9ydF9pbnRlcm5hbF92bGFuX2lkX2dldChyb2NrZXJfcG9ydCwKIAkJCQkJCSByb2NrZXJfcG9ydC0+ZGV2LT5pZmluZGV4KTsKIAllcnIgPSByb2NrZXJfcG9ydF92bGFuKHJvY2tlcl9wb3J0LCAwLCAwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHJvY2tlcl9wb3J0LT5kZXYtPmZsYWdzICYgSUZGX1VQKQorCQllcnIgPSByb2NrZXJfcG9ydF9md2RfZW5hYmxlKHJvY2tlcl9wb3J0KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00NDY4LDEwICs0OTM3LDE2IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlciA9IG5ldGRldl9tYXN0ZXJfdXBwZXJfZGV2X2dldChkZXYpOwogCWludCBlcnIgPSAwOwogCisJLyogVGhlcmUgYXJlIGN1cnJlbnRseSB0aHJlZSBjYXNlcyBoYW5kbGVkIGhlcmU6CisJICogMS4gSm9pbmluZyBhIGJyaWRnZQorCSAqIDIuIExlYXZpbmcgYSBwcmV2aW91c2x5IGpvaW5lZCBicmlkZ2UKKwkgKiAzLiBPdGhlciwgZS5nLiBiZWluZyBhZGRlZCB0byBvciByZW1vdmVkIGZyb20gYSBib25kIG9yIG9wZW52c3dpdGNoLAorCSAqICAgIGluIHdoaWNoIGNhc2Ugbm90aGluZyBpcyBkb25lCisJICovCiAJaWYgKG1hc3RlciAmJiBtYXN0ZXItPnJ0bmxfbGlua19vcHMgJiYKIAkgICAgIXN0cmNtcChtYXN0ZXItPnJ0bmxfbGlua19vcHMtPmtpbmQsICJicmlkZ2UiKSkKIAkJZXJyID0gcm9ja2VyX3BvcnRfYnJpZGdlX2pvaW4ocm9ja2VyX3BvcnQsIG1hc3Rlcik7Ci0JZWxzZQorCWVsc2UgaWYgKHJvY2tlcl9wb3J0X2lzX2JyaWRnZWQocm9ja2VyX3BvcnQpKQogCQllcnIgPSByb2NrZXJfcG9ydF9icmlkZ2VfbGVhdmUocm9ja2VyX3BvcnQpOwogCiAJcmV0dXJuIGVycjsKQEAgLTQ1MDMsNiArNDk3OCw0OCBAQAogCS5ub3RpZmllcl9jYWxsID0gcm9ja2VyX25ldGRldmljZV9ldmVudCwKIH07CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5ldCBldmVudCBub3RpZmllciBldmVudCBoYW5kbGVyCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHJvY2tlcl9uZWlnaF91cGRhdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5laWdoYm91ciAqbikKK3sKKwlzdHJ1Y3Qgcm9ja2VyX3BvcnQgKnJvY2tlcl9wb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZmxhZ3MgPSAobi0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSA/IDAgOiBST0NLRVJfT1BfRkxBR19SRU1PVkU7CisJX19iZTMyIGlwX2FkZHIgPSAqKF9fYmUzMiAqKW4tPnByaW1hcnlfa2V5OworCisJcmV0dXJuIHJvY2tlcl9wb3J0X2lwdjRfbmVpZ2gocm9ja2VyX3BvcnQsIGZsYWdzLCBpcF9hZGRyLCBuLT5oYSk7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2VyX25ldGV2ZW50X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLAorCQkJCSB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gcHRyOworCWludCBlcnI7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRFVkVOVF9ORUlHSF9VUERBVEU6CisJCWlmIChuLT50YmwgIT0gJmFycF90YmwpCisJCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJCWRldiA9IG4tPmRldjsKKwkJaWYgKCFyb2NrZXJfcG9ydF9kZXZfY2hlY2soZGV2KSkKKwkJCXJldHVybiBOT1RJRllfRE9ORTsKKwkJZXJyID0gcm9ja2VyX25laWdoX3VwZGF0ZShkZXYsIG4pOworCQlpZiAoZXJyKQorCQkJbmV0ZGV2X3dhcm4oZGV2LAorCQkJCSAgICAiZmFpbGVkIHRvIGhhbmRsZSBuZWlnaCB1cGRhdGUgKGVyciAlZClcbiIsCisJCQkJICAgIGVycik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayByb2NrZXJfbmV0ZXZlbnRfbmIgX19yZWFkX21vc3RseSA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHJvY2tlcl9uZXRldmVudF9ldmVudCwKK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKgogICogTW9kdWxlIGluaXQgYW5kIGV4aXQKICAqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ1MTIsMTggKzUwMjksMjEgQEAKIAlpbnQgZXJyOwogCiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZyb2NrZXJfbmV0ZGV2aWNlX25iKTsKKwlyZWdpc3Rlcl9uZXRldmVudF9ub3RpZmllcigmcm9ja2VyX25ldGV2ZW50X25iKTsKIAllcnIgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZyb2NrZXJfcGNpX2RyaXZlcik7CiAJaWYgKGVycikKIAkJZ290byBlcnJfcGNpX3JlZ2lzdGVyX2RyaXZlcjsKIAlyZXR1cm4gMDsKIAogZXJyX3BjaV9yZWdpc3Rlcl9kcml2ZXI6CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnJvY2tlcl9uZXRldmVudF9uYik7CiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJnJvY2tlcl9uZXRkZXZpY2VfbmIpOwogCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCByb2NrZXJfbW9kdWxlX2V4aXQodm9pZCkKIHsKKwl1bnJlZ2lzdGVyX25ldGV2ZW50X25vdGlmaWVyKCZyb2NrZXJfbmV0ZXZlbnRfbmIpOwogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZyb2NrZXJfbmV0ZGV2aWNlX25iKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnJvY2tlcl9wY2lfZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JvY2tlci9yb2NrZXIuaAppbmRleCBhNWJjNDMyLi5hNGU5NTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yb2NrZXIvcm9ja2VyLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcm9ja2VyL3JvY2tlci5oCkBAIC0xNCw2ICsxNCwyMSBAQAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAorLyogUmV0dXJuIGNvZGVzICovCitlbnVtIHsKKwlST0NLRVJfT0sgPSAwLAorCVJPQ0tFUl9FTk9FTlQgPSAyLAorCVJPQ0tFUl9FTlhJTyA9IDYsCisJUk9DS0VSX0VOT01FTSA9IDEyLAorCVJPQ0tFUl9FRVhJU1QgPSAxNywKKwlST0NLRVJfRUlOVkFMID0gMjIsCisJUk9DS0VSX0VNU0dTSVpFID0gOTAsCisJUk9DS0VSX0VOT1RTVVAgPSA5NSwKKwlST0NLRVJfRU5PQlVGUyA9IDEwNSwKK307CisKKyNkZWZpbmUgUk9DS0VSX0ZQX1BPUlRTX01BWCA2MgorCiAjZGVmaW5lIFBDSV9WRU5ET1JfSURfUkVESEFUCQkweDFiMzYKICNkZWZpbmUgUENJX0RFVklDRV9JRF9SRURIQVRfUk9DS0VSCTB4MDAwNgogCkBAIC0xMzYsMTMgKzE1MSwxNCBAQAogCiBlbnVtIHsKIAlST0NLRVJfVExWX0NNRF9QT1JUX1NFVFRJTkdTX1VOU1BFQywKLQlST0NLRVJfVExWX0NNRF9QT1JUX1NFVFRJTkdTX0xQT1JULAkJLyogdTMyICovCisJUk9DS0VSX1RMVl9DTURfUE9SVF9TRVRUSU5HU19QUE9SVCwJCS8qIHUzMiAqLwogCVJPQ0tFUl9UTFZfQ01EX1BPUlRfU0VUVElOR1NfU1BFRUQsCQkvKiB1MzIgKi8KIAlST0NLRVJfVExWX0NNRF9QT1JUX1NFVFRJTkdTX0RVUExFWCwJCS8qIHU4ICovCiAJUk9DS0VSX1RMVl9DTURfUE9SVF9TRVRUSU5HU19BVVRPTkVHLAkJLyogdTggKi8KIAlST0NLRVJfVExWX0NNRF9QT1JUX1NFVFRJTkdTX01BQ0FERFIsCQkvKiBiaW5hcnkgKi8KIAlST0NLRVJfVExWX0NNRF9QT1JUX1NFVFRJTkdTX01PREUsCQkvKiB1OCAqLwogCVJPQ0tFUl9UTFZfQ01EX1BPUlRfU0VUVElOR1NfTEVBUk5JTkcsCQkvKiB1OCAqLworCVJPQ0tFUl9UTFZfQ01EX1BPUlRfU0VUVElOR1NfUEhZU19OQU1FLAkJLyogYmluYXJ5ICovCiAKIAlfX1JPQ0tFUl9UTFZfQ01EX1BPUlRfU0VUVElOR1NfTUFYLAogCVJPQ0tFUl9UTFZfQ01EX1BPUlRfU0VUVElOR1NfTUFYID0KQEAgLTE1MSw3ICsxNjcsNyBAQAogCiBlbnVtIHsKIAlST0NLRVJfVExWX0NNRF9QT1JUX1NUQVRTX1VOU1BFQywKLQlST0NLRVJfVExWX0NNRF9QT1JUX1NUQVRTX0xQT1JULCAgICAgICAgICAgIC8qIHUzMiAqLworCVJPQ0tFUl9UTFZfQ01EX1BPUlRfU1RBVFNfUFBPUlQsICAgICAgICAgICAgLyogdTMyICovCiAKIAlST0NLRVJfVExWX0NNRF9QT1JUX1NUQVRTX1JYX1BLVFMsICAgICAgICAgIC8qIHU2NCAqLwogCVJPQ0tFUl9UTFZfQ01EX1BPUlRfU1RBVFNfUlhfQllURVMsICAgICAgICAgLyogdTY0ICovCkBAIC0xOTEsNyArMjA3LDcgQEAKIAogZW51bSB7CiAJUk9DS0VSX1RMVl9FVkVOVF9MSU5LX0NIQU5HRURfVU5TUEVDLAotCVJPQ0tFUl9UTFZfRVZFTlRfTElOS19DSEFOR0VEX0xQT1JULAkvKiB1MzIgKi8KKwlST0NLRVJfVExWX0VWRU5UX0xJTktfQ0hBTkdFRF9QUE9SVCwJLyogdTMyICovCiAJUk9DS0VSX1RMVl9FVkVOVF9MSU5LX0NIQU5HRURfTElOS1VQLAkvKiB1OCAqLwogCiAJX19ST0NLRVJfVExWX0VWRU5UX0xJTktfQ0hBTkdFRF9NQVgsCkBAIC0yMDEsNyArMjE3LDcgQEAKIAogZW51bSB7CiAJUk9DS0VSX1RMVl9FVkVOVF9NQUNfVkxBTl9VTlNQRUMsCi0JUk9DS0VSX1RMVl9FVkVOVF9NQUNfVkxBTl9MUE9SVCwJLyogdTMyICovCisJUk9DS0VSX1RMVl9FVkVOVF9NQUNfVkxBTl9QUE9SVCwJLyogdTMyICovCiAJUk9DS0VSX1RMVl9FVkVOVF9NQUNfVkxBTl9NQUMsCQkvKiBiaW5hcnkgKi8KIAlST0NLRVJfVExWX0VWRU5UX01BQ19WTEFOX1ZMQU5fSUQsCS8qIF9fYmUxNiAqLwogCkBAIC0yNzUsOSArMjkxLDkgQEAKIAlST0NLRVJfVExWX09GX0RQQV9IQVJEVElNRSwJCS8qIHUzMiAqLwogCVJPQ0tFUl9UTFZfT0ZfRFBBX0lETEVUSU1FLAkJLyogdTMyICovCiAJUk9DS0VSX1RMVl9PRl9EUEFfQ09PS0lFLAkJLyogdTY0ICovCi0JUk9DS0VSX1RMVl9PRl9EUEFfSU5fTFBPUlQsCQkvKiB1MzIgKi8KLQlST0NLRVJfVExWX09GX0RQQV9JTl9MUE9SVF9NQVNLLAkvKiB1MzIgKi8KLQlST0NLRVJfVExWX09GX0RQQV9PVVRfTFBPUlQsCQkvKiB1MzIgKi8KKwlST0NLRVJfVExWX09GX0RQQV9JTl9QUE9SVCwJCS8qIHUzMiAqLworCVJPQ0tFUl9UTFZfT0ZfRFBBX0lOX1BQT1JUX01BU0ssCS8qIHUzMiAqLworCVJPQ0tFUl9UTFZfT0ZfRFBBX09VVF9QUE9SVCwJCS8qIHUzMiAqLwogCVJPQ0tFUl9UTFZfT0ZfRFBBX0dPVE9fVEFCTEVfSUQsCS8qIHUxNiAqLwogCVJPQ0tFUl9UTFZfT0ZfRFBBX0dST1VQX0lELAkJLyogdTMyICovCiAJUk9DS0VSX1RMVl9PRl9EUEFfR1JPVVBfSURfTE9XRVIsCS8qIHUzMiAqLwpAQCAtMjkxLDcgKzMwNyw3IEBACiAJUk9DS0VSX1RMVl9PRl9EUEFfTkVXX1ZMQU5fSUQsCQkvKiBfX2JlMTYgKi8KIAlST0NLRVJfVExWX09GX0RQQV9ORVdfVkxBTl9QQ1AsCQkvKiB1OCAqLwogCVJPQ0tFUl9UTFZfT0ZfRFBBX1RVTk5FTF9JRCwJCS8qIHUzMiAqLwotCVJPQ0tFUl9UTFZfT0ZfRFBBX1RVTl9MT0dfTFBPUlQsCS8qIHUzMiAqLworCVJPQ0tFUl9UTFZfT0ZfRFBBX1RVTk5FTF9MUE9SVCwJCS8qIHUzMiAqLwogCVJPQ0tFUl9UTFZfT0ZfRFBBX0VUSEVSVFlQRSwJCS8qIF9fYmUxNiAqLwogCVJPQ0tFUl9UTFZfT0ZfRFBBX0RTVF9NQUMsCQkvKiBiaW5hcnkgKi8KIAlST0NLRVJfVExWX09GX0RQQV9EU1RfTUFDX01BU0ssCQkvKiBiaW5hcnkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NhbXN1bmcvc3hnYmUvc3hnYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2Ftc3VuZy9zeGdiZS9zeGdiZV9tYWluLmMKaW5kZXggYzhhMDFlZS4uNDEzZWExNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NhbXN1bmcvc3hnYmUvc3hnYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NhbXN1bmcvc3hnYmUvc3hnYmVfbWFpbi5jCkBAIC00MjIsMTEgKzQyMiwxMSBAQAogCS8qIGFzc2lnbiBxdWV1ZSBudW1iZXIgKi8KIAl0eF9yaW5nLT5xdWV1ZV9ubyA9IHF1ZXVlX25vOwogCi0JLyogaW5pdGFsaXNlIGNvdW50ZXJzICovCisJLyogaW5pdGlhbGlzZSBjb3VudGVycyAqLwogCXR4X3JpbmctPmRpcnR5X3R4ID0gMDsKIAl0eF9yaW5nLT5jdXJfdHggPSAwOwogCi0JLyogaW5pdGFsaXNlIFRYIHF1ZXVlIGxvY2sgKi8KKwkvKiBpbml0aWFsaXNlIFRYIHF1ZXVlIGxvY2sgKi8KIAlzcGluX2xvY2tfaW5pdCgmdHhfcmluZy0+dHhfbG9jayk7CiAKIAlyZXR1cm4gMDsKQEAgLTUxNSw3ICs1MTUsNyBAQAogCQkJZ290byBlcnJfZnJlZV9yeF9idWZmZXJzOwogCX0KIAotCS8qIGluaXRhbGlzZSBjb3VudGVycyAqLworCS8qIGluaXRpYWxpc2UgY291bnRlcnMgKi8KIAlyeF9yaW5nLT5jdXJfcnggPSAwOwogCXJ4X3JpbmctPmRpcnR5X3J4ID0gKHVuc2lnbmVkIGludCkoZGVzY19pbmRleCAtIHJ4X3JzaXplKTsKIAlwcml2LT5kbWFfYnVmX3N6ID0gYmZzaXplOwpAQCAtODM3LDcgKzgzNyw3IEBACiAJLyogZnJlZSB0aGUgc2tidWZmcyBvZiB0aGUgcmluZyAqLwogCXR4X2ZyZWVfcmluZ19za2J1ZnModHhfcmluZyk7CiAKLQkvKiBpbml0YWxpc2UgY291bnRlcnMgKi8KKwkvKiBpbml0aWFsaXNlIGNvdW50ZXJzICovCiAJdHhfcmluZy0+Y3VyX3R4ID0gMDsKIAl0eF9yaW5nLT5kaXJ0eV90eCA9IDA7CiAKQEAgLTExNzYsNyArMTE3Niw3IEBACiAJaWYgKHByaXYtPnBoeWRldikKIAkJcGh5X3N0YXJ0KHByaXYtPnBoeWRldik7CiAKLQkvKiBpbml0YWxpc2UgVFggY29hbGVzY2UgcGFyYW1ldGVycyAqLworCS8qIGluaXRpYWxpc2UgVFggY29hbGVzY2UgcGFyYW1ldGVycyAqLwogCXN4Z2JlX3R4X2luaXRfY29hbGVzY2UocHJpdik7CiAKIAlpZiAoKHByaXYtPnVzZV9yaXd0KSAmJiAocHJpdi0+aHctPmRtYS0+cnhfd2F0Y2hkb2cpKSB7CkBAIC0xNzIxLDcgKzE3MjEsNyBAQAogICogIERlc2NyaXB0aW9uOgogICogIFRoaXMgZnVuY3Rpb24gaXMgYSBkcml2ZXIgZW50cnkgcG9pbnQgd2hlbmV2ZXIgaWZjb25maWcgY29tbWFuZCBnZXRzCiAgKiAgZXhlY3V0ZWQgdG8gc2VlIGRldmljZSBzdGF0aXN0aWNzLiBTdGF0aXN0aWNzIGFyZSBudW1iZXIgb2YKLSAqICBieXRlcyBzZW50IG9yIHJlY2VpdmVkLCBlcnJvcnMgb2NjdXJlZCBldGMuCisgKiAgYnl0ZXMgc2VudCBvciByZWNlaXZlZCwgZXJyb3JzIG9jY3VycmVkIGV0Yy4KICAqICBSZXR1cm4gdmFsdWU6CiAgKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZhcmlvdXMgc3RhdGlzdGljYWwgaW5mb3JtYXRpb24gb2YgZGV2aWNlLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmMKaW5kZXggNzdkNjQ1My4uNGIwMDU0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYwpAQCAtMzIxMyw3ICszMjEzLDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi0vKiBGYWtlIGEgc3VjY2Vzc2Z1bGwgcmVzZXQsIHdoaWNoIHdpbGwgYmUgcGVyZm9ybWVkIGxhdGVyIGluIGVmeF9pb19yZXN1bWUuICovCisvKiBGYWtlIGEgc3VjY2Vzc2Z1bCByZXNldCwgd2hpY2ggd2lsbCBiZSBwZXJmb3JtZWQgbGF0ZXIgaW4gZWZ4X2lvX3Jlc3VtZS4gKi8KIHN0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IGVmeF9pb19zbG90X3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFyY2guYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYXJjaC5jCmluZGV4IDc1OTc1MzIuLmJiODllOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYXJjaC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYXJjaC5jCkBAIC02NDUsNyArNjQ1LDcgQEAKIH0KIAogLyogRmx1c2ggYWxsIHRoZSB0cmFuc21pdCBxdWV1ZXMsIGFuZCBjb250aW51ZSBmbHVzaGluZyByZWNlaXZlIHF1ZXVlcyB1bnRpbAotICogdGhleSdyZSBhbGwgZmx1c2hlZC4gV2FpdCBmb3IgdGhlIERSQUlOIGV2ZW50cyB0byBiZSByZWNpZXZlZCBzbyB0aGF0IHRoZXJlCisgKiB0aGV5J3JlIGFsbCBmbHVzaGVkLiBXYWl0IGZvciB0aGUgRFJBSU4gZXZlbnRzIHRvIGJlIHJlY2VpdmVkIHNvIHRoYXQgdGhlcmUKICAqIGFyZSBubyBtb3JlIFJYIGFuZCBUWCBldmVudHMgbGVmdCBvbiBhbnkgY2hhbm5lbC4gKi8KIHN0YXRpYyBpbnQgZWZ4X2ZhcmNoX2RvX2ZsdXNoKHN0cnVjdCBlZnhfbmljICplZngpCiB7CkBAIC0xMTA4LDcgKzExMDgsNyBAQAogfQogCiAvKiBJZiB0aGlzIGZsdXNoIGRvbmUgZXZlbnQgY29ycmVzcG9uZHMgdG8gYSAmc3RydWN0IGVmeF9yeF9xdWV1ZTogSWYgdGhlIGZsdXNoCi0gKiB3YXMgc3VjY2VzZnVsIHRoZW4gc2VuZCBhbiAlRUZYX0NIQU5ORUxfTUFHSUNfUlhfRFJBSU4sIG90aGVyd2lzZSBhZGQKKyAqIHdhcyBzdWNjZXNzZnVsIHRoZW4gc2VuZCBhbiAlRUZYX0NIQU5ORUxfTUFHSUNfUlhfRFJBSU4sIG90aGVyd2lzZSBhZGQKICAqIHRoZSBSWCBxdWV1ZSBiYWNrIHRvIHRoZSBtYXNrIG9mIFJYIHF1ZXVlcyBpbiBuZWVkIG9mIGZsdXNoaW5nLgogICovCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL21jZGlfcGNvbC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL21jZGlfcGNvbC5oCmluZGV4IGE3MDdmYjUuLmUwMjhkZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9tY2RpX3Bjb2wuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbWNkaV9wY29sLmgKQEAgLTY0OTcsNyArNjQ5Nyw3IEBACiAjZGVmaW5lICAgIE1DX0NNRF9EVU1QX0JVRlRCTF9FTlRSSUVTX09VVF9MRU5NSU4gMTIKICNkZWZpbmUgICAgTUNfQ01EX0RVTVBfQlVGVEJMX0VOVFJJRVNfT1VUX0xFTk1BWCAyNTIKICNkZWZpbmUgICAgTUNfQ01EX0RVTVBfQlVGVEJMX0VOVFJJRVNfT1VUX0xFTihudW0pICgwKzEyKihudW0pKQotLyogUmF3IGJ1ZmZlciB0YWJsZSBlbnRyaWVzLCBsYXllZCBvdXQgYXMgQlVGVEJMX0VOVFJZLiAqLworLyogUmF3IGJ1ZmZlciB0YWJsZSBlbnRyaWVzLCBsYWlkIG91dCBhcyBCVUZUQkxfRU5UUlkuICovCiAjZGVmaW5lICAgICAgIE1DX0NNRF9EVU1QX0JVRlRCTF9FTlRSSUVTX09VVF9FTlRSWV9PRlNUIDAKICNkZWZpbmUgICAgICAgTUNfQ01EX0RVTVBfQlVGVEJMX0VOVFJJRVNfT1VUX0VOVFJZX0xFTiAxMgogI2RlZmluZSAgICAgICBNQ19DTURfRFVNUF9CVUZUQkxfRU5UUklFU19PVVRfRU5UUllfTUlOTlVNIDEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9wdHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9wdHAuYwppbmRleCA2Yjg2MWUzLi5hMmU5YWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvcHRwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3B0cC5jCkBAIC0zMjMsOSArMzIzLDkgQEAKIAogc3RhdGljIGludCBlZnhfcGhjX2FkamZyZXEoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHMzMiBkZWx0YSk7CiBzdGF0aWMgaW50IGVmeF9waGNfYWRqdGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgczY0IGRlbHRhKTsKLXN0YXRpYyBpbnQgZWZ4X3BoY19nZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKK3N0YXRpYyBpbnQgZWZ4X3BoY19nZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpOwogc3RhdGljIGludCBlZnhfcGhjX3NldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCi0JCQkgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmVfdHMpOworCQkJICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjNjQgKmVfdHMpOwogc3RhdGljIGludCBlZnhfcGhjX2VuYWJsZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKIAkJCSAgc3RydWN0IHB0cF9jbG9ja19yZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgb24pOwogCkBAIC0xMTk4LDggKzExOTgsOCBAQAogCS5wcHMJCT0gMSwKIAkuYWRqZnJlcQk9IGVmeF9waGNfYWRqZnJlcSwKIAkuYWRqdGltZQk9IGVmeF9waGNfYWRqdGltZSwKLQkuZ2V0dGltZQk9IGVmeF9waGNfZ2V0dGltZSwKLQkuc2V0dGltZQk9IGVmeF9waGNfc2V0dGltZSwKKwkuZ2V0dGltZTY0CT0gZWZ4X3BoY19nZXR0aW1lLAorCS5zZXR0aW1lNjQJPSBlZnhfcGhjX3NldHRpbWUsCiAJLmVuYWJsZQkJPSBlZnhfcGhjX2VuYWJsZSwKIH07CiAKQEAgLTE4MzcsNyArMTgzNyw3IEBACiAJCQkgICAgTlVMTCwgMCwgTlVMTCk7CiB9CiAKLXN0YXRpYyBpbnQgZWZ4X3BoY19nZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorc3RhdGljIGludCBlZnhfcGhjX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAlzdHJ1Y3QgZWZ4X3B0cF9kYXRhICpwdHBfZGF0YSA9IGNvbnRhaW5lcl9vZihwdHAsCiAJCQkJCQkgICAgIHN0cnVjdCBlZnhfcHRwX2RhdGEsCkBAIC0xODU5LDI4ICsxODU5LDI4IEBACiAJa3QgPSBwdHBfZGF0YS0+bmljX3RvX2tlcm5lbF90aW1lKAogCQlNQ0RJX0RXT1JEKG91dGJ1ZiwgUFRQX09VVF9SRUFEX05JQ19USU1FX01BSk9SKSwKIAkJTUNESV9EV09SRChvdXRidWYsIFBUUF9PVVRfUkVBRF9OSUNfVElNRV9NSU5PUiksIDApOwotCSp0cyA9IGt0aW1lX3RvX3RpbWVzcGVjKGt0KTsKKwkqdHMgPSBrdGltZV90b190aW1lc3BlYzY0KGt0KTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBlZnhfcGhjX3NldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsCi0JCQkgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmVfdHMpCisJCQkgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWM2NCAqZV90cykKIHsKIAkvKiBHZXQgdGhlIGN1cnJlbnQgTklDIHRpbWUsIGVmeF9waGNfZ2V0dGltZS4KIAkgKiBTdWJ0cmFjdCBmcm9tIHRoZSBkZXNpcmVkIHRpbWUgdG8gZ2V0IHRoZSBvZmZzZXQKIAkgKiBjYWxsIGVmeF9waGNfYWRqdGltZSB3aXRoIHRoZSBvZmZzZXQKIAkgKi8KIAlpbnQgcmM7Ci0Jc3RydWN0IHRpbWVzcGVjIHRpbWVfbm93OwotCXN0cnVjdCB0aW1lc3BlYyBkZWx0YTsKKwlzdHJ1Y3QgdGltZXNwZWM2NCB0aW1lX25vdzsKKwlzdHJ1Y3QgdGltZXNwZWM2NCBkZWx0YTsKIAogCXJjID0gZWZ4X3BoY19nZXR0aW1lKHB0cCwgJnRpbWVfbm93KTsKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCi0JZGVsdGEgPSB0aW1lc3BlY19zdWIoKmVfdHMsIHRpbWVfbm93KTsKKwlkZWx0YSA9IHRpbWVzcGVjNjRfc3ViKCplX3RzLCB0aW1lX25vdyk7CiAKLQlyYyA9IGVmeF9waGNfYWRqdGltZShwdHAsIHRpbWVzcGVjX3RvX25zKCZkZWx0YSkpOworCXJjID0gZWZ4X3BoY19hZGp0aW1lKHB0cCwgdGltZXNwZWM2NF90b19ucygmZGVsdGEpKTsKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2llbmFfc3Jpb3YuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zaWVuYV9zcmlvdi5jCmluZGV4IGE4YmJiYWQuLmZlODM0MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zaWVuYV9zcmlvdi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9zaWVuYV9zcmlvdi5jCkBAIC0xMDY3LDcgKzEwNjcsNyBAQAogfQogCiAvKiBDb3B5IHRoZSBsaXN0IG9mIGluZGl2aWR1YWwgYWRkcmVzc2VzIGludG8gdGhlIHZmZGlfc3RhdHVzLnBlZXJzCi0gKiBhcnJheSBhbmQgYXV4aWxsYXJ5IHBhZ2VzLCBwcm90ZWN0ZWQgYnkgJWxvY2FsX2xvY2suIERyb3AgdGhhdCBsb2NrCisgKiBhcnJheSBhbmQgYXV4aWxpYXJ5IHBhZ2VzLCBwcm90ZWN0ZWQgYnkgJWxvY2FsX2xvY2suIERyb3AgdGhhdCBsb2NrCiAgKiBhbmQgdGhlbiBicm9hZGNhc3QgdGhlIGFkZHJlc3MgbGlzdCB0byBldmVyeSBWRi4KICAqLwogc3RhdGljIHZvaWQgZWZ4X3NpZW5hX3NyaW92X3BlZXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvdmZkaS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3ZmZGkuaAppbmRleCBhZTA0NGY0Li5mNjI5MDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvdmZkaS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy92ZmRpLmgKQEAgLTk4LDcgKzk4LDcgQEAKICAqIEBWRkRJX09QX0lOSVRfVFhROiBJbml0aWFsaXplIFNSQU0gZW50cmllcyBhbmQgaW5pdGlhbGl6ZSBhIFRYUS4KICAqIEBWRkRJX09QX0ZJTklfQUxMX1FVRVVFUzogRmx1c2ggYWxsIHF1ZXVlcywgZmluYWxpemUgYWxsIHF1ZXVlcywgdGhlbgogICoJZmluYWxpemUgdGhlIFNSQU0gZW50cmllcy4KLSAqIEBWRkRJX09QX0lOU0VSVF9GSUxURVI6IEluc2VydCBhIE1BQyBmaWx0ZXIgdGFyZ2V0dGluZyB0aGUgZ2l2ZW4gUlhRLgorICogQFZGRElfT1BfSU5TRVJUX0ZJTFRFUjogSW5zZXJ0IGEgTUFDIGZpbHRlciB0YXJnZXRpbmcgdGhlIGdpdmVuIFJYUS4KICAqIEBWRkRJX09QX1JFTU9WRV9BTExfRklMVEVSUzogUmVtb3ZlIGFsbCBmaWx0ZXJzLgogICogQFZGRElfT1BfU0VUX1NUQVRVU19QQUdFOiBTZXQgdGhlIERNQSBwYWdlKHMpIHVzZWQgZm9yIHN0YXR1cyB1cGRhdGVzCiAgKglmcm9tIFBGIGFuZCB3cml0ZSB0aGUgaW5pdGlhbCBzdGF0dXMuCkBAIC0xNDgsNyArMTQ4LDcgQEAKICAqIEB1LmluaXRfdHhxLmZsYWdzOiBDaGVja3N1bSBvZmZsb2FkIGZsYWdzLgogICogQHUuaW5pdF90eHEuYWRkcjogQXJyYXkgb2YgbGVuZ3RoICV1LmluaXRfdHhxLmJ1Zl9jb3VudCBjb250YWluaW5nIERNQQogICoJYWRkcmVzcyBvZiBlYWNoIHBhZ2UgYmFja2luZyB0aGUgdHJhbnNtaXQgcXVldWUuCi0gKiBAdS5tYWNfZmlsdGVyLnJ4cTogSW5zZXJ0IE1BQyBmaWx0ZXIgYXQgVkYgbG9jYWwgYWRkcmVzcy9WTEFOIHRhcmdldHRpbmcKKyAqIEB1Lm1hY19maWx0ZXIucnhxOiBJbnNlcnQgTUFDIGZpbHRlciBhdCBWRiBsb2NhbCBhZGRyZXNzL1ZMQU4gdGFyZ2V0aW5nCiAgKglhbGwgdHJhZmZpYyBhdCB0aGlzIHJlY2VpdmUgcXVldWUuCiAgKiBAdS5tYWNfZmlsdGVyLmZsYWdzOiBNQUMgZmlsdGVyIGZsYWdzLgogICogQHUuc2V0X3N0YXR1c19wYWdlLmRtYV9hZGRyOiBCYXNlIGFkZHJlc3MgZm9yIHRoZSAmc3RydWN0IHZmZGlfc3RhdHVzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MXguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTF4LmMKaW5kZXggNWQwOTNkYy4uMTRiMzYzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MXguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxeC5jCkBAIC0yMjA0LDI3ICsyMjA0LDE3IEBACiAJCQkJICAgaW50IHZhbHVlLCB1bnNpZ25lZCBpbnQgbnNkZWxheSkKIHsKIAlzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvID0gKmRlc2M7Ci0JaW50IHJlczsKKwllbnVtIGdwaW9kX2ZsYWdzIGZsYWdzID0gdmFsdWUgPyBHUElPRF9PVVRfTE9XIDogR1BJT0RfT1VUX0hJR0g7CiAKLQlncGlvID0gZGV2bV9ncGlvZF9nZXRfaW5kZXgoZGV2LCBuYW1lLCBpbmRleCk7Ci0JaWYgKElTX0VSUihncGlvKSkgewotCQlpZiAoUFRSX0VSUihncGlvKSA9PSAtRU5PRU5UKSB7Ci0JCQkqZGVzYyA9IE5VTEw7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCisJZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4X29wdGlvbmFsKGRldiwgbmFtZSwgaW5kZXgsIGZsYWdzKTsKKwlpZiAoSVNfRVJSKGdwaW8pKQogCQlyZXR1cm4gUFRSX0VSUihncGlvKTsKKworCWlmIChncGlvKSB7CisJCWlmIChuc2RlbGF5KQorCQkJdXNsZWVwX3JhbmdlKG5zZGVsYXksIDIgKiBuc2RlbGF5KTsKKwkJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKGdwaW8sIHZhbHVlKTsKIAl9Ci0JcmVzID0gZ3Bpb2RfZGlyZWN0aW9uX291dHB1dChncGlvLCAhdmFsdWUpOwotCWlmIChyZXMpIHsKLQkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gdG9nZ2xlIGdwaW8gJXM6ICVpXG4iLCBuYW1lLCByZXMpOwotCQlkZXZtX2dwaW9kX3B1dChkZXYsIGdwaW8pOwotCQlncGlvID0gTlVMTDsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JaWYgKG5zZGVsYXkpCi0JCXVzbGVlcF9yYW5nZShuc2RlbGF5LCAyICogbnNkZWxheSk7Ci0JZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKGdwaW8sIHZhbHVlKTsKIAkqZGVzYyA9IGdwaW87CiAKIAlyZXR1cm4gMDsKQEAgLTIyNDgsMTAgKzIyMzgsOSBAQAogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoID0gTlVMTDsKIAlzdHJ1Y3Qgc21jX2xvY2FsICpscDsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgKmlyZXM7CiAJdW5zaWduZWQgaW50IF9faW9tZW0gKmFkZHI7CiAJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3MgPSBTTUNfSVJRX0ZMQUdTOwotCXVuc2lnbmVkIGxvbmcgaXJxX3Jlc2ZsYWdzOwogCWludCByZXQ7CiAKIAluZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzbWNfbG9jYWwpKTsKQEAgLTIzNDMsMTkgKzIzMzIsMTYgQEAKIAkJZ290byBvdXRfZnJlZV9uZXRkZXY7CiAJfQogCi0JbmRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQlpZiAobmRldi0+aXJxIDw9IDApIHsKKwlpcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAoIWlyZXMpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXRfcmVsZWFzZV9pbzsKIAl9Ci0JLyoKLQkgKiBJZiB0aGlzIHBsYXRmb3JtIGRvZXMgbm90IHNwZWNpZnkgYW55IHNwZWNpYWwgaXJxZmxhZ3MsIG9yIGlmCi0JICogdGhlIHJlc291cmNlIHN1cHBsaWVzIGEgdHJpZ2dlciwgb3ZlcnJpZGUgdGhlIGlycWZsYWdzIHdpdGgKLQkgKiB0aGUgdHJpZ2dlciBmbGFncyBmcm9tIHRoZSByZXNvdXJjZS4KLQkgKi8KLQlpcnFfcmVzZmxhZ3MgPSBpcnFkX2dldF90cmlnZ2VyX3R5cGUoaXJxX2dldF9pcnFfZGF0YShuZGV2LT5pcnEpKTsKLQlpZiAoaXJxX2ZsYWdzID09IC0xIHx8IGlycV9yZXNmbGFncyAmIElSUUZfVFJJR0dFUl9NQVNLKQotCQlpcnFfZmxhZ3MgPSBpcnFfcmVzZmxhZ3MgJiBJUlFGX1RSSUdHRVJfTUFTSzsKKworCW5kZXYtPmlycSA9IGlyZXMtPnN0YXJ0OworCisJaWYgKGlycV9mbGFncyA9PSAtMSB8fCBpcmVzLT5mbGFncyAmIElSUUZfVFJJR0dFUl9NQVNLKQorCQlpcnFfZmxhZ3MgPSBpcmVzLT5mbGFncyAmIElSUUZfVFJJR0dFUl9NQVNLOwogCiAJcmV0ID0gc21jX3JlcXVlc3RfYXR0cmliKHBkZXYsIG5kZXYpOwogCWlmIChyZXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5MTF4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5MTF4LmMKaW5kZXggMjk2NWM2YS4uNDEwNDdjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTExeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzkxMXguYwpAQCAtODQzLDcgKzg0Myw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIEluaXRpYWxpc2UgdHggcGFja2V0IHVzaW5nIGJyb2FkY2FzdCBkZXN0aW5hdGlvbiBhZGRyZXNzICovCi0JbWVtc2V0KHBkYXRhLT5sb29wYmFja190eF9wa3QsIDB4ZmYsIEVUSF9BTEVOKTsKKwlldGhfYnJvYWRjYXN0X2FkZHIocGRhdGEtPmxvb3BiYWNrX3R4X3BrdCk7CiAKIAkvKiBVc2UgaW5jcmVtZW50aW5nIHNvdXJjZSBhZGRyZXNzICovCiAJZm9yIChpID0gNjsgaSA8IDEyOyBpKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYy1zb2NmcGdhLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hYy1zb2NmcGdhLmMKaW5kZXggZTk3MDc0Yy4uNWEzNmJkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWMtc29jZnBnYS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2R3bWFjLXNvY2ZwZ2EuYwpAQCAtOTEsNyArOTEsOSBAQAogCQkJCQkJICBTVE1NQUNfUkVTT1VSQ0VfTkFNRSk7CiAJaWYgKElTX0VSUihkd21hYy0+c3RtbWFjX3JzdCkpIHsKIAkJZGV2X2luZm8oZGV2LCAiQ291bGQgbm90IGdldCByZXNldCBjb250cm9sIVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlpZiAoUFRSX0VSUihkd21hYy0+c3RtbWFjX3JzdCkgPT0gLUVQUk9CRV9ERUZFUikKKwkJCXJldHVybiAtRVBST0JFX0RFRkVSOworCQlkd21hYy0+c3RtbWFjX3JzdCA9IE5VTEw7CiAJfQogCiAJZHdtYWMtPmludGVyZmFjZSA9IG9mX2dldF9waHlfbW9kZShucCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hYy5oCmluZGV4IGMwYTM5MTkuLjJhYzk1NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hYy5oCkBAIC05Nyw2ICs5Nyw3IEBACiAJaW50IHdvbG9wdHM7CiAJaW50IHdvbF9pcnE7CiAJc3RydWN0IGNsayAqc3RtbWFjX2NsazsKKwlzdHJ1Y3QgY2xrICpwY2xrOwogCXN0cnVjdCByZXNldF9jb250cm9sICpzdG1tYWNfcnN0OwogCWludCBjbGtfY3NyOwogCXN0cnVjdCB0aW1lcl9saXN0IGVlZV9jdHJsX3RpbWVyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19tYWluLmMKaW5kZXggYTBlYTg0Zi4uMDYxMDNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfbWFpbi5jCkBAIC02MDksNyArNjA5LDcgQEAKIAkJICogd2hlcmUsIGZyZXFfZGl2X3JhdGlvID0gY2xrX3B0cF9yZWZfaS81ME1IegogCQkgKiBoZW5jZSwgYWRkZW5kID0gKCgyXjMyKSAqIDUwTUh6KS9jbGtfcHRwX3JlZl9pOwogCQkgKiBOT1RFOiBjbGtfcHRwX3JlZl9pIHNob3VsZCBiZSA+PSA1ME1IeiB0bwotCQkgKiAgICAgICBhY2hpdmUgMjBucyBhY2N1cmFjeS4KKwkJICogICAgICAgYWNoaWV2ZSAyMG5zIGFjY3VyYWN5LgogCQkgKgogCQkgKiAyXnggKiB5ID09ICh5IDw8IHgpLCBoZW5jZQogCQkgKiAyXjMyICogNTAwMDAwMDAgPT0+ICg1MDAwMDAwMCA8PCAzMikKQEAgLTI4NDksNiArMjg0OSwxNiBAQAogCX0KIAljbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+c3RtbWFjX2Nsayk7CiAKKwlwcml2LT5wY2xrID0gZGV2bV9jbGtfZ2V0KHByaXYtPmRldmljZSwgInBjbGsiKTsKKwlpZiAoSVNfRVJSKHByaXYtPnBjbGspKSB7CisJCWlmIChQVFJfRVJSKHByaXYtPnBjbGspID09IC1FUFJPQkVfREVGRVIpIHsKKwkJCXJldCA9IC1FUFJPQkVfREVGRVI7CisJCQlnb3RvIGVycm9yX3BjbGtfZ2V0OworCQl9CisJCXByaXYtPnBjbGsgPSBOVUxMOworCX0KKwljbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+cGNsayk7CisKIAlwcml2LT5zdG1tYWNfcnN0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChwcml2LT5kZXZpY2UsCiAJCQkJCQkgIFNUTU1BQ19SRVNPVVJDRV9OQU1FKTsKIAlpZiAoSVNfRVJSKHByaXYtPnN0bW1hY19yc3QpKSB7CkBAIC0yOTM0LDYgKzI5NDQsOCBAQAogZXJyb3JfbmV0ZGV2X3JlZ2lzdGVyOgogCW5ldGlmX25hcGlfZGVsKCZwcml2LT5uYXBpKTsKIGVycm9yX2h3X2luaXQ6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPnBjbGspOworZXJyb3JfcGNsa19nZXQ6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPnN0bW1hY19jbGspOwogZXJyb3JfY2xrX2dldDoKIAlmcmVlX25ldGRldihuZGV2KTsKQEAgLTI5NjUsNiArMjk3Nyw3IEBACiAJdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CiAJaWYgKHByaXYtPnN0bW1hY19yc3QpCiAJCXJlc2V0X2NvbnRyb2xfYXNzZXJ0KHByaXYtPnN0bW1hY19yc3QpOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShwcml2LT5wY2xrKTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+c3RtbWFjX2Nsayk7CiAJZnJlZV9uZXRkZXYobmRldik7CiAKQEAgLTMwMTEsNiArMzAyNCw3IEBACiAJCXN0bW1hY19zZXRfbWFjKHByaXYtPmlvYWRkciwgZmFsc2UpOwogCQlwaW5jdHJsX3BtX3NlbGVjdF9zbGVlcF9zdGF0ZShwcml2LT5kZXZpY2UpOwogCQkvKiBEaXNhYmxlIGNsb2NrIGluIGNhc2Ugb2YgUFdNIGlzIG9mZiAqLworCQljbGtfZGlzYWJsZShwcml2LT5wY2xrKTsKIAkJY2xrX2Rpc2FibGUocHJpdi0+c3RtbWFjX2Nsayk7CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKQEAgLTMwNTEsNiArMzA2NSw3IEBACiAJCXBpbmN0cmxfcG1fc2VsZWN0X2RlZmF1bHRfc3RhdGUocHJpdi0+ZGV2aWNlKTsKIAkJLyogZW5hYmxlIHRoZSBjbGsgcHJldm91c2x5IGRpc2FibGVkICovCiAJCWNsa19lbmFibGUocHJpdi0+c3RtbWFjX2Nsayk7CisJCWNsa19lbmFibGUocHJpdi0+cGNsayk7CiAJCS8qIHJlc2V0IHRoZSBwaHkgc28gdGhhdCBpdCdzIHJlYWR5ICovCiAJCWlmIChwcml2LT5taWkpCiAJCQlzdG1tYWNfbWRpb19yZXNldChwcml2LT5taWkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3B0cC5jCmluZGV4IGM1ZWU3OWQuLjE3MGExOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wdHAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcHRwLmMKQEAgLTEwNSwxMyArMTA1LDEyIEBACiAgKiBEZXNjcmlwdGlvbjogdGhpcyBmdW5jdGlvbiB3aWxsIHJlYWQgdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoZQogICogaGFyZHdhcmUgY2xvY2sgYW5kIHN0b3JlIGl0IGluIEB0cy4KICAqLwotc3RhdGljIGludCBzdG1tYWNfZ2V0X3RpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYyAqdHMpCitzdGF0aWMgaW50IHN0bW1hY19nZXRfdGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9CiAJICAgIGNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBzdG1tYWNfcHJpdiwgcHRwX2Nsb2NrX29wcyk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1NjQgbnM7Ci0JdTMyIHJlbWluZGVyOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnB0cF9sb2NrLCBmbGFncyk7CiAKQEAgLTExOSw4ICsxMTgsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHRwX2xvY2ssIGZsYWdzKTsKIAotCXRzLT50dl9zZWMgPSBkaXZfdTY0X3JlbShucywgMTAwMDAwMDAwMFVMTCwgJnJlbWluZGVyKTsKLQl0cy0+dHZfbnNlYyA9IHJlbWluZGVyOworCSp0cyA9IG5zX3RvX3RpbWVzcGVjNjQobnMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMzUsNyArMTMzLDcgQEAKICAqIGhhcmR3YXJlIGNsb2NrLgogICovCiBzdGF0aWMgaW50IHN0bW1hY19zZXRfdGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCSAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMpCisJCQkgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0KIAkgICAgY29udGFpbmVyX29mKHB0cCwgc3RydWN0IHN0bW1hY19wcml2LCBwdHBfY2xvY2tfb3BzKTsKQEAgLTE2OCw4ICsxNjYsOCBAQAogCS5wcHMgPSAwLAogCS5hZGpmcmVxID0gc3RtbWFjX2FkanVzdF9mcmVxLAogCS5hZGp0aW1lID0gc3RtbWFjX2FkanVzdF90aW1lLAotCS5nZXR0aW1lID0gc3RtbWFjX2dldF90aW1lLAotCS5zZXR0aW1lID0gc3RtbWFjX3NldF90aW1lLAorCS5nZXR0aW1lNjQgPSBzdG1tYWNfZ2V0X3RpbWUsCisJLnNldHRpbWU2NCA9IHN0bW1hY19zZXRfdGltZSwKIAkuZW5hYmxlID0gc3RtbWFjX2VuYWJsZSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N1bi9zdW5nZW0uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N1bi9zdW5nZW0uYwppbmRleCBmZWY1ZGVjLi5lMjNhNjQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdW4vc3VuZ2VtLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3VuL3N1bmdlbS5jCkBAIC03MTgsNyArNzE4LDcgQEAKIAljbHVzdGVyX3N0YXJ0ID0gY3VyciA9IChncC0+cnhfbmV3ICYgfig0IC0gMSkpOwogCWNvdW50ID0gMDsKIAlraWNrID0gLTE7Ci0Jd21iKCk7CisJZG1hX3dtYigpOwogCXdoaWxlIChjdXJyICE9IGxpbWl0KSB7CiAJCWN1cnIgPSBORVhUX1JYKGN1cnIpOwogCQlpZiAoKytjb3VudCA9PSA0KSB7CkBAIC0xMDM4LDcgKzEwMzgsNyBAQAogCQlpZiAoZ2VtX2ludG1lKGVudHJ5KSkKIAkJCWN0cmwgfD0gVFhEQ1RSTF9JTlRNRTsKIAkJdHhkLT5idWZmZXIgPSBjcHVfdG9fbGU2NChtYXBwaW5nKTsKLQkJd21iKCk7CisJCWRtYV93bWIoKTsKIAkJdHhkLT5jb250cm9sX3dvcmQgPSBjcHVfdG9fbGU2NChjdHJsKTsKIAkJZW50cnkgPSBORVhUX1RYKGVudHJ5KTsKIAl9IGVsc2UgewpAQCAtMTA3Niw3ICsxMDc2LDcgQEAKIAogCQkJdHhkID0gJmdwLT5pbml0X2Jsb2NrLT50eGRbZW50cnldOwogCQkJdHhkLT5idWZmZXIgPSBjcHVfdG9fbGU2NChtYXBwaW5nKTsKLQkJCXdtYigpOworCQkJZG1hX3dtYigpOwogCQkJdHhkLT5jb250cm9sX3dvcmQgPSBjcHVfdG9fbGU2NCh0aGlzX2N0cmwgfCBsZW4pOwogCiAJCQlpZiAoZ2VtX2ludG1lKGVudHJ5KSkKQEAgLTEwODYsNyArMTA4Niw3IEBACiAJCX0KIAkJdHhkID0gJmdwLT5pbml0X2Jsb2NrLT50eGRbZmlyc3RfZW50cnldOwogCQl0eGQtPmJ1ZmZlciA9IGNwdV90b19sZTY0KGZpcnN0X21hcHBpbmcpOwotCQl3bWIoKTsKKwkJZG1hX3dtYigpOwogCQl0eGQtPmNvbnRyb2xfd29yZCA9CiAJCQljcHVfdG9fbGU2NChjdHJsIHwgVFhEQ1RSTF9TT0YgfCBpbnRtZSB8IGZpcnN0X2xlbik7CiAJfQpAQCAtMTU4NSw3ICsxNTg1LDcgQEAKIAkJCWdwLT5yeF9za2JzW2ldID0gTlVMTDsKIAkJfQogCQlyeGQtPnN0YXR1c193b3JkID0gMDsKLQkJd21iKCk7CisJCWRtYV93bWIoKTsKIAkJcnhkLT5idWZmZXIgPSAwOwogCX0KIApAQCAtMTY0Nyw3ICsxNjQ3LDcgQEAKIAkJCQkJUlhfQlVGX0FMTE9DX1NJWkUoZ3ApLAogCQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQlyeGQtPmJ1ZmZlciA9IGNwdV90b19sZTY0KGRtYV9hZGRyKTsKLQkJd21iKCk7CisJCWRtYV93bWIoKTsKIAkJcnhkLT5zdGF0dXNfd29yZCA9IGNwdV90b19sZTY0KFJYRENUUkxfRlJFU0goZ3ApKTsKIAkJc2tiX3Jlc2VydmUoc2tiLCBSWF9PRkZTRVQpOwogCX0KQEAgLTE2NTYsNyArMTY1Niw3IEBACiAJCXN0cnVjdCBnZW1fdHhkICp0eGQgPSAmZ2ItPnR4ZFtpXTsKIAogCQl0eGQtPmNvbnRyb2xfd29yZCA9IDA7Ci0JCXdtYigpOworCQlkbWFfd21iKCk7CiAJCXR4ZC0+YnVmZmVyID0gMDsKIAl9CiAJd21iKCk7CkBAIC0yMTc1LDcgKzIxNzUsNyBAQAogCX0KIAogCS8qIE1hcmsgdXMgYXMgYXR0YWNoZWQgYWdhaW4gaWYgd2UgY29tZSBmcm9tIHJlc3VtZSgpLCB0aGlzIGhhcwotCSAqIG5vIGVmZmVjdCBpZiB3ZSB3ZXJlbid0IGRldGF0Y2hlZCBhbmQgbmVlZHMgdG8gYmUgZG9uZSBub3cuCisJICogbm8gZWZmZWN0IGlmIHdlIHdlcmVuJ3QgZGV0YWNoZWQgYW5kIG5lZWRzIHRvIGJlIGRvbmUgbm93LgogCSAqLwogCW5ldGlmX2RldmljZV9hdHRhY2goZGV2KTsKIApAQCAtMjc5NCw3ICsyNzk0LDcgQEAKIAogCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwogCi0JCS8qIEVuc3VyZSByZXNldCB0YXNrIGlzIHRydWVseSBnb25lICovCisJCS8qIEVuc3VyZSByZXNldCB0YXNrIGlzIHRydWx5IGdvbmUgKi8KIAkJY2FuY2VsX3dvcmtfc3luYygmZ3AtPnJlc2V0X3Rhc2spOwogCiAJCS8qIEZyZWUgcmVzb3VyY2VzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdW4vc3VuaG1lLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdW4vc3VuaG1lLmMKaW5kZXggN2E4Y2EyYy4uY2Y0ZGNmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3VuL3N1bmhtZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N1bi9zdW5obWUuYwpAQCAtMTk2LDE0ICsxOTYsMTQgQEAKIHN0YXRpYyB2b2lkIHNidXNfaG1lX3dyaXRlX3J4ZChzdHJ1Y3QgaGFwcHlfbWVhbF9yeGQgKnJ4ZCwgdTMyIGZsYWdzLCB1MzIgYWRkcikKIHsKIAlyeGQtPnJ4X2FkZHIgPSAoX19mb3JjZSBobWUzMilhZGRyOwotCXdtYigpOworCWRtYV93bWIoKTsKIAlyeGQtPnJ4X2ZsYWdzID0gKF9fZm9yY2UgaG1lMzIpZmxhZ3M7CiB9CiAKIHN0YXRpYyB2b2lkIHNidXNfaG1lX3dyaXRlX3R4ZChzdHJ1Y3QgaGFwcHlfbWVhbF90eGQgKnR4ZCwgdTMyIGZsYWdzLCB1MzIgYWRkcikKIHsKIAl0eGQtPnR4X2FkZHIgPSAoX19mb3JjZSBobWUzMilhZGRyOwotCXdtYigpOworCWRtYV93bWIoKTsKIAl0eGQtPnR4X2ZsYWdzID0gKF9fZm9yY2UgaG1lMzIpZmxhZ3M7CiB9CiAKQEAgLTIyNSwxNCArMjI1LDE0IEBACiBzdGF0aWMgdm9pZCBwY2lfaG1lX3dyaXRlX3J4ZChzdHJ1Y3QgaGFwcHlfbWVhbF9yeGQgKnJ4ZCwgdTMyIGZsYWdzLCB1MzIgYWRkcikKIHsKIAlyeGQtPnJ4X2FkZHIgPSAoX19mb3JjZSBobWUzMiljcHVfdG9fbGUzMihhZGRyKTsKLQl3bWIoKTsKKwlkbWFfd21iKCk7CiAJcnhkLT5yeF9mbGFncyA9IChfX2ZvcmNlIGhtZTMyKWNwdV90b19sZTMyKGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgcGNpX2htZV93cml0ZV90eGQoc3RydWN0IGhhcHB5X21lYWxfdHhkICp0eGQsIHUzMiBmbGFncywgdTMyIGFkZHIpCiB7CiAJdHhkLT50eF9hZGRyID0gKF9fZm9yY2UgaG1lMzIpY3B1X3RvX2xlMzIoYWRkcik7Ci0Jd21iKCk7CisJZG1hX3dtYigpOwogCXR4ZC0+dHhfZmxhZ3MgPSAoX19mb3JjZSBobWUzMiljcHVfdG9fbGUzMihmbGFncyk7CiB9CiAKQEAgLTI2OCwxMiArMjY4LDEyIEBACiAJc2J1c19yZWFkbChfX3JlZykKICNkZWZpbmUgaG1lX3dyaXRlX3J4ZChfX2hwLCBfX3J4ZCwgX19mbGFncywgX19hZGRyKSBcCiBkbyB7CShfX3J4ZCktPnJ4X2FkZHIgPSAoX19mb3JjZSBobWUzMikodTMyKShfX2FkZHIpOyBcCi0Jd21iKCk7IFwKKwlkbWFfd21iKCk7IFwKIAkoX19yeGQpLT5yeF9mbGFncyA9IChfX2ZvcmNlIGhtZTMyKSh1MzIpKF9fZmxhZ3MpOyBcCiB9IHdoaWxlKDApCiAjZGVmaW5lIGhtZV93cml0ZV90eGQoX19ocCwgX190eGQsIF9fZmxhZ3MsIF9fYWRkcikgXAogZG8gewkoX190eGQpLT50eF9hZGRyID0gKF9fZm9yY2UgaG1lMzIpKHUzMikoX19hZGRyKTsgXAotCXdtYigpOyBcCisJZG1hX3dtYigpOyBcCiAJKF9fdHhkKS0+dHhfZmxhZ3MgPSAoX19mb3JjZSBobWUzMikodTMyKShfX2ZsYWdzKTsgXAogfSB3aGlsZSgwKQogI2RlZmluZSBobWVfcmVhZF9kZXNjMzIoX19ocCwgX19wKQkoKF9fZm9yY2UgdTMyKShobWUzMikqKF9fcCkpCkBAIC0yOTMsMTIgKzI5MywxMiBAQAogCXJlYWRsKF9fcmVnKQogI2RlZmluZSBobWVfd3JpdGVfcnhkKF9faHAsIF9fcnhkLCBfX2ZsYWdzLCBfX2FkZHIpIFwKIGRvIHsJKF9fcnhkKS0+cnhfYWRkciA9IChfX2ZvcmNlIGhtZTMyKWNwdV90b19sZTMyKF9fYWRkcik7IFwKLQl3bWIoKTsgXAorCWRtYV93bWIoKTsgXAogCShfX3J4ZCktPnJ4X2ZsYWdzID0gKF9fZm9yY2UgaG1lMzIpY3B1X3RvX2xlMzIoX19mbGFncyk7IFwKIH0gd2hpbGUoMCkKICNkZWZpbmUgaG1lX3dyaXRlX3R4ZChfX2hwLCBfX3R4ZCwgX19mbGFncywgX19hZGRyKSBcCiBkbyB7CShfX3R4ZCktPnR4X2FkZHIgPSAoX19mb3JjZSBobWUzMiljcHVfdG9fbGUzMihfX2FkZHIpOyBcCi0Jd21iKCk7IFwKKwlkbWFfd21iKCk7IFwKIAkoX190eGQpLT50eF9mbGFncyA9IChfX2ZvcmNlIGhtZTMyKWNwdV90b19sZTMyKF9fZmxhZ3MpOyBcCiB9IHdoaWxlKDApCiBzdGF0aWMgaW5saW5lIHUzMiBobWVfcmVhZF9kZXNjMzIoc3RydWN0IGhhcHB5X21lYWwgKmhwLCBobWUzMiAqcCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N1bi9zdW52bmV0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdW4vc3Vudm5ldC5jCmluZGV4IDIyZTBjYWQuLjUzZmUyMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N1bi9zdW52bmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3VuL3N1bnZuZXQuYwpAQCAtNTE5LDcgKzUxOSw3IEBACiAJaWYgKGRlc2MtPmhkci5zdGF0ZSAhPSBWSU9fREVTQ19SRUFEWSkKIAkJcmV0dXJuIDE7CiAKLQlybWIoKTsKKwlkbWFfcm1iKCk7CiAKIAl2aW9kYmcoREFUQSwgInZpb193YWxrX3J4X29uZSBkZXNjWyUwMng6JTAyeDolMDh4OiUwOHg6JWxseDolbGx4XVxuIiwKIAkgICAgICAgZGVzYy0+aGRyLnN0YXRlLCBkZXNjLT5oZHIuYWNrLApAQCAtMTM4MCw3ICsxMzgwLDcgQEAKIAkvKiBUaGlzIGhhcyB0byBiZSBhIG5vbi1TTVAgd3JpdGUgYmFycmllciBiZWNhdXNlIHdlIGFyZSB3cml0aW5nCiAJICogdG8gbWVtb3J5IHdoaWNoIGlzIHNoYXJlZCB3aXRoIHRoZSBwZWVyIExET00uCiAJICovCi0Jd21iKCk7CisJZG1hX3dtYigpOwogCiAJZC0+aGRyLnN0YXRlID0gVklPX0RFU0NfUkVBRFk7CiAKQEAgLTEzOTUsNyArMTM5NSw3IEBACiAJICogaXMgbWFya2VkIFJFQURZLCBidXQgc3RhcnRfY29ucyB3YXMgZmFsc2UuCiAJICogSWYgc28sIHZuZXRfYWNrKCkgc2hvdWxkIHNlbmQgb3V0IHRoZSBtaXNzZWQgInN0YXJ0IiB0cmlnZ2VyLgogCSAqCi0JICogTm90ZSB0aGF0IHRoZSB3bWIoKSBhYm92ZSBtYWtlcyBzdXJlIHRoZSBjb29raWVzIGV0IGFsLiBhcmUKKwkgKiBOb3RlIHRoYXQgdGhlIGRtYV93bWIoKSBhYm92ZSBtYWtlcyBzdXJlIHRoZSBjb29raWVzIGV0IGFsLiBhcmUKIAkgKiBub3QgZ2xvYmFsbHkgdmlzaWJsZSBiZWZvcmUgdGhlIFZJT19ERVNDX1JFQURZLCBhbmQgdGhhdCB0aGUKIAkgKiBzdG9yZXMgYXJlIG9yZGVyZWQgY29ycmVjdGx5IGJ5IHRoZSBjb21waWxlci4gVGhlIGNvbnN1bWVyIHdpbGwKIAkgKiBub3QgcHJvY2VlZCB1bnRpbCB0aGUgVklPX0RFU0NfUkVBRFkgaXMgdmlzaWJsZSBhc3N1cmluZyB0aGF0CkBAIC0xNDExLDYgKzE0MTEsOCBAQAogCWlmICh1bmxpa2VseShlcnIgPCAwKSkgewogCQluZXRkZXZfaW5mbyhkZXYsICJUWCB0cmlnZ2VyIGVycm9yICVkXG4iLCBlcnIpOwogCQlkLT5oZHIuc3RhdGUgPSBWSU9fREVTQ19GUkVFOworCQlza2IgPSBwb3J0LT50eF9idWZzW3R4aV0uc2tiOworCQlwb3J0LT50eF9idWZzW3R4aV0uc2tiID0gTlVMTDsKIAkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycysrOwogCQlnb3RvIG91dF9kcm9wcGVkOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9LY29uZmlnCmluZGV4IGY2YTcxMDkuLjYzMWUwYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvS2NvbmZpZwpAQCAtODgsNiArODgsNyBAQAogY29uZmlnIFRJX0tFWVNUT05FX05FVENQCiAJdHJpc3RhdGUgIlRJIEtleXN0b25lIE5FVENQIENvcmUgU3VwcG9ydCIKIAlzZWxlY3QgVElfQ1BTV19BTEUKKwlzZWxlY3QgVElfREFWSU5DSV9NRElPCiAJZGVwZW5kcyBvbiBPRgogCWRlcGVuZHMgb24gS0VZU1RPTkVfTkFWSUdBVE9SX0RNQSAmJiBLRVlTVE9ORV9OQVZJR0FUT1JfUU1TUwogCS0tLWhlbHAtLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2Nwc3cuYwppbmRleCBhMWJiYWY2Li5iNTM2YjRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHN3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3Bzdy5jCkBAIC03MjYsNyArNzI2LDcgQEAKIAkJaWYgKG5kZXZfc3RhdHVzICYmIChzdGF0dXMgPj0gMCkpIHsKIAkJCS8qIFRoZSBwYWNrZXQgcmVjZWl2ZWQgaXMgZm9yIHRoZSBpbnRlcmZhY2Ugd2hpY2gKIAkJCSAqIGlzIGFscmVhZHkgZG93biBhbmQgdGhlIG90aGVyIGludGVyZmFjZSBpcyB1cAotCQkJICogYW5kIHJ1bm5pbmcsIGludGVhZCBvZiBmcmVlaW5nIHdoaWNoIHJlc3VsdHMKKwkJCSAqIGFuZCBydW5uaW5nLCBpbnN0ZWFkIG9mIGZyZWVpbmcgd2hpY2ggcmVzdWx0cwogCQkJICogaW4gcmVkdWNpbmcgb2YgdGhlIG51bWJlciBvZiByeCBkZXNjcmlwdG9yIGluCiAJCQkgKiBETUEgZW5naW5lLCByZXF1ZXVlIHNrYiBiYWNrIHRvIGNwZG1hLgogCQkJICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHRzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9jcHRzLmMKaW5kZXggZmJlNDJjYi4uODVhNTViNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvY3B0cy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2NwdHMuYwpAQCAtMTY3LDEwICsxNjcsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNwdHNfcHRwX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYyAqdHMpCitzdGF0aWMgaW50IGNwdHNfcHRwX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAl1NjQgbnM7Ci0JdTMyIHJlbWFpbmRlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBjcHRzICpjcHRzID0gY29udGFpbmVyX29mKHB0cCwgc3RydWN0IGNwdHMsIGluZm8pOwogCkBAIC0xNzgsMjEgKzE3NywxOSBAQAogCW5zID0gdGltZWNvdW50ZXJfcmVhZCgmY3B0cy0+dGMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwdHMtPmxvY2ssIGZsYWdzKTsKIAotCXRzLT50dl9zZWMgPSBkaXZfdTY0X3JlbShucywgMTAwMDAwMDAwMCwgJnJlbWFpbmRlcik7Ci0JdHMtPnR2X25zZWMgPSByZW1haW5kZXI7CisJKnRzID0gbnNfdG9fdGltZXNwZWM2NChucyk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjcHRzX3B0cF9zZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLAotCQkJICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMpCisJCQkgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXU2NCBuczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBjcHRzICpjcHRzID0gY29udGFpbmVyX29mKHB0cCwgc3RydWN0IGNwdHMsIGluZm8pOwogCi0JbnMgPSB0cy0+dHZfc2VjICogMTAwMDAwMDAwMFVMTDsKLQlucyArPSB0cy0+dHZfbnNlYzsKKwlucyA9IHRpbWVzcGVjNjRfdG9fbnModHMpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNwdHMtPmxvY2ssIGZsYWdzKTsKIAl0aW1lY291bnRlcl9pbml0KCZjcHRzLT50YywgJmNwdHMtPmNjLCBucyk7CkBAIC0yMTYsMjAgKzIxMywyMCBAQAogCS5wcHMJCT0gMCwKIAkuYWRqZnJlcQk9IGNwdHNfcHRwX2FkamZyZXEsCiAJLmFkanRpbWUJPSBjcHRzX3B0cF9hZGp0aW1lLAotCS5nZXR0aW1lCT0gY3B0c19wdHBfZ2V0dGltZSwKLQkuc2V0dGltZQk9IGNwdHNfcHRwX3NldHRpbWUsCisJLmdldHRpbWU2NAk9IGNwdHNfcHRwX2dldHRpbWUsCisJLnNldHRpbWU2NAk9IGNwdHNfcHRwX3NldHRpbWUsCiAJLmVuYWJsZQkJPSBjcHRzX3B0cF9lbmFibGUsCiB9OwogCiBzdGF0aWMgdm9pZCBjcHRzX292ZXJmbG93X2NoZWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHRpbWVzcGVjNjQgdHM7CiAJc3RydWN0IGNwdHMgKmNwdHMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNwdHMsIG92ZXJmbG93X3dvcmsud29yayk7CiAKIAljcHRzX3dyaXRlMzIoY3B0cywgQ1BUU19FTiwgY29udHJvbCk7CiAJY3B0c193cml0ZTMyKGNwdHMsIFRTX1BFTkRfRU4sIGludF9lbmFibGUpOwogCWNwdHNfcHRwX2dldHRpbWUoJmNwdHMtPmluZm8sICZ0cyk7Ci0JcHJfZGVidWcoImNwdHMgb3ZlcmZsb3cgY2hlY2sgYXQgJWxkLiUwOWx1XG4iLCB0cy50dl9zZWMsIHRzLnR2X25zZWMpOworCXByX2RlYnVnKCJjcHRzIG92ZXJmbG93IGNoZWNrIGF0ICVsbGQuJTA5bHVcbiIsIHRzLnR2X3NlYywgdHMudHZfbnNlYyk7CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjcHRzLT5vdmVyZmxvd193b3JrLCBDUFRTX09WRVJGTE9XX1BFUklPRCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL25ldGNwLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9uZXRjcC5oCmluZGV4IDkwNmU5YmMuLmJiYWNmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL25ldGNwLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvbmV0Y3AuaApAQCAtNDEsNyArNDEsMTAgQEAKIAlzdHJ1Y3QgbmV0Y3BfZGV2aWNlCSpuZXRjcF9kZXZpY2U7CiAJdm9pZAkJCSpkbWFfcXVldWU7CiAJdW5zaWduZWQgaW50CQlkbWFfcXVldWVfaWQ7Ci0JdTgJCQlkbWFfcHNmbGFnczsKKwkvKiBUbyBwb3J0IGZvciBwYWNrZXQgZm9yd2FyZGVkIHRvIHN3aXRjaC4gVXNlZCBvbmx5IGJ5IGV0aHNzICovCisJdTgJCQlzd2l0Y2hfdG9fcG9ydDsKKyNkZWZpbmUJU1dJVENIX1RPX1BPUlRfSU5fVEFHSU5GTwlCSVQoMCkKKwl1OAkJCWZsYWdzOwogCXZvaWQJCQkqZG1hX2NoYW5uZWw7CiAJY29uc3QgY2hhcgkJKmRtYV9jaGFuX25hbWU7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvbmV0Y3BfY29yZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvbmV0Y3BfY29yZS5jCmluZGV4IGEzMWE4YzMuLjQzZWZjM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL25ldGNwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9uZXRjcF9jb3JlLmMKQEAgLTEwOTgsOSArMTA5OCw5IEBACiAJc3RydWN0IG5ldGNwX3R4X3BpcGUgKnR4X3BpcGUgPSBOVUxMOwogCXN0cnVjdCBuZXRjcF9ob29rX2xpc3QgKnR4X2hvb2s7CiAJc3RydWN0IG5ldGNwX3BhY2tldCBwX2luZm87Ci0JdTMyIHBhY2tldF9pbmZvID0gMDsKIAl1bnNpZ25lZCBpbnQgZG1hX3N6OwogCWRtYV9hZGRyX3QgZG1hOworCXUzMiB0bXAgPSAwOwogCWludCByZXQgPSAwOwogCiAJcF9pbmZvLm5ldGNwID0gbmV0Y3A7CkBAIC0xMTQwLDIwICsxMTQwLDI3IEBACiAJCW1lbW1vdmUocF9pbmZvLnBzZGF0YSwgcF9pbmZvLnBzZGF0YSArIHBfaW5mby5wc2RhdGFfbGVuLAogCQkJcF9pbmZvLnBzZGF0YV9sZW4pOwogCQlzZXRfd29yZHMocHNkYXRhLCBwX2luZm8ucHNkYXRhX2xlbiwgcHNkYXRhKTsKLQkJcGFja2V0X2luZm8gfD0KLQkJCShwX2luZm8ucHNkYXRhX2xlbiAmIEtOQVZfRE1BX0RFU0NfUFNMRU5fTUFTSykgPDwKKwkJdG1wIHw9IChwX2luZm8ucHNkYXRhX2xlbiAmIEtOQVZfRE1BX0RFU0NfUFNMRU5fTUFTSykgPDwKIAkJCUtOQVZfRE1BX0RFU0NfUFNMRU5fU0hJRlQ7CiAJfQogCi0JcGFja2V0X2luZm8gfD0gS05BVl9ETUFfREVTQ19IQVNfRVBJQiB8CisJdG1wIHw9IEtOQVZfRE1BX0RFU0NfSEFTX0VQSUIgfAogCQkoKG5ldGNwLT50eF9jb21wbF9xaWQgJiBLTkFWX0RNQV9ERVNDX1JFVFFfTUFTSykgPDwKLQkJS05BVl9ETUFfREVTQ19SRVRRX1NISUZUKSB8Ci0JCSgodHhfcGlwZS0+ZG1hX3BzZmxhZ3MgJiBLTkFWX0RNQV9ERVNDX1BTRkxBR19NQVNLKSA8PAotCQlLTkFWX0RNQV9ERVNDX1BTRkxBR19TSElGVCk7CisJCUtOQVZfRE1BX0RFU0NfUkVUUV9TSElGVCk7CiAKLQlzZXRfd29yZHMoJnBhY2tldF9pbmZvLCAxLCAmZGVzYy0+cGFja2V0X2luZm8pOworCWlmICghKHR4X3BpcGUtPmZsYWdzICYgU1dJVENIX1RPX1BPUlRfSU5fVEFHSU5GTykpIHsKKwkJdG1wIHw9ICgodHhfcGlwZS0+c3dpdGNoX3RvX3BvcnQgJiBLTkFWX0RNQV9ERVNDX1BTRkxBR19NQVNLKSA8PAorCQkJS05BVl9ETUFfREVTQ19QU0ZMQUdfU0hJRlQpOworCX0KKworCXNldF93b3JkcygmdG1wLCAxLCAmZGVzYy0+cGFja2V0X2luZm8pOwogCXNldF93b3JkcygodTMyICopJnNrYiwgMSwgJmRlc2MtPnBhZFswXSk7CiAKKwlpZiAodHhfcGlwZS0+ZmxhZ3MgJiBTV0lUQ0hfVE9fUE9SVF9JTl9UQUdJTkZPKSB7CisJCXRtcCA9IHR4X3BpcGUtPnN3aXRjaF90b19wb3J0OworCQlzZXRfd29yZHMoKHUzMiAqKSZ0bXAsIDEsICZkZXNjLT50YWdfaW5mbyk7CisJfQorCiAJLyogc3VibWl0IHBhY2tldCBkZXNjcmlwdG9yICovCiAJcmV0ID0ga25hdl9wb29sX2Rlc2NfbWFwKG5ldGNwLT50eF9wb29sLCBkZXNjLCBzaXplb2YoKmRlc2MpLCAmZG1hLAogCQkJCSAmZG1hX3N6KTsKQEAgLTEzMjAsNyArMTMyNyw3IEBACiAJaWYgKGFkZHIpCiAJCWV0aGVyX2FkZHJfY29weShuYWRkci0+YWRkciwgYWRkcik7CiAJZWxzZQotCQltZW1zZXQobmFkZHItPmFkZHIsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcihuYWRkci0+YWRkcik7CiAJbGlzdF9hZGRfdGFpbCgmbmFkZHItPm5vZGUsICZuZXRjcC0+YWRkcl9saXN0KTsKIAogCXJldHVybiBuYWRkcjsKQEAgLTIxMjcsNyArMjEzNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAidGksbmV0Y3AtMS4wIiwgfSwKIAl7fSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9uZXRjcF9ldGhzcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvbmV0Y3BfZXRoc3MuYwppbmRleCA4NGY1Y2U1Li4yYmVmNjU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9uZXRjcF9ldGhzcy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL25ldGNwX2V0aHNzLmMKQEAgLTQwLDM1ICs0MCw2MSBAQAogI2RlZmluZSBHQkVfTU9EVUxFX05BTUUJCQkibmV0Y3AtZ2JlIgogI2RlZmluZSBHQkVfU1NfVkVSU0lPTl8xNAkJMHg0ZWQyMTEwNAogCisjZGVmaW5lIEdCRV9TU19SRUdfSU5ERVgJCTAKKyNkZWZpbmUgR0JFX1NHTUlJMzRfUkVHX0lOREVYCQkxCisjZGVmaW5lIEdCRV9TTV9SRUdfSU5ERVgJCTIKKy8qIG9mZnNldCByZWxhdGl2ZSB0byBiYXNlIG9mIEdCRV9TU19SRUdfSU5ERVggKi8KICNkZWZpbmUgR0JFMTNfU0dNSUlfTU9EVUxFX09GRlNFVAkweDEwMAotI2RlZmluZSBHQkUxM19TR01JSTM0X01PRFVMRV9PRkZTRVQJMHg0MDAKLSNkZWZpbmUgR0JFMTNfU1dJVENIX01PRFVMRV9PRkZTRVQJMHg4MDAKLSNkZWZpbmUgR0JFMTNfSE9TVF9QT1JUX09GRlNFVAkJMHg4MzQKLSNkZWZpbmUgR0JFMTNfU0xBVkVfUE9SVF9PRkZTRVQJCTB4ODYwCi0jZGVmaW5lIEdCRTEzX0VNQUNfT0ZGU0VUCQkweDkwMAotI2RlZmluZSBHQkUxM19TTEFWRV9QT1JUMl9PRkZTRVQJMHhhMDAKLSNkZWZpbmUgR0JFMTNfSFdfU1RBVFNfT0ZGU0VUCQkweGIwMAotI2RlZmluZSBHQkUxM19BTEVfT0ZGU0VUCQkweGUwMAorLyogb2Zmc2V0IHJlbGF0aXZlIHRvIGJhc2Ugb2YgR0JFX1NNX1JFR19JTkRFWCAqLworI2RlZmluZSBHQkUxM19IT1NUX1BPUlRfT0ZGU0VUCQkweDM0CisjZGVmaW5lIEdCRTEzX1NMQVZFX1BPUlRfT0ZGU0VUCQkweDYwCisjZGVmaW5lIEdCRTEzX0VNQUNfT0ZGU0VUCQkweDEwMAorI2RlZmluZSBHQkUxM19TTEFWRV9QT1JUMl9PRkZTRVQJMHgyMDAKKyNkZWZpbmUgR0JFMTNfSFdfU1RBVFNfT0ZGU0VUCQkweDMwMAorI2RlZmluZSBHQkUxM19BTEVfT0ZGU0VUCQkweDYwMAogI2RlZmluZSBHQkUxM19IT1NUX1BPUlRfTlVNCQkwCi0jZGVmaW5lIEdCRTEzX05VTV9TTEFWRVMJCTQKLSNkZWZpbmUgR0JFMTNfTlVNX0FMRV9QT1JUUwkJKEdCRTEzX05VTV9TTEFWRVMgKyAxKQogI2RlZmluZSBHQkUxM19OVU1fQUxFX0VOVFJJRVMJCTEwMjQKIAorLyogMUcgRXRoZXJuZXQgTlUgU1MgZGVmaW5lcyAqLworI2RlZmluZSBHQkVOVV9NT0RVTEVfTkFNRQkJIm5ldGNwLWdiZW51IgorI2RlZmluZSBHQkVfU1NfSURfTlUJCQkweDRlZTYKKyNkZWZpbmUgR0JFX1NTX0lEXzJVCQkJMHg0ZWU4CisKKyNkZWZpbmUgSVNfU1NfSURfTVUoZCkgXAorCSgoR0JFX0lERU5UKChkKS0+c3NfdmVyc2lvbikgPT0gR0JFX1NTX0lEX05VKSB8fCBcCisJIChHQkVfSURFTlQoKGQpLT5zc192ZXJzaW9uKSA9PSBHQkVfU1NfSURfMlUpKQorCisjZGVmaW5lIElTX1NTX0lEX05VKGQpIFwKKwkoR0JFX0lERU5UKChkKS0+c3NfdmVyc2lvbikgPT0gR0JFX1NTX0lEX05VKQorCisjZGVmaW5lIEdCRU5VX1NTX1JFR19JTkRFWAkJMAorI2RlZmluZSBHQkVOVV9TTV9SRUdfSU5ERVgJCTEKKyNkZWZpbmUgR0JFTlVfU0dNSUlfTU9EVUxFX09GRlNFVAkweDEwMAorI2RlZmluZSBHQkVOVV9IT1NUX1BPUlRfT0ZGU0VUCQkweDEwMDAKKyNkZWZpbmUgR0JFTlVfU0xBVkVfUE9SVF9PRkZTRVQJCTB4MjAwMAorI2RlZmluZSBHQkVOVV9FTUFDX09GRlNFVAkJMHgyMzMwCisjZGVmaW5lIEdCRU5VX0hXX1NUQVRTX09GRlNFVAkJMHgxYTAwMAorI2RlZmluZSBHQkVOVV9BTEVfT0ZGU0VUCQkweDFlMDAwCisjZGVmaW5lIEdCRU5VX0hPU1RfUE9SVF9OVU0JCTAKKyNkZWZpbmUgR0JFTlVfTlVNX0FMRV9FTlRSSUVTCQkxMDI0CisKIC8qIDEwRyBFdGhlcm5ldCBTUyBkZWZpbmVzICovCiAjZGVmaW5lIFhHQkVfTU9EVUxFX05BTUUJCSJuZXRjcC14Z2JlIgogI2RlZmluZSBYR0JFX1NTX1ZFUlNJT05fMTAJCTB4NGVlNDIxMDAKIAotI2RlZmluZSBYR0JFX1NFUkRFU19SRUdfSU5ERVgJCTEKKyNkZWZpbmUgWEdCRV9TU19SRUdfSU5ERVgJCTAKKyNkZWZpbmUgWEdCRV9TTV9SRUdfSU5ERVgJCTEKKyNkZWZpbmUgWEdCRV9TRVJERVNfUkVHX0lOREVYCQkyCisKKy8qIG9mZnNldCByZWxhdGl2ZSB0byBiYXNlIG9mIFhHQkVfU1NfUkVHX0lOREVYICovCiAjZGVmaW5lIFhHQkUxMF9TR01JSV9NT0RVTEVfT0ZGU0VUCTB4MTAwCi0jZGVmaW5lIFhHQkUxMF9TV0lUQ0hfTU9EVUxFX09GRlNFVAkweDEwMDAKLSNkZWZpbmUgWEdCRTEwX0hPU1RfUE9SVF9PRkZTRVQJCTB4MTAzNAotI2RlZmluZSBYR0JFMTBfU0xBVkVfUE9SVF9PRkZTRVQJMHgxMDY0Ci0jZGVmaW5lIFhHQkUxMF9FTUFDX09GRlNFVAkJMHgxNDAwCi0jZGVmaW5lIFhHQkUxMF9BTEVfT0ZGU0VUCQkweDE3MDAKLSNkZWZpbmUgWEdCRTEwX0hXX1NUQVRTX09GRlNFVAkJMHgxODAwCisvKiBvZmZzZXQgcmVsYXRpdmUgdG8gYmFzZSBvZiBYR0JFX1NNX1JFR19JTkRFWCAqLworI2RlZmluZSBYR0JFMTBfSE9TVF9QT1JUX09GRlNFVAkJMHgzNAorI2RlZmluZSBYR0JFMTBfU0xBVkVfUE9SVF9PRkZTRVQJMHg2NAorI2RlZmluZSBYR0JFMTBfRU1BQ19PRkZTRVQJCTB4NDAwCisjZGVmaW5lIFhHQkUxMF9BTEVfT0ZGU0VUCQkweDcwMAorI2RlZmluZSBYR0JFMTBfSFdfU1RBVFNfT0ZGU0VUCQkweDgwMAogI2RlZmluZSBYR0JFMTBfSE9TVF9QT1JUX05VTQkJMAotI2RlZmluZSBYR0JFMTBfTlVNX1NMQVZFUwkJMgotI2RlZmluZSBYR0JFMTBfTlVNX0FMRV9QT1JUUwkJKFhHQkUxMF9OVU1fU0xBVkVTICsgMSkKICNkZWZpbmUgWEdCRTEwX05VTV9BTEVfRU5UUklFUwkJMTAyNAogCiAjZGVmaW5lCUdCRV9USU1FUl9JTlRFUlZBTAkJCShIWiAvIDIpCkBAIC04OCw3ICsxMTQsNyBAQAogI2RlZmluZSBNQUNTTF9GVUxMRFVQTEVYCQkJQklUKDApCiAKICNkZWZpbmUgR0JFX0NUTF9QMF9FTkFCTEUJCQlCSVQoMikKLSNkZWZpbmUgR0JFX1JFR19WQUxfU1RBVF9FTkFCTEVfQUxMCQkweGZmCisjZGVmaW5lIEdCRTEzX1JFR19WQUxfU1RBVF9FTkFCTEVfQUxMCQkweGZmCiAjZGVmaW5lIFhHQkVfUkVHX1ZBTF9TVEFUX0VOQUJMRV9BTEwJCTB4ZgogI2RlZmluZSBHQkVfU1RBVFNfQ0RfU0VMCQkJQklUKDI4KQogCkBAIC0xMDgsMTEgKzEzNCwyMCBAQAogI2RlZmluZSBHQkVfU1RBVFNDX01PRFVMRQkJCTIKICNkZWZpbmUgR0JFX1NUQVRTRF9NT0RVTEUJCQkzCiAKKyNkZWZpbmUgR0JFTlVfU1RBVFMwX01PRFVMRQkJCTAKKyNkZWZpbmUgR0JFTlVfU1RBVFMxX01PRFVMRQkJCTEKKyNkZWZpbmUgR0JFTlVfU1RBVFMyX01PRFVMRQkJCTIKKyNkZWZpbmUgR0JFTlVfU1RBVFMzX01PRFVMRQkJCTMKKyNkZWZpbmUgR0JFTlVfU1RBVFM0X01PRFVMRQkJCTQKKyNkZWZpbmUgR0JFTlVfU1RBVFM1X01PRFVMRQkJCTUKKyNkZWZpbmUgR0JFTlVfU1RBVFM2X01PRFVMRQkJCTYKKyNkZWZpbmUgR0JFTlVfU1RBVFM3X01PRFVMRQkJCTcKKyNkZWZpbmUgR0JFTlVfU1RBVFM4X01PRFVMRQkJCTgKKwogI2RlZmluZSBYR0JFX1NUQVRTMF9NT0RVTEUJCQkwCiAjZGVmaW5lIFhHQkVfU1RBVFMxX01PRFVMRQkJCTEKICNkZWZpbmUgWEdCRV9TVEFUUzJfTU9EVUxFCQkJMgogCi0jZGVmaW5lIE1BWF9TTEFWRVMJCQkJR0JFMTNfTlVNX1NMQVZFUwogLyogczogMC1iYXNlZCBzbGF2ZV9wb3J0ICovCiAjZGVmaW5lIFNHTUlJX0JBU0UocykgXAogCSgoKHMpIDwgMikgPyBnYmVfZGV2LT5zZ21paV9wb3J0X3JlZ3MgOiBnYmVfZGV2LT5zZ21paV9wb3J0MzRfcmVncykKQEAgLTEyNSwxMCArMTYwLDE0IEBACiAKICNkZWZpbmUgR0JFX1NFVF9SRUdfT0ZTKHAsIHJiLCBybikgcC0+cmIjI19vZnMucm4gPSBcCiAJCW9mZnNldG9mKHN0cnVjdCBnYmUjI18jI3JiLCBybikKKyNkZWZpbmUgR0JFTlVfU0VUX1JFR19PRlMocCwgcmIsIHJuKSBwLT5yYiMjX29mcy5ybiA9IFwKKwkJb2Zmc2V0b2Yoc3RydWN0IGdiZW51IyNfIyNyYiwgcm4pCiAjZGVmaW5lIFhHQkVfU0VUX1JFR19PRlMocCwgcmIsIHJuKSBwLT5yYiMjX29mcy5ybiA9IFwKIAkJb2Zmc2V0b2Yoc3RydWN0IHhnYmUjI18jI3JiLCBybikKICNkZWZpbmUgR0JFX1JFR19BRERSKHAsIHJiLCBybikgKHAtPnJiICsgcC0+cmIjI19vZnMucm4pCiAKKyNkZWZpbmUgSE9TVF9UWF9QUklfTUFQX0RFRkFVTFQJCQkweDAwMDAwMDAwCisKIHN0cnVjdCB4Z2JlX3NzX3JlZ3MgewogCXUzMglpZF92ZXI7CiAJdTMyCXN5bmNlX2NvdW50OwpAQCAtMjU4LDYgKzI5NywxOTIgQEAKIAogI2RlZmluZSBYR0JFMTBfTlVNX1NUQVRfRU5UUklFUyAoc2l6ZW9mKHN0cnVjdCB4Z2JlX2h3X3N0YXRzKS9zaXplb2YodTMyKSkKIAorc3RydWN0IGdiZW51X3NzX3JlZ3MgeworCXUzMglpZF92ZXI7CisJdTMyCXN5bmNlX2NvdW50OwkJLyogTlUgKi8KKwl1MzIJc3luY2VfbXV4OwkJLyogTlUgKi8KKwl1MzIJY29udHJvbDsJCS8qIDJVICovCisJdTMyCV9fcnN2ZF8wWzJdOwkJLyogMlUgKi8KKwl1MzIJcmdtaWlfc3RhdHVzOwkJLyogMlUgKi8KKwl1MzIJc3Nfc3RhdHVzOwkJLyogMlUgKi8KK307CisKK3N0cnVjdCBnYmVudV9zd2l0Y2hfcmVncyB7CisJdTMyCWlkX3ZlcjsKKwl1MzIJY29udHJvbDsKKwl1MzIJX19yc3ZkXzBbMl07CisJdTMyCWVtY29udHJvbDsKKwl1MzIJc3RhdF9wb3J0X2VuOworCXUzMglwdHlwZTsJCQkvKiBOVSAqLworCXUzMglzb2Z0X2lkbGU7CisJdTMyCXRocnVfcmF0ZTsJCS8qIE5VICovCisJdTMyCWdhcF90aHJlc2g7CQkvKiBOVSAqLworCXUzMgl0eF9zdGFydF93ZHM7CQkvKiBOVSAqLworCXUzMgllZWVfcHJlc2NhbGU7CQkvKiAyVSAqLworCXUzMgl0eF9nX29mbG93X3RocmVzaF9zZXQ7CS8qIE5VICovCisJdTMyCXR4X2dfb2Zsb3dfdGhyZXNoX2NscjsJLyogTlUgKi8KKwl1MzIJdHhfZ19idWZfdGhyZXNoX3NldF9sOwkvKiBOVSAqLworCXUzMgl0eF9nX2J1Zl90aHJlc2hfc2V0X2g7CS8qIE5VICovCisJdTMyCXR4X2dfYnVmX3RocmVzaF9jbHJfbDsJLyogTlUgKi8KKwl1MzIJdHhfZ19idWZfdGhyZXNoX2Nscl9oOwkvKiBOVSAqLworfTsKKworc3RydWN0IGdiZW51X3BvcnRfcmVncyB7CisJdTMyCV9fcnN2ZF8wOworCXUzMgljb250cm9sOworCXUzMgltYXhfYmxrczsJCS8qIDJVICovCisJdTMyCW1lbV9hbGlnbjE7CisJdTMyCWJsa19jbnQ7CisJdTMyCXBvcnRfdmxhbjsKKwl1MzIJdHhfcHJpX21hcDsJCS8qIE5VICovCisJdTMyCXByaV9jdGw7CQkvKiAyVSAqLworCXUzMglyeF9wcmlfbWFwOworCXUzMglyeF9tYXhsZW47CisJdTMyCXR4X2Jsa3NfcHJpOwkJLyogTlUgKi8KKwl1MzIJX19yc3ZkXzE7CisJdTMyCWlkbGUybHBpOwkJLyogMlUgKi8KKwl1MzIJbHBpMmlkbGU7CQkvKiAyVSAqLworCXUzMgllZWVfc3RhdHVzOwkJLyogMlUgKi8KKwl1MzIJX19yc3ZkXzI7CisJdTMyCV9fcnN2ZF8zWzE3Nl07CQkvKiBOVTogbW9yZSB0byBhZGQgKi8KKwl1MzIJX19yc3ZkXzRbMl07CisJdTMyCXNhX2xvOworCXUzMglzYV9oaTsKKwl1MzIJdHNfY3RsOworCXUzMgl0c19zZXFfbHR5cGU7CisJdTMyCXRzX3ZsYW47CisJdTMyCXRzX2N0bF9sdHlwZTI7CisJdTMyCXRzX2N0bDI7Cit9OworCitzdHJ1Y3QgZ2JlbnVfaG9zdF9wb3J0X3JlZ3MgeworCXUzMglfX3JzdmRfMDsKKwl1MzIJY29udHJvbDsKKwl1MzIJZmxvd19pZF9vZmZzZXQ7CQkvKiAyVSAqLworCXUzMglfX3JzdmRfMTsKKwl1MzIJYmxrX2NudDsKKwl1MzIJcG9ydF92bGFuOworCXUzMgl0eF9wcmlfbWFwOwkJLyogTlUgKi8KKwl1MzIJcHJpX2N0bDsKKwl1MzIJcnhfcHJpX21hcDsKKwl1MzIJcnhfbWF4bGVuOworCXUzMgl0eF9ibGtzX3ByaTsJCS8qIE5VICovCisJdTMyCV9fcnN2ZF8yOworCXUzMglpZGxlMmxwaTsJCS8qIDJVICovCisJdTMyCWxwaTJ3YWtlOwkJLyogMlUgKi8KKwl1MzIJZWVlX3N0YXR1czsJCS8qIDJVICovCisJdTMyCV9fcnN2ZF8zOworCXUzMglfX3JzdmRfNFsxODRdOwkJLyogTlUgKi8KKwl1MzIJaG9zdF9ibGtzX3ByaTsJCS8qIE5VICovCit9OworCitzdHJ1Y3QgZ2JlbnVfZW1hY19yZWdzIHsKKwl1MzIJbWFjX2NvbnRyb2w7CisJdTMyCW1hY19zdGF0dXM7CisJdTMyCXNvZnRfcmVzZXQ7CisJdTMyCWJvZmZfdGVzdDsKKwl1MzIJcnhfcGF1c2U7CisJdTMyCV9fcnN2ZF8wWzExXTsJCS8qIE5VICovCisJdTMyCXR4X3BhdXNlOworCXUzMglfX3JzdmRfMVsxMV07CQkvKiBOVSAqLworCXUzMgllbV9jb250cm9sOworCXUzMgl0eF9nYXA7Cit9OworCisvKiBTb21lIGh3IHN0YXQgcmVncyBhcmUgYXBwbGljYWJsZSB0byBzbGF2ZSBwb3J0IG9ubHkuCisgKiBUaGlzIGlzIGhhbmRsZWQgYnkgZ2JlbnVfZXRfc3RhdHMgc3RydWN0LiAgQWxzbyBzb21lCisgKiBhcmUgZm9yIFNTIHZlcnNpb24gTlUgYW5kIHNvbWUgYXJlIGZvciAyVS4KKyAqLworc3RydWN0IGdiZW51X2h3X3N0YXRzIHsKKwl1MzIJcnhfZ29vZF9mcmFtZXM7CisJdTMyCXJ4X2Jyb2FkY2FzdF9mcmFtZXM7CisJdTMyCXJ4X211bHRpY2FzdF9mcmFtZXM7CisJdTMyCXJ4X3BhdXNlX2ZyYW1lczsJCS8qIHNsYXZlICovCisJdTMyCXJ4X2NyY19lcnJvcnM7CisJdTMyCXJ4X2FsaWduX2NvZGVfZXJyb3JzOwkJLyogc2xhdmUgKi8KKwl1MzIJcnhfb3ZlcnNpemVkX2ZyYW1lczsKKwl1MzIJcnhfamFiYmVyX2ZyYW1lczsJCS8qIHNsYXZlICovCisJdTMyCXJ4X3VuZGVyc2l6ZWRfZnJhbWVzOworCXUzMglyeF9mcmFnbWVudHM7CQkJLyogc2xhdmUgKi8KKwl1MzIJYWxlX2Ryb3A7CisJdTMyCWFsZV9vdmVycnVuX2Ryb3A7CisJdTMyCXJ4X2J5dGVzOworCXUzMgl0eF9nb29kX2ZyYW1lczsKKwl1MzIJdHhfYnJvYWRjYXN0X2ZyYW1lczsKKwl1MzIJdHhfbXVsdGljYXN0X2ZyYW1lczsKKwl1MzIJdHhfcGF1c2VfZnJhbWVzOwkJLyogc2xhdmUgKi8KKwl1MzIJdHhfZGVmZXJyZWRfZnJhbWVzOwkJLyogc2xhdmUgKi8KKwl1MzIJdHhfY29sbGlzaW9uX2ZyYW1lczsJCS8qIHNsYXZlICovCisJdTMyCXR4X3NpbmdsZV9jb2xsX2ZyYW1lczsJCS8qIHNsYXZlICovCisJdTMyCXR4X211bHRfY29sbF9mcmFtZXM7CQkvKiBzbGF2ZSAqLworCXUzMgl0eF9leGNlc3NpdmVfY29sbGlzaW9uczsJLyogc2xhdmUgKi8KKwl1MzIJdHhfbGF0ZV9jb2xsaXNpb25zOwkJLyogc2xhdmUgKi8KKwl1MzIJcnhfaXBnX2Vycm9yOwkJCS8qIHNsYXZlIDEwRyBvbmx5ICovCisJdTMyCXR4X2NhcnJpZXJfc2Vuc2VfZXJyb3JzOwkvKiBzbGF2ZSAqLworCXUzMgl0eF9ieXRlczsKKwl1MzIJdHhfNjRCX2ZyYW1lczsKKwl1MzIJdHhfNjVfdG9fMTI3Ql9mcmFtZXM7CisJdTMyCXR4XzEyOF90b18yNTVCX2ZyYW1lczsKKwl1MzIJdHhfMjU2X3RvXzUxMUJfZnJhbWVzOworCXUzMgl0eF81MTJfdG9fMTAyM0JfZnJhbWVzOworCXUzMgl0eF8xMDI0Ql9mcmFtZXM7CisJdTMyCW5ldF9ieXRlczsKKwl1MzIJcnhfYm90dG9tX2ZpZm9fZHJvcDsKKwl1MzIJcnhfcG9ydF9tYXNrX2Ryb3A7CisJdTMyCXJ4X3RvcF9maWZvX2Ryb3A7CisJdTMyCWFsZV9yYXRlX2xpbWl0X2Ryb3A7CisJdTMyCWFsZV92aWRfaW5ncmVzc19kcm9wOworCXUzMglhbGVfZGFfZXFfc2FfZHJvcDsKKwl1MzIJX19yc3ZkXzBbM107CisJdTMyCWFsZV91bmtub3duX3VjYXN0OworCXUzMglhbGVfdW5rbm93bl91Y2FzdF9ieXRlczsKKwl1MzIJYWxlX3Vua25vd25fbWNhc3Q7CisJdTMyCWFsZV91bmtub3duX21jYXN0X2J5dGVzOworCXUzMglhbGVfdW5rbm93bl9iY2FzdDsKKwl1MzIJYWxlX3Vua25vd25fYmNhc3RfYnl0ZXM7CisJdTMyCWFsZV9wb2xfbWF0Y2g7CisJdTMyCWFsZV9wb2xfbWF0Y2hfcmVkOwkJLyogTlUgKi8KKwl1MzIJYWxlX3BvbF9tYXRjaF95ZWxsb3c7CQkvKiBOVSAqLworCXUzMglfX3JzdmRfMVs0NF07CisJdTMyCXR4X21lbV9wcm90ZWN0X2VycjsKKwkvKiBmb2xsb3dpbmcgTlUgb25seSAqLworCXUzMgl0eF9wcmkwOworCXUzMgl0eF9wcmkxOworCXUzMgl0eF9wcmkyOworCXUzMgl0eF9wcmkzOworCXUzMgl0eF9wcmk0OworCXUzMgl0eF9wcmk1OworCXUzMgl0eF9wcmk2OworCXUzMgl0eF9wcmk3OworCXUzMgl0eF9wcmkwX2JjbnQ7CisJdTMyCXR4X3ByaTFfYmNudDsKKwl1MzIJdHhfcHJpMl9iY250OworCXUzMgl0eF9wcmkzX2JjbnQ7CisJdTMyCXR4X3ByaTRfYmNudDsKKwl1MzIJdHhfcHJpNV9iY250OworCXUzMgl0eF9wcmk2X2JjbnQ7CisJdTMyCXR4X3ByaTdfYmNudDsKKwl1MzIJdHhfcHJpMF9kcm9wOworCXUzMgl0eF9wcmkxX2Ryb3A7CisJdTMyCXR4X3ByaTJfZHJvcDsKKwl1MzIJdHhfcHJpM19kcm9wOworCXUzMgl0eF9wcmk0X2Ryb3A7CisJdTMyCXR4X3ByaTVfZHJvcDsKKwl1MzIJdHhfcHJpNl9kcm9wOworCXUzMgl0eF9wcmk3X2Ryb3A7CisJdTMyCXR4X3ByaTBfZHJvcF9iY250OworCXUzMgl0eF9wcmkxX2Ryb3BfYmNudDsKKwl1MzIJdHhfcHJpMl9kcm9wX2JjbnQ7CisJdTMyCXR4X3ByaTNfZHJvcF9iY250OworCXUzMgl0eF9wcmk0X2Ryb3BfYmNudDsKKwl1MzIJdHhfcHJpNV9kcm9wX2JjbnQ7CisJdTMyCXR4X3ByaTZfZHJvcF9iY250OworCXUzMgl0eF9wcmk3X2Ryb3BfYmNudDsKK307CisKKyNkZWZpbmUgR0JFTlVfTlVNX0hXX1NUQVRfRU5UUklFUyAoc2l6ZW9mKHN0cnVjdCBnYmVudV9od19zdGF0cykgLyBzaXplb2YodTMyKSkKKyNkZWZpbmUgR0JFTlVfSFdfU1RBVFNfUkVHX01BUF9TWgkweDIwMAorCiBzdHJ1Y3QgZ2JlX3NzX3JlZ3MgewogCXUzMglpZF92ZXI7CiAJdTMyCXN5bmNlX2NvdW50OwpAQCAtMzE2LDYgKzU0MSw3IEBACiAJdTE2CXRzX3ZsYW47CiAJdTE2CXRzX2N0bF9sdHlwZTI7CiAJdTE2CXRzX2N0bDI7CisJdTE2CXJ4X21heGxlbjsJLyogMlUsIE5VICovCiB9OwogCiBzdHJ1Y3QgZ2JlX2hvc3RfcG9ydF9yZWdzIHsKQEAgLTM5MCw5ICs2MTYsNyBAQAogfTsKIAogI2RlZmluZSBHQkUxM19OVU1fSFdfU1RBVF9FTlRSSUVTIChzaXplb2Yoc3RydWN0IGdiZV9od19zdGF0cykvc2l6ZW9mKHUzMikpCi0jZGVmaW5lIEdCRTEzX05VTV9IV19TVEFUU19NT0QJCQkyCi0jZGVmaW5lIFhHQkUxMF9OVU1fSFdfU1RBVFNfTU9ECQkJMwotI2RlZmluZSBHQkVfTUFYX0hXX1NUQVRfTU9EUwkJCTMKKyNkZWZpbmUgR0JFX01BWF9IV19TVEFUX01PRFMJCQk5CiAjZGVmaW5lIEdCRV9IV19TVEFUU19SRUdfTUFQX1NaCQkJMHgxMDAKIAogc3RydWN0IGdiZV9zbGF2ZSB7CkBAIC00MjAsMTEgKzY0NCwxNCBAQAogCXUzMgkJCQlhbGVfZW50cmllczsKIAl1MzIJCQkJYWxlX3BvcnRzOwogCWJvb2wJCQkJZW5hYmxlX2FsZTsKKwl1OAkJCQltYXhfbnVtX3NsYXZlczsKKwl1OAkJCQltYXhfbnVtX3BvcnRzOyAvKiBtYXhfbnVtX3NsYXZlcyArIDEgKi8KIAlzdHJ1Y3QgbmV0Y3BfdHhfcGlwZQkJdHhfcGlwZTsKIAogCWludAkJCQlob3N0X3BvcnQ7CiAJdTMyCQkJCXJ4X3BhY2tldF9tYXg7CiAJdTMyCQkJCXNzX3ZlcnNpb247CisJdTMyCQkJCXN0YXRzX2VuX21hc2s7CiAKIAl2b2lkIF9faW9tZW0JCQkqc3NfcmVnczsKIAl2b2lkIF9faW9tZW0JCQkqc3dpdGNoX3JlZ3M7CkBAIC00NzUsMjc1ICs3MDIsNzc4IEBACiAJaW50IG9mZnNldDsKIH07CiAKLSNkZWZpbmUgR0JFX1NUQVRTQV9JTkZPKGZpZWxkKQkJIkdCRV9BOiIjZmllbGQsIEdCRV9TVEFUU0FfTU9EVUxFLFwKLQkJCQlGSUVMRF9TSVpFT0Yoc3RydWN0IGdiZV9od19zdGF0cywgZmllbGQpLCBcCi0JCQkJb2Zmc2V0b2Yoc3RydWN0IGdiZV9od19zdGF0cywgZmllbGQpCisjZGVmaW5lIEdCRV9TVEFUU0FfSU5GTyhmaWVsZCkJCQkJCQlcCit7CQkJCQkJCQkJXAorCSJHQkVfQToiI2ZpZWxkLCBHQkVfU1RBVFNBX01PRFVMRSwJCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlX2h3X3N0YXRzLCBmaWVsZCksCQkJXAorCW9mZnNldG9mKHN0cnVjdCBnYmVfaHdfc3RhdHMsIGZpZWxkKQkJCQlcCit9CiAKLSNkZWZpbmUgR0JFX1NUQVRTQl9JTkZPKGZpZWxkKQkJIkdCRV9COiIjZmllbGQsIEdCRV9TVEFUU0JfTU9EVUxFLFwKLQkJCQlGSUVMRF9TSVpFT0Yoc3RydWN0IGdiZV9od19zdGF0cywgZmllbGQpLCBcCi0JCQkJb2Zmc2V0b2Yoc3RydWN0IGdiZV9od19zdGF0cywgZmllbGQpCisjZGVmaW5lIEdCRV9TVEFUU0JfSU5GTyhmaWVsZCkJCQkJCQlcCit7CQkJCQkJCQkJXAorCSJHQkVfQjoiI2ZpZWxkLCBHQkVfU1RBVFNCX01PRFVMRSwJCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlX2h3X3N0YXRzLCBmaWVsZCksCQkJXAorCW9mZnNldG9mKHN0cnVjdCBnYmVfaHdfc3RhdHMsIGZpZWxkKQkJCQlcCit9CiAKLSNkZWZpbmUgR0JFX1NUQVRTQ19JTkZPKGZpZWxkKQkJIkdCRV9DOiIjZmllbGQsIEdCRV9TVEFUU0NfTU9EVUxFLFwKLQkJCQlGSUVMRF9TSVpFT0Yoc3RydWN0IGdiZV9od19zdGF0cywgZmllbGQpLCBcCi0JCQkJb2Zmc2V0b2Yoc3RydWN0IGdiZV9od19zdGF0cywgZmllbGQpCisjZGVmaW5lIEdCRV9TVEFUU0NfSU5GTyhmaWVsZCkJCQkJCQlcCit7CQkJCQkJCQkJXAorCSJHQkVfQzoiI2ZpZWxkLCBHQkVfU1RBVFNDX01PRFVMRSwJCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlX2h3X3N0YXRzLCBmaWVsZCksCQkJXAorCW9mZnNldG9mKHN0cnVjdCBnYmVfaHdfc3RhdHMsIGZpZWxkKQkJCQlcCit9CiAKLSNkZWZpbmUgR0JFX1NUQVRTRF9JTkZPKGZpZWxkKQkJIkdCRV9EOiIjZmllbGQsIEdCRV9TVEFUU0RfTU9EVUxFLFwKLQkJCQlGSUVMRF9TSVpFT0Yoc3RydWN0IGdiZV9od19zdGF0cywgZmllbGQpLCBcCi0JCQkJb2Zmc2V0b2Yoc3RydWN0IGdiZV9od19zdGF0cywgZmllbGQpCisjZGVmaW5lIEdCRV9TVEFUU0RfSU5GTyhmaWVsZCkJCQkJCQlcCit7CQkJCQkJCQkJXAorCSJHQkVfRDoiI2ZpZWxkLCBHQkVfU1RBVFNEX01PRFVMRSwJCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlX2h3X3N0YXRzLCBmaWVsZCksCQkJXAorCW9mZnNldG9mKHN0cnVjdCBnYmVfaHdfc3RhdHMsIGZpZWxkKQkJCQlcCit9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0Y3BfZXRodG9vbF9zdGF0IGdiZTEzX2V0X3N0YXRzW10gPSB7CiAJLyogR0JFIG1vZHVsZSBBICovCi0Je0dCRV9TVEFUU0FfSU5GTyhyeF9nb29kX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNBX0lORk8ocnhfYnJvYWRjYXN0X2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNBX0lORk8ocnhfbXVsdGljYXN0X2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNBX0lORk8ocnhfcGF1c2VfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyhyeF9jcmNfZXJyb3JzKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyhyeF9hbGlnbl9jb2RlX2Vycm9ycyl9LAotCXtHQkVfU1RBVFNBX0lORk8ocnhfb3ZlcnNpemVkX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNBX0lORk8ocnhfamFiYmVyX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNBX0lORk8ocnhfdW5kZXJzaXplZF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQV9JTkZPKHJ4X2ZyYWdtZW50cyl9LAotCXtHQkVfU1RBVFNBX0lORk8ocnhfYnl0ZXMpfSwKLQl7R0JFX1NUQVRTQV9JTkZPKHR4X2dvb2RfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyh0eF9icm9hZGNhc3RfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyh0eF9tdWx0aWNhc3RfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyh0eF9wYXVzZV9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQV9JTkZPKHR4X2RlZmVycmVkX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNBX0lORk8odHhfY29sbGlzaW9uX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNBX0lORk8odHhfc2luZ2xlX2NvbGxfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyh0eF9tdWx0X2NvbGxfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyh0eF9leGNlc3NpdmVfY29sbGlzaW9ucyl9LAotCXtHQkVfU1RBVFNBX0lORk8odHhfbGF0ZV9jb2xsaXNpb25zKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyh0eF91bmRlcnJ1bil9LAotCXtHQkVfU1RBVFNBX0lORk8odHhfY2Fycmllcl9zZW5zZV9lcnJvcnMpfSwKLQl7R0JFX1NUQVRTQV9JTkZPKHR4X2J5dGVzKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyh0eF82NGJ5dGVfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyh0eF82NV90b18xMjdieXRlX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNBX0lORk8odHhfMTI4X3RvXzI1NWJ5dGVfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyh0eF8yNTZfdG9fNTExYnl0ZV9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQV9JTkZPKHR4XzUxMl90b18xMDIzYnl0ZV9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQV9JTkZPKHR4XzEwMjRieXRlX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNBX0lORk8obmV0X2J5dGVzKX0sCi0Je0dCRV9TVEFUU0FfSU5GTyhyeF9zb2Zfb3ZlcnJ1bnMpfSwKLQl7R0JFX1NUQVRTQV9JTkZPKHJ4X21vZl9vdmVycnVucyl9LAotCXtHQkVfU1RBVFNBX0lORk8ocnhfZG1hX292ZXJydW5zKX0sCisJR0JFX1NUQVRTQV9JTkZPKHJ4X2dvb2RfZnJhbWVzKSwKKwlHQkVfU1RBVFNBX0lORk8ocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFX1NUQVRTQV9JTkZPKHJ4X211bHRpY2FzdF9mcmFtZXMpLAorCUdCRV9TVEFUU0FfSU5GTyhyeF9wYXVzZV9mcmFtZXMpLAorCUdCRV9TVEFUU0FfSU5GTyhyeF9jcmNfZXJyb3JzKSwKKwlHQkVfU1RBVFNBX0lORk8ocnhfYWxpZ25fY29kZV9lcnJvcnMpLAorCUdCRV9TVEFUU0FfSU5GTyhyeF9vdmVyc2l6ZWRfZnJhbWVzKSwKKwlHQkVfU1RBVFNBX0lORk8ocnhfamFiYmVyX2ZyYW1lcyksCisJR0JFX1NUQVRTQV9JTkZPKHJ4X3VuZGVyc2l6ZWRfZnJhbWVzKSwKKwlHQkVfU1RBVFNBX0lORk8ocnhfZnJhZ21lbnRzKSwKKwlHQkVfU1RBVFNBX0lORk8ocnhfYnl0ZXMpLAorCUdCRV9TVEFUU0FfSU5GTyh0eF9nb29kX2ZyYW1lcyksCisJR0JFX1NUQVRTQV9JTkZPKHR4X2Jyb2FkY2FzdF9mcmFtZXMpLAorCUdCRV9TVEFUU0FfSU5GTyh0eF9tdWx0aWNhc3RfZnJhbWVzKSwKKwlHQkVfU1RBVFNBX0lORk8odHhfcGF1c2VfZnJhbWVzKSwKKwlHQkVfU1RBVFNBX0lORk8odHhfZGVmZXJyZWRfZnJhbWVzKSwKKwlHQkVfU1RBVFNBX0lORk8odHhfY29sbGlzaW9uX2ZyYW1lcyksCisJR0JFX1NUQVRTQV9JTkZPKHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyksCisJR0JFX1NUQVRTQV9JTkZPKHR4X211bHRfY29sbF9mcmFtZXMpLAorCUdCRV9TVEFUU0FfSU5GTyh0eF9leGNlc3NpdmVfY29sbGlzaW9ucyksCisJR0JFX1NUQVRTQV9JTkZPKHR4X2xhdGVfY29sbGlzaW9ucyksCisJR0JFX1NUQVRTQV9JTkZPKHR4X3VuZGVycnVuKSwKKwlHQkVfU1RBVFNBX0lORk8odHhfY2Fycmllcl9zZW5zZV9lcnJvcnMpLAorCUdCRV9TVEFUU0FfSU5GTyh0eF9ieXRlcyksCisJR0JFX1NUQVRTQV9JTkZPKHR4XzY0Ynl0ZV9mcmFtZXMpLAorCUdCRV9TVEFUU0FfSU5GTyh0eF82NV90b18xMjdieXRlX2ZyYW1lcyksCisJR0JFX1NUQVRTQV9JTkZPKHR4XzEyOF90b18yNTVieXRlX2ZyYW1lcyksCisJR0JFX1NUQVRTQV9JTkZPKHR4XzI1Nl90b181MTFieXRlX2ZyYW1lcyksCisJR0JFX1NUQVRTQV9JTkZPKHR4XzUxMl90b18xMDIzYnl0ZV9mcmFtZXMpLAorCUdCRV9TVEFUU0FfSU5GTyh0eF8xMDI0Ynl0ZV9mcmFtZXMpLAorCUdCRV9TVEFUU0FfSU5GTyhuZXRfYnl0ZXMpLAorCUdCRV9TVEFUU0FfSU5GTyhyeF9zb2Zfb3ZlcnJ1bnMpLAorCUdCRV9TVEFUU0FfSU5GTyhyeF9tb2Zfb3ZlcnJ1bnMpLAorCUdCRV9TVEFUU0FfSU5GTyhyeF9kbWFfb3ZlcnJ1bnMpLAogCS8qIEdCRSBtb2R1bGUgQiAqLwotCXtHQkVfU1RBVFNCX0lORk8ocnhfZ29vZF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHJ4X2Jyb2FkY2FzdF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHJ4X211bHRpY2FzdF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHJ4X3BhdXNlX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNCX0lORk8ocnhfY3JjX2Vycm9ycyl9LAotCXtHQkVfU1RBVFNCX0lORk8ocnhfYWxpZ25fY29kZV9lcnJvcnMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHJ4X292ZXJzaXplZF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHJ4X2phYmJlcl9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHJ4X3VuZGVyc2l6ZWRfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0JfSU5GTyhyeF9mcmFnbWVudHMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHJ4X2J5dGVzKX0sCi0Je0dCRV9TVEFUU0JfSU5GTyh0eF9nb29kX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNCX0lORk8odHhfYnJvYWRjYXN0X2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNCX0lORk8odHhfbXVsdGljYXN0X2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNCX0lORk8odHhfcGF1c2VfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0JfSU5GTyh0eF9kZWZlcnJlZF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHR4X2NvbGxpc2lvbl9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNCX0lORk8odHhfbXVsdF9jb2xsX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNCX0lORk8odHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHR4X2xhdGVfY29sbGlzaW9ucyl9LAotCXtHQkVfU1RBVFNCX0lORk8odHhfdW5kZXJydW4pfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHR4X2NhcnJpZXJfc2Vuc2VfZXJyb3JzKX0sCi0Je0dCRV9TVEFUU0JfSU5GTyh0eF9ieXRlcyl9LAotCXtHQkVfU1RBVFNCX0lORk8odHhfNjRieXRlX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNCX0lORk8odHhfNjVfdG9fMTI3Ynl0ZV9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHR4XzEyOF90b18yNTVieXRlX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNCX0lORk8odHhfMjU2X3RvXzUxMWJ5dGVfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0JfSU5GTyh0eF81MTJfdG9fMTAyM2J5dGVfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0JfSU5GTyh0eF8xMDI0Ynl0ZV9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKG5ldF9ieXRlcyl9LAotCXtHQkVfU1RBVFNCX0lORk8ocnhfc29mX292ZXJydW5zKX0sCi0Je0dCRV9TVEFUU0JfSU5GTyhyeF9tb2Zfb3ZlcnJ1bnMpfSwKLQl7R0JFX1NUQVRTQl9JTkZPKHJ4X2RtYV9vdmVycnVucyl9LAorCUdCRV9TVEFUU0JfSU5GTyhyeF9nb29kX2ZyYW1lcyksCisJR0JFX1NUQVRTQl9JTkZPKHJ4X2Jyb2FkY2FzdF9mcmFtZXMpLAorCUdCRV9TVEFUU0JfSU5GTyhyeF9tdWx0aWNhc3RfZnJhbWVzKSwKKwlHQkVfU1RBVFNCX0lORk8ocnhfcGF1c2VfZnJhbWVzKSwKKwlHQkVfU1RBVFNCX0lORk8ocnhfY3JjX2Vycm9ycyksCisJR0JFX1NUQVRTQl9JTkZPKHJ4X2FsaWduX2NvZGVfZXJyb3JzKSwKKwlHQkVfU1RBVFNCX0lORk8ocnhfb3ZlcnNpemVkX2ZyYW1lcyksCisJR0JFX1NUQVRTQl9JTkZPKHJ4X2phYmJlcl9mcmFtZXMpLAorCUdCRV9TVEFUU0JfSU5GTyhyeF91bmRlcnNpemVkX2ZyYW1lcyksCisJR0JFX1NUQVRTQl9JTkZPKHJ4X2ZyYWdtZW50cyksCisJR0JFX1NUQVRTQl9JTkZPKHJ4X2J5dGVzKSwKKwlHQkVfU1RBVFNCX0lORk8odHhfZ29vZF9mcmFtZXMpLAorCUdCRV9TVEFUU0JfSU5GTyh0eF9icm9hZGNhc3RfZnJhbWVzKSwKKwlHQkVfU1RBVFNCX0lORk8odHhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFX1NUQVRTQl9JTkZPKHR4X3BhdXNlX2ZyYW1lcyksCisJR0JFX1NUQVRTQl9JTkZPKHR4X2RlZmVycmVkX2ZyYW1lcyksCisJR0JFX1NUQVRTQl9JTkZPKHR4X2NvbGxpc2lvbl9mcmFtZXMpLAorCUdCRV9TVEFUU0JfSU5GTyh0eF9zaW5nbGVfY29sbF9mcmFtZXMpLAorCUdCRV9TVEFUU0JfSU5GTyh0eF9tdWx0X2NvbGxfZnJhbWVzKSwKKwlHQkVfU1RBVFNCX0lORk8odHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpLAorCUdCRV9TVEFUU0JfSU5GTyh0eF9sYXRlX2NvbGxpc2lvbnMpLAorCUdCRV9TVEFUU0JfSU5GTyh0eF91bmRlcnJ1biksCisJR0JFX1NUQVRTQl9JTkZPKHR4X2NhcnJpZXJfc2Vuc2VfZXJyb3JzKSwKKwlHQkVfU1RBVFNCX0lORk8odHhfYnl0ZXMpLAorCUdCRV9TVEFUU0JfSU5GTyh0eF82NGJ5dGVfZnJhbWVzKSwKKwlHQkVfU1RBVFNCX0lORk8odHhfNjVfdG9fMTI3Ynl0ZV9mcmFtZXMpLAorCUdCRV9TVEFUU0JfSU5GTyh0eF8xMjhfdG9fMjU1Ynl0ZV9mcmFtZXMpLAorCUdCRV9TVEFUU0JfSU5GTyh0eF8yNTZfdG9fNTExYnl0ZV9mcmFtZXMpLAorCUdCRV9TVEFUU0JfSU5GTyh0eF81MTJfdG9fMTAyM2J5dGVfZnJhbWVzKSwKKwlHQkVfU1RBVFNCX0lORk8odHhfMTAyNGJ5dGVfZnJhbWVzKSwKKwlHQkVfU1RBVFNCX0lORk8obmV0X2J5dGVzKSwKKwlHQkVfU1RBVFNCX0lORk8ocnhfc29mX292ZXJydW5zKSwKKwlHQkVfU1RBVFNCX0lORk8ocnhfbW9mX292ZXJydW5zKSwKKwlHQkVfU1RBVFNCX0lORk8ocnhfZG1hX292ZXJydW5zKSwKIAkvKiBHQkUgbW9kdWxlIEMgKi8KLQl7R0JFX1NUQVRTQ19JTkZPKHJ4X2dvb2RfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyhyeF9icm9hZGNhc3RfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyhyeF9tdWx0aWNhc3RfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyhyeF9wYXVzZV9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHJ4X2NyY19lcnJvcnMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHJ4X2FsaWduX2NvZGVfZXJyb3JzKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyhyeF9vdmVyc2l6ZWRfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyhyeF9qYWJiZXJfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyhyeF91bmRlcnNpemVkX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNDX0lORk8ocnhfZnJhZ21lbnRzKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyhyeF9ieXRlcyl9LAotCXtHQkVfU1RBVFNDX0lORk8odHhfZ29vZF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHR4X2Jyb2FkY2FzdF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHR4X211bHRpY2FzdF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHR4X3BhdXNlX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNDX0lORk8odHhfZGVmZXJyZWRfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyh0eF9jb2xsaXNpb25fZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyh0eF9zaW5nbGVfY29sbF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHR4X211bHRfY29sbF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb25zKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyh0eF9sYXRlX2NvbGxpc2lvbnMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHR4X3VuZGVycnVuKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyh0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyl9LAotCXtHQkVfU1RBVFNDX0lORk8odHhfYnl0ZXMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHR4XzY0Ynl0ZV9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHR4XzY1X3RvXzEyN2J5dGVfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyh0eF8xMjhfdG9fMjU1Ynl0ZV9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHR4XzI1Nl90b181MTFieXRlX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNDX0lORk8odHhfNTEyX3RvXzEwMjNieXRlX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNDX0lORk8odHhfMTAyNGJ5dGVfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyhuZXRfYnl0ZXMpfSwKLQl7R0JFX1NUQVRTQ19JTkZPKHJ4X3NvZl9vdmVycnVucyl9LAotCXtHQkVfU1RBVFNDX0lORk8ocnhfbW9mX292ZXJydW5zKX0sCi0Je0dCRV9TVEFUU0NfSU5GTyhyeF9kbWFfb3ZlcnJ1bnMpfSwKKwlHQkVfU1RBVFNDX0lORk8ocnhfZ29vZF9mcmFtZXMpLAorCUdCRV9TVEFUU0NfSU5GTyhyeF9icm9hZGNhc3RfZnJhbWVzKSwKKwlHQkVfU1RBVFNDX0lORk8ocnhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFX1NUQVRTQ19JTkZPKHJ4X3BhdXNlX2ZyYW1lcyksCisJR0JFX1NUQVRTQ19JTkZPKHJ4X2NyY19lcnJvcnMpLAorCUdCRV9TVEFUU0NfSU5GTyhyeF9hbGlnbl9jb2RlX2Vycm9ycyksCisJR0JFX1NUQVRTQ19JTkZPKHJ4X292ZXJzaXplZF9mcmFtZXMpLAorCUdCRV9TVEFUU0NfSU5GTyhyeF9qYWJiZXJfZnJhbWVzKSwKKwlHQkVfU1RBVFNDX0lORk8ocnhfdW5kZXJzaXplZF9mcmFtZXMpLAorCUdCRV9TVEFUU0NfSU5GTyhyeF9mcmFnbWVudHMpLAorCUdCRV9TVEFUU0NfSU5GTyhyeF9ieXRlcyksCisJR0JFX1NUQVRTQ19JTkZPKHR4X2dvb2RfZnJhbWVzKSwKKwlHQkVfU1RBVFNDX0lORk8odHhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFX1NUQVRTQ19JTkZPKHR4X211bHRpY2FzdF9mcmFtZXMpLAorCUdCRV9TVEFUU0NfSU5GTyh0eF9wYXVzZV9mcmFtZXMpLAorCUdCRV9TVEFUU0NfSU5GTyh0eF9kZWZlcnJlZF9mcmFtZXMpLAorCUdCRV9TVEFUU0NfSU5GTyh0eF9jb2xsaXNpb25fZnJhbWVzKSwKKwlHQkVfU1RBVFNDX0lORk8odHhfc2luZ2xlX2NvbGxfZnJhbWVzKSwKKwlHQkVfU1RBVFNDX0lORk8odHhfbXVsdF9jb2xsX2ZyYW1lcyksCisJR0JFX1NUQVRTQ19JTkZPKHR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb25zKSwKKwlHQkVfU1RBVFNDX0lORk8odHhfbGF0ZV9jb2xsaXNpb25zKSwKKwlHQkVfU1RBVFNDX0lORk8odHhfdW5kZXJydW4pLAorCUdCRV9TVEFUU0NfSU5GTyh0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyksCisJR0JFX1NUQVRTQ19JTkZPKHR4X2J5dGVzKSwKKwlHQkVfU1RBVFNDX0lORk8odHhfNjRieXRlX2ZyYW1lcyksCisJR0JFX1NUQVRTQ19JTkZPKHR4XzY1X3RvXzEyN2J5dGVfZnJhbWVzKSwKKwlHQkVfU1RBVFNDX0lORk8odHhfMTI4X3RvXzI1NWJ5dGVfZnJhbWVzKSwKKwlHQkVfU1RBVFNDX0lORk8odHhfMjU2X3RvXzUxMWJ5dGVfZnJhbWVzKSwKKwlHQkVfU1RBVFNDX0lORk8odHhfNTEyX3RvXzEwMjNieXRlX2ZyYW1lcyksCisJR0JFX1NUQVRTQ19JTkZPKHR4XzEwMjRieXRlX2ZyYW1lcyksCisJR0JFX1NUQVRTQ19JTkZPKG5ldF9ieXRlcyksCisJR0JFX1NUQVRTQ19JTkZPKHJ4X3NvZl9vdmVycnVucyksCisJR0JFX1NUQVRTQ19JTkZPKHJ4X21vZl9vdmVycnVucyksCisJR0JFX1NUQVRTQ19JTkZPKHJ4X2RtYV9vdmVycnVucyksCiAJLyogR0JFIG1vZHVsZSBEICovCi0Je0dCRV9TVEFUU0RfSU5GTyhyeF9nb29kX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNEX0lORk8ocnhfYnJvYWRjYXN0X2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNEX0lORk8ocnhfbXVsdGljYXN0X2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNEX0lORk8ocnhfcGF1c2VfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyhyeF9jcmNfZXJyb3JzKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyhyeF9hbGlnbl9jb2RlX2Vycm9ycyl9LAotCXtHQkVfU1RBVFNEX0lORk8ocnhfb3ZlcnNpemVkX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNEX0lORk8ocnhfamFiYmVyX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNEX0lORk8ocnhfdW5kZXJzaXplZF9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTRF9JTkZPKHJ4X2ZyYWdtZW50cyl9LAotCXtHQkVfU1RBVFNEX0lORk8ocnhfYnl0ZXMpfSwKLQl7R0JFX1NUQVRTRF9JTkZPKHR4X2dvb2RfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyh0eF9icm9hZGNhc3RfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyh0eF9tdWx0aWNhc3RfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyh0eF9wYXVzZV9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTRF9JTkZPKHR4X2RlZmVycmVkX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNEX0lORk8odHhfY29sbGlzaW9uX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNEX0lORk8odHhfc2luZ2xlX2NvbGxfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyh0eF9tdWx0X2NvbGxfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyh0eF9leGNlc3NpdmVfY29sbGlzaW9ucyl9LAotCXtHQkVfU1RBVFNEX0lORk8odHhfbGF0ZV9jb2xsaXNpb25zKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyh0eF91bmRlcnJ1bil9LAotCXtHQkVfU1RBVFNEX0lORk8odHhfY2Fycmllcl9zZW5zZV9lcnJvcnMpfSwKLQl7R0JFX1NUQVRTRF9JTkZPKHR4X2J5dGVzKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyh0eF82NGJ5dGVfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyh0eF82NV90b18xMjdieXRlX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNEX0lORk8odHhfMTI4X3RvXzI1NWJ5dGVfZnJhbWVzKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyh0eF8yNTZfdG9fNTExYnl0ZV9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTRF9JTkZPKHR4XzUxMl90b18xMDIzYnl0ZV9mcmFtZXMpfSwKLQl7R0JFX1NUQVRTRF9JTkZPKHR4XzEwMjRieXRlX2ZyYW1lcyl9LAotCXtHQkVfU1RBVFNEX0lORk8obmV0X2J5dGVzKX0sCi0Je0dCRV9TVEFUU0RfSU5GTyhyeF9zb2Zfb3ZlcnJ1bnMpfSwKLQl7R0JFX1NUQVRTRF9JTkZPKHJ4X21vZl9vdmVycnVucyl9LAotCXtHQkVfU1RBVFNEX0lORk8ocnhfZG1hX292ZXJydW5zKX0sCisJR0JFX1NUQVRTRF9JTkZPKHJ4X2dvb2RfZnJhbWVzKSwKKwlHQkVfU1RBVFNEX0lORk8ocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFX1NUQVRTRF9JTkZPKHJ4X211bHRpY2FzdF9mcmFtZXMpLAorCUdCRV9TVEFUU0RfSU5GTyhyeF9wYXVzZV9mcmFtZXMpLAorCUdCRV9TVEFUU0RfSU5GTyhyeF9jcmNfZXJyb3JzKSwKKwlHQkVfU1RBVFNEX0lORk8ocnhfYWxpZ25fY29kZV9lcnJvcnMpLAorCUdCRV9TVEFUU0RfSU5GTyhyeF9vdmVyc2l6ZWRfZnJhbWVzKSwKKwlHQkVfU1RBVFNEX0lORk8ocnhfamFiYmVyX2ZyYW1lcyksCisJR0JFX1NUQVRTRF9JTkZPKHJ4X3VuZGVyc2l6ZWRfZnJhbWVzKSwKKwlHQkVfU1RBVFNEX0lORk8ocnhfZnJhZ21lbnRzKSwKKwlHQkVfU1RBVFNEX0lORk8ocnhfYnl0ZXMpLAorCUdCRV9TVEFUU0RfSU5GTyh0eF9nb29kX2ZyYW1lcyksCisJR0JFX1NUQVRTRF9JTkZPKHR4X2Jyb2FkY2FzdF9mcmFtZXMpLAorCUdCRV9TVEFUU0RfSU5GTyh0eF9tdWx0aWNhc3RfZnJhbWVzKSwKKwlHQkVfU1RBVFNEX0lORk8odHhfcGF1c2VfZnJhbWVzKSwKKwlHQkVfU1RBVFNEX0lORk8odHhfZGVmZXJyZWRfZnJhbWVzKSwKKwlHQkVfU1RBVFNEX0lORk8odHhfY29sbGlzaW9uX2ZyYW1lcyksCisJR0JFX1NUQVRTRF9JTkZPKHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyksCisJR0JFX1NUQVRTRF9JTkZPKHR4X211bHRfY29sbF9mcmFtZXMpLAorCUdCRV9TVEFUU0RfSU5GTyh0eF9leGNlc3NpdmVfY29sbGlzaW9ucyksCisJR0JFX1NUQVRTRF9JTkZPKHR4X2xhdGVfY29sbGlzaW9ucyksCisJR0JFX1NUQVRTRF9JTkZPKHR4X3VuZGVycnVuKSwKKwlHQkVfU1RBVFNEX0lORk8odHhfY2Fycmllcl9zZW5zZV9lcnJvcnMpLAorCUdCRV9TVEFUU0RfSU5GTyh0eF9ieXRlcyksCisJR0JFX1NUQVRTRF9JTkZPKHR4XzY0Ynl0ZV9mcmFtZXMpLAorCUdCRV9TVEFUU0RfSU5GTyh0eF82NV90b18xMjdieXRlX2ZyYW1lcyksCisJR0JFX1NUQVRTRF9JTkZPKHR4XzEyOF90b18yNTVieXRlX2ZyYW1lcyksCisJR0JFX1NUQVRTRF9JTkZPKHR4XzI1Nl90b181MTFieXRlX2ZyYW1lcyksCisJR0JFX1NUQVRTRF9JTkZPKHR4XzUxMl90b18xMDIzYnl0ZV9mcmFtZXMpLAorCUdCRV9TVEFUU0RfSU5GTyh0eF8xMDI0Ynl0ZV9mcmFtZXMpLAorCUdCRV9TVEFUU0RfSU5GTyhuZXRfYnl0ZXMpLAorCUdCRV9TVEFUU0RfSU5GTyhyeF9zb2Zfb3ZlcnJ1bnMpLAorCUdCRV9TVEFUU0RfSU5GTyhyeF9tb2Zfb3ZlcnJ1bnMpLAorCUdCRV9TVEFUU0RfSU5GTyhyeF9kbWFfb3ZlcnJ1bnMpLAogfTsKIAotI2RlZmluZSBYR0JFX1NUQVRTMF9JTkZPKGZpZWxkKQkiR0JFXzA6IiNmaWVsZCwgWEdCRV9TVEFUUzBfTU9EVUxFLCBcCi0JCQkJRklFTERfU0laRU9GKHN0cnVjdCB4Z2JlX2h3X3N0YXRzLCBmaWVsZCksIFwKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgeGdiZV9od19zdGF0cywgZmllbGQpCisvKiBUaGlzIGlzIHRoZSBzaXplIG9mIGVudHJpZXMgaW4gR0JFTlVfU1RBVFNfSE9TVCAqLworI2RlZmluZSBHQkVOVV9FVF9TVEFUU19IT1NUX1NJWkUJMzMKIAotI2RlZmluZSBYR0JFX1NUQVRTMV9JTkZPKGZpZWxkKQkiR0JFXzE6IiNmaWVsZCwgWEdCRV9TVEFUUzFfTU9EVUxFLCBcCi0JCQkJRklFTERfU0laRU9GKHN0cnVjdCB4Z2JlX2h3X3N0YXRzLCBmaWVsZCksIFwKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgeGdiZV9od19zdGF0cywgZmllbGQpCisjZGVmaW5lIEdCRU5VX1NUQVRTX0hPU1QoZmllbGQpCQkJCQlcCit7CQkJCQkJCQlcCisJIkdCRV9IT1NUOiIjZmllbGQsIEdCRU5VX1NUQVRTMF9NT0RVTEUsCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKSwJCVwKKwlvZmZzZXRvZihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKQkJCVwKK30KIAotI2RlZmluZSBYR0JFX1NUQVRTMl9JTkZPKGZpZWxkKQkiR0JFXzI6IiNmaWVsZCwgWEdCRV9TVEFUUzJfTU9EVUxFLCBcCi0JCQkJRklFTERfU0laRU9GKHN0cnVjdCB4Z2JlX2h3X3N0YXRzLCBmaWVsZCksIFwKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgeGdiZV9od19zdGF0cywgZmllbGQpCisvKiBUaGlzIGlzIHRoZSBzaXplIG9mIGVudHJpZXMgaW4gR0JFTlVfU1RBVFNfSE9TVCAqLworI2RlZmluZSBHQkVOVV9FVF9TVEFUU19QT1JUX1NJWkUJNDYKKworI2RlZmluZSBHQkVOVV9TVEFUU19QMShmaWVsZCkJCQkJCVwKK3sJCQkJCQkJCVwKKwkiR0JFX1AxOiIjZmllbGQsIEdCRU5VX1NUQVRTMV9NT0RVTEUsCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKSwJCVwKKwlvZmZzZXRvZihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKQkJCVwKK30KKworI2RlZmluZSBHQkVOVV9TVEFUU19QMihmaWVsZCkJCQkJCVwKK3sJCQkJCQkJCVwKKwkiR0JFX1AyOiIjZmllbGQsIEdCRU5VX1NUQVRTMl9NT0RVTEUsCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKSwJCVwKKwlvZmZzZXRvZihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKQkJCVwKK30KKworI2RlZmluZSBHQkVOVV9TVEFUU19QMyhmaWVsZCkJCQkJCVwKK3sJCQkJCQkJCVwKKwkiR0JFX1AzOiIjZmllbGQsIEdCRU5VX1NUQVRTM19NT0RVTEUsCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKSwJCVwKKwlvZmZzZXRvZihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKQkJCVwKK30KKworI2RlZmluZSBHQkVOVV9TVEFUU19QNChmaWVsZCkJCQkJCVwKK3sJCQkJCQkJCVwKKwkiR0JFX1A0OiIjZmllbGQsIEdCRU5VX1NUQVRTNF9NT0RVTEUsCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKSwJCVwKKwlvZmZzZXRvZihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKQkJCVwKK30KKworI2RlZmluZSBHQkVOVV9TVEFUU19QNShmaWVsZCkJCQkJCVwKK3sJCQkJCQkJCVwKKwkiR0JFX1A1OiIjZmllbGQsIEdCRU5VX1NUQVRTNV9NT0RVTEUsCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKSwJCVwKKwlvZmZzZXRvZihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKQkJCVwKK30KKworI2RlZmluZSBHQkVOVV9TVEFUU19QNihmaWVsZCkJCQkJCVwKK3sJCQkJCQkJCVwKKwkiR0JFX1A2OiIjZmllbGQsIEdCRU5VX1NUQVRTNl9NT0RVTEUsCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKSwJCVwKKwlvZmZzZXRvZihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKQkJCVwKK30KKworI2RlZmluZSBHQkVOVV9TVEFUU19QNyhmaWVsZCkJCQkJCVwKK3sJCQkJCQkJCVwKKwkiR0JFX1A3OiIjZmllbGQsIEdCRU5VX1NUQVRTN19NT0RVTEUsCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKSwJCVwKKwlvZmZzZXRvZihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKQkJCVwKK30KKworI2RlZmluZSBHQkVOVV9TVEFUU19QOChmaWVsZCkJCQkJCVwKK3sJCQkJCQkJCVwKKwkiR0JFX1A4OiIjZmllbGQsIEdCRU5VX1NUQVRTOF9NT0RVTEUsCQkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKSwJCVwKKwlvZmZzZXRvZihzdHJ1Y3QgZ2JlbnVfaHdfc3RhdHMsIGZpZWxkKQkJCVwKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRjcF9ldGh0b29sX3N0YXQgZ2JlbnVfZXRfc3RhdHNbXSA9IHsKKwkvKiBHQkVOVSBIb3N0IE1vZHVsZSAqLworCUdCRU5VX1NUQVRTX0hPU1QocnhfZ29vZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX0hPU1QocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfSE9TVChyeF9tdWx0aWNhc3RfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19IT1NUKHJ4X2NyY19lcnJvcnMpLAorCUdCRU5VX1NUQVRTX0hPU1Qocnhfb3ZlcnNpemVkX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfSE9TVChyeF91bmRlcnNpemVkX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfSE9TVChhbGVfZHJvcCksCisJR0JFTlVfU1RBVFNfSE9TVChhbGVfb3ZlcnJ1bl9kcm9wKSwKKwlHQkVOVV9TVEFUU19IT1NUKHJ4X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19IT1NUKHR4X2dvb2RfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19IT1NUKHR4X2Jyb2FkY2FzdF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX0hPU1QodHhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfSE9TVCh0eF9ieXRlcyksCisJR0JFTlVfU1RBVFNfSE9TVCh0eF82NEJfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19IT1NUKHR4XzY1X3RvXzEyN0JfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19IT1NUKHR4XzEyOF90b18yNTVCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfSE9TVCh0eF8yNTZfdG9fNTExQl9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX0hPU1QodHhfNTEyX3RvXzEwMjNCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfSE9TVCh0eF8xMDI0Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX0hPU1QobmV0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19IT1NUKHJ4X2JvdHRvbV9maWZvX2Ryb3ApLAorCUdCRU5VX1NUQVRTX0hPU1QocnhfcG9ydF9tYXNrX2Ryb3ApLAorCUdCRU5VX1NUQVRTX0hPU1QocnhfdG9wX2ZpZm9fZHJvcCksCisJR0JFTlVfU1RBVFNfSE9TVChhbGVfcmF0ZV9saW1pdF9kcm9wKSwKKwlHQkVOVV9TVEFUU19IT1NUKGFsZV92aWRfaW5ncmVzc19kcm9wKSwKKwlHQkVOVV9TVEFUU19IT1NUKGFsZV9kYV9lcV9zYV9kcm9wKSwKKwlHQkVOVV9TVEFUU19IT1NUKGFsZV91bmtub3duX3VjYXN0KSwKKwlHQkVOVV9TVEFUU19IT1NUKGFsZV91bmtub3duX3VjYXN0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19IT1NUKGFsZV91bmtub3duX21jYXN0KSwKKwlHQkVOVV9TVEFUU19IT1NUKGFsZV91bmtub3duX21jYXN0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19IT1NUKGFsZV91bmtub3duX2JjYXN0KSwKKwlHQkVOVV9TVEFUU19IT1NUKGFsZV91bmtub3duX2JjYXN0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19IT1NUKHR4X21lbV9wcm90ZWN0X2VyciksCisJLyogR0JFTlUgTW9kdWxlIDEgKi8KKwlHQkVOVV9TVEFUU19QMShyeF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEocnhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEocnhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMShyeF9jcmNfZXJyb3JzKSwKKwlHQkVOVV9TVEFUU19QMShyeF9hbGlnbl9jb2RlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDEocnhfb3ZlcnNpemVkX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEocnhfamFiYmVyX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEocnhfdW5kZXJzaXplZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AxKHJ4X2ZyYWdtZW50cyksCisJR0JFTlVfU1RBVFNfUDEoYWxlX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AxKGFsZV9vdmVycnVuX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AxKHJ4X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QMSh0eF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEodHhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEodHhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEodHhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMSh0eF9kZWZlcnJlZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AxKHR4X2NvbGxpc2lvbl9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AxKHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEodHhfbXVsdF9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEodHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpLAorCUdCRU5VX1NUQVRTX1AxKHR4X2xhdGVfY29sbGlzaW9ucyksCisJR0JFTlVfU1RBVFNfUDEocnhfaXBnX2Vycm9yKSwKKwlHQkVOVV9TVEFUU19QMSh0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDEodHhfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1AxKHR4XzY0Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AxKHR4XzY1X3RvXzEyN0JfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMSh0eF8xMjhfdG9fMjU1Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AxKHR4XzI1Nl90b181MTFCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEodHhfNTEyX3RvXzEwMjNCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDEodHhfMTAyNEJfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMShuZXRfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1AxKHJ4X2JvdHRvbV9maWZvX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AxKHJ4X3BvcnRfbWFza19kcm9wKSwKKwlHQkVOVV9TVEFUU19QMShyeF90b3BfZmlmb19kcm9wKSwKKwlHQkVOVV9TVEFUU19QMShhbGVfcmF0ZV9saW1pdF9kcm9wKSwKKwlHQkVOVV9TVEFUU19QMShhbGVfdmlkX2luZ3Jlc3NfZHJvcCksCisJR0JFTlVfU1RBVFNfUDEoYWxlX2RhX2VxX3NhX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AxKGFsZV91bmtub3duX3VjYXN0KSwKKwlHQkVOVV9TVEFUU19QMShhbGVfdW5rbm93bl91Y2FzdF9ieXRlcyksCisJR0JFTlVfU1RBVFNfUDEoYWxlX3Vua25vd25fbWNhc3QpLAorCUdCRU5VX1NUQVRTX1AxKGFsZV91bmtub3duX21jYXN0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QMShhbGVfdW5rbm93bl9iY2FzdCksCisJR0JFTlVfU1RBVFNfUDEoYWxlX3Vua25vd25fYmNhc3RfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1AxKHR4X21lbV9wcm90ZWN0X2VyciksCisJLyogR0JFTlUgTW9kdWxlIDIgKi8KKwlHQkVOVV9TVEFUU19QMihyeF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIocnhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIocnhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMihyeF9jcmNfZXJyb3JzKSwKKwlHQkVOVV9TVEFUU19QMihyeF9hbGlnbl9jb2RlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDIocnhfb3ZlcnNpemVkX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIocnhfamFiYmVyX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIocnhfdW5kZXJzaXplZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AyKHJ4X2ZyYWdtZW50cyksCisJR0JFTlVfU1RBVFNfUDIoYWxlX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AyKGFsZV9vdmVycnVuX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AyKHJ4X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QMih0eF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIodHhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIodHhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIodHhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMih0eF9kZWZlcnJlZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AyKHR4X2NvbGxpc2lvbl9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AyKHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIodHhfbXVsdF9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIodHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpLAorCUdCRU5VX1NUQVRTX1AyKHR4X2xhdGVfY29sbGlzaW9ucyksCisJR0JFTlVfU1RBVFNfUDIocnhfaXBnX2Vycm9yKSwKKwlHQkVOVV9TVEFUU19QMih0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDIodHhfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1AyKHR4XzY0Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AyKHR4XzY1X3RvXzEyN0JfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMih0eF8xMjhfdG9fMjU1Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AyKHR4XzI1Nl90b181MTFCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIodHhfNTEyX3RvXzEwMjNCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDIodHhfMTAyNEJfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMihuZXRfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1AyKHJ4X2JvdHRvbV9maWZvX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AyKHJ4X3BvcnRfbWFza19kcm9wKSwKKwlHQkVOVV9TVEFUU19QMihyeF90b3BfZmlmb19kcm9wKSwKKwlHQkVOVV9TVEFUU19QMihhbGVfcmF0ZV9saW1pdF9kcm9wKSwKKwlHQkVOVV9TVEFUU19QMihhbGVfdmlkX2luZ3Jlc3NfZHJvcCksCisJR0JFTlVfU1RBVFNfUDIoYWxlX2RhX2VxX3NhX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AyKGFsZV91bmtub3duX3VjYXN0KSwKKwlHQkVOVV9TVEFUU19QMihhbGVfdW5rbm93bl91Y2FzdF9ieXRlcyksCisJR0JFTlVfU1RBVFNfUDIoYWxlX3Vua25vd25fbWNhc3QpLAorCUdCRU5VX1NUQVRTX1AyKGFsZV91bmtub3duX21jYXN0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QMihhbGVfdW5rbm93bl9iY2FzdCksCisJR0JFTlVfU1RBVFNfUDIoYWxlX3Vua25vd25fYmNhc3RfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1AyKHR4X21lbV9wcm90ZWN0X2VyciksCisJLyogR0JFTlUgTW9kdWxlIDMgKi8KKwlHQkVOVV9TVEFUU19QMyhyeF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDMocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDMocnhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDMocnhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMyhyeF9jcmNfZXJyb3JzKSwKKwlHQkVOVV9TVEFUU19QMyhyeF9hbGlnbl9jb2RlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDMocnhfb3ZlcnNpemVkX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDMocnhfamFiYmVyX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDMocnhfdW5kZXJzaXplZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AzKHJ4X2ZyYWdtZW50cyksCisJR0JFTlVfU1RBVFNfUDMoYWxlX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AzKGFsZV9vdmVycnVuX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AzKHJ4X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QMyh0eF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDModHhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDModHhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDModHhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMyh0eF9kZWZlcnJlZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AzKHR4X2NvbGxpc2lvbl9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AzKHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDModHhfbXVsdF9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDModHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpLAorCUdCRU5VX1NUQVRTX1AzKHR4X2xhdGVfY29sbGlzaW9ucyksCisJR0JFTlVfU1RBVFNfUDMocnhfaXBnX2Vycm9yKSwKKwlHQkVOVV9TVEFUU19QMyh0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDModHhfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1AzKHR4XzY0Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AzKHR4XzY1X3RvXzEyN0JfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMyh0eF8xMjhfdG9fMjU1Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1AzKHR4XzI1Nl90b181MTFCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDModHhfNTEyX3RvXzEwMjNCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDModHhfMTAyNEJfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QMyhuZXRfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1AzKHJ4X2JvdHRvbV9maWZvX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AzKHJ4X3BvcnRfbWFza19kcm9wKSwKKwlHQkVOVV9TVEFUU19QMyhyeF90b3BfZmlmb19kcm9wKSwKKwlHQkVOVV9TVEFUU19QMyhhbGVfcmF0ZV9saW1pdF9kcm9wKSwKKwlHQkVOVV9TVEFUU19QMyhhbGVfdmlkX2luZ3Jlc3NfZHJvcCksCisJR0JFTlVfU1RBVFNfUDMoYWxlX2RhX2VxX3NhX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1AzKGFsZV91bmtub3duX3VjYXN0KSwKKwlHQkVOVV9TVEFUU19QMyhhbGVfdW5rbm93bl91Y2FzdF9ieXRlcyksCisJR0JFTlVfU1RBVFNfUDMoYWxlX3Vua25vd25fbWNhc3QpLAorCUdCRU5VX1NUQVRTX1AzKGFsZV91bmtub3duX21jYXN0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QMyhhbGVfdW5rbm93bl9iY2FzdCksCisJR0JFTlVfU1RBVFNfUDMoYWxlX3Vua25vd25fYmNhc3RfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1AzKHR4X21lbV9wcm90ZWN0X2VyciksCisJLyogR0JFTlUgTW9kdWxlIDQgKi8KKwlHQkVOVV9TVEFUU19QNChyeF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQocnhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQocnhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNChyeF9jcmNfZXJyb3JzKSwKKwlHQkVOVV9TVEFUU19QNChyeF9hbGlnbl9jb2RlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDQocnhfb3ZlcnNpemVkX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQocnhfamFiYmVyX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQocnhfdW5kZXJzaXplZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A0KHJ4X2ZyYWdtZW50cyksCisJR0JFTlVfU1RBVFNfUDQoYWxlX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A0KGFsZV9vdmVycnVuX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A0KHJ4X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QNCh0eF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQodHhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQodHhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQodHhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNCh0eF9kZWZlcnJlZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A0KHR4X2NvbGxpc2lvbl9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A0KHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQodHhfbXVsdF9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQodHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpLAorCUdCRU5VX1NUQVRTX1A0KHR4X2xhdGVfY29sbGlzaW9ucyksCisJR0JFTlVfU1RBVFNfUDQocnhfaXBnX2Vycm9yKSwKKwlHQkVOVV9TVEFUU19QNCh0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDQodHhfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A0KHR4XzY0Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A0KHR4XzY1X3RvXzEyN0JfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNCh0eF8xMjhfdG9fMjU1Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A0KHR4XzI1Nl90b181MTFCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQodHhfNTEyX3RvXzEwMjNCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDQodHhfMTAyNEJfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNChuZXRfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A0KHJ4X2JvdHRvbV9maWZvX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A0KHJ4X3BvcnRfbWFza19kcm9wKSwKKwlHQkVOVV9TVEFUU19QNChyeF90b3BfZmlmb19kcm9wKSwKKwlHQkVOVV9TVEFUU19QNChhbGVfcmF0ZV9saW1pdF9kcm9wKSwKKwlHQkVOVV9TVEFUU19QNChhbGVfdmlkX2luZ3Jlc3NfZHJvcCksCisJR0JFTlVfU1RBVFNfUDQoYWxlX2RhX2VxX3NhX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A0KGFsZV91bmtub3duX3VjYXN0KSwKKwlHQkVOVV9TVEFUU19QNChhbGVfdW5rbm93bl91Y2FzdF9ieXRlcyksCisJR0JFTlVfU1RBVFNfUDQoYWxlX3Vua25vd25fbWNhc3QpLAorCUdCRU5VX1NUQVRTX1A0KGFsZV91bmtub3duX21jYXN0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QNChhbGVfdW5rbm93bl9iY2FzdCksCisJR0JFTlVfU1RBVFNfUDQoYWxlX3Vua25vd25fYmNhc3RfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A0KHR4X21lbV9wcm90ZWN0X2VyciksCisJLyogR0JFTlUgTW9kdWxlIDUgKi8KKwlHQkVOVV9TVEFUU19QNShyeF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUocnhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUocnhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNShyeF9jcmNfZXJyb3JzKSwKKwlHQkVOVV9TVEFUU19QNShyeF9hbGlnbl9jb2RlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDUocnhfb3ZlcnNpemVkX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUocnhfamFiYmVyX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUocnhfdW5kZXJzaXplZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A1KHJ4X2ZyYWdtZW50cyksCisJR0JFTlVfU1RBVFNfUDUoYWxlX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A1KGFsZV9vdmVycnVuX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A1KHJ4X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QNSh0eF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUodHhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUodHhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUodHhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNSh0eF9kZWZlcnJlZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A1KHR4X2NvbGxpc2lvbl9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A1KHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUodHhfbXVsdF9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUodHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpLAorCUdCRU5VX1NUQVRTX1A1KHR4X2xhdGVfY29sbGlzaW9ucyksCisJR0JFTlVfU1RBVFNfUDUocnhfaXBnX2Vycm9yKSwKKwlHQkVOVV9TVEFUU19QNSh0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDUodHhfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A1KHR4XzY0Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A1KHR4XzY1X3RvXzEyN0JfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNSh0eF8xMjhfdG9fMjU1Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A1KHR4XzI1Nl90b181MTFCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUodHhfNTEyX3RvXzEwMjNCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDUodHhfMTAyNEJfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNShuZXRfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A1KHJ4X2JvdHRvbV9maWZvX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A1KHJ4X3BvcnRfbWFza19kcm9wKSwKKwlHQkVOVV9TVEFUU19QNShyeF90b3BfZmlmb19kcm9wKSwKKwlHQkVOVV9TVEFUU19QNShhbGVfcmF0ZV9saW1pdF9kcm9wKSwKKwlHQkVOVV9TVEFUU19QNShhbGVfdmlkX2luZ3Jlc3NfZHJvcCksCisJR0JFTlVfU1RBVFNfUDUoYWxlX2RhX2VxX3NhX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A1KGFsZV91bmtub3duX3VjYXN0KSwKKwlHQkVOVV9TVEFUU19QNShhbGVfdW5rbm93bl91Y2FzdF9ieXRlcyksCisJR0JFTlVfU1RBVFNfUDUoYWxlX3Vua25vd25fbWNhc3QpLAorCUdCRU5VX1NUQVRTX1A1KGFsZV91bmtub3duX21jYXN0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QNShhbGVfdW5rbm93bl9iY2FzdCksCisJR0JFTlVfU1RBVFNfUDUoYWxlX3Vua25vd25fYmNhc3RfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A1KHR4X21lbV9wcm90ZWN0X2VyciksCisJLyogR0JFTlUgTW9kdWxlIDYgKi8KKwlHQkVOVV9TVEFUU19QNihyeF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYocnhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYocnhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNihyeF9jcmNfZXJyb3JzKSwKKwlHQkVOVV9TVEFUU19QNihyeF9hbGlnbl9jb2RlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDYocnhfb3ZlcnNpemVkX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYocnhfamFiYmVyX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYocnhfdW5kZXJzaXplZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A2KHJ4X2ZyYWdtZW50cyksCisJR0JFTlVfU1RBVFNfUDYoYWxlX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A2KGFsZV9vdmVycnVuX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A2KHJ4X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QNih0eF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYodHhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYodHhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYodHhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNih0eF9kZWZlcnJlZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A2KHR4X2NvbGxpc2lvbl9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A2KHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYodHhfbXVsdF9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYodHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpLAorCUdCRU5VX1NUQVRTX1A2KHR4X2xhdGVfY29sbGlzaW9ucyksCisJR0JFTlVfU1RBVFNfUDYocnhfaXBnX2Vycm9yKSwKKwlHQkVOVV9TVEFUU19QNih0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDYodHhfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A2KHR4XzY0Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A2KHR4XzY1X3RvXzEyN0JfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNih0eF8xMjhfdG9fMjU1Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A2KHR4XzI1Nl90b181MTFCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYodHhfNTEyX3RvXzEwMjNCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDYodHhfMTAyNEJfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNihuZXRfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A2KHJ4X2JvdHRvbV9maWZvX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A2KHJ4X3BvcnRfbWFza19kcm9wKSwKKwlHQkVOVV9TVEFUU19QNihyeF90b3BfZmlmb19kcm9wKSwKKwlHQkVOVV9TVEFUU19QNihhbGVfcmF0ZV9saW1pdF9kcm9wKSwKKwlHQkVOVV9TVEFUU19QNihhbGVfdmlkX2luZ3Jlc3NfZHJvcCksCisJR0JFTlVfU1RBVFNfUDYoYWxlX2RhX2VxX3NhX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A2KGFsZV91bmtub3duX3VjYXN0KSwKKwlHQkVOVV9TVEFUU19QNihhbGVfdW5rbm93bl91Y2FzdF9ieXRlcyksCisJR0JFTlVfU1RBVFNfUDYoYWxlX3Vua25vd25fbWNhc3QpLAorCUdCRU5VX1NUQVRTX1A2KGFsZV91bmtub3duX21jYXN0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QNihhbGVfdW5rbm93bl9iY2FzdCksCisJR0JFTlVfU1RBVFNfUDYoYWxlX3Vua25vd25fYmNhc3RfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A2KHR4X21lbV9wcm90ZWN0X2VyciksCisJLyogR0JFTlUgTW9kdWxlIDcgKi8KKwlHQkVOVV9TVEFUU19QNyhyeF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcocnhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcocnhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNyhyeF9jcmNfZXJyb3JzKSwKKwlHQkVOVV9TVEFUU19QNyhyeF9hbGlnbl9jb2RlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDcocnhfb3ZlcnNpemVkX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcocnhfamFiYmVyX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcocnhfdW5kZXJzaXplZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A3KHJ4X2ZyYWdtZW50cyksCisJR0JFTlVfU1RBVFNfUDcoYWxlX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A3KGFsZV9vdmVycnVuX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A3KHJ4X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QNyh0eF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcodHhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcodHhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcodHhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNyh0eF9kZWZlcnJlZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A3KHR4X2NvbGxpc2lvbl9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A3KHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcodHhfbXVsdF9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcodHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpLAorCUdCRU5VX1NUQVRTX1A3KHR4X2xhdGVfY29sbGlzaW9ucyksCisJR0JFTlVfU1RBVFNfUDcocnhfaXBnX2Vycm9yKSwKKwlHQkVOVV9TVEFUU19QNyh0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDcodHhfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A3KHR4XzY0Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A3KHR4XzY1X3RvXzEyN0JfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNyh0eF8xMjhfdG9fMjU1Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A3KHR4XzI1Nl90b181MTFCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcodHhfNTEyX3RvXzEwMjNCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDcodHhfMTAyNEJfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QNyhuZXRfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A3KHJ4X2JvdHRvbV9maWZvX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A3KHJ4X3BvcnRfbWFza19kcm9wKSwKKwlHQkVOVV9TVEFUU19QNyhyeF90b3BfZmlmb19kcm9wKSwKKwlHQkVOVV9TVEFUU19QNyhhbGVfcmF0ZV9saW1pdF9kcm9wKSwKKwlHQkVOVV9TVEFUU19QNyhhbGVfdmlkX2luZ3Jlc3NfZHJvcCksCisJR0JFTlVfU1RBVFNfUDcoYWxlX2RhX2VxX3NhX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A3KGFsZV91bmtub3duX3VjYXN0KSwKKwlHQkVOVV9TVEFUU19QNyhhbGVfdW5rbm93bl91Y2FzdF9ieXRlcyksCisJR0JFTlVfU1RBVFNfUDcoYWxlX3Vua25vd25fbWNhc3QpLAorCUdCRU5VX1NUQVRTX1A3KGFsZV91bmtub3duX21jYXN0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QNyhhbGVfdW5rbm93bl9iY2FzdCksCisJR0JFTlVfU1RBVFNfUDcoYWxlX3Vua25vd25fYmNhc3RfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A3KHR4X21lbV9wcm90ZWN0X2VyciksCisJLyogR0JFTlUgTW9kdWxlIDggKi8KKwlHQkVOVV9TVEFUU19QOChyeF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgocnhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgocnhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QOChyeF9jcmNfZXJyb3JzKSwKKwlHQkVOVV9TVEFUU19QOChyeF9hbGlnbl9jb2RlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDgocnhfb3ZlcnNpemVkX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgocnhfamFiYmVyX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgocnhfdW5kZXJzaXplZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A4KHJ4X2ZyYWdtZW50cyksCisJR0JFTlVfU1RBVFNfUDgoYWxlX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A4KGFsZV9vdmVycnVuX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A4KHJ4X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QOCh0eF9nb29kX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgodHhfYnJvYWRjYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgodHhfbXVsdGljYXN0X2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgodHhfcGF1c2VfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QOCh0eF9kZWZlcnJlZF9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A4KHR4X2NvbGxpc2lvbl9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A4KHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgodHhfbXVsdF9jb2xsX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgodHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpLAorCUdCRU5VX1NUQVRTX1A4KHR4X2xhdGVfY29sbGlzaW9ucyksCisJR0JFTlVfU1RBVFNfUDgocnhfaXBnX2Vycm9yKSwKKwlHQkVOVV9TVEFUU19QOCh0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyksCisJR0JFTlVfU1RBVFNfUDgodHhfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A4KHR4XzY0Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A4KHR4XzY1X3RvXzEyN0JfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QOCh0eF8xMjhfdG9fMjU1Ql9mcmFtZXMpLAorCUdCRU5VX1NUQVRTX1A4KHR4XzI1Nl90b181MTFCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgodHhfNTEyX3RvXzEwMjNCX2ZyYW1lcyksCisJR0JFTlVfU1RBVFNfUDgodHhfMTAyNEJfZnJhbWVzKSwKKwlHQkVOVV9TVEFUU19QOChuZXRfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A4KHJ4X2JvdHRvbV9maWZvX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A4KHJ4X3BvcnRfbWFza19kcm9wKSwKKwlHQkVOVV9TVEFUU19QOChyeF90b3BfZmlmb19kcm9wKSwKKwlHQkVOVV9TVEFUU19QOChhbGVfcmF0ZV9saW1pdF9kcm9wKSwKKwlHQkVOVV9TVEFUU19QOChhbGVfdmlkX2luZ3Jlc3NfZHJvcCksCisJR0JFTlVfU1RBVFNfUDgoYWxlX2RhX2VxX3NhX2Ryb3ApLAorCUdCRU5VX1NUQVRTX1A4KGFsZV91bmtub3duX3VjYXN0KSwKKwlHQkVOVV9TVEFUU19QOChhbGVfdW5rbm93bl91Y2FzdF9ieXRlcyksCisJR0JFTlVfU1RBVFNfUDgoYWxlX3Vua25vd25fbWNhc3QpLAorCUdCRU5VX1NUQVRTX1A4KGFsZV91bmtub3duX21jYXN0X2J5dGVzKSwKKwlHQkVOVV9TVEFUU19QOChhbGVfdW5rbm93bl9iY2FzdCksCisJR0JFTlVfU1RBVFNfUDgoYWxlX3Vua25vd25fYmNhc3RfYnl0ZXMpLAorCUdCRU5VX1NUQVRTX1A4KHR4X21lbV9wcm90ZWN0X2VyciksCit9OworCisjZGVmaW5lIFhHQkVfU1RBVFMwX0lORk8oZmllbGQpCQkJCVwKK3sJCQkJCQkJXAorCSJHQkVfMDoiI2ZpZWxkLCBYR0JFX1NUQVRTMF9NT0RVTEUsCQlcCisJRklFTERfU0laRU9GKHN0cnVjdCB4Z2JlX2h3X3N0YXRzLCBmaWVsZCksCVwKKwlvZmZzZXRvZihzdHJ1Y3QgeGdiZV9od19zdGF0cywgZmllbGQpCQlcCit9CisKKyNkZWZpbmUgWEdCRV9TVEFUUzFfSU5GTyhmaWVsZCkJCQkJXAorewkJCQkJCQlcCisJIkdCRV8xOiIjZmllbGQsIFhHQkVfU1RBVFMxX01PRFVMRSwJCVwKKwlGSUVMRF9TSVpFT0Yoc3RydWN0IHhnYmVfaHdfc3RhdHMsIGZpZWxkKSwJXAorCW9mZnNldG9mKHN0cnVjdCB4Z2JlX2h3X3N0YXRzLCBmaWVsZCkJCVwKK30KKworI2RlZmluZSBYR0JFX1NUQVRTMl9JTkZPKGZpZWxkKQkJCQlcCit7CQkJCQkJCVwKKwkiR0JFXzI6IiNmaWVsZCwgWEdCRV9TVEFUUzJfTU9EVUxFLAkJXAorCUZJRUxEX1NJWkVPRihzdHJ1Y3QgeGdiZV9od19zdGF0cywgZmllbGQpLAlcCisJb2Zmc2V0b2Yoc3RydWN0IHhnYmVfaHdfc3RhdHMsIGZpZWxkKQkJXAorfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldGNwX2V0aHRvb2xfc3RhdCB4Z2JlMTBfZXRfc3RhdHNbXSA9IHsKIAkvKiBHQkUgbW9kdWxlIDAgKi8KLQl7WEdCRV9TVEFUUzBfSU5GTyhyeF9nb29kX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMF9JTkZPKHJ4X2Jyb2FkY2FzdF9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzBfSU5GTyhyeF9tdWx0aWNhc3RfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMwX0lORk8ocnhfb3ZlcnNpemVkX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMF9JTkZPKHJ4X3VuZGVyc2l6ZWRfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMwX0lORk8ob3ZlcnJ1bl90eXBlNCl9LAotCXtYR0JFX1NUQVRTMF9JTkZPKG92ZXJydW5fdHlwZTUpfSwKLQl7WEdCRV9TVEFUUzBfSU5GTyhyeF9ieXRlcyl9LAotCXtYR0JFX1NUQVRTMF9JTkZPKHR4X2dvb2RfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMwX0lORk8odHhfYnJvYWRjYXN0X2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMF9JTkZPKHR4X211bHRpY2FzdF9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzBfSU5GTyh0eF9ieXRlcyl9LAotCXtYR0JFX1NUQVRTMF9JTkZPKHR4XzY0Ynl0ZV9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzBfSU5GTyh0eF82NV90b18xMjdieXRlX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMF9JTkZPKHR4XzEyOF90b18yNTVieXRlX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMF9JTkZPKHR4XzI1Nl90b181MTFieXRlX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMF9JTkZPKHR4XzUxMl90b18xMDIzYnl0ZV9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzBfSU5GTyh0eF8xMDI0Ynl0ZV9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzBfSU5GTyhuZXRfYnl0ZXMpfSwKLQl7WEdCRV9TVEFUUzBfSU5GTyhyeF9zb2Zfb3ZlcnJ1bnMpfSwKLQl7WEdCRV9TVEFUUzBfSU5GTyhyeF9tb2Zfb3ZlcnJ1bnMpfSwKLQl7WEdCRV9TVEFUUzBfSU5GTyhyeF9kbWFfb3ZlcnJ1bnMpfSwKKwlYR0JFX1NUQVRTMF9JTkZPKHJ4X2dvb2RfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMF9JTkZPKHJ4X2Jyb2FkY2FzdF9mcmFtZXMpLAorCVhHQkVfU1RBVFMwX0lORk8ocnhfbXVsdGljYXN0X2ZyYW1lcyksCisJWEdCRV9TVEFUUzBfSU5GTyhyeF9vdmVyc2l6ZWRfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMF9JTkZPKHJ4X3VuZGVyc2l6ZWRfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMF9JTkZPKG92ZXJydW5fdHlwZTQpLAorCVhHQkVfU1RBVFMwX0lORk8ob3ZlcnJ1bl90eXBlNSksCisJWEdCRV9TVEFUUzBfSU5GTyhyeF9ieXRlcyksCisJWEdCRV9TVEFUUzBfSU5GTyh0eF9nb29kX2ZyYW1lcyksCisJWEdCRV9TVEFUUzBfSU5GTyh0eF9icm9hZGNhc3RfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMF9JTkZPKHR4X211bHRpY2FzdF9mcmFtZXMpLAorCVhHQkVfU1RBVFMwX0lORk8odHhfYnl0ZXMpLAorCVhHQkVfU1RBVFMwX0lORk8odHhfNjRieXRlX2ZyYW1lcyksCisJWEdCRV9TVEFUUzBfSU5GTyh0eF82NV90b18xMjdieXRlX2ZyYW1lcyksCisJWEdCRV9TVEFUUzBfSU5GTyh0eF8xMjhfdG9fMjU1Ynl0ZV9mcmFtZXMpLAorCVhHQkVfU1RBVFMwX0lORk8odHhfMjU2X3RvXzUxMWJ5dGVfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMF9JTkZPKHR4XzUxMl90b18xMDIzYnl0ZV9mcmFtZXMpLAorCVhHQkVfU1RBVFMwX0lORk8odHhfMTAyNGJ5dGVfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMF9JTkZPKG5ldF9ieXRlcyksCisJWEdCRV9TVEFUUzBfSU5GTyhyeF9zb2Zfb3ZlcnJ1bnMpLAorCVhHQkVfU1RBVFMwX0lORk8ocnhfbW9mX292ZXJydW5zKSwKKwlYR0JFX1NUQVRTMF9JTkZPKHJ4X2RtYV9vdmVycnVucyksCiAJLyogWEdCRSBtb2R1bGUgMSAqLwotCXtYR0JFX1NUQVRTMV9JTkZPKHJ4X2dvb2RfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8ocnhfYnJvYWRjYXN0X2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKHJ4X211bHRpY2FzdF9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzFfSU5GTyhyeF9wYXVzZV9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzFfSU5GTyhyeF9jcmNfZXJyb3JzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8ocnhfYWxpZ25fY29kZV9lcnJvcnMpfSwKLQl7WEdCRV9TVEFUUzFfSU5GTyhyeF9vdmVyc2l6ZWRfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8ocnhfamFiYmVyX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKHJ4X3VuZGVyc2l6ZWRfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8ocnhfZnJhZ21lbnRzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8ob3ZlcnJ1bl90eXBlNCl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKG92ZXJydW5fdHlwZTUpfSwKLQl7WEdCRV9TVEFUUzFfSU5GTyhyeF9ieXRlcyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKHR4X2dvb2RfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8odHhfYnJvYWRjYXN0X2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKHR4X211bHRpY2FzdF9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzFfSU5GTyh0eF9wYXVzZV9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzFfSU5GTyh0eF9kZWZlcnJlZF9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzFfSU5GTyh0eF9jb2xsaXNpb25fZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8odHhfc2luZ2xlX2NvbGxfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8odHhfbXVsdF9jb2xsX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKHR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb25zKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8odHhfbGF0ZV9jb2xsaXNpb25zKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8odHhfdW5kZXJydW4pfSwKLQl7WEdCRV9TVEFUUzFfSU5GTyh0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKHR4X2J5dGVzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8odHhfNjRieXRlX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKHR4XzY1X3RvXzEyN2J5dGVfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8odHhfMTI4X3RvXzI1NWJ5dGVfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8odHhfMjU2X3RvXzUxMWJ5dGVfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMxX0lORk8odHhfNTEyX3RvXzEwMjNieXRlX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKHR4XzEwMjRieXRlX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKG5ldF9ieXRlcyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKHJ4X3NvZl9vdmVycnVucyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKHJ4X21vZl9vdmVycnVucyl9LAotCXtYR0JFX1NUQVRTMV9JTkZPKHJ4X2RtYV9vdmVycnVucyl9LAorCVhHQkVfU1RBVFMxX0lORk8ocnhfZ29vZF9mcmFtZXMpLAorCVhHQkVfU1RBVFMxX0lORk8ocnhfYnJvYWRjYXN0X2ZyYW1lcyksCisJWEdCRV9TVEFUUzFfSU5GTyhyeF9tdWx0aWNhc3RfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHJ4X3BhdXNlX2ZyYW1lcyksCisJWEdCRV9TVEFUUzFfSU5GTyhyeF9jcmNfZXJyb3JzKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHJ4X2FsaWduX2NvZGVfZXJyb3JzKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHJ4X292ZXJzaXplZF9mcmFtZXMpLAorCVhHQkVfU1RBVFMxX0lORk8ocnhfamFiYmVyX2ZyYW1lcyksCisJWEdCRV9TVEFUUzFfSU5GTyhyeF91bmRlcnNpemVkX2ZyYW1lcyksCisJWEdCRV9TVEFUUzFfSU5GTyhyeF9mcmFnbWVudHMpLAorCVhHQkVfU1RBVFMxX0lORk8ob3ZlcnJ1bl90eXBlNCksCisJWEdCRV9TVEFUUzFfSU5GTyhvdmVycnVuX3R5cGU1KSwKKwlYR0JFX1NUQVRTMV9JTkZPKHJ4X2J5dGVzKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHR4X2dvb2RfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHR4X2Jyb2FkY2FzdF9mcmFtZXMpLAorCVhHQkVfU1RBVFMxX0lORk8odHhfbXVsdGljYXN0X2ZyYW1lcyksCisJWEdCRV9TVEFUUzFfSU5GTyh0eF9wYXVzZV9mcmFtZXMpLAorCVhHQkVfU1RBVFMxX0lORk8odHhfZGVmZXJyZWRfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHR4X2NvbGxpc2lvbl9mcmFtZXMpLAorCVhHQkVfU1RBVFMxX0lORk8odHhfc2luZ2xlX2NvbGxfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHR4X211bHRfY29sbF9mcmFtZXMpLAorCVhHQkVfU1RBVFMxX0lORk8odHhfZXhjZXNzaXZlX2NvbGxpc2lvbnMpLAorCVhHQkVfU1RBVFMxX0lORk8odHhfbGF0ZV9jb2xsaXNpb25zKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHR4X3VuZGVycnVuKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHR4X2NhcnJpZXJfc2Vuc2VfZXJyb3JzKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHR4X2J5dGVzKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHR4XzY0Ynl0ZV9mcmFtZXMpLAorCVhHQkVfU1RBVFMxX0lORk8odHhfNjVfdG9fMTI3Ynl0ZV9mcmFtZXMpLAorCVhHQkVfU1RBVFMxX0lORk8odHhfMTI4X3RvXzI1NWJ5dGVfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHR4XzI1Nl90b181MTFieXRlX2ZyYW1lcyksCisJWEdCRV9TVEFUUzFfSU5GTyh0eF81MTJfdG9fMTAyM2J5dGVfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHR4XzEwMjRieXRlX2ZyYW1lcyksCisJWEdCRV9TVEFUUzFfSU5GTyhuZXRfYnl0ZXMpLAorCVhHQkVfU1RBVFMxX0lORk8ocnhfc29mX292ZXJydW5zKSwKKwlYR0JFX1NUQVRTMV9JTkZPKHJ4X21vZl9vdmVycnVucyksCisJWEdCRV9TVEFUUzFfSU5GTyhyeF9kbWFfb3ZlcnJ1bnMpLAogCS8qIFhHQkUgbW9kdWxlIDIgKi8KLQl7WEdCRV9TVEFUUzJfSU5GTyhyeF9nb29kX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHJ4X2Jyb2FkY2FzdF9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyhyeF9tdWx0aWNhc3RfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMyX0lORk8ocnhfcGF1c2VfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMyX0lORk8ocnhfY3JjX2Vycm9ycyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHJ4X2FsaWduX2NvZGVfZXJyb3JzKX0sCi0Je1hHQkVfU1RBVFMyX0lORk8ocnhfb3ZlcnNpemVkX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHJ4X2phYmJlcl9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyhyeF91bmRlcnNpemVkX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHJ4X2ZyYWdtZW50cyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKG92ZXJydW5fdHlwZTQpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyhvdmVycnVuX3R5cGU1KX0sCi0Je1hHQkVfU1RBVFMyX0lORk8ocnhfYnl0ZXMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyh0eF9nb29kX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHR4X2Jyb2FkY2FzdF9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyh0eF9tdWx0aWNhc3RfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMyX0lORk8odHhfcGF1c2VfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMyX0lORk8odHhfZGVmZXJyZWRfZnJhbWVzKX0sCi0Je1hHQkVfU1RBVFMyX0lORk8odHhfY29sbGlzaW9uX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHR4X211bHRfY29sbF9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyh0eF9leGNlc3NpdmVfY29sbGlzaW9ucyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHR4X2xhdGVfY29sbGlzaW9ucyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHR4X3VuZGVycnVuKX0sCi0Je1hHQkVfU1RBVFMyX0lORk8odHhfY2Fycmllcl9zZW5zZV9lcnJvcnMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyh0eF9ieXRlcyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHR4XzY0Ynl0ZV9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyh0eF82NV90b18xMjdieXRlX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHR4XzEyOF90b18yNTVieXRlX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHR4XzI1Nl90b181MTFieXRlX2ZyYW1lcyl9LAotCXtYR0JFX1NUQVRTMl9JTkZPKHR4XzUxMl90b18xMDIzYnl0ZV9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyh0eF8xMDI0Ynl0ZV9mcmFtZXMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyhuZXRfYnl0ZXMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyhyeF9zb2Zfb3ZlcnJ1bnMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyhyeF9tb2Zfb3ZlcnJ1bnMpfSwKLQl7WEdCRV9TVEFUUzJfSU5GTyhyeF9kbWFfb3ZlcnJ1bnMpfSwKKwlYR0JFX1NUQVRTMl9JTkZPKHJ4X2dvb2RfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMl9JTkZPKHJ4X2Jyb2FkY2FzdF9mcmFtZXMpLAorCVhHQkVfU1RBVFMyX0lORk8ocnhfbXVsdGljYXN0X2ZyYW1lcyksCisJWEdCRV9TVEFUUzJfSU5GTyhyeF9wYXVzZV9mcmFtZXMpLAorCVhHQkVfU1RBVFMyX0lORk8ocnhfY3JjX2Vycm9ycyksCisJWEdCRV9TVEFUUzJfSU5GTyhyeF9hbGlnbl9jb2RlX2Vycm9ycyksCisJWEdCRV9TVEFUUzJfSU5GTyhyeF9vdmVyc2l6ZWRfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMl9JTkZPKHJ4X2phYmJlcl9mcmFtZXMpLAorCVhHQkVfU1RBVFMyX0lORk8ocnhfdW5kZXJzaXplZF9mcmFtZXMpLAorCVhHQkVfU1RBVFMyX0lORk8ocnhfZnJhZ21lbnRzKSwKKwlYR0JFX1NUQVRTMl9JTkZPKG92ZXJydW5fdHlwZTQpLAorCVhHQkVfU1RBVFMyX0lORk8ob3ZlcnJ1bl90eXBlNSksCisJWEdCRV9TVEFUUzJfSU5GTyhyeF9ieXRlcyksCisJWEdCRV9TVEFUUzJfSU5GTyh0eF9nb29kX2ZyYW1lcyksCisJWEdCRV9TVEFUUzJfSU5GTyh0eF9icm9hZGNhc3RfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMl9JTkZPKHR4X211bHRpY2FzdF9mcmFtZXMpLAorCVhHQkVfU1RBVFMyX0lORk8odHhfcGF1c2VfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMl9JTkZPKHR4X2RlZmVycmVkX2ZyYW1lcyksCisJWEdCRV9TVEFUUzJfSU5GTyh0eF9jb2xsaXNpb25fZnJhbWVzKSwKKwlYR0JFX1NUQVRTMl9JTkZPKHR4X3NpbmdsZV9jb2xsX2ZyYW1lcyksCisJWEdCRV9TVEFUUzJfSU5GTyh0eF9tdWx0X2NvbGxfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMl9JTkZPKHR4X2V4Y2Vzc2l2ZV9jb2xsaXNpb25zKSwKKwlYR0JFX1NUQVRTMl9JTkZPKHR4X2xhdGVfY29sbGlzaW9ucyksCisJWEdCRV9TVEFUUzJfSU5GTyh0eF91bmRlcnJ1biksCisJWEdCRV9TVEFUUzJfSU5GTyh0eF9jYXJyaWVyX3NlbnNlX2Vycm9ycyksCisJWEdCRV9TVEFUUzJfSU5GTyh0eF9ieXRlcyksCisJWEdCRV9TVEFUUzJfSU5GTyh0eF82NGJ5dGVfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMl9JTkZPKHR4XzY1X3RvXzEyN2J5dGVfZnJhbWVzKSwKKwlYR0JFX1NUQVRTMl9JTkZPKHR4XzEyOF90b18yNTVieXRlX2ZyYW1lcyksCisJWEdCRV9TVEFUUzJfSU5GTyh0eF8yNTZfdG9fNTExYnl0ZV9mcmFtZXMpLAorCVhHQkVfU1RBVFMyX0lORk8odHhfNTEyX3RvXzEwMjNieXRlX2ZyYW1lcyksCisJWEdCRV9TVEFUUzJfSU5GTyh0eF8xMDI0Ynl0ZV9mcmFtZXMpLAorCVhHQkVfU1RBVFMyX0lORk8obmV0X2J5dGVzKSwKKwlYR0JFX1NUQVRTMl9JTkZPKHJ4X3NvZl9vdmVycnVucyksCisJWEdCRV9TVEFUUzJfSU5GTyhyeF9tb2Zfb3ZlcnJ1bnMpLAorCVhHQkVfU1RBVFMyX0lORk8ocnhfZG1hX292ZXJydW5zKSwKIH07CiAKICNkZWZpbmUgZm9yX2VhY2hfaW50ZihpLCBwcml2KSBcCkBAIC0xMDY2LDkgKzE3OTYsMTYgQEAKIAlpZiAoIXNsYXZlLT5vcGVuKQogCQlyZXR1cm47CiAKLQlpZiAoIVNMQVZFX0xJTktfSVNfWEdNSUkoc2xhdmUpKQotCQlzZ21paV9saW5rX3N0YXRlID0gbmV0Y3Bfc2dtaWlfZ2V0X3BvcnRfbGluayhTR01JSV9CQVNFKHNwKSwKLQkJCQkJCQkgICAgIHNwKTsKKwlpZiAoIVNMQVZFX0xJTktfSVNfWEdNSUkoc2xhdmUpKSB7CisJCWlmIChnYmVfZGV2LT5zc192ZXJzaW9uID09IEdCRV9TU19WRVJTSU9OXzE0KQorCQkJc2dtaWlfbGlua19zdGF0ZSA9CisJCQkJbmV0Y3Bfc2dtaWlfZ2V0X3BvcnRfbGluayhTR01JSV9CQVNFKHNwKSwgc3ApOworCQllbHNlCisJCQlzZ21paV9saW5rX3N0YXRlID0KKwkJCQluZXRjcF9zZ21paV9nZXRfcG9ydF9saW5rKAorCQkJCQkJZ2JlX2Rldi0+c2dtaWlfcG9ydF9yZWdzLCBzcCk7CisJfQorCiAJcGh5X2xpbmtfc3RhdGUgPSBnYmVfcGh5X2xpbmtfc3RhdHVzKHNsYXZlKTsKIAlsaW5rX3N0YXRlID0gcGh5X2xpbmtfc3RhdGUgJiBzZ21paV9saW5rX3N0YXRlOwogCkBAIC0xMTM3LDYgKzE4NzQsNyBAQAogc3RhdGljIHZvaWQgZ2JlX3BvcnRfY29uZmlnKHN0cnVjdCBnYmVfcHJpdiAqZ2JlX2Rldiwgc3RydWN0IGdiZV9zbGF2ZSAqc2xhdmUsCiAJCQkgICAgaW50IG1heF9yeF9sZW4pCiB7CisJdm9pZCBfX2lvbWVtICpyeF9tYXhsZW5fcmVnOwogCXUzMiB4Z21paV9tb2RlOwogCiAJaWYgKG1heF9yeF9sZW4gPiBORVRDUF9NQVhfRlJBTUVfU0laRSkKQEAgLTExNTAsNyArMTg4OCwxMiBAQAogCQl3cml0ZWwoeGdtaWlfbW9kZSwgR0JFX1JFR19BRERSKGdiZV9kZXYsIHNzX3JlZ3MsIGNvbnRyb2wpKTsKIAl9CiAKLQl3cml0ZWwobWF4X3J4X2xlbiwgR0JFX1JFR19BRERSKHNsYXZlLCBlbWFjX3JlZ3MsIHJ4X21heGxlbikpOworCWlmIChJU19TU19JRF9NVShnYmVfZGV2KSkKKwkJcnhfbWF4bGVuX3JlZyA9IEdCRV9SRUdfQUREUihzbGF2ZSwgcG9ydF9yZWdzLCByeF9tYXhsZW4pOworCWVsc2UKKwkJcnhfbWF4bGVuX3JlZyA9IEdCRV9SRUdfQUREUihzbGF2ZSwgZW1hY19yZWdzLCByeF9tYXhsZW4pOworCisJd3JpdGVsKG1heF9yeF9sZW4sIHJ4X21heGxlbl9yZWcpOwogCXdyaXRlbChzbGF2ZS0+bWFjX2NvbnRyb2wsIEdCRV9SRUdfQUREUihzbGF2ZSwgZW1hY19yZWdzLCBtYWNfY29udHJvbCkpOwogfQogCkBAIC0xMjQyLDYgKzE5ODUsMTIgQEAKIHN0YXRpYyB2b2lkIGdiZV9pbml0X2hvc3RfcG9ydChzdHJ1Y3QgZ2JlX3ByaXYgKnByaXYpCiB7CiAJaW50IGJ5cGFzc19lbiA9IDE7CisKKwkvKiBIb3N0IFR4IFByaSAqLworCWlmIChJU19TU19JRF9OVShwcml2KSkKKwkJd3JpdGVsKEhPU1RfVFhfUFJJX01BUF9ERUZBVUxULAorCQkgICAgICAgR0JFX1JFR19BRERSKHByaXYsIGhvc3RfcG9ydF9yZWdzLCB0eF9wcmlfbWFwKSk7CisKIAkvKiBNYXggbGVuZ3RoIHJlZ2lzdGVyICovCiAJd3JpdGVsKE5FVENQX01BWF9GUkFNRV9TSVpFLCBHQkVfUkVHX0FERFIocHJpdiwgaG9zdF9wb3J0X3JlZ3MsCiAJCQkJCQkgIHJ4X21heGxlbikpOwpAQCAtMTQ3MiwxNSArMjIyMSwyMSBAQAogCQlHQkVfTUFKT1JfVkVSU0lPTihyZWcpLCBHQkVfTUlOT1JfVkVSU0lPTihyZWcpLAogCQlHQkVfUlRMX1ZFUlNJT04ocmVnKSwgR0JFX0lERU5UKHJlZykpOwogCi0JaWYgKGdiZV9kZXYtPmVuYWJsZV9hbGUpCi0JCWdiZV9pbnRmLT50eF9waXBlLmRtYV9wc2ZsYWdzID0gMDsKLQllbHNlCi0JCWdiZV9pbnRmLT50eF9waXBlLmRtYV9wc2ZsYWdzID0gcG9ydF9udW07CisJLyogRm9yIDEwRyBhbmQgb24gTmV0Q1AgMS41LCB1c2UgZGlyZWN0ZWQgdG8gcG9ydCAqLworCWlmICgoZ2JlX2Rldi0+c3NfdmVyc2lvbiA9PSBYR0JFX1NTX1ZFUlNJT05fMTApIHx8IElTX1NTX0lEX01VKGdiZV9kZXYpKQorCQlnYmVfaW50Zi0+dHhfcGlwZS5mbGFncyA9IFNXSVRDSF9UT19QT1JUX0lOX1RBR0lORk87CiAKLQlkZXZfZGJnKGdiZV9kZXYtPmRldiwgIm9wZW5lZCBUWCBjaGFubmVsICVzOiAlcCB3aXRoIHBzZmxhZ3MgJWRcbiIsCisJaWYgKGdiZV9kZXYtPmVuYWJsZV9hbGUpCisJCWdiZV9pbnRmLT50eF9waXBlLnN3aXRjaF90b19wb3J0ID0gMDsKKwllbHNlCisJCWdiZV9pbnRmLT50eF9waXBlLnN3aXRjaF90b19wb3J0ID0gcG9ydF9udW07CisKKwlkZXZfZGJnKGdiZV9kZXYtPmRldiwKKwkJIm9wZW5lZCBUWCBjaGFubmVsICVzOiAlcCB3aXRoIHRvIHBvcnQgJWQsIGZsYWdzICVkXG4iLAogCQlnYmVfaW50Zi0+dHhfcGlwZS5kbWFfY2hhbl9uYW1lLAogCQlnYmVfaW50Zi0+dHhfcGlwZS5kbWFfY2hhbm5lbCwKLQkJZ2JlX2ludGYtPnR4X3BpcGUuZG1hX3BzZmxhZ3MpOworCQlnYmVfaW50Zi0+dHhfcGlwZS5zd2l0Y2hfdG9fcG9ydCwKKwkJZ2JlX2ludGYtPnR4X3BpcGUuZmxhZ3MpOwogCiAJZ2JlX3NsYXZlX3N0b3AoZ2JlX2ludGYpOwogCkBAIC0xNDkxLDggKzIyNDYsOCBAQAogCXdyaXRlbChHQkVfQ1RMX1AwX0VOQUJMRSwgR0JFX1JFR19BRERSKGdiZV9kZXYsIHN3aXRjaF9yZWdzLCBjb250cm9sKSk7CiAKIAkvKiBBbGwgc3RhdGlzdGljcyBlbmFibGVkIGFuZCBTVEFUIEFCIHZpc2libGUgYnkgZGVmYXVsdCAqLwotCXdyaXRlbChHQkVfUkVHX1ZBTF9TVEFUX0VOQUJMRV9BTEwsIEdCRV9SRUdfQUREUihnYmVfZGV2LCBzd2l0Y2hfcmVncywKLQkJCQkJCQkgc3RhdF9wb3J0X2VuKSk7CisJd3JpdGVsKGdiZV9kZXYtPnN0YXRzX2VuX21hc2ssIEdCRV9SRUdfQUREUihnYmVfZGV2LCBzd2l0Y2hfcmVncywKKwkJCQkJCSAgICBzdGF0X3BvcnRfZW4pKTsKIAogCXJldCA9IGdiZV9zbGF2ZV9vcGVuKGdiZV9pbnRmKTsKIAlpZiAocmV0KQpAQCAtMTUyOSw2ICsyMjg0LDcgQEAKIHsKIAlpbnQgcG9ydF9yZWdfbnVtOwogCXUzMiBwb3J0X3JlZ19vZnMsIGVtYWNfcmVnX29mczsKKwl1MzIgcG9ydF9yZWdfYmxrX3N6LCBlbWFjX3JlZ19ibGtfc3o7CiAKIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIobm9kZSwgInNsYXZlLXBvcnQiLCAmc2xhdmUtPnNsYXZlX251bSkpIHsKIAkJZGV2X2VycihnYmVfZGV2LT5kZXYsICJtaXNzaW5nIHNsYXZlLXBvcnQgcGFyYW1ldGVyXG4iKTsKQEAgLTE1NjAsMjMgKzIzMTYsMjkgQEAKIAkJfSBlbHNlIHsKIAkJCXBvcnRfcmVnX29mcyA9IEdCRTEzX1NMQVZFX1BPUlRfT0ZGU0VUOwogCQl9CisJCWVtYWNfcmVnX29mcyA9IEdCRTEzX0VNQUNfT0ZGU0VUOworCQlwb3J0X3JlZ19ibGtfc3ogPSAweDMwOworCQllbWFjX3JlZ19ibGtfc3ogPSAweDQwOworCX0gZWxzZSBpZiAoSVNfU1NfSURfTVUoZ2JlX2RldikpIHsKKwkJcG9ydF9yZWdfb2ZzID0gR0JFTlVfU0xBVkVfUE9SVF9PRkZTRVQ7CisJCWVtYWNfcmVnX29mcyA9IEdCRU5VX0VNQUNfT0ZGU0VUOworCQlwb3J0X3JlZ19ibGtfc3ogPSAweDEwMDA7CisJCWVtYWNfcmVnX2Jsa19zeiA9IDB4MTAwMDsKIAl9IGVsc2UgaWYgKGdiZV9kZXYtPnNzX3ZlcnNpb24gPT0gWEdCRV9TU19WRVJTSU9OXzEwKSB7CiAJCXBvcnRfcmVnX29mcyA9IFhHQkUxMF9TTEFWRV9QT1JUX09GRlNFVDsKKwkJZW1hY19yZWdfb2ZzID0gWEdCRTEwX0VNQUNfT0ZGU0VUOworCQlwb3J0X3JlZ19ibGtfc3ogPSAweDMwOworCQllbWFjX3JlZ19ibGtfc3ogPSAweDQwOwogCX0gZWxzZSB7CiAJCWRldl9lcnIoZ2JlX2Rldi0+ZGV2LCAidW5rbm93biBldGhzcygweCV4KVxuIiwKIAkJCWdiZV9kZXYtPnNzX3ZlcnNpb24pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoZ2JlX2Rldi0+c3NfdmVyc2lvbiA9PSBHQkVfU1NfVkVSU0lPTl8xNCkKLQkJZW1hY19yZWdfb2ZzID0gR0JFMTNfRU1BQ19PRkZTRVQ7Ci0JZWxzZSBpZiAoZ2JlX2Rldi0+c3NfdmVyc2lvbiA9PSBYR0JFX1NTX1ZFUlNJT05fMTApCi0JCWVtYWNfcmVnX29mcyA9IFhHQkUxMF9FTUFDX09GRlNFVDsKLQotCXNsYXZlLT5wb3J0X3JlZ3MgPSBnYmVfZGV2LT5zc19yZWdzICsgcG9ydF9yZWdfb2ZzICsKLQkJCQkoMHgzMCAqIHBvcnRfcmVnX251bSk7Ci0Jc2xhdmUtPmVtYWNfcmVncyA9IGdiZV9kZXYtPnNzX3JlZ3MgKyBlbWFjX3JlZ19vZnMgKwotCQkJCSgweDQwICogc2xhdmUtPnNsYXZlX251bSk7CisJc2xhdmUtPnBvcnRfcmVncyA9IGdiZV9kZXYtPnN3aXRjaF9yZWdzICsgcG9ydF9yZWdfb2ZzICsKKwkJCQkocG9ydF9yZWdfYmxrX3N6ICogcG9ydF9yZWdfbnVtKTsKKwlzbGF2ZS0+ZW1hY19yZWdzID0gZ2JlX2Rldi0+c3dpdGNoX3JlZ3MgKyBlbWFjX3JlZ19vZnMgKworCQkJCShlbWFjX3JlZ19ibGtfc3ogKiBzbGF2ZS0+c2xhdmVfbnVtKTsKIAogCWlmIChnYmVfZGV2LT5zc192ZXJzaW9uID09IEdCRV9TU19WRVJTSU9OXzE0KSB7CiAJCS8qIEluaXRpYWxpemUgIHNsYXZlIHBvcnQgcmVnaXN0ZXIgb2Zmc2V0cyAqLwpAQCAtMTU5NSw2ICsyMzU3LDIzIEBACiAJCUdCRV9TRVRfUkVHX09GUyhzbGF2ZSwgZW1hY19yZWdzLCBzb2Z0X3Jlc2V0KTsKIAkJR0JFX1NFVF9SRUdfT0ZTKHNsYXZlLCBlbWFjX3JlZ3MsIHJ4X21heGxlbik7CiAKKwl9IGVsc2UgaWYgKElTX1NTX0lEX01VKGdiZV9kZXYpKSB7CisJCS8qIEluaXRpYWxpemUgIHNsYXZlIHBvcnQgcmVnaXN0ZXIgb2Zmc2V0cyAqLworCQlHQkVOVV9TRVRfUkVHX09GUyhzbGF2ZSwgcG9ydF9yZWdzLCBwb3J0X3ZsYW4pOworCQlHQkVOVV9TRVRfUkVHX09GUyhzbGF2ZSwgcG9ydF9yZWdzLCB0eF9wcmlfbWFwKTsKKwkJR0JFTlVfU0VUX1JFR19PRlMoc2xhdmUsIHBvcnRfcmVncywgc2FfbG8pOworCQlHQkVOVV9TRVRfUkVHX09GUyhzbGF2ZSwgcG9ydF9yZWdzLCBzYV9oaSk7CisJCUdCRU5VX1NFVF9SRUdfT0ZTKHNsYXZlLCBwb3J0X3JlZ3MsIHRzX2N0bCk7CisJCUdCRU5VX1NFVF9SRUdfT0ZTKHNsYXZlLCBwb3J0X3JlZ3MsIHRzX3NlcV9sdHlwZSk7CisJCUdCRU5VX1NFVF9SRUdfT0ZTKHNsYXZlLCBwb3J0X3JlZ3MsIHRzX3ZsYW4pOworCQlHQkVOVV9TRVRfUkVHX09GUyhzbGF2ZSwgcG9ydF9yZWdzLCB0c19jdGxfbHR5cGUyKTsKKwkJR0JFTlVfU0VUX1JFR19PRlMoc2xhdmUsIHBvcnRfcmVncywgdHNfY3RsMik7CisJCUdCRU5VX1NFVF9SRUdfT0ZTKHNsYXZlLCBwb3J0X3JlZ3MsIHJ4X21heGxlbik7CisKKwkJLyogSW5pdGlhbGl6ZSBFTUFDIHJlZ2lzdGVyIG9mZnNldHMgKi8KKwkJR0JFTlVfU0VUX1JFR19PRlMoc2xhdmUsIGVtYWNfcmVncywgbWFjX2NvbnRyb2wpOworCQlHQkVOVV9TRVRfUkVHX09GUyhzbGF2ZSwgZW1hY19yZWdzLCBzb2Z0X3Jlc2V0KTsKKwogCX0gZWxzZSBpZiAoZ2JlX2Rldi0+c3NfdmVyc2lvbiA9PSBYR0JFX1NTX1ZFUlNJT05fMTApIHsKIAkJLyogSW5pdGlhbGl6ZSAgc2xhdmUgcG9ydCByZWdpc3RlciBvZmZzZXRzICovCiAJCVhHQkVfU0VUX1JFR19PRlMoc2xhdmUsIHBvcnRfcmVncywgcG9ydF92bGFuKTsKQEAgLTE2NTQsNiArMjQzMyw4IEBACiAJCQltYWNfcGh5X2xpbmsgPSB0cnVlOwogCiAJCXNsYXZlLT5vcGVuID0gdHJ1ZTsKKwkJaWYgKGdiZV9kZXYtPm51bV9zbGF2ZXMgPj0gZ2JlX2Rldi0+bWF4X251bV9zbGF2ZXMpCisJCQlicmVhazsKIAl9CiAKIAkvKiBvZl9waHlfY29ubmVjdCgpIGlzIG5lZWRlZCBvbmx5IGZvciBNQUMtUEhZIGludGVyZmFjZSAqLwpAQCAtMTcyNCwyNCArMjUwNSw0MSBAQAogCXZvaWQgX19pb21lbSAqcmVnczsKIAlpbnQgcmV0LCBpOwogCi0JcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmcmVzKTsKKwlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIFhHQkVfU1NfUkVHX0lOREVYLCAmcmVzKTsKIAlpZiAocmV0KSB7Ci0JCWRldl9lcnIoZ2JlX2Rldi0+ZGV2LCAiQ2FuJ3QgdHJhbnNsYXRlIG9mIG5vZGUoJXMpIGFkZHJlc3MgZm9yIHhnYmUgc3Vic3lzdGVtIHJlZ3NcbiIsCi0JCQlub2RlLT5uYW1lKTsKKwkJZGV2X2VycihnYmVfZGV2LT5kZXYsCisJCQkiQ2FuJ3QgeGxhdGUgeGdiZSBvZiBub2RlKCVzKSBzcyBhZGRyZXNzIGF0ICVkXG4iLAorCQkJbm9kZS0+bmFtZSwgWEdCRV9TU19SRUdfSU5ERVgpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZ2JlX2Rldi0+ZGV2LCAmcmVzKTsKIAlpZiAoSVNfRVJSKHJlZ3MpKSB7Ci0JCWRldl9lcnIoZ2JlX2Rldi0+ZGV2LCAiRmFpbGVkIHRvIG1hcCB4Z2JlIHJlZ2lzdGVyIGJhc2VcbiIpOworCQlkZXZfZXJyKGdiZV9kZXYtPmRldiwgIkZhaWxlZCB0byBtYXAgeGdiZSBzcyByZWdpc3RlciBiYXNlXG4iKTsKIAkJcmV0dXJuIFBUUl9FUlIocmVncyk7CiAJfQogCWdiZV9kZXYtPnNzX3JlZ3MgPSByZWdzOwogCisJcmV0ID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCBYR0JFX1NNX1JFR19JTkRFWCwgJnJlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdiZV9kZXYtPmRldiwKKwkJCSJDYW4ndCB4bGF0ZSB4Z2JlIG9mIG5vZGUoJXMpIHNtIGFkZHJlc3MgYXQgJWRcbiIsCisJCQlub2RlLT5uYW1lLCBYR0JFX1NNX1JFR19JTkRFWCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShnYmVfZGV2LT5kZXYsICZyZXMpOworCWlmIChJU19FUlIocmVncykpIHsKKwkJZGV2X2VycihnYmVfZGV2LT5kZXYsICJGYWlsZWQgdG8gbWFwIHhnYmUgc20gcmVnaXN0ZXIgYmFzZVxuIik7CisJCXJldHVybiBQVFJfRVJSKHJlZ3MpOworCX0KKwlnYmVfZGV2LT5zd2l0Y2hfcmVncyA9IHJlZ3M7CisKIAlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIFhHQkVfU0VSREVTX1JFR19JTkRFWCwgJnJlcyk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKGdiZV9kZXYtPmRldiwgIkNhbid0IHRyYW5zbGF0ZSBvZiBub2RlKCVzKSBhZGRyZXNzIGZvciB4Z2JlIHNlcmRlcyByZWdzXG4iLAotCQkJbm9kZS0+bmFtZSk7CisJCWRldl9lcnIoZ2JlX2Rldi0+ZGV2LAorCQkJIkNhbid0IHhsYXRlIHhnYmUgc2VyZGVzIG9mIG5vZGUoJXMpIGFkZHJlc3MgYXQgJWRcbiIsCisJCQlub2RlLT5uYW1lLCBYR0JFX1NFUkRFU19SRUdfSU5ERVgpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTc1Myw5ICsyNTUxLDkgQEAKIAlnYmVfZGV2LT54Z2JlX3NlcmRlc19yZWdzID0gcmVnczsKIAogCWdiZV9kZXYtPmh3X3N0YXRzID0gZGV2bV9remFsbG9jKGdiZV9kZXYtPmRldiwKLQkJCQkJICBYR0JFMTBfTlVNX1NUQVRfRU5UUklFUyAqCi0JCQkJCSAgKFhHQkUxMF9OVU1fU0xBVkVTICsgMSkgKiBzaXplb2YodTY0KSwKLQkJCQkJICBHRlBfS0VSTkVMKTsKKwkJCQkgIFhHQkUxMF9OVU1fU1RBVF9FTlRSSUVTICoKKwkJCQkgIChnYmVfZGV2LT5tYXhfbnVtX3BvcnRzKSAqIHNpemVvZih1NjQpLAorCQkJCSAgR0ZQX0tFUk5FTCk7CiAJaWYgKCFnYmVfZGV2LT5od19zdGF0cykgewogCQlkZXZfZXJyKGdiZV9kZXYtPmRldiwgImh3X3N0YXRzIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTc2NCwxOSArMjU2MiwxOSBAQAogCWdiZV9kZXYtPnNzX3ZlcnNpb24gPSBYR0JFX1NTX1ZFUlNJT05fMTA7CiAJZ2JlX2Rldi0+c2dtaWlfcG9ydF9yZWdzID0gZ2JlX2Rldi0+c3NfcmVncyArCiAJCQkJCVhHQkUxMF9TR01JSV9NT0RVTEVfT0ZGU0VUOwotCWdiZV9kZXYtPnN3aXRjaF9yZWdzID0gZ2JlX2Rldi0+c3NfcmVncyArIFhHQkUxMF9TV0lUQ0hfTU9EVUxFX09GRlNFVDsKIAlnYmVfZGV2LT5ob3N0X3BvcnRfcmVncyA9IGdiZV9kZXYtPnNzX3JlZ3MgKyBYR0JFMTBfSE9TVF9QT1JUX09GRlNFVDsKIAotCWZvciAoaSA9IDA7IGkgPCBYR0JFMTBfTlVNX0hXX1NUQVRTX01PRDsgaSsrKQotCQlnYmVfZGV2LT5od19zdGF0c19yZWdzW2ldID0gZ2JlX2Rldi0+c3NfcmVncyArCisJZm9yIChpID0gMDsgaSA8IGdiZV9kZXYtPm1heF9udW1fcG9ydHM7IGkrKykKKwkJZ2JlX2Rldi0+aHdfc3RhdHNfcmVnc1tpXSA9IGdiZV9kZXYtPnN3aXRjaF9yZWdzICsKIAkJCVhHQkUxMF9IV19TVEFUU19PRkZTRVQgKyAoR0JFX0hXX1NUQVRTX1JFR19NQVBfU1ogKiBpKTsKIAotCWdiZV9kZXYtPmFsZV9yZWcgPSBnYmVfZGV2LT5zc19yZWdzICsgWEdCRTEwX0FMRV9PRkZTRVQ7Ci0JZ2JlX2Rldi0+YWxlX3BvcnRzID0gWEdCRTEwX05VTV9BTEVfUE9SVFM7CisJZ2JlX2Rldi0+YWxlX3JlZyA9IGdiZV9kZXYtPnN3aXRjaF9yZWdzICsgWEdCRTEwX0FMRV9PRkZTRVQ7CisJZ2JlX2Rldi0+YWxlX3BvcnRzID0gZ2JlX2Rldi0+bWF4X251bV9wb3J0czsKIAlnYmVfZGV2LT5ob3N0X3BvcnQgPSBYR0JFMTBfSE9TVF9QT1JUX05VTTsKIAlnYmVfZGV2LT5hbGVfZW50cmllcyA9IFhHQkUxMF9OVU1fQUxFX0VOVFJJRVM7CiAJZ2JlX2Rldi0+ZXRfc3RhdHMgPSB4Z2JlMTBfZXRfc3RhdHM7CiAJZ2JlX2Rldi0+bnVtX2V0X3N0YXRzID0gQVJSQVlfU0laRSh4Z2JlMTBfZXRfc3RhdHMpOworCWdiZV9kZXYtPnN0YXRzX2VuX21hc2sgPSAoMSA8PCAoZ2JlX2Rldi0+bWF4X251bV9wb3J0cykpIC0gMTsKIAogCS8qIFN1YnN5c3RlbSByZWdpc3RlcnMgKi8KIAlYR0JFX1NFVF9SRUdfT0ZTKGdiZV9kZXYsIHNzX3JlZ3MsIGlkX3Zlcik7CkBAIC0xODAzLDEwICsyNjAxLDExIEBACiAJdm9pZCBfX2lvbWVtICpyZWdzOwogCWludCByZXQ7CiAKLQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIDAsICZyZXMpOworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uobm9kZSwgR0JFX1NTX1JFR19JTkRFWCwgJnJlcyk7CiAJaWYgKHJldCkgewotCQlkZXZfZXJyKGdiZV9kZXYtPmRldiwgIkNhbid0IHRyYW5zbGF0ZSBvZiBub2RlKCVzKSBhZGRyZXNzXG4iLAotCQkJbm9kZS0+bmFtZSk7CisJCWRldl9lcnIoZ2JlX2Rldi0+ZGV2LAorCQkJIkNhbid0IHRyYW5zbGF0ZSBvZiBub2RlKCVzKSBvZiBnYmUgc3MgYWRkcmVzcyBhdCAlZFxuIiwKKwkJCW5vZGUtPm5hbWUsIEdCRV9TU19SRUdfSU5ERVgpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTgyMywzNCArMjYyMiw2NyBAQAogc3RhdGljIGludCBzZXRfZ2JlX2V0aHNzMTRfcHJpdihzdHJ1Y3QgZ2JlX3ByaXYgKmdiZV9kZXYsCiAJCQkJc3RydWN0IGRldmljZV9ub2RlICpub2RlKQogeworCXN0cnVjdCByZXNvdXJjZSByZXM7CiAJdm9pZCBfX2lvbWVtICpyZWdzOwotCWludCBpOworCWludCBpLCByZXQ7CisKKwlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIEdCRV9TR01JSTM0X1JFR19JTkRFWCwgJnJlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdiZV9kZXYtPmRldiwKKwkJCSJDYW4ndCB0cmFuc2xhdGUgb2YgZ2JlIG5vZGUoJXMpIGFkZHJlc3MgYXQgaW5kZXggJWRcbiIsCisJCQlub2RlLT5uYW1lLCBHQkVfU0dNSUkzNF9SRUdfSU5ERVgpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZ2JlX2Rldi0+ZGV2LCAmcmVzKTsKKwlpZiAoSVNfRVJSKHJlZ3MpKSB7CisJCWRldl9lcnIoZ2JlX2Rldi0+ZGV2LAorCQkJIkZhaWxlZCB0byBtYXAgZ2JlIHNnbWlpIHBvcnQzNCByZWdpc3RlciBiYXNlXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocmVncyk7CisJfQorCWdiZV9kZXYtPnNnbWlpX3BvcnQzNF9yZWdzID0gcmVnczsKKworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2Uobm9kZSwgR0JFX1NNX1JFR19JTkRFWCwgJnJlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdiZV9kZXYtPmRldiwKKwkJCSJDYW4ndCB0cmFuc2xhdGUgb2YgZ2JlIG5vZGUoJXMpIGFkZHJlc3MgYXQgaW5kZXggJWRcbiIsCisJCQlub2RlLT5uYW1lLCBHQkVfU01fUkVHX0lOREVYKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGdiZV9kZXYtPmRldiwgJnJlcyk7CisJaWYgKElTX0VSUihyZWdzKSkgeworCQlkZXZfZXJyKGdiZV9kZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gbWFwIGdiZSBzd2l0Y2ggbW9kdWxlIHJlZ2lzdGVyIGJhc2VcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyZWdzKTsKKwl9CisJZ2JlX2Rldi0+c3dpdGNoX3JlZ3MgPSByZWdzOwogCiAJZ2JlX2Rldi0+aHdfc3RhdHMgPSBkZXZtX2t6YWxsb2MoZ2JlX2Rldi0+ZGV2LAogCQkJCQkgIEdCRTEzX05VTV9IV19TVEFUX0VOVFJJRVMgKgotCQkJCQkgIEdCRTEzX05VTV9TTEFWRVMgKiBzaXplb2YodTY0KSwKKwkJCQkJICBnYmVfZGV2LT5tYXhfbnVtX3NsYXZlcyAqIHNpemVvZih1NjQpLAogCQkJCQkgIEdGUF9LRVJORUwpOwogCWlmICghZ2JlX2Rldi0+aHdfc3RhdHMpIHsKIAkJZGV2X2VycihnYmVfZGV2LT5kZXYsICJod19zdGF0cyBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZWdzID0gZ2JlX2Rldi0+c3NfcmVnczsKLQlnYmVfZGV2LT5zZ21paV9wb3J0X3JlZ3MgPSByZWdzICsgR0JFMTNfU0dNSUlfTU9EVUxFX09GRlNFVDsKLQlnYmVfZGV2LT5zZ21paV9wb3J0MzRfcmVncyA9IHJlZ3MgKyBHQkUxM19TR01JSTM0X01PRFVMRV9PRkZTRVQ7Ci0JZ2JlX2Rldi0+c3dpdGNoX3JlZ3MgPSByZWdzICsgR0JFMTNfU1dJVENIX01PRFVMRV9PRkZTRVQ7Ci0JZ2JlX2Rldi0+aG9zdF9wb3J0X3JlZ3MgPSByZWdzICsgR0JFMTNfSE9TVF9QT1JUX09GRlNFVDsKKwlnYmVfZGV2LT5zZ21paV9wb3J0X3JlZ3MgPSBnYmVfZGV2LT5zc19yZWdzICsgR0JFMTNfU0dNSUlfTU9EVUxFX09GRlNFVDsKKwlnYmVfZGV2LT5ob3N0X3BvcnRfcmVncyA9IGdiZV9kZXYtPnN3aXRjaF9yZWdzICsgR0JFMTNfSE9TVF9QT1JUX09GRlNFVDsKIAotCWZvciAoaSA9IDA7IGkgPCBHQkUxM19OVU1fSFdfU1RBVFNfTU9EOyBpKyspCi0JCWdiZV9kZXYtPmh3X3N0YXRzX3JlZ3NbaV0gPSByZWdzICsgR0JFMTNfSFdfU1RBVFNfT0ZGU0VUICsKLQkJCQkoR0JFX0hXX1NUQVRTX1JFR19NQVBfU1ogKiBpKTsKKwlmb3IgKGkgPSAwOyBpIDwgZ2JlX2Rldi0+bWF4X251bV9zbGF2ZXM7IGkrKykgeworCQlnYmVfZGV2LT5od19zdGF0c19yZWdzW2ldID0KKwkJCWdiZV9kZXYtPnN3aXRjaF9yZWdzICsgR0JFMTNfSFdfU1RBVFNfT0ZGU0VUICsKKwkJCShHQkVfSFdfU1RBVFNfUkVHX01BUF9TWiAqIGkpOworCX0KIAotCWdiZV9kZXYtPmFsZV9yZWcgPSByZWdzICsgR0JFMTNfQUxFX09GRlNFVDsKLQlnYmVfZGV2LT5hbGVfcG9ydHMgPSBHQkUxM19OVU1fQUxFX1BPUlRTOworCWdiZV9kZXYtPmFsZV9yZWcgPSBnYmVfZGV2LT5zd2l0Y2hfcmVncyArIEdCRTEzX0FMRV9PRkZTRVQ7CisJZ2JlX2Rldi0+YWxlX3BvcnRzID0gZ2JlX2Rldi0+bWF4X251bV9wb3J0czsKIAlnYmVfZGV2LT5ob3N0X3BvcnQgPSBHQkUxM19IT1NUX1BPUlRfTlVNOwogCWdiZV9kZXYtPmFsZV9lbnRyaWVzID0gR0JFMTNfTlVNX0FMRV9FTlRSSUVTOwogCWdiZV9kZXYtPmV0X3N0YXRzID0gZ2JlMTNfZXRfc3RhdHM7CiAJZ2JlX2Rldi0+bnVtX2V0X3N0YXRzID0gQVJSQVlfU0laRShnYmUxM19ldF9zdGF0cyk7CisJZ2JlX2Rldi0+c3RhdHNfZW5fbWFzayA9IEdCRTEzX1JFR19WQUxfU1RBVF9FTkFCTEVfQUxMOwogCiAJLyogU3Vic3lzdGVtIHJlZ2lzdGVycyAqLwogCUdCRV9TRVRfUkVHX09GUyhnYmVfZGV2LCBzc19yZWdzLCBpZF92ZXIpOwpAQCAtMTg2OSw2ICsyNzAxLDgwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgc2V0X2diZW51X2V0aHNzX3ByaXYoc3RydWN0IGdiZV9wcml2ICpnYmVfZGV2LAorCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCXZvaWQgX19pb21lbSAqcmVnczsKKwlpbnQgaSwgcmV0OworCisJZ2JlX2Rldi0+aHdfc3RhdHMgPSBkZXZtX2t6YWxsb2MoZ2JlX2Rldi0+ZGV2LAorCQkJCSAgR0JFTlVfTlVNX0hXX1NUQVRfRU5UUklFUyAqCisJCQkJICAoZ2JlX2Rldi0+bWF4X251bV9wb3J0cykgKiBzaXplb2YodTY0KSwKKwkJCQkgIEdGUF9LRVJORUwpOworCWlmICghZ2JlX2Rldi0+aHdfc3RhdHMpIHsKKwkJZGV2X2VycihnYmVfZGV2LT5kZXYsICJod19zdGF0cyBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5vZGUsIEdCRU5VX1NNX1JFR19JTkRFWCwgJnJlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdiZV9kZXYtPmRldiwKKwkJCSJDYW4ndCB0cmFuc2xhdGUgb2YgZ2JlbnUgbm9kZSglcykgYWRkciBhdCBpbmRleCAlZFxuIiwKKwkJCW5vZGUtPm5hbWUsIEdCRU5VX1NNX1JFR19JTkRFWCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShnYmVfZGV2LT5kZXYsICZyZXMpOworCWlmIChJU19FUlIocmVncykpIHsKKwkJZGV2X2VycihnYmVfZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIG1hcCBnYmVudSBzd2l0Y2ggbW9kdWxlIHJlZ2lzdGVyIGJhc2VcbiIpOworCQlyZXR1cm4gUFRSX0VSUihyZWdzKTsKKwl9CisJZ2JlX2Rldi0+c3dpdGNoX3JlZ3MgPSByZWdzOworCisJZ2JlX2Rldi0+c2dtaWlfcG9ydF9yZWdzID0gZ2JlX2Rldi0+c3NfcmVncyArIEdCRU5VX1NHTUlJX01PRFVMRV9PRkZTRVQ7CisJZ2JlX2Rldi0+aG9zdF9wb3J0X3JlZ3MgPSBnYmVfZGV2LT5zd2l0Y2hfcmVncyArIEdCRU5VX0hPU1RfUE9SVF9PRkZTRVQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgKGdiZV9kZXYtPm1heF9udW1fcG9ydHMpOyBpKyspCisJCWdiZV9kZXYtPmh3X3N0YXRzX3JlZ3NbaV0gPSBnYmVfZGV2LT5zd2l0Y2hfcmVncyArCisJCQlHQkVOVV9IV19TVEFUU19PRkZTRVQgKyAoR0JFTlVfSFdfU1RBVFNfUkVHX01BUF9TWiAqIGkpOworCisJZ2JlX2Rldi0+YWxlX3JlZyA9IGdiZV9kZXYtPnN3aXRjaF9yZWdzICsgR0JFTlVfQUxFX09GRlNFVDsKKwlnYmVfZGV2LT5hbGVfcG9ydHMgPSBnYmVfZGV2LT5tYXhfbnVtX3BvcnRzOworCWdiZV9kZXYtPmhvc3RfcG9ydCA9IEdCRU5VX0hPU1RfUE9SVF9OVU07CisJZ2JlX2Rldi0+YWxlX2VudHJpZXMgPSBHQkUxM19OVU1fQUxFX0VOVFJJRVM7CisJZ2JlX2Rldi0+ZXRfc3RhdHMgPSBnYmVudV9ldF9zdGF0czsKKwlnYmVfZGV2LT5zdGF0c19lbl9tYXNrID0gKDEgPDwgKGdiZV9kZXYtPm1heF9udW1fcG9ydHMpKSAtIDE7CisKKwlpZiAoSVNfU1NfSURfTlUoZ2JlX2RldikpCisJCWdiZV9kZXYtPm51bV9ldF9zdGF0cyA9IEdCRU5VX0VUX1NUQVRTX0hPU1RfU0laRSArCisJCQkoZ2JlX2Rldi0+bWF4X251bV9zbGF2ZXMgKiBHQkVOVV9FVF9TVEFUU19QT1JUX1NJWkUpOworCWVsc2UKKwkJZ2JlX2Rldi0+bnVtX2V0X3N0YXRzID0gR0JFTlVfRVRfU1RBVFNfSE9TVF9TSVpFICsKKwkJCQkJR0JFTlVfRVRfU1RBVFNfUE9SVF9TSVpFOworCisJLyogU3Vic3lzdGVtIHJlZ2lzdGVycyAqLworCUdCRU5VX1NFVF9SRUdfT0ZTKGdiZV9kZXYsIHNzX3JlZ3MsIGlkX3Zlcik7CisKKwkvKiBTd2l0Y2ggbW9kdWxlIHJlZ2lzdGVycyAqLworCUdCRU5VX1NFVF9SRUdfT0ZTKGdiZV9kZXYsIHN3aXRjaF9yZWdzLCBpZF92ZXIpOworCUdCRU5VX1NFVF9SRUdfT0ZTKGdiZV9kZXYsIHN3aXRjaF9yZWdzLCBjb250cm9sKTsKKwlHQkVOVV9TRVRfUkVHX09GUyhnYmVfZGV2LCBzd2l0Y2hfcmVncywgc3RhdF9wb3J0X2VuKTsKKwlHQkVOVV9TRVRfUkVHX09GUyhnYmVfZGV2LCBzd2l0Y2hfcmVncywgcHR5cGUpOworCisJLyogSG9zdCBwb3J0IHJlZ2lzdGVycyAqLworCUdCRU5VX1NFVF9SRUdfT0ZTKGdiZV9kZXYsIGhvc3RfcG9ydF9yZWdzLCBwb3J0X3ZsYW4pOworCUdCRU5VX1NFVF9SRUdfT0ZTKGdiZV9kZXYsIGhvc3RfcG9ydF9yZWdzLCByeF9tYXhsZW4pOworCisJLyogRm9yIE5VIG9ubHkuICAyVSBkb2VzIG5vdCBuZWVkIHR4X3ByaV9tYXAuCisJICogTlUgY3BwaSBwb3J0IDAgdHggcGt0IHN0cmVhbWluZyBpbnRlcmZhY2UgaGFzIChuLTEpKjggZWdyZXNzIHRocmVhZHMKKwkgKiB3aGlsZSAyVSBoYXMgb25seSAxIHN1Y2ggdGhyZWFkCisJICovCisJR0JFTlVfU0VUX1JFR19PRlMoZ2JlX2RldiwgaG9zdF9wb3J0X3JlZ3MsIHR4X3ByaV9tYXApOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGdiZV9wcm9iZShzdHJ1Y3QgbmV0Y3BfZGV2aWNlICpuZXRjcF9kZXZpY2UsIHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHZvaWQgKippbnN0X3ByaXYpCiB7CkBAIC0xODg4LDYgKzI3OTQsMjEgQEAKIAlpZiAoIWdiZV9kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJ0aSxuZXRjcC1nYmUtNSIpIHx8CisJICAgIG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJ0aSxuZXRjcC1nYmUiKSkgeworCQlnYmVfZGV2LT5tYXhfbnVtX3NsYXZlcyA9IDQ7CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAidGksbmV0Y3AtZ2JlLTkiKSkgeworCQlnYmVfZGV2LT5tYXhfbnVtX3NsYXZlcyA9IDg7CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAidGksbmV0Y3AtZ2JlLTIiKSkgeworCQlnYmVfZGV2LT5tYXhfbnVtX3NsYXZlcyA9IDE7CisJfSBlbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShub2RlLCAidGksbmV0Y3AteGdiZSIpKSB7CisJCWdiZV9kZXYtPm1heF9udW1fc2xhdmVzID0gMjsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGRldiwgImRldmljZSB0cmVlIG5vZGUgZm9yIHVua25vd24gZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWdiZV9kZXYtPm1heF9udW1fcG9ydHMgPSBnYmVfZGV2LT5tYXhfbnVtX3NsYXZlcyArIDE7CisKIAlnYmVfZGV2LT5kZXYgPSBkZXY7CiAJZ2JlX2Rldi0+bmV0Y3BfZGV2aWNlID0gbmV0Y3BfZGV2aWNlOwogCWdiZV9kZXYtPnJ4X3BhY2tldF9tYXggPSBORVRDUF9NQVhfRlJBTUVfU0laRTsKQEAgLTE5MjMsNyArMjg0NCwxNSBAQAogCQlpZiAocmV0KQogCQkJZ290byBxdWl0OwogCi0JCXJldCA9IHNldF9nYmVfZXRoc3MxNF9wcml2KGdiZV9kZXYsIG5vZGUpOworCQlkZXZfZGJnKGRldiwgInNzX3ZlcnNpb246IDB4JTA4eFxuIiwgZ2JlX2Rldi0+c3NfdmVyc2lvbik7CisKKwkJaWYgKGdiZV9kZXYtPnNzX3ZlcnNpb24gPT0gR0JFX1NTX1ZFUlNJT05fMTQpCisJCQlyZXQgPSBzZXRfZ2JlX2V0aHNzMTRfcHJpdihnYmVfZGV2LCBub2RlKTsKKwkJZWxzZSBpZiAoSVNfU1NfSURfTVUoZ2JlX2RldikpCisJCQlyZXQgPSBzZXRfZ2JlbnVfZXRoc3NfcHJpdihnYmVfZGV2LCBub2RlKTsKKwkJZWxzZQorCQkJcmV0ID0gLUVOT0RFVjsKKwogCQlpZiAocmV0KQogCQkJZ290byBxdWl0OwogCX0gZWxzZSBpZiAoIXN0cmNtcChub2RlLT5uYW1lLCAieGdiZSIpKSB7CkBAIC0xOTYzLDYgKzI4OTIsOCBAQAogCQkJY29udGludWU7CiAJCX0KIAkJZ2JlX2Rldi0+bnVtX3NsYXZlcysrOworCQlpZiAoZ2JlX2Rldi0+bnVtX3NsYXZlcyA+PSBnYmVfZGV2LT5tYXhfbnVtX3NsYXZlcykKKwkJCWJyZWFrOwogCX0KIAogCWlmICghZ2JlX2Rldi0+bnVtX3NsYXZlcykKQEAgLTE5NzEsNyArMjkwMiw3IEBACiAJLyogSW5pdGlhbGl6ZSBTZWNvbmRhcnkgc2xhdmUgcG9ydHMgKi8KIAlzZWNvbmRhcnlfcG9ydHMgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShub2RlLCAic2Vjb25kYXJ5LXNsYXZlLXBvcnRzIik7CiAJSU5JVF9MSVNUX0hFQUQoJmdiZV9kZXYtPnNlY29uZGFyeV9zbGF2ZXMpOwotCWlmIChzZWNvbmRhcnlfcG9ydHMpCisJaWYgKHNlY29uZGFyeV9wb3J0cyAmJiAoZ2JlX2Rldi0+bnVtX3NsYXZlcyA8ICBnYmVfZGV2LT5tYXhfbnVtX3NsYXZlcykpCiAJCWluaXRfc2Vjb25kYXJ5X3BvcnRzKGdiZV9kZXYsIHNlY29uZGFyeV9wb3J0cyk7CiAJb2Zfbm9kZV9wdXQoc2Vjb25kYXJ5X3BvcnRzKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGlsZS90aWxlZ3guYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpbGUvdGlsZWd4LmMKaW5kZXggYmVhOGNkMi4uYTc4OWEyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGlsZS90aWxlZ3guYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aWxlL3RpbGVneC5jCkBAIC04MzgsNyArODM4LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHB0cF9tcGlwZV9nZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorc3RhdGljIGludCBwdHBfbXBpcGVfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKKwkJCSAgICAgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBtcGlwZV9kYXRhICptZCA9IGNvbnRhaW5lcl9vZihwdHAsIHN0cnVjdCBtcGlwZV9kYXRhLCBjYXBzKTsKQEAgLTg1MCw3ICs4NTEsNyBAQAogfQogCiBzdGF0aWMgaW50IHB0cF9tcGlwZV9zZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorCQkJICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IG1waXBlX2RhdGEgKm1kID0gY29udGFpbmVyX29mKHB0cCwgc3RydWN0IG1waXBlX2RhdGEsIGNhcHMpOwpAQCAtODc2LDggKzg3Nyw4IEBACiAJLnBwcwkJPSAwLAogCS5hZGpmcmVxCT0gcHRwX21waXBlX2FkamZyZXEsCiAJLmFkanRpbWUJPSBwdHBfbXBpcGVfYWRqdGltZSwKLQkuZ2V0dGltZQk9IHB0cF9tcGlwZV9nZXR0aW1lLAotCS5zZXR0aW1lCT0gcHRwX21waXBlX3NldHRpbWUsCisJLmdldHRpbWU2NAk9IHB0cF9tcGlwZV9nZXR0aW1lLAorCS5zZXR0aW1lNjQJPSBwdHBfbXBpcGVfc2V0dGltZSwKIAkuZW5hYmxlCQk9IHB0cF9tcGlwZV9lbmFibGUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90b3NoaWJhL0tjb25maWcgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90b3NoaWJhL0tjb25maWcKaW5kZXggNzRhY2I1Yy4uNWQyNDRiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvS2NvbmZpZwpAQCAtNSw3ICs1LDcgQEAKIGNvbmZpZyBORVRfVkVORE9SX1RPU0hJQkEKIAlib29sICJUb3NoaWJhIGRldmljZXMiCiAJZGVmYXVsdCB5Ci0JZGVwZW5kcyBvbiBQQ0kgJiYgKFBQQ19JQk1fQ0VMTF9CTEFERSB8fCBQUENfQ0VMTEVCIHx8IE1JUFMpIHx8IFBQQ19QUzMKKwlkZXBlbmRzIG9uIFBDSSAmJiAoUFBDX0lCTV9DRUxMX0JMQURFIHx8IE1JUFMpIHx8IFBQQ19QUzMKIAktLS1oZWxwLS0tCiAJICBJZiB5b3UgaGF2ZSBhIG5ldHdvcmsgKEV0aGVybmV0KSBjYXJkIGJlbG9uZ2luZyB0byB0aGlzIGNsYXNzLCBzYXkgWQogCSAgYW5kIHJlYWQgdGhlIEV0aGVybmV0LUhPV1RPLCBhdmFpbGFibGUgZnJvbQpAQCAtNDIsNyArNDIsNyBAQAogCiBjb25maWcgU1BJREVSX05FVAogCXRyaXN0YXRlICJTcGlkZXIgR2lnYWJpdCBFdGhlcm5ldCBkcml2ZXIiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgKFBQQ19JQk1fQ0VMTF9CTEFERSB8fCBQUENfQ0VMTEVCKQorCWRlcGVuZHMgb24gUENJICYmIFBQQ19JQk1fQ0VMTF9CTEFERQogCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgU1VOR0VNX1BIWQogCS0tLWhlbHAtLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmMKaW5kZXggYmI3OTkyOC4uYWM2MmE1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmMKQEAgLTEwNjUsNyArMTA2NSw3IEBACiAKIAkvKgogCSAqIHRoaXMgY2FsbCBjYW4gZmFpbCwgYnV0IGZvciBub3csIGp1c3QgbGVhdmUgdGhpcwotCSAqIGRlY3JpcHRvciB3aXRob3V0IHNrYgorCSAqIGRlc2NyaXB0b3Igd2l0aG91dCBza2IKIAkgKi8KIAlnZWxpY19kZXNjcl9wcmVwYXJlX3J4KGNhcmQsIGRlc2NyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfd2lyZWxlc3MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX3dpcmVsZXNzLmMKaW5kZXggMGE3ZjJlNy4uMTMyMTRhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfd2lyZWxlc3MuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90b3NoaWJhL3BzM19nZWxpY193aXJlbGVzcy5jCkBAIC0xMTY3LDcgKzExNjcsNyBAQAogCX0gZWxzZSB7CiAJCXByX2RlYnVnKCIlczogY2xlYXIgYnNzaWRcbiIsIF9fZnVuY19fKTsKIAkJY2xlYXJfYml0KEdFTElDX1dMX1NUQVRfQlNTSURfU0VULCAmd2wtPnN0YXQpOwotCQltZW1zZXQod2wtPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIod2wtPmJzc2lkKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPmxvY2ssIGlycWZsYWcpOwogCXByX2RlYnVnKCIlczogLT5cbiIsIF9fZnVuY19fKTsKQEAgLTExODksNyArMTE4OSw3IEBACiAJCW1lbWNweShkYXRhLT5hcF9hZGRyLnNhX2RhdGEsIHdsLT5hY3RpdmVfYnNzaWQsCiAJCSAgICAgICBFVEhfQUxFTik7CiAJfSBlbHNlCi0JCW1lbXNldChkYXRhLT5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcihkYXRhLT5hcF9hZGRyLnNhX2RhdGEpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPmxvY2ssIGlycWZsYWcpOwogCW11dGV4X3VubG9jaygmd2wtPmFzc29jX3N0YXRfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXJoaW5lLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXJoaW5lLmMKaW5kZXggMTdlMjc2Ni4uZGUyODUwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS1yaGluZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3ZpYS92aWEtcmhpbmUuYwpAQCAtNzAsMTIgKzcwLDE0IEBACiAvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNldCBhdCBjb21waWxlIHRpbWUuICovCiAKIC8qIEtlZXAgdGhlIHJpbmcgc2l6ZXMgYSBwb3dlciBvZiB0d28gZm9yIGNvbXBpbGUgZWZmaWNpZW5jeS4KLSAgIFRoZSBjb21waWxlciB3aWxsIGNvbnZlcnQgPHVuc2lnbmVkPiclJzwyXk4+IGludG8gYSBiaXQgbWFzay4KLSAgIE1ha2luZyB0aGUgVHggcmluZyB0b28gbGFyZ2UgZGVjcmVhc2VzIHRoZSBlZmZlY3RpdmVuZXNzIG9mIGNoYW5uZWwKLSAgIGJvbmRpbmcgYW5kIHBhY2tldCBwcmlvcml0eS4KLSAgIFRoZXJlIGFyZSBubyBpbGwgZWZmZWN0cyBmcm9tIHRvby1sYXJnZSByZWNlaXZlIHJpbmdzLiAqLwotI2RlZmluZSBUWF9SSU5HX1NJWkUJMTYKLSNkZWZpbmUgVFhfUVVFVUVfTEVOCTEwCS8qIExpbWl0IHJpbmcgZW50cmllcyBhY3R1YWxseSB1c2VkLiAqLworICogVGhlIGNvbXBpbGVyIHdpbGwgY29udmVydCA8dW5zaWduZWQ+JyUnPDJeTj4gaW50byBhIGJpdCBtYXNrLgorICogTWFraW5nIHRoZSBUeCByaW5nIHRvbyBsYXJnZSBkZWNyZWFzZXMgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgY2hhbm5lbAorICogYm9uZGluZyBhbmQgcGFja2V0IHByaW9yaXR5LgorICogV2l0aCBCUUwgc3VwcG9ydCwgd2UgY2FuIGluY3JlYXNlIFRYIHJpbmcgc2FmZWx5LgorICogVGhlcmUgYXJlIG5vIGlsbCBlZmZlY3RzIGZyb20gdG9vLWxhcmdlIHJlY2VpdmUgcmluZ3MuCisgKi8KKyNkZWZpbmUgVFhfUklOR19TSVpFCTY0CisjZGVmaW5lIFRYX1FVRVVFX0xFTgkoVFhfUklOR19TSVpFIC0gNikJLyogTGltaXQgcmluZyBlbnRyaWVzIGFjdHVhbGx5IHVzZWQuICovCiAjZGVmaW5lIFJYX1JJTkdfU0laRQk2NAogCiAvKiBPcGVyYXRpb25hbCBwYXJhbWV0ZXJzIHRoYXQgdXN1YWxseSBhcmUgbm90IGNoYW5nZWQuICovCkBAIC0yODYsNyArMjg4LDcgQEAKICAqIFRoZSAuZGF0YSBmaWVsZCBpcyBjdXJyZW50bHkgb25seSB1c2VkIHRvIHN0b3JlIHF1aXJrcwogICovCiBzdGF0aWMgdTMyIHZ0ODUwMF9xdWlya3MgPSBycVdPTCB8IHJxRm9yY2VSZXNldCB8IHJxNnBhdHRlcm5zOwotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcmhpbmVfb2ZfdGJsW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByaGluZV9vZl90YmxbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInZpYSx2dDg1MDAtcmhpbmUiLCAuZGF0YSA9ICZ2dDg1MDBfcXVpcmtzIH0sCiAJeyB9CS8qIHRlcm1pbmF0ZSBsaXN0ICovCiB9OwpAQCAtMTI5NSw2ICsxMjk3LDcgQEAKIAl9CiAJcnAtPnR4X3JpbmdbaS0xXS5uZXh0X2Rlc2MgPSBjcHVfdG9fbGUzMihycC0+dHhfcmluZ19kbWEpOwogCisJbmV0ZGV2X3Jlc2V0X3F1ZXVlKGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGZyZWVfdGJ1ZnMoc3RydWN0IG5ldF9kZXZpY2UqIGRldikKQEAgLTE3OTUsNiArMTc5OCw3IEBACiAJZWxzZQogCQlycC0+dHhfcmluZ1tlbnRyeV0udHhfc3RhdHVzID0gMDsKIAorCW5ldGRldl9zZW50X3F1ZXVlKGRldiwgc2tiLT5sZW4pOwogCS8qIGxvY2sgZXRoIGlycSAqLwogCXdtYigpOwogCXJwLT50eF9yaW5nW2VudHJ5XS50eF9zdGF0dXMgfD0gY3B1X3RvX2xlMzIoRGVzY093bik7CkBAIC0xODYzLDYgKzE4NjcsOCBAQAogCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGRldmljZSAqaHdkZXYgPSBkZXYtPmRldi5wYXJlbnQ7CiAJaW50IHR4c3RhdHVzID0gMCwgZW50cnkgPSBycC0+ZGlydHlfdHggJSBUWF9SSU5HX1NJWkU7CisJdW5zaWduZWQgaW50IHBrdHNfY29tcGwgPSAwLCBieXRlc19jb21wbCA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCS8qIGZpbmQgYW5kIGNsZWFudXAgZGlydHkgdHggZGVzY3JpcHRvcnMgKi8KIAl3aGlsZSAocnAtPmRpcnR5X3R4ICE9IHJwLT5jdXJfdHgpIHsKQEAgLTE4NzEsNiArMTg3Nyw3IEBACiAJCQkgIGVudHJ5LCB0eHN0YXR1cyk7CiAJCWlmICh0eHN0YXR1cyAmIERlc2NPd24pCiAJCQlicmVhazsKKwkJc2tiID0gcnAtPnR4X3NrYnVmZltlbnRyeV07CiAJCWlmICh0eHN0YXR1cyAmIDB4ODAwMCkgewogCQkJbmV0aWZfZGJnKHJwLCB0eF9kb25lLCBkZXYsCiAJCQkJICAiVHJhbnNtaXQgZXJyb3IsIFR4IHN0YXR1cyAlMDh4XG4iLCB0eHN0YXR1cyk7CkBAIC0xODk5LDcgKzE5MDYsNyBAQAogCQkJCSAgKHR4c3RhdHVzID4+IDMpICYgMHhGLCB0eHN0YXR1cyAmIDB4Rik7CiAKIAkJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnJwLT50eF9zdGF0cy5zeW5jcCk7Ci0JCQlycC0+dHhfc3RhdHMuYnl0ZXMgKz0gcnAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbjsKKwkJCXJwLT50eF9zdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKIAkJCXJwLT50eF9zdGF0cy5wYWNrZXRzKys7CiAJCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcnAtPnR4X3N0YXRzLnN5bmNwKTsKIAkJfQpAQCAtMTkwNywxMyArMTkxNCwxNyBAQAogCQlpZiAocnAtPnR4X3NrYnVmZl9kbWFbZW50cnldKSB7CiAJCQlkbWFfdW5tYXBfc2luZ2xlKGh3ZGV2LAogCQkJCQkgcnAtPnR4X3NrYnVmZl9kbWFbZW50cnldLAotCQkJCQkgcnAtPnR4X3NrYnVmZltlbnRyeV0tPmxlbiwKKwkJCQkJIHNrYi0+bGVuLAogCQkJCQkgRE1BX1RPX0RFVklDRSk7CiAJCX0KLQkJZGV2X2NvbnN1bWVfc2tiX2FueShycC0+dHhfc2tidWZmW2VudHJ5XSk7CisJCWJ5dGVzX2NvbXBsICs9IHNrYi0+bGVuOworCQlwa3RzX2NvbXBsKys7CisJCWRldl9jb25zdW1lX3NrYl9hbnkoc2tiKTsKIAkJcnAtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOwogCQllbnRyeSA9ICgrK3JwLT5kaXJ0eV90eCkgJSBUWF9SSU5HX1NJWkU7CiAJfQorCisJbmV0ZGV2X2NvbXBsZXRlZF9xdWV1ZShkZXYsIHBrdHNfY29tcGwsIGJ5dGVzX2NvbXBsKTsKIAlpZiAoKHJwLT5jdXJfdHggLSBycC0+ZGlydHlfdHgpIDwgVFhfUVVFVUVfTEVOIC0gNCkKIAkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS12ZWxvY2l0eS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS12ZWxvY2l0eS5jCmluZGV4IGMyMDIwNmYuLmFlNjhhZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3ZpYS92aWEtdmVsb2NpdHkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXZlbG9jaXR5LmMKQEAgLTM5Miw3ICszOTIsNyBAQAogICoJRGVzY3JpYmUgdGhlIE9GIGRldmljZSBpZGVudGlmaWVycyB0aGF0IHdlIHN1cHBvcnQgaW4gdGhpcwogICoJZGV2aWNlIGRyaXZlci4gVXNlZCBmb3IgZGV2aWNldHJlZSBub2Rlcy4KICAqLwotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdmVsb2NpdHlfb2ZfaWRzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2ZWxvY2l0eV9vZl9pZHNbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInZpYSx2ZWxvY2l0eS12dDYxMTAiLCAuZGF0YSA9ICZjaGlwX2luZm9fdGFibGVbMF0gfSwKIAl7IC8qIFNlbnRpbmVsICovIH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvd2l6bmV0L3c1MTAwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC93aXpuZXQvdzUxMDAuYwppbmRleCBhNDk1OTMxLi44YjI4MmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC93aXpuZXQvdzUxMDAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC93aXpuZXQvdzUxMDAuYwpAQCAtNTYsNyArNTYsNyBAQAogCiAjZGVmaW5lIFc1MTAwX1MwX1JFR1MJCTB4MDQwMAogI2RlZmluZSBXNTEwMF9TMF9NUgkJMHgwNDAwIC8qIFMwIE1vZGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgICBTMF9NUl9NQUNSQVcJCSAgMHgwNCAvKiBNQUMgUkFXIG1vZGUgKHByb21pc2NvdXMpICovCisjZGVmaW5lICAgUzBfTVJfTUFDUkFXCQkgIDB4MDQgLyogTUFDIFJBVyBtb2RlIChwcm9taXNjdW91cykgKi8KICNkZWZpbmUgICBTMF9NUl9NQUNSQVdfTUYJICAweDQ0IC8qIE1BQyBSQVcgbW9kZSAoZmlsdGVyZWQpICovCiAjZGVmaW5lIFc1MTAwX1MwX0NSCQkweDA0MDEgLyogUzAgQ29tbWFuZCBSZWdpc3RlciAqLwogI2RlZmluZSAgIFMwX0NSX09QRU4JCSAgMHgwMSAvKiBPUEVOIGNvbW1hbmQgKi8KQEAgLTQ5OCw5ICs0OTgsOSBAQAogCX0KIAogCWlmIChyeF9jb3VudCA8IGJ1ZGdldCkgeworCQluYXBpX2NvbXBsZXRlKG5hcGkpOwogCQl3NTEwMF93cml0ZShwcml2LCBXNTEwMF9JTVIsIElSX1MwKTsKIAkJbW1pb3diKCk7Ci0JCW5hcGlfY29tcGxldGUobmFwaSk7CiAJfQogCiAJcmV0dXJuIHJ4X2NvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvd2l6bmV0L3c1MzAwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC93aXpuZXQvdzUzMDAuYwppbmRleCAwOTMyMmQ5Li44ZGE3YjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC93aXpuZXQvdzUzMDAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC93aXpuZXQvdzUzMDAuYwpAQCAtNjMsNyArNjMsNyBAQAogI2RlZmluZSAgIElEUl9XNTMwMAkJICAweDUzMDAgIC8qID0weDUzMDAgZm9yIFdJWm5ldCBXNTMwMCAqLwogI2RlZmluZSBXNTMwMF9TMF9NUgkJMHgwMjAwCS8qIFMwIE1vZGUgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICBTMF9NUl9DTE9TRUQJCSAgMHgwMDAwICAvKiBDbG9zZSBtb2RlICovCi0jZGVmaW5lICAgUzBfTVJfTUFDUkFXCQkgIDB4MDAwNCAgLyogTUFDIFJBVyBtb2RlIChwcm9taXNjb3VzKSAqLworI2RlZmluZSAgIFMwX01SX01BQ1JBVwkJICAweDAwMDQgIC8qIE1BQyBSQVcgbW9kZSAocHJvbWlzY3VvdXMpICovCiAjZGVmaW5lICAgUzBfTVJfTUFDUkFXX01GCSAgMHgwMDQ0ICAvKiBNQUMgUkFXIG1vZGUgKGZpbHRlcmVkKSAqLwogI2RlZmluZSBXNTMwMF9TMF9DUgkJMHgwMjAyCS8qIFMwIENvbW1hbmQgUmVnaXN0ZXIgKi8KICNkZWZpbmUgICBTMF9DUl9PUEVOCQkgIDB4MDAwMSAgLyogT1BFTiBjb21tYW5kICovCkBAIC00MTgsOSArNDE4LDkgQEAKIAl9CiAKIAlpZiAocnhfY291bnQgPCBidWRnZXQpIHsKKwkJbmFwaV9jb21wbGV0ZShuYXBpKTsKIAkJdzUzMDBfd3JpdGUocHJpdiwgVzUzMDBfSU1SLCBJUl9TMCk7CiAJCW1taW93YigpOwotCQluYXBpX2NvbXBsZXRlKG5hcGkpOwogCX0KIAogCXJldHVybiByeF9jb3VudDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC9sbF90ZW1hY19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngvbGxfdGVtYWNfbWFpbi5jCmluZGV4IGRiY2JmMGMuLjY5MGE0YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC9sbF90ZW1hY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L2xsX3RlbWFjX21haW4uYwpAQCAtMTE1Nyw3ICsxMTU3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVtYWNfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRlbWFjX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHhwcy1sbC10ZW1hYy0xLjAxLmIiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAieGxueCx4cHMtbGwtdGVtYWMtMi4wMC5hIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInhsbngseHBzLWxsLXRlbWFjLTIuMDIuYSIsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2F4aWVuZXRfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9heGllbmV0X21haW4uYwppbmRleCBhNmQyODYwLi4yOGI3ZTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2F4aWVuZXRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfYXhpZW5ldF9tYWluLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKICNkZWZpbmUgQVhJRU5FVF9SRUdTX04JCTMyCiAKIC8qIE1hdGNoIHRhYmxlIGZvciBvZl9wbGF0Zm9ybSBiaW5kaW5nICovCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBheGllbmV0X29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBheGllbmV0X29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJ4bG54LGF4aS1ldGhlcm5ldC0xLjAwLmEiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAieGxueCxheGktZXRoZXJuZXQtMS4wMS5hIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInhsbngsYXhpLWV0aGVybmV0LTIuMDEuYSIsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2VtYWNsaXRlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2VtYWNsaXRlLmMKaW5kZXggOWQ0Y2UzOC4uNjAwOGVlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9lbWFjbGl0ZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfZW1hY2xpdGUuYwpAQCAtMTA2Miw3ICsxMDYyLDcgQEAKIAl9IGVsc2UgewogCQlkZXZfd2Fybigmb2ZkZXYtPmRldiwgIlBhcmFtZXRlciAlcyBub3QgZm91bmQsIgogCQkJImRlZmF1bHRpbmcgdG8gZmFsc2VcbiIsIHMpOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIH0KIApAQCAtMTIzMSw3ICsxMjMxLDcgQEAKIH07CiAKIC8qIE1hdGNoIHRhYmxlIGZvciBPRiBwbGF0Zm9ybSBiaW5kaW5nICovCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB4ZW1hY2xpdGVfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHhlbWFjbGl0ZV9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAieGxueCxvcGItZXRoZXJuZXRsaXRlLTEuMDEuYSIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ4bG54LG9wYi1ldGhlcm5ldGxpdGUtMS4wMS5iIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gInhsbngseHBzLWV0aGVybmV0bGl0ZS0xLjAwLmEiLCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveHNjYWxlL2l4cDR4eF9ldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hzY2FsZS9peHA0eHhfZXRoLmMKaW5kZXggOWUxNmEyOC4uNTEzODQwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveHNjYWxlL2l4cDR4eF9ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94c2NhbGUvaXhwNHh4X2V0aC5jCkBAIC05NTQsNyArOTU0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCW1lbXNldChkaWZmcywgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIoZGlmZnMpOwogCiAJYWRkciA9IE5VTEw7CiAJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvLzZwYWNrLmMKaW5kZXggZGFjYTBkZS4uN2M0YTQxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vNnBhY2suYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby82cGFjay5jCkBAIC0yNDcsNiArMjQ3LDkgQEAKIHsKIAlzdHJ1Y3Qgc2l4cGFjayAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOwogCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQlyZXR1cm4gYXgyNV9pcF94bWl0KHNrYik7CisKIAlzcGluX2xvY2tfYmgoJnNwLT5sb2NrKTsKIAkvKiBXZSB3ZXJlIG5vdCBidXN5LCBzbyB3ZSBhcmUgbm93Li4uIDotKSAqLwogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKQEAgLTI4NCwxOCArMjg3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogUmV0dXJuIHRoZSBmcmFtZSB0eXBlIElEICovCi1zdGF0aWMgaW50IHNwX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIGNvbnN0IHZvaWQgKmRhZGRyLAotCQkgICAgIGNvbnN0IHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pCi17Ci0jaWZkZWYgQ09ORklHX0lORVQKLQlpZiAodHlwZSAhPSBFVEhfUF9BWDI1KQotCQlyZXR1cm4gYXgyNV9oYXJkX2hlYWRlcihza2IsIGRldiwgdHlwZSwgZGFkZHIsIHNhZGRyLCBsZW4pOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgc3Bfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIpCiB7CiAJc3RydWN0IHNvY2thZGRyX2F4MjUgKnNhID0gYWRkcjsKQEAgLTMwOSwyMCArMzAwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzcF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotI2lmZGVmIENPTkZJR19JTkVUCi0JcmV0dXJuIGF4MjVfcmVidWlsZF9oZWFkZXIoc2tiKTsKLSNlbHNlCi0JcmV0dXJuIDA7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBoZWFkZXJfb3BzIHNwX2hlYWRlcl9vcHMgPSB7Ci0JLmNyZWF0ZQkJPSBzcF9oZWFkZXIsCi0JLnJlYnVpbGQJPSBzcF9yZWJ1aWxkX2hlYWRlciwKLX07Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgc3BfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gc3Bfb3Blbl9kZXYsCiAJLm5kb19zdG9wCQk9IHNwX2Nsb3NlLApAQCAtMzM3LDcgKzMxNCw3IEBACiAJZGV2LT5kZXN0cnVjdG9yCQk9IGZyZWVfbmV0ZGV2OwogCWRldi0+bXR1CQk9IFNJWFBfTVRVOwogCWRldi0+aGFyZF9oZWFkZXJfbGVuCT0gQVgyNV9NQVhfSEVBREVSX0xFTjsKLQlkZXYtPmhlYWRlcl9vcHMgCT0gJnNwX2hlYWRlcl9vcHM7CisJZGV2LT5oZWFkZXJfb3BzIAk9ICZheDI1X2hlYWRlcl9vcHM7CiAKIAlkZXYtPmFkZHJfbGVuCQk9IEFYMjVfQUREUl9MRU47CiAJZGV2LT50eXBlCQk9IEFSUEhSRF9BWDI1OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX2VwcC5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vYmF5Y29tX2VwcC5jCmluZGV4IGE5OGMxNTMuLjgzYzdjY2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JheWNvbV9lcHAuYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9iYXljb21fZXBwLmMKQEAgLTc3Miw2ICs3NzIsOSBAQAogewogCXN0cnVjdCBiYXljb21fc3RhdGUgKmJjID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKKwkJcmV0dXJuIGF4MjVfaXBfeG1pdChza2IpOworCiAJaWYgKHNrYi0+ZGF0YVswXSAhPSAwKSB7CiAJCWRvX2tpc3NfcGFyYW1zKGJjLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2JwcWV0aGVyLmMKaW5kZXggYzI4OTRlNC4uNjNmZjA4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vYnBxZXRoZXIuYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9icHFldGhlci5jCkBAIC0yNTEsNiArMjUxLDkgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqb3JpZ19kZXY7CiAJaW50IHNpemU7CiAKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCXJldHVybiBheDI1X2lwX3htaXQoc2tiKTsKKwogCS8qCiAJICogSnVzdCB0byBiZSAqcmVhbGx5KiBzdXJlIG5vdCB0byBzZW5kIGFueXRoaW5nIGlmIHRoZSBpbnRlcmZhY2UKIAkgKiBpcyBkb3duLCB0aGUgZXRoZXJuZXQgZGV2aWNlIG1heSBoYXZlIGdvbmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9kbWFzY2MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2RtYXNjYy5jCmluZGV4IDBmYWQ0MDguLmMzZDM3NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2RtYXNjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2RtYXNjYy5jCkBAIC05MjAsNiArOTIwLDkgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKQorCQlyZXR1cm4gYXgyNV9pcF94bWl0KHNrYik7CisKIAkvKiBUZW1wb3JhcmlseSBzdG9wIHRoZSBzY2hlZHVsZXIgZmVlZGluZyB1cyBwYWNrZXRzICovCiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby9oZGxjZHJ2LmMKaW5kZXggYzY3YTI3Mi4uNDlmZTU5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vaGRsY2Rydi5jCisrKyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL2hkbGNkcnYuYwpAQCAtNDA0LDYgKzQwNCw5IEBACiB7CiAJc3RydWN0IGhkbGNkcnZfc3RhdGUgKnNtID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAorCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkKKwkJcmV0dXJuIGF4MjVfaXBfeG1pdChza2IpOworCiAJaWYgKHNrYi0+ZGF0YVswXSAhPSAwKSB7CiAJCWRvX2tpc3NfcGFyYW1zKHNtLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYyBiL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKaW5kZXggZjk5MGJiMWMuLjJmZmJmMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL21raXNzLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vbWtpc3MuYwpAQCAtNTI5LDYgKzUyOSw5IEBACiB7CiAJc3RydWN0IG1raXNzICpheCA9IG5ldGRldl9wcml2KGRldik7CiAKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCXJldHVybiBheDI1X2lwX3htaXQoc2tiKTsKKwogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKSAgewogCQlwcmludGsoS0VSTl9FUlIgIm1raXNzOiAlczogeG1pdCBjYWxsIHdoZW4gaWZhY2UgaXMgZG93blxuIiwgZGV2LT5uYW1lKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwpAQCAtNTU0LDExICs1NTcsOSBAQAogCX0KIAogCS8qIFdlIHdlcmUgbm90IGJ1c3ksIHNvIHdlIGFyZSBub3cuLi4gOi0pICovCi0JaWYgKHNrYiAhPSBOVUxMKSB7Ci0JCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKLQkJYXhfZW5jYXBzKGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbik7Ci0JCWtmcmVlX3NrYihza2IpOwotCX0KKwluZXRpZl9zdG9wX3F1ZXVlKGRldik7CisJYXhfZW5jYXBzKGRldiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CisJa2ZyZWVfc2tiKHNrYik7CiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQpAQCAtNTczLDMyICs1NzQsNiBAQAogCXJldHVybiAwOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCi0KLS8qIFJldHVybiB0aGUgZnJhbWUgdHlwZSBJRCAqLwotc3RhdGljIGludCBheF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCBjb25zdCB2b2lkICpkYWRkciwKLQkJICAgICBjb25zdCB2b2lkICpzYWRkciwgdW5zaWduZWQgbGVuKQotewotI2lmZGVmIENPTkZJR19JTkVUCi0JaWYgKHR5cGUgIT0gRVRIX1BfQVgyNSkKLQkJcmV0dXJuIGF4MjVfaGFyZF9oZWFkZXIoc2tiLCBkZXYsIHR5cGUsIGRhZGRyLCBzYWRkciwgbGVuKTsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgYXhfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLSNpZmRlZiBDT05GSUdfSU5FVAotCXJldHVybiBheDI1X3JlYnVpbGRfaGVhZGVyKHNrYik7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCi19Ci0KLSNlbmRpZgkvKiBDT05GSUdfe0FYMjUsQVgyNV9NT0RVTEV9ICovCi0KIC8qIE9wZW4gdGhlIGxvdy1sZXZlbCBwYXJ0IG9mIHRoZSBBWDI1IGNoYW5uZWwuIEVhc3khICovCiBzdGF0aWMgaW50IGF4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTY2MiwxMSArNjM3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBoZWFkZXJfb3BzIGF4X2hlYWRlcl9vcHMgPSB7Ci0JLmNyZWF0ZSAgICA9IGF4X2hlYWRlciwKLQkucmVidWlsZCAgID0gYXhfcmVidWlsZF9oZWFkZXIsCi19OwotCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGF4X25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuICAgICAgICAgICAgPSBheF9vcGVuX2RldiwKIAkubmRvX3N0b3AgICAgICAgICAgICA9IGF4X2Nsb3NlLApAQCAtNjgyLDcgKzY1Miw3IEBACiAJZGV2LT5hZGRyX2xlbiAgICAgICAgPSAwOwogCWRldi0+dHlwZSAgICAgICAgICAgID0gQVJQSFJEX0FYMjU7CiAJZGV2LT50eF9xdWV1ZV9sZW4gICAgPSAxMDsKLQlkZXYtPmhlYWRlcl9vcHMgICAgICA9ICZheF9oZWFkZXJfb3BzOworCWRldi0+aGVhZGVyX29wcyAgICAgID0gJmF4MjVfaGVhZGVyX29wczsKIAlkZXYtPm5ldGRldl9vcHMJICAgICA9ICZheF9uZXRkZXZfb3BzOwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2hhbXJhZGlvL3NjYy5jIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vc2NjLmMKaW5kZXggNTdiZTllMC4uY2U4OGRmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaGFtcmFkaW8vc2NjLmMKKysrIGIvZHJpdmVycy9uZXQvaGFtcmFkaW8vc2NjLmMKQEAgLTE2MzksNiArMTYzOSw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAljaGFyIGtpc3NjbWQ7CiAKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCXJldHVybiBheDI1X2lwX3htaXQoc2tiKTsKKwogCWlmIChza2ItPmxlbiA+IHNjYy0+c3RhdC5idWZzaXplIHx8IHNrYi0+bGVuIDwgMikgewogCQlzY2MtPmRldl9zdGF0LnR4X2Ryb3BwZWQrKzsJLyogYm9ndXMgZnJhbWUgKi8KIAkJZGV2X2tmcmVlX3NrYihza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaGFtcmFkaW8veWFtLmMgYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYwppbmRleCA3MTc0MzNjLi4xYTQ3MjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYworKysgYi9kcml2ZXJzL25ldC9oYW1yYWRpby95YW0uYwpAQCAtNTk3LDYgKzU5Nyw5IEBACiB7CiAJc3RydWN0IHlhbV9wb3J0ICp5cCA9IG5ldGRldl9wcml2KGRldik7CiAKKwlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCisJCXJldHVybiBheDI1X2lwX3htaXQoc2tiKTsKKwogCXNrYl9xdWV1ZV90YWlsKCZ5cC0+c2VuZF9xdWV1ZSwgc2tiKTsKIAlkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKIAlyZXR1cm4gTkVUREVWX1RYX09LOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHlwZXJ2L2h5cGVydl9uZXQuaCBiL2RyaXZlcnMvbmV0L2h5cGVydi9oeXBlcnZfbmV0LmgKaW5kZXggMzg0Y2E0Zi4uYTEwYjMxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHlwZXJ2L2h5cGVydl9uZXQuaAorKysgYi9kcml2ZXJzL25ldC9oeXBlcnYvaHlwZXJ2X25ldC5oCkBAIC0xMjgsOSArMTI4LDEyIEBACiBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCB7CiAJLyogQm9va2tlZXBpbmcgc3R1ZmYgKi8KIAl1MzIgc3RhdHVzOworCWJvb2wgcGFydF9vZl9za2I7CiAKLQlzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2U7CiAJYm9vbCBpc19kYXRhX3BrdDsKKwlib29sIHhtaXRfbW9yZTsgLyogZnJvbSBza2IgKi8KKwlib29sIGNwX3BhcnRpYWw7IC8qIHBhcnRpYWwgY29weSBpbnRvIHNlbmQgYnVmZmVyICovCisKIAl1MTYgdmxhbl90Y2k7CiAKIAl1MTYgcV9pZHg7CkBAIC0xNDUsMTEgKzE0OCwxNCBAQAogCS8qIFRoaXMgcG9pbnRzIHRvIHRoZSBtZW1vcnkgYWZ0ZXIgcGFnZV9idWYgKi8KIAlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqcm5kaXNfbXNnOwogCisJdTMyIHJtc2dfc2l6ZTsgLyogUk5ESVMgaGVhZGVyIGFuZCBQUEkgc2l6ZSAqLworCXUzMiBybXNnX3BnY250OyAvKiBwYWdlIGNvdW50IG9mIFJORElTIGhlYWRlciBhbmQgUFBJICovCisKIAl1MzIgdG90YWxfZGF0YV9idWZsZW47CiAJLyogUG9pbnRzIHRvIHRoZSBzZW5kL3JlY2VpdmUgYnVmZmVyIHdoZXJlIHRoZSBldGhlcm5ldCBmcmFtZSBpcyAqLwogCXZvaWQgKmRhdGE7CiAJdTMyIHBhZ2VfYnVmX2NudDsKLQlzdHJ1Y3QgaHZfcGFnZV9idWZmZXIgcGFnZV9idWZbMF07CisJc3RydWN0IGh2X3BhZ2VfYnVmZmVyICpwYWdlX2J1ZjsKIH07CiAKIHN0cnVjdCBuZXR2c2NfZGV2aWNlX2luZm8gewpAQCAtMTg3LDYgKzE5Myw3IEBACiAJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQpOwogdm9pZCBuZXR2c2NfbGlua3N0YXR1c19jYWxsYmFjayhzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqLAogCQkJCXN0cnVjdCBybmRpc19tZXNzYWdlICpyZXNwKTsKK3ZvaWQgbmV0dnNjX3htaXRfY29tcGxldGlvbih2b2lkICpjb250ZXh0KTsKIGludCBuZXR2c2NfcmVjdl9jYWxsYmFjayhzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2Vfb2JqLAogCQkJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCwKIAkJCXN0cnVjdCBuZGlzX3RjcF9pcF9jaGVja3N1bV9pbmZvICpjc3VtX2luZm8pOwpAQCAtNTk2LDcgKzYwMywxNiBAQAogCiAjZGVmaW5lIFZSU1NfU0VORF9UQUJfU0laRSAxNgogCi0vKiBQZXIgbmV0dnNjIGNoYW5uZWwtc3BlY2lmaWMgKi8KKyNkZWZpbmUgUk5ESVNfTUFYX1BLVF9ERUZBVUxUIDgKKyNkZWZpbmUgUk5ESVNfUEtUX0FMSUdOX0RFRkFVTFQgOAorCitzdHJ1Y3QgbXVsdGlfc2VuZF9kYXRhIHsKKwlzcGlubG9ja190IGxvY2s7IC8qIHByb3RlY3Qgc3RydWN0IG11bHRpX3NlbmRfZGF0YSAqLworCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwa3Q7IC8qIG5ldHZzYyBwa3QgcGVuZGluZyAqLworCXUzMiBjb3VudDsgLyogY291bnRlciBvZiBiYXRjaGVkIHBhY2tldHMgKi8KK307CisKKy8qIFBlciBuZXR2c2MgZGV2aWNlICovCiBzdHJ1Y3QgbmV0dnNjX2RldmljZSB7CiAJc3RydWN0IGh2X2RldmljZSAqZGV2OwogCkBAIC02MzQsNiArNjUwLDcgQEAKIAogCXN0cnVjdCB2bWJ1c19jaGFubmVsICpjaG5fdGFibGVbTlJfQ1BVU107CiAJdTMyIHNlbmRfdGFibGVbVlJTU19TRU5EX1RBQl9TSVpFXTsKKwl1MzIgbWF4X2NobjsKIAl1MzIgbnVtX2NobjsKIAlhdG9taWNfdCBxdWV1ZV9zZW5kc1tOUl9DUFVTXTsKIApAQCAtNjQ2LDYgKzY2MywxMCBAQAogCXVuc2lnbmVkIGNoYXIgKmNiX2J1ZmZlcjsKIAkvKiBUaGUgc3ViIGNoYW5uZWwgY2FsbGJhY2sgYnVmZmVyICovCiAJdW5zaWduZWQgY2hhciAqc3ViX2NiX2J1ZjsKKworCXN0cnVjdCBtdWx0aV9zZW5kX2RhdGEgbXNkW05SX0NQVVNdOworCXUzMiBtYXhfcGt0OyAvKiBtYXggbnVtYmVyIG9mIHBrdCBpbiBvbmUgc2VuZCwgZS5nLiA4ICovCisJdTMyIHBrdF9hbGlnbjsgLyogYWxpZ25tZW50IGJ5dGVzLCBlLmcuIDggKi8KIH07CiAKIC8qIE5kaXNJbml0aWFsaXplIG1lc3NhZ2UgKi8KQEAgLTk0Myw2ICs5NjQsMTAgQEAKICNkZWZpbmUgTkRJU19IQVNIX1BQSV9TSVpFIChzaXplb2Yoc3RydWN0IHJuZGlzX3Blcl9wYWNrZXRfaW5mbykgKyBcCiAJCXNpemVvZih1MzIpKQogCisvKiBUb3RhbCBzaXplIG9mIGFsbCBQUEkgZGF0YSAqLworI2RlZmluZSBORElTX0FMTF9QUElfU0laRSAoTkRJU19WTEFOX1BQSV9TSVpFICsgTkRJU19DU1VNX1BQSV9TSVpFICsgXAorCQkJICAgTkRJU19MU09fUFBJX1NJWkUgKyBORElTX0hBU0hfUFBJX1NJWkUpCisKIC8qIEZvcm1hdCBvZiBJbmZvcm1hdGlvbiBidWZmZXIgcGFzc2VkIGluIGEgU2V0UmVxdWVzdCBmb3IgdGhlIE9JRCAqLwogLyogT0lEX0dFTl9STkRJU19DT05GSUdfUEFSQU1FVEVSLiAqLwogc3RydWN0IHJuZGlzX2NvbmZpZ19wYXJhbWV0ZXJfaW5mbyB7CkBAIC0xMTU1LDYgKzExODAsOCBAQAogI2RlZmluZSBSTkRJU19IRUFERVJfU0laRQkoc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSAtIFwKIAkJCQkgc2l6ZW9mKHVuaW9uIHJuZGlzX21lc3NhZ2VfY29udGFpbmVyKSkKIAorI2RlZmluZSBSTkRJU19BTkRfUFBJX1NJWkUgKHNpemVvZihzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSkgKyBORElTX0FMTF9QUElfU0laRSkKKwogI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0RJUkVDVEVECTB4MDAwMDAwMDEKICNkZWZpbmUgTkRJU19QQUNLRVRfVFlQRV9NVUxUSUNBU1QJMHgwMDAwMDAwMgogI2RlZmluZSBORElTX1BBQ0tFVF9UWVBFX0FMTF9NVUxUSUNBU1QJMHgwMDAwMDAwNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzYy5jIGIvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzYy5jCmluZGV4IDIwOGViMDUuLjJlOGFkMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2MuYworKysgYi9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjLmMKQEAgLTM3LDYgKzM3LDcgQEAKIHsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGh2X2dldF9kcnZkYXRhKGRldmljZSk7CisJaW50IGk7CiAKIAluZXRfZGV2aWNlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5ldHZzY19kZXZpY2UpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ldF9kZXZpY2UpCkBAIC01Myw2ICs1NCwxMSBAQAogCW5ldF9kZXZpY2UtPmRlc3Ryb3kgPSBmYWxzZTsKIAluZXRfZGV2aWNlLT5kZXYgPSBkZXZpY2U7CiAJbmV0X2RldmljZS0+bmRldiA9IG5kZXY7CisJbmV0X2RldmljZS0+bWF4X3BrdCA9IFJORElTX01BWF9QS1RfREVGQVVMVDsKKwluZXRfZGV2aWNlLT5wa3RfYWxpZ24gPSBSTkRJU19QS1RfQUxJR05fREVGQVVMVDsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fb25saW5lX2NwdXMoKTsgaSsrKQorCQlzcGluX2xvY2tfaW5pdCgmbmV0X2RldmljZS0+bXNkW2ldLmxvY2spOwogCiAJaHZfc2V0X2RydmRhdGEoZGV2aWNlLCBuZXRfZGV2aWNlKTsKIAlyZXR1cm4gbmV0X2RldmljZTsKQEAgLTY4NywxNCArNjkzLDI4IEBACiAKIHN0YXRpYyB1MzIgbmV0dnNjX2NvcHlfdG9fc2VuZF9idWYoc3RydWN0IG5ldHZzY19kZXZpY2UgKm5ldF9kZXZpY2UsCiAJCQkJICAgdW5zaWduZWQgaW50IHNlY3Rpb25faW5kZXgsCisJCQkJICAgdTMyIHBlbmRfc2l6ZSwKIAkJCQkgICBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0KQogewogCWNoYXIgKnN0YXJ0ID0gbmV0X2RldmljZS0+c2VuZF9idWY7Ci0JY2hhciAqZGVzdCA9IChzdGFydCArIChzZWN0aW9uX2luZGV4ICogbmV0X2RldmljZS0+c2VuZF9zZWN0aW9uX3NpemUpKTsKKwljaGFyICpkZXN0ID0gc3RhcnQgKyAoc2VjdGlvbl9pbmRleCAqIG5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9zaXplKQorCQkgICAgICsgcGVuZF9zaXplOwogCWludCBpOwogCXUzMiBtc2dfc2l6ZSA9IDA7CisJdTMyIHBhZGRpbmcgPSAwOworCXUzMiByZW1haW4gPSBwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuICUgbmV0X2RldmljZS0+cGt0X2FsaWduOworCXUzMiBwYWdlX2NvdW50ID0gcGFja2V0LT5jcF9wYXJ0aWFsID8gcGFja2V0LT5ybXNnX3BnY250IDoKKwkJcGFja2V0LT5wYWdlX2J1Zl9jbnQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgcGFja2V0LT5wYWdlX2J1Zl9jbnQ7IGkrKykgeworCS8qIEFkZCBwYWRkaW5nICovCisJaWYgKHBhY2tldC0+aXNfZGF0YV9wa3QgJiYgcGFja2V0LT54bWl0X21vcmUgJiYgcmVtYWluICYmCisJICAgICFwYWNrZXQtPmNwX3BhcnRpYWwpIHsKKwkJcGFkZGluZyA9IG5ldF9kZXZpY2UtPnBrdF9hbGlnbiAtIHJlbWFpbjsKKwkJcGFja2V0LT5ybmRpc19tc2ctPm1zZ19sZW4gKz0gcGFkZGluZzsKKwkJcGFja2V0LT50b3RhbF9kYXRhX2J1ZmxlbiArPSBwYWRkaW5nOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwYWdlX2NvdW50OyBpKyspIHsKIAkJY2hhciAqc3JjID0gcGh5c190b192aXJ0KHBhY2tldC0+cGFnZV9idWZbaV0ucGZuIDw8IFBBR0VfU0hJRlQpOwogCQl1MzIgb2Zmc2V0ID0gcGFja2V0LT5wYWdlX2J1ZltpXS5vZmZzZXQ7CiAJCXUzMiBsZW4gPSBwYWNrZXQtPnBhZ2VfYnVmW2ldLmxlbjsKQEAgLTcwMyw3OSArNzIzLDY0IEBACiAJCW1zZ19zaXplICs9IGxlbjsKIAkJZGVzdCArPSBsZW47CiAJfQorCisJaWYgKHBhZGRpbmcpIHsKKwkJbWVtc2V0KGRlc3QsIDAsIHBhZGRpbmcpOworCQltc2dfc2l6ZSArPSBwYWRkaW5nOworCX0KKwogCXJldHVybiBtc2dfc2l6ZTsKIH0KIAotaW50IG5ldHZzY19zZW5kKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKLQkJCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQpCitzdGF0aWMgaW5saW5lIGludCBuZXR2c2Nfc2VuZF9wa3QoCisJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCwKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZSkKIHsKLQlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbnZzcF9tZXNzYWdlIHNlbmRNZXNzYWdlOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwotCXN0cnVjdCB2bWJ1c19jaGFubmVsICpvdXRfY2hhbm5lbCA9IE5VTEw7Ci0JdTY0IHJlcV9pZDsKLQl1bnNpZ25lZCBpbnQgc2VjdGlvbl9pbmRleCA9IE5FVFZTQ19JTlZBTElEX0lOREVYOwotCXUzMiBtc2dfc2l6ZSA9IDA7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJc3RydWN0IG52c3BfbWVzc2FnZSBudm1zZzsKKwlzdHJ1Y3Qgdm1idXNfY2hhbm5lbCAqb3V0X2NoYW5uZWwgPSBwYWNrZXQtPmNoYW5uZWw7CiAJdTE2IHFfaWR4ID0gcGFja2V0LT5xX2lkeDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IG5ldF9kZXZpY2UtPm5kZXY7CisJdTY0IHJlcV9pZDsKKwlpbnQgcmV0OworCXN0cnVjdCBodl9wYWdlX2J1ZmZlciAqcGdidWY7CiAKLQotCW5ldF9kZXZpY2UgPSBnZXRfb3V0Ym91bmRfbmV0X2RldmljZShkZXZpY2UpOwotCWlmICghbmV0X2RldmljZSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JbmRldiA9IG5ldF9kZXZpY2UtPm5kZXY7Ci0KLQlzZW5kTWVzc2FnZS5oZHIubXNnX3R5cGUgPSBOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVDsKKwludm1zZy5oZHIubXNnX3R5cGUgPSBOVlNQX01TRzFfVFlQRV9TRU5EX1JORElTX1BLVDsKIAlpZiAocGFja2V0LT5pc19kYXRhX3BrdCkgewogCQkvKiAwIGlzIFJNQ19EQVRBOyAqLwotCQlzZW5kTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0LmNoYW5uZWxfdHlwZSA9IDA7CisJCW52bXNnLm1zZy52MV9tc2cuc2VuZF9ybmRpc19wa3QuY2hhbm5lbF90eXBlID0gMDsKIAl9IGVsc2UgewogCQkvKiAxIGlzIFJNQ19DT05UUk9MOyAqLwotCQlzZW5kTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0LmNoYW5uZWxfdHlwZSA9IDE7CisJCW52bXNnLm1zZy52MV9tc2cuc2VuZF9ybmRpc19wa3QuY2hhbm5lbF90eXBlID0gMTsKIAl9CiAKLQkvKiBBdHRlbXB0IHRvIHNlbmQgdmlhIHNlbmRidWYgKi8KLQlpZiAocGFja2V0LT50b3RhbF9kYXRhX2J1ZmxlbiA8IG5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9zaXplKSB7Ci0JCXNlY3Rpb25faW5kZXggPSBuZXR2c2NfZ2V0X25leHRfc2VuZF9zZWN0aW9uKG5ldF9kZXZpY2UpOwotCQlpZiAoc2VjdGlvbl9pbmRleCAhPSBORVRWU0NfSU5WQUxJRF9JTkRFWCkgewotCQkJbXNnX3NpemUgPSBuZXR2c2NfY29weV90b19zZW5kX2J1ZihuZXRfZGV2aWNlLAotCQkJCQkJCSAgIHNlY3Rpb25faW5kZXgsCi0JCQkJCQkJICAgcGFja2V0KTsKLQkJCXNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKQotCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpcGFja2V0LT5zZW5kX2NvbXBsZXRpb25fdGlkOwotCQkJcGFja2V0LT5wYWdlX2J1Zl9jbnQgPSAwOwotCQl9Ci0JfQotCXBhY2tldC0+c2VuZF9idWZfaW5kZXggPSBzZWN0aW9uX2luZGV4OwotCi0KLQlzZW5kTWVzc2FnZS5tc2cudjFfbXNnLnNlbmRfcm5kaXNfcGt0LnNlbmRfYnVmX3NlY3Rpb25faW5kZXggPQotCQlzZWN0aW9uX2luZGV4OwotCXNlbmRNZXNzYWdlLm1zZy52MV9tc2cuc2VuZF9ybmRpc19wa3Quc2VuZF9idWZfc2VjdGlvbl9zaXplID0gbXNnX3NpemU7CisJbnZtc2cubXNnLnYxX21zZy5zZW5kX3JuZGlzX3BrdC5zZW5kX2J1Zl9zZWN0aW9uX2luZGV4ID0KKwkJcGFja2V0LT5zZW5kX2J1Zl9pbmRleDsKKwlpZiAocGFja2V0LT5zZW5kX2J1Zl9pbmRleCA9PSBORVRWU0NfSU5WQUxJRF9JTkRFWCkKKwkJbnZtc2cubXNnLnYxX21zZy5zZW5kX3JuZGlzX3BrdC5zZW5kX2J1Zl9zZWN0aW9uX3NpemUgPSAwOworCWVsc2UKKwkJbnZtc2cubXNnLnYxX21zZy5zZW5kX3JuZGlzX3BrdC5zZW5kX2J1Zl9zZWN0aW9uX3NpemUgPQorCQkJcGFja2V0LT50b3RhbF9kYXRhX2J1ZmxlbjsKIAogCWlmIChwYWNrZXQtPnNlbmRfY29tcGxldGlvbikKIAkJcmVxX2lkID0gKHVsb25nKXBhY2tldDsKIAllbHNlCiAJCXJlcV9pZCA9IDA7CiAKLQlvdXRfY2hhbm5lbCA9IG5ldF9kZXZpY2UtPmNobl90YWJsZVtwYWNrZXQtPnFfaWR4XTsKLQlpZiAob3V0X2NoYW5uZWwgPT0gTlVMTCkKLQkJb3V0X2NoYW5uZWwgPSBkZXZpY2UtPmNoYW5uZWw7Ci0JcGFja2V0LT5jaGFubmVsID0gb3V0X2NoYW5uZWw7Ci0KIAlpZiAob3V0X2NoYW5uZWwtPnJlc2NpbmQpCiAJCXJldHVybiAtRU5PREVWOwogCiAJaWYgKHBhY2tldC0+cGFnZV9idWZfY250KSB7CisJCXBnYnVmID0gcGFja2V0LT5jcF9wYXJ0aWFsID8gcGFja2V0LT5wYWdlX2J1ZiArCisJCQlwYWNrZXQtPnJtc2dfcGdjbnQgOiBwYWNrZXQtPnBhZ2VfYnVmOwogCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0X3BhZ2VidWZmZXIob3V0X2NoYW5uZWwsCi0JCQkJCQkgIHBhY2tldC0+cGFnZV9idWYsCisJCQkJCQkgIHBnYnVmLAogCQkJCQkJICBwYWNrZXQtPnBhZ2VfYnVmX2NudCwKLQkJCQkJCSAgJnNlbmRNZXNzYWdlLAorCQkJCQkJICAmbnZtc2csCiAJCQkJCQkgIHNpemVvZihzdHJ1Y3QgbnZzcF9tZXNzYWdlKSwKIAkJCQkJCSAgcmVxX2lkKTsKIAl9IGVsc2UgewotCQlyZXQgPSB2bWJ1c19zZW5kcGFja2V0KG91dF9jaGFubmVsLCAmc2VuZE1lc3NhZ2UsCisJCXJldCA9IHZtYnVzX3NlbmRwYWNrZXQoCisJCQkJb3V0X2NoYW5uZWwsICZudm1zZywKIAkJCQlzaXplb2Yoc3RydWN0IG52c3BfbWVzc2FnZSksCiAJCQkJcmVxX2lkLAogCQkJCVZNX1BLVF9EQVRBX0lOQkFORCwKQEAgLTgwOSw2ICs4MTQsMTIxIEBACiAJCQkgICBwYWNrZXQsIHJldCk7CiAJfQogCisJcmV0dXJuIHJldDsKK30KKworaW50IG5ldHZzY19zZW5kKHN0cnVjdCBodl9kZXZpY2UgKmRldmljZSwKKwkJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbmV0X2RldmljZTsKKwlpbnQgcmV0ID0gMCwgbV9yZXQgPSAwOworCXN0cnVjdCB2bWJ1c19jaGFubmVsICpvdXRfY2hhbm5lbDsKKwl1MTYgcV9pZHggPSBwYWNrZXQtPnFfaWR4OworCXUzMiBwa3RsZW4gPSBwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuLCBtc2RfbGVuID0gMDsKKwl1bnNpZ25lZCBpbnQgc2VjdGlvbl9pbmRleCA9IE5FVFZTQ19JTlZBTElEX0lOREVYOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZzsKKwlzdHJ1Y3QgbXVsdGlfc2VuZF9kYXRhICptc2RwOworCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICptc2Rfc2VuZCA9IE5VTEwsICpjdXJfc2VuZCA9IE5VTEw7CisJYm9vbCB0cnlfYmF0Y2g7CisKKwluZXRfZGV2aWNlID0gZ2V0X291dGJvdW5kX25ldF9kZXZpY2UoZGV2aWNlKTsKKwlpZiAoIW5ldF9kZXZpY2UpCisJCXJldHVybiAtRU5PREVWOworCisJb3V0X2NoYW5uZWwgPSBuZXRfZGV2aWNlLT5jaG5fdGFibGVbcV9pZHhdOworCWlmICghb3V0X2NoYW5uZWwpIHsKKwkJb3V0X2NoYW5uZWwgPSBkZXZpY2UtPmNoYW5uZWw7CisJCXFfaWR4ID0gMDsKKwkJcGFja2V0LT5xX2lkeCA9IDA7CisJfQorCXBhY2tldC0+Y2hhbm5lbCA9IG91dF9jaGFubmVsOworCXBhY2tldC0+c2VuZF9idWZfaW5kZXggPSBORVRWU0NfSU5WQUxJRF9JTkRFWDsKKwlwYWNrZXQtPmNwX3BhcnRpYWwgPSBmYWxzZTsKKworCW1zZHAgPSAmbmV0X2RldmljZS0+bXNkW3FfaWR4XTsKKworCS8qIGJhdGNoIHBhY2tldHMgaW4gc2VuZCBidWZmZXIgaWYgcG9zc2libGUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNkcC0+bG9jaywgZmxhZyk7CisJaWYgKG1zZHAtPnBrdCkKKwkJbXNkX2xlbiA9IG1zZHAtPnBrdC0+dG90YWxfZGF0YV9idWZsZW47CisKKwl0cnlfYmF0Y2ggPSBwYWNrZXQtPmlzX2RhdGFfcGt0ICYmIG1zZF9sZW4gPiAwICYmIG1zZHAtPmNvdW50IDwKKwkJICAgIG5ldF9kZXZpY2UtPm1heF9wa3Q7CisKKwlpZiAodHJ5X2JhdGNoICYmIG1zZF9sZW4gKyBwa3RsZW4gKyBuZXRfZGV2aWNlLT5wa3RfYWxpZ24gPAorCSAgICBuZXRfZGV2aWNlLT5zZW5kX3NlY3Rpb25fc2l6ZSkgeworCQlzZWN0aW9uX2luZGV4ID0gbXNkcC0+cGt0LT5zZW5kX2J1Zl9pbmRleDsKKworCX0gZWxzZSBpZiAodHJ5X2JhdGNoICYmIG1zZF9sZW4gKyBwYWNrZXQtPnJtc2dfc2l6ZSA8CisJCSAgIG5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9zaXplKSB7CisJCXNlY3Rpb25faW5kZXggPSBtc2RwLT5wa3QtPnNlbmRfYnVmX2luZGV4OworCQlwYWNrZXQtPmNwX3BhcnRpYWwgPSB0cnVlOworCisJfSBlbHNlIGlmIChwYWNrZXQtPmlzX2RhdGFfcGt0ICYmIHBrdGxlbiArIG5ldF9kZXZpY2UtPnBrdF9hbGlnbiA8CisJCSAgIG5ldF9kZXZpY2UtPnNlbmRfc2VjdGlvbl9zaXplKSB7CisJCXNlY3Rpb25faW5kZXggPSBuZXR2c2NfZ2V0X25leHRfc2VuZF9zZWN0aW9uKG5ldF9kZXZpY2UpOworCQlpZiAoc2VjdGlvbl9pbmRleCAhPSBORVRWU0NfSU5WQUxJRF9JTkRFWCkgeworCQkJCW1zZF9zZW5kID0gbXNkcC0+cGt0OworCQkJCW1zZHAtPnBrdCA9IE5VTEw7CisJCQkJbXNkcC0+Y291bnQgPSAwOworCQkJCW1zZF9sZW4gPSAwOworCQl9CisJfQorCisJaWYgKHNlY3Rpb25faW5kZXggIT0gTkVUVlNDX0lOVkFMSURfSU5ERVgpIHsKKwkJbmV0dnNjX2NvcHlfdG9fc2VuZF9idWYobmV0X2RldmljZSwKKwkJCQkJc2VjdGlvbl9pbmRleCwgbXNkX2xlbiwKKwkJCQkJcGFja2V0KTsKKworCQlwYWNrZXQtPnNlbmRfYnVmX2luZGV4ID0gc2VjdGlvbl9pbmRleDsKKworCQlpZiAocGFja2V0LT5jcF9wYXJ0aWFsKSB7CisJCQlwYWNrZXQtPnBhZ2VfYnVmX2NudCAtPSBwYWNrZXQtPnJtc2dfcGdjbnQ7CisJCQlwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuID0gbXNkX2xlbiArIHBhY2tldC0+cm1zZ19zaXplOworCQl9IGVsc2UgeworCQkJcGFja2V0LT5wYWdlX2J1Zl9jbnQgPSAwOworCQkJcGFja2V0LT50b3RhbF9kYXRhX2J1ZmxlbiArPSBtc2RfbGVuOworCQkJaWYgKCFwYWNrZXQtPnBhcnRfb2Zfc2tiKSB7CisJCQkJc2tiID0gKHN0cnVjdCBza19idWZmICopKHVuc2lnbmVkIGxvbmcpcGFja2V0LT4KKwkJCQkgICAgICAgc2VuZF9jb21wbGV0aW9uX3RpZDsKKwkJCQlwYWNrZXQtPnNlbmRfY29tcGxldGlvbl90aWQgPSAwOworCQkJfQorCQl9CisKKwkJaWYgKG1zZHAtPnBrdCkKKwkJCW5ldHZzY194bWl0X2NvbXBsZXRpb24obXNkcC0+cGt0KTsKKworCQlpZiAocGFja2V0LT54bWl0X21vcmUgJiYgIXBhY2tldC0+Y3BfcGFydGlhbCkgeworCQkJbXNkcC0+cGt0ID0gcGFja2V0OworCQkJbXNkcC0+Y291bnQrKzsKKwkJfSBlbHNlIHsKKwkJCWN1cl9zZW5kID0gcGFja2V0OworCQkJbXNkcC0+cGt0ID0gTlVMTDsKKwkJCW1zZHAtPmNvdW50ID0gMDsKKwkJfQorCX0gZWxzZSB7CisJCW1zZF9zZW5kID0gbXNkcC0+cGt0OworCQltc2RwLT5wa3QgPSBOVUxMOworCQltc2RwLT5jb3VudCA9IDA7CisJCWN1cl9zZW5kID0gcGFja2V0OworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zZHAtPmxvY2ssIGZsYWcpOworCisJaWYgKG1zZF9zZW5kKSB7CisJCW1fcmV0ID0gbmV0dnNjX3NlbmRfcGt0KG1zZF9zZW5kLCBuZXRfZGV2aWNlKTsKKworCQlpZiAobV9yZXQgIT0gMCkgeworCQkJbmV0dnNjX2ZyZWVfc2VuZF9zbG90KG5ldF9kZXZpY2UsCisJCQkJCSAgICAgIG1zZF9zZW5kLT5zZW5kX2J1Zl9pbmRleCk7CisJCQluZXR2c2NfeG1pdF9jb21wbGV0aW9uKG1zZF9zZW5kKTsKKwkJfQorCX0KKworCWlmIChjdXJfc2VuZCkKKwkJcmV0ID0gbmV0dnNjX3NlbmRfcGt0KGN1cl9zZW5kLCBuZXRfZGV2aWNlKTsKKwogCWlmIChyZXQgIT0gMCkgewogCQlpZiAoc2VjdGlvbl9pbmRleCAhPSBORVRWU0NfSU5WQUxJRF9JTkRFWCkKIAkJCW5ldHZzY19mcmVlX3NlbmRfc2xvdChuZXRfZGV2aWNlLCBzZWN0aW9uX2luZGV4KTsKQEAgLTkxMSw3ICsxMDMxLDYgQEAKIAl9CiAKIAljb3VudCA9IHZteGZlcnBhZ2VfcGFja2V0LT5yYW5nZV9jbnQ7Ci0JbmV0dnNjX3BhY2tldC0+ZGV2aWNlID0gZGV2aWNlOwogCW5ldHZzY19wYWNrZXQtPmNoYW5uZWwgPSBjaGFubmVsOwogCiAJLyogRWFjaCByYW5nZSByZXByZXNlbnRzIDEgUk5ESVMgcGt0IHRoYXQgY29udGFpbnMgMSBldGhlcm5ldCBmcmFtZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzY19kcnYuYyBiL2RyaXZlcnMvbmV0L2h5cGVydi9uZXR2c2NfZHJ2LmMKaW5kZXggMTVkODJlZC4uYTNhOWQzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHlwZXJ2L25ldHZzY19kcnYuYworKysgYi9kcml2ZXJzL25ldC9oeXBlcnYvbmV0dnNjX2Rydi5jCkBAIC0yMjksMTYgKzIyOSwxNiBAQAogCXJldHVybiBxX2lkeDsKIH0KIAotc3RhdGljIHZvaWQgbmV0dnNjX3htaXRfY29tcGxldGlvbih2b2lkICpjb250ZXh0KQordm9pZCBuZXR2c2NfeG1pdF9jb21wbGV0aW9uKHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKnBhY2tldCA9IChzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqKWNvbnRleHQ7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKQogCQkodW5zaWduZWQgbG9uZylwYWNrZXQtPnNlbmRfY29tcGxldGlvbl90aWQ7Ci0JdTMyIGluZGV4ID0gcGFja2V0LT5zZW5kX2J1Zl9pbmRleDsKIAotCWtmcmVlKHBhY2tldCk7CisJaWYgKCFwYWNrZXQtPnBhcnRfb2Zfc2tiKQorCQlrZnJlZShwYWNrZXQpOwogCi0JaWYgKHNrYiAmJiAoaW5kZXggPT0gTkVUVlNDX0lOVkFMSURfSU5ERVgpKQorCWlmIChza2IpCiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiB9CiAKQEAgLTI3NywxNSArMjc3LDE2IEBACiB9CiAKIHN0YXRpYyB1MzIgaW5pdF9wYWdlX2FycmF5KHZvaWQgKmhkciwgdTMyIGxlbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgIHN0cnVjdCBodl9wYWdlX2J1ZmZlciAqcGIpCisJCQkgICBzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0KQogeworCXN0cnVjdCBodl9wYWdlX2J1ZmZlciAqcGIgPSBwYWNrZXQtPnBhZ2VfYnVmOwogCXUzMiBzbG90c191c2VkID0gMDsKIAljaGFyICpkYXRhID0gc2tiLT5kYXRhOwogCWludCBmcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7CiAJaW50IGk7CiAKIAkvKiBUaGUgcGFja2V0IGlzIGxhaWQgb3V0IHRodXM6Ci0JICogMS4gaGRyCisJICogMS4gaGRyOiBSTkRJUyBoZWFkZXIgYW5kIFBQSQogCSAqIDIuIHNrYiBsaW5lYXIgZGF0YQogCSAqIDMuIHNrYiBmcmFnbWVudCBkYXRhCiAJICovCkBAIC0yOTQsNiArMjk1LDkgQEAKIAkJCQkJb2Zmc2V0X2luX3BhZ2UoaGRyKSwKIAkJCQkJbGVuLCAmcGJbc2xvdHNfdXNlZF0pOwogCisJcGFja2V0LT5ybXNnX3NpemUgPSBsZW47CisJcGFja2V0LT5ybXNnX3BnY250ID0gc2xvdHNfdXNlZDsKKwogCXNsb3RzX3VzZWQgKz0gZmlsbF9wZ19idWYodmlydF90b19wYWdlKGRhdGEpLAogCQkJCW9mZnNldF9pbl9wYWdlKGRhdGEpLAogCQkJCXNrYl9oZWFkbGVuKHNrYiksICZwYltzbG90c191c2VkXSk7CkBAIC0zNzAsNTAgKzM3NCw3MyBAQAogc3RhdGljIGludCBuZXR2c2Nfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmV0KTsKLQlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0OworCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0ICpwYWNrZXQgPSBOVUxMOwogCWludCByZXQ7CiAJdW5zaWduZWQgaW50IG51bV9kYXRhX3BnczsKIAlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqcm5kaXNfbXNnOwogCXN0cnVjdCBybmRpc19wYWNrZXQgKnJuZGlzX3BrdDsKIAl1MzIgcm5kaXNfbXNnX3NpemU7CiAJYm9vbCBpc3ZsYW47CisJYm9vbCBsaW5lYXIgPSBmYWxzZTsKIAlzdHJ1Y3Qgcm5kaXNfcGVyX3BhY2tldF9pbmZvICpwcGk7CiAJc3RydWN0IG5kaXNfdGNwX2lwX2NoZWNrc3VtX2luZm8gKmNzdW1faW5mbzsKIAlzdHJ1Y3QgbmRpc190Y3BfbHNvX2luZm8gKmxzb19pbmZvOwogCWludCAgaGRyX29mZnNldDsKIAl1MzIgbmV0X3RyYW5zX2luZm87CiAJdTMyIGhhc2g7Ci0JdTMyIHNrYl9sZW5ndGggPSBza2ItPmxlbjsKKwl1MzIgc2tiX2xlbmd0aDsKKwl1MzIgaGVhZF9yb29tOworCXUzMiBwa3Rfc3o7CisJc3RydWN0IGh2X3BhZ2VfYnVmZmVyIHBhZ2VfYnVmW01BWF9QQUdFX0JVRkZFUl9DT1VOVF07CiAKIAogCS8qIFdlIHdpbGwgYXRtb3N0IG5lZWQgdHdvIHBhZ2VzIHRvIGRlc2NyaWJlIHRoZSBybmRpcwogCSAqIGhlYWRlci4gV2UgY2FuIG9ubHkgdHJhbnNtaXQgTUFYX1BBR0VfQlVGRkVSX0NPVU5UIG51bWJlcgotCSAqIG9mIHBhZ2VzIGluIGEgc2luZ2xlIHBhY2tldC4KKwkgKiBvZiBwYWdlcyBpbiBhIHNpbmdsZSBwYWNrZXQuIElmIHNrYiBpcyBzY2F0dGVyZWQgYXJvdW5kCisJICogbW9yZSBwYWdlcyB3ZSB0cnkgbGluZWFyaXppbmcgaXQuCiAJICovCisKK2NoZWNrX3NpemU6CisJc2tiX2xlbmd0aCA9IHNrYi0+bGVuOworCWhlYWRfcm9vbSA9IHNrYl9oZWFkcm9vbShza2IpOwogCW51bV9kYXRhX3BncyA9IG5ldHZzY19nZXRfc2xvdHMoc2tiKSArIDI7Ci0JaWYgKG51bV9kYXRhX3BncyA+IE1BWF9QQUdFX0JVRkZFUl9DT1VOVCkgewotCQluZXRkZXZfZXJyKG5ldCwgIlBhY2tldCB0b28gYmlnOiAldVxuIiwgc2tiLT5sZW4pOwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCW5ldC0+c3RhdHMudHhfZHJvcHBlZCsrOwotCQlyZXR1cm4gTkVUREVWX1RYX09LOworCWlmIChudW1fZGF0YV9wZ3MgPiBNQVhfUEFHRV9CVUZGRVJfQ09VTlQgJiYgbGluZWFyKSB7CisJCW5ldF9hbGVydF9yYXRlbGltaXRlZCgicGFja2V0IHRvbyBiaWc6ICV1IHBhZ2VzICgldSBieXRlcylcbiIsCisJCQkJICAgICAgbnVtX2RhdGFfcGdzLCBza2ItPmxlbik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZHJvcDsKKwl9IGVsc2UgaWYgKG51bV9kYXRhX3BncyA+IE1BWF9QQUdFX0JVRkZFUl9DT1VOVCkgeworCQlpZiAoc2tiX2xpbmVhcml6ZShza2IpKSB7CisJCQluZXRfYWxlcnRfcmF0ZWxpbWl0ZWQoImZhaWxlZCB0byBsaW5lYXJpemUgc2tiXG4iKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGRyb3A7CisJCX0KKwkJbGluZWFyID0gdHJ1ZTsKKwkJZ290byBjaGVja19zaXplOwogCX0KIAotCS8qIEFsbG9jYXRlIGEgbmV0dnNjIHBhY2tldCBiYXNlZCBvbiAjIG9mIGZyYWdzLiAqLwotCXBhY2tldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0KSArCi0JCQkgKG51bV9kYXRhX3BncyAqIHNpemVvZihzdHJ1Y3QgaHZfcGFnZV9idWZmZXIpKSArCi0JCQkgc2l6ZW9mKHN0cnVjdCBybmRpc19tZXNzYWdlKSArCi0JCQkgTkRJU19WTEFOX1BQSV9TSVpFICsgTkRJU19DU1VNX1BQSV9TSVpFICsKLQkJCSBORElTX0xTT19QUElfU0laRSArIE5ESVNfSEFTSF9QUElfU0laRSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwYWNrZXQpIHsKLQkJLyogb3V0IG9mIG1lbW9yeSwgZHJvcCBwYWNrZXQgKi8KLQkJbmV0ZGV2X2VycihuZXQsICJ1bmFibGUgdG8gYWxsb2NhdGUgaHZfbmV0dnNjX3BhY2tldFxuIik7CisJcGt0X3N6ID0gc2l6ZW9mKHN0cnVjdCBodl9uZXR2c2NfcGFja2V0KSArIFJORElTX0FORF9QUElfU0laRTsKIAotCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0JCW5ldC0+c3RhdHMudHhfZHJvcHBlZCsrOwotCQlyZXR1cm4gTkVUREVWX1RYX09LOworCWlmIChoZWFkX3Jvb20gPCBwa3Rfc3opIHsKKwkJcGFja2V0ID0ga21hbGxvYyhwa3Rfc3osIEdGUF9BVE9NSUMpOworCQlpZiAoIXBhY2tldCkgeworCQkJLyogb3V0IG9mIG1lbW9yeSwgZHJvcCBwYWNrZXQgKi8KKwkJCW5ldGRldl9lcnIobmV0LCAidW5hYmxlIHRvIGFsbG9jIGh2X25ldHZzY19wYWNrZXRcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCQlwYWNrZXQtPnBhcnRfb2Zfc2tiID0gZmFsc2U7CisJfSBlbHNlIHsKKwkJLyogVXNlIHRoZSBoZWFkcm9vbSBmb3IgYnVpbGRpbmcgdXAgdGhlIHBhY2tldCAqLworCQlwYWNrZXQgPSAoc3RydWN0IGh2X25ldHZzY19wYWNrZXQgKilza2ItPmhlYWQ7CisJCXBhY2tldC0+cGFydF9vZl9za2IgPSB0cnVlOwogCX0KIAorCXBhY2tldC0+c3RhdHVzID0gMDsKKwlwYWNrZXQtPnhtaXRfbW9yZSA9IHNrYi0+eG1pdF9tb3JlOworCiAJcGFja2V0LT52bGFuX3RjaSA9IHNrYi0+dmxhbl90Y2k7CisJcGFja2V0LT5wYWdlX2J1ZiA9IHBhZ2VfYnVmOwogCiAJcGFja2V0LT5xX2lkeCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOwogCkBAIC00MjEsOCArNDQ4LDkgQEAKIAlwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuID0gc2tiLT5sZW47CiAKIAlwYWNrZXQtPnJuZGlzX21zZyA9IChzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSAqKSgodW5zaWduZWQgbG9uZylwYWNrZXQgKwotCQkJCXNpemVvZihzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCkgKwotCQkJCShudW1fZGF0YV9wZ3MgKiBzaXplb2Yoc3RydWN0IGh2X3BhZ2VfYnVmZmVyKSkpOworCQkJCXNpemVvZihzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCkpOworCisJbWVtc2V0KHBhY2tldC0+cm5kaXNfbXNnLCAwLCBSTkRJU19BTkRfUFBJX1NJWkUpOwogCiAJLyogU2V0IHRoZSBjb21wbGV0aW9uIHJvdXRpbmUgKi8KIAlwYWNrZXQtPnNlbmRfY29tcGxldGlvbiA9IG5ldHZzY194bWl0X2NvbXBsZXRpb247CkBAIC01NTQsNyArNTgyLDcgQEAKIAlybmRpc19tc2ctPm1zZ19sZW4gKz0gcm5kaXNfbXNnX3NpemU7CiAJcGFja2V0LT50b3RhbF9kYXRhX2J1ZmxlbiA9IHJuZGlzX21zZy0+bXNnX2xlbjsKIAlwYWNrZXQtPnBhZ2VfYnVmX2NudCA9IGluaXRfcGFnZV9hcnJheShybmRpc19tc2csIHJuZGlzX21zZ19zaXplLAotCQkJCQlza2IsICZwYWNrZXQtPnBhZ2VfYnVmWzBdKTsKKwkJCQkJICAgICAgIHNrYiwgcGFja2V0KTsKIAogCXJldCA9IG5ldHZzY19zZW5kKG5ldF9kZXZpY2VfY3R4LT5kZXZpY2VfY3R4LCBwYWNrZXQpOwogCkBAIC01NjMsNyArNTkxLDggQEAKIAkJbmV0LT5zdGF0cy50eF9ieXRlcyArPSBza2JfbGVuZ3RoOwogCQluZXQtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAl9IGVsc2UgewotCQlrZnJlZShwYWNrZXQpOworCQlpZiAocGFja2V0ICYmICFwYWNrZXQtPnBhcnRfb2Zfc2tiKQorCQkJa2ZyZWUocGFja2V0KTsKIAkJaWYgKHJldCAhPSAtRUFHQUlOKSB7CiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJbmV0LT5zdGF0cy50eF9kcm9wcGVkKys7CkBAIC02ODcsNiArNzE2LDE5IEBACiAJc3RybGNweShpbmZvLT5md192ZXJzaW9uLCAiTi9BIiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pKTsKIH0KIAorc3RhdGljIHZvaWQgbmV0dnNjX2dldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0LAorCQkJCXN0cnVjdCBldGh0b29sX2NoYW5uZWxzICpjaGFubmVsKQoreworCXN0cnVjdCBuZXRfZGV2aWNlX2NvbnRleHQgKm5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmV0KTsKKwlzdHJ1Y3QgaHZfZGV2aWNlICpkZXYgPSBuZXRfZGV2aWNlX2N0eC0+ZGV2aWNlX2N0eDsKKwlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZkZXYgPSBodl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKG52ZGV2KSB7CisJCWNoYW5uZWwtPm1heF9jb21iaW5lZAk9IG52ZGV2LT5tYXhfY2huOworCQljaGFubmVsLT5jb21iaW5lZF9jb3VudCA9IG52ZGV2LT5udW1fY2huOworCX0KK30KKwogc3RhdGljIGludCBuZXR2c2NfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgaW50IG10dSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0ICpuZGV2Y3R4ID0gbmV0ZGV2X3ByaXYobmRldik7CkBAIC03NjAsNiArODAyLDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZXRodG9vbF9vcHMgPSB7CiAJLmdldF9kcnZpbmZvCT0gbmV0dnNjX2dldF9kcnZpbmZvLAogCS5nZXRfbGluawk9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCisJLmdldF9jaGFubmVscyAgID0gbmV0dnNjX2dldF9jaGFubmVscywKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZGV2aWNlX29wcyA9IHsKQEAgLTgzMSwxMiArODc0LDE2IEBACiAJc3RydWN0IG5ldHZzY19kZXZpY2VfaW5mbyBkZXZpY2VfaW5mbzsKIAlzdHJ1Y3QgbmV0dnNjX2RldmljZSAqbnZkZXY7CiAJaW50IHJldDsKKwl1MzIgbWF4X25lZWRlZF9oZWFkcm9vbTsKIAogCW5ldCA9IGFsbG9jX2V0aGVyZGV2X21xKHNpemVvZihzdHJ1Y3QgbmV0X2RldmljZV9jb250ZXh0KSwKIAkJCQludW1fb25saW5lX2NwdXMoKSk7CiAJaWYgKCFuZXQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJbWF4X25lZWRlZF9oZWFkcm9vbSA9IHNpemVvZihzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCkgKworCQkJICAgICAgUk5ESVNfQU5EX1BQSV9TSVpFOworCiAJbmV0aWZfY2Fycmllcl9vZmYobmV0KTsKIAogCW5ldF9kZXZpY2VfY3R4ID0gbmV0ZGV2X3ByaXYobmV0KTsKQEAgLTg1NSw2ICs5MDIsMTMgQEAKIAluZXQtPmV0aHRvb2xfb3BzID0gJmV0aHRvb2xfb3BzOwogCVNFVF9ORVRERVZfREVWKG5ldCwgJmRldi0+ZGV2aWNlKTsKIAorCS8qCisJICogUmVxdWVzdCBhZGRpdGlvbmFsIGhlYWQgcm9vbSBpbiB0aGUgc2tiLgorCSAqIFdlIHdpbGwgdXNlIHRoaXMgc3BhY2UgdG8gYnVpbGQgdGhlIHJuZGlzCisJICogaGVhc2VyIGFuZCBvdGhlciBzdGF0ZSB3ZSBuZWVkIHRvIG1haW50YWluLgorCSAqLworCW5ldC0+bmVlZGVkX2hlYWRyb29tID0gbWF4X25lZWRlZF9oZWFkcm9vbTsKKwogCS8qIE5vdGlmeSB0aGUgbmV0dnNjIGRyaXZlciBvZiB0aGUgbmV3IGRldmljZSAqLwogCWRldmljZV9pbmZvLnJpbmdfc2l6ZSA9IHJpbmdfc2l6ZTsKIAlyZXQgPSBybmRpc19maWx0ZXJfZGV2aWNlX2FkZChkZXYsICZkZXZpY2VfaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9oeXBlcnYvcm5kaXNfZmlsdGVyLmMgYi9kcml2ZXJzL25ldC9oeXBlcnYvcm5kaXNfZmlsdGVyLmMKaW5kZXggNzgxNmQ5OC4uMGQ5MmVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaHlwZXJ2L3JuZGlzX2ZpbHRlci5jCisrKyBiL2RyaXZlcnMvbmV0L2h5cGVydi9ybmRpc19maWx0ZXIuYwpAQCAtNDcsOCArNDcsNiBAQAogCiAJLyogU2ltcGxpZnkgYWxsb2NhdGlvbiBieSBoYXZpbmcgYSBuZXR2c2MgcGFja2V0IGlubGluZSAqLwogCXN0cnVjdCBodl9uZXR2c2NfcGFja2V0CXBrdDsKLQkvKiBTZXQgMiBwYWdlcyBmb3Igcm5kaXMgcmVxdWVzdHMgY3Jvc3NpbmcgcGFnZSBib3VuZGFyeSAqLwotCXN0cnVjdCBodl9wYWdlX2J1ZmZlciBidWZbMl07CiAKIAlzdHJ1Y3Qgcm5kaXNfbWVzc2FnZSByZXF1ZXN0X21zZzsKIAkvKgpAQCAtMjEwLDYgKzIwOCw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaHZfbmV0dnNjX3BhY2tldCAqcGFja2V0OworCXN0cnVjdCBodl9wYWdlX2J1ZmZlciBwYWdlX2J1ZlsyXTsKIAogCS8qIFNldHVwIHRoZSBwYWNrZXQgdG8gc2VuZCBpdCAqLwogCXBhY2tldCA9ICZyZXEtPnBrdDsKQEAgLTIxNyw2ICsyMTYsNyBAQAogCXBhY2tldC0+aXNfZGF0YV9wa3QgPSBmYWxzZTsKIAlwYWNrZXQtPnRvdGFsX2RhdGFfYnVmbGVuID0gcmVxLT5yZXF1ZXN0X21zZy5tc2dfbGVuOwogCXBhY2tldC0+cGFnZV9idWZfY250ID0gMTsKKwlwYWNrZXQtPnBhZ2VfYnVmID0gcGFnZV9idWY7CiAKIAlwYWNrZXQtPnBhZ2VfYnVmWzBdLnBmbiA9IHZpcnRfdG9fcGh5cygmcmVxLT5yZXF1ZXN0X21zZykgPj4KIAkJCQkJUEFHRV9TSElGVDsKQEAgLTIzNyw2ICsyMzcsNyBAQAogCX0KIAogCXBhY2tldC0+c2VuZF9jb21wbGV0aW9uID0gTlVMTDsKKwlwYWNrZXQtPnhtaXRfbW9yZSA9IGZhbHNlOwogCiAJcmV0ID0gbmV0dnNjX3NlbmQoZGV2LT5uZXRfZGV2LT5kZXYsIHBhY2tldCk7CiAJcmV0dXJuIHJldDsKQEAgLTg1NSw2ICs4NTYsNyBAQAogCXUzMiBzdGF0dXM7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIHQ7CisJc3RydWN0IG5ldHZzY19kZXZpY2UgKm52ZGV2ID0gZGV2LT5uZXRfZGV2OwogCiAJcmVxdWVzdCA9IGdldF9ybmRpc19yZXF1ZXN0KGRldiwgUk5ESVNfTVNHX0lOSVQsCiAJCQlSTkRJU19NRVNTQUdFX1NJWkUoc3RydWN0IHJuZGlzX2luaXRpYWxpemVfcmVxdWVzdCkpOwpAQCAtODg5LDYgKzg5MSw4IEBACiAJc3RhdHVzID0gaW5pdF9jb21wbGV0ZS0+c3RhdHVzOwogCWlmIChzdGF0dXMgPT0gUk5ESVNfU1RBVFVTX1NVQ0NFU1MpIHsKIAkJZGV2LT5zdGF0ZSA9IFJORElTX0RFVl9JTklUSUFMSVpFRDsKKwkJbnZkZXYtPm1heF9wa3QgPSBpbml0X2NvbXBsZXRlLT5tYXhfcGt0X3Blcl9tc2c7CisJCW52ZGV2LT5wa3RfYWxpZ24gPSAxIDw8IGluaXRfY29tcGxldGUtPnBrdF9hbGlnbm1lbnRfZmFjdG9yOwogCQlyZXQgPSAwOwogCX0gZWxzZSB7CiAJCWRldi0+c3RhdGUgPSBSTkRJU19ERVZfVU5JTklUSUFMSVpFRDsKQEAgLTEwMjcsNiArMTAzMSw3IEBACiAKIAkvKiBJbml0aWFsaXplIHRoZSBybmRpcyBkZXZpY2UgKi8KIAluZXRfZGV2aWNlID0gaHZfZ2V0X2RydmRhdGEoZGV2KTsKKwluZXRfZGV2aWNlLT5tYXhfY2huID0gMTsKIAluZXRfZGV2aWNlLT5udW1fY2huID0gMTsKIAogCW5ldF9kZXZpY2UtPmV4dGVuc2lvbiA9IHJuZGlzX2RldmljZTsKQEAgLTEwOTQsNiArMTA5OSw3IEBACiAJaWYgKHJldCB8fCByc3NjYXAubnVtX3JlY3ZfcXVlIDwgMikKIAkJZ290byBvdXQ7CiAKKwluZXRfZGV2aWNlLT5tYXhfY2huID0gcnNzY2FwLm51bV9yZWN2X3F1ZTsKIAluZXRfZGV2aWNlLT5udW1fY2huID0gKG51bV9vbmxpbmVfY3B1cygpIDwgcnNzY2FwLm51bV9yZWN2X3F1ZSkgPwogCQkJICAgICAgIG51bV9vbmxpbmVfY3B1cygpIDogcnNzY2FwLm51bV9yZWN2X3F1ZTsKIAlpZiAobmV0X2RldmljZS0+bnVtX2NobiA9PSAxKQpAQCAtMTEzNSwxMyArMTE0MSwxMyBAQAogCW5ldF9kZXZpY2UtPm51bV9jaG4gPSAxICsKIAkJaW5pdF9wYWNrZXQtPm1zZy52NV9tc2cuc3ViY2huX2NvbXAubnVtX3N1YmNoYW5uZWxzOwogCi0Jdm1idXNfYXJlX3N1YmNoYW5uZWxzX3ByZXNlbnQoZGV2LT5jaGFubmVsKTsKLQogCXJldCA9IHJuZGlzX2ZpbHRlcl9zZXRfcnNzX3BhcmFtKHJuZGlzX2RldmljZSwgbmV0X2RldmljZS0+bnVtX2Nobik7CiAKIG91dDoKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKKwkJbmV0X2RldmljZS0+bWF4X2NobiA9IDE7CiAJCW5ldF9kZXZpY2UtPm51bV9jaG4gPSAxOworCX0KIAlyZXR1cm4gMDsgLyogcmV0dXJuIDAgYmVjYXVzZSBwcmltYXJ5IGNoYW5uZWwgY2FuIGJlIHVzZWQgYWxvbmUgKi8KIAogZXJyX2Rldl9yZW12OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWVlZTgwMjE1NC9hdDg2cmYyMzAuYyBiL2RyaXZlcnMvbmV0L2llZWU4MDIxNTQvYXQ4NnJmMjMwLmMKaW5kZXggN2IwNTFlYS4uMzgwMjY2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaWVlZTgwMjE1NC9hdDg2cmYyMzAuYworKysgYi9kcml2ZXJzL25ldC9pZWVlODAyMTU0L2F0ODZyZjIzMC5jCkBAIC0xOSwxMSArMTksMTIgQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL2F0ODZyZjIzMC5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgpAQCAtNDYsMTkgKzQ3LDI3IEBACiAJdTE2IHRfb2ZmX3RvX3R4X29uOwogCXUxNiB0X2ZyYW1lOwogCXUxNiB0X3BfYWNrOwotCS8qIGNvbXBsZXRpb24gdGltZW91dCBmb3IgdHggaW4gbXNlY3MgKi8KLQl1MTYgdF90eF90aW1lb3V0OwogCWludCByc3NpX2Jhc2VfdmFsOwogCiAJaW50ICgqc2V0X2NoYW5uZWwpKHN0cnVjdCBhdDg2cmYyMzBfbG9jYWwgKiwgdTgsIHU4KTsKIAlpbnQgKCpnZXRfZGVzZW5zZV9zdGVwcykoc3RydWN0IGF0ODZyZjIzMF9sb2NhbCAqLCBzMzIpOwogfTsKIAotI2RlZmluZSBBVDg2UkYyWFhfTUFYX0JVRiAoMTI3ICsgMykKKyNkZWZpbmUgQVQ4NlJGMlhYX01BWF9CVUYJCSgxMjcgKyAzKQorLyogdHggcmV0cmllcyB0byBhY2Nlc3MgdGhlIFRYX09OIHN0YXRlCisgKiBpZiBpdCdzIGFib3ZlIHRoZW4gZm9yY2UgY2hhbmdlIHdpbGwgYmUgc3RhcnRlZC4KKyAqCisgKiBXZSBhc3N1bWUgdGhlIG1heF9mcmFtZV9yZXRyaWVzICg3KSB2YWx1ZSBvZiA4MDIuMTUuNCBoZXJlLgorICovCisjZGVmaW5lIEFUODZSRjJYWF9NQVhfVFhfUkVUUklFUwk3CisvKiBXZSB1c2UgdGhlIHJlY29tbWVuZGVkIDUgbWludXRlcyB0aW1lb3V0IHRvIHJlY2FsaWJyYXRlICovCisjZGVmaW5lIEFUODZSRjJYWF9DQUxfTE9PUF9USU1FT1VUCSg1ICogNjAgKiBIWikKIAogc3RydWN0IGF0ODZyZjIzMF9zdGF0ZV9jaGFuZ2UgewogCXN0cnVjdCBhdDg2cmYyMzBfbG9jYWwgKmxwOworCWludCBpcnE7CiAKKwlzdHJ1Y3QgaHJ0aW1lciB0aW1lcjsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgdHJ4OwogCXU4IGJ1ZltBVDg2UkYyWFhfTUFYX0JVRl07CkBAIC04MywxMCArOTIsMTAgQEAKIAlzdHJ1Y3QgYXQ4NnJmMjMwX3N0YXRlX2NoYW5nZSBpcnE7CiAKIAlib29sIHR4X2FyZXQ7CisJdW5zaWduZWQgbG9uZyBjYWxfdGltZW91dDsKIAlzOCBtYXhfZnJhbWVfcmV0cmllczsKIAlib29sIGlzX3R4OwotCS8qIHNwaW5sb2NrIGZvciBpc190eCBwcm90ZWN0aW9uICovCi0Jc3BpbmxvY2tfdCBsb2NrOworCXU4IHR4X3JldHJ5OwogCXN0cnVjdCBza19idWZmICp0eF9za2I7CiAJc3RydWN0IGF0ODZyZjIzMF9zdGF0ZV9jaGFuZ2UgdHg7CiB9OwpAQCAtMzEzLDcgKzMyMiw3IEBACiAJaW50IHJjOwogCiAJcmMgPSBfX2F0ODZyZjIzMF9yZWFkKGxwLCBhZGRyLCBkYXRhKTsKLQlpZiAocmMgPiAwKQorCWlmICghcmMpCiAJCSpkYXRhID0gKCpkYXRhICYgbWFzaykgPj4gc2hpZnQ7CiAKIAlyZXR1cm4gcmM7CkBAIC00MDksNiArNDE4LDggQEAKIAljYXNlIFJHX1BIWV9FRF9MRVZFTDoKIAljYXNlIFJHX0lSUV9TVEFUVVM6CiAJY2FzZSBSR19WUkVHX0NUUkw6CisJY2FzZSBSR19QTExfQ0Y6CisJY2FzZSBSR19QTExfRENVOgogCQlyZXR1cm4gdHJ1ZTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gZmFsc2U7CkBAIC00NDYsNiArNDU3LDcgQEAKIAlzdHJ1Y3QgYXQ4NnJmMjMwX3N0YXRlX2NoYW5nZSAqY3R4ID0gY29udGV4dDsKIAlzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCA9IGN0eC0+bHA7CiAKKwlscC0+aXNfdHggPSAwOwogCWF0ODZyZjIzMF9hc3luY19zdGF0ZV9jaGFuZ2UobHAsIGN0eCwgU1RBVEVfUlhfQUFDS19PTiwgTlVMTCwgZmFsc2UpOwogCWllZWU4MDIxNTRfd2FrZV9xdWV1ZShscC0+aHcpOwogfQpAQCAtNDcyLDE4ICs0ODQsMjUgQEAKIAl1OCAqdHhfYnVmID0gY3R4LT5idWY7CiAKIAl0eF9idWZbMF0gPSAocmVnICYgQ01EX1JFR19NQVNLKSB8IENNRF9SRUc7Ci0JY3R4LT50cngubGVuID0gMjsKIAljdHgtPm1zZy5jb21wbGV0ZSA9IGNvbXBsZXRlOwogCWN0eC0+aXJxX2VuYWJsZSA9IGlycV9lbmFibGU7CiAJcmMgPSBzcGlfYXN5bmMobHAtPnNwaSwgJmN0eC0+bXNnKTsKIAlpZiAocmMpIHsKIAkJaWYgKGlycV9lbmFibGUpCi0JCQllbmFibGVfaXJxKGxwLT5zcGktPmlycSk7CisJCQllbmFibGVfaXJxKGN0eC0+aXJxKTsKIAogCQlhdDg2cmYyMzBfYXN5bmNfZXJyb3IobHAsIGN0eCwgcmMpOwogCX0KIH0KIAorc3RhdGljIGlubGluZSB1OCBhdDg2cmYyMzBfc3RhdGVfdG9fZm9yY2UodTggc3RhdGUpCit7CisJaWYgKHN0YXRlID09IFNUQVRFX1RYX09OKQorCQlyZXR1cm4gU1RBVEVfRk9SQ0VfVFhfT047CisJZWxzZQorCQlyZXR1cm4gU1RBVEVfRk9SQ0VfVFJYX09GRjsKK30KKwogc3RhdGljIHZvaWQKIGF0ODZyZjIzMF9hc3luY19zdGF0ZV9hc3NlcnQodm9pZCAqY29udGV4dCkKIHsKQEAgLTUxNCwxMCArNTMzLDIxIEBACiAJCQkgKiBpbiBTVEFURV9CVVNZX1JYX0FBQ0ssIHdlIHJ1biBhIGZvcmNlIHN0YXRlIGNoYW5nZQogCQkJICogdG8gU1RBVEVfVFhfT04uIFRoaXMgaXMgYSB0aW1lb3V0IGhhbmRsaW5nLCBpZiB0aGUKIAkJCSAqIHRyYW5zY2VpdmVyIHN0dWNrcyBpbiBTVEFURV9CVVNZX1JYX0FBQ0suCisJCQkgKgorCQkJICogQWRkaXRpb25hbCB3ZSBkbyBzZXZlcmFsIHJldHJpZXMgdG8gdHJ5IHRvIGdldCBpbnRvCisJCQkgKiBUWF9PTiBzdGF0ZSB3aXRob3V0IGZvcmNpbmcuIElmIHRoZSByZXRyaWVzIGFyZQorCQkJICogaGlnaGVyIG9yIGVxdWFsIHRoYW4gQVQ4NlJGMlhYX01BWF9UWF9SRVRSSUVTIHdlCisJCQkgKiB3aWxsIGRvIGEgZm9yY2UgY2hhbmdlLgogCQkJICovCi0JCQlpZiAoY3R4LT50b19zdGF0ZSA9PSBTVEFURV9UWF9PTikgewotCQkJCWF0ODZyZjIzMF9hc3luY19zdGF0ZV9jaGFuZ2UobHAsIGN0eCwKLQkJCQkJCQkgICAgIFNUQVRFX0ZPUkNFX1RYX09OLAorCQkJaWYgKGN0eC0+dG9fc3RhdGUgPT0gU1RBVEVfVFhfT04gfHwKKwkJCSAgICBjdHgtPnRvX3N0YXRlID09IFNUQVRFX1RSWF9PRkYpIHsKKwkJCQl1OCBzdGF0ZSA9IGN0eC0+dG9fc3RhdGU7CisKKwkJCQlpZiAobHAtPnR4X3JldHJ5ID49IEFUODZSRjJYWF9NQVhfVFhfUkVUUklFUykKKwkJCQkJc3RhdGUgPSBhdDg2cmYyMzBfc3RhdGVfdG9fZm9yY2Uoc3RhdGUpOworCQkJCWxwLT50eF9yZXRyeSsrOworCisJCQkJYXQ4NnJmMjMwX2FzeW5jX3N0YXRlX2NoYW5nZShscCwgY3R4LCBzdGF0ZSwKIAkJCQkJCQkgICAgIGN0eC0+Y29tcGxldGUsCiAJCQkJCQkJICAgICBjdHgtPmlycV9lbmFibGUpOwogCQkJCXJldHVybjsKQEAgLTUzMyw2ICs1NjMsMTkgQEAKIAkJY3R4LT5jb21wbGV0ZShjb250ZXh0KTsKIH0KIAorc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGF0ODZyZjIzMF9hc3luY19zdGF0ZV90aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJc3RydWN0IGF0ODZyZjIzMF9zdGF0ZV9jaGFuZ2UgKmN0eCA9CisJCWNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IGF0ODZyZjIzMF9zdGF0ZV9jaGFuZ2UsIHRpbWVyKTsKKwlzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCA9IGN0eC0+bHA7CisKKwlhdDg2cmYyMzBfYXN5bmNfcmVhZF9yZWcobHAsIFJHX1RSWF9TVEFUVVMsIGN0eCwKKwkJCQkgYXQ4NnJmMjMwX2FzeW5jX3N0YXRlX2Fzc2VydCwKKwkJCQkgY3R4LT5pcnFfZW5hYmxlKTsKKworCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKK30KKwogLyogRG8gc3RhdGUgY2hhbmdlIHRpbWluZyBkZWxheS4gKi8KIHN0YXRpYyB2b2lkCiBhdDg2cmYyMzBfYXN5bmNfc3RhdGVfZGVsYXkodm9pZCAqY29udGV4dCkKQEAgLTU0MSw2ICs1ODQsNyBAQAogCXN0cnVjdCBhdDg2cmYyMzBfbG9jYWwgKmxwID0gY3R4LT5scDsKIAlzdHJ1Y3QgYXQ4NnJmMnh4X2NoaXBfZGF0YSAqYyA9IGxwLT5kYXRhOwogCWJvb2wgZm9yY2UgPSBmYWxzZTsKKwlrdGltZV90IHRpbTsKIAogCS8qIFRoZSBmb3JjZSBzdGF0ZSBjaGFuZ2VzIGFyZSB3aWxsIHNob3cgYXMgbm9ybWFsIHN0YXRlcyBpbiB0aGUKIAkgKiBzdGF0ZSBzdGF0dXMgc3VicmVnaXN0ZXIuIFdlIGNoYW5nZSB0aGUgdG9fc3RhdGUgdG8gdGhlCkBAIC01NjQsMTEgKzYwOCwxNSBAQAogCWNhc2UgU1RBVEVfVFJYX09GRjoKIAkJc3dpdGNoIChjdHgtPnRvX3N0YXRlKSB7CiAJCWNhc2UgU1RBVEVfUlhfQUFDS19PTjoKLQkJCXVzbGVlcF9yYW5nZShjLT50X29mZl90b19hYWNrLCBjLT50X29mZl90b19hYWNrICsgMTApOworCQkJdGltID0ga3RpbWVfc2V0KDAsIGMtPnRfb2ZmX3RvX2FhY2sgKiBOU0VDX1BFUl9VU0VDKTsKIAkJCWdvdG8gY2hhbmdlOwogCQljYXNlIFNUQVRFX1RYX09OOgotCQkJdXNsZWVwX3JhbmdlKGMtPnRfb2ZmX3RvX3R4X29uLAotCQkJCSAgICAgYy0+dF9vZmZfdG9fdHhfb24gKyAxMCk7CisJCQl0aW0gPSBrdGltZV9zZXQoMCwgYy0+dF9vZmZfdG9fdHhfb24gKiBOU0VDX1BFUl9VU0VDKTsKKwkJCS8qIHN0YXRlIGNoYW5nZSBmcm9tIFRSWF9PRkYgdG8gVFhfT04gdG8gZG8gYQorCQkJICogY2FsaWJyYXRpb24sIHdlIG5lZWQgdG8gcmVzZXQgdGhlIHRpbWVvdXQgZm9yIHRoZQorCQkJICogbmV4dCBvbmUuCisJCQkgKi8KKwkJCWxwLT5jYWxfdGltZW91dCA9IGppZmZpZXMgKyBBVDg2UkYyWFhfQ0FMX0xPT1BfVElNRU9VVDsKIAkJCWdvdG8gY2hhbmdlOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CkBAIC01NzYsMTQgKzYyNCwxNSBAQAogCQlicmVhazsKIAljYXNlIFNUQVRFX0JVU1lfUlhfQUFDSzoKIAkJc3dpdGNoIChjdHgtPnRvX3N0YXRlKSB7CisJCWNhc2UgU1RBVEVfVFJYX09GRjoKIAkJY2FzZSBTVEFURV9UWF9PTjoKIAkJCS8qIFdhaXQgZm9yIHdvcnN0IGNhc2UgcmVjZWl2aW5nIHRpbWUgaWYgd2UKIAkJCSAqIGRpZG4ndCBtYWtlIGEgZm9yY2UgY2hhbmdlIGZyb20gQlVTWV9SWF9BQUNLCi0JCQkgKiB0byBUWF9PTi4KKwkJCSAqIHRvIFRYX09OIG9yIFRSWF9PRkYuCiAJCQkgKi8KIAkJCWlmICghZm9yY2UpIHsKLQkJCQl1c2xlZXBfcmFuZ2UoYy0+dF9mcmFtZSArIGMtPnRfcF9hY2ssCi0JCQkJCSAgICAgYy0+dF9mcmFtZSArIGMtPnRfcF9hY2sgKyAxMDAwKTsKKwkJCQl0aW0gPSBrdGltZV9zZXQoMCwgKGMtPnRfZnJhbWUgKyBjLT50X3BfYWNrKSAqCisJCQkJCQkgICBOU0VDX1BFUl9VU0VDKTsKIAkJCQlnb3RvIGNoYW5nZTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtNTk1LDcgKzY0NCw3IEBACiAJY2FzZSBTVEFURV9QX09OOgogCQlzd2l0Y2ggKGN0eC0+dG9fc3RhdGUpIHsKIAkJY2FzZSBTVEFURV9UUlhfT0ZGOgotCQkJdXNsZWVwX3JhbmdlKGMtPnRfcmVzZXRfdG9fb2ZmLCBjLT50X3Jlc2V0X3RvX29mZiArIDEwKTsKKwkJCXRpbSA9IGt0aW1lX3NldCgwLCBjLT50X3Jlc2V0X3RvX29mZiAqIE5TRUNfUEVSX1VTRUMpOwogCQkJZ290byBjaGFuZ2U7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKQEAgLTYwNiwxMiArNjU1LDEwIEBACiAJfQogCiAJLyogRGVmYXVsdCBkZWxheSBpcyAxdXMgaW4gdGhlIG1vc3QgY2FzZXMgKi8KLQl1ZGVsYXkoMSk7CisJdGltID0ga3RpbWVfc2V0KDAsIE5TRUNfUEVSX1VTRUMpOwogCiBjaGFuZ2U6Ci0JYXQ4NnJmMjMwX2FzeW5jX3JlYWRfcmVnKGxwLCBSR19UUlhfU1RBVFVTLCBjdHgsCi0JCQkJIGF0ODZyZjIzMF9hc3luY19zdGF0ZV9hc3NlcnQsCi0JCQkJIGN0eC0+aXJxX2VuYWJsZSk7CisJaHJ0aW1lcl9zdGFydCgmY3R4LT50aW1lciwgdGltLCBIUlRJTUVSX01PREVfUkVMKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTY0NywxMiArNjk0LDExIEBACiAJICovCiAJYnVmWzBdID0gKFJHX1RSWF9TVEFURSAmIENNRF9SRUdfTUFTSykgfCBDTURfUkVHIHwgQ01EX1dSSVRFOwogCWJ1ZlsxXSA9IGN0eC0+dG9fc3RhdGU7Ci0JY3R4LT50cngubGVuID0gMjsKIAljdHgtPm1zZy5jb21wbGV0ZSA9IGF0ODZyZjIzMF9hc3luY19zdGF0ZV9kZWxheTsKIAlyYyA9IHNwaV9hc3luYyhscC0+c3BpLCAmY3R4LT5tc2cpOwogCWlmIChyYykgewogCQlpZiAoY3R4LT5pcnFfZW5hYmxlKQotCQkJZW5hYmxlX2lycShscC0+c3BpLT5pcnEpOworCQkJZW5hYmxlX2lycShjdHgtPmlycSk7CiAKIAkJYXQ4NnJmMjMwX2FzeW5jX2Vycm9yKGxwLCBjdHgsIHJjKTsKIAl9CkBAIC02ODksNyArNzM1LDcgQEAKIHN0YXRpYyBpbnQKIGF0ODZyZjIzMF9zeW5jX3N0YXRlX2NoYW5nZShzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCwgdW5zaWduZWQgaW50IHN0YXRlKQogewotCWludCByYzsKKwl1bnNpZ25lZCBsb25nIHJjOwogCiAJYXQ4NnJmMjMwX2FzeW5jX3N0YXRlX2NoYW5nZShscCwgJmxwLT5zdGF0ZSwgc3RhdGUsCiAJCQkJICAgICBhdDg2cmYyMzBfc3luY19zdGF0ZV9jaGFuZ2VfY29tcGxldGUsCkBAIC03MTAsMTEgKzc1NiwxMCBAQAogewogCXN0cnVjdCBhdDg2cmYyMzBfc3RhdGVfY2hhbmdlICpjdHggPSBjb250ZXh0OwogCXN0cnVjdCBhdDg2cmYyMzBfbG9jYWwgKmxwID0gY3R4LT5scDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gbHAtPnR4X3NrYjsKIAotCWVuYWJsZV9pcnEobHAtPnNwaS0+aXJxKTsKKwllbmFibGVfaXJxKGN0eC0+aXJxKTsKIAotCWllZWU4MDIxNTRfeG1pdF9jb21wbGV0ZShscC0+aHcsIHNrYiwgIWxwLT50eF9hcmV0KTsKKwlpZWVlODAyMTU0X3htaXRfY29tcGxldGUobHAtPmh3LCBscC0+dHhfc2tiLCAhbHAtPnR4X2FyZXQpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtNzIzLDcgKzc2OCw3IEBACiAJc3RydWN0IGF0ODZyZjIzMF9zdGF0ZV9jaGFuZ2UgKmN0eCA9IGNvbnRleHQ7CiAJc3RydWN0IGF0ODZyZjIzMF9sb2NhbCAqbHAgPSBjdHgtPmxwOwogCi0JYXQ4NnJmMjMwX2FzeW5jX3N0YXRlX2NoYW5nZShscCwgJmxwLT5pcnEsIFNUQVRFX1JYX0FBQ0tfT04sCisJYXQ4NnJmMjMwX2FzeW5jX3N0YXRlX2NoYW5nZShscCwgY3R4LCBTVEFURV9SWF9BQUNLX09OLAogCQkJCSAgICAgYXQ4NnJmMjMwX3R4X2NvbXBsZXRlLCB0cnVlKTsKIH0KIApAQCAtNzY3LDE0ICs4MTIsMjUgQEAKIH0KIAogc3RhdGljIHZvaWQKLWF0ODZyZjIzMF9yeChzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCwKLQkgICAgIGNvbnN0IHU4ICpkYXRhLCBjb25zdCB1OCBsZW4sIGNvbnN0IHU4IGxxaSkKK2F0ODZyZjIzMF9yeF9yZWFkX2ZyYW1lX2NvbXBsZXRlKHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgYXQ4NnJmMjMwX3N0YXRlX2NoYW5nZSAqY3R4ID0gY29udGV4dDsKKwlzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCA9IGN0eC0+bHA7CiAJdTggcnhfbG9jYWxfYnVmW0FUODZSRjJYWF9NQVhfQlVGXTsKKwljb25zdCB1OCAqYnVmID0gY3R4LT5idWY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCBsZW4sIGxxaTsKIAotCW1lbWNweShyeF9sb2NhbF9idWYsIGRhdGEsIGxlbik7Ci0JZW5hYmxlX2lycShscC0+c3BpLT5pcnEpOworCWxlbiA9IGJ1ZlsxXTsKKwlpZiAoIWllZWU4MDIxNTRfaXNfdmFsaWRfcHNkdV9sZW4obGVuKSkgeworCQlkZXZfdmRiZygmbHAtPnNwaS0+ZGV2LCAiY29ycnVwdGVkIGZyYW1lIHJlY2VpdmVkXG4iKTsKKwkJbGVuID0gSUVFRTgwMjE1NF9NVFU7CisJfQorCWxxaSA9IGJ1ZlsyICsgbGVuXTsKKworCW1lbWNweShyeF9sb2NhbF9idWYsIGJ1ZiArIDIsIGxlbik7CisJY3R4LT50cngubGVuID0gMjsKKwllbmFibGVfaXJxKGN0eC0+aXJxKTsKIAogCXNrYiA9IGRldl9hbGxvY19za2IoSUVFRTgwMjE1NF9NVFUpOwogCWlmICghc2tiKSB7CkBAIC03ODcsNjAgKzg0Myw0MSBAQAogfQogCiBzdGF0aWMgdm9pZAotYXQ4NnJmMjMwX3J4X3JlYWRfZnJhbWVfY29tcGxldGUodm9pZCAqY29udGV4dCkKK2F0ODZyZjIzMF9yeF9yZWFkX2ZyYW1lKHZvaWQgKmNvbnRleHQpCiB7CiAJc3RydWN0IGF0ODZyZjIzMF9zdGF0ZV9jaGFuZ2UgKmN0eCA9IGNvbnRleHQ7CiAJc3RydWN0IGF0ODZyZjIzMF9sb2NhbCAqbHAgPSBjdHgtPmxwOwotCWNvbnN0IHU4ICpidWYgPSBscC0+aXJxLmJ1ZjsKLQl1OCBsZW4gPSBidWZbMV07Ci0KLQlpZiAoIWllZWU4MDIxNTRfaXNfdmFsaWRfcHNkdV9sZW4obGVuKSkgewotCQlkZXZfdmRiZygmbHAtPnNwaS0+ZGV2LCAiY29ycnVwdGVkIGZyYW1lIHJlY2VpdmVkXG4iKTsKLQkJbGVuID0gSUVFRTgwMjE1NF9NVFU7Ci0JfQotCi0JYXQ4NnJmMjMwX3J4KGxwLCBidWYgKyAyLCBsZW4sIGJ1ZlsyICsgbGVuXSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hdDg2cmYyMzBfcnhfcmVhZF9mcmFtZShzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCkKLXsKKwl1OCAqYnVmID0gY3R4LT5idWY7CiAJaW50IHJjOwogCi0JdTggKmJ1ZiA9IGxwLT5pcnEuYnVmOwotCiAJYnVmWzBdID0gQ01EX0ZCOwotCWxwLT5pcnEudHJ4LmxlbiA9IEFUODZSRjJYWF9NQVhfQlVGOwotCWxwLT5pcnEubXNnLmNvbXBsZXRlID0gYXQ4NnJmMjMwX3J4X3JlYWRfZnJhbWVfY29tcGxldGU7Ci0JcmMgPSBzcGlfYXN5bmMobHAtPnNwaSwgJmxwLT5pcnEubXNnKTsKKwljdHgtPnRyeC5sZW4gPSBBVDg2UkYyWFhfTUFYX0JVRjsKKwljdHgtPm1zZy5jb21wbGV0ZSA9IGF0ODZyZjIzMF9yeF9yZWFkX2ZyYW1lX2NvbXBsZXRlOworCXJjID0gc3BpX2FzeW5jKGxwLT5zcGksICZjdHgtPm1zZyk7CiAJaWYgKHJjKSB7Ci0JCWVuYWJsZV9pcnEobHAtPnNwaS0+aXJxKTsKLQkJYXQ4NnJmMjMwX2FzeW5jX2Vycm9yKGxwLCAmbHAtPmlycSwgcmMpOworCQljdHgtPnRyeC5sZW4gPSAyOworCQllbmFibGVfaXJxKGN0eC0+aXJxKTsKKwkJYXQ4NnJmMjMwX2FzeW5jX2Vycm9yKGxwLCBjdHgsIHJjKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkCiBhdDg2cmYyMzBfcnhfdHJhY19jaGVjayh2b2lkICpjb250ZXh0KQogewotCXN0cnVjdCBhdDg2cmYyMzBfc3RhdGVfY2hhbmdlICpjdHggPSBjb250ZXh0OwotCXN0cnVjdCBhdDg2cmYyMzBfbG9jYWwgKmxwID0gY3R4LT5scDsKLQogCS8qIFBvc3NpYmxlIGNoZWNrIG9uIHRyYWMgc3RhdHVzIGhlcmUuIFRoaXMgY291bGQgYmUgdXNlZnVsIHRvIG1ha2UKIAkgKiBzb21lIHN0YXRzIHdoeSByZWNlaXZlIGlzIGZhaWxlZC4gTm90IHVzZWQgYXQgdGhlIG1vbWVudCwgYnV0IGl0J3MKIAkgKiBtYXliZSB0aW1pbmcgcmVsZXZhbnQuIERhdGFzaGVldCBkb2Vzbid0IHNheSBhbnl0aGluZyBhYm91dCB0aGlzLgogCSAqIFRoZSBwcm9ncmFtbWluZyBndWlkZSBzYXkgZG8gaXQgc28uCiAJICovCiAKLQlhdDg2cmYyMzBfcnhfcmVhZF9mcmFtZShscCk7CisJYXQ4NnJmMjMwX3J4X3JlYWRfZnJhbWUoY29udGV4dCk7CiB9CiAKIHN0YXRpYyB2b2lkCiBhdDg2cmYyMzBfaXJxX3RyeF9lbmQoc3RydWN0IGF0ODZyZjIzMF9sb2NhbCAqbHApCiB7Ci0Jc3Bpbl9sb2NrKCZscC0+bG9jayk7CiAJaWYgKGxwLT5pc190eCkgewogCQlscC0+aXNfdHggPSAwOwotCQlzcGluX3VubG9jaygmbHAtPmxvY2spOwogCiAJCWlmIChscC0+dHhfYXJldCkKIAkJCWF0ODZyZjIzMF9hc3luY19zdGF0ZV9jaGFuZ2UobHAsICZscC0+aXJxLApAQCAtODUzLDcgKzg5MCw2IEBACiAJCQkJCQkgICAgIGF0ODZyZjIzMF90eF9jb21wbGV0ZSwKIAkJCQkJCSAgICAgdHJ1ZSk7CiAJfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKIAkJYXQ4NnJmMjMwX2FzeW5jX3JlYWRfcmVnKGxwLCBSR19UUlhfU1RBVEUsICZscC0+aXJxLAogCQkJCQkgYXQ4NnJmMjMwX3J4X3RyYWNfY2hlY2ssIHRydWUpOwogCX0KQEAgLTg2NCwxMyArOTAwLDEzIEBACiB7CiAJc3RydWN0IGF0ODZyZjIzMF9zdGF0ZV9jaGFuZ2UgKmN0eCA9IGNvbnRleHQ7CiAJc3RydWN0IGF0ODZyZjIzMF9sb2NhbCAqbHAgPSBjdHgtPmxwOwotCWNvbnN0IHU4ICpidWYgPSBscC0+aXJxLmJ1ZjsKKwljb25zdCB1OCAqYnVmID0gY3R4LT5idWY7CiAJY29uc3QgdTggaXJxID0gYnVmWzFdOwogCiAJaWYgKGlycSAmIElSUV9UUlhfRU5EKSB7CiAJCWF0ODZyZjIzMF9pcnFfdHJ4X2VuZChscCk7CiAJfSBlbHNlIHsKLQkJZW5hYmxlX2lycShscC0+c3BpLT5pcnEpOworCQllbmFibGVfaXJxKGN0eC0+aXJxKTsKIAkJZGV2X2VycigmbHAtPnNwaS0+ZGV2LCAibm90IHN1cHBvcnRlZCBpcnEgJTAyeCByZWNlaXZlZFxuIiwKIAkJCWlycSk7CiAJfQpAQCAtODg2LDcgKzkyMiw2IEBACiAJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CiAKIAlidWZbMF0gPSAoUkdfSVJRX1NUQVRVUyAmIENNRF9SRUdfTUFTSykgfCBDTURfUkVHOwotCWN0eC0+dHJ4LmxlbiA9IDI7CiAJY3R4LT5tc2cuY29tcGxldGUgPSBhdDg2cmYyMzBfaXJxX3N0YXR1czsKIAlyYyA9IHNwaV9hc3luYyhscC0+c3BpLCAmY3R4LT5tc2cpOwogCWlmIChyYykgewpAQCAtOTIxLDIxICs5NTYsMjEgQEAKIAlzdHJ1Y3QgYXQ4NnJmMjMwX3N0YXRlX2NoYW5nZSAqY3R4ID0gY29udGV4dDsKIAlzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCA9IGN0eC0+bHA7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGxwLT50eF9za2I7Ci0JdTggKmJ1ZiA9IGxwLT50eC5idWY7CisJdTggKmJ1ZiA9IGN0eC0+YnVmOwogCWludCByYzsKIAotCXNwaW5fbG9jaygmbHAtPmxvY2spOwogCWxwLT5pc190eCA9IDE7Ci0Jc3Bpbl91bmxvY2soJmxwLT5sb2NrKTsKIAogCWJ1ZlswXSA9IENNRF9GQiB8IENNRF9XUklURTsKIAlidWZbMV0gPSBza2ItPmxlbiArIDI7CiAJbWVtY3B5KGJ1ZiArIDIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwotCWxwLT50eC50cngubGVuID0gc2tiLT5sZW4gKyAyOwotCWxwLT50eC5tc2cuY29tcGxldGUgPSBhdDg2cmYyMzBfd3JpdGVfZnJhbWVfY29tcGxldGU7Ci0JcmMgPSBzcGlfYXN5bmMobHAtPnNwaSwgJmxwLT50eC5tc2cpOwotCWlmIChyYykKKwljdHgtPnRyeC5sZW4gPSBza2ItPmxlbiArIDI7CisJY3R4LT5tc2cuY29tcGxldGUgPSBhdDg2cmYyMzBfd3JpdGVfZnJhbWVfY29tcGxldGU7CisJcmMgPSBzcGlfYXN5bmMobHAtPnNwaSwgJmN0eC0+bXNnKTsKKwlpZiAocmMpIHsKKwkJY3R4LT50cngubGVuID0gMjsKIAkJYXQ4NnJmMjMwX2FzeW5jX2Vycm9yKGxwLCBjdHgsIHJjKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC05NDgsMjQgKzk4Myw0NSBAQAogCQkJCSAgICAgYXQ4NnJmMjMwX3dyaXRlX2ZyYW1lLCBmYWxzZSk7CiB9CiAKLXN0YXRpYyBpbnQKLWF0ODZyZjIzMF94bWl0KHN0cnVjdCBpZWVlODAyMTU0X2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkCithdDg2cmYyMzBfeG1pdF9zdGFydCh2b2lkICpjb250ZXh0KQogewotCXN0cnVjdCBhdDg2cmYyMzBfbG9jYWwgKmxwID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0ODZyZjIzMF9zdGF0ZV9jaGFuZ2UgKmN0eCA9ICZscC0+dHg7Ci0KLQl2b2lkICgqdHhfY29tcGxldGUpKHZvaWQgKmNvbnRleHQpID0gYXQ4NnJmMjMwX3dyaXRlX2ZyYW1lOwotCi0JbHAtPnR4X3NrYiA9IHNrYjsKKwlzdHJ1Y3QgYXQ4NnJmMjMwX3N0YXRlX2NoYW5nZSAqY3R4ID0gY29udGV4dDsKKwlzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCA9IGN0eC0+bHA7CiAKIAkvKiBJbiBBUkVUIG1vZGUgd2UgbmVlZCB0byBnbyBpbnRvIFNUQVRFX1RYX0FSRVRfT04gYWZ0ZXIgd2UKIAkgKiBhcmUgaW4gU1RBVEVfVFhfT04uIFRoZSBwZmFkIGRpZmZlcnMgaGVyZSwgc28gd2UgY2hhbmdlCiAJICogdGhlIGNvbXBsZXRlIGhhbmRsZXIuCiAJICovCiAJaWYgKGxwLT50eF9hcmV0KQotCQl0eF9jb21wbGV0ZSA9IGF0ODZyZjIzMF94bWl0X3R4X29uOworCQlhdDg2cmYyMzBfYXN5bmNfc3RhdGVfY2hhbmdlKGxwLCBjdHgsIFNUQVRFX1RYX09OLAorCQkJCQkgICAgIGF0ODZyZjIzMF94bWl0X3R4X29uLCBmYWxzZSk7CisJZWxzZQorCQlhdDg2cmYyMzBfYXN5bmNfc3RhdGVfY2hhbmdlKGxwLCBjdHgsIFNUQVRFX1RYX09OLAorCQkJCQkgICAgIGF0ODZyZjIzMF93cml0ZV9mcmFtZSwgZmFsc2UpOworfQogCi0JYXQ4NnJmMjMwX2FzeW5jX3N0YXRlX2NoYW5nZShscCwgY3R4LCBTVEFURV9UWF9PTiwgdHhfY29tcGxldGUsIGZhbHNlKTsKK3N0YXRpYyBpbnQKK2F0ODZyZjIzMF94bWl0KHN0cnVjdCBpZWVlODAyMTU0X2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCA9IGh3LT5wcml2OworCXN0cnVjdCBhdDg2cmYyMzBfc3RhdGVfY2hhbmdlICpjdHggPSAmbHAtPnR4OworCisJbHAtPnR4X3NrYiA9IHNrYjsKKwlscC0+dHhfcmV0cnkgPSAwOworCisJLyogQWZ0ZXIgNSBtaW51dGVzIGluIFBMTCBhbmQgdGhlIHNhbWUgZnJlcXVlbmN5IHdlIHJ1biBhZ2FpbiB0aGUKKwkgKiBjYWxpYnJhdGlvbiBsb29wcyB3aGljaCBpcyByZWNvbW1lbmRlZCBieSBhdDg2cmYyeHggZGF0YXNoZWV0cy4KKwkgKgorCSAqIFRoZSBjYWxpYnJhdGlvbiBpcyBpbml0aWF0ZSBieSBhIHN0YXRlIGNoYW5nZSBmcm9tIFRSWF9PRkYKKwkgKiB0byBUWF9PTiwgdGhlIGxwLT5jYWxfdGltZW91dCBzaG91bGQgYmUgcmVpbml0IGJ5IHN0YXRlX2RlbGF5CisJICogZnVuY3Rpb24gdGhlbiB0byBzdGFydCBpbiB0aGUgbmV4dCA1IG1pbnV0ZXMuCisJICovCisJaWYgKHRpbWVfaXNfYmVmb3JlX2ppZmZpZXMobHAtPmNhbF90aW1lb3V0KSkKKwkJYXQ4NnJmMjMwX2FzeW5jX3N0YXRlX2NoYW5nZShscCwgY3R4LCBTVEFURV9UUlhfT0ZGLAorCQkJCQkgICAgIGF0ODZyZjIzMF94bWl0X3N0YXJ0LCBmYWxzZSk7CisJZWxzZQorCQlhdDg2cmYyMzBfeG1pdF9zdGFydChjdHgpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC05ODEsNiArMTAzNyw5IEBACiBzdGF0aWMgaW50CiBhdDg2cmYyMzBfc3RhcnQoc3RydWN0IGllZWU4MDIxNTRfaHcgKmh3KQogeworCXN0cnVjdCBhdDg2cmYyMzBfbG9jYWwgKmxwID0gaHctPnByaXY7CisKKwlscC0+Y2FsX3RpbWVvdXQgPSBqaWZmaWVzICsgQVQ4NlJGMlhYX0NBTF9MT09QX1RJTUVPVVQ7CiAJcmV0dXJuIGF0ODZyZjIzMF9zeW5jX3N0YXRlX2NoYW5nZShody0+cHJpdiwgU1RBVEVfUlhfQUFDS19PTik7CiB9CiAKQEAgLTEwNjEsNiArMTEyMCw4IEBACiAJLyogV2FpdCBmb3IgUExMICovCiAJdXNsZWVwX3JhbmdlKGxwLT5kYXRhLT50X2NoYW5uZWxfc3dpdGNoLAogCQkgICAgIGxwLT5kYXRhLT50X2NoYW5uZWxfc3dpdGNoICsgMTApOworCisJbHAtPmNhbF90aW1lb3V0ID0gamlmZmllcyArIEFUODZSRjJYWF9DQUxfTE9PUF9USU1FT1VUOwogCXJldHVybiByYzsKIH0KIApAQCAtMTExMiw3ICsxMTczLDcgQEAKIH0KIAogc3RhdGljIGludAotYXQ4NnJmMjMwX3NldF90eHBvd2VyKHN0cnVjdCBpZWVlODAyMTU0X2h3ICpodywgaW50IGRiKQorYXQ4NnJmMjMwX3NldF90eHBvd2VyKHN0cnVjdCBpZWVlODAyMTU0X2h3ICpodywgczggZGIpCiB7CiAJc3RydWN0IGF0ODZyZjIzMF9sb2NhbCAqbHAgPSBody0+cHJpdjsKIApAQCAtMTI4MSw3ICsxMzQyLDYgQEAKIAkudF9vZmZfdG9fdHhfb24gPSA4MCwKIAkudF9mcmFtZSA9IDQwOTYsCiAJLnRfcF9hY2sgPSA1NDUsCi0JLnRfdHhfdGltZW91dCA9IDIwMDAsCiAJLnJzc2lfYmFzZV92YWwgPSAtOTEsCiAJLnNldF9jaGFubmVsID0gYXQ4NnJmMjN4X3NldF9jaGFubmVsLAogCS5nZXRfZGVzZW5zZV9zdGVwcyA9IGF0ODZyZjIzeF9nZXRfZGVzZW5zX3N0ZXBzCkBAIC0xMjk1LDcgKzEzNTUsNiBAQAogCS50X29mZl90b190eF9vbiA9IDExMCwKIAkudF9mcmFtZSA9IDQwOTYsCiAJLnRfcF9hY2sgPSA1NDUsCi0JLnRfdHhfdGltZW91dCA9IDIwMDAsCiAJLnJzc2lfYmFzZV92YWwgPSAtOTEsCiAJLnNldF9jaGFubmVsID0gYXQ4NnJmMjN4X3NldF9jaGFubmVsLAogCS5nZXRfZGVzZW5zZV9zdGVwcyA9IGF0ODZyZjIzeF9nZXRfZGVzZW5zX3N0ZXBzCkBAIC0xMzA5LDEzICsxMzY4LDEyIEBACiAJLnRfb2ZmX3RvX3R4X29uID0gMjAwLAogCS50X2ZyYW1lID0gNDA5NiwKIAkudF9wX2FjayA9IDU0NSwKLQkudF90eF90aW1lb3V0ID0gMjAwMCwKIAkucnNzaV9iYXNlX3ZhbCA9IC0xMDAsCiAJLnNldF9jaGFubmVsID0gYXQ4NnJmMjEyX3NldF9jaGFubmVsLAogCS5nZXRfZGVzZW5zZV9zdGVwcyA9IGF0ODZyZjIxMl9nZXRfZGVzZW5zX3N0ZXBzCiB9OwogCi1zdGF0aWMgaW50IGF0ODZyZjIzMF9od19pbml0KHN0cnVjdCBhdDg2cmYyMzBfbG9jYWwgKmxwKQorc3RhdGljIGludCBhdDg2cmYyMzBfaHdfaW5pdChzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCwgdTggeHRhbF90cmltKQogewogCWludCByYywgaXJxX3R5cGUsIGlycV9wb2wgPSBJUlFfQUNUSVZFX0hJR0g7CiAJdW5zaWduZWQgaW50IGR2ZGQ7CkBAIC0xMzI2LDcgKzEzODQsMTIgQEAKIAkJcmV0dXJuIHJjOwogCiAJaXJxX3R5cGUgPSBpcnFfZ2V0X3RyaWdnZXJfdHlwZShscC0+c3BpLT5pcnEpOwotCWlmIChpcnFfdHlwZSA9PSBJUlFfVFlQRV9FREdFX0ZBTExJTkcpCisJaWYgKGlycV90eXBlID09IElSUV9UWVBFX0VER0VfUklTSU5HIHx8CisJICAgIGlycV90eXBlID09IElSUV9UWVBFX0VER0VfRkFMTElORykKKwkJZGV2X3dhcm4oJmxwLT5zcGktPmRldiwKKwkJCSAiVXNpbmcgZWRnZSB0cmlnZ2VyZWQgaXJxJ3MgYXJlIG5vdCByZWNvbW1lbmRlZCFcbiIpOworCWlmIChpcnFfdHlwZSA9PSBJUlFfVFlQRV9FREdFX0ZBTExJTkcgfHwKKwkgICAgaXJxX3R5cGUgPT0gSVJRX1RZUEVfTEVWRUxfTE9XKQogCQlpcnFfcG9sID0gSVJRX0FDVElWRV9MT1c7CiAKIAlyYyA9IGF0ODZyZjIzMF93cml0ZV9zdWJyZWcobHAsIFNSX0lSUV9QT0xBUklUWSwgaXJxX3BvbCk7CkBAIC0xMzQxLDYgKzE0MDQsMTEgQEAKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAorCS8qIHJlc2V0IHZhbHVlcyBkaWZmZXJzIGluIGF0ODZyZjIzMSBhbmQgYXQ4NnJmMjMzICovCisJcmMgPSBhdDg2cmYyMzBfd3JpdGVfc3VicmVnKGxwLCBTUl9JUlFfTUFTS19NT0RFLCAwKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKwogCWdldF9yYW5kb21fYnl0ZXMoY3NtYV9zZWVkLCBBUlJBWV9TSVpFKGNzbWFfc2VlZCkpOwogCXJjID0gYXQ4NnJmMjMwX3dyaXRlX3N1YnJlZyhscCwgU1JfQ1NNQV9TRUVEXzAsIGNzbWFfc2VlZFswXSk7CiAJaWYgKHJjKQpAQCAtMTM2Miw2ICsxNDMwLDQ1IEBACiAJdXNsZWVwX3JhbmdlKGxwLT5kYXRhLT50X3NsZWVwX2N5Y2xlLAogCQkgICAgIGxwLT5kYXRhLT50X3NsZWVwX2N5Y2xlICsgMTAwKTsKIAorCS8qIHh0YWxfdHJpbSB2YWx1ZSBpcyBjYWxjdWxhdGVkIGJ5OgorCSAqIENMID0gMC41ICogKENYICsgQ1RSSU0gKyBDUEFSKQorCSAqCisJICogd2hlcmVhczoKKwkgKiBDTCA9IGNhcGFjaXRvciBvZiB1c2VkIGNyeXN0YWwKKwkgKiBDWCA9IGNvbm5lY3RlZCBjYXBhY2l0b3JzIGF0IHh0YWwgcGlucworCSAqIENQQVIgPSBpbiBhbGwgYXQ4NnJmMnh4IGRhdGFzaGVldHMgdGhpcyBpcyBhIGNvbnN0YW50IHZhbHVlIDMgcEYsCisJICoJICBidXQgdGhpcyBpcyBkaWZmZXJlbnQgb24gZWFjaCBib2FyZCBzZXR1cC4gWW91IG5lZWQgdG8gZmluZQorCSAqCSAgdHVuaW5nIHRoaXMgdmFsdWUgdmlhIENUUklNLgorCSAqIENUUklNID0gdmFyaWFibGUgY2FwYWNpdG9yIHNldHRpbmcuIFJlc29sdXRpb24gaXMgMC4zIHBGIHJhbmdlIGlzCisJICoJICAgMCBwRiB1cHRvIDQuNSBwRi4KKwkgKgorCSAqIEV4YW1wbGVzOgorCSAqIGF0YmVuIHRyYW5zY2VpdmVyOgorCSAqCisJICogQ0wgPSA4IHBGCisJICogQ1ggPSAxMiBwRgorCSAqIENQQVIgPSAzIHBGIChXZSBhc3N1bWUgdGhlIG1hZ2ljIGNvbnN0YW50IGZyb20gZGF0YXNoZWV0KQorCSAqIENUUklNID0gMC45IHBGCisJICoKKwkgKiAoMTIrMC45KzMpLzIgPSA3Ljk1IHdoaWNoIGlzIG5lYXJseSBhdCA4IHBGCisJICoKKwkgKiB4dGFsX3RyaW0gPSAweDMKKwkgKgorCSAqIG9wZW5sYWJzIHRyYW5zY2VpdmVyOgorCSAqCisJICogQ0wgPSAxNiBwRgorCSAqIENYID0gMjIgcEYKKwkgKiBDUEFSID0gMyBwRiAoV2UgYXNzdW1lIHRoZSBtYWdpYyBjb25zdGFudCBmcm9tIGRhdGFzaGVldCkKKwkgKiBDVFJJTSA9IDQuNSBwRgorCSAqCisJICogKDIyKzQuNSszKS8yID0gMTQuNzUgd2hpY2ggaXMgdGhlIG5lYXJlc3QgdmFsdWUgdG8gMTYgcEYKKwkgKgorCSAqIHh0YWxfdHJpbSA9IDB4ZgorCSAqLworCXJjID0gYXQ4NnJmMjMwX3dyaXRlX3N1YnJlZyhscCwgU1JfWFRBTF9UUklNLCB4dGFsX3RyaW0pOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCiAJcmMgPSBhdDg2cmYyMzBfcmVhZF9zdWJyZWcobHAsIFNSX0RWRERfT0ssICZkdmRkKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKQEAgLTEzNzcsMjQgKzE0ODQsMzAgQEAKIAlyZXR1cm4gYXQ4NnJmMjMwX3dyaXRlX3N1YnJlZyhscCwgU1JfU0xPVFRFRF9PUEVSQVRJT04sIDApOwogfQogCi1zdGF0aWMgc3RydWN0IGF0ODZyZjIzMF9wbGF0Zm9ybV9kYXRhICoKLWF0ODZyZjIzMF9nZXRfcGRhdGEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3N0YXRpYyBpbnQKK2F0ODZyZjIzMF9nZXRfcGRhdGEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgaW50ICpyc3RuLCBpbnQgKnNscF90ciwKKwkJICAgIHU4ICp4dGFsX3RyaW0pCiB7Ci0Jc3RydWN0IGF0ODZyZjIzMF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgYXQ4NnJmMjMwX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0OwogCi0JaWYgKCFJU19FTkFCTEVEKENPTkZJR19PRikgfHwgIXNwaS0+ZGV2Lm9mX25vZGUpCi0JCXJldHVybiBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCWlmICghSVNfRU5BQkxFRChDT05GSUdfT0YpIHx8ICFzcGktPmRldi5vZl9ub2RlKSB7CisJCWlmICghcGRhdGEpCisJCQlyZXR1cm4gLUVOT0VOVDsKIAotCXBkYXRhID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpwZGF0YSksIEdGUF9LRVJORUwpOwotCWlmICghcGRhdGEpCi0JCWdvdG8gZG9uZTsKKwkJKnJzdG4gPSBwZGF0YS0+cnN0bjsKKwkJKnNscF90ciA9IHBkYXRhLT5zbHBfdHI7CisJCSp4dGFsX3RyaW0gPSBwZGF0YS0+eHRhbF90cmltOworCQlyZXR1cm4gMDsKKwl9CiAKLQlwZGF0YS0+cnN0biA9IG9mX2dldF9uYW1lZF9ncGlvKHNwaS0+ZGV2Lm9mX25vZGUsICJyZXNldC1ncGlvIiwgMCk7Ci0JcGRhdGEtPnNscF90ciA9IG9mX2dldF9uYW1lZF9ncGlvKHNwaS0+ZGV2Lm9mX25vZGUsICJzbGVlcC1ncGlvIiwgMCk7CisJKnJzdG4gPSBvZl9nZXRfbmFtZWRfZ3BpbyhzcGktPmRldi5vZl9ub2RlLCAicmVzZXQtZ3BpbyIsIDApOworCSpzbHBfdHIgPSBvZl9nZXRfbmFtZWRfZ3BpbyhzcGktPmRldi5vZl9ub2RlLCAic2xlZXAtZ3BpbyIsIDApOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTgoc3BpLT5kZXYub2Zfbm9kZSwgInh0YWwtdHJpbSIsIHh0YWxfdHJpbSk7CisJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FSU5WQUwpCisJCXJldHVybiByZXQ7CiAKLQlzcGktPmRldi5wbGF0Zm9ybV9kYXRhID0gcGRhdGE7Ci1kb25lOgotCXJldHVybiBwZGF0YTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludApAQCAtMTQ3OCw2NiArMTU5MSw3OCBAQAogYXQ4NnJmMjMwX3NldHVwX3NwaV9tZXNzYWdlcyhzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscCkKIHsKIAlscC0+c3RhdGUubHAgPSBscDsKKwlscC0+c3RhdGUuaXJxID0gbHAtPnNwaS0+aXJxOwogCXNwaV9tZXNzYWdlX2luaXQoJmxwLT5zdGF0ZS5tc2cpOwogCWxwLT5zdGF0ZS5tc2cuY29udGV4dCA9ICZscC0+c3RhdGU7CisJbHAtPnN0YXRlLnRyeC5sZW4gPSAyOwogCWxwLT5zdGF0ZS50cngudHhfYnVmID0gbHAtPnN0YXRlLmJ1ZjsKIAlscC0+c3RhdGUudHJ4LnJ4X2J1ZiA9IGxwLT5zdGF0ZS5idWY7CiAJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJmxwLT5zdGF0ZS50cngsICZscC0+c3RhdGUubXNnKTsKKwlocnRpbWVyX2luaXQoJmxwLT5zdGF0ZS50aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKKwlscC0+c3RhdGUudGltZXIuZnVuY3Rpb24gPSBhdDg2cmYyMzBfYXN5bmNfc3RhdGVfdGltZXI7CiAKIAlscC0+aXJxLmxwID0gbHA7CisJbHAtPmlycS5pcnEgPSBscC0+c3BpLT5pcnE7CiAJc3BpX21lc3NhZ2VfaW5pdCgmbHAtPmlycS5tc2cpOwogCWxwLT5pcnEubXNnLmNvbnRleHQgPSAmbHAtPmlycTsKKwlscC0+aXJxLnRyeC5sZW4gPSAyOwogCWxwLT5pcnEudHJ4LnR4X2J1ZiA9IGxwLT5pcnEuYnVmOwogCWxwLT5pcnEudHJ4LnJ4X2J1ZiA9IGxwLT5pcnEuYnVmOwogCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZscC0+aXJxLnRyeCwgJmxwLT5pcnEubXNnKTsKKwlocnRpbWVyX2luaXQoJmxwLT5pcnEudGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJbHAtPmlycS50aW1lci5mdW5jdGlvbiA9IGF0ODZyZjIzMF9hc3luY19zdGF0ZV90aW1lcjsKIAogCWxwLT50eC5scCA9IGxwOworCWxwLT50eC5pcnEgPSBscC0+c3BpLT5pcnE7CiAJc3BpX21lc3NhZ2VfaW5pdCgmbHAtPnR4Lm1zZyk7CiAJbHAtPnR4Lm1zZy5jb250ZXh0ID0gJmxwLT50eDsKKwlscC0+dHgudHJ4LmxlbiA9IDI7CiAJbHAtPnR4LnRyeC50eF9idWYgPSBscC0+dHguYnVmOwogCWxwLT50eC50cngucnhfYnVmID0gbHAtPnR4LmJ1ZjsKIAlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmbHAtPnR4LnRyeCwgJmxwLT50eC5tc2cpOworCWhydGltZXJfaW5pdCgmbHAtPnR4LnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOworCWxwLT50eC50aW1lci5mdW5jdGlvbiA9IGF0ODZyZjIzMF9hc3luY19zdGF0ZV90aW1lcjsKIH0KIAogc3RhdGljIGludCBhdDg2cmYyMzBfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKIHsKLQlzdHJ1Y3QgYXQ4NnJmMjMwX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogCXN0cnVjdCBpZWVlODAyMTU0X2h3ICpodzsKIAlzdHJ1Y3QgYXQ4NnJmMjMwX2xvY2FsICpscDsKIAl1bnNpZ25lZCBpbnQgc3RhdHVzOwotCWludCByYywgaXJxX3R5cGU7CisJaW50IHJjLCBpcnFfdHlwZSwgcnN0biwgc2xwX3RyOworCXU4IHh0YWxfdHJpbSA9IDA7CiAKIAlpZiAoIXNwaS0+aXJxKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gSVJRIHNwZWNpZmllZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXBkYXRhID0gYXQ4NnJmMjMwX2dldF9wZGF0YShzcGkpOwotCWlmICghcGRhdGEpIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJubyBwbGF0Zm9ybV9kYXRhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmMgPSBhdDg2cmYyMzBfZ2V0X3BkYXRhKHNwaSwgJnJzdG4sICZzbHBfdHIsICZ4dGFsX3RyaW0pOworCWlmIChyYyA8IDApIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJmYWlsZWQgdG8gcGFyc2UgcGxhdGZvcm1fZGF0YTogJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOwogCX0KIAotCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5yc3RuKSkgewotCQlyYyA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmc3BpLT5kZXYsIHBkYXRhLT5yc3RuLAorCWlmIChncGlvX2lzX3ZhbGlkKHJzdG4pKSB7CisJCXJjID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKCZzcGktPmRldiwgcnN0biwKIAkJCQkJICAgR1BJT0ZfT1VUX0lOSVRfSElHSCwgInJzdG4iKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCX0KIAotCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5zbHBfdHIpKSB7Ci0JCXJjID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKCZzcGktPmRldiwgcGRhdGEtPnNscF90ciwKKwlpZiAoZ3Bpb19pc192YWxpZChzbHBfdHIpKSB7CisJCXJjID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKCZzcGktPmRldiwgc2xwX3RyLAogCQkJCQkgICBHUElPRl9PVVRfSU5JVF9MT1csICJzbHBfdHIiKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCX0KIAogCS8qIFJlc2V0ICovCi0JaWYgKGdwaW9faXNfdmFsaWQocGRhdGEtPnJzdG4pKSB7CisJaWYgKGdwaW9faXNfdmFsaWQocnN0bikpIHsKIAkJdWRlbGF5KDEpOwotCQlncGlvX3NldF92YWx1ZShwZGF0YS0+cnN0biwgMCk7CisJCWdwaW9fc2V0X3ZhbHVlKHJzdG4sIDApOwogCQl1ZGVsYXkoMSk7Ci0JCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLT5yc3RuLCAxKTsKKwkJZ3Bpb19zZXRfdmFsdWUocnN0biwgMSk7CiAJCXVzbGVlcF9yYW5nZSgxMjAsIDI0MCk7CiAJfQogCkBAIC0xNTY2LDEyICsxNjkxLDExIEBACiAJaWYgKHJjIDwgMCkKIAkJZ290byBmcmVlX2RldjsKIAotCXNwaW5fbG9ja19pbml0KCZscC0+bG9jayk7CiAJaW5pdF9jb21wbGV0aW9uKCZscC0+c3RhdGVfY29tcGxldGUpOwogCiAJc3BpX3NldF9kcnZkYXRhKHNwaSwgbHApOwogCi0JcmMgPSBhdDg2cmYyMzBfaHdfaW5pdChscCk7CisJcmMgPSBhdDg2cmYyMzBfaHdfaW5pdChscCwgeHRhbF90cmltKTsKIAlpZiAocmMpCiAJCWdvdG8gZnJlZV9kZXY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2llZWU4MDIxNTQvY2MyNTIwLmMgYi9kcml2ZXJzL25ldC9pZWVlODAyMTU0L2NjMjUyMC5jCmluZGV4IDE4MWIzNDkuLmY4MzNiOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2llZWU4MDIxNTQvY2MyNTIwLmMKKysrIGIvZHJpdmVycy9uZXQvaWVlZTgwMjE1NC9jYzI1MjAuYwpAQCAtNzE0LDExICs3MTQsNDUgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyBpbnQgY2MyNTIwX2dldF9wbGF0Zm9ybV9kYXRhKHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCisJCQkJICAgIHN0cnVjdCBjYzI1MjBfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHNwaS0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGNjMjUyMF9wcml2YXRlICpwcml2ID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwlpZiAoIW5wKSB7CisJCXN0cnVjdCBjYzI1MjBfcGxhdGZvcm1fZGF0YSAqc3BpX3BkYXRhID0gc3BpLT5kZXYucGxhdGZvcm1fZGF0YTsKKwkJaWYgKCFzcGlfcGRhdGEpCisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJKnBkYXRhID0gKnNwaV9wZGF0YTsKKwkJcmV0dXJuIDA7CisJfQorCisJcGRhdGEtPmZpZm8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgImZpZm8tZ3BpbyIsIDApOworCXByaXYtPmZpZm9fcGluID0gcGRhdGEtPmZpZm87CisKKwlwZGF0YS0+Zmlmb3AgPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgImZpZm9wLWdwaW8iLCAwKTsKKworCXBkYXRhLT5zZmQgPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgInNmZC1ncGlvIiwgMCk7CisJcGRhdGEtPmNjYSA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAiY2NhLWdwaW8iLCAwKTsKKwlwZGF0YS0+dnJlZyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAidnJlZy1ncGlvIiwgMCk7CisJcGRhdGEtPnJlc2V0ID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJyZXNldC1ncGlvIiwgMCk7CisKKwlwZGF0YS0+YW1wbGlmaWVkID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5wLCAiYW1wbGlmaWVkIik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBjYzI1MjBfaHdfaW5pdChzdHJ1Y3QgY2MyNTIwX3ByaXZhdGUgKnByaXYpCiB7CiAJdTggc3RhdHVzID0gMCwgc3RhdGUgPSAweGZmOwogCWludCByZXQ7CiAJaW50IHRpbWVvdXQgPSAxMDA7CisJc3RydWN0IGNjMjUyMF9wbGF0Zm9ybV9kYXRhIHBkYXRhOworCisJcmV0ID0gY2MyNTIwX2dldF9wbGF0Zm9ybV9kYXRhKHByaXYtPnNwaSwgJnBkYXRhKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXQ7CiAKIAlyZXQgPSBjYzI1MjBfcmVhZF9yZWdpc3Rlcihwcml2LCBDQzI1MjBfRlNNU1RBVDEsICZzdGF0ZSk7CiAJaWYgKHJldCkKQEAgLTc0MSwxMSArNzc1LDQ3IEBACiAKIAlkZXZfdmRiZygmcHJpdi0+c3BpLT5kZXYsICJvc2NpbGxhdG9yIGJyb3VnaHQgdXBcbiIpOwogCi0JLyogUmVnaXN0ZXJzIGRlZmF1bHQgdmFsdWU6IHNlY3Rpb24gMjguMSBpbiBEYXRhc2hlZXQgKi8KLQlyZXQgPSBjYzI1MjBfd3JpdGVfcmVnaXN0ZXIocHJpdiwgQ0MyNTIwX1RYUE9XRVIsIDB4RjcpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3JldDsKKwkvKiBJZiB0aGUgQ0MyNTIwIGlzIGNvbm5lY3RlZCB0byBhIENDMjU5MSBhbXBsaWZpZXIsIHdlIG11c3QgYm90aAorCSAqIGNvbmZpZ3VyZSBHUElPcyBvbiB0aGUgQ0MyNTIwIHRvIGNvcnJlY3RseSBjb25maWd1cmUgdGhlIENDMjU5MQorCSAqIGFuZCBjaGFuZ2UgYSBjb3VwbGUgc2V0dGluZ3Mgb2YgdGhlIENDMjUyMCB0byB3b3JrIHdpdGggdGhlCisJICogYW1wbGlmaWVyLiBTZWUgc2VjdGlvbiA4IHBhZ2UgMTcgb2YgVEkgYXBwbGljYXRpb24gbm90ZSBBTjA2NS4KKwkgKiBodHRwOi8vd3d3LnRpLmNvbS9saXQvYW4vc3dyYTIyOWEvc3dyYTIyOWEucGRmCisJICovCisJaWYgKHBkYXRhLmFtcGxpZmllZCkgeworCQlyZXQgPSBjYzI1MjBfd3JpdGVfcmVnaXN0ZXIocHJpdiwgQ0MyNTIwX1RYUE9XRVIsIDB4RjkpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcmV0OwogCisJCXJldCA9IGNjMjUyMF93cml0ZV9yZWdpc3Rlcihwcml2LCBDQzI1MjBfQUdDQ1RSTDEsIDB4MTYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcmV0OworCisJCXJldCA9IGNjMjUyMF93cml0ZV9yZWdpc3Rlcihwcml2LCBDQzI1MjBfR1BJT0NUUkwwLCAweDQ2KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3JldDsKKworCQlyZXQgPSBjYzI1MjBfd3JpdGVfcmVnaXN0ZXIocHJpdiwgQ0MyNTIwX0dQSU9DVFJMNSwgMHg0Nyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9yZXQ7CisKKwkJcmV0ID0gY2MyNTIwX3dyaXRlX3JlZ2lzdGVyKHByaXYsIENDMjUyMF9HUElPUE9MQVJJVFksIDB4MWUpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcmV0OworCisJCXJldCA9IGNjMjUyMF93cml0ZV9yZWdpc3Rlcihwcml2LCBDQzI1MjBfVFhDVFJMLCAweGMxKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3JldDsKKwl9IGVsc2UgeworCQlyZXQgPSBjYzI1MjBfd3JpdGVfcmVnaXN0ZXIocHJpdiwgQ0MyNTIwX1RYUE9XRVIsIDB4RjcpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcmV0OworCisJCXJldCA9IGNjMjUyMF93cml0ZV9yZWdpc3Rlcihwcml2LCBDQzI1MjBfQUdDQ1RSTDEsIDB4MTEpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcmV0OworCX0KKworCS8qIFJlZ2lzdGVycyBkZWZhdWx0IHZhbHVlOiBzZWN0aW9uIDI4LjEgaW4gRGF0YXNoZWV0ICovCiAJcmV0ID0gY2MyNTIwX3dyaXRlX3JlZ2lzdGVyKHByaXYsIENDMjUyMF9DQ0FDVFJMMCwgMHgxQSk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfcmV0OwpAQCAtNzcwLDEwICs4NDAsNiBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3JldDsKIAotCXJldCA9IGNjMjUyMF93cml0ZV9yZWdpc3Rlcihwcml2LCBDQzI1MjBfQUdDQ1RSTDEsIDB4MTEpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3JldDsKLQogCXJldCA9IGNjMjUyMF93cml0ZV9yZWdpc3Rlcihwcml2LCBDQzI1MjBfQURDVEVTVDAsIDB4MTApOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX3JldDsKQEAgLTgwOCw0MCArODc0LDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBjYzI1MjBfcGxhdGZvcm1fZGF0YSAqCi1jYzI1MjBfZ2V0X3BsYXRmb3JtX2RhdGEoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgY2MyNTIwX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBzcGktPmRldi5vZl9ub2RlOwotCXN0cnVjdCBjYzI1MjBfcHJpdmF0ZSAqcHJpdiA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwotCi0JaWYgKCFucCkKLQkJcmV0dXJuIHNwaS0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQlwZGF0YSA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBkYXRhKQotCQlnb3RvIGRvbmU7Ci0KLQlwZGF0YS0+ZmlmbyA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAiZmlmby1ncGlvIiwgMCk7Ci0JcHJpdi0+Zmlmb19waW4gPSBwZGF0YS0+ZmlmbzsKLQotCXBkYXRhLT5maWZvcCA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAiZmlmb3AtZ3BpbyIsIDApOwotCi0JcGRhdGEtPnNmZCA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAic2ZkLWdwaW8iLCAwKTsKLQlwZGF0YS0+Y2NhID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJjY2EtZ3BpbyIsIDApOwotCXBkYXRhLT52cmVnID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJ2cmVnLWdwaW8iLCAwKTsKLQlwZGF0YS0+cmVzZXQgPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgInJlc2V0LWdwaW8iLCAwKTsKLQotCXNwaS0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZGF0YTsKLQotZG9uZToKLQlyZXR1cm4gcGRhdGE7Ci19Ci0KIHN0YXRpYyBpbnQgY2MyNTIwX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJc3RydWN0IGNjMjUyMF9wcml2YXRlICpwcml2OwotCXN0cnVjdCBjYzI1MjBfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGNjMjUyMF9wbGF0Zm9ybV9kYXRhIHBkYXRhOwogCWludCByZXQ7CiAKIAlwcml2ID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0tFUk5FTCk7CkBAIC04NTAsOCArODg2LDggQEAKIAogCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHByaXYpOwogCi0JcGRhdGEgPSBjYzI1MjBfZ2V0X3BsYXRmb3JtX2RhdGEoc3BpKTsKLQlpZiAoIXBkYXRhKSB7CisJcmV0ID0gY2MyNTIwX2dldF9wbGF0Zm9ybV9kYXRhKHNwaSwgJnBkYXRhKTsKKwlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZzcGktPmRldiwgIm5vIHBsYXRmb3JtIGRhdGFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC04NjksNzYgKzkwNSw3NiBAQAogCWluaXRfY29tcGxldGlvbigmcHJpdi0+dHhfY29tcGxldGUpOwogCiAJLyogUmVxdWVzdCBhbGwgdGhlIGdwaW8ncyAqLwotCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+ZmlmbykpIHsKKwlpZiAoIWdwaW9faXNfdmFsaWQocGRhdGEuZmlmbykpIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICJmaWZvIGdwaW8gaXMgbm90IHZhbGlkXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJfaHdfaW5pdDsKIAl9CiAKLQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnNwaS0+ZGV2LCBwZGF0YS0+ZmlmbywKKwlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnNwaS0+ZGV2LCBwZGF0YS5maWZvLAogCQkJCSAgICBHUElPRl9JTiwgImZpZm8iKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9od19pbml0OwogCi0JaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLT5jY2EpKSB7CisJaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLmNjYSkpIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICJjY2EgZ3BpbyBpcyBub3QgdmFsaWRcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9od19pbml0OwogCX0KIAotCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmc3BpLT5kZXYsIHBkYXRhLT5jY2EsCisJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKCZzcGktPmRldiwgcGRhdGEuY2NhLAogCQkJCSAgICBHUElPRl9JTiwgImNjYSIpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2h3X2luaXQ7CiAKLQlpZiAoIWdwaW9faXNfdmFsaWQocGRhdGEtPmZpZm9wKSkgeworCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS5maWZvcCkpIHsKIAkJZGV2X2Vycigmc3BpLT5kZXYsICJmaWZvcCBncGlvIGlzIG5vdCB2YWxpZFxuIik7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyX2h3X2luaXQ7CiAJfQogCi0JcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKCZzcGktPmRldiwgcGRhdGEtPmZpZm9wLAorCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmc3BpLT5kZXYsIHBkYXRhLmZpZm9wLAogCQkJCSAgICBHUElPRl9JTiwgImZpZm9wIik7CiAJaWYgKHJldCkKIAkJZ290byBlcnJfaHdfaW5pdDsKIAotCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS0+c2ZkKSkgeworCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS5zZmQpKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAic2ZkIGdwaW8gaXMgbm90IHZhbGlkXG4iKTsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBlcnJfaHdfaW5pdDsKIAl9CiAKLQlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnNwaS0+ZGV2LCBwZGF0YS0+c2ZkLAorCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmc3BpLT5kZXYsIHBkYXRhLnNmZCwKIAkJCQkgICAgR1BJT0ZfSU4sICJzZmQiKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9od19pbml0OwogCi0JaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLT5yZXNldCkpIHsKKwlpZiAoIWdwaW9faXNfdmFsaWQocGRhdGEucmVzZXQpKSB7CiAJCWRldl9lcnIoJnNwaS0+ZGV2LCAicmVzZXQgZ3BpbyBpcyBub3QgdmFsaWRcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9od19pbml0OwogCX0KIAotCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmc3BpLT5kZXYsIHBkYXRhLT5yZXNldCwKKwlyZXQgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnNwaS0+ZGV2LCBwZGF0YS5yZXNldCwKIAkJCQkgICAgR1BJT0ZfT1VUX0lOSVRfTE9XLCAicmVzZXQiKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9od19pbml0OwogCi0JaWYgKCFncGlvX2lzX3ZhbGlkKHBkYXRhLT52cmVnKSkgeworCWlmICghZ3Bpb19pc192YWxpZChwZGF0YS52cmVnKSkgewogCQlkZXZfZXJyKCZzcGktPmRldiwgInZyZWcgZ3BpbyBpcyBub3QgdmFsaWRcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9od19pbml0OwogCX0KIAotCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmc3BpLT5kZXYsIHBkYXRhLT52cmVnLAorCXJldCA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmc3BpLT5kZXYsIHBkYXRhLnZyZWcsCiAJCQkJICAgIEdQSU9GX09VVF9JTklUX0xPVywgInZyZWciKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9od19pbml0OwogCi0JZ3Bpb19zZXRfdmFsdWUocGRhdGEtPnZyZWcsIEhJR0gpOworCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLnZyZWcsIEhJR0gpOwogCXVzbGVlcF9yYW5nZSgxMDAsIDE1MCk7CiAKLQlncGlvX3NldF92YWx1ZShwZGF0YS0+cmVzZXQsIEhJR0gpOworCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLnJlc2V0LCBISUdIKTsKIAl1c2xlZXBfcmFuZ2UoMjAwLCAyNTApOwogCiAJcmV0ID0gY2MyNTIwX2h3X2luaXQocHJpdik7CkBAIC05NDcsNyArOTgzLDcgQEAKIAogCS8qIFNldCB1cCBmaWZvcCBpbnRlcnJ1cHQgKi8KIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZzcGktPmRldiwKLQkJCSAgICAgICBncGlvX3RvX2lycShwZGF0YS0+Zmlmb3ApLAorCQkJICAgICAgIGdwaW9fdG9faXJxKHBkYXRhLmZpZm9wKSwKIAkJCSAgICAgICBjYzI1MjBfZmlmb3BfaXNyLAogCQkJICAgICAgIElSUUZfVFJJR0dFUl9SSVNJTkcsCiAJCQkgICAgICAgZGV2X25hbWUoJnNwaS0+ZGV2KSwKQEAgLTk1OSw3ICs5OTUsNyBAQAogCiAJLyogU2V0IHVwIHNmZCBpbnRlcnJ1cHQgKi8KIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZzcGktPmRldiwKLQkJCSAgICAgICBncGlvX3RvX2lycShwZGF0YS0+c2ZkKSwKKwkJCSAgICAgICBncGlvX3RvX2lycShwZGF0YS5zZmQpLAogCQkJICAgICAgIGNjMjUyMF9zZmRfaXNyLAogCQkJICAgICAgIElSUUZfVFJJR0dFUl9GQUxMSU5HLAogCQkJICAgICAgIGRldl9uYW1lKCZzcGktPmRldiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuLmggYi9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuLmgKaW5kZXggOTI0ZWE5OC4uNTQ1NDlhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXB2bGFuL2lwdmxhbi5oCisrKyBiL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW4uaApAQCAtMTE0LDcgKzExNCw5IEBACiByeF9oYW5kbGVyX3Jlc3VsdF90IGlwdmxhbl9oYW5kbGVfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKipwc2tiKTsKIGludCBpcHZsYW5fcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHZvaWQgaXB2bGFuX2h0X2FkZHJfYWRkKHN0cnVjdCBpcHZsX2RldiAqaXB2bGFuLCBzdHJ1Y3QgaXB2bF9hZGRyICphZGRyKTsKLWJvb2wgaXB2bGFuX2FkZHJfYnVzeShzdHJ1Y3QgaXB2bF9kZXYgKmlwdmxhbiwgdm9pZCAqaWFkZHIsIGJvb2wgaXNfdjYpOworc3RydWN0IGlwdmxfYWRkciAqaXB2bGFuX2ZpbmRfYWRkcihjb25zdCBzdHJ1Y3QgaXB2bF9kZXYgKmlwdmxhbiwKKwkJCQkgICBjb25zdCB2b2lkICppYWRkciwgYm9vbCBpc192Nik7Citib29sIGlwdmxhbl9hZGRyX2J1c3koc3RydWN0IGlwdmxfcG9ydCAqcG9ydCwgdm9pZCAqaWFkZHIsIGJvb2wgaXNfdjYpOwogc3RydWN0IGlwdmxfYWRkciAqaXB2bGFuX2h0X2FkZHJfbG9va3VwKGNvbnN0IHN0cnVjdCBpcHZsX3BvcnQgKnBvcnQsCiAJCQkJCWNvbnN0IHZvaWQgKmlhZGRyLCBib29sIGlzX3Y2KTsKIHZvaWQgaXB2bGFuX2h0X2FkZHJfZGVsKHN0cnVjdCBpcHZsX2FkZHIgKmFkZHIsIGJvb2wgc3luYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuX2NvcmUuYyBiL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW5fY29yZS5jCmluZGV4IDJhMTc1MDAuLmMzMGI1YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW5fY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L2lwdmxhbi9pcHZsYW5fY29yZS5jCkBAIC04MSwxOSArODEsMjAgQEAKIAloYXNoID0gKGFkZHItPmF0eXBlID09IElQVkxfSVBWNikgPwogCSAgICAgICBpcHZsYW5fZ2V0X3Y2X2hhc2goJmFkZHItPmlwNmFkZHIpIDoKIAkgICAgICAgaXB2bGFuX2dldF92NF9oYXNoKCZhZGRyLT5pcDRhZGRyKTsKLQlobGlzdF9hZGRfaGVhZF9yY3UoJmFkZHItPmhsbm9kZSwgJnBvcnQtPmhsaGVhZFtoYXNoXSk7CisJaWYgKGhsaXN0X3VuaGFzaGVkKCZhZGRyLT5obG5vZGUpKQorCQlobGlzdF9hZGRfaGVhZF9yY3UoJmFkZHItPmhsbm9kZSwgJnBvcnQtPmhsaGVhZFtoYXNoXSk7CiB9CiAKIHZvaWQgaXB2bGFuX2h0X2FkZHJfZGVsKHN0cnVjdCBpcHZsX2FkZHIgKmFkZHIsIGJvb2wgc3luYykKIHsKLQlobGlzdF9kZWxfcmN1KCZhZGRyLT5obG5vZGUpOworCWhsaXN0X2RlbF9pbml0X3JjdSgmYWRkci0+aGxub2RlKTsKIAlpZiAoc3luYykKIAkJc3luY2hyb25pemVfcmN1KCk7CiB9CiAKLWJvb2wgaXB2bGFuX2FkZHJfYnVzeShzdHJ1Y3QgaXB2bF9kZXYgKmlwdmxhbiwgdm9pZCAqaWFkZHIsIGJvb2wgaXNfdjYpCitzdHJ1Y3QgaXB2bF9hZGRyICppcHZsYW5fZmluZF9hZGRyKGNvbnN0IHN0cnVjdCBpcHZsX2RldiAqaXB2bGFuLAorCQkJCSAgIGNvbnN0IHZvaWQgKmlhZGRyLCBib29sIGlzX3Y2KQogewotCXN0cnVjdCBpcHZsX3BvcnQgKnBvcnQgPSBpcHZsYW4tPnBvcnQ7CiAJc3RydWN0IGlwdmxfYWRkciAqYWRkcjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRkciwgJmlwdmxhbi0+YWRkcnMsIGFub2RlKSB7CkBAIC0xMDEsMTIgKzEwMiwyMSBAQAogCQkgICAgaXB2Nl9hZGRyX2VxdWFsKCZhZGRyLT5pcDZhZGRyLCBpYWRkcikpIHx8CiAJCSAgICAoIWlzX3Y2ICYmIGFkZHItPmF0eXBlID09IElQVkxfSVBWNCAmJgogCQkgICAgYWRkci0+aXA0YWRkci5zX2FkZHIgPT0gKChzdHJ1Y3QgaW5fYWRkciAqKWlhZGRyKS0+c19hZGRyKSkKKwkJCXJldHVybiBhZGRyOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworYm9vbCBpcHZsYW5fYWRkcl9idXN5KHN0cnVjdCBpcHZsX3BvcnQgKnBvcnQsIHZvaWQgKmlhZGRyLCBib29sIGlzX3Y2KQoreworCXN0cnVjdCBpcHZsX2RldiAqaXB2bGFuOworCisJQVNTRVJUX1JUTkwoKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoaXB2bGFuLCAmcG9ydC0+aXB2bGFucywgcG5vZGUpIHsKKwkJaWYgKGlwdmxhbl9maW5kX2FkZHIoaXB2bGFuLCBpYWRkciwgaXNfdjYpKQogCQkJcmV0dXJuIHRydWU7CiAJfQotCi0JaWYgKGlwdmxhbl9odF9hZGRyX2xvb2t1cChwb3J0LCBpYWRkciwgaXNfdjYpKQotCQlyZXR1cm4gdHJ1ZTsKLQogCXJldHVybiBmYWxzZTsKIH0KIApAQCAtMTkyLDcgKzIwMiw4IEBACiAJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfUEFVU0UpKQogCQlyZXR1cm47CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlwdmxhbiwgJnBvcnQtPmlwdmxhbnMsIHBub2RlKSB7CisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGlwdmxhbiwgJnBvcnQtPmlwdmxhbnMsIHBub2RlKSB7CiAJCWlmIChsb2NhbCAmJiAoaXB2bGFuID09IGluX2RldikpCiAJCQljb250aW51ZTsKIApAQCAtMjE5LDYgKzIzMCw3IEBACiBtY2FzdF9hY2N0OgogCQlpcHZsYW5fY291bnRfcngoaXB2bGFuLCBsZW4sIHJldCA9PSBORVRfUlhfU1VDQ0VTUywgdHJ1ZSk7CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCiAJLyogTG9jYWxseSBnZW5lcmF0ZWQ/IC4uLkZvcndhcmQgYSBjb3B5IHRvIHRoZSBtYWluLWRldmljZSBhcwogCSAqIHdlbGwuIE9uIHRoZSBSWCBzaWRlIHdlJ2xsIGlnbm9yZSBpdCAod29udCBnaXZlIGl0IHRvIGFueQpAQCAtMzMwLDcgKzM0Miw3IEBACiAJc3RydWN0IHJ0YWJsZSAqcnQ7CiAJaW50IGVyciwgcmV0ID0gTkVUX1hNSVRfRFJPUDsKIAlzdHJ1Y3QgZmxvd2k0IGZsNCA9IHsKLQkJLmZsb3dpNF9vaWYgPSBkZXYtPmlmbGluaywKKwkJLmZsb3dpNF9vaWYgPSBkZXZfZ2V0X2lmbGluayhkZXYpLAogCQkuZmxvd2k0X3RvcyA9IFJUX1RPUyhpcDRoLT50b3MpLAogCQkuZmxvd2k0X2ZsYWdzID0gRkxPV0lfRkxBR19BTllTUkMsCiAJCS5kYWRkciA9IGlwNGgtPmRhZGRyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXB2bGFuL2lwdmxhbl9tYWluLmMgYi9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuX21haW4uYwppbmRleCA0ZjQwOTlkLi43N2I5MmEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuX21haW4uYworKysgYi9kcml2ZXJzL25ldC9pcHZsYW4vaXB2bGFuX21haW4uYwpAQCAtMTE0LDcgKzExNCw2IEBACiAJZGV2LT5mZWF0dXJlcyA9IHBoeV9kZXYtPmZlYXR1cmVzICYgSVBWTEFOX0ZFQVRVUkVTOwogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MTFRYOwogCWRldi0+Z3NvX21heF9zaXplID0gcGh5X2Rldi0+Z3NvX21heF9zaXplOwotCWRldi0+aWZsaW5rID0gcGh5X2Rldi0+aWZpbmRleDsKIAlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IHBoeV9kZXYtPmhhcmRfaGVhZGVyX2xlbjsKIAogCWlwdmxhbl9zZXRfbG9ja2RlcF9jbGFzcyhkZXYpOwpAQCAtMzA1LDYgKzMwNCwxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGlwdmxhbl9nZXRfaWZsaW5rKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGlwdmxfZGV2ICppcHZsYW4gPSBuZXRkZXZfcHJpdihkZXYpOworCisJcmV0dXJuIGlwdmxhbi0+cGh5X2Rldi0+aWZpbmRleDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpcHZsYW5fbmV0ZGV2X29wcyA9IHsKIAkubmRvX2luaXQJCT0gaXB2bGFuX2luaXQsCiAJLm5kb191bmluaXQJCT0gaXB2bGFuX3VuaW5pdCwKQEAgLTMxNyw2ICszMjMsNyBAQAogCS5uZG9fZ2V0X3N0YXRzNjQJPSBpcHZsYW5fZ2V0X3N0YXRzNjQsCiAJLm5kb192bGFuX3J4X2FkZF92aWQJPSBpcHZsYW5fdmxhbl9yeF9hZGRfdmlkLAogCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IGlwdmxhbl92bGFuX3J4X2tpbGxfdmlkLAorCS5uZG9fZ2V0X2lmbGluawkJPSBpcHZsYW5fZ2V0X2lmbGluaywKIH07CiAKIHN0YXRpYyBpbnQgaXB2bGFuX2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0zMzYsNyArMzQzLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZWFkZXJfb3BzIGlwdmxhbl9oZWFkZXJfb3BzID0gewogCS5jcmVhdGUgIAk9IGlwdmxhbl9oYXJkX2hlYWRlciwKLQkucmVidWlsZAk9IGV0aF9yZWJ1aWxkX2hlYWRlciwKIAkucGFyc2UJCT0gZXRoX2hlYWRlcl9wYXJzZSwKIAkuY2FjaGUJCT0gZXRoX2hlYWRlcl9jYWNoZSwKIAkuY2FjaGVfdXBkYXRlCT0gZXRoX2hlYWRlcl9jYWNoZV91cGRhdGUsCkBAIC01MDUsNyArNTExLDcgQEAKIAlpZiAoaXB2bGFuLT5pcHY2Y250ID4gMCB8fCBpcHZsYW4tPmlwdjRjbnQgPiAwKSB7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShhZGRyLCBuZXh0LCAmaXB2bGFuLT5hZGRycywgYW5vZGUpIHsKIAkJCWlwdmxhbl9odF9hZGRyX2RlbChhZGRyLCAhZGV2LT5kaXNtYW50bGUpOwotCQkJbGlzdF9kZWxfcmN1KCZhZGRyLT5hbm9kZSk7CisJCQlsaXN0X2RlbCgmYWRkci0+YW5vZGUpOwogCQl9CiAJfQogCWxpc3RfZGVsX3JjdSgmaXB2bGFuLT5wbm9kZSk7CkBAIC02MDcsNyArNjEzLDcgQEAKIHsKIAlzdHJ1Y3QgaXB2bF9hZGRyICphZGRyOwogCi0JaWYgKGlwdmxhbl9hZGRyX2J1c3koaXB2bGFuLCBpcDZfYWRkciwgdHJ1ZSkpIHsKKwlpZiAoaXB2bGFuX2FkZHJfYnVzeShpcHZsYW4tPnBvcnQsIGlwNl9hZGRyLCB0cnVlKSkgewogCQluZXRpZl9lcnIoaXB2bGFuLCBpZnVwLCBpcHZsYW4tPmRldiwKIAkJCSAgIkZhaWxlZCB0byBhZGQgSVB2Nj0lcEk2YyBhZGRyIGZvciAlcyBpbnRmXG4iLAogCQkJICBpcDZfYWRkciwgaXB2bGFuLT5kZXYtPm5hbWUpOwpAQCAtNjIwLDkgKzYyNiwxMyBAQAogCWFkZHItPm1hc3RlciA9IGlwdmxhbjsKIAltZW1jcHkoJmFkZHItPmlwNmFkZHIsIGlwNl9hZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CiAJYWRkci0+YXR5cGUgPSBJUFZMX0lQVjY7Ci0JbGlzdF9hZGRfdGFpbF9yY3UoJmFkZHItPmFub2RlLCAmaXB2bGFuLT5hZGRycyk7CisJbGlzdF9hZGRfdGFpbCgmYWRkci0+YW5vZGUsICZpcHZsYW4tPmFkZHJzKTsKIAlpcHZsYW4tPmlwdjZjbnQrKzsKLQlpcHZsYW5faHRfYWRkcl9hZGQoaXB2bGFuLCBhZGRyKTsKKwkvKiBJZiB0aGUgaW50ZXJmYWNlIGlzIG5vdCB1cCwgdGhlIGFkZHJlc3Mgd2lsbCBiZSBhZGRlZCB0byB0aGUgaGFzaAorCSAqIGxpc3QgYnkgaXB2bGFuX29wZW4uCisJICovCisJaWYgKG5ldGlmX3J1bm5pbmcoaXB2bGFuLT5kZXYpKQorCQlpcHZsYW5faHRfYWRkcl9hZGQoaXB2bGFuLCBhZGRyKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjMxLDEyICs2NDEsMTIgQEAKIHsKIAlzdHJ1Y3QgaXB2bF9hZGRyICphZGRyOwogCi0JYWRkciA9IGlwdmxhbl9odF9hZGRyX2xvb2t1cChpcHZsYW4tPnBvcnQsIGlwNl9hZGRyLCB0cnVlKTsKKwlhZGRyID0gaXB2bGFuX2ZpbmRfYWRkcihpcHZsYW4sIGlwNl9hZGRyLCB0cnVlKTsKIAlpZiAoIWFkZHIpCiAJCXJldHVybjsKIAogCWlwdmxhbl9odF9hZGRyX2RlbChhZGRyLCB0cnVlKTsKLQlsaXN0X2RlbF9yY3UoJmFkZHItPmFub2RlKTsKKwlsaXN0X2RlbCgmYWRkci0+YW5vZGUpOwogCWlwdmxhbi0+aXB2NmNudC0tOwogCVdBUk5fT04oaXB2bGFuLT5pcHY2Y250IDwgMCk7CiAJa2ZyZWVfcmN1KGFkZHIsIHJjdSk7CkBAIC02NzUsNyArNjg1LDcgQEAKIHsKIAlzdHJ1Y3QgaXB2bF9hZGRyICphZGRyOwogCi0JaWYgKGlwdmxhbl9hZGRyX2J1c3koaXB2bGFuLCBpcDRfYWRkciwgZmFsc2UpKSB7CisJaWYgKGlwdmxhbl9hZGRyX2J1c3koaXB2bGFuLT5wb3J0LCBpcDRfYWRkciwgZmFsc2UpKSB7CiAJCW5ldGlmX2VycihpcHZsYW4sIGlmdXAsIGlwdmxhbi0+ZGV2LAogCQkJICAiRmFpbGVkIHRvIGFkZCBJUHY0PSVwSTQgb24gJXMgaW50Zi5cbiIsCiAJCQkgIGlwNF9hZGRyLCBpcHZsYW4tPmRldi0+bmFtZSk7CkBAIC02ODgsOSArNjk4LDEzIEBACiAJYWRkci0+bWFzdGVyID0gaXB2bGFuOwogCW1lbWNweSgmYWRkci0+aXA0YWRkciwgaXA0X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOwogCWFkZHItPmF0eXBlID0gSVBWTF9JUFY0OwotCWxpc3RfYWRkX3RhaWxfcmN1KCZhZGRyLT5hbm9kZSwgJmlwdmxhbi0+YWRkcnMpOworCWxpc3RfYWRkX3RhaWwoJmFkZHItPmFub2RlLCAmaXB2bGFuLT5hZGRycyk7CiAJaXB2bGFuLT5pcHY0Y250Kys7Ci0JaXB2bGFuX2h0X2FkZHJfYWRkKGlwdmxhbiwgYWRkcik7CisJLyogSWYgdGhlIGludGVyZmFjZSBpcyBub3QgdXAsIHRoZSBhZGRyZXNzIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGhhc2gKKwkgKiBsaXN0IGJ5IGlwdmxhbl9vcGVuLgorCSAqLworCWlmIChuZXRpZl9ydW5uaW5nKGlwdmxhbi0+ZGV2KSkKKwkJaXB2bGFuX2h0X2FkZHJfYWRkKGlwdmxhbiwgYWRkcik7CiAJaXB2bGFuX3NldF9icm9hZGNhc3RfbWFjX2ZpbHRlcihpcHZsYW4sIHRydWUpOwogCiAJcmV0dXJuIDA7CkBAIC03MDAsMTIgKzcxNCwxMiBAQAogewogCXN0cnVjdCBpcHZsX2FkZHIgKmFkZHI7CiAKLQlhZGRyID0gaXB2bGFuX2h0X2FkZHJfbG9va3VwKGlwdmxhbi0+cG9ydCwgaXA0X2FkZHIsIGZhbHNlKTsKKwlhZGRyID0gaXB2bGFuX2ZpbmRfYWRkcihpcHZsYW4sIGlwNF9hZGRyLCBmYWxzZSk7CiAJaWYgKCFhZGRyKQogCQlyZXR1cm47CiAKIAlpcHZsYW5faHRfYWRkcl9kZWwoYWRkciwgdHJ1ZSk7Ci0JbGlzdF9kZWxfcmN1KCZhZGRyLT5hbm9kZSk7CisJbGlzdF9kZWwoJmFkZHItPmFub2RlKTsKIAlpcHZsYW4tPmlwdjRjbnQtLTsKIAlXQVJOX09OKGlwdmxhbi0+aXB2NGNudCA8IDApOwogCWlmICghaXB2bGFuLT5pcHY0Y250KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjdmxhbi5jIGIvZHJpdmVycy9uZXQvbWFjdmxhbi5jCmluZGV4IDFkZjM4YmQuLmIyMjdhMTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY3ZsYW4uYworKysgYi9kcml2ZXJzL25ldC9tYWN2bGFuLmMKQEAgLTU1MCw3ICs1NTAsNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhlYWRlcl9vcHMgbWFjdmxhbl9oYXJkX2hlYWRlcl9vcHMgPSB7CiAJLmNyZWF0ZSAgCT0gbWFjdmxhbl9oYXJkX2hlYWRlciwKLQkucmVidWlsZAk9IGV0aF9yZWJ1aWxkX2hlYWRlciwKIAkucGFyc2UJCT0gZXRoX2hlYWRlcl9wYXJzZSwKIAkuY2FjaGUJCT0gZXRoX2hlYWRlcl9jYWNoZSwKIAkuY2FjaGVfdXBkYXRlCT0gZXRoX2hlYWRlcl9jYWNoZV91cGRhdGUsCkBAIC03ODcsNyArNzg2LDYgQEAKIAlkZXYtPmh3X2ZlYXR1cmVzCXw9IE5FVElGX0ZfTFJPOwogCWRldi0+dmxhbl9mZWF0dXJlcwk9IGxvd2VyZGV2LT52bGFuX2ZlYXR1cmVzICYgTUFDVkxBTl9GRUFUVVJFUzsKIAlkZXYtPmdzb19tYXhfc2l6ZQk9IGxvd2VyZGV2LT5nc29fbWF4X3NpemU7Ci0JZGV2LT5pZmxpbmsJCT0gbG93ZXJkZXYtPmlmaW5kZXg7CiAJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSBsb3dlcmRldi0+aGFyZF9oZWFkZXJfbGVuOwogCiAJbWFjdmxhbl9zZXRfbG9ja2RlcF9jbGFzcyhkZXYpOwpAQCAtOTk2LDYgKzk5NCwxMyBAQAogfQogI2VuZGlmCS8qIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSICovCiAKK3N0YXRpYyBpbnQgbWFjdmxhbl9kZXZfZ2V0X2lmbGluayhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtYWN2bGFuX2RldiAqdmxhbiA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gdmxhbi0+bG93ZXJkZXYtPmlmaW5kZXg7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbWFjdmxhbl9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKIAkuZ2V0X3NldHRpbmdzCQk9IG1hY3ZsYW5fZXRodG9vbF9nZXRfc2V0dGluZ3MsCkBAIC0xMDI2LDYgKzEwMzEsNyBAQAogCS5uZG9fbmV0cG9sbF9zZXR1cAk9IG1hY3ZsYW5fZGV2X25ldHBvbGxfc2V0dXAsCiAJLm5kb19uZXRwb2xsX2NsZWFudXAJPSBtYWN2bGFuX2Rldl9uZXRwb2xsX2NsZWFudXAsCiAjZW5kaWYKKwkubmRvX2dldF9pZmxpbmsJCT0gbWFjdmxhbl9kZXZfZ2V0X2lmbGluaywKIH07CiAKIHZvaWQgbWFjdmxhbl9jb21tb25fc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L21hY3Z0YXAuYyBiL2RyaXZlcnMvbmV0L21hY3Z0YXAuYwppbmRleCAyN2VjYzVjLi45YzkxZmY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9tYWN2dGFwLmMKKysrIGIvZHJpdmVycy9uZXQvbWFjdnRhcC5jCkBAIC0xMTE4LDggKzExMTgsNiBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkub3BlbgkJPSBtYWN2dGFwX29wZW4sCiAJLnJlbGVhc2UJPSBtYWN2dGFwX3JlbGVhc2UsCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlcgk9IG1hY3Z0YXBfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyCT0gbWFjdnRhcF93cml0ZV9pdGVyLAogCS5wb2xsCQk9IG1hY3Z0YXBfcG9sbCwKQEAgLTExMzAsMTYgKzExMjgsMTUgQEAKICNlbmRpZgogfTsKIAotc3RhdGljIGludCBtYWN2dGFwX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbikKK3N0YXRpYyBpbnQgbWFjdnRhcF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sCisJCQkgICBzaXplX3QgdG90YWxfbGVuKQogewogCXN0cnVjdCBtYWN2dGFwX3F1ZXVlICpxID0gY29udGFpbmVyX29mKHNvY2ssIHN0cnVjdCBtYWN2dGFwX3F1ZXVlLCBzb2NrKTsKIAlyZXR1cm4gbWFjdnRhcF9nZXRfdXNlcihxLCBtLCAmbS0+bXNnX2l0ZXIsIG0tPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCk7CiB9CiAKLXN0YXRpYyBpbnQgbWFjdnRhcF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCB0b3RhbF9sZW4sCi0JCQkgICBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IG1hY3Z0YXBfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLAorCQkJICAgc2l6ZV90IHRvdGFsX2xlbiwgaW50IGZsYWdzKQogewogCXN0cnVjdCBtYWN2dGFwX3F1ZXVlICpxID0gY29udGFpbmVyX29mKHNvY2ssIHN0cnVjdCBtYWN2dGFwX3F1ZXVlLCBzb2NrKTsKIAlpbnQgcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbmV0Y29uc29sZS5jIGIvZHJpdmVycy9uZXQvbmV0Y29uc29sZS5jCmluZGV4IGJhMmY1ZTcuLjE1NzMxZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L25ldGNvbnNvbGUuYworKysgYi9kcml2ZXJzL25ldC9uZXRjb25zb2xlLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRwb2xsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5ldC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbmZpZ2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KIAogTU9EVUxFX0FVVEhPUigiTWFpbnRhaW5lcjogTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNvbnNvbGUgZHJpdmVyIGZvciBuZXR3b3JrIGludGVyZmFjZXMiKTsKQEAgLTE4NSw3ICsxODYsNyBAQAogCW50LT5ucC5sb2NhbF9wb3J0ID0gNjY2NTsKIAludC0+bnAucmVtb3RlX3BvcnQgPSA2NjY2OwogCW11dGV4X2luaXQoJm50LT5tdXRleCk7Ci0JbWVtc2V0KG50LT5ucC5yZW1vdGVfbWFjLCAweGZmLCBFVEhfQUxFTik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKG50LT5ucC5yZW1vdGVfbWFjKTsKIAogCS8qIFBhcnNlIHBhcmFtZXRlcnMgYW5kIHNldHVwIG5ldHBvbGwgKi8KIAllcnIgPSBuZXRwb2xsX3BhcnNlX29wdGlvbnMoJm50LT5ucCwgdGFyZ2V0X2NvbmZpZyk7CkBAIC02MDQsNyArNjA1LDcgQEAKIAludC0+bnAubG9jYWxfcG9ydCA9IDY2NjU7CiAJbnQtPm5wLnJlbW90ZV9wb3J0ID0gNjY2NjsKIAltdXRleF9pbml0KCZudC0+bXV0ZXgpOwotCW1lbXNldChudC0+bnAucmVtb3RlX21hYywgMHhmZiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcihudC0+bnAucmVtb3RlX21hYyk7CiAKIAkvKiBJbml0aWFsaXplIHRoZSBjb25maWdfaXRlbSBtZW1iZXIgKi8KIAljb25maWdfaXRlbV9pbml0X3R5cGVfbmFtZSgmbnQtPml0ZW0sIG5hbWUsICZuZXRjb25zb2xlX3RhcmdldF90eXBlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnIGIvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKaW5kZXggMTZhZGJjNC4uOGZhZGFhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKQEAgLTY4LDggKzY4LDggQEAKIGNvbmZpZyBCUk9BRENPTV9QSFkKIAl0cmlzdGF0ZSAiRHJpdmVycyBmb3IgQnJvYWRjb20gUEhZcyIKIAktLS1oZWxwLS0tCi0JICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEJDTTU0MTEsIEJDTTU0MjEsIEJDTTU0NjEsIEJDTTU0NjQsIEJDTTU0ODEKLQkgIGFuZCBCQ001NDgyIFBIWXMuCisJICBDdXJyZW50bHkgc3VwcG9ydHMgdGhlIEJDTTU0MTEsIEJDTTU0MjEsIEJDTTU0NjEsIEJDTTU0NjE2UywgQkNNNTQ2NCwKKwkgIEJDTTU0ODEgYW5kIEJDTTU0ODIgUEhZcy4KIAogY29uZmlnIEJDTTYzWFhfUEhZCiAJdHJpc3RhdGUgIkRyaXZlcnMgZm9yIEJyb2FkY29tIDYzeHggU09DcyBpbnRlcm5hbCBQSFkiCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvYW1kLXhnYmUtcGh5LmMgYi9kcml2ZXJzL25ldC9waHkvYW1kLXhnYmUtcGh5LmMKaW5kZXggMzJlZmJkNC4uZmIyNzZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L2FtZC14Z2JlLXBoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9hbWQteGdiZS1waHkuYwpAQCAtNzgsNiArNzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb3BlcnR5Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAogTU9EVUxFX0FVVEhPUigiVG9tIExlbmRhY2t5IDx0aG9tYXMubGVuZGFja3lAYW1kLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKQEAgLTEwMCw2ICsxMDEsOCBAQAogI2RlZmluZSBYR0JFX1BIWV9TUEVFRF8yNTAwCQkxCiAjZGVmaW5lIFhHQkVfUEhZX1NQRUVEXzEwMDAwCQkyCiAKKyNkZWZpbmUgWEdCRV9BTl9NU19USU1FT1VUCQk1MDAKKwogI2RlZmluZSBYR0JFX0FOX0lOVF9DTVBMVAkJMHgwMQogI2RlZmluZSBYR0JFX0FOX0lOQ19MSU5LCQkweDAyCiAjZGVmaW5lIFhHQkVfQU5fUEdfUkNWCQkJMHgwNApAQCAtNDM0LDYgKzQzNyw3IEBACiAJdW5zaWduZWQgaW50IGFuX3N1cHBvcnRlZDsKIAl1bnNpZ25lZCBpbnQgcGFyYWxsZWxfZGV0ZWN0OwogCXVuc2lnbmVkIGludCBmZWNfYWJpbGl0eTsKKwl1bnNpZ25lZCBsb25nIGFuX3N0YXJ0OwogCiAJdW5zaWduZWQgaW50IGxwbV9jdHJsOwkJLyogQ1RSTDEgZm9yIHJlc3VtZSAqLwogfTsKQEAgLTkwMiw4ICs5MDYsMjMgQEAKIHsKIAlzdHJ1Y3QgYW1kX3hnYmVfcGh5X3ByaXYgKnByaXYgPSBwaHlkZXYtPnByaXY7CiAJZW51bSBhbWRfeGdiZV9waHlfcnggKnN0YXRlOworCXVuc2lnbmVkIGxvbmcgYW5fdGltZW91dDsKIAlpbnQgcmV0OwogCisJaWYgKCFwcml2LT5hbl9zdGFydCkgeworCQlwcml2LT5hbl9zdGFydCA9IGppZmZpZXM7CisJfSBlbHNlIHsKKwkJYW5fdGltZW91dCA9IHByaXYtPmFuX3N0YXJ0ICsKKwkJCSAgICAgbXNlY3NfdG9famlmZmllcyhYR0JFX0FOX01TX1RJTUVPVVQpOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBhbl90aW1lb3V0KSkgeworCQkJLyogQXV0by1uZWdvdGlhdGlvbiB0aW1lZCBvdXQsIHJlc2V0IHN0YXRlICovCisJCQlwcml2LT5rcl9zdGF0ZSA9IEFNRF9YR0JFX1JYX0JQQTsKKwkJCXByaXYtPmt4X3N0YXRlID0gQU1EX1hHQkVfUlhfQlBBOworCisJCQlwcml2LT5hbl9zdGFydCA9IGppZmZpZXM7CisJCX0KKwl9CisKIAlzdGF0ZSA9IGFtZF94Z2JlX3BoeV9pbl9rcl9tb2RlKHBoeWRldikgPyAmcHJpdi0+a3Jfc3RhdGUKIAkJCQkJCTogJnByaXYtPmt4X3N0YXRlOwogCkBAIC05MzIsOCArOTUxLDggQEAKIAlpZiAoYW1kX3hnYmVfcGh5X2luX2tyX21vZGUocGh5ZGV2KSkgewogCQlwcml2LT5rcl9zdGF0ZSA9IEFNRF9YR0JFX1JYX0VSUk9SOwogCi0JCWlmICghKHBoeWRldi0+c3VwcG9ydGVkICYgU1VQUE9SVEVEXzEwMDBiYXNlS1hfRnVsbCkgJiYKLQkJICAgICEocGh5ZGV2LT5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMjUwMGJhc2VYX0Z1bGwpKQorCQlpZiAoIShwaHlkZXYtPmFkdmVydGlzaW5nICYgU1VQUE9SVEVEXzEwMDBiYXNlS1hfRnVsbCkgJiYKKwkJICAgICEocGh5ZGV2LT5hZHZlcnRpc2luZyAmIFNVUFBPUlRFRF8yNTAwYmFzZVhfRnVsbCkpCiAJCQlyZXR1cm4gQU1EX1hHQkVfQU5fTk9fTElOSzsKIAogCQlpZiAocHJpdi0+a3hfc3RhdGUgIT0gQU1EX1hHQkVfUlhfQlBBKQpAQCAtOTQxLDcgKzk2MCw3IEBACiAJfSBlbHNlIHsKIAkJcHJpdi0+a3hfc3RhdGUgPSBBTURfWEdCRV9SWF9FUlJPUjsKIAotCQlpZiAoIShwaHlkZXYtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsKSkKKwkJaWYgKCEocGh5ZGV2LT5hZHZlcnRpc2luZyAmIFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsKSkKIAkJCXJldHVybiBBTURfWEdCRV9BTl9OT19MSU5LOwogCiAJCWlmIChwcml2LT5rcl9zdGF0ZSAhPSBBTURfWEdCRV9SWF9CUEEpCkBAIC0xMDc4LDYgKzEwOTcsNyBAQAogCQlwcml2LT5hbl9zdGF0ZSA9IEFNRF9YR0JFX0FOX1JFQURZOwogCQlwcml2LT5rcl9zdGF0ZSA9IEFNRF9YR0JFX1JYX0JQQTsKIAkJcHJpdi0+a3hfc3RhdGUgPSBBTURfWEdCRV9SWF9CUEE7CisJCXByaXYtPmFuX3N0YXJ0ID0gMDsKIAl9CiAKIAlpZiAoY3VyX3N0YXRlICE9IHByaXYtPmFuX3N0YXRlKQpAQCAtMTEwMSw3ICsxMTIxLDcgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChwaHlkZXYtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMDAwMGJhc2VSX0ZFQykKKwlpZiAocGh5ZGV2LT5hZHZlcnRpc2luZyAmIFNVUFBPUlRFRF8xMDAwMGJhc2VSX0ZFQykKIAkJcmV0IHw9IDB4YzAwMDsKIAllbHNlCiAJCXJldCAmPSB+MHhjMDAwOwpAQCAtMTExMywxMyArMTEzMywxMyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHBoeWRldi0+c3VwcG9ydGVkICYgU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGwpCisJaWYgKHBoeWRldi0+YWR2ZXJ0aXNpbmcgJiBTVVBQT1JURURfMTAwMDBiYXNlS1JfRnVsbCkKIAkJcmV0IHw9IDB4ODA7CiAJZWxzZQogCQlyZXQgJj0gfjB4ODA7CiAKLQlpZiAoKHBoeWRldi0+c3VwcG9ydGVkICYgU1VQUE9SVEVEXzEwMDBiYXNlS1hfRnVsbCkgfHwKLQkgICAgKHBoeWRldi0+c3VwcG9ydGVkICYgU1VQUE9SVEVEXzI1MDBiYXNlWF9GdWxsKSkKKwlpZiAoKHBoeWRldi0+YWR2ZXJ0aXNpbmcgJiBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsKSB8fAorCSAgICAocGh5ZGV2LT5hZHZlcnRpc2luZyAmIFNVUFBPUlRFRF8yNTAwYmFzZVhfRnVsbCkpCiAJCXJldCB8PSAweDIwOwogCWVsc2UKIAkJcmV0ICY9IH4weDIwOwpAQCAtMTEzMSwxMiArMTE1MSwxMiBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHBoeWRldi0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX1BhdXNlKQorCWlmIChwaHlkZXYtPmFkdmVydGlzaW5nICYgU1VQUE9SVEVEX1BhdXNlKQogCQlyZXQgfD0gMHg0MDA7CiAJZWxzZQogCQlyZXQgJj0gfjB4NDAwOwogCi0JaWYgKHBoeWRldi0+c3VwcG9ydGVkICYgU1VQUE9SVEVEX0FzeW1fUGF1c2UpCisJaWYgKHBoeWRldi0+YWR2ZXJ0aXNpbmcgJiBTVVBQT1JURURfQXN5bV9QYXVzZSkKIAkJcmV0IHw9IDB4ODAwOwogCWVsc2UKIAkJcmV0ICY9IH4weDgwMDsKQEAgLTEyMTIsMzggKzEyMzIsMTQgQEAKIAkJcHJpdi0+YW5faXJxX2FsbG9jYXRlZCA9IDE7CiAJfQogCi0JcmV0ID0gcGh5X3JlYWRfbW1kKHBoeWRldiwgTURJT19NTURfUE1BUE1ELCBNRElPX1BNQV8xMEdCUl9GRUNfQUJJTElUWSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcHJpdi0+ZmVjX2FiaWxpdHkgPSByZXQgJiBYR0JFX1BIWV9GRUNfTUFTSzsKLQotCS8qIEluaXRpYWxpemUgc3VwcG9ydGVkIGZlYXR1cmVzICovCi0JcGh5ZGV2LT5zdXBwb3J0ZWQgPSBTVVBQT1JURURfQXV0b25lZzsKLQlwaHlkZXYtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfUGF1c2UgfCBTVVBQT1JURURfQXN5bV9QYXVzZTsKLQlwaHlkZXYtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfQmFja3BsYW5lOwotCXBoeWRldi0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsOwotCXN3aXRjaCAocHJpdi0+c3BlZWRfc2V0KSB7Ci0JY2FzZSBBTURfWEdCRV9QSFlfU1BFRURTRVRfMTAwMF8xMDAwMDoKLQkJcGh5ZGV2LT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzEwMDBiYXNlS1hfRnVsbDsKLQkJYnJlYWs7Ci0JY2FzZSBBTURfWEdCRV9QSFlfU1BFRURTRVRfMjUwMF8xMDAwMDoKLQkJcGh5ZGV2LT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzI1MDBiYXNlWF9GdWxsOwotCQlicmVhazsKLQl9Ci0KLQlpZiAocHJpdi0+ZmVjX2FiaWxpdHkgJiBYR0JFX1BIWV9GRUNfRU5BQkxFKQotCQlwaHlkZXYtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfMTAwMDBiYXNlUl9GRUM7Ci0KLQlwaHlkZXYtPmFkdmVydGlzaW5nID0gcGh5ZGV2LT5zdXBwb3J0ZWQ7Ci0KIAkvKiBTZXQgaW5pdGlhbCBtb2RlIC0gY2FsbCB0aGUgbW9kZSBzZXR0aW5nIHJvdXRpbmVzCiAJICogZGlyZWN0bHkgdG8gaW5zdXJlIHdlIGFyZSBwcm9wZXJseSBjb25maWd1cmVkCiAJICovCi0JaWYgKHBoeWRldi0+c3VwcG9ydGVkICYgU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGwpCisJaWYgKHBoeWRldi0+YWR2ZXJ0aXNpbmcgJiBTVVBQT1JURURfMTAwMDBiYXNlS1JfRnVsbCkKIAkJcmV0ID0gYW1kX3hnYmVfcGh5X3hnbWlpX21vZGUocGh5ZGV2KTsKLQllbHNlIGlmIChwaHlkZXYtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMDAwYmFzZUtYX0Z1bGwpCisJZWxzZSBpZiAocGh5ZGV2LT5hZHZlcnRpc2luZyAmIFNVUFBPUlRFRF8xMDAwYmFzZUtYX0Z1bGwpCiAJCXJldCA9IGFtZF94Z2JlX3BoeV9nbWlpX21vZGUocGh5ZGV2KTsKLQllbHNlIGlmIChwaHlkZXYtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8yNTAwYmFzZVhfRnVsbCkKKwllbHNlIGlmIChwaHlkZXYtPmFkdmVydGlzaW5nICYgU1VQUE9SVEVEXzI1MDBiYXNlWF9GdWxsKQogCQlyZXQgPSBhbWRfeGdiZV9waHlfZ21paV8yNTAwX21vZGUocGh5ZGV2KTsKIAllbHNlCiAJCXJldCA9IC1FSU5WQUw7CkBAIC0xMzE1LDEwICsxMzExLDEwIEBACiAJZGlzYWJsZV9pcnEocHJpdi0+YW5faXJxKTsKIAogCS8qIFN0YXJ0IGF1dG8tbmVnb3RpYXRpb24gaW4gYSBzdXBwb3J0ZWQgbW9kZSAqLwotCWlmIChwaHlkZXYtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMDAwMGJhc2VLUl9GdWxsKQorCWlmIChwaHlkZXYtPmFkdmVydGlzaW5nICYgU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGwpCiAJCXJldCA9IGFtZF94Z2JlX3BoeV9zZXRfbW9kZShwaHlkZXYsIEFNRF9YR0JFX01PREVfS1IpOwotCWVsc2UgaWYgKChwaHlkZXYtPnN1cHBvcnRlZCAmIFNVUFBPUlRFRF8xMDAwYmFzZUtYX0Z1bGwpIHx8Ci0JCSAocGh5ZGV2LT5zdXBwb3J0ZWQgJiBTVVBQT1JURURfMjUwMGJhc2VYX0Z1bGwpKQorCWVsc2UgaWYgKChwaHlkZXYtPmFkdmVydGlzaW5nICYgU1VQUE9SVEVEXzEwMDBiYXNlS1hfRnVsbCkgfHwKKwkJIChwaHlkZXYtPmFkdmVydGlzaW5nICYgU1VQUE9SVEVEXzI1MDBiYXNlWF9GdWxsKSkKIAkJcmV0ID0gYW1kX3hnYmVfcGh5X3NldF9tb2RlKHBoeWRldiwgQU1EX1hHQkVfTU9ERV9LWCk7CiAJZWxzZQogCQlyZXQgPSAtRUlOVkFMOwpAQCAtMTc0Niw2ICsxNzQyLDI5IEBACiAJCSAgICAgICBzaXplb2YocHJpdi0+c2VyZGVzX2RmZV90YXBfZW5hKSk7CiAJfQogCisJLyogSW5pdGlhbGl6ZSBzdXBwb3J0ZWQgZmVhdHVyZXMgKi8KKwlwaHlkZXYtPnN1cHBvcnRlZCA9IFNVUFBPUlRFRF9BdXRvbmVnOworCXBoeWRldi0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9QYXVzZSB8IFNVUFBPUlRFRF9Bc3ltX1BhdXNlOworCXBoeWRldi0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF9CYWNrcGxhbmU7CisJcGh5ZGV2LT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzEwMDAwYmFzZUtSX0Z1bGw7CisJc3dpdGNoIChwcml2LT5zcGVlZF9zZXQpIHsKKwljYXNlIEFNRF9YR0JFX1BIWV9TUEVFRFNFVF8xMDAwXzEwMDAwOgorCQlwaHlkZXYtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfMTAwMGJhc2VLWF9GdWxsOworCQlicmVhazsKKwljYXNlIEFNRF9YR0JFX1BIWV9TUEVFRFNFVF8yNTAwXzEwMDAwOgorCQlwaHlkZXYtPnN1cHBvcnRlZCB8PSBTVVBQT1JURURfMjUwMGJhc2VYX0Z1bGw7CisJCWJyZWFrOworCX0KKworCXJldCA9IHBoeV9yZWFkX21tZChwaHlkZXYsIE1ESU9fTU1EX1BNQVBNRCwgTURJT19QTUFfMTBHQlJfRkVDX0FCSUxJVFkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXByaXYtPmZlY19hYmlsaXR5ID0gcmV0ICYgWEdCRV9QSFlfRkVDX01BU0s7CisJaWYgKHByaXYtPmZlY19hYmlsaXR5ICYgWEdCRV9QSFlfRkVDX0VOQUJMRSkKKwkJcGh5ZGV2LT5zdXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzEwMDAwYmFzZVJfRkVDOworCisJcGh5ZGV2LT5hZHZlcnRpc2luZyA9IHBoeWRldi0+c3VwcG9ydGVkOworCiAJcGh5ZGV2LT5wcml2ID0gcHJpdjsKIAogCWlmICghcHJpdi0+YWRldiB8fCBhY3BpX2Rpc2FibGVkKQpAQCAtMTgxNyw2ICsxODM2LDcgQEAKIAkJLnBoeV9pZF9tYXNrCQk9IFhHQkVfUEhZX01BU0ssCiAJCS5uYW1lCQkJPSAiQU1EIFhHQkUgUEhZIiwKIAkJLmZlYXR1cmVzCQk9IDAsCisJCS5mbGFncwkJCT0gUEhZX0lTX0lOVEVSTkFMLAogCQkucHJvYmUJCQk9IGFtZF94Z2JlX3BoeV9wcm9iZSwKIAkJLnJlbW92ZQkJCT0gYW1kX3hnYmVfcGh5X3JlbW92ZSwKIAkJLnNvZnRfcmVzZXQJCT0gYW1kX3hnYmVfcGh5X3NvZnRfcmVzZXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvYXQ4MDN4LmMgYi9kcml2ZXJzL25ldC9waHkvYXQ4MDN4LmMKaW5kZXggZjgwZTE5YS4uZmFiZjExZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L2F0ODAzeC5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9hdDgwM3guYwpAQCAtMTkyLDE2ICsxOTIsMTcgQEAKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGh5ZGV2LT5kZXY7CiAJc3RydWN0IGF0ODAzeF9wcml2ICpwcml2OworCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9kX3Jlc2V0OwogCiAJcHJpdiA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOwogCWlmICghcHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlwcml2LT5ncGlvZF9yZXNldCA9IGRldm1fZ3Bpb2RfZ2V0KGRldiwgInJlc2V0Iik7Ci0JaWYgKElTX0VSUihwcml2LT5ncGlvZF9yZXNldCkpCi0JCXByaXYtPmdwaW9kX3Jlc2V0ID0gTlVMTDsKLQllbHNlCi0JCWdwaW9kX2RpcmVjdGlvbl9vdXRwdXQocHJpdi0+Z3Bpb2RfcmVzZXQsIDEpOworCWdwaW9kX3Jlc2V0ID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoZGV2LCAicmVzZXQiLCBHUElPRF9PVVRfSElHSCk7CisJaWYgKElTX0VSUihncGlvZF9yZXNldCkpCisJCXJldHVybiBQVFJfRVJSKGdwaW9kX3Jlc2V0KTsKKworCXByaXYtPmdwaW9kX3Jlc2V0ID0gZ3Bpb2RfcmVzZXQ7CiAKIAlwaHlkZXYtPnByaXYgPSBwcml2OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvYmNtN3h4eC5jIGIvZHJpdmVycy9uZXQvcGh5L2JjbTd4eHguYwppbmRleCA5NzRlYzQ1Li42NGM3NGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvYmNtN3h4eC5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9iY203eHh4LmMKQEAgLTM5Niw2ICszOTYsNyBAQAogCUJDTTdYWFhfMjhOTV9HUEhZKFBIWV9JRF9CQ003MzY0LCAiQnJvYWRjb20gQkNNNzM2NCIpLAogCUJDTTdYWFhfMjhOTV9HUEhZKFBIWV9JRF9CQ003MzY2LCAiQnJvYWRjb20gQkNNNzM2NiIpLAogCUJDTTdYWFhfMjhOTV9HUEhZKFBIWV9JRF9CQ003NDM5LCAiQnJvYWRjb20gQkNNNzQzOSIpLAorCUJDTTdYWFhfMjhOTV9HUEhZKFBIWV9JRF9CQ003NDM5XzIsICJCcm9hZGNvbSBCQ003NDM5ICgyKSIpLAogCUJDTTdYWFhfMjhOTV9HUEhZKFBIWV9JRF9CQ003NDQ1LCAiQnJvYWRjb20gQkNNNzQ0NSIpLAogewogCS5waHlfaWQgICAgICAgICA9IFBIWV9JRF9CQ003NDI1LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L2Jyb2FkY29tLmMgYi9kcml2ZXJzL25ldC9waHkvYnJvYWRjb20uYwppbmRleCBhNTJhZmIyLi45YzcxMjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvYnJvYWRjb20uYworKysgYi9kcml2ZXJzL25ldC9waHkvYnJvYWRjb20uYwpAQCAtNTQ5LDYgKzU0OSwxOSBAQAogCS5jb25maWdfaW50cgk9IGJjbTU0eHhfY29uZmlnX2ludHIsCiAJLmRyaXZlcgkJPSB7IC5vd25lciA9IFRISVNfTU9EVUxFIH0sCiB9LCB7CisJLnBoeV9pZAkJPSBQSFlfSURfQkNNNTQ2MTZTLAorCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCisJLm5hbWUJCT0gIkJyb2FkY29tIEJDTTU0NjE2UyIsCisJLmZlYXR1cmVzCT0gUEhZX0dCSVRfRkVBVFVSRVMgfAorCQkJICBTVVBQT1JURURfUGF1c2UgfCBTVVBQT1JURURfQXN5bV9QYXVzZSwKKwkuZmxhZ3MJCT0gUEhZX0hBU19NQUdJQ0FORUcgfCBQSFlfSEFTX0lOVEVSUlVQVCwKKwkuY29uZmlnX2luaXQJPSBiY201NHh4X2NvbmZpZ19pbml0LAorCS5jb25maWdfYW5lZwk9IGdlbnBoeV9jb25maWdfYW5lZywKKwkucmVhZF9zdGF0dXMJPSBnZW5waHlfcmVhZF9zdGF0dXMsCisJLmFja19pbnRlcnJ1cHQJPSBiY201NHh4X2Fja19pbnRlcnJ1cHQsCisJLmNvbmZpZ19pbnRyCT0gYmNtNTR4eF9jb25maWdfaW50ciwKKwkuZHJpdmVyCQk9IHsgLm93bmVyID0gVEhJU19NT0RVTEUgfSwKK30sIHsKIAkucGh5X2lkCQk9IFBIWV9JRF9CQ001NDY0LAogCS5waHlfaWRfbWFzawk9IDB4ZmZmZmZmZjAsCiAJLm5hbWUJCT0gIkJyb2FkY29tIEJDTTU0NjQiLApAQCAtNjYwLDYgKzY3Myw3IEBACiAJeyBQSFlfSURfQkNNNTQxMSwgMHhmZmZmZmZmMCB9LAogCXsgUEhZX0lEX0JDTTU0MjEsIDB4ZmZmZmZmZjAgfSwKIAl7IFBIWV9JRF9CQ001NDYxLCAweGZmZmZmZmYwIH0sCisJeyBQSFlfSURfQkNNNTQ2MTZTLCAweGZmZmZmZmYwIH0sCiAJeyBQSFlfSURfQkNNNTQ2NCwgMHhmZmZmZmZmMCB9LAogCXsgUEhZX0lEX0JDTTU0ODIsIDB4ZmZmZmZmZjAgfSwKIAl7IFBIWV9JRF9CQ001NDgyLCAweGZmZmZmZmYwIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvZHA4MzY0MC5jIGIvZHJpdmVycy9uZXQvcGh5L2RwODM2NDAuYwppbmRleCBlMjJlNjAyLi40OTZlMDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvZHA4MzY0MC5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9kcDgzNjQwLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCiAvKiBDYWxsZXIgbXVzdCBob2xkIGV4dHJlZ19sb2NrLiAqLwogc3RhdGljIGludCB0ZHJfd3JpdGUoaW50IGJjLCBzdHJ1Y3QgcGh5X2RldmljZSAqZGV2LAotCQkgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMsIHUxNiBjbWQpCisJCSAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjNjQgKnRzLCB1MTYgY21kKQogewogCWV4dF93cml0ZShiYywgZGV2LCBQQUdFNCwgUFRQX1REUiwgdHMtPnR2X25zZWMgJiAweGZmZmYpOy8qIG5zWzE1OjBdICAqLwogCWV4dF93cml0ZShiYywgZGV2LCBQQUdFNCwgUFRQX1REUiwgdHMtPnR2X25zZWMgPj4gMTYpOyAgIC8qIG5zWzMxOjE2XSAqLwpAQCAtNDExLDEyICs0MTEsMTIgQEAKIAlzdHJ1Y3QgZHA4MzY0MF9jbG9jayAqY2xvY2sgPQogCQljb250YWluZXJfb2YocHRwLCBzdHJ1Y3QgZHA4MzY0MF9jbG9jaywgY2Fwcyk7CiAJc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiA9IGNsb2NrLT5jaG9zZW4tPnBoeWRldjsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHRpbWVzcGVjNjQgdHM7CiAJaW50IGVycjsKIAogCWRlbHRhICs9IEFESlRJTUVfRklYOwogCi0JdHMgPSBuc190b190aW1lc3BlYyhkZWx0YSk7CisJdHMgPSBuc190b190aW1lc3BlYzY0KGRlbHRhKTsKIAogCW11dGV4X2xvY2soJmNsb2NrLT5leHRyZWdfbG9jayk7CiAKQEAgLTQyNyw3ICs0MjcsOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcHRwX2RwODM2NDBfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgc3RydWN0IHRpbWVzcGVjICp0cykKK3N0YXRpYyBpbnQgcHRwX2RwODM2NDBfZ2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKKwkJCSAgICAgICBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJc3RydWN0IGRwODM2NDBfY2xvY2sgKmNsb2NrID0KIAkJY29udGFpbmVyX29mKHB0cCwgc3RydWN0IGRwODM2NDBfY2xvY2ssIGNhcHMpOwpAQCAtNDUyLDcgKzQ1Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcHRwX2RwODM2NDBfc2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorCQkJICAgICAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAlzdHJ1Y3QgZHA4MzY0MF9jbG9jayAqY2xvY2sgPQogCQljb250YWluZXJfb2YocHRwLCBzdHJ1Y3QgZHA4MzY0MF9jbG9jaywgY2Fwcyk7CkBAIC02MDUsNyArNjA2LDcgQEAKIHsKIAlzNjQgbm93LCBkaWZmOwogCXN0cnVjdCBwaHlfdHh0cyBldmVudF90czsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHRpbWVzcGVjNjQgdHM7CiAJc3RydWN0IGxpc3RfaGVhZCAqdGhpczsKIAlzdHJ1Y3QgZHA4MzY0MF9wcml2YXRlICp0bXA7CiAJc3RydWN0IHBoeV9kZXZpY2UgKm1hc3RlciA9IGNsb2NrLT5jaG9zZW4tPnBoeWRldjsKQEAgLTYxNCw3ICs2MTUsNyBAQAogCXRyaWdnZXIgPSBDQUxfVFJJR0dFUjsKIAljYWxfZ3BpbyA9IDEgKyBwdHBfZmluZF9waW4oY2xvY2stPnB0cF9jbG9jaywgUFRQX1BGX1BIWVNZTkMsIDApOwogCWlmIChjYWxfZ3BpbyA8IDEpIHsKLQkJcHJfZXJyKCJQSFkgY2FsaWJyYXRpb24gcGluIG5vdCBhdmFpYmxlIC0gUEhZIGlzIG5vdCBjYWxpYnJhdGVkLiIpOworCQlwcl9lcnIoIlBIWSBjYWxpYnJhdGlvbiBwaW4gbm90IGF2YWlsYWJsZSAtIFBIWSBpcyBub3QgY2FsaWJyYXRlZC4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjk3LDcgKzY5OCw3IEBACiAJCWRpZmYgPSBub3cgLSAoczY0KSBwaHkydHh0cygmZXZlbnRfdHMpOwogCQlwcl9pbmZvKCJzbGF2ZSBvZmZzZXQgJWxsZCBuYW5vc2Vjb25kc1xuIiwgZGlmZik7CiAJCWRpZmYgKz0gQURKVElNRV9GSVg7Ci0JCXRzID0gbnNfdG9fdGltZXNwZWMoZGlmZik7CisJCXRzID0gbnNfdG9fdGltZXNwZWM2NChkaWZmKTsKIAkJdGRyX3dyaXRlKDAsIHRtcC0+cGh5ZGV2LCAmdHMsIFBUUF9TVEVQX0NMSyk7CiAJfQogCkBAIC05OTgsOCArOTk5LDggQEAKIAljbG9jay0+Y2Fwcy5wcHMJCT0gMDsKIAljbG9jay0+Y2Fwcy5hZGpmcmVxCT0gcHRwX2RwODM2NDBfYWRqZnJlcTsKIAljbG9jay0+Y2Fwcy5hZGp0aW1lCT0gcHRwX2RwODM2NDBfYWRqdGltZTsKLQljbG9jay0+Y2Fwcy5nZXR0aW1lCT0gcHRwX2RwODM2NDBfZ2V0dGltZTsKLQljbG9jay0+Y2Fwcy5zZXR0aW1lCT0gcHRwX2RwODM2NDBfc2V0dGltZTsKKwljbG9jay0+Y2Fwcy5nZXR0aW1lNjQJPSBwdHBfZHA4MzY0MF9nZXR0aW1lOworCWNsb2NrLT5jYXBzLnNldHRpbWU2NAk9IHB0cF9kcDgzNjQwX3NldHRpbWU7CiAJY2xvY2stPmNhcHMuZW5hYmxlCT0gcHRwX2RwODM2NDBfZW5hYmxlOwogCWNsb2NrLT5jYXBzLnZlcmlmeQk9IHB0cF9kcDgzNjQwX3ZlcmlmeTsKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L2ZpeGVkX3BoeS5jIGIvZHJpdmVycy9uZXQvcGh5L2ZpeGVkX3BoeS5jCmluZGV4IGEwOGEzYzcuLjE5NjBiNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9maXhlZF9waHkuYworKysgYi9kcml2ZXJzL25ldC9waHkvZml4ZWRfcGh5LmMKQEAgLTE4Myw2ICsxODMsMzUgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGZpeGVkX3BoeV9zZXRfbGlua191cGRhdGUpOwogCitpbnQgZml4ZWRfcGh5X3VwZGF0ZV9zdGF0ZShzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LAorCQkJICAgY29uc3Qgc3RydWN0IGZpeGVkX3BoeV9zdGF0dXMgKnN0YXR1cywKKwkJCSAgIGNvbnN0IHN0cnVjdCBmaXhlZF9waHlfc3RhdHVzICpjaGFuZ2VkKQoreworCXN0cnVjdCBmaXhlZF9tZGlvX2J1cyAqZm1iID0gJnBsYXRmb3JtX2ZtYjsKKwlzdHJ1Y3QgZml4ZWRfcGh5ICpmcDsKKworCWlmICghcGh5ZGV2IHx8ICFwaHlkZXYtPmJ1cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZwLCAmZm1iLT5waHlzLCBub2RlKSB7CisJCWlmIChmcC0+YWRkciA9PSBwaHlkZXYtPmFkZHIpIHsKKyNkZWZpbmUgX1VQRCh4KSBpZiAoY2hhbmdlZC0+eCkgXAorCWZwLT5zdGF0dXMueCA9IHN0YXR1cy0+eAorCQkJX1VQRChsaW5rKTsKKwkJCV9VUEQoc3BlZWQpOworCQkJX1VQRChkdXBsZXgpOworCQkJX1VQRChwYXVzZSk7CisJCQlfVVBEKGFzeW1fcGF1c2UpOworI3VuZGVmIF9VUEQKKwkJCWZpeGVkX3BoeV91cGRhdGVfcmVncyhmcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiAtRU5PRU5UOworfQorRVhQT1JUX1NZTUJPTChmaXhlZF9waHlfdXBkYXRlX3N0YXRlKTsKKwogaW50IGZpeGVkX3BoeV9hZGQodW5zaWduZWQgaW50IGlycSwgaW50IHBoeV9hZGRyLAogCQkgIHN0cnVjdCBmaXhlZF9waHlfc3RhdHVzICpzdGF0dXMpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWRpby1iY20tdW5pbWFjLmMgYi9kcml2ZXJzL25ldC9waHkvbWRpby1iY20tdW5pbWFjLmMKaW5kZXggNmRlYWM2ZC4uNDE0ZmRmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L21kaW8tYmNtLXVuaW1hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLWJjbS11bmltYWMuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVuaW1hY19tZGlvX2lkc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdW5pbWFjX21kaW9faWRzW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJicmNtLGdlbmV0LW1kaW8tdjQiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxnZW5ldC1tZGlvLXYzIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gImJyY20sZ2VuZXQtbWRpby12MiIsIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWRpby1ncGlvLmMgYi9kcml2ZXJzL25ldC9waHkvbWRpby1ncGlvLmMKaW5kZXggMGEwNTc4YS4uNDljZTdlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L21kaW8tZ3Bpby5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLWdwaW8uYwpAQCAtMjQ5LDcgKzI0OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1kaW9fZ3Bpb19vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWRpb19ncGlvX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJ2aXJ0dWFsLG1kaW8tZ3BpbyIsIH0sCiAJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21kaW8tbXV4LWdwaW8uYyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLW11eC1ncGlvLmMKaW5kZXggMzIwZWIxNS4uMWE4N2E1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L21kaW8tbXV4LWdwaW8uYworKysgYi9kcml2ZXJzL25ldC9waHkvbWRpby1tdXgtZ3Bpby5jCkBAIC05OSw3ICs5OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1kaW9fbXV4X2dwaW9fbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1kaW9fbXV4X2dwaW9fbWF0Y2hbXSA9IHsKIAl7CiAJCS5jb21wYXRpYmxlID0gIm1kaW8tbXV4LWdwaW8iLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvbWRpby1tdXgtbW1pb3JlZy5jIGIvZHJpdmVycy9uZXQvcGh5L21kaW8tbXV4LW1taW9yZWcuYwppbmRleCAwYWE5ODVjLi4yMzc3YzEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpby1tdXgtbW1pb3JlZy5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLW11eC1tbWlvcmVnLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtZGlvX211eF9tbWlvcmVnX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtZGlvX211eF9tbWlvcmVnX21hdGNoW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJtZGlvLW11eC1tbWlvcmVnIiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21kaW8tb2N0ZW9uLmMgYi9kcml2ZXJzL25ldC9waHkvbWRpby1vY3Rlb24uYwppbmRleCBjODEwNTI0Li5jODM4YWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpby1vY3Rlb24uYworKysgYi9kcml2ZXJzL25ldC9waHkvbWRpby1vY3Rlb24uYwpAQCAtMjUyLDcgKzI1Miw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9jdGVvbl9tZGlvYnVzX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvY3Rlb25fbWRpb2J1c19tYXRjaFtdID0gewogCXsKIAkJLmNvbXBhdGlibGUgPSAiY2F2aXVtLG9jdGVvbi0zODYwLW1kaW8iLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9wcHAvcHBwb2UuYyBiL2RyaXZlcnMvbmV0L3BwcC9wcHBvZS5jCmluZGV4IGQyNDA4YTUuLmZmMDU5ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BwcC9wcHBvZS5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcC9wcHBvZS5jCkBAIC00NTUsNiArNDU1LDE4IEBACiAJcmV0dXJuIE5FVF9SWF9EUk9QOwogfQogCitzdGF0aWMgdm9pZCBwcHBvZV91bmJpbmRfc29ja193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcHBwb3hfc29jayAqcG8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBwcG94X3NvY2ssCisJCQkJCSAgICAgcHJvdG8ucHBwb2UucGFkdF93b3JrKTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza19wcHBveChwbyk7CisKKwlsb2NrX3NvY2soc2spOworCXBwcG94X3VuYmluZF9zb2NrKHNrKTsKKwlyZWxlYXNlX3NvY2soc2spOworCXNvY2tfcHV0KHNrKTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFJlY2VpdmUgYSBQUFBvRSBEaXNjb3ZlcnkgZnJhbWUuCkBAIC01MDAsNyArNTEyLDggQEAKIAkJfQogCiAJCWJoX3VubG9ja19zb2NrKHNrKTsKLQkJc29ja19wdXQoc2spOworCQlpZiAoIXNjaGVkdWxlX3dvcmsoJnBvLT5wcm90by5wcHBvZS5wYWR0X3dvcmspKQorCQkJc29ja19wdXQoc2spOwogCX0KIAogYWJvcnQ6CkBAIC02MTMsNiArNjI2LDggQEAKIAogCWxvY2tfc29jayhzayk7CiAKKwlJTklUX1dPUksoJnBvLT5wcm90by5wcHBvZS5wYWR0X3dvcmssIHBwcG9lX3VuYmluZF9zb2NrX3dvcmspOworCiAJZXJyb3IgPSAtRUlOVkFMOwogCWlmIChzcC0+c2FfcHJvdG9jb2wgIT0gUFhfUFJPVE9fT0UpCiAJCWdvdG8gZW5kOwpAQCAtODIwLDggKzgzNSw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBwcHBvZV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgdG90YWxfbGVuKQorc3RhdGljIGludCBwcHBvZV9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sCisJCQkgc2l6ZV90IHRvdGFsX2xlbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwpAQCAtOTYyLDggKzk3Nyw4IEBACiAJLnN0YXJ0X3htaXQgPSBwcHBvZV94bWl0LAogfTsKIAotc3RhdGljIGludCBwcHBvZV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgdG90YWxfbGVuLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IHBwcG9lX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbSwKKwkJCSBzaXplX3QgdG90YWxfbGVuLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BwcC9wcHRwLmMgYi9kcml2ZXJzL25ldC9wcHAvcHB0cC5jCmluZGV4IDFkYzYyOGYuLmUzYmZiZDRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9wcHAvcHB0cC5jCisrKyBiL2RyaXZlcnMvbmV0L3BwcC9wcHRwLmMKQEAgLTI4MSw3ICsyODEsNyBAQAogCW5mX3Jlc2V0KHNrYik7CiAKIAlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX05PTkU7Ci0JaXBfc2VsZWN0X2lkZW50KHNrYiwgTlVMTCk7CisJaXBfc2VsZWN0X2lkZW50KHNvY2tfbmV0KHNrKSwgc2tiLCBOVUxMKTsKIAlpcF9zZW5kX2NoZWNrKGlwaCk7CiAKIAlpcF9sb2NhbF9vdXQoc2tiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3NiMTAwMC5jIGIvZHJpdmVycy9uZXQvc2IxMDAwLmMKaW5kZXggNjZjMmYxYS4uYWFkMGI1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvc2IxMDAwLmMKKysrIGIvZHJpdmVycy9uZXQvc2IxMDAwLmMKQEAgLTExNzUsMTcgKzExNzUsNCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJHZW5lcmFsIEluc3RydW1lbnRzIFNCMTAwMCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotc3RhdGljIGludCBfX2luaXQKLXNiMTAwMF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBucF9yZWdpc3Rlcl9kcml2ZXIoJnNiMTAwMF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLXNiMTAwMF9leGl0KHZvaWQpCi17Ci0JcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZzYjEwMDBfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc2IxMDAwX2luaXQpOwotbW9kdWxlX2V4aXQoc2IxMDAwX2V4aXQpOworbW9kdWxlX3BucF9kcml2ZXIoc2IxMDAwX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZWFtL3RlYW0uYyBiL2RyaXZlcnMvbmV0L3RlYW0vdGVhbS5jCmluZGV4IDdkMzk0ODQuLjY5Mjg0NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3RlYW0vdGVhbS5jCisrKyBiL2RyaXZlcnMvbmV0L3RlYW0vdGVhbS5jCkBAIC0xOTM1LDYgKzE5MzUsOSBAQAogCQkJCQkJICAgICBtYXNrKTsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlmZWF0dXJlcyA9IG5ldGRldl9hZGRfdHNvX2ZlYXR1cmVzKGZlYXR1cmVzLCBtYXNrKTsKKwogCXJldHVybiBmZWF0dXJlczsKIH0KIApAQCAtMTk3Niw2ICsxOTc5LDcgQEAKIAkubmRvX2NoYW5nZV9jYXJyaWVyICAgICA9IHRlYW1fY2hhbmdlX2NhcnJpZXIsCiAJLm5kb19icmlkZ2Vfc2V0bGluayAgICAgPSBuZG9fZGZsdF9uZXRkZXZfc3dpdGNoX3BvcnRfYnJpZGdlX3NldGxpbmssCiAJLm5kb19icmlkZ2VfZGVsbGluayAgICAgPSBuZG9fZGZsdF9uZXRkZXZfc3dpdGNoX3BvcnRfYnJpZGdlX2RlbGxpbmssCisJLm5kb19mZWF0dXJlc19jaGVjawk9IHBhc3N0aHJ1X2ZlYXR1cmVzX2NoZWNrLAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90dW4uYyBiL2RyaXZlcnMvbmV0L3R1bi5jCmluZGV4IDg1N2RjYTQuLmU0NzBhZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3R1bi5jCisrKyBiL2RyaXZlcnMvbmV0L3R1bi5jCkBAIC0xNDQ4LDggKzE0NDgsNyBAQAogCWtpbGxfZmFzeW5jKCZ0ZmlsZS0+ZmFzeW5jLCBTSUdJTywgUE9MTF9PVVQpOwogfQogCi1zdGF0aWMgaW50IHR1bl9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCB0b3RhbF9sZW4pCitzdGF0aWMgaW50IHR1bl9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCB0b3RhbF9sZW4pCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgdHVuX2ZpbGUgKnRmaWxlID0gY29udGFpbmVyX29mKHNvY2ssIHN0cnVjdCB0dW5fZmlsZSwgc29ja2V0KTsKQEAgLTE0NjQsOCArMTQ2Myw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB0dW5fcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgdG90YWxfbGVuLAorc3RhdGljIGludCB0dW5fcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgdG90YWxfbGVuLAogCQkgICAgICAgaW50IGZsYWdzKQogewogCXN0cnVjdCB0dW5fZmlsZSAqdGZpbGUgPSBjb250YWluZXJfb2Yoc29jaywgc3RydWN0IHR1bl9maWxlLCBzb2NrZXQpOwpAQCAtMjIyNSw4ICsyMjIzLDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHR1bl9mb3BzID0gewogCS5vd25lcgk9IFRISVNfTU9EVUxFLAogCS5sbHNlZWsgPSBub19sbHNlZWssCi0JLnJlYWQgID0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUgPSBuZXdfc3luY193cml0ZSwKIAkucmVhZF9pdGVyICA9IHR1bl9jaHJfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyID0gdHVuX2Nocl93cml0ZV9pdGVyLAogCS5wb2xsCT0gdHVuX2Nocl9wb2xsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2FzaXhfY29tbW9uLmMgYi9kcml2ZXJzL25ldC91c2IvYXNpeF9jb21tb24uYwppbmRleCA1YzU1ZjExLi43NWQ2ZjI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvYXNpeF9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC91c2IvYXNpeF9jb21tb24uYwpAQCAtMTg4LDYgKzE4OCw4IEBACiAJCW1lbWNweShza2JfdGFpbF9wb2ludGVyKHNrYiksICZwYWRieXRlcywgc2l6ZW9mKHBhZGJ5dGVzKSk7CiAJCXNrYl9wdXQoc2tiLCBzaXplb2YocGFkYnl0ZXMpKTsKIAl9CisKKwl1c2JuZXRfc2V0X3NrYl90eF9zdGF0cyhza2IsIDEsIDApOwogCXJldHVybiBza2I7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9jYXRjLmMgYi9kcml2ZXJzL25ldC91c2IvY2F0Yy5jCmluZGV4IDhjZmMzYmIuLjRlMmIyNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9jYXRjLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2NhdGMuYwpAQCAtNjQxLDcgKzY0MSw3IEBACiAJdTggYnJvYWRjYXN0W0VUSF9BTEVOXTsKIAl1OCByeCA9IFJ4RW5hYmxlIHwgUnhQb2xhcml0eSB8IFJ4TXVsdGlDYXN0OwogCi0JbWVtc2V0KGJyb2FkY2FzdCwgMHhmZiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcihicm9hZGNhc3QpOwogCW1lbXNldChjYXRjLT5tdWx0aWNhc3QsIDAsIDY0KTsKIAogCWNhdGNfbXVsdGljYXN0KGJyb2FkY2FzdCwgY2F0Yy0+bXVsdGljYXN0KTsKQEAgLTg4MCw3ICs4ODAsNyBAQAogCQkKIAkJZGV2X2RiZyhkZXYsICJGaWxsaW5nIHRoZSBtdWx0aWNhc3QgbGlzdC5cbiIpOwogCSAgCi0JCW1lbXNldChicm9hZGNhc3QsIDB4ZmYsIEVUSF9BTEVOKTsKKwkJZXRoX2Jyb2FkY2FzdF9hZGRyKGJyb2FkY2FzdCk7CiAJCWNhdGNfbXVsdGljYXN0KGJyb2FkY2FzdCwgY2F0Yy0+bXVsdGljYXN0KTsKIAkJY2F0Y19tdWx0aWNhc3QobmV0ZGV2LT5kZXZfYWRkciwgY2F0Yy0+bXVsdGljYXN0KTsKIAkJY2F0Y193cml0ZV9tZW0oY2F0YywgMHhmYTgwLCBjYXRjLT5tdWx0aWNhc3QsIDY0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfZXRoZXIuYyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfZXRoZXIuYwppbmRleCA5MzExYTA4Li40NTQ1ZTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvY2RjX2V0aGVyLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2NkY19ldGhlci5jCkBAIC01MjIsNiArNTIyLDcgQEAKICNkZWZpbmUgREVMTF9WRU5ET1JfSUQJCTB4NDEzQwogI2RlZmluZSBSRUFMVEVLX1ZFTkRPUl9JRAkweDBiZGEKICNkZWZpbmUgU0FNU1VOR19WRU5ET1JfSUQJMHgwNGU4CisjZGVmaW5lIExFTk9WT19WRU5ET1JfSUQJMHgxN2VmCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZAlwcm9kdWN0c1tdID0gewogLyogQkxBQ0tMSVNUICEhCkBAIC03MDIsNiArNzAzLDEzIEBACiAJLmRyaXZlcl9pbmZvID0gMCwKIH0sCiAKKy8qIExlbm92byBUaGlua3BhZCBVU0IgMy4wIEV0aGVybmV0IEFkYXB0ZXJzIChiYXNlZCBvbiBSZWFsdGVrIFJUTDgxNTMpICovCit7CisJVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oTEVOT1ZPX1ZFTkRPUl9JRCwgMHg3MjA1LCBVU0JfQ0xBU1NfQ09NTSwKKwkJCVVTQl9DRENfU1VCQ0xBU1NfRVRIRVJORVQsIFVTQl9DRENfUFJPVE9fTk9ORSksCisJLmRyaXZlcl9pbmZvID0gMCwKK30sCisKIC8qIFdISVRFTElTVCEhIQogICoKICAqIENEQyBFdGhlciB1c2VzIHR3byBpbnRlcmZhY2VzLCBub3QgbmVjZXNzYXJpbHkgY29uc2VjdXRpdmUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvY2RjX21iaW0uYyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfbWJpbS5jCmluZGV4IDk2ZmM4YTUuLmU0YjdhNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfbWJpbS5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfbWJpbS5jCkBAIC0zOTQsNyArMzk0LDcgQEAKIAlza2JfcHV0KHNrYiwgRVRIX0hMRU4pOwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJZXRoX2hkcihza2IpLT5oX3Byb3RvID0gcHJvdG87Ci0JbWVtc2V0KGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKGV0aF9oZHIoc2tiKS0+aF9zb3VyY2UpOwogCW1lbWNweShldGhfaGRyKHNrYiktPmhfZGVzdCwgZGV2LT5uZXQtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAKIAkvKiBhZGQgZGF0YWdyYW0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMgYi9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jCmluZGV4IDgwYTg0NGUuLmMzZTRkYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2NkY19uY20uYwpAQCAtMTE3MiwxNyArMTE3MiwxNyBAQAogCiAJLyogcmV0dXJuIHNrYiAqLwogCWN0eC0+dHhfY3Vycl9za2IgPSBOVUxMOwotCWRldi0+bmV0LT5zdGF0cy50eF9wYWNrZXRzICs9IGN0eC0+dHhfY3Vycl9mcmFtZV9udW07CiAKIAkvKiBrZWVwIHByaXZhdGUgc3RhdHM6IGZyYW1pbmcgb3ZlcmhlYWQgYW5kIG51bWJlciBvZiBOVEJzICovCiAJY3R4LT50eF9vdmVyaGVhZCArPSBza2Jfb3V0LT5sZW4gLSBjdHgtPnR4X2N1cnJfZnJhbWVfcGF5bG9hZDsKIAljdHgtPnR4X250YnMrKzsKIAotCS8qIHVzYm5ldCBoYXMgYWxyZWFkeSBjb3VudGVkIGFsbCB0aGUgZnJhbWluZyBvdmVyaGVhZC4KKwkvKiB1c2JuZXQgd2lsbCBjb3VudCBhbGwgdGhlIGZyYW1pbmcgb3ZlcmhlYWQgYnkgZGVmYXVsdC4KIAkgKiBBZGp1c3QgdGhlIHN0YXRzIHNvIHRoYXQgdGhlIHR4X2J5dGVzIGNvdW50ZXIgc2hvdyByZWFsCiAJICogcGF5bG9hZCBkYXRhIGluc3RlYWQuCiAJICovCi0JZGV2LT5uZXQtPnN0YXRzLnR4X2J5dGVzIC09IHNrYl9vdXQtPmxlbiAtIGN0eC0+dHhfY3Vycl9mcmFtZV9wYXlsb2FkOworCXVzYm5ldF9zZXRfc2tiX3R4X3N0YXRzKHNrYl9vdXQsIG4sCisJCQkJY3R4LT50eF9jdXJyX2ZyYW1lX3BheWxvYWQgLSBza2Jfb3V0LT5sZW4pOwogCiAJcmV0dXJuIHNrYl9vdXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9jeDgyMzEwX2V0aC5jIGIvZHJpdmVycy9uZXQvdXNiL2N4ODIzMTBfZXRoLmMKaW5kZXggM2VlZDcwOC4uZTIyMWJmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2N4ODIzMTBfZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2N4ODIzMTBfZXRoLmMKQEAgLTQ2LDggKzQ2LDcgQEAKIH07CiAKICNkZWZpbmUgQ01EX1BBQ0tFVF9TSVpFCTY0Ci0vKiBmaXJzdCBjb21tYW5kIGFmdGVyIHBvd2VyIG9uIGNhbiB0YWtlIGFyb3VuZCA4IHNlY29uZHMgKi8KLSNkZWZpbmUgQ01EX1RJTUVPVVQJMTUwMDAKKyNkZWZpbmUgQ01EX1RJTUVPVVQJMTAwCiAjZGVmaW5lIENNRF9SRVBMWV9SRVRSWSA1CiAKICNkZWZpbmUgQ1g4MjMxMF9NVFUJMTUxNApAQCAtNzgsOCArNzcsOSBAQAogCXJldCA9IHVzYl9idWxrX21zZyh1ZGV2LCB1c2Jfc25kYnVsa3BpcGUodWRldiwgQ01EX0VQKSwgYnVmLAogCQkJICAgQ01EX1BBQ0tFVF9TSVpFLCAmYWN0dWFsX2xlbiwgQ01EX1RJTUVPVVQpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LCAic2VuZCBjb21tYW5kICUjeDogZXJyb3IgJWRcbiIsCi0JCQljbWQsIHJldCk7CisJCWlmIChjbWQgIT0gQ01EX0dFVF9MSU5LX1NUQVRVUykKKwkJCWRldl9lcnIoJmRldi0+dWRldi0+ZGV2LCAic2VuZCBjb21tYW5kICUjeDogZXJyb3IgJWRcbiIsCisJCQkJY21kLCByZXQpOwogCQlnb3RvIGVuZDsKIAl9CiAKQEAgLTkwLDggKzkwLDEwIEBACiAJCQkJCSAgIGJ1ZiwgQ01EX1BBQ0tFVF9TSVpFLCAmYWN0dWFsX2xlbiwKIAkJCQkJICAgQ01EX1RJTUVPVVQpOwogCQkJaWYgKHJldCA8IDApIHsKLQkJCQlkZXZfZXJyKCZkZXYtPnVkZXYtPmRldiwKLQkJCQkJInJlcGx5IHJlY2VpdmUgZXJyb3IgJWRcbiIsIHJldCk7CisJCQkJaWYgKGNtZCAhPSBDTURfR0VUX0xJTktfU1RBVFVTKQorCQkJCQlkZXZfZXJyKCZkZXYtPnVkZXYtPmRldiwKKwkJCQkJCSJyZXBseSByZWNlaXZlIGVycm9yICVkXG4iLAorCQkJCQkJcmV0KTsKIAkJCQlnb3RvIGVuZDsKIAkJCX0KIAkJCWlmIChhY3R1YWxfbGVuID4gMCkKQEAgLTEzNCw2ICsxMzYsOCBAQAogCWludCByZXQ7CiAJY2hhciBidWZbMTVdOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gZGV2LT51ZGV2OworCXU4IGxpbmtbM107CisJaW50IHRpbWVvdXQgPSA1MDsKIAogCS8qIGF2b2lkIEFEU0wgbW9kZW1zIC0gY29udGludWUgb25seSBpZiBpUHJvZHVjdCBpcyAiVVNCIE5FVCBDQVJEIiAqLwogCWlmICh1c2Jfc3RyaW5nKHVkZXYsIHVkZXYtPmRlc2NyaXB0b3IuaVByb2R1Y3QsIGJ1Ziwgc2l6ZW9mKGJ1ZikpID4gMApAQCAtMTYwLDYgKzE2NCwyMCBAQAogCWlmICghZGV2LT5wYXJ0aWFsX2RhdGEpCiAJCXJldHVybiAtRU5PTUVNOwogCisJLyogd2FpdCBmb3IgZmlybXdhcmUgdG8gYmVjb21lIHJlYWR5IChpbmRpY2F0ZWQgYnkgdGhlIGxpbmsgYmVpbmcgdXApICovCisJd2hpbGUgKC0tdGltZW91dCkgeworCQlyZXQgPSBjeDgyMzEwX2NtZChkZXYsIENNRF9HRVRfTElOS19TVEFUVVMsIHRydWUsIE5VTEwsIDAsCisJCQkJICBsaW5rLCBzaXplb2YobGluaykpOworCQkvKiB0aGUgY29tbWFuZCBjYW4gdGltZSBvdXQgZHVyaW5nIGJvb3QgLSBpdCdzIG5vdCBhbiBlcnJvciAqLworCQlpZiAoIXJldCAmJiBsaW5rWzBdID09IDEgJiYgbGlua1syXSA9PSAxKQorCQkJYnJlYWs7CisJCW1zbGVlcCg1MDApOworCX0KKwlpZiAoIXRpbWVvdXQpIHsKKwkJZGV2X2VycigmdWRldi0+ZGV2LCAiZmlybXdhcmUgbm90IHJlYWR5IGluIHRpbWVcbiIpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKIAkvKiBlbmFibGUgZXRoZXJuZXQgbW9kZSAoPykgKi8KIAlyZXQgPSBjeDgyMzEwX2NtZChkZXYsIENNRF9FVEhFUk5FVF9NT0RFLCB0cnVlLCAiXHgwMSIsIDEsIE5VTEwsIDApOwogCWlmIChyZXQpIHsKQEAgLTMwMCw5ICszMTgsMTggQEAKIAkudHhfZml4dXAJPSBjeDgyMzEwX3R4X2ZpeHVwLAogfTsKIAorI2RlZmluZSBVU0JfREVWSUNFX0NMQVNTKHZlbmQsIHByb2QsIGNsLCBzYywgcHIpIFwKKwkubWF0Y2hfZmxhZ3MgPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRSB8IFwKKwkJICAgICAgIFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWX0lORk8sIFwKKwkuaWRWZW5kb3IgPSAodmVuZCksIFwKKwkuaWRQcm9kdWN0ID0gKHByb2QpLCBcCisJLmJEZXZpY2VDbGFzcyA9IChjbCksIFwKKwkuYkRldmljZVN1YkNsYXNzID0gKHNjKSwgXAorCS5iRGV2aWNlUHJvdG9jb2wgPSAocHIpCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBwcm9kdWN0c1tdID0gewogCXsKLQkJVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oMHgwNTcyLCAweGNiMDEsIDB4ZmYsIDAsIDApLAorCQlVU0JfREVWSUNFX0NMQVNTKDB4MDU3MiwgMHhjYjAxLCAweGZmLCAwLCAwKSwKIAkJLmRyaXZlcl9pbmZvID0gKHVuc2lnbmVkIGxvbmcpICZjeDgyMzEwX2luZm8KIAl9LAogCXsgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9oc28uYyBiL2RyaXZlcnMvbmV0L3VzYi9oc28uYwppbmRleCA3NzhlOTE1Li4xMTFkOTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvaHNvLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2hzby5jCkBAIC0xNDc3LDYgKzE0NzcsNyBAQAogCXN0cnVjdCB1YXJ0X2ljb3VudCAqaWNvdW50OwogCXN0cnVjdCBoc29fc2VyaWFsX3N0YXRlX25vdGlmaWNhdGlvbiAqc2VyaWFsX3N0YXRlX25vdGlmaWNhdGlvbjsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdXNiOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJaW50IGlmX251bTsKIAogCS8qIFNhbml0eSBjaGVja3MgKi8KQEAgLTE0OTQsNyArMTQ5NSw5IEBACiAJQlVHX09OKChzZXJpYWwtPnBhcmVudC0+cG9ydF9zcGVjICYgSFNPX1BPUlRfTUFTSykgIT0gSFNPX1BPUlRfTU9ERU0pOwogCiAJdXNiID0gc2VyaWFsLT5wYXJlbnQtPnVzYjsKLQlpZl9udW0gPSBzZXJpYWwtPnBhcmVudC0+aW50ZXJmYWNlLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJaW50ZXJmYWNlID0gc2VyaWFsLT5wYXJlbnQtPmludGVyZmFjZTsKKworCWlmX251bSA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKIAogCS8qIHdJbmRleCBzaG91bGQgYmUgdGhlIFVTQiBpbnRlcmZhY2UgbnVtYmVyIG9mIHRoZSBwb3J0IHRvIHdoaWNoIHRoZQogCSAqIG5vdGlmaWNhdGlvbiBhcHBsaWVzLCB3aGljaCBzaG91bGQgYWx3YXlzIGJlIHRoZSBNb2RlbSBwb3J0LgpAQCAtMTY3NSw2ICsxNjc4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpZl9udW07CiAJc3RydWN0IGhzb19zZXJpYWwgKnNlcmlhbCA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKIAogCS8qIHNhbml0eSBjaGVjayAqLwogCWlmICghc2VyaWFsKSB7CkBAIC0xNjg1LDcgKzE2ODksOCBAQAogCWlmICgoc2VyaWFsLT5wYXJlbnQtPnBvcnRfc3BlYyAmIEhTT19QT1JUX01BU0spICE9IEhTT19QT1JUX01PREVNKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmX251bSA9IHNlcmlhbC0+cGFyZW50LT5pbnRlcmZhY2UtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKKwlpbnRlcmZhY2UgPSBzZXJpYWwtPnBhcmVudC0+aW50ZXJmYWNlOworCWlmX251bSA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzZXJpYWwtPnNlcmlhbF9sb2NrLCBmbGFncyk7CiAJaWYgKHNldCAmIFRJT0NNX1JUUykKQEAgLTI4MDgsNyArMjgxMyw3IEBACiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVzYmRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKIAl1OCAqY29uZmlnX2RhdGEgPSBrbWFsbG9jKDE3LCBHRlBfS0VSTkVMKTsKLQl1MzIgaWZfbnVtID0gaW50ZXJmYWNlLT5hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CisJdTMyIGlmX251bSA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKIAlzMzIgcmVzdWx0OwogCiAJaWYgKCFjb25maWdfZGF0YSkKQEAgLTI4ODYsNyArMjg5MSw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWlmX251bSA9IGludGVyZmFjZS0+YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlTnVtYmVyOworCWlmX251bSA9IGludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcjsKIAogCS8qIEdldCB0aGUgaW50ZXJmYWNlL3BvcnQgc3BlY2lmaWNhdGlvbiBmcm9tIGVpdGhlciBkcml2ZXJfaW5mbyBvciBmcm9tCiAJICogdGhlIGRldmljZSBpdHNlbGYgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9sZy12bDYwMC5jIGIvZHJpdmVycy9uZXQvdXNiL2xnLXZsNjAwLmMKaW5kZXggOGYzN2VmZC4uNTcxNDEwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2xnLXZsNjAwLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL2xnLXZsNjAwLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCQkJCQkmYnVmLT5kYXRhW3NpemVvZigqZXRoaGRyKSArIDB4MTJdLAogCQkJCQlFVEhfQUxFTik7CiAJCX0gZWxzZSB7Ci0JCQltZW1zZXQoZXRoaGRyLT5oX3NvdXJjZSwgMCwgRVRIX0FMRU4pOworCQkJZXRoX3plcm9fYWRkcihldGhoZHItPmhfc291cmNlKTsKIAkJCW1lbWNweShldGhoZHItPmhfZGVzdCwgZGV2LT5uZXQtPmRldl9hZGRyLCBFVEhfQUxFTik7CiAKIAkJCS8qIEluYm91bmQgSVB2NiBwYWNrZXRzIGhhdmUgYW4gSVB2NCBldGhlcnR5cGUgKDB4ODAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3FtaV93d2FuLmMgYi9kcml2ZXJzL25ldC91c2IvcW1pX3d3YW4uYwppbmRleCA2MDJkYzY2Li5mNjAzZjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcW1pX3d3YW4uYworKysgYi9kcml2ZXJzL25ldC91c2IvcW1pX3d3YW4uYwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlldGhfaGRyKHNrYiktPmhfcHJvdG8gPSBwcm90bzsKLQltZW1zZXQoZXRoX2hkcihza2IpLT5oX3NvdXJjZSwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIoZXRoX2hkcihza2IpLT5oX3NvdXJjZSk7CiBmaXhfZGVzdDoKIAltZW1jcHkoZXRoX2hkcihza2IpLT5oX2Rlc3QsIGRldi0+bmV0LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3I4MTUyLmMgYi9kcml2ZXJzL25ldC91c2IvcjgxNTIuYwppbmRleCA0MzhmYzZiLi5hYzRkMDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvcjgxNTIuYworKysgYi9kcml2ZXJzL25ldC91c2IvcjgxNTIuYwpAQCAtMTA0LDcgKzEwNCw4IEBACiAjZGVmaW5lIFVTQl9UWF9BR0cJCTB4ZDQwYQogI2RlZmluZSBVU0JfUlhfQlVGX1RICQkweGQ0MGMKICNkZWZpbmUgVVNCX1VTQl9USU1FUgkJMHhkNDI4Ci0jZGVmaW5lIFVTQl9SWF9FQVJMWV9BR0cJMHhkNDJjCisjZGVmaW5lIFVTQl9SWF9FQVJMWV9USU1FT1VUCTB4ZDQyYworI2RlZmluZSBVU0JfUlhfRUFSTFlfU0laRQkweGQ0MmUKICNkZWZpbmUgVVNCX1BNX0NUUkxfU1RBVFVTCTB4ZDQzMgogI2RlZmluZSBVU0JfVFhfRE1BCQkweGQ0MzQKICNkZWZpbmUgVVNCX1RPTEVSQU5DRQkJMHhkNDkwCkBAIC0zNDksMTAgKzM1MCwxMCBAQAogLyogVVNCX01JU0NfMCAqLwogI2RlZmluZSBQQ1VUX1NUQVRVUwkJMHgwMDAxCiAKLS8qIFVTQl9SWF9FQVJMWV9BR0cgKi8KLSNkZWZpbmUgRUFSTFlfQUdHX1NVUFBFUgkweDBlODMyOTgxCi0jZGVmaW5lIEVBUkxZX0FHR19ISUdICQkweDBlODM3YTEyCi0jZGVmaW5lIEVBUkxZX0FHR19TTE9XCQkweDBlODNmZmZmCisvKiBVU0JfUlhfRUFSTFlfVElNRU9VVCAqLworI2RlZmluZSBDT0FMRVNDRV9TVVBFUgkJIDg1MDAwVQorI2RlZmluZSBDT0FMRVNDRV9ISUdICQkyNTAwMDBVCisjZGVmaW5lIENPQUxFU0NFX1NMT1cJCTUyNDI4MFUKIAogLyogVVNCX1dEVDExX0NUUkwgKi8KICNkZWZpbmUgVElNRVIxMV9FTgkJMHgwMDAxCkBAIC00OTIsNiArNDkzLDcgQEAKIC8qIERlZmluZSB0aGVzZSB2YWx1ZXMgdG8gbWF0Y2ggeW91ciBkZXZpY2UgKi8KICNkZWZpbmUgVkVORE9SX0lEX1JFQUxURUsJCTB4MGJkYQogI2RlZmluZSBWRU5ET1JfSURfU0FNU1VORwkJMHgwNGU4CisjZGVmaW5lIFZFTkRPUl9JRF9MRU5PVk8JCTB4MTdlZgogCiAjZGVmaW5lIE1DVV9UWVBFX1BMQQkJCTB4MDEwMAogI2RlZmluZSBNQ1VfVFlQRV9VU0IJCQkweDAwMDAKQEAgLTYwNiw2ICs2MDgsNyBAQAogCXUzMiBzYXZlZF93b2xvcHRzOwogCXUzMiBtc2dfZW5hYmxlOwogCXUzMiB0eF9xbGVuOworCXUzMiBjb2FsZXNjZTsKIAl1MTYgb2NwX2Jhc2U7CiAJdTggKmludHJfYnVmZjsKIAl1OCB2ZXJzaW9uOwpAQCAtMjE0MiwyOCArMjE0NSwxOSBAQAogCXJldHVybiBydGxfZW5hYmxlKHRwKTsKIH0KIAotc3RhdGljIHZvaWQgcjgxNTNfc2V0X3J4X2FnZyhzdHJ1Y3QgcjgxNTIgKnRwKQorc3RhdGljIHZvaWQgcjgxNTNfc2V0X3J4X2Vhcmx5X3RpbWVvdXQoc3RydWN0IHI4MTUyICp0cCkKIHsKLQl1OCBzcGVlZDsKKwl1MzIgb2NwX2RhdGEgPSB0cC0+Y29hbGVzY2UgLyA4OwogCi0Jc3BlZWQgPSBydGw4MTUyX2dldF9zcGVlZCh0cCk7Ci0JaWYgKHNwZWVkICYgXzEwMDBicHMpIHsKLQkJaWYgKHRwLT51ZGV2LT5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpIHsKLQkJCW9jcF93cml0ZV9kd29yZCh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfUlhfQlVGX1RILAotCQkJCQlSWF9USFJfU1VQUEVSKTsKLQkJCW9jcF93cml0ZV9kd29yZCh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfUlhfRUFSTFlfQUdHLAotCQkJCQlFQVJMWV9BR0dfU1VQUEVSKTsKLQkJfSBlbHNlIHsKLQkJCW9jcF93cml0ZV9kd29yZCh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfUlhfQlVGX1RILAotCQkJCQlSWF9USFJfSElHSCk7Ci0JCQlvY3Bfd3JpdGVfZHdvcmQodHAsIE1DVV9UWVBFX1VTQiwgVVNCX1JYX0VBUkxZX0FHRywKLQkJCQkJRUFSTFlfQUdHX0hJR0gpOwotCQl9Ci0JfSBlbHNlIHsKLQkJb2NwX3dyaXRlX2R3b3JkKHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9SWF9CVUZfVEgsIFJYX1RIUl9TTE9XKTsKLQkJb2NwX3dyaXRlX2R3b3JkKHRwLCBNQ1VfVFlQRV9VU0IsIFVTQl9SWF9FQVJMWV9BR0csCi0JCQkJRUFSTFlfQUdHX1NMT1cpOwotCX0KKwlvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfUlhfRUFSTFlfVElNRU9VVCwgb2NwX2RhdGEpOworfQorCitzdGF0aWMgdm9pZCByODE1M19zZXRfcnhfZWFybHlfc2l6ZShzdHJ1Y3QgcjgxNTIgKnRwKQoreworCXUzMiBtdHUgPSB0cC0+bmV0ZGV2LT5tdHU7CisJdTMyIG9jcF9kYXRhID0gKGFnZ19idWZfc3ogLSBtdHUgLSBWTEFOX0VUSF9ITEVOIC0gVkxBTl9ITEVOKSAvIDQ7CisKKwlvY3Bfd3JpdGVfd29yZCh0cCwgTUNVX1RZUEVfVVNCLCBVU0JfUlhfRUFSTFlfU0laRSwgb2NwX2RhdGEpOwogfQogCiBzdGF0aWMgaW50IHJ0bDgxNTNfZW5hYmxlKHN0cnVjdCByODE1MiAqdHApCkBAIC0yMTczLDcgKzIxNjcsOCBAQAogCiAJc2V0X3R4X3FsZW4odHApOwogCXJ0bF9zZXRfZWVlX3BsdXModHApOwotCXI4MTUzX3NldF9yeF9hZ2codHApOworCXI4MTUzX3NldF9yeF9lYXJseV90aW1lb3V0KHRwKTsKKwlyODE1M19zZXRfcnhfZWFybHlfc2l6ZSh0cCk7CiAKIAlyZXR1cm4gcnRsX2VuYWJsZSh0cCk7CiB9CkBAIC0zNzE5LDYgKzM3MTQsNjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IHJ0bDgxNTJfZ2V0X2NvYWxlc2NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfY29hbGVzY2UgKmNvYWxlc2NlKQoreworCXN0cnVjdCByODE1MiAqdHAgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJc3dpdGNoICh0cC0+dmVyc2lvbikgeworCWNhc2UgUlRMX1ZFUl8wMToKKwljYXNlIFJUTF9WRVJfMDI6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwljb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3MgPSB0cC0+Y29hbGVzY2U7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydGw4MTUyX3NldF9jb2FsZXNjZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCXN0cnVjdCBldGh0b29sX2NvYWxlc2NlICpjb2FsZXNjZSkKK3sKKwlzdHJ1Y3QgcjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgcmV0OworCisJc3dpdGNoICh0cC0+dmVyc2lvbikgeworCWNhc2UgUlRMX1ZFUl8wMToKKwljYXNlIFJUTF9WRVJfMDI6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzID4gQ09BTEVTQ0VfU0xPVykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UodHAtPmludGYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmdHAtPmNvbnRyb2wpOworCisJaWYgKHRwLT5jb2FsZXNjZSAhPSBjb2FsZXNjZS0+cnhfY29hbGVzY2VfdXNlY3MpIHsKKwkJdHAtPmNvYWxlc2NlID0gY29hbGVzY2UtPnJ4X2NvYWxlc2NlX3VzZWNzOworCisJCWlmIChuZXRpZl9ydW5uaW5nKHRwLT5uZXRkZXYpICYmIG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSkKKwkJCXI4MTUzX3NldF9yeF9lYXJseV90aW1lb3V0KHRwKTsKKwl9CisKKwltdXRleF91bmxvY2soJnRwLT5jb250cm9sKTsKKworCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZSh0cC0+aW50Zik7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG9wcyA9IHsKIAkuZ2V0X2RydmluZm8gPSBydGw4MTUyX2dldF9kcnZpbmZvLAogCS5nZXRfc2V0dGluZ3MgPSBydGw4MTUyX2dldF9zZXR0aW5ncywKQEAgLTM3MzIsNiArMzc4Miw4IEBACiAJLmdldF9zdHJpbmdzID0gcnRsODE1Ml9nZXRfc3RyaW5ncywKIAkuZ2V0X3NzZXRfY291bnQgPSBydGw4MTUyX2dldF9zc2V0X2NvdW50LAogCS5nZXRfZXRodG9vbF9zdGF0cyA9IHJ0bDgxNTJfZ2V0X2V0aHRvb2xfc3RhdHMsCisJLmdldF9jb2FsZXNjZSA9IHJ0bDgxNTJfZ2V0X2NvYWxlc2NlLAorCS5zZXRfY29hbGVzY2UgPSBydGw4MTUyX3NldF9jb2FsZXNjZSwKIAkuZ2V0X2VlZSA9IHJ0bF9ldGh0b29sX2dldF9lZWUsCiAJLnNldF9lZWUgPSBydGxfZXRodG9vbF9zZXRfZWVlLAogfTsKQEAgLTM3ODMsNiArMzgzNSw3IEBACiBzdGF0aWMgaW50IHJ0bDgxNTJfY2hhbmdlX210dShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgbmV3X210dSkKIHsKIAlzdHJ1Y3QgcjgxNTIgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgcmV0OwogCiAJc3dpdGNoICh0cC0+dmVyc2lvbikgewogCWNhc2UgUlRMX1ZFUl8wMToKQEAgLTM3OTUsOSArMzg0OCwyMiBAQAogCWlmIChuZXdfbXR1IDwgNjggfHwgbmV3X210dSA+IFJUTDgxNTNfTUFYX01UVSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlyZXQgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UodHAtPmludGYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmdHAtPmNvbnRyb2wpOworCiAJZGV2LT5tdHUgPSBuZXdfbXR1OwogCi0JcmV0dXJuIDA7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCXI4MTUzX3NldF9yeF9lYXJseV9zaXplKHRwKTsKKworCW11dGV4X3VubG9jaygmdHAtPmNvbnRyb2wpOworCisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHRwLT5pbnRmKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcnRsODE1Ml9uZXRkZXZfb3BzID0gewpAQCAtMzk2Niw2ICs0MDMyLDE4IEBACiAJdHAtPm1paS5yZWdfbnVtX21hc2sgPSAweDFmOwogCXRwLT5taWkucGh5X2lkID0gUjgxNTJfUEhZX0lEOwogCisJc3dpdGNoICh1ZGV2LT5zcGVlZCkgeworCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgorCQl0cC0+Y29hbGVzY2UgPSBDT0FMRVNDRV9TVVBFUjsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1BFRURfSElHSDoKKwkJdHAtPmNvYWxlc2NlID0gQ09BTEVTQ0VfSElHSDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdHAtPmNvYWxlc2NlID0gQ09BTEVTQ0VfU0xPVzsKKwkJYnJlYWs7CisJfQorCiAJaW50Zi0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDE7CiAKIAl0cC0+cnRsX29wcy5pbml0KHRwKTsKQEAgLTQwMzcsNiArNDExNSw3IEBACiAJe1JFQUxURUtfVVNCX0RFVklDRShWRU5ET1JfSURfUkVBTFRFSywgMHg4MTUyKX0sCiAJe1JFQUxURUtfVVNCX0RFVklDRShWRU5ET1JfSURfUkVBTFRFSywgMHg4MTUzKX0sCiAJe1JFQUxURUtfVVNCX0RFVklDRShWRU5ET1JfSURfU0FNU1VORywgMHhhMTAxKX0sCisJe1JFQUxURUtfVVNCX0RFVklDRShWRU5ET1JfSURfTEVOT1ZPLCAgMHg3MjA1KX0sCiAJe30KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3VzYi9zcjk4MDAuYyBiL2RyaXZlcnMvbmV0L3VzYi9zcjk4MDAuYwppbmRleCBiOTRhMGZiLi45NTNkZTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2Ivc3I5ODAwLmMKKysrIGIvZHJpdmVycy9uZXQvdXNiL3NyOTgwMC5jCkBAIC0xNDQsNiArMTQ0LDcgQEAKIAkJc2tiX3B1dChza2IsIHNpemVvZihwYWRieXRlcykpOwogCX0KIAorCXVzYm5ldF9zZXRfc2tiX3R4X3N0YXRzKHNrYiwgMSwgMCk7CiAJcmV0dXJuIHNrYjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jIGIvZHJpdmVycy9uZXQvdXNiL3VzYm5ldC5jCmluZGV4IDQ0OTgzNWYuLjczM2Y0ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi91c2JuZXQuYworKysgYi9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKQEAgLTEwNzIsNyArMTA3Miw3IEBACiAgKiBlc3BlY2lhbGx5IG5vdyB0aGF0IGNvbnRyb2wgdHJhbnNmZXJzIGNhbiBiZSBxdWV1ZWQuCiAgKi8KIHN0YXRpYyB2b2lkCi1rZXZlbnQgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3VzYm5ldF9kZWZlcnJlZF9rZXZlbnQgKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgdXNibmV0CQkqZGV2ID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2JuZXQsIGtldmVudCk7CkBAIC0xMTg4LDggKzExODgsNyBAQAogCXN0cnVjdCB1c2JuZXQJCSpkZXYgPSBlbnRyeS0+ZGV2OwogCiAJaWYgKHVyYi0+c3RhdHVzID09IDApIHsKLQkJaWYgKCEoZGV2LT5kcml2ZXJfaW5mby0+ZmxhZ3MgJiBGTEFHX01VTFRJX1BBQ0tFVCkpCi0JCQlkZXYtPm5ldC0+c3RhdHMudHhfcGFja2V0cysrOworCQlkZXYtPm5ldC0+c3RhdHMudHhfcGFja2V0cyArPSBlbnRyeS0+cGFja2V0czsKIAkJZGV2LT5uZXQtPnN0YXRzLnR4X2J5dGVzICs9IGVudHJ5LT5sZW5ndGg7CiAJfSBlbHNlIHsKIAkJZGV2LT5uZXQtPnN0YXRzLnR4X2Vycm9ycysrOwpAQCAtMTM0Nyw3ICsxMzQ2LDE5IEBACiAJCX0gZWxzZQogCQkJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfWkVST19QQUNLRVQ7CiAJfQotCWVudHJ5LT5sZW5ndGggPSB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGggPSBsZW5ndGg7CisJdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gbGVuZ3RoOworCisJaWYgKGluZm8tPmZsYWdzICYgRkxBR19NVUxUSV9QQUNLRVQpIHsKKwkJLyogRHJpdmVyIGhhcyBzZXQgbnVtYmVyIG9mIHBhY2tldHMgYW5kIGEgbGVuZ3RoIGRlbHRhLgorCQkgKiBDYWxjdWxhdGUgdGhlIGNvbXBsZXRlIGxlbmd0aCBhbmQgZW5zdXJlIHRoYXQgaXQncworCQkgKiBwb3NpdGl2ZS4KKwkJICovCisJCWVudHJ5LT5sZW5ndGggKz0gbGVuZ3RoOworCQlpZiAoV0FSTl9PTl9PTkNFKGVudHJ5LT5sZW5ndGggPD0gMCkpCisJCQllbnRyeS0+bGVuZ3RoID0gbGVuZ3RoOworCX0gZWxzZSB7CisJCXVzYm5ldF9zZXRfc2tiX3R4X3N0YXRzKHNrYiwgMSwgbGVuZ3RoKTsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT50eHEubG9jaywgZmxhZ3MpOwogCXJldHZhbCA9IHVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9hc3luYyhkZXYtPmludGYpOwpAQCAtMTYxNSw3ICsxNjI2LDcgQEAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZkZXYtPnJ4cV9wYXVzZSk7CiAJZGV2LT5iaC5mdW5jID0gdXNibmV0X2JoOwogCWRldi0+YmguZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBkZXY7Ci0JSU5JVF9XT1JLICgmZGV2LT5rZXZlbnQsIGtldmVudCk7CisJSU5JVF9XT1JLICgmZGV2LT5rZXZlbnQsIHVzYm5ldF9kZWZlcnJlZF9rZXZlbnQpOwogCWluaXRfdXNiX2FuY2hvcigmZGV2LT5kZWZlcnJlZCk7CiAJZGV2LT5kZWxheS5mdW5jdGlvbiA9IHVzYm5ldF9iaDsKIAlkZXYtPmRlbGF5LmRhdGEgPSAodW5zaWduZWQgbG9uZykgZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmV0aC5jIGIvZHJpdmVycy9uZXQvdmV0aC5jCmluZGV4IDRjY2EzNmUuLmM4MTg2ZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZldGguYworKysgYi9kcml2ZXJzL25ldC92ZXRoLmMKQEAgLTI2Myw2ICsyNjMsMjAgQEAKIH0KICNlbmRpZgkvKiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiAqLwogCitzdGF0aWMgaW50IHZldGhfZ2V0X2lmbGluayhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2ZXRoX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpwZWVyOworCWludCBpZmxpbms7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJcGVlciA9IHJjdV9kZXJlZmVyZW5jZShwcml2LT5wZWVyKTsKKwlpZmxpbmsgPSBwZWVyID8gcGVlci0+aWZpbmRleCA6IDA7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gaWZsaW5rOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHZldGhfbmV0ZGV2X29wcyA9IHsKIAkubmRvX2luaXQgICAgICAgICAgICA9IHZldGhfZGV2X2luaXQsCiAJLm5kb19vcGVuICAgICAgICAgICAgPSB2ZXRoX29wZW4sCkBAIC0yNzUsNiArMjg5LDcgQEAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gdmV0aF9wb2xsX2NvbnRyb2xsZXIsCiAjZW5kaWYKKwkubmRvX2dldF9pZmxpbmsJCT0gdmV0aF9nZXRfaWZsaW5rLAogfTsKIAogI2RlZmluZSBWRVRIX0ZFQVRVUkVTIChORVRJRl9GX1NHIHwgTkVUSUZfRl9GUkFHTElTVCB8IE5FVElGX0ZfQUxMX1RTTyB8ICAgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwppbmRleCBmMWZmMzY2Li42M2M3ODEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCkBAIC03NDksOSArNzQ5LDkgQEAKIHsKIAlzdHJ1Y3QgcmVjZWl2ZV9xdWV1ZSAqcnEgPQogCQljb250YWluZXJfb2YobmFwaSwgc3RydWN0IHJlY2VpdmVfcXVldWUsIG5hcGkpOwotCXVuc2lnbmVkIGludCByLCByZWNlaXZlZCA9IDA7CisJdW5zaWduZWQgaW50IHIsIHJlY2VpdmVkOwogCi0JcmVjZWl2ZWQgKz0gdmlydG5ldF9yZWNlaXZlKHJxLCBidWRnZXQgLSByZWNlaXZlZCk7CisJcmVjZWl2ZWQgPSB2aXJ0bmV0X3JlY2VpdmUocnEsIGJ1ZGdldCk7CiAKIAkvKiBPdXQgb2YgcGFja2V0cz8gKi8KIAlpZiAocmVjZWl2ZWQgPCBidWRnZXQpIHsKQEAgLTkzOSw4ICs5MzksMTYgQEAKIAlza2Jfb3JwaGFuKHNrYik7CiAJbmZfcmVzZXQoc2tiKTsKIAotCS8qIEFwcGFyZW50bHkgbmljZSBnaXJscyBkb24ndCByZXR1cm4gVFhfQlVTWTsgc3RvcCB0aGUgcXVldWUKLQkgKiBiZWZvcmUgaXQgZ2V0cyBvdXQgb2YgaGFuZC4gIE5hdHVyYWxseSwgdGhpcyB3YXN0ZXMgZW50cmllcy4gKi8KKwkvKiBJZiBydW5uaW5nIG91dCBvZiBzcGFjZSwgc3RvcCBxdWV1ZSB0byBhdm9pZCBnZXR0aW5nIHBhY2tldHMgdGhhdCB3ZQorCSAqIGFyZSB0aGVuIHVuYWJsZSB0byB0cmFuc21pdC4KKwkgKiBBbiBhbHRlcm5hdGl2ZSB3b3VsZCBiZSB0byBmb3JjZSBxdWV1aW5nIGxheWVyIHRvIHJlcXVldWUgdGhlIHNrYiBieQorCSAqIHJldHVybmluZyBORVRERVZfVFhfQlVTWS4gSG93ZXZlciwgTkVUREVWX1RYX0JVU1kgc2hvdWxkIG5vdCBiZQorCSAqIHJldHVybmVkIGluIGEgbm9ybWFsIHBhdGggb2Ygb3BlcmF0aW9uOiBpdCBtZWFucyB0aGF0IGRyaXZlciBpcyBub3QKKwkgKiBtYWludGFpbmluZyB0aGUgVFggcXVldWUgc3RvcC9zdGFydCBzdGF0ZSBwcm9wZXJseSwgYW5kIGNhdXNlcworCSAqIHRoZSBzdGFjayB0byBkbyBhIG5vbi10cml2aWFsIGFtb3VudCBvZiB1c2VsZXNzIHdvcmsuCisJICogU2luY2UgbW9zdCBwYWNrZXRzIG9ubHkgdGFrZSAxIG9yIDIgcmluZyBzbG90cywgc3RvcHBpbmcgdGhlIHF1ZXVlCisJICogZWFybHkgbWVhbnMgMTYgc2xvdHMgYXJlIHR5cGljYWxseSB3YXN0ZWQuCisJICovCiAJaWYgKHNxLT52cS0+bnVtX2ZyZWUgPCAyK01BWF9TS0JfRlJBR1MpIHsKIAkJbmV0aWZfc3RvcF9zdWJxdWV1ZShkZXYsIHFudW0pOwogCQlpZiAodW5saWtlbHkoIXZpcnRxdWV1ZV9lbmFibGVfY2JfZGVsYXllZChzcS0+dnEpKSkgewpAQCAtMTQ0OCw4ICsxNDU2LDEwIEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgdmktPm1heF9xdWV1ZV9wYWlyczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCB2aS0+bWF4X3F1ZXVlX3BhaXJzOyBpKyspIHsKKwkJbmFwaV9oYXNoX2RlbCgmdmktPnJxW2ldLm5hcGkpOwogCQluZXRpZl9uYXBpX2RlbCgmdmktPnJxW2ldLm5hcGkpOworCX0KIAogCWtmcmVlKHZpLT5ycSk7CiAJa2ZyZWUodmktPnNxKTsKQEAgLTE5NDgsMTEgKzE5NTgsOCBAQAogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdmktPnJlZmlsbCk7CiAKIAlpZiAobmV0aWZfcnVubmluZyh2aS0+ZGV2KSkgewotCQlmb3IgKGkgPSAwOyBpIDwgdmktPm1heF9xdWV1ZV9wYWlyczsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCB2aS0+bWF4X3F1ZXVlX3BhaXJzOyBpKyspCiAJCQluYXBpX2Rpc2FibGUoJnZpLT5ycVtpXS5uYXBpKTsKLQkJCW5hcGlfaGFzaF9kZWwoJnZpLT5ycVtpXS5uYXBpKTsKLQkJCW5ldGlmX25hcGlfZGVsKCZ2aS0+cnFbaV0ubmFwaSk7Ci0JCX0KIAl9CiAKIAlyZW1vdmVfdnFfY29tbW9uKHZpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYwppbmRleCAyOTQyMTRjLi42MWMwODQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jCkBAIC04MTksNiArODE5LDcgQEAKIAkJCSAgIHN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IFZteG5ldDNfVHhEYXRhRGVzYyAqdGRkOworCXU4IHByb3RvY29sID0gMDsKIAogCWlmIChjdHgtPm1zcykgewkvKiBUU08gKi8KIAkJY3R4LT5ldGhfaXBfaGRyX3NpemUgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOwpAQCAtODMxLDE2ICs4MzIsMjUgQEAKIAkJCWlmIChjdHgtPmlwdjQpIHsKIAkJCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCi0JCQkJaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApCi0JCQkJCWN0eC0+bDRfaGRyX3NpemUgPSB0Y3BfaGRybGVuKHNrYik7Ci0JCQkJZWxzZSBpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKLQkJCQkJY3R4LT5sNF9oZHJfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQkJCQllbHNlCi0JCQkJCWN0eC0+bDRfaGRyX3NpemUgPSAwOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBmb3Igc2ltcGxpY2l0eSwgZG9uJ3QgY29weSBMNCBoZWFkZXJzICovCi0JCQkJY3R4LT5sNF9oZHJfc2l6ZSA9IDA7CisJCQkJcHJvdG9jb2wgPSBpcGgtPnByb3RvY29sOworCQkJfSBlbHNlIGlmIChjdHgtPmlwdjYpIHsKKwkJCQljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXB2NmggPSBpcHY2X2hkcihza2IpOworCisJCQkJcHJvdG9jb2wgPSBpcHY2aC0+bmV4dGhkcjsKIAkJCX0KKworCQkJc3dpdGNoIChwcm90b2NvbCkgeworCQkJY2FzZSBJUFBST1RPX1RDUDoKKwkJCQljdHgtPmw0X2hkcl9zaXplID0gdGNwX2hkcmxlbihza2IpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUFBST1RPX1VEUDoKKwkJCQljdHgtPmw0X2hkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQljdHgtPmw0X2hkcl9zaXplID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwogCQkJY3R4LT5jb3B5X3NpemUgPSBtaW4oY3R4LT5ldGhfaXBfaGRyX3NpemUgKwogCQkJCQkgY3R4LT5sNF9oZHJfc2l6ZSwgc2tiLT5sZW4pOwogCQl9IGVsc2UgewpAQCAtODg3LDcgKzg5Nyw3IEBACiAJCWlwaC0+Y2hlY2sgPSAwOwogCQl0Y3BoLT5jaGVjayA9IH5jc3VtX3RjcHVkcF9tYWdpYyhpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLCAwLAogCQkJCQkJIElQUFJPVE9fVENQLCAwKTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAoY3R4LT5pcHY2KSB7CiAJCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOwogCiAJCXRjcGgtPmNoZWNrID0gfmNzdW1faXB2Nl9tYWdpYygmaXBoLT5zYWRkciwgJmlwaC0+ZGFkZHIsIDAsCkBAIC05MzgsNiArOTQ4LDcgQEAKIAljb3VudCA9IHR4ZF9lc3RpbWF0ZShza2IpOwogCiAJY3R4LmlwdjQgPSAodmxhbl9nZXRfcHJvdG9jb2woc2tiKSA9PSBjcHVfdG9fYmUxNihFVEhfUF9JUCkpOworCWN0eC5pcHY2ID0gKHZsYW5fZ2V0X3Byb3RvY29sKHNrYikgPT0gY3B1X3RvX2JlMTYoRVRIX1BfSVBWNikpOwogCiAJY3R4Lm1zcyA9IHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemU7CiAJaWYgKGN0eC5tc3MpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZXRodG9vbC5jCmluZGV4IDRjOGE5NDQuLmMxZDBlN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2V0aHRvb2wuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJCQkJCSAgcnhfYnVmX2FsbG9jX2ZhaWx1cmUpIH0sCiB9OwogCi0vKiBnbG9hYmwgc3RhdHMgbWFpbnRhaW5lZCBieSB0aGUgZHJpdmVyICovCisvKiBnbG9iYWwgc3RhdHMgbWFpbnRhaW5lZCBieSB0aGUgZHJpdmVyICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHZteG5ldDNfc3RhdF9kZXNjCiB2bXhuZXQzX2dsb2JhbF9zdGF0c1tdID0gewogCS8qIGRlc2NyaXB0aW9uLCAgICAgICAgIG9mZnNldCAqLwpAQCAtMjcyLDcgKzI3Miw3IEBACiAJCQlhZGFwdGVyLT5zaGFyZWQtPmRldlJlYWQubWlzYy51cHRGZWF0dXJlcyAmPQogCQkJflVQVDFfRl9SWENTVU07CiAKLQkJLyogdXBkYXRlIGhhcndhcmUgTFJPIGNhcGFiaWxpdHkgYWNjb3JkaW5nbHkgKi8KKwkJLyogdXBkYXRlIGhhcmR3YXJlIExSTyBjYXBhYmlsaXR5IGFjY29yZGluZ2x5ICovCiAJCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfTFJPKQogCQkJYWRhcHRlci0+c2hhcmVkLT5kZXZSZWFkLm1pc2MudXB0RmVhdHVyZXMgfD0KIAkJCQkJCQlVUFQxX0ZfTFJPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oCmluZGV4IGNkNzFjNzcuLjZiYjc2OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaAorKysgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmgKQEAgLTY5LDEwICs2OSwxMCBAQAogLyoKICAqIFZlcnNpb24gbnVtYmVycwogICovCi0jZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fU1RSSU5HICAgIjEuMy40LjAtayIKKyNkZWZpbmUgVk1YTkVUM19EUklWRVJfVkVSU0lPTl9TVFJJTkcgICAiMS4zLjUuMC1rIgogCiAvKiBhIDMyLWJpdCBpbnQsIGVhY2ggYnl0ZSBlbmNvZGUgYSB2ZXJpb24gbnVtYmVyIGluIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT04gKi8KLSNkZWZpbmUgVk1YTkVUM19EUklWRVJfVkVSU0lPTl9OVU0gICAgICAweDAxMDMwNDAwCisjZGVmaW5lIFZNWE5FVDNfRFJJVkVSX1ZFUlNJT05fTlVNICAgICAgMHgwMTAzMDUwMAogCiAjaWYgZGVmaW5lZChDT05GSUdfUENJX01TSSkKIAkvKiBSU1Mgb25seSBtYWtlcyBzZW5zZSBpZiBNU0ktWCBpcyBzdXBwb3J0ZWQuICovCkBAIC0yMTEsNiArMjExLDcgQEAKIAogc3RydWN0IHZteG5ldDNfdHhfY3R4IHsKIAlib29sICAgaXB2NDsKKwlib29sICAgaXB2NjsKIAl1MTYgbXNzOwogCXUzMiBldGhfaXBfaGRyX3NpemU7IC8qIG9ubHkgdmFsaWQgZm9yIHBrdHMgcmVxdWVzdGluZyB0c28gb3IgY3N1bQogCQkJCSAqIG9mZmxvYWRpbmcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3Z4bGFuLmMgYi9kcml2ZXJzL25ldC92eGxhbi5jCmluZGV4IDFlMGE3NzUuLjE1NDExNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3Z4bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvdnhsYW4uYwpAQCAtMTI3LDEwICsxMjcsNiBAQAogCV9fdTgJCSAgdHRsOwogCXUzMgkJICBmbGFnczsJLyogVlhMQU5fRl8qIGluIHZ4bGFuLmggKi8KIAotCXN0cnVjdCB3b3JrX3N0cnVjdCBzb2NrX3dvcms7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGlnbXBfam9pbjsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaWdtcF9sZWF2ZTsKLQogCXVuc2lnbmVkIGxvbmcJICBhZ2VfaW50ZXJ2YWw7CiAJc3RydWN0IHRpbWVyX2xpc3QgYWdlX3RpbWVyOwogCXNwaW5sb2NrX3QJICBoYXNoX2xvY2s7CkBAIC0xNDQsNTggKzE0MCw1NiBAQAogc3RhdGljIHUzMiB2eGxhbl9zYWx0IF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnZ4bGFuX3dxOwogCi1zdGF0aWMgdm9pZCB2eGxhbl9zb2NrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLQogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgaW5saW5lCiBib29sIHZ4bGFuX2FkZHJfZXF1YWwoY29uc3QgdW5pb24gdnhsYW5fYWRkciAqYSwgY29uc3QgdW5pb24gdnhsYW5fYWRkciAqYikKIHsKLSAgICAgICBpZiAoYS0+c2Euc2FfZmFtaWx5ICE9IGItPnNhLnNhX2ZhbWlseSkKLSAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICBpZiAoYS0+c2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KQotICAgICAgICAgICAgICAgcmV0dXJuIGlwdjZfYWRkcl9lcXVhbCgmYS0+c2luNi5zaW42X2FkZHIsICZiLT5zaW42LnNpbjZfYWRkcik7Ci0gICAgICAgZWxzZQotICAgICAgICAgICAgICAgcmV0dXJuIGEtPnNpbi5zaW5fYWRkci5zX2FkZHIgPT0gYi0+c2luLnNpbl9hZGRyLnNfYWRkcjsKKwlpZiAoYS0+c2Euc2FfZmFtaWx5ICE9IGItPnNhLnNhX2ZhbWlseSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChhLT5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCXJldHVybiBpcHY2X2FkZHJfZXF1YWwoJmEtPnNpbjYuc2luNl9hZGRyLCAmYi0+c2luNi5zaW42X2FkZHIpOworCWVsc2UKKwkJcmV0dXJuIGEtPnNpbi5zaW5fYWRkci5zX2FkZHIgPT0gYi0+c2luLnNpbl9hZGRyLnNfYWRkcjsKIH0KIAogc3RhdGljIGlubGluZSBib29sIHZ4bGFuX2FkZHJfYW55KGNvbnN0IHVuaW9uIHZ4bGFuX2FkZHIgKmlwYSkKIHsKLSAgICAgICBpZiAoaXBhLT5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCi0gICAgICAgICAgICAgICByZXR1cm4gaXB2Nl9hZGRyX2FueSgmaXBhLT5zaW42LnNpbjZfYWRkcik7Ci0gICAgICAgZWxzZQotICAgICAgICAgICAgICAgcmV0dXJuIGlwYS0+c2luLnNpbl9hZGRyLnNfYWRkciA9PSBodG9ubChJTkFERFJfQU5ZKTsKKwlpZiAoaXBhLT5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCXJldHVybiBpcHY2X2FkZHJfYW55KCZpcGEtPnNpbjYuc2luNl9hZGRyKTsKKwllbHNlCisJCXJldHVybiBpcGEtPnNpbi5zaW5fYWRkci5zX2FkZHIgPT0gaHRvbmwoSU5BRERSX0FOWSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCB2eGxhbl9hZGRyX211bHRpY2FzdChjb25zdCB1bmlvbiB2eGxhbl9hZGRyICppcGEpCiB7Ci0gICAgICAgaWYgKGlwYS0+c2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KQotICAgICAgICAgICAgICAgcmV0dXJuIGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmlwYS0+c2luNi5zaW42X2FkZHIpOwotICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHJldHVybiBJTl9NVUxUSUNBU1QobnRvaGwoaXBhLT5zaW4uc2luX2FkZHIuc19hZGRyKSk7CisJaWYgKGlwYS0+c2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlyZXR1cm4gaXB2Nl9hZGRyX2lzX211bHRpY2FzdCgmaXBhLT5zaW42LnNpbjZfYWRkcik7CisJZWxzZQorCQlyZXR1cm4gSU5fTVVMVElDQVNUKG50b2hsKGlwYS0+c2luLnNpbl9hZGRyLnNfYWRkcikpOwogfQogCiBzdGF0aWMgaW50IHZ4bGFuX25sYV9nZXRfYWRkcih1bmlvbiB2eGxhbl9hZGRyICppcCwgc3RydWN0IG5sYXR0ciAqbmxhKQogewotICAgICAgIGlmIChubGFfbGVuKG5sYSkgPj0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpIHsKLSAgICAgICAgICAgICAgIG5sYV9tZW1jcHkoJmlwLT5zaW42LnNpbjZfYWRkciwgbmxhLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7Ci0gICAgICAgICAgICAgICBpcC0+c2Euc2FfZmFtaWx5ID0gQUZfSU5FVDY7Ci0gICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICB9IGVsc2UgaWYgKG5sYV9sZW4obmxhKSA+PSBzaXplb2YoX19iZTMyKSkgewotICAgICAgICAgICAgICAgaXAtPnNpbi5zaW5fYWRkci5zX2FkZHIgPSBubGFfZ2V0X2JlMzIobmxhKTsKLSAgICAgICAgICAgICAgIGlwLT5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUOwotICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIHJldHVybiAtRUFGTk9TVVBQT1JUOwotICAgICAgIH0KKwlpZiAobmxhX2xlbihubGEpID49IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSB7CisJCWlwLT5zaW42LnNpbjZfYWRkciA9IG5sYV9nZXRfaW42X2FkZHIobmxhKTsKKwkJaXAtPnNhLnNhX2ZhbWlseSA9IEFGX0lORVQ2OworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKG5sYV9sZW4obmxhKSA+PSBzaXplb2YoX19iZTMyKSkgeworCQlpcC0+c2luLnNpbl9hZGRyLnNfYWRkciA9IG5sYV9nZXRfaW5fYWRkcihubGEpOworCQlpcC0+c2Euc2FfZmFtaWx5ID0gQUZfSU5FVDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisJfQogfQogCiBzdGF0aWMgaW50IHZ4bGFuX25sYV9wdXRfYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pb24gdnhsYW5fYWRkciAqaXApCisJCQkgICAgICBjb25zdCB1bmlvbiB2eGxhbl9hZGRyICppcCkKIHsKLSAgICAgICBpZiAoaXAtPnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikKLSAgICAgICAgICAgICAgIHJldHVybiBubGFfcHV0KHNrYiwgYXR0ciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksICZpcC0+c2luNi5zaW42X2FkZHIpOwotICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgIHJldHVybiBubGFfcHV0X2JlMzIoc2tiLCBhdHRyLCBpcC0+c2luLnNpbl9hZGRyLnNfYWRkcik7CisJaWYgKGlwLT5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCXJldHVybiBubGFfcHV0X2luNl9hZGRyKHNrYiwgYXR0ciwgJmlwLT5zaW42LnNpbjZfYWRkcik7CisJZWxzZQorCQlyZXR1cm4gbmxhX3B1dF9pbl9hZGRyKHNrYiwgYXR0ciwgaXAtPnNpbi5zaW5fYWRkci5zX2FkZHIpOwogfQogCiAjZWxzZSAvKiAhQ09ORklHX0lQVjYgKi8KQEAgLTIwMywzNiArMTk3LDM2IEBACiBzdGF0aWMgaW5saW5lCiBib29sIHZ4bGFuX2FkZHJfZXF1YWwoY29uc3QgdW5pb24gdnhsYW5fYWRkciAqYSwgY29uc3QgdW5pb24gdnhsYW5fYWRkciAqYikKIHsKLSAgICAgICByZXR1cm4gYS0+c2luLnNpbl9hZGRyLnNfYWRkciA9PSBiLT5zaW4uc2luX2FkZHIuc19hZGRyOworCXJldHVybiBhLT5zaW4uc2luX2FkZHIuc19hZGRyID09IGItPnNpbi5zaW5fYWRkci5zX2FkZHI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCB2eGxhbl9hZGRyX2FueShjb25zdCB1bmlvbiB2eGxhbl9hZGRyICppcGEpCiB7Ci0gICAgICAgcmV0dXJuIGlwYS0+c2luLnNpbl9hZGRyLnNfYWRkciA9PSBodG9ubChJTkFERFJfQU5ZKTsKKwlyZXR1cm4gaXBhLT5zaW4uc2luX2FkZHIuc19hZGRyID09IGh0b25sKElOQUREUl9BTlkpOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgdnhsYW5fYWRkcl9tdWx0aWNhc3QoY29uc3QgdW5pb24gdnhsYW5fYWRkciAqaXBhKQogewotICAgICAgIHJldHVybiBJTl9NVUxUSUNBU1QobnRvaGwoaXBhLT5zaW4uc2luX2FkZHIuc19hZGRyKSk7CisJcmV0dXJuIElOX01VTFRJQ0FTVChudG9obChpcGEtPnNpbi5zaW5fYWRkci5zX2FkZHIpKTsKIH0KIAogc3RhdGljIGludCB2eGxhbl9ubGFfZ2V0X2FkZHIodW5pb24gdnhsYW5fYWRkciAqaXAsIHN0cnVjdCBubGF0dHIgKm5sYSkKIHsKLSAgICAgICBpZiAobmxhX2xlbihubGEpID49IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSB7Ci0gICAgICAgICAgICAgICByZXR1cm4gLUVBRk5PU1VQUE9SVDsKLSAgICAgICB9IGVsc2UgaWYgKG5sYV9sZW4obmxhKSA+PSBzaXplb2YoX19iZTMyKSkgewotICAgICAgICAgICAgICAgaXAtPnNpbi5zaW5fYWRkci5zX2FkZHIgPSBubGFfZ2V0X2JlMzIobmxhKTsKLSAgICAgICAgICAgICAgIGlwLT5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUOwotICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIHJldHVybiAtRUFGTk9TVVBQT1JUOwotICAgICAgIH0KKwlpZiAobmxhX2xlbihubGEpID49IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKSB7CisJCXJldHVybiAtRUFGTk9TVVBQT1JUOworCX0gZWxzZSBpZiAobmxhX2xlbihubGEpID49IHNpemVvZihfX2JlMzIpKSB7CisJCWlwLT5zaW4uc2luX2FkZHIuc19hZGRyID0gbmxhX2dldF9pbl9hZGRyKG5sYSk7CisJCWlwLT5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVBRk5PU1VQUE9SVDsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgdnhsYW5fbmxhX3B1dF9hZGRyKHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bmlvbiB2eGxhbl9hZGRyICppcCkKKwkJCSAgICAgIGNvbnN0IHVuaW9uIHZ4bGFuX2FkZHIgKmlwKQogewotICAgICAgIHJldHVybiBubGFfcHV0X2JlMzIoc2tiLCBhdHRyLCBpcC0+c2luLnNpbl9hZGRyLnNfYWRkcik7CisJcmV0dXJuIG5sYV9wdXRfaW5fYWRkcihza2IsIGF0dHIsIGlwLT5zaW4uc2luX2FkZHIuc19hZGRyKTsKIH0KICNlbmRpZgogCkBAIC05OTUsNyArOTg5LDcgQEAKIAogLyogV2F0Y2ggaW5jb21pbmcgcGFja2V0cyB0byBsZWFybiBtYXBwaW5nIGJldHdlZW4gRXRoZXJuZXQgYWRkcmVzcwogICogYW5kIFR1bm5lbCBlbmRwb2ludC4KLSAqIFJldHVybiB0cnVlIGlmIHBhY2tldCBpcyBib2d1cyBhbmQgc2hvdWxkIGJlIGRyb3BwcGVkLgorICogUmV0dXJuIHRydWUgaWYgcGFja2V0IGlzIGJvZ3VzIGFuZCBzaG91bGQgYmUgZHJvcHBlZC4KICAqLwogc3RhdGljIGJvb2wgdnhsYW5fc25vb3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCXVuaW9uIHZ4bGFuX2FkZHIgKnNyY19pcCwgY29uc3QgdTggKnNyY19tYWMpCkBAIC0xMDcyLDExICsxMDY2LDYgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIHZ4bGFuX3NvY2tfaG9sZChzdHJ1Y3QgdnhsYW5fc29jayAqdnMpCi17Ci0JYXRvbWljX2luYygmdnMtPnJlZmNudCk7Ci19Ci0KIHZvaWQgdnhsYW5fc29ja19yZWxlYXNlKHN0cnVjdCB2eGxhbl9zb2NrICp2cykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSB2cy0+c29jay0+c2s7CkBAIC0xMDk1LDE3ICsxMDg0LDE2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2eGxhbl9zb2NrX3JlbGVhc2UpOwogCi0vKiBDYWxsYmFjayB0byB1cGRhdGUgbXVsdGljYXN0IGdyb3VwIG1lbWJlcnNoaXAgd2hlbiBmaXJzdCBWTkkgb24KLSAqIG11bHRpY2FzdCBhc2RkcmVzcyBpcyBicm91Z2h0IHVwCi0gKiBEb25lIGFzIHdvcmtxdWV1ZSBiZWNhdXNlIGlwX21jX2pvaW5fZ3JvdXAgYWNxdWlyZXMgUlROTC4KKy8qIFVwZGF0ZSBtdWx0aWNhc3QgZ3JvdXAgbWVtYmVyc2hpcCB3aGVuIGZpcnN0IFZOSSBvbgorICogbXVsdGljYXN0IGFkZHJlc3MgaXMgYnJvdWdodCB1cAogICovCi1zdGF0aWMgdm9pZCB2eGxhbl9pZ21wX2pvaW4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIGludCB2eGxhbl9pZ21wX2pvaW4oc3RydWN0IHZ4bGFuX2RldiAqdnhsYW4pCiB7Ci0Jc3RydWN0IHZ4bGFuX2RldiAqdnhsYW4gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZ4bGFuX2RldiwgaWdtcF9qb2luKTsKIAlzdHJ1Y3QgdnhsYW5fc29jayAqdnMgPSB2eGxhbi0+dm5fc29jazsKIAlzdHJ1Y3Qgc29jayAqc2sgPSB2cy0+c29jay0+c2s7CiAJdW5pb24gdnhsYW5fYWRkciAqaXAgPSAmdnhsYW4tPmRlZmF1bHRfZHN0LnJlbW90ZV9pcDsKIAlpbnQgaWZpbmRleCA9IHZ4bGFuLT5kZWZhdWx0X2RzdC5yZW1vdGVfaWZpbmRleDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCWxvY2tfc29jayhzayk7CiAJaWYgKGlwLT5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgewpAQCAtMTExNCwyNyArMTEwMiwyNiBAQAogCQkJLmltcl9pZmluZGV4CQk9IGlmaW5kZXgsCiAJCX07CiAKLQkJaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOworCQlyZXQgPSBpcF9tY19qb2luX2dyb3VwKHNrLCAmbXJlcSk7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAl9IGVsc2UgewotCQlpcHY2X3N0dWItPmlwdjZfc29ja19tY19qb2luKHNrLCBpZmluZGV4LAotCQkJCQkgICAgICZpcC0+c2luNi5zaW42X2FkZHIpOworCQlyZXQgPSBpcHY2X3N0dWItPmlwdjZfc29ja19tY19qb2luKHNrLCBpZmluZGV4LAorCQkJCQkJICAgJmlwLT5zaW42LnNpbjZfYWRkcik7CiAjZW5kaWYKIAl9CiAJcmVsZWFzZV9zb2NrKHNrKTsKIAotCXZ4bGFuX3NvY2tfcmVsZWFzZSh2cyk7Ci0JZGV2X3B1dCh2eGxhbi0+ZGV2KTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBJbnZlcnNlIG9mIHZ4bGFuX2lnbXBfam9pbiB3aGVuIGxhc3QgVk5JIGlzIGJyb3VnaHQgZG93biAqLwotc3RhdGljIHZvaWQgdnhsYW5faWdtcF9sZWF2ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgaW50IHZ4bGFuX2lnbXBfbGVhdmUoc3RydWN0IHZ4bGFuX2RldiAqdnhsYW4pCiB7Ci0Jc3RydWN0IHZ4bGFuX2RldiAqdnhsYW4gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZ4bGFuX2RldiwgaWdtcF9sZWF2ZSk7CiAJc3RydWN0IHZ4bGFuX3NvY2sgKnZzID0gdnhsYW4tPnZuX3NvY2s7CiAJc3RydWN0IHNvY2sgKnNrID0gdnMtPnNvY2stPnNrOwogCXVuaW9uIHZ4bGFuX2FkZHIgKmlwID0gJnZ4bGFuLT5kZWZhdWx0X2RzdC5yZW1vdGVfaXA7CiAJaW50IGlmaW5kZXggPSB2eGxhbi0+ZGVmYXVsdF9kc3QucmVtb3RlX2lmaW5kZXg7CisJaW50IHJldCA9IC1FSU5WQUw7CiAKIAlsb2NrX3NvY2soc2spOwogCWlmIChpcC0+c2Euc2FfZmFtaWx5ID09IEFGX0lORVQpIHsKQEAgLTExNDMsMTggKzExMzAsMTYgQEAKIAkJCS5pbXJfaWZpbmRleAkJPSBpZmluZGV4LAogCQl9OwogCi0JCWlwX21jX2xlYXZlX2dyb3VwKHNrLCAmbXJlcSk7CisJCXJldCA9IGlwX21jX2xlYXZlX2dyb3VwKHNrLCAmbXJlcSk7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAl9IGVsc2UgewotCQlpcHY2X3N0dWItPmlwdjZfc29ja19tY19kcm9wKHNrLCBpZmluZGV4LAotCQkJCQkgICAgICZpcC0+c2luNi5zaW42X2FkZHIpOworCQlyZXQgPSBpcHY2X3N0dWItPmlwdjZfc29ja19tY19kcm9wKHNrLCBpZmluZGV4LAorCQkJCQkJICAgJmlwLT5zaW42LnNpbjZfYWRkcik7CiAjZW5kaWYKIAl9Ci0KIAlyZWxlYXNlX3NvY2soc2spOwogCi0JdnhsYW5fc29ja19yZWxlYXNlKHZzKTsKLQlkZXZfcHV0KHZ4bGFuLT5kZXYpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdnhsYW5oZHIgKnZ4bGFuX3JlbWNzdW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHZ4bGFuaGRyICp2aCwKQEAgLTEyMTgsNyArMTIwMyw3IEBACiAJCQlnb3RvIGRyb3A7CiAKIAkJZmxhZ3MgJj0gflZYTEFOX0hGX1JDTzsKLQkJdm5pICY9IFZYTEFOX1ZJRF9NQVNLOworCQl2bmkgJj0gVlhMQU5fVk5JX01BU0s7CiAJfQogCiAJLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBvbmx5IGFsbG93IHJlc2VydmVkIGZpZWxkcyB0byBiZQpAQCAtMTIzOSwxMiArMTIyNCwxMiBAQAogCQlmbGFncyAmPSB+VlhMQU5fR0JQX1VTRURfQklUUzsKIAl9CiAKLQlpZiAoZmxhZ3MgfHwgKHZuaSAmIH5WWExBTl9WSURfTUFTSykpIHsKKwlpZiAoZmxhZ3MgfHwgdm5pICYgflZYTEFOX1ZOSV9NQVNLKSB7CiAJCS8qIElmIHRoZXJlIGFyZSBhbnkgdW5wcm9jZXNzZWQgZmxhZ3MgcmVtYWluaW5nIHRyZWF0CiAJCSAqIHRoaXMgYXMgYSBtYWxmb3JtZWQgcGFja2V0LiBUaGlzIGJlaGF2aW9yIGRpdmVyZ2VzIGZyb20KIAkJICogVlhMQU4gUkZDIChSRkM3MzQ4KSB3aGljaCBzdGlwdWxhdGVzIHRoYXQgYml0cyBpbiByZXNlcnZlZAogCQkgKiBpbiByZXNlcnZlZCBmaWVsZHMgYXJlIHRvIGJlIGlnbm9yZWQuIFRoZSBhcHByb2FjaCBoZXJlCi0JCSAqIG1haW50YWlucyBjb21wYXRiaWxpdHkgd2l0aCBwcmV2aW91cyBzdGFjayBjb2RlLCBhbmQgYWxzbworCQkgKiBtYWludGFpbnMgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzIHN0YWNrIGNvZGUsIGFuZCBhbHNvCiAJCSAqIGlzIG1vcmUgcm9idXN0IGFuZCBwcm92aWRlcyBhIGxpdHRsZSBtb3JlIHNlY3VyaXR5IGluCiAJCSAqIGFkZGluZyBleHRlbnNpb25zIHRvIFZYTEFOLgogCQkgKi8KQEAgLTE2ODcsNyArMTY3Miw4IEBACiB9CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotc3RhdGljIGludCB2eGxhbjZfeG1pdF9za2Ioc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGludCB2eGxhbjZfeG1pdF9za2Ioc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGluNl9hZGRyICpzYWRkciwKIAkJCSAgIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsIF9fdTggcHJpbywgX191OCB0dGwsCiAJCQkgICBfX2JlMTYgc3JjX3BvcnQsIF9fYmUxNiBkc3RfcG9ydCwKQEAgLTE3MTMsMTIgKzE2OTksNiBAQAogCQl9CiAJfQogCi0Jc2tiID0gaXB0dW5uZWxfaGFuZGxlX29mZmxvYWRzKHNrYiwgdWRwX3N1bSwgdHlwZSk7Ci0JaWYgKElTX0VSUihza2IpKSB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyOwotCX0KLQogCXNrYl9zY3J1Yl9wYWNrZXQoc2tiLCB4bmV0KTsKIAogCW1pbl9oZWFkcm9vbSA9IExMX1JFU0VSVkVEX1NQQUNFKGRzdC0+ZGV2KSArIGRzdC0+aGVhZGVyX2xlbgpAQCAtMTczOCw2ICsxNzE4LDEyIEBACiAJCWdvdG8gZXJyOwogCX0KIAorCXNrYiA9IGlwdHVubmVsX2hhbmRsZV9vZmZsb2Fkcyhza2IsIHVkcF9zdW0sIHR5cGUpOworCWlmIChJU19FUlIoc2tiKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKIAl2eGggPSAoc3RydWN0IHZ4bGFuaGRyICopIF9fc2tiX3B1c2goc2tiLCBzaXplb2YoKnZ4aCkpOwogCXZ4aC0+dnhfZmxhZ3MgPSBodG9ubChWWExBTl9IRl9WTkkpOwogCXZ4aC0+dnhfdm5pID0gbWQtPnZuaTsKQEAgLTE3NjMsNyArMTc0OSw3IEBACiAKIAlza2Jfc2V0X2lubmVyX3Byb3RvY29sKHNrYiwgaHRvbnMoRVRIX1BfVEVCKSk7CiAKLQl1ZHBfdHVubmVsNl94bWl0X3NrYihkc3QsIHNrYiwgZGV2LCBzYWRkciwgZGFkZHIsIHByaW8sCisJdWRwX3R1bm5lbDZfeG1pdF9za2IoZHN0LCBzaywgc2tiLCBkZXYsIHNhZGRyLCBkYWRkciwgcHJpbywKIAkJCSAgICAgdHRsLCBzcmNfcG9ydCwgZHN0X3BvcnQsCiAJCQkgICAgICEhKHZ4ZmxhZ3MgJiBWWExBTl9GX1VEUF9aRVJPX0NTVU02X1RYKSk7CiAJcmV0dXJuIDA7CkBAIC0xNzczLDcgKzE3NTksNyBAQAogfQogI2VuZGlmCiAKLWludCB2eGxhbl94bWl0X3NrYihzdHJ1Y3QgcnRhYmxlICpydCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2ludCB2eGxhbl94bWl0X3NrYihzdHJ1Y3QgcnRhYmxlICpydCwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkgICBfX2JlMzIgc3JjLCBfX2JlMzIgZHN0LCBfX3U4IHRvcywgX191OCB0dGwsIF9fYmUxNiBkZiwKIAkJICAgX19iZTE2IHNyY19wb3J0LCBfX2JlMTYgZHN0X3BvcnQsCiAJCSAgIHN0cnVjdCB2eGxhbl9tZXRhZGF0YSAqbWQsIGJvb2wgeG5ldCwgdTMyIHZ4ZmxhZ3MpCkBAIC0xNzk4LDEwICsxNzg0LDYgQEAKIAkJfQogCX0KIAotCXNrYiA9IGlwdHVubmVsX2hhbmRsZV9vZmZsb2Fkcyhza2IsIHVkcF9zdW0sIHR5cGUpOwotCWlmIChJU19FUlIoc2tiKSkKLQkJcmV0dXJuIFBUUl9FUlIoc2tiKTsKLQogCW1pbl9oZWFkcm9vbSA9IExMX1JFU0VSVkVEX1NQQUNFKHJ0LT5kc3QuZGV2KSArIHJ0LT5kc3QuaGVhZGVyX2xlbgogCQkJKyBWWExBTl9ITEVOICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikKIAkJCSsgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikgPyBWTEFOX0hMRU4gOiAwKTsKQEAgLTE4MTcsNiArMTc5OSwxMCBAQAogCWlmIChXQVJOX09OKCFza2IpKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXNrYiA9IGlwdHVubmVsX2hhbmRsZV9vZmZsb2Fkcyhza2IsIHVkcF9zdW0sIHR5cGUpOworCWlmIChJU19FUlIoc2tiKSkKKwkJcmV0dXJuIFBUUl9FUlIoc2tiKTsKKwogCXZ4aCA9IChzdHJ1Y3QgdnhsYW5oZHIgKikgX19za2JfcHVzaChza2IsIHNpemVvZigqdnhoKSk7CiAJdnhoLT52eF9mbGFncyA9IGh0b25sKFZYTEFOX0hGX1ZOSSk7CiAJdnhoLT52eF92bmkgPSBtZC0+dm5pOwpAQCAtMTg0Miw3ICsxODI4LDcgQEAKIAogCXNrYl9zZXRfaW5uZXJfcHJvdG9jb2woc2tiLCBodG9ucyhFVEhfUF9URUIpKTsKIAotCXJldHVybiB1ZHBfdHVubmVsX3htaXRfc2tiKHJ0LCBza2IsIHNyYywgZHN0LCB0b3MsCisJcmV0dXJuIHVkcF90dW5uZWxfeG1pdF9za2IocnQsIHNrLCBza2IsIHNyYywgZHN0LCB0b3MsCiAJCQkJICAgdHRsLCBkZiwgc3JjX3BvcnQsIGRzdF9wb3J0LCB4bmV0LAogCQkJCSAgICEodnhmbGFncyAmIFZYTEFOX0ZfVURQX0NTVU0pKTsKIH0KQEAgLTE4OTcsNiArMTg4Myw3IEBACiAJCQkgICBzdHJ1Y3QgdnhsYW5fcmRzdCAqcmRzdCwgYm9vbCBkaWRfcnNjKQogewogCXN0cnVjdCB2eGxhbl9kZXYgKnZ4bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3Qgc29jayAqc2sgPSB2eGxhbi0+dm5fc29jay0+c29jay0+c2s7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBpcGhkciAqb2xkX2lwaDsKIAlzdHJ1Y3QgZmxvd2k0IGZsNDsKQEAgLTE5NzYsNyArMTk2Myw3IEBACiAJCW1kLnZuaSA9IGh0b25sKHZuaSA8PCA4KTsKIAkJbWQuZ2JwID0gc2tiLT5tYXJrOwogCi0JCWVyciA9IHZ4bGFuX3htaXRfc2tiKHJ0LCBza2IsIGZsNC5zYWRkciwKKwkJZXJyID0gdnhsYW5feG1pdF9za2IocnQsIHNrLCBza2IsIGZsNC5zYWRkciwKIAkJCQkgICAgIGRzdC0+c2luLnNpbl9hZGRyLnNfYWRkciwgdG9zLCB0dGwsIGRmLAogCQkJCSAgICAgc3JjX3BvcnQsIGRzdF9wb3J0LCAmbWQsCiAJCQkJICAgICAhbmV0X2VxKHZ4bGFuLT5uZXQsIGRldl9uZXQodnhsYW4tPmRldikpLApAQCAtMTk5MCw3ICsxOTc3LDYgQEAKIAkJaXB0dW5uZWxfeG1pdF9zdGF0cyhlcnIsICZkZXYtPnN0YXRzLCBkZXYtPnRzdGF0cyk7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAl9IGVsc2UgewotCQlzdHJ1Y3Qgc29jayAqc2sgPSB2eGxhbi0+dm5fc29jay0+c29jay0+c2s7CiAJCXN0cnVjdCBkc3RfZW50cnkgKm5kc3Q7CiAJCXN0cnVjdCBmbG93aTYgZmw2OwogCQl1MzIgZmxhZ3M7CkBAIC0yMDM2LDcgKzIwMjIsNyBAQAogCQltZC52bmkgPSBodG9ubCh2bmkgPDwgOCk7CiAJCW1kLmdicCA9IHNrYi0+bWFyazsKIAotCQllcnIgPSB2eGxhbjZfeG1pdF9za2IobmRzdCwgc2tiLCBkZXYsICZmbDYuc2FkZHIsICZmbDYuZGFkZHIsCisJCWVyciA9IHZ4bGFuNl94bWl0X3NrYihuZHN0LCBzaywgc2tiLCBkZXYsICZmbDYuc2FkZHIsICZmbDYuZGFkZHIsCiAJCQkJICAgICAgMCwgdHRsLCBzcmNfcG9ydCwgZHN0X3BvcnQsICZtZCwKIAkJCQkgICAgICAhbmV0X2VxKHZ4bGFuLT5uZXQsIGRldl9uZXQodnhsYW4tPmRldikpLAogCQkJCSAgICAgIHZ4bGFuLT5mbGFncyk7CkBAIC0yMTc1LDM3ICsyMTYxLDIyIEBACiAKIHN0YXRpYyB2b2lkIHZ4bGFuX3ZzX2FkZF9kZXYoc3RydWN0IHZ4bGFuX3NvY2sgKnZzLCBzdHJ1Y3QgdnhsYW5fZGV2ICp2eGxhbikKIHsKKwlzdHJ1Y3QgdnhsYW5fbmV0ICp2biA9IG5ldF9nZW5lcmljKHZ4bGFuLT5uZXQsIHZ4bGFuX25ldF9pZCk7CiAJX191MzIgdm5pID0gdnhsYW4tPmRlZmF1bHRfZHN0LnJlbW90ZV92bmk7CiAKIAl2eGxhbi0+dm5fc29jayA9IHZzOworCXNwaW5fbG9jaygmdm4tPnNvY2tfbG9jayk7CiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZ2eGxhbi0+aGxpc3QsIHZuaV9oZWFkKHZzLCB2bmkpKTsKKwlzcGluX3VubG9jaygmdm4tPnNvY2tfbG9jayk7CiB9CiAKIC8qIFNldHVwIHN0YXRzIHdoZW4gZGV2aWNlIGlzIGNyZWF0ZWQgKi8KIHN0YXRpYyBpbnQgdnhsYW5faW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCB2eGxhbl9kZXYgKnZ4bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgdnhsYW5fbmV0ICp2biA9IG5ldF9nZW5lcmljKHZ4bGFuLT5uZXQsIHZ4bGFuX25ldF9pZCk7Ci0Jc3RydWN0IHZ4bGFuX3NvY2sgKnZzOwotCWJvb2wgaXB2NiA9IHZ4bGFuLT5mbGFncyAmIFZYTEFOX0ZfSVBWNjsKLQogCWRldi0+dHN0YXRzID0gbmV0ZGV2X2FsbG9jX3BjcHVfc3RhdHMoc3RydWN0IHBjcHVfc3dfbmV0c3RhdHMpOwogCWlmICghZGV2LT50c3RhdHMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc3Bpbl9sb2NrKCZ2bi0+c29ja19sb2NrKTsKLQl2cyA9IHZ4bGFuX2ZpbmRfc29jayh2eGxhbi0+bmV0LCBpcHY2ID8gQUZfSU5FVDYgOiBBRl9JTkVULAotCQkJICAgICB2eGxhbi0+ZHN0X3BvcnQsIHZ4bGFuLT5mbGFncyk7Ci0JaWYgKHZzICYmIGF0b21pY19hZGRfdW5sZXNzKCZ2cy0+cmVmY250LCAxLCAwKSkgewotCQkvKiBJZiB3ZSBoYXZlIGEgc29ja2V0IHdpdGggc2FtZSBwb3J0IGFscmVhZHksIHJldXNlIGl0ICovCi0JCXZ4bGFuX3ZzX2FkZF9kZXYodnMsIHZ4bGFuKTsKLQl9IGVsc2UgewotCQkvKiBvdGhlcndpc2UgbWFrZSBuZXcgc29ja2V0IG91dHNpZGUgb2YgUlROTCAqLwotCQlkZXZfaG9sZChkZXYpOwotCQlxdWV1ZV93b3JrKHZ4bGFuX3dxLCAmdnhsYW4tPnNvY2tfd29yayk7Ci0JfQotCXNwaW5fdW5sb2NrKCZ2bi0+c29ja19sb2NrKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0yMjIzLDEyICsyMTk0LDkgQEAKIHN0YXRpYyB2b2lkIHZ4bGFuX3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCB2eGxhbl9kZXYgKnZ4bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJ1Y3QgdnhsYW5fc29jayAqdnMgPSB2eGxhbi0+dm5fc29jazsKIAogCXZ4bGFuX2ZkYl9kZWxldGVfZGVmYXVsdCh2eGxhbik7CiAKLQlpZiAodnMpCi0JCXZ4bGFuX3NvY2tfcmVsZWFzZSh2cyk7CiAJZnJlZV9wZXJjcHUoZGV2LT50c3RhdHMpOwogfQogCkBAIC0yMjM2LDIyICsyMjA0LDI4IEBACiBzdGF0aWMgaW50IHZ4bGFuX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgdnhsYW5fZGV2ICp2eGxhbiA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RydWN0IHZ4bGFuX3NvY2sgKnZzID0gdnhsYW4tPnZuX3NvY2s7CisJc3RydWN0IHZ4bGFuX3NvY2sgKnZzOworCWludCByZXQgPSAwOwogCi0JLyogc29ja2V0IGhhc24ndCBiZWVuIGNyZWF0ZWQgKi8KLQlpZiAoIXZzKQotCQlyZXR1cm4gLUVOT1RDT05OOworCXZzID0gdnhsYW5fc29ja19hZGQodnhsYW4tPm5ldCwgdnhsYW4tPmRzdF9wb3J0LCB2eGxhbl9yY3YsIE5VTEwsCisJCQkgICAgZmFsc2UsIHZ4bGFuLT5mbGFncyk7CisJaWYgKElTX0VSUih2cykpCisJCXJldHVybiBQVFJfRVJSKHZzKTsKKworCXZ4bGFuX3ZzX2FkZF9kZXYodnMsIHZ4bGFuKTsKIAogCWlmICh2eGxhbl9hZGRyX211bHRpY2FzdCgmdnhsYW4tPmRlZmF1bHRfZHN0LnJlbW90ZV9pcCkpIHsKLQkJdnhsYW5fc29ja19ob2xkKHZzKTsKLQkJZGV2X2hvbGQoZGV2KTsKLQkJcXVldWVfd29yayh2eGxhbl93cSwgJnZ4bGFuLT5pZ21wX2pvaW4pOworCQlyZXQgPSB2eGxhbl9pZ21wX2pvaW4odnhsYW4pOworCQlpZiAocmV0KSB7CisJCQl2eGxhbl9zb2NrX3JlbGVhc2UodnMpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAogCWlmICh2eGxhbi0+YWdlX2ludGVydmFsKQogCQltb2RfdGltZXIoJnZ4bGFuLT5hZ2VfdGltZXIsIGppZmZpZXMgKyBGREJfQUdFX0lOVEVSVkFMKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qIFB1cmdlIHRoZSBmb3J3YXJkaW5nIHRhYmxlICovCkBAIC0yMjc5LDE5ICsyMjUzLDE4IEBACiAJc3RydWN0IHZ4bGFuX2RldiAqdnhsYW4gPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCB2eGxhbl9uZXQgKnZuID0gbmV0X2dlbmVyaWModnhsYW4tPm5ldCwgdnhsYW5fbmV0X2lkKTsKIAlzdHJ1Y3QgdnhsYW5fc29jayAqdnMgPSB2eGxhbi0+dm5fc29jazsKKwlpbnQgcmV0ID0gMDsKIAotCWlmICh2cyAmJiB2eGxhbl9hZGRyX211bHRpY2FzdCgmdnhsYW4tPmRlZmF1bHRfZHN0LnJlbW90ZV9pcCkgJiYKLQkgICAgIXZ4bGFuX2dyb3VwX3VzZWQodm4sIHZ4bGFuKSkgewotCQl2eGxhbl9zb2NrX2hvbGQodnMpOwotCQlkZXZfaG9sZChkZXYpOwotCQlxdWV1ZV93b3JrKHZ4bGFuX3dxLCAmdnhsYW4tPmlnbXBfbGVhdmUpOwotCX0KKwlpZiAodnhsYW5fYWRkcl9tdWx0aWNhc3QoJnZ4bGFuLT5kZWZhdWx0X2RzdC5yZW1vdGVfaXApICYmCisJICAgICF2eGxhbl9ncm91cF91c2VkKHZuLCB2eGxhbikpCisJCXJldCA9IHZ4bGFuX2lnbXBfbGVhdmUodnhsYW4pOwogCiAJZGVsX3RpbWVyX3N5bmMoJnZ4bGFuLT5hZ2VfdGltZXIpOwogCiAJdnhsYW5fZmx1c2godnhsYW4pOworCXZ4bGFuX3NvY2tfcmVsZWFzZSh2cyk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBTdHViLCBub3RoaW5nIG5lZWRzIHRvIGJlIGRvbmUuICovCkBAIC0yNDAyLDkgKzIzNzUsNiBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnZ4bGFuLT5uZXh0KTsKIAlzcGluX2xvY2tfaW5pdCgmdnhsYW4tPmhhc2hfbG9jayk7Ci0JSU5JVF9XT1JLKCZ2eGxhbi0+aWdtcF9qb2luLCB2eGxhbl9pZ21wX2pvaW4pOwotCUlOSVRfV09SSygmdnhsYW4tPmlnbXBfbGVhdmUsIHZ4bGFuX2lnbXBfbGVhdmUpOwotCUlOSVRfV09SSygmdnhsYW4tPnNvY2tfd29yaywgdnhsYW5fc29ja193b3JrKTsKIAogCWluaXRfdGltZXJfZGVmZXJyYWJsZSgmdnhsYW4tPmFnZV90aW1lcik7CiAJdnhsYW4tPmFnZV90aW1lci5mdW5jdGlvbiA9IHZ4bGFuX2NsZWFudXA7CkBAIC0yNTE2LDcgKzI0ODYsNiBAQAogCQkgICAgIShmbGFncyAmIFZYTEFOX0ZfVURQX1pFUk9fQ1NVTTZfUlgpOwogCX0gZWxzZSB7CiAJCXVkcF9jb25mLmZhbWlseSA9IEFGX0lORVQ7Ci0JCXVkcF9jb25mLmxvY2FsX2lwLnNfYWRkciA9IElOQUREUl9BTlk7CiAJfQogCiAJdWRwX2NvbmYubG9jYWxfdWRwX3BvcnQgPSBwb3J0OwpAQCAtMjU1Miw2ICsyNTIxLDggQEAKIAogCXNvY2sgPSB2eGxhbl9jcmVhdGVfc29jayhuZXQsIGlwdjYsIHBvcnQsIGZsYWdzKTsKIAlpZiAoSVNfRVJSKHNvY2spKSB7CisJCXByX2luZm8oIkNhbm5vdCBiaW5kIHBvcnQgJWQsIGVycj0lbGRcbiIsIG50b2hzKHBvcnQpLAorCQkJUFRSX0VSUihzb2NrKSk7CiAJCWtmcmVlKHZzKTsKIAkJcmV0dXJuIEVSUl9DQVNUKHNvY2spOwogCX0KQEAgLTI1OTEsNDUgKzI1NjIsMjMgQEAKIAlzdHJ1Y3QgdnhsYW5fc29jayAqdnM7CiAJYm9vbCBpcHY2ID0gZmxhZ3MgJiBWWExBTl9GX0lQVjY7CiAKLQl2cyA9IHZ4bGFuX3NvY2tldF9jcmVhdGUobmV0LCBwb3J0LCByY3YsIGRhdGEsIGZsYWdzKTsKLQlpZiAoIUlTX0VSUih2cykpCi0JCXJldHVybiB2czsKKwlpZiAoIW5vX3NoYXJlKSB7CisJCXNwaW5fbG9jaygmdm4tPnNvY2tfbG9jayk7CisJCXZzID0gdnhsYW5fZmluZF9zb2NrKG5ldCwgaXB2NiA/IEFGX0lORVQ2IDogQUZfSU5FVCwgcG9ydCwKKwkJCQkgICAgIGZsYWdzKTsKKwkJaWYgKHZzICYmIHZzLT5yY3YgPT0gcmN2KSB7CisJCQlpZiAoIWF0b21pY19hZGRfdW5sZXNzKCZ2cy0+cmVmY250LCAxLCAwKSkKKwkJCQl2cyA9IEVSUl9QVFIoLUVCVVNZKTsKKwkJCXNwaW5fdW5sb2NrKCZ2bi0+c29ja19sb2NrKTsKKwkJCXJldHVybiB2czsKKwkJfQorCQlzcGluX3VubG9jaygmdm4tPnNvY2tfbG9jayk7CisJfQogCi0JaWYgKG5vX3NoYXJlKQkvKiBSZXR1cm4gZXJyb3IgaWYgc2hhcmluZyBpcyBub3QgYWxsb3dlZC4gKi8KLQkJcmV0dXJuIHZzOwotCi0Jc3Bpbl9sb2NrKCZ2bi0+c29ja19sb2NrKTsKLQl2cyA9IHZ4bGFuX2ZpbmRfc29jayhuZXQsIGlwdjYgPyBBRl9JTkVUNiA6IEFGX0lORVQsIHBvcnQsIGZsYWdzKTsKLQlpZiAodnMgJiYgKCh2cy0+cmN2ICE9IHJjdikgfHwKLQkJICAgIWF0b21pY19hZGRfdW5sZXNzKCZ2cy0+cmVmY250LCAxLCAwKSkpCi0JCQl2cyA9IEVSUl9QVFIoLUVCVVNZKTsKLQlzcGluX3VubG9jaygmdm4tPnNvY2tfbG9jayk7Ci0KLQlpZiAoIXZzKQotCQl2cyA9IEVSUl9QVFIoLUVJTlZBTCk7Ci0KLQlyZXR1cm4gdnM7CisJcmV0dXJuIHZ4bGFuX3NvY2tldF9jcmVhdGUobmV0LCBwb3J0LCByY3YsIGRhdGEsIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHZ4bGFuX3NvY2tfYWRkKTsKIAotLyogU2NoZWR1bGVkIGF0IGRldmljZSBjcmVhdGlvbiB0byBiaW5kIHRvIGEgc29ja2V0ICovCi1zdGF0aWMgdm9pZCB2eGxhbl9zb2NrX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB2eGxhbl9kZXYgKnZ4bGFuID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB2eGxhbl9kZXYsIHNvY2tfd29yayk7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gdnhsYW4tPm5ldDsKLQlzdHJ1Y3QgdnhsYW5fbmV0ICp2biA9IG5ldF9nZW5lcmljKG5ldCwgdnhsYW5fbmV0X2lkKTsKLQlfX2JlMTYgcG9ydCA9IHZ4bGFuLT5kc3RfcG9ydDsKLQlzdHJ1Y3QgdnhsYW5fc29jayAqbnZzOwotCi0JbnZzID0gdnhsYW5fc29ja19hZGQobmV0LCBwb3J0LCB2eGxhbl9yY3YsIE5VTEwsIGZhbHNlLCB2eGxhbi0+ZmxhZ3MpOwotCXNwaW5fbG9jaygmdm4tPnNvY2tfbG9jayk7Ci0JaWYgKCFJU19FUlIobnZzKSkKLQkJdnhsYW5fdnNfYWRkX2RldihudnMsIHZ4bGFuKTsKLQlzcGluX3VubG9jaygmdm4tPnNvY2tfbG9jayk7Ci0KLQlkZXZfcHV0KHZ4bGFuLT5kZXYpOwotfQotCiBzdGF0aWMgaW50IHZ4bGFuX25ld2xpbmsoc3RydWN0IG5ldCAqc3JjX25ldCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSBzdHJ1Y3QgbmxhdHRyICp0YltdLCBzdHJ1Y3QgbmxhdHRyICpkYXRhW10pCiB7CkBAIC0yNjUxLDI3ICsyNjAwLDI1IEBACiAJLyogVW5sZXNzIElQdjYgaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQsIGFzc3VtZSBJUHY0ICovCiAJZHN0LT5yZW1vdGVfaXAuc2Euc2FfZmFtaWx5ID0gQUZfSU5FVDsKIAlpZiAoZGF0YVtJRkxBX1ZYTEFOX0dST1VQXSkgewotCQlkc3QtPnJlbW90ZV9pcC5zaW4uc2luX2FkZHIuc19hZGRyID0gbmxhX2dldF9iZTMyKGRhdGFbSUZMQV9WWExBTl9HUk9VUF0pOworCQlkc3QtPnJlbW90ZV9pcC5zaW4uc2luX2FkZHIuc19hZGRyID0gbmxhX2dldF9pbl9hZGRyKGRhdGFbSUZMQV9WWExBTl9HUk9VUF0pOwogCX0gZWxzZSBpZiAoZGF0YVtJRkxBX1ZYTEFOX0dST1VQNl0pIHsKIAkJaWYgKCFJU19FTkFCTEVEKENPTkZJR19JUFY2KSkKIAkJCXJldHVybiAtRVBGTk9TVVBQT1JUOwogCi0JCW5sYV9tZW1jcHkoJmRzdC0+cmVtb3RlX2lwLnNpbjYuc2luNl9hZGRyLCBkYXRhW0lGTEFfVlhMQU5fR1JPVVA2XSwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJZHN0LT5yZW1vdGVfaXAuc2luNi5zaW42X2FkZHIgPSBubGFfZ2V0X2luNl9hZGRyKGRhdGFbSUZMQV9WWExBTl9HUk9VUDZdKTsKIAkJZHN0LT5yZW1vdGVfaXAuc2Euc2FfZmFtaWx5ID0gQUZfSU5FVDY7CiAJCXVzZV9pcHY2ID0gdHJ1ZTsKIAl9CiAKIAlpZiAoZGF0YVtJRkxBX1ZYTEFOX0xPQ0FMXSkgewotCQl2eGxhbi0+c2FkZHIuc2luLnNpbl9hZGRyLnNfYWRkciA9IG5sYV9nZXRfYmUzMihkYXRhW0lGTEFfVlhMQU5fTE9DQUxdKTsKKwkJdnhsYW4tPnNhZGRyLnNpbi5zaW5fYWRkci5zX2FkZHIgPSBubGFfZ2V0X2luX2FkZHIoZGF0YVtJRkxBX1ZYTEFOX0xPQ0FMXSk7CiAJCXZ4bGFuLT5zYWRkci5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUOwogCX0gZWxzZSBpZiAoZGF0YVtJRkxBX1ZYTEFOX0xPQ0FMNl0pIHsKIAkJaWYgKCFJU19FTkFCTEVEKENPTkZJR19JUFY2KSkKIAkJCXJldHVybiAtRVBGTk9TVVBQT1JUOwogCiAJCS8qIFRPRE86IHJlc3BlY3Qgc2NvcGUgaWQgKi8KLQkJbmxhX21lbWNweSgmdnhsYW4tPnNhZGRyLnNpbjYuc2luNl9hZGRyLCBkYXRhW0lGTEFfVlhMQU5fTE9DQUw2XSwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJdnhsYW4tPnNhZGRyLnNpbjYuc2luNl9hZGRyID0gbmxhX2dldF9pbjZfYWRkcihkYXRhW0lGTEFfVlhMQU5fTE9DQUw2XSk7CiAJCXZ4bGFuLT5zYWRkci5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUNjsKIAkJdXNlX2lwdjYgPSB0cnVlOwogCX0KQEAgLTI4NTYsMTMgKzI4MDMsMTMgQEAKIAogCWlmICghdnhsYW5fYWRkcl9hbnkoJmRzdC0+cmVtb3RlX2lwKSkgewogCQlpZiAoZHN0LT5yZW1vdGVfaXAuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpIHsKLQkJCWlmIChubGFfcHV0X2JlMzIoc2tiLCBJRkxBX1ZYTEFOX0dST1VQLAotCQkJCQkgZHN0LT5yZW1vdGVfaXAuc2luLnNpbl9hZGRyLnNfYWRkcikpCisJCQlpZiAobmxhX3B1dF9pbl9hZGRyKHNrYiwgSUZMQV9WWExBTl9HUk9VUCwKKwkJCQkJICAgIGRzdC0+cmVtb3RlX2lwLnNpbi5zaW5fYWRkci5zX2FkZHIpKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCX0gZWxzZSB7Ci0JCQlpZiAobmxhX3B1dChza2IsIElGTEFfVlhMQU5fR1JPVVA2LCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKLQkJCQkgICAgJmRzdC0+cmVtb3RlX2lwLnNpbjYuc2luNl9hZGRyKSkKKwkJCWlmIChubGFfcHV0X2luNl9hZGRyKHNrYiwgSUZMQV9WWExBTl9HUk9VUDYsCisJCQkJCSAgICAgJmRzdC0+cmVtb3RlX2lwLnNpbjYuc2luNl9hZGRyKSkKIAkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKICNlbmRpZgogCQl9CkBAIC0yODczLDEzICsyODIwLDEzIEBACiAKIAlpZiAoIXZ4bGFuX2FkZHJfYW55KCZ2eGxhbi0+c2FkZHIpKSB7CiAJCWlmICh2eGxhbi0+c2FkZHIuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpIHsKLQkJCWlmIChubGFfcHV0X2JlMzIoc2tiLCBJRkxBX1ZYTEFOX0xPQ0FMLAotCQkJCQkgdnhsYW4tPnNhZGRyLnNpbi5zaW5fYWRkci5zX2FkZHIpKQorCQkJaWYgKG5sYV9wdXRfaW5fYWRkcihza2IsIElGTEFfVlhMQU5fTE9DQUwsCisJCQkJCSAgICB2eGxhbi0+c2FkZHIuc2luLnNpbl9hZGRyLnNfYWRkcikpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJfSBlbHNlIHsKLQkJCWlmIChubGFfcHV0KHNrYiwgSUZMQV9WWExBTl9MT0NBTDYsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAotCQkJCSAgICAmdnhsYW4tPnNhZGRyLnNpbjYuc2luNl9hZGRyKSkKKwkJCWlmIChubGFfcHV0X2luNl9hZGRyKHNrYiwgSUZMQV9WWExBTl9MT0NBTDYsCisJCQkJCSAgICAgJnZ4bGFuLT5zYWRkci5zaW42LnNpbjZfYWRkcikpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAjZW5kaWYKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYyBiL2RyaXZlcnMvbmV0L3dhbi9jb3NhLmMKaW5kZXggODhkMTIxZC4uYmNmYTAxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2FuL2Nvc2EuYworKysgYi9kcml2ZXJzL25ldC93YW4vY29zYS5jCkBAIC01NzksNiArNTc5LDcgQEAKIAkJLyogUmVnaXN0ZXIgdGhlIG5ldHdvcmsgaW50ZXJmYWNlICovCiAJCWlmICghKGNoYW4tPm5ldGRldiA9IGFsbG9jX2hkbGNkZXYoY2hhbikpKSB7CiAJCQlwcl93YXJuKCIlczogYWxsb2NfaGRsY2RldiBmYWlsZWRcbiIsIGNoYW4tPm5hbWUpOworCQkJZXJyID0gLUVOT01FTTsKIAkJCWdvdG8gZXJyX2hkbGNkZXY7CiAJCX0KIAkJZGV2X3RvX2hkbGMoY2hhbi0+bmV0ZGV2KS0+YXR0YWNoID0gY29zYV9uZXRfYXR0YWNoOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvd2FuL2xtYy9sbWNfbWFpbi5jCmluZGV4IGJlYTBmMzEuLjMxN2JjNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9sbWMvbG1jX21haW4uYworKysgYi9kcml2ZXJzL25ldC93YW4vbG1jL2xtY19tYWluLmMKQEAgLTg1MCw2ICs4NTAsNyBAQAogCWRldiA9IGFsbG9jX2hkbGNkZXYoc2MpOwogCWlmICghZGV2KSB7CiAJCXByaW50ayhLRVJOX0VSUiAibG1jOmFsbG9jX25ldGRldiBmb3IgZGV2aWNlIGZhaWxlZFxuIik7CisJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2hkbGNkZXY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKaW5kZXggZTcxYTJjZS4uZDBjOTdjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYwpAQCAtMjY3Niw3ICsyNjc2LDcgQEAKIAlkZXYtPmFkZHJfbGVuICAgICAgICAgICA9IEVUSF9BTEVOOwogCWRldi0+dHhfcXVldWVfbGVuICAgICAgID0gMTAwOyAKIAotCW1lbXNldChkZXYtPmJyb2FkY2FzdCwweEZGLCBFVEhfQUxFTik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKGRldi0+YnJvYWRjYXN0KTsKIAogCWRldi0+ZmxhZ3MgICAgICAgICAgICAgID0gSUZGX0JST0FEQ0FTVHxJRkZfTVVMVElDQVNUOwogfQpAQCAtMzIxMSw3ICszMjExLDcgQEAKIAkJCWFpcm9fcHJpbnRfZGJnKGRldm5hbWUsICJsaW5rIGxvc3QgKFRTRiBzeW5jIGxvc3QpIik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCWFpcm9fcHJpbnRfZGJnKGRldm5hbWUsICJ1bmtub3cgc3RhdHVzICV4XG4iLCBzdGF0dXMpOworCQkJYWlyb19wcmludF9kYmcoZGV2bmFtZSwgInVua25vd24gc3RhdHVzICV4XG4iLCBzdGF0dXMpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC0zMjMzLDcgKzMyMzMsNyBAQAogCWNhc2UgU1RBVF9SRUFTU09DOgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlhaXJvX3ByaW50X2RiZyhkZXZuYW1lLCAidW5rbm93IHN0YXR1cyAleFxuIiwgc3RhdHVzKTsKKwkJYWlyb19wcmludF9kYmcoZGV2bmFtZSwgInVua25vd24gc3RhdHVzICV4XG4iLCBzdGF0dXMpOwogCQlicmVhazsKIAl9CiB9CkBAIC0zMjczLDcgKzMyNzMsNyBAQAogCQl9CiAKIAkJLyogU2VuZCBldmVudCB0byB1c2VyIHNwYWNlICovCi0JCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgJ1wwJywgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKHdycXUuYXBfYWRkci5zYV9kYXRhKTsKIAkJd3JxdS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAkJd2lyZWxlc3Nfc2VuZF9ldmVudChhaS0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdDc2YzUweC11c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5jCmluZGV4IGRhOTJiZmEuLjQ5MjE5YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0NzZjNTB4LXVzYi5jCkBAIC0xMTY2LDcgKzExNjYsNyBAQAogCWludCByZXQ7CiAKIAltZW1zZXQoJnNjYW4sIDAsIHNpemVvZihzdHJ1Y3QgYXQ3Nl9yZXFfc2NhbikpOwotCW1lbXNldChzY2FuLmJzc2lkLCAweGZmLCBFVEhfQUxFTik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKHNjYW4uYnNzaWQpOwogCiAJc2Nhbi5jaGFubmVsID0gcHJpdi0+Y2hhbm5lbDsKIAlzY2FuLnNjYW5fdHlwZSA9IFNDQU5fVFlQRV9QQVNTSVZFOwpAQCAtMTQyNyw3ICsxNDI3LDcgQEAKIAlhdDc2X3dhaXRfY29tcGxldGlvbihwcml2LCBDTURfU1RBUlRVUCk7CiAKIAkvKiByZW1vdmUgQlNTSUQgZnJvbSBwcmV2aW91cyBydW4gKi8KLQltZW1zZXQocHJpdi0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKHByaXYtPmJzc2lkKTsKIAogCXByaXYtPnNjYW5uaW5nID0gZmFsc2U7CiAKQEAgLTE5NzMsNyArMTk3Myw3IEBACiAJaWVlZTgwMjExX3N0b3BfcXVldWVzKGh3KTsKIAogCW1lbXNldCgmc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBhdDc2X3JlcV9zY2FuKSk7Ci0JbWVtc2V0KHNjYW4uYnNzaWQsIDB4RkYsIEVUSF9BTEVOKTsKKwlldGhfYnJvYWRjYXN0X2FkZHIoc2Nhbi5ic3NpZCk7CiAKIAlpZiAocmVxLT5uX3NzaWRzKSB7CiAJCXNjYW4uc2Nhbl90eXBlID0gU0NBTl9UWVBFX0FDVElWRTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjU1MjMvYXI1NTIzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI1NTIzL2FyNTUyMy5jCmluZGV4IGY5MjA1MDYuLjUxNDdlYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjU1MjMvYXI1NTIzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyNTUyMy9hcjU1MjMuYwpAQCAtNzc5LDggKzc3OSw2IEBACiAJCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhodyk7CiAJfQogCi0JZGF0YS0+c2tiID0gc2tiOwotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFyLT50eF9kYXRhX2xpc3RfbG9jaywgZmxhZ3MpOwogCWxpc3RfYWRkX3RhaWwoJmRhdGEtPmxpc3QsICZhci0+dHhfcXVldWVfcGVuZGluZyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXItPnR4X2RhdGFfbGlzdF9sb2NrLCBmbGFncyk7CkBAIC04MTcsMTAgKzgxNSwxMyBAQAogCQlpZiAoIWRhdGEpCiAJCQlicmVhazsKIAotCQlza2IgPSBkYXRhLT5za2I7CisJCXR4aSA9IGNvbnRhaW5lcl9vZigodm9pZCAqKWRhdGEsIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbywKKwkJCQkgICBkcml2ZXJfZGF0YSk7CiAJCXR4cWlkID0gMDsKLQkJdHhpID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCisJCXNrYiA9IGNvbnRhaW5lcl9vZigodm9pZCAqKXR4aSwgc3RydWN0IHNrX2J1ZmYsIGNiKTsKIAkJcGF5bGVuID0gc2tiLT5sZW47CisKIAkJdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCF1cmIpIHsKIAkJCWFyNTUyM19lcnIoYXIsICJGYWlsZWQgdG8gYWxsb2NhdGUgVFggdXJiXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjU1MjMvYXI1NTIzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXI1NTIzL2FyNTUyMy5oCmluZGV4IDAwYzZmZDMuLjlhMzIyYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hcjU1MjMvYXI1NTIzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2FyNTUyMy9hcjU1MjMuaApAQCAtNzQsNyArNzQsNiBAQAogc3RydWN0IGFyNTUyM190eF9kYXRhIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJc3RydWN0IGFyNTUyMwkJKmFyOwotCXN0cnVjdCBza19idWZmCQkqc2tiOwogCXN0cnVjdCB1cmIJCSp1cmI7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoLmgKaW5kZXggMWVlYmUyZS4uN2U5NDgxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGguaApAQCAtMTMxLDYgKzEzMSw5IEBACiAJdm9pZCAoKmVuYWJsZV93cml0ZV9idWZmZXIpKHZvaWQgKik7CiAJdm9pZCAoKndyaXRlX2ZsdXNoKSAodm9pZCAqKTsKIAl1MzIgKCpybXcpKHZvaWQgKiwgdTMyIHJlZ19vZmZzZXQsIHUzMiBzZXQsIHUzMiBjbHIpOworCXZvaWQgKCplbmFibGVfcm13X2J1ZmZlcikodm9pZCAqKTsKKwl2b2lkICgqcm13X2ZsdXNoKSAodm9pZCAqKTsKKwogfTsKIAogc3RydWN0IGF0aF9jb21tb247CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NlLmgKaW5kZXggYzE4NjQ3Yi4uMGVkZGIyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY2UuaApAQCAtMzksNyArMzksNyBAQAogI2RlZmluZSBDRV9ERVNDX0ZMQUdTX0dBVEhFUiAgICAgICAgICgxIDw8IDApCiAjZGVmaW5lIENFX0RFU0NfRkxBR1NfQllURV9TV0FQICAgICAgKDEgPDwgMSkKICNkZWZpbmUgQ0VfREVTQ19GTEFHU19NRVRBX0RBVEFfTUFTSyAweEZGRkMKLSNkZWZpbmUgQ0VfREVTQ19GTEFHU19NRVRBX0RBVEFfTFNCICAzCisjZGVmaW5lIENFX0RFU0NfRkxBR1NfTUVUQV9EQVRBX0xTQiAgMgogCiBzdHJ1Y3QgY2VfZGVzYyB7CiAJX19sZTMyIGFkZHI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY29yZS5jCmluZGV4IDMxMGUxMmIuLmMwZTQ1NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY29yZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvY29yZS5jCkBAIC00MzYsMTYgKzQzNiwxNiBAQAogCiBzdGF0aWMgdm9pZCBhdGgxMGtfY29yZV9mcmVlX2Zpcm13YXJlX2ZpbGVzKHN0cnVjdCBhdGgxMGsgKmFyKQogewotCWlmIChhci0+Ym9hcmQgJiYgIUlTX0VSUihhci0+Ym9hcmQpKQorCWlmICghSVNfRVJSKGFyLT5ib2FyZCkpCiAJCXJlbGVhc2VfZmlybXdhcmUoYXItPmJvYXJkKTsKIAotCWlmIChhci0+b3RwICYmICFJU19FUlIoYXItPm90cCkpCisJaWYgKCFJU19FUlIoYXItPm90cCkpCiAJCXJlbGVhc2VfZmlybXdhcmUoYXItPm90cCk7CiAKLQlpZiAoYXItPmZpcm13YXJlICYmICFJU19FUlIoYXItPmZpcm13YXJlKSkKKwlpZiAoIUlTX0VSUihhci0+ZmlybXdhcmUpKQogCQlyZWxlYXNlX2Zpcm13YXJlKGFyLT5maXJtd2FyZSk7CiAKLQlpZiAoYXItPmNhbF9maWxlICYmICFJU19FUlIoYXItPmNhbF9maWxlKSkKKwlpZiAoIUlTX0VSUihhci0+Y2FsX2ZpbGUpKQogCQlyZWxlYXNlX2Zpcm13YXJlKGFyLT5jYWxfZmlsZSk7CiAKIAlhci0+Ym9hcmQgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2NvcmUuaAppbmRleCBkNjBlNDZmLi5mNjUzMTBjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9jb3JlLmgKQEAgLTE1OSw2ICsxNTksMjUgQEAKIAl1MzIgcGVlcl9yeF9yYXRlOyAvKiAxMHggb25seSAqLwogfTsKIAorc3RydWN0IGF0aDEwa19md19zdGF0c192ZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwl1MzIgdmRldl9pZDsKKwl1MzIgYmVhY29uX3NucjsKKwl1MzIgZGF0YV9zbnI7CisJdTMyIG51bV90eF9mcmFtZXNbNF07CisJdTMyIG51bV9yeF9mcmFtZXM7CisJdTMyIG51bV90eF9mcmFtZXNfcmV0cmllc1s0XTsKKwl1MzIgbnVtX3R4X2ZyYW1lc19mYWlsdXJlc1s0XTsKKwl1MzIgbnVtX3J0c19mYWlsOworCXUzMiBudW1fcnRzX3N1Y2Nlc3M7CisJdTMyIG51bV9yeF9lcnI7CisJdTMyIG51bV9yeF9kaXNjYXJkOworCXUzMiBudW1fdHhfbm90X2Fja2VkOworCXUzMiB0eF9yYXRlX2hpc3RvcnlbMTBdOworCXUzMiBiZWFjb25fcnNzaV9oaXN0b3J5WzEwXTsKK307CisKIHN0cnVjdCBhdGgxMGtfZndfc3RhdHNfcGRldiB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCkBAIC0yMjAsNiArMjM5LDcgQEAKIAogc3RydWN0IGF0aDEwa19md19zdGF0cyB7CiAJc3RydWN0IGxpc3RfaGVhZCBwZGV2czsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZkZXZzOwogCXN0cnVjdCBsaXN0X2hlYWQgcGVlcnM7CiB9OwogCkBAIC0yODgsNiArMzA4LDcgQEAKIAlib29sIGlzX3N0YXJ0ZWQ7CiAJYm9vbCBpc191cDsKIAlib29sIHNwZWN0cmFsX2VuYWJsZWQ7CisJYm9vbCBwczsKIAl1MzIgYWlkOwogCXU4IGJzc2lkW0VUSF9BTEVOXTsKIApAQCAtNDEzLDYgKzQzNCwxMiBAQAogCSAqLwogCUFUSDEwS19GV19GRUFUVVJFX1dNSV8xMF8yID0gNCwKIAorCS8qIFNvbWUgZmlybXdhcmUgcmV2aXNpb25zIGxhY2sgcHJvcGVyIG11bHRpLWludGVyZmFjZSBjbGllbnQgcG93ZXJzYXZlCisJICogaW1wbGVtZW50YXRpb24uIEVuYWJsaW5nIFBTIGNvdWxkIHJlc3VsdCBpbiBjb25uZWN0aW9uIGRyb3BzLAorCSAqIHRyYWZmaWMgc3RhbGxzLCBldGMuCisJICovCisJQVRIMTBLX0ZXX0ZFQVRVUkVfTVVMVElfVklGX1BTX1NVUFBPUlQgPSA1LAorCiAJLyoga2VlcCBsYXN0ICovCiAJQVRIMTBLX0ZXX0ZFQVRVUkVfQ09VTlQsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9kZWJ1Zy5jCmluZGV4IGQyMjgxZTUuLjMwMTA4MWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvZGVidWcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2RlYnVnLmMKQEAgLTI0Myw2ICsyNDMsMTYgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGF0aDEwa19kZWJ1Z19md19zdGF0c192ZGV2c19mcmVlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGF0aDEwa19md19zdGF0c192ZGV2ICppLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGksIHRtcCwgaGVhZCwgbGlzdCkgeworCQlsaXN0X2RlbCgmaS0+bGlzdCk7CisJCWtmcmVlKGkpOworCX0KK30KKwogc3RhdGljIHZvaWQgYXRoMTBrX2RlYnVnX2Z3X3N0YXRzX3BlZXJzX2ZyZWUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKIAlzdHJ1Y3QgYXRoMTBrX2Z3X3N0YXRzX3BlZXIgKmksICp0bXA7CkBAIC0yNTgsNiArMjY4LDcgQEAKIAlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwogCWFyLT5kZWJ1Zy5md19zdGF0c19kb25lID0gZmFsc2U7CiAJYXRoMTBrX2RlYnVnX2Z3X3N0YXRzX3BkZXZzX2ZyZWUoJmFyLT5kZWJ1Zy5md19zdGF0cy5wZGV2cyk7CisJYXRoMTBrX2RlYnVnX2Z3X3N0YXRzX3ZkZXZzX2ZyZWUoJmFyLT5kZWJ1Zy5md19zdGF0cy52ZGV2cyk7CiAJYXRoMTBrX2RlYnVnX2Z3X3N0YXRzX3BlZXJzX2ZyZWUoJmFyLT5kZWJ1Zy5md19zdGF0cy5wZWVycyk7CiAJc3Bpbl91bmxvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwogfQpAQCAtMjczLDE0ICsyODQsMjcgQEAKIAlyZXR1cm4gbnVtOwogfQogCitzdGF0aWMgc2l6ZV90IGF0aDEwa19kZWJ1Z19md19zdGF0c19udW1fdmRldnMoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgYXRoMTBrX2Z3X3N0YXRzX3ZkZXYgKmk7CisJc2l6ZV90IG51bSA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksIGhlYWQsIGxpc3QpCisJCSsrbnVtOworCisJcmV0dXJuIG51bTsKK30KKwogdm9pZCBhdGgxMGtfZGVidWdfZndfc3RhdHNfcHJvY2VzcyhzdHJ1Y3QgYXRoMTBrICphciwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgYXRoMTBrX2Z3X3N0YXRzIHN0YXRzID0ge307CiAJYm9vbCBpc19zdGFydCwgaXNfc3RhcnRlZCwgaXNfZW5kOwogCXNpemVfdCBudW1fcGVlcnM7CisJc2l6ZV90IG51bV92ZGV2czsKIAlpbnQgcmV0OwogCiAJSU5JVF9MSVNUX0hFQUQoJnN0YXRzLnBkZXZzKTsKKwlJTklUX0xJU1RfSEVBRCgmc3RhdHMudmRldnMpOwogCUlOSVRfTElTVF9IRUFEKCZzdGF0cy5wZWVycyk7CiAKIAlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOwpAQCAtMzA4LDYgKzMzMiw3IEBACiAJfQogCiAJbnVtX3BlZXJzID0gYXRoMTBrX2RlYnVnX2Z3X3N0YXRzX251bV9wZWVycygmYXItPmRlYnVnLmZ3X3N0YXRzLnBlZXJzKTsKKwludW1fdmRldnMgPSBhdGgxMGtfZGVidWdfZndfc3RhdHNfbnVtX3ZkZXZzKCZhci0+ZGVidWcuZndfc3RhdHMudmRldnMpOwogCWlzX3N0YXJ0ID0gKGxpc3RfZW1wdHkoJmFyLT5kZWJ1Zy5md19zdGF0cy5wZGV2cykgJiYKIAkJICAgICFsaXN0X2VtcHR5KCZzdGF0cy5wZGV2cykpOwogCWlzX2VuZCA9ICghbGlzdF9lbXB0eSgmYXItPmRlYnVnLmZ3X3N0YXRzLnBkZXZzKSAmJgpAQCAtMzMwLDcgKzM1NSwxMyBAQAogCQkJZ290byBmcmVlOwogCQl9CiAKKwkJaWYgKG51bV92ZGV2cyA+PSBCSVRTX1BFUl9MT05HKSB7CisJCQlhdGgxMGtfd2FybihhciwgImRyb3BwaW5nIGZ3IHZkZXYgc3RhdHNcbiIpOworCQkJZ290byBmcmVlOworCQl9CisKIAkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZzdGF0cy5wZWVycywgJmFyLT5kZWJ1Zy5md19zdGF0cy5wZWVycyk7CisJCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmc3RhdHMudmRldnMsICZhci0+ZGVidWcuZndfc3RhdHMudmRldnMpOwogCX0KIAogCWNvbXBsZXRlKCZhci0+ZGVidWcuZndfc3RhdHNfY29tcGxldGUpOwpAQCAtMzQwLDYgKzM3MSw3IEBACiAJICogcmVzb3VyY2VzIGlmIHRoYXQgaXMgbm90IHRoZSBjYXNlLgogCSAqLwogCWF0aDEwa19kZWJ1Z19md19zdGF0c19wZGV2c19mcmVlKCZzdGF0cy5wZGV2cyk7CisJYXRoMTBrX2RlYnVnX2Z3X3N0YXRzX3ZkZXZzX2ZyZWUoJnN0YXRzLnZkZXZzKTsKIAlhdGgxMGtfZGVidWdfZndfc3RhdHNfcGVlcnNfZnJlZSgmc3RhdHMucGVlcnMpOwogCiB1bmxvY2s6CkBAIC0zNjMsNyArMzk1LDEwIEBACiAKIAkJcmVpbml0X2NvbXBsZXRpb24oJmFyLT5kZWJ1Zy5md19zdGF0c19jb21wbGV0ZSk7CiAKLQkJcmV0ID0gYXRoMTBrX3dtaV9yZXF1ZXN0X3N0YXRzKGFyLCBXTUlfUkVRVUVTVF9QRUVSX1NUQVQpOworCQlyZXQgPSBhdGgxMGtfd21pX3JlcXVlc3Rfc3RhdHMoYXIsCisJCQkJCSAgICAgICBXTUlfU1RBVF9QREVWIHwKKwkJCQkJICAgICAgIFdNSV9TVEFUX1ZERVYgfAorCQkJCQkgICAgICAgV01JX1NUQVRfUEVFUik7CiAJCWlmIChyZXQpIHsKIAkJCWF0aDEwa193YXJuKGFyLCAiY291bGQgbm90IHJlcXVlc3Qgc3RhdHMgKCVkKVxuIiwgcmV0KTsKIAkJCXJldHVybiByZXQ7CkBAIC0zOTUsOCArNDMwLDExIEBACiAJdW5zaWduZWQgaW50IGxlbiA9IDA7CiAJdW5zaWduZWQgaW50IGJ1Zl9sZW4gPSBBVEgxMEtfRldfU1RBVFNfQlVGX1NJWkU7CiAJY29uc3Qgc3RydWN0IGF0aDEwa19md19zdGF0c19wZGV2ICpwZGV2OworCWNvbnN0IHN0cnVjdCBhdGgxMGtfZndfc3RhdHNfdmRldiAqdmRldjsKIAljb25zdCBzdHJ1Y3QgYXRoMTBrX2Z3X3N0YXRzX3BlZXIgKnBlZXI7CiAJc2l6ZV90IG51bV9wZWVyczsKKwlzaXplX3QgbnVtX3ZkZXZzOworCWludCBpOwogCiAJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKIApAQCAtNDA4LDYgKzQ0Niw3IEBACiAJfQogCiAJbnVtX3BlZXJzID0gYXRoMTBrX2RlYnVnX2Z3X3N0YXRzX251bV9wZWVycygmZndfc3RhdHMtPnBlZXJzKTsKKwludW1fdmRldnMgPSBhdGgxMGtfZGVidWdfZndfc3RhdHNfbnVtX3ZkZXZzKCZmd19zdGF0cy0+dmRldnMpOwogCiAJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICJcbiIpOwogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTMwc1xuIiwKQEAgLTUzMSw2ICs1NzAsNjUgQEAKIAogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiXG4iKTsKIAlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUzMHMgKCV6dSlcbiIsCisJCQkgImF0aDEwayBWREVWIHN0YXRzIiwgbnVtX3ZkZXZzKTsKKwlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUzMHNcblxuIiwKKwkJCQkgIj09PT09PT09PT09PT09PT09Iik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkZXYsICZmd19zdGF0cy0+dmRldnMsIGxpc3QpIHsKKwkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIlMzBzICV1XG4iLAorCQkJCSAidmRldiBpZCIsIHZkZXYtPnZkZXZfaWQpOworCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUzMHMgJXVcbiIsCisJCQkJICJiZWFjb24gc25yIiwgdmRldi0+YmVhY29uX3Nucik7CisJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTMwcyAldVxuIiwKKwkJCQkgImRhdGEgc25yIiwgdmRldi0+ZGF0YV9zbnIpOworCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUzMHMgJXVcbiIsCisJCQkJICJudW0gcnggZnJhbWVzIiwgdmRldi0+bnVtX3J4X2ZyYW1lcyk7CisJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTMwcyAldVxuIiwKKwkJCQkgIm51bSBydHMgZmFpbCIsIHZkZXYtPm51bV9ydHNfZmFpbCk7CisJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTMwcyAldVxuIiwKKwkJCQkgIm51bSBydHMgc3VjY2VzcyIsIHZkZXYtPm51bV9ydHNfc3VjY2Vzcyk7CisJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTMwcyAldVxuIiwKKwkJCQkgIm51bSByeCBlcnIiLCB2ZGV2LT5udW1fcnhfZXJyKTsKKwkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIlMzBzICV1XG4iLAorCQkJCSAibnVtIHJ4IGRpc2NhcmQiLCB2ZGV2LT5udW1fcnhfZGlzY2FyZCk7CisJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTMwcyAldVxuIiwKKwkJCQkgIm51bSB0eCBub3QgYWNrZWQiLCB2ZGV2LT5udW1fdHhfbm90X2Fja2VkKTsKKworCQlmb3IgKGkgPSAwIDsgaSA8IEFSUkFZX1NJWkUodmRldi0+bnVtX3R4X2ZyYW1lcyk7IGkrKykKKwkJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLAorCQkJCQkiJTI1cyBbJTAyZF0gJXVcbiIsCisJCQkJCSAibnVtIHR4IGZyYW1lcyIsIGksCisJCQkJCSB2ZGV2LT5udW1fdHhfZnJhbWVzW2ldKTsKKworCQlmb3IgKGkgPSAwIDsgaSA8IEFSUkFZX1NJWkUodmRldi0+bnVtX3R4X2ZyYW1lc19yZXRyaWVzKTsgaSsrKQorCQkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sCisJCQkJCSIlMjVzIFslMDJkXSAldVxuIiwKKwkJCQkJICJudW0gdHggZnJhbWVzIHJldHJpZXMiLCBpLAorCQkJCQkgdmRldi0+bnVtX3R4X2ZyYW1lc19yZXRyaWVzW2ldKTsKKworCQlmb3IgKGkgPSAwIDsgaSA8IEFSUkFZX1NJWkUodmRldi0+bnVtX3R4X2ZyYW1lc19mYWlsdXJlcyk7IGkrKykKKwkJCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLAorCQkJCQkiJTI1cyBbJTAyZF0gJXVcbiIsCisJCQkJCSAibnVtIHR4IGZyYW1lcyBmYWlsdXJlcyIsIGksCisJCQkJCSB2ZGV2LT5udW1fdHhfZnJhbWVzX2ZhaWx1cmVzW2ldKTsKKworCQlmb3IgKGkgPSAwIDsgaSA8IEFSUkFZX1NJWkUodmRldi0+dHhfcmF0ZV9oaXN0b3J5KTsgaSsrKQorCQkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sCisJCQkJCSIlMjVzIFslMDJkXSAweCUwOHhcbiIsCisJCQkJCSAidHggcmF0ZSBoaXN0b3J5IiwgaSwKKwkJCQkJIHZkZXYtPnR4X3JhdGVfaGlzdG9yeVtpXSk7CisKKwkJZm9yIChpID0gMCA7IGkgPCBBUlJBWV9TSVpFKHZkZXYtPmJlYWNvbl9yc3NpX2hpc3RvcnkpOyBpKyspCisJCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwKKwkJCQkJIiUyNXMgWyUwMmRdICV1XG4iLAorCQkJCQkgImJlYWNvbiByc3NpIGhpc3RvcnkiLCBpLAorCQkJCQkgdmRldi0+YmVhY29uX3Jzc2lfaGlzdG9yeVtpXSk7CisKKwkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICJcbiIpOworCX0KKworCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiXG4iKTsKKwlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUzMHMgKCV6dSlcbiIsCiAJCQkgImF0aDEwayBQRUVSIHN0YXRzIiwgbnVtX3BlZXJzKTsKIAlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUzMHNcblxuIiwKIAkJCQkgIj09PT09PT09PT09PT09PT09Iik7CkBAIC0xOTAwLDYgKzE5OTgsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCUlOSVRfTElTVF9IRUFEKCZhci0+ZGVidWcuZndfc3RhdHMucGRldnMpOworCUlOSVRfTElTVF9IRUFEKCZhci0+ZGVidWcuZndfc3RhdHMudmRldnMpOwogCUlOSVRfTElTVF9IRUFEKCZhci0+ZGVidWcuZndfc3RhdHMucGVlcnMpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9odHRfcnguYwppbmRleCBjMWRhNDRmLi4wMWEyYjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL2h0dF9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvaHR0X3J4LmMKQEAgLTE3Niw3ICsxNzYsNyBAQAogCSAqIGF1dG9tYXRpY2FsbHkgYmFsYW5jZXMgbG9hZCB3cnQgdG8gQ1BVIHBvd2VyLgogCSAqCiAJICogVGhpcyBwcm9iYWJseSBjb21lcyBhdCBhIGNvc3Qgb2YgbG93ZXIgbWF4aW11bSB0aHJvdWdocHV0IGJ1dAotCSAqIGltcHJvdmVzIHRoZSBhdmFyYWdlIGFuZCBzdGFiaWxpdHkuICovCisJICogaW1wcm92ZXMgdGhlIGF2ZXJhZ2UgYW5kIHN0YWJpbGl0eS4gKi8KIAlzcGluX2xvY2tfYmgoJmh0dC0+cnhfcmluZy5sb2NrKTsKIAludW1fZGVmaWNpdCA9IGh0dC0+cnhfcmluZy5maWxsX2xldmVsIC0gaHR0LT5yeF9yaW5nLmZpbGxfY250OwogCW51bV90b19maWxsID0gbWluKEFUSDEwS19IVFRfTUFYX05VTV9SRUZJTEwsIG51bV9kZWZpY2l0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL21hYy5jCmluZGV4IGQ2ZDJmMGYuLjk3MzQ4NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9tYWMuYwpAQCAtNjExLDcgKzYxMSw3IEBACiAKIAlyZXQgPSBhdGgxMGtfdmRldl9zZXR1cF9zeW5jKGFyKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIHN5bmNocm9uaXplIHNldHVwIGZvciBtb25pdG9yIHZkZXYgJWk6ICVkXG4iLAorCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byBzeW5jaHJvbml6ZSBzZXR1cCBmb3IgbW9uaXRvciB2ZGV2ICVpIHN0YXJ0OiAlZFxuIiwKIAkJCSAgICB2ZGV2X2lkLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTY1OCw3ICs2NTgsNyBAQAogCiAJcmV0ID0gYXRoMTBrX3ZkZXZfc2V0dXBfc3luYyhhcik7CiAJaWYgKHJldCkKLQkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gc3luY2hyb25pc2UgbW9uaXRvciB2ZGV2ICVpOiAlZFxuIiwKKwkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gc3luY2hyb25pemUgbW9uaXRvciB2ZGV2ICVpIHN0b3A6ICVkXG4iLAogCQkJICAgIGFyLT5tb25pdG9yX3ZkZXZfaWQsIHJldCk7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX01BQywgIm1hYyBtb25pdG9yIHZkZXYgJWkgc3RvcHBlZFxuIiwKQEAgLTkyNyw4ICs5MjcsOSBAQAogCiAJcmV0ID0gYXRoMTBrX3ZkZXZfc2V0dXBfc3luYyhhcik7CiAJaWYgKHJldCkgewotCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byBzeW5jaHJvbmlzZSBzZXR1cCBmb3IgdmRldiAlaTogJWRcbiIsCi0JCQkgICAgYXJnLnZkZXZfaWQsIHJldCk7CisJCWF0aDEwa193YXJuKGFyLAorCQkJICAgICJmYWlsZWQgdG8gc3luY2hyb25pemUgc2V0dXAgZm9yIHZkZXYgJWkgcmVzdGFydCAlZDogJWRcbiIsCisJCQkgICAgYXJnLnZkZXZfaWQsIHJlc3RhcnQsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC05NjYsNyArOTY3LDcgQEAKIAogCXJldCA9IGF0aDEwa192ZGV2X3NldHVwX3N5bmMoYXIpOwogCWlmIChyZXQpIHsKLQkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gc3luY3JvbmlzZSBzZXR1cCBmb3IgdmRldiAlaTogJWRcbiIsCisJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIHN5bmNocm9uaXplIHNldHVwIGZvciB2ZGV2ICVpIHN0b3A6ICVkXG4iLAogCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTExODIsNyArMTE4Myw3IEBACiAJCWlmIChpc196ZXJvX2V0aGVyX2FkZHIoYXJ2aWYtPmJzc2lkKSkKIAkJCXJldHVybjsKIAotCQltZW1zZXQoYXJ2aWYtPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIoYXJ2aWYtPmJzc2lkKTsKIAogCQlyZXR1cm47CiAJfQpAQCAtMTI1Myw2ICsxMjU0LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYXRoMTBrX21hY19wc192aWZfY291bnQoc3RydWN0IGF0aDEwayAqYXIpCit7CisJc3RydWN0IGF0aDEwa192aWYgKmFydmlmOworCWludCBudW0gPSAwOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmNvbmZfbXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShhcnZpZiwgJmFyLT5hcnZpZnMsIGxpc3QpCisJCWlmIChhcnZpZi0+cHMpCisJCQludW0rKzsKKworCXJldHVybiBudW07Cit9CisKIHN0YXRpYyBpbnQgYXRoMTBrX21hY192aWZfc2V0dXBfcHMoc3RydWN0IGF0aDEwa192aWYgKmFydmlmKQogewogCXN0cnVjdCBhdGgxMGsgKmFyID0gYXJ2aWYtPmFyOwpAQCAtMTI2MiwxMyArMTI3NywyNCBAQAogCWVudW0gd21pX3N0YV9wc19tb2RlIHBzbW9kZTsKIAlpbnQgcmV0OwogCWludCBwc190aW1lb3V0OworCWJvb2wgZW5hYmxlX3BzOwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXJ2aWYtPmFyLT5jb25mX211dGV4KTsKIAogCWlmIChhcnZpZi0+dmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCXJldHVybiAwOwogCi0JaWYgKHZpZi0+YnNzX2NvbmYucHMpIHsKKwllbmFibGVfcHMgPSBhcnZpZi0+cHM7CisKKwlpZiAoZW5hYmxlX3BzICYmIGF0aDEwa19tYWNfcHNfdmlmX2NvdW50KGFyKSA+IDEgJiYKKwkgICAgIXRlc3RfYml0KEFUSDEwS19GV19GRUFUVVJFX01VTFRJX1ZJRl9QU19TVVBQT1JULAorCQkgICAgICBhci0+ZndfZmVhdHVyZXMpKSB7CisJCWF0aDEwa193YXJuKGFyLCAicmVmdXNpbmcgdG8gZW5hYmxlIHBzIG9uIHZkZXYgJWk6IG5vdCBzdXBwb3J0ZWQgYnkgZndcbiIsCisJCQkgICAgYXJ2aWYtPnZkZXZfaWQpOworCQllbmFibGVfcHMgPSBmYWxzZTsKKwl9CisKKwlpZiAoZW5hYmxlX3BzKSB7CiAJCXBzbW9kZSA9IFdNSV9TVEFfUFNfTU9ERV9FTkFCTEVEOwogCQlwYXJhbSA9IFdNSV9TVEFfUFNfUEFSQU1fSU5BQ1RJVklUWV9USU1FOwogCkBAIC0xMzg2LDcgKzE0MTIsOCBAQAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5jb25mX211dGV4KTsKIAogCWJzcyA9IGNmZzgwMjExX2dldF9ic3MoYXItPmh3LT53aXBoeSwgYXItPmh3LT5jb25mLmNoYW5kZWYuY2hhbiwKLQkJCSAgICAgICBpbmZvLT5ic3NpZCwgTlVMTCwgMCwgMCwgMCk7CisJCQkgICAgICAgaW5mby0+YnNzaWQsIE5VTEwsIDAsIElFRUU4MDIxMV9CU1NfVFlQRV9BTlksCisJCQkgICAgICAgSUVFRTgwMjExX1BSSVZBQ1lfQU5ZKTsKIAlpZiAoYnNzKSB7CiAJCWNvbnN0IHN0cnVjdCBjZmc4MDIxMV9ic3NfaWVzICppZXM7CiAKQEAgLTE3ODEsNiArMTgwOCw2OCBAQAogCQkJCQkgYXRoMTBrX3NtcHNfbWFwW3NtcHNdKTsKIH0KIAorc3RhdGljIGludCBhdGgxMGtfbWFjX3ZpZl9yZWNhbGNfdHhiZihzdHJ1Y3QgYXRoMTBrICphciwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX3ZodF9jYXAgdmh0X2NhcCkKK3sKKwlzdHJ1Y3QgYXRoMTBrX3ZpZiAqYXJ2aWYgPSBhdGgxMGtfdmlmX3RvX2FydmlmKHZpZik7CisJaW50IHJldDsKKwl1MzIgcGFyYW07CisJdTMyIHZhbHVlOworCisJaWYgKCEoYXItPnZodF9jYXBfaW5mbyAmCisJICAgICAgKElFRUU4MDIxMV9WSFRfQ0FQX1NVX0JFQU1GT1JNRUVfQ0FQQUJMRSB8CisJICAgICAgIElFRUU4MDIxMV9WSFRfQ0FQX01VX0JFQU1GT1JNRUVfQ0FQQUJMRSB8CisJICAgICAgIElFRUU4MDIxMV9WSFRfQ0FQX1NVX0JFQU1GT1JNRVJfQ0FQQUJMRSB8CisJICAgICAgIElFRUU4MDIxMV9WSFRfQ0FQX01VX0JFQU1GT1JNRVJfQ0FQQUJMRSkpKQorCQlyZXR1cm4gMDsKKworCXBhcmFtID0gYXItPndtaS52ZGV2X3BhcmFtLT50eGJmOworCXZhbHVlID0gMDsKKworCWlmIChXQVJOX09OKHBhcmFtID09IFdNSV9WREVWX1BBUkFNX1VOU1VQUE9SVEVEKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBUaGUgZm9sbG93aW5nIGxvZ2ljIGlzIGNvcnJlY3QuIElmIGEgcmVtb3RlIFNUQSBhZHZlcnRpc2VzIHN1cHBvcnQKKwkgKiBmb3IgYmVpbmcgYSBiZWFtZm9ybWVyIHRoZW4gd2Ugc2hvdWxkIGVuYWJsZSB1cyBiZWluZyBhIGJlYW1mb3JtZWUuCisJICovCisKKwlpZiAoYXItPnZodF9jYXBfaW5mbyAmCisJICAgIChJRUVFODAyMTFfVkhUX0NBUF9TVV9CRUFNRk9STUVFX0NBUEFCTEUgfAorCSAgICAgSUVFRTgwMjExX1ZIVF9DQVBfTVVfQkVBTUZPUk1FRV9DQVBBQkxFKSkgeworCQlpZiAodmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfVkhUX0NBUF9TVV9CRUFNRk9STUVSX0NBUEFCTEUpCisJCQl2YWx1ZSB8PSBXTUlfVkRFVl9QQVJBTV9UWEJGX1NVX1RYX0JGRUU7CisKKwkJaWYgKHZodF9jYXAuY2FwICYgSUVFRTgwMjExX1ZIVF9DQVBfTVVfQkVBTUZPUk1FUl9DQVBBQkxFKQorCQkJdmFsdWUgfD0gV01JX1ZERVZfUEFSQU1fVFhCRl9NVV9UWF9CRkVFOworCX0KKworCWlmIChhci0+dmh0X2NhcF9pbmZvICYKKwkgICAgKElFRUU4MDIxMV9WSFRfQ0FQX1NVX0JFQU1GT1JNRVJfQ0FQQUJMRSB8CisJICAgICBJRUVFODAyMTFfVkhUX0NBUF9NVV9CRUFNRk9STUVSX0NBUEFCTEUpKSB7CisJCWlmICh2aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9WSFRfQ0FQX1NVX0JFQU1GT1JNRUVfQ0FQQUJMRSkKKwkJCXZhbHVlIHw9IFdNSV9WREVWX1BBUkFNX1RYQkZfU1VfVFhfQkZFUjsKKworCQlpZiAodmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfVkhUX0NBUF9NVV9CRUFNRk9STUVFX0NBUEFCTEUpCisJCQl2YWx1ZSB8PSBXTUlfVkRFVl9QQVJBTV9UWEJGX01VX1RYX0JGRVI7CisJfQorCisJaWYgKHZhbHVlICYgV01JX1ZERVZfUEFSQU1fVFhCRl9NVV9UWF9CRkVFKQorCQl2YWx1ZSB8PSBXTUlfVkRFVl9QQVJBTV9UWEJGX1NVX1RYX0JGRUU7CisKKwlpZiAodmFsdWUgJiBXTUlfVkRFVl9QQVJBTV9UWEJGX01VX1RYX0JGRVIpCisJCXZhbHVlIHw9IFdNSV9WREVWX1BBUkFNX1RYQkZfU1VfVFhfQkZFUjsKKworCXJldCA9IGF0aDEwa193bWlfdmRldl9zZXRfcGFyYW0oYXIsIGFydmlmLT52ZGV2X2lkLCBwYXJhbSwgdmFsdWUpOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gc3VibWl0IHZkZXYgcGFyYW0gdHhiZiAweCV4OiAlZFxuIiwKKwkJCSAgICB2YWx1ZSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyogY2FuIGJlIGNhbGxlZCBvbmx5IGluIG1hYzgwMjExIGNhbGxiYWNrcyBkdWUgdG8gYGtleV9jb3VudGAgdXNhZ2UgKi8KIHN0YXRpYyB2b2lkIGF0aDEwa19ic3NfYXNzb2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCkBAIC0xNzg5LDYgKzE4NzgsNyBAQAogCXN0cnVjdCBhdGgxMGsgKmFyID0gaHctPnByaXY7CiAJc3RydWN0IGF0aDEwa192aWYgKmFydmlmID0gYXRoMTBrX3ZpZl90b19hcnZpZih2aWYpOwogCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCBodF9jYXA7CisJc3RydWN0IGllZWU4MDIxMV9zdGFfdmh0X2NhcCB2aHRfY2FwOwogCXN0cnVjdCB3bWlfcGVlcl9hc3NvY19jb21wbGV0ZV9hcmcgcGVlcl9hcmc7CiAJc3RydWN0IGllZWU4MDIxMV9zdGEgKmFwX3N0YTsKIAlpbnQgcmV0OwpAQCAtMTgxMSw2ICsxOTAxLDcgQEAKIAkvKiBhcF9zdGEgbXVzdCBiZSBhY2Nlc3NlZCBvbmx5IHdpdGhpbiByY3Ugc2VjdGlvbiB3aGljaCBtdXN0IGJlIGxlZnQKIAkgKiBiZWZvcmUgY2FsbGluZyBhdGgxMGtfc2V0dXBfcGVlcl9zbXBzKCkgd2hpY2ggbWlnaHQgc2xlZXAuICovCiAJaHRfY2FwID0gYXBfc3RhLT5odF9jYXA7CisJdmh0X2NhcCA9IGFwX3N0YS0+dmh0X2NhcDsKIAogCXJldCA9IGF0aDEwa19wZWVyX2Fzc29jX3ByZXBhcmUoYXIsIHZpZiwgYXBfc3RhLCAmcGVlcl9hcmcpOwogCWlmIChyZXQpIHsKQEAgLTE4MzYsNiArMTkyNywxMyBAQAogCQlyZXR1cm47CiAJfQogCisJcmV0ID0gYXRoMTBrX21hY192aWZfcmVjYWxjX3R4YmYoYXIsIHZpZiwgdmh0X2NhcCk7CisJaWYgKHJldCkgeworCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byByZWNhbGMgdHhiZiBmb3IgdmRldiAlaSBvbiBic3MgJXBNOiAlZFxuIiwKKwkJCSAgICBhcnZpZi0+dmRldl9pZCwgYnNzX2NvbmYtPmJzc2lkLCByZXQpOworCQlyZXR1cm47CisJfQorCiAJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19NQUMsCiAJCSAgICJtYWMgdmRldiAlZCB1cCAoYXNzb2NpYXRlZCkgYnNzaWQgJXBNIGFpZCAlZFxuIiwKIAkJICAgYXJ2aWYtPnZkZXZfaWQsIGJzc19jb25mLT5ic3NpZCwgYnNzX2NvbmYtPmFpZCk7CkBAIC0xODUzLDYgKzE5NTEsMTggQEAKIAl9CiAKIAlhcnZpZi0+aXNfdXAgPSB0cnVlOworCisJLyogV29ya2Fyb3VuZDogU29tZSBmaXJtd2FyZSByZXZpc2lvbnMgKHRlc3RlZCB3aXRoIHFjYTYxNzQKKwkgKiBXTEFOLlJNLjIuMC0wMDA3MykgaGF2ZSBidWdneSBwb3dlcnNhdmUgc3RhdGUgbWFjaGluZSBhbmQgbXVzdCBiZQorCSAqIHBva2VkIHdpdGggcGVlciBwYXJhbSBjb21tYW5kLgorCSAqLworCXJldCA9IGF0aDEwa193bWlfcGVlcl9zZXRfcGFyYW0oYXIsIGFydmlmLT52ZGV2X2lkLCBhcnZpZi0+YnNzaWQsCisJCQkJCVdNSV9QRUVSX0RVTU1ZX1ZBUiwgMSk7CisJaWYgKHJldCkgeworCQlhdGgxMGtfd2FybihhciwgImZhaWxlZCB0byBwb2tlIHBlZXIgJXBNIHBhcmFtIGZvciBwcyB3b3JrYXJvdW5kIG9uIHZkZXYgJWk6ICVkXG4iLAorCQkJICAgIGFydmlmLT5ic3NpZCwgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisJCXJldHVybjsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDEwa19ic3NfZGlzYXNzb2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0xODYwLDYgKzE5NzAsNyBAQAogewogCXN0cnVjdCBhdGgxMGsgKmFyID0gaHctPnByaXY7CiAJc3RydWN0IGF0aDEwa192aWYgKmFydmlmID0gYXRoMTBrX3ZpZl90b19hcnZpZih2aWYpOworCXN0cnVjdCBpZWVlODAyMTFfc3RhX3ZodF9jYXAgdmh0X2NhcCA9IHt9OwogCWludCByZXQ7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZhci0+Y29uZl9tdXRleCk7CkBAIC0xODc0LDYgKzE5ODUsMTMgQEAKIAogCWFydmlmLT5kZWZfd2VwX2tleV9pZHggPSAtMTsKIAorCXJldCA9IGF0aDEwa19tYWNfdmlmX3JlY2FsY190eGJmKGFyLCB2aWYsIHZodF9jYXApOworCWlmIChyZXQpIHsKKwkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gcmVjYWxjIHR4YmYgZm9yIHZkZXYgJWk6ICVkXG4iLAorCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOworCQlyZXR1cm47CisJfQorCiAJYXJ2aWYtPmlzX3VwID0gZmFsc2U7CiB9CiAKQEAgLTI1NTQsNiArMjY3MiwxNyBAQAogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CiAKKwkvKiBJZiB3ZSBmYWlsZWQgdG8gc3RhcnQgdGhlIHNjYW4sIHJldHVybiBlcnJvciBjb2RlIGF0CisJICogdGhpcyBwb2ludC4gIFRoaXMgaXMgcHJvYmFibHkgZHVlIHRvIHNvbWUgaXNzdWUgaW4gdGhlCisJICogZmlybXdhcmUsIGJ1dCBubyBuZWVkIHRvIHdlZGdlIHRoZSBkcml2ZXIgZHVlIHRvIHRoYXQuLi4KKwkgKi8KKwlzcGluX2xvY2tfYmgoJmFyLT5kYXRhX2xvY2spOworCWlmIChhci0+c2Nhbi5zdGF0ZSA9PSBBVEgxMEtfU0NBTl9JRExFKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKKwogCS8qIEFkZCBhIDIwMG1zIG1hcmdpbiB0byBhY2NvdW50IGZvciBldmVudC9jb21tYW5kIHByb2Nlc3NpbmcgKi8KIAlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKGFyLT5odywgJmFyLT5zY2FuLnRpbWVvdXQsCiAJCQkJICAgICBtc2Vjc190b19qaWZmaWVzKGFyZy0+bWF4X3NjYW5fdGltZSsyMDApKTsKQEAgLTMzMjMsOSArMzQ1MiwxMCBAQAogCWxpc3RfZGVsKCZhcnZpZi0+bGlzdCk7CiAKIAlpZiAoYXJ2aWYtPnZkZXZfdHlwZSA9PSBXTUlfVkRFVl9UWVBFX0FQKSB7Ci0JCXJldCA9IGF0aDEwa19wZWVyX2RlbGV0ZShhcnZpZi0+YXIsIGFydmlmLT52ZGV2X2lkLCB2aWYtPmFkZHIpOworCQlyZXQgPSBhdGgxMGtfd21pX3BlZXJfZGVsZXRlKGFydmlmLT5hciwgYXJ2aWYtPnZkZXZfaWQsCisJCQkJCSAgICAgdmlmLT5hZGRyKTsKIAkJaWYgKHJldCkKLQkJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIHJlbW92ZSBwZWVyIGZvciBBUCB2ZGV2ICVpOiAlZFxuIiwKKwkJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIHN1Ym1pdCBBUCBzZWxmLXBlZXIgcmVtb3ZhbCBvbiB2ZGV2ICVpOiAlZFxuIiwKIAkJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAKIAkJa2ZyZWUoYXJ2aWYtPnUuYXAubm9hX2RhdGEpOwpAQCAtMzMzOSw2ICszNDY5LDIxIEBACiAJCWF0aDEwa193YXJuKGFyLCAiZmFpbGVkIHRvIGRlbGV0ZSBXTUkgdmRldiAlaTogJWRcbiIsCiAJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CiAKKwkvKiBTb21lIGZpcm13YXJlIHJldmlzaW9ucyBkb24ndCBub3RpZnkgaG9zdCBhYm91dCBzZWxmLXBlZXIgcmVtb3ZhbAorCSAqIHVudGlsIGFmdGVyIGFzc29jaWF0ZWQgdmRldiBpcyBkZWxldGVkLgorCSAqLworCWlmIChhcnZpZi0+dmRldl90eXBlID09IFdNSV9WREVWX1RZUEVfQVApIHsKKwkJcmV0ID0gYXRoMTBrX3dhaXRfZm9yX3BlZXJfZGVsZXRlZChhciwgYXJ2aWYtPnZkZXZfaWQsCisJCQkJCQkgICB2aWYtPmFkZHIpOworCQlpZiAocmV0KQorCQkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gcmVtb3ZlIEFQIHNlbGYtcGVlciBvbiB2ZGV2ICVpOiAlZFxuIiwKKwkJCQkgICAgYXJ2aWYtPnZkZXZfaWQsIHJldCk7CisKKwkJc3Bpbl9sb2NrX2JoKCZhci0+ZGF0YV9sb2NrKTsKKwkJYXItPm51bV9wZWVycy0tOworCQlzcGluX3VubG9ja19iaCgmYXItPmRhdGFfbG9jayk7CisJfQorCiAJYXRoMTBrX3BlZXJfY2xlYW51cChhciwgYXJ2aWYtPnZkZXZfaWQpOwogCiAJbXV0ZXhfdW5sb2NrKCZhci0+Y29uZl9tdXRleCk7CkBAIC0zNTM0LDcgKzM2NzksOSBAQAogCX0KIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfUFMpIHsKLQkJcmV0ID0gYXRoMTBrX21hY192aWZfc2V0dXBfcHMoYXJ2aWYpOworCQlhcnZpZi0+cHMgPSB2aWYtPmJzc19jb25mLnBzOworCisJCXJldCA9IGF0aDEwa19jb25maWdfcHMoYXIpOwogCQlpZiAocmV0KQogCQkJYXRoMTBrX3dhcm4oYXIsICJmYWlsZWQgdG8gc2V0dXAgcHMgb24gdmRldiAlaTogJWRcbiIsCiAJCQkJICAgIGFydmlmLT52ZGV2X2lkLCByZXQpOwpAQCAtNDg1Nyw3ICs1MDA0LDcgQEAKIAkJCWJ3ID0gV01JX1BFRVJfQ0hXSURUSF84ME1IWjsKIAkJCWJyZWFrOwogCQljYXNlIElFRUU4MDIxMV9TVEFfUlhfQldfMTYwOgotCQkJYXRoMTBrX3dhcm4oYXIsICJJbnZhbGlkIGJhbmR3aXRoICVkIGluIHJjIHVwZGF0ZSBmb3IgJXBNXG4iLAorCQkJYXRoMTBrX3dhcm4oYXIsICJJbnZhbGlkIGJhbmR3aWR0aCAlZCBpbiByYyB1cGRhdGUgZm9yICVwTVxuIiwKIAkJCQkgICAgc3RhLT5iYW5kd2lkdGgsIHN0YS0+YWRkcik7CiAJCQlidyA9IFdNSV9QRUVSX0NIV0lEVEhfMjBNSFo7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3BjaS5jCmluZGV4IGU2OTcyYjAuLjc2ODEyMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway9wY2kuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJewogCQkuZmxhZ3MgPSBDRV9BVFRSX0ZMQUdTLAogCQkuc3JjX25lbnRyaWVzID0gMCwKLQkJLnNyY19zel9tYXggPSA1MTIsCisJCS5zcmNfc3pfbWF4ID0gMjA0OCwKIAkJLmRlc3RfbmVudHJpZXMgPSA1MTIsCiAJfSwKIApAQCAtMTc0LDcgKzE3NCw3IEBACiAJCS5waXBlbnVtID0gX19jcHVfdG9fbGUzMigxKSwKIAkJLnBpcGVkaXIgPSBfX2NwdV90b19sZTMyKFBJUEVESVJfSU4pLAogCQkubmVudHJpZXMgPSBfX2NwdV90b19sZTMyKDMyKSwKLQkJLm5ieXRlc19tYXggPSBfX2NwdV90b19sZTMyKDUxMiksCisJCS5uYnl0ZXNfbWF4ID0gX19jcHVfdG9fbGUzMigyMDQ4KSwKIAkJLmZsYWdzID0gX19jcHVfdG9fbGUzMihDRV9BVFRSX0ZMQUdTKSwKIAkJLnJlc2VydmVkID0gX19jcHVfdG9fbGUzMigwKSwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktb3BzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaAppbmRleCAwNGRjNGI5Li5jOGI2NGU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS1vcHMuaApAQCAtMTEwLDggKzExMCw3IEBACiAJCQkJCSAgYm9vbCBkZWxpdmVyX2NhYik7CiAJc3RydWN0IHNrX2J1ZmYgKigqZ2VuX3BkZXZfc2V0X3dtbSkoc3RydWN0IGF0aDEwayAqYXIsCiAJCQkJCSAgICBjb25zdCBzdHJ1Y3Qgd21pX3dtbV9wYXJhbXNfYWxsX2FyZyAqYXJnKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqKCpnZW5fcmVxdWVzdF9zdGF0cykoc3RydWN0IGF0aDEwayAqYXIsCi0JCQkJCSAgICAgZW51bSB3bWlfc3RhdHNfaWQgc3RhdHNfaWQpOworCXN0cnVjdCBza19idWZmICooKmdlbl9yZXF1ZXN0X3N0YXRzKShzdHJ1Y3QgYXRoMTBrICphciwgdTMyIHN0YXRzX21hc2spOwogCXN0cnVjdCBza19idWZmICooKmdlbl9mb3JjZV9md19oYW5nKShzdHJ1Y3QgYXRoMTBrICphciwKIAkJCQkJICAgICBlbnVtIHdtaV9mb3JjZV9md19oYW5nX3R5cGUgdHlwZSwKIAkJCQkJICAgICB1MzIgZGVsYXlfbXMpOwpAQCAtODE2LDE0ICs4MTUsMTQgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWF0aDEwa193bWlfcmVxdWVzdF9zdGF0cyhzdHJ1Y3QgYXRoMTBrICphciwgZW51bSB3bWlfc3RhdHNfaWQgc3RhdHNfaWQpCithdGgxMGtfd21pX3JlcXVlc3Rfc3RhdHMoc3RydWN0IGF0aDEwayAqYXIsIHUzMiBzdGF0c19tYXNrKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlpZiAoIWFyLT53bWkub3BzLT5nZW5fcmVxdWVzdF9zdGF0cykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0Jc2tiID0gYXItPndtaS5vcHMtPmdlbl9yZXF1ZXN0X3N0YXRzKGFyLCBzdGF0c19pZCk7CisJc2tiID0gYXItPndtaS5vcHMtPmdlbl9yZXF1ZXN0X3N0YXRzKGFyLCBzdGF0c19tYXNrKTsKIAlpZiAoSVNfRVJSKHNrYikpCiAJCXJldHVybiBQVFJfRVJSKHNrYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLXRsdi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktdGx2LmMKaW5kZXggNzE2MTRiYS4uZWUwYzVmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktdGx2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktdGx2LmMKQEAgLTg2OSwxNiArODY5LDU3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aDEwa193bWlfdGx2X3B1bGxfdmRldl9zdGF0cyhjb25zdCBzdHJ1Y3Qgd21pX3Rsdl92ZGV2X3N0YXRzICpzcmMsCisJCQkJCSAgIHN0cnVjdCBhdGgxMGtfZndfc3RhdHNfdmRldiAqZHN0KQoreworCWludCBpOworCisJZHN0LT52ZGV2X2lkID0gX19sZTMyX3RvX2NwdShzcmMtPnZkZXZfaWQpOworCWRzdC0+YmVhY29uX3NuciA9IF9fbGUzMl90b19jcHUoc3JjLT5iZWFjb25fc25yKTsKKwlkc3QtPmRhdGFfc25yID0gX19sZTMyX3RvX2NwdShzcmMtPmRhdGFfc25yKTsKKwlkc3QtPm51bV9yeF9mcmFtZXMgPSBfX2xlMzJfdG9fY3B1KHNyYy0+bnVtX3J4X2ZyYW1lcyk7CisJZHN0LT5udW1fcnRzX2ZhaWwgPSBfX2xlMzJfdG9fY3B1KHNyYy0+bnVtX3J0c19mYWlsKTsKKwlkc3QtPm51bV9ydHNfc3VjY2VzcyA9IF9fbGUzMl90b19jcHUoc3JjLT5udW1fcnRzX3N1Y2Nlc3MpOworCWRzdC0+bnVtX3J4X2VyciA9IF9fbGUzMl90b19jcHUoc3JjLT5udW1fcnhfZXJyKTsKKwlkc3QtPm51bV9yeF9kaXNjYXJkID0gX19sZTMyX3RvX2NwdShzcmMtPm51bV9yeF9kaXNjYXJkKTsKKwlkc3QtPm51bV90eF9ub3RfYWNrZWQgPSBfX2xlMzJfdG9fY3B1KHNyYy0+bnVtX3R4X25vdF9hY2tlZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcmMtPm51bV90eF9mcmFtZXMpOyBpKyspCisJCWRzdC0+bnVtX3R4X2ZyYW1lc1tpXSA9CisJCQlfX2xlMzJfdG9fY3B1KHNyYy0+bnVtX3R4X2ZyYW1lc1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcmMtPm51bV90eF9mcmFtZXNfcmV0cmllcyk7IGkrKykKKwkJZHN0LT5udW1fdHhfZnJhbWVzX3JldHJpZXNbaV0gPQorCQkJX19sZTMyX3RvX2NwdShzcmMtPm51bV90eF9mcmFtZXNfcmV0cmllc1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcmMtPm51bV90eF9mcmFtZXNfZmFpbHVyZXMpOyBpKyspCisJCWRzdC0+bnVtX3R4X2ZyYW1lc19mYWlsdXJlc1tpXSA9CisJCQlfX2xlMzJfdG9fY3B1KHNyYy0+bnVtX3R4X2ZyYW1lc19mYWlsdXJlc1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcmMtPnR4X3JhdGVfaGlzdG9yeSk7IGkrKykKKwkJZHN0LT50eF9yYXRlX2hpc3RvcnlbaV0gPQorCQkJX19sZTMyX3RvX2NwdShzcmMtPnR4X3JhdGVfaGlzdG9yeVtpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcmMtPmJlYWNvbl9yc3NpX2hpc3RvcnkpOyBpKyspCisJCWRzdC0+YmVhY29uX3Jzc2lfaGlzdG9yeVtpXSA9CisJCQlfX2xlMzJfdG9fY3B1KHNyYy0+YmVhY29uX3Jzc2lfaGlzdG9yeVtpXSk7Cit9CisKIHN0YXRpYyBpbnQgYXRoMTBrX3dtaV90bHZfb3BfcHVsbF9md19zdGF0cyhzdHJ1Y3QgYXRoMTBrICphciwKIAkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICAgc3RydWN0IGF0aDEwa19md19zdGF0cyAqc3RhdHMpCiB7CiAJY29uc3Qgdm9pZCAqKnRiOwotCWNvbnN0IHN0cnVjdCB3bWlfc3RhdHNfZXZlbnQgKmV2OworCWNvbnN0IHN0cnVjdCB3bWlfdGx2X3N0YXRzX2V2ICpldjsKIAljb25zdCB2b2lkICpkYXRhOwotCXUzMiBudW1fcGRldl9zdGF0cywgbnVtX3ZkZXZfc3RhdHMsIG51bV9wZWVyX3N0YXRzOworCXUzMiBudW1fcGRldl9zdGF0czsKKwl1MzIgbnVtX3ZkZXZfc3RhdHM7CisJdTMyIG51bV9wZWVyX3N0YXRzOworCXUzMiBudW1fYmNuZmx0X3N0YXRzOworCXUzMiBudW1fY2hhbl9zdGF0czsKIAlzaXplX3QgZGF0YV9sZW47CiAJaW50IHJldDsKKwlpbnQgaTsKIAogCXRiID0gYXRoMTBrX3dtaV90bHZfcGFyc2VfYWxsb2MoYXIsIHNrYi0+ZGF0YSwgc2tiLT5sZW4sIEdGUF9BVE9NSUMpOwogCWlmIChJU19FUlIodGIpKSB7CkBAIC04OTksOCArOTQwLDczIEBACiAJbnVtX3BkZXZfc3RhdHMgPSBfX2xlMzJfdG9fY3B1KGV2LT5udW1fcGRldl9zdGF0cyk7CiAJbnVtX3ZkZXZfc3RhdHMgPSBfX2xlMzJfdG9fY3B1KGV2LT5udW1fdmRldl9zdGF0cyk7CiAJbnVtX3BlZXJfc3RhdHMgPSBfX2xlMzJfdG9fY3B1KGV2LT5udW1fcGVlcl9zdGF0cyk7CisJbnVtX2JjbmZsdF9zdGF0cyA9IF9fbGUzMl90b19jcHUoZXYtPm51bV9iY25mbHRfc3RhdHMpOworCW51bV9jaGFuX3N0YXRzID0gX19sZTMyX3RvX2NwdShldi0+bnVtX2NoYW5fc3RhdHMpOwogCi0JV0FSTl9PTigxKTsgLyogRklYTUU6IG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKwlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwKKwkJICAgIndtaSB0bHYgc3RhdHMgdXBkYXRlIHBkZXYgJWkgdmRldiAlaSBwZWVyICVpIGJjbmZsdCAlaSBjaGFuICVpXG4iLAorCQkgICBudW1fcGRldl9zdGF0cywgbnVtX3ZkZXZfc3RhdHMsIG51bV9wZWVyX3N0YXRzLAorCQkgICBudW1fYmNuZmx0X3N0YXRzLCBudW1fY2hhbl9zdGF0cyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BkZXZfc3RhdHM7IGkrKykgeworCQljb25zdCBzdHJ1Y3Qgd21pX3BkZXZfc3RhdHMgKnNyYzsKKwkJc3RydWN0IGF0aDEwa19md19zdGF0c19wZGV2ICpkc3Q7CisKKwkJc3JjID0gZGF0YTsKKwkJaWYgKGRhdGFfbGVuIDwgc2l6ZW9mKCpzcmMpKQorCQkJcmV0dXJuIC1FUFJPVE87CisKKwkJZGF0YSArPSBzaXplb2YoKnNyYyk7CisJCWRhdGFfbGVuIC09IHNpemVvZigqc3JjKTsKKworCQlkc3QgPSBremFsbG9jKHNpemVvZigqZHN0KSwgR0ZQX0FUT01JQyk7CisJCWlmICghZHN0KQorCQkJY29udGludWU7CisKKwkJYXRoMTBrX3dtaV9wdWxsX3BkZXZfc3RhdHNfYmFzZSgmc3JjLT5iYXNlLCBkc3QpOworCQlhdGgxMGtfd21pX3B1bGxfcGRldl9zdGF0c190eCgmc3JjLT50eCwgZHN0KTsKKwkJYXRoMTBrX3dtaV9wdWxsX3BkZXZfc3RhdHNfcngoJnNyYy0+cngsIGRzdCk7CisJCWxpc3RfYWRkX3RhaWwoJmRzdC0+bGlzdCwgJnN0YXRzLT5wZGV2cyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG51bV92ZGV2X3N0YXRzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHdtaV90bHZfdmRldl9zdGF0cyAqc3JjOworCQlzdHJ1Y3QgYXRoMTBrX2Z3X3N0YXRzX3ZkZXYgKmRzdDsKKworCQlzcmMgPSBkYXRhOworCQlpZiAoZGF0YV9sZW4gPCBzaXplb2YoKnNyYykpCisJCQlyZXR1cm4gLUVQUk9UTzsKKworCQlkYXRhICs9IHNpemVvZigqc3JjKTsKKwkJZGF0YV9sZW4gLT0gc2l6ZW9mKCpzcmMpOworCisJCWRzdCA9IGt6YWxsb2Moc2l6ZW9mKCpkc3QpLCBHRlBfQVRPTUlDKTsKKwkJaWYgKCFkc3QpCisJCQljb250aW51ZTsKKworCQlhdGgxMGtfd21pX3Rsdl9wdWxsX3ZkZXZfc3RhdHMoc3JjLCBkc3QpOworCQlsaXN0X2FkZF90YWlsKCZkc3QtPmxpc3QsICZzdGF0cy0+dmRldnMpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGVlcl9zdGF0czsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCB3bWlfMTB4X3BlZXJfc3RhdHMgKnNyYzsKKwkJc3RydWN0IGF0aDEwa19md19zdGF0c19wZWVyICpkc3Q7CisKKwkJc3JjID0gZGF0YTsKKwkJaWYgKGRhdGFfbGVuIDwgc2l6ZW9mKCpzcmMpKQorCQkJcmV0dXJuIC1FUFJPVE87CisKKwkJZGF0YSArPSBzaXplb2YoKnNyYyk7CisJCWRhdGFfbGVuIC09IHNpemVvZigqc3JjKTsKKworCQlkc3QgPSBremFsbG9jKHNpemVvZigqZHN0KSwgR0ZQX0FUT01JQyk7CisJCWlmICghZHN0KQorCQkJY29udGludWU7CisKKwkJYXRoMTBrX3dtaV9wdWxsX3BlZXJfc3RhdHMoJnNyYy0+b2xkLCBkc3QpOworCQlkc3QtPnBlZXJfcnhfcmF0ZSA9IF9fbGUzMl90b19jcHUoc3JjLT5wZWVyX3J4X3JhdGUpOworCQlsaXN0X2FkZF90YWlsKCZkc3QtPmxpc3QsICZzdGF0cy0+cGVlcnMpOworCX0KIAogCWtmcmVlKHRiKTsKIAlyZXR1cm4gMDsKQEAgLTE2MDQsMTQgKzE3MTAsMTIgQEAKIAkJCQkgICAgY29uc3Qgc3RydWN0IHdtaV93bW1fcGFyYW1zX2FsbF9hcmcgKmFyZykKIHsKIAlzdHJ1Y3Qgd21pX3Rsdl92ZGV2X3NldF93bW1fY21kICpjbWQ7Ci0Jc3RydWN0IHdtaV93bW1fcGFyYW1zICp3bW07CiAJc3RydWN0IHdtaV90bHYgKnRsdjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXNpemVfdCBsZW47CiAJdm9pZCAqcHRyOwogCi0JbGVuID0gKHNpemVvZigqdGx2KSArIHNpemVvZigqY21kKSkgKwotCSAgICAgICg0ICogKHNpemVvZigqdGx2KSArIHNpemVvZigqd21tKSkpOworCWxlbiA9IHNpemVvZigqdGx2KSArIHNpemVvZigqY21kKTsKIAlza2IgPSBhdGgxMGtfd21pX2FsbG9jX3NrYihhciwgbGVuKTsKIAlpZiAoIXNrYikKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CkBAIC0xNjIzLDEzICsxNzI3LDEwIEBACiAJY21kID0gKHZvaWQgKil0bHYtPnZhbHVlOwogCWNtZC0+dmRldl9pZCA9IF9fY3B1X3RvX2xlMzIodmRldl9pZCk7CiAKLQlwdHIgKz0gc2l6ZW9mKCp0bHYpOwotCXB0ciArPSBzaXplb2YoKmNtZCk7Ci0KLQlwdHIgPSBhdGgxMGtfd21pX3Rsdl9wdXRfd21tKHB0ciwgJmFyZy0+YWNfYmUpOwotCXB0ciA9IGF0aDEwa193bWlfdGx2X3B1dF93bW0ocHRyLCAmYXJnLT5hY19iayk7Ci0JcHRyID0gYXRoMTBrX3dtaV90bHZfcHV0X3dtbShwdHIsICZhcmctPmFjX3ZpKTsKLQlwdHIgPSBhdGgxMGtfd21pX3Rsdl9wdXRfd21tKHB0ciwgJmFyZy0+YWNfdm8pOworCWF0aDEwa193bWlfc2V0X3dtbV9wYXJhbSgmY21kLT52ZGV2X3dtbV9wYXJhbXNbMF0ucGFyYW1zLCAmYXJnLT5hY19iZSk7CisJYXRoMTBrX3dtaV9zZXRfd21tX3BhcmFtKCZjbWQtPnZkZXZfd21tX3BhcmFtc1sxXS5wYXJhbXMsICZhcmctPmFjX2JrKTsKKwlhdGgxMGtfd21pX3NldF93bW1fcGFyYW0oJmNtZC0+dmRldl93bW1fcGFyYW1zWzJdLnBhcmFtcywgJmFyZy0+YWNfdmkpOworCWF0aDEwa193bWlfc2V0X3dtbV9wYXJhbSgmY21kLT52ZGV2X3dtbV9wYXJhbXNbM10ucGFyYW1zLCAmYXJnLT5hY192byk7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwgIndtaSB0bHYgdmRldiB3bW0gY29uZlxuIik7CiAJcmV0dXJuIHNrYjsKQEAgLTIwODAsOCArMjE4MSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCi1hdGgxMGtfd21pX3Rsdl9vcF9nZW5fcmVxdWVzdF9zdGF0cyhzdHJ1Y3QgYXRoMTBrICphciwKLQkJCQkgICAgZW51bSB3bWlfc3RhdHNfaWQgc3RhdHNfaWQpCithdGgxMGtfd21pX3Rsdl9vcF9nZW5fcmVxdWVzdF9zdGF0cyhzdHJ1Y3QgYXRoMTBrICphciwgdTMyIHN0YXRzX21hc2spCiB7CiAJc3RydWN0IHdtaV9yZXF1ZXN0X3N0YXRzX2NtZCAqY21kOwogCXN0cnVjdCB3bWlfdGx2ICp0bHY7CkBAIC0yMDk1LDcgKzIxOTUsNyBAQAogCXRsdi0+dGFnID0gX19jcHVfdG9fbGUxNihXTUlfVExWX1RBR19TVFJVQ1RfUkVRVUVTVF9TVEFUU19DTUQpOwogCXRsdi0+bGVuID0gX19jcHVfdG9fbGUxNihzaXplb2YoKmNtZCkpOwogCWNtZCA9ICh2b2lkICopdGx2LT52YWx1ZTsKLQljbWQtPnN0YXRzX2lkID0gX19jcHVfdG9fbGUzMihzdGF0c19pZCk7CisJY21kLT5zdGF0c19pZCA9IF9fY3B1X3RvX2xlMzIoc3RhdHNfbWFzayk7CiAKIAlhdGgxMGtfZGJnKGFyLCBBVEgxMEtfREJHX1dNSSwgIndtaSB0bHYgcmVxdWVzdCBzdGF0c1xuIik7CiAJcmV0dXJuIHNrYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLXRsdi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktdGx2LmgKaW5kZXggZGU2OGZlNy4uYTZjODI4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktdGx2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWktdGx2LmgKQEAgLTEzMDIsOCArMTMwMiwxNCBAQAogCV9fbGUzMiBkZ190eXBlOyAvKiBubyBpZGVhLi4gKi8KIH0gX19wYWNrZWQ7CiAKK3N0cnVjdCB3bWlfdGx2X3ZkZXZfd21tX3BhcmFtcyB7CisJX19sZTMyIGR1bW15OworCXN0cnVjdCB3bWlfd21tX3BhcmFtcyBwYXJhbXM7Cit9IF9fcGFja2VkOworCiBzdHJ1Y3Qgd21pX3Rsdl92ZGV2X3NldF93bW1fY21kIHsKIAlfX2xlMzIgdmRldl9pZDsKKwlzdHJ1Y3Qgd21pX3Rsdl92ZGV2X3dtbV9wYXJhbXMgdmRldl93bW1fcGFyYW1zWzRdOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IHdtaV90bHZfcGh5ZXJyX2V2IHsKQEAgLTE0MzksNiArMTQ0NSwxNSBAQAogCV9fbGUzMiBpbnRlcnZhbDsgLyogaW4gc2Vjb25kcyAqLwogfSBfX3BhY2tlZDsKIAorc3RydWN0IHdtaV90bHZfc3RhdHNfZXYgeworCV9fbGUzMiBzdGF0c19pZDsgLyogV01JX1NUQVRfICovCisJX19sZTMyIG51bV9wZGV2X3N0YXRzOworCV9fbGUzMiBudW1fdmRldl9zdGF0czsKKwlfX2xlMzIgbnVtX3BlZXJfc3RhdHM7CisJX19sZTMyIG51bV9iY25mbHRfc3RhdHM7CisJX19sZTMyIG51bV9jaGFuX3N0YXRzOworfSBfX3BhY2tlZDsKKwogdm9pZCBhdGgxMGtfd21pX3Rsdl9hdHRhY2goc3RydWN0IGF0aDEwayAqYXIpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5jCmluZGV4IGFlZWExYzcuLmM3ZWE3N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWkuYwpAQCAtMTEyNSw2ICsxMTI1LDI1IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBhdGgxMGtfd21pX2V2ZW50X3NjYW5fc3RhcnRfZmFpbGVkKHN0cnVjdCBhdGgxMGsgKmFyKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmFyLT5kYXRhX2xvY2spOworCisJc3dpdGNoIChhci0+c2Nhbi5zdGF0ZSkgeworCWNhc2UgQVRIMTBLX1NDQU5fSURMRToKKwljYXNlIEFUSDEwS19TQ0FOX1JVTk5JTkc6CisJY2FzZSBBVEgxMEtfU0NBTl9BQk9SVElORzoKKwkJYXRoMTBrX3dhcm4oYXIsICJyZWNlaXZlZCBzY2FuIHN0YXJ0IGZhaWxlZCBldmVudCBpbiBhbiBpbnZhbGlkIHNjYW4gc3RhdGU6ICVzICglZClcbiIsCisJCQkgICAgYXRoMTBrX3NjYW5fc3RhdGVfc3RyKGFyLT5zY2FuLnN0YXRlKSwKKwkJCSAgICBhci0+c2Nhbi5zdGF0ZSk7CisJCWJyZWFrOworCWNhc2UgQVRIMTBLX1NDQU5fU1RBUlRJTkc6CisJCWNvbXBsZXRlKCZhci0+c2Nhbi5zdGFydGVkKTsKKwkJX19hdGgxMGtfc2Nhbl9maW5pc2goYXIpOworCQlicmVhazsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGF0aDEwa193bWlfZXZlbnRfc2Nhbl9jb21wbGV0ZWQoc3RydWN0IGF0aDEwayAqYXIpCiB7CiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYXItPmRhdGFfbG9jayk7CkBAIC0xMjkyLDYgKzEzMTEsNyBAQAogCQlicmVhazsKIAljYXNlIFdNSV9TQ0FOX0VWRU5UX1NUQVJUX0ZBSUxFRDoKIAkJYXRoMTBrX3dhcm4oYXIsICJyZWNlaXZlZCBzY2FuIHN0YXJ0IGZhaWx1cmUgZXZlbnRcbiIpOworCQlhdGgxMGtfd21pX2V2ZW50X3NjYW5fc3RhcnRfZmFpbGVkKGFyKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfU0NBTl9FVkVOVF9ERVFVRVVFRDoKIAljYXNlIFdNSV9TQ0FOX0VWRU5UX1BSRUVNUFRFRDoKQEAgLTQ5NTQsNyArNDk3NCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCi1hdGgxMGtfd21pX29wX2dlbl9yZXF1ZXN0X3N0YXRzKHN0cnVjdCBhdGgxMGsgKmFyLCBlbnVtIHdtaV9zdGF0c19pZCBzdGF0c19pZCkKK2F0aDEwa193bWlfb3BfZ2VuX3JlcXVlc3Rfc3RhdHMoc3RydWN0IGF0aDEwayAqYXIsIHUzMiBzdGF0c19tYXNrKQogewogCXN0cnVjdCB3bWlfcmVxdWVzdF9zdGF0c19jbWQgKmNtZDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtNDk2NCw5ICs0OTg0LDEwIEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJY21kID0gKHN0cnVjdCB3bWlfcmVxdWVzdF9zdGF0c19jbWQgKilza2ItPmRhdGE7Ci0JY21kLT5zdGF0c19pZCA9IF9fY3B1X3RvX2xlMzIoc3RhdHNfaWQpOworCWNtZC0+c3RhdHNfaWQgPSBfX2NwdV90b19sZTMyKHN0YXRzX21hc2spOwogCi0JYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksICJ3bWkgcmVxdWVzdCBzdGF0cyAlZFxuIiwgKGludClzdGF0c19pZCk7CisJYXRoMTBrX2RiZyhhciwgQVRIMTBLX0RCR19XTUksICJ3bWkgcmVxdWVzdCBzdGF0cyAweCUwOHhcbiIsCisJCSAgIHN0YXRzX21hc2spOwogCXJldHVybiBza2I7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoMTBrL3dtaS5oCmluZGV4IDIwY2UzNjAuLmFkZjkzNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGgxMGsvd21pLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDEway93bWkuaApAQCAtMzA1Nyw4ICszMDU3LDEyIEBACiB9IF9fcGFja2VkOwogCiBlbnVtIHdtaV9zdGF0c19pZCB7Ci0JV01JX1JFUVVFU1RfUEVFUl9TVEFUCT0gMHgwMSwKLQlXTUlfUkVRVUVTVF9BUF9TVEFUCT0gMHgwMgorCVdNSV9TVEFUX1BFRVIgPSBCSVQoMCksCisJV01JX1NUQVRfQVAgPSBCSVQoMSksCisJV01JX1NUQVRfUERFViA9IEJJVCgyKSwKKwlXTUlfU1RBVF9WREVWID0gQklUKDMpLAorCVdNSV9TVEFUX0JDTkZMVCA9IEJJVCg0KSwKKwlXTUlfU1RBVF9WREVWX1JBVEUgPSBCSVQoNSksCiB9OwogCiBzdHJ1Y3Qgd2xhbl9pbnN0X3Jzc2lfYXJncyB7CkBAIC0zMDkzLDcgKzMwOTcsNyBAQAogfSBfX3BhY2tlZDsKIAogc3RydWN0IHdtaV9zdGF0c19ldmVudCB7Ci0JX19sZTMyIHN0YXRzX2lkOyAvKiAlV01JX1JFUVVFU1RfICovCisJX19sZTMyIHN0YXRzX2lkOyAvKiBXTUlfU1RBVF8gKi8KIAkvKgogCSAqIG51bWJlciBvZiBwZGV2IHN0YXRzIGV2ZW50IHN0cnVjdHVyZXMKIAkgKiAod21pX3BkZXZfc3RhdHMpIDAgb3IgMQpAQCAtMzc0NSw2ICszNzQ5LDExIEBACiAJV01JXzEwWF9WREVWX1BBUkFNX1ZIVDgwX1JBVEVNQVNLLAogfTsKIAorI2RlZmluZSBXTUlfVkRFVl9QQVJBTV9UWEJGX1NVX1RYX0JGRUUgQklUKDApCisjZGVmaW5lIFdNSV9WREVWX1BBUkFNX1RYQkZfTVVfVFhfQkZFRSBCSVQoMSkKKyNkZWZpbmUgV01JX1ZERVZfUEFSQU1fVFhCRl9TVV9UWF9CRkVSIEJJVCgyKQorI2RlZmluZSBXTUlfVkRFVl9QQVJBTV9UWEJGX01VX1RYX0JGRVIgQklUKDMpCisKIC8qIHNsb3QgdGltZSBsb25nICovCiAjZGVmaW5lIFdNSV9WREVWX1NMT1RfVElNRV9MT05HCQkweDEKIC8qIHNsb3QgdGltZSBzaG9ydCAqLwpAQCAtNDQzNiw3ICs0NDQ1LDggQEAKIAlXTUlfUEVFUl9BVVRIT1JJWkUgID0gMHgzLAogCVdNSV9QRUVSX0NIQU5fV0lEVEggPSAweDQsCiAJV01JX1BFRVJfTlNTICAgICAgICA9IDB4NSwKLQlXTUlfUEVFUl9VU0VfNEFERFIgID0gMHg2CisJV01JX1BFRVJfVVNFXzRBRERSICA9IDB4NiwKKwlXTUlfUEVFUl9EVU1NWV9WQVIgID0gMHhmZiwgLyogZHVtbXkgcGFyYW1ldGVyIGZvciBTVEEgUFMgd29ya2Fyb3VuZCAqLwogfTsKIAogc3RydWN0IHdtaV9wZWVyX3NldF9wYXJhbV9jbWQgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0aDVrLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaAppbmRleCAxZWQ3YTg4Li43Y2EwZDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaApAQCAtMTI4Myw2ICsxMjgzLDcgQEAKICNkZWZpbmUgQVRIX1NUQVRfUFJPTUlTQwkxCiAjZGVmaW5lIEFUSF9TVEFUX0xFRFNPRlQJMgkJLyogZW5hYmxlIExFRCBncGlvIHN0YXR1cyAqLwogI2RlZmluZSBBVEhfU1RBVF9TVEFSVEVECTMJCS8qIG9wZW5lZCAmIGlycXMgZW5hYmxlZCAqLworI2RlZmluZSBBVEhfU1RBVF9SRVNFVAkJNAkJLyogaHcgcmVzZXQgKi8KIAogCXVuc2lnbmVkIGludAkJZmlsdGVyX2ZsYWdzOwkvKiBIVyBmbGFncywgQVI1S19SWF9GSUxURVJfKiAqLwogCXVuc2lnbmVkIGludAkJZmlmX2ZpbHRlcl9mbGFnczsgLyogQ3VycmVudCBGSUZfKiBmaWx0ZXIgZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jCmluZGV4IGJjOWNiMzUuLmE2MTMxODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuYwpAQCAtNTI4LDcgKzUyOCw3IEBACiAJICogdG9nZXRoZXIgd2l0aCB0aGUgQlNTSUQgbWFzayB3aGVuIG1hdGNoaW5nIGFkZHJlc3Nlcy4KIAkgKi8KIAlpdGVyX2RhdGEuaHdfbWFjYWRkciA9IGNvbW1vbi0+bWFjYWRkcjsKLQltZW1zZXQoJml0ZXJfZGF0YS5tYXNrLCAweGZmLCBFVEhfQUxFTik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKGl0ZXJfZGF0YS5tYXNrKTsKIAlpdGVyX2RhdGEuZm91bmRfYWN0aXZlID0gZmFsc2U7CiAJaXRlcl9kYXRhLm5lZWRfc2V0X2h3X2FkZHIgPSB0cnVlOwogCWl0ZXJfZGF0YS5vcG1vZGUgPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDsKQEAgLTE1MjMsNiArMTUyMyw5IEBACiAJZW51bSBhdGg1a19pbnQgaW1hc2s7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCWlmICh0ZXN0X2JpdChBVEhfU1RBVF9SRVNFVCwgYWgtPnN0YXR1cykpCisJCXJldHVybjsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZhaC0+aXJxbG9jaywgZmxhZ3MpOwogCWltYXNrID0gYWgtPmltYXNrOwogCWlmIChhaC0+cnhfcGVuZGluZykKQEAgLTI4NTgsMTAgKzI4NjEsMTIgQEAKIHsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKGFoKTsKIAlpbnQgcmV0LCBhbmlfbW9kZTsKLQlib29sIGZhc3Q7CisJYm9vbCBmYXN0ID0gY2hhbiAmJiBtb2RwYXJhbV9mYXN0Y2hhbnN3aXRjaCA/IDEgOiAwOwogCiAJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19SRVNFVCwgInJlc2V0dGluZ1xuIik7CiAKKwlfX3NldF9iaXQoQVRIX1NUQVRfUkVTRVQsIGFoLT5zdGF0dXMpOworCiAJYXRoNWtfaHdfc2V0X2ltcihhaCwgMCk7CiAJc3luY2hyb25pemVfaXJxKGFoLT5pcnEpOwogCWF0aDVrX3N0b3BfdGFza2xldHMoYWgpOwpAQCAtMjg3NiwxMSArMjg4MSwyOSBAQAogCSAqIHNvIHdlIHNob3VsZCBhbHNvIGZyZWUgYW55IHJlbWFpbmluZwogCSAqIHR4IGJ1ZmZlcnMgKi8KIAlhdGg1a19kcmFpbl90eF9idWZmcyhhaCk7CisKKwkvKiBTdG9wIFBDVSAqLworCWF0aDVrX2h3X3N0b3BfcnhfcGN1KGFoKTsKKworCS8qIFN0b3AgRE1BCisJICoKKwkgKiBOb3RlOiBJZiBETUEgZGlkbid0IHN0b3AgY29udGludWUKKwkgKiBzaW5jZSBvbmx5IGEgcmVzZXQgd2lsbCBmaXggaXQuCisJICovCisJcmV0ID0gYXRoNWtfaHdfZG1hX3N0b3AoYWgpOworCisJLyogUkYgQnVzIGdyYW50IHdvbid0IHdvcmsgaWYgd2UgaGF2ZSBwZW5kaW5nCisJICogZnJhbWVzCisJICovCisJaWYgKHJldCAmJiBmYXN0KSB7CisJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsCisJCQkgICJETUEgZGlkbid0IHN0b3AsIGZhbGxpbmcgYmFjayB0byBub3JtYWwgcmVzZXRcbiIpOworCQlmYXN0ID0gZmFsc2U7CisJfQorCiAJaWYgKGNoYW4pCiAJCWFoLT5jdXJjaGFuID0gY2hhbjsKIAotCWZhc3QgPSAoKGNoYW4gIT0gTlVMTCkgJiYgbW9kcGFyYW1fZmFzdGNoYW5zd2l0Y2gpID8gMSA6IDA7Ci0KIAlyZXQgPSBhdGg1a19od19yZXNldChhaCwgYWgtPm9wbW9kZSwgYWgtPmN1cmNoYW4sIGZhc3QsIHNraXBfcGN1KTsKIAlpZiAocmV0KSB7CiAJCUFUSDVLX0VSUihhaCwgImNhbid0IHJlc2V0IGhhcmR3YXJlICglZClcbiIsIHJldCk7CkBAIC0yOTM0LDYgKzI5NTcsOCBAQAogCSAqLwogLyoJYXRoNWtfY2hhbl9jaGFuZ2UoYWgsIGMpOyAqLwogCisJX19jbGVhcl9iaXQoQVRIX1NUQVRfUkVTRVQsIGFoLT5zdGF0dXMpOworCiAJYXRoNWtfYmVhY29uX2NvbmZpZyhhaCk7CiAJLyogaW50cnMgYXJlIGVuYWJsZWQgYnkgYXRoNWtfYmVhY29uX2NvbmZpZyAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVzZXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCmluZGV4IGI5YjY1MWUuLjk5ZTYyZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jCkBAIC0xMTY5LDMwICsxMTY5LDYgQEAKIAlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpCiAJCWF0aDVrX2h3X3NldF9zbGVlcF9jbG9jayhhaCwgZmFsc2UpOwogCi0JLyoKLQkgKiBTdG9wIFBDVQotCSAqLwotCWF0aDVrX2h3X3N0b3BfcnhfcGN1KGFoKTsKLQotCS8qCi0JICogU3RvcCBETUEKLQkgKgotCSAqIE5vdGU6IElmIERNQSBkaWRuJ3Qgc3RvcCBjb250aW51ZQotCSAqIHNpbmNlIG9ubHkgYSByZXNldCB3aWxsIGZpeCBpdC4KLQkgKi8KLQlyZXQgPSBhdGg1a19od19kbWFfc3RvcChhaCk7Ci0KLQkvKiBSRiBCdXMgZ3JhbnQgd29uJ3Qgd29yayBpZiB3ZSBoYXZlIHBlbmRpbmcKLQkgKiBmcmFtZXMgKi8KLQlpZiAocmV0ICYmIGZhc3QpIHsKLQkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19SRVNFVCwKLQkJCSJETUEgZGlkbid0IHN0b3AsIGZhbGxpbmcgYmFjayB0byBub3JtYWwgcmVzZXRcbiIpOwotCQlmYXN0ID0gZmFsc2U7Ci0JCS8qIE5vbiBmYXRhbCwganVzdCBjb250aW51ZSB3aXRoCi0JCSAqIG5vcm1hbCByZXNldCAqLwotCQlyZXQgPSAwOwotCX0KLQogCW1vZGUgPSBjaGFubmVsLT5od192YWx1ZTsKIAlzd2l0Y2ggKG1vZGUpIHsKIAljYXNlIEFSNUtfTU9ERV8xMUE6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMKaW5kZXggODVkYTYzYS4uY2NlNDYyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuYwpAQCAtNjg2LDIwICs2ODYsMjEgQEAKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwotCXUxNiBjYXBfbWFzaywgY2FwX3ZhbDsKKwl1MTYgY2FwX3ZhbDsKKwllbnVtIGllZWU4MDIxMV9ic3NfdHlwZSBic3NfdHlwZTsKIAl1OCAqaWU7CiAKIAlpZiAobndfdHlwZSAmIEFESE9DX05FVFdPUkspIHsKLQkJY2FwX21hc2sgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKIAkJY2FwX3ZhbCA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOworCQlic3NfdHlwZSA9IElFRUU4MDIxMV9CU1NfVFlQRV9JQlNTOwogCX0gZWxzZSB7Ci0JCWNhcF9tYXNrID0gV0xBTl9DQVBBQklMSVRZX0VTUzsKIAkJY2FwX3ZhbCA9IFdMQU5fQ0FQQUJJTElUWV9FU1M7CisJCWJzc190eXBlID0gSUVFRTgwMjExX0JTU19UWVBFX0VTUzsKIAl9CiAKIAlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKGFyLT53aXBoeSwgY2hhbiwgYnNzaWQsCiAJCQkgICAgICAgdmlmLT5zc2lkLCB2aWYtPnNzaWRfbGVuLAotCQkJICAgICAgIGNhcF9tYXNrLCBjYXBfdmFsKTsKKwkJCSAgICAgICBic3NfdHlwZSwgSUVFRTgwMjExX1BSSVZBQ1lfQU5ZKTsKIAlpZiAoYnNzID09IE5VTEwpIHsKIAkJLyoKIAkJICogU2luY2UgY2ZnODAyMTEgbWF5IG5vdCB5ZXQga25vdyBhYm91dCB0aGUgQlNTLApAQCAtMTQ5NSw2ICsxNDk2LDcgQEAKIAogc3RhdGljIHN0cnVjdCB3aXJlbGVzc19kZXYgKmF0aDZrbF9jZmc4MDIxMV9hZGRfaWZhY2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQkgICAgICB1bnNpZ25lZCBjaGFyIG5hbWVfYXNzaWduX3R5cGUsCiAJCQkJCQkgICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCiAJCQkJCQkgICAgICB1MzIgKmZsYWdzLAogCQkJCQkJICAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKQEAgLTE1MTMsNyArMTUxNSw3IEBACiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAotCXdkZXYgPSBhdGg2a2xfaW50ZXJmYWNlX2FkZChhciwgbmFtZSwgdHlwZSwgaWZfaWR4LCBud190eXBlKTsKKwl3ZGV2ID0gYXRoNmtsX2ludGVyZmFjZV9hZGQoYXIsIG5hbWUsIG5hbWVfYXNzaWduX3R5cGUsIHR5cGUsIGlmX2lkeCwgbndfdHlwZSk7CiAJaWYgKCF3ZGV2KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIApAQCAtMjAzMyw3ICsyMDM1LDcgQEAKIAlpbnQgcmV0OwogCiAJLyogU2V0dXAgdW5pY2FzdCBwa3QgcGF0dGVybiAqLwotCW1lbXNldChtYWNfbWFzaywgMHhmZiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcihtYWNfbWFzayk7CiAJcmV0ID0gYXRoNmtsX3dtaV9hZGRfd293X3BhdHRlcm5fY21kKGFyLT53bWksCiAJCQkJdmlmLT5md192aWZfaWR4LCBXT1dfTElTVF9JRCwKIAkJCQlFVEhfQUxFTiwgMCwgbmRldi0+ZGV2X2FkZHIsCkBAIC0zNjMzLDEzICszNjM1LDE0IEBACiB9CiAKIHN0cnVjdCB3aXJlbGVzc19kZXYgKmF0aDZrbF9pbnRlcmZhY2VfYWRkKHN0cnVjdCBhdGg2a2wgKmFyLCBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkgIHVuc2lnbmVkIGNoYXIgbmFtZV9hc3NpZ25fdHlwZSwKIAkJCQkJICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCiAJCQkJCSAgdTggZndfdmlmX2lkeCwgdTggbndfdHlwZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOwogCi0JbmRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnZpZiksIG5hbWUsIE5FVF9OQU1FX1VOS05PV04sIGV0aGVyX3NldHVwKTsKKwluZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZigqdmlmKSwgbmFtZSwgbmFtZV9hc3NpZ25fdHlwZSwgZXRoZXJfc2V0dXApOwogCWlmICghbmRldikKIAkJcmV0dXJuIE5VTEw7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuaAppbmRleCBiNTliZWNkLi41YWE1N2E3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5oCkBAIC0yNSw2ICsyNSw3IEBACiB9OwogCiBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICphdGg2a2xfaW50ZXJmYWNlX2FkZChzdHJ1Y3QgYXRoNmtsICphciwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJICB1bnNpZ25lZCBjaGFyIG5hbWVfYXNzaWduX3R5cGUsCiAJCQkJCSAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAogCQkJCQkgIHU4IGZ3X3ZpZl9pZHgsIHU4IG53X3R5cGUpOwogdm9pZCBhdGg2a2xfY2ZnODAyMTFfY2hfc3dpdGNoX25vdGlmeShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBpbnQgZnJlcSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29yZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jb3JlLmMKaW5kZXggMGRmNzRiMi4uNGVjMDJjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jb3JlLmMKQEAgLTIxMSw4ICsyMTEsOCBAQAogCXJ0bmxfbG9jaygpOwogCiAJLyogQWRkIGFuIGluaXRpYWwgc3RhdGlvbiBpbnRlcmZhY2UgKi8KLQl3ZGV2ID0gYXRoNmtsX2ludGVyZmFjZV9hZGQoYXIsICJ3bGFuJWQiLCBOTDgwMjExX0lGVFlQRV9TVEFUSU9OLCAwLAotCQkJCSAgICBJTkZSQV9ORVRXT1JLKTsKKwl3ZGV2ID0gYXRoNmtsX2ludGVyZmFjZV9hZGQoYXIsICJ3bGFuJWQiLCBORVRfTkFNRV9FTlVNLAorCQkJCSAgICBOTDgwMjExX0lGVFlQRV9TVEFUSU9OLCAwLCBJTkZSQV9ORVRXT1JLKTsKIAogCXJ0bmxfdW5sb2NrKCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9tYWluLmMKaW5kZXggYjQyYmE0Ni4uMWFmM2ZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9tYWluLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCiAJbWVtc2V0KCZhci0+YXBfc3RhdHMuc3RhW3N0YS0+YWlkIC0gMV0sIDAsCiAJICAgICAgIHNpemVvZihzdHJ1Y3Qgd21pX3Blcl9zdGFfc3RhdCkpOwotCW1lbXNldChzdGEtPm1hYywgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIoc3RhLT5tYWMpOwogCW1lbXNldChzdGEtPndwYV9pZSwgMCwgQVRINktMX01BWF9JRSk7CiAJc3RhLT5haWQgPSAwOwogCXN0YS0+c3RhX2ZsYWdzID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9NYWtlZmlsZQppbmRleCA0NzM5NzIyLi5lY2RhNjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL01ha2VmaWxlCkBAIC00Niw3ICs0Niw4IEBACiBhdGg5a19ody0kKENPTkZJR19BVEg5S19XT1cpICs9IGFyOTAwM193b3cubwogCiBhdGg5a19ody0kKENPTkZJR19BVEg5S19CVENPRVhfU1VQUE9SVCkgKz0gYnRjb2V4Lm8gXAotCQkJCQkgICBhcjkwMDNfbWNpLm8KKwkJCQkJICAgYXI5MDAzX21jaS5vIFwKKwkJCQkJICAgYXI5MDAzX2FpYy5vCiAKIGF0aDlrX2h3LSQoQ09ORklHX0FUSDlLX1BDT0VNKSArPSBhcjkwMDNfcnR0Lm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FuaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FuaS5jCmluZGV4IGNhMDFkMTcuLjI1ZTQ1ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hbmkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYW5pLmMKQEAgLTEwNywxMSArMTA3LDIxIEBACiBzdGF0aWMgdm9pZCBhdGg5a19od191cGRhdGVfbWlic3RhdHMoc3RydWN0IGF0aF9odyAqYWgsCiAJCQkJICAgICBzdHJ1Y3QgYXRoOWtfbWliX3N0YXRzICpzdGF0cykKIHsKLQlzdGF0cy0+YWNrcmN2X2JhZCArPSBSRUdfUkVBRChhaCwgQVJfQUNLX0ZBSUwpOwotCXN0YXRzLT5ydHNfYmFkICs9IFJFR19SRUFEKGFoLCBBUl9SVFNfRkFJTCk7Ci0Jc3RhdHMtPmZjc19iYWQgKz0gUkVHX1JFQUQoYWgsIEFSX0ZDU19GQUlMKTsKLQlzdGF0cy0+cnRzX2dvb2QgKz0gUkVHX1JFQUQoYWgsIEFSX1JUU19PSyk7Ci0Jc3RhdHMtPmJlYWNvbnMgKz0gUkVHX1JFQUQoYWgsIEFSX0JFQUNPTl9DTlQpOworCXUzMiBhZGRyWzVdID0ge0FSX1JUU19PSywgQVJfUlRTX0ZBSUwsIEFSX0FDS19GQUlMLAorCQkgICAgICAgQVJfRkNTX0ZBSUwsIEFSX0JFQUNPTl9DTlR9OworCXUzMiBkYXRhWzVdOworCisJUkVHX1JFQURfTVVMVEkoYWgsICZhZGRyWzBdLCAmZGF0YVswXSwgNSk7CisJLyogQVJfUlRTX09LICovCisJc3RhdHMtPnJ0c19nb29kICs9IGRhdGFbMF07CisJLyogQVJfUlRTX0ZBSUwgKi8KKwlzdGF0cy0+cnRzX2JhZCArPSBkYXRhWzFdOworCS8qIEFSX0FDS19GQUlMICovCisJc3RhdHMtPmFja3Jjdl9iYWQgKz0gZGF0YVsyXTsKKwkvKiBBUl9GQ1NfRkFJTCAqLworCXN0YXRzLT5mY3NfYmFkICs9IGRhdGFbM107CisJLyogQVJfQkVBQ09OX0NOVCAqLworCXN0YXRzLT5iZWFjb25zICs9IGRhdGFbNF07CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDlrX2FuaV9yZXN0YXJ0KHN0cnVjdCBhdGhfaHcgKmFoKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyNTAwOF9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjUwMDhfcGh5LmMKaW5kZXggZjI3MzQyNy4uNmMyM2QyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyNTAwOF9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X3BoeS5jCkBAIC02ODEsMTIgKzY4MSwxMyBAQAogCQkJcGh5bW9kZSB8PSBBUl9QSFlfRkNfRFlOMjA0MF9QUklfQ0g7CiAKIAl9CisJRU5BQkxFX1JFR1dSSVRFX0JVRkZFUihhaCk7CiAJUkVHX1dSSVRFKGFoLCBBUl9QSFlfVFVSQk8sIHBoeW1vZGUpOwogCisJLyogVGhpcyBmdW5jdGlvbiBkbyBvbmx5IFJFR19XUklURSwgc28KKwkgKiB3ZSBjYW4gaW5jbHVkZSBpdCB0byBSRUdXUklURV9CVUZGRVIuICovCiAJYXRoOWtfaHdfc2V0MTFubWFjMjA0MChhaCwgY2hhbik7CiAKLQlFTkFCTEVfUkVHV1JJVEVfQlVGRkVSKGFoKTsKLQogCVJFR19XUklURShhaCwgQVJfR1RYVE8sIDI1IDw8IEFSX0dUWFRPX1RJTUVPVVRfTElNSVRfUyk7CiAJUkVHX1dSSVRFKGFoLCBBUl9DU1QsIDB4RiA8PCBBUl9DU1RfVElNRU9VVF9MSU1JVF9TKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9jYWxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9jYWxpYi5jCmluZGV4IDQyMTkwYjYuLjUwZmNkMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2NhbGliLmMKQEAgLTQzMCw0NiArNDMwLDQzIEBACiAJdTMyIHJlZ1ZhbDsKIAl1bnNpZ25lZCBpbnQgaTsKIAl1MzIgcmVnTGlzdFtdWzJdID0gewotCQl7IDB4Nzg2YywgMCB9LAotCQl7IDB4Nzg1NCwgMCB9LAotCQl7IDB4NzgyMCwgMCB9LAotCQl7IDB4NzgyNCwgMCB9LAotCQl7IDB4Nzg2OCwgMCB9LAotCQl7IDB4NzgzYywgMCB9LAotCQl7IDB4NzgzOCwgMCB9ICwKLQkJeyAweDc4MjgsIDAgfSAsCisJCXsgQVI5Mjg1X0FOX1RPUDMsIDAgfSwKKwkJeyBBUjkyODVfQU5fUlhUWEJCMSwgMCB9LAorCQl7IEFSOTI4NV9BTl9SRjJHMSwgMCB9LAorCQl7IEFSOTI4NV9BTl9SRjJHMiwgMCB9LAorCQl7IEFSOTI4NV9BTl9UT1AyLCAwIH0sCisJCXsgQVI5Mjg1X0FOX1JGMkc4LCAwIH0sCisJCXsgQVI5Mjg1X0FOX1JGMkc3LCAwIH0sCisJCXsgQVI5Mjg1X0FOX1JGMkczLCAwIH0sCiAJfTsKIAotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlZ0xpc3QpOyBpKyspCi0JCXJlZ0xpc3RbaV1bMV0gPSBSRUdfUkVBRChhaCwgcmVnTGlzdFtpXVswXSk7CisJUkVHX1JFQURfQVJSQVkoYWgsIHJlZ0xpc3QsIEFSUkFZX1NJWkUocmVnTGlzdCkpOwogCi0JcmVnVmFsID0gUkVHX1JFQUQoYWgsIDB4NzgzNCk7Ci0JcmVnVmFsICY9ICh+KDB4MSkpOwotCVJFR19XUklURShhaCwgMHg3ODM0LCByZWdWYWwpOwotCXJlZ1ZhbCA9IFJFR19SRUFEKGFoLCAweDk4MDgpOwotCXJlZ1ZhbCB8PSAoMHgxIDw8IDI3KTsKLQlSRUdfV1JJVEUoYWgsIDB4OTgwOCwgcmVnVmFsKTsKLQorCUVOQUJMRV9SRUdfUk1XX0JVRkZFUihhaCk7CisJLyogNzgzNCwgYjE9MCAqLworCVJFR19DTFJfQklUKGFoLCBBUjkyODVfQU5fUkYyRzYsIDEgPDwgMCk7CisJLyogOTgwOCwgYjI3PTEgKi8KKwlSRUdfU0VUX0JJVChhaCwgMHg5ODA4LCAxIDw8IDI3KTsKIAkvKiA3ODZjLGIyMywxLCBwd2RkYWM9MSAqLwotCVJFR19STVdfRklFTEQoYWgsIEFSOTI4NV9BTl9UT1AzLCBBUjkyODVfQU5fVE9QM19QV0REQUMsIDEpOworCVJFR19TRVRfQklUKGFoLCBBUjkyODVfQU5fVE9QMywgQVI5Mjg1X0FOX1RPUDNfUFdEREFDKTsKIAkvKiA3ODU0LCBiNSwxLCBwZHJ4dHhiYj0xICovCi0JUkVHX1JNV19GSUVMRChhaCwgQVI5Mjg1X0FOX1JYVFhCQjEsIEFSOTI4NV9BTl9SWFRYQkIxX1BEUlhUWEJCMSwgMSk7CisJUkVHX1NFVF9CSVQoYWgsIEFSOTI4NV9BTl9SWFRYQkIxLCBBUjkyODVfQU5fUlhUWEJCMV9QRFJYVFhCQjEpOwogCS8qIDc4NTQsIGI3LDEsIHBkdjJpPTEgKi8KLQlSRUdfUk1XX0ZJRUxEKGFoLCBBUjkyODVfQU5fUlhUWEJCMSwgQVI5Mjg1X0FOX1JYVFhCQjFfUERWMkksIDEpOworCVJFR19TRVRfQklUKGFoLCBBUjkyODVfQU5fUlhUWEJCMSwgQVI5Mjg1X0FOX1JYVFhCQjFfUERWMkkpOwogCS8qIDc4NTQsIGI4LDEsIHBkZGFjaW50ZXJmYWNlPTEgKi8KLQlSRUdfUk1XX0ZJRUxEKGFoLCBBUjkyODVfQU5fUlhUWEJCMSwgQVI5Mjg1X0FOX1JYVFhCQjFfUEREQUNJRiwgMSk7CisJUkVHX1NFVF9CSVQoYWgsIEFSOTI4NV9BTl9SWFRYQkIxLCBBUjkyODVfQU5fUlhUWEJCMV9QRERBQ0lGKTsKIAkvKiA3ODI0LGIxMiwwLCBvZmZjYWw9MCAqLwotCVJFR19STVdfRklFTEQoYWgsIEFSOTI4NV9BTl9SRjJHMiwgQVI5Mjg1X0FOX1JGMkcyX09GRkNBTCwgMCk7CisJUkVHX0NMUl9CSVQoYWgsIEFSOTI4NV9BTl9SRjJHMiwgQVI5Mjg1X0FOX1JGMkcyX09GRkNBTCk7CiAJLyogNzgzOCwgYjEsMCwgcHdkZGI9MCAqLwotCVJFR19STVdfRklFTEQoYWgsIEFSOTI4NV9BTl9SRjJHNywgQVI5Mjg1X0FOX1JGMkc3X1BXRERCLCAwKTsKKwlSRUdfQ0xSX0JJVChhaCwgQVI5Mjg1X0FOX1JGMkc3LCBBUjkyODVfQU5fUkYyRzdfUFdEREIpOwogCS8qIDc4MjAsYjExLDAsIGVucGFjYWw9MCAqLwotCVJFR19STVdfRklFTEQoYWgsIEFSOTI4NV9BTl9SRjJHMSwgQVI5Mjg1X0FOX1JGMkcxX0VOUEFDQUwsIDApOworCVJFR19DTFJfQklUKGFoLCBBUjkyODVfQU5fUkYyRzEsIEFSOTI4NV9BTl9SRjJHMV9FTlBBQ0FMKTsKIAkvKiA3ODIwLGIyNSwxLCBwZHBhZHJ2MT0wICovCi0JUkVHX1JNV19GSUVMRChhaCwgQVI5Mjg1X0FOX1JGMkcxLCBBUjkyODVfQU5fUkYyRzFfUERQQURSVjEsIDApOworCVJFR19DTFJfQklUKGFoLCBBUjkyODVfQU5fUkYyRzEsIEFSOTI4NV9BTl9SRjJHMV9QRFBBRFJWMSk7CiAJLyogNzgyMCxiMjQsMCwgcGRwYWRydjI9MCAqLwotCVJFR19STVdfRklFTEQoYWgsIEFSOTI4NV9BTl9SRjJHMSwgQVI5Mjg1X0FOX1JGMkcxX1BEUEFEUlYyLCAwKTsKKwlSRUdfQ0xSX0JJVChhaCwgQVI5Mjg1X0FOX1JGMkcxLCBBUjkyODVfQU5fUkYyRzFfUERQQURSVjIpOwogCS8qIDc4MjAsYjIzLDAsIHBkcGFvdXQ9MCAqLwotCVJFR19STVdfRklFTEQoYWgsIEFSOTI4NV9BTl9SRjJHMSwgQVI5Mjg1X0FOX1JGMkcxX1BEUEFPVVQsIDApOworCVJFR19DTFJfQklUKGFoLCBBUjkyODVfQU5fUkYyRzEsIEFSOTI4NV9BTl9SRjJHMV9QRFBBT1VUKTsKIAkvKiA3ODNjLGIxNC0xNiw3LCBwYWRydmduMnRhYl8wPTcgKi8KIAlSRUdfUk1XX0ZJRUxEKGFoLCBBUjkyODVfQU5fUkYyRzgsIEFSOTI4NV9BTl9SRjJHOF9QQURSVkdOMlRBQjAsIDcpOwogCS8qCkBAIC00NzcsOCArNDc0LDkgQEAKIAkgKiBkb2VzIG5vdCBtYXR0ZXIgc2luY2Ugd2UgdHVybiBpdCBvZmYKIAkgKi8KIAlSRUdfUk1XX0ZJRUxEKGFoLCBBUjkyODVfQU5fUkYyRzcsIEFSOTI4NV9BTl9SRjJHN19QQURSVkdOMlRBQjAsIDApOwotCisJLyogNzgyOCwgYjAtMTEsIGNjb209ZmZmICovCiAJUkVHX1JNV19GSUVMRChhaCwgQVI5Mjg1X0FOX1JGMkczLCBBUjkyNzFfQU5fUkYyRzNfQ0NPTVAsIDB4ZmZmKTsKKwlSRUdfUk1XX0JVRkZFUl9GTFVTSChhaCk7CiAKIAkvKiBTZXQ6CiAJICogbG9jYWxtb2RlPTEsYm1vZGU9MSxibW9kZXJ4dHg9MSxzeW50aG9uPTEsCkBAIC00OTAsMTUgKzQ4OCwxNiBAQAogCiAJLyogZmluZCBvZmZfNl8xOyAqLwogCWZvciAoaSA9IDY7IGkgPiAwOyBpLS0pIHsKLQkJcmVnVmFsID0gUkVHX1JFQUQoYWgsIDB4NzgzNCk7CisJCXJlZ1ZhbCA9IFJFR19SRUFEKGFoLCBBUjkyODVfQU5fUkYyRzYpOwogCQlyZWdWYWwgfD0gKDEgPDwgKDIwICsgaSkpOwotCQlSRUdfV1JJVEUoYWgsIDB4NzgzNCwgcmVnVmFsKTsKKwkJUkVHX1dSSVRFKGFoLCBBUjkyODVfQU5fUkYyRzYsIHJlZ1ZhbCk7CiAJCXVkZWxheSgxKTsKIAkJLyogcmVnVmFsID0gUkVHX1JFQUQoYWgsIDB4NzgzNCk7ICovCiAJCXJlZ1ZhbCAmPSAofigweDEgPDwgKDIwICsgaSkpKTsKLQkJcmVnVmFsIHw9IChNUyhSRUdfUkVBRChhaCwgMHg3ODQwKSwgQVI5Mjg1X0FOX1JYVFhCQjFfU1BBUkU5KQorCQlyZWdWYWwgfD0gKE1TKFJFR19SRUFEKGFoLCBBUjkyODVfQU5fUkYyRzkpLAorCQkJICAgICAgQVI5Mjg1X0FOX1JYVFhCQjFfU1BBUkU5KQogCQkJICAgIDw8ICgyMCArIGkpKTsKLQkJUkVHX1dSSVRFKGFoLCAweDc4MzQsIHJlZ1ZhbCk7CisJCVJFR19XUklURShhaCwgQVI5Mjg1X0FOX1JGMkc2LCByZWdWYWwpOwogCX0KIAogCXJlZ1ZhbCA9IChyZWdWYWwgPj4gMjApICYgMHg3ZjsKQEAgLTUxNSwxNSArNTE0LDE1IEBACiAJCWFoLT5wYWNhbF9pbmZvLnByZXZfb2Zmc2V0ID0gcmVnVmFsOwogCX0KIAorCisJRU5BQkxFX1JFR19STVdfQlVGRkVSKGFoKTsKKwkvKiA3ODM0LCBiMT0xICovCisJUkVHX1NFVF9CSVQoYWgsIEFSOTI4NV9BTl9SRjJHNiwgMSA8PCAwKTsKKwkvKiA5ODA4LCBiMjc9MCAqLworCVJFR19DTFJfQklUKGFoLCAweDk4MDgsIDEgPDwgMjcpOworCVJFR19STVdfQlVGRkVSX0ZMVVNIKGFoKTsKKwogCUVOQUJMRV9SRUdXUklURV9CVUZGRVIoYWgpOwotCi0JcmVnVmFsID0gUkVHX1JFQUQoYWgsIDB4NzgzNCk7Ci0JcmVnVmFsIHw9IDB4MTsKLQlSRUdfV1JJVEUoYWgsIDB4NzgzNCwgcmVnVmFsKTsKLQlyZWdWYWwgPSBSRUdfUkVBRChhaCwgMHg5ODA4KTsKLQlyZWdWYWwgJj0gKH4oMHgxIDw8IDI3KSk7Ci0JUkVHX1dSSVRFKGFoLCAweDk4MDgsIHJlZ1ZhbCk7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShyZWdMaXN0KTsgaSsrKQogCQlSRUdfV1JJVEUoYWgsIHJlZ0xpc3RbaV1bMF0sIHJlZ0xpc3RbaV1bMV0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2FpYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19haWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGIxMTlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19haWMuYwpAQCAtMCwwICsxLDU5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBRdWFsY29tbSBBdGhlcm9zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaHcuaCIKKyNpbmNsdWRlICJody1vcHMuaCIKKyNpbmNsdWRlICJhcjkwMDNfbWNpLmgiCisjaW5jbHVkZSAiYXI5MDAzX2FpYy5oIgorI2luY2x1ZGUgImFyOTAwM19waHkuaCIKKyNpbmNsdWRlICJyZWdfYWljLmgiCisKK3N0YXRpYyBjb25zdCB1OCBjb21fYXR0X2RiX3RhYmxlW0FUSF9BSUNfTUFYX0NPTV9BVFRfREJfVEFCTEVdID0geworCTAsIDMsIDksIDE1LCAyMSwgMjcKK307CisKK3N0YXRpYyBjb25zdCB1MTYgYWljX2xpbl90YWJsZVtBVEhfQUlDX01BWF9BSUNfTElOX1RBQkxFXSA9IHsKKwk4MTkxLCA3MzAwLCA2NTA2LCA1Nzk5LCA1MTY4LCA0NjA2LCA0MTA1LCAzNjU5LAorCTMyNjEsIDI5MDYsIDI1OTAsIDIzMDksIDIwNTcsIDE4MzQsIDE2MzQsIDE0NTcsCisJMTI5OCwgMTE1NywgMTAzMSwgOTE5LAk4MTksICA3MzAsICA2NTEsICA1ODAsCisJNTE3LCAgNDYxLCAgNDExLCAgMzY2LAkzMjYsICAyOTEsICAyNTksICAyMzEsCisJMjA2LCAgMTgzLCAgMTYzLCAgMTQ2LAkxMzAsICAxMTYsICAxMDMsICA5MiwKKwk4MiwgICA3MywgICA2NSwJICA1OCwJNTIsICAgNDYsICAgNDEsCSAgMzcsCisJMzMsICAgMjksICAgMjYsCSAgMjMsCTIxLCAgIDE4LCAgIDE2LAkgIDE1LAorCTEzLCAgIDEyLCAgIDEwLAkgIDksCTgsICAgIDcsICAgIDcsCSAgNiwKKwk1LCAgICA1LCAgICA0LAkgIDQsCTMKK307CisKK3N0YXRpYyBib29sIGFyOTAwM19od19pc19haWNfZW5hYmxlZChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2lfaHcgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisKKwkvKgorCSAqIERpc2FibGUgQUlDIGZvciBub3csIHVudGlsIHdlIGhhdmUgYWxsIHRoZQorCSAqIEhXIGNvZGUgYW5kIHRoZSBkcml2ZXItbGF5ZXIgc3VwcG9ydCByZWFkeS4KKwkgKi8KKwlyZXR1cm4gZmFsc2U7CisKKwlpZiAobWNpX2h3LT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX0FJQykKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQxNl90IGFyOTAwM19haWNfZmluZF92YWxpZChzdHJ1Y3QgYXRoX2FpY19zcmFtX2luZm8gKmNhbF9zcmFtLAorCQkJCSAgICAgYm9vbCBkaXIsIHU4IGluZGV4KQoreworCWludDE2X3QgaTsKKworCWlmIChkaXIpIHsKKwkJZm9yIChpID0gaW5kZXggKyAxOyBpIDwgQVRIX0FJQ19NQVhfQlRfQ0hBTk5FTDsgaSsrKSB7CisJCQlpZiAoY2FsX3NyYW1baV0udmFsaWQpCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGkgPSBpbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAoY2FsX3NyYW1baV0udmFsaWQpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKGkgPj0gQVRIX0FJQ19NQVhfQlRfQ0hBTk5FTCkgfHwgKGkgPCAwKSkKKwkJaSA9IC0xOworCisJcmV0dXJuIGk7Cit9CisKKy8qCisgKiB0eXBlIDA6IGFpY19saW5fdGFibGUsIDE6IGNvbV9hdHRfZGJfdGFibGUKKyAqLworc3RhdGljIGludDE2X3QgYXI5MDAzX2FpY19maW5kX2luZGV4KHU4IHR5cGUsIGludDE2X3QgdmFsdWUpCit7CisJaW50MTZfdCBpID0gLTE7CisKKwlpZiAodHlwZSA9PSAwKSB7CisJCWZvciAoaSA9IEFUSF9BSUNfTUFYX0FJQ19MSU5fVEFCTEUgLSAxOyBpID49IDA7IGktLSkgeworCQkJaWYgKGFpY19saW5fdGFibGVbaV0gPj0gdmFsdWUpCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKHR5cGUgPT0gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVRIX0FJQ19NQVhfQ09NX0FUVF9EQl9UQUJMRTsgaSsrKSB7CisJCQlpZiAoY29tX2F0dF9kYl90YWJsZVtpXSA+IHZhbHVlKSB7CisJCQkJaS0tOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKGkgPj0gQVRIX0FJQ19NQVhfQ09NX0FUVF9EQl9UQUJMRSkKKwkJCWkgPSAtMTsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgYXI5MDAzX2FpY19nYWluX3RhYmxlKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXUzMiBhaWNfYXR0ZW5fd29yZFsxOV0sIGk7CisKKwkvKiBDb25maWcgTE5BIGdhaW4gZGlmZmVyZW5jZSAqLworCVJFR19XUklURShhaCwgQVJfUEhZX0JUX0NPRVhfNCwgMHgyYzIwMGEwMCk7CisJUkVHX1dSSVRFKGFoLCBBUl9QSFlfQlRfQ09FWF81LCAweDVjNGU0NDM4KTsKKworCS8qIFByb2dyYW0gZ2FpbiB0YWJsZSAqLworCWFpY19hdHRlbl93b3JkWzBdID0gKDB4MSAmIDB4ZikgPDwgMTQgfCAoMHgxZiAmIDB4MWYpIDw8IDkgfCAoMHgwICYgMHhmKSA8PCA1IHwKKwkJKDB4MWYgJiAweDFmKTsgLyogLTAxIGRCOiA0J2QxLCA1J2QzMSwgIDAwIGRCOiA0J2QwLCA1J2QzMSAqLworCWFpY19hdHRlbl93b3JkWzFdID0gKDB4MyAmIDB4ZikgPDwgMTQgfCAoMHgxZiAmIDB4MWYpIDw8IDkgfCAoMHgyICYgMHhmKSA8PCA1IHwKKwkJKDB4MWYgJiAweDFmKTsgLyogLTAzIGRCOiA0J2QzLCA1J2QzMSwgLTAyIGRCOiA0J2QyLCA1J2QzMSAqLworCWFpY19hdHRlbl93b3JkWzJdID0gKDB4NSAmIDB4ZikgPDwgMTQgfCAoMHgxZiAmIDB4MWYpIDw8IDkgfCAoMHg0ICYgMHhmKSA8PCA1IHwKKwkJKDB4MWYgJiAweDFmKTsgLyogLTA1IGRCOiA0J2Q1LCA1J2QzMSwgLTA0IGRCOiA0J2Q0LCA1J2QzMSAqLworCWFpY19hdHRlbl93b3JkWzNdID0gKDB4MSAmIDB4ZikgPDwgMTQgfCAoMHgxZSAmIDB4MWYpIDw8IDkgfCAoMHgwICYgMHhmKSA8PCA1IHwKKwkJKDB4MWUgJiAweDFmKTsgLyogLTA3IGRCOiA0J2QxLCA1J2QzMCwgLTA2IGRCOiA0J2QwLCA1J2QzMCAqLworCWFpY19hdHRlbl93b3JkWzRdID0gKDB4MyAmIDB4ZikgPDwgMTQgfCAoMHgxZSAmIDB4MWYpIDw8IDkgfCAoMHgyICYgMHhmKSA8PCA1IHwKKwkJKDB4MWUgJiAweDFmKTsgLyogLTA5IGRCOiA0J2QzLCA1J2QzMCwgLTA4IGRCOiA0J2QyLCA1J2QzMCAqLworCWFpY19hdHRlbl93b3JkWzVdID0gKDB4NSAmIDB4ZikgPDwgMTQgfCAoMHgxZSAmIDB4MWYpIDw8IDkgfCAoMHg0ICYgMHhmKSA8PCA1IHwKKwkJKDB4MWUgJiAweDFmKTsgLyogLTExIGRCOiA0J2Q1LCA1J2QzMCwgLTEwIGRCOiA0J2Q0LCA1J2QzMCAqLworCWFpY19hdHRlbl93b3JkWzZdID0gKDB4MSAmIDB4ZikgPDwgMTQgfCAoMHhmICYgMHgxZikgPDwgOSAgfCAoMHgwICYgMHhmKSA8PCA1IHwKKwkJKDB4ZiAmIDB4MWYpOyAgLyogLTEzIGRCOiA0J2QxLCA1J2QxNSwgLTEyIGRCOiA0J2QwLCA1J2QxNSAqLworCWFpY19hdHRlbl93b3JkWzddID0gKDB4MyAmIDB4ZikgPDwgMTQgfCAoMHhmICYgMHgxZikgPDwgOSAgfCAoMHgyICYgMHhmKSA8PCA1IHwKKwkJKDB4ZiAmIDB4MWYpOyAgLyogLTE1IGRCOiA0J2QzLCA1J2QxNSwgLTE0IGRCOiA0J2QyLCA1J2QxNSAqLworCWFpY19hdHRlbl93b3JkWzhdID0gKDB4NSAmIDB4ZikgPDwgMTQgfCAoMHhmICYgMHgxZikgPDwgOSAgfCAoMHg0ICYgMHhmKSA8PCA1IHwKKwkJKDB4ZiAmIDB4MWYpOyAgLyogLTE3IGRCOiA0J2Q1LCA1J2QxNSwgLTE2IGRCOiA0J2Q0LCA1J2QxNSAqLworCWFpY19hdHRlbl93b3JkWzldID0gKDB4MSAmIDB4ZikgPDwgMTQgfCAoMHg3ICYgMHgxZikgPDwgOSAgfCAoMHgwICYgMHhmKSA8PCA1IHwKKwkJKDB4NyAmIDB4MWYpOyAgLyogLTE5IGRCOiA0J2QxLCA1J2QwNywgLTE4IGRCOiA0J2QwLCA1J2QwNyAqLworCWFpY19hdHRlbl93b3JkWzEwXSA9ICgweDMgJiAweGYpIDw8IDE0IHwgKDB4NyAmIDB4MWYpIDw8IDkgIHwgKDB4MiAmIDB4ZikgPDwgNSB8CisJCSgweDcgJiAweDFmKTsgIC8qIC0yMSBkQjogNCdkMywgNSdkMDcsIC0yMCBkQjogNCdkMiwgNSdkMDcgKi8KKwlhaWNfYXR0ZW5fd29yZFsxMV0gPSAoMHg1ICYgMHhmKSA8PCAxNCB8ICgweDcgJiAweDFmKSA8PCA5ICB8ICgweDQgJiAweGYpIDw8IDUgfAorCQkoMHg3ICYgMHgxZik7ICAvKiAtMjMgZEI6IDQnZDUsIDUnZDA3LCAtMjIgZEI6IDQnZDQsIDUnZDA3ICovCisJYWljX2F0dGVuX3dvcmRbMTJdID0gKDB4NyAmIDB4ZikgPDwgMTQgfCAoMHg3ICYgMHgxZikgPDwgOSAgfCAoMHg2ICYgMHhmKSA8PCA1IHwKKwkJKDB4NyAmIDB4MWYpOyAgLyogLTI1IGRCOiA0J2Q3LCA1J2QwNywgLTI0IGRCOiA0J2Q2LCA1J2QwNyAqLworCWFpY19hdHRlbl93b3JkWzEzXSA9ICgweDMgJiAweGYpIDw8IDE0IHwgKDB4MyAmIDB4MWYpIDw8IDkgIHwgKDB4MiAmIDB4ZikgPDwgNSB8CisJCSgweDMgJiAweDFmKTsgIC8qIC0yNyBkQjogNCdkMywgNSdkMDMsIC0yNiBkQjogNCdkMiwgNSdkMDMgKi8KKwlhaWNfYXR0ZW5fd29yZFsxNF0gPSAoMHg1ICYgMHhmKSA8PCAxNCB8ICgweDMgJiAweDFmKSA8PCA5ICB8ICgweDQgJiAweGYpIDw8IDUgfAorCQkoMHgzICYgMHgxZik7ICAvKiAtMjkgZEI6IDQnZDUsIDUnZDAzLCAtMjggZEI6IDQnZDQsIDUnZDAzICovCisJYWljX2F0dGVuX3dvcmRbMTVdID0gKDB4MSAmIDB4ZikgPDwgMTQgfCAoMHgxICYgMHgxZikgPDwgOSAgfCAoMHgwICYgMHhmKSA8PCA1IHwKKwkJKDB4MSAmIDB4MWYpOyAgLyogLTMxIGRCOiA0J2QxLCA1J2QwMSwgLTMwIGRCOiA0J2QwLCA1J2QwMSAqLworCWFpY19hdHRlbl93b3JkWzE2XSA9ICgweDMgJiAweGYpIDw8IDE0IHwgKDB4MSAmIDB4MWYpIDw8IDkgIHwgKDB4MiAmIDB4ZikgPDwgNSB8CisJCSgweDEgJiAweDFmKTsgIC8qIC0zMyBkQjogNCdkMywgNSdkMDEsIC0zMiBkQjogNCdkMiwgNSdkMDEgKi8KKwlhaWNfYXR0ZW5fd29yZFsxN10gPSAoMHg1ICYgMHhmKSA8PCAxNCB8ICgweDEgJiAweDFmKSA8PCA5ICB8ICgweDQgJiAweGYpIDw8IDUgfAorCQkoMHgxICYgMHgxZik7ICAvKiAtMzUgZEI6IDQnZDUsIDUnZDAxLCAtMzQgZEI6IDQnZDQsIDUnZDAxICovCisJYWljX2F0dGVuX3dvcmRbMThdID0gKDB4NyAmIDB4ZikgPDwgMTQgfCAoMHgxICYgMHgxZikgPDwgOSAgfCAoMHg2ICYgMHhmKSA8PCA1IHwKKwkJKDB4MSAmIDB4MWYpOyAgLyogLTM3IGRCOiA0J2Q3LCA1J2QwMSwgLTM2IGRCOiA0J2Q2LCA1J2QwMSAqLworCisJLyogV3JpdGUgdG8gR2FpbiB0YWJsZSB3aXRoIGF1dG8gaW5jcmVtZW50IGVuYWJsZWQuICovCisJUkVHX1dSSVRFKGFoLCAoQVJfUEhZX0FJQ19TUkFNX0FERFJfQjAgKyAweDMwMDApLAorCQkgIChBVEhfQUlDX1NSQU1fQVVUT19JTkNSRU1FTlQgfAorCQkgICBBVEhfQUlDX1NSQU1fR0FJTl9UQUJMRV9PRkZTRVQpKTsKKworCWZvciAoaSA9IDA7IGkgPCAxOTsgaSsrKSB7CisJCVJFR19XUklURShhaCwgKEFSX1BIWV9BSUNfU1JBTV9EQVRBX0IwICsgMHgzMDAwKSwKKwkJCSAgYWljX2F0dGVuX3dvcmRbaV0pOworCX0KK30KKworc3RhdGljIHU4IGFyOTAwM19haWNfY2FsX3N0YXJ0KHN0cnVjdCBhdGhfaHcgKmFoLCB1OCBtaW5fdmFsaWRfY291bnQpCit7CisJc3RydWN0IGF0aDlrX2h3X2FpYyAqYWljID0gJmFoLT5idGNvZXhfaHcuYWljOworCWludCBpOworCisJLyogV3JpdGUgdG8gR2FpbiB0YWJsZSB3aXRoIGF1dG8gaW5jcmVtZW50IGVuYWJsZWQuICovCisJUkVHX1dSSVRFKGFoLCAoQVJfUEhZX0FJQ19TUkFNX0FERFJfQjAgKyAweDMwMDApLAorCQkgIChBVEhfQUlDX1NSQU1fQVVUT19JTkNSRU1FTlQgfAorCQkgICBBVEhfQUlDX1NSQU1fQ0FMX09GRlNFVCkpOworCisJZm9yIChpID0gMDsgaSA8IEFUSF9BSUNfTUFYX0JUX0NIQU5ORUw7IGkrKykgeworCQlSRUdfV1JJVEUoYWgsIChBUl9QSFlfQUlDX1NSQU1fREFUQV9CMCArIDB4MzAwMCksIDApOworCQlhaWMtPmFpY19zcmFtW2ldID0gMDsKKwl9CisKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9BSUNfQ1RSTF8wX0IwLAorCQkgIChTTSgwLCBBUl9QSFlfQUlDX01PTl9FTkFCTEUpIHwKKwkJICAgU00oMTI3LCBBUl9QSFlfQUlDX0NBTF9NQVhfSE9QX0NPVU5UKSB8CisJCSAgIFNNKG1pbl92YWxpZF9jb3VudCwgQVJfUEhZX0FJQ19DQUxfTUlOX1ZBTElEX0NPVU5UKSB8CisJCSAgIFNNKDM3LCBBUl9QSFlfQUlDX0ZfV0xBTikgfAorCQkgICBTTSgxLCBBUl9QSFlfQUlDX0NBTF9DSF9WQUxJRF9SRVNFVCkgfAorCQkgICBTTSgwLCBBUl9QSFlfQUlDX0NBTF9FTkFCTEUpIHwKKwkJICAgU00oMHg0MCwgQVJfUEhZX0FJQ19CVFRYX1BXUl9USFIpIHwKKwkJICAgU00oMCwgQVJfUEhZX0FJQ19FTkFCTEUpKSk7CisKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9BSUNfQ1RSTF8wX0IxLAorCQkgIChTTSgwLCBBUl9QSFlfQUlDX01PTl9FTkFCTEUpIHwKKwkJICAgU00oMSwgQVJfUEhZX0FJQ19DQUxfQ0hfVkFMSURfUkVTRVQpIHwKKwkJICAgU00oMCwgQVJfUEhZX0FJQ19DQUxfRU5BQkxFKSB8CisJCSAgIFNNKDB4NDAsIEFSX1BIWV9BSUNfQlRUWF9QV1JfVEhSKSB8CisJCSAgIFNNKDAsIEFSX1BIWV9BSUNfRU5BQkxFKSkpOworCisJUkVHX1dSSVRFKGFoLCBBUl9QSFlfQUlDX0NUUkxfMV9CMCwKKwkJICAoU00oOCwgQVJfUEhZX0FJQ19DQUxfQlRfUkVGX0RFTEFZKSB8CisJCSAgIFNNKDAsIEFSX1BIWV9BSUNfQlRfSURMRV9DRkcpIHwKKwkJICAgU00oMSwgQVJfUEhZX0FJQ19TVERCWV9DT05EKSB8CisJCSAgIFNNKDM3LCBBUl9QSFlfQUlDX1NUREJZX1JPVF9BVFRfREIpIHwKKwkJICAgU00oNSwgQVJfUEhZX0FJQ19TVERCWV9DT01fQVRUX0RCKSB8CisJCSAgIFNNKDE1LCBBUl9QSFlfQUlDX1JTU0lfTUFYKSB8CisJCSAgIFNNKDAsIEFSX1BIWV9BSUNfUlNTSV9NSU4pKSk7CisKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9BSUNfQ1RSTF8xX0IxLAorCQkgIChTTSgxNSwgQVJfUEhZX0FJQ19SU1NJX01BWCkgfAorCQkgICBTTSgwLCBBUl9QSFlfQUlDX1JTU0lfTUlOKSkpOworCisJUkVHX1dSSVRFKGFoLCBBUl9QSFlfQUlDX0NUUkxfMl9CMCwKKwkJICAoU00oNDQsIEFSX1BIWV9BSUNfUkFESU9fREVMQVkpIHwKKwkJICAgU00oOCwgQVJfUEhZX0FJQ19DQUxfU1RFUF9TSVpFX0NPUlIpIHwKKwkJICAgU00oMTIsIEFSX1BIWV9BSUNfQ0FMX1JPVF9JRFhfQ09SUikgfAorCQkgICBTTSgyLCBBUl9QSFlfQUlDX0NBTF9DT05WX0NIRUNLX0ZBQ1RPUikgfAorCQkgICBTTSg1LCBBUl9QSFlfQUlDX1JPVF9JRFhfQ09VTlRfTUFYKSB8CisJCSAgIFNNKDAsIEFSX1BIWV9BSUNfQ0FMX1NZTlRIX1RPR0dMRSkgfAorCQkgICBTTSgwLCBBUl9QSFlfQUlDX0NBTF9TWU5USF9BRlRFUl9CVFJYKSB8CisJCSAgIFNNKDIwMCwgQVJfUEhZX0FJQ19DQUxfU1lOVEhfU0VUVExJTkcpKSk7CisKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9BSUNfQ1RSTF8zX0IwLAorCQkgIChTTSgyLCBBUl9QSFlfQUlDX01PTl9NQVhfSE9QX0NPVU5UKSB8CisJCSAgIFNNKDEsIEFSX1BIWV9BSUNfTU9OX01JTl9TVEFMRV9DT1VOVCkgfAorCQkgICBTTSgxLCBBUl9QSFlfQUlDX01PTl9QV1JfRVNUX0xPTkcpIHwKKwkJICAgU00oMiwgQVJfUEhZX0FJQ19NT05fUERfVEFMTFlfU0NBTElORykgfAorCQkgICBTTSgxMCwgQVJfUEhZX0FJQ19NT05fUEVSRl9USFIpIHwKKwkJICAgU00oMiwgQVJfUEhZX0FJQ19DQUxfVEFSR0VUX01BR19TRVRUSU5HKSB8CisJCSAgIFNNKDEsIEFSX1BIWV9BSUNfQ0FMX1BFUkZfQ0hFQ0tfRkFDVE9SKSB8CisJCSAgIFNNKDEsIEFSX1BIWV9BSUNfQ0FMX1BXUl9FU1RfTE9ORykpKTsKKworCVJFR19XUklURShhaCwgQVJfUEhZX0FJQ19DVFJMXzRfQjAsCisJCSAgKFNNKDIsIEFSX1BIWV9BSUNfQ0FMX1JPVF9BVFRfREJfRVNUX0lTTykgfAorCQkgICBTTSgzLCBBUl9QSFlfQUlDX0NBTF9DT01fQVRUX0RCX0VTVF9JU08pIHwKKwkJICAgU00oMCwgQVJfUEhZX0FJQ19DQUxfSVNPX0VTVF9JTklUX1NFVFRJTkcpIHwKKwkJICAgU00oMiwgQVJfUEhZX0FJQ19DQUxfQ09NX0FUVF9EQl9CQUNLT0ZGKSB8CisJCSAgIFNNKDEsIEFSX1BIWV9BSUNfQ0FMX0NPTV9BVFRfREJfRklYRUQpKSk7CisKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9BSUNfQ1RSTF80X0IxLAorCQkgIChTTSgyLCBBUl9QSFlfQUlDX0NBTF9ST1RfQVRUX0RCX0VTVF9JU08pIHwKKwkJICAgU00oMywgQVJfUEhZX0FJQ19DQUxfQ09NX0FUVF9EQl9FU1RfSVNPKSB8CisJCSAgIFNNKDAsIEFSX1BIWV9BSUNfQ0FMX0lTT19FU1RfSU5JVF9TRVRUSU5HKSB8CisJCSAgIFNNKDIsIEFSX1BIWV9BSUNfQ0FMX0NPTV9BVFRfREJfQkFDS09GRikgfAorCQkgICBTTSgxLCBBUl9QSFlfQUlDX0NBTF9DT01fQVRUX0RCX0ZJWEVEKSkpOworCisJYXI5MDAzX2FpY19nYWluX3RhYmxlKGFoKTsKKworCS8qIE5lZWQgdG8gZW5hYmxlIEFJQyByZWZlcmVuY2Ugc2lnbmFsIGluIEJUIG1vZGVtLiAqLworCVJFR19XUklURShhaCwgQVRIX0FJQ19CVF9KVVBJVEVSX0NUUkwsCisJCSAgKFJFR19SRUFEKGFoLCBBVEhfQUlDX0JUX0pVUElURVJfQ1RSTCkgfAorCQkgICBBVEhfQUlDX0JUX0FJQ19FTkFCTEUpKTsKKworCWFpYy0+YWljX2NhbF9zdGFydF90aW1lID0gUkVHX1JFQUQoYWgsIEFSX1RTRl9MMzIpOworCisJLyogU3RhcnQgY2FsaWJyYXRpb24gKi8KKwlSRUdfQ0xSX0JJVChhaCwgQVJfUEhZX0FJQ19DVFJMXzBfQjEsIEFSX1BIWV9BSUNfQ0FMX0VOQUJMRSk7CisJUkVHX1NFVF9CSVQoYWgsIEFSX1BIWV9BSUNfQ1RSTF8wX0IxLCBBUl9QSFlfQUlDX0NBTF9DSF9WQUxJRF9SRVNFVCk7CisJUkVHX1NFVF9CSVQoYWgsIEFSX1BIWV9BSUNfQ1RSTF8wX0IxLCBBUl9QSFlfQUlDX0NBTF9FTkFCTEUpOworCisJYWljLT5haWNfY2FsZWRfY2hhbiA9IDA7CisJYWljLT5haWNfY2FsX3N0YXRlID0gQUlDX0NBTF9TVEFURV9TVEFSVEVEOworCisJcmV0dXJuIGFpYy0+YWljX2NhbF9zdGF0ZTsKK30KKworc3RhdGljIGJvb2wgYXI5MDAzX2FpY19jYWxfcG9zdF9wcm9jZXNzKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGg5a19od19haWMgKmFpYyA9ICZhaC0+YnRjb2V4X2h3LmFpYzsKKwlzdHJ1Y3QgYXRoX2FpY19zcmFtX2luZm8gY2FsX3NyYW1bQVRIX0FJQ19NQVhfQlRfQ0hBTk5FTF07CisJc3RydWN0IGF0aF9haWNfb3V0X2luZm8gYWljX3NyYW1bQVRIX0FJQ19NQVhfQlRfQ0hBTk5FTF07CisJdTMyIGRpcl9wYXRoX2dhaW5faWR4LCBxdWFkX3BhdGhfZ2Fpbl9pZHgsIHZhbHVlOworCXUzMiBmaXhlZF9jb21fYXR0X2RiOworCWludDhfdCBkaXJfcGF0aF9zaWduLCBxdWFkX3BhdGhfc2lnbjsKKwlpbnQxNl90IGk7CisJYm9vbCByZXQgPSB0cnVlOworCisJbWVtc2V0KCZjYWxfc3JhbSwgMCwgc2l6ZW9mKGNhbF9zcmFtKSk7CisJbWVtc2V0KCZhaWNfc3JhbSwgMCwgc2l6ZW9mKGFpY19zcmFtKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRIX0FJQ19NQVhfQlRfQ0hBTk5FTDsgaSsrKSB7CisJCXZhbHVlID0gYWljLT5haWNfc3JhbVtpXTsKKworCQljYWxfc3JhbVtpXS52YWxpZCA9CisJCQlNUyh2YWx1ZSwgQVJfUEhZX0FJQ19TUkFNX1ZBTElEKTsKKwkJY2FsX3NyYW1baV0ucm90X3F1YWRfYXR0X2RiID0KKwkJCU1TKHZhbHVlLCBBUl9QSFlfQUlDX1NSQU1fUk9UX1FVQURfQVRUX0RCKTsKKwkJY2FsX3NyYW1baV0udmdhX3F1YWRfc2lnbiA9CisJCQlNUyh2YWx1ZSwgQVJfUEhZX0FJQ19TUkFNX1ZHQV9RVUFEX1NJR04pOworCQljYWxfc3JhbVtpXS5yb3RfZGlyX2F0dF9kYiA9CisJCQlNUyh2YWx1ZSwgQVJfUEhZX0FJQ19TUkFNX1JPVF9ESVJfQVRUX0RCKTsKKwkJY2FsX3NyYW1baV0udmdhX2Rpcl9zaWduID0KKwkJCU1TKHZhbHVlLCBBUl9QSFlfQUlDX1NSQU1fVkdBX0RJUl9TSUdOKTsKKwkJY2FsX3NyYW1baV0uY29tX2F0dF82ZGIgPQorCQkJTVModmFsdWUsIEFSX1BIWV9BSUNfU1JBTV9DT01fQVRUXzZEQik7CisKKwkJaWYgKGNhbF9zcmFtW2ldLnZhbGlkKSB7CisJCQlkaXJfcGF0aF9nYWluX2lkeCA9IGNhbF9zcmFtW2ldLnJvdF9kaXJfYXR0X2RiICsKKwkJCQljb21fYXR0X2RiX3RhYmxlW2NhbF9zcmFtW2ldLmNvbV9hdHRfNmRiXTsKKwkJCXF1YWRfcGF0aF9nYWluX2lkeCA9IGNhbF9zcmFtW2ldLnJvdF9xdWFkX2F0dF9kYiArCisJCQkJY29tX2F0dF9kYl90YWJsZVtjYWxfc3JhbVtpXS5jb21fYXR0XzZkYl07CisKKwkJCWRpcl9wYXRoX3NpZ24gPSAoY2FsX3NyYW1baV0udmdhX2Rpcl9zaWduKSA/IDEgOiAtMTsKKwkJCXF1YWRfcGF0aF9zaWduID0gKGNhbF9zcmFtW2ldLnZnYV9xdWFkX3NpZ24pID8gMSA6IC0xOworCisJCQlhaWNfc3JhbVtpXS5kaXJfcGF0aF9nYWluX2xpbiA9IGRpcl9wYXRoX3NpZ24gKgorCQkJCWFpY19saW5fdGFibGVbZGlyX3BhdGhfZ2Fpbl9pZHhdOworCQkJYWljX3NyYW1baV0ucXVhZF9wYXRoX2dhaW5fbGluID0gcXVhZF9wYXRoX3NpZ24gKgorCQkJCWFpY19saW5fdGFibGVbcXVhZF9wYXRoX2dhaW5faWR4XTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBVEhfQUlDX01BWF9CVF9DSEFOTkVMOyBpKyspIHsKKwkJaW50MTZfdCBzdGFydF9pZHgsIGVuZF9pZHg7CisKKwkJaWYgKGNhbF9zcmFtW2ldLnZhbGlkKQorCQkJY29udGludWU7CisKKwkJc3RhcnRfaWR4ID0gYXI5MDAzX2FpY19maW5kX3ZhbGlkKGNhbF9zcmFtLCAwLCBpKTsKKwkJZW5kX2lkeCA9IGFyOTAwM19haWNfZmluZF92YWxpZChjYWxfc3JhbSwgMSwgaSk7CisKKwkJaWYgKHN0YXJ0X2lkeCA8IDApIHsKKwkJCS8qIGV4dHJhcG9sYXRpb24gKi8KKwkJCXN0YXJ0X2lkeCA9IGVuZF9pZHg7CisJCQllbmRfaWR4ID0gYXI5MDAzX2FpY19maW5kX3ZhbGlkKGNhbF9zcmFtLCAxLCBzdGFydF9pZHgpOworCisJCQlpZiAoZW5kX2lkeCA8IDApIHsKKwkJCQlyZXQgPSBmYWxzZTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJYWljX3NyYW1baV0uZGlyX3BhdGhfZ2Fpbl9saW4gPQorCQkJCSgoYWljX3NyYW1bc3RhcnRfaWR4XS5kaXJfcGF0aF9nYWluX2xpbiAtCisJCQkJICBhaWNfc3JhbVtlbmRfaWR4XS5kaXJfcGF0aF9nYWluX2xpbikgKgorCQkJCSAoc3RhcnRfaWR4IC0gaSkgKyAoKGVuZF9pZHggLSBpKSA+PiAxKSkgLworCQkJCShlbmRfaWR4IC0gaSkgKworCQkJCWFpY19zcmFtW3N0YXJ0X2lkeF0uZGlyX3BhdGhfZ2Fpbl9saW47CisJCQlhaWNfc3JhbVtpXS5xdWFkX3BhdGhfZ2Fpbl9saW4gPQorCQkJCSgoYWljX3NyYW1bc3RhcnRfaWR4XS5xdWFkX3BhdGhfZ2Fpbl9saW4gLQorCQkJCSAgYWljX3NyYW1bZW5kX2lkeF0ucXVhZF9wYXRoX2dhaW5fbGluKSAqCisJCQkJIChzdGFydF9pZHggLSBpKSArICgoZW5kX2lkeCAtIGkpID4+IDEpKSAvCisJCQkJKGVuZF9pZHggLSBpKSArCisJCQkJYWljX3NyYW1bc3RhcnRfaWR4XS5xdWFkX3BhdGhfZ2Fpbl9saW47CisJCX0KKworCQlpZiAoZW5kX2lkeCA8IDApIHsKKwkJCS8qIGV4dHJhcG9sYXRpb24gKi8KKwkJCWVuZF9pZHggPSBhcjkwMDNfYWljX2ZpbmRfdmFsaWQoY2FsX3NyYW0sIDAsIHN0YXJ0X2lkeCk7CisKKwkJCWlmIChlbmRfaWR4IDwgMCkgeworCQkJCXJldCA9IGZhbHNlOworCQkJCWJyZWFrOworCQkJfQorCisJCQlhaWNfc3JhbVtpXS5kaXJfcGF0aF9nYWluX2xpbiA9CisJCQkJKChhaWNfc3JhbVtzdGFydF9pZHhdLmRpcl9wYXRoX2dhaW5fbGluIC0KKwkJCQkgIGFpY19zcmFtW2VuZF9pZHhdLmRpcl9wYXRoX2dhaW5fbGluKSAqCisJCQkJIChpIC0gc3RhcnRfaWR4KSArICgoc3RhcnRfaWR4IC0gZW5kX2lkeCkgPj4gMSkpIC8KKwkJCQkoc3RhcnRfaWR4IC0gZW5kX2lkeCkgKworCQkJCWFpY19zcmFtW3N0YXJ0X2lkeF0uZGlyX3BhdGhfZ2Fpbl9saW47CisJCQlhaWNfc3JhbVtpXS5xdWFkX3BhdGhfZ2Fpbl9saW4gPQorCQkJCSgoYWljX3NyYW1bc3RhcnRfaWR4XS5xdWFkX3BhdGhfZ2Fpbl9saW4gLQorCQkJCSAgYWljX3NyYW1bZW5kX2lkeF0ucXVhZF9wYXRoX2dhaW5fbGluKSAqCisJCQkJIChpIC0gc3RhcnRfaWR4KSArICgoc3RhcnRfaWR4IC0gZW5kX2lkeCkgPj4gMSkpIC8KKwkJCQkoc3RhcnRfaWR4IC0gZW5kX2lkeCkgKworCQkJCWFpY19zcmFtW3N0YXJ0X2lkeF0ucXVhZF9wYXRoX2dhaW5fbGluOworCisJCX0gZWxzZSBpZiAoc3RhcnRfaWR4ID49IDApeworCQkJLyogaW50ZXJwb2xhdGlvbiAqLworCQkJYWljX3NyYW1baV0uZGlyX3BhdGhfZ2Fpbl9saW4gPQorCQkJCSgoKGVuZF9pZHggLSBpKSAqIGFpY19zcmFtW3N0YXJ0X2lkeF0uZGlyX3BhdGhfZ2Fpbl9saW4pICsKKwkJCQkgKChpIC0gc3RhcnRfaWR4KSAqIGFpY19zcmFtW2VuZF9pZHhdLmRpcl9wYXRoX2dhaW5fbGluKSArCisJCQkJICgoZW5kX2lkeCAtIHN0YXJ0X2lkeCkgPj4gMSkpIC8KKwkJCQkoZW5kX2lkeCAtIHN0YXJ0X2lkeCk7CisJCQlhaWNfc3JhbVtpXS5xdWFkX3BhdGhfZ2Fpbl9saW4gPQorCQkJCSgoKGVuZF9pZHggLSBpKSAqIGFpY19zcmFtW3N0YXJ0X2lkeF0ucXVhZF9wYXRoX2dhaW5fbGluKSArCisJCQkJICgoaSAtIHN0YXJ0X2lkeCkgKiBhaWNfc3JhbVtlbmRfaWR4XS5xdWFkX3BhdGhfZ2Fpbl9saW4pICsKKwkJCQkgKChlbmRfaWR4IC0gc3RhcnRfaWR4KSA+PiAxKSkvCisJCQkJKGVuZF9pZHggLSBzdGFydF9pZHgpOworCQl9CisJfQorCisJLyogRnJvbSBkaXIvcXVhZF9wYXRoX2dhaW5fbGluIHRvIHNyYW0uICovCisJaSA9IGFyOTAwM19haWNfZmluZF92YWxpZChjYWxfc3JhbSwgMSwgMCk7CisJaWYgKGkgPCAwKSB7CisJCWkgPSAwOworCQlyZXQgPSBmYWxzZTsKKwl9CisJZml4ZWRfY29tX2F0dF9kYiA9IGNvbV9hdHRfZGJfdGFibGVbY2FsX3NyYW1baV0uY29tX2F0dF82ZGJdOworCisJZm9yIChpID0gMDsgaSA8IEFUSF9BSUNfTUFYX0JUX0NIQU5ORUw7IGkrKykgeworCQlpbnQxNl90IHJvdF9kaXJfcGF0aF9hdHRfZGIsIHJvdF9xdWFkX3BhdGhfYXR0X2RiOworCisJCWFpY19zcmFtW2ldLnNyYW0udmdhX2Rpcl9zaWduID0KKwkJCShhaWNfc3JhbVtpXS5kaXJfcGF0aF9nYWluX2xpbiA+PSAwKSA/IDEgOiAwOworCQlhaWNfc3JhbVtpXS5zcmFtLnZnYV9xdWFkX3NpZ249CisJCQkoYWljX3NyYW1baV0ucXVhZF9wYXRoX2dhaW5fbGluID49IDApID8gMSA6IDA7CisKKwkJcm90X2Rpcl9wYXRoX2F0dF9kYiA9CisJCQlhcjkwMDNfYWljX2ZpbmRfaW5kZXgoMCwgYWJzKGFpY19zcmFtW2ldLmRpcl9wYXRoX2dhaW5fbGluKSkgLQorCQkJZml4ZWRfY29tX2F0dF9kYjsKKwkJcm90X3F1YWRfcGF0aF9hdHRfZGIgPQorCQkJYXI5MDAzX2FpY19maW5kX2luZGV4KDAsIGFicyhhaWNfc3JhbVtpXS5xdWFkX3BhdGhfZ2Fpbl9saW4pKSAtCisJCQlmaXhlZF9jb21fYXR0X2RiOworCisJCWFpY19zcmFtW2ldLnNyYW0uY29tX2F0dF82ZGIgPQorCQkJYXI5MDAzX2FpY19maW5kX2luZGV4KDEsIGZpeGVkX2NvbV9hdHRfZGIpOworCisJCWFpY19zcmFtW2ldLnNyYW0udmFsaWQgPSAxOworCisJCWFpY19zcmFtW2ldLnNyYW0ucm90X2Rpcl9hdHRfZGIgPQorCQkJbWluKG1heChyb3RfZGlyX3BhdGhfYXR0X2RiLAorCQkJCShpbnQxNl90KUFUSF9BSUNfTUlOX1JPVF9ESVJfQVRUX0RCKSwKKwkJCSAgICBBVEhfQUlDX01BWF9ST1RfRElSX0FUVF9EQik7CisJCWFpY19zcmFtW2ldLnNyYW0ucm90X3F1YWRfYXR0X2RiID0KKwkJCW1pbihtYXgocm90X3F1YWRfcGF0aF9hdHRfZGIsCisJCQkJKGludDE2X3QpQVRIX0FJQ19NSU5fUk9UX1FVQURfQVRUX0RCKSwKKwkJCSAgICBBVEhfQUlDX01BWF9ST1RfUVVBRF9BVFRfREIpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBVEhfQUlDX01BWF9CVF9DSEFOTkVMOyBpKyspIHsKKwkJYWljLT5haWNfc3JhbVtpXSA9IChTTShhaWNfc3JhbVtpXS5zcmFtLnZnYV9kaXJfc2lnbiwKKwkJCQkgICAgICAgQVJfUEhZX0FJQ19TUkFNX1ZHQV9ESVJfU0lHTikgfAorCQkJCSAgICBTTShhaWNfc3JhbVtpXS5zcmFtLnZnYV9xdWFkX3NpZ24sCisJCQkJICAgICAgIEFSX1BIWV9BSUNfU1JBTV9WR0FfUVVBRF9TSUdOKSB8CisJCQkJICAgIFNNKGFpY19zcmFtW2ldLnNyYW0uY29tX2F0dF82ZGIsCisJCQkJICAgICAgIEFSX1BIWV9BSUNfU1JBTV9DT01fQVRUXzZEQikgfAorCQkJCSAgICBTTShhaWNfc3JhbVtpXS5zcmFtLnZhbGlkLAorCQkJCSAgICAgICBBUl9QSFlfQUlDX1NSQU1fVkFMSUQpIHwKKwkJCQkgICAgU00oYWljX3NyYW1baV0uc3JhbS5yb3RfZGlyX2F0dF9kYiwKKwkJCQkgICAgICAgQVJfUEhZX0FJQ19TUkFNX1JPVF9ESVJfQVRUX0RCKSB8CisJCQkJICAgIFNNKGFpY19zcmFtW2ldLnNyYW0ucm90X3F1YWRfYXR0X2RiLAorCQkJCSAgICAgICBBUl9QSFlfQUlDX1NSQU1fUk9UX1FVQURfQVRUX0RCKSk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXI5MDAzX2FpY19jYWxfZG9uZShzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfYWljICphaWMgPSAmYWgtPmJ0Y29leF9ody5haWM7CisKKwkvKiBEaXNhYmxlIEFJQyByZWZlcmVuY2Ugc2lnbmFsIGluIEJUIG1vZGVtLiAqLworCVJFR19XUklURShhaCwgQVRIX0FJQ19CVF9KVVBJVEVSX0NUUkwsCisJCSAgKFJFR19SRUFEKGFoLCBBVEhfQUlDX0JUX0pVUElURVJfQ1RSTCkgJgorCQkgICB+QVRIX0FJQ19CVF9BSUNfRU5BQkxFKSk7CisKKwlpZiAoYXI5MDAzX2FpY19jYWxfcG9zdF9wcm9jZXNzKGFoKSkKKwkJYWljLT5haWNfY2FsX3N0YXRlID0gQUlDX0NBTF9TVEFURV9ET05FOworCWVsc2UKKwkJYWljLT5haWNfY2FsX3N0YXRlID0gQUlDX0NBTF9TVEFURV9FUlJPUjsKK30KKworc3RhdGljIHU4IGFyOTAwM19haWNfY2FsX2NvbnRpbnVlKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIGNhbF9vbmNlKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaV9odyA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwlzdHJ1Y3QgYXRoOWtfaHdfYWljICphaWMgPSAmYWgtPmJ0Y29leF9ody5haWM7CisJaW50IGksIG51bV9jaGFuOworCisJbnVtX2NoYW4gPSBNUyhtY2lfaHctPmNvbmZpZywgQVRIX01DSV9DT05GSUdfQUlDX0NBTF9OVU1fQ0hBTik7CisKKwlpZiAoIW51bV9jaGFuKSB7CisJCWFpYy0+YWljX2NhbF9zdGF0ZSA9IEFJQ19DQUxfU1RBVEVfRVJST1I7CisJCXJldHVybiBhaWMtPmFpY19jYWxfc3RhdGU7CisJfQorCisJaWYgKGNhbF9vbmNlKSB7CisJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisJCQlpZiAoKFJFR19SRUFEKGFoLCBBUl9QSFlfQUlDX0NUUkxfMF9CMSkgJgorCQkJICAgICBBUl9QSFlfQUlDX0NBTF9FTkFCTEUpID09IDApCisJCQkJYnJlYWs7CisKKwkJCXVkZWxheSgxMDApOworCQl9CisJfQorCisJLyoKKwkgKiBVc2UgQVJfUEhZX0FJQ19DQUxfRU5BQkxFIGJpdCBpbnN0ZWFkIG9mIEFSX1BIWV9BSUNfQ0FMX0RPTkUuCisJICogU29tZXRpbWVzIENBTF9ET05FIGJpdCBpcyBub3QgYXNzZXJ0ZWQuCisJICovCisJaWYgKChSRUdfUkVBRChhaCwgQVJfUEhZX0FJQ19DVFJMXzBfQjEpICYKKwkgICAgIEFSX1BIWV9BSUNfQ0FMX0VOQUJMRSkgIT0gMCkgeworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiQUlDIGNhbCBpcyBub3QgZG9uZSBhZnRlciA0MG1zIik7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlSRUdfV1JJVEUoYWgsIEFSX1BIWV9BSUNfU1JBTV9BRERSX0IxLAorCQkgIChBVEhfQUlDX1NSQU1fQ0FMX09GRlNFVCB8IEFUSF9BSUNfU1JBTV9BVVRPX0lOQ1JFTUVOVCkpOworCisJZm9yIChpID0gMDsgaSA8IEFUSF9BSUNfTUFYX0JUX0NIQU5ORUw7IGkrKykgeworCQl1MzIgdmFsdWU7CisKKwkJdmFsdWUgPSBSRUdfUkVBRChhaCwgQVJfUEhZX0FJQ19TUkFNX0RBVEFfQjEpOworCisJCWlmICh2YWx1ZSAmIDB4MDEpIHsKKwkJCWlmIChhaWMtPmFpY19zcmFtW2ldID09IDApCisJCQkJYWljLT5haWNfY2FsZWRfY2hhbisrOworCisJCQlhaWMtPmFpY19zcmFtW2ldID0gdmFsdWU7CisKKwkJCWlmICghY2FsX29uY2UpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKGFpYy0+YWljX2NhbGVkX2NoYW4gPj0gbnVtX2NoYW4pIHx8IGNhbF9vbmNlKSB7CisJCWFyOTAwM19haWNfY2FsX2RvbmUoYWgpOworCX0gZWxzZSB7CisJCS8qIFN0YXJ0IGNhbGlicmF0aW9uICovCisJCVJFR19DTFJfQklUKGFoLCBBUl9QSFlfQUlDX0NUUkxfMF9CMSwgQVJfUEhZX0FJQ19DQUxfRU5BQkxFKTsKKwkJUkVHX1NFVF9CSVQoYWgsIEFSX1BIWV9BSUNfQ1RSTF8wX0IxLAorCQkJICAgIEFSX1BIWV9BSUNfQ0FMX0NIX1ZBTElEX1JFU0VUKTsKKwkJUkVHX1NFVF9CSVQoYWgsIEFSX1BIWV9BSUNfQ1RSTF8wX0IxLCBBUl9QSFlfQUlDX0NBTF9FTkFCTEUpOworCX0KK2V4aXQ6CisJcmV0dXJuIGFpYy0+YWljX2NhbF9zdGF0ZTsKKworfQorCit1OCBhcjkwMDNfYWljX2NhbGlicmF0aW9uKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGg5a19od19haWMgKmFpYyA9ICZhaC0+YnRjb2V4X2h3LmFpYzsKKwl1OCBjYWxfcmV0ID0gQUlDX0NBTF9TVEFURV9FUlJPUjsKKworCXN3aXRjaCAoYWljLT5haWNfY2FsX3N0YXRlKSB7CisJY2FzZSBBSUNfQ0FMX1NUQVRFX0lETEU6CisJCWNhbF9yZXQgPSBhcjkwMDNfYWljX2NhbF9zdGFydChhaCwgMSk7CisJCWJyZWFrOworCWNhc2UgQUlDX0NBTF9TVEFURV9TVEFSVEVEOgorCQljYWxfcmV0ID0gYXI5MDAzX2FpY19jYWxfY29udGludWUoYWgsIGZhbHNlKTsKKwkJYnJlYWs7CisJY2FzZSBBSUNfQ0FMX1NUQVRFX0RPTkU6CisJCWNhbF9yZXQgPSBBSUNfQ0FMX1NUQVRFX0RPTkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBjYWxfcmV0OworfQorCit1OCBhcjkwMDNfYWljX3N0YXJ0X25vcm1hbChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfYWljICphaWMgPSAmYWgtPmJ0Y29leF9ody5haWM7CisJaW50MTZfdCBpOworCisJaWYgKGFpYy0+YWljX2NhbF9zdGF0ZSAhPSBBSUNfQ0FMX1NUQVRFX0RPTkUpCisJCXJldHVybiAxOworCisJYXI5MDAzX2FpY19nYWluX3RhYmxlKGFoKTsKKworCVJFR19XUklURShhaCwgQVJfUEhZX0FJQ19TUkFNX0FERFJfQjEsIEFUSF9BSUNfU1JBTV9BVVRPX0lOQ1JFTUVOVCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVRIX0FJQ19NQVhfQlRfQ0hBTk5FTDsgaSsrKSB7CisJCVJFR19XUklURShhaCwgQVJfUEhZX0FJQ19TUkFNX0RBVEFfQjEsIGFpYy0+YWljX3NyYW1baV0pOworCX0KKworCS8qIEZJWE1FOiBSZXBsYWNlIHRoZXNlIHdpdGggcHJvcGVyIHJlZ2lzdGVyIG5hbWVzICovCisJUkVHX1dSSVRFKGFoLCAweGE2YjAsIDB4ODApOworCVJFR19XUklURShhaCwgMHhhNmI0LCAweDViMmRmMCk7CisJUkVHX1dSSVRFKGFoLCAweGE2YjgsIDB4MTA3NjJjYzgpOworCVJFR19XUklURShhaCwgMHhhNmJjLCAweDEyMTlhNGIpOworCVJFR19XUklURShhaCwgMHhhNmMwLCAweDFlMDEpOworCVJFR19XUklURShhaCwgMHhiNmI0LCAweGYwKTsKKwlSRUdfV1JJVEUoYWgsIDB4YjZjMCwgMHgxZTAxKTsKKwlSRUdfV1JJVEUoYWgsIDB4YjZiMCwgMHg4MSk7CisJUkVHX1dSSVRFKGFoLCBBUl9QSFlfNjVOTV9DSDFfUlhUWDQsIDB4NDAwMDAwMDApOworCisJYWljLT5haWNfZW5hYmxlZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKK30KKwordTggYXI5MDAzX2FpY19jYWxfcmVzZXQoc3RydWN0IGF0aF9odyAqYWgpCit7CisJc3RydWN0IGF0aDlrX2h3X2FpYyAqYWljID0gJmFoLT5idGNvZXhfaHcuYWljOworCisJYWljLT5haWNfY2FsX3N0YXRlID0gQUlDX0NBTF9TVEFURV9JRExFOworCXJldHVybiBhaWMtPmFpY19jYWxfc3RhdGU7Cit9CisKK3U4IGFyOTAwM19haWNfY2FsaWJyYXRpb25fc2luZ2xlKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaV9odyA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1OCBjYWxfcmV0OworCWludCBudW1fY2hhbjsKKworCW51bV9jaGFuID0gTVMobWNpX2h3LT5jb25maWcsIEFUSF9NQ0lfQ09ORklHX0FJQ19DQUxfTlVNX0NIQU4pOworCisJKHZvaWQpIGFyOTAwM19haWNfY2FsX3N0YXJ0KGFoLCBudW1fY2hhbik7CisJY2FsX3JldCA9IGFyOTAwM19haWNfY2FsX2NvbnRpbnVlKGFoLCB0cnVlKTsKKworCXJldHVybiBjYWxfcmV0OworfQorCit2b2lkIGFyOTAwM19od19hdHRhY2hfYWljX29wcyhzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoX2h3X3ByaXZhdGVfb3BzICpwcml2X29wcyA9IGF0aDlrX2h3X3ByaXZhdGVfb3BzKGFoKTsKKworCXByaXZfb3BzLT5pc19haWNfZW5hYmxlZCA9IGFyOTAwM19od19pc19haWNfZW5hYmxlZDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfYWljLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2FpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZjQwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2FpYy5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgUXVhbGNvbW0gQXRoZXJvcyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBBUjkwMDNfQUlDX0gKKyNkZWZpbmUgQVI5MDAzX0FJQ19ICisKKyNkZWZpbmUgQVRIX0FJQ19NQVhfQ09NX0FUVF9EQl9UQUJMRSAgICA2CisjZGVmaW5lIEFUSF9BSUNfTUFYX0FJQ19MSU5fVEFCTEUgICAgICAgNjkKKyNkZWZpbmUgQVRIX0FJQ19NSU5fUk9UX0RJUl9BVFRfREIgICAgICAwCisjZGVmaW5lIEFUSF9BSUNfTUlOX1JPVF9RVUFEX0FUVF9EQiAgICAgMAorI2RlZmluZSBBVEhfQUlDX01BWF9ST1RfRElSX0FUVF9EQiAgICAgIDM3CisjZGVmaW5lIEFUSF9BSUNfTUFYX1JPVF9RVUFEX0FUVF9EQiAgICAgMzcKKyNkZWZpbmUgQVRIX0FJQ19TUkFNX0FVVE9fSU5DUkVNRU5UICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEFUSF9BSUNfU1JBTV9HQUlOX1RBQkxFX09GRlNFVCAgMHgyODAKKyNkZWZpbmUgQVRIX0FJQ19TUkFNX0NBTF9PRkZTRVQgICAgICAgICAweDE0MAorI2RlZmluZSBBVEhfQUlDX1NSQU1fT0ZGU0VUICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgQVRIX0FJQ19NRUFTX01BR19USFJFU0ggICAgICAgICAyMAorI2RlZmluZSBBVEhfQUlDX0JUX0pVUElURVJfQ1RSTCAgICAgICAgIDB4NjY4MjAKKyNkZWZpbmUgQVRIX0FJQ19CVF9BSUNfRU5BQkxFICAgICAgICAgICAweDAyCisKK2VudW0gYWljX2NhbF9zdGF0ZSB7CisJQUlDX0NBTF9TVEFURV9JRExFID0gMCwKKwlBSUNfQ0FMX1NUQVRFX1NUQVJURUQsCisJQUlDX0NBTF9TVEFURV9ET05FLAorCUFJQ19DQUxfU1RBVEVfRVJST1IKK307CisKK3N0cnVjdCBhdGhfYWljX3NyYW1faW5mbyB7CisJYm9vbCB2YWxpZDoxOworCWJvb2wgdmdhX3F1YWRfc2lnbjoxOworCWJvb2wgdmdhX2Rpcl9zaWduOjE7CisJdTggcm90X3F1YWRfYXR0X2RiOworCXU4IHJvdF9kaXJfYXR0X2RiOworCXU4IGNvbV9hdHRfNmRiOworfTsKKworc3RydWN0IGF0aF9haWNfb3V0X2luZm8geworCWludDE2X3QgZGlyX3BhdGhfZ2Fpbl9saW47CisJaW50MTZfdCBxdWFkX3BhdGhfZ2Fpbl9saW47CisJc3RydWN0IGF0aF9haWNfc3JhbV9pbmZvIHNyYW07Cit9OworCit1OCBhcjkwMDNfYWljX2NhbGlicmF0aW9uKHN0cnVjdCBhdGhfaHcgKmFoKTsKK3U4IGFyOTAwM19haWNfc3RhcnRfbm9ybWFsKHN0cnVjdCBhdGhfaHcgKmFoKTsKK3U4IGFyOTAwM19haWNfY2FsX3Jlc2V0KHN0cnVjdCBhdGhfaHcgKmFoKTsKK3U4IGFyOTAwM19haWNfY2FsaWJyYXRpb25fc2luZ2xlKHN0cnVjdCBhdGhfaHcgKmFoKTsKKworI2VuZGlmIC8qIEFSOTAwM19BSUNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19ody5jCmluZGV4IDQzMzVjY2IuLjc5ZmQzYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2h3LmMKQEAgLTE5NSwxNiArMTk1LDE2IEBACiAJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pQ2NrZmlySmFwYW4yNDg0LAogCQkJICAgICAgIGFyOTQ4NV8xXzFfYmFzZWJhbmRfY29yZV90eGZpcl9jb2VmZl9qYXBhbl8yNDg0KTsKIAotCQlpZiAoYWgtPmNvbmZpZy5ub19wbGxfcHdyc2F2ZSkgeworCQlpZiAoYWgtPmNvbmZpZy5wbGxfcHdyc2F2ZSAmIEFSX1BDSUVfUExMX1BXUlNBVkVfQ09OVFJPTCkgewogCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlQY2llU2VyZGVzLAotCQkJCSAgICAgICBhcjk0ODVfMV8xX3BjaWVfcGh5X2Nsa3JlcV9kaXNhYmxlX0wxKTsKKwkJCQkgICAgICAgYXI5NDg1XzFfMV9wbGxfb25fY2RyX29uX2Nsa3JlcV9kaXNhYmxlX0wxKTsKIAkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pUGNpZVNlcmRlc0xvd1Bvd2VyLAotCQkJCSAgICAgICBhcjk0ODVfMV8xX3BjaWVfcGh5X2Nsa3JlcV9kaXNhYmxlX0wxKTsKKwkJCQkgICAgICAgYXI5NDg1XzFfMV9wbGxfb25fY2RyX29uX2Nsa3JlcV9kaXNhYmxlX0wxKTsKIAkJfSBlbHNlIHsKIAkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pUGNpZVNlcmRlcywKLQkJCQkgICAgICAgYXI5NDg1XzFfMV9wbGxfb25fY2RyX29uX2Nsa3JlcV9kaXNhYmxlX0wxKTsKKwkJCQkgICAgICAgYXI5NDg1XzFfMV9wY2llX3BoeV9jbGtyZXFfZGlzYWJsZV9MMSk7CiAJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVBjaWVTZXJkZXNMb3dQb3dlciwKLQkJCQkgICAgICAgYXI5NDg1XzFfMV9wbGxfb25fY2RyX29uX2Nsa3JlcV9kaXNhYmxlX0wxKTsKKwkJCQkgICAgICAgYXI5NDg1XzFfMV9wY2llX3BoeV9jbGtyZXFfZGlzYWJsZV9MMSk7CiAJCX0KIAl9IGVsc2UgaWYgKEFSX1NSRVZfOTQ2Ml8yMShhaCkpIHsKIAkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNYWNbQVRIX0lOSV9DT1JFXSwKQEAgLTIzMSwxMCArMjMxLDIwIEBACiAJCQkgICAgICAgYXI5NDYyXzJwMV9tb2Rlc19mYXN0X2Nsb2NrKTsKIAkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlDY2tmaXJKYXBhbjI0ODQsCiAJCQkgICAgICAgYXI5NDYyXzJwMV9iYXNlYmFuZF9jb3JlX3R4ZmlyX2NvZWZmX2phcGFuXzI0ODQpOwotCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVBjaWVTZXJkZXMsCi0JCQkgICAgICAgYXI5NDYyXzJwMV9wY2llcGh5X2Nsa3JlcV9kaXNhYmxlX0wxKTsKLQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlQY2llU2VyZGVzTG93UG93ZXIsCi0JCQkgICAgICAgYXI5NDYyXzJwMV9wY2llcGh5X2Nsa3JlcV9kaXNhYmxlX0wxKTsKKworCQkvKiBBd2FrZSAtPiBTbGVlcCBTZXR0aW5nICovCisJCWlmICgoYWgtPmNvbmZpZy5wbGxfcHdyc2F2ZSAmIEFSX1BDSUVfUExMX1BXUlNBVkVfQ09OVFJPTCkgJiYKKwkJICAgIChhaC0+Y29uZmlnLnBsbF9wd3JzYXZlICYgQVJfUENJRV9QTExfUFdSU0FWRV9PTl9EMykpIHsKKwkJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pUGNpZVNlcmRlcywKKwkJCQkgICAgICAgYXI5NDYyXzJwMV9wY2llcGh5X2Nsa3JlcV9kaXNhYmxlX0wxKTsKKwkJfQorCisJCS8qIFNsZWVwIC0+IEF3YWtlIFNldHRpbmcgKi8KKwkJaWYgKChhaC0+Y29uZmlnLnBsbF9wd3JzYXZlICYgQVJfUENJRV9QTExfUFdSU0FWRV9DT05UUk9MKSAmJgorCQkgICAgKGFoLT5jb25maWcucGxsX3B3cnNhdmUgJiBBUl9QQ0lFX1BMTF9QV1JTQVZFX09OX0QwKSkgeworCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlQY2llU2VyZGVzTG93UG93ZXIsCisJCQkJICAgICAgIGFyOTQ2Ml8ycDFfcGNpZXBoeV9jbGtyZXFfZGlzYWJsZV9MMSk7CisJCX0KIAl9IGVsc2UgaWYgKEFSX1NSRVZfOTQ2Ml8yMChhaCkpIHsKIAogCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaU1hY1tBVEhfSU5JX0NPUkVdLCBhcjk0NjJfMnAwX21hY19jb3JlKTsKQEAgLTI2MiwxMSArMjcyLDE4IEBACiAJCQkJYXI5NDYyXzJwMF9jb21tb25fcnhfZ2Fpbik7CiAKIAkJLyogQXdha2UgLT4gU2xlZXAgU2V0dGluZyAqLwotCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVBjaWVTZXJkZXMsCi0JCQkgICAgICAgYXI5NDYyXzJwMF9wY2llcGh5X2Nsa3JlcV9kaXNhYmxlX0wxKTsKKwkJaWYgKChhaC0+Y29uZmlnLnBsbF9wd3JzYXZlICYgQVJfUENJRV9QTExfUFdSU0FWRV9DT05UUk9MKSAmJgorCQkgICAgKGFoLT5jb25maWcucGxsX3B3cnNhdmUgJiBBUl9QQ0lFX1BMTF9QV1JTQVZFX09OX0QzKSkgeworCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlQY2llU2VyZGVzLAorCQkJCSAgICAgICBhcjk0NjJfMnAwX3BjaWVwaHlfY2xrcmVxX2Rpc2FibGVfTDEpOworCQl9CisKIAkJLyogU2xlZXAgLT4gQXdha2UgU2V0dGluZyAqLwotCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVBjaWVTZXJkZXNMb3dQb3dlciwKLQkJCSAgICAgICBhcjk0NjJfMnAwX3BjaWVwaHlfY2xrcmVxX2Rpc2FibGVfTDEpOworCQlpZiAoKGFoLT5jb25maWcucGxsX3B3cnNhdmUgJiBBUl9QQ0lFX1BMTF9QV1JTQVZFX0NPTlRST0wpICYmCisJCSAgICAoYWgtPmNvbmZpZy5wbGxfcHdyc2F2ZSAmIEFSX1BDSUVfUExMX1BXUlNBVkVfT05fRDApKSB7CisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVBjaWVTZXJkZXNMb3dQb3dlciwKKwkJCQkgICAgICAgYXI5NDYyXzJwMF9wY2llcGh5X2Nsa3JlcV9kaXNhYmxlX0wxKTsKKwkJfQogCiAJCS8qIEZhc3QgY2xvY2sgbW9kYWwgc2V0dGluZ3MgKi8KIAkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlNb2Rlc0Zhc3RDbG9jaywKQEAgLTQ1NiwxMCArNDczLDE5IEBACiAJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNUeEdhaW4sCiAJCQkgICAgICAgYXI5NTY1XzFwMV9Nb2Rlc19sb3dlc3Rfb2JfZGJfdHhfZ2Fpbl90YWJsZSk7CiAKLQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlQY2llU2VyZGVzLAotCQkJICAgICAgIGFyOTU2NV8xcDFfcGNpZXBoeV9jbGtyZXFfZGlzYWJsZV9MMSk7Ci0JCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pUGNpZVNlcmRlc0xvd1Bvd2VyLAotCQkJICAgICAgIGFyOTU2NV8xcDFfcGNpZXBoeV9jbGtyZXFfZGlzYWJsZV9MMSk7CisJCS8qIEF3YWtlIC0+IFNsZWVwIFNldHRpbmcgKi8KKwkJaWYgKChhaC0+Y29uZmlnLnBsbF9wd3JzYXZlICYgQVJfUENJRV9QTExfUFdSU0FWRV9DT05UUk9MKSAmJgorCQkgICAgKGFoLT5jb25maWcucGxsX3B3cnNhdmUgJiBBUl9QQ0lFX1BMTF9QV1JTQVZFX09OX0QzKSkgeworCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlQY2llU2VyZGVzLAorCQkJCSAgICAgICBhcjk1NjVfMXAxX3BjaWVwaHlfY2xrcmVxX2Rpc2FibGVfTDEpOworCQl9CisKKwkJLyogU2xlZXAgLT4gQXdha2UgU2V0dGluZyAqLworCQlpZiAoKGFoLT5jb25maWcucGxsX3B3cnNhdmUgJiBBUl9QQ0lFX1BMTF9QV1JTQVZFX0NPTlRST0wpICYmCisJCSAgICAoYWgtPmNvbmZpZy5wbGxfcHdyc2F2ZSAmIEFSX1BDSUVfUExMX1BXUlNBVkVfT05fRDApKSB7CisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVBjaWVTZXJkZXNMb3dQb3dlciwKKwkJCQkgICAgICAgYXI5NTY1XzFwMV9wY2llcGh5X2Nsa3JlcV9kaXNhYmxlX0wxKTsKKwkJfQogCiAJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNGYXN0Q2xvY2ssCiAJCQkJYXI5NTY1XzFwMV9tb2Rlc19mYXN0X2Nsb2NrKTsKQEAgLTQ5MSwxMCArNTE3LDE5IEBACiAJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNUeEdhaW4sCiAJCQkgICAgICAgYXI5NTY1XzFwMF9Nb2Rlc19sb3dlc3Rfb2JfZGJfdHhfZ2Fpbl90YWJsZSk7CiAKLQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlQY2llU2VyZGVzLAotCQkJICAgICAgIGFyOTU2NV8xcDBfcGNpZXBoeV9jbGtyZXFfZGlzYWJsZV9MMSk7Ci0JCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pUGNpZVNlcmRlc0xvd1Bvd2VyLAotCQkJICAgICAgIGFyOTU2NV8xcDBfcGNpZXBoeV9jbGtyZXFfZGlzYWJsZV9MMSk7CisJCS8qIEF3YWtlIC0+IFNsZWVwIFNldHRpbmcgKi8KKwkJaWYgKChhaC0+Y29uZmlnLnBsbF9wd3JzYXZlICYgQVJfUENJRV9QTExfUFdSU0FWRV9DT05UUk9MKSAmJgorCQkgICAgKGFoLT5jb25maWcucGxsX3B3cnNhdmUgJiBBUl9QQ0lFX1BMTF9QV1JTQVZFX09OX0QzKSkgeworCQkJSU5JVF9JTklfQVJSQVkoJmFoLT5pbmlQY2llU2VyZGVzLAorCQkJCSAgICAgICBhcjk1NjVfMXAwX3BjaWVwaHlfY2xrcmVxX2Rpc2FibGVfTDEpOworCQl9CisKKwkJLyogU2xlZXAgLT4gQXdha2UgU2V0dGluZyAqLworCQlpZiAoKGFoLT5jb25maWcucGxsX3B3cnNhdmUgJiBBUl9QQ0lFX1BMTF9QV1JTQVZFX0NPTlRST0wpICYmCisJCSAgICAoYWgtPmNvbmZpZy5wbGxfcHdyc2F2ZSAmIEFSX1BDSUVfUExMX1BXUlNBVkVfT05fRDApKSB7CisJCQlJTklUX0lOSV9BUlJBWSgmYWgtPmluaVBjaWVTZXJkZXNMb3dQb3dlciwKKwkJCQkgICAgICAgYXI5NTY1XzFwMF9wY2llcGh5X2Nsa3JlcV9kaXNhYmxlX0wxKTsKKwkJfQogCiAJCUlOSVRfSU5JX0FSUkFZKCZhaC0+aW5pTW9kZXNGYXN0Q2xvY2ssCiAJCQkJYXI5NTY1XzFwMF9tb2Rlc19mYXN0X2Nsb2NrKTsKQEAgLTExMzAsNiArMTE2NSwxMiBAQAogCXN0cnVjdCBhdGhfaHdfb3BzICpvcHMgPSBhdGg5a19od19vcHMoYWgpOwogCiAJYXI5MDAzX2h3X2luaXRfbW9kZV9yZWdzKGFoKTsKKworCWlmIChBUl9TUkVWXzkwMDNfUENPRU0oYWgpKSB7CisJCVdBUk5fT04oIWFoLT5pbmlQY2llU2VyZGVzLmlhX2FycmF5KTsKKwkJV0FSTl9PTighYWgtPmluaVBjaWVTZXJkZXNMb3dQb3dlci5pYV9hcnJheSk7CisJfQorCiAJcHJpdl9vcHMtPmluaXRfbW9kZV9nYWluX3JlZ3MgPSBhcjkwMDNfaHdfaW5pdF9tb2RlX2dhaW5fcmVnczsKIAlwcml2X29wcy0+aW5pdF9oYW5nX2NoZWNrcyA9IGFyOTAwM19od19pbml0X2hhbmdfY2hlY2tzOwogCXByaXZfb3BzLT5kZXRlY3RfbWFjX2hhbmcgPSBhcjkwMDNfaHdfZGV0ZWN0X21hY19oYW5nOwpAQCAtMTEzOSw0ICsxMTgwLDUgQEAKIAlhcjkwMDNfaHdfYXR0YWNoX3BoeV9vcHMoYWgpOwogCWFyOTAwM19od19hdHRhY2hfY2FsaWJfb3BzKGFoKTsKIAlhcjkwMDNfaHdfYXR0YWNoX21hY19vcHMoYWgpOworCWFyOTAwM19od19hdHRhY2hfYWljX29wcyhhaCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21jaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tY2kuYwppbmRleCA3Yjk0YTZjLi5hZjVlZTQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21jaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJody1vcHMuaCIKICNpbmNsdWRlICJhcjkwMDNfcGh5LmgiCiAjaW5jbHVkZSAiYXI5MDAzX21jaS5oIgorI2luY2x1ZGUgImFyOTAwM19haWMuaCIKIAogc3RhdGljIHZvaWQgYXI5MDAzX21jaV9yZXNldF9yZXFfd2FrZXVwKHN0cnVjdCBhdGhfaHcgKmFoKQogewpAQCAtMjg0LDEyICsyODUsMTIgQEAKIAkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVCk7CiAJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JBVywgQVJfTUNJX0lOVEVSUlVQVF9CVF9QUkkpOwogCi0JaWYgKG1jaS0+aXNfMmcpIHsKKwlpZiAobWNpLT5pc18yZyAmJiBNQ0lfQU5UX0FSQ0hfUEFfTE5BX1NIQVJFRChtY2kpKSB7CiAJCWFyOTAwM19tY2lfc2VuZF9sbmFfdHJhbnNmZXIoYWgsIHRydWUpOwogCQl1ZGVsYXkoNSk7CiAJfQogCi0JaWYgKChtY2ktPmlzXzJnICYmICFtY2ktPnVwZGF0ZV8yZzVnKSkgeworCWlmIChtY2ktPmlzXzJnICYmICFtY2ktPnVwZGF0ZV8yZzVnICYmIE1DSV9BTlRfQVJDSF9QQV9MTkFfU0hBUkVEKG1jaSkpIHsKIAkJaWYgKGFyOTAwM19tY2lfd2FpdF9mb3JfaW50ZXJydXB0KGFoLAogCQkJCQlBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCiAJCQkJCUFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPLApAQCAtNTkzLDcgKzU5NCw3IEBACiAJCWlmICghdGltZV9vdXQpCiAJCQlicmVhazsKIAotCQlvZmZzZXQgPSBhcjkwMDNfbWNpX2dldF9uZXh0X2dwbV9vZmZzZXQoYWgsIGZhbHNlLCAmbW9yZV9kYXRhKTsKKwkJb2Zmc2V0ID0gYXI5MDAzX21jaV9nZXRfbmV4dF9ncG1fb2Zmc2V0KGFoLCAmbW9yZV9kYXRhKTsKIAogCQlpZiAob2Zmc2V0ID09IE1DSV9HUE1fSU5WQUxJRCkKIAkJCWNvbnRpbnVlOwpAQCAtNjU3LDcgKzY1OCw3IEBACiAJCXRpbWVfb3V0ID0gMDsKIAogCXdoaWxlIChtb3JlX2RhdGEgPT0gTUNJX0dQTV9NT1JFKSB7Ci0JCW9mZnNldCA9IGFyOTAwM19tY2lfZ2V0X25leHRfZ3BtX29mZnNldChhaCwgZmFsc2UsICZtb3JlX2RhdGEpOworCQlvZmZzZXQgPSBhcjkwMDNfbWNpX2dldF9uZXh0X2dwbV9vZmZzZXQoYWgsICZtb3JlX2RhdGEpOwogCQlpZiAob2Zmc2V0ID09IE1DSV9HUE1fSU5WQUxJRCkKIAkJCWJyZWFrOwogCkBAIC03NzEsOCArNzcyLDE0IEBACiAKIHN0YXRpYyB2b2lkIGFyOTAwM19tY2lfbXV0ZV9idChzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisKIAkvKiBkaXNhYmxlIGFsbCBNQ0kgbWVzc2FnZXMgKi8KIAlSRUdfV1JJVEUoYWgsIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRSwgMHhmZmZmMDAwMCk7CisJUkVHX1dSSVRFKGFoLCBBUl9CVENPRVhfV0xfV0VJR0hUUzAsIDB4ZmZmZmZmZmYpOworCVJFR19XUklURShhaCwgQVJfQlRDT0VYX1dMX1dFSUdIVFMxLCAweGZmZmZmZmZmKTsKKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9XTF9XRUlHSFRTMiwgMHhmZmZmZmZmZik7CisJUkVHX1dSSVRFKGFoLCBBUl9CVENPRVhfV0xfV0VJR0hUUzMsIDB4ZmZmZmZmZmYpOwogCVJFR19TRVRfQklUKGFoLCBBUl9NQ0lfVFhfQ1RSTCwgQVJfTUNJX1RYX0NUUkxfRElTQUJMRV9MTkFfVVBEQVRFKTsKIAogCS8qIHdhaXQgcGVuZGluZyBIVyBtZXNzYWdlcyB0byBmbHVzaCBvdXQgKi8KQEAgLTc4Myw5ICs3OTAsMTAgQEAKIAkgKiAxLiByZXNldCBub3QgYWZ0ZXIgcmVzdW1pbmcgZnJvbSBmdWxsIHNsZWVwCiAJICogMi4gYmVmb3JlIHJlc2V0IE1DSSBSWCwgdG8gcXVpZXQgQlQgYW5kIGF2b2lkIE1DSSBSWCBtaXNhbGlnbm1lbnQKIAkgKi8KLQlhcjkwMDNfbWNpX3NlbmRfbG5hX3Rha2UoYWgsIHRydWUpOwotCi0JdWRlbGF5KDUpOworCWlmIChNQ0lfQU5UX0FSQ0hfUEFfTE5BX1NIQVJFRChtY2kpKSB7CisJCWFyOTAwM19tY2lfc2VuZF9sbmFfdGFrZShhaCwgdHJ1ZSk7CisJCXVkZWxheSg1KTsKKwl9CiAKIAlhcjkwMDNfbWNpX3NlbmRfc3lzX3NsZWVwaW5nKGFoLCB0cnVlKTsKIH0KQEAgLTgyMSw2ICs4MjksODAgQEAKIAkJICAgICAgQVJfQlRDT0VYX0NUUkxfT05FX1NURVBfTE9PS19BSEVBRF9FTiwgMSk7CiB9CiAKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfc3RhdF9zZXR1cChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisKKwlpZiAoIUFSX1NSRVZfOTU2NShhaCkpCisJCXJldHVybjsKKworCWlmIChtY2ktPmNvbmZpZyAmIEFUSF9NQ0lfQ09ORklHX01DSV9TVEFUX0RCRykgeworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9NQ0lfREJHX0NOVF9DVFJMLAorCQkJICAgICAgQVJfTUNJX0RCR19DTlRfQ1RSTF9FTkFCTEUsIDEpOworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9NQ0lfREJHX0NOVF9DVFJMLAorCQkJICAgICAgQVJfTUNJX0RCR19DTlRfQ1RSTF9CVF9MSU5LSUQsCisJCQkgICAgICBNQ0lfU1RBVF9BTExfQlRfTElOS0lEKTsKKwl9IGVsc2UgeworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9NQ0lfREJHX0NOVF9DVFJMLAorCQkJICAgICAgQVJfTUNJX0RCR19DTlRfQ1RSTF9FTkFCTEUsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9zZXRfYnRjb2V4X2N0cmxfOTU2NV8xQU5UKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXUzMiByZWd2YWw7CisKKwlyZWd2YWwgPSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9BUjk0NjJfTU9ERSkgfAorCQkgU00oMSwgQVJfQlRDT0VYX0NUUkxfV0JUSU1FUl9FTikgfAorCQkgU00oMSwgQVJfQlRDT0VYX0NUUkxfUEFfU0hBUkVEKSB8CisJCSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9MTkFfU0hBUkVEKSB8CisJCSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9OVU1fQU5URU5OQVMpIHwKKwkJIFNNKDEsIEFSX0JUQ09FWF9DVFJMX1JYX0NIQUlOX01BU0spIHwKKwkJIFNNKDAsIEFSX0JUQ09FWF9DVFJMXzFfQ0hBSU5fQUNLKSB8CisJCSBTTSgwLCBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0JDTikgfAorCQkgU00oMCwgQVJfQlRDT0VYX0NUUkxfT05FX1NURVBfTE9PS19BSEVBRF9FTik7CisKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9CVENPRVhfQ1RSTDIsCisJCSAgICAgIEFSX0JUQ09FWF9DVFJMMl9UWF9DSEFJTl9NQVNLLCAweDEpOworCVJFR19XUklURShhaCwgQVJfQlRDT0VYX0NUUkwsIHJlZ3ZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfc2V0X2J0Y29leF9jdHJsXzk1NjVfMkFOVChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwl1MzIgcmVndmFsOworCisJcmVndmFsID0gU00oMSwgQVJfQlRDT0VYX0NUUkxfQVI5NDYyX01PREUpIHwKKwkJIFNNKDEsIEFSX0JUQ09FWF9DVFJMX1dCVElNRVJfRU4pIHwKKwkJIFNNKDAsIEFSX0JUQ09FWF9DVFJMX1BBX1NIQVJFRCkgfAorCQkgU00oMCwgQVJfQlRDT0VYX0NUUkxfTE5BX1NIQVJFRCkgfAorCQkgU00oMiwgQVJfQlRDT0VYX0NUUkxfTlVNX0FOVEVOTkFTKSB8CisJCSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9SWF9DSEFJTl9NQVNLKSB8CisJCSBTTSgwLCBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0FDSykgfAorCQkgU00oMCwgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9CQ04pIHwKKwkJIFNNKDAsIEFSX0JUQ09FWF9DVFJMX09ORV9TVEVQX0xPT0tfQUhFQURfRU4pOworCisJUkVHX1JNV19GSUVMRChhaCwgQVJfQlRDT0VYX0NUUkwyLAorCQkgICAgICBBUl9CVENPRVhfQ1RSTDJfVFhfQ0hBSU5fTUFTSywgMHgwKTsKKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9DVFJMLCByZWd2YWwpOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfbWNpX3NldF9idGNvZXhfY3RybF85NDYyKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXUzMiByZWd2YWw7CisKKyAgICAgICAgcmVndmFsID0gU00oMSwgQVJfQlRDT0VYX0NUUkxfQVI5NDYyX01PREUpIHwKKwkJIFNNKDEsIEFSX0JUQ09FWF9DVFJMX1dCVElNRVJfRU4pIHwKKwkJIFNNKDEsIEFSX0JUQ09FWF9DVFJMX1BBX1NIQVJFRCkgfAorCQkgU00oMSwgQVJfQlRDT0VYX0NUUkxfTE5BX1NIQVJFRCkgfAorCQkgU00oMiwgQVJfQlRDT0VYX0NUUkxfTlVNX0FOVEVOTkFTKSB8CisJCSBTTSgzLCBBUl9CVENPRVhfQ1RSTF9SWF9DSEFJTl9NQVNLKSB8CisJCSBTTSgwLCBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0FDSykgfAorCQkgU00oMCwgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9CQ04pIHwKKwkJIFNNKDAsIEFSX0JUQ09FWF9DVFJMX09ORV9TVEVQX0xPT0tfQUhFQURfRU4pOworCisJUkVHX1dSSVRFKGFoLCBBUl9CVENPRVhfQ1RSTCwgcmVndmFsKTsKK30KKwogaW50IGFyOTAwM19tY2lfcmVzZXQoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgZW5faW50LCBib29sIGlzXzJnLAogCQkgICAgIGJvb2wgaXNfZnVsbF9zbGVlcCkKIHsKQEAgLTgzMSwxMSArOTEzLDYgQEAKIAlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIFJlc2V0IChmdWxsX3NsZWVwID0gJWQsIGlzXzJnID0gJWQpXG4iLAogCQlpc19mdWxsX3NsZWVwLCBpc18yZyk7CiAKLQlpZiAoIW1jaS0+Z3BtX2FkZHIgJiYgIW1jaS0+c2NoZWRfYWRkcikgewotCQlhdGhfZXJyKGNvbW1vbiwgIk1DSSBHUE0gYW5kIHNjaGVkdWxlIGJ1ZmZlcnMgYXJlIG5vdCBhbGxvY2F0ZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KIAlpZiAoUkVHX1JFQUQoYWgsIEFSX0JUQ09FWF9DVFJMKSA9PSAweGRlYWRiZWVmKSB7CiAJCWF0aF9lcnIoY29tbW9uLCAiQlRDT0VYIGNvbnRyb2wgcmVnaXN0ZXIgaXMgZGVhZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODUwLDI1ICs5MjcsMTYgQEAKIAkqIFRvIGF2b2lkIE1DSSBzdGF0ZSBtYWNoaW5lIGJlIGFmZmVjdGVkIGJ5IGluY29taW5nIHJlbW90ZSBNQ0kgbXNncywKIAkqIE1DSSBtb2RlIHdpbGwgYmUgZW5hYmxlZCBsYXRlciwgcmlnaHQgYmVmb3JlIHJlc2V0IHRoZSBNQ0kgVFggYW5kIFJYLgogCSovCi0KLQlyZWd2YWwgPSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9BUjk0NjJfTU9ERSkgfAotCQkgU00oMSwgQVJfQlRDT0VYX0NUUkxfV0JUSU1FUl9FTikgfAotCQkgU00oMSwgQVJfQlRDT0VYX0NUUkxfUEFfU0hBUkVEKSB8Ci0JCSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9MTkFfU0hBUkVEKSB8Ci0JCSBTTSgwLCBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0FDSykgfAotCQkgU00oMCwgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9CQ04pIHwKLQkJIFNNKDAsIEFSX0JUQ09FWF9DVFJMX09ORV9TVEVQX0xPT0tfQUhFQURfRU4pOwogCWlmIChBUl9TUkVWXzk1NjUoYWgpKSB7Ci0JCXJlZ3ZhbCB8PSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9OVU1fQU5URU5OQVMpIHwKLQkJCSAgU00oMSwgQVJfQlRDT0VYX0NUUkxfUlhfQ0hBSU5fTUFTSyk7Ci0JCVJFR19STVdfRklFTEQoYWgsIEFSX0JUQ09FWF9DVFJMMiwKLQkJCSAgICAgIEFSX0JUQ09FWF9DVFJMMl9UWF9DSEFJTl9NQVNLLCAweDEpOwotCX0gZWxzZSB7Ci0JCXJlZ3ZhbCB8PSBTTSgyLCBBUl9CVENPRVhfQ1RSTF9OVU1fQU5URU5OQVMpIHwKLQkJCSAgU00oMywgQVJfQlRDT0VYX0NUUkxfUlhfQ0hBSU5fTUFTSyk7Ci0JfQorCQl1OCBhbnQgPSBNUyhtY2ktPmNvbmZpZywgQVRIX01DSV9DT05GSUdfQU5UX0FSQ0gpOwogCi0JUkVHX1dSSVRFKGFoLCBBUl9CVENPRVhfQ1RSTCwgcmVndmFsKTsKKwkJaWYgKGFudCA9PSBBVEhfTUNJX0FOVF9BUkNIXzFfQU5UX1BBX0xOQV9TSEFSRUQpCisJCQlhcjkwMDNfbWNpX3NldF9idGNvZXhfY3RybF85NTY1XzFBTlQoYWgpOworCQllbHNlCisJCQlhcjkwMDNfbWNpX3NldF9idGNvZXhfY3RybF85NTY1XzJBTlQoYWgpOworCX0gZWxzZSB7CisJCWFyOTAwM19tY2lfc2V0X2J0Y29leF9jdHJsXzk0NjIoYWgpOworCX0KIAogCWlmIChpc18yZyAmJiAhKG1jaS0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfRElTQUJMRV9PU0xBKSkKIAkJYXI5MDAzX21jaV9vc2xhX3NldHVwKGFoLCB0cnVlKTsKQEAgLTkyNiwyNiArOTk0LDMyIEBACiAJcmVndmFsICY9IH5TTSgxLCBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfUlgpOwogCVJFR19XUklURShhaCwgQVJfTUNJX0NPTU1BTkQyLCByZWd2YWwpOwogCi0JYXI5MDAzX21jaV9nZXRfbmV4dF9ncG1fb2Zmc2V0KGFoLCB0cnVlLCBOVUxMKTsKKwkvKiBJbml0IEdQTSBvZmZzZXQgYWZ0ZXIgTUNJIFJlc2V0IFJ4ICovCisJYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX0lOSVRfR1BNX09GRlNFVCk7CiAKIAlSRUdfV1JJVEUoYWgsIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRSwKIAkJICAoU00oMHhlODAxLCBBUl9NQ0lfTVNHX0FUVFJJQlVURVNfVEFCTEVfSU5WQUxJRF9IRFIpIHwKIAkJICAgU00oMHgwMDAwLCBBUl9NQ0lfTVNHX0FUVFJJQlVURVNfVEFCTEVfQ0hFQ0tTVU0pKSk7CiAKLQlSRUdfQ0xSX0JJVChhaCwgQVJfTUNJX1RYX0NUUkwsCi0JCSAgICBBUl9NQ0lfVFhfQ1RSTF9ESVNBQkxFX0xOQV9VUERBVEUpOworCWlmIChNQ0lfQU5UX0FSQ0hfUEFfTE5BX1NIQVJFRChtY2kpKQorCQlSRUdfQ0xSX0JJVChhaCwgQVJfTUNJX1RYX0NUUkwsCisJCQkgICAgQVJfTUNJX1RYX0NUUkxfRElTQUJMRV9MTkFfVVBEQVRFKTsKKwllbHNlCisJCVJFR19TRVRfQklUKGFoLCBBUl9NQ0lfVFhfQ1RSTCwKKwkJCSAgICBBUl9NQ0lfVFhfQ1RSTF9ESVNBQkxFX0xOQV9VUERBVEUpOwogCiAJYXI5MDAzX21jaV9vYnNlcnZhdGlvbl9zZXRfdXAoYWgpOwogCiAJbWNpLT5yZWFkeSA9IHRydWU7CiAJYXI5MDAzX21jaV9wcmVwX2ludGVyZmFjZShhaCk7CisJYXI5MDAzX21jaV9zdGF0X3NldHVwKGFoKTsKIAotCWlmIChBUl9TUkVWXzk1NjUoYWgpKQotCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9NQ0lfREJHX0NOVF9DVFJMLAotCQkJICAgICAgQVJfTUNJX0RCR19DTlRfQ1RSTF9FTkFCTEUsIDApOwogCWlmIChlbl9pbnQpCiAJCWFyOTAwM19tY2lfZW5hYmxlX2ludGVycnVwdChhaCk7CiAKKwlpZiAoYXRoOWtfaHdfaXNfYWljX2VuYWJsZWQoYWgpKQorCQlhcjkwMDNfYWljX3N0YXJ0X25vcm1hbChhaCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTIxOCw2ICsxMjkyLDE0IEBACiAJCX0KIAkJdmFsdWUgJj0gQVJfQlRDT0VYX0NUUkxfTUNJX01PREVfRU47CiAJCWJyZWFrOworCWNhc2UgTUNJX1NUQVRFX0lOSVRfR1BNX09GRlNFVDoKKwkJdmFsdWUgPSBNUyhSRUdfUkVBRChhaCwgQVJfTUNJX0dQTV8xKSwgQVJfTUNJX0dQTV9XUklURV9QVFIpOworCisJCWlmICh2YWx1ZSA8IG1jaS0+Z3BtX2xlbikKKwkJCW1jaS0+Z3BtX2lkeCA9IHZhbHVlOworCQllbHNlCisJCQltY2ktPmdwbV9pZHggPSAwOworCQlicmVhazsKIAljYXNlIE1DSV9TVEFURV9MQVNUX1NDSERfTVNHX09GRlNFVDoKIAkJdmFsdWUgPSBNUyhSRUdfUkVBRChhaCwgQVJfTUNJX1JYX1NUQVRVUyksCiAJCQkJICAgIEFSX01DSV9SWF9MQVNUX1NDSERfTVNHX0lOREVYKTsKQEAgLTEyODQsNiArMTM2NiwyMiBAQAogCQl2YWx1ZSA9ICghbWNpLT51bmhhbHRfYnRfZ3BtICYmIG1jaS0+bmVlZF9mbHVzaF9idGluZm8pID8gMSA6IDA7CiAJCW1jaS0+bmVlZF9mbHVzaF9idGluZm8gPSBmYWxzZTsKIAkJYnJlYWs7CisJY2FzZSBNQ0lfU1RBVEVfQUlDX0NBTDoKKwkJaWYgKGF0aDlrX2h3X2lzX2FpY19lbmFibGVkKGFoKSkKKwkJCXZhbHVlID0gYXI5MDAzX2FpY19jYWxpYnJhdGlvbihhaCk7CisJCWJyZWFrOworCWNhc2UgTUNJX1NUQVRFX0FJQ19TVEFSVDoKKwkJaWYgKGF0aDlrX2h3X2lzX2FpY19lbmFibGVkKGFoKSkKKwkJCWFyOTAwM19haWNfc3RhcnRfbm9ybWFsKGFoKTsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfU1RBVEVfQUlDX0NBTF9SRVNFVDoKKwkJaWYgKGF0aDlrX2h3X2lzX2FpY19lbmFibGVkKGFoKSkKKwkJCXZhbHVlID0gYXI5MDAzX2FpY19jYWxfcmVzZXQoYWgpOworCQlicmVhazsKKwljYXNlIE1DSV9TVEFURV9BSUNfQ0FMX1NJTkdMRToKKwkJaWYgKGF0aDlrX2h3X2lzX2FpY19lbmFibGVkKGFoKSkKKwkJCXZhbHVlID0gYXI5MDAzX2FpY19jYWxpYnJhdGlvbl9zaW5nbGUoYWgpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0xMzY0LDIxICsxNDYyLDExIEBACiAJbWNpLT5ncG1faWR4ID0gMDsKIH0KIAotdTMyIGFyOTAwM19tY2lfZ2V0X25leHRfZ3BtX29mZnNldChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCBmaXJzdCwgdTMyICptb3JlKQordTMyIGFyOTAwM19tY2lfZ2V0X25leHRfZ3BtX29mZnNldChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyICptb3JlKQogewogCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKIAl1MzIgb2Zmc2V0LCBtb3JlX2dwbSA9IDAsIGdwbV9wdHI7CiAKLQlpZiAoZmlyc3QpIHsKLQkJZ3BtX3B0ciA9IE1TKFJFR19SRUFEKGFoLCBBUl9NQ0lfR1BNXzEpLCBBUl9NQ0lfR1BNX1dSSVRFX1BUUik7Ci0KLQkJaWYgKGdwbV9wdHIgPj0gbWNpLT5ncG1fbGVuKQotCQkJZ3BtX3B0ciA9IDA7Ci0KLQkJbWNpLT5ncG1faWR4ID0gZ3BtX3B0cjsKLQkJcmV0dXJuIGdwbV9wdHI7Ci0JfQotCiAJLyoKIAkgKiBUaGlzIGNvdWxkIGJlIHVzZWZ1bCB0byBhdm9pZCBuZXcgR1BNIG1lc3NhZ2UgaW50ZXJydXB0IHdoaWNoCiAJICogbWF5IGxlYWQgdG8gc3B1cmlvdXMgaW50ZXJydXB0IGFmdGVyIHBvd2VyIHNsZWVwLCBvciBtdWx0aXBsZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tY2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmgKaW5kZXggNjZkN2FiOS4uZTI4ODYxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tY2kuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21jaS5oCkBAIC05MiwxNCArOTIsMzYgQEAKICNkZWZpbmUgQVRIX01DSV9DT05GSUdfQ0xLX0RJViAgICAgICAgICAgICAgMHgwMDAwMzAwMAogI2RlZmluZSBBVEhfTUNJX0NPTkZJR19DTEtfRElWX1MgICAgICAgICAgICAxMgogI2RlZmluZSBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX1RVTklORyAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfQUlDICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfQUlDX0NBTF9OVU1fQ0hBTiAgICAgMHgwMDdmMDAwMAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19BSUNfQ0FMX05VTV9DSEFOX1MgICAxNgorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19OT19RVUlFVF9BQ0sgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX05PX1FVSUVUX0FDS19TICAgICAgIDIzCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0FOVF9BUkNIICAgICAgICAgICAgIDB4MDcwMDAwMDAKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfQU5UX0FSQ0hfUyAgICAgICAgICAgMjQKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfRk9SQ0VfUVVJRVRfQUNLICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19GT1JDRV9RVUlFVF9BQ0tfUyAgICAyNworI2RlZmluZSBBVEhfTUNJX0NPTkZJR19GT1JDRV8yQ0hBSU5fQUNLICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX01DSV9TVEFUX0RCRyAgICAgICAgIDB4MjAwMDAwMDAKICNkZWZpbmUgQVRIX01DSV9DT05GSUdfTUNJX1dFSUdIVF9EQkcgICAgICAgMHg0MDAwMDAwMAogI2RlZmluZSBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX01DSSAgICAgICAgICAweDgwMDAwMDAwCiAKICNkZWZpbmUgQVRIX01DSV9DT05GSUdfTUNJX09CU19NQVNLICAgICAoQVRIX01DSV9DT05GSUdfTUNJX09CU19NQ0kgIHwgXAogCQkJCQkgQVRIX01DSV9DT05GSUdfTUNJX09CU19UWFJYIHwgXAogCQkJCQkgQVRIX01DSV9DT05GSUdfTUNJX09CU19CVCkKKwogI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0dQSU8gICAgIDB4MDAwMDAwMkYKIAorI2RlZmluZSBBVEhfTUNJX0FOVF9BUkNIXzFfQU5UX1BBX0xOQV9OT05fU0hBUkVEIDB4MDAKKyNkZWZpbmUgQVRIX01DSV9BTlRfQVJDSF8xX0FOVF9QQV9MTkFfU0hBUkVEICAgICAweDAxCisjZGVmaW5lIEFUSF9NQ0lfQU5UX0FSQ0hfMl9BTlRfUEFfTE5BX05PTl9TSEFSRUQgMHgwMgorI2RlZmluZSBBVEhfTUNJX0FOVF9BUkNIXzJfQU5UX1BBX0xOQV9TSEFSRUQgICAgIDB4MDMKKyNkZWZpbmUgQVRIX01DSV9BTlRfQVJDSF8zX0FOVCAgICAgICAgICAgICAgICAgICAweDA0CisKKyNkZWZpbmUgTUNJX0FOVF9BUkNIX1BBX0xOQV9TSEFSRUQobWNpKQkJCQkJXAorCSgoTVMobWNpLT5jb25maWcsIEFUSF9NQ0lfQ09ORklHX0FOVF9BUkNIKSA9PSBBVEhfTUNJX0FOVF9BUkNIXzFfQU5UX1BBX0xOQV9TSEFSRUQpIHx8IFwKKwkgKE1TKG1jaS0+Y29uZmlnLCBBVEhfTUNJX0NPTkZJR19BTlRfQVJDSCkgPT0gQVRIX01DSV9BTlRfQVJDSF8yX0FOVF9QQV9MTkFfU0hBUkVEKSkKKwogZW51bSBtY2lfbWVzc2FnZV9oZWFkZXIgewkJLyogbGVuZ3RoIG9mIHBheWxvYWQgKi8KIAlNQ0lfTE5BX0NUUkwgICAgID0gMHgxMCwgICAgICAgIC8qIGxlbiA9IDAgKi8KIAlNQ0lfQ09OVF9OQUNLICAgID0gMHgyMCwgICAgICAgIC8qIGxlbiA9IDAgKi8KQEAgLTE4OCwyMCArMjEwLDU1IEBACiAJTUNJX0JUX0NBTAogfTsKIAorZW51bSBtY2lfcHNfc3RhdGUgeworCU1DSV9QU19ESVNBQkxFLAorCU1DSV9QU19FTkFCTEUsCisJTUNJX1BTX0VOQUJMRV9PRkYsCisJTUNJX1BTX0VOQUJMRV9PTgorfTsKKwogLyogVHlwZSBvZiBzdGF0ZSBxdWVyeSAqLwogZW51bSBtY2lfc3RhdGVfdHlwZSB7CiAJTUNJX1NUQVRFX0VOQUJMRSwKKwlNQ0lfU1RBVEVfSU5JVF9HUE1fT0ZGU0VULAorCU1DSV9TVEFURV9DSEVDS19HUE1fT0ZGU0VULAorCU1DSV9TVEFURV9ORVhUX0dQTV9PRkZTRVQsCisJTUNJX1NUQVRFX0xBU1RfR1BNX09GRlNFVCwKKwlNQ0lfU1RBVEVfQlQsCisJTUNJX1NUQVRFX1NFVF9CVF9TTEVFUCwKIAlNQ0lfU1RBVEVfU0VUX0JUX0FXQUtFLAorCU1DSV9TVEFURV9TRVRfQlRfQ0FMX1NUQVJULAorCU1DSV9TVEFURV9TRVRfQlRfQ0FMLAogCU1DSV9TVEFURV9MQVNUX1NDSERfTVNHX09GRlNFVCwKIAlNQ0lfU1RBVEVfUkVNT1RFX1NMRUVQLAorCU1DSV9TVEFURV9DT05UX1NUQVRVUywKIAlNQ0lfU1RBVEVfUkVTRVRfUkVRX1dBS0UsCiAJTUNJX1NUQVRFX1NFTkRfV0xBTl9DT0VYX1ZFUlNJT04sCisJTUNJX1NUQVRFX1NFVF9CVF9DT0VYX1ZFUlNJT04sCisJTUNJX1NUQVRFX1NFTkRfV0xBTl9DSEFOTkVMUywKIAlNQ0lfU1RBVEVfU0VORF9WRVJTSU9OX1FVRVJZLAogCU1DSV9TVEFURV9TRU5EX1NUQVRVU19RVUVSWSwKKwlNQ0lfU1RBVEVfTkVFRF9GTFVTSF9CVF9JTkZPLAorCU1DSV9TVEFURV9TRVRfQ09OQ1VSX1RYX1BSSSwKIAlNQ0lfU1RBVEVfUkVDT1ZFUl9SWCwKIAlNQ0lfU1RBVEVfTkVFRF9GVFBfU1RPTVAsCisJTUNJX1NUQVRFX05FRURfVFVOSU5HLAorCU1DSV9TVEFURV9ORUVEX1NUQVRfREVCVUcsCisJTUNJX1NUQVRFX1NIQVJFRF9DSEFJTl9DT05DVVJfVFgsCisJTUNJX1NUQVRFX0FJQ19DQUwsCisJTUNJX1NUQVRFX0FJQ19TVEFSVCwKKwlNQ0lfU1RBVEVfQUlDX0NBTF9SRVNFVCwKKwlNQ0lfU1RBVEVfQUlDX0NBTF9TSU5HTEUsCisJTUNJX1NUQVRFX0lTX0FSOTQ2MiwKKwlNQ0lfU1RBVEVfSVNfQVI5NTY1XzFBTlQsCisJTUNJX1NUQVRFX0lTX0FSOTU2NV8yQU5ULAorCU1DSV9TVEFURV9XTEFOX1dFQUtfU0lHTkFMLAorCU1DSV9TVEFURV9TRVRfV0xBTl9QU19TVEFURSwKKwlNQ0lfU1RBVEVfR0VUX1dMQU5fUFNfU1RBVEUsCiAJTUNJX1NUQVRFX0RFQlVHLAotCU1DSV9TVEFURV9ORUVEX0ZMVVNIX0JUX0lORk8sCisJTUNJX1NUQVRFX1NUQVRfREVCVUcsCisJTUNJX1NUQVRFX0FMTE9XX0ZDUywKKwlNQ0lfU1RBVEVfU0VUXzJHX0NPTlRFTlRJT04sCiAJTUNJX1NUQVRFX01BWAogfTsKIApAQCAtMjU1LDcgKzMxMiw3IEBACiB2b2lkIGFyOTAwM19tY2lfY2xlYW51cChzdHJ1Y3QgYXRoX2h3ICphaCk7CiB2b2lkIGFyOTAwM19tY2lfZ2V0X2ludGVycnVwdChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyICpyYXdfaW50ciwKIAkJCSAgICAgIHUzMiAqcnhfbXNnX2ludHIpOwotdTMyIGFyOTAwM19tY2lfZ2V0X25leHRfZ3BtX29mZnNldChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCBmaXJzdCwgdTMyICptb3JlKTsKK3UzMiBhcjkwMDNfbWNpX2dldF9uZXh0X2dwbV9vZmZzZXQoc3RydWN0IGF0aF9odyAqYWgsIHUzMiAqbW9yZSk7CiB2b2lkIGFyOTAwM19tY2lfc2V0X2J0X3ZlcnNpb24oc3RydWN0IGF0aF9odyAqYWgsIHU4IG1ham9yLCB1OCBtaW5vcik7CiB2b2lkIGFyOTAwM19tY2lfc2VuZF93bGFuX2NoYW5uZWxzKHN0cnVjdCBhdGhfaHcgKmFoKTsKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuaAppbmRleCBjMzExYjJiLi5mYzU5NWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmgKQEAgLTY0MCwxNiArNjQwLDYgQEAKICNkZWZpbmUgQVJfUEhZX0JCX1RIRVJNX0FEQ180X0xBVEVTVF9WT0xUX1ZBTFVFCQkweDAwMDBmZjAwCiAjZGVmaW5lIEFSX1BIWV9CQl9USEVSTV9BRENfNF9MQVRFU1RfVk9MVF9WQUxVRV9TCTgKIAotLyogQUlDIFJlZ2lzdGVycyAqLwotI2RlZmluZSBBUl9QSFlfQUlDX0NUUkxfMF9CMAkoQVJfU01fQkFTRSArIDB4NGIwKQotI2RlZmluZSBBUl9QSFlfQUlDX0NUUkxfMV9CMAkoQVJfU01fQkFTRSArIDB4NGI0KQotI2RlZmluZSBBUl9QSFlfQUlDX0NUUkxfMl9CMAkoQVJfU01fQkFTRSArIDB4NGI4KQotI2RlZmluZSBBUl9QSFlfQUlDX0NUUkxfM19CMAkoQVJfU01fQkFTRSArIDB4NGJjKQotI2RlZmluZSBBUl9QSFlfQUlDX1NUQVRfMF9CMAkoQVJfU01fQkFTRSArIDB4NGM0KSkKLSNkZWZpbmUgQVJfUEhZX0FJQ19TVEFUXzFfQjAJKEFSX1NNX0JBU0UgKyAweDRjOCkpCi0jZGVmaW5lIEFSX1BIWV9BSUNfQ1RSTF80X0IwCShBUl9TTV9CQVNFICsgMHg0YzApCi0jZGVmaW5lIEFSX1BIWV9BSUNfU1RBVF8yX0IwCShBUl9TTV9CQVNFICsgMHg0Y2MpCi0KICNkZWZpbmUgQVJfUEhZXzY1Tk1fQ0gwX1RYUkYzICAgICAgIDB4MTYwNDgKICNkZWZpbmUgQVJfUEhZXzY1Tk1fQ0gwX1RYUkYzX0NBUERJVjJHCQkweDAwMDAwMDFlCiAjZGVmaW5lIEFSX1BIWV82NU5NX0NIMF9UWFJGM19DQVBESVYyR19TCTEKQEAgLTk4OSwyMSArOTc5LDYgQEAKICNkZWZpbmUgQVJfUEhZX1RYX0lRQ0FMX1NUQVRVU19CMSAgIChBUl9TTTFfQkFTRSArIDB4NDhjKQogI2RlZmluZSBBUl9QSFlfVFhfSVFDQUxfQ09SUl9DT0VGRl9CMShfaSkgICAgKEFSX1NNMV9CQVNFICsgMHg0NTAgKyAoKF9pKSA8PCAyKSkKIAotLyogU00gMSBBSUMgUmVnaXN0ZXJzICovCi0KLSNkZWZpbmUgQVJfUEhZX0FJQ19DVFJMXzBfQjEJKEFSX1NNMV9CQVNFICsgMHg0YjApCi0jZGVmaW5lIEFSX1BIWV9BSUNfQ1RSTF8xX0IxCShBUl9TTTFfQkFTRSArIDB4NGI0KQotI2RlZmluZSBBUl9QSFlfQUlDX0NUUkxfMl9CMQkoQVJfU00xX0JBU0UgKyAweDRiOCkKLSNkZWZpbmUgQVJfUEhZX0FJQ19TVEFUXzBfQjEJKEFSX1NNMV9CQVNFICsgKEFSX1NSRVZfOTQ2Ml8xMChhaCkgPyBcCi0JCQkJCTB4NGMwIDogMHg0YzQpKQotI2RlZmluZSBBUl9QSFlfQUlDX1NUQVRfMV9CMQkoQVJfU00xX0JBU0UgKyAoQVJfU1JFVl85NDYyXzEwKGFoKSA/IFwKLQkJCQkJMHg0YzQgOiAweDRjOCkpCi0jZGVmaW5lIEFSX1BIWV9BSUNfQ1RSTF80X0IxCShBUl9TTTFfQkFTRSArIDB4NGMwKQotI2RlZmluZSBBUl9QSFlfQUlDX1NUQVRfMl9CMQkoQVJfU00xX0JBU0UgKyAweDRjYykKLQotI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fQUREUl9CMQkoQVJfU00xX0JBU0UgKyAweDVmMCkKLSNkZWZpbmUgQVJfUEhZX0FJQ19TUkFNX0RBVEFfQjEJKEFSX1NNMV9CQVNFICsgMHg1ZjQpCi0KICNkZWZpbmUgQVJfUEhZX1JUVF9UQUJMRV9TV19JTlRGX0IoaSkJKDB4Mzg0ICsgKChpKSA/IFwKIAkJCQkJQVJfU00xX0JBU0UgOiBBUl9TTV9CQVNFKSkKICNkZWZpbmUgQVJfUEhZX1JUVF9UQUJMRV9TV19JTlRGXzFfQihpKQkoMHgzODggKyAoKGkpID8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19ydHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcnR0LmMKaW5kZXggOTM0NDE4OC4uZTRkMTFmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19ydHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3J0dC5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAlpbnQgY2hhaW4sIGk7CiAKIAlmb3IgKGNoYWluID0gMDsgY2hhaW4gPCBBUjkzMDBfTUFYX0NIQUlOUzsgY2hhaW4rKykgewotCQlpZiAoIShhaC0+cnhjaGFpbm1hc2sgJiAoMSA8PCBjaGFpbikpKQorCQlpZiAoIShhaC0+Y2Fwcy5yeF9jaGFpbm1hc2sgJiAoMSA8PCBjaGFpbikpKQogCQkJY29udGludWU7CiAJCWZvciAoaSA9IDA7IGkgPCBNQVhfUlRUX1RBQkxFX0VOVFJZOyBpKyspIHsKIAkJCWFyOTAwM19od19ydHRfbG9hZF9oaXN0X2VudHJ5KGFoLCBjaGFpbiwgaSwKQEAgLTE3MSw3ICsxNzEsNyBAQAogCWludCBjaGFpbiwgaTsKIAogCWZvciAoY2hhaW4gPSAwOyBjaGFpbiA8IEFSOTMwMF9NQVhfQ0hBSU5TOyBjaGFpbisrKSB7Ci0JCWlmICghKGFoLT5yeGNoYWlubWFzayAmICgxIDw8IGNoYWluKSkpCisJCWlmICghKGFoLT5jYXBzLnJ4X2NoYWlubWFzayAmICgxIDw8IGNoYWluKSkpCiAJCQljb250aW51ZTsKIAkJZm9yIChpID0gMDsgaSA8IE1BWF9SVFRfVEFCTEVfRU5UUlk7IGkrKykgewogCQkJYWgtPmNhbGRhdGEtPnJ0dF90YWJsZVtjaGFpbl1baV0gPQpAQCAtMTkzLDcgKzE5Myw3IEBACiAJaW50IGNoYWluLCBpOwogCiAJZm9yIChjaGFpbiA9IDA7IGNoYWluIDwgQVI5MzAwX01BWF9DSEFJTlM7IGNoYWluKyspIHsKLQkJaWYgKCEoYWgtPnJ4Y2hhaW5tYXNrICYgKDEgPDwgY2hhaW4pKSkKKwkJaWYgKCEoYWgtPmNhcHMucnhfY2hhaW5tYXNrICYgKDEgPDwgY2hhaW4pKSkKIAkJCWNvbnRpbnVlOwogCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JUVF9UQUJMRV9FTlRSWTsgaSsrKQogCQkJYXI5MDAzX2h3X3J0dF9sb2FkX2hpc3RfZW50cnkoYWgsIGNoYWluLCBpLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfd293LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3dvdy5jCmluZGV4IDg2YmZjOTYuLmJlYTQxZGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3dvdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfd293LmMKQEAgLTIwLDExICsyMCwyNSBAQAogI2luY2x1ZGUgInJlZ193b3cuaCIKICNpbmNsdWRlICJody1vcHMuaCIKIAorc3RhdGljIHZvaWQgYXRoOWtfaHdfc2V0X3N0YV9wb3dlcnNhdmUoc3RydWN0IGF0aF9odyAqYWgpCit7CisJaWYgKCFhdGg5a19od19tY2lfaXNfZW5hYmxlZChhaCkpCisJCWdvdG8gc2V0OworCS8qCisJICogSWYgTUNJIGlzIGJlaW5nIHVzZWQsIHNldCBQV1JfU0FWIG9ubHkgd2hlbiBNQ0kncworCSAqIFBTIHN0YXRlIGlzIGRpc2FibGVkLgorCSAqLworCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfR0VUX1dMQU5fUFNfU1RBVEUpICE9IE1DSV9QU19ESVNBQkxFKQorCQlyZXR1cm47CitzZXQ6CisJUkVHX1NFVF9CSVQoYWgsIEFSX1NUQV9JRDEsIEFSX1NUQV9JRDFfUFdSX1NBVik7Cit9CisKIHN0YXRpYyB2b2lkIGF0aDlrX2h3X3NldF9wb3dlcm1vZGVfd293X3NsZWVwKHN0cnVjdCBhdGhfaHcgKmFoKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCi0JUkVHX1NFVF9CSVQoYWgsIEFSX1NUQV9JRDEsIEFSX1NUQV9JRDFfUFdSX1NBVik7CisJYXRoOWtfaHdfc2V0X3N0YV9wb3dlcnNhdmUoYWgpOwogCiAJLyogc2V0IHJ4IGRpc2FibGUgYml0ICovCiAJUkVHX1dSSVRFKGFoLCBBUl9DUiwgQVJfQ1JfUlhEKTsKQEAgLTQ0LDYgKzU4LDkgQEAKIAkJCVJFR19DTFJfQklUKGFoLCBBUl9ESVJFQ1RfQ09OTkVDVCwgQVJfRENfVFNGMl9FTkFCTEUpOwogCX0KIAorCWlmIChhdGg5a19od19tY2lfaXNfZW5hYmxlZChhaCkpCisJCVJFR19XUklURShhaCwgQVJfUlRDX0tFRVBfQVdBS0UsIDB4Mik7CisKIAlSRUdfV1JJVEUoYWgsIEFSX1JUQ19GT1JDRV9XQUtFLCBBUl9SVENfRk9SQ0VfV0FLRV9PTl9JTlQpOwogfQogCkBAIC03NCw4ICs5MSw2IEBACiAJZm9yIChpID0gMDsgaSA8IEtBTF9OVU1fREVTQ19XT1JEUzsgaSsrKQogCQlSRUdfV1JJVEUoYWgsIChBUl9XT1dfS0FfREVTQ19XT1JEMiArIGkgKiA0KSwgY3RsW2ldKTsKIAotCVJFR19XUklURShhaCwgKEFSX1dPV19LQV9ERVNDX1dPUkQyICsgaSAqIDQpLCBjdGxbaV0pOwotCiAJZGF0YV93b3JkWzBdID0gKEtBTF9GUkFNRV9UWVBFIDw8IDIpIHwgKEtBTF9GUkFNRV9TVUJfVFlQRSA8PCA0KSB8CiAJCSAgICAgICAoS0FMX1RPX0RTIDw8IDgpIHwgKEtBTF9EVVJBVElPTl9JRCA8PCAxNik7CiAJZGF0YV93b3JkWzFdID0gKGFwX21hY19hZGRyWzNdIDw8IDI0KSB8IChhcF9tYWNfYWRkclsyXSA8PCAxNikgfApAQCAtODgsOSArMTAzLDExIEBACiAJCSAgICAgICAoYXBfbWFjX2FkZHJbMV0gPDwgOCkgfCAoYXBfbWFjX2FkZHJbMF0pOwogCWRhdGFfd29yZFs1XSA9IChhcF9tYWNfYWRkcls1XSA8PCA4KSB8IChhcF9tYWNfYWRkcls0XSk7CiAKLQlpZiAoQVJfU1JFVl85NDYyXzIwKGFoKSkgewotCQkvKiBBUjk0NjIgMi4wIGhhcyBhbiBleHRyYSBkZXNjcmlwdG9yIHdvcmQgKHRpbWUgYmFzZWQKLQkJICogZGlzY2FyZCkgY29tcGFyZWQgdG8gb3RoZXIgY2hpcHMgKi8KKwlpZiAoQVJfU1JFVl85NDYyXzIwX09SX0xBVEVSKGFoKSB8fCBBUl9TUkVWXzk1NjUoYWgpKSB7CisJCS8qCisJCSAqIEFSOTQ2MiAyLjAgYW5kIEFSOTU2NSBoYXZlIGFuIGV4dHJhIGRlc2NyaXB0b3Igd29yZAorCQkgKiAodGltZSBiYXNlZCBkaXNjYXJkKSBjb21wYXJlZCB0byBvdGhlciBjaGlwcy4KKwkJICovCiAJCVJFR19XUklURShhaCwgKEFSX1dPV19LQV9ERVNDX1dPUkQyICsgKDEyICogNCkpLCAwKTsKIAkJd293X2thX2RhdGFfd29yZDAgPSBBUl9XT1dfVFhCVUYoMTMpOwogCX0gZWxzZSB7CkBAIC05OSw3ICsxMTYsNiBAQAogCiAJZm9yIChpID0gMDsgaSA8IEtBTF9OVU1fREFUQV9XT1JEUzsgaSsrKQogCQlSRUdfV1JJVEUoYWgsICh3b3dfa2FfZGF0YV93b3JkMCArIGkqNCksIGRhdGFfd29yZFtpXSk7Ci0KIH0KIAogaW50IGF0aDlrX2h3X3dvd19hcHBseV9wYXR0ZXJuKHN0cnVjdCBhdGhfaHcgKmFoLCB1OCAqdXNlcl9wYXR0ZXJuLApAQCAtMTcwLDE4ICsxODYsMTcgQEAKIAl1MzIgdmFsID0gMCwgcnZhbDsKIAogCS8qCi0JICogcmVhZCB0aGUgV29XIHN0YXR1cyByZWdpc3RlciB0byBrbm93Ci0JICogdGhlIHdha2V1cCByZWFzb24KKwkgKiBSZWFkIHRoZSBXb1cgc3RhdHVzIHJlZ2lzdGVyIHRvIGtub3cKKwkgKiB0aGUgd2FrZXVwIHJlYXNvbi4KIAkgKi8KIAlydmFsID0gUkVHX1JFQUQoYWgsIEFSX1dPV19QQVRURVJOKTsKIAl2YWwgPSBBUl9XT1dfU1RBVFVTKHJ2YWwpOwogCiAJLyoKLQkgKiBtYXNrIG9ubHkgdGhlIFdvVyBldmVudHMgdGhhdCB3ZSBoYXZlIGVuYWJsZWQuIFNvbWV0aW1lcworCSAqIE1hc2sgb25seSB0aGUgV29XIGV2ZW50cyB0aGF0IHdlIGhhdmUgZW5hYmxlZC4gU29tZXRpbWVzCiAJICogd2UgaGF2ZSBzcHVyaW91cyBXb1cgZXZlbnRzIGZyb20gdGhlIEFSX1dPV19QQVRURVJOCiAJICogcmVnaXN0ZXIuIFRoaXMgbWFzayB3aWxsIGNsZWFuIGl0IHVwLgogCSAqLwotCiAJdmFsICY9IGFoLT53b3cud293X2V2ZW50X21hc2s7CiAKIAlpZiAodmFsKSB7CkBAIC0xOTUsNiArMjEwLDE1IEBACiAJCQl3b3dfc3RhdHVzIHw9IEFIX1dPV19CRUFDT05fTUlTUzsKIAl9CiAKKwlydmFsID0gUkVHX1JFQUQoYWgsIEFSX01BQ19QQ1VfV09XNCk7CisJdmFsID0gQVJfV09XX1NUQVRVUzIocnZhbCk7CisJdmFsICY9IGFoLT53b3cud293X2V2ZW50X21hc2syOworCisJaWYgKHZhbCkgeworCQlpZiAoQVJfV09XMl9QQVRURVJOX0ZPVU5EKHZhbCkpCisJCQl3b3dfc3RhdHVzIHw9IEFIX1dPV19VU0VSX1BBVFRFUk5fRU47CisJfQorCiAJLyoKIAkgKiBzZXQgYW5kIGNsZWFyIFdPV19QTUVfQ0xFQVIgcmVnaXN0ZXJzIGZvciB0aGUgY2hpcCB0bwogCSAqIGdlbmVyYXRlIG5leHQgd293IHNpZ25hbC4KQEAgLTIwNiwxMCArMjMwLDEyIEBACiAJCUFSX1BNQ1RSTF9QV1JfU1RBVEVfRDFEMyk7CiAKIAkvKgotCSAqIGNsZWFyIGFsbCBldmVudHMKKwkgKiBDbGVhciBhbGwgZXZlbnRzLgogCSAqLwogCVJFR19XUklURShhaCwgQVJfV09XX1BBVFRFUk4sCiAJCSAgQVJfV09XX0NMRUFSX0VWRU5UUyhSRUdfUkVBRChhaCwgQVJfV09XX1BBVFRFUk4pKSk7CisJUkVHX1dSSVRFKGFoLCBBUl9NQUNfUENVX1dPVzQsCisJCSAgQVJfV09XX0NMRUFSX0VWRU5UUzIoUkVHX1JFQUQoYWgsIEFSX01BQ19QQ1VfV09XNCkpKTsKIAogCS8qCiAJICogcmVzdG9yZSB0aGUgYmVhY29uIHRocmVzaG9sZCB0byBpbml0IHZhbHVlCkBAIC0yMjYsNyArMjUyLDE1IEBACiAJaWYgKGFoLT5pc19wY2lleHByZXNzKQogCQlhdGg5a19od19jb25maWdwY2lwb3dlcnNhdmUoYWgsIGZhbHNlKTsKIAorCWlmIChBUl9TUkVWXzk0NjIoYWgpIHx8IEFSX1NSRVZfOTU2NShhaCkgfHwgQVJfU1JFVl85NDg1KGFoKSkgeworCQl1MzIgZGMgPSBSRUdfUkVBRChhaCwgQVJfRElSRUNUX0NPTk5FQ1QpOworCisJCWlmICghKGRjICYgQVJfRENfVFNGMl9FTkFCTEUpKQorCQkJYXRoOWtfaHdfZ2VuX3RpbWVyX3N0YXJ0X3RzZjIoYWgpOworCX0KKwogCWFoLT53b3cud293X2V2ZW50X21hc2sgPSAwOworCWFoLT53b3cud293X2V2ZW50X21hc2syID0gMDsKIAogCXJldHVybiB3b3dfc3RhdHVzOwogfQpAQCAtNDA4LDYgKzQ0Miw5IEBACiAKIAlhdGg5a19od193b3dfc2V0X2Fyd3JfcmVnKGFoKTsKIAorCWlmIChhdGg5a19od19tY2lfaXNfZW5hYmxlZChhaCkpCisJCVJFR19XUklURShhaCwgQVJfUlRDX0tFRVBfQVdBS0UsIDB4Mik7CisKIAkvKiBIVyBXb1cgKi8KIAlSRUdfQ0xSX0JJVChhaCwgQVJfUENVX01JU0NfTU9ERTMsIEJJVCg1KSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hdGg5ay5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2F0aDlrLmgKaW5kZXggMGY4ZTk0Ni4uYTdhODFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2F0aDlrLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2F0aDlrLmgKQEAgLTE4NCwxMiArMTg0LDEyIEBACiAJc3RydWN0IGF0aF9idWYgKmJmOwogCXUxNiBmcmFtZWxlbjsKIAlzOCB0eHE7Ci0JZW51bSBhdGg5a19rZXlfdHlwZSBrZXl0eXBlOwogCXU4IGtleWl4OwogCXU4IHJ0c2N0c19yYXRlOwogCXU4IHJldHJpZXMgOiA3OwogCXU4IGJhd190cmFja2VkIDogMTsKIAl1OCB0eF9wb3dlcjsKKwllbnVtIGF0aDlrX2tleV90eXBlIGtleXR5cGU6MjsKIH07CiAKIHN0cnVjdCBhdGhfcnhidWYgewpAQCAtNjQ1LDYgKzY0NSw3IEBACiAJCQkgICAgICAgc3RydWN0IGF0aDlrX3ZpZl9pdGVyX2RhdGEgKml0ZXJfZGF0YSk7CiB2b2lkIGF0aDlrX2NhbGN1bGF0ZV9zdW1tYXJ5X3N0YXRlKHN0cnVjdCBhdGhfc29mdGMgKnNjLAogCQkJCSAgIHN0cnVjdCBhdGhfY2hhbmN0eCAqY3R4KTsKK3ZvaWQgYXRoOWtfc2V0X3R4cG93ZXIoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwogCiAvKioqKioqKioqKioqKioqKioqKi8KIC8qIEJlYWNvbiBIYW5kbGluZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2JlYWNvbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2JlYWNvbi5jCmluZGV4IGNiMzY2YWQuLmY1MGE2YmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9iZWFjb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYmVhY29uLmMKQEAgLTIxOSwxMiArMjE5LDE1IEBACiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpOwogCXN0cnVjdCBhdGhfdmlmICphdnAgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CiAJc3RydWN0IGF0aF9idWYgKmJmID0gYXZwLT5hdl9iY2J1ZjsKKwlzdHJ1Y3QgYXRoX2JlYWNvbl9jb25maWcgKmN1cl9jb25mID0gJnNjLT5jdXJfY2hhbi0+YmVhY29uOwogCiAJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIlJlbW92aW5nIGludGVyZmFjZSBhdCBiZWFjb24gc2xvdDogJWRcbiIsCiAJCWF2cC0+YXZfYnNsb3QpOwogCiAJdGFza2xldF9kaXNhYmxlKCZzYy0+YmNvbl90YXNrbGV0KTsKIAorCWN1cl9jb25mLT5lbmFibGVfYmVhY29uICY9IH5CSVQoYXZwLT5hdl9ic2xvdCk7CisKIAlpZiAoYmYgJiYgYmYtPmJmX21wZHUpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGJmLT5iZl9tcGR1OwogCQlkbWFfdW5tYXBfc2luZ2xlKHNjLT5kZXYsIGJmLT5iZl9idWZfYWRkciwKQEAgLTUyMSw4ICs1MjQsNyBAQAogCX0KIAogCWlmIChzYy0+c2NfYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgewotCQlpZiAoKHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkgfHwKLQkJICAgIChzYy0+bmJjbnZpZnMgPiAxKSkgeworCQlpZiAodmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKSB7CiAJCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAogCQkJCSJBbiBBUCBpbnRlcmZhY2UgaXMgYWxyZWFkeSBwcmVzZW50ICFcbiIpOwogCQkJcmV0dXJuIGZhbHNlOwpAQCAtNjE2LDEyICs2MTgsMTQgQEAKIAkgKiBlbmFibGluZy9kaXNhYmxpbmcgU1dCQS4KIAkgKi8KIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKSB7Ci0JCWlmICghYnNzX2NvbmYtPmVuYWJsZV9iZWFjb24gJiYKLQkJICAgIChzYy0+bmJjbnZpZnMgPD0gMSkpIHsKLQkJCWN1cl9jb25mLT5lbmFibGVfYmVhY29uID0gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoYnNzX2NvbmYtPmVuYWJsZV9iZWFjb24pIHsKLQkJCWN1cl9jb25mLT5lbmFibGVfYmVhY29uID0gdHJ1ZTsKLQkJCWF0aDlrX2NhY2hlX2JlYWNvbl9jb25maWcoc2MsIGN0eCwgYnNzX2NvbmYpOworCQlib29sIGVuYWJsZWQgPSBjdXJfY29uZi0+ZW5hYmxlX2JlYWNvbjsKKworCQlpZiAoIWJzc19jb25mLT5lbmFibGVfYmVhY29uKSB7CisJCQljdXJfY29uZi0+ZW5hYmxlX2JlYWNvbiAmPSB+QklUKGF2cC0+YXZfYnNsb3QpOworCQl9IGVsc2UgeworCQkJY3VyX2NvbmYtPmVuYWJsZV9iZWFjb24gfD0gQklUKGF2cC0+YXZfYnNsb3QpOworCQkJaWYgKCFlbmFibGVkKQorCQkJCWF0aDlrX2NhY2hlX2JlYWNvbl9jb25maWcoc2MsIGN0eCwgYnNzX2NvbmYpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmMKaW5kZXggM2RmYzJjNy4uNWEwODRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9idGNvZXguYwpAQCAtMTAzLDcgKzEwMyw5IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgeworCWlmIChhaC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX01DSSkgeworCQlidGNvZXhfaHctPnNjaGVtZSA9IEFUSF9CVENPRVhfQ0ZHX01DSTsKKwl9IGVsc2UgaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKIAkJYnRjb2V4X2h3LT5zY2hlbWUgPSBBVEhfQlRDT0VYX0NGR18zV0lSRTsKIAkJYnRjb2V4X2h3LT5idGFjdGl2ZV9ncGlvID0gQVRIX0JUQUNUSVZFX0dQSU9fOTMwMDsKIAkJYnRjb2V4X2h3LT53bGFuYWN0aXZlX2dwaW8gPSBBVEhfV0xBTkFDVElWRV9HUElPXzkzMDA7CkBAIC0zMDcsNiArMzA5LDE4IEBACiAJYnRjb2V4LT5lbmFibGVkID0gdHJ1ZTsKIH0KIAorc3RhdGljIHZvaWQgYXRoOWtfaHdfYnRjb2V4X2Rpc2FibGVfbWNpKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGhfYnRjb2V4X2h3ICpidGNvZXhfaHcgPSAmYWgtPmJ0Y29leF9odzsKKwlpbnQgaTsKKworCWF0aDlrX2h3X2J0Y29leF9idF9zdG9tcChhaCwgQVRIX0JUQ09FWF9TVE9NUF9OT05FKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUjkzMDBfTlVNX0JUX1dFSUdIVFM7IGkrKykKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQ09FWF9XTF9XRUlHSFRTKGkpLAorCQkJICBidGNvZXhfaHctPndsYW5fd2VpZ2h0W2ldKTsKK30KKwogdm9pZCBhdGg5a19od19idGNvZXhfZW5hYmxlKHN0cnVjdCBhdGhfaHcgKmFoKQogewogCXN0cnVjdCBhdGhfYnRjb2V4X2h3ICpidGNvZXhfaHcgPSAmYWgtPmJ0Y29leF9odzsKQEAgLTMxOCwxNyArMzMyLDE4IEBACiAJCWF0aDlrX2h3X2J0Y29leF9lbmFibGVfMndpcmUoYWgpOwogCQlicmVhazsKIAljYXNlIEFUSF9CVENPRVhfQ0ZHXzNXSVJFOgotCQlpZiAoQVJfU1JFVl85NDYyKGFoKSB8fCBBUl9TUkVWXzk1NjUoYWgpKSB7Ci0JCQlhdGg5a19od19idGNvZXhfZW5hYmxlX21jaShhaCk7Ci0JCQlyZXR1cm47Ci0JCX0KIAkJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZV8zd2lyZShhaCk7CiAJCWJyZWFrOworCWNhc2UgQVRIX0JUQ09FWF9DRkdfTUNJOgorCQlhdGg5a19od19idGNvZXhfZW5hYmxlX21jaShhaCk7CisJCWJyZWFrOwogCX0KIAotCVJFR19STVcoYWgsIEFSX0dQSU9fUERQVSwKLQkJKDB4MiA8PCAoYnRjb2V4X2h3LT5idGFjdGl2ZV9ncGlvICogMikpLAotCQkoMHgzIDw8IChidGNvZXhfaHctPmJ0YWN0aXZlX2dwaW8gKiAyKSkpOworCWlmIChhdGg5a19od19nZXRfYnRjb2V4X3NjaGVtZShhaCkgIT0gQVRIX0JUQ09FWF9DRkdfTUNJKSB7CisJCVJFR19STVcoYWgsIEFSX0dQSU9fUERQVSwKKwkJCSgweDIgPDwgKGJ0Y29leF9ody0+YnRhY3RpdmVfZ3BpbyAqIDIpKSwKKwkJCSgweDMgPDwgKGJ0Y29leF9ody0+YnRhY3RpdmVfZ3BpbyAqIDIpKSk7CisJfQogCiAJYWgtPmJ0Y29leF9ody5lbmFibGVkID0gdHJ1ZTsKIH0KQEAgLTM0MCwxNCArMzU1LDE0IEBACiAJaW50IGk7CiAKIAlidGNvZXhfaHctPmVuYWJsZWQgPSBmYWxzZTsKLQlpZiAoQVJfU1JFVl85NDYyKGFoKSB8fCBBUl9TUkVWXzk1NjUoYWgpKSB7Ci0JCWF0aDlrX2h3X2J0Y29leF9idF9zdG9tcChhaCwgQVRIX0JUQ09FWF9TVE9NUF9OT05FKTsKLQkJZm9yIChpID0gMDsgaSA8IEFSOTMwMF9OVU1fQlRfV0VJR0hUUzsgaSsrKQotCQkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQ09FWF9XTF9XRUlHSFRTKGkpLAotCQkJCSAgYnRjb2V4X2h3LT53bGFuX3dlaWdodFtpXSk7CisKKwlpZiAoYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoYWgpID09IEFUSF9CVENPRVhfQ0ZHX01DSSkgeworCQlhdGg5a19od19idGNvZXhfZGlzYWJsZV9tY2koYWgpOwogCQlyZXR1cm47CiAJfQotCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBidGNvZXhfaHctPndsYW5hY3RpdmVfZ3BpbywgMCk7CisKKwlpZiAoIUFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpCisJCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBidGNvZXhfaHctPndsYW5hY3RpdmVfZ3BpbywgMCk7CiAKIAlhdGg5a19od19jZmdfb3V0cHV0KGFoLCBidGNvZXhfaHctPndsYW5hY3RpdmVfZ3BpbywKIAkJCUFSX0dQSU9fT1VUUFVUX01VWF9BU19PVVRQVVQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5oCmluZGV4IDZkZTI2ZWEuLmNkMmYwYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9idGNvZXguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmgKQEAgLTQ0LDYgKzQ0LDkgQEAKIAogI2RlZmluZSBBUjkzMDBfTlVNX0JUX1dFSUdIVFMgICA0CiAjZGVmaW5lIEFSOTMwMF9OVU1fV0xBTl9XRUlHSFRTIDQKKworI2RlZmluZSBBVEhfQUlDX01BWF9CVF9DSEFOTkVMICA3OQorCiAvKiBEZWZpbmVzIHRoZSBCVCBBUl9CVF9DT0VYX1dHSFQgdXNlZCAqLwogZW51bSBhdGhfc3RvbXBfdHlwZSB7CiAJQVRIX0JUQ09FWF9TVE9NUF9BTEwsCkBAIC01OCw2ICs2MSw3IEBACiAJQVRIX0JUQ09FWF9DRkdfTk9ORSwKIAlBVEhfQlRDT0VYX0NGR18yV0lSRSwKIAlBVEhfQlRDT0VYX0NGR18zV0lSRSwKKwlBVEhfQlRDT0VYX0NGR19NQ0ksCiB9OwogCiBzdHJ1Y3QgYXRoOWtfaHdfbWNpIHsKQEAgLTkyLDkgKzk2LDE4IEBACiAJdTMyIGxhc3RfcmVjb3Zlcnk7CiB9OwogCitzdHJ1Y3QgYXRoOWtfaHdfYWljIHsKKwlib29sIGFpY19lbmFibGVkOworCXU4IGFpY19jYWxfc3RhdGU7CisJdTggYWljX2NhbGVkX2NoYW47CisJdTMyIGFpY19zcmFtW0FUSF9BSUNfTUFYX0JUX0NIQU5ORUxdOworCXUzMiBhaWNfY2FsX3N0YXJ0X3RpbWU7Cit9OworCiBzdHJ1Y3QgYXRoX2J0Y29leF9odyB7CiAJZW51bSBhdGhfYnRjb2V4X3NjaGVtZSBzY2hlbWU7CiAJc3RydWN0IGF0aDlrX2h3X21jaSBtY2k7CisJc3RydWN0IGF0aDlrX2h3X2FpYyBhaWM7CiAJYm9vbCBlbmFibGVkOwogCXU4IHdsYW5hY3RpdmVfZ3BpbzsKIAl1OCBidGFjdGl2ZV9ncGlvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwppbmRleCBlMjAwYTZlLi4zZTJlMjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwpAQCAtMjM4LDcgKzIzOCw2IEBACiB7CiAJc3RydWN0IGF0aDlrX25mY2FsX2hpc3QgKmggPSBOVUxMOwogCXVuc2lnbmVkIGksIGo7Ci0JaW50MzJfdCB2YWw7CiAJdTggY2hhaW5tYXNrID0gKGFoLT5yeGNoYWlubWFzayA8PCAzKSB8IGFoLT5yeGNoYWlubWFzazsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKIAlzMTYgZGVmYXVsdF9uZiA9IGF0aDlrX2h3X2dldF9kZWZhdWx0X25mKGFoLCBjaGFuKTsKQEAgLTI0Niw2ICsyNDUsNyBAQAogCWlmIChhaC0+Y2FsZGF0YSkKIAkJaCA9IGFoLT5jYWxkYXRhLT5uZkNhbEhpc3Q7CiAKKwlFTkFCTEVfUkVHX1JNV19CVUZGRVIoYWgpOwogCWZvciAoaSA9IDA7IGkgPCBOVU1fTkZfUkVBRElOR1M7IGkrKykgewogCQlpZiAoY2hhaW5tYXNrICYgKDEgPDwgaSkpIHsKIAkJCXMxNiBuZnZhbDsKQEAgLTI1OCwxMCArMjU4LDggQEAKIAkJCWVsc2UKIAkJCQluZnZhbCA9IGRlZmF1bHRfbmY7CiAKLQkJCXZhbCA9IFJFR19SRUFEKGFoLCBhaC0+bmZfcmVnc1tpXSk7Ci0JCQl2YWwgJj0gMHhGRkZGRkUwMDsKLQkJCXZhbCB8PSAoKCh1MzIpIG5mdmFsIDw8IDEpICYgMHgxZmYpOwotCQkJUkVHX1dSSVRFKGFoLCBhaC0+bmZfcmVnc1tpXSwgdmFsKTsKKwkJCVJFR19STVcoYWgsIGFoLT5uZl9yZWdzW2ldLAorCQkJCSgoKHUzMikgbmZ2YWwgPDwgMSkgJiAweDFmZiksIDB4MWZmKTsKIAkJfQogCX0KIApAQCAtMjc0LDYgKzI3Miw3IEBACiAJUkVHX0NMUl9CSVQoYWgsIEFSX1BIWV9BR0NfQ09OVFJPTCwKIAkJICAgIEFSX1BIWV9BR0NfQ09OVFJPTF9OT19VUERBVEVfTkYpOwogCVJFR19TRVRfQklUKGFoLCBBUl9QSFlfQUdDX0NPTlRST0wsIEFSX1BIWV9BR0NfQ09OVFJPTF9ORik7CisJUkVHX1JNV19CVUZGRVJfRkxVU0goYWgpOwogCiAJLyoKIAkgKiBXYWl0IGZvciBsb2FkIHRvIGNvbXBsZXRlLCBzaG91bGQgYmUgZmFzdCwgYSBmZXcgMTBzIG9mIHVzLgpAQCAtMzA5LDE5ICszMDgsMTcgQEAKIAkgKiBieSB0aGUgbWVkaWFuIHdlIGp1c3QgbG9hZGVkLiAgVGhpcyB3aWxsIGJlIGluaXRpYWwgKGFuZCBtYXgpIHZhbHVlCiAJICogb2YgbmV4dCBub2lzZSBmbG9vciBjYWxpYnJhdGlvbiB0aGUgYmFzZWJhbmQgZG9lcy4KIAkgKi8KLQlFTkFCTEVfUkVHV1JJVEVfQlVGRkVSKGFoKTsKKwlFTkFCTEVfUkVHX1JNV19CVUZGRVIoYWgpOwogCWZvciAoaSA9IDA7IGkgPCBOVU1fTkZfUkVBRElOR1M7IGkrKykgewogCQlpZiAoY2hhaW5tYXNrICYgKDEgPDwgaSkpIHsKIAkJCWlmICgoaSA+PSBBUjU0MTZfTUFYX0NIQUlOUykgJiYgIUlTX0NIQU5fSFQ0MChjaGFuKSkKIAkJCQljb250aW51ZTsKIAotCQkJdmFsID0gUkVHX1JFQUQoYWgsIGFoLT5uZl9yZWdzW2ldKTsKLQkJCXZhbCAmPSAweEZGRkZGRTAwOwotCQkJdmFsIHw9ICgoKHUzMikgKC01MCkgPDwgMSkgJiAweDFmZik7Ci0JCQlSRUdfV1JJVEUoYWgsIGFoLT5uZl9yZWdzW2ldLCB2YWwpOworCQkJUkVHX1JNVyhhaCwgYWgtPm5mX3JlZ3NbaV0sCisJCQkJCSgoKHUzMikgKC01MCkgPDwgMSkgJiAweDFmZiksIDB4MWZmKTsKIAkJfQogCX0KLQlSRUdXUklURV9CVUZGRVJfRkxVU0goYWgpOworCVJFR19STVdfQlVGRkVSX0ZMVVNIKGFoKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NvbW1vbi5oCmluZGV4IDJiNzlhNTYuLmQyMzczNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY29tbW9uLmgKQEAgLTU0LDcgKzU0LDcgQEAKIAl1MTYgZHRpbV9wZXJpb2Q7CiAJdTE2IGJtaXNzX3RpbWVvdXQ7CiAJdTggZHRpbV9jb3VudDsKLQlib29sIGVuYWJsZV9iZWFjb247CisJdTggZW5hYmxlX2JlYWNvbjsKIAlib29sIGlic3NfY3JlYXRvcjsKIAl1MzIgbmV4dHRidHQ7CiAJdTMyIGludHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMKaW5kZXggNTBhMmUwYS4uZGJmOGY0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMKQEAgLTExNTYsNyArMTE1NiwxMCBAQAogCiAJaWYgKHRwY19lbmFibGVkICE9IGFoLT50cGNfZW5hYmxlZCkgewogCQlhaC0+dHBjX2VuYWJsZWQgPSB0cGNfZW5hYmxlZDsKLQkJYXRoOWtfaHdfc2V0X3R4cG93ZXJsaW1pdChhaCwgc2MtPmN1cl9jaGFuLT50eHBvd2VyLCBmYWxzZSk7CisKKwkJbXV0ZXhfbG9jaygmc2MtPm11dGV4KTsKKwkJYXRoOWtfc2V0X3R4cG93ZXIoc2MsIE5VTEwpOworCQltdXRleF91bmxvY2soJnNjLT5tdXRleCk7CiAJfQogCiAJcmV0dXJuIGNvdW50OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmcy5jCmluZGV4IDcyNjI3MWMuLmU5OGE5ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGZzLmMKQEAgLTEyNiw4ICsxMjYsMTkgQEAKIAlERlNfU1RBVF9JTkMoc2MsIHB1bHNlc19kZXRlY3RlZCk7CiAJcmV0dXJuIHRydWU7CiB9Ci0jdW5kZWYgUFJJX0NIX1JBREFSX0ZPVU5ECi0jdW5kZWYgRVhUX0NIX1JBREFSX0ZPVU5ECisKK3N0YXRpYyB2b2lkCithdGg5a19kZnNfcHJvY2Vzc19yYWRhcl9wdWxzZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IHB1bHNlX2V2ZW50ICpwZSkKK3sKKwlzdHJ1Y3QgZGZzX3BhdHRlcm5fZGV0ZWN0b3IgKnBkID0gc2MtPmRmc19kZXRlY3RvcjsKKwlERlNfU1RBVF9JTkMoc2MsIHB1bHNlc19wcm9jZXNzZWQpOworCWlmIChwZCA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKCFwZC0+YWRkX3B1bHNlKHBkLCBwZSkpCisJCXJldHVybjsKKwlERlNfU1RBVF9JTkMoc2MsIHJhZGFyX2RldGVjdGVkKTsKKwlpZWVlODAyMTFfcmFkYXJfZGV0ZWN0ZWQoc2MtPmh3KTsKK30KIAogLyoKICAqIERGUzogY2hlY2sgUEhZLWVycm9yIGZvciByYWRhciBwdWxzZSBhbmQgZmVlZCB0aGUgZGV0ZWN0b3IKQEAgLTE3NiwxOCArMTg3LDIxIEBACiAJYXJkLnB1bHNlX2xlbmd0aF9wcmkgPSB2ZGF0YV9lbmRbLTNdOwogCXBlLmZyZXEgPSBhaC0+Y3VyY2hhbi0+Y2hhbm5lbDsKIAlwZS50cyA9IG1hY3RpbWU7Ci0JaWYgKGF0aDlrX3Bvc3Rwcm9jZXNzX3JhZGFyX2V2ZW50KHNjLCAmYXJkLCAmcGUpKSB7Ci0JCXN0cnVjdCBkZnNfcGF0dGVybl9kZXRlY3RvciAqcGQgPSBzYy0+ZGZzX2RldGVjdG9yOwotCQlhdGhfZGJnKGNvbW1vbiwgREZTLAotCQkJImF0aDlrX2Rmc19wcm9jZXNzX3BoeWVycjogY2hhbm5lbD0lZCwgdHM9JWxsdSwgIgotCQkJIndpZHRoPSVkLCByc3NpPSVkLCBkZWx0YV90cz0lbGx1XG4iLAotCQkJcGUuZnJlcSwgcGUudHMsIHBlLndpZHRoLCBwZS5yc3NpLAotCQkJcGUudHMgLSBzYy0+ZGZzX3ByZXZfcHVsc2VfdHMpOwotCQlzYy0+ZGZzX3ByZXZfcHVsc2VfdHMgPSBwZS50czsKLQkJREZTX1NUQVRfSU5DKHNjLCBwdWxzZXNfcHJvY2Vzc2VkKTsKLQkJaWYgKHBkICE9IE5VTEwgJiYgcGQtPmFkZF9wdWxzZShwZCwgJnBlKSkgewotCQkJREZTX1NUQVRfSU5DKHNjLCByYWRhcl9kZXRlY3RlZCk7Ci0JCQlpZWVlODAyMTFfcmFkYXJfZGV0ZWN0ZWQoc2MtPmh3KTsKLQkJfQorCWlmICghYXRoOWtfcG9zdHByb2Nlc3NfcmFkYXJfZXZlbnQoc2MsICZhcmQsICZwZSkpCisJCXJldHVybjsKKworCWF0aF9kYmcoY29tbW9uLCBERlMsCisJCSJhdGg5a19kZnNfcHJvY2Vzc19waHllcnI6IHR5cGU9JWQsIGZyZXE9JWQsIHRzPSVsbHUsICIKKwkJIndpZHRoPSVkLCByc3NpPSVkLCBkZWx0YV90cz0lbGx1XG4iLAorCQlhcmQucHVsc2VfYndfaW5mbywgcGUuZnJlcSwgcGUudHMsIHBlLndpZHRoLCBwZS5yc3NpLAorCQlwZS50cyAtIHNjLT5kZnNfcHJldl9wdWxzZV90cyk7CisJc2MtPmRmc19wcmV2X3B1bHNlX3RzID0gcGUudHM7CisJaWYgKGFyZC5wdWxzZV9id19pbmZvICYgUFJJX0NIX1JBREFSX0ZPVU5EKQorCQlhdGg5a19kZnNfcHJvY2Vzc19yYWRhcl9wdWxzZShzYywgJnBlKTsKKwlpZiAoYXJkLnB1bHNlX2J3X2luZm8gJiBFWFRfQ0hfUkFEQVJfRk9VTkQpIHsKKwkJcGUuZnJlcSArPSBJU19DSEFOX0hUNDBQTFVTKGFoLT5jdXJjaGFuKSA/IDIwIDogLTIwOworCQlhdGg5a19kZnNfcHJvY2Vzc19yYWRhcl9wdWxzZShzYywgJnBlKTsKIAl9CiB9CisjdW5kZWYgUFJJX0NIX1JBREFSX0ZPVU5ECisjdW5kZWYgRVhUX0NIX1JBREFSX0ZPVU5ECmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmMKaW5kZXggOTcxZDc3MC4uY2M4MTQ4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb20uYwpAQCAtMjcsMTIgKzI3LDcgQEAKIHZvaWQgYXRoOWtfaHdfYW5hbG9nX3NoaWZ0X3JtdyhzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHJlZywgdTMyIG1hc2ssCiAJCQkgICAgICAgdTMyIHNoaWZ0LCB1MzIgdmFsKQogewotCXUzMiByZWdWYWw7Ci0KLQlyZWdWYWwgPSBSRUdfUkVBRChhaCwgcmVnKSAmIH5tYXNrOwotCXJlZ1ZhbCB8PSAodmFsIDw8IHNoaWZ0KSAmIG1hc2s7Ci0KLQlSRUdfV1JJVEUoYWgsIHJlZywgcmVnVmFsKTsKKwlSRUdfUk1XKGFoLCByZWcsICgodmFsIDw8IHNoaWZ0KSAmIG1hc2spLCBtYXNrKTsKIAogCWlmIChhaC0+Y29uZmlnLmFuYWxvZ19zaGlmdHJlZykKIAkJdWRlbGF5KDEwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzRrLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzRrLmMKaW5kZXggZTVhNzhkNC4uNDc3M2RhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV80ay5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fNGsuYwpAQCAtMzg5LDYgKzM4OSw3IEBACiAJCX0KIAl9CiAKKwlFTkFCTEVfUkVHX1JNV19CVUZGRVIoYWgpOwogCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9UUENSRzEsIEFSX1BIWV9UUENSRzFfTlVNX1BEX0dBSU4sCiAJCSAgICAgIChudW1YcGRHYWluIC0gMSkgJiAweDMpOwogCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9UUENSRzEsIEFSX1BIWV9UUENSRzFfUERfR0FJTl8xLApAQCAtMzk2LDYgKzM5Nyw3IEBACiAJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1RQQ1JHMSwgQVJfUEhZX1RQQ1JHMV9QRF9HQUlOXzIsCiAJCSAgICAgIHhwZEdhaW5WYWx1ZXNbMV0pOwogCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9UUENSRzEsIEFSX1BIWV9UUENSRzFfUERfR0FJTl8zLCAwKTsKKwlSRUdfUk1XX0JVRkZFUl9GTFVTSChhaCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVI1NDE2X0VFUDRLX01BWF9DSEFJTlM7IGkrKykgewogCQlyZWdDaGFpbk9mZnNldCA9IGkgKiAweDEwMDA7CkBAIC03NzAsMTUgKzc3MiwxNCBAQAogCQkJCSBzdHJ1Y3QgYXI1NDE2X2VlcHJvbV80ayAqZWVwLAogCQkJCSB1OCB0eFJ4QXR0ZW5Mb2NhbCkKIHsKLQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9TV0lUQ0hfQ0hBSU5fMCwKLQkJICBwTW9kYWwtPmFudEN0cmxDaGFpblswXSk7CisJRU5BQkxFX1JFR19STVdfQlVGRkVSKGFoKTsKKwlSRUdfUk1XKGFoLCBBUl9QSFlfU1dJVENIX0NIQUlOXzAsCisJCXBNb2RhbC0+YW50Q3RybENoYWluWzBdLCAwKTsKIAotCVJFR19XUklURShhaCwgQVJfUEhZX1RJTUlOR19DVFJMNCgwKSwKLQkJICAoUkVHX1JFQUQoYWgsIEFSX1BIWV9USU1JTkdfQ1RSTDQoMCkpICYKLQkJICAgfihBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ09SUl9RX1FfQ09GRiB8Ci0JCSAgICAgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNPUlJfUV9JX0NPRkYpKSB8Ci0JCSAgU00ocE1vZGFsLT5pcUNhbElDaFswXSwgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNPUlJfUV9JX0NPRkYpIHwKLQkJICBTTShwTW9kYWwtPmlxQ2FsUUNoWzBdLCBBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ09SUl9RX1FfQ09GRikpOworCVJFR19STVcoYWgsIEFSX1BIWV9USU1JTkdfQ1RSTDQoMCksCisJCVNNKHBNb2RhbC0+aXFDYWxJQ2hbMF0sIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDT1JSX1FfSV9DT0ZGKSB8CisJCVNNKHBNb2RhbC0+aXFDYWxRQ2hbMF0sIEFSX1BIWV9USU1JTkdfQ1RSTDRfSVFDT1JSX1FfUV9DT0ZGKSwKKwkJQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNPUlJfUV9RX0NPRkYgfCBBUl9QSFlfVElNSU5HX0NUUkw0X0lRQ09SUl9RX0lfQ09GRik7CiAKIAlpZiAoKGVlcC0+YmFzZUVlcEhlYWRlci52ZXJzaW9uICYgQVI1NDE2X0VFUF9WRVJfTUlOT1JfTUFTSykgPj0KIAkgICAgQVI1NDE2X0VFUF9NSU5PUl9WRVJfMykgewpAQCAtODE3LDYgKzgxOCw3IEBACiAJCSAgICAgIEFSOTI4MF9QSFlfUlhHQUlOX1RYUlhfQVRURU4sIHR4UnhBdHRlbkxvY2FsKTsKIAlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUlhHQUlOICsgMHgxMDAwLAogCQkgICAgICBBUjkyODBfUEhZX1JYR0FJTl9UWFJYX01BUkdJTiwgcE1vZGFsLT5yeFR4TWFyZ2luQ2hbMF0pOworCVJFR19STVdfQlVGRkVSX0ZMVVNIKGFoKTsKIH0KIAogLyoKQEAgLTkyOCw2ICs5MzAsNyBAQAogCQl9CiAJfQogCisJRU5BQkxFX1JFR19STVdfQlVGRkVSKGFoKTsKIAlpZiAoQVJfU1JFVl85MjcxKGFoKSkgewogCQlhdGg5a19od19hbmFsb2dfc2hpZnRfcm13KGFoLAogCQkJCQkgIEFSOTI4NV9BTl9SRjJHMywKQEAgLTEwMzIsMTggKzEwMzUsMTkgQEAKIAkJCQkJICBBUjkyODVfQU5fUkYyRzRfREIyXzRfUywKIAkJCQkJICBkYjJbNF0pOwogCX0KKwlSRUdfUk1XX0JVRkZFUl9GTFVTSChhaCk7CiAKLQorCUVOQUJMRV9SRUdfUk1XX0JVRkZFUihhaCk7CiAJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1NFVFRMSU5HLCBBUl9QSFlfU0VUVExJTkdfU1dJVENILAogCQkgICAgICBwTW9kYWwtPnN3aXRjaFNldHRsaW5nKTsKIAlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfREVTSVJFRF9TWiwgQVJfUEhZX0RFU0lSRURfU1pfQURDLAogCQkgICAgICBwTW9kYWwtPmFkY0Rlc2lyZWRTaXplKTsKIAotCVJFR19XUklURShhaCwgQVJfUEhZX1JGX0NUTDQsCi0JCSAgU00ocE1vZGFsLT50eEVuZFRvWHBhT2ZmLCBBUl9QSFlfUkZfQ1RMNF9UWF9FTkRfWFBBQV9PRkYpIHwKLQkJICBTTShwTW9kYWwtPnR4RW5kVG9YcGFPZmYsIEFSX1BIWV9SRl9DVEw0X1RYX0VORF9YUEFCX09GRikgfAotCQkgIFNNKHBNb2RhbC0+dHhGcmFtZVRvWHBhT24sIEFSX1BIWV9SRl9DVEw0X0ZSQU1FX1hQQUFfT04pICB8Ci0JCSAgU00ocE1vZGFsLT50eEZyYW1lVG9YcGFPbiwgQVJfUEhZX1JGX0NUTDRfRlJBTUVfWFBBQl9PTikpOworCVJFR19STVcoYWgsIEFSX1BIWV9SRl9DVEw0LAorCQlTTShwTW9kYWwtPnR4RW5kVG9YcGFPZmYsIEFSX1BIWV9SRl9DVEw0X1RYX0VORF9YUEFBX09GRikgfAorCQlTTShwTW9kYWwtPnR4RW5kVG9YcGFPZmYsIEFSX1BIWV9SRl9DVEw0X1RYX0VORF9YUEFCX09GRikgfAorCQlTTShwTW9kYWwtPnR4RnJhbWVUb1hwYU9uLCBBUl9QSFlfUkZfQ1RMNF9GUkFNRV9YUEFBX09OKSAgfAorCQlTTShwTW9kYWwtPnR4RnJhbWVUb1hwYU9uLCBBUl9QSFlfUkZfQ1RMNF9GUkFNRV9YUEFCX09OKSwgMCk7CiAKIAlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfUkZfQ1RMMywgQVJfUEhZX1RYX0VORF9UT19BMl9SWF9PTiwKIAkJICAgICAgcE1vZGFsLT50eEVuZFRvUnhPbik7CkBAIC0xMDcyLDYgKzEwNzYsOCBAQAogCQkJCSAgICAgIHBNb2RhbC0+c3dTZXR0bGVIdDQwKTsKIAl9CiAKKwlSRUdfUk1XX0JVRkZFUl9GTFVTSChhaCk7CisKIAliYl9kZXNpcmVkX3NjYWxlID0gKHBNb2RhbC0+YmJfc2NhbGVfc21ydF9hbnRlbm5hICYKIAkJCUVFUF80S19CQl9ERVNJUkVEX1NDQUxFX01BU0spOwogCWlmICgocEJhc2UtPnR4R2FpblR5cGUgPT0gMCkgJiYgKGJiX2Rlc2lyZWRfc2NhbGUgIT0gMCkpIHsKQEAgLTEwODAsNiArMTA4Niw3IEBACiAJCW1hc2sgPSBCSVQoMCl8QklUKDUpfEJJVCgxMCl8QklUKDE1KXxCSVQoMjApfEJJVCgyNSk7CiAJCXB3cmN0cmwgPSBtYXNrICogYmJfZGVzaXJlZF9zY2FsZTsKIAkJY2xyID0gbWFzayAqIDB4MWY7CisJCUVOQUJMRV9SRUdfUk1XX0JVRkZFUihhaCk7CiAJCVJFR19STVcoYWgsIEFSX1BIWV9UWF9QV1JDVFJMOCwgcHdyY3RybCwgY2xyKTsKIAkJUkVHX1JNVyhhaCwgQVJfUEhZX1RYX1BXUkNUUkwxMCwgcHdyY3RybCwgY2xyKTsKIAkJUkVHX1JNVyhhaCwgQVJfUEhZX0NIMF9UWF9QV1JDVFJMMTIsIHB3cmN0cmwsIGNscik7CkBAIC0xMDk0LDYgKzExMDEsNyBAQAogCQljbHIgPSBtYXNrICogMHgxZjsKIAkJUkVHX1JNVyhhaCwgQVJfUEhZX0NIMF9UWF9QV1JDVFJMMTEsIHB3cmN0cmwsIGNscik7CiAJCVJFR19STVcoYWgsIEFSX1BIWV9DSDBfVFhfUFdSQ1RSTDEzLCBwd3JjdHJsLCBjbHIpOworCQlSRUdfUk1XX0JVRkZFUl9GTFVTSChhaCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tX2RlZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV9kZWYuYwppbmRleCAwOTgwNTkwLi4wNTZmNTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tX2RlZi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fZGVmLmMKQEAgLTQ2Niw2ICs0NjYsNyBAQAogCQkJCSAgc3RydWN0IGFyNTQxNl9lZXByb21fZGVmICplZXAsCiAJCQkJICB1OCB0eFJ4QXR0ZW5Mb2NhbCwgaW50IHJlZ0NoYWluT2Zmc2V0LCBpbnQgaSkKIHsKKwlFTkFCTEVfUkVHX1JNV19CVUZGRVIoYWgpOwogCWlmIChBUjU0MTZfVkVSX01BU0sgPj0gQVI1NDE2X0VFUF9NSU5PUl9WRVJfMykgewogCQl0eFJ4QXR0ZW5Mb2NhbCA9IHBNb2RhbC0+dHhSeEF0dGVuQ2hbaV07CiAKQEAgLTQ4MywxNiArNDg0LDEyIEBACiAJCQkgICAgICBBUl9QSFlfR0FJTl8yR0haX1hBVFRFTjJfREIsCiAJCQkgICAgICBwTW9kYWwtPnhhdHRlbjJEYltpXSk7CiAJCX0gZWxzZSB7Ci0JCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9HQUlOXzJHSFogKyByZWdDaGFpbk9mZnNldCwKLQkJCSAgKFJFR19SRUFEKGFoLCBBUl9QSFlfR0FJTl8yR0haICsgcmVnQ2hhaW5PZmZzZXQpICYKLQkJCSAgIH5BUl9QSFlfR0FJTl8yR0haX0JTV19NQVJHSU4pCi0JCQkgIHwgU00ocE1vZGFsLT4gYnN3TWFyZ2luW2ldLAotCQkJICAgICAgIEFSX1BIWV9HQUlOXzJHSFpfQlNXX01BUkdJTikpOwotCQkJUkVHX1dSSVRFKGFoLCBBUl9QSFlfR0FJTl8yR0haICsgcmVnQ2hhaW5PZmZzZXQsCi0JCQkgIChSRUdfUkVBRChhaCwgQVJfUEhZX0dBSU5fMkdIWiArIHJlZ0NoYWluT2Zmc2V0KSAmCi0JCQkgICB+QVJfUEhZX0dBSU5fMkdIWl9CU1dfQVRURU4pCi0JCQkgIHwgU00ocE1vZGFsLT5ic3dBdHRlbltpXSwKLQkJCSAgICAgICBBUl9QSFlfR0FJTl8yR0haX0JTV19BVFRFTikpOworCQkJUkVHX1JNVyhhaCwgQVJfUEhZX0dBSU5fMkdIWiArIHJlZ0NoYWluT2Zmc2V0LAorCQkJCVNNKHBNb2RhbC0+IGJzd01hcmdpbltpXSwgQVJfUEhZX0dBSU5fMkdIWl9CU1dfTUFSR0lOKSwKKwkJCQlBUl9QSFlfR0FJTl8yR0haX0JTV19NQVJHSU4pOworCQkJUkVHX1JNVyhhaCwgQVJfUEhZX0dBSU5fMkdIWiArIHJlZ0NoYWluT2Zmc2V0LAorCQkJCVNNKHBNb2RhbC0+YnN3QXR0ZW5baV0sIEFSX1BIWV9HQUlOXzJHSFpfQlNXX0FUVEVOKSwKKwkJCQlBUl9QSFlfR0FJTl8yR0haX0JTV19BVFRFTik7CiAJCX0KIAl9CiAKQEAgLTUwNCwxNyArNTAxLDE0IEBACiAJCSAgICAgIEFSX1BIWV9SWEdBSU4gKyByZWdDaGFpbk9mZnNldCwKIAkJICAgICAgQVI5MjgwX1BIWV9SWEdBSU5fVFhSWF9NQVJHSU4sIHBNb2RhbC0+cnhUeE1hcmdpbkNoW2ldKTsKIAl9IGVsc2UgewotCQlSRUdfV1JJVEUoYWgsCi0JCQkgIEFSX1BIWV9SWEdBSU4gKyByZWdDaGFpbk9mZnNldCwKLQkJCSAgKFJFR19SRUFEKGFoLCBBUl9QSFlfUlhHQUlOICsgcmVnQ2hhaW5PZmZzZXQpICYKLQkJCSAgIH5BUl9QSFlfUlhHQUlOX1RYUlhfQVRURU4pCi0JCQkgIHwgU00odHhSeEF0dGVuTG9jYWwsIEFSX1BIWV9SWEdBSU5fVFhSWF9BVFRFTikpOwotCQlSRUdfV1JJVEUoYWgsCi0JCQkgIEFSX1BIWV9HQUlOXzJHSFogKyByZWdDaGFpbk9mZnNldCwKLQkJCSAgKFJFR19SRUFEKGFoLCBBUl9QSFlfR0FJTl8yR0haICsgcmVnQ2hhaW5PZmZzZXQpICYKLQkJCSAgIH5BUl9QSFlfR0FJTl8yR0haX1JYVFhfTUFSR0lOKSB8Ci0JCQkgIFNNKHBNb2RhbC0+cnhUeE1hcmdpbkNoW2ldLCBBUl9QSFlfR0FJTl8yR0haX1JYVFhfTUFSR0lOKSk7CisJCVJFR19STVcoYWgsIEFSX1BIWV9SWEdBSU4gKyByZWdDaGFpbk9mZnNldCwKKwkJCVNNKHR4UnhBdHRlbkxvY2FsLCBBUl9QSFlfUlhHQUlOX1RYUlhfQVRURU4pLAorCQkJQVJfUEhZX1JYR0FJTl9UWFJYX0FUVEVOKTsKKwkJUkVHX1JNVyhhaCwgQVJfUEhZX0dBSU5fMkdIWiArIHJlZ0NoYWluT2Zmc2V0LAorCQkJU00ocE1vZGFsLT5yeFR4TWFyZ2luQ2hbaV0sIEFSX1BIWV9HQUlOXzJHSFpfUlhUWF9NQVJHSU4pLAorCQkJQVJfUEhZX0dBSU5fMkdIWl9SWFRYX01BUkdJTik7CiAJfQorCVJFR19STVdfQlVGRkVSX0ZMVVNIKGFoKTsKIH0KIAogc3RhdGljIHZvaWQgYXRoOWtfaHdfZGVmX3NldF9ib2FyZF92YWx1ZXMoc3RydWN0IGF0aF9odyAqYWgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2dwaW8uYwppbmRleCBkYTM0NGIyLi4yODQ3MDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ncGlvLmMKQEAgLTY5LDkgKzY5LDE1IEBACiB7CiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CiAKLQlpZiAoQVJfU1JFVl85MTAwKGFoKSB8fCAoYWgtPmxlZF9waW4gPj0gMCkpCisJaWYgKEFSX1NSRVZfOTEwMChhaCkpCiAJCXJldHVybjsKIAorCWlmIChhaC0+bGVkX3BpbiA+PSAwKSB7CisJCWlmICghKCgxIDw8IGFoLT5sZWRfcGluKSAmIEFSX0dQSU9fT0VfT1VUX01BU0spKQorCQkJYXRoOWtfaHdfcmVxdWVzdF9ncGlvKGFoLCBhaC0+bGVkX3BpbiwgImF0aDlrLWxlZCIpOworCQlyZXR1cm47CisJfQorCiAJaWYgKEFSX1NSRVZfOTI4NyhhaCkpCiAJCWFoLT5sZWRfcGluID0gQVRIX0xFRF9QSU5fOTI4NzsKIAllbHNlIGlmIChBUl9TUkVWXzk0ODUoc2MtPnNjX2FoKSkKQEAgLTIwMiwxOCArMjA4LDE3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNjLT5zY19wbV9sb2NrLCBmbGFncyk7CiAKLQlhdGg5a19tY2lfdXBkYXRlX3Jzc2koc2MpOwotCiAJYXRoOWtfcHNfd2FrZXVwKHNjKTsKKwlzcGluX2xvY2tfYmgoJmJ0Y29leC0+YnRjb2V4X2xvY2spOworCisJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKSB7CisJCWF0aDlrX21jaV91cGRhdGVfcnNzaShzYyk7CisJCWF0aF9tY2lfZnRwX2FkanVzdChzYyk7CisJfQogCiAJaWYgKCEoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpKQogCQlhdGhfZGV0ZWN0X2J0X3ByaW9yaXR5KHNjKTsKIAotCWlmIChhaC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX01DSSkKLQkJYXRoX21jaV9mdHBfYWRqdXN0KHNjKTsKLQotCXNwaW5fbG9ja19iaCgmYnRjb2V4LT5idGNvZXhfbG9jayk7Ci0KIAlzdG9tcF90eXBlID0gYnRjb2V4LT5idF9zdG9tcF90eXBlOwogCXRpbWVyX3BlcmlvZCA9IGJ0Y29leC0+YnRjb2V4X25vX3N0b21wOwogCkBAIC0yNTIsOSArMjU3LDYgQEAKIAlzdHJ1Y3QgYXRoX3NvZnRjICpzYyA9IChzdHJ1Y3QgYXRoX3NvZnRjICopYXJnOwogCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOwogCXN0cnVjdCBhdGhfYnRjb2V4ICpidGNvZXggPSAmc2MtPmJ0Y29leDsKLQlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKLQotCWF0aF9kYmcoY29tbW9uLCBCVENPRVgsICJubyBzdG9tcCB0aW1lciBydW5uaW5nXG4iKTsKIAogCWF0aDlrX3BzX3dha2V1cChzYyk7CiAJc3Bpbl9sb2NrX2JoKCZidGNvZXgtPmJ0Y29leF9sb2NrKTsKQEAgLTI3MSw3ICsyNzMsNyBAQAogCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOwogfQogCi1zdGF0aWMgaW50IGF0aF9pbml0X2J0Y29leF90aW1lcihzdHJ1Y3QgYXRoX3NvZnRjICpzYykKK3N0YXRpYyB2b2lkIGF0aF9pbml0X2J0Y29leF90aW1lcihzdHJ1Y3QgYXRoX3NvZnRjICpzYykKIHsKIAlzdHJ1Y3QgYXRoX2J0Y29leCAqYnRjb2V4ID0gJnNjLT5idGNvZXg7CiAKQEAgLTI4MCw2ICsyODIsNyBAQAogCQlidGNvZXgtPmJ0Y29leF9wZXJpb2QgLyAxMDA7CiAJYnRjb2V4LT5idHNjYW5fbm9fc3RvbXAgPSAoMTAwIC0gQVRIX0JUQ09FWF9CVFNDQU5fRFVUWV9DWUNMRSkgKgogCQkJCSAgIGJ0Y29leC0+YnRjb2V4X3BlcmlvZCAvIDEwMDsKKwlidGNvZXgtPmJ0X3N0b21wX3R5cGUgPSBBVEhfQlRDT0VYX1NUT01QX0xPVzsKIAogCXNldHVwX3RpbWVyKCZidGNvZXgtPnBlcmlvZF90aW1lciwgYXRoX2J0Y29leF9wZXJpb2RfdGltZXIsCiAJCQkodW5zaWduZWQgbG9uZykgc2MpOwpAQCAtMjg3LDggKzI5MCw2IEBACiAJCQkodW5zaWduZWQgbG9uZykgc2MpOwogCiAJc3Bpbl9sb2NrX2luaXQoJmJ0Y29leC0+YnRjb2V4X2xvY2spOwotCi0JcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0yOTksNiArMzAwLDEwIEBACiAJc3RydWN0IGF0aF9idGNvZXggKmJ0Y29leCA9ICZzYy0+YnRjb2V4OwogCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOwogCisJaWYgKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKGFoKSAhPSBBVEhfQlRDT0VYX0NGR18zV0lSRSAmJgorCSAgICBhdGg5a19od19nZXRfYnRjb2V4X3NjaGVtZShhaCkgIT0gQVRIX0JUQ09FWF9DRkdfTUNJKQorCQlyZXR1cm47CisKIAlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEJUQ09FWCwgIlN0YXJ0aW5nIGJ0Y29leCB0aW1lcnNcbiIpOwogCiAJLyogbWFrZSBzdXJlIGR1dHkgY3ljbGUgdGltZXIgaXMgYWxzbyBzdG9wcGVkIHdoZW4gcmVzdW1pbmcgKi8KQEAgLTMxMiwxMyArMzE3LDE5IEBACiAJbW9kX3RpbWVyKCZidGNvZXgtPnBlcmlvZF90aW1lciwgamlmZmllcyk7CiB9CiAKLQogLyoKICAqIFBhdXNlIGJ0Y29leCB0aW1lciBhbmQgYnQgZHV0eSBjeWNsZSB0aW1lcgogICovCiB2b2lkIGF0aDlrX2J0Y29leF90aW1lcl9wYXVzZShzdHJ1Y3QgYXRoX3NvZnRjICpzYykKIHsKIAlzdHJ1Y3QgYXRoX2J0Y29leCAqYnRjb2V4ID0gJnNjLT5idGNvZXg7CisJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CisKKwlpZiAoYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoYWgpICE9IEFUSF9CVENPRVhfQ0ZHXzNXSVJFICYmCisJICAgIGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKGFoKSAhPSBBVEhfQlRDT0VYX0NGR19NQ0kpCisJCXJldHVybjsKKworCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQlRDT0VYLCAiU3RvcHBpbmcgYnRjb2V4IHRpbWVyc1xuIik7CiAKIAlkZWxfdGltZXJfc3luYygmYnRjb2V4LT5wZXJpb2RfdGltZXIpOwogCWRlbF90aW1lcl9zeW5jKCZidGNvZXgtPm5vX3N0b21wX3RpbWVyKTsKQEAgLTM1NiwzMyArMzY3LDMzIEBACiB7CiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CiAKLQlpZiAoKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKGFoKSAhPSBBVEhfQlRDT0VYX0NGR19OT05FKSAmJgotCSAgICAhYWgtPmJ0Y29leF9ody5lbmFibGVkKSB7Ci0JCWlmICghKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX01DSSkpCi0JCQlhdGg5a19od19idGNvZXhfc2V0X3dlaWdodChhaCwgQVJfQlRfQ09FWF9XR0hULAotCQkJCQkJICAgQVJfU1RPTVBfTE9XX1dMQU5fV0dIVCwgMCk7Ci0JCWVsc2UKLQkJCWF0aDlrX2h3X2J0Y29leF9zZXRfd2VpZ2h0KGFoLCAwLCAwLAotCQkJCQkJICAgQVRIX0JUQ09FWF9TVE9NUF9OT05FKTsKLQkJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZShhaCk7CisJaWYgKGFoLT5idGNvZXhfaHcuZW5hYmxlZCB8fAorCSAgICBhdGg5a19od19nZXRfYnRjb2V4X3NjaGVtZShhaCkgPT0gQVRIX0JUQ09FWF9DRkdfTk9ORSkKKwkJcmV0dXJuOwogCi0JCWlmIChhdGg5a19od19nZXRfYnRjb2V4X3NjaGVtZShhaCkgPT0gQVRIX0JUQ09FWF9DRkdfM1dJUkUpCi0JCQlhdGg5a19idGNvZXhfdGltZXJfcmVzdW1lKHNjKTsKLQl9CisJaWYgKCEoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpKQorCQlhdGg5a19od19idGNvZXhfc2V0X3dlaWdodChhaCwgQVJfQlRfQ09FWF9XR0hULAorCQkJCQkgICBBUl9TVE9NUF9MT1dfV0xBTl9XR0hULCAwKTsKKwllbHNlCisJCWF0aDlrX2h3X2J0Y29leF9zZXRfd2VpZ2h0KGFoLCAwLCAwLAorCQkJCQkgICBBVEhfQlRDT0VYX1NUT01QX05PTkUpOworCWF0aDlrX2h3X2J0Y29leF9lbmFibGUoYWgpOworCWF0aDlrX2J0Y29leF90aW1lcl9yZXN1bWUoc2MpOwogfQogCiB2b2lkIGF0aDlrX3N0b3BfYnRjb2V4KHN0cnVjdCBhdGhfc29mdGMgKnNjKQogewogCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOwogCi0JaWYgKGFoLT5idGNvZXhfaHcuZW5hYmxlZCAmJgotCSAgICBhdGg5a19od19nZXRfYnRjb2V4X3NjaGVtZShhaCkgIT0gQVRIX0JUQ09FWF9DRkdfTk9ORSkgewotCQlpZiAoYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoYWgpID09IEFUSF9CVENPRVhfQ0ZHXzNXSVJFKQotCQkJYXRoOWtfYnRjb2V4X3RpbWVyX3BhdXNlKHNjKTsKLQkJYXRoOWtfaHdfYnRjb2V4X2Rpc2FibGUoYWgpOwotCQlpZiAoQVJfU1JFVl85NDYyKGFoKSB8fCBBUl9TUkVWXzk1NjUoYWgpKQotCQkJYXRoX21jaV9mbHVzaF9wcm9maWxlKCZzYy0+YnRjb2V4Lm1jaSk7Ci0JfQorCWlmICghYWgtPmJ0Y29leF9ody5lbmFibGVkIHx8CisJICAgIGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKGFoKSA9PSBBVEhfQlRDT0VYX0NGR19OT05FKQorCQlyZXR1cm47CisKKwlhdGg5a19idGNvZXhfdGltZXJfcGF1c2Uoc2MpOworCWF0aDlrX2h3X2J0Y29leF9kaXNhYmxlKGFoKTsKKworCWlmIChhaC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX01DSSkKKwkJYXRoX21jaV9mbHVzaF9wcm9maWxlKCZzYy0+YnRjb2V4Lm1jaSk7CiB9CiAKIHZvaWQgYXRoOWtfZGVpbml0X2J0Y29leChzdHJ1Y3QgYXRoX3NvZnRjICpzYykKQEAgLTQwOSwyMiArNDIwLDIwIEBACiAJCWJyZWFrOwogCWNhc2UgQVRIX0JUQ09FWF9DRkdfM1dJUkU6CiAJCWF0aDlrX2h3X2J0Y29leF9pbml0XzN3aXJlKHNjLT5zY19haCk7Ci0JCXIgPSBhdGhfaW5pdF9idGNvZXhfdGltZXIoc2MpOwotCQlpZiAocikKLQkJCXJldHVybiAtMTsKKwkJYXRoX2luaXRfYnRjb2V4X3RpbWVyKHNjKTsKIAkJdHhxID0gc2MtPnR4LnR4cV9tYXBbSUVFRTgwMjExX0FDX0JFXTsKIAkJYXRoOWtfaHdfaW5pdF9idGNvZXhfaHcoc2MtPnNjX2FoLCB0eHEtPmF4cV9xbnVtKTsKLQkJc2MtPmJ0Y29leC5idF9zdG9tcF90eXBlID0gQVRIX0JUQ09FWF9TVE9NUF9MT1c7Ci0JCWlmIChhdGg5a19od19tY2lfaXNfZW5hYmxlZChhaCkpIHsKLQkJCXNjLT5idGNvZXguZHV0eV9jeWNsZSA9IEFUSF9CVENPRVhfREVGX0RVVFlfQ1lDTEU7Ci0JCQlJTklUX0xJU1RfSEVBRCgmc2MtPmJ0Y29leC5tY2kuaW5mbyk7CisJCWJyZWFrOworCWNhc2UgQVRIX0JUQ09FWF9DRkdfTUNJOgorCQlhdGhfaW5pdF9idGNvZXhfdGltZXIoc2MpOwogCi0JCQlyID0gYXRoX21jaV9zZXR1cChzYyk7Ci0JCQlpZiAocikKLQkJCQlyZXR1cm4gcjsKKwkJc2MtPmJ0Y29leC5kdXR5X2N5Y2xlID0gQVRIX0JUQ09FWF9ERUZfRFVUWV9DWUNMRTsKKwkJSU5JVF9MSVNUX0hFQUQoJnNjLT5idGNvZXgubWNpLmluZm8pOworCQlhdGg5a19od19idGNvZXhfaW5pdF9tY2koYWgpOwogCi0JCQlhdGg5a19od19idGNvZXhfaW5pdF9tY2koYWgpOwotCQl9CisJCXIgPSBhdGhfbWNpX3NldHVwKHNjKTsKKwkJaWYgKHIpCisJCQlyZXR1cm4gcjsKIAogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2hpZl91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9oaWZfdXNiLmMKaW5kZXggOGU3MTUzYi4uMTBjMDJmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2hpZl91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaGlmX3VzYi5jCkBAIC00MCw2ICs0MCw3IEBACiAJeyBVU0JfREVWSUNFKDB4MGNmMywgMHhiMDAzKSB9LCAvKiBVYmlxdWl0aSBXaWZpU3RhdGlvbiBFeHQgKi8KIAl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweGIwMDIpIH0sIC8qIFViaXF1aXRpIFdpZmlTdGF0aW9uICovCiAJeyBVU0JfREVWSUNFKDB4MDU3YywgMHg4NDAzKSB9LCAvKiBBVk0gRlJJVFohV0xBTiAxMU4gdjIgVVNCICovCisJeyBVU0JfREVWSUNFKDB4MDQ3MSwgMHgyMDllKSB9LCAvKiBQaGlsaXBzIChvciBOWFApIFBUQTAxICovCiAKIAl7IFVTQl9ERVZJQ0UoMHgwY2YzLCAweDcwMTUpLAogCSAgLmRyaXZlcl9pbmZvID0gQVI5Mjg3X1VTQiB9LCAgLyogQXRoZXJvcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Yy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Yy5oCmluZGV4IDMwMGQzNjcuLmU4MmEwZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjLmgKQEAgLTQ0NCw2ICs0NDQsMTAgQEAKICNkZWZpbmUgT1BfQlRfU0NBTiAgICAgICAgICAgICAgICAgQklUKDQpCiAjZGVmaW5lIE9QX1RTRl9SRVNFVCAgICAgICAgICAgICAgIEJJVCg2KQogCitlbnVtIGh0Y19vcF9mbGFncyB7CisJSFRDX0ZXRkxBR19OT19STVcsCit9OworCiBzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKQEAgLTQ4Miw2ICs0ODYsNyBAQAogCWJvb2wgcmVjb25maWdfYmVhY29uOwogCXVuc2lnbmVkIGludCByeGZpbHRlcjsKIAl1bnNpZ25lZCBsb25nIG9wX2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgZndfZmxhZ3M7CiAKIAlzdHJ1Y3QgYXRoOWtfaHdfY2FsX2RhdGEgY2FsZGF0YTsKIAlzdHJ1Y3QgYXRoX3NwZWNfc2Nhbl9wcml2IHNwZWNfcHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2luaXQuYwppbmRleCBmZDIyOTQwLi5kN2JlZWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfaW5pdC5jCkBAIC0zNzYsMTUgKzM3NiwxMzcgQEAKIAltdXRleF91bmxvY2soJnByaXYtPndtaS0+bXVsdGlfd3JpdGVfbXV0ZXgpOwogfQogCitzdGF0aWMgdm9pZCBhdGg5a19yZWdfcm13X2J1ZmZlcih2b2lkICpod19wcml2LAorCQkJCSB1MzIgcmVnX29mZnNldCwgdTMyIHNldCwgdTMyIGNscikKK3sKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IChzdHJ1Y3QgYXRoX2h3ICopIGh3X3ByaXY7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2ID0gKHN0cnVjdCBhdGg5a19odGNfcHJpdiAqKSBjb21tb24tPnByaXY7CisJdTMyIHJzcF9zdGF0dXM7CisJaW50IHI7CisKKwltdXRleF9sb2NrKCZwcml2LT53bWktPm11bHRpX3Jtd19tdXRleCk7CisKKwkvKiBTdG9yZSB0aGUgcmVnaXN0ZXIvdmFsdWUgKi8KKwlwcml2LT53bWktPm11bHRpX3Jtd1twcml2LT53bWktPm11bHRpX3Jtd19pZHhdLnJlZyA9CisJCWNwdV90b19iZTMyKHJlZ19vZmZzZXQpOworCXByaXYtPndtaS0+bXVsdGlfcm13W3ByaXYtPndtaS0+bXVsdGlfcm13X2lkeF0uc2V0ID0KKwkJY3B1X3RvX2JlMzIoc2V0KTsKKwlwcml2LT53bWktPm11bHRpX3Jtd1twcml2LT53bWktPm11bHRpX3Jtd19pZHhdLmNsciA9CisJCWNwdV90b19iZTMyKGNscik7CisKKwlwcml2LT53bWktPm11bHRpX3Jtd19pZHgrKzsKKworCS8qIElmIHRoZSBidWZmZXIgaXMgZnVsbCwgc2VuZCBpdCBvdXQuICovCisJaWYgKHByaXYtPndtaS0+bXVsdGlfcm13X2lkeCA9PSBNQVhfUk1XX0NNRF9OVU1CRVIpIHsKKwkJciA9IGF0aDlrX3dtaV9jbWQocHJpdi0+d21pLCBXTUlfUkVHX1JNV19DTURJRCwKKwkJCSAgKHU4ICopICZwcml2LT53bWktPm11bHRpX3JtdywKKwkJCSAgc2l6ZW9mKHN0cnVjdCByZWdpc3Rlcl93cml0ZSkgKiBwcml2LT53bWktPm11bHRpX3Jtd19pZHgsCisJCQkgICh1OCAqKSAmcnNwX3N0YXR1cywgc2l6ZW9mKHJzcF9zdGF0dXMpLAorCQkJICAxMDApOworCQlpZiAodW5saWtlbHkocikpIHsKKwkJCWF0aF9kYmcoY29tbW9uLCBXTUksCisJCQkJIlJFR0lTVEVSIFJNVyBGQUlMRUQsIG11bHRpIGxlbjogJWRcbiIsCisJCQkJcHJpdi0+d21pLT5tdWx0aV9ybXdfaWR4KTsKKwkJfQorCQlwcml2LT53bWktPm11bHRpX3Jtd19pZHggPSAwOworCX0KKworCW11dGV4X3VubG9jaygmcHJpdi0+d21pLT5tdWx0aV9ybXdfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBhdGg5a19yZWdfcm13X2ZsdXNoKHZvaWQgKmh3X3ByaXYpCit7CisJc3RydWN0IGF0aF9odyAqYWggPSAoc3RydWN0IGF0aF9odyAqKSBod19wcml2OworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKikgY29tbW9uLT5wcml2OworCXUzMiByc3Bfc3RhdHVzOworCWludCByOworCisJaWYgKHRlc3RfYml0KEhUQ19GV0ZMQUdfTk9fUk1XLCAmcHJpdi0+ZndfZmxhZ3MpKQorCQlyZXR1cm47CisKKwlhdG9taWNfZGVjKCZwcml2LT53bWktPm1fcm13X2NudCk7CisKKwltdXRleF9sb2NrKCZwcml2LT53bWktPm11bHRpX3Jtd19tdXRleCk7CisKKwlpZiAocHJpdi0+d21pLT5tdWx0aV9ybXdfaWR4KSB7CisJCXIgPSBhdGg5a193bWlfY21kKHByaXYtPndtaSwgV01JX1JFR19STVdfQ01ESUQsCisJCQkgICh1OCAqKSAmcHJpdi0+d21pLT5tdWx0aV9ybXcsCisJCQkgIHNpemVvZihzdHJ1Y3QgcmVnaXN0ZXJfcm13KSAqIHByaXYtPndtaS0+bXVsdGlfcm13X2lkeCwKKwkJCSAgKHU4ICopICZyc3Bfc3RhdHVzLCBzaXplb2YocnNwX3N0YXR1cyksCisJCQkgIDEwMCk7CisJCWlmICh1bmxpa2VseShyKSkgeworCQkJYXRoX2RiZyhjb21tb24sIFdNSSwKKwkJCQkiUkVHSVNURVIgUk1XIEZBSUxFRCwgbXVsdGkgbGVuOiAlZFxuIiwKKwkJCQlwcml2LT53bWktPm11bHRpX3Jtd19pZHgpOworCQl9CisJCXByaXYtPndtaS0+bXVsdGlfcm13X2lkeCA9IDA7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwcml2LT53bWktPm11bHRpX3Jtd19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDlrX2VuYWJsZV9ybXdfYnVmZmVyKHZvaWQgKmh3X3ByaXYpCit7CisJc3RydWN0IGF0aF9odyAqYWggPSAoc3RydWN0IGF0aF9odyAqKSBod19wcml2OworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKikgY29tbW9uLT5wcml2OworCisJaWYgKHRlc3RfYml0KEhUQ19GV0ZMQUdfTk9fUk1XLCAmcHJpdi0+ZndfZmxhZ3MpKQorCQlyZXR1cm47CisKKwlhdG9taWNfaW5jKCZwcml2LT53bWktPm1fcm13X2NudCk7Cit9CisKK3N0YXRpYyB1MzIgYXRoOWtfcmVnX3Jtd19zaW5nbGUodm9pZCAqaHdfcHJpdiwKKwkJCQkgdTMyIHJlZ19vZmZzZXQsIHUzMiBzZXQsIHUzMiBjbHIpCit7CisJc3RydWN0IGF0aF9odyAqYWggPSAoc3RydWN0IGF0aF9odyAqKSBod19wcml2OworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKikgY29tbW9uLT5wcml2OworCXN0cnVjdCByZWdpc3Rlcl9ybXcgYnVmLCBidWZfcmV0OworCWludCByZXQ7CisJdTMyIHZhbCA9IDA7CisKKwlidWYucmVnID0gY3B1X3RvX2JlMzIocmVnX29mZnNldCk7CisJYnVmLnNldCA9IGNwdV90b19iZTMyKHNldCk7CisJYnVmLmNsciA9IGNwdV90b19iZTMyKGNscik7CisKKwlyZXQgPSBhdGg5a193bWlfY21kKHByaXYtPndtaSwgV01JX1JFR19STVdfQ01ESUQsCisJCQkgICh1OCAqKSAmYnVmLCBzaXplb2YoYnVmKSwKKwkJCSAgKHU4ICopICZidWZfcmV0LCBzaXplb2YoYnVmX3JldCksCisJCQkgIDEwMCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJYXRoX2RiZyhjb21tb24sIFdNSSwgIlJFR0lTVEVSIFJNVyBGQUlMRUQ6KDB4JTA0eCwgJWQpXG4iLAorCQkJcmVnX29mZnNldCwgcmV0KTsKKwl9CisJcmV0dXJuIHZhbDsKK30KKwogc3RhdGljIHUzMiBhdGg5a19yZWdfcm13KHZvaWQgKmh3X3ByaXYsIHUzMiByZWdfb2Zmc2V0LCB1MzIgc2V0LCB1MzIgY2xyKQogewotCXUzMiB2YWw7CisJc3RydWN0IGF0aF9odyAqYWggPSAoc3RydWN0IGF0aF9odyAqKSBod19wcml2OworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19odGNfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKikgY29tbW9uLT5wcml2OwogCi0JdmFsID0gYXRoOWtfcmVncmVhZChod19wcml2LCByZWdfb2Zmc2V0KTsKLQl2YWwgJj0gfmNscjsKLQl2YWwgfD0gc2V0OwotCWF0aDlrX3JlZ3dyaXRlKGh3X3ByaXYsIHZhbCwgcmVnX29mZnNldCk7Ci0JcmV0dXJuIHZhbDsKKwlpZiAodGVzdF9iaXQoSFRDX0ZXRkxBR19OT19STVcsICZwcml2LT5md19mbGFncykpIHsKKwkJdTMyIHZhbDsKKworCQl2YWwgPSBSRUdfUkVBRChhaCwgcmVnX29mZnNldCk7CisJCXZhbCAmPSB+Y2xyOworCQl2YWwgfD0gc2V0OworCQlSRUdfV1JJVEUoYWgsIHJlZ19vZmZzZXQsIHZhbCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGF0b21pY19yZWFkKCZwcml2LT53bWktPm1fcm13X2NudCkpCisJCWF0aDlrX3JlZ19ybXdfYnVmZmVyKGh3X3ByaXYsIHJlZ19vZmZzZXQsIHNldCwgY2xyKTsKKwllbHNlCisJCWF0aDlrX3JlZ19ybXdfc2luZ2xlKGh3X3ByaXYsIHJlZ19vZmZzZXQsIHNldCwgY2xyKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBhdGhfdXNiX3JlYWRfY2FjaGVzaXplKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sIGludCAqY3N6KQpAQCAtNTAxLDYgKzYyMyw4IEBACiAJYWgtPnJlZ19vcHMud3JpdGUgPSBhdGg5a19yZWd3cml0ZTsKIAlhaC0+cmVnX29wcy5lbmFibGVfd3JpdGVfYnVmZmVyID0gYXRoOWtfZW5hYmxlX3JlZ3dyaXRlX2J1ZmZlcjsKIAlhaC0+cmVnX29wcy53cml0ZV9mbHVzaCA9IGF0aDlrX3JlZ3dyaXRlX2ZsdXNoOworCWFoLT5yZWdfb3BzLmVuYWJsZV9ybXdfYnVmZmVyID0gYXRoOWtfZW5hYmxlX3Jtd19idWZmZXI7CisJYWgtPnJlZ19vcHMucm13X2ZsdXNoID0gYXRoOWtfcmVnX3Jtd19mbHVzaDsKIAlhaC0+cmVnX29wcy5ybXcgPSBhdGg5a19yZWdfcm13OwogCXByaXYtPmFoID0gYWg7CiAKQEAgLTY4Niw2ICs4MTAsMTIgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKHByaXYtPmZ3X3ZlcnNpb25fbWFqb3IgPT0gMSAmJiBwcml2LT5md192ZXJzaW9uX21pbm9yIDwgNCkKKwkJc2V0X2JpdChIVENfRldGTEFHX05PX1JNVywgJnByaXYtPmZ3X2ZsYWdzKTsKKworCWRldl9pbmZvKHByaXYtPmRldiwgIkZXIFJNVyBzdXBwb3J0OiAlc1xuIiwKKwkJdGVzdF9iaXQoSFRDX0ZXRkxBR19OT19STVcsICZwcml2LT5md19mbGFncykgPyAiT2ZmIiA6ICJPbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X21haW4uYwppbmRleCA5MmQ1YTZjLi41NjQ5MjNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfbWFpbi5jCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkgKiB3aGVuIG1hdGNoaW5nIGFkZHJlc3Nlcy4KIAkgKi8KIAlpdGVyX2RhdGEuaHdfbWFjYWRkciA9IE5VTEw7Ci0JbWVtc2V0KCZpdGVyX2RhdGEubWFzaywgMHhmZiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcihpdGVyX2RhdGEubWFzayk7CiAKIAlpZiAodmlmKQogCQlhdGg5a19odGNfYnNzaWRfaXRlcigmaXRlcl9kYXRhLCB2aWYtPmFkZHIsIHZpZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHctb3BzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHctb3BzLmgKaW5kZXggODg3NjliNi4uMjMyMzM5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LW9wcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody1vcHMuaApAQCAtMTA4LDYgKzEwOCwxNCBAQAogCQlhdGg5a19od19vcHMoYWgpLT5zZXRfYnRfYW50X2RpdmVyc2l0eShhaCwgZW5hYmxlKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGF0aDlrX2h3X2lzX2FpY19lbmFibGVkKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCWlmIChhdGg5a19od19wcml2YXRlX29wcyhhaCktPmlzX2FpY19lbmFibGVkKQorCQlyZXR1cm4gYXRoOWtfaHdfcHJpdmF0ZV9vcHMoYWgpLT5pc19haWNfZW5hYmxlZChhaCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKICNlbmRpZgogCiAvKiBQcml2YXRlIGhhcmR3YXJlIGNhbGwgb3BzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCmluZGV4IDYwYWE4ZDcuLjVlMTVlOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2luY2x1ZGUgImh3LmgiCkBAIC0xMjEsNiArMTIyLDM2IEBACiAJUkVHV1JJVEVfQlVGRkVSX0ZMVVNIKGFoKTsKIH0KIAordm9pZCBhdGg5a19od19yZWFkX2FycmF5KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgYXJyYXlbXVsyXSwgaW50IHNpemUpCit7CisJdTMyICp0bXBfcmVnX2xpc3QsICp0bXBfZGF0YTsKKwlpbnQgaTsKKworCXRtcF9yZWdfbGlzdCA9IGttYWxsb2Moc2l6ZSAqIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRtcF9yZWdfbGlzdCkgeworCQlkZXZfZXJyKGFoLT5kZXYsICIlczogdG1wX3JlZ19saXN0OiBhbGxvYyBmaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJdG1wX2RhdGEgPSBrbWFsbG9jKHNpemUgKiBzaXplb2YodTMyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0bXBfZGF0YSkgeworCQlkZXZfZXJyKGFoLT5kZXYsICIlcyB0bXBfZGF0YTogYWxsb2MgZmlsZWRcbiIsIF9fZnVuY19fKTsKKwkJZ290byBlcnJvcl90bXBfZGF0YTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl0bXBfcmVnX2xpc3RbaV0gPSBhcnJheVtpXVswXTsKKworCVJFR19SRUFEX01VTFRJKGFoLCB0bXBfcmVnX2xpc3QsIHRtcF9kYXRhLCBzaXplKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCWFycmF5W2ldWzFdID0gdG1wX2RhdGFbaV07CisKKwlrZnJlZSh0bXBfZGF0YSk7CitlcnJvcl90bXBfZGF0YToKKwlrZnJlZSh0bXBfcmVnX2xpc3QpOworfQorCiB1MzIgYXRoOWtfaHdfcmV2ZXJzZV9iaXRzKHUzMiB2YWwsIHUzMiBuKQogewogCXUzMiByZXR2YWw7CkBAIC0zNjYsNiArMzk3LDkgQEAKIAkJYWgtPmNvbmZpZy5yaW10X2ZpcnN0ID0gNzAwOwogCX0KIAorCWlmIChBUl9TUkVWXzk0NjIoYWgpIHx8IEFSX1NSRVZfOTU2NShhaCkpCisJCWFoLT5jb25maWcucGxsX3B3cnNhdmUgPSA3OworCiAJLyoKIAkgKiBXZSBuZWVkIHRoaXMgZm9yIFBDSSBkZXZpY2VzIG9ubHkgKENhcmRidXMsIFBDSSwgbWluaVBDSSkKIAkgKiBfYW5kXyBpZiBvbiBub24tdW5pcHJvY2Vzc29yIHN5c3RlbXMgKE11bHRpcHJvY2Vzc29yL0hUKS4KQEAgLTQyNCw3ICs0NTgsNyBAQAogCWFoLT5wb3dlcl9tb2RlID0gQVRIOUtfUE1fVU5ERUZJTkVEOwogCWFoLT5odGNfcmVzZXRfaW5pdCA9IHRydWU7CiAKLQlhaC0+dHBjX2VuYWJsZWQgPSB0cnVlOworCWFoLT50cGNfZW5hYmxlZCA9IGZhbHNlOwogCiAJYWgtPmFuaV9mdW5jdGlvbiA9IEFUSDlLX0FOSV9BTEw7CiAJaWYgKCFBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKQpAQCAtMTE5Nyw2ICsxMjMxLDcgQEAKIAl1MzIgbWFzayA9IEFSX1NUQV9JRDFfU1RBX0FQIHwgQVJfU1RBX0lEMV9BREhPQzsKIAl1MzIgc2V0ID0gQVJfU1RBX0lEMV9LU1JDSF9NT0RFOwogCisJRU5BQkxFX1JFR19STVdfQlVGRkVSKGFoKTsKIAlzd2l0Y2ggKG9wbW9kZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CiAJCWlmICghQVJfU1JFVl85MzQwXzEzKGFoKSkgewpAQCAtMTIxOCw2ICsxMjUzLDcgQEAKIAkJYnJlYWs7CiAJfQogCVJFR19STVcoYWgsIEFSX1NUQV9JRDEsIHNldCwgbWFzayk7CisJUkVHX1JNV19CVUZGRVJfRkxVU0goYWgpOwogfQogCiB2b2lkIGF0aDlrX2h3X2dldF9kZWx0YV9zbG9wZV92YWxzKHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgY29lZl9zY2FsZWQsCkBAIC0xOTMwLDYgKzE5NjYsNyBAQAogCWlmICghYXRoOWtfaHdfbWNpX2lzX2VuYWJsZWQoYWgpKQogCQlSRUdfV1JJVEUoYWgsIEFSX09CUywgOCk7CiAKKwlFTkFCTEVfUkVHX1JNV19CVUZGRVIoYWgpOwogCWlmIChhaC0+Y29uZmlnLnJ4X2ludHJfbWl0aWdhdGlvbikgewogCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9SSU1ULCBBUl9SSU1UX0xBU1QsIGFoLT5jb25maWcucmltdF9sYXN0KTsKIAkJUkVHX1JNV19GSUVMRChhaCwgQVJfUklNVCwgQVJfUklNVF9GSVJTVCwgYWgtPmNvbmZpZy5yaW10X2ZpcnN0KTsKQEAgLTE5MzksNiArMTk3Niw3IEBACiAJCVJFR19STVdfRklFTEQoYWgsIEFSX1RJTVQsIEFSX1RJTVRfTEFTVCwgMzAwKTsKIAkJUkVHX1JNV19GSUVMRChhaCwgQVJfVElNVCwgQVJfVElNVF9GSVJTVCwgNzUwKTsKIAl9CisJUkVHX1JNV19CVUZGRVJfRkxVU0goYWgpOwogCiAJYXRoOWtfaHdfaW5pdF9iYihhaCwgY2hhbik7CiAKQEAgLTI2NzQsMTEgKzI3MTIsMjMgQEAKIAlpZiAoQVJfU1JFVl85MjcxKGFoKSkKIAkJdmFsID0gfnZhbDsKIAotCVJFR19STVcoYWgsIEFSX0dQSU9fSU5fT1VULCAoKHZhbCAmIDEpIDw8IGdwaW8pLAotCQlBUl9HUElPX0JJVChncGlvKSk7CisJaWYgKCgxIDw8IGdwaW8pICYgQVJfR1BJT19PRV9PVVRfTUFTSykKKwkJUkVHX1JNVyhhaCwgQVJfR1BJT19JTl9PVVQsICgodmFsICYgMSkgPDwgZ3BpbyksCisJCQlBUl9HUElPX0JJVChncGlvKSk7CisJZWxzZQorCQlncGlvX3NldF92YWx1ZShncGlvLCB2YWwgJiAxKTsKIH0KIEVYUE9SVF9TWU1CT0woYXRoOWtfaHdfc2V0X2dwaW8pOwogCit2b2lkIGF0aDlrX2h3X3JlcXVlc3RfZ3BpbyhzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKQoreworCWlmIChncGlvID49IGFoLT5jYXBzLm51bV9ncGlvX3BpbnMpCisJCXJldHVybjsKKworCWdwaW9fcmVxdWVzdF9vbmUoZ3BpbywgR1BJT0ZfRElSX09VVCB8IEdQSU9GX0lOSVRfTE9XLCBsYWJlbCk7Cit9CitFWFBPUlRfU1lNQk9MKGF0aDlrX2h3X3JlcXVlc3RfZ3Bpbyk7CisKIHZvaWQgYXRoOWtfaHdfc2V0YW50ZW5uYShzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGFudGVubmEpCiB7CiAJUkVHX1dSSVRFKGFoLCBBUl9ERUZfQU5URU5OQSwgKGFudGVubmEgJiAweDcpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmgKaW5kZXggZTgyZTU3MC4uYzFkMmQwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJlZXByb20uaCIKICNpbmNsdWRlICJjYWxpYi5oIgogI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgInJlZ19tY2kuaCIKICNpbmNsdWRlICJwaHkuaCIKICNpbmNsdWRlICJidGNvZXguaCIKICNpbmNsdWRlICJkeW5hY2suaCIKQEAgLTk5LDYgKzEwMCwxOCBAQAogCQkJKF9haCktPnJlZ19vcHMud3JpdGVfZmx1c2goKF9haCkpOwlcCiAJfSB3aGlsZSAoMCkKIAorI2RlZmluZSBFTkFCTEVfUkVHX1JNV19CVUZGRVIoX2FoKQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJaWYgKChfYWgpLT5yZWdfb3BzLmVuYWJsZV9ybXdfYnVmZmVyKQlcCisJCQkoX2FoKS0+cmVnX29wcy5lbmFibGVfcm13X2J1ZmZlcigoX2FoKSk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFJFR19STVdfQlVGRkVSX0ZMVVNIKF9haCkJCQkJCVwKKwlkbyB7CQkJCQkJCQlcCisJCWlmICgoX2FoKS0+cmVnX29wcy5ybXdfZmx1c2gpCQlcCisJCQkoX2FoKS0+cmVnX29wcy5ybXdfZmx1c2goKF9haCkpOwlcCisJfSB3aGlsZSAoMCkKKwogI2RlZmluZSBQUl9FRVAoX3MsIF92YWwpCQkJCQkJXAogCWRvIHsJCQkJCQkJCVwKIAkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sICIlMjBzIDogJTEwZFxuIixcCkBAIC0xMjUsNiArMTM4LDggQEAKIAogI2RlZmluZSBSRUdfV1JJVEVfQVJSQVkoaW5pYXJyYXksIGNvbHVtbiwgcmVnV3IpIFwKIAlhdGg5a19od193cml0ZV9hcnJheShhaCwgaW5pYXJyYXksIGNvbHVtbiwgJihyZWdXcikpCisjZGVmaW5lIFJFR19SRUFEX0FSUkFZKGFoLCBhcnJheSwgc2l6ZSkgXAorCWF0aDlrX2h3X3JlYWRfYXJyYXkoYWgsIGFycmF5LCBzaXplKQogCiAjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19PVVRQVVQgICAgICAgICAgICAgMAogI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfUENJRV9BVFRFTlRJT05fTEVEIDEKQEAgLTMwOCw2ICszMjMsMTIgQEAKIAlIV19NQUNfSEFORyAgICAgICAgICAgICAgID0gQklUKDUpLAogfTsKIAorI2RlZmluZSBBUl9QQ0lFX1BMTF9QV1JTQVZFX0NPTlRST0wgQklUKDApCisjZGVmaW5lIEFSX1BDSUVfUExMX1BXUlNBVkVfT05fRDMgICBCSVQoMSkKKyNkZWZpbmUgQVJfUENJRV9QTExfUFdSU0FWRV9PTl9EMCAgIEJJVCgyKQorI2RlZmluZSBBUl9QQ0lFX0NEUl9QV1JTQVZFX09OX0QzICAgQklUKDMpCisjZGVmaW5lIEFSX1BDSUVfQ0RSX1BXUlNBVkVfT05fRDAgICBCSVQoNCkKKwogc3RydWN0IGF0aDlrX29wc19jb25maWcgewogCWludCBkbWFfYmVhY29uX3Jlc3BvbnNlX3RpbWU7CiAJaW50IHN3X2JlYWNvbl9yZXNwb25zZV90aW1lOwpAQCAtMzM0LDcgKzM1NSw3IEBACiAJdTMyIGFudF9jdHJsX2NvbW0yZ19zd2l0Y2hfZW5hYmxlOwogCWJvb2wgeGF0dGVuX21hcmdpbl9jZmc7CiAJYm9vbCBhbHRfbWluZ2FpbmlkeDsKLQlib29sIG5vX3BsbF9wd3JzYXZlOworCXU4IHBsbF9wd3JzYXZlOwogCWJvb2wgdHhfZ2Fpbl9idWZmYWxvOwogCWJvb2wgbGVkX2FjdGl2ZV9oaWdoOwogfTsKQEAgLTY0Niw2ICs2NjcsMTAgQEAKIAogCS8qIEFOSSAqLwogCXZvaWQgKCphbmlfY2FjaGVfaW5pX3JlZ3MpKHN0cnVjdCBhdGhfaHcgKmFoKTsKKworI2lmZGVmIENPTkZJR19BVEg5S19CVENPRVhfU1VQUE9SVAorCWJvb2wgKCppc19haWNfZW5hYmxlZCkoc3RydWN0IGF0aF9odyAqYWgpOworI2VuZGlmIC8qIENPTkZJR19BVEg5S19CVENPRVhfU1VQUE9SVCAqLwogfTsKIAogLyoqCkBAIC05OTksNiArMTAyNCw3IEBACiB2b2lkIGF0aDlrX2h3X2NmZ19vdXRwdXQoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBncGlvLAogCQkJIHUzMiBhaF9zaWduYWxfdHlwZSk7CiB2b2lkIGF0aDlrX2h3X3NldF9ncGlvKHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgZ3BpbywgdTMyIHZhbCk7Cit2b2lkIGF0aDlrX2h3X3JlcXVlc3RfZ3BpbyhzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGdwaW8sIGNvbnN0IGNoYXIgKmxhYmVsKTsKIHZvaWQgYXRoOWtfaHdfc2V0YW50ZW5uYShzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGFudGVubmEpOwogCiAvKiBHZW5lcmFsIE9wZXJhdGlvbiAqLwpAQCAtMTAwNyw2ICsxMDMzLDcgQEAKIGJvb2wgYXRoOWtfaHdfd2FpdChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHJlZywgdTMyIG1hc2ssIHUzMiB2YWwsIHUzMiB0aW1lb3V0KTsKIHZvaWQgYXRoOWtfaHdfd3JpdGVfYXJyYXkoc3RydWN0IGF0aF9odyAqYWgsIGNvbnN0IHN0cnVjdCBhcjU0MTZJbmlBcnJheSAqYXJyYXksCiAJCQkgIGludCBjb2x1bW4sIHVuc2lnbmVkIGludCAqd3JpdGVjbnQpOwordm9pZCBhdGg5a19od19yZWFkX2FycmF5KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgYXJyYXlbXVsyXSwgaW50IHNpemUpOwogdTMyIGF0aDlrX2h3X3JldmVyc2VfYml0cyh1MzIgdmFsLCB1MzIgbik7CiB1MTYgYXRoOWtfaHdfY29tcHV0ZXR4dGltZShzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCSAgIHU4IHBoeSwgaW50IGticHMsCkBAIC0xMTE2LDYgKzExNDMsNyBAQAogdm9pZCBhdGg5a19od19zZXRzbG90dGltZShzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHVzKTsKIAogI2lmZGVmIENPTkZJR19BVEg5S19CVENPRVhfU1VQUE9SVAordm9pZCBhcjkwMDNfaHdfYXR0YWNoX2FpY19vcHMoc3RydWN0IGF0aF9odyAqYWgpOwogc3RhdGljIGlubGluZSBib29sIGF0aDlrX2h3X2J0Y29leF9pc19lbmFibGVkKHN0cnVjdCBhdGhfaHcgKmFoKQogewogCXJldHVybiBhaC0+YnRjb2V4X2h3LmVuYWJsZWQ7CkBAIC0xMTMzLDYgKzExNjEsOSBAQAogCXJldHVybiBhaC0+YnRjb2V4X2h3LnNjaGVtZTsKIH0KICNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYXI5MDAzX2h3X2F0dGFjaF9haWNfb3BzKHN0cnVjdCBhdGhfaHcgKmFoKQoreworfQogc3RhdGljIGlubGluZSBib29sIGF0aDlrX2h3X2J0Y29leF9pc19lbmFibGVkKHN0cnVjdCBhdGhfaHcgKmFoKQogewogCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jCmluZGV4IDZjNmU4ODQuLmY4ZDExZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYwpAQCAtMTQxLDYgKzE0MSwxNiBAQAogCXJldHVybiB2YWw7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aDlrX211bHRpX2lvcmVhZDMyKHZvaWQgKmh3X3ByaXYsIHUzMiAqYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTMyICp2YWwsIHUxNiBjb3VudCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQl2YWxbaV0gPSBhdGg5a19pb3JlYWQzMihod19wcml2LCBhZGRyW2ldKTsKK30KKworCiBzdGF0aWMgdW5zaWduZWQgaW50IF9fYXRoOWtfcmVnX3JtdyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgdTMyIHJlZ19vZmZzZXQsCiAJCQkJICAgIHUzMiBzZXQsIHUzMiBjbHIpCiB7CkBAIC00MzcsOCArNDQ3LDE1IEBACiAJCWF0aF9pbmZvKGNvbW1vbiwgIkVuYWJsZSBXQVIgZm9yIEFTUE0gRDMvTDFcbiIpOwogCX0KIAorCS8qCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgcGxsX3B3cnNhdmUgaXMgMS4KKwkgKiBGb3IgY2VydGFpbiBBUjk0ODUgY2FyZHMsIGl0IGlzIHNldCB0byAwLgorCSAqIEZvciBBUjk0NjIsIEFSOTU2NSBpdCdzIHNldCB0byA3LgorCSAqLworCWFoLT5jb25maWcucGxsX3B3cnNhdmUgPSAxOworCiAJaWYgKHNjLT5kcml2ZXJfZGF0YSAmIEFUSDlLX1BDSV9OT19QTExfUFdSU0FWRSkgewotCQlhaC0+Y29uZmlnLm5vX3BsbF9wd3JzYXZlID0gdHJ1ZTsKKwkJYWgtPmNvbmZpZy5wbGxfcHdyc2F2ZSA9IDA7CiAJCWF0aF9pbmZvKGNvbW1vbiwgIkRpc2FibGUgUExMIFBvd2VyU2F2ZVxuIik7CiAJfQogCkBAIC01MzAsNiArNTQ3LDcgQEAKIAlhaC0+aHcgPSBzYy0+aHc7CiAJYWgtPmh3X3ZlcnNpb24uZGV2aWQgPSBkZXZpZDsKIAlhaC0+cmVnX29wcy5yZWFkID0gYXRoOWtfaW9yZWFkMzI7CisJYWgtPnJlZ19vcHMubXVsdGlfcmVhZCA9IGF0aDlrX211bHRpX2lvcmVhZDMyOwogCWFoLT5yZWdfb3BzLndyaXRlID0gYXRoOWtfaW93cml0ZTMyOwogCWFoLT5yZWdfb3BzLnJtdyA9IGF0aDlrX3JlZ19ybXc7CiAJcENhcCA9ICZhaC0+Y2FwczsKQEAgLTc2Myw3ICs3ODEsOCBAQAogCQkubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDEsCiAJCS5iZWFjb25faW50X2luZnJhX21hdGNoID0gdHJ1ZSwKIAkJLnJhZGFyX2RldGVjdF93aWR0aHMgPQlCSVQoTkw4MDIxMV9DSEFOX1dJRFRIXzIwX05PSFQpIHwKLQkJCQkJQklUKE5MODAyMTFfQ0hBTl9XSURUSF8yMCksCisJCQkJCUJJVChOTDgwMjExX0NIQU5fV0lEVEhfMjApIHwKKwkJCQkJQklUKE5MODAyMTFfQ0hBTl9XSURUSF80MCksCiAJfQogI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKaW5kZXggOWVkZTk5MS4uYjBiYWRlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCkBAIC05OTQsNyArOTk0LDcgQEAKIAkgKiBCU1NJRCBtYXNrIHdoZW4gbWF0Y2hpbmcgYWRkcmVzc2VzLgogCSAqLwogCW1lbXNldChpdGVyX2RhdGEsIDAsIHNpemVvZigqaXRlcl9kYXRhKSk7Ci0JbWVtc2V0KCZpdGVyX2RhdGEtPm1hc2ssIDB4ZmYsIEVUSF9BTEVOKTsKKwlldGhfYnJvYWRjYXN0X2FkZHIoaXRlcl9kYXRhLT5tYXNrKTsKIAlpdGVyX2RhdGEtPnNsb3R0aW1lID0gQVRIOUtfU0xPVF9USU1FXzk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGF2cCwgJmN0eC0+dmlmcywgbGlzdCkKQEAgLTExMzksNyArMTEzOSw3IEBACiAJCQljdHgtPnByaW1hcnlfc3RhID0gaXRlcl9kYXRhLnByaW1hcnlfc3RhOwogCQl9IGVsc2UgewogCQkJY3R4LT5wcmltYXJ5X3N0YSA9IE5VTEw7Ci0JCQltZW1zZXQoY29tbW9uLT5jdXJic3NpZCwgMCwgRVRIX0FMRU4pOworCQkJZXRoX3plcm9fYWRkcihjb21tb24tPmN1cmJzc2lkKTsKIAkJCWNvbW1vbi0+Y3VyYWlkID0gMDsKIAkJCWF0aDlrX2h3X3dyaXRlX2Fzc29jaWQoc2MtPnNjX2FoKTsKIAkJCWlmIChhdGg5a19od19tY2lfaXNfZW5hYmxlZChzYy0+c2NfYWgpKQpAQCAtMTE3Miw2ICsxMTcyLDM4IEBACiAJYXRoOWtfcHNfcmVzdG9yZShzYyk7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aDlrX3RwY192aWZfaXRlcih2b2lkICpkYXRhLCB1OCAqbWFjLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCWludCAqcG93ZXIgPSAoaW50ICopZGF0YTsKKworCWlmICgqcG93ZXIgPCB2aWYtPmJzc19jb25mLnR4cG93ZXIpCisJCSpwb3dlciA9IHZpZi0+YnNzX2NvbmYudHhwb3dlcjsKK30KKworLyogQ2FsbGVkIHdpdGggc2MtPm11dGV4IGhlbGQuICovCit2b2lkIGF0aDlrX3NldF90eHBvd2VyKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCWludCBwb3dlcjsKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKKwlzdHJ1Y3QgYXRoX3JlZ3VsYXRvcnkgKnJlZyA9IGF0aDlrX2h3X3JlZ3VsYXRvcnkoYWgpOworCisJYXRoOWtfcHNfd2FrZXVwKHNjKTsKKwlpZiAoYWgtPnRwY19lbmFibGVkKSB7CisJCXBvd2VyID0gKHZpZikgPyB2aWYtPmJzc19jb25mLnR4cG93ZXIgOiAtMTsKKwkJaWVlZTgwMjExX2l0ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXNfYXRvbWljKAorCQkJCXNjLT5odywgSUVFRTgwMjExX0lGQUNFX0lURVJfUkVTVU1FX0FMTCwKKwkJCQlhdGg5a190cGNfdmlmX2l0ZXIsICZwb3dlcik7CisJCWlmIChwb3dlciA9PSAtMSkKKwkJCXBvd2VyID0gc2MtPmh3LT5jb25mLnBvd2VyX2xldmVsOworCX0gZWxzZSB7CisJCXBvd2VyID0gc2MtPmh3LT5jb25mLnBvd2VyX2xldmVsOworCX0KKwlzYy0+Y3VyX2NoYW4tPnR4cG93ZXIgPSAyICogcG93ZXI7CisJYXRoOWtfaHdfc2V0X3R4cG93ZXJsaW1pdChhaCwgc2MtPmN1cl9jaGFuLT50eHBvd2VyLCBmYWxzZSk7CisJc2MtPmN1cl9jaGFuLT5jdXJfdHhwb3dlciA9IHJlZy0+bWF4X3Bvd2VyX2xldmVsOworCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOworfQorCiBzdGF0aWMgdm9pZCBhdGg5a19hc3NpZ25faHdfcXVldWVzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7CkBAIC0xMjI1LDYgKzEyNTcsOCBAQAogCiAJYXRoOWtfYXNzaWduX2h3X3F1ZXVlcyhodywgdmlmKTsKIAorCWF0aDlrX3NldF90eHBvd2VyKHNjLCB2aWYpOworCiAJYW4tPnNjID0gc2M7CiAJYW4tPnN0YSA9IE5VTEw7CiAJYW4tPnZpZiA9IHZpZjsKQEAgLTEyNjUsNiArMTI5OSw4IEBACiAJYXRoOWtfYXNzaWduX2h3X3F1ZXVlcyhodywgdmlmKTsKIAlhdGg5a19jYWxjdWxhdGVfc3VtbWFyeV9zdGF0ZShzYywgYXZwLT5jaGFuY3R4KTsKIAorCWF0aDlrX3NldF90eHBvd2VyKHNjLCB2aWYpOworCiAJbXV0ZXhfdW5sb2NrKCZzYy0+bXV0ZXgpOwogCXJldHVybiAwOwogfQpAQCAtMTI5NCw2ICsxMzMwLDggQEAKIAogCWF0aDlrX2NhbGN1bGF0ZV9zdW1tYXJ5X3N0YXRlKHNjLCBhdnAtPmNoYW5jdHgpOwogCisJYXRoOWtfc2V0X3R4cG93ZXIoc2MsIE5VTEwpOworCiAJbXV0ZXhfdW5sb2NrKCZzYy0+bXV0ZXgpOwogfQogCkBAIC0xMzk3LDE0ICsxNDM1LDYgQEAKIAkJYXRoX2NoYW5jdHhfc2V0X2NoYW5uZWwoc2MsIGN0eCwgJmh3LT5jb25mLmNoYW5kZWYpOwogCX0KIAotCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BPV0VSKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJTZXQgcG93ZXI6ICVkXG4iLCBjb25mLT5wb3dlcl9sZXZlbCk7Ci0JCXNjLT5jdXJfY2hhbi0+dHhwb3dlciA9IDIgKiBjb25mLT5wb3dlcl9sZXZlbDsKLQkJYXRoOWtfY21uX3VwZGF0ZV90eHBvdyhhaCwgc2MtPmN1cl9jaGFuLT5jdXJfdHhwb3dlciwKLQkJCQkgICAgICAgc2MtPmN1cl9jaGFuLT50eHBvd2VyLAotCQkJCSAgICAgICAmc2MtPmN1cl9jaGFuLT5jdXJfdHhwb3dlcik7Ci0JfQotCiAJbXV0ZXhfdW5sb2NrKCZzYy0+bXV0ZXgpOwogCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOwogCkBAIC0xNzY0LDYgKzE3OTQsMTIgQEAKIAlpZiAoY2hhbmdlZCAmIENIRUNLX0FOSSkKIAkJYXRoX2NoZWNrX2FuaShzYyk7CiAKKwlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX1RYUE9XRVIpIHsKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywgInZpZiAlcE0gcG93ZXIgJWQgZGJtIHBvd2VyX3R5cGUgJWRcbiIsCisJCQl2aWYtPmFkZHIsIGJzc19jb25mLT50eHBvd2VyLCBic3NfY29uZi0+dHhwb3dlcl90eXBlKTsKKwkJYXRoOWtfc2V0X3R4cG93ZXIoc2MsIHZpZik7CisJfQorCiAJbXV0ZXhfdW5sb2NrKCZzYy0+bXV0ZXgpOwogCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWNpLmMKaW5kZXggM2Y3YTExZS4uNjY1OTZiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21jaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tY2kuYwpAQCAtNDk1LDcgKzQ5NSw3IEBACiAJYXI5MDAzX21jaV9nZXRfaW50ZXJydXB0KHNjLT5zY19haCwgJm1jaV9pbnQsICZtY2lfaW50X3J4bXNnKTsKIAogCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfRU5BQkxFKSA9PSAwKSB7Ci0JCWFyOTAwM19tY2lfZ2V0X25leHRfZ3BtX29mZnNldChhaCwgdHJ1ZSwgTlVMTCk7CisJCWFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9JTklUX0dQTV9PRkZTRVQpOwogCQlyZXR1cm47CiAJfQogCkBAIC01NTksOCArNTU5LDcgQEAKIAkJCQlyZXR1cm47CiAKIAkJCXBncG0gPSBtY2ktPmdwbV9idWYuYmZfYWRkcjsKLQkJCW9mZnNldCA9IGFyOTAwM19tY2lfZ2V0X25leHRfZ3BtX29mZnNldChhaCwgZmFsc2UsCi0JCQkJCQkJCSZtb3JlX2RhdGEpOworCQkJb2Zmc2V0ID0gYXI5MDAzX21jaV9nZXRfbmV4dF9ncG1fb2Zmc2V0KGFoLCAmbW9yZV9kYXRhKTsKIAogCQkJaWYgKG9mZnNldCA9PSBNQ0lfR1BNX0lOVkFMSUQpCiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnLmgKaW5kZXggOTU4N2VjNi4uY2FiYTU0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWcuaApAQCAtOTU4LDYgKzk1OCw4IEBACiAKICNkZWZpbmUgQVJfU1JFVl85NTUwKF9haCkgXAogCSgoKF9haCktPmh3X3ZlcnNpb24ubWFjVmVyc2lvbiA9PSBBUl9TUkVWX1ZFUlNJT05fOTU1MCkpCisjZGVmaW5lIEFSX1NSRVZfOTU1MF9PUl9MQVRFUihfYWgpIFwKKwkoKChfYWgpLT5od192ZXJzaW9uLm1hY1ZlcnNpb24gPj0gQVJfU1JFVl9WRVJTSU9OXzk1NTApKQogCiAjZGVmaW5lIEFSX1NSRVZfOTU4MChfYWgpIFwKIAkoKChfYWgpLT5od192ZXJzaW9uLm1hY1ZlcnNpb24gPT0gQVJfU1JFVl9WRVJTSU9OXzk1ODApICYmIFwKQEAgLTExMjgsNiArMTEzMCw4IEBACiAKICNkZWZpbmUgQVJfR1BJT19PRV9PVVQgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVJfU1JFVl85MzQwKGFoKSA/IDB4NDAzMCA6IFwKIAkJCQkJCSAgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkgPyAweDQwNTAgOiAweDQwNGMpKQorI2RlZmluZSBBUl9HUElPX09FX09VVF9NQVNLCQkJIChBUl9TUkVWXzk1NTBfT1JfTEFURVIoYWgpID8gXAorCQkJCQkJICAweDAwMDAwMDBGIDogMHhGRkZGRkZGRikKICNkZWZpbmUgQVJfR1BJT19PRV9PVVRfRFJWICAgICAgICAgICAgICAgICAgICAgICAweDMKICNkZWZpbmUgQVJfR1BJT19PRV9PVVRfRFJWX05PICAgICAgICAgICAgICAgICAgICAweDAKICNkZWZpbmUgQVJfR1BJT19PRV9PVVRfRFJWX0xPVyAgICAgICAgICAgICAgICAgICAweDEKQEAgLTIwNDQsMjc5ICsyMDQ4LDQgQEAKICNkZWZpbmUgQVJfUEhZX0FHQ19DT05UUk9MX1lDT0tfTUFYCQkweDAwMDAwM2MwCiAjZGVmaW5lIEFSX1BIWV9BR0NfQ09OVFJPTF9ZQ09LX01BWF9TCQk2CiAKLS8qIE1DSSBSZWdpc3RlcnMgKi8KLQotI2RlZmluZSBBUl9NQ0lfQ09NTUFORDAJCQkJMHgxODAwCi0jZGVmaW5lIEFSX01DSV9DT01NQU5EMF9IRUFERVIJCQkweEZGCi0jZGVmaW5lIEFSX01DSV9DT01NQU5EMF9IRUFERVJfUwkJMAotI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfTEVOCQkJMHgxZjAwCi0jZGVmaW5lIEFSX01DSV9DT01NQU5EMF9MRU5fUwkJCTgKLSNkZWZpbmUgQVJfTUNJX0NPTU1BTkQwX0RJU0FCTEVfVElNRVNUQU1QCTB4MjAwMAotI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfRElTQUJMRV9USU1FU1RBTVBfUwkxMwotCi0jZGVmaW5lIEFSX01DSV9DT01NQU5EMQkJCQkweDE4MDQKLQotI2RlZmluZSBBUl9NQ0lfQ09NTUFORDIJCQkJMHgxODA4Ci0jZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9UWAkJMHgwMQotI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfVFhfUwkJMAotI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfUlgJCTB4MDIKLSNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JYX1MJCTEKLSNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JYX05VTV9DWUNMRVMgICAgIDB4M0ZDCi0jZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SWF9OVU1fQ1lDTEVTX1MgICAyCi0jZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SRVFfV0FLRVVQICAgICAgICAweDQwMAotI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfUkVRX1dBS0VVUF9TICAgICAgMTAKLQotI2RlZmluZSBBUl9NQ0lfUlhfQ1RSTAkJCQkweDE4MGMKLQotI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTAkJCQkweDE4MTAKLS8qIDAgPSBubyBkaXZpc2lvbiwgMSA9IGRpdmlkZSBieSAyLCAyID0gZGl2aWRlIGJ5IDQsIDMgPSBkaXZpZGUgYnkgOCAqLwotI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTF9DTEtfRElWCQkJMHgwMwotI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTF9DTEtfRElWX1MJCTAKLSNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfRElTQUJMRV9MTkFfVVBEQVRFCTB4MDQKLSNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfRElTQUJMRV9MTkFfVVBEQVRFX1MJMgotI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTF9HQUlOX1VQREFURV9GUkVRCQkweEZGRkZGOAotI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTF9HQUlOX1VQREFURV9GUkVRX1MJMwotI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTF9HQUlOX1VQREFURV9OVU0JCTB4RjAwMDAwMAotI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTF9HQUlOX1VQREFURV9OVU1fUwkyNAotCi0jZGVmaW5lIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRQkJCTB4MTgxNAotI2RlZmluZSBBUl9NQ0lfTVNHX0FUVFJJQlVURVNfVEFCTEVfQ0hFQ0tTVU0JCTB4RkZGRgotI2RlZmluZSBBUl9NQ0lfTVNHX0FUVFJJQlVURVNfVEFCTEVfQ0hFQ0tTVU1fUwkJMAotI2RlZmluZSBBUl9NQ0lfTVNHX0FUVFJJQlVURVNfVEFCTEVfSU5WQUxJRF9IRFIJCTB4RkZGRjAwMDAKLSNkZWZpbmUgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFX0lOVkFMSURfSERSX1MJMTYKLQotI2RlZmluZSBBUl9NQ0lfU0NIRF9UQUJMRV8wCQkJCTB4MTgxOAotI2RlZmluZSBBUl9NQ0lfU0NIRF9UQUJMRV8xCQkJCTB4MTgxYwotI2RlZmluZSBBUl9NQ0lfR1BNXzAJCQkJCTB4MTgyMAotI2RlZmluZSBBUl9NQ0lfR1BNXzEJCQkJCTB4MTgyNAotI2RlZmluZSBBUl9NQ0lfR1BNX1dSSVRFX1BUUgkJCQkweEZGRkYwMDAwCi0jZGVmaW5lIEFSX01DSV9HUE1fV1JJVEVfUFRSX1MJCQkJMTYKLSNkZWZpbmUgQVJfTUNJX0dQTV9CVUZfTEVOCQkJCTB4MDAwMEZGRkYKLSNkZWZpbmUgQVJfTUNJX0dQTV9CVUZfTEVOX1MJCQkJMAotCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUkFXCQkJCTB4MTgyOAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0VOCQkJCTB4MTgyYwotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1NXX01TR19ET05FCQkJMHgwMDAwMDAwMQotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1NXX01TR19ET05FX1MJCQkwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQ1BVX0lOVF9NU0cJCQkweDAwMDAwMDAyCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQ1BVX0lOVF9NU0dfUwkJCTEKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9DS1NVTV9GQUlMCQkJMHgwMDAwMDAwNAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX0NLU1VNX0ZBSUxfUwkJMgotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX0lOVkFMSURfSERSCQkJMHgwMDAwMDAwOAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX0lOVkFMSURfSERSX1MJCTMKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9IV19NU0dfRkFJTAkJCTB4MDAwMDAwMTAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9IV19NU0dfRkFJTF9TCQk0Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfU1dfTVNHX0ZBSUwJCQkweDAwMDAwMDIwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfU1dfTVNHX0ZBSUxfUwkJNQotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1RYX0hXX01TR19GQUlMCQkJMHgwMDAwMDA4MAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1RYX0hXX01TR19GQUlMX1MJCTcKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9UWF9TV19NU0dfRkFJTAkJCTB4MDAwMDAxMDAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9UWF9TV19NU0dfRkFJTF9TCQk4Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHCQkJCTB4MDAwMDAyMDAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUwkJCTkKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SRU1PVEVfU0xFRVBfVVBEQVRFCQkweDAwMDAwNDAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUkVNT1RFX1NMRUVQX1VQREFURV9TCQkxMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX1BSSQkJCQkweDA3ZmZmODAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfUFJJX1MJCQkxMQotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX1BSSV9USFJFU0gJCQkweDA4MDAwMDAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfUFJJX1RIUkVTSF9TCQkyNwotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX0ZSRVEJCQkweDEwMDAwMDAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfRlJFUV9TCQkJMjgKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9TVE9NUAkJCTB4MjAwMDAwMDAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9TVE9NUF9TCQkJMjkKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CQl9BSUNfSVJRCQkJMHg0MDAwMDAwMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JCX0FJQ19JUlFfUwkJCTMwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQ09OVF9JTkZPX1RJTUVPVVQJCTB4ODAwMDAwMDAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9DT05UX0lORk9fVElNRU9VVF9TCQkzMQotCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfREVGQVVMVCAgICAoQVJfTUNJX0lOVEVSUlVQVF9TV19NU0dfRE9ORQkgIHwgXAotCQkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9SWF9JTlZBTElEX0hEUgkgIHwgXAotCQkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9SWF9IV19NU0dfRkFJTAkgIHwgXAotCQkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9SWF9TV19NU0dfRkFJTAkgIHwgXAotCQkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9UWF9IV19NU0dfRkFJTAkgIHwgXAotCQkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9UWF9TV19NU0dfRkFJTAkgIHwgXAotCQkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0cJCSAgfCBcCi0JCQkJICAgICBBUl9NQ0lfSU5URVJSVVBUX1JFTU9URV9TTEVFUF9VUERBVEUgfCBcCi0JCQkJICAgICBBUl9NQ0lfSU5URVJSVVBUX0NPTlRfSU5GT19USU1FT1VUKQotCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfTVNHX0ZBSUxfTUFTSyAoQVJfTUNJX0lOVEVSUlVQVF9SWF9IV19NU0dfRkFJTCB8IFwKLQkJCQkJQVJfTUNJX0lOVEVSUlVQVF9SWF9TV19NU0dfRkFJTCB8IFwKLQkJCQkJQVJfTUNJX0lOVEVSUlVQVF9UWF9IV19NU0dfRkFJTCB8IFwKLQkJCQkJQVJfTUNJX0lOVEVSUlVQVF9UWF9TV19NU0dfRkFJTCkKLQotI2RlZmluZSBBUl9NQ0lfUkVNT1RFX0NQVV9JTlQJCQkJMHgxODMwCi0jZGVmaW5lIEFSX01DSV9SRU1PVEVfQ1BVX0lOVF9FTgkJCTB4MTgzNAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcJCQkweDE4MzgKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfRU4JCQkweDE4M2MKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVNT1RFX1JFU0VUCQkweDAwMDAwMDAxCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVF9TCQkwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9DT05UUk9MCQkweDAwMDAwMDAyCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9DT05UUk9MX1MJCTEKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9OQUNLCQkweDAwMDAwMDA0Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDS19TCQkyCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfSU5GTwkJMHgwMDAwMDAwOAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk9fUwkJMwotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVAkJMHgwMDAwMDAxMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVF9TCQk0Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTwkJMHgwMDAwMDAyMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TQ0hEX0lORk9fUwkJNQotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DUFVfSU5UCQkJMHgwMDAwMDA0MAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DUFVfSU5UX1MJCTYKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfR1BNCQkJMHgwMDAwMDEwMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19HUE1fUwkJCTgKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0lORk8JCTB4MDAwMDAyMDAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0lORk9fUwkJOQotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfU0xFRVBJTkcJCTB4MDAwMDA0MDAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1NMRUVQSU5HX1MJCTEwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19XQUtJTkcJCTB4MDAwMDA4MDAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lOR19TCQkxMQotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRVFfV0FLRQkJMHgwMDAwMTAwMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRVFfV0FLRV9TCQkxMgotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX0hXX01TR19NQVNLCSAoQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU0NIRF9JTkZPICB8IFwKLQkJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTHwgXAotCQkJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPICAgfCBcCi0JCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9OQUNLICB8IFwKLQkJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk8gIHwgXAotCQkJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUKQotCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0RFRkFVTFQgKEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTQkgfCBcCi0JCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRU1PVEVfUkVTRVR8IFwKLQkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19XQUtJTkcgIHwgXAotCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1NMRUVQSU5HfCBcCi0JCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRVFfV0FLRSkKLQotI2RlZmluZSBBUl9NQ0lfQ1BVX0lOVAkJCQkJMHgxODQwCi0KLSNkZWZpbmUgQVJfTUNJX1JYX1NUQVRVUwkJCTB4MTg0NAotI2RlZmluZSBBUl9NQ0lfUlhfTEFTVF9TQ0hEX01TR19JTkRFWAkJMHgwMDAwMEYwMAotI2RlZmluZSBBUl9NQ0lfUlhfTEFTVF9TQ0hEX01TR19JTkRFWF9TCQk4Ci0jZGVmaW5lIEFSX01DSV9SWF9SRU1PVEVfU0xFRVAJCQkweDAwMDAxMDAwCi0jZGVmaW5lIEFSX01DSV9SWF9SRU1PVEVfU0xFRVBfUwkJMTIKLSNkZWZpbmUgQVJfTUNJX1JYX01DSV9DTEtfUkVRCQkJMHgwMDAwMjAwMAotI2RlZmluZSBBUl9NQ0lfUlhfTUNJX0NMS19SRVFfUwkJCTEzCi0KLSNkZWZpbmUgQVJfTUNJX0NPTlRfU1RBVFVTCQkJMHgxODQ4Ci0jZGVmaW5lIEFSX01DSV9DT05UX1JTU0lfUE9XRVIJCQkweDAwMDAwMEZGCi0jZGVmaW5lIEFSX01DSV9DT05UX1JTU0lfUE9XRVJfUwkJMAotI2RlZmluZSBBUl9NQ0lfQ09OVF9QUklPUklUWQkJCTB4MDAwMEZGMDAKLSNkZWZpbmUgQVJfTUNJX0NPTlRfUFJJT1JJVFlfUwkJCTgKLSNkZWZpbmUgQVJfTUNJX0NPTlRfVFhSWAkJCTB4MDAwMTAwMDAKLSNkZWZpbmUgQVJfTUNJX0NPTlRfVFhSWF9TCQkJMTYKLQotI2RlZmluZSBBUl9NQ0lfQlRfUFJJMAkJCQkweDE4NGMKLSNkZWZpbmUgQVJfTUNJX0JUX1BSSTEJCQkJMHgxODUwCi0jZGVmaW5lIEFSX01DSV9CVF9QUkkyCQkJCTB4MTg1NAotI2RlZmluZSBBUl9NQ0lfQlRfUFJJMwkJCQkweDE4NTgKLSNkZWZpbmUgQVJfTUNJX0JUX1BSSQkJCQkweDE4NWMKLSNkZWZpbmUgQVJfTUNJX1dMX0ZSRVEwCQkJCTB4MTg2MAotI2RlZmluZSBBUl9NQ0lfV0xfRlJFUTEJCQkJMHgxODY0Ci0jZGVmaW5lIEFSX01DSV9XTF9GUkVRMgkJCQkweDE4NjgKLSNkZWZpbmUgQVJfTUNJX0dBSU4JCQkJMHgxODZjCi0jZGVmaW5lIEFSX01DSV9XQlRJTUVSMQkJCQkweDE4NzAKLSNkZWZpbmUgQVJfTUNJX1dCVElNRVIyCQkJCTB4MTg3NAotI2RlZmluZSBBUl9NQ0lfV0JUSU1FUjMJCQkJMHgxODc4Ci0jZGVmaW5lIEFSX01DSV9XQlRJTUVSNAkJCQkweDE4N2MKLSNkZWZpbmUgQVJfTUNJX01BWEdBSU4JCQkJMHgxODgwCi0jZGVmaW5lIEFSX01DSV9IV19TQ0hEX1RCTF9DVEwJCQkweDE4ODQKLSNkZWZpbmUgQVJfTUNJX0hXX1NDSERfVEJMX0QwCQkJMHgxODg4Ci0jZGVmaW5lIEFSX01DSV9IV19TQ0hEX1RCTF9EMQkJCTB4MTg4YwotI2RlZmluZSBBUl9NQ0lfSFdfU0NIRF9UQkxfRDIJCQkweDE4OTAKLSNkZWZpbmUgQVJfTUNJX0hXX1NDSERfVEJMX0QzCQkJMHgxODk0Ci0jZGVmaW5lIEFSX01DSV9UWF9QQVlMT0FEMAkJCTB4MTg5OAotI2RlZmluZSBBUl9NQ0lfVFhfUEFZTE9BRDEJCQkweDE4OWMKLSNkZWZpbmUgQVJfTUNJX1RYX1BBWUxPQUQyCQkJMHgxOGEwCi0jZGVmaW5lIEFSX01DSV9UWF9QQVlMT0FEMwkJCTB4MThhNAotI2RlZmluZSBBUl9CVENPRVhfV0JUSU1FUgkJCTB4MThhOAotCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMCQkJCQkweDE4YWMKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfQVI5NDYyX01PREUJCQkweDAwMDAwMDAxCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0FSOTQ2Ml9NT0RFX1MJCQkwCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1dCVElNRVJfRU4JCQkweDAwMDAwMDAyCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1dCVElNRVJfRU5fUwkJCTEKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfTUNJX01PREVfRU4JCQkweDAwMDAwMDA0Ci0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX01DSV9NT0RFX0VOX1MJCQkyCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0xOQV9TSEFSRUQJCQkweDAwMDAwMDA4Ci0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0xOQV9TSEFSRURfUwkJCTMKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfUEFfU0hBUkVECQkJMHgwMDAwMDAxMAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9QQV9TSEFSRURfUwkJCTQKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfT05FX1NURVBfTE9PS19BSEVBRF9FTgkJMHgwMDAwMDAyMAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9PTkVfU1RFUF9MT09LX0FIRUFEX0VOX1MJCTUKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfVElNRV9UT19ORVhUX0JUX1RIUkVTSF9FTgkweDAwMDAwMDQwCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1RJTUVfVE9fTkVYVF9CVF9USFJFU0hfRU5fUwk2Ci0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX05VTV9BTlRFTk5BUwkJCTB4MDAwMDAxODAKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfTlVNX0FOVEVOTkFTX1MJCQk3Ci0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1JYX0NIQUlOX01BU0sJCQkweDAwMDAwRTAwCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1JYX0NIQUlOX01BU0tfUwkJCTkKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfQUdHUl9USFJFU0gJCQkweDAwMDA3MDAwCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0FHR1JfVEhSRVNIX1MJCQkxMgotI2RlZmluZSBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0JDTgkJCTB4MDAwODAwMDAKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9CQ05fUwkJCTE5Ci0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMXzFfQ0hBSU5fQUNLCQkJMHgwMDEwMDAwMAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0FDS19TCQkJMjAKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfV0FJVF9CQV9NQVJHSU4JCQkweDFGRTAwMDAwCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1dBSVRfQkFfTUFSR0lOX1MJCQkyOAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9SRURVQ0VfVFhQV1IJCQkweDIwMDAwMDAwCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1JFRFVDRV9UWFBXUl9TCQkJMjkKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfU1BEVF9FTkFCTEVfMTAJCQkweDQwMDAwMDAwCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1NQRFRfRU5BQkxFXzEwX1MJCQkzMAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9TUERUX1BPTEFSSVRZCQkJMHg4MDAwMDAwMAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9TUERUX1BPTEFSSVRZX1MJCQkzMQotCi0jZGVmaW5lIEFSX0JUQ09FWF9NQVhfVFhQV1IoX3gpCQkJCSgweDE4YzAgKyAoKF94KSA8PCAyKSkKLSNkZWZpbmUgQVJfQlRDT0VYX1dMX0xOQQkJCQkweDE5NDAKLSNkZWZpbmUgQVJfQlRDT0VYX1JGR0FJTl9DVFJMCQkJCTB4MTk0NAotI2RlZmluZSBBUl9CVENPRVhfV0xfTE5BX1RJTUVPVVQJCQkweDAwM0ZGRkZGCi0jZGVmaW5lIEFSX0JUQ09FWF9XTF9MTkFfVElNRU9VVF9TCQkJMAotCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMMgkJCQkJMHgxOTQ4Ci0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9UWFBXUl9USFJFU0gJCQkweDAwMDdGODAwCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9UWFBXUl9USFJFU0hfUwkJCTExCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9UWF9DSEFJTl9NQVNLCQkJMHgwMDM4MDAwMAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfVFhfQ0hBSU5fTUFTS19TCQkJMTkKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX1JYX0RFV0VJR0hUCQkJMHgwMDQwMDAwMAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfUlhfREVXRUlHSFRfUwkJCTIyCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9HUElPX09CU19TRUwJCQkweDAwODAwMDAwCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9HUElPX09CU19TRUxfUwkJCTIzCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9NQUNfQkJfT0JTX1NFTAkJCTB4MDEwMDAwMDAKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX01BQ19CQl9PQlNfU0VMX1MJCTI0Ci0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9ERVNDX0JBU0VEX1RYUFdSX0VOQUJMRQkJMHgwMjAwMDAwMAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfREVTQ19CQVNFRF9UWFBXUl9FTkFCTEVfUwkyNQotCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1NQRFRfRU5BQkxFICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfU1BEVF9FTkFCTEVfUyAgICAgICAgMAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9CVF9PV05fU1BEVF9DVFJMICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0JUX09XTl9TUERUX0NUUkxfUyAgIDEKLSNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfVVNFX0xBVENIRURfQlRfQU5UICAgMHgwMDAwMDAwNAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9VU0VfTEFUQ0hFRF9CVF9BTlRfUyAyCi0jZGVmaW5lIEFSX0dMQl9XTEFOX1VBUlRfSU5URl9FTiAgICAgICAgICAgIDB4MDAwMjAwMDAKLSNkZWZpbmUgQVJfR0xCX1dMQU5fVUFSVF9JTlRGX0VOX1MgICAgICAgICAgMTcKLSNkZWZpbmUgQVJfR0xCX0RTX0pUQUdfRElTQUJMRSAgICAgICAgICAgICAgMHgwMDA0MDAwMAotI2RlZmluZSBBUl9HTEJfRFNfSlRBR19ESVNBQkxFX1MgICAgICAgICAgICAxOAotCi0jZGVmaW5lIEFSX0JUQ09FWF9SQyAgICAgICAgICAgICAgICAgICAgMHgxOTRjCi0jZGVmaW5lIEFSX0JUQ09FWF9NQVhfUkZHQUlOKF94KSAgICAgICAgKDB4MTk1MCArICgoX3gpIDw8IDIpKQotI2RlZmluZSBBUl9CVENPRVhfREJHICAgICAgICAgICAgICAgICAgIDB4MWE1MAotI2RlZmluZSBBUl9NQ0lfTEFTVF9IV19NU0dfSERSICAgICAgICAgIDB4MWE1NAotI2RlZmluZSBBUl9NQ0lfTEFTVF9IV19NU0dfQkRZICAgICAgICAgIDB4MWE1OAotCi0jZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzIgICAgICAgICAgICAgMHgxYTVjCi0jZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzJfTUVNX0JBU0VEICAgMHgwMDAwMDAwMQotI2RlZmluZSBBUl9NQ0lfU0NIRF9UQUJMRV8yX01FTV9CQVNFRF9TIDAKLSNkZWZpbmUgQVJfTUNJX1NDSERfVEFCTEVfMl9IV19CQVNFRCAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzJfSFdfQkFTRURfUyAgMQotCi0jZGVmaW5lIEFSX0JUQ09FWF9DVFJMMyAgICAgICAgICAgICAgIDB4MWE2MAotI2RlZmluZSBBUl9CVENPRVhfQ1RSTDNfQ09OVF9JTkZPX1RJTUVPVVQJMHgwMDAwMGZmZgotI2RlZmluZSBBUl9CVENPRVhfQ1RSTDNfQ09OVF9JTkZPX1RJTUVPVVRfUwkwCi0KLSNkZWZpbmUgQVJfR0xCX1NXUkVHX0RJU0NPTlRfTU9ERSAgICAgICAgIDB4MjAwMmMKLSNkZWZpbmUgQVJfR0xCX1NXUkVHX0RJU0NPTlRfRU5fQlRfV0xBTiAgIDB4MwotCi0jZGVmaW5lIEFSX01DSV9NSVNDICAgICAgICAgICAgICAgICAgICAweDFhNzQKLSNkZWZpbmUgQVJfTUNJX01JU0NfSFdfRklYX0VOICAgICAgICAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgQVJfTUNJX01JU0NfSFdfRklYX0VOX1MgICAgICAgIDAKLSNkZWZpbmUgQVJfTUNJX0RCR19DTlRfQ1RSTCAgICAgICAgICAgIDB4MWE3OAotI2RlZmluZSBBUl9NQ0lfREJHX0NOVF9DVFJMX0VOQUJMRSAgICAgMHgwMDAwMDAwMQotI2RlZmluZSBBUl9NQ0lfREJHX0NOVF9DVFJMX0VOQUJMRV9TICAgMAotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWdfYWljLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnX2FpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NTE0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnX2FpYy5oCkBAIC0wLDAgKzEsMTY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFF1YWxjb21tIEF0aGVyb3MgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgUkVHX0FJQ19ICisjZGVmaW5lIFJFR19BSUNfSAorCisjZGVmaW5lIEFSX1NNX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGEyMDAKKyNkZWZpbmUgQVJfU00xX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YjIwMAorI2RlZmluZSBBUl9BR0NfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5ZTAwCisKKyNkZWZpbmUgQVJfUEhZX0FJQ19DVFJMXzBfQjAgICAgICAgICAgICAgICAgICAgIChBUl9TTV9CQVNFICsgMHg0YjApCisjZGVmaW5lIEFSX1BIWV9BSUNfQ1RSTF8xX0IwICAgICAgICAgICAgICAgICAgICAoQVJfU01fQkFTRSArIDB4NGI0KQorI2RlZmluZSBBUl9QSFlfQUlDX0NUUkxfMl9CMCAgICAgICAgICAgICAgICAgICAgKEFSX1NNX0JBU0UgKyAweDRiOCkKKyNkZWZpbmUgQVJfUEhZX0FJQ19DVFJMXzNfQjAgICAgICAgICAgICAgICAgICAgIChBUl9TTV9CQVNFICsgMHg0YmMpCisjZGVmaW5lIEFSX1BIWV9BSUNfQ1RSTF80X0IwICAgICAgICAgICAgICAgICAgICAoQVJfU01fQkFTRSArIDB4NGMwKQorCisjZGVmaW5lIEFSX1BIWV9BSUNfU1RBVF8wX0IwICAgICAgICAgICAgICAgICAgICAoQVJfU01fQkFTRSArIDB4NGM0KQorI2RlZmluZSBBUl9QSFlfQUlDX1NUQVRfMV9CMCAgICAgICAgICAgICAgICAgICAgKEFSX1NNX0JBU0UgKyAweDRjOCkKKyNkZWZpbmUgQVJfUEhZX0FJQ19TVEFUXzJfQjAgICAgICAgICAgICAgICAgICAgIChBUl9TTV9CQVNFICsgMHg0Y2MpCisKKyNkZWZpbmUgQVJfUEhZX0FJQ19DVFJMXzBfQjEgICAgICAgICAgICAgICAgICAgIChBUl9TTTFfQkFTRSArIDB4NGIwKQorI2RlZmluZSBBUl9QSFlfQUlDX0NUUkxfMV9CMSAgICAgICAgICAgICAgICAgICAgKEFSX1NNMV9CQVNFICsgMHg0YjQpCisjZGVmaW5lIEFSX1BIWV9BSUNfQ1RSTF80X0IxICAgICAgICAgICAgICAgICAgICAoQVJfU00xX0JBU0UgKyAweDRjMCkKKworI2RlZmluZSBBUl9QSFlfQUlDX1NUQVRfMF9CMSAgICAgICAgICAgICAgICAgICAgKEFSX1NNMV9CQVNFICsgMHg0YzQpCisjZGVmaW5lIEFSX1BIWV9BSUNfU1RBVF8xX0IxICAgICAgICAgICAgICAgICAgICAoQVJfU00xX0JBU0UgKyAweDRjOCkKKyNkZWZpbmUgQVJfUEhZX0FJQ19TVEFUXzJfQjEgICAgICAgICAgICAgICAgICAgIChBUl9TTTFfQkFTRSArIDB4NGNjKQorCisjZGVmaW5lIEFSX1BIWV9BSUNfU1JBTV9BRERSX0IwICAgICAgICAgICAgICAgICAoQVJfU01fQkFTRSArIDB4NWYwKQorI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fREFUQV9CMCAgICAgICAgICAgICAgICAgKEFSX1NNX0JBU0UgKyAweDVmNCkKKworI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fQUREUl9CMSAgICAgICAgICAgICAgICAgKEFSX1NNMV9CQVNFICsgMHg1ZjApCisjZGVmaW5lIEFSX1BIWV9BSUNfU1JBTV9EQVRBX0IxICAgICAgICAgICAgICAgICAoQVJfU00xX0JBU0UgKyAweDVmNCkKKworI2RlZmluZSBBUl9QSFlfQlRfQ09FWF80ICAgICAgICAgICAgICAgICAgICAgICAgKEFSX0FHQ19CQVNFICsgMHg2MCkKKyNkZWZpbmUgQVJfUEhZX0JUX0NPRVhfNSAgICAgICAgICAgICAgICAgICAgICAgIChBUl9BR0NfQkFTRSArIDB4NjQpCisKKy8qIEFJQyBmaWVsZHMgKi8KKyNkZWZpbmUgQVJfUEhZX0FJQ19NT05fRU5BQkxFICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgQVJfUEhZX0FJQ19NT05fRU5BQkxFX1MgICAgICAgICAgICAgICAgIDMxCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX01BWF9IT1BfQ09VTlQgICAgICAgICAgICAweDdGMDAwMDAwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX01BWF9IT1BfQ09VTlRfUyAgICAgICAgICAyNAorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9NSU5fVkFMSURfQ09VTlQgICAgICAgICAgMHgwMEZFMDAwMAorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9NSU5fVkFMSURfQ09VTlRfUyAgICAgICAgMTcKKyNkZWZpbmUgQVJfUEhZX0FJQ19GX1dMQU4gICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMUZDMDAKKyNkZWZpbmUgQVJfUEhZX0FJQ19GX1dMQU5fUyAgICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0NIX1ZBTElEX1JFU0VUICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0NIX1ZBTElEX1JFU0VUX1MgICAgICAgICA5CisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0VOQUJMRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0VOQUJMRV9TICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEFSX1BIWV9BSUNfQlRUWF9QV1JfVEhSICAgICAgICAgICAgICAgICAweDAwMDAwMEZFCisjZGVmaW5lIEFSX1BIWV9BSUNfQlRUWF9QV1JfVEhSX1MgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFSX1BIWV9BSUNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFSX1BIWV9BSUNfRU5BQkxFX1MgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0JUX1JFRl9ERUxBWSAgICAgICAgICAgICAweDAwRjAwMDAwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0JUX1JFRl9ERUxBWV9TICAgICAgICAgICAyMAorI2RlZmluZSBBUl9QSFlfQUlDX0JUX0lETEVfQ0ZHICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBBUl9QSFlfQUlDX0JUX0lETEVfQ0ZHX1MgICAgICAgICAgICAgICAgMTkKKyNkZWZpbmUgQVJfUEhZX0FJQ19TVERCWV9DT05EICAgICAgICAgICAgICAgICAgIDB4MDAwNjAwMDAKKyNkZWZpbmUgQVJfUEhZX0FJQ19TVERCWV9DT05EX1MgICAgICAgICAgICAgICAgIDE3CisjZGVmaW5lIEFSX1BIWV9BSUNfU1REQllfUk9UX0FUVF9EQiAgICAgICAgICAgICAweDAwMDFGODAwCisjZGVmaW5lIEFSX1BIWV9BSUNfU1REQllfUk9UX0FUVF9EQl9TICAgICAgICAgICAxMQorI2RlZmluZSBBUl9QSFlfQUlDX1NUREJZX0NPTV9BVFRfREIgICAgICAgICAgICAgMHgwMDAwMDcwMAorI2RlZmluZSBBUl9QSFlfQUlDX1NUREJZX0NPTV9BVFRfREJfUyAgICAgICAgICAgOAorI2RlZmluZSBBUl9QSFlfQUlDX1JTU0lfTUFYICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGMAorI2RlZmluZSBBUl9QSFlfQUlDX1JTU0lfTUFYX1MgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBBUl9QSFlfQUlDX1JTU0lfTUlOICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgorI2RlZmluZSBBUl9QSFlfQUlDX1JTU0lfTUlOX1MgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUl9QSFlfQUlDX1JBRElPX0RFTEFZICAgICAgICAgICAgICAgICAgMHg3RjAwMDAwMAorI2RlZmluZSBBUl9QSFlfQUlDX1JBRElPX0RFTEFZX1MgICAgICAgICAgICAgICAgMjQKKyNkZWZpbmUgQVJfUEhZX0FJQ19DQUxfU1RFUF9TSVpFX0NPUlIgICAgICAgICAgIDB4MDBGMDAwMDAKKyNkZWZpbmUgQVJfUEhZX0FJQ19DQUxfU1RFUF9TSVpFX0NPUlJfUyAgICAgICAgIDIwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1JPVF9JRFhfQ09SUiAgICAgICAgICAgICAweDAwMEY4MDAwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1JPVF9JRFhfQ09SUl9TICAgICAgICAgICAxNQorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9DT05WX0NIRUNLX0ZBQ1RPUiAgICAgICAgMHgwMDAwNjAwMAorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9DT05WX0NIRUNLX0ZBQ1RPUl9TICAgICAgMTMKKyNkZWZpbmUgQVJfUEhZX0FJQ19ST1RfSURYX0NPVU5UX01BWCAgICAgICAgICAgIDB4MDAwMDFDMDAKKyNkZWZpbmUgQVJfUEhZX0FJQ19ST1RfSURYX0NPVU5UX01BWF9TICAgICAgICAgIDEwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1NZTlRIX1RPR0dMRSAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1NZTlRIX1RPR0dMRV9TICAgICAgICAgICA5CisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1NZTlRIX0FGVEVSX0JUUlggICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1NZTlRIX0FGVEVSX0JUUlhfUyAgICAgICA4CisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1NZTlRIX1NFVFRMSU5HICAgICAgICAgICAweDAwMDAwMEZGCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1NZTlRIX1NFVFRMSU5HX1MgICAgICAgICAwCisjZGVmaW5lIEFSX1BIWV9BSUNfTU9OX01BWF9IT1BfQ09VTlQgICAgICAgICAgICAweDA3RjAwMDAwCisjZGVmaW5lIEFSX1BIWV9BSUNfTU9OX01BWF9IT1BfQ09VTlRfUyAgICAgICAgICAyMAorI2RlZmluZSBBUl9QSFlfQUlDX01PTl9NSU5fU1RBTEVfQ09VTlQgICAgICAgICAgMHgwMDBGRTAwMAorI2RlZmluZSBBUl9QSFlfQUlDX01PTl9NSU5fU1RBTEVfQ09VTlRfUyAgICAgICAgMTMKKyNkZWZpbmUgQVJfUEhZX0FJQ19NT05fUFdSX0VTVF9MT05HICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgQVJfUEhZX0FJQ19NT05fUFdSX0VTVF9MT05HX1MgICAgICAgICAgIDEyCisjZGVmaW5lIEFSX1BIWV9BSUNfTU9OX1BEX1RBTExZX1NDQUxJTkcgICAgICAgICAweDAwMDAwQzAwCisjZGVmaW5lIEFSX1BIWV9BSUNfTU9OX1BEX1RBTExZX1NDQUxJTkdfUyAgICAgICAxMAorI2RlZmluZSBBUl9QSFlfQUlDX01PTl9QRVJGX1RIUiAgICAgICAgICAgICAgICAgMHgwMDAwMDNFMAorI2RlZmluZSBBUl9QSFlfQUlDX01PTl9QRVJGX1RIUl9TICAgICAgICAgICAgICAgNQorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9UQVJHRVRfTUFHX1NFVFRJTkcgICAgICAgMHgwMDAwMDAxOAorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9UQVJHRVRfTUFHX1NFVFRJTkdfUyAgICAgMworI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9QRVJGX0NIRUNLX0ZBQ1RPUiAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9QRVJGX0NIRUNLX0ZBQ1RPUl9TICAgICAgMQorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9QV1JfRVNUX0xPTkcgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9QV1JfRVNUX0xPTkdfUyAgICAgICAgICAgMAorI2RlZmluZSBBUl9QSFlfQUlDX01PTl9ET05FICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBBUl9QSFlfQUlDX01PTl9ET05FX1MgICAgICAgICAgICAgICAgICAgMzEKKyNkZWZpbmUgQVJfUEhZX0FJQ19NT05fQUNUSVZFICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQVJfUEhZX0FJQ19NT05fQUNUSVZFX1MgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIEFSX1BIWV9BSUNfTUVBU19DT1VOVCAgICAgICAgICAgICAgICAgICAweDNGMDAwMDAwCisjZGVmaW5lIEFSX1BIWV9BSUNfTUVBU19DT1VOVF9TICAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9BTlRfSVNPX0VTVCAgICAgICAgICAgICAgMHgwMEZDMDAwMAorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9BTlRfSVNPX0VTVF9TICAgICAgICAgICAgMTgKKyNkZWZpbmUgQVJfUEhZX0FJQ19DQUxfSE9QX0NPVU5UICAgICAgICAgICAgICAgIDB4MDAwM0Y4MDAKKyNkZWZpbmUgQVJfUEhZX0FJQ19DQUxfSE9QX0NPVU5UX1MgICAgICAgICAgICAgIDExCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1ZBTElEX0NPVU5UICAgICAgICAgICAgICAweDAwMDAwN0YwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1ZBTElEX0NPVU5UX1MgICAgICAgICAgICA0CisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0JUX1RPT19XRUFLX0VSUiAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0JUX1RPT19XRUFLX0VSUl9TICAgICAgICAzCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0JUX1RPT19TVFJPTkdfRVJSICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0JUX1RPT19TVFJPTkdfRVJSX1MgICAgICAyCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0RPTkUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0RPTkVfUyAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0FDVElWRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX0FDVElWRV9TICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgQVJfUEhZX0FJQ19NRUFTX01BR19NSU4gICAgICAgICAgICAgICAgIDB4RkZDMDAwMDAKKyNkZWZpbmUgQVJfUEhZX0FJQ19NRUFTX01BR19NSU5fUyAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIEFSX1BIWV9BSUNfTU9OX1NUQUxFX0NPVU5UICAgICAgICAgICAgICAweDAwM0Y4MDAwCisjZGVmaW5lIEFSX1BIWV9BSUNfTU9OX1NUQUxFX0NPVU5UX1MgICAgICAgICAgICAxNQorI2RlZmluZSBBUl9QSFlfQUlDX01PTl9IT1BfQ09VTlQgICAgICAgICAgICAgICAgMHgwMDAwN0YwMAorI2RlZmluZSBBUl9QSFlfQUlDX01PTl9IT1BfQ09VTlRfUyAgICAgICAgICAgICAgOAorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9BSUNfU00gICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGOAorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9BSUNfU01fUyAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUl9QSFlfQUlDX1NNICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBBUl9QSFlfQUlDX1NNX1MgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fVkFMSUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fVkFMSURfUyAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fUk9UX1FVQURfQVRUX0RCICAgICAgICAgMHgwMDAwMDA3RQorI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fUk9UX1FVQURfQVRUX0RCX1MgICAgICAgMQorI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fVkdBX1FVQURfU0lHTiAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fVkdBX1FVQURfU0lHTl9TICAgICAgICAgNworI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fUk9UX0RJUl9BVFRfREIgICAgICAgICAgMHgwMDAwM0YwMAorI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fUk9UX0RJUl9BVFRfREJfUyAgICAgICAgOAorI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fVkdBX0RJUl9TSUdOICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBBUl9QSFlfQUlDX1NSQU1fVkdBX0RJUl9TSUdOX1MgICAgICAgICAgMTQKKyNkZWZpbmUgQVJfUEhZX0FJQ19TUkFNX0NPTV9BVFRfNkRCICAgICAgICAgICAgIDB4MDAwMzgwMDAKKyNkZWZpbmUgQVJfUEhZX0FJQ19TUkFNX0NPTV9BVFRfNkRCX1MgICAgICAgICAgIDE1CisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1JPVF9BVFRfREJfRVNUX0lTTyAgICAgICAweDAwMDBFMDAwCisjZGVmaW5lIEFSX1BIWV9BSUNfQ0FMX1JPVF9BVFRfREJfRVNUX0lTT19TICAgICAxMworI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9DT01fQVRUX0RCX0VTVF9JU08gICAgICAgMHgwMDAwMUUwMAorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9DT01fQVRUX0RCX0VTVF9JU09fUyAgICAgOQorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9JU09fRVNUX0lOSVRfU0VUVElORyAgICAgMHgwMDAwMDFGOAorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9JU09fRVNUX0lOSVRfU0VUVElOR19TICAgMworI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9DT01fQVRUX0RCX0JBQ0tPRkYgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9DT01fQVRUX0RCX0JBQ0tPRkZfUyAgICAgMQorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9DT01fQVRUX0RCX0ZJWEVEICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9QSFlfQUlDX0NBTF9DT01fQVRUX0RCX0ZJWEVEX1MgICAgICAgMAorCisjZW5kaWYgLyogUkVHX0FJQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnX21jaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZ19tY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjUxMzEwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZ19tY2kuaApAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBRdWFsY29tbSBBdGhlcm9zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIFJFR19NQ0lfSAorI2RlZmluZSBSRUdfTUNJX0gKKworI2RlZmluZSBBUl9NQ0lfQ09NTUFORDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MDAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQwX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRgorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfSEVBREVSX1MgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMF9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWYwMAorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfTEVOX1MgICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEFSX01DSV9DT01NQU5EMF9ESVNBQkxFX1RJTUVTVEFNUCAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfRElTQUJMRV9USU1FU1RBTVBfUyAgICAgICAgICAgICAxMworCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwNAorCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwOAorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfVFggICAgICAgICAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9UWF9TICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JYICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfUlhfUyAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SWF9OVU1fQ1lDTEVTICAgICAgICAgICAgIDB4M0ZDCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SWF9OVU1fQ1lDTEVTX1MgICAgICAgICAgIDIKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JFUV9XQUtFVVAgICAgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JFUV9XQUtFVVBfUyAgICAgICAgICAgICAgMTAKKworI2RlZmluZSBBUl9NQ0lfUlhfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MGMKKworI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MTAKKy8qCisgKiAwID0gbm8gZGl2aXNpb24sCisgKiAxID0gZGl2aWRlIGJ5IDIsCisgKiAyID0gZGl2aWRlIGJ5IDQsCisgKiAzID0gZGl2aWRlIGJ5IDgKKyAqLworI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTF9DTEtfRElWICAgICAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0NMS19ESVZfUyAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfRElTQUJMRV9MTkFfVVBEQVRFICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBBUl9NQ0lfVFhfQ1RSTF9ESVNBQkxFX0xOQV9VUERBVEVfUyAgICAgICAgICAgICAyCisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0dBSU5fVVBEQVRFX0ZSRVEgICAgICAgICAgICAgICAgIDB4RkZGRkY4CisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0dBSU5fVVBEQVRFX0ZSRVFfUyAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfR0FJTl9VUERBVEVfTlVNICAgICAgICAgICAgICAgICAgMHhGMDAwMDAwCisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0dBSU5fVVBEQVRFX05VTV9TICAgICAgICAgICAgICAgIDI0CisKKyNkZWZpbmUgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFICAgICAgICAgICAgICAgICAgICAgMHgxODE0CisjZGVmaW5lIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9DSEVDS1NVTSAgICAgICAgICAgIDB4RkZGRgorI2RlZmluZSBBUl9NQ0lfTVNHX0FUVFJJQlVURVNfVEFCTEVfQ0hFQ0tTVU1fUyAgICAgICAgICAwCisjZGVmaW5lIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9JTlZBTElEX0hEUiAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFX0lOVkFMSURfSERSX1MgICAgICAgMTYKKworI2RlZmluZSBBUl9NQ0lfU0NIRF9UQUJMRV8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MTgKKyNkZWZpbmUgQVJfTUNJX1NDSERfVEFCTEVfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODFjCisjZGVmaW5lIEFSX01DSV9HUE1fMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgyMAorI2RlZmluZSBBUl9NQ0lfR1BNXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MjQKKyNkZWZpbmUgQVJfTUNJX0dQTV9XUklURV9QVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAorI2RlZmluZSBBUl9NQ0lfR1BNX1dSSVRFX1BUUl9TICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBBUl9NQ0lfR1BNX0JVRl9MRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEFSX01DSV9HUE1fQlVGX0xFTl9TICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JBVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MjgKKworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MmMKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9TV19NU0dfRE9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1NXX01TR19ET05FX1MgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQ1BVX0lOVF9NU0cgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9DUFVfSU5UX01TR19TICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX0NLU1VNX0ZBSUwgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfQ0tTVU1fRkFJTF9TICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9JTlZBTElEX0hEUiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX0lOVkFMSURfSERSX1MgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX0ZBSUwgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9IV19NU0dfRkFJTF9TICAgICAgICAgICAgICAgNAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX1NXX01TR19GQUlMICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfU1dfTVNHX0ZBSUxfUyAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9UWF9IV19NU0dfRkFJTCAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1RYX0hXX01TR19GQUlMX1MgICAgICAgICAgICAgICA3CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfVFhfU1dfTVNHX0ZBSUwgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9UWF9TV19NU0dfRkFJTF9TICAgICAgICAgICAgICAgOAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TRyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1MgICAgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SRU1PVEVfU0xFRVBfVVBEQVRFICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JFTU9URV9TTEVFUF9VUERBVEVfUyAgICAgICAgICAxMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX1BSSSAgICAgICAgICAgICAgICAgICAgICAgICAweDA3ZmZmODAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfUFJJX1MgICAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfUFJJX1RIUkVTSCAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9QUklfVEhSRVNIX1MgICAgICAgICAgICAgICAgMjcKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9GUkVRICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX0ZSRVFfUyAgICAgICAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX1NUT01QICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfU1RPTVBfUyAgICAgICAgICAgICAgICAgICAgIDI5CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQkJfQUlDX0lSUSAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CQl9BSUNfSVJRX1MgICAgICAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9DT05UX0lORk9fVElNRU9VVCAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0NPTlRfSU5GT19USU1FT1VUX1MgICAgICAgICAgICAzMQorCisjZGVmaW5lIEFSX01DSV9SRU1PVEVfQ1BVX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgzMAorI2RlZmluZSBBUl9NQ0lfUkVNT1RFX0NQVV9JTlRfRU4gICAgICAgICAgICAgICAgICAgICAgICAweDE4MzQKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXICAgICAgICAgICAgICAgICAgICAgMHgxODM4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0VOICAgICAgICAgICAgICAgICAgICAgIDB4MTgzYworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRU1PVEVfUkVTRVQgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVF9TICAgICAgICAgIDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0NPTlRST0wgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTF9TICAgICAgICAgICAxCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDSyAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9OQUNLX1MgICAgICAgICAgICAgMgorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk8gICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfSU5GT19TICAgICAgICAgICAgIDMKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9SU1QgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVF9TICAgICAgICAgICAgICA0CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTyAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU0NIRF9JTkZPX1MgICAgICAgICAgICAgNQorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DUFVfSU5UICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NQVV9JTlRfUyAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfR1BNICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19HUE1fUyAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0lORk9fUyAgICAgICAgICAgICAgOQorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfU0xFRVBJTkcgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElOR19TICAgICAgICAgIDEwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19XQUtJTkcgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lOR19TICAgICAgICAgICAgMTEKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0UgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRVFfV0FLRV9TICAgICAgICAgICAgICAxMgorCisjZGVmaW5lIEFSX01DSV9DUFVfSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg0MAorCisjZGVmaW5lIEFSX01DSV9SWF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg0NAorI2RlZmluZSBBUl9NQ0lfUlhfTEFTVF9TQ0hEX01TR19JTkRFWCAgICAgICAgICAgICAgICAgICAweDAwMDAwRjAwCisjZGVmaW5lIEFSX01DSV9SWF9MQVNUX1NDSERfTVNHX0lOREVYX1MgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQVJfTUNJX1JYX1JFTU9URV9TTEVFUCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBBUl9NQ0lfUlhfUkVNT1RFX1NMRUVQX1MgICAgICAgICAgICAgICAgICAgICAgICAxMgorI2RlZmluZSBBUl9NQ0lfUlhfTUNJX0NMS19SRVEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEFSX01DSV9SWF9NQ0lfQ0xLX1JFUV9TICAgICAgICAgICAgICAgICAgICAgICAgIDEzCisKKyNkZWZpbmUgQVJfTUNJX0NPTlRfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODQ4CisjZGVmaW5lIEFSX01DSV9DT05UX1JTU0lfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgQVJfTUNJX0NPTlRfUlNTSV9QT1dFUl9TICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUl9NQ0lfQ09OVF9QUklPUklUWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRjAwCisjZGVmaW5lIEFSX01DSV9DT05UX1BSSU9SSVRZX1MgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgQVJfTUNJX0NPTlRfVFhSWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBBUl9NQ0lfQ09OVF9UWFJYX1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorCisjZGVmaW5lIEFSX01DSV9CVF9QUkkwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg0YworI2RlZmluZSBBUl9NQ0lfQlRfUFJJMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NTAKKyNkZWZpbmUgQVJfTUNJX0JUX1BSSTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODU0CisjZGVmaW5lIEFSX01DSV9CVF9QUkkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg1OAorI2RlZmluZSBBUl9NQ0lfQlRfUFJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NWMKKyNkZWZpbmUgQVJfTUNJX1dMX0ZSRVEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwCisjZGVmaW5lIEFSX01DSV9XTF9GUkVRMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2NAorI2RlZmluZSBBUl9NQ0lfV0xfRlJFUTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjgKKyNkZWZpbmUgQVJfTUNJX0dBSU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODZjCisjZGVmaW5lIEFSX01DSV9XQlRJTUVSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MAorI2RlZmluZSBBUl9NQ0lfV0JUSU1FUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzQKKyNkZWZpbmUgQVJfTUNJX1dCVElNRVIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODc4CisjZGVmaW5lIEFSX01DSV9XQlRJTUVSNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3YworI2RlZmluZSBBUl9NQ0lfTUFYR0FJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4ODAKKyNkZWZpbmUgQVJfTUNJX0hXX1NDSERfVEJMX0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODg0CisjZGVmaW5lIEFSX01DSV9IV19TQ0hEX1RCTF9EMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg4OAorI2RlZmluZSBBUl9NQ0lfSFdfU0NIRF9UQkxfRDEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4OGMKKyNkZWZpbmUgQVJfTUNJX0hXX1NDSERfVEJMX0QyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODkwCisjZGVmaW5lIEFSX01DSV9IV19TQ0hEX1RCTF9EMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg5NAorI2RlZmluZSBBUl9NQ0lfVFhfUEFZTE9BRDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4OTgKKyNkZWZpbmUgQVJfTUNJX1RYX1BBWUxPQUQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODljCisjZGVmaW5lIEFSX01DSV9UWF9QQVlMT0FEMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MThhMAorI2RlZmluZSBBUl9NQ0lfVFhfUEFZTE9BRDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4YTQKKyNkZWZpbmUgQVJfQlRDT0VYX1dCVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOGE4CisKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOGFjCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0FSOTQ2Ml9NT0RFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfQVI5NDYyX01PREVfUyAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9XQlRJTUVSX0VOICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1dCVElNRVJfRU5fUyAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfTUNJX01PREVfRU4gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9NQ0lfTU9ERV9FTl9TICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0xOQV9TSEFSRUQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfTE5BX1NIQVJFRF9TICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9QQV9TSEFSRUQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1BBX1NIQVJFRF9TICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfT05FX1NURVBfTE9PS19BSEVBRF9FTiAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9PTkVfU1RFUF9MT09LX0FIRUFEX0VOX1MgICAgICAgICA1CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1RJTUVfVE9fTkVYVF9CVF9USFJFU0hfRU4gICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfVElNRV9UT19ORVhUX0JUX1RIUkVTSF9FTl9TICAgICAgNgorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9OVU1fQU5URU5OQVMgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTgwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX05VTV9BTlRFTk5BU19TICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfUlhfQ0hBSU5fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMEUwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9SWF9DSEFJTl9NQVNLX1MgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0FHR1JfVEhSRVNIICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDcwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfQUdHUl9USFJFU0hfUyAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9CQ04gICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0JDTl9TICAgICAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0FDSyAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMXzFfQ0hBSU5fQUNLX1MgICAgICAgICAgICAgICAgICAgIDIwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1dBSVRfQkFfTUFSR0lOICAgICAgICAgICAgICAgICAgIDB4MUZFMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfV0FJVF9CQV9NQVJHSU5fUyAgICAgICAgICAgICAgICAgMjgKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfUkVEVUNFX1RYUFdSICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9SRURVQ0VfVFhQV1JfUyAgICAgICAgICAgICAgICAgICAyOQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRV8xMCAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1NQRFRfRU5BQkxFXzEwX1MgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1NQRFRfUE9MQVJJVFkgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfU1BEVF9QT0xBUklUWV9TICAgICAgICAgICAgICAgICAgMzEKKworI2RlZmluZSBBUl9CVENPRVhfV0xfV0VJR0hUUzAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4YjAKKyNkZWZpbmUgQVJfQlRDT0VYX1dMX1dFSUdIVFMxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOGI0CisjZGVmaW5lIEFSX0JUQ09FWF9XTF9XRUlHSFRTMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MThiOAorI2RlZmluZSBBUl9CVENPRVhfV0xfV0VJR0hUUzMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4YmMKKworI2RlZmluZSBBUl9CVENPRVhfTUFYX1RYUFdSKF94KSAgICAgICAgICAgICAgICAgICAgICAgICAoMHgxOGMwICsgKChfeCkgPDwgMikpCisjZGVmaW5lIEFSX0JUQ09FWF9XTF9MTkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTk0MAorI2RlZmluZSBBUl9CVENPRVhfUkZHQUlOX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5NDQKKyNkZWZpbmUgQVJfQlRDT0VYX1dMX0xOQV9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDNGRkZGRgorI2RlZmluZSBBUl9CVENPRVhfV0xfTE5BX1RJTUVPVVRfUyAgICAgICAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTQ4CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9UWFBXUl9USFJFU0ggICAgICAgICAgICAgICAgICAgIDB4MDAwN0Y4MDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX1RYUFdSX1RIUkVTSF9TICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX1RYX0NIQUlOX01BU0sgICAgICAgICAgICAgICAgICAgMHgwMDM4MDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfVFhfQ0hBSU5fTUFTS19TICAgICAgICAgICAgICAgICAxOQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfUlhfREVXRUlHSFQgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9SWF9ERVdFSUdIVF9TICAgICAgICAgICAgICAgICAgIDIyCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9HUElPX09CU19TRUwgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX0dQSU9fT0JTX1NFTF9TICAgICAgICAgICAgICAgICAgMjMKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX01BQ19CQl9PQlNfU0VMICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfTUFDX0JCX09CU19TRUxfUyAgICAgICAgICAgICAgICAyNAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfREVTQ19CQVNFRF9UWFBXUl9FTkFCTEUgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9ERVNDX0JBU0VEX1RYUFdSX0VOQUJMRV9TICAgICAgIDI1CisKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfU1BEVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRV9TICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0JUX09XTl9TUERUX0NUUkwgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfQlRfT1dOX1NQRFRfQ1RSTF9TICAgICAgICAgICAgICAgMQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9VU0VfTEFUQ0hFRF9CVF9BTlQgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1VTRV9MQVRDSEVEX0JUX0FOVF9TICAgICAgICAgICAgIDIKKyNkZWZpbmUgQVJfR0xCX1dMQU5fVUFSVF9JTlRGX0VOICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBBUl9HTEJfV0xBTl9VQVJUX0lOVEZfRU5fUyAgICAgICAgICAgICAgICAgICAgICAxNworI2RlZmluZSBBUl9HTEJfRFNfSlRBR19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEFSX0dMQl9EU19KVEFHX0RJU0FCTEVfUyAgICAgICAgICAgICAgICAgICAgICAgIDE4CisKKyNkZWZpbmUgQVJfQlRDT0VYX1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOTRjCisjZGVmaW5lIEFSX0JUQ09FWF9NQVhfUkZHQUlOKF94KSAgICAgICAgICAgICAgICAgICAgICAgICgweDE5NTAgKyAoKF94KSA8PCAyKSkKKyNkZWZpbmUgQVJfQlRDT0VYX0RCRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxYTUwCisjZGVmaW5lIEFSX01DSV9MQVNUX0hXX01TR19IRFIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWE1NAorI2RlZmluZSBBUl9NQ0lfTEFTVF9IV19NU0dfQkRZICAgICAgICAgICAgICAgICAgICAgICAgICAweDFhNTgKKworI2RlZmluZSBBUl9NQ0lfU0NIRF9UQUJMRV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFhNWMKKyNkZWZpbmUgQVJfTUNJX1NDSERfVEFCTEVfMl9NRU1fQkFTRUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9NQ0lfU0NIRF9UQUJMRV8yX01FTV9CQVNFRF9TICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzJfSFdfQkFTRUQgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQVJfTUNJX1NDSERfVEFCTEVfMl9IV19CQVNFRF9TICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWE2MAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDNfQ09OVF9JTkZPX1RJTUVPVVQgICAgICAgICAgICAgICAweDAwMDAwZmZmCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMM19DT05UX0lORk9fVElNRU9VVF9TICAgICAgICAgICAgIDAKKworI2RlZmluZSBBUl9HTEJfU1dSRUdfRElTQ09OVF9NT0RFICAgICAgICAgICAgICAgICAgICAgICAweDIwMDJjCisjZGVmaW5lIEFSX0dMQl9TV1JFR19ESVNDT05UX0VOX0JUX1dMQU4gICAgICAgICAgICAgICAgIDB4MworCisjZGVmaW5lIEFSX01DSV9NSVNDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MWE3NAorI2RlZmluZSBBUl9NQ0lfTUlTQ19IV19GSVhfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFSX01DSV9NSVNDX0hXX0ZJWF9FTl9TICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBBUl9NQ0lfREJHX0NOVF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFhNzgKKyNkZWZpbmUgQVJfTUNJX0RCR19DTlRfQ1RSTF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9NQ0lfREJHX0NOVF9DVFJMX0VOQUJMRV9TICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFSX01DSV9EQkdfQ05UX0NUUkxfQlRfTElOS0lEICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3ZjgKKyNkZWZpbmUgQVJfTUNJX0RCR19DTlRfQ1RSTF9CVF9MSU5LSURfUyAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIE1DSV9TVEFUX0FMTF9CVF9MSU5LSUQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZgorCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfREVGQVVMVCAoQVJfTUNJX0lOVEVSUlVQVF9TV19NU0dfRE9ORSAgICAgICAgIHwgXAorCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9JTlZBTElEX0hEUiAgICAgIHwgXAorCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9IV19NU0dfRkFJTCAgICAgIHwgXAorCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9TV19NU0dfRkFJTCAgICAgIHwgXAorCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9UWF9IV19NU0dfRkFJTCAgICAgIHwgXAorCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9UWF9TV19NU0dfRkFJTCAgICAgIHwgXAorCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0cgICAgICAgICAgICAgIHwgXAorCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SRU1PVEVfU0xFRVBfVVBEQVRFIHwgXAorCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9DT05UX0lORk9fVElNRU9VVCkKKworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX01TR19GQUlMX01BU0sgKEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX0ZBSUwgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJfTUNJX0lOVEVSUlVQVF9SWF9TV19NU0dfRkFJTCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUl9NQ0lfSU5URVJSVVBUX1RYX0hXX01TR19GQUlMIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSX01DSV9JTlRFUlJVUFRfVFhfU1dfTVNHX0ZBSUwpCisKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9IV19NU0dfTUFTSyAoQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU0NIRF9JTkZPICAgfCBcCisJCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTCB8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPICAgIHwgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9OQUNLICAgfCBcCisJCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk8gICB8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUKQorCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0RFRkFVTFQgKEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTSAgICAgICAgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVCAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19XQUtJTkcgICAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElORyAgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFKQorCisjZW5kaWYgLyogUkVHX01DSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnX3dvdy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZ193b3cuaAppbmRleCAzYWJmY2E1Li40NTMwNTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnX3dvdy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWdfd293LmgKQEAgLTcyLDcgKzcyLDcgQEAKICNkZWZpbmUgQVJfV09XX01BQ19JTlRSX0VOICAgICAgICAgICAgICAweDAwMDQwMDAwCiAjZGVmaW5lIEFSX1dPV19NQUdJQ19FTiAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAogI2RlZmluZSBBUl9XT1dfUEFUVEVSTl9FTih4KSAgICAgICAgICAgICh4ICYgMHhmZikKLSNkZWZpbmUgQVJfV09XX1BBVF9GT1VORF9TSElGVCAgOAorI2RlZmluZSBBUl9XT1dfUEFUX0ZPVU5EX1NISUZUICAgICAgICAgIDgKICNkZWZpbmUgQVJfV09XX1BBVFRFUk5fRk9VTkQoeCkgICAgICAgICAoeCAmICgweGZmIDw8IEFSX1dPV19QQVRfRk9VTkRfU0hJRlQpKQogI2RlZmluZSBBUl9XT1dfUEFUVEVSTl9GT1VORF9NQVNLICAgICAgICgoMHhmZikgPDwgQVJfV09XX1BBVF9GT1VORF9TSElGVCkKICNkZWZpbmUgQVJfV09XX01BR0lDX1BBVF9GT1VORCAgICAgICAgICAweDAwMDIwMDAwCkBAIC05MCw2ICs5MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUl9XT1dfQkVBQ09OX0ZBSUwgfAlcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSX1dPV19LRUVQX0FMSVZFX0ZBSUwpKQogCisjZGVmaW5lIEFSX1dPVzJfUEFUVEVSTl9FTih4KSAgICAgICAgICAgKCh4ICYgMHhmZikgPDwgMCkKKyNkZWZpbmUgQVJfV09XMl9QQVRURVJOX0ZPVU5EX1NISUZUICAgICA4CisjZGVmaW5lIEFSX1dPVzJfUEFUVEVSTl9GT1VORCh4KSAgICAgICAgKHggJiAoMHhmZiA8PCBBUl9XT1cyX1BBVFRFUk5fRk9VTkRfU0hJRlQpKQorI2RlZmluZSBBUl9XT1cyX1BBVFRFUk5fRk9VTkRfTUFTSyAgICAgICgoMHhmZikgPDwgQVJfV09XMl9QQVRURVJOX0ZPVU5EX1NISUZUKQorCisjZGVmaW5lIEFSX1dPV19TVEFUVVMyKHgpICAgICAgICAgICAgICAgKHggJiBBUl9XT1cyX1BBVFRFUk5fRk9VTkRfTUFTSykKKyNkZWZpbmUgQVJfV09XX0NMRUFSX0VWRU5UUzIoeCkgICAgICAgICAoeCAmIH4oQVJfV09XMl9QQVRURVJOX0VOKDB4ZmYpKSkKKwogI2RlZmluZSBBUl9XT1dfQUlGU19DTlQoeCkgICAgICAgICAgICAgICh4ICYgMHhmZikKICNkZWZpbmUgQVJfV09XX1NMT1RfQ05UKHgpICAgICAgICAgICAgICAoKHggJiAweGZmKSA8PCA4KQogI2RlZmluZSBBUl9XT1dfS0VFUF9BTElWRV9DTlQoeCkgICAgICAgICgoeCAmIDB4ZmYpIDw8IDE2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3dtaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3dtaS5jCmluZGV4IDY1Yzg4OTQuLmNhNTMzYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay93bWkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvd21pLmMKQEAgLTYxLDYgKzYxLDggQEAKIAkJcmV0dXJuICJXTUlfUkVHX1JFQURfQ01ESUQiOwogCWNhc2UgV01JX1JFR19XUklURV9DTURJRDoKIAkJcmV0dXJuICJXTUlfUkVHX1dSSVRFX0NNRElEIjsKKwljYXNlIFdNSV9SRUdfUk1XX0NNRElEOgorCQlyZXR1cm4gIldNSV9SRUdfUk1XX0NNRElEIjsKIAljYXNlIFdNSV9SQ19TVEFURV9DSEFOR0VfQ01ESUQ6CiAJCXJldHVybiAiV01JX1JDX1NUQVRFX0NIQU5HRV9DTURJRCI7CiAJY2FzZSBXTUlfUkNfUkFURV9VUERBVEVfQ01ESUQ6CkBAIC0xMDEsNiArMTAzLDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmd21pLT5ldmVudF9sb2NrKTsKIAltdXRleF9pbml0KCZ3bWktPm9wX211dGV4KTsKIAltdXRleF9pbml0KCZ3bWktPm11bHRpX3dyaXRlX211dGV4KTsKKwltdXRleF9pbml0KCZ3bWktPm11bHRpX3Jtd19tdXRleCk7CiAJaW5pdF9jb21wbGV0aW9uKCZ3bWktPmNtZF93YWl0KTsKIAlJTklUX0xJU1RfSEVBRCgmd21pLT5wZW5kaW5nX3R4X2V2ZW50cyk7CiAJdGFza2xldF9pbml0KCZ3bWktPndtaV9ldmVudF90YXNrbGV0LCBhdGg5a193bWlfZXZlbnRfdGFza2xldCwKQEAgLTIyNCw3ICsyMjcsNyBAQAogCiAJLyogQ2hlY2sgaWYgdGhlcmUgaGFzIGJlZW4gYSB0aW1lb3V0LiAqLwogCXNwaW5fbG9jaygmd21pLT53bWlfbG9jayk7Ci0JaWYgKGNtZF9pZCAhPSB3bWktPmxhc3RfY21kX2lkKSB7CisJaWYgKGJlMTZfdG9fY3B1KGhkci0+c2VxX25vKSAhPSB3bWktPmxhc3Rfc2VxX2lkKSB7CiAJCXNwaW5fdW5sb2NrKCZ3bWktPndtaV9sb2NrKTsKIAkJZ290byBmcmVlX3NrYjsKIAl9CkBAIC0yNzIsMTEgKzI3NSwxNiBAQAogCQkJICAgICAgIGVudW0gd21pX2NtZF9pZCBjbWQsIHUxNiBsZW4pCiB7CiAJc3RydWN0IHdtaV9jbWRfaGRyICpoZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWhkciA9IChzdHJ1Y3Qgd21pX2NtZF9oZHIgKikgc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHdtaV9jbWRfaGRyKSk7CiAJaGRyLT5jb21tYW5kX2lkID0gY3B1X3RvX2JlMTYoY21kKTsKIAloZHItPnNlcV9ubyA9IGNwdV90b19iZTE2KCsrd21pLT50eF9zZXFfaWQpOwogCisJc3Bpbl9sb2NrX2lycXNhdmUoJndtaS0+d21pX2xvY2ssIGZsYWdzKTsKKwl3bWktPmxhc3Rfc2VxX2lkID0gd21pLT50eF9zZXFfaWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd21pLT53bWlfbG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIGh0Y19zZW5kX2VwaWQod21pLT5odGMsIHNrYiwgd21pLT5jdHJsX2VwaWQpOwogfQogCkBAIC0yOTIsNyArMzAwLDYgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXU4ICpkYXRhOwogCWludCB0aW1lX2xlZnQsIHJldCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChhaC0+YWhfZmxhZ3MgJiBBSF9VTlBMVUdHRUQpCiAJCXJldHVybiAwOwpAQCAtMzIwLDEwICszMjcsNiBAQAogCXdtaS0+Y21kX3JzcF9idWYgPSByc3BfYnVmOwogCXdtaS0+Y21kX3JzcF9sZW4gPSByc3BfbGVuOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndtaS0+d21pX2xvY2ssIGZsYWdzKTsKLQl3bWktPmxhc3RfY21kX2lkID0gY21kX2lkOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndtaS0+d21pX2xvY2ssIGZsYWdzKTsKLQogCXJldCA9IGF0aDlrX3dtaV9jbWRfaXNzdWUod21pLCBza2IsIGNtZF9pZCwgY21kX2xlbik7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvd21pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvd21pLmgKaW5kZXggMGRiMzdmMi4uMzgwMTc1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3dtaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay93bWkuaApAQCAtMTEyLDYgKzExMiw3IEBACiAJV01JX1RYX1NUQVRTX0NNRElELAogCVdNSV9SWF9TVEFUU19DTURJRCwKIAlXTUlfQklUUkFURV9NQVNLX0NNRElELAorCVdNSV9SRUdfUk1XX0NNRElELAogfTsKIAogZW51bSB3bWlfZXZlbnRfaWQgewpAQCAtMTI1LDEyICsxMjYsMTkgQEAKIH07CiAKICNkZWZpbmUgTUFYX0NNRF9OVU1CRVIgNjIKKyNkZWZpbmUgTUFYX1JNV19DTURfTlVNQkVSIDE1CiAKIHN0cnVjdCByZWdpc3Rlcl93cml0ZSB7CiAJX19iZTMyIHJlZzsKIAlfX2JlMzIgdmFsOwogfTsKIAorc3RydWN0IHJlZ2lzdGVyX3JtdyB7CisJX19iZTMyIHJlZzsKKwlfX2JlMzIgc2V0OworCV9fYmUzMiBjbHI7Cit9IF9fcGFja2VkOworCiBzdHJ1Y3QgYXRoOWtfaHRjX3R4X2V2ZW50IHsKIAlpbnQgY291bnQ7CiAJc3RydWN0IF9fd21pX2V2ZW50X3R4c3RhdHVzIHR4czsKQEAgLTE0Myw3ICsxNTEsNyBAQAogCWVudW0gaHRjX2VuZHBvaW50X2lkIGN0cmxfZXBpZDsKIAlzdHJ1Y3QgbXV0ZXggb3BfbXV0ZXg7CiAJc3RydWN0IGNvbXBsZXRpb24gY21kX3dhaXQ7Ci0JZW51bSB3bWlfY21kX2lkIGxhc3RfY21kX2lkOworCXUxNiBsYXN0X3NlcV9pZDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHdtaV9ldmVudF9xdWV1ZTsKIAlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3Qgd21pX2V2ZW50X3Rhc2tsZXQ7CiAJdTE2IHR4X3NlcV9pZDsKQEAgLTE1NiwxMCArMTY0LDE4IEBACiAKIAlzcGlubG9ja190IHdtaV9sb2NrOwogCisJLyogbXVsdGkgd3JpdGUgc2VjdGlvbiAqLwogCWF0b21pY190IG13cml0ZV9jbnQ7CiAJc3RydWN0IHJlZ2lzdGVyX3dyaXRlIG11bHRpX3dyaXRlW01BWF9DTURfTlVNQkVSXTsKIAl1MzIgbXVsdGlfd3JpdGVfaWR4OwogCXN0cnVjdCBtdXRleCBtdWx0aV93cml0ZV9tdXRleDsKKworCS8qIG11bHRpIHJtdyBzZWN0aW9uICovCisJYXRvbWljX3QgbV9ybXdfY250OworCXN0cnVjdCByZWdpc3Rlcl9ybXcgbXVsdGlfcm13W01BWF9STVdfQ01EX05VTUJFUl07CisJdTMyIG11bHRpX3Jtd19pZHg7CisJc3RydWN0IG11dGV4IG11bHRpX3Jtd19tdXRleDsKKwogfTsKIAogc3RydWN0IHdtaSAqYXRoOWtfaW5pdF93bWkoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCmluZGV4IDFiOGU3NWMuLjBhY2QwNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwpAQCAtMTEwMywxNCArMTEwMywyOCBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGF0aF9mcmFtZV9pbmZvICpmaTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKIAogCWlmIChzYy0+dHg5OV9zdGF0ZSB8fCAhYWgtPnRwY19lbmFibGVkKQogCQlyZXR1cm4gTUFYX1JBVEVfUE9XRVI7CiAKIAlza2IgPSBiZi0+YmZfbXBkdTsKLQlmaSA9IGdldF9mcmFtZV9pbmZvKHNrYik7CiAJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwl2aWYgPSBpbmZvLT5jb250cm9sLnZpZjsKKworCWlmICghdmlmKSB7CisJCW1heF9wb3dlciA9IHNjLT5jdXJfY2hhbi0+Y3VyX3R4cG93ZXI7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh2aWYtPmJzc19jb25mLnR4cG93ZXJfdHlwZSAhPSBOTDgwMjExX1RYX1BPV0VSX0xJTUlURUQpIHsKKwkJbWF4X3Bvd2VyID0gbWluX3QodTgsIHNjLT5jdXJfY2hhbi0+Y3VyX3R4cG93ZXIsCisJCQkJICAyICogdmlmLT5ic3NfY29uZi50eHBvd2VyKTsKKwkJZ290byBvdXQ7CisJfQorCisJZmkgPSBnZXRfZnJhbWVfaW5mbyhza2IpOwogCiAJaWYgKCFBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7CiAJCWludCB0eHBvd2VyID0gZmktPnR4X3Bvd2VyOwpAQCAtMTE0NywyNSArMTE2MSwyNSBAQAogCQkJdHhwb3dlciAtPSAyOwogCiAJCXR4cG93ZXIgPSBtYXgodHhwb3dlciwgMCk7Ci0JCW1heF9wb3dlciA9IG1pbl90KHU4LCBhaC0+dHhfcG93ZXJbcmF0ZWlkeF0sIHR4cG93ZXIpOwotCi0JCS8qIFhYWDogY2xhbXAgbWluaW11bSBUWCBwb3dlciBhdCAxIGZvciBBUjkxNjAgc2luY2UgaWYKLQkJICogbWF4X3Bvd2VyIGlzIHNldCB0byAwLCBmcmFtZXMgYXJlIHRyYW5zbWl0dGVkIGF0IG1heAotCQkgKiBUWCBwb3dlcgotCQkgKi8KLQkJaWYgKCFtYXhfcG93ZXIgJiYgIUFSX1NSRVZfOTI4MF8yMF9PUl9MQVRFUihhaCkpCi0JCQltYXhfcG93ZXIgPSAxOworCQltYXhfcG93ZXIgPSBtaW5fdCh1OCwgYWgtPnR4X3Bvd2VyW3JhdGVpZHhdLAorCQkJCSAgMiAqIHZpZi0+YnNzX2NvbmYudHhwb3dlcik7CisJCW1heF9wb3dlciA9IG1pbl90KHU4LCBtYXhfcG93ZXIsIHR4cG93ZXIpOwogCX0gZWxzZSBpZiAoIWJmLT5iZl9zdGF0ZS5iZnNfcGFwcmQpIHsKIAkJaWYgKHJhdGVpZHggPCA4ICYmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfU1RCQykpCi0JCQltYXhfcG93ZXIgPSBtaW4oYWgtPnR4X3Bvd2VyX3N0YmNbcmF0ZWlkeF0sCi0JCQkJCWZpLT50eF9wb3dlcik7CisJCQltYXhfcG93ZXIgPSBtaW5fdCh1OCwgYWgtPnR4X3Bvd2VyX3N0YmNbcmF0ZWlkeF0sCisJCQkJCSAgMiAqIHZpZi0+YnNzX2NvbmYudHhwb3dlcik7CiAJCWVsc2UKLQkJCW1heF9wb3dlciA9IG1pbihhaC0+dHhfcG93ZXJbcmF0ZWlkeF0sIGZpLT50eF9wb3dlcik7CisJCQltYXhfcG93ZXIgPSBtaW5fdCh1OCwgYWgtPnR4X3Bvd2VyW3JhdGVpZHhdLAorCQkJCQkgIDIgKiB2aWYtPmJzc19jb25mLnR4cG93ZXIpOworCQltYXhfcG93ZXIgPSBtaW4obWF4X3Bvd2VyLCBmaS0+dHhfcG93ZXIpOwogCX0gZWxzZSB7CiAJCW1heF9wb3dlciA9IGFoLT5wYXByZF90cmFpbmluZ19wb3dlcjsKIAl9Ci0KLQlyZXR1cm4gbWF4X3Bvd2VyOworb3V0OgorCS8qIFhYWDogY2xhbXAgbWluaW11bSBUWCBwb3dlciBhdCAxIGZvciBBUjkxNjAgc2luY2UgaWYgbWF4X3Bvd2VyCisJICogaXMgc2V0IHRvIDAsIGZyYW1lcyBhcmUgdHJhbnNtaXR0ZWQgYXQgbWF4IFRYIHBvd2VyCisJICovCisJcmV0dXJuICghbWF4X3Bvd2VyICYmICFBUl9TUkVWXzkyODBfMjBfT1JfTEFURVIoYWgpKSA/IDEgOiBtYXhfcG93ZXI7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aF9idWZfc2V0X3JhdGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfYnVmICpiZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9kZnNfcGF0dGVybl9kZXRlY3Rvci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Rmc19wYXR0ZXJuX2RldGVjdG9yLmMKaW5kZXggM2Q1N2Y4Ny4uYzY1N2NhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Rmc19wYXR0ZXJuX2RldGVjdG9yLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Rmc19wYXR0ZXJuX2RldGVjdG9yLmMKQEAgLTI4OSw3ICsyODksNyBAQAogCQkJCSJjb3VudD0lZCwgY291bnRfZmFsc2U9JWRcbiIsCiAJCQkJZXZlbnQtPmZyZXEsIHBkLT5ycy0+dHlwZV9pZCwKIAkJCQlwcy0+cHJpLCBwcy0+Y291bnQsIHBzLT5jb3VudF9mYWxzZXMpOwotCQkJY2hhbm5lbF9kZXRlY3Rvcl9yZXNldChkcGQsIGNkKTsKKwkJCXBkLT5yZXNldChwZCwgZHBkLT5sYXN0X3B1bHNlX3RzKTsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3djbjM2eHgvc21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2NuMzZ4eC9zbWQuYwppbmRleCA2OWVkMzk3Li5kYmQ4OTQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2NuMzZ4eC9zbWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2NuMzZ4eC9zbWQuYwpAQCAtMTcwMSw3ICsxNzAxLDcgQEAKIAl9IGVsc2UgaWYgKHBhY2tldF90eXBlID09IFdDTjM2WFhfSEFMX0tFRVBfQUxJVkVfVU5TT0xJQ0lUX0FSUF9SU1ApIHsKIAkJLyogVE9ETzogaXQgYWxzbyBzdXBwb3J0IEFSUCByZXNwb25zZSB0eXBlICovCiAJfSBlbHNlIHsKLQkJd2NuMzZ4eF93YXJuKCJ1bmtub3cga2VlcCBhbGl2ZSBwYWNrZXQgdHlwZSAlZFxuIiwgcGFja2V0X3R5cGUpOworCQl3Y24zNnh4X3dhcm4oInVua25vd24ga2VlcCBhbGl2ZSBwYWNrZXQgdHlwZSAlZFxuIiwgcGFja2V0X3R5cGUpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvY2ZnODAyMTEuYwppbmRleCAyZDVlYTIxLi5iOTcxNzI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2NmZzgwMjExLmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSAid2lsNjIxMC5oIgogI2luY2x1ZGUgIndtaS5oIgogCkBAIC0yMTcsNyArMjE4LDcgQEAKIAlpZiAoY2lkIDwgMCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQltZW1jcHkobWFjLCB3aWwtPnN0YVtjaWRdLmFkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkobWFjLCB3aWwtPnN0YVtjaWRdLmFkZHIpOwogCXdpbF9kYmdfbWlzYyh3aWwsICIlcyglcE0pIENJRCAlZFxuIiwgX19mdW5jX18sIG1hYywgY2lkKTsKIAogCXJjID0gd2lsX2NpZF9maWxsX3NpbmZvKHdpbCwgY2lkLCBzaW5mbyk7CkBAIC0zODcsMTUgKzM4OCwyOSBAQAogCWludCBjaDsKIAlpbnQgcmMgPSAwOwogCisJd2lsX3ByaW50X2Nvbm5lY3RfcGFyYW1zKHdpbCwgc21lKTsKKwogCWlmICh0ZXN0X2JpdCh3aWxfc3RhdHVzX2Z3Y29ubmVjdGluZywgd2lsLT5zdGF0dXMpIHx8CiAJICAgIHRlc3RfYml0KHdpbF9zdGF0dXNfZndjb25uZWN0ZWQsIHdpbC0+c3RhdHVzKSkKIAkJcmV0dXJuIC1FQUxSRUFEWTsKIAotCXdpbF9wcmludF9jb25uZWN0X3BhcmFtcyh3aWwsIHNtZSk7CisJaWYgKHNtZS0+aWVfbGVuID4gV01JX01BWF9JRV9MRU4pIHsKKwkJd2lsX2Vycih3aWwsICJJRSB0b28gbGFyZ2UgKCV0ZCBieXRlcylcbiIsIHNtZS0+aWVfbGVuKTsKKwkJcmV0dXJuIC1FUkFOR0U7CisJfQorCisJcnNuX2VpZCA9IHNtZS0+aWUgPworCQkJY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9SU04sIHNtZS0+aWUsIHNtZS0+aWVfbGVuKSA6CisJCQlOVUxMOworCisJaWYgKHNtZS0+cHJpdmFjeSAmJiAhcnNuX2VpZCkgeworCQl3aWxfZXJyKHdpbCwgIk1pc3NpbmcgUlNOIElFIGZvciBzZWN1cmUgY29ubmVjdGlvblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCWJzcyA9IGNmZzgwMjExX2dldF9ic3Mod2lwaHksIHNtZS0+Y2hhbm5lbCwgc21lLT5ic3NpZCwKIAkJCSAgICAgICBzbWUtPnNzaWQsIHNtZS0+c3NpZF9sZW4sCi0JCQkgICAgICAgV0xBTl9DQVBBQklMSVRZX0VTUywgV0xBTl9DQVBBQklMSVRZX0VTUyk7CisJCQkgICAgICAgSUVFRTgwMjExX0JTU19UWVBFX0VTUywgSUVFRTgwMjExX1BSSVZBQ1lfQU5ZKTsKIAlpZiAoIWJzcykgewogCQl3aWxfZXJyKHdpbCwgIlVuYWJsZSB0byBmaW5kIEJTU1xuIik7CiAJCXJldHVybiAtRU5PRU5UOwpAQCAtNDA3LDE3ICs0MjIsOSBAQAogCQlyYyA9IC1FTk9FTlQ7CiAJCWdvdG8gb3V0OwogCX0KKwl3aWwtPnByaXZhY3kgPSBzbWUtPnByaXZhY3k7CiAKLQlyc25fZWlkID0gc21lLT5pZSA/Ci0JCQljZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1JTTiwgc21lLT5pZSwgc21lLT5pZV9sZW4pIDoKLQkJCU5VTEw7Ci0JaWYgKHJzbl9laWQpIHsKLQkJaWYgKHNtZS0+aWVfbGVuID4gV01JX01BWF9JRV9MRU4pIHsKLQkJCXJjID0gLUVSQU5HRTsKLQkJCXdpbF9lcnIod2lsLCAiSUUgdG9vIGxhcmdlICgldGQgYnl0ZXMpXG4iLAotCQkJCXNtZS0+aWVfbGVuKTsKLQkJCWdvdG8gb3V0OwotCQl9CisJaWYgKHdpbC0+cHJpdmFjeSkgewogCQkvKiBGb3Igc2VjdXJlIGFzc29jLCBzZW5kIFdNSV9ERUxFVEVfQ0lQSEVSX0tFWV9DTUQgKi8KIAkJcmMgPSB3bWlfZGVsX2NpcGhlcl9rZXkod2lsLCAwLCBic3MtPmJzc2lkKTsKIAkJaWYgKHJjKSB7CkBAIC00NTAsNyArNDU3LDcgQEAKIAkJCWJzcy0+Y2FwYWJpbGl0eSk7CiAJCWdvdG8gb3V0OwogCX0KLQlpZiAocnNuX2VpZCkgeworCWlmICh3aWwtPnByaXZhY3kpIHsKIAkJY29ubi5kb3QxMV9hdXRoX21vZGUgPSBXTUlfQVVUSDExX1NIQVJFRDsKIAkJY29ubi5hdXRoX21vZGUgPSBXTUlfQVVUSF9XUEEyX1BTSzsKIAkJY29ubi5wYWlyd2lzZV9jcnlwdG9fdHlwZSA9IFdNSV9DUllQVF9BRVNfR0NNUDsKQEAgLTQ3Miw4ICs0NzksOCBAQAogCX0KIAljb25uLmNoYW5uZWwgPSBjaCAtIDE7CiAKLQltZW1jcHkoY29ubi5ic3NpZCwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweShjb25uLmRzdF9tYWMsIGJzcy0+YnNzaWQsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoY29ubi5ic3NpZCwgYnNzLT5ic3NpZCk7CisJZXRoZXJfYWRkcl9jb3B5KGNvbm4uZHN0X21hYywgYnNzLT5ic3NpZCk7CiAKIAlzZXRfYml0KHdpbF9zdGF0dXNfZndjb25uZWN0aW5nLCB3aWwtPnN0YXR1cyk7CiAKQEAgLTc2OSwxNSArNzc2LDI0IEBACiAJd21pX3NldF9pZSh3aWwsIFdNSV9GUkFNRV9BU1NPQ19SRVNQLCBiY29uLT5hc3NvY3Jlc3BfaWVzX2xlbiwKIAkJICAgYmNvbi0+YXNzb2NyZXNwX2llcyk7CiAKLQl3aWwtPnNlY3VyZV9wY3AgPSBpbmZvLT5wcml2YWN5OworCXdpbC0+cHJpdmFjeSA9IGluZm8tPnByaXZhY3k7CiAKIAluZXRpZl9jYXJyaWVyX29uKG5kZXYpOwogCiAJcmMgPSB3bWlfcGNwX3N0YXJ0KHdpbCwgaW5mby0+YmVhY29uX2ludGVydmFsLCB3bWlfbmV0dHlwZSwKIAkJCSAgIGNoYW5uZWwtPmh3X3ZhbHVlKTsKIAlpZiAocmMpCi0JCW5ldGlmX2NhcnJpZXJfb2ZmKG5kZXYpOworCQlnb3RvIGVycl9wY3Bfc3RhcnQ7CiAKKwlyYyA9IHdpbF9iY2FzdF9pbml0KHdpbCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9iY2FzdDsKKworCWdvdG8gb3V0OyAvKiBzdWNjZXNzICovCitlcnJfYmNhc3Q6CisJd21pX3BjcF9zdG9wKHdpbCk7CitlcnJfcGNwX3N0YXJ0OgorCW5ldGlmX2NhcnJpZXJfb2ZmKG5kZXYpOwogb3V0OgogCW11dGV4X3VubG9jaygmd2lsLT5tdXRleCk7CiAJcmV0dXJuIHJjOwpAQCAtOTExLDYgKzkyNywyMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHdpbF9jZmc4MDIxMV9jaGFuZ2VfYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgYnNzX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSB3aXBoeV90b193aWwod2lwaHkpOworCisJaWYgKHBhcmFtcy0+YXBfaXNvbGF0ZSA+PSAwKSB7CisJCXdpbF9kYmdfbWlzYyh3aWwsICIlcyhhcF9pc29sYXRlICVkID0+ICVkKVxuIiwgX19mdW5jX18sCisJCQkgICAgIHdpbC0+YXBfaXNvbGF0ZSwgcGFyYW1zLT5hcF9pc29sYXRlKTsKKwkJd2lsLT5hcF9pc29sYXRlID0gcGFyYW1zLT5hcF9pc29sYXRlOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGNmZzgwMjExX29wcyB3aWxfY2ZnODAyMTFfb3BzID0gewogCS5zY2FuID0gd2lsX2NmZzgwMjExX3NjYW4sCiAJLmNvbm5lY3QgPSB3aWxfY2ZnODAyMTFfY29ubmVjdCwKQEAgLTkzMSw2ICs5NjIsNyBAQAogCS5zdG9wX2FwID0gd2lsX2NmZzgwMjExX3N0b3BfYXAsCiAJLmRlbF9zdGF0aW9uID0gd2lsX2NmZzgwMjExX2RlbF9zdGF0aW9uLAogCS5wcm9iZV9jbGllbnQgPSB3aWxfY2ZnODAyMTFfcHJvYmVfY2xpZW50LAorCS5jaGFuZ2VfYnNzID0gd2lsX2NmZzgwMjExX2NoYW5nZV9ic3MsCiB9OwogCiBzdGF0aWMgdm9pZCB3aWxfd2lwaHlfaW5pdChzdHJ1Y3Qgd2lwaHkgKndpcGh5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZGVidWdmcy5jCmluZGV4IDQ1YzM1NThlLi5iYmMyMmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZGVidWdmcy5jCkBAIC0yOSw2ICsyOSw3IEBACiBzdGF0aWMgdTMyIG1lbV9hZGRyOwogc3RhdGljIHUzMiBkYmdfdHhkZXNjX2luZGV4Owogc3RhdGljIHUzMiBkYmdfdnJpbmdfaW5kZXg7IC8qIDI0KyBmb3IgUngsIDAuLjIzIGZvciBUeCAqLwordTMyIHZyaW5nX2lkbGVfdHJzaCA9IDE2OyAvKiBIVyBmZXRjaGVzIHVwIHRvIDE2IGRlc2NyaXB0b3JzIGF0IG9uY2UgKi8KIAogZW51bSBkYmdfb2ZmX3R5cGUgewogCWRvZmZfdTMyID0gMCwKQEAgLTEwMiwyMyArMTAzLDM2IEBACiAJCQkJICAgJSB2cmluZy0+c2l6ZTsKIAkJCWludCBhdmFpbCA9IHZyaW5nLT5zaXplIC0gdXNlZCAtIDE7CiAJCQljaGFyIG5hbWVbMTBdOworCQkJY2hhciBzaWRsZVsxMF07CiAJCQkvKiBwZXJmb3JtYW5jZSBtb25pdG9yaW5nICovCiAJCQljeWNsZXNfdCBub3cgPSBnZXRfY3ljbGVzKCk7CiAJCQl1aW50NjRfdCBpZGxlID0gdHhkYXRhLT5pZGxlICogMTAwOwogCQkJdWludDY0X3QgdG90YWwgPSBub3cgLSB0eGRhdGEtPmJlZ2luOwogCi0JCQlkb19kaXYoaWRsZSwgdG90YWwpOworCQkJaWYgKHRvdGFsICE9IDApIHsKKwkJCQlkb19kaXYoaWRsZSwgdG90YWwpOworCQkJCXNucHJpbnRmKHNpZGxlLCBzaXplb2Yoc2lkbGUpLCAiJTNkJSUiLAorCQkJCQkgKGludClpZGxlKTsKKwkJCX0gZWxzZSB7CisJCQkJc25wcmludGYoc2lkbGUsIHNpemVvZihzaWRsZSksICJOL0EiKTsKKwkJCX0KIAkJCXR4ZGF0YS0+YmVnaW4gPSBub3c7CiAJCQl0eGRhdGEtPmlkbGUgPSAwVUxMOwogCiAJCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJ0eF8lMmQiLCBpKTsKIAotCQkJc2VxX3ByaW50ZihzLAotCQkJCSAgICJcbiVwTSBDSUQgJWQgVElEICVkIEJBQ0soWyVkXSAlZCBUVSBBJXMpIFslM2R8JTNkXSBpZGxlICUzZCUlXG4iLAotCQkJCSAgIHdpbC0+c3RhW2NpZF0uYWRkciwgY2lkLCB0aWQsCi0JCQkJICAgdHhkYXRhLT5hZ2dfd3NpemUsIHR4ZGF0YS0+YWdnX3RpbWVvdXQsCi0JCQkJICAgdHhkYXRhLT5hZ2dfYW1zZHUgPyAiKyIgOiAiLSIsCi0JCQkJICAgdXNlZCwgYXZhaWwsIChpbnQpaWRsZSk7CisJCQlpZiAoY2lkIDwgV0lMNjIxMF9NQVhfQ0lEKQorCQkJCXNlcV9wcmludGYocywKKwkJCQkJICAgIlxuJXBNIENJRCAlZCBUSUQgJWQgQkFDSyhbJXVdICV1IFRVIEElcykgWyUzZHwlM2RdIGlkbGUgJXNcbiIsCisJCQkJCSAgIHdpbC0+c3RhW2NpZF0uYWRkciwgY2lkLCB0aWQsCisJCQkJCSAgIHR4ZGF0YS0+YWdnX3dzaXplLAorCQkJCQkgICB0eGRhdGEtPmFnZ190aW1lb3V0LAorCQkJCQkgICB0eGRhdGEtPmFnZ19hbXNkdSA/ICIrIiA6ICItIiwKKwkJCQkJICAgdXNlZCwgYXZhaWwsIHNpZGxlKTsKKwkJCWVsc2UKKwkJCQlzZXFfcHJpbnRmKHMsCisJCQkJCSAgICJcbkJyb2FkY2FzdCBbJTNkfCUzZF0gaWRsZSAlc1xuIiwKKwkJCQkJICAgdXNlZCwgYXZhaWwsIHNpZGxlKTsKIAogCQkJd2lsX3ByaW50X3ZyaW5nKHMsIHdpbCwgbmFtZSwgdnJpbmcsICdfJywgJ0gnKTsKIAkJfQpAQCAtNTQ5LDcgKzU2Myw3IEBACiAJZGV2X2Nsb3NlKG5kZXYpOwogCW5kZXYtPmZsYWdzICY9IH5JRkZfVVA7CiAJcnRubF91bmxvY2soKTsKLQl3aWxfcmVzZXQod2lsKTsKKwl3aWxfcmVzZXQod2lsLCB0cnVlKTsKIAogCXJldHVybiBsZW47CiB9CkBAIC02MTgsNyArNjMyLDcgQEAKIAlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IHJjOwogCWNoYXIgKmtidWYgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOwotCWNoYXIgY21kWzhdOworCWNoYXIgY21kWzldOwogCWludCBwMSwgcDIsIHAzOwogCiAJaWYgKCFrYnVmKQpAQCAtMTM5MiwxMSArMTQwNiwxMiBAQAogCiAvKiBmaWVsZHMgaW4gc3RydWN0IHdpbDYyMTBfcHJpdiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBkYmdfb2ZmIGRiZ193aWxfb2ZmW10gPSB7Ci0JV0lMX0ZJRUxEKHNlY3VyZV9wY3AsCVNfSVJVR08gfCBTX0lXVVNSLAlkb2ZmX3UzMiksCisJV0lMX0ZJRUxEKHByaXZhY3ksCVNfSVJVR08sCQlkb2ZmX3UzMiksCiAJV0lMX0ZJRUxEKHN0YXR1c1swXSwJU19JUlVHTyB8IFNfSVdVU1IsCWRvZmZfdWxvbmcpLAogCVdJTF9GSUVMRChmd192ZXJzaW9uLAlTX0lSVUdPLAkJZG9mZl91MzIpLAogCVdJTF9GSUVMRChod192ZXJzaW9uLAlTX0lSVUdPLAkJZG9mZl94MzIpLAogCVdJTF9GSUVMRChyZWNvdmVyeV9jb3VudCwgU19JUlVHTywJCWRvZmZfdTMyKSwKKwlXSUxfRklFTEQoYXBfaXNvbGF0ZSwJU19JUlVHTywJCWRvZmZfdTMyKSwKIAl7fSwKIH07CiAKQEAgLTE0MTIsNiArMTQyNyw4IEBACiAJeyJkZXNjX2luZGV4IiwJU19JUlVHTyB8IFNfSVdVU1IsICh1bG9uZykmZGJnX3R4ZGVzY19pbmRleCwgZG9mZl91MzJ9LAogCXsidnJpbmdfaW5kZXgiLAlTX0lSVUdPIHwgU19JV1VTUiwgKHVsb25nKSZkYmdfdnJpbmdfaW5kZXgsIGRvZmZfdTMyfSwKIAl7Im1lbV9hZGRyIiwJU19JUlVHTyB8IFNfSVdVU1IsICh1bG9uZykmbWVtX2FkZHIsIGRvZmZfdTMyfSwKKwl7InZyaW5nX2lkbGVfdHJzaCIsIFNfSVJVR08gfCBTX0lXVVNSLCAodWxvbmcpJnZyaW5nX2lkbGVfdHJzaCwKKwkgZG9mZl91MzJ9LAogCXt9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZXRodG9vbC5jCmluZGV4IDRjNDRhODIuLjBlYTY5NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9ldGh0b29sLmMKQEAgLTUwLDI3ICs1MCwxOSBAQAogCiAJd2lsX2RiZ19taXNjKHdpbCwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAotCWlmICh0ZXN0X2JpdChod19jYXBhYmlsaXR5X2FkdmFuY2VkX2l0cl9tb2RlcmF0aW9uLAotCQkgICAgIHdpbC0+aHdfY2FwYWJpbGl0aWVzKSkgewotCQl0eF9pdHJfZW4gPSBpb3JlYWQzMih3aWwtPmNzciArCi0JCQkJICAgICBIT1NUQUREUihSR0ZfRE1BX0lUUl9UWF9DTlRfQ1RMKSk7Ci0JCWlmICh0eF9pdHJfZW4gJiBCSVRfRE1BX0lUUl9UWF9DTlRfQ1RMX0VOKQotCQkJdHhfaXRyX3ZhbCA9Ci0JCQkJaW9yZWFkMzIod2lsLT5jc3IgKwotCQkJCQkgSE9TVEFERFIoUkdGX0RNQV9JVFJfVFhfQ05UX1RSU0gpKTsKKwl0eF9pdHJfZW4gPSBpb3JlYWQzMih3aWwtPmNzciArCisJCQkgICAgIEhPU1RBRERSKFJHRl9ETUFfSVRSX1RYX0NOVF9DVEwpKTsKKwlpZiAodHhfaXRyX2VuICYgQklUX0RNQV9JVFJfVFhfQ05UX0NUTF9FTikKKwkJdHhfaXRyX3ZhbCA9CisJCQlpb3JlYWQzMih3aWwtPmNzciArCisJCQkJIEhPU1RBRERSKFJHRl9ETUFfSVRSX1RYX0NOVF9UUlNIKSk7CiAKLQkJcnhfaXRyX2VuID0gaW9yZWFkMzIod2lsLT5jc3IgKwotCQkJCSAgICAgSE9TVEFERFIoUkdGX0RNQV9JVFJfUlhfQ05UX0NUTCkpOwotCQlpZiAocnhfaXRyX2VuICYgQklUX0RNQV9JVFJfUlhfQ05UX0NUTF9FTikKLQkJCXJ4X2l0cl92YWwgPQotCQkJCWlvcmVhZDMyKHdpbC0+Y3NyICsKLQkJCQkJIEhPU1RBRERSKFJHRl9ETUFfSVRSX1JYX0NOVF9UUlNIKSk7Ci0JfSBlbHNlIHsKLQkJcnhfaXRyX2VuID0gaW9yZWFkMzIod2lsLT5jc3IgKyBIT1NUQUREUihSR0ZfRE1BX0lUUl9DTlRfQ1JMKSk7Ci0JCWlmIChyeF9pdHJfZW4gJiBCSVRfRE1BX0lUUl9DTlRfQ1JMX0VOKQotCQkJcnhfaXRyX3ZhbCA9IGlvcmVhZDMyKHdpbC0+Y3NyICsKLQkJCQkJICAgICAgSE9TVEFERFIoUkdGX0RNQV9JVFJfQ05UX1RSU0gpKTsKLQl9CisJcnhfaXRyX2VuID0gaW9yZWFkMzIod2lsLT5jc3IgKworCQkJICAgICBIT1NUQUREUihSR0ZfRE1BX0lUUl9SWF9DTlRfQ1RMKSk7CisJaWYgKHJ4X2l0cl9lbiAmIEJJVF9ETUFfSVRSX1JYX0NOVF9DVExfRU4pCisJCXJ4X2l0cl92YWwgPQorCQkJaW9yZWFkMzIod2lsLT5jc3IgKworCQkJCSBIT1NUQUREUihSR0ZfRE1BX0lUUl9SWF9DTlRfVFJTSCkpOwogCiAJY3AtPnR4X2NvYWxlc2NlX3VzZWNzID0gdHhfaXRyX3ZhbDsKIAljcC0+cnhfY29hbGVzY2VfdXNlY3MgPSByeF9pdHJfdmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2Z3LmMKaW5kZXggOTNjNWNjMS4uNDQyODM0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZncuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9mdy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNCBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiAgKgogICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSAiZncuaCIKIAogTU9EVUxFX0ZJUk1XQVJFKFdJTF9GV19OQU1FKTsKK01PRFVMRV9GSVJNV0FSRShXSUxfRlcyX05BTUUpOwogCiAvKiB0YXJnZXQgb3BlcmF0aW9ucyAqLwogLyogcmVnaXN0ZXIgcmVhZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvZndfaW5jLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9md19pbmMuYwppbmRleCBkNGFjZjkzLi4xNTdmNWVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9md19pbmMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9md19pbmMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgUXVhbGNvbW0gQXRoZXJvcywgSW5jLgogICoKICAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQpAQCAtNDUxLDggKzQ1MSw2IEBACiAJCX0KIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCS8qIE1hcmsgRlcgYXMgbG9hZGVkIGZyb20gaG9zdCAqLwotCVMoUkdGX1VTRVJfVVNBR0VfNiwgMSk7CiAKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9pbnRlcnJ1cHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2ludGVycnVwdC5jCmluZGV4IGE2ZjkyMzAuLjI4ZmZjMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2ludGVycnVwdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL2ludGVycnVwdC5jCkBAIC0xNjYsOSArMTY2LDE2IEBACiAvKiB0YXJnZXQgd3JpdGUgb3BlcmF0aW9uICovCiAjZGVmaW5lIFcoYSwgdikgZG8geyBpb3dyaXRlMzIodiwgd2lsLT5jc3IgKyBIT1NUQUREUihhKSk7IHdtYigpOyB9IHdoaWxlICgwKQogCi1zdGF0aWMKLXZvaWQgd2lsX2NvbmZpZ3VyZV9pbnRlcnJ1cHRfbW9kZXJhdGlvbl9uZXcoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQordm9pZCB3aWxfY29uZmlndXJlX2ludGVycnVwdF9tb2RlcmF0aW9uKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKKwl3aWxfZGJnX2lycSh3aWwsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdCBtb2RlcmF0aW9uIGZvciBtb25pdG9yCisJICogdG8gZ2V0IGJldHRlciB0aW1lc3RhbXAgcHJlY2lzaW9uCisJICovCisJaWYgKHdpbC0+d2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpCisJCXJldHVybjsKKwogCS8qIERpc2FibGUgYW5kIGNsZWFyIHR4IGNvdW50ZXIgYmVmb3JlIChyZSljb25maWd1cmF0aW9uICovCiAJVyhSR0ZfRE1BX0lUUl9UWF9DTlRfQ1RMLCBCSVRfRE1BX0lUUl9UWF9DTlRfQ1RMX0NMUik7CiAJVyhSR0ZfRE1BX0lUUl9UWF9DTlRfVFJTSCwgd2lsLT50eF9tYXhfYnVyc3RfZHVyYXRpb24pOwpAQCAtMjA2LDQyICsyMTMsOCBAQAogCQkJCSAgICAgIEJJVF9ETUFfSVRSX1JYX0lETF9DTlRfQ1RMX0VYVF9USUNfU0VMKTsKIH0KIAotc3RhdGljCi12b2lkIHdpbF9jb25maWd1cmVfaW50ZXJydXB0X21vZGVyYXRpb25fbGdjKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKLXsKLQkvKiBkaXNhYmxlLCB1c2UgdXNlYyByZXNvbHV0aW9uICovCi0JVyhSR0ZfRE1BX0lUUl9DTlRfQ1JMLCBCSVRfRE1BX0lUUl9DTlRfQ1JMX0NMUik7Ci0KLQl3aWxfaW5mbyh3aWwsICJzZXQgSVRSX1RSU0ggPSAlZCB1c2VjXG4iLCB3aWwtPnJ4X21heF9idXJzdF9kdXJhdGlvbik7Ci0JVyhSR0ZfRE1BX0lUUl9DTlRfVFJTSCwgd2lsLT5yeF9tYXhfYnVyc3RfZHVyYXRpb24pOwotCS8qIHN0YXJ0IGl0ICovCi0JVyhSR0ZfRE1BX0lUUl9DTlRfQ1JMLAotCSAgQklUX0RNQV9JVFJfQ05UX0NSTF9FTiB8IEJJVF9ETUFfSVRSX0NOVF9DUkxfRVhUX1RJQ0spOwotfQotCiAjdW5kZWYgVwogCi12b2lkIHdpbF9jb25maWd1cmVfaW50ZXJydXB0X21vZGVyYXRpb24oc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQotewotCXdpbF9kYmdfaXJxKHdpbCwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0IG1vZGVyYXRpb24gZm9yIG1vbml0b3IKLQkgKiB0byBnZXQgYmV0dGVyIHRpbWVzdGFtcCBwcmVjaXNpb24KLQkgKi8KLQlpZiAod2lsLT53ZGV2LT5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikKLQkJcmV0dXJuOwotCi0JaWYgKHRlc3RfYml0KGh3X2NhcGFiaWxpdHlfYWR2YW5jZWRfaXRyX21vZGVyYXRpb24sCi0JCSAgICAgd2lsLT5od19jYXBhYmlsaXRpZXMpKQotCQl3aWxfY29uZmlndXJlX2ludGVycnVwdF9tb2RlcmF0aW9uX25ldyh3aWwpOwotCWVsc2UgewotCQkvKiBBZHZhbmNlZCBpbnRlcnJ1cHQgbW9kZXJhdGlvbiBpcyBub3QgYXZhaWxhYmxlIGJlZm9yZQotCQkgKiBTcGFycm93IHYyLiBXaWxsIHVzZSBsZWdhY3kgaW50ZXJydXB0IG1vZGVyYXRpb24KLQkJICovCi0JCXdpbF9jb25maWd1cmVfaW50ZXJydXB0X21vZGVyYXRpb25fbGdjKHdpbCk7Ci0JfQotfQotCiBzdGF0aWMgaXJxcmV0dXJuX3Qgd2lsNjIxMF9pcnFfcngoaW50IGlycSwgdm9pZCAqY29va2llKQogewogCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IGNvb2tpZTsKQEAgLTI1Myw3ICsyMjYsNyBAQAogCXRyYWNlX3dpbDYyMTBfaXJxX3J4KGlzcik7CiAJd2lsX2RiZ19pcnEod2lsLCAiSVNSIFJYIDB4JTA4eFxuIiwgaXNyKTsKIAotCWlmICghaXNyKSB7CisJaWYgKHVubGlrZWx5KCFpc3IpKSB7CiAJCXdpbF9lcnIod2lsLCAic3B1cmlvdXMgSVJROiBSWFxuIik7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CkBAIC0yNjYsMTcgKzIzOSwxOCBAQAogCSAqIGFjdGlvbiBpcyBhbHdheXMgdGhlIHNhbWUgLSBzaG91bGQgZW1wdHkgdGhlIGFjY3VtdWxhdGVkCiAJICogcGFja2V0cyBmcm9tIHRoZSBSWCByaW5nLgogCSAqLwotCWlmIChpc3IgJiAoQklUX0RNQV9FUF9SWF9JQ1JfUlhfRE9ORSB8IEJJVF9ETUFfRVBfUlhfSUNSX1JYX0hUUlNIKSkgeworCWlmIChsaWtlbHkoaXNyICYgKEJJVF9ETUFfRVBfUlhfSUNSX1JYX0RPTkUgfAorCQkJICBCSVRfRE1BX0VQX1JYX0lDUl9SWF9IVFJTSCkpKSB7CiAJCXdpbF9kYmdfaXJxKHdpbCwgIlJYIGRvbmVcbiIpOwogCi0JCWlmIChpc3IgJiBCSVRfRE1BX0VQX1JYX0lDUl9SWF9IVFJTSCkKKwkJaWYgKHVubGlrZWx5KGlzciAmIEJJVF9ETUFfRVBfUlhfSUNSX1JYX0hUUlNIKSkKIAkJCXdpbF9lcnJfcmF0ZWxpbWl0ZWQod2lsLAogCQkJCQkgICAgIlJlY2VpdmVkIFwiUnggYnVmZmVyIGlzIGluIHJpc2sgb2Ygb3ZlcmZsb3dcIiBpbnRlcnJ1cHRcbiIpOwogCiAJCWlzciAmPSB+KEJJVF9ETUFfRVBfUlhfSUNSX1JYX0RPTkUgfAogCQkJIEJJVF9ETUFfRVBfUlhfSUNSX1JYX0hUUlNIKTsKLQkJaWYgKHRlc3RfYml0KHdpbF9zdGF0dXNfcmVzZXRfZG9uZSwgd2lsLT5zdGF0dXMpKSB7Ci0JCQlpZiAodGVzdF9iaXQod2lsX3N0YXR1c19uYXBpX2VuLCB3aWwtPnN0YXR1cykpIHsKKwkJaWYgKGxpa2VseSh0ZXN0X2JpdCh3aWxfc3RhdHVzX3Jlc2V0X2RvbmUsIHdpbC0+c3RhdHVzKSkpIHsKKwkJCWlmIChsaWtlbHkodGVzdF9iaXQod2lsX3N0YXR1c19uYXBpX2VuLCB3aWwtPnN0YXR1cykpKSB7CiAJCQkJd2lsX2RiZ190eHJ4KHdpbCwgIk5BUEkoUngpIHNjaGVkdWxlXG4iKTsKIAkJCQluZWVkX3VubWFzayA9IGZhbHNlOwogCQkJCW5hcGlfc2NoZWR1bGUoJndpbC0+bmFwaV9yeCk7CkBAIC0yODksNyArMjYzLDcgQEAKIAkJfQogCX0KIAotCWlmIChpc3IpCisJaWYgKHVubGlrZWx5KGlzcikpCiAJCXdpbF9lcnIod2lsLCAidW4taGFuZGxlZCBSWCBJU1IgYml0cyAweCUwOHhcbiIsIGlzcik7CiAKIAkvKiBSeCBJUlEgd2lsbCBiZSBlbmFibGVkIHdoZW4gTkFQSSBwcm9jZXNzaW5nIGZpbmlzaGVkICovCkBAIC0zMTMsMTkgKzI4NywxOSBAQAogCXRyYWNlX3dpbDYyMTBfaXJxX3R4KGlzcik7CiAJd2lsX2RiZ19pcnEod2lsLCAiSVNSIFRYIDB4JTA4eFxuIiwgaXNyKTsKIAotCWlmICghaXNyKSB7CisJaWYgKHVubGlrZWx5KCFpc3IpKSB7CiAJCXdpbF9lcnIod2lsLCAic3B1cmlvdXMgSVJROiBUWFxuIik7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAKIAl3aWw2MjEwX21hc2tfaXJxX3R4KHdpbCk7CiAKLQlpZiAoaXNyICYgQklUX0RNQV9FUF9UWF9JQ1JfVFhfRE9ORSkgeworCWlmIChsaWtlbHkoaXNyICYgQklUX0RNQV9FUF9UWF9JQ1JfVFhfRE9ORSkpIHsKIAkJd2lsX2RiZ19pcnEod2lsLCAiVFggZG9uZVxuIik7CiAJCWlzciAmPSB+QklUX0RNQV9FUF9UWF9JQ1JfVFhfRE9ORTsKIAkJLyogY2xlYXIgYWxzbyBhbGwgVlJJTkcgaW50ZXJydXB0cyAqLwogCQlpc3IgJj0gfihCSVQoMjUpIC0gMVVMKTsKLQkJaWYgKHRlc3RfYml0KHdpbF9zdGF0dXNfcmVzZXRfZG9uZSwgd2lsLT5zdGF0dXMpKSB7CisJCWlmIChsaWtlbHkodGVzdF9iaXQod2lsX3N0YXR1c19yZXNldF9kb25lLCB3aWwtPnN0YXR1cykpKSB7CiAJCQl3aWxfZGJnX3R4cngod2lsLCAiTkFQSShUeCkgc2NoZWR1bGVcbiIpOwogCQkJbmVlZF91bm1hc2sgPSBmYWxzZTsKIAkJCW5hcGlfc2NoZWR1bGUoJndpbC0+bmFwaV90eCk7CkBAIC0zMzQsNyArMzA4LDcgQEAKIAkJfQogCX0KIAotCWlmIChpc3IpCisJaWYgKHVubGlrZWx5KGlzcikpCiAJCXdpbF9lcnIod2lsLCAidW4taGFuZGxlZCBUWCBJU1IgYml0cyAweCUwOHhcbiIsIGlzcik7CiAKIAkvKiBUeCBJUlEgd2lsbCBiZSBlbmFibGVkIHdoZW4gTkFQSSBwcm9jZXNzaW5nIGZpbmlzaGVkICovCkBAIC01MjMsMTEgKzQ5NywxMSBAQAogCS8qKgogCSAqIHBzZXVkb19jYXVzZSBpcyBDbGVhci1Pbi1SZWFkLCBubyBuZWVkIHRvIEFDSwogCSAqLwotCWlmICgocHNldWRvX2NhdXNlID09IDApIHx8ICgocHNldWRvX2NhdXNlICYgMHhmZikgPT0gMHhmZikpCisJaWYgKHVubGlrZWx5KChwc2V1ZG9fY2F1c2UgPT0gMCkgfHwgKChwc2V1ZG9fY2F1c2UgJiAweGZmKSA9PSAweGZmKSkpCiAJCXJldHVybiBJUlFfTk9ORTsKIAogCS8qIEZJWE1FOiBJUlEgbWFzayBkZWJ1ZyAqLwotCWlmICh3aWw2MjEwX2RlYnVnX2lycV9tYXNrKHdpbCwgcHNldWRvX2NhdXNlKSkKKwlpZiAodW5saWtlbHkod2lsNjIxMF9kZWJ1Z19pcnFfbWFzayh3aWwsIHBzZXVkb19jYXVzZSkpKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKIAl0cmFjZV93aWw2MjEwX2lycV9wc2V1ZG8ocHNldWRvX2NhdXNlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL21haW4uYwppbmRleCBiMDRlMGFmLi5jMmEyMzg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvbWFpbi5jCkBAIC0yOSwxMCArMjksNiBAQAogbW9kdWxlX3BhcmFtKG5vX2Z3X3JlY292ZXJ5LCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKG5vX2Z3X3JlY292ZXJ5LCAiIGRpc2FibGUgYXV0b21hdGljIEZXIGVycm9yIHJlY292ZXJ5Iik7CiAKLXN0YXRpYyBib29sIG5vX2Z3X2xvYWQgPSB0cnVlOwotbW9kdWxlX3BhcmFtKG5vX2Z3X2xvYWQsIGJvb2wsIFNfSVJVR08gfCBTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0Mobm9fZndfbG9hZCwgIiBkbyBub3QgZG93bmxvYWQgRlcsIHVzZSBvbmUgaW4gb24tY2FyZCBmbGFzaC4iKTsKLQogLyogaWYgbm90IHNldCB2aWEgbW9kcGFyYW0sIHdpbGwgYmUgc2V0IHRvIGRlZmF1bHQgdmFsdWUgb2YgMS84IG9mCiAgKiByeCByaW5nIHNpemUgZHVyaW5nIGluaXQgZmxvdwogICovCkBAIC03Miw2ICs2OCw3IEBACiAKIHN0YXRpYyB1aW50IHJ4X3Jpbmdfb3JkZXIgPSBXSUxfUlhfUklOR19TSVpFX09SREVSX0RFRkFVTFQ7CiBzdGF0aWMgdWludCB0eF9yaW5nX29yZGVyID0gV0lMX1RYX1JJTkdfU0laRV9PUkRFUl9ERUZBVUxUOworc3RhdGljIHVpbnQgYmNhc3RfcmluZ19vcmRlciA9IFdJTF9CQ0FTVF9SSU5HX1NJWkVfT1JERVJfREVGQVVMVDsKIAogc3RhdGljIGludCByaW5nX29yZGVyX3NldChjb25zdCBjaGFyICp2YWwsIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQogewpAQCAtMjIwLDYgKzIxNyw3IEBACiAJc3dpdGNoICh3ZGV2LT5pZnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgorCQl3aWxfYmNhc3RfZmluaSh3aWwpOwogCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMobmRldik7CiAJCW5ldGlmX2NhcnJpZXJfb2ZmKG5kZXYpOwogCkBAIC0zNjQsNiArMzYyLDM1IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKK2ludCB3aWxfYmNhc3RfaW5pdChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpCit7CisJaW50IHJpID0gd2lsLT5iY2FzdF92cmluZywgcmM7CisKKwlpZiAoKHJpID49IDApICYmIHdpbC0+dnJpbmdfdHhbcmldLnZhKQorCQlyZXR1cm4gMDsKKworCXJpID0gd2lsX2ZpbmRfZnJlZV92cmluZyh3aWwpOworCWlmIChyaSA8IDApCisJCXJldHVybiByaTsKKworCXJjID0gd2lsX3ZyaW5nX2luaXRfYmNhc3Qod2lsLCByaSwgMSA8PCBiY2FzdF9yaW5nX29yZGVyKTsKKwlpZiAocmMgPT0gMCkKKwkJd2lsLT5iY2FzdF92cmluZyA9IHJpOworCisJcmV0dXJuIHJjOworfQorCit2b2lkIHdpbF9iY2FzdF9maW5pKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKK3sKKwlpbnQgcmkgPSB3aWwtPmJjYXN0X3ZyaW5nOworCisJaWYgKHJpIDwgMCkKKwkJcmV0dXJuOworCisJd2lsLT5iY2FzdF92cmluZyA9IC0xOworCXdpbF92cmluZ19maW5pX3R4KHdpbCwgcmkpOworfQorCiBzdGF0aWMgdm9pZCB3aWxfY29ubmVjdF93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCByYzsKQEAgLTQxMSw2ICs0MzgsNyBAQAogCWluaXRfY29tcGxldGlvbigmd2lsLT53bWlfY2FsbCk7CiAKIAl3aWwtPnBlbmRpbmdfY29ubmVjdF9jaWQgPSAtMTsKKwl3aWwtPmJjYXN0X3ZyaW5nID0gLTE7CiAJc2V0dXBfdGltZXIoJndpbC0+Y29ubmVjdF90aW1lciwgd2lsX2Nvbm5lY3RfdGltZXJfZm4sICh1bG9uZyl3aWwpOwogCXNldHVwX3RpbWVyKCZ3aWwtPnNjYW5fdGltZXIsIHdpbF9zY2FuX3RpbWVyX2ZuLCAodWxvbmcpd2lsKTsKIApAQCAtNTIwLDggKzU0OCw2IEBACiB7CiAJaW50IGRlbGF5ID0gMDsKIAl1MzIgeDsKLQlib29sIGlzX3Jlc2V0X3YyID0gdGVzdF9iaXQoaHdfY2FwYWJpbGl0eV9yZXNldF92MiwKLQkJCQkgICAgd2lsLT5od19jYXBhYmlsaXRpZXMpOwogCiAJd2lsX2RiZ19taXNjKHdpbCwgIlJlc2V0dGluZyBcIiVzXCIuLi5cbiIsIHdpbC0+aHdfbmFtZSk7CiAKQEAgLTUzMiw4MiArNTU4LDY3IEBACiAKIAl3aWxfaGFsdF9jcHUod2lsKTsKIAorCS8qIGNsZWFyIGFsbCBib290IGxvYWRlciAicmVhZHkiIGJpdHMgKi8KKwlXKFJHRl9VU0VSX0JMICsgb2Zmc2V0b2Yoc3RydWN0IFJHRl9CTCwgcmVhZHkpLCAwKTsKIAkvKiBDbGVhciBGdyBEb3dubG9hZCBub3RpZmljYXRpb24gKi8KIAlDKFJHRl9VU0VSX1VTQUdFXzYsIEJJVCgwKSk7CiAKLQlpZiAoaXNfcmVzZXRfdjIpIHsKLQkJUyhSR0ZfQ0FGX09TQ19DT05UUk9MLCBCSVRfQ0FGX09TQ19YVEFMX0VOKTsKLQkJLyogWFRBTCBzdGFiaWxpemF0aW9uIHNob3VsZCB0YWtlIGFib3V0IDNtcyAqLwotCQl1c2xlZXBfcmFuZ2UoNTAwMCwgNzAwMCk7Ci0JCXggPSBSKFJHRl9DQUZfUExMX0xPQ0tfU1RBVFVTKTsKLQkJaWYgKCEoeCAmIEJJVF9DQUZfT1NDX0RJR19YVEFMX1NUQUJMRSkpIHsKLQkJCXdpbF9lcnIod2lsLCAiWHRhbCBzdGFiaWxpemF0aW9uIHRpbWVvdXRcbiIKLQkJCQkiUkdGX0NBRl9QTExfTE9DS19TVEFUVVMgPSAweCUwOHhcbiIsIHgpOwotCQkJcmV0dXJuIC1FVElNRTsKLQkJfQotCQkvKiBzd2l0Y2ggMTBrIHRvIFhUQUwqLwotCQlDKFJHRl9VU0VSX1NQQVJST1dfTV80LCBCSVRfU1BBUlJPV19NXzRfU0VMX1NMRUVQX09SX1JFRik7Ci0JCS8qIDQwIE1IeiAqLwotCQlDKFJHRl9VU0VSX0NMS1NfQ1RMXzAsIEJJVF9VU0VSX0NMS1NfQ0FSX0FIQl9TV19TRUwpOwotCi0JCVcoUkdGX1VTRVJfQ0xLU19DVExfRVhUX1NXX1JTVF9WRUNfMCwgMHgzZmY4MWYpOwotCQlXKFJHRl9VU0VSX0NMS1NfQ1RMX0VYVF9TV19SU1RfVkVDXzEsIDB4Zik7CisJUyhSR0ZfQ0FGX09TQ19DT05UUk9MLCBCSVRfQ0FGX09TQ19YVEFMX0VOKTsKKwkvKiBYVEFMIHN0YWJpbGl6YXRpb24gc2hvdWxkIHRha2UgYWJvdXQgM21zICovCisJdXNsZWVwX3JhbmdlKDUwMDAsIDcwMDApOworCXggPSBSKFJHRl9DQUZfUExMX0xPQ0tfU1RBVFVTKTsKKwlpZiAoISh4ICYgQklUX0NBRl9PU0NfRElHX1hUQUxfU1RBQkxFKSkgeworCQl3aWxfZXJyKHdpbCwgIlh0YWwgc3RhYmlsaXphdGlvbiB0aW1lb3V0XG4iCisJCQkiUkdGX0NBRl9QTExfTE9DS19TVEFUVVMgPSAweCUwOHhcbiIsIHgpOworCQlyZXR1cm4gLUVUSU1FOwogCX0KKwkvKiBzd2l0Y2ggMTBrIHRvIFhUQUwqLworCUMoUkdGX1VTRVJfU1BBUlJPV19NXzQsIEJJVF9TUEFSUk9XX01fNF9TRUxfU0xFRVBfT1JfUkVGKTsKKwkvKiA0MCBNSHogKi8KKwlDKFJHRl9VU0VSX0NMS1NfQ1RMXzAsIEJJVF9VU0VSX0NMS1NfQ0FSX0FIQl9TV19TRUwpOworCisJVyhSR0ZfVVNFUl9DTEtTX0NUTF9FWFRfU1dfUlNUX1ZFQ18wLCAweDNmZjgxZik7CisJVyhSR0ZfVVNFUl9DTEtTX0NUTF9FWFRfU1dfUlNUX1ZFQ18xLCAweGYpOwogCiAJVyhSR0ZfVVNFUl9DTEtTX0NUTF9TV19SU1RfVkVDXzIsIDB4RkUwMDAwMDApOwogCVcoUkdGX1VTRVJfQ0xLU19DVExfU1dfUlNUX1ZFQ18xLCAweDAwMDAwMDNGKTsKLQlXKFJHRl9VU0VSX0NMS1NfQ1RMX1NXX1JTVF9WRUNfMywKLQkgIGlzX3Jlc2V0X3YyID8gMHgwMDAwMDBmMCA6IDB4MDAwMDAxNzApOworCVcoUkdGX1VTRVJfQ0xLU19DVExfU1dfUlNUX1ZFQ18zLCAweDAwMDAwMGYwKTsKIAlXKFJHRl9VU0VSX0NMS1NfQ1RMX1NXX1JTVF9WRUNfMCwgMHhGRkU3RkUwMCk7CiAKLQlpZiAoaXNfcmVzZXRfdjIpIHsKLQkJVyhSR0ZfVVNFUl9DTEtTX0NUTF9FWFRfU1dfUlNUX1ZFQ18wLCAweDApOwotCQlXKFJHRl9VU0VSX0NMS1NfQ1RMX0VYVF9TV19SU1RfVkVDXzEsIDB4MCk7Ci0JfQorCVcoUkdGX1VTRVJfQ0xLU19DVExfRVhUX1NXX1JTVF9WRUNfMCwgMHgwKTsKKwlXKFJHRl9VU0VSX0NMS1NfQ1RMX0VYVF9TV19SU1RfVkVDXzEsIDB4MCk7CiAKIAlXKFJHRl9VU0VSX0NMS1NfQ1RMX1NXX1JTVF9WRUNfMywgMCk7CiAJVyhSR0ZfVVNFUl9DTEtTX0NUTF9TV19SU1RfVkVDXzIsIDApOwogCVcoUkdGX1VTRVJfQ0xLU19DVExfU1dfUlNUX1ZFQ18xLCAwKTsKIAlXKFJHRl9VU0VSX0NMS1NfQ1RMX1NXX1JTVF9WRUNfMCwgMCk7CiAKLQlpZiAoaXNfcmVzZXRfdjIpIHsKLQkJVyhSR0ZfVVNFUl9DTEtTX0NUTF9TV19SU1RfVkVDXzMsIDB4MDAwMDAwMDMpOwotCQkvKiByZXNldCBBMiBQQ0lFIEFIQiAqLwotCQlXKFJHRl9VU0VSX0NMS1NfQ1RMX1NXX1JTVF9WRUNfMiwgMHgwMDAwODAwMCk7Ci0JfSBlbHNlIHsKLQkJVyhSR0ZfVVNFUl9DTEtTX0NUTF9TV19SU1RfVkVDXzMsIDB4MDAwMDAwMDEpOwotCQlXKFJHRl9QQ0lFX0xPU19DT1VOVEVSX0NUTCwgQklUKDYpIHwgQklUKDgpKTsKLQkJVyhSR0ZfVVNFUl9DTEtTX0NUTF9TV19SU1RfVkVDXzIsIDB4MDAwMDgwMDApOwotCX0KKwlXKFJHRl9VU0VSX0NMS1NfQ1RMX1NXX1JTVF9WRUNfMywgMHgwMDAwMDAwMyk7CisJVyhSR0ZfVVNFUl9DTEtTX0NUTF9TV19SU1RfVkVDXzIsIDB4MDAwMDgwMDApOyAvKiByZXNldCBBMiBQQ0lFIEFIQiAqLwogCi0JLyogVE9ETzogY2hlY2sgb3JkZXIgaGVyZSEhISBFcmV6IGNvZGUgaXMgZGlmZmVyZW50ICovCiAJVyhSR0ZfVVNFUl9DTEtTX0NUTF9TV19SU1RfVkVDXzAsIDApOwogCi0JLyogd2FpdCB1bnRpbCBkZXZpY2UgcmVhZHkuIHR5cGljYWwgdGltZSBpcyAyMDAuLjI1MCBtc2VjICovCisJLyogd2FpdCB1bnRpbCBkZXZpY2UgcmVhZHkuIHR5cGljYWwgdGltZSBpcyAyMC4uODAgbXNlYyAqLwogCWRvIHsKIAkJbXNsZWVwKFJTVF9ERUxBWSk7Ci0JCXggPSBSKFJHRl9VU0VSX0hXX01BQ0hJTkVfU1RBVEUpOworCQl4ID0gUihSR0ZfVVNFUl9CTCArIG9mZnNldG9mKHN0cnVjdCBSR0ZfQkwsIHJlYWR5KSk7CiAJCWlmIChkZWxheSsrID4gUlNUX0NPVU5UKSB7Ci0JCQl3aWxfZXJyKHdpbCwgIlJlc2V0IG5vdCBjb21wbGV0ZWQsIGh3X3N0YXRlIDB4JTA4eFxuIiwKKwkJCXdpbF9lcnIod2lsLCAiUmVzZXQgbm90IGNvbXBsZXRlZCwgYmwucmVhZHkgMHglMDh4XG4iLAogCQkJCXgpOwogCQkJcmV0dXJuIC1FVElNRTsKIAkJfQotCX0gd2hpbGUgKHggIT0gSFdfTUFDSElORV9CT09UX0RPTkUpOwotCi0JaWYgKCFpc19yZXNldF92MikKLQkJVyhSR0ZfUENJRV9MT1NfQ09VTlRFUl9DVEwsIEJJVCg4KSk7CisJfSB3aGlsZSAoISh4ICYgQklUX0JMX1JFQURZKSk7CiAKIAlDKFJHRl9VU0VSX0NMS1NfQ1RMXzAsIEJJVF9VU0VSX0NMS1NfUlNUX1BXR0QpOwogCisJLyogZW5hYmxlIGZpeCBmb3IgSFcgYnVnIHJlbGF0ZWQgdG8gdGhlIFNBL0RBIHN3YXAgaW4gQVAgUnggKi8KKwlTKFJHRl9ETUFfT0ZVTF9OSURfMCwgQklUX0RNQV9PRlVMX05JRF8wX1JYX0VYVF9UUl9FTiB8CisJICBCSVRfRE1BX09GVUxfTklEXzBfUlhfRVhUX0EzX1NSQyk7CisKIAl3aWxfZGJnX21pc2Mod2lsLCAiUmVzZXQgY29tcGxldGVkIGluICVkIG1zXG4iLCBkZWxheSAqIFJTVF9ERUxBWSk7CiAJcmV0dXJuIDA7CiB9CiAKLSN1bmRlZiBSCi0jdW5kZWYgVwotI3VuZGVmIFMKLSN1bmRlZiBDCi0KIHZvaWQgd2lsX21ib3hfcmluZ19sZTJjcHVzKHN0cnVjdCB3aWw2MjEwX21ib3hfcmluZyAqcikKIHsKIAlsZTMyX3RvX2NwdXMoJnItPmJhc2UpOwpAQCAtNjE3LDYgKzYyOCwzMiBAQAogCWxlMzJfdG9fY3B1cygmci0+aGVhZCk7CiB9CiAKK3N0YXRpYyBpbnQgd2lsX2dldF9ibF9pbmZvKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHdpbF90b19uZGV2KHdpbCk7CisJc3RydWN0IFJHRl9CTCBibDsKKworCXdpbF9tZW1jcHlfZnJvbWlvXzMyKCZibCwgd2lsLT5jc3IgKyBIT1NUQUREUihSR0ZfVVNFUl9CTCksIHNpemVvZihibCkpOworCWxlMzJfdG9fY3B1cygmYmwucmVhZHkpOworCWxlMzJfdG9fY3B1cygmYmwudmVyc2lvbik7CisJbGUzMl90b19jcHVzKCZibC5yZl90eXBlKTsKKwlsZTMyX3RvX2NwdXMoJmJsLmJhc2ViYW5kX3R5cGUpOworCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGJsLm1hY19hZGRyZXNzKSkgeworCQl3aWxfZXJyKHdpbCwgIkJMOiBJbnZhbGlkIE1BQyAlcE1cbiIsIGJsLm1hY19hZGRyZXNzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXRoZXJfYWRkcl9jb3B5KG5kZXYtPnBlcm1fYWRkciwgYmwubWFjX2FkZHJlc3MpOworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZGV2LT5kZXZfYWRkcikpCisJCWV0aGVyX2FkZHJfY29weShuZGV2LT5kZXZfYWRkciwgYmwubWFjX2FkZHJlc3MpOworCXdpbF9pbmZvKHdpbCwKKwkJICJCb290IExvYWRlcjogdmVyID0gJWQgTUFDID0gJXBNIFJGID0gMHglMDh4IGJiYW5kID0gMHglMDh4XG4iLAorCQkgYmwudmVyc2lvbiwgYmwubWFjX2FkZHJlc3MsIGJsLnJmX3R5cGUsIGJsLmJhc2ViYW5kX3R5cGUpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgd2lsX3dhaXRfZm9yX2Z3X3JlYWR5KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKIAl1bG9uZyB0byA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwMCk7CkBAIC02MzcsNyArNjc0LDcgQEAKICAqIEFmdGVyIGNhbGxpbmcgdGhpcyByb3V0aW5lLCB5b3UncmUgZXhwZWN0ZWQgdG8gcmVsb2FkCiAgKiB0aGUgZmlybXdhcmUuCiAgKi8KLWludCB3aWxfcmVzZXQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQoraW50IHdpbF9yZXNldChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGJvb2wgbG9hZF9mdykKIHsKIAlpbnQgcmM7CiAKQEAgLTY1MSw2ICs2ODgsNyBAQAogCiAJY2FuY2VsX3dvcmtfc3luYygmd2lsLT5kaXNjb25uZWN0X3dvcmtlcik7CiAJd2lsNjIxMF9kaXNjb25uZWN0KHdpbCwgTlVMTCwgV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcsIGZhbHNlKTsKKwl3aWxfYmNhc3RfZmluaSh3aWwpOwogCiAJLyogcHJldmVudCBOQVBJIGZyb20gYmVpbmcgc2NoZWR1bGVkICovCiAJYml0bWFwX3plcm8od2lsLT5zdGF0dXMsIHdpbF9zdGF0dXNfbGFzdCk7CkBAIC02NzUsNDYgKzcxMyw2MiBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JaWYgKCFub19md19sb2FkKSB7Ci0JCXdpbF9pbmZvKHdpbCwgIlVzZSBmaXJtd2FyZSA8JXM+XG4iLCBXSUxfRldfTkFNRSk7CisJcmMgPSB3aWxfZ2V0X2JsX2luZm8od2lsKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChsb2FkX2Z3KSB7CisJCXdpbF9pbmZvKHdpbCwgIlVzZSBmaXJtd2FyZSA8JXM+ICsgYm9hcmQgPCVzPlxuIiwgV0lMX0ZXX05BTUUsCisJCQkgV0lMX0ZXMl9OQU1FKTsKKwogCQl3aWxfaGFsdF9jcHUod2lsKTsKIAkJLyogTG9hZGluZyBmL3cgZnJvbSB0aGUgZmlsZSAqLwogCQlyYyA9IHdpbF9yZXF1ZXN0X2Zpcm13YXJlKHdpbCwgV0lMX0ZXX05BTUUpOwogCQlpZiAocmMpCiAJCQlyZXR1cm4gcmM7CisJCXJjID0gd2lsX3JlcXVlc3RfZmlybXdhcmUod2lsLCBXSUxfRlcyX05BTUUpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CiAKLQkJLyogY2xlYXIgYW55IGludGVycnVwdHMgd2hpY2ggb24tY2FyZC1maXJtd2FyZSBtYXkgaGF2ZSBzZXQgKi8KKwkJLyogTWFyayBGVyBhcyBsb2FkZWQgZnJvbSBob3N0ICovCisJCVMoUkdGX1VTRVJfVVNBR0VfNiwgMSk7CisKKwkJLyogY2xlYXIgYW55IGludGVycnVwdHMgd2hpY2ggb24tY2FyZC1maXJtd2FyZQorCQkgKiBtYXkgaGF2ZSBzZXQKKwkJICovCiAJCXdpbDYyMTBfY2xlYXJfaXJxKHdpbCk7Ci0JCXsgLyogQ0FGX0lDUiAtIGNsZWFyIGFuZCBtYXNrICovCi0JCQl1MzIgYSA9IEhPU1RBRERSKFJHRl9DQUZfSUNSKSArCi0JCQkJb2Zmc2V0b2Yoc3RydWN0IFJHRl9JQ1IsIElDUik7Ci0JCQl1MzIgbSA9IEhPU1RBRERSKFJHRl9DQUZfSUNSKSArCi0JCQkJb2Zmc2V0b2Yoc3RydWN0IFJHRl9JQ1IsIElNVik7Ci0JCQl1MzIgaWNyID0gaW9yZWFkMzIod2lsLT5jc3IgKyBhKTsKKwkJLyogQ0FGX0lDUiAtIGNsZWFyIGFuZCBtYXNrICovCisJCS8qIGl0IGlzIFcxQywgY2xlYXIgYnkgd3JpdGluZyBiYWNrIHNhbWUgdmFsdWUgKi8KKwkJUyhSR0ZfQ0FGX0lDUiArIG9mZnNldG9mKHN0cnVjdCBSR0ZfSUNSLCBJQ1IpLCAwKTsKKwkJVyhSR0ZfQ0FGX0lDUiArIG9mZnNldG9mKHN0cnVjdCBSR0ZfSUNSLCBJTVYpLCB+MCk7CiAKLQkJCWlvd3JpdGUzMihpY3IsIHdpbC0+Y3NyICsgYSk7IC8qIFcxQyAqLwotCQkJaW93cml0ZTMyKH4wLCB3aWwtPmNzciArIG0pOwotCQkJd21iKCk7IC8qIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KLQkJfQogCQl3aWxfcmVsZWFzZV9jcHUod2lsKTsKLQl9IGVsc2UgewotCQl3aWxfaW5mbyh3aWwsICJVc2UgZmlybXdhcmUgZnJvbSBvbi1jYXJkIGZsYXNoXG4iKTsKIAl9CiAKIAkvKiBpbml0IGFmdGVyIHJlc2V0ICovCiAJd2lsLT5wZW5kaW5nX2Nvbm5lY3RfY2lkID0gLTE7CisJd2lsLT5hcF9pc29sYXRlID0gMDsKIAlyZWluaXRfY29tcGxldGlvbigmd2lsLT53bWlfcmVhZHkpOwogCXJlaW5pdF9jb21wbGV0aW9uKCZ3aWwtPndtaV9jYWxsKTsKIAotCXdpbF9jb25maWd1cmVfaW50ZXJydXB0X21vZGVyYXRpb24od2lsKTsKLQl3aWxfdW5tYXNrX2lycSh3aWwpOworCWlmIChsb2FkX2Z3KSB7CisJCXdpbF9jb25maWd1cmVfaW50ZXJydXB0X21vZGVyYXRpb24od2lsKTsKKwkJd2lsX3VubWFza19pcnEod2lsKTsKIAotCS8qIHdlIGp1c3Qgc3RhcnRlZCBNQUMsIHdhaXQgZm9yIEZXIHJlYWR5ICovCi0JcmMgPSB3aWxfd2FpdF9mb3JfZndfcmVhZHkod2lsKTsKKwkJLyogd2UganVzdCBzdGFydGVkIE1BQywgd2FpdCBmb3IgRlcgcmVhZHkgKi8KKwkJcmMgPSB3aWxfd2FpdF9mb3JfZndfcmVhZHkod2lsKTsKKwkJaWYgKHJjID09IDApIC8qIGNoZWNrIEZXIGlzIHJlc3BvbnNpdmUgKi8KKwkJCXJjID0gd21pX2VjaG8od2lsKTsKKwl9CiAKIAlyZXR1cm4gcmM7CiB9CiAKKyN1bmRlZiBSCisjdW5kZWYgVworI3VuZGVmIFMKKyN1bmRlZiBDCisKIHZvaWQgd2lsX2Z3X2Vycm9yX3JlY292ZXJ5KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCkKIHsKIAl3aWxfZGJnX21pc2Mod2lsLCAic3RhcnRpbmcgZncgZXJyb3IgcmVjb3ZlcnlcbiIpOwpAQCAtNzMwLDcgKzc4NCw3IEBACiAKIAlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJndpbC0+bXV0ZXgpKTsKIAotCXJjID0gd2lsX3Jlc2V0KHdpbCk7CisJcmMgPSB3aWxfcmVzZXQod2lsLCB0cnVlKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIApAQCAtODM3LDcgKzg5MSw3IEBACiAJaWYgKCFpdGVyKQogCQl3aWxfZXJyKHdpbCwgInRpbWVvdXQgd2FpdGluZyBmb3IgaWRsZSBGVy9IV1xuIik7CiAKLQl3aWxfcnhfZmluaSh3aWwpOworCXdpbF9yZXNldCh3aWwsIGZhbHNlKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYwppbmRleCBhY2UzMGMxLi5mMmY3ZWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9uZXRkZXYuYwpAQCAtODIsNyArODIsNyBAQAogCXdpbF9yeF9oYW5kbGUod2lsLCAmcXVvdGEpOwogCWRvbmUgPSBidWRnZXQgLSBxdW90YTsKIAotCWlmIChkb25lIDw9IDEpIHsgLyogYnVyc3QgZW5kcyAtIG9ubHkgb25lIHBhY2tldCBwcm9jZXNzZWQgKi8KKwlpZiAoZG9uZSA8IGJ1ZGdldCkgewogCQluYXBpX2NvbXBsZXRlKG5hcGkpOwogCQl3aWw2MjEwX3VubWFza19pcnFfcngod2lsKTsKIAkJd2lsX2RiZ190eHJ4KHdpbCwgIk5BUEkgUlggY29tcGxldGVcbiIpOwpAQCAtMTEwLDcgKzExMCw3IEBACiAJCXR4X2RvbmUgKz0gd2lsX3R4X2NvbXBsZXRlKHdpbCwgaSk7CiAJfQogCi0JaWYgKHR4X2RvbmUgPD0gMSkgeyAvKiBidXJzdCBlbmRzIC0gb25seSBvbmUgcGFja2V0IHByb2Nlc3NlZCAqLworCWlmICh0eF9kb25lIDwgYnVkZ2V0KSB7CiAJCW5hcGlfY29tcGxldGUobmFwaSk7CiAJCXdpbDYyMTBfdW5tYXNrX2lycV90eCh3aWwpOwogCQl3aWxfZGJnX3R4cngod2lsLCAiTkFQSSBUWCBjb21wbGV0ZVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9wY2llX2J1cy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvcGNpZV9idXMuYwppbmRleCAzZGQyNjcwLi4xMDk5ODYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC9wY2llX2J1cy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3BjaWVfYnVzLmMKQEAgLTM5LDE4ICszOSw2IEBACiAJYml0bWFwX3plcm8od2lsLT5od19jYXBhYmlsaXRpZXMsIGh3X2NhcGFiaWxpdHlfbGFzdCk7CiAKIAlzd2l0Y2ggKHJldl9pZCkgewotCWNhc2UgSlRBR19ERVZfSURfTUFSTE9OX0IwOgotCQl3aWwtPmh3X25hbWUgPSAiTWFybG9uIEIwIjsKLQkJd2lsLT5od192ZXJzaW9uID0gSFdfVkVSX01BUkxPTl9CMDsKLQkJYnJlYWs7Ci0JY2FzZSBKVEFHX0RFVl9JRF9TUEFSUk9XX0EwOgotCQl3aWwtPmh3X25hbWUgPSAiU3BhcnJvdyBBMCI7Ci0JCXdpbC0+aHdfdmVyc2lvbiA9IEhXX1ZFUl9TUEFSUk9XX0EwOwotCQlicmVhazsKLQljYXNlIEpUQUdfREVWX0lEX1NQQVJST1dfQTE6Ci0JCXdpbC0+aHdfbmFtZSA9ICJTcGFycm93IEExIjsKLQkJd2lsLT5od192ZXJzaW9uID0gSFdfVkVSX1NQQVJST1dfQTE7Ci0JCWJyZWFrOwogCWNhc2UgSlRBR19ERVZfSURfU1BBUlJPV19CMDoKIAkJd2lsLT5od19uYW1lID0gIlNwYXJyb3cgQjAiOwogCQl3aWwtPmh3X3ZlcnNpb24gPSBIV19WRVJfU1BBUlJPV19CMDsKQEAgLTYyLDEzICs1MCw2IEBACiAJfQogCiAJd2lsX2luZm8od2lsLCAiQm9hcmQgaGFyZHdhcmUgaXMgJXNcbiIsIHdpbC0+aHdfbmFtZSk7Ci0KLQlpZiAod2lsLT5od192ZXJzaW9uID49IEhXX1ZFUl9TUEFSUk9XX0EwKQotCQlzZXRfYml0KGh3X2NhcGFiaWxpdHlfcmVzZXRfdjIsIHdpbC0+aHdfY2FwYWJpbGl0aWVzKTsKLQotCWlmICh3aWwtPmh3X3ZlcnNpb24gPj0gSFdfVkVSX1NQQVJST1dfQjApCi0JCXNldF9iaXQoaHdfY2FwYWJpbGl0eV9hZHZhbmNlZF9pdHJfbW9kZXJhdGlvbiwKLQkJCXdpbC0+aHdfY2FwYWJpbGl0aWVzKTsKIH0KIAogdm9pZCB3aWxfZGlzYWJsZV9pcnEoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKQpAQCAtMTUwLDcgKzEzMSw3IEBACiAKIAkvKiBuZWVkIHJlc2V0IGhlcmUgdG8gb2J0YWluIE1BQyAqLwogCW11dGV4X2xvY2soJndpbC0+bXV0ZXgpOwotCXJjID0gd2lsX3Jlc2V0KHdpbCk7CisJcmMgPSB3aWxfcmVzZXQod2lsLCBmYWxzZSk7CiAJbXV0ZXhfdW5sb2NrKCZ3aWwtPm11dGV4KTsKIAlpZiAoZGVidWdfZncpCiAJCXJjID0gMDsKQEAgLTI2NSw4ICsyNDYsNiBAQAogCiAJd2lsNjIxMF9kZWJ1Z2ZzX2luaXQod2lsKTsKIAotCS8qIGNoZWNrIEZXIGlzIGFsaXZlICovCi0Jd21pX2VjaG8od2lsKTsKIAogCXJldHVybiAwOwogCkBAIC0zMDUsNyArMjg0LDYgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIHdpbDYyMTBfcGNpZV9pZHNbXSA9IHsKLQl7IFBDSV9ERVZJQ0UoMHgxYWU5LCAweDAzMDEpIH0sCiAJeyBQQ0lfREVWSUNFKDB4MWFlOSwgMHgwMzEwKSB9LAogCXsgUENJX0RFVklDRSgweDFhZTksIDB4MDMwMikgfSwgLyogc2FtZSBhcyBhYm92ZSwgZmlybXdhcmUgYnJva2VuICovCiAJeyAvKiBlbmQ6IGFsbCB6ZXJvZXMgKi8JfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3R4cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3R4cnguYwppbmRleCA4NDM5ZjY1Li5lOGJkNTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvdHhyeC5jCkBAIC0zMyw2ICszMywxNSBAQAogTU9EVUxFX1BBUk1fREVTQyhydGFwX2luY2x1ZGVfcGh5X2luZm8sCiAJCSAiIEluY2x1ZGUgUEhZIGluZm8gaW4gdGhlIHJhZGlvdGFwIGhlYWRlciwgZGVmYXVsdCAtIG5vIik7CiAKK2Jvb2wgcnhfYWxpZ25fMjsKK21vZHVsZV9wYXJhbShyeF9hbGlnbl8yLCBib29sLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocnhfYWxpZ25fMiwgIiBhbGlnbiBSeCBidWZmZXJzIG9uIDQqbisyLCBkZWZhdWx0IC0gbm8iKTsKKworc3RhdGljIGlubGluZSB1aW50IHdpbF9yeF9zbmFwbGVuKHZvaWQpCit7CisJcmV0dXJuIHJ4X2FsaWduXzIgPyA2IDogMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgd2lsX3ZyaW5nX2lzX2VtcHR5KHN0cnVjdCB2cmluZyAqdnJpbmcpCiB7CiAJcmV0dXJuIHZyaW5nLT5zd2hlYWQgPT0gdnJpbmctPnN3dGFpbDsKQEAgLTUzLDM0ICs2MiwzOCBAQAogCXJldHVybiB3aWxfdnJpbmdfbmV4dF90YWlsKHZyaW5nKSA9PSB2cmluZy0+c3doZWFkOwogfQogCi0vKgotICogQXZhaWxhYmxlIHNwYWNlIGluIFR4IFZyaW5nCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHdpbF92cmluZ19hdmFpbF90eChzdHJ1Y3QgdnJpbmcgKnZyaW5nKQorLyogVXNlZCBzcGFjZSBpbiBUeCBWcmluZyAqLworc3RhdGljIGlubGluZSBpbnQgd2lsX3ZyaW5nX3VzZWRfdHgoc3RydWN0IHZyaW5nICp2cmluZykKIHsKIAl1MzIgc3doZWFkID0gdnJpbmctPnN3aGVhZDsKIAl1MzIgc3d0YWlsID0gdnJpbmctPnN3dGFpbDsKLQlpbnQgdXNlZCA9ICh2cmluZy0+c2l6ZSArIHN3aGVhZCAtIHN3dGFpbCkgJSB2cmluZy0+c2l6ZTsKLQotCXJldHVybiB2cmluZy0+c2l6ZSAtIHVzZWQgLSAxOworCXJldHVybiAodnJpbmctPnNpemUgKyBzd2hlYWQgLSBzd3RhaWwpICUgdnJpbmctPnNpemU7CiB9CiAKLS8qKgotICogd2lsX3ZyaW5nX3dtYXJrX2xvdyAtIGxvdyB3YXRlcm1hcmsgZm9yIGF2YWlsYWJsZSBkZXNjcmlwdG9yIHNwYWNlCi0gKi8KKy8qIEF2YWlsYWJsZSBzcGFjZSBpbiBUeCBWcmluZyAqLworc3RhdGljIGlubGluZSBpbnQgd2lsX3ZyaW5nX2F2YWlsX3R4KHN0cnVjdCB2cmluZyAqdnJpbmcpCit7CisJcmV0dXJuIHZyaW5nLT5zaXplIC0gd2lsX3ZyaW5nX3VzZWRfdHgodnJpbmcpIC0gMTsKK30KKworLyogd2lsX3ZyaW5nX3dtYXJrX2xvdyAtIGxvdyB3YXRlcm1hcmsgZm9yIGF2YWlsYWJsZSBkZXNjcmlwdG9yIHNwYWNlICovCiBzdGF0aWMgaW5saW5lIGludCB3aWxfdnJpbmdfd21hcmtfbG93KHN0cnVjdCB2cmluZyAqdnJpbmcpCiB7CiAJcmV0dXJuIHZyaW5nLT5zaXplLzg7CiB9CiAKLS8qKgotICogd2lsX3ZyaW5nX3dtYXJrX2hpZ2ggLSBoaWdoIHdhdGVybWFyayBmb3IgYXZhaWxhYmxlIGRlc2NyaXB0b3Igc3BhY2UKLSAqLworLyogd2lsX3ZyaW5nX3dtYXJrX2hpZ2ggLSBoaWdoIHdhdGVybWFyayBmb3IgYXZhaWxhYmxlIGRlc2NyaXB0b3Igc3BhY2UgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHdpbF92cmluZ193bWFya19oaWdoKHN0cnVjdCB2cmluZyAqdnJpbmcpCiB7CiAJcmV0dXJuIHZyaW5nLT5zaXplLzQ7CiB9CiAKKy8qIHdpbF92YWxfaW5fcmFuZ2UgLSBjaGVjayBpZiB2YWx1ZSBpbiBbbWluLG1heCkgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCB3aWxfdmFsX2luX3JhbmdlKGludCB2YWwsIGludCBtaW4sIGludCBtYXgpCit7CisJcmV0dXJuIHZhbCA+PSBtaW4gJiYgdmFsIDwgbWF4OworfQorCiBzdGF0aWMgaW50IHdpbF92cmluZ19hbGxvYyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIHN0cnVjdCB2cmluZyAqdnJpbmcpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gd2lsX3RvX2Rldih3aWwpOwpAQCAtOTgsOCArMTExLDcgQEAKIAkJdnJpbmctPnZhID0gTlVMTDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCS8qCi0JICogdnJpbmctPnZhIHNob3VsZCBiZSBhbGlnbmVkIG9uIGl0cyBzaXplIHJvdW5kZWQgdXAgdG8gcG93ZXIgb2YgMgorCS8qIHZyaW5nLT52YSBzaG91bGQgYmUgYWxpZ25lZCBvbiBpdHMgc2l6ZSByb3VuZGVkIHVwIHRvIHBvd2VyIG9mIDIKIAkgKiBUaGlzIGlzIGdyYW50ZWQgYnkgdGhlIGRtYV9hbGxvY19jb2hlcmVudAogCSAqLwogCXZyaW5nLT52YSA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHN6LCAmdnJpbmctPnBhLCBHRlBfS0VSTkVMKTsKQEAgLTIwNiw3ICsyMTgsNyBAQAogCQkJICAgICAgIHUzMiBpLCBpbnQgaGVhZHJvb20pCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gd2lsX3RvX2Rldih3aWwpOwotCXVuc2lnbmVkIGludCBzeiA9IG10dV9tYXggKyBFVEhfSExFTjsKKwl1bnNpZ25lZCBpbnQgc3ogPSBtdHVfbWF4ICsgRVRIX0hMRU4gKyB3aWxfcnhfc25hcGxlbigpOwogCXN0cnVjdCB2cmluZ19yeF9kZXNjIGRkLCAqZCA9ICZkZDsKIAl2b2xhdGlsZSBzdHJ1Y3QgdnJpbmdfcnhfZGVzYyAqX2QgPSAmdnJpbmctPnZhW2ldLnJ4OwogCWRtYV9hZGRyX3QgcGE7CkBAIC0zNDYsMjcgKzM1OCw2IEBACiAJfQogfQogCi0vKgotICogRmFzdCBzd2FwIGluIHBsYWNlIGJldHdlZW4gMiByZWdpc3RlcnMKLSAqLwotc3RhdGljIHZvaWQgd2lsX3N3YXBfdTE2KHUxNiAqYSwgdTE2ICpiKQotewotCSphIF49ICpiOwotCSpiIF49ICphOwotCSphIF49ICpiOwotfQotCi1zdGF0aWMgdm9pZCB3aWxfc3dhcF9ldGhhZGRyKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGV0aGhkciAqZXRoID0gZGF0YTsKLQl1MTYgKnMgPSAodTE2ICopZXRoLT5oX3NvdXJjZTsKLQl1MTYgKmQgPSAodTE2ICopZXRoLT5oX2Rlc3Q7Ci0KLQl3aWxfc3dhcF91MTYocysrLCBkKyspOwotCXdpbF9zd2FwX3UxNihzKyssIGQrKyk7Ci0Jd2lsX3N3YXBfdTE2KHMsIGQpOwotfQotCiAvKioKICAqIHJlYXAgMSBmcmFtZSBmcm9tIEBzd2hlYWQKICAqCkBAIC0zODMsNDAgKzM3NCw0NSBAQAogCXN0cnVjdCB2cmluZ19yeF9kZXNjICpkOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJZG1hX2FkZHJfdCBwYTsKLQl1bnNpZ25lZCBpbnQgc3ogPSBtdHVfbWF4ICsgRVRIX0hMRU47CisJdW5zaWduZWQgaW50IHNuYXBsZW4gPSB3aWxfcnhfc25hcGxlbigpOworCXVuc2lnbmVkIGludCBzeiA9IG10dV9tYXggKyBFVEhfSExFTiArIHNuYXBsZW47CiAJdTE2IGRtYWxlbjsKIAl1OCBmdHlwZTsKLQl1OCBkc19iaXRzOwogCWludCBjaWQ7CisJaW50IGkgPSAoaW50KXZyaW5nLT5zd2hlYWQ7CiAJc3RydWN0IHdpbF9uZXRfc3RhdHMgKnN0YXRzOwogCiAJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgdnJpbmdfcnhfZGVzYykgPiBzaXplb2Yoc2tiLT5jYikpOwogCi0JaWYgKHdpbF92cmluZ19pc19lbXB0eSh2cmluZykpCisJaWYgKHVubGlrZWx5KHdpbF92cmluZ19pc19lbXB0eSh2cmluZykpKQogCQlyZXR1cm4gTlVMTDsKIAotCV9kID0gJnZyaW5nLT52YVt2cmluZy0+c3doZWFkXS5yeDsKLQlpZiAoIShfZC0+ZG1hLnN0YXR1cyAmIFJYX0RNQV9TVEFUVVNfRFUpKSB7CisJX2QgPSAmdnJpbmctPnZhW2ldLnJ4OworCWlmICh1bmxpa2VseSghKF9kLT5kbWEuc3RhdHVzICYgUlhfRE1BX1NUQVRVU19EVSkpKSB7CiAJCS8qIGl0IGlzIG5vdCBlcnJvciwgd2UganVzdCByZWFjaGVkIGVuZCBvZiBSeCBkb25lIGFyZWEgKi8KIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0Jc2tiID0gdnJpbmctPmN0eFt2cmluZy0+c3doZWFkXS5za2I7CisJc2tiID0gdnJpbmctPmN0eFtpXS5za2I7CisJdnJpbmctPmN0eFtpXS5za2IgPSBOVUxMOworCXdpbF92cmluZ19hZHZhbmNlX2hlYWQodnJpbmcsIDEpOworCWlmICghc2tiKSB7CisJCXdpbF9lcnIod2lsLCAiTm8gUnggc2tiIGF0IFslZF1cbiIsIGkpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAJZCA9IHdpbF9za2JfcnhkZXNjKHNrYik7CiAJKmQgPSAqX2Q7CiAJcGEgPSB3aWxfZGVzY19hZGRyKCZkLT5kbWEuYWRkcik7Ci0JdnJpbmctPmN0eFt2cmluZy0+c3doZWFkXS5za2IgPSBOVUxMOwotCXdpbF92cmluZ19hZHZhbmNlX2hlYWQodnJpbmcsIDEpOwogCiAJZG1hX3VubWFwX3NpbmdsZShkZXYsIHBhLCBzeiwgRE1BX0ZST01fREVWSUNFKTsKIAlkbWFsZW4gPSBsZTE2X3RvX2NwdShkLT5kbWEubGVuZ3RoKTsKIAotCXRyYWNlX3dpbDYyMTBfcngodnJpbmctPnN3aGVhZCwgZCk7Ci0Jd2lsX2RiZ190eHJ4KHdpbCwgIlJ4WyUzZF0gOiAlZCBieXRlc1xuIiwgdnJpbmctPnN3aGVhZCwgZG1hbGVuKTsKKwl0cmFjZV93aWw2MjEwX3J4KGksIGQpOworCXdpbF9kYmdfdHhyeCh3aWwsICJSeFslM2RdIDogJWQgYnl0ZXNcbiIsIGksIGRtYWxlbik7CiAJd2lsX2hleF9kdW1wX3R4cngoIlJ4ICIsIERVTVBfUFJFRklYX05PTkUsIDMyLCA0LAogCQkJICAoY29uc3Qgdm9pZCAqKWQsIHNpemVvZigqZCksIGZhbHNlKTsKIAotCWlmIChkbWFsZW4gPiBzeikgeworCWlmICh1bmxpa2VseShkbWFsZW4gPiBzeikpIHsKIAkJd2lsX2Vycih3aWwsICJSeCBzaXplIHRvbyBsYXJnZTogJWQgYnl0ZXMhXG4iLCBkbWFsZW4pOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC00NDUsMTQgKzQ0MSwxNCBAQAogCSAqIGluIFJ4IGRlc2NyaXB0b3IuIElmIHR5cGUgaXMgbm90IGRhdGEsIGl0IGlzIDgwMi4xMSBmcmFtZSBhcyBpcwogCSAqLwogCWZ0eXBlID0gd2lsX3J4ZGVzY19mdHlwZShkKSA8PCAyOwotCWlmIChmdHlwZSAhPSBJRUVFODAyMTFfRlRZUEVfREFUQSkgeworCWlmICh1bmxpa2VseShmdHlwZSAhPSBJRUVFODAyMTFfRlRZUEVfREFUQSkpIHsKIAkJd2lsX2RiZ190eHJ4KHdpbCwgIk5vbi1kYXRhIGZyYW1lIGZ0eXBlIDB4JTA4eFxuIiwgZnR5cGUpOwogCQkvKiBUT0RPOiBwcm9jZXNzIGl0ICovCiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpZiAoc2tiLT5sZW4gPCBFVEhfSExFTikgeworCWlmICh1bmxpa2VseShza2ItPmxlbiA8IEVUSF9ITEVOICsgc25hcGxlbikpIHsKIAkJd2lsX2Vycih3aWwsICJTaG9ydCBmcmFtZSwgbGVuID0gJWRcbiIsIHNrYi0+bGVuKTsKIAkJLyogVE9ETzogcHJvY2VzcyBpdCAoaS5lLiBCQVIpICovCiAJCWtmcmVlX3NrYihza2IpOwpAQCAtNDYzLDkgKzQ1OSw5IEBACiAJICogYW5kIGluIGNhc2Ugb2YgZXJyb3IgZHJvcCB0aGUgcGFja2V0CiAJICogaGlnaGVyIHN0YWNrIGxheWVycyB3aWxsIGhhbmRsZSByZXRyYW5zbWlzc2lvbiAoaWYgcmVxdWlyZWQpCiAJICovCi0JaWYgKGQtPmRtYS5zdGF0dXMgJiBSWF9ETUFfU1RBVFVTX0w0SSkgeworCWlmIChsaWtlbHkoZC0+ZG1hLnN0YXR1cyAmIFJYX0RNQV9TVEFUVVNfTDRJKSkgewogCQkvKiBMNCBwcm90b2NvbCBpZGVudGlmaWVkLCBjc3VtIGNhbGN1bGF0ZWQgKi8KLQkJaWYgKChkLT5kbWEuZXJyb3IgJiBSWF9ETUFfRVJST1JfTDRfRVJSKSA9PSAwKQorCQlpZiAobGlrZWx5KChkLT5kbWEuZXJyb3IgJiBSWF9ETUFfRVJST1JfTDRfRVJSKSA9PSAwKSkKIAkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJCS8qIElmIEhXIHJlcG9ydHMgYmFkIGNoZWNrc3VtLCBsZXQgSVAgc3RhY2sgcmUtY2hlY2sgaXQKIAkJICogRm9yIGV4YW1wbGUsIEhXIGRvbid0IHVuZGVyc3RhbmQgTWljcm9zb2Z0IElQIHN0YWNrIHRoYXQKQEAgLTQ3NCwxMyArNDcwLDE1IEBACiAJCSAqLwogCX0KIAotCWRzX2JpdHMgPSB3aWxfcnhkZXNjX2RzX2JpdHMoZCk7Ci0JaWYgKGRzX2JpdHMgPT0gMSkgewotCQkvKgotCQkgKiBIVyBidWcgLSBpbiBUb0RTIG1vZGUsIGkuZS4gUnggb24gQVAgc2lkZSwKLQkJICogYWRkcmVzc2VzIGdldCBzd2FwcGVkCisJaWYgKHNuYXBsZW4pIHsKKwkJLyogUGFja2V0IGxheW91dAorCQkgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tKworCQkgKiB8IFNBKDYpIHwgREEoNikgfCBTTkFQKDYpIHwgRVRIVFlQRSgyKSB8IERBVEEgfAorCQkgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tKworCQkgKiBOZWVkIHRvIHJlbW92ZSBTTkFQLCBzaGlmdGluZyBTQSBhbmQgREEgZm9yd2FyZAogCQkgKi8KLQkJd2lsX3N3YXBfZXRoYWRkcihza2ItPmRhdGEpOworCQltZW1tb3ZlKHNrYi0+ZGF0YSArIHNuYXBsZW4sIHNrYi0+ZGF0YSwgMiAqIEVUSF9BTEVOKTsKKwkJc2tiX3B1bGwoc2tiLCBzbmFwbGVuKTsKIAl9CiAKIAlyZXR1cm4gc2tiOwpAQCAtNTAzLDcgKzUwMSw3IEBACiAJCQkobmV4dF90YWlsICE9IHYtPnN3aGVhZCkgJiYgKGNvdW50LS0gPiAwKTsKIAkJCXYtPnN3dGFpbCA9IG5leHRfdGFpbCkgewogCQlyYyA9IHdpbF92cmluZ19hbGxvY19za2Iod2lsLCB2LCB2LT5zd3RhaWwsIGhlYWRyb29tKTsKLQkJaWYgKHJjKSB7CisJCWlmICh1bmxpa2VseShyYykpIHsKIAkJCXdpbF9lcnIod2lsLCAiRXJyb3IgJWQgaW4gd2lsX3J4X3JlZmlsbFslZF1cbiIsCiAJCQkJcmMsIHYtPnN3dGFpbCk7CiAJCQlicmVhazsKQEAgLTUyMCwxNyArNTE4LDcxIEBACiAgKi8KIHZvaWQgd2lsX25ldGlmX3J4X2FueShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlncm9fcmVzdWx0X3QgcmM7CisJZ3JvX3Jlc3VsdF90IHJjID0gR1JPX05PUk1BTDsKIAlzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwgPSBuZGV2X3RvX3dpbChuZGV2KTsKKwlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gd2lsX3RvX3dkZXYod2lsKTsKIAl1bnNpZ25lZCBpbnQgbGVuID0gc2tiLT5sZW47CiAJc3RydWN0IHZyaW5nX3J4X2Rlc2MgKmQgPSB3aWxfc2tiX3J4ZGVzYyhza2IpOwotCWludCBjaWQgPSB3aWxfcnhkZXNjX2NpZChkKTsKKwlpbnQgY2lkID0gd2lsX3J4ZGVzY19jaWQoZCk7IC8qIGFsd2F5cyAwLi43LCBubyBuZWVkIHRvIGNoZWNrICovCisJc3RydWN0IGV0aGhkciAqZXRoID0gKHZvaWQgKilza2ItPmRhdGE7CisJLyogaGVyZSBsb29raW5nIGZvciBEQSwgbm90IEExLCB0aHVzIFJ4ZGVzYydzICdtY2FzdCcgaW5kaWNhdGlvbgorCSAqIGlzIG5vdCBzdWl0YWJsZSwgbmVlZCB0byBsb29rIGF0IGRhdGEKKwkgKi8KKwlpbnQgbWNhc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihldGgtPmhfZGVzdCk7CiAJc3RydWN0IHdpbF9uZXRfc3RhdHMgKnN0YXRzID0gJndpbC0+c3RhW2NpZF0uc3RhdHM7CisJc3RydWN0IHNrX2J1ZmYgKnhtaXRfc2tiID0gTlVMTDsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGdyb19yZXNfc3RyW10gPSB7CisJCVtHUk9fTUVSR0VEXQkJPSAiR1JPX01FUkdFRCIsCisJCVtHUk9fTUVSR0VEX0ZSRUVdCT0gIkdST19NRVJHRURfRlJFRSIsCisJCVtHUk9fSEVMRF0JCT0gIkdST19IRUxEIiwKKwkJW0dST19OT1JNQUxdCQk9ICJHUk9fTk9STUFMIiwKKwkJW0dST19EUk9QXQkJPSAiR1JPX0RST1AiLAorCX07CiAKIAlza2Jfb3JwaGFuKHNrYik7CiAKLQlyYyA9IG5hcGlfZ3JvX3JlY2VpdmUoJndpbC0+bmFwaV9yeCwgc2tiKTsKKwlpZiAod2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX0FQICYmICF3aWwtPmFwX2lzb2xhdGUpIHsKKwkJaWYgKG1jYXN0KSB7CisJCQkvKiBzZW5kIG11bHRpY2FzdCBmcmFtZXMgYm90aCB0byBoaWdoZXIgbGF5ZXJzIGluCisJCQkgKiBsb2NhbCBuZXQgc3RhY2sgYW5kIGJhY2sgdG8gdGhlIHdpcmVsZXNzIG1lZGl1bQorCQkJICovCisJCQl4bWl0X3NrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJCX0gZWxzZSB7CisJCQlpbnQgeG1pdF9jaWQgPSB3aWxfZmluZF9jaWQod2lsLCBldGgtPmhfZGVzdCk7CiAKKwkJCWlmICh4bWl0X2NpZCA+PSAwKSB7CisJCQkJLyogVGhlIGRlc3RpbmF0aW9uIHN0YXRpb24gaXMgYXNzb2NpYXRlZCB0bworCQkJCSAqIHRoaXMgQVAgKGluIHRoaXMgVkxBTiksIHNvIHNlbmQgdGhlIGZyYW1lCisJCQkJICogZGlyZWN0bHkgdG8gaXQgYW5kIGRvIG5vdCBwYXNzIGl0IHRvIGxvY2FsCisJCQkJICogbmV0IHN0YWNrLgorCQkJCSAqLworCQkJCXhtaXRfc2tiID0gc2tiOworCQkJCXNrYiA9IE5VTEw7CisJCQl9CisJCX0KKwl9CisJaWYgKHhtaXRfc2tiKSB7CisJCS8qIFNlbmQgdG8gd2lyZWxlc3MgbWVkaWEgYW5kIGluY3JlYXNlIHByaW9yaXR5IGJ5IDI1NiB0bworCQkgKiBrZWVwIHRoZSByZWNlaXZlZCBwcmlvcml0eSBpbnN0ZWFkIG9mIHJlY2xhc3NpZnlpbmcKKwkJICogdGhlIGZyYW1lIChzZWUgY2ZnODAyMTFfY2xhc3NpZnk4MDIxZCkuCisJCSAqLworCQl4bWl0X3NrYi0+ZGV2ID0gbmRldjsKKwkJeG1pdF9za2ItPnByaW9yaXR5ICs9IDI1NjsKKwkJeG1pdF9za2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzMpOworCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoeG1pdF9za2IpOworCQlza2JfcmVzZXRfbWFjX2hlYWRlcih4bWl0X3NrYik7CisJCXdpbF9kYmdfdHhyeCh3aWwsICJSeCAtPiBUeCAlZCBieXRlc1xuIiwgbGVuKTsKKwkJZGV2X3F1ZXVlX3htaXQoeG1pdF9za2IpOworCX0KKworCWlmIChza2IpIHsgLyogZGVsaXZlciB0byBsb2NhbCBzdGFjayAqLworCisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOworCQlyYyA9IG5hcGlfZ3JvX3JlY2VpdmUoJndpbC0+bmFwaV9yeCwgc2tiKTsKKwkJd2lsX2RiZ190eHJ4KHdpbCwgIlJ4IGNvbXBsZXRlICVkIGJ5dGVzID0+ICVzXG4iLAorCQkJICAgICBsZW4sIGdyb19yZXNfc3RyW3JjXSk7CisJfQorCS8qIHN0YXRpc3RpY3MuIHJjIHNldCB0byBHUk9fTk9STUFMIGZvciBBUCBicmlkZ2luZyAqLwogCWlmICh1bmxpa2VseShyYyA9PSBHUk9fRFJPUCkpIHsKIAkJbmRldi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCQlzdGF0cy0+cnhfZHJvcHBlZCsrOwpAQCAtNTQwLDE3ICs1OTIsOCBAQAogCQlzdGF0cy0+cnhfcGFja2V0cysrOwogCQluZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CiAJCXN0YXRzLT5yeF9ieXRlcyArPSBsZW47Ci0JfQotCXsKLQkJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBncm9fcmVzX3N0cltdID0gewotCQkJW0dST19NRVJHRURdCQk9ICJHUk9fTUVSR0VEIiwKLQkJCVtHUk9fTUVSR0VEX0ZSRUVdCT0gIkdST19NRVJHRURfRlJFRSIsCi0JCQlbR1JPX0hFTERdCQk9ICJHUk9fSEVMRCIsCi0JCQlbR1JPX05PUk1BTF0JCT0gIkdST19OT1JNQUwiLAotCQkJW0dST19EUk9QXQkJPSAiR1JPX0RST1AiLAotCQl9OwotCQl3aWxfZGJnX3R4cngod2lsLCAiUnggY29tcGxldGUgJWQgYnl0ZXMgPT4gJXNcbiIsCi0JCQkgICAgIGxlbiwgZ3JvX3Jlc19zdHJbcmNdKTsKKwkJaWYgKG1jYXN0KQorCQkJbmRldi0+c3RhdHMubXVsdGljYXN0Kys7CiAJfQogfQogCkBAIC01NjUsNyArNjA4LDcgQEAKIAlzdHJ1Y3QgdnJpbmcgKnYgPSAmd2lsLT52cmluZ19yeDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JaWYgKCF2LT52YSkgeworCWlmICh1bmxpa2VseSghdi0+dmEpKSB7CiAJCXdpbF9lcnIod2lsLCAiUnggSVJRIHdoaWxlIFJ4IG5vdCB5ZXQgaW5pdGlhbGl6ZWRcbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtNTgxLDcgKzYyNCw2IEBACiAJCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOwogCQkJd2lsX25ldGlmX3J4X2FueShza2IsIG5kZXYpOwogCQl9IGVsc2UgewotCQkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgbmRldik7CiAJCQl3aWxfcnhfcmVvcmRlcih3aWwsIHNrYik7CiAJCX0KIAl9CkBAIC03MDcsNiArNzQ5LDcyIEBACiAJcmV0dXJuIHJjOwogfQogCitpbnQgd2lsX3ZyaW5nX2luaXRfYmNhc3Qoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBpbnQgaWQsIGludCBzaXplKQoreworCWludCByYzsKKwlzdHJ1Y3Qgd21pX2JjYXN0X3ZyaW5nX2NmZ19jbWQgY21kID0geworCQkuYWN0aW9uID0gY3B1X3RvX2xlMzIoV01JX1ZSSU5HX0NNRF9BREQpLAorCQkudnJpbmdfY2ZnID0geworCQkJLnR4X3N3X3JpbmcgPSB7CisJCQkJLm1heF9tcGR1X3NpemUgPQorCQkJCQljcHVfdG9fbGUxNih3aWxfbXR1Mm1hY2J1ZihtdHVfbWF4KSksCisJCQkJLnJpbmdfc2l6ZSA9IGNwdV90b19sZTE2KHNpemUpLAorCQkJfSwKKwkJCS5yaW5naWQgPSBpZCwKKwkJCS5lbmNhcF90cmFuc190eXBlID0gV01JX1ZSSU5HX0VOQ19UWVBFXzgwMl8zLAorCQl9LAorCX07CisJc3RydWN0IHsKKwkJc3RydWN0IHdpbDYyMTBfbWJveF9oZHJfd21pIHdtaTsKKwkJc3RydWN0IHdtaV92cmluZ19jZmdfZG9uZV9ldmVudCBjbWQ7CisJfSBfX3BhY2tlZCByZXBseTsKKwlzdHJ1Y3QgdnJpbmcgKnZyaW5nID0gJndpbC0+dnJpbmdfdHhbaWRdOworCXN0cnVjdCB2cmluZ190eF9kYXRhICp0eGRhdGEgPSAmd2lsLT52cmluZ190eF9kYXRhW2lkXTsKKworCXdpbF9kYmdfbWlzYyh3aWwsICIlcygpIG1heF9tcGR1X3NpemUgJWRcbiIsIF9fZnVuY19fLAorCQkgICAgIGNtZC52cmluZ19jZmcudHhfc3dfcmluZy5tYXhfbXBkdV9zaXplKTsKKworCWlmICh2cmluZy0+dmEpIHsKKwkJd2lsX2Vycih3aWwsICJUeCByaW5nIFslZF0gYWxyZWFkeSBhbGxvY2F0ZWRcbiIsIGlkKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1zZXQodHhkYXRhLCAwLCBzaXplb2YoKnR4ZGF0YSkpOworCXNwaW5fbG9ja19pbml0KCZ0eGRhdGEtPmxvY2spOworCXZyaW5nLT5zaXplID0gc2l6ZTsKKwlyYyA9IHdpbF92cmluZ19hbGxvYyh3aWwsIHZyaW5nKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisJd2lsLT52cmluZzJjaWRfdGlkW2lkXVswXSA9IFdJTDYyMTBfTUFYX0NJRDsgLyogQ0lEICovCisJd2lsLT52cmluZzJjaWRfdGlkW2lkXVsxXSA9IDA7IC8qIFRJRCAqLworCisJY21kLnZyaW5nX2NmZy50eF9zd19yaW5nLnJpbmdfbWVtX2Jhc2UgPSBjcHVfdG9fbGU2NCh2cmluZy0+cGEpOworCisJcmMgPSB3bWlfY2FsbCh3aWwsIFdNSV9CQ0FTVF9WUklOR19DRkdfQ01ESUQsICZjbWQsIHNpemVvZihjbWQpLAorCQkgICAgICBXTUlfVlJJTkdfQ0ZHX0RPTkVfRVZFTlRJRCwgJnJlcGx5LCBzaXplb2YocmVwbHkpLCAxMDApOworCWlmIChyYykKKwkJZ290byBvdXRfZnJlZTsKKworCWlmIChyZXBseS5jbWQuc3RhdHVzICE9IFdNSV9GV19TVEFUVVNfU1VDQ0VTUykgeworCQl3aWxfZXJyKHdpbCwgIlR4IGNvbmZpZyBmYWlsZWQsIHN0YXR1cyAweCUwMnhcbiIsCisJCQlyZXBseS5jbWQuc3RhdHVzKTsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlOworCX0KKwl2cmluZy0+aHd0YWlsID0gbGUzMl90b19jcHUocmVwbHkuY21kLnR4X3ZyaW5nX3RhaWxfcHRyKTsKKworCXR4ZGF0YS0+ZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gMDsKKyBvdXRfZnJlZToKKwl3aWxfdnJpbmdfZnJlZSh3aWwsIHZyaW5nLCAxKTsKKyBvdXQ6CisKKwlyZXR1cm4gcmM7Cit9CisKIHZvaWQgd2lsX3ZyaW5nX2ZpbmlfdHgoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBpbnQgaWQpCiB7CiAJc3RydWN0IHZyaW5nICp2cmluZyA9ICZ3aWwtPnZyaW5nX3R4W2lkXTsKQEAgLTczMCw3ICs4MzgsNyBAQAogCW1lbXNldCh0eGRhdGEsIDAsIHNpemVvZigqdHhkYXRhKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdnJpbmcgKndpbF9maW5kX3R4X3ZyaW5nKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwKK3N0YXRpYyBzdHJ1Y3QgdnJpbmcgKndpbF9maW5kX3R4X3VjYXN0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwKIAkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgaTsKQEAgLTc2MywxNSArODcxLDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgd2lsX3NldF9kYV9mb3JfdnJpbmcoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLAotCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdnJpbmdfaW5kZXgpCi17Ci0Jc3RydWN0IGV0aGhkciAqZXRoID0gKHZvaWQgKilza2ItPmRhdGE7Ci0JaW50IGNpZCA9IHdpbC0+dnJpbmcyY2lkX3RpZFt2cmluZ19pbmRleF1bMF07Ci0KLQltZW1jcHkoZXRoLT5oX2Rlc3QsIHdpbC0+c3RhW2NpZF0uYWRkciwgRVRIX0FMRU4pOwotfQotCiBzdGF0aWMgaW50IHdpbF90eF92cmluZyhzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIHN0cnVjdCB2cmluZyAqdnJpbmcsCiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIApAQCAtNzkyLDYgKzg5MSw5IEBACiAJCQljb250aW51ZTsKIAogCQljaWQgPSB3aWwtPnZyaW5nMmNpZF90aWRbaV1bMF07CisJCWlmIChjaWQgPj0gV0lMNjIxMF9NQVhfQ0lEKSAvKiBza2lwIEJDQVNUICovCisJCQljb250aW51ZTsKKwogCQlpZiAoIXdpbC0+c3RhW2NpZF0uZGF0YV9wb3J0X29wZW4gJiYKIAkJICAgIChza2ItPnByb3RvY29sICE9IGNwdV90b19iZTE2KEVUSF9QX1BBRSkpKQogCQkJYnJlYWs7CkBAIC04MDYsMTcgKzkwOCw1MSBAQAogCXJldHVybiBOVUxMOwogfQogCi0vKgotICogRmluZCAxLXN0IHZyaW5nIGFuZCByZXR1cm4gaXQ7IHNldCBkZXN0IGFkZHJlc3MgZm9yIHRoaXMgdnJpbmcgaW4gc2tiCi0gKiBkdXBsaWNhdGUgc2tiIGFuZCBzZW5kIGl0IHRvIG90aGVyIGFjdGl2ZSB2cmluZ3MKKy8qIFVzZSBvbmUgb2YgMiBzdHJhdGVnaWVzOgorICoKKyAqIDEuIE5ldyAocmVhbCBicm9hZGNhc3QpOgorICogICAgdXNlIGRlZGljYXRlZCBicm9hZGNhc3QgdnJpbmcKKyAqIDIuIE9sZCAocHNldWRvLURNUyk6CisgKiAgICBGaW5kIDEtc3QgdnJpbmcgYW5kIHJldHVybiBpdDsKKyAqICAgIGR1cGxpY2F0ZSBza2IgYW5kIHNlbmQgaXQgdG8gb3RoZXIgYWN0aXZlIHZyaW5nczsKKyAqICAgIGluIGFsbCBjYXNlcyBvdmVycmlkZSBkZXN0IGFkZHJlc3MgdG8gdW5pY2FzdCBwZWVyJ3MgYWRkcmVzcworICogVXNlIG9sZCBzdHJhdGVneSB3aGVuIG5ldyBpcyBub3Qgc3VwcG9ydGVkIHlldDoKKyAqICAtIGZvciBQQlNTCisgKiAgLSBmb3Igc2VjdXJlIGxpbmsKICAqLwotc3RhdGljIHN0cnVjdCB2cmluZyAqd2lsX3R4X2JjYXN0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwKLQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgc3RydWN0IHZyaW5nICp3aWxfZmluZF90eF9iY2FzdF8xKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwKKwkJCQkJIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHZyaW5nICp2OworCWludCBpID0gd2lsLT5iY2FzdF92cmluZzsKKworCWlmIChpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJdiA9ICZ3aWwtPnZyaW5nX3R4W2ldOworCWlmICghdi0+dmEpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyB2b2lkIHdpbF9zZXRfZGFfZm9yX3ZyaW5nKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHZyaW5nX2luZGV4KQoreworCXN0cnVjdCBldGhoZHIgKmV0aCA9ICh2b2lkICopc2tiLT5kYXRhOworCWludCBjaWQgPSB3aWwtPnZyaW5nMmNpZF90aWRbdnJpbmdfaW5kZXhdWzBdOworCisJZXRoZXJfYWRkcl9jb3B5KGV0aC0+aF9kZXN0LCB3aWwtPnN0YVtjaWRdLmFkZHIpOworfQorCitzdGF0aWMgc3RydWN0IHZyaW5nICp3aWxfZmluZF90eF9iY2FzdF8yKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwKKwkJCQkJIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHZyaW5nICp2LCAqdjI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CiAJaW50IGk7CiAJdTggY2lkOworCXN0cnVjdCBldGhoZHIgKmV0aCA9ICh2b2lkICopc2tiLT5kYXRhOworCWNoYXIgKnNyYyA9IGV0aC0+aF9zb3VyY2U7CiAKIAkvKiBmaW5kIDEtc3QgdnJpbmcgZWxpZ2libGUgZm9yIGRhdGEgKi8KIAlmb3IgKGkgPSAwOyBpIDwgV0lMNjIxMF9NQVhfVFhfUklOR1M7IGkrKykgewpAQCAtODI1LDkgKzk2MSwxNSBAQAogCQkJY29udGludWU7CiAKIAkJY2lkID0gd2lsLT52cmluZzJjaWRfdGlkW2ldWzBdOworCQlpZiAoY2lkID49IFdJTDYyMTBfTUFYX0NJRCkgLyogc2tpcCBCQ0FTVCAqLworCQkJY29udGludWU7CiAJCWlmICghd2lsLT5zdGFbY2lkXS5kYXRhX3BvcnRfb3BlbikKIAkJCWNvbnRpbnVlOwogCisJCS8qIGRvbid0IFR4IGJhY2sgdG8gc291cmNlIHdoZW4gcmUtcm91dGluZyBSeC0+VHggYXQgdGhlIEFQICovCisJCWlmICgwID09IG1lbWNtcCh3aWwtPnN0YVtjaWRdLmFkZHIsIHNyYywgRVRIX0FMRU4pKQorCQkJY29udGludWU7CisKIAkJZ290byBmb3VuZDsKIAl9CiAKQEAgLTg0NSw5ICs5ODcsMTQgQEAKIAkJaWYgKCF2Mi0+dmEpCiAJCQljb250aW51ZTsKIAkJY2lkID0gd2lsLT52cmluZzJjaWRfdGlkW2ldWzBdOworCQlpZiAoY2lkID49IFdJTDYyMTBfTUFYX0NJRCkgLyogc2tpcCBCQ0FTVCAqLworCQkJY29udGludWU7CiAJCWlmICghd2lsLT5zdGFbY2lkXS5kYXRhX3BvcnRfb3BlbikKIAkJCWNvbnRpbnVlOwogCisJCWlmICgwID09IG1lbWNtcCh3aWwtPnN0YVtjaWRdLmFkZHIsIHNyYywgRVRIX0FMRU4pKQorCQkJY29udGludWU7CisKIAkJc2tiMiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CiAJCWlmIChza2IyKSB7CiAJCQl3aWxfZGJnX3R4cngod2lsLCAiQkNBU1QgRFVQIC0+IHJpbmcgJWRcbiIsIGkpOwpAQCAtODYxLDYgKzEwMDgsMjAgQEAKIAlyZXR1cm4gdjsKIH0KIAorc3RhdGljIHN0cnVjdCB2cmluZyAqd2lsX2ZpbmRfdHhfYmNhc3Qoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSB3aWwtPndkZXY7CisKKwlpZiAod2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKQorCQlyZXR1cm4gd2lsX2ZpbmRfdHhfYmNhc3RfMih3aWwsIHNrYik7CisKKwlpZiAod2lsLT5wcml2YWN5KQorCQlyZXR1cm4gd2lsX2ZpbmRfdHhfYmNhc3RfMih3aWwsIHNrYik7CisKKwlyZXR1cm4gd2lsX2ZpbmRfdHhfYmNhc3RfMSh3aWwsIHNrYik7Cit9CisKIHN0YXRpYyBpbnQgd2lsX3R4X2Rlc2NfbWFwKHN0cnVjdCB2cmluZ190eF9kZXNjICpkLCBkbWFfYWRkcl90IHBhLCB1MzIgbGVuLAogCQkJICAgaW50IHZyaW5nX2luZGV4KQogewpAQCAtOTUyLDEzICsxMTEzLDE2IEBACiAJc3RydWN0IHZyaW5nX3R4X2RhdGEgKnR4ZGF0YSA9ICZ3aWwtPnZyaW5nX3R4X2RhdGFbdnJpbmdfaW5kZXhdOwogCXVpbnQgaSA9IHN3aGVhZDsKIAlkbWFfYWRkcl90IHBhOworCWludCB1c2VkOworCWJvb2wgbWNhc3QgPSAodnJpbmdfaW5kZXggPT0gd2lsLT5iY2FzdF92cmluZyk7CisJdWludCBsZW4gPSBza2JfaGVhZGxlbihza2IpOwogCiAJd2lsX2RiZ190eHJ4KHdpbCwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAogCWlmICh1bmxpa2VseSghdHhkYXRhLT5lbmFibGVkKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoYXZhaWwgPCAxICsgbnJfZnJhZ3MpIHsKKwlpZiAodW5saWtlbHkoYXZhaWwgPCAxICsgbnJfZnJhZ3MpKSB7CiAJCXdpbF9lcnJfcmF0ZWxpbWl0ZWQod2lsLAogCQkJCSAgICAiVHggcmluZ1slMmRdIGZ1bGwuIE5vIHNwYWNlIGZvciAlZCBmcmFnbWVudHNcbiIsCiAJCQkJICAgIHZyaW5nX2luZGV4LCAxICsgbnJfZnJhZ3MpOwpAQCAtOTc3LDkgKzExNDEsMTkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJdnJpbmctPmN0eFtpXS5tYXBwZWRfYXMgPSB3aWxfbWFwcGVkX2FzX3NpbmdsZTsKIAkvKiAxLXN0IHNlZ21lbnQgKi8KLQl3aWxfdHhfZGVzY19tYXAoZCwgcGEsIHNrYl9oZWFkbGVuKHNrYiksIHZyaW5nX2luZGV4KTsKKwl3aWxfdHhfZGVzY19tYXAoZCwgcGEsIGxlbiwgdnJpbmdfaW5kZXgpOworCWlmICh1bmxpa2VseShtY2FzdCkpIHsKKwkJZC0+bWFjLmRbMF0gfD0gQklUKE1BQ19DRkdfREVTQ19UWF8wX01DU19FTl9QT1MpOyAvKiBNQ1MgMCAqLworCQlpZiAodW5saWtlbHkobGVuID4gV0lMX0JDQVNUX01DUzBfTElNSVQpKSB7CisJCQkvKiBzZXQgTUNTIDEgKi8KKwkJCWQtPm1hYy5kWzBdIHw9ICgxIDw8IE1BQ19DRkdfREVTQ19UWF8wX01DU19JTkRFWF9QT1MpOworCQkJLyogcGFja2V0IG1vZGUgMiAqLworCQkJZC0+bWFjLmRbMV0gfD0gQklUKE1BQ19DRkdfREVTQ19UWF8xX1BLVF9NT0RFX0VOX1BPUykgfAorCQkJCSAgICAgICAoMiA8PCBNQUNfQ0ZHX0RFU0NfVFhfMV9QS1RfTU9ERV9QT1MpOworCQl9CisJfQogCS8qIFByb2Nlc3MgVENQL1VEUCBjaGVja3N1bSBvZmZsb2FkaW5nICovCi0JaWYgKHdpbF90eF9kZXNjX29mZmxvYWRfY2tzdW1fc2V0KHdpbCwgZCwgc2tiKSkgeworCWlmICh1bmxpa2VseSh3aWxfdHhfZGVzY19vZmZsb2FkX2Nrc3VtX3NldCh3aWwsIGQsIHNrYikpKSB7CiAJCXdpbF9lcnIod2lsLCAiVHhbJTJkXSBGYWlsZWQgdG8gc2V0IGNrc3VtLCBkcm9wIHBhY2tldFxuIiwKIAkJCXZyaW5nX2luZGV4KTsKIAkJZ290byBkbWFfZXJyb3I7CkBAIC0xMDI3LDggKzEyMDEsMTQgQEAKIAkgKi8KIAl2cmluZy0+Y3R4W2ldLnNrYiA9IHNrYl9nZXQoc2tiKTsKIAotCWlmICh3aWxfdnJpbmdfaXNfZW1wdHkodnJpbmcpKSAvKiBwZXJmb3JtYW5jZSBtb25pdG9yaW5nICovCisJLyogcGVyZm9ybWFuY2UgbW9uaXRvcmluZyAqLworCXVzZWQgPSB3aWxfdnJpbmdfdXNlZF90eCh2cmluZyk7CisJaWYgKHdpbF92YWxfaW5fcmFuZ2UodnJpbmdfaWRsZV90cnNoLAorCQkJICAgICB1c2VkLCB1c2VkICsgbnJfZnJhZ3MgKyAxKSkgewogCQl0eGRhdGEtPmlkbGUgKz0gZ2V0X2N5Y2xlcygpIC0gdHhkYXRhLT5sYXN0X2lkbGU7CisJCXdpbF9kYmdfdHhyeCh3aWwsICAiUmluZ1slMmRdIG5vdCBpZGxlICVkIC0+ICVkXG4iLAorCQkJICAgICB2cmluZ19pbmRleCwgdXNlZCwgdXNlZCArIG5yX2ZyYWdzICsgMSk7CisJfQogCiAJLyogYWR2YW5jZSBzd2hlYWQgKi8KIAl3aWxfdnJpbmdfYWR2YW5jZV9oZWFkKHZyaW5nLCBucl9mcmFncyArIDEpOwpAQCAtMTA3NywyMyArMTI1NywyNCBAQAogewogCXN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCA9IG5kZXZfdG9fd2lsKG5kZXYpOwogCXN0cnVjdCBldGhoZHIgKmV0aCA9ICh2b2lkICopc2tiLT5kYXRhOworCWJvb2wgYmNhc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihldGgtPmhfZGVzdCk7CiAJc3RydWN0IHZyaW5nICp2cmluZzsKIAlzdGF0aWMgYm9vbCBwcl9vbmNlX2Z3OwogCWludCByYzsKIAogCXdpbF9kYmdfdHhyeCh3aWwsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKCF0ZXN0X2JpdCh3aWxfc3RhdHVzX2Z3cmVhZHksIHdpbC0+c3RhdHVzKSkgeworCWlmICh1bmxpa2VseSghdGVzdF9iaXQod2lsX3N0YXR1c19md3JlYWR5LCB3aWwtPnN0YXR1cykpKSB7CiAJCWlmICghcHJfb25jZV9mdykgewogCQkJd2lsX2Vycih3aWwsICJGVyBub3QgcmVhZHlcbiIpOwogCQkJcHJfb25jZV9mdyA9IHRydWU7CiAJCX0KIAkJZ290byBkcm9wOwogCX0KLQlpZiAoIXRlc3RfYml0KHdpbF9zdGF0dXNfZndjb25uZWN0ZWQsIHdpbC0+c3RhdHVzKSkgeworCWlmICh1bmxpa2VseSghdGVzdF9iaXQod2lsX3N0YXR1c19md2Nvbm5lY3RlZCwgd2lsLT5zdGF0dXMpKSkgewogCQl3aWxfZXJyKHdpbCwgIkZXIG5vdCBjb25uZWN0ZWRcbiIpOwogCQlnb3RvIGRyb3A7CiAJfQotCWlmICh3aWwtPndkZXYtPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKSB7CisJaWYgKHVubGlrZWx5KHdpbC0+d2Rldi0+aWZ0eXBlID09IE5MODAyMTFfSUZUWVBFX01PTklUT1IpKSB7CiAJCXdpbF9lcnIod2lsLCAiWG1pdCBpbiBtb25pdG9yIG1vZGUgbm90IHN1cHBvcnRlZFxuIik7CiAJCWdvdG8gZHJvcDsKIAl9CkBAIC0xMTA0LDEyICsxMjg1LDEwIEBACiAJCS8qIGluIFNUQSBtb2RlIChFU1MpLCBhbGwgdG8gc2FtZSBWUklORyAqLwogCQl2cmluZyA9IHdpbF9maW5kX3R4X3ZyaW5nX3N0YSh3aWwsIHNrYik7CiAJfSBlbHNlIHsgLyogZGlyZWN0IGNvbW11bmljYXRpb24sIGZpbmQgbWF0Y2hpbmcgVlJJTkcgKi8KLQkJaWYgKGlzX3VuaWNhc3RfZXRoZXJfYWRkcihldGgtPmhfZGVzdCkpCi0JCQl2cmluZyA9IHdpbF9maW5kX3R4X3ZyaW5nKHdpbCwgc2tiKTsKLQkJZWxzZQotCQkJdnJpbmcgPSB3aWxfdHhfYmNhc3Qod2lsLCBza2IpOworCQl2cmluZyA9IGJjYXN0ID8gd2lsX2ZpbmRfdHhfYmNhc3Qod2lsLCBza2IpIDoKKwkJCQl3aWxfZmluZF90eF91Y2FzdCh3aWwsIHNrYik7CiAJfQotCWlmICghdnJpbmcpIHsKKwlpZiAodW5saWtlbHkoIXZyaW5nKSkgewogCQl3aWxfZGJnX3R4cngod2lsLCAiTm8gVHggVlJJTkcgZm91bmQgZm9yICVwTVxuIiwgZXRoLT5oX2Rlc3QpOwogCQlnb3RvIGRyb3A7CiAJfQpAQCAtMTExNyw3ICsxMjk2LDcgQEAKIAlyYyA9IHdpbF90eF92cmluZyh3aWwsIHZyaW5nLCBza2IpOwogCiAJLyogZG8gd2Ugc3RpbGwgaGF2ZSBlbm91Z2ggcm9vbSBpbiB0aGUgdnJpbmc/ICovCi0JaWYgKHdpbF92cmluZ19hdmFpbF90eCh2cmluZykgPCB3aWxfdnJpbmdfd21hcmtfbG93KHZyaW5nKSkgeworCWlmICh1bmxpa2VseSh3aWxfdnJpbmdfYXZhaWxfdHgodnJpbmcpIDwgd2lsX3ZyaW5nX3dtYXJrX2xvdyh2cmluZykpKSB7CiAJCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyh3aWxfdG9fbmRldih3aWwpKTsKIAkJd2lsX2RiZ190eHJ4KHdpbCwgIm5ldGlmX3R4X3N0b3AgOiByaW5nIGZ1bGxcbiIpOwogCX0KQEAgLTExNzAsMjEgKzEzNDksMjggQEAKIAlzdHJ1Y3QgdnJpbmdfdHhfZGF0YSAqdHhkYXRhID0gJndpbC0+dnJpbmdfdHhfZGF0YVtyaW5naWRdOwogCWludCBkb25lID0gMDsKIAlpbnQgY2lkID0gd2lsLT52cmluZzJjaWRfdGlkW3JpbmdpZF1bMF07Ci0Jc3RydWN0IHdpbF9uZXRfc3RhdHMgKnN0YXRzID0gJndpbC0+c3RhW2NpZF0uc3RhdHM7CisJc3RydWN0IHdpbF9uZXRfc3RhdHMgKnN0YXRzID0gTlVMTDsKIAl2b2xhdGlsZSBzdHJ1Y3QgdnJpbmdfdHhfZGVzYyAqX2Q7CisJaW50IHVzZWRfYmVmb3JlX2NvbXBsZXRlOworCWludCB1c2VkX25ldzsKIAotCWlmICghdnJpbmctPnZhKSB7CisJaWYgKHVubGlrZWx5KCF2cmluZy0+dmEpKSB7CiAJCXdpbF9lcnIod2lsLCAiVHggaXJxWyVkXTogdnJpbmcgbm90IGluaXRpYWxpemVkXG4iLCByaW5naWQpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIXR4ZGF0YS0+ZW5hYmxlZCkgeworCWlmICh1bmxpa2VseSghdHhkYXRhLT5lbmFibGVkKSkgewogCQl3aWxfaW5mbyh3aWwsICJUeCBpcnFbJWRdOiB2cmluZyBkaXNhYmxlZFxuIiwgcmluZ2lkKTsKIAkJcmV0dXJuIDA7CiAJfQogCiAJd2lsX2RiZ190eHJ4KHdpbCwgIiVzKCVkKVxuIiwgX19mdW5jX18sIHJpbmdpZCk7CiAKKwl1c2VkX2JlZm9yZV9jb21wbGV0ZSA9IHdpbF92cmluZ191c2VkX3R4KHZyaW5nKTsKKworCWlmIChjaWQgPCBXSUw2MjEwX01BWF9DSUQpCisJCXN0YXRzID0gJndpbC0+c3RhW2NpZF0uc3RhdHM7CisKIAl3aGlsZSAoIXdpbF92cmluZ19pc19lbXB0eSh2cmluZykpIHsKIAkJaW50IG5ld19zd3RhaWw7CiAJCXN0cnVjdCB3aWxfY3R4ICpjdHggPSAmdnJpbmctPmN0eFt2cmluZy0+c3d0YWlsXTsKQEAgLTExOTYsNyArMTM4Miw3IEBACiAJCS8qIFRPRE86IGNoZWNrIHdlIGFyZSBub3QgcGFzdCBoZWFkICovCiAKIAkJX2QgPSAmdnJpbmctPnZhW2xmXS50eDsKLQkJaWYgKCEoX2QtPmRtYS5zdGF0dXMgJiBUWF9ETUFfU1RBVFVTX0RVKSkKKwkJaWYgKHVubGlrZWx5KCEoX2QtPmRtYS5zdGF0dXMgJiBUWF9ETUFfU1RBVFVTX0RVKSkpCiAJCQlicmVhazsKIAogCQluZXdfc3d0YWlsID0gKGxmICsgMSkgJSB2cmluZy0+c2l6ZTsKQEAgLTEyMjQsMTQgKzE0MTAsMTcgQEAKIAkJCXdpbF90eGRlc2NfdW5tYXAoZGV2LCBkLCBjdHgpOwogCiAJCQlpZiAoc2tiKSB7Ci0JCQkJaWYgKGQtPmRtYS5lcnJvciA9PSAwKSB7CisJCQkJaWYgKGxpa2VseShkLT5kbWEuZXJyb3IgPT0gMCkpIHsKIAkJCQkJbmRldi0+c3RhdHMudHhfcGFja2V0cysrOwotCQkJCQlzdGF0cy0+dHhfcGFja2V0cysrOwogCQkJCQluZGV2LT5zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKLQkJCQkJc3RhdHMtPnR4X2J5dGVzICs9IHNrYi0+bGVuOworCQkJCQlpZiAoc3RhdHMpIHsKKwkJCQkJCXN0YXRzLT50eF9wYWNrZXRzKys7CisJCQkJCQlzdGF0cy0+dHhfYnl0ZXMgKz0gc2tiLT5sZW47CisJCQkJCX0KIAkJCQl9IGVsc2UgewogCQkJCQluZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKLQkJCQkJc3RhdHMtPnR4X2Vycm9ycysrOworCQkJCQlpZiAoc3RhdHMpCisJCQkJCQlzdGF0cy0+dHhfZXJyb3JzKys7CiAJCQkJfQogCQkJCXdpbF9jb25zdW1lX3NrYihza2IsIGQtPmRtYS5lcnJvciA9PSAwKTsKIAkJCX0KQEAgLTEyNDYsOCArMTQzNSwxMiBAQAogCQl9CiAJfQogCi0JaWYgKHdpbF92cmluZ19pc19lbXB0eSh2cmluZykpIHsgLyogcGVyZm9ybWFuY2UgbW9uaXRvcmluZyAqLwotCQl3aWxfZGJnX3R4cngod2lsLCAiUmluZ1slMmRdIGVtcHR5XG4iLCByaW5naWQpOworCS8qIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgKi8KKwl1c2VkX25ldyA9IHdpbF92cmluZ191c2VkX3R4KHZyaW5nKTsKKwlpZiAod2lsX3ZhbF9pbl9yYW5nZSh2cmluZ19pZGxlX3Ryc2gsCisJCQkgICAgIHVzZWRfbmV3LCB1c2VkX2JlZm9yZV9jb21wbGV0ZSkpIHsKKwkJd2lsX2RiZ190eHJ4KHdpbCwgIlJpbmdbJTJkXSBpZGxlICVkIC0+ICVkXG4iLAorCQkJICAgICByaW5naWQsIHVzZWRfYmVmb3JlX2NvbXBsZXRlLCB1c2VkX25ldyk7CiAJCXR4ZGF0YS0+bGFzdF9pZGxlID0gZ2V0X2N5Y2xlcygpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd2lsNjIxMC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd2lsNjIxMC5oCmluZGV4IDk0NjExNTYuLjQzMTA5NzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dpbDYyMTAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93aWw2MjEwLmgKQEAgLTI3LDkgKzI3LDEyIEBACiBleHRlcm4gdW5zaWduZWQgaW50IG10dV9tYXg7CiBleHRlcm4gdW5zaWduZWQgc2hvcnQgcnhfcmluZ19vdmVyZmxvd190aHJzaDsKIGV4dGVybiBpbnQgYWdnX3dzaXplOworZXh0ZXJuIHUzMiB2cmluZ19pZGxlX3Ryc2g7CitleHRlcm4gYm9vbCByeF9hbGlnbl8yOwogCiAjZGVmaW5lIFdJTF9OQU1FICJ3aWw2MjEwIgotI2RlZmluZSBXSUxfRldfTkFNRSAid2lsNjIxMC5mdyIKKyNkZWZpbmUgV0lMX0ZXX05BTUUgIndpbDYyMTAuZnciIC8qIGNvZGUgKi8KKyNkZWZpbmUgV0lMX0ZXMl9OQU1FICJ3aWw2MjEwLmJvYXJkIiAvKiBib2FyZCAmIHJhZGlvIHBhcmFtZXRlcnMgKi8KIAogI2RlZmluZSBXSUxfTUFYX0JVU19SRVFVRVNUX0tCUFMgODAwMDAwIC8qIH42LjFHYnBzICovCiAKQEAgLTQ3LDYgKzUwLDggQEAKICNkZWZpbmUgV0lMX1RYX1FfTEVOX0RFRkFVTFQJCSg0MDAwKQogI2RlZmluZSBXSUxfUlhfUklOR19TSVpFX09SREVSX0RFRkFVTFQJKDEwKQogI2RlZmluZSBXSUxfVFhfUklOR19TSVpFX09SREVSX0RFRkFVTFQJKDEwKQorI2RlZmluZSBXSUxfQkNBU1RfUklOR19TSVpFX09SREVSX0RFRkFVTFQJKDcpCisjZGVmaW5lIFdJTF9CQ0FTVF9NQ1MwX0xJTUlUCQkoMTAyNCkgLyogbGltaXQgZm9yIE1DUzAgZnJhbWUgc2l6ZSAqLwogLyogbGltaXQgcmluZyBzaXplIGluIHJhbmdlIFszMi4uMzJrXSAqLwogI2RlZmluZSBXSUxfUklOR19TSVpFX09SREVSX01JTgkoNSkKICNkZWZpbmUgV0lMX1JJTkdfU0laRV9PUkRFUl9NQVgJKDE1KQpAQCAtMTIwLDYgKzEyNSwxNiBAQAogCXUzMiBJTUM7IC8qIE1hc2sgQ2xlYXIsIHdyaXRlIDEgdG8gY2xlYXIgKi8KIH0gX19wYWNrZWQ7CiAKK3N0cnVjdCBSR0ZfQkwgeworCXUzMiByZWFkeTsJCS8qIDB4ODgwQTNDIGJpdCBbMF0gKi8KKyNkZWZpbmUgQklUX0JMX1JFQURZCUJJVCgwKQorCXUzMiB2ZXJzaW9uOwkJLyogMHg4ODBBNDAgdmVyc2lvbiBvZiB0aGUgQkwgc3RydWN0ICovCisJdTMyIHJmX3R5cGU7CQkvKiAweDg4MEE0NCBJRCBvZiB0aGUgY29ubmVjdGVkIFJGICovCisJdTMyIGJhc2ViYW5kX3R5cGU7CS8qIDB4ODgwQTQ4IElEIG9mIHRoZSBiYXNlYmFuZCAqLworCXU4ICBtYWNfYWRkcmVzc1tFVEhfQUxFTl07IC8qIDB4ODgwQTRDIHBlcm1hbmVudCBNQUMgKi8KKwl1OCBwYWRbMl07Cit9IF9fcGFja2VkOworCiAvKiByZWdpc3RlcnMgLSBGVyBhZGRyZXNzZXMgKi8KICNkZWZpbmUgUkdGX1VTRVJfVVNBR0VfMQkJKDB4ODgwMDA0KQogI2RlZmluZSBSR0ZfVVNFUl9VU0FHRV82CQkoMHg4ODAwMTgpCkBAIC0xMzAsNiArMTQ1LDcgQEAKICNkZWZpbmUgUkdGX1VTRVJfTUFDX0NQVV8wCQkoMHg4ODAxZmMpCiAJI2RlZmluZSBCSVRfVVNFUl9NQUNfQ1BVX01BTl9SU1QJQklUKDEpIC8qIG1hY19jcHVfbWFuX3JzdCAqLwogI2RlZmluZSBSR0ZfVVNFUl9VU0VSX1NDUkFUQ0hfUEFECSgweDg4MDJiYykKKyNkZWZpbmUgUkdGX1VTRVJfQkwJCQkoMHg4ODBBM0MpIC8qIEJvb3QgTG9hZGVyICovCiAjZGVmaW5lIFJHRl9VU0VSX0ZXX1JFVl9JRAkJKDB4ODgwYThjKSAvKiBjaGlwIHJldmlzaW9uICovCiAjZGVmaW5lIFJHRl9VU0VSX0NMS1NfQ1RMXzAJCSgweDg4MGFiYykKIAkjZGVmaW5lIEJJVF9VU0VSX0NMS1NfQ0FSX0FIQl9TV19TRUwJQklUKDEpIC8qIHJlZiBjbGsvUExMICovCkBAIC0xNjksNiArMTg1LDEzIEBACiAJI2RlZmluZSBCSVRfRE1BX0lUUl9DTlRfQ1JMX0NMUgkJQklUKDMpCiAJI2RlZmluZSBCSVRfRE1BX0lUUl9DTlRfQ1JMX1JFQUNIX1RSU0gJQklUKDQpCiAKKy8qIE9mZmxvYWQgY29udHJvbCAoU3BhcnJvdyBCMCspICovCisjZGVmaW5lIFJHRl9ETUFfT0ZVTF9OSURfMAkJKDB4ODgxY2Q0KQorCSNkZWZpbmUgQklUX0RNQV9PRlVMX05JRF8wX1JYX0VYVF9UUl9FTgkJQklUKDApCisJI2RlZmluZSBCSVRfRE1BX09GVUxfTklEXzBfVFhfRVhUX1RSX0VOCQlCSVQoMSkKKwkjZGVmaW5lIEJJVF9ETUFfT0ZVTF9OSURfMF9SWF9FWFRfQTNfU1JDCUJJVCgyKQorCSNkZWZpbmUgQklUX0RNQV9PRlVMX05JRF8wX1RYX0VYVF9BM19TUkMJQklUKDMpCisKIC8qIE5ldyAoc3BhcnJvdyB2MispIGludGVycnVwdCBtb2RlcmF0aW9uIGNvbnRyb2wgKi8KICNkZWZpbmUgUkdGX0RNQV9JVFJfVFhfREVTUV9OT19NT0QJCSgweDg4MWQ0MCkKICNkZWZpbmUgUkdGX0RNQV9JVFJfVFhfQ05UX1RSU0gJCQkoMHg4ODFkMzQpCkBAIC0yMjksMTYgKzI1MiwxMCBAQAogCSNkZWZpbmUgQklUX0NBRl9PU0NfRElHX1hUQUxfU1RBQkxFCUJJVCgwKQogCiAjZGVmaW5lIFJHRl9VU0VSX0pUQUdfREVWX0lECSgweDg4MGIzNCkgLyogZGV2aWNlIElEICovCi0JI2RlZmluZSBKVEFHX0RFVl9JRF9NQVJMT05fQjAJKDB4MDYxMjA3MmYpCi0JI2RlZmluZSBKVEFHX0RFVl9JRF9TUEFSUk9XX0EwCSgweDA2MzIwNzJmKQotCSNkZWZpbmUgSlRBR19ERVZfSURfU1BBUlJPV19BMQkoMHgxNjMyMDcyZikKIAkjZGVmaW5lIEpUQUdfREVWX0lEX1NQQVJST1dfQjAJKDB4MjYzMjA3MmYpCiAKIGVudW0gewogCUhXX1ZFUl9VTktOT1dOLAotCUhXX1ZFUl9NQVJMT05fQjAsICAvKiBKVEFHX0RFVl9JRF9NQVJMT05fQjAgICovCi0JSFdfVkVSX1NQQVJST1dfQTAsIC8qIEpUQUdfREVWX0lEX1NQQVJST1dfQTAgKi8KLQlIV19WRVJfU1BBUlJPV19BMSwgLyogSlRBR19ERVZfSURfU1BBUlJPV19BMSAqLwogCUhXX1ZFUl9TUEFSUk9XX0IwLCAvKiBKVEFHX0RFVl9JRF9TUEFSUk9XX0IwICovCiB9OwogCkBAIC00ODIsOCArNDk5LDYgQEAKIH07CiAKIGVudW0gewotCWh3X2NhcGFiaWxpdHlfcmVzZXRfdjIgPSAwLAotCWh3X2NhcGFiaWxpdHlfYWR2YW5jZWRfaXRyX21vZGVyYXRpb24gPSAxLAogCWh3X2NhcGFiaWxpdHlfbGFzdAogfTsKIApAQCAtNTI4LDggKzU0Myw5IEBACiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7IC8qIGZvciBhbGwgd2FpdF9ldmVudCgpIHVzZSAqLwogCS8qIHByb2ZpbGUgKi8KIAl1MzIgbW9uaXRvcl9mbGFnczsKLQl1MzIgc2VjdXJlX3BjcDsgLyogY3JlYXRlIHNlY3VyZSBQQ1A/ICovCisJdTMyIHByaXZhY3k7IC8qIHNlY3VyZSBjb25uZWN0aW9uPyAqLwogCWludCBzaW5mb19nZW47CisJdTMyIGFwX2lzb2xhdGU7IC8qIG5vIGludHJhLUJTUyBjb21tdW5pY2F0aW9uICovCiAJLyogaW50ZXJydXB0IG1vZGVyYXRpb24gKi8KIAl1MzIgdHhfbWF4X2J1cnN0X2R1cmF0aW9uOwogCXUzMiB0eF9pbnRlcmZyYW1lX3RpbWVvdXQ7CkBAIC01ODEsNiArNTk3LDcgQEAKIAlzdHJ1Y3QgdnJpbmdfdHhfZGF0YSB2cmluZ190eF9kYXRhW1dJTDYyMTBfTUFYX1RYX1JJTkdTXTsKIAl1OCB2cmluZzJjaWRfdGlkW1dJTDYyMTBfTUFYX1RYX1JJTkdTXVsyXTsgLyogWzBdIC0gQ0lELCBbMV0gLSBUSUQgKi8KIAlzdHJ1Y3Qgd2lsX3N0YV9pbmZvIHN0YVtXSUw2MjEwX01BWF9DSURdOworCWludCBiY2FzdF92cmluZzsKIAkvKiBzY2FuICovCiAJc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqc2Nhbl9yZXF1ZXN0OwogCkBAIC02NTgsNyArNjc1LDcgQEAKIHZvaWQgd2lsX2lmX3JlbW92ZShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOwogaW50IHdpbF9wcml2X2luaXQoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKIHZvaWQgd2lsX3ByaXZfZGVpbml0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7Ci1pbnQgd2lsX3Jlc2V0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7CitpbnQgd2lsX3Jlc2V0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgYm9vbCBub19mdyk7CiB2b2lkIHdpbF9md19lcnJvcl9yZWNvdmVyeShzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwpOwogdm9pZCB3aWxfc2V0X3JlY292ZXJ5X3N0YXRlKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgaW50IHN0YXRlKTsKIGludCB3aWxfdXAoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsKTsKQEAgLTc0Myw2ICs3NjAsOSBAQAogaW50IHdpbF92cmluZ19pbml0X3R4KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgaW50IGlkLCBpbnQgc2l6ZSwKIAkJICAgICAgaW50IGNpZCwgaW50IHRpZCk7CiB2b2lkIHdpbF92cmluZ19maW5pX3R4KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCwgaW50IGlkKTsKK2ludCB3aWxfdnJpbmdfaW5pdF9iY2FzdChzdHJ1Y3Qgd2lsNjIxMF9wcml2ICp3aWwsIGludCBpZCwgaW50IHNpemUpOworaW50IHdpbF9iY2FzdF9pbml0KHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7Cit2b2lkIHdpbF9iY2FzdF9maW5pKHN0cnVjdCB3aWw2MjEwX3ByaXYgKndpbCk7CiAKIG5ldGRldl90eF90IHdpbF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKIGludCB3aWxfdHhfY29tcGxldGUoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBpbnQgcmluZ2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd21pLmMKaW5kZXggMGYzZTQzMy4uOWZlMjA4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd21pLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3dpbDYyMTAvd21pLmMKQEAgLTI4MSw3ICsyODEsNiBAQAogLyo9PT0gRXZlbnQgaGFuZGxlcnMgPT09Ki8KIHN0YXRpYyB2b2lkIHdtaV9ldnRfcmVhZHkoc3RydWN0IHdpbDYyMTBfcHJpdiAqd2lsLCBpbnQgaWQsIHZvaWQgKmQsIGludCBsZW4pCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSB3aWxfdG9fbmRldih3aWwpOwogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSB3aWwtPndkZXY7CiAJc3RydWN0IHdtaV9yZWFkeV9ldmVudCAqZXZ0ID0gZDsKIApAQCAtMjkwLDExICsyODksNyBAQAogCiAJd2lsX2luZm8od2lsLCAiRlcgdmVyLiAlZDsgTUFDICVwTTsgJWQgTUlEJ3NcbiIsIHdpbC0+ZndfdmVyc2lvbiwKIAkJIGV2dC0+bWFjLCB3aWwtPm5fbWlkcyk7Ci0KLQlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobmRldi0+ZGV2X2FkZHIpKSB7Ci0JCW1lbWNweShuZGV2LT5kZXZfYWRkciwgZXZ0LT5tYWMsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KG5kZXYtPnBlcm1fYWRkciwgZXZ0LT5tYWMsIEVUSF9BTEVOKTsKLQl9CisJLyogaWdub3JlIE1BQyBhZGRyZXNzLCB3ZSBhbHJlYWR5IGhhdmUgaXQgZnJvbSB0aGUgYm9vdCBsb2FkZXIgKi8KIAlzbnByaW50Zih3ZGV2LT53aXBoeS0+ZndfdmVyc2lvbiwgc2l6ZW9mKHdkZXYtPndpcGh5LT5md192ZXJzaW9uKSwKIAkJICIlZCIsIHdpbC0+ZndfdmVyc2lvbik7CiB9CkBAIC00NzEsNyArNDY2LDcgQEAKIAogCS8qIEZJWE1FIEZXIGNhbiB0cmFuc21pdCBvbmx5IHVjYXN0IGZyYW1lcyB0byBwZWVyICovCiAJLyogRklYTUUgcmVhbCByaW5nX2lkIGluc3RlYWQgb2YgaGFyZCBjb2RlZCAwICovCi0JbWVtY3B5KHdpbC0+c3RhW2V2dC0+Y2lkXS5hZGRyLCBldnQtPmJzc2lkLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHdpbC0+c3RhW2V2dC0+Y2lkXS5hZGRyLCBldnQtPmJzc2lkKTsKIAl3aWwtPnN0YVtldnQtPmNpZF0uc3RhdHVzID0gd2lsX3N0YV9jb25uX3BlbmRpbmc7CiAKIAl3aWwtPnBlbmRpbmdfY29ubmVjdF9jaWQgPSBldnQtPmNpZDsKQEAgLTUyOSw4ICs1MjQsOCBAQAogCX0KIAogCWV0aCA9IChzdHJ1Y3QgZXRoaGRyICopc2tiX3B1dChza2IsIEVUSF9ITEVOKTsKLQltZW1jcHkoZXRoLT5oX2Rlc3QsIG5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGV0aC0+aF9zb3VyY2UsIGV2dC0+c3JjX21hYywgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShldGgtPmhfZGVzdCwgbmRldi0+ZGV2X2FkZHIpOworCWV0aGVyX2FkZHJfY29weShldGgtPmhfc291cmNlLCBldnQtPnNyY19tYWMpOwogCWV0aC0+aF9wcm90byA9IGNwdV90b19iZTE2KEVUSF9QX1BBRSk7CiAJbWVtY3B5KHNrYl9wdXQoc2tiLCBlYXBvbF9sZW4pLCBldnQtPmVhcG9sLCBlYXBvbF9sZW4pOwogCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5kZXYpOwpAQCAtODU2LDcgKzg1MSw3IEBACiB7CiAJc3RydWN0IHdtaV9zZXRfbWFjX2FkZHJlc3NfY21kIGNtZDsKIAotCW1lbWNweShjbWQubWFjLCBhZGRyLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KGNtZC5tYWMsIGFkZHIpOwogCiAJd2lsX2RiZ193bWkod2lsLCAiU2V0IE1BQyAlcE1cbiIsIGFkZHIpOwogCkBAIC04NzksNyArODc0LDcgQEAKIAkJc3RydWN0IHdtaV9wY3Bfc3RhcnRlZF9ldmVudCBldnQ7CiAJfSBfX3BhY2tlZCByZXBseTsKIAotCWlmICghd2lsLT5zZWN1cmVfcGNwKQorCWlmICghd2lsLT5wcml2YWN5KQogCQljbWQuZGlzYWJsZV9zZWMgPSAxOwogCiAJaWYgKChjbWQucGNwX21heF9hc3NvY19zdGEgPiBXSUw2MjEwX01BWF9DSUQpIHx8CkBAIC0xMTE0LDYgKzExMDksMTEgQEAKIAkJICovCiAJCWNtZC5sM19sNF9jdHJsIHw9ICgxIDw8IEwzX0w0X0NUUkxfVENQSVBfQ0hFQ0tTVU1fRU5fUE9TKTsKIAl9CisKKwlpZiAocnhfYWxpZ25fMikKKwkJY21kLmwyXzgwMl8zX29mZmxvYWRfY3RybCB8PQorCQkJCUwyXzgwMl8zX09GRkxPQURfQ1RSTF9TTkFQX0tFRVBfTVNLOworCiAJLyogdHlwaWNhbCB0aW1lIGZvciBzZWN1cmUgUENQIGlzIDg0MG1zICovCiAJcmMgPSB3bWlfY2FsbCh3aWwsIFdNSV9DRkdfUlhfQ0hBSU5fQ01ESUQsICZjbWQsIHNpemVvZihjbWQpLAogCQkgICAgICBXTUlfQ0ZHX1JYX0NIQUlOX0RPTkVfRVZFTlRJRCwgJmV2dCwgc2l6ZW9mKGV2dCksIDIwMDApOwpAQCAtMTE2Miw3ICsxMTYyLDggQEAKIAlzdHJ1Y3Qgd21pX2Rpc2Nvbm5lY3Rfc3RhX2NtZCBjbWQgPSB7CiAJCS5kaXNjb25uZWN0X3JlYXNvbiA9IGNwdV90b19sZTE2KHJlYXNvbiksCiAJfTsKLQltZW1jcHkoY21kLmRzdF9tYWMsIG1hYywgRVRIX0FMRU4pOworCisJZXRoZXJfYWRkcl9jb3B5KGNtZC5kc3RfbWFjLCBtYWMpOwogCiAJd2lsX2RiZ193bWkod2lsLCAiJXMoJXBNLCByZWFzb24gJWQpXG4iLCBfX2Z1bmNfXywgbWFjLCByZWFzb24pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvd2lsNjIxMC93bWkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5oCmluZGV4IDhhNGFmNjEuLmIyOTA1NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC93aWw2MjEwL3dtaS5oCkBAIC03MCw3ICs3MCw2IEBACiAJV01JX1NFVF9VQ09ERV9JRExFX0NNRElECT0gMHgwODEzLAogCVdNSV9TRVRfV09SS19NT0RFX0NNRElECQk9IDB4MDgxNSwKIAlXTUlfTE9fTEVBS0FHRV9DQUxJQl9DTURJRAk9IDB4MDgxNiwKLQlXTUlfTUFSTE9OX1JfQUNUSVZBVEVfQ01ESUQJPSAweDA4MTcsCiAJV01JX01BUkxPTl9SX1JFQURfQ01ESUQJCT0gMHgwODE4LAogCVdNSV9NQVJMT05fUl9XUklURV9DTURJRAk9IDB4MDgxOSwKIAlXTUlfTUFSTE9OX1JfVFhSWF9TRUxfQ01ESUQJPSAweDA4MWEsCkBAIC04MCw2ICs3OSw3IEBACiAJV01JX1JGX1JYX1RFU1RfQ01ESUQJCT0gMHgwODFlLAogCVdNSV9DRkdfUlhfQ0hBSU5fQ01ESUQJCT0gMHgwODIwLAogCVdNSV9WUklOR19DRkdfQ01ESUQJCT0gMHgwODIxLAorCVdNSV9CQ0FTVF9WUklOR19DRkdfQ01ESUQJPSAweDA4MjIsCiAJV01JX1ZSSU5HX0JBX0VOX0NNRElECQk9IDB4MDgyMywKIAlXTUlfVlJJTkdfQkFfRElTX0NNRElECQk9IDB4MDgyNCwKIAlXTUlfUkNQX0FEREJBX1JFU1BfQ01ESUQJPSAweDA4MjUsCkBAIC05OSw2ICs5OSw3IEBACiAJV01JX0JGX1RYU1NfTUdNVF9DTURJRAkJPSAweDA4MzcsCiAJV01JX0JGX1NNX01HTVRfQ01ESUQJCT0gMHgwODM4LAogCVdNSV9CRl9SWFNTX01HTVRfQ01ESUQJCT0gMHgwODM5LAorCVdNSV9CRl9UUklHX0NNRElECQk9IDB4MDgzQSwKIAlXTUlfU0VUX1NFQ1RPUlNfQ01ESUQJCT0gMHgwODQ5LAogCVdNSV9NQUlOVEFJTl9QQVVTRV9DTURJRAk9IDB4MDg1MCwKIAlXTUlfTUFJTlRBSU5fUkVTVU1FX0NNRElECT0gMHgwODUxLApAQCAtNTk2LDYgKzU5NywyMiBAQAogfSBfX3BhY2tlZDsKIAogLyoKKyAqIFdNSV9CQ0FTVF9WUklOR19DRkdfQ01ESUQKKyAqLworc3RydWN0IHdtaV9iY2FzdF92cmluZ19jZmcgeworCXN0cnVjdCB3bWlfc3dfcmluZ19jZmcgdHhfc3dfcmluZzsKKwl1OCByaW5naWQ7CQkJCS8qIDAtMjMgdnJpbmdzICovCisJdTggZW5jYXBfdHJhbnNfdHlwZTsKKwl1OCBkc19jZmc7CQkJCS8qIDgwMi4zIERTIGNmZyAqLworCXU4IG53aWZpX2RzX3RyYW5zX3R5cGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd21pX2JjYXN0X3ZyaW5nX2NmZ19jbWQgeworCV9fbGUzMiBhY3Rpb247CisJc3RydWN0IHdtaV9iY2FzdF92cmluZ19jZmcgdnJpbmdfY2ZnOworfSBfX3BhY2tlZDsKKworLyoKICAqIFdNSV9WUklOR19CQV9FTl9DTURJRAogICovCiBzdHJ1Y3Qgd21pX3ZyaW5nX2JhX2VuX2NtZCB7CkBAIC02ODcsNiArNzA0LDkgQEAKIAkjZGVmaW5lIEwyXzgwMl8zX09GRkxPQURfQ1RSTF9WTEFOX1RBR19JTlNFUlRJT05fUE9TICgwKQogCSNkZWZpbmUgTDJfODAyXzNfT0ZGTE9BRF9DVFJMX1ZMQU5fVEFHX0lOU0VSVElPTl9MRU4gKDEpCiAJI2RlZmluZSBMMl84MDJfM19PRkZMT0FEX0NUUkxfVkxBTl9UQUdfSU5TRVJUSU9OX01TSyAoMHgxKQorCSNkZWZpbmUgTDJfODAyXzNfT0ZGTE9BRF9DVFJMX1NOQVBfS0VFUF9QT1MgKDEpCisJI2RlZmluZSBMMl84MDJfM19PRkZMT0FEX0NUUkxfU05BUF9LRUVQX0xFTiAoMSkKKwkjZGVmaW5lIEwyXzgwMl8zX09GRkxPQURfQ1RSTF9TTkFQX0tFRVBfTVNLICgweDIpCiAJdTggbDJfODAyXzNfb2ZmbG9hZF9jdHJsOwogCiAJI2RlZmluZSBMMl9OV0lGSV9PRkZMT0FEX0NUUkxfUkVNT1ZFX1FPU19QT1MgKDApCkBAIC04NDEsNyArODYxLDYgQEAKIAlXTUlfSVFfUlhfQ0FMSUJfRE9ORV9FVkVOVElECQk9IDB4MTgxMiwKIAlXTUlfU0VUX1dPUktfTU9ERV9ET05FX0VWRU5USUQJCT0gMHgxODE1LAogCVdNSV9MT19MRUFLQUdFX0NBTElCX0RPTkVfRVZFTlRJRAk9IDB4MTgxNiwKLQlXTUlfTUFSTE9OX1JfQUNUSVZBVEVfRE9ORV9FVkVOVElECT0gMHgxODE3LAogCVdNSV9NQVJMT05fUl9SRUFEX0RPTkVfRVZFTlRJRAkJPSAweDE4MTgsCiAJV01JX01BUkxPTl9SX1dSSVRFX0RPTkVfRVZFTlRJRAkJPSAweDE4MTksCiAJV01JX01BUkxPTl9SX1RYUlhfU0VMX0RPTkVfRVZFTlRJRAk9IDB4MTgxYSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdG1lbC5jCmluZGV4IDU1ZGI5ZjAuLjZhMWYwM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0bWVsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRtZWwuYwpAQCAtMTAwNCw3ICsxMDA0LDcgQEAKIAkJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICh2b2lkICopJm5ldGNyYywgcnhfcGFja2V0X2xvYyArIG1zZHVfc2l6ZSwgNCk7CiAJCQlpZiAoKGNyYyBeIDB4ZmZmZmZmZmYpICE9IG5ldGNyYykgewogCQkJCXByaXYtPmRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwotCQkJCW1lbXNldChwcml2LT5mcmFnX3NvdXJjZSwgMHhmZiwgRVRIX0FMRU4pOworCQkJCWV0aF9icm9hZGNhc3RfYWRkcihwcml2LT5mcmFnX3NvdXJjZSk7CiAJCQl9CiAJCX0KIApAQCAtMTAyMiw3ICsxMDIyLDcgQEAKIAkJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICh2b2lkICopJm5ldGNyYywgcnhfcGFja2V0X2xvYyArIG1zZHVfc2l6ZSwgNCk7CiAJCQlpZiAoKGNyYyBeIDB4ZmZmZmZmZmYpICE9IG5ldGNyYykgewogCQkJCXByaXYtPmRldi0+c3RhdHMucnhfY3JjX2Vycm9ycysrOwotCQkJCW1lbXNldChwcml2LT5mcmFnX3NvdXJjZSwgMHhmZiwgRVRIX0FMRU4pOworCQkJCWV0aF9icm9hZGNhc3RfYWRkcihwcml2LT5mcmFnX3NvdXJjZSk7CiAJCQkJbW9yZV9mcmFncyA9IDE7IC8qIGRvbid0IHNlbmQgYnJva2VuIGFzc2VtYmx5ICovCiAJCQl9CiAJCX0KQEAgLTEwMzEsNyArMTAzMSw3IEBACiAJCXByaXYtPmZyYWdfbm8rKzsKIAogCQlpZiAoIW1vcmVfZnJhZ3MpIHsgLyogbGFzdCBvbmUgKi8KLQkJCW1lbXNldChwcml2LT5mcmFnX3NvdXJjZSwgMHhmZiwgRVRIX0FMRU4pOworCQkJZXRoX2Jyb2FkY2FzdF9hZGRyKHByaXYtPmZyYWdfc291cmNlKTsKIAkJCWlmICghKHNrYiA9IGRldl9hbGxvY19za2IocHJpdi0+ZnJhZ19sZW4gKyAxNCkpKSB7CiAJCQkJcHJpdi0+ZGV2LT5zdGF0cy5yeF9kcm9wcGVkKys7CiAJCQl9IGVsc2UgewpAQCAtMTEyNyw3ICsxMTI3LDcgQEAKIAkJCWF0bWVsX2NvcHlfdG9faG9zdChwcml2LT5kZXYsICh1bnNpZ25lZCBjaGFyICopJnByaXYtPnJ4X2J1ZiwgcnhfcGFja2V0X2xvYyArIDI0LCBtc2R1X3NpemUpOwogCiAJCQkvKiB3ZSB1c2UgdGhlIHNhbWUgYnVmZmVyIGZvciBmcmFnIHJlYXNzZW1ibHkgYW5kIGNvbnRyb2wgcGFja2V0cyAqLwotCQkJbWVtc2V0KHByaXYtPmZyYWdfc291cmNlLCAweGZmLCBFVEhfQUxFTik7CisJCQlldGhfYnJvYWRjYXN0X2FkZHIocHJpdi0+ZnJhZ19zb3VyY2UpOwogCiAJCQlpZiAocHJpdi0+ZG9fcnhfY3JjKSB7CiAJCQkJLyogbGFzdCA0IG9jdGV0cyBpcyBjcmMgKi8KQEAgLTEzNzksNyArMTM3OSw3IEBACiAJCXdycXUuZGF0YS5sZW5ndGggPSAwOwogCQl3cnF1LmRhdGEuZmxhZ3MgPSAwOwogCQl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcih3cnF1LmFwX2FkZHIuc2FfZGF0YSk7CiAJCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+ZGV2LCBTSU9DR0lXQVAsICZ3cnF1LCBOVUxMKTsKIAl9CiAKQEAgLTE1NTUsNyArMTU1NSw3IEBACiAJcHJpdi0+bGFzdF9xdWFsID0gamlmZmllczsKIAlwcml2LT5sYXN0X2JlYWNvbl90aW1lc3RhbXAgPSAwOwogCW1lbXNldChwcml2LT5mcmFnX3NvdXJjZSwgMHhmZiwgc2l6ZW9mKHByaXYtPmZyYWdfc291cmNlKSk7Ci0JbWVtc2V0KHByaXYtPkJTU0lELCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihwcml2LT5CU1NJRCk7CiAJcHJpdi0+Q3VycmVudEJTU0lEWzBdID0gMHhGRjsgLyogSW5pdGlhbGl6ZSB0byBzb21ldGhpbmcgaW52YWxpZC4uLi4gKi8KIAlwcml2LT5zdGF0aW9uX3dhc19hc3NvY2lhdGVkID0gMDsKIApAQCAtMjc2MCw3ICsyNzYwLDcgQEAKIAkJdTggU1NJRF9zaXplOwogCX0gY21kOwogCi0JbWVtc2V0KGNtZC5CU1NJRCwgMHhmZiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcihjbWQuQlNTSUQpOwogCiAJaWYgKHByaXYtPmZhc3Rfc2NhbikgewogCQljbWQuU1NJRF9zaXplID0gcHJpdi0+U1NJRF9zaXplOwpAQCAtNDA0OSw3ICs0MDQ5LDcgQEAKIAkJd3JxdS5kYXRhLmxlbmd0aCA9IDA7CiAJCXdycXUuZGF0YS5mbGFncyA9IDA7CiAJCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKHdycXUuYXBfYWRkci5zYV9kYXRhKTsKIAkJd2lyZWxlc3Nfc2VuZF9ldmVudChwcml2LT5kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RtYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RtYS5jCmluZGV4IDFkNzk4MmEuLjY4MzcwNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kbWEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZG1hLmMKQEAgLTU1Myw3ICs1NTMsNyBAQAogCQkJCSAgc2l6ZV90IGJ1ZmZlcnNpemUsIGJvb2wgZG1hX3RvX2RldmljZSkKIHsKIAlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IocmluZy0+ZGV2LT5kZXYtPmRtYV9kZXYsIGFkZHIpKSkKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCiAJc3dpdGNoIChyaW5nLT50eXBlKSB7CiAJY2FzZSBCNDNfRE1BXzMwQklUOgpAQCAtNTcxLDEzICs1NzEsMTMgQEAKIAl9CiAKIAkvKiBUaGUgYWRkcmVzcyBpcyBPSy4gKi8KLQlyZXR1cm4gMDsKKwlyZXR1cm4gZmFsc2U7CiAKIGFkZHJlc3NfZXJyb3I6CiAJLyogV2UgY2FuJ3Qgc3VwcG9ydCB0aGlzIGFkZHJlc3MuIFVubWFwIGl0IGFnYWluLiAqLwogCXVubWFwX2Rlc2NidWZmZXIocmluZywgYWRkciwgYnVmZmVyc2l6ZSwgZG1hX3RvX2RldmljZSk7CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGJvb2wgYjQzX3J4X2J1ZmZlcl9pc19wb2lzb25lZChzdHJ1Y3QgYjQzX2RtYXJpbmcgKnJpbmcsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xMDk5LDE2ICsxMDk5LDE2IEBACiAJCQkJCSAgICBlbnVtIGI0M19kbWF0eXBlIHR5cGUpCiB7CiAJaWYgKHR5cGUgIT0gQjQzX0RNQV82NEJJVCkKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCiAjaWZkZWYgQ09ORklHX0I0M19TU0IKIAlpZiAoZGV2LT5kZXYtPmJ1c190eXBlID09IEI0M19CVVNfU1NCICYmCiAJICAgIGRldi0+ZGV2LT5zZGV2LT5idXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfUENJICYmCiAJICAgICEocGNpX2lzX3BjaWUoZGV2LT5kZXYtPnNkZXYtPmJ1cy0+aG9zdF9wY2kpICYmCiAJICAgICAgc3NiX3JlYWQzMihkZXYtPmRldi0+c2RldiwgU1NCX1RNU0hJR0gpICYgU1NCX1RNU0hJR0hfRE1BNjQpKQotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gdHJ1ZTsKICNlbmRpZgotCXJldHVybiAwOworCXJldHVybiBmYWxzZTsKIH0KIAogaW50IGI0M19kbWFfaW5pdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYwppbmRleCBjY2JkYjA1Li5iMmY5NTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKQEAgLTQxMzIsNyArNDEzMiw3IEBACiAJCWlmIChjb25mLT5ic3NpZCkKIAkJCW1lbWNweSh3bC0+YnNzaWQsIGNvbmYtPmJzc2lkLCBFVEhfQUxFTik7CiAJCWVsc2UKLQkJCW1lbXNldCh3bC0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwkJCWV0aF96ZXJvX2FkZHIod2wtPmJzc2lkKTsKIAl9CiAKIAlpZiAoYjQzX3N0YXR1cyhkZXYpID49IEI0M19TVEFUX0lOSVRJQUxJWkVEKSB7CkBAIC00ODE5LDcgKzQ4MTksNyBAQAogCXN3aXRjaCAoZGV2LT5kZXYtPmJ1c190eXBlKSB7CiAjaWZkZWYgQ09ORklHX0I0M19CQ01BCiAJY2FzZSBCNDNfQlVTX0JDTUE6Ci0JCWJjbWFfY29yZV9wY2lfZG93bihkZXYtPmRldi0+YmRldi0+YnVzKTsKKwkJYmNtYV9ob3N0X3BjaV9kb3duKGRldi0+ZGV2LT5iZGV2LT5idXMpOwogCQlicmVhazsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CNDNfU1NCCkBAIC00ODY2LDkgKzQ4NjYsOSBAQAogCXN3aXRjaCAoZGV2LT5kZXYtPmJ1c190eXBlKSB7CiAjaWZkZWYgQ09ORklHX0I0M19CQ01BCiAJY2FzZSBCNDNfQlVTX0JDTUE6Ci0JCWJjbWFfY29yZV9wY2lfaXJxX2N0bCgmZGV2LT5kZXYtPmJkZXYtPmJ1cy0+ZHJ2X3BjaVswXSwKKwkJYmNtYV9ob3N0X3BjaV9pcnFfY3RsKGRldi0+ZGV2LT5iZGV2LT5idXMsCiAJCQkJICAgICAgZGV2LT5kZXYtPmJkZXYsIHRydWUpOwotCQliY21hX2NvcmVfcGNpX3VwKGRldi0+ZGV2LT5iZGV2LT5idXMpOworCQliY21hX2hvc3RfcGNpX3VwKGRldi0+ZGV2LT5iZGV2LT5idXMpOwogCQlicmVhazsKICNlbmRpZgogI2lmZGVmIENPTkZJR19CNDNfU1NCCkBAIC01MDUxLDcgKzUwNTEsNyBAQAogCXdsLT5vcGVyYXRpbmcgPSBmYWxzZTsKIAogCWI0M19hZGp1c3Rfb3Btb2RlKGRldik7Ci0JbWVtc2V0KHdsLT5tYWNfYWRkciwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIod2wtPm1hY19hZGRyKTsKIAliNDNfdXBsb2FkX2NhcmRfbWFjYWRkcmVzcyhkZXYpOwogCiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwpAQCAtNTA2Nyw4ICs1MDY3LDggQEAKIAkvKiBLaWxsIGFsbCBvbGQgaW5zdGFuY2Ugc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gbWFrZSBzdXJlCiAJICogdGhlIGNhcmQgd29uJ3QgdXNlIGl0IGluIHRoZSBzaG9ydCB0aW1lZnJhbWUgYmV0d2VlbiBzdGFydAogCSAqIGFuZCBtYWM4MDIxMSByZWNvbmZpZ3VyaW5nIGl0LiAqLwotCW1lbXNldCh3bC0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKLQltZW1zZXQod2wtPm1hY19hZGRyLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcih3bC0+YnNzaWQpOworCWV0aF96ZXJvX2FkZHIod2wtPm1hY19hZGRyKTsKIAl3bC0+ZmlsdGVyX2ZsYWdzID0gMDsKIAl3bC0+cmFkaW90YXBfZW5hYmxlZCA9IGZhbHNlOwogCWI0M19xb3NfY2xlYXIod2wpOwpAQCAtNTM3MCw2ICs1MzcwLDcgQEAKIAljYXNlIDB4NDMyYTogLyogQkNNNDMyMSAqLwogCWNhc2UgMHg0MzJkOiAvKiBCQ000MzIyICovCiAJY2FzZSAweDQzNTI6IC8qIEJDTTQzMjIyICovCisJY2FzZSAweDQzNWE6IC8qIEJDTTQzMjI4ICovCiAJY2FzZSAweDQzMzM6IC8qIEJDTTQzMzEgKi8KIAljYXNlIDB4NDNhMjogLyogQkNNNDM2MCAqLwogCWNhc2UgMHg0M2IzOiAvKiBCQ000MzUyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvZG1hLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvZG1hLmMKaW5kZXggYjJlZDE3OS4uZjlkZDg5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2RtYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9kbWEuYwpAQCAtNDI3LDcgKzQyNyw3IEBACiAJCQkJCSBib29sIGRtYV90b19kZXZpY2UpCiB7CiAJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKHJpbmctPmRldi0+ZGV2LT5kbWFfZGV2LCBhZGRyKSkpCi0JCXJldHVybiAxOworCQlyZXR1cm4gdHJ1ZTsKIAogCXN3aXRjaCAocmluZy0+dHlwZSkgewogCWNhc2UgQjQzbGVnYWN5X0RNQV8zMEJJVDoKQEAgLTQ0MSwxMyArNDQxLDEzIEBACiAJfQogCiAJLyogVGhlIGFkZHJlc3MgaXMgT0suICovCi0JcmV0dXJuIDA7CisJcmV0dXJuIGZhbHNlOwogCiBhZGRyZXNzX2Vycm9yOgogCS8qIFdlIGNhbid0IHN1cHBvcnQgdGhpcyBhZGRyZXNzLiBVbm1hcCBpdCBhZ2Fpbi4gKi8KIAl1bm1hcF9kZXNjYnVmZmVyKHJpbmcsIGFkZHIsIGJ1ZmZlcnNpemUsIGRtYV90b19kZXZpY2UpOwogCi0JcmV0dXJuIDE7CisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBpbnQgc2V0dXBfcnhfZGVzY2J1ZmZlcihzdHJ1Y3QgYjQzbGVnYWN5X2RtYXJpbmcgKnJpbmcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uYwppbmRleCA0ZTU4YzAwLi5jNzdiN2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMKQEAgLTI4NjYsNyArMjg2Niw3IEBACiAJCWlmIChjb25mLT5ic3NpZCkKIAkJCW1lbWNweSh3bC0+YnNzaWQsIGNvbmYtPmJzc2lkLCBFVEhfQUxFTik7CiAJCWVsc2UKLQkJCW1lbXNldCh3bC0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwkJCWV0aF96ZXJvX2FkZHIod2wtPmJzc2lkKTsKIAl9CiAKIAlpZiAoYjQzbGVnYWN5X3N0YXR1cyhkZXYpID49IEI0M2xlZ2FjeV9TVEFUX0lOSVRJQUxJWkVEKSB7CkBAIC0zNDcwLDcgKzM0NzAsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndsLT5pcnFfbG9jaywgZmxhZ3MpOwogCWI0M2xlZ2FjeV9hZGp1c3Rfb3Btb2RlKGRldik7Ci0JbWVtc2V0KHdsLT5tYWNfYWRkciwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIod2wtPm1hY19hZGRyKTsKIAliNDNsZWdhY3lfdXBsb2FkX2NhcmRfbWFjYWRkcmVzcyhkZXYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsLT5pcnFfbG9jaywgZmxhZ3MpOwogCkBAIC0zNDg3LDggKzM0ODcsOCBAQAogCS8qIEtpbGwgYWxsIG9sZCBpbnN0YW5jZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0byBtYWtlIHN1cmUKIAkgKiB0aGUgY2FyZCB3b24ndCB1c2UgaXQgaW4gdGhlIHNob3J0IHRpbWVmcmFtZSBiZXR3ZWVuIHN0YXJ0CiAJICogYW5kIG1hYzgwMjExIHJlY29uZmlndXJpbmcgaXQuICovCi0JbWVtc2V0KHdsLT5ic3NpZCwgMCwgRVRIX0FMRU4pOwotCW1lbXNldCh3bC0+bWFjX2FkZHIsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKHdsLT5ic3NpZCk7CisJZXRoX3plcm9fYWRkcih3bC0+bWFjX2FkZHIpOwogCXdsLT5maWx0ZXJfZmxhZ3MgPSAwOwogCXdsLT5iZWFjb24wX3VwbG9hZGVkID0gZmFsc2U7CiAJd2wtPmJlYWNvbjFfdXBsb2FkZWQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9yZmtpbGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9yZmtpbGwuYwppbmRleCBjNDU1OWJjLi43YzFiZGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmZraWxsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3Jma2lsbC5jCkBAIC0zMiw3ICszMiw3IEBACiAJaWYgKGRldi0+ZGV2LT5pZC5yZXZpc2lvbiA+PSAzKSB7CiAJCWlmICghKGI0M2xlZ2FjeV9yZWFkMzIoZGV2LCBCNDNsZWdhY3lfTU1JT19SQURJT19IV0VOQUJMRURfSEkpCiAJCSAgICAgICYgQjQzbGVnYWN5X01NSU9fUkFESU9fSFdFTkFCTEVEX0hJX01BU0spKQotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gdHJ1ZTsKIAl9IGVsc2UgewogCQkvKiBUbyBwcmV2ZW50IENQVSBmYXVsdCBvbiBQUEMsIGRvIG5vdCByZWFkIGEgcmVnaXN0ZXIKIAkJICogdW5sZXNzIHRoZSBpbnRlcmZhY2UgaXMgc3RhcnRlZDsgaG93ZXZlciwgb24gcmVzdW1lCkBAIC00MCwxMiArNDAsMTIgQEAKIAkJICogdGhhdCBoYXBwZW5zLCB1bmNvbmRpdGlvbmFsbHkgcmV0dXJuIFRSVUUuCiAJCSAqLwogCQlpZiAoYjQzbGVnYWN5X3N0YXR1cyhkZXYpIDwgQjQzbGVnYWN5X1NUQVRfU1RBUlRFRCkKLQkJCXJldHVybiAxOworCQkJcmV0dXJuIHRydWU7CiAJCWlmIChiNDNsZWdhY3lfcmVhZDE2KGRldiwgQjQzbGVnYWN5X01NSU9fUkFESU9fSFdFTkFCTEVEX0xPKQogCQkgICAgJiBCNDNsZWdhY3lfTU1JT19SQURJT19IV0VOQUJMRURfTE9fTUFTSykKLQkJCXJldHVybiAxOworCQkJcmV0dXJuIHRydWU7CiAJfQotCXJldHVybiAwOworCXJldHVybiBmYWxzZTsKIH0KIAogLyogVGhlIHBvbGwgY2FsbGJhY2sgZm9yIHRoZSBoYXJkd2FyZSBidXR0b24uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMKaW5kZXggNzk0NDIyNC4uOWI1MDhiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tYy9ob3N0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9icmNtZm1hYy1zZGlvLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNTgsNiArNTksMTQgQEAKICNkZWZpbmUgQlJDTUZfREVGQVVMVF9UWEdMT01fU0laRQkzMiAgLyogbWF4IHR4IGZyYW1lcyBpbiBnbG9tIGNoYWluICovCiAjZGVmaW5lIEJSQ01GX0RFRkFVTFRfUlhHTE9NX1NJWkUJMzIgIC8qIG1heCByeCBmcmFtZXMgaW4gZ2xvbSBjaGFpbiAqLwogCitzdHJ1Y3QgYnJjbWZfc2Rpb2RfZnJlZXplciB7CisJYXRvbWljX3QgZnJlZXppbmc7CisJYXRvbWljX3QgdGhyZWFkX2NvdW50OworCXUzMiBmcm96ZW5fY291bnQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgdGhyZWFkX2ZyZWV6ZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiByZXN1bWVkOworfTsKKwogc3RhdGljIGludCBicmNtZl9zZGlvZF90eGdsb21zeiA9IEJSQ01GX0RFRkFVTFRfVFhHTE9NX1NJWkU7CiBtb2R1bGVfcGFyYW1fbmFtZWQodHhnbG9tc3osIGJyY21mX3NkaW9kX3R4Z2xvbXN6LCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh0eGdsb21zeiwgIm1heGltdW0gdHggcGFja2V0IGNoYWluIHNpemUgW1NESU9dIik7CkBAIC0xOTcsNiArMjA2LDMwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgYnJjbWZfc2Rpb2RfY2hhbmdlX3N0YXRlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJCSAgICAgIGVudW0gYnJjbWZfc2Rpb2Rfc3RhdGUgc3RhdGUpCit7CisJaWYgKHNkaW9kZXYtPnN0YXRlID09IEJSQ01GX1NESU9EX05PTUVESVVNIHx8CisJICAgIHN0YXRlID09IHNkaW9kZXYtPnN0YXRlKQorCQlyZXR1cm47CisKKwlicmNtZl9kYmcoVFJBQ0UsICIlZCAtPiAlZFxuIiwgc2Rpb2Rldi0+c3RhdGUsIHN0YXRlKTsKKwlzd2l0Y2ggKHNkaW9kZXYtPnN0YXRlKSB7CisJY2FzZSBCUkNNRl9TRElPRF9EQVRBOgorCQkvKiBhbnkgb3RoZXIgc3RhdGUgbWVhbnMgYnVzIGludGVyZmFjZSBpcyBkb3duICovCisJCWJyY21mX2J1c19jaGFuZ2Vfc3RhdGUoc2Rpb2Rldi0+YnVzX2lmLCBCUkNNRl9CVVNfRE9XTik7CisJCWJyZWFrOworCWNhc2UgQlJDTUZfU0RJT0RfRE9XTjoKKwkJLyogdHJhbnNpdGlvbiBmcm9tIERPV04gdG8gREFUQSBtZWFucyBidXMgaW50ZXJmYWNlIGlzIHVwICovCisJCWlmIChzdGF0ZSA9PSBCUkNNRl9TRElPRF9EQVRBKQorCQkJYnJjbWZfYnVzX2NoYW5nZV9zdGF0ZShzZGlvZGV2LT5idXNfaWYsIEJSQ01GX0JVU19VUCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlzZGlvZGV2LT5zdGF0ZSA9IHN0YXRlOworfQorCiBzdGF0aWMgaW5saW5lIGludCBicmNtZl9zZGlvZF9mMF93cml0ZWIoc3RydWN0IHNkaW9fZnVuYyAqZnVuYywKIAkJCQkJdWludCByZWdhZGRyLCB1OCBieXRlKQogewpAQCAtMjY5LDEyICszMDIsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGJyY21mX3NkaW9kX25vbWVkaXVtX3N0YXRlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldikKLXsKLQlzZGlvZGV2LT5zdGF0ZSA9IEJSQ01GX1NUQVRFX05PTUVESVVNOwotCWJyY21mX2J1c19jaGFuZ2Vfc3RhdGUoc2Rpb2Rldi0+YnVzX2lmLCBCUkNNRl9CVVNfRE9XTik7Ci19Ci0KIHN0YXRpYyBpbnQgYnJjbWZfc2Rpb2RfcmVncndfaGVscGVyKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsCiAJCQkJICAgdTggcmVnc3osIHZvaWQgKmRhdGEsIGJvb2wgd3JpdGUpCiB7CkBAIC0yODIsNyArMzA5LDcgQEAKIAlzMzIgcmV0cnkgPSAwOwogCWludCByZXQ7CiAKLQlpZiAoc2Rpb2Rldi0+c3RhdGUgPT0gQlJDTUZfU1RBVEVfTk9NRURJVU0pCisJaWYgKHNkaW9kZXYtPnN0YXRlID09IEJSQ01GX1NESU9EX05PTUVESVVNKQogCQlyZXR1cm4gLUVOT01FRElVTTsKIAogCS8qCkBAIC0zMDgsNyArMzM1LDcgQEAKIAkJIHJldHJ5KysgPCBTRElPSF9BUElfQUNDRVNTX1JFVFJZX0xJTUlUKTsKIAogCWlmIChyZXQgPT0gLUVOT01FRElVTSkKLQkJYnJjbWZfc2Rpb2Rfbm9tZWRpdW1fc3RhdGUoc2Rpb2Rldik7CisJCWJyY21mX3NkaW9kX2NoYW5nZV9zdGF0ZShzZGlvZGV2LCBCUkNNRl9TRElPRF9OT01FRElVTSk7CiAJZWxzZSBpZiAocmV0ICE9IDApIHsKIAkJLyoKIAkJICogU2xlZXBDU1IgcmVnaXN0ZXIgYWNjZXNzIGNhbiBmYWlsIHdoZW4KQEAgLTMzMSw3ICszNTgsNyBAQAogCWludCBlcnIgPSAwLCBpOwogCXU4IGFkZHJbM107CiAKLQlpZiAoc2Rpb2Rldi0+c3RhdGUgPT0gQlJDTUZfU1RBVEVfTk9NRURJVU0pCisJaWYgKHNkaW9kZXYtPnN0YXRlID09IEJSQ01GX1NESU9EX05PTUVESVVNKQogCQlyZXR1cm4gLUVOT01FRElVTTsKIAogCWFkZHJbMF0gPSAoYWRkcmVzcyA+PiA4KSAmIFNCU0RJT19TQkFERFJMT1dfTUFTSzsKQEAgLTQ2MCw3ICs0ODcsNyBAQAogCQllcnIgPSBzZGlvX3JlYWRzYihzZGlvZGV2LT5mdW5jW2ZuXSwgKCh1OCAqKShwa3QtPmRhdGEpKSwgYWRkciwKIAkJCQkgIHJlcV9zeik7CiAJaWYgKGVyciA9PSAtRU5PTUVESVVNKQotCQlicmNtZl9zZGlvZF9ub21lZGl1bV9zdGF0ZShzZGlvZGV2KTsKKwkJYnJjbWZfc2Rpb2RfY2hhbmdlX3N0YXRlKHNkaW9kZXYsIEJSQ01GX1NESU9EX05PTUVESVVNKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC01OTUsNyArNjIyLDcgQEAKIAogCQlyZXQgPSBtbWNfY21kLmVycm9yID8gbW1jX2NtZC5lcnJvciA6IG1tY19kYXQuZXJyb3I7CiAJCWlmIChyZXQgPT0gLUVOT01FRElVTSkgewotCQkJYnJjbWZfc2Rpb2Rfbm9tZWRpdW1fc3RhdGUoc2Rpb2Rldik7CisJCQlicmNtZl9zZGlvZF9jaGFuZ2Vfc3RhdGUoc2Rpb2RldiwgQlJDTUZfU0RJT0RfTk9NRURJVU0pOwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAocmV0ICE9IDApIHsKIAkJCWJyY21mX2VycigiQ01ENTMgc2cgYmxvY2sgJXMgZmFpbGVkICVkXG4iLApAQCAtODc3LDYgKzkwNCw4NyBAQAogCXNkaW9kZXYtPnR4Z2xvbXN6ID0gYnJjbWZfc2Rpb2RfdHhnbG9tc3o7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgYnJjbWZfc2Rpb2RfZnJlZXplcl9hdHRhY2goc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KQoreworCXNkaW9kZXYtPmZyZWV6ZXIgPSBremFsbG9jKHNpemVvZigqc2Rpb2Rldi0+ZnJlZXplciksIEdGUF9LRVJORUwpOworCWlmICghc2Rpb2Rldi0+ZnJlZXplcikKKwkJcmV0dXJuIC1FTk9NRU07CisJYXRvbWljX3NldCgmc2Rpb2Rldi0+ZnJlZXplci0+dGhyZWFkX2NvdW50LCAwKTsKKwlhdG9taWNfc2V0KCZzZGlvZGV2LT5mcmVlemVyLT5mcmVlemluZywgMCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmc2Rpb2Rldi0+ZnJlZXplci0+dGhyZWFkX2ZyZWV6ZSk7CisJaW5pdF9jb21wbGV0aW9uKCZzZGlvZGV2LT5mcmVlemVyLT5yZXN1bWVkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnJjbWZfc2Rpb2RfZnJlZXplcl9kZXRhY2goc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KQoreworCWlmIChzZGlvZGV2LT5mcmVlemVyKSB7CisJCVdBUk5fT04oYXRvbWljX3JlYWQoJnNkaW9kZXYtPmZyZWV6ZXItPmZyZWV6aW5nKSk7CisJCWtmcmVlKHNkaW9kZXYtPmZyZWV6ZXIpOworCX0KK30KKworc3RhdGljIGludCBicmNtZl9zZGlvZF9mcmVlemVyX29uKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldikKK3sKKwlhdG9taWNfdCAqZXhwZWN0ID0gJnNkaW9kZXYtPmZyZWV6ZXItPnRocmVhZF9jb3VudDsKKwlpbnQgcmVzID0gMDsKKworCXNkaW9kZXYtPmZyZWV6ZXItPmZyb3plbl9jb3VudCA9IDA7CisJcmVpbml0X2NvbXBsZXRpb24oJnNkaW9kZXYtPmZyZWV6ZXItPnJlc3VtZWQpOworCWF0b21pY19zZXQoJnNkaW9kZXYtPmZyZWV6ZXItPmZyZWV6aW5nLCAxKTsKKwlicmNtZl9zZGlvX3RyaWdnZXJfZHBjKHNkaW9kZXYtPmJ1cyk7CisJd2FpdF9ldmVudChzZGlvZGV2LT5mcmVlemVyLT50aHJlYWRfZnJlZXplLAorCQkgICBhdG9taWNfcmVhZChleHBlY3QpID09IHNkaW9kZXYtPmZyZWV6ZXItPmZyb3plbl9jb3VudCk7CisJc2Rpb19jbGFpbV9ob3N0KHNkaW9kZXYtPmZ1bmNbMV0pOworCXJlcyA9IGJyY21mX3NkaW9fc2xlZXAoc2Rpb2Rldi0+YnVzLCB0cnVlKTsKKwlzZGlvX3JlbGVhc2VfaG9zdChzZGlvZGV2LT5mdW5jWzFdKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBicmNtZl9zZGlvZF9mcmVlemVyX29mZihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYpCit7CisJc2Rpb19jbGFpbV9ob3N0KHNkaW9kZXYtPmZ1bmNbMV0pOworCWJyY21mX3NkaW9fc2xlZXAoc2Rpb2Rldi0+YnVzLCBmYWxzZSk7CisJc2Rpb19yZWxlYXNlX2hvc3Qoc2Rpb2Rldi0+ZnVuY1sxXSk7CisJYXRvbWljX3NldCgmc2Rpb2Rldi0+ZnJlZXplci0+ZnJlZXppbmcsIDApOworCWNvbXBsZXRlX2FsbCgmc2Rpb2Rldi0+ZnJlZXplci0+cmVzdW1lZCk7Cit9CisKK2Jvb2wgYnJjbWZfc2Rpb2RfZnJlZXppbmcoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KQoreworCXJldHVybiBhdG9taWNfcmVhZCgmc2Rpb2Rldi0+ZnJlZXplci0+ZnJlZXppbmcpOworfQorCit2b2lkIGJyY21mX3NkaW9kX3RyeV9mcmVlemUoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KQoreworCWlmICghYnJjbWZfc2Rpb2RfZnJlZXppbmcoc2Rpb2RldikpCisJCXJldHVybjsKKwlzZGlvZGV2LT5mcmVlemVyLT5mcm96ZW5fY291bnQrKzsKKwl3YWtlX3VwKCZzZGlvZGV2LT5mcmVlemVyLT50aHJlYWRfZnJlZXplKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzZGlvZGV2LT5mcmVlemVyLT5yZXN1bWVkKTsKK30KKwordm9pZCBicmNtZl9zZGlvZF9mcmVlemVyX2NvdW50KHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldikKK3sKKwlhdG9taWNfaW5jKCZzZGlvZGV2LT5mcmVlemVyLT50aHJlYWRfY291bnQpOworfQorCit2b2lkIGJyY21mX3NkaW9kX2ZyZWV6ZXJfdW5jb3VudChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYpCit7CisJYXRvbWljX2RlYygmc2Rpb2Rldi0+ZnJlZXplci0+dGhyZWFkX2NvdW50KTsKK30KKyNlbHNlCitzdGF0aWMgaW50IGJyY21mX3NkaW9kX2ZyZWV6ZXJfYXR0YWNoKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnJjbWZfc2Rpb2RfZnJlZXplcl9kZXRhY2goc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KQoreworfQorI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCiBzdGF0aWMgaW50IGJyY21mX3NkaW9kX3JlbW92ZShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYpCiB7CiAJaWYgKHNkaW9kZXYtPmJ1cykgewpAQCAtODg0LDYgKzk5Miw4IEBACiAJCXNkaW9kZXYtPmJ1cyA9IE5VTEw7CiAJfQogCisJYnJjbWZfc2Rpb2RfZnJlZXplcl9kZXRhY2goc2Rpb2Rldik7CisKIAkvKiBEaXNhYmxlIEZ1bmN0aW9uIDIgKi8KIAlzZGlvX2NsYWltX2hvc3Qoc2Rpb2Rldi0+ZnVuY1syXSk7CiAJc2Rpb19kaXNhYmxlX2Z1bmMoc2Rpb2Rldi0+ZnVuY1syXSk7CkBAIC04OTcsNiArMTAwNyw3IEBACiAJc2dfZnJlZV90YWJsZSgmc2Rpb2Rldi0+c2d0YWJsZSk7CiAJc2Rpb2Rldi0+c2J3YWQgPSAwOwogCisJcG1fcnVudGltZV9hbGxvdyhzZGlvZGV2LT5mdW5jWzFdLT5jYXJkLT5ob3N0LT5wYXJlbnQpOwogCXJldHVybiAwOwogfQogCkBAIC05NTUsMTMgKzEwNjYsMTcgQEAKIAkgKi8KIAlicmNtZl9zZGlvZF9zZ3RhYmxlX2FsbG9jKHNkaW9kZXYpOwogCisJcmV0ID0gYnJjbWZfc2Rpb2RfZnJlZXplcl9hdHRhY2goc2Rpb2Rldik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKIAkvKiB0cnkgdG8gYXR0YWNoIHRvIHRoZSB0YXJnZXQgZGV2aWNlICovCiAJc2Rpb2Rldi0+YnVzID0gYnJjbWZfc2Rpb19wcm9iZShzZGlvZGV2KTsKIAlpZiAoIXNkaW9kZXYtPmJ1cykgewogCQlyZXQgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKIAl9Ci0KKwlwbV9ydW50aW1lX2ZvcmJpZChob3N0LT5wYXJlbnQpOwogb3V0OgogCWlmIChyZXQpCiAJCWJyY21mX3NkaW9kX3JlbW92ZShzZGlvZGV2KTsKQEAgLTk4Myw2ICsxMDk4LDggQEAKIAlCUkNNRl9TRElPX0RFVklDRShTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM0MSksCiAJQlJDTUZfU0RJT19ERVZJQ0UoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNjIpLAogCUJSQ01GX1NESU9fREVWSUNFKFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzVfNDMzOSksCisJQlJDTUZfU0RJT19ERVZJQ0UoU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDM0MzApLAorCUJSQ01GX1NESU9fREVWSUNFKFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzNDUpLAogCUJSQ01GX1NESU9fREVWSUNFKFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzNTQpLAogCXsgLyogZW5kOiBhbGwgemVyb2VzICovIH0KIH07CkBAIC0xMDUwLDkgKzExNjcsNyBAQAogCQlidXNfaWYtPndvd2xfc3VwcG9ydGVkID0gdHJ1ZTsKICNlbmRpZgogCi0Jc2Rpb2Rldi0+c2xlZXBpbmcgPSBmYWxzZTsKLQlhdG9taWNfc2V0KCZzZGlvZGV2LT5zdXNwZW5kLCBmYWxzZSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmc2Rpb2Rldi0+aWRsZV93YWl0KTsKKwlicmNtZl9zZGlvZF9jaGFuZ2Vfc3RhdGUoc2Rpb2RldiwgQlJDTUZfU0RJT0RfRE9XTik7CiAKIAlicmNtZl9kYmcoU0RJTywgIkYyIGZvdW5kLCBjYWxsaW5nIGJyY21mX3NkaW9kX3Byb2JlLi4uXG4iKTsKIAllcnIgPSBicmNtZl9zZGlvZF9wcm9iZShzZGlvZGV2KTsKQEAgLTEwODMsNyArMTE5OCw3IEBACiAJYnJjbWZfZGJnKFNESU8sICJzZGlvIGRldmljZSBJRDogMHglMDR4XG4iLCBmdW5jLT5kZXZpY2UpOwogCWJyY21mX2RiZyhTRElPLCAiRnVuY3Rpb246ICVkXG4iLCBmdW5jLT5udW0pOwogCi0JaWYgKGZ1bmMtPm51bSAhPSAxICYmIGZ1bmMtPm51bSAhPSAyKQorCWlmIChmdW5jLT5udW0gIT0gMSkKIAkJcmV0dXJuOwogCiAJYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKCZmdW5jLT5kZXYpOwpAQCAtMTExNCwyNCArMTIyOSwyMiBAQAogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBicmNtZl9vcHNfc2Rpb19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jOwogCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZjsKIAlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXY7CiAJbW1jX3BtX2ZsYWdfdCBzZGlvX2ZsYWdzOwogCi0JYnJjbWZfZGJnKFNESU8sICJFbnRlclxuIik7CisJZnVuYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzZGlvX2Z1bmMsIGRldik7CisJYnJjbWZfZGJnKFNESU8sICJFbnRlcjogRiVkXG4iLCBmdW5jLT5udW0pOworCWlmIChmdW5jLT5udW0gIT0gU0RJT19GVU5DXzEpCisJCXJldHVybiAwOworCiAKIAlidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzZGlvZGV2ID0gYnVzX2lmLT5idXNfcHJpdi5zZGlvOwogCi0JLyogd2FpdCBmb3Igd2F0Y2hkb2cgdG8gZ28gaWRsZSAqLwotCWlmICh3YWl0X2V2ZW50X3RpbWVvdXQoc2Rpb2Rldi0+aWRsZV93YWl0LCBzZGlvZGV2LT5zbGVlcGluZywKLQkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKDMgKiBCUkNNRl9XRF9QT0xMX01TKSkgPT0gMCkgewotCQlicmNtZl9lcnIoImJ1cyBzdGlsbCBhY3RpdmVcbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQkvKiBkaXNhYmxlIHdhdGNoZG9nICovCisJYnJjbWZfc2Rpb2RfZnJlZXplcl9vbihzZGlvZGV2KTsKIAlicmNtZl9zZGlvX3dkX3RpbWVyKHNkaW9kZXYtPmJ1cywgMCk7Ci0JYXRvbWljX3NldCgmc2Rpb2Rldi0+c3VzcGVuZCwgdHJ1ZSk7CiAKIAlpZiAoc2Rpb2Rldi0+d293bF9lbmFibGVkKSB7CiAJCXNkaW9fZmxhZ3MgPSBNTUNfUE1fS0VFUF9QT1dFUjsKQEAgLTExNDksMTIgKzEyNjIsMTMgQEAKIHsKIAlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYgPSBidXNfaWYtPmJ1c19wcml2LnNkaW87CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBzZGlvX2Z1bmMsIGRldik7CiAKLQlicmNtZl9kYmcoU0RJTywgIkVudGVyXG4iKTsKLQlpZiAoc2Rpb2Rldi0+cGRhdGEgJiYgc2Rpb2Rldi0+cGRhdGEtPm9vYl9pcnFfc3VwcG9ydGVkKQotCQlkaXNhYmxlX2lycV93YWtlKHNkaW9kZXYtPnBkYXRhLT5vb2JfaXJxX25yKTsKLQlicmNtZl9zZGlvX3dkX3RpbWVyKHNkaW9kZXYtPmJ1cywgQlJDTUZfV0RfUE9MTF9NUyk7Ci0JYXRvbWljX3NldCgmc2Rpb2Rldi0+c3VzcGVuZCwgZmFsc2UpOworCWJyY21mX2RiZyhTRElPLCAiRW50ZXI6IEYlZFxuIiwgZnVuYy0+bnVtKTsKKwlpZiAoZnVuYy0+bnVtICE9IFNESU9fRlVOQ18yKQorCQlyZXR1cm4gMDsKKworCWJyY21mX3NkaW9kX2ZyZWV6ZXJfb2ZmKHNkaW9kZXYpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5jCmluZGV4IGI1OWI4YzYuLjhhMTVlYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9jZmc4MDIxMS5jCkBAIC02MjUsNiArNjI1LDcgQEAKIAogc3RhdGljIHN0cnVjdCB3aXJlbGVzc19kZXYgKmJyY21mX2NmZzgwMjExX2FkZF9pZmFjZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJCQkJICAgICB1bnNpZ25lZCBjaGFyIG5hbWVfYXNzaWduX3R5cGUsCiAJCQkJCQkgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwKIAkJCQkJCSAgICAgdTMyICpmbGFncywKIAkJCQkJCSAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKQEAgLTY0OCw3ICs2NDksNyBAQAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6Ci0JCXdkZXYgPSBicmNtZl9wMnBfYWRkX3ZpZih3aXBoeSwgbmFtZSwgdHlwZSwgZmxhZ3MsIHBhcmFtcyk7CisJCXdkZXYgPSBicmNtZl9wMnBfYWRkX3ZpZih3aXBoeSwgbmFtZSwgbmFtZV9hc3NpZ25fdHlwZSwgdHlwZSwgZmxhZ3MsIHBhcmFtcyk7CiAJCWlmICghSVNfRVJSKHdkZXYpKQogCQkJYnJjbWZfY2ZnODAyMTFfdXBkYXRlX3Byb3RvX2FkZHJfbW9kZSh3ZGV2KTsKIAkJcmV0dXJuIHdkZXY7CkBAIC03MDAsNyArNzAxLDcgQEAKIAkJLyogRG8gYSBzY2FuIGFib3J0IHRvIHN0b3AgdGhlIGRyaXZlcidzIHNjYW4gZW5naW5lICovCiAJCWJyY21mX2RiZyhTQ0FOLCAiQUJPUlQgc2NhbiBpbiBmaXJtd2FyZVxuIik7CiAJCW1lbXNldCgmcGFyYW1zX2xlLCAwLCBzaXplb2YocGFyYW1zX2xlKSk7Ci0JCW1lbXNldChwYXJhbXNfbGUuYnNzaWQsIDB4RkYsIEVUSF9BTEVOKTsKKwkJZXRoX2Jyb2FkY2FzdF9hZGRyKHBhcmFtc19sZS5ic3NpZCk7CiAJCXBhcmFtc19sZS5ic3NfdHlwZSA9IERPVDExX0JTU1RZUEVfQU5ZOwogCQlwYXJhbXNfbGUuc2Nhbl90eXBlID0gMDsKIAkJcGFyYW1zX2xlLmNoYW5uZWxfbnVtID0gY3B1X3RvX2xlMzIoMSk7CkBAIC04NjYsNyArODY3LDcgQEAKIAljaGFyICpwdHI7CiAJc3RydWN0IGJyY21mX3NzaWRfbGUgc3NpZF9sZTsKIAotCW1lbXNldChwYXJhbXNfbGUtPmJzc2lkLCAweEZGLCBFVEhfQUxFTik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKHBhcmFtc19sZS0+YnNzaWQpOwogCXBhcmFtc19sZS0+YnNzX3R5cGUgPSBET1QxMV9CU1NUWVBFX0FOWTsKIAlwYXJhbXNfbGUtPnNjYW5fdHlwZSA9IDA7CiAJcGFyYW1zX2xlLT5jaGFubmVsX251bSA9IDA7CkBAIC0xMDUwLDEwICsxMDUxLDYgQEAKIAlpZiAodmlmID09IGNmZy0+cDJwLmJzc19pZHhbUDJQQVBJX0JTU0NGR19ERVZJQ0VdLnZpZikKIAkJdmlmID0gY2ZnLT5wMnAuYnNzX2lkeFtQMlBBUElfQlNTQ0ZHX1BSSU1BUlldLnZpZjsKIAotCS8qIEFybSBzY2FuIHRpbWVvdXQgdGltZXIgKi8KLQltb2RfdGltZXIoJmNmZy0+ZXNjYW5fdGltZW91dCwgamlmZmllcyArCi0JCQlXTF9FU0NBTl9USU1FUl9JTlRFUlZBTF9NUyAqIEhaIC8gMTAwMCk7Ci0KIAllc2Nhbl9yZXEgPSBmYWxzZTsKIAlpZiAocmVxdWVzdCkgewogCQkvKiBzY2FuIGJzcyAqLwpAQCAtMTExMiwxMiArMTEwOSwxNCBAQAogCQl9CiAJfQogCisJLyogQXJtIHNjYW4gdGltZW91dCB0aW1lciAqLworCW1vZF90aW1lcigmY2ZnLT5lc2Nhbl90aW1lb3V0LCBqaWZmaWVzICsKKwkJCVdMX0VTQ0FOX1RJTUVSX0lOVEVSVkFMX01TICogSFogLyAxMDAwKTsKKwogCXJldHVybiAwOwogCiBzY2FuX291dDoKIAljbGVhcl9iaXQoQlJDTUZfU0NBTl9TVEFUVVNfQlVTWSwgJmNmZy0+c2Nhbl9zdGF0dXMpOwotCWlmICh0aW1lcl9wZW5kaW5nKCZjZmctPmVzY2FuX3RpbWVvdXQpKQotCQlkZWxfdGltZXJfc3luYygmY2ZnLT5lc2Nhbl90aW1lb3V0KTsKIAljZmctPnNjYW5fcmVxdWVzdCA9IE5VTEw7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTEzNzUsOCArMTM3NCw4IEBACiAJCQkJICAgQlJDTUZfQVNTT0NfUEFSQU1TX0ZJWEVEX1NJWkU7CiAJCW1lbWNweShwcm9maWxlLT5ic3NpZCwgcGFyYW1zLT5ic3NpZCwgRVRIX0FMRU4pOwogCX0gZWxzZSB7Ci0JCW1lbXNldChqb2luX3BhcmFtcy5wYXJhbXNfbGUuYnNzaWQsIDB4RkYsIEVUSF9BTEVOKTsKLQkJbWVtc2V0KHByb2ZpbGUtPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJCWV0aF9icm9hZGNhc3RfYWRkcihqb2luX3BhcmFtcy5wYXJhbXNfbGUuYnNzaWQpOworCQlldGhfemVyb19hZGRyKHByb2ZpbGUtPmJzc2lkKTsKIAl9CiAKIAkvKiBDaGFubmVsICovCkBAIC0xODUwLDcgKzE4NDksNyBAQAogCWlmIChzbWUtPmJzc2lkKQogCQltZW1jcHkoJmV4dF9qb2luX3BhcmFtcy0+YXNzb2NfbGUuYnNzaWQsIHNtZS0+YnNzaWQsIEVUSF9BTEVOKTsKIAllbHNlCi0JCW1lbXNldCgmZXh0X2pvaW5fcGFyYW1zLT5hc3NvY19sZS5ic3NpZCwgMHhGRiwgRVRIX0FMRU4pOworCQlldGhfYnJvYWRjYXN0X2FkZHIoZXh0X2pvaW5fcGFyYW1zLT5hc3NvY19sZS5ic3NpZCk7CiAKIAlpZiAoY2ZnLT5jaGFubmVsKSB7CiAJCWV4dF9qb2luX3BhcmFtcy0+YXNzb2NfbGUuY2hhbnNwZWNfbnVtID0gY3B1X3RvX2xlMzIoMSk7CkBAIC0xODk1LDcgKzE4OTQsNyBAQAogCWlmIChzbWUtPmJzc2lkKQogCQltZW1jcHkoam9pbl9wYXJhbXMucGFyYW1zX2xlLmJzc2lkLCBzbWUtPmJzc2lkLCBFVEhfQUxFTik7CiAJZWxzZQotCQltZW1zZXQoam9pbl9wYXJhbXMucGFyYW1zX2xlLmJzc2lkLCAweEZGLCBFVEhfQUxFTik7CisJCWV0aF9icm9hZGNhc3RfYWRkcihqb2luX3BhcmFtcy5wYXJhbXNfbGUuYnNzaWQpOwogCiAJaWYgKGNmZy0+Y2hhbm5lbCkgewogCQlqb2luX3BhcmFtcy5wYXJhbXNfbGUuY2hhbnNwZWNfbGlzdFswXSA9IGNwdV90b19sZTE2KGNoYW5zcGVjKTsKQEAgLTIyNTIsNyArMjI1MSw2IEBACiAKIAlpZiAoa2V5X2lkeCA+PSBCUkNNRl9NQVhfREVGQVVMVF9LRVlTKSB7CiAJCS8qIHdlIGlnbm9yZSB0aGlzIGtleSBpbmRleCBpbiB0aGlzIGNhc2UgKi8KLQkJYnJjbWZfZXJyKCJpbnZhbGlkIGtleSBpbmRleCAoJWQpXG4iLCBrZXlfaWR4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00MjcyLDcgKzQyNzAsNyBAQAogCQlyZXR1cm4gLUVJTzsKIAogCW1lbWNweSgmc2NidmFsLmVhLCBwYXJhbXMtPm1hYywgRVRIX0FMRU4pOwotCXNjYnZhbC52YWwgPSBjcHVfdG9fbGUzMihXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CisJc2NidmFsLnZhbCA9IGNwdV90b19sZTMyKHBhcmFtcy0+cmVhc29uX2NvZGUpOwogCWVyciA9IGJyY21mX2ZpbF9jbWRfZGF0YV9zZXQoaWZwLCBCUkNNRl9DX1NDQl9ERUFVVEhFTlRJQ0FURV9GT1JfUkVBU09OLAogCQkJCSAgICAgJnNjYnZhbCwgc2l6ZW9mKHNjYnZhbCkpOwogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvY2hpcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2NoaXAuYwppbmRleCAwNGQyY2EwLi5hYjJmYWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvY2hpcC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9jaGlwLmMKQEAgLTEwMCw5ICsxMDAsNiBAQAogI2RlZmluZSBCQ000MzI5X0NPUkVfU09DUkFNX0JBU0UJMHgxODAwMzAwMAogLyogQVJNIENvcnRleCBNMyBjb3JlLCBJRCAweDgyYSAqLwogI2RlZmluZSBCQ000MzI5X0NPUkVfQVJNX0JBU0UJCTB4MTgwMDIwMDAKLSNkZWZpbmUgQkNNNDMyOV9SQU1TSVpFCQkJMHg0ODAwMAotLyogYmNtNDMxNDMgKi8KLSNkZWZpbmUgQkNNNDMxNDNfUkFNU0laRQkJMHg3MDAwMAogCiAjZGVmaW5lIENPUkVfU0IoYmFzZSwgZmllbGQpIFwKIAkJKGJhc2UgKyBTQkNPTkZJR09GRiArIG9mZnNldG9mKHN0cnVjdCBzYmNvbmZpZywgZmllbGQpKQpAQCAtMTUwLDYgKzE0Nyw3OCBAQAogCXUzMiBzYmlkaGlnaDsJLyogaWRlbnRpZmljYXRpb24gKi8KIH07CiAKKy8qIGJhbmtpZHggYW5kIGJhbmtpbmZvIHJlZyBkZWZpbmVzIGNvcmVyZXYgPj0gOCAqLworI2RlZmluZSBTT0NSQU1fQkFOS0lORk9fUkVUTlRSQU1fTUFTSwkweDAwMDEwMDAwCisjZGVmaW5lIFNPQ1JBTV9CQU5LSU5GT19TWk1BU0sJCTB4MDAwMDAwN2YKKyNkZWZpbmUgU09DUkFNX0JBTktJRFhfUk9NX01BU0sJCTB4MDAwMDAxMDAKKworI2RlZmluZSBTT0NSQU1fQkFOS0lEWF9NRU1UWVBFX1NISUZUCTgKKy8qIHNvY3JhbSBiYW5raW5mbyBtZW10eXBlICovCisjZGVmaW5lIFNPQ1JBTV9NRU1UWVBFX1JBTQkJMAorI2RlZmluZSBTT0NSQU1fTUVNVFlQRV9SME0JCTEKKyNkZWZpbmUgU09DUkFNX01FTVRZUEVfREVWUkFNCQkyCisKKyNkZWZpbmUgU09DUkFNX0JBTktJTkZPX1NaQkFTRQkJODE5MgorI2RlZmluZSBTUkNJX0xTU19NQVNLCQkweDAwZjAwMDAwCisjZGVmaW5lIFNSQ0lfTFNTX1NISUZUCQkyMAorI2RlZmluZQlTUkNJX1NSTkJfTUFTSwkJMHhmMAorI2RlZmluZQlTUkNJX1NSTkJfU0hJRlQJCTQKKyNkZWZpbmUJU1JDSV9TUkJTWl9NQVNLCQkweGYKKyNkZWZpbmUJU1JDSV9TUkJTWl9TSElGVAkwCisjZGVmaW5lIFNSX0JTWl9CQVNFCQkxNAorCitzdHJ1Y3Qgc2Jzb2NyYW1yZWdzIHsKKwl1MzIgY29yZWluZm87CisJdTMyIGJ3YWxsb2M7CisJdTMyIGV4dHJhY29yZWluZm87CisJdTMyIGJpc3RzdGF0OworCXUzMiBiYW5raWR4OworCXUzMiBzdGFuZGJ5Y3RybDsKKworCXUzMiBlcnJsb2dzdGF0dXM7CS8qIHJldiA2ICovCisJdTMyIGVycmxvZ2FkZHI7CS8qIHJldiA2ICovCisJLyogdXNlZCBmb3IgcGF0Y2hpbmcgcmV2IDMgJiA1ICovCisJdTMyIGNhbWJhbmtpZHg7CisJdTMyIGNhbWJhbmtzdGFuZGJ5Y3RybDsKKwl1MzIgY2FtYmFua3BhdGNoY3RybDsKKwl1MzIgY2FtYmFua3BhdGNodGJsYmFzZWFkZHI7CisJdTMyIGNhbWJhbmtjbWRyZWc7CisJdTMyIGNhbWJhbmtkYXRhcmVnOworCXUzMiBjYW1iYW5rbWFza3JlZzsKKwl1MzIgUEFEWzFdOworCXUzMiBiYW5raW5mbzsJLyogY29yZXYgOCAqLworCXUzMiBiYW5rcGRhOworCXUzMiBQQURbMTRdOworCXUzMiBleHRtZW1jb25maWc7CisJdTMyIGV4dG1lbXBhcml0eWNzcjsKKwl1MzIgZXh0bWVtcGFyaXR5ZXJyZGF0YTsKKwl1MzIgZXh0bWVtcGFyaXR5ZXJyY250OworCXUzMiBleHRtZW13cmN0cmxhbmRzaXplOworCXUzMiBQQURbODRdOworCXUzMiB3b3JrYXJvdW5kOworCXUzMiBwd3JjdGw7CQkvKiBjb3JlcmV2ID49IDIgKi8KKwl1MzIgUEFEWzEzM107CisJdTMyIHNyX2NvbnRyb2w7ICAgICAvKiBjb3JlcmV2ID49IDE1ICovCisJdTMyIHNyX3N0YXR1czsgICAgICAvKiBjb3JlcmV2ID49IDE1ICovCisJdTMyIHNyX2FkZHJlc3M7ICAgICAvKiBjb3JlcmV2ID49IDE1ICovCisJdTMyIHNyX2RhdGE7ICAgICAgICAvKiBjb3JlcmV2ID49IDE1ICovCit9OworCisjZGVmaW5lIFNPQ1JBTVJFR09GRlMoX2YpCW9mZnNldG9mKHN0cnVjdCBzYnNvY3JhbXJlZ3MsIF9mKQorCisjZGVmaW5lIEFSTUNSNF9DQVAJCSgweDA0KQorI2RlZmluZSBBUk1DUjRfQkFOS0lEWAkJKDB4NDApCisjZGVmaW5lIEFSTUNSNF9CQU5LSU5GTwkJKDB4NDQpCisjZGVmaW5lIEFSTUNSNF9CQU5LUERBCQkoMHg0QykKKworI2RlZmluZQlBUk1DUjRfVENCQk5CX01BU0sJMHhmMAorI2RlZmluZQlBUk1DUjRfVENCQk5CX1NISUZUCTQKKyNkZWZpbmUJQVJNQ1I0X1RDQkFOQl9NQVNLCTB4ZgorI2RlZmluZQlBUk1DUjRfVENCQU5CX1NISUZUCTAKKworI2RlZmluZQlBUk1DUjRfQlNaX01BU0sJCTB4M2YKKyNkZWZpbmUJQVJNQ1I0X0JTWl9NVUxUCQk4MTkyCisKIHN0cnVjdCBicmNtZl9jb3JlX3ByaXYgewogCXN0cnVjdCBicmNtZl9jb3JlIHB1YjsKIAl1MzIgd3JhcGJhc2U7CkBAIC00MTksMTMgKzQ4OCwxMyBAQAogCXJldHVybiAmY29yZS0+cHViOwogfQogCi0jaWZkZWYgREVCVUcKIC8qIHNhZmV0eSBjaGVjayBmb3IgY2hpcGluZm8gKi8KIHN0YXRpYyBpbnQgYnJjbWZfY2hpcF9jb3Jlc19jaGVjayhzdHJ1Y3QgYnJjbWZfY2hpcF9wcml2ICpjaSkKIHsKIAlzdHJ1Y3QgYnJjbWZfY29yZV9wcml2ICpjb3JlOwogCWJvb2wgbmVlZF9zb2NyYW0gPSBmYWxzZTsKIAlib29sIGhhc19zb2NyYW0gPSBmYWxzZTsKKwlib29sIGNwdV9mb3VuZCA9IGZhbHNlOwogCWludCBpZHggPSAxOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3JlLCAmY2ktPmNvcmVzLCBsaXN0KSB7CkBAIC00MzUsMjIgKzUwNCwyNCBAQAogCiAJCXN3aXRjaCAoY29yZS0+cHViLmlkKSB7CiAJCWNhc2UgQkNNQV9DT1JFX0FSTV9DTTM6CisJCQljcHVfZm91bmQgPSB0cnVlOwogCQkJbmVlZF9zb2NyYW0gPSB0cnVlOwogCQkJYnJlYWs7CiAJCWNhc2UgQkNNQV9DT1JFX0lOVEVSTkFMX01FTToKIAkJCWhhc19zb2NyYW0gPSB0cnVlOwogCQkJYnJlYWs7CiAJCWNhc2UgQkNNQV9DT1JFX0FSTV9DUjQ6Ci0JCQlpZiAoY2ktPnB1Yi5yYW1iYXNlID09IDApIHsKLQkJCQlicmNtZl9lcnIoIlJBTSBiYXNlIG5vdCBwcm92aWRlZCB3aXRoIEFSTSBDUjQgY29yZVxuIik7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9CisJCQljcHVfZm91bmQgPSB0cnVlOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJfQogCX0KIAorCWlmICghY3B1X2ZvdW5kKSB7CisJCWJyY21mX2VycigiQ1BVIGNvcmUgbm90IGRldGVjdGVkXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CiAJLyogY2hlY2sgUkFNIGNvcmUgcHJlc2VuY2UgZm9yIEFSTSBDTTMgY29yZSAqLwogCWlmIChuZWVkX3NvY3JhbSAmJiAhaGFzX3NvY3JhbSkgewogCQlicmNtZl9lcnIoIlJBTSBjb3JlIG5vdCBwcm92aWRlZCB3aXRoIEFSTSBDTTMgY29yZVxuIik7CkBAIC00NTgsNTYgKzUyOSwxNjQgQEAKIAl9CiAJcmV0dXJuIDA7CiB9Ci0jZWxzZQkvKiBERUJVRyAqLwotc3RhdGljIGlubGluZSBpbnQgYnJjbWZfY2hpcF9jb3Jlc19jaGVjayhzdHJ1Y3QgYnJjbWZfY2hpcF9wcml2ICpjaSkKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZgogCi1zdGF0aWMgdm9pZCBicmNtZl9jaGlwX2dldF9yYW1pbmZvKHN0cnVjdCBicmNtZl9jaGlwX3ByaXYgKmNpKQorc3RhdGljIHUzMiBicmNtZl9jaGlwX2NvcmVfcmVhZDMyKHN0cnVjdCBicmNtZl9jb3JlX3ByaXYgKmNvcmUsIHUxNiByZWcpCit7CisJcmV0dXJuIGNvcmUtPmNoaXAtPm9wcy0+cmVhZDMyKGNvcmUtPmNoaXAtPmN0eCwgY29yZS0+cHViLmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgdm9pZCBicmNtZl9jaGlwX2NvcmVfd3JpdGUzMihzdHJ1Y3QgYnJjbWZfY29yZV9wcml2ICpjb3JlLAorCQkJCSAgICB1MTYgcmVnLCB1MzIgdmFsKQoreworCWNvcmUtPmNoaXAtPm9wcy0+d3JpdGUzMihjb3JlLT5jaGlwLT5jdHgsIGNvcmUtPnB1Yi5iYXNlICsgcmVnLCB2YWwpOworfQorCitzdGF0aWMgYm9vbCBicmNtZl9jaGlwX3NvY3JhbV9iYW5rc2l6ZShzdHJ1Y3QgYnJjbWZfY29yZV9wcml2ICpjb3JlLCB1OCBpZHgsCisJCQkJICAgICAgIHUzMiAqYmFua3NpemUpCit7CisJdTMyIGJhbmtpbmZvOworCXUzMiBiYW5raWR4ID0gKFNPQ1JBTV9NRU1UWVBFX1JBTSA8PCBTT0NSQU1fQkFOS0lEWF9NRU1UWVBFX1NISUZUKTsKKworCWJhbmtpZHggfD0gaWR4OworCWJyY21mX2NoaXBfY29yZV93cml0ZTMyKGNvcmUsIFNPQ1JBTVJFR09GRlMoYmFua2lkeCksIGJhbmtpZHgpOworCWJhbmtpbmZvID0gYnJjbWZfY2hpcF9jb3JlX3JlYWQzMihjb3JlLCBTT0NSQU1SRUdPRkZTKGJhbmtpbmZvKSk7CisJKmJhbmtzaXplID0gKGJhbmtpbmZvICYgU09DUkFNX0JBTktJTkZPX1NaTUFTSykgKyAxOworCSpiYW5rc2l6ZSAqPSBTT0NSQU1fQkFOS0lORk9fU1pCQVNFOworCXJldHVybiAhIShiYW5raW5mbyAmIFNPQ1JBTV9CQU5LSU5GT19SRVROVFJBTV9NQVNLKTsKK30KKworc3RhdGljIHZvaWQgYnJjbWZfY2hpcF9zb2NyYW1fcmFtc2l6ZShzdHJ1Y3QgYnJjbWZfY29yZV9wcml2ICpzciwgdTMyICpyYW1zaXplLAorCQkJCSAgICAgIHUzMiAqc3JzaXplKQoreworCXUzMiBjb3JlaW5mbzsKKwl1aW50IG5iLCBiYW5rc2l6ZSwgbHNzOworCWJvb2wgcmV0ZW50OworCWludCBpOworCisJKnJhbXNpemUgPSAwOworCSpzcnNpemUgPSAwOworCisJaWYgKFdBUk5fT04oc3ItPnB1Yi5yZXYgPCA0KSkKKwkJcmV0dXJuOworCisJaWYgKCFicmNtZl9jaGlwX2lzY29yZXVwKCZzci0+cHViKSkKKwkJYnJjbWZfY2hpcF9yZXNldGNvcmUoJnNyLT5wdWIsIDAsIDAsIDApOworCisJLyogR2V0IGluZm8gZm9yIGRldGVybWluaW5nIHNpemUgKi8KKwljb3JlaW5mbyA9IGJyY21mX2NoaXBfY29yZV9yZWFkMzIoc3IsIFNPQ1JBTVJFR09GRlMoY29yZWluZm8pKTsKKwluYiA9IChjb3JlaW5mbyAmIFNSQ0lfU1JOQl9NQVNLKSA+PiBTUkNJX1NSTkJfU0hJRlQ7CisKKwlpZiAoKHNyLT5wdWIucmV2IDw9IDcpIHx8IChzci0+cHViLnJldiA9PSAxMikpIHsKKwkJYmFua3NpemUgPSAoY29yZWluZm8gJiBTUkNJX1NSQlNaX01BU0spOworCQlsc3MgPSAoY29yZWluZm8gJiBTUkNJX0xTU19NQVNLKSA+PiBTUkNJX0xTU19TSElGVDsKKwkJaWYgKGxzcyAhPSAwKQorCQkJbmItLTsKKwkJKnJhbXNpemUgPSBuYiAqICgxIDw8IChiYW5rc2l6ZSArIFNSX0JTWl9CQVNFKSk7CisJCWlmIChsc3MgIT0gMCkKKwkJCSpyYW1zaXplICs9ICgxIDw8ICgobHNzIC0gMSkgKyBTUl9CU1pfQkFTRSkpOworCX0gZWxzZSB7CisJCW5iID0gKGNvcmVpbmZvICYgU1JDSV9TUk5CX01BU0spID4+IFNSQ0lfU1JOQl9TSElGVDsKKwkJZm9yIChpID0gMDsgaSA8IG5iOyBpKyspIHsKKwkJCXJldGVudCA9IGJyY21mX2NoaXBfc29jcmFtX2JhbmtzaXplKHNyLCBpLCAmYmFua3NpemUpOworCQkJKnJhbXNpemUgKz0gYmFua3NpemU7CisJCQlpZiAocmV0ZW50KQorCQkJCSpzcnNpemUgKz0gYmFua3NpemU7CisJCX0KKwl9CisKKwkvKiBoYXJkY29kZWQgc2F2ZSZyZXN0b3JlIG1lbW9yeSBzaXplcyAqLworCXN3aXRjaCAoc3ItPmNoaXAtPnB1Yi5jaGlwKSB7CisJY2FzZSBCUkNNX0NDXzQzMzRfQ0hJUF9JRDoKKwkJaWYgKHNyLT5jaGlwLT5wdWIuY2hpcHJldiA8IDIpCisJCQkqc3JzaXplID0gKDMyICogMTAyNCk7CisJCWJyZWFrOworCWNhc2UgQlJDTV9DQ180MzQzMF9DSElQX0lEOgorCQkvKiBhc3N1bWUgc3IgZm9yIG5vdyBhcyB3ZSBjYW4gbm90IGNoZWNrCisJCSAqIGZpcm13YXJlIHNyIGNhcGFiaWxpdHkgYXQgdGhpcyBwb2ludC4KKwkJICovCisJCSpzcnNpemUgPSAoNjQgKiAxMDI0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKiogUmV0dXJuIHRoZSBUQ00tUkFNIHNpemUgb2YgdGhlIEFSTUNSNCBjb3JlLiAqLworc3RhdGljIHUzMiBicmNtZl9jaGlwX3RjbV9yYW1zaXplKHN0cnVjdCBicmNtZl9jb3JlX3ByaXYgKmNyNCkKK3sKKwl1MzIgY29yZWNhcDsKKwl1MzIgbWVtc2l6ZSA9IDA7CisJdTMyIG5hYjsKKwl1MzIgbmJiOworCXUzMiB0b3RiOworCXUzMiBieGluZm87CisJdTMyIGlkeDsKKworCWNvcmVjYXAgPSBicmNtZl9jaGlwX2NvcmVfcmVhZDMyKGNyNCwgQVJNQ1I0X0NBUCk7CisKKwluYWIgPSAoY29yZWNhcCAmIEFSTUNSNF9UQ0JBTkJfTUFTSykgPj4gQVJNQ1I0X1RDQkFOQl9TSElGVDsKKwluYmIgPSAoY29yZWNhcCAmIEFSTUNSNF9UQ0JCTkJfTUFTSykgPj4gQVJNQ1I0X1RDQkJOQl9TSElGVDsKKwl0b3RiID0gbmFiICsgbmJiOworCisJZm9yIChpZHggPSAwOyBpZHggPCB0b3RiOyBpZHgrKykgeworCQlicmNtZl9jaGlwX2NvcmVfd3JpdGUzMihjcjQsIEFSTUNSNF9CQU5LSURYLCBpZHgpOworCQlieGluZm8gPSBicmNtZl9jaGlwX2NvcmVfcmVhZDMyKGNyNCwgQVJNQ1I0X0JBTktJTkZPKTsKKwkJbWVtc2l6ZSArPSAoKGJ4aW5mbyAmIEFSTUNSNF9CU1pfTUFTSykgKyAxKSAqIEFSTUNSNF9CU1pfTVVMVDsKKwl9CisKKwlyZXR1cm4gbWVtc2l6ZTsKK30KKworc3RhdGljIHUzMiBicmNtZl9jaGlwX3RjbV9yYW1iYXNlKHN0cnVjdCBicmNtZl9jaGlwX3ByaXYgKmNpKQogewogCXN3aXRjaCAoY2ktPnB1Yi5jaGlwKSB7Ci0JY2FzZSBCUkNNX0NDXzQzMjlfQ0hJUF9JRDoKLQkJY2ktPnB1Yi5yYW1zaXplID0gQkNNNDMyOV9SQU1TSVpFOwotCQlicmVhazsKLQljYXNlIEJSQ01fQ0NfNDMxNDNfQ0hJUF9JRDoKLQkJY2ktPnB1Yi5yYW1zaXplID0gQkNNNDMxNDNfUkFNU0laRTsKLQkJYnJlYWs7Ci0JY2FzZSBCUkNNX0NDXzQzMjQxX0NISVBfSUQ6Ci0JCWNpLT5wdWIucmFtc2l6ZSA9IDB4OTAwMDA7Ci0JCWJyZWFrOwotCWNhc2UgQlJDTV9DQ180MzMwX0NISVBfSUQ6Ci0JCWNpLT5wdWIucmFtc2l6ZSA9IDB4NDgwMDA7Ci0JCWJyZWFrOwotCWNhc2UgQlJDTV9DQ180MzM0X0NISVBfSUQ6Ci0JY2FzZSBCUkNNX0NDXzQzMzQwX0NISVBfSUQ6Ci0JCWNpLT5wdWIucmFtc2l6ZSA9IDB4ODAwMDA7Ci0JCWJyZWFrOworCWNhc2UgQlJDTV9DQ180MzQ1X0NISVBfSUQ6CisJCXJldHVybiAweDE5ODAwMDsKIAljYXNlIEJSQ01fQ0NfNDMzNV9DSElQX0lEOgotCQljaS0+cHViLnJhbXNpemUgPSAweGMwMDAwOwotCQljaS0+cHViLnJhbWJhc2UgPSAweDE4MDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBCUkNNX0NDXzQzMzYyX0NISVBfSUQ6Ci0JCWNpLT5wdWIucmFtc2l6ZSA9IDB4M2MwMDA7Ci0JCWJyZWFrOwogCWNhc2UgQlJDTV9DQ180MzM5X0NISVBfSUQ6CiAJY2FzZSBCUkNNX0NDXzQzNTRfQ0hJUF9JRDoKIAljYXNlIEJSQ01fQ0NfNDM1Nl9DSElQX0lEOgogCWNhc2UgQlJDTV9DQ180MzU2N19DSElQX0lEOgogCWNhc2UgQlJDTV9DQ180MzU2OV9DSElQX0lEOgogCWNhc2UgQlJDTV9DQ180MzU3MF9DSElQX0lEOgotCQljaS0+cHViLnJhbXNpemUgPSAweGMwMDAwOwotCQljaS0+cHViLnJhbWJhc2UgPSAweDE4MDAwMDsKLQkJYnJlYWs7CiAJY2FzZSBCUkNNX0NDXzQzNjAyX0NISVBfSUQ6Ci0JCWNpLT5wdWIucmFtc2l6ZSA9IDB4ZjAwMDA7Ci0JCWNpLT5wdWIucmFtYmFzZSA9IDB4MTgwMDAwOwotCQlicmVhazsKKwkJcmV0dXJuIDB4MTgwMDAwOwogCWRlZmF1bHQ6CiAJCWJyY21mX2VycigidW5rbm93biBjaGlwOiAlc1xuIiwgY2ktPnB1Yi5uYW1lKTsKIAkJYnJlYWs7CiAJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJyY21mX2NoaXBfZ2V0X3JhbWluZm8oc3RydWN0IGJyY21mX2NoaXBfcHJpdiAqY2kpCit7CisJc3RydWN0IGJyY21mX2NvcmVfcHJpdiAqbWVtX2NvcmU7CisJc3RydWN0IGJyY21mX2NvcmUgKm1lbTsKKworCW1lbSA9IGJyY21mX2NoaXBfZ2V0X2NvcmUoJmNpLT5wdWIsIEJDTUFfQ09SRV9BUk1fQ1I0KTsKKwlpZiAobWVtKSB7CisJCW1lbV9jb3JlID0gY29udGFpbmVyX29mKG1lbSwgc3RydWN0IGJyY21mX2NvcmVfcHJpdiwgcHViKTsKKwkJY2ktPnB1Yi5yYW1zaXplID0gYnJjbWZfY2hpcF90Y21fcmFtc2l6ZShtZW1fY29yZSk7CisJCWNpLT5wdWIucmFtYmFzZSA9IGJyY21mX2NoaXBfdGNtX3JhbWJhc2UoY2kpOworCQlpZiAoIWNpLT5wdWIucmFtYmFzZSkgeworCQkJYnJjbWZfZXJyKCJSQU0gYmFzZSBub3QgcHJvdmlkZWQgd2l0aCBBUk0gQ1I0IGNvcmVcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQltZW0gPSBicmNtZl9jaGlwX2dldF9jb3JlKCZjaS0+cHViLCBCQ01BX0NPUkVfSU5URVJOQUxfTUVNKTsKKwkJbWVtX2NvcmUgPSBjb250YWluZXJfb2YobWVtLCBzdHJ1Y3QgYnJjbWZfY29yZV9wcml2LCBwdWIpOworCQlicmNtZl9jaGlwX3NvY3JhbV9yYW1zaXplKG1lbV9jb3JlLCAmY2ktPnB1Yi5yYW1zaXplLAorCQkJCQkgICZjaS0+cHViLnNyc2l6ZSk7CisJfQorCWJyY21mX2RiZyhJTkZPLCAiUkFNOiBiYXNlPTB4JXggc2l6ZT0lZCAoMHgleCkgc3I9JWQgKDB4JXgpXG4iLAorCQkgIGNpLT5wdWIucmFtYmFzZSwgY2ktPnB1Yi5yYW1zaXplLCBjaS0+cHViLnJhbXNpemUsCisJCSAgY2ktPnB1Yi5zcnNpemUsIGNpLT5wdWIuc3JzaXplKTsKKworCWlmICghY2ktPnB1Yi5yYW1zaXplKSB7CisJCWJyY21mX2VycigiUkFNIHNpemUgaXMgdW5kZXRlcm1pbmVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgdTMyIGJyY21mX2NoaXBfZG1wX2dldF9kZXNjKHN0cnVjdCBicmNtZl9jaGlwX3ByaXYgKmNpLCB1MzIgKmVyb21hZGRyLApAQCAtNjYwLDYgKzgzOSw3IEBACiAJc3RydWN0IGJyY21mX2NvcmUgKmNvcmU7CiAJdTMyIHJlZ2RhdGE7CiAJdTMyIHNvY2l0eXBlOworCWludCByZXQ7CiAKIAkvKiBHZXQgQ0MgY29yZSByZXYKIAkgKiBDaGlwaWQgaXMgYXNzdW1lIHRvIGJlIGF0IG9mZnNldCAwIGZyb20gU0lfRU5VTV9CQVNFCkBAIC03MTIsOSArODkyLDEzIEBACiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWJyY21mX2NoaXBfZ2V0X3JhbWluZm8oY2kpOworCXJldCA9IGJyY21mX2NoaXBfY29yZXNfY2hlY2soY2kpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gYnJjbWZfY2hpcF9jb3Jlc19jaGVjayhjaSk7CisJLyogYXNzdXJlIGNoaXAgaXMgcGFzc2l2ZSBmb3IgY29yZSBhY2Nlc3MgKi8KKwlicmNtZl9jaGlwX3NldF9wYXNzaXZlKCZjaS0+cHViKTsKKwlyZXR1cm4gYnJjbWZfY2hpcF9nZXRfcmFtaW5mbyhjaSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJyY21mX2NoaXBfZGlzYWJsZV9hcm0oc3RydWN0IGJyY21mX2NoaXBfcHJpdiAqY2hpcCwgdTE2IGlkKQpAQCAtNzc4LDEyICs5NjIsNiBAQAogCWlmIChjaGlwLT5vcHMtPnNldHVwKQogCQlyZXQgPSBjaGlwLT5vcHMtPnNldHVwKGNoaXAtPmN0eCwgcHViKTsKIAotCS8qCi0JICogTWFrZSBzdXJlIGFueSBvbi1jaGlwIEFSTSBpcyBvZmYgKGluIGNhc2Ugc3RyYXBwaW5nIGlzIHdyb25nKSwKLQkgKiBvciBkb3dubG9hZGVkIGNvZGUgd2FzIGFscmVhZHkgcnVubmluZy4KLQkgKi8KLQlicmNtZl9jaGlwX2Rpc2FibGVfYXJtKGNoaXAsIEJDTUFfQ09SRV9BUk1fQ00zKTsKLQlicmNtZl9jaGlwX2Rpc2FibGVfYXJtKGNoaXAsIEJDTUFfQ09SRV9BUk1fQ1I0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC03OTksNyArOTc3LDcgQEAKIAkJZXJyID0gLUVJTlZBTDsKIAlpZiAoV0FSTl9PTighb3BzLT5wcmVwYXJlKSkKIAkJZXJyID0gLUVJTlZBTDsKLQlpZiAoV0FSTl9PTighb3BzLT5leGl0X2RsKSkKKwlpZiAoV0FSTl9PTighb3BzLT5hY3RpdmF0ZSkpCiAJCWVyciA9IC1FSU5WQUw7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtODk3LDkgKzEwNzUsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLWJyY21mX2NoaXBfY20zX2VudGVyZGwoc3RydWN0IGJyY21mX2NoaXBfcHJpdiAqY2hpcCkKK2JyY21mX2NoaXBfY20zX3NldF9wYXNzaXZlKHN0cnVjdCBicmNtZl9jaGlwX3ByaXYgKmNoaXApCiB7CiAJc3RydWN0IGJyY21mX2NvcmUgKmNvcmU7CisJc3RydWN0IGJyY21mX2NvcmVfcHJpdiAqc3I7CiAKIAlicmNtZl9jaGlwX2Rpc2FibGVfYXJtKGNoaXAsIEJDTUFfQ09SRV9BUk1fQ00zKTsKIAljb3JlID0gYnJjbWZfY2hpcF9nZXRfY29yZSgmY2hpcC0+cHViLCBCQ01BX0NPUkVfODAyMTEpOwpAQCAtOTA5LDkgKzEwODgsMTYgQEAKIAkJCSAgICAgRDExX0JDTUFfSU9DVExfUEhZQ0xPQ0tFTik7CiAJY29yZSA9IGJyY21mX2NoaXBfZ2V0X2NvcmUoJmNoaXAtPnB1YiwgQkNNQV9DT1JFX0lOVEVSTkFMX01FTSk7CiAJYnJjbWZfY2hpcF9yZXNldGNvcmUoY29yZSwgMCwgMCwgMCk7CisKKwkvKiBkaXNhYmxlIGJhbmsgIzMgcmVtYXAgZm9yIHRoaXMgZGV2aWNlICovCisJaWYgKGNoaXAtPnB1Yi5jaGlwID09IEJSQ01fQ0NfNDM0MzBfQ0hJUF9JRCkgeworCQlzciA9IGNvbnRhaW5lcl9vZihjb3JlLCBzdHJ1Y3QgYnJjbWZfY29yZV9wcml2LCBwdWIpOworCQlicmNtZl9jaGlwX2NvcmVfd3JpdGUzMihzciwgU09DUkFNUkVHT0ZGUyhiYW5raWR4KSwgMyk7CisJCWJyY21mX2NoaXBfY29yZV93cml0ZTMyKHNyLCBTT0NSQU1SRUdPRkZTKGJhbmtwZGEpLCAwKTsKKwl9CiB9CiAKLXN0YXRpYyBib29sIGJyY21mX2NoaXBfY20zX2V4aXRkbChzdHJ1Y3QgYnJjbWZfY2hpcF9wcml2ICpjaGlwKQorc3RhdGljIGJvb2wgYnJjbWZfY2hpcF9jbTNfc2V0X2FjdGl2ZShzdHJ1Y3QgYnJjbWZfY2hpcF9wcml2ICpjaGlwKQogewogCXN0cnVjdCBicmNtZl9jb3JlICpjb3JlOwogCkBAIC05MjEsNyArMTEwNyw3IEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQljaGlwLT5vcHMtPmV4aXRfZGwoY2hpcC0+Y3R4LCAmY2hpcC0+cHViLCAwKTsKKwljaGlwLT5vcHMtPmFjdGl2YXRlKGNoaXAtPmN0eCwgJmNoaXAtPnB1YiwgMCk7CiAKIAljb3JlID0gYnJjbWZfY2hpcF9nZXRfY29yZSgmY2hpcC0+cHViLCBCQ01BX0NPUkVfQVJNX0NNMyk7CiAJYnJjbWZfY2hpcF9yZXNldGNvcmUoY29yZSwgMCwgMCwgMCk7CkBAIC05MzAsNyArMTExNiw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAotYnJjbWZfY2hpcF9jcjRfZW50ZXJkbChzdHJ1Y3QgYnJjbWZfY2hpcF9wcml2ICpjaGlwKQorYnJjbWZfY2hpcF9jcjRfc2V0X3Bhc3NpdmUoc3RydWN0IGJyY21mX2NoaXBfcHJpdiAqY2hpcCkKIHsKIAlzdHJ1Y3QgYnJjbWZfY29yZSAqY29yZTsKIApAQCAtOTQzLDExICsxMTI5LDExIEBACiAJCQkgICAgIEQxMV9CQ01BX0lPQ1RMX1BIWUNMT0NLRU4pOwogfQogCi1zdGF0aWMgYm9vbCBicmNtZl9jaGlwX2NyNF9leGl0ZGwoc3RydWN0IGJyY21mX2NoaXBfcHJpdiAqY2hpcCwgdTMyIHJzdHZlYykKK3N0YXRpYyBib29sIGJyY21mX2NoaXBfY3I0X3NldF9hY3RpdmUoc3RydWN0IGJyY21mX2NoaXBfcHJpdiAqY2hpcCwgdTMyIHJzdHZlYykKIHsKIAlzdHJ1Y3QgYnJjbWZfY29yZSAqY29yZTsKIAotCWNoaXAtPm9wcy0+ZXhpdF9kbChjaGlwLT5jdHgsICZjaGlwLT5wdWIsIHJzdHZlYyk7CisJY2hpcC0+b3BzLT5hY3RpdmF0ZShjaGlwLT5jdHgsICZjaGlwLT5wdWIsIHJzdHZlYyk7CiAKIAkvKiByZXN0b3JlIEFSTSAqLwogCWNvcmUgPSBicmNtZl9jaGlwX2dldF9jb3JlKCZjaGlwLT5wdWIsIEJDTUFfQ09SRV9BUk1fQ1I0KTsKQEAgLTk1Niw3ICsxMTQyLDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBicmNtZl9jaGlwX2VudGVyX2Rvd25sb2FkKHN0cnVjdCBicmNtZl9jaGlwICpwdWIpCit2b2lkIGJyY21mX2NoaXBfc2V0X3Bhc3NpdmUoc3RydWN0IGJyY21mX2NoaXAgKnB1YikKIHsKIAlzdHJ1Y3QgYnJjbWZfY2hpcF9wcml2ICpjaGlwOwogCXN0cnVjdCBicmNtZl9jb3JlICphcm07CkBAIC05NjYsMTQgKzExNTIsMTQgQEAKIAljaGlwID0gY29udGFpbmVyX29mKHB1Yiwgc3RydWN0IGJyY21mX2NoaXBfcHJpdiwgcHViKTsKIAlhcm0gPSBicmNtZl9jaGlwX2dldF9jb3JlKHB1YiwgQkNNQV9DT1JFX0FSTV9DUjQpOwogCWlmIChhcm0pIHsKLQkJYnJjbWZfY2hpcF9jcjRfZW50ZXJkbChjaGlwKTsKKwkJYnJjbWZfY2hpcF9jcjRfc2V0X3Bhc3NpdmUoY2hpcCk7CiAJCXJldHVybjsKIAl9CiAKLQlicmNtZl9jaGlwX2NtM19lbnRlcmRsKGNoaXApOworCWJyY21mX2NoaXBfY20zX3NldF9wYXNzaXZlKGNoaXApOwogfQogCi1ib29sIGJyY21mX2NoaXBfZXhpdF9kb3dubG9hZChzdHJ1Y3QgYnJjbWZfY2hpcCAqcHViLCB1MzIgcnN0dmVjKQorYm9vbCBicmNtZl9jaGlwX3NldF9hY3RpdmUoc3RydWN0IGJyY21mX2NoaXAgKnB1YiwgdTMyIHJzdHZlYykKIHsKIAlzdHJ1Y3QgYnJjbWZfY2hpcF9wcml2ICpjaGlwOwogCXN0cnVjdCBicmNtZl9jb3JlICphcm07CkBAIC05ODMsOSArMTE2OSw5IEBACiAJY2hpcCA9IGNvbnRhaW5lcl9vZihwdWIsIHN0cnVjdCBicmNtZl9jaGlwX3ByaXYsIHB1Yik7CiAJYXJtID0gYnJjbWZfY2hpcF9nZXRfY29yZShwdWIsIEJDTUFfQ09SRV9BUk1fQ1I0KTsKIAlpZiAoYXJtKQotCQlyZXR1cm4gYnJjbWZfY2hpcF9jcjRfZXhpdGRsKGNoaXAsIHJzdHZlYyk7CisJCXJldHVybiBicmNtZl9jaGlwX2NyNF9zZXRfYWN0aXZlKGNoaXAsIHJzdHZlYyk7CiAKLQlyZXR1cm4gYnJjbWZfY2hpcF9jbTNfZXhpdGRsKGNoaXApOworCXJldHVybiBicmNtZl9jaGlwX2NtM19zZXRfYWN0aXZlKGNoaXApOwogfQogCiBib29sIGJyY21mX2NoaXBfc3JfY2FwYWJsZShzdHJ1Y3QgYnJjbWZfY2hpcCAqcHViKQpAQCAtMTAxNiw2ICsxMjAyLDEwIEBACiAJCWFkZHIgPSBDT1JFX0NDX1JFRyhiYXNlLCBjaGlwY29udHJvbF9kYXRhKTsKIAkJcmVnID0gY2hpcC0+b3BzLT5yZWFkMzIoY2hpcC0+Y3R4LCBhZGRyKTsKIAkJcmV0dXJuIChyZWcgJiBwbXVfY2MzX21hc2spICE9IDA7CisJY2FzZSBCUkNNX0NDXzQzNDMwX0NISVBfSUQ6CisJCWFkZHIgPSBDT1JFX0NDX1JFRyhiYXNlLCBzcl9jb250cm9sMSk7CisJCXJlZyA9IGNoaXAtPm9wcy0+cmVhZDMyKGNoaXAtPmN0eCwgYWRkcik7CisJCXJldHVybiByZWcgIT0gMDsKIAlkZWZhdWx0OgogCQlhZGRyID0gQ09SRV9DQ19SRUcoYmFzZSwgcG11Y2FwYWJpbGl0aWVzX2V4dCk7CiAJCXJlZyA9IGNoaXAtPm9wcy0+cmVhZDMyKGNoaXAtPmN0eCwgYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvY2hpcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2NoaXAuaAppbmRleCBjMzI5MDhkLi42MGRjYjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvY2hpcC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9jaGlwLmgKQEAgLTMwLDcgKzMwLDggQEAKICAqIEBwbXVjYXBzOiBQTVUgY2FwYWJpbGl0aWVzLgogICogQHBtdXJldjogUE1VIHJldmlzaW9uLgogICogQHJhbWJhc2U6IFJBTSBiYXNlIGFkZHJlc3MgKG9ubHkgYXBwbGljYWJsZSBmb3IgQVJNIENSNCBjaGlwcykuCi0gKiBAcmFtc2l6ZTogYW1vdW50IG9mIFJBTSBvbiBjaGlwLgorICogQHJhbXNpemU6IGFtb3VudCBvZiBSQU0gb24gY2hpcCBpbmNsdWRpbmcgcmV0ZW50aW9uLgorICogQHNyc2l6ZTogYW1vdW50IG9mIHJldGVudGlvbiBSQU0gb24gY2hpcC4KICAqIEBuYW1lOiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNoaXAgaWRlbnRpZmllci4KICAqLwogc3RydWN0IGJyY21mX2NoaXAgewpAQCAtNDEsNiArNDIsNyBAQAogCXUzMiBwbXVyZXY7CiAJdTMyIHJhbWJhc2U7CiAJdTMyIHJhbXNpemU7CisJdTMyIHNyc2l6ZTsKIAljaGFyIG5hbWVbOF07CiB9OwogCkBAIC02NCw3ICs2Niw3IEBACiAgKiBAd3JpdGUzMjogd3JpdGUgMzItYml0IHZhbHVlIG92ZXIgYnVzLgogICogQHByZXBhcmU6IHByZXBhcmUgYnVzIGZvciBjb3JlIGNvbmZpZ3VyYXRpb24uCiAgKiBAc2V0dXA6IGJ1cy1zcGVjaWZpYyBjb3JlIHNldHVwLgotICogQGV4aXRfZGw6IGV4aXQgZG93bmxvYWQgc3RhdGUuCisgKiBAYWN0aXZlOiBjaGlwIGJlY29tZXMgYWN0aXZlLgogICoJVGhlIGNhbGxiYWNrIHNob3VsZCB1c2UgdGhlIHByb3ZpZGVkIEByc3R2ZWMgd2hlbiBub24temVyby4KICAqLwogc3RydWN0IGJyY21mX2J1c2NvcmVfb3BzIHsKQEAgLTcyLDcgKzc0LDcgQEAKIAl2b2lkICgqd3JpdGUzMikodm9pZCAqY3R4LCB1MzIgYWRkciwgdTMyIHZhbHVlKTsKIAlpbnQgKCpwcmVwYXJlKSh2b2lkICpjdHgpOwogCWludCAoKnNldHVwKSh2b2lkICpjdHgsIHN0cnVjdCBicmNtZl9jaGlwICpjaGlwKTsKLQl2b2lkICgqZXhpdF9kbCkodm9pZCAqY3R4LCBzdHJ1Y3QgYnJjbWZfY2hpcCAqY2hpcCwgdTMyIHJzdHZlYyk7CisJdm9pZCAoKmFjdGl2YXRlKSh2b2lkICpjdHgsIHN0cnVjdCBicmNtZl9jaGlwICpjaGlwLCB1MzIgcnN0dmVjKTsKIH07CiAKIHN0cnVjdCBicmNtZl9jaGlwICpicmNtZl9jaGlwX2F0dGFjaCh2b2lkICpjdHgsCkBAIC04NCw4ICs4Niw4IEBACiB2b2lkIGJyY21mX2NoaXBfY29yZWRpc2FibGUoc3RydWN0IGJyY21mX2NvcmUgKmNvcmUsIHUzMiBwcmVyZXNldCwgdTMyIHJlc2V0KTsKIHZvaWQgYnJjbWZfY2hpcF9yZXNldGNvcmUoc3RydWN0IGJyY21mX2NvcmUgKmNvcmUsIHUzMiBwcmVyZXNldCwgdTMyIHJlc2V0LAogCQkJICB1MzIgcG9zdHJlc2V0KTsKLXZvaWQgYnJjbWZfY2hpcF9lbnRlcl9kb3dubG9hZChzdHJ1Y3QgYnJjbWZfY2hpcCAqY2kpOwotYm9vbCBicmNtZl9jaGlwX2V4aXRfZG93bmxvYWQoc3RydWN0IGJyY21mX2NoaXAgKmNpLCB1MzIgcnN0dmVjKTsKK3ZvaWQgYnJjbWZfY2hpcF9zZXRfcGFzc2l2ZShzdHJ1Y3QgYnJjbWZfY2hpcCAqY2kpOworYm9vbCBicmNtZl9jaGlwX3NldF9hY3RpdmUoc3RydWN0IGJyY21mX2NoaXAgKmNpLCB1MzIgcnN0dmVjKTsKIGJvb2wgYnJjbWZfY2hpcF9zcl9jYXBhYmxlKHN0cnVjdCBicmNtZl9jaGlwICpwdWIpOwogCiAjZW5kaWYgLyogQlJDTUZfQVhJRE1QX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvY29yZS5jCmluZGV4IDJkNmUyY2MuLmY4ZjQ3ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2NvcmUuYwpAQCAtOTQ0LDYgKzk0NCwzNCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgYnJjbWZfcmV2aW5mb19yZWFkKHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEocy0+cHJpdmF0ZSk7CisJc3RydWN0IGJyY21mX3Jldl9pbmZvICpyaSA9ICZidXNfaWYtPmRydnItPnJldmluZm87CisJY2hhciBkcmV2W0JSQ01VX0RPVFJFVl9MRU5dOworCWNoYXIgYnJldltCUkNNVV9CT0FSRFJFVl9MRU5dOworCisJc2VxX3ByaW50ZihzLCAidmVuZG9yaWQ6IDB4JTA0eFxuIiwgcmktPnZlbmRvcmlkKTsKKwlzZXFfcHJpbnRmKHMsICJkZXZpY2VpZDogMHglMDR4XG4iLCByaS0+ZGV2aWNlaWQpOworCXNlcV9wcmludGYocywgInJhZGlvcmV2OiAlc1xuIiwgYnJjbXVfZG90cmV2X3N0cihyaS0+cmFkaW9yZXYsIGRyZXYpKTsKKwlzZXFfcHJpbnRmKHMsICJjaGlwbnVtOiAldSAoJXgpXG4iLCByaS0+Y2hpcG51bSwgcmktPmNoaXBudW0pOworCXNlcV9wcmludGYocywgImNoaXByZXY6ICV1XG4iLCByaS0+Y2hpcHJldik7CisJc2VxX3ByaW50ZihzLCAiY2hpcHBrZzogJXVcbiIsIHJpLT5jaGlwcGtnKTsKKwlzZXFfcHJpbnRmKHMsICJjb3JlcmV2OiAldVxuIiwgcmktPmNvcmVyZXYpOworCXNlcV9wcmludGYocywgImJvYXJkaWQ6IDB4JTA0eFxuIiwgcmktPmJvYXJkaWQpOworCXNlcV9wcmludGYocywgImJvYXJkdmVuZG9yOiAweCUwNHhcbiIsIHJpLT5ib2FyZHZlbmRvcik7CisJc2VxX3ByaW50ZihzLCAiYm9hcmRyZXY6ICVzXG4iLCBicmNtdV9ib2FyZHJldl9zdHIocmktPmJvYXJkcmV2LCBicmV2KSk7CisJc2VxX3ByaW50ZihzLCAiZHJpdmVycmV2OiAlc1xuIiwgYnJjbXVfZG90cmV2X3N0cihyaS0+ZHJpdmVycmV2LCBkcmV2KSk7CisJc2VxX3ByaW50ZihzLCAidWNvZGVyZXY6ICV1XG4iLCByaS0+dWNvZGVyZXYpOworCXNlcV9wcmludGYocywgImJ1czogJXVcbiIsIHJpLT5idXMpOworCXNlcV9wcmludGYocywgInBoeXR5cGU6ICV1XG4iLCByaS0+cGh5dHlwZSk7CisJc2VxX3ByaW50ZihzLCAicGh5cmV2OiAldVxuIiwgcmktPnBoeXJldik7CisJc2VxX3ByaW50ZihzLCAiYW5hcmV2OiAldVxuIiwgcmktPmFuYXJldik7CisJc2VxX3ByaW50ZihzLCAibnZyYW1yZXY6ICUwOHhcbiIsIHJpLT5udnJhbXJldik7CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGJyY21mX2J1c19zdGFydChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldCA9IC0xOwpAQCAtOTc0LDYgKzEwMDIsOCBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGZhaWw7CiAKKwlicmNtZl9kZWJ1Z2ZzX2FkZF9lbnRyeShkcnZyLCAicmV2aW5mbyIsIGJyY21mX3JldmluZm9fcmVhZCk7CisKIAkvKiBhc3N1cmUgd2UgaGF2ZSBjaGlwaWQgYmVmb3JlIGZlYXR1cmUgYXR0YWNoICovCiAJaWYgKCFidXNfaWYtPmNoaXApIHsKIAkJYnVzX2lmLT5jaGlwID0gZHJ2ci0+cmV2aW5mby5jaGlwbnVtOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2ZlYXR1cmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9mZWF0dXJlLmMKaW5kZXggZGVmYjdhNC4uNzc0OGExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2ZlYXR1cmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZmVhdHVyZS5jCkBAIC0xMjYsNyArMTI2LDggQEAKIAlicmNtZl9mZWF0X2lvdmFyX2ludF9nZXQoaWZwLCBCUkNNRl9GRUFUX01DSEFOLCAibWNoYW4iKTsKIAlpZiAoZHJ2ci0+YnVzX2lmLT53b3dsX3N1cHBvcnRlZCkKIAkJYnJjbWZfZmVhdF9pb3Zhcl9pbnRfZ2V0KGlmcCwgQlJDTUZfRkVBVF9XT1dMLCAid293bCIpOwotCWJyY21mX2ZlYXRfaW92YXJfaW50X3NldChpZnAsIEJSQ01GX0ZFQVRfTUJTUywgIm1ic3MiLCAwKTsKKwlpZiAoZHJ2ci0+YnVzX2lmLT5jaGlwICE9IEJSQ01fQ0NfNDMzNjJfQ0hJUF9JRCkKKwkJYnJjbWZfZmVhdF9pb3Zhcl9pbnRfc2V0KGlmcCwgQlJDTUZfRkVBVF9NQlNTLCAibWJzcyIsIDApOwogCiAJLyogc2V0IGNoaXAgcmVsYXRlZCBxdWlya3MgKi8KIAlzd2l0Y2ggKGRydnItPmJ1c19pZi0+Y2hpcCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2Zsb3dyaW5nLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZmxvd3JpbmcuYwppbmRleCA5MTBmYmI1Li5lYjEzMjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZmxvd3JpbmcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZmxvd3JpbmcuYwpAQCAtMjM2LDcgKzIzNiw3IEBACiAJYnJjbWZfZmxvd3JpbmdfYmxvY2soZmxvdywgZmxvd2lkLCBmYWxzZSk7CiAJaGFzaF9pZHggPSByaW5nLT5oYXNoX2lkOwogCWZsb3ctPmhhc2hbaGFzaF9pZHhdLmlmaWR4ID0gQlJDTUZfRkxPV1JJTkdfSU5WQUxJRF9JRklEWDsKLQltZW1zZXQoZmxvdy0+aGFzaFtoYXNoX2lkeF0ubWFjLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihmbG93LT5oYXNoW2hhc2hfaWR4XS5tYWMpOwogCWZsb3ctPnJpbmdzW2Zsb3dpZF0gPSBOVUxMOwogCiAJc2tiID0gc2tiX2RlcXVldWUoJnJpbmctPnNrYmxpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL21zZ2J1Zi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL21zZ2J1Zi5jCmluZGV4IDYyNjI2MTIuLjRlYzk4MTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9tc2didWYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvbXNnYnVmLmMKQEAgLTQ4MSwxMCArNDgxLDkgQEAKIAogc3RhdGljIHZvaWQgYnJjbWZfbXNnYnVmX2lvY3RsX3Jlc3Bfd2FrZShzdHJ1Y3QgYnJjbWZfbXNnYnVmICptc2didWYpCiB7Ci0JaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJm1zZ2J1Zi0+aW9jdGxfcmVzcF93YWl0KSkgewotCQltc2didWYtPmN0bF9jb21wbGV0ZWQgPSB0cnVlOworCW1zZ2J1Zi0+Y3RsX2NvbXBsZXRlZCA9IHRydWU7CisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJm1zZ2J1Zi0+aW9jdGxfcmVzcF93YWl0KSkKIAkJd2FrZV91cCgmbXNnYnVmLT5pb2N0bF9yZXNwX3dhaXQpOwotCX0KIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvbXNnYnVmLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvbXNnYnVmLmgKaW5kZXggNzdhNTFiOC4uM2Q1MTNlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL21zZ2J1Zi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9tc2didWYuaApAQCAtMTcsMTEgKzE3LDExIEBACiAKICNpZmRlZiBDT05GSUdfQlJDTUZNQUNfUFJPVE9fTVNHQlVGCiAKLSNkZWZpbmUgQlJDTUZfSDJEX01TR1JJTkdfQ09OVFJPTF9TVUJNSVRfTUFYX0lURU0JMjAKLSNkZWZpbmUgQlJDTUZfSDJEX01TR1JJTkdfUlhQT1NUX1NVQk1JVF9NQVhfSVRFTQkyNTYKLSNkZWZpbmUgQlJDTUZfRDJIX01TR1JJTkdfQ09OVFJPTF9DT01QTEVURV9NQVhfSVRFTQkyMAorI2RlZmluZSBCUkNNRl9IMkRfTVNHUklOR19DT05UUk9MX1NVQk1JVF9NQVhfSVRFTQk2NAorI2RlZmluZSBCUkNNRl9IMkRfTVNHUklOR19SWFBPU1RfU1VCTUlUX01BWF9JVEVNCTUxMgorI2RlZmluZSBCUkNNRl9EMkhfTVNHUklOR19DT05UUk9MX0NPTVBMRVRFX01BWF9JVEVNCTY0CiAjZGVmaW5lIEJSQ01GX0QySF9NU0dSSU5HX1RYX0NPTVBMRVRFX01BWF9JVEVNCQkxMDI0Ci0jZGVmaW5lIEJSQ01GX0QySF9NU0dSSU5HX1JYX0NPTVBMRVRFX01BWF9JVEVNCQkyNTYKKyNkZWZpbmUgQlJDTUZfRDJIX01TR1JJTkdfUlhfQ09NUExFVEVfTUFYX0lURU0JCTUxMgogI2RlZmluZSBCUkNNRl9IMkRfVFhGTE9XUklOR19NQVhfSVRFTQkJCTUxMgogCiAjZGVmaW5lIEJSQ01GX0gyRF9NU0dSSU5HX0NPTlRST0xfU1VCTUlUX0lURU1TSVpFCTQwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvcDJwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvcDJwLmMKaW5kZXggZWZmYjQ4ZS4uNzEwZmJlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3AycC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9wMnAuYwpAQCAtNjk3LDcgKzY5Nyw3IEBACiAJZWxzZQogCQlzcGFyYW1zLT5zY2FuX3R5cGUgPSAxOwogCi0JbWVtc2V0KCZzcGFyYW1zLT5ic3NpZCwgMHhGRiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcihzcGFyYW1zLT5ic3NpZCk7CiAJaWYgKHNzaWQuU1NJRF9sZW4pCiAJCW1lbWNweShzcGFyYW1zLT5zc2lkX2xlLlNTSUQsIHNzaWQuU1NJRCwgc3NpZC5TU0lEX2xlbik7CiAJc3BhcmFtcy0+c3NpZF9sZS5TU0lEX2xlbiA9IGNwdV90b19sZTMyKHNzaWQuU1NJRF9sZW4pOwpAQCAtMjI0NiwxMSArMjI0NiwxMyBAQAogICoKICAqIEB3aXBoeTogd2lwaHkgZGV2aWNlIG9mIG5ldyBpbnRlcmZhY2UuCiAgKiBAbmFtZTogbmFtZSBvZiB0aGUgbmV3IGludGVyZmFjZS4KKyAqIEBuYW1lX2Fzc2lnbl90eXBlOiBvcmlnaW4gb2YgdGhlIGludGVyZmFjZSBuYW1lCiAgKiBAdHlwZTogbmw4MDIxMSBpbnRlcmZhY2UgdHlwZS4KICAqIEBmbGFnczogbm90IHVzZWQuCiAgKiBAcGFyYW1zOiBjb250YWlucyBtYWMgYWRkcmVzcyBmb3IgUDJQIGRldmljZS4KICAqLwogc3RydWN0IHdpcmVsZXNzX2RldiAqYnJjbWZfcDJwX2FkZF92aWYoc3RydWN0IHdpcGh5ICp3aXBoeSwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICAgdW5zaWduZWQgY2hhciBuYW1lX2Fzc2lnbl90eXBlLAogCQkJCSAgICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsIHUzMiAqZmxhZ3MsCiAJCQkJICAgICAgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpCiB7CkBAIC0yMzEwLDYgKzIzMTIsNyBAQAogCX0KIAogCXN0cm5jcHkoaWZwLT5uZGV2LT5uYW1lLCBuYW1lLCBzaXplb2YoaWZwLT5uZGV2LT5uYW1lKSAtIDEpOworCWlmcC0+bmRldi0+bmFtZV9hc3NpZ25fdHlwZSA9IG5hbWVfYXNzaWduX3R5cGU7CiAJZXJyID0gYnJjbWZfbmV0X2F0dGFjaChpZnAsIHRydWUpOwogCWlmIChlcnIpIHsKIAkJYnJjbWZfZXJyKCJSZWdpc3RlcmluZyBuZXRkZXZpY2UgZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9wMnAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9wMnAuaAppbmRleCA2ODIxYjI2Li44NzJmMzgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvcDJwLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3AycC5oCkBAIC0xNDksNiArMTQ5LDcgQEAKIHMzMiBicmNtZl9wMnBfYXR0YWNoKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9pbmZvICpjZmcpOwogdm9pZCBicmNtZl9wMnBfZGV0YWNoKHN0cnVjdCBicmNtZl9wMnBfaW5mbyAqcDJwKTsKIHN0cnVjdCB3aXJlbGVzc19kZXYgKmJyY21mX3AycF9hZGRfdmlmKHN0cnVjdCB3aXBoeSAqd2lwaHksIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgbmFtZV9hc3NpZ25fdHlwZSwKIAkJCQkgICAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLCB1MzIgKmZsYWdzLAogCQkJCSAgICAgICBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKTsKIGludCBicmNtZl9wMnBfZGVsX3ZpZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9wY2llLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvcGNpZS5jCmluZGV4IDYxYzA1M2EuLjE4MzFlY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9wY2llLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3BjaWUuYwpAQCAtNDcsOCArNDcsNiBAQAogCiAjZGVmaW5lIEJSQ01GX1BDSUVfNDM2MDJfRldfTkFNRQkJImJyY20vYnJjbWZtYWM0MzYwMi1wY2llLmJpbiIKICNkZWZpbmUgQlJDTUZfUENJRV80MzYwMl9OVlJBTV9OQU1FCQkiYnJjbS9icmNtZm1hYzQzNjAyLXBjaWUudHh0IgotI2RlZmluZSBCUkNNRl9QQ0lFXzQzNTRfRldfTkFNRQkJCSJicmNtL2JyY21mbWFjNDM1NC1wY2llLmJpbiIKLSNkZWZpbmUgQlJDTUZfUENJRV80MzU0X05WUkFNX05BTUUJCSJicmNtL2JyY21mbWFjNDM1NC1wY2llLnR4dCIKICNkZWZpbmUgQlJDTUZfUENJRV80MzU2X0ZXX05BTUUJCQkiYnJjbS9icmNtZm1hYzQzNTYtcGNpZS5iaW4iCiAjZGVmaW5lIEJSQ01GX1BDSUVfNDM1Nl9OVlJBTV9OQU1FCQkiYnJjbS9icmNtZm1hYzQzNTYtcGNpZS50eHQiCiAjZGVmaW5lIEJSQ01GX1BDSUVfNDM1NzBfRldfTkFNRQkJImJyY20vYnJjbWZtYWM0MzU3MC1wY2llLmJpbiIKQEAgLTE4Nyw4ICsxODUsOCBAQAogCiBNT0RVTEVfRklSTVdBUkUoQlJDTUZfUENJRV80MzYwMl9GV19OQU1FKTsKIE1PRFVMRV9GSVJNV0FSRShCUkNNRl9QQ0lFXzQzNjAyX05WUkFNX05BTUUpOwotTU9EVUxFX0ZJUk1XQVJFKEJSQ01GX1BDSUVfNDM1NF9GV19OQU1FKTsKLU1PRFVMRV9GSVJNV0FSRShCUkNNRl9QQ0lFXzQzNTRfTlZSQU1fTkFNRSk7CitNT0RVTEVfRklSTVdBUkUoQlJDTUZfUENJRV80MzU2X0ZXX05BTUUpOworTU9EVUxFX0ZJUk1XQVJFKEJSQ01GX1BDSUVfNDM1Nl9OVlJBTV9OQU1FKTsKIE1PRFVMRV9GSVJNV0FSRShCUkNNRl9QQ0lFXzQzNTcwX0ZXX05BTUUpOwogTU9EVUxFX0ZJUk1XQVJFKEJSQ01GX1BDSUVfNDM1NzBfTlZSQU1fTkFNRSk7CiAKQEAgLTUwOSw4ICs1MDcsNiBAQAogCiBzdGF0aWMgaW50IGJyY21mX3BjaWVfZW50ZXJfZG93bmxvYWRfc3RhdGUoc3RydWN0IGJyY21mX3BjaWVkZXZfaW5mbyAqZGV2aW5mbykKIHsKLQlicmNtZl9jaGlwX2VudGVyX2Rvd25sb2FkKGRldmluZm8tPmNpKTsKLQogCWlmIChkZXZpbmZvLT5jaS0+Y2hpcCA9PSBCUkNNX0NDXzQzNjAyX0NISVBfSUQpIHsKIAkJYnJjbWZfcGNpZV9zZWxlY3RfY29yZShkZXZpbmZvLCBCQ01BX0NPUkVfQVJNX0NSNCk7CiAJCWJyY21mX3BjaWVfd3JpdGVfcmVnMzIoZGV2aW5mbywgQlJDTUZfUENJRV9BUk1DUjRSRUdfQkFOS0lEWCwKQEAgLTUzNiw3ICs1MzIsNyBAQAogCQlicmNtZl9jaGlwX3Jlc2V0Y29yZShjb3JlLCAwLCAwLCAwKTsKIAl9CiAKLQlyZXR1cm4gIWJyY21mX2NoaXBfZXhpdF9kb3dubG9hZChkZXZpbmZvLT5jaSwgcmVzZXRpbnRyKTsKKwlyZXR1cm4gIWJyY21mX2NoaXBfc2V0X2FjdGl2ZShkZXZpbmZvLT5jaSwgcmVzZXRpbnRyKTsKIH0KIAogCkBAIC02NTMsMTAgKzY0OSw5IEBACiAJCQljb25zb2xlLT5sb2dfc3RyW2NvbnNvbGUtPmxvZ19pZHhdID0gY2g7CiAJCQljb25zb2xlLT5sb2dfaWR4Kys7CiAJCX0KLQogCQlpZiAoY2ggPT0gJ1xuJykgewogCQkJY29uc29sZS0+bG9nX3N0cltjb25zb2xlLT5sb2dfaWR4XSA9IDA7Ci0JCQlicmNtZl9kYmcoUENJRSwgIkNPTlNPTEU6ICVzXG4iLCBjb25zb2xlLT5sb2dfc3RyKTsKKwkJCWJyY21mX2RiZyhQQ0lFLCAiQ09OU09MRTogJXMiLCBjb25zb2xlLT5sb2dfc3RyKTsKIAkJCWNvbnNvbGUtPmxvZ19pZHggPSAwOwogCQl9CiAJfQpAQCAtMTMyOCwxMCArMTMyMyw2IEBACiAJCWZ3X25hbWUgPSBCUkNNRl9QQ0lFXzQzNjAyX0ZXX05BTUU7CiAJCW52cmFtX25hbWUgPSBCUkNNRl9QQ0lFXzQzNjAyX05WUkFNX05BTUU7CiAJCWJyZWFrOwotCWNhc2UgQlJDTV9DQ180MzU0X0NISVBfSUQ6Ci0JCWZ3X25hbWUgPSBCUkNNRl9QQ0lFXzQzNTRfRldfTkFNRTsKLQkJbnZyYW1fbmFtZSA9IEJSQ01GX1BDSUVfNDM1NF9OVlJBTV9OQU1FOwotCQlicmVhazsKIAljYXNlIEJSQ01fQ0NfNDM1Nl9DSElQX0lEOgogCQlmd19uYW1lID0gQlJDTUZfUENJRV80MzU2X0ZXX05BTUU7CiAJCW52cmFtX25hbWUgPSBCUkNNRl9QQ0lFXzQzNTZfTlZSQU1fTkFNRTsKQEAgLTE1NjYsOCArMTU1Nyw4IEBACiB9CiAKIAotc3RhdGljIHZvaWQgYnJjbWZfcGNpZV9idXNjb3JlX2V4aXRkbCh2b2lkICpjdHgsIHN0cnVjdCBicmNtZl9jaGlwICpjaGlwLAotCQkJCSAgICAgIHUzMiByc3R2ZWMpCitzdGF0aWMgdm9pZCBicmNtZl9wY2llX2J1c2NvcmVfYWN0aXZhdGUodm9pZCAqY3R4LCBzdHJ1Y3QgYnJjbWZfY2hpcCAqY2hpcCwKKwkJCQkJdTMyIHJzdHZlYykKIHsKIAlzdHJ1Y3QgYnJjbWZfcGNpZWRldl9pbmZvICpkZXZpbmZvID0gKHN0cnVjdCBicmNtZl9wY2llZGV2X2luZm8gKiljdHg7CiAKQEAgLTE1NzcsNyArMTU2OCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYnJjbWZfYnVzY29yZV9vcHMgYnJjbWZfcGNpZV9idXNjb3JlX29wcyA9IHsKIAkucHJlcGFyZSA9IGJyY21mX3BjaWVfYnVzY29yZXByZXAsCi0JLmV4aXRfZGwgPSBicmNtZl9wY2llX2J1c2NvcmVfZXhpdGRsLAorCS5hY3RpdmF0ZSA9IGJyY21mX3BjaWVfYnVzY29yZV9hY3RpdmF0ZSwKIAkucmVhZDMyID0gYnJjbWZfcGNpZV9idXNjb3JlX3JlYWQzMiwKIAkud3JpdGUzMiA9IGJyY21mX3BjaWVfYnVzY29yZV93cml0ZTMyLAogfTsKQEAgLTE4NTYsNyArMTg0Nyw2IEBACiAJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0NMQVNTX05FVFdPUktfT1RIRVIgPDwgOCwgMHhmZmZmMDAsIDAgfQogCiBzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYnJjbWZfcGNpZV9kZXZpZF90YWJsZVtdID0gewotCUJSQ01GX1BDSUVfREVWSUNFKEJSQ01fUENJRV80MzU0X0RFVklDRV9JRCksCiAJQlJDTUZfUENJRV9ERVZJQ0UoQlJDTV9QQ0lFXzQzNTZfREVWSUNFX0lEKSwKIAlCUkNNRl9QQ0lFX0RFVklDRShCUkNNX1BDSUVfNDM1NjdfREVWSUNFX0lEKSwKIAlCUkNNRl9QQ0lFX0RFVklDRShCUkNNX1BDSUVfNDM1NzBfREVWSUNFX0lEKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpby5jCmluZGV4IGZhZWMzNWMuLmFiMGM4OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW8uYwpAQCAtNDMyLDggKzQzMiw2IEBACiAJc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2OwkvKiBzZGlvIGRldmljZSBoYW5kbGVyICovCiAJc3RydWN0IGJyY21mX2NoaXAgKmNpOwkvKiBDaGlwIGluZm8gc3RydWN0ICovCiAKLQl1MzIgcmFtc2l6ZTsJCS8qIFNpemUgb2YgUkFNIGluIFNPQ1JBTSAoYnl0ZXMpICovCi0KIAl1MzIgaG9zdGludG1hc2s7CS8qIENvcHkgb2YgSG9zdCBJbnRlcnJ1cHQgTWFzayAqLwogCWF0b21pY190IGludHN0YXR1czsJLyogSW50c3RhdHVzIGJpdHMgKGV2ZW50cykgcGVuZGluZyAqLwogCWF0b21pY190IGZjc3RhdGU7CS8qIFN0YXRlIG9mIGRvbmdsZSBmbG93LWNvbnRyb2wgKi8KQEAgLTQ4NSwxMCArNDgzLDkgQEAKICNlbmRpZgkJCQkvKiBERUJVRyAqLwogCiAJdWludCBjbGtzdGF0ZTsJCS8qIFN0YXRlIG9mIHNkIGFuZCBiYWNrcGxhbmUgY2xvY2socykgKi8KLQlib29sIGFjdGl2aXR5OwkJLyogQWN0aXZpdHkgZmxhZyBmb3IgY2xvY2sgZG93biAqLwogCXMzMiBpZGxldGltZTsJCS8qIENvbnRyb2wgZm9yIGFjdGl2aXR5IHRpbWVvdXQgKi8KLQlzMzIgaWRsZWNvdW50OwkvKiBBY3Rpdml0eSB0aW1lb3V0IGNvdW50ZXIgKi8KLQlzMzIgaWRsZWNsb2NrOwkvKiBIb3cgdG8gc2V0IGJ1cyBkcml2ZXIgd2hlbiBpZGxlICovCisJczMyIGlkbGVjb3VudDsJCS8qIEFjdGl2aXR5IHRpbWVvdXQgY291bnRlciAqLworCXMzMiBpZGxlY2xvY2s7CQkvKiBIb3cgdG8gc2V0IGJ1cyBkcml2ZXIgd2hlbiBpZGxlICovCiAJYm9vbCByeGZsb3dfbW9kZTsJLyogUnggZmxvdyBjb250cm9sIG1vZGUgKi8KIAlib29sIHJ4ZmxvdzsJCS8qIElzIHJ4IGZsb3cgY29udHJvbCBvbiAqLwogCWJvb2wgYWxwX29ubHk7CQkvKiBEb24ndCB1c2UgSFQgY2xvY2sgKEFMUCBvbmx5KSAqLwpAQCAtNTEwLDExICs1MDcsMTMgQEAKIAogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpicmNtZl93cTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGF0YXdvcms7Ci0JYXRvbWljX3QgZHBjX3Rza2NudDsKKwlib29sIGRwY190cmlnZ2VyZWQ7CisJYm9vbCBkcGNfcnVubmluZzsKIAogCWJvb2wgdHhvZmY7CQkvKiBUcmFuc21pdCBmbG93LWNvbnRyb2xsZWQgKi8KIAlzdHJ1Y3QgYnJjbWZfc2Rpb19jb3VudCBzZGNudDsKIAlib29sIHNyX2VuYWJsZWQ7IC8qIFNhdmVSZXN0b3JlIGVuYWJsZWQgKi8KKwlib29sIHNsZWVwaW5nOwogCiAJdTggdHhfaGRybGVuOwkJLyogc2RpbyBidXMgaGVhZGVyIGxlbmd0aCBmb3IgdHggcGFja2V0ICovCiAJYm9vbCB0eGdsb207CQkvKiBob3N0IHR4IGdsb21taW5nIGVuYWJsZSBmbGFnICovCkBAIC02MTYsNiArNjE1LDEwIEBACiAjZGVmaW5lIEJDTTQzMzYyX05WUkFNX05BTUUJCSJicmNtL2JyY21mbWFjNDMzNjItc2Rpby50eHQiCiAjZGVmaW5lIEJDTTQzMzlfRklSTVdBUkVfTkFNRQkJImJyY20vYnJjbWZtYWM0MzM5LXNkaW8uYmluIgogI2RlZmluZSBCQ000MzM5X05WUkFNX05BTUUJCSJicmNtL2JyY21mbWFjNDMzOS1zZGlvLnR4dCIKKyNkZWZpbmUgQkNNNDM0MzBfRklSTVdBUkVfTkFNRQkJImJyY20vYnJjbWZtYWM0MzQzMC1zZGlvLmJpbiIKKyNkZWZpbmUgQkNNNDM0MzBfTlZSQU1fTkFNRQkJImJyY20vYnJjbWZtYWM0MzQzMC1zZGlvLnR4dCIKKyNkZWZpbmUgQkNNNDM0NTVfRklSTVdBUkVfTkFNRQkJImJyY20vYnJjbWZtYWM0MzQ1NS1zZGlvLmJpbiIKKyNkZWZpbmUgQkNNNDM0NTVfTlZSQU1fTkFNRQkJImJyY20vYnJjbWZtYWM0MzQ1NS1zZGlvLnR4dCIKICNkZWZpbmUgQkNNNDM1NF9GSVJNV0FSRV9OQU1FCQkiYnJjbS9icmNtZm1hYzQzNTQtc2Rpby5iaW4iCiAjZGVmaW5lIEJDTTQzNTRfTlZSQU1fTkFNRQkJImJyY20vYnJjbWZtYWM0MzU0LXNkaW8udHh0IgogCkBAIC02MzksNiArNjQyLDEwIEBACiBNT0RVTEVfRklSTVdBUkUoQkNNNDMzNjJfTlZSQU1fTkFNRSk7CiBNT0RVTEVfRklSTVdBUkUoQkNNNDMzOV9GSVJNV0FSRV9OQU1FKTsKIE1PRFVMRV9GSVJNV0FSRShCQ000MzM5X05WUkFNX05BTUUpOworTU9EVUxFX0ZJUk1XQVJFKEJDTTQzNDMwX0ZJUk1XQVJFX05BTUUpOworTU9EVUxFX0ZJUk1XQVJFKEJDTTQzNDMwX05WUkFNX05BTUUpOworTU9EVUxFX0ZJUk1XQVJFKEJDTTQzNDU1X0ZJUk1XQVJFX05BTUUpOworTU9EVUxFX0ZJUk1XQVJFKEJDTTQzNDU1X05WUkFNX05BTUUpOwogTU9EVUxFX0ZJUk1XQVJFKEJDTTQzNTRfRklSTVdBUkVfTkFNRSk7CiBNT0RVTEVfRklSTVdBUkUoQkNNNDM1NF9OVlJBTV9OQU1FKTsKIApAQCAtNjY4LDYgKzY3NSw4IEBACiAJeyBCUkNNX0NDXzQzMzVfQ0hJUF9JRCwgMHhGRkZGRkZGRiwgQlJDTUZfRklSTVdBUkVfTlZSQU0oQkNNNDMzNSkgfSwKIAl7IEJSQ01fQ0NfNDMzNjJfQ0hJUF9JRCwgMHhGRkZGRkZGRSwgQlJDTUZfRklSTVdBUkVfTlZSQU0oQkNNNDMzNjIpIH0sCiAJeyBCUkNNX0NDXzQzMzlfQ0hJUF9JRCwgMHhGRkZGRkZGRiwgQlJDTUZfRklSTVdBUkVfTlZSQU0oQkNNNDMzOSkgfSwKKwl7IEJSQ01fQ0NfNDM0MzBfQ0hJUF9JRCwgMHhGRkZGRkZGRiwgQlJDTUZfRklSTVdBUkVfTlZSQU0oQkNNNDM0MzApIH0sCisJeyBCUkNNX0NDXzQzNDVfQ0hJUF9JRCwgMHhGRkZGRkZDMCwgQlJDTUZfRklSTVdBUkVfTlZSQU0oQkNNNDM0NTUpIH0sCiAJeyBCUkNNX0NDXzQzNTRfQ0hJUF9JRCwgMHhGRkZGRkZGRiwgQlJDTUZfRklSTVdBUkVfTlZSQU0oQkNNNDM1NCkgfQogfTsKIApAQCAtOTU4LDEzICs5NjcsOCBAQAogCWJyY21mX2RiZyhTRElPLCAiRW50ZXJcbiIpOwogCiAJLyogRWFybHkgZXhpdCBpZiB3ZSdyZSBhbHJlYWR5IHRoZXJlICovCi0JaWYgKGJ1cy0+Y2xrc3RhdGUgPT0gdGFyZ2V0KSB7Ci0JCWlmICh0YXJnZXQgPT0gQ0xLX0FWQUlMKSB7Ci0JCQlicmNtZl9zZGlvX3dkX3RpbWVyKGJ1cywgQlJDTUZfV0RfUE9MTF9NUyk7Ci0JCQlidXMtPmFjdGl2aXR5ID0gdHJ1ZTsKLQkJfQorCWlmIChidXMtPmNsa3N0YXRlID09IHRhcmdldCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJc3dpdGNoICh0YXJnZXQpIHsKIAljYXNlIENMS19BVkFJTDoKQEAgLTk3Myw4ICs5NzcsNiBAQAogCQkJYnJjbWZfc2Rpb19zZGNsayhidXMsIHRydWUpOwogCQkvKiBOb3cgcmVxdWVzdCBIVCBBdmFpbCBvbiB0aGUgYmFja3BsYW5lICovCiAJCWJyY21mX3NkaW9faHRjbGsoYnVzLCB0cnVlLCBwZW5kb2spOwotCQlicmNtZl9zZGlvX3dkX3RpbWVyKGJ1cywgQlJDTUZfV0RfUE9MTF9NUyk7Ci0JCWJ1cy0+YWN0aXZpdHkgPSB0cnVlOwogCQlicmVhazsKIAogCWNhc2UgQ0xLX1NET05MWToKQEAgLTk4Niw3ICs5ODgsNiBAQAogCQllbHNlCiAJCQlicmNtZl9lcnIoInJlcXVlc3QgZm9yICVkIC0+ICVkXG4iLAogCQkJCSAgYnVzLT5jbGtzdGF0ZSwgdGFyZ2V0KTsKLQkJYnJjbWZfc2Rpb193ZF90aW1lcihidXMsIEJSQ01GX1dEX1BPTExfTVMpOwogCQlicmVhazsKIAogCWNhc2UgQ0xLX05PTkU6CkBAIC05OTUsNyArOTk2LDYgQEAKIAkJCWJyY21mX3NkaW9faHRjbGsoYnVzLCBmYWxzZSwgZmFsc2UpOwogCQkvKiBOb3cgcmVtb3ZlIHRoZSBTRCBjbG9jayAqLwogCQlicmNtZl9zZGlvX3NkY2xrKGJ1cywgZmFsc2UpOwotCQlicmNtZl9zZGlvX3dkX3RpbWVyKGJ1cywgMCk7CiAJCWJyZWFrOwogCX0KICNpZmRlZiBERUJVRwpAQCAtMTAxMywyNiArMTAxMywxNiBAQAogCiAJYnJjbWZfZGJnKFNESU8sICJFbnRlcjogcmVxdWVzdCAlcyBjdXJyZW50bHkgJXNcbiIsCiAJCSAgKHNsZWVwID8gIlNMRUVQIiA6ICJXQUtFIiksCi0JCSAgKGJ1cy0+c2Rpb2Rldi0+c2xlZXBpbmcgPyAiU0xFRVAiIDogIldBS0UiKSk7CisJCSAgKGJ1cy0+c2xlZXBpbmcgPyAiU0xFRVAiIDogIldBS0UiKSk7CiAKIAkvKiBJZiBTUiBpcyBlbmFibGVkIGNvbnRyb2wgYnVzIHN0YXRlIHdpdGggS1NPICovCiAJaWYgKGJ1cy0+c3JfZW5hYmxlZCkgewogCQkvKiBEb25lIGlmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIHJlcXVlc3RlZCBzdGF0ZSAqLwotCQlpZiAoc2xlZXAgPT0gYnVzLT5zZGlvZGV2LT5zbGVlcGluZykKKwkJaWYgKHNsZWVwID09IGJ1cy0+c2xlZXBpbmcpCiAJCQlnb3RvIGVuZDsKIAogCQkvKiBHb2luZyB0byBzbGVlcCAqLwogCQlpZiAoc2xlZXApIHsKLQkJCS8qIERvbid0IHNsZWVwIGlmIHNvbWV0aGluZyBpcyBwZW5kaW5nICovCi0JCQlpZiAoYXRvbWljX3JlYWQoJmJ1cy0+aW50c3RhdHVzKSB8fAotCQkJICAgIGF0b21pY19yZWFkKCZidXMtPmlwZW5kKSA+IDAgfHwKLQkJCSAgICAoIWF0b21pY19yZWFkKCZidXMtPmZjc3RhdGUpICYmCi0JCQkgICAgYnJjbXVfcGt0cV9tbGVuKCZidXMtPnR4cSwgfmJ1cy0+Zmxvd2NvbnRyb2wpICYmCi0JCQkgICAgZGF0YV9vayhidXMpKSkgewotCQkJCSBlcnIgPSAtRUJVU1k7Ci0JCQkJIGdvdG8gZG9uZTsKLQkJCX0KLQogCQkJY2xrY3NyID0gYnJjbWZfc2Rpb2RfcmVncmIoYnVzLT5zZGlvZGV2LAogCQkJCQkJICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsCiAJCQkJCQkgICAmZXJyKTsKQEAgLTEwNDMsMTEgKzEwMzMsNyBAQAogCQkJCQkJICBTQlNESU9fQUxQX0FWQUlMX1JFUSwgJmVycik7CiAJCQl9CiAJCQllcnIgPSBicmNtZl9zZGlvX2tzb19jb250cm9sKGJ1cywgZmFsc2UpOwotCQkJLyogZGlzYWJsZSB3YXRjaGRvZyAqLwotCQkJaWYgKCFlcnIpCi0JCQkJYnJjbWZfc2Rpb193ZF90aW1lcihidXMsIDApOwogCQl9IGVsc2UgewotCQkJYnVzLT5pZGxlY291bnQgPSAwOwogCQkJZXJyID0gYnJjbWZfc2Rpb19rc29fY29udHJvbChidXMsIHRydWUpOwogCQl9CiAJCWlmIChlcnIpIHsKQEAgLTEwNjQsMTAgKzEwNTAsOSBAQAogCQkJYnJjbWZfc2Rpb19jbGtjdGwoYnVzLCBDTEtfTk9ORSwgcGVuZG9rKTsKIAl9IGVsc2UgewogCQlicmNtZl9zZGlvX2Nsa2N0bChidXMsIENMS19BVkFJTCwgcGVuZG9rKTsKKwkJYnJjbWZfc2Rpb193ZF90aW1lcihidXMsIEJSQ01GX1dEX1BPTExfTVMpOwogCX0KLQlidXMtPnNkaW9kZXYtPnNsZWVwaW5nID0gc2xlZXA7Ci0JaWYgKHNsZWVwKQotCQl3YWtlX3VwKCZidXMtPnNkaW9kZXYtPmlkbGVfd2FpdCk7CisJYnVzLT5zbGVlcGluZyA9IHNsZWVwOwogCWJyY21mX2RiZyhTRElPLCAibmV3IHN0YXRlICVzXG4iLAogCQkgIChzbGVlcCA/ICJTTEVFUCIgOiAiV0FLRSIpKTsKIGRvbmU6CkBAIC0xMDg1LDQ0ICsxMDcwLDQ3IEBACiBzdGF0aWMgaW50IGJyY21mX3NkaW9fcmVhZHNoYXJlZChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLAogCQkJCSBzdHJ1Y3Qgc2RwY21fc2hhcmVkICpzaCkKIHsKLQl1MzIgYWRkcjsKKwl1MzIgYWRkciA9IDA7CiAJaW50IHJ2OwogCXUzMiBzaGFkZHIgPSAwOwogCXN0cnVjdCBzZHBjbV9zaGFyZWRfbGUgc2hfbGU7CiAJX19sZTMyIGFkZHJfbGU7CiAKLQlzaGFkZHIgPSBidXMtPmNpLT5yYW1iYXNlICsgYnVzLT5yYW1zaXplIC0gNDsKKwlzZGlvX2NsYWltX2hvc3QoYnVzLT5zZGlvZGV2LT5mdW5jWzFdKTsKKwlicmNtZl9zZGlvX2J1c19zbGVlcChidXMsIGZhbHNlLCBmYWxzZSk7CiAKIAkvKgogCSAqIFJlYWQgbGFzdCB3b3JkIGluIHNvY3JhbSB0byBkZXRlcm1pbmUKIAkgKiBhZGRyZXNzIG9mIHNkcGNtX3NoYXJlZCBzdHJ1Y3R1cmUKIAkgKi8KLQlzZGlvX2NsYWltX2hvc3QoYnVzLT5zZGlvZGV2LT5mdW5jWzFdKTsKLQlicmNtZl9zZGlvX2J1c19zbGVlcChidXMsIGZhbHNlLCBmYWxzZSk7Ci0JcnYgPSBicmNtZl9zZGlvZF9yYW1ydyhidXMtPnNkaW9kZXYsIGZhbHNlLCBzaGFkZHIsICh1OCAqKSZhZGRyX2xlLCA0KTsKLQlzZGlvX3JlbGVhc2VfaG9zdChidXMtPnNkaW9kZXYtPmZ1bmNbMV0pOworCXNoYWRkciA9IGJ1cy0+Y2ktPnJhbWJhc2UgKyBidXMtPmNpLT5yYW1zaXplIC0gNDsKKwlpZiAoIWJ1cy0+Y2ktPnJhbWJhc2UgJiYgYnJjbWZfY2hpcF9zcl9jYXBhYmxlKGJ1cy0+Y2kpKQorCQlzaGFkZHIgLT0gYnVzLT5jaS0+c3JzaXplOworCXJ2ID0gYnJjbWZfc2Rpb2RfcmFtcncoYnVzLT5zZGlvZGV2LCBmYWxzZSwgc2hhZGRyLAorCQkJICAgICAgICh1OCAqKSZhZGRyX2xlLCA0KTsKIAlpZiAocnYgPCAwKQotCQlyZXR1cm4gcnY7Ci0KLQlhZGRyID0gbGUzMl90b19jcHUoYWRkcl9sZSk7Ci0KLQlicmNtZl9kYmcoU0RJTywgInNkcGNtX3NoYXJlZCBhZGRyZXNzIDB4JTA4WFxuIiwgYWRkcik7CisJCWdvdG8gZmFpbDsKIAogCS8qCiAJICogQ2hlY2sgaWYgYWRkciBpcyB2YWxpZC4KIAkgKiBOVlJBTSBsZW5ndGggYXQgdGhlIGVuZCBvZiBtZW1vcnkgc2hvdWxkIGhhdmUgYmVlbiBvdmVyd3JpdHRlbi4KIAkgKi8KKwlhZGRyID0gbGUzMl90b19jcHUoYWRkcl9sZSk7CiAJaWYgKCFicmNtZl9zZGlvX3ZhbGlkX3NoYXJlZF9hZGRyZXNzKGFkZHIpKSB7Ci0JCQlicmNtZl9lcnIoImludmFsaWQgc2RwY21fc2hhcmVkIGFkZHJlc3MgMHglMDhYXG4iLAotCQkJCSAgYWRkcik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJjbWZfZXJyKCJpbnZhbGlkIHNkcGNtX3NoYXJlZCBhZGRyZXNzIDB4JTA4WFxuIiwgYWRkcik7CisJCXJ2ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsOwogCX0KIAorCWJyY21mX2RiZyhJTkZPLCAic2RwY21fc2hhcmVkIGFkZHJlc3MgMHglMDhYXG4iLCBhZGRyKTsKKwogCS8qIFJlYWQgaG5kcnRlX3NoYXJlZCBzdHJ1Y3R1cmUgKi8KIAlydiA9IGJyY21mX3NkaW9kX3JhbXJ3KGJ1cy0+c2Rpb2RldiwgZmFsc2UsIGFkZHIsICh1OCAqKSZzaF9sZSwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IHNkcGNtX3NoYXJlZF9sZSkpOwogCWlmIChydiA8IDApCi0JCXJldHVybiBydjsKKwkJZ290byBmYWlsOworCisJc2Rpb19yZWxlYXNlX2hvc3QoYnVzLT5zZGlvZGV2LT5mdW5jWzFdKTsKIAogCS8qIEVuZGlhbm5lc3MgKi8KIAlzaC0+ZmxhZ3MgPSBsZTMyX3RvX2NwdShzaF9sZS5mbGFncyk7CkBAIC0xMTM5LDggKzExMjcsMTMgQEAKIAkJCSAgc2gtPmZsYWdzICYgU0RQQ01fU0hBUkVEX1ZFUlNJT05fTUFTSyk7CiAJCXJldHVybiAtRVBST1RPOwogCX0KLQogCXJldHVybiAwOworCitmYWlsOgorCWJyY21mX2VycigidW5hYmxlIHRvIG9idGFpbiBzZHBjbV9zaGFyZWQgaW5mbzogcnY9JWQgKGFkZHI9MHgleClcbiIsCisJCSAgcnYsIGFkZHIpOworCXNkaW9fcmVsZWFzZV9ob3N0KGJ1cy0+c2Rpb2Rldi0+ZnVuY1sxXSk7CisJcmV0dXJuIHJ2OwogfQogCiBzdGF0aWMgdm9pZCBicmNtZl9zZGlvX2dldF9jb25zb2xlX2FkZHIoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKQEAgLTE5MDksNyArMTkwMiw3IEBACiAJYnVzLT5yeHBlbmRpbmcgPSB0cnVlOwogCiAJZm9yIChyZC0+c2VxX251bSA9IGJ1cy0+cnhfc2VxLCByeGxlZnQgPSBtYXhmcmFtZXM7Ci0JICAgICAhYnVzLT5yeHNraXAgJiYgcnhsZWZ0ICYmIGJ1cy0+c2Rpb2Rldi0+c3RhdGUgPT0gQlJDTUZfU1RBVEVfREFUQTsKKwkgICAgICFidXMtPnJ4c2tpcCAmJiByeGxlZnQgJiYgYnVzLT5zZGlvZGV2LT5zdGF0ZSA9PSBCUkNNRl9TRElPRF9EQVRBOwogCSAgICAgcmQtPnNlcV9udW0rKywgcnhsZWZ0LS0pIHsKIAogCQkvKiBIYW5kbGUgZ2xvbW1pbmcgc2VwYXJhdGVseSAqLwpAQCAtMjQxNSw3ICsyNDA4LDcgQEAKIAl9CiAKIAkvKiBEZWZsb3ctY29udHJvbCBzdGFjayBpZiBuZWVkZWQgKi8KLQlpZiAoKGJ1cy0+c2Rpb2Rldi0+c3RhdGUgPT0gQlJDTUZfU1RBVEVfREFUQSkgJiYKKwlpZiAoKGJ1cy0+c2Rpb2Rldi0+c3RhdGUgPT0gQlJDTUZfU0RJT0RfREFUQSkgJiYKIAkgICAgYnVzLT50eG9mZiAmJiAocGt0cV9sZW4oJmJ1cy0+dHhxKSA8IFRYTE9XKSkgewogCQlidXMtPnR4b2ZmID0gZmFsc2U7CiAJCWJyY21mX3R4Zmxvd2Jsb2NrKGJ1cy0+c2Rpb2Rldi0+ZGV2LCBmYWxzZSk7CkBAIC0yNTAzLDcgKzI0OTYsNyBAQAogCQlidXMtPndhdGNoZG9nX3RzayA9IE5VTEw7CiAJfQogCi0JaWYgKHNkaW9kZXYtPnN0YXRlICE9IEJSQ01GX1NUQVRFX05PTUVESVVNKSB7CisJaWYgKHNkaW9kZXYtPnN0YXRlICE9IEJSQ01GX1NESU9EX05PTUVESVVNKSB7CiAJCXNkaW9fY2xhaW1faG9zdChzZGlvZGV2LT5mdW5jWzFdKTsKIAogCQkvKiBFbmFibGUgY2xvY2sgZm9yIGRldmljZSBpbnRlcnJ1cHRzICovCkBAIC0yNjAzLDIxICsyNTk2LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGJyY21mX3NkaW9fcG1fcmVzdW1lX3dhaXQoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KQotewotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotCWludCByZXRyeTsKLQotCS8qIFdhaXQgZm9yIHBvc3NpYmxlIHJlc3VtZSB0byBjb21wbGV0ZSAqLwotCXJldHJ5ID0gMDsKLQl3aGlsZSAoKGF0b21pY19yZWFkKCZzZGlvZGV2LT5zdXNwZW5kKSkgJiYgKHJldHJ5KysgIT0gNTApKQotCQltc2xlZXAoMjApOwotCWlmIChhdG9taWNfcmVhZCgmc2Rpb2Rldi0+c3VzcGVuZCkpCi0JCXJldHVybiAtRUlPOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIGJyY21mX3NkaW9fZHBjKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJdTMyIG5ld3N0YXR1cyA9IDA7CkBAIC0yNjI4LDkgKzI2MDYsNiBAQAogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCi0JaWYgKGJyY21mX3NkaW9fcG1fcmVzdW1lX3dhaXQoYnVzLT5zZGlvZGV2KSkKLQkJcmV0dXJuOwotCiAJc2Rpb19jbGFpbV9ob3N0KGJ1cy0+c2Rpb2Rldi0+ZnVuY1sxXSk7CiAKIAkvKiBJZiB3YWl0aW5nIGZvciBIVEFWQUlMLCBjaGVjayBzdGF0dXMgKi8KQEAgLTI3MzksMTEgKzI3MTQsMTQgQEAKIAlpZiAoYnVzLT5jdHJsX2ZyYW1lX3N0YXQgJiYgKGJ1cy0+Y2xrc3RhdGUgPT0gQ0xLX0FWQUlMKSAmJgogCSAgICBkYXRhX29rKGJ1cykpIHsKIAkJc2Rpb19jbGFpbV9ob3N0KGJ1cy0+c2Rpb2Rldi0+ZnVuY1sxXSk7Ci0JCWVyciA9IGJyY21mX3NkaW9fdHhfY3RybGZyYW1lKGJ1cywgIGJ1cy0+Y3RybF9mcmFtZV9idWYsCi0JCQkJCSAgICAgIGJ1cy0+Y3RybF9mcmFtZV9sZW4pOworCQlpZiAoYnVzLT5jdHJsX2ZyYW1lX3N0YXQpIHsKKwkJCWVyciA9IGJyY21mX3NkaW9fdHhfY3RybGZyYW1lKGJ1cywgIGJ1cy0+Y3RybF9mcmFtZV9idWYsCisJCQkJCQkgICAgICBidXMtPmN0cmxfZnJhbWVfbGVuKTsKKwkJCWJ1cy0+Y3RybF9mcmFtZV9lcnIgPSBlcnI7CisJCQl3bWIoKTsKKwkJCWJ1cy0+Y3RybF9mcmFtZV9zdGF0ID0gZmFsc2U7CisJCX0KIAkJc2Rpb19yZWxlYXNlX2hvc3QoYnVzLT5zZGlvZGV2LT5mdW5jWzFdKTsKLQkJYnVzLT5jdHJsX2ZyYW1lX2VyciA9IGVycjsKLQkJYnVzLT5jdHJsX2ZyYW1lX3N0YXQgPSBmYWxzZTsKIAkJYnJjbWZfc2Rpb193YWl0X2V2ZW50X3dha2V1cChidXMpOwogCX0KIAkvKiBTZW5kIHF1ZXVlZCBmcmFtZXMgKGxpbWl0IDEgaWYgcnggbWF5IHN0aWxsIGJlIHBlbmRpbmcpICovCkBAIC0yNzU1LDE1ICsyNzMzLDI1IEBACiAJCWJyY21mX3NkaW9fc2VuZGZyb21xKGJ1cywgZnJhbWVjbnQpOwogCX0KIAotCWlmICgoYnVzLT5zZGlvZGV2LT5zdGF0ZSAhPSBCUkNNRl9TVEFURV9EQVRBKSB8fCAoZXJyICE9IDApKSB7CisJaWYgKChidXMtPnNkaW9kZXYtPnN0YXRlICE9IEJSQ01GX1NESU9EX0RBVEEpIHx8IChlcnIgIT0gMCkpIHsKIAkJYnJjbWZfZXJyKCJmYWlsZWQgYmFja3BsYW5lIGFjY2VzcyBvdmVyIFNESU8sIGhhbHRpbmcgb3BlcmF0aW9uXG4iKTsKIAkJYXRvbWljX3NldCgmYnVzLT5pbnRzdGF0dXMsIDApOworCQlpZiAoYnVzLT5jdHJsX2ZyYW1lX3N0YXQpIHsKKwkJCXNkaW9fY2xhaW1faG9zdChidXMtPnNkaW9kZXYtPmZ1bmNbMV0pOworCQkJaWYgKGJ1cy0+Y3RybF9mcmFtZV9zdGF0KSB7CisJCQkJYnVzLT5jdHJsX2ZyYW1lX2VyciA9IC1FTk9ERVY7CisJCQkJd21iKCk7CisJCQkJYnVzLT5jdHJsX2ZyYW1lX3N0YXQgPSBmYWxzZTsKKwkJCQlicmNtZl9zZGlvX3dhaXRfZXZlbnRfd2FrZXVwKGJ1cyk7CisJCQl9CisJCQlzZGlvX3JlbGVhc2VfaG9zdChidXMtPnNkaW9kZXYtPmZ1bmNbMV0pOworCQl9CiAJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmYnVzLT5pbnRzdGF0dXMpIHx8CiAJCSAgIGF0b21pY19yZWFkKCZidXMtPmlwZW5kKSA+IDAgfHwKIAkJICAgKCFhdG9taWNfcmVhZCgmYnVzLT5mY3N0YXRlKSAmJgogCQkgICAgYnJjbXVfcGt0cV9tbGVuKCZidXMtPnR4cSwgfmJ1cy0+Zmxvd2NvbnRyb2wpICYmCiAJCSAgICBkYXRhX29rKGJ1cykpKSB7Ci0JCWF0b21pY19pbmMoJmJ1cy0+ZHBjX3Rza2NudCk7CisJCWJ1cy0+ZHBjX3RyaWdnZXJlZCA9IHRydWU7CiAJfQogfQogCkBAIC0yODYyLDExICsyODUwLDcgQEAKIAkJcWNvdW50W3ByZWNdID0gcGt0cV9wbGVuKCZidXMtPnR4cSwgcHJlYyk7CiAjZW5kaWYKIAotCWlmIChhdG9taWNfcmVhZCgmYnVzLT5kcGNfdHNrY250KSA9PSAwKSB7Ci0JCWF0b21pY19pbmMoJmJ1cy0+ZHBjX3Rza2NudCk7Ci0JCXF1ZXVlX3dvcmsoYnVzLT5icmNtZl93cSwgJmJ1cy0+ZGF0YXdvcmspOwotCX0KLQorCWJyY21mX3NkaW9fdHJpZ2dlcl9kcGMoYnVzKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0yOTYzLDIzICsyOTQ3LDI3IEBACiAJLyogU2VuZCBmcm9tIGRwYyAqLwogCWJ1cy0+Y3RybF9mcmFtZV9idWYgPSBtc2c7CiAJYnVzLT5jdHJsX2ZyYW1lX2xlbiA9IG1zZ2xlbjsKKwl3bWIoKTsKIAlidXMtPmN0cmxfZnJhbWVfc3RhdCA9IHRydWU7Ci0JaWYgKGF0b21pY19yZWFkKCZidXMtPmRwY190c2tjbnQpID09IDApIHsKLQkJYXRvbWljX2luYygmYnVzLT5kcGNfdHNrY250KTsKLQkJcXVldWVfd29yayhidXMtPmJyY21mX3dxLCAmYnVzLT5kYXRhd29yayk7Ci0JfQogCisJYnJjbWZfc2Rpb190cmlnZ2VyX2RwYyhidXMpOwogCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGJ1cy0+Y3RybF93YWl0LCAhYnVzLT5jdHJsX2ZyYW1lX3N0YXQsCiAJCQkJCSBtc2Vjc190b19qaWZmaWVzKENUTF9ET05FX1RJTUVPVVQpKTsKLQotCWlmICghYnVzLT5jdHJsX2ZyYW1lX3N0YXQpIHsKKwlyZXQgPSAwOworCWlmIChidXMtPmN0cmxfZnJhbWVfc3RhdCkgeworCQlzZGlvX2NsYWltX2hvc3QoYnVzLT5zZGlvZGV2LT5mdW5jWzFdKTsKKwkJaWYgKGJ1cy0+Y3RybF9mcmFtZV9zdGF0KSB7CisJCQlicmNtZl9kYmcoU0RJTywgImN0cmxfZnJhbWUgdGltZW91dFxuIik7CisJCQlidXMtPmN0cmxfZnJhbWVfc3RhdCA9IGZhbHNlOworCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJfQorCQlzZGlvX3JlbGVhc2VfaG9zdChidXMtPnNkaW9kZXYtPmZ1bmNbMV0pOworCX0KKwlpZiAoIXJldCkgewogCQlicmNtZl9kYmcoU0RJTywgImN0cmxfZnJhbWUgY29tcGxldGUsIGVycj0lZFxuIiwKIAkJCSAgYnVzLT5jdHJsX2ZyYW1lX2Vycik7CisJCXJtYigpOwogCQlyZXQgPSBidXMtPmN0cmxfZnJhbWVfZXJyOwotCX0gZWxzZSB7Ci0JCWJyY21mX2RiZyhTRElPLCAiY3RybF9mcmFtZSB0aW1lb3V0XG4iKTsKLQkJYnVzLT5jdHJsX2ZyYW1lX3N0YXQgPSBmYWxzZTsKLQkJcmV0ID0gLUVUSU1FRE9VVDsKIAl9CiAKIAlpZiAocmV0KQpAQCAtMzM4Myw5ICszMzcxLDYgQEAKIAlzZGlvX2NsYWltX2hvc3QoYnVzLT5zZGlvZGV2LT5mdW5jWzFdKTsKIAlicmNtZl9zZGlvX2Nsa2N0bChidXMsIENMS19BVkFJTCwgZmFsc2UpOwogCi0JLyogS2VlcCBhcm0gaW4gcmVzZXQgKi8KLQlicmNtZl9jaGlwX2VudGVyX2Rvd25sb2FkKGJ1cy0+Y2kpOwotCiAJcnN0dmVjID0gZ2V0X3VuYWxpZ25lZF9sZTMyKGZ3LT5kYXRhKTsKIAlicmNtZl9kYmcoU0RJTywgImZpcm13YXJlIHJzdHZlYzogJXhcbiIsIHJzdHZlYyk7CiAKQEAgLTM0MDUsMTMgKzMzOTAsMTMgQEAKIAl9CiAKIAkvKiBUYWtlIGFybSBvdXQgb2YgcmVzZXQgKi8KLQlpZiAoIWJyY21mX2NoaXBfZXhpdF9kb3dubG9hZChidXMtPmNpLCByc3R2ZWMpKSB7CisJaWYgKCFicmNtZl9jaGlwX3NldF9hY3RpdmUoYnVzLT5jaSwgcnN0dmVjKSkgewogCQlicmNtZl9lcnIoImVycm9yIGdldHRpbmcgb3V0IG9mIEFSTSBjb3JlIHJlc2V0XG4iKTsKIAkJZ290byBlcnI7CiAJfQogCiAJLyogQWxsb3cgZnVsbCBkYXRhIGNvbW11bmljYXRpb24gdXNpbmcgRFBDIGZyb20gbm93IG9uLiAqLwotCWJ1cy0+c2Rpb2Rldi0+c3RhdGUgPSBCUkNNRl9TVEFURV9EQVRBOworCWJyY21mX3NkaW9kX2NoYW5nZV9zdGF0ZShidXMtPnNkaW9kZXYsIEJSQ01GX1NESU9EX0RBVEEpOwogCWJjbWVycm9yID0gMDsKIAogZXJyOgpAQCAtMzU0OCw2ICszNTMzLDE0IEBACiAJcmV0dXJuIGVycjsKIH0KIAordm9pZCBicmNtZl9zZGlvX3RyaWdnZXJfZHBjKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCit7CisJaWYgKCFidXMtPmRwY190cmlnZ2VyZWQpIHsKKwkJYnVzLT5kcGNfdHJpZ2dlcmVkID0gdHJ1ZTsKKwkJcXVldWVfd29yayhidXMtPmJyY21mX3dxLCAmYnVzLT5kYXRhd29yayk7CisJfQorfQorCiB2b2lkIGJyY21mX3NkaW9faXNyKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwpAQCAtMzU1Nyw3ICszNTUwLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChidXMtPnNkaW9kZXYtPnN0YXRlICE9IEJSQ01GX1NUQVRFX0RBVEEpIHsKKwlpZiAoYnVzLT5zZGlvZGV2LT5zdGF0ZSAhPSBCUkNNRl9TRElPRF9EQVRBKSB7CiAJCWJyY21mX2VycigiYnVzIGlzIGRvd24uIHdlIGhhdmUgbm90aGluZyB0byBkb1xuIik7CiAJCXJldHVybjsKIAl9CkBAIC0zNTc0LDExICszNTY3LDExIEBACiAJaWYgKCFidXMtPmludHIpCiAJCWJyY21mX2VycigiaXNyIHcvbyBpbnRlcnJ1cHQgY29uZmlndXJlZCFcbiIpOwogCi0JYXRvbWljX2luYygmYnVzLT5kcGNfdHNrY250KTsKKwlidXMtPmRwY190cmlnZ2VyZWQgPSB0cnVlOwogCXF1ZXVlX3dvcmsoYnVzLT5icmNtZl93cSwgJmJ1cy0+ZGF0YXdvcmspOwogfQogCi1zdGF0aWMgYm9vbCBicmNtZl9zZGlvX2J1c193YXRjaGRvZyhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQorc3RhdGljIHZvaWQgYnJjbWZfc2Rpb19idXNfd2F0Y2hkb2coc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlicmNtZl9kYmcoVElNRVIsICJFbnRlclxuIik7CiAKQEAgLTM1OTQsNyArMzU4Nyw3IEBACiAJCWlmICghYnVzLT5pbnRyIHx8CiAJCSAgICAoYnVzLT5zZGNudC5pbnRyY291bnQgPT0gYnVzLT5zZGNudC5sYXN0aW50cnMpKSB7CiAKLQkJCWlmIChhdG9taWNfcmVhZCgmYnVzLT5kcGNfdHNrY250KSA9PSAwKSB7CisJCQlpZiAoIWJ1cy0+ZHBjX3RyaWdnZXJlZCkgewogCQkJCXU4IGRldnBlbmQ7CiAKIAkJCQlzZGlvX2NsYWltX2hvc3QoYnVzLT5zZGlvZGV2LT5mdW5jWzFdKTsKQEAgLTM2MDIsOSArMzU5NSw4IEBACiAJCQkJCQkJICAgIFNESU9fQ0NDUl9JTlR4LAogCQkJCQkJCSAgICBOVUxMKTsKIAkJCQlzZGlvX3JlbGVhc2VfaG9zdChidXMtPnNkaW9kZXYtPmZ1bmNbMV0pOwotCQkJCWludHN0YXR1cyA9Ci0JCQkJICAgIGRldnBlbmQgJiAoSU5UUl9TVEFUVVNfRlVOQzEgfAotCQkJCQkgICAgICAgSU5UUl9TVEFUVVNfRlVOQzIpOworCQkJCWludHN0YXR1cyA9IGRldnBlbmQgJiAoSU5UUl9TVEFUVVNfRlVOQzEgfAorCQkJCQkJICAgICAgIElOVFJfU1RBVFVTX0ZVTkMyKTsKIAkJCX0KIAogCQkJLyogSWYgdGhlcmUgaXMgc29tZXRoaW5nLCBtYWtlIGxpa2UgdGhlIElTUiBhbmQKQEAgLTM2MTMsNyArMzYwNSw3IEBACiAJCQkJYnVzLT5zZGNudC5wb2xsY250Kys7CiAJCQkJYXRvbWljX3NldCgmYnVzLT5pcGVuZCwgMSk7CiAKLQkJCQlhdG9taWNfaW5jKCZidXMtPmRwY190c2tjbnQpOworCQkJCWJ1cy0+ZHBjX3RyaWdnZXJlZCA9IHRydWU7CiAJCQkJcXVldWVfd29yayhidXMtPmJyY21mX3dxLCAmYnVzLT5kYXRhd29yayk7CiAJCQl9CiAJCX0KQEAgLTM2MjMsNyArMzYxNSw3IEBACiAJfQogI2lmZGVmIERFQlVHCiAJLyogUG9sbCBmb3IgY29uc29sZSBvdXRwdXQgcGVyaW9kaWNhbGx5ICovCi0JaWYgKGJ1cy0+c2Rpb2Rldi0+c3RhdGUgPT0gQlJDTUZfU1RBVEVfREFUQSAmJgorCWlmIChidXMtPnNkaW9kZXYtPnN0YXRlID09IEJSQ01GX1NESU9EX0RBVEEgJiYKIAkgICAgYnVzLT5jb25zb2xlX2ludGVydmFsICE9IDApIHsKIAkJYnVzLT5jb25zb2xlLmNvdW50ICs9IEJSQ01GX1dEX1BPTExfTVM7CiAJCWlmIChidXMtPmNvbnNvbGUuY291bnQgPj0gYnVzLT5jb25zb2xlX2ludGVydmFsKSB7CkBAIC0zNjQwLDIyICszNjMyLDI1IEBACiAjZW5kaWYJCQkJLyogREVCVUcgKi8KIAogCS8qIE9uIGlkbGUgdGltZW91dCBjbGVhciBhY3Rpdml0eSBmbGFnIGFuZC9vciB0dXJuIG9mZiBjbG9jayAqLwotCWlmICgoYnVzLT5pZGxldGltZSA+IDApICYmIChidXMtPmNsa3N0YXRlID09IENMS19BVkFJTCkpIHsKLQkJaWYgKCsrYnVzLT5pZGxlY291bnQgPj0gYnVzLT5pZGxldGltZSkgewotCQkJYnVzLT5pZGxlY291bnQgPSAwOwotCQkJaWYgKGJ1cy0+YWN0aXZpdHkpIHsKLQkJCQlidXMtPmFjdGl2aXR5ID0gZmFsc2U7Ci0JCQkJYnJjbWZfc2Rpb193ZF90aW1lcihidXMsIEJSQ01GX1dEX1BPTExfTVMpOwotCQkJfSBlbHNlIHsKKwlpZiAoIWJ1cy0+ZHBjX3RyaWdnZXJlZCkgeworCQlybWIoKTsKKwkJaWYgKCghYnVzLT5kcGNfcnVubmluZykgJiYgKGJ1cy0+aWRsZXRpbWUgPiAwKSAmJgorCQkgICAgKGJ1cy0+Y2xrc3RhdGUgPT0gQ0xLX0FWQUlMKSkgeworCQkJYnVzLT5pZGxlY291bnQrKzsKKwkJCWlmIChidXMtPmlkbGVjb3VudCA+IGJ1cy0+aWRsZXRpbWUpIHsKIAkJCQlicmNtZl9kYmcoU0RJTywgImlkbGVcbiIpOwogCQkJCXNkaW9fY2xhaW1faG9zdChidXMtPnNkaW9kZXYtPmZ1bmNbMV0pOworCQkJCWJyY21mX3NkaW9fd2RfdGltZXIoYnVzLCAwKTsKKwkJCQlidXMtPmlkbGVjb3VudCA9IDA7CiAJCQkJYnJjbWZfc2Rpb19idXNfc2xlZXAoYnVzLCB0cnVlLCBmYWxzZSk7CiAJCQkJc2Rpb19yZWxlYXNlX2hvc3QoYnVzLT5zZGlvZGV2LT5mdW5jWzFdKTsKIAkJCX0KKwkJfSBlbHNlIHsKKwkJCWJ1cy0+aWRsZWNvdW50ID0gMDsKIAkJfQorCX0gZWxzZSB7CisJCWJ1cy0+aWRsZWNvdW50ID0gMDsKIAl9Ci0KLQlyZXR1cm4gKGF0b21pY19yZWFkKCZidXMtPmlwZW5kKSA+IDApOwogfQogCiBzdGF0aWMgdm9pZCBicmNtZl9zZGlvX2RhdGF3b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtMzY2Myw5ICszNjU4LDE4IEBACiAJc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYnJjbWZfc2RpbywKIAkJCQkJICAgICAgZGF0YXdvcmspOwogCi0Jd2hpbGUgKGF0b21pY19yZWFkKCZidXMtPmRwY190c2tjbnQpKSB7Ci0JCWF0b21pY19zZXQoJmJ1cy0+ZHBjX3Rza2NudCwgMCk7CisJYnVzLT5kcGNfcnVubmluZyA9IHRydWU7CisJd21iKCk7CisJd2hpbGUgKEFDQ0VTU19PTkNFKGJ1cy0+ZHBjX3RyaWdnZXJlZCkpIHsKKwkJYnVzLT5kcGNfdHJpZ2dlcmVkID0gZmFsc2U7CiAJCWJyY21mX3NkaW9fZHBjKGJ1cyk7CisJCWJ1cy0+aWRsZWNvdW50ID0gMDsKKwl9CisJYnVzLT5kcGNfcnVubmluZyA9IGZhbHNlOworCWlmIChicmNtZl9zZGlvZF9mcmVlemluZyhidXMtPnNkaW9kZXYpKSB7CisJCWJyY21mX3NkaW9kX2NoYW5nZV9zdGF0ZShidXMtPnNkaW9kZXYsIEJSQ01GX1NESU9EX0RPV04pOworCQlicmNtZl9zZGlvZF90cnlfZnJlZXplKGJ1cy0+c2Rpb2Rldik7CisJCWJyY21mX3NkaW9kX2NoYW5nZV9zdGF0ZShidXMtPnNkaW9kZXYsIEJSQ01GX1NESU9EX0RBVEEpOwogCX0KIH0KIApAQCAtMzc4NCw4ICszNzg4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYnJjbWZfc2Rpb19idXNjb3JlX2V4aXRkbCh2b2lkICpjdHgsIHN0cnVjdCBicmNtZl9jaGlwICpjaGlwLAotCQkJCSAgICAgIHUzMiByc3R2ZWMpCitzdGF0aWMgdm9pZCBicmNtZl9zZGlvX2J1c2NvcmVfYWN0aXZhdGUodm9pZCAqY3R4LCBzdHJ1Y3QgYnJjbWZfY2hpcCAqY2hpcCwKKwkJCQkJdTMyIHJzdHZlYykKIHsKIAlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYgPSBjdHg7CiAJc3RydWN0IGJyY21mX2NvcmUgKmNvcmU7CkBAIC0zODI4LDcgKzM4MzIsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJyY21mX2J1c2NvcmVfb3BzIGJyY21mX3NkaW9fYnVzY29yZV9vcHMgPSB7CiAJLnByZXBhcmUgPSBicmNtZl9zZGlvX2J1c2NvcmVwcmVwLAotCS5leGl0X2RsID0gYnJjbWZfc2Rpb19idXNjb3JlX2V4aXRkbCwKKwkuYWN0aXZhdGUgPSBicmNtZl9zZGlvX2J1c2NvcmVfYWN0aXZhdGUsCiAJLnJlYWQzMiA9IGJyY21mX3NkaW9fYnVzY29yZV9yZWFkMzIsCiAJLndyaXRlMzIgPSBicmNtZl9zZGlvX2J1c2NvcmVfd3JpdGUzMiwKIH07CkBAIC0zODgyLDEzICszODg2LDYgQEAKIAkJZHJpdmVzdHJlbmd0aCA9IERFRkFVTFRfU0RJT19EUklWRV9TVFJFTkdUSDsKIAlicmNtZl9zZGlvX2RyaXZlc3RyZW5ndGhpbml0KGJ1cy0+c2Rpb2RldiwgYnVzLT5jaSwgZHJpdmVzdHJlbmd0aCk7CiAKLQkvKiBHZXQgaW5mbyBvbiB0aGUgU09DUkFNIGNvcmVzLi4uICovCi0JYnVzLT5yYW1zaXplID0gYnVzLT5jaS0+cmFtc2l6ZTsKLQlpZiAoIShidXMtPnJhbXNpemUpKSB7Ci0JCWJyY21mX2VycigiZmFpbGVkIHRvIGZpbmQgU09DUkFNIG1lbW9yeSFcbiIpOwotCQlnb3RvIGZhaWw7Ci0JfQotCiAJLyogU2V0IGNhcmQgY29udHJvbCBzbyBhbiBTRElPIGNhcmQgcmVzZXQgZG9lcyBhIFdMQU4gYmFja3BsYW5lIHJlc2V0ICovCiAJcmVnX3ZhbCA9IGJyY21mX3NkaW9kX3JlZ3JiKGJ1cy0+c2Rpb2RldiwKIAkJCQkgICAgU0RJT19DQ0NSX0JSQ01fQ0FSRENUUkwsICZlcnIpOwpAQCAtMzk0NCwxMyArMzk0MSwxOSBAQAogYnJjbWZfc2Rpb193YXRjaGRvZ190aHJlYWQodm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gKHN0cnVjdCBicmNtZl9zZGlvICopZGF0YTsKKwlpbnQgd2FpdDsKIAogCWFsbG93X3NpZ25hbChTSUdURVJNKTsKIAkvKiBSdW4gdW50aWwgc2lnbmFsIHJlY2VpdmVkICovCisJYnJjbWZfc2Rpb2RfZnJlZXplcl9jb3VudChidXMtPnNkaW9kZXYpOwogCXdoaWxlICgxKSB7CiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKLQkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmJ1cy0+d2F0Y2hkb2dfd2FpdCkpIHsKKwkJYnJjbWZfc2Rpb2RfZnJlZXplcl91bmNvdW50KGJ1cy0+c2Rpb2Rldik7CisJCXdhaXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmJ1cy0+d2F0Y2hkb2dfd2FpdCk7CisJCWJyY21mX3NkaW9kX2ZyZWV6ZXJfY291bnQoYnVzLT5zZGlvZGV2KTsKKwkJYnJjbWZfc2Rpb2RfdHJ5X2ZyZWV6ZShidXMtPnNkaW9kZXYpOworCQlpZiAoIXdhaXQpIHsKIAkJCWJyY21mX3NkaW9fYnVzX3dhdGNoZG9nKGJ1cyk7CiAJCQkvKiBDb3VudCB0aGUgdGljayBmb3IgcmVmZXJlbmNlICovCiAJCQlidXMtPnNkY250LnRpY2tjbnQrKzsKQEAgLTM5NzEsNyArMzk3NCw3IEBACiAJCS8qIFJlc2NoZWR1bGUgdGhlIHdhdGNoZG9nICovCiAJCWlmIChidXMtPndkX3RpbWVyX3ZhbGlkKQogCQkJbW9kX3RpbWVyKCZidXMtPnRpbWVyLAotCQkJCSAgamlmZmllcyArIEJSQ01GX1dEX1BPTExfTVMgKiBIWiAvIDEwMDApOworCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQlJDTUZfV0RfUE9MTF9NUykpOwogCX0KIH0KIApAQCAtNDA4OSw2ICs0MDkyLDcgQEAKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBicmNtZl9zZGlvICpidXM7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC00MTE3LDEyICs0MTIxLDE2IEBACiAJCQlidXMtPnNnZW50cnlfYWxpZ24gPSBzZGlvZGV2LT5wZGF0YS0+c2Rfc2dlbnRyeV9hbGlnbjsKIAl9CiAKLQlJTklUX1dPUksoJmJ1cy0+ZGF0YXdvcmssIGJyY21mX3NkaW9fZGF0YXdvcmtlcik7Ci0JYnVzLT5icmNtZl93cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJicmNtZl93cSIpOwotCWlmIChidXMtPmJyY21mX3dxID09IE5VTEwpIHsKKwkvKiBzaW5nbGUtdGhyZWFkZWQgd29ya3F1ZXVlICovCisJd3EgPSBhbGxvY19vcmRlcmVkX3dvcmtxdWV1ZSgiYnJjbWZfd3EvJXMiLCBXUV9NRU1fUkVDTEFJTSwKKwkJCQkgICAgIGRldl9uYW1lKCZzZGlvZGV2LT5mdW5jWzFdLT5kZXYpKTsKKwlpZiAoIXdxKSB7CiAJCWJyY21mX2VycigiaW5zdWZmaWNpZW50IG1lbW9yeSB0byBjcmVhdGUgdHh3b3JrcXVldWVcbiIpOwogCQlnb3RvIGZhaWw7CiAJfQorCWJyY21mX3NkaW9kX2ZyZWV6ZXJfY291bnQoc2Rpb2Rldik7CisJSU5JVF9XT1JLKCZidXMtPmRhdGF3b3JrLCBicmNtZl9zZGlvX2RhdGF3b3JrZXIpOworCWJ1cy0+YnJjbWZfd3EgPSB3cTsKIAogCS8qIGF0dGVtcHQgdG8gYXR0YWNoIHRvIHRoZSBkb25nbGUgKi8KIAlpZiAoIShicmNtZl9zZGlvX3Byb2JlX2F0dGFjaChidXMpKSkgewpAQCAtNDE0MywxMyArNDE1MSwxNSBAQAogCS8qIEluaXRpYWxpemUgd2F0Y2hkb2cgdGhyZWFkICovCiAJaW5pdF9jb21wbGV0aW9uKCZidXMtPndhdGNoZG9nX3dhaXQpOwogCWJ1cy0+d2F0Y2hkb2dfdHNrID0ga3RocmVhZF9ydW4oYnJjbWZfc2Rpb193YXRjaGRvZ190aHJlYWQsCi0JCQkJCWJ1cywgImJyY21mX3dhdGNoZG9nIik7CisJCQkJCWJ1cywgImJyY21mX3dkb2cvJXMiLAorCQkJCQlkZXZfbmFtZSgmc2Rpb2Rldi0+ZnVuY1sxXS0+ZGV2KSk7CiAJaWYgKElTX0VSUihidXMtPndhdGNoZG9nX3RzaykpIHsKIAkJcHJfd2FybigiYnJjbWZfd2F0Y2hkb2cgdGhyZWFkIGZhaWxlZCB0byBzdGFydFxuIik7CiAJCWJ1cy0+d2F0Y2hkb2dfdHNrID0gTlVMTDsKIAl9CiAJLyogSW5pdGlhbGl6ZSBEUEMgdGhyZWFkICovCi0JYXRvbWljX3NldCgmYnVzLT5kcGNfdHNrY250LCAwKTsKKwlidXMtPmRwY190cmlnZ2VyZWQgPSBmYWxzZTsKKwlidXMtPmRwY19ydW5uaW5nID0gZmFsc2U7CiAKIAkvKiBBc3NpZ24gYnVzIGludGVyZmFjZSBjYWxsIGJhY2sgKi8KIAlidXMtPnNkaW9kZXYtPmJ1c19pZi0+ZGV2ID0gYnVzLT5zZGlvZGV2LT5kZXY7CkBAIC00MjQyLDE2ICs0MjUyLDE2IEBACiAJCQlkZXN0cm95X3dvcmtxdWV1ZShidXMtPmJyY21mX3dxKTsKIAogCQlpZiAoYnVzLT5jaSkgewotCQkJaWYgKGJ1cy0+c2Rpb2Rldi0+c3RhdGUgIT0gQlJDTUZfU1RBVEVfTk9NRURJVU0pIHsKKwkJCWlmIChidXMtPnNkaW9kZXYtPnN0YXRlICE9IEJSQ01GX1NESU9EX05PTUVESVVNKSB7CiAJCQkJc2Rpb19jbGFpbV9ob3N0KGJ1cy0+c2Rpb2Rldi0+ZnVuY1sxXSk7CisJCQkJYnJjbWZfc2Rpb193ZF90aW1lcihidXMsIDApOwogCQkJCWJyY21mX3NkaW9fY2xrY3RsKGJ1cywgQ0xLX0FWQUlMLCBmYWxzZSk7CiAJCQkJLyogTGVhdmUgdGhlIGRldmljZSBpbiBzdGF0ZSB3aGVyZSBpdCBpcwotCQkJCSAqICdxdWlldCcuIFRoaXMgaXMgZG9uZSBieSBwdXR0aW5nIGl0IGluCi0JCQkJICogZG93bmxvYWRfc3RhdGUgd2hpY2ggZXNzZW50aWFsbHkgcmVzZXRzCi0JCQkJICogYWxsIG5lY2Vzc2FyeSBjb3Jlcy4KKwkJCQkgKiAncGFzc2l2ZScuIFRoaXMgaXMgZG9uZSBieSByZXNldHRpbmcgYWxsCisJCQkJICogbmVjZXNzYXJ5IGNvcmVzLgogCQkJCSAqLwogCQkJCW1zbGVlcCgyMCk7Ci0JCQkJYnJjbWZfY2hpcF9lbnRlcl9kb3dubG9hZChidXMtPmNpKTsKKwkJCQlicmNtZl9jaGlwX3NldF9wYXNzaXZlKGJ1cy0+Y2kpOwogCQkJCWJyY21mX3NkaW9fY2xrY3RsKGJ1cywgQ0xLX05PTkUsIGZhbHNlKTsKIAkJCQlzZGlvX3JlbGVhc2VfaG9zdChidXMtPnNkaW9kZXYtPmZ1bmNbMV0pOwogCQkJfQpAQCAtNDI3Nyw3ICs0Mjg3LDcgQEAKIAl9CiAKIAkvKiBkb24ndCBzdGFydCB0aGUgd2QgdW50aWwgZncgaXMgbG9hZGVkICovCi0JaWYgKGJ1cy0+c2Rpb2Rldi0+c3RhdGUgIT0gQlJDTUZfU1RBVEVfREFUQSkKKwlpZiAoYnVzLT5zZGlvZGV2LT5zdGF0ZSAhPSBCUkNNRl9TRElPRF9EQVRBKQogCQlyZXR1cm47CiAKIAlpZiAod2R0aWNrKSB7CkBAIC00MjkwLDE2ICs0MzAwLDI4IEBACiAJCQkgICBkeW5hbWljYWxseSBjaGFuZ2VkIG9yIGluIHRoZSBmaXJzdCBpbnN0YW5jZQogCQkJICovCiAJCQlidXMtPnRpbWVyLmV4cGlyZXMgPQotCQkJCWppZmZpZXMgKyBCUkNNRl9XRF9QT0xMX01TICogSFogLyAxMDAwOworCQkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEJSQ01GX1dEX1BPTExfTVMpOwogCQkJYWRkX3RpbWVyKCZidXMtPnRpbWVyKTsKIAogCQl9IGVsc2UgewogCQkJLyogUmUgYXJtIHRoZSB0aW1lciwgYXQgbGFzdCB3YXRjaGRvZyBwZXJpb2QgKi8KIAkJCW1vZF90aW1lcigmYnVzLT50aW1lciwKLQkJCQlqaWZmaWVzICsgQlJDTUZfV0RfUE9MTF9NUyAqIEhaIC8gMTAwMCk7CisJCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQlJDTUZfV0RfUE9MTF9NUykpOwogCQl9CiAKIAkJYnVzLT53ZF90aW1lcl92YWxpZCA9IHRydWU7CiAJCWJ1cy0+c2F2ZV9tcyA9IHdkdGljazsKIAl9CiB9CisKK2ludCBicmNtZl9zZGlvX3NsZWVwKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIGJvb2wgc2xlZXApCit7CisJaW50IHJldDsKKworCXNkaW9fY2xhaW1faG9zdChidXMtPnNkaW9kZXYtPmZ1bmNbMV0pOworCXJldCA9IGJyY21mX3NkaW9fYnVzX3NsZWVwKGJ1cywgc2xlZXAsIGZhbHNlKTsKKwlzZGlvX3JlbGVhc2VfaG9zdChidXMtPnNkaW9kZXYtPmZ1bmNbMV0pOworCisJcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW8uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvLmgKaW5kZXggZWMyNTg2YS4uNzMyODQ3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW8uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpby5oCkBAIC0xNTUsMTEgKzE1NSwxNyBAQAogLyogd2F0Y2hkb2cgcG9sbGluZyBpbnRlcnZhbCBpbiBtcyAqLwogI2RlZmluZSBCUkNNRl9XRF9QT0xMX01TCTEwCiAKLS8qIFRoZSBzdGF0ZSBvZiB0aGUgYnVzICovCi1lbnVtIGJyY21mX3NkaW9fc3RhdGUgewotCUJSQ01GX1NUQVRFX0RPV04sCS8qIERldmljZSBhdmFpbGFibGUsIHN0aWxsIGluaXRpYWxpc2luZyAqLwotCUJSQ01GX1NUQVRFX0RBVEEsCS8qIFJlYWR5IGZvciBkYXRhIHRyYW5zZmVycywgRFBDIGVuYWJsZWQgKi8KLQlCUkNNRl9TVEFURV9OT01FRElVTQkvKiBObyBtZWRpdW0gYWNjZXNzIHRvIGRvbmdsZSBwb3NzaWJsZSAqLworLyoqCisgKiBlbnVtIGJyY21mX3NkaW9kX3N0YXRlIC0gdGhlIHN0YXRlIG9mIHRoZSBidXMuCisgKgorICogQEJSQ01GX1NESU9EX0RPV046IERldmljZSBjYW4gYmUgYWNjZXNzZWQsIG5vIERQQy4KKyAqIEBCUkNNRl9TRElPRF9EQVRBOiBSZWFkeSBmb3IgZGF0YSB0cmFuc2ZlcnMsIERQQyBlbmFibGVkLgorICogQEJSQ01GX1NESU9EX05PTUVESVVNOiBObyBtZWRpdW0gYWNjZXNzIHRvIGRvbmdsZSBwb3NzaWJsZS4KKyAqLworZW51bSBicmNtZl9zZGlvZF9zdGF0ZSB7CisJQlJDTUZfU0RJT0RfRE9XTiwKKwlCUkNNRl9TRElPRF9EQVRBLAorCUJSQ01GX1NESU9EX05PTUVESVVNCiB9OwogCiBzdHJ1Y3QgYnJjbWZfc2RyZWcgewpAQCAtMTY5LDE1ICsxNzUsMTMgQEAKIH07CiAKIHN0cnVjdCBicmNtZl9zZGlvOworc3RydWN0IGJyY21mX3NkaW9kX2ZyZWV6ZXI7CiAKIHN0cnVjdCBicmNtZl9zZGlvX2RldiB7CiAJc3RydWN0IHNkaW9fZnVuYyAqZnVuY1tTRElPX01BWF9GVU5DU107CiAJdTggbnVtX2Z1bmNzOwkJCS8qIFN1cHBvcnRlZCBmdW5jcyBvbiBjbGllbnQgKi8KIAl1MzIgc2J3YWQ7CQkJLyogU2F2ZSBiYWNrcGxhbmUgd2luZG93IGFkZHJlc3MgKi8KIAlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzOwotCWF0b21pY190IHN1c3BlbmQ7CQkvKiBzdXNwZW5kIGZsYWcgKi8KLQlib29sIHNsZWVwaW5nOwotCXdhaXRfcXVldWVfaGVhZF90IGlkbGVfd2FpdDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmOwogCXN0cnVjdCBicmNtZm1hY19zZGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwpAQCAtMTk0LDcgKzE5OCw4IEBACiAJY2hhciBmd19uYW1lW0JSQ01GX0ZXX1BBVEhfTEVOICsgQlJDTUZfRldfTkFNRV9MRU5dOwogCWNoYXIgbnZyYW1fbmFtZVtCUkNNRl9GV19QQVRIX0xFTiArIEJSQ01GX0ZXX05BTUVfTEVOXTsKIAlib29sIHdvd2xfZW5hYmxlZDsKLQllbnVtIGJyY21mX3NkaW9fc3RhdGUgc3RhdGU7CisJZW51bSBicmNtZl9zZGlvZF9zdGF0ZSBzdGF0ZTsKKwlzdHJ1Y3QgYnJjbWZfc2Rpb2RfZnJlZXplciAqZnJlZXplcjsKIH07CiAKIC8qIHNkaW8gY29yZSByZWdpc3RlcnMgKi8KQEAgLTMzNyw2ICszNDIsMjggQEAKIAogLyogSXNzdWUgYW4gYWJvcnQgdG8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbiAqLwogaW50IGJyY21mX3NkaW9kX2Fib3J0KHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdWludCBmbik7Cit2b2lkIGJyY21mX3NkaW9kX2NoYW5nZV9zdGF0ZShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCQkgICAgICBlbnVtIGJyY21mX3NkaW9kX3N0YXRlIHN0YXRlKTsKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK2Jvb2wgYnJjbWZfc2Rpb2RfZnJlZXppbmcoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KTsKK3ZvaWQgYnJjbWZfc2Rpb2RfdHJ5X2ZyZWV6ZShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYpOwordm9pZCBicmNtZl9zZGlvZF9mcmVlemVyX2NvdW50KHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2Rldik7Cit2b2lkIGJyY21mX3NkaW9kX2ZyZWV6ZXJfdW5jb3VudChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBicmNtZl9zZGlvZF9mcmVlemluZyhzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYpCit7CisJcmV0dXJuIGZhbHNlOworfQorc3RhdGljIGlubGluZSB2b2lkIGJyY21mX3NkaW9kX3RyeV9mcmVlemUoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KQoreworfQorc3RhdGljIGlubGluZSB2b2lkIGJyY21mX3NkaW9kX2ZyZWV6ZXJfY291bnQoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2KQoreworfQorc3RhdGljIGlubGluZSB2b2lkIGJyY21mX3NkaW9kX2ZyZWV6ZXJfdW5jb3VudChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCiAKIHN0cnVjdCBicmNtZl9zZGlvICpicmNtZl9zZGlvX3Byb2JlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2Rldik7CiB2b2lkIGJyY21mX3NkaW9fcmVtb3ZlKHN0cnVjdCBicmNtZl9zZGlvICpidXMpOwpAQCAtMzQ0LDUgKzM3MSw3IEBACiAKIHZvaWQgYnJjbWZfc2Rpb193ZF90aW1lcihzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1aW50IHdkdGljayk7CiB2b2lkIGJyY21mX3NkaW9fd293bF9jb25maWcoc3RydWN0IGRldmljZSAqZGV2LCBib29sIGVuYWJsZWQpOworaW50IGJyY21mX3NkaW9fc2xlZXAoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgYm9vbCBzbGVlcCk7Cit2b2lkIGJyY21mX3NkaW9fdHJpZ2dlcl9kcGMoc3RydWN0IGJyY21mX3NkaW8gKmJ1cyk7CiAKICNlbmRpZiAvKiBCUkNNRk1BQ19TRElPX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy92ZW5kb3IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy92ZW5kb3IuYwppbmRleCA1MGNkZjcwLi44ZWZmMjc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvdmVuZG9yLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3ZlbmRvci5jCkBAIC0zOSwxMyArMzksMjIgQEAKIAl2b2lkICpkY21kX2J1ZiA9IE5VTEwsICp3cl9wb2ludGVyOwogCXUxNiBtc2dsZW4sIG1heG1zZ2xlbiA9IFBBR0VfU0laRSAtIDB4MTAwOwogCi0JYnJjbWZfZGJnKFRSQUNFLCAiY21kICV4IHNldCAlZCBsZW4gJWRcbiIsIGNtZGhkci0+Y21kLCBjbWRoZHItPnNldCwKLQkJICBjbWRoZHItPmxlbik7CisJaWYgKGxlbiA8IHNpemVvZigqY21kaGRyKSkgeworCQlicmNtZl9lcnIoInZlbmRvciBjb21tYW5kIHRvbyBzaG9ydDogJWRcbiIsIGxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXZpZiA9IGNvbnRhaW5lcl9vZih3ZGV2LCBzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfdmlmLCB3ZGV2KTsKIAlpZnAgPSB2aWYtPmlmcDsKIAotCWxlbiAtPSBzaXplb2Yoc3RydWN0IGJyY21mX3ZuZHJfZGNtZF9oZHIpOworCWJyY21mX2RiZyhUUkFDRSwgImlmaWR4PSVkLCBjbWQ9JWRcbiIsIGlmcC0+aWZpZHgsIGNtZGhkci0+Y21kKTsKKworCWlmIChjbWRoZHItPm9mZnNldCA+IGxlbikgeworCQlicmNtZl9lcnIoImJhZCBidWZmZXIgb2Zmc2V0ICVkID4gJWRcbiIsIGNtZGhkci0+b2Zmc2V0LCBsZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlsZW4gLT0gY21kaGRyLT5vZmZzZXQ7CiAJcmV0X2xlbiA9IGNtZGhkci0+bGVuOwogCWlmIChyZXRfbGVuID4gMCB8fCBsZW4gPiAwKSB7CiAJCWlmIChsZW4gPiBCUkNNRl9EQ01EX01BWExFTikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2JyY21zX3RyYWNlX2JyY21zbWFjLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYnJjbXNfdHJhY2VfYnJjbXNtYWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGRhMzI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2JyY21zX3RyYWNlX2JyY21zbWFjLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWYgIWRlZmluZWQoX19UUkFDRV9CUkNNU01BQ19IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfX1RSQUNFX0JSQ01TTUFDX0gKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gYnJjbXNtYWMKKworLyoKKyAqIFdlIGRlZmluZSBhIHRyYWNlcG9pbnQsIGl0cyBhcmd1bWVudHMsIGl0cyBwcmludGsgZm9ybWF0IGFuZCBpdHMKKyAqICdmYXN0IGJpbmFyeSByZWNvcmQnIGxheW91dC4KKyAqLworVFJBQ0VfRVZFTlQoYnJjbXNfdGltZXIsCisJLyogVFBQUk9UTyBpcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBmdW5jdGlvbiBjYWxsZWQgYnkgdGhpcyB0cmFjZXBvaW50ICovCisJVFBfUFJPVE8oc3RydWN0IGJyY21zX3RpbWVyICp0KSwKKwkvKgorCSAqIFRQQVJHUyhmaXJzdGFyZywgcCkgYXJlIHRoZSBwYXJhbWV0ZXJzIG5hbWVzLCBzYW1lIGFzIGZvdW5kIGluIHRoZQorCSAqIHByb3RvdHlwZS4KKwkgKi8KKwlUUF9BUkdTKHQpLAorCS8qCisJICogRmFzdCBiaW5hcnkgdHJhY2luZzogZGVmaW5lIHRoZSB0cmFjZSByZWNvcmQgdmlhIFRQX1NUUlVDVF9fZW50cnkoKS4KKwkgKiBZb3UgY2FuIHRoaW5rIGFib3V0IGl0IGxpa2UgYSByZWd1bGFyIEMgc3RydWN0dXJlIGxvY2FsIHZhcmlhYmxlCisJICogZGVmaW5pdGlvbi4KKwkgKi8KKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHVpbnQsIG1zKQorCQlfX2ZpZWxkKHVpbnQsIHNldCkKKwkJX19maWVsZCh1aW50LCBwZXJpb2RpYykKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5tcyA9IHQtPm1zOworCQlfX2VudHJ5LT5zZXQgPSB0LT5zZXQ7CisJCV9fZW50cnktPnBlcmlvZGljID0gdC0+cGVyaW9kaWM7CisJKSwKKwlUUF9wcmludGsoCisJCSJtcz0ldSBzZXQ9JXUgcGVyaW9kaWM9JXUiLAorCQlfX2VudHJ5LT5tcywgX19lbnRyeS0+c2V0LCBfX2VudHJ5LT5wZXJpb2RpYworCSkKKyk7CisKK1RSQUNFX0VWRU5UKGJyY21zX2RwYywKKwlUUF9QUk9UTyh1bnNpZ25lZCBsb25nIGRhdGEpLAorCVRQX0FSR1MoZGF0YSksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLCBkYXRhKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRhdGEgPSBkYXRhOworCSksCisJVFBfcHJpbnRrKAorCQkiZGF0YT0lcCIsCisJCSh2b2lkICopX19lbnRyeS0+ZGF0YQorCSkKKyk7CisKK1RSQUNFX0VWRU5UKGJyY21zX21hY2ludHN0YXR1cywKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpbl9pc3IsIHUzMiBtYWNpbnRzdGF0dXMsCisJCSB1MzIgbWFzayksCisJVFBfQVJHUyhkZXYsIGluX2lzciwgbWFjaW50c3RhdHVzLCBtYXNrKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX3N0cmluZyhkZXYsIGRldl9uYW1lKGRldikpCisJCV9fZmllbGQoaW50LCBpbl9pc3IpCisJCV9fZmllbGQodTMyLCBtYWNpbnRzdGF0dXMpCisJCV9fZmllbGQodTMyLCBtYXNrKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihkZXYsIGRldl9uYW1lKGRldikpOworCQlfX2VudHJ5LT5pbl9pc3IgPSBpbl9pc3I7CisJCV9fZW50cnktPm1hY2ludHN0YXR1cyA9IG1hY2ludHN0YXR1czsKKwkJX19lbnRyeS0+bWFzayA9IG1hc2s7CisJKSwKKwlUUF9wcmludGsoIlslc10gaW5faXNyPSVkIG1hY2ludHN0YXR1cz0lI3ggbWFzaz0lI3giLCBfX2dldF9zdHIoZGV2KSwKKwkJICBfX2VudHJ5LT5pbl9pc3IsIF9fZW50cnktPm1hY2ludHN0YXR1cywgX19lbnRyeS0+bWFzaykKKyk7CisjZW5kaWYgLyogX19UUkFDRV9CUkNNU01BQ19IICovCisKKyNpZmRlZiBDT05GSUdfQlJDTV9UUkFDSU5HCisKKyN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KKyN1bmRlZiBUUkFDRV9JTkNMVURFX0ZJTEUKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIGJyY21zX3RyYWNlX2JyY21zbWFjCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CisKKyNlbmRpZiAvKiBDT05GSUdfQlJDTV9UUkFDSU5HICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYnJjbXNfdHJhY2VfYnJjbXNtYWNfbXNnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYnJjbXNfdHJhY2VfYnJjbXNtYWNfbXNnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4YTY5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9icmNtc190cmFjZV9icmNtc21hY19tc2cuaApAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKF9fVFJBQ0VfQlJDTVNNQUNfTVNHX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9fVFJBQ0VfQlJDTVNNQUNfTVNHX0gKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gYnJjbXNtYWNfbXNnCisKKyNkZWZpbmUgTUFYX01TR19MRU4JMTAwCisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoYnJjbXNfbXNnX2V2ZW50LAorCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCisJVFBfQVJHUyh2YWYpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZHluYW1pY19hcnJheShjaGFyLCBtc2csIE1BWF9NU0dfTEVOKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCVdBUk5fT05fT05DRSh2c25wcmludGYoX19nZXRfZHluYW1pY19hcnJheShtc2cpLAorCQkJCSAgICAgICBNQVhfTVNHX0xFTiwgdmFmLT5mbXQsCisJCQkJICAgICAgICp2YWYtPnZhKSA+PSBNQVhfTVNHX0xFTik7CisJKSwKKwlUUF9wcmludGsoIiVzIiwgX19nZXRfc3RyKG1zZykpCispOworCitERUZJTkVfRVZFTlQoYnJjbXNfbXNnX2V2ZW50LCBicmNtc19pbmZvLAorCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCisJVFBfQVJHUyh2YWYpCispOworCitERUZJTkVfRVZFTlQoYnJjbXNfbXNnX2V2ZW50LCBicmNtc193YXJuLAorCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCisJVFBfQVJHUyh2YWYpCispOworCitERUZJTkVfRVZFTlQoYnJjbXNfbXNnX2V2ZW50LCBicmNtc19lcnIsCisJVFBfUFJPVE8oc3RydWN0IHZhX2Zvcm1hdCAqdmFmKSwKKwlUUF9BUkdTKHZhZikKKyk7CisKK0RFRklORV9FVkVOVChicmNtc19tc2dfZXZlbnQsIGJyY21zX2NyaXQsCisJVFBfUFJPVE8oc3RydWN0IHZhX2Zvcm1hdCAqdmFmKSwKKwlUUF9BUkdTKHZhZikKKyk7CisKK1RSQUNFX0VWRU5UKGJyY21zX2RiZywKKwlUUF9QUk9UTyh1MzIgbGV2ZWwsIGNvbnN0IGNoYXIgKmZ1bmMsIHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCisJVFBfQVJHUyhsZXZlbCwgZnVuYywgdmFmKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHUzMiwgbGV2ZWwpCisJCV9fc3RyaW5nKGZ1bmMsIGZ1bmMpCisJCV9fZHluYW1pY19hcnJheShjaGFyLCBtc2csIE1BWF9NU0dfTEVOKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmxldmVsID0gbGV2ZWw7CisJCV9fYXNzaWduX3N0cihmdW5jLCBmdW5jKTsKKwkJV0FSTl9PTl9PTkNFKHZzbnByaW50ZihfX2dldF9keW5hbWljX2FycmF5KG1zZyksCisJCQkJICAgICAgIE1BWF9NU0dfTEVOLCB2YWYtPmZtdCwKKwkJCQkgICAgICAgKnZhZi0+dmEpID49IE1BWF9NU0dfTEVOKTsKKwkpLAorCVRQX3ByaW50aygiJXM6ICVzIiwgX19nZXRfc3RyKGZ1bmMpLCBfX2dldF9zdHIobXNnKSkKKyk7CisjZW5kaWYgLyogX19UUkFDRV9CUkNNU01BQ19NU0dfSCAqLworCisjaWZkZWYgQ09ORklHX0JSQ01fVFJBQ0lORworCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9GSUxFCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBicmNtc190cmFjZV9icmNtc21hY19tc2cKKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KKworI2VuZGlmIC8qIENPTkZJR19CUkNNX1RSQUNJTkcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9icmNtc190cmFjZV9icmNtc21hY190eC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2JyY21zX3RyYWNlX2JyY21zbWFjX3R4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyY2MwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9icmNtc190cmFjZV9icmNtc21hY190eC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2lmICFkZWZpbmVkKF9fVFJBQ0VfQlJDTVNNQUNfVFhfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX19UUkFDRV9CUkNNU01BQ19UWF9ICisKKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIGJyY21zbWFjX3R4CisKK1RSQUNFX0VWRU5UKGJyY21zX3R4ZGVzYywKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSB2b2lkICp0eGgsIHNpemVfdCB0eGhfbGVuKSwKKwlUUF9BUkdTKGRldiwgdHhoLCB0eGhfbGVuKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX3N0cmluZyhkZXYsIGRldl9uYW1lKGRldikpCisJCV9fZHluYW1pY19hcnJheSh1OCwgdHhoLCB0eGhfbGVuKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihkZXYsIGRldl9uYW1lKGRldikpOworCQltZW1jcHkoX19nZXRfZHluYW1pY19hcnJheSh0eGgpLCB0eGgsIHR4aF9sZW4pOworCSksCisJVFBfcHJpbnRrKCJbJXNdIHR4ZGVzYyIsIF9fZ2V0X3N0cihkZXYpKQorKTsKKworVFJBQ0VfRVZFTlQoYnJjbXNfdHhzdGF0dXMsCisJVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCB1MTYgZnJhbWVsZW4sIHUxNiBmcmFtZWlkLAorCQkgdTE2IHN0YXR1cywgdTE2IGxhc3R0eHRpbWUsIHUxNiBzZXF1ZW5jZSwgdTE2IHBoeWVyciwKKwkJIHUxNiBhY2twaHlyeHNoKSwKKwlUUF9BUkdTKGRldiwgZnJhbWVsZW4sIGZyYW1laWQsIHN0YXR1cywgbGFzdHR4dGltZSwgc2VxdWVuY2UsIHBoeWVyciwKKwkJYWNrcGh5cnhzaCksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcoZGV2LCBkZXZfbmFtZShkZXYpKQorCQlfX2ZpZWxkKHUxNiwgZnJhbWVsZW4pCisJCV9fZmllbGQodTE2LCBmcmFtZWlkKQorCQlfX2ZpZWxkKHUxNiwgc3RhdHVzKQorCQlfX2ZpZWxkKHUxNiwgbGFzdHR4dGltZSkKKwkJX19maWVsZCh1MTYsIHNlcXVlbmNlKQorCQlfX2ZpZWxkKHUxNiwgcGh5ZXJyKQorCQlfX2ZpZWxkKHUxNiwgYWNrcGh5cnhzaCkKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIoZGV2LCBkZXZfbmFtZShkZXYpKTsKKwkJX19lbnRyeS0+ZnJhbWVsZW4gPSBmcmFtZWxlbjsKKwkJX19lbnRyeS0+ZnJhbWVpZCA9IGZyYW1laWQ7CisJCV9fZW50cnktPnN0YXR1cyA9IHN0YXR1czsKKwkJX19lbnRyeS0+bGFzdHR4dGltZSA9IGxhc3R0eHRpbWU7CisJCV9fZW50cnktPnNlcXVlbmNlID0gc2VxdWVuY2U7CisJCV9fZW50cnktPnBoeWVyciA9IHBoeWVycjsKKwkJX19lbnRyeS0+YWNrcGh5cnhzaCA9IGFja3BoeXJ4c2g7CisJKSwKKwlUUF9wcmludGsoIlslc10gRnJhbWVJZCAlIzA0eCBUeFN0YXR1cyAlIzA0eCBMYXN0VHhUaW1lICUjMDR4ICIKKwkJICAiU2VxICUjMDR4IFBIWVR4U3RhdHVzICUjMDR4IFJ4QWNrICUjMDR4IiwKKwkJICBfX2dldF9zdHIoZGV2KSwgX19lbnRyeS0+ZnJhbWVpZCwgX19lbnRyeS0+c3RhdHVzLAorCQkgIF9fZW50cnktPmxhc3R0eHRpbWUsIF9fZW50cnktPnNlcXVlbmNlLCBfX2VudHJ5LT5waHllcnIsCisJCSAgX19lbnRyeS0+YWNrcGh5cnhzaCkKKyk7CisKK1RSQUNFX0VWRU5UKGJyY21zX2FtcGR1X3Nlc3Npb24sCisJVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBtYXhfYW1wZHVfbGVuLAorCQkgdTE2IG1heF9hbXBkdV9mcmFtZXMsIHUxNiBhbXBkdV9sZW4sIHUxNiBhbXBkdV9mcmFtZXMsCisJCSB1MTYgZG1hX2xlbiksCisJVFBfQVJHUyhkZXYsIG1heF9hbXBkdV9sZW4sIG1heF9hbXBkdV9mcmFtZXMsIGFtcGR1X2xlbiwgYW1wZHVfZnJhbWVzLAorCQlkbWFfbGVuKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX3N0cmluZyhkZXYsIGRldl9uYW1lKGRldikpCisJCV9fZmllbGQodW5zaWduZWQsIG1heF9hbXBkdV9sZW4pCisJCV9fZmllbGQodTE2LCBtYXhfYW1wZHVfZnJhbWVzKQorCQlfX2ZpZWxkKHUxNiwgYW1wZHVfbGVuKQorCQlfX2ZpZWxkKHUxNiwgYW1wZHVfZnJhbWVzKQorCQlfX2ZpZWxkKHUxNiwgZG1hX2xlbikKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIoZGV2LCBkZXZfbmFtZShkZXYpKTsKKwkJX19lbnRyeS0+bWF4X2FtcGR1X2xlbiA9IG1heF9hbXBkdV9sZW47CisJCV9fZW50cnktPm1heF9hbXBkdV9mcmFtZXMgPSBtYXhfYW1wZHVfZnJhbWVzOworCQlfX2VudHJ5LT5hbXBkdV9sZW4gPSBhbXBkdV9sZW47CisJCV9fZW50cnktPmFtcGR1X2ZyYW1lcyA9IGFtcGR1X2ZyYW1lczsKKwkJX19lbnRyeS0+ZG1hX2xlbiA9IGRtYV9sZW47CisJKSwKKwlUUF9wcmludGsoIlslc10gYW1wZHUgc2Vzc2lvbiBtYXhfbGVuPSV1IG1heF9mcmFtZXM9JXUgbGVuPSV1IGZyYW1lcz0ldSBkbWFfbGVuPSV1IiwKKwkJICBfX2dldF9zdHIoZGV2KSwgX19lbnRyeS0+bWF4X2FtcGR1X2xlbiwKKwkJICBfX2VudHJ5LT5tYXhfYW1wZHVfZnJhbWVzLCBfX2VudHJ5LT5hbXBkdV9sZW4sCisJCSAgX19lbnRyeS0+YW1wZHVfZnJhbWVzLCBfX2VudHJ5LT5kbWFfbGVuKQorKTsKKyNlbmRpZiAvKiBfX1RSQUNFX0JSQ01TTUFDX1RYX0ggKi8KKworI2lmZGVmIENPTkZJR19CUkNNX1RSQUNJTkcKKworI3VuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSAorI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggLgorI3VuZGVmIFRSQUNFX0lOQ0xVREVfRklMRQorI2RlZmluZSBUUkFDRV9JTkNMVURFX0ZJTEUgYnJjbXNfdHJhY2VfYnJjbXNtYWNfdHgKKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KKworI2VuZGlmIC8qIENPTkZJR19CUkNNX1RSQUNJTkcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9icmNtc190cmFjZV9ldmVudHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9icmNtc190cmFjZV9ldmVudHMuaAppbmRleCA4NzE3ODFlLi5jYmYyZjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYnJjbXNfdHJhY2VfZXZlbnRzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2JyY21zX3RyYWNlX2V2ZW50cy5oCkBAIC0xNCw5ICsxNCw4IEBACiAgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKLSNpZiAhZGVmaW5lZChfX1RSQUNFX0JSQ01TTUFDX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCi0KLSNkZWZpbmUgX19UUkFDRV9CUkNNU01BQ19ICisjaWZuZGVmIF9fQlJDTVNfVFJBQ0VfRVZFTlRTX0gKKyNkZWZpbmUgX19CUkNNU19UUkFDRV9FVkVOVFNfSAogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTM0LDIyMiArMzMsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIHRyYWNlXyAjIyBuYW1lKHByb3RvKSB7fQogI2VuZGlmCiAKLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGJyY21zbWFjCi0KLS8qCi0gKiBXZSBkZWZpbmUgYSB0cmFjZXBvaW50LCBpdHMgYXJndW1lbnRzLCBpdHMgcHJpbnRrIGZvcm1hdCBhbmQgaXRzCi0gKiAnZmFzdCBiaW5hcnkgcmVjb3JkJyBsYXlvdXQuCi0gKi8KLVRSQUNFX0VWRU5UKGJyY21zX3RpbWVyLAotCS8qIFRQUFJPVE8gaXMgdGhlIHByb3RvdHlwZSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgdHJhY2Vwb2ludCAqLwotCVRQX1BST1RPKHN0cnVjdCBicmNtc190aW1lciAqdCksCi0JLyoKLQkgKiBUUEFSR1MoZmlyc3RhcmcsIHApIGFyZSB0aGUgcGFyYW1ldGVycyBuYW1lcywgc2FtZSBhcyBmb3VuZCBpbiB0aGUKLQkgKiBwcm90b3R5cGUuCi0JICovCi0JVFBfQVJHUyh0KSwKLQkvKgotCSAqIEZhc3QgYmluYXJ5IHRyYWNpbmc6IGRlZmluZSB0aGUgdHJhY2UgcmVjb3JkIHZpYSBUUF9TVFJVQ1RfX2VudHJ5KCkuCi0JICogWW91IGNhbiB0aGluayBhYm91dCBpdCBsaWtlIGEgcmVndWxhciBDIHN0cnVjdHVyZSBsb2NhbCB2YXJpYWJsZQotCSAqIGRlZmluaXRpb24uCi0JICovCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJX19maWVsZCh1aW50LCBtcykKLQkJX19maWVsZCh1aW50LCBzZXQpCi0JCV9fZmllbGQodWludCwgcGVyaW9kaWMpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJX19lbnRyeS0+bXMgPSB0LT5tczsKLQkJX19lbnRyeS0+c2V0ID0gdC0+c2V0OwotCQlfX2VudHJ5LT5wZXJpb2RpYyA9IHQtPnBlcmlvZGljOwotCSksCi0JVFBfcHJpbnRrKAotCQkibXM9JXUgc2V0PSV1IHBlcmlvZGljPSV1IiwKLQkJX19lbnRyeS0+bXMsIF9fZW50cnktPnNldCwgX19lbnRyeS0+cGVyaW9kaWMKLQkpCi0pOwotCi1UUkFDRV9FVkVOVChicmNtc19kcGMsCi0JVFBfUFJPVE8odW5zaWduZWQgbG9uZyBkYXRhKSwKLQlUUF9BUkdTKGRhdGEpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCV9fZmllbGQodW5zaWduZWQgbG9uZywgZGF0YSkKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2VudHJ5LT5kYXRhID0gZGF0YTsKLQkpLAotCVRQX3ByaW50aygKLQkJImRhdGE9JXAiLAotCQkodm9pZCAqKV9fZW50cnktPmRhdGEKLQkpCi0pOwotCi1UUkFDRV9FVkVOVChicmNtc19tYWNpbnRzdGF0dXMsCi0JVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaW5faXNyLCB1MzIgbWFjaW50c3RhdHVzLAotCQkgdTMyIG1hc2spLAotCVRQX0FSR1MoZGV2LCBpbl9pc3IsIG1hY2ludHN0YXR1cywgbWFzayksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJX19zdHJpbmcoZGV2LCBkZXZfbmFtZShkZXYpKQotCQlfX2ZpZWxkKGludCwgaW5faXNyKQotCQlfX2ZpZWxkKHUzMiwgbWFjaW50c3RhdHVzKQotCQlfX2ZpZWxkKHUzMiwgbWFzaykKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2Fzc2lnbl9zdHIoZGV2LCBkZXZfbmFtZShkZXYpKTsKLQkJX19lbnRyeS0+aW5faXNyID0gaW5faXNyOwotCQlfX2VudHJ5LT5tYWNpbnRzdGF0dXMgPSBtYWNpbnRzdGF0dXM7Ci0JCV9fZW50cnktPm1hc2sgPSBtYXNrOwotCSksCi0JVFBfcHJpbnRrKCJbJXNdIGluX2lzcj0lZCBtYWNpbnRzdGF0dXM9JSN4IG1hc2s9JSN4IiwgX19nZXRfc3RyKGRldiksCi0JCSAgX19lbnRyeS0+aW5faXNyLCBfX2VudHJ5LT5tYWNpbnRzdGF0dXMsIF9fZW50cnktPm1hc2spCi0pOwotCi0jdW5kZWYgVFJBQ0VfU1lTVEVNCi0jZGVmaW5lIFRSQUNFX1NZU1RFTSBicmNtc21hY190eAotCi1UUkFDRV9FVkVOVChicmNtc190eGRlc2MsCi0JVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAotCQkgdm9pZCAqdHhoLCBzaXplX3QgdHhoX2xlbiksCi0JVFBfQVJHUyhkZXYsIHR4aCwgdHhoX2xlbiksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJX19zdHJpbmcoZGV2LCBkZXZfbmFtZShkZXYpKQotCQlfX2R5bmFtaWNfYXJyYXkodTgsIHR4aCwgdHhoX2xlbikKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2Fzc2lnbl9zdHIoZGV2LCBkZXZfbmFtZShkZXYpKTsKLQkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkodHhoKSwgdHhoLCB0eGhfbGVuKTsKLQkpLAotCVRQX3ByaW50aygiWyVzXSB0eGRlc2MiLCBfX2dldF9zdHIoZGV2KSkKLSk7Ci0KLVRSQUNFX0VWRU5UKGJyY21zX3R4c3RhdHVzLAotCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgdTE2IGZyYW1lbGVuLCB1MTYgZnJhbWVpZCwKLQkJIHUxNiBzdGF0dXMsIHUxNiBsYXN0dHh0aW1lLCB1MTYgc2VxdWVuY2UsIHUxNiBwaHllcnIsCi0JCSB1MTYgYWNrcGh5cnhzaCksCi0JVFBfQVJHUyhkZXYsIGZyYW1lbGVuLCBmcmFtZWlkLCBzdGF0dXMsIGxhc3R0eHRpbWUsIHNlcXVlbmNlLCBwaHllcnIsCi0JCWFja3BoeXJ4c2gpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCV9fc3RyaW5nKGRldiwgZGV2X25hbWUoZGV2KSkKLQkJX19maWVsZCh1MTYsIGZyYW1lbGVuKQotCQlfX2ZpZWxkKHUxNiwgZnJhbWVpZCkKLQkJX19maWVsZCh1MTYsIHN0YXR1cykKLQkJX19maWVsZCh1MTYsIGxhc3R0eHRpbWUpCi0JCV9fZmllbGQodTE2LCBzZXF1ZW5jZSkKLQkJX19maWVsZCh1MTYsIHBoeWVycikKLQkJX19maWVsZCh1MTYsIGFja3BoeXJ4c2gpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJX19hc3NpZ25fc3RyKGRldiwgZGV2X25hbWUoZGV2KSk7Ci0JCV9fZW50cnktPmZyYW1lbGVuID0gZnJhbWVsZW47Ci0JCV9fZW50cnktPmZyYW1laWQgPSBmcmFtZWlkOwotCQlfX2VudHJ5LT5zdGF0dXMgPSBzdGF0dXM7Ci0JCV9fZW50cnktPmxhc3R0eHRpbWUgPSBsYXN0dHh0aW1lOwotCQlfX2VudHJ5LT5zZXF1ZW5jZSA9IHNlcXVlbmNlOwotCQlfX2VudHJ5LT5waHllcnIgPSBwaHllcnI7Ci0JCV9fZW50cnktPmFja3BoeXJ4c2ggPSBhY2twaHlyeHNoOwotCSksCi0JVFBfcHJpbnRrKCJbJXNdIEZyYW1lSWQgJSMwNHggVHhTdGF0dXMgJSMwNHggTGFzdFR4VGltZSAlIzA0eCAiCi0JCSAgIlNlcSAlIzA0eCBQSFlUeFN0YXR1cyAlIzA0eCBSeEFjayAlIzA0eCIsCi0JCSAgX19nZXRfc3RyKGRldiksIF9fZW50cnktPmZyYW1laWQsIF9fZW50cnktPnN0YXR1cywKLQkJICBfX2VudHJ5LT5sYXN0dHh0aW1lLCBfX2VudHJ5LT5zZXF1ZW5jZSwgX19lbnRyeS0+cGh5ZXJyLAotCQkgIF9fZW50cnktPmFja3BoeXJ4c2gpCi0pOwotCi1UUkFDRV9FVkVOVChicmNtc19hbXBkdV9zZXNzaW9uLAotCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbWF4X2FtcGR1X2xlbiwKLQkJIHUxNiBtYXhfYW1wZHVfZnJhbWVzLCB1MTYgYW1wZHVfbGVuLCB1MTYgYW1wZHVfZnJhbWVzLAotCQkgdTE2IGRtYV9sZW4pLAotCVRQX0FSR1MoZGV2LCBtYXhfYW1wZHVfbGVuLCBtYXhfYW1wZHVfZnJhbWVzLCBhbXBkdV9sZW4sIGFtcGR1X2ZyYW1lcywKLQkJZG1hX2xlbiksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJX19zdHJpbmcoZGV2LCBkZXZfbmFtZShkZXYpKQotCQlfX2ZpZWxkKHVuc2lnbmVkLCBtYXhfYW1wZHVfbGVuKQotCQlfX2ZpZWxkKHUxNiwgbWF4X2FtcGR1X2ZyYW1lcykKLQkJX19maWVsZCh1MTYsIGFtcGR1X2xlbikKLQkJX19maWVsZCh1MTYsIGFtcGR1X2ZyYW1lcykKLQkJX19maWVsZCh1MTYsIGRtYV9sZW4pCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJX19hc3NpZ25fc3RyKGRldiwgZGV2X25hbWUoZGV2KSk7Ci0JCV9fZW50cnktPm1heF9hbXBkdV9sZW4gPSBtYXhfYW1wZHVfbGVuOwotCQlfX2VudHJ5LT5tYXhfYW1wZHVfZnJhbWVzID0gbWF4X2FtcGR1X2ZyYW1lczsKLQkJX19lbnRyeS0+YW1wZHVfbGVuID0gYW1wZHVfbGVuOwotCQlfX2VudHJ5LT5hbXBkdV9mcmFtZXMgPSBhbXBkdV9mcmFtZXM7Ci0JCV9fZW50cnktPmRtYV9sZW4gPSBkbWFfbGVuOwotCSksCi0JVFBfcHJpbnRrKCJbJXNdIGFtcGR1IHNlc3Npb24gbWF4X2xlbj0ldSBtYXhfZnJhbWVzPSV1IGxlbj0ldSBmcmFtZXM9JXUgZG1hX2xlbj0ldSIsCi0JCSAgX19nZXRfc3RyKGRldiksIF9fZW50cnktPm1heF9hbXBkdV9sZW4sCi0JCSAgX19lbnRyeS0+bWF4X2FtcGR1X2ZyYW1lcywgX19lbnRyeS0+YW1wZHVfbGVuLAotCQkgIF9fZW50cnktPmFtcGR1X2ZyYW1lcywgX19lbnRyeS0+ZG1hX2xlbikKLSk7Ci0KLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGJyY21zbWFjX21zZwotCi0jZGVmaW5lIE1BWF9NU0dfTEVOCTEwMAotCi1ERUNMQVJFX0VWRU5UX0NMQVNTKGJyY21zX21zZ19ldmVudCwKLQlUUF9QUk9UTyhzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpLAotCVRQX0FSR1ModmFmKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2R5bmFtaWNfYXJyYXkoY2hhciwgbXNnLCBNQVhfTVNHX0xFTikKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlXQVJOX09OX09OQ0UodnNucHJpbnRmKF9fZ2V0X2R5bmFtaWNfYXJyYXkobXNnKSwKLQkJCQkgICAgICAgTUFYX01TR19MRU4sIHZhZi0+Zm10LAotCQkJCSAgICAgICAqdmFmLT52YSkgPj0gTUFYX01TR19MRU4pOwotCSksCi0JVFBfcHJpbnRrKCIlcyIsIF9fZ2V0X3N0cihtc2cpKQotKTsKLQotREVGSU5FX0VWRU5UKGJyY21zX21zZ19ldmVudCwgYnJjbXNfaW5mbywKLQlUUF9QUk9UTyhzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpLAotCVRQX0FSR1ModmFmKQotKTsKLQotREVGSU5FX0VWRU5UKGJyY21zX21zZ19ldmVudCwgYnJjbXNfd2FybiwKLQlUUF9QUk9UTyhzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpLAotCVRQX0FSR1ModmFmKQotKTsKLQotREVGSU5FX0VWRU5UKGJyY21zX21zZ19ldmVudCwgYnJjbXNfZXJyLAotCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCi0JVFBfQVJHUyh2YWYpCi0pOwotCi1ERUZJTkVfRVZFTlQoYnJjbXNfbXNnX2V2ZW50LCBicmNtc19jcml0LAotCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCi0JVFBfQVJHUyh2YWYpCi0pOwotCi1UUkFDRV9FVkVOVChicmNtc19kYmcsCi0JVFBfUFJPVE8odTMyIGxldmVsLCBjb25zdCBjaGFyICpmdW5jLCBzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpLAotCVRQX0FSR1MobGV2ZWwsIGZ1bmMsIHZhZiksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJX19maWVsZCh1MzIsIGxldmVsKQotCQlfX3N0cmluZyhmdW5jLCBmdW5jKQotCQlfX2R5bmFtaWNfYXJyYXkoY2hhciwgbXNnLCBNQVhfTVNHX0xFTikKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2VudHJ5LT5sZXZlbCA9IGxldmVsOwotCQlfX2Fzc2lnbl9zdHIoZnVuYywgZnVuYyk7Ci0JCVdBUk5fT05fT05DRSh2c25wcmludGYoX19nZXRfZHluYW1pY19hcnJheShtc2cpLAotCQkJCSAgICAgICBNQVhfTVNHX0xFTiwgdmFmLT5mbXQsCi0JCQkJICAgICAgICp2YWYtPnZhKSA+PSBNQVhfTVNHX0xFTik7Ci0JKSwKLQlUUF9wcmludGsoIiVzOiAlcyIsIF9fZ2V0X3N0cihmdW5jKSwgX19nZXRfc3RyKG1zZykpCi0pOworI2luY2x1ZGUgImJyY21zX3RyYWNlX2JyY21zbWFjLmgiCisjaW5jbHVkZSAiYnJjbXNfdHJhY2VfYnJjbXNtYWNfdHguaCIKKyNpbmNsdWRlICJicmNtc190cmFjZV9icmNtc21hY19tc2cuaCIKIAogI2VuZGlmIC8qIF9fVFJBQ0VfQlJDTVNNQUNfSCAqLwotCi0jaWZkZWYgQ09ORklHX0JSQ01fVFJBQ0lORwotCi0jdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICi0jZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuCi0jdW5kZWYgVFJBQ0VfSU5DTFVERV9GSUxFCi0jZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBicmNtc190cmFjZV9ldmVudHMKLQotI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgotCi0jZW5kaWYgLyogQ09ORklHX0JSQ01fVFJBQ0lORyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWluLmMKaW5kZXggZWI4NTg0YS4uMzY5NTI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5jCkBAIC00NjY4LDcgKzQ2NjgsNyBAQAogCWJyY21zX2NfY29yZWRpc2FibGUod2xjX2h3KTsKIAogCS8qIE1hdGNoIGRyaXZlciAiZG93biIgc3RhdGUgKi8KLQliY21hX2NvcmVfcGNpX2Rvd24od2xjX2h3LT5kMTFjb3JlLT5idXMpOworCWJjbWFfaG9zdF9wY2lfZG93bih3bGNfaHctPmQxMWNvcmUtPmJ1cyk7CiAKIAkvKiB0dXJuIG9mZiBwbGwgYW5kIHh0YWwgdG8gbWF0Y2ggZHJpdmVyICJkb3duIiBzdGF0ZSAqLwogCWJyY21zX2JfeHRhbCh3bGNfaHcsIE9GRik7CkBAIC00OTU5LDcgKzQ5NTksNyBAQAogCSAqIENvbmZpZ3VyZSBwY2kvcGNtY2lhIGhlcmUgaW5zdGVhZCBvZiBpbiBicmNtc19jX2F0dGFjaCgpCiAJICogdG8gYWxsb3cgbWZnIGhvdHN3YXA6ICBkb3duLCBob3Rzd2FwIChjaGlwIHBvd2VyIGN5Y2xlKSwgdXAuCiAJICovCi0JYmNtYV9jb3JlX3BjaV9pcnFfY3RsKCZ3bGNfaHctPmQxMWNvcmUtPmJ1cy0+ZHJ2X3BjaVswXSwgd2xjX2h3LT5kMTFjb3JlLAorCWJjbWFfaG9zdF9wY2lfaXJxX2N0bCh3bGNfaHctPmQxMWNvcmUtPmJ1cywgd2xjX2h3LT5kMTFjb3JlLAogCQkJICAgICAgdHJ1ZSk7CiAKIAkvKgpAQCAtNDk2OSwxMiArNDk2OSwxMiBAQAogCSAqLwogCWlmIChicmNtc19iX3JhZGlvX3JlYWRfaHdkaXNhYmxlZCh3bGNfaHcpKSB7CiAJCS8qIHB1dCBTQiBQQ0kgaW4gZG93biBzdGF0ZSBhZ2FpbiAqLwotCQliY21hX2NvcmVfcGNpX2Rvd24od2xjX2h3LT5kMTFjb3JlLT5idXMpOworCQliY21hX2hvc3RfcGNpX2Rvd24od2xjX2h3LT5kMTFjb3JlLT5idXMpOwogCQlicmNtc19iX3h0YWwod2xjX2h3LCBPRkYpOwogCQlyZXR1cm4gLUVOT01FRElVTTsKIAl9CiAKLQliY21hX2NvcmVfcGNpX3VwKHdsY19ody0+ZDExY29yZS0+YnVzKTsKKwliY21hX2hvc3RfcGNpX3VwKHdsY19ody0+ZDExY29yZS0+YnVzKTsKIAogCS8qIHJlc2V0IHRoZSBkMTEgY29yZSAqLwogCWJyY21zX2JfY29yZXJlc2V0KHdsY19odywgQlJDTVNfVVNFX0NPUkVGTEFHUyk7CkBAIC01MTcxLDcgKzUxNzEsNyBAQAogCiAJCS8qIHR1cm4gb2ZmIHByaW1hcnkgeHRhbCBhbmQgcGxsICovCiAJCWlmICghd2xjX2h3LT5ub3Jlc2V0KSB7Ci0JCQliY21hX2NvcmVfcGNpX2Rvd24od2xjX2h3LT5kMTFjb3JlLT5idXMpOworCQkJYmNtYV9ob3N0X3BjaV9kb3duKHdsY19ody0+ZDExY29yZS0+YnVzKTsKIAkJCWJyY21zX2JfeHRhbCh3bGNfaHcsIE9GRik7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9jbW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2Ntbi5jCmluZGV4IDk0MWIxZTQuLjFjNGU5ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2Ntbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2Ntbi5jCkBAIC0yOTQ5LDUgKzI5NDksNSBAQAogCWlmIChJU05QSFkocGkpKQogCQlyZXR1cm4gd2xjX3BoeV9uX3R4cG93ZXJfaXBhX2lzb24ocGkpOwogCWVsc2UKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2xjbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbGNuLmMKaW5kZXggNWYxMzY2Mi4uOTNkNGNkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbGNuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbGNuLmMKQEAgLTQ5OTksNyArNDk5OSw3IEBACiBib29sIHdsY19waHlfdHBjX2lzZW5hYmxlZF9sY25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpCiB7CiAJaWYgKHdsY19sY25waHlfdGVtcHNlbnNlX2Jhc2VkX3B3cl9jdHJsX2VuYWJsZWQocGkpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCWVsc2UKIAkJcmV0dXJuIChMQ05QSFlfVFhfUFdSX0NUUkxfSFcgPT0KIAkJCXdsY19sY25waHlfZ2V0X3R4X3B3cl9jdHJsKChwaSkpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X24uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X24uYwppbmRleCAwODRmMThmLi45OWRhYzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbi5jCkBAIC0yMzA0MSwxMCArMjMwNDEsNyBAQAogCWVsc2UgaWYgKHJzc2lfY3RybF9zdGF0ZVswXSA9PSBSQURJT18yMDU1X1dCUlNTSV9HMV9TRUwpCiAJCXdsY19waHlfcnNzaXNlbF9ucGh5KHBpLCBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTEsCiAJCQkJICAgICBOUEhZX1JTU0lfU0VMX1cxKTsKLQllbHNlIGlmIChyc3NpX2N0cmxfc3RhdGVbMF0gPT0gUkFESU9fMjA1NV9XQlJTU0lfRzJfU0VMKQotCQl3bGNfcGh5X3Jzc2lzZWxfbnBoeShwaSwgUkFESU9fTUlNT19DT1JFU0VMX0NPUkUxLAotCQkJCSAgICAgTlBIWV9SU1NJX1NFTF9XMik7Ci0JZWxzZQorCWVsc2UgLyogUkFESU9fMjA1NV9XQlJTU0lfRzJfU0VMICovCiAJCXdsY19waHlfcnNzaXNlbF9ucGh5KHBpLCBSQURJT19NSU1PX0NPUkVTRUxfQ09SRTEsCiAJCQkJICAgICBOUEhZX1JTU0lfU0VMX1cyKTsKIAlpZiAocnNzaV9jdHJsX3N0YXRlWzFdID09IFJBRElPXzIwNTVfTkJSU1NJX1NFTCkKQEAgLTIzMDUzLDEzICsyMzA1MCw5IEBACiAJZWxzZSBpZiAocnNzaV9jdHJsX3N0YXRlWzFdID09IFJBRElPXzIwNTVfV0JSU1NJX0cxX1NFTCkKIAkJd2xjX3BoeV9yc3Npc2VsX25waHkocGksIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMiwKIAkJCQkgICAgIE5QSFlfUlNTSV9TRUxfVzEpOwotCWVsc2UgaWYgKHJzc2lfY3RybF9zdGF0ZVsxXSA9PSBSQURJT18yMDU1X1dCUlNTSV9HMl9TRUwpCisJZWxzZSAvKiBSQURJT18yMDU1X1dCUlNTSV9HMV9TRUwgKi8KIAkJd2xjX3BoeV9yc3Npc2VsX25waHkocGksIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMiwKIAkJCQkgICAgIE5QSFlfUlNTSV9TRUxfVzIpOwotCWVsc2UKLQkJd2xjX3BoeV9yc3Npc2VsX25waHkocGksIFJBRElPX01JTU9fQ09SRVNFTF9DT1JFMiwKLQkJCQkgICAgIE5QSFlfUlNTSV9TRUxfVzIpOwotCiAJd2xjX3BoeV9yc3Npc2VsX25waHkocGksIFJBRElPX01JTU9fQ09SRVNFTF9PRkYsIHJzc2lfdHlwZSk7CiAKIAl3cml0ZV9waHlfcmVnKHBpLCAweDkxLCByZmN0cmxpbnRjX3N0YXRlWzBdKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2JyY21faHdfaWRzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9icmNtX2h3X2lkcy5oCmluZGV4IDIxMjRhMTcuLjRlZmRkNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2JyY21faHdfaWRzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvYnJjbV9od19pZHMuaApAQCAtMzcsNiArMzcsOCBAQAogI2RlZmluZSBCUkNNX0NDXzQzMzYyX0NISVBfSUQJCTQzMzYyCiAjZGVmaW5lIEJSQ01fQ0NfNDMzNV9DSElQX0lECQkweDQzMzUKICNkZWZpbmUgQlJDTV9DQ180MzM5X0NISVBfSUQJCTB4NDMzOQorI2RlZmluZSBCUkNNX0NDXzQzNDMwX0NISVBfSUQJCTQzNDMwCisjZGVmaW5lIEJSQ01fQ0NfNDM0NV9DSElQX0lECQkweDQzNDUKICNkZWZpbmUgQlJDTV9DQ180MzU0X0NISVBfSUQJCTB4NDM1NAogI2RlZmluZSBCUkNNX0NDXzQzNTZfQ0hJUF9JRAkJMHg0MzU2CiAjZGVmaW5lIEJSQ01fQ0NfNDM1NjZfQ0hJUF9JRAkJNDM1NjYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2NoaXBjb21tb24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2NoaXBjb21tb24uaAppbmRleCBkMjQyMzMzLi5lMWZkNDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9jaGlwY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvY2hpcGNvbW1vbi5oCkBAIC0xODMsNyArMTgzLDE0IEBACiAJdTggdWFydDFsc3I7CiAJdTggdWFydDFtc3I7CiAJdTggdWFydDFzY3JhdGNoOwotCXUzMiBQQURbMTI2XTsKKwl1MzIgUEFEWzYyXTsKKworCS8qIHNhdmUvcmVzdG9yZSwgY29yZXJldiA+PSA0OCAqLworCXUzMiBzcl9jYXBhYmlsaXR5OyAgICAgICAgICAvKiAweDUwMCAqLworCXUzMiBzcl9jb250cm9sMDsgICAgICAgICAgICAvKiAweDUwNCAqLworCXUzMiBzcl9jb250cm9sMTsgICAgICAgICAgICAvKiAweDUwOCAqLworCXUzMiBncGlvX2NvbnRyb2w7ICAgICAgICAgICAvKiAweDUwQyAqLworCXUzMiBQQURbNjBdOwogCiAJLyogUE1VIHJlZ2lzdGVycyAoY29yZXJldiA+PSAyMCkgKi8KIAl1MzIgcG11Y29udHJvbDsJLyogMHg2MDAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2N3MTIwMC9jdzEyMDBfc3BpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9jdzEyMDAvY3cxMjAwX3NwaS5jCmluZGV4IDk2NGI2NGEuLjc2MDM1NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2N3MTIwMC9jdzEyMDBfc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvY3cxMjAwL2N3MTIwMF9zcGkuYwpAQCAtNDQ3LDcgKzQ0Nyw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgY3cxMjAwX3NwaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBjdzEyMDBfc3BpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBod2J1c19wcml2ICpzZWxmID0gc3BpX2dldF9kcnZkYXRhKHRvX3NwaV9kZXZpY2UoZGV2KSk7CiAKQEAgLTQ1OCwxMCArNDU4LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjdzEyMDBfc3BpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19CitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoY3cxMjAwX3BtX29wcywgY3cxMjAwX3NwaV9zdXNwZW5kLCBOVUxMKTsKKwogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBzcGlfZHJpdmVyID0gewpAQCAtNDcyLDggKzQ3MCw3IEBACiAJCS5idXMgICAgICAgICAgICA9ICZzcGlfYnVzX3R5cGUsCiAJCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAogI2lmZGVmIENPTkZJR19QTQotCQkuc3VzcGVuZCAgICAgICAgPSBjdzEyMDBfc3BpX3N1c3BlbmQsCi0JCS5yZXN1bWUgICAgICAgICA9IGN3MTIwMF9zcGlfcmVzdW1lLAorCQkucG0JCT0gJmN3MTIwMF9wbV9vcHMsCiAjZW5kaWYKIAl9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2N3MTIwMC9zdGEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2N3MTIwMC9zdGEuYwppbmRleCA0YTQ3YzdmLi5iMGY2NWZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9jdzEyMDAvc3RhLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvY3cxMjAwL3N0YS5jCkBAIC0yOTMsNyArMjkzLDcgQEAKIAl9CiAJcHJpdi0+dmlmID0gTlVMTDsKIAlwcml2LT5tb2RlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsKLQltZW1zZXQocHJpdi0+bWFjX2FkZHIsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKHByaXYtPm1hY19hZGRyKTsKIAltZW1zZXQoJnByaXYtPnAycF9wc19tb2RlaW5mbywgMCwgc2l6ZW9mKHByaXYtPnAycF9wc19tb2RlaW5mbykpOwogCWN3MTIwMF9mcmVlX2tleXMocHJpdik7CiAJY3cxMjAwX3NldHVwX21hYyhwcml2KTsKQEAgLTEyNDAsOCArMTI0MCw4IEBACiAKIAlic3NpZCA9IHByaXYtPnZpZi0+YnNzX2NvbmYuYnNzaWQ7CiAKLQlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKHByaXYtPmh3LT53aXBoeSwgcHJpdi0+Y2hhbm5lbCwKLQkJCWJzc2lkLCBOVUxMLCAwLCAwLCAwKTsKKwlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKHByaXYtPmh3LT53aXBoeSwgcHJpdi0+Y2hhbm5lbCwgYnNzaWQsIE5VTEwsIDAsCisJCQkgICAgICAgSUVFRTgwMjExX0JTU19UWVBFX0FOWSwgSUVFRTgwMjExX1BSSVZBQ1lfQU5ZKTsKIAogCWlmICghYnNzICYmICFjb25mLT5pYnNzX2pvaW5lZCkgewogCQl3c21fdW5sb2NrX3R4KHByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvY3cxMjAwL3R4cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2N3MTIwMC90eHJ4LmMKaW5kZXggMGJkNTQxMS4uZDI4YmQ0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvY3cxMjAwL3R4cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9jdzEyMDAvdHhyeC5jCkBAIC0xNDI5LDcgKzE0MjksNyBAQAogCQkJCXByaXYtPmxpbmtfaWRfbWFwICY9IH5tYXNrOwogCQkJCXByaXYtPnN0YV9hc2xlZXBfbWFzayAmPSB+bWFzazsKIAkJCQlwcml2LT5wc3BvbGxfbWFzayAmPSB+bWFzazsKLQkJCQltZW1zZXQobWFwX2xpbmsubWFjX2FkZHIsIDAsIEVUSF9BTEVOKTsKKwkJCQlldGhfemVyb19hZGRyKG1hcF9saW5rLm1hY19hZGRyKTsKIAkJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+cHNfc3RhdGVfbG9jayk7CiAJCQkJcmVzZXQubGlua19pZCA9IGkgKyAxOwogCQkJCXdzbV9yZXNldChwcml2LCAmcmVzZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF84MDIxMV90eC5jCmluZGV4IDhiZGU3NzYuLjA1NWUxMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfODAyMTFfdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwXzgwMjExX3R4LmMKQEAgLTE3NCw4ICsxNzQsOCBAQAogCQkvKiBzZW5kIGJyb2FkY2FzdCBhbmQgbXVsdGljYXN0IGZyYW1lcyB0byBicm9hZGNhc3QgUkEsIGlmCiAJCSAqIGNvbmZpZ3VyZWQ7IG90aGVyd2lzZSwgdXNlIHVuaWNhc3QgUkEgb2YgdGhlIFdEUyBsaW5rICovCiAJCWlmICgobG9jYWwtPndkc190eXBlICYgSE9TVEFQX1dEU19CUk9BRENBU1RfUkEpICYmCi0JCSAgICBza2ItPmRhdGFbMF0gJiAweDAxKQotCQkJbWVtc2V0KCZoZHIuYWRkcjEsIDB4ZmYsIEVUSF9BTEVOKTsKKwkJICAgIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHNrYi0+ZGF0YSkpCisJCQlldGhfYnJvYWRjYXN0X2FkZHIoaGRyLmFkZHIxKTsKIAkJZWxzZSBpZiAoaWZhY2UtPnR5cGUgPT0gSE9TVEFQX0lOVEVSRkFDRV9XRFMpCiAJCQltZW1jcHkoJmhkci5hZGRyMSwgaWZhY2UtPnUud2RzLnJlbW90ZV9hZGRyLAogCQkJICAgICAgIEVUSF9BTEVOKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfYXAuYwppbmRleCBmZDhkODNkLi5jOTk1YWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2FwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9hcC5jCkBAIC0zMDksNyArMzA5LDcgQEAKIAlpbnQgaTsKIAogCVBERUJVRyhERUJVR19BUCwgIiVzOiBEZWF1dGhlbnRpY2F0ZSBhbGwgc3RhdGlvbnNcbiIsIGRldi0+bmFtZSk7Ci0JbWVtc2V0KGFkZHIsIDB4ZmYsIEVUSF9BTEVOKTsKKwlldGhfYnJvYWRjYXN0X2FkZHIoYWRkcik7CiAKIAlyZXNwID0gY3B1X3RvX2xlMTYoV0xBTl9SRUFTT05fUFJFVl9BVVRIX05PVF9WQUxJRCk7CiAKQEAgLTEwMTUsOCArMTAxNSw4IEBACiAJCW1lbWNweShoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7IC8qIFNBICovCiAJfSBlbHNlIGlmIChpZWVlODAyMTFfaXNfY3RsKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKIAkJLyogY29udHJvbDpBQ0sgZG9lcyBub3QgaGF2ZSBhZGRyMiBvciBhZGRyMyAqLwotCQltZW1zZXQoaGRyLT5hZGRyMiwgMCwgRVRIX0FMRU4pOwotCQltZW1zZXQoaGRyLT5hZGRyMywgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKGhkci0+YWRkcjIpOworCQlldGhfemVyb19hZGRyKGhkci0+YWRkcjMpOwogCX0gZWxzZSB7CiAJCW1lbWNweShoZHItPmFkZHIyLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7IC8qIFNBICovCiAJCW1lbWNweShoZHItPmFkZHIzLCBkZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7IC8qIEJTU0lEICovCkBAIC0xNjAxLDcgKzE2MDEsNyBAQAogCQltZW1jcHkocHJldl9hcCwgcG9zLCBFVEhfQUxFTik7CiAJCXBvcysrOyBwb3MrKzsgcG9zKys7IGxlZnQgLT0gNjsKIAl9IGVsc2UKLQkJbWVtc2V0KHByZXZfYXAsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcihwcmV2X2FwKTsKIAogCWlmIChsZWZ0ID49IDIpIHsKIAkJdW5zaWduZWQgaW50IGlsZWZ0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pbmZvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2luZm8uYwppbmRleCBkZTdjNGZmLi43NjM1YWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2luZm8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2luZm8uYwpAQCAtNDQyLDcgKzQ0Miw3IEBACiAJfSBlbHNlIHsKIAkJbmV0aWZfY2Fycmllcl9vZmYobG9jYWwtPmRldik7CiAJCW5ldGlmX2NhcnJpZXJfb2ZmKGxvY2FsLT5kZGV2KTsKLQkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIod3JxdS5hcF9hZGRyLnNhX2RhdGEpOwogCX0KIAl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCmluZGV4IDUyOTE5YWQuLjAxZGUxYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfbWFpbi5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIAogCWlmIChzZWxlY3RlZCkgewogCQlpZiAoZG9fbm90X3JlbW92ZSkKLQkJCW1lbXNldChzZWxlY3RlZC0+dS53ZHMucmVtb3RlX2FkZHIsIDAsIEVUSF9BTEVOKTsKKwkJCWV0aF96ZXJvX2FkZHIoc2VsZWN0ZWQtPnUud2RzLnJlbW90ZV9hZGRyKTsKIAkJZWxzZSB7CiAJCQlob3N0YXBfcmVtb3ZlX2ludGVyZmFjZShzZWxlY3RlZC0+ZGV2LCBydG5sX2xvY2tlZCwgMCk7CiAJCQlsb2NhbC0+d2RzX2Nvbm5lY3Rpb25zLS07CkBAIC03OTgsNyArNzk4LDYgQEAKIAogY29uc3Qgc3RydWN0IGhlYWRlcl9vcHMgaG9zdGFwXzgwMjExX29wcyA9IHsKIAkuY3JlYXRlCQk9IGV0aF9oZWFkZXIsCi0JLnJlYnVpbGQJPSBldGhfcmVidWlsZF9oZWFkZXIsCiAJLmNhY2hlCQk9IGV0aF9oZWFkZXJfY2FjaGUsCiAJLmNhY2hlX3VwZGF0ZQk9IGV0aF9oZWFkZXJfY2FjaGVfdXBkYXRlLAogCS5wYXJzZQkJPSBob3N0YXBfODAyMTFfaGVhZGVyX3BhcnNlLApAQCAtMTA4OCw3ICsxMDg3LDcgQEAKIAogCXJldCA9IHByaXNtMl9zdGFfc2VuZF9tZ210KGxvY2FsLCBsb2NhbC0+YnNzaWQsIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgsCiAJCQkJICAgKHU4ICopICZ2YWwsIDIpOwotCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIod3JxdS5hcF9hZGRyLnNhX2RhdGEpOwogCXdpcmVsZXNzX3NlbmRfZXZlbnQobG9jYWwtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfd2xhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF93bGFuLmgKaW5kZXggNTc5MDQwMS4uY2EyNTI4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF93bGFuLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF93bGFuLmgKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KICNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CkBAIC04NSwxNiArODYsMTYgQEAKIAkvKiA4MDIuMTEgKi8KIAlfX2xlMTYgZnJhbWVfY29udHJvbDsKIAlfX2xlMTYgZHVyYXRpb25faWQ7Ci0JdTggYWRkcjFbNl07Ci0JdTggYWRkcjJbNl07Ci0JdTggYWRkcjNbNl07CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsKKwl1OCBhZGRyM1tFVEhfQUxFTl07CiAJX19sZTE2IHNlcV9jdHJsOwotCXU4IGFkZHI0WzZdOworCXU4IGFkZHI0W0VUSF9BTEVOXTsKIAlfX2xlMTYgZGF0YV9sZW47CiAKIAkvKiA4MDIuMyAqLwotCXU4IGRzdF9hZGRyWzZdOwotCXU4IHNyY19hZGRyWzZdOworCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKKwl1OCBzcmNfYWRkcltFVEhfQUxFTl07CiAJX19iZTE2IGxlbjsKIAogCS8qIGZvbGxvd2VkIGJ5IGZyYW1lIGRhdGE7IG1heCAyMzA0IGJ5dGVzICovCkBAIC0xMTQsMTYgKzExNSwxNiBAQAogCS8qIDgwMi4xMSAqLwogCV9fbGUxNiBmcmFtZV9jb250cm9sOyAvKiBwYXJ0cyBub3QgdXNlZCAqLwogCV9fbGUxNiBkdXJhdGlvbl9pZDsKLQl1OCBhZGRyMVs2XTsKLQl1OCBhZGRyMls2XTsgLyogZmlsbGVkIGJ5IGZpcm13YXJlICovCi0JdTggYWRkcjNbNl07CisJdTggYWRkcjFbRVRIX0FMRU5dOworCXU4IGFkZHIyW0VUSF9BTEVOXTsgLyogZmlsbGVkIGJ5IGZpcm13YXJlICovCisJdTggYWRkcjNbRVRIX0FMRU5dOwogCV9fbGUxNiBzZXFfY3RybDsgLyogZmlsbGVkIGJ5IGZpcm13YXJlICovCi0JdTggYWRkcjRbNl07CisJdTggYWRkcjRbRVRIX0FMRU5dOwogCV9fbGUxNiBkYXRhX2xlbjsKIAogCS8qIDgwMi4zICovCi0JdTggZHN0X2FkZHJbNl07Ci0JdTggc3JjX2FkZHJbNl07CisJdTggZHN0X2FkZHJbRVRIX0FMRU5dOworCXU4IHNyY19hZGRyW0VUSF9BTEVOXTsKIAlfX2JlMTYgbGVuOwogCiAJLyogZm9sbG93ZWQgYnkgZnJhbWUgZGF0YTsgbWF4IDIzMDQgYnl0ZXMgKi8KQEAgLTE1Niw3ICsxNTcsNyBAQAogfSBfX3BhY2tlZDsKIAogc3RydWN0IGhmYTM4NHhfam9pbl9yZXF1ZXN0IHsKLQl1OCBic3NpZFs2XTsKKwl1OCBic3NpZFtFVEhfQUxFTl07CiAJX19sZTE2IGNoYW5uZWw7CiB9IF9fcGFja2VkOwogCkBAIC0yMjgsNyArMjI5LDcgQEAKIAlfX2xlMTYgY2hpZDsKIAlfX2xlMTYgYW5sOwogCV9fbGUxNiBzbDsKLQl1OCBic3NpZFs2XTsKKwl1OCBic3NpZFtFVEhfQUxFTl07CiAJX19sZTE2IGJlYWNvbl9pbnRlcnZhbDsKIAlfX2xlMTYgY2FwYWJpbGl0eTsKIAlfX2xlMTYgc3NpZF9sZW47CkBAIC0yNDEsNyArMjQyLDcgQEAKIAlfX2xlMTYgY2hpZDsKIAlfX2xlMTYgYW5sOwogCV9fbGUxNiBzbDsKLQl1OCBic3NpZFs2XTsKKwl1OCBic3NpZFtFVEhfQUxFTl07CiAJX19sZTE2IGJlYWNvbl9pbnRlcnZhbDsKIAlfX2xlMTYgY2FwYWJpbGl0eTsKIAlfX2xlMTYgc3NpZF9sZW47CkBAIC04MjQsNyArODI1LDcgQEAKICNkZWZpbmUgUFJJU00yX0lORk9fUEVORElOR19TQ0FOUkVTVUxUUyAxCiAJaW50IHByZXZfbGlua19zdGF0dXM7IC8qIHByZXZpb3VzIHJlY2VpdmVkIExpbmtTdGF0dXMgaW5mbyAqLwogCWludCBwcmV2X2xpbmtzdGF0dXNfY29ubmVjdGVkOwotCXU4IHByZWZlcnJlZF9hcFs2XTsgLyogdXNlIHRoaXMgQVAgaWYgcG9zc2libGUgKi8KKwl1OCBwcmVmZXJyZWRfYXBbRVRIX0FMRU5dOyAvKiB1c2UgdGhpcyBBUCBpZiBwb3NzaWJsZSAqLwogCiAjaWZkZWYgUFJJU00yX0NBTExCQUNLCiAJdm9pZCAqY2FsbGJhY2tfZGF0YTsgLyogQ2FuIGJlIHVzZWQgaW4gY2FsbGJhY2tzOyBlLmcuLCBhbGxvY2F0ZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9LY29uZmlnCmluZGV4IDIxZGU0ZmUuLmQ2ZWM0NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL0tjb25maWcKQEAgLTY2LDcgKzY2LDcgQEAKIGNvbmZpZyBJUFcyMjAwCiAJdHJpc3RhdGUgIkludGVsIFBSTy9XaXJlbGVzcyAyMjAwQkcgYW5kIDI5MTVBQkcgTmV0d29yayBDb25uZWN0aW9uIgogCWRlcGVuZHMgb24gUENJICYmIENGRzgwMjExCi0Jc2VsZWN0IENGRzgwMjExX1dFWFQKKwlzZWxlY3QgQ0ZHODAyMTFfV0VYVF9FWFBPUlQKIAlzZWxlY3QgV0lSRUxFU1NfRVhUCiAJc2VsZWN0IFdFWFRfU1BZCiAJc2VsZWN0IFdFWFRfUFJJVgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMTAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwppbmRleCA2ZmFiZWEwLi4wOGViMjI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYwpAQCAtMjE0Nyw4ICsyMTQ3LDggQEAKIAkJcmV0dXJuOwogCX0KIAotCW1lbXNldChwcml2LT5ic3NpZCwgMCwgRVRIX0FMRU4pOwotCW1lbXNldChwcml2LT5pZWVlLT5ic3NpZCwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIocHJpdi0+YnNzaWQpOworCWV0aF96ZXJvX2FkZHIocHJpdi0+aWVlZS0+YnNzaWQpOwogCiAJbmV0aWZfY2Fycmllcl9vZmYocHJpdi0+bmV0X2Rldik7CiAJbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRfZGV2KTsKQEAgLTY5NTYsNyArNjk1Niw3IEBACiAJCXdycXUtPmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCQltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLCBwcml2LT5ic3NpZCwgRVRIX0FMRU4pOwogCX0gZWxzZQotCQltZW1zZXQod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIod3JxdS0+YXBfYWRkci5zYV9kYXRhKTsKIAogCUlQV19ERUJVR19XWCgiR2V0dGluZyBXQVAgQlNTSUQ6ICVwTVxuIiwgd3JxdS0+YXBfYWRkci5zYV9kYXRhKTsKIAlyZXR1cm4gMDsKQEAgLTgzMDAsNyArODMwMCw3IEBACiAJICAgIHByaXYtPnN0YXR1cyAmIFNUQVRVU19SRl9LSUxMX01BU0sgfHwKIAkgICAgaXB3MjEwMF9nZXRfb3JkaW5hbChwcml2LCBJUFdfT1JEX1NUQVRfQVNTTl9BUF9CU1NJRCwKIAkJCQkmcHJpdi0+YnNzaWQsICZsZW4pKSB7Ci0JCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKHdycXUuYXBfYWRkci5zYV9kYXRhKTsKIAl9IGVsc2UgewogCQkvKiBXZSBub3cgaGF2ZSB0aGUgQlNTSUQsIHNvIGNhbiBmaW5pc2ggc2V0dGluZyB0byB0aGUgZnVsbAogCQkgKiBhc3NvY2lhdGVkIHN0YXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjIwMC5jCmluZGV4IDY3Y2FkOWIuLjM5ZjNlNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjIwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjIwMC5jCkBAIC0xOTY0LDcgKzE5NjQsNyBAQAogCWlmIChwcml2LT5zdGF0dXMgJiBTVEFUVVNfQVNTT0NJQVRFRCkKIAkJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBwcml2LT5ic3NpZCwgRVRIX0FMRU4pOwogCWVsc2UKLQkJbWVtc2V0KHdycXUuYXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIod3JxdS5hcF9hZGRyLnNhX2RhdGEpOwogCXdpcmVsZXNzX3NlbmRfZXZlbnQocHJpdi0+bmV0X2RldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CiB9CiAKQEAgLTc0MDAsNyArNzQwMCw3IEBACiAJbWVtY3B5KHByaXYtPmFzc29jX3JlcXVlc3QuYnNzaWQsIG5ldHdvcmstPmJzc2lkLCBFVEhfQUxFTik7CiAKIAlpZiAocHJpdi0+aWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0FESE9DKSB7Ci0JCW1lbXNldCgmcHJpdi0+YXNzb2NfcmVxdWVzdC5kZXN0LCAweEZGLCBFVEhfQUxFTik7CisJCWV0aF9icm9hZGNhc3RfYWRkcihwcml2LT5hc3NvY19yZXF1ZXN0LmRlc3QpOwogCQlwcml2LT5hc3NvY19yZXF1ZXN0LmF0aW1fd2luZG93ID0gY3B1X3RvX2xlMTYobmV0d29yay0+YXRpbV93aW5kb3cpOwogCX0gZWxzZSB7CiAJCW1lbWNweShwcml2LT5hc3NvY19yZXF1ZXN0LmRlc3QsIG5ldHdvcmstPmJzc2lkLCBFVEhfQUxFTik7CkBAIC04OTg2LDcgKzg5ODYsNyBAQAogCQl3cnF1LT5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAkJbWVtY3B5KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgcHJpdi0+YnNzaWQsIEVUSF9BTEVOKTsKIAl9IGVsc2UKLQkJbWVtc2V0KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKHdycXUtPmFwX2FkZHIuc2FfZGF0YSk7CiAKIAlJUFdfREVCVUdfV1goIkdldHRpbmcgV0FQIEJTU0lEOiAlcE1cbiIsCiAJCSAgICAgd3JxdS0+YXBfYWRkci5zYV9kYXRhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtcnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtcnMuYwppbmRleCBlYWFlZWExLi5iYWM2MGIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LXJzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1ycy5jCkBAIC0xNjc4LDcgKzE2NzgsNyBAQAogCQkgICAgbHFfc3RhLT50b3RhbF9zdWNjZXNzID4gbHFfc3RhLT5tYXhfc3VjY2Vzc19saW1pdCB8fAogCQkgICAgKCFscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsICYmIGxxX3N0YS0+Zmx1c2hfdGltZXIgJiYKIAkJICAgICBmbHVzaF9pbnRlcnZhbF9wYXNzZWQpKSB7Ci0JCQlEX1JBVEUoIkxROiBzdGF5IGlzIGV4cGlyZWQgJWQgJWQgJWRcbjoiLAorCQkJRF9SQVRFKCJMUTogc3RheSBpcyBleHBpcmVkICVkICVkICVkXG4iLAogCQkJICAgICAgIGxxX3N0YS0+dG90YWxfZmFpbGVkLCBscV9zdGEtPnRvdGFsX3N1Y2Nlc3MsCiAJCQkgICAgICAgZmx1c2hfaW50ZXJ2YWxfcGFzc2VkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uYwppbmRleCAyYzRmYTQ5Li44ODcxMTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uYwpAQCAtNDYzNCw3ICs0NjM0LDcgQEAKIAlpbC0+dmlmID0gTlVMTDsKIAlpbC0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOwogCWlsX3RlYXJkb3duX2ludGVyZmFjZShpbCwgdmlmKTsKLQltZW1zZXQoaWwtPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihpbC0+YnNzaWQpOwogCiAJRF9NQUM4MDIxMSgibGVhdmVcbiIpOwogCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL2Rldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vZGV2LmgKaW5kZXggYTZmMjJjMy4uMzgxMTg3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vZGV2LmgKQEAgLTcwOCw3ICs3MDgsNiBAQAogCXVuc2lnbmVkIGxvbmcgcmVsb2FkX2ppZmZpZXM7CiAJaW50IHJlbG9hZF9jb3VudDsKIAlib29sIHVjb2RlX2xvYWRlZDsKLQlib29sIGluaXRfdWNvZGVfcnVuOwkJLyogRG9uJ3QgcnVuIGluaXQgdUNvZGUgYWdhaW4gKi8KIAogCXU4IHBsY3BfZGVsdGFfdGhyZXNob2xkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9tYWM4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vbWFjODAyMTEuYwppbmRleCA0N2U2NGU4Li41YWJkNjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9tYWM4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL21hYzgwMjExLmMKQEAgLTExMTQsMzUgKzExMTQsMzkgQEAKIAlzY2RfcXVldWVzICY9IH4oQklUKElXTF9JUEFOX0NNRF9RVUVVRV9OVU0pIHwKIAkJCUJJVChJV0xfREVGQVVMVF9DTURfUVVFVUVfTlVNKSk7CiAKLQlpZiAodmlmKQotCQlzY2RfcXVldWVzICY9IH5CSVQodmlmLT5od19xdWV1ZVtJRUVFODAyMTFfQUNfVk9dKTsKLQotCUlXTF9ERUJVR19UWF9RVUVVRVMocHJpdiwgIkZsdXNoaW5nIFNDRCBxdWV1ZXM6IDB4JXhcbiIsIHNjZF9xdWV1ZXMpOwotCWlmIChpd2xhZ25fdHhmaWZvX2ZsdXNoKHByaXYsIHNjZF9xdWV1ZXMpKSB7Ci0JCUlXTF9FUlIocHJpdiwgImZsdXNoIHJlcXVlc3QgZmFpbFxuIik7Ci0JCWdvdG8gZG9uZTsKKwlpZiAoZHJvcCkgeworCQlJV0xfREVCVUdfVFhfUVVFVUVTKHByaXYsICJGbHVzaGluZyBTQ0QgcXVldWVzOiAweCV4XG4iLAorCQkJCSAgICBzY2RfcXVldWVzKTsKKwkJaWYgKGl3bGFnbl90eGZpZm9fZmx1c2gocHJpdiwgc2NkX3F1ZXVlcykpIHsKKwkJCUlXTF9FUlIocHJpdiwgImZsdXNoIHJlcXVlc3QgZmFpbFxuIik7CisJCQlnb3RvIGRvbmU7CisJCX0KIAl9CisKIAlJV0xfREVCVUdfVFhfUVVFVUVTKHByaXYsICJ3YWl0IHRyYW5zbWl0L2ZsdXNoIGFsbCBmcmFtZXNcbiIpOwotCWl3bF90cmFuc193YWl0X3R4X3F1ZXVlX2VtcHR5KHByaXYtPnRyYW5zLCAweGZmZmZmZmZmKTsKKwlpd2xfdHJhbnNfd2FpdF90eF9xdWV1ZV9lbXB0eShwcml2LT50cmFucywgc2NkX3F1ZXVlcyk7CiBkb25lOgogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3Jzc2lfY2FsbGJhY2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgICAgZW51bSBpZWVlODAyMTFfcnNzaV9ldmVudCByc3NpX2V2ZW50KQorc3RhdGljIHZvaWQgaXdsYWduX21hY19ldmVudF9jYWxsYmFjayhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IElXTF9NQUM4MDIxMV9HRVRfRFZNKGh3KTsKIAorCWlmIChldmVudC0+dHlwZSAhPSBSU1NJX0VWRU5UKQorCQlyZXR1cm47CisKIAlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CiAKIAlpZiAocHJpdi0+bGliLT5idF9wYXJhbXMgJiYKIAkgICAgcHJpdi0+bGliLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKLQkJaWYgKHJzc2lfZXZlbnQgPT0gUlNTSV9FVkVOVF9MT1cpCisJCWlmIChldmVudC0+dS5yc3NpLmRhdGEgPT0gUlNTSV9FVkVOVF9MT1cpCiAJCQlwcml2LT5idF9lbmFibGVfcHNwb2xsID0gdHJ1ZTsKLQkJZWxzZSBpZiAocnNzaV9ldmVudCA9PSBSU1NJX0VWRU5UX0hJR0gpCisJCWVsc2UgaWYgKGV2ZW50LT51LnJzc2kuZGF0YSA9PSBSU1NJX0VWRU5UX0hJR0gpCiAJCQlwcml2LT5idF9lbmFibGVfcHNwb2xsID0gZmFsc2U7CiAKIAkJaXdsYWduX3NlbmRfYWR2YW5jZV9idF9jb25maWcocHJpdik7CkBAIC0xNjEzLDcgKzE2MTcsNyBAQAogCS5jaGFubmVsX3N3aXRjaCA9IGl3bGFnbl9tYWNfY2hhbm5lbF9zd2l0Y2gsCiAJLmZsdXNoID0gaXdsYWduX21hY19mbHVzaCwKIAkudHhfbGFzdF9iZWFjb24gPSBpd2xhZ25fbWFjX3R4X2xhc3RfYmVhY29uLAotCS5yc3NpX2NhbGxiYWNrID0gaXdsYWduX21hY19yc3NpX2NhbGxiYWNrLAorCS5ldmVudF9jYWxsYmFjayA9IGl3bGFnbl9tYWNfZXZlbnRfY2FsbGJhY2ssCiAJLnNldF90aW0gPSBpd2xhZ25fbWFjX3NldF90aW0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9tYWluLmMKaW5kZXggYzRkNmRkNy4uMjM0ZTMwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL21haW4uYwpAQCAtMTU0OSw3ICsxNTQ5LDcgQEAKIAkJCQkgICAgICB0YWJsZS5ibGluazEsIHRhYmxlLmJsaW5rMiwgdGFibGUuaWxpbmsxLAogCQkJCSAgICAgIHRhYmxlLmlsaW5rMiwgdGFibGUuYmNvbl90aW1lLCB0YWJsZS5ncDEsCiAJCQkJICAgICAgdGFibGUuZ3AyLCB0YWJsZS5ncDMsIHRhYmxlLnVjb2RlX3ZlciwKLQkJCQkgICAgICB0YWJsZS5od192ZXIsIHRhYmxlLmJyZF92ZXIpOworCQkJCSAgICAgIHRhYmxlLmh3X3ZlciwgMCwgdGFibGUuYnJkX3Zlcik7CiAJSVdMX0VSUihwcml2LCAiMHglMDhYIHwgJS0yOHNcbiIsIHRhYmxlLmVycm9yX2lkLAogCQlkZXNjX2xvb2t1cCh0YWJsZS5lcnJvcl9pZCkpOwogCUlXTF9FUlIocHJpdiwgIjB4JTA4WCB8IHVQY1xuIiwgdGFibGUucGMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vcnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3JzLmMKaW5kZXggMzJiNzhhNi4uM2JkN2M4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vcnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS9ycy5jCkBAIC0zMTUzLDEyICszMTUzLDEzIEBACiAJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgImxxIHR5cGUgJXNcbiIsCiAJICAgKGlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpKSA/ICJsZWdhY3kiIDogIkhUIik7CiAJaWYgKGlzX0h0KHRibC0+bHFfdHlwZSkpIHsKLQkJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgIiAlcyIsCisJCWRlc2MgKz0gc3ByaW50ZihidWZmICsgZGVzYywgIiAlcyIsCiAJCSAgIChpc19zaXNvKHRibC0+bHFfdHlwZSkpID8gIlNJU08iIDoKIAkJICAgKChpc19taW1vMih0YmwtPmxxX3R5cGUpKSA/ICJNSU1PMiIgOiAiTUlNTzMiKSk7Ci0JCSAgIGRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICIgJXMiLAorCQlkZXNjICs9IHNwcmludGYoYnVmZiArIGRlc2MsICIgJXMiLAogCQkgICAodGJsLT5pc19odDQwKSA/ICI0ME1IeiIgOiAiMjBNSHoiKTsKLQkJICAgZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgIiAlcyAlcyAlc1xuIiwgKHRibC0+aXNfU0dJKSA/ICJTR0kiIDogIiIsCisJCWRlc2MgKz0gc3ByaW50ZihidWZmICsgZGVzYywgIiAlcyAlcyAlc1xuIiwKKwkJICAgKHRibC0+aXNfU0dJKSA/ICJTR0kiIDogIiIsCiAJCSAgIChscV9zdGEtPmlzX2dyZWVuKSA/ICJHRiBlbmFibGVkIiA6ICIiLAogCQkgICAobHFfc3RhLT5pc19hZ2cpID8gIkFHRyBvbiIgOiAiIik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3R4LmMKaW5kZXggMWU0MGExMi4uMjc1ZGYxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS90eC5jCkBAIC0xODksOSArMTg5LDkgQEAKIAkJcmF0ZV9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOwogCiAJLyogU2V0IHVwIGFudGVubmFzICovCi0JIGlmIChwcml2LT5saWItPmJ0X3BhcmFtcyAmJgotCSAgICAgcHJpdi0+bGliLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QgJiYKLQkgICAgIHByaXYtPmJ0X2Z1bGxfY29uY3VycmVudCkgeworCWlmIChwcml2LT5saWItPmJ0X3BhcmFtcyAmJgorCSAgICBwcml2LT5saWItPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgorCSAgICBwcml2LT5idF9mdWxsX2NvbmN1cnJlbnQpIHsKIAkJLyogb3BlcmF0ZWQgYXMgMXgxIGluIGZ1bGwgY29uY3VycmVuY3kgbW9kZSAqLwogCQlwcml2LT5tZ210X3R4X2FudCA9IGl3bF90b2dnbGVfdHhfYW50KHByaXYsIHByaXYtPm1nbXRfdHhfYW50LAogCQkJCWZpcnN0X2FudGVubmEocHJpdi0+bnZtX2RhdGEtPnZhbGlkX3R4X2FudCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vdWNvZGUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvZHZtL3Vjb2RlLmMKaW5kZXggNGRiZWY3ZS4uNTI0NGU0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9kdm0vdWNvZGUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2R2bS91Y29kZS5jCkBAIC00MTgsOSArNDE4LDYgQEAKIAlpZiAoIXByaXYtPmZ3LT5pbWdbSVdMX1VDT0RFX0lOSVRdLnNlY1swXS5sZW4pCiAJCXJldHVybiAwOwogCi0JaWYgKHByaXYtPmluaXRfdWNvZGVfcnVuKQotCQlyZXR1cm4gMDsKLQogCWl3bF9pbml0X25vdGlmaWNhdGlvbl93YWl0KCZwcml2LT5ub3RpZl93YWl0LCAmY2FsaWJfd2FpdCwKIAkJCQkgICBjYWxpYl9jb21wbGV0ZSwgQVJSQVlfU0laRShjYWxpYl9jb21wbGV0ZSksCiAJCQkJICAgaXdsYWduX3dhaXRfY2FsaWIsIHByaXYpOwpAQCAtNDQwLDggKzQzNyw2IEBACiAJICovCiAJcmV0ID0gaXdsX3dhaXRfbm90aWZpY2F0aW9uKCZwcml2LT5ub3RpZl93YWl0LCAmY2FsaWJfd2FpdCwKIAkJCQkJVUNPREVfQ0FMSUJfVElNRU9VVCk7Ci0JaWYgKCFyZXQpCi0JCXByaXYtPmluaXRfdWNvZGVfcnVuID0gdHJ1ZTsKIAogCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMKaW5kZXggYzM4MTdmYS4uMDZmNmNjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTEwMDAuYwpAQCAtOTUsNyArOTUsOCBAQAogCS5udm1fY2FsaWJfdmVyID0gRUVQUk9NXzEwMDBfVFhfUE9XRVJfVkVSU0lPTiwJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2wxMDAwX2Jhc2VfcGFyYW1zLAkJCVwKIAkuZWVwcm9tX3BhcmFtcyA9ICZpd2wxMDAwX2VlcHJvbV9wYXJhbXMsCQlcCi0JLmxlZF9tb2RlID0gSVdMX0xFRF9CTElOSworCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCQkJCVwKKwkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEsKIAogY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsMTAwMF9iZ25fY2ZnID0gewogCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFdpcmVsZXNzLU4gMTAwMCBCR04iLApAQCAtMTIxLDcgKzEyMiw4IEBACiAJLmJhc2VfcGFyYW1zID0gJml3bDEwMDBfYmFzZV9wYXJhbXMsCQkJXAogCS5lZXByb21fcGFyYW1zID0gJml3bDEwMDBfZWVwcm9tX3BhcmFtcywJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX1JGX1NUQVRFLAkJCQlcCi0JLnJ4X3dpdGhfc2lzb19kaXZlcnNpdHkgPSB0cnVlCisJLnJ4X3dpdGhfc2lzb19kaXZlcnNpdHkgPSB0cnVlLAkJCQlcCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLCiAKIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDEwMF9iZ25fY2ZnID0gewogCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFdpcmVsZXNzLU4gMTAwIEJHTiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMKaW5kZXggMjFlNWQwOC4uODkwYjk1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMjAwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTIwMDAuYwpAQCAtMTIzLDcgKzEyMyw5IEBACiAJLm52bV9jYWxpYl92ZXIgPSBFRVBST01fMjAwMF9UWF9QT1dFUl9WRVJTSU9OLAkJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2wyMDAwX2Jhc2VfcGFyYW1zLAkJCVwKIAkuZWVwcm9tX3BhcmFtcyA9ICZpd2wyMHgwX2VlcHJvbV9wYXJhbXMsCQlcCi0JLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURQorCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKKwkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEsKKwogCiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2wyMDAwXzJiZ25fY2ZnID0gewogCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFdpcmVsZXNzLU4gMjIwMCBCR04iLApAQCAtMTQ5LDcgKzE1MSw4IEBACiAJLm52bV9jYWxpYl92ZXIgPSBFRVBST01fMjAwMF9UWF9QT1dFUl9WRVJTSU9OLAlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDIwMzBfYmFzZV9wYXJhbXMsCQkJXAogCS5lZXByb21fcGFyYW1zID0gJml3bDIweDBfZWVwcm9tX3BhcmFtcywJCVwKLQkubGVkX21vZGUgPSBJV0xfTEVEX1JGX1NUQVRFCisJLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURSwJCQkJXAorCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SwogCiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2wyMDMwXzJiZ25fY2ZnID0gewogCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFdpcmVsZXNzLU4gMjIzMCBCR04iLApAQCAtMTcwLDcgKzE3Myw4IEBACiAJLmJhc2VfcGFyYW1zID0gJml3bDIwMDBfYmFzZV9wYXJhbXMsCQkJXAogCS5lZXByb21fcGFyYW1zID0gJml3bDIweDBfZWVwcm9tX3BhcmFtcywJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX1JGX1NUQVRFLAkJCQlcCi0JLnJ4X3dpdGhfc2lzb19kaXZlcnNpdHkgPSB0cnVlCisJLnJ4X3dpdGhfc2lzb19kaXZlcnNpdHkgPSB0cnVlLAkJCQlcCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLCiAKIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDEwNV9iZ25fY2ZnID0gewogCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFdpcmVsZXNzLU4gMTA1IEJHTiIsCkBAIC0xOTcsNyArMjAxLDggQEAKIAkuYmFzZV9wYXJhbXMgPSAmaXdsMjAzMF9iYXNlX3BhcmFtcywJCQlcCiAJLmVlcHJvbV9wYXJhbXMgPSAmaXdsMjB4MF9lZXByb21fcGFyYW1zLAkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKLQkucnhfd2l0aF9zaXNvX2RpdmVyc2l0eSA9IHRydWUKKwkucnhfd2l0aF9zaXNvX2RpdmVyc2l0eSA9IHRydWUsCQkJCVwKKwkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEsKIAogY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsMTM1X2Jnbl9jZmcgPSB7CiAJLm5hbWUgPSAiSW50ZWwoUikgQ2VudHJpbm8oUikgV2lyZWxlc3MtTiAxMzUgQkdOIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYwppbmRleCAzMzJiYmVkLi43MjQxOTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCkBAIC05Myw3ICs5Myw4IEBACiAJLm52bV9jYWxpYl92ZXIgPSBFRVBST01fNTAwMF9UWF9QT1dFUl9WRVJTSU9OLAlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDUwMDBfYmFzZV9wYXJhbXMsCQkJXAogCS5lZXByb21fcGFyYW1zID0gJml3bDUwMDBfZWVwcm9tX3BhcmFtcywJCVwKLQkubGVkX21vZGUgPSBJV0xfTEVEX0JMSU5LCisJLmxlZF9tb2RlID0gSVdMX0xFRF9CTElOSywJCQkJXAorCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SwogCiBjb25zdCBzdHJ1Y3QgaXdsX2NmZyBpd2w1MzAwX2Fnbl9jZmcgPSB7CiAJLm5hbWUgPSAiSW50ZWwoUikgVWx0aW1hdGUgTiBXaUZpIExpbmsgNTMwMCBBR04iLApAQCAtMTU4LDcgKzE1OSw4IEBACiAJLmJhc2VfcGFyYW1zID0gJml3bDUwMDBfYmFzZV9wYXJhbXMsCQkJXAogCS5lZXByb21fcGFyYW1zID0gJml3bDUwMDBfZWVwcm9tX3BhcmFtcywJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX0JMSU5LLAkJCQlcCi0JLmludGVybmFsX3dpbWF4X2NvZXggPSB0cnVlCisJLmludGVybmFsX3dpbWF4X2NvZXggPSB0cnVlLAkJCQlcCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLCiAKIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDUxNTBfYWduX2NmZyA9IHsKIAkubmFtZSA9ICJJbnRlbChSKSBXaU1BWC9XaUZpIExpbmsgNTE1MCBBR04iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jCmluZGV4IDhmMmMzYzguLjIxYjI2MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMKQEAgLTE0NSw3ICsxNDUsOCBAQAogCS5udm1fY2FsaWJfdmVyID0gRUVQUk9NXzYwMDVfVFhfUE9XRVJfVkVSU0lPTiwJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2w2MDAwX2cyX2Jhc2VfcGFyYW1zLAkJCVwKIAkuZWVwcm9tX3BhcmFtcyA9ICZpd2w2MDAwX2VlcHJvbV9wYXJhbXMsCQlcCi0JLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURQorCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKKwkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEsKIAogY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNjAwNV8yYWduX2NmZyA9IHsKIAkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBBZHZhbmNlZC1OIDYyMDUgQUdOIiwKQEAgLTE5OSw3ICsyMDAsOCBAQAogCS5udm1fY2FsaWJfdmVyID0gRUVQUk9NXzYwMzBfVFhfUE9XRVJfVkVSU0lPTiwJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2w2MDAwX2cyX2Jhc2VfcGFyYW1zLAkJCVwKIAkuZWVwcm9tX3BhcmFtcyA9ICZpd2w2MDAwX2VlcHJvbV9wYXJhbXMsCQlcCi0JLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURQorCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKKwkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEsKIAogY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNjAzMF8yYWduX2NmZyA9IHsKIAkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBBZHZhbmNlZC1OIDYyMzAgQUdOIiwKQEAgLTIzNSw3ICsyMzcsOCBAQAogCS5udm1fY2FsaWJfdmVyID0gRUVQUk9NXzYwMzBfVFhfUE9XRVJfVkVSU0lPTiwJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2w2MDAwX2cyX2Jhc2VfcGFyYW1zLAkJCVwKIAkuZWVwcm9tX3BhcmFtcyA9ICZpd2w2MDAwX2VlcHJvbV9wYXJhbXMsCQlcCi0JLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURQorCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKKwkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEsKIAogY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNjAzNV8yYWduX2NmZyA9IHsKIAkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBBZHZhbmNlZC1OIDYyMzUgQUdOIiwKQEAgLTI5MCw3ICsyOTMsOCBAQAogCS5udm1fY2FsaWJfdmVyID0gRUVQUk9NXzYwMDBfVFhfUE9XRVJfVkVSU0lPTiwJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2w2MDAwX2Jhc2VfcGFyYW1zLAkJCVwKIAkuZWVwcm9tX3BhcmFtcyA9ICZpd2w2MDAwX2VlcHJvbV9wYXJhbXMsCQlcCi0JLmxlZF9tb2RlID0gSVdMX0xFRF9CTElOSworCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCQkJCVwKKwkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEsKIAogY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNjAwMGlfMmFnbl9jZmcgPSB7CiAJLm5hbWUgPSAiSW50ZWwoUikgQ2VudHJpbm8oUikgQWR2YW5jZWQtTiA2MjAwIEFHTiIsCkBAIC0zMjIsNyArMzI2LDggQEAKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNjA1MF9iYXNlX3BhcmFtcywJCQlcCiAJLmVlcHJvbV9wYXJhbXMgPSAmaXdsNjAwMF9lZXByb21fcGFyYW1zLAkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCQkJCVwKLQkuaW50ZXJuYWxfd2ltYXhfY29leCA9IHRydWUKKwkuaW50ZXJuYWxfd2ltYXhfY29leCA9IHRydWUsCQkJCVwKKwkubWF4X2h0X2FtcGR1X2V4cG9uZW50ID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEsKIAogY29uc3Qgc3RydWN0IGl3bF9jZmcgaXdsNjA1MF8yYWduX2NmZyA9IHsKIAkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBBZHZhbmNlZC1OICsgV2lNQVggNjI1MCBBR04iLApAQCAtMzQ3LDcgKzM1Miw4IEBACiAJLmJhc2VfcGFyYW1zID0gJml3bDYwNTBfYmFzZV9wYXJhbXMsCQkJXAogCS5lZXByb21fcGFyYW1zID0gJml3bDYwMDBfZWVwcm9tX3BhcmFtcywJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX0JMSU5LLAkJCQlcCi0JLmludGVybmFsX3dpbWF4X2NvZXggPSB0cnVlCisJLmludGVybmFsX3dpbWF4X2NvZXggPSB0cnVlLAkJCQlcCisJLm1heF9odF9hbXBkdV9leHBvbmVudCA9IElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfNjRLCiAKIGNvbnN0IHN0cnVjdCBpd2xfY2ZnIGl3bDYxNTBfYmduX2NmZyA9IHsKIAkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBXaXJlbGVzcy1OICsgV2lNQVggNjE1MCBCR04iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNzAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNzAwMC5jCmluZGV4IDk3ZTM4ZDIuLjM2ZTc4NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTcwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC03MDAwLmMKQEAgLTY5LDE2ICs2OSwxNiBAQAogI2luY2x1ZGUgIml3bC1hZ24taHcuaCIKIAogLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgSVdMNzI2MF9VQ09ERV9BUElfTUFYCTEyCi0jZGVmaW5lIElXTDMxNjBfVUNPREVfQVBJX01BWAkxMgorI2RlZmluZSBJV0w3MjYwX1VDT0RFX0FQSV9NQVgJMTMKKyNkZWZpbmUgSVdMMzE2MF9VQ09ERV9BUElfTUFYCTEzCiAKIC8qIE9sZGVzdCB2ZXJzaW9uIHdlIHdvbid0IHdhcm4gYWJvdXQgKi8KLSNkZWZpbmUgSVdMNzI2MF9VQ09ERV9BUElfT0sJMTAKLSNkZWZpbmUgSVdMMzE2MF9VQ09ERV9BUElfT0sJMTAKKyNkZWZpbmUgSVdMNzI2MF9VQ09ERV9BUElfT0sJMTIKKyNkZWZpbmUgSVdMMzE2MF9VQ09ERV9BUElfT0sJMTIKIAogLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w3MjYwX1VDT0RFX0FQSV9NSU4JOQotI2RlZmluZSBJV0wzMTYwX1VDT0RFX0FQSV9NSU4JOQorI2RlZmluZSBJV0w3MjYwX1VDT0RFX0FQSV9NSU4JMTAKKyNkZWZpbmUgSVdMMzE2MF9VQ09ERV9BUElfTUlOCTEwCiAKIC8qIE5WTSB2ZXJzaW9ucyAqLwogI2RlZmluZSBJV0w3MjYwX05WTV9WRVJTSU9OCQkweDBhMWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTgwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTgwMDAuYwppbmRleCAyZjdmZTgxLi5jZTYzMjFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC04MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtODAwMC5jCkBAIC02OSwxMyArNjksMTMgQEAKICNpbmNsdWRlICJpd2wtYWduLWh3LmgiCiAKIC8qIEhpZ2hlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDgwMDBfVUNPREVfQVBJX01BWAkxMgorI2RlZmluZSBJV0w4MDAwX1VDT0RFX0FQSV9NQVgJMTMKIAogLyogT2xkZXN0IHZlcnNpb24gd2Ugd29uJ3Qgd2FybiBhYm91dCAqLwotI2RlZmluZSBJV0w4MDAwX1VDT0RFX0FQSV9PSwkxMAorI2RlZmluZSBJV0w4MDAwX1VDT0RFX0FQSV9PSwkxMgogCiAvKiBMb3dlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDgwMDBfVUNPREVfQVBJX01JTgk5CisjZGVmaW5lIElXTDgwMDBfVUNPREVfQVBJX01JTgkxMAogCiAvKiBOVk0gdmVyc2lvbnMgKi8KICNkZWZpbmUgSVdMODAwMF9OVk1fVkVSU0lPTgkJMHgwYTFkCkBAIC05NCw4ICs5NCw4IEBACiAJSVdMODAwMF9GV19QUkUgIi0iIF9fc3RyaW5naWZ5KGFwaSkgIi51Y29kZSIKIAogI2RlZmluZSBOVk1fSFdfU0VDVElPTl9OVU1fRkFNSUxZXzgwMDAJCTEwCi0jZGVmaW5lIERFRkFVTFRfTlZNX0ZJTEVfRkFNSUxZXzgwMDBBCQkiaXdsX252bV84MDAwLmJpbiIKLSNkZWZpbmUgREVGQVVMVF9OVk1fRklMRV9GQU1JTFlfODAwMAkJIml3bF9udm1fODAwMEIuYmluIgorI2RlZmluZSBERUZBVUxUX05WTV9GSUxFX0ZBTUlMWV84MDAwQgkJIm52bURhdGEtODAwMEIiCisjZGVmaW5lIERFRkFVTFRfTlZNX0ZJTEVfRkFNSUxZXzgwMDBDCQkibnZtRGF0YS04MDAwQyIKIAogLyogTWF4IFNESU8gUlggYWdncmVnYXRpb24gc2l6ZSBvZiB0aGUgQUREQkEgcmVxdWVzdC9yZXNwb25zZSAqLwogI2RlZmluZSBNQVhfUlhfQUdHX1NJWkVfODI2MF9TRElPCTI4CkBAIC0xNzcsOCArMTc3LDggQEAKIAkuaHRfcGFyYW1zID0gJml3bDgwMDBfaHRfcGFyYW1zLAogCS5udm1fdmVyID0gSVdMODAwMF9OVk1fVkVSU0lPTiwKIAkubnZtX2NhbGliX3ZlciA9IElXTDgwMDBfVFhfUE9XRVJfVkVSU0lPTiwKLQkuZGVmYXVsdF9udm1fZmlsZSA9IERFRkFVTFRfTlZNX0ZJTEVfRkFNSUxZXzgwMDAsCi0JLmRlZmF1bHRfbnZtX2ZpbGVfODAwMEEgPSBERUZBVUxUX05WTV9GSUxFX0ZBTUlMWV84MDAwQSwKKwkuZGVmYXVsdF9udm1fZmlsZV9CX3N0ZXAgPSBERUZBVUxUX05WTV9GSUxFX0ZBTUlMWV84MDAwQiwKKwkuZGVmYXVsdF9udm1fZmlsZV9DX3N0ZXAgPSBERUZBVUxUX05WTV9GSUxFX0ZBTUlMWV84MDAwQywKIAkubWF4X3J4X2FnZ19zaXplID0gTUFYX1JYX0FHR19TSVpFXzgyNjBfU0RJTywKIAkuZGlzYWJsZV9kdW1teV9ub3RpZmljYXRpb24gPSB0cnVlLAogCS5tYXhfaHRfYW1wZHVfZXhwb25lbnQgID0gTUFYX0hUX0FNUERVX0VYUE9ORU5UXzgyNjBfU0RJTywKQEAgLTE5Miw4ICsxOTIsOCBAQAogCS5odF9wYXJhbXMgPSAmaXdsODAwMF9odF9wYXJhbXMsCiAJLm52bV92ZXIgPSBJV0w4MDAwX05WTV9WRVJTSU9OLAogCS5udm1fY2FsaWJfdmVyID0gSVdMODAwMF9UWF9QT1dFUl9WRVJTSU9OLAotCS5kZWZhdWx0X252bV9maWxlID0gREVGQVVMVF9OVk1fRklMRV9GQU1JTFlfODAwMCwKLQkuZGVmYXVsdF9udm1fZmlsZV84MDAwQSA9IERFRkFVTFRfTlZNX0ZJTEVfRkFNSUxZXzgwMDBBLAorCS5kZWZhdWx0X252bV9maWxlX0Jfc3RlcCA9IERFRkFVTFRfTlZNX0ZJTEVfRkFNSUxZXzgwMDBCLAorCS5kZWZhdWx0X252bV9maWxlX0Nfc3RlcCA9IERFRkFVTFRfTlZNX0ZJTEVfRkFNSUxZXzgwMDBDLAogCS5tYXhfcnhfYWdnX3NpemUgPSBNQVhfUlhfQUdHX1NJWkVfODI2MF9TRElPLAogCS5idF9zaGFyZWRfc2luZ2xlX2FudCA9IHRydWUsCiAJLmRpc2FibGVfZHVtbXlfbm90aWZpY2F0aW9uID0gdHJ1ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbmZpZy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29uZmlnLmgKaW5kZXggNGIxOTBkOS4uM2YzM2Y3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29uZmlnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29uZmlnLmgKQEAgLTkyLDkgKzkyLDkgQEAKIHsKIAkvKiByZXR1cm4gMSBvbmx5IGZvciBmYW1pbHkgODAwMCBCMCAqLwogCWlmICgoZmFtaWx5ID09IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDApICYmIChod19yZXYgJiAweEMpKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIC8qCkBAIC0yMjgsNyArMjI4LDcgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgaXdsX2NmZwotICogQG5hbWU6IE9mZmljYWwgbmFtZSBvZiB0aGUgZGV2aWNlCisgKiBAbmFtZTogT2ZmaWNpYWwgbmFtZSBvZiB0aGUgZGV2aWNlCiAgKiBAZndfbmFtZV9wcmU6IEZpcm13YXJlIGZpbGVuYW1lIHByZWZpeC4gVGhlIGFwaSB2ZXJzaW9uIGFuZCBleHRlbnNpb24KICAqCSgudWNvZGUpIHdpbGwgYmUgYWRkZWQgdG8gZmlsZW5hbWUgYmVmb3JlIGxvYWRpbmcgZnJvbSBkaXNrLiBUaGUKICAqCWZpbGVuYW1lIGlzIGNvbnN0cnVjdGVkIGFzIGZ3X25hbWVfcHJlPGFwaT4udWNvZGUuCkBAIC0zMDMsOCArMzAzLDggQEAKIAlib29sIGxwX3h0YWxfd29ya2Fyb3VuZDsKIAljb25zdCBzdHJ1Y3QgaXdsX3B3cl90eF9iYWNrb2ZmICpwd3JfdHhfYmFja29mZnM7CiAJYm9vbCBub19wb3dlcl91cF9uaWNfaW5faW5pdDsKLQljb25zdCBjaGFyICpkZWZhdWx0X252bV9maWxlOwotCWNvbnN0IGNoYXIgKmRlZmF1bHRfbnZtX2ZpbGVfODAwMEE7CisJY29uc3QgY2hhciAqZGVmYXVsdF9udm1fZmlsZV9CX3N0ZXA7CisJY29uc3QgY2hhciAqZGVmYXVsdF9udm1fZmlsZV9DX3N0ZXA7CiAJdW5zaWduZWQgaW50IG1heF9yeF9hZ2dfc2l6ZTsKIAlib29sIGRpc2FibGVfZHVtbXlfbm90aWZpY2F0aW9uOwogCXVuc2lnbmVkIGludCBtYXhfdHhfYWdnX3NpemU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWcuaAppbmRleCA2ODQyNTQ1Li45YmIzNmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnLmgKQEAgLTE1Nyw2ICsxNTcsNyBAQAogLyogMHgwMDAwRjAwMCAtIDB4MDAwMDEwMDAgKi8KICNkZWZpbmUgSVdMX0RMX0FTU09DCQkweDAwMDAxMDAwCiAjZGVmaW5lIElXTF9ETF9EUk9QCQkweDAwMDAyMDAwCisjZGVmaW5lIElXTF9ETF9MQVIJCTB4MDAwMDQwMDAKICNkZWZpbmUgSVdMX0RMX0NPRVgJCTB4MDAwMDgwMDAKIC8qIDB4MDAwRjAwMDAgLSAweDAwMDEwMDAwICovCiAjZGVmaW5lIElXTF9ETF9GVwkJMHgwMDAxMDAwMApAQCAtMjE5LDUgKzIyMCw2IEBACiAjZGVmaW5lIElXTF9ERUJVR19QT1dFUihwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1BPV0VSLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfMTFIKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfMTFILCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfUlBNKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfUlBNLCBmLCAjIyBhKQorI2RlZmluZSBJV0xfREVCVUdfTEFSKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfTEFSLCBmLCAjIyBhKQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldnRyYWNlLWRhdGEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldnRyYWNlLWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGU2NjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UtZGF0YS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoX19JV0xXSUZJX0RFVklDRV9UUkFDRV9EQVRBKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfX0lXTFdJRklfREVWSUNFX1RSQUNFX0RBVEEKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaV9kYXRhCisKK1RSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X3R4X2RhdGEsCisJVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAorCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX2xlbiksCisJVFBfQVJHUyhkZXYsIHNrYiwgZGF0YSwgZGF0YV9sZW4pLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCURFVl9FTlRSWQorCisJCV9fZHluYW1pY19hcnJheSh1OCwgZGF0YSwgaXdsX3RyYWNlX2RhdGEoc2tiKSA/IGRhdGFfbGVuIDogMCkKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlERVZfQVNTSUdOOworCQlpZiAoaXdsX3RyYWNlX2RhdGEoc2tiKSkKKwkJCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KGRhdGEpLCBkYXRhLCBkYXRhX2xlbik7CisJKSwKKwlUUF9wcmludGsoIlslc10gVFggZnJhbWUgZGF0YSIsIF9fZ2V0X3N0cihkZXYpKQorKTsKKworVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfcnhfZGF0YSwKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSBjb25zdCBzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKKwkJIHZvaWQgKnJ4YnVmLCBzaXplX3QgbGVuKSwKKwlUUF9BUkdTKGRldiwgdHJhbnMsIHJ4YnVmLCBsZW4pLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCURFVl9FTlRSWQorCisJCV9fZHluYW1pY19hcnJheSh1OCwgZGF0YSwKKwkJCQlsZW4gLSBpd2xfcnhfdHJhY2VfbGVuKHRyYW5zLCByeGJ1ZiwgbGVuKSkKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlzaXplX3Qgb2ZmcyA9IGl3bF9yeF90cmFjZV9sZW4odHJhbnMsIHJ4YnVmLCBsZW4pOworCQlERVZfQVNTSUdOOworCQlpZiAob2ZmcyA8IGxlbikKKwkJCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KGRhdGEpLAorCQkJICAgICAgICgodTggKilyeGJ1ZikgKyBvZmZzLCBsZW4gLSBvZmZzKTsKKwkpLAorCVRQX3ByaW50aygiWyVzXSBSWCBmcmFtZSBkYXRhIiwgX19nZXRfc3RyKGRldikpCispOworI2VuZGlmIC8qIF9fSVdMV0lGSV9ERVZJQ0VfVFJBQ0VfREFUQSAqLworCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9GSUxFCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBpd2wtZGV2dHJhY2UtZGF0YQorI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UtaW8uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldnRyYWNlLWlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYyYzU0NDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS1pby5oCkBAIC0wLDAgKzEsMTU1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDkgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKF9fSVdMV0lGSV9ERVZJQ0VfVFJBQ0VfSU8pIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9fSVdMV0lGSV9ERVZJQ0VfVFJBQ0VfSU8KKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaV9pbworCitUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9pb3JlYWQzMiwKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKKwlUUF9BUkdTKGRldiwgb2ZmcywgdmFsKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlERVZfRU5UUlkKKwkJX19maWVsZCh1MzIsIG9mZnMpCisJCV9fZmllbGQodTMyLCB2YWwpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJREVWX0FTU0lHTjsKKwkJX19lbnRyeS0+b2ZmcyA9IG9mZnM7CisJCV9fZW50cnktPnZhbCA9IHZhbDsKKwkpLAorCVRQX3ByaW50aygiWyVzXSByZWFkIGlvWyUjeF0gPSAlI3giLAorCQkgIF9fZ2V0X3N0cihkZXYpLCBfX2VudHJ5LT5vZmZzLCBfX2VudHJ5LT52YWwpCispOworCitUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9pb3dyaXRlOCwKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZmZzLCB1OCB2YWwpLAorCVRQX0FSR1MoZGV2LCBvZmZzLCB2YWwpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCURFVl9FTlRSWQorCQlfX2ZpZWxkKHUzMiwgb2ZmcykKKwkJX19maWVsZCh1OCwgdmFsKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCURFVl9BU1NJR047CisJCV9fZW50cnktPm9mZnMgPSBvZmZzOworCQlfX2VudHJ5LT52YWwgPSB2YWw7CisJKSwKKwlUUF9wcmludGsoIlslc10gd3JpdGUgaW9bJSN4XSA9ICUjeCkiLAorCQkgIF9fZ2V0X3N0cihkZXYpLCBfX2VudHJ5LT5vZmZzLCBfX2VudHJ5LT52YWwpCispOworCitUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9pb3dyaXRlMzIsCisJVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZmcywgdTMyIHZhbCksCisJVFBfQVJHUyhkZXYsIG9mZnMsIHZhbCksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJREVWX0VOVFJZCisJCV9fZmllbGQodTMyLCBvZmZzKQorCQlfX2ZpZWxkKHUzMiwgdmFsKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCURFVl9BU1NJR047CisJCV9fZW50cnktPm9mZnMgPSBvZmZzOworCQlfX2VudHJ5LT52YWwgPSB2YWw7CisJKSwKKwlUUF9wcmludGsoIlslc10gd3JpdGUgaW9bJSN4XSA9ICUjeCkiLAorCQkgIF9fZ2V0X3N0cihkZXYpLCBfX2VudHJ5LT5vZmZzLCBfX2VudHJ5LT52YWwpCispOworCitUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9pb3dyaXRlX3BycGgzMiwKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKKwlUUF9BUkdTKGRldiwgb2ZmcywgdmFsKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlERVZfRU5UUlkKKwkJX19maWVsZCh1MzIsIG9mZnMpCisJCV9fZmllbGQodTMyLCB2YWwpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJREVWX0FTU0lHTjsKKwkJX19lbnRyeS0+b2ZmcyA9IG9mZnM7CisJCV9fZW50cnktPnZhbCA9IHZhbDsKKwkpLAorCVRQX3ByaW50aygiWyVzXSB3cml0ZSBQUlBIWyUjeF0gPSAlI3gpIiwKKwkJICBfX2dldF9zdHIoZGV2KSwgX19lbnRyeS0+b2ZmcywgX19lbnRyeS0+dmFsKQorKTsKKworVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfaW9yZWFkX3BycGgzMiwKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKKwlUUF9BUkdTKGRldiwgb2ZmcywgdmFsKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlERVZfRU5UUlkKKwkJX19maWVsZCh1MzIsIG9mZnMpCisJCV9fZmllbGQodTMyLCB2YWwpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJREVWX0FTU0lHTjsKKwkJX19lbnRyeS0+b2ZmcyA9IG9mZnM7CisJCV9fZW50cnktPnZhbCA9IHZhbDsKKwkpLAorCVRQX3ByaW50aygiWyVzXSByZWFkIFBSUEhbJSN4XSA9ICUjeCIsCisJCSAgX19nZXRfc3RyKGRldiksIF9fZW50cnktPm9mZnMsIF9fZW50cnktPnZhbCkKKyk7CisKK1RSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X2lycSwKKwlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpLAorCVRQX0FSR1MoZGV2KSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlERVZfRU5UUlkKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlERVZfQVNTSUdOOworCSksCisJLyogVFBfcHJpbnRrKCIiKSBkb2Vzbid0IGNvbXBpbGUgKi8KKwlUUF9wcmludGsoIiVkIiwgMCkKKyk7CisKK1RSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X2ljdF9yZWFkLAorCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGluZGV4LCB1MzIgdmFsdWUpLAorCVRQX0FSR1MoZGV2LCBpbmRleCwgdmFsdWUpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCURFVl9FTlRSWQorCQlfX2ZpZWxkKHUzMiwgaW5kZXgpCisJCV9fZmllbGQodTMyLCB2YWx1ZSkKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlERVZfQVNTSUdOOworCQlfX2VudHJ5LT5pbmRleCA9IGluZGV4OworCQlfX2VudHJ5LT52YWx1ZSA9IHZhbHVlOworCSksCisJVFBfcHJpbnRrKCJbJXNdIHJlYWQgaWN0WyVkXSA9ICUjLjh4IiwKKwkJICBfX2dldF9zdHIoZGV2KSwgX19lbnRyeS0+aW5kZXgsIF9fZW50cnktPnZhbHVlKQorKTsKKyNlbmRpZiAvKiBfX0lXTFdJRklfREVWSUNFX1RSQUNFX0lPICovCisKKyN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KKyN1bmRlZiBUUkFDRV9JTkNMVURFX0ZJTEUKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIGl3bC1kZXZ0cmFjZS1pbworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UtaXdsd2lmaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UtaXdsd2lmaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyM2I4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS1pd2x3aWZpLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOSAtIDIwMTQgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgIWRlZmluZWQoX19JV0xXSUZJX0RFVklDRV9UUkFDRV9JV0xXSUZJKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfX0lXTFdJRklfREVWSUNFX1RSQUNFX0lXTFdJRkkKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaQorCitUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9oY21kLAorCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCwgdTE2IHRvdGFsX3NpemUsCisJCSBzdHJ1Y3QgaXdsX2NtZF9oZWFkZXIgKmhkciksCisJVFBfQVJHUyhkZXYsIGNtZCwgdG90YWxfc2l6ZSwgaGRyKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlERVZfRU5UUlkKKwkJX19keW5hbWljX2FycmF5KHU4LCBoY21kLCB0b3RhbF9zaXplKQorCQlfX2ZpZWxkKHUzMiwgZmxhZ3MpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJaW50IGksIG9mZnNldCA9IHNpemVvZigqaGRyKTsKKworCQlERVZfQVNTSUdOOworCQlfX2VudHJ5LT5mbGFncyA9IGNtZC0+ZmxhZ3M7CisJCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KGhjbWQpLCBoZHIsIHNpemVvZigqaGRyKSk7CisKKwkJZm9yIChpID0gMDsgaSA8IElXTF9NQVhfQ01EX1RCU19QRVJfVEZEOyBpKyspIHsKKwkJCWlmICghY21kLT5sZW5baV0pCisJCQkJY29udGludWU7CisJCQltZW1jcHkoKHU4ICopX19nZXRfZHluYW1pY19hcnJheShoY21kKSArIG9mZnNldCwKKwkJCSAgICAgICBjbWQtPmRhdGFbaV0sIGNtZC0+bGVuW2ldKTsKKwkJCW9mZnNldCArPSBjbWQtPmxlbltpXTsKKwkJfQorCSksCisJVFBfcHJpbnRrKCJbJXNdIGhjbWQgJSMuMnggKCVzc3luYykiLAorCQkgIF9fZ2V0X3N0cihkZXYpLCAoKHU4ICopX19nZXRfZHluYW1pY19hcnJheShoY21kKSlbMF0sCisJCSAgX19lbnRyeS0+ZmxhZ3MgJiBDTURfQVNZTkMgPyAiYSIgOiAiIikKKyk7CisKK1RSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X3J4LAorCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCSB2b2lkICpyeGJ1Ziwgc2l6ZV90IGxlbiksCisJVFBfQVJHUyhkZXYsIHRyYW5zLCByeGJ1ZiwgbGVuKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlERVZfRU5UUlkKKwkJX19keW5hbWljX2FycmF5KHU4LCByeGJ1ZiwgaXdsX3J4X3RyYWNlX2xlbih0cmFucywgcnhidWYsIGxlbikpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJREVWX0FTU0lHTjsKKwkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkocnhidWYpLCByeGJ1ZiwKKwkJICAgICAgIGl3bF9yeF90cmFjZV9sZW4odHJhbnMsIHJ4YnVmLCBsZW4pKTsKKwkpLAorCVRQX3ByaW50aygiWyVzXSBSWCBjbWQgJSMuMngiLAorCQkgIF9fZ2V0X3N0cihkZXYpLCAoKHU4ICopX19nZXRfZHluYW1pY19hcnJheShyeGJ1ZikpWzRdKQorKTsKKworVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfdHgsCisJVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgdm9pZCAqdGZkLCBzaXplX3QgdGZkbGVuLAorCQkgdm9pZCAqYnVmMCwgc2l6ZV90IGJ1ZjBfbGVuLAorCQkgdm9pZCAqYnVmMSwgc2l6ZV90IGJ1ZjFfbGVuKSwKKwlUUF9BUkdTKGRldiwgc2tiLCB0ZmQsIHRmZGxlbiwgYnVmMCwgYnVmMF9sZW4sIGJ1ZjEsIGJ1ZjFfbGVuKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlERVZfRU5UUlkKKworCQlfX2ZpZWxkKHNpemVfdCwgZnJhbWVsZW4pCisJCV9fZHluYW1pY19hcnJheSh1OCwgdGZkLCB0ZmRsZW4pCisKKwkJLyoKKwkJICogRG8gbm90IGluc2VydCBiZXR3ZWVuIG9yIGJlbG93IHRoZXNlIGl0ZW1zLAorCQkgKiB3ZSB3YW50IHRvIGtlZXAgdGhlIGZyYW1lIHRvZ2V0aGVyIChleGNlcHQKKwkJICogZm9yIHRoZSBwb3NzaWJsZSBwYWRkaW5nKS4KKwkJICovCisJCV9fZHluYW1pY19hcnJheSh1OCwgYnVmMCwgYnVmMF9sZW4pCisJCV9fZHluYW1pY19hcnJheSh1OCwgYnVmMSwgaXdsX3RyYWNlX2RhdGEoc2tiKSA/IDAgOiBidWYxX2xlbikKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlERVZfQVNTSUdOOworCQlfX2VudHJ5LT5mcmFtZWxlbiA9IGJ1ZjBfbGVuICsgYnVmMV9sZW47CisJCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KHRmZCksIHRmZCwgdGZkbGVuKTsKKwkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkoYnVmMCksIGJ1ZjAsIGJ1ZjBfbGVuKTsKKwkJaWYgKCFpd2xfdHJhY2VfZGF0YShza2IpKQorCQkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkoYnVmMSksIGJ1ZjEsIGJ1ZjFfbGVuKTsKKwkpLAorCVRQX3ByaW50aygiWyVzXSBUWCAlLjJ4ICglenUgYnl0ZXMpIiwKKwkJICBfX2dldF9zdHIoZGV2KSwgKCh1OCAqKV9fZ2V0X2R5bmFtaWNfYXJyYXkoYnVmMCkpWzBdLAorCQkgIF9fZW50cnktPmZyYW1lbGVuKQorKTsKKworVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfdWNvZGVfZXJyb3IsCisJVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCB1MzIgZGVzYywgdTMyIHRzZl9sb3csCisJCSB1MzIgZGF0YTEsIHUzMiBkYXRhMiwgdTMyIGxpbmUsIHUzMiBibGluazEsCisJCSB1MzIgYmxpbmsyLCB1MzIgaWxpbmsxLCB1MzIgaWxpbmsyLCB1MzIgYmNvbl90aW1lLAorCQkgdTMyIGdwMSwgdTMyIGdwMiwgdTMyIGdwMywgdTMyIG1ham9yLCB1MzIgbWlub3IsIHUzMiBod192ZXIsCisJCSB1MzIgYnJkX3ZlciksCisJVFBfQVJHUyhkZXYsIGRlc2MsIHRzZl9sb3csIGRhdGExLCBkYXRhMiwgbGluZSwKKwkJYmxpbmsxLCBibGluazIsIGlsaW5rMSwgaWxpbmsyLCBiY29uX3RpbWUsIGdwMSwgZ3AyLAorCQlncDMsIG1ham9yLCBtaW5vciwgaHdfdmVyLCBicmRfdmVyKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlERVZfRU5UUlkKKwkJX19maWVsZCh1MzIsIGRlc2MpCisJCV9fZmllbGQodTMyLCB0c2ZfbG93KQorCQlfX2ZpZWxkKHUzMiwgZGF0YTEpCisJCV9fZmllbGQodTMyLCBkYXRhMikKKwkJX19maWVsZCh1MzIsIGxpbmUpCisJCV9fZmllbGQodTMyLCBibGluazEpCisJCV9fZmllbGQodTMyLCBibGluazIpCisJCV9fZmllbGQodTMyLCBpbGluazEpCisJCV9fZmllbGQodTMyLCBpbGluazIpCisJCV9fZmllbGQodTMyLCBiY29uX3RpbWUpCisJCV9fZmllbGQodTMyLCBncDEpCisJCV9fZmllbGQodTMyLCBncDIpCisJCV9fZmllbGQodTMyLCBncDMpCisJCV9fZmllbGQodTMyLCBtYWpvcikKKwkJX19maWVsZCh1MzIsIG1pbm9yKQorCQlfX2ZpZWxkKHUzMiwgaHdfdmVyKQorCQlfX2ZpZWxkKHUzMiwgYnJkX3ZlcikKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlERVZfQVNTSUdOOworCQlfX2VudHJ5LT5kZXNjID0gZGVzYzsKKwkJX19lbnRyeS0+dHNmX2xvdyA9IHRzZl9sb3c7CisJCV9fZW50cnktPmRhdGExID0gZGF0YTE7CisJCV9fZW50cnktPmRhdGEyID0gZGF0YTI7CisJCV9fZW50cnktPmxpbmUgPSBsaW5lOworCQlfX2VudHJ5LT5ibGluazEgPSBibGluazE7CisJCV9fZW50cnktPmJsaW5rMiA9IGJsaW5rMjsKKwkJX19lbnRyeS0+aWxpbmsxID0gaWxpbmsxOworCQlfX2VudHJ5LT5pbGluazIgPSBpbGluazI7CisJCV9fZW50cnktPmJjb25fdGltZSA9IGJjb25fdGltZTsKKwkJX19lbnRyeS0+Z3AxID0gZ3AxOworCQlfX2VudHJ5LT5ncDIgPSBncDI7CisJCV9fZW50cnktPmdwMyA9IGdwMzsKKwkJX19lbnRyeS0+bWFqb3IgPSBtYWpvcjsKKwkJX19lbnRyeS0+bWlub3IgPSBtaW5vcjsKKwkJX19lbnRyeS0+aHdfdmVyID0gaHdfdmVyOworCQlfX2VudHJ5LT5icmRfdmVyID0gYnJkX3ZlcjsKKwkpLAorCVRQX3ByaW50aygiWyVzXSAjJTAyZCAlMDEwdSBkYXRhIDB4JTA4WCAweCUwOFggbGluZSAldSwgIgorCQkgICJibGluayAweCUwNVggMHglMDVYIGlsaW5rIDB4JTA1WCAweCUwNVggIgorCQkgICJiY29uX3RtICUwMTB1IGdwIDB4JTA4WCAweCUwOFggMHglMDhYIG1ham9yIDB4JTA4WCAiCisJCSAgIm1pbm9yIDB4JTA4WCBodyAweCUwOFggYnJkIDB4JTA4WCIsCisJCSAgX19nZXRfc3RyKGRldiksIF9fZW50cnktPmRlc2MsIF9fZW50cnktPnRzZl9sb3csCisJCSAgX19lbnRyeS0+ZGF0YTEsCisJCSAgX19lbnRyeS0+ZGF0YTIsIF9fZW50cnktPmxpbmUsIF9fZW50cnktPmJsaW5rMSwKKwkJICBfX2VudHJ5LT5ibGluazIsIF9fZW50cnktPmlsaW5rMSwgX19lbnRyeS0+aWxpbmsyLAorCQkgIF9fZW50cnktPmJjb25fdGltZSwgX19lbnRyeS0+Z3AxLCBfX2VudHJ5LT5ncDIsCisJCSAgX19lbnRyeS0+Z3AzLCBfX2VudHJ5LT5tYWpvciwgX19lbnRyeS0+bWlub3IsCisJCSAgX19lbnRyeS0+aHdfdmVyLCBfX2VudHJ5LT5icmRfdmVyKQorKTsKKworVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfdWNvZGVfZXZlbnQsCisJVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCB1MzIgdGltZSwgdTMyIGRhdGEsIHUzMiBldiksCisJVFBfQVJHUyhkZXYsIHRpbWUsIGRhdGEsIGV2KSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlERVZfRU5UUlkKKworCQlfX2ZpZWxkKHUzMiwgdGltZSkKKwkJX19maWVsZCh1MzIsIGRhdGEpCisJCV9fZmllbGQodTMyLCBldikKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlERVZfQVNTSUdOOworCQlfX2VudHJ5LT50aW1lID0gdGltZTsKKwkJX19lbnRyeS0+ZGF0YSA9IGRhdGE7CisJCV9fZW50cnktPmV2ID0gZXY7CisJKSwKKwlUUF9wcmludGsoIlslc10gRVZUX0xPR1Q6JTAxMHU6MHglMDh4OiUwNHUiLAorCQkgIF9fZ2V0X3N0cihkZXYpLCBfX2VudHJ5LT50aW1lLCBfX2VudHJ5LT5kYXRhLCBfX2VudHJ5LT5ldikKKyk7CisjZW5kaWYgLyogX19JV0xXSUZJX0RFVklDRV9UUkFDRV9JV0xXSUZJICovCisKKyN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KKyN1bmRlZiBUUkFDRV9JTkNMVURFX0ZJTEUKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIGl3bC1kZXZ0cmFjZS1pd2x3aWZpCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS1tc2cuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldnRyYWNlLW1zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYjNjMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS1tc2cuaApAQCAtMCwwICsxLDk3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDkgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKF9fSVdMV0lGSV9ERVZJQ0VfVFJBQ0VfTVNHKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfX0lXTFdJRklfREVWSUNFX1RSQUNFX01TRworCisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBpd2x3aWZpX21zZworCisjZGVmaW5lIE1BWF9NU0dfTEVOCTExMAorCitERUNMQVJFX0VWRU5UX0NMQVNTKGl3bHdpZmlfbXNnX2V2ZW50LAorCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCisJVFBfQVJHUyh2YWYpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZHluYW1pY19hcnJheShjaGFyLCBtc2csIE1BWF9NU0dfTEVOKQorCSksCisJVFBfZmFzdF9hc3NpZ24oCisJCVdBUk5fT05fT05DRSh2c25wcmludGYoX19nZXRfZHluYW1pY19hcnJheShtc2cpLAorCQkJCSAgICAgICBNQVhfTVNHX0xFTiwgdmFmLT5mbXQsCisJCQkJICAgICAgICp2YWYtPnZhKSA+PSBNQVhfTVNHX0xFTik7CisJKSwKKwlUUF9wcmludGsoIiVzIiwgX19nZXRfc3RyKG1zZykpCispOworCitERUZJTkVfRVZFTlQoaXdsd2lmaV9tc2dfZXZlbnQsIGl3bHdpZmlfZXJyLAorCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCisJVFBfQVJHUyh2YWYpCispOworCitERUZJTkVfRVZFTlQoaXdsd2lmaV9tc2dfZXZlbnQsIGl3bHdpZmlfd2FybiwKKwlUUF9QUk9UTyhzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpLAorCVRQX0FSR1ModmFmKQorKTsKKworREVGSU5FX0VWRU5UKGl3bHdpZmlfbXNnX2V2ZW50LCBpd2x3aWZpX2luZm8sCisJVFBfUFJPVE8oc3RydWN0IHZhX2Zvcm1hdCAqdmFmKSwKKwlUUF9BUkdTKHZhZikKKyk7CisKK0RFRklORV9FVkVOVChpd2x3aWZpX21zZ19ldmVudCwgaXdsd2lmaV9jcml0LAorCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCisJVFBfQVJHUyh2YWYpCispOworCitUUkFDRV9FVkVOVChpd2x3aWZpX2RiZywKKwlUUF9QUk9UTyh1MzIgbGV2ZWwsIGJvb2wgaW5faW50ZXJydXB0LCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwkJIHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCisJVFBfQVJHUyhsZXZlbCwgaW5faW50ZXJydXB0LCBmdW5jdGlvbiwgdmFmKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHUzMiwgbGV2ZWwpCisJCV9fZmllbGQodTgsIGluX2ludGVycnVwdCkKKwkJX19zdHJpbmcoZnVuY3Rpb24sIGZ1bmN0aW9uKQorCQlfX2R5bmFtaWNfYXJyYXkoY2hhciwgbXNnLCBNQVhfTVNHX0xFTikKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5sZXZlbCA9IGxldmVsOworCQlfX2VudHJ5LT5pbl9pbnRlcnJ1cHQgPSBpbl9pbnRlcnJ1cHQ7CisJCV9fYXNzaWduX3N0cihmdW5jdGlvbiwgZnVuY3Rpb24pOworCQlXQVJOX09OX09OQ0UodnNucHJpbnRmKF9fZ2V0X2R5bmFtaWNfYXJyYXkobXNnKSwKKwkJCQkgICAgICAgTUFYX01TR19MRU4sIHZhZi0+Zm10LAorCQkJCSAgICAgICAqdmFmLT52YSkgPj0gTUFYX01TR19MRU4pOworCSksCisJVFBfcHJpbnRrKCIlcyIsIF9fZ2V0X3N0cihtc2cpKQorKTsKKyNlbmRpZiAvKiBfX0lXTFdJRklfREVWSUNFX1RSQUNFX01TRyAqLworCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9GSUxFCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBpd2wtZGV2dHJhY2UtbXNnCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS11Y29kZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UtdWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDgzOWZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UtdWNvZGUuaApAQCAtMCwwICsxLDgxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDkgLSAyMDE0IEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmICFkZWZpbmVkKF9fSVdMV0lGSV9ERVZJQ0VfVFJBQ0VfVUNPREUpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9fSVdMV0lGSV9ERVZJQ0VfVFJBQ0VfVUNPREUKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaV91Y29kZQorCitUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl91Y29kZV9jb250X2V2ZW50LAorCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHRpbWUsIHUzMiBkYXRhLCB1MzIgZXYpLAorCVRQX0FSR1MoZGV2LCB0aW1lLCBkYXRhLCBldiksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJREVWX0VOVFJZCisKKwkJX19maWVsZCh1MzIsIHRpbWUpCisJCV9fZmllbGQodTMyLCBkYXRhKQorCQlfX2ZpZWxkKHUzMiwgZXYpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJREVWX0FTU0lHTjsKKwkJX19lbnRyeS0+dGltZSA9IHRpbWU7CisJCV9fZW50cnktPmRhdGEgPSBkYXRhOworCQlfX2VudHJ5LT5ldiA9IGV2OworCSksCisJVFBfcHJpbnRrKCJbJXNdIEVWVF9MT0dUOiUwMTB1OjB4JTA4eDolMDR1IiwKKwkJICBfX2dldF9zdHIoZGV2KSwgX19lbnRyeS0+dGltZSwgX19lbnRyeS0+ZGF0YSwgX19lbnRyeS0+ZXYpCispOworCitUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl91Y29kZV93cmFwX2V2ZW50LAorCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHdyYXBzLCB1MzIgbl9lbnRyeSwgdTMyIHBfZW50cnkpLAorCVRQX0FSR1MoZGV2LCB3cmFwcywgbl9lbnRyeSwgcF9lbnRyeSksCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJREVWX0VOVFJZCisKKwkJX19maWVsZCh1MzIsIHdyYXBzKQorCQlfX2ZpZWxkKHUzMiwgbl9lbnRyeSkKKwkJX19maWVsZCh1MzIsIHBfZW50cnkpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJREVWX0FTU0lHTjsKKwkJX19lbnRyeS0+d3JhcHMgPSB3cmFwczsKKwkJX19lbnRyeS0+bl9lbnRyeSA9IG5fZW50cnk7CisJCV9fZW50cnktPnBfZW50cnkgPSBwX2VudHJ5OworCSksCisJVFBfcHJpbnRrKCJbJXNdIHdyYXBzPSMlMDJkIG49MHglWCBwPTB4JVgiLAorCQkgIF9fZ2V0X3N0cihkZXYpLCBfX2VudHJ5LT53cmFwcywgX19lbnRyeS0+bl9lbnRyeSwKKwkJICBfX2VudHJ5LT5wX2VudHJ5KQorKTsKKyNlbmRpZiAvKiBfX0lXTFdJRklfREVWSUNFX1RSQUNFX1VDT0RFICovCisKKyN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KKyN1bmRlZiBUUkFDRV9JTkNMVURFX0ZJTEUKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIGl3bC1kZXZ0cmFjZS11Y29kZQorI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldnRyYWNlLmgKaW5kZXggNzhiZDQxYi4uYjg3YWNkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS5oCkBAIC0yNCw3ICsyNCw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWYgIWRlZmluZWQoX19JV0xXSUZJX0RFVklDRV9UUkFDRSkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNpZm5kZWYgX19JV0xXSUZJX0RFVklDRV9UUkFDRQogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgogI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgpAQCAtODAsNDM2ICs4MCwxMCBAQAogI2RlZmluZSBERVZfRU5UUlkJX19zdHJpbmcoZGV2LCBkZXZfbmFtZShkZXYpKQogI2RlZmluZSBERVZfQVNTSUdOCV9fYXNzaWduX3N0cihkZXYsIGRldl9uYW1lKGRldikpCiAKLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGl3bHdpZmlfaW8KKyNpbmNsdWRlICJpd2wtZGV2dHJhY2UtaW8uaCIKKyNpbmNsdWRlICJpd2wtZGV2dHJhY2UtdWNvZGUuaCIKKyNpbmNsdWRlICJpd2wtZGV2dHJhY2UtbXNnLmgiCisjaW5jbHVkZSAiaXdsLWRldnRyYWNlLWRhdGEuaCIKKyNpbmNsdWRlICJpd2wtZGV2dHJhY2UtaXdsd2lmaS5oIgogCi1UUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9pb3JlYWQzMiwKLQlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKLQlUUF9BUkdTKGRldiwgb2ZmcywgdmFsKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlERVZfRU5UUlkKLQkJX19maWVsZCh1MzIsIG9mZnMpCi0JCV9fZmllbGQodTMyLCB2YWwpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJREVWX0FTU0lHTjsKLQkJX19lbnRyeS0+b2ZmcyA9IG9mZnM7Ci0JCV9fZW50cnktPnZhbCA9IHZhbDsKLQkpLAotCVRQX3ByaW50aygiWyVzXSByZWFkIGlvWyUjeF0gPSAlI3giLAotCQkgIF9fZ2V0X3N0cihkZXYpLCBfX2VudHJ5LT5vZmZzLCBfX2VudHJ5LT52YWwpCi0pOwotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9pb3dyaXRlOCwKLQlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZmZzLCB1OCB2YWwpLAotCVRQX0FSR1MoZGV2LCBvZmZzLCB2YWwpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCURFVl9FTlRSWQotCQlfX2ZpZWxkKHUzMiwgb2ZmcykKLQkJX19maWVsZCh1OCwgdmFsKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCURFVl9BU1NJR047Ci0JCV9fZW50cnktPm9mZnMgPSBvZmZzOwotCQlfX2VudHJ5LT52YWwgPSB2YWw7Ci0JKSwKLQlUUF9wcmludGsoIlslc10gd3JpdGUgaW9bJSN4XSA9ICUjeCkiLAotCQkgIF9fZ2V0X3N0cihkZXYpLCBfX2VudHJ5LT5vZmZzLCBfX2VudHJ5LT52YWwpCi0pOwotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9pb3dyaXRlMzIsCi0JVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCB1MzIgb2ZmcywgdTMyIHZhbCksCi0JVFBfQVJHUyhkZXYsIG9mZnMsIHZhbCksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJREVWX0VOVFJZCi0JCV9fZmllbGQodTMyLCBvZmZzKQotCQlfX2ZpZWxkKHUzMiwgdmFsKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCURFVl9BU1NJR047Ci0JCV9fZW50cnktPm9mZnMgPSBvZmZzOwotCQlfX2VudHJ5LT52YWwgPSB2YWw7Ci0JKSwKLQlUUF9wcmludGsoIlslc10gd3JpdGUgaW9bJSN4XSA9ICUjeCkiLAotCQkgIF9fZ2V0X3N0cihkZXYpLCBfX2VudHJ5LT5vZmZzLCBfX2VudHJ5LT52YWwpCi0pOwotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9pb3dyaXRlX3BycGgzMiwKLQlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKLQlUUF9BUkdTKGRldiwgb2ZmcywgdmFsKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlERVZfRU5UUlkKLQkJX19maWVsZCh1MzIsIG9mZnMpCi0JCV9fZmllbGQodTMyLCB2YWwpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJREVWX0FTU0lHTjsKLQkJX19lbnRyeS0+b2ZmcyA9IG9mZnM7Ci0JCV9fZW50cnktPnZhbCA9IHZhbDsKLQkpLAotCVRQX3ByaW50aygiWyVzXSB3cml0ZSBQUlBIWyUjeF0gPSAlI3gpIiwKLQkJICBfX2dldF9zdHIoZGV2KSwgX19lbnRyeS0+b2ZmcywgX19lbnRyeS0+dmFsKQotKTsKLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfaW9yZWFkX3BycGgzMiwKLQlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKLQlUUF9BUkdTKGRldiwgb2ZmcywgdmFsKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlERVZfRU5UUlkKLQkJX19maWVsZCh1MzIsIG9mZnMpCi0JCV9fZmllbGQodTMyLCB2YWwpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJREVWX0FTU0lHTjsKLQkJX19lbnRyeS0+b2ZmcyA9IG9mZnM7Ci0JCV9fZW50cnktPnZhbCA9IHZhbDsKLQkpLAotCVRQX3ByaW50aygiWyVzXSByZWFkIFBSUEhbJSN4XSA9ICUjeCIsCi0JCSAgX19nZXRfc3RyKGRldiksIF9fZW50cnktPm9mZnMsIF9fZW50cnktPnZhbCkKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X2lycSwKLQlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYpLAotCVRQX0FSR1MoZGV2KSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlERVZfRU5UUlkKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlERVZfQVNTSUdOOwotCSksCi0JLyogVFBfcHJpbnRrKCIiKSBkb2Vzbid0IGNvbXBpbGUgKi8KLQlUUF9wcmludGsoIiVkIiwgMCkKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X2ljdF9yZWFkLAotCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGluZGV4LCB1MzIgdmFsdWUpLAotCVRQX0FSR1MoZGV2LCBpbmRleCwgdmFsdWUpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCURFVl9FTlRSWQotCQlfX2ZpZWxkKHUzMiwgaW5kZXgpCi0JCV9fZmllbGQodTMyLCB2YWx1ZSkKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlERVZfQVNTSUdOOwotCQlfX2VudHJ5LT5pbmRleCA9IGluZGV4OwotCQlfX2VudHJ5LT52YWx1ZSA9IHZhbHVlOwotCSksCi0JVFBfcHJpbnRrKCJbJXNdIHJlYWQgaWN0WyVkXSA9ICUjLjh4IiwKLQkJICBfX2dldF9zdHIoZGV2KSwgX19lbnRyeS0+aW5kZXgsIF9fZW50cnktPnZhbHVlKQotKTsKLQotI3VuZGVmIFRSQUNFX1NZU1RFTQotI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaV91Y29kZQotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2Rldl91Y29kZV9jb250X2V2ZW50LAotCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHRpbWUsIHUzMiBkYXRhLCB1MzIgZXYpLAotCVRQX0FSR1MoZGV2LCB0aW1lLCBkYXRhLCBldiksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJREVWX0VOVFJZCi0KLQkJX19maWVsZCh1MzIsIHRpbWUpCi0JCV9fZmllbGQodTMyLCBkYXRhKQotCQlfX2ZpZWxkKHUzMiwgZXYpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJREVWX0FTU0lHTjsKLQkJX19lbnRyeS0+dGltZSA9IHRpbWU7Ci0JCV9fZW50cnktPmRhdGEgPSBkYXRhOwotCQlfX2VudHJ5LT5ldiA9IGV2OwotCSksCi0JVFBfcHJpbnRrKCJbJXNdIEVWVF9MT0dUOiUwMTB1OjB4JTA4eDolMDR1IiwKLQkJICBfX2dldF9zdHIoZGV2KSwgX19lbnRyeS0+dGltZSwgX19lbnRyeS0+ZGF0YSwgX19lbnRyeS0+ZXYpCi0pOwotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2Rldl91Y29kZV93cmFwX2V2ZW50LAotCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIHdyYXBzLCB1MzIgbl9lbnRyeSwgdTMyIHBfZW50cnkpLAotCVRQX0FSR1MoZGV2LCB3cmFwcywgbl9lbnRyeSwgcF9lbnRyeSksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJREVWX0VOVFJZCi0KLQkJX19maWVsZCh1MzIsIHdyYXBzKQotCQlfX2ZpZWxkKHUzMiwgbl9lbnRyeSkKLQkJX19maWVsZCh1MzIsIHBfZW50cnkpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJREVWX0FTU0lHTjsKLQkJX19lbnRyeS0+d3JhcHMgPSB3cmFwczsKLQkJX19lbnRyeS0+bl9lbnRyeSA9IG5fZW50cnk7Ci0JCV9fZW50cnktPnBfZW50cnkgPSBwX2VudHJ5OwotCSksCi0JVFBfcHJpbnRrKCJbJXNdIHdyYXBzPSMlMDJkIG49MHglWCBwPTB4JVgiLAotCQkgIF9fZ2V0X3N0cihkZXYpLCBfX2VudHJ5LT53cmFwcywgX19lbnRyeS0+bl9lbnRyeSwKLQkJICBfX2VudHJ5LT5wX2VudHJ5KQotKTsKLQotI3VuZGVmIFRSQUNFX1NZU1RFTQotI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaV9tc2cKLQotI2RlZmluZSBNQVhfTVNHX0xFTgkxMTAKLQotREVDTEFSRV9FVkVOVF9DTEFTUyhpd2x3aWZpX21zZ19ldmVudCwKLQlUUF9QUk9UTyhzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpLAotCVRQX0FSR1ModmFmKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2R5bmFtaWNfYXJyYXkoY2hhciwgbXNnLCBNQVhfTVNHX0xFTikKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlXQVJOX09OX09OQ0UodnNucHJpbnRmKF9fZ2V0X2R5bmFtaWNfYXJyYXkobXNnKSwKLQkJCQkgICAgICAgTUFYX01TR19MRU4sIHZhZi0+Zm10LAotCQkJCSAgICAgICAqdmFmLT52YSkgPj0gTUFYX01TR19MRU4pOwotCSksCi0JVFBfcHJpbnRrKCIlcyIsIF9fZ2V0X3N0cihtc2cpKQotKTsKLQotREVGSU5FX0VWRU5UKGl3bHdpZmlfbXNnX2V2ZW50LCBpd2x3aWZpX2VyciwKLQlUUF9QUk9UTyhzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpLAotCVRQX0FSR1ModmFmKQotKTsKLQotREVGSU5FX0VWRU5UKGl3bHdpZmlfbXNnX2V2ZW50LCBpd2x3aWZpX3dhcm4sCi0JVFBfUFJPVE8oc3RydWN0IHZhX2Zvcm1hdCAqdmFmKSwKLQlUUF9BUkdTKHZhZikKLSk7Ci0KLURFRklORV9FVkVOVChpd2x3aWZpX21zZ19ldmVudCwgaXdsd2lmaV9pbmZvLAotCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCi0JVFBfQVJHUyh2YWYpCi0pOwotCi1ERUZJTkVfRVZFTlQoaXdsd2lmaV9tc2dfZXZlbnQsIGl3bHdpZmlfY3JpdCwKLQlUUF9QUk9UTyhzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpLAotCVRQX0FSR1ModmFmKQotKTsKLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9kYmcsCi0JVFBfUFJPVE8odTMyIGxldmVsLCBib29sIGluX2ludGVycnVwdCwgY29uc3QgY2hhciAqZnVuY3Rpb24sCi0JCSBzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpLAotCVRQX0FSR1MobGV2ZWwsIGluX2ludGVycnVwdCwgZnVuY3Rpb24sIHZhZiksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJX19maWVsZCh1MzIsIGxldmVsKQotCQlfX2ZpZWxkKHU4LCBpbl9pbnRlcnJ1cHQpCi0JCV9fc3RyaW5nKGZ1bmN0aW9uLCBmdW5jdGlvbikKLQkJX19keW5hbWljX2FycmF5KGNoYXIsIG1zZywgTUFYX01TR19MRU4pCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJX19lbnRyeS0+bGV2ZWwgPSBsZXZlbDsKLQkJX19lbnRyeS0+aW5faW50ZXJydXB0ID0gaW5faW50ZXJydXB0OwotCQlfX2Fzc2lnbl9zdHIoZnVuY3Rpb24sIGZ1bmN0aW9uKTsKLQkJV0FSTl9PTl9PTkNFKHZzbnByaW50ZihfX2dldF9keW5hbWljX2FycmF5KG1zZyksCi0JCQkJICAgICAgIE1BWF9NU0dfTEVOLCB2YWYtPmZtdCwKLQkJCQkgICAgICAgKnZhZi0+dmEpID49IE1BWF9NU0dfTEVOKTsKLQkpLAotCVRQX3ByaW50aygiJXMiLCBfX2dldF9zdHIobXNnKSkKLSk7Ci0KLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGl3bHdpZmlfZGF0YQotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2Rldl90eF9kYXRhLAotCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJIHN0cnVjdCBza19idWZmICpza2IsCi0JCSB2b2lkICpkYXRhLCBzaXplX3QgZGF0YV9sZW4pLAotCVRQX0FSR1MoZGV2LCBza2IsIGRhdGEsIGRhdGFfbGVuKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlERVZfRU5UUlkKLQotCQlfX2R5bmFtaWNfYXJyYXkodTgsIGRhdGEsIGl3bF90cmFjZV9kYXRhKHNrYikgPyBkYXRhX2xlbiA6IDApCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJREVWX0FTU0lHTjsKLQkJaWYgKGl3bF90cmFjZV9kYXRhKHNrYikpCi0JCQltZW1jcHkoX19nZXRfZHluYW1pY19hcnJheShkYXRhKSwgZGF0YSwgZGF0YV9sZW4pOwotCSksCi0JVFBfcHJpbnRrKCJbJXNdIFRYIGZyYW1lIGRhdGEiLCBfX2dldF9zdHIoZGV2KSkKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X3J4X2RhdGEsCi0JVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LAotCQkgY29uc3Qgc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCSB2b2lkICpyeGJ1Ziwgc2l6ZV90IGxlbiksCi0JVFBfQVJHUyhkZXYsIHRyYW5zLCByeGJ1ZiwgbGVuKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlERVZfRU5UUlkKLQotCQlfX2R5bmFtaWNfYXJyYXkodTgsIGRhdGEsCi0JCQkJbGVuIC0gaXdsX3J4X3RyYWNlX2xlbih0cmFucywgcnhidWYsIGxlbikpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJc2l6ZV90IG9mZnMgPSBpd2xfcnhfdHJhY2VfbGVuKHRyYW5zLCByeGJ1ZiwgbGVuKTsKLQkJREVWX0FTU0lHTjsKLQkJaWYgKG9mZnMgPCBsZW4pCi0JCQltZW1jcHkoX19nZXRfZHluYW1pY19hcnJheShkYXRhKSwKLQkJCSAgICAgICAoKHU4ICopcnhidWYpICsgb2ZmcywgbGVuIC0gb2Zmcyk7Ci0JKSwKLQlUUF9wcmludGsoIlslc10gUlggZnJhbWUgZGF0YSIsIF9fZ2V0X3N0cihkZXYpKQotKTsKLQotI3VuZGVmIFRSQUNFX1NZU1RFTQotI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaQotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9oY21kLAotCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCwgdTE2IHRvdGFsX3NpemUsCi0JCSBzdHJ1Y3QgaXdsX2NtZF9oZWFkZXIgKmhkciksCi0JVFBfQVJHUyhkZXYsIGNtZCwgdG90YWxfc2l6ZSwgaGRyKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlERVZfRU5UUlkKLQkJX19keW5hbWljX2FycmF5KHU4LCBoY21kLCB0b3RhbF9zaXplKQotCQlfX2ZpZWxkKHUzMiwgZmxhZ3MpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJaW50IGksIG9mZnNldCA9IHNpemVvZigqaGRyKTsKLQotCQlERVZfQVNTSUdOOwotCQlfX2VudHJ5LT5mbGFncyA9IGNtZC0+ZmxhZ3M7Ci0JCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KGhjbWQpLCBoZHIsIHNpemVvZigqaGRyKSk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IElXTF9NQVhfQ01EX1RCU19QRVJfVEZEOyBpKyspIHsKLQkJCWlmICghY21kLT5sZW5baV0pCi0JCQkJY29udGludWU7Ci0JCQltZW1jcHkoKHU4ICopX19nZXRfZHluYW1pY19hcnJheShoY21kKSArIG9mZnNldCwKLQkJCSAgICAgICBjbWQtPmRhdGFbaV0sIGNtZC0+bGVuW2ldKTsKLQkJCW9mZnNldCArPSBjbWQtPmxlbltpXTsKLQkJfQotCSksCi0JVFBfcHJpbnRrKCJbJXNdIGhjbWQgJSMuMnggKCVzc3luYykiLAotCQkgIF9fZ2V0X3N0cihkZXYpLCAoKHU4ICopX19nZXRfZHluYW1pY19hcnJheShoY21kKSlbMF0sCi0JCSAgX19lbnRyeS0+ZmxhZ3MgJiBDTURfQVNZTkMgPyAiYSIgOiAiIikKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X3J4LAotCVRQX1BST1RPKGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCSB2b2lkICpyeGJ1Ziwgc2l6ZV90IGxlbiksCi0JVFBfQVJHUyhkZXYsIHRyYW5zLCByeGJ1ZiwgbGVuKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlERVZfRU5UUlkKLQkJX19keW5hbWljX2FycmF5KHU4LCByeGJ1ZiwgaXdsX3J4X3RyYWNlX2xlbih0cmFucywgcnhidWYsIGxlbikpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJREVWX0FTU0lHTjsKLQkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkocnhidWYpLCByeGJ1ZiwKLQkJICAgICAgIGl3bF9yeF90cmFjZV9sZW4odHJhbnMsIHJ4YnVmLCBsZW4pKTsKLQkpLAotCVRQX3ByaW50aygiWyVzXSBSWCBjbWQgJSMuMngiLAotCQkgIF9fZ2V0X3N0cihkZXYpLCAoKHU4ICopX19nZXRfZHluYW1pY19hcnJheShyeGJ1ZikpWzRdKQotKTsKLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfdHgsCi0JVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgdm9pZCAqdGZkLCBzaXplX3QgdGZkbGVuLAotCQkgdm9pZCAqYnVmMCwgc2l6ZV90IGJ1ZjBfbGVuLAotCQkgdm9pZCAqYnVmMSwgc2l6ZV90IGJ1ZjFfbGVuKSwKLQlUUF9BUkdTKGRldiwgc2tiLCB0ZmQsIHRmZGxlbiwgYnVmMCwgYnVmMF9sZW4sIGJ1ZjEsIGJ1ZjFfbGVuKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlERVZfRU5UUlkKLQotCQlfX2ZpZWxkKHNpemVfdCwgZnJhbWVsZW4pCi0JCV9fZHluYW1pY19hcnJheSh1OCwgdGZkLCB0ZmRsZW4pCi0KLQkJLyoKLQkJICogRG8gbm90IGluc2VydCBiZXR3ZWVuIG9yIGJlbG93IHRoZXNlIGl0ZW1zLAotCQkgKiB3ZSB3YW50IHRvIGtlZXAgdGhlIGZyYW1lIHRvZ2V0aGVyIChleGNlcHQKLQkJICogZm9yIHRoZSBwb3NzaWJsZSBwYWRkaW5nKS4KLQkJICovCi0JCV9fZHluYW1pY19hcnJheSh1OCwgYnVmMCwgYnVmMF9sZW4pCi0JCV9fZHluYW1pY19hcnJheSh1OCwgYnVmMSwgaXdsX3RyYWNlX2RhdGEoc2tiKSA/IDAgOiBidWYxX2xlbikKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlERVZfQVNTSUdOOwotCQlfX2VudHJ5LT5mcmFtZWxlbiA9IGJ1ZjBfbGVuICsgYnVmMV9sZW47Ci0JCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KHRmZCksIHRmZCwgdGZkbGVuKTsKLQkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkoYnVmMCksIGJ1ZjAsIGJ1ZjBfbGVuKTsKLQkJaWYgKCFpd2xfdHJhY2VfZGF0YShza2IpKQotCQkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkoYnVmMSksIGJ1ZjEsIGJ1ZjFfbGVuKTsKLQkpLAotCVRQX3ByaW50aygiWyVzXSBUWCAlLjJ4ICglenUgYnl0ZXMpIiwKLQkJICBfX2dldF9zdHIoZGV2KSwgKCh1OCAqKV9fZ2V0X2R5bmFtaWNfYXJyYXkoYnVmMCkpWzBdLAotCQkgIF9fZW50cnktPmZyYW1lbGVuKQotKTsKLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfdWNvZGVfZXJyb3IsCi0JVFBfUFJPVE8oY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCB1MzIgZGVzYywgdTMyIHRzZl9sb3csCi0JCSB1MzIgZGF0YTEsIHUzMiBkYXRhMiwgdTMyIGxpbmUsIHUzMiBibGluazEsCi0JCSB1MzIgYmxpbmsyLCB1MzIgaWxpbmsxLCB1MzIgaWxpbmsyLCB1MzIgYmNvbl90aW1lLAotCQkgdTMyIGdwMSwgdTMyIGdwMiwgdTMyIGdwMywgdTMyIHVjb2RlX3ZlciwgdTMyIGh3X3ZlciwKLQkJIHUzMiBicmRfdmVyKSwKLQlUUF9BUkdTKGRldiwgZGVzYywgdHNmX2xvdywgZGF0YTEsIGRhdGEyLCBsaW5lLAotCQlibGluazEsIGJsaW5rMiwgaWxpbmsxLCBpbGluazIsIGJjb25fdGltZSwgZ3AxLCBncDIsCi0JCWdwMywgdWNvZGVfdmVyLCBod192ZXIsIGJyZF92ZXIpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCURFVl9FTlRSWQotCQlfX2ZpZWxkKHUzMiwgZGVzYykKLQkJX19maWVsZCh1MzIsIHRzZl9sb3cpCi0JCV9fZmllbGQodTMyLCBkYXRhMSkKLQkJX19maWVsZCh1MzIsIGRhdGEyKQotCQlfX2ZpZWxkKHUzMiwgbGluZSkKLQkJX19maWVsZCh1MzIsIGJsaW5rMSkKLQkJX19maWVsZCh1MzIsIGJsaW5rMikKLQkJX19maWVsZCh1MzIsIGlsaW5rMSkKLQkJX19maWVsZCh1MzIsIGlsaW5rMikKLQkJX19maWVsZCh1MzIsIGJjb25fdGltZSkKLQkJX19maWVsZCh1MzIsIGdwMSkKLQkJX19maWVsZCh1MzIsIGdwMikKLQkJX19maWVsZCh1MzIsIGdwMykKLQkJX19maWVsZCh1MzIsIHVjb2RlX3ZlcikKLQkJX19maWVsZCh1MzIsIGh3X3ZlcikKLQkJX19maWVsZCh1MzIsIGJyZF92ZXIpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJREVWX0FTU0lHTjsKLQkJX19lbnRyeS0+ZGVzYyA9IGRlc2M7Ci0JCV9fZW50cnktPnRzZl9sb3cgPSB0c2ZfbG93OwotCQlfX2VudHJ5LT5kYXRhMSA9IGRhdGExOwotCQlfX2VudHJ5LT5kYXRhMiA9IGRhdGEyOwotCQlfX2VudHJ5LT5saW5lID0gbGluZTsKLQkJX19lbnRyeS0+YmxpbmsxID0gYmxpbmsxOwotCQlfX2VudHJ5LT5ibGluazIgPSBibGluazI7Ci0JCV9fZW50cnktPmlsaW5rMSA9IGlsaW5rMTsKLQkJX19lbnRyeS0+aWxpbmsyID0gaWxpbmsyOwotCQlfX2VudHJ5LT5iY29uX3RpbWUgPSBiY29uX3RpbWU7Ci0JCV9fZW50cnktPmdwMSA9IGdwMTsKLQkJX19lbnRyeS0+Z3AyID0gZ3AyOwotCQlfX2VudHJ5LT5ncDMgPSBncDM7Ci0JCV9fZW50cnktPnVjb2RlX3ZlciA9IHVjb2RlX3ZlcjsKLQkJX19lbnRyeS0+aHdfdmVyID0gaHdfdmVyOwotCQlfX2VudHJ5LT5icmRfdmVyID0gYnJkX3ZlcjsKLQkpLAotCVRQX3ByaW50aygiWyVzXSAjJTAyZCAlMDEwdSBkYXRhIDB4JTA4WCAweCUwOFggbGluZSAldSwgIgotCQkgICJibGluayAweCUwNVggMHglMDVYIGlsaW5rIDB4JTA1WCAweCUwNVggIgotCQkgICJiY29uX3RtICUwMTB1IGdwIDB4JTA4WCAweCUwOFggMHglMDhYIHVDb2RlIDB4JTA4WCAiCi0JCSAgImh3IDB4JTA4WCBicmQgMHglMDhYIiwKLQkJICBfX2dldF9zdHIoZGV2KSwgX19lbnRyeS0+ZGVzYywgX19lbnRyeS0+dHNmX2xvdywKLQkJICBfX2VudHJ5LT5kYXRhMSwKLQkJICBfX2VudHJ5LT5kYXRhMiwgX19lbnRyeS0+bGluZSwgX19lbnRyeS0+YmxpbmsxLAotCQkgIF9fZW50cnktPmJsaW5rMiwgX19lbnRyeS0+aWxpbmsxLCBfX2VudHJ5LT5pbGluazIsCi0JCSAgX19lbnRyeS0+YmNvbl90aW1lLCBfX2VudHJ5LT5ncDEsIF9fZW50cnktPmdwMiwKLQkJICBfX2VudHJ5LT5ncDMsIF9fZW50cnktPnVjb2RlX3ZlciwgX19lbnRyeS0+aHdfdmVyLAotCQkgIF9fZW50cnktPmJyZF92ZXIpCi0pOwotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2Rldl91Y29kZV9ldmVudCwKLQlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiB0aW1lLCB1MzIgZGF0YSwgdTMyIGV2KSwKLQlUUF9BUkdTKGRldiwgdGltZSwgZGF0YSwgZXYpLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCURFVl9FTlRSWQotCi0JCV9fZmllbGQodTMyLCB0aW1lKQotCQlfX2ZpZWxkKHUzMiwgZGF0YSkKLQkJX19maWVsZCh1MzIsIGV2KQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCURFVl9BU1NJR047Ci0JCV9fZW50cnktPnRpbWUgPSB0aW1lOwotCQlfX2VudHJ5LT5kYXRhID0gZGF0YTsKLQkJX19lbnRyeS0+ZXYgPSBldjsKLQkpLAotCVRQX3ByaW50aygiWyVzXSBFVlRfTE9HVDolMDEwdToweCUwOHg6JTA0dSIsCi0JCSAgX19nZXRfc3RyKGRldiksIF9fZW50cnktPnRpbWUsIF9fZW50cnktPmRhdGEsIF9fZW50cnktPmV2KQotKTsKICNlbmRpZiAvKiBfX0lXTFdJRklfREVWSUNFX1RSQUNFICovCi0KLSN1bmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKLSNkZWZpbmUgVFJBQ0VfSU5DTFVERV9QQVRIIC4KLSN1bmRlZiBUUkFDRV9JTkNMVURFX0ZJTEUKLSNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIGl3bC1kZXZ0cmFjZQotI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZHJ2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kcnYuYwppbmRleCA5OTZlN2YxLi43MjY3MTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kcnYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kcnYuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAjZGVmaW5lIElXTF9ERUZBVUxUX1NDQU5fQ0hBTk5FTFMgNDAKIAogLyoKLSAqIHN0cnVjdCBmd19zZWM6IEp1c3QgZm9yIHRoZSBpbWFnZSBwYXJzaW5nIHByb2NjZXNzLgorICogc3RydWN0IGZ3X3NlYzogSnVzdCBmb3IgdGhlIGltYWdlIHBhcnNpbmcgcHJvY2Vzcy4KICAqIEZvciB0aGUgZncgc3RvcmFnZSB3ZSBhcmUgdXNpbmcgc3RydWN0IGZ3X2Rlc2MuCiAgKi8KIHN0cnVjdCBmd19zZWMgewpAQCAtMTc1LDYgKzE3NSw4IEBACiAJa2ZyZWUoZHJ2LT5mdy5kYmdfZGVzdF90bHYpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRydi0+ZncuZGJnX2NvbmZfdGx2KTsgaSsrKQogCQlrZnJlZShkcnYtPmZ3LmRiZ19jb25mX3RsdltpXSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHJ2LT5mdy5kYmdfdHJpZ2dlcl90bHYpOyBpKyspCisJCWtmcmVlKGRydi0+ZncuZGJnX3RyaWdnZXJfdGx2W2ldKTsKIAogCWZvciAoaSA9IDA7IGkgPCBJV0xfVUNPREVfVFlQRV9NQVg7IGkrKykKIAkJaXdsX2ZyZWVfZndfaW1nKGRydiwgZHJ2LT5mdy5pbWcgKyBpKTsKQEAgLTIzOSwxNiArMjQxLDEwIEBACiAJICogcHJldmlvdXMgbmFtZSBhbmQgdXNlcyB0aGUgbmV3IGZvcm1hdC4KIAkgKi8KIAlpZiAoZHJ2LT50cmFucy0+Y2ZnLT5kZXZpY2VfZmFtaWx5ID09IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDApIHsKLQkJY2hhciByZXZfc3RlcFsyXSA9IHsKLQkJCSdBJyArIENTUl9IV19SRVZfU1RFUChkcnYtPnRyYW5zLT5od19yZXYpLCAwCi0JCX07Ci0KLQkJLyogQS1zdGVwIGRvZXNuJ3QgaGF2ZSBhbiBpbmRpY2F0aW9uICovCi0JCWlmIChDU1JfSFdfUkVWX1NURVAoZHJ2LT50cmFucy0+aHdfcmV2KSA9PSBTSUxJQ09OX0FfU1RFUCkKLQkJCXJldl9zdGVwWzBdID0gMDsKKwkJY2hhciByZXZfc3RlcCA9ICdBJyArIENTUl9IV19SRVZfU1RFUChkcnYtPnRyYW5zLT5od19yZXYpOwogCiAJCXNucHJpbnRmKGRydi0+ZmlybXdhcmVfbmFtZSwgc2l6ZW9mKGRydi0+ZmlybXdhcmVfbmFtZSksCi0JCQkgIiVzJXMtJXMudWNvZGUiLCBuYW1lX3ByZSwgcmV2X3N0ZXAsIHRhZyk7CisJCQkgIiVzJWMtJXMudWNvZGUiLCBuYW1lX3ByZSwgcmV2X3N0ZXAsIHRhZyk7CiAJfQogCiAJSVdMX0RFQlVHX0lORk8oZHJ2LCAiYXR0ZW1wdGluZyB0byBsb2FkIGZpcm13YXJlICVzJyVzJ1xuIiwKQEAgLTI5Myw4ICsyODksMTAgQEAKIAogCS8qIEZXIGRlYnVnIGRhdGEgcGFyc2VkIGZvciBkcml2ZXIgdXNhZ2UgKi8KIAlzdHJ1Y3QgaXdsX2Z3X2RiZ19kZXN0X3RsdiAqZGJnX2Rlc3RfdGx2OwotCXN0cnVjdCBpd2xfZndfZGJnX2NvbmZfdGx2ICpkYmdfY29uZl90bHZbRldfREJHX01BWF07Ci0Jc2l6ZV90IGRiZ19jb25mX3Rsdl9sZW5bRldfREJHX01BWF07CisJc3RydWN0IGl3bF9md19kYmdfY29uZl90bHYgKmRiZ19jb25mX3RsdltGV19EQkdfQ09ORl9NQVhdOworCXNpemVfdCBkYmdfY29uZl90bHZfbGVuW0ZXX0RCR19DT05GX01BWF07CisJc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl90bHYgKmRiZ190cmlnZ2VyX3RsdltGV19EQkdfVFJJR0dFUl9NQVhdOworCXNpemVfdCBkYmdfdHJpZ2dlcl90bHZfbGVuW0ZXX0RCR19UUklHR0VSX01BWF07CiB9OwogCiAvKgpAQCAtODQyLDYgKzg0MCwyMyBAQAogCQkJY2FwYS0+bl9zY2FuX2NoYW5uZWxzID0KIAkJCQlsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKXRsdl9kYXRhKTsKIAkJCWJyZWFrOworCQljYXNlIElXTF9VQ09ERV9UTFZfRldfVkVSU0lPTjogeworCQkJX19sZTMyICpwdHIgPSAodm9pZCAqKXRsdl9kYXRhOworCQkJdTMyIG1ham9yLCBtaW5vcjsKKwkJCXU4IGxvY2FsX2NvbXA7CisKKwkJCWlmICh0bHZfbGVuICE9IHNpemVvZih1MzIpICogMykKKwkJCQlnb3RvIGludmFsaWRfdGx2X2xlbjsKKworCQkJbWFqb3IgPSBsZTMyX3RvX2NwdXAocHRyKyspOworCQkJbWlub3IgPSBsZTMyX3RvX2NwdXAocHRyKyspOworCQkJbG9jYWxfY29tcCA9IGxlMzJfdG9fY3B1cChwdHIpOworCisJCQlzbnByaW50ZihkcnYtPmZ3LmZ3X3ZlcnNpb24sCisJCQkJIHNpemVvZihkcnYtPmZ3LmZ3X3ZlcnNpb24pLCAiJXUuJXUuJXUiLAorCQkJCSBtYWpvciwgbWlub3IsIGxvY2FsX2NvbXApOworCQkJYnJlYWs7CisJCQl9CiAJCWNhc2UgSVdMX1VDT0RFX1RMVl9GV19EQkdfREVTVDogewogCQkJc3RydWN0IGl3bF9md19kYmdfZGVzdF90bHYgKmRlc3QgPSAodm9pZCAqKXRsdl9kYXRhOwogCkBAIC04OTcsNiArOTEyLDMxIEBACiAJCQlwaWVjZXMtPmRiZ19jb25mX3Rsdl9sZW5bY29uZi0+aWRdID0gdGx2X2xlbjsKIAkJCWJyZWFrOwogCQkJfQorCQljYXNlIElXTF9VQ09ERV9UTFZfRldfREJHX1RSSUdHRVI6IHsKKwkJCXN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfdGx2ICp0cmlnZ2VyID0KKwkJCQkodm9pZCAqKXRsdl9kYXRhOworCQkJdTMyIHRyaWdnZXJfaWQgPSBsZTMyX3RvX2NwdSh0cmlnZ2VyLT5pZCk7CisKKwkJCWlmICh0cmlnZ2VyX2lkID49IEFSUkFZX1NJWkUoZHJ2LT5mdy5kYmdfdHJpZ2dlcl90bHYpKSB7CisJCQkJSVdMX0VSUihkcnYsCisJCQkJCSJTa2lwIHVua25vd24gdHJpZ2dlcjogJXVcbiIsCisJCQkJCXRyaWdnZXItPmlkKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKHBpZWNlcy0+ZGJnX3RyaWdnZXJfdGx2W3RyaWdnZXJfaWRdKSB7CisJCQkJSVdMX0VSUihkcnYsCisJCQkJCSJJZ25vcmUgZHVwbGljYXRlIGRiZyB0cmlnZ2VyICV1XG4iLAorCQkJCQl0cmlnZ2VyLT5pZCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCUlXTF9JTkZPKGRydiwgIkZvdW5kIGRlYnVnIHRyaWdnZXI6ICV1XG4iLCB0cmlnZ2VyLT5pZCk7CisKKwkJCXBpZWNlcy0+ZGJnX3RyaWdnZXJfdGx2W3RyaWdnZXJfaWRdID0gdHJpZ2dlcjsKKwkJCXBpZWNlcy0+ZGJnX3RyaWdnZXJfdGx2X2xlblt0cmlnZ2VyX2lkXSA9IHRsdl9sZW47CisJCQlicmVhazsKKwkJCX0KIAkJY2FzZSBJV0xfVUNPREVfVExWX1NFQ19SVF9VU05JRkZFUjoKIAkJCXVzbmlmZmVyX2ltYWdlcyA9IHRydWU7CiAJCQlpd2xfc3RvcmVfdWNvZGVfc2VjKHBpZWNlcywgdGx2X2RhdGEsCkBAIC05NjgsMzQgKzEwMDgsMzQgQEAKIAogCS8qIFZlcmlmeSB0aGF0IHVDb2RlIGltYWdlcyB3aWxsIGZpdCBpbiBjYXJkJ3MgU1JBTS4gKi8KIAlpZiAoZ2V0X3NlY19zaXplKHBpZWNlcywgSVdMX1VDT0RFX1JFR1VMQVIsIElXTF9VQ09ERV9TRUNUSU9OX0lOU1QpID4KLQkJCQkJCQljZmctPm1heF9pbnN0X3NpemUpIHsKKwkgICAgY2ZnLT5tYXhfaW5zdF9zaXplKSB7CiAJCUlXTF9FUlIoZHJ2LCAidUNvZGUgaW5zdHIgbGVuICVaZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAogCQkJZ2V0X3NlY19zaXplKHBpZWNlcywgSVdMX1VDT0RFX1JFR1VMQVIsCi0JCQkJCQlJV0xfVUNPREVfU0VDVElPTl9JTlNUKSk7CisJCQkJICAgICBJV0xfVUNPREVfU0VDVElPTl9JTlNUKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoZ2V0X3NlY19zaXplKHBpZWNlcywgSVdMX1VDT0RFX1JFR1VMQVIsIElXTF9VQ09ERV9TRUNUSU9OX0RBVEEpID4KLQkJCQkJCQljZmctPm1heF9kYXRhX3NpemUpIHsKKwkgICAgY2ZnLT5tYXhfZGF0YV9zaXplKSB7CiAJCUlXTF9FUlIoZHJ2LCAidUNvZGUgZGF0YSBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCiAJCQlnZXRfc2VjX3NpemUocGllY2VzLCBJV0xfVUNPREVfUkVHVUxBUiwKLQkJCQkJCUlXTF9VQ09ERV9TRUNUSU9OX0RBVEEpKTsKKwkJCQkgICAgIElXTF9VQ09ERV9TRUNUSU9OX0RBVEEpKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCSBpZiAoZ2V0X3NlY19zaXplKHBpZWNlcywgSVdMX1VDT0RFX0lOSVQsIElXTF9VQ09ERV9TRUNUSU9OX0lOU1QpID4KLQkJCQkJCQljZmctPm1heF9pbnN0X3NpemUpIHsKKwlpZiAoZ2V0X3NlY19zaXplKHBpZWNlcywgSVdMX1VDT0RFX0lOSVQsIElXTF9VQ09ERV9TRUNUSU9OX0lOU1QpID4KKwkgICAgIGNmZy0+bWF4X2luc3Rfc2l6ZSkgewogCQlJV0xfRVJSKGRydiwgInVDb2RlIGluaXQgaW5zdHIgbGVuICVaZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAogCQkJZ2V0X3NlY19zaXplKHBpZWNlcywgSVdMX1VDT0RFX0lOSVQsCi0JCQkJCQlJV0xfVUNPREVfU0VDVElPTl9JTlNUKSk7CisJCQkJICAgICBJV0xfVUNPREVfU0VDVElPTl9JTlNUKSk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlpZiAoZ2V0X3NlY19zaXplKHBpZWNlcywgSVdMX1VDT0RFX0lOSVQsIElXTF9VQ09ERV9TRUNUSU9OX0RBVEEpID4KLQkJCQkJCQljZmctPm1heF9kYXRhX3NpemUpIHsKKwkgICAgY2ZnLT5tYXhfZGF0YV9zaXplKSB7CiAJCUlXTF9FUlIoZHJ2LCAidUNvZGUgaW5pdCBkYXRhIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKIAkJCWdldF9zZWNfc2l6ZShwaWVjZXMsIElXTF9VQ09ERV9SRUdVTEFSLAotCQkJCQkJSVdMX1VDT0RFX1NFQ1RJT05fREFUQSkpOworCQkJCSAgICAgSVdMX1VDT0RFX1NFQ1RJT05fREFUQSkpOwogCQlyZXR1cm4gLTE7CiAJfQogCXJldHVybiAwOwpAQCAtMTA2Miw2ICsxMTAyLDcgQEAKIAljb25zdCB1bnNpZ25lZCBpbnQgYXBpX21heCA9IGRydi0+Y2ZnLT51Y29kZV9hcGlfbWF4OwogCXVuc2lnbmVkIGludCBhcGlfb2sgPSBkcnYtPmNmZy0+dWNvZGVfYXBpX29rOwogCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWluID0gZHJ2LT5jZmctPnVjb2RlX2FwaV9taW47CisJc2l6ZV90IHRyaWdnZXJfdGx2X3N6W0ZXX0RCR19UUklHR0VSX01BWF07CiAJdTMyIGFwaV92ZXI7CiAJaW50IGk7CiAJYm9vbCBsb2FkX21vZHVsZSA9IGZhbHNlOwpAQCAtMTEwNyw3ICsxMTQ4LDEwIEBACiAJaWYgKGVycikKIAkJZ290byB0cnlfYWdhaW47CiAKLQlhcGlfdmVyID0gSVdMX1VDT0RFX0FQSShkcnYtPmZ3LnVjb2RlX3Zlcik7CisJaWYgKGRydi0+ZncudWNvZGVfY2FwYS5hcGlbMF0gJiBJV0xfVUNPREVfVExWX0FQSV9ORVdfVkVSU0lPTikKKwkJYXBpX3ZlciA9IGRydi0+ZncudWNvZGVfdmVyOworCWVsc2UKKwkJYXBpX3ZlciA9IElXTF9VQ09ERV9BUEkoZHJ2LT5mdy51Y29kZV92ZXIpOwogCiAJLyoKIAkgKiBhcGlfdmVyIHNob3VsZCBtYXRjaCB0aGUgYXBpIHZlcnNpb24gZm9ybWluZyBwYXJ0IG9mIHRoZQpAQCAtMTE3OCw2ICsxMjIyLDQ4IEBACiAJCX0KIAl9CiAKKwltZW1zZXQoJnRyaWdnZXJfdGx2X3N6LCAweGZmLCBzaXplb2YodHJpZ2dlcl90bHZfc3opKTsKKworCXRyaWdnZXJfdGx2X3N6W0ZXX0RCR19UUklHR0VSX01JU1NFRF9CRUFDT05TXSA9CisJCXNpemVvZihzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX21pc3NlZF9iY29uKTsKKwl0cmlnZ2VyX3Rsdl9zeltGV19EQkdfVFJJR0dFUl9DSEFOTkVMX1NXSVRDSF0gPSAwOworCXRyaWdnZXJfdGx2X3N6W0ZXX0RCR19UUklHR0VSX0ZXX05PVElGXSA9CisJCXNpemVvZihzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX2NtZCk7CisJdHJpZ2dlcl90bHZfc3pbRldfREJHX1RSSUdHRVJfTUxNRV0gPQorCQlzaXplb2Yoc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl9tbG1lKTsKKwl0cmlnZ2VyX3Rsdl9zeltGV19EQkdfVFJJR0dFUl9TVEFUU10gPQorCQlzaXplb2Yoc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl9zdGF0cyk7CisJdHJpZ2dlcl90bHZfc3pbRldfREJHX1RSSUdHRVJfUlNTSV0gPQorCQlzaXplb2Yoc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl9sb3dfcnNzaSk7CisJdHJpZ2dlcl90bHZfc3pbRldfREJHX1RSSUdHRVJfVFhRX1RJTUVSU10gPQorCQlzaXplb2Yoc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl90eHFfdGltZXIpOworCXRyaWdnZXJfdGx2X3N6W0ZXX0RCR19UUklHR0VSX1RJTUVfRVZFTlRdID0KKwkJc2l6ZW9mKHN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfdGltZV9ldmVudCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkcnYtPmZ3LmRiZ190cmlnZ2VyX3Rsdik7IGkrKykgeworCQlpZiAocGllY2VzLT5kYmdfdHJpZ2dlcl90bHZbaV0pIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgdHJpZ2dlciBpc24ndCBsb25nIGVub3VnaCwgV0FSTiBhbmQgZXhpdC4KKwkJCSAqIFNvbWVvbmUgaXMgdHJ5aW5nIHRvIGRlYnVnIHNvbWV0aGluZyBhbmQgaGUgd29uJ3QKKwkJCSAqIGJlIGFibGUgdG8gY2F0Y2ggdGhlIGJ1ZyBoZSBpcyB0cnlpbmcgdG8gY2hhc2UuCisJCQkgKiBXZSdkIGJldHRlciBiZSBub2lzeSB0byBiZSBzdXJlIGhlIGtub3dzIHdoYXQncworCQkJICogZ29pbmcgb24uCisJCQkgKi8KKwkJCWlmIChXQVJOX09OKHBpZWNlcy0+ZGJnX3RyaWdnZXJfdGx2X2xlbltpXSA8CisJCQkJICAgICh0cmlnZ2VyX3Rsdl9zeltpXSArCisJCQkJICAgICBzaXplb2Yoc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl90bHYpKSkpCisJCQkJZ290byBvdXRfZnJlZV9mdzsKKwkJCWRydi0+ZncuZGJnX3RyaWdnZXJfdGx2X2xlbltpXSA9CisJCQkJcGllY2VzLT5kYmdfdHJpZ2dlcl90bHZfbGVuW2ldOworCQkJZHJ2LT5mdy5kYmdfdHJpZ2dlcl90bHZbaV0gPQorCQkJCWttZW1kdXAocGllY2VzLT5kYmdfdHJpZ2dlcl90bHZbaV0sCisJCQkJCWRydi0+ZncuZGJnX3RyaWdnZXJfdGx2X2xlbltpXSwKKwkJCQkJR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWRydi0+ZncuZGJnX3RyaWdnZXJfdGx2W2ldKQorCQkJCWdvdG8gb3V0X2ZyZWVfZnc7CisJCX0KKwl9CisKIAkvKiBOb3cgdGhhdCB3ZSBjYW4gbm8gbG9uZ2VyIGZhaWwsIGNvcHkgaW5mb3JtYXRpb24gKi8KIAogCS8qCkBAIC0xMjU3LDYgKzEzNDMsNyBAQAogCQkJCW9wLT5uYW1lLCBlcnIpOwogI2VuZGlmCiAJfQorCWtmcmVlKHBpZWNlcyk7CiAJcmV0dXJuOwogCiAgdHJ5X2FnYWluOgpAQCAtMTQ4NCw2ICsxNTcxLDEwIEBACiAJCSAgIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhkMGkzX2Rpc2FibGUsICJkaXNhYmxlIGQwaTMgZnVuY3Rpb25hbGl0eSAoZGVmYXVsdDogWSkiKTsKIAorbW9kdWxlX3BhcmFtX25hbWVkKGxhcl9kaXNhYmxlLCBpd2x3aWZpX21vZF9wYXJhbXMubGFyX2Rpc2FibGUsCisJCSAgIGJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhsYXJfZGlzYWJsZSwgImRpc2FibGUgTEFSIGZ1bmN0aW9uYWxpdHkgKGRlZmF1bHQ6IE4pIik7CisKIG1vZHVsZV9wYXJhbV9uYW1lZCh1YXBzZF9kaXNhYmxlLCBpd2x3aWZpX21vZF9wYXJhbXMudWFwc2RfZGlzYWJsZSwKIAkJICAgYm9vbCwgU19JUlVHTyB8IFNfSVdVU1IpOwogI2lmZGVmIENPTkZJR19JV0xXSUZJX1VBUFNECmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kcnYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRydi5oCmluZGV4IGFkZjUyMmMuLmNkYTc0NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRydi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRydi5oCkBAIC02OCw3ICs2OCw3IEBACiAKIC8qIGZvciBhbGwgbW9kdWxlcyAqLwogI2RlZmluZSBEUlZfTkFNRSAgICAgICAgIml3bHdpZmkiCi0jZGVmaW5lIERSVl9DT1BZUklHSFQJIkNvcHlyaWdodChjKSAyMDAzLSAyMDE0IEludGVsIENvcnBvcmF0aW9uIgorI2RlZmluZSBEUlZfQ09QWVJJR0hUCSJDb3B5cmlnaHQoYykgMjAwMy0gMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbiIKICNkZWZpbmUgRFJWX0FVVEhPUiAgICAgIjxpbHdAbGludXguaW50ZWwuY29tPiIKIAogLyogcmFkaW8gY29uZmlnIGJpdHMgKGFjdHVhbCB2YWx1ZXMgZnJvbSBOVk0gZGVmaW5pdGlvbikgKi8KQEAgLTEyMyw3ICsxMjMsNyBAQAogICogc3RhcnRzIHRoZSBkcml2ZXI6IGZldGNoZXMgdGhlIGZpcm13YXJlLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYnkgYnVzCiAgKiBzcGVjaWZpYyBzeXN0ZW0gZmxvd3MgaW1wbGVtZW50YXRpb25zLiBGb3IgZXhhbXBsZSwgdGhlIGJ1cyBzcGVjaWZpYyBwcm9iZQogICogZnVuY3Rpb24gc2hvdWxkIGRvIGJ1cyByZWxhdGVkIG9wZXJhdGlvbnMgb25seSwgYW5kIHRoZW4gY2FsbCB0byB0aGlzCi0gKiBmdW5jdGlvbi4gSXQgcmV0dXJucyB0aGUgZHJpdmVyIG9iamVjdCBvciAlTlVMTCBpZiBhbiBlcnJvciBvY2N1cmVkLgorICogZnVuY3Rpb24uIEl0IHJldHVybnMgdGhlIGRyaXZlciBvYmplY3Qgb3IgJU5VTEwgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAgKi8KIHN0cnVjdCBpd2xfZHJ2ICppd2xfZHJ2X3N0YXJ0KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAogCQkJICAgICAgY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1lZXByb20tcGFyc2UuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS1wYXJzZS5oCmluZGV4IGYwNTQ4YjguLjUyMzRhMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS1wYXJzZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS1wYXJzZS5oCkBAIC05NCw2ICs5NCw3IEBACiAJdTMyIG52bV92ZXJzaW9uOwogCXM4IG1heF90eF9wd3JfaGFsZl9kYm07CiAKKwlib29sIGxhcl9lbmFibGVkOwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZHNbSUVFRTgwMjExX05VTV9CQU5EU107CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGNoYW5uZWxzW107CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLXJlYWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS1yZWFkLmMKaW5kZXggMjVkMDEwNS4uMjE5Y2E4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLXJlYWQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1lZXByb20tcmVhZC5jCkBAIC0yNDgsNyArMjQ4LDcgQEAKIAlvdHBncCA9IGl3bF9yZWFkMzIodHJhbnMsIENTUl9PVFBfR1BfUkVHKTsKIAlpZiAob3RwZ3AgJiBDU1JfT1RQX0dQX1JFR19FQ0NfVU5DT1JSX1NUQVRVU19NU0spIHsKIAkJLyogc3RvcCBpbiB0aGlzIGNhc2UgKi8KLQkJLyogc2V0IHRoZSB1bmNvcnJlY3RhYmxlIE9UUCBFQ0MgYml0IGZvciBhY2tub3dsZWRnZW1lbnQgKi8KKwkJLyogc2V0IHRoZSB1bmNvcnJlY3RhYmxlIE9UUCBFQ0MgYml0IGZvciBhY2tub3dsZWRnbWVudCAqLwogCQlpd2xfc2V0X2JpdCh0cmFucywgQ1NSX09UUF9HUF9SRUcsCiAJCQkgICAgQ1NSX09UUF9HUF9SRUdfRUNDX1VOQ09SUl9TVEFUVVNfTVNLKTsKIAkJSVdMX0VSUih0cmFucywgIlVuY29ycmVjdGFibGUgT1RQIEVDQyBlcnJvciwgYWJvcnQgT1RQIHJlYWRcbiIpOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJfQogCWlmIChvdHBncCAmIENTUl9PVFBfR1BfUkVHX0VDQ19DT1JSX1NUQVRVU19NU0spIHsKIAkJLyogY29udGludWUgaW4gdGhpcyBjYXNlICovCi0JCS8qIHNldCB0aGUgY29ycmVjdGFibGUgT1RQIEVDQyBiaXQgZm9yIGFja25vd2xlZGdlbWVudCAqLworCQkvKiBzZXQgdGhlIGNvcnJlY3RhYmxlIE9UUCBFQ0MgYml0IGZvciBhY2tub3dsZWRnbWVudCAqLwogCQlpd2xfc2V0X2JpdCh0cmFucywgQ1NSX09UUF9HUF9SRUcsCiAJCQkgICAgQ1NSX09UUF9HUF9SRUdfRUNDX0NPUlJfU1RBVFVTX01TSyk7CiAJCUlXTF9FUlIodHJhbnMsICJDb3JyZWN0YWJsZSBPVFAgRUNDIGVycm9yLCBjb250aW51ZSByZWFkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWZoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1maC5oCmluZGV4IDFmN2YxNWUuLmQ0NWRjMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWZoLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZmguaApAQCAtNDQ1LDcgKzQ0NSw3IEBACiAjZGVmaW5lIFJYX0xPV19XQVRFUk1BUksgOAogCiAvKioKLSAqIHN0cnVjdCBpd2xfcmJfc3RhdHVzIC0gcmVzZXZlIGJ1ZmZlciBzdGF0dXMKKyAqIHN0cnVjdCBpd2xfcmJfc3RhdHVzIC0gcmVzZXJ2ZSBidWZmZXIgc3RhdHVzCiAgKiAJaG9zdCBtZW1vcnkgbWFwcGVkIEZIIHJlZ2lzdGVycwogICogQGNsb3NlZF9yYl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpbmRleCBvZiB0aGUgUkIgd2hpY2ggd2FzIGNsb3NlZAogICogQGNsb3NlZF9mcl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpbmRleCBvZiB0aGUgUlggRnJhbWUgd2hpY2ggd2FzIGNsb3NlZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZnctZXJyb3ItZHVtcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZnctZXJyb3ItZHVtcC5oCmluZGV4IDkxOWEyNTQuLjI1MWJmOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWZ3LWVycm9yLWR1bXAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1mdy1lcnJvci1kdW1wLmgKQEAgLTgyLDYgKzgyLDggQEAKICAqCXNlY3Rpb25zIGxpa2UgdGhpcyBpbiBhIHNpbmdsZSBmaWxlLgogICogQElXTF9GV19FUlJPUl9EVU1QX0ZIX1JFR1M6IHJhbmdlIG9mIEZIIHJlZ2lzdGVycwogICogQElXTF9GV19FUlJPUl9EVU1QX01FTTogY2h1bmsgb2YgbWVtb3J5CisgKiBASVdMX0ZXX0VSUk9SX0RVTVBfRVJST1JfSU5GTzogZGVzY3JpcHRpb24gb2Ygd2hhdCB0cmlnZ2VyZWQgdGhpcyBkdW1wLgorICoJU3RydWN0dXJlZCBhcyAmc3RydWN0IGl3bF9md19lcnJvcl9kdW1wX3RyaWdnZXJfZGVzYy4KICAqLwogZW51bSBpd2xfZndfZXJyb3JfZHVtcF90eXBlIHsKIAkvKiAwIGlzIGRlcHJlY2F0ZWQgKi8KQEAgLTk0LDYgKzk2LDcgQEAKIAlJV0xfRldfRVJST1JfRFVNUF9UWEYgPSA3LAogCUlXTF9GV19FUlJPUl9EVU1QX0ZIX1JFR1MgPSA4LAogCUlXTF9GV19FUlJPUl9EVU1QX01FTSA9IDksCisJSVdMX0ZXX0VSUk9SX0RVTVBfRVJST1JfSU5GTyA9IDEwLAogCiAJSVdMX0ZXX0VSUk9SX0RVTVBfTUFYLAogfTsKQEAgLTE4MCw3ICsxODMsNyBAQAogICogc3RydWN0IGl3bF9md19lcnJvcl9kdW1wX2Z3X21vbiAtIEZXIG1vbml0b3IgZGF0YQogICogQGZ3X21vbl93cl9wdHI6IHRoZSBwb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlciBpbiB0aGUgY3ljbGljIGJ1ZmZlcgogICogQGZ3X21vbl9iYXNlX3B0cjogYmFzZSBwb2ludGVyIG9mIHRoZSBkYXRhCi0gKiBAZndfbW9uX2N5Y2xlX2NudDogbnVtYmVyIG9mIHdyYXAgYXJvdW5kcworICogQGZ3X21vbl9jeWNsZV9jbnQ6IG51bWJlciBvZiB3cmFwYXJvdW5kcwogICogQHJlc2VydmVkOiBmb3IgZnV0dXJlIHVzZQogICogQGRhdGE6IGNhcHR1cmVkIGRhdGEKICAqLwpAQCAtMjMwLDQgKzIzMyw1MyBAQAogCXJldHVybiAodm9pZCAqKShkYXRhLT5kYXRhICsgbGUzMl90b19jcHUoZGF0YS0+bGVuKSk7CiB9CiAKKy8qKgorICogZW51bSBpd2xfZndfZGJnX3RyaWdnZXIgLSB0cmlnZ2VycyBhdmFpbGFibGUKKyAqCisgKiBARldfREJHX1RSSUdHRVJfVVNFUjogdHJpZ2dlciBsb2cgY29sbGVjdGlvbiBieSB1c2VyCisgKglUaGlzIHNob3VsZCBub3QgYmUgZGVmaW5lZCBhcyBhIHRyaWdnZXIgdG8gdGhlIGRyaXZlciwgYnV0IGEgdmFsdWUgdGhlCisgKglkcml2ZXIgc2hvdWxkIHNldCB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0cmlnZ2VyIHdhcyBpbml0aWF0ZWQgYnkgdGhlCisgKgl1c2VyLgorICogQEZXX0RCR19UUklHR0VSX0ZXX0FTU0VSVDogdHJpZ2dlciBsb2cgY29sbGVjdGlvbiB3aGVuIHRoZSBmaXJtd2FyZSBhc3NlcnRzCisgKiBARldfREJHX1RSSUdHRVJfTUlTU0VEX0JFQUNPTlM6IHRyaWdnZXIgbG9nIGNvbGxlY3Rpb24gd2hlbiBiZWFjb25zIGFyZQorICoJbWlzc2VkLgorICogQEZXX0RCR19UUklHR0VSX0NIQU5ORUxfU1dJVENIOiB0cmlnZ2VyIGxvZyBjb2xsZWN0aW9uIHVwb24gY2hhbm5lbCBzd2l0Y2guCisgKiBARldfREJHX1RSSUdHRVJfRldfTk9USUY6IHRyaWdnZXIgbG9nIGNvbGxlY3Rpb24gd2hlbiB0aGUgZmlybXdhcmUgc2VuZHMgYQorICoJY29tbWFuZCByZXNwb25zZSBvciBhIG5vdGlmaWNhdGlvbi4KKyAqIEBGV19EQkdfVFJJR0dFUl9NTE1FOiB0cmlnZ2VyIGxvZyBjb2xsZWN0aW9uIHVwb24gTUxNRSBldmVudC4KKyAqIEBGV19EQkdfVFJJR0dFUl9TVEFUUzogdHJpZ2dlciBsb2cgY29sbGVjdGlvbiB1cG9uIHN0YXRpc3RpY3MgdGhyZXNob2xkLgorICogQEZXX0RCR19UUklHR0VSX1JTU0k6IHRyaWdnZXIgbG9nIGNvbGxlY3Rpb24gd2hlbiB0aGUgcnNzaSBvZiB0aGUgYmVhY29uCisgKglnb2VzIGJlbG93IGEgdGhyZXNob2xkLgorICogQEZXX0RCR19UUklHR0VSX1RYUV9USU1FUlM6IGNvbmZpZ3VyZXMgdGhlIHRpbWVycyBmb3IgdGhlIFR4IHF1ZXVlIGhhbmcKKyAqCWRldGVjdGlvbi4KKyAqIEBGV19EQkdfVFJJR0dFUl9USU1FX0VWRU5UOiB0cmlnZ2VyIGxvZyBjb2xsZWN0aW9uIHVwb24gdGltZSBldmVudHMgcmVsYXRlZAorICoJZXZlbnRzLgorICovCitlbnVtIGl3bF9md19kYmdfdHJpZ2dlciB7CisJRldfREJHX1RSSUdHRVJfSU5WQUxJRCA9IDAsCisJRldfREJHX1RSSUdHRVJfVVNFUiwKKwlGV19EQkdfVFJJR0dFUl9GV19BU1NFUlQsCisJRldfREJHX1RSSUdHRVJfTUlTU0VEX0JFQUNPTlMsCisJRldfREJHX1RSSUdHRVJfQ0hBTk5FTF9TV0lUQ0gsCisJRldfREJHX1RSSUdHRVJfRldfTk9USUYsCisJRldfREJHX1RSSUdHRVJfTUxNRSwKKwlGV19EQkdfVFJJR0dFUl9TVEFUUywKKwlGV19EQkdfVFJJR0dFUl9SU1NJLAorCUZXX0RCR19UUklHR0VSX1RYUV9USU1FUlMsCisJRldfREJHX1RSSUdHRVJfVElNRV9FVkVOVCwKKworCS8qIG11c3QgYmUgbGFzdCAqLworCUZXX0RCR19UUklHR0VSX01BWCwKK307CisKKy8qKgorICogc3RydWN0IGl3bF9md19lcnJvcl9kdW1wX3RyaWdnZXJfZGVzYyAtIGRlc2NyaWJlcyB0aGUgdHJpZ2dlciBjb25kaXRpb24KKyAqIEB0eXBlOiAlZW51bSBpd2xfZndfZGJnX3RyaWdnZXIKKyAqIEBkYXRhOiByYXcgZGF0YSBhYm91dCB3aGF0IGhhcHBlbmVkCisgKi8KK3N0cnVjdCBpd2xfZndfZXJyb3JfZHVtcF90cmlnZ2VyX2Rlc2MgeworCV9fbGUzMiB0eXBlOworCXU4IGRhdGFbXTsKK307CisKICNlbmRpZiAvKiBfX2Z3X2Vycm9yX2R1bXBfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1mdy1maWxlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1mdy1maWxlLmgKaW5kZXggMDE2ZDkxMy4uYmZkZjNmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZnctZmlsZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWZ3LWZpbGUuaApAQCAtNjYsNiArNjYsNyBAQAogI2RlZmluZSBfX2l3bF9md19maWxlX2hfXwogCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmw4MDIxMS5oPgogCiAvKiB2MS92MiB1Q29kZSBmaWxlIGxheW91dCAqLwogc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgewpAQCAtMTMzLDggKzEzNCwxMCBAQAogCUlXTF9VQ09ERV9UTFZfTl9TQ0FOX0NIQU5ORUxTCQk9IDMxLAogCUlXTF9VQ09ERV9UTFZfU0VDX1JUX1VTTklGRkVSCT0gMzQsCiAJSVdMX1VDT0RFX1RMVl9TRElPX0FETUFfQUREUgk9IDM1LAorCUlXTF9VQ09ERV9UTFZfRldfVkVSU0lPTgk9IDM2LAogCUlXTF9VQ09ERV9UTFZfRldfREJHX0RFU1QJPSAzOCwKIAlJV0xfVUNPREVfVExWX0ZXX0RCR19DT05GCT0gMzksCisJSVdMX1VDT0RFX1RMVl9GV19EQkdfVFJJR0dFUgk9IDQwLAogfTsKIAogc3RydWN0IGl3bF91Y29kZV90bHYgewpAQCAtMTU2LDcgKzE1OSw4IEBACiAJX19sZTMyIHplcm87CiAJX19sZTMyIG1hZ2ljOwogCXU4IGh1bWFuX3JlYWRhYmxlW0ZXX1ZFUl9IVU1BTl9SRUFEQUJMRV9TWl07Ci0JX19sZTMyIHZlcjsJCS8qIG1ham9yL21pbm9yL0FQSS9zZXJpYWwgKi8KKwkvKiBtYWpvci9taW5vci9BUEkvc2VyaWFsIG9yIG1ham9yIGluIG5ldyBmb3JtYXQgKi8KKwlfX2xlMzIgdmVyOwogCV9fbGUzMiBidWlsZDsKIAlfX2xlNjQgaWdub3JlOwogCS8qCkBAIC0xODcsNyArMTkxLDcgQEAKICAqIGVudW0gaXdsX3Vjb2RlX3Rsdl9mbGFnIC0gdWNvZGUgQVBJIGZsYWdzCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19QQU46IFRoaXMgaXMgUEFOIGNhcGFibGUgbWljcm9jb2RlOyB0aGlzIHByZXZpb3VzbHkKICAqCXdhcyBhIHNlcGFyYXRlIFRMViBidXQgbW92ZWQgaGVyZSB0byBzYXZlIHNwYWNlLgotICogQElXTF9VQ09ERV9UTFZfRkxBR1NfTkVXU0NBTjogbmV3IHVDb2RlIHNjYW4gYmVoYXZpb3VyIG9uIGhpZGRlbiBTU0lELAorICogQElXTF9VQ09ERV9UTFZfRkxBR1NfTkVXU0NBTjogbmV3IHVDb2RlIHNjYW4gYmVoYXZpb3Igb24gaGlkZGVuIFNTSUQsCiAgKgl0cmVhdHMgZ29vZCBDUkMgdGhyZXNob2xkIGFzIGEgYm9vbGVhbgogICogQElXTF9VQ09ERV9UTFZfRkxBR1NfTUZQOiBUaGlzIHVDb2RlIGltYWdlIHN1cHBvcnRzIE1GUCAoODAyLjExdykuCiAgKiBASVdMX1VDT0RFX1RMVl9GTEFHU19QMlA6IFRoaXMgdUNvZGUgaW1hZ2Ugc3VwcG9ydHMgUDJQLgpAQCAtMjM2LDExICsyNDAsOSBAQAogLyoqCiAgKiBlbnVtIGl3bF91Y29kZV90bHZfYXBpIC0gdWNvZGUgYXBpCiAgKiBASVdMX1VDT0RFX1RMVl9BUElfQlRfQ09FWF9TUExJVDogbmV3IEFQSSBmb3IgQlQgQ29leAotICogQElXTF9VQ09ERV9UTFZfQVBJX0RJU0FCTEVfU1RBX1RYOiB1Y29kZSBzdXBwb3J0cyB0eF9kaXNhYmxlIGJpdC4KLSAqIEBJV0xfVUNPREVfVExWX0FQSV9MTUFDX1NDQU46IFRoaXMgdWNvZGUgdXNlcyBMTUFDIHVuaWZpZWQgc2NhbiBBUEkuCi0gKiBASVdMX1VDT0RFX1RMVl9BUElfU0ZfTk9fRFVNTVlfTk9USUY6IHVjb2RlIHN1cHBvcnRzIGRpc2FibGluZyBkdW1teSBub3RpZi4KICAqIEBJV0xfVUNPREVfVExWX0FQSV9GUkFHTUVOVEVEX1NDQU46IFRoaXMgdWNvZGUgc3VwcG9ydHMgYWN0aXZlIGR3ZWxsIHRpbWUKICAqCWxvbmdlciB0aGFuIHRoZSBwYXNzaXZlIG9uZSwgd2hpY2ggaXMgZXNzZW50aWFsIGZvciBmcmFnbWVudGVkIHNjYW4uCisgKiBASVdMX1VDT0RFX1RMVl9BUElfV0lGSV9NQ0NfVVBEQVRFOiB1Y29kZSBzdXBwb3J0cyBNQ0MgdXBkYXRlcyB3aXRoIHNvdXJjZS4KICAqIElXTF9VQ09ERV9UTFZfQVBJX0hEQ19QSEFTRV8wOiB1Y29kZSBzdXBwb3J0cyBmaW5lciBjb25maWd1cmF0aW9uIG9mIExUUgogICogQElXTF9VQ09ERV9UTFZfQVBJX0JBU0lDX0RXRUxMOiB1c2Ugb25seSBiYXNpYyBkd2VsbCB0aW1lIGluIHNjYW4gY29tbWFuZCwKICAqCXJlZ2FyZGxlc3Mgb2YgdGhlIGJhbmQgb3IgdGhlIG51bWJlciBvZiB0aGUgcHJvYmVzLiBGVyB3aWxsIGNhbGN1bGF0ZQpAQCAtMjUwLDE5ICsyNTIsMjEgQEAKICAqIEBJV0xfVUNPREVfVExWX0FQSV9TSU5HTEVfU0NBTl9FQlM6IEVCUyBpcyBzdXBwb3J0ZWQgZm9yIHNpbmdsZSBzY2FucyB0b28uCiAgKiBASVdMX1VDT0RFX1RMVl9BUElfQVNZTkNfRFRNOiBBc3luYyB0ZW1wZXJhdHVyZSBub3RpZmljYXRpb25zIGFyZSBzdXBwb3J0ZWQuCiAgKiBASVdMX1VDT0RFX1RMVl9BUElfTFFfU1NfUEFSQU1TOiBDb25maWd1cmUgU1RCQy9CRkVSIHZpYSBMUSBDTUQgc3NfcGFyYW1zCisgKiBASVdMX1VDT0RFX1RMVl9BUElfU1RBVFNfVjEwOiB1Q29kZSBzdXBwb3J0cy91c2VzIHN0YXRpc3RpY3MgQVBJIHZlcnNpb24gMTAKKyAqIEBJV0xfVUNPREVfVExWX0FQSV9ORVdfVkVSU0lPTjogbmV3IHZlcnNpb25pbmcgZm9ybWF0CiAgKi8KIGVudW0gaXdsX3Vjb2RlX3Rsdl9hcGkgewogCUlXTF9VQ09ERV9UTFZfQVBJX0JUX0NPRVhfU1BMSVQgICAgICAgICA9IEJJVCgzKSwKLQlJV0xfVUNPREVfVExWX0FQSV9ESVNBQkxFX1NUQV9UWAk9IEJJVCg1KSwKLQlJV0xfVUNPREVfVExWX0FQSV9MTUFDX1NDQU4JCT0gQklUKDYpLAotCUlXTF9VQ09ERV9UTFZfQVBJX1NGX05PX0RVTU1ZX05PVElGCT0gQklUKDcpLAogCUlXTF9VQ09ERV9UTFZfQVBJX0ZSQUdNRU5URURfU0NBTgk9IEJJVCg4KSwKKwlJV0xfVUNPREVfVExWX0FQSV9XSUZJX01DQ19VUERBVEUJPSBCSVQoOSksCiAJSVdMX1VDT0RFX1RMVl9BUElfSERDX1BIQVNFXzAJCT0gQklUKDEwKSwKIAlJV0xfVUNPREVfVExWX0FQSV9CQVNJQ19EV0VMTAkJPSBCSVQoMTMpLAogCUlXTF9VQ09ERV9UTFZfQVBJX1NDRF9DRkcJCT0gQklUKDE1KSwKIAlJV0xfVUNPREVfVExWX0FQSV9TSU5HTEVfU0NBTl9FQlMJPSBCSVQoMTYpLAogCUlXTF9VQ09ERV9UTFZfQVBJX0FTWU5DX0RUTQkJPSBCSVQoMTcpLAogCUlXTF9VQ09ERV9UTFZfQVBJX0xRX1NTX1BBUkFNUwkJPSBCSVQoMTgpLAorCUlXTF9VQ09ERV9UTFZfQVBJX1NUQVRTX1YxMAkJPSBCSVQoMTkpLAorCUlXTF9VQ09ERV9UTFZfQVBJX05FV19WRVJTSU9OCQk9IEJJVCgyMCksCiB9OwogCiAvKioKQEAgLTI4NCw2ICsyODgsMTMgQEAKICAqCXdoaWNoIGFsc28gaW1wbGllcyBzdXBwb3J0IGZvciB0aGUgc2NoZWR1bGVyIGNvbmZpZ3VyYXRpb24gY29tbWFuZAogICogQElXTF9VQ09ERV9UTFZfQ0FQQV9URExTX0NIQU5ORUxfU1dJVENIOiBzdXBwb3J0cyBURExTIGNoYW5uZWwgc3dpdGNoaW5nCiAgKiBASVdMX1VDT0RFX1RMVl9DQVBBX0hPVFNQT1RfU1VQUE9SVDogc3VwcG9ydHMgSG90IFNwb3QgQ29tbWFuZAorICogQElXTF9VQ09ERV9UTFZfQ0FQQV9SQURJT19CRUFDT05fU1RBVFM6IHN1cHBvcnQgcmFkaW8gYW5kIGJlYWNvbiBzdGF0aXN0aWNzCisgKiBASVdMX1VDT0RFX1RMVl9DQVBBX0JUX0NPRVhfUExDUjogZW5hYmxlZCBCVCBDb2V4IHBhY2tldCBsZXZlbCBjby1ydW5uaW5nCisgKiBASVdMX1VDT0RFX1RMVl9DQVBBX0xBUl9NVUxUSV9NQ0M6IHVjb2RlIHN1cHBvcnRzIExBUiB1cGRhdGVzIHdpdGggZGlmZmVyZW50CisgKglzb3VyY2VzIGZvciB0aGUgTUNDLiBUaGlzIFRMViBiaXQgaXMgYSBmdXR1cmUgcmVwbGFjZW1lbnQgdG8KKyAqCUlXTF9VQ09ERV9UTFZfQVBJX1dJRklfTUNDX1VQREFURS4gV2hlbiBlaXRoZXIgaXMgc2V0LCBtdWx0aS1zb3VyY2UgTEFSCisgKglpcyBzdXBwb3J0ZWQuCisgKiBASVdMX1VDT0RFX1RMVl9DQVBBX0JUX0NPRVhfUlJDOiBzdXBwb3J0cyBCVCBDb2V4IFJSQwogICovCiBlbnVtIGl3bF91Y29kZV90bHZfY2FwYSB7CiAJSVdMX1VDT0RFX1RMVl9DQVBBX0QwSTNfU1VQUE9SVAkJCT0gQklUKDApLApAQCAtMjk4LDYgKzMwOSwxMCBAQAogCUlXTF9VQ09ERV9UTFZfQ0FQQV9EUUFfU1VQUE9SVAkJCT0gQklUKDEyKSwKIAlJV0xfVUNPREVfVExWX0NBUEFfVERMU19DSEFOTkVMX1NXSVRDSAkJPSBCSVQoMTMpLAogCUlXTF9VQ09ERV9UTFZfQ0FQQV9IT1RTUE9UX1NVUFBPUlQJCT0gQklUKDE4KSwKKwlJV0xfVUNPREVfVExWX0NBUEFfUkFESU9fQkVBQ09OX1NUQVRTCQk9IEJJVCgyMiksCisJSVdMX1VDT0RFX1RMVl9DQVBBX0JUX0NPRVhfUExDUgkJCT0gQklUKDI4KSwKKwlJV0xfVUNPREVfVExWX0NBUEFfTEFSX01VTFRJX01DQwkJPSBCSVQoMjkpLAorCUlXTF9VQ09ERV9UTFZfQ0FQQV9CVF9DT0VYX1JSQwkJCT0gQklUKDMwKSwKIH07CiAKIC8qIFRoZSBkZWZhdWx0IGNhbGlicmF0ZSB0YWJsZSBzaXplIGlmIG5vdCBzcGVjaWZpZWQgYnkgZmlybXdhcmUgZmlsZSAqLwpAQCAtNDUwLDQ0ICs0NjUsMjA3IEBACiB9IF9fcGFja2VkOwogCiAvKioKLSAqIHN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXIgLSBhIFRMViB0aGF0IGRlc2NyaWJlcyBhIGRlYnVnIGNvbmZpZ3VyYXRpb24KKyAqIGVudW0gaXdsX2Z3X2RiZ190cmlnZ2VyX21vZGUgLSB0cmlnZ2VycyBmdW5jdGlvbmFsaXRpZXMKICAqCi0gKiBAZW5hYmxlZDogaXMgdGhpcyB0cmlnZ2VyIGVuYWJsZWQKLSAqIEByZXNlcnZlZDoKLSAqIEBsZW46IGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSAldHJpZ2dlciBmaWVsZAotICogQHRyaWdnZXI6IHBvaW50ZXIgdG8gYSB0cmlnZ2VyIHN0cnVjdAorICogQElXTF9GV19EQkdfVFJJR0dFUl9TVEFSVDogd2hlbiB0cmlnZ2VyIG9jY3VycyByZS1jb25mIHRoZSBkYmcgbWVjaGFuaXNtCisgKiBASVdMX0ZXX0RCR19UUklHR0VSX1NUT1A6IHdoZW4gdHJpZ2dlciBvY2N1cnMgcHVsbCB0aGUgZGJnIGRhdGEKICAqLwotc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlciB7Ci0JdTggZW5hYmxlZDsKLQl1OCByZXNlcnZlZDsKLQl1OCBsZW47Ci0JdTggdHJpZ2dlclswXTsKLX0gX19wYWNrZWQ7Ci0KLS8qKgotICogZW51bSBpd2xfZndfZGJnX2NvbmYgLSBjb25maWd1cmF0aW9ucyBhdmFpbGFibGUKLSAqCi0gKiBARldfREJHX0NVU1RPTTogdGFrZSB0aGlzIGNvbmZpZ3VyYXRpb24gZnJvbSBhbGl2ZQotICoJTm90ZSB0aGF0IHRoZSB0cmlnZ2VyIGlzIE5PLU9QIGZvciB0aGlzIGNvbmZpZ3VyYXRpb24KLSAqLwotZW51bSBpd2xfZndfZGJnX2NvbmYgewotCUZXX0RCR19DVVNUT00gPSAwLAotCi0JLyogbXVzdCBiZSBsYXN0ICovCi0JRldfREJHX01BWCwKLQlGV19EQkdfSU5WQUxJRCA9IDB4ZmYsCitlbnVtIGl3bF9md19kYmdfdHJpZ2dlcl9tb2RlIHsKKwlJV0xfRldfREJHX1RSSUdHRVJfU1RBUlQgPSBCSVQoMCksCisJSVdMX0ZXX0RCR19UUklHR0VSX1NUT1AgPSBCSVQoMSksCiB9OwogCiAvKioKLSAqIHN0cnVjdCBpd2xfZndfZGJnX2NvbmZfdGx2IC0gYSBUTFYgdGhhdCBkZXNjcmliZXMgYSBkZWJ1ZyBjb25maWd1cmF0aW9uCisgKiBlbnVtIGl3bF9md19kYmdfdHJpZ2dlcl92aWZfdHlwZSAtIGRlZmluZSB0aGUgVklGIHR5cGUgZm9yIGEgdHJpZ2dlcgorICogQElXTF9GV19EQkdfQ09ORl9WSUZfQU5ZOiBhbnkgdmlmIHR5cGUKKyAqIEBJV0xfRldfREJHX0NPTkZfVklGX0lCU1M6IElCU1MgbW9kZQorICogQElXTF9GV19EQkdfQ09ORl9WSUZfU1RBVElPTjogQlNTIG1vZGUKKyAqIEBJV0xfRldfREJHX0NPTkZfVklGX0FQOiBBUCBtb2RlCisgKiBASVdMX0ZXX0RCR19DT05GX1ZJRl9QMlBfQ0xJRU5UOiBQMlAgQ2xpZW50IG1vZGUKKyAqIEBJV0xfRldfREJHX0NPTkZfVklGX1AyUF9HTzogUDJQIEdPIG1vZGUKKyAqIEBJV0xfRldfREJHX0NPTkZfVklGX1AyUF9ERVZJQ0U6IFAyUCBkZXZpY2UKKyAqLworZW51bSBpd2xfZndfZGJnX3RyaWdnZXJfdmlmX3R5cGUgeworCUlXTF9GV19EQkdfQ09ORl9WSUZfQU5ZID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQsCisJSVdMX0ZXX0RCR19DT05GX1ZJRl9JQlNTID0gTkw4MDIxMV9JRlRZUEVfQURIT0MsCisJSVdMX0ZXX0RCR19DT05GX1ZJRl9TVEFUSU9OID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiwKKwlJV0xfRldfREJHX0NPTkZfVklGX0FQID0gTkw4MDIxMV9JRlRZUEVfQVAsCisJSVdMX0ZXX0RCR19DT05GX1ZJRl9QMlBfQ0xJRU5UID0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCwKKwlJV0xfRldfREJHX0NPTkZfVklGX1AyUF9HTyA9IE5MODAyMTFfSUZUWVBFX1AyUF9HTywKKwlJV0xfRldfREJHX0NPTkZfVklGX1AyUF9ERVZJQ0UgPSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RsdiAtIGEgVExWIHRoYXQgZGVzY3JpYmVzIHRoZSB0cmlnZ2VyCisgKiBAaWQ6ICVlbnVtIGl3bF9md19kYmdfdHJpZ2dlcgorICogQHZpZl90eXBlOiAlZW51bSBpd2xfZndfZGJnX3RyaWdnZXJfdmlmX3R5cGUKKyAqIEBzdG9wX2NvbmZfaWRzOiBiaXRtYXAgb2YgY29uZmlndXJhdGlvbnMgdGhpcyB0cmlnZ2VyIHJlbGF0ZXMgdG8uCisgKglpZiB0aGUgbW9kZSBpcyAlSVdMX0ZXX0RCR19UUklHR0VSX1NUT1AsIHRoZW4gaWYgdGhlIGJpdCBjb3JyZXNwb25kaW5nCisgKgl0byB0aGUgY3VycmVudGx5IHJ1bm5pbmcgY29uZmlndXJhdGlvbiBpcyBzZXQsIHRoZSBkYXRhIHNob3VsZCBiZQorICoJY29sbGVjdGVkLgorICogQHN0b3BfZGVsYXk6IGhvdyBtYW55IG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBjb2xsZWN0aW5nIHRoZSBkYXRhCisgKglhZnRlciB0aGUgU1RPUCB0cmlnZ2VyIGZpcmVzLgorICogQG1vZGU6ICVlbnVtIGl3bF9md19kYmdfdHJpZ2dlcl9tb2RlIC0gY2FuIGJlIHN0b3AgLyBzdGFydCBvZiBib3RoCisgKiBAc3RhcnRfY29uZl9pZDogaWYgbW9kZSBpcyAlSVdMX0ZXX0RCR19UUklHR0VSX1NUQVJULCB0aGlzIGRlZmluZXMgd2hhdAorICoJY29uZmlndXJhdGlvbiBzaG91bGQgYmUgYXBwbGllZCB3aGVuIHRoZSB0cmlnZ2VycyBraWNrcyBpbi4KKyAqIEBvY2N1cnJlbmNlczogbnVtYmVyIG9mIG9jY3VycmVuY2VzLiAwIG1lYW5zIHRoZSB0cmlnZ2VyIHdpbGwgbmV2ZXIgZmlyZS4KKyAqLworc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl90bHYgeworCV9fbGUzMiBpZDsKKwlfX2xlMzIgdmlmX3R5cGU7CisJX19sZTMyIHN0b3BfY29uZl9pZHM7CisJX19sZTMyIHN0b3BfZGVsYXk7CisJdTggbW9kZTsKKwl1OCBzdGFydF9jb25mX2lkOworCV9fbGUxNiBvY2N1cnJlbmNlczsKKwlfX2xlMzIgcmVzZXJ2ZWRbMl07CisKKwl1OCBkYXRhWzBdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBGV19EQkdfU1RBUlRfRlJPTV9BTElWRQkwCisjZGVmaW5lIEZXX0RCR19DT05GX01BWAkJMzIKKyNkZWZpbmUgRldfREJHX0lOVkFMSUQJCTB4ZmYKKworLyoqCisgKiBzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX21pc3NlZF9iY29uIC0gY29uZmlndXJlcyB0cmlnZ2VyIGZvciBtaXNzZWQgYmVhY29ucworICogQHN0b3BfY29uc2VjX21pc3NlZF9iY29uOiBzdG9wIHJlY29yZGluZyBpZiB0aHJlc2hvbGQgaXMgY3Jvc3NlZC4KKyAqIEBzdG9wX2NvbnNlY19taXNzZWRfYmNvbl9zaW5jZV9yeDogc3RvcCByZWNvcmRpbmcgaWYgdGhyZXNob2xkIGlzIGNyb3NzZWQuCisgKiBAc3RhcnRfY29uc2VjX21pc3NlZF9iY29uOiBzdGFydCByZWNvcmRpbmcgaWYgdGhyZXNob2xkIGlzIGNyb3NzZWQuCisgKiBAc3RhcnRfY29uc2VjX21pc3NlZF9iY29uX3NpbmNlX3J4OiBzdGFydCByZWNvcmRpbmcgaWYgdGhyZXNob2xkIGlzIGNyb3NzZWQuCisgKiBAcmVzZXJ2ZWQxOiByZXNlcnZlZAorICogQHJlc2VydmVkMjogcmVzZXJ2ZWQKKyAqLworc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl9taXNzZWRfYmNvbiB7CisJX19sZTMyIHN0b3BfY29uc2VjX21pc3NlZF9iY29uOworCV9fbGUzMiBzdG9wX2NvbnNlY19taXNzZWRfYmNvbl9zaW5jZV9yeDsKKwlfX2xlMzIgcmVzZXJ2ZWQyWzJdOworCV9fbGUzMiBzdGFydF9jb25zZWNfbWlzc2VkX2Jjb247CisJX19sZTMyIHN0YXJ0X2NvbnNlY19taXNzZWRfYmNvbl9zaW5jZV9yeDsKKwlfX2xlMzIgcmVzZXJ2ZWQxWzJdOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX2NtZCAtIGNvbmZpZ3VyZXMgdHJpZ2dlciBmb3IgbWVzc2FnZXMgZnJvbSBGVy4KKyAqIGNtZHM6IHRoZSBsaXN0IG9mIGNvbW1hbmRzIHRvIHRyaWdnZXIgdGhlIGNvbGxlY3Rpb24gb24KKyAqLworc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl9jbWQgeworCXN0cnVjdCBjbWQgeworCQl1OCBjbWRfaWQ7CisJCXU4IGdyb3VwX2lkOworCX0gX19wYWNrZWQgY21kc1sxNl07Cit9IF9fcGFja2VkOworCisvKioKKyAqIGl3bF9md19kYmdfdHJpZ2dlcl9zdGF0cyAtIGNvbmZpZ3VyZXMgdHJpZ2dlciBmb3Igc3RhdGlzdGljcworICogQHN0b3Bfb2Zmc2V0OiB0aGUgb2Zmc2V0IG9mIHRoZSB2YWx1ZSB0byBiZSBtb25pdG9yZWQKKyAqIEBzdG9wX3RocmVzaG9sZDogdGhlIHRocmVzaG9sZCBhYm92ZSB3aGljaCB0byBjb2xsZWN0CisgKiBAc3RhcnRfb2Zmc2V0OiB0aGUgb2Zmc2V0IG9mIHRoZSB2YWx1ZSB0byBiZSBtb25pdG9yZWQKKyAqIEBzdGFydF90aHJlc2hvbGQ6IHRoZSB0aHJlc2hvbGQgYWJvdmUgd2hpY2ggdG8gc3RhcnQgcmVjb3JkaW5nCisgKi8KK3N0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfc3RhdHMgeworCV9fbGUzMiBzdG9wX29mZnNldDsKKwlfX2xlMzIgc3RvcF90aHJlc2hvbGQ7CisJX19sZTMyIHN0YXJ0X29mZnNldDsKKwlfX2xlMzIgc3RhcnRfdGhyZXNob2xkOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX2xvd19yc3NpIC0gdHJpZ2dlciBmb3IgbG93IGJlYWNvbiBSU1NJCisgKiBAcnNzaTogUlNTSSB2YWx1ZSB0byB0cmlnZ2VyIGF0CisgKi8KK3N0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfbG93X3Jzc2kgeworCV9fbGUzMiByc3NpOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX21sbWUgLSBjb25maWd1cmVzIHRyaWdnZXIgZm9yIG1sbWUgZXZlbnRzCisgKiBAc3RvcF9hdXRoX2RlbmllZDogbnVtYmVyIG9mIGRlbmllZCBhdXRoZW50aWNhdGlvbiB0byBjb2xsZWN0CisgKiBAc3RvcF9hdXRoX3RpbWVvdXQ6IG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiB0aW1lb3V0IHRvIGNvbGxlY3QKKyAqIEBzdG9wX3J4X2RlYXV0aDogbnVtYmVyIG9mIFJ4IGRlYXV0aCBiZWZvcmUgdG8gY29sbGVjdAorICogQHN0b3BfdHhfZGVhdXRoOiBudW1iZXIgb2YgVHggZGVhdXRoIGJlZm9yZSB0byBjb2xsZWN0CisgKiBAc3RvcF9hc3NvY19kZW5pZWQ6IG51bWJlciBvZiBkZW5pZWQgYXNzb2NpYXRpb24gdG8gY29sbGVjdAorICogQHN0b3BfYXNzb2NfdGltZW91dDogbnVtYmVyIG9mIGFzc29jaWF0aW9uIHRpbWVvdXQgdG8gY29sbGVjdAorICogQHN0b3BfY29ubmVjdGlvbl9sb3NzOiBudW1iZXIgb2YgY29ubmVjdGlvbiBsb3NzIHRvIGNvbGxlY3QKKyAqIEBzdGFydF9hdXRoX2RlbmllZDogbnVtYmVyIG9mIGRlbmllZCBhdXRoZW50aWNhdGlvbiB0byBzdGFydCByZWNvcmRpbmcKKyAqIEBzdGFydF9hdXRoX3RpbWVvdXQ6IG51bWJlciBvZiBhdXRoZW50aWNhdGlvbiB0aW1lb3V0IHRvIHN0YXJ0IHJlY29yZGluZworICogQHN0YXJ0X3J4X2RlYXV0aDogbnVtYmVyIG9mIFJ4IGRlYXV0aCB0byBzdGFydCByZWNvcmRpbmcKKyAqIEBzdGFydF90eF9kZWF1dGg6IG51bWJlciBvZiBUeCBkZWF1dGggdG8gc3RhcnQgcmVjb3JkaW5nCisgKiBAc3RhcnRfYXNzb2NfZGVuaWVkOiBudW1iZXIgb2YgZGVuaWVkIGFzc29jaWF0aW9uIHRvIHN0YXJ0IHJlY29yZGluZworICogQHN0YXJ0X2Fzc29jX3RpbWVvdXQ6IG51bWJlciBvZiBhc3NvY2lhdGlvbiB0aW1lb3V0IHRvIHN0YXJ0IHJlY29yZGluZworICogQHN0YXJ0X2Nvbm5lY3Rpb25fbG9zczogbnVtYmVyIG9mIGNvbm5lY3Rpb24gbG9zcyB0byBzdGFydCByZWNvcmRpbmcKKyAqLworc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl9tbG1lIHsKKwl1OCBzdG9wX2F1dGhfZGVuaWVkOworCXU4IHN0b3BfYXV0aF90aW1lb3V0OworCXU4IHN0b3BfcnhfZGVhdXRoOworCXU4IHN0b3BfdHhfZGVhdXRoOworCisJdTggc3RvcF9hc3NvY19kZW5pZWQ7CisJdTggc3RvcF9hc3NvY190aW1lb3V0OworCXU4IHN0b3BfY29ubmVjdGlvbl9sb3NzOworCXU4IHJlc2VydmVkOworCisJdTggc3RhcnRfYXV0aF9kZW5pZWQ7CisJdTggc3RhcnRfYXV0aF90aW1lb3V0OworCXU4IHN0YXJ0X3J4X2RlYXV0aDsKKwl1OCBzdGFydF90eF9kZWF1dGg7CisKKwl1OCBzdGFydF9hc3NvY19kZW5pZWQ7CisJdTggc3RhcnRfYXNzb2NfdGltZW91dDsKKwl1OCBzdGFydF9jb25uZWN0aW9uX2xvc3M7CisJdTggcmVzZXJ2ZWQyOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3R4cV90aW1lciAtIGNvbmZpZ3VyZXMgdGhlIFR4IHF1ZXVlJ3MgdGltZXIKKyAqIEBjb21tYW5kX3F1ZXVlOiB0aW1lb3V0IGZvciB0aGUgY29tbWFuZCBxdWV1ZSBpbiBtcworICogQGJzczogdGltZW91dCBmb3IgdGhlIHF1ZXVlcyBvZiBhIEJTUyAoZXhjZXB0IGZvciBURExTIHF1ZXVlcykgaW4gbXMKKyAqIEBzb2Z0YXA6IHRpbWVvdXQgZm9yIHRoZSBxdWV1ZXMgb2YgYSBzb2Z0QVAgaW4gbXMKKyAqIEBwMnBfZ286IHRpbWVvdXQgZm9yIHRoZSBxdWV1ZXMgb2YgYSBQMlAgR08gaW4gbXMKKyAqIEBwMnBfY2xpZW50OiB0aW1lb3V0IGZvciB0aGUgcXVldWVzIG9mIGEgUDJQIGNsaWVudCBpbiBtcworICogQHAycF9kZXZpY2U6IHRpbWVvdXQgZm9yIHRoZSBxdWV1ZXMgb2YgYSBQMlAgZGV2aWNlIGluIG1zCisgKiBAaWJzczogdGltZW91dCBmb3IgdGhlIHF1ZXVlcyBvZiBhbiBJQlNTIGluIG1zCisgKiBAdGRsczogdGltZW91dCBmb3IgdGhlIHF1ZXVlcyBvZiBhIFRETFMgc3RhdGlvbiBpbiBtcworICovCitzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3R4cV90aW1lciB7CisJX19sZTMyIGNvbW1hbmRfcXVldWU7CisJX19sZTMyIGJzczsKKwlfX2xlMzIgc29mdGFwOworCV9fbGUzMiBwMnBfZ287CisJX19sZTMyIHAycF9jbGllbnQ7CisJX19sZTMyIHAycF9kZXZpY2U7CisJX19sZTMyIGlic3M7CisJX19sZTMyIHRkbHM7CisJX19sZTMyIHJlc2VydmVkWzRdOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RpbWVfZXZlbnQgLSBjb25maWd1cmVzIGEgdGltZSBldmVudCB0cmlnZ2VyCisgKiB0aW1lX0V2ZW50czogYSBsaXN0IG9mIHR1cGxlcyA8aWQsIGFjdGlvbl9iaXRtYXA+LiBUaGUgZHJpdmVyIHdpbGwgaXNzdWUgYQorICoJdHJpZ2dlciBlYWNoIHRpbWUgYSB0aW1lIGV2ZW50IG5vdGlmaWNhdGlvbiB0aGF0IHJlbGF0ZXMgdG8gdGltZSBldmVudAorICoJaWQgd2l0aCBvbmUgb2YgdGhlIGFjdGlvbnMgaW4gdGhlIGJpdG1hcCBpcyByZWNlaXZlZCBhbmQKKyAqCUJJVChub3RpZi0+c3RhdHVzKSBpcyBzZXQgaW4gc3RhdHVzX2JpdG1hcC4KICAqCi0gKiBAaWQ6ICVlbnVtIGl3bF9md19kYmdfY29uZgorICovCitzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RpbWVfZXZlbnQgeworCXN0cnVjdCB7CisJCV9fbGUzMiBpZDsKKwkJX19sZTMyIGFjdGlvbl9iaXRtYXA7CisJCV9fbGUzMiBzdGF0dXNfYml0bWFwOworCX0gX19wYWNrZWQgdGltZV9ldmVudHNbMTZdOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgaXdsX2Z3X2RiZ19jb25mX3RsdiAtIGEgVExWIHRoYXQgZGVzY3JpYmVzIGEgZGVidWcgY29uZmlndXJhdGlvbi4KKyAqIEBpZDogY29uZiBpZAogICogQHVzbmlmZmVyOiBzaG91bGQgdGhlIHVTbmlmZmVyIGltYWdlIGJlIHVzZWQKICAqIEBudW1fb2ZfaGNtZHM6IGhvdyBtYW55IEhDTURzIHRvIHNlbmQgYXJlIHByZXNlbnQgaGVyZQogICogQGhjbWQ6IGEgdmFyaWFibGUgbGVuZ3RoIGhvc3QgY29tbWFuZCB0byBiZSBzZW50IHRvIGFwcGx5IHRoZSBjb25maWd1cmF0aW9uLgogICoJSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBIQ01EIHRvIHNlbmQsIHRoZXkgd2lsbCBhcHBlYXIgb25lIGFmdGVyIHRoZQogICoJb3RoZXIgYW5kIGJlIHNlbnQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcHBlYXIgaW4uCi0gKiBUaGlzIHBhcnNlcyBJV0xfVUNPREVfVExWX0ZXX0RCR19DT05GCisgKiBUaGlzIHBhcnNlcyBJV0xfVUNPREVfVExWX0ZXX0RCR19DT05GLiBUaGUgdXNlciBjYW4gYWRkIHVwLXRvCisgKiAlRldfREJHX0NPTkZfTUFYIGNvbmZpZ3VyYXRpb24gcGVyIHJ1bi4KICAqLwogc3RydWN0IGl3bF9md19kYmdfY29uZl90bHYgewogCXU4IGlkOwpAQCAtNDk1LDggKzY3Myw2IEBACiAJdTggcmVzZXJ2ZWQ7CiAJdTggbnVtX29mX2hjbWRzOwogCXN0cnVjdCBpd2xfZndfZGJnX2NvbmZfaGNtZCBoY21kOwotCi0JLyogc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlciBzaXRzIGFmdGVyIGFsbCB2YXJpYWJsZSBsZW5ndGggaGNtZHMgKi8KIH0gX19wYWNrZWQ7CiAKICNlbmRpZiAgLyogX19pd2xfZndfZmlsZV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWZ3LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1mdy5oCmluZGV4IGZmZDc4NWMuLmNmNzViYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWZ3LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZncuaApAQCAtNjgsNiArNjgsNyBAQAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCiAjaW5jbHVkZSAiaXdsLWZ3LWZpbGUuaCIKKyNpbmNsdWRlICJpd2wtZnctZXJyb3ItZHVtcC5oIgogCiAvKioKICAqIGVudW0gaXdsX3Vjb2RlX3R5cGUKQEAgLTE1Nyw2ICsxNTgsOCBAQAogICogQGRiZ19kZXN0X3RsdjogcG9pbnRzIHRvIHRoZSBkZXN0aW5hdGlvbiBUTFYgZm9yIGRlYnVnCiAgKiBAZGJnX2NvbmZfdGx2OiBhcnJheSBvZiBwb2ludGVycyB0byBjb25maWd1cmF0aW9uIFRMVnMgZm9yIGRlYnVnCiAgKiBAZGJnX2NvbmZfdGx2X2xlbjogbGVuZ3RocyBvZiB0aGUgQGRiZ19jb25mX3RsdiBlbnRyaWVzCisgKiBAZGJnX3RyaWdnZXJfdGx2OiBhcnJheSBvZiBwb2ludGVycyB0byB0cmlnZ2VycyBUTFZzCisgKiBAZGJnX3RyaWdnZXJfdGx2X2xlbjogbGVuZ3RocyBvZiB0aGUgQGRiZ190cmlnZ2VyX3RsdiBlbnRyaWVzCiAgKiBAZGJnX2Rlc3RfcmVnX251bTogbnVtIG9mIHJlZ19vcHMgaW4gJWRiZ19kZXN0X3RsdgogICovCiBzdHJ1Y3QgaXdsX2Z3IHsKQEAgLTE4Niw5ICsxODksMTAgQEAKIAl1MzIgc2Rpb19hZG1hX2FkZHI7CiAKIAlzdHJ1Y3QgaXdsX2Z3X2RiZ19kZXN0X3RsdiAqZGJnX2Rlc3RfdGx2OwotCXN0cnVjdCBpd2xfZndfZGJnX2NvbmZfdGx2ICpkYmdfY29uZl90bHZbRldfREJHX01BWF07Ci0Jc2l6ZV90IGRiZ19jb25mX3Rsdl9sZW5bRldfREJHX01BWF07Ci0KKwlzdHJ1Y3QgaXdsX2Z3X2RiZ19jb25mX3RsdiAqZGJnX2NvbmZfdGx2W0ZXX0RCR19DT05GX01BWF07CisJc2l6ZV90IGRiZ19jb25mX3Rsdl9sZW5bRldfREJHX0NPTkZfTUFYXTsKKwlzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RsdiAqZGJnX3RyaWdnZXJfdGx2W0ZXX0RCR19UUklHR0VSX01BWF07CisJc2l6ZV90IGRiZ190cmlnZ2VyX3Rsdl9sZW5bRldfREJHX1RSSUdHRVJfTUFYXTsKIAl1OCBkYmdfZGVzdF9yZWdfbnVtOwogfTsKIApAQCAtMjA2LDM3ICsyMTAsNiBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBjb25zdCBzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyICoKLWl3bF9md19kYmdfY29uZl9nZXRfdHJpZ2dlcihjb25zdCBzdHJ1Y3QgaXdsX2Z3ICpmdywgdTggaWQpCi17Ci0JY29uc3Qgc3RydWN0IGl3bF9md19kYmdfY29uZl90bHYgKmNvbmZfdGx2ID0gZnctPmRiZ19jb25mX3RsdltpZF07Ci0JdTggKnB0cjsKLQlpbnQgaTsKLQotCWlmICghY29uZl90bHYpCi0JCXJldHVybiBOVUxMOwotCi0JcHRyID0gKHZvaWQgKikmY29uZl90bHYtPmhjbWQ7Ci0JZm9yIChpID0gMDsgaSA8IGNvbmZfdGx2LT5udW1fb2ZfaGNtZHM7IGkrKykgewotCQlwdHIgKz0gc2l6ZW9mKGNvbmZfdGx2LT5oY21kKTsKLQkJcHRyICs9IGxlMTZfdG9fY3B1KGNvbmZfdGx2LT5oY21kLmxlbik7Ci0JfQotCi0JcmV0dXJuIChjb25zdCBzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyICopcHRyOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wKLWl3bF9md19kYmdfY29uZl9lbmFibGVkKGNvbnN0IHN0cnVjdCBpd2xfZncgKmZ3LCB1OCBpZCkKLXsKLQljb25zdCBzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyICp0cmlnZ2VyID0KLQkJaXdsX2Z3X2RiZ19jb25mX2dldF90cmlnZ2VyKGZ3LCBpZCk7Ci0KLQlpZiAoIXRyaWdnZXIpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cmlnZ2VyLT5lbmFibGVkOwotfQotCiBzdGF0aWMgaW5saW5lIGJvb2wKIGl3bF9md19kYmdfY29uZl91c25pZmZlcihjb25zdCBzdHJ1Y3QgaXdsX2Z3ICpmdywgdTggaWQpCiB7CkBAIC0yNDgsNCArMjIxLDE4IEBACiAJcmV0dXJuIGNvbmZfdGx2LT51c25pZmZlcjsKIH0KIAorI2RlZmluZSBpd2xfZndfZGJnX3RyaWdnZXJfZW5hYmxlZChmdywgaWQpICh7CQkJXAorCXZvaWQgKl9fZGJnX3RyaWdnZXIgPSAoZncpLT5kYmdfdHJpZ2dlcl90bHZbKGlkKV07CVwKKwl1bmxpa2VseShfX2RiZ190cmlnZ2VyKTsJCQkJXAorfSkKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RsdioKK2l3bF9md19kYmdfZ2V0X3RyaWdnZXIoY29uc3Qgc3RydWN0IGl3bF9mdyAqZncsIHU4IGlkKQoreworCWlmIChXQVJOX09OKGlkID49IEFSUkFZX1NJWkUoZnctPmRiZ190cmlnZ2VyX3RsdikpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBmdy0+ZGJnX3RyaWdnZXJfdGx2W2lkXTsKK30KKwogI2VuZGlmICAvKiBfX2l3bF9md19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5jCmluZGV4IDAzMjUwYTQuLjI3YzY2ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaW8uYwpAQCAtMTg2LDIxICsxODYsMTYgQEAKIAogdm9pZCBpd2xfZm9yY2Vfbm1pKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQogewotCS8qCi0JICogSW4gSFcgcHJldmlvdXMgdG8gdGhlIDgwMDAgSFcgZmFtaWx5LCBhbmQgaW4gdGhlIDgwMDAgSFcgZmFtaWx5Ci0JICogaXRzZWxmIHdoZW4gdGhlIHJldmlzaW9uIHN0ZXA9PTAsIHRoZSBERVZJQ0VfU0VUX05NSV9SRUcgaXMgdXNlZAotCSAqIHRvIGZvcmNlIGFuIE5NSS4gT3RoZXJ3aXNlLCBhIGRpZmZlcmVudCByZWdpc3RlciAtCi0JICogREVWSUNFX1NFVF9OTUlfODAwMEJfUkVHIC0gaXMgdXNlZC4KLQkgKi8KLQlpZiAoKHRyYW5zLT5jZmctPmRldmljZV9mYW1pbHkgIT0gSVdMX0RFVklDRV9GQU1JTFlfODAwMCkgfHwKLQkgICAgKENTUl9IV19SRVZfU1RFUCh0cmFucy0+aHdfcmV2KSA9PSBTSUxJQ09OX0FfU1RFUCkpIHsKKwlpZiAodHJhbnMtPmNmZy0+ZGV2aWNlX2ZhbWlseSAhPSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKSB7CiAJCWl3bF93cml0ZV9wcnBoKHRyYW5zLCBERVZJQ0VfU0VUX05NSV9SRUcsCiAJCQkgICAgICAgREVWSUNFX1NFVF9OTUlfVkFMX0RSVik7CiAJCWl3bF93cml0ZV9wcnBoKHRyYW5zLCBERVZJQ0VfU0VUX05NSV9SRUcsCiAJCQkgICAgICAgREVWSUNFX1NFVF9OTUlfVkFMX0hXKTsKIAl9IGVsc2UgewotCQlpd2xfd3JpdGVfcHJwaCh0cmFucywgREVWSUNFX1NFVF9OTUlfODAwMEJfUkVHLAotCQkJICAgICAgIERFVklDRV9TRVRfTk1JXzgwMDBCX1ZBTCk7CisJCWl3bF93cml0ZV9wcnBoKHRyYW5zLCBERVZJQ0VfU0VUX05NSV84MDAwX1JFRywKKwkJCSAgICAgICBERVZJQ0VfU0VUX05NSV84MDAwX1ZBTCk7CisJCWl3bF93cml0ZV9wcnBoKHRyYW5zLCBERVZJQ0VfU0VUX05NSV9SRUcsCisJCQkgICAgICAgREVWSUNFX1NFVF9OTUlfVkFMX0RSVik7CiAJfQogfQogSVdMX0VYUE9SVF9TWU1CT0woaXdsX2ZvcmNlX25taSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1tb2RwYXJhbXMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW1vZHBhcmFtcy5oCmluZGV4IGU4ZWFiZDIuLmFjMmI5MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW1vZHBhcmFtcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW1vZHBhcmFtcy5oCkBAIC0xMDMsNiArMTAzLDcgQEAKICAqIEBkZWJ1Z19sZXZlbDogbGV2ZWxzIGFyZSBJV0xfRExfKgogICogQGFudF9jb3VwbGluZzogYW50ZW5uYSBjb3VwbGluZyBpbiBkQiwgZGVmYXVsdCA9IDAKICAqIEBkMGkzX2Rpc2FibGU6IGRpc2FibGUgZDBpMywgZGVmYXVsdCA9IDEsCisgKiBAbGFyX2Rpc2FibGU6IGRpc2FibGUgTEFSIChyZWd1bGF0b3J5KSwgZGVmYXVsdCA9IDAKICAqIEBmd19tb25pdG9yOiBhbGxvdyB0byB1c2UgZmlybXdhcmUgbW9uaXRvcgogICovCiBzdHJ1Y3QgaXdsX21vZF9wYXJhbXMgewpAQCAtMTIxLDYgKzEyMiw3IEBACiAJY2hhciAqbnZtX2ZpbGU7CiAJYm9vbCB1YXBzZF9kaXNhYmxlOwogCWJvb2wgZDBpM19kaXNhYmxlOworCWJvb2wgbGFyX2Rpc2FibGU7CiAJYm9vbCBmd19tb25pdG9yOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1udm0tcGFyc2UuYwppbmRleCBjNzRmMWE0Li44MzkwM2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1udm0tcGFyc2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1udm0tcGFyc2UuYwpAQCAtOTksMTIgKzk5LDE1IEBACiAJLyogTlZNIFNXLVNlY3Rpb24gb2Zmc2V0IChpbiB3b3JkcykgZGVmaW5pdGlvbnMgKi8KIAlOVk1fU1dfU0VDVElPTl9GQU1JTFlfODAwMCA9IDB4MUMwLAogCU5WTV9WRVJTSU9OX0ZBTUlMWV84MDAwID0gMCwKLQlSQURJT19DRkdfRkFNSUxZXzgwMDAgPSAyLAotCVNLVV9GQU1JTFlfODAwMCA9IDQsCi0JTl9IV19BRERSU19GQU1JTFlfODAwMCA9IDUsCisJUkFESU9fQ0ZHX0ZBTUlMWV84MDAwID0gMCwKKwlTS1VfRkFNSUxZXzgwMDAgPSAyLAorCU5fSFdfQUREUlNfRkFNSUxZXzgwMDAgPSAzLAogCiAJLyogTlZNIFJFR1VMQVRPUlkgLVNlY3Rpb24gb2Zmc2V0IChpbiB3b3JkcykgZGVmaW5pdGlvbnMgKi8KIAlOVk1fQ0hBTk5FTFNfRkFNSUxZXzgwMDAgPSAwLAorCU5WTV9MQVJfT0ZGU0VUX0ZBTUlMWV84MDAwX09MRCA9IDB4NEM3LAorCU5WTV9MQVJfT0ZGU0VUX0ZBTUlMWV84MDAwID0gMHg1MDcsCisJTlZNX0xBUl9FTkFCTEVEX0ZBTUlMWV84MDAwID0gMHg3LAogCiAJLyogTlZNIGNhbGlicmF0aW9uIHNlY3Rpb24gb2Zmc2V0IChpbiB3b3JkcykgZGVmaW5pdGlvbnMgKi8KIAlOVk1fQ0FMSUJfU0VDVElPTl9GQU1JTFlfODAwMCA9IDB4MkI4LApAQCAtMTQ2LDcgKzE0OSw5IEBACiAjZGVmaW5lIE5VTV8yR0haX0NIQU5ORUxTX0ZBTUlMWV84MDAwCTE0CiAjZGVmaW5lIEZJUlNUXzJHSFpfSFRfTUlOVVMJCTUKICNkZWZpbmUgTEFTVF8yR0haX0hUX1BMVVMJCTkKLSNkZWZpbmUgTEFTVF81R0haX0hUCQkJMTYxCisjZGVmaW5lIExBU1RfNUdIWl9IVAkJCTE2NQorI2RlZmluZSBMQVNUXzVHSFpfSFRfRkFNSUxZXzgwMDAJMTgxCisjZGVmaW5lIE5fSFdfQUREUl9NQVNLCQkJMHhGCiAKIC8qIHJhdGUgZGF0YSAoc3RhdGljKSAqLwogc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBpd2xfY2ZnODAyMTFfcmF0ZXNbXSA9IHsKQEAgLTIwMSw5ICsyMDYsNTcgQEAKICNkZWZpbmUgQ0hFQ0tfQU5EX1BSSU5UX0koeCkJXAogCSgoY2hfZmxhZ3MgJiBOVk1fQ0hBTk5FTF8jI3gpID8gIyB4ICIgIiA6ICIiKQogCitzdGF0aWMgdTMyIGl3bF9nZXRfY2hhbm5lbF9mbGFncyh1OCBjaF9udW0sIGludCBjaF9pZHgsIGJvb2wgaXNfNWdoeiwKKwkJCQkgdTE2IG52bV9mbGFncywgY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZykKK3sKKwl1MzIgZmxhZ3MgPSBJRUVFODAyMTFfQ0hBTl9OT19IVDQwOworCXUzMiBsYXN0XzVnaHpfaHQgPSBMQVNUXzVHSFpfSFQ7CisKKwlpZiAoY2ZnLT5kZXZpY2VfZmFtaWx5ID09IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDApCisJCWxhc3RfNWdoel9odCA9IExBU1RfNUdIWl9IVF9GQU1JTFlfODAwMDsKKworCWlmICghaXNfNWdoeiAmJiAobnZtX2ZsYWdzICYgTlZNX0NIQU5ORUxfNDBNSFopKSB7CisJCWlmIChjaF9udW0gPD0gTEFTVF8yR0haX0hUX1BMVVMpCisJCQlmbGFncyAmPSB+SUVFRTgwMjExX0NIQU5fTk9fSFQ0MFBMVVM7CisJCWlmIChjaF9udW0gPj0gRklSU1RfMkdIWl9IVF9NSU5VUykKKwkJCWZsYWdzICY9IH5JRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVM7CisJfSBlbHNlIGlmIChjaF9udW0gPD0gbGFzdF81Z2h6X2h0ICYmIChudm1fZmxhZ3MgJiBOVk1fQ0hBTk5FTF80ME1IWikpIHsKKwkJaWYgKChjaF9pZHggLSBOVU1fMkdIWl9DSEFOTkVMUykgJSAyID09IDApCisJCQlmbGFncyAmPSB+SUVFRTgwMjExX0NIQU5fTk9fSFQ0MFBMVVM7CisJCWVsc2UKKwkJCWZsYWdzICY9IH5JRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVM7CisJfQorCWlmICghKG52bV9mbGFncyAmIE5WTV9DSEFOTkVMXzgwTUhaKSkKKwkJZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fTk9fODBNSFo7CisJaWYgKCEobnZtX2ZsYWdzICYgTlZNX0NIQU5ORUxfMTYwTUhaKSkKKwkJZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fTk9fMTYwTUhaOworCisJaWYgKCEobnZtX2ZsYWdzICYgTlZNX0NIQU5ORUxfSUJTUykpCisJCWZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX05PX0lSOworCisJaWYgKCEobnZtX2ZsYWdzICYgTlZNX0NIQU5ORUxfQUNUSVZFKSkKKwkJZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fTk9fSVI7CisKKwlpZiAobnZtX2ZsYWdzICYgTlZNX0NIQU5ORUxfUkFEQVIpCisJCWZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX1JBREFSOworCisJaWYgKG52bV9mbGFncyAmIE5WTV9DSEFOTkVMX0lORE9PUl9PTkxZKQorCQlmbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9JTkRPT1JfT05MWTsKKworCS8qIFNldCB0aGUgR08gY29uY3VycmVudCBmbGFnIG9ubHkgaW4gY2FzZSB0aGF0IE5PX0lSIGlzIHNldC4KKwkgKiBPdGhlcndpc2UgaXQgaXMgbWVhbmluZ2xlc3MKKwkgKi8KKwlpZiAoKG52bV9mbGFncyAmIE5WTV9DSEFOTkVMX0dPX0NPTkNVUlJFTlQpICYmCisJICAgIChmbGFncyAmIElFRUU4MDIxMV9DSEFOX05PX0lSKSkKKwkJZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fR09fQ09OQ1VSUkVOVDsKKworCXJldHVybiBmbGFnczsKK30KKwogc3RhdGljIGludCBpd2xfaW5pdF9jaGFubmVsX21hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmcsCiAJCQkJc3RydWN0IGl3bF9udm1fZGF0YSAqZGF0YSwKLQkJCQljb25zdCBfX2xlMTYgKiBjb25zdCBudm1fY2hfZmxhZ3MpCisJCQkJY29uc3QgX19sZTE2ICogY29uc3QgbnZtX2NoX2ZsYWdzLAorCQkJCWJvb2wgbGFyX3N1cHBvcnRlZCkKIHsKIAlpbnQgY2hfaWR4OwogCWludCBuX2NoYW5uZWxzID0gMDsKQEAgLTIyOCw5ICsyODEsMTQgQEAKIAogCQlpZiAoY2hfaWR4ID49IG51bV8yZ2h6X2NoYW5uZWxzICYmCiAJCSAgICAhZGF0YS0+c2t1X2NhcF9iYW5kXzUyR0h6X2VuYWJsZSkKLQkJCWNoX2ZsYWdzICY9IH5OVk1fQ0hBTk5FTF9WQUxJRDsKKwkJCWNvbnRpbnVlOwogCi0JCWlmICghKGNoX2ZsYWdzICYgTlZNX0NIQU5ORUxfVkFMSUQpKSB7CisJCWlmICghbGFyX3N1cHBvcnRlZCAmJiAhKGNoX2ZsYWdzICYgTlZNX0NIQU5ORUxfVkFMSUQpKSB7CisJCQkvKgorCQkJICogQ2hhbm5lbHMgbWlnaHQgYmVjb21lIHZhbGlkIGxhdGVyIGlmIGxhciBpcworCQkJICogc3VwcG9ydGVkLCBoZW5jZSB3ZSBzdGlsbCB3YW50IHRvIGFkZCB0aGVtIHRvCisJCQkgKiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY2hhbm5lbHMgdG8gY2ZnODAyMTEuCisJCQkgKi8KIAkJCUlXTF9ERUJVR19FRVBST00oZGV2LAogCQkJCQkgIkNoLiAlZCBGbGFncyAleCBbJXNHSHpdIC0gTm8gdHJhZmZpY1xuIiwKIAkJCQkJIG52bV9jaGFuW2NoX2lkeF0sCkBAIC0yNTAsNDUgKzMwOCw2IEBACiAJCQlpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koCiAJCQkJY2hhbm5lbC0+aHdfdmFsdWUsIGNoYW5uZWwtPmJhbmQpOwogCi0JCS8qIFRPRE86IE5lZWQgdG8gYmUgZGVwZW5kZW50IHRvIHRoZSBOVk0gKi8KLQkJY2hhbm5lbC0+ZmxhZ3MgPSBJRUVFODAyMTFfQ0hBTl9OT19IVDQwOwotCQlpZiAoY2hfaWR4IDwgbnVtXzJnaHpfY2hhbm5lbHMgJiYKLQkJICAgIChjaF9mbGFncyAmIE5WTV9DSEFOTkVMXzQwTUhaKSkgewotCQkJaWYgKG52bV9jaGFuW2NoX2lkeF0gPD0gTEFTVF8yR0haX0hUX1BMVVMpCi0JCQkJY2hhbm5lbC0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTOwotCQkJaWYgKG52bV9jaGFuW2NoX2lkeF0gPj0gRklSU1RfMkdIWl9IVF9NSU5VUykKLQkJCQljaGFubmVsLT5mbGFncyAmPSB+SUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTOwotCQl9IGVsc2UgaWYgKG52bV9jaGFuW2NoX2lkeF0gPD0gTEFTVF81R0haX0hUICYmCi0JCQkgICAoY2hfZmxhZ3MgJiBOVk1fQ0hBTk5FTF80ME1IWikpIHsKLQkJCWlmICgoY2hfaWR4IC0gbnVtXzJnaHpfY2hhbm5lbHMpICUgMiA9PSAwKQotCQkJCWNoYW5uZWwtPmZsYWdzICY9IH5JRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUzsKLQkJCWVsc2UKLQkJCQljaGFubmVsLT5mbGFncyAmPSB+SUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTOwotCQl9Ci0JCWlmICghKGNoX2ZsYWdzICYgTlZNX0NIQU5ORUxfODBNSFopKQotCQkJY2hhbm5lbC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fTk9fODBNSFo7Ci0JCWlmICghKGNoX2ZsYWdzICYgTlZNX0NIQU5ORUxfMTYwTUhaKSkKLQkJCWNoYW5uZWwtPmZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX05PXzE2ME1IWjsKLQotCQlpZiAoIShjaF9mbGFncyAmIE5WTV9DSEFOTkVMX0lCU1MpKQotCQkJY2hhbm5lbC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fTk9fSVI7Ci0KLQkJaWYgKCEoY2hfZmxhZ3MgJiBOVk1fQ0hBTk5FTF9BQ1RJVkUpKQotCQkJY2hhbm5lbC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fTk9fSVI7Ci0KLQkJaWYgKGNoX2ZsYWdzICYgTlZNX0NIQU5ORUxfUkFEQVIpCi0JCQljaGFubmVsLT5mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9SQURBUjsKLQotCQlpZiAoY2hfZmxhZ3MgJiBOVk1fQ0hBTk5FTF9JTkRPT1JfT05MWSkKLQkJCWNoYW5uZWwtPmZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX0lORE9PUl9PTkxZOwotCi0JCS8qIFNldCB0aGUgR08gY29uY3VycmVudCBmbGFnIG9ubHkgaW4gY2FzZSB0aGF0IE5PX0lSIGlzIHNldC4KLQkJICogT3RoZXJ3aXNlIGl0IGlzIG1lYW5pbmdsZXNzCi0JCSAqLwotCQlpZiAoKGNoX2ZsYWdzICYgTlZNX0NIQU5ORUxfR09fQ09OQ1VSUkVOVCkgJiYKLQkJICAgIChjaGFubmVsLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX05PX0lSKSkKLQkJCWNoYW5uZWwtPmZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX0dPX0NPTkNVUlJFTlQ7Ci0KIAkJLyogSW5pdGlhbGl6ZSByZWd1bGF0b3J5LWJhc2VkIHJ1bi10aW1lIGRhdGEgKi8KIAogCQkvKgpAQCAtMjk3LDYgKzMxNiwxNSBAQAogCQkgKi8KIAkJY2hhbm5lbC0+bWF4X3Bvd2VyID0gSVdMX0RFRkFVTFRfTUFYX1RYX1BPV0VSOwogCQlpc181Z2h6ID0gY2hhbm5lbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haOworCisJCS8qIGRvbid0IHB1dCBsaW1pdGF0aW9ucyBpbiBjYXNlIHdlJ3JlIHVzaW5nIExBUiAqLworCQlpZiAoIWxhcl9zdXBwb3J0ZWQpCisJCQljaGFubmVsLT5mbGFncyA9IGl3bF9nZXRfY2hhbm5lbF9mbGFncyhudm1fY2hhbltjaF9pZHhdLAorCQkJCQkJCSAgICAgICBjaF9pZHgsIGlzXzVnaHosCisJCQkJCQkJICAgICAgIGNoX2ZsYWdzLCBjZmcpOworCQllbHNlCisJCQljaGFubmVsLT5mbGFncyA9IDA7CisKIAkJSVdMX0RFQlVHX0VFUFJPTShkZXYsCiAJCQkJICJDaC4gJWQgWyVzR0h6XSAlcyVzJXMlcyVzJXMlcygweCUwMnggJWRkQm0pOiBBZC1Ib2MgJXNzdXBwb3J0ZWRcbiIsCiAJCQkJIGNoYW5uZWwtPmh3X3ZhbHVlLApAQCAtMzcwLDggKzM5OCw4IEBACiAKIHN0YXRpYyB2b2lkIGl3bF9pbml0X3NiYW5kcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmcsCiAJCQkgICAgc3RydWN0IGl3bF9udm1fZGF0YSAqZGF0YSwKLQkJCSAgICBjb25zdCBfX2xlMTYgKmNoX3NlY3Rpb24sIGJvb2wgZW5hYmxlX3ZodCwKLQkJCSAgICB1OCB0eF9jaGFpbnMsIHU4IHJ4X2NoYWlucykKKwkJCSAgICBjb25zdCBfX2xlMTYgKmNoX3NlY3Rpb24sCisJCQkgICAgdTggdHhfY2hhaW5zLCB1OCByeF9jaGFpbnMsIGJvb2wgbGFyX3N1cHBvcnRlZCkKIHsKIAlpbnQgbl9jaGFubmVsczsKIAlpbnQgbl91c2VkID0gMDsKQEAgLTM4MCwxMSArNDA4LDEyIEBACiAJaWYgKGNmZy0+ZGV2aWNlX2ZhbWlseSAhPSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKQogCQluX2NoYW5uZWxzID0gaXdsX2luaXRfY2hhbm5lbF9tYXAoCiAJCQkJZGV2LCBjZmcsIGRhdGEsCi0JCQkJJmNoX3NlY3Rpb25bTlZNX0NIQU5ORUxTXSk7CisJCQkJJmNoX3NlY3Rpb25bTlZNX0NIQU5ORUxTXSwgbGFyX3N1cHBvcnRlZCk7CiAJZWxzZQogCQluX2NoYW5uZWxzID0gaXdsX2luaXRfY2hhbm5lbF9tYXAoCiAJCQkJZGV2LCBjZmcsIGRhdGEsCi0JCQkJJmNoX3NlY3Rpb25bTlZNX0NIQU5ORUxTX0ZBTUlMWV84MDAwXSk7CisJCQkJJmNoX3NlY3Rpb25bTlZNX0NIQU5ORUxTX0ZBTUlMWV84MDAwXSwKKwkJCQlsYXJfc3VwcG9ydGVkKTsKIAogCXNiYW5kID0gJmRhdGEtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOwogCXNiYW5kLT5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKQEAgLTQwMyw3ICs0MzIsNyBAQAogCQkJCQkgIElFRUU4MDIxMV9CQU5EXzVHSFopOwogCWl3bF9pbml0X2h0X2h3X2NhcGFiKGNmZywgZGF0YSwgJnNiYW5kLT5odF9jYXAsIElFRUU4MDIxMV9CQU5EXzVHSFosCiAJCQkgICAgIHR4X2NoYWlucywgcnhfY2hhaW5zKTsKLQlpZiAoZW5hYmxlX3ZodCkKKwlpZiAoZGF0YS0+c2t1X2NhcF8xMWFjX2VuYWJsZSkKIAkJaXdsX2luaXRfdmh0X2h3X2NhcGFiKGNmZywgZGF0YSwgJnNiYW5kLT52aHRfY2FwLAogCQkJCSAgICAgIHR4X2NoYWlucywgcnhfY2hhaW5zKTsKIApAQCAtNDEyLDE3ICs0NDEsMTYgQEAKIAkJCSAgICBuX3VzZWQsIG5fY2hhbm5lbHMpOwogfQogCi1zdGF0aWMgaW50IGl3bF9nZXRfc2t1KGNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmcsCi0JCSAgICAgICBjb25zdCBfX2xlMTYgKm52bV9zdykKK3N0YXRpYyBpbnQgaXdsX2dldF9za3UoY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZywgY29uc3QgX19sZTE2ICpudm1fc3csCisJCSAgICAgICBjb25zdCBfX2xlMTYgKnBoeV9za3UpCiB7CiAJaWYgKGNmZy0+ZGV2aWNlX2ZhbWlseSAhPSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKQogCQlyZXR1cm4gbGUxNl90b19jcHVwKG52bV9zdyArIFNLVSk7Ci0JZWxzZQotCQlyZXR1cm4gbGUzMl90b19jcHVwKChfX2xlMzIgKikobnZtX3N3ICsgU0tVX0ZBTUlMWV84MDAwKSk7CisKKwlyZXR1cm4gbGUzMl90b19jcHVwKChfX2xlMzIgKikocGh5X3NrdSArIFNLVV9GQU1JTFlfODAwMCkpOwogfQogCi1zdGF0aWMgaW50IGl3bF9nZXRfbnZtX3ZlcnNpb24oY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZywKLQkJCSAgICAgICBjb25zdCBfX2xlMTYgKm52bV9zdykKK3N0YXRpYyBpbnQgaXdsX2dldF9udm1fdmVyc2lvbihjb25zdCBzdHJ1Y3QgaXdsX2NmZyAqY2ZnLCBjb25zdCBfX2xlMTYgKm52bV9zdykKIHsKIAlpZiAoY2ZnLT5kZXZpY2VfZmFtaWx5ICE9IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDApCiAJCXJldHVybiBsZTE2X3RvX2NwdXAobnZtX3N3ICsgTlZNX1ZFUlNJT04pOwpAQCAtNDMxLDI0ICs0NTksMjYgQEAKIAkJCQkJICAgICAgIE5WTV9WRVJTSU9OX0ZBTUlMWV84MDAwKSk7CiB9CiAKLXN0YXRpYyBpbnQgaXdsX2dldF9yYWRpb19jZmcoY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZywKLQkJCSAgICAgY29uc3QgX19sZTE2ICpudm1fc3cpCitzdGF0aWMgaW50IGl3bF9nZXRfcmFkaW9fY2ZnKGNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmcsIGNvbnN0IF9fbGUxNiAqbnZtX3N3LAorCQkJICAgICBjb25zdCBfX2xlMTYgKnBoeV9za3UpCiB7CiAJaWYgKGNmZy0+ZGV2aWNlX2ZhbWlseSAhPSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKQogCQlyZXR1cm4gbGUxNl90b19jcHVwKG52bV9zdyArIFJBRElPX0NGRyk7Ci0JZWxzZQotCQlyZXR1cm4gbGUzMl90b19jcHVwKChfX2xlMzIgKikobnZtX3N3ICsgUkFESU9fQ0ZHX0ZBTUlMWV84MDAwKSk7CisKKwlyZXR1cm4gbGUzMl90b19jcHVwKChfX2xlMzIgKikobnZtX3N3ICsgUkFESU9fQ0ZHX0ZBTUlMWV84MDAwKSk7CisKIH0KIAotI2RlZmluZSBOX0hXX0FERFJTX01BU0tfRkFNSUxZXzgwMDAJMHhGCi1zdGF0aWMgaW50IGl3bF9nZXRfbl9od19hZGRycyhjb25zdCBzdHJ1Y3QgaXdsX2NmZyAqY2ZnLAotCQkJICAgICAgY29uc3QgX19sZTE2ICpudm1fc3cpCitzdGF0aWMgaW50IGl3bF9nZXRfbl9od19hZGRycyhjb25zdCBzdHJ1Y3QgaXdsX2NmZyAqY2ZnLCBjb25zdCBfX2xlMTYgKm52bV9zdykKIHsKKwlpbnQgbl9od19hZGRyOworCiAJaWYgKGNmZy0+ZGV2aWNlX2ZhbWlseSAhPSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKQogCQlyZXR1cm4gbGUxNl90b19jcHVwKG52bV9zdyArIE5fSFdfQUREUlMpOwotCWVsc2UKLQkJcmV0dXJuIGxlMzJfdG9fY3B1cCgoX19sZTMyICopKG52bV9zdyArIE5fSFdfQUREUlNfRkFNSUxZXzgwMDApKQotCQkgICAgICAgJiBOX0hXX0FERFJTX01BU0tfRkFNSUxZXzgwMDA7CisKKwluX2h3X2FkZHIgPSBsZTMyX3RvX2NwdXAoKF9fbGUzMiAqKShudm1fc3cgKyBOX0hXX0FERFJTX0ZBTUlMWV84MDAwKSk7CisKKwlyZXR1cm4gbl9od19hZGRyICYgTl9IV19BRERSX01BU0s7CiB9CiAKIHN0YXRpYyB2b2lkIGl3bF9zZXRfcmFkaW9fY2ZnKGNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmcsCkBAIC00OTEsNyArNTIxLDggQEAKIAkJCQkJICAgY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZywKIAkJCQkJICAgc3RydWN0IGl3bF9udm1fZGF0YSAqZGF0YSwKIAkJCQkJICAgY29uc3QgX19sZTE2ICptYWNfb3ZlcnJpZGUsCi0JCQkJCSAgIGNvbnN0IF9fbGUxNiAqbnZtX2h3KQorCQkJCQkgICBjb25zdCBfX2xlMTYgKm52bV9odywKKwkJCQkJICAgdTMyIG1hY19hZGRyMCwgdTMyIG1hY19hZGRyMSkKIHsKIAljb25zdCB1OCAqaHdfYWRkcjsKIApAQCAtNTE1LDQ4ICs1NDYsMTcgQEAKIAl9CiAKIAlpZiAobnZtX2h3KSB7Ci0JCS8qIHJlYWQgdGhlIE1BQyBhZGRyZXNzIGZyb20gT1RQICovCi0JCWlmICghZGV2X2lzX3BjaShkZXYpIHx8IChkYXRhLT5udm1fdmVyc2lvbiA8IDB4RTA4KSkgewotCQkJLyogcmVhZCB0aGUgbWFjIGFkZHJlc3MgZnJvbSB0aGUgV0ZQTSBsb2NhdGlvbiAqLwotCQkJaHdfYWRkciA9IChjb25zdCB1OCAqKShudm1faHcgKwotCQkJCQkgICAgICAgSFdfQUREUjBfV0ZQTV9GQU1JTFlfODAwMCk7Ci0JCQlkYXRhLT5od19hZGRyWzBdID0gaHdfYWRkclszXTsKLQkJCWRhdGEtPmh3X2FkZHJbMV0gPSBod19hZGRyWzJdOwotCQkJZGF0YS0+aHdfYWRkclsyXSA9IGh3X2FkZHJbMV07Ci0JCQlkYXRhLT5od19hZGRyWzNdID0gaHdfYWRkclswXTsKKwkJLyogcmVhZCB0aGUgTUFDIGFkZHJlc3MgZnJvbSBIVyByZXNpc3RlcnMgKi8KKwkJaHdfYWRkciA9IChjb25zdCB1OCAqKSZtYWNfYWRkcjA7CisJCWRhdGEtPmh3X2FkZHJbMF0gPSBod19hZGRyWzNdOworCQlkYXRhLT5od19hZGRyWzFdID0gaHdfYWRkclsyXTsKKwkJZGF0YS0+aHdfYWRkclsyXSA9IGh3X2FkZHJbMV07CisJCWRhdGEtPmh3X2FkZHJbM10gPSBod19hZGRyWzBdOwogCi0JCQlod19hZGRyID0gKGNvbnN0IHU4ICopKG52bV9odyArCi0JCQkJCSAgICAgICBIV19BRERSMV9XRlBNX0ZBTUlMWV84MDAwKTsKLQkJCWRhdGEtPmh3X2FkZHJbNF0gPSBod19hZGRyWzFdOwotCQkJZGF0YS0+aHdfYWRkcls1XSA9IGh3X2FkZHJbMF07Ci0JCX0gZWxzZSBpZiAoKGRhdGEtPm52bV92ZXJzaW9uID49IDB4RTA4KSAmJgotCQkJICAgKGRhdGEtPm52bV92ZXJzaW9uIDwgMHhFMEIpKSB7Ci0JCQkvKiByZWFkICJyZXZlcnNlIG9yZGVyIiAgZnJvbSB0aGUgUENJZSBsb2NhdGlvbiAqLwotCQkJaHdfYWRkciA9IChjb25zdCB1OCAqKShudm1faHcgKwotCQkJCQkgICAgICAgSFdfQUREUjBfUENJRV9GQU1JTFlfODAwMCk7Ci0JCQlkYXRhLT5od19hZGRyWzVdID0gaHdfYWRkclsyXTsKLQkJCWRhdGEtPmh3X2FkZHJbNF0gPSBod19hZGRyWzFdOwotCQkJZGF0YS0+aHdfYWRkclszXSA9IGh3X2FkZHJbMF07CisJCWh3X2FkZHIgPSAoY29uc3QgdTggKikmbWFjX2FkZHIxOworCQlkYXRhLT5od19hZGRyWzRdID0gaHdfYWRkclsxXTsKKwkJZGF0YS0+aHdfYWRkcls1XSA9IGh3X2FkZHJbMF07CiAKLQkJCWh3X2FkZHIgPSAoY29uc3QgdTggKikobnZtX2h3ICsKLQkJCQkJICAgICAgIEhXX0FERFIxX1BDSUVfRkFNSUxZXzgwMDApOwotCQkJZGF0YS0+aHdfYWRkclsyXSA9IGh3X2FkZHJbM107Ci0JCQlkYXRhLT5od19hZGRyWzFdID0gaHdfYWRkclsyXTsKLQkJCWRhdGEtPmh3X2FkZHJbMF0gPSBod19hZGRyWzFdOwotCQl9IGVsc2UgewotCQkJLyogcmVhZCBmcm9tIHRoZSBQQ0llIGxvY2F0aW9uICovCi0JCQlod19hZGRyID0gKGNvbnN0IHU4ICopKG52bV9odyArCi0JCQkJCSAgICAgICBIV19BRERSMF9QQ0lFX0ZBTUlMWV84MDAwKTsKLQkJCWRhdGEtPmh3X2FkZHJbNV0gPSBod19hZGRyWzBdOwotCQkJZGF0YS0+aHdfYWRkcls0XSA9IGh3X2FkZHJbMV07Ci0JCQlkYXRhLT5od19hZGRyWzNdID0gaHdfYWRkclsyXTsKLQotCQkJaHdfYWRkciA9IChjb25zdCB1OCAqKShudm1faHcgKwotCQkJCQkgICAgICAgSFdfQUREUjFfUENJRV9GQU1JTFlfODAwMCk7Ci0JCQlkYXRhLT5od19hZGRyWzJdID0gaHdfYWRkclsxXTsKLQkJCWRhdGEtPmh3X2FkZHJbMV0gPSBod19hZGRyWzJdOwotCQkJZGF0YS0+aHdfYWRkclswXSA9IGh3X2FkZHJbM107Ci0JCX0KIAkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRhdGEtPmh3X2FkZHIpKQogCQkJSVdMX0VSUl9ERVYoZGV2LAogCQkJCSAgICAibWFjIGFkZHJlc3MgZnJvbSBodyBzZWN0aW9uIGlzIG5vdCB2YWxpZFxuIik7CkBAIC01NzEsMTEgKzU3MSwxNCBAQAogaXdsX3BhcnNlX252bV9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZywKIAkJICAgY29uc3QgX19sZTE2ICpudm1faHcsIGNvbnN0IF9fbGUxNiAqbnZtX3N3LAogCQkgICBjb25zdCBfX2xlMTYgKm52bV9jYWxpYiwgY29uc3QgX19sZTE2ICpyZWd1bGF0b3J5LAotCQkgICBjb25zdCBfX2xlMTYgKm1hY19vdmVycmlkZSwgdTggdHhfY2hhaW5zLCB1OCByeF9jaGFpbnMpCisJCSAgIGNvbnN0IF9fbGUxNiAqbWFjX292ZXJyaWRlLCBjb25zdCBfX2xlMTYgKnBoeV9za3UsCisJCSAgIHU4IHR4X2NoYWlucywgdTggcnhfY2hhaW5zLCBib29sIGxhcl9md19zdXBwb3J0ZWQsCisJCSAgIHUzMiBtYWNfYWRkcjAsIHUzMiBtYWNfYWRkcjEpCiB7CiAJc3RydWN0IGl3bF9udm1fZGF0YSAqZGF0YTsKIAl1MzIgc2t1OwogCXUzMiByYWRpb19jZmc7CisJdTE2IGxhcl9jb25maWc7CiAKIAlpZiAoY2ZnLT5kZXZpY2VfZmFtaWx5ICE9IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDApCiAJCWRhdGEgPSBremFsbG9jKHNpemVvZigqZGF0YSkgKwpAQCAtNTkyLDIwICs1OTUsMjEgQEAKIAogCWRhdGEtPm52bV92ZXJzaW9uID0gaXdsX2dldF9udm1fdmVyc2lvbihjZmcsIG52bV9zdyk7CiAKLQlyYWRpb19jZmcgPSBpd2xfZ2V0X3JhZGlvX2NmZyhjZmcsIG52bV9zdyk7CisJcmFkaW9fY2ZnID0gaXdsX2dldF9yYWRpb19jZmcoY2ZnLCBudm1fc3csIHBoeV9za3UpOwogCWl3bF9zZXRfcmFkaW9fY2ZnKGNmZywgZGF0YSwgcmFkaW9fY2ZnKTsKIAlpZiAoZGF0YS0+dmFsaWRfdHhfYW50KQogCQl0eF9jaGFpbnMgJj0gZGF0YS0+dmFsaWRfdHhfYW50OwogCWlmIChkYXRhLT52YWxpZF9yeF9hbnQpCiAJCXJ4X2NoYWlucyAmPSBkYXRhLT52YWxpZF9yeF9hbnQ7CiAKLQlza3UgPSBpd2xfZ2V0X3NrdShjZmcsIG52bV9zdyk7CisJc2t1ID0gaXdsX2dldF9za3UoY2ZnLCBudm1fc3csIHBoeV9za3UpOwogCWRhdGEtPnNrdV9jYXBfYmFuZF8yNEdIel9lbmFibGUgPSBza3UgJiBOVk1fU0tVX0NBUF9CQU5EXzI0R0haOwogCWRhdGEtPnNrdV9jYXBfYmFuZF81MkdIel9lbmFibGUgPSBza3UgJiBOVk1fU0tVX0NBUF9CQU5EXzUyR0haOwogCWRhdGEtPnNrdV9jYXBfMTFuX2VuYWJsZSA9IHNrdSAmIE5WTV9TS1VfQ0FQXzExTl9FTkFCTEU7Ci0JZGF0YS0+c2t1X2NhcF8xMWFjX2VuYWJsZSA9IHNrdSAmIE5WTV9TS1VfQ0FQXzExQUNfRU5BQkxFOwogCWlmIChpd2x3aWZpX21vZF9wYXJhbXMuZGlzYWJsZV8xMW4gJiBJV0xfRElTQUJMRV9IVF9BTEwpCiAJCWRhdGEtPnNrdV9jYXBfMTFuX2VuYWJsZSA9IGZhbHNlOworCWRhdGEtPnNrdV9jYXBfMTFhY19lbmFibGUgPSBkYXRhLT5za3VfY2FwXzExbl9lbmFibGUgJiYKKwkJCQkgICAgKHNrdSAmIE5WTV9TS1VfQ0FQXzExQUNfRU5BQkxFKTsKIAogCWRhdGEtPm5faHdfYWRkcnMgPSBpd2xfZ2V0X25faHdfYWRkcnMoY2ZnLCBudm1fc3cpOwogCkBAIC02MjYsMTYgKzYzMCwyMyBAQAogCQlpd2xfc2V0X2h3X2FkZHJlc3MoY2ZnLCBkYXRhLCBudm1faHcpOwogCiAJCWl3bF9pbml0X3NiYW5kcyhkZXYsIGNmZywgZGF0YSwgbnZtX3N3LAotCQkJCXNrdSAmIE5WTV9TS1VfQ0FQXzExQUNfRU5BQkxFLCB0eF9jaGFpbnMsCi0JCQkJcnhfY2hhaW5zKTsKKwkJCQl0eF9jaGFpbnMsIHJ4X2NoYWlucywgbGFyX2Z3X3N1cHBvcnRlZCk7CiAJfSBlbHNlIHsKKwkJdTE2IGxhcl9vZmZzZXQgPSBkYXRhLT5udm1fdmVyc2lvbiA8IDB4RTM5ID8KKwkJCQkgTlZNX0xBUl9PRkZTRVRfRkFNSUxZXzgwMDBfT0xEIDoKKwkJCQkgTlZNX0xBUl9PRkZTRVRfRkFNSUxZXzgwMDA7CisKKwkJbGFyX2NvbmZpZyA9IGxlMTZfdG9fY3B1cChyZWd1bGF0b3J5ICsgbGFyX29mZnNldCk7CisJCWRhdGEtPmxhcl9lbmFibGVkID0gISEobGFyX2NvbmZpZyAmCisJCQkJICAgICAgIE5WTV9MQVJfRU5BQkxFRF9GQU1JTFlfODAwMCk7CisKIAkJLyogTUFDIGFkZHJlc3MgaW4gZmFtaWx5IDgwMDAgKi8KIAkJaXdsX3NldF9od19hZGRyZXNzX2ZhbWlseV84MDAwKGRldiwgY2ZnLCBkYXRhLCBtYWNfb3ZlcnJpZGUsCi0JCQkJCSAgICAgICBudm1faHcpOworCQkJCQkgICAgICAgbnZtX2h3LCBtYWNfYWRkcjAsIG1hY19hZGRyMSk7CiAKIAkJaXdsX2luaXRfc2JhbmRzKGRldiwgY2ZnLCBkYXRhLCByZWd1bGF0b3J5LAotCQkJCXNrdSAmIE5WTV9TS1VfQ0FQXzExQUNfRU5BQkxFLCB0eF9jaGFpbnMsCi0JCQkJcnhfY2hhaW5zKTsKKwkJCQl0eF9jaGFpbnMsIHJ4X2NoYWlucywKKwkJCQlsYXJfZndfc3VwcG9ydGVkICYmIGRhdGEtPmxhcl9lbmFibGVkKTsKIAl9CiAKIAlkYXRhLT5jYWxpYl92ZXJzaW9uID0gMjU1OwpAQCAtNjQzLDMgKzY1NCwxNjQgQEAKIAlyZXR1cm4gZGF0YTsKIH0KIElXTF9FWFBPUlRfU1lNQk9MKGl3bF9wYXJzZV9udm1fZGF0YSk7CisKK3N0YXRpYyB1MzIgaXdsX252bV9nZXRfcmVnZG9tX2J3X2ZsYWdzKGNvbnN0IHU4ICpudm1fY2hhbiwKKwkJCQkgICAgICAgaW50IGNoX2lkeCwgdTE2IG52bV9mbGFncywKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZykKK3sKKwl1MzIgZmxhZ3MgPSBOTDgwMjExX1JSRl9OT19IVDQwOworCXUzMiBsYXN0XzVnaHpfaHQgPSBMQVNUXzVHSFpfSFQ7CisKKwlpZiAoY2ZnLT5kZXZpY2VfZmFtaWx5ID09IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDApCisJCWxhc3RfNWdoel9odCA9IExBU1RfNUdIWl9IVF9GQU1JTFlfODAwMDsKKworCWlmIChjaF9pZHggPCBOVU1fMkdIWl9DSEFOTkVMUyAmJgorCSAgICAobnZtX2ZsYWdzICYgTlZNX0NIQU5ORUxfNDBNSFopKSB7CisJCWlmIChudm1fY2hhbltjaF9pZHhdIDw9IExBU1RfMkdIWl9IVF9QTFVTKQorCQkJZmxhZ3MgJj0gfk5MODAyMTFfUlJGX05PX0hUNDBQTFVTOworCQlpZiAobnZtX2NoYW5bY2hfaWR4XSA+PSBGSVJTVF8yR0haX0hUX01JTlVTKQorCQkJZmxhZ3MgJj0gfk5MODAyMTFfUlJGX05PX0hUNDBNSU5VUzsKKwl9IGVsc2UgaWYgKG52bV9jaGFuW2NoX2lkeF0gPD0gbGFzdF81Z2h6X2h0ICYmCisJCSAgIChudm1fZmxhZ3MgJiBOVk1fQ0hBTk5FTF80ME1IWikpIHsKKwkJaWYgKChjaF9pZHggLSBOVU1fMkdIWl9DSEFOTkVMUykgJSAyID09IDApCisJCQlmbGFncyAmPSB+Tkw4MDIxMV9SUkZfTk9fSFQ0MFBMVVM7CisJCWVsc2UKKwkJCWZsYWdzICY9IH5OTDgwMjExX1JSRl9OT19IVDQwTUlOVVM7CisJfQorCisJaWYgKCEobnZtX2ZsYWdzICYgTlZNX0NIQU5ORUxfODBNSFopKQorCQlmbGFncyB8PSBOTDgwMjExX1JSRl9OT184ME1IWjsKKwlpZiAoIShudm1fZmxhZ3MgJiBOVk1fQ0hBTk5FTF8xNjBNSFopKQorCQlmbGFncyB8PSBOTDgwMjExX1JSRl9OT18xNjBNSFo7CisKKwlpZiAoIShudm1fZmxhZ3MgJiBOVk1fQ0hBTk5FTF9BQ1RJVkUpKQorCQlmbGFncyB8PSBOTDgwMjExX1JSRl9OT19JUjsKKworCWlmIChudm1fZmxhZ3MgJiBOVk1fQ0hBTk5FTF9SQURBUikKKwkJZmxhZ3MgfD0gTkw4MDIxMV9SUkZfREZTOworCisJaWYgKG52bV9mbGFncyAmIE5WTV9DSEFOTkVMX0lORE9PUl9PTkxZKQorCQlmbGFncyB8PSBOTDgwMjExX1JSRl9OT19PVVRET09SOworCisJLyogU2V0IHRoZSBHTyBjb25jdXJyZW50IGZsYWcgb25seSBpbiBjYXNlIHRoYXQgTk9fSVIgaXMgc2V0LgorCSAqIE90aGVyd2lzZSBpdCBpcyBtZWFuaW5nbGVzcworCSAqLworCWlmICgobnZtX2ZsYWdzICYgTlZNX0NIQU5ORUxfR09fQ09OQ1VSUkVOVCkgJiYKKwkgICAgKGZsYWdzICYgTkw4MDIxMV9SUkZfTk9fSVIpKQorCQlmbGFncyB8PSBOTDgwMjExX1JSRl9HT19DT05DVVJSRU5UOworCisJcmV0dXJuIGZsYWdzOworfQorCitzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqCitpd2xfcGFyc2VfbnZtX21jY19pbmZvKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZywKKwkJICAgICAgIGludCBudW1fb2ZfY2gsIF9fbGUzMiAqY2hhbm5lbHMsIHUxNiBmd19tY2MpCit7CisJaW50IGNoX2lkeDsKKwl1MTYgY2hfZmxhZ3MsIHByZXZfY2hfZmxhZ3MgPSAwOworCWNvbnN0IHU4ICpudm1fY2hhbiA9IGNmZy0+ZGV2aWNlX2ZhbWlseSA9PSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwID8KKwkJCSAgICAgaXdsX252bV9jaGFubmVsc19mYW1pbHlfODAwMCA6IGl3bF9udm1fY2hhbm5lbHM7CisJc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJlZ2Q7CisJaW50IHNpemVfb2ZfcmVnZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JlZ19ydWxlICpydWxlOworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKKwlpbnQgY2VudGVyX2ZyZXEsIHByZXZfY2VudGVyX2ZyZXEgPSAwOworCWludCB2YWxpZF9ydWxlcyA9IDA7CisJYm9vbCBuZXdfcnVsZTsKKwlpbnQgbWF4X251bV9jaCA9IGNmZy0+ZGV2aWNlX2ZhbWlseSA9PSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwID8KKwkJCSBJV0xfTlVNX0NIQU5ORUxTX0ZBTUlMWV84MDAwIDogSVdMX05VTV9DSEFOTkVMUzsKKworCWlmIChXQVJOX09OX09OQ0UobnVtX29mX2NoID4gTkw4MDIxMV9NQVhfU1VQUF9SRUdfUlVMRVMpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWlmIChXQVJOX09OKG51bV9vZl9jaCA+IG1heF9udW1fY2gpKQorCQludW1fb2ZfY2ggPSBtYXhfbnVtX2NoOworCisJSVdMX0RFQlVHX0RFVihkZXYsIElXTF9ETF9MQVIsICJidWlsZGluZyByZWdkb20gZm9yICVkIGNoYW5uZWxzXG4iLAorCQkgICAgICBudW1fb2ZfY2gpOworCisJLyogYnVpbGQgYSByZWdkb21haW4gcnVsZSBmb3IgZXZlcnkgdmFsaWQgY2hhbm5lbCAqLworCXNpemVfb2ZfcmVnZCA9CisJCXNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbikgKworCQludW1fb2ZfY2ggKiBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yZWdfcnVsZSk7CisKKwlyZWdkID0ga3phbGxvYyhzaXplX29mX3JlZ2QsIEdGUF9LRVJORUwpOworCWlmICghcmVnZCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlmb3IgKGNoX2lkeCA9IDA7IGNoX2lkeCA8IG51bV9vZl9jaDsgY2hfaWR4KyspIHsKKwkJY2hfZmxhZ3MgPSAodTE2KV9fbGUzMl90b19jcHVwKGNoYW5uZWxzICsgY2hfaWR4KTsKKwkJYmFuZCA9IChjaF9pZHggPCBOVU1fMkdIWl9DSEFOTkVMUykgPworCQkgICAgICAgSUVFRTgwMjExX0JBTkRfMkdIWiA6IElFRUU4MDIxMV9CQU5EXzVHSFo7CisJCWNlbnRlcl9mcmVxID0gaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KG52bV9jaGFuW2NoX2lkeF0sCisJCQkJCQkJICAgICBiYW5kKTsKKwkJbmV3X3J1bGUgPSBmYWxzZTsKKworCQlpZiAoIShjaF9mbGFncyAmIE5WTV9DSEFOTkVMX1ZBTElEKSkgeworCQkJSVdMX0RFQlVHX0RFVihkZXYsIElXTF9ETF9MQVIsCisJCQkJICAgICAgIkNoLiAlZCBGbGFncyAleCBbJXNHSHpdIC0gTm8gdHJhZmZpY1xuIiwKKwkJCQkgICAgICBudm1fY2hhbltjaF9pZHhdLAorCQkJCSAgICAgIGNoX2ZsYWdzLAorCQkJCSAgICAgIChjaF9pZHggPj0gTlVNXzJHSFpfQ0hBTk5FTFMpID8KKwkJCQkgICAgICAiNS4yIiA6ICIyLjQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogd2UgY2FuJ3QgY29udGludWUgdGhlIHNhbWUgcnVsZSAqLworCQlpZiAoY2hfaWR4ID09IDAgfHwgcHJldl9jaF9mbGFncyAhPSBjaF9mbGFncyB8fAorCQkgICAgY2VudGVyX2ZyZXEgLSBwcmV2X2NlbnRlcl9mcmVxID4gMjApIHsKKwkJCXZhbGlkX3J1bGVzKys7CisJCQluZXdfcnVsZSA9IHRydWU7CisJCX0KKworCQlydWxlID0gJnJlZ2QtPnJlZ19ydWxlc1t2YWxpZF9ydWxlcyAtIDFdOworCisJCWlmIChuZXdfcnVsZSkKKwkJCXJ1bGUtPmZyZXFfcmFuZ2Uuc3RhcnRfZnJlcV9raHogPQorCQkJCQkJTUhaX1RPX0tIWihjZW50ZXJfZnJlcSAtIDEwKTsKKworCQlydWxlLT5mcmVxX3JhbmdlLmVuZF9mcmVxX2toeiA9IE1IWl9UT19LSFooY2VudGVyX2ZyZXEgKyAxMCk7CisKKwkJLyogdGhpcyBkb2Vzbid0IG1hdHRlciAtIG5vdCB1c2VkIGJ5IEZXICovCisJCXJ1bGUtPnBvd2VyX3J1bGUubWF4X2FudGVubmFfZ2FpbiA9IERCSV9UT19NQkkoNik7CisJCXJ1bGUtPnBvd2VyX3J1bGUubWF4X2VpcnAgPQorCQkJREJNX1RPX01CTShJV0xfREVGQVVMVF9NQVhfVFhfUE9XRVIpOworCisJCXJ1bGUtPmZsYWdzID0gaXdsX252bV9nZXRfcmVnZG9tX2J3X2ZsYWdzKG52bV9jaGFuLCBjaF9pZHgsCisJCQkJCQkJICBjaF9mbGFncywgY2ZnKTsKKworCQkvKiByZWx5IG9uIGF1dG8tY2FsY3VsYXRpb24gdG8gbWVyZ2UgQlcgb2YgY29udGlndW91cyBjaGFucyAqLworCQlydWxlLT5mbGFncyB8PSBOTDgwMjExX1JSRl9BVVRPX0JXOworCQlydWxlLT5mcmVxX3JhbmdlLm1heF9iYW5kd2lkdGhfa2h6ID0gMDsKKworCQlwcmV2X2NoX2ZsYWdzID0gY2hfZmxhZ3M7CisJCXByZXZfY2VudGVyX2ZyZXEgPSBjZW50ZXJfZnJlcTsKKworCQlJV0xfREVCVUdfREVWKGRldiwgSVdMX0RMX0xBUiwKKwkJCSAgICAgICJDaC4gJWQgWyVzR0h6XSAlcyVzJXMlcyVzJXMlcyVzJXMoMHglMDJ4KTogQWQtSG9jICVzc3VwcG9ydGVkXG4iLAorCQkJICAgICAgY2VudGVyX2ZyZXEsCisJCQkgICAgICBiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFogPyAiNS4yIiA6ICIyLjQiLAorCQkJICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koVkFMSUQpLAorCQkJICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koQUNUSVZFKSwKKwkJCSAgICAgIENIRUNLX0FORF9QUklOVF9JKFJBREFSKSwKKwkJCSAgICAgIENIRUNLX0FORF9QUklOVF9JKFdJREUpLAorCQkJICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koNDBNSFopLAorCQkJICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koODBNSFopLAorCQkJICAgICAgQ0hFQ0tfQU5EX1BSSU5UX0koMTYwTUhaKSwKKwkJCSAgICAgIENIRUNLX0FORF9QUklOVF9JKElORE9PUl9PTkxZKSwKKwkJCSAgICAgIENIRUNLX0FORF9QUklOVF9JKEdPX0NPTkNVUlJFTlQpLAorCQkJICAgICAgY2hfZmxhZ3MsCisJCQkgICAgICAoKGNoX2ZsYWdzICYgTlZNX0NIQU5ORUxfQUNUSVZFKSAmJgorCQkJICAgICAgICEoY2hfZmxhZ3MgJiBOVk1fQ0hBTk5FTF9SQURBUikpCisJCQkJCSA/ICIiIDogIm5vdCAiKTsKKwl9CisKKwlyZWdkLT5uX3JlZ19ydWxlcyA9IHZhbGlkX3J1bGVzOworCisJLyogc2V0IGFscGhhMiBmcm9tIEZXLiAqLworCXJlZ2QtPmFscGhhMlswXSA9IGZ3X21jYyA+PiA4OworCXJlZ2QtPmFscGhhMlsxXSA9IGZ3X21jYyAmIDB4ZmY7CisKKwlyZXR1cm4gcmVnZDsKK30KK0lXTF9FWFBPUlRfU1lNQk9MKGl3bF9wYXJzZV9udm1fbWNjX2luZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbnZtLXBhcnNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1udm0tcGFyc2UuaAppbmRleCBjOWM0NWEzLi44MjJiYTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1udm0tcGFyc2UuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1udm0tcGFyc2UuaApAQCAtNjIsNiArNjIsNyBAQAogI2lmbmRlZiBfX2l3bF9udm1fcGFyc2VfaF9fCiAjZGVmaW5lIF9faXdsX252bV9wYXJzZV9oX18KIAorI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogI2luY2x1ZGUgIml3bC1lZXByb20tcGFyc2UuaCIKIAogLyoqCkBAIC03Niw2ICs3NywyMSBAQAogaXdsX3BhcnNlX252bV9kYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGl3bF9jZmcgKmNmZywKIAkJICAgY29uc3QgX19sZTE2ICpudm1faHcsIGNvbnN0IF9fbGUxNiAqbnZtX3N3LAogCQkgICBjb25zdCBfX2xlMTYgKm52bV9jYWxpYiwgY29uc3QgX19sZTE2ICpyZWd1bGF0b3J5LAotCQkgICBjb25zdCBfX2xlMTYgKm1hY19vdmVycmlkZSwgdTggdHhfY2hhaW5zLCB1OCByeF9jaGFpbnMpOworCQkgICBjb25zdCBfX2xlMTYgKm1hY19vdmVycmlkZSwgY29uc3QgX19sZTE2ICpwaHlfc2t1LAorCQkgICB1OCB0eF9jaGFpbnMsIHU4IHJ4X2NoYWlucywgYm9vbCBsYXJfZndfc3VwcG9ydGVkLAorCQkgICB1MzIgbWFjX2FkZHIwLCB1MzIgbWFjX2FkZHIxKTsKKworLyoqCisgKiBpd2xfcGFyc2VfbWNjX2luZm8gLSBwYXJzZSBNQ0MgKG1vYmlsZSBjb3VudHJ5IGNvZGUpIGluZm8gY29taW5nIGZyb20gRlcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgcmVndWxhdG9yeSBjaGFubmVsIGRhdGEgcmVjZWl2ZWQgYXMgYQorICogTUNDX1VQREFURV9DTUQgY29tbWFuZC4gSXQgcmV0dXJucyBhIG5ld2x5IGFsbG9jYXRpb24gcmVndWxhdG9yeSBkb21haW4sCisgKiB0byBiZSBmZWQgaW50byB0aGUgcmVndWxhdG9yeSBjb3JlLiBBbiBFUlJfUFRSIGlzIHJldHVybmVkIG9uIGVycm9yLgorICogSWYgbm90IGdpdmVuIHRvIHRoZSByZWd1bGF0b3J5IGNvcmUsIHRoZSB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nCisgKiB0aGUgcmVnZG9tYWluIHJldHVybmVkIGhlcmUgd2l0aCBrZnJlZS4KKyAqLworc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKgoraXdsX3BhcnNlX252bV9tY2NfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBpd2xfY2ZnICpjZmcsCisJCSAgICAgICBpbnQgbnVtX29mX2NoLCBfX2xlMzIgKmNoYW5uZWxzLCB1MTYgZndfbWNjKTsKIAogI2VuZGlmIC8qIF9faXdsX252bV9wYXJzZV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW9wLW1vZGUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW9wLW1vZGUuaAppbmRleCAxN2RlNmQ0Li5jZTFjZGQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1vcC1tb2RlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtb3AtbW9kZS5oCkBAIC05NCw3ICs5NCw3IEBACiAgKiBUaGUgb3BlcmF0aW9uYWwgbW9kZSBoYXMgYSB2ZXJ5IHNpbXBsZSBsaWZlIGN5Y2xlLgogICoKICAqCTEpIFRoZSBkcml2ZXIgbGF5ZXIgKGl3bC1kcnYuYykgY2hvb3NlcyB0aGUgb3BfbW9kZSBiYXNlZCBvbiB0aGUKLSAqCSAgIGNhcGFiaWxpdGllcyBhZHZlcnRpemVkIGJ5IHRoZSBmdyBmaWxlIChpbiBUTFYgZm9ybWF0KS4KKyAqCSAgIGNhcGFiaWxpdGllcyBhZHZlcnRpc2VkIGJ5IHRoZSBmdyBmaWxlIChpbiBUTFYgZm9ybWF0KS4KICAqCTIpIFRoZSBkcml2ZXIgbGF5ZXIgc3RhcnRzIHRoZSBvcF9tb2RlIChvcHMtPnN0YXJ0KQogICoJMykgVGhlIG9wX21vZGUgcmVnaXN0ZXJzIG1hYzgwMjExCiAgKgk0KSBUaGUgb3BfbW9kZSBpcyBnb3Zlcm5lZCBieSBtYWM4MDIxMQpAQCAtMTE2LDcgKzExNiw3IEBACiAgKglNYXkgc2xlZXAKICAqIEByeDogUnggbm90aWZpY2F0aW9uIHRvIHRoZSBvcF9tb2RlLiByeGIgaXMgdGhlIFJ4IGJ1ZmZlciBpdHNlbGYuIENtZCBpcyB0aGUKICAqCUhDTUQgdGhpcyBSeCByZXNwb25kcyB0by4gQ2FuJ3Qgc2xlZXAuCi0gKiBAbmFwaV9hZGQ6IE5BUEkgaW5pdGlhbGlzYXRpb24uIFRoZSB0cmFuc3BvcnQgaXMgZnVsbHkgcmVzcG9uc2libGUgZm9yIE5BUEksCisgKiBAbmFwaV9hZGQ6IE5BUEkgaW5pdGlhbGl6YXRpb24uIFRoZSB0cmFuc3BvcnQgaXMgZnVsbHkgcmVzcG9uc2libGUgZm9yIE5BUEksCiAgKglidXQgdGhlIGhpZ2hlciBsYXllcnMgbmVlZCB0byBrbm93IGFib3V0IGl0IChpbiBwYXJ0aWN1bGFyIG1hYzgwMjExIHRvCiAgKgl0byBhYmxlIHRvIGNhbGwgdGhlIHJpZ2h0IE5BUEkgUlggZnVuY3Rpb25zKTsgdGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQKICAqCXRvIGV2ZW50dWFsbHkgY2FsbCBuZXRpZl9uYXBpX2FkZCgpIHdpdGggaGlnaGVyIGxheWVyIGludm9sdmVtZW50LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGh5LWRiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1waHktZGIuYwppbmRleCBkNGZiNWNhLi5hMTA1NDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1waHktZGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1waHktZGIuYwpAQCAtNzIsNyArNzIsNyBAQAogI2luY2x1ZGUgIml3bC10cmFucy5oIgogCiAjZGVmaW5lIENIQU5ORUxfTlVNX1NJWkUJNAkvKiBudW0gb2YgY2hhbm5lbHMgaW4gY2FsaWJfY2ggc2l6ZSAqLwotI2RlZmluZSBJV0xfTlVNX1BBUERfQ0hfR1JPVVBTCTcKKyNkZWZpbmUgSVdMX05VTV9QQVBEX0NIX0dST1VQUwk5CiAjZGVmaW5lIElXTF9OVU1fVFhQX0NIX0dST1VQUwk5CiAKIHN0cnVjdCBpd2xfcGh5X2RiX2VudHJ5IHsKQEAgLTEyNSw3ICsxMjUsNyBAQAogfSBfX3BhY2tlZDsKIAogLyoKLSAqIHBoeSBkYiAtIFJlY2VpZXZlIHBoeSBkYiBjaHVuayBhZnRlciBjYWxpYnJhdGlvbnMKKyAqIHBoeSBkYiAtIFJlY2VpdmUgcGh5IGRiIGNodW5rIGFmdGVyIGNhbGlicmF0aW9ucwogICovCiBzdHJ1Y3QgaXdsX2NhbGliX3Jlc19ub3RpZl9waHlfZGIgewogCV9fbGUxNiB0eXBlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcHJwaC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcHJwaC5oCmluZGV4IDYyMjFlNGQuLjg4YTU3ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBycGguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wcnBoLmgKQEAgLTExMCw4ICsxMTAsOCBAQAogI2RlZmluZSBERVZJQ0VfU0VUX05NSV9SRUcgMHgwMGEwMWMzMAogI2RlZmluZSBERVZJQ0VfU0VUX05NSV9WQUxfSFcgQklUKDApCiAjZGVmaW5lIERFVklDRV9TRVRfTk1JX1ZBTF9EUlYgQklUKDcpCi0jZGVmaW5lIERFVklDRV9TRVRfTk1JXzgwMDBCX1JFRyAweDAwYTAxYzI0Ci0jZGVmaW5lIERFVklDRV9TRVRfTk1JXzgwMDBCX1ZBTCAweDEwMDAwMDAKKyNkZWZpbmUgREVWSUNFX1NFVF9OTUlfODAwMF9SRUcgMHgwMGEwMWMyNAorI2RlZmluZSBERVZJQ0VfU0VUX05NSV84MDAwX1ZBTCAweDEwMDAwMDAKIAogLyogU2hhcmVkIHJlZ2lzdGVycyAoMHgwLi4weDNmZiwgdmlhIHRhcmdldCBpbmRpcmVjdCBvciBwZXJpcGhlcnkgKi8KICNkZWZpbmUgU0hSX0JBU0UJMHgwMGExMDAwMApAQCAtMjk1LDI1ICsyOTUsNiBAQAogI2RlZmluZSBPU0NfQ0xLCQkJCSgweGEwNDA2OCkKICNkZWZpbmUgT1NDX0NMS19GT1JDRV9DT05UUk9MCQkoMHg4KQogCi0vKiBTRUNVUkUgYm9vdCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgTE1QTV9TRUNVUkVfQk9PVF9DT05GSUdfQUREUgkoMHgxMDApCi1lbnVtIHNlY3VyZV9ib290X2NvbmZpZ19yZWcgewotCUxNUE1fU0VDVVJFX0JPT1RfQ09ORklHX0lOU1BFQ1RPUl9CVVJORURfSU5fT1RQCT0gMHgwMDAwMDAwMSwKLQlMTVBNX1NFQ1VSRV9CT09UX0NPTkZJR19JTlNQRUNUT1JfTk9UX1JFUQk9IDB4MDAwMDAwMDIsCi19OwotCi0jZGVmaW5lIExNUE1fU0VDVVJFX0JPT1RfQ1BVMV9TVEFUVVNfQUREUl9CMAkoMHhBMDFFMzApCi0jZGVmaW5lIExNUE1fU0VDVVJFX0JPT1RfQ1BVMV9TVEFUVVNfQUREUgkoMHgxRTMwKQotI2RlZmluZSBMTVBNX1NFQ1VSRV9CT09UX0NQVTJfU1RBVFVTX0FERFIJKDB4MUUzNCkKLWVudW0gc2VjdXJlX2Jvb3Rfc3RhdHVzX3JlZyB7Ci0JTE1QTV9TRUNVUkVfQk9PVF9DUFVfU1RBVFVTX1ZFUkZfU1RBVFVTCQk9IDB4MDAwMDAwMDEsCi0JTE1QTV9TRUNVUkVfQk9PVF9DUFVfU1RBVFVTX1ZFUkZfQ09NUExFVEVECT0gMHgwMDAwMDAwMiwKLQlMTVBNX1NFQ1VSRV9CT09UX0NQVV9TVEFUVVNfVkVSRl9TVUNDRVNTCT0gMHgwMDAwMDAwNCwKLQlMTVBNX1NFQ1VSRV9CT09UX0NQVV9TVEFUVVNfVkVSRl9GQUlMCQk9IDB4MDAwMDAwMDgsCi0JTE1QTV9TRUNVUkVfQk9PVF9DUFVfU1RBVFVTX1NJR05fVkVSRl9GQUlMCT0gMHgwMDAwMDAxMCwKLQlMTVBNX1NFQ1VSRV9CT09UX1NUQVRVU19TVUNDRVNTCQkJPSAweDAwMDAwMDAzLAotfTsKLQogI2RlZmluZSBGSF9VQ09ERV9MT0FEX1NUQVRVUwkJKDB4MUFGMCkKICNkZWZpbmUgQ1NSX1VDT0RFX0xPQURfU1RBVFVTX0FERFIJKDB4MUU3MCkKIGVudW0gc2VjdXJlX2xvYWRfc3RhdHVzX3JlZyB7CkBAIC0zMzQsOCArMzE1LDYgQEAKICNkZWZpbmUgTE1QTV9TRUNVUkVfQ1BVMV9IRFJfTUVNX1NQQUNFCQkoMHg0MjAwMDApCiAjZGVmaW5lIExNUE1fU0VDVVJFX0NQVTJfSERSX01FTV9TUEFDRQkJKDB4NDIwNDAwKQogCi0jZGVmaW5lIExNUE1fU0VDVVJFX1RJTUVfT1VUCSgxMDApIC8qIDEwIG1pY3JvICovCi0KIC8qIFJ4IEZJRk8gKi8KICNkZWZpbmUgUlhGX1NJWkVfQUREUgkJCSgweGEwMGM4OCkKICNkZWZpbmUgUlhGX1JEX0RfU1BBQ0UJCQkoMHhhMDBjNDApCkBAIC0zNzAsNyArMzQ5LDMzIEBACiAjZGVmaW5lIE1PTl9CVUZGX0NZQ0xFX0NOVAkJKDB4YTAzYzQ4KQogCiAjZGVmaW5lIERCR0NfSU5fU0FNUExFCQkJKDB4YTAzYzAwKQotI2RlZmluZSBEQkdDX09VVF9DVFJMCQkJKDB4YTAzYzBjKQorCisvKiBlbmFibGUgdGhlIElEIGJ1ZiBmb3IgcmVhZCAqLworI2RlZmluZSBXRlBNX1BTX0NUTF9DTFIJCQkweEEwMzAwQworI2RlZmluZSBXRk1QX01BQ19BRERSXzAJCQkweEEwMzA4MAorI2RlZmluZSBXRk1QX01BQ19BRERSXzEJCQkweEEwMzA4NAorI2RlZmluZSBMTVBNX1BNR19FTgkJCTB4QTAxQ0VDCisjZGVmaW5lIFJBRElPX1JFR19TWVNfTUFOVUFMX0RGVF8wCTB4QUQ0MDc4CisjZGVmaW5lIFJGSUNfUkVHX1JECQkJMHhBRDA0NzAKKyNkZWZpbmUgV0ZQTV9DVFJMX1JFRwkJCTB4QTAzMDMwCitlbnVtIHsKKwlFTkFCTEVfV0ZQTSA9IEJJVCgzMSksCisJV0ZQTV9BVVhfQ1RMX0FVWF9JRl9NQUNfT1dORVJfTVNLCT0gMHg4MDAwMDAwMCwKK307CisKKyNkZWZpbmUgQVVYX01JU0NfUkVHCQkJMHhBMjAwQjAKK2VudW0geworCUhXX1NURVBfTE9DQVRJT05fQklUUyA9IDI0LAorfTsKKworI2RlZmluZSBBVVhfTUlTQ19NQVNURVIxX0VOCQkweEEyMDgxOAorZW51bSBhdXhfbWlzY19tYXN0ZXIxX2VuIHsKKwlBVVhfTUlTQ19NQVNURVIxX0VOX1NCRV9NU0sJPSAweDEsCit9OworCisjZGVmaW5lIEFVWF9NSVNDX01BU1RFUjFfU01QSFJfU1RBVFVTCTB4QTIwODAwCisjZGVmaW5lIFJTQV9FTkFCTEUJCQkweEEyNEIwOAorI2RlZmluZSBQUkVHX0FVWF9CVVNfV1BST1RfMAkJMHhBMDRDQzAKIAogLyogRlcgY2hpY2tlbiBiaXRzICovCiAjZGVmaW5lIExNUE1fQ0hJQ0sJCQkweEEwMUZGOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLmgKaW5kZXggYTk2YmQ4ZC4uNmRmZWQxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy5oCkBAIC03NywxMCArNzcsMTAgQEAKIC8qKgogICogRE9DOiBUcmFuc3BvcnQgbGF5ZXIgLSB3aGF0IGlzIGl0ID8KICAqCi0gKiBUaGUgdHJhbnBvcnQgbGF5ZXIgaXMgdGhlIGxheWVyIHRoYXQgZGVhbHMgd2l0aCB0aGUgSFcgZGlyZWN0bHkuIEl0IHByb3ZpZGVzCisgKiBUaGUgdHJhbnNwb3J0IGxheWVyIGlzIHRoZSBsYXllciB0aGF0IGRlYWxzIHdpdGggdGhlIEhXIGRpcmVjdGx5LiBJdCBwcm92aWRlcwogICogYW4gYWJzdHJhY3Rpb24gb2YgdGhlIHVuZGVybHlpbmcgSFcgdG8gdGhlIHVwcGVyIGxheWVyLiBUaGUgdHJhbnNwb3J0IGxheWVyCiAgKiBkb2Vzbid0IHByb3ZpZGUgYW55IHBvbGljeSwgYWxnb3JpdGhtIG9yIGFueXRoaW5nIG9mIHRoaXMga2luZCwgYnV0IG9ubHkKLSAqIG1lY2hhbmlzbXMgdG8gbWFrZSB0aGUgSFcgZG8gc29tZXRoaW5nLkl0IGlzIG5vdCBjb21wbGV0ZWx5IHN0YXRlbGVzcyBidXQKKyAqIG1lY2hhbmlzbXMgdG8gbWFrZSB0aGUgSFcgZG8gc29tZXRoaW5nLiBJdCBpcyBub3QgY29tcGxldGVseSBzdGF0ZWxlc3MgYnV0CiAgKiBjbG9zZSB0byBpdC4KICAqIFdlIHdpbGwgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBmb3IgZWFjaCBkaWZmZXJlbnQgc3VwcG9ydGVkIGJ1cy4KICAqLwpAQCAtMTExLDEwICsxMTEsMTAgQEAKIC8qKgogICogRE9DOiBIb3N0IGNvbW1hbmQgc2VjdGlvbgogICoKLSAqIEEgaG9zdCBjb21tYW5kIGlzIGEgY29tbWFuZWQgaXNzdWVkIGJ5IHRoZSB1cHBlciBsYXllciB0byB0aGUgZncuIFRoZXJlIGFyZQorICogQSBob3N0IGNvbW1hbmQgaXMgYSBjb21tYW5kIGlzc3VlZCBieSB0aGUgdXBwZXIgbGF5ZXIgdG8gdGhlIGZ3LiBUaGVyZSBhcmUKICAqIHNldmVyYWwgdmVyc2lvbnMgb2YgZncgdGhhdCBoYXZlIHNldmVyYWwgQVBJcy4gVGhlIHRyYW5zcG9ydCBsYXllciBpcwogICogY29tcGxldGVseSBhZ25vc3RpYyB0byB0aGVzZSBkaWZmZXJlbmNlcy4KLSAqIFRoZSB0cmFuc3BvcnQgZG9lcyBwcm92aWRlIGhlbHBlciBmdW5jdGlvbm5hbGl0eSAoaS5lLiBTWU5DIC8gQVNZTkMgbW9kZSksCisgKiBUaGUgdHJhbnNwb3J0IGRvZXMgcHJvdmlkZSBoZWxwZXIgZnVuY3Rpb25hbGl0eSAoaS5lLiBTWU5DIC8gQVNZTkMgbW9kZSksCiAgKi8KICNkZWZpbmUgU0VRX1RPX1FVRVVFKHMpCSgoKHMpID4+IDgpICYgMHgxZikKICNkZWZpbmUgUVVFVUVfVE9fU0VRKHEpCSgoKHEpICYgMHgxZikgPDwgOCkKQEAgLTE5NSw3ICsxOTUsNyBAQAogICogQENNRF9XQU5UX1NLQjogTm90IHZhbGlkIHdpdGggQ01EX0FTWU5DLiBUaGUgY2FsbGVyIG5lZWRzIHRoZSBidWZmZXIgb2YKICAqCXRoZSByZXNwb25zZS4gVGhlIGNhbGxlciBuZWVkcyB0byBjYWxsIGl3bF9mcmVlX3Jlc3Agd2hlbiBkb25lLgogICogQENNRF9ISUdIX1BSSU86IFRoZSBjb21tYW5kIGlzIGhpZ2ggcHJpb3JpdHkgLSBpdCBnb2VzIHRvIHRoZSBmcm9udCBvZiB0aGUKLSAqCWNvbW1hbmQgcXVldWUsIGJ1dCBhZnRlciBvdGhlciBoaWdoIHByaW9yaXR5IGNvbW1hbmRzLiB2YWxpZCBvbmx5CisgKgljb21tYW5kIHF1ZXVlLCBidXQgYWZ0ZXIgb3RoZXIgaGlnaCBwcmlvcml0eSBjb21tYW5kcy4gVmFsaWQgb25seQogICoJd2l0aCBDTURfQVNZTkMuCiAgKiBAQ01EX1NFTkRfSU5fSURMRTogVGhlIGNvbW1hbmQgc2hvdWxkIGJlIHNlbnQgZXZlbiB3aGVuIHRoZSB0cmFucyBpcyBpZGxlLgogICogQENNRF9NQUtFX1RSQU5TX0lETEU6IFRoZSBjb21tYW5kIHJlc3BvbnNlIHNob3VsZCBtYXJrIHRoZSB0cmFucyBhcyBpZGxlLgpAQCAtNDU4LDYgKzQ1OCw4IEBACiAgKiBAdHhxX2Rpc2FibGU6IGRlLWNvbmZpZ3VyZSBhIFR4IHF1ZXVlIHRvIHNlbmQgQU1QRFVzCiAgKglNdXN0IGJlIGF0b21pYwogICogQHdhaXRfdHhfcXVldWVfZW1wdHk6IHdhaXQgdW50aWwgdHggcXVldWVzIGFyZSBlbXB0eS4gTWF5IHNsZWVwLgorICogQGZyZWV6ZV90eHFfdGltZXI6IHByZXZlbnRzIHRoZSB0aW1lciBvZiB0aGUgcXVldWUgZnJvbSBmaXJpbmcgdW50aWwgdGhlCisgKglxdWV1ZSBpcyBzZXQgdG8gYXdha2UuIE11c3QgYmUgYXRvbWljLgogICogQGRiZ2ZzX3JlZ2lzdGVyOiBhZGQgdGhlIGRiZ2ZzIGZpbGVzIHVuZGVyIHRoaXMgZGlyZWN0b3J5LiBGaWxlcyB3aWxsIGJlCiAgKglhdXRvbWF0aWNhbGx5IGRlbGV0ZWQuCiAgKiBAd3JpdGU4OiB3cml0ZSBhIHU4IHRvIGEgcmVnaXN0ZXIgYXQgb2Zmc2V0IG9mcyBmcm9tIHRoZSBCQVIKQEAgLTUxNyw2ICs1MTksOCBAQAogCiAJaW50ICgqZGJnZnNfcmVnaXN0ZXIpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgZGVudHJ5KiBkaXIpOwogCWludCAoKndhaXRfdHhfcXVldWVfZW1wdHkpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB1MzIgdHhxX2JtKTsKKwl2b2lkICgqZnJlZXplX3R4cV90aW1lcikoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHVuc2lnbmVkIGxvbmcgdHhxcywKKwkJCQkgYm9vbCBmcmVlemUpOwogCiAJdm9pZCAoKndyaXRlOCkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHUzMiBvZnMsIHU4IHZhbCk7CiAJdm9pZCAoKndyaXRlMzIpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCB1MzIgb2ZzLCB1MzIgdmFsKTsKQEAgLTU3OCw3ICs1ODIsNyBAQAogICogQGNmZyAtIHBvaW50ZXIgdG8gdGhlIGNvbmZpZ3VyYXRpb24KICAqIEBzdGF0dXM6IGEgYml0LW1hc2sgb2YgdHJhbnNwb3J0IHN0YXR1cyBmbGFncwogICogQGRldiAtIHBvaW50ZXIgdG8gc3RydWN0IGRldmljZSAqIHRoYXQgcmVwcmVzZW50cyB0aGUgZGV2aWNlCi0gKiBAaHdfaWQ6IGEgdTMyIHdpdGggdGhlIElEIG9mIHRoZSBkZXZpY2UgLyBzdWJkZXZpY2UuCisgKiBAaHdfaWQ6IGEgdTMyIHdpdGggdGhlIElEIG9mIHRoZSBkZXZpY2UgLyBzdWItZGV2aWNlLgogICoJU2V0IGR1cmluZyB0cmFuc3BvcnQgYWxsb2NhdGlvbi4KICAqIEBod19pZF9zdHI6IGEgc3RyaW5nIHdpdGggaW5mbyBhYm91dCBIVyBJRC4gU2V0IGR1cmluZyB0cmFuc3BvcnQgYWxsb2NhdGlvbi4KICAqIEBwbV9zdXBwb3J0OiBzZXQgdG8gdHJ1ZSBpbiBzdGFydF9odyBpZiBsaW5rIHBtIGlzIHN1cHBvcnRlZApAQCAtNTk1LDYgKzU5OSw3IEBACiAgKiBAZGZsdF9wd3JfbGltaXQ6IGRlZmF1bHQgcG93ZXIgbGltaXQgZmV0Y2hlZCBmcm9tIHRoZSBwbGF0Zm9ybSAoQUNQSSkKICAqIEBkYmdfZGVzdF90bHY6IHBvaW50cyB0byB0aGUgZGVzdGluYXRpb24gVExWIGZvciBkZWJ1ZwogICogQGRiZ19jb25mX3RsdjogYXJyYXkgb2YgcG9pbnRlcnMgdG8gY29uZmlndXJhdGlvbiBUTFZzIGZvciBkZWJ1ZworICogQGRiZ190cmlnZ2VyX3RsdjogYXJyYXkgb2YgcG9pbnRlcnMgdG8gdHJpZ2dlcnMgVExWcyBmb3IgZGVidWcKICAqIEBkYmdfZGVzdF9yZWdfbnVtOiBudW0gb2YgcmVnX29wcyBpbiAlZGJnX2Rlc3RfdGx2CiAgKi8KIHN0cnVjdCBpd2xfdHJhbnMgewpAQCAtNjI4LDcgKzYzMyw4IEBACiAJdTY0IGRmbHRfcHdyX2xpbWl0OwogCiAJY29uc3Qgc3RydWN0IGl3bF9md19kYmdfZGVzdF90bHYgKmRiZ19kZXN0X3RsdjsKLQljb25zdCBzdHJ1Y3QgaXdsX2Z3X2RiZ19jb25mX3RsdiAqZGJnX2NvbmZfdGx2W0ZXX0RCR19NQVhdOworCWNvbnN0IHN0cnVjdCBpd2xfZndfZGJnX2NvbmZfdGx2ICpkYmdfY29uZl90bHZbRldfREJHX0NPTkZfTUFYXTsKKwlzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RsdiAqIGNvbnN0ICpkYmdfdHJpZ2dlcl90bHY7CiAJdTggZGJnX2Rlc3RfcmVnX251bTsKIAogCWVudW0gaXdsX2QwaTNfbW9kZSBkMGkzX21vZGU7CkBAIC04NzEsNiArODc3LDE3IEBACiAJaXdsX3RyYW5zX3R4cV9lbmFibGVfY2ZnKHRyYW5zLCBxdWV1ZSwgMCwgJmNmZywgcXVldWVfd2RnX3RpbWVvdXQpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgaXdsX3RyYW5zX2ZyZWV6ZV90eHFfdGltZXIoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgdHhxcywKKwkJCQkJICAgICAgYm9vbCBmcmVlemUpCit7CisJaWYgKHVubGlrZWx5KHRyYW5zLT5zdGF0ZSAhPSBJV0xfVFJBTlNfRldfQUxJVkUpKQorCQlJV0xfRVJSKHRyYW5zLCAiJXMgYmFkIHN0YXRlID0gJWRcbiIsIF9fZnVuY19fLCB0cmFucy0+c3RhdGUpOworCisJaWYgKHRyYW5zLT5vcHMtPmZyZWV6ZV90eHFfdGltZXIpCisJCXRyYW5zLT5vcHMtPmZyZWV6ZV90eHFfdGltZXIodHJhbnMsIHR4cXMsIGZyZWV6ZSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGl3bF90cmFuc193YWl0X3R4X3F1ZXVlX2VtcHR5KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAogCQkJCQkJdTMyIHR4cXMpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9jb2V4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9jb2V4LmMKaW5kZXggMWVjNGQ1NS4uMTNhMGEwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vY29leC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2NvZXguYwpAQCAtNzIsMTU4ICs3Miw2IEBACiAjaW5jbHVkZSAibXZtLmgiCiAjaW5jbHVkZSAiaXdsLWRlYnVnLmgiCiAKLWNvbnN0IHUzMiBpd2xfYnRfY3RsX2tpbGxfbXNrW0JUX0tJTExfTVNLX01BWF0gPSB7Ci0JW0JUX0tJTExfTVNLX0RFRkFVTFRdID0gMHhmZmZmZmMwMCwKLQlbQlRfS0lMTF9NU0tfTkVWRVJdID0gMHhmZmZmZmZmZiwKLQlbQlRfS0lMTF9NU0tfQUxXQVlTXSA9IDAsCi19OwotCi1jb25zdCB1OCBpd2xfYnRfY3RzX2tpbGxfbXNrW0JUX01BWF9BR11bQlRfQ09FWF9NQVhfTFVUXSA9IHsKLQl7Ci0JCUJUX0tJTExfTVNLX0FMV0FZUywKLQkJQlRfS0lMTF9NU0tfQUxXQVlTLAotCQlCVF9LSUxMX01TS19BTFdBWVMsCi0JfSwKLQl7Ci0JCUJUX0tJTExfTVNLX05FVkVSLAotCQlCVF9LSUxMX01TS19ORVZFUiwKLQkJQlRfS0lMTF9NU0tfTkVWRVIsCi0JfSwKLQl7Ci0JCUJUX0tJTExfTVNLX05FVkVSLAotCQlCVF9LSUxMX01TS19ORVZFUiwKLQkJQlRfS0lMTF9NU0tfTkVWRVIsCi0JfSwKLQl7Ci0JCUJUX0tJTExfTVNLX0RFRkFVTFQsCi0JCUJUX0tJTExfTVNLX05FVkVSLAotCQlCVF9LSUxMX01TS19ERUZBVUxULAotCX0sCi19OwotCi1jb25zdCB1OCBpd2xfYnRfYWNrX2tpbGxfbXNrW0JUX01BWF9BR11bQlRfQ09FWF9NQVhfTFVUXSA9IHsKLQl7Ci0JCUJUX0tJTExfTVNLX0FMV0FZUywKLQkJQlRfS0lMTF9NU0tfQUxXQVlTLAotCQlCVF9LSUxMX01TS19BTFdBWVMsCi0JfSwKLQl7Ci0JCUJUX0tJTExfTVNLX0FMV0FZUywKLQkJQlRfS0lMTF9NU0tfQUxXQVlTLAotCQlCVF9LSUxMX01TS19BTFdBWVMsCi0JfSwKLQl7Ci0JCUJUX0tJTExfTVNLX0FMV0FZUywKLQkJQlRfS0lMTF9NU0tfQUxXQVlTLAotCQlCVF9LSUxMX01TS19BTFdBWVMsCi0JfSwKLQl7Ci0JCUJUX0tJTExfTVNLX0RFRkFVTFQsCi0JCUJUX0tJTExfTVNLX0FMV0FZUywKLQkJQlRfS0lMTF9NU0tfREVGQVVMVCwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IF9fbGUzMiBpd2xfYnRfcHJpb19ib29zdFtCVF9DT0VYX0JPT1NUX1NJWkVdID0gewotCWNwdV90b19sZTMyKDB4ZjBmMGYwZjApLCAvKiA1MCUgKi8KLQljcHVfdG9fbGUzMigweGMwYzBjMGMwKSwgLyogMjUlICovCi0JY3B1X3RvX2xlMzIoMHhmY2ZjZmNmYyksIC8qIDc1JSAqLwotCWNwdV90b19sZTMyKDB4ZmVmZWZlZmUpLCAvKiA4Ny41JSAqLwotfTsKLQotc3RhdGljIGNvbnN0IF9fbGUzMiBpd2xfc2luZ2xlX3NoYXJlZF9hbnRbQlRfQ09FWF9NQVhfTFVUXVtCVF9DT0VYX0xVVF9TSVpFXSA9IHsKLQl7Ci0JCWNwdV90b19sZTMyKDB4NDAwMDAwMDApLAotCQljcHVfdG9fbGUzMigweDAwMDAwMDAwKSwKLQkJY3B1X3RvX2xlMzIoMHg0NDAwMDAwMCksCi0JCWNwdV90b19sZTMyKDB4MDAwMDAwMDApLAotCQljcHVfdG9fbGUzMigweDQwMDAwMDAwKSwKLQkJY3B1X3RvX2xlMzIoMHgwMDAwMDAwMCksCi0JCWNwdV90b19sZTMyKDB4NDQwMDAwMDApLAotCQljcHVfdG9fbGUzMigweDAwMDAwMDAwKSwKLQkJY3B1X3RvX2xlMzIoMHhjMDAwNDAwMCksCi0JCWNwdV90b19sZTMyKDB4ZjAwMDUwMDApLAotCQljcHVfdG9fbGUzMigweGMwMDA0MDAwKSwKLQkJY3B1X3RvX2xlMzIoMHhmMDAwNTAwMCksCi0JfSwKLQl7Ci0JCWNwdV90b19sZTMyKDB4NDAwMDAwMDApLAotCQljcHVfdG9fbGUzMigweDAwMDAwMDAwKSwKLQkJY3B1X3RvX2xlMzIoMHg0NDAwMDAwMCksCi0JCWNwdV90b19sZTMyKDB4MDAwMDAwMDApLAotCQljcHVfdG9fbGUzMigweDQwMDAwMDAwKSwKLQkJY3B1X3RvX2xlMzIoMHgwMDAwMDAwMCksCi0JCWNwdV90b19sZTMyKDB4NDQwMDAwMDApLAotCQljcHVfdG9fbGUzMigweDAwMDAwMDAwKSwKLQkJY3B1X3RvX2xlMzIoMHhjMDAwNDAwMCksCi0JCWNwdV90b19sZTMyKDB4ZjAwMDUwMDApLAotCQljcHVfdG9fbGUzMigweGMwMDA0MDAwKSwKLQkJY3B1X3RvX2xlMzIoMHhmMDAwNTAwMCksCi0JfSwKLQl7Ci0JCWNwdV90b19sZTMyKDB4NDAwMDAwMDApLAotCQljcHVfdG9fbGUzMigweDAwMDAwMDAwKSwKLQkJY3B1X3RvX2xlMzIoMHg0NDAwMDAwMCksCi0JCWNwdV90b19sZTMyKDB4MDAwMDAwMDApLAotCQljcHVfdG9fbGUzMigweDQwMDAwMDAwKSwKLQkJY3B1X3RvX2xlMzIoMHgwMDAwMDAwMCksCi0JCWNwdV90b19sZTMyKDB4NDQwMDAwMDApLAotCQljcHVfdG9fbGUzMigweDAwMDAwMDAwKSwKLQkJY3B1X3RvX2xlMzIoMHhjMDAwNDAwMCksCi0JCWNwdV90b19sZTMyKDB4ZjAwMDUwMDApLAotCQljcHVfdG9fbGUzMigweGMwMDA0MDAwKSwKLQkJY3B1X3RvX2xlMzIoMHhmMDAwNTAwMCksCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBfX2xlMzIgaXdsX2NvbWJpbmVkX2xvb2t1cFtCVF9DT0VYX01BWF9MVVRdW0JUX0NPRVhfTFVUX1NJWkVdID0gewotCXsKLQkJLyogVGlnaHQgKi8KLQkJY3B1X3RvX2xlMzIoMHhhYWFhYWFhYSksCi0JCWNwdV90b19sZTMyKDB4YWFhYWFhYWEpLAotCQljcHVfdG9fbGUzMigweGFlYWFhYWFhKSwKLQkJY3B1X3RvX2xlMzIoMHhhYWFhYWFhYSksCi0JCWNwdV90b19sZTMyKDB4Y2MwMGZmMjgpLAotCQljcHVfdG9fbGUzMigweDAwMDBhYWFhKSwKLQkJY3B1X3RvX2xlMzIoMHhjYzAwYWFhYSksCi0JCWNwdV90b19sZTMyKDB4MDAwMGFhYWEpLAotCQljcHVfdG9fbGUzMigweGMwMDA0MDAwKSwKLQkJY3B1X3RvX2xlMzIoMHgwMDAwNDAwMCksCi0JCWNwdV90b19sZTMyKDB4ZjAwMDUwMDApLAotCQljcHVfdG9fbGUzMigweGYwMDA1MDAwKSwKLQl9LAotCXsKLQkJLyogTG9vc2UgKi8KLQkJY3B1X3RvX2xlMzIoMHhhYWFhYWFhYSksCi0JCWNwdV90b19sZTMyKDB4YWFhYWFhYWEpLAotCQljcHVfdG9fbGUzMigweGFhYWFhYWFhKSwKLQkJY3B1X3RvX2xlMzIoMHhhYWFhYWFhYSksCi0JCWNwdV90b19sZTMyKDB4Y2MwMGZmMjgpLAotCQljcHVfdG9fbGUzMigweDAwMDBhYWFhKSwKLQkJY3B1X3RvX2xlMzIoMHhjYzAwYWFhYSksCi0JCWNwdV90b19sZTMyKDB4MDAwMGFhYWEpLAotCQljcHVfdG9fbGUzMigweDAwMDAwMDAwKSwKLQkJY3B1X3RvX2xlMzIoMHgwMDAwMDAwMCksCi0JCWNwdV90b19sZTMyKDB4ZjAwMDUwMDApLAotCQljcHVfdG9fbGUzMigweGYwMDA1MDAwKSwKLQl9LAotCXsKLQkJLyogVHggVHggZGlzYWJsZWQgKi8KLQkJY3B1X3RvX2xlMzIoMHhhYWFhYWFhYSksCi0JCWNwdV90b19sZTMyKDB4YWFhYWFhYWEpLAotCQljcHVfdG9fbGUzMigweGVlYWFhYWFhKSwKLQkJY3B1X3RvX2xlMzIoMHhhYWFhYWFhYSksCi0JCWNwdV90b19sZTMyKDB4Y2MwMGZmMjgpLAotCQljcHVfdG9fbGUzMigweDAwMDBhYWFhKSwKLQkJY3B1X3RvX2xlMzIoMHhjYzAwYWFhYSksCi0JCWNwdV90b19sZTMyKDB4MDAwMGFhYWEpLAotCQljcHVfdG9fbGUzMigweGMwMDA0MDAwKSwKLQkJY3B1X3RvX2xlMzIoMHhjMDAwNDAwMCksCi0JCWNwdV90b19sZTMyKDB4ZjAwMDUwMDApLAotCQljcHVfdG9fbGUzMigweGYwMDA1MDAwKSwKLQl9LAotfTsKLQogLyogMjBNSHogLyA0ME1IeiBiZWxvdyAvIDQwTWh6IGFib3ZlKi8KIHN0YXRpYyBjb25zdCBfX2xlNjQgaXdsX2NpX21hc2tbXVszXSA9IHsKIAkvKiBkdW1teSBlbnRyeSBmb3IgY2hhbm5lbCAwICovCkBAIC01OTYsMTQgKzQ0NCw2IEBACiAJCWdvdG8gc2VuZF9jbWQ7CiAJfQogCi0JYnRfY21kLT5tYXhfa2lsbCA9IGNwdV90b19sZTMyKDUpOwotCWJ0X2NtZC0+YnQ0X2FudGVubmFfaXNvbGF0aW9uX3RociA9Ci0JCWNwdV90b19sZTMyKElXTF9NVk1fQlRfQ09FWF9BTlRFTk5BX0NPVVBMSU5HX1RIUlMpOwotCWJ0X2NtZC0+YnQ0X3R4X3R4X2RlbHRhX2ZyZXFfdGhyID0gY3B1X3RvX2xlMzIoMTUpOwotCWJ0X2NtZC0+YnQ0X3R4X3J4X21heF9mcmVxMCA9IGNwdV90b19sZTMyKDE1KTsKLQlidF9jbWQtPm92ZXJyaWRlX3ByaW1hcnlfbHV0ID0gY3B1X3RvX2xlMzIoQlRfQ09FWF9JTlZBTElEX0xVVCk7Ci0JYnRfY21kLT5vdmVycmlkZV9zZWNvbmRhcnlfbHV0ID0gY3B1X3RvX2xlMzIoQlRfQ09FWF9JTlZBTElEX0xVVCk7Ci0KIAltb2RlID0gaXdsd2lmaV9tb2RfcGFyYW1zLmJ0X2NvZXhfYWN0aXZlID8gQlRfQ09FWF9OVyA6IEJUX0NPRVhfRElTQUJMRTsKIAlidF9jbWQtPm1vZGUgPSBjcHVfdG9fbGUzMihtb2RlKTsKIApAQCAtNjExLDcgKzQ1MSw3IEBACiAJCWJ0X2NtZC0+ZW5hYmxlZF9tb2R1bGVzIHw9CiAJCQljcHVfdG9fbGUzMihCVF9DT0VYX1NZTkMyU0NPX0VOQUJMRUQpOwogCi0JaWYgKElXTF9NVk1fQlRfQ09FWF9DT1JVTk5JTkcpCisJaWYgKGl3bF9tdm1fYnRfaXNfcGxjcl9zdXBwb3J0ZWQobXZtKSkKIAkJYnRfY21kLT5lbmFibGVkX21vZHVsZXMgfD0gY3B1X3RvX2xlMzIoQlRfQ09FWF9DT1JVTl9FTkFCTEVEKTsKIAogCWlmIChJV0xfTVZNX0JUX0NPRVhfTVBMVVQpIHsKQEAgLTYyMiwxOCArNDYyLDYgQEAKIAogCWJ0X2NtZC0+ZW5hYmxlZF9tb2R1bGVzIHw9IGNwdV90b19sZTMyKEJUX0NPRVhfSElHSF9CQU5EX1JFVCk7CiAKLQlpZiAobXZtLT5jZmctPmJ0X3NoYXJlZF9zaW5nbGVfYW50KQotCQltZW1jcHkoJmJ0X2NtZC0+ZGVjaXNpb25fbHV0LCBpd2xfc2luZ2xlX3NoYXJlZF9hbnQsCi0JCSAgICAgICBzaXplb2YoaXdsX3NpbmdsZV9zaGFyZWRfYW50KSk7Ci0JZWxzZQotCQltZW1jcHkoJmJ0X2NtZC0+ZGVjaXNpb25fbHV0LCBpd2xfY29tYmluZWRfbG9va3VwLAotCQkgICAgICAgc2l6ZW9mKGl3bF9jb21iaW5lZF9sb29rdXApKTsKLQotCW1lbWNweSgmYnRfY21kLT5tcGx1dF9wcmlvX2Jvb3N0LCBpd2xfYnRfcHJpb19ib29zdCwKLQkgICAgICAgc2l6ZW9mKGl3bF9idF9wcmlvX2Jvb3N0KSk7Ci0JYnRfY21kLT5tdWx0aXByaW9fbHV0WzBdID0gY3B1X3RvX2xlMzIoSVdMX01WTV9CVF9DT0VYX01QTFVUX1JFRzApOwotCWJ0X2NtZC0+bXVsdGlwcmlvX2x1dFsxXSA9IGNwdV90b19sZTMyKElXTF9NVk1fQlRfQ09FWF9NUExVVF9SRUcxKTsKLQogc2VuZF9jbWQ6CiAJbWVtc2V0KCZtdm0tPmxhc3RfYnRfbm90aWYsIDAsIHNpemVvZihtdm0tPmxhc3RfYnRfbm90aWYpKTsKIAltZW1zZXQoJm12bS0+bGFzdF9idF9jaV9jbWQsIDAsIHNpemVvZihtdm0tPmxhc3RfYnRfY2lfY21kKSk7CkBAIC02NDQsNDggKzQ3Miw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBpd2xfbXZtX2J0X3VkcGF0ZV9zd19ib29zdChzdHJ1Y3QgaXdsX212bSAqbXZtKQotewotCXN0cnVjdCBpd2xfYnRfY29leF9wcm9maWxlX25vdGlmICpub3RpZiA9ICZtdm0tPmxhc3RfYnRfbm90aWY7Ci0JdTMyIHByaW1hcnlfbHV0ID0gbGUzMl90b19jcHUobm90aWYtPnByaW1hcnlfY2hfbHV0KTsKLQl1MzIgc2Vjb25kYXJ5X2x1dCA9IGxlMzJfdG9fY3B1KG5vdGlmLT5zZWNvbmRhcnlfY2hfbHV0KTsKLQl1MzIgYWcgPSBsZTMyX3RvX2NwdShub3RpZi0+YnRfYWN0aXZpdHlfZ3JhZGluZyk7Ci0Jc3RydWN0IGl3bF9idF9jb2V4X3N3X2Jvb3N0X3VwZGF0ZV9jbWQgY21kID0ge307Ci0JdTggYWNrX2tpbGxfbXNrW05VTV9QSFlfQ1RYXSA9IHt9OwotCXU4IGN0c19raWxsX21za1tOVU1fUEhZX0NUWF0gPSB7fTsKLQlpbnQgaTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwotCi0JYWNrX2tpbGxfbXNrWzBdID0gaXdsX2J0X2Fja19raWxsX21za1thZ11bcHJpbWFyeV9sdXRdOwotCWN0c19raWxsX21za1swXSA9IGl3bF9idF9jdHNfa2lsbF9tc2tbYWddW3ByaW1hcnlfbHV0XTsKLQotCWFja19raWxsX21za1sxXSA9IGl3bF9idF9hY2tfa2lsbF9tc2tbYWddW3NlY29uZGFyeV9sdXRdOwotCWN0c19raWxsX21za1sxXSA9IGl3bF9idF9jdHNfa2lsbF9tc2tbYWddW3NlY29uZGFyeV9sdXRdOwotCi0JLyogRG9uJ3Qgc2VuZCBIQ01EIGlmIHRoZXJlIGlzIG5vIHVwZGF0ZSAqLwotCWlmICghbWVtY21wKGFja19raWxsX21zaywgbXZtLT5idF9hY2tfa2lsbF9tc2ssIHNpemVvZihhY2tfa2lsbF9tc2spKSB8fAotCSAgICAhbWVtY21wKGN0c19raWxsX21zaywgbXZtLT5idF9jdHNfa2lsbF9tc2ssIHNpemVvZihjdHNfa2lsbF9tc2spKSkKLQkJcmV0dXJuIDA7Ci0KLQltZW1jcHkobXZtLT5idF9hY2tfa2lsbF9tc2ssIGFja19raWxsX21zaywKLQkgICAgICAgc2l6ZW9mKG12bS0+YnRfYWNrX2tpbGxfbXNrKSk7Ci0JbWVtY3B5KG12bS0+YnRfY3RzX2tpbGxfbXNrLCBjdHNfa2lsbF9tc2ssCi0JICAgICAgIHNpemVvZihtdm0tPmJ0X2N0c19raWxsX21zaykpOwotCi0JQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoYWNrX2tpbGxfbXNrKSA8IEFSUkFZX1NJWkUoY21kLmJvb3N0X3ZhbHVlcykpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY21kLmJvb3N0X3ZhbHVlcyk7IGkrKykgewotCQljbWQuYm9vc3RfdmFsdWVzW2ldLmtpbGxfYWNrX21zayA9Ci0JCQljcHVfdG9fbGUzMihpd2xfYnRfY3RsX2tpbGxfbXNrW2Fja19raWxsX21za1tpXV0pOwotCQljbWQuYm9vc3RfdmFsdWVzW2ldLmtpbGxfY3RzX21zayA9Ci0JCQljcHVfdG9fbGUzMihpd2xfYnRfY3RsX2tpbGxfbXNrW2N0c19raWxsX21za1tpXV0pOwotCX0KLQotCXJldHVybiBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIEJUX0NPRVhfVVBEQVRFX1NXX0JPT1NULCAwLAotCQkJCSAgICBzaXplb2YoY21kKSwgJmNtZCk7Ci19Ci0KIHN0YXRpYyBpbnQgaXdsX212bV9idF9jb2V4X3JlZHVjZWRfdHhwKHN0cnVjdCBpd2xfbXZtICptdm0sIHU4IHN0YV9pZCwKIAkJCQkgICAgICAgYm9vbCBlbmFibGUpCiB7CkBAIC03OTMsNyArNTc5LDggQEAKIAlpZiAoIXZpZi0+YnNzX2NvbmYuYXNzb2MpCiAJCXNtcHNfbW9kZSA9IElFRUU4MDIxMV9TTVBTX0FVVE9NQVRJQzsKIAotCWlmIChJV0xfQ09FWF9JU19SUkNfT04obXZtLT5sYXN0X2J0X25vdGlmLnR0Y19ycmNfc3RhdHVzLAorCWlmIChtdm12aWYtPnBoeV9jdHh0ICYmCisJICAgIElXTF9DT0VYX0lTX1JSQ19PTihtdm0tPmxhc3RfYnRfbm90aWYudHRjX3JyY19zdGF0dXMsCiAJCQkgICAgICAgbXZtdmlmLT5waHlfY3R4dC0+aWQpKQogCQlzbXBzX21vZGUgPSBJRUVFODAyMTFfU01QU19BVVRPTUFUSUM7CiAKQEAgLTk1MCw5ICs3MzcsNiBAQAogCQkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gc2VuZCBCVF9DSSBjbWRcbiIpOwogCQltZW1jcHkoJm12bS0+bGFzdF9idF9jaV9jbWQsICZjbWQsIHNpemVvZihjbWQpKTsKIAl9Ci0KLQlpZiAoaXdsX212bV9idF91ZHBhdGVfc3dfYm9vc3QobXZtKSkKLQkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gdXBkYXRlIHRoZSBjdHJsX2tpbGxfbXNrXG4iKTsKIH0KIAogaW50IGl3bF9tdm1fcnhfYnRfY29leF9ub3RpZihzdHJ1Y3QgaXdsX212bSAqbXZtLApAQCAtMTAyMyw3ICs4MDcsNyBAQAogfQogCiB2b2lkIGl3bF9tdm1fYnRfcnNzaV9ldmVudChzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgZW51bSBpZWVlODAyMTFfcnNzaV9ldmVudCByc3NpX2V2ZW50KQorCQkJICAgZW51bSBpZWVlODAyMTFfcnNzaV9ldmVudF9kYXRhIHJzc2lfZXZlbnQpCiB7CiAJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CiAJc3RydWN0IGl3bF9idF9pdGVyYXRvcl9kYXRhIGRhdGEgPSB7CkBAIC0xMDczLDkgKzg1Nyw2IEBACiAJaWVlZTgwMjExX2l0ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXNfYXRvbWljKAogCQltdm0tPmh3LCBJRUVFODAyMTFfSUZBQ0VfSVRFUl9OT1JNQUwsCiAJCWl3bF9tdm1fYnRfcnNzaV9pdGVyYXRvciwgJmRhdGEpOwotCi0JaWYgKGl3bF9tdm1fYnRfdWRwYXRlX3N3X2Jvb3N0KG12bSkpCi0JCUlXTF9FUlIobXZtLCAiRmFpbGVkIHRvIHVwZGF0ZSB0aGUgY3RybF9raWxsX21za1xuIik7CiB9CiAKICNkZWZpbmUgTElOS19RVUFMX0FHR19USU1FX0xJTUlUX0RFRgkoNDAwMCkKQEAgLTEyMzQsNyArMTAxNSw3IEBACiAJaWYgKCEobXZtLT5mdy0+dWNvZGVfY2FwYS5hcGlbMF0gJiBJV0xfVUNPREVfVExWX0FQSV9CVF9DT0VYX1NQTElUKSkKIAkJcmV0dXJuIGl3bF9tdm1fcnhfYW50X2NvdXBsaW5nX25vdGlmX29sZChtdm0sIHJ4YiwgZGV2X2NtZCk7CiAKLQlpZiAoIUlXTF9NVk1fQlRfQ09FWF9DT1JVTk5JTkcpCisJaWYgKCFpd2xfbXZtX2J0X2lzX3BsY3Jfc3VwcG9ydGVkKG12bSkpCiAJCXJldHVybiAwOwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbXZtLT5tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9jb2V4X2xlZ2FjeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vY29leF9sZWdhY3kuYwppbmRleCBkNTMwZWYzLi5kOTU0NTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9jb2V4X2xlZ2FjeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2NvZXhfbGVnYWN5LmMKQEAgLTI4OCw2ICsyODgsNjUgQEAKIAl9LAogfTsKIAorZW51bSBpd2xfYnRfa2lsbF9tc2sgeworCUJUX0tJTExfTVNLX0RFRkFVTFQsCisJQlRfS0lMTF9NU0tfTkVWRVIsCisJQlRfS0lMTF9NU0tfQUxXQVlTLAorCUJUX0tJTExfTVNLX01BWCwKK307CisKK3N0YXRpYyBjb25zdCB1MzIgaXdsX2J0X2N0bF9raWxsX21za1tCVF9LSUxMX01TS19NQVhdID0geworCVtCVF9LSUxMX01TS19ERUZBVUxUXSA9IDB4ZmZmZmZjMDAsCisJW0JUX0tJTExfTVNLX05FVkVSXSA9IDB4ZmZmZmZmZmYsCisJW0JUX0tJTExfTVNLX0FMV0FZU10gPSAwLAorfTsKKworc3RhdGljIGNvbnN0IHU4IGl3bF9idF9jdHNfa2lsbF9tc2tbQlRfTUFYX0FHXVtCVF9DT0VYX01BWF9MVVRdID0geworCXsKKwkJQlRfS0lMTF9NU0tfQUxXQVlTLAorCQlCVF9LSUxMX01TS19BTFdBWVMsCisJCUJUX0tJTExfTVNLX0FMV0FZUywKKwl9LAorCXsKKwkJQlRfS0lMTF9NU0tfTkVWRVIsCisJCUJUX0tJTExfTVNLX05FVkVSLAorCQlCVF9LSUxMX01TS19ORVZFUiwKKwl9LAorCXsKKwkJQlRfS0lMTF9NU0tfTkVWRVIsCisJCUJUX0tJTExfTVNLX05FVkVSLAorCQlCVF9LSUxMX01TS19ORVZFUiwKKwl9LAorCXsKKwkJQlRfS0lMTF9NU0tfREVGQVVMVCwKKwkJQlRfS0lMTF9NU0tfTkVWRVIsCisJCUJUX0tJTExfTVNLX0RFRkFVTFQsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCB1OCBpd2xfYnRfYWNrX2tpbGxfbXNrW0JUX01BWF9BR11bQlRfQ09FWF9NQVhfTFVUXSA9IHsKKwl7CisJCUJUX0tJTExfTVNLX0FMV0FZUywKKwkJQlRfS0lMTF9NU0tfQUxXQVlTLAorCQlCVF9LSUxMX01TS19BTFdBWVMsCisJfSwKKwl7CisJCUJUX0tJTExfTVNLX0FMV0FZUywKKwkJQlRfS0lMTF9NU0tfQUxXQVlTLAorCQlCVF9LSUxMX01TS19BTFdBWVMsCisJfSwKKwl7CisJCUJUX0tJTExfTVNLX0FMV0FZUywKKwkJQlRfS0lMTF9NU0tfQUxXQVlTLAorCQlCVF9LSUxMX01TS19BTFdBWVMsCisJfSwKKwl7CisJCUJUX0tJTExfTVNLX0RFRkFVTFQsCisJCUJUX0tJTExfTVNLX0FMV0FZUywKKwkJQlRfS0lMTF9NU0tfREVGQVVMVCwKKwl9LAorfTsKKwogc3RydWN0IGNvcnVubmluZ19ibG9ja19sdXRzIHsKIAl1OCByYW5nZTsKIAlfX2xlMzIgbHV0MjBbQlRfQ09FWF9DT1JVTl9MVVRfU0laRV07CkBAIC02MTksNyArNjc4LDcgQEAKIAlpZiAoSVdMX01WTV9CVF9DT0VYX1NZTkMyU0NPKQogCQlidF9jbWQtPmZsYWdzIHw9IGNwdV90b19sZTMyKEJUX0NPRVhfU1lOQzJTQ08pOwogCi0JaWYgKElXTF9NVk1fQlRfQ09FWF9DT1JVTk5JTkcpIHsKKwlpZiAoaXdsX212bV9idF9pc19wbGNyX3N1cHBvcnRlZChtdm0pKSB7CiAJCWJ0X2NtZC0+dmFsaWRfYml0X21zayB8PSBjcHVfdG9fbGUzMihCVF9WQUxJRF9DT1JVTl9MVVRfMjAgfAogCQkJCQkJICAgICBCVF9WQUxJRF9DT1JVTl9MVVRfNDApOwogCQlidF9jbWQtPmZsYWdzIHw9IGNwdV90b19sZTMyKEJUX0NPRVhfQ09SVU5OSU5HKTsKQEAgLTYzMyw3ICs2OTIsNyBAQAogCWlmIChJV0xfTVZNX0JUX0NPRVhfVFRDKQogCQlidF9jbWQtPmZsYWdzIHw9IGNwdV90b19sZTMyKEJUX0NPRVhfVFRDKTsKIAotCWlmIChJV0xfTVZNX0JUX0NPRVhfUlJDKQorCWlmIChpd2xfbXZtX2J0X2lzX3JyY19zdXBwb3J0ZWQobXZtKSkKIAkJYnRfY21kLT5mbGFncyB8PSBjcHVfdG9fbGUzMihCVF9DT0VYX1JSQyk7CiAKIAlpZiAobXZtLT5jZmctPmJ0X3NoYXJlZF9zaW5nbGVfYW50KQpAQCAtODMyLDcgKzg5MSw4IEBACiAJaWYgKCF2aWYtPmJzc19jb25mLmFzc29jKQogCQlzbXBzX21vZGUgPSBJRUVFODAyMTFfU01QU19BVVRPTUFUSUM7CiAKLQlpZiAoZGF0YS0+bm90aWYtPnJyY19lbmFibGVkICYgQklUKG12bXZpZi0+cGh5X2N0eHQtPmlkKSkKKwlpZiAobXZtdmlmLT5waHlfY3R4dCAmJgorCSAgICBkYXRhLT5ub3RpZi0+cnJjX2VuYWJsZWQgJiBCSVQobXZtdmlmLT5waHlfY3R4dC0+aWQpKQogCQlzbXBzX21vZGUgPSBJRUVFODAyMTFfU01QU19BVVRPTUFUSUM7CiAKIAlJV0xfREVCVUdfQ09FWChkYXRhLT5tdm0sCkBAIC0xMDY4LDcgKzExMjgsNyBAQAogfQogCiB2b2lkIGl3bF9tdm1fYnRfcnNzaV9ldmVudF9vbGQoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgICAgICBlbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50IHJzc2lfZXZlbnQpCisJCQkgICAgICAgZW51bSBpZWVlODAyMTFfcnNzaV9ldmVudF9kYXRhIHJzc2lfZXZlbnQpCiB7CiAJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CiAJc3RydWN0IGl3bF9idF9pdGVyYXRvcl9kYXRhIGRhdGEgPSB7CkBAIC0xMTY3LDE2ICsxMjI3LDEwIEBACiAJcmV0dXJuIGx1dF90eXBlICE9IEJUX0NPRVhfTE9PU0VfTFVUOwogfQogCi1ib29sIGl3bF9tdm1fYnRfY29leF9pc19hbnRfYXZhaWxfb2xkKHN0cnVjdCBpd2xfbXZtICptdm0sIHU4IGFudCkKLXsKLQl1MzIgYWcgPSBsZTMyX3RvX2NwdShtdm0tPmxhc3RfYnRfbm90aWZfb2xkLmJ0X2FjdGl2aXR5X2dyYWRpbmcpOwotCXJldHVybiBhZyA8IEJUX0hJR0hfVFJBRkZJQzsKLX0KLQogYm9vbCBpd2xfbXZtX2J0X2NvZXhfaXNfc2hhcmVkX2FudF9hdmFpbF9vbGQoc3RydWN0IGl3bF9tdm0gKm12bSkKIHsKIAl1MzIgYWcgPSBsZTMyX3RvX2NwdShtdm0tPmxhc3RfYnRfbm90aWZfb2xkLmJ0X2FjdGl2aXR5X2dyYWRpbmcpOwotCXJldHVybiBhZyA9PSBCVF9PRkY7CisJcmV0dXJuIGFnIDwgQlRfSElHSF9UUkFGRklDOwogfQogCiBib29sIGl3bF9tdm1fYnRfY29leF9pc190cGNfYWxsb3dlZF9vbGQoc3RydWN0IGl3bF9tdm0gKm12bSwKQEAgLTEyMTMsNyArMTI2Nyw3IEBACiAJCS5kYXRhZmxhZ3MgPSB7IElXTF9IQ01EX0RGTF9OT0NPUFksIH0sCiAJfTsKIAotCWlmICghSVdMX01WTV9CVF9DT0VYX0NPUlVOTklORykKKwlpZiAoIWl3bF9tdm1fYnRfaXNfcGxjcl9zdXBwb3J0ZWQobXZtKSkKIAkJcmV0dXJuIDA7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2QzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9kMy5jCmluZGV4IDE0ZThmZDYuLmE2YzQ4YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2QzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZDMuYwpAQCAtNjk0LDYgKzY5NCw5IEBACiAJaWYgKHJldCkKIAkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gc2VuZCBxdW90YTogJWRcbiIsIHJldCk7CiAKKwlpZiAoaXdsX212bV9pc19sYXJfc3VwcG9ydGVkKG12bSkgJiYgaXdsX212bV9pbml0X2Z3X3JlZ2QobXZtKSkKKwkJSVdMX0VSUihtdm0sICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBEMyBMQVIgaW5mb3JtYXRpb25cbiIpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExMjgsNiArMTEzMSw3IEBACiAJaXdsX3RyYW5zX2QzX3N1c3BlbmQobXZtLT50cmFucywgdGVzdCk7CiAgb3V0OgogCWlmIChyZXQgPCAwKSB7CisJCWl3bF9tdm1fcmVmKG12bSwgSVdMX01WTV9SRUZfVUNPREVfRE9XTik7CiAJCWllZWU4MDIxMV9yZXN0YXJ0X2h3KG12bS0+aHcpOwogCQlpd2xfbXZtX2ZyZWVfbmQobXZtKTsKIAl9CkBAIC0xNTk2LDcgKzE2MDAsNyBAQAogCiAJLyogUkYta2lsbCBhbHJlYWR5IGFzc2VydGVkIGFnYWluLi4uICovCiAJaWYgKCFjbWQucmVzcF9wa3QpIHsKLQkJcmV0ID0gLUVSRktJTEw7CisJCWZ3X3N0YXR1cyA9IEVSUl9QVFIoLUVSRktJTEwpOwogCQlnb3RvIG91dF9mcmVlX3Jlc3A7CiAJfQogCkBAIC0xNjA1LDcgKzE2MDksNyBAQAogCWxlbiA9IGl3bF9yeF9wYWNrZXRfcGF5bG9hZF9sZW4oY21kLnJlc3BfcGt0KTsKIAlpZiAobGVuIDwgc3RhdHVzX3NpemUpIHsKIAkJSVdMX0VSUihtdm0sICJJbnZhbGlkIFdvV0xBTiBzdGF0dXMgcmVzcG9uc2UhXG4iKTsKLQkJcmV0ID0gLUVJTzsKKwkJZndfc3RhdHVzID0gRVJSX1BUUigtRUlPKTsKIAkJZ290byBvdXRfZnJlZV9yZXNwOwogCX0KIApAQCAtMTYxMyw3ICsxNjE3LDcgQEAKIAlpZiAobGVuICE9IChzdGF0dXNfc2l6ZSArCiAJCSAgICBBTElHTihsZTMyX3RvX2NwdShzdGF0dXMtPndha2VfcGFja2V0X2J1ZnNpemUpLCA0KSkpIHsKIAkJSVdMX0VSUihtdm0sICJJbnZhbGlkIFdvV0xBTiBzdGF0dXMgcmVzcG9uc2UhXG4iKTsKLQkJcmV0ID0gLUVJTzsKKwkJZndfc3RhdHVzID0gRVJSX1BUUigtRUlPKTsKIAkJZ290byBvdXRfZnJlZV9yZXNwOwogCX0KIApAQCAtMTYyMSw3ICsxNjI1LDcgQEAKIAogb3V0X2ZyZWVfcmVzcDoKIAlpd2xfZnJlZV9yZXNwKCZjbWQpOwotCXJldHVybiByZXQgPyBFUlJfUFRSKHJldCkgOiBmd19zdGF0dXM7CisJcmV0dXJuIGZ3X3N0YXR1czsKIH0KIAogLyogcmVsZWFzZXMgdGhlIE1WTSBtdXRleCAqLwpAQCAtMTcyMiw2ICsxNzI2LDEwIEBACiAJcmVzdWx0cy0+bWF0Y2hlZF9wcm9maWxlcyA9IGxlMzJfdG9fY3B1KHF1ZXJ5LT5tYXRjaGVkX3Byb2ZpbGVzKTsKIAltZW1jcHkocmVzdWx0cy0+bWF0Y2hlcywgcXVlcnktPm1hdGNoZXMsIHNpemVvZihyZXN1bHRzLT5tYXRjaGVzKSk7CiAKKyNpZmRlZiBDUFRDRkdfSVdMV0lGSV9ERUJVR0ZTCisJbXZtLT5sYXN0X25ldGRldGVjdF9zY2FucyA9IGxlMzJfdG9fY3B1KHF1ZXJ5LT5uX3NjYW5zX2RvbmUpOworI2VuZGlmCisKIG91dF9mcmVlX3Jlc3A6CiAJaXdsX2ZyZWVfcmVzcCgmY21kKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTg3NCwyNyArMTg4MiwzNiBAQAogCS8qIHF1ZXJ5IFNSQU0gZmlyc3QgaW4gY2FzZSB3ZSB3YW50IGV2ZW50IGxvZ2dpbmcgKi8KIAlpd2xfbXZtX3JlYWRfZDNfc3JhbShtdm0pOwogCisJLyoKKwkgKiBRdWVyeSB0aGUgY3VycmVudCBsb2NhdGlvbiBhbmQgc291cmNlIGZyb20gdGhlIEQzIGZpcm13YXJlIHNvIHdlCisJICogY2FuIHBsYXkgaXQgYmFjayB3aGVuIHdlIHJlLWludGlhaWxpemUgdGhlIEQwIGZpcm13YXJlCisJICovCisJaXdsX212bV91cGRhdGVfY2hhbmdlZF9yZWdkb20obXZtKTsKKwogCWlmIChtdm0tPm5ldF9kZXRlY3QpIHsKIAkJaXdsX212bV9xdWVyeV9uZXRkZXRlY3RfcmVhc29ucyhtdm0sIHZpZik7CisJCS8qIGhhcyB1bmxvY2tlZCB0aGUgbXV0ZXgsIHNvIHNraXAgdGhhdCAqLworCQlnb3RvIG91dDsKIAl9IGVsc2UgewogCQlrZWVwID0gaXdsX212bV9xdWVyeV93YWtldXBfcmVhc29ucyhtdm0sIHZpZik7CiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwogCQlpZiAoa2VlcCkKIAkJCW12bS0+a2VlcF92aWYgPSB2aWY7CiAjZW5kaWYKKwkJLyogaGFzIHVubG9ja2VkIHRoZSBtdXRleCwgc28gc2tpcCB0aGF0ICovCisJCWdvdG8gb3V0X2l0ZXJhdGU7CiAJfQotCS8qIGhhcyB1bmxvY2tlZCB0aGUgbXV0ZXgsIHNvIHNraXAgdGhhdCAqLwotCWdvdG8gb3V0OwogCiAgb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOwogCi0gb3V0Ogorb3V0X2l0ZXJhdGU6CiAJaWYgKCF0ZXN0KQogCQlpZWVlODAyMTFfaXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlc19ydG5sKG12bS0+aHcsCiAJCQlJRUVFODAyMTFfSUZBQ0VfSVRFUl9OT1JNQUwsCiAJCQlpd2xfbXZtX2QzX2Rpc2Nvbm5lY3RfaXRlciwga2VlcCA/IHZpZiA6IE5VTEwpOwogCitvdXQ6CiAJLyogcmV0dXJuIDEgdG8gcmVjb25maWd1cmUgdGhlIGRldmljZSAqLwogCXNldF9iaXQoSVdMX01WTV9TVEFUVVNfSU5fSFdfUkVTVEFSVCwgJm12bS0+c3RhdHVzKTsKIAlzZXRfYml0KElXTF9NVk1fU1RBVFVTX0QzX1JFQ09ORklHLCAmbXZtLT5zdGF0dXMpOwpAQCAtMjAwNCw2ICsyMDIxLDcgQEAKIAlfX2l3bF9tdm1fcmVzdW1lKG12bSwgdHJ1ZSk7CiAJcnRubF91bmxvY2soKTsKIAlpd2xfYWJvcnRfbm90aWZpY2F0aW9uX3dhaXRzKCZtdm0tPm5vdGlmX3dhaXQpOworCWl3bF9tdm1fcmVmKG12bSwgSVdMX01WTV9SRUZfVUNPREVfRE9XTik7CiAJaWVlZTgwMjExX3Jlc3RhcnRfaHcobXZtLT5odyk7CiAKIAkvKiB3YWl0IGZvciByZXN0YXJ0IGFuZCBkaXNjb25uZWN0IGFsbCBpbnRlcmZhY2VzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9kZWJ1Z2ZzLXZpZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZGVidWdmcy12aWYuYwppbmRleCA1ZmUxNDU5Li41ZjM3ZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9kZWJ1Z2ZzLXZpZi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2RlYnVnZnMtdmlmLmMKQEAgLTU0NSw2ICs1NDUsNTcgQEAKIAlyZXR1cm4gcmV0ID8gY291bnQgOiAtRUlOVkFMOwogfQogCitzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfcnhfcGh5aW5mb193cml0ZShzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBjaGFyICpidWYsCisJCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CisJc3RydWN0IGl3bF9tdm0gKm12bSA9IG12bXZpZi0+bXZtOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eF9jb25mICpjaGFuY3R4X2NvbmY7CisJc3RydWN0IGl3bF9tdm1fcGh5X2N0eHQgKnBoeV9jdHh0OworCXUxNiB2YWx1ZTsKKwlpbnQgcmV0OworCisJcmV0ID0ga3N0cnRvdTE2KGJ1ZiwgMCwgJnZhbHVlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmbXZtLT5tdXRleCk7CisJcmN1X3JlYWRfbG9jaygpOworCisJY2hhbmN0eF9jb25mID0gcmN1X2RlcmVmZXJlbmNlKHZpZi0+Y2hhbmN0eF9jb25mKTsKKwkvKiBtYWtlIHN1cmUgdGhlIGNoYW5uZWwgY29udGV4dCBpcyBhc3NpZ25lZCAqLworCWlmICghY2hhbmN0eF9jb25mKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwaHlfY3R4dCA9ICZtdm0tPnBoeV9jdHh0c1sqKHUxNiAqKWNoYW5jdHhfY29uZi0+ZHJ2X3ByaXZdOworCXJjdV9yZWFkX3VubG9jaygpOworCisJbXZtLT5kYmdmc19yeF9waHlpbmZvID0gdmFsdWU7CisKKwlyZXQgPSBpd2xfbXZtX3BoeV9jdHh0X2NoYW5nZWQobXZtLCBwaHlfY3R4dCwgJmNoYW5jdHhfY29uZi0+bWluX2RlZiwKKwkJCQkgICAgICAgY2hhbmN0eF9jb25mLT5yeF9jaGFpbnNfc3RhdGljLAorCQkJCSAgICAgICBjaGFuY3R4X2NvbmYtPnJ4X2NoYWluc19keW5hbWljKTsKKwltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOworCisJcmV0dXJuIHJldCA/OiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QgaXdsX2RiZ2ZzX3J4X3BoeWluZm9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CisJY2hhciBidWZbOF07CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiMHglMDR4XG4iLCBtdm12aWYtPm12bS0+ZGJnZnNfcnhfcGh5aW5mbyk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHNpemVvZihidWYpKTsKK30KKwogI2RlZmluZSBNVk1fREVCVUdGU19XUklURV9GSUxFX09QUyhuYW1lLCBidWZzeikgXAogCV9NVk1fREVCVUdGU19XUklURV9GSUxFX09QUyhuYW1lLCBidWZzeiwgc3RydWN0IGllZWU4MDIxMV92aWYpCiAjZGVmaW5lIE1WTV9ERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMobmFtZSwgYnVmc3opIFwKQEAgLTU2MCw2ICs2MTEsNyBAQAogTVZNX0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhiZl9wYXJhbXMsIDI1Nik7CiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGxvd19sYXRlbmN5LCAxMCk7CiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHVhcHNkX21pc2JlaGF2aW5nLCAyMCk7CitNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHJ4X3BoeWluZm8sIDEwKTsKIAogdm9pZCBpd2xfbXZtX3ZpZl9kYmdmc19yZWdpc3RlcihzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewpAQCAtNTc1LDcgKzYyNyw2IEBACiAJCXJldHVybjsKIAogCW12bXZpZi0+ZGJnZnNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJpd2xtdm0iLCBkYmdmc19kaXIpOwotCW12bXZpZi0+bXZtID0gbXZtOwogCiAJaWYgKCFtdm12aWYtPmRiZ2ZzX2RpcikgewogCQlJV0xfRVJSKG12bSwgIkZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnkgdW5kZXIgJXNcbiIsCkBAIC01OTUsNiArNjQ2LDggQEAKIAkJCQkgU19JUlVTUiB8IFNfSVdVU1IpOwogCU1WTV9ERUJVR0ZTX0FERF9GSUxFX1ZJRih1YXBzZF9taXNiZWhhdmluZywgbXZtdmlmLT5kYmdmc19kaXIsCiAJCQkJIFNfSVJVU1IgfCBTX0lXVVNSKTsKKwlNVk1fREVCVUdGU19BRERfRklMRV9WSUYocnhfcGh5aW5mbywgbXZtdmlmLT5kYmdmc19kaXIsCisJCQkJIFNfSVJVU1IgfCBTX0lXVVNSKTsKIAogCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJiAhdmlmLT5wMnAgJiYKIAkgICAgbXZtdmlmID09IG12bS0+YmZfYWxsb3dlZF92aWYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9kZWJ1Z2ZzLmMKaW5kZXggODJjMDlkOC4uOWFjMDRjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2RlYnVnZnMuYwpAQCAtNTYyLDExICs1NjIsMTIgQEAKIAkJCSAgICAgICAiXHRTZWNvbmRhcnkgQ2hhbm5lbCBCaXRtYXAgMHglMDE2bGx4XG4iLAogCQkJICAgICAgIGxlNjRfdG9fY3B1KGNtZC0+YnRfc2Vjb25kYXJ5X2NpKSk7CiAKLQkJcG9zICs9IHNjbnByaW50ZihidWYrcG9zLCBidWZzei1wb3MsICJCVCBDb25maWd1cmF0aW9uIENNRFxuIik7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmK3BvcywgYnVmc3otcG9zLCAiXHRBQ0sgS2lsbCBNYXNrIDB4JTA4eFxuIiwKLQkJCQkgaXdsX2J0X2N0bF9raWxsX21za1ttdm0tPmJ0X2Fja19raWxsX21za1swXV0pOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1Zitwb3MsIGJ1ZnN6LXBvcywgIlx0Q1RTIEtpbGwgTWFzayAweCUwOHhcbiIsCi0JCQkJIGl3bF9idF9jdGxfa2lsbF9tc2tbbXZtLT5idF9jdHNfa2lsbF9tc2tbMF1dKTsKKwkJcG9zICs9IHNjbnByaW50ZihidWYrcG9zLCBidWZzei1wb3MsCisJCQkJICJCVCBDb25maWd1cmF0aW9uIENNRCAtIDA9ZGVmYXVsdCwgMT1uZXZlciwgMj1hbHdheXNcbiIpOworCQlwb3MgKz0gc2NucHJpbnRmKGJ1Zitwb3MsIGJ1ZnN6LXBvcywgIlx0QUNLIEtpbGwgbXNrIGlkeCAlZFxuIiwKKwkJCQkgbXZtLT5idF9hY2tfa2lsbF9tc2tbMF0pOworCQlwb3MgKz0gc2NucHJpbnRmKGJ1Zitwb3MsIGJ1ZnN6LXBvcywgIlx0Q1RTIEtpbGwgbXNrIGlkeCAlZFxuIiwKKwkJCQkgbXZtLT5idF9jdHNfa2lsbF9tc2tbMF0pOwogCiAJfSBlbHNlIHsKIAkJc3RydWN0IGl3bF9idF9jb2V4X2NpX2NtZCAqY21kID0gJm12bS0+bGFzdF9idF9jaV9jbWQ7CkBAIC01NzksMjEgKzU4MCw2IEBACiAJCXBvcyArPSBzY25wcmludGYoYnVmK3BvcywgYnVmc3otcG9zLAogCQkJICAgICAgICJcdFNlY29uZGFyeSBDaGFubmVsIEJpdG1hcCAweCUwMTZsbHhcbiIsCiAJCQkgICAgICAgbGU2NF90b19jcHUoY21kLT5idF9zZWNvbmRhcnlfY2kpKTsKLQotCQlwb3MgKz0gc2NucHJpbnRmKGJ1Zitwb3MsIGJ1ZnN6LXBvcywgIkJUIENvbmZpZ3VyYXRpb24gQ01EXG4iKTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYrcG9zLCBidWZzei1wb3MsCi0JCQkJICJcdFByaW1hcnk6IEFDSyBLaWxsIE1hc2sgMHglMDh4XG4iLAotCQkJCSBpd2xfYnRfY3RsX2tpbGxfbXNrW212bS0+YnRfYWNrX2tpbGxfbXNrWzBdXSk7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmK3BvcywgYnVmc3otcG9zLAotCQkJCSAiXHRQcmltYXJ5OiBDVFMgS2lsbCBNYXNrIDB4JTA4eFxuIiwKLQkJCQkgaXdsX2J0X2N0bF9raWxsX21za1ttdm0tPmJ0X2N0c19raWxsX21za1swXV0pOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1Zitwb3MsIGJ1ZnN6LXBvcywKLQkJCQkgIlx0U2Vjb25kYXJ5OiBBQ0sgS2lsbCBNYXNrIDB4JTA4eFxuIiwKLQkJCQkgaXdsX2J0X2N0bF9raWxsX21za1ttdm0tPmJ0X2Fja19raWxsX21za1sxXV0pOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1Zitwb3MsIGJ1ZnN6LXBvcywKLQkJCQkgIlx0U2Vjb25kYXJ5OiBDVFMgS2lsbCBNYXNrIDB4JTA4eFxuIiwKLQkJCQkgaXdsX2J0X2N0bF9raWxsX21za1ttdm0tPmJ0X2N0c19raWxsX21za1sxXV0pOwotCiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZtdm0tPm11dGV4KTsKQEAgLTk0Miw3ICs5MjgsNyBAQAogCQkJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBpd2xfbXZtICptdm0gPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JZW51bSBpd2xfZndfZGJnX2NvbmYgY29uZjsKKwlpbnQgY29uZjsKIAljaGFyIGJ1Zls4XTsKIAljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKIAlpbnQgcG9zID0gMDsKQEAgLTk2Niw3ICs5NTIsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoV0FSTl9PTihjb25mX2lkID49IEZXX0RCR19NQVgpKQorCWlmIChXQVJOX09OKGNvbmZfaWQgPj0gRldfREJHX0NPTkZfTUFYKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKQEAgLTk4NSw3ICs5NzEsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpd2xfbXZtX2Z3X2RiZ19jb2xsZWN0KG12bSk7CisJaXdsX212bV9md19kYmdfY29sbGVjdChtdm0sIEZXX0RCR19UUklHR0VSX1VTRVIsIE5VTEwsIDAsIDApOwogCiAJaXdsX212bV91bnJlZihtdm0sIElXTF9NVk1fUkVGX1BSUEhfV1JJVEUpOwogCkBAIC0xNDg3LDI2ICsxNDczLDYgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGl3bF9kYmdmc19lbmFibGVfc2Nhbl9pdGVyYXRpb25fbm90aWZfd3JpdGUoc3RydWN0IGl3bF9tdm0gKm12bSwKLQkJCQkJCQkgICBjaGFyICpidWYsCi0JCQkJCQkJICAgc2l6ZV90IGNvdW50LAotCQkJCQkJCSAgIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgdmFsOwotCi0JbXV0ZXhfbG9jaygmbXZtLT5tdXRleCk7Ci0KLQlpZiAoa3N0cnRvaW50KGJ1ZiwgMTAsICZ2YWwpKSB7Ci0JCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW12bS0+c2Nhbl9pdGVyX25vdGlmX2VuYWJsZWQgPSB2YWw7Ci0JbXV0ZXhfdW5sb2NrKCZtdm0tPm11dGV4KTsKLQotCXJldHVybiBjb3VudDsKLX0KLQogTVZNX0RFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhwcnBoX3JlZywgNjQpOwogCiAvKiBEZXZpY2Ugd2lkZSBkZWJ1Z2ZzIGVudHJpZXMgKi8KQEAgLTE1MjksNyArMTQ5NSw2IEBACiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGQwaTNfcmVmcywgOCk7CiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGZ3X2RiZ19jb25mLCA4KTsKIE1WTV9ERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKGZ3X2RiZ19jb2xsZWN0LCA4KTsKLU1WTV9ERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKGVuYWJsZV9zY2FuX2l0ZXJhdGlvbl9ub3RpZiwgOCk7CiAKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9CQ0FTVF9GSUxURVJJTkcKIE1WTV9ERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoYmNhc3RfZmlsdGVycywgMjU2KTsKQEAgLTE1NzMsOCArMTUzOCwxMSBAQAogCU1WTV9ERUJVR0ZTX0FERF9GSUxFKGQwaTNfcmVmcywgbXZtLT5kZWJ1Z2ZzX2RpciwgU19JUlVTUiB8IFNfSVdVU1IpOwogCU1WTV9ERUJVR0ZTX0FERF9GSUxFKGZ3X2RiZ19jb25mLCBtdm0tPmRlYnVnZnNfZGlyLCBTX0lSVVNSIHwgU19JV1VTUik7CiAJTVZNX0RFQlVHRlNfQUREX0ZJTEUoZndfZGJnX2NvbGxlY3QsIG12bS0+ZGVidWdmc19kaXIsIFNfSVdVU1IpOwotCU1WTV9ERUJVR0ZTX0FERF9GSUxFKGVuYWJsZV9zY2FuX2l0ZXJhdGlvbl9ub3RpZiwgbXZtLT5kZWJ1Z2ZzX2RpciwKLQkJCSAgICAgU19JV1VTUik7CisJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJlbmFibGVfc2Nhbl9pdGVyYXRpb25fbm90aWYiLAorCQkJCSBTX0lSVVNSIHwgU19JV1VTUiwKKwkJCQkgbXZtLT5kZWJ1Z2ZzX2RpciwKKwkJCQkgJm12bS0+c2Nhbl9pdGVyX25vdGlmX2VuYWJsZWQpKQorCQlnb3RvIGVycjsKIAogI2lmZGVmIENPTkZJR19JV0xXSUZJX0JDQVNUX0ZJTFRFUklORwogCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19CQ0FTVF9GSUxURVJJTkcpIHsKQEAgLTE2MDEsNiArMTU2OSw5IEBACiAJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJkM193YWtlX3N5c2Fzc2VydCIsIFNfSVJVU1IgfCBTX0lXVVNSLAogCQkJCSBtdm0tPmRlYnVnZnNfZGlyLCAmbXZtLT5kM193YWtlX3N5c2Fzc2VydCkpCiAJCWdvdG8gZXJyOworCWlmICghZGVidWdmc19jcmVhdGVfdTMyKCJsYXN0X25ldGRldGVjdF9zY2FucyIsIFNfSVJVU1IsCisJCQkJbXZtLT5kZWJ1Z2ZzX2RpciwgJm12bS0+bGFzdF9uZXRkZXRlY3Rfc2NhbnMpKQorCQlnb3RvIGVycjsKIAlNVk1fREVCVUdGU19BRERfRklMRShuZXRkZXRlY3QsIG12bS0+ZGVidWdmc19kaXIsIFNfSVJVU1IgfCBTX0lXVVNSKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktY29leC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLWNvZXguaAppbmRleCBmM2IxMTg5Li5kMzk4YTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktY29leC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1jb2V4LmgKQEAgLTIzNSwzNiArMjM1LDEyIEBACiAgKiBzdHJ1Y3QgaXdsX2J0X2NvZXhfY21kIC0gYnQgY29leCBjb25maWd1cmF0aW9uIGNvbW1hbmQKICAqIEBtb2RlOiBlbnVtICVpd2xfYnRfY29leF9tb2RlCiAgKiBAZW5hYmxlZF9tb2R1bGVzOiBlbnVtICVpd2xfYnRfY29leF9lbmFibGVkX21vZHVsZXMKLSAqIEBtYXhfa2lsbDogbWF4IGNvdW50IG9mIFR4IHJldHJpZXMgZHVlIHRvIGtpbGwgZnJvbSBQVEEKLSAqIEBvdmVycmlkZV9wcmltYXJ5X2x1dDogZW51bSAlaXdsX2J0X2NvZXhfbHV0X3R5cGU6IEJUX0NPRVhfSU5WQUxJRF9MVVQKLSAqCXNob3VsZCBiZSBzZXQgYnkgZGVmYXVsdAotICogQG92ZXJyaWRlX3NlY29uZGFyeV9sdXQ6IGVudW0gJWl3bF9idF9jb2V4X2x1dF90eXBlOiBCVF9DT0VYX0lOVkFMSURfTFVUCi0gKglzaG91bGQgYmUgc2V0IGJ5IGRlZmF1bHQKLSAqIEBidDRfYW50ZW5uYV9pc29sYXRpb25fdGhyOiBhbnRlbm5hIHRocmVzaG9sZCB2YWx1ZQotICogQGJ0NF90eF90eF9kZWx0YV9mcmVxX3RocjogVHhUeCBkZWx0YSBmcmVxdWVuY3kKLSAqIEBidDRfdHhfcnhfbWF4X2ZyZXEwOiBUeFJ4IG1heCBmcmVxdWVuY3kKLSAqIEBtdWx0aXByaW9fbHV0OiBtdWx0aSBwcmlvcml0eSBMVVQgY29uZmlndXJhdGlvbgotICogQG1wbHV0X3ByaW9fYm9vc3Q6IEJUIHByaW9yaXR5IGJvb3N0IHJlZ2lzdGVycwotICogQGRlY2lzaW9uX2x1dDogUFRBIGRlY2lzaW9uIExVVCwgcGVyIFByaW8tQ2gKICAqCiAgKiBUaGUgc3RydWN0dXJlIGlzIHVzZWQgZm9yIHRoZSBCVF9DT0VYIGNvbW1hbmQuCiAgKi8KIHN0cnVjdCBpd2xfYnRfY29leF9jbWQgewogCV9fbGUzMiBtb2RlOwogCV9fbGUzMiBlbmFibGVkX21vZHVsZXM7Ci0KLQlfX2xlMzIgbWF4X2tpbGw7Ci0JX19sZTMyIG92ZXJyaWRlX3ByaW1hcnlfbHV0OwotCV9fbGUzMiBvdmVycmlkZV9zZWNvbmRhcnlfbHV0OwotCV9fbGUzMiBidDRfYW50ZW5uYV9pc29sYXRpb25fdGhyOwotCi0JX19sZTMyIGJ0NF90eF90eF9kZWx0YV9mcmVxX3RocjsKLQlfX2xlMzIgYnQ0X3R4X3J4X21heF9mcmVxMDsKLQotCV9fbGUzMiBtdWx0aXByaW9fbHV0W0JUX0NPRVhfTVVMVElfUFJJT19MVVRfU0laRV07Ci0JX19sZTMyIG1wbHV0X3ByaW9fYm9vc3RbQlRfQ09FWF9CT09TVF9TSVpFXTsKLQotCV9fbGUzMiBkZWNpc2lvbl9sdXRbQlRfQ09FWF9NQVhfTFVUXVtCVF9DT0VYX0xVVF9TSVpFXTsKIH0gX19wYWNrZWQ7IC8qIEJUX0NPRVhfQ01EX0FQSV9TX1ZFUl82ICovCiAKIC8qKgpAQCAtMjgwLDI5ICsyNTYsNiBAQAogfSBfX3BhY2tlZDsgLyogQlRfQ09FWF9VUERBVEVfQ09SVU5fTFVUX0FQSV9TX1ZFUl8xICovCiAKIC8qKgotICogc3RydWN0IGl3bF9idF9jb2V4X3N3X2Jvb3N0IC0gU1cgYm9vc3QgdmFsdWVzCi0gKiBAd2lmaV90eF9wcmlvX2Jvb3N0OiBTVyBib29zdCBvZiB3aWZpIHR4IHByaW9yaXR5Ci0gKiBAd2lmaV9yeF9wcmlvX2Jvb3N0OiBTVyBib29zdCBvZiB3aWZpIHJ4IHByaW9yaXR5Ci0gKiBAa2lsbF9hY2tfbXNrOiBraWxsIEFDSyBtYXNrLiAxIC0gVHggQUNLLCAwIC0ga2lsbCBUeCBvZiBBQ0suCi0gKiBAa2lsbF9jdHNfbXNrOiBraWxsIENUUyBtYXNrLiAxIC0gVHggQ1RTLCAwIC0ga2lsbCBUeCBvZiBDVFMuCi0gKi8KLXN0cnVjdCBpd2xfYnRfY29leF9zd19ib29zdCB7Ci0JX19sZTMyIHdpZmlfdHhfcHJpb19ib29zdDsKLQlfX2xlMzIgd2lmaV9yeF9wcmlvX2Jvb3N0OwotCV9fbGUzMiBraWxsX2Fja19tc2s7Ci0JX19sZTMyIGtpbGxfY3RzX21zazsKLX07Ci0KLS8qKgotICogc3RydWN0IGl3bF9idF9jb2V4X3N3X2Jvb3N0X3VwZGF0ZV9jbWQgLSBjb21tYW5kIHRvIHVwZGF0ZSB0aGUgU1cgYm9vc3QKLSAqIEBib29zdF92YWx1ZXM6IGNoZWNrIHN0cnVjdCAgJWl3bF9idF9jb2V4X3N3X2Jvb3N0IC0gb25lIGZvciBlYWNoIGNoYW5uZWwKLSAqCXByaW1hcnkgLyBzZWNvbmRhcnkgLyBsb3cgcHJpb3JpdHkKLSAqLwotc3RydWN0IGl3bF9idF9jb2V4X3N3X2Jvb3N0X3VwZGF0ZV9jbWQgewotCXN0cnVjdCBpd2xfYnRfY29leF9zd19ib29zdCBib29zdF92YWx1ZXNbM107Ci19IF9fcGFja2VkOyAvKiBCVF9DT0VYX1VQREFURV9TV19CT09TVF9TX1ZFUl8xICovCi0KLS8qKgogICogc3RydWN0IGl3bF9idF9jb2V4X3JlZHVjZWRfdHhwX3VwZGF0ZV9jbWQKICAqIEByZWR1Y2VkX3R4cDogYml0IEJUX1JFRFVDRURfVFhfUE9XRVJfQklUIHRvIGVuYWJsZSAvIGRpc2FibGUsIHJlc3Qgb2YgdGhlCiAgKgliaXRzIGFyZSB0aGUgc3RhX2lkICh2YWx1ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1kMy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLWQzLmgKaW5kZXggNmQzYmVhNS4uZDc2NThkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLWQzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLWQzLmgKQEAgLTEzMiw3ICsxMzIsNyBAQAogICogQHNvbGljaXRlZF9ub2RlX2lwdjZfYWRkcjogYnJva2VuIC0tIHNvbGljaXRlZCBub2RlIGFkZHJlc3MgZXhpc3RzCiAgKglmb3IgZWFjaCB0YXJnZXQgYWRkcmVzcwogICogQHRhcmdldF9pcHY2X2FkZHI6IG91ciB0YXJnZXQgYWRkcmVzc2VzCi0gKiBAbmRwX21hY19hZGRyOiBuZWlnaGJvciBzb2xpY2lhdGlvbiByZXNwb25zZSBNQUMgYWRkcmVzcworICogQG5kcF9tYWNfYWRkcjogbmVpZ2hib3Igc29saWNpdGF0aW9uIHJlc3BvbnNlIE1BQyBhZGRyZXNzCiAgKi8KIHN0cnVjdCBpd2xfcHJvdG9fb2ZmbG9hZF9jbWRfdjEgewogCXN0cnVjdCBpd2xfcHJvdG9fb2ZmbG9hZF9jbWRfY29tbW9uIGNvbW1vbjsKQEAgLTE1MCw3ICsxNTAsNyBAQAogICogQHNvbGljaXRlZF9ub2RlX2lwdjZfYWRkcjogYnJva2VuIC0tIHNvbGljaXRlZCBub2RlIGFkZHJlc3MgZXhpc3RzCiAgKglmb3IgZWFjaCB0YXJnZXQgYWRkcmVzcwogICogQHRhcmdldF9pcHY2X2FkZHI6IG91ciB0YXJnZXQgYWRkcmVzc2VzCi0gKiBAbmRwX21hY19hZGRyOiBuZWlnaGJvciBzb2xpY2lhdGlvbiByZXNwb25zZSBNQUMgYWRkcmVzcworICogQG5kcF9tYWNfYWRkcjogbmVpZ2hib3Igc29saWNpdGF0aW9uIHJlc3BvbnNlIE1BQyBhZGRyZXNzCiAgKi8KIHN0cnVjdCBpd2xfcHJvdG9fb2ZmbG9hZF9jbWRfdjIgewogCXN0cnVjdCBpd2xfcHJvdG9fb2ZmbG9hZF9jbWRfY29tbW9uIGNvbW1vbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1tYWMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1tYWMuaAppbmRleCBjNDA1Y2RhLi5mM2YzZWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktbWFjLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLW1hYy5oCkBAIC03MCw2ICs3MCw3IEBACiAjZGVmaW5lIE1BQ19JTkRFWF9BVVgJCTQKICNkZWZpbmUgTUFDX0lOREVYX01JTl9EUklWRVIJMAogI2RlZmluZSBOVU1fTUFDX0lOREVYX0RSSVZFUglNQUNfSU5ERVhfQVVYCisjZGVmaW5lIE5VTV9NQUNfSU5ERVgJCShNQUNfSU5ERVhfQVVYICsgMSkKIAogZW51bSBpd2xfYWMgewogCUFDX0JLLApAQCAtMjU0LDcgKzI1NSw3IEBACiAvKioKICAqIGVudW0gaXdsX21hY19maWx0ZXJfZmxhZ3MgLSBNQUMgY29udGV4dCBmaWx0ZXIgZmxhZ3MKICAqIEBNQUNfRklMVEVSX0lOX1BST01JU0M6IGFjY2VwdCBhbGwgZGF0YSBmcmFtZXMKLSAqIEBNQUNfRklMVEVSX0lOX0NPTlRST0xfQU5EX01HTVQ6IHBhc3MgYWxsIG1hbmdlbWVudCBhbmQKKyAqIEBNQUNfRklMVEVSX0lOX0NPTlRST0xfQU5EX01HTVQ6IHBhc3MgYWxsIG1hbmFnZW1lbnQgYW5kCiAgKgljb250cm9sIGZyYW1lcyB0byB0aGUgaG9zdAogICogQE1BQ19GSUxURVJfQUNDRVBUX0dSUDogYWNjZXB0IG11bHRpY2FzdCBmcmFtZXMKICAqIEBNQUNfRklMVEVSX0RJU19ERUNSWVBUOiBkb24ndCBkZWNyeXB0IHVuaWNhc3QgZnJhbWVzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktc2Nhbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZnctYXBpLXNjYW4uaAppbmRleCBjZmMwZTY1Li40ZjgxZGNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktc2Nhbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1zY2FuLmgKQEAgLTcwLDU1ICs3MCwxMCBAQAogCiAvKiBTY2FuIENvbW1hbmRzLCBSZXNwb25zZXMsIE5vdGlmaWNhdGlvbnMgKi8KIAotLyogTWFza3MgZm9yIGl3bF9zY2FuX2NoYW5uZWwudHlwZSBmbGFncyAqLwotI2RlZmluZSBTQ0FOX0NIQU5ORUxfVFlQRV9BQ1RJVkUJQklUKDApCi0jZGVmaW5lIFNDQU5fQ0hBTk5FTF9OQVJST1dfQkFORAlCSVQoMjIpCi0KIC8qIE1heCBudW1iZXIgb2YgSUVzIGZvciBkaXJlY3QgU1NJRCBzY2FucyBpbiBhIGNvbW1hbmQgKi8KICNkZWZpbmUgUFJPQkVfT1BUSU9OX01BWAkJMjAKIAogLyoqCi0gKiBzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbCAtIGVudHJ5IGluIFJFUExZX1NDQU5fQ01EIGNoYW5uZWwgdGFibGUKLSAqIEBjaGFubmVsOiBiYW5kIGlzIHNlbGVjdGVkIGJ5IGl3bF9zY2FuX2NtZCAiZmxhZ3MiIGZpZWxkCi0gKiBAdHhfZ2FpbjogZ2FpbiBmb3IgYW5hbG9nIHJhZGlvCi0gKiBAZHNwX2F0dGVuOiBnYWluIGZvciBEU1AKLSAqIEBhY3RpdmVfZHdlbGw6IGR3ZWxsIHRpbWUgZm9yIGFjdGl2ZSBzY2FuIGluIFRVLCB0eXBpY2FsbHkgNS01MAotICogQHBhc3NpdmVfZHdlbGw6IGR3ZWxsIHRpbWUgZm9yIHBhc3NpdmUgc2NhbiBpbiBUVSwgdHlwaWNhbGx5IDIwLTUwMAotICogQHR5cGU6IHR5cGUgaXMgYnJva2VuIGRvd24gdG8gdGhlc2UgYml0czoKLSAqCWJpdCAwOiAwID0gcGFzc2l2ZSwgMSA9IGFjdGl2ZQotICoJYml0cyAxLTIwOiBTU0lEIGRpcmVjdCBiaXQgbWFwLiBJZiBhbnkgb2YgdGhlc2UgYml0cyBpcyBzZXQgdGhlbgotICoJCXRoZSBjb3JyZXNwb25kaW5nIFNTSUQgSUUgaXMgdHJhbnNtaXR0ZWQgaW4gcHJvYmUgcmVxdWVzdAotICoJCShiaXQgaSBhZGRzIElFIGluIHBvc2l0aW9uIGkgdG8gdGhlIHByb2JlIHJlcXVlc3QpCi0gKgliaXQgMjI6IGNoYW5uZWwgd2lkdGgsIDAgPSByZWd1bGFyLCAxID0gVEdqIG5hcnJvdyBjaGFubmVsCi0gKgotICogQGl0ZXJhdGlvbl9jb3VudDoKLSAqIEBpdGVyYXRpb25faW50ZXJ2YWw6Ci0gKiBUaGlzIHN0cnVjdCBpcyB1c2VkIG9uY2UgZm9yIGVhY2ggY2hhbm5lbCBpbiB0aGUgc2NhbiBsaXN0LgotICogRWFjaCBjaGFubmVsIGNhbiBpbmRlcGVuZGVudGx5IHNlbGVjdDoKLSAqIDEpICBTU0lEIGZvciBkaXJlY3RlZCBhY3RpdmUgc2NhbnMKLSAqIDIpICBUeHBvd2VyIHNldHRpbmcgKGZvciByYXRlIHNwZWNpZmllZCB3aXRoaW4gVHggY29tbWFuZCkKLSAqIDMpICBIb3cgbG9uZyB0byBzdGF5IG9uLWNoYW5uZWwgKGJlaGF2aW9yIG1heSBiZSBtb2RpZmllZCBieSBxdWlldF90aW1lLAotICogICAgIHF1aWV0X3BsY3BfdGgsIGdvb2RfQ1JDX3RoKQotICoKLSAqIFRvIGF2b2lkIHVDb2RlIGVycm9ycywgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgYXJlIHRydWUgKHNlZSBjb21tZW50cwotICogdW5kZXIgc3RydWN0IGl3bF9zY2FuX2NtZCBhYm91dCBtYXhfb3V0X3RpbWUgYW5kIHF1aWV0X3RpbWUpOgotICogMSkgIElmIHVzaW5nIHBhc3NpdmVfZHdlbGwgKGkuZS4gcGFzc2l2ZV9kd2VsbCAhPSAwKToKLSAqICAgICBhY3RpdmVfZHdlbGwgPD0gcGFzc2l2ZV9kd2VsbCAoPCBtYXhfb3V0X3RpbWUgaWYgbWF4X291dF90aW1lICE9IDApCi0gKiAyKSAgcXVpZXRfdGltZSA8PSBhY3RpdmVfZHdlbGwKLSAqIDMpICBJZiByZXN0cmljdGluZyBvZmYtY2hhbm5lbCB0aW1lIChpLmUuIG1heF9vdXRfdGltZSAhPTApOgotICogICAgIHBhc3NpdmVfZHdlbGwgPCBtYXhfb3V0X3RpbWUKLSAqICAgICBhY3RpdmVfZHdlbGwgPCBtYXhfb3V0X3RpbWUKLSAqLwotc3RydWN0IGl3bF9zY2FuX2NoYW5uZWwgewotCV9fbGUzMiB0eXBlOwotCV9fbGUxNiBjaGFubmVsOwotCV9fbGUxNiBpdGVyYXRpb25fY291bnQ7Ci0JX19sZTMyIGl0ZXJhdGlvbl9pbnRlcnZhbDsKLQlfX2xlMTYgYWN0aXZlX2R3ZWxsOwotCV9fbGUxNiBwYXNzaXZlX2R3ZWxsOwotfSBfX3BhY2tlZDsgLyogU0NBTl9DSEFOTkVMX0NPTlRST0xfQVBJX1NfVkVSXzEgKi8KLQotLyoqCiAgKiBzdHJ1Y3QgaXdsX3NzaWRfaWUgLSBkaXJlY3RlZCBzY2FuIG5ldHdvcmsgaW5mb3JtYXRpb24gZWxlbWVudAogICoKICAqIFVwIHRvIDIwIG9mIHRoZXNlIG1heSBhcHBlYXIgaW4gUkVQTFlfU0NBTl9DTUQsCkBAIC0xMzIsMTUyICs4Nyw2IEBACiAJdTggc3NpZFtJRUVFODAyMTFfTUFYX1NTSURfTEVOXTsKIH0gX19wYWNrZWQ7IC8qIFNDQU5fRElSRUNUX1NTSURfSUVfQVBJX1NfVkVSXzEgKi8KIAotLyoqCi0gKiBpd2xfc2Nhbl9mbGFncyAtIG1hc2tzIGZvciBzY2FuIGNvbW1hbmQgZmxhZ3MKLSAqQFNDQU5fRkxBR1NfUEVSSU9ESUNfU0NBTjoKLSAqQFNDQU5fRkxBR1NfUDJQX1BVQkxJQ19BQ1RJT05fRlJBTUVfVFg6Ci0gKkBTQ0FOX0ZMQUdTX0RFTEFZRURfU0NBTl9MT1dCQU5EOgotICpAU0NBTl9GTEFHU19ERUxBWUVEX1NDQU5fSElHSEJBTkQ6Ci0gKkBTQ0FOX0ZMQUdTX0ZSQUdNRU5URURfU0NBTjoKLSAqQFNDQU5fRkxBR1NfUEFTU0lWRTJBQ1RJVkU6IHVzZSBhY3RpdmUgc2NhbiBvbiBjaGFubmVscyB0aGF0IHdhcyBhY3RpdmUKLSAqCWluIHRoZSBwYXN0IGhvdXIsIGV2ZW4gaWYgdGhleSBhcmUgbWFya2VkIGFzIHBhc3NpdmUuCi0gKi8KLWVudW0gaXdsX3NjYW5fZmxhZ3MgewotCVNDQU5fRkxBR1NfUEVSSU9ESUNfU0NBTgkJPSBCSVQoMCksCi0JU0NBTl9GTEFHU19QMlBfUFVCTElDX0FDVElPTl9GUkFNRV9UWAk9IEJJVCgxKSwKLQlTQ0FOX0ZMQUdTX0RFTEFZRURfU0NBTl9MT1dCQU5ECQk9IEJJVCgyKSwKLQlTQ0FOX0ZMQUdTX0RFTEFZRURfU0NBTl9ISUdIQkFORAk9IEJJVCgzKSwKLQlTQ0FOX0ZMQUdTX0ZSQUdNRU5URURfU0NBTgkJPSBCSVQoNCksCi0JU0NBTl9GTEFHU19QQVNTSVZFMkFDVElWRQkJPSBCSVQoNSksCi19OwotCi0vKioKLSAqIGVudW0gaXdsX3NjYW5fdHlwZSAtIFNjYW4gdHlwZXMgZm9yIHNjYW4gY29tbWFuZAotICogQFNDQU5fVFlQRV9GT1JDRUQ6Ci0gKiBAU0NBTl9UWVBFX0JBQ0tHUk9VTkQ6Ci0gKiBAU0NBTl9UWVBFX09TOgotICogQFNDQU5fVFlQRV9ST0FNSU5HOgotICogQFNDQU5fVFlQRV9BQ1RJT046Ci0gKiBAU0NBTl9UWVBFX0RJU0NPVkVSWToKLSAqIEBTQ0FOX1RZUEVfRElTQ09WRVJZX0ZPUkNFRDoKLSAqLwotZW51bSBpd2xfc2Nhbl90eXBlIHsKLQlTQ0FOX1RZUEVfRk9SQ0VECQk9IDAsCi0JU0NBTl9UWVBFX0JBQ0tHUk9VTkQJCT0gMSwKLQlTQ0FOX1RZUEVfT1MJCQk9IDIsCi0JU0NBTl9UWVBFX1JPQU1JTkcJCT0gMywKLQlTQ0FOX1RZUEVfQUNUSU9OCQk9IDQsCi0JU0NBTl9UWVBFX0RJU0NPVkVSWQkJPSA1LAotCVNDQU5fVFlQRV9ESVNDT1ZFUllfRk9SQ0VECT0gNiwKLX07IC8qIFNDQU5fQUNUSVZJVFlfVFlQRV9FX1ZFUl8xICovCi0KLS8qKgotICogc3RydWN0IGl3bF9zY2FuX2NtZCAtIHNjYW4gcmVxdWVzdCBjb21tYW5kCi0gKiAoIFNDQU5fUkVRVUVTVF9DTUQgPSAweDgwICkKLSAqIEBsZW46IGNvbW1hbmQgbGVuZ3RoIGluIGJ5dGVzCi0gKiBAc2Nhbl9mbGFnczogc2NhbiBmbGFncyBmcm9tIFNDQU5fRkxBR1NfKgotICogQGNoYW5uZWxfY291bnQ6IG51bSBvZiBjaGFubmVscyBpbiBjaGFubmVsIGxpc3QKLSAqCSgxIC0gdWNvZGVfY2FwYS5uX3NjYW5fY2hhbm5lbHMpCi0gKiBAcXVpZXRfdGltZTogaW4gbXNlY3MsIGR3ZWxsIHRoaXMgdGltZSBmb3IgYWN0aXZlIHNjYW4gb24gcXVpZXQgY2hhbm5lbHMKLSAqIEBxdWlldF9wbGNwX3RoOiBxdWlldCBQTENQIHRocmVzaG9sZCAoY2hhbm5lbCBpcyBxdWlldCBpZiBsZXNzIHRoYW4KLSAqCXRoaXMgbnVtYmVyIG9mIHBhY2tldHMgd2VyZSByZWNlaXZlZCAodHlwaWNhbGx5IDEpCi0gKiBAcGFzc2l2ZTJhY3RpdmU6IGlzIGF1dG8gc3dpdGNoaW5nIGZyb20gcGFzc2l2ZSB0byBhY3RpdmUgZHVyaW5nIHNjYW4gYWxsb3dlZAotICogQHJ4Y2hhaW5fc2VsX2ZsYWdzOiBSWE9OX1JYX0NIQUlOXyoKLSAqIEBtYXhfb3V0X3RpbWU6IGluIFRVcywgbWF4IG91dCBvZiBzZXJ2aW5nIGNoYW5uZWwgdGltZQotICogQHN1c3BlbmRfdGltZTogaG93IGxvbmcgdG8gcGF1c2Ugc2NhbiB3aGVuIHJldHVybmluZyB0byBzZXJ2aWNlIGNoYW5uZWw6Ci0gKgliaXRzIDAtMTk6IGJlYWNvbiBpbnRlcmFsIGluIFRVcyAoc3VzcGVuZCBiZWZvcmUgZXhlY3V0aW5nKQotICoJYml0cyAyMC0yMzogcmVzZXJ2ZWQKLSAqCWJpdHMgMjQtMzE6IG51bWJlciBvZiBiZWFjb25zIChzdXNwZW5kIGJldHdlZW4gY2hhbm5lbHMpCi0gKiBAcnhvbl9mbGFnczogUlhPTl9GTEdfKgotICogQGZpbHRlcl9mbGFnczogUlhPTl9GSUxURVJfKgotICogQHR4X2NtZDogZm9yIGFjdGl2ZSBzY2FucyAoemVybyBmb3IgcGFzc2l2ZSksIHcvbyBwYXlsb2FkLAotICoJbm8gUlMgc28gc3BlY2lmeSBUWCByYXRlCi0gKiBAZGlyZWN0X3NjYW46IGRpcmVjdCBzY2FuIFNTSURzCi0gKiBAdHlwZTogb25lIG9mIFNDQU5fVFlQRV8qCi0gKiBAcmVwZWF0czogaG93IG1hbnkgdGltZSB0byByZXBlYXQgdGhlIHNjYW4KLSAqLwotc3RydWN0IGl3bF9zY2FuX2NtZCB7Ci0JX19sZTE2IGxlbjsKLQl1OCBzY2FuX2ZsYWdzOwotCXU4IGNoYW5uZWxfY291bnQ7Ci0JX19sZTE2IHF1aWV0X3RpbWU7Ci0JX19sZTE2IHF1aWV0X3BsY3BfdGg7Ci0JX19sZTE2IHBhc3NpdmUyYWN0aXZlOwotCV9fbGUxNiByeGNoYWluX3NlbF9mbGFnczsKLQlfX2xlMzIgbWF4X291dF90aW1lOwotCV9fbGUzMiBzdXNwZW5kX3RpbWU7Ci0JLyogUlhfT05fRkxBR1NfQVBJX1NfVkVSXzEgKi8KLQlfX2xlMzIgcnhvbl9mbGFnczsKLQlfX2xlMzIgZmlsdGVyX2ZsYWdzOwotCXN0cnVjdCBpd2xfdHhfY21kIHR4X2NtZDsKLQlzdHJ1Y3QgaXdsX3NzaWRfaWUgZGlyZWN0X3NjYW5bUFJPQkVfT1BUSU9OX01BWF07Ci0JX19sZTMyIHR5cGU7Ci0JX19sZTMyIHJlcGVhdHM7Ci0KLQkvKgotCSAqIFByb2JlIHJlcXVlc3QgZnJhbWUsIGZvbGxvd2VkIGJ5IGNoYW5uZWwgbGlzdC4KLQkgKgotCSAqIFNpemUgb2YgcHJvYmUgcmVxdWVzdCBmcmFtZSBpcyBzcGVjaWZpZWQgYnkgYnl0ZSBjb3VudCBpbiB0eF9jbWQuCi0JICogQ2hhbm5lbCBsaXN0IGZvbGxvd3MgaW1tZWRpYXRlbHkgYWZ0ZXIgcHJvYmUgcmVxdWVzdCBmcmFtZS4KLQkgKiBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gbGlzdCBpcyBzcGVjaWZpZWQgYnkgY2hhbm5lbF9jb3VudC4KLQkgKiBFYWNoIGNoYW5uZWwgaW4gbGlzdCBpcyBvZiB0eXBlOgotCSAqCi0JICogc3RydWN0IGl3bF9zY2FuX2NoYW5uZWwgY2hhbm5lbHNbMF07Ci0JICoKLQkgKiBOT1RFOiAgT25seSBvbmUgYmFuZCBvZiBjaGFubmVscyBjYW4gYmUgc2Nhbm5lZCBwZXIgcGFzcy4gIFlvdQotCSAqIG11c3Qgbm90IG1peCAyLjRHSHogY2hhbm5lbHMgYW5kIDUuMkdIeiBjaGFubmVscywgYW5kIHlvdSBtdXN0IHdhaXQKLQkgKiBmb3Igb25lIHNjYW4gdG8gY29tcGxldGUgKGkuZS4gcmVjZWl2ZSBTQ0FOX0NPTVBMRVRFX05PVElGSUNBVElPTikKLQkgKiBiZWZvcmUgcmVxdWVzdGluZyBhbm90aGVyIHNjYW4uCi0JICovCi0JdTggZGF0YVswXTsKLX0gX19wYWNrZWQ7IC8qIFNDQU5fUkVRVUVTVF9GSVhFRF9QQVJUX0FQSV9TX1ZFUl81ICovCi0KLS8qIFJlc3BvbnNlIHRvIHNjYW4gcmVxdWVzdCBjb250YWlucyBvbmx5IHN0YXR1cyB3aXRoIG9uZSBvZiB0aGVzZSB2YWx1ZXMgKi8KLSNkZWZpbmUgU0NBTl9SRVNQT05TRV9PSwkweDEKLSNkZWZpbmUgU0NBTl9SRVNQT05TRV9FUlJPUgkweDIKLQotLyoKLSAqIFNDQU5fQUJPUlRfQ01EID0gMHg4MQotICogV2hlbiBzY2FuIGFib3J0IGlzIHJlcXVlc3RlZCwgdGhlIGNvbW1hbmQgaGFzIG5vIGZpZWxkcyBleGNlcHQgdGhlIGNvbW1vbgotICogaGVhZGVyLiBUaGUgcmVzcG9uc2UgY29udGFpbnMgb25seSBhIHN0YXR1cyB3aXRoIG9uZSBvZiB0aGVzZSB2YWx1ZXMuCi0gKi8KLSNkZWZpbmUgU0NBTl9BQk9SVF9QT1NTSUJMRQkweDEKLSNkZWZpbmUgU0NBTl9BQk9SVF9JR05PUkVECTB4MiAvKiBubyBwZW5kaW5nIHNjYW5zICovCi0KLS8qIFRPRE86IGNvbXBsZXRlIGRvY3VtZW50YXRpb24gKi8KLSNkZWZpbmUgIFNDQU5fT1dORVJfU1RBVFVTIDB4MQotI2RlZmluZSAgTUVBU1VSRV9PV05FUl9TVEFUVVMgMHgyCi0KLS8qKgotICogc3RydWN0IGl3bF9zY2FuX3N0YXJ0X25vdGlmIC0gbm90aWZpZXMgc3RhcnQgb2Ygc2NhbiBpbiB0aGUgZGV2aWNlCi0gKiAoIFNDQU5fU1RBUlRfTk9USUZJQ0FUSU9OID0gMHg4MiApCi0gKiBAdHNmX2xvdzogVFNGIHRpbWVyIChsb3dlciBoYWxmKSBpbiB1c2VjcwotICogQHRzZl9oaWdoOiBUU0YgdGltZXIgKGhpZ2hlciBoYWxmKSBpbiB1c2VjcwotICogQGJlYWNvbl90aW1lcjogc3RydWN0dXJlZCBhcyBmb2xsb3dzOgotICoJYml0cyAwOjE5IC0gYmVhY29uIGludGVydmFsIGluIHVzZWNzCi0gKgliaXRzIDIwOjIzIC0gcmVzZXJ2ZWQgKDApCi0gKgliaXRzIDI0OjMxIC0gbnVtYmVyIG9mIGJlYWNvbnMKLSAqIEBjaGFubmVsOiB3aGljaCBjaGFubmVsIGlzIHNjYW5uZWQKLSAqIEBiYW5kOiAwIGZvciA1LjIgR0h6LCAxIGZvciAyLjQgR0h6Ci0gKiBAc3RhdHVzOiBvbmUgb2YgKl9PV05FUl9TVEFUVVMKLSAqLwotc3RydWN0IGl3bF9zY2FuX3N0YXJ0X25vdGlmIHsKLQlfX2xlMzIgdHNmX2xvdzsKLQlfX2xlMzIgdHNmX2hpZ2g7Ci0JX19sZTMyIGJlYWNvbl90aW1lcjsKLQl1OCBjaGFubmVsOwotCXU4IGJhbmQ7Ci0JdTggcmVzZXJ2ZWRbMl07Ci0JX19sZTMyIHN0YXR1czsKLX0gX19wYWNrZWQ7IC8qIFNDQU5fU1RBUlRfTlRGX0FQSV9TX1ZFUl8xICovCi0KLS8qIHNjYW4gcmVzdWx0cyBwcm9iZV9zdGF0dXMgZmlyc3QgYml0IGluZGljYXRlcyBzdWNjZXNzICovCi0jZGVmaW5lIFNDQU5fUFJPQkVfU1RBVFVTX09LCQkwCi0jZGVmaW5lIFNDQU5fUFJPQkVfU1RBVFVTX1RYX0ZBSUxFRAlCSVQoMCkKLS8qIGVycm9yIHN0YXR1c2VzIGNvbWJpbmVkIHdpdGggVFhfRkFJTEVEICovCi0jZGVmaW5lIFNDQU5fUFJPQkVfU1RBVFVTX0ZBSUxfVFRMCUJJVCgxKQotI2RlZmluZSBTQ0FOX1BST0JFX1NUQVRVU19GQUlMX0JUCUJJVCgyKQotCiAvKiBIb3cgbWFueSBzdGF0aXN0aWNzIGFyZSBnYXRoZXJlZCBmb3IgZWFjaCBjaGFubmVsICovCiAjZGVmaW5lIFNDQU5fUkVTVUxUU19TVEFUSVNUSUNTIDEKIApAQCAtMjk0LDcgKzEwMyw3IEBACiAgKiBAU0NBTl9DT01QX1NUQVRVU19FUlJfQ09FWDogbWVkaXVtIHdhcyBsb3N0IG90IFdpTWF4CiAgKiBAU0NBTl9DT01QX1NUQVRVU19QMlBfQUNUSU9OX09LOiBQMlAgcHVibGljIGFjdGlvbiBmcmFtZSBUWCB3YXMgc3VjY2Vzc2Z1bAogICoJKG5vdCBhbiBlcnJvciEpCi0gKiBAU0NBTl9DT01QX1NUQVRVU19JVEVSQVRJT05fRU5EOiBpbmRpY2F0ZXMgZW5kIG9mIG9uZSByZXBlYXRpdGlvbiB0aGUgZHJpdmVyCisgKiBAU0NBTl9DT01QX1NUQVRVU19JVEVSQVRJT05fRU5EOiBpbmRpY2F0ZXMgZW5kIG9mIG9uZSByZXBldGl0aW9uIHRoZSBkcml2ZXIKICAqCWFza2VkIGZvcgogICogQFNDQU5fQ09NUF9TVEFUVVNfRVJSX0FMTE9DX1RFOiBzY2FuIGNvdWxkIG5vdCBhbGxvY2F0ZSB0aW1lIGV2ZW50cwogKi8KQEAgLTM3OCwxMSArMTg3LDExIEBACiAgKiBzdHJ1Y3QgaXdsX3NjYW5fb2ZmbG9hZF9jbWQgLSBTQ0FOX1JFUVVFU1RfRklYRURfUEFSVF9BUElfU19WRVJfNgogICogQHNjYW5fZmxhZ3M6CQlzZWUgZW51bSBpd2xfc2Nhbl9mbGFncwogICogQGNoYW5uZWxfY291bnQ6CWNoYW5uZWxzIGluIGNoYW5uZWwgbGlzdAotICogQHF1aWV0X3RpbWU6CQlkd2VsbCB0aW1lLCBpbiBtaWxpc2ljb25kcywgb24gcXVpZXQgY2hhbm5lbAorICogQHF1aWV0X3RpbWU6CQlkd2VsbCB0aW1lLCBpbiBtaWxsaXNlY29uZHMsIG9uIHF1aWV0IGNoYW5uZWwKICAqIEBxdWlldF9wbGNwX3RoOglxdWlldCBjaGFubmVsIG51bSBvZiBwYWNrZXRzIHRocmVzaG9sZAogICogQGdvb2RfQ1JDX3RoOglwYXNzaXZlIHRvIGFjdGl2ZSBwcm9tb3Rpb24gdGhyZXNob2xkCiAgKiBAcnhfY2hhaW46CQlSWE9OIHJ4IGNoYWluLgotICogQG1heF9vdXRfdGltZToJbWF4IFRVcyB0byBiZSBvdXQgb2YgYXNzb2NlYXRlZCBjaGFubmVsCisgKiBAbWF4X291dF90aW1lOgltYXggVFVzIHRvIGJlIG91dCBvZiBhc3NvY2lhdGVkIGNoYW5uZWwKICAqIEBzdXNwZW5kX3RpbWU6CXBhdXNlIHNjYW4gdGhpcyBUVXMgd2hlbiByZXR1cm5pbmcgdG8gc2VydmljZSBjaGFubmVsCiAgKiBAZmxhZ3M6CQlSWE9OIGZsYWdzCiAgKiBAZmlsdGVyX2ZsYWdzOglSWE9OZmlsdGVyCkBAIC00MjMsNyArMjMyLDcgQEAKICAqCXNlZSBlbnVtIGl3bF9zY2FuX29mZmxvYWRfY2hhbm5lbF9mbGFncy4KICAqIF9fbGUxNiBjaGFubmVsX251bWJlcjogY2hhbm5lbCBudW1iZXIgMS0xMyBldGMuCiAgKiBfX2xlMTYgaXRlcl9jb3VudDogcmVwZXRpdGlvbiBjb3VudCBmb3IgdGhlIGNoYW5uZWwuCi0gKiBfX2xlMzIgaXRlcl9pbnRlcnZhbDogaW50ZXJ2YWwgYmV0d2VlbiB0d28gaW5udGVyYXRpb24gb24gb25lIGNoYW5uZWwuCisgKiBfX2xlMzIgaXRlcl9pbnRlcnZhbDogaW50ZXJ2YWwgYmV0d2VlbiB0d28gaXRlcmF0aW9ucyBvbiBvbmUgY2hhbm5lbC4KICAqIHU4IGFjdGl2ZV9kd2VsbC4KICAqIHU4IHBhc3NpdmVfZHdlbGwuCiAgKi8KQEAgLTQ2Niw4ICsyNzUsOCBAQAogLyoqCiAgKiBpd2xfc2Nhbl9vZmZsb2FkX3Byb2ZpbGUgLSBTQ0FOX09GRkxPQURfUFJPRklMRV9TCiAgKiBAc3NpZF9pbmRleDoJCWluZGV4IHRvIHNzaWQgbGlzdCBpbiBmaXhlZCBwYXJ0Ci0gKiBAdW5pY2FzdF9jaXBoZXI6CWVuY3J5cHRpb24gb2xnb3JpdGhtIHRvIG1hdGNoIC0gYml0bWFwCi0gKiBAYXV0X2FsZzoJCWF1dGhlbnRpY2F0aW9uIG9sZ29yaXRobSB0byBtYXRjaCAtIGJpdG1hcAorICogQHVuaWNhc3RfY2lwaGVyOgllbmNyeXB0aW9uIGFsZ29yaXRobSB0byBtYXRjaCAtIGJpdG1hcAorICogQGF1dF9hbGc6CQlhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0gdG8gbWF0Y2ggLSBiaXRtYXAKICAqIEBuZXR3b3JrX3R5cGU6CWVudW0gaXdsX3NjYW5fb2ZmbG9hZF9uZXR3b3JrX3R5cGUKICAqIEBiYW5kX3NlbGVjdGlvbjoJZW51bSBpd2xfc2Nhbl9vZmZsb2FkX2JhbmRfc2VsZWN0aW9uCiAgKiBAY2xpZW50X2JpdG1hcDoJY2xpZW50cyB3YWl0aW5nIGZvciBtYXRjaCAtIGVudW0gc2Nhbl9mcmFtZXdvcmtfY2xpZW50CkBAIC05MzksNyArNzQ4LDcgQEAKICAqIEBmbGFnczoJCWJpdG1hcCAtIDAtMTk6CWRpcmVjdGVkIHNjYW4gdG8gaSd0aCBzc2lkLgogICogQGNoYW5uZWxfbnVtOgljaGFubmVsIG51bWJlciAxLTEzIGV0Yy4KICAqIEBpdGVyX2NvdW50OgkJcmVwZXRpdGlvbiBjb3VudCBmb3IgdGhlIGNoYW5uZWwuCi0gKiBAaXRlcl9pbnRlcnZhbDoJaW50ZXJ2YWwgYmV0d2VlbiB0d28gc2NhbiBpbnRlcmF0aW9ucyBvbiBvbmUgY2hhbm5lbC4KKyAqIEBpdGVyX2ludGVydmFsOglpbnRlcnZhbCBiZXR3ZWVuIHR3byBzY2FuIGl0ZXJhdGlvbnMgb24gb25lIGNoYW5uZWwuCiAgKi8KIHN0cnVjdCBpd2xfc2Nhbl9jaGFubmVsX2NmZ191bWFjIHsKIAlfX2xlMzIgZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGktc3RhdHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1zdGF0cy5oCmluZGV4IDkyODE2OGIuLjcwOWUyOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1zdGF0cy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS1zdGF0cy5oCkBAIC02NSw2ICs2NSw3IEBACiAKICNpZm5kZWYgX19md19hcGlfc3RhdHNfaF9fCiAjZGVmaW5lIF9fZndfYXBpX3N0YXRzX2hfXworI2luY2x1ZGUgImZ3LWFwaS1tYWMuaCIKIAogc3RydWN0IG12bV9zdGF0aXN0aWNzX2RiZyB7CiAJX19sZTMyIGJ1cnN0X2NoZWNrOwpAQCAtMjE4LDcgKzIxOSw3IEBACiAJX19sZTMyIGxvX3ByaW9yaXR5X3J4X2RlbmllZF9jbnQ7CiB9IF9fcGFja2VkOyAgLyogU1RBVElTVElDU19CVF9BQ1RJVklUWV9BUElfU19WRVJfMSAqLwogCi1zdHJ1Y3QgbXZtX3N0YXRpc3RpY3NfZ2VuZXJhbCB7CitzdHJ1Y3QgbXZtX3N0YXRpc3RpY3NfZ2VuZXJhbF92NSB7CiAJX19sZTMyIHJhZGlvX3RlbXBlcmF0dXJlOwogCV9fbGUzMiByYWRpb192b2x0YWdlOwogCXN0cnVjdCBtdm1fc3RhdGlzdGljc19kYmcgZGJnOwpAQCAtMjQ0LDYgKzI0NSwzOSBAQAogCXN0cnVjdCBtdm1fc3RhdGlzdGljc19idF9hY3Rpdml0eSBidF9hY3Rpdml0eTsKIH0gX19wYWNrZWQ7IC8qIFNUQVRJU1RJQ1NfR0VORVJBTF9BUElfU19WRVJfNSAqLwogCitzdHJ1Y3QgbXZtX3N0YXRpc3RpY3NfZ2VuZXJhbF92OCB7CisJX19sZTMyIHJhZGlvX3RlbXBlcmF0dXJlOworCV9fbGUzMiByYWRpb192b2x0YWdlOworCXN0cnVjdCBtdm1fc3RhdGlzdGljc19kYmcgZGJnOworCV9fbGUzMiBzbGVlcF90aW1lOworCV9fbGUzMiBzbG90c19vdXQ7CisJX19sZTMyIHNsb3RzX2lkbGU7CisJX19sZTMyIHR0bF90aW1lc3RhbXA7CisJc3RydWN0IG12bV9zdGF0aXN0aWNzX2RpdiBzbG93X2RpdjsKKwlfX2xlMzIgcnhfZW5hYmxlX2NvdW50ZXI7CisJLyoKKwkgKiBudW1fb2Zfc29zX3N0YXRlczoKKwkgKiAgY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBoYXZlIHRvIHJlLXR1bmUKKwkgKiAgaW4gb3JkZXIgdG8gZ2V0IG91dCBvZiBiYWQgUEhZIHN0YXR1cworCSAqLworCV9fbGUzMiBudW1fb2Zfc29zX3N0YXRlczsKKwlfX2xlMzIgYmVhY29uX2ZpbHRlcmVkOworCV9fbGUzMiBtaXNzZWRfYmVhY29uczsKKwlfX3M4IGJlYWNvbl9maWx0ZXJfYXZlcmFnZV9lbmVyZ3k7CisJX19zOCBiZWFjb25fZmlsdGVyX3JlYXNvbjsKKwlfX3M4IGJlYWNvbl9maWx0ZXJfY3VycmVudF9lbmVyZ3k7CisJX19zOCBiZWFjb25fZmlsdGVyX3Jlc2VydmVkOworCV9fbGUzMiBiZWFjb25fZmlsdGVyX2RlbHRhX3RpbWU7CisJc3RydWN0IG12bV9zdGF0aXN0aWNzX2J0X2FjdGl2aXR5IGJ0X2FjdGl2aXR5OworCV9fbGU2NCByeF90aW1lOworCV9fbGU2NCBvbl90aW1lX3JmOworCV9fbGU2NCBvbl90aW1lX3NjYW47CisJX19sZTY0IHR4X3RpbWU7CisJX19sZTMyIGJlYWNvbl9jb3VudGVyW05VTV9NQUNfSU5ERVhdOworCXU4IGJlYWNvbl9hdmVyYWdlX2VuZXJneVtOVU1fTUFDX0lOREVYXTsKKwl1OCByZXNlcnZlZFs0IC0gKE5VTV9NQUNfSU5ERVggJSA0KV07Cit9IF9fcGFja2VkOyAvKiBTVEFUSVNUSUNTX0dFTkVSQUxfQVBJX1NfVkVSXzggKi8KKwogc3RydWN0IG12bV9zdGF0aXN0aWNzX3J4IHsKIAlzdHJ1Y3QgbXZtX3N0YXRpc3RpY3NfcnhfcGh5IG9mZG07CiAJc3RydWN0IG12bV9zdGF0aXN0aWNzX3J4X3BoeSBjY2s7CkBAIC0yNTYsMjIgKzI5MCwyOCBAQAogICoKICAqIEJ5IGRlZmF1bHQsIHVDb2RlIGlzc3VlcyB0aGlzIG5vdGlmaWNhdGlvbiBhZnRlciByZWNlaXZpbmcgYSBiZWFjb24KICAqIHdoaWxlIGFzc29jaWF0ZWQuICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHNldCBESVNBQkxFX05PVElGIGZsYWcgaW4gdGhlCi0gKiBSRVBMWV9TVEFUSVNUSUNTX0NNRCAweDljLCBhYm92ZS4KLSAqCi0gKiBTdGF0aXN0aWNzIGNvdW50ZXJzIGNvbnRpbnVlIHRvIGluY3JlbWVudCBiZWFjb24gYWZ0ZXIgYmVhY29uLCBidXQgYXJlCi0gKiBjbGVhcmVkIHdoZW4gY2hhbmdpbmcgY2hhbm5lbHMgb3Igd2hlbiBkcml2ZXIgaXNzdWVzIFJFUExZX1NUQVRJU1RJQ1NfQ01ECi0gKiAweDljIHdpdGggQ0xFQVJfU1RBVFMgYml0IHNldCAoc2VlIGFib3ZlKS4KLSAqCi0gKiB1Q29kZSBhbHNvIGlzc3VlcyB0aGlzIG5vdGlmaWNhdGlvbiBkdXJpbmcgc2NhbnMuICB1Q29kZSBjbGVhcnMgc3RhdGlzdGljcwotICogYXBwcm9wcmlhdGVseSBzbyB0aGF0IGVhY2ggbm90aWZpY2F0aW9uIGNvbnRhaW5zIHN0YXRpc3RpY3MgZm9yIG9ubHkgdGhlCi0gKiBvbmUgY2hhbm5lbCB0aGF0IGhhcyBqdXN0IGJlZW4gc2Nhbm5lZC4KKyAqIFNUQVRJU1RJQ1NfQ01EICgweDljKSwgYmVsb3cuCiAgKi8KIAotc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIHsKK3N0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljc192OCB7CiAJX19sZTMyIGZsYWc7CiAJc3RydWN0IG12bV9zdGF0aXN0aWNzX3J4IHJ4OwogCXN0cnVjdCBtdm1fc3RhdGlzdGljc190eCB0eDsKLQlzdHJ1Y3QgbXZtX3N0YXRpc3RpY3NfZ2VuZXJhbCBnZW5lcmFsOworCXN0cnVjdCBtdm1fc3RhdGlzdGljc19nZW5lcmFsX3Y1IGdlbmVyYWw7CiB9IF9fcGFja2VkOyAvKiBTVEFUSVNUSUNTX05URllfQVBJX1NfVkVSXzggKi8KIAorc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzX3YxMCB7CisJX19sZTMyIGZsYWc7CisJc3RydWN0IG12bV9zdGF0aXN0aWNzX3J4IHJ4OworCXN0cnVjdCBtdm1fc3RhdGlzdGljc190eCB0eDsKKwlzdHJ1Y3QgbXZtX3N0YXRpc3RpY3NfZ2VuZXJhbF92OCBnZW5lcmFsOworfSBfX3BhY2tlZDsgLyogU1RBVElTVElDU19OVEZZX0FQSV9TX1ZFUl8xMCAqLworCisjZGVmaW5lIElXTF9TVEFUSVNUSUNTX0ZMR19DTEVBUgkJMHgxCisjZGVmaW5lIElXTF9TVEFUSVNUSUNTX0ZMR19ESVNBQkxFX05PVElGCTB4MgorCitzdHJ1Y3QgaXdsX3N0YXRpc3RpY3NfY21kIHsKKwlfX2xlMzIgZmxhZ3M7Cit9IF9fcGFja2VkOyAvKiBTVEFUSVNUSUNTX0NNRF9BUElfU19WRVJfMSAqLworCiAjZW5kaWYgLyogX19md19hcGlfc3RhdHNfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy1hcGkuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS5oCmluZGV4IGI1NjE1NGYuLmFhYjY4Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LWFwaS5oCkBAIC0xOTIsNiArMTkyLDcgQEAKIAlCRUFDT05fTk9USUZJQ0FUSU9OID0gMHg5MCwKIAlCRUFDT05fVEVNUExBVEVfQ01EID0gMHg5MSwKIAlUWF9BTlRfQ09ORklHVVJBVElPTl9DTUQgPSAweDk4LAorCVNUQVRJU1RJQ1NfQ01EID0gMHg5YywKIAlTVEFUSVNUSUNTX05PVElGSUNBVElPTiA9IDB4OWQsCiAJRU9TUF9OT1RJRklDQVRJT04gPSAweDllLAogCVJFRFVDRV9UWF9QT1dFUl9DTUQgPSAweDlmLApAQCAtMjExLDYgKzIxMiwxMCBAQAogCVJFUExZX1JYX01QRFVfQ01EID0gMHhjMSwKIAlCQV9OT1RJRiA9IDB4YzUsCiAKKwkvKiBMb2NhdGlvbiBBd2FyZSBSZWd1bGF0b3J5ICovCisJTUNDX1VQREFURV9DTUQgPSAweGM4LAorCU1DQ19DSFVCX1VQREFURV9DTUQgPSAweGM5LAorCiAJTUFSS0VSX0NNRCA9IDB4Y2IsCiAKIAkvKiBCVCBDb2V4ICovCkBAIC0zNjEsNyArMzY2LDggQEAKIAlOVk1fU0VDVElPTl9UWVBFX0NBTElCUkFUSU9OID0gNCwKIAlOVk1fU0VDVElPTl9UWVBFX1BST0RVQ1RJT04gPSA1LAogCU5WTV9TRUNUSU9OX1RZUEVfTUFDX09WRVJSSURFID0gMTEsCi0JTlZNX01BWF9OVU1fU0VDVElPTlMgPSAxMiwKKwlOVk1fU0VDVElPTl9UWVBFX1BIWV9TS1UgPSAxMiwKKwlOVk1fTUFYX05VTV9TRUNUSU9OUyA9IDEzLAogfTsKIAogLyoqCkBAIC00MzEsNyArNDM3LDcgQEAKIAogI2RlZmluZSBJV0xfQUxJVkVfRkxHX1JGS0lMTAlCSVQoMCkKIAotc3RydWN0IG12bV9hbGl2ZV9yZXNwIHsKK3N0cnVjdCBtdm1fYWxpdmVfcmVzcF92ZXIxIHsKIAlfX2xlMTYgc3RhdHVzOwogCV9fbGUxNiBmbGFnczsKIAl1OCB1Y29kZV9taW5vcjsKQEAgLTQ4Miw2ICs0ODgsMzAgQEAKIAlfX2xlMzIgZGJnX3ByaW50X2J1ZmZfYWRkcjsKIH0gX19wYWNrZWQ7IC8qIEFMSVZFX1JFU19BUElfU19WRVJfMiAqLwogCitzdHJ1Y3QgbXZtX2FsaXZlX3Jlc3AgeworCV9fbGUxNiBzdGF0dXM7CisJX19sZTE2IGZsYWdzOworCV9fbGUzMiB1Y29kZV9taW5vcjsKKwlfX2xlMzIgdWNvZGVfbWFqb3I7CisJdTggdmVyX3N1YnR5cGU7CisJdTggdmVyX3R5cGU7CisJdTggbWFjOworCXU4IG9wdDsKKwlfX2xlMzIgdGltZXN0YW1wOworCV9fbGUzMiBlcnJvcl9ldmVudF90YWJsZV9wdHI7CS8qIFNSQU0gYWRkcmVzcyBmb3IgZXJyb3IgbG9nICovCisJX19sZTMyIGxvZ19ldmVudF90YWJsZV9wdHI7CS8qIFNSQU0gYWRkcmVzcyBmb3IgTE1BQyBldmVudCBsb2cgKi8KKwlfX2xlMzIgY3B1X3JlZ2lzdGVyX3B0cjsKKwlfX2xlMzIgZGJnbV9jb25maWdfcHRyOworCV9fbGUzMiBhbGl2ZV9jb3VudGVyX3B0cjsKKwlfX2xlMzIgc2NkX2Jhc2VfcHRyOwkJLyogU1JBTSBhZGRyZXNzIGZvciBTQ0QgKi8KKwlfX2xlMzIgc3RfZndyZF9hZGRyOwkJLyogcG9pbnRlciB0byBTdG9yZSBhbmQgZm9yd2FyZCAqLworCV9fbGUzMiBzdF9md3JkX3NpemU7CisJX19sZTMyIHVtYWNfbWlub3I7CQkvKiBVTUFDIHZlcnNpb246IG1pbm9yICovCisJX19sZTMyIHVtYWNfbWFqb3I7CQkvKiBVTUFDIHZlcnNpb246IG1ham9yICovCisJX19sZTMyIGVycm9yX2luZm9fYWRkcjsJCS8qIFNSQU0gYWRkcmVzcyBmb3IgVU1BQyBlcnJvciBsb2cgKi8KKwlfX2xlMzIgZGJnX3ByaW50X2J1ZmZfYWRkcjsKK30gX19wYWNrZWQ7IC8qIEFMSVZFX1JFU19BUElfU19WRVJfMyAqLworCiAvKiBFcnJvciByZXNwb25zZS9ub3RpZmljYXRpb24gKi8KIGVudW0gewogCUZXX0VSUl9VTktOT1dOX0NNRCA9IDB4MCwKQEAgLTE0MTcsNyArMTQ0NywxOSBAQAogI2RlZmluZSBTRl9XX01BUktfTEVHQUNZIDQwOTYKICNkZWZpbmUgU0ZfV19NQVJLX1NDQU4gNDA5NgogCi0vKiBTRiBTY2VuYXJpb3MgdGltZXJzIGZvciBGVUxMX09OIHN0YXRlIChhbGlnbmVkIHRvIDMyIHVTZWMpICovCisvKiBTRiBTY2VuYXJpb3MgdGltZXJzIGZvciBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKGFsaWduZWQgdG8gMzIgdVNlYykgKi8KKyNkZWZpbmUgU0ZfU0lOR0xFX1VOSUNBU1RfSURMRV9USU1FUl9ERUYgMTYwCS8qIDE1MCB1U2VjICAqLworI2RlZmluZSBTRl9TSU5HTEVfVU5JQ0FTVF9BR0lOR19USU1FUl9ERUYgNDAwCS8qIDAuNCBtU2VjICovCisjZGVmaW5lIFNGX0FHR19VTklDQVNUX0lETEVfVElNRVJfREVGIDE2MAkJLyogMTUwIHVTZWMgKi8KKyNkZWZpbmUgU0ZfQUdHX1VOSUNBU1RfQUdJTkdfVElNRVJfREVGIDQwMAkJLyogMC40IG1TZWMgKi8KKyNkZWZpbmUgU0ZfTUNBU1RfSURMRV9USU1FUl9ERUYgMTYwCQkvKiAxNTAgbVNlYyAqLworI2RlZmluZSBTRl9NQ0FTVF9BR0lOR19USU1FUl9ERUYgNDAwCQkvKiAwLjQgbVNlYyAqLworI2RlZmluZSBTRl9CQV9JRExFX1RJTUVSX0RFRiAxNjAJCQkvKiAxNTAgdVNlYyAqLworI2RlZmluZSBTRl9CQV9BR0lOR19USU1FUl9ERUYgNDAwCQkJLyogMC40IG1TZWMgKi8KKyNkZWZpbmUgU0ZfVFhfUkVfSURMRV9USU1FUl9ERUYgMTYwCQkJLyogMTUwIHVTZWMgKi8KKyNkZWZpbmUgU0ZfVFhfUkVfQUdJTkdfVElNRVJfREVGIDQwMAkJLyogMC40IG1TZWMgKi8KKworLyogU0YgU2NlbmFyaW9zIHRpbWVycyBmb3IgQlNTIE1BQyBjb25maWd1cmF0aW9uIChhbGlnbmVkIHRvIDMyIHVTZWMpICovCiAjZGVmaW5lIFNGX1NJTkdMRV9VTklDQVNUX0lETEVfVElNRVIgMzIwCS8qIDMwMCB1U2VjICAqLwogI2RlZmluZSBTRl9TSU5HTEVfVU5JQ0FTVF9BR0lOR19USU1FUiAyMDE2CS8qIDIgbVNlYyAqLwogI2RlZmluZSBTRl9BR0dfVU5JQ0FTVF9JRExFX1RJTUVSIDMyMAkJLyogMzAwIHVTZWMgKi8KQEAgLTE0NDgsNiArMTQ5MCw5MiBAQAogCV9fbGUzMiBmdWxsX29uX3RpbWVvdXRzW1NGX05VTV9TQ0VOQVJJT11bU0ZfTlVNX1RJTUVPVVRfVFlQRVNdOwogfSBfX3BhY2tlZDsgLyogU0ZfQ0ZHX0FQSV9TX1ZFUl8yICovCiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTG9jYXRpb24gQXdhcmUgUmVndWxhdG9yeSAoTEFSKSBBUEkgLSBNQ0MgdXBkYXRlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIHN0cnVjdCBpd2xfbWNjX3VwZGF0ZV9jbWQgLSBSZXF1ZXN0IHRoZSBkZXZpY2UgdG8gdXBkYXRlIGdlb2dyYXBoaWMKKyAqIHJlZ3VsYXRvcnkgcHJvZmlsZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIE1DQyAoTW9iaWxlIENvdW50cnkgQ29kZSkuCisgKiBUaGUgTUNDIGlzIHR3byBsZXR0ZXItY29kZSwgYXNjaWkgdXBwZXIgY2FzZVtBLVpdIG9yICcwMCcgZm9yIHdvcmxkIGRvbWFpbi4KKyAqICdaWicgTUNDIHdpbGwgYmUgdXNlZCB0byBzd2l0Y2ggdG8gTlZNIGRlZmF1bHQgcHJvZmlsZTsgaW4gdGhpcyBjYXNlLCB0aGUKKyAqIE1DQyBpbiB0aGUgY21kIHJlc3BvbnNlIHdpbGwgYmUgdGhlIHJlbGV2YW50IE1DQyBpbiB0aGUgTlZNLgorICogQG1jYzogZ2l2ZW4gbW9iaWxlIGNvdW50cnkgY29kZQorICogQHNvdXJjZV9pZDogdGhlIHNvdXJjZSBmcm9tIHdoZXJlIHdlIGdvdCB0aGUgTUNDLCBzZWUgaXdsX21jY19zb3VyY2UKKyAqIEByZXNlcnZlZDogcmVzZXJ2ZWQgZm9yIGFsaWdubWVudAorICovCitzdHJ1Y3QgaXdsX21jY191cGRhdGVfY21kIHsKKwlfX2xlMTYgbWNjOworCXU4IHNvdXJjZV9pZDsKKwl1OCByZXNlcnZlZDsKK30gX19wYWNrZWQ7IC8qIExBUl9VUERBVEVfTUNDX0NNRF9BUElfUyAqLworCisvKioKKyAqIGl3bF9tY2NfdXBkYXRlX3Jlc3AgLSByZXNwb25zZSB0byBNQ0NfVVBEQVRFX0NNRC4KKyAqIENvbnRhaW5zIHRoZSBuZXcgY2hhbm5lbCBjb250cm9sIHByb2ZpbGUgbWFwLCBpZiBjaGFuZ2VkLCBhbmQgdGhlIG5ldyBNQ0MKKyAqIChtb2JpbGUgY291bnRyeSBjb2RlKS4KKyAqIFRoZSBuZXcgTUNDIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB3aGF0IHdhcyByZXF1ZXN0ZWQgaW4gTUNDX1VQREFURV9DTUQuCisgKiBAc3RhdHVzOiBzZWUgJmVudW0gaXdsX21jY191cGRhdGVfc3RhdHVzCisgKiBAbWNjOiB0aGUgbmV3IGFwcGxpZWQgTUNDCisgKiBAY2FwOiBjYXBhYmlsaXRpZXMgZm9yIGFsbCBjaGFubmVscyB3aGljaCBtYXRjaGVzIHRoZSBNQ0MKKyAqIEBzb3VyY2VfaWQ6IHRoZSBNQ0Mgc291cmNlLCBzZWUgaXdsX21jY19zb3VyY2UKKyAqIEBuX2NoYW5uZWxzOiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gQGNoYW5uZWxzX2RhdGEgKG1heSBiZSAxNCwgMzksIDUwIG9yIDUxCisgKgkJY2hhbm5lbHMsIGRlcGVuZGluZyBvbiBwbGF0Zm9ybSkKKyAqIEBjaGFubmVsczogY2hhbm5lbCBjb250cm9sIGRhdGEgbWFwLCBEV09SRCBmb3IgZWFjaCBjaGFubmVsLiBPbmx5IHRoZSBmaXJzdAorICoJMTZiaXRzIGFyZSB1c2VkLgorICovCitzdHJ1Y3QgaXdsX21jY191cGRhdGVfcmVzcCB7CisJX19sZTMyIHN0YXR1czsKKwlfX2xlMTYgbWNjOworCXU4IGNhcDsKKwl1OCBzb3VyY2VfaWQ7CisJX19sZTMyIG5fY2hhbm5lbHM7CisJX19sZTMyIGNoYW5uZWxzWzBdOworfSBfX3BhY2tlZDsgLyogTEFSX1VQREFURV9NQ0NfQ01EX1JFU1BfUyAqLworCisvKioKKyAqIHN0cnVjdCBpd2xfbWNjX2NodWJfbm90aWYgLSBjaHViIG5vdGlmaWVzIG9mIG1jYyBjaGFuZ2UKKyAqIChNQ0NfQ0hVQl9VUERBVEVfQ01EID0gMHhjOSkKKyAqIFRoZSBDaHViIChDb21tdW5pY2F0aW9uIEh1YiwgQ29tbXNIVUIpIGlzIGEgSFcgY29tcG9uZW50IHRoYXQgY29ubmVjdHMgdG8KKyAqIHRoZSBjZWxsdWxhciBhbmQgY29ubmVjdGl2aXR5IGNvcmVzIHRoYXQgZ2V0cyB1cGRhdGVzIG9mIHRoZSBtY2MsIGFuZAorICogbm90aWZpZXMgdGhlIHVjb2RlIGRpcmVjdGx5IG9mIGFueSBtY2MgY2hhbmdlLgorICogVGhlIHVjb2RlIHJlcXVlc3RzIHRoZSBkcml2ZXIgdG8gcmVxdWVzdCB0aGUgZGV2aWNlIHRvIHVwZGF0ZSBnZW9ncmFwaGljCisgKiByZWd1bGF0b3J5ICBwcm9maWxlIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gTUNDIChNb2JpbGUgQ291bnRyeSBDb2RlKS4KKyAqIFRoZSBNQ0MgaXMgdHdvIGxldHRlci1jb2RlLCBhc2NpaSB1cHBlciBjYXNlW0EtWl0gb3IgJzAwJyBmb3Igd29ybGQgZG9tYWluLgorICogJ1paJyBNQ0Mgd2lsbCBiZSB1c2VkIHRvIHN3aXRjaCB0byBOVk0gZGVmYXVsdCBwcm9maWxlOyBpbiB0aGlzIGNhc2UsIHRoZQorICogTUNDIGluIHRoZSBjbWQgcmVzcG9uc2Ugd2lsbCBiZSB0aGUgcmVsZXZhbnQgTUNDIGluIHRoZSBOVk0uCisgKiBAbWNjOiBnaXZlbiBtb2JpbGUgY291bnRyeSBjb2RlCisgKiBAc291cmNlX2lkOiBpZGVudGl0eSBvZiB0aGUgY2hhbmdlIG9yaWdpbmF0b3IsIHNlZSBpd2xfbWNjX3NvdXJjZQorICogQHJlc2VydmVkMTogcmVzZXJ2ZWQgZm9yIGFsaWdubWVudAorICovCitzdHJ1Y3QgaXdsX21jY19jaHViX25vdGlmIHsKKwl1MTYgbWNjOworCXU4IHNvdXJjZV9pZDsKKwl1OCByZXNlcnZlZDE7Cit9IF9fcGFja2VkOyAvKiBMQVJfTUNDX05PVElGWV9TICovCisKK2VudW0gaXdsX21jY191cGRhdGVfc3RhdHVzIHsKKwlNQ0NfUkVTUF9ORVdfQ0hBTl9QUk9GSUxFLAorCU1DQ19SRVNQX1NBTUVfQ0hBTl9QUk9GSUxFLAorCU1DQ19SRVNQX0lOVkFMSUQsCisJTUNDX1JFU1BfTlZNX0RJU0FCTEVELAorCU1DQ19SRVNQX0lMTEVHQUwsCisJTUNDX1JFU1BfTE9XX1BSSU9SSVRZLAorfTsKKworZW51bSBpd2xfbWNjX3NvdXJjZSB7CisJTUNDX1NPVVJDRV9PTERfRlcgPSAwLAorCU1DQ19TT1VSQ0VfTUUgPSAxLAorCU1DQ19TT1VSQ0VfQklPUyA9IDIsCisJTUNDX1NPVVJDRV8zR19MVEVfSE9TVCA9IDMsCisJTUNDX1NPVVJDRV8zR19MVEVfREVWSUNFID0gNCwKKwlNQ0NfU09VUkNFX1dJRkkgPSA1LAorCU1DQ19TT1VSQ0VfUkVTRVJWRUQgPSA2LAorCU1DQ19TT1VSQ0VfREVGQVVMVCA9IDcsCisJTUNDX1NPVVJDRV9VTklOSVRJQUxJWkVEID0gOCwKKwlNQ0NfU09VUkNFX0dFVF9DVVJSRU5UID0gMHgxMAorfTsKKwogLyogRFRTIG1lYXN1cmVtZW50cyAqLwogCiBlbnVtIGl3bF9kdHNfbWVhc3VyZW1lbnRfZmxhZ3MgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL2Z3LmMKaW5kZXggY2EzOGU5OC4uYmM1ZWFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vZncuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9mdy5jCkBAIC0xMTIsMjUgKzExMiwyNyBAQAogCXN0cnVjdCBpd2xfbXZtICptdm0gPQogCQljb250YWluZXJfb2Yobm90aWZfd2FpdCwgc3RydWN0IGl3bF9tdm0sIG5vdGlmX3dhaXQpOwogCXN0cnVjdCBpd2xfbXZtX2FsaXZlX2RhdGEgKmFsaXZlX2RhdGEgPSBkYXRhOwotCXN0cnVjdCBtdm1fYWxpdmVfcmVzcCAqcGFsaXZlOworCXN0cnVjdCBtdm1fYWxpdmVfcmVzcF92ZXIxICpwYWxpdmUxOwogCXN0cnVjdCBtdm1fYWxpdmVfcmVzcF92ZXIyICpwYWxpdmUyOworCXN0cnVjdCBtdm1fYWxpdmVfcmVzcCAqcGFsaXZlOwogCi0JaWYgKGl3bF9yeF9wYWNrZXRfcGF5bG9hZF9sZW4ocGt0KSA9PSBzaXplb2YoKnBhbGl2ZSkpIHsKLQkJcGFsaXZlID0gKHZvaWQgKilwa3QtPmRhdGE7CisJaWYgKGl3bF9yeF9wYWNrZXRfcGF5bG9hZF9sZW4ocGt0KSA9PSBzaXplb2YoKnBhbGl2ZTEpKSB7CisJCXBhbGl2ZTEgPSAodm9pZCAqKXBrdC0+ZGF0YTsKIAogCQltdm0tPnN1cHBvcnRfdW1hY19sb2cgPSBmYWxzZTsKIAkJbXZtLT5lcnJvcl9ldmVudF90YWJsZSA9Ci0JCQlsZTMyX3RvX2NwdShwYWxpdmUtPmVycm9yX2V2ZW50X3RhYmxlX3B0cik7Ci0JCW12bS0+bG9nX2V2ZW50X3RhYmxlID0gbGUzMl90b19jcHUocGFsaXZlLT5sb2dfZXZlbnRfdGFibGVfcHRyKTsKLQkJYWxpdmVfZGF0YS0+c2NkX2Jhc2VfYWRkciA9IGxlMzJfdG9fY3B1KHBhbGl2ZS0+c2NkX2Jhc2VfcHRyKTsKKwkJCWxlMzJfdG9fY3B1KHBhbGl2ZTEtPmVycm9yX2V2ZW50X3RhYmxlX3B0cik7CisJCW12bS0+bG9nX2V2ZW50X3RhYmxlID0KKwkJCWxlMzJfdG9fY3B1KHBhbGl2ZTEtPmxvZ19ldmVudF90YWJsZV9wdHIpOworCQlhbGl2ZV9kYXRhLT5zY2RfYmFzZV9hZGRyID0gbGUzMl90b19jcHUocGFsaXZlMS0+c2NkX2Jhc2VfcHRyKTsKIAotCQlhbGl2ZV9kYXRhLT52YWxpZCA9IGxlMTZfdG9fY3B1KHBhbGl2ZS0+c3RhdHVzKSA9PQorCQlhbGl2ZV9kYXRhLT52YWxpZCA9IGxlMTZfdG9fY3B1KHBhbGl2ZTEtPnN0YXR1cykgPT0KIAkJCQkgICAgSVdMX0FMSVZFX1NUQVRVU19PSzsKIAkJSVdMX0RFQlVHX0ZXKG12bSwKIAkJCSAgICAgIkFsaXZlIFZFUjEgdWNvZGUgc3RhdHVzIDB4JTA0eCByZXZpc2lvbiAweCUwMVggMHglMDFYIGZsYWdzIDB4JTAxWFxuIiwKLQkJCSAgICAgbGUxNl90b19jcHUocGFsaXZlLT5zdGF0dXMpLCBwYWxpdmUtPnZlcl90eXBlLAotCQkJICAgICBwYWxpdmUtPnZlcl9zdWJ0eXBlLCBwYWxpdmUtPmZsYWdzKTsKLQl9IGVsc2UgeworCQkJICAgICBsZTE2X3RvX2NwdShwYWxpdmUxLT5zdGF0dXMpLCBwYWxpdmUxLT52ZXJfdHlwZSwKKwkJCSAgICAgcGFsaXZlMS0+dmVyX3N1YnR5cGUsIHBhbGl2ZTEtPmZsYWdzKTsKKwl9IGVsc2UgaWYgKGl3bF9yeF9wYWNrZXRfcGF5bG9hZF9sZW4ocGt0KSA9PSBzaXplb2YoKnBhbGl2ZTIpKSB7CiAJCXBhbGl2ZTIgPSAodm9pZCAqKXBrdC0+ZGF0YTsKIAogCQltdm0tPmVycm9yX2V2ZW50X3RhYmxlID0KQEAgLTE1Niw2ICsxNTgsMzMgQEAKIAkJSVdMX0RFQlVHX0ZXKG12bSwKIAkJCSAgICAgIlVNQUMgdmVyc2lvbjogTWFqb3IgLSAweCV4LCBNaW5vciAtIDB4JXhcbiIsCiAJCQkgICAgIHBhbGl2ZTItPnVtYWNfbWFqb3IsIHBhbGl2ZTItPnVtYWNfbWlub3IpOworCX0gZWxzZSBpZiAoaXdsX3J4X3BhY2tldF9wYXlsb2FkX2xlbihwa3QpID09IHNpemVvZigqcGFsaXZlKSkgeworCQlwYWxpdmUgPSAodm9pZCAqKXBrdC0+ZGF0YTsKKworCQltdm0tPmVycm9yX2V2ZW50X3RhYmxlID0KKwkJCWxlMzJfdG9fY3B1KHBhbGl2ZS0+ZXJyb3JfZXZlbnRfdGFibGVfcHRyKTsKKwkJbXZtLT5sb2dfZXZlbnRfdGFibGUgPQorCQkJbGUzMl90b19jcHUocGFsaXZlLT5sb2dfZXZlbnRfdGFibGVfcHRyKTsKKwkJYWxpdmVfZGF0YS0+c2NkX2Jhc2VfYWRkciA9IGxlMzJfdG9fY3B1KHBhbGl2ZS0+c2NkX2Jhc2VfcHRyKTsKKwkJbXZtLT51bWFjX2Vycm9yX2V2ZW50X3RhYmxlID0KKwkJCWxlMzJfdG9fY3B1KHBhbGl2ZS0+ZXJyb3JfaW5mb19hZGRyKTsKKwkJbXZtLT5zZl9zcGFjZS5hZGRyID0gbGUzMl90b19jcHUocGFsaXZlLT5zdF9md3JkX2FkZHIpOworCQltdm0tPnNmX3NwYWNlLnNpemUgPSBsZTMyX3RvX2NwdShwYWxpdmUtPnN0X2Z3cmRfc2l6ZSk7CisKKwkJYWxpdmVfZGF0YS0+dmFsaWQgPSBsZTE2X3RvX2NwdShwYWxpdmUtPnN0YXR1cykgPT0KKwkJCQkgICAgSVdMX0FMSVZFX1NUQVRVU19PSzsKKwkJaWYgKG12bS0+dW1hY19lcnJvcl9ldmVudF90YWJsZSkKKwkJCW12bS0+c3VwcG9ydF91bWFjX2xvZyA9IHRydWU7CisKKwkJSVdMX0RFQlVHX0ZXKG12bSwKKwkJCSAgICAgIkFsaXZlIFZFUjMgdWNvZGUgc3RhdHVzIDB4JTA0eCByZXZpc2lvbiAweCUwMVggMHglMDFYIGZsYWdzIDB4JTAxWFxuIiwKKwkJCSAgICAgbGUxNl90b19jcHUocGFsaXZlLT5zdGF0dXMpLCBwYWxpdmUtPnZlcl90eXBlLAorCQkJICAgICBwYWxpdmUtPnZlcl9zdWJ0eXBlLCBwYWxpdmUtPmZsYWdzKTsKKworCQlJV0xfREVCVUdfRlcobXZtLAorCQkJICAgICAiVU1BQyB2ZXJzaW9uOiBNYWpvciAtIDB4JXgsIE1pbm9yIC0gMHgleFxuIiwKKwkJCSAgICAgbGUzMl90b19jcHUocGFsaXZlLT51bWFjX21ham9yKSwKKwkJCSAgICAgbGUzMl90b19jcHUocGFsaXZlLT51bWFjX21pbm9yKSk7CiAJfQogCiAJcmV0dXJuIHRydWU7CkBAIC0xODgsOCArMjE3LDcgQEAKIAlzdHJ1Y3QgaXdsX3NmX3JlZ2lvbiBzdF9md3JkX3NwYWNlOwogCiAJaWYgKHVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX1JFR1VMQVIgJiYKLQkgICAgaXdsX2Z3X2RiZ19jb25mX3VzbmlmZmVyKG12bS0+ZncsIEZXX0RCR19DVVNUT00pICYmCi0JICAgIGl3bF9md19kYmdfY29uZl9lbmFibGVkKG12bS0+ZncsIEZXX0RCR19DVVNUT00pKQorCSAgICBpd2xfZndfZGJnX2NvbmZfdXNuaWZmZXIobXZtLT5mdywgRldfREJHX1NUQVJUX0ZST01fQUxJVkUpKQogCQlmdyA9IGl3bF9nZXRfdWNvZGVfaW1hZ2UobXZtLCBJV0xfVUNPREVfUkVHVUxBUl9VU05JRkZFUik7CiAJZWxzZQogCQlmdyA9IGl3bF9nZXRfdWNvZGVfaW1hZ2UobXZtLCB1Y29kZV90eXBlKTsKQEAgLTQ1MSwyMCArNDc5LDk3IEBACiAJaXdsX2ZyZWVfcmVzcCgmY21kKTsKIH0KIAotdm9pZCBpd2xfbXZtX2Z3X2RiZ19jb2xsZWN0KHN0cnVjdCBpd2xfbXZtICptdm0pCitpbnQgaXdsX212bV9md19kYmdfY29sbGVjdF9kZXNjKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJc3RydWN0IGl3bF9tdm1fZHVtcF9kZXNjICpkZXNjLAorCQkJCXVuc2lnbmVkIGludCBkZWxheSkKIHsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChJV0xfTVZNX1NUQVRVU19EVU1QSU5HX0ZXX0xPRywgJm12bS0+c3RhdHVzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChXQVJOX09OKG12bS0+ZndfZHVtcF9kZXNjKSkKKwkJaXdsX212bV9mcmVlX2Z3X2R1bXBfZGVzYyhtdm0pOworCisJSVdMX1dBUk4obXZtLCAiQ29sbGVjdGluZyBkYXRhOiB0cmlnZ2VyICVkIGZpcmVkLlxuIiwKKwkJIGxlMzJfdG9fY3B1KGRlc2MtPnRyaWdfZGVzYy50eXBlKSk7CisKKwltdm0tPmZ3X2R1bXBfZGVzYyA9IGRlc2M7CisKIAkvKiBzdG9wIHJlY29yZGluZyAqLwogCWlmIChtdm0tPmNmZy0+ZGV2aWNlX2ZhbWlseSA9PSBJV0xfREVWSUNFX0ZBTUlMWV83MDAwKSB7CiAJCWl3bF9zZXRfYml0c19wcnBoKG12bS0+dHJhbnMsIE1PTl9CVUZGX1NBTVBMRV9DVEwsIDB4MTAwKTsKIAl9IGVsc2UgewogCQlpd2xfd3JpdGVfcHJwaChtdm0tPnRyYW5zLCBEQkdDX0lOX1NBTVBMRSwgMCk7Ci0JCWl3bF93cml0ZV9wcnBoKG12bS0+dHJhbnMsIERCR0NfT1VUX0NUUkwsIDApOworCQkvKiB3YWl0IGJlZm9yZSB3ZSBjb2xsZWN0IHRoZSBkYXRhIHRpbGwgdGhlIERCR0Mgc3RvcCAqLworCQl1ZGVsYXkoMTAwKTsKIAl9CiAKLQlzY2hlZHVsZV93b3JrKCZtdm0tPmZ3X2Vycm9yX2R1bXBfd2spOworCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fd3EsICZtdm0tPmZ3X2R1bXBfd2ssIGRlbGF5KTsKKworCXJldHVybiAwOwogfQogCi1pbnQgaXdsX212bV9zdGFydF9md19kYmdfY29uZihzdHJ1Y3QgaXdsX212bSAqbXZtLCBlbnVtIGl3bF9md19kYmdfY29uZiBjb25mX2lkKQoraW50IGl3bF9tdm1fZndfZGJnX2NvbGxlY3Qoc3RydWN0IGl3bF9tdm0gKm12bSwgZW51bSBpd2xfZndfZGJnX3RyaWdnZXIgdHJpZywKKwkJCSAgIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGRlbGF5KQoreworCXN0cnVjdCBpd2xfbXZtX2R1bXBfZGVzYyAqZGVzYzsKKworCWRlc2MgPSBremFsbG9jKHNpemVvZigqZGVzYykgKyBsZW4sIEdGUF9BVE9NSUMpOworCWlmICghZGVzYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXNjLT5sZW4gPSBsZW47CisJZGVzYy0+dHJpZ19kZXNjLnR5cGUgPSBjcHVfdG9fbGUzMih0cmlnKTsKKwltZW1jcHkoZGVzYy0+dHJpZ19kZXNjLmRhdGEsIHN0ciwgbGVuKTsKKworCXJldHVybiBpd2xfbXZtX2Z3X2RiZ19jb2xsZWN0X2Rlc2MobXZtLCBkZXNjLCBkZWxheSk7Cit9CisKK2ludCBpd2xfbXZtX2Z3X2RiZ19jb2xsZWN0X3RyaWcoc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQlzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RsdiAqdHJpZ2dlciwKKwkJCQljb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl1bnNpZ25lZCBpbnQgZGVsYXkgPSBtc2Vjc190b19qaWZmaWVzKGxlMzJfdG9fY3B1KHRyaWdnZXItPnN0b3BfZGVsYXkpKTsKKwl1MTYgb2NjdXJyZW5jZXMgPSBsZTE2X3RvX2NwdSh0cmlnZ2VyLT5vY2N1cnJlbmNlcyk7CisJaW50IHJldCwgbGVuID0gMDsKKwljaGFyIGJ1Zls2NF07CisKKwlpZiAoIW9jY3VycmVuY2VzKQorCQlyZXR1cm4gMDsKKworCWlmIChmbXQpIHsKKwkJdmFfbGlzdCBhcDsKKworCQlidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9ICdcMCc7CisKKwkJdmFfc3RhcnQoYXAsIGZtdCk7CisJCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKworCQkvKiBjaGVjayBmb3IgdHJ1bmNhdGlvbiAqLworCQlpZiAoV0FSTl9PTl9PTkNFKGJ1ZltzaXplb2YoYnVmKSAtIDFdKSkKKwkJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1wwJzsKKworCQlsZW4gPSBzdHJsZW4oYnVmKSArIDE7CisJfQorCisJcmV0ID0gaXdsX212bV9md19kYmdfY29sbGVjdChtdm0sIGxlMzJfdG9fY3B1KHRyaWdnZXItPmlkKSwgYnVmLAorCQkJCSAgICAgbGVuLCBkZWxheSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXRyaWdnZXItPm9jY3VycmVuY2VzID0gY3B1X3RvX2xlMTYob2NjdXJyZW5jZXMgLSAxKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGl3bF9tdm1fcmVzdGFydF9lYXJseV9zdGFydChzdHJ1Y3QgaXdsX212bSAqbXZtKQoreworCWlmIChtdm0tPmNmZy0+ZGV2aWNlX2ZhbWlseSA9PSBJV0xfREVWSUNFX0ZBTUlMWV83MDAwKQorCQlpd2xfY2xlYXJfYml0c19wcnBoKG12bS0+dHJhbnMsIE1PTl9CVUZGX1NBTVBMRV9DVEwsIDB4MTAwKTsKKwllbHNlCisJCWl3bF93cml0ZV9wcnBoKG12bS0+dHJhbnMsIERCR0NfSU5fU0FNUExFLCAxKTsKK30KKworaW50IGl3bF9tdm1fc3RhcnRfZndfZGJnX2NvbmYoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggY29uZl9pZCkKIHsKIAl1OCAqcHRyOwogCWludCByZXQ7CkBAIC00NzQsNiArNTc5LDE0IEBACiAJCSAgICAgICJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gJWRcbiIsIGNvbmZfaWQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIEVBUkxZIFNUQVJUIC0gZmlybXdhcmUncyBjb25maWd1cmF0aW9uIGlzIGhhcmQgY29kZWQgKi8KKwlpZiAoKCFtdm0tPmZ3LT5kYmdfY29uZl90bHZbY29uZl9pZF0gfHwKKwkgICAgICFtdm0tPmZ3LT5kYmdfY29uZl90bHZbY29uZl9pZF0tPm51bV9vZl9oY21kcykgJiYKKwkgICAgY29uZl9pZCA9PSBGV19EQkdfU1RBUlRfRlJPTV9BTElWRSkgeworCQlpd2xfbXZtX3Jlc3RhcnRfZWFybHlfc3RhcnQobXZtKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJaWYgKCFtdm0tPmZ3LT5kYmdfY29uZl90bHZbY29uZl9pZF0pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC01ODMsNyArNjk2LDEwIEBACiAJCUlXTF9FUlIobXZtLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgU21hcnQgRmlmb1xuIik7CiAKIAltdm0tPmZ3X2RiZ19jb25mID0gRldfREJHX0lOVkFMSUQ7Ci0JaXdsX212bV9zdGFydF9md19kYmdfY29uZihtdm0sIEZXX0RCR19DVVNUT00pOworCS8qIGlmIHdlIGhhdmUgYSBkZXN0aW5hdGlvbiwgYXNzdW1lIEVBUkxZIFNUQVJUICovCisJaWYgKG12bS0+ZnctPmRiZ19kZXN0X3RsdikKKwkJbXZtLT5md19kYmdfY29uZiA9IEZXX0RCR19TVEFSVF9GUk9NX0FMSVZFOworCWl3bF9tdm1fc3RhcnRfZndfZGJnX2NvbmYobXZtLCBGV19EQkdfU1RBUlRfRlJPTV9BTElWRSk7CiAKIAlyZXQgPSBpd2xfc2VuZF90eF9hbnRfY2ZnKG12bSwgaXdsX212bV9nZXRfdmFsaWRfdHhfYW50KG12bSkpOwogCWlmIChyZXQpCkBAIC02NDAsNiArNzU2LDE2IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJvcjsKIAorCS8qCisJICogUlROTCBpcyBub3QgdGFrZW4gZHVyaW5nIEN0LWtpbGwsIGJ1dCB3ZSBkb24ndCBuZWVkIHRvIHNjYW4vVHgKKwkgKiBhbnl3YXksIHNvIGRvbid0IGluaXQgTUNDLgorCSAqLworCWlmICghdGVzdF9iaXQoSVdMX01WTV9TVEFUVVNfSFdfQ1RLSUxMLCAmbXZtLT5zdGF0dXMpKSB7CisJCXJldCA9IGl3bF9tdm1faW5pdF9tY2MobXZtKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCiAJaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmIElXTF9VQ09ERV9UTFZfQ0FQQV9VTUFDX1NDQU4pIHsKIAkJcmV0ID0gaXdsX212bV9jb25maWdfc2Nhbihtdm0pOwogCQlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbWFjLWN0eHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL21hYy1jdHh0LmMKaW5kZXggN2JkYzYyMi4uODA4OGM3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbWFjLWN0eHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9tYWMtY3R4dC5jCkBAIC0yNDQsNiArMjQ0LDcgQEAKIHVuc2lnbmVkIGxvbmcgaXdsX212bV9nZXRfdXNlZF9od19xdWV1ZXMoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICpleGNsdWRlX3ZpZikKIHsKKwl1OCBzdGFfaWQ7CiAJc3RydWN0IGl3bF9tdm1faHdfcXVldWVzX2lmYWNlX2l0ZXJhdG9yX2RhdGEgZGF0YSA9IHsKIAkJLmV4Y2x1ZGVfdmlmID0gZXhjbHVkZV92aWYsCiAJCS51c2VkX2h3X3F1ZXVlcyA9CkBAIC0yNjQsNiArMjY1LDEzIEBACiAJCQkJCSAgaXdsX212bV9tYWNfc3RhX2h3X3F1ZXVlc19pdGVyLAogCQkJCQkgICZkYXRhKTsKIAorCS8qCisJICogU29tZSBURExTIHN0YXRpb25zIG1heSBiZSByZW1vdmVkIGJ1dCBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcKKwkgKiBkcmFpbmVkLiBEb24ndCB0b3VjaCB0aGVpciBxdWV1ZXMuCisJICovCisJZm9yX2VhY2hfc2V0X2JpdChzdGFfaWQsIG12bS0+c3RhX2RyYWluZWQsIElXTF9NVk1fU1RBVElPTl9DT1VOVCkKKwkJZGF0YS51c2VkX2h3X3F1ZXVlcyB8PSBtdm0tPnRmZF9kcmFpbmVkW3N0YV9pZF07CisKIAlyZXR1cm4gZGF0YS51c2VkX2h3X3F1ZXVlczsKIH0KIApAQCAtNDYyLDkgKzQ3MCw4IEBACiAKIGludCBpd2xfbXZtX21hY19jdHh0X2luaXQoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKLQl1bnNpZ25lZCBpbnQgd2RnX3RpbWVvdXQgPSBpd2xtdm1fbW9kX3BhcmFtcy50ZmRfcV9oYW5nX2RldGVjdCA/Ci0JCQkJCW12bS0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCA6Ci0JCQkJCUlXTF9XQVRDSERPR19ESVNBQkxFRDsKKwl1bnNpZ25lZCBpbnQgd2RnX3RpbWVvdXQgPQorCQlpd2xfbXZtX2dldF93ZF90aW1lb3V0KG12bSwgdmlmLCBmYWxzZSwgZmFsc2UpOwogCXUzMiBhYzsKIAlpbnQgcmV0OwogCkBAIC0xMzY3LDEwICsxMzc0LDE4IEBACiB7CiAJc3RydWN0IGl3bF9taXNzZWRfYmVhY29uc19ub3RpZiAqbWlzc2VkX2JlYWNvbnMgPSBfZGF0YTsKIAlzdHJ1Y3QgaXdsX212bV92aWYgKm12bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKKwlzdHJ1Y3QgaXdsX212bSAqbXZtID0gbXZtdmlmLT5tdm07CisJc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl9taXNzZWRfYmNvbiAqYmNvbl90cmlnOworCXN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfdGx2ICp0cmlnZ2VyOworCXUzMiBzdG9wX3RyaWdfbWlzc2VkX2Jjb24sIHN0b3BfdHJpZ19taXNzZWRfYmNvbl9zaW5jZV9yeDsKKwl1MzIgcnhfbWlzc2VkX2Jjb24sIHJ4X21pc3NlZF9iY29uX3NpbmNlX3J4OwogCiAJaWYgKG12bXZpZi0+aWQgIT0gKHUxNilsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29ucy0+bWFjX2lkKSkKIAkJcmV0dXJuOwogCisJcnhfbWlzc2VkX2Jjb24gPSBsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29ucy0+Y29uc2VjX21pc3NlZF9iZWFjb25zKTsKKwlyeF9taXNzZWRfYmNvbl9zaW5jZV9yeCA9CisJCWxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb25zLT5jb25zZWNfbWlzc2VkX2JlYWNvbnNfc2luY2VfbGFzdF9yeCk7CiAJLyoKIAkgKiBUT0RPOiB0aGUgdGhyZXNob2xkIHNob3VsZCBiZSBhZGp1c3RlZCBiYXNlZCBvbiBsYXRlbmN5IGNvbmRpdGlvbnMsCiAJICogYW5kL29yIGluIGNhc2Ugb2YgYSBDUyBmbG93IG9uIG9uZSBvZiB0aGUgb3RoZXIgQVAgdmlmcy4KQEAgLTEzNzgsNiArMTM5MywyNiBAQAogCWlmIChsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29ucy0+Y29uc2VjX21pc3NlZF9iZWFjb25zX3NpbmNlX2xhc3RfcngpID4KIAkgICAgIElXTF9NVk1fTUlTU0VEX0JFQUNPTlNfVEhSRVNIT0xEKQogCQlpZWVlODAyMTFfYmVhY29uX2xvc3ModmlmKTsKKworCWlmICghaXdsX2Z3X2RiZ190cmlnZ2VyX2VuYWJsZWQobXZtLT5mdywKKwkJCQkJRldfREJHX1RSSUdHRVJfTUlTU0VEX0JFQUNPTlMpKQorCQlyZXR1cm47CisKKwl0cmlnZ2VyID0gaXdsX2Z3X2RiZ19nZXRfdHJpZ2dlcihtdm0tPmZ3LAorCQkJCQkgRldfREJHX1RSSUdHRVJfTUlTU0VEX0JFQUNPTlMpOworCWJjb25fdHJpZyA9ICh2b2lkICopdHJpZ2dlci0+ZGF0YTsKKwlzdG9wX3RyaWdfbWlzc2VkX2Jjb24gPSBsZTMyX3RvX2NwdShiY29uX3RyaWctPnN0b3BfY29uc2VjX21pc3NlZF9iY29uKTsKKwlzdG9wX3RyaWdfbWlzc2VkX2Jjb25fc2luY2VfcnggPQorCQlsZTMyX3RvX2NwdShiY29uX3RyaWctPnN0b3BfY29uc2VjX21pc3NlZF9iY29uX3NpbmNlX3J4KTsKKworCS8qIFRPRE86IGltcGxlbWVudCBzdGFydCB0cmlnZ2VyICovCisKKwlpZiAoIWl3bF9md19kYmdfdHJpZ2dlcl9jaGVja19zdG9wKG12bSwgdmlmLCB0cmlnZ2VyKSkKKwkJcmV0dXJuOworCisJaWYgKHJ4X21pc3NlZF9iY29uX3NpbmNlX3J4ID49IHN0b3BfdHJpZ19taXNzZWRfYmNvbl9zaW5jZV9yeCB8fAorCSAgICByeF9taXNzZWRfYmNvbiA+PSBzdG9wX3RyaWdfbWlzc2VkX2Jjb24pCisJCWl3bF9tdm1fZndfZGJnX2NvbGxlY3RfdHJpZyhtdm0sIHRyaWdnZXIsIE5VTEwpOwogfQogCiBpbnQgaXdsX212bV9yeF9taXNzZWRfYmVhY29uc19ub3RpZihzdHJ1Y3QgaXdsX212bSAqbXZtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbWFjODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL21hYzgwMjExLmMKaW5kZXggMWZmN2VjMC4uODQ1NTUxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbWFjODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9tYWM4MDIxMS5jCkBAIC04Niw2ICs4Niw3IEBACiAjaW5jbHVkZSAiaXdsLWZ3LWVycm9yLWR1bXAuaCIKICNpbmNsdWRlICJpd2wtcHJwaC5oIgogI2luY2x1ZGUgIml3bC1jc3IuaCIKKyNpbmNsdWRlICJpd2wtbnZtLXBhcnNlLmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0IGl3bF9tdm1fbGltaXRzW10gPSB7CiAJewpAQCAtMzAxLDYgKzMwMiwxMTYgQEAKIAl9CiB9CiAKK3N0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICppd2xfbXZtX2dldF9yZWdkb21haW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCSAgY29uc3QgY2hhciAqYWxwaGEyLAorCQkJCQkJICBlbnVtIGl3bF9tY2Nfc291cmNlIHNyY19pZCwKKwkJCQkJCSAgYm9vbCAqY2hhbmdlZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmVnZCA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSB3aXBoeV90b19pZWVlODAyMTFfaHcod2lwaHkpOworCXN0cnVjdCBpd2xfbXZtICptdm0gPSBJV0xfTUFDODAyMTFfR0VUX01WTShodyk7CisJc3RydWN0IGl3bF9tY2NfdXBkYXRlX3Jlc3AgKnJlc3A7CisKKwlJV0xfREVCVUdfTEFSKG12bSwgIkdldHRpbmcgcmVnZG9tYWluIGRhdGEgZm9yICVzIGZyb20gRldcbiIsIGFscGhhMik7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKKworCXJlc3AgPSBpd2xfbXZtX3VwZGF0ZV9tY2MobXZtLCBhbHBoYTIsIHNyY19pZCk7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlc3ApKSB7CisJCUlXTF9ERUJVR19MQVIobXZtLCAiQ291bGQgbm90IGdldCB1cGRhdGUgZnJvbSBGVyAlZFxuIiwKKwkJCSAgICAgIFBUUl9SRVQocmVzcCkpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoY2hhbmdlZCkKKwkJKmNoYW5nZWQgPSAocmVzcC0+c3RhdHVzID09IE1DQ19SRVNQX05FV19DSEFOX1BST0ZJTEUpOworCisJcmVnZCA9IGl3bF9wYXJzZV9udm1fbWNjX2luZm8obXZtLT50cmFucy0+ZGV2LCBtdm0tPmNmZywKKwkJCQkgICAgICBfX2xlMzJfdG9fY3B1KHJlc3AtPm5fY2hhbm5lbHMpLAorCQkJCSAgICAgIHJlc3AtPmNoYW5uZWxzLAorCQkJCSAgICAgIF9fbGUxNl90b19jcHUocmVzcC0+bWNjKSk7CisJLyogU3RvcmUgdGhlIHJldHVybiBzb3VyY2UgaWQgKi8KKwlzcmNfaWQgPSByZXNwLT5zb3VyY2VfaWQ7CisJa2ZyZWUocmVzcCk7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlZ2QpKSB7CisJCUlXTF9ERUJVR19MQVIobXZtLCAiQ291bGQgbm90IGdldCBwYXJzZSB1cGRhdGUgZnJvbSBGVyAlZFxuIiwKKwkJCSAgICAgIFBUUl9SRVQocmVnZCkpOworCQlnb3RvIG91dDsKKwl9CisKKwlJV0xfREVCVUdfTEFSKG12bSwgInNldHRpbmcgYWxwaGEyIGZyb20gRlcgdG8gJXMgKDB4JXgsIDB4JXgpIHNyYz0lZFxuIiwKKwkJICAgICAgcmVnZC0+YWxwaGEyLCByZWdkLT5hbHBoYTJbMF0sIHJlZ2QtPmFscGhhMlsxXSwgc3JjX2lkKTsKKwltdm0tPmxhcl9yZWdkb21fc2V0ID0gdHJ1ZTsKKwltdm0tPm1jY19zcmMgPSBzcmNfaWQ7CisKK291dDoKKwlyZXR1cm4gcmVnZDsKK30KKwordm9pZCBpd2xfbXZtX3VwZGF0ZV9jaGFuZ2VkX3JlZ2RvbShzdHJ1Y3QgaXdsX212bSAqbXZtKQoreworCWJvb2wgY2hhbmdlZDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmVnZDsKKworCWlmICghaXdsX212bV9pc19sYXJfc3VwcG9ydGVkKG12bSkpCisJCXJldHVybjsKKworCXJlZ2QgPSBpd2xfbXZtX2dldF9jdXJyZW50X3JlZ2RvbWFpbihtdm0sICZjaGFuZ2VkKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHJlZ2QpKSB7CisJCS8qIG9ubHkgdXBkYXRlIHRoZSByZWd1bGF0b3J5IGNvcmUgaWYgY2hhbmdlZCAqLworCQlpZiAoY2hhbmdlZCkKKwkJCXJlZ3VsYXRvcnlfc2V0X3dpcGh5X3JlZ2QobXZtLT5ody0+d2lwaHksIHJlZ2QpOworCisJCWtmcmVlKHJlZ2QpOworCX0KK30KKworc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKml3bF9tdm1fZ2V0X2N1cnJlbnRfcmVnZG9tYWluKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJCQkJICBib29sICpjaGFuZ2VkKQoreworCXJldHVybiBpd2xfbXZtX2dldF9yZWdkb21haW4obXZtLT5ody0+d2lwaHksICJaWiIsCisJCQkJICAgICBpd2xfbXZtX2lzX3dpZmlfbWNjX3N1cHBvcnRlZChtdm0pID8KKwkJCQkgICAgIE1DQ19TT1VSQ0VfR0VUX0NVUlJFTlQgOgorCQkJCSAgICAgTUNDX1NPVVJDRV9PTERfRlcsIGNoYW5nZWQpOworfQorCitpbnQgaXdsX212bV9pbml0X2Z3X3JlZ2Qoc3RydWN0IGl3bF9tdm0gKm12bSkKK3sKKwllbnVtIGl3bF9tY2Nfc291cmNlIHVzZWRfc3JjOworCXN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZWdkOworCWludCByZXQ7CisJYm9vbCBjaGFuZ2VkOworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyID0KKwkJCXJ0bmxfZGVyZWZlcmVuY2UobXZtLT5ody0+d2lwaHktPnJlZ2QpOworCisJaWYgKCFyKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCS8qIHNhdmUgdGhlIGxhc3Qgc291cmNlIGluIGNhc2Ugd2Ugb3ZlcndyaXRlIGl0IGJlbG93ICovCisJdXNlZF9zcmMgPSBtdm0tPm1jY19zcmM7CisJaWYgKGl3bF9tdm1faXNfd2lmaV9tY2Nfc3VwcG9ydGVkKG12bSkpIHsKKwkJLyogTm90aWZ5IHRoZSBmaXJtd2FyZSB3ZSBzdXBwb3J0IHdpZmkgbG9jYXRpb24gdXBkYXRlcyAqLworCQlyZWdkID0gaXdsX212bV9nZXRfY3VycmVudF9yZWdkb21haW4obXZtLCBOVUxMKTsKKwkJaWYgKCFJU19FUlJfT1JfTlVMTChyZWdkKSkKKwkJCWtmcmVlKHJlZ2QpOworCX0KKworCS8qIE5vdyBzZXQgb3VyIGxhc3Qgc3RvcmVkIE1DQyBhbmQgc291cmNlICovCisJcmVnZCA9IGl3bF9tdm1fZ2V0X3JlZ2RvbWFpbihtdm0tPmh3LT53aXBoeSwgci0+YWxwaGEyLCB1c2VkX3NyYywKKwkJCQkgICAgICZjaGFuZ2VkKTsKKwlpZiAoSVNfRVJSX09SX05VTEwocmVnZCkpCisJCXJldHVybiAtRUlPOworCisJLyogdXBkYXRlIGNmZzgwMjExIGlmIHRoZSByZWdkb21haW4gd2FzIGNoYW5nZWQgKi8KKwlpZiAoY2hhbmdlZCkKKwkJcmV0ID0gcmVndWxhdG9yeV9zZXRfd2lwaHlfcmVnZF9zeW5jX3J0bmwobXZtLT5ody0+d2lwaHksIHJlZ2QpOworCWVsc2UKKwkJcmV0ID0gMDsKKworCWtmcmVlKHJlZ2QpOworCXJldHVybiByZXQ7Cit9CisKIGludCBpd2xfbXZtX21hY19zZXR1cF9yZWdpc3RlcihzdHJ1Y3QgaXdsX212bSAqbXZtKQogewogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gbXZtLT5odzsKQEAgLTMzOSwxMyArNDUwLDEwIEBACiAJICAgICFpd2x3aWZpX21vZF9wYXJhbXMuc3dfY3J5cHRvKQogCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX01GUF9DQVBBQkxFOwogCi0JaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuYXBpWzBdICYgSVdMX1VDT0RFX1RMVl9BUElfTE1BQ19TQ0FOIHx8Ci0JICAgIG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmIElXTF9VQ09ERV9UTFZfQ0FQQV9VTUFDX1NDQU4pIHsKLQkJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9TSU5HTEVfSFdfU0NBTl9PTl9BTExfQkFORFM7Ci0JCWh3LT53aXBoeS0+ZmVhdHVyZXMgfD0KLQkJCU5MODAyMTFfRkVBVFVSRV9TQ0hFRF9TQ0FOX1JBTkRPTV9NQUNfQUREUiB8Ci0JCQlOTDgwMjExX0ZFQVRVUkVfU0NBTl9SQU5ET01fTUFDX0FERFI7Ci0JfQorCWh3LT5mbGFncyB8PSBJRUVFODAyMTFfU0lOR0xFX0hXX1NDQU5fT05fQUxMX0JBTkRTOworCWh3LT53aXBoeS0+ZmVhdHVyZXMgfD0KKwkJTkw4MDIxMV9GRUFUVVJFX1NDSEVEX1NDQU5fUkFORE9NX01BQ19BRERSIHwKKwkJTkw4MDIxMV9GRUFUVVJFX1NDQU5fUkFORE9NX01BQ19BRERSOwogCiAJaHctPnN0YV9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF9tdm1fc3RhKTsKIAlody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX212bV92aWYpOwpAQCAtMzU5LDggKzQ2NywxMiBAQAogCQlCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpOwogCiAJaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0lCU1NfUlNOOwotCWh3LT53aXBoeS0+cmVndWxhdG9yeV9mbGFncyB8PSBSRUdVTEFUT1JZX0NVU1RPTV9SRUcgfAotCQkJCSAgICAgICBSRUdVTEFUT1JZX0RJU0FCTEVfQkVBQ09OX0hJTlRTOworCWh3LT53aXBoeS0+cmVndWxhdG9yeV9mbGFncyB8PSBSRUdVTEFUT1JZX0VOQUJMRV9SRUxBWF9OT19JUjsKKwlpZiAoaXdsX212bV9pc19sYXJfc3VwcG9ydGVkKG12bSkpCisJCWh3LT53aXBoeS0+cmVndWxhdG9yeV9mbGFncyB8PSBSRUdVTEFUT1JZX1dJUEhZX1NFTEZfTUFOQUdFRDsKKwllbHNlCisJCWh3LT53aXBoeS0+cmVndWxhdG9yeV9mbGFncyB8PSBSRUdVTEFUT1JZX0NVU1RPTV9SRUcgfAorCQkJCQkgICAgICAgUkVHVUxBVE9SWV9ESVNBQkxFX0JFQUNPTl9ISU5UUzsKIAogCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19HT19VQVBTRCkKIAkJaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0FQX1VBUFNEOwpAQCAtNDA1LDcgKzUxNywxMCBAQAogCQlody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0KIAkJCSZtdm0tPm52bV9kYXRhLT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKIAotCQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5jYXBhWzBdICYgSVdMX1VDT0RFX1RMVl9DQVBBX0JFQU1GT1JNRVIpCisJCWlmICgobXZtLT5mdy0+dWNvZGVfY2FwYS5jYXBhWzBdICYKKwkJICAgICBJV0xfVUNPREVfVExWX0NBUEFfQkVBTUZPUk1FUikgJiYKKwkJICAgIChtdm0tPmZ3LT51Y29kZV9jYXBhLmFwaVswXSAmCisJCSAgICAgSVdMX1VDT0RFX1RMVl9BUElfTFFfU1NfUEFSQU1TKSkKIAkJCWh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0tPnZodF9jYXAuY2FwIHw9CiAJCQkJSUVFRTgwMjExX1ZIVF9DQVBfU1VfQkVBTUZPUk1FUl9DQVBBQkxFOwogCX0KQEAgLTg4OSwxMiArMTAwNCwyNiBAQAogCWl3bF90cmFuc19yZWxlYXNlX25pY19hY2Nlc3MobXZtLT50cmFucywgJmZsYWdzKTsKIH0KIAordm9pZCBpd2xfbXZtX2ZyZWVfZndfZHVtcF9kZXNjKHN0cnVjdCBpd2xfbXZtICptdm0pCit7CisJaWYgKG12bS0+ZndfZHVtcF9kZXNjID09ICZpd2xfbXZtX2R1bXBfZGVzY19hc3NlcnQgfHwKKwkgICAgIW12bS0+ZndfZHVtcF9kZXNjKQorCQlyZXR1cm47CisKKwlrZnJlZShtdm0tPmZ3X2R1bXBfZGVzYyk7CisJbXZtLT5md19kdW1wX2Rlc2MgPSBOVUxMOworfQorCisjZGVmaW5lIElXTDgyNjBfSUNDTV9PRkZTRVQJCTB4NDQwMDAgLyogT25seSBmb3IgQi1zdGVwICovCisjZGVmaW5lIElXTDgyNjBfSUNDTV9MRU4JCTB4QzAwMCAvKiBPbmx5IGZvciBCLXN0ZXAgKi8KKwogdm9pZCBpd2xfbXZtX2Z3X2Vycm9yX2R1bXAoc3RydWN0IGl3bF9tdm0gKm12bSkKIHsKIAlzdHJ1Y3QgaXdsX2Z3X2Vycm9yX2R1bXBfZmlsZSAqZHVtcF9maWxlOwogCXN0cnVjdCBpd2xfZndfZXJyb3JfZHVtcF9kYXRhICpkdW1wX2RhdGE7CiAJc3RydWN0IGl3bF9md19lcnJvcl9kdW1wX2luZm8gKmR1bXBfaW5mbzsKIAlzdHJ1Y3QgaXdsX2Z3X2Vycm9yX2R1bXBfbWVtICpkdW1wX21lbTsKKwlzdHJ1Y3QgaXdsX2Z3X2Vycm9yX2R1bXBfdHJpZ2dlcl9kZXNjICpkdW1wX3RyaWc7CiAJc3RydWN0IGl3bF9tdm1fZHVtcF9wdHJzICpmd19lcnJvcl9kdW1wOwogCXUzMiBzcmFtX2xlbiwgc3JhbV9vZnM7CiAJdTMyIGZpbGVfbGVuLCBmaWZvX2RhdGFfbGVuID0gMDsKQEAgLTkwMywxNiArMTAzMiw2IEBACiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKIAotCS8qIFcvQSBmb3IgODAwMCBIVyBmYW1pbHkgQS1zdGVwICovCi0JaWYgKG12bS0+Y2ZnLT5kZXZpY2VfZmFtaWx5ID09IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDAgJiYKLQkgICAgQ1NSX0hXX1JFVl9TVEVQKG12bS0+dHJhbnMtPmh3X3JldikgPT0gU0lMSUNPTl9BX1NURVApIHsKLQkJaWYgKHNtZW1fbGVuKQotCQkJc21lbV9sZW4gPSAweDM4MDAwOwotCi0JCWlmIChzcmFtMl9sZW4pCi0JCQlzcmFtMl9sZW4gPSAweDEwMDAwOwotCX0KLQogCWZ3X2Vycm9yX2R1bXAgPSBremFsbG9jKHNpemVvZigqZndfZXJyb3JfZHVtcCksIEdGUF9LRVJORUwpOwogCWlmICghZndfZXJyb3JfZHVtcCkKIAkJcmV0dXJuOwpAQCAtOTY0LDYgKzEwODMsMTggQEAKIAkJICAgZmlmb19kYXRhX2xlbiArCiAJCSAgIHNpemVvZigqZHVtcF9pbmZvKTsKIAorCS8qCisJICogSW4gODAwMCBIVyBmYW1pbHkgQi1zdGVwIGluY2x1ZGUgdGhlIElDQ00gKHdoaWNoIHJlc2lkZXMgc2VwYXJhdGVseSkKKwkgKi8KKwlpZiAobXZtLT5jZmctPmRldmljZV9mYW1pbHkgPT0gSVdMX0RFVklDRV9GQU1JTFlfODAwMCAmJgorCSAgICBDU1JfSFdfUkVWX1NURVAobXZtLT50cmFucy0+aHdfcmV2KSA9PSBTSUxJQ09OX0JfU1RFUCkKKwkJZmlsZV9sZW4gKz0gc2l6ZW9mKCpkdW1wX2RhdGEpICsgc2l6ZW9mKCpkdW1wX21lbSkgKworCQkJICAgIElXTDgyNjBfSUNDTV9MRU47CisKKwlpZiAobXZtLT5md19kdW1wX2Rlc2MpCisJCWZpbGVfbGVuICs9IHNpemVvZigqZHVtcF9kYXRhKSArIHNpemVvZigqZHVtcF90cmlnKSArCisJCQkgICAgbXZtLT5md19kdW1wX2Rlc2MtPmxlbjsKKwogCS8qIE1ha2Ugcm9vbSBmb3IgdGhlIFNNRU0sIGlmIGl0IGV4aXN0cyAqLwogCWlmIChzbWVtX2xlbikKIAkJZmlsZV9sZW4gKz0gc2l6ZW9mKCpkdW1wX2RhdGEpICsgc2l6ZW9mKCpkdW1wX21lbSkgKyBzbWVtX2xlbjsKQEAgLTk3NSw2ICsxMTA2LDcgQEAKIAlkdW1wX2ZpbGUgPSB2emFsbG9jKGZpbGVfbGVuKTsKIAlpZiAoIWR1bXBfZmlsZSkgewogCQlrZnJlZShmd19lcnJvcl9kdW1wKTsKKwkJaXdsX212bV9mcmVlX2Z3X2R1bXBfZGVzYyhtdm0pOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDAzLDYgKzExMzUsMTkgQEAKIAlpZiAodGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmbXZtLT50cmFucy0+c3RhdHVzKSkKIAkJaXdsX212bV9kdW1wX2ZpZm9zKG12bSwgJmR1bXBfZGF0YSk7CiAKKwlpZiAobXZtLT5md19kdW1wX2Rlc2MpIHsKKwkJZHVtcF9kYXRhLT50eXBlID0gY3B1X3RvX2xlMzIoSVdMX0ZXX0VSUk9SX0RVTVBfRVJST1JfSU5GTyk7CisJCWR1bXBfZGF0YS0+bGVuID0gY3B1X3RvX2xlMzIoc2l6ZW9mKCpkdW1wX3RyaWcpICsKKwkJCQkJICAgICBtdm0tPmZ3X2R1bXBfZGVzYy0+bGVuKTsKKwkJZHVtcF90cmlnID0gKHZvaWQgKilkdW1wX2RhdGEtPmRhdGE7CisJCW1lbWNweShkdW1wX3RyaWcsICZtdm0tPmZ3X2R1bXBfZGVzYy0+dHJpZ19kZXNjLAorCQkgICAgICAgc2l6ZW9mKCpkdW1wX3RyaWcpICsgbXZtLT5md19kdW1wX2Rlc2MtPmxlbik7CisKKwkJLyogbm93IHdlIGNhbiBmcmVlIHRoaXMgY29weSAqLworCQlpd2xfbXZtX2ZyZWVfZndfZHVtcF9kZXNjKG12bSk7CisJCWR1bXBfZGF0YSA9IGl3bF9md19lcnJvcl9uZXh0X2RhdGEoZHVtcF9kYXRhKTsKKwl9CisKIAlkdW1wX2RhdGEtPnR5cGUgPSBjcHVfdG9fbGUzMihJV0xfRldfRVJST1JfRFVNUF9NRU0pOwogCWR1bXBfZGF0YS0+bGVuID0gY3B1X3RvX2xlMzIoc3JhbV9sZW4gKyBzaXplb2YoKmR1bXBfbWVtKSk7CiAJZHVtcF9tZW0gPSAodm9pZCAqKWR1bXBfZGF0YS0+ZGF0YTsKQEAgLTEwMzMsNiArMTE3OCwxOSBAQAogCQkJCQkgZHVtcF9tZW0tPmRhdGEsIHNyYW0yX2xlbik7CiAJfQogCisJaWYgKG12bS0+Y2ZnLT5kZXZpY2VfZmFtaWx5ID09IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDAgJiYKKwkgICAgQ1NSX0hXX1JFVl9TVEVQKG12bS0+dHJhbnMtPmh3X3JldikgPT0gU0lMSUNPTl9CX1NURVApIHsKKwkJZHVtcF9kYXRhID0gaXdsX2Z3X2Vycm9yX25leHRfZGF0YShkdW1wX2RhdGEpOworCQlkdW1wX2RhdGEtPnR5cGUgPSBjcHVfdG9fbGUzMihJV0xfRldfRVJST1JfRFVNUF9NRU0pOworCQlkdW1wX2RhdGEtPmxlbiA9IGNwdV90b19sZTMyKElXTDgyNjBfSUNDTV9MRU4gKworCQkJCQkgICAgIHNpemVvZigqZHVtcF9tZW0pKTsKKwkJZHVtcF9tZW0gPSAodm9pZCAqKWR1bXBfZGF0YS0+ZGF0YTsKKwkJZHVtcF9tZW0tPnR5cGUgPSBjcHVfdG9fbGUzMihJV0xfRldfRVJST1JfRFVNUF9NRU1fU1JBTSk7CisJCWR1bXBfbWVtLT5vZmZzZXQgPSBjcHVfdG9fbGUzMihJV0w4MjYwX0lDQ01fT0ZGU0VUKTsKKwkJaXdsX3RyYW5zX3JlYWRfbWVtX2J5dGVzKG12bS0+dHJhbnMsIElXTDgyNjBfSUNDTV9PRkZTRVQsCisJCQkJCSBkdW1wX21lbS0+ZGF0YSwgSVdMODI2MF9JQ0NNX0xFTik7CisJfQorCiAJZndfZXJyb3JfZHVtcC0+dHJhbnNfcHRyID0gaXdsX3RyYW5zX2R1bXBfZGF0YShtdm0tPnRyYW5zKTsKIAlmd19lcnJvcl9kdW1wLT5vcF9tb2RlX2xlbiA9IGZpbGVfbGVuOwogCWlmIChmd19lcnJvcl9kdW1wLT50cmFuc19wdHIpCkBAIC0xMDQxLDE2ICsxMTk5LDI2IEBACiAKIAlkZXZfY29yZWR1bXBtKG12bS0+dHJhbnMtPmRldiwgVEhJU19NT0RVTEUsIGZ3X2Vycm9yX2R1bXAsIDAsCiAJCSAgICAgIEdGUF9LRVJORUwsIGl3bF9tdm1fcmVhZF9jb3JlZHVtcCwgaXdsX212bV9mcmVlX2NvcmVkdW1wKTsKKworCWNsZWFyX2JpdChJV0xfTVZNX1NUQVRVU19EVU1QSU5HX0ZXX0xPRywgJm12bS0+c3RhdHVzKTsKIH0KIAorc3RydWN0IGl3bF9tdm1fZHVtcF9kZXNjIGl3bF9tdm1fZHVtcF9kZXNjX2Fzc2VydCA9IHsKKwkudHJpZ19kZXNjID0geworCQkudHlwZSA9IGNwdV90b19sZTMyKEZXX0RCR19UUklHR0VSX0ZXX0FTU0VSVCksCisJfSwKK307CisKIHN0YXRpYyB2b2lkIGl3bF9tdm1fcmVzdGFydF9jbGVhbnVwKHN0cnVjdCBpd2xfbXZtICptdm0pCiB7CiAJLyogY2xlYXIgdGhlIEQzIHJlY29uZmlnLCB3ZSBvbmx5IG5lZWQgaXQgdG8gYXZvaWQgZHVtcGluZyBhCiAJICogZmlybXdhcmUgY29yZWR1bXAgb24gcmVjb25maWd1cmF0aW9uLCB3ZSBzaG91bGRuJ3QgZG8gdGhhdAogCSAqIG9uIEQzLT5EMCB0cmFuc2l0aW9uCiAJICovCi0JaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoSVdMX01WTV9TVEFUVVNfRDNfUkVDT05GSUcsICZtdm0tPnN0YXR1cykpCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoSVdMX01WTV9TVEFUVVNfRDNfUkVDT05GSUcsICZtdm0tPnN0YXR1cykpIHsKKwkJbXZtLT5md19kdW1wX2Rlc2MgPSAmaXdsX212bV9kdW1wX2Rlc2NfYXNzZXJ0OwogCQlpd2xfbXZtX2Z3X2Vycm9yX2R1bXAobXZtKTsKKwl9CiAKIAkvKiBjbGVhbnVwIGFsbCBzdGFsZSByZWZlcmVuY2VzIChzY2FuLCByb2MpLCBidXQga2VlcCB0aGUKIAkgKiB1Y29kZV9kb3duIHJlZiB1bnRpbCByZWNvbmZpZyBpcyBjb21wbGV0ZQpAQCAtMTA5MSw2ICsxMjU5LDEwIEBACiAKIAltdm0tPnZpZl9jb3VudCA9IDA7CiAJbXZtLT5yeF9iYV9zZXNzaW9ucyA9IDA7CisJbXZtLT5md19kYmdfY29uZiA9IEZXX0RCR19JTlZBTElEOworCisJLyoga2VlcCBzdGF0aXN0aWNzIHRpY2tpbmcgKi8KKwlpd2xfbXZtX2FjY3VfcmFkaW9fc3RhdHMobXZtKTsKIH0KIAogaW50IF9faXdsX212bV9tYWNfc3RhcnQoc3RydWN0IGl3bF9tdm0gKm12bSkKQEAgLTExNTAsNyArMTMyMiw3IEBACiAKIAljbGVhcl9iaXQoSVdMX01WTV9TVEFUVVNfSU5fSFdfUkVTVEFSVCwgJm12bS0+c3RhdHVzKTsKIAlpd2xfbXZtX2QwaTNfZW5hYmxlX3R4KG12bSwgTlVMTCk7Ci0JcmV0ID0gaXdsX212bV91cGRhdGVfcXVvdGFzKG12bSwgTlVMTCk7CisJcmV0ID0gaXdsX212bV91cGRhdGVfcXVvdGFzKG12bSwgZmFsc2UsIE5VTEwpOwogCWlmIChyZXQpCiAJCUlXTF9FUlIobXZtLCAiRmFpbGVkIHRvIHVwZGF0ZSBxdW90YXMgYWZ0ZXIgcmVzdGFydCAoJWQpXG4iLAogCQkJcmV0KTsKQEAgLTEyMTMsNiArMTM4NSwxMSBAQAogewogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwogCisJLyogZmlybXdhcmUgY291bnRlcnMgYXJlIG9idmlvdXNseSByZXNldCBub3csIGJ1dCB3ZSBzaG91bGRuJ3QKKwkgKiBwYXJ0aWFsbHkgdHJhY2sgc28gYWxzbyBjbGVhciB0aGUgZndfcmVzZXRfYWNjdSBjb3VudGVycy4KKwkgKi8KKwltZW1zZXQoJm12bS0+YWNjdV9yYWRpb19zdGF0cywgMCwgc2l6ZW9mKG12bS0+YWNjdV9yYWRpb19zdGF0cykpOworCiAJLyoKIAkgKiBEaXNhbGxvdyBsb3cgcG93ZXIgc3RhdGVzIHdoZW4gdGhlIEZXIGlzIGRvd24gYnkgdGFraW5nCiAJICogdGhlIFVDT0RFX0RPV04gcmVmLiBpbiBjYXNlIG9mIG9uZ29pbmcgaHcgcmVzdGFydCB0aGUKQEAgLTEyNDMsNiArMTQyMCwyMCBAQAogCSAqLwogCWNsZWFyX2JpdChJV0xfTVZNX1NUQVRVU19JTl9IV19SRVNUQVJULCAmbXZtLT5zdGF0dXMpOwogCisJLyogV2Ugc2hvdWxkbid0IGhhdmUgYW55IFVJRHMgc3RpbGwgc2V0LiAgTG9vcCBvdmVyIGFsbCB0aGUgVUlEcyB0bworCSAqIG1ha2Ugc3VyZSB0aGVyZSdzIG5vdGhpbmcgbGVmdCB0aGVyZSBhbmQgd2FybiBpZiBhbnkgaXMgZm91bmQuCisJICovCisJaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmIElXTF9VQ09ERV9UTFZfQ0FQQV9VTUFDX1NDQU4pIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IElXTF9NVk1fTUFYX1NJTVVMVEFORU9VU19TQ0FOUzsgaSsrKSB7CisJCQlpZiAoV0FSTl9PTkNFKG12bS0+c2Nhbl91aWRbaV0sCisJCQkJICAgICAgIlVNQUMgc2NhbiBVSUQgJWQgd2FzIG5vdCBjbGVhbmVkXG4iLAorCQkJCSAgICAgIG12bS0+c2Nhbl91aWRbaV0pKQorCQkJCW12bS0+c2Nhbl91aWRbaV0gPSAwOworCQl9CisJfQorCiAJbXZtLT51Y29kZV9sb2FkZWQgPSBmYWxzZTsKIH0KIApAQCAtMTI1Miw3ICsxNDQzLDggQEAKIAogCWZsdXNoX3dvcmsoJm12bS0+ZDBpM19leGl0X3dvcmspOwogCWZsdXNoX3dvcmsoJm12bS0+YXN5bmNfaGFuZGxlcnNfd2spOwotCWZsdXNoX3dvcmsoJm12bS0+ZndfZXJyb3JfZHVtcF93ayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZtdm0tPmZ3X2R1bXBfd2spOworCWl3bF9tdm1fZnJlZV9md19kdW1wX2Rlc2MobXZtKTsKIAogCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwogCV9faXdsX212bV9tYWNfc3RvcChtdm0pOwpAQCAtMTMwMCw2ICsxNDkyLDggQEAKIAlzdHJ1Y3QgaXdsX212bV92aWYgKm12bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKIAlpbnQgcmV0OwogCisJbXZtdmlmLT5tdm0gPSBtdm07CisKIAkvKgogCSAqIG1ha2Ugc3VyZSBEMGkzIGV4aXQgaXMgY29tcGxldGVkLCBvdGhlcndpc2UgYSB0YXJnZXQgYWNjZXNzCiAJICogZHVyaW5nIHR4IHF1ZXVlIGNvbmZpZ3VyYXRpb24gY291bGQgYmUgZG9uZSB3aGVuIHN0aWxsIGluCkBAIC0xMzE3LDYgKzE1MTEsMTEgQEAKIAogCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwogCisJLyogbWFrZSBzdXJlIHRoYXQgYmVhY29uIHN0YXRpc3RpY3MgZG9uJ3QgZ28gYmFja3dhcmRzIHdpdGggRlcgcmVzZXQgKi8KKwlpZiAodGVzdF9iaXQoSVdMX01WTV9TVEFUVVNfSU5fSFdfUkVTVEFSVCwgJm12bS0+c3RhdHVzKSkKKwkJbXZtdmlmLT5iZWFjb25fc3RhdHMuYWNjdV9udW1fYmVhY29ucyArPQorCQkJbXZtdmlmLT5iZWFjb25fc3RhdHMubnVtX2JlYWNvbnM7CisKIAkvKiBBbGxvY2F0ZSByZXNvdXJjZXMgZm9yIHRoZSBNQUMgY29udGV4dCwgYW5kIGFkZCBpdCB0byB0aGUgZncgICovCiAJcmV0ID0gaXdsX212bV9tYWNfY3R4dF9pbml0KG12bSwgdmlmKTsKIAlpZiAocmV0KQpAQCAtMTQzMSw5ICsxNjMwLDMzIEBACiAJdTMyIHRmZF9tc2sgPSBpd2xfbXZtX21hY19nZXRfcXVldWVzX21hc2sodmlmKTsKIAogCWlmICh0ZmRfbXNrKSB7CisJCS8qCisJCSAqIG1hYzgwMjExIGZpcnN0IHJlbW92ZXMgYWxsIHRoZSBzdGF0aW9ucyBvZiB0aGUgdmlmIGFuZAorCQkgKiB0aGVuIHJlbW92ZXMgdGhlIHZpZi4gV2hlbiBpdCByZW1vdmVzIGEgc3RhdGlvbiBpdCBhbHNvCisJCSAqIGZsdXNoZXMgdGhlIEFNUERVIHNlc3Npb24uIFNvIGJ5IG5vdywgYWxsIHRoZSBBTVBEVSBzZXNzaW9ucworCQkgKiBvZiBhbGwgdGhlIHN0YXRpb25zIG9mIHRoaXMgdmlmIGFyZSBjbG9zZWQsIGFuZCB0aGUgcXVldWVzCisJCSAqIG9mIHRoZXNlIEFNUERVIHNlc3Npb25zIGFyZSBwcm9wZXJseSBjbG9zZWQuCisJCSAqIFdlIHN0aWxsIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHRoZSBzaGFyZWQgcXVldWVzIG9mIHRoZSB2aWYuCisJCSAqIEZsdXNoIHRoZW0gaGVyZS4KKwkJICovCiAJCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwogCQlpd2xfbXZtX2ZsdXNoX3R4X3BhdGgobXZtLCB0ZmRfbXNrLCB0cnVlKTsKIAkJbXV0ZXhfdW5sb2NrKCZtdm0tPm11dGV4KTsKKworCQkvKgorCQkgKiBUaGVyZSBhcmUgdHJhbnNwb3J0cyB0aGF0IGJ1ZmZlciBhIGZldyBmcmFtZXMgaW4gdGhlIGhvc3QuCisJCSAqIEZvciB0aGVzZSwgdGhlIGZsdXNoIGFib3ZlIGlzbid0IGVub3VnaCBzaW5jZSB3aGlsZSB3ZSB3ZXJlCisJCSAqIGZsdXNoaW5nLCB0aGUgdHJhbnNwb3J0IG1pZ2h0IGhhdmUgc2VudCBtb3JlIGZyYW1lcyB0byB0aGUKKwkJICogZGV2aWNlLiBUbyBzb2x2ZSB0aGlzLCB3YWl0IGhlcmUgdW50aWwgdGhlIHRyYW5zcG9ydCBpcworCQkgKiBlbXB0eS4gVGVjaG5pY2FsbHksIHRoaXMgY291bGQgaGF2ZSByZXBsYWNlZCB0aGUgZmx1c2gKKwkJICogYWJvdmUsIGJ1dCBmbHVzaCBpcyBtdWNoIGZhc3RlciB0aGFuIGRyYWluaW5nLiBTbyBmbHVzaAorCQkgKiBmaXJzdCwgYW5kIGRyYWluIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIG5vIGZyYW1lcyBpbiB0aGUKKwkJICogdHJhbnNwb3J0IGFueW1vcmUuCisJCSAqIElmIGEgc3RhdGlvbiBzdGlsbCBoYWQgZnJhbWVzIG9uIHRoZSBzaGFyZWQgcXVldWVzLCBpdCBpcworCQkgKiBhbHJlYWR5IG1hcmtlZCBhcyBkcmFpbmluZywgc28gdG8gY29tcGxldGUgdGhlIGRyYWluaW5nLCB3ZQorCQkgKiBqdXN0IG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgdHJhbnNwb3J0IGlzIGVtcHR5LgorCQkgKi8KKwkJaXdsX3RyYW5zX3dhaXRfdHhfcXVldWVfZW1wdHkobXZtLT50cmFucywgdGZkX21zayk7CiAJfQogCiAJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFKSB7CkBAIC0xODEwLDggKzIwMzMsMTMgQEAKIAogCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKIAkJaWYgKGJzc19jb25mLT5hc3NvYykgeworCQkJLyogY2xlYXIgc3RhdGlzdGljcyB0byBnZXQgY2xlYW4gYmVhY29uIGNvdW50ZXIgKi8KKwkJCWl3bF9tdm1fcmVxdWVzdF9zdGF0aXN0aWNzKG12bSwgdHJ1ZSk7CisJCQltZW1zZXQoJm12bXZpZi0+YmVhY29uX3N0YXRzLCAwLAorCQkJICAgICAgIHNpemVvZihtdm12aWYtPmJlYWNvbl9zdGF0cykpOworCiAJCQkvKiBhZGQgcXVvdGEgZm9yIHRoaXMgaW50ZXJmYWNlICovCi0JCQlyZXQgPSBpd2xfbXZtX3VwZGF0ZV9xdW90YXMobXZtLCBOVUxMKTsKKwkJCXJldCA9IGl3bF9tdm1fdXBkYXRlX3F1b3Rhcyhtdm0sIHRydWUsIE5VTEwpOwogCQkJaWYgKHJldCkgewogCQkJCUlXTF9FUlIobXZtLCAiZmFpbGVkIHRvIHVwZGF0ZSBxdW90YXNcbiIpOwogCQkJCXJldHVybjsKQEAgLTE4NjMsNyArMjA5MSw3IEBACiAJCQkJbXZtLT5kMGkzX2FwX3N0YV9pZCA9IElXTF9NVk1fU1RBVElPTl9DT1VOVDsKIAkJCW12bXZpZi0+YXBfc3RhX2lkID0gSVdMX01WTV9TVEFUSU9OX0NPVU5UOwogCQkJLyogcmVtb3ZlIHF1b3RhIGZvciB0aGlzIGludGVyZmFjZSAqLwotCQkJcmV0ID0gaXdsX212bV91cGRhdGVfcXVvdGFzKG12bSwgTlVMTCk7CisJCQlyZXQgPSBpd2xfbXZtX3VwZGF0ZV9xdW90YXMobXZtLCBmYWxzZSwgTlVMTCk7CiAJCQlpZiAocmV0KQogCQkJCUlXTF9FUlIobXZtLCAiZmFpbGVkIHRvIHVwZGF0ZSBxdW90YXNcbiIpOwogCkBAIC0xOTgyLDcgKzIyMTAsNyBAQAogCS8qIHBvd2VyIHVwZGF0ZWQgbmVlZHMgdG8gYmUgZG9uZSBiZWZvcmUgcXVvdGFzICovCiAJaXdsX212bV9wb3dlcl91cGRhdGVfbWFjKG12bSk7CiAKLQlyZXQgPSBpd2xfbXZtX3VwZGF0ZV9xdW90YXMobXZtLCBOVUxMKTsKKwlyZXQgPSBpd2xfbXZtX3VwZGF0ZV9xdW90YXMobXZtLCBmYWxzZSwgTlVMTCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfcXVvdGFfZmFpbGVkOwogCkBAIC0xOTk4LDggKzIyMjYsNyBAQAogCWlmIChpd2xfbXZtX3BoeV9jdHhfY291bnQobXZtKSA+IDEpCiAJCWl3bF9tdm1fdGVhcmRvd25fdGRsc19wZWVycyhtdm0pOwogCi0JbXV0ZXhfdW5sb2NrKCZtdm0tPm11dGV4KTsKLQlyZXR1cm4gMDsKKwlnb3RvIG91dF91bmxvY2s7CiAKIG91dF9xdW90YV9mYWlsZWQ6CiAJaXdsX212bV9wb3dlcl91cGRhdGVfbWFjKG12bSk7CkBAIC0yMDQ4LDcgKzIyNzUsNyBAQAogCWlmICh2aWYtPnAycCAmJiBtdm0tPnAycF9kZXZpY2VfdmlmKQogCQlpd2xfbXZtX21hY19jdHh0X2NoYW5nZWQobXZtLCBtdm0tPnAycF9kZXZpY2VfdmlmLCBmYWxzZSwgTlVMTCk7CiAKLQlpd2xfbXZtX3VwZGF0ZV9xdW90YXMobXZtLCBOVUxMKTsKKwlpd2xfbXZtX3VwZGF0ZV9xdW90YXMobXZtLCBmYWxzZSwgTlVMTCk7CiAJaXdsX212bV9zZW5kX3JtX2JjYXN0X3N0YShtdm0sIHZpZik7CiAJaXdsX212bV9iaW5kaW5nX3JlbW92ZV92aWYobXZtLCB2aWYpOwogCkBAIC0yMTg3LDYgKzI0MTQsMTIgQEAKIAogCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwogCisJaWYgKGl3bF9tdm1faXNfbGFyX3N1cHBvcnRlZChtdm0pICYmICFtdm0tPmxhcl9yZWdkb21fc2V0KSB7CisJCUlXTF9FUlIobXZtLCAic2NhbiB3aGlsZSBMQVIgcmVnZG9tYWluIGlzIG5vdCBzZXRcbiIpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwogCWlmIChtdm0tPnNjYW5fc3RhdHVzICE9IElXTF9NVk1fU0NBTl9OT05FKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CkBAIC0yMTk2LDEwICsyNDI5LDggQEAKIAogCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmNhcGFbMF0gJiBJV0xfVUNPREVfVExWX0NBUEFfVU1BQ19TQ0FOKQogCQlyZXQgPSBpd2xfbXZtX3NjYW5fdW1hYyhtdm0sIHZpZiwgaHdfcmVxKTsKLQllbHNlIGlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmFwaVswXSAmIElXTF9VQ09ERV9UTFZfQVBJX0xNQUNfU0NBTikKLQkJcmV0ID0gaXdsX212bV91bmlmaWVkX3NjYW5fbG1hYyhtdm0sIHZpZiwgaHdfcmVxKTsKIAllbHNlCi0JCXJldCA9IGl3bF9tdm1fc2Nhbl9yZXF1ZXN0KG12bSwgdmlmLCByZXEpOworCQlyZXQgPSBpd2xfbXZtX3VuaWZpZWRfc2Nhbl9sbWFjKG12bSwgdmlmLCBod19yZXEpOwogCiAJaWYgKHJldCkKIAkJaXdsX212bV91bnJlZihtdm0sIElXTF9NVk1fUkVGX1NDQU4pOwpAQCAtMjIxNSw3ICsyNDQ2LDE5IEBACiAKIAltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKIAotCWl3bF9tdm1fY2FuY2VsX3NjYW4obXZtKTsKKwkvKiBEdWUgdG8gYSByYWNlIGNvbmRpdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IG1hYzgwMjExIGFza3MKKwkgKiB1cyB0byBzdG9wIGEgaHdfc2NhbiB3aGVuIGl0J3MgYWxyZWFkeSBzdG9wcGVkLiAgVGhpcyBjYW4KKwkgKiBoYXBwZW4sIGZvciBpbnN0YW5jZSwgaWYgd2Ugc3RvcHBlZCB0aGUgc2NhbiBvdXJzZWx2ZXMsCisJICogY2FsbGVkIGllZWU4MDIxMV9zY2FuX2NvbXBsZXRlZCgpIGFuZCB0aGUgdXNlcnNwYWNlIGNhbGxlZAorCSAqIGNhbmNlbCBzY2FuIHNjYW4gYmVmb3JlIGllZWU4MDIxMV9zY2FuX3dvcmsoKSBjb3VsZCBydW4uCisJICogVG8gaGFuZGxlIHRoYXQsIHNpbXBseSByZXR1cm4gaWYgdGhlIHNjYW4gaXMgbm90IHJ1bm5pbmcuCisJKi8KKwkvKiBGSVhNRTogZm9yIG5vdywgd2UgaWdub3JlIHRoaXMgcmFjZSBmb3IgVU1BQyBzY2Fucywgc2luY2UKKwkgKiB0aGV5IGRvbid0IHNldCB0aGUgc2Nhbl9zdGF0dXMuCisJICovCisJaWYgKChtdm0tPnNjYW5fc3RhdHVzID09IElXTF9NVk1fU0NBTl9PUykgfHwKKwkgICAgKG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmIElXTF9VQ09ERV9UTFZfQ0FQQV9VTUFDX1NDQU4pKQorCQlpd2xfbXZtX2NhbmNlbF9zY2FuKG12bSk7CiAKIAltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOwogfQpAQCAtMjI1NywyNSArMjUwMCwzNSBAQAogewogCXN0cnVjdCBpd2xfbXZtICptdm0gPSBJV0xfTUFDODAyMTFfR0VUX01WTShodyk7CiAJc3RydWN0IGl3bF9tdm1fc3RhICptdm1zdGEgPSBpd2xfbXZtX3N0YV9mcm9tX21hYzgwMjExKHN0YSk7CisJdW5zaWduZWQgbG9uZyB0eHFzID0gMCwgdGlkcyA9IDA7CiAJaW50IHRpZDsKIAorCXNwaW5fbG9ja19iaCgmbXZtc3RhLT5sb2NrKTsKKwlmb3IgKHRpZCA9IDA7IHRpZCA8IElXTF9NQVhfVElEX0NPVU5UOyB0aWQrKykgeworCQlzdHJ1Y3QgaXdsX212bV90aWRfZGF0YSAqdGlkX2RhdGEgPSAmbXZtc3RhLT50aWRfZGF0YVt0aWRdOworCisJCWlmICh0aWRfZGF0YS0+c3RhdGUgIT0gSVdMX0FHR19PTiAmJgorCQkgICAgdGlkX2RhdGEtPnN0YXRlICE9IElXTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQSkKKwkJCWNvbnRpbnVlOworCisJCV9fc2V0X2JpdCh0aWRfZGF0YS0+dHhxX2lkLCAmdHhxcyk7CisKKwkJaWYgKGl3bF9tdm1fdGlkX3F1ZXVlZCh0aWRfZGF0YSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCV9fc2V0X2JpdCh0aWQsICZ0aWRzKTsKKwl9CisKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU1RBX05PVElGWV9TTEVFUDoKIAkJaWYgKGF0b21pY19yZWFkKCZtdm0tPnBlbmRpbmdfZnJhbWVzW212bXN0YS0+c3RhX2lkXSkgPiAwKQogCQkJaWVlZTgwMjExX3N0YV9ibG9ja19hd2FrZShodywgc3RhLCB0cnVlKTsKLQkJc3Bpbl9sb2NrX2JoKCZtdm1zdGEtPmxvY2spOwotCQlmb3IgKHRpZCA9IDA7IHRpZCA8IElXTF9NQVhfVElEX0NPVU5UOyB0aWQrKykgewotCQkJc3RydWN0IGl3bF9tdm1fdGlkX2RhdGEgKnRpZF9kYXRhOwogCi0JCQl0aWRfZGF0YSA9ICZtdm1zdGEtPnRpZF9kYXRhW3RpZF07Ci0JCQlpZiAodGlkX2RhdGEtPnN0YXRlICE9IElXTF9BR0dfT04gJiYKLQkJCSAgICB0aWRfZGF0YS0+c3RhdGUgIT0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGl3bF9tdm1fdGlkX3F1ZXVlZCh0aWRfZGF0YSkgPT0gMCkKLQkJCQljb250aW51ZTsKKwkJZm9yX2VhY2hfc2V0X2JpdCh0aWQsICZ0aWRzLCBJV0xfTUFYX1RJRF9DT1VOVCkKIAkJCWllZWU4MDIxMV9zdGFfc2V0X2J1ZmZlcmVkKHN0YSwgdGlkLCB0cnVlKTsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmbXZtc3RhLT5sb2NrKTsKKworCQlpZiAodHhxcykKKwkJCWl3bF90cmFuc19mcmVlemVfdHhxX3RpbWVyKG12bS0+dHJhbnMsIHR4cXMsIHRydWUpOwogCQkvKgogCQkgKiBUaGUgZncgdXBkYXRlcyB0aGUgU1RBIHRvIGJlIGFzbGVlcC4gVHggcGFja2V0cyBvbiB0aGUgVHgKIAkJICogcXVldWVzIHRvIHRoaXMgc3RhdGlvbiB3aWxsIG5vdCBiZSB0cmFuc21pdHRlZC4gVGhlIGZ3IHdpbGwKQEAgLTIyODUsMTEgKzI1MzgsMTUgQEAKIAljYXNlIFNUQV9OT1RJRllfQVdBS0U6CiAJCWlmIChXQVJOX09OKG12bXN0YS0+c3RhX2lkID09IElXTF9NVk1fU1RBVElPTl9DT1VOVCkpCiAJCQlicmVhazsKKworCQlpZiAodHhxcykKKwkJCWl3bF90cmFuc19mcmVlemVfdHhxX3RpbWVyKG12bS0+dHJhbnMsIHR4cXMsIGZhbHNlKTsKIAkJaXdsX212bV9zdGFfbW9kaWZ5X3BzX3dha2UobXZtLCBzdGEpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CisJc3Bpbl91bmxvY2tfYmgoJm12bXN0YS0+bG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGl3bF9tdm1fc3RhX3ByZV9yY3VfcmVtb3ZlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMjUyNywxMyArMjc4NCwxMyBAQAogCiAJbXV0ZXhfbG9jaygmbXZtLT5tdXRleCk7CiAKLQkvKiBOZXdlc3QgRlcgZml4ZXMgc2NoZWQgc2NhbiB3aGlsZSBjb25uZWN0ZWQgb24gYW5vdGhlciBpbnRlcmZhY2UgKi8KLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5hcGlbMF0gJiBJV0xfVUNPREVfVExWX0FQSV9MTUFDX1NDQU4pIHsKLQkJaWYgKCF2aWYtPmJzc19jb25mLmlkbGUpIHsKLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfSBlbHNlIGlmICghaXdsX212bV9pc19pZGxlKG12bSkpIHsKKwlpZiAoaXdsX212bV9pc19sYXJfc3VwcG9ydGVkKG12bSkgJiYgIW12bS0+bGFyX3JlZ2RvbV9zZXQpIHsKKwkJSVdMX0VSUihtdm0sICJzY2hlZC1zY2FuIHdoaWxlIExBUiByZWdkb21haW4gaXMgbm90IHNldFxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKCF2aWYtPmJzc19jb25mLmlkbGUpIHsKIAkJcmV0ID0gLUVCVVNZOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yNTU5LDEyICsyODE2LDI5IEBACiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOworCisJLyogRHVlIHRvIGEgcmFjZSBjb25kaXRpb24sIGl0J3MgcG9zc2libGUgdGhhdCBtYWM4MDIxMSBhc2tzCisJICogdXMgdG8gc3RvcCBhIHNjaGVkX3NjYW4gd2hlbiBpdCdzIGFscmVhZHkgc3RvcHBlZC4gIFRoaXMKKwkgKiBjYW4gaGFwcGVuLCBmb3IgaW5zdGFuY2UsIGlmIHdlIHN0b3BwZWQgdGhlIHNjYW4gb3Vyc2VsdmVzLAorCSAqIGNhbGxlZCBpZWVlODAyMTFfc2NoZWRfc2Nhbl9zdG9wcGVkKCkgYW5kIHRoZSB1c2Vyc3BhY2UgY2FsbGVkCisJICogc3RvcCBzY2hlZCBzY2FuIHNjYW4gYmVmb3JlIGllZWU4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWRfd29yaygpCisJICogY291bGQgcnVuLiAgVG8gaGFuZGxlIHRoaXMsIHNpbXBseSByZXR1cm4gaWYgdGhlIHNjYW4gaXMKKwkgKiBub3QgcnVubmluZy4KKwkqLworCS8qIEZJWE1FOiBmb3Igbm93LCB3ZSBpZ25vcmUgdGhpcyByYWNlIGZvciBVTUFDIHNjYW5zLCBzaW5jZQorCSAqIHRoZXkgZG9uJ3Qgc2V0IHRoZSBzY2FuX3N0YXR1cy4KKwkgKi8KKwlpZiAobXZtLT5zY2FuX3N0YXR1cyAhPSBJV0xfTVZNX1NDQU5fU0NIRUQgJiYKKwkgICAgIShtdm0tPmZ3LT51Y29kZV9jYXBhLmNhcGFbMF0gJiBJV0xfVUNPREVfVExWX0NBUEFfVU1BQ19TQ0FOKSkgeworCQltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKIAlyZXQgPSBpd2xfbXZtX3NjYW5fb2ZmbG9hZF9zdG9wKG12bSwgZmFsc2UpOwogCW11dGV4X3VubG9jaygmbXZtLT5tdXRleCk7CiAJaXdsX212bV93YWl0X2Zvcl9hc3luY19oYW5kbGVycyhtdm0pOwogCiAJcmV0dXJuIHJldDsKLQogfQogCiBzdGF0aWMgaW50IGl3bF9tdm1fbWFjX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0yODA2LDYgKzMwODAsOCBAQAogCUlXTF9ERUJVR19NQUM4MDIxMShtdm0sICJlbnRlciAoJWQsICVkLCAlZClcbiIsIGNoYW5uZWwtPmh3X3ZhbHVlLAogCQkJICAgZHVyYXRpb24sIHR5cGUpOwogCisJZmx1c2hfd29yaygmbXZtLT5yb2NfZG9uZV93ayk7CisKIAltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKIAogCXN3aXRjaCAodmlmLT50eXBlKSB7CkBAIC0zMDc3LDE0ICszMzUzLDE0IEBACiAJICovCiAJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NT05JVE9SKSB7CiAJCW12bXZpZi0+bW9uaXRvcl9hY3RpdmUgPSB0cnVlOwotCQlyZXQgPSBpd2xfbXZtX3VwZGF0ZV9xdW90YXMobXZtLCBOVUxMKTsKKwkJcmV0ID0gaXdsX212bV91cGRhdGVfcXVvdGFzKG12bSwgZmFsc2UsIE5VTEwpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXRfcmVtb3ZlX2JpbmRpbmc7CiAJfQogCiAJLyogSGFuZGxlIGJpbmRpbmcgZHVyaW5nIENTQSAqLwogCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKLQkJaXdsX212bV91cGRhdGVfcXVvdGFzKG12bSwgTlVMTCk7CisJCWl3bF9tdm1fdXBkYXRlX3F1b3Rhcyhtdm0sIGZhbHNlLCBOVUxMKTsKIAkJaXdsX212bV9tYWNfY3R4dF9jaGFuZ2VkKG12bSwgdmlmLCBmYWxzZSwgTlVMTCk7CiAJfQogCkBAIC0zMTA4LDcgKzMzODQsNyBAQAogCiAJCWl3bF9tdm1fdW5yZWYobXZtLCBJV0xfTVZNX1JFRl9QUk9URUNUX0NTQSk7CiAKLQkJaXdsX212bV91cGRhdGVfcXVvdGFzKG12bSwgTlVMTCk7CisJCWl3bF9tdm1fdXBkYXRlX3F1b3Rhcyhtdm0sIGZhbHNlLCBOVUxMKTsKIAl9CiAKIAlnb3RvIG91dDsKQEAgLTMxODEsNyArMzQ1Nyw3IEBACiAJCWJyZWFrOwogCX0KIAotCWl3bF9tdm1fdXBkYXRlX3F1b3Rhcyhtdm0sIGRpc2FibGVkX3ZpZik7CisJaXdsX212bV91cGRhdGVfcXVvdGFzKG12bSwgZmFsc2UsIGRpc2FibGVkX3ZpZik7CiAJaXdsX212bV9iaW5kaW5nX3JlbW92ZV92aWYobXZtLCB2aWYpOwogCiBvdXQ6CkBAIC0zMzczLDcgKzM2NDksNyBAQAogCQltdm0tPm5vYV9kdXJhdGlvbiA9IG5vYV9kdXJhdGlvbjsKIAkJbXZtLT5ub2FfdmlmID0gdmlmOwogCi0JCXJldHVybiBpd2xfbXZtX3VwZGF0ZV9xdW90YXMobXZtLCBOVUxMKTsKKwkJcmV0dXJuIGl3bF9tdm1fdXBkYXRlX3F1b3Rhcyhtdm0sIGZhbHNlLCBOVUxMKTsKIAljYXNlIElXTF9NVk1fVE1fQ01EX1NFVF9CRUFDT05fRklMVEVSOgogCQkvKiBtdXN0IGJlIGFzc29jaWF0ZWQgY2xpZW50IHZpZiAtIGlnbm9yZSBhdXRob3JpemVkICovCiAJCWlmICghdmlmIHx8IHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8CkBAIC0zNDMwLDkgKzM3MDYsMTMgQEAKIAogCW11dGV4X2xvY2soJm12bS0+bXV0ZXgpOwogCisJbXZtdmlmLT5jc2FfZmFpbGVkID0gZmFsc2U7CisKIAlJV0xfREVCVUdfTUFDODAyMTEobXZtLCAicHJlIENTQSB0byBmcmVxICVkXG4iLAogCQkJICAgY2hzdy0+Y2hhbmRlZi5jZW50ZXJfZnJlcTEpOwogCisJaXdsX2Z3X2RiZ190cmlnZ2VyX3NpbXBsZV9zdG9wKG12bSwgdmlmLCBGV19EQkdfVFJJR0dFUl9DSEFOTkVMX1NXSVRDSCk7CisKIAlzd2l0Y2ggKHZpZi0+dHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CiAJCWNzYV92aWYgPQpAQCAtMzUwMiw2ICszNzgyLDEyIEBACiAKIAltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKIAorCWlmIChtdm12aWYtPmNzYV9mYWlsZWQpIHsKKwkJbXZtdmlmLT5jc2FfZmFpbGVkID0gZmFsc2U7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKIAlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKIAkJc3RydWN0IGl3bF9tdm1fc3RhICptdm1zdGE7CiAKQEAgLTM1ODEsNiArMzg2NywxNTQgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgaXdsX212bV9tYWNfZ2V0X3N1cnZleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IGlkeCwKKwkJCQkgIHN0cnVjdCBzdXJ2ZXlfaW5mbyAqc3VydmV5KQoreworCXN0cnVjdCBpd2xfbXZtICptdm0gPSBJV0xfTUFDODAyMTFfR0VUX01WTShodyk7CisJaW50IHJldDsKKworCW1lbXNldChzdXJ2ZXksIDAsIHNpemVvZigqc3VydmV5KSk7CisKKwkvKiBvbmx5IHN1cHBvcnQgZ2xvYmFsIHN0YXRpc3RpY3MgcmlnaHQgbm93ICovCisJaWYgKGlkeCAhPSAwKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmICghKG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmCisJCQlJV0xfVUNPREVfVExWX0NBUEFfUkFESU9fQkVBQ09OX1NUQVRTKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKKworCWlmIChtdm0tPnVjb2RlX2xvYWRlZCkgeworCQlyZXQgPSBpd2xfbXZtX3JlcXVlc3Rfc3RhdGlzdGljcyhtdm0sIGZhbHNlKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCXN1cnZleS0+ZmlsbGVkID0gU1VSVkVZX0lORk9fVElNRSB8CisJCQkgU1VSVkVZX0lORk9fVElNRV9SWCB8CisJCQkgU1VSVkVZX0lORk9fVElNRV9UWCB8CisJCQkgU1VSVkVZX0lORk9fVElNRV9TQ0FOOworCXN1cnZleS0+dGltZSA9IG12bS0+YWNjdV9yYWRpb19zdGF0cy5vbl90aW1lX3JmICsKKwkJICAgICAgIG12bS0+cmFkaW9fc3RhdHMub25fdGltZV9yZjsKKwlkb19kaXYoc3VydmV5LT50aW1lLCBVU0VDX1BFUl9NU0VDKTsKKworCXN1cnZleS0+dGltZV9yeCA9IG12bS0+YWNjdV9yYWRpb19zdGF0cy5yeF90aW1lICsKKwkJCSAgbXZtLT5yYWRpb19zdGF0cy5yeF90aW1lOworCWRvX2RpdihzdXJ2ZXktPnRpbWVfcngsIFVTRUNfUEVSX01TRUMpOworCisJc3VydmV5LT50aW1lX3R4ID0gbXZtLT5hY2N1X3JhZGlvX3N0YXRzLnR4X3RpbWUgKworCQkJICBtdm0tPnJhZGlvX3N0YXRzLnR4X3RpbWU7CisJZG9fZGl2KHN1cnZleS0+dGltZV90eCwgVVNFQ19QRVJfTVNFQyk7CisKKwlzdXJ2ZXktPnRpbWVfc2NhbiA9IG12bS0+YWNjdV9yYWRpb19zdGF0cy5vbl90aW1lX3NjYW4gKworCQkJICAgIG12bS0+cmFkaW9fc3RhdHMub25fdGltZV9zY2FuOworCWRvX2RpdihzdXJ2ZXktPnRpbWVfc2NhbiwgVVNFQ19QRVJfTVNFQyk7CisKKwlyZXQgPSAwOworIG91dDoKKwltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGl3bF9tdm1fbWFjX3N0YV9zdGF0aXN0aWNzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCSAgICAgICBzdHJ1Y3Qgc3RhdGlvbl9pbmZvICpzaW5mbykKK3sKKwlzdHJ1Y3QgaXdsX212bSAqbXZtID0gSVdMX01BQzgwMjExX0dFVF9NVk0oaHcpOworCXN0cnVjdCBpd2xfbXZtX3ZpZiAqbXZtdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh2aWYpOworCXN0cnVjdCBpd2xfbXZtX3N0YSAqbXZtc3RhID0gaXdsX212bV9zdGFfZnJvbV9tYWM4MDIxMShzdGEpOworCisJaWYgKCEobXZtLT5mdy0+dWNvZGVfY2FwYS5jYXBhWzBdICYKKwkJCQlJV0xfVUNPREVfVExWX0NBUEFfUkFESU9fQkVBQ09OX1NUQVRTKSkKKwkJcmV0dXJuOworCisJLyogaWYgYmVhY29uIGZpbHRlcmluZyBpc24ndCBvbiBtYWM4MDIxMSBkb2VzIGl0IGFueXdheSAqLworCWlmICghKHZpZi0+ZHJpdmVyX2ZsYWdzICYgSUVFRTgwMjExX1ZJRl9CRUFDT05fRklMVEVSKSkKKwkJcmV0dXJuOworCisJaWYgKCF2aWYtPmJzc19jb25mLmFzc29jKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZtdm0tPm11dGV4KTsKKworCWlmIChtdm12aWYtPmFwX3N0YV9pZCAhPSBtdm1zdGEtPnN0YV9pZCkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAoaXdsX212bV9yZXF1ZXN0X3N0YXRpc3RpY3MobXZtLCBmYWxzZSkpCisJCWdvdG8gdW5sb2NrOworCisJc2luZm8tPnJ4X2JlYWNvbiA9IG12bXZpZi0+YmVhY29uX3N0YXRzLm51bV9iZWFjb25zICsKKwkJCSAgIG12bXZpZi0+YmVhY29uX3N0YXRzLmFjY3VfbnVtX2JlYWNvbnM7CisJc2luZm8tPmZpbGxlZCB8PSBCSVQoTkw4MDIxMV9TVEFfSU5GT19CRUFDT05fUlgpOworCWlmIChtdm12aWYtPmJlYWNvbl9zdGF0cy5hdmdfc2lnbmFsKSB7CisJCS8qIGZpcm13YXJlIG9ubHkgcmVwb3J0cyBhIHZhbHVlIGFmdGVyIFJYaW5nIGEgZmV3IGJlYWNvbnMgKi8KKwkJc2luZm8tPnJ4X2JlYWNvbl9zaWduYWxfYXZnID0gbXZtdmlmLT5iZWFjb25fc3RhdHMuYXZnX3NpZ25hbDsKKwkJc2luZm8tPmZpbGxlZCB8PSBCSVQoTkw4MDIxMV9TVEFfSU5GT19CRUFDT05fU0lHTkFMX0FWRyk7CisJfQorIHVubG9jazoKKwltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBpd2xfbXZtX21hY19ldmVudF9jYWxsYmFjayhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9ldmVudCAqZXZlbnQpCit7CisjZGVmaW5lIENIRUNLX01MTUVfVFJJR0dFUihfbXZtLCBfdHJpZywgX2J1ZiwgX2NudCwgX2ZtdC4uLikJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAoKF9jbnQpICYmIC0tKF9jbnQpKQkJCQlcCisJCQlicmVhazsJCQkJCVwKKwkJaXdsX212bV9md19kYmdfY29sbGVjdF90cmlnKF9tdm0sIF90cmlnLCBfZm10KTtcCisJfSB3aGlsZSAoMCkKKworCXN0cnVjdCBpd2xfbXZtICptdm0gPSBJV0xfTUFDODAyMTFfR0VUX01WTShodyk7CisJc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl90bHYgKnRyaWc7CisJc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl9tbG1lICp0cmlnX21sbWU7CisKKwlpZiAoIWl3bF9md19kYmdfdHJpZ2dlcl9lbmFibGVkKG12bS0+ZncsIEZXX0RCR19UUklHR0VSX01MTUUpKQorCQlyZXR1cm47CisKKwlpZiAoZXZlbnQtPnUubWxtZS5zdGF0dXMgPT0gTUxNRV9TVUNDRVNTKQorCQlyZXR1cm47CisKKwl0cmlnID0gaXdsX2Z3X2RiZ19nZXRfdHJpZ2dlcihtdm0tPmZ3LCBGV19EQkdfVFJJR0dFUl9NTE1FKTsKKwl0cmlnX21sbWUgPSAodm9pZCAqKXRyaWctPmRhdGE7CisJaWYgKCFpd2xfZndfZGJnX3RyaWdnZXJfY2hlY2tfc3RvcChtdm0sIHZpZiwgdHJpZykpCisJCXJldHVybjsKKworCWlmIChldmVudC0+dS5tbG1lLmRhdGEgPT0gQVNTT0NfRVZFTlQpIHsKKwkJaWYgKGV2ZW50LT51Lm1sbWUuc3RhdHVzID09IE1MTUVfREVOSUVEKQorCQkJQ0hFQ0tfTUxNRV9UUklHR0VSKG12bSwgdHJpZywgYnVmLAorCQkJCQkgICB0cmlnX21sbWUtPnN0b3BfYXNzb2NfZGVuaWVkLAorCQkJCQkgICAiREVOSUVEIEFTU09DOiByZWFzb24gJWQiLAorCQkJCQkgICAgZXZlbnQtPnUubWxtZS5yZWFzb24pOworCQllbHNlIGlmIChldmVudC0+dS5tbG1lLnN0YXR1cyA9PSBNTE1FX1RJTUVPVVQpCisJCQlDSEVDS19NTE1FX1RSSUdHRVIobXZtLCB0cmlnLCBidWYsCisJCQkJCSAgIHRyaWdfbWxtZS0+c3RvcF9hc3NvY190aW1lb3V0LAorCQkJCQkgICAiQVNTT0MgVElNRU9VVCIpOworCX0gZWxzZSBpZiAoZXZlbnQtPnUubWxtZS5kYXRhID09IEFVVEhfRVZFTlQpIHsKKwkJaWYgKGV2ZW50LT51Lm1sbWUuc3RhdHVzID09IE1MTUVfREVOSUVEKQorCQkJQ0hFQ0tfTUxNRV9UUklHR0VSKG12bSwgdHJpZywgYnVmLAorCQkJCQkgICB0cmlnX21sbWUtPnN0b3BfYXV0aF9kZW5pZWQsCisJCQkJCSAgICJERU5JRUQgQVVUSDogcmVhc29uICVkIiwKKwkJCQkJICAgZXZlbnQtPnUubWxtZS5yZWFzb24pOworCQllbHNlIGlmIChldmVudC0+dS5tbG1lLnN0YXR1cyA9PSBNTE1FX1RJTUVPVVQpCisJCQlDSEVDS19NTE1FX1RSSUdHRVIobXZtLCB0cmlnLCBidWYsCisJCQkJCSAgIHRyaWdfbWxtZS0+c3RvcF9hdXRoX3RpbWVvdXQsCisJCQkJCSAgICJBVVRIIFRJTUVPVVQiKTsKKwl9IGVsc2UgaWYgKGV2ZW50LT51Lm1sbWUuZGF0YSA9PSBERUFVVEhfUlhfRVZFTlQpIHsKKwkJQ0hFQ0tfTUxNRV9UUklHR0VSKG12bSwgdHJpZywgYnVmLAorCQkJCSAgIHRyaWdfbWxtZS0+c3RvcF9yeF9kZWF1dGgsCisJCQkJICAgIkRFQVVUSCBSWCAlZCIsIGV2ZW50LT51Lm1sbWUucmVhc29uKTsKKwl9IGVsc2UgaWYgKGV2ZW50LT51Lm1sbWUuZGF0YSA9PSBERUFVVEhfVFhfRVZFTlQpIHsKKwkJQ0hFQ0tfTUxNRV9UUklHR0VSKG12bSwgdHJpZywgYnVmLAorCQkJCSAgIHRyaWdfbWxtZS0+c3RvcF90eF9kZWF1dGgsCisJCQkJICAgIkRFQVVUSCBUWCAlZCIsIGV2ZW50LT51Lm1sbWUucmVhc29uKTsKKwl9CisjdW5kZWYgQ0hFQ0tfTUxNRV9UUklHR0VSCit9CisKIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzIGl3bF9tdm1faHdfb3BzID0gewogCS50eCA9IGl3bF9tdm1fbWFjX3R4LAogCS5hbXBkdV9hY3Rpb24gPSBpd2xfbXZtX21hY19hbXBkdV9hY3Rpb24sCkBAIC0zNjM0LDYgKzQwNjgsOCBAQAogCS50ZGxzX2NhbmNlbF9jaGFubmVsX3N3aXRjaCA9IGl3bF9tdm1fdGRsc19jYW5jZWxfY2hhbm5lbF9zd2l0Y2gsCiAJLnRkbHNfcmVjdl9jaGFubmVsX3N3aXRjaCA9IGl3bF9tdm1fdGRsc19yZWN2X2NoYW5uZWxfc3dpdGNoLAogCisJLmV2ZW50X2NhbGxiYWNrID0gaXdsX212bV9tYWNfZXZlbnRfY2FsbGJhY2ssCisKIAlDRkc4MDIxMV9URVNUTU9ERV9DTUQoaXdsX212bV9tYWNfdGVzdG1vZGVfY21kKQogCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCkBAIC0zNjQ3LDQgKzQwODMsNiBAQAogI2VuZGlmCiAJLnNldF9kZWZhdWx0X3VuaWNhc3Rfa2V5ID0gaXdsX212bV9zZXRfZGVmYXVsdF91bmljYXN0X2tleSwKICNlbmRpZgorCS5nZXRfc3VydmV5ID0gaXdsX212bV9tYWNfZ2V0X3N1cnZleSwKKwkuc3RhX3N0YXRpc3RpY3MgPSBpd2xfbXZtX21hY19zdGFfc3RhdGlzdGljcywKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9tdm0uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL212bS5oCmluZGV4IDZjNjlkMDUuLmQ1NTIyYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL212bS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL212bS5oCkBAIC03NSw2ICs3NSw3IEBACiAjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCiAjaW5jbHVkZSAiaXdsLW5vdGlmLXdhaXQuaCIKICNpbmNsdWRlICJpd2wtZWVwcm9tLXBhcnNlLmgiCisjaW5jbHVkZSAiaXdsLWZ3LWZpbGUuaCIKICNpbmNsdWRlICJzdGEuaCIKICNpbmNsdWRlICJmdy1hcGkuaCIKICNpbmNsdWRlICJjb25zdGFudHMuaCIKQEAgLTE0NSw2ICsxNDYsMTkgQEAKIAl1MzIgb3BfbW9kZV9sZW47CiB9OwogCisvKioKKyAqIHN0cnVjdCBpd2xfbXZtX2R1bXBfZGVzYyAtIGRlc2NyaWJlcyB0aGUgZHVtcAorICogQGxlbjogbGVuZ3RoIG9mIHRyaWdfZGVzYy0+ZGF0YQorICogQHRyaWdfZGVzYzogdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkdW1wCisgKi8KK3N0cnVjdCBpd2xfbXZtX2R1bXBfZGVzYyB7CisJc2l6ZV90IGxlbjsKKwkvKiBtdXN0IGJlIGxhc3QgKi8KKwlzdHJ1Y3QgaXdsX2Z3X2Vycm9yX2R1bXBfdHJpZ2dlcl9kZXNjIHRyaWdfZGVzYzsKK307CisKK2V4dGVybiBzdHJ1Y3QgaXdsX212bV9kdW1wX2Rlc2MgaXdsX212bV9kdW1wX2Rlc2NfYXNzZXJ0OworCiBzdHJ1Y3QgaXdsX212bV9waHlfY3R4dCB7CiAJdTE2IGlkOwogCXUxNiBjb2xvcjsKQEAgLTMzNSwxMCArMzQ5LDE1IEBACiAgKiBAYmNhc3Rfc3RhOiBzdGF0aW9uIHVzZWQgZm9yIGJyb2FkY2FzdCBwYWNrZXRzLiBVc2VkIGJ5IHRoZSBmb2xsb3dpbmcKICAqICB2aWZzOiBQMlBfREVWSUNFLCBHTyBhbmQgQVAuCiAgKiBAYmVhY29uX3NrYjogdGhlIHNrYiB1c2VkIHRvIGhvbGQgdGhlIEFQL0dPIGJlYWNvbiB0ZW1wbGF0ZQotICogQHNtcHNfcmVxdWVzdHM6IHRoZSBTTVBTIHJlcXVlc3RzIG9mIGRpZmZlcmVudHMgcGFydHMgb2YgdGhlIGRyaXZlciwKKyAqIEBzbXBzX3JlcXVlc3RzOiB0aGUgU01QUyByZXF1ZXN0cyBvZiBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGRyaXZlciwKICAqCWNvbWJpbmVkIG9uIHVwZGF0ZSB0byB5aWVsZCB0aGUgb3ZlcmFsbCByZXF1ZXN0IHRvIG1hYzgwMjExLgorICogQGJlYWNvbl9zdGF0czogYmVhY29uIHN0YXRpc3RpY3MsIGNvbnRhaW5pbmcgdGhlICMgb2YgcmVjZWl2ZWQgYmVhY29ucywKKyAqCSMgb2YgcmVjZWl2ZWQgYmVhY29ucyBhY2N1bXVsYXRlZCBvdmVyIEZXIHJlc3RhcnQsIGFuZCB0aGUgY3VycmVudAorICoJYXZlcmFnZSBzaWduYWwgb2YgYmVhY29ucyByZXRyaWV2ZWQgZnJvbSB0aGUgZmlybXdhcmUKKyAqIEBjc2FfZmFpbGVkOiBDU0EgZmFpbGVkIHRvIHNjaGVkdWxlIHRpbWUgZXZlbnQsIHJlcG9ydCBhbiBlcnJvciBsYXRlcgogICovCiBzdHJ1Y3QgaXdsX212bV92aWYgeworCXN0cnVjdCBpd2xfbXZtICptdm07CiAJdTE2IGlkOwogCXUxNiBjb2xvcjsKIAl1OCBhcF9zdGFfaWQ7CkBAIC0zNTQsNiArMzczLDExIEBACiAJYm9vbCBwc19kaXNhYmxlZDsKIAlzdHJ1Y3QgaXdsX212bV92aWZfYmZfZGF0YSBiZl9kYXRhOwogCisJc3RydWN0IHsKKwkJdTMyIG51bV9iZWFjb25zLCBhY2N1X251bV9iZWFjb25zOworCQl1OCBhdmdfc2lnbmFsOworCX0gYmVhY29uX3N0YXRzOworCiAJdTMyIGFwX2JlYWNvbl90aW1lOwogCiAJZW51bSBpd2xfdHNmX2lkIHRzZl9pZDsKQEAgLTM5Niw3ICs0MjAsNiBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCi0Jc3RydWN0IGl3bF9tdm0gKm12bTsKIAlzdHJ1Y3QgZGVudHJ5ICpkYmdmc19kaXI7CiAJc3RydWN0IGRlbnRyeSAqZGJnZnNfc2xpbms7CiAJc3RydWN0IGl3bF9kYmdmc19wbSBkYmdmc19wbTsKQEAgLTQxMSw2ICs0MzQsNyBAQAogCiAJLyogSW5kaWNhdGVzIHRoYXQgQ1NBIGNvdW50ZG93biBtYXkgYmUgc3RhcnRlZCAqLwogCWJvb2wgY3NhX2NvdW50ZG93bjsKKwlib29sIGNzYV9mYWlsZWQ7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpd2xfbXZtX3ZpZiAqCkBAIC01OTMsNiArNjE3LDEzIEBACiAKIAlzdHJ1Y3QgbXZtX3N0YXRpc3RpY3Nfcnggcnhfc3RhdHM7CiAKKwlzdHJ1Y3QgeworCQl1NjQgcnhfdGltZTsKKwkJdTY0IHR4X3RpbWU7CisJCXU2NCBvbl90aW1lX3JmOworCQl1NjQgb25fdGltZV9zY2FuOworCX0gcmFkaW9fc3RhdHMsIGFjY3VfcmFkaW9fc3RhdHM7CisKIAl1OCBxdWV1ZV90b19tYWM4MDIxMVtJV0xfTUFYX0hXX1FVRVVFU107CiAJYXRvbWljX3QgbWFjODAyMTFfcXVldWVfc3RvcF9jb3VudFtJRUVFODAyMTFfTUFYX1FVRVVFU107CiAKQEAgLTY1Nyw3ICs2ODgsNyBAQAogCWJvb2wgZGlzYWJsZV9wb3dlcl9vZmY7CiAJYm9vbCBkaXNhYmxlX3Bvd2VyX29mZl9kMzsKIAotCWJvb2wgc2Nhbl9pdGVyX25vdGlmX2VuYWJsZWQ7CisJdTMyIHNjYW5faXRlcl9ub3RpZl9lbmFibGVkOyAvKiBtdXN0IGJlIHUzMiBmb3IgZGVidWdmc19jcmVhdGVfYm9vbCAqLwogCiAJc3RydWN0IGRlYnVnZnNfYmxvYl93cmFwcGVyIG52bV9od19ibG9iOwogCXN0cnVjdCBkZWJ1Z2ZzX2Jsb2Jfd3JhcHBlciBudm1fc3dfYmxvYjsKQEAgLTY2Niw2ICs2OTcsNyBAQAogCiAJc3RydWN0IGl3bF9tdm1fZnJhbWVfc3RhdHMgZHJ2X3J4X3N0YXRzOwogCXNwaW5sb2NrX3QgZHJ2X3N0YXRzX2xvY2s7CisJdTE2IGRiZ2ZzX3J4X3BoeWluZm87CiAjZW5kaWYKIAogCXN0cnVjdCBpd2xfbXZtX3BoeV9jdHh0IHBoeV9jdHh0c1tOVU1fUEhZX0NUWF07CkBAIC02ODcsOCArNzE5LDkgQEAKIAogCS8qIC0xIGZvciBhbHdheXMsIDAgZm9yIG5ldmVyLCA+MCBmb3IgdGhhdCBtYW55IHRpbWVzICovCiAJczggcmVzdGFydF9mdzsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZndfZXJyb3JfZHVtcF93azsKLQllbnVtIGl3bF9md19kYmdfY29uZiBmd19kYmdfY29uZjsKKwl1OCBmd19kYmdfY29uZjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGZ3X2R1bXBfd2s7CisJc3RydWN0IGl3bF9tdm1fZHVtcF9kZXNjICpmd19kdW1wX2Rlc2M7CiAKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRURTCiAJc3RydWN0IGxlZF9jbGFzc2RldiBsZWQ7CkBAIC03MTUsNiArNzQ4LDcgQEAKIAl2b2lkICpkM19yZXN1bWVfc3JhbTsKIAl1MzIgZDNfdGVzdF9wbWVfcHRyOwogCXN0cnVjdCBpZWVlODAyMTFfdmlmICprZWVwX3ZpZjsKKwl1MzIgbGFzdF9uZXRkZXRlY3Rfc2NhbnM7IC8qIG5vLiBvZiBzY2FucyBpbiB0aGUgbGFzdCBuZXQtZGV0ZWN0IHdha2UgKi8KICNlbmRpZgogI2VuZGlmCiAKQEAgLTc3OSw2ICs4MTMsOSBAQAogCS8qIHN5c3RlbSB0aW1lIG9mIGxhc3QgYmVhY29uIChmb3IgQVAvR08gaW50ZXJmYWNlKSAqLwogCXUzMiBhcF9sYXN0X2JlYWNvbl9ncDI7CiAKKwlib29sIGxhcl9yZWdkb21fc2V0OworCWVudW0gaXdsX21jY19zb3VyY2UgbWNjX3NyYzsKKwogCXU4IGxvd19sYXRlbmN5X2FnZ19mcmFtZV9saW1pdDsKIAogCS8qIFRETFMgY2hhbm5lbCBzd2l0Y2ggZGF0YSAqLwpAQCAtODI0LDYgKzg2MSw3IEBACiAJSVdMX01WTV9TVEFUVVNfSU5fRDBJMywKIAlJV0xfTVZNX1NUQVRVU19ST0NfQVVYX1JVTk5JTkcsCiAJSVdMX01WTV9TVEFUVVNfRDNfUkVDT05GSUcsCisJSVdMX01WTV9TVEFUVVNfRFVNUElOR19GV19MT0csCiB9OwogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXdsX212bV9pc19yYWRpb19raWxsZWQoc3RydWN0IGl3bF9tdm0gKm12bSkKQEAgLTg3OCwxMSArOTE2LDQ4IEBACiAJICAgICAgIChtdm0tPmZ3LT51Y29kZV9jYXBhLmNhcGFbMF0gJiBJV0xfVUNPREVfVExWX0NBUEFfRDBJM19TVVBQT1JUKTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGl3bF9tdm1faXNfbGFyX3N1cHBvcnRlZChzdHJ1Y3QgaXdsX212bSAqbXZtKQoreworCWJvb2wgbnZtX2xhciA9IG12bS0+bnZtX2RhdGEtPmxhcl9lbmFibGVkOworCWJvb2wgdGx2X2xhciA9IG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmCisJCUlXTF9VQ09ERV9UTFZfQ0FQQV9MQVJfU1VQUE9SVDsKKworCWlmIChpd2x3aWZpX21vZF9wYXJhbXMubGFyX2Rpc2FibGUpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogRW5hYmxlIExBUiBvbmx5IGlmIGl0IGlzIHN1cHBvcnRlZCBieSB0aGUgRlcgKFRMVikgJiYKKwkgKiBlbmFibGVkIGluIHRoZSBOVk0KKwkgKi8KKwlpZiAobXZtLT5jZmctPmRldmljZV9mYW1pbHkgPT0gSVdMX0RFVklDRV9GQU1JTFlfODAwMCkKKwkJcmV0dXJuIG52bV9sYXIgJiYgdGx2X2xhcjsKKwllbHNlCisJCXJldHVybiB0bHZfbGFyOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXdsX212bV9pc193aWZpX21jY19zdXBwb3J0ZWQoc3RydWN0IGl3bF9tdm0gKm12bSkKK3sKKwlyZXR1cm4gbXZtLT5mdy0+dWNvZGVfY2FwYS5hcGlbMF0gJiBJV0xfVUNPREVfVExWX0FQSV9XSUZJX01DQ19VUERBVEUgfHwKKwkgICAgICAgbXZtLT5mdy0+dWNvZGVfY2FwYS5jYXBhWzBdICYgSVdMX1VDT0RFX1RMVl9DQVBBX0xBUl9NVUxUSV9NQ0M7Cit9CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBpd2xfbXZtX2lzX3NjZF9jZmdfc3VwcG9ydGVkKHN0cnVjdCBpd2xfbXZtICptdm0pCiB7CiAJcmV0dXJuIG12bS0+ZnctPnVjb2RlX2NhcGEuYXBpWzBdICYgSVdMX1VDT0RFX1RMVl9BUElfU0NEX0NGRzsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGl3bF9tdm1fYnRfaXNfcGxjcl9zdXBwb3J0ZWQoc3RydWN0IGl3bF9tdm0gKm12bSkKK3sKKwlyZXR1cm4gKG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmIElXTF9VQ09ERV9UTFZfQ0FQQV9CVF9DT0VYX1BMQ1IpICYmCisJCUlXTF9NVk1fQlRfQ09FWF9DT1JVTk5JTkc7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpd2xfbXZtX2J0X2lzX3JyY19zdXBwb3J0ZWQoc3RydWN0IGl3bF9tdm0gKm12bSkKK3sKKwlyZXR1cm4gKG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmIElXTF9VQ09ERV9UTFZfQ0FQQV9CVF9DT0VYX1JSQykgJiYKKwkJSVdMX01WTV9CVF9DT0VYX1JSQzsKK30KKwogZXh0ZXJuIGNvbnN0IHU4IGl3bF9tdm1fYWNfdG9fdHhfZmlmb1tdOwogCiBzdHJ1Y3QgaXdsX3JhdGVfaW5mbyB7CkBAIC05NTEsMTIgKzEwMjYsMTMgQEAKIH0KIAogLyogU3RhdGlzdGljcyAqLwotaW50IGl3bF9tdm1fcnhfcmVwbHlfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJCXN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiLAotCQkJCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKTsKK3ZvaWQgaXdsX212bV9oYW5kbGVfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJCSAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCk7CiBpbnQgaXdsX212bV9yeF9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkgIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiLAogCQkJICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCk7CitpbnQgaXdsX212bV9yZXF1ZXN0X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9tdm0gKm12bSwgYm9vbCBjbGVhcik7Cit2b2lkIGl3bF9tdm1fYWNjdV9yYWRpb19zdGF0cyhzdHJ1Y3QgaXdsX212bSAqbXZtKTsKIAogLyogTlZNICovCiBpbnQgaXdsX252bV9pbml0KHN0cnVjdCBpd2xfbXZtICptdm0sIGJvb2wgcmVhZF9udm1fZnJvbV9uaWMpOwpAQCAtMTA2NywyMCArMTE0MywxNCBAQAogaW50IGl3bF9tdm1fYmluZGluZ19yZW1vdmVfdmlmKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwogCiAvKiBRdW90YSBtYW5hZ2VtZW50ICovCi1pbnQgaXdsX212bV91cGRhdGVfcXVvdGFzKHN0cnVjdCBpd2xfbXZtICptdm0sCitpbnQgaXdsX212bV91cGRhdGVfcXVvdGFzKHN0cnVjdCBpd2xfbXZtICptdm0sIGJvb2wgZm9yY2VfdXBsb2FkLAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqZGlzYWJsZWRfdmlmKTsKIAogLyogU2Nhbm5pbmcgKi8KIGludCBpd2xfbXZtX3NjYW5fc2l6ZShzdHJ1Y3QgaXdsX212bSAqbXZtKTsKLWludCBpd2xfbXZtX3NjYW5fcmVxdWVzdChzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKTsKLWludCBpd2xfbXZtX3J4X3NjYW5fcmVzcG9uc2Uoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIsCi0JCQkgICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKTsKLWludCBpd2xfbXZtX3J4X3NjYW5fY29tcGxldGUoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIsCi0JCQkgICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKTsKIGludCBpd2xfbXZtX2NhbmNlbF9zY2FuKHN0cnVjdCBpd2xfbXZtICptdm0pOwogaW50IGl3bF9tdm1fbWF4X3NjYW5faWVfbGVuKHN0cnVjdCBpd2xfbXZtICptdm0sIGJvb2wgaXNfc2NoZWRfc2Nhbik7Cit2b2lkIGl3bF9tdm1fcmVwb3J0X3NjYW5fYWJvcnRlZChzdHJ1Y3QgaXdsX212bSAqbXZtKTsKIAogLyogU2NoZWR1bGVkIHNjYW4gKi8KIGludCBpd2xfbXZtX3J4X3NjYW5fb2ZmbG9hZF9jb21wbGV0ZV9ub3RpZihzdHJ1Y3QgaXdsX212bSAqbXZtLApAQCAtMTA4OSwxNCArMTE1OSw4IEBACiBpbnQgaXdsX212bV9yeF9zY2FuX29mZmxvYWRfaXRlcl9jb21wbGV0ZV9ub3RpZihzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkJCQkJc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIsCiAJCQkJCQlzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCk7Ci1pbnQgaXdsX212bV9jb25maWdfc2NoZWRfc2NhbihzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2hlZF9zY2FuX3JlcXVlc3QgKnJlcSwKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc2Nhbl9pZXMgKmllcyk7CiBpbnQgaXdsX212bV9jb25maWdfc2NoZWRfc2Nhbl9wcm9maWxlcyhzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXEpOwotaW50IGl3bF9tdm1fc2NoZWRfc2Nhbl9zdGFydChzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXEpOwogaW50IGl3bF9tdm1fc2Nhbl9vZmZsb2FkX3N0YXJ0KHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXEsCkBAIC0xMjI1LDcgKzEyODksNyBAQAogCQkJICAgICBzdHJ1Y3QgaXdsX3J4X2NtZF9idWZmZXIgKnJ4YiwKIAkJCSAgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQpOwogdm9pZCBpd2xfbXZtX2J0X3Jzc2lfZXZlbnQoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgIGVudW0gaWVlZTgwMjExX3Jzc2lfZXZlbnQgcnNzaV9ldmVudCk7CisJCQkgICBlbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50X2RhdGEpOwogdm9pZCBpd2xfbXZtX2J0X2NvZXhfdmlmX2NoYW5nZShzdHJ1Y3QgaXdsX212bSAqbXZtKTsKIHUxNiBpd2xfbXZtX2NvZXhfYWdnX3RpbWVfbGltaXQoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKQEAgLTEyMzgsNyArMTMwMiw2IEBACiB1OCBpd2xfbXZtX2J0X2NvZXhfdHhfcHJpbyhzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAogCQkJICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLCB1OCBhYyk7CiAKLWJvb2wgaXdsX212bV9idF9jb2V4X2lzX2FudF9hdmFpbF9vbGQoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggYW50KTsKIGJvb2wgaXdsX212bV9idF9jb2V4X2lzX3NoYXJlZF9hbnRfYXZhaWxfb2xkKHN0cnVjdCBpd2xfbXZtICptdm0pOwogdm9pZCBpd2xfbXZtX2J0X2NvZXhfdmlmX2NoYW5nZV9vbGQoc3RydWN0IGl3bF9tdm0gKm12bSk7CiBpbnQgaXdsX3NlbmRfYnRfaW5pdF9jb25mX29sZChzdHJ1Y3QgaXdsX212bSAqbXZtKTsKQEAgLTEyNDYsNyArMTMwOSw3IEBACiAJCQkJIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiLAogCQkJCSBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCk7CiB2b2lkIGl3bF9tdm1fYnRfcnNzaV9ldmVudF9vbGQoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgICAgICBlbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50IHJzc2lfZXZlbnQpOworCQkJICAgICAgIGVudW0gaWVlZTgwMjExX3Jzc2lfZXZlbnRfZGF0YSk7CiB1MTYgaXdsX212bV9jb2V4X2FnZ190aW1lX2xpbWl0X29sZChzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKIGJvb2wgaXdsX212bV9idF9jb2V4X2lzX21pbW9fYWxsb3dlZF9vbGQoc3RydWN0IGl3bF9tdm0gKm12bSwKQEAgLTEyNTcsMTcgKzEzMjAsNiBAQAogCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiLAogCQkJCSAgICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKTsKIAotZW51bSBpd2xfYnRfa2lsbF9tc2sgewotCUJUX0tJTExfTVNLX0RFRkFVTFQsCi0JQlRfS0lMTF9NU0tfTkVWRVIsCi0JQlRfS0lMTF9NU0tfQUxXQVlTLAotCUJUX0tJTExfTVNLX01BWCwKLX07Ci0KLWV4dGVybiBjb25zdCB1OCBpd2xfYnRfYWNrX2tpbGxfbXNrW0JUX01BWF9BR11bQlRfQ09FWF9NQVhfTFVUXTsKLWV4dGVybiBjb25zdCB1OCBpd2xfYnRfY3RzX2tpbGxfbXNrW0JUX01BWF9BR11bQlRfQ09FWF9NQVhfTFVUXTsKLWV4dGVybiBjb25zdCB1MzIgaXdsX2J0X2N0bF9raWxsX21za1tCVF9LSUxMX01TS19NQVhdOwotCiAvKiBiZWFjb24gZmlsdGVyaW5nICovCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwogdm9pZApAQCAtMTM1Miw5ICsxNDA0LDYgQEAKIAlpd2xfbXZtX2VuYWJsZV90eHEobXZtLCBxdWV1ZSwgc3NuLCAmY2ZnLCB3ZGdfdGltZW91dCk7CiB9CiAKLS8qIEFzc29jIHN0YXR1cyAqLwotYm9vbCBpd2xfbXZtX2lzX2lkbGUoc3RydWN0IGl3bF9tdm0gKm12bSk7Ci0KIC8qIFRoZXJtYWwgbWFuYWdlbWVudCBhbmQgQ1Qta2lsbCAqLwogdm9pZCBpd2xfbXZtX3R0X3R4X2JhY2tvZmYoc3RydWN0IGl3bF9tdm0gKm12bSwgdTMyIGJhY2tvZmYpOwogdm9pZCBpd2xfbXZtX3R0X3RlbXBfY2hhbmdlZChzdHJ1Y3QgaXdsX212bSAqbXZtLCB1MzIgdGVtcCk7CkBAIC0xMzY3LDYgKzE0MTYsMjMgQEAKIHZvaWQgaXdsX212bV9zZXRfaHdfY3RraWxsX3N0YXRlKHN0cnVjdCBpd2xfbXZtICptdm0sIGJvb2wgc3RhdGUpOwogaW50IGl3bF9tdm1fZ2V0X3RlbXAoc3RydWN0IGl3bF9tdm0gKm12bSk7CiAKKy8qIExvY2F0aW9uIEF3YXJlIFJlZ3VsYXRvcnkgKi8KK3N0cnVjdCBpd2xfbWNjX3VwZGF0ZV9yZXNwICoKK2l3bF9tdm1fdXBkYXRlX21jYyhzdHJ1Y3QgaXdsX212bSAqbXZtLCBjb25zdCBjaGFyICphbHBoYTIsCisJCSAgIGVudW0gaXdsX21jY19zb3VyY2Ugc3JjX2lkKTsKK2ludCBpd2xfbXZtX2luaXRfbWNjKHN0cnVjdCBpd2xfbXZtICptdm0pOworaW50IGl3bF9tdm1fcnhfY2h1Yl91cGRhdGVfbWNjKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkgICAgICAgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIsCisJCQkgICAgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQpOworc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKml3bF9tdm1fZ2V0X3JlZ2RvbWFpbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkJICBjb25zdCBjaGFyICphbHBoYTIsCisJCQkJCQkgIGVudW0gaXdsX21jY19zb3VyY2Ugc3JjX2lkLAorCQkJCQkJICBib29sICpjaGFuZ2VkKTsKK3N0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICppd2xfbXZtX2dldF9jdXJyZW50X3JlZ2RvbWFpbihzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJCQkJCSAgYm9vbCAqY2hhbmdlZCk7CitpbnQgaXdsX212bV9pbml0X2Z3X3JlZ2Qoc3RydWN0IGl3bF9tdm0gKm12bSk7Cit2b2lkIGl3bF9tdm1fdXBkYXRlX2NoYW5nZWRfcmVnZG9tKHN0cnVjdCBpd2xfbXZtICptdm0pOworCiAvKiBzbWFydCBmaWZvICovCiBpbnQgaXdsX212bV9zZl91cGRhdGUoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJICAgICAgYm9vbCBhZGRlZF92aWYpOwpAQCAtMTQwNSw3ICsxNDcxLDY1IEBACiB2b2lkIGl3bF9tdm1fbmljX3Jlc3RhcnQoc3RydWN0IGl3bF9tdm0gKm12bSwgYm9vbCBmd19lcnJvcik7CiB2b2lkIGl3bF9tdm1fZndfZXJyb3JfZHVtcChzdHJ1Y3QgaXdsX212bSAqbXZtKTsKIAotaW50IGl3bF9tdm1fc3RhcnRfZndfZGJnX2NvbmYoc3RydWN0IGl3bF9tdm0gKm12bSwgZW51bSBpd2xfZndfZGJnX2NvbmYgaWQpOwotdm9pZCBpd2xfbXZtX2Z3X2RiZ19jb2xsZWN0KHN0cnVjdCBpd2xfbXZtICptdm0pOworaW50IGl3bF9tdm1fc3RhcnRfZndfZGJnX2NvbmYoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggaWQpOworaW50IGl3bF9tdm1fZndfZGJnX2NvbGxlY3Qoc3RydWN0IGl3bF9tdm0gKm12bSwgZW51bSBpd2xfZndfZGJnX3RyaWdnZXIgdHJpZywKKwkJCSAgIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGRlbGF5KTsKK2ludCBpd2xfbXZtX2Z3X2RiZ19jb2xsZWN0X2Rlc2Moc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQlzdHJ1Y3QgaXdsX212bV9kdW1wX2Rlc2MgKmRlc2MsCisJCQkJdW5zaWduZWQgaW50IGRlbGF5KTsKK3ZvaWQgaXdsX212bV9mcmVlX2Z3X2R1bXBfZGVzYyhzdHJ1Y3QgaXdsX212bSAqbXZtKTsKK2ludCBpd2xfbXZtX2Z3X2RiZ19jb2xsZWN0X3RyaWcoc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQlzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RsdiAqdHJpZ2dlciwKKwkJCQljb25zdCBjaGFyICpmbXQsIC4uLikgX19wcmludGYoMywgNCk7Cit1bnNpZ25lZCBpbnQgaXdsX212bV9nZXRfd2RfdGltZW91dChzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICBib29sIHRkbHMsIGJvb2wgY21kX3EpOwordm9pZCBpd2xfbXZtX2Nvbm5lY3Rpb25fbG9zcyhzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICBjb25zdCBjaGFyICplcnJtc2cpOworc3RhdGljIGlubGluZSBib29sCitpd2xfZndfZGJnX3RyaWdnZXJfdmlmX21hdGNoKHN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfdGx2ICp0cmlnLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXUzMiB0cmlnX3ZpZiA9IGxlMzJfdG9fY3B1KHRyaWctPnZpZl90eXBlKTsKKworCXJldHVybiB0cmlnX3ZpZiA9PSBJV0xfRldfREJHX0NPTkZfVklGX0FOWSB8fCB2aWYtPnR5cGUgPT0gdHJpZ192aWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbAoraXdsX2Z3X2RiZ190cmlnZ2VyX3N0b3BfY29uZl9tYXRjaChzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJCSAgIHN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfdGx2ICp0cmlnKQoreworCXJldHVybiAoKHRyaWctPm1vZGUgJiBJV0xfRldfREJHX1RSSUdHRVJfU1RPUCkgJiYKKwkJKG12bS0+ZndfZGJnX2NvbmYgPT0gRldfREJHX0lOVkFMSUQgfHwKKwkJKEJJVChtdm0tPmZ3X2RiZ19jb25mKSAmIGxlMzJfdG9fY3B1KHRyaWctPnN0b3BfY29uZl9pZHMpKSkpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2l3bF9md19kYmdfdHJpZ2dlcl9jaGVja19zdG9wKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgc3RydWN0IGl3bF9md19kYmdfdHJpZ2dlcl90bHYgKnRyaWcpCit7CisJaWYgKHZpZiAmJiAhaXdsX2Z3X2RiZ190cmlnZ2VyX3ZpZl9tYXRjaCh0cmlnLCB2aWYpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gaXdsX2Z3X2RiZ190cmlnZ2VyX3N0b3BfY29uZl9tYXRjaChtdm0sIHRyaWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2l3bF9md19kYmdfdHJpZ2dlcl9zaW1wbGVfc3RvcChzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICAgZW51bSBpd2xfZndfZGJnX3RyaWdnZXIgdHJpZykKK3sKKwlzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RsdiAqdHJpZ2dlcjsKKworCWlmICghaXdsX2Z3X2RiZ190cmlnZ2VyX2VuYWJsZWQobXZtLT5mdywgdHJpZykpCisJCXJldHVybjsKKworCXRyaWdnZXIgPSBpd2xfZndfZGJnX2dldF90cmlnZ2VyKG12bS0+ZncsIHRyaWcpOworCWlmICghaXdsX2Z3X2RiZ190cmlnZ2VyX2NoZWNrX3N0b3AobXZtLCB2aWYsIHRyaWdnZXIpKQorCQlyZXR1cm47CisKKwlpd2xfbXZtX2Z3X2RiZ19jb2xsZWN0X3RyaWcobXZtLCB0cmlnZ2VyLCBOVUxMKTsKK30KIAogI2VuZGlmIC8qIF9fSVdMX01WTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL252bS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbnZtLmMKaW5kZXggNTM4MzQyOS4uODdiMmEzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbnZtLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vbnZtLmMKQEAgLTYzLDE4ICs2MywyMSBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlICJpd2wtdHJhbnMuaCIKICNpbmNsdWRlICJpd2wtY3NyLmgiCiAjaW5jbHVkZSAibXZtLmgiCiAjaW5jbHVkZSAiaXdsLWVlcHJvbS1wYXJzZS5oIgogI2luY2x1ZGUgIml3bC1lZXByb20tcmVhZC5oIgogI2luY2x1ZGUgIml3bC1udm0tcGFyc2UuaCIKKyNpbmNsdWRlICJpd2wtcHJwaC5oIgogCiAvKiBEZWZhdWx0IE5WTSBzaXplIHRvIHJlYWQgKi8KICNkZWZpbmUgSVdMX05WTV9ERUZBVUxUX0NIVU5LX1NJWkUgKDIqMTAyNCkKICNkZWZpbmUgSVdMX01BWF9OVk1fU0VDVElPTl9TSVpFCTB4MWI1OAotI2RlZmluZSBJV0xfTUFYX05WTV84MDAwQV9TRUNUSU9OX1NJWkUJMHhmZmMKLSNkZWZpbmUgSVdMX01BWF9OVk1fODAwMEJfU0VDVElPTl9TSVpFCTB4MWZmYworI2RlZmluZSBJV0xfTUFYX05WTV84MDAwX1NFQ1RJT05fU0laRQkweDFmZmMKIAogI2RlZmluZSBOVk1fV1JJVEVfT1BDT0RFIDEKICNkZWZpbmUgTlZNX1JFQURfT1BDT0RFIDAKQEAgLTI2Miw3ICsyNjUsOSBAQAogaXdsX3BhcnNlX252bV9zZWN0aW9ucyhzdHJ1Y3QgaXdsX212bSAqbXZtKQogewogCXN0cnVjdCBpd2xfbnZtX3NlY3Rpb24gKnNlY3Rpb25zID0gbXZtLT5udm1fc2VjdGlvbnM7Ci0JY29uc3QgX19sZTE2ICpodywgKnN3LCAqY2FsaWIsICpyZWd1bGF0b3J5LCAqbWFjX292ZXJyaWRlOworCWNvbnN0IF9fbGUxNiAqaHcsICpzdywgKmNhbGliLCAqcmVndWxhdG9yeSwgKm1hY19vdmVycmlkZSwgKnBoeV9za3U7CisJYm9vbCBsYXJfZW5hYmxlZDsKKwl1MzIgbWFjX2FkZHIwLCBtYWNfYWRkcjE7CiAKIAkvKiBDaGVja2luZyBmb3IgcmVxdWlyZWQgc2VjdGlvbnMgKi8KIAlpZiAobXZtLT50cmFucy0+Y2ZnLT5kZXZpY2VfZmFtaWx5ICE9IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDApIHsKQEAgLTI4NiwyMiArMjkxLDM4IEBACiAJCQkJIkNhbid0IHBhcnNlIG1hY19hZGRyZXNzLCBlbXB0eSBzZWN0aW9uc1xuIik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQorCisJCS8qIFBIWV9TS1Ugc2VjdGlvbiBpcyBtYW5kYXRvcnkgaW4gQjAgKi8KKwkJaWYgKCFtdm0tPm52bV9zZWN0aW9uc1tOVk1fU0VDVElPTl9UWVBFX1BIWV9TS1VdLmRhdGEpIHsKKwkJCUlXTF9FUlIobXZtLAorCQkJCSJDYW4ndCBwYXJzZSBwaHlfc2t1IGluIEIwLCBlbXB0eSBzZWN0aW9uc1xuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQogCX0KIAogCWlmIChXQVJOX09OKCFtdm0tPmNmZykpCiAJCXJldHVybiBOVUxMOwogCisJLyogcmVhZCB0aGUgbWFjIGFkZHJlc3MgZnJvbSBXRk1QIHJlZ2lzdGVycyAqLworCW1hY19hZGRyMCA9IGl3bF90cmFuc19yZWFkX3BycGgobXZtLT50cmFucywgV0ZNUF9NQUNfQUREUl8wKTsKKwltYWNfYWRkcjEgPSBpd2xfdHJhbnNfcmVhZF9wcnBoKG12bS0+dHJhbnMsIFdGTVBfTUFDX0FERFJfMSk7CisKIAlodyA9IChjb25zdCBfX2xlMTYgKilzZWN0aW9uc1ttdm0tPmNmZy0+bnZtX2h3X3NlY3Rpb25fbnVtXS5kYXRhOwogCXN3ID0gKGNvbnN0IF9fbGUxNiAqKXNlY3Rpb25zW05WTV9TRUNUSU9OX1RZUEVfU1ddLmRhdGE7CiAJY2FsaWIgPSAoY29uc3QgX19sZTE2ICopc2VjdGlvbnNbTlZNX1NFQ1RJT05fVFlQRV9DQUxJQlJBVElPTl0uZGF0YTsKIAlyZWd1bGF0b3J5ID0gKGNvbnN0IF9fbGUxNiAqKXNlY3Rpb25zW05WTV9TRUNUSU9OX1RZUEVfUkVHVUxBVE9SWV0uZGF0YTsKIAltYWNfb3ZlcnJpZGUgPQogCQkoY29uc3QgX19sZTE2ICopc2VjdGlvbnNbTlZNX1NFQ1RJT05fVFlQRV9NQUNfT1ZFUlJJREVdLmRhdGE7CisJcGh5X3NrdSA9IChjb25zdCBfX2xlMTYgKilzZWN0aW9uc1tOVk1fU0VDVElPTl9UWVBFX1BIWV9TS1VdLmRhdGE7CisKKwlsYXJfZW5hYmxlZCA9ICFpd2x3aWZpX21vZF9wYXJhbXMubGFyX2Rpc2FibGUgJiYKKwkJICAgICAgKG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmCisJCSAgICAgICBJV0xfVUNPREVfVExWX0NBUEFfTEFSX1NVUFBPUlQpOwogCiAJcmV0dXJuIGl3bF9wYXJzZV9udm1fZGF0YShtdm0tPnRyYW5zLT5kZXYsIG12bS0+Y2ZnLCBodywgc3csIGNhbGliLAotCQkJCSAgcmVndWxhdG9yeSwgbWFjX292ZXJyaWRlLAotCQkJCSAgbXZtLT5mdy0+dmFsaWRfdHhfYW50LAotCQkJCSAgbXZtLT5mdy0+dmFsaWRfcnhfYW50KTsKKwkJCQkgIHJlZ3VsYXRvcnksIG1hY19vdmVycmlkZSwgcGh5X3NrdSwKKwkJCQkgIG12bS0+ZnctPnZhbGlkX3R4X2FudCwgbXZtLT5mdy0+dmFsaWRfcnhfYW50LAorCQkJCSAgbGFyX2VuYWJsZWQsIG1hY19hZGRyMCwgbWFjX2FkZHIxKTsKIH0KIAogI2RlZmluZSBNQVhfTlZNX0ZJTEVfTEVOCTE2Mzg0CkBAIC0zNTQsMTAgKzM3NSw4IEBACiAJLyogTWF4aW1hbCBzaXplIGRlcGVuZHMgb24gSFcgZmFtaWx5IGFuZCBzdGVwICovCiAJaWYgKG12bS0+dHJhbnMtPmNmZy0+ZGV2aWNlX2ZhbWlseSAhPSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKQogCQltYXhfc2VjdGlvbl9zaXplID0gSVdMX01BWF9OVk1fU0VDVElPTl9TSVpFOwotCWVsc2UgaWYgKENTUl9IV19SRVZfU1RFUChtdm0tPnRyYW5zLT5od19yZXYpID09IFNJTElDT05fQV9TVEVQKQotCQltYXhfc2VjdGlvbl9zaXplID0gSVdMX01BWF9OVk1fODAwMEFfU0VDVElPTl9TSVpFOwotCWVsc2UgLyogRmFtaWx5IDgwMDAgQi1zdGVwIG9yIEMtc3RlcCAqLwotCQltYXhfc2VjdGlvbl9zaXplID0gSVdMX01BWF9OVk1fODAwMEJfU0VDVElPTl9TSVpFOworCWVsc2UKKwkJbWF4X3NlY3Rpb25fc2l6ZSA9IElXTF9NQVhfTlZNXzgwMDBfU0VDVElPTl9TSVpFOwogCiAJLyoKIAkgKiBPYnRhaW4gTlZNIGltYWdlIHZpYSByZXF1ZXN0X2Zpcm13YXJlLiBTaW5jZSB3ZSBhbHJlYWR5IHVzZWQKQEAgLTM5OSw2ICs0MTgsMTUgQEAKIAkJSVdMX0lORk8obXZtLCAiTlZNIFZlcnNpb24gJTA4WFxuIiwgbGUzMl90b19jcHUoZHdvcmRfYnVmZlsyXSkpOwogCQlJV0xfSU5GTyhtdm0sICJOVk0gTWFudWZhY3R1cmluZyBkYXRlICUwOFhcbiIsCiAJCQkgbGUzMl90b19jcHUoZHdvcmRfYnVmZlszXSkpOworCisJCS8qIG52bSBmaWxlIHZhbGlkYXRpb24sIGR3b3JkX2J1ZmZbMl0gaG9sZHMgdGhlIGZpbGUgdmVyc2lvbiAqLworCQlpZiAoKENTUl9IV19SRVZfU1RFUChtdm0tPnRyYW5zLT5od19yZXYpID09IFNJTElDT05fQ19TVEVQICYmCisJCSAgICAgbGUzMl90b19jcHUoZHdvcmRfYnVmZlsyXSkgPCAweEU0QSkgfHwKKwkJICAgIChDU1JfSFdfUkVWX1NURVAobXZtLT50cmFucy0+aHdfcmV2KSA9PSBTSUxJQ09OX0JfU1RFUCAmJgorCQkgICAgIGxlMzJfdG9fY3B1KGR3b3JkX2J1ZmZbMl0pID49IDB4RTRBKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CiAJfSBlbHNlIHsKIAkJZmlsZV9zZWMgPSAodm9pZCAqKWZ3X2VudHJ5LT5kYXRhOwogCX0KQEAgLTQ5Nyw2ICs1MjUsOCBAQAogCWludCByZXQsIHNlY3Rpb247CiAJdTMyIHNpemVfcmVhZCA9IDA7CiAJdTggKm52bV9idWZmZXIsICp0ZW1wOworCWNvbnN0IGNoYXIgKm52bV9maWxlX0IgPSBtdm0tPmNmZy0+ZGVmYXVsdF9udm1fZmlsZV9CX3N0ZXA7CisJY29uc3QgY2hhciAqbnZtX2ZpbGVfQyA9IG12bS0+Y2ZnLT5kZWZhdWx0X252bV9maWxlX0Nfc3RlcDsKIAogCWlmIChXQVJOX09OX09OQ0UobXZtLT5jZmctPm52bV9od19zZWN0aW9uX251bSA+PSBOVk1fTUFYX05VTV9TRUNUSU9OUykpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTU1LDEwICs1ODUsMjcgQEAKIAogCS8qIGxvYWQgZXh0ZXJuYWwgTlZNIGlmIGNvbmZpZ3VyZWQgKi8KIAlpZiAobXZtLT5udm1fZmlsZV9uYW1lKSB7Ci0JCS8qIG1vdmUgdG8gRXh0ZXJuYWwgTlZNIGZsb3cgKi8KKwkJLyogcmVhZCBFeHRlcm5hbCBOVk0gZmlsZSAtIHRha2UgdGhlIGRlZmF1bHQgKi8KIAkJcmV0ID0gaXdsX212bV9yZWFkX2V4dGVybmFsX252bShtdm0pOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKKwkJaWYgKHJldCkgeworCQkJLyogY2hvb3NlIHRoZSBudm1fZmlsZSBuYW1lIGFjY29yZGluZyB0byB0aGUKKwkJCSAqIEhXIHN0ZXAKKwkJCSAqLworCQkJaWYgKENTUl9IV19SRVZfU1RFUChtdm0tPnRyYW5zLT5od19yZXYpID09CisJCQkgICAgU0lMSUNPTl9CX1NURVApCisJCQkJbXZtLT5udm1fZmlsZV9uYW1lID0gbnZtX2ZpbGVfQjsKKwkJCWVsc2UKKwkJCQltdm0tPm52bV9maWxlX25hbWUgPSBudm1fZmlsZV9DOworCisJCQlpZiAocmV0ID09IC1FRkFVTFQgJiYgbXZtLT5udm1fZmlsZV9uYW1lKSB7CisJCQkJLyogaW4gY2FzZSBudm0gZmlsZSB3YXMgZmFpbGVkIHRyeSBhZ2FpbiAqLworCQkJCXJldCA9IGl3bF9tdm1fcmVhZF9leHRlcm5hbF9udm0obXZtKTsKKwkJCQlpZiAocmV0KQorCQkJCQlyZXR1cm4gcmV0OworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CiAJfQogCiAJLyogcGFyc2UgdGhlIHJlbGV2YW50IG52bSBzZWN0aW9ucyAqLwpAQCAtNTcwLDMgKzYxNywyNTcgQEAKIAogCXJldHVybiAwOwogfQorCitzdHJ1Y3QgaXdsX21jY191cGRhdGVfcmVzcCAqCitpd2xfbXZtX3VwZGF0ZV9tY2Moc3RydWN0IGl3bF9tdm0gKm12bSwgY29uc3QgY2hhciAqYWxwaGEyLAorCQkgICBlbnVtIGl3bF9tY2Nfc291cmNlIHNyY19pZCkKK3sKKwlzdHJ1Y3QgaXdsX21jY191cGRhdGVfY21kIG1jY191cGRhdGVfY21kID0geworCQkubWNjID0gY3B1X3RvX2xlMTYoYWxwaGEyWzBdIDw8IDggfCBhbHBoYTJbMV0pLAorCQkuc291cmNlX2lkID0gKHU4KXNyY19pZCwKKwl9OworCXN0cnVjdCBpd2xfbWNjX3VwZGF0ZV9yZXNwICptY2NfcmVzcCwgKnJlc3BfY3AgPSBOVUxMOworCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3Q7CisJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IE1DQ19VUERBVEVfQ01ELAorCQkuZmxhZ3MgPSBDTURfV0FOVF9TS0IsCisJCS5kYXRhID0geyAmbWNjX3VwZGF0ZV9jbWQgfSwKKwl9OworCisJaW50IHJldDsKKwl1MzIgc3RhdHVzOworCWludCByZXNwX2xlbiwgbl9jaGFubmVsczsKKwl1MTYgbWNjOworCisJaWYgKFdBUk5fT05fT05DRSghaXdsX212bV9pc19sYXJfc3VwcG9ydGVkKG12bSkpKQorCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisKKwljbWQubGVuWzBdID0gc2l6ZW9mKHN0cnVjdCBpd2xfbWNjX3VwZGF0ZV9jbWQpOworCisJSVdMX0RFQlVHX0xBUihtdm0sICJzZW5kIE1DQyB1cGRhdGUgdG8gRlcgd2l0aCAnJWMlYycgc3JjID0gJWRcbiIsCisJCSAgICAgIGFscGhhMlswXSwgYWxwaGEyWzFdLCBzcmNfaWQpOworCisJcmV0ID0gaXdsX212bV9zZW5kX2NtZChtdm0sICZjbWQpOworCWlmIChyZXQpCisJCXJldHVybiBFUlJfUFRSKHJldCk7CisKKwlwa3QgPSBjbWQucmVzcF9wa3Q7CisJaWYgKHBrdC0+aGRyLmZsYWdzICYgSVdMX0NNRF9GQUlMRURfTVNLKSB7CisJCUlXTF9FUlIobXZtLCAiQmFkIHJldHVybiBmcm9tIE1DQ19VUERBVEVfQ09NTUFORCAoMHglMDhYKVxuIiwKKwkJCXBrdC0+aGRyLmZsYWdzKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBleGl0OworCX0KKworCS8qIEV4dHJhY3QgTUNDIHJlc3BvbnNlICovCisJbWNjX3Jlc3AgPSAodm9pZCAqKXBrdC0+ZGF0YTsKKwlzdGF0dXMgPSBsZTMyX3RvX2NwdShtY2NfcmVzcC0+c3RhdHVzKTsKKworCW1jYyA9IGxlMTZfdG9fY3B1KG1jY19yZXNwLT5tY2MpOworCisJLyogVy9BIGZvciBhIEZXL05WTSBpc3N1ZSAtIHJldHVybnMgMHgwMCBmb3IgdGhlIHdvcmxkIGRvbWFpbiAqLworCWlmIChtY2MgPT0gMCkgeworCQltY2MgPSAweDMwMzA7ICAvKiAiMDAiIC0gd29ybGQgKi8KKwkJbWNjX3Jlc3AtPm1jYyA9IGNwdV90b19sZTE2KG1jYyk7CisJfQorCisJbl9jaGFubmVscyA9ICBfX2xlMzJfdG9fY3B1KG1jY19yZXNwLT5uX2NoYW5uZWxzKTsKKwlJV0xfREVCVUdfTEFSKG12bSwKKwkJICAgICAgIk1DQyByZXNwb25zZSBzdGF0dXM6IDB4JXguIG5ldyBNQ0M6IDB4JXggKCclYyVjJykgY2hhbmdlOiAlZCBuX2NoYW5zOiAlZFxuIiwKKwkJICAgICAgc3RhdHVzLCBtY2MsIG1jYyA+PiA4LCBtY2MgJiAweGZmLAorCQkgICAgICAhIShzdGF0dXMgPT0gTUNDX1JFU1BfTkVXX0NIQU5fUFJPRklMRSksIG5fY2hhbm5lbHMpOworCisJcmVzcF9sZW4gPSBzaXplb2YoKm1jY19yZXNwKSArIG5fY2hhbm5lbHMgKiBzaXplb2YoX19sZTMyKTsKKwlyZXNwX2NwID0ga21lbWR1cChtY2NfcmVzcCwgcmVzcF9sZW4sIEdGUF9LRVJORUwpOworCWlmICghcmVzcF9jcCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJcmV0ID0gMDsKK2V4aXQ6CisJaXdsX2ZyZWVfcmVzcCgmY21kKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCXJldHVybiByZXNwX2NwOworfQorCisjaWZkZWYgQ09ORklHX0FDUEkKKyNkZWZpbmUgV1JEX01FVEhPRAkJIldSREQiCisjZGVmaW5lIFdSRERfV0lGSQkJKDB4MDcpCisjZGVmaW5lIFdSRERfV0lHSUcJCSgweDEwKQorCitzdGF0aWMgdTMyIGl3bF9tdm1fd3JkZF9nZXRfbWNjKHN0cnVjdCBpd2xfbXZtICptdm0sIHVuaW9uIGFjcGlfb2JqZWN0ICp3cmRkKQoreworCXVuaW9uIGFjcGlfb2JqZWN0ICptY2NfcGtnLCAqZG9tYWluX3R5cGUsICptY2NfdmFsdWU7CisJdTMyIGk7CisKKwlpZiAod3JkZC0+dHlwZSAhPSBBQ1BJX1RZUEVfUEFDS0FHRSB8fAorCSAgICB3cmRkLT5wYWNrYWdlLmNvdW50IDwgMiB8fAorCSAgICB3cmRkLT5wYWNrYWdlLmVsZW1lbnRzWzBdLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIgfHwKKwkgICAgd3JkZC0+cGFja2FnZS5lbGVtZW50c1swXS5pbnRlZ2VyLnZhbHVlICE9IDApIHsKKwkJSVdMX0RFQlVHX0xBUihtdm0sICJVbnN1cHBvcnRlZCB3cmRkIHN0cnVjdHVyZVxuIik7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDEgOyBpIDwgd3JkZC0+cGFja2FnZS5jb3VudCA7ICsraSkgeworCQltY2NfcGtnID0gJndyZGQtPnBhY2thZ2UuZWxlbWVudHNbaV07CisKKwkJaWYgKG1jY19wa2ctPnR5cGUgIT0gQUNQSV9UWVBFX1BBQ0tBR0UgfHwKKwkJICAgIG1jY19wa2ctPnBhY2thZ2UuY291bnQgPCAyIHx8CisJCSAgICBtY2NfcGtnLT5wYWNrYWdlLmVsZW1lbnRzWzBdLnR5cGUgIT0gQUNQSV9UWVBFX0lOVEVHRVIgfHwKKwkJICAgIG1jY19wa2ctPnBhY2thZ2UuZWxlbWVudHNbMV0udHlwZSAhPSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQkJbWNjX3BrZyA9IE5VTEw7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRvbWFpbl90eXBlID0gJm1jY19wa2ctPnBhY2thZ2UuZWxlbWVudHNbMF07CisJCWlmIChkb21haW5fdHlwZS0+aW50ZWdlci52YWx1ZSA9PSBXUkREX1dJRkkpCisJCQlicmVhazsKKworCQltY2NfcGtnID0gTlVMTDsKKwl9CisKKwlpZiAobWNjX3BrZykgeworCQltY2NfdmFsdWUgPSAmbWNjX3BrZy0+cGFja2FnZS5lbGVtZW50c1sxXTsKKwkJcmV0dXJuIG1jY192YWx1ZS0+aW50ZWdlci52YWx1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd2xfbXZtX2dldF9iaW9zX21jYyhzdHJ1Y3QgaXdsX212bSAqbXZtLCBjaGFyICptY2MpCit7CisJYWNwaV9oYW5kbGUgcm9vdF9oYW5kbGU7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBhY3BpX2J1ZmZlciB3cmRkID0ge0FDUElfQUxMT0NBVEVfQlVGRkVSLCBOVUxMfTsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisJdTMyIG1jY192YWw7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KG12bS0+ZGV2KTsKKworCXJvb3RfaGFuZGxlID0gQUNQSV9IQU5ETEUoJnBkZXYtPmRldik7CisJaWYgKCFyb290X2hhbmRsZSkgeworCQlJV0xfREVCVUdfTEFSKG12bSwKKwkJCSAgICAgICJDb3VsZCBub3QgcmV0cmlldmUgcm9vdCBwb3J0IEFDUEkgaGFuZGxlXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJLyogR2V0IHRoZSBtZXRob2QncyBoYW5kbGUgKi8KKwlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUocm9vdF9oYW5kbGUsIChhY3BpX3N0cmluZylXUkRfTUVUSE9ELCAmaGFuZGxlKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJSVdMX0RFQlVHX0xBUihtdm0sICJXUkQgbWV0aG9kIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCS8qIENhbGwgV1JERCB3aXRoIG5vIGFyZ3VtZW50cyAqLworCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgTlVMTCwgTlVMTCwgJndyZGQpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkgeworCQlJV0xfREVCVUdfTEFSKG12bSwgIldSREMgaW52b2NhdGlvbiBmYWlsZWQgKDB4JXgpXG4iLCBzdGF0dXMpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwltY2NfdmFsID0gaXdsX212bV93cmRkX2dldF9tY2MobXZtLCB3cmRkLnBvaW50ZXIpOworCWtmcmVlKHdyZGQucG9pbnRlcik7CisJaWYgKCFtY2NfdmFsKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCW1jY1swXSA9IChtY2NfdmFsID4+IDgpICYgMHhmZjsKKwltY2NbMV0gPSBtY2NfdmFsICYgMHhmZjsKKwltY2NbMl0gPSAnXDAnOworCXJldHVybiAwOworfQorI2Vsc2UgLyogQ09ORklHX0FDUEkgKi8KK3N0YXRpYyBpbnQgaXdsX212bV9nZXRfYmlvc19tY2Moc3RydWN0IGl3bF9tdm0gKm12bSwgY2hhciAqbWNjKQoreworCXJldHVybiAtRU5PRU5UOworfQorI2VuZGlmCisKK2ludCBpd2xfbXZtX2luaXRfbWNjKHN0cnVjdCBpd2xfbXZtICptdm0pCit7CisJYm9vbCB0bHZfbGFyOworCWJvb2wgbnZtX2xhcjsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpyZWdkOworCWNoYXIgbWNjWzNdOworCisJaWYgKG12bS0+Y2ZnLT5kZXZpY2VfZmFtaWx5ID09IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDApIHsKKwkJdGx2X2xhciA9IG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmCisJCQlJV0xfVUNPREVfVExWX0NBUEFfTEFSX1NVUFBPUlQ7CisJCW52bV9sYXIgPSBtdm0tPm52bV9kYXRhLT5sYXJfZW5hYmxlZDsKKwkJaWYgKHRsdl9sYXIgIT0gbnZtX2xhcikKKwkJCUlXTF9JTkZPKG12bSwKKwkJCQkgIkNvbmZsaWN0IGJldHdlZW4gVExWICYgTlZNIHJlZ2FyZGluZyBlbmFibGluZyBMQVIgKFRMViA9ICVzIE5WTSA9JXMpXG4iLAorCQkJCSB0bHZfbGFyID8gImVuYWJsZWQiIDogImRpc2FibGVkIiwKKwkJCQkgbnZtX2xhciA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCX0KKworCWlmICghaXdsX212bV9pc19sYXJfc3VwcG9ydGVkKG12bSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiB0cnkgdG8gcmVwbGF5IHRoZSBsYXN0IHNldCBNQ0MgdG8gRlcuIElmIGl0IGRvZXNuJ3QgZXhpc3QsCisJICogcXVldWUgYW4gdXBkYXRlIHRvIGNmZzgwMjExIHRvIHJldHJpZXZlIHRoZSBkZWZhdWx0IGFscGhhMiBmcm9tIEZXLgorCSAqLworCXJldHZhbCA9IGl3bF9tdm1faW5pdF9md19yZWdkKG12bSk7CisJaWYgKHJldHZhbCAhPSAtRU5PRU5UKQorCQlyZXR1cm4gcmV0dmFsOworCisJLyoKKwkgKiBEcml2ZXIgcmVndWxhdG9yeSBoaW50IGZvciBpbml0aWFsIHVwZGF0ZSwgdGhpcyBhbHNvIGluZm9ybXMgdGhlCisJICogZmlybXdhcmUgd2Ugc3VwcG9ydCB3aWZpIGxvY2F0aW9uIHVwZGF0ZXMuCisJICogRGlzYWxsb3cgc2NhbnMgdGhhdCBtaWdodCBjcmFzaCB0aGUgRlcgd2hpbGUgdGhlIExBUiByZWdkb21haW4KKwkgKiBpcyBub3Qgc2V0LgorCSAqLworCW12bS0+bGFyX3JlZ2RvbV9zZXQgPSBmYWxzZTsKKworCXJlZ2QgPSBpd2xfbXZtX2dldF9jdXJyZW50X3JlZ2RvbWFpbihtdm0sIE5VTEwpOworCWlmIChJU19FUlJfT1JfTlVMTChyZWdkKSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoaXdsX212bV9pc193aWZpX21jY19zdXBwb3J0ZWQobXZtKSAmJgorCSAgICAhaXdsX212bV9nZXRfYmlvc19tY2MobXZtLCBtY2MpKSB7CisJCWtmcmVlKHJlZ2QpOworCQlyZWdkID0gaXdsX212bV9nZXRfcmVnZG9tYWluKG12bS0+aHctPndpcGh5LCBtY2MsCisJCQkJCSAgICAgTUNDX1NPVVJDRV9CSU9TLCBOVUxMKTsKKwkJaWYgKElTX0VSUl9PUl9OVUxMKHJlZ2QpKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dmFsID0gcmVndWxhdG9yeV9zZXRfd2lwaHlfcmVnZF9zeW5jX3J0bmwobXZtLT5ody0+d2lwaHksIHJlZ2QpOworCWtmcmVlKHJlZ2QpOworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBpd2xfbXZtX3J4X2NodWJfdXBkYXRlX21jYyhzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJICAgICAgIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiLAorCQkJICAgICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKQoreworCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpd2xfbWNjX2NodWJfbm90aWYgKm5vdGlmID0gKHZvaWQgKilwa3QtPmRhdGE7CisJZW51bSBpd2xfbWNjX3NvdXJjZSBzcmM7CisJY2hhciBtY2NbM107CisJc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJlZ2Q7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKKworCWlmIChXQVJOX09OX09OQ0UoIWl3bF9tdm1faXNfbGFyX3N1cHBvcnRlZChtdm0pKSkKKwkJcmV0dXJuIDA7CisKKwltY2NbMF0gPSBub3RpZi0+bWNjID4+IDg7CisJbWNjWzFdID0gbm90aWYtPm1jYyAmIDB4ZmY7CisJbWNjWzJdID0gJ1wwJzsKKwlzcmMgPSBub3RpZi0+c291cmNlX2lkOworCisJSVdMX0RFQlVHX0xBUihtdm0sCisJCSAgICAgICJSWDogcmVjZWl2ZWQgY2h1YiB1cGRhdGUgbWNjIGNtZCAobWNjICclcycgc3JjICVkKVxuIiwKKwkJICAgICAgbWNjLCBzcmMpOworCXJlZ2QgPSBpd2xfbXZtX2dldF9yZWdkb21haW4obXZtLT5ody0+d2lwaHksIG1jYywgc3JjLCBOVUxMKTsKKwlpZiAoSVNfRVJSX09SX05VTEwocmVnZCkpCisJCXJldHVybiAwOworCisJcmVndWxhdG9yeV9zZXRfd2lwaHlfcmVnZChtdm0tPmh3LT53aXBoeSwgcmVnZCk7CisJa2ZyZWUocmVnZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL29wcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vb3BzLmMKaW5kZXggMmRmZmMzNi4uYTA4YjAzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vb3BzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vb3BzLmMKQEAgLTgyLDcgKzgyLDYgQEAKICNpbmNsdWRlICJycy5oIgogI2luY2x1ZGUgImZ3LWFwaS1zY2FuLmgiCiAjaW5jbHVkZSAidGltZS1ldmVudC5oIgotI2luY2x1ZGUgIml3bC1mdy1lcnJvci1kdW1wLmgiCiAKICNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCSJUaGUgbmV3IEludGVsKFIpIHdpcmVsZXNzIEFHTiBkcml2ZXIgZm9yIExpbnV4IgogTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7CkBAIC0yMzQsMTEgKzIzMywxMCBAQAogCQkgICBpd2xfbXZtX3J4X2FudF9jb3VwbGluZ19ub3RpZiwgdHJ1ZSksCiAKIAlSWF9IQU5ETEVSKFRJTUVfRVZFTlRfTk9USUZJQ0FUSU9OLCBpd2xfbXZtX3J4X3RpbWVfZXZlbnRfbm90aWYsIGZhbHNlKSwKKwlSWF9IQU5ETEVSKE1DQ19DSFVCX1VQREFURV9DTUQsIGl3bF9tdm1fcnhfY2h1Yl91cGRhdGVfbWNjLCB0cnVlKSwKIAogCVJYX0hBTkRMRVIoRU9TUF9OT1RJRklDQVRJT04sIGl3bF9tdm1fcnhfZW9zcF9ub3RpZiwgZmFsc2UpLAogCi0JUlhfSEFORExFUihTQ0FOX1JFUVVFU1RfQ01ELCBpd2xfbXZtX3J4X3NjYW5fcmVzcG9uc2UsIGZhbHNlKSwKLQlSWF9IQU5ETEVSKFNDQU5fQ09NUExFVEVfTk9USUZJQ0FUSU9OLCBpd2xfbXZtX3J4X3NjYW5fY29tcGxldGUsIHRydWUpLAogCVJYX0hBTkRMRVIoU0NBTl9JVEVSQVRJT05fQ09NUExFVEUsCiAJCSAgIGl3bF9tdm1fcnhfc2Nhbl9vZmZsb2FkX2l0ZXJfY29tcGxldGVfbm90aWYsIGZhbHNlKSwKIAlSWF9IQU5ETEVSKFNDQU5fT0ZGTE9BRF9DT01QTEVURSwKQEAgLTMxMSw2ICszMDksNyBAQAogCUNNRChSRVBMWV9SWF9NUERVX0NNRCksCiAJQ01EKEJFQUNPTl9OT1RJRklDQVRJT04pLAogCUNNRChCRUFDT05fVEVNUExBVEVfQ01EKSwKKwlDTUQoU1RBVElTVElDU19DTUQpLAogCUNNRChTVEFUSVNUSUNTX05PVElGSUNBVElPTiksCiAJQ01EKEVPU1BfTk9USUZJQ0FUSU9OKSwKIAlDTUQoUkVEVUNFX1RYX1BPV0VSX0NNRCksCkBAIC0zNTksNiArMzU4LDcgQEAKIAlDTUQoVERMU19DSEFOTkVMX1NXSVRDSF9DTUQpLAogCUNNRChURExTX0NIQU5ORUxfU1dJVENIX05PVElGSUNBVElPTiksCiAJQ01EKFRETFNfQ09ORklHX0NNRCksCisJQ01EKE1DQ19VUERBVEVfQ01EKSwKIH07CiAjdW5kZWYgQ01ECiAKQEAgLTQ1Niw3ICs0NTYsNyBAQAogCUlOSVRfV09SSygmbXZtLT5yb2NfZG9uZV93aywgaXdsX212bV9yb2NfZG9uZV93ayk7CiAJSU5JVF9XT1JLKCZtdm0tPnN0YV9kcmFpbmVkX3drLCBpd2xfbXZtX3N0YV9kcmFpbmVkX3drKTsKIAlJTklUX1dPUksoJm12bS0+ZDBpM19leGl0X3dvcmssIGl3bF9tdm1fZDBpM19leGl0X3dvcmspOwotCUlOSVRfV09SSygmbXZtLT5md19lcnJvcl9kdW1wX3drLCBpd2xfbXZtX2Z3X2Vycm9yX2R1bXBfd2spOworCUlOSVRfREVMQVlFRF9XT1JLKCZtdm0tPmZ3X2R1bXBfd2ssIGl3bF9tdm1fZndfZXJyb3JfZHVtcF93ayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJm12bS0+dGRsc19jcy5kd29yaywgaXdsX212bV90ZGxzX2NoX3N3aXRjaF93b3JrKTsKIAogCXNwaW5fbG9ja19pbml0KCZtdm0tPmQwaTNfdHhfbG9jayk7CkBAIC00ODgsOCArNDg4LDcgQEAKIAogCS8qIFNldCBhIHNob3J0IHdhdGNoZG9nIGZvciB0aGUgY29tbWFuZCBxdWV1ZSAqLwogCXRyYW5zX2NmZy5jbWRfcV93ZGdfdGltZW91dCA9Ci0JCWl3bG12bV9tb2RfcGFyYW1zLnRmZF9xX2hhbmdfZGV0ZWN0ID8gSVdMX0RFRl9XRF9USU1FT1VUIDoKLQkJCQkJCSAgICAgIElXTF9XQVRDSERPR19ESVNBQkxFRDsKKwkJaXdsX212bV9nZXRfd2RfdGltZW91dChtdm0sIE5VTEwsIGZhbHNlLCB0cnVlKTsKIAogCXNucHJpbnRmKG12bS0+aHctPndpcGh5LT5md192ZXJzaW9uLAogCQkgc2l6ZW9mKG12bS0+aHctPndpcGh5LT5md192ZXJzaW9uKSwKQEAgLTUwNCw2ICs1MDMsNyBAQAogCXRyYW5zLT5kYmdfZGVzdF9yZWdfbnVtID0gbXZtLT5mdy0+ZGJnX2Rlc3RfcmVnX251bTsKIAltZW1jcHkodHJhbnMtPmRiZ19jb25mX3RsdiwgbXZtLT5mdy0+ZGJnX2NvbmZfdGx2LAogCSAgICAgICBzaXplb2YodHJhbnMtPmRiZ19jb25mX3RsdikpOworCXRyYW5zLT5kYmdfdHJpZ2dlcl90bHYgPSBtdm0tPmZ3LT5kYmdfdHJpZ2dlcl90bHY7CiAKIAkvKiBzZXQgdXAgbm90aWZpY2F0aW9uIHdhaXQgc3VwcG9ydCAqLwogCWl3bF9ub3RpZmljYXRpb25fd2FpdF9pbml0KCZtdm0tPm5vdGlmX3dhaXQpOwpAQCAtNTIzLDEyICs1MjMsMTEgQEAKIAkvKiBzZXQgdGhlIG52bV9maWxlX25hbWUgYWNjb3JkaW5nIHRvIHByaW9yaXR5ICovCiAJaWYgKGl3bHdpZmlfbW9kX3BhcmFtcy5udm1fZmlsZSkgewogCQltdm0tPm52bV9maWxlX25hbWUgPSBpd2x3aWZpX21vZF9wYXJhbXMubnZtX2ZpbGU7Ci0JfSBlbHNlIHsKLQkJaWYgKCh0cmFucy0+Y2ZnLT5kZXZpY2VfZmFtaWx5ID09IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDApICYmCi0JCSAgICAoQ1NSX0hXX1JFVl9TVEVQKHRyYW5zLT5od19yZXYpID09IFNJTElDT05fQV9TVEVQKSkKLQkJCW12bS0+bnZtX2ZpbGVfbmFtZSA9IG12bS0+Y2ZnLT5kZWZhdWx0X252bV9maWxlXzgwMDBBOworCX0gZWxzZSBpZiAodHJhbnMtPmNmZy0+ZGV2aWNlX2ZhbWlseSA9PSBJV0xfREVWSUNFX0ZBTUlMWV84MDAwKSB7CisJCWlmIChDU1JfSFdfUkVWX1NURVAodHJhbnMtPmh3X3JldikgPT0gU0lMSUNPTl9CX1NURVApCisJCQltdm0tPm52bV9maWxlX25hbWUgPSBtdm0tPmNmZy0+ZGVmYXVsdF9udm1fZmlsZV9CX3N0ZXA7CiAJCWVsc2UKLQkJCW12bS0+bnZtX2ZpbGVfbmFtZSA9IG12bS0+Y2ZnLT5kZWZhdWx0X252bV9maWxlOworCQkJbXZtLT5udm1fZmlsZV9uYW1lID0gbXZtLT5jZmctPmRlZmF1bHRfbnZtX2ZpbGVfQ19zdGVwOwogCX0KIAogCWlmIChXQVJOKGNmZy0+bm9fcG93ZXJfdXBfbmljX2luX2luaXQgJiYgIW12bS0+bnZtX2ZpbGVfbmFtZSwKQEAgLTY4NSw2ICs2ODQsMzcgQEAKIAltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgaXdsX212bV9yeF9jaGVja190cmlnZ2VyKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJCSAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KQoreworCXN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfdGx2ICp0cmlnOworCXN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfY21kICpjbWRzX3RyaWc7CisJaW50IGk7CisKKwlpZiAoIWl3bF9md19kYmdfdHJpZ2dlcl9lbmFibGVkKG12bS0+ZncsIEZXX0RCR19UUklHR0VSX0ZXX05PVElGKSkKKwkJcmV0dXJuOworCisJdHJpZyA9IGl3bF9md19kYmdfZ2V0X3RyaWdnZXIobXZtLT5mdywgRldfREJHX1RSSUdHRVJfRldfTk9USUYpOworCWNtZHNfdHJpZyA9ICh2b2lkICopdHJpZy0+ZGF0YTsKKworCWlmICghaXdsX2Z3X2RiZ190cmlnZ2VyX2NoZWNrX3N0b3AobXZtLCBOVUxMLCB0cmlnKSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY21kc190cmlnLT5jbWRzKTsgaSsrKSB7CisJCS8qIGRvbid0IGNvbGxlY3Qgb24gQ01EIDAgKi8KKwkJaWYgKCFjbWRzX3RyaWctPmNtZHNbaV0uY21kX2lkKQorCQkJYnJlYWs7CisKKwkJaWYgKGNtZHNfdHJpZy0+Y21kc1tpXS5jbWRfaWQgIT0gcGt0LT5oZHIuY21kKQorCQkJY29udGludWU7CisKKwkJaXdsX212bV9md19kYmdfY29sbGVjdF90cmlnKG12bSwgdHJpZywKKwkJCQkJICAgICJDTUQgMHglMDJ4IHJlY2VpdmVkIiwKKwkJCQkJICAgIHBrdC0+aGRyLmNtZCk7CisJCWJyZWFrOworCX0KK30KKwogc3RhdGljIGludCBpd2xfbXZtX3J4X2Rpc3BhdGNoKHN0cnVjdCBpd2xfb3BfbW9kZSAqb3BfbW9kZSwKIAkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4X2NtZF9idWZmZXIgKnJ4YiwKIAkJCSAgICAgICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCkKQEAgLTY5Myw2ICs3MjMsOCBAQAogCXN0cnVjdCBpd2xfbXZtICptdm0gPSBJV0xfT1BfTU9ERV9HRVRfTVZNKG9wX21vZGUpOwogCXU4IGk7CiAKKwlpd2xfbXZtX3J4X2NoZWNrX3RyaWdnZXIobXZtLCBwa3QpOworCiAJLyoKIAkgKiBEbyB0aGUgbm90aWZpY2F0aW9uIHdhaXQgYmVmb3JlIFJYIGhhbmRsZXJzIHNvCiAJICogZXZlbiBpZiB0aGUgUlggaGFuZGxlciBjb25zdW1lcyB0aGUgUlhCIHdlIGhhdmUKQEAgLTgyNyw3ICs4NTksNyBAQAogc3RhdGljIHZvaWQgaXdsX212bV9md19lcnJvcl9kdW1wX3drKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgaXdsX212bSAqbXZtID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpd2xfbXZtLCBmd19lcnJvcl9kdW1wX3drKTsKKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpd2xfbXZtLCBmd19kdW1wX3drLndvcmspOwogCiAJaWYgKGl3bF9tdm1fcmVmX3N5bmMobXZtLCBJV0xfTVZNX1JFRl9GV19EQkdfQ09MTEVDVCkpCiAJCXJldHVybjsKQEAgLTgzNyw4ICs4NjksOCBAQAogCiAJLyogc3RhcnQgcmVjb3JkaW5nIGFnYWluIGlmIHRoZSBmaXJtd2FyZSBpcyBub3QgY3Jhc2hlZCAqLwogCVdBUk5fT05fT05DRSgoIXRlc3RfYml0KFNUQVRVU19GV19FUlJPUiwgJm12bS0+dHJhbnMtPnN0YXR1cykpICYmCi0JCSAgICAgIG12bS0+ZnctPmRiZ19kZXN0X3RsdiAmJgotCQkgICAgICBpd2xfbXZtX3N0YXJ0X2Z3X2RiZ19jb25mKG12bSwgbXZtLT5md19kYmdfY29uZikpOworCQkgICAgIG12bS0+ZnctPmRiZ19kZXN0X3RsdiAmJgorCQkgICAgIGl3bF9tdm1fc3RhcnRfZndfZGJnX2NvbmYobXZtLCBtdm0tPmZ3X2RiZ19jb25mKSk7CiAKIAltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOwogCkBAIC04NTksMTggKzg5MSw3IEBACiAJICogdGhlIG5leHQgc3RhcnQoKSBjYWxsIGZyb20gbWFjODAyMTEuIElmIHJlc3RhcnQgaXNuJ3QgY2FsbGVkCiAJICogKG5vIGZ3IHJlc3RhcnQpIHNjYW4gc3RhdHVzIHdpbGwgc3RheSBidXN5LgogCSAqLwotCXN3aXRjaCAobXZtLT5zY2FuX3N0YXR1cykgewotCWNhc2UgSVdMX01WTV9TQ0FOX05PTkU6Ci0JCWJyZWFrOwotCWNhc2UgSVdMX01WTV9TQ0FOX09TOgotCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQobXZtLT5odywgdHJ1ZSk7Ci0JCWJyZWFrOwotCWNhc2UgSVdMX01WTV9TQ0FOX1NDSEVEOgotCQkvKiBTY2hlZCBzY2FuIHdpbGwgYmUgcmVzdGFydGVkIGJ5IG1hYzgwMjExIGluIHJlc3RhcnRfaHcuICovCi0JCWlmICghbXZtLT5yZXN0YXJ0X2Z3KQotCQkJaWVlZTgwMjExX3NjaGVkX3NjYW5fc3RvcHBlZChtdm0tPmh3KTsKLQkJYnJlYWs7Ci0JfQorCWl3bF9tdm1fcmVwb3J0X3NjYW5fYWJvcnRlZChtdm0pOwogCiAJLyoKIAkgKiBJZiB3ZSdyZSByZXN0YXJ0aW5nIGFscmVhZHksIGRvbid0IGN5Y2xlIHJlc3RhcnRzLgpAQCAtODc5LDcgKzkwMCw3IEBACiAJICogY2FuJ3QgcmVjb3ZlciB0aGlzIHNpbmNlIHdlJ3JlIGFscmVhZHkgaGFsZiBzdXNwZW5kZWQuCiAJICovCiAJaWYgKCFtdm0tPnJlc3RhcnRfZncgJiYgZndfZXJyb3IpIHsKLQkJc2NoZWR1bGVfd29yaygmbXZtLT5md19lcnJvcl9kdW1wX3drKTsKKwkJaXdsX212bV9md19kYmdfY29sbGVjdF9kZXNjKG12bSwgJml3bF9tdm1fZHVtcF9kZXNjX2Fzc2VydCwgMCk7CiAJfSBlbHNlIGlmICh0ZXN0X2FuZF9zZXRfYml0KElXTF9NVk1fU1RBVFVTX0lOX0hXX1JFU1RBUlQsCiAJCQkJICAgICZtdm0tPnN0YXR1cykpIHsKIAkJc3RydWN0IGl3bF9tdm1fcmVwcm9iZSAqcmVwcm9iZTsKQEAgLTExNDAsNyArMTE2MSw3IEBACiAKIAlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYgdmlmLT5ic3NfY29uZi5hc3NvYyAmJgogCSAgICBtdm0tPmQwaTNfYXBfc3RhX2lkID09IG12bXZpZi0+YXBfc3RhX2lkKQotCQlpZWVlODAyMTFfY29ubmVjdGlvbl9sb3NzKHZpZik7CisJCWl3bF9tdm1fY29ubmVjdGlvbl9sb3NzKG12bSwgdmlmLCAiRDBpMyIpOwogfQogCiB2b2lkIGl3bF9tdm1fZDBpM19lbmFibGVfdHgoc3RydWN0IGl3bF9tdm0gKm12bSwgX19sZTE2ICpxb3Nfc2VxKQpAQCAtMTIzNiw2ICsxMjU3LDEwIEBACiAJaXdsX2ZyZWVfcmVzcCgmZ2V0X3N0YXR1c19jbWQpOwogb3V0OgogCWl3bF9tdm1fZDBpM19lbmFibGVfdHgobXZtLCBxb3Nfc2VxKTsKKworCS8qIHRoZSBGVyBtaWdodCBoYXZlIHVwZGF0ZWQgdGhlIHJlZ2RvbWFpbiAqLworCWl3bF9tdm1fdXBkYXRlX2NoYW5nZWRfcmVnZG9tKG12bSk7CisKIAlpd2xfbXZtX3VucmVmKG12bSwgSVdMX01WTV9SRUZfRVhJVF9XT1JLKTsKIAltdXRleF91bmxvY2soJm12bS0+bXV0ZXgpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcGh5LWN0eHQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3BoeS1jdHh0LmMKaW5kZXggNWI0MzYxNi4uZTY4YTQ3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcGh5LWN0eHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9waHktY3R4dC5jCkBAIC02Nyw3ICs2Nyw3IEBACiAjaW5jbHVkZSAiZnctYXBpLmgiCiAjaW5jbHVkZSAibXZtLmgiCiAKLS8qIE1hcHMgdGhlIGRyaXZlciBzcGVjaWZpYyBjaGFubmVsIHdpZHRoIGRlZmluaXRpb24gdG8gdGhlIHRoZSBmdyB2YWx1ZXMgKi8KKy8qIE1hcHMgdGhlIGRyaXZlciBzcGVjaWZpYyBjaGFubmVsIHdpZHRoIGRlZmluaXRpb24gdG8gdGhlIGZ3IHZhbHVlcyAqLwogdTggaXdsX212bV9nZXRfY2hhbm5lbF93aWR0aChzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpCiB7CiAJc3dpdGNoIChjaGFuZGVmLT53aWR0aCkgewpAQCAtMTc1LDYgKzE3NSwxMCBAQAogCWNtZC0+cnhjaGFpbl9pbmZvIHw9IGNwdV90b19sZTMyKGlkbGVfY250IDw8IFBIWV9SWF9DSEFJTl9DTlRfUE9TKTsKIAljbWQtPnJ4Y2hhaW5faW5mbyB8PSBjcHVfdG9fbGUzMihhY3RpdmVfY250IDw8CiAJCQkJCSBQSFlfUlhfQ0hBSU5fTUlNT19DTlRfUE9TKTsKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCisJaWYgKHVubGlrZWx5KG12bS0+ZGJnZnNfcnhfcGh5aW5mbykpCisJCWNtZC0+cnhjaGFpbl9pbmZvID0gY3B1X3RvX2xlMzIobXZtLT5kYmdmc19yeF9waHlpbmZvKTsKKyNlbmRpZgogCiAJY21kLT50eGNoYWluX2luZm8gPSBjcHVfdG9fbGUzMihpd2xfbXZtX2dldF92YWxpZF90eF9hbnQobXZtKSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9wb3dlci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcG93ZXIuYwppbmRleCAyNjIwZGQwLi5kMmM2YmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9wb3dlci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3Bvd2VyLmMKQEAgLTY2LDYgKzY2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KIAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogCkBAIC0zNTcsNyArMzU4LDcgQEAKIAljbWQtPmZsYWdzIHw9IGNwdV90b19sZTE2KFBPV0VSX0ZMQUdTX1BPV0VSX1NBVkVfRU5BX01TSyk7CiAKIAlpZiAoIXZpZi0+YnNzX2NvbmYucHMgfHwgaXdsX212bV92aWZfbG93X2xhdGVuY3kobXZtdmlmKSB8fAotCSAgICAhbXZtdmlmLT5wbV9lbmFibGVkIHx8IGl3bF9tdm1fdGRsc19zdGFfY291bnQobXZtLCB2aWYpKQorCSAgICAhbXZtdmlmLT5wbV9lbmFibGVkKQogCQlyZXR1cm47CiAKIAljbWQtPmZsYWdzIHw9IGNwdV90b19sZTE2KFBPV0VSX0ZMQUdTX1BPV0VSX01BTkFHRU1FTlRfRU5BX01TSyk7CkBAIC00OTEsNyArNDkyLDcgQEAKIAogCWlmIChtZW1jbXAodmlmLT5ic3NfY29uZi5ic3NpZCwgbXZtdmlmLT51YXBzZF9taXNiZWhhdmluZ19ic3NpZCwKIAkJICAgRVRIX0FMRU4pKQotCQltZW1zZXQobXZtdmlmLT51YXBzZF9taXNiZWhhdmluZ19ic3NpZCwgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKG12bXZpZi0+dWFwc2RfbWlzYmVoYXZpbmdfYnNzaWQpOwogfQogCiBzdGF0aWMgdm9pZCBpd2xfbXZtX3Bvd2VyX3VhcHNkX21pc2JlaGF2X2FwX2l0ZXJhdG9yKHZvaWQgKl9kYXRhLCB1OCAqbWFjLApAQCAtNjM4LDYgKzYzOSwxMCBAQAogCWlmICh2aWZzLT5hcF92aWYpCiAJCWFwX212bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmcy0+YXBfdmlmKTsKIAorCS8qIGRvbid0IGFsbG93IFBNIGlmIGFueSBURExTIHN0YXRpb25zIGV4aXN0ICovCisJaWYgKGl3bF9tdm1fdGRsc19zdGFfY291bnQobXZtLCBOVUxMKSkKKwkJcmV0dXJuOworCiAJLyogZW5hYmxlIFBNIG9uIGJzcyBpZiBic3Mgc3RhbmQgYWxvbmUgKi8KIAlpZiAodmlmcy0+YnNzX2FjdGl2ZSAmJiAhdmlmcy0+cDJwX2FjdGl2ZSAmJiAhdmlmcy0+YXBfYWN0aXZlKSB7CiAJCWJzc19tdm12aWYtPnBtX2VuYWJsZWQgPSB0cnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcXVvdGEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3F1b3RhLmMKaW5kZXggZGJiMjU5NC4uNTA5YTY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcXVvdGEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9xdW90YS5jCkBAIC0xNzIsNiArMTcyLDcgQEAKIH0KIAogaW50IGl3bF9tdm1fdXBkYXRlX3F1b3RhcyhzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJICBib29sIGZvcmNlX3VwZGF0ZSwKIAkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKmRpc2FibGVkX3ZpZikKIHsKIAlzdHJ1Y3QgaXdsX3RpbWVfcXVvdGFfY21kIGNtZCA9IHt9OwpAQCAtMzA5LDcgKzMxMCw3IEBACiAJCQkgICJ6ZXJvIHF1b3RhIG9uIGJpbmRpbmcgJWRcbiIsIGkpOwogCX0KIAotCWlmICghc2VuZCkgeworCWlmICghc2VuZCAmJiAhZm9yY2VfdXBkYXRlKSB7CiAJCS8qIGRvbid0IHNlbmQgYSBwcmFjdGljYWxseSB1bmNoYW5nZWQgY29tbWFuZCwgdGhlIGZpcm13YXJlIGhhcwogCQkgKiB0byByZS1pbml0aWFsaXplIGEgbG90IG9mIHN0YXRlIGFuZCB0aGF0IGNhbiBoYXZlIGFuIGFkdmVyc2UKIAkJICogaW1wYWN0IG9uIGl0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9ycy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcnMuYwppbmRleCAxOTRiZDFmLi5mOTkyOGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9ycy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3JzLmMKQEAgLTEzNCw5ICsxMzQsMTIgQEAKICNkZWZpbmUgTUFYX05FWFRfQ09MVU1OUyA3CiAjZGVmaW5lIE1BWF9DT0xVTU5fQ0hFQ0tTIDMKIAorc3RydWN0IHJzX3R4X2NvbHVtbjsKKwogdHlwZWRlZiBib29sICgqYWxsb3dfY29sdW1uX2Z1bmNfdCkgKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJCSAgICAgc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsKTsKKwkJCQkgICAgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCByc190eF9jb2x1bW4gKm5leHRfY29sKTsKIAogc3RydWN0IHJzX3R4X2NvbHVtbiB7CiAJZW51bSByc19jb2x1bW5fbW9kZSBtb2RlOwpAQCAtMTQ3LDE0ICsxNTAsMTkgQEAKIH07CiAKIHN0YXRpYyBib29sIHJzX2FudF9hbGxvdyhzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCkKKwkJCSBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwsCisJCQkgY29uc3Qgc3RydWN0IHJzX3R4X2NvbHVtbiAqbmV4dF9jb2wpCiB7Ci0JcmV0dXJuIGl3bF9tdm1fYnRfY29leF9pc19hbnRfYXZhaWwobXZtLCB0YmwtPnJhdGUuYW50KTsKKwlyZXR1cm4gaXdsX212bV9idF9jb2V4X2lzX2FudF9hdmFpbChtdm0sIG5leHRfY29sLT5hbnQpOwogfQogCiBzdGF0aWMgYm9vbCByc19taW1vX2FsbG93KHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCkKKwkJCSAgc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLAorCQkJICBjb25zdCBzdHJ1Y3QgcnNfdHhfY29sdW1uICpuZXh0X2NvbCkKIHsKKwlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKKwlzdHJ1Y3QgaXdsX212bV92aWYgKm12bXZpZjsKKwogCWlmICghc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKQogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTE2NywxMSArMTc1LDE3IEBACiAJaWYgKCFpd2xfbXZtX2J0X2NvZXhfaXNfbWltb19hbGxvd2VkKG12bSwgc3RhKSkKIAkJcmV0dXJuIGZhbHNlOwogCisJbXZtc3RhID0gaXdsX212bV9zdGFfZnJvbV9tYWM4MDIxMShzdGEpOworCW12bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEobXZtc3RhLT52aWYpOworCWlmIChpd2xfbXZtX3ZpZl9sb3dfbGF0ZW5jeShtdm12aWYpICYmIG12bXN0YS0+dmlmLT5wMnApCisJCXJldHVybiBmYWxzZTsKKwogCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgYm9vbCByc19zaXNvX2FsbG93KHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCkKKwkJCSAgc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLAorCQkJICBjb25zdCBzdHJ1Y3QgcnNfdHhfY29sdW1uICpuZXh0X2NvbCkKIHsKIAlpZiAoIXN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTgwLDcgKzE5NCw4IEBACiB9CiAKIHN0YXRpYyBib29sIHJzX3NnaV9hbGxvdyhzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCkKKwkJCSBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwsCisJCQkgY29uc3Qgc3RydWN0IHJzX3R4X2NvbHVtbiAqbmV4dF9jb2wpCiB7CiAJc3RydWN0IHJzX3JhdGUgKnJhdGUgPSAmdGJsLT5yYXRlOwogCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwID0gJnN0YS0+aHRfY2FwOwpAQCAtODAwLDYgKzgxNSw4IEBACiAJCXJhdGUtPmxkcGMgPSB0cnVlOwogCWlmICh1Y29kZV9yYXRlICYgUkFURV9NQ1NfVkhUX1NUQkNfTVNLKQogCQlyYXRlLT5zdGJjID0gdHJ1ZTsKKwlpZiAodWNvZGVfcmF0ZSAmIFJBVEVfTUNTX0JGX01TSykKKwkJcmF0ZS0+YmZlciA9IHRydWU7CiAKIAlyYXRlLT5idyA9IHVjb2RlX3JhdGUgJiBSQVRFX01DU19DSEFOX1dJRFRIX01TSzsKIApAQCAtODA5LDcgKzgyNiw5IEBACiAKIAkJaWYgKG5zcyA9PSAxKSB7CiAJCQlyYXRlLT50eXBlID0gTFFfSFRfU0lTTzsKLQkJCVdBUk5fT05fT05DRSghcmF0ZS0+c3RiYyAmJiBudW1fb2ZfYW50ICE9IDEpOworCQkJV0FSTl9PTkNFKCFyYXRlLT5zdGJjICYmICFyYXRlLT5iZmVyICYmIG51bV9vZl9hbnQgIT0gMSwKKwkJCQkgICJzdGJjICVkIGJmZXIgJWQiLAorCQkJCSAgcmF0ZS0+c3RiYywgcmF0ZS0+YmZlcik7CiAJCX0gZWxzZSBpZiAobnNzID09IDIpIHsKIAkJCXJhdGUtPnR5cGUgPSBMUV9IVF9NSU1PMjsKIAkJCVdBUk5fT05fT05DRShudW1fb2ZfYW50ICE9IDIpOwpAQCAtODIyLDcgKzg0MSw5IEBACiAKIAkJaWYgKG5zcyA9PSAxKSB7CiAJCQlyYXRlLT50eXBlID0gTFFfVkhUX1NJU087Ci0JCQlXQVJOX09OX09OQ0UoIXJhdGUtPnN0YmMgJiYgbnVtX29mX2FudCAhPSAxKTsKKwkJCVdBUk5fT05DRSghcmF0ZS0+c3RiYyAmJiAhcmF0ZS0+YmZlciAmJiBudW1fb2ZfYW50ICE9IDEsCisJCQkJICAic3RiYyAlZCBiZmVyICVkIiwKKwkJCQkgIHJhdGUtPnN0YmMsIHJhdGUtPmJmZXIpOwogCQl9IGVsc2UgaWYgKG5zcyA9PSAyKSB7CiAJCQlyYXRlLT50eXBlID0gTFFfVkhUX01JTU8yOwogCQkJV0FSTl9PTl9PTkNFKG51bV9vZl9hbnQgIT0gMik7CkBAIC0xMDAxLDEzICsxMDIyLDQxIEBACiAJCXJzX2dldF9sb3dlcl9yYXRlX2luX2NvbHVtbihscV9zdGEsIHJhdGUpOwogfQogCi0vKiBTaW1wbGUgZnVuY3Rpb24gdG8gY29tcGFyZSB0d28gcmF0ZSBzY2FsZSB0YWJsZSB0eXBlcyAqLwotc3RhdGljIGlubGluZSBib29sIHJzX3JhdGVfbWF0Y2goc3RydWN0IHJzX3JhdGUgKmEsCi0JCQkJIHN0cnVjdCByc19yYXRlICpiKQorLyogQ2hlY2sgaWYgYm90aCByYXRlcyBhcmUgaWRlbnRpY2FsCisgKiBhbGxvd19hbnRfbWlzbWF0Y2ggZW5hYmxlcyBtYXRjaGluZyBhIFNJU08gcmF0ZSBvbiBBTlRfQSBvciBBTlRfQgorICogd2l0aCBhIHJhdGUgaW5kaWNhdGluZyBTVEJDL0JGRVIgYW5kIEFOVF9BQi4KKyAqLworc3RhdGljIGlubGluZSBib29sIHJzX3JhdGVfZXF1YWwoc3RydWN0IHJzX3JhdGUgKmEsCisJCQkJIHN0cnVjdCByc19yYXRlICpiLAorCQkJCSBib29sIGFsbG93X2FudF9taXNtYXRjaCkKKworeworCWJvb2wgYW50X21hdGNoID0gKGEtPmFudCA9PSBiLT5hbnQpICYmIChhLT5zdGJjID09IGItPnN0YmMpICYmCisJCShhLT5iZmVyID09IGItPmJmZXIpOworCisJaWYgKGFsbG93X2FudF9taXNtYXRjaCkgeworCQlpZiAoYS0+c3RiYyB8fCBhLT5iZmVyKSB7CisJCQlXQVJOX09OQ0UoYS0+YW50ICE9IEFOVF9BQiwgInN0YmMgJWQgYmZlciAlZCBhbnQgJWQiLAorCQkJCSAgYS0+c3RiYywgYS0+YmZlciwgYS0+YW50KTsKKwkJCWFudF9tYXRjaCB8PSAoYi0+YW50ID09IEFOVF9BIHx8IGItPmFudCA9PSBBTlRfQik7CisJCX0gZWxzZSBpZiAoYi0+c3RiYyB8fCBiLT5iZmVyKSB7CisJCQlXQVJOX09OQ0UoYi0+YW50ICE9IEFOVF9BQiwgInN0YmMgJWQgYmZlciAlZCBhbnQgJWQiLAorCQkJCSAgYi0+c3RiYywgYi0+YmZlciwgYi0+YW50KTsKKwkJCWFudF9tYXRjaCB8PSAoYS0+YW50ID09IEFOVF9BIHx8IGEtPmFudCA9PSBBTlRfQik7CisJCX0KKwl9CisKKwlyZXR1cm4gKGEtPnR5cGUgPT0gYi0+dHlwZSkgJiYgKGEtPmJ3ID09IGItPmJ3KSAmJiAoYS0+c2dpID09IGItPnNnaSkgJiYKKwkJKGEtPmxkcGMgPT0gYi0+bGRwYykgJiYgKGEtPmluZGV4ID09IGItPmluZGV4KSAmJiBhbnRfbWF0Y2g7Cit9CisKKy8qIENoZWNrIGlmIGJvdGggcmF0ZXMgc2hhcmUgdGhlIHNhbWUgY29sdW1uICovCitzdGF0aWMgaW5saW5lIGJvb2wgcnNfcmF0ZV9jb2x1bW5fbWF0Y2goc3RydWN0IHJzX3JhdGUgKmEsCisJCQkJCXN0cnVjdCByc19yYXRlICpiKQogewogCWJvb2wgYW50X21hdGNoOwogCi0JaWYgKGEtPnN0YmMpCisJaWYgKGEtPnN0YmMgfHwgYS0+YmZlcikKIAkJYW50X21hdGNoID0gKGItPmFudCA9PSBBTlRfQSB8fCBiLT5hbnQgPT0gQU5UX0IpOwogCWVsc2UKIAkJYW50X21hdGNoID0gKGEtPmFudCA9PSBiLT5hbnQpOwpAQCAtMTAxNiwxNiArMTA2NSwzNSBAQAogCQkmJiBhbnRfbWF0Y2g7CiB9CiAKLXN0YXRpYyB1MzIgcnNfY2hfd2lkdGhfZnJvbV9tYWNfZmxhZ3MoZW51bSBtYWM4MDIxMV9yYXRlX2NvbnRyb2xfZmxhZ3MgZmxhZ3MpCitzdGF0aWMgaW5saW5lIGVudW0gcnNfY29sdW1uIHJzX2dldF9jb2x1bW5fZnJvbV9yYXRlKHN0cnVjdCByc19yYXRlICpyYXRlKQogewotCWlmIChmbGFncyAmIElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEgpCi0JCXJldHVybiBSQVRFX01DU19DSEFOX1dJRFRIXzQwOwotCWVsc2UgaWYgKGZsYWdzICYgSUVFRTgwMjExX1RYX1JDXzgwX01IWl9XSURUSCkKLQkJcmV0dXJuIFJBVEVfTUNTX0NIQU5fV0lEVEhfODA7Ci0JZWxzZSBpZiAoZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfMTYwX01IWl9XSURUSCkKLQkJcmV0dXJuIFJBVEVfTUNTX0NIQU5fV0lEVEhfMTYwOworCWlmIChpc19sZWdhY3kocmF0ZSkpIHsKKwkJaWYgKHJhdGUtPmFudCA9PSBBTlRfQSkKKwkJCXJldHVybiBSU19DT0xVTU5fTEVHQUNZX0FOVF9BOwogCi0JcmV0dXJuIFJBVEVfTUNTX0NIQU5fV0lEVEhfMjA7CisJCWlmIChyYXRlLT5hbnQgPT0gQU5UX0IpCisJCQlyZXR1cm4gUlNfQ09MVU1OX0xFR0FDWV9BTlRfQjsKKworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoaXNfc2lzbyhyYXRlKSkgeworCQlpZiAocmF0ZS0+YW50ID09IEFOVF9BIHx8IHJhdGUtPnN0YmMgfHwgcmF0ZS0+YmZlcikKKwkJCXJldHVybiByYXRlLT5zZ2kgPyBSU19DT0xVTU5fU0lTT19BTlRfQV9TR0kgOgorCQkJCVJTX0NPTFVNTl9TSVNPX0FOVF9BOworCisJCWlmIChyYXRlLT5hbnQgPT0gQU5UX0IpCisJCQlyZXR1cm4gcmF0ZS0+c2dpID8gUlNfQ09MVU1OX1NJU09fQU5UX0JfU0dJIDoKKwkJCQlSU19DT0xVTU5fU0lTT19BTlRfQjsKKworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoaXNfbWltbyhyYXRlKSkKKwkJcmV0dXJuIHJhdGUtPnNnaSA/IFJTX0NPTFVNTl9NSU1PMl9TR0kgOiBSU19DT0xVTU5fTUlNTzI7CisKK2VycjoKKwlyZXR1cm4gUlNfQ09MVU1OX0lOVkFMSUQ7CiB9CiAKIHN0YXRpYyB1OCByc19nZXRfdGlkKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCkBAIC0xMDQ4LDE1ICsxMTE2LDE3IEBACiB7CiAJaW50IGxlZ2FjeV9zdWNjZXNzOwogCWludCByZXRyaWVzOwotCWludCBtYWNfaW5kZXgsIGk7CisJaW50IGk7CiAJc3RydWN0IGl3bF9scV9jbWQgKnRhYmxlOwotCWVudW0gbWFjODAyMTFfcmF0ZV9jb250cm9sX2ZsYWdzIG1hY19mbGFnczsKLQl1MzIgdWNvZGVfcmF0ZTsKLQlzdHJ1Y3QgcnNfcmF0ZSByYXRlOworCXUzMiBscV9od3JhdGU7CisJc3RydWN0IHJzX3JhdGUgbHFfcmF0ZSwgdHhfcmVzcF9yYXRlOwogCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKmN1cnJfdGJsLCAqb3RoZXJfdGJsLCAqdG1wX3RibDsKIAl1OCByZWR1Y2VkX3R4cCA9ICh1aW50cHRyX3QpaW5mby0+c3RhdHVzLnN0YXR1c19kcml2ZXJfZGF0YVswXTsKKwl1MzIgdHhfcmVzcF9od3JhdGUgPSAodWludHB0cl90KWluZm8tPnN0YXR1cy5zdGF0dXNfZHJpdmVyX2RhdGFbMV07CiAJc3RydWN0IGl3bF9tdm1fc3RhICptdm1zdGEgPSBpd2xfbXZtX3N0YV9mcm9tX21hYzgwMjExKHN0YSk7CiAJc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSA9ICZtdm1zdGEtPmxxX3N0YTsKKwlib29sIGFsbG93X2FudF9taXNtYXRjaCA9IG12bS0+ZnctPnVjb2RlX2NhcGEuYXBpWzBdICYKKwkJSVdMX1VDT0RFX1RMVl9BUElfTFFfU1NfUEFSQU1TOwogCiAJLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KIAlpZiAoIWxxX3N0YSkgewpAQCAtMTA2Nyw1MCArMTEzNyw0MyBAQAogCQlyZXR1cm47CiAJfQogCi0jaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKLQkvKiBEaXNhYmxlIGxhc3QgdHggY2hlY2sgaWYgd2UgYXJlIGRlYnVnZ2luZyB3aXRoIGZpeGVkIHJhdGUgKi8KLQlpZiAobHFfc3RhLT5wZXJzLmRiZ19maXhlZF9yYXRlKSB7Ci0JCUlXTF9ERUJVR19SQVRFKG12bSwgIkZpeGVkIHJhdGUuIGF2b2lkIHJhdGUgc2NhbGluZ1xuIik7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKIAkvKiBUaGlzIHBhY2tldCB3YXMgYWdncmVnYXRlZCBidXQgZG9lc24ndCBjYXJyeSBzdGF0dXMgaW5mbyAqLwogCWlmICgoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSAmJgogCSAgICAhKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQU1QRFUpKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIElnbm9yZSB0aGlzIFR4IGZyYW1lIHJlc3BvbnNlIGlmIGl0cyBpbml0aWFsIHJhdGUgZG9lc24ndCBtYXRjaAotCSAqIHRoYXQgb2YgbGF0ZXN0IExpbmsgUXVhbGl0eSBjb21tYW5kLiAgVGhlcmUgbWF5IGJlIHN0cmFnZ2xlcnMKLQkgKiBmcm9tIGEgcHJldmlvdXMgTGluayBRdWFsaXR5IGNvbW1hbmQsIGJ1dCB3ZSdyZSBubyBsb25nZXIgaW50ZXJlc3RlZAotCSAqIGluIHRob3NlOyB0aGV5J3JlIGVpdGhlciBmcm9tIHRoZSAiYWN0aXZlIiBtb2RlIHdoaWxlIHdlJ3JlIHRyeWluZwotCSAqIHRvIGNoZWNrICJzZWFyY2giIG1vZGUsIG9yIGEgcHJpb3IgInNlYXJjaCIgbW9kZSBhZnRlciB3ZSd2ZSBtb3ZlZAotCSAqIHRvIGEgbmV3ICJzZWFyY2giIG1vZGUgKHdoaWNoIG1pZ2h0IGJlY29tZSB0aGUgbmV3ICJhY3RpdmUiIG1vZGUpLgotCSAqLwotCXRhYmxlID0gJmxxX3N0YS0+bHE7Ci0JdWNvZGVfcmF0ZSA9IGxlMzJfdG9fY3B1KHRhYmxlLT5yc190YWJsZVswXSk7Ci0JcnNfcmF0ZV9mcm9tX3Vjb2RlX3JhdGUodWNvZGVfcmF0ZSwgaW5mby0+YmFuZCwgJnJhdGUpOwotCWlmIChpbmZvLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCXJhdGUuaW5kZXggLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQltYWNfZmxhZ3MgPSBpbmZvLT5zdGF0dXMucmF0ZXNbMF0uZmxhZ3M7Ci0JbWFjX2luZGV4ID0gaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeDsKLQkvKiBGb3IgSFQgcGFja2V0cywgbWFwIE1DUyB0byBQTENQICovCi0JaWYgKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHsKLQkJLyogUmVtb3ZlICMgb2Ygc3RyZWFtcyAqLwotCQltYWNfaW5kZXggJj0gUkFURV9IVF9NQ1NfUkFURV9DT0RFX01TSzsKLQkJaWYgKG1hY19pbmRleCA+PSAoSVdMX1JBVEVfOU1fSU5ERVggLSBJV0xfRklSU1RfT0ZETV9SQVRFKSkKLQkJCW1hY19pbmRleCsrOwotCQkvKgotCQkgKiBtYWM4MDIxMSBIVCBpbmRleCBpcyBhbHdheXMgemVyby1pbmRleGVkOyB3ZSBuZWVkIHRvIG1vdmUKLQkJICogSFQgT0ZETSByYXRlcyBhZnRlciBDQ0sgcmF0ZXMgaW4gMi40IEdIeiBiYW5kCi0JCSAqLwotCQlpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQotCQkJbWFjX2luZGV4ICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JfSBlbHNlIGlmIChtYWNfZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVkhUX01DUykgewotCQltYWNfaW5kZXggJj0gUkFURV9WSFRfTUNTX1JBVEVfQ09ERV9NU0s7Ci0JCWlmIChtYWNfaW5kZXggPj0gKElXTF9SQVRFXzlNX0lOREVYIC0gSVdMX0ZJUlNUX09GRE1fUkFURSkpCi0JCQltYWNfaW5kZXgrKzsKKwlyc19yYXRlX2Zyb21fdWNvZGVfcmF0ZSh0eF9yZXNwX2h3cmF0ZSwgaW5mby0+YmFuZCwgJnR4X3Jlc3BfcmF0ZSk7CisKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCS8qIERpc2FibGUgbGFzdCB0eCBjaGVjayBpZiB3ZSBhcmUgZGVidWdnaW5nIHdpdGggZml4ZWQgcmF0ZSBidXQKKwkgKiB1cGRhdGUgdHggc3RhdHMgKi8KKwlpZiAobHFfc3RhLT5wZXJzLmRiZ19maXhlZF9yYXRlKSB7CisJCWludCBpbmRleCA9IHR4X3Jlc3BfcmF0ZS5pbmRleDsKKwkJZW51bSByc19jb2x1bW4gY29sdW1uOworCQlpbnQgYXR0ZW1wdHMsIHN1Y2Nlc3M7CisKKwkJY29sdW1uID0gcnNfZ2V0X2NvbHVtbl9mcm9tX3JhdGUoJnR4X3Jlc3BfcmF0ZSk7CisJCWlmIChXQVJOX09OQ0UoY29sdW1uID09IFJTX0NPTFVNTl9JTlZBTElELAorCQkJICAgICAgIkNhbid0IG1hcCByYXRlIDB4JXggdG8gY29sdW1uIiwKKwkJCSAgICAgIHR4X3Jlc3BfaHdyYXRlKSkKKwkJCXJldHVybjsKKworCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVSkgeworCQkJYXR0ZW1wdHMgPSBpbmZvLT5zdGF0dXMuYW1wZHVfbGVuOworCQkJc3VjY2VzcyA9IGluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuOworCQl9IGVsc2UgeworCQkJYXR0ZW1wdHMgPSBpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQ7CisJCQlzdWNjZXNzID0gISEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spOworCQl9CisKKwkJbHFfc3RhLT5wZXJzLnR4X3N0YXRzW2NvbHVtbl1baW5kZXhdLnRvdGFsICs9IGF0dGVtcHRzOworCQlscV9zdGEtPnBlcnMudHhfc3RhdHNbY29sdW1uXVtpbmRleF0uc3VjY2VzcyArPSBzdWNjZXNzOworCisJCUlXTF9ERUJVR19SQVRFKG12bSwgIkZpeGVkIHJhdGUgMHgleCBzdWNjZXNzICVkIGF0dGVtcHRzICVkXG4iLAorCQkJICAgICAgIHR4X3Jlc3BfaHdyYXRlLCBzdWNjZXNzLCBhdHRlbXB0cyk7CisJCXJldHVybjsKIAl9CisjZW5kaWYKIAogCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsCiAJCSAgICAgICAodW5zaWduZWQgbG9uZykobHFfc3RhLT5sYXN0X3R4ICsKQEAgLTExMjYsMjEgKzExODksMjMgQEAKIAl9CiAJbHFfc3RhLT5sYXN0X3R4ID0gamlmZmllczsKIAorCS8qIElnbm9yZSB0aGlzIFR4IGZyYW1lIHJlc3BvbnNlIGlmIGl0cyBpbml0aWFsIHJhdGUgZG9lc24ndCBtYXRjaAorCSAqIHRoYXQgb2YgbGF0ZXN0IExpbmsgUXVhbGl0eSBjb21tYW5kLiAgVGhlcmUgbWF5IGJlIHN0cmFnZ2xlcnMKKwkgKiBmcm9tIGEgcHJldmlvdXMgTGluayBRdWFsaXR5IGNvbW1hbmQsIGJ1dCB3ZSdyZSBubyBsb25nZXIgaW50ZXJlc3RlZAorCSAqIGluIHRob3NlOyB0aGV5J3JlIGVpdGhlciBmcm9tIHRoZSAiYWN0aXZlIiBtb2RlIHdoaWxlIHdlJ3JlIHRyeWluZworCSAqIHRvIGNoZWNrICJzZWFyY2giIG1vZGUsIG9yIGEgcHJpb3IgInNlYXJjaCIgbW9kZSBhZnRlciB3ZSd2ZSBtb3ZlZAorCSAqIHRvIGEgbmV3ICJzZWFyY2giIG1vZGUgKHdoaWNoIG1pZ2h0IGJlY29tZSB0aGUgbmV3ICJhY3RpdmUiIG1vZGUpLgorCSAqLworCXRhYmxlID0gJmxxX3N0YS0+bHE7CisJbHFfaHdyYXRlID0gbGUzMl90b19jcHUodGFibGUtPnJzX3RhYmxlWzBdKTsKKwlyc19yYXRlX2Zyb21fdWNvZGVfcmF0ZShscV9od3JhdGUsIGluZm8tPmJhbmQsICZscV9yYXRlKTsKKwogCS8qIEhlcmUgd2UgYWN0dWFsbHkgY29tcGFyZSB0aGlzIHJhdGUgdG8gdGhlIGxhdGVzdCBMUSBjb21tYW5kICovCi0JaWYgKChtYWNfaW5kZXggPCAwKSB8fAotCSAgICAocmF0ZS5zZ2kgIT0gISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJKSkgfHwKLQkgICAgKHJhdGUuYncgIT0gcnNfY2hfd2lkdGhfZnJvbV9tYWNfZmxhZ3MobWFjX2ZsYWdzKSkgfHwKLQkgICAgKHJhdGUuYW50ICE9IGluZm8tPnN0YXR1cy5hbnRlbm5hKSB8fAotCSAgICAoISEodWNvZGVfcmF0ZSAmIFJBVEVfTUNTX0hUX01TSykgIT0KLQkgICAgICEhKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpKSB8fAotCSAgICAoISEodWNvZGVfcmF0ZSAmIFJBVEVfTUNTX1ZIVF9NU0spICE9Ci0JICAgICAhIShtYWNfZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVkhUX01DUykpIHx8Ci0JICAgICghISh1Y29kZV9yYXRlICYgUkFURV9IVF9NQ1NfR0ZfTVNLKSAhPQotCSAgICAgISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEKSkgfHwKLQkgICAgKHJhdGUuaW5kZXggIT0gbWFjX2luZGV4KSkgeworCWlmICghcnNfcmF0ZV9lcXVhbCgmdHhfcmVzcF9yYXRlLCAmbHFfcmF0ZSwgYWxsb3dfYW50X21pc21hdGNoKSkgewogCQlJV0xfREVCVUdfUkFURShtdm0sCi0JCQkgICAgICAgImluaXRpYWwgcmF0ZSAlZCBkb2VzIG5vdCBtYXRjaCAlZCAoMHgleClcbiIsCi0JCQkgICAgICAgbWFjX2luZGV4LCByYXRlLmluZGV4LCB1Y29kZV9yYXRlKTsKKwkJCSAgICAgICAiaW5pdGlhbCB0eCByZXNwIHJhdGUgMHgleCBkb2VzIG5vdCBtYXRjaCAweCV4XG4iLAorCQkJICAgICAgIHR4X3Jlc3BfaHdyYXRlLCBscV9od3JhdGUpOworCiAJCS8qCiAJCSAqIFNpbmNlIHJhdGVzIG1pcy1tYXRjaCwgdGhlIGxhc3QgTFEgY29tbWFuZCBtYXkgaGF2ZSBmYWlsZWQuCiAJCSAqIEFmdGVyIElXTF9NSVNTRURfUkFURV9NQVggbWlzLW1hdGNoZXMsIHJlc3luYyB0aGUgdUNvZGUgd2l0aApAQCAtMTE2OCwxNCArMTIzMywxNCBAQAogCQlvdGhlcl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKIAl9CiAKLQlpZiAoV0FSTl9PTl9PTkNFKCFyc19yYXRlX21hdGNoKCZyYXRlLCAmY3Vycl90YmwtPnJhdGUpKSkgeworCWlmIChXQVJOX09OX09OQ0UoIXJzX3JhdGVfY29sdW1uX21hdGNoKCZscV9yYXRlLCAmY3Vycl90YmwtPnJhdGUpKSkgewogCQlJV0xfREVCVUdfUkFURShtdm0sCiAJCQkgICAgICAgIk5laXRoZXIgYWN0aXZlIG5vciBzZWFyY2ggbWF0Y2hlcyB0eCByYXRlXG4iKTsKIAkJdG1wX3RibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwogCQlyc19kdW1wX3JhdGUobXZtLCAmdG1wX3RibC0+cmF0ZSwgIkFDVElWRSIpOwogCQl0bXBfdGJsID0gJihscV9zdGEtPmxxX2luZm9bMSAtIGxxX3N0YS0+YWN0aXZlX3RibF0pOwogCQlyc19kdW1wX3JhdGUobXZtLCAmdG1wX3RibC0+cmF0ZSwgIlNFQVJDSCIpOwotCQlyc19kdW1wX3JhdGUobXZtLCAmcmF0ZSwgIkFDVFVBTCIpOworCQlyc19kdW1wX3JhdGUobXZtLCAmbHFfcmF0ZSwgIkFDVFVBTCIpOwogCiAJCS8qCiAJCSAqIG5vIG1hdGNoaW5nIHRhYmxlIGZvdW5kLCBsZXQncyBieS1wYXNzIHRoZSBkYXRhIGNvbGxlY3Rpb24KQEAgLTEyMDAsOSArMTI2NSw3IEBACiAJCWlmIChpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbiA9PSAwKQogCQkJaW5mby0+c3RhdHVzLmFtcGR1X2xlbiA9IDE7CiAKLQkJdWNvZGVfcmF0ZSA9IGxlMzJfdG9fY3B1KHRhYmxlLT5yc190YWJsZVswXSk7Ci0JCXJzX3JhdGVfZnJvbV91Y29kZV9yYXRlKHVjb2RlX3JhdGUsIGluZm8tPmJhbmQsICZyYXRlKTsKLQkJcnNfY29sbGVjdF90eF9kYXRhKG12bSwgbHFfc3RhLCBjdXJyX3RibCwgcmF0ZS5pbmRleCwKKwkJcnNfY29sbGVjdF90eF9kYXRhKG12bSwgbHFfc3RhLCBjdXJyX3RibCwgbHFfcmF0ZS5pbmRleCwKIAkJCQkgICBpbmZvLT5zdGF0dXMuYW1wZHVfbGVuLAogCQkJCSAgIGluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuLAogCQkJCSAgIHJlZHVjZWRfdHhwKTsKQEAgLTEyMTQsOSArMTI3Nyw3IEBACiAJCQkJCWluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuKTsKIAkJfQogCX0gZWxzZSB7Ci0JLyoKLQkgKiBGb3IgbGVnYWN5LCB1cGRhdGUgZnJhbWUgaGlzdG9yeSB3aXRoIGZvciBlYWNoIFR4IHJldHJ5LgotCSAqLworCQkvKiBGb3IgbGVnYWN5LCB1cGRhdGUgZnJhbWUgaGlzdG9yeSB3aXRoIGZvciBlYWNoIFR4IHJldHJ5LiAqLwogCQlyZXRyaWVzID0gaW5mby0+c3RhdHVzLnJhdGVzWzBdLmNvdW50IC0gMTsKIAkJLyogSFcgZG9lc24ndCBzZW5kIG1vcmUgdGhhbiAxNSByZXRyaWVzICovCiAJCXJldHJpZXMgPSBtaW4ocmV0cmllcywgMTUpOwpAQCAtMTIyNSwyMSArMTI4NiwyMyBAQAogCQlsZWdhY3lfc3VjY2VzcyA9ICEhKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLKTsKIAkJLyogQ29sbGVjdCBkYXRhIGZvciBlYWNoIHJhdGUgdXNlZCBkdXJpbmcgZmFpbGVkIFRYIGF0dGVtcHRzICovCiAJCWZvciAoaSA9IDA7IGkgPD0gcmV0cmllczsgKytpKSB7Ci0JCQl1Y29kZV9yYXRlID0gbGUzMl90b19jcHUodGFibGUtPnJzX3RhYmxlW2ldKTsKLQkJCXJzX3JhdGVfZnJvbV91Y29kZV9yYXRlKHVjb2RlX3JhdGUsIGluZm8tPmJhbmQsICZyYXRlKTsKKwkJCWxxX2h3cmF0ZSA9IGxlMzJfdG9fY3B1KHRhYmxlLT5yc190YWJsZVtpXSk7CisJCQlyc19yYXRlX2Zyb21fdWNvZGVfcmF0ZShscV9od3JhdGUsIGluZm8tPmJhbmQsCisJCQkJCQkmbHFfcmF0ZSk7CiAJCQkvKgogCQkJICogT25seSBjb2xsZWN0IHN0YXRzIGlmIHJldHJpZWQgcmF0ZSBpcyBpbiB0aGUgc2FtZSBSUwogCQkJICogdGFibGUgYXMgYWN0aXZlL3NlYXJjaC4KIAkJCSAqLwotCQkJaWYgKHJzX3JhdGVfbWF0Y2goJnJhdGUsICZjdXJyX3RibC0+cmF0ZSkpCisJCQlpZiAocnNfcmF0ZV9jb2x1bW5fbWF0Y2goJmxxX3JhdGUsICZjdXJyX3RibC0+cmF0ZSkpCiAJCQkJdG1wX3RibCA9IGN1cnJfdGJsOwotCQkJZWxzZSBpZiAocnNfcmF0ZV9tYXRjaCgmcmF0ZSwgJm90aGVyX3RibC0+cmF0ZSkpCisJCQllbHNlIGlmIChyc19yYXRlX2NvbHVtbl9tYXRjaCgmbHFfcmF0ZSwKKwkJCQkJCSAgICAgICZvdGhlcl90YmwtPnJhdGUpKQogCQkJCXRtcF90YmwgPSBvdGhlcl90Ymw7CiAJCQllbHNlCiAJCQkJY29udGludWU7CiAKLQkJCXJzX2NvbGxlY3RfdHhfZGF0YShtdm0sIGxxX3N0YSwgdG1wX3RibCwgcmF0ZS5pbmRleCwgMSwKLQkJCQkJICAgaSA8IHJldHJpZXMgPyAwIDogbGVnYWN5X3N1Y2Nlc3MsCisJCQlyc19jb2xsZWN0X3R4X2RhdGEobXZtLCBscV9zdGEsIHRtcF90YmwsIGxxX3JhdGUuaW5kZXgsCisJCQkJCSAgIDEsIGkgPCByZXRyaWVzID8gMCA6IGxlZ2FjeV9zdWNjZXNzLAogCQkJCQkgICByZWR1Y2VkX3R4cCk7CiAJCX0KIApAQCAtMTI1MCw3ICsxMzEzLDcgQEAKIAkJfQogCX0KIAkvKiBUaGUgbGFzdCBUWCByYXRlIGlzIGNhY2hlZCBpbiBscV9zdGE7IGl0J3Mgc2V0IGluIGlmL2Vsc2UgYWJvdmUgKi8KLQlscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzID0gdWNvZGVfcmF0ZTsKKwlscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzID0gbHFfaHdyYXRlOwogCUlXTF9ERUJVR19SQVRFKG12bSwgInJlZHVjZWQgdHhwb3dlcjogJWRcbiIsIHJlZHVjZWRfdHhwKTsKIGRvbmU6CiAJLyogU2VlIGlmIHRoZXJlJ3MgYSBiZXR0ZXIgcmF0ZSBvciBtb2R1bGF0aW9uIG1vZGUgdG8gdHJ5LiAqLwpAQCAtMTI3MSw2ICsxMzM0LDkgQEAKIAlzdHJ1Y3QgaXdsX212bSAqbXZtID0gSVdMX09QX01PREVfR0VUX01WTShvcF9tb2RlKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAKKwlpZiAoIWl3bF9tdm1fc3RhX2Zyb21fbWFjODAyMTEoc3RhKS0+dmlmKQorCQlyZXR1cm47CisKIAlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKIAkgICAgaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykKIAkJcmV0dXJuOwpAQCAtMTU0Nyw5ICsxNjEzLDkgQEAKIHN0YXRpYyB2b2lkIHJzX3VwZGF0ZV9yYXRlX3RibChzdHJ1Y3QgaXdsX212bSAqbXZtLAogCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCiAJCQkgICAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCSAgICAgICBzdHJ1Y3QgcnNfcmF0ZSAqcmF0ZSkKKwkJCSAgICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwpCiB7Ci0JcnNfZmlsbF9scV9jbWQobXZtLCBzdGEsIGxxX3N0YSwgcmF0ZSk7CisJcnNfZmlsbF9scV9jbWQobXZtLCBzdGEsIGxxX3N0YSwgJnRibC0+cmF0ZSk7CiAJaXdsX212bV9zZW5kX2xxX2NtZChtdm0sICZscV9zdGEtPmxxLCBmYWxzZSk7CiB9CiAKQEAgLTE1OTAsNyArMTY1Niw3IEBACiAKIAkJZm9yIChqID0gMDsgaiA8IE1BWF9DT0xVTU5fQ0hFQ0tTOyBqKyspIHsKIAkJCWFsbG93X2Z1bmMgPSBuZXh0X2NvbC0+Y2hlY2tzW2pdOwotCQkJaWYgKGFsbG93X2Z1bmMgJiYgIWFsbG93X2Z1bmMobXZtLCBzdGEsIHRibCkpCisJCQlpZiAoYWxsb3dfZnVuYyAmJiAhYWxsb3dfZnVuYyhtdm0sIHN0YSwgdGJsLCBuZXh0X2NvbCkpCiAJCQkJYnJlYWs7CiAJCX0KIApAQCAtMjA3OSw3ICsyMTQ1LDcgQEAKIAkJCXJhdGUtPnR5cGUgPSBMUV9OT05FOwogCQkJbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDA7CiAJCQl0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKLQkJCXJzX3VwZGF0ZV9yYXRlX3RibChtdm0sIHN0YSwgbHFfc3RhLCAmdGJsLT5yYXRlKTsKKwkJCXJzX3VwZGF0ZV9yYXRlX3RibChtdm0sIHN0YSwgbHFfc3RhLCB0YmwpOwogCQl9CiAJCXJldHVybjsKIAl9CkBAIC0yMjQyLDcgKzIzMDgsNyBAQAogCS8qIFJlcGxhY2UgdUNvZGUncyByYXRlIHRhYmxlIGZvciB0aGUgZGVzdGluYXRpb24gc3RhdGlvbi4gKi8KIAlpZiAodXBkYXRlX2xxKSB7CiAJCXRibC0+cmF0ZS5pbmRleCA9IGluZGV4OwotCQlyc191cGRhdGVfcmF0ZV90YmwobXZtLCBzdGEsIGxxX3N0YSwgJnRibC0+cmF0ZSk7CisJCXJzX3VwZGF0ZV9yYXRlX3RibChtdm0sIHN0YSwgbHFfc3RhLCB0YmwpOwogCX0KIAogCXJzX3N0YXlfaW5fdGFibGUobHFfc3RhLCBmYWxzZSk7CkBAIC0yMjg5LDggKzIzNTUsNyBAQAogCiAJCQlyc19kdW1wX3JhdGUobXZtLCAmdGJsLT5yYXRlLAogCQkJCSAgICAgIlN3aXRjaCB0byBTRUFSQ0ggVEFCTEU6Iik7Ci0JCQlyc19maWxsX2xxX2NtZChtdm0sIHN0YSwgbHFfc3RhLCAmdGJsLT5yYXRlKTsKLQkJCWl3bF9tdm1fc2VuZF9scV9jbWQobXZtLCAmbHFfc3RhLT5scSwgZmFsc2UpOworCQkJcnNfdXBkYXRlX3JhdGVfdGJsKG12bSwgc3RhLCBscV9zdGEsIHRibCk7CiAJCX0gZWxzZSB7CiAJCQlkb25lX3NlYXJjaCA9IDE7CiAJCX0KQEAgLTI1MDQsNiArMjU2OSwxNCBAQAogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gbXZtX3N0YTsKIAorCWlmIChzdGEgJiYgIWl3bF9tdm1fc3RhX2Zyb21fbWFjODAyMTEoc3RhKS0+dmlmKSB7CisJCS8qIGlmIHZpZiBpc24ndCBpbml0aWFsaXplZCBtdm0gZG9lc24ndCBrbm93IGFib3V0CisJCSAqIHRoaXMgc3RhdGlvbiwgc28gZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGUgaXQKKwkJICovCisJCXN0YSA9IE5VTEw7CisJCW12bV9zdGEgPSBOVUxMOworCX0KKwogCS8qIFRPRE86IGhhbmRsZSByYXRlX2lkeF9tYXNrIGFuZCByYXRlX2lkeF9tY3NfbWFzayAqLwogCiAJLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KQEAgLTI1MzYsNiArMjYwOSw3IEBACiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKIAlscV9zdGEtPnBlcnMuZGJnX2ZpeGVkX3JhdGUgPSAwOwogCWxxX3N0YS0+cGVycy5kYmdfZml4ZWRfdHhwX3JlZHVjdGlvbiA9IFRQQ19JTlZBTElEOworCWxxX3N0YS0+cGVycy5zc19mb3JjZSA9IFJTX1NTX0ZPUkNFX05PTkU7CiAjZW5kaWYKIAlscV9zdGEtPnBlcnMuY2hhaW5zID0gMDsKIAltZW1zZXQobHFfc3RhLT5wZXJzLmNoYWluX3NpZ25hbCwgMCwgc2l6ZW9mKGxxX3N0YS0+cGVycy5jaGFpbl9zaWduYWwpKTsKQEAgLTI4MjAsNiArMjg5NCw5IEBACiAJCQkoc3RydWN0IGl3bF9vcF9tb2RlICopbXZtX3I7CiAJc3RydWN0IGl3bF9tdm0gKm12bSA9IElXTF9PUF9NT0RFX0dFVF9NVk0ob3BfbW9kZSk7CiAKKwlpZiAoIWl3bF9tdm1fc3RhX2Zyb21fbWFjODAyMTEoc3RhKS0+dmlmKQorCQlyZXR1cm47CisKIAkvKiBTdG9wIGFueSBvbmdvaW5nIGFnZ3JlZ2F0aW9ucyBhcyBycyBzdGFydHMgb2ZmIGFzc3VtaW5nIG5vIGFnZyAqLwogCWZvciAodGlkID0gMDsgdGlkIDwgSVdMX01BWF9USURfQ09VTlQ7IHRpZCsrKQogCQlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkKTsKQEAgLTMwNTgsMTkgKzMxMzUsMjEgQEAKIAlpZiAoIWl3bF9tdm1fYnRfY29leF9pc19taW1vX2FsbG93ZWQobXZtLCBzdGEpKQogCQlnb3RvIG91dDsKIAorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCiAJLyogQ2hlY2sgaWYgZm9yY2luZyB0aGUgZGVjaXNpb24gaXMgY29uZmlndXJlZC4KIAkgKiBOb3RlIHRoYXQgU0lTTyBpcyBmb3JjZWQgYnkgbm90IGFsbG93aW5nIFNUQkMgb3IgQkZFUgogCSAqLwotCWlmIChscV9zdGEtPnNzX2ZvcmNlID09IFJTX1NTX0ZPUkNFX1NUQkMpCisJaWYgKGxxX3N0YS0+cGVycy5zc19mb3JjZSA9PSBSU19TU19GT1JDRV9TVEJDKQogCQlzc19wYXJhbXMgfD0gKExRX1NTX1NUQkNfMVNTX0FMTE9XRUQgfCBMUV9TU19GT1JDRSk7Ci0JZWxzZSBpZiAobHFfc3RhLT5zc19mb3JjZSA9PSBSU19TU19GT1JDRV9CRkVSKQorCWVsc2UgaWYgKGxxX3N0YS0+cGVycy5zc19mb3JjZSA9PSBSU19TU19GT1JDRV9CRkVSKQogCQlzc19wYXJhbXMgfD0gKExRX1NTX0JGRVJfQUxMT1dFRCB8IExRX1NTX0ZPUkNFKTsKIAotCWlmIChscV9zdGEtPnNzX2ZvcmNlICE9IFJTX1NTX0ZPUkNFX05PTkUpIHsKKwlpZiAobHFfc3RhLT5wZXJzLnNzX2ZvcmNlICE9IFJTX1NTX0ZPUkNFX05PTkUpIHsKIAkJSVdMX0RFQlVHX1JBVEUobXZtLCAiRm9yY2luZyBzaW5nbGUgc3RyZWFtIFR4IGRlY2lzaW9uICVkXG4iLAotCQkJICAgICAgIGxxX3N0YS0+c3NfZm9yY2UpOworCQkJICAgICAgIGxxX3N0YS0+cGVycy5zc19mb3JjZSk7CiAJCWdvdG8gb3V0OwogCX0KKyNlbmRpZgogCiAJaWYgKGxxX3N0YS0+c3RiY19jYXBhYmxlKQogCQlzc19wYXJhbXMgfD0gTFFfU1NfU1RCQ18xU1NfQUxMT1dFRDsKQEAgLTMxNTYsNyArMzIzNSw3IEBACiAJbHFfY21kLT5hZ2dfZnJhbWVfY250X2xpbWl0ID0gbXZtc3RhLT5tYXhfYWdnX2J1ZnNpemU7CiAKIAkvKgotCSAqIEluIGNhc2Ugb2YgbG93IGxhdGVuY3ksIHRlbGwgdGhlIGZpcndtYXJlIHRvIGxlYXZlIGEgZnJhbWUgaW4gdGhlCisJICogSW4gY2FzZSBvZiBsb3cgbGF0ZW5jeSwgdGVsbCB0aGUgZmlybXdhcmUgdG8gbGVhdmUgYSBmcmFtZSBpbiB0aGUKIAkgKiBUeCBGaWZvIHNvIHRoYXQgaXQgY2FuIHN0YXJ0IGEgdHJhbnNhY3Rpb24gaW4gdGhlIHNhbWUgVHhPUC4gVGhpcwogCSAqIGJhc2ljYWxseSBhbGxvd3MgdGhlIGZpcm13YXJlIHRvIHNlbmQgYnVyc3RzLgogCSAqLwpAQCAtMzMxMSw2ICszMzkwLDcgQEAKIAlzdHJ1Y3QgaXdsX212bSAqbXZtOwogCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwogCXN0cnVjdCByc19yYXRlICpyYXRlID0gJnRibC0+cmF0ZTsKKwl1MzIgc3NfcGFyYW1zOwogCW12bSA9IGxxX3N0YS0+cGVycy5kcnY7CiAJYnVmZiA9IGttYWxsb2MoMjA0OCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWZmKQpAQCAtMzMzMCwxNiArMzQxMCwxNiBAQAogCQkJKGlzX2xlZ2FjeShyYXRlKSkgPyAibGVnYWN5IiA6CiAJCQlpc192aHQocmF0ZSkgPyAiVkhUIiA6ICJIVCIpOwogCWlmICghaXNfbGVnYWN5KHJhdGUpKSB7Ci0JCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICIgJXMiLAorCQlkZXNjICs9IHNwcmludGYoYnVmZiArIGRlc2MsICIgJXMiLAogCQkgICAoaXNfc2lzbyhyYXRlKSkgPyAiU0lTTyIgOiAiTUlNTzIiKTsKLQkJICAgZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgIiAlcyIsCi0JCQkJICAgKGlzX2h0MjAocmF0ZSkpID8gIjIwTUh6IiA6Ci0JCQkJICAgKGlzX2h0NDAocmF0ZSkpID8gIjQwTUh6IiA6Ci0JCQkJICAgKGlzX2h0ODAocmF0ZSkpID8gIjgwTWh6IiA6ICJCQUQgQlciKTsKLQkJICAgZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgIiAlcyAlcyAlc1xuIiwKLQkJCQkgICAocmF0ZS0+c2dpKSA/ICJTR0kiIDogIk5HSSIsCi0JCQkJICAgKHJhdGUtPmxkcGMpID8gIkxEUEMiIDogIkJDQyIsCi0JCQkJICAgKGxxX3N0YS0+aXNfYWdnKSA/ICJBR0cgb24iIDogIiIpOworCQlkZXNjICs9IHNwcmludGYoYnVmZiArIGRlc2MsICIgJXMiLAorCQkJCShpc19odDIwKHJhdGUpKSA/ICIyME1IeiIgOgorCQkJCShpc19odDQwKHJhdGUpKSA/ICI0ME1IeiIgOgorCQkJCShpc19odDgwKHJhdGUpKSA/ICI4ME1oeiIgOiAiQkFEIEJXIik7CisJCWRlc2MgKz0gc3ByaW50ZihidWZmICsgZGVzYywgIiAlcyAlcyAlc1xuIiwKKwkJCQkocmF0ZS0+c2dpKSA/ICJTR0kiIDogIk5HSSIsCisJCQkJKHJhdGUtPmxkcGMpID8gIkxEUEMiIDogIkJDQyIsCisJCQkJKGxxX3N0YS0+aXNfYWdnKSA/ICJBR0cgb24iIDogIiIpOwogCX0KIAlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAibGFzdCB0eCByYXRlPTB4JVhcbiIsCiAJCQlscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzKTsKQEAgLTMzNTcsNiArMzQzNywxNiBAQAogCQkJbHFfc3RhLT5scS5hZ2dfZnJhbWVfY250X2xpbWl0KTsKIAogCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJyZWR1Y2VkIHRwYz0lZFxuIiwgbHFfc3RhLT5scS5yZWR1Y2VkX3RwYyk7CisJc3NfcGFyYW1zID0gbGUzMl90b19jcHUobHFfc3RhLT5scS5zc19wYXJhbXMpOworCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJzaW5nbGUgc3RyZWFtIHBhcmFtczogJXMlcyVzJXNcbiIsCisJCQkoc3NfcGFyYW1zICYgTFFfU1NfUEFSQU1TX1ZBTElEKSA/CisJCQkiVkFMSUQiIDogIklOVkFMSUQiLAorCQkJKHNzX3BhcmFtcyAmIExRX1NTX0JGRVJfQUxMT1dFRCkgPworCQkJIiwgQkZFUiIgOiAiIiwKKwkJCShzc19wYXJhbXMgJiBMUV9TU19TVEJDXzFTU19BTExPV0VEKSA/CisJCQkiLCBTVEJDIiA6ICIiLAorCQkJKHNzX3BhcmFtcyAmIExRX1NTX0ZPUkNFKSA/CisJCQkiLCBGT1JDRSIgOiAiIik7CiAJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywKIAkJCSJTdGFydCBpZHggWzBdPTB4JXggWzFdPTB4JXggWzJdPTB4JXggWzNdPTB4JXhcbiIsCiAJCQlscV9zdGEtPmxxLmluaXRpYWxfcmF0ZV9pbmRleFswXSwKQEAgLTM1MzMsNyArMzYyMyw3IEBACiAJfTsKIAogCXBvcyArPSBzY25wcmludGYoYnVmK3BvcywgYnVmc3otcG9zLCAiJXNcbiIsCi0JCQkgc3NfZm9yY2VfbmFtZVtscV9zdGEtPnNzX2ZvcmNlXSk7CisJCQkgc3NfZm9yY2VfbmFtZVtscV9zdGEtPnBlcnMuc3NfZm9yY2VdKTsKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CiB9CiAKQEAgLTM1NDQsMTIgKzM2MzQsMTIgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmICghc3RybmNtcCgibm9uZSIsIGJ1ZiwgNCkpIHsKLQkJbHFfc3RhLT5zc19mb3JjZSA9IFJTX1NTX0ZPUkNFX05PTkU7CisJCWxxX3N0YS0+cGVycy5zc19mb3JjZSA9IFJTX1NTX0ZPUkNFX05PTkU7CiAJfSBlbHNlIGlmICghc3RybmNtcCgic2lzbyIsIGJ1ZiwgNCkpIHsKLQkJbHFfc3RhLT5zc19mb3JjZSA9IFJTX1NTX0ZPUkNFX1NJU087CisJCWxxX3N0YS0+cGVycy5zc19mb3JjZSA9IFJTX1NTX0ZPUkNFX1NJU087CiAJfSBlbHNlIGlmICghc3RybmNtcCgic3RiYyIsIGJ1ZiwgNCkpIHsKIAkJaWYgKGxxX3N0YS0+c3RiY19jYXBhYmxlKSB7Ci0JCQlscV9zdGEtPnNzX2ZvcmNlID0gUlNfU1NfRk9SQ0VfU1RCQzsKKwkJCWxxX3N0YS0+cGVycy5zc19mb3JjZSA9IFJTX1NTX0ZPUkNFX1NUQkM7CiAJCX0gZWxzZSB7CiAJCQlJV0xfRVJSKG12bSwKIAkJCQkiY2FuJ3QgZm9yY2UgU1RCQy4gcGVlciBkb2Vzbid0IHN1cHBvcnRcbiIpOwpAQCAtMzU1Nyw3ICszNjQ3LDcgQEAKIAkJfQogCX0gZWxzZSBpZiAoIXN0cm5jbXAoImJmZXIiLCBidWYsIDQpKSB7CiAJCWlmIChscV9zdGEtPmJmZXJfY2FwYWJsZSkgewotCQkJbHFfc3RhLT5zc19mb3JjZSA9IFJTX1NTX0ZPUkNFX0JGRVI7CisJCQlscV9zdGEtPnBlcnMuc3NfZm9yY2UgPSBSU19TU19GT1JDRV9CRkVSOwogCQl9IGVsc2UgewogCQkJSVdMX0VSUihtdm0sCiAJCQkJImNhbid0IGZvcmNlIEJGRVIuIHBlZXIgZG9lc24ndCBzdXBwb3J0XG4iKTsKQEAgLTM1ODAsOSArMzY3MCwxNSBAQAogCiBNVk1fREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHNzX2ZvcmNlLCAzMik7CiAKLXN0YXRpYyB2b2lkIHJzX2FkZF9kZWJ1Z2ZzKHZvaWQgKm12bSwgdm9pZCAqbXZtX3N0YSwgc3RydWN0IGRlbnRyeSAqZGlyKQorc3RhdGljIHZvaWQgcnNfYWRkX2RlYnVnZnModm9pZCAqbXZtLCB2b2lkICpwcml2X3N0YSwgc3RydWN0IGRlbnRyeSAqZGlyKQogewotCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEgPSBtdm1fc3RhOworCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEgPSBwcml2X3N0YTsKKwlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKKworCW12bXN0YSA9IGNvbnRhaW5lcl9vZihscV9zdGEsIHN0cnVjdCBpd2xfbXZtX3N0YSwgbHFfc3RhKTsKKworCWlmICghbXZtc3RhLT52aWYpCisJCXJldHVybjsKIAogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInJhdGVfc2NhbGVfdGFibGUiLCBTX0lSVVNSIHwgU19JV1VTUiwgZGlyLAogCQkJICAgIGxxX3N0YSwgJnJzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9vcHMpOwpAQCAtMzY0Niw3ICszNzQyLDcgQEAKIAogLyoqCiAgKiBpd2xfbXZtX3R4X3Byb3RlY3Rpb24gLSBHZXRzIExRIGNvbW1hbmQsIGNoYW5nZSBpdCB0byBlbmFibGUvZGlzYWJsZQotICogVHggcHJvdGVjdGlvbiwgYWNjb3JkaW5nIHRvIHRoaXMgcnF1ZXN0IGFuZCBwcmV2aW91cyByZXF1ZXN0cywKKyAqIFR4IHByb3RlY3Rpb24sIGFjY29yZGluZyB0byB0aGlzIHJlcXVlc3QgYW5kIHByZXZpb3VzIHJlcXVlc3RzLAogICogYW5kIHNlbmQgdGhlIExRIGNvbW1hbmQuCiAgKiBAbXZtc3RhOiBUaGUgc3RhdGlvbgogICogQGVuYWJsZTogRW5hYmxlIFR4IHByb3RlY3Rpb24/CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9ycy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcnMuaAppbmRleCBkYzRlZjNkLi5lNGFhOTM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9ycy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3JzLmgKQEAgLTE3MCw2ICsxNzAsNyBAQAogCWJvb2wgc2dpOwogCWJvb2wgbGRwYzsKIAlib29sIHN0YmM7CisJYm9vbCBiZmVyOwogfTsKIAogCkBAIC0zMzEsMTQgKzMzMiwxNCBAQAogCS8qIHR4IHBvd2VyIHJlZHVjZSBmb3IgdGhpcyBzdGEgKi8KIAlpbnQgdHBjX3JlZHVjZTsKIAotCS8qIGZvcmNlIFNUQkMvQkZFUi9TSVNPIGZvciB0ZXN0aW5nICovCi0JZW51bSByc19zc19mb3JjZV9vcHQgc3NfZm9yY2U7Ci0KIAkvKiBwZXJzaXN0ZW50IGZpZWxkcyAtIGluaXRpYWxpemVkIG9ubHkgb25jZSAtIGtlZXAgbGFzdCEgKi8KIAlzdHJ1Y3QgbHFfc3RhX3BlcnMgewogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCiAJCXUzMiBkYmdfZml4ZWRfcmF0ZTsKIAkJdTggZGJnX2ZpeGVkX3R4cF9yZWR1Y3Rpb247CisKKwkJLyogZm9yY2UgU1RCQy9CRkVSL1NJU08gZm9yIHRlc3RpbmcgKi8KKwkJZW51bSByc19zc19mb3JjZV9vcHQgc3NfZm9yY2U7CiAjZW5kaWYKIAkJdTggY2hhaW5zOwogCQlzOCBjaGFpbl9zaWduYWxbSUVFRTgwMjExX01BWF9DSEFJTlNdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3J4LmMKaW5kZXggZjkyMjEzMS4uNzhlYzdkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9yeC5jCkBAIC02LDcgKzYsNyBAQAogICogR1BMIExJQ0VOU0UgU1VNTUFSWQogICoKICAqIENvcHlyaWdodChjKSAyMDEyIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBNb2JpbGUgQ29tbXVuaWNhdGlvbnMgR21iSAorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE1IEludGVsIE1vYmlsZSBDb21tdW5pY2F0aW9ucyBHbWJICiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCkBAIC0zMiw3ICszMiw3IEBACiAgKiBCU0QgTElDRU5TRQogICoKICAqIENvcHlyaWdodChjKSAyMDEyIC0gMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIENvcHlyaWdodChjKSAyMDEzIC0gMjAxNCBJbnRlbCBNb2JpbGUgQ29tbXVuaWNhdGlvbnMgR21iSAorICogQ29weXJpZ2h0KGMpIDIwMTMgLSAyMDE1IEludGVsIE1vYmlsZSBDb21tdW5pY2F0aW9ucyBHbWJICiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dApAQCAtMzQ1LDYgKzM0NSwyNSBAQAogCQlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YTsKIAkJbXZtc3RhID0gaXdsX212bV9zdGFfZnJvbV9tYWM4MDIxMShzdGEpOwogCQlyc191cGRhdGVfbGFzdF9yc3NpKG12bSwgJm12bXN0YS0+bHFfc3RhLCByeF9zdGF0dXMpOworCisJCWlmIChpd2xfZndfZGJnX3RyaWdnZXJfZW5hYmxlZChtdm0tPmZ3LCBGV19EQkdfVFJJR0dFUl9SU1NJKSAmJgorCQkgICAgaWVlZTgwMjExX2lzX2JlYWNvbihoZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCQlzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RsdiAqdHJpZzsKKwkJCXN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfbG93X3Jzc2kgKnJzc2lfdHJpZzsKKwkJCWJvb2wgdHJpZ19jaGVjazsKKwkJCXMzMiByc3NpOworCisJCQl0cmlnID0gaXdsX2Z3X2RiZ19nZXRfdHJpZ2dlcihtdm0tPmZ3LAorCQkJCQkJICAgICAgRldfREJHX1RSSUdHRVJfUlNTSSk7CisJCQlyc3NpX3RyaWcgPSAodm9pZCAqKXRyaWctPmRhdGE7CisJCQlyc3NpID0gbGUzMl90b19jcHUocnNzaV90cmlnLT5yc3NpKTsKKworCQkJdHJpZ19jaGVjayA9CisJCQkJaXdsX2Z3X2RiZ190cmlnZ2VyX2NoZWNrX3N0b3AobXZtLCBtdm1zdGEtPnZpZiwKKwkJCQkJCQkgICAgICB0cmlnKTsKKwkJCWlmICh0cmlnX2NoZWNrICYmIHJ4X3N0YXR1cy0+c2lnbmFsIDwgcnNzaSkKKwkJCQlpd2xfbXZtX2Z3X2RiZ19jb2xsZWN0X3RyaWcobXZtLCB0cmlnLCBOVUxMKTsKKwkJfQogCX0KIAogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtNDE2LDM1ICs0MzUsNDMgQEAKIH0KIAogc3RhdGljIHZvaWQgaXdsX212bV91cGRhdGVfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJCQkgc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICpzdGF0cykKKwkJCQkJIHN0cnVjdCBtdm1fc3RhdGlzdGljc19yeCAqcnhfc3RhdHMpCiB7Ci0JLyoKLQkgKiBOT1RFIEZXIGFnZ3JlZ2F0ZXMgdGhlIHN0YXRpc3RpY3MgLSBCVVQgdGhlIHN0YXRpc3RpY3MgYXJlIGNsZWFyZWQKLQkgKiB3aGVuIHRoZSBkcml2ZXIgaXNzdWVzIFJFUExZX1NUQVRJU1RJQ1NfQ01EIDB4OWMgd2l0aCBDTEVBUl9TVEFUUwotCSAqIGJpdCBzZXQuCi0JICovCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbXZtLT5tdXRleCk7Ci0JbWVtY3B5KCZtdm0tPnJ4X3N0YXRzLCAmc3RhdHMtPnJ4LCBzaXplb2Yoc3RydWN0IG12bV9zdGF0aXN0aWNzX3J4KSk7CisKKwltdm0tPnJ4X3N0YXRzID0gKnJ4X3N0YXRzOwogfQogCiBzdHJ1Y3QgaXdsX212bV9zdGF0X2RhdGEgewotCXN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyAqc3RhdHM7CiAJc3RydWN0IGl3bF9tdm0gKm12bTsKKwlfX2xlMzIgbWFjX2lkOworCV9fczggYmVhY29uX2ZpbHRlcl9hdmVyYWdlX2VuZXJneTsKKwlzdHJ1Y3QgbXZtX3N0YXRpc3RpY3NfZ2VuZXJhbF92OCAqZ2VuZXJhbDsKIH07CiAKIHN0YXRpYyB2b2lkIGl3bF9tdm1fc3RhdF9pdGVyYXRvcih2b2lkICpfZGF0YSwgdTggKm1hYywKIAkJCQkgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7CiAJc3RydWN0IGl3bF9tdm1fc3RhdF9kYXRhICpkYXRhID0gX2RhdGE7Ci0Jc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICpzdGF0cyA9IGRhdGEtPnN0YXRzOwogCXN0cnVjdCBpd2xfbXZtICptdm0gPSBkYXRhLT5tdm07Ci0JaW50IHNpZyA9IC1zdGF0cy0+Z2VuZXJhbC5iZWFjb25fZmlsdGVyX2F2ZXJhZ2VfZW5lcmd5OworCWludCBzaWcgPSAtZGF0YS0+YmVhY29uX2ZpbHRlcl9hdmVyYWdlX2VuZXJneTsKIAlpbnQgbGFzdF9ldmVudDsKIAlpbnQgdGhvbGQgPSB2aWYtPmJzc19jb25mLmNxbV9yc3NpX3Rob2xkOwogCWludCBoeXN0ID0gdmlmLT5ic3NfY29uZi5jcW1fcnNzaV9oeXN0OwotCXUxNiBpZCA9IGxlMzJfdG9fY3B1KHN0YXRzLT5yeC5nZW5lcmFsLm1hY19pZCk7CisJdTE2IGlkID0gbGUzMl90b19jcHUoZGF0YS0+bWFjX2lkKTsKIAlzdHJ1Y3QgaXdsX212bV92aWYgKm12bXZpZiA9IGl3bF9tdm1fdmlmX2Zyb21fbWFjODAyMTEodmlmKTsKIAorCS8qIFRoaXMgZG9lc24ndCBuZWVkIHRoZSBNQUMgSUQgY2hlY2sgc2luY2UgaXQncyBub3QgdGFraW5nIHRoZQorCSAqIGRhdGEgY29waWVkIGludG8gdGhlICJkYXRhIiBzdHJ1Y3QsIGJ1dCByYXRoZXIgdGhlIGRhdGEgZnJvbQorCSAqIHRoZSBub3RpZmljYXRpb24gZGlyZWN0bHkuCisJICovCisJaWYgKGRhdGEtPmdlbmVyYWwpIHsKKwkJbXZtdmlmLT5iZWFjb25fc3RhdHMubnVtX2JlYWNvbnMgPQorCQkJbGUzMl90b19jcHUoZGF0YS0+Z2VuZXJhbC0+YmVhY29uX2NvdW50ZXJbbXZtdmlmLT5pZF0pOworCQltdm12aWYtPmJlYWNvbl9zdGF0cy5hdmdfc2lnbmFsID0KKwkJCS1kYXRhLT5nZW5lcmFsLT5iZWFjb25fYXZlcmFnZV9lbmVyZ3lbbXZtdmlmLT5pZF07CisJfQorCiAJaWYgKG12bXZpZi0+aWQgIT0gaWQpCiAJCXJldHVybjsKIApAQCAtNTAwLDM0ICs1MjcsMTAxIEBACiAJfQogfQogCi0vKgotICogaXdsX212bV9yeF9zdGF0aXN0aWNzIC0gU1RBVElTVElDU19OT1RJRklDQVRJT04gaGFuZGxlcgotICoKLSAqIFRPRE86IFRoaXMgaGFuZGxlciBpcyBpbXBsZW1lbnRlZCBwYXJ0aWFsbHkuCi0gKi8KLWludCBpd2xfbXZtX3J4X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9tdm0gKm12bSwKLQkJCSAgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIsCi0JCQkgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKQorc3RhdGljIGlubGluZSB2b2lkCitpd2xfbXZtX3J4X3N0YXRzX2NoZWNrX3RyaWdnZXIoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkKIHsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgKnN0YXRzID0gKHZvaWQgKikmcGt0LT5kYXRhOworCXN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfdGx2ICp0cmlnOworCXN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfc3RhdHMgKnRyaWdfc3RhdHM7CisJdTMyIHRyaWdfb2Zmc2V0LCB0cmlnX3Rob2xkOworCisJaWYgKCFpd2xfZndfZGJnX3RyaWdnZXJfZW5hYmxlZChtdm0tPmZ3LCBGV19EQkdfVFJJR0dFUl9TVEFUUykpCisJCXJldHVybjsKKworCXRyaWcgPSBpd2xfZndfZGJnX2dldF90cmlnZ2VyKG12bS0+ZncsIEZXX0RCR19UUklHR0VSX1NUQVRTKTsKKwl0cmlnX3N0YXRzID0gKHZvaWQgKil0cmlnLT5kYXRhOworCisJaWYgKCFpd2xfZndfZGJnX3RyaWdnZXJfY2hlY2tfc3RvcChtdm0sIE5VTEwsIHRyaWcpKQorCQlyZXR1cm47CisKKwl0cmlnX29mZnNldCA9IGxlMzJfdG9fY3B1KHRyaWdfc3RhdHMtPnN0b3Bfb2Zmc2V0KTsKKwl0cmlnX3Rob2xkID0gbGUzMl90b19jcHUodHJpZ19zdGF0cy0+c3RvcF90aHJlc2hvbGQpOworCisJaWYgKFdBUk5fT05fT05DRSh0cmlnX29mZnNldCA+PSBpd2xfcnhfcGFja2V0X3BheWxvYWRfbGVuKHBrdCkpKQorCQlyZXR1cm47CisKKwlpZiAobGUzMl90b19jcHVwKChfX2xlMzIgKikgKHBrdC0+ZGF0YSArIHRyaWdfb2Zmc2V0KSkgPCB0cmlnX3Rob2xkKQorCQlyZXR1cm47CisKKwlpd2xfbXZtX2Z3X2RiZ19jb2xsZWN0X3RyaWcobXZtLCB0cmlnLCBOVUxMKTsKK30KKwordm9pZCBpd2xfbXZtX2hhbmRsZV9yeF9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KQoreworCXNpemVfdCB2OF9sZW4gPSBzaXplb2Yoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzX3Y4KTsKKwlzaXplX3QgdjEwX2xlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3NfdjEwKTsKIAlzdHJ1Y3QgaXdsX212bV9zdGF0X2RhdGEgZGF0YSA9IHsKLQkJLnN0YXRzID0gc3RhdHMsCiAJCS5tdm0gPSBtdm0sCiAJfTsKKwl1MzIgdGVtcGVyYXR1cmU7CisKKwlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5hcGlbMF0gJiBJV0xfVUNPREVfVExWX0FQSV9TVEFUU19WMTApIHsKKwkJc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzX3YxMCAqc3RhdHMgPSAodm9pZCAqKSZwa3QtPmRhdGE7CisKKwkJaWYgKGl3bF9yeF9wYWNrZXRfcGF5bG9hZF9sZW4ocGt0KSAhPSB2MTBfbGVuKQorCQkJZ290byBpbnZhbGlkOworCisJCXRlbXBlcmF0dXJlID0gbGUzMl90b19jcHUoc3RhdHMtPmdlbmVyYWwucmFkaW9fdGVtcGVyYXR1cmUpOworCQlkYXRhLm1hY19pZCA9IHN0YXRzLT5yeC5nZW5lcmFsLm1hY19pZDsKKwkJZGF0YS5iZWFjb25fZmlsdGVyX2F2ZXJhZ2VfZW5lcmd5ID0KKwkJCXN0YXRzLT5nZW5lcmFsLmJlYWNvbl9maWx0ZXJfYXZlcmFnZV9lbmVyZ3k7CisKKwkJaXdsX212bV91cGRhdGVfcnhfc3RhdGlzdGljcyhtdm0sICZzdGF0cy0+cngpOworCisJCW12bS0+cmFkaW9fc3RhdHMucnhfdGltZSA9IGxlNjRfdG9fY3B1KHN0YXRzLT5nZW5lcmFsLnJ4X3RpbWUpOworCQltdm0tPnJhZGlvX3N0YXRzLnR4X3RpbWUgPSBsZTY0X3RvX2NwdShzdGF0cy0+Z2VuZXJhbC50eF90aW1lKTsKKwkJbXZtLT5yYWRpb19zdGF0cy5vbl90aW1lX3JmID0KKwkJCWxlNjRfdG9fY3B1KHN0YXRzLT5nZW5lcmFsLm9uX3RpbWVfcmYpOworCQltdm0tPnJhZGlvX3N0YXRzLm9uX3RpbWVfc2NhbiA9CisJCQlsZTY0X3RvX2NwdShzdGF0cy0+Z2VuZXJhbC5vbl90aW1lX3NjYW4pOworCisJCWRhdGEuZ2VuZXJhbCA9ICZzdGF0cy0+Z2VuZXJhbDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3NfdjggKnN0YXRzID0gKHZvaWQgKikmcGt0LT5kYXRhOworCisJCWlmIChpd2xfcnhfcGFja2V0X3BheWxvYWRfbGVuKHBrdCkgIT0gdjhfbGVuKQorCQkJZ290byBpbnZhbGlkOworCisJCXRlbXBlcmF0dXJlID0gbGUzMl90b19jcHUoc3RhdHMtPmdlbmVyYWwucmFkaW9fdGVtcGVyYXR1cmUpOworCQlkYXRhLm1hY19pZCA9IHN0YXRzLT5yeC5nZW5lcmFsLm1hY19pZDsKKwkJZGF0YS5iZWFjb25fZmlsdGVyX2F2ZXJhZ2VfZW5lcmd5ID0KKwkJCXN0YXRzLT5nZW5lcmFsLmJlYWNvbl9maWx0ZXJfYXZlcmFnZV9lbmVyZ3k7CisKKwkJaXdsX212bV91cGRhdGVfcnhfc3RhdGlzdGljcyhtdm0sICZzdGF0cy0+cngpOworCX0KKworCWl3bF9tdm1fcnhfc3RhdHNfY2hlY2tfdHJpZ2dlcihtdm0sIHBrdCk7CiAKIAkvKiBPbmx5IGhhbmRsZSByeCBzdGF0aXN0aWNzIHRlbXBlcmF0dXJlIGNoYW5nZXMgaWYgYXN5bmMgdGVtcAogCSAqIG5vdGlmaWNhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQKIAkgKi8KIAlpZiAoIShtdm0tPmZ3LT51Y29kZV9jYXBhLmFwaVswXSAmIElXTF9VQ09ERV9UTFZfQVBJX0FTWU5DX0RUTSkpCi0JCWl3bF9tdm1fdHRfdGVtcF9jaGFuZ2VkKG12bSwKLQkJCQlsZTMyX3RvX2NwdShzdGF0cy0+Z2VuZXJhbC5yYWRpb190ZW1wZXJhdHVyZSkpOwotCi0JaXdsX212bV91cGRhdGVfcnhfc3RhdGlzdGljcyhtdm0sIHN0YXRzKTsKKwkJaXdsX212bV90dF90ZW1wX2NoYW5nZWQobXZtLCB0ZW1wZXJhdHVyZSk7CiAKIAlpZWVlODAyMTFfaXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlcyhtdm0tPmh3LAogCQkJCQkgICAgSUVFRTgwMjExX0lGQUNFX0lURVJfTk9STUFMLAogCQkJCQkgICAgaXdsX212bV9zdGF0X2l0ZXJhdG9yLAogCQkJCQkgICAgJmRhdGEpOworCXJldHVybjsKKyBpbnZhbGlkOgorCUlXTF9FUlIobXZtLCAicmVjZWl2ZWQgaW52YWxpZCBzdGF0aXN0aWNzIHNpemUgKCVkKSFcbiIsCisJCWl3bF9yeF9wYWNrZXRfcGF5bG9hZF9sZW4ocGt0KSk7Cit9CisKK2ludCBpd2xfbXZtX3J4X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCSAgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIsCisJCQkgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKQoreworCWl3bF9tdm1faGFuZGxlX3J4X3N0YXRpc3RpY3MobXZtLCByeGJfYWRkcihyeGIpKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3NjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3NjYW4uYwppbmRleCA3ZTlhYTNjLi43NGUxYzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc2Nhbi5jCkBAIC04Miw2ICs4Miw3IEBACiAJc3RydWN0IF9kd2VsbCB7CiAJCXUxNiBwYXNzaXZlOwogCQl1MTYgYWN0aXZlOworCQl1MTYgZnJhZ21lbnRlZDsKIAl9IGR3ZWxsW0lFRUU4MDIxMV9OVU1fQkFORFNdOwogfTsKIApAQCAtMTkxLDEwMSArMTkyLDYgQEAKIAlyZXR1cm4gYmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haID8gMTAwICsgMjAgOiAxMDAgKyAxMDsKIH0KIAotc3RhdGljIHZvaWQgaXdsX212bV9zY2FuX2ZpbGxfY2hhbm5lbHMoc3RydWN0IGl3bF9zY2FuX2NtZCAqY21kLAotCQkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEsCi0JCQkJICAgICAgIGJvb2wgYmFzaWNfc3NpZCwKLQkJCQkgICAgICAgc3RydWN0IGl3bF9tdm1fc2Nhbl9wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbCAqY2hhbiA9IChzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbCAqKQotCQkoY21kLT5kYXRhICsgbGUxNl90b19jcHUoY21kLT50eF9jbWQubGVuKSk7Ci0JaW50IGk7Ci0JaW50IHR5cGUgPSBCSVQocmVxLT5uX3NzaWRzKSAtIDE7Ci0JZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kID0gcmVxLT5jaGFubmVsc1swXS0+YmFuZDsKLQotCWlmICghYmFzaWNfc3NpZCkKLQkJdHlwZSB8PSBCSVQocmVxLT5uX3NzaWRzKTsKLQotCWZvciAoaSA9IDA7IGkgPCBjbWQtPmNoYW5uZWxfY291bnQ7IGkrKykgewotCQljaGFuLT5jaGFubmVsID0gY3B1X3RvX2xlMTYocmVxLT5jaGFubmVsc1tpXS0+aHdfdmFsdWUpOwotCQljaGFuLT50eXBlID0gY3B1X3RvX2xlMzIodHlwZSk7Ci0JCWlmIChyZXEtPmNoYW5uZWxzW2ldLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX05PX0lSKQotCQkJY2hhbi0+dHlwZSAmPSBjcHVfdG9fbGUzMih+U0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFKTsKLQkJY2hhbi0+YWN0aXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYocGFyYW1zLT5kd2VsbFtiYW5kXS5hY3RpdmUpOwotCQljaGFuLT5wYXNzaXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYocGFyYW1zLT5kd2VsbFtiYW5kXS5wYXNzaXZlKTsKLQkJY2hhbi0+aXRlcmF0aW9uX2NvdW50ID0gY3B1X3RvX2xlMTYoMSk7Ci0JCWNoYW4rKzsKLQl9Ci19Ci0KLS8qCi0gKiBGaWxsIGluIHByb2JlIHJlcXVlc3Qgd2l0aCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6Ci0gKiBUQSBpcyBvdXIgdmlmIEhXIGFkZHJlc3MsIHdoaWNoIG1hYzgwMjExIGVuc3VyZXMgd2UgaGF2ZS4KLSAqIFBhY2tldCBpcyBicm9hZGNhc3RlZCwgc28gdGhpcyBpcyBib3RoIFNBIGFuZCBEQS4KLSAqIFRoZSBwcm9iZSByZXF1ZXN0IElFIGlzIG1hZGUgb3V0IG9mIHR3bzogZmlyc3QgY29tZXMgdGhlIG1vc3QgcHJpb3JpdGl6ZWQKLSAqIFNTSUQgaWYgYSBkaXJlY3RlZCBzY2FuIGlzIHJlcXVlc3RlZC4gU2Vjb25kIGNvbWVzIHdoYXRldmVyIGV4dHJhCi0gKiBpbmZvcm1hdGlvbiB3YXMgZ2l2ZW4gdG8gdXMgYXMgdGhlIHNjYW4gcmVxdWVzdCBJRS4KLSAqLwotc3RhdGljIHUxNiBpd2xfbXZtX2ZpbGxfcHJvYmVfcmVxKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqZnJhbWUsIGNvbnN0IHU4ICp0YSwKLQkJCQkgIGludCBuX3NzaWRzLCBjb25zdCB1OCAqc3NpZCwgaW50IHNzaWRfbGVuLAotCQkJCSAgY29uc3QgdTggKmJhbmRfaWUsIGludCBiYW5kX2llX2xlbiwKLQkJCQkgIGNvbnN0IHU4ICpjb21tb25faWUsIGludCBjb21tb25faWVfbGVuLAotCQkJCSAgaW50IGxlZnQpCi17Ci0JaW50IGxlbiA9IDA7Ci0JdTggKnBvcyA9IE5VTEw7Ci0KLQkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciB0aGUgcHJvYmUgcmVxdWVzdCwKLQkgKiB0d28gbWFuZGF0b3J5IElFcyBhbmQgdGhlIGRhdGEgKi8KLQlsZWZ0IC09IDI0OwotCWlmIChsZWZ0IDwgMCkKLQkJcmV0dXJuIDA7Ci0KLQlmcmFtZS0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpOwotCWV0aF9icm9hZGNhc3RfYWRkcihmcmFtZS0+ZGEpOwotCW1lbWNweShmcmFtZS0+c2EsIHRhLCBFVEhfQUxFTik7Ci0JZXRoX2Jyb2FkY2FzdF9hZGRyKGZyYW1lLT5ic3NpZCk7Ci0JZnJhbWUtPnNlcV9jdHJsID0gMDsKLQotCWxlbiArPSAyNDsKLQotCS8qIGZvciBwYXNzaXZlIHNjYW5zLCBubyBuZWVkIHRvIGZpbGwgYW55dGhpbmcgKi8KLQlpZiAobl9zc2lkcyA9PSAwKQotCQlyZXR1cm4gKHUxNilsZW47Ci0KLQkvKiBwb2ludHMgdG8gdGhlIHBheWxvYWQgb2YgdGhlIHJlcXVlc3QgKi8KLQlwb3MgPSAmZnJhbWUtPnUucHJvYmVfcmVxLnZhcmlhYmxlWzBdOwotCi0JLyogZmlsbCBpbiBvdXIgU1NJRCBJRSAqLwotCWxlZnQgLT0gc3NpZF9sZW4gKyAyOwotCWlmIChsZWZ0IDwgMCkKLQkJcmV0dXJuIDA7Ci0JKnBvcysrID0gV0xBTl9FSURfU1NJRDsKLQkqcG9zKysgPSBzc2lkX2xlbjsKLQlpZiAoc3NpZCAmJiBzc2lkX2xlbikgeyAvKiBzc2lkX2xlbiBtYXkgYmUgPT0gMCBldmVuIGlmIHNzaWQgaXMgdmFsaWQgKi8KLQkJbWVtY3B5KHBvcywgc3NpZCwgc3NpZF9sZW4pOwotCQlwb3MgKz0gc3NpZF9sZW47Ci0JfQotCi0JbGVuICs9IHNzaWRfbGVuICsgMjsKLQotCWlmIChXQVJOX09OKGxlZnQgPCBiYW5kX2llX2xlbiArIGNvbW1vbl9pZV9sZW4pKQotCQlyZXR1cm4gbGVuOwotCi0JaWYgKGJhbmRfaWUgJiYgYmFuZF9pZV9sZW4pIHsKLQkJbWVtY3B5KHBvcywgYmFuZF9pZSwgYmFuZF9pZV9sZW4pOwotCQlwb3MgKz0gYmFuZF9pZV9sZW47Ci0JCWxlbiArPSBiYW5kX2llX2xlbjsKLQl9Ci0KLQlpZiAoY29tbW9uX2llICYmIGNvbW1vbl9pZV9sZW4pIHsKLQkJbWVtY3B5KHBvcywgY29tbW9uX2llLCBjb21tb25faWVfbGVuKTsKLQkJcG9zICs9IGNvbW1vbl9pZV9sZW47Ci0JCWxlbiArPSBjb21tb25faWVfbGVuOwotCX0KLQotCXJldHVybiAodTE2KWxlbjsKLX0KLQogc3RhdGljIHZvaWQgaXdsX212bV9zY2FuX2NvbmRpdGlvbl9pdGVyYXRvcih2b2lkICpkYXRhLCB1OCAqbWFjLAogCQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKQEAgLTMyNSw3ICsyMzEsNyBAQAogCQkJICogSWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBhY3RpdmUgaW50ZXJmYWNlIG1ha2UKIAkJCSAqIHBhc3NpdmUgc2NhbiBtb3JlIGZyYWdtZW50ZWQuCiAJCQkgKi8KLQkJCWZyYWdfcGFzc2l2ZV9kd2VsbCA9IChnbG9iYWxfY250IDwgMikgPyA0MCA6IDIwOworCQkJZnJhZ19wYXNzaXZlX2R3ZWxsID0gNDA7CiAJCQlwYXJhbXMtPm1heF9vdXRfdGltZSA9IGZyYWdfcGFzc2l2ZV9kd2VsbDsKIAkJfSBlbHNlIHsKIAkJCXBhcmFtcy0+c3VzcGVuZF90aW1lID0gMTIwOwpAQCAtMzU4LDEwICsyNjQsMTAgQEAKIAogCWZvciAoYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7IGJhbmQgPCBJRUVFODAyMTFfTlVNX0JBTkRTOyBiYW5kKyspIHsKIAkJaWYgKHBhcmFtcy0+cGFzc2l2ZV9mcmFnbWVudGVkKQotCQkJcGFyYW1zLT5kd2VsbFtiYW5kXS5wYXNzaXZlID0gZnJhZ19wYXNzaXZlX2R3ZWxsOwotCQllbHNlCi0JCQlwYXJhbXMtPmR3ZWxsW2JhbmRdLnBhc3NpdmUgPQotCQkJCWl3bF9tdm1fZ2V0X3Bhc3NpdmVfZHdlbGwobXZtLCBiYW5kKTsKKwkJCXBhcmFtcy0+ZHdlbGxbYmFuZF0uZnJhZ21lbnRlZCA9IGZyYWdfcGFzc2l2ZV9kd2VsbDsKKworCQlwYXJhbXMtPmR3ZWxsW2JhbmRdLnBhc3NpdmUgPSBpd2xfbXZtX2dldF9wYXNzaXZlX2R3ZWxsKG12bSwKKwkJCQkJCQkJCWJhbmQpOwogCQlwYXJhbXMtPmR3ZWxsW2JhbmRdLmFjdGl2ZSA9IGl3bF9tdm1fZ2V0X2FjdGl2ZV9kd2VsbChtdm0sIGJhbmQsCiAJCQkJCQkJCSAgICAgIG5fc3NpZHMpOwogCX0KQEAgLTM3OSwyMCArMjg1LDExIEBACiB7CiAJaW50IG1heF9wcm9iZV9sZW47CiAKLQlpZiAobXZtLT5mdy0+dWNvZGVfY2FwYS5hcGlbMF0gJiBJV0xfVUNPREVfVExWX0FQSV9MTUFDX1NDQU4pCi0JCW1heF9wcm9iZV9sZW4gPSBTQ0FOX09GRkxPQURfUFJPQkVfUkVRX1NJWkU7Ci0JZWxzZQotCQltYXhfcHJvYmVfbGVuID0gbXZtLT5mdy0+dWNvZGVfY2FwYS5tYXhfcHJvYmVfbGVuZ3RoOworCW1heF9wcm9iZV9sZW4gPSBTQ0FOX09GRkxPQURfUFJPQkVfUkVRX1NJWkU7CiAKIAkvKiB3ZSBjcmVhdGUgdGhlIDgwMi4xMSBoZWFkZXIgYW5kIFNTSUQgZWxlbWVudCAqLwogCW1heF9wcm9iZV9sZW4gLT0gMjQgKyAyOwogCi0JLyogYmFzaWMgc3NpZCBpcyBhZGRlZCBvbmx5IGZvciBod19zY2FuIHdpdGggYW5kIG9sZCBhcGkgKi8KLQlpZiAoIShtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYgSVdMX1VDT0RFX1RMVl9GTEFHU19OT19CQVNJQ19TU0lEKSAmJgotCSAgICAhKG12bS0+ZnctPnVjb2RlX2NhcGEuYXBpWzBdICYgSVdMX1VDT0RFX1RMVl9BUElfTE1BQ19TQ0FOKSAmJgotCSAgICAhaXNfc2NoZWRfc2NhbikKLQkJbWF4X3Byb2JlX2xlbiAtPSAzMjsKLQogCS8qIERTIHBhcmFtZXRlciBzZXQgZWxlbWVudCBpcyBhZGRlZCBvbiAyLjRHSFogYmFuZCBpZiByZXF1aXJlZCAqLwogCWlmIChpd2xfbXZtX3JybV9zY2FuX25lZWRlZChtdm0pKQogCQltYXhfcHJvYmVfbGVuIC09IDM7CkBAIC00MDQsOSArMzAxLDYgQEAKIHsKIAlpbnQgbWF4X2llX2xlbiA9IGl3bF9tdm1fbWF4X3NjYW5faWVfZndfY21kX3Jvb20obXZtLCBpc19zY2hlZF9zY2FuKTsKIAotCWlmICghKG12bS0+ZnctPnVjb2RlX2NhcGEuYXBpWzBdICYgSVdMX1VDT0RFX1RMVl9BUElfTE1BQ19TQ0FOKSkKLQkJcmV0dXJuIG1heF9pZV9sZW47Ci0KIAkvKiBUT0RPOiBbQlVHXSBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIG1heGltdW0gYWxsb3dlZCBzaXplIG9mCiAJICogc2NhbiBJRXMsIGhvd2V2ZXIgdGhlIExNQUMgc2NhbiBhcGkgY29udGFpbnMgYm90aCAyR0haIGFuZCA1R0haIElFcwogCSAqIGluIHRoZSBzYW1lIGNvbW1hbmQuIFNvIHRoZSBjb3JyZWN0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24KQEAgLTQyMCwxMjkgKzMxNCw2IEBACiAJcmV0dXJuIG1heF9pZV9sZW47CiB9CiAKLWludCBpd2xfbXZtX3NjYW5fcmVxdWVzdChzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBpd2xfaG9zdF9jbWQgaGNtZCA9IHsKLQkJLmlkID0gU0NBTl9SRVFVRVNUX0NNRCwKLQkJLmxlbiA9IHsgMCwgfSwKLQkJLmRhdGEgPSB7IG12bS0+c2Nhbl9jbWQsIH0sCi0JCS5kYXRhZmxhZ3MgPSB7IElXTF9IQ01EX0RGTF9OT0NPUFksIH0sCi0JfTsKLQlzdHJ1Y3QgaXdsX3NjYW5fY21kICpjbWQgPSBtdm0tPnNjYW5fY21kOwotCWludCByZXQ7Ci0JdTMyIHN0YXR1czsKLQlpbnQgc3NpZF9sZW4gPSAwOwotCXU4ICpzc2lkID0gTlVMTDsKLQlib29sIGJhc2ljX3NzaWQgPSAhKG12bS0+ZnctPnVjb2RlX2NhcGEuZmxhZ3MgJgotCQkJICAgSVdMX1VDT0RFX1RMVl9GTEFHU19OT19CQVNJQ19TU0lEKTsKLQlzdHJ1Y3QgaXdsX212bV9zY2FuX3BhcmFtcyBwYXJhbXMgPSB7fTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwotCi0JLyogd2Ugc2hvdWxkIGhhdmUgZmFpbGVkIHJlZ2lzdHJhdGlvbiBpZiBzY2FuX2NtZCB3YXMgTlVMTCAqLwotCWlmIChXQVJOX09OKG12bS0+c2Nhbl9jbWQgPT0gTlVMTCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JSVdMX0RFQlVHX1NDQU4obXZtLCAiSGFuZGxpbmcgbWFjODAyMTEgc2NhbiByZXF1ZXN0XG4iKTsKLQltdm0tPnNjYW5fc3RhdHVzID0gSVdMX01WTV9TQ0FOX09TOwotCW1lbXNldChjbWQsIDAsIGtzaXplKGNtZCkpOwotCi0JY21kLT5jaGFubmVsX2NvdW50ID0gKHU4KXJlcS0+bl9jaGFubmVsczsKLQljbWQtPnF1aWV0X3RpbWUgPSBjcHVfdG9fbGUxNihJV0xfQUNUSVZFX1FVSUVUX1RJTUUpOwotCWNtZC0+cXVpZXRfcGxjcF90aCA9IGNwdV90b19sZTE2KElXTF9QTENQX1FVSUVUX1RIUkVTSCk7Ci0JY21kLT5yeGNoYWluX3NlbF9mbGFncyA9IGl3bF9tdm1fc2Nhbl9yeF9jaGFpbihtdm0pOwotCi0JaXdsX212bV9zY2FuX2NhbGNfcGFyYW1zKG12bSwgdmlmLCByZXEtPm5fc3NpZHMsIHJlcS0+ZmxhZ3MsICZwYXJhbXMpOwotCWNtZC0+bWF4X291dF90aW1lID0gY3B1X3RvX2xlMzIocGFyYW1zLm1heF9vdXRfdGltZSk7Ci0JY21kLT5zdXNwZW5kX3RpbWUgPSBjcHVfdG9fbGUzMihwYXJhbXMuc3VzcGVuZF90aW1lKTsKLQlpZiAocGFyYW1zLnBhc3NpdmVfZnJhZ21lbnRlZCkKLQkJY21kLT5zY2FuX2ZsYWdzIHw9IFNDQU5fRkxBR1NfRlJBR01FTlRFRF9TQ0FOOwotCi0JY21kLT5yeG9uX2ZsYWdzID0gaXdsX212bV9zY2FuX3J4b25fZmxhZ3MocmVxLT5jaGFubmVsc1swXS0+YmFuZCk7Ci0JY21kLT5maWx0ZXJfZmxhZ3MgPSBjcHVfdG9fbGUzMihNQUNfRklMVEVSX0FDQ0VQVF9HUlAgfAotCQkJCQlNQUNfRklMVEVSX0lOX0JFQUNPTik7Ci0KLQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpCi0JCWNtZC0+dHlwZSA9IGNwdV90b19sZTMyKFNDQU5fVFlQRV9ESVNDT1ZFUllfRk9SQ0VEKTsKLQllbHNlCi0JCWNtZC0+dHlwZSA9IGNwdV90b19sZTMyKFNDQU5fVFlQRV9GT1JDRUQpOwotCi0JY21kLT5yZXBlYXRzID0gY3B1X3RvX2xlMzIoMSk7Ci0KLQkvKgotCSAqIElmIHRoZSB1c2VyIGFza2VkIGZvciBwYXNzaXZlIHNjYW4sIGRvbid0IGNoYW5nZSB0byBhY3RpdmUgc2NhbiBpZgotCSAqIHlvdSBzZWUgYW55IGFjdGl2aXR5IG9uIHRoZSBjaGFubmVsIC0gcmVtYWluIHBhc3NpdmUuCi0JICovCi0JaWYgKHJlcS0+bl9zc2lkcyA+IDApIHsKLQkJY21kLT5wYXNzaXZlMmFjdGl2ZSA9IGNwdV90b19sZTE2KDEpOwotCQljbWQtPnNjYW5fZmxhZ3MgfD0gU0NBTl9GTEFHU19QQVNTSVZFMkFDVElWRTsKLQkJaWYgKGJhc2ljX3NzaWQpIHsKLQkJCXNzaWQgPSByZXEtPnNzaWRzWzBdLnNzaWQ7Ci0JCQlzc2lkX2xlbiA9IHJlcS0+c3NpZHNbMF0uc3NpZF9sZW47Ci0JCX0KLQl9IGVsc2UgewotCQljbWQtPnBhc3NpdmUyYWN0aXZlID0gMDsKLQkJY21kLT5zY2FuX2ZsYWdzICY9IH5TQ0FOX0ZMQUdTX1BBU1NJVkUyQUNUSVZFOwotCX0KLQotCWl3bF9tdm1fc2Nhbl9maWxsX3NzaWRzKGNtZC0+ZGlyZWN0X3NjYW4sIHJlcS0+c3NpZHMsIHJlcS0+bl9zc2lkcywKLQkJCQliYXNpY19zc2lkID8gMSA6IDApOwotCi0JY21kLT50eF9jbWQudHhfZmxhZ3MgPSBjcHVfdG9fbGUzMihUWF9DTURfRkxHX1NFUV9DVEwgfAotCQkJCQkgICAzIDw8IFRYX0NNRF9GTEdfQlRfUFJJT19QT1MpOwotCi0JY21kLT50eF9jbWQuc3RhX2lkID0gbXZtLT5hdXhfc3RhLnN0YV9pZDsKLQljbWQtPnR4X2NtZC5saWZlX3RpbWUgPSBjcHVfdG9fbGUzMihUWF9DTURfTElGRV9USU1FX0lORklOSVRFKTsKLQljbWQtPnR4X2NtZC5yYXRlX25fZmxhZ3MgPQotCQkJaXdsX212bV9zY2FuX3JhdGVfbl9mbGFncyhtdm0sIHJlcS0+Y2hhbm5lbHNbMF0tPmJhbmQsCi0JCQkJCQkgIHJlcS0+bm9fY2NrKTsKLQotCWNtZC0+dHhfY21kLmxlbiA9Ci0JCWNwdV90b19sZTE2KGl3bF9tdm1fZmlsbF9wcm9iZV9yZXEoCi0JCQkgICAgKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWNtZC0+ZGF0YSwKLQkJCSAgICB2aWYtPmFkZHIsCi0JCQkgICAgcmVxLT5uX3NzaWRzLCBzc2lkLCBzc2lkX2xlbiwKLQkJCSAgICByZXEtPmllLCByZXEtPmllX2xlbiwgTlVMTCwgMCwKLQkJCSAgICBtdm0tPmZ3LT51Y29kZV9jYXBhLm1heF9wcm9iZV9sZW5ndGgpKTsKLQotCWl3bF9tdm1fc2Nhbl9maWxsX2NoYW5uZWxzKGNtZCwgcmVxLCBiYXNpY19zc2lkLCAmcGFyYW1zKTsKLQotCWNtZC0+bGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBpd2xfc2Nhbl9jbWQpICsKLQkJbGUxNl90b19jcHUoY21kLT50eF9jbWQubGVuKSArCi0JCShjbWQtPmNoYW5uZWxfY291bnQgKiBzaXplb2Yoc3RydWN0IGl3bF9zY2FuX2NoYW5uZWwpKSk7Ci0JaGNtZC5sZW5bMF0gPSBsZTE2X3RvX2NwdShjbWQtPmxlbik7Ci0KLQlzdGF0dXMgPSBTQ0FOX1JFU1BPTlNFX09LOwotCXJldCA9IGl3bF9tdm1fc2VuZF9jbWRfc3RhdHVzKG12bSwgJmhjbWQsICZzdGF0dXMpOwotCWlmICghcmV0ICYmIHN0YXR1cyA9PSBTQ0FOX1JFU1BPTlNFX09LKSB7Ci0JCUlXTF9ERUJVR19TQ0FOKG12bSwgIlNjYW4gcmVxdWVzdCB3YXMgc2VudCBzdWNjZXNzZnVsbHlcbiIpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIElmIHRoZSBzY2FuIGZhaWxlZCwgaXQgdXN1YWxseSBtZWFucyB0aGF0IHRoZSBGVyB3YXMgdW5hYmxlCi0JCSAqIHRvIGFsbG9jYXRlIHRoZSB0aW1lIGV2ZW50cy4gV2FybiBvbiBpdCwgYnV0IG1heWJlIHdlCi0JCSAqIHNob3VsZCB0cnkgdG8gc2VuZCB0aGUgY29tbWFuZCBhZ2FpbiB3aXRoIGRpZmZlcmVudCBwYXJhbXMuCi0JCSAqLwotCQlJV0xfRVJSKG12bSwgIlNjYW4gZmFpbGVkISBzdGF0dXMgMHgleCByZXQgJWRcbiIsCi0JCQlzdGF0dXMsIHJldCk7Ci0JCW12bS0+c2Nhbl9zdGF0dXMgPSBJV0xfTVZNX1NDQU5fTk9ORTsKLQkJcmV0ID0gLUVJTzsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IGl3bF9tdm1fcnhfc2Nhbl9yZXNwb25zZShzdHJ1Y3QgaXdsX212bSAqbXZtLCBzdHJ1Y3QgaXdsX3J4X2NtZF9idWZmZXIgKnJ4YiwKLQkJCSAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9jbWRfcmVzcG9uc2UgKnJlc3AgPSAodm9pZCAqKXBrdC0+ZGF0YTsKLQotCUlXTF9ERUJVR19TQ0FOKG12bSwgIlNjYW4gcmVzcG9uc2UgcmVjZWl2ZWQuIHN0YXR1cyAweCV4XG4iLAotCQkgICAgICAgbGUzMl90b19jcHUocmVzcC0+c3RhdHVzKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KIGludCBpd2xfbXZtX3J4X3NjYW5fb2ZmbG9hZF9pdGVyX2NvbXBsZXRlX25vdGlmKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJCQlzdHJ1Y3QgaXdsX3J4X2NtZF9idWZmZXIgKnJ4YiwKIAkJCQkJCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKQpAQCAtNTU2LDEzMCArMzI3LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpd2xfbXZtX3J4X3NjYW5fY29tcGxldGUoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGl3bF9yeF9jbWRfYnVmZmVyICpyeGIsCi0JCQkgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfc2Nhbl9jb21wbGV0ZV9ub3RpZiAqbm90aWYgPSAodm9pZCAqKXBrdC0+ZGF0YTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX1NDQU4obXZtLCAiU2NhbiBjb21wbGV0ZTogc3RhdHVzPTB4JXggc2Nhbm5lZCBjaGFubmVscz0lZFxuIiwKLQkJICAgICAgIG5vdGlmLT5zdGF0dXMsIG5vdGlmLT5zY2FubmVkX2NoYW5uZWxzKTsKLQotCWlmIChtdm0tPnNjYW5fc3RhdHVzID09IElXTF9NVk1fU0NBTl9PUykKLQkJbXZtLT5zY2FuX3N0YXR1cyA9IElXTF9NVk1fU0NBTl9OT05FOwotCWllZWU4MDIxMV9zY2FuX2NvbXBsZXRlZChtdm0tPmh3LCBub3RpZi0+c3RhdHVzICE9IFNDQU5fQ09NUF9TVEFUVVNfT0spOwotCi0JaXdsX212bV91bnJlZihtdm0sIElXTF9NVk1fUkVGX1NDQU4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KIGludCBpd2xfbXZtX3J4X3NjYW5fb2ZmbG9hZF9yZXN1bHRzKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJICAgIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiLAogCQkJCSAgICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQotCWlmICghKG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmIElXTF9VQ09ERV9UTFZfQ0FQQV9VTUFDX1NDQU4pICYmCi0JICAgICEobXZtLT5mdy0+dWNvZGVfY2FwYS5hcGlbMF0gJiBJV0xfVUNPREVfVExWX0FQSV9MTUFDX1NDQU4pKSB7Ci0JCXN0cnVjdCBpd2xfc2NoZWRfc2Nhbl9yZXN1bHRzICpub3RpZiA9ICh2b2lkICopcGt0LT5kYXRhOwotCi0JCWlmICghKG5vdGlmLT5jbGllbnRfYml0bWFwICYgU0NBTl9DTElFTlRfU0NIRURfU0NBTikpCi0JCQlyZXR1cm4gMDsKLQl9Ci0KIAlJV0xfREVCVUdfU0NBTihtdm0sICJTY2hlZHVsZWQgc2NhbiByZXN1bHRzXG4iKTsKIAlpZWVlODAyMTFfc2NoZWRfc2Nhbl9yZXN1bHRzKG12bS0+aHcpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBib29sIGl3bF9tdm1fc2Nhbl9hYm9ydF9ub3RpZihzdHJ1Y3QgaXdsX25vdGlmX3dhaXRfZGF0YSAqbm90aWZfd2FpdCwKLQkJCQkgICAgIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9tdm0gKm12bSA9Ci0JCWNvbnRhaW5lcl9vZihub3RpZl93YWl0LCBzdHJ1Y3QgaXdsX212bSwgbm90aWZfd2FpdCk7Ci0Jc3RydWN0IGl3bF9zY2FuX2NvbXBsZXRlX25vdGlmICpub3RpZjsKLQl1MzIgKnJlc3A7Ci0KLQlzd2l0Y2ggKHBrdC0+aGRyLmNtZCkgewotCWNhc2UgU0NBTl9BQk9SVF9DTUQ6Ci0JCXJlc3AgPSAodm9pZCAqKXBrdC0+ZGF0YTsKLQkJaWYgKCpyZXNwID09IENBTl9BQk9SVF9TVEFUVVMpIHsKLQkJCUlXTF9ERUJVR19TQ0FOKG12bSwKLQkJCQkgICAgICAgIlNjYW4gY2FuIGJlIGFib3J0ZWQsIHdhaXQgdW50aWwgY29tcGxldGlvblxuIik7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvKgotCQkgKiBJZiBzY2FuIGNhbm5vdCBiZSBhYm9ydGVkLCBpdCBtZWFucyB0aGF0IHdlIGhhZCBhCi0JCSAqIFNDQU5fQ09NUExFVEVfTk9USUZJQ0FUSU9OIGluIHRoZSBwaXBlIGFuZCBpdCBjYWxsZWQKLQkJICogaWVlZTgwMjExX3NjYW5fY29tcGxldGVkIGFscmVhZHkuCi0JCSAqLwotCQlJV0xfREVCVUdfU0NBTihtdm0sICJTY2FuIGNhbm5vdCBiZSBhYm9ydGVkLCBleGl0IG5vdzogJWRcbiIsCi0JCQkgICAgICAgKnJlc3ApOwotCQlyZXR1cm4gdHJ1ZTsKLQotCWNhc2UgU0NBTl9DT01QTEVURV9OT1RJRklDQVRJT046Ci0JCW5vdGlmID0gKHZvaWQgKilwa3QtPmRhdGE7Ci0JCUlXTF9ERUJVR19TQ0FOKG12bSwgIlNjYW4gYWJvcnRlZDogc3RhdHVzIDB4JXhcbiIsCi0JCQkgICAgICAgbm90aWYtPnN0YXR1cyk7Ci0JCXJldHVybiB0cnVlOwotCi0JZGVmYXVsdDoKLQkJV0FSTl9PTigxKTsKLQkJcmV0dXJuIGZhbHNlOwotCX07Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX212bV9jYW5jZWxfcmVndWxhcl9zY2FuKHN0cnVjdCBpd2xfbXZtICptdm0pCi17Ci0Jc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCB3YWl0X3NjYW5fYWJvcnQ7Ci0Jc3RhdGljIGNvbnN0IHU4IHNjYW5fYWJvcnRfbm90aWZbXSA9IHsgU0NBTl9BQk9SVF9DTUQsCi0JCQkJCSAgICAgICBTQ0FOX0NPTVBMRVRFX05PVElGSUNBVElPTiB9OwotCWludCByZXQ7Ci0KLQlpd2xfaW5pdF9ub3RpZmljYXRpb25fd2FpdCgmbXZtLT5ub3RpZl93YWl0LCAmd2FpdF9zY2FuX2Fib3J0LAotCQkJCSAgIHNjYW5fYWJvcnRfbm90aWYsCi0JCQkJICAgQVJSQVlfU0laRShzY2FuX2Fib3J0X25vdGlmKSwKLQkJCQkgICBpd2xfbXZtX3NjYW5fYWJvcnRfbm90aWYsIE5VTEwpOwotCi0JcmV0ID0gaXdsX212bV9zZW5kX2NtZF9wZHUobXZtLCBTQ0FOX0FCT1JUX0NNRCwgMCwgMCwgTlVMTCk7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKG12bSwgIkNvdWxkbid0IHNlbmQgU0NBTl9BQk9SVF9DTUQ6ICVkXG4iLCByZXQpOwotCQkvKiBtYWM4MDIxMSdzIHN0YXRlIHdpbGwgYmUgY2xlYW5lZCBpbiB0aGUgbmljX3Jlc3RhcnQgZmxvdyAqLwotCQlnb3RvIG91dF9yZW1vdmVfbm90aWY7Ci0JfQotCi0JcmV0dXJuIGl3bF93YWl0X25vdGlmaWNhdGlvbigmbXZtLT5ub3RpZl93YWl0LCAmd2FpdF9zY2FuX2Fib3J0LCBIWik7Ci0KLW91dF9yZW1vdmVfbm90aWY6Ci0JaXdsX3JlbW92ZV9ub3RpZmljYXRpb24oJm12bS0+bm90aWZfd2FpdCwgJndhaXRfc2Nhbl9hYm9ydCk7Ci0JcmV0dXJuIHJldDsKLX0KLQogaW50IGl3bF9tdm1fcnhfc2Nhbl9vZmZsb2FkX2NvbXBsZXRlX25vdGlmKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJCSAgIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiLAogCQkJCQkgICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCkKIHsKIAlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQl1OCBzdGF0dXMsIGVic19zdGF0dXM7CisJc3RydWN0IGl3bF9wZXJpb2RpY19zY2FuX2NvbXBsZXRlICpzY2FuX25vdGlmOwogCi0JaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuYXBpWzBdICYgSVdMX1VDT0RFX1RMVl9BUElfTE1BQ19TQ0FOKSB7Ci0JCXN0cnVjdCBpd2xfcGVyaW9kaWNfc2Nhbl9jb21wbGV0ZSAqc2Nhbl9ub3RpZjsKKwlzY2FuX25vdGlmID0gKHZvaWQgKilwa3QtPmRhdGE7CiAKLQkJc2Nhbl9ub3RpZiA9ICh2b2lkICopcGt0LT5kYXRhOwotCQlzdGF0dXMgPSBzY2FuX25vdGlmLT5zdGF0dXM7Ci0JCWVic19zdGF0dXMgPSBzY2FuX25vdGlmLT5lYnNfc3RhdHVzOwotCX0gZWxzZSAgewotCQlzdHJ1Y3QgaXdsX3NjYW5fb2ZmbG9hZF9jb21wbGV0ZSAqc2Nhbl9ub3RpZjsKLQotCQlzY2FuX25vdGlmID0gKHZvaWQgKilwa3QtPmRhdGE7Ci0JCXN0YXR1cyA9IHNjYW5fbm90aWYtPnN0YXR1czsKLQkJZWJzX3N0YXR1cyA9IHNjYW5fbm90aWYtPmVic19zdGF0dXM7Ci0JfQogCS8qIHNjYW4gc3RhdHVzIG11c3QgYmUgbG9ja2VkIGZvciBwcm9wZXIgY2hlY2tpbmcgKi8KIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZtdm0tPm11dGV4KTsKIApAQCAtNjg3LDkgKzM1Myw5IEBACiAJCSAgICAgICAiJXMgY29tcGxldGVkLCBzdGF0dXMgJXMsIEVCUyBzdGF0dXMgJXNcbiIsCiAJCSAgICAgICBtdm0tPnNjYW5fc3RhdHVzID09IElXTF9NVk1fU0NBTl9TQ0hFRCA/CiAJCQkJIlNjaGVkdWxlZCBzY2FuIiA6ICJTY2FuIiwKLQkJICAgICAgIHN0YXR1cyA9PSBJV0xfU0NBTl9PRkZMT0FEX0NPTVBMRVRFRCA/CisJCSAgICAgICBzY2FuX25vdGlmLT5zdGF0dXMgPT0gSVdMX1NDQU5fT0ZGTE9BRF9DT01QTEVURUQgPwogCQkJCSJjb21wbGV0ZWQiIDogImFib3J0ZWQiLAotCQkgICAgICAgZWJzX3N0YXR1cyA9PSBJV0xfU0NBTl9FQlNfU1VDQ0VTUyA/CisJCSAgICAgICBzY2FuX25vdGlmLT5lYnNfc3RhdHVzID09IElXTF9TQ0FOX0VCU19TVUNDRVNTID8KIAkJCQkic3VjY2VzcyIgOiAiZmFpbGVkIik7CiAKIApAQCAtNzAwLDY0ICszNjYsMTYgQEAKIAl9IGVsc2UgaWYgKG12bS0+c2Nhbl9zdGF0dXMgPT0gSVdMX01WTV9TQ0FOX09TKSB7CiAJCW12bS0+c2Nhbl9zdGF0dXMgPSBJV0xfTVZNX1NDQU5fTk9ORTsKIAkJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKG12bS0+aHcsCi0JCQkJCSBzdGF0dXMgPT0gSVdMX1NDQU5fT0ZGTE9BRF9BQk9SVEVEKTsKKwkJCQlzY2FuX25vdGlmLT5zdGF0dXMgPT0gSVdMX1NDQU5fT0ZGTE9BRF9BQk9SVEVEKTsKIAkJaXdsX212bV91bnJlZihtdm0sIElXTF9NVk1fUkVGX1NDQU4pOwogCX0KIAotCWlmIChlYnNfc3RhdHVzKQorCWlmIChzY2FuX25vdGlmLT5lYnNfc3RhdHVzKQogCQltdm0tPmxhc3RfZWJzX3N1Y2Nlc3NmdWwgPSBmYWxzZTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpd2xfc2Nhbl9vZmZsb2FkX2J1aWxkX3R4X2NtZChzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkJCSAgc3RydWN0IGllZWU4MDIxMV9zY2FuX2llcyAqaWVzLAotCQkJCQkgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkJICBzdHJ1Y3QgaXdsX3R4X2NtZCAqY21kLAotCQkJCQkgIHU4ICpkYXRhKQotewotCXUxNiBjbWRfbGVuOwotCi0JY21kLT50eF9mbGFncyA9IGNwdV90b19sZTMyKFRYX0NNRF9GTEdfU0VRX0NUTCk7Ci0JY21kLT5saWZlX3RpbWUgPSBjcHVfdG9fbGUzMihUWF9DTURfTElGRV9USU1FX0lORklOSVRFKTsKLQljbWQtPnN0YV9pZCA9IG12bS0+YXV4X3N0YS5zdGFfaWQ7Ci0KLQljbWQtPnJhdGVfbl9mbGFncyA9IGl3bF9tdm1fc2Nhbl9yYXRlX25fZmxhZ3MobXZtLCBiYW5kLCBmYWxzZSk7Ci0KLQljbWRfbGVuID0gaXdsX212bV9maWxsX3Byb2JlX3JlcSgoc3RydWN0IGllZWU4MDIxMV9tZ210ICopZGF0YSwKLQkJCQkJIHZpZi0+YWRkciwKLQkJCQkJIDEsIE5VTEwsIDAsCi0JCQkJCSBpZXMtPmllc1tiYW5kXSwgaWVzLT5sZW5bYmFuZF0sCi0JCQkJCSBpZXMtPmNvbW1vbl9pZXMsIGllcy0+Y29tbW9uX2llX2xlbiwKLQkJCQkJIFNDQU5fT0ZGTE9BRF9QUk9CRV9SRVFfU0laRSk7Ci0JY21kLT5sZW4gPSBjcHVfdG9fbGUxNihjbWRfbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsX2J1aWxkX3NjYW5fY21kKHN0cnVjdCBpd2xfbXZtICptdm0sCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXEsCi0JCQkgICAgICAgc3RydWN0IGl3bF9zY2FuX29mZmxvYWRfY21kICpzY2FuLAotCQkJICAgICAgIHN0cnVjdCBpd2xfbXZtX3NjYW5fcGFyYW1zICpwYXJhbXMpCi17Ci0Jc2Nhbi0+Y2hhbm5lbF9jb3VudCA9IHJlcS0+bl9jaGFubmVsczsKLQlzY2FuLT5xdWlldF90aW1lID0gY3B1X3RvX2xlMTYoSVdMX0FDVElWRV9RVUlFVF9USU1FKTsKLQlzY2FuLT5xdWlldF9wbGNwX3RoID0gY3B1X3RvX2xlMTYoSVdMX1BMQ1BfUVVJRVRfVEhSRVNIKTsKLQlzY2FuLT5nb29kX0NSQ190aCA9IElXTF9HT09EX0NSQ19USF9ERUZBVUxUOwotCXNjYW4tPnJ4X2NoYWluID0gaXdsX212bV9zY2FuX3J4X2NoYWluKG12bSk7Ci0KLQlzY2FuLT5tYXhfb3V0X3RpbWUgPSBjcHVfdG9fbGUzMihwYXJhbXMtPm1heF9vdXRfdGltZSk7Ci0Jc2Nhbi0+c3VzcGVuZF90aW1lID0gY3B1X3RvX2xlMzIocGFyYW1zLT5zdXNwZW5kX3RpbWUpOwotCi0Jc2Nhbi0+ZmlsdGVyX2ZsYWdzIHw9IGNwdV90b19sZTMyKE1BQ19GSUxURVJfQUNDRVBUX0dSUCB8Ci0JCQkJCSAgTUFDX0ZJTFRFUl9JTl9CRUFDT04pOwotCXNjYW4tPnNjYW5fdHlwZSA9IGNwdV90b19sZTMyKFNDQU5fVFlQRV9CQUNLR1JPVU5EKTsKLQlzY2FuLT5yZXBfY291bnQgPSBjcHVfdG9fbGUzMigxKTsKLQotCWlmIChwYXJhbXMtPnBhc3NpdmVfZnJhZ21lbnRlZCkKLQkJc2Nhbi0+c2Nhbl9mbGFncyB8PSBTQ0FOX0ZMQUdTX0ZSQUdNRU5URURfU0NBTjsKLX0KLQogc3RhdGljIGludCBpd2xfc3NpZF9leGlzdCh1OCAqc3NpZCwgdTggc3NpZF9sZW4sIHN0cnVjdCBpd2xfc3NpZF9pZSAqc3NpZF9saXN0KQogewogCWludCBpOwpAQCAtODE1LDEyNyArNDMzLDYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGl3bF9idWlsZF9jaGFubmVsX2NmZyhzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJCSAgc3RydWN0IGNmZzgwMjExX3NjaGVkX3NjYW5fcmVxdWVzdCAqcmVxLAotCQkJCSAgdTggKmNoYW5uZWxzX2J1ZmZlciwKLQkJCQkgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkgIGludCAqaGVhZCwKLQkJCQkgIHUzMiBzc2lkX2JpdG1hcCwKLQkJCQkgIHN0cnVjdCBpd2xfbXZtX3NjYW5fcGFyYW1zICpwYXJhbXMpCi17Ci0JdTMyIG5fY2hhbm5lbHMgPSBtdm0tPmZ3LT51Y29kZV9jYXBhLm5fc2Nhbl9jaGFubmVsczsKLQlfX2xlMzIgKnR5cGUgPSAoX19sZTMyICopY2hhbm5lbHNfYnVmZmVyOwotCV9fbGUxNiAqY2hhbm5lbF9udW1iZXIgPSAoX19sZTE2ICopKHR5cGUgKyBuX2NoYW5uZWxzKTsKLQlfX2xlMTYgKml0ZXJfY291bnQgPSBjaGFubmVsX251bWJlciArIG5fY2hhbm5lbHM7Ci0JX19sZTMyICppdGVyX2ludGVydmFsID0gKF9fbGUzMiAqKShpdGVyX2NvdW50ICsgbl9jaGFubmVscyk7Ci0JdTggKmFjdGl2ZV9kd2VsbCA9ICh1OCAqKShpdGVyX2ludGVydmFsICsgbl9jaGFubmVscyk7Ci0JdTggKnBhc3NpdmVfZHdlbGwgPSBhY3RpdmVfZHdlbGwgKyBuX2NoYW5uZWxzOwotCWludCBpLCBpbmRleCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmVxLT5uX2NoYW5uZWxzOyBpKyspIHsKLQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuID0gcmVxLT5jaGFubmVsc1tpXTsKLQotCQlpZiAoY2hhbi0+YmFuZCAhPSBiYW5kKQotCQkJY29udGludWU7Ci0KLQkJaW5kZXggPSAqaGVhZDsKLQkJKCpoZWFkKSsrOwotCi0JCWNoYW5uZWxfbnVtYmVyW2luZGV4XSA9IGNwdV90b19sZTE2KGNoYW4tPmh3X3ZhbHVlKTsKLQkJYWN0aXZlX2R3ZWxsW2luZGV4XSA9IHBhcmFtcy0+ZHdlbGxbYmFuZF0uYWN0aXZlOwotCQlwYXNzaXZlX2R3ZWxsW2luZGV4XSA9IHBhcmFtcy0+ZHdlbGxbYmFuZF0ucGFzc2l2ZTsKLQotCQlpdGVyX2NvdW50W2luZGV4XSA9IGNwdV90b19sZTE2KDEpOwotCQlpdGVyX2ludGVydmFsW2luZGV4XSA9IDA7Ci0KLQkJaWYgKCEoY2hhbi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9OT19JUikpCi0JCQl0eXBlW2luZGV4XSB8PQotCQkJCWNwdV90b19sZTMyKElXTF9TQ0FOX09GRkxPQURfQ0hBTk5FTF9BQ1RJVkUpOwotCi0JCXR5cGVbaW5kZXhdIHw9IGNwdV90b19sZTMyKElXTF9TQ0FOX09GRkxPQURfQ0hBTk5FTF9GVUxMIHwKLQkJCQkJICAgSVdMX1NDQU5fT0ZGTE9BRF9DSEFOTkVMX1BBUlRJQUwpOwotCi0JCWlmIChjaGFuLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX05PX0hUNDApCi0JCQl0eXBlW2luZGV4XSB8PQotCQkJCWNwdV90b19sZTMyKElXTF9TQ0FOX09GRkxPQURfQ0hBTk5FTF9OQVJST1cpOwotCi0JCS8qIHNjYW4gZm9yIGFsbCBTU0lEcyBmcm9tIHJlcS0+c3NpZHMgKi8KLQkJdHlwZVtpbmRleF0gfD0gY3B1X3RvX2xlMzIoc3NpZF9iaXRtYXApOwotCX0KLX0KLQotaW50IGl3bF9tdm1fY29uZmlnX3NjaGVkX3NjYW4oc3RydWN0IGl3bF9tdm0gKm12bSwKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgICBzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXEsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3NjYW5faWVzICppZXMpCi17Ci0JaW50IGJhbmRfMmdoeiA9IG12bS0+bnZtX2RhdGEtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fY2hhbm5lbHM7Ci0JaW50IGJhbmRfNWdoeiA9IG12bS0+bnZtX2RhdGEtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fY2hhbm5lbHM7Ci0JaW50IGhlYWQgPSAwOwotCXUzMiBzc2lkX2JpdG1hcDsKLQlpbnQgY21kX2xlbjsKLQlpbnQgcmV0OwotCXU4ICpwcm9iZXM7Ci0JYm9vbCBiYXNpY19zc2lkID0gIShtdm0tPmZ3LT51Y29kZV9jYXBhLmZsYWdzICYKLQkJCSAgICBJV0xfVUNPREVfVExWX0ZMQUdTX05PX0JBU0lDX1NTSUQpOwotCi0Jc3RydWN0IGl3bF9zY2FuX29mZmxvYWRfY2ZnICpzY2FuX2NmZzsKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKLQkJLmlkID0gU0NBTl9PRkZMT0FEX0NPTkZJR19DTUQsCi0JfTsKLQlzdHJ1Y3QgaXdsX212bV9zY2FuX3BhcmFtcyBwYXJhbXMgPSB7fTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm12bS0+bXV0ZXgpOwotCi0JY21kX2xlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3NjYW5fb2ZmbG9hZF9jZmcpICsKLQkJICBtdm0tPmZ3LT51Y29kZV9jYXBhLm5fc2Nhbl9jaGFubmVscyAqIElXTF9TQ0FOX0NIQU5fU0laRSArCi0JCSAgMiAqIFNDQU5fT0ZGTE9BRF9QUk9CRV9SRVFfU0laRTsKLQotCXNjYW5fY2ZnID0ga3phbGxvYyhjbWRfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNjYW5fY2ZnKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXByb2JlcyA9IHNjYW5fY2ZnLT5kYXRhICsKLQkJbXZtLT5mdy0+dWNvZGVfY2FwYS5uX3NjYW5fY2hhbm5lbHMgKiBJV0xfU0NBTl9DSEFOX1NJWkU7Ci0KLQlpd2xfbXZtX3NjYW5fY2FsY19wYXJhbXMobXZtLCB2aWYsIHJlcS0+bl9zc2lkcywgMCwgJnBhcmFtcyk7Ci0JaXdsX2J1aWxkX3NjYW5fY21kKG12bSwgdmlmLCByZXEsICZzY2FuX2NmZy0+c2Nhbl9jbWQsICZwYXJhbXMpOwotCXNjYW5fY2ZnLT5zY2FuX2NtZC5sZW4gPSBjcHVfdG9fbGUxNihjbWRfbGVuKTsKLQotCWl3bF9zY2FuX29mZmxvYWRfYnVpbGRfc3NpZChyZXEsIHNjYW5fY2ZnLT5zY2FuX2NtZC5kaXJlY3Rfc2NhbiwKLQkJCQkgICAgJnNzaWRfYml0bWFwLCBiYXNpY19zc2lkKTsKLQkvKiBidWlsZCB0eCBmcmFtZXMgZm9yIHN1cHBvcnRlZCBiYW5kcyAqLwotCWlmIChiYW5kXzJnaHopIHsKLQkJaXdsX3NjYW5fb2ZmbG9hZF9idWlsZF90eF9jbWQobXZtLCB2aWYsIGllcywKLQkJCQkJICAgICAgSUVFRTgwMjExX0JBTkRfMkdIWiwKLQkJCQkJICAgICAgJnNjYW5fY2ZnLT5zY2FuX2NtZC50eF9jbWRbMF0sCi0JCQkJCSAgICAgIHByb2Jlcyk7Ci0JCWl3bF9idWlsZF9jaGFubmVsX2NmZyhtdm0sIHJlcSwgc2Nhbl9jZmctPmRhdGEsCi0JCQkJICAgICAgSUVFRTgwMjExX0JBTkRfMkdIWiwgJmhlYWQsCi0JCQkJICAgICAgc3NpZF9iaXRtYXAsICZwYXJhbXMpOwotCX0KLQlpZiAoYmFuZF81Z2h6KSB7Ci0JCWl3bF9zY2FuX29mZmxvYWRfYnVpbGRfdHhfY21kKG12bSwgdmlmLCBpZXMsCi0JCQkJCSAgICAgIElFRUU4MDIxMV9CQU5EXzVHSFosCi0JCQkJCSAgICAgICZzY2FuX2NmZy0+c2Nhbl9jbWQudHhfY21kWzFdLAotCQkJCQkgICAgICBwcm9iZXMgKwotCQkJCQkJU0NBTl9PRkZMT0FEX1BST0JFX1JFUV9TSVpFKTsKLQkJaXdsX2J1aWxkX2NoYW5uZWxfY2ZnKG12bSwgcmVxLCBzY2FuX2NmZy0+ZGF0YSwKLQkJCQkgICAgICBJRUVFODAyMTFfQkFORF81R0haLCAmaGVhZCwKLQkJCQkgICAgICBzc2lkX2JpdG1hcCwgJnBhcmFtcyk7Ci0JfQotCi0JY21kLmRhdGFbMF0gPSBzY2FuX2NmZzsKLQljbWQubGVuWzBdID0gY21kX2xlbjsKLQljbWQuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWTsKLQotCUlXTF9ERUJVR19TQ0FOKG12bSwgIlNlbmRpbmcgc2NoZWR1bGVkIHNjYW4gY29uZmlnXG4iKTsKLQotCXJldCA9IGl3bF9tdm1fc2VuZF9jbWQobXZtLCAmY21kKTsKLQlrZnJlZShzY2FuX2NmZyk7Ci0JcmV0dXJuIHJldDsKLX0KLQogaW50IGl3bF9tdm1fY29uZmlnX3NjaGVkX3NjYW5fcHJvZmlsZXMoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCQkgICAgICAgc3RydWN0IGNmZzgwMjExX3NjaGVkX3NjYW5fcmVxdWVzdCAqcmVxKQogewpAQCAtMTAxOCwzMyArNTE1LDYgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotaW50IGl3bF9tdm1fc2NoZWRfc2Nhbl9zdGFydChzdHJ1Y3QgaXdsX212bSAqbXZtLAotCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXEpCi17Ci0Jc3RydWN0IGl3bF9zY2FuX29mZmxvYWRfcmVxIHNjYW5fcmVxID0gewotCQkud2F0Y2hkb2cgPSBJV0xfU0NIRURfU0NBTl9XQVRDSERPRywKLQotCQkuc2NoZWR1bGVfbGluZVswXS5pdGVyYXRpb25zID0gSVdMX0ZBU1RfU0NIRURfU0NBTl9JVEVSQVRJT05TLAotCQkuc2NoZWR1bGVfbGluZVswXS5kZWxheSA9IGNwdV90b19sZTE2KHJlcS0+aW50ZXJ2YWwgLyAxMDAwKSwKLQkJLnNjaGVkdWxlX2xpbmVbMF0uZnVsbF9zY2FuX211bCA9IDEsCi0KLQkJLnNjaGVkdWxlX2xpbmVbMV0uaXRlcmF0aW9ucyA9IDB4ZmYsCi0JCS5zY2hlZHVsZV9saW5lWzFdLmRlbGF5ID0gY3B1X3RvX2xlMTYocmVxLT5pbnRlcnZhbCAvIDEwMDApLAotCQkuc2NoZWR1bGVfbGluZVsxXS5mdWxsX3NjYW5fbXVsID0gSVdMX0ZVTExfU0NBTl9NVUxUSVBMSUVSLAotCX07Ci0KLQlpZiAoaXdsX212bV9zY2FuX3Bhc3NfYWxsKG12bSwgcmVxKSkKLQkJc2Nhbl9yZXEuZmxhZ3MgfD0gY3B1X3RvX2xlMTYoSVdMX1NDQU5fT0ZGTE9BRF9GTEFHX1BBU1NfQUxMKTsKLQotCWlmIChtdm0tPmxhc3RfZWJzX3N1Y2Nlc3NmdWwgJiYKLQkgICAgbXZtLT5mdy0+dWNvZGVfY2FwYS5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfRUJTX1NVUFBPUlQpCi0JCXNjYW5fcmVxLmZsYWdzIHw9Ci0JCQljcHVfdG9fbGUxNihJV0xfU0NBTl9PRkZMT0FEX0ZMQUdfRUJTX0FDQ1VSQVRFX01PREUpOwotCi0JcmV0dXJuIGl3bF9tdm1fc2VuZF9jbWRfcGR1KG12bSwgU0NBTl9PRkZMT0FEX1JFUVVFU1RfQ01ELCAwLAotCQkJCSAgICBzaXplb2Yoc2Nhbl9yZXEpLCAmc2Nhbl9yZXEpOwotfQotCiBpbnQgaXdsX212bV9zY2FuX29mZmxvYWRfc3RhcnQoc3RydWN0IGl3bF9tdm0gKm12bSwKIAkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2hlZF9zY2FuX3JlcXVlc3QgKnJlcSwKQEAgLTEwNTcsMjEgKzUyNywxMiBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAkJcmV0ID0gaXdsX212bV9zY2hlZF9zY2FuX3VtYWMobXZtLCB2aWYsIHJlcSwgaWVzKTsKLQl9IGVsc2UgaWYgKChtdm0tPmZ3LT51Y29kZV9jYXBhLmFwaVswXSAmIElXTF9VQ09ERV9UTFZfQVBJX0xNQUNfU0NBTikpIHsKKwl9IGVsc2UgewogCQltdm0tPnNjYW5fc3RhdHVzID0gSVdMX01WTV9TQ0FOX1NDSEVEOwogCQlyZXQgPSBpd2xfbXZtX2NvbmZpZ19zY2hlZF9zY2FuX3Byb2ZpbGVzKG12bSwgcmVxKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAJCXJldCA9IGl3bF9tdm1fdW5pZmllZF9zY2hlZF9zY2FuX2xtYWMobXZtLCB2aWYsIHJlcSwgaWVzKTsKLQl9IGVsc2UgewotCQltdm0tPnNjYW5fc3RhdHVzID0gSVdMX01WTV9TQ0FOX1NDSEVEOwotCQlyZXQgPSBpd2xfbXZtX2NvbmZpZ19zY2hlZF9zY2FuKG12bSwgdmlmLCByZXEsIGllcyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCQlyZXQgPSBpd2xfbXZtX2NvbmZpZ19zY2hlZF9zY2FuX3Byb2ZpbGVzKG12bSwgcmVxKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXJldCA9IGl3bF9tdm1fc2NoZWRfc2Nhbl9zdGFydChtdm0sIHJlcSk7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTEwODgsOSArNTQ5LDcgQEAKIAkvKiBFeGl0IGluc3RhbnRseSB3aXRoIGVycm9yIHdoZW4gZGV2aWNlIGlzIG5vdCByZWFkeQogCSAqIHRvIHJlY2VpdmUgc2NhbiBhYm9ydCBjb21tYW5kIG9yIGl0IGRvZXMgbm90IHBlcmZvcm0KIAkgKiBzY2hlZHVsZWQgc2NhbiBjdXJyZW50bHkgKi8KLQlpZiAobXZtLT5zY2FuX3N0YXR1cyAhPSBJV0xfTVZNX1NDQU5fU0NIRUQgJiYKLQkgICAgKCEobXZtLT5mdy0+dWNvZGVfY2FwYS5hcGlbMF0gJiBJV0xfVUNPREVfVExWX0FQSV9MTUFDX1NDQU4pIHx8Ci0JICAgICBtdm0tPnNjYW5fc3RhdHVzICE9IElXTF9NVk1fU0NBTl9PUykpCisJaWYgKG12bS0+c2Nhbl9zdGF0dXMgPT0gSVdMX01WTV9TQ0FOX05PTkUpCiAJCXJldHVybiAtRUlPOwogCiAJcmV0ID0gaXdsX212bV9zZW5kX2NtZF9zdGF0dXMobXZtLCAmY21kLCAmc3RhdHVzKTsKQEAgLTExMjgsMTQgKzU4Nyw5IEBACiAJaWYgKG12bS0+c2Nhbl9zdGF0dXMgPT0gSVdMX01WTV9TQ0FOX05PTkUpCiAJCXJldHVybiAwOwogCi0JaWYgKGl3bF9tdm1faXNfcmFkaW9fa2lsbGVkKG12bSkpCisJaWYgKGl3bF9tdm1faXNfcmFkaW9fa2lsbGVkKG12bSkpIHsKKwkJcmV0ID0gMDsKIAkJZ290byBvdXQ7Ci0KLQlpZiAobXZtLT5zY2FuX3N0YXR1cyAhPSBJV0xfTVZNX1NDQU5fU0NIRUQgJiYKLQkgICAgKCEobXZtLT5mdy0+dWNvZGVfY2FwYS5hcGlbMF0gJiBJV0xfVUNPREVfVExWX0FQSV9MTUFDX1NDQU4pIHx8Ci0JICAgICBtdm0tPnNjYW5fc3RhdHVzICE9IElXTF9NVk1fU0NBTl9PUykpIHsKLQkJSVdMX0RFQlVHX1NDQU4obXZtLCAiTm8gc2NhbiB0byBzdG9wXG4iKTsKLQkJcmV0dXJuIDA7CiAJfQogCiAJaXdsX2luaXRfbm90aWZpY2F0aW9uX3dhaXQoJm12bS0+bm90aWZfd2FpdCwgJndhaXRfc2Nhbl9kb25lLApAQCAtMTE0OCwxNiArNjAyLDE0IEBACiAJCUlXTF9ERUJVR19TQ0FOKG12bSwgIlNlbmQgc3RvcCAlc3NjYW4gZmFpbGVkICVkXG4iLAogCQkJICAgICAgIHNjaGVkID8gIm9mZmxvYWRlZCAiIDogIiIsIHJldCk7CiAJCWl3bF9yZW1vdmVfbm90aWZpY2F0aW9uKCZtdm0tPm5vdGlmX3dhaXQsICZ3YWl0X3NjYW5fZG9uZSk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0OwogCX0KIAogCUlXTF9ERUJVR19TQ0FOKG12bSwgIlN1Y2Nlc3NmdWxseSBzZW50IHN0b3AgJXNzY2FuXG4iLAogCQkgICAgICAgc2NoZWQgPyAib2ZmbG9hZGVkICIgOiAiIik7CiAKIAlyZXQgPSBpd2xfd2FpdF9ub3RpZmljYXRpb24oJm12bS0+bm90aWZfd2FpdCwgJndhaXRfc2Nhbl9kb25lLCAxICogSFopOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KK291dDoKIAkvKgogCSAqIENsZWFyIHRoZSBzY2FuIHN0YXR1cyBzbyB0aGUgbmV4dCBzY2FuIHJlcXVlc3RzIHdpbGwgc3VjY2VlZC4gVGhpcwogCSAqIGFsc28gZW5zdXJlcyB0aGUgUnggaGFuZGxlciBkb2Vzbid0IGRvIGFueXRoaW5nLCBhcyB0aGUgc2NhbiB3YXMKQEAgLTExNjcsNyArNjE5LDYgQEAKIAlpZiAobXZtLT5zY2FuX3N0YXR1cyA9PSBJV0xfTVZNX1NDQU5fT1MpCiAJCWl3bF9tdm1fdW5yZWYobXZtLCBJV0xfTVZNX1JFRl9TQ0FOKTsKIAotb3V0OgogCW12bS0+c2Nhbl9zdGF0dXMgPSBJV0xfTVZNX1NDQU5fTk9ORTsKIAogCWlmIChub3RpZnkpIHsKQEAgLTExNzcsNyArNjI4LDcgQEAKIAkJCWllZWU4MDIxMV9zY2FuX2NvbXBsZXRlZChtdm0tPmh3LCB0cnVlKTsKIAl9CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBpd2xfbXZtX3VuaWZpZWRfc2Nhbl9maWxsX3R4X2NtZChzdHJ1Y3QgaXdsX212bSAqbXZtLApAQCAtMTMxNyw3ICs3NjgsNyBAQAogCWNtZC0+cGFzc2l2ZV9kd2VsbCA9IHBhcmFtcy0+ZHdlbGxbSUVFRTgwMjExX0JBTkRfMkdIWl0ucGFzc2l2ZTsKIAlpZiAocGFyYW1zLT5wYXNzaXZlX2ZyYWdtZW50ZWQpCiAJCWNtZC0+ZnJhZ21lbnRlZF9kd2VsbCA9Ci0JCQkJcGFyYW1zLT5kd2VsbFtJRUVFODAyMTFfQkFORF8yR0haXS5wYXNzaXZlOworCQkJCXBhcmFtcy0+ZHdlbGxbSUVFRTgwMjExX0JBTkRfMkdIWl0uZnJhZ21lbnRlZDsKIAljbWQtPnJ4X2NoYWluX3NlbGVjdCA9IGl3bF9tdm1fc2Nhbl9yeF9jaGFpbihtdm0pOwogCWNtZC0+bWF4X291dF90aW1lID0gY3B1X3RvX2xlMzIocGFyYW1zLT5tYXhfb3V0X3RpbWUpOwogCWNtZC0+c3VzcGVuZF90aW1lID0gY3B1X3RvX2xlMzIocGFyYW1zLT5zdXNwZW5kX3RpbWUpOwpAQCAtMTQ4NCw2ICs5MzUsOCBAQAogCiAJY21kLT5uX2NoYW5uZWxzID0gKHU4KXJlcS0+bl9jaGFubmVsczsKIAorCWNtZC0+ZGVsYXkgPSBjcHVfdG9fbGUzMihyZXEtPmRlbGF5KTsKKwogCWlmIChpd2xfbXZtX3NjYW5fcGFzc19hbGwobXZtLCByZXEpKQogCQlmbGFncyB8PSBJV0xfTVZNX0xNQUNfU0NBTl9GTEFHX1BBU1NfQUxMOwogCWVsc2UKQEAgLTE1ODAsOSArMTAzMyw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWlmIChtdm0tPmZ3LT51Y29kZV9jYXBhLmFwaVswXSAmIElXTF9VQ09ERV9UTFZfQVBJX0xNQUNfU0NBTikKLQkJcmV0dXJuIGl3bF9tdm1fc2Nhbl9vZmZsb2FkX3N0b3AobXZtLCB0cnVlKTsKLQlyZXR1cm4gaXdsX212bV9jYW5jZWxfcmVndWxhcl9zY2FuKG12bSk7CisJcmV0dXJuIGl3bF9tdm1fc2Nhbl9vZmZsb2FkX3N0b3AobXZtLCB0cnVlKTsKIH0KIAogLyogVU1BQyBzY2FuIEFQSSAqLwpAQCAtMTcyOCw2ICsxMTc5LDE4IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgaW50IGl3bF9tdm1fZmluZF9maXJzdF9zY2FuKHN0cnVjdCBpd2xfbXZtICptdm0sCisJCQkJICAgZW51bSBpd2xfdW1hY19zY2FuX3VpZF90eXBlIHR5cGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSVdMX01WTV9NQVhfU0lNVUxUQU5FT1VTX1NDQU5TOyBpKyspCisJCWlmIChtdm0tPnNjYW5fdWlkW2ldICYgdHlwZSkKKwkJCXJldHVybiBpOworCisJcmV0dXJuIGk7Cit9CisKIHN0YXRpYyB1MzIgaXdsX2dlbmVyYXRlX3NjYW5fdWlkKHN0cnVjdCBpd2xfbXZtICptdm0sCiAJCQkJIGVudW0gaXdsX3VtYWNfc2Nhbl91aWRfdHlwZSB0eXBlKQogewpAQCAtMTc2NSw3ICsxMjI4LDcgQEAKIAljbWQtPnBhc3NpdmVfZHdlbGwgPSBwYXJhbXMtPmR3ZWxsW0lFRUU4MDIxMV9CQU5EXzJHSFpdLnBhc3NpdmU7CiAJaWYgKHBhcmFtcy0+cGFzc2l2ZV9mcmFnbWVudGVkKQogCQljbWQtPmZyYWdtZW50ZWRfZHdlbGwgPQotCQkJCXBhcmFtcy0+ZHdlbGxbSUVFRTgwMjExX0JBTkRfMkdIWl0ucGFzc2l2ZTsKKwkJCQlwYXJhbXMtPmR3ZWxsW0lFRUU4MDIxMV9CQU5EXzJHSFpdLmZyYWdtZW50ZWQ7CiAJY21kLT5tYXhfb3V0X3RpbWUgPSBjcHVfdG9fbGUzMihwYXJhbXMtPm1heF9vdXRfdGltZSk7CiAJY21kLT5zdXNwZW5kX3RpbWUgPSBjcHVfdG9fbGUzMihwYXJhbXMtPnN1c3BlbmRfdGltZSk7CiAJY21kLT5zY2FuX3ByaW9yaXR5ID0gY3B1X3RvX2xlMzIoSVdMX1NDQU5fUFJJT1JJVFlfSElHSCk7CkBAIC0xOTg3LDcgKzE0NTAsMTMgQEAKIAkJCQljcHVfdG9fbGUxNihyZXEtPmludGVydmFsIC8gTVNFQ19QRVJfU0VDKTsKIAlzZWNfcGFydC0+c2NoZWR1bGVbMF0uaXRlcl9jb3VudCA9IDB4ZmY7CiAKLQlzZWNfcGFydC0+ZGVsYXkgPSAwOworCWlmIChyZXEtPmRlbGF5ID4gVTE2X01BWCkgeworCQlJV0xfREVCVUdfU0NBTihtdm0sCisJCQkgICAgICAgImRlbGF5IHZhbHVlIGlzID4gMTYtYml0cywgc2V0IHRvIG1heCBwb3NzaWJsZVxuIik7CisJCXNlY19wYXJ0LT5kZWxheSA9IGNwdV90b19sZTE2KFUxNl9NQVgpOworCX0gZWxzZSB7CisJCXNlY19wYXJ0LT5kZWxheSA9IGNwdV90b19sZTE2KHJlcS0+ZGVsYXkpOworCX0KIAogCWl3bF9tdm1fYnVpbGRfdW5pZmllZF9zY2FuX3Byb2JlKG12bSwgdmlmLCBpZXMsICZzZWNfcGFydC0+cHJlcSwKIAkJcmVxLT5mbGFncyAmIE5MODAyMTFfU0NBTl9GTEFHX1JBTkRPTV9BRERSID8KQEAgLTIxNTksMTQgKzE2MjgsNTkgQEAKIAkJCQltdm0tPmZ3LT51Y29kZV9jYXBhLm5fc2Nhbl9jaGFubmVscyArCiAJCQlzaXplb2Yoc3RydWN0IGl3bF9zY2FuX3JlcV91bWFjX3RhaWwpOwogCi0JaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuYXBpWzBdICYgSVdMX1VDT0RFX1RMVl9BUElfTE1BQ19TQ0FOKQotCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpd2xfc2Nhbl9yZXFfdW5pZmllZF9sbWFjKSArCi0JCQlzaXplb2Yoc3RydWN0IGl3bF9zY2FuX2NoYW5uZWxfY2ZnX2xtYWMpICoKLQkJCQltdm0tPmZ3LT51Y29kZV9jYXBhLm5fc2Nhbl9jaGFubmVscyArCi0JCQlzaXplb2Yoc3RydWN0IGl3bF9zY2FuX3Byb2JlX3JlcSk7CisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaXdsX3NjYW5fcmVxX3VuaWZpZWRfbG1hYykgKworCQlzaXplb2Yoc3RydWN0IGl3bF9zY2FuX2NoYW5uZWxfY2ZnX2xtYWMpICoKKwkJbXZtLT5mdy0+dWNvZGVfY2FwYS5uX3NjYW5fY2hhbm5lbHMgKworCQlzaXplb2Yoc3RydWN0IGl3bF9zY2FuX3Byb2JlX3JlcSk7Cit9CiAKLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpd2xfc2Nhbl9jbWQpICsKLQkJbXZtLT5mdy0+dWNvZGVfY2FwYS5tYXhfcHJvYmVfbGVuZ3RoICsKLQkJCW12bS0+ZnctPnVjb2RlX2NhcGEubl9zY2FuX2NoYW5uZWxzICoKLQkJc2l6ZW9mKHN0cnVjdCBpd2xfc2Nhbl9jaGFubmVsKTsKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gbmljIHJlc3RhcnQgZmxvdywgdG8gaW5mb3JtIG1hYzgwMjExIGFib3V0IHNjYW5zCisgKiB0aGF0IHdhcyBhYm9ydGVkIGJ5IHJlc3RhcnQgZmxvdyBvciBieSBhbiBhc3NlcnQuCisgKi8KK3ZvaWQgaXdsX212bV9yZXBvcnRfc2Nhbl9hYm9ydGVkKHN0cnVjdCBpd2xfbXZtICptdm0pCit7CisJaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuY2FwYVswXSAmIElXTF9VQ09ERV9UTFZfQ0FQQV9VTUFDX1NDQU4pIHsKKwkJdTMyIHVpZCwgaTsKKworCQl1aWQgPSBpd2xfbXZtX2ZpbmRfZmlyc3Rfc2Nhbihtdm0sIElXTF9VTUFDX1NDQU5fVUlEX1JFR19TQ0FOKTsKKwkJaWYgKHVpZCA8IElXTF9NVk1fTUFYX1NJTVVMVEFORU9VU19TQ0FOUykgeworCQkJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKG12bS0+aHcsIHRydWUpOworCQkJbXZtLT5zY2FuX3VpZFt1aWRdID0gMDsKKwkJfQorCQl1aWQgPSBpd2xfbXZtX2ZpbmRfZmlyc3Rfc2Nhbihtdm0sCisJCQkJCSAgICAgIElXTF9VTUFDX1NDQU5fVUlEX1NDSEVEX1NDQU4pOworCQlpZiAodWlkIDwgSVdMX01WTV9NQVhfU0lNVUxUQU5FT1VTX1NDQU5TICYmICFtdm0tPnJlc3RhcnRfZncpIHsKKwkJCWllZWU4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWQobXZtLT5odyk7CisJCQltdm0tPnNjYW5fdWlkW3VpZF0gPSAwOworCQl9CisKKwkJLyogV2Ugc2hvdWxkbid0IGhhdmUgYW55IFVJRHMgc3RpbGwgc2V0LiAgTG9vcCBvdmVyIGFsbCB0aGUKKwkJICogVUlEcyB0byBtYWtlIHN1cmUgdGhlcmUncyBub3RoaW5nIGxlZnQgdGhlcmUgYW5kIHdhcm4gaWYKKwkJICogYW55IGlzIGZvdW5kLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IElXTF9NVk1fTUFYX1NJTVVMVEFORU9VU19TQ0FOUzsgaSsrKSB7CisJCQlpZiAoV0FSTl9PTkNFKG12bS0+c2Nhbl91aWRbaV0sCisJCQkJICAgICAgIlVNQUMgc2NhbiBVSUQgJWQgd2FzIG5vdCBjbGVhbmVkXG4iLAorCQkJCSAgICAgIG12bS0+c2Nhbl91aWRbaV0pKQorCQkJCW12bS0+c2Nhbl91aWRbaV0gPSAwOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChtdm0tPnNjYW5fc3RhdHVzKSB7CisJCWNhc2UgSVdMX01WTV9TQ0FOX05PTkU6CisJCQlicmVhazsKKwkJY2FzZSBJV0xfTVZNX1NDQU5fT1M6CisJCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQobXZtLT5odywgdHJ1ZSk7CisJCQlicmVhazsKKwkJY2FzZSBJV0xfTVZNX1NDQU5fU0NIRUQ6CisJCQkvKgorCQkJICogU2NoZWQgc2NhbiB3aWxsIGJlIHJlc3RhcnRlZCBieSBtYWM4MDIxMSBpbgorCQkJICogcmVzdGFydF9odywgc28gZG8gbm90IHJlcG9ydCBpZiBGVyBpcyBhYm91dCB0byBiZQorCQkJICogcmVzdGFydGVkLgorCQkJICovCisJCQlpZiAoIW12bS0+cmVzdGFydF9mdykKKwkJCQlpZWVlODAyMTFfc2NoZWRfc2Nhbl9zdG9wcGVkKG12bS0+aHcpOworCQkJYnJlYWs7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vc2YuYwppbmRleCA3ZWI3OGUyLi5iMGY1OWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zZi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3NmLmMKQEAgLTk5LDcgKzk5LDM1IEBACiAKIC8qCiAgKiBBZ2luZyBhbmQgaWRsZSB0aW1lb3V0cyBmb3IgdGhlIGRpZmZlcmVudCBwb3NzaWJsZSBzY2VuYXJpb3MKLSAqIGluIFNGX0ZVTExfT04gc3RhdGUuCisgKiBpbiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAqLworc3RhdGljIGNvbnN0CitfX2xlMzIgc2ZfZnVsbF90aW1lb3V0X2RlZltTRl9OVU1fU0NFTkFSSU9dW1NGX05VTV9USU1FT1VUX1RZUEVTXSA9IHsKKwl7CisJCWNwdV90b19sZTMyKFNGX1NJTkdMRV9VTklDQVNUX0FHSU5HX1RJTUVSX0RFRiksCisJCWNwdV90b19sZTMyKFNGX1NJTkdMRV9VTklDQVNUX0lETEVfVElNRVJfREVGKQorCX0sCisJeworCQljcHVfdG9fbGUzMihTRl9BR0dfVU5JQ0FTVF9BR0lOR19USU1FUl9ERUYpLAorCQljcHVfdG9fbGUzMihTRl9BR0dfVU5JQ0FTVF9JRExFX1RJTUVSX0RFRikKKwl9LAorCXsKKwkJY3B1X3RvX2xlMzIoU0ZfTUNBU1RfQUdJTkdfVElNRVJfREVGKSwKKwkJY3B1X3RvX2xlMzIoU0ZfTUNBU1RfSURMRV9USU1FUl9ERUYpCisJfSwKKwl7CisJCWNwdV90b19sZTMyKFNGX0JBX0FHSU5HX1RJTUVSX0RFRiksCisJCWNwdV90b19sZTMyKFNGX0JBX0lETEVfVElNRVJfREVGKQorCX0sCisJeworCQljcHVfdG9fbGUzMihTRl9UWF9SRV9BR0lOR19USU1FUl9ERUYpLAorCQljcHVfdG9fbGUzMihTRl9UWF9SRV9JRExFX1RJTUVSX0RFRikKKwl9LAorfTsKKworLyoKKyAqIEFnaW5nIGFuZCBpZGxlIHRpbWVvdXRzIGZvciB0aGUgZGlmZmVyZW50IHBvc3NpYmxlIHNjZW5hcmlvcworICogaW4gc2luZ2xlIEJTUyBNQUMgY29uZmlndXJhdGlvbi4KICAqLwogc3RhdGljIGNvbnN0IF9fbGUzMiBzZl9mdWxsX3RpbWVvdXRbU0ZfTlVNX1NDRU5BUklPXVtTRl9OVU1fVElNRU9VVF9UWVBFU10gPSB7CiAJewpAQCAtMTI0LDcgKzE1Miw4IEBACiAJfSwKIH07CiAKLXN0YXRpYyB2b2lkIGl3bF9tdm1fZmlsbF9zZl9jb21tYW5kKHN0cnVjdCBpd2xfc2ZfY2ZnX2NtZCAqc2ZfY21kLAorc3RhdGljIHZvaWQgaXdsX212bV9maWxsX3NmX2NvbW1hbmQoc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQkgICAgc3RydWN0IGl3bF9zZl9jZmdfY21kICpzZl9jbWQsCiAJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7CiAJaW50IGksIGosIHdhdGVybWFyazsKQEAgLTE2MywyNCArMTkyLDM4IEBACiAJCQkJCWNwdV90b19sZTMyKFNGX0xPTkdfREVMQVlfQUdJTkdfVElNRVIpOwogCQl9CiAJfQotCUJVSUxEX0JVR19PTihzaXplb2Yoc2ZfZnVsbF90aW1lb3V0KSAhPQotCQkgICAgIHNpemVvZihfX2xlMzIpICogU0ZfTlVNX1NDRU5BUklPICogU0ZfTlVNX1RJTUVPVVRfVFlQRVMpOwogCi0JbWVtY3B5KHNmX2NtZC0+ZnVsbF9vbl90aW1lb3V0cywgc2ZfZnVsbF90aW1lb3V0LAotCSAgICAgICBzaXplb2Yoc2ZfZnVsbF90aW1lb3V0KSk7CisJaWYgKHN0YSB8fCBJV0xfVUNPREVfQVBJKG12bS0+ZnctPnVjb2RlX3ZlcikgPCAxMykgeworCQlCVUlMRF9CVUdfT04oc2l6ZW9mKHNmX2Z1bGxfdGltZW91dCkgIT0KKwkJCSAgICAgc2l6ZW9mKF9fbGUzMikgKiBTRl9OVU1fU0NFTkFSSU8gKgorCQkJICAgICBTRl9OVU1fVElNRU9VVF9UWVBFUyk7CisKKwkJbWVtY3B5KHNmX2NtZC0+ZnVsbF9vbl90aW1lb3V0cywgc2ZfZnVsbF90aW1lb3V0LAorCQkgICAgICAgc2l6ZW9mKHNmX2Z1bGxfdGltZW91dCkpOworCX0gZWxzZSB7CisJCUJVSUxEX0JVR19PTihzaXplb2Yoc2ZfZnVsbF90aW1lb3V0X2RlZikgIT0KKwkJCSAgICAgc2l6ZW9mKF9fbGUzMikgKiBTRl9OVU1fU0NFTkFSSU8gKgorCQkJICAgICBTRl9OVU1fVElNRU9VVF9UWVBFUyk7CisKKwkJbWVtY3B5KHNmX2NtZC0+ZnVsbF9vbl90aW1lb3V0cywgc2ZfZnVsbF90aW1lb3V0X2RlZiwKKwkJICAgICAgIHNpemVvZihzZl9mdWxsX3RpbWVvdXRfZGVmKSk7CisJfQorCiB9CiAKIHN0YXRpYyBpbnQgaXdsX212bV9zZl9jb25maWcoc3RydWN0IGl3bF9tdm0gKm12bSwgdTggc3RhX2lkLAogCQkJICAgICBlbnVtIGl3bF9zZl9zdGF0ZSBuZXdfc3RhdGUpCiB7CiAJc3RydWN0IGl3bF9zZl9jZmdfY21kIHNmX2NtZCA9IHsKLQkJLnN0YXRlID0gY3B1X3RvX2xlMzIobmV3X3N0YXRlKSwKKwkJLnN0YXRlID0gY3B1X3RvX2xlMzIoU0ZfRlVMTF9PTiksCiAJfTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOwogCWludCByZXQgPSAwOwogCi0JaWYgKG12bS0+ZnctPnVjb2RlX2NhcGEuYXBpWzBdICYgSVdMX1VDT0RFX1RMVl9BUElfU0ZfTk9fRFVNTVlfTk9USUYgJiYKLQkgICAgbXZtLT5jZmctPmRpc2FibGVfZHVtbXlfbm90aWZpY2F0aW9uKQorCWlmIChJV0xfVUNPREVfQVBJKG12bS0+ZnctPnVjb2RlX3ZlcikgPCAxMykKKwkJc2ZfY21kLnN0YXRlID0gY3B1X3RvX2xlMzIobmV3X3N0YXRlKTsKKworCWlmIChtdm0tPmNmZy0+ZGlzYWJsZV9kdW1teV9ub3RpZmljYXRpb24pCiAJCXNmX2NtZC5zdGF0ZSB8PSBjcHVfdG9fbGUzMihTRl9DRkdfRFVNTVlfTk9USUZfT0ZGKTsKIAogCS8qCkBAIC0xOTIsNiArMjM1LDggQEAKIAogCXN3aXRjaCAobmV3X3N0YXRlKSB7CiAJY2FzZSBTRl9VTklOSVQ6CisJCWlmIChJV0xfVUNPREVfQVBJKG12bS0+ZnctPnVjb2RlX3ZlcikgPj0gMTMpCisJCQlpd2xfbXZtX2ZpbGxfc2ZfY29tbWFuZChtdm0sICZzZl9jbWQsIE5VTEwpOwogCQlicmVhazsKIAljYXNlIFNGX0ZVTExfT046CiAJCWlmIChzdGFfaWQgPT0gSVdMX01WTV9TVEFUSU9OX0NPVU5UKSB7CkBAIC0yMDYsMTEgKzI1MSwxMSBAQAogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlpd2xfbXZtX2ZpbGxfc2ZfY29tbWFuZCgmc2ZfY21kLCBzdGEpOworCQlpd2xfbXZtX2ZpbGxfc2ZfY29tbWFuZChtdm0sICZzZl9jbWQsIHN0YSk7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlicmVhazsKIAljYXNlIFNGX0lOSVRfT0ZGOgotCQlpd2xfbXZtX2ZpbGxfc2ZfY29tbWFuZCgmc2ZfY21kLCBOVUxMKTsKKwkJaXdsX212bV9maWxsX3NmX2NvbW1hbmQobXZtLCAmc2ZfY21kLCBOVUxMKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJV0FSTl9PTkNFKDEsICJJbnZhbGlkIHN0YXRlOiAlZC4gbm90IHNlbmRpbmcgU21hcnQgRmlmbyBjbWRcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zdGEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3N0YS5jCmluZGV4IDVjMjNjZGQuLjE4NDViNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3N0YS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3N0YS5jCkBAIC0yMDksOSArMjA5LDggQEAKIHsKIAl1bnNpZ25lZCBsb25nIHVzZWRfaHdfcXVldWVzOwogCXN0cnVjdCBpd2xfbXZtX3N0YSAqbXZtc3RhID0gaXdsX212bV9zdGFfZnJvbV9tYWM4MDIxMShzdGEpOwotCXVuc2lnbmVkIGludCB3ZGdfdGltZW91dCA9IGl3bG12bV9tb2RfcGFyYW1zLnRmZF9xX2hhbmdfZGV0ZWN0ID8KLQkJCQkJbXZtLT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0IDoKLQkJCQkJSVdMX1dBVENIRE9HX0RJU0FCTEVEOworCXVuc2lnbmVkIGludCB3ZGdfdGltZW91dCA9CisJCWl3bF9tdm1fZ2V0X3dkX3RpbWVvdXQobXZtLCBOVUxMLCB0cnVlLCBmYWxzZSk7CiAJdTMyIGFjOwogCiAJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbXZtLT5tdXRleCk7CkBAIC0yNzMsNyArMjcyLDcgQEAKIAllbHNlCiAJCXN0YV9pZCA9IG12bV9zdGEtPnN0YV9pZDsKIAotCWlmIChXQVJOX09OX09OQ0Uoc3RhX2lkID09IElXTF9NVk1fU1RBVElPTl9DT1VOVCkpCisJaWYgKHN0YV9pZCA9PSBJV0xfTVZNX1NUQVRJT05fQ09VTlQpCiAJCXJldHVybiAtRU5PU1BDOwogCiAJc3Bpbl9sb2NrX2luaXQoJm12bV9zdGEtPmxvY2spOwpAQCAtNDkxLDggKzQ5MCwxOCBAQAogCiAJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCiAJICAgIG12bXZpZi0+YXBfc3RhX2lkID09IG12bV9zdGEtPnN0YV9pZCkgeworCQlyZXQgPSBpd2xfbXZtX2RyYWluX3N0YShtdm0sIG12bV9zdGEsIHRydWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAkJLyogZmx1c2ggaXRzIHF1ZXVlcyBoZXJlIHNpbmNlIHdlIGFyZSBmcmVlaW5nIG12bV9zdGEgKi8KIAkJcmV0ID0gaXdsX212bV9mbHVzaF90eF9wYXRoKG12bSwgbXZtX3N0YS0+dGZkX3F1ZXVlX21zaywgdHJ1ZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBpd2xfdHJhbnNfd2FpdF90eF9xdWV1ZV9lbXB0eShtdm0tPnRyYW5zLAorCQkJCQkJICAgIG12bV9zdGEtPnRmZF9xdWV1ZV9tc2spOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gaXdsX212bV9kcmFpbl9zdGEobXZtLCBtdm1fc3RhLCBmYWxzZSk7CiAKIAkJLyogaWYgd2UgYXJlIGFzc29jaWF0ZWQgLSB3ZSBjYW4ndCByZW1vdmUgdGhlIEFQIFNUQSBub3cgKi8KIAkJaWYgKHZpZi0+YnNzX2NvbmYuYXNzb2MpCkBAIC05NzEsOSArOTgwLDggQEAKIHsKIAlzdHJ1Y3QgaXdsX212bV9zdGEgKm12bXN0YSA9IGl3bF9tdm1fc3RhX2Zyb21fbWFjODAyMTEoc3RhKTsKIAlzdHJ1Y3QgaXdsX212bV90aWRfZGF0YSAqdGlkX2RhdGEgPSAmbXZtc3RhLT50aWRfZGF0YVt0aWRdOwotCXVuc2lnbmVkIGludCB3ZGdfdGltZW91dCA9IGl3bG12bV9tb2RfcGFyYW1zLnRmZF9xX2hhbmdfZGV0ZWN0ID8KLQkJCQkJbXZtLT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0IDoKLQkJCQkJSVdMX1dBVENIRE9HX0RJU0FCTEVEOworCXVuc2lnbmVkIGludCB3ZGdfdGltZW91dCA9CisJCWl3bF9tdm1fZ2V0X3dkX3RpbWVvdXQobXZtLCB2aWYsIHN0YS0+dGRscywgZmFsc2UpOwogCWludCBxdWV1ZSwgZmlmbywgcmV0OwogCXUxNiBzc247CiAKQEAgLTExMjAsOCArMTEyOCwxMiBAQAogCXNwaW5fdW5sb2NrX2JoKCZtdm1zdGEtPmxvY2spOwogCiAJaWYgKG9sZF9zdGF0ZSA+PSBJV0xfQUdHX09OKSB7CisJCWl3bF9tdm1fZHJhaW5fc3RhKG12bSwgbXZtc3RhLCB0cnVlKTsKIAkJaWYgKGl3bF9tdm1fZmx1c2hfdHhfcGF0aChtdm0sIEJJVCh0eHFfaWQpLCB0cnVlKSkKIAkJCUlXTF9FUlIobXZtLCAiQ291bGRuJ3QgZmx1c2ggdGhlIEFHRyBxdWV1ZVxuIik7CisJCWl3bF90cmFuc193YWl0X3R4X3F1ZXVlX2VtcHR5KG12bS0+dHJhbnMsCisJCQkJCSAgICAgIG12bXN0YS0+dGZkX3F1ZXVlX21zayk7CisJCWl3bF9tdm1fZHJhaW5fc3RhKG12bSwgbXZtc3RhLCBmYWxzZSk7CiAKIAkJaXdsX212bV9zdGFfdHhfYWdnKG12bSwgc3RhLCB0aWQsIHR4cV9pZCwgZmFsc2UpOwogCkBAIC0xNjgxLDkgKzE2OTMsNiBAQAogCX07CiAJaW50IHJldDsKIAotCWlmICghKG12bS0+ZnctPnVjb2RlX2NhcGEuYXBpWzBdICYgSVdMX1VDT0RFX1RMVl9BUElfRElTQUJMRV9TVEFfVFgpKQotCQlyZXR1cm47Ci0KIAlyZXQgPSBpd2xfbXZtX3NlbmRfY21kX3BkdShtdm0sIEFERF9TVEEsIENNRF9BU1lOQywgc2l6ZW9mKGNtZCksICZjbWQpOwogCWlmIChyZXQpCiAJCUlXTF9FUlIobXZtLCAiRmFpbGVkIHRvIHNlbmQgQUREX1NUQSBjb21tYW5kICglZClcbiIsIHJldCk7CkBAIC0xNzA1LDggKzE3MTQsOCBAQAogCW12bV9zdGEtPmRpc2FibGVfdHggPSBkaXNhYmxlOwogCiAJLyoKLQkgKiBUZWxsIG1hYzgwMjExIHRvIHN0YXJ0L3N0b3AgcXVldWVpbmcgdHggZm9yIHRoaXMgc3RhdGlvbiwKLQkgKiBidXQgZG9uJ3Qgc3RvcCBxdWV1ZWluZyBpZiB0aGVyZSBhcmUgc3RpbGwgcGVuZGluZyBmcmFtZXMKKwkgKiBUZWxsIG1hYzgwMjExIHRvIHN0YXJ0L3N0b3AgcXVldWluZyB0eCBmb3IgdGhpcyBzdGF0aW9uLAorCSAqIGJ1dCBkb24ndCBzdG9wIHF1ZXVpbmcgaWYgdGhlcmUgYXJlIHN0aWxsIHBlbmRpbmcgZnJhbWVzCiAJICogZm9yIHRoaXMgc3RhdGlvbi4KIAkgKi8KIAlpZiAoZGlzYWJsZSB8fCAhYXRvbWljX3JlYWQoJm12bS0+cGVuZGluZ19mcmFtZXNbbXZtX3N0YS0+c3RhX2lkXSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zdGEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3N0YS5oCmluZGV4IGQ4ZjQ4OTc1Li43NDhmNWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zdGEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS9zdGEuaApAQCAtMTUwLDcgKzE1MCw3IEBACiAgKiBET0M6IHN0YXRpb24gdGFibGUgLSBBUCBTdGF0aW9uIGluIFNUQSBtb2RlCiAgKgogICogJWl3bF9tdm1fdmlmIGluY2x1ZGVzIHRoZSBpbmRleCBvZiB0aGUgQVAgc3RhdGlvbiBpbiB0aGUgZncncyBTVEEgdGFibGU6Ci0gKiAlYXBfc3RhX2lkLiBUbyBnZXQgdGhlIHBvaW50IHRvIHRoZSBjb3Jlc3BvbnNkaW5nICVpZWVlODAyMTFfc3RhLAorICogJWFwX3N0YV9pZC4gVG8gZ2V0IHRoZSBwb2ludCB0byB0aGUgY29ycmVzcG9uZGluZyAlaWVlZTgwMjExX3N0YSwKICAqICZmd19pZF90b19tYWNfaWQgY2FuIGJlIHVzZWQuIER1ZSB0byB0aGUgd2F5IHRoZSBmdyB3b3Jrcywgd2UgbXVzdCBub3QgcmVtb3ZlCiAgKiB0aGUgQVAgc3RhdGlvbiBmcm9tIHRoZSBmdyBiZWZvcmUgc2V0dGluZyB0aGUgTUFDIGNvbnRleHQgYXMgdW5hc3NvY2lhdGVkLgogICogSGVuY2UsICVmd19pZF90b19tYWNfaWRbJWFwX3N0YV9pZF0gd2lsbCBiZSBOVUxMZWQgd2hlbiB0aGUgQVAgc3RhdGlvbiBpcwpAQCAtMjA5LDE0ICsyMDksMTQgQEAKICAqIFdoZW4gYSB0cmlnZ2VyIGZyYW1lIGlzIHJlY2VpdmVkLCBtYWM4MDIxMSB0ZWxscyB0aGUgZHJpdmVyIHRvIHNlbmQgZnJhbWVzCiAgKiBmcm9tIHRoZSBBTVBEVSBxdWV1ZXMgb3Igc2VuZHMgZnJhbWVzIHRvIG5vbi1hZ2dyZWdhdGlvbiBxdWV1ZXMgaXRzZWxmLAogICogZGVwZW5kaW5nIG9uIHdoaWNoIEFDcyBhcmUgZGVsaXZlcnktZW5hYmxlZCBhbmQgd2hhdCBUSUQgaGFzIGZyYW1lcyB0bwotICogdHJhbnNtaXQuIE5vdGUgdGhhdCBtYWM4MDIxMSBoYXMgYWxsIHRoZSBrbm93bGVkZWdlIHNpbmNlIGFsbCB0aGUgbm9uLWFnZworICogdHJhbnNtaXQuIE5vdGUgdGhhdCBtYWM4MDIxMSBoYXMgYWxsIHRoZSBrbm93bGVkZ2Ugc2luY2UgYWxsIHRoZSBub24tYWdnCiAgKiBmcmFtZXMgYXJlIGJ1ZmZlcmVkIC8gZmlsdGVyZWQsIGFuZCB0aGUgZHJpdmVyIHRlbGxzIG1hYzgwMjExIGFib3V0IGFnZwogICogZnJhbWVzKS4gVGhlIGRyaXZlciBuZWVkcyB0byB0ZWxsIHRoZSBmdyB0byBsZXQgZnJhbWVzIG91dCBldmVuIGlmIHRoZQogICogc3RhdGlvbiBpcyBhc2xlZXAuIFRoaXMgaXMgZG9uZSBieSAlaXdsX212bV9zdGFfbW9kaWZ5X3NsZWVwX3R4X2NvdW50LgogICoKICAqIFdoZW4gd2UgcmVjZWl2ZSBhIGZyYW1lIGZyb20gdGhhdCBzdGF0aW9uIHdpdGggUE0gYml0IHVuc2V0LCB0aGUgZHJpdmVyCiAgKiBuZWVkcyB0byBsZXQgdGhlIGZ3IGtub3cgdGhhdCB0aGlzIHN0YXRpb24gaXNuJ3QgYXNsZWVwIGFueSBtb3JlLiBUaGlzIGlzCi0gKiBkb25lIGJ5ICVpd2xfbXZtX3N0YV9tb2RpZnlfcHNfd2FrZSBpbiByZXNwb25zZSB0byBtYWM4MDIxMSBzaWduYWxsaW5nIHRoZQorICogZG9uZSBieSAlaXdsX212bV9zdGFfbW9kaWZ5X3BzX3dha2UgaW4gcmVzcG9uc2UgdG8gbWFjODAyMTEgc2lnbmFsaW5nIHRoZQogICogc3RhdGlvbidzIHdha2V1cC4KICAqCiAgKiBGb3IgYSBHTywgdGhlIFNlcnZpY2UgUGVyaW9kIG1pZ2h0IGJlIGN1dCBzaG9ydCBkdWUgdG8gYW4gYWJzZW5jZSBwZXJpb2QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3RpbWUtZXZlbnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3RpbWUtZXZlbnQuYwppbmRleCA1NGZhZmJmLi5mZDdiMGQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS90aW1lLWV2ZW50LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdGltZS1ldmVudC5jCkBAIC0xMTksNyArMTE5LDcgQEAKIAogCS8qCiAJICogRmx1c2ggdGhlIG9mZmNoYW5uZWwgcXVldWUgLS0gdGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgdGltZQotCSAqIGV2ZW50IGZpbmlzaGVzIG9yIGlzIGNhbmNlbGxlZCwgc28gdGhhdCBmcmFtZXMgcXVldWVkIGZvciBpdAorCSAqIGV2ZW50IGZpbmlzaGVzIG9yIGlzIGNhbmNlbGVkLCBzbyB0aGF0IGZyYW1lcyBxdWV1ZWQgZm9yIGl0CiAJICogd29uJ3QgZ2V0IHN0dWNrIG9uIHRoZSBxdWV1ZSBhbmQgYmUgdHJhbnNtaXR0ZWQgaW4gdGhlIG5leHQKIAkgKiB0aW1lIGV2ZW50LgogCSAqIFdlIGhhdmUgdG8gc2VuZCB0aGUgY29tbWFuZCBhc3luY2hyb25vdXNseSBzaW5jZSB0aGlzIGNhbm5vdApAQCAtMTg3LDcgKzE4Nyw4IEBACiAJCXJldHVybiBmYWxzZTsKIAlpZiAoZXJybXNnKQogCQlJV0xfRVJSKG12bSwgIiVzXG4iLCBlcnJtc2cpOwotCWllZWU4MDIxMV9jb25uZWN0aW9uX2xvc3ModmlmKTsKKworCWl3bF9tdm1fY29ubmVjdGlvbl9sb3NzKG12bSwgdmlmLCBlcnJtc2cpOwogCXJldHVybiB0cnVlOwogfQogCkBAIC0xOTYsMTcgKzE5NywyNCBAQAogCQkJICAgICBzdHJ1Y3QgaXdsX212bV90aW1lX2V2ZW50X2RhdGEgKnRlX2RhdGEsCiAJCQkgICAgIHN0cnVjdCBpd2xfdGltZV9ldmVudF9ub3RpZiAqbm90aWYpCiB7Ci0JaWYgKCFsZTMyX3RvX2NwdShub3RpZi0+c3RhdHVzKSkgeworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB0ZV9kYXRhLT52aWY7CisJc3RydWN0IGl3bF9tdm1fdmlmICptdm12aWYgPSBpd2xfbXZtX3ZpZl9mcm9tX21hYzgwMjExKHZpZik7CisKKwlpZiAoIW5vdGlmLT5zdGF0dXMpCiAJCUlXTF9ERUJVR19URShtdm0sICJDU0EgdGltZSBldmVudCBmYWlsZWQgdG8gc3RhcnRcbiIpOwotCQlpd2xfbXZtX3RlX2NsZWFyX2RhdGEobXZtLCB0ZV9kYXRhKTsKLQkJcmV0dXJuOwotCX0KIAogCXN3aXRjaCAodGVfZGF0YS0+dmlmLT50eXBlKSB7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKKwkJaWYgKCFub3RpZi0+c3RhdHVzKQorCQkJbXZtdmlmLT5jc2FfZmFpbGVkID0gdHJ1ZTsKIAkJaXdsX212bV9jc2Ffbm9hX3N0YXJ0KG12bSk7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJaWYgKCFub3RpZi0+c3RhdHVzKSB7CisJCQlpd2xfbXZtX2Nvbm5lY3Rpb25fbG9zcyhtdm0sIHZpZiwKKwkJCQkJCSJDU0EgVEUgZmFpbGVkIHRvIHN0YXJ0Iik7CisJCQlicmVhazsKKwkJfQogCQlpd2xfbXZtX2NzYV9jbGllbnRfYWJzZW50KG12bSwgdGVfZGF0YS0+dmlmKTsKIAkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUodGVfZGF0YS0+dmlmLCB0cnVlKTsKIAkJYnJlYWs7CkBAIC0yMjAsNiArMjI4LDQ0IEBACiAJaXdsX212bV90ZV9jbGVhcl9kYXRhKG12bSwgdGVfZGF0YSk7CiB9CiAKK3N0YXRpYyB2b2lkIGl3bF9tdm1fdGVfY2hlY2tfdHJpZ2dlcihzdHJ1Y3QgaXdsX212bSAqbXZtLAorCQkJCSAgICAgc3RydWN0IGl3bF90aW1lX2V2ZW50X25vdGlmICpub3RpZiwKKwkJCQkgICAgIHN0cnVjdCBpd2xfbXZtX3RpbWVfZXZlbnRfZGF0YSAqdGVfZGF0YSkKK3sKKwlzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RsdiAqdHJpZzsKKwlzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RpbWVfZXZlbnQgKnRlX3RyaWc7CisJaW50IGk7CisKKwlpZiAoIWl3bF9md19kYmdfdHJpZ2dlcl9lbmFibGVkKG12bS0+ZncsIEZXX0RCR19UUklHR0VSX1RJTUVfRVZFTlQpKQorCQlyZXR1cm47CisKKwl0cmlnID0gaXdsX2Z3X2RiZ19nZXRfdHJpZ2dlcihtdm0tPmZ3LCBGV19EQkdfVFJJR0dFUl9USU1FX0VWRU5UKTsKKwl0ZV90cmlnID0gKHZvaWQgKil0cmlnLT5kYXRhOworCisJaWYgKCFpd2xfZndfZGJnX3RyaWdnZXJfY2hlY2tfc3RvcChtdm0sIHRlX2RhdGEtPnZpZiwgdHJpZykpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlX3RyaWctPnRpbWVfZXZlbnRzKTsgaSsrKSB7CisJCXUzMiB0cmlnX3RlX2lkID0gbGUzMl90b19jcHUodGVfdHJpZy0+dGltZV9ldmVudHNbaV0uaWQpOworCQl1MzIgdHJpZ19hY3Rpb25fYml0bWFwID0KKwkJCWxlMzJfdG9fY3B1KHRlX3RyaWctPnRpbWVfZXZlbnRzW2ldLmFjdGlvbl9iaXRtYXApOworCQl1MzIgdHJpZ19zdGF0dXNfYml0bWFwID0KKwkJCWxlMzJfdG9fY3B1KHRlX3RyaWctPnRpbWVfZXZlbnRzW2ldLnN0YXR1c19iaXRtYXApOworCisJCWlmICh0cmlnX3RlX2lkICE9IHRlX2RhdGEtPmlkIHx8CisJCSAgICAhKHRyaWdfYWN0aW9uX2JpdG1hcCAmIGxlMzJfdG9fY3B1KG5vdGlmLT5hY3Rpb24pKSB8fAorCQkgICAgISh0cmlnX3N0YXR1c19iaXRtYXAgJiBCSVQobGUzMl90b19jcHUobm90aWYtPnN0YXR1cykpKSkKKwkJCWNvbnRpbnVlOworCisJCWl3bF9tdm1fZndfZGJnX2NvbGxlY3RfdHJpZyhtdm0sIHRyaWcsCisJCQkJCSAgICAiVGltZSBldmVudCAlZCBBY3Rpb24gMHgleCByZWNlaXZlZCBzdGF0dXM6ICVkIiwKKwkJCQkJICAgIHRlX2RhdGEtPmlkLAorCQkJCQkgICAgbGUzMl90b19jcHUobm90aWYtPmFjdGlvbiksCisJCQkJCSAgICBsZTMyX3RvX2NwdShub3RpZi0+c3RhdHVzKSk7CisJCWJyZWFrOworCX0KK30KKwogLyoKICAqIEhhbmRsZXMgYSBGVyBub3RpZmljYXRpb24gZm9yIGFuIGV2ZW50IHRoYXQgaXMga25vd24gdG8gdGhlIGRyaXZlci4KICAqCkBAIC0yMzcsNiArMjgzLDggQEAKIAkJICAgICBsZTMyX3RvX2NwdShub3RpZi0+dW5pcXVlX2lkKSwKIAkJICAgICBsZTMyX3RvX2NwdShub3RpZi0+YWN0aW9uKSk7CiAKKwlpd2xfbXZtX3RlX2NoZWNrX3RyaWdnZXIobXZtLCBub3RpZiwgdGVfZGF0YSk7CisKIAkvKgogCSAqIFRoZSBGVyBzZW5kcyB0aGUgc3RhcnQvZW5kIHRpbWUgZXZlbnQgbm90aWZpY2F0aW9ucyBldmVuIGZvciBldmVudHMKIAkgKiB0aGF0IGl0IGZhaWxzIHRvIHNjaGVkdWxlLiBUaGlzIGlzIGluZGljYXRlZCBpbiB0aGUgc3RhdHVzIGZpZWxkIG9mCkBAIC0yNDYsMTEgKzI5NCwxNiBAQAogCSAqIGV2ZW50cyBpbiB0aGUgc3lzdGVtKS4KIAkgKi8KIAlpZiAoIWxlMzJfdG9fY3B1KG5vdGlmLT5zdGF0dXMpKSB7Ci0JCWJvb2wgc3RhcnQgPSBsZTMyX3RvX2NwdShub3RpZi0+YWN0aW9uKSAmCi0JCQkJVEVfVjJfTk9USUZfSE9TVF9FVkVOVF9TVEFSVDsKLQkJSVdMX1dBUk4obXZtLCAiVGltZSBFdmVudCAlcyBub3RpZmljYXRpb24gZmFpbHVyZVxuIiwKLQkJCSBzdGFydCA/ICJzdGFydCIgOiAiZW5kIik7Ci0JCWlmIChpd2xfbXZtX3RlX2NoZWNrX2Rpc2Nvbm5lY3QobXZtLCB0ZV9kYXRhLT52aWYsIE5VTEwpKSB7CisJCWNvbnN0IGNoYXIgKm1zZzsKKworCQlpZiAobm90aWYtPmFjdGlvbiAmIGNwdV90b19sZTMyKFRFX1YyX05PVElGX0hPU1RfRVZFTlRfU1RBUlQpKQorCQkJbXNnID0gIlRpbWUgRXZlbnQgc3RhcnQgbm90aWZpY2F0aW9uIGZhaWx1cmUiOworCQllbHNlCisJCQltc2cgPSAiVGltZSBFdmVudCBlbmQgbm90aWZpY2F0aW9uIGZhaWx1cmUiOworCisJCUlXTF9ERUJVR19URShtdm0sICIlc1xuIiwgbXNnKTsKKworCQlpZiAoaXdsX212bV90ZV9jaGVja19kaXNjb25uZWN0KG12bSwgdGVfZGF0YS0+dmlmLCBtc2cpKSB7CiAJCQlpd2xfbXZtX3RlX2NsZWFyX2RhdGEobXZtLCB0ZV9kYXRhKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMjYxLDE3ICszMTQsMjMgQEAKIAkJCSAgICAgIlRFIGVuZGVkIC0gY3VycmVudCB0aW1lICVsdSwgZXN0aW1hdGVkIGVuZCAlbHVcbiIsCiAJCQkgICAgIGppZmZpZXMsIHRlX2RhdGEtPmVuZF9qaWZmaWVzKTsKIAotCQlpZiAodGVfZGF0YS0+dmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0UpIHsKKwkJc3dpdGNoICh0ZV9kYXRhLT52aWYtPnR5cGUpIHsKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFOgogCQkJaWVlZTgwMjExX3JlbWFpbl9vbl9jaGFubmVsX2V4cGlyZWQobXZtLT5odyk7CiAJCQlpd2xfbXZtX3JvY19maW5pc2hlZChtdm0pOworCQkJYnJlYWs7CisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJCS8qCisJCQkgKiBCeSBub3csIHdlIHNob3VsZCBoYXZlIGZpbmlzaGVkIGFzc29jaWF0aW9uCisJCQkgKiBhbmQga25vdyB0aGUgZHRpbSBwZXJpb2QuCisJCQkgKi8KKwkJCWl3bF9tdm1fdGVfY2hlY2tfZGlzY29ubmVjdChtdm0sIHRlX2RhdGEtPnZpZiwKKwkJCQkiTm8gYXNzb2NpYXRpb24gYW5kIHRoZSB0aW1lIGV2ZW50IGlzIG92ZXIgYWxyZWFkeS4uLiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKIAkJfQogCi0JCS8qCi0JCSAqIEJ5IG5vdywgd2Ugc2hvdWxkIGhhdmUgZmluaXNoZWQgYXNzb2NpYXRpb24KLQkJICogYW5kIGtub3cgdGhlIGR0aW0gcGVyaW9kLgotCQkgKi8KLQkJaXdsX212bV90ZV9jaGVja19kaXNjb25uZWN0KG12bSwgdGVfZGF0YS0+dmlmLAotCQkJIk5vIGFzc29jaWF0aW9uIGFuZCB0aGUgdGltZSBldmVudCBpcyBvdmVyIGFscmVhZHkuLi4iKTsKIAkJaXdsX212bV90ZV9jbGVhcl9kYXRhKG12bSwgdGVfZGF0YSk7CiAJfSBlbHNlIGlmIChsZTMyX3RvX2NwdShub3RpZi0+YWN0aW9uKSAmIFRFX1YyX05PVElGX0hPU1RfRVZFTlRfU1RBUlQpIHsKIAkJdGVfZGF0YS0+cnVubmluZyA9IHRydWU7CkBAIC0zMDcsNiArMzY2LDggQEAKIAlpZiAoIWF1eF9yb2NfdGUpIC8qIE5vdCBhIEF1eCBST0MgdGltZSBldmVudCAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWl3bF9tdm1fdGVfY2hlY2tfdHJpZ2dlcihtdm0sIG5vdGlmLCB0ZV9kYXRhKTsKKwogCWlmICghbGUzMl90b19jcHUobm90aWYtPnN0YXR1cykpIHsKIAkJSVdMX0RFQlVHX1RFKG12bSwKIAkJCSAgICAgIkVSUk9SOiBBdXggUk9DIFRpbWUgRXZlbnQgJXMgbm90aWZpY2F0aW9uIGZhaWx1cmVcbiIsCkBAIC03NTAsOCArODExLDcgQEAKIAkgKiByZXF1ZXN0CiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZV9kYXRhLCAmbXZtLT50aW1lX2V2ZW50X2xpc3QsIGxpc3QpIHsKLQkJaWYgKHRlX2RhdGEtPnZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9QMlBfREVWSUNFICYmCi0JCSAgICB0ZV9kYXRhLT5ydW5uaW5nKSB7CisJCWlmICh0ZV9kYXRhLT52aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRSkgewogCQkJbXZtdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh0ZV9kYXRhLT52aWYpOwogCQkJaXNfcDJwID0gdHJ1ZTsKIAkJCWdvdG8gcmVtb3ZlX3RlOwpAQCAtNzYyLDE0ICs4MjIsMTIgQEAKIAkgKiBJdGVyYXRlIG92ZXIgdGhlIGxpc3Qgb2YgYXV4IHJvYyB0aW1lIGV2ZW50cyBhbmQgZmluZCB0aGUgdGltZQogCSAqIGV2ZW50IHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgQlNTIGludGVyZmFjZS4KIAkgKiBUaGlzIGFzc3VtZXMgdGhhdCBhIEJTUyBpbnRlcmZhY2UgY2FuIGhhdmUgb25seSBhIHNpbmdsZSB0aW1lCi0JICogZXZlbnQgYXQgYW55IGdpdmVuIHRpbWUgYW5kIHRoaXMgdGltZSBldmVudCBjb3Jlc3BvbmRzIHRvIGEgUk9DCisJICogZXZlbnQgYXQgYW55IGdpdmVuIHRpbWUgYW5kIHRoaXMgdGltZSBldmVudCBjb3JyZXNwb25kcyB0byBhIFJPQwogCSAqIHJlcXVlc3QKIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRlX2RhdGEsICZtdm0tPmF1eF9yb2NfdGVfbGlzdCwgbGlzdCkgewotCQlpZiAodGVfZGF0YS0+cnVubmluZykgewotCQkJbXZtdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh0ZV9kYXRhLT52aWYpOwotCQkJZ290byByZW1vdmVfdGU7Ci0JCX0KKwkJbXZtdmlmID0gaXdsX212bV92aWZfZnJvbV9tYWM4MDIxMSh0ZV9kYXRhLT52aWYpOworCQlnb3RvIHJlbW92ZV90ZTsKIAl9CiAKIHJlbW92ZV90ZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3RpbWUtZXZlbnQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3RpbWUtZXZlbnQuaAppbmRleCA2ZjZiMzVkLi5kZTRmYmM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS90aW1lLWV2ZW50LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdGltZS1ldmVudC5oCkBAIC0xNDcsNyArMTQ3LDcgQEAKICAqIEB2aWY6IHRoZSB2aXJ0dWFsIGludGVyZmFjZSBmb3Igd2hpY2ggdGhlIHNlc3Npb24gaXMgaXNzdWVkCiAgKgogICogVGhpcyBmdW5jdGlvbnMgY2FuY2VscyB0aGUgc2Vzc2lvbiBwcm90ZWN0aW9uIHdoaWNoIGlzIGFuIGFjdCBvZiBnb29kCi0gKiBjaXRpemVuc2hpcC4gSWYgaXQgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSBpdCBzaG91bGQgYmUgY2FuY2VsbGVkIGJlY2F1c2UKKyAqIGNpdGl6ZW5zaGlwLiBJZiBpdCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGl0IHNob3VsZCBiZSBjYW5jZWxlZCBiZWNhdXNlCiAgKiB0aGUgb3RoZXIgYmluZGluZ3Mgd2FpdCBmb3IgdGhlIG1lZGl1bSBkdXJpbmcgdGhhdCB0aW1lLgogICogVGhpcyBmdW50aW9ucyBkb2Vzbid0IHNsZWVwLgogICovCkBAIC0xNjIsNyArMTYyLDcgQEAKIAkJCQlzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCk7CiAKIC8qKgotICogaXdsX212bV9zdGFydF9wMnBfcm9jIC0gc3RhcnQgcmVtYWluIG9uIGNoYW5uZWwgZm9yIHAycCBkZXZpY2UgZnVuY3Rpb25saXR5CisgKiBpd2xfbXZtX3N0YXJ0X3AycF9yb2MgLSBzdGFydCByZW1haW4gb24gY2hhbm5lbCBmb3IgcDJwIGRldmljZSBmdW5jdGlvbmFsaXR5CiAgKiBAbXZtOiB0aGUgbXZtIGNvbXBvbmVudAogICogQHZpZjogdGhlIHZpcnR1YWwgaW50ZXJmYWNlIGZvciB3aGljaCB0aGUgcm9jIGlzIHJlcXVlc3RlZC4gSXQgaXMgYXNzdW1lZAogICogdGhhdCB0aGUgdmlmIHR5cGUgaXMgTkw4MDIxMV9JRlRZUEVfUDJQX0RFVklDRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3R4LmMKaW5kZXggMDczMDRlMS4uZWYzMmUxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS90eC5jCkBAIC02NjQsNiArNjY0LDggQEAKIAkJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmNvdW50ID0gdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSArIDE7CiAJCWl3bF9tdm1faHdyYXRlX3RvX3R4X3N0YXR1cyhsZTMyX3RvX2NwdSh0eF9yZXNwLT5pbml0aWFsX3JhdGUpLAogCQkJCQkgICAgaW5mbyk7CisJCWluZm8tPnN0YXR1cy5zdGF0dXNfZHJpdmVyX2RhdGFbMV0gPQorCQkJKHZvaWQgKikodWludHB0cl90KWxlMzJfdG9fY3B1KHR4X3Jlc3AtPmluaXRpYWxfcmF0ZSk7CiAKIAkJLyogU2luZ2xlIGZyYW1lIGZhaWx1cmUgaW4gYW4gQU1QRFUgcXVldWUgPT4gc2VuZCBCQVIgKi8KIAkJaWYgKHR4cV9pZCA+PSBtdm0tPmZpcnN0X2FnZ19xdWV1ZSAmJgpAQCAtOTA5LDYgKzkxMSw4IEBACiAJaW5mby0+c3RhdHVzLnR4X3RpbWUgPSB0aWRfZGF0YS0+dHhfdGltZTsKIAlpbmZvLT5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzBdID0KIAkJKHZvaWQgKikodWludHB0cl90KXRpZF9kYXRhLT5yZWR1Y2VkX3RwYzsKKwlpbmZvLT5zdGF0dXMuc3RhdHVzX2RyaXZlcl9kYXRhWzFdID0KKwkJKHZvaWQgKikodWludHB0cl90KXRpZF9kYXRhLT5yYXRlX25fZmxhZ3M7CiB9CiAKIGludCBpd2xfbXZtX3J4X2JhX25vdGlmKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpd2xfcnhfY21kX2J1ZmZlciAqcnhiLApAQCAtOTQ5LDggKzk1MywxMCBAQAogCW12bXN0YSA9IGl3bF9tdm1fc3RhX2Zyb21fbWFjODAyMTEoc3RhKTsKIAl0aWRfZGF0YSA9ICZtdm1zdGEtPnRpZF9kYXRhW3RpZF07CiAKLQlpZiAoV0FSTl9PTkNFKHRpZF9kYXRhLT50eHFfaWQgIT0gc2NkX2Zsb3csICJRICVkLCB0aWQgJWQsIGZsb3cgJWQiLAotCQkgICAgICB0aWRfZGF0YS0+dHhxX2lkLCB0aWQsIHNjZF9mbG93KSkgeworCWlmICh0aWRfZGF0YS0+dHhxX2lkICE9IHNjZF9mbG93KSB7CisJCUlXTF9FUlIobXZtLAorCQkJImludmFsaWQgQkEgbm90aWZpY2F0aW9uOiBRICVkLCB0aWQgJWQsIGZsb3cgJWRcbiIsCisJCQl0aWRfZGF0YS0+dHhxX2lkLCB0aWQsIHNjZF9mbG93KTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybiAwOwogCX0KQEAgLTEwNDMsNiArMTA0OSwxNCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogTm90ZSB0aGF0IHRoZXJlIGFyZSB0cmFuc3BvcnRzIHRoYXQgYnVmZmVyIGZyYW1lcyBiZWZvcmUgdGhleSByZWFjaAorICogdGhlIGZpcm13YXJlLiBUaGlzIG1lYW5zIHRoYXQgYWZ0ZXIgZmx1c2hfdHhfcGF0aCBpcyBjYWxsZWQsIHRoZQorICogcXVldWUgbWlnaHQgbm90IGJlIGVtcHR5LiBUaGUgcmFjZS1mcmVlIHdheSB0byBoYW5kbGUgdGhpcyBpcyB0bzoKKyAqIDEpIHNldCB0aGUgc3RhdGlvbiBhcyBkcmFpbmluZworICogMikgZmx1c2ggdGhlIFR4IHBhdGgKKyAqIDMpIHdhaXQgZm9yIHRoZSB0cmFuc3BvcnQgcXVldWVzIHRvIGJlIGVtcHR5CisgKi8KIGludCBpd2xfbXZtX2ZsdXNoX3R4X3BhdGgoc3RydWN0IGl3bF9tdm0gKm12bSwgdTMyIHRmZF9tc2ssIGJvb2wgc3luYykKIHsKIAlpbnQgcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdXRpbHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvbXZtL3V0aWxzLmMKaW5kZXggOGRlY2Y5OS4uYmM1NWE4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9tdm0vdXRpbHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL212bS91dGlscy5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIH0KIAogLyoKLSAqIFdlIGFzc3VtZSB0aGF0IHRoZSBjYWxsZXIgc2V0IHRoZSBzdGF0dXMgdG8gdGhlIHN1Y2VzcyB2YWx1ZQorICogV2UgYXNzdW1lIHRoYXQgdGhlIGNhbGxlciBzZXQgdGhlIHN0YXR1cyB0byB0aGUgc3VjY2VzcyB2YWx1ZQogICovCiBpbnQgaXdsX212bV9zZW5kX2NtZF9zdGF0dXMoc3RydWN0IGl3bF9tdm0gKm12bSwgc3RydWN0IGl3bF9ob3N0X2NtZCAqY21kLAogCQkJICAgIHUzMiAqc3RhdHVzKQpAQCAtMzMyLDcgKzMzMiw3IEBACiAgKiByZWFkIHdpdGggdTMyLXNpemVkIGFjY2Vzc2VzLCBhbnkgbWVtYmVycyB3aXRoIGEgZGlmZmVyZW50IHNpemUKICAqIG5lZWQgdG8gYmUgb3JkZXJlZCBjb3JyZWN0bHkgdGhvdWdoIQogICovCi1zdHJ1Y3QgaXdsX2Vycm9yX2V2ZW50X3RhYmxlIHsKK3N0cnVjdCBpd2xfZXJyb3JfZXZlbnRfdGFibGVfdjEgewogCXUzMiB2YWxpZDsJCS8qIChub256ZXJvKSB2YWxpZCwgKDApIGxvZyBpcyBlbXB0eSAqLwogCXUzMiBlcnJvcl9pZDsJCS8qIHR5cGUgb2YgZXJyb3IgKi8KIAl1MzIgcGM7CQkJLyogcHJvZ3JhbSBjb3VudGVyICovCkBAIC0zNzcsNyArMzc3LDU1IEBACiAJdTMyIHVfdGltZXN0YW1wOwkvKiBpbmRpY2F0ZSB3aGVuIHRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZQogCQkJCSAqIGNvbXBpbGF0aW9uICovCiAJdTMyIGZsb3dfaGFuZGxlcjsJLyogRkggcmVhZC93cml0ZSBwb2ludGVycywgUlggY3JlZGl0ICovCi19IF9fcGFja2VkOworfSBfX3BhY2tlZCAvKiBMT0dfRVJST1JfVEFCTEVfQVBJX1NfVkVSXzEgKi87CisKK3N0cnVjdCBpd2xfZXJyb3JfZXZlbnRfdGFibGUgeworCXUzMiB2YWxpZDsJCS8qIChub256ZXJvKSB2YWxpZCwgKDApIGxvZyBpcyBlbXB0eSAqLworCXUzMiBlcnJvcl9pZDsJCS8qIHR5cGUgb2YgZXJyb3IgKi8KKwl1MzIgcGM7CQkJLyogcHJvZ3JhbSBjb3VudGVyICovCisJdTMyIGJsaW5rMTsJCS8qIGJyYW5jaCBsaW5rICovCisJdTMyIGJsaW5rMjsJCS8qIGJyYW5jaCBsaW5rICovCisJdTMyIGlsaW5rMTsJCS8qIGludGVycnVwdCBsaW5rICovCisJdTMyIGlsaW5rMjsJCS8qIGludGVycnVwdCBsaW5rICovCisJdTMyIGRhdGExOwkJLyogZXJyb3Itc3BlY2lmaWMgZGF0YSAqLworCXUzMiBkYXRhMjsJCS8qIGVycm9yLXNwZWNpZmljIGRhdGEgKi8KKwl1MzIgZGF0YTM7CQkvKiBlcnJvci1zcGVjaWZpYyBkYXRhICovCisJdTMyIGJjb25fdGltZTsJCS8qIGJlYWNvbiB0aW1lciAqLworCXUzMiB0c2ZfbG93OwkJLyogbmV0d29yayB0aW1lc3RhbXAgZnVuY3Rpb24gdGltZXIgKi8KKwl1MzIgdHNmX2hpOwkJLyogbmV0d29yayB0aW1lc3RhbXAgZnVuY3Rpb24gdGltZXIgKi8KKwl1MzIgZ3AxOwkJLyogR1AxIHRpbWVyIHJlZ2lzdGVyICovCisJdTMyIGdwMjsJCS8qIEdQMiB0aW1lciByZWdpc3RlciAqLworCXUzMiBncDM7CQkvKiBHUDMgdGltZXIgcmVnaXN0ZXIgKi8KKwl1MzIgbWFqb3I7CQkvKiB1Q29kZSB2ZXJzaW9uIG1ham9yICovCisJdTMyIG1pbm9yOwkJLyogdUNvZGUgdmVyc2lvbiBtaW5vciAqLworCXUzMiBod192ZXI7CQkvKiBIVyBTaWxpY29uIHZlcnNpb24gKi8KKwl1MzIgYnJkX3ZlcjsJCS8qIEhXIGJvYXJkIHZlcnNpb24gKi8KKwl1MzIgbG9nX3BjOwkJLyogbG9nIHByb2dyYW0gY291bnRlciAqLworCXUzMiBmcmFtZV9wdHI7CQkvKiBmcmFtZSBwb2ludGVyICovCisJdTMyIHN0YWNrX3B0cjsJCS8qIHN0YWNrIHBvaW50ZXIgKi8KKwl1MzIgaGNtZDsJCS8qIGxhc3QgaG9zdCBjb21tYW5kIGhlYWRlciAqLworCXUzMiBpc3IwOwkJLyogaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IwOgorCQkJCSAqIHJ4dHhfZmxhZyAqLworCXUzMiBpc3IxOwkJLyogaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IxOgorCQkJCSAqIGhvc3RfZmxhZyAqLworCXUzMiBpc3IyOwkJLyogaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IyOgorCQkJCSAqIGVuY19mbGFnICovCisJdTMyIGlzcjM7CQkvKiBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjM6CisJCQkJICogdGltZV9mbGFnICovCisJdTMyIGlzcjQ7CQkvKiBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjQ6CisJCQkJICogd2ljbyBpbnRlcnJ1cHQgKi8KKwl1MzIgaXNyX3ByZWY7CQkvKiBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX1BSRUZfU1RBVCAqLworCXUzMiB3YWl0X2V2ZW50OwkJLyogd2FpdCBldmVudCgpIGNhbGxlciBhZGRyZXNzICovCisJdTMyIGwycF9jb250cm9sOwkvKiBMMnBDb250cm9sRmllbGQgKi8KKwl1MzIgbDJwX2R1cmF0aW9uOwkvKiBMMnBEdXJhdGlvbkZpZWxkICovCisJdTMyIGwycF9taHZhbGlkOwkvKiBMMnBNaFZhbGlkQml0cyAqLworCXUzMiBsMnBfYWRkcl9tYXRjaDsJLyogTDJwQWRkck1hdGNoU3RhdCAqLworCXUzMiBsbXBtX3BtZ19zZWw7CS8qIGluZGljYXRlIHdoaWNoIGNsb2NrcyBhcmUgdHVybmVkIG9uCisJCQkJICogKExNUE1fUE1HX1NFTCkgKi8KKwl1MzIgdV90aW1lc3RhbXA7CS8qIGluZGljYXRlIHdoZW4gdGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlCisJCQkJICogY29tcGlsYXRpb24gKi8KKwl1MzIgZmxvd19oYW5kbGVyOwkvKiBGSCByZWFkL3dyaXRlIHBvaW50ZXJzLCBSWCBjcmVkaXQgKi8KK30gX19wYWNrZWQgLyogTE9HX0VSUk9SX1RBQkxFX0FQSV9TX1ZFUl8yICovOwogCiAvKgogICogVU1BQyBlcnJvciBzdHJ1Y3QgLSByZWxldmFudCBzdGFydGluZyBmcm9tIGZhbWlseSA4MDAwIGNoaXAuCkBAIC0zOTYsMTEgKzQ0NCwxMSBAQAogCXUzMiBkYXRhMTsJCS8qIGVycm9yLXNwZWNpZmljIGRhdGEgKi8KIAl1MzIgZGF0YTI7CQkvKiBlcnJvci1zcGVjaWZpYyBkYXRhICovCiAJdTMyIGRhdGEzOwkJLyogZXJyb3Itc3BlY2lmaWMgZGF0YSAqLwotCXUzMiB1bWFjX2Z3X3ZlcjsJLyogVU1BQyB2ZXJzaW9uICovCi0JdTMyIHVtYWNfZndfYXBpX3ZlcjsJLyogVU1BQyBGVyBBUEkgdmVyICovCisJdTMyIHVtYWNfbWFqb3I7CisJdTMyIHVtYWNfbWlub3I7CiAJdTMyIGZyYW1lX3BvaW50ZXI7CS8qIGNvcmUgcmVnaXN0ZXIgMjcqLwogCXUzMiBzdGFja19wb2ludGVyOwkvKiBjb3JlIHJlZ2lzdGVyIDI4ICovCi0JdTMyIGNtZF9oZWFkZXI7CS8qIGxhdGVzdCBob3N0IGNtZCBzZW50IHRvIFVNQUMgKi8KKwl1MzIgY21kX2hlYWRlcjsJCS8qIGxhdGVzdCBob3N0IGNtZCBzZW50IHRvIFVNQUMgKi8KIAl1MzIgbmljX2lzcl9wcmVmOwkvKiBJU1Igc3RhdHVzIHJlZ2lzdGVyICovCiB9IF9fcGFja2VkOwogCkBAIC00NDEsMTggKzQ4OSwxOCBAQAogCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgdW1hYyBkYXRhMVxuIiwgdGFibGUuZGF0YTEpOwogCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgdW1hYyBkYXRhMlxuIiwgdGFibGUuZGF0YTIpOwogCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgdW1hYyBkYXRhM1xuIiwgdGFibGUuZGF0YTMpOwotCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgdW1hYyB2ZXJzaW9uXG4iLCB0YWJsZS51bWFjX2Z3X3Zlcik7Ci0JSVdMX0VSUihtdm0sICIweCUwOFggfCB1bWFjIGFwaSB2ZXJzaW9uXG4iLCB0YWJsZS51bWFjX2Z3X2FwaV92ZXIpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgdW1hYyBtYWpvclxuIiwgdGFibGUudW1hY19tYWpvcik7CisJSVdMX0VSUihtdm0sICIweCUwOFggfCB1bWFjIG1pbm9yXG4iLCB0YWJsZS51bWFjX21pbm9yKTsKIAlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IGZyYW1lIHBvaW50ZXJcbiIsIHRhYmxlLmZyYW1lX3BvaW50ZXIpOwogCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgc3RhY2sgcG9pbnRlclxuIiwgdGFibGUuc3RhY2tfcG9pbnRlcik7CiAJSVdMX0VSUihtdm0sICIweCUwOFggfCBsYXN0IGhvc3QgY21kXG4iLCB0YWJsZS5jbWRfaGVhZGVyKTsKIAlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IGlzciBzdGF0dXMgcmVnXG4iLCB0YWJsZS5uaWNfaXNyX3ByZWYpOwogfQogCi12b2lkIGl3bF9tdm1fZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpd2xfbXZtICptdm0pCitzdGF0aWMgdm9pZCBpd2xfbXZtX2R1bXBfbmljX2Vycm9yX2xvZ19vbGQoc3RydWN0IGl3bF9tdm0gKm12bSkKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyA9IG12bS0+dHJhbnM7Ci0Jc3RydWN0IGl3bF9lcnJvcl9ldmVudF90YWJsZSB0YWJsZTsKKwlzdHJ1Y3QgaXdsX2Vycm9yX2V2ZW50X3RhYmxlX3YxIHRhYmxlOwogCXUzMiBiYXNlOwogCiAJYmFzZSA9IG12bS0+ZXJyb3JfZXZlbnRfdGFibGU7CkBAIC00ODksNyArNTM3LDcgQEAKIAkJCQkgICAgICB0YWJsZS5kYXRhMSwgdGFibGUuZGF0YTIsIHRhYmxlLmRhdGEzLAogCQkJCSAgICAgIHRhYmxlLmJsaW5rMSwgdGFibGUuYmxpbmsyLCB0YWJsZS5pbGluazEsCiAJCQkJICAgICAgdGFibGUuaWxpbmsyLCB0YWJsZS5iY29uX3RpbWUsIHRhYmxlLmdwMSwKLQkJCQkgICAgICB0YWJsZS5ncDIsIHRhYmxlLmdwMywgdGFibGUudWNvZGVfdmVyLAorCQkJCSAgICAgIHRhYmxlLmdwMiwgdGFibGUuZ3AzLCB0YWJsZS51Y29kZV92ZXIsIDAsCiAJCQkJICAgICAgdGFibGUuaHdfdmVyLCB0YWJsZS5icmRfdmVyKTsKIAlJV0xfRVJSKG12bSwgIjB4JTA4WCB8ICUtMjhzXG4iLCB0YWJsZS5lcnJvcl9pZCwKIAkJZGVzY19sb29rdXAodGFibGUuZXJyb3JfaWQpKTsKQEAgLTUzMCw2ICs1NzgsOTIgQEAKIAkJaXdsX212bV9kdW1wX3VtYWNfZXJyb3JfbG9nKG12bSk7CiB9CiAKK3ZvaWQgaXdsX212bV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGl3bF9tdm0gKm12bSkKK3sKKwlzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyA9IG12bS0+dHJhbnM7CisJc3RydWN0IGl3bF9lcnJvcl9ldmVudF90YWJsZSB0YWJsZTsKKwl1MzIgYmFzZTsKKworCWlmICghKG12bS0+ZnctPnVjb2RlX2NhcGEuYXBpWzBdICYgSVdMX1VDT0RFX1RMVl9BUElfTkVXX1ZFUlNJT04pKSB7CisJCWl3bF9tdm1fZHVtcF9uaWNfZXJyb3JfbG9nX29sZChtdm0pOworCQlyZXR1cm47CisJfQorCisJYmFzZSA9IG12bS0+ZXJyb3JfZXZlbnRfdGFibGU7CisJaWYgKG12bS0+Y3VyX3Vjb2RlID09IElXTF9VQ09ERV9JTklUKSB7CisJCWlmICghYmFzZSkKKwkJCWJhc2UgPSBtdm0tPmZ3LT5pbml0X2VycmxvZ19wdHI7CisJfSBlbHNlIHsKKwkJaWYgKCFiYXNlKQorCQkJYmFzZSA9IG12bS0+ZnctPmluc3RfZXJybG9nX3B0cjsKKwl9CisKKwlpZiAoYmFzZSA8IDB4ODAwMDAwKSB7CisJCUlXTF9FUlIobXZtLAorCQkJIk5vdCB2YWxpZCBlcnJvciBsb2cgcG9pbnRlciAweCUwOFggZm9yICVzIHVDb2RlXG4iLAorCQkJYmFzZSwKKwkJCShtdm0tPmN1cl91Y29kZSA9PSBJV0xfVUNPREVfSU5JVCkKKwkJCQkJPyAiSW5pdCIgOiAiUlQiKTsKKwkJcmV0dXJuOworCX0KKworCWl3bF90cmFuc19yZWFkX21lbV9ieXRlcyh0cmFucywgYmFzZSwgJnRhYmxlLCBzaXplb2YodGFibGUpKTsKKworCWlmIChFUlJPUl9TVEFSVF9PRkZTRVQgPD0gdGFibGUudmFsaWQgKiBFUlJPUl9FTEVNX1NJWkUpIHsKKwkJSVdMX0VSUih0cmFucywgIlN0YXJ0IElXTCBFcnJvciBMb2cgRHVtcDpcbiIpOworCQlJV0xfRVJSKHRyYW5zLCAiU3RhdHVzOiAweCUwOGxYLCBjb3VudDogJWRcbiIsCisJCQltdm0tPnN0YXR1cywgdGFibGUudmFsaWQpOworCX0KKworCS8qIERvIG5vdCBjaGFuZ2UgdGhpcyBvdXRwdXQgLSBzY3JpcHRzIHJlbHkgb24gaXQgKi8KKworCUlXTF9FUlIobXZtLCAiTG9hZGVkIGZpcm13YXJlIHZlcnNpb246ICVzXG4iLCBtdm0tPmZ3LT5md192ZXJzaW9uKTsKKworCXRyYWNlX2l3bHdpZmlfZGV2X3Vjb2RlX2Vycm9yKHRyYW5zLT5kZXYsIHRhYmxlLmVycm9yX2lkLCB0YWJsZS50c2ZfbG93LAorCQkJCSAgICAgIHRhYmxlLmRhdGExLCB0YWJsZS5kYXRhMiwgdGFibGUuZGF0YTMsCisJCQkJICAgICAgdGFibGUuYmxpbmsxLCB0YWJsZS5ibGluazIsIHRhYmxlLmlsaW5rMSwKKwkJCQkgICAgICB0YWJsZS5pbGluazIsIHRhYmxlLmJjb25fdGltZSwgdGFibGUuZ3AxLAorCQkJCSAgICAgIHRhYmxlLmdwMiwgdGFibGUuZ3AzLCB0YWJsZS5tYWpvciwKKwkJCQkgICAgICB0YWJsZS5taW5vciwgdGFibGUuaHdfdmVyLCB0YWJsZS5icmRfdmVyKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8ICUtMjhzXG4iLCB0YWJsZS5lcnJvcl9pZCwKKwkJZGVzY19sb29rdXAodGFibGUuZXJyb3JfaWQpKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IHVQY1xuIiwgdGFibGUucGMpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgYnJhbmNobGluazFcbiIsIHRhYmxlLmJsaW5rMSk7CisJSVdMX0VSUihtdm0sICIweCUwOFggfCBicmFuY2hsaW5rMlxuIiwgdGFibGUuYmxpbmsyKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IGludGVycnVwdGxpbmsxXG4iLCB0YWJsZS5pbGluazEpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgaW50ZXJydXB0bGluazJcbiIsIHRhYmxlLmlsaW5rMik7CisJSVdMX0VSUihtdm0sICIweCUwOFggfCBkYXRhMVxuIiwgdGFibGUuZGF0YTEpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgZGF0YTJcbiIsIHRhYmxlLmRhdGEyKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IGRhdGEzXG4iLCB0YWJsZS5kYXRhMyk7CisJSVdMX0VSUihtdm0sICIweCUwOFggfCBiZWFjb24gdGltZVxuIiwgdGFibGUuYmNvbl90aW1lKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IHRzZiBsb3dcbiIsIHRhYmxlLnRzZl9sb3cpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgdHNmIGhpXG4iLCB0YWJsZS50c2ZfaGkpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgdGltZSBncDFcbiIsIHRhYmxlLmdwMSk7CisJSVdMX0VSUihtdm0sICIweCUwOFggfCB0aW1lIGdwMlxuIiwgdGFibGUuZ3AyKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IHRpbWUgZ3AzXG4iLCB0YWJsZS5ncDMpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgdUNvZGUgdmVyc2lvbiBtYWpvclxuIiwgdGFibGUubWFqb3IpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgdUNvZGUgdmVyc2lvbiBtaW5vclxuIiwgdGFibGUubWlub3IpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgaHcgdmVyc2lvblxuIiwgdGFibGUuaHdfdmVyKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IGJvYXJkIHZlcnNpb25cbiIsIHRhYmxlLmJyZF92ZXIpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgaGNtZFxuIiwgdGFibGUuaGNtZCk7CisJSVdMX0VSUihtdm0sICIweCUwOFggfCBpc3IwXG4iLCB0YWJsZS5pc3IwKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IGlzcjFcbiIsIHRhYmxlLmlzcjEpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgaXNyMlxuIiwgdGFibGUuaXNyMik7CisJSVdMX0VSUihtdm0sICIweCUwOFggfCBpc3IzXG4iLCB0YWJsZS5pc3IzKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IGlzcjRcbiIsIHRhYmxlLmlzcjQpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgaXNyX3ByZWZcbiIsIHRhYmxlLmlzcl9wcmVmKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IHdhaXRfZXZlbnRcbiIsIHRhYmxlLndhaXRfZXZlbnQpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgbDJwX2NvbnRyb2xcbiIsIHRhYmxlLmwycF9jb250cm9sKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IGwycF9kdXJhdGlvblxuIiwgdGFibGUubDJwX2R1cmF0aW9uKTsKKwlJV0xfRVJSKG12bSwgIjB4JTA4WCB8IGwycF9taHZhbGlkXG4iLCB0YWJsZS5sMnBfbWh2YWxpZCk7CisJSVdMX0VSUihtdm0sICIweCUwOFggfCBsMnBfYWRkcl9tYXRjaFxuIiwgdGFibGUubDJwX2FkZHJfbWF0Y2gpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgbG1wbV9wbWdfc2VsXG4iLCB0YWJsZS5sbXBtX3BtZ19zZWwpOworCUlXTF9FUlIobXZtLCAiMHglMDhYIHwgdGltZXN0YW1wXG4iLCB0YWJsZS51X3RpbWVzdGFtcCk7CisJSVdMX0VSUihtdm0sICIweCUwOFggfCBmbG93X2hhbmRsZXJcbiIsIHRhYmxlLmZsb3dfaGFuZGxlcik7CisKKwlpZiAobXZtLT5zdXBwb3J0X3VtYWNfbG9nKQorCQlpd2xfbXZtX2R1bXBfdW1hY19lcnJvcl9sb2cobXZtKTsKK30KIHZvaWQgaXdsX212bV9lbmFibGVfdHhxKHN0cnVjdCBpd2xfbXZtICptdm0sIGludCBxdWV1ZSwgdTE2IHNzbiwKIAkJCWNvbnN0IHN0cnVjdCBpd2xfdHJhbnNfdHhxX3NjZF9jZmcgKmNmZywKIAkJCXVuc2lnbmVkIGludCB3ZGdfdGltZW91dCkKQEAgLTYwMyw3ICs3MzcsNyBAQAogfQogCiAvKioKLSAqIGl3bF9tdm1fdXBkYXRlX3NtcHMgLSBHZXQgYSByZXF1c3QgdG8gY2hhbmdlIHRoZSBTTVBTIG1vZGUKKyAqIGl3bF9tdm1fdXBkYXRlX3NtcHMgLSBHZXQgYSByZXF1ZXN0IHRvIGNoYW5nZSB0aGUgU01QUyBtb2RlCiAgKiBAcmVxX3R5cGU6IFRoZSBwYXJ0IG9mIHRoZSBkcml2ZXIgd2hvIGNhbGwgZm9yIGEgY2hhbmdlLgogICogQHNtcHNfcmVxdWVzdHM6IFRoZSByZXF1ZXN0IHRvIGNoYW5nZSB0aGUgU01QUyBtb2RlLgogICoKQEAgLTY0Myw2ICs3NzcsNDAgQEAKIAlpZWVlODAyMTFfcmVxdWVzdF9zbXBzKHZpZiwgc21wc19tb2RlKTsKIH0KIAoraW50IGl3bF9tdm1fcmVxdWVzdF9zdGF0aXN0aWNzKHN0cnVjdCBpd2xfbXZtICptdm0sIGJvb2wgY2xlYXIpCit7CisJc3RydWN0IGl3bF9zdGF0aXN0aWNzX2NtZCBzY21kID0geworCQkuZmxhZ3MgPSBjbGVhciA/IGNwdV90b19sZTMyKElXTF9TVEFUSVNUSUNTX0ZMR19DTEVBUikgOiAwLAorCX07CisJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IFNUQVRJU1RJQ1NfQ01ELAorCQkubGVuWzBdID0gc2l6ZW9mKHNjbWQpLAorCQkuZGF0YVswXSA9ICZzY21kLAorCQkuZmxhZ3MgPSBDTURfV0FOVF9TS0IsCisJfTsKKwlpbnQgcmV0OworCisJcmV0ID0gaXdsX212bV9zZW5kX2NtZChtdm0sICZjbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpd2xfbXZtX2hhbmRsZV9yeF9zdGF0aXN0aWNzKG12bSwgY21kLnJlc3BfcGt0KTsKKwlpd2xfZnJlZV9yZXNwKCZjbWQpOworCisJaWYgKGNsZWFyKQorCQlpd2xfbXZtX2FjY3VfcmFkaW9fc3RhdHMobXZtKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGl3bF9tdm1fYWNjdV9yYWRpb19zdGF0cyhzdHJ1Y3QgaXdsX212bSAqbXZtKQoreworCW12bS0+YWNjdV9yYWRpb19zdGF0cy5yeF90aW1lICs9IG12bS0+cmFkaW9fc3RhdHMucnhfdGltZTsKKwltdm0tPmFjY3VfcmFkaW9fc3RhdHMudHhfdGltZSArPSBtdm0tPnJhZGlvX3N0YXRzLnR4X3RpbWU7CisJbXZtLT5hY2N1X3JhZGlvX3N0YXRzLm9uX3RpbWVfcmYgKz0gbXZtLT5yYWRpb19zdGF0cy5vbl90aW1lX3JmOworCW12bS0+YWNjdV9yYWRpb19zdGF0cy5vbl90aW1lX3NjYW4gKz0gbXZtLT5yYWRpb19zdGF0cy5vbl90aW1lX3NjYW47Cit9CisKIHN0YXRpYyB2b2lkIGl3bF9tdm1fZGl2ZXJzaXR5X2l0ZXIodm9pZCAqX2RhdGEsIHU4ICptYWMsCiAJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKQEAgLTY4OSw3ICs4NTcsNyBAQAogCiAJbXZtdmlmLT5sb3dfbGF0ZW5jeSA9IHZhbHVlOwogCi0JcmVzID0gaXdsX212bV91cGRhdGVfcXVvdGFzKG12bSwgTlVMTCk7CisJcmVzID0gaXdsX212bV91cGRhdGVfcXVvdGFzKG12bSwgZmFsc2UsIE5VTEwpOwogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CiAKQEAgLTcxNywyNSArODg1LDYgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgdm9pZCBpd2xfbXZtX2lkbGVfaXRlcih2b2lkICpfZGF0YSwgdTggKm1hYywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlib29sICppZGxlID0gX2RhdGE7Ci0KLQlpZiAoIXZpZi0+YnNzX2NvbmYuaWRsZSkKLQkJKmlkbGUgPSBmYWxzZTsKLX0KLQotYm9vbCBpd2xfbXZtX2lzX2lkbGUoc3RydWN0IGl3bF9tdm0gKm12bSkKLXsKLQlib29sIGlkbGUgPSB0cnVlOwotCi0JaWVlZTgwMjExX2l0ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXNfYXRvbWljKAotCQkJbXZtLT5odywgSUVFRTgwMjExX0lGQUNFX0lURVJfTk9STUFMLAotCQkJaXdsX212bV9pZGxlX2l0ZXIsICZpZGxlKTsKLQotCXJldHVybiBpZGxlOwotfQotCiBzdHJ1Y3QgaXdsX2Jzc19pdGVyX2RhdGEgewogCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7CiAJYm9vbCBlcnJvcjsKQEAgLTc3MiwzICs5MjEsNzEgQEAKIAogCXJldHVybiBic3NfaXRlcl9kYXRhLnZpZjsKIH0KKwordW5zaWduZWQgaW50IGl3bF9tdm1fZ2V0X3dkX3RpbWVvdXQoc3RydWN0IGl3bF9tdm0gKm12bSwKKwkJCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICAgYm9vbCB0ZGxzLCBib29sIGNtZF9xKQoreworCXN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfdGx2ICp0cmlnZ2VyOworCXN0cnVjdCBpd2xfZndfZGJnX3RyaWdnZXJfdHhxX3RpbWVyICp0eHFfdGltZXI7CisJdW5zaWduZWQgaW50IGRlZmF1bHRfdGltZW91dCA9CisJCWNtZF9xID8gSVdMX0RFRl9XRF9USU1FT1VUIDogbXZtLT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0OworCisJaWYgKCFpd2xfZndfZGJnX3RyaWdnZXJfZW5hYmxlZChtdm0tPmZ3LCBGV19EQkdfVFJJR0dFUl9UWFFfVElNRVJTKSkKKwkJcmV0dXJuIGl3bG12bV9tb2RfcGFyYW1zLnRmZF9xX2hhbmdfZGV0ZWN0ID8KKwkJCWRlZmF1bHRfdGltZW91dCA6IElXTF9XQVRDSERPR19ESVNBQkxFRDsKKworCXRyaWdnZXIgPSBpd2xfZndfZGJnX2dldF90cmlnZ2VyKG12bS0+ZncsIEZXX0RCR19UUklHR0VSX1RYUV9USU1FUlMpOworCXR4cV90aW1lciA9ICh2b2lkICopdHJpZ2dlci0+ZGF0YTsKKworCWlmICh0ZGxzKQorCQlyZXR1cm4gbGUzMl90b19jcHUodHhxX3RpbWVyLT50ZGxzKTsKKworCWlmIChjbWRfcSkKKwkJcmV0dXJuIGxlMzJfdG9fY3B1KHR4cV90aW1lci0+Y29tbWFuZF9xdWV1ZSk7CisKKwlpZiAoV0FSTl9PTighdmlmKSkKKwkJcmV0dXJuIGRlZmF1bHRfdGltZW91dDsKKworCXN3aXRjaCAoaWVlZTgwMjExX3ZpZl90eXBlX3AycCh2aWYpKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJcmV0dXJuIGxlMzJfdG9fY3B1KHR4cV90aW1lci0+aWJzcyk7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQlyZXR1cm4gbGUzMl90b19jcHUodHhxX3RpbWVyLT5ic3MpOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CisJCXJldHVybiBsZTMyX3RvX2NwdSh0eHFfdGltZXItPnNvZnRhcCk7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgorCQlyZXR1cm4gbGUzMl90b19jcHUodHhxX3RpbWVyLT5wMnBfY2xpZW50KTsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKKwkJcmV0dXJuIGxlMzJfdG9fY3B1KHR4cV90aW1lci0+cDJwX2dvKTsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9ERVZJQ0U6CisJCXJldHVybiBsZTMyX3RvX2NwdSh0eHFfdGltZXItPnAycF9kZXZpY2UpOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCXJldHVybiBtdm0tPmNmZy0+YmFzZV9wYXJhbXMtPndkX3RpbWVvdXQ7CisJfQorfQorCit2b2lkIGl3bF9tdm1fY29ubmVjdGlvbl9sb3NzKHN0cnVjdCBpd2xfbXZtICptdm0sIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgIGNvbnN0IGNoYXIgKmVycm1zZykKK3sKKwlzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX3RsdiAqdHJpZzsKKwlzdHJ1Y3QgaXdsX2Z3X2RiZ190cmlnZ2VyX21sbWUgKnRyaWdfbWxtZTsKKworCWlmICghaXdsX2Z3X2RiZ190cmlnZ2VyX2VuYWJsZWQobXZtLT5mdywgRldfREJHX1RSSUdHRVJfTUxNRSkpCisJCWdvdG8gb3V0OworCisJdHJpZyA9IGl3bF9md19kYmdfZ2V0X3RyaWdnZXIobXZtLT5mdywgRldfREJHX1RSSUdHRVJfTUxNRSk7CisJdHJpZ19tbG1lID0gKHZvaWQgKil0cmlnLT5kYXRhOworCWlmICghaXdsX2Z3X2RiZ190cmlnZ2VyX2NoZWNrX3N0b3AobXZtLCB2aWYsIHRyaWcpKQorCQlnb3RvIG91dDsKKworCWlmICh0cmlnX21sbWUtPnN0b3BfY29ubmVjdGlvbl9sb3NzICYmCisJICAgIC0tdHJpZ19tbG1lLT5zdG9wX2Nvbm5lY3Rpb25fbG9zcykKKwkJZ290byBvdXQ7CisKKwlpd2xfbXZtX2Z3X2RiZ19jb2xsZWN0X3RyaWcobXZtLCB0cmlnLCAiJXMiLCBlcnJtc2cpOworCitvdXQ6CisJaWVlZTgwMjExX2Nvbm5lY3Rpb25fbG9zcyh2aWYpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL2Rydi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL2Rydi5jCmluZGV4IGRiZDZiY2YuLmIxODU2OTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9kcnYuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvZHJ2LmMKQEAgLTM2OCwxMCArMzY4LDEyIEBACiAvKiAzMTY1IFNlcmllcyAqLwogCXtJV0xfUENJX0RFVklDRSgweDMxNjUsIDB4NDAxMCwgaXdsMzE2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MzE2NSwgMHg0MDEyLCBpd2wzMTY1XzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgzMTY1LCAweDQxMTAsIGl3bDMxNjVfMmFjX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDMxNjUsIDB4NDIxMCwgaXdsMzE2NV8yYWNfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MzE2NSwgMHg0NDEwLCBpd2wzMTY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgzMTY1LCAweDQ1MTAsIGl3bDMxNjVfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDMxNjUsIDB4NDExMCwgaXdsMzE2NV8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MzE2NiwgMHg0MzEwLCBpd2wzMTY1XzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgzMTY2LCAweDQyMTAsIGl3bDMxNjVfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDMxNjUsIDB4ODAxMCwgaXdsMzE2NV8yYWNfY2ZnKX0sCiAKIC8qIDcyNjUgU2VyaWVzICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDk1QSwgMHg1MDEwLCBpd2w3MjY1XzJhY19jZmcpfSwKQEAgLTQxMywxMCArNDE1LDM1IEBACiAKIC8qIDgwMDAgU2VyaWVzICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjRGMywgMHgwMDEwLCBpd2w4MjYwXzJhY19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgyNEYzLCAweDAwMDQsIGl3bDgyNjBfMm5fY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjRGMywgMHgxMDEwLCBpd2w4MjYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNEYzLCAweDAxMTAsIGl3bDgyNjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RjMsIDB4MTExMCwgaXdsODI2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjRGMywgMHgwMDUwLCBpd2w4MjYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNEYzLCAweDAyNTAsIGl3bDgyNjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RjMsIDB4MTA1MCwgaXdsODI2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjRGMywgMHgwMTUwLCBpd2w4MjYwXzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNEY0LCAweDAwMzAsIGl3bDgyNjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RjQsIDB4MTEzMCwgaXdsODI2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjRGNCwgMHgxMDMwLCBpd2w4MjYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNEYzLCAweEMwMTAsIGl3bDgyNjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RjMsIDB4RDAxMCwgaXdsODI2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjRGNCwgMHhDMDMwLCBpd2w4MjYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNEY0LCAweEQwMzAsIGl3bDgyNjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RjMsIDB4QzA1MCwgaXdsODI2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjRGMywgMHhEMDUwLCBpd2w4MjYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNEYzLCAweDgwMTAsIGl3bDgyNjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RjMsIDB4OTAxMCwgaXdsODI2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjRGNCwgMHg4MDMwLCBpd2w4MjYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNEY0LCAweDkwMzAsIGl3bDgyNjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RjMsIDB4ODA1MCwgaXdsODI2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjRGMywgMHg5MDUwLCBpd2w4MjYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNEYzLCAweDAwMDQsIGl3bDgyNjBfMm5fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MjRGNSwgMHgwMDEwLCBpd2w0MTY1XzJhY19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgyNEY2LCAweDAwMzAsIGl3bDQxNjVfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RjMsIDB4MDgxMCwgaXdsODI2MF8yYWNfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MjRGMywgMHgwOTEwLCBpd2w4MjYwXzJhY19jZmcpfSwKKwl7SVdMX1BDSV9ERVZJQ0UoMHgyNEYzLCAweDA4NTAsIGl3bDgyNjBfMmFjX2NmZyl9LAorCXtJV0xfUENJX0RFVklDRSgweDI0RjMsIDB4MDk1MCwgaXdsODI2MF8yYWNfY2ZnKX0sCiAjZW5kaWYgLyogQ09ORklHX0lXTE1WTSAqLwogCiAJezB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvaW50ZXJuYWwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9pbnRlcm5hbC5oCmluZGV4IGNhZTBlYjguLjAxOTk2YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9pbnRlcm5hbC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9pbnRlcm5hbC5oCkBAIC0yMTcsNiArMjE3LDggQEAKICAqIEBhY3RpdmU6IHN0b3JlcyBpZiBxdWV1ZSBpcyBhY3RpdmUKICAqIEBhbXBkdTogdHJ1ZSBpZiB0aGlzIHF1ZXVlIGlzIGFuIGFtcGR1IHF1ZXVlIGZvciBhbiBzcGVjaWZpYyBSQS9USUQKICAqIEB3ZF90aW1lb3V0OiBxdWV1ZSB3YXRjaGRvZyB0aW1lb3V0IChqaWZmaWVzKSAtIHBlciBxdWV1ZQorICogQGZyb3plbjogdHggc3R1Y2sgcXVldWUgdGltZXIgaXMgZnJvemVuCisgKiBAZnJvemVuX2V4cGlyeV9yZW1haW5kZXI6IHJlbWVtYmVyIGhvdyBsb25nIHVudGlsIHRoZSB0aW1lciBmaXJlcwogICoKICAqIEEgVHggcXVldWUgY29uc2lzdHMgb2YgY2lyY3VsYXIgYnVmZmVyIG9mIEJEcyAoYS5rLmEuIFRGRHMsIHRyYW5zbWl0IGZyYW1lCiAgKiBkZXNjcmlwdG9ycykgYW5kIHJlcXVpcmVkIGxvY2tpbmcgc3RydWN0dXJlcy4KQEAgLTIyOCw5ICsyMzAsMTEgQEAKIAlkbWFfYWRkcl90IHNjcmF0Y2hidWZzX2RtYTsKIAlzdHJ1Y3QgaXdsX3BjaWVfdHhxX2VudHJ5ICplbnRyaWVzOwogCXNwaW5sb2NrX3QgbG9jazsKKwl1bnNpZ25lZCBsb25nIGZyb3plbl9leHBpcnlfcmVtYWluZGVyOwogCXN0cnVjdCB0aW1lcl9saXN0IHN0dWNrX3RpbWVyOwogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZTsKIAlib29sIG5lZWRfdXBkYXRlOworCWJvb2wgZnJvemVuOwogCXU4IGFjdGl2ZTsKIAlib29sIGFtcGR1OwogCXVuc2lnbmVkIGxvbmcgd2RfdGltZW91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvcGNpZS9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL3J4LmMKaW5kZXggN2I3ZTJmMi4uN2ZmNjljNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL3J4LmMKQEAgLTYwMCw5ICs2MDAsMTEgQEAKIAkJaWYgKHBrdC0+bGVuX25fZmxhZ3MgPT0gY3B1X3RvX2xlMzIoRkhfUlNDU1JfRlJBTUVfSU5WQUxJRCkpCiAJCQlicmVhazsKIAotCQlJV0xfREVCVUdfUlgodHJhbnMsICJjbWQgYXQgb2Zmc2V0ICVkOiAlcyAoMHglLjJ4KVxuIiwKLQkJCXJ4Y2IuX29mZnNldCwgZ2V0X2NtZF9zdHJpbmcodHJhbnNfcGNpZSwgcGt0LT5oZHIuY21kKSwKLQkJCXBrdC0+aGRyLmNtZCk7CisJCUlXTF9ERUJVR19SWCh0cmFucywKKwkJCSAgICAgImNtZCBhdCBvZmZzZXQgJWQ6ICVzICgweCUuMngsIHNlcSAweCV4KVxuIiwKKwkJCSAgICAgcnhjYi5fb2Zmc2V0LAorCQkJICAgICBnZXRfY21kX3N0cmluZyh0cmFuc19wY2llLCBwa3QtPmhkci5jbWQpLAorCQkJICAgICBwa3QtPmhkci5jbWQsIGxlMTZfdG9fY3B1KHBrdC0+aGRyLnNlcXVlbmNlKSk7CiAKIAkJbGVuID0gaXdsX3J4X3BhY2tldF9sZW4ocGt0KTsKIAkJbGVuICs9IHNpemVvZih1MzIpOyAvKiBhY2NvdW50IGZvciBzdGF0dXMgd29yZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL3RyYW5zLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvdHJhbnMuYwppbmRleCA2OTkzNWFhLi4yZGU4ZmJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvdHJhbnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvdHJhbnMuYwpAQCAtNjgyLDEwICs2ODIsNTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGl3bF9wY2llX2xvYWRfY3B1X3NlY3Rpb25zXzgwMDBiKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IGZ3X2ltZyAqaW1hZ2UsCi0JCQkJCSAgICBpbnQgY3B1LAotCQkJCQkgICAgaW50ICpmaXJzdF91Y29kZV9zZWN0aW9uKQorLyoKKyAqIERyaXZlciBUYWtlcyB0aGUgb3duZXJzaGlwIG9uIHNlY3VyZSBtYWNoaW5lIGJlZm9yZSBGVyBsb2FkCisgKiBhbmQgcHJldmVudCByYWNlIHdpdGggdGhlIEJUIGxvYWQuCisgKiBXL0EgZm9yIFJPTSBidWcuIChzaG91bGQgYmUgcmVtb3ZlIGluIHRoZSBuZXh0IFNpIHN0ZXApCisgKi8KK3N0YXRpYyBpbnQgaXdsX3BjaWVfcnNhX3JhY2VfYnVnX3dhKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXUzMiB2YWwsIGxvb3AgPSAxMDAwOworCisJLyoKKwkgKiBDaGVjayB0aGUgUlNBIHNlbWFwaG9yZSBpcyBhY2Nlc3NpYmxlLgorCSAqIElmIHRoZSBIVyBpc24ndCBsb2NrZWQgYW5kIHRoZSByc2Egc2VtYXBob3JlIGlzbid0IGFjY2Vzc2libGUsCisJICogd2UgYXJlIGluIHRyb3VibGUuCisJICovCisJdmFsID0gaXdsX3JlYWRfcHJwaCh0cmFucywgUFJFR19BVVhfQlVTX1dQUk9UXzApOworCWlmICh2YWwgJiAoQklUKDEpIHwgQklUKDE3KSkpIHsKKwkJSVdMX0lORk8odHJhbnMsCisJCQkgImNhbid0IGFjY2VzcyB0aGUgUlNBIHNlbWFwaG9yZSBpdCBpcyB3cml0ZSBwcm90ZWN0ZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0YWtlIG93bmVyc2hpcCBvbiB0aGUgQVVYIElGICovCisJaXdsX3dyaXRlX3BycGgodHJhbnMsIFdGUE1fQ1RSTF9SRUcsIFdGUE1fQVVYX0NUTF9BVVhfSUZfTUFDX09XTkVSX01TSyk7CisJaXdsX3dyaXRlX3BycGgodHJhbnMsIEFVWF9NSVNDX01BU1RFUjFfRU4sIEFVWF9NSVNDX01BU1RFUjFfRU5fU0JFX01TSyk7CisKKwlkbyB7CisJCWl3bF93cml0ZV9wcnBoKHRyYW5zLCBBVVhfTUlTQ19NQVNURVIxX1NNUEhSX1NUQVRVUywgMHgxKTsKKwkJdmFsID0gaXdsX3JlYWRfcHJwaCh0cmFucywgQVVYX01JU0NfTUFTVEVSMV9TTVBIUl9TVEFUVVMpOworCQlpZiAodmFsID09IDB4MSkgeworCQkJaXdsX3dyaXRlX3BycGgodHJhbnMsIFJTQV9FTkFCTEUsIDApOworCQkJcmV0dXJuIDA7CisJCX0KKworCQl1ZGVsYXkoMTApOworCQlsb29wLS07CisJfSB3aGlsZSAobG9vcCA+IDApOworCisJSVdMX0VSUih0cmFucywgIkZhaWxlZCB0byB0YWtlIG93bmVyc2hpcCBvbiBzZWN1cmUgbWFjaGluZVxuIik7CisJcmV0dXJuIC1FSU87Cit9CisKK3N0YXRpYyBpbnQgaXdsX3BjaWVfbG9hZF9jcHVfc2VjdGlvbnNfODAwMChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKKwkJCQkJICAgY29uc3Qgc3RydWN0IGZ3X2ltZyAqaW1hZ2UsCisJCQkJCSAgIGludCBjcHUsCisJCQkJCSAgIGludCAqZmlyc3RfdWNvZGVfc2VjdGlvbikKIHsKIAlpbnQgc2hpZnRfcGFyYW07CiAJaW50IGksIHJldCA9IDAsIHNlY19udW0gPSAweDE7CkBAIC04ODAsNjQgKzkyMSw1MCBAQAogCX0KIAogCS8qIHJlbGVhc2UgQ1BVIHJlc2V0ICovCi0JaWYgKHRyYW5zLT5jZmctPmRldmljZV9mYW1pbHkgPT0gSVdMX0RFVklDRV9GQU1JTFlfODAwMCkKLQkJaXdsX3dyaXRlX3BycGgodHJhbnMsIFJFTEVBU0VfQ1BVX1JFU0VULCBSRUxFQVNFX0NQVV9SRVNFVF9CSVQpOwotCWVsc2UKLQkJaXdsX3dyaXRlMzIodHJhbnMsIENTUl9SRVNFVCwgMCk7CisJaXdsX3dyaXRlMzIodHJhbnMsIENTUl9SRVNFVCwgMCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpd2xfcGNpZV9sb2FkX2dpdmVuX3Vjb2RlXzgwMDBiKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCQkgICBjb25zdCBzdHJ1Y3QgZndfaW1nICppbWFnZSkKK3N0YXRpYyBpbnQgaXdsX3BjaWVfbG9hZF9naXZlbl91Y29kZV84MDAwKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCQkgIGNvbnN0IHN0cnVjdCBmd19pbWcgKmltYWdlKQogewogCWludCByZXQgPSAwOwogCWludCBmaXJzdF91Y29kZV9zZWN0aW9uOwotCXUzMiByZWc7CiAKIAlJV0xfREVCVUdfRlcodHJhbnMsICJ3b3JraW5nIHdpdGggJXMgQ1BVXG4iLAogCQkgICAgIGltYWdlLT5pc19kdWFsX2NwdXMgPyAiRHVhbCIgOiAiU2luZ2xlIik7CiAKKwlpZiAodHJhbnMtPmRiZ19kZXN0X3RsdikKKwkJaXdsX3BjaWVfYXBwbHlfZGVzdGluYXRpb24odHJhbnMpOworCisJLyogVE9ETzogcmVtb3ZlIGluIHRoZSBuZXh0IFNpIHN0ZXAgKi8KKwlyZXQgPSBpd2xfcGNpZV9yc2FfcmFjZV9idWdfd2EodHJhbnMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKIAkvKiBjb25maWd1cmUgdGhlIHVjb2RlIHRvIGJlIHJlYWR5IHRvIGdldCB0aGUgc2VjdXJlZCBpbWFnZSAqLwogCS8qIHJlbGVhc2UgQ1BVIHJlc2V0ICovCiAJaXdsX3dyaXRlX3BycGgodHJhbnMsIFJFTEVBU0VfQ1BVX1JFU0VULCBSRUxFQVNFX0NQVV9SRVNFVF9CSVQpOwogCiAJLyogbG9hZCB0byBGVyB0aGUgYmluYXJ5IFNlY3VyZWQgc2VjdGlvbnMgb2YgQ1BVMSAqLwotCXJldCA9IGl3bF9wY2llX2xvYWRfY3B1X3NlY3Rpb25zXzgwMDBiKHRyYW5zLCBpbWFnZSwgMSwKLQkJCQkJICAgICAgICZmaXJzdF91Y29kZV9zZWN0aW9uKTsKKwlyZXQgPSBpd2xfcGNpZV9sb2FkX2NwdV9zZWN0aW9uc184MDAwKHRyYW5zLCBpbWFnZSwgMSwKKwkJCQkJICAgICAgJmZpcnN0X3Vjb2RlX3NlY3Rpb24pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAkvKiBsb2FkIHRvIEZXIHRoZSBiaW5hcnkgc2VjdGlvbnMgb2YgQ1BVMiAqLwotCXJldCA9IGl3bF9wY2llX2xvYWRfY3B1X3NlY3Rpb25zXzgwMDBiKHRyYW5zLCBpbWFnZSwgMiwKLQkJCQkJICAgICAgICZmaXJzdF91Y29kZV9zZWN0aW9uKTsKKwlyZXQgPSBpd2xfcGNpZV9sb2FkX2NwdV9zZWN0aW9uc184MDAwKHRyYW5zLCBpbWFnZSwgMiwKKwkJCQkJICAgICAgJmZpcnN0X3Vjb2RlX3NlY3Rpb24pOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAodHJhbnMtPmRiZ19kZXN0X3RsdikKLQkJaXdsX3BjaWVfYXBwbHlfZGVzdGluYXRpb24odHJhbnMpOwotCi0JLyogd2FpdCBmb3IgaW1hZ2UgdmVyaWZpY2F0aW9uIHRvIGNvbXBsZXRlICAqLwotCXJldCA9IGl3bF9wb2xsX3BycGhfYml0KHRyYW5zLCBMTVBNX1NFQ1VSRV9CT09UX0NQVTFfU1RBVFVTX0FERFJfQjAsCi0JCQkJTE1QTV9TRUNVUkVfQk9PVF9TVEFUVVNfU1VDQ0VTUywKLQkJCQlMTVBNX1NFQ1VSRV9CT09UX1NUQVRVU19TVUNDRVNTLAotCQkJCUxNUE1fU0VDVVJFX1RJTUVfT1VUKTsKLQlpZiAocmV0IDwgMCkgewotCQlyZWcgPSBpd2xfcmVhZF9wcnBoKHRyYW5zLAotCQkJCSAgICBMTVBNX1NFQ1VSRV9CT09UX0NQVTFfU1RBVFVTX0FERFJfQjApOwotCi0JCUlXTF9FUlIodHJhbnMsICJUaW1lb3V0IG9uIHNlY3VyZSBib290IHByb2Nlc3MsIHJlZyA9ICV4XG4iLAotCQkJcmVnKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpd2xfdHJhbnNfcGNpZV9zdGFydF9mdyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKIAkJCQkgICBjb25zdCBzdHJ1Y3QgZndfaW1nICpmdywgYm9vbCBydW5faW5fcmZraWxsKQogewotCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAJaW50IHJldDsKIAlib29sIGh3X3Jma2lsbDsKIApAQCAtOTY3LDkgKzk5NCw2IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JLyogaW5pdCByZWZfY291bnQgdG8gMSAoc2hvdWxkIGJlIGNsZWFyZWQgd2hlbiB1Y29kZSBpcyBsb2FkZWQpICovCi0JdHJhbnNfcGNpZS0+cmVmX2NvdW50ID0gMTsKLQogCS8qIG1ha2Ugc3VyZSByZmtpbGwgaGFuZHNoYWtlIGJpdHMgYXJlIGNsZWFyZWQgKi8KIAlpd2xfd3JpdGUzMih0cmFucywgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7CiAJaXdsX3dyaXRlMzIodHJhbnMsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwKQEAgLTk4NCw5ICsxMDA4LDggQEAKIAlpd2xfd3JpdGUzMih0cmFucywgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7CiAKIAkvKiBMb2FkIHRoZSBnaXZlbiBpbWFnZSB0byB0aGUgSFcgKi8KLQlpZiAoKHRyYW5zLT5jZmctPmRldmljZV9mYW1pbHkgPT0gSVdMX0RFVklDRV9GQU1JTFlfODAwMCkgJiYKLQkgICAgKENTUl9IV19SRVZfU1RFUCh0cmFucy0+aHdfcmV2KSAhPSBTSUxJQ09OX0FfU1RFUCkpCi0JCXJldHVybiBpd2xfcGNpZV9sb2FkX2dpdmVuX3Vjb2RlXzgwMDBiKHRyYW5zLCBmdyk7CisJaWYgKHRyYW5zLT5jZmctPmRldmljZV9mYW1pbHkgPT0gSVdMX0RFVklDRV9GQU1JTFlfODAwMCkKKwkJcmV0dXJuIGl3bF9wY2llX2xvYWRfZ2l2ZW5fdWNvZGVfODAwMCh0cmFucywgZncpOwogCWVsc2UKIAkJcmV0dXJuIGl3bF9wY2llX2xvYWRfZ2l2ZW5fdWNvZGUodHJhbnMsIGZ3KTsKIH0KQEAgLTEyODgsNiArMTMxMSw5IEBACiAJdHJhbnNfcGNpZS0+YmNfdGFibGVfZHdvcmQgPSB0cmFuc19jZmctPmJjX3RhYmxlX2R3b3JkOwogCXRyYW5zX3BjaWUtPnNjZF9zZXRfYWN0aXZlID0gdHJhbnNfY2ZnLT5zY2Rfc2V0X2FjdGl2ZTsKIAorCS8qIGluaXQgcmVmX2NvdW50IHRvIDEgKHNob3VsZCBiZSBjbGVhcmVkIHdoZW4gdWNvZGUgaXMgbG9hZGVkKSAqLworCXRyYW5zX3BjaWUtPnJlZl9jb3VudCA9IDE7CisKIAkvKiBJbml0aWFsaXplIE5BUEkgaGVyZSAtIGl0IHNob3VsZCBiZSBiZWZvcmUgcmVnaXN0ZXJpbmcgdG8gbWFjODAyMTEKIAkgKiBpbiB0aGUgb3Btb2RlIGJ1dCBhZnRlciB0aGUgSFcgc3RydWN0IGlzIGFsbG9jYXRlZC4KIAkgKiBBcyB0aGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYWdhaW4gaW4gc29tZSBjb3JuZXIgY2FzZXMgZG9uJ3QKQEAgLTE0NjIsNiArMTQ4OCw2MCBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGl3bF90cmFuc19wY2llX2ZyZWV6ZV90eHFfdGltZXIoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIHR4cXMsCisJCQkJCSAgICBib29sIGZyZWV6ZSkKK3sKKwlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOworCWludCBxdWV1ZTsKKworCWZvcl9lYWNoX3NldF9iaXQocXVldWUsICZ0eHFzLCBCSVRTX1BFUl9MT05HKSB7CisJCXN0cnVjdCBpd2xfdHhxICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3F1ZXVlXTsKKwkJdW5zaWduZWQgbG9uZyBub3c7CisKKwkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmxvY2spOworCisJCW5vdyA9IGppZmZpZXM7CisKKwkJaWYgKHR4cS0+ZnJvemVuID09IGZyZWV6ZSkKKwkJCWdvdG8gbmV4dF9xdWV1ZTsKKworCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiJXMgVFhRICVkXG4iLAorCQkJCSAgICBmcmVlemUgPyAiRnJlZXppbmciIDogIldha2luZyIsIHF1ZXVlKTsKKworCQl0eHEtPmZyb3plbiA9IGZyZWV6ZTsKKworCQlpZiAodHhxLT5xLnJlYWRfcHRyID09IHR4cS0+cS53cml0ZV9wdHIpCisJCQlnb3RvIG5leHRfcXVldWU7CisKKwkJaWYgKGZyZWV6ZSkgeworCQkJaWYgKHVubGlrZWx5KHRpbWVfYWZ0ZXIobm93LAorCQkJCQkJdHhxLT5zdHVja190aW1lci5leHBpcmVzKSkpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSB0aW1lciBzaG91bGQgaGF2ZSBmaXJlZCwgbWF5YmUgaXQgaXMKKwkJCQkgKiBzcGlubmluZyByaWdodCBub3cgb24gdGhlIGxvY2suCisJCQkJICovCisJCQkJZ290byBuZXh0X3F1ZXVlOworCQkJfQorCQkJLyogcmVtZW1iZXIgaG93IGxvbmcgdW50aWwgdGhlIHRpbWVyIGZpcmVzICovCisJCQl0eHEtPmZyb3plbl9leHBpcnlfcmVtYWluZGVyID0KKwkJCQl0eHEtPnN0dWNrX3RpbWVyLmV4cGlyZXMgLSBub3c7CisJCQlkZWxfdGltZXIoJnR4cS0+c3R1Y2tfdGltZXIpOworCQkJZ290byBuZXh0X3F1ZXVlOworCQl9CisKKwkJLyoKKwkJICogV2FrZSBhIG5vbi1lbXB0eSBxdWV1ZSAtPiBhcm0gdGltZXIgd2l0aCB0aGUKKwkJICogcmVtYWluZGVyIGJlZm9yZSBpdCBmcm96ZQorCQkgKi8KKwkJbW9kX3RpbWVyKCZ0eHEtPnN0dWNrX3RpbWVyLAorCQkJICBub3cgKyB0eHEtPmZyb3plbl9leHBpcnlfcmVtYWluZGVyKTsKKworbmV4dF9xdWV1ZToKKwkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+bG9jayk7CisJfQorfQorCiAjZGVmaW5lIElXTF9GTFVTSF9XQUlUX01TCTIwMDAKIAogc3RhdGljIGludCBpd2xfdHJhbnNfcGNpZV93YWl0X3R4cV9lbXB0eShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdTMyIHR4cV9ibSkKQEAgLTE3MTMsNyArMTc5Myw3IEBACiAJaW50IHJldDsKIAlzaXplX3QgYnVmc3o7CiAKLQlidWZzeiA9IHNpemVvZihjaGFyKSAqIDY0ICogdHJhbnMtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7CisJYnVmc3ogPSBzaXplb2YoY2hhcikgKiA3NSAqIHRyYW5zLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwogCiAJaWYgKCF0cmFuc19wY2llLT50eHEpCiAJCXJldHVybiAtRUFHQUlOOwpAQCAtMTcyNiwxMSArMTgwNiwxMSBAQAogCQl0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW2NudF07CiAJCXEgPSAmdHhxLT5xOwogCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJImh3cSAlLjJkOiByZWFkPSV1IHdyaXRlPSV1IHVzZT0lZCBzdG9wPSVkIG5lZWRfdXBkYXRlPSVkJXNcbiIsCisJCQkJImh3cSAlLjJkOiByZWFkPSV1IHdyaXRlPSV1IHVzZT0lZCBzdG9wPSVkIG5lZWRfdXBkYXRlPSVkIGZyb3plbj0lZCVzXG4iLAogCQkJCWNudCwgcS0+cmVhZF9wdHIsIHEtPndyaXRlX3B0ciwKIAkJCQkhIXRlc3RfYml0KGNudCwgdHJhbnNfcGNpZS0+cXVldWVfdXNlZCksCiAJCQkJICEhdGVzdF9iaXQoY250LCB0cmFuc19wY2llLT5xdWV1ZV9zdG9wcGVkKSwKLQkJCQkgdHhxLT5uZWVkX3VwZGF0ZSwKKwkJCQkgdHhxLT5uZWVkX3VwZGF0ZSwgdHhxLT5mcm96ZW4sCiAJCQkJIChjbnQgPT0gdHJhbnNfcGNpZS0+Y21kX3F1ZXVlID8gIiBIQ01EIiA6ICIiKSk7CiAJfQogCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwpAQCAtMTk2MSwyNCArMjA0MSwyNSBAQAogCXsgLnN0YXJ0ID0gMHgwMGEwMWM3YywgLmVuZCA9IDB4MDBhMDFjN2MgfSwKIAl7IC5zdGFydCA9IDB4MDBhMDFjMjgsIC5lbmQgPSAweDAwYTAxYzU0IH0sCiAJeyAuc3RhcnQgPSAweDAwYTAxYzVjLCAuZW5kID0gMHgwMGEwMWM1YyB9LAotCXsgLnN0YXJ0ID0gMHgwMGEwMWM4NCwgLmVuZCA9IDB4MDBhMDFjODQgfSwKKwl7IC5zdGFydCA9IDB4MDBhMDFjNjAsIC5lbmQgPSAweDAwYTAxY2RjIH0sCiAJeyAuc3RhcnQgPSAweDAwYTAxY2UwLCAuZW5kID0gMHgwMGEwMWQwYyB9LAogCXsgLnN0YXJ0ID0gMHgwMGEwMWQxOCwgLmVuZCA9IDB4MDBhMDFkMjAgfSwKIAl7IC5zdGFydCA9IDB4MDBhMDFkMmMsIC5lbmQgPSAweDAwYTAxZDMwIH0sCiAJeyAuc3RhcnQgPSAweDAwYTAxZDQwLCAuZW5kID0gMHgwMGEwMWQ1YyB9LAogCXsgLnN0YXJ0ID0gMHgwMGEwMWQ4MCwgLmVuZCA9IDB4MDBhMDFkODAgfSwKLQl7IC5zdGFydCA9IDB4MDBhMDFkOTgsIC5lbmQgPSAweDAwYTAxZDk4IH0sCisJeyAuc3RhcnQgPSAweDAwYTAxZDk4LCAuZW5kID0gMHgwMGEwMWQ5YyB9LAorCXsgLnN0YXJ0ID0gMHgwMGEwMWRhOCwgLmVuZCA9IDB4MDBhMDFkYTggfSwKKwl7IC5zdGFydCA9IDB4MDBhMDFkYjgsIC5lbmQgPSAweDAwYTAxZGY0IH0sCiAJeyAuc3RhcnQgPSAweDAwYTAxZGMwLCAuZW5kID0gMHgwMGEwMWRmYyB9LAogCXsgLnN0YXJ0ID0gMHgwMGEwMWUwMCwgLmVuZCA9IDB4MDBhMDFlMmMgfSwKIAl7IC5zdGFydCA9IDB4MDBhMDFlNDAsIC5lbmQgPSAweDAwYTAxZTYwIH0sCisJeyAuc3RhcnQgPSAweDAwYTAxZTY4LCAuZW5kID0gMHgwMGEwMWU2YyB9LAorCXsgLnN0YXJ0ID0gMHgwMGEwMWU3NCwgLmVuZCA9IDB4MDBhMDFlNzQgfSwKIAl7IC5zdGFydCA9IDB4MDBhMDFlODQsIC5lbmQgPSAweDAwYTAxZTkwIH0sCiAJeyAuc3RhcnQgPSAweDAwYTAxZTljLCAuZW5kID0gMHgwMGEwMWVjNCB9LAotCXsgLnN0YXJ0ID0gMHgwMGEwMWVkMCwgLmVuZCA9IDB4MDBhMDFlZDAgfSwKLQl7IC5zdGFydCA9IDB4MDBhMDFmMDAsIC5lbmQgPSAweDAwYTAxZjE0IH0sCi0JeyAuc3RhcnQgPSAweDAwYTAxZjQ0LCAuZW5kID0gMHgwMGEwMWY1OCB9LAotCXsgLnN0YXJ0ID0gMHgwMGEwMWY4MCwgLmVuZCA9IDB4MDBhMDFmYTggfSwKLQl7IC5zdGFydCA9IDB4MDBhMDFmYjAsIC5lbmQgPSAweDAwYTAxZmJjIH0sCi0JeyAuc3RhcnQgPSAweDAwYTAxZmY4LCAuZW5kID0gMHgwMGEwMWZmYyB9LAorCXsgLnN0YXJ0ID0gMHgwMGEwMWVkMCwgLmVuZCA9IDB4MDBhMDFlZTAgfSwKKwl7IC5zdGFydCA9IDB4MDBhMDFmMDAsIC5lbmQgPSAweDAwYTAxZjFjIH0sCisJeyAuc3RhcnQgPSAweDAwYTAxZjQ0LCAuZW5kID0gMHgwMGEwMWZmYyB9LAogCXsgLnN0YXJ0ID0gMHgwMGEwMjAwMCwgLmVuZCA9IDB4MDBhMDIwNDggfSwKIAl7IC5zdGFydCA9IDB4MDBhMDIwNjgsIC5lbmQgPSAweDAwYTAyMGYwIH0sCiAJeyAuc3RhcnQgPSAweDAwYTAyMTAwLCAuZW5kID0gMHgwMGEwMjExOCB9LApAQCAtMjMwNSw2ICsyMzg2LDcgQEAKIAkuZGJnZnNfcmVnaXN0ZXIgPSBpd2xfdHJhbnNfcGNpZV9kYmdmc19yZWdpc3RlciwKIAogCS53YWl0X3R4X3F1ZXVlX2VtcHR5ID0gaXdsX3RyYW5zX3BjaWVfd2FpdF90eHFfZW1wdHksCisJLmZyZWV6ZV90eHFfdGltZXIgPSBpd2xfdHJhbnNfcGNpZV9mcmVlemVfdHhxX3RpbWVyLAogCiAJLndyaXRlOCA9IGl3bF90cmFuc19wY2llX3dyaXRlOCwKIAkud3JpdGUzMiA9IGl3bF90cmFuc19wY2llX3dyaXRlMzIsCkBAIC0yNDIzLDEwICsyNTA1LDQ1IEBACiAJICogImRhc2giIHZhbHVlKS4gVG8ga2VlcCBod19yZXYgYmFja3dhcmRzIGNvbXBhdGlibGUgLSB3ZSdsbCBzdG9yZSBpdAogCSAqIGluIHRoZSBvbGQgZm9ybWF0LgogCSAqLwotCWlmICh0cmFucy0+Y2ZnLT5kZXZpY2VfZmFtaWx5ID09IElXTF9ERVZJQ0VfRkFNSUxZXzgwMDApCisJaWYgKHRyYW5zLT5jZmctPmRldmljZV9mYW1pbHkgPT0gSVdMX0RFVklDRV9GQU1JTFlfODAwMCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlpbnQgcmV0OworCiAJCXRyYW5zLT5od19yZXYgPSAodHJhbnMtPmh3X3JldiAmIDB4ZmZmMCkgfAogCQkJCShDU1JfSFdfUkVWX1NURVAodHJhbnMtPmh3X3JldiA8PCAyKSA8PCAyKTsKIAorCQkvKgorCQkgKiBpbi1vcmRlciB0byByZWNvZ25pemUgQyBzdGVwIGRyaXZlciBzaG91bGQgcmVhZCBjaGlwIHZlcnNpb24KKwkJICogaWQgbG9jYXRlZCBhdCB0aGUgQVVYIGJ1cyBNSVNDIGFkZHJlc3Mgc3BhY2UuCisJCSAqLworCQlpd2xfc2V0X2JpdCh0cmFucywgQ1NSX0dQX0NOVFJMLAorCQkJICAgIENTUl9HUF9DTlRSTF9SRUdfRkxBR19JTklUX0RPTkUpOworCQl1ZGVsYXkoMik7CisKKwkJcmV0ID0gaXdsX3BvbGxfYml0KHRyYW5zLCBDU1JfR1BfQ05UUkwsCisJCQkJICAgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19DTE9DS19SRUFEWSwKKwkJCQkgICBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZLAorCQkJCSAgIDI1MDAwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCUlXTF9ERUJVR19JTkZPKHRyYW5zLCAiRmFpbGVkIHRvIHdha2UgdXAgdGhlIG5pY1xuIik7CisJCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9tc2k7CisJCX0KKworCQlpZiAoaXdsX3RyYW5zX2dyYWJfbmljX2FjY2Vzcyh0cmFucywgZmFsc2UsICZmbGFncykpIHsKKwkJCXUzMiBod19zdGVwOworCisJCQlod19zdGVwID0gX19pd2xfcmVhZF9wcnBoKHRyYW5zLCBXRlBNX0NUUkxfUkVHKTsKKwkJCWh3X3N0ZXAgfD0gRU5BQkxFX1dGUE07CisJCQlfX2l3bF93cml0ZV9wcnBoKHRyYW5zLCBXRlBNX0NUUkxfUkVHLCBod19zdGVwKTsKKwkJCWh3X3N0ZXAgPSBfX2l3bF9yZWFkX3BycGgodHJhbnMsIEFVWF9NSVNDX1JFRyk7CisJCQlod19zdGVwID0gKGh3X3N0ZXAgPj4gSFdfU1RFUF9MT0NBVElPTl9CSVRTKSAmIDB4RjsKKwkJCWlmIChod19zdGVwID09IDB4MykKKwkJCQl0cmFucy0+aHdfcmV2ID0gKHRyYW5zLT5od19yZXYgJiAweEZGRkZGRkYzKSB8CisJCQkJCQkoU0lMSUNPTl9DX1NURVAgPDwgMik7CisJCQlpd2xfdHJhbnNfcmVsZWFzZV9uaWNfYWNjZXNzKHRyYW5zLCAmZmxhZ3MpOworCQl9CisJfQorCiAJdHJhbnMtPmh3X2lkID0gKHBkZXYtPmRldmljZSA8PCAxNikgKyBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOwogCXNucHJpbnRmKHRyYW5zLT5od19pZF9zdHIsIHNpemVvZih0cmFucy0+aHdfaWRfc3RyKSwKIAkJICJQQ0kgSUQ6IDB4JTA0WDoweCUwNFgiLCBwZGV2LT5kZXZpY2UsIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9wY2llL3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvdHguYwppbmRleCBhZjBiY2U3Li4wNjk1MmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL3BjaWUvdHguYwpAQCAtNzI1LDMzICs3MjUsNTAgQEAKIAlpd2xfcGNpZV90eF9zdGFydCh0cmFucywgMCk7CiB9CiAKK3N0YXRpYyB2b2lkIGl3bF9wY2llX3R4X3N0b3BfZmgoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjaCwgcmV0OworCXUzMiBtYXNrID0gMDsKKworCXNwaW5fbG9jaygmdHJhbnNfcGNpZS0+aXJxX2xvY2spOworCisJaWYgKCFpd2xfdHJhbnNfZ3JhYl9uaWNfYWNjZXNzKHRyYW5zLCBmYWxzZSwgJmZsYWdzKSkKKwkJZ290byBvdXQ7CisKKwkvKiBTdG9wIGVhY2ggVHggRE1BIGNoYW5uZWwgKi8KKwlmb3IgKGNoID0gMDsgY2ggPCBGSF9UQ1NSX0NITkxfTlVNOyBjaCsrKSB7CisJCWl3bF93cml0ZTMyKHRyYW5zLCBGSF9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhjaCksIDB4MCk7CisJCW1hc2sgfD0gRkhfVFNTUl9UWF9TVEFUVVNfUkVHX01TS19DSE5MX0lETEUoY2gpOworCX0KKworCS8qIFdhaXQgZm9yIERNQSBjaGFubmVscyB0byBiZSBpZGxlICovCisJcmV0ID0gaXdsX3BvbGxfYml0KHRyYW5zLCBGSF9UU1NSX1RYX1NUQVRVU19SRUcsIG1hc2ssIG1hc2ssIDUwMDApOworCWlmIChyZXQgPCAwKQorCQlJV0xfRVJSKHRyYW5zLAorCQkJIkZhaWxpbmcgb24gdGltZW91dCB3aGlsZSBzdG9wcGluZyBETUEgY2hhbm5lbCAlZCBbMHglMDh4XVxuIiwKKwkJCWNoLCBpd2xfcmVhZDMyKHRyYW5zLCBGSF9UU1NSX1RYX1NUQVRVU19SRUcpKTsKKworCWl3bF90cmFuc19yZWxlYXNlX25pY19hY2Nlc3ModHJhbnMsICZmbGFncyk7CisKK291dDoKKwlzcGluX3VubG9jaygmdHJhbnNfcGNpZS0+aXJxX2xvY2spOworfQorCiAvKgogICogaXdsX3BjaWVfdHhfc3RvcCAtIFN0b3AgYWxsIFR4IERNQSBjaGFubmVscwogICovCiBpbnQgaXdsX3BjaWVfdHhfc3RvcChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwotCWludCBjaCwgdHhxX2lkLCByZXQ7CisJaW50IHR4cV9pZDsKIAogCS8qIFR1cm4gb2ZmIGFsbCBUeCBETUEgZmlmb3MgKi8KLQlzcGluX2xvY2soJnRyYW5zX3BjaWUtPmlycV9sb2NrKTsKLQogCWl3bF9zY2RfZGVhY3RpdmF0ZV9maWZvcyh0cmFucyk7CiAKLQkvKiBTdG9wIGVhY2ggVHggRE1BIGNoYW5uZWwsIGFuZCB3YWl0IGZvciBpdCB0byBiZSBpZGxlICovCi0JZm9yIChjaCA9IDA7IGNoIDwgRkhfVENTUl9DSE5MX05VTTsgY2grKykgewotCQlpd2xfd3JpdGVfZGlyZWN0MzIodHJhbnMsCi0JCQkJICAgRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoY2gpLCAweDApOwotCQlyZXQgPSBpd2xfcG9sbF9kaXJlY3RfYml0KHRyYW5zLCBGSF9UU1NSX1RYX1NUQVRVU19SRUcsCi0JCQlGSF9UU1NSX1RYX1NUQVRVU19SRUdfTVNLX0NITkxfSURMRShjaCksIDEwMDApOwotCQlpZiAocmV0IDwgMCkKLQkJCUlXTF9FUlIodHJhbnMsCi0JCQkJIkZhaWxpbmcgb24gdGltZW91dCB3aGlsZSBzdG9wcGluZyBETUEgY2hhbm5lbCAlZCBbMHglMDh4XVxuIiwKLQkJCQljaCwKLQkJCQlpd2xfcmVhZF9kaXJlY3QzMih0cmFucywKLQkJCQkJCSAgRkhfVFNTUl9UWF9TVEFUVVNfUkVHKSk7Ci0JfQotCXNwaW5fdW5sb2NrKCZ0cmFuc19wY2llLT5pcnFfbG9jayk7CisJLyogVHVybiBvZmYgYWxsIFR4IERNQSBjaGFubmVscyAqLworCWl3bF9wY2llX3R4X3N0b3BfZmgodHJhbnMpOwogCiAJLyoKIAkgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYmVmb3JlIHRoZSBvcF9tb2RlIGRpc2FibGVkIHRoZQpAQCAtOTEyLDEwICs5MjksMTkgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGl3bF9wY2llX3R4cV9wcm9ncmVzcyhzdHJ1Y3QgaXdsX3R4cSAqdHhxKQogeworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnR4cS0+bG9jayk7CisKIAlpZiAoIXR4cS0+d2RfdGltZW91dCkKIAkJcmV0dXJuOwogCiAJLyoKKwkgKiBzdGF0aW9uIGlzIGFzbGVlcCBhbmQgd2Ugc2VuZCBkYXRhIC0gdGhhdCBtdXN0CisJICogYmUgdUFQU0Qgb3IgUFMtUG9sbC4gRG9uJ3QgcmVhcm0gdGhlIHRpbWVyLgorCSAqLworCWlmICh0eHEtPmZyb3plbikKKwkJcmV0dXJuOworCisJLyoKIAkgKiBpZiBlbXB0eSBkZWxldGUgdGltZXIsIG90aGVyd2lzZSBtb3ZlIHRpbWVyIGZvcndhcmQKIAkgKiBzaW5jZSB3ZSdyZSBtYWtpbmcgcHJvZ3Jlc3Mgb24gdGhpcyBxdWV1ZQogCSAqLwpAQCAtMTI0OCw2ICsxMjc0LDkgQEAKIAkJCVNDRF9UWF9TVFRTX1FVRVVFX09GRlNFVCh0eHFfaWQpOwogCXN0YXRpYyBjb25zdCB1MzIgemVyb192YWxbNF0gPSB7fTsKIAorCXRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdLmZyb3plbl9leHBpcnlfcmVtYWluZGVyID0gMDsKKwl0cmFuc19wY2llLT50eHFbdHhxX2lkXS5mcm96ZW4gPSBmYWxzZTsKKwogCS8qCiAJICogVXBvbiBIVyBSZmtpbGwgLSB3ZSBzdG9wIHRoZSBkZXZpY2UsIGFuZCB0aGVuIHN0b3AgdGhlIHF1ZXVlcwogCSAqIGluIHRoZSBvcF9tb2RlLiBKdXN0IGZvciB0aGUgc2FrZSBvZiB0aGUgc2ltcGxpY2l0eSBvZiB0aGUgb3BfbW9kZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmMKaW5kZXggYTkyOTg1YS4uMWE0ZDU1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvY2ZnLmMKQEAgLTEzNTYsOCArMTM1Niw4IEBACiAKIAkvKiBGaW5kIHRoZSBCU1Mgd2Ugd2FudCB1c2luZyBhdmFpbGFibGUgc2NhbiByZXN1bHRzICovCiAJYnNzID0gY2ZnODAyMTFfZ2V0X2Jzcyh3aXBoeSwgc21lLT5jaGFubmVsLCBzbWUtPmJzc2lkLAotCQlzbWUtPnNzaWQsIHNtZS0+c3NpZF9sZW4sCi0JCVdMQU5fQ0FQQUJJTElUWV9FU1MsIFdMQU5fQ0FQQUJJTElUWV9FU1MpOworCQlzbWUtPnNzaWQsIHNtZS0+c3NpZF9sZW4sIElFRUU4MDIxMV9CU1NfVFlQRV9FU1MsCisJCUlFRUU4MDIxMV9QUklWQUNZX0FOWSk7CiAJaWYgKCFic3MpIHsKIAkJd2lwaHlfZXJyKHdpcGh5LCAiYXNzb2M6IGJzcyAlcE0gbm90IGluIHNjYW4gcmVzdWx0c1xuIiwKIAkJCSAgc21lLT5ic3NpZCk7CkBAIC0yMDAwLDcgKzIwMDAsNyBAQAogCSAqIGJzcyBsaXN0IGlzIHBvcHVsYXRlZCBhbHJlYWR5ICovCiAJYnNzID0gY2ZnODAyMTFfZ2V0X2Jzcyh3aXBoeSwgcGFyYW1zLT5jaGFuZGVmLmNoYW4sIHBhcmFtcy0+YnNzaWQsCiAJCXBhcmFtcy0+c3NpZCwgcGFyYW1zLT5zc2lkX2xlbiwKLQkJV0xBTl9DQVBBQklMSVRZX0lCU1MsIFdMQU5fQ0FQQUJJTElUWV9JQlNTKTsKKwkJSUVFRTgwMjExX0JTU19UWVBFX0lCU1MsIElFRUU4MDIxMV9QUklWQUNZX0FOWSk7CiAKIAlpZiAoYnNzKSB7CiAJCXJldCA9IGxic19pYnNzX2pvaW5fZXhpc3RpbmcocHJpdiwgcGFyYW1zLCBic3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZGVidWdmcy5jCmluZGV4IGNjNmEwYTUuLjI2Y2JmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9kZWJ1Z2ZzLmMKQEAgLTc0Miw4ICs3NDIsNyBAQAogCiB2b2lkIGxic19kZWJ1Z2ZzX3JlbW92ZSh2b2lkKQogewotCWlmIChsYnNfZGlyKQotCQkgZGVidWdmc19yZW1vdmUobGJzX2Rpcik7CisJZGVidWdmc19yZW1vdmUobGJzX2Rpcik7CiB9CiAKIHZvaWQgbGJzX2RlYnVnZnNfaW5pdF9vbmUoc3RydWN0IGxic19wcml2YXRlICpwcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvbWFpbi5jCmluZGV4IDU2OWI2NGUuLjgwNzk1NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9tYWluLmMKQEAgLTY2Nyw3ICs2NjcsNyBAQAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9GVyk7CiAKIAkvKiBSZWFkIE1BQyBhZGRyZXNzIGZyb20gZmlybXdhcmUgKi8KLQltZW1zZXQocHJpdi0+Y3VycmVudF9hZGRyLCAweGZmLCBFVEhfQUxFTik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKHByaXYtPmN1cnJlbnRfYWRkcik7CiAJcmV0ID0gbGJzX3VwZGF0ZV9od19zcGVjKHByaXYpOwogCWlmIChyZXQpCiAJCWdvdG8gZG9uZTsKQEAgLTg3MSw3ICs4NzEsNyBAQAogCiAJbGJzX2RlYl9lbnRlcihMQlNfREVCX01BSU4pOwogCi0JbWVtc2V0KHByaXYtPmN1cnJlbnRfYWRkciwgMHhmZiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcihwcml2LT5jdXJyZW50X2FkZHIpOwogCiAJcHJpdi0+Y29ubmVjdF9zdGF0dXMgPSBMQlNfRElTQ09OTkVDVEVEOwogCXByaXYtPmNoYW5uZWwgPSBERUZBVUxUX0FEX0hPQ19DSEFOTkVMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvaWZfdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuYwppbmRleCBkNTc2ZGQ2Li4xYTIwY2VlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9pZl91c2IuYwpAQCAtMzY1LDcgKzM2NSw2IEBACiAKIAlyZXR1cm4gcmV0OwogfQotRVhQT1JUX1NZTUJPTF9HUEwoaWZfdXNiX3Jlc2V0X2RldmljZSk7CiAKIC8qKgogICogIHVzYl90eF9ibG9jayAtIHRyYW5zZmVyIGRhdGEgdG8gdGhlIGRldmljZQpAQCAtOTA3LDcgKzkwNiw2IEBACiAJbGJ0Zl9kZWJfbGVhdmVfYXJncyhMQlRGX0RFQl9VU0IsICJyZXQgJWQiLCByZXQpOwogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChpZl91c2JfcHJvZ19maXJtd2FyZSk7CiAKIAogI2RlZmluZSBpZl91c2Jfc3VzcGVuZCBOVUxMCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9tYWluLmMKaW5kZXggMjVjNWFjYy4uZWQwMmU0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL21haW4uYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJLyoKIAkgKiBSZWFkIHByaXYgYWRkcmVzcyBmcm9tIEhXCiAJICovCi0JbWVtc2V0KHByaXYtPmN1cnJlbnRfYWRkciwgMHhmZiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcihwcml2LT5jdXJyZW50X2FkZHIpOwogCXJldCA9IGxidGZfdXBkYXRlX2h3X3NwZWMocHJpdik7CiAJaWYgKHJldCkgewogCQlyZXQgPSAtMTsKQEAgLTE5OSw3ICsxOTksNyBAQAogc3RhdGljIGludCBsYnRmX2luaXRfYWRhcHRlcihzdHJ1Y3QgbGJ0Zl9wcml2YXRlICpwcml2KQogewogCWxidGZfZGViX2VudGVyKExCVEZfREVCX01BSU4pOwotCW1lbXNldChwcml2LT5jdXJyZW50X2FkZHIsIDB4ZmYsIEVUSF9BTEVOKTsKKwlldGhfYnJvYWRjYXN0X2FkZHIocHJpdi0+Y3VycmVudF9hZGRyKTsKIAltdXRleF9pbml0KCZwcml2LT5sb2NrKTsKIAogCXByaXYtPnZpZiA9IE5VTEw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYwppbmRleCA4OTA4YmU2Li5kNWMwYTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKQEAgLTMzMCw2ICszMzAsODMgQEAKIAl7IC5iaXRyYXRlID0gNTQwIH0KIH07CiAKKyNkZWZpbmUgT1VJX1FDQSAweDAwMTM3NAorI2RlZmluZSBRQ0FfTkw4MDIxMV9TVUJDTURfVEVTVCAxCitlbnVtIHFjYV9ubDgwMjExX3ZlbmRvcl9zdWJjbWRzIHsKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URVNUID0gOCwKKwlRQ0FfV0xBTl9WRU5ET1JfQVRUUl9NQVggPSBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URVNUCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kKK2h3c2ltX3ZlbmRvcl90ZXN0X3BvbGljeVtRQ0FfV0xBTl9WRU5ET1JfQVRUUl9NQVggKyAxXSA9IHsKKwlbUUNBX1dMQU5fVkVORE9SX0FUVFJfTUFYXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCit9OworCitzdGF0aWMgaW50IG1hYzgwMjExX2h3c2ltX3ZlbmRvcl9jbWRfdGVzdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJCSAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IGRhdGFfbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5sYXR0ciAqdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfTUFYICsgMV07CisJaW50IGVycjsKKwl1MzIgdmFsOworCisJZXJyID0gbmxhX3BhcnNlKHRiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9NQVgsIGRhdGEsIGRhdGFfbGVuLAorCQkJaHdzaW1fdmVuZG9yX3Rlc3RfcG9saWN5KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmICghdGJbUUNBX1dMQU5fVkVORE9SX0FUVFJfVEVTVF0pCisJCXJldHVybiAtRUlOVkFMOworCXZhbCA9IG5sYV9nZXRfdTMyKHRiW1FDQV9XTEFOX1ZFTkRPUl9BVFRSX1RFU1RdKTsKKwl3aXBoeV9kZWJ1Zyh3aXBoeSwgIiVzOiB0ZXN0PSV1XG4iLCBfX2Z1bmNfXywgdmFsKTsKKworCS8qIFNlbmQgYSB2ZW5kb3IgZXZlbnQgYXMgYSB0ZXN0LiBOb3RlIHRoYXQgdGhpcyB3b3VsZCBub3Qgbm9ybWFsbHkgYmUKKwkgKiBkb25lIHdpdGhpbiBhIGNvbW1hbmQgaGFuZGxlciwgYnV0IHJhdGhlciwgYmFzZWQgb24gc29tZSBvdGhlcgorCSAqIHRyaWdnZXIuIEZvciBzaW1wbGljaXR5LCB0aGlzIGNvbW1hbmQgaXMgdXNlZCB0byB0cmlnZ2VyIHRoZSBldmVudAorCSAqIGhlcmUuCisJICoKKwkgKiBldmVudF9pZHggPSAwIChpbmRleCBpbiBtYWM4MDIxMV9od3NpbV92ZW5kb3JfY29tbWFuZHMpCisJICovCisJc2tiID0gY2ZnODAyMTFfdmVuZG9yX2V2ZW50X2FsbG9jKHdpcGh5LCB3ZGV2LCAxMDAsIDAsIEdGUF9LRVJORUwpOworCWlmIChza2IpIHsKKwkJLyogc2tiX3B1dCgpIG9yIG5sYV9wdXQoKSB3aWxsIGZpbGwgdXAgZGF0YSB3aXRoaW4KKwkJICogTkw4MDIxMV9BVFRSX1ZFTkRPUl9EQVRBLgorCQkgKi8KKworCQkvKiBBZGQgdmVuZG9yIGRhdGEgKi8KKwkJbmxhX3B1dF91MzIoc2tiLCBRQ0FfV0xBTl9WRU5ET1JfQVRUUl9URVNULCB2YWwgKyAxKTsKKworCQkvKiBTZW5kIHRoZSBldmVudCAtIHRoaXMgd2lsbCBjYWxsIG5sYV9uZXN0X2VuZCgpICovCisJCWNmZzgwMjExX3ZlbmRvcl9ldmVudChza2IsIEdGUF9LRVJORUwpOworCX0KKworCS8qIFNlbmQgYSByZXNwb25zZSB0byB0aGUgY29tbWFuZCAqLworCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9jbWRfYWxsb2NfcmVwbHlfc2tiKHdpcGh5LCAxMCk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogc2tiX3B1dCgpIG9yIG5sYV9wdXQoKSB3aWxsIGZpbGwgdXAgZGF0YSB3aXRoaW4KKwkgKiBOTDgwMjExX0FUVFJfVkVORE9SX0RBVEEKKwkgKi8KKwlubGFfcHV0X3UzMihza2IsIFFDQV9XTEFOX1ZFTkRPUl9BVFRSX1RFU1QsIHZhbCArIDIpOworCisJcmV0dXJuIGNmZzgwMjExX3ZlbmRvcl9jbWRfcmVwbHkoc2tiKTsKK30KKworc3RhdGljIHN0cnVjdCB3aXBoeV92ZW5kb3JfY29tbWFuZCBtYWM4MDIxMV9od3NpbV92ZW5kb3JfY29tbWFuZHNbXSA9IHsKKwl7CisJCS5pbmZvID0geyAudmVuZG9yX2lkID0gT1VJX1FDQSwKKwkJCSAgLnN1YmNtZCA9IFFDQV9OTDgwMjExX1NVQkNNRF9URVNUIH0sCisJCS5mbGFncyA9IFdJUEhZX1ZFTkRPUl9DTURfTkVFRF9ORVRERVYsCisJCS5kb2l0ID0gbWFjODAyMTFfaHdzaW1fdmVuZG9yX2NtZF90ZXN0LAorCX0KK307CisKKy8qIEFkdmVydGlzZSBzdXBwb3J0IHZlbmRvciBzcGVjaWZpYyBldmVudHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgbmw4MDIxMV92ZW5kb3JfY21kX2luZm8gbWFjODAyMTFfaHdzaW1fdmVuZG9yX2V2ZW50c1tdID0geworCXsgLnZlbmRvcl9pZCA9IE9VSV9RQ0EsIC5zdWJjbWQgPSAxIH0sCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBod3NpbV9pZl9saW1pdHNbXSA9IHsKIAl7IC5tYXggPSAxLCAudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpIH0sCiAJeyAubWF4ID0gMjA0OCwgIC50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8CkBAIC05MDYsOCArOTgzLDcgQEAKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJfQogCi0JaWYgKG5sYV9wdXQoc2tiLCBIV1NJTV9BVFRSX0FERFJfVFJBTlNNSVRURVIsCi0JCSAgICBFVEhfQUxFTiwgZGF0YS0+YWRkcmVzc2VzWzFdLmFkZHIpKQorCWlmIChubGFfcHV0KHNrYiwgSFdTSU1fQVRUUl9BRERSX1RSQU5TTUlUVEVSLCBFVEhfQUxFTiwgaGRyLT5hZGRyMikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJLyogV2UgZ2V0IHRoZSBza2ItPmRhdGEgKi8KQEAgLTE1MjIsMjEgKzE1OTgsMTYgQEAKIAkJdnAtPmFpZCA9IGluZm8tPmFpZDsKIAl9CiAKLQlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTl9JTlQpIHsKLQkJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiICBCQ05JTlQ6ICVkXG4iLCBpbmZvLT5iZWFjb25faW50KTsKLQkJZGF0YS0+YmVhY29uX2ludCA9IGluZm8tPmJlYWNvbl9pbnQgKiAxMDI0OwotCX0KLQogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpIHsKLQkJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiICBCQ04gRU46ICVkXG4iLCBpbmZvLT5lbmFibGVfYmVhY29uKTsKKwkJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiICBCQ04gRU46ICVkIChCST0ldSlcbiIsCisJCQkgICAgaW5mby0+ZW5hYmxlX2JlYWNvbiwgaW5mby0+YmVhY29uX2ludCk7CiAJCXZwLT5iY25fZW4gPSBpbmZvLT5lbmFibGVfYmVhY29uOwogCQlpZiAoZGF0YS0+c3RhcnRlZCAmJgogCQkgICAgIWhydGltZXJfaXNfcXVldWVkKCZkYXRhLT5iZWFjb25fdGltZXIudGltZXIpICYmCiAJCSAgICBpbmZvLT5lbmFibGVfYmVhY29uKSB7CiAJCQl1NjQgdHNmLCB1bnRpbF90YnR0OwogCQkJdTMyIGJjbl9pbnQ7Ci0JCQlpZiAoV0FSTl9PTighZGF0YS0+YmVhY29uX2ludCkpCi0JCQkJZGF0YS0+YmVhY29uX2ludCA9IDEwMDAgKiAxMDI0OworCQkJZGF0YS0+YmVhY29uX2ludCA9IGluZm8tPmJlYWNvbl9pbnQgKiAxMDI0OwogCQkJdHNmID0gbWFjODAyMTFfaHdzaW1fZ2V0X3RzZihodywgdmlmKTsKIAkJCWJjbl9pbnQgPSBkYXRhLT5iZWFjb25faW50OwogCQkJdW50aWxfdGJ0dCA9IGJjbl9pbnQgLSBkb19kaXYodHNmLCBiY25faW50KTsKQEAgLTE1NTAsOCArMTYyMSwxMCBAQAogCQkJCW1hYzgwMjExX2h3c2ltX2Jjbl9lbl9pdGVyLCAmY291bnQpOwogCQkJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiICBiZWFjb25pbmcgdmlmcyByZW1haW5pbmc6ICV1IiwKIAkJCQkgICAgY291bnQpOwotCQkJaWYgKGNvdW50ID09IDApCisJCQlpZiAoY291bnQgPT0gMCkgewogCQkJCXRhc2tsZXRfaHJ0aW1lcl9jYW5jZWwoJmRhdGEtPmJlYWNvbl90aW1lcik7CisJCQkJZGF0YS0+YmVhY29uX2ludCA9IDA7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTE5MTEsNyArMTk4NCw3IEBACiAKIAlwcmludGsoS0VSTl9ERUJVRyAiaHdzaW0gc3dfc2Nhbl9jb21wbGV0ZVxuIik7CiAJaHdzaW0tPnNjYW5uaW5nID0gZmFsc2U7Ci0JbWVtc2V0KGh3c2ltLT5zY2FuX2FkZHIsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKGh3c2ltLT5zY2FuX2FkZHIpOwogCiAJbXV0ZXhfdW5sb2NrKCZod3NpbS0+bXV0ZXgpOwogfQpAQCAtMjI2Nyw3ICsyMzQwLDcgQEAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZkYXRhLT5wZW5kaW5nKTsKIAogCVNFVF9JRUVFODAyMTFfREVWKGh3LCBkYXRhLT5kZXYpOwotCW1lbXNldChhZGRyLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihhZGRyKTsKIAlhZGRyWzBdID0gMHgwMjsKIAlhZGRyWzNdID0gaWR4ID4+IDg7CiAJYWRkcls0XSA9IGlkeDsKQEAgLTI0MjAsNiArMjQ5MywxMiBAQAogCWh3LT5tYXhfcmF0ZXMgPSA0OwogCWh3LT5tYXhfcmF0ZV90cmllcyA9IDExOwogCisJaHctPndpcGh5LT52ZW5kb3JfY29tbWFuZHMgPSBtYWM4MDIxMV9od3NpbV92ZW5kb3JfY29tbWFuZHM7CisJaHctPndpcGh5LT5uX3ZlbmRvcl9jb21tYW5kcyA9CisJCUFSUkFZX1NJWkUobWFjODAyMTFfaHdzaW1fdmVuZG9yX2NvbW1hbmRzKTsKKwlody0+d2lwaHktPnZlbmRvcl9ldmVudHMgPSBtYWM4MDIxMV9od3NpbV92ZW5kb3JfZXZlbnRzOworCWh3LT53aXBoeS0+bl92ZW5kb3JfZXZlbnRzID0gQVJSQVlfU0laRShtYWM4MDIxMV9od3NpbV92ZW5kb3JfZXZlbnRzKTsKKwogCWlmIChwYXJhbS0+cmVnX3N0cmljdCkKIAkJaHctPndpcGh5LT5yZWd1bGF0b3J5X2ZsYWdzIHw9IFJFR1VMQVRPUllfU1RSSUNUX1JFRzsKIAlpZiAocGFyYW0tPnJlZ2QpIHsKQEAgLTI2MDAsNyArMjY3OSw3IEBACiAJZXRoZXJfc2V0dXAoZGV2KTsKIAlkZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CiAJZGV2LT50eXBlID0gQVJQSFJEX0lFRUU4MDIxMV9SQURJT1RBUDsKLQltZW1zZXQoZGV2LT5kZXZfYWRkciwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIoZGV2LT5kZXZfYWRkcik7CiAJZGV2LT5kZXZfYWRkclswXSA9IDB4MTI7CiB9CiAKQEAgLTI2MTEsNyArMjY5MCw3IEBACiAKIAlzcGluX2xvY2tfYmgoJmh3c2ltX3JhZGlvX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGF0YSwgJmh3c2ltX3JhZGlvcywgbGlzdCkgewotCQlpZiAobWVtY21wKGRhdGEtPmFkZHJlc3Nlc1sxXS5hZGRyLCBhZGRyLCBFVEhfQUxFTikgPT0gMCkgeworCQlpZiAobWFjODAyMTFfaHdzaW1fYWRkcl9tYXRjaChkYXRhLCBhZGRyKSkgewogCQkJX2ZvdW5kID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW4uYwppbmRleCA1NDMxNDhkLi40MzNiZDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuLmMKQEAgLTE1OSw2ICsxNTksNyBAQAogCWludCB0aWQ7CiAJc3RydWN0IGhvc3RfY21kX2RzXzExbl9hZGRiYV9yc3AgKmFkZF9iYV9yc3AgPSAmcmVzcC0+cGFyYW1zLmFkZF9iYV9yc3A7CiAJc3RydWN0IG13aWZpZXhfdHhfYmFfc3RyZWFtX3RibCAqdHhfYmFfdGJsOworCXN0cnVjdCBtd2lmaWV4X3JhX2xpc3RfdGJsICpyYV9saXN0OwogCXUxNiBibG9ja19hY2tfcGFyYW1fc2V0ID0gbGUxNl90b19jcHUoYWRkX2JhX3JzcC0+YmxvY2tfYWNrX3BhcmFtX3NldCk7CiAKIAlhZGRfYmFfcnNwLT5zc24gPSBjcHVfdG9fbGUxNigobGUxNl90b19jcHUoYWRkX2JhX3JzcC0+c3NuKSkKQEAgLTE2Niw3ICsxNjcsMTMgQEAKIAogCXRpZCA9IChibG9ja19hY2tfcGFyYW1fc2V0ICYgSUVFRTgwMjExX0FEREJBX1BBUkFNX1RJRF9NQVNLKQogCSAgICAgICA+PiBCTE9DS0FDS1BBUkFNX1RJRF9QT1M7CisJcmFfbGlzdCA9IG13aWZpZXhfd21tX2dldF9yYWxpc3Rfbm9kZShwcml2LCB0aWQsIGFkZF9iYV9yc3AtPgorCQlwZWVyX21hY19hZGRyKTsKIAlpZiAobGUxNl90b19jcHUoYWRkX2JhX3JzcC0+c3RhdHVzX2NvZGUpICE9IEJBX1JFU1VMVF9TVUNDRVNTKSB7CisJCWlmIChyYV9saXN0KSB7CisJCQlyYV9saXN0LT5iYV9zdGF0dXMgPSBCQV9TRVRVUF9OT05FOworCQkJcmFfbGlzdC0+YW1zZHVfaW5fYW1wZHUgPSBmYWxzZTsKKwkJfQogCQltd2lmaWV4X2RlbF9iYV90YmwocHJpdiwgdGlkLCBhZGRfYmFfcnNwLT5wZWVyX21hY19hZGRyLAogCQkJCSAgIFRZUEVfREVMQkFfU0VOVCwgdHJ1ZSk7CiAJCWlmIChhZGRfYmFfcnNwLT5hZGRfcnNwX3Jlc3VsdCAhPSBCQV9SRVNVTFRfVElNRU9VVCkKQEAgLTE4NSw2ICsxOTIsMTAgQEAKIAkJCXR4X2JhX3RibC0+YW1zZHUgPSB0cnVlOwogCQllbHNlCiAJCQl0eF9iYV90YmwtPmFtc2R1ID0gZmFsc2U7CisJCWlmIChyYV9saXN0KSB7CisJCQlyYV9saXN0LT5hbXNkdV9pbl9hbXBkdSA9IHR4X2JhX3RibC0+YW1zZHU7CisJCQlyYV9saXN0LT5iYV9zdGF0dXMgPSBCQV9TRVRVUF9DT01QTEVURTsKKwkJfQogCX0gZWxzZSB7CiAJCWRldl9lcnIocHJpdi0+YWRhcHRlci0+ZGV2LCAiQkEgc3RyZWFtIG5vdCBjcmVhdGVkXG4iKTsKIAl9CkBAIC01MTUsNiArNTI2LDcgQEAKIAkJCSAgIGVudW0gbXdpZmlleF9iYV9zdGF0dXMgYmFfc3RhdHVzKQogewogCXN0cnVjdCBtd2lmaWV4X3R4X2JhX3N0cmVhbV90YmwgKm5ld19ub2RlOworCXN0cnVjdCBtd2lmaWV4X3JhX2xpc3RfdGJsICpyYV9saXN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIW13aWZpZXhfZ2V0X2JhX3RibChwcml2LCB0aWQsIHJhKSkgewpAQCAtNTIyLDcgKzUzNCwxMSBAQAogCQkJCSAgIEdGUF9BVE9NSUMpOwogCQlpZiAoIW5ld19ub2RlKQogCQkJcmV0dXJuOwotCisJCXJhX2xpc3QgPSBtd2lmaWV4X3dtbV9nZXRfcmFsaXN0X25vZGUocHJpdiwgdGlkLCByYSk7CisJCWlmIChyYV9saXN0KSB7CisJCQlyYV9saXN0LT5iYV9zdGF0dXMgPSBiYV9zdGF0dXM7CisJCQlyYV9saXN0LT5hbXNkdV9pbl9hbXBkdSA9IGZhbHNlOworCQl9CiAJCUlOSVRfTElTVF9IRUFEKCZuZXdfbm9kZS0+bGlzdCk7CiAKIAkJbmV3X25vZGUtPnRpZCA9IHRpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbi5oCmluZGV4IDhlMmUzOTQuLmFmZGQ1OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW4uaApAQCAtNzcsMjIgKzc3LDYgQEAKIAlyZXR1cm4gKG5vZGUtPmFtcGR1X3N0YVt0aWRdICE9IEJBX1NUUkVBTV9OT1RfQUxMT1dFRCkgPyB0cnVlIDogZmFsc2U7CiB9CiAKLS8qIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgQU1TRFUgaXMgYWxsb3dlZCBmb3IgQkEgc3RyZWFtLiAqLwotc3RhdGljIGlubGluZSB1OAotbXdpZmlleF9pc19hbXNkdV9pbl9hbXBkdV9hbGxvd2VkKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCi0JCQkJICBzdHJ1Y3QgbXdpZmlleF9yYV9saXN0X3RibCAqcHRyLCBpbnQgdGlkKQotewotCXN0cnVjdCBtd2lmaWV4X3R4X2JhX3N0cmVhbV90YmwgKnR4X3RibDsKLQotCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihwdHItPnJhKSkKLQkJcmV0dXJuIGZhbHNlOwotCXR4X3RibCA9IG13aWZpZXhfZ2V0X2JhX3RibChwcml2LCB0aWQsIHB0ci0+cmEpOwotCWlmICh0eF90YmwpCi0JCXJldHVybiB0eF90YmwtPmFtc2R1OwotCi0JcmV0dXJuIGZhbHNlOwotfQotCiAvKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIEFNUERVIGlzIGFsbG93ZWQgb3Igbm90IGZvciBhIHBhcnRpY3VsYXIgVElELiAqLwogc3RhdGljIGlubGluZSB1OAogbXdpZmlleF9pc19hbXBkdV9hbGxvd2VkKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCkBAIC0xODIsMjIgKzE2Niw2IEBACiB9CiAKIC8qCi0gKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB3aGV0aGVyIEJBIHN0cmVhbSBpcyBzZXQgdXAgb3Igbm90LgotICovCi1zdGF0aWMgaW5saW5lIGludAotbXdpZmlleF9pc19iYV9zdHJlYW1fc2V0dXAoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKLQkJCSAgIHN0cnVjdCBtd2lmaWV4X3JhX2xpc3RfdGJsICpwdHIsIGludCB0aWQpCi17Ci0Jc3RydWN0IG13aWZpZXhfdHhfYmFfc3RyZWFtX3RibCAqdHhfdGJsOwotCi0JdHhfdGJsID0gbXdpZmlleF9nZXRfYmFfdGJsKHByaXYsIHRpZCwgcHRyLT5yYSk7Ci0JaWYgKHR4X3RibCAmJiBJU19CQVNUUkVBTV9TRVRVUCh0eF90YmwpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotLyoKICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgYXNzb2NpYXRlZCBzdGF0aW9uIGlzIDExbiBlbmFibGVkCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG13aWZpZXhfaXNfc3RhXzExbl9lbmFibGVkKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbl9hZ2dyLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbl9hZ2dyLmMKaW5kZXggOWI5ODNiNS4uNjE4M2UyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC8xMW5fYWdnci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX2FnZ3IuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYl9hZ2dyLCAqc2tiX3NyYzsKIAlzdHJ1Y3QgbXdpZmlleF90eGluZm8gKnR4X2luZm9fYWdnciwgKnR4X2luZm9fc3JjOwotCWludCBwYWQgPSAwLCByZXQ7CisJaW50IHBhZCA9IDAsIGFnZ3JfbnVtID0gMCwgcmV0OwogCXN0cnVjdCBtd2lmaWV4X3R4X3BhcmFtIHR4X3BhcmFtOwogCXN0cnVjdCB0eHBkICpwdHhfcGQgPSBOVUxMOwogCXN0cnVjdCB0aW1ldmFsIHR2OwpAQCAtMTg0LDcgKzE4NCw4IEBACiAJfQogCiAJdHhfaW5mb19zcmMgPSBNV0lGSUVYX1NLQl9UWENCKHNrYl9zcmMpOwotCXNrYl9hZ2dyID0gZGV2X2FsbG9jX3NrYihhZGFwdGVyLT50eF9idWZfc2l6ZSk7CisJc2tiX2FnZ3IgPSBtd2lmaWV4X2FsbG9jX2RtYV9hbGlnbl9idWYoYWRhcHRlci0+dHhfYnVmX3NpemUsCisJCQkJCSAgICAgICBHRlBfQVRPTUlDIHwgR0ZQX0RNQSk7CiAJaWYgKCFza2JfYWdncikgewogCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgIiVzOiBhbGxvYyBza2JfYWdnclxuIiwgX19mdW5jX18pOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT53bW0ucmFfbGlzdF9zcGlubG9jaywKQEAgLTIwMCw2ICsyMDEsNyBAQAogCiAJaWYgKHR4X2luZm9fc3JjLT5mbGFncyAmIE1XSUZJRVhfQlVGX0ZMQUdfVERMU19QS1QpCiAJCXR4X2luZm9fYWdnci0+ZmxhZ3MgfD0gTVdJRklFWF9CVUZfRkxBR19URExTX1BLVDsKKwl0eF9pbmZvX2FnZ3ItPmZsYWdzIHw9IE1XSUZJRVhfQlVGX0ZMQUdfQUdHUl9QS1Q7CiAJc2tiX2FnZ3ItPnByaW9yaXR5ID0gc2tiX3NyYy0+cHJpb3JpdHk7CiAKIAlkb19nZXR0aW1lb2ZkYXkoJnR2KTsKQEAgLTIxMSwxMSArMjEzLDkgQEAKIAkJCWJyZWFrOwogCiAJCXNrYl9zcmMgPSBza2JfZGVxdWV1ZSgmcHJhX2xpc3QtPnNrYl9oZWFkKTsKLQogCQlwcmFfbGlzdC0+dG90YWxfcGt0X2NvdW50LS07Ci0KIAkJYXRvbWljX2RlYygmcHJpdi0+d21tLnR4X3BrdHNfcXVldWVkKTsKLQorCQlhZ2dyX251bSsrOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT53bW0ucmFfbGlzdF9zcGlubG9jaywKIAkJCQkgICAgICAgcmFfbGlzdF9mbGFncyk7CiAJCW13aWZpZXhfMTFuX2Zvcm1fYW1zZHVfcGt0KHNrYl9hZ2dyLCBza2Jfc3JjLCAmcGFkKTsKQEAgLTI1MSw2ICsyNTEsMTIgQEAKIAkJcHR4X3BkID0gKHN0cnVjdCB0eHBkICopc2tiX2FnZ3ItPmRhdGE7CiAKIAlza2JfcHVzaChza2JfYWdnciwgaGVhZHJvb20pOworCXR4X2luZm9fYWdnci0+YWdncl9udW0gPSBhZ2dyX251bSAqIDI7CisJaWYgKGFkYXB0ZXItPmRhdGFfc2VudCB8fCBhZGFwdGVyLT50eF9sb2NrX2ZsYWcpIHsKKwkJYXRvbWljX2FkZChhZ2dyX251bSAqIDIsICZhZGFwdGVyLT50eF9xdWV1ZWQpOworCQlza2JfcXVldWVfdGFpbCgmYWRhcHRlci0+dHhfZGF0YV9xLCBza2JfYWdncik7CisJCXJldHVybiAwOworCX0KIAogCWlmIChhZGFwdGVyLT5pZmFjZV90eXBlID09IE1XSUZJRVhfVVNCKSB7CiAJCWFkYXB0ZXItPmRhdGFfc2VudCA9IHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbl9yeHJlb3JkZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCmluZGV4IGEyZTg4MTcuLmY3NWY4YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCkBAIC02NTksNiArNjU5LDcgQEAKIHsKIAlzdHJ1Y3QgbXdpZmlleF9yeF9yZW9yZGVyX3RibCAqdGJsOwogCXN0cnVjdCBtd2lmaWV4X3R4X2JhX3N0cmVhbV90YmwgKnB0eF90Ymw7CisJc3RydWN0IG13aWZpZXhfcmFfbGlzdF90YmwgKnJhX2xpc3Q7CiAJdTggY2xlYW51cF9yeF9yZW9yZGVyX3RibDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC02ODYsNyArNjg3LDExIEBACiAJCQkJImV2ZW50OiBUSUQsIFJBIG5vdCBmb3VuZCBpbiB0YWJsZVxuIik7CiAJCQlyZXR1cm47CiAJCX0KLQorCQlyYV9saXN0ID0gbXdpZmlleF93bW1fZ2V0X3JhbGlzdF9ub2RlKHByaXYsIHRpZCwgcGVlcl9tYWMpOworCQlpZiAocmFfbGlzdCkgeworCQkJcmFfbGlzdC0+YW1zZHVfaW5fYW1wZHUgPSBmYWxzZTsKKwkJCXJhX2xpc3QtPmJhX3N0YXR1cyA9IEJBX1NFVFVQX05PTkU7CisJCX0KIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnR4X2JhX3N0cmVhbV90YmxfbG9jaywgZmxhZ3MpOwogCQltd2lmaWV4XzExbl9kZWxldGVfdHhfYmFfc3RyZWFtX3RibF9lbnRyeShwcml2LCBwdHhfdGJsKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+dHhfYmFfc3RyZWFtX3RibF9sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmMKaW5kZXggNDFjOGUyNS4uYmY5MDIwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuYwpAQCAtNzE3LDYgKzcxNyw5IEBACiAKIHN0YXRpYyBpbnQgbXdpZmlleF9kZWluaXRfcHJpdl9wYXJhbXMoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdikKIHsKKwlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJcHJpdi0+bWdtdF9mcmFtZV9tYXNrID0gMDsKIAlpZiAobXdpZmlleF9zZW5kX2NtZChwcml2LCBIb3N0Q21kX0NNRF9NR01UX0ZSQU1FX1JFRywKIAkJCSAgICAgSG9zdENtZF9BQ1RfR0VOX1NFVCwgMCwKQEAgLTcyNyw2ICs3MzAsMjUgQEAKIAl9CiAKIAltd2lmaWV4X2RlYXV0aGVudGljYXRlKHByaXYsIE5VTEwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPm1haW5fcHJvY19sb2NrLCBmbGFncyk7CisJYWRhcHRlci0+bWFpbl9sb2NrZWQgPSB0cnVlOworCWlmIChhZGFwdGVyLT5td2lmaWV4X3Byb2Nlc3NpbmcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bWFpbl9wcm9jX2xvY2ssIGZsYWdzKTsKKwkJZmx1c2hfd29ya3F1ZXVlKGFkYXB0ZXItPndvcmtxdWV1ZSk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bWFpbl9wcm9jX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+cnhfcHJvY19sb2NrLCBmbGFncyk7CisJYWRhcHRlci0+cnhfbG9ja2VkID0gdHJ1ZTsKKwlpZiAoYWRhcHRlci0+cnhfcHJvY2Vzc2luZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5yeF9wcm9jX2xvY2ssIGZsYWdzKTsKKwkJZmx1c2hfd29ya3F1ZXVlKGFkYXB0ZXItPnJ4X3dvcmtxdWV1ZSk7CisJfSBlbHNlIHsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5yeF9wcm9jX2xvY2ssIGZsYWdzKTsKKwl9CisKIAltd2lmaWV4X2ZyZWVfcHJpdihwcml2KTsKIAlwcml2LT53ZGV2LmlmdHlwZSA9IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEOwogCXByaXYtPmJzc19tb2RlID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ7CkBAIC03NDAsNiArNzYyLDkgQEAKIAkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlKQogeworCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAltd2lmaWV4X2luaXRfcHJpdihwcml2KTsKIAogCXByaXYtPmJzc19tb2RlID0gdHlwZTsKQEAgLTc3MCw2ICs3OTUsMTQgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5tYWluX3Byb2NfbG9jaywgZmxhZ3MpOworCWFkYXB0ZXItPm1haW5fbG9ja2VkID0gZmFsc2U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bWFpbl9wcm9jX2xvY2ssIGZsYWdzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5yeF9wcm9jX2xvY2ssIGZsYWdzKTsKKwlhZGFwdGVyLT5yeF9sb2NrZWQgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5yeF9wcm9jX2xvY2ssIGZsYWdzKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNTYzLDcgKzE1OTYsNyBAQAogCiAJd2lwaHlfZGJnKHdpcGh5LCAiJXM6IG1hYyBhZGRyZXNzICVwTVxuIiwgX19mdW5jX18sIHBhcmFtcy0+bWFjKTsKIAotCW1lbXNldChkZWF1dGhfbWFjLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihkZWF1dGhfbWFjKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbGlzdF9zcGlubG9jaywgZmxhZ3MpOwogCXN0YV9ub2RlID0gbXdpZmlleF9nZXRfc3RhX2VudHJ5KHByaXYsIHBhcmFtcy0+bWFjKTsKQEAgLTE3ODYsNyArMTgxOSw3IEBACiAJd2lwaHlfZGJnKHdpcGh5LCAiaW5mbzogc3VjY2Vzc2Z1bGx5IGRpc2Nvbm5lY3RlZCBmcm9tICVwTToiCiAJCSIgcmVhc29uIGNvZGUgJWRcbiIsIHByaXYtPmNmZ19ic3NpZCwgcmVhc29uX2NvZGUpOwogCi0JbWVtc2V0KHByaXYtPmNmZ19ic3NpZCwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIocHJpdi0+Y2ZnX2Jzc2lkKTsKIAlwcml2LT5oczJfZW5hYmxlZCA9IGZhbHNlOwogCiAJcmV0dXJuIDA7CkBAIC0xOTU0LDEzICsxOTg3LDEzIEBACiAJCWlmIChtb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQkJYnNzID0gY2ZnODAyMTFfZ2V0X2Jzcyhwcml2LT53ZGV2LndpcGh5LCBjaGFubmVsLAogCQkJCQkgICAgICAgYnNzaWQsIHNzaWQsIHNzaWRfbGVuLAotCQkJCQkgICAgICAgV0xBTl9DQVBBQklMSVRZX0lCU1MsCi0JCQkJCSAgICAgICBXTEFOX0NBUEFCSUxJVFlfSUJTUyk7CisJCQkJCSAgICAgICBJRUVFODAyMTFfQlNTX1RZUEVfSUJTUywKKwkJCQkJICAgICAgIElFRUU4MDIxMV9QUklWQUNZX0FOWSk7CiAJCWVsc2UKIAkJCWJzcyA9IGNmZzgwMjExX2dldF9ic3MocHJpdi0+d2Rldi53aXBoeSwgY2hhbm5lbCwKIAkJCQkJICAgICAgIGJzc2lkLCBzc2lkLCBzc2lkX2xlbiwKLQkJCQkJICAgICAgIFdMQU5fQ0FQQUJJTElUWV9FU1MsCi0JCQkJCSAgICAgICBXTEFOX0NBUEFCSUxJVFlfRVNTKTsKKwkJCQkJICAgICAgIElFRUU4MDIxMV9CU1NfVFlQRV9FU1MsCisJCQkJCSAgICAgICBJRUVFODAyMTFfUFJJVkFDWV9BTlkpOwogCiAJCWlmICghYnNzKSB7CiAJCQlpZiAoaXNfc2Nhbm5pbmdfcmVxdWlyZWQpIHsKQEAgLTIwNDYsNyArMjA3OSw3IEBACiAJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LAogCQkJImluZm86IGFzc29jaWF0aW9uIHRvIGJzc2lkICVwTSBmYWlsZWRcbiIsCiAJCQlwcml2LT5jZmdfYnNzaWQpOwotCQltZW1zZXQocHJpdi0+Y2ZnX2Jzc2lkLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIocHJpdi0+Y2ZnX2Jzc2lkKTsKIAogCQlpZiAocmV0ID4gMCkKIAkJCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KHByaXYtPm5ldGRldiwgcHJpdi0+Y2ZnX2Jzc2lkLApAQCAtMjE5NCw3ICsyMjI3LDcgQEAKIAlpZiAobXdpZmlleF9kZWF1dGhlbnRpY2F0ZShwcml2LCBOVUxMKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQltZW1zZXQocHJpdi0+Y2ZnX2Jzc2lkLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihwcml2LT5jZmdfYnNzaWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMzk3LDEyICsyNDMwLDEyIEBACiAJaHRfaW5mby0+bWNzLnR4X3BhcmFtcyA9IElFRUU4MDIxMV9IVF9NQ1NfVFhfREVGSU5FRDsKIH0KIAotI2RlZmluZSBNV0lGSUVYX01BWF9XUV9MRU4gIDMwCiAvKgotICogIGNyZWF0ZSBhIG5ldyB2aXJ0dWFsIGludGVyZmFjZSB3aXRoIHRoZSBnaXZlbiBuYW1lCisgKiAgY3JlYXRlIGEgbmV3IHZpcnR1YWwgaW50ZXJmYWNlIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIG5hbWUgYXNzaWduIHR5cGUKICAqLwogc3RydWN0IHdpcmVsZXNzX2RldiAqbXdpZmlleF9hZGRfdmlydHVhbF9pbnRmKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgbmFtZV9hc3NpZ25fdHlwZSwKIAkJCQkJICAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAogCQkJCQkgICAgICB1MzIgKmZsYWdzLAogCQkJCQkgICAgICBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKQpAQCAtMjQxMSw3ICsyNDQ0LDYgQEAKIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2OwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJdm9pZCAqbWRldl9wcml2OwotCWNoYXIgZGZzX2NhY19zdHJbTVdJRklFWF9NQVhfV1FfTEVOXSwgZGZzX2Noc3dfc3RyW01XSUZJRVhfTUFYX1dRX0xFTl07CiAKIAlpZiAoIWFkYXB0ZXIpCiAJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwpAQCAtMjUyMyw3ICsyNTU1LDcgQEAKIAl9CiAKIAlkZXYgPSBhbGxvY19uZXRkZXZfbXFzKHNpemVvZihzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICopLCBuYW1lLAotCQkJICAgICAgIE5FVF9OQU1FX1VOS05PV04sIGV0aGVyX3NldHVwLAorCQkJICAgICAgIG5hbWVfYXNzaWduX3R5cGUsIGV0aGVyX3NldHVwLAogCQkJICAgICAgIElFRUU4MDIxMV9OVU1fQUNTLCAxKTsKIAlpZiAoIWRldikgewogCQl3aXBoeV9lcnIod2lwaHksICJubyBtZW1vcnkgYXZhaWxhYmxlIGZvciBuZXRkZXZpY2VcbiIpOwpAQCAtMjU3NiwxMiArMjYwOCwxMCBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUZBVUxUKTsKIAl9CiAKLQlzdHJjcHkoZGZzX2NhY19zdHIsICJNV0lGSUVYX0RGU19DQUMiKTsKLQlzdHJjYXQoZGZzX2NhY19zdHIsIG5hbWUpOwotCXByaXYtPmRmc19jYWNfd29ya3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKGRmc19jYWNfc3RyLAorCXByaXYtPmRmc19jYWNfd29ya3F1ZXVlID0gYWxsb2Nfd29ya3F1ZXVlKCJNV0lGSUVYX0RGU19DQUMlcyIsCiAJCQkJCQkgIFdRX0hJR0hQUkkgfAogCQkJCQkJICBXUV9NRU1fUkVDTEFJTSB8Ci0JCQkJCQkgIFdRX1VOQk9VTkQsIDEpOworCQkJCQkJICBXUV9VTkJPVU5ELCAxLCBuYW1lKTsKIAlpZiAoIXByaXYtPmRmc19jYWNfd29ya3F1ZXVlKSB7CiAJCXdpcGh5X2Vycih3aXBoeSwgImNhbm5vdCByZWdpc3RlciB2aXJ0dWFsIG5ldHdvcmsgZGV2aWNlXG4iKTsKIAkJZnJlZV9uZXRkZXYoZGV2KTsKQEAgLTI1OTQsMTEgKzI2MjQsOSBAQAogCiAJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmRmc19jYWNfd29yaywgbXdpZmlleF9kZnNfY2FjX3dvcmtfcXVldWUpOwogCi0Jc3RyY3B5KGRmc19jaHN3X3N0ciwgIk1XSUZJRVhfREZTX0NIU1ciKTsKLQlzdHJjYXQoZGZzX2Noc3dfc3RyLCBuYW1lKTsKLQlwcml2LT5kZnNfY2hhbl9zd193b3JrcXVldWUgPSBhbGxvY193b3JrcXVldWUoZGZzX2Noc3dfc3RyLAorCXByaXYtPmRmc19jaGFuX3N3X3dvcmtxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZSgiTVdJRklFWF9ERlNfQ0hTVyVzIiwKIAkJCQkJCSAgICAgIFdRX0hJR0hQUkkgfCBXUV9VTkJPVU5EIHwKLQkJCQkJCSAgICAgIFdRX01FTV9SRUNMQUlNLCAxKTsKKwkJCQkJCSAgICAgIFdRX01FTV9SRUNMQUlNLCAxLCBuYW1lKTsKIAlpZiAoIXByaXYtPmRmc19jaGFuX3N3X3dvcmtxdWV1ZSkgewogCQl3aXBoeV9lcnIod2lwaHksICJjYW5ub3QgcmVnaXN0ZXIgdmlydHVhbCBuZXR3b3JrIGRldmljZVxuIik7CiAJCWZyZWVfbmV0ZGV2KGRldik7CkBAIC0yNzM4LDI0ICsyNzY2LDcxIEBACiB9CiAKICNpZmRlZiBDT05GSUdfUE0KLXN0YXRpYyBpbnQgbXdpZmlleF9zZXRfbWVmX2ZpbHRlcihzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAotCQkJCSAgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKQorc3RhdGljIHZvaWQgbXdpZmlleF9zZXRfYXV0b19hcnBfbWVmX2VudHJ5KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCisJCQkJCSAgIHN0cnVjdCBtd2lmaWV4X21lZl9lbnRyeSAqbWVmX2VudHJ5KQoreworCWludCBpLCBmaWx0X251bSA9IDAsIG51bV9pcHY0ID0gMDsKKwlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CisJc3RydWN0IGluX2lmYWRkciAqaWZhOworCV9fYmUzMiBpcHNbTVdJRklFWF9NQVhfU1VQUE9SVEVEX0lQQUREUl07CisJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CisKKwltZWZfZW50cnktPm1vZGUgPSBNRUZfTU9ERV9IT1NUX1NMRUVQOworCW1lZl9lbnRyeS0+YWN0aW9uID0gTUVGX0FDVElPTl9BVVRPX0FSUDsKKworCS8qIEVuYWJsZSBBUlAgb2ZmbG9hZCBmZWF0dXJlICovCisJbWVtc2V0KGlwcywgMCwgc2l6ZW9mKGlwcykpOworCWZvciAoaSA9IDA7IGkgPCBNV0lGSUVYX01BWF9CU1NfTlVNOyBpKyspIHsKKwkJaWYgKGFkYXB0ZXItPnByaXZbaV0tPm5ldGRldikgeworCQkJaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3J0bmwoYWRhcHRlci0+cHJpdltpXS0+bmV0ZGV2KTsKKwkJCWlmICghaW5fZGV2KQorCQkJCWNvbnRpbnVlOworCQkJaWZhID0gaW5fZGV2LT5pZmFfbGlzdDsKKwkJCWlmICghaWZhIHx8ICFpZmEtPmlmYV9sb2NhbCkKKwkJCQljb250aW51ZTsKKwkJCWlwc1tpXSA9IGlmYS0+aWZhX2xvY2FsOworCQkJbnVtX2lwdjQrKzsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1faXB2NDsgaSsrKSB7CisJCWlmICghaXBzW2ldKQorCQkJY29udGludWU7CisJCW1lZl9lbnRyeS0+ZmlsdGVyW2ZpbHRfbnVtXS5yZXBlYXQgPSAxOworCQltZW1jcHkobWVmX2VudHJ5LT5maWx0ZXJbZmlsdF9udW1dLmJ5dGVfc2VxLAorCQkgICAgICAgKHU4ICopJmlwc1tpXSwgc2l6ZW9mKGlwc1tpXSkpOworCQltZWZfZW50cnktPmZpbHRlcltmaWx0X251bV0uCisJCQlieXRlX3NlcVtNV0lGSUVYX01FRl9NQVhfQllURVNFUV0gPQorCQkJc2l6ZW9mKGlwc1tpXSk7CisJCW1lZl9lbnRyeS0+ZmlsdGVyW2ZpbHRfbnVtXS5vZmZzZXQgPSA0NjsKKwkJbWVmX2VudHJ5LT5maWx0ZXJbZmlsdF9udW1dLmZpbHRfdHlwZSA9IFRZUEVfRVE7CisJCWlmIChmaWx0X251bSkgeworCQkJbWVmX2VudHJ5LT5maWx0ZXJbZmlsdF9udW1dLmZpbHRfYWN0aW9uID0KKwkJCQlUWVBFX09SOworCQl9CisJCWZpbHRfbnVtKys7CisJfQorCisJbWVmX2VudHJ5LT5maWx0ZXJbZmlsdF9udW1dLnJlcGVhdCA9IDE7CisJbWVmX2VudHJ5LT5maWx0ZXJbZmlsdF9udW1dLmJ5dGVfc2VxWzBdID0gMHgwODsKKwltZWZfZW50cnktPmZpbHRlcltmaWx0X251bV0uYnl0ZV9zZXFbMV0gPSAweDA2OworCW1lZl9lbnRyeS0+ZmlsdGVyW2ZpbHRfbnVtXS5ieXRlX3NlcVtNV0lGSUVYX01FRl9NQVhfQllURVNFUV0gPSAyOworCW1lZl9lbnRyeS0+ZmlsdGVyW2ZpbHRfbnVtXS5vZmZzZXQgPSAyMDsKKwltZWZfZW50cnktPmZpbHRlcltmaWx0X251bV0uZmlsdF90eXBlID0gVFlQRV9FUTsKKwltZWZfZW50cnktPmZpbHRlcltmaWx0X251bV0uZmlsdF9hY3Rpb24gPSBUWVBFX0FORDsKK30KKworc3RhdGljIGludCBtd2lmaWV4X3NldF93b3dsYW5fbWVmX2VudHJ5KHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCisJCQkJCXN0cnVjdCBtd2lmaWV4X2RzX21lZl9jZmcgKm1lZl9jZmcsCisJCQkJCXN0cnVjdCBtd2lmaWV4X21lZl9lbnRyeSAqbWVmX2VudHJ5LAorCQkJCQlzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3dsYW4pCiB7CiAJaW50IGksIGZpbHRfbnVtID0gMCwgcmV0ID0gMDsKIAlib29sIGZpcnN0X3BhdCA9IHRydWU7CiAJdTggYnl0ZV9zZXFbTVdJRklFWF9NRUZfTUFYX0JZVEVTRVEgKyAxXTsKIAljb25zdCB1OCBpcHY0X21jX21hY1tdID0gezB4MzMsIDB4MzN9OwogCWNvbnN0IHU4IGlwdjZfbWNfbWFjW10gPSB7MHgwMSwgMHgwMCwgMHg1ZX07Ci0Jc3RydWN0IG13aWZpZXhfZHNfbWVmX2NmZyBtZWZfY2ZnOwotCXN0cnVjdCBtd2lmaWV4X21lZl9lbnRyeSAqbWVmX2VudHJ5OwogCi0JbWVmX2VudHJ5ID0ga3phbGxvYyhzaXplb2YoKm1lZl9lbnRyeSksIEdGUF9LRVJORUwpOwotCWlmICghbWVmX2VudHJ5KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW1lbXNldCgmbWVmX2NmZywgMCwgc2l6ZW9mKG1lZl9jZmcpKTsKLQltZWZfY2ZnLm51bV9lbnRyaWVzID0gMTsKLQltZWZfY2ZnLm1lZl9lbnRyeSA9IG1lZl9lbnRyeTsKIAltZWZfZW50cnktPm1vZGUgPSBNRUZfTU9ERV9IT1NUX1NMRUVQOwogCW1lZl9lbnRyeS0+YWN0aW9uID0gTUVGX0FDVElPTl9BTExPV19BTkRfV0FLRVVQX0hPU1Q7CiAKQEAgLTI3NzIsMjAgKzI4NDcsMTkgQEAKIAkJaWYgKCF3b3dsYW4tPnBhdHRlcm5zW2ldLnBrdF9vZmZzZXQpIHsKIAkJCWlmICghKGJ5dGVfc2VxWzBdICYgMHgwMSkgJiYKIAkJCSAgICAoYnl0ZV9zZXFbTVdJRklFWF9NRUZfTUFYX0JZVEVTRVFdID09IDEpKSB7Ci0JCQkJbWVmX2NmZy5jcml0ZXJpYSB8PSBNV0lGSUVYX0NSSVRFUklBX1VOSUNBU1Q7CisJCQkJbWVmX2NmZy0+Y3JpdGVyaWEgfD0gTVdJRklFWF9DUklURVJJQV9VTklDQVNUOwogCQkJCWNvbnRpbnVlOwogCQkJfSBlbHNlIGlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihieXRlX3NlcSkpIHsKLQkJCQltZWZfY2ZnLmNyaXRlcmlhIHw9IE1XSUZJRVhfQ1JJVEVSSUFfQlJPQURDQVNUOworCQkJCW1lZl9jZmctPmNyaXRlcmlhIHw9IE1XSUZJRVhfQ1JJVEVSSUFfQlJPQURDQVNUOwogCQkJCWNvbnRpbnVlOwogCQkJfSBlbHNlIGlmICgoIW1lbWNtcChieXRlX3NlcSwgaXB2NF9tY19tYWMsIDIpICYmCiAJCQkJICAgIChieXRlX3NlcVtNV0lGSUVYX01FRl9NQVhfQllURVNFUV0gPT0gMikpIHx8CiAJCQkJICAgKCFtZW1jbXAoYnl0ZV9zZXEsIGlwdjZfbWNfbWFjLCAzKSAmJgogCQkJCSAgICAoYnl0ZV9zZXFbTVdJRklFWF9NRUZfTUFYX0JZVEVTRVFdID09IDMpKSkgewotCQkJCW1lZl9jZmcuY3JpdGVyaWEgfD0gTVdJRklFWF9DUklURVJJQV9NVUxUSUNBU1Q7CisJCQkJbWVmX2NmZy0+Y3JpdGVyaWEgfD0gTVdJRklFWF9DUklURVJJQV9NVUxUSUNBU1Q7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCX0KLQogCQltZWZfZW50cnktPmZpbHRlcltmaWx0X251bV0ucmVwZWF0ID0gMTsKIAkJbWVmX2VudHJ5LT5maWx0ZXJbZmlsdF9udW1dLm9mZnNldCA9CiAJCQl3b3dsYW4tPnBhdHRlcm5zW2ldLnBrdF9vZmZzZXQ7CkBAIC0yODAyLDcgKzI4NzYsNyBAQAogCX0KIAogCWlmICh3b3dsYW4tPm1hZ2ljX3BrdCkgewotCQltZWZfY2ZnLmNyaXRlcmlhIHw9IE1XSUZJRVhfQ1JJVEVSSUFfVU5JQ0FTVDsKKwkJbWVmX2NmZy0+Y3JpdGVyaWEgfD0gTVdJRklFWF9DUklURVJJQV9VTklDQVNUOwogCQltZWZfZW50cnktPmZpbHRlcltmaWx0X251bV0ucmVwZWF0ID0gMTY7CiAJCW1lbWNweShtZWZfZW50cnktPmZpbHRlcltmaWx0X251bV0uYnl0ZV9zZXEsIHByaXYtPmN1cnJfYWRkciwKIAkJCQlFVEhfQUxFTik7CkBAIC0yODIzLDYgKzI4OTcsMzQgQEAKIAkJbWVmX2VudHJ5LT5maWx0ZXJbZmlsdF9udW1dLmZpbHRfdHlwZSA9IFRZUEVfRVE7CiAJCW1lZl9lbnRyeS0+ZmlsdGVyW2ZpbHRfbnVtXS5maWx0X2FjdGlvbiA9IFRZUEVfT1I7CiAJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbXdpZmlleF9zZXRfbWVmX2ZpbHRlcihzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAorCQkJCSAgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKQoreworCWludCByZXQgPSAwLCBudW1fZW50cmllcyA9IDE7CisJc3RydWN0IG13aWZpZXhfZHNfbWVmX2NmZyBtZWZfY2ZnOworCXN0cnVjdCBtd2lmaWV4X21lZl9lbnRyeSAqbWVmX2VudHJ5OworCisJaWYgKHdvd2xhbi0+bl9wYXR0ZXJucyB8fCB3b3dsYW4tPm1hZ2ljX3BrdCkKKwkJbnVtX2VudHJpZXMrKzsKKworCW1lZl9lbnRyeSA9IGtjYWxsb2MobnVtX2VudHJpZXMsIHNpemVvZigqbWVmX2VudHJ5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtZWZfZW50cnkpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtc2V0KCZtZWZfY2ZnLCAwLCBzaXplb2YobWVmX2NmZykpOworCW1lZl9jZmcuY3JpdGVyaWEgfD0gTVdJRklFWF9DUklURVJJQV9CUk9BRENBU1QgfAorCQlNV0lGSUVYX0NSSVRFUklBX1VOSUNBU1Q7CisJbWVmX2NmZy5udW1fZW50cmllcyA9IG51bV9lbnRyaWVzOworCW1lZl9jZmcubWVmX2VudHJ5ID0gbWVmX2VudHJ5OworCisJbXdpZmlleF9zZXRfYXV0b19hcnBfbWVmX2VudHJ5KHByaXYsICZtZWZfZW50cnlbMF0pOworCisJaWYgKHdvd2xhbi0+bl9wYXR0ZXJucyB8fCB3b3dsYW4tPm1hZ2ljX3BrdCkKKwkJcmV0ID0gbXdpZmlleF9zZXRfd293bGFuX21lZl9lbnRyeShwcml2LCAmbWVmX2NmZywKKwkJCQkJCSAgICZtZWZfZW50cnlbMV0sIHdvd2xhbik7CiAKIAlpZiAoIW1lZl9jZmcuY3JpdGVyaWEpCiAJCW1lZl9jZmcuY3JpdGVyaWEgPSBNV0lGSUVYX0NSSVRFUklBX0JST0FEQ0FTVCB8CkBAIC0yODMwLDggKzI5MzIsOCBAQAogCQkJTVdJRklFWF9DUklURVJJQV9NVUxUSUNBU1Q7CiAKIAlyZXQgPSBtd2lmaWV4X3NlbmRfY21kKHByaXYsIEhvc3RDbWRfQ01EX01FRl9DRkcsCi0JCQlIb3N0Q21kX0FDVF9HRU5fU0VULCAwLCAmbWVmX2NmZywgdHJ1ZSk7Ci0KKwkJCUhvc3RDbWRfQUNUX0dFTl9TRVQsIDAsCisJCQkmbWVmX2NmZywgdHJ1ZSk7CiAJa2ZyZWUobWVmX2VudHJ5KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjg0MSwyNyArMjk0MywzMyBAQAogewogCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBtd2lmaWV4X2NmZzgwMjExX2dldF9hZGFwdGVyKHdpcGh5KTsKIAlzdHJ1Y3QgbXdpZmlleF9kc19oc19jZmcgaHNfY2ZnOwotCWludCByZXQgPSAwOwotCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPQotCQkJbXdpZmlleF9nZXRfcHJpdihhZGFwdGVyLCBNV0lGSUVYX0JTU19ST0xFX1NUQSk7CisJaW50IGksIHJldCA9IDA7CisJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdjsKKworCWZvciAoaSA9IDA7IGkgPCBhZGFwdGVyLT5wcml2X251bTsgaSsrKSB7CisJCXByaXYgPSBhZGFwdGVyLT5wcml2W2ldOworCQltd2lmaWV4X2Fib3J0X2NhYyhwcml2KTsKKwl9CisKKwltd2lmaWV4X2NhbmNlbF9hbGxfcGVuZGluZ19jbWQoYWRhcHRlcik7CiAKIAlpZiAoIXdvd2xhbikgewogCQlkZXZfd2FybihhZGFwdGVyLT5kZXYsICJOb25lIG9mIHRoZSBXT1dMQU4gdHJpZ2dlcnMgZW5hYmxlZFxuIik7CiAJCXJldHVybiAwOwogCX0KIAorCXByaXYgPSBtd2lmaWV4X2dldF9wcml2KGFkYXB0ZXIsIE1XSUZJRVhfQlNTX1JPTEVfU1RBKTsKKwogCWlmICghcHJpdi0+bWVkaWFfY29ubmVjdGVkKSB7CiAJCWRldl93YXJuKGFkYXB0ZXItPmRldiwKIAkJCSAiQ2FuIG5vdCBjb25maWd1cmUgV09XTEFOIGluIGRpc2Nvbm5lY3RlZCBzdGF0ZVxuIik7CiAJCXJldHVybiAwOwogCX0KIAotCWlmICh3b3dsYW4tPm5fcGF0dGVybnMgfHwgd293bGFuLT5tYWdpY19wa3QpIHsKLQkJcmV0ID0gbXdpZmlleF9zZXRfbWVmX2ZpbHRlcihwcml2LCB3b3dsYW4pOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgIkZhaWxlZCB0byBzZXQgTUVGIGZpbHRlclxuIik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9CisJcmV0ID0gbXdpZmlleF9zZXRfbWVmX2ZpbHRlcihwcml2LCB3b3dsYW4pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihhZGFwdGVyLT5kZXYsICJGYWlsZWQgdG8gc2V0IE1FRiBmaWx0ZXJcbiIpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmICh3b3dsYW4tPmRpc2Nvbm5lY3QpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZGVjbC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9kZWNsLmgKaW5kZXggODhkMGVhZC4uMzhmMjRlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9kZWNsLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9kZWNsLmgKQEAgLTMzLDYgKzMzLDcgQEAKICNkZWZpbmUgTVdJRklFWF9NQVhfQlNTX05VTSAgICAgICAgICgzKQogCiAjZGVmaW5lIE1XSUZJRVhfRE1BX0FMSUdOX1NaCSAgICA2NAorI2RlZmluZSBNV0lGSUVYX1JYX0hFQURST09NCSAgICA2NAogI2RlZmluZSBNQVhfVFhQRF9TWgkJICAgIDMyCiAjZGVmaW5lIElOVEZfSERSX0FMSUdOCQkgICAgIDQKIApAQCAtODIsNiArODMsNyBAQAogI2RlZmluZSBNV0lGSUVYX0JVRl9GTEFHX1RETFNfUEtUCSAgIEJJVCgyKQogI2RlZmluZSBNV0lGSUVYX0JVRl9GTEFHX0VBUE9MX1RYX1NUQVRVUyAgIEJJVCgzKQogI2RlZmluZSBNV0lGSUVYX0JVRl9GTEFHX0FDVElPTl9UWF9TVEFUVVMgIEJJVCg0KQorI2RlZmluZSBNV0lGSUVYX0JVRl9GTEFHX0FHR1JfUEtUICAgICAgICAgIEJJVCg1KQogCiAjZGVmaW5lIE1XSUZJRVhfQlJJREdFRF9QS1RTX1RIUl9ISUdIICAgICAgMTAyNAogI2RlZmluZSBNV0lGSUVYX0JSSURHRURfUEtUU19USFJfTE9XICAgICAgICAxMjgKQEAgLTExMCw2ICsxMTIsMTEgQEAKIAogI2RlZmluZSBNV0lGSUVYX0FfQkFORF9TVEFSVF9GUkVRCTUwMDAKIAorLyogU0RJTyBBZ2dyIGRhdGEgcGFja2V0IHNwZWNpYWwgaW5mbyAqLworI2RlZmluZSBTRElPX01BWF9BR0dSX0JVRl9TSVpFCQkoMjU2ICogMjU1KQorI2RlZmluZSBCTE9DS19OVU1CRVJfT0ZGU0VUCQkxNQorI2RlZmluZSBTRElPX0hFQURFUl9PRkZTRVQJCTI4CisKIGVudW0gbXdpZmlleF9ic3NfdHlwZSB7CiAJTVdJRklFWF9CU1NfVFlQRV9TVEEgPSAwLAogCU1XSUZJRVhfQlNTX1RZUEVfVUFQID0gMSwKQEAgLTE2NywxMCArMTc0LDExIEBACiB9OwogCiBzdHJ1Y3QgbXdpZmlleF9yeGluZm8geworCXN0cnVjdCBza19idWZmICpwYXJlbnQ7CiAJdTggYnNzX251bTsKIAl1OCBic3NfdHlwZTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcGFyZW50OwogCXU4IHVzZV9jb3VudDsKKwl1OCBidWZfdHlwZTsKIH07CiAKIHN0cnVjdCBtd2lmaWV4X3R4aW5mbyB7CkBAIC0xNzgsNiArMTg2LDcgQEAKIAl1OCBmbGFnczsKIAl1OCBic3NfbnVtOwogCXU4IGJzc190eXBlOworCXU4IGFnZ3JfbnVtOwogCXUzMiBwa3RfbGVuOwogCXU4IGFja19mcmFtZV9pZDsKIAl1NjQgY29va2llOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9mdy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9mdy5oCmluZGV4IGRmNTUzZTguLjU5ZDg5NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZncuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2Z3LmgKQEAgLTE5Nyw2ICsxOTcsNyBAQAogCiAjZGVmaW5lIElTU1VQUF8xMU5FTkFCTEVEKEZ3Q2FwSW5mbykgKEZ3Q2FwSW5mbyAmIEJJVCgxMSkpCiAjZGVmaW5lIElTU1VQUF9URExTX0VOQUJMRUQoRndDYXBJbmZvKSAoRndDYXBJbmZvICYgQklUKDE0KSkKKyNkZWZpbmUgSVNTVVBQX1NESU9fU1BBX0VOQUJMRUQoRndDYXBJbmZvKSAoRndDYXBJbmZvICYgQklUKDE2KSkKIAogI2RlZmluZSBNV0lGSUVYX0RFRl9IVF9DQVAJKElFRUU4MDIxMV9IVF9DQVBfRFNTU0NDSzQwIHwgXAogCQkJCSAoMSA8PCBJRUVFODAyMTFfSFRfQ0FQX1JYX1NUQkNfU0hJRlQpIHwgXApAQCAtMzUzLDYgKzM1NCw3IEBACiAjZGVmaW5lIEhvc3RDbWRfQ01EX1JFTUFJTl9PTl9DSEFOICAgICAgICAgICAgICAgICAgICAweDAxMGQKICNkZWZpbmUgSG9zdENtZF9DTURfMTFBQ19DRkcJCQkgICAgICAweDAxMTIKICNkZWZpbmUgSG9zdENtZF9DTURfVERMU19PUEVSICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEyMgorI2RlZmluZSBIb3N0Q21kX0NNRF9TRElPX1NQX1JYX0FHR1JfQ0ZHICAgICAgICAgICAgICAgMHgwMjIzCiAKICNkZWZpbmUgUFJPVE9DT0xfTk9fU0VDVVJJVFkgICAgICAgIDB4MDEKICNkZWZpbmUgUFJPVE9DT0xfU1RBVElDX1dFUCAgICAgICAgIDB4MDIKQEAgLTUyMyw5ICs1MjUsMTEgQEAKICNkZWZpbmUgVFlQRV9PUgkJCQkoTUFYX09QRVJBTkQrNSkKICNkZWZpbmUgTUVGX01PREVfSE9TVF9TTEVFUAkJCTEKICNkZWZpbmUgTUVGX0FDVElPTl9BTExPV19BTkRfV0FLRVVQX0hPU1QJMworI2RlZmluZSBNRUZfQUNUSU9OX0FVVE9fQVJQICAgICAgICAgICAgICAgICAgICAweDEwCiAjZGVmaW5lIE1XSUZJRVhfQ1JJVEVSSUFfQlJPQURDQVNUCUJJVCgwKQogI2RlZmluZSBNV0lGSUVYX0NSSVRFUklBX1VOSUNBU1QJQklUKDEpCiAjZGVmaW5lIE1XSUZJRVhfQ1JJVEVSSUFfTVVMVElDQVNUCUJJVCgzKQorI2RlZmluZSBNV0lGSUVYX01BWF9TVVBQT1JURURfSVBBRERSICAgICAgICAgICAgICA0CiAKICNkZWZpbmUgQUNUX1RETFNfREVMRVRFICAgICAgICAgICAgMHgwMAogI2RlZmluZSBBQ1RfVERMU19DUkVBVEUgICAgICAgICAgICAweDAxCkBAIC0xMjQwLDYgKzEyNDQsMTIgQEAKIAl1OCB0bHZidWZbMF07CiB9IF9fcGFja2VkOwogCitzdHJ1Y3QgaG9zdF9jbWRfc2Rpb19zcF9yeF9hZ2dyX2NmZyB7CisJdTggYWN0aW9uOworCXU4IGVuYWJsZTsKKwlfX2xlMTYgYmxvY2tfc2l6ZTsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCBtd2lmaWV4X2ZpeGVkX2Jjbl9wYXJhbSB7CiAJX19sZTY0IHRpbWVzdGFtcDsKIAlfX2xlMTYgYmVhY29uX3BlcmlvZDsKQEAgLTE5NjIsNiArMTk3Miw3IEBACiAJCXN0cnVjdCBob3N0X2NtZF9kc19jb2FsZXNjZV9jZmcgY29hbGVzY2VfY2ZnOwogCQlzdHJ1Y3QgaG9zdF9jbWRfZHNfdGRsc19vcGVyIHRkbHNfb3BlcjsKIAkJc3RydWN0IGhvc3RfY21kX2RzX2NoYW5fcnB0X3JlcSBjaGFuX3JwdF9yZXE7CisJCXN0cnVjdCBob3N0X2NtZF9zZGlvX3NwX3J4X2FnZ3JfY2ZnIHNkaW9fcnhfYWdncl9jZmc7CiAJfSBwYXJhbXM7CiB9IF9fcGFja2VkOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvaW5pdC5jCmluZGV4IGI3N2JhNzQuLmUxMjE5MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvaW5pdC5jCkBAIC03Niw3ICs3Niw3IEBACiAJdTMyIGk7CiAKIAlwcml2LT5tZWRpYV9jb25uZWN0ZWQgPSBmYWxzZTsKLQltZW1zZXQocHJpdi0+Y3Vycl9hZGRyLCAweGZmLCBFVEhfQUxFTik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKHByaXYtPmN1cnJfYWRkcik7CiAKIAlwcml2LT5wa3RfdHhfY3RybCA9IDA7CiAJcHJpdi0+YnNzX21vZGUgPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDsKQEAgLTI2NiwxOCArMjY2LDE1IEBACiAKIAltd2lmaWV4X3dtbV9pbml0KGFkYXB0ZXIpOwogCi0JaWYgKGFkYXB0ZXItPnNsZWVwX2NmbSkgewotCQlzbGVlcF9jZm1fYnVmID0gKHN0cnVjdCBtd2lmaWV4X29wdF9zbGVlcF9jb25maXJtICopCi0JCQkJCQlhZGFwdGVyLT5zbGVlcF9jZm0tPmRhdGE7Ci0JCW1lbXNldChzbGVlcF9jZm1fYnVmLCAwLCBhZGFwdGVyLT5zbGVlcF9jZm0tPmxlbik7Ci0JCXNsZWVwX2NmbV9idWYtPmNvbW1hbmQgPQotCQkJCWNwdV90b19sZTE2KEhvc3RDbWRfQ01EXzgwMl8xMV9QU19NT0RFX0VOSCk7Ci0JCXNsZWVwX2NmbV9idWYtPnNpemUgPQotCQkJCWNwdV90b19sZTE2KGFkYXB0ZXItPnNsZWVwX2NmbS0+bGVuKTsKLQkJc2xlZXBfY2ZtX2J1Zi0+cmVzdWx0ID0gMDsKLQkJc2xlZXBfY2ZtX2J1Zi0+YWN0aW9uID0gY3B1X3RvX2xlMTYoU0xFRVBfQ09ORklSTSk7Ci0JCXNsZWVwX2NmbV9idWYtPnJlc3BfY3RybCA9IGNwdV90b19sZTE2KFJFU1BfTkVFREVEKTsKLQl9CisJc2xlZXBfY2ZtX2J1ZiA9IChzdHJ1Y3QgbXdpZmlleF9vcHRfc2xlZXBfY29uZmlybSAqKQorCQkJCQlhZGFwdGVyLT5zbGVlcF9jZm0tPmRhdGE7CisJbWVtc2V0KHNsZWVwX2NmbV9idWYsIDAsIGFkYXB0ZXItPnNsZWVwX2NmbS0+bGVuKTsKKwlzbGVlcF9jZm1fYnVmLT5jb21tYW5kID0gY3B1X3RvX2xlMTYoSG9zdENtZF9DTURfODAyXzExX1BTX01PREVfRU5IKTsKKwlzbGVlcF9jZm1fYnVmLT5zaXplID0gY3B1X3RvX2xlMTYoYWRhcHRlci0+c2xlZXBfY2ZtLT5sZW4pOworCXNsZWVwX2NmbV9idWYtPnJlc3VsdCA9IDA7CisJc2xlZXBfY2ZtX2J1Zi0+YWN0aW9uID0gY3B1X3RvX2xlMTYoU0xFRVBfQ09ORklSTSk7CisJc2xlZXBfY2ZtX2J1Zi0+cmVzcF9jdHJsID0gY3B1X3RvX2xlMTYoUkVTUF9ORUVERUQpOworCiAJbWVtc2V0KCZhZGFwdGVyLT5zbGVlcF9wYXJhbXMsIDAsIHNpemVvZihhZGFwdGVyLT5zbGVlcF9wYXJhbXMpKTsKIAltZW1zZXQoJmFkYXB0ZXItPnNsZWVwX3BlcmlvZCwgMCwgc2l6ZW9mKGFkYXB0ZXItPnNsZWVwX3BlcmlvZCkpOwogCWFkYXB0ZXItPnR4X2xvY2tfZmxhZyA9IGZhbHNlOwpAQCAtMjk2LDEwICsyOTMsOSBAQAogCW1lbXNldCgmYWRhcHRlci0+YXJwX2ZpbHRlciwgMCwgc2l6ZW9mKGFkYXB0ZXItPmFycF9maWx0ZXIpKTsKIAlhZGFwdGVyLT5hcnBfZmlsdGVyX3NpemUgPSAwOwogCWFkYXB0ZXItPm1heF9tZ210X2llX2luZGV4ID0gTUFYX01HTVRfSUVfSU5ERVg7Ci0JYWRhcHRlci0+ZXh0X3NjYW4gPSBmYWxzZTsKIAlhZGFwdGVyLT5rZXlfYXBpX21ham9yX3ZlciA9IDA7CiAJYWRhcHRlci0+a2V5X2FwaV9taW5vcl92ZXIgPSAwOwotCW1lbXNldChhZGFwdGVyLT5wZXJtX2FkZHIsIDB4ZmYsIEVUSF9BTEVOKTsKKwlldGhfYnJvYWRjYXN0X2FkZHIoYWRhcHRlci0+cGVybV9hZGRyKTsKIAlhZGFwdGVyLT5pZmFjZV9saW1pdC5zdGFfaW50ZiA9IE1XSUZJRVhfTUFYX1NUQV9OVU07CiAJYWRhcHRlci0+aWZhY2VfbGltaXQudWFwX2ludGYgPSBNV0lGSUVYX01BWF9VQVBfTlVNOwogCWFkYXB0ZXItPmlmYWNlX2xpbWl0LnAycF9pbnRmID0gTVdJRklFWF9NQVhfUDJQX05VTTsKQEAgLTQ4Miw2ICs0NzgsNyBAQAogCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5yeF9wcm9jX2xvY2spOwogCiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYWRhcHRlci0+cnhfZGF0YV9xKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZhZGFwdGVyLT50eF9kYXRhX3EpOwogCiAJZm9yIChpID0gMDsgaSA8IGFkYXB0ZXItPnByaXZfbnVtOyArK2kpIHsKIAkJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXItPmJzc19wcmlvX3RibFtpXS5ic3NfcHJpb19oZWFkKTsKQEAgLTY4OSw2ICs2ODYsMTAgQEAKIAkJfQogCX0KIAorCWF0b21pY19zZXQoJmFkYXB0ZXItPnR4X3F1ZXVlZCwgMCk7CisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmYWRhcHRlci0+dHhfZGF0YV9xKSkpCisJCW13aWZpZXhfd3JpdGVfZGF0YV9jb21wbGV0ZShhZGFwdGVyLCBza2IsIDAsIDApOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnJ4X3Byb2NfbG9jaywgZmxhZ3MpOwogCiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmYWRhcHRlci0+cnhfZGF0YV9xKSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9tYWluLmMKaW5kZXggN2U3NGI0Zi4uMDNhOTVjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9tYWluLmMKQEAgLTEzMSwxMCArMTMxLDM5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgbXdpZmlleF9xdWV1ZV9tYWluX3dvcmsoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPm1haW5fcHJvY19sb2NrLCBmbGFncyk7CisJaWYgKGFkYXB0ZXItPm13aWZpZXhfcHJvY2Vzc2luZykgeworCQlhZGFwdGVyLT5tb3JlX3Rhc2tfZmxhZyA9IHRydWU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPm1haW5fcHJvY19sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bWFpbl9wcm9jX2xvY2ssIGZsYWdzKTsKKwkJcXVldWVfd29yayhhZGFwdGVyLT53b3JrcXVldWUsICZhZGFwdGVyLT5tYWluX3dvcmspOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKG13aWZpZXhfcXVldWVfbWFpbl93b3JrKTsKKworc3RhdGljIHZvaWQgbXdpZmlleF9xdWV1ZV9yeF93b3JrKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5yeF9wcm9jX2xvY2ssIGZsYWdzKTsKKwlpZiAoYWRhcHRlci0+cnhfcHJvY2Vzc2luZykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5yeF9wcm9jX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5yeF9wcm9jX2xvY2ssIGZsYWdzKTsKKwkJcXVldWVfd29yayhhZGFwdGVyLT5yeF93b3JrcXVldWUsICZhZGFwdGVyLT5yeF93b3JrKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgbXdpZmlleF9wcm9jZXNzX3J4KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBtd2lmaWV4X3J4aW5mbyAqcnhfaW5mbzsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5yeF9wcm9jX2xvY2ssIGZsYWdzKTsKIAlpZiAoYWRhcHRlci0+cnhfcHJvY2Vzc2luZyB8fCBhZGFwdGVyLT5yeF9sb2NrZWQpIHsKQEAgLTE1NCw5ICsxODMsMTYgQEAKIAkJCWlmIChhZGFwdGVyLT5pZl9vcHMuc3VibWl0X3JlbV9yeF91cmJzKQogCQkJCWFkYXB0ZXItPmlmX29wcy5zdWJtaXRfcmVtX3J4X3VyYnMoYWRhcHRlcik7CiAJCQlhZGFwdGVyLT5kZWxheV9tYWluX3dvcmsgPSBmYWxzZTsKLQkJCXF1ZXVlX3dvcmsoYWRhcHRlci0+d29ya3F1ZXVlLCAmYWRhcHRlci0+bWFpbl93b3JrKTsKKwkJCW13aWZpZXhfcXVldWVfbWFpbl93b3JrKGFkYXB0ZXIpOwogCQl9Ci0JCW13aWZpZXhfaGFuZGxlX3J4X3BhY2tldChhZGFwdGVyLCBza2IpOworCQlyeF9pbmZvID0gTVdJRklFWF9TS0JfUlhDQihza2IpOworCQlpZiAocnhfaW5mby0+YnVmX3R5cGUgPT0gTVdJRklFWF9UWVBFX0FHR1JfREFUQSkgeworCQkJaWYgKGFkYXB0ZXItPmlmX29wcy5kZWFnZ3JfcGt0KQorCQkJCWFkYXB0ZXItPmlmX29wcy5kZWFnZ3JfcGt0KGFkYXB0ZXIsIHNrYik7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQl9IGVsc2UgeworCQkJbXdpZmlleF9oYW5kbGVfcnhfcGFja2V0KGFkYXB0ZXIsIHNrYik7CisJCX0KIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnJ4X3Byb2NfbG9jaywgZmxhZ3MpOwogCWFkYXB0ZXItPnJ4X3Byb2Nlc3NpbmcgPSBmYWxzZTsKQEAgLTE4OSwxNSArMjI1LDE3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPm1haW5fcHJvY19sb2NrLCBmbGFncyk7CiAKIAkvKiBDaGVjayBpZiBhbHJlYWR5IHByb2Nlc3NpbmcgKi8KLQlpZiAoYWRhcHRlci0+bXdpZmlleF9wcm9jZXNzaW5nKSB7CisJaWYgKGFkYXB0ZXItPm13aWZpZXhfcHJvY2Vzc2luZyB8fCBhZGFwdGVyLT5tYWluX2xvY2tlZCkgeworCQlhZGFwdGVyLT5tb3JlX3Rhc2tfZmxhZyA9IHRydWU7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPm1haW5fcHJvY19sb2NrLCBmbGFncyk7CiAJCWdvdG8gZXhpdF9tYWluX3Byb2M7CiAJfSBlbHNlIHsKIAkJYWRhcHRlci0+bXdpZmlleF9wcm9jZXNzaW5nID0gdHJ1ZTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bWFpbl9wcm9jX2xvY2ssIGZsYWdzKTsKIAl9CiBwcm9jZXNzX3N0YXJ0OgogCWRvIHsKKwkJYWRhcHRlci0+bW9yZV90YXNrX2ZsYWcgPSBmYWxzZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+bWFpbl9wcm9jX2xvY2ssIGZsYWdzKTsKIAkJaWYgKChhZGFwdGVyLT5od19zdGF0dXMgPT0gTVdJRklFWF9IV19TVEFUVVNfQ0xPU0lORykgfHwKIAkJICAgIChhZGFwdGVyLT5od19zdGF0dXMgPT0gTVdJRklFWF9IV19TVEFUVVNfTk9UX1JFQURZKSkKIAkJCWJyZWFrOwpAQCAtMjEyLDkgKzI1MCw3IEBACiAJCWlmIChhdG9taWNfcmVhZCgmYWRhcHRlci0+cnhfcGVuZGluZykgPj0gSElHSF9SWF9QRU5ESU5HICYmCiAJCSAgICBhZGFwdGVyLT5pZmFjZV90eXBlICE9IE1XSUZJRVhfVVNCKSB7CiAJCQlhZGFwdGVyLT5kZWxheV9tYWluX3dvcmsgPSB0cnVlOwotCQkJaWYgKCFhZGFwdGVyLT5yeF9wcm9jZXNzaW5nKQotCQkJCXF1ZXVlX3dvcmsoYWRhcHRlci0+cnhfd29ya3F1ZXVlLAotCQkJCQkgICAmYWRhcHRlci0+cnhfd29yayk7CisJCQltd2lmaWV4X3F1ZXVlX3J4X3dvcmsoYWRhcHRlcik7CiAJCQlicmVhazsKIAkJfQogCkBAIC0yMjcsMjQgKzI2MywyNiBAQAogCQl9CiAKIAkJaWYgKGFkYXB0ZXItPnJ4X3dvcmtfZW5hYmxlZCAmJiBhZGFwdGVyLT5kYXRhX3JlY2VpdmVkKQotCQkJcXVldWVfd29yayhhZGFwdGVyLT5yeF93b3JrcXVldWUsICZhZGFwdGVyLT5yeF93b3JrKTsKKwkJCW13aWZpZXhfcXVldWVfcnhfd29yayhhZGFwdGVyKTsKIAogCQkvKiBOZWVkIHRvIHdha2UgdXAgdGhlIGNhcmQgPyAqLwogCQlpZiAoKGFkYXB0ZXItPnBzX3N0YXRlID09IFBTX1NUQVRFX1NMRUVQKSAmJgogCQkgICAgKGFkYXB0ZXItPnBtX3dha2V1cF9jYXJkX3JlcSAmJgogCQkgICAgICFhZGFwdGVyLT5wbV93YWtldXBfZndfdHJ5KSAmJgogCQkgICAgKGlzX2NvbW1hbmRfcGVuZGluZyhhZGFwdGVyKSB8fAorCQkgICAgICFza2JfcXVldWVfZW1wdHkoJmFkYXB0ZXItPnR4X2RhdGFfcSkgfHwKIAkJICAgICAhbXdpZmlleF93bW1fbGlzdHNfZW1wdHkoYWRhcHRlcikpKSB7CiAJCQlhZGFwdGVyLT5wbV93YWtldXBfZndfdHJ5ID0gdHJ1ZTsKIAkJCW1vZF90aW1lcigmYWRhcHRlci0+d2FrZXVwX3RpbWVyLCBqaWZmaWVzICsgKEhaKjMpKTsKIAkJCWFkYXB0ZXItPmlmX29wcy53YWtldXAoYWRhcHRlcik7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bWFpbl9wcm9jX2xvY2ssIGZsYWdzKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJaWYgKElTX0NBUkRfUlhfUkNWRChhZGFwdGVyKSkgewogCQkJYWRhcHRlci0+ZGF0YV9yZWNlaXZlZCA9IGZhbHNlOwogCQkJYWRhcHRlci0+cG1fd2FrZXVwX2Z3X3RyeSA9IGZhbHNlOwotCQkJZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPndha2V1cF90aW1lcik7CisJCQlkZWxfdGltZXIoJmFkYXB0ZXItPndha2V1cF90aW1lcik7CiAJCQlpZiAoYWRhcHRlci0+cHNfc3RhdGUgPT0gUFNfU1RBVEVfU0xFRVApCiAJCQkJYWRhcHRlci0+cHNfc3RhdGUgPSBQU19TVEFURV9BV0FLRTsKIAkJfSBlbHNlIHsKQEAgLTI1Nyw3ICsyOTUsOCBAQAogCiAJCQlpZiAoKCFhZGFwdGVyLT5zY2FuX2NoYW5fZ2FwX2VuYWJsZWQgJiYKIAkJCSAgICAgYWRhcHRlci0+c2Nhbl9wcm9jZXNzaW5nKSB8fCBhZGFwdGVyLT5kYXRhX3NlbnQgfHwKLQkJCSAgICBtd2lmaWV4X3dtbV9saXN0c19lbXB0eShhZGFwdGVyKSkgeworCQkJICAgIChtd2lmaWV4X3dtbV9saXN0c19lbXB0eShhZGFwdGVyKSAmJgorCQkJICAgICBza2JfcXVldWVfZW1wdHkoJmFkYXB0ZXItPnR4X2RhdGFfcSkpKSB7CiAJCQkJaWYgKGFkYXB0ZXItPmNtZF9zZW50IHx8IGFkYXB0ZXItPmN1cnJfY21kIHx8CiAJCQkJICAgICghaXNfY29tbWFuZF9wZW5kaW5nKGFkYXB0ZXIpKSkKIAkJCQkJYnJlYWs7CkBAIC0yOTUsOCArMzM0LDEwIEBACiAJCWlmICgoYWRhcHRlci0+cHNfc3RhdGUgPT0gUFNfU1RBVEVfU0xFRVApIHx8CiAJCSAgICAoYWRhcHRlci0+cHNfc3RhdGUgPT0gUFNfU1RBVEVfUFJFX1NMRUVQKSB8fAogCQkgICAgKGFkYXB0ZXItPnBzX3N0YXRlID09IFBTX1NUQVRFX1NMRUVQX0NGTSkgfHwKLQkJICAgIGFkYXB0ZXItPnR4X2xvY2tfZmxhZykKKwkJICAgIGFkYXB0ZXItPnR4X2xvY2tfZmxhZyl7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRhcHRlci0+bWFpbl9wcm9jX2xvY2ssIGZsYWdzKTsKIAkJCWNvbnRpbnVlOworCQl9CiAKIAkJaWYgKCFhZGFwdGVyLT5jbWRfc2VudCAmJiAhYWRhcHRlci0+Y3Vycl9jbWQpIHsKIAkJCWlmIChtd2lmaWV4X2V4ZWNfbmV4dF9jbWQoYWRhcHRlcikgPT0gLTEpIHsKQEAgLTMwNyw2ICszNDgsMjAgQEAKIAogCQlpZiAoKGFkYXB0ZXItPnNjYW5fY2hhbl9nYXBfZW5hYmxlZCB8fAogCQkgICAgICFhZGFwdGVyLT5zY2FuX3Byb2Nlc3NpbmcpICYmCisJCSAgICAhYWRhcHRlci0+ZGF0YV9zZW50ICYmCisJCSAgICAhc2tiX3F1ZXVlX2VtcHR5KCZhZGFwdGVyLT50eF9kYXRhX3EpKSB7CisJCQltd2lmaWV4X3Byb2Nlc3NfdHhfcXVldWUoYWRhcHRlcik7CisJCQlpZiAoYWRhcHRlci0+aHNfYWN0aXZhdGVkKSB7CisJCQkJYWRhcHRlci0+aXNfaHNfY29uZmlndXJlZCA9IGZhbHNlOworCQkJCW13aWZpZXhfaHNfYWN0aXZhdGVkX2V2ZW50CisJCQkJCShtd2lmaWV4X2dldF9wcml2CisJCQkJCShhZGFwdGVyLCBNV0lGSUVYX0JTU19ST0xFX0FOWSksCisJCQkJCWZhbHNlKTsKKwkJCX0KKwkJfQorCisJCWlmICgoYWRhcHRlci0+c2Nhbl9jaGFuX2dhcF9lbmFibGVkIHx8CisJCSAgICAgIWFkYXB0ZXItPnNjYW5fcHJvY2Vzc2luZykgJiYKIAkJICAgICFhZGFwdGVyLT5kYXRhX3NlbnQgJiYgIW13aWZpZXhfd21tX2xpc3RzX2VtcHR5KGFkYXB0ZXIpKSB7CiAJCQltd2lmaWV4X3dtbV9wcm9jZXNzX3R4KGFkYXB0ZXIpOwogCQkJaWYgKGFkYXB0ZXItPmhzX2FjdGl2YXRlZCkgewpAQCAtMzIwLDcgKzM3NSw4IEBACiAKIAkJaWYgKGFkYXB0ZXItPmRlbGF5X251bGxfcGt0ICYmICFhZGFwdGVyLT5jbWRfc2VudCAmJgogCQkgICAgIWFkYXB0ZXItPmN1cnJfY21kICYmICFpc19jb21tYW5kX3BlbmRpbmcoYWRhcHRlcikgJiYKLQkJICAgIG13aWZpZXhfd21tX2xpc3RzX2VtcHR5KGFkYXB0ZXIpKSB7CisJCSAgICAobXdpZmlleF93bW1fbGlzdHNfZW1wdHkoYWRhcHRlcikgJiYKKwkJICAgICBza2JfcXVldWVfZW1wdHkoJmFkYXB0ZXItPnR4X2RhdGFfcSkpKSB7CiAJCQlpZiAoIW13aWZpZXhfc2VuZF9udWxsX3BhY2tldAogCQkJICAgIChtd2lmaWV4X2dldF9wcml2KGFkYXB0ZXIsIE1XSUZJRVhfQlNTX1JPTEVfU1RBKSwKIAkJCSAgICAgTVdJRklFWF9UeFBEX1BPV0VSX01HTVRfTlVMTF9QQUNLRVQgfApAQCAtMzMwLDE1ICszODYsMTIgQEAKIAkJCX0KIAkJCWJyZWFrOwogCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5tYWluX3Byb2NfbG9jaywgZmxhZ3MpOwogCX0gd2hpbGUgKHRydWUpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPm1haW5fcHJvY19sb2NrLCBmbGFncyk7Ci0JaWYgKCFhZGFwdGVyLT5kZWxheV9tYWluX3dvcmsgJiYKLQkgICAgKGFkYXB0ZXItPmludF9zdGF0dXMgfHwgSVNfQ0FSRF9SWF9SQ1ZEKGFkYXB0ZXIpKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5tYWluX3Byb2NfbG9jaywgZmxhZ3MpOworCWlmIChhZGFwdGVyLT5tb3JlX3Rhc2tfZmxhZykKIAkJZ290byBwcm9jZXNzX3N0YXJ0OwotCX0KLQogCWFkYXB0ZXItPm13aWZpZXhfcHJvY2Vzc2luZyA9IGZhbHNlOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPm1haW5fcHJvY19sb2NrLCBmbGFncyk7CiAKQEAgLTQ2Niw3ICs1MTksNyBAQAogCiAJcnRubF9sb2NrKCk7CiAJLyogQ3JlYXRlIHN0YXRpb24gaW50ZXJmYWNlIGJ5IGRlZmF1bHQgKi8KLQl3ZGV2ID0gbXdpZmlleF9hZGRfdmlydHVhbF9pbnRmKGFkYXB0ZXItPndpcGh5LCAibWxhbiVkIiwKKwl3ZGV2ID0gbXdpZmlleF9hZGRfdmlydHVhbF9pbnRmKGFkYXB0ZXItPndpcGh5LCAibWxhbiVkIiwgTkVUX05BTUVfRU5VTSwKIAkJCQkJTkw4MDIxMV9JRlRZUEVfU1RBVElPTiwgTlVMTCwgTlVMTCk7CiAJaWYgKElTX0VSUih3ZGV2KSkgewogCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgImNhbm5vdCBjcmVhdGUgZGVmYXVsdCBTVEEgaW50ZXJmYWNlXG4iKTsKQEAgLTQ3NSw3ICs1MjgsNyBAQAogCX0KIAogCWlmIChkcml2ZXJfbW9kZSAmIE1XSUZJRVhfRFJJVkVSX01PREVfVUFQKSB7Ci0JCXdkZXYgPSBtd2lmaWV4X2FkZF92aXJ0dWFsX2ludGYoYWRhcHRlci0+d2lwaHksICJ1YXAlZCIsCisJCXdkZXYgPSBtd2lmaWV4X2FkZF92aXJ0dWFsX2ludGYoYWRhcHRlci0+d2lwaHksICJ1YXAlZCIsIE5FVF9OQU1FX0VOVU0sCiAJCQkJCQlOTDgwMjExX0lGVFlQRV9BUCwgTlVMTCwgTlVMTCk7CiAJCWlmIChJU19FUlIod2RldikpIHsKIAkJCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAiY2Fubm90IGNyZWF0ZSBBUCBpbnRlcmZhY2VcbiIpOwpAQCAtNDg1LDcgKzUzOCw3IEBACiAJfQogCiAJaWYgKGRyaXZlcl9tb2RlICYgTVdJRklFWF9EUklWRVJfTU9ERV9QMlApIHsKLQkJd2RldiA9IG13aWZpZXhfYWRkX3ZpcnR1YWxfaW50ZihhZGFwdGVyLT53aXBoeSwgInAycCVkIiwKKwkJd2RldiA9IG13aWZpZXhfYWRkX3ZpcnR1YWxfaW50ZihhZGFwdGVyLT53aXBoeSwgInAycCVkIiwgTkVUX05BTUVfRU5VTSwKIAkJCQkJCU5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQsIE5VTEwsCiAJCQkJCQlOVUxMKTsKIAkJaWYgKElTX0VSUih3ZGV2KSkgewpAQCAtNjA0LDcgKzY1Nyw3IEBACiAJYXRvbWljX2luYygmcHJpdi0+YWRhcHRlci0+dHhfcGVuZGluZyk7CiAJbXdpZmlleF93bW1fYWRkX2J1Zl90eHF1ZXVlKHByaXYsIHNrYik7CiAKLQlxdWV1ZV93b3JrKHByaXYtPmFkYXB0ZXItPndvcmtxdWV1ZSwgJnByaXYtPmFkYXB0ZXItPm1haW5fd29yayk7CisJbXdpZmlleF9xdWV1ZV9tYWluX3dvcmsocHJpdi0+YWRhcHRlcik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwOTYsOSArMTE0OSw2IEBACiAJCUlOSVRfV09SSygmYWRhcHRlci0+cnhfd29yaywgbXdpZmlleF9yeF93b3JrX3F1ZXVlKTsKIAl9CiAKLQlpZiAoYWRhcHRlci0+aWZfb3BzLmlmYWNlX3dvcmspCi0JCUlOSVRfV09SSygmYWRhcHRlci0+aWZhY2Vfd29yaywgYWRhcHRlci0+aWZfb3BzLmlmYWNlX3dvcmspOwotCiAJLyogUmVnaXN0ZXIgdGhlIGRldmljZS4gRmlsbCB1cCB0aGUgcHJpdmF0ZSBkYXRhIHN0cnVjdHVyZSB3aXRoIHJlbGV2YW50CiAJICAgaW5mb3JtYXRpb24gZnJvbSB0aGUgY2FyZC4gKi8KIAlpZiAoYWRhcHRlci0+aWZfb3BzLnJlZ2lzdGVyX2RldihhZGFwdGVyKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9tYWluLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uaAppbmRleCBmMGE2YWYxLi5mZTEyNTYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uaApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CiAKICNpbmNsdWRlICJkZWNsLmgiCiAjaW5jbHVkZSAiaW9jdGwuaCIKQEAgLTU4LDYgKzU5LDggQEAKIAogI2RlZmluZSBNV0lGSUVYX01BWF9BUAkJCQk2NAogCisjZGVmaW5lIE1XSUZJRVhfTUFYX1BLVFNfVFhRCQkJMTYKKwogI2RlZmluZSBNV0lGSUVYX0RFRkFVTFRfV0FUQ0hET0dfVElNRU9VVAkoNSAqIEhaKQogCiAjZGVmaW5lIE1XSUZJRVhfVElNRVJfMTBTCQkJMTAwMDAKQEAgLTExOCw2ICsxMjEsNyBAQAogCiAjZGVmaW5lIE1XSUZJRVhfVFlQRV9DTUQJCQkJMQogI2RlZmluZSBNV0lGSUVYX1RZUEVfREFUQQkJCQkwCisjZGVmaW5lIE1XSUZJRVhfVFlQRV9BR0dSX0RBVEEJCQkJMTAKICNkZWZpbmUgTVdJRklFWF9UWVBFX0VWRU5UCQkJCTMKIAogI2RlZmluZSBNQVhfQklUTUFQX1JBVEVTX1NJWkUJCQkxOApAQCAtMTQwLDYgKzE0NCw5IEBACiAKICNkZWZpbmUgTVdJRklFWF9EUlZfSU5GT19TSVpFX01BWCAweDQwMDAwCiAKKy8qIEFkZHJlc3MgYWxpZ25tZW50ICovCisjZGVmaW5lIE1XSUZJRVhfQUxJR05fQUREUihwLCBhKSAoKChsb25nKShwKSArIChhKSAtIDEpICYgfigoYSkgLSAxKSkKKwogc3RydWN0IG13aWZpZXhfZGJnIHsKIAl1MzIgbnVtX2NtZF9ob3N0X3RvX2NhcmRfZmFpbHVyZTsKIAl1MzIgbnVtX2NtZF9zbGVlcF9jZm1faG9zdF90b19jYXJkX2ZhaWx1cmU7CkBAIC0yMDcsNiArMjE0LDEyIEBACiAJdTggYW1zZHU7CiB9OwogCitlbnVtIG13aWZpZXhfYmFfc3RhdHVzIHsKKwlCQV9TRVRVUF9OT05FID0gMCwKKwlCQV9TRVRVUF9JTlBST0dSRVNTLAorCUJBX1NFVFVQX0NPTVBMRVRFCit9OworCiBzdHJ1Y3QgbXdpZmlleF9yYV9saXN0X3RibCB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogCXN0cnVjdCBza19idWZmX2hlYWQgc2tiX2hlYWQ7CkBAIC0yMTUsNiArMjI4LDggQEAKIAl1MTYgbWF4X2Ftc2R1OwogCXUxNiBiYV9wa3RfY291bnQ7CiAJdTggYmFfcGFja2V0X3RocjsKKwllbnVtIG13aWZpZXhfYmFfc3RhdHVzIGJhX3N0YXR1czsKKwl1OCBhbXNkdV9pbl9hbXBkdTsKIAl1MTYgdG90YWxfcGt0X2NvdW50OwogCWJvb2wgdGRsc19saW5rOwogfTsKQEAgLTU5OCwxMSArNjEzLDYgQEAKIAlzdHJ1Y3QgbXdpZmlleF8xMWhfaW50Zl9zdGF0ZSBzdGF0ZV8xMWg7CiB9OwogCi1lbnVtIG13aWZpZXhfYmFfc3RhdHVzIHsKLQlCQV9TRVRVUF9OT05FID0gMCwKLQlCQV9TRVRVUF9JTlBST0dSRVNTLAotCUJBX1NFVFVQX0NPTVBMRVRFCi19OwogCiBzdHJ1Y3QgbXdpZmlleF90eF9iYV9zdHJlYW1fdGJsIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC03MzUsNiArNzQ1LDcgQEAKIAlpbnQgKCpjbGVhbl9wY2llX3JpbmcpIChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKTsKIAl2b2lkICgqaWZhY2Vfd29yaykoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAl2b2lkICgqc3VibWl0X3JlbV9yeF91cmJzKShzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKTsKKwl2b2lkICgqZGVhZ2dyX3BrdCkoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKIH07CiAKIHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgewpAQCAtNzY4LDE0ICs3NzksMTggQEAKIAlib29sIHJ4X3Byb2Nlc3Npbmc7CiAJYm9vbCBkZWxheV9tYWluX3dvcms7CiAJYm9vbCByeF9sb2NrZWQ7CisJYm9vbCBtYWluX2xvY2tlZDsKIAlzdHJ1Y3QgbXdpZmlleF9ic3NfcHJpb190YmwgYnNzX3ByaW9fdGJsW01XSUZJRVhfTUFYX0JTU19OVU1dOwogCS8qIHNwaW4gbG9jayBmb3IgaW5pdC9zaHV0ZG93biAqLwogCXNwaW5sb2NrX3QgbXdpZmlleF9sb2NrOwogCS8qIHNwaW4gbG9jayBmb3IgbWFpbiBwcm9jZXNzICovCiAJc3BpbmxvY2tfdCBtYWluX3Byb2NfbG9jazsKIAl1MzIgbXdpZmlleF9wcm9jZXNzaW5nOworCXU4IG1vcmVfdGFza19mbGFnOwogCXUxNiB0eF9idWZfc2l6ZTsKIAl1MTYgY3Vycl90eF9idWZfc2l6ZTsKKwlib29sIHNkaW9fcnhfYWdncl9lbmFibGU7CisJdTE2IHNkaW9fcnhfYmxvY2tfc2l6ZTsKIAl1MzIgaW9wb3J0OwogCWVudW0gTVdJRklFWF9IQVJEV0FSRV9TVEFUVVMgaHdfc3RhdHVzOwogCXUxNiBudW1iZXJfb2ZfYW50ZW5uYTsKQEAgLTgxMCw2ICs4MjUsOCBAQAogCXNwaW5sb2NrX3Qgc2Nhbl9wZW5kaW5nX3FfbG9jazsKIAkvKiBzcGluIGxvY2sgZm9yIFJYIHByb2Nlc3Npbmcgcm91dGluZSAqLwogCXNwaW5sb2NrX3QgcnhfcHJvY19sb2NrOworCXN0cnVjdCBza19idWZmX2hlYWQgdHhfZGF0YV9xOworCWF0b21pY190IHR4X3F1ZXVlZDsKIAl1MzIgc2Nhbl9wcm9jZXNzaW5nOwogCXUxNiByZWdpb25fY29kZTsKIAlzdHJ1Y3QgbXdpZmlleF84MDJfMTFkX2RvbWFpbl9yZWcgZG9tYWluX3JlZzsKQEAgLTg4MSw4ICs4OTgsNiBAQAogCWJvb2wgZXh0X3NjYW47CiAJdTggZndfYXBpX3ZlcjsKIAl1OCBrZXlfYXBpX21ham9yX3Zlciwga2V5X2FwaV9taW5vcl92ZXI7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IGlmYWNlX3dvcms7Ci0JdW5zaWduZWQgbG9uZyBpZmFjZV93b3JrX2ZsYWdzOwogCXN0cnVjdCBtZW1vcnlfdHlwZV9tYXBwaW5nICptZW1fdHlwZV9tYXBwaW5nX3RibDsKIAl1OCBudW1fbWVtX3R5cGVzOwogCXU4IGN1cnJfbWVtX2lkeDsKQEAgLTg5Niw2ICs5MTEsOCBAQAogCWJvb2wgYXV0b190ZGxzOwogfTsKIAordm9pZCBtd2lmaWV4X3Byb2Nlc3NfdHhfcXVldWUoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcik7CisKIGludCBtd2lmaWV4X2luaXRfbG9ja19saXN0KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogCiB2b2lkIG13aWZpZXhfc2V0X3RyYW5zX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtMTMxOCw2ICsxMzM1LDcgQEAKIAogc3RydWN0IHdpcmVsZXNzX2RldiAqbXdpZmlleF9hZGRfdmlydHVhbF9pbnRmKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkJCSAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgbmFtZV9hc3NpZ25fdHlwZSwKIAkJCQkJICAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAogCQkJCQkgICAgICB1MzIgKmZsYWdzLAogCQkJCQkgICAgICBzdHJ1Y3QgdmlmX3BhcmFtcyAqcGFyYW1zKTsKQEAgLTE0MTcsNiArMTQzNSw4IEBACiAJCQkgICAgdTggcnhfcmF0ZSwgdTggaHRfaW5mbyk7CiAKIHZvaWQgbXdpZmlleF9kdW1wX2Rydl9pbmZvKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpOwordm9pZCAqbXdpZmlleF9hbGxvY19kbWFfYWxpZ25fYnVmKGludCByeF9sZW4sIGdmcF90IGZsYWdzKTsKK3ZvaWQgbXdpZmlleF9xdWV1ZV9tYWluX3dvcmsoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcik7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIHZvaWQgbXdpZmlleF9kZWJ1Z2ZzX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3BjaWUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvcGNpZS5jCmluZGV4IGE1ODI4ZGEuLmJjYzc3NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvcGNpZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvcGNpZS5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAkJY2FyZC0+cGNpZS5yZWcgPSBkYXRhLT5yZWc7CiAJCWNhcmQtPnBjaWUuYmxrc3pfZndfZGwgPSBkYXRhLT5ibGtzel9md19kbDsKIAkJY2FyZC0+cGNpZS50eF9idWZfc2l6ZSA9IGRhdGEtPnR4X2J1Zl9zaXplOwotCQljYXJkLT5wY2llLnN1cHBvcnRzX2Z3X2R1bXAgPSBkYXRhLT5zdXBwb3J0c19md19kdW1wOworCQljYXJkLT5wY2llLmNhbl9kdW1wX2Z3ID0gZGF0YS0+Y2FuX2R1bXBfZnc7CiAJCWNhcmQtPnBjaWUuY2FuX2V4dF9zY2FuID0gZGF0YS0+Y2FuX2V4dF9zY2FuOwogCX0KIApAQCAtMjM0LDggKzIzNCw2IEBACiAJaWYgKCFhZGFwdGVyIHx8ICFhZGFwdGVyLT5wcml2X251bSkKIAkJcmV0dXJuOwogCi0JY2FuY2VsX3dvcmtfc3luYygmYWRhcHRlci0+aWZhY2Vfd29yayk7Ci0KIAlpZiAodXNlcl9ybW1vZCkgewogI2lmZGVmIENPTkZJR19QTV9TTEVFUAogCQlpZiAoYWRhcHRlci0+aXNfc3VzcGVuZGVkKQpAQCAtNDk4LDcgKzQ5Niw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTVdJRklFWF9NQVhfVFhSWF9CRDsgaSsrKSB7CiAJCS8qIEFsbG9jYXRlIHNrYiBoZXJlIHNvIHRoYXQgZmlybXdhcmUgY2FuIERNQSBkYXRhIGZyb20gaXQgKi8KLQkJc2tiID0gZGV2X2FsbG9jX3NrYihNV0lGSUVYX1JYX0RBVEFfQlVGX1NJWkUpOworCQlza2IgPSBtd2lmaWV4X2FsbG9jX2RtYV9hbGlnbl9idWYoTVdJRklFWF9SWF9EQVRBX0JVRl9TSVpFLAorCQkJCQkJICBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CiAJCWlmICghc2tiKSB7CiAJCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwKIAkJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIHNrYiBmb3IgUlggcmluZy5cbiIpOwpAQCAtMTI5Nyw3ICsxMjk2LDggQEAKIAkJCX0KIAkJfQogCi0JCXNrYl90bXAgPSBkZXZfYWxsb2Nfc2tiKE1XSUZJRVhfUlhfREFUQV9CVUZfU0laRSk7CisJCXNrYl90bXAgPSBtd2lmaWV4X2FsbG9jX2RtYV9hbGlnbl9idWYoTVdJRklFWF9SWF9EQVRBX0JVRl9TSVpFLAorCQkJCQkJICAgICAgR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOwogCQlpZiAoIXNrYl90bXApIHsKIAkJCWRldl9lcnIoYWRhcHRlci0+ZGV2LAogCQkJCSJVbmFibGUgdG8gYWxsb2NhdGUgc2tiLlxuIik7CkBAIC0yMDk5LDcgKzIwOTksNyBAQAogCQlnb3RvIGV4aXQ7CiAKIAltd2lmaWV4X2ludGVycnVwdF9zdGF0dXMoYWRhcHRlcik7Ci0JcXVldWVfd29yayhhZGFwdGVyLT53b3JrcXVldWUsICZhZGFwdGVyLT5tYWluX3dvcmspOworCW13aWZpZXhfcXVldWVfbWFpbl93b3JrKGFkYXB0ZXIpOwogCiBleGl0OgogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTIyNzEsNyArMjI3MSw3IEBACiAJaW50IHJldDsKIAlzdGF0aWMgY2hhciAqZW52W10gPSB7ICJEUklWRVI9bXdpZmlleF9wY2llIiwgIkVWRU5UPWZ3X2R1bXAiLCBOVUxMIH07CiAKLQlpZiAoIWNhcmQtPnBjaWUuc3VwcG9ydHNfZndfZHVtcCkKKwlpZiAoIWNhcmQtPnBjaWUuY2FuX2R1bXBfZncpCiAJCXJldHVybjsKIAogCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShtZW1fdHlwZV9tYXBwaW5nX3RibCk7IGlkeCsrKSB7CkBAIC0yMzcxLDI1ICsyMzcxLDI2IEBACiAJYWRhcHRlci0+Y3Vycl9tZW1faWR4ID0gMDsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgaWZhY2Vfd29ya19mbGFnczsKK3N0YXRpYyBzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICpzYXZlX2FkYXB0ZXI7CiBzdGF0aWMgdm9pZCBtd2lmaWV4X3BjaWVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9Ci0JCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG13aWZpZXhfYWRhcHRlciwgaWZhY2Vfd29yayk7Ci0KIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE1XSUZJRVhfSUZBQ0VfV09SS19GV19EVU1QLAotCQkJICAgICAgICZhZGFwdGVyLT5pZmFjZV93b3JrX2ZsYWdzKSkKLQkJbXdpZmlleF9wY2llX2Z3X2R1bXBfd29yayhhZGFwdGVyKTsKKwkJCSAgICAgICAmaWZhY2Vfd29ya19mbGFncykpCisJCW13aWZpZXhfcGNpZV9md19kdW1wX3dvcmsoc2F2ZV9hZGFwdGVyKTsKIH0KIAorc3RhdGljIERFQ0xBUkVfV09SSyhwY2llX3dvcmssIG13aWZpZXhfcGNpZV93b3JrKTsKIC8qIFRoaXMgZnVuY3Rpb24gZHVtcHMgRlcgaW5mb3JtYXRpb24gKi8KIHN0YXRpYyB2b2lkIG13aWZpZXhfcGNpZV9md19kdW1wKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaWYgKHRlc3RfYml0KE1XSUZJRVhfSUZBQ0VfV09SS19GV19EVU1QLCAmYWRhcHRlci0+aWZhY2Vfd29ya19mbGFncykpCisJc2F2ZV9hZGFwdGVyID0gYWRhcHRlcjsKKwlpZiAodGVzdF9iaXQoTVdJRklFWF9JRkFDRV9XT1JLX0ZXX0RVTVAsICZpZmFjZV93b3JrX2ZsYWdzKSkKIAkJcmV0dXJuOwogCi0Jc2V0X2JpdChNV0lGSUVYX0lGQUNFX1dPUktfRldfRFVNUCwgJmFkYXB0ZXItPmlmYWNlX3dvcmtfZmxhZ3MpOworCXNldF9iaXQoTVdJRklFWF9JRkFDRV9XT1JLX0ZXX0RVTVAsICZpZmFjZV93b3JrX2ZsYWdzKTsKIAotCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPmlmYWNlX3dvcmspOworCXNjaGVkdWxlX3dvcmsoJnBjaWVfd29yayk7CiB9CiAKIC8qCkBAIC0yNjE3LDcgKzI2MTgsNiBAQAogCS5pbml0X2Z3X3BvcnQgPQkJCW13aWZpZXhfcGNpZV9pbml0X2Z3X3BvcnQsCiAJLmNsZWFuX3BjaWVfcmluZyA9CQltd2lmaWV4X2NsZWFuX3BjaWVfcmluZ19idWYsCiAJLmZ3X2R1bXAgPQkJCW13aWZpZXhfcGNpZV9md19kdW1wLAotCS5pZmFjZV93b3JrID0JCQltd2lmaWV4X3BjaWVfd29yaywKIH07CiAKIC8qCkBAIC0yNjYzLDYgKzI2NjMsNyBAQAogCS8qIFNldCB0aGUgZmxhZyBhcyB1c2VyIGlzIHJlbW92aW5nIHRoaXMgbW9kdWxlLiAqLwogCXVzZXJfcm1tb2QgPSAxOwogCisJY2FuY2VsX3dvcmtfc3luYygmcGNpZV93b3JrKTsKIAlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm13aWZpZXhfcGNpZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvcGNpZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9wY2llLmgKaW5kZXggNjY2ZDQwZS4uMGU3ZWU4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9wY2llLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9wY2llLmgKQEAgLTIwNSw3ICsyMDUsNyBAQAogCWNvbnN0IHN0cnVjdCBtd2lmaWV4X3BjaWVfY2FyZF9yZWcgKnJlZzsKIAl1MTYgYmxrc3pfZndfZGw7CiAJdTE2IHR4X2J1Zl9zaXplOwotCWJvb2wgc3VwcG9ydHNfZndfZHVtcDsKKwlib29sIGNhbl9kdW1wX2Z3OwogCWJvb2wgY2FuX2V4dF9zY2FuOwogfTsKIApAQCAtMjE0LDcgKzIxNCw3IEBACiAJLnJlZyAgICAgICAgICAgID0gJm13aWZpZXhfcmVnXzg3NjYsCiAJLmJsa3N6X2Z3X2RsID0gTVdJRklFWF9QQ0lFX0JMT0NLX1NJWkVfRldfRE5MRCwKIAkudHhfYnVmX3NpemUgPSBNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfMkssCi0JLnN1cHBvcnRzX2Z3X2R1bXAgPSBmYWxzZSwKKwkuY2FuX2R1bXBfZncgPSBmYWxzZSwKIAkuY2FuX2V4dF9zY2FuID0gdHJ1ZSwKIH07CiAKQEAgLTIyMyw3ICsyMjMsNyBAQAogCS5yZWcgICAgICAgICAgICA9ICZtd2lmaWV4X3JlZ184ODk3LAogCS5ibGtzel9md19kbCA9IE1XSUZJRVhfUENJRV9CTE9DS19TSVpFX0ZXX0ROTEQsCiAJLnR4X2J1Zl9zaXplID0gTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzRLLAotCS5zdXBwb3J0c19md19kdW1wID0gdHJ1ZSwKKwkuY2FuX2R1bXBfZncgPSB0cnVlLAogCS5jYW5fZXh0X3NjYW4gPSB0cnVlLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uYwppbmRleCA5MWUzNmNkLi5kMTAzMjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uYwpAQCAtNDcsNiArNDcsNyBAQAogc3RhdGljIHU4IHVzZXJfcm1tb2Q7CiAKIHN0YXRpYyBzdHJ1Y3QgbXdpZmlleF9pZl9vcHMgc2Rpb19vcHM7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBpZmFjZV93b3JrX2ZsYWdzOwogCiBzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBhZGRfcmVtb3ZlX2NhcmRfc2VtOwogCkBAIC0xMDUsOCArMTA2LDggQEAKIAkJY2FyZC0+dHhfYnVmX3NpemUgPSBkYXRhLT50eF9idWZfc2l6ZTsKIAkJY2FyZC0+bXBfdHhfYWdnX2J1Zl9zaXplID0gZGF0YS0+bXBfdHhfYWdnX2J1Zl9zaXplOwogCQljYXJkLT5tcF9yeF9hZ2dfYnVmX3NpemUgPSBkYXRhLT5tcF9yeF9hZ2dfYnVmX3NpemU7Ci0JCWNhcmQtPnN1cHBvcnRzX2Z3X2R1bXAgPSBkYXRhLT5zdXBwb3J0c19md19kdW1wOwotCQljYXJkLT5hdXRvX3RkbHMgPSBkYXRhLT5hdXRvX3RkbHM7CisJCWNhcmQtPmNhbl9kdW1wX2Z3ID0gZGF0YS0+Y2FuX2R1bXBfZnc7CisJCWNhcmQtPmNhbl9hdXRvX3RkbHMgPSBkYXRhLT5jYW5fYXV0b190ZGxzOwogCQljYXJkLT5jYW5fZXh0X3NjYW4gPSBkYXRhLT5jYW5fZXh0X3NjYW47CiAJfQogCkBAIC0yMDAsOCArMjAxLDYgQEAKIAlpZiAoIWFkYXB0ZXIgfHwgIWFkYXB0ZXItPnByaXZfbnVtKQogCQlyZXR1cm47CiAKLQljYW5jZWxfd29ya19zeW5jKCZhZGFwdGVyLT5pZmFjZV93b3JrKTsKLQogCWlmICh1c2VyX3JtbW9kKSB7CiAJCWlmIChhZGFwdGVyLT5pc19zdXNwZW5kZWQpCiAJCQltd2lmaWV4X3NkaW9fcmVzdW1lKGFkYXB0ZXItPmRldik7CkBAIC0xMDQzLDYgKzEwNDIsNTkgQEAKIH0KIAogLyoKKyAqIFRoaXMgZnVuY3Rpb24gZGVjb2RlIHNkaW8gYWdncmVhdGlvbiBwa3QuCisgKgorICogQmFzZWQgb24gdGhlIHRoZSBkYXRhIGJsb2NrIHNpemUgYW5kIHBrdF9sZW4sCisgKiBza2IgZGF0YSB3aWxsIGJlIGRlY29kZWQgdG8gZmV3IHBhY2tldHMuCisgKi8KK3N0YXRpYyB2b2lkIG13aWZpZXhfZGVhZ2dyX3NkaW9fcGt0KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTMyIHRvdGFsX3BrdF9sZW4sIHBrdF9sZW47CisJc3RydWN0IHNrX2J1ZmYgKnNrYl9kZWFnZ3I7CisJdTMyIHBrdF90eXBlOworCXUxNiBibGtfc2l6ZTsKKwl1OCBibGtfbnVtOworCXU4ICpkYXRhOworCisJZGF0YSA9IHNrYi0+ZGF0YTsKKwl0b3RhbF9wa3RfbGVuID0gc2tiLT5sZW47CisKKwl3aGlsZSAodG90YWxfcGt0X2xlbiA+PSAoU0RJT19IRUFERVJfT0ZGU0VUICsgSU5URl9IRUFERVJfTEVOKSkgeworCQlpZiAodG90YWxfcGt0X2xlbiA8IGFkYXB0ZXItPnNkaW9fcnhfYmxvY2tfc2l6ZSkKKwkJCWJyZWFrOworCQlibGtfbnVtID0gKihkYXRhICsgQkxPQ0tfTlVNQkVSX09GRlNFVCk7CisJCWJsa19zaXplID0gYWRhcHRlci0+c2Rpb19yeF9ibG9ja19zaXplICogYmxrX251bTsKKwkJaWYgKGJsa19zaXplID4gdG90YWxfcGt0X2xlbikgeworCQkJZGV2X2VycihhZGFwdGVyLT5kZXYsICIlczogZXJyb3IgaW4gcGt0LFx0IgorCQkJCSJibGtfbnVtPSVkLCBibGtfc2l6ZT0lZCwgdG90YWxfcGt0X2xlbj0lZFxuIiwKKwkJCQlfX2Z1bmNfXywgYmxrX251bSwgYmxrX3NpemUsIHRvdGFsX3BrdF9sZW4pOworCQkJYnJlYWs7CisJCX0KKwkJcGt0X2xlbiA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopKGRhdGEgKyBTRElPX0hFQURFUl9PRkZTRVQpKTsKKwkJcGt0X3R5cGUgPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKShkYXRhICsgU0RJT19IRUFERVJfT0ZGU0VUICsKKwkJCQkJIDIpKTsKKwkJaWYgKChwa3RfbGVuICsgU0RJT19IRUFERVJfT0ZGU0VUKSA+IGJsa19zaXplKSB7CisJCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgIiVzOiBlcnJvciBpbiBwa3QsXHQiCisJCQkJInBrdF9sZW49JWQsIGJsa19zaXplPSVkXG4iLAorCQkJCV9fZnVuY19fLCBwa3RfbGVuLCBibGtfc2l6ZSk7CisJCQlicmVhazsKKwkJfQorCQlza2JfZGVhZ2dyID0gbXdpZmlleF9hbGxvY19kbWFfYWxpZ25fYnVmKHBrdF9sZW4sCisJCQkJCQkJIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJaWYgKCFza2JfZGVhZ2dyKQorCQkJYnJlYWs7CisJCXNrYl9wdXQoc2tiX2RlYWdnciwgcGt0X2xlbik7CisJCW1lbWNweShza2JfZGVhZ2dyLT5kYXRhLCBkYXRhICsgU0RJT19IRUFERVJfT0ZGU0VULCBwa3RfbGVuKTsKKwkJc2tiX3B1bGwoc2tiX2RlYWdnciwgSU5URl9IRUFERVJfTEVOKTsKKworCQltd2lmaWV4X2hhbmRsZV9yeF9wYWNrZXQoYWRhcHRlciwgc2tiX2RlYWdncik7CisJCWRhdGEgKz0gYmxrX3NpemU7CisJCXRvdGFsX3BrdF9sZW4gLT0gYmxrX3NpemU7CisJfQorfQorCisvKgogICogVGhpcyBmdW5jdGlvbiBkZWNvZGVzIGEgcmVjZWl2ZWQgcGFja2V0LgogICoKICAqIEJhc2VkIG9uIHRoZSB0eXBlLCB0aGUgcGFja2V0IGlzIHRyZWF0ZWQgYXMgZWl0aGVyIGEgZGF0YSwgb3IKQEAgLTEwNTUsMTEgKzExMDcsMjggQEAKIAl1OCAqY21kX2J1ZjsKIAlfX2xlMTYgKmN1cnJfcHRyID0gKF9fbGUxNiAqKXNrYi0+ZGF0YTsKIAl1MTYgcGt0X2xlbiA9IGxlMTZfdG9fY3B1KCpjdXJyX3B0cik7CisJc3RydWN0IG13aWZpZXhfcnhpbmZvICpyeF9pbmZvOwogCi0Jc2tiX3RyaW0oc2tiLCBwa3RfbGVuKTsKLQlza2JfcHVsbChza2IsIElOVEZfSEVBREVSX0xFTik7CisJaWYgKHVwbGRfdHlwICE9IE1XSUZJRVhfVFlQRV9BR0dSX0RBVEEpIHsKKwkJc2tiX3RyaW0oc2tiLCBwa3RfbGVuKTsKKwkJc2tiX3B1bGwoc2tiLCBJTlRGX0hFQURFUl9MRU4pOworCX0KIAogCXN3aXRjaCAodXBsZF90eXApIHsKKwljYXNlIE1XSUZJRVhfVFlQRV9BR0dSX0RBVEE6CisJCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiaW5mbzogLS0tIFJ4OiBBZ2dyIERhdGEgcGFja2V0IC0tLVxuIik7CisJCXJ4X2luZm8gPSBNV0lGSUVYX1NLQl9SWENCKHNrYik7CisJCXJ4X2luZm8tPmJ1Zl90eXBlID0gTVdJRklFWF9UWVBFX0FHR1JfREFUQTsKKwkJaWYgKGFkYXB0ZXItPnJ4X3dvcmtfZW5hYmxlZCkgeworCQkJc2tiX3F1ZXVlX3RhaWwoJmFkYXB0ZXItPnJ4X2RhdGFfcSwgc2tiKTsKKwkJCWF0b21pY19pbmMoJmFkYXB0ZXItPnJ4X3BlbmRpbmcpOworCQkJYWRhcHRlci0+ZGF0YV9yZWNlaXZlZCA9IHRydWU7CisJCX0gZWxzZSB7CisJCQltd2lmaWV4X2RlYWdncl9zZGlvX3BrdChhZGFwdGVyLCBza2IpOworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJfQorCQlicmVhazsKKwogCWNhc2UgTVdJRklFWF9UWVBFX0RBVEE6CiAJCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiaW5mbzogLS0tIFJ4OiBEYXRhIHBhY2tldCAtLS1cbiIpOwogCQlpZiAoYWRhcHRlci0+cnhfd29ya19lbmFibGVkKSB7CkBAIC0xMTI3LDE3ICsxMTk2LDE3IEBACiAgKiBwcm92aWRlZCB0aGVyZSBpcyBzcGFjZSBsZWZ0LCBwcm9jZXNzZWQgYW5kIGZpbmFsbHkgdXBsb2FkZWQuCiAgKi8KIHN0YXRpYyBpbnQgbXdpZmlleF9zZGlvX2NhcmRfdG9faG9zdF9tcF9hZ2dyKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggcG9ydCkKKwkJCQkJICAgICB1MTYgcnhfbGVuLCB1OCBwb3J0KQogewogCXN0cnVjdCBzZGlvX21tY19jYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKIAlzMzIgZl9kb19yeF9hZ2dyID0gMDsKIAlzMzIgZl9kb19yeF9jdXIgPSAwOwogCXMzMiBmX2FnZ3JfY3VyID0gMDsKKwlzMzIgZl9wb3N0X2FnZ3JfY3VyID0gMDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2RlYWdncjsKLQl1MzIgcGluZDsKLQl1MzIgcGt0X2xlbiwgcGt0X3R5cGUsIG1wb3J0OworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXUzMiBwa3RfbGVuLCBwa3RfdHlwZSwgbXBvcnQsIHBpbmQ7CiAJdTggKmN1cnJfcHRyOwotCXUzMiByeF9sZW4gPSBza2ItPmxlbjsKIAogCWlmICgoY2FyZC0+aGFzX2NvbnRyb2xfbWFzaykgJiYgKHBvcnQgPT0gQ1RSTF9QT1JUKSkgewogCQkvKiBSZWFkIHRoZSBjb21tYW5kIFJlc3Agd2l0aG91dCBhZ2dyICovCkBAIC0xMTY0LDEyICsxMjMzLDEyIEBACiAJCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiaW5mbzogJXM6IG5vdCBsYXN0IHBhY2tldFxuIiwgX19mdW5jX18pOwogCiAJCWlmIChNUF9SWF9BR0dSX0lOX1BST0dSRVNTKGNhcmQpKSB7Ci0JCQlpZiAoTVBfUlhfQUdHUl9CVUZfSEFTX1JPT00oY2FyZCwgc2tiLT5sZW4pKSB7CisJCQlpZiAoTVBfUlhfQUdHUl9CVUZfSEFTX1JPT00oY2FyZCwgcnhfbGVuKSkgewogCQkJCWZfYWdncl9jdXIgPSAxOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBObyByb29tIGluIEFnZ3IgYnVmLCBkbyByeCBhZ2dyIG5vdyAqLwogCQkJCWZfZG9fcnhfYWdnciA9IDE7Ci0JCQkJZl9kb19yeF9jdXIgPSAxOworCQkJCWZfcG9zdF9hZ2dyX2N1ciA9IDE7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKiBSeCBhZ2dyIG5vdCBpbiBwcm9ncmVzcyAqLwpAQCAtMTE4Miw3ICsxMjUxLDcgQEAKIAogCQlpZiAoTVBfUlhfQUdHUl9JTl9QUk9HUkVTUyhjYXJkKSkgewogCQkJZl9kb19yeF9hZ2dyID0gMTsKLQkJCWlmIChNUF9SWF9BR0dSX0JVRl9IQVNfUk9PTShjYXJkLCBza2ItPmxlbikpCisJCQlpZiAoTVBfUlhfQUdHUl9CVUZfSEFTX1JPT00oY2FyZCwgcnhfbGVuKSkKIAkJCQlmX2FnZ3JfY3VyID0gMTsKIAkJCWVsc2UKIAkJCQkvKiBObyByb29tIGluIEFnZ3IgYnVmLCBkbyByeCBhZ2dyIG5vdyAqLwpAQCAtMTE5NSw3ICsxMjY0LDcgQEAKIAlpZiAoZl9hZ2dyX2N1cikgewogCQlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImluZm86IGN1cnJlbnQgcGFja2V0IGFnZ3JlZ2F0aW9uXG4iKTsKIAkJLyogQ3VyciBwa3QgY2FuIGJlIGFnZ3JlZ2F0ZWQgKi8KLQkJbXBfcnhfYWdncl9zZXR1cChjYXJkLCBza2IsIHBvcnQpOworCQltcF9yeF9hZ2dyX3NldHVwKGNhcmQsIHJ4X2xlbiwgcG9ydCk7CiAKIAkJaWYgKE1QX1JYX0FHR1JfUEtUX0xJTUlUX1JFQUNIRUQoY2FyZCkgfHwKIAkJICAgIG1wX3J4X2FnZ3JfcG9ydF9saW1pdF9yZWFjaGVkKGNhcmQpKSB7CkBAIC0xMjM4LDE2ICsxMzA3LDI5IEBACiAJCWN1cnJfcHRyID0gY2FyZC0+bXBhX3J4LmJ1ZjsKIAogCQlmb3IgKHBpbmQgPSAwOyBwaW5kIDwgY2FyZC0+bXBhX3J4LnBrdF9jbnQ7IHBpbmQrKykgeworCQkJdTMyICpsZW5fYXJyID0gY2FyZC0+bXBhX3J4Lmxlbl9hcnI7CiAKIAkJCS8qIGdldCBjdXJyIFBLVCBsZW4gJiB0eXBlICovCiAJCQlwa3RfbGVuID0gbGUxNl90b19jcHUoKihfX2xlMTYgKikgJmN1cnJfcHRyWzBdKTsKIAkJCXBrdF90eXBlID0gbGUxNl90b19jcHUoKihfX2xlMTYgKikgJmN1cnJfcHRyWzJdKTsKIAogCQkJLyogY29weSBwa3QgdG8gZGVhZ2dyIGJ1ZiAqLwotCQkJc2tiX2RlYWdnciA9IGNhcmQtPm1wYV9yeC5za2JfYXJyW3BpbmRdOworCQkJc2tiX2RlYWdnciA9IG13aWZpZXhfYWxsb2NfZG1hX2FsaWduX2J1ZihsZW5fYXJyW3BpbmRdLAorCQkJCQkJCQkgR0ZQX0tFUk5FTCB8CisJCQkJCQkJCSBHRlBfRE1BKTsKKwkJCWlmICghc2tiX2RlYWdncikgeworCQkJCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAic2tiIGFsbG9jYXRpb24gZmFpbHVyZSBkcm9wIHBrdCBsZW49JWQgdHlwZT0lZFxuIiwKKwkJCQkJcGt0X2xlbiwgcGt0X3R5cGUpOworCQkJCWN1cnJfcHRyICs9IGxlbl9hcnJbcGluZF07CisJCQkJY29udGludWU7CisJCQl9CiAKLQkJCWlmICgocGt0X3R5cGUgPT0gTVdJRklFWF9UWVBFX0RBVEEpICYmIChwa3RfbGVuIDw9Ci0JCQkJCSBjYXJkLT5tcGFfcngubGVuX2FycltwaW5kXSkpIHsKKwkJCXNrYl9wdXQoc2tiX2RlYWdnciwgbGVuX2FycltwaW5kXSk7CisKKwkJCWlmICgocGt0X3R5cGUgPT0gTVdJRklFWF9UWVBFX0RBVEEgfHwKKwkJCSAgICAgKHBrdF90eXBlID09IE1XSUZJRVhfVFlQRV9BR0dSX0RBVEEgJiYKKwkJCSAgICAgIGFkYXB0ZXItPnNkaW9fcnhfYWdncl9lbmFibGUpKSAmJgorCQkJICAgIChwa3RfbGVuIDw9IGxlbl9hcnJbcGluZF0pKSB7CiAKIAkJCQltZW1jcHkoc2tiX2RlYWdnci0+ZGF0YSwgY3Vycl9wdHIsIHBrdF9sZW4pOwogCkBAIC0xMjU3LDEzICsxMzM5LDE1IEBACiAJCQkJbXdpZmlleF9kZWNvZGVfcnhfcGFja2V0KGFkYXB0ZXIsIHNrYl9kZWFnZ3IsCiAJCQkJCQkJIHBrdF90eXBlKTsKIAkJCX0gZWxzZSB7Ci0JCQkJZGV2X2VycihhZGFwdGVyLT5kZXYsICJ3cm9uZyBhZ2dyIHBrdDoiCi0JCQkJCSIgdHlwZT0lZCBsZW49JWQgbWF4X2xlbj0lZFxuIiwKKwkJCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgIiBkcm9wIHdyb25nIGFnZ3IgcGt0Olx0IgorCQkJCQkic2Rpb19zaW5nbGVfcG9ydF9yeF9hZ2dyPSVkXHQiCisJCQkJCSJ0eXBlPSVkIGxlbj0lZCBtYXhfbGVuPSVkXG4iLAorCQkJCQlhZGFwdGVyLT5zZGlvX3J4X2FnZ3JfZW5hYmxlLAogCQkJCQlwa3RfdHlwZSwgcGt0X2xlbiwKLQkJCQkJY2FyZC0+bXBhX3J4Lmxlbl9hcnJbcGluZF0pOworCQkJCQlsZW5fYXJyW3BpbmRdKTsKIAkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2JfZGVhZ2dyKTsKIAkJCX0KLQkJCWN1cnJfcHRyICs9IGNhcmQtPm1wYV9yeC5sZW5fYXJyW3BpbmRdOworCQkJY3Vycl9wdHIgKz0gbGVuX2FycltwaW5kXTsKIAkJfQogCQlNUF9SWF9BR0dSX0JVRl9SRVNFVChjYXJkKTsKIAl9CkBAIC0xMjczLDI4ICsxMzU3LDQ2IEBACiAJCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiaW5mbzogUlg6IHBvcnQ6ICVkLCByeF9sZW46ICVkXG4iLAogCQkJcG9ydCwgcnhfbGVuKTsKIAorCQlza2IgPSBtd2lmaWV4X2FsbG9jX2RtYV9hbGlnbl9idWYocnhfbGVuLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJCWlmICghc2tiKSB7CisJCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgInNpbmdsZSBza2IgYWxsb2NhdGVkIGZhaWwsXHQiCisJCQkJImRyb3AgcGt0IHBvcnQ9JWQgbGVuPSVkXG4iLCBwb3J0LCByeF9sZW4pOworCQkJaWYgKG13aWZpZXhfc2Rpb19jYXJkX3RvX2hvc3QoYWRhcHRlciwgJnBrdF90eXBlLAorCQkJCQkJICAgICAgY2FyZC0+bXBhX3J4LmJ1ZiwgcnhfbGVuLAorCQkJCQkJICAgICAgYWRhcHRlci0+aW9wb3J0ICsgcG9ydCkpCisJCQkJZ290byBlcnJvcjsKKwkJCXJldHVybiAwOworCQl9CisKKwkJc2tiX3B1dChza2IsIHJ4X2xlbik7CisKIAkJaWYgKG13aWZpZXhfc2Rpb19jYXJkX3RvX2hvc3QoYWRhcHRlciwgJnBrdF90eXBlLAogCQkJCQkgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuLAogCQkJCQkgICAgICBhZGFwdGVyLT5pb3BvcnQgKyBwb3J0KSkKIAkJCWdvdG8gZXJyb3I7CisJCWlmICghYWRhcHRlci0+c2Rpb19yeF9hZ2dyX2VuYWJsZSAmJgorCQkgICAgcGt0X3R5cGUgPT0gTVdJRklFWF9UWVBFX0FHR1JfREFUQSkgeworCQkJZGV2X2VycihhZGFwdGVyLT5kZXYsICJkcm9wIHdyb25nIHBrdCB0eXBlICVkXHQiCisJCQkJImN1cnJlbnQgU0RJTyBSWCBBZ2dyIG5vdCBlbmFibGVkXG4iLAorCQkJCXBrdF90eXBlKTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQogCiAJCW13aWZpZXhfZGVjb2RlX3J4X3BhY2tldChhZGFwdGVyLCBza2IsIHBrdF90eXBlKTsKIAl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0JaWYgKE1QX1JYX0FHR1JfSU5fUFJPR1JFU1MoY2FyZCkpIHsKLQkJLyogTXVsdGlwb3J0LWFnZ3JlZ2F0aW9uIHRyYW5zZmVyIGZhaWxlZCAtIGNsZWFudXAgKi8KLQkJZm9yIChwaW5kID0gMDsgcGluZCA8IGNhcmQtPm1wYV9yeC5wa3RfY250OyBwaW5kKyspIHsKLQkJCS8qIGNvcHkgcGt0IHRvIGRlYWdnciBidWYgKi8KLQkJCXNrYl9kZWFnZ3IgPSBjYXJkLT5tcGFfcnguc2tiX2FycltwaW5kXTsKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYl9kZWFnZ3IpOwotCQl9Ci0JCU1QX1JYX0FHR1JfQlVGX1JFU0VUKGNhcmQpOworCWlmIChmX3Bvc3RfYWdncl9jdXIpIHsKKwkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJpbmZvOiBjdXJyZW50IHBhY2tldCBhZ2dyZWdhdGlvblxuIik7CisJCS8qIEN1cnIgcGt0IGNhbiBiZSBhZ2dyZWdhdGVkICovCisJCW1wX3J4X2FnZ3Jfc2V0dXAoY2FyZCwgcnhfbGVuLCBwb3J0KTsKIAl9CiAKLQlpZiAoZl9kb19yeF9jdXIpCisJcmV0dXJuIDA7CitlcnJvcjoKKwlpZiAoTVBfUlhfQUdHUl9JTl9QUk9HUkVTUyhjYXJkKSkKKwkJTVBfUlhfQUdHUl9CVUZfUkVTRVQoY2FyZCk7CisKKwlpZiAoZl9kb19yeF9jdXIgJiYgc2tiKQogCQkvKiBTaW5nbGUgdHJhbnNmZXIgcGVuZGluZy4gRnJlZSBjdXJyIGJ1ZmYgYWxzbyAqLwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCkBAIC0xMzU2LDggKzE0NTgsOSBAQAogCQkgICAgIE1XSUZJRVhfUlhfREFUQV9CVUZfU0laRSkKIAkJCXJldHVybiAtMTsKIAkJcnhfbGVuID0gKHUxNikgKHJ4X2Jsb2NrcyAqIE1XSUZJRVhfU0RJT19CTE9DS19TSVpFKTsKKwkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJpbmZvOiByeF9sZW4gPSAlZFxuIiwgcnhfbGVuKTsKIAotCQlza2IgPSBkZXZfYWxsb2Nfc2tiKHJ4X2xlbik7CisJCXNrYiA9IG13aWZpZXhfYWxsb2NfZG1hX2FsaWduX2J1ZihyeF9sZW4sIEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKIAkJaWYgKCFza2IpCiAJCQlyZXR1cm4gLTE7CiAKQEAgLTE0NDcsMjcgKzE1NTAsMTYgQEAKIAkJCQkgMSkgLyBNV0lGSUVYX1NESU9fQkxPQ0tfU0laRTsKIAkJCWlmIChyeF9sZW4gPD0gSU5URl9IRUFERVJfTEVOIHx8CiAJCQkgICAgKHJ4X2Jsb2NrcyAqIE1XSUZJRVhfU0RJT19CTE9DS19TSVpFKSA+Ci0JCQkgICAgIE1XSUZJRVhfUlhfREFUQV9CVUZfU0laRSkgeworCQkJICAgICBjYXJkLT5tcGFfcnguYnVmX3NpemUpIHsKIAkJCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgImludmFsaWQgcnhfbGVuPSVkXG4iLAogCQkJCQlyeF9sZW4pOwogCQkJCXJldHVybiAtMTsKIAkJCX0KKwogCQkJcnhfbGVuID0gKHUxNikgKHJ4X2Jsb2NrcyAqIE1XSUZJRVhfU0RJT19CTE9DS19TSVpFKTsKKwkJCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiaW5mbzogcnhfbGVuID0gJWRcbiIsIHJ4X2xlbik7CiAKLQkJCXNrYiA9IGRldl9hbGxvY19za2IocnhfbGVuKTsKLQotCQkJaWYgKCFza2IpIHsKLQkJCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgIiVzOiBmYWlsZWQgdG8gYWxsb2Mgc2tiIiwKLQkJCQkJX19mdW5jX18pOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJc2tiX3B1dChza2IsIHJ4X2xlbik7Ci0KLQkJCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiaW5mbzogcnhfbGVuID0gJWQgc2tiLT5sZW4gPSAlZFxuIiwKLQkJCQlyeF9sZW4sIHNrYi0+bGVuKTsKLQotCQkJaWYgKG13aWZpZXhfc2Rpb19jYXJkX3RvX2hvc3RfbXBfYWdncihhZGFwdGVyLCBza2IsCisJCQlpZiAobXdpZmlleF9zZGlvX2NhcmRfdG9faG9zdF9tcF9hZ2dyKGFkYXB0ZXIsIHJ4X2xlbiwKIAkJCQkJCQkgICAgICBwb3J0KSkgewogCQkJCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAiY2FyZF90b19ob3N0X21wYSBmYWlsZWQ6IgogCQkJCQkiIGludCBzdGF0dXM9JSN4XG4iLCBzZGlvX2lyZWcpOwpAQCAtMTczNSw2ICsxODI3LDcgQEAKIAkJCQkgICB1MzIgbXBhX3R4X2J1Zl9zaXplLCB1MzIgbXBhX3J4X2J1Zl9zaXplKQogewogCXN0cnVjdCBzZGlvX21tY19jYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKKwl1MzIgcnhfYnVmX3NpemU7CiAJaW50IHJldCA9IDA7CiAKIAljYXJkLT5tcGFfdHguYnVmID0ga3phbGxvYyhtcGFfdHhfYnVmX3NpemUsIEdGUF9LRVJORUwpOwpAQCAtMTc0NSwxMyArMTgzOCwxNSBAQAogCiAJY2FyZC0+bXBhX3R4LmJ1Zl9zaXplID0gbXBhX3R4X2J1Zl9zaXplOwogCi0JY2FyZC0+bXBhX3J4LmJ1ZiA9IGt6YWxsb2MobXBhX3J4X2J1Zl9zaXplLCBHRlBfS0VSTkVMKTsKKwlyeF9idWZfc2l6ZSA9IG1heF90KHUzMiwgbXBhX3J4X2J1Zl9zaXplLAorCQkJICAgICh1MzIpU0RJT19NQVhfQUdHUl9CVUZfU0laRSk7CisJY2FyZC0+bXBhX3J4LmJ1ZiA9IGt6YWxsb2MocnhfYnVmX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghY2FyZC0+bXBhX3J4LmJ1ZikgewogCQlyZXQgPSAtMTsKIAkJZ290byBlcnJvcjsKIAl9CiAKLQljYXJkLT5tcGFfcnguYnVmX3NpemUgPSBtcGFfcnhfYnVmX3NpemU7CisJY2FyZC0+bXBhX3J4LmJ1Zl9zaXplID0gcnhfYnVmX3NpemU7CiAKIGVycm9yOgogCWlmIChyZXQpIHsKQEAgLTE4ODcsNyArMTk4Miw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlhZGFwdGVyLT5hdXRvX3RkbHMgPSBjYXJkLT5hdXRvX3RkbHM7CisJYWRhcHRlci0+YXV0b190ZGxzID0gY2FyZC0+Y2FuX2F1dG9fdGRsczsKIAlhZGFwdGVyLT5leHRfc2NhbiA9IGNhcmQtPmNhbl9leHRfc2NhbjsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTk1MCw2ICsyMDQ1LDcgQEAKIAkJcG9ydCwgY2FyZC0+bXBfZGF0YV9wb3J0X21hc2spOwogfQogCitzdGF0aWMgc3RydWN0IG13aWZpZXhfYWRhcHRlciAqc2F2ZV9hZGFwdGVyOwogc3RhdGljIHZvaWQgbXdpZmlleF9zZGlvX2NhcmRfcmVzZXRfd29yayhzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKQogewogCXN0cnVjdCBzZGlvX21tY19jYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKQEAgLTIwMTgsMTAgKzIxMTQsOCBAQAogfQogCiAvKiBUaGlzIGZ1bmN0aW9uIGR1bXAgZmlybXdhcmUgbWVtb3J5IHRvIGZpbGUgKi8KLXN0YXRpYyB2b2lkIG13aWZpZXhfc2Rpb19md19kdW1wX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQorc3RhdGljIHZvaWQgbXdpZmlleF9zZGlvX2Z3X2R1bXBfd29yayhzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKQogewotCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPQotCQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIsIGlmYWNlX3dvcmspOwogCXN0cnVjdCBzZGlvX21tY19jYXJkICpjYXJkID0gYWRhcHRlci0+Y2FyZDsKIAlpbnQgcmV0ID0gMDsKIAl1bnNpZ25lZCBpbnQgcmVnLCByZWdfc3RhcnQsIHJlZ19lbmQ7CkBAIC0yMDMyLDcgKzIxMjYsNyBAQAogCiAJbXdpZmlleF9kdW1wX2Rydl9pbmZvKGFkYXB0ZXIpOwogCi0JaWYgKCFjYXJkLT5zdXBwb3J0c19md19kdW1wKQorCWlmICghY2FyZC0+Y2FuX2R1bXBfZncpCiAJCXJldHVybjsKIAogCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShtZW1fdHlwZV9tYXBwaW5nX3RibCk7IGlkeCsrKSB7CkBAIC0yMTQzLDM2ICsyMjM3LDM2IEBACiAKIHN0YXRpYyB2b2lkIG13aWZpZXhfc2Rpb193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyID0KLQkJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyLCBpZmFjZV93b3JrKTsKLQotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTVdJRklFWF9JRkFDRV9XT1JLX0NBUkRfUkVTRVQsCi0JCQkgICAgICAgJmFkYXB0ZXItPmlmYWNlX3dvcmtfZmxhZ3MpKQotCQltd2lmaWV4X3NkaW9fY2FyZF9yZXNldF93b3JrKGFkYXB0ZXIpOwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTVdJRklFWF9JRkFDRV9XT1JLX0ZXX0RVTVAsCi0JCQkgICAgICAgJmFkYXB0ZXItPmlmYWNlX3dvcmtfZmxhZ3MpKQotCQltd2lmaWV4X3NkaW9fZndfZHVtcF93b3JrKHdvcmspOworCQkJICAgICAgICZpZmFjZV93b3JrX2ZsYWdzKSkKKwkJbXdpZmlleF9zZGlvX2Z3X2R1bXBfd29yayhzYXZlX2FkYXB0ZXIpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTVdJRklFWF9JRkFDRV9XT1JLX0NBUkRfUkVTRVQsCisJCQkgICAgICAgJmlmYWNlX3dvcmtfZmxhZ3MpKQorCQltd2lmaWV4X3NkaW9fY2FyZF9yZXNldF93b3JrKHNhdmVfYWRhcHRlcik7CiB9CiAKK3N0YXRpYyBERUNMQVJFX1dPUksoc2Rpb193b3JrLCBtd2lmaWV4X3NkaW9fd29yayk7CiAvKiBUaGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgY2FyZCAqLwogc3RhdGljIHZvaWQgbXdpZmlleF9zZGlvX2NhcmRfcmVzZXQoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlpZiAodGVzdF9iaXQoTVdJRklFWF9JRkFDRV9XT1JLX0NBUkRfUkVTRVQsICZhZGFwdGVyLT5pZmFjZV93b3JrX2ZsYWdzKSkKKwlzYXZlX2FkYXB0ZXIgPSBhZGFwdGVyOworCWlmICh0ZXN0X2JpdChNV0lGSUVYX0lGQUNFX1dPUktfQ0FSRF9SRVNFVCwgJmlmYWNlX3dvcmtfZmxhZ3MpKQogCQlyZXR1cm47CiAKLQlzZXRfYml0KE1XSUZJRVhfSUZBQ0VfV09SS19DQVJEX1JFU0VULCAmYWRhcHRlci0+aWZhY2Vfd29ya19mbGFncyk7CisJc2V0X2JpdChNV0lGSUVYX0lGQUNFX1dPUktfQ0FSRF9SRVNFVCwgJmlmYWNlX3dvcmtfZmxhZ3MpOwogCi0Jc2NoZWR1bGVfd29yaygmYWRhcHRlci0+aWZhY2Vfd29yayk7CisJc2NoZWR1bGVfd29yaygmc2Rpb193b3JrKTsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiBkdW1wcyBGVyBpbmZvcm1hdGlvbiAqLwogc3RhdGljIHZvaWQgbXdpZmlleF9zZGlvX2Z3X2R1bXAoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlpZiAodGVzdF9iaXQoTVdJRklFWF9JRkFDRV9XT1JLX0ZXX0RVTVAsICZhZGFwdGVyLT5pZmFjZV93b3JrX2ZsYWdzKSkKKwlzYXZlX2FkYXB0ZXIgPSBhZGFwdGVyOworCWlmICh0ZXN0X2JpdChNV0lGSUVYX0lGQUNFX1dPUktfRldfRFVNUCwgJmlmYWNlX3dvcmtfZmxhZ3MpKQogCQlyZXR1cm47CiAKLQlzZXRfYml0KE1XSUZJRVhfSUZBQ0VfV09SS19GV19EVU1QLCAmYWRhcHRlci0+aWZhY2Vfd29ya19mbGFncyk7Ci0Jc2NoZWR1bGVfd29yaygmYWRhcHRlci0+aWZhY2Vfd29yayk7CisJc2V0X2JpdChNV0lGSUVYX0lGQUNFX1dPUktfRldfRFVNUCwgJmlmYWNlX3dvcmtfZmxhZ3MpOworCXNjaGVkdWxlX3dvcmsoJnNkaW9fd29yayk7CiB9CiAKIC8qIEZ1bmN0aW9uIHRvIGR1bXAgU0RJTyBmdW5jdGlvbiByZWdpc3RlcnMgYW5kIFNESU8gc2NyYXRjaCByZWdpc3RlcnMgaW4gY2FzZQpAQCAtMjI4OCw5ICsyMzgyLDkgQEAKIAkuY21kcnNwX2NvbXBsZXRlID0gbXdpZmlleF9zZGlvX2NtZHJzcF9jb21wbGV0ZSwKIAkuZXZlbnRfY29tcGxldGUgPSBtd2lmaWV4X3NkaW9fZXZlbnRfY29tcGxldGUsCiAJLmNhcmRfcmVzZXQgPSBtd2lmaWV4X3NkaW9fY2FyZF9yZXNldCwKLQkuaWZhY2Vfd29yayA9IG13aWZpZXhfc2Rpb193b3JrLAogCS5md19kdW1wID0gbXdpZmlleF9zZGlvX2Z3X2R1bXAsCiAJLnJlZ19kdW1wID0gbXdpZmlleF9zZGlvX3JlZ19kdW1wLAorCS5kZWFnZ3JfcGt0ID0gbXdpZmlleF9kZWFnZ3Jfc2Rpb19wa3QsCiB9OwogCiAvKgpAQCAtMjMyNyw2ICsyNDIxLDcgQEAKIAogCS8qIFNldCB0aGUgZmxhZyBhcyB1c2VyIGlzIHJlbW92aW5nIHRoaXMgbW9kdWxlLiAqLwogCXVzZXJfcm1tb2QgPSAxOworCWNhbmNlbF93b3JrX3N5bmMoJnNkaW9fd29yayk7CiAKIAlzZGlvX3VucmVnaXN0ZXJfZHJpdmVyKCZtd2lmaWV4X3NkaW8pOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uaAppbmRleCA5NTdjY2EyLi42ZjY0NWNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uaApAQCAtNjcsNiArNjcsOCBAQAogCiAjZGVmaW5lIE1XSUZJRVhfTVBfQUdHUl9CVUZfU0laRV8xNksJKDE2Mzg0KQogI2RlZmluZSBNV0lGSUVYX01QX0FHR1JfQlVGX1NJWkVfMzJLCSgzMjc2OCkKKy8qIHdlIGxlYXZlIG9uZSBibG9jayBvZiAyNTYgYnl0ZXMgZm9yIERNQSBhbGlnbm1lbnQqLworI2RlZmluZSBNV0lGSUVYX01QX0FHR1JfQlVGX1NJWkVfTUFYICAgICg2NTI4MCkKIAogLyogTWlzYy4gQ29uZmlnIFJlZ2lzdGVyIDogQXV0byBSZS1lbmFibGUgaW50ZXJydXB0cyAqLwogI2RlZmluZSBBVVRPX1JFX0VOQUJMRV9JTlQgICAgICAgICAgICAgIEJJVCg0KQpAQCAtMjM4LDkgKzI0MCw2IEBACiAJY29uc3Qgc3RydWN0IG13aWZpZXhfc2Rpb19jYXJkX3JlZyAqcmVnOwogCXU4IG1heF9wb3J0czsKIAl1OCBtcF9hZ2dfcGt0X2xpbWl0OwotCWJvb2wgc3VwcG9ydHNfc2Rpb19uZXdfbW9kZTsKLQlib29sIGhhc19jb250cm9sX21hc2s7Ci0JYm9vbCBzdXBwb3J0c19md19kdW1wOwogCXUxNiB0eF9idWZfc2l6ZTsKIAl1MzIgbXBfdHhfYWdnX2J1Zl9zaXplOwogCXUzMiBtcF9yeF9hZ2dfYnVmX3NpemU7CkBAIC0yNTUsNyArMjU0LDEwIEBACiAJdTggY3Vycl93cl9wb3J0OwogCiAJdTggKm1wX3JlZ3M7Ci0JdTggYXV0b190ZGxzOworCWJvb2wgc3VwcG9ydHNfc2Rpb19uZXdfbW9kZTsKKwlib29sIGhhc19jb250cm9sX21hc2s7CisJYm9vbCBjYW5fZHVtcF9mdzsKKwlib29sIGNhbl9hdXRvX3RkbHM7CiAJYm9vbCBjYW5fZXh0X3NjYW47CiAKIAlzdHJ1Y3QgbXdpZmlleF9zZGlvX21wYV90eCBtcGFfdHg7CkBAIC0yNjcsMTMgKzI2OSwxMyBAQAogCWNvbnN0IHN0cnVjdCBtd2lmaWV4X3NkaW9fY2FyZF9yZWcgKnJlZzsKIAl1OCBtYXhfcG9ydHM7CiAJdTggbXBfYWdnX3BrdF9saW1pdDsKLQlib29sIHN1cHBvcnRzX3NkaW9fbmV3X21vZGU7Ci0JYm9vbCBoYXNfY29udHJvbF9tYXNrOwotCWJvb2wgc3VwcG9ydHNfZndfZHVtcDsKIAl1MTYgdHhfYnVmX3NpemU7CiAJdTMyIG1wX3R4X2FnZ19idWZfc2l6ZTsKIAl1MzIgbXBfcnhfYWdnX2J1Zl9zaXplOwotCXU4IGF1dG9fdGRsczsKKwlib29sIHN1cHBvcnRzX3NkaW9fbmV3X21vZGU7CisJYm9vbCBoYXNfY29udHJvbF9tYXNrOworCWJvb2wgY2FuX2R1bXBfZnc7CisJYm9vbCBjYW5fYXV0b190ZGxzOwogCWJvb2wgY2FuX2V4dF9zY2FuOwogfTsKIApAQCAtNDEyLDEzICs0MTQsMTMgQEAKIAkucmVnID0gJm13aWZpZXhfcmVnX3NkODd4eCwKIAkubWF4X3BvcnRzID0gMTYsCiAJLm1wX2FnZ19wa3RfbGltaXQgPSA4LAotCS5zdXBwb3J0c19zZGlvX25ld19tb2RlID0gZmFsc2UsCi0JLmhhc19jb250cm9sX21hc2sgPSB0cnVlLAogCS50eF9idWZfc2l6ZSA9IE1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV8ySywKIAkubXBfdHhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzE2SywKIAkubXBfcnhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzE2SywKLQkuc3VwcG9ydHNfZndfZHVtcCA9IGZhbHNlLAotCS5hdXRvX3RkbHMgPSBmYWxzZSwKKwkuc3VwcG9ydHNfc2Rpb19uZXdfbW9kZSA9IGZhbHNlLAorCS5oYXNfY29udHJvbF9tYXNrID0gdHJ1ZSwKKwkuY2FuX2R1bXBfZncgPSBmYWxzZSwKKwkuY2FuX2F1dG9fdGRscyA9IGZhbHNlLAogCS5jYW5fZXh0X3NjYW4gPSBmYWxzZSwKIH07CiAKQEAgLTQyNywxMyArNDI5LDEzIEBACiAJLnJlZyA9ICZtd2lmaWV4X3JlZ19zZDg3eHgsCiAJLm1heF9wb3J0cyA9IDE2LAogCS5tcF9hZ2dfcGt0X2xpbWl0ID0gOCwKLQkuc3VwcG9ydHNfc2Rpb19uZXdfbW9kZSA9IGZhbHNlLAotCS5oYXNfY29udHJvbF9tYXNrID0gdHJ1ZSwKIAkudHhfYnVmX3NpemUgPSBNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfMkssCiAJLm1wX3R4X2FnZ19idWZfc2l6ZSA9IE1XSUZJRVhfTVBfQUdHUl9CVUZfU0laRV8xNkssCiAJLm1wX3J4X2FnZ19idWZfc2l6ZSA9IE1XSUZJRVhfTVBfQUdHUl9CVUZfU0laRV8xNkssCi0JLnN1cHBvcnRzX2Z3X2R1bXAgPSBmYWxzZSwKLQkuYXV0b190ZGxzID0gZmFsc2UsCisJLnN1cHBvcnRzX3NkaW9fbmV3X21vZGUgPSBmYWxzZSwKKwkuaGFzX2NvbnRyb2xfbWFzayA9IHRydWUsCisJLmNhbl9kdW1wX2Z3ID0gZmFsc2UsCisJLmNhbl9hdXRvX3RkbHMgPSBmYWxzZSwKIAkuY2FuX2V4dF9zY2FuID0gdHJ1ZSwKIH07CiAKQEAgLTQ0MiwxMyArNDQ0LDEzIEBACiAJLnJlZyA9ICZtd2lmaWV4X3JlZ19zZDg3eHgsCiAJLm1heF9wb3J0cyA9IDE2LAogCS5tcF9hZ2dfcGt0X2xpbWl0ID0gOCwKLQkuc3VwcG9ydHNfc2Rpb19uZXdfbW9kZSA9IGZhbHNlLAotCS5oYXNfY29udHJvbF9tYXNrID0gdHJ1ZSwKIAkudHhfYnVmX3NpemUgPSBNV0lGSUVYX1RYX0RBVEFfQlVGX1NJWkVfMkssCiAJLm1wX3R4X2FnZ19idWZfc2l6ZSA9IE1XSUZJRVhfTVBfQUdHUl9CVUZfU0laRV8xNkssCiAJLm1wX3J4X2FnZ19idWZfc2l6ZSA9IE1XSUZJRVhfTVBfQUdHUl9CVUZfU0laRV8xNkssCi0JLnN1cHBvcnRzX2Z3X2R1bXAgPSBmYWxzZSwKLQkuYXV0b190ZGxzID0gZmFsc2UsCisJLnN1cHBvcnRzX3NkaW9fbmV3X21vZGUgPSBmYWxzZSwKKwkuaGFzX2NvbnRyb2xfbWFzayA9IHRydWUsCisJLmNhbl9kdW1wX2Z3ID0gZmFsc2UsCisJLmNhbl9hdXRvX3RkbHMgPSBmYWxzZSwKIAkuY2FuX2V4dF9zY2FuID0gdHJ1ZSwKIH07CiAKQEAgLTQ1NywxMyArNDU5LDEzIEBACiAJLnJlZyA9ICZtd2lmaWV4X3JlZ19zZDg4OTcsCiAJLm1heF9wb3J0cyA9IDMyLAogCS5tcF9hZ2dfcGt0X2xpbWl0ID0gMTYsCisJLnR4X2J1Zl9zaXplID0gTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzRLLAorCS5tcF90eF9hZ2dfYnVmX3NpemUgPSBNV0lGSUVYX01QX0FHR1JfQlVGX1NJWkVfTUFYLAorCS5tcF9yeF9hZ2dfYnVmX3NpemUgPSBNV0lGSUVYX01QX0FHR1JfQlVGX1NJWkVfTUFYLAogCS5zdXBwb3J0c19zZGlvX25ld19tb2RlID0gdHJ1ZSwKIAkuaGFzX2NvbnRyb2xfbWFzayA9IGZhbHNlLAotCS50eF9idWZfc2l6ZSA9IE1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV80SywKLQkubXBfdHhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzMySywKLQkubXBfcnhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzMySywKLQkuc3VwcG9ydHNfZndfZHVtcCA9IHRydWUsCi0JLmF1dG9fdGRscyA9IGZhbHNlLAorCS5jYW5fZHVtcF9mdyA9IHRydWUsCisJLmNhbl9hdXRvX3RkbHMgPSBmYWxzZSwKIAkuY2FuX2V4dF9zY2FuID0gdHJ1ZSwKIH07CiAKQEAgLTQ3MiwxMyArNDc0LDEzIEBACiAJLnJlZyA9ICZtd2lmaWV4X3JlZ19zZDg4ODcsCiAJLm1heF9wb3J0cyA9IDMyLAogCS5tcF9hZ2dfcGt0X2xpbWl0ID0gMTYsCi0JLnN1cHBvcnRzX3NkaW9fbmV3X21vZGUgPSB0cnVlLAotCS5oYXNfY29udHJvbF9tYXNrID0gZmFsc2UsCi0JLnR4X2J1Zl9zaXplID0gTVdJRklFWF9UWF9EQVRBX0JVRl9TSVpFXzRLLAorCS50eF9idWZfc2l6ZSA9IE1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV8ySywKIAkubXBfdHhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzMySywKIAkubXBfcnhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzMySywKLQkuc3VwcG9ydHNfZndfZHVtcCA9IGZhbHNlLAotCS5hdXRvX3RkbHMgPSB0cnVlLAorCS5zdXBwb3J0c19zZGlvX25ld19tb2RlID0gdHJ1ZSwKKwkuaGFzX2NvbnRyb2xfbWFzayA9IGZhbHNlLAorCS5jYW5fZHVtcF9mdyA9IGZhbHNlLAorCS5jYW5fYXV0b190ZGxzID0gdHJ1ZSwKIAkuY2FuX2V4dF9zY2FuID0gdHJ1ZSwKIH07CiAKQEAgLTQ5Miw4ICs0OTQsOCBAQAogCS50eF9idWZfc2l6ZSA9IE1XSUZJRVhfVFhfREFUQV9CVUZfU0laRV8ySywKIAkubXBfdHhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzE2SywKIAkubXBfcnhfYWdnX2J1Zl9zaXplID0gTVdJRklFWF9NUF9BR0dSX0JVRl9TSVpFXzE2SywKLQkuc3VwcG9ydHNfZndfZHVtcCA9IGZhbHNlLAotCS5hdXRvX3RkbHMgPSBmYWxzZSwKKwkuY2FuX2R1bXBfZncgPSBmYWxzZSwKKwkuY2FuX2F1dG9fdGRscyA9IGZhbHNlLAogCS5jYW5fZXh0X3NjYW4gPSB0cnVlLAogfTsKIApAQCAtNTcxLDkgKzU3Myw5IEBACiAKIC8qIFByZXBhcmUgdG8gY29weSBjdXJyZW50IHBhY2tldCBmcm9tIGNhcmQgdG8gU0RJTyBSeCBhZ2dyZWdhdGlvbiBidWZmZXIgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBtcF9yeF9hZ2dyX3NldHVwKHN0cnVjdCBzZGlvX21tY19jYXJkICpjYXJkLAotCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBwb3J0KQorCQkJCSAgICB1MTYgcnhfbGVuLCB1OCBwb3J0KQogewotCWNhcmQtPm1wYV9yeC5idWZfbGVuICs9IHNrYi0+bGVuOworCWNhcmQtPm1wYV9yeC5idWZfbGVuICs9IHJ4X2xlbjsKIAogCWlmICghY2FyZC0+bXBhX3J4LnBrdF9jbnQpCiAJCWNhcmQtPm1wYV9yeC5zdGFydF9wb3J0ID0gcG9ydDsKQEAgLTU4Niw4ICs1ODgsOCBAQAogCQllbHNlCiAJCQljYXJkLT5tcGFfcngucG9ydHMgfD0gMSA8PCAoY2FyZC0+bXBhX3J4LnBrdF9jbnQgKyAxKTsKIAl9Ci0JY2FyZC0+bXBhX3J4LnNrYl9hcnJbY2FyZC0+bXBhX3J4LnBrdF9jbnRdID0gc2tiOwotCWNhcmQtPm1wYV9yeC5sZW5fYXJyW2NhcmQtPm1wYV9yeC5wa3RfY250XSA9IHNrYi0+bGVuOworCWNhcmQtPm1wYV9yeC5za2JfYXJyW2NhcmQtPm1wYV9yeC5wa3RfY250XSA9IE5VTEw7CisJY2FyZC0+bXBhX3J4Lmxlbl9hcnJbY2FyZC0+bXBhX3J4LnBrdF9jbnRdID0gcnhfbGVuOwogCWNhcmQtPm1wYV9yeC5wa3RfY250Kys7CiB9CiAjZW5kaWYgLyogX01XSUZJRVhfU0RJT19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZC5jCmluZGV4IGY3ZDIwNGYuLjQ5NDIyZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZC5jCkBAIC0xMzcwLDIyICsxMzcwLDI5IEBACiAJCSAgICBzdHJ1Y3QgbXdpZmlleF9kc19tZWZfY2ZnICptZWYpCiB7CiAJc3RydWN0IGhvc3RfY21kX2RzX21lZl9jZmcgKm1lZl9jZmcgPSAmY21kLT5wYXJhbXMubWVmX2NmZzsKKwlzdHJ1Y3QgbXdpZmlleF9md19tZWZfZW50cnkgKm1lZl9lbnRyeSA9IE5VTEw7CiAJdTggKnBvcyA9ICh1OCAqKW1lZl9jZmc7CisJdTE2IGk7CiAKIAljbWQtPmNvbW1hbmQgPSBjcHVfdG9fbGUxNihIb3N0Q21kX0NNRF9NRUZfQ0ZHKTsKIAogCW1lZl9jZmctPmNyaXRlcmlhID0gY3B1X3RvX2xlMzIobWVmLT5jcml0ZXJpYSk7CiAJbWVmX2NmZy0+bnVtX2VudHJpZXMgPSBjcHVfdG9fbGUxNihtZWYtPm51bV9lbnRyaWVzKTsKIAlwb3MgKz0gc2l6ZW9mKCptZWZfY2ZnKTsKLQltZWZfY2ZnLT5tZWZfZW50cnktPm1vZGUgPSBtZWYtPm1lZl9lbnRyeS0+bW9kZTsKLQltZWZfY2ZnLT5tZWZfZW50cnktPmFjdGlvbiA9IG1lZi0+bWVmX2VudHJ5LT5hY3Rpb247Ci0JcG9zICs9IHNpemVvZigqKG1lZl9jZmctPm1lZl9lbnRyeSkpOwogCi0JaWYgKG13aWZpZXhfY21kX2FwcGVuZF9ycG5fZXhwcmVzc2lvbihwcml2LCBtZWYtPm1lZl9lbnRyeSwgJnBvcykpCi0JCXJldHVybiAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgbWVmLT5udW1fZW50cmllczsgaSsrKSB7CisJCW1lZl9lbnRyeSA9IChzdHJ1Y3QgbXdpZmlleF9md19tZWZfZW50cnkgKilwb3M7CisJCW1lZl9lbnRyeS0+bW9kZSA9IG1lZi0+bWVmX2VudHJ5W2ldLm1vZGU7CisJCW1lZl9lbnRyeS0+YWN0aW9uID0gbWVmLT5tZWZfZW50cnlbaV0uYWN0aW9uOworCQlwb3MgKz0gc2l6ZW9mKCptZWZfY2ZnLT5tZWZfZW50cnkpOwogCi0JbWVmX2NmZy0+bWVmX2VudHJ5LT5leHByc2l6ZSA9Ci0JCQljcHVfdG9fbGUxNihwb3MgLSBtZWZfY2ZnLT5tZWZfZW50cnktPmV4cHIpOworCQlpZiAobXdpZmlleF9jbWRfYXBwZW5kX3Jwbl9leHByZXNzaW9uKHByaXYsCisJCQkJCQkgICAgICAmbWVmLT5tZWZfZW50cnlbaV0sICZwb3MpKQorCQkJcmV0dXJuIC0xOworCisJCW1lZl9lbnRyeS0+ZXhwcnNpemUgPQorCQkJY3B1X3RvX2xlMTYocG9zIC0gbWVmX2VudHJ5LT5leHByKTsKKwl9CiAJY21kLT5zaXplID0gY3B1X3RvX2xlMTYoKHUxNikgKHBvcyAtICh1OCAqKW1lZl9jZmcpICsgU19EU19HRU4pOwogCiAJcmV0dXJuIDA7CkBAIC0xNjY0LDYgKzE2NzEsMjUgQEAKIAogCXJldHVybiAwOwogfQorCisvKiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIGNvbW1hbmQgb2Ygc2RpbyByeCBhZ2dyIGluZm8uICovCitzdGF0aWMgaW50IG13aWZpZXhfY21kX3NkaW9fcnhfYWdncl9jZmcoc3RydWN0IGhvc3RfY21kX2RzX2NvbW1hbmQgKmNtZCwKKwkJCQkJdTE2IGNtZF9hY3Rpb24sIHZvaWQgKmRhdGFfYnVmKQoreworCXN0cnVjdCBob3N0X2NtZF9zZGlvX3NwX3J4X2FnZ3JfY2ZnICpjZmcgPQorCQkJCQkmY21kLT5wYXJhbXMuc2Rpb19yeF9hZ2dyX2NmZzsKKworCWNtZC0+Y29tbWFuZCA9IGNwdV90b19sZTE2KEhvc3RDbWRfQ01EX1NESU9fU1BfUlhfQUdHUl9DRkcpOworCWNtZC0+c2l6ZSA9CisJCWNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgaG9zdF9jbWRfc2Rpb19zcF9yeF9hZ2dyX2NmZykgKworCQkJICAgIFNfRFNfR0VOKTsKKwljZmctPmFjdGlvbiA9IGNtZF9hY3Rpb247CisJaWYgKGNtZF9hY3Rpb24gPT0gSG9zdENtZF9BQ1RfR0VOX1NFVCkKKwkJY2ZnLT5lbmFibGUgPSAqKHU4ICopZGF0YV9idWY7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFRoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIGNvbW1hbmRzIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8gdGhlIGZpcm13YXJlLgogICoKQEAgLTE5MDEsNiArMTkyNywxMCBAQAogCQlyZXQgPSBtd2lmaWV4X2NtZF9pc3N1ZV9jaGFuX3JlcG9ydF9yZXF1ZXN0KHByaXYsIGNtZF9wdHIsCiAJCQkJCQkJICAgIGRhdGFfYnVmKTsKIAkJYnJlYWs7CisJY2FzZSBIb3N0Q21kX0NNRF9TRElPX1NQX1JYX0FHR1JfQ0ZHOgorCQlyZXQgPSBtd2lmaWV4X2NtZF9zZGlvX3J4X2FnZ3JfY2ZnKGNtZF9wdHIsIGNtZF9hY3Rpb24sCisJCQkJCQkgICBkYXRhX2J1Zik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRldl9lcnIocHJpdi0+YWRhcHRlci0+ZGV2LAogCQkJIlBSRVBfQ01EOiB1bmtub3duIGNtZC0gJSN4XG4iLCBjbWRfbm8pOwpAQCAtMTk0MCw2ICsxOTcwLDcgQEAKIAlzdHJ1Y3QgbXdpZmlleF9kc19hdXRvX2RzIGF1dG9fZHM7CiAJZW51bSBzdGF0ZV8xMWRfdCBzdGF0ZV8xMWQ7CiAJc3RydWN0IG13aWZpZXhfZHNfMTFuX3R4X2NmZyB0eF9jZmc7CisJdTggc2Rpb19zcF9yeF9hZ2dyX2VuYWJsZTsKIAogCWlmIChmaXJzdF9zdGEpIHsKIAkJaWYgKHByaXYtPmFkYXB0ZXItPmlmYWNlX3R5cGUgPT0gTVdJRklFWF9QQ0lFKSB7CkBAIC0xOTgzLDYgKzIwMTQsMjIgQEAKIAkJaWYgKHJldCkKIAkJCXJldHVybiAtMTsKIAorCQkvKiogU2V0IFNESU8gU2luZ2xlIFBvcnQgUlggQWdnciBJbmZvICovCisJCWlmIChwcml2LT5hZGFwdGVyLT5pZmFjZV90eXBlID09IE1XSUZJRVhfU0RJTyAmJgorCQkgICAgSVNTVVBQX1NESU9fU1BBX0VOQUJMRUQocHJpdi0+YWRhcHRlci0+ZndfY2FwX2luZm8pKSB7CisJCQlzZGlvX3NwX3J4X2FnZ3JfZW5hYmxlID0gdHJ1ZTsKKwkJCXJldCA9IG13aWZpZXhfc2VuZF9jbWQocHJpdiwKKwkJCQkJICAgICAgIEhvc3RDbWRfQ01EX1NESU9fU1BfUlhfQUdHUl9DRkcsCisJCQkJCSAgICAgICBIb3N0Q21kX0FDVF9HRU5fU0VULCAwLAorCQkJCQkgICAgICAgJnNkaW9fc3BfcnhfYWdncl9lbmFibGUsCisJCQkJCSAgICAgICB0cnVlKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKHByaXYtPmFkYXB0ZXItPmRldiwKKwkJCQkJImVycm9yIHdoaWxlIGVuYWJsaW5nIFNQIGFnZ3JlZ2F0aW9uLi5kaXNhYmxlIGl0Iik7CisJCQkJYWRhcHRlci0+c2Rpb19yeF9hZ2dyX2VuYWJsZSA9IGZhbHNlOworCQkJfQorCQl9CisKIAkJLyogUmVjb25maWd1cmUgdHggYnVmIHNpemUgKi8KIAkJcmV0ID0gbXdpZmlleF9zZW5kX2NtZChwcml2LCBIb3N0Q21kX0NNRF9SRUNPTkZJR1VSRV9UWF9CVUZGLAogCQkJCSAgICAgICBIb3N0Q21kX0FDVF9HRU5fU0VULCAwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfY21kcmVzcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfY21kcmVzcC5jCmluZGV4IDVmOGRhNTkuLjg4ZGM2YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZHJlc3AuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9jbWRyZXNwLmMKQEAgLTkwLDYgKzkwLDEwIEBACiAJY2FzZSBIb3N0Q21kX0NNRF9NQUNfQ09OVFJPTDoKIAkJYnJlYWs7CiAKKwljYXNlIEhvc3RDbWRfQ01EX1NESU9fU1BfUlhfQUdHUl9DRkc6CisJCWRldl9lcnIocHJpdi0+YWRhcHRlci0+ZGV2LCAiU0RJTyBSWCBzaW5nbGUtcG9ydCBhZ2dyZWdhdGlvbiBOb3Qgc3VwcG9ydFxuIik7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQpAQCAtOTQzLDYgKzk0NywyMCBAQAogCXJldHVybiAwOwogfQogCisvKiogVGhpcyBGdW5jdGlvbiBoYW5kbGVzIHRoZSBjb21tYW5kIHJlc3BvbnNlIG9mIHNkaW8gcnggYWdnciAqLworc3RhdGljIGludCBtd2lmaWV4X3JldF9zZGlvX3J4X2FnZ3JfY2ZnKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsCisJCQkJCXN0cnVjdCBob3N0X2NtZF9kc19jb21tYW5kICpyZXNwKQoreworCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOworCXN0cnVjdCBob3N0X2NtZF9zZGlvX3NwX3J4X2FnZ3JfY2ZnICpjZmcgPQorCQkJCSZyZXNwLT5wYXJhbXMuc2Rpb19yeF9hZ2dyX2NmZzsKKworCWFkYXB0ZXItPnNkaW9fcnhfYWdncl9lbmFibGUgPSBjZmctPmVuYWJsZTsKKwlhZGFwdGVyLT5zZGlvX3J4X2Jsb2NrX3NpemUgPSBsZTE2X3RvX2NwdShjZmctPmJsb2NrX3NpemUpOworCisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGNvbW1hbmQgcmVzcG9uc2VzLgogICoKQEAgLTExMjQsNiArMTE0Miw5IEBACiAJCWJyZWFrOwogCWNhc2UgSG9zdENtZF9DTURfQ0hBTl9SRVBPUlRfUkVRVUVTVDoKIAkJYnJlYWs7CisJY2FzZSBIb3N0Q21kX0NNRF9TRElPX1NQX1JYX0FHR1JfQ0ZHOgorCQlyZXQgPSBtd2lmaWV4X3JldF9zZGlvX3J4X2FnZ3JfY2ZnKHByaXYsIHJlc3ApOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgIkNNRF9SRVNQOiB1bmtub3duIGNtZCByZXNwb25zZSAlI3hcbiIsCiAJCQlyZXNwLT5jb21tYW5kKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2V2ZW50LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9ldmVudC5jCmluZGV4IDgwZmZlNzQxLi4wZGM3YTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9ldmVudC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2V2ZW50LmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogCQljZmc4MDIxMV9kaXNjb25uZWN0ZWQocHJpdi0+bmV0ZGV2LCByZWFzb25fY29kZSwgTlVMTCwgMCwKIAkJCQkgICAgICBHRlBfS0VSTkVMKTsKIAl9Ci0JbWVtc2V0KHByaXYtPmNmZ19ic3NpZCwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIocHJpdi0+Y2ZnX2Jzc2lkKTsKIAogCW13aWZpZXhfc3RvcF9uZXRfZGV2X3F1ZXVlKHByaXYtPm5ldGRldiwgYWRhcHRlcik7CiAJaWYgKG5ldGlmX2NhcnJpZXJfb2socHJpdi0+bmV0ZGV2KSkKQEAgLTMxMiw3ICszMTIsNyBAQAogCQkJCQlhZGFwdGVyLT5wc19zdGF0ZSA9IFBTX1NUQVRFX0FXQUtFOwogCQkJCQlhZGFwdGVyLT5wbV93YWtldXBfY2FyZF9yZXEgPSBmYWxzZTsKIAkJCQkJYWRhcHRlci0+cG1fd2FrZXVwX2Z3X3RyeSA9IGZhbHNlOwotCQkJCQlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+d2FrZXVwX3RpbWVyKTsKKwkJCQkJZGVsX3RpbWVyKCZhZGFwdGVyLT53YWtldXBfdGltZXIpOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQkJaWYgKCFtd2lmaWV4X3NlbmRfbnVsbF9wYWNrZXQKQEAgLTMyNyw3ICszMjcsNyBAQAogCQlhZGFwdGVyLT5wc19zdGF0ZSA9IFBTX1NUQVRFX0FXQUtFOwogCQlhZGFwdGVyLT5wbV93YWtldXBfY2FyZF9yZXEgPSBmYWxzZTsKIAkJYWRhcHRlci0+cG1fd2FrZXVwX2Z3X3RyeSA9IGZhbHNlOwotCQlkZWxfdGltZXJfc3luYygmYWRhcHRlci0+d2FrZXVwX3RpbWVyKTsKKwkJZGVsX3RpbWVyKCZhZGFwdGVyLT53YWtldXBfdGltZXIpOwogCiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3R4cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvdHhyeC5jCmluZGV4IGFjOTM1NTcuLmEyNDVmNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvdHhyeC5jCkBAIC04MCwyMyArODAsMjkgQEAKIGludCBtd2lmaWV4X3Byb2Nlc3NfdHgoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICAgIHN0cnVjdCBtd2lmaWV4X3R4X3BhcmFtICp0eF9wYXJhbSkKIHsKLQlpbnQgcmV0ID0gLTE7CisJaW50IGhyb29tLCByZXQgPSAtMTsKIAlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyID0gcHJpdi0+YWRhcHRlcjsKIAl1OCAqaGVhZF9wdHI7CiAJc3RydWN0IHR4cGQgKmxvY2FsX3R4X3BkID0gTlVMTDsKIAorCWhyb29tID0gKGFkYXB0ZXItPmlmYWNlX3R5cGUgPT0gTVdJRklFWF9VU0IpID8gMCA6IElOVEZfSEVBREVSX0xFTjsKKwogCWlmIChwcml2LT5ic3Nfcm9sZSA9PSBNV0lGSUVYX0JTU19ST0xFX1VBUCkKIAkJaGVhZF9wdHIgPSBtd2lmaWV4X3Byb2Nlc3NfdWFwX3R4cGQocHJpdiwgc2tiKTsKIAllbHNlCiAJCWhlYWRfcHRyID0gbXdpZmlleF9wcm9jZXNzX3N0YV90eHBkKHByaXYsIHNrYik7CiAKKwlpZiAoKGFkYXB0ZXItPmRhdGFfc2VudCB8fCBhZGFwdGVyLT50eF9sb2NrX2ZsYWcpICYmIGhlYWRfcHRyKSB7CisJCXNrYl9xdWV1ZV90YWlsKCZhZGFwdGVyLT50eF9kYXRhX3EsIHNrYik7CisJCWF0b21pY19pbmMoJmFkYXB0ZXItPnR4X3F1ZXVlZCk7CisJCXJldHVybiAwOworCX0KKwogCWlmIChoZWFkX3B0cikgewogCQlpZiAoR0VUX0JTU19ST0xFKHByaXYpID09IE1XSUZJRVhfQlNTX1JPTEVfU1RBKQotCQkJbG9jYWxfdHhfcGQgPQotCQkJCShzdHJ1Y3QgdHhwZCAqKSAoaGVhZF9wdHIgKyBJTlRGX0hFQURFUl9MRU4pOworCQkJbG9jYWxfdHhfcGQgPSAoc3RydWN0IHR4cGQgKikoaGVhZF9wdHIgKyBocm9vbSk7CiAJCWlmIChhZGFwdGVyLT5pZmFjZV90eXBlID09IE1XSUZJRVhfVVNCKSB7CiAJCQlhZGFwdGVyLT5kYXRhX3NlbnQgPSB0cnVlOwotCQkJc2tiX3B1bGwoc2tiLCBJTlRGX0hFQURFUl9MRU4pOwogCQkJcmV0ID0gYWRhcHRlci0+aWZfb3BzLmhvc3RfdG9fY2FyZChhZGFwdGVyLAogCQkJCQkJCSAgIE1XSUZJRVhfVVNCX0VQX0RBVEEsCiAJCQkJCQkJICAgc2tiLCBOVUxMKTsKQEAgLTE0Miw2ICsxNDgsMTIzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBtd2lmaWV4X2hvc3RfdG9fY2FyZChzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyLAorCQkJCXN0cnVjdCBza19idWZmICpza2IsCisJCQkJc3RydWN0IG13aWZpZXhfdHhfcGFyYW0gKnR4X3BhcmFtKQoreworCXN0cnVjdCB0eHBkICpsb2NhbF90eF9wZCA9IE5VTEw7CisJdTggKmhlYWRfcHRyID0gc2tiLT5kYXRhOworCWludCByZXQgPSAwOworCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXY7CisJc3RydWN0IG13aWZpZXhfdHhpbmZvICp0eF9pbmZvOworCisJdHhfaW5mbyA9IE1XSUZJRVhfU0tCX1RYQ0Ioc2tiKTsKKwlwcml2ID0gbXdpZmlleF9nZXRfcHJpdl9ieV9pZChhZGFwdGVyLCB0eF9pbmZvLT5ic3NfbnVtLAorCQkJCSAgICAgIHR4X2luZm8tPmJzc190eXBlKTsKKwlpZiAoIXByaXYpIHsKKwkJZGV2X2VycihhZGFwdGVyLT5kZXYsICJkYXRhOiBwcml2IG5vdCBmb3VuZC4gRHJvcCBUWCBwYWNrZXRcbiIpOworCQlhZGFwdGVyLT5kYmcubnVtX3R4X2hvc3RfdG9fY2FyZF9mYWlsdXJlKys7CisJCW13aWZpZXhfd3JpdGVfZGF0YV9jb21wbGV0ZShhZGFwdGVyLCBza2IsIDAsIDApOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoR0VUX0JTU19ST0xFKHByaXYpID09IE1XSUZJRVhfQlNTX1JPTEVfU1RBKSB7CisJCWlmIChhZGFwdGVyLT5pZmFjZV90eXBlID09IE1XSUZJRVhfVVNCKQorCQkJbG9jYWxfdHhfcGQgPSAoc3RydWN0IHR4cGQgKiloZWFkX3B0cjsKKwkJZWxzZQorCQkJbG9jYWxfdHhfcGQgPSAoc3RydWN0IHR4cGQgKikgKGhlYWRfcHRyICsKKwkJCQlJTlRGX0hFQURFUl9MRU4pOworCX0KKworCWlmIChhZGFwdGVyLT5pZmFjZV90eXBlID09IE1XSUZJRVhfVVNCKSB7CisJCWFkYXB0ZXItPmRhdGFfc2VudCA9IHRydWU7CisJCXJldCA9IGFkYXB0ZXItPmlmX29wcy5ob3N0X3RvX2NhcmQoYWRhcHRlciwKKwkJCQkJCSAgIE1XSUZJRVhfVVNCX0VQX0RBVEEsCisJCQkJCQkgICBza2IsIE5VTEwpOworCX0gZWxzZSB7CisJCXJldCA9IGFkYXB0ZXItPmlmX29wcy5ob3N0X3RvX2NhcmQoYWRhcHRlciwKKwkJCQkJCSAgIE1XSUZJRVhfVFlQRV9EQVRBLAorCQkJCQkJICAgc2tiLCB0eF9wYXJhbSk7CisJfQorCXN3aXRjaCAocmV0KSB7CisJY2FzZSAtRU5PU1I6CisJCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAiZGF0YTogLUVOT1NSIGlzIHJldHVybmVkXG4iKTsKKwkJYnJlYWs7CisJY2FzZSAtRUJVU1k6CisJCWlmICgoR0VUX0JTU19ST0xFKHByaXYpID09IE1XSUZJRVhfQlNTX1JPTEVfU1RBKSAmJgorCQkgICAgKGFkYXB0ZXItPnBwc191YXBzZF9tb2RlKSAmJgorCQkgICAgKGFkYXB0ZXItPnR4X2xvY2tfZmxhZykpIHsKKwkJCXByaXYtPmFkYXB0ZXItPnR4X2xvY2tfZmxhZyA9IGZhbHNlOworCQkJaWYgKGxvY2FsX3R4X3BkKQorCQkJCWxvY2FsX3R4X3BkLT5mbGFncyA9IDA7CisJCX0KKwkJc2tiX3F1ZXVlX2hlYWQoJmFkYXB0ZXItPnR4X2RhdGFfcSwgc2tiKTsKKwkJaWYgKHR4X2luZm8tPmZsYWdzICYgTVdJRklFWF9CVUZfRkxBR19BR0dSX1BLVCkKKwkJCWF0b21pY19hZGQodHhfaW5mby0+YWdncl9udW0sICZhZGFwdGVyLT50eF9xdWV1ZWQpOworCQllbHNlCisJCQlhdG9taWNfaW5jKCZhZGFwdGVyLT50eF9xdWV1ZWQpOworCQlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImRhdGE6IC1FQlVTWSBpcyByZXR1cm5lZFxuIik7CisJCWJyZWFrOworCWNhc2UgLTE6CisJCWlmIChhZGFwdGVyLT5pZmFjZV90eXBlICE9IE1XSUZJRVhfUENJRSkKKwkJCWFkYXB0ZXItPmRhdGFfc2VudCA9IGZhbHNlOworCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgIm13aWZpZXhfd3JpdGVfZGF0YV9hc3luYyBmYWlsZWQ6IDB4JVhcbiIsCisJCQlyZXQpOworCQlhZGFwdGVyLT5kYmcubnVtX3R4X2hvc3RfdG9fY2FyZF9mYWlsdXJlKys7CisJCW13aWZpZXhfd3JpdGVfZGF0YV9jb21wbGV0ZShhZGFwdGVyLCBza2IsIDAsIHJldCk7CisJCWJyZWFrOworCWNhc2UgLUVJTlBST0dSRVNTOgorCQlpZiAoYWRhcHRlci0+aWZhY2VfdHlwZSAhPSBNV0lGSUVYX1BDSUUpCisJCQlhZGFwdGVyLT5kYXRhX3NlbnQgPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQltd2lmaWV4X3dyaXRlX2RhdGFfY29tcGxldGUoYWRhcHRlciwgc2tiLCAwLCByZXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbXdpZmlleF9kZXF1ZXVlX3R4X3F1ZXVlKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnNrYl9uZXh0OworCXN0cnVjdCBtd2lmaWV4X3R4aW5mbyAqdHhfaW5mbzsKKwlzdHJ1Y3QgbXdpZmlleF90eF9wYXJhbSB0eF9wYXJhbTsKKworCXNrYiA9IHNrYl9kZXF1ZXVlKCZhZGFwdGVyLT50eF9kYXRhX3EpOworCWlmICghc2tiKQorCQlyZXR1cm4gLTE7CisKKwl0eF9pbmZvID0gTVdJRklFWF9TS0JfVFhDQihza2IpOworCWlmICh0eF9pbmZvLT5mbGFncyAmIE1XSUZJRVhfQlVGX0ZMQUdfQUdHUl9QS1QpCisJCWF0b21pY19zdWIodHhfaW5mby0+YWdncl9udW0sICZhZGFwdGVyLT50eF9xdWV1ZWQpOworCWVsc2UKKwkJYXRvbWljX2RlYygmYWRhcHRlci0+dHhfcXVldWVkKTsKKworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZhZGFwdGVyLT50eF9kYXRhX3EpKQorCQlza2JfbmV4dCA9IHNrYl9wZWVrKCZhZGFwdGVyLT50eF9kYXRhX3EpOworCWVsc2UKKwkJc2tiX25leHQgPSBOVUxMOworCXR4X3BhcmFtLm5leHRfcGt0X2xlbiA9ICgoc2tiX25leHQpID8gc2tiX25leHQtPmxlbiA6IDApOworCWlmICghdHhfcGFyYW0ubmV4dF9wa3RfbGVuKSB7CisJCWlmICghbXdpZmlleF93bW1fbGlzdHNfZW1wdHkoYWRhcHRlcikpCisJCQl0eF9wYXJhbS5uZXh0X3BrdF9sZW4gPSAxOworCX0KKwlyZXR1cm4gbXdpZmlleF9ob3N0X3RvX2NhcmQoYWRhcHRlciwgc2tiLCAmdHhfcGFyYW0pOworfQorCit2b2lkCittd2lmaWV4X3Byb2Nlc3NfdHhfcXVldWUoc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlkbyB7CisJCWlmIChhZGFwdGVyLT5kYXRhX3NlbnQgfHwgYWRhcHRlci0+dHhfbG9ja19mbGFnKQorCQkJYnJlYWs7CisJCWlmIChtd2lmaWV4X2RlcXVldWVfdHhfcXVldWUoYWRhcHRlcikpCisJCQlicmVhazsKKwl9IHdoaWxlICghc2tiX3F1ZXVlX2VtcHR5KCZhZGFwdGVyLT50eF9kYXRhX3EpKTsKK30KKwogLyoKICAqIFBhY2tldCBzZW5kIGNvbXBsZXRpb24gY2FsbGJhY2sgaGFuZGxlci4KICAqCkBAIC0xNzksOCArMzAyLDExIEBACiAJCXByaXYtPnN0YXRzLnR4X2Vycm9ycysrOwogCX0KIAotCWlmICh0eF9pbmZvLT5mbGFncyAmIE1XSUZJRVhfQlVGX0ZMQUdfQlJJREdFRF9QS1QpCisJaWYgKHR4X2luZm8tPmZsYWdzICYgTVdJRklFWF9CVUZfRkxBR19CUklER0VEX1BLVCkgewogCQlhdG9taWNfZGVjX3JldHVybigmYWRhcHRlci0+cGVuZGluZ19icmlkZ2VkX3BrdHMpOworCQlpZiAodHhfaW5mby0+ZmxhZ3MgJiBNV0lGSUVYX0JVRl9GTEFHX0FHR1JfUEtUKQorCQkJZ290byBkb25lOworCX0KIAogCWlmIChhZ2dyKQogCQkvKiBGb3Igc2tiX2FnZ3IsIGRvIG5vdCB3YWtlIHVwIHR4IHF1ZXVlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3VzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC91c2IuYwppbmRleCAyMjM4NzMwLi5mZDgwMjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3VzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvdXNiLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogCQlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImluZm86IHJlY3ZfbGVuZ3RoPSVkLCBzdGF0dXM9JWRcbiIsCiAJCQlyZWN2X2xlbmd0aCwgc3RhdHVzKTsKIAkJaWYgKHN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKLQkJCXF1ZXVlX3dvcmsoYWRhcHRlci0+d29ya3F1ZXVlLCAmYWRhcHRlci0+bWFpbl93b3JrKTsKKwkJCW13aWZpZXhfcXVldWVfbWFpbl93b3JrKGFkYXB0ZXIpOwogCiAJCQkvKiB1cmIgZm9yIGRhdGFfZXAgaXMgcmUtc3VibWl0dGVkIG5vdzsKIAkJCSAqIHVyYiBmb3IgY21kX2VwIHdpbGwgYmUgcmUtc3VibWl0dGVkIGluIGNhbGxiYWNrCkBAIC0yNjIsNyArMjYyLDcgQEAKIAkJCQkJICAgIHVyYi0+c3RhdHVzID8gLTEgOiAwKTsKIAl9CiAKLQlxdWV1ZV93b3JrKGFkYXB0ZXItPndvcmtxdWV1ZSwgJmFkYXB0ZXItPm1haW5fd29yayk7CisJbXdpZmlleF9xdWV1ZV9tYWluX3dvcmsoYWRhcHRlcik7CiAKIAlyZXR1cm47CiB9CkBAIC0xMDA2LDcgKzEwMDYsNyBAQAogewogCS8qIFNpbXVsYXRpb24gb2YgSFNfQVdBS0UgZXZlbnQgKi8KIAlhZGFwdGVyLT5wbV93YWtldXBfZndfdHJ5ID0gZmFsc2U7Ci0JZGVsX3RpbWVyX3N5bmMoJmFkYXB0ZXItPndha2V1cF90aW1lcik7CisJZGVsX3RpbWVyKCZhZGFwdGVyLT53YWtldXBfdGltZXIpOwogCWFkYXB0ZXItPnBtX3dha2V1cF9jYXJkX3JlcSA9IGZhbHNlOwogCWFkYXB0ZXItPnBzX3N0YXRlID0gUFNfU1RBVEVfQVdBS0U7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvdXRpbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC91dGlsLmMKaW5kZXggMzA4NTUwNi4uYjhhNDU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC91dGlsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC91dGlsLmMKQEAgLTM2Nyw2ICszNjcsMTMgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC0xOwogCisJaWYgKCFwcml2LT5tZ210X2ZyYW1lX21hc2sgfHwKKwkgICAgcHJpdi0+d2Rldi5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQpIHsKKwkJZGV2X2RiZyhwcml2LT5hZGFwdGVyLT5kZXYsCisJCQkiZG8gbm90IHJlY2VpdmUgbWdtdCBmcmFtZXMgb24gdW5pbml0aWFsaXplZCBpbnRmIik7CisJCXJldHVybiAtMTsKKwl9CisKIAlyeF9wZCA9IChzdHJ1Y3QgcnhwZCAqKXNrYi0+ZGF0YTsKIAogCXNrYl9wdWxsKHNrYiwgbGUxNl90b19jcHUocnhfcGQtPnJ4X3BrdF9vZmZzZXQpKTsKQEAgLTYyNCwzICs2MzEsMjYgQEAKIAlmb3IgKGl4ID0gMDsgaXggPCBNV0lGSUVYX01BWF9TSUdfU1RSRU5HVEg7IGl4KyspCiAJCWF0b21pY19zZXQoJnBoaXN0X2RhdGEtPnNpZ19zdHJbaXhdLCAwKTsKIH0KKwordm9pZCAqbXdpZmlleF9hbGxvY19kbWFfYWxpZ25fYnVmKGludCByeF9sZW4sIGdmcF90IGZsYWdzKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IGJ1Zl9sZW4sIHBhZDsKKworCWJ1Zl9sZW4gPSByeF9sZW4gKyBNV0lGSUVYX1JYX0hFQURST09NICsgTVdJRklFWF9ETUFfQUxJR05fU1o7CisKKwlza2IgPSBfX2Rldl9hbGxvY19za2IoYnVmX2xlbiwgZmxhZ3MpOworCisJaWYgKCFza2IpCisJCXJldHVybiBOVUxMOworCisJc2tiX3Jlc2VydmUoc2tiLCBNV0lGSUVYX1JYX0hFQURST09NKTsKKworCXBhZCA9IE1XSUZJRVhfQUxJR05fQUREUihza2ItPmRhdGEsIE1XSUZJRVhfRE1BX0FMSUdOX1NaKSAtCisJICAgICAgKGxvbmcpc2tiLT5kYXRhOworCisJc2tiX3Jlc2VydmUoc2tiLCBwYWQpOworCisJcmV0dXJuIHNrYjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG13aWZpZXhfYWxsb2NfZG1hX2FsaWduX2J1Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3dtbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC93bW0uYwppbmRleCBlZjcxN2FjLi5iMmU5OTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3dtbS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvd21tLmMKQEAgLTE1Nyw2ICsxNTcsOCBAQAogCiAJCXJhX2xpc3QtPmlzXzExbl9lbmFibGVkID0gMDsKIAkJcmFfbGlzdC0+dGRsc19saW5rID0gZmFsc2U7CisJCXJhX2xpc3QtPmJhX3N0YXR1cyA9IEJBX1NFVFVQX05PTkU7CisJCXJhX2xpc3QtPmFtc2R1X2luX2FtcGR1ID0gZmFsc2U7CiAJCWlmICghbXdpZmlleF9xdWV1aW5nX3JhX2Jhc2VkKHByaXYpKSB7CiAJCQlpZiAobXdpZmlleF9nZXRfdGRsc19saW5rX3N0YXR1cyhwcml2LCByYSkgPT0KIAkJCSAgICBURExTX1NFVFVQX0NPTVBMRVRFKSB7CkBAIC01NzQsNyArNTc2LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIGEgcGFydGljdWxhciBSQSBsaXN0IG5vZGUsIG1hdGNoaW5nIHdpdGggdGhlCiAgKiBnaXZlbiBUSUQgYW5kIFJBIGFkZHJlc3MuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbXdpZmlleF9yYV9saXN0X3RibCAqCitzdHJ1Y3QgbXdpZmlleF9yYV9saXN0X3RibCAqCiBtd2lmaWV4X3dtbV9nZXRfcmFsaXN0X25vZGUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggdGlkLAogCQkJICAgIGNvbnN0IHU4ICpyYV9hZGRyKQogewpAQCAtNzMwLDcgKzczMiw3IEBACiAJfSBlbHNlIHsKIAkJbWVtY3B5KHJhLCBza2ItPmRhdGEsIEVUSF9BTEVOKTsKIAkJaWYgKHJhWzBdICYgMHgwMSB8fCBtd2lmaWV4X2lzX3NrYl9tZ210X2ZyYW1lKHNrYikpCi0JCQltZW1zZXQocmEsIDB4ZmYsIEVUSF9BTEVOKTsKKwkJCWV0aF9icm9hZGNhc3RfYWRkcihyYSk7CiAJCXJhX2xpc3QgPSBtd2lmaWV4X3dtbV9nZXRfcXVldWVfcmFwdHIocHJpdiwgdGlkX2Rvd24sIHJhKTsKIAl9CiAKQEAgLTk0MiwxNCArOTQ0LDExIEBACiAJc3RydWN0IG13aWZpZXhfcmFfbGlzdF90YmwgKnB0cjsKIAlzdHJ1Y3QgbXdpZmlleF90aWRfdGJsICp0aWRfcHRyOwogCWF0b21pY190ICpocXA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnc19ic3MsIGZsYWdzX3JhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3NfcmE7CiAJaW50IGksIGo7CiAKIAkvKiBjaGVjayB0aGUgQlNTIHdpdGggaGlnaGVzdCBwcmlvcml0eSBmaXJzdCAqLwogCWZvciAoaiA9IGFkYXB0ZXItPnByaXZfbnVtIC0gMTsgaiA+PSAwOyAtLWopIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPmJzc19wcmlvX3RibFtqXS5ic3NfcHJpb19sb2NrLAotCQkJCSAgZmxhZ3NfYnNzKTsKLQogCQkvKiBpdGVyYXRlIG92ZXIgQlNTIHdpdGggdGhlIGVxdWFsIHByaW9yaXR5ICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoYWRhcHRlci0+YnNzX3ByaW9fdGJsW2pdLmJzc19wcmlvX2N1ciwKIAkJCQkgICAgJmFkYXB0ZXItPmJzc19wcmlvX3RibFtqXS5ic3NfcHJpb19oZWFkLApAQCAtOTg1LDE5ICs5ODQsMTUgQEAKIAkJCX0KIAkJfQogCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPmJzc19wcmlvX3RibFtqXS5ic3NfcHJpb19sb2NrLAotCQkJCSAgICAgICBmbGFnc19ic3MpOwogCX0KIAogCXJldHVybiBOVUxMOwogCiBmb3VuZDoKLQkvKiBob2xkcyBic3NfcHJpb19sb2NrIC8gcmFfbGlzdF9zcGlubG9jayAqLworCS8qIGhvbGRzIHJhX2xpc3Rfc3BpbmxvY2sgKi8KIAlpZiAoYXRvbWljX3JlYWQoaHFwKSA+IGkpCiAJCWF0b21pY19zZXQoaHFwLCBpKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2X3RtcC0+d21tLnJhX2xpc3Rfc3BpbmxvY2ssIGZsYWdzX3JhKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5ic3NfcHJpb190Ymxbal0uYnNzX3ByaW9fbG9jaywKLQkJCSAgICAgICBmbGFnc19ic3MpOwogCiAJKnByaXYgPSBwcml2X3RtcDsKIAkqdGlkID0gdG9zX3RvX3RpZFtpXTsKQEAgLTExNzksNiArMTE3NCwxNCBAQAogCiAJc2tiID0gc2tiX2RlcXVldWUoJnB0ci0+c2tiX2hlYWQpOwogCisJaWYgKGFkYXB0ZXItPmRhdGFfc2VudCB8fCBhZGFwdGVyLT50eF9sb2NrX2ZsYWcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+d21tLnJhX2xpc3Rfc3BpbmxvY2ssCisJCQkJICAgICAgIHJhX2xpc3RfZmxhZ3MpOworCQlza2JfcXVldWVfdGFpbCgmYWRhcHRlci0+dHhfZGF0YV9xLCBza2IpOworCQlhdG9taWNfaW5jKCZhZGFwdGVyLT50eF9xdWV1ZWQpOworCQlyZXR1cm47CisJfQorCiAJaWYgKCFza2JfcXVldWVfZW1wdHkoJnB0ci0+c2tiX2hlYWQpKQogCQlza2JfbmV4dCA9IHNrYl9wZWVrKCZwdHItPnNrYl9oZWFkKTsKIAllbHNlCkBAIC0xMjc2LDEzICsxMjc5LDEzIEBACiAJfQogCiAJaWYgKCFwdHItPmlzXzExbl9lbmFibGVkIHx8Ci0JICAgIG13aWZpZXhfaXNfYmFfc3RyZWFtX3NldHVwKHByaXYsIHB0ciwgdGlkKSB8fAotCSAgICBwcml2LT53cHMuc2Vzc2lvbl9lbmFibGUpIHsKKwkJcHRyLT5iYV9zdGF0dXMgfHwKKwkJcHJpdi0+d3BzLnNlc3Npb25fZW5hYmxlKSB7CiAJCWlmIChwdHItPmlzXzExbl9lbmFibGVkICYmCi0JCSAgICBtd2lmaWV4X2lzX2JhX3N0cmVhbV9zZXR1cChwcml2LCBwdHIsIHRpZCkgJiYKLQkJICAgIG13aWZpZXhfaXNfYW1zZHVfaW5fYW1wZHVfYWxsb3dlZChwcml2LCBwdHIsIHRpZCkgJiYKLQkJICAgIG13aWZpZXhfaXNfYW1zZHVfYWxsb3dlZChwcml2LCB0aWQpICYmCi0JCSAgICBtd2lmaWV4X2lzXzExbl9hZ2dyYWdhdGlvbl9wb3NzaWJsZShwcml2LCBwdHIsCisJCQlwdHItPmJhX3N0YXR1cyAmJgorCQkJcHRyLT5hbXNkdV9pbl9hbXBkdSAmJgorCQkJbXdpZmlleF9pc19hbXNkdV9hbGxvd2VkKHByaXYsIHRpZCkgJiYKKwkJCW13aWZpZXhfaXNfMTFuX2FnZ3JhZ2F0aW9uX3Bvc3NpYmxlKHByaXYsIHB0ciwKIAkJCQkJCQlhZGFwdGVyLT50eF9idWZfc2l6ZSkpCiAJCQltd2lmaWV4XzExbl9hZ2dyZWdhdGVfcGt0KHByaXYsIHB0ciwgcHRyX2luZGV4LCBmbGFncyk7CiAJCQkvKiByYV9saXN0X3NwaW5sb2NrIGhhcyBiZWVuIGZyZWVkIGluCkBAIC0xMzI5LDExICsxMzMyLDE2IEBACiBtd2lmaWV4X3dtbV9wcm9jZXNzX3R4KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJZG8gewotCQkvKiBDaGVjayBpZiBidXN5ICovCi0JCWlmIChhZGFwdGVyLT5kYXRhX3NlbnQgfHwgYWRhcHRlci0+dHhfbG9ja19mbGFnKQotCQkJYnJlYWs7Ci0KIAkJaWYgKG13aWZpZXhfZGVxdWV1ZV90eF9wYWNrZXQoYWRhcHRlcikpCiAJCQlicmVhazsKKwkJaWYgKGFkYXB0ZXItPmlmYWNlX3R5cGUgIT0gTVdJRklFWF9TRElPKSB7CisJCQlpZiAoYWRhcHRlci0+ZGF0YV9zZW50IHx8CisJCQkgICAgYWRhcHRlci0+dHhfbG9ja19mbGFnKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJaWYgKGF0b21pY19yZWFkKCZhZGFwdGVyLT50eF9xdWV1ZWQpID49CisJCQkgICAgTVdJRklFWF9NQVhfUEtUU19UWFEpCisJCQkJYnJlYWs7CisJCX0KIAl9IHdoaWxlICghbXdpZmlleF93bW1fbGlzdHNfZW1wdHkoYWRhcHRlcikpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC93bW0uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvd21tLmgKaW5kZXggNTY5YmQ3My4uNDhlY2UwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC93bW0uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3dtbS5oCkBAIC0xMjcsNCArMTI3LDYgQEAKIAkJCSAgICBjb25zdCB1OCAqcmFfYWRkcik7CiB1OCBtd2lmaWV4X3dtbV9kb3duZ3JhZGVfdGlkKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYsIHUzMiB0aWQpOwogCitzdHJ1Y3QgbXdpZmlleF9yYV9saXN0X3RibCAqbXdpZmlleF93bW1fZ2V0X3JhbGlzdF9ub2RlKHN0cnVjdCBtd2lmaWV4X3ByaXZhdGUKKwkJCQkJKnByaXYsIHU4IHRpZCwgY29uc3QgdTggKnJhX2FkZHIpOwogI2VuZGlmIC8qICFfTVdJRklFWF9XTU1fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213bDhrLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2w4ay5jCmluZGV4IGY5YjEyMTguLjk1OTIxMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213bDhrLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYwpAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKIAlzdHJ1Y3QgbXdsOGtfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwogCiAJcHJpdi0+Y2FwdHVyZV9iZWFjb24gPSBmYWxzZTsKLQltZW1zZXQocHJpdi0+Y2FwdHVyZV9ic3NpZCwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIocHJpdi0+Y2FwdHVyZV9ic3NpZCk7CiAKIAkvKgogCSAqIFVzZSBHRlBfQVRPTUlDIGFzIHJ4cV9wcm9jZXNzIGlzIGNhbGxlZCBmcm9tCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL0tjb25maWcKaW5kZXggNmQ4MzFkNC4uZjZmYTNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vS2NvbmZpZwpAQCAtMiw3ICsyLDcgQEAKIAl0cmlzdGF0ZSAiSGVybWVzIGNoaXBzZXQgODAyLjExYiBzdXBwb3J0IChPcmlub2NvL1ByaXNtMi9TeW1ib2wpIgogCWRlcGVuZHMgb24gKFBQQ19QTUFDIHx8IFBDSSB8fCBQQ01DSUEpCiAJZGVwZW5kcyBvbiBDRkc4MDIxMQotCXNlbGVjdCBDRkc4MDIxMV9XRVhUCisJc2VsZWN0IENGRzgwMjExX1dFWFRfRVhQT1JUCiAJc2VsZWN0IFdJUkVMRVNTX0VYVAogCXNlbGVjdCBXRVhUX1NQWQogCXNlbGVjdCBXRVhUX1BSSVYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vYWlycG9ydC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9haXJwb3J0LmMKaW5kZXggMGNhOGIxNC4uNzdlNmM1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9haXJwb3J0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9haXJwb3J0LmMKQEAgLTIyOCw3ICsyMjgsNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIHRoZSBBcHBsZSBBaXJwb3J0IHdpcmVsZXNzIGNhcmQuIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBNUEwvR1BMIik7CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFpcnBvcnRfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFpcnBvcnRfbWF0Y2hbXSA9IHsKIAl7CiAJLm5hbWUJCT0gInJhZGlvIiwKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby93ZXh0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3dleHQuYwppbmRleCA2YWJkYWYwLi4xZDRkYWU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3dleHQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3dleHQuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAJaWYgKGlzX3plcm9fZXRoZXJfYWRkcihhcF9hZGRyLT5zYV9kYXRhKSB8fAogCSAgICBpc19icm9hZGNhc3RfZXRoZXJfYWRkcihhcF9hZGRyLT5zYV9kYXRhKSkgewogCQlwcml2LT5ic3NpZF9maXhlZCA9IDA7Ci0JCW1lbXNldChwcml2LT5kZXNpcmVkX2Jzc2lkLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIocHJpdi0+ZGVzaXJlZF9ic3NpZCk7CiAKIAkJLyogIm9mZiIgbWVhbnMga2VlcCBleGlzdGluZyBjb25uZWN0aW9uICovCiAJCWlmIChhcF9hZGRyLT5zYV9kYXRhWzBdID09IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9md2lvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvZndpby5jCmluZGV4IDUzNjdkNTEuLjI3NTQwOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9md2lvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L2Z3aW8uYwpAQCAtNjcxLDcgKzY3MSw3IEBACiAJaWYgKGFkZHIpCiAJCW1lbWNweShyeGtleS0+bWFjLCBhZGRyLCBFVEhfQUxFTik7CiAJZWxzZQotCQltZW1zZXQocnhrZXktPm1hYywgfjAsIEVUSF9BTEVOKTsKKwkJZXRoX2Jyb2FkY2FzdF9hZGRyKHJ4a2V5LT5tYWMpOwogCiAJc3dpdGNoIChhbGdvKSB7CiAJY2FzZSBQNTRfQ1JZUFRPX1dFUDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvbWFpbi5jCmluZGV4IGI5MjUwZDcuLmU3OTY3NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L21haW4uYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQltZW1zZXQocHJpdi0+YnNzaWQsIH4wLCBFVEhfQUxFTik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKHByaXYtPmJzc2lkKTsKIAlwcml2LT5tb2RlID0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjsKIAllcnIgPSBwNTRfc2V0dXBfbWFjKHByaXYpOwogCWlmIChlcnIpIHsKQEAgLTI3NCw4ICsyNzQsOCBAQAogCQl3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgmcHJpdi0+YmVhY29uX2NvbXAsIEhaKTsKIAl9CiAJcHJpdi0+bW9kZSA9IE5MODAyMTFfSUZUWVBFX01PTklUT1I7Ci0JbWVtc2V0KHByaXYtPm1hY19hZGRyLCAwLCBFVEhfQUxFTik7Ci0JbWVtc2V0KHByaXYtPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihwcml2LT5tYWNfYWRkcik7CisJZXRoX3plcm9fYWRkcihwcml2LT5ic3NpZCk7CiAJcDU0X3NldHVwX21hYyhwcml2KTsKIAltdXRleF91bmxvY2soJnByaXYtPmNvbmZfbXV0ZXgpOwogfQpAQCAtNzk0LDcgKzc5NCw3IEBACiAJaW5pdF9jb21wbGV0aW9uKCZwcml2LT5iZWFjb25fY29tcCk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPndvcmssIHA1NF93b3JrKTsKIAotCW1lbXNldCgmcHJpdi0+bWNfbWFjbGlzdFswXSwgfjAsIEVUSF9BTEVOKTsKKwlldGhfYnJvYWRjYXN0X2FkZHIocHJpdi0+bWNfbWFjbGlzdFswXSk7CiAJcHJpdi0+Y3VyY2hhbiA9IE5VTEw7CiAJcDU0X3Jlc2V0X3N0YXRzKHByaXYpOwogCXJldHVybiBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCmluZGV4IDgzMzBmYTMuLjQ3N2Y4NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheV9jcy5jCkBAIC04MDgsNyArODA4LDcgQEAKIAogCS8qIGNvcHkgbWFjIGFuZCBicm9hZGNhc3QgYWRkcmVzc2VzIHRvIGxpbnV4IGRldmljZSAqLwogCW1lbWNweShkZXYtPmRldl9hZGRyLCAmbG9jYWwtPnNwYXJtLmI0LmFfbWFjX2FkZHIsIEFERFJMRU4pOwotCW1lbXNldChkZXYtPmJyb2FkY2FzdCwgMHhmZiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcihkZXYtPmJyb2FkY2FzdCk7CiAKIAlkZXZfZGJnKCZsaW5rLT5kZXYsICJyYXlfZGV2X2luaXQgZW5kaW5nXG4iKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYwppbmRleCA2MGQ0NGNlLi5kNzJmZjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ybmRpc193bGFuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jCkBAIC0xOTksMTMgKzE5OSwxMyBAQAogCiBzdHJ1Y3QgbmRpc184MDIxMV9hdXRoX3JlcXVlc3QgewogCV9fbGUzMiBsZW5ndGg7Ci0JdTggYnNzaWRbNl07CisJdTggYnNzaWRbRVRIX0FMRU5dOwogCXU4IHBhZGRpbmdbMl07CiAJX19sZTMyIGZsYWdzOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IG5kaXNfODAyMTFfcG1raWRfY2FuZGlkYXRlIHsKLQl1OCBic3NpZFs2XTsKKwl1OCBic3NpZFtFVEhfQUxFTl07CiAJdTggcGFkZGluZ1syXTsKIAlfX2xlMzIgZmxhZ3M7CiB9IF9fcGFja2VkOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAKIHN0cnVjdCBuZGlzXzgwMjExX2Jzc2lkX2V4IHsKIAlfX2xlMzIgbGVuZ3RoOwotCXU4IG1hY1s2XTsKKwl1OCBtYWNbRVRIX0FMRU5dOwogCXU4IHBhZGRpbmdbMl07CiAJc3RydWN0IG5kaXNfODAyMTFfc3NpZCBzc2lkOwogCV9fbGUzMiBwcml2YWN5OwpAQCAtMjgzLDcgKzI4Myw3IEBACiAJX19sZTMyIHNpemU7CiAJX19sZTMyIGluZGV4OwogCV9fbGUzMiBsZW5ndGg7Ci0JdTggYnNzaWRbNl07CisJdTggYnNzaWRbRVRIX0FMRU5dOwogCXU4IHBhZGRpbmdbNl07CiAJdTggcnNjWzhdOwogCXU4IG1hdGVyaWFsWzMyXTsKQEAgLTI5Miw3ICsyOTIsNyBAQAogc3RydWN0IG5kaXNfODAyMTFfcmVtb3ZlX2tleSB7CiAJX19sZTMyIHNpemU7CiAJX19sZTMyIGluZGV4OwotCXU4IGJzc2lkWzZdOworCXU4IGJzc2lkW0VUSF9BTEVOXTsKIAl1OCBwYWRkaW5nWzJdOwogfSBfX3BhY2tlZDsKIApAQCAtMzEwLDcgKzMxMCw3IEBACiAJc3RydWN0IHJlcV9pZSB7CiAJCV9fbGUxNiBjYXBhOwogCQlfX2xlMTYgbGlzdGVuX2ludGVydmFsOwotCQl1OCBjdXJfYXBfYWRkcmVzc1s2XTsKKwkJdTggY3VyX2FwX2FkZHJlc3NbRVRIX0FMRU5dOwogCX0gcmVxX2llOwogCV9fbGUzMiByZXFfaWVfbGVuZ3RoOwogCV9fbGUzMiBvZmZzZXRfcmVxX2llczsKQEAgLTMzOCw3ICszMzgsNyBAQAogfSBfX3BhY2tlZDsKIAogc3RydWN0IG5kaXNfODAyMTFfYnNzaWRfaW5mbyB7Ci0JdTggYnNzaWRbNl07CisJdTggYnNzaWRbRVRIX0FMRU5dOwogCXU4IHBta2lkWzE2XTsKIH0gX19wYWNrZWQ7CiAKQEAgLTEwMzcsNyArMTAzNyw3IEBACiAJCQkgICAgICBic3NpZCwgJmxlbik7CiAKIAlpZiAocmV0ICE9IDApCi0JCW1lbXNldChic3NpZCwgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKGJzc2lkKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xMzkxLDcgKzEzOTEsNyBAQAogCXByaXYtPmVuY3Jfa2V5c1tpbmRleF0ubGVuID0ga2V5X2xlbjsKIAlwcml2LT5lbmNyX2tleXNbaW5kZXhdLmNpcGhlciA9IGNpcGhlcjsKIAltZW1jcHkoJnByaXYtPmVuY3Jfa2V5c1tpbmRleF0ubWF0ZXJpYWwsIGtleSwga2V5X2xlbik7Ci0JbWVtc2V0KCZwcml2LT5lbmNyX2tleXNbaW5kZXhdLmJzc2lkLCAweGZmLCBFVEhfQUxFTik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKHByaXYtPmVuY3Jfa2V5c1tpbmRleF0uYnNzaWQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNDY2LDcgKzE0NjYsNyBAQAogCX0gZWxzZSB7CiAJCS8qIGdyb3VwIGtleSAqLwogCQlpZiAocHJpdi0+aW5mcmFfbW9kZSA9PSBORElTXzgwMjExX0lORlJBX0FESE9DKQotCQkJbWVtc2V0KG5kaXNfa2V5LmJzc2lkLCAweGZmLCBFVEhfQUxFTik7CisJCQlldGhfYnJvYWRjYXN0X2FkZHIobmRpc19rZXkuYnNzaWQpOwogCQllbHNlCiAJCQlnZXRfYnNzaWQodXNiZGV2LCBuZGlzX2tleS5ic3NpZCk7CiAJfQpAQCAtMTQ4Niw3ICsxNDg2LDcgQEAKIAlpZiAoZmxhZ3MgJiBORElTXzgwMjExX0FEREtFWV9QQUlSV0lTRV9LRVkpCiAJCW1lbWNweSgmcHJpdi0+ZW5jcl9rZXlzW2luZGV4XS5ic3NpZCwgbmRpc19rZXkuYnNzaWQsIEVUSF9BTEVOKTsKIAllbHNlCi0JCW1lbXNldCgmcHJpdi0+ZW5jcl9rZXlzW2luZGV4XS5ic3NpZCwgMHhmZiwgRVRIX0FMRU4pOworCQlldGhfYnJvYWRjYXN0X2FkZHIocHJpdi0+ZW5jcl9rZXlzW2luZGV4XS5ic3NpZCk7CiAKIAlpZiAoZmxhZ3MgJiBORElTXzgwMjExX0FEREtFWV9UUkFOU01JVF9LRVkpCiAJCXByaXYtPmVuY3JfdHhfa2V5X2luZGV4ID0gaW5kZXg7CkBAIC0yMjgwLDcgKzIyODAsNyBAQAogCW5ldGRldl9kYmcodXNiZGV2LT5uZXQsICJjZmc4MDIxMS5kaXNjb25uZWN0KCVkKVxuIiwgcmVhc29uX2NvZGUpOwogCiAJcHJpdi0+Y29ubmVjdGVkID0gZmFsc2U7Ci0JbWVtc2V0KHByaXYtPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihwcml2LT5ic3NpZCk7CiAKIAlyZXR1cm4gZGVhdXRoZW50aWNhdGUodXNiZGV2KTsKIH0KQEAgLTIzOTIsNyArMjM5Miw3IEBACiAJbmV0ZGV2X2RiZyh1c2JkZXYtPm5ldCwgImNmZzgwMjExLmxlYXZlX2lic3MoKVxuIik7CiAKIAlwcml2LT5jb25uZWN0ZWQgPSBmYWxzZTsKLQltZW1zZXQocHJpdi0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKHByaXYtPmJzc2lkKTsKIAogCXJldHVybiBkZWF1dGhlbnRpY2F0ZSh1c2JkZXYpOwogfQpAQCAtMjg1Nyw3ICsyODU3LDcgQEAKIAogCWlmIChwcml2LT5jb25uZWN0ZWQpIHsKIAkJcHJpdi0+Y29ubmVjdGVkID0gZmFsc2U7Ci0JCW1lbXNldChwcml2LT5ic3NpZCwgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKHByaXYtPmJzc2lkKTsKIAogCQlkZWF1dGhlbnRpY2F0ZSh1c2JkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMKaW5kZXggODQ0NDMxMy4uNmVjMjQ2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuYwpAQCAtMjMzLDYgKzIzMyw3IEBACiB7CiAJX19sZTMyICpyZWc7CiAJdTMyIGZ3X21vZGU7CisJaW50IHJldDsKIAogCXJlZyA9IGttYWxsb2Moc2l6ZW9mKCpyZWcpLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVnID09IE5VTEwpCkBAIC0yNDIsMTEgKzI0MywxNCBAQAogCSAqIG1hZ2ljIHZhbHVlIFVTQl9NT0RFX0FVVE9SVU4gKDB4MTEpIHRvIHRoZSBkZXZpY2UsIHRodXMgdGhlCiAJICogcmV0dXJuZWQgdmFsdWUgd291bGQgYmUgaW52YWxpZC4KIAkgKi8KLQlydDJ4MDB1c2JfdmVuZG9yX3JlcXVlc3QocnQyeDAwZGV2LCBVU0JfREVWSUNFX01PREUsCi0JCQkJIFVTQl9WRU5ET1JfUkVRVUVTVF9JTiwgMCwgVVNCX01PREVfQVVUT1JVTiwKLQkJCQkgcmVnLCBzaXplb2YoKnJlZyksIFJFR0lTVEVSX1RJTUVPVVRfRklSTVdBUkUpOworCXJldCA9IHJ0MngwMHVzYl92ZW5kb3JfcmVxdWVzdChydDJ4MDBkZXYsIFVTQl9ERVZJQ0VfTU9ERSwKKwkJCQkgICAgICAgVVNCX1ZFTkRPUl9SRVFVRVNUX0lOLCAwLAorCQkJCSAgICAgICBVU0JfTU9ERV9BVVRPUlVOLCByZWcsIHNpemVvZigqcmVnKSwKKwkJCQkgICAgICAgUkVHSVNURVJfVElNRU9VVF9GSVJNV0FSRSk7CiAJZndfbW9kZSA9IGxlMzJfdG9fY3B1KCpyZWcpOwogCWtmcmVlKHJlZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlpZiAoKGZ3X21vZGUgJiAweDAwMDAwMDAzKSA9PSAyKQogCQlyZXR1cm4gMTsKQEAgLTI4OSw2ICsyOTMsNyBAQAogCWlmIChyZXR2YWwpIHsKIAkJcnQyeDAwX2luZm8ocnQyeDAwZGV2LAogCQkJICAgICJGaXJtd2FyZSBsb2FkaW5nIG5vdCByZXF1aXJlZCAtIE5JQyBpbiBBdXRvUnVuIG1vZGVcbiIpOworCQlfX2NsZWFyX2JpdChSRVFVSVJFX0ZJUk1XQVJFLCAmcnQyeDAwZGV2LT5jYXBfZmxhZ3MpOwogCX0gZWxzZSB7CiAJCXJ0MngwMHVzYl9yZWdpc3Rlcl9tdWx0aXdyaXRlKHJ0MngwMGRldiwgRklSTVdBUkVfSU1BR0VfQkFTRSwKIAkJCQkJICAgICAgZGF0YSArIG9mZnNldCwgbGVuZ3RoKTsKQEAgLTM3NCw3ICszNzksNiBAQAogc3RhdGljIHZvaWQgcnQyODAwdXNiX2Rpc2FibGVfcmFkaW8oc3RydWN0IHJ0MngwMF9kZXYgKnJ0MngwMGRldikKIHsKIAlydDI4MDBfZGlzYWJsZV9yYWRpbyhydDJ4MDBkZXYpOwotCXJ0MngwMHVzYl9kaXNhYmxlX3JhZGlvKHJ0MngwMGRldik7CiB9CiAKIHN0YXRpYyBpbnQgcnQyODAwdXNiX3NldF9zdGF0ZShzdHJ1Y3QgcnQyeDAwX2RldiAqcnQyeDAwZGV2LApAQCAtMTA0MCw2ICsxMDQ0LDcgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwN2QxLCAweDNjMTcpIH0sCiAJeyBVU0JfREVWSUNFKDB4MjAwMSwgMHgzMzE3KSB9LAogCXsgVVNCX0RFVklDRSgweDIwMDEsIDB4M2MxYikgfSwKKwl7IFVTQl9ERVZJQ0UoMHgyMDAxLCAweDNjMjUpIH0sCiAJLyogRHJheXRlayAqLwogCXsgVVNCX0RFVklDRSgweDA3ZmEsIDB4NzcxMikgfSwKIAkvKiBEVklDTyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHVzYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHVzYi5oCmluZGV4IDhmODVmYmQuLjU2OTM2M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDB1c2IuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwdXNiLmgKQEAgLTE5OSw3ICsxOTksNyBAQAogCQkJCQkgICBjb25zdCB1bnNpZ25lZCBpbnQgb2Zmc2V0LAogCQkJCQkgICB1MzIgKnZhbHVlKQogewotCV9fbGUzMiByZWc7CisJX19sZTMyIHJlZyA9IDA7CiAJcnQyeDAwdXNiX3ZlbmRvcl9yZXF1ZXN0X2J1ZmYocnQyeDAwZGV2LCBVU0JfTVVMVElfUkVBRCwKIAkJCQkgICAgICBVU0JfVkVORE9SX1JFUVVFU1RfSU4sIG9mZnNldCwKIAkJCQkgICAgICAmcmVnLCBzaXplb2YocmVnKSk7CkBAIC0yMTksNyArMjE5LDcgQEAKIAkJCQkJCWNvbnN0IHVuc2lnbmVkIGludCBvZmZzZXQsCiAJCQkJCQl1MzIgKnZhbHVlKQogewotCV9fbGUzMiByZWc7CisJX19sZTMyIHJlZyA9IDA7CiAJcnQyeDAwdXNiX3ZlbmRvcl9yZXFfYnVmZl9sb2NrKHJ0MngwMGRldiwgVVNCX01VTFRJX1JFQUQsCiAJCQkJICAgICAgIFVTQl9WRU5ET1JfUkVRVUVTVF9JTiwgb2Zmc2V0LAogCQkJCSAgICAgICAmcmVnLCBzaXplb2YocmVnKSwgUkVHSVNURVJfVElNRU9VVCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvYmFzZS5jCmluZGV4IDFkNDY3NzQuLjAxZjU2YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvYmFzZS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvYmFzZS5jCkBAIC0xMzE1LDcgKzEzMTUsOCBAQAogfQogCiAvKnNob3VsZCBjYWxsIGJlZm9yZSBzb2Z0d2FyZSBlbmMqLwotdTggcnRsX2lzX3NwZWNpYWxfZGF0YShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggaXNfdHgpCit1OCBydGxfaXNfc3BlY2lhbF9kYXRhKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBpc190eCwKKwkJICAgICAgIGJvb2wgaXNfZW5jKQogewogCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKQEAgLTEzNDQsNyArMTM0NSw5IEBACiAJCWJyZWFrOwogCX0KIAotCW9mZnNldCA9IG1hY19oZHJfbGVuICsgU05BUF9TSVpFICsgZW5jcnlwdF9oZWFkZXJfbGVuOworCW9mZnNldCA9IG1hY19oZHJfbGVuICsgU05BUF9TSVpFOworCWlmIChpc19lbmMpCisJCW9mZnNldCArPSBlbmNyeXB0X2hlYWRlcl9sZW47CiAJZXRoZXJfdHlwZSA9IGJlMTZfdG9fY3B1cCgoX19iZTE2ICopKHNrYi0+ZGF0YSArIG9mZnNldCkpOwogCiAJaWYgKEVUSF9QX0lQID09IGV0aGVyX3R5cGUpIHsKQEAgLTEzODYsOCArMTM4OSwxMSBAQAogCQl9CiAKIAkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIGlmICgweDg2REQgPT0gZXRoZXJfdHlwZSkgewotCQlyZXR1cm4gdHJ1ZTsKKwl9IGVsc2UgaWYgKEVUSF9QX0lQVjYgPT0gZXRoZXJfdHlwZSkgeworCQkvKiBUT0RPOiBIYW5kbGUgYW55IElQdjYgY2FzZXMgdGhhdCBuZWVkIHNwZWNpYWwgaGFuZGxpbmcuCisJCSAqIEZvciBub3csIGFsd2F5cyByZXR1cm4gZmFsc2UKKwkJICovCisJCWdvdG8gZW5kOwogCX0KIAogZW5kOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9iYXNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuaAppbmRleCBjNmNiNDljLi43NDIzM2Q2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuaApAQCAtNDUsOSArNDUsNiBAQAogI2RlZmluZSBSVExfVFhfREVTQ19TSVpFCTMyCiAjZGVmaW5lIFJUTF9UWF9IRUFERVJfU0laRQkoUlRMX1RYX0RFU0NfU0laRSArIFJUTF9UWF9EVU1NWV9TSVpFKQogCi0jZGVmaW5lIEhUX0FNU0RVX1NJWkVfNEsJMzgzOQotI2RlZmluZSBIVF9BTVNEVV9TSVpFXzhLCTc5MzUKLQogI2RlZmluZSBNQVhfQklUX1JBVEVfNDBNSFpfTUNTMTUJMzAwCS8qIE1icHMgKi8KICNkZWZpbmUgTUFYX0JJVF9SQVRFXzQwTUhaX01DUzcJCTE1MAkvKiBNYnBzICovCiAKQEAgLTYxLDkgKzU4LDYgQEAKICNkZWZpbmUgTUFYX0JJVF9SQVRFX0xPTkdfR0lfMU5TU184ME1IWl9NQ1M5CTM5MAkvKiBNYnBzICovCiAjZGVmaW5lIE1BWF9CSVRfUkFURV9MT05HX0dJXzFOU1NfODBNSFpfTUNTNwkyOTMJLyogTWJwcyAqLwogCi0jZGVmaW5lIFJUTF9SQVRFX0NPVU5UX0xFR0FDWQkJMTIKLSNkZWZpbmUgUlRMX0NIQU5ORUxfQ09VTlQJCTE0Ci0KICNkZWZpbmUgRlJBTUVfT0ZGU0VUX0ZSQU1FX0NPTlRST0wJMAogI2RlZmluZSBGUkFNRV9PRkZTRVRfRFVSQVRJT04JCTIKICNkZWZpbmUgRlJBTUVfT0ZGU0VUX0FERFJFU1MxCQk0CkBAIC0xMjYsMTAgKzEyMCwxMCBAQAogaW50IHJ0bHdpZmlfcmF0ZV9tYXBwaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGlzaHQsCiAJCQkgYm9vbCBpc3ZodCwgdTggZGVzY19yYXRlKTsKIGJvb2wgcnRsX3R4X21nbXRfcHJvYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci11OCBydGxfaXNfc3BlY2lhbF9kYXRhKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBpc190eCk7Cit1OCBydGxfaXNfc3BlY2lhbF9kYXRhKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1OCBpc190eCwKKwkJICAgICAgIGJvb2wgaXNfZW5jKTsKIAogdm9pZCBydGxfYmVhY29uX3N0YXRpc3RpYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci12b2lkIHJ0bF93YXRjaF9kb2dfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKIGludCBydGxfdHhfYWdnX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqc3NuKTsKIGludCBydGxfdHhfYWdnX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NhbS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jYW0uaAppbmRleCAzNTUwODA4Li5lMmU2NDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NhbS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvY2FtLmgKQEAgLTI4LDEzICsyOCwxMSBAQAogCiAjZGVmaW5lIENBTV9DT05URU5UX0NPVU5UCQkJCTgKIAotI2RlZmluZSBDRkdfREVGQVVMVF9LRVkJCQkJCUJJVCg1KQogI2RlZmluZSBDRkdfVkFMSUQJCQkJCUJJVCgxNSkKIAogI2RlZmluZSBQQUlSV0lTRV9LRVlJRFgJCQkJCTAKICNkZWZpbmUgQ0FNX1BBSVJXSVNFX0tFWV9QT1NJVElPTgkJCTQKIAotI2RlZmluZQlDQU1fQ09ORklHX1VTRURLCQkJCTEKICNkZWZpbmUJQ0FNX0NPTkZJR19OT19VU0VESwkJCQkwCiAKIHZvaWQgcnRsX2NhbV9yZXNldF9hbGxfZW50cnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jb3JlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NvcmUuYwppbmRleCBhMzFhMTI3Li4zYjNhODhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2NvcmUuYwpAQCAtMTk1LDcgKzE5NSw3IEBACiAJaWYgKCEoc3VwcG9ydF9yZW1vdGVfd2FrZXVwICYmCiAJICAgICAgcnRsaGFsLT5lbnRlcl9wbnBfc2xlZXApKSB7CiAJCW1hYy0+bGlua19zdGF0ZSA9IE1BQzgwMjExX05PTElOSzsKLQkJbWVtc2V0KG1hYy0+YnNzaWQsIDAsIDYpOworCQlldGhfemVyb19hZGRyKG1hYy0+YnNzaWQpOwogCQltYWMtPnZlbmRvciA9IFBFRVJfVU5LTk9XTjsKIAogCQkvKiByZXNldCBzZWMgaW5mbyAqLwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJbWFjLT5wMnAgPSAwOwogCW1hYy0+dmlmID0gTlVMTDsKIAltYWMtPmxpbmtfc3RhdGUgPSBNQUM4MDIxMV9OT0xJTks7Ci0JbWVtc2V0KG1hYy0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKG1hYy0+YnNzaWQpOwogCW1hYy0+dmVuZG9yID0gUEVFUl9VTktOT1dOOwogCW1hYy0+b3Btb2RlID0gTkw4MDIxMV9JRlRZUEVfVU5TUEVDSUZJRUQ7CiAJcnRscHJpdi0+Y2ZnLT5vcHMtPnNldF9uZXR3b3JrX3R5cGUoaHcsIG1hYy0+b3Btb2RlKTsKQEAgLTExNTcsNyArMTE1Nyw3IEBACiAJCQlpZiAocHBzYy0+cDJwX3BzX2luZm8ucDJwX3BzX21vZGUgPiBQMlBfUFNfTk9ORSkKIAkJCQlydGxfcDJwX3BzX2NtZChodywgUDJQX1BTX0RJU0FCTEUpOwogCQkJbWFjLT5saW5rX3N0YXRlID0gTUFDODAyMTFfTk9MSU5LOwotCQkJbWVtc2V0KG1hYy0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwkJCWV0aF96ZXJvX2FkZHIobWFjLT5ic3NpZCk7CiAJCQltYWMtPnZlbmRvciA9IFBFRVJfVU5LTk9XTjsKIAkJCW1hYy0+bW9kZSA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jb3JlLmgKaW5kZXggN2I2NGUzNC4uODI3MzNjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jb3JlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9jb3JlLmgKQEAgLTMzLDggKzMzLDYgQEAKIAlGSUZfRkNTRkFJTCB8IFwKIAlGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQykKIAotI2RlZmluZSBSVExfU1VQUE9SVEVEX0NUUkxfRklMVEVSCTB4RkYKLQogI2RlZmluZSBETV9ESUdfVEhSRVNIX0hJR0gJCTQwCiAjZGVmaW5lIERNX0RJR19USFJFU0hfTE9XCQkzNQogI2RlZmluZSBETV9GQUxTRUFMQVJNX1RIUkVTSF9MT1cJNDAwCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2VmdXNlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2VmdXNlLmgKaW5kZXggZmRhYjgyNC4uYmUwMmU3OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9lZnVzZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvZWZ1c2UuaApAQCAtNDAsMTIgKzQwLDYgQEAKICNkZWZpbmUgUEdfU1RBVEVfV09SRF8zCQkJMHgxMAogI2RlZmluZSBQR19TVEFURV9EQVRBCQkJMHgyMAogCi0jZGVmaW5lIFBHX1NXQllURV9ICQkJMHgwMQotI2RlZmluZSBQR19TV0JZVEVfTAkJCTB4MDIKLQotI2RlZmluZSBfUE9XRVJPTl9ERUxBWV8KLSNkZWZpbmUgX1BSRV9FWEVDVVRFX1JFQURfQ01EXwotCiAjZGVmaW5lIEVGVVNFX1JFUEVBVF9USFJFU0hPTERfCQkzCiAjZGVmaW5lIEVGVVNFX0VSUk9FX0hBTkRMRQkJMQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuYwppbmRleCBhNjIxNzBlLi5mNDZjOWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcGNpLmMKQEAgLTg4Nyw3ICs4ODcsNyBAQAogCQkJCXVuaWNhc3QgPSB0cnVlOwogCQkJCXJ0bHByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0ICs9IHNrYi0+bGVuOwogCQkJfQotCQkJcnRsX2lzX3NwZWNpYWxfZGF0YShodywgc2tiLCBmYWxzZSk7CisJCQlydGxfaXNfc3BlY2lhbF9kYXRhKGh3LCBza2IsIGZhbHNlLCB0cnVlKTsKIAogCQkJaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgewogCQkJCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywgTEVEX0NUTF9SWCk7CkBAIC0xMTI0LDEyICsxMTI0LDIyIEBACiAJLypUaGlzIGlzIGZvciBuZXcgdHJ4IGZsb3cqLwogCXN0cnVjdCBydGxfdHhfYnVmZmVyX2Rlc2MgKnBidWZmZXJfZGVzYyA9IE5VTEw7CiAJdTggdGVtcF9vbmUgPSAxOworCXU4ICplbnRyeTsKIAogCW1lbXNldCgmdGNiX2Rlc2MsIDAsIHNpemVvZihzdHJ1Y3QgcnRsX3RjYl9kZXNjKSk7CiAJcmluZyA9ICZydGxwY2ktPnR4X3JpbmdbQkVBQ09OX1FVRVVFXTsKIAlwc2tiID0gX19za2JfZGVxdWV1ZSgmcmluZy0+cXVldWUpOwotCWlmIChwc2tiKQorCWlmIChydGxwcml2LT51c2VfbmV3X3RyeF9mbG93KQorCQllbnRyeSA9ICh1OCAqKSgmcmluZy0+YnVmZmVyX2Rlc2NbcmluZy0+aWR4XSk7CisJZWxzZQorCQllbnRyeSA9ICh1OCAqKSgmcmluZy0+ZGVzY1tyaW5nLT5pZHhdKTsKKwlpZiAocHNrYikgeworCQlwY2lfdW5tYXBfc2luZ2xlKHJ0bHBjaS0+cGRldiwKKwkJCQkgcnRscHJpdi0+Y2ZnLT5vcHMtPmdldF9kZXNjKAorCQkJCSAodTggKillbnRyeSwgdHJ1ZSwgSFdfREVTQ19UWEJVRkZfQUREUiksCisJCQkJIHBza2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CiAJCWtmcmVlX3NrYihwc2tiKTsKKwl9CiAKIAkvKk5COiB0aGUgYmVhY29uIGRhdGEgYnVmZmVyIG11c3QgYmUgMzItYml0IGFsaWduZWQuICovCiAJcHNrYiA9IGllZWU4MDIxMV9iZWFjb25fZ2V0KGh3LCBtYWMtPnZpZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3JjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3JjLmMKaW5kZXggNzg2M2JkMi4uNzRjMTRjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9yYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcmMuYwpAQCAtNTYsNyArNTYsOCBAQAogCQl3aXJlbGVzc19tb2RlID0gc3RhX2VudHJ5LT53aXJlbGVzc19tb2RlOwogCX0KIAotCWlmIChydGxfaXNfc3BlY2lhbF9kYXRhKHJ0bHByaXYtPm1hYzgwMjExLmh3LCBza2IsIHRydWUpIHx8IG5vdF9kYXRhKSB7CisJaWYgKHJ0bF9pc19zcGVjaWFsX2RhdGEocnRscHJpdi0+bWFjODAyMTEuaHcsIHNrYiwgdHJ1ZSwgZmFsc2UpIHx8CisJICAgIG5vdF9kYXRhKSB7CiAJCXJldHVybiAwOwogCX0gZWxzZSB7CiAJCWlmIChydGxoYWwtPmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl8yXzRHKSB7CkBAIC0yMDEsNyArMjAyLDcgQEAKIAlpZiAoIXByaXZfc3RhIHx8ICFpZWVlODAyMTFfaXNfZGF0YShmYykpCiAJCXJldHVybjsKIAotCWlmIChydGxfaXNfc3BlY2lhbF9kYXRhKG1hYy0+aHcsIHNrYiwgdHJ1ZSkpCisJaWYgKHJ0bF9pc19zcGVjaWFsX2RhdGEobWFjLT5odywgc2tiLCB0cnVlLCB0cnVlKSkKIAkJcmV0dXJuOwogCiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGllZWU4MDIxMV9nZXRfREEoaGRyKSkgfHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE4OGVlL2RlZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTg4ZWUvZGVmLmgKaW5kZXggZDllYTlkMC4uMDUzMmI5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTg4ZWUvZGVmLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTg4ZWUvZGVmLmgKQEAgLTI2LDUzICsyNiwxMiBAQAogI2lmbmRlZiBfX1JUTDkyQ19ERUZfSF9fCiAjZGVmaW5lIF9fUlRMOTJDX0RFRl9IX18KIAotI2RlZmluZSBIQUxfUkVUUllfTElNSVRfSU5GUkEJCQkJNDgKLSNkZWZpbmUgSEFMX1JFVFJZX0xJTUlUX0FQX0FESE9DCQkJNwotCi0jZGVmaW5lIFJFU0VUX0RFTEFZXzgxODUJCQkJMjAKLQotI2RlZmluZSBSVF9JQlNTX0lOVF9NQVNLUwkoSU1SX0JDTklOVCB8IElNUl9UQkRPSyB8IElNUl9UQkRFUikKLSNkZWZpbmUgUlRfQUNfSU5UX01BU0tTCQkoSU1SX1ZJRE9LIHwgSU1SX1ZPRE9LIHwgSU1SX0JFRE9LfElNUl9CS0RPSykKLQotI2RlZmluZSBOVU1fT0ZfRklSTVdBUkVfUVVFVUUJCQkJMTAKLSNkZWZpbmUgTlVNX09GX1BBR0VTX0lOX0ZXCQkJCTB4MTAwCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JLCQkJMHgwNwotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CRQkJCTB4MDcKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVkkJCQkweDA3Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZPCQkJMHgwNwotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9IQ0NBCQkJMHgwCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0NNRAkJCTB4MAotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9NR05UCQkJMHgwMgotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9ISUdICQkJMHgwMgotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CQ04JCQkweDIKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfUFVCCQkJMHhBMQotCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JLX0RUTQkJCTB4MDI2Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JFX0RUTQkJCTB4MDQ4Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZJX0RUTQkJCTB4MDQ4Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZPX0RUTQkJCTB4MDI2Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1BVQl9EVE0JCQkweDAwCi0KLSNkZWZpbmUgTUFYX0xJTkVTX0hXQ09ORklHX1RYVAkJCQkxMDAwCi0jZGVmaW5lIE1BWF9CWVRFU19MSU5FX0hXQ09ORklHX1RYVAkJCTI1NgotCi0jZGVmaW5lIFNXX1RIUkVFX1dJUkUJCQkJCTAKLSNkZWZpbmUgSFdfVEhSRUVfV0lSRQkJCQkJMgotCi0jZGVmaW5lIEJUX0RFTU9fQk9BUkQJCQkJCTAKLSNkZWZpbmUgQlRfUUFfQk9BUkQJCQkJCTEKLSNkZWZpbmUgQlRfRlBHQQkJCQkJCTIKLQogI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFCQkJMAogI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIJCQkxCiAjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUgkJCTIKIAotI2RlZmluZSBNQVhfSDJDX1FVRVVFX05VTQkJCQkxMAotCiAjZGVmaW5lIFJYX01QRFVfUVVFVUUJCQkJCTAKICNkZWZpbmUgUlhfQ01EX1FVRVVFCQkJCQkxCi0jZGVmaW5lIFJYX01BWF9RVUVVRQkJCQkJMgotI2RlZmluZSBBQzJRVUVVRUlEKF9BQykJCQkJCShfQUMpCiAKICNkZWZpbmUJQzJIX1JYX0NNRF9IRFJfTEVOCQkJCTgKICNkZWZpbmUJR0VUX0MySF9DTURfQ01EX0xFTihfX3ByeGhkcikJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxODhlZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTg4ZWUvaHcuYwppbmRleCBmMmI5NzEzLi44NmNlNWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxODhlZS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE4OGVlL2h3LmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICIuLi9jYW0uaCIKICNpbmNsdWRlICIuLi9wcy5oIgogI2luY2x1ZGUgIi4uL3BjaS5oIgorI2luY2x1ZGUgIi4uL3B3cnNlcWNtZC5oIgogI2luY2x1ZGUgInJlZy5oIgogI2luY2x1ZGUgImRlZi5oIgogI2luY2x1ZGUgInBoeS5oIgpAQCAtNTY2LDcgKzU2Nyw3IEBACiAJCQkJYWNtX2N0cmwgJj0gKH5BQ01IV19WSVFFTik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIEFDM19WTzoKLQkJCQlhY21fY3RybCAmPSAofkFDTUhXX0JFUUVOKTsKKwkJCQlhY21fY3RybCAmPSAofkFDTUhXX1ZPUUVOKTsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19FTUVSRywKQEAgLTg4NSw3ICs4ODYsNyBAQAogCiAJcnRsX3dyaXRlX3dvcmQocnRscHJpdiwgUkVHX0NSLCAweDJmZik7CiAJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0NSKzEsIDB4MDYpOwotCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19DUisyLCAweDAwKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBNU1IsIDB4MDApOwogCiAJaWYgKCFydGxoYWwtPm1hY19mdW5jX2VuYWJsZSkgewogCQlpZiAoX3J0bDg4ZWVfbGx0X3RhYmxlX2luaXQoaHcpID09IGZhbHNlKSB7CkBAIC0xMjc3LDcgKzEyNzgsNyBAQAogCQkJIG1vZGUpOwogCX0KIAotCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIChNU1IpLCBidF9tc3IgfCBtb2RlKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBNU1IsIGJ0X21zciB8IG1vZGUpOwogCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywgbGVkYWN0aW9uKTsKIAlpZiAobW9kZSA9PSBNU1JfQVApCiAJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05UQ0ZHICsgMSwgMHgwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxODhlZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE4OGVlL3BoeS5jCmluZGV4IDNmNmM1OWMuLmEyYmIwMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE4OGVlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE4OGVlL3BoeS5jCkBAIC00NTIsOSArNDUyLDEwIEBACiAJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKIAkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCiAJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgotCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IGFycmF5bGVuIC0gMikKKwkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCBhcnJheWxlbiAtIDIpIHsKIAkJCQkJX3J0bDgxODhlX2NvbmZpZ19iYl9yZWcoaHcsIHYxLCB2Mik7CiAJCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7CisJCQkJfQogCiAJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJiBpIDwgYXJyYXlsZW4gLSAyKQogCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTg4ZWUvcmYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE4OGVlL3JmLmgKaW5kZXggNWMxNDcyZC4uMGVjYTAzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTg4ZWUvcmYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxODhlZS9yZi5oCkBAIC0yNyw3ICsyNyw2IEBACiAjZGVmaW5lIF9fUlRMOTJDX1JGX0hfXwogCiAjZGVmaW5lIFJGNjA1Ml9NQVhfVFhfUFdSCQkweDNGCi0jZGVmaW5lIFJGNjA1Ml9NQVhfUkVHCQkJMHgzRgogCiB2b2lkIHJ0bDg4ZV9waHlfcmY2MDUyX3NldF9iYW5kd2lkdGgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkJICAgICB1OCBiYW5kd2lkdGgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvZGVmLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9kZWYuaAppbmRleCA5YjY2MGRmLi42OTBhN2ExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9kZWYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9kZWYuaApAQCAtMzAsNTkgKzMwLDE4IEBACiAjaWZuZGVmIF9fUlRMOTJDX0RFRl9IX18KICNkZWZpbmUgX19SVEw5MkNfREVGX0hfXwogCi0jZGVmaW5lIEhBTF9SRVRSWV9MSU1JVF9JTkZSQQkJCQk0OAotI2RlZmluZSBIQUxfUkVUUllfTElNSVRfQVBfQURIT0MJCQk3Ci0KICNkZWZpbmUJUEhZX1JTU0lfU0xJRF9XSU5fTUFYCQkJCTEwMAogI2RlZmluZQlQSFlfTElOS1FVQUxJVFlfU0xJRF9XSU5fTUFYCQkJMjAKICNkZWZpbmUJUEhZX0JFQUNPTl9SU1NJX1NMSURfV0lOX01BWAkJCTEwCiAKLSNkZWZpbmUgUkVTRVRfREVMQVlfODE4NQkJCQkyMAotCi0jZGVmaW5lIFJUX0lCU1NfSU5UX01BU0tTCShJTVJfQkNOSU5UIHwgSU1SX1RCRE9LIHwgSU1SX1RCREVSKQotI2RlZmluZSBSVF9BQ19JTlRfTUFTS1MJCShJTVJfVklET0sgfCBJTVJfVk9ET0sgfCBJTVJfQkVET0t8SU1SX0JLRE9LKQotCi0jZGVmaW5lIE5VTV9PRl9GSVJNV0FSRV9RVUVVRQkJCQkxMAotI2RlZmluZSBOVU1fT0ZfUEFHRVNfSU5fRlcJCQkJMHgxMDAKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQksJCQkweDA3Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JFCQkJMHgwNwotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WSQkJCTB4MDcKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk8JCQkweDA3Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hDQ0EJCQkweDAKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQ01ECQkJMHgwCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX01HTlQJCQkweDAyCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hJR0gJCQkweDAyCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JDTgkJCTB4MgotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9QVUIJCQkweEExCi0KLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQktfRFRNCQkJMHgwMjYKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkVfRFRNCQkJMHgwNDgKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVklfRFRNCQkJMHgwNDgKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk9fRFRNCQkJMHgwMjYKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfUFVCX0RUTQkJCTB4MDAKLQotI2RlZmluZSBNQVhfTElORVNfSFdDT05GSUdfVFhUCQkJCTEwMDAKLSNkZWZpbmUgTUFYX0JZVEVTX0xJTkVfSFdDT05GSUdfVFhUCQkJMjU2Ci0KLSNkZWZpbmUgU1dfVEhSRUVfV0lSRQkJCQkJMAotI2RlZmluZSBIV19USFJFRV9XSVJFCQkJCQkyCi0KLSNkZWZpbmUgQlRfREVNT19CT0FSRAkJCQkJMAotI2RlZmluZSBCVF9RQV9CT0FSRAkJCQkJMQotI2RlZmluZSBCVF9GUEdBCQkJCQkJMgotCiAjZGVmaW5lIFJYX1NNT09USF9GQUNUT1IJCQkJMjAKIAogI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFCQkJMAogI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfTE9XRVIJCQkxCiAjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9VUFBFUgkJCTIKIAotI2RlZmluZSBNQVhfSDJDX1FVRVVFX05VTQkJCQkxMAotCiAjZGVmaW5lIFJYX01QRFVfUVVFVUUJCQkJCTAKICNkZWZpbmUgUlhfQ01EX1FVRVVFCQkJCQkxCi0jZGVmaW5lIFJYX01BWF9RVUVVRQkJCQkJMgotI2RlZmluZSBBQzJRVUVVRUlEKF9BQykJCQkJCShfQUMpCiAKICNkZWZpbmUJQzJIX1JYX0NNRF9IRFJfTEVOCQkJCTgKICNkZWZpbmUJR0VUX0MySF9DTURfQ01EX0xFTihfX3ByeGhkcikJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9ody5jCmluZGV4IDMwM2IyOTkuLjA0ZWI1YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvaHcuYwpAQCAtMzYzLDcgKzM2Myw3IEBACiAJCQkJCWFjbV9jdHJsICY9ICh+QWNtSHdfVmlxRW4pOwogCQkJCQlicmVhazsKIAkJCQljYXNlIEFDM19WTzoKLQkJCQkJYWNtX2N0cmwgJj0gKH5BY21Id19CZXFFbik7CisJCQkJCWFjbV9jdHJsICY9ICh+QWNtSHdfVm9xRW4pOwogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgogCQkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvcmYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3JmLmgKaW5kZXggZDhmZTY4Yi4uZWJkNzJjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2UvcmYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9yZi5oCkBAIC0zMSw3ICszMSw2IEBACiAjZGVmaW5lIF9fUlRMOTJDX1JGX0hfXwogCiAjZGVmaW5lIFJGNjA1Ml9NQVhfVFhfUFdSCQkweDNGCi0jZGVmaW5lIFJGNjA1Ml9NQVhfUkVHCQkJMHgzRgogI2RlZmluZSBSRjYwNTJfTUFYX1BBVEgJCQkyCiAKIHZvaWQgcnRsOTJjZV9waHlfcmY2MDUyX3NldF9iYW5kd2lkdGgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGJhbmR3aWR0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvaHcuYwppbmRleCBmZTRiNjk5Li5kMzEwZDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMKQEAgLTEzNjQsNyArMTM2NCw3IEBACiAJCQkgIk5ldHdvcmsgdHlwZSAlZCBub3Qgc3VwcG9ydGVkIVxuIiwgdHlwZSk7CiAJCWdvdG8gZXJyb3Jfb3V0OwogCX0KLQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAoTVNSKSwgYnRfbXNyKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBNU1IsIGJ0X21zcik7CiAJcnRscHJpdi0+Y2ZnLT5vcHMtPmxlZF9jb250cm9sKGh3LCBsZWRhY3Rpb24pOwogCWlmICgoYnRfbXNyICYgTVNSX01BU0spID09IE1TUl9BUCkKIAkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0JDTlRDRkcgKyAxLCAweDAwKTsKQEAgLTE0NzEsOCArMTQ3MSw3IEBACiAJCXJ0bF93cml0ZV93b3JkKHJ0bHByaXYsIFJFR19CQ05UQ0ZHLCAweDY2RkYpOwogfQogCi1zdGF0aWMgdm9pZCBfYmVhY29uX2Z1bmN0aW9uX2VuYWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgYm9vbCBFbmFibGUsCi0JCQkJICAgIGJvb2wgTGlua2VkKQorc3RhdGljIHZvaWQgX2JlYWNvbl9mdW5jdGlvbl9lbmFibGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOwogCkBAIC0xNTE3LDcgKzE1MTYsNyBAQAogCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfUlhUU0ZfT0ZGU0VUX0NDSywgMHg1MCk7CiAJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19SWFRTRl9PRkZTRVRfT0ZETSwgMHg1MCk7CiAJfQotCV9iZWFjb25fZnVuY3Rpb25fZW5hYmxlKGh3LCB0cnVlLCB0cnVlKTsKKwlfYmVhY29uX2Z1bmN0aW9uX2VuYWJsZShodyk7CiB9CiAKIHZvaWQgcnRsOTJjdV9zZXRfYmVhY29uX2ludGVydmFsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQpAQCAtMTU4OSw2ICsxNTg4LDggQEAKIAljYXNlIEhXX1ZBUl9EQVRBX0ZJTFRFUjoKIAkJKigodTE2ICopICh2YWwpKSA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgUkVHX1JYRkxUTUFQMik7CiAJCWJyZWFrOworCWNhc2UgSEFMX0RFRl9XT1dMQU46CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCiAJCQkgInN3aXRjaCBjYXNlIG5vdCBwcm9jZXNzZWRcbiIpOwpAQCAtMTg3MSw3ICsxODcyLDcgQEAKIAkJCQkJYWNtX2N0cmwgJj0gKH5BY21Id19WaXFFbik7CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQUMzX1ZPOgotCQkJCQlhY21fY3RybCAmPSAofkFjbUh3X0JlcUVuKTsKKwkJCQkJYWNtX2N0cmwgJj0gKH5BY21Id19Wb3FFbik7CiAJCQkJCWJyZWFrOwogCQkJCWRlZmF1bHQ6CiAJCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRU1FUkcsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvaHcuaAppbmRleCBjMWUzM2IwLi42NzU4ODA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L2h3LmgKQEAgLTMyLDggKzMyLDYgQEAKIAogI2RlZmluZSBIMkNfUkFfTUFTSwk2CiAKLSNkZWZpbmUgTExUX1BPTExJTkdfTExUX1RIUkVTSE9MRAkJMjAKLSNkZWZpbmUgTExUX1BPTExJTkdfUkVBRFlfVElNRU9VVF9DT1VOVAkJMTAwCiAjZGVmaW5lIExMVF9MQVNUX0VOVFJZX09GX1RYX1BLVF9CVUZGRVIJCTI1NQogCiAjZGVmaW5lIFJYX1BBR0VfU0laRV9SRUdfVkFMVUUJCQlQQlBfMTI4CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L21hYy5jCmluZGV4IDEzM2UzOTUuLmFkYjgxMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L21hYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L21hYy5jCkBAIC00OTcsNyArNDk3LDcgQEAKIAkJCSAiTmV0d29yayB0eXBlICVkIG5vdCBzdXBwb3J0ZWQhXG4iLCB0eXBlKTsKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KLQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAoUkVHX0NSICsgMiksIHZhbHVlKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBNU1IsIHZhbHVlKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvcmYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3JmLmgKaW5kZXggMTFiNDM5ZC4uNmY5ODdkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvcmYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9yZi5oCkBAIC0zMSw3ICszMSw2IEBACiAjZGVmaW5lIF9fUlRMOTJDVV9SRl9IX18KIAogI2RlZmluZSBSRjYwNTJfTUFYX1RYX1BXUgkJMHgzRgotI2RlZmluZSBSRjYwNTJfTUFYX1JFRwkJCTB4M0YKICNkZWZpbmUgUkY2MDUyX01BWF9QQVRICQkJMgogCiB2b2lkIHJ0bDkyY3VfcGh5X3JmNjA1Ml9zZXRfYmFuZHdpZHRoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBiYW5kd2lkdGgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMKaW5kZXggOTBhNzE0Yy4uMjM4MDZjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9zdy5jCkBAIC0zMjEsNiArMzIxLDcgQEAKIAl7UlRMX1VTQl9ERVZJQ0UoMHgwN2I4LCAweDgxODgsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkFib2NvbSAtIEFib2NvbSovCiAJe1JUTF9VU0JfREVWSUNFKDB4MDdiOCwgMHg4MTg5LCBydGw5MmN1X2hhbF9jZmcpfSwgLypGdW5haSAtIEFib2NvbSovCiAJe1JUTF9VU0JfREVWSUNFKDB4MDg0NiwgMHg5MDQxLCBydGw5MmN1X2hhbF9jZmcpfSwgLypOZXRHZWFyIFdOQTEwMDBNKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwYjA1LCAweDE3YmEsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkFTVVMtRWRpbWF4Ki8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwYmRhLCAweDUwODgsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlRoaW5rd2FyZS1DQyZDKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwZGY2LCAweDAwNTIsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlNpdGVjb20gLSBFZGltYXgqLwogCXtSVExfVVNCX0RFVklDRSgweDBkZjYsIDB4MDA1YywgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qU2l0ZWNvbSAtIEVkaW1heCovCkBAIC0zNzcsNiArMzc4LDcgQEAKIAl7UlRMX1VTQl9ERVZJQ0UoMHgyMDAxLCAweDMzMDcsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkQtTGluay1DYW1lbyovCiAJe1JUTF9VU0JfREVWSUNFKDB4MjAwMSwgMHgzMzA5LCBydGw5MmN1X2hhbF9jZmcpfSwgLypELUxpbmstQWxwaGEqLwogCXtSVExfVVNCX0RFVklDRSgweDIwMDEsIDB4MzMwYSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qRC1MaW5rLUFscGhhKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgyMDAxLCAweDMzMGQsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkQtTGluayBEV0EtMTMxICovCiAJe1JUTF9VU0JfREVWSUNFKDB4MjAxOSwgMHhhYjJiLCBydGw5MmN1X2hhbF9jZmcpfSwgLypQbGFuZXggLUFib2NvbSovCiAJe1JUTF9VU0JfREVWSUNFKDB4MjBmNCwgMHg2MjRkLCBydGw5MmN1X2hhbF9jZmcpfSwgLypUUkVORE5ldCovCiAJe1JUTF9VU0JfREVWSUNFKDB4MjM1NywgMHgwMTAwLCBydGw5MmN1X2hhbF9jZmcpfSwgLypUUC1MaW5rIFdOODIwME5EKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2RlZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvZGVmLmgKaW5kZXggOTM5YzkwNS4uMGE0NDNlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvZGVmLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvZGVmLmgKQEAgLTM1LDYxICszNSwyMiBAQAogI2RlZmluZQlNQVhfTVNTX0RFTlNJVFlfMVQJCQkJMHgwQQogCiAjZGVmaW5lIFJGNjA1Ml9NQVhfVFhfUFdSCQkJCTB4M0YKLSNkZWZpbmUgUkY2MDUyX01BWF9SRUcJCQkJCTB4M0YKICNkZWZpbmUgUkY2MDUyX01BWF9QQVRICQkJCQkyCiAKLSNkZWZpbmUgSEFMX1JFVFJZX0xJTUlUX0lORlJBCQkJCTQ4Ci0jZGVmaW5lIEhBTF9SRVRSWV9MSU1JVF9BUF9BREhPQwkJCTcKLQogI2RlZmluZQlQSFlfUlNTSV9TTElEX1dJTl9NQVgJCQkJMTAwCiAjZGVmaW5lCVBIWV9MSU5LUVVBTElUWV9TTElEX1dJTl9NQVgJCQkyMAogI2RlZmluZQlQSFlfQkVBQ09OX1JTU0lfU0xJRF9XSU5fTUFYCQkJMTAKIAotI2RlZmluZSBSRVNFVF9ERUxBWV84MTg1CQkJCTIwCi0KLSNkZWZpbmUgUlRfSUJTU19JTlRfTUFTS1MJKElNUl9CQ05JTlQgfCBJTVJfVEJET0sgfCBJTVJfVEJERVIpCiAjZGVmaW5lIFJUX0FDX0lOVF9NQVNLUwkJKElNUl9WSURPSyB8IElNUl9WT0RPSyB8IElNUl9CRURPS3xJTVJfQktET0spCiAKLSNkZWZpbmUgTlVNX09GX0ZJUk1XQVJFX1FVRVVFCQkJCTEwCi0jZGVmaW5lIE5VTV9PRl9QQUdFU19JTl9GVwkJCQkweDEwMAotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CSwkJCTB4MDcKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkUJCQkweDA3Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZJCQkJMHgwNwotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WTwkJCTB4MDcKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfSENDQQkJCTB4MAotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9DTUQJCQkweDAKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfTUdOVAkJCTB4MDIKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfSElHSAkJCTB4MDIKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkNOCQkJMHgyCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1BVQgkJCTB4QTEKLQotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CS19EVE0JCQkweDAyNgotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CRV9EVE0JCQkweDA0OAotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WSV9EVE0JCQkweDA0OAotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WT19EVE0JCQkweDAyNgotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9QVUJfRFRNCQkJMHgwMAotCi0jZGVmaW5lIE1BWF9MSU5FU19IV0NPTkZJR19UWFQJCQkJMTAwMAotI2RlZmluZSBNQVhfQllURVNfTElORV9IV0NPTkZJR19UWFQJCQkyNTYKLQotI2RlZmluZSBTV19USFJFRV9XSVJFCQkJCQkwCi0jZGVmaW5lIEhXX1RIUkVFX1dJUkUJCQkJCTIKLQotI2RlZmluZSBCVF9ERU1PX0JPQVJECQkJCQkwCi0jZGVmaW5lIEJUX1FBX0JPQVJECQkJCQkxCi0jZGVmaW5lIEJUX0ZQR0EJCQkJCQkyCi0KICNkZWZpbmUgUlhfU01PT1RIX0ZBQ1RPUgkJCQkyMAogCiAjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUJCQkwCiAjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUgkJCTEKICNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSCQkJMgogCi0jZGVmaW5lIE1BWF9IMkNfUVVFVUVfTlVNCQkJCTEwCi0KICNkZWZpbmUgUlhfTVBEVV9RVUVVRQkJCQkJMAogI2RlZmluZSBSWF9DTURfUVVFVUUJCQkJCTEKLSNkZWZpbmUgUlhfTUFYX1FVRVVFCQkJCQkyCiAKICNkZWZpbmUJQzJIX1JYX0NNRF9IRFJfTEVOCQkJCTgKICNkZWZpbmUJR0VUX0MySF9DTURfQ01EX0xFTihfX3ByeGhkcikJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvaHcuYwppbmRleCAwMWJjYzJkLi5mNDliNjBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL2h3LmMKQEAgLTExMjYsNyArMTEyNiw3IEBACiAJCWJyZWFrOwogCiAJfQotCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19DUiArIDIsIGJ0X21zcik7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgTVNSLCBidF9tc3IpOwogCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywgbGVkYWN0aW9uKTsKIAlpZiAoKGJ0X21zciAmIE1TUl9NQVNLKSA9PSBNU1JfQVApCiAJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05UQ0ZHICsgMSwgMHgwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJlZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZWUvaHcuYwppbmRleCBiNDYxYjMxLi5kYTBhNjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJlZS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmVlL2h3LmMKQEAgLTU2Miw3ICs1NjIsNyBAQAogCQkJCWFjbV9jdHJsICY9ICh+QUNNSFdfVklRRU4pOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBQzNfVk86Ci0JCQkJYWNtX2N0cmwgJj0gKH5BQ01IV19CRVFFTik7CisJCQkJYWNtX2N0cmwgJj0gKH5BQ01IV19WT1FFTik7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfRE1FU0csCkBAIC0xNTEwLDcgKzE1MTAsNyBAQAogCQkJIG1vZGUpOwogCX0KIAotCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIChNU1IpLCBidF9tc3IgfCBtb2RlKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBNU1IsIGJ0X21zciB8IG1vZGUpOwogCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywgbGVkYWN0aW9uKTsKIAlpZiAobW9kZSA9PSBNU1JfQVApCiAJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05UQ0ZHICsgMSwgMHgwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJlZS9yZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZWUvcmYuaAppbmRleCA4YmRlZWQzLi4wMzljMDEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJlZS9yZi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmVlL3JmLmgKQEAgLTI3LDcgKzI3LDYgQEAKICNkZWZpbmUgX19SVEw5MkVfUkZfSF9fCiAKICNkZWZpbmUgUkY2MDUyX01BWF9UWF9QV1IJCTB4M0YKLSNkZWZpbmUgUkY2MDUyX01BWF9SRUcJCQkweDNGCiAKIHZvaWQgcnRsOTJlZV9waHlfcmY2MDUyX3NldF9iYW5kd2lkdGgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkJICAgICAgdTggYmFuZHdpZHRoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2RlZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvZGVmLmgKaW5kZXggZWY4N2MwOS4uNDE0NjZmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvZGVmLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvZGVmLmgKQEAgLTMxLDcgKzMxLDYgQEAKIAogI2RlZmluZSBSWF9NUERVX1FVRVVFCQkJCTAKICNkZWZpbmUgUlhfQ01EX1FVRVVFCQkJCTEKLSNkZWZpbmUgUlhfTUFYX1FVRVVFCQkJCTIKIAogI2RlZmluZSBTSE9SVF9TTE9UX1RJTUUJCQkJOQogI2RlZmluZSBOT05fU0hPUlRfU0xPVF9USU1FCQkJMjAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9ody5jCmluZGV4IDU3NjFkNWIuLjEyYjA5NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvaHcuYwpAQCAtMjkzLDcgKzI5Myw3IEBACiAJCQkJCWFjbV9jdHJsICY9ICh+QWNtSHdfVmlxRW4pOwogCQkJCQlicmVhazsKIAkJCQljYXNlIEFDM19WTzoKLQkJCQkJYWNtX2N0cmwgJj0gKH5BY21Id19CZXFFbik7CisJCQkJCWFjbV9jdHJsICY9ICh+QWNtSHdfVm9xRW4pOwogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgogCQkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLApAQCAtMTIwNCw3ICsxMjA0LDcgQEAKIAlpZiAodHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCAmJgogCSAgICBydGxwcml2LT5tYWM4MDIxMS5saW5rX3N0YXRlIDwgTUFDODAyMTFfTElOS0VEKQogCQlidF9tc3IgPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIE1TUikgJiB+TVNSX0xJTktfTUFTSzsKLQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAoTVNSKSwgYnRfbXNyKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBNU1IsIGJ0X21zcik7CiAKIAl0ZW1wID0gcnRsX3JlYWRfZHdvcmQocnRscHJpdiwgVENSKTsKIAlydGxfd3JpdGVfZHdvcmQocnRscHJpdiwgVENSLCB0ZW1wICYgKH5CSVQoOCkpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2FlL2RlZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvZGVmLmgKaW5kZXggOTRiZGQ0Yi4uYmNkZjIyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvZGVmLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvZGVmLmgKQEAgLTI2LDUzICsyNiwxMiBAQAogI2lmbmRlZiBfX1JUTDg3MjNFX0RFRl9IX18KICNkZWZpbmUgX19SVEw4NzIzRV9ERUZfSF9fCiAKLSNkZWZpbmUgSEFMX1JFVFJZX0xJTUlUX0lORlJBCQkJCTQ4Ci0jZGVmaW5lIEhBTF9SRVRSWV9MSU1JVF9BUF9BREhPQwkJCTcKLQotI2RlZmluZSBSRVNFVF9ERUxBWV84MTg1CQkJCQkyMAotCi0jZGVmaW5lIFJUX0lCU1NfSU5UX01BU0tTCShJTVJfQkNOSU5UIHwgSU1SX1RCRE9LIHwgSU1SX1RCREVSKQotI2RlZmluZSBSVF9BQ19JTlRfTUFTS1MJCShJTVJfVklET0sgfCBJTVJfVk9ET0sgfCBJTVJfQkVET0t8SU1SX0JLRE9LKQotCi0jZGVmaW5lIE5VTV9PRl9GSVJNV0FSRV9RVUVVRQkJCQkxMAotI2RlZmluZSBOVU1fT0ZfUEFHRVNfSU5fRlcJCQkJCTB4MTAwCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JLCQkJMHgwNwotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CRQkJCTB4MDcKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVkkJCQkweDA3Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZPCQkJMHgwNwotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9IQ0NBCQkweDAKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQ01ECQkJMHgwCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX01HTlQJCTB4MDIKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfSElHSAkJMHgwMgotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CQ04JCQkweDIKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfUFVCCQkJMHhBMQotCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JLX0RUTQkJMHgwMjYKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQkVfRFRNCQkweDA0OAotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WSV9EVE0JCTB4MDQ4Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZPX0RUTQkJMHgwMjYKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfUFVCX0RUTQkJMHgwMAotCi0jZGVmaW5lIE1BWF9MSU5FU19IV0NPTkZJR19UWFQJCQkJMTAwMAotI2RlZmluZSBNQVhfQllURVNfTElORV9IV0NPTkZJR19UWFQJCQkyNTYKLQotI2RlZmluZSBTV19USFJFRV9XSVJFCQkJCQkJMAotI2RlZmluZSBIV19USFJFRV9XSVJFCQkJCQkJMgotCi0jZGVmaW5lIEJUX0RFTU9fQk9BUkQJCQkJCQkwCi0jZGVmaW5lIEJUX1FBX0JPQVJECQkJCQkJCTEKLSNkZWZpbmUgQlRfRlBHQQkJCQkJCQkJMgotCiAjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9ET05UX0NBUkUJCTAKICNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX0xPV0VSCQkJMQogI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfVVBQRVIJCQkyCiAKLSNkZWZpbmUgTUFYX0gyQ19RVUVVRV9OVU0JCQkJCTEwCi0KICNkZWZpbmUgUlhfTVBEVV9RVUVVRQkJCQkJCTAKICNkZWZpbmUgUlhfQ01EX1FVRVVFCQkJCQkJMQotI2RlZmluZSBSWF9NQVhfUVVFVUUJCQkJCQkyCi0jZGVmaW5lIEFDMlFVRVVFSUQoX0FDKQkJCQkJCShfQUMpCiAKICNkZWZpbmUJQzJIX1JYX0NNRF9IRFJfTEVOCQkJCQk4CiAjZGVmaW5lCUdFVF9DMkhfQ01EX0NNRF9MRU4oX19wcnhoZHIpCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNhZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvaHcuYwppbmRleCBhYTA4NTQ2Li42N2JiNDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNhZS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2FlL2h3LmMKQEAgLTM2Miw3ICszNjIsNyBAQAogCQkJCQlhY21fY3RybCAmPSAofkFDTUhXX1ZJUUVOKTsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBBQzNfVk86Ci0JCQkJCWFjbV9jdHJsICY9ICh+QUNNSFdfQkVRRU4pOworCQkJCQlhY21fY3RybCAmPSAofkFDTUhXX1ZPUUVOKTsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKIAkJCQkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9FUlIsIERCR19MT1VELApAQCAtMTE4Myw3ICsxMTgzLDcgQEAKIAkJCSBtb2RlKTsKIAl9CiAKLQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCAoTVNSKSwgYnRfbXNyIHwgbW9kZSk7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgTVNSLCBidF9tc3IgfCBtb2RlKTsKIAlydGxwcml2LT5jZmctPm9wcy0+bGVkX2NvbnRyb2woaHcsIGxlZGFjdGlvbik7CiAJaWYgKG1vZGUgPT0gTVNSX0FQKQogCQlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBSRUdfQkNOVENGRyArIDEsIDB4MDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvcmYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2FlL3JmLmgKaW5kZXggZjNmNDViMS4uN2I0NGViYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYWUvcmYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNhZS9yZi5oCkBAIC0yNyw3ICsyNyw2IEBACiAjZGVmaW5lIF9fUlRMODcyM0VfUkZfSF9fCiAKICNkZWZpbmUgUkY2MDUyX01BWF9UWF9QV1IJCTB4M0YKLSNkZWZpbmUgUkY2MDUyX01BWF9SRUcJCQkweDNGCiAKIHZvaWQgcnRsODcyM2VfcGh5X3JmNjA1Ml9zZXRfYmFuZHdpZHRoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJCSAgICAgICB1OCBiYW5kd2lkdGgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYmUvZG0uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2JlL2RtLmMKaW5kZXggMjM2N2U4Zi4uZTc3YzNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYmUvZG0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS9kbS5jCkBAIC0zMDksNyArMzA5LDcgQEAKIAkJcnRsX2RtX2RpZy0+bWluX3VuZGVjX3B3ZGJfZm9yX2RtID0KIAkJCQlydGxwcml2LT5kbS5lbnRyeV9taW5fdW5kZWNfc21fcHdkYjsKIAkJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9CQl9QT1dFUlNBVklORywgREJHX0xPVUQsCi0JCQkgIkFQIEV4dCBQb3J0IG9yIGRpc2Nvbm5ldCBQV0RCID0gMHgleFxuIiwKKwkJCSAiQVAgRXh0IFBvcnQgb3IgZGlzY29ubmVjdCBQV0RCID0gMHgleFxuIiwKIAkJCSAgcnRsX2RtX2RpZy0+bWluX3VuZGVjX3B3ZGJfZm9yX2RtKTsKIAl9CiAJUlRfVFJBQ0UocnRscHJpdiwgQ09NUF9ESUcsIERCR19MT1VELCAiTWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0gPSVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYmUvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2JlL2h3LmMKaW5kZXggNmRhZDI4ZS4uYjY4MWFmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYmUvaHcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS9ody5jCkBAIC02MDMsNyArNjAzLDcgQEAKIAkJCQlhY21fY3RybCAmPSAofkFDTUhXX1ZJUUVOKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgQUMzX1ZPOgotCQkJCWFjbV9jdHJsICY9ICh+QUNNSFdfQkVRRU4pOworCQkJCWFjbV9jdHJsICY9ICh+QUNNSFdfVk9RRU4pOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0xPVUQsCkBAIC0xNTU4LDcgKzE1NTgsNyBAQAogCQkJIG1vZGUpOwogCX0KIAotCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIChNU1IpLCBidF9tc3IgfCBtb2RlKTsKKwlydGxfd3JpdGVfYnl0ZShydGxwcml2LCBNU1IsIGJ0X21zciB8IG1vZGUpOwogCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywgbGVkYWN0aW9uKTsKIAlpZiAobW9kZSA9PSBNU1JfQVApCiAJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIFJFR19CQ05UQ0ZHICsgMSwgMHgwMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS9yZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4NzIzYmUvcmYuaAppbmRleCBhNmZlYTEwLi5mNDIzZTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg3MjNiZS9yZi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODcyM2JlL3JmLmgKQEAgLTI3LDcgKzI3LDYgQEAKICNkZWZpbmUgX19SVEw4NzIzQkVfUkZfSF9fCiAKICNkZWZpbmUgUkY2MDUyX01BWF9UWF9QV1IJCTB4M0YKLSNkZWZpbmUgUkY2MDUyX01BWF9SRUcJCQkweDNGCiAKIHZvaWQgcnRsODcyM2JlX3BoeV9yZjYwNTJfc2V0X2JhbmR3aWR0aChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkJdTggYmFuZHdpZHRoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODgyMWFlL2RlZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4ODIxYWUvZGVmLmgKaW5kZXggZWU3YzIwOC4uZGZiZGY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4ODIxYWUvZGVmLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4ODIxYWUvZGVmLmgKQEAgLTExOCw1NSArMTE4LDE0IEBACiAjZGVmaW5lCVdJRklfTkFWX1VQUEVSX1VTCQkJCTMwMDAwCiAjZGVmaW5lIEhBTF85MkNfTkFWX1VQUEVSX1VOSVQJCQkxMjgKIAotI2RlZmluZSBIQUxfUkVUUllfTElNSVRfSU5GUkEJCQkJNDgKLSNkZWZpbmUgSEFMX1JFVFJZX0xJTUlUX0FQX0FESE9DCQkJNwotCi0jZGVmaW5lIFJFU0VUX0RFTEFZXzgxODUJCQkJCTIwCi0KLSNkZWZpbmUgUlRfSUJTU19JTlRfTUFTS1MJKElNUl9CQ05JTlQgfCBJTVJfVEJET0sgfCBJTVJfVEJERVIpCi0jZGVmaW5lIFJUX0FDX0lOVF9NQVNLUwkJKElNUl9WSURPSyB8IElNUl9WT0RPSyB8IElNUl9CRURPS3xJTVJfQktET0spCi0KLSNkZWZpbmUgTlVNX09GX0ZJUk1XQVJFX1FVRVVFCQkJCTEwCi0jZGVmaW5lIE5VTV9PRl9QQUdFU19JTl9GVwkJCQkJMHgxMDAKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQksJCQkweDA3Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JFCQkJMHgwNwotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9WSQkJCTB4MDcKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk8JCQkweDA3Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0hDQ0EJCTB4MAotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9DTUQJCQkweDAKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfTUdOVAkJMHgwMgotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9ISUdICQkweDAyCi0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX0JDTgkJCTB4MgotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9QVUIJCQkweEExCi0KLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfQktfRFRNCQkweDAyNgotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9CRV9EVE0JCTB4MDQ4Ci0jZGVmaW5lIE5VTV9PRl9QQUdFX0lOX0ZXX1FVRVVFX1ZJX0RUTQkJMHgwNDgKLSNkZWZpbmUgTlVNX09GX1BBR0VfSU5fRldfUVVFVUVfVk9fRFRNCQkweDAyNgotI2RlZmluZSBOVU1fT0ZfUEFHRV9JTl9GV19RVUVVRV9QVUJfRFRNCQkweDAwCi0KICNkZWZpbmUgTUFYX1JYX0RNQV9CVUZGRVJfU0laRQkJCQkweDNFODAKIAotI2RlZmluZSBNQVhfTElORVNfSFdDT05GSUdfVFhUCQkJCTEwMDAKLSNkZWZpbmUgTUFYX0JZVEVTX0xJTkVfSFdDT05GSUdfVFhUCQkJMjU2Ci0KLSNkZWZpbmUgU1dfVEhSRUVfV0lSRQkJCQkJCTAKLSNkZWZpbmUgSFdfVEhSRUVfV0lSRQkJCQkJCTIKLQotI2RlZmluZSBCVF9ERU1PX0JPQVJECQkJCQkJMAotI2RlZmluZSBCVF9RQV9CT0FSRAkJCQkJCQkxCi0jZGVmaW5lIEJUX0ZQR0EJCQkJCQkJCTIKLQogI2RlZmluZSBIQUxfUFJJTUVfQ0hOTF9PRkZTRVRfRE9OVF9DQVJFCQkwCiAjZGVmaW5lIEhBTF9QUklNRV9DSE5MX09GRlNFVF9MT1dFUgkJCTEKICNkZWZpbmUgSEFMX1BSSU1FX0NITkxfT0ZGU0VUX1VQUEVSCQkJMgogCi0jZGVmaW5lIE1BWF9IMkNfUVVFVUVfTlVNCQkJCQkxMAotCiAjZGVmaW5lIFJYX01QRFVfUVVFVUUJCQkJCQkwCiAjZGVmaW5lIFJYX0NNRF9RVUVVRQkJCQkJCTEKLSNkZWZpbmUgUlhfTUFYX1FVRVVFCQkJCQkJMgotI2RlZmluZSBBQzJRVUVVRUlEKF9BQykJCQkJCQkoX0FDKQogCiAjZGVmaW5lIE1BWF9SWF9ETUFfQlVGRkVSX1NJWkVfODgxMgkweDNFODAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4ODIxYWUvZG0uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODgyMWFlL2RtLmMKaW5kZXggMGIyMDgyZC4uMzQyNjc4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4ODIxYWUvZG0uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg4MjFhZS9kbS5jCkBAIC04NzMsNyArODczLDcgQEAKIAogCWlmIChydGxwcml2LT5mYWxzZWFsbV9jbnQuY250X2FsbCA+IDEwMDAwKSB7CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRElHLCBEQkdfTE9VRCwKLQkJCSAiQWJub3JuYWxseSBmYWxzZSBhbGFybSBjYXNlLlxuIik7CisJCQkgIkFibm9ybWFsbHkgZmFsc2UgYWxhcm0gY2FzZS5cbiIpOwogCiAJCWlmIChkbV9kaWd0YWJsZS0+bGFyZ2VfZmFfaGl0ICE9IDMpCiAJCQlkbV9kaWd0YWJsZS0+bGFyZ2VfZmFfaGl0Kys7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg4MjFhZS9ody5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4ODIxYWUvaHcuYwppbmRleCA4ZWM4MjAwLi44NzA0ZWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg4MjFhZS9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODgyMWFlL2h3LmMKQEAgLTQyMyw3ICs0MjMsNyBAQAogCQkqKCh1MTYgKikodmFsKzQpKSA9IHJ0bF9yZWFkX3dvcmQocnRscHJpdiwgUkVHX0JTU0lEKzQpOwogCQlicmVhazsKIAljYXNlIEhXX1ZBUl9NRURJQV9TVEFUVVM6Ci0JCXZhbFswXSA9IHJ0bF9yZWFkX2J5dGUocnRscHJpdiwgUkVHX0NSKzIpICYgMHgzOworCQl2YWxbMF0gPSBydGxfcmVhZF9ieXRlKHJ0bHByaXYsIE1TUikgJiAweDM7CiAJCWJyZWFrOwogCWNhc2UgSFdfVkFSX1NMT1RfVElNRToKIAkJKigodTggKikodmFsKSkgPSBtYWMtPnNsb3RfdGltZTsKQEAgLTY2Nyw3ICs2NjcsNyBAQAogCQkJCWFjbV9jdHJsICY9ICh+QUNNSFdfVklRRU4pOwogCQkJCWJyZWFrOwogCQkJY2FzZSBBQzNfVk86Ci0JCQkJYWNtX2N0cmwgJj0gKH5BQ01IV19CRVFFTik7CisJCQkJYWNtX2N0cmwgJj0gKH5BQ01IV19WT1FFTik7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRVJSLCBEQkdfTE9VRCwKQEAgLTE1MTUsNyArMTUxNSw3IEBACiAJCQkJICAgICAgKHU4ICopKCZzdXBwb3J0X3JlbW90ZV93YWtldXApKTsKIAogCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0xPVUQsCi0JCSAiYm91bmRhcnk9MHglI1gsIE5QUV9SUVBOVmFsdWU9MHglI1gsIFJRUE5WYWx1ZT0weCUjWFxuIiwKKwkJICJib3VuZGFyeT0lI1gsIE5QUV9SUVBOVmFsdWU9JSNYLCBSUVBOVmFsdWU9JSNYXG4iLAogCQkgIGJvdW5kYXJ5LCBucHFfcnFwbl92YWx1ZSwgcnFwbl92YWwpOwogCiAJLyogc3RvcCBQQ0llIERNQQpAQCAtMjE3OCw3ICsyMTc4LDcgQEAKIAkJcmV0dXJuIDE7CiAJfQogCi0JcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgKE1TUiksIGJ0X21zcik7CisJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgTVNSLCBidF9tc3IpOwogCXJ0bHByaXYtPmNmZy0+b3BzLT5sZWRfY29udHJvbChodywgbGVkYWN0aW9uKTsKIAlpZiAoKGJ0X21zciAmIDB4ZmMpID09IE1TUl9BUCkKIAkJcnRsX3dyaXRlX2J5dGUocnRscHJpdiwgUkVHX0JDTlRDRkcgKyAxLCAweDAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODgyMWFlL3JmLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg4MjFhZS9yZi5oCmluZGV4IGQ5NTgyZWUuLmVmZDIyYmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODgyMWFlL3JmLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4ODIxYWUvcmYuaApAQCAtMjcsNyArMjcsNiBAQAogI2RlZmluZSBfX1JUTDg4MjFBRV9SRl9IX18KIAogI2RlZmluZSBSRjYwNTJfTUFYX1RYX1BXUgkJMHgzRgotI2RlZmluZSBSRjYwNTJfTUFYX1JFRwkJCTB4M0YKIAogdm9pZCBydGw4ODIxYWVfcGh5X3JmNjA1Ml9zZXRfYmFuZHdpZHRoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJCQl1OCBiYW5kd2lkdGgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4ODIxYWUvdHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg4MjFhZS90cnguYwppbmRleCA3MmFmNGI5Li4xNzQ3NDNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg4MjFhZS90cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDg4MjFhZS90cnguYwpAQCAtNjQsNiArNjQsMjAgQEAKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIAorc3RhdGljIHU4IF9ydGw4ODIxYWVfZXZtX2RibV9qYWd1YXIoY2hhciB2YWx1ZSkKK3sKKwljaGFyIHJldF92YWwgPSB2YWx1ZTsKKworCS8qIC0zM2RCfjBkQiB0byAzM2RCIH4gMGRCKi8KKwlpZiAocmV0X3ZhbCA9PSAtMTI4KQorCQlyZXRfdmFsID0gMTI3OworCWVsc2UgaWYgKHJldF92YWwgPCAwKQorCQlyZXRfdmFsID0gMCAtIHJldF92YWw7CisKKwlyZXRfdmFsICA9IHJldF92YWwgPj4gMTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKwogc3RhdGljIHZvaWQgcXVlcnlfcnhwaHlzdGF0dXMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgICAgICBzdHJ1Y3QgcnRsX3N0YXRzICpwc3RhdHVzLCB1OCAqcGRlc2MsCiAJCQkgICAgICBzdHJ1Y3QgcnhfZndpbmZvXzg4MjFhZSAqcF9kcnZpbmZvLApAQCAtMjQ2LDcgKzI2MCw3IEBACiAKIAkJZm9yIChpID0gMDsgaSA8IG1heF9zcGF0aWFsX3N0cmVhbTsgaSsrKSB7CiAJCQlldm0gPSBydGxfZXZtX2RiX3RvX3BlcmNlbnRhZ2UocF9waHlzdHJwdC0+cnhldm1baV0pOwotCQkJZXZtZGJtID0gcnRsX2V2bV9kYm1famFndWFyKHBfcGh5c3RycHQtPnJ4ZXZtW2ldKTsKKwkJCWV2bWRibSA9IF9ydGw4ODIxYWVfZXZtX2RibV9qYWd1YXIocF9waHlzdHJwdC0+cnhldm1baV0pOwogCiAJCQlpZiAoYnBhY2tldF9tYXRjaF9ic3NpZCkgewogCQkJCS8qIEZpbGwgdmFsdWUgaW4gUkZELCBHZXQgdGhlIGZpcnN0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3N0YXRzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3N0YXRzLmMKaW5kZXggMmQwNzM2YS4uZDhiMzA2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9zdGF0cy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvc3RhdHMuYwpAQCAtMzksMTUgKzM5LDggQEAKIAogdTggcnRsX2V2bV9kYl90b19wZXJjZW50YWdlKGNoYXIgdmFsdWUpCiB7Ci0JY2hhciByZXRfdmFsOwotCXJldF92YWwgPSB2YWx1ZTsKKwljaGFyIHJldF92YWwgPSBjbGFtcCgtdmFsdWUsIDAsIDMzKSAqIDM7CiAKLQlpZiAocmV0X3ZhbCA+PSAwKQotCQlyZXRfdmFsID0gMDsKLQlpZiAocmV0X3ZhbCA8PSAtMzMpCi0JCXJldF92YWwgPSAtMzM7Ci0JcmV0X3ZhbCA9IDAgLSByZXRfdmFsOwotCXJldF92YWwgKj0gMzsKIAlpZiAocmV0X3ZhbCA9PSA5OSkKIAkJcmV0X3ZhbCA9IDEwMDsKIApAQCAtNTUsMjEgKzQ4LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wocnRsX2V2bV9kYl90b19wZXJjZW50YWdlKTsKIAotdTggcnRsX2V2bV9kYm1famFndWFyKGNoYXIgdmFsdWUpCi17Ci0JY2hhciByZXRfdmFsID0gdmFsdWU7Ci0KLQkvKiAtMzNkQn4wZEIgdG8gMzNkQiB+IDBkQiovCi0JaWYgKHJldF92YWwgPT0gLTEyOCkKLQkJcmV0X3ZhbCA9IDEyNzsKLQllbHNlIGlmIChyZXRfdmFsIDwgMCkKLQkJcmV0X3ZhbCA9IDAgLSByZXRfdmFsOwotCi0JcmV0X3ZhbCAgPSByZXRfdmFsID4+IDE7Ci0JcmV0dXJuIHJldF92YWw7Ci19Ci1FWFBPUlRfU1lNQk9MKHJ0bF9ldm1fZGJtX2phZ3Vhcik7Ci0KIHN0YXRpYyBsb25nIHJ0bF90cmFuc2xhdGVfdG9kYm0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCiAJCQkgdTggc2lnbmFsX3N0cmVuZ3RoX2luZGV4KQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9zdGF0cy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9zdGF0cy5oCmluZGV4IGFhNGVlYzguLjJiNTdkZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvc3RhdHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3N0YXRzLmgKQEAgLTM1LDcgKzM1LDYgQEAKIAogdTggcnRsX3F1ZXJ5X3J4cHdycGVyY2VudGFnZShjaGFyIGFudHBvd2VyKTsKIHU4IHJ0bF9ldm1fZGJfdG9fcGVyY2VudGFnZShjaGFyIHZhbHVlKTsKLXU4IHJ0bF9ldm1fZGJtX2phZ3VhcihjaGFyIHZhbHVlKTsKIGxvbmcgcnRsX3NpZ25hbF9zY2FsZV9tYXBwaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBsb25nIGN1cnJzaWcpOwogdm9pZCBydGxfcHJvY2Vzc19waHlpbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCAqYnVmZmVyLAogCQkJIHN0cnVjdCBydGxfc3RhdHMgKnBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS91c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvdXNiLmMKaW5kZXggNDZlZTk1Ni4uZjAxODhjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS91c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3VzYi5jCkBAIC03MDEsMTIgKzcwMSwxOCBAQAogCiBzdGF0aWMgdm9pZCBfcnRsX3VzYl9jbGVhbnVwX3J4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogeworCXN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiA9IHJ0bF9wcml2KGh3KTsKIAlzdHJ1Y3QgcnRsX3VzYiAqcnRsdXNiID0gcnRsX3VzYmRldihydGxfdXNicHJpdihodykpOwogCXN0cnVjdCB1cmIgKnVyYjsKIAogCXVzYl9raWxsX2FuY2hvcmVkX3VyYnMoJnJ0bHVzYi0+cnhfc3VibWl0dGVkKTsKIAogCXRhc2tsZXRfa2lsbCgmcnRsdXNiLT5yeF93b3JrX3Rhc2tsZXQpOworCWNhbmNlbF93b3JrX3N5bmMoJnJ0bHByaXYtPndvcmtzLmxwc19jaGFuZ2Vfd29yayk7CisKKwlmbHVzaF93b3JrcXVldWUocnRscHJpdi0+d29ya3MucnRsX3dxKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShydGxwcml2LT53b3Jrcy5ydGxfd3EpOworCiAJc2tiX3F1ZXVlX3B1cmdlKCZydGx1c2ItPnJ4X3F1ZXVlKTsKIAogCXdoaWxlICgodXJiID0gdXNiX2dldF9mcm9tX2FuY2hvcigmcnRsdXNiLT5yeF9jbGVhbnVwX3VyYnMpKSkgewpAQCAtNzk0LDggKzgwMCw2IEBACiAJc3RydWN0IHJ0bF91c2IgKnJ0bHVzYiA9IHJ0bF91c2JkZXYocnRsX3VzYnByaXYoaHcpKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aW5mbzsKIAotCVNFVF9VU0JfU1RPUChydGx1c2IpOwotCiAJLyogY2xlYW4gdXAgcnggc3R1ZmYuICovCiAJX3J0bF91c2JfY2xlYW51cF9yeChodyk7CiAKQEAgLTgzNCw3ICs4MzgsNiBAQAogCWNhbmNlbF93b3JrX3N5bmMoJnJ0bHByaXYtPndvcmtzLmZpbGxfaDJjX2NtZCk7CiAJLyogRW5hYmxlIHNvZnR3YXJlICovCiAJU0VUX1VTQl9TVE9QKHJ0bHVzYik7Ci0JcnRsX3VzYl9kZWluaXQoaHcpOwogCXJ0bHByaXYtPmNmZy0+b3BzLT5od19kaXNhYmxlKGh3KTsKIH0KIApAQCAtMTE0Nyw5ICsxMTUwLDkgQEAKIAogCWlmICh1bmxpa2VseSghcnRscHJpdikpCiAJCXJldHVybjsKLQogCS8qIGp1c3QgaW4gY2FzZSBkcml2ZXIgaXMgcmVtb3ZlZCBiZWZvcmUgZmlybXdhcmUgY2FsbGJhY2sgKi8KIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZydGxwcml2LT5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKKwljbGVhcl9iaXQoUlRMX1NUQVRVU19JTlRFUkZBQ0VfU1RBUlQsICZydGxwcml2LT5zdGF0dXMpOwogCS8qaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcgd2lsbCBjYWxsIG9wc19zdG9wICovCiAJaWYgKHJ0bG1hYy0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9PSAxKSB7CiAJCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGh3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDEyNTEvbWFpbi5jCmluZGV4IGQ0YmEwMDkuLjVkNTRkMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTI1MS9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxMjUxL21haW4uYwpAQCAtNDY4LDcgKzQ2OCw3IEBACiAJd2wxMjUxX3R4X2ZsdXNoKHdsKTsKIAl3bDEyNTFfcG93ZXJfb2ZmKHdsKTsKIAotCW1lbXNldCh3bC0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKHdsLT5ic3NpZCk7CiAJd2wtPmxpc3Rlbl9pbnQgPSAxOwogCXdsLT5ic3NfdHlwZSA9IE1BWF9CU1NfVFlQRTsKIApAQCAtNTQ3LDcgKzU0Nyw3IEBACiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAl3bDEyNTFfZGVidWcoREVCVUdfTUFDODAyMTEsICJtYWM4MDIxMSByZW1vdmUgaW50ZXJmYWNlIik7CiAJd2wtPnZpZiA9IE5VTEw7Ci0JbWVtc2V0KHdsLT5ic3NpZCwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIod2wtPmJzc2lkKTsKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiB9CiAKQEAgLTE2MDgsNyArMTYwOCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh3bDEyNTFfZnJlZV9odyk7CiAKLU1PRFVMRV9ERVNDUklQVElPTigiVEkgd2wxMjUxIFdpcmVsZXMgTEFOIERyaXZlciBDb3JlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRJIHdsMTI1MSBXaXJlbGVzcyBMQU4gRHJpdmVyIENvcmUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BVVRIT1IoIkthbGxlIFZhbG8gPGt2YWxvQGFkdXJvbS5jb20+Iik7CiBNT0RVTEVfRklSTVdBUkUoV0wxMjUxX0ZXX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2RlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsMTh4eC9kZWJ1Z2ZzLmMKaW5kZXggYzkzZmFlOS4uNWZiZDIyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2RlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvZGVidWdmcy5jCkBAIC0xMzksNyArMTM5LDcgQEAKIFdMMThYWF9ERUJVR0ZTX0ZXU1RBVFNfRklMRShyeF9maWx0ZXIsIGFjY3VtX2FycF9wZW5kX3JlcXVlc3RzLCAiJXUiKTsKIFdMMThYWF9ERUJVR0ZTX0ZXU1RBVFNfRklMRShyeF9maWx0ZXIsIG1heF9hcnBfcXVldWVfZGVwLCAiJXUiKTsKIAotV0wxOFhYX0RFQlVHRlNfRldTVEFUU19GSUxFKHJ4X3JhdGUsIHJ4X2ZyYW1lc19wZXJfcmF0ZXMsICIldSIpOworV0wxOFhYX0RFQlVHRlNfRldTVEFUU19GSUxFX0FSUkFZKHJ4X3JhdGUsIHJ4X2ZyYW1lc19wZXJfcmF0ZXMsIDUwKTsKIAogV0wxOFhYX0RFQlVHRlNfRldTVEFUU19GSUxFX0FSUkFZKGFnZ3Jfc2l6ZSwgdHhfYWdnX3ZzX3JhdGUsCiAJCQkJICBBR0dSX1NUQVRTX1RYX0FHRypBR0dSX1NUQVRTX1RYX1JBVEUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2wxOHh4L2V2ZW50LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvZXZlbnQuYwppbmRleCBjMjhmMDY4Li41NDhiYjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvZXZlbnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bDE4eHgvZXZlbnQuYwpAQCAtNzcsNyArNzcsNyBAQAogCXdsMTI3MV9kZWJ1ZyhERUJVR19FVkVOVCwKIAkJICAgICAiU01BUlRfQ09ORklHX1NZTkNfRVZFTlRfSUQsIGZyZXE6ICVkIChjaGFuOiAlZCBiYW5kICVkKSIsCiAJCSAgICAgZnJlcSwgc3luY19jaGFubmVsLCBzeW5jX2JhbmQpOwotCXNrYiA9IGNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYyh3bC0+aHctPndpcGh5LCAyMCwKKwlza2IgPSBjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2Mod2wtPmh3LT53aXBoeSwgTlVMTCwgMjAsCiAJCQkJCSAgV0xDT1JFX1ZFTkRPUl9FVkVOVF9TQ19TWU5DLAogCQkJCQkgIEdGUF9LRVJORUwpOwogCkBAIC05OCw3ICs5OCw3IEBACiAJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiU01BUlRfQ09ORklHX0RFQ09ERV9FVkVOVF9JRCIpOwogCXdsMTI3MV9kdW1wX2FzY2lpKERFQlVHX0VWRU5ULCAiU1NJRDoiLCBzc2lkLCBzc2lkX2xlbik7CiAKLQlza2IgPSBjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2Mod2wtPmh3LT53aXBoeSwKKwlza2IgPSBjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2Mod2wtPmh3LT53aXBoeSwgTlVMTCwKIAkJCQkJICBzc2lkX2xlbiArIHB3ZF9sZW4gKyAyMCwKIAkJCQkJICBXTENPUkVfVkVORE9SX0VWRU5UX1NDX0RFQ09ERSwKIAkJCQkJICBHRlBfS0VSTkVMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9jbWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9jbWQuYwppbmRleCBjMjZmYzIxLi42ODkxOWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL2NtZC5jCkBAIC0zNjcsNyArMzY3LDcgQEAKIAl3bC0+bGlua3NbKmhsaWRdLmFsbG9jYXRlZF9wa3RzID0gMDsKIAl3bC0+bGlua3NbKmhsaWRdLnByZXZfZnJlZWRfcGt0cyA9IDA7CiAJd2wtPmxpbmtzWypobGlkXS5iYV9iaXRtYXAgPSAwOwotCW1lbXNldCh3bC0+bGlua3NbKmhsaWRdLmFkZHIsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKHdsLT5saW5rc1sqaGxpZF0uYWRkcik7CiAKIAkvKgogCSAqIEF0IHRoaXMgcG9pbnQgb3BfdHgoKSB3aWxsIG5vdCBhZGQgbW9yZSBwYWNrZXRzIHRvIHRoZSBxdWV1ZXMuIFdlCkBAIC0xMjkzLDcgKzEyOTMsNyBAQAogCWhkci0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KGZjKTsKIAltZW1jcHkoaGRyLT5hZGRyMSwgdmlmLT5ic3NfY29uZi5ic3NpZCwgRVRIX0FMRU4pOwogCW1lbWNweShoZHItPmFkZHIyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKLQltZW1zZXQoaGRyLT5hZGRyMywgMHhmZiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcihoZHItPmFkZHIzKTsKIAogCXJldCA9IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCB3bHZpZi0+cm9sZV9pZCwgQ01EX1RFTVBMX0FSUF9SU1AsCiAJCQkJICAgICAgc2tiLT5kYXRhLCBza2ItPmxlbiwgMCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9kZWJ1Z2ZzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy90aS93bGNvcmUvZGVidWdmcy5oCmluZGV4IDBmMmNmYjAuLmJmMTQ2NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3RpL3dsY29yZS9kZWJ1Z2ZzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvdGkvd2xjb3JlL2RlYnVnZnMuaApAQCAtMjYsOCArMjYsOCBAQAogCiAjaW5jbHVkZSAid2xjb3JlLmgiCiAKLWludCB3bDEyNzFfZm9ybWF0X2J1ZmZlcihjaGFyIF9fdXNlciAqdXNlcmJ1Ziwgc2l6ZV90IGNvdW50LAotCQkJIGxvZmZfdCAqcHBvcywgY2hhciAqZm10LCAuLi4pOworX19wcmludGYoNCwgNSkgaW50IHdsMTI3MV9mb3JtYXRfYnVmZmVyKGNoYXIgX191c2VyICp1c2VyYnVmLCBzaXplX3QgY291bnQsCisJCQkJCWxvZmZfdCAqcHBvcywgY2hhciAqZm10LCAuLi4pOwogCiBpbnQgd2wxMjcxX2RlYnVnZnNfaW5pdChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiB2b2lkIHdsMTI3MV9kZWJ1Z2ZzX2V4aXQoc3RydWN0IHdsMTI3MSAqd2wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svY29tbW9uLmggYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaAppbmRleCA1ODlmYTI1Li44YTQ5NWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaAorKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9jb21tb24uaApAQCAtMjM4LDYgKzIzOCw4IEBACiAJdW5zaWduZWQgaW50IG51bV9xdWV1ZXM7IC8qIGFjdGl2ZSBxdWV1ZXMsIHJlc291cmNlIGFsbG9jYXRlZCAqLwogCXVuc2lnbmVkIGludCBzdGFsbGVkX3F1ZXVlczsKIAorCXN0cnVjdCB4ZW5idXNfd2F0Y2ggY3JlZGl0X3dhdGNoOworCiAJc3BpbmxvY2tfdCBsb2NrOwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCkBAIC0yNjAsNiArMjYyLDggQEAKIAlyZXR1cm4gdG9feGVuYnVzX2RldmljZSh2aWYtPmRldi0+ZGV2LnBhcmVudCk7CiB9CiAKK3ZvaWQgeGVudmlmX3R4X2NyZWRpdF9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworCiBzdHJ1Y3QgeGVudmlmICp4ZW52aWZfYWxsb2Moc3RydWN0IGRldmljZSAqcGFyZW50LAogCQkJICAgIGRvbWlkX3QgZG9taWQsCiAJCQkgICAgdW5zaWduZWQgaW50IGhhbmRsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9pbnRlcmZhY2UuYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2ludGVyZmFjZS5jCmluZGV4IDNhYTg2NDguLjFhODNlMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2ludGVyZmFjZS5jCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL2ludGVyZmFjZS5jCkBAIC00MzcsNyArNDM3LDcgQEAKIAkgKiBzdG9sZW4gYnkgYW4gRXRoZXJuZXQgYnJpZGdlIGZvciBTVFAgcHVycG9zZXMuCiAJICogKEZFOkZGOkZGOkZGOkZGOkZGKQogCSAqLwotCW1lbXNldChkZXYtPmRldl9hZGRyLCAweEZGLCBFVEhfQUxFTik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKGRldi0+ZGV2X2FkZHIpOwogCWRldi0+ZGV2X2FkZHJbMF0gJj0gfjB4MDE7CiAKIAluZXRpZl9jYXJyaWVyX29mZihkZXYpOwpAQCAtNDYzLDYgKzQ2Myw3IEBACiAJcXVldWUtPmNyZWRpdF9ieXRlcyA9IHF1ZXVlLT5yZW1haW5pbmdfY3JlZGl0ID0gfjBVTDsKIAlxdWV1ZS0+Y3JlZGl0X3VzZWMgID0gMFVMOwogCWluaXRfdGltZXIoJnF1ZXVlLT5jcmVkaXRfdGltZW91dCk7CisJcXVldWUtPmNyZWRpdF90aW1lb3V0LmZ1bmN0aW9uID0geGVudmlmX3R4X2NyZWRpdF9jYWxsYmFjazsKIAlxdWV1ZS0+Y3JlZGl0X3dpbmRvd19zdGFydCA9IGdldF9qaWZmaWVzXzY0KCk7CiAKIAlxdWV1ZS0+cnhfcXVldWVfbWF4ID0gWEVOVklGX1JYX1FVRVVFX0JZVEVTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCmluZGV4IGNhYjlmNTIuLmI4YzQ3MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKQEAgLTk2LDYgKzk2LDcgQEAKIHN0YXRpYyB2b2lkIG1ha2VfdHhfcmVzcG9uc2Uoc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUsCiAJCQkgICAgIHN0cnVjdCB4ZW5fbmV0aWZfdHhfcmVxdWVzdCAqdHhwLAogCQkJICAgICBzOCAgICAgICBzdCk7CitzdGF0aWMgdm9pZCBwdXNoX3R4X3Jlc3BvbnNlcyhzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHR4X3dvcmtfdG9kbyhzdHJ1Y3QgeGVudmlmX3F1ZXVlICpxdWV1ZSk7CiAKQEAgLTY0MSw3ICs2NDIsNyBAQAogCXF1ZXVlLT5yZW1haW5pbmdfY3JlZGl0ID0gbWluKG1heF9jcmVkaXQsIG1heF9idXJzdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHR4X2NyZWRpdF9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpCit2b2lkIHhlbnZpZl90eF9jcmVkaXRfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlID0gKHN0cnVjdCB4ZW52aWZfcXVldWUgKilkYXRhOwogCXR4X2FkZF9jcmVkaXQocXVldWUpOwpAQCAtNjU1LDE1ICs2NTYsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZG8gewotCQlpbnQgbm90aWZ5OwotCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+cmVzcG9uc2VfbG9jaywgZmxhZ3MpOwogCQltYWtlX3R4X3Jlc3BvbnNlKHF1ZXVlLCB0eHAsIFhFTl9ORVRJRl9SU1BfRVJST1IpOwotCQlSSU5HX1BVU0hfUkVTUE9OU0VTX0FORF9DSEVDS19OT1RJRlkoJnF1ZXVlLT50eCwgbm90aWZ5KTsKKwkJcHVzaF90eF9yZXNwb25zZXMocXVldWUpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+cmVzcG9uc2VfbG9jaywgZmxhZ3MpOwotCQlpZiAobm90aWZ5KQotCQkJbm90aWZ5X3JlbW90ZV92aWFfaXJxKHF1ZXVlLT50eF9pcnEpOwotCiAJCWlmIChjb25zID09IGVuZCkKIAkJCWJyZWFrOwogCQl0eHAgPSBSSU5HX0dFVF9SRVFVRVNUKCZxdWV1ZS0+dHgsIGNvbnMrKyk7CkBAIC0xMTY5LDggKzExNjUsNiBAQAogCWlmIChzaXplID4gcXVldWUtPnJlbWFpbmluZ19jcmVkaXQpIHsKIAkJcXVldWUtPmNyZWRpdF90aW1lb3V0LmRhdGEgICAgID0KIAkJCSh1bnNpZ25lZCBsb25nKXF1ZXVlOwotCQlxdWV1ZS0+Y3JlZGl0X3RpbWVvdXQuZnVuY3Rpb24gPQotCQkJdHhfY3JlZGl0X2NhbGxiYWNrOwogCQltb2RfdGltZXIoJnF1ZXVlLT5jcmVkaXRfdGltZW91dCwKIAkJCSAgbmV4dF9jcmVkaXQpOwogCQlxdWV1ZS0+Y3JlZGl0X3dpbmRvd19zdGFydCA9IG5leHRfY3JlZGl0OwpAQCAtMTY1Nyw3ICsxNjUxLDYgQEAKIHsKIAlzdHJ1Y3QgcGVuZGluZ190eF9pbmZvICpwZW5kaW5nX3R4X2luZm87CiAJcGVuZGluZ19yaW5nX2lkeF90IGluZGV4OwotCWludCBub3RpZnk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXBlbmRpbmdfdHhfaW5mbyA9ICZxdWV1ZS0+cGVuZGluZ190eF9pbmZvW3BlbmRpbmdfaWR4XTsKQEAgLTE2NzMsMTIgKzE2NjYsOSBAQAogCWluZGV4ID0gcGVuZGluZ19pbmRleChxdWV1ZS0+cGVuZGluZ19wcm9kKyspOwogCXF1ZXVlLT5wZW5kaW5nX3JpbmdbaW5kZXhdID0gcGVuZGluZ19pZHg7CiAKLQlSSU5HX1BVU0hfUkVTUE9OU0VTX0FORF9DSEVDS19OT1RJRlkoJnF1ZXVlLT50eCwgbm90aWZ5KTsKKwlwdXNoX3R4X3Jlc3BvbnNlcyhxdWV1ZSk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+cmVzcG9uc2VfbG9jaywgZmxhZ3MpOwotCi0JaWYgKG5vdGlmeSkKLQkJbm90aWZ5X3JlbW90ZV92aWFfaXJxKHF1ZXVlLT50eF9pcnEpOwogfQogCiAKQEAgLTE2OTksNiArMTY4OSwxNSBAQAogCXF1ZXVlLT50eC5yc3BfcHJvZF9wdnQgPSArK2k7CiB9CiAKK3N0YXRpYyB2b2lkIHB1c2hfdHhfcmVzcG9uc2VzKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlKQoreworCWludCBub3RpZnk7CisKKwlSSU5HX1BVU0hfUkVTUE9OU0VTX0FORF9DSEVDS19OT1RJRlkoJnF1ZXVlLT50eCwgbm90aWZ5KTsKKwlpZiAobm90aWZ5KQorCQlub3RpZnlfcmVtb3RlX3ZpYV9pcnEocXVldWUtPnR4X2lycSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgeGVuX25ldGlmX3J4X3Jlc3BvbnNlICptYWtlX3J4X3Jlc3BvbnNlKHN0cnVjdCB4ZW52aWZfcXVldWUgKnF1ZXVlLAogCQkJCQkgICAgIHUxNiAgICAgIGlkLAogCQkJCQkgICAgIHM4ICAgICAgIHN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2sveGVuYnVzLmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay94ZW5idXMuYwppbmRleCA3OTQyMDRlLi4zZDhkYmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay94ZW5idXMuYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay94ZW5idXMuYwpAQCAtNDEsNiArNDEsNyBAQAogc3RhdGljIGludCByZWFkX3hlbmJ1c192aWZfZmxhZ3Moc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUpOwogc3RhdGljIGludCBiYWNrZW5kX2NyZWF0ZV94ZW52aWYoc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUpOwogc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9ob3RwbHVnX3N0YXR1c193YXRjaChzdHJ1Y3QgYmFja2VuZF9pbmZvICpiZSk7CitzdGF0aWMgdm9pZCB4ZW5fdW5yZWdpc3Rlcl93YXRjaGVycyhzdHJ1Y3QgeGVudmlmICp2aWYpOwogc3RhdGljIHZvaWQgc2V0X2JhY2tlbmRfc3RhdGUoc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUsCiAJCQkgICAgICBlbnVtIHhlbmJ1c19zdGF0ZSBzdGF0ZSk7CiAKQEAgLTIzMiw2ICsyMzMsNyBAQAogCXVucmVnaXN0ZXJfaG90cGx1Z19zdGF0dXNfd2F0Y2goYmUpOwogCWlmIChiZS0+dmlmKSB7CiAJCWtvYmplY3RfdWV2ZW50KCZkZXYtPmRldi5rb2JqLCBLT0JKX09GRkxJTkUpOworCQl4ZW5fdW5yZWdpc3Rlcl93YXRjaGVycyhiZS0+dmlmKTsKIAkJeGVuYnVzX3JtKFhCVF9OSUwsIGRldi0+bm9kZW5hbWUsICJob3RwbHVnLXN0YXR1cyIpOwogCQl4ZW52aWZfZnJlZShiZS0+dmlmKTsKIAkJYmUtPnZpZiA9IE5VTEw7CkBAIC00MzAsNiArNDMyLDcgQEAKIHN0YXRpYyB2b2lkIGJhY2tlbmRfZGlzY29ubmVjdChzdHJ1Y3QgYmFja2VuZF9pbmZvICpiZSkKIHsKIAlpZiAoYmUtPnZpZikgeworCQl4ZW5fdW5yZWdpc3Rlcl93YXRjaGVycyhiZS0+dmlmKTsKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAkJeGVudmlmX2RlYnVnZnNfZGVsaWYoYmUtPnZpZik7CiAjZW5kaWYgLyogQ09ORklHX0RFQlVHX0ZTICovCkBAIC02NDUsNiArNjQ4LDU5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHhlbl9uZXRfcmF0ZV9jaGFuZ2VkKHN0cnVjdCB4ZW5idXNfd2F0Y2ggKndhdGNoLAorCQkJCWNvbnN0IGNoYXIgKip2ZWMsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc3RydWN0IHhlbnZpZiAqdmlmID0gY29udGFpbmVyX29mKHdhdGNoLCBzdHJ1Y3QgeGVudmlmLCBjcmVkaXRfd2F0Y2gpOworCXN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYgPSB4ZW52aWZfdG9feGVuYnVzX2RldmljZSh2aWYpOworCXVuc2lnbmVkIGxvbmcgICBjcmVkaXRfYnl0ZXM7CisJdW5zaWduZWQgbG9uZyAgIGNyZWRpdF91c2VjOworCXVuc2lnbmVkIGludCBxdWV1ZV9pbmRleDsKKworCXhlbl9uZXRfcmVhZF9yYXRlKGRldiwgJmNyZWRpdF9ieXRlcywgJmNyZWRpdF91c2VjKTsKKwlmb3IgKHF1ZXVlX2luZGV4ID0gMDsgcXVldWVfaW5kZXggPCB2aWYtPm51bV9xdWV1ZXM7IHF1ZXVlX2luZGV4KyspIHsKKwkJc3RydWN0IHhlbnZpZl9xdWV1ZSAqcXVldWUgPSAmdmlmLT5xdWV1ZXNbcXVldWVfaW5kZXhdOworCisJCXF1ZXVlLT5jcmVkaXRfYnl0ZXMgPSBjcmVkaXRfYnl0ZXM7CisJCXF1ZXVlLT5jcmVkaXRfdXNlYyA9IGNyZWRpdF91c2VjOworCQlpZiAoIW1vZF90aW1lcl9wZW5kaW5nKCZxdWV1ZS0+Y3JlZGl0X3RpbWVvdXQsIGppZmZpZXMpICYmCisJCQlxdWV1ZS0+cmVtYWluaW5nX2NyZWRpdCA+IHF1ZXVlLT5jcmVkaXRfYnl0ZXMpIHsKKwkJCXF1ZXVlLT5yZW1haW5pbmdfY3JlZGl0ID0gcXVldWUtPmNyZWRpdF9ieXRlczsKKwkJfQorCX0KK30KKworc3RhdGljIGludCB4ZW5fcmVnaXN0ZXJfd2F0Y2hlcnMoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldiwgc3RydWN0IHhlbnZpZiAqdmlmKQoreworCWludCBlcnIgPSAwOworCWNoYXIgKm5vZGU7CisJdW5zaWduZWQgbWF4bGVuID0gc3RybGVuKGRldi0+bm9kZW5hbWUpICsgc2l6ZW9mKCIvcmF0ZSIpOworCisJbm9kZSA9IGttYWxsb2MobWF4bGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vZGUpCisJCXJldHVybiAtRU5PTUVNOworCXNucHJpbnRmKG5vZGUsIG1heGxlbiwgIiVzL3JhdGUiLCBkZXYtPm5vZGVuYW1lKTsKKwl2aWYtPmNyZWRpdF93YXRjaC5ub2RlID0gbm9kZTsKKwl2aWYtPmNyZWRpdF93YXRjaC5jYWxsYmFjayA9IHhlbl9uZXRfcmF0ZV9jaGFuZ2VkOworCWVyciA9IHJlZ2lzdGVyX3hlbmJ1c193YXRjaCgmdmlmLT5jcmVkaXRfd2F0Y2gpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0IHdhdGNoZXIgJXNcbiIsIHZpZi0+Y3JlZGl0X3dhdGNoLm5vZGUpOworCQlrZnJlZShub2RlKTsKKwkJdmlmLT5jcmVkaXRfd2F0Y2gubm9kZSA9IE5VTEw7CisJCXZpZi0+Y3JlZGl0X3dhdGNoLmNhbGxiYWNrID0gTlVMTDsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgeGVuX3VucmVnaXN0ZXJfd2F0Y2hlcnMoc3RydWN0IHhlbnZpZiAqdmlmKQoreworCWlmICh2aWYtPmNyZWRpdF93YXRjaC5ub2RlKSB7CisJCXVucmVnaXN0ZXJfeGVuYnVzX3dhdGNoKCZ2aWYtPmNyZWRpdF93YXRjaCk7CisJCWtmcmVlKHZpZi0+Y3JlZGl0X3dhdGNoLm5vZGUpOworCQl2aWYtPmNyZWRpdF93YXRjaC5ub2RlID0gTlVMTDsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJfaG90cGx1Z19zdGF0dXNfd2F0Y2goc3RydWN0IGJhY2tlbmRfaW5mbyAqYmUpCiB7CiAJaWYgKGJlLT5oYXZlX2hvdHBsdWdfc3RhdHVzX3dhdGNoKSB7CkBAIC03MDksNiArNzY1LDcgQEAKIAl9CiAKIAl4ZW5fbmV0X3JlYWRfcmF0ZShkZXYsICZjcmVkaXRfYnl0ZXMsICZjcmVkaXRfdXNlYyk7CisJeGVuX3JlZ2lzdGVyX3dhdGNoZXJzKGRldiwgYmUtPnZpZik7CiAJcmVhZF94ZW5idXNfdmlmX2ZsYWdzKGJlKTsKIAogCS8qIFVzZSB0aGUgbnVtYmVyIG9mIHF1ZXVlcyByZXF1ZXN0ZWQgYnkgdGhlIGZyb250ZW5kICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCmluZGV4IGU5Yjk2MGYuLjcyMGFhZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCisrKyBiL2RyaXZlcnMvbmV0L3hlbi1uZXRmcm9udC5jCkBAIC0xMDA4LDggKzEwMDgsNyBAQAogCiBzdGF0aWMgaW50IHhlbm5ldF9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBtdHUpCiB7Ci0JaW50IG1heCA9IHhlbm5ldF9jYW5fc2coZGV2KSA/Ci0JCVhFTl9ORVRJRl9NQVhfVFhfU0laRSAtIE1BWF9UQ1BfSEVBREVSIDogRVRIX0RBVEFfTEVOOworCWludCBtYXggPSB4ZW5uZXRfY2FuX3NnKGRldikgPyBYRU5fTkVUSUZfTUFYX1RYX1NJWkUgOiBFVEhfREFUQV9MRU47CiAKIAlpZiAobXR1ID4gbWF4KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEyNzksOCArMTI3OCw2IEBACiAJbmV0ZGV2LT5ldGh0b29sX29wcyA9ICZ4ZW5uZXRfZXRodG9vbF9vcHM7CiAJU0VUX05FVERFVl9ERVYobmV0ZGV2LCAmZGV2LT5kZXYpOwogCi0JbmV0aWZfc2V0X2dzb19tYXhfc2l6ZShuZXRkZXYsIFhFTl9ORVRJRl9NQVhfVFhfU0laRSAtIE1BWF9UQ1BfSEVBREVSKTsKLQogCW5wLT5uZXRkZXYgPSBuZXRkZXY7CiAKIAluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvS2NvbmZpZyBiL2RyaXZlcnMvbmZjL0tjb25maWcKaW5kZXggNzkyOWZhYy4uMTA3NzE0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZmMvS2NvbmZpZworKysgYi9kcml2ZXJzL25mYy9LY29uZmlnCkBAIC03Myw0ICs3Myw1IEBACiBzb3VyY2UgImRyaXZlcnMvbmZjL25mY21ydmwvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZmMvc3QyMW5mY2EvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9uZmMvc3QyMW5mY2IvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZmMvbnhwLW5jaS9LY29uZmlnIgogZW5kbWVudQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvTWFrZWZpbGUgYi9kcml2ZXJzL25mYy9NYWtlZmlsZQppbmRleCA2YjIzYTJjLi5hNDI5MmQ3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZmMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZmMvTWFrZWZpbGUKQEAgLTEzLDUgKzEzLDYgQEAKIG9iai0kKENPTkZJR19ORkNfVFJGNzk3MEEpCSs9IHRyZjc5NzBhLm8KIG9iai0kKENPTkZJR19ORkNfU1QyMU5GQ0EpICAJKz0gc3QyMW5mY2EvCiBvYmotJChDT05GSUdfTkZDX1NUMjFORkNCKQkrPSBzdDIxbmZjYi8KK29iai0kKENPTkZJR19ORkNfTlhQX05DSSkJKz0gbnhwLW5jaS8KIAogY2NmbGFncy0kKENPTkZJR19ORkNfREVCVUcpIDo9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL21pY3JvcmVhZC9pMmMuYyBiL2RyaXZlcnMvbmZjL21pY3JvcmVhZC9pMmMuYwppbmRleCBkZjg1Y2QzLi42NjFlMmM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9taWNyb3JlYWQvaTJjLmMKKysrIGIvZHJpdmVycy9uZmMvbWljcm9yZWFkL2kyYy5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAlpZiAociA8IDApCiAJCWdvdG8gZXJyX2lycTsKIAotCW5mY19pbmZvKCZjbGllbnQtPmRldiwgIlByb2JlZCIpOworCW5mY19pbmZvKCZjbGllbnQtPmRldiwgIlByb2JlZFxuIik7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvbmZjbXJ2bC9tYWluLmMgYi9kcml2ZXJzL25mYy9uZmNtcnZsL21haW4uYwppbmRleCA4NWU4YmNmLi5hZDQ5MzNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9uZmNtcnZsL21haW4uYworKysgYi9kcml2ZXJzL25mYy9uZmNtcnZsL21haW4uYwpAQCAtMTExLDcgKzExMSw3IEBACiAKIAlwcml2LT5uZGV2ID0gbmNpX2FsbG9jYXRlX2RldmljZSgmbmZjbXJ2bF9uY2lfb3BzLCBwcm90b2NvbHMsIDAsIDApOwogCWlmICghcHJpdi0+bmRldikgewotCQluZmNfZXJyKGRldiwgIm5jaV9hbGxvY2F0ZV9kZXZpY2UgZmFpbGVkIik7CisJCW5mY19lcnIoZGV2LCAibmNpX2FsbG9jYXRlX2RldmljZSBmYWlsZWRcbiIpOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtMTIwLDcgKzEyMCw3IEBACiAKIAlyYyA9IG5jaV9yZWdpc3Rlcl9kZXZpY2UocHJpdi0+bmRldik7CiAJaWYgKHJjKSB7Ci0JCW5mY19lcnIoZGV2LCAibmNpX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQgJWQiLCByYyk7CisJCW5mY19lcnIoZGV2LCAibmNpX3JlZ2lzdGVyX2RldmljZSBmYWlsZWQgJWRcbiIsIHJjKTsKIAkJbmNpX2ZyZWVfZGV2aWNlKHByaXYtPm5kZXYpOwogCQlnb3RvIGVycm9yOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL25mY21ydmwvdXNiLmMgYi9kcml2ZXJzL25mYy9uZmNtcnZsL3VzYi5jCmluZGV4IDMyMjFjYTMuLjZjZjE1YzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmZjL25mY21ydmwvdXNiLmMKKysrIGIvZHJpdmVycy9uZmMvbmZjbXJ2bC91c2IuYwpAQCAtODAsNyArODAsNyBAQAogCWlmICghdXJiLT5zdGF0dXMpIHsKIAkJaWYgKG5mY21ydmxfbmNpX3JlY3ZfZnJhbWUoZHJ2X2RhdGEtPnByaXYsIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAogCQkJCQkgICB1cmItPmFjdHVhbF9sZW5ndGgpIDwgMCkKLQkJCW5mY19lcnIoJmRydl9kYXRhLT51ZGV2LT5kZXYsICJjb3JydXB0ZWQgUnggcGFja2V0Iik7CisJCQluZmNfZXJyKCZkcnZfZGF0YS0+dWRldi0+ZGV2LCAiY29ycnVwdGVkIFJ4IHBhY2tldFxuIik7CiAJfQogCiAJaWYgKCF0ZXN0X2JpdChORkNNUlZMX1VTQl9CVUxLX1JVTk5JTkcsICZkcnZfZGF0YS0+ZmxhZ3MpKQpAQCAtOTYsNyArOTYsNyBAQAogCQkgKi8KIAkJaWYgKGVyciAhPSAtRVBFUk0gJiYgZXJyICE9IC1FTk9ERVYpCiAJCQluZmNfZXJyKCZkcnZfZGF0YS0+dWRldi0+ZGV2LAotCQkJCSJ1cmIgJXAgZmFpbGVkIHRvIHJlc3VibWl0ICglZCkiLCB1cmIsIC1lcnIpOworCQkJCSJ1cmIgJXAgZmFpbGVkIHRvIHJlc3VibWl0ICglZClcbiIsIHVyYiwgLWVycik7CiAJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKIAl9CiB9CkBAIC0xMzcsNyArMTM3LDcgQEAKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgIT0gLUVQRVJNICYmIGVyciAhPSAtRU5PREVWKQogCQkJbmZjX2VycigmZHJ2X2RhdGEtPnVkZXYtPmRldiwKLQkJCQkidXJiICVwIHN1Ym1pc3Npb24gZmFpbGVkICglZCkiLCB1cmIsIC1lcnIpOworCQkJCSJ1cmIgJXAgc3VibWlzc2lvbiBmYWlsZWQgKCVkKVxuIiwgdXJiLCAtZXJyKTsKIAkJdXNiX3VuYW5jaG9yX3VyYih1cmIpOwogCX0KIApAQCAtMTUzLDcgKzE1Myw3IEBACiAJc3RydWN0IG5mY21ydmxfcHJpdmF0ZSAqcHJpdiA9IG5jaV9nZXRfZHJ2ZGF0YShuZGV2KTsKIAlzdHJ1Y3QgbmZjbXJ2bF91c2JfZHJ2X2RhdGEgKmRydl9kYXRhID0gcHJpdi0+ZHJ2X2RhdGE7CiAKLQluZmNfaW5mbyhwcml2LT5kZXYsICJ1cmIgJXAgc3RhdHVzICVkIGNvdW50ICVkIiwKKwluZmNfaW5mbyhwcml2LT5kZXYsICJ1cmIgJXAgc3RhdHVzICVkIGNvdW50ICVkXG4iLAogCQkgdXJiLCB1cmItPnN0YXR1cywgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAogCXNwaW5fbG9jaygmZHJ2X2RhdGEtPnR4bG9jayk7CkBAIC0yNTMsNyArMjUzLDcgQEAKIAlpZiAoZXJyKSB7CiAJCWlmIChlcnIgIT0gLUVQRVJNICYmIGVyciAhPSAtRU5PREVWKQogCQkJbmZjX2VycigmZHJ2X2RhdGEtPnVkZXYtPmRldiwKLQkJCQkidXJiICVwIHN1Ym1pc3Npb24gZmFpbGVkICglZCkiLCB1cmIsIC1lcnIpOworCQkJCSJ1cmIgJXAgc3VibWlzc2lvbiBmYWlsZWQgKCVkKVxuIiwgdXJiLCAtZXJyKTsKIAkJa2ZyZWUodXJiLT5zZXR1cF9wYWNrZXQpOwogCQl1c2JfdW5hbmNob3JfdXJiKHVyYik7CiAJfSBlbHNlIHsKQEAgLTI5Myw3ICsyOTMsNyBAQAogCWludCBpOwogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gaW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKIAotCW5mY19pbmZvKCZ1ZGV2LT5kZXYsICJpbnRmICVwIGlkICVwIiwgaW50ZiwgaWQpOworCW5mY19pbmZvKCZ1ZGV2LT5kZXYsICJpbnRmICVwIGlkICVwXG4iLCBpbnRmLCBpZCk7CiAKIAlkcnZfZGF0YSA9IGRldm1fa3phbGxvYygmaW50Zi0+ZGV2LCBzaXplb2YoKmRydl9kYXRhKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkcnZfZGF0YSkKQEAgLTM0OCw3ICszNDgsNyBAQAogCWlmICghZHJ2X2RhdGEpCiAJCXJldHVybjsKIAotCW5mY19pbmZvKCZkcnZfZGF0YS0+dWRldi0+ZGV2LCAiaW50ZiAlcCIsIGludGYpOworCW5mY19pbmZvKCZkcnZfZGF0YS0+dWRldi0+ZGV2LCAiaW50ZiAlcFxuIiwgaW50Zik7CiAKIAluZmNtcnZsX25jaV91bnJlZ2lzdGVyX2RldihkcnZfZGF0YS0+cHJpdik7CiAKQEAgLTM2MCw3ICszNjAsNyBAQAogewogCXN0cnVjdCBuZmNtcnZsX3VzYl9kcnZfZGF0YSAqZHJ2X2RhdGEgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCi0JbmZjX2luZm8oJmRydl9kYXRhLT51ZGV2LT5kZXYsICJpbnRmICVwIiwgaW50Zik7CisJbmZjX2luZm8oJmRydl9kYXRhLT51ZGV2LT5kZXYsICJpbnRmICVwXG4iLCBpbnRmKTsKIAogCWlmIChkcnZfZGF0YS0+c3VzcGVuZF9jb3VudCsrKQogCQlyZXR1cm4gMDsKQEAgLTQwMSw3ICs0MDEsNyBAQAogCXN0cnVjdCBuZmNtcnZsX3VzYl9kcnZfZGF0YSAqZHJ2X2RhdGEgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOwogCWludCBlcnIgPSAwOwogCi0JbmZjX2luZm8oJmRydl9kYXRhLT51ZGV2LT5kZXYsICJpbnRmICVwIiwgaW50Zik7CisJbmZjX2luZm8oJmRydl9kYXRhLT51ZGV2LT5kZXYsICJpbnRmICVwXG4iLCBpbnRmKTsKIAogCWlmICgtLWRydl9kYXRhLT5zdXNwZW5kX2NvdW50KQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL254cC1uY2kvS2NvbmZpZyBiL2RyaXZlcnMvbmZjL254cC1uY2kvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2I0MDYxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZmMvbnhwLW5jaS9LY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKK2NvbmZpZyBORkNfTlhQX05DSQorCXRyaXN0YXRlICJOWFAtTkNJIE5GQyBkcml2ZXIiCisJZGVwZW5kcyBvbiBORkNfTkNJCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgR2VuZXJpYyBjb3JlIGRyaXZlciBmb3IgTlhQIE5DSSBjaGlwcyBzdWNoIGFzIHRoZSBOUEMxMDAKKwkgIG9yIFBONzE1MCBmYW1pbGllcy4KKwkgIFRoaXMgaXMgYSBkcml2ZXIgYmFzZWQgb24gdGhlIE5DSSBORkMga2VybmVsIGxheWVycyBhbmQKKwkgIHdpbGwgdGh1cyBub3Qgd29yayB3aXRoIE5YUCBsaWJuZmMgbGlicmFyeS4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIG0gaGVyZS4gVGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbnhwX25jaS4KKwkgIFNheSBOIGlmIHVuc3VyZS4KKworY29uZmlnIE5GQ19OWFBfTkNJX0kyQworCXRyaXN0YXRlICJOWFAtTkNJIEkyQyBzdXBwb3J0IgorCWRlcGVuZHMgb24gTkZDX05YUF9OQ0kgJiYgSTJDCisJLS0taGVscC0tLQorCSAgVGhpcyBtb2R1bGUgYWRkcyBzdXBwb3J0IGZvciBhbiBJMkMgaW50ZXJmYWNlIHRvIHRoZSBOWFAgTkNJCisJICBjaGlwcy4KKwkgIFNlbGVjdCB0aGlzIGlmIHlvdXIgcGxhdGZvcm0gaXMgdXNpbmcgdGhlIEkyQyBidXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBtIGhlcmUuIFRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIG54cF9uY2lfaTJjLgorCSAgU2F5IFkgaWYgdW5zdXJlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvbnhwLW5jaS9NYWtlZmlsZSBiL2RyaXZlcnMvbmZjL254cC1uY2kvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwOGJlMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmZjL254cC1uY2kvTWFrZWZpbGUKQEAgLTAsMCArMSwxMSBAQAorIworIyBNYWtlZmlsZSBmb3IgTlhQLU5DSSBORkMgZHJpdmVyCisjCisKK254cC1uY2ktb2JqcyA9IGNvcmUubyBmaXJtd2FyZS5vCitueHAtbmNpX2kyYy1vYmpzID0gaTJjLm8KKworb2JqLSQoQ09ORklHX05GQ19OWFBfTkNJKSArPSBueHAtbmNpLm8KK29iai0kKENPTkZJR19ORkNfTlhQX05DSV9JMkMpICs9IG54cC1uY2lfaTJjLm8KKworY2NmbGFncy0kKENPTkZJR19ORkNfREVCVUcpIDo9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL254cC1uY2kvY29yZS5jIGIvZHJpdmVycy9uZmMvbnhwLW5jaS9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3OTYzNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmZjL254cC1uY2kvY29yZS5jCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogR2VuZXJpYyBkcml2ZXIgZm9yIE5YUCBOQ0kgTkZDIGNoaXBzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0ICBOWFAgU2VtaWNvbmR1Y3RvcnMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQXV0aG9yczogQ2zDqW1lbnQgUGVycm9jaGF1ZCA8Y2xlbWVudC5wZXJyb2NoYXVkQG54cC5jb20+CisgKgorICogRGVyaXZlZCBmcm9tIFBONTQ0IGRldmljZSBkcml2ZXI6CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25mYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvbnhwLW5jaS5oPgorCisjaW5jbHVkZSA8bmV0L25mYy9uY2lfY29yZS5oPgorCisjaW5jbHVkZSAibnhwLW5jaS5oIgorCisjZGVmaW5lIE5YUF9OQ0lfSERSX0xFTgk0CisKKyNkZWZpbmUgTlhQX05DSV9ORkNfUFJPVE9DT0xTIChORkNfUFJPVE9fSkVXRUxfTUFTSyB8IFwKKwkJCSAgICAgICBORkNfUFJPVE9fTUlGQVJFX01BU0sgfCBcCisJCQkgICAgICAgTkZDX1BST1RPX0ZFTElDQV9NQVNLIHwgXAorCQkJICAgICAgIE5GQ19QUk9UT19JU08xNDQ0M19NQVNLIHwgXAorCQkJICAgICAgIE5GQ19QUk9UT19JU08xNDQ0M19CX01BU0sgfCBcCisJCQkgICAgICAgTkZDX1BST1RPX05GQ19ERVBfTUFTSykKKworc3RhdGljIGludCBueHBfbmNpX29wZW4oc3RydWN0IG5jaV9kZXYgKm5kZXYpCit7CisJc3RydWN0IG54cF9uY2lfaW5mbyAqaW5mbyA9IG5jaV9nZXRfZHJ2ZGF0YShuZGV2KTsKKwlpbnQgciA9IDA7CisKKwltdXRleF9sb2NrKCZpbmZvLT5pbmZvX2xvY2spOworCisJaWYgKGluZm8tPm1vZGUgIT0gTlhQX05DSV9NT0RFX0NPTEQpIHsKKwkJciA9IC1FQlVTWTsKKwkJZ290byBvcGVuX2V4aXQ7CisJfQorCisJaWYgKGluZm8tPnBoeV9vcHMtPnNldF9tb2RlKQorCQlyID0gaW5mby0+cGh5X29wcy0+c2V0X21vZGUoaW5mby0+cGh5X2lkLCBOWFBfTkNJX01PREVfTkNJKTsKKworCWluZm8tPm1vZGUgPSBOWFBfTkNJX01PREVfTkNJOworCitvcGVuX2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5pbmZvX2xvY2spOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG54cF9uY2lfY2xvc2Uoc3RydWN0IG5jaV9kZXYgKm5kZXYpCit7CisJc3RydWN0IG54cF9uY2lfaW5mbyAqaW5mbyA9IG5jaV9nZXRfZHJ2ZGF0YShuZGV2KTsKKwlpbnQgciA9IDA7CisKKwltdXRleF9sb2NrKCZpbmZvLT5pbmZvX2xvY2spOworCisJaWYgKGluZm8tPnBoeV9vcHMtPnNldF9tb2RlKQorCQlyID0gaW5mby0+cGh5X29wcy0+c2V0X21vZGUoaW5mby0+cGh5X2lkLCBOWFBfTkNJX01PREVfQ09MRCk7CisKKwlpbmZvLT5tb2RlID0gTlhQX05DSV9NT0RFX0NPTEQ7CisKKwltdXRleF91bmxvY2soJmluZm8tPmluZm9fbG9jayk7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgbnhwX25jaV9zZW5kKHN0cnVjdCBuY2lfZGV2ICpuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBueHBfbmNpX2luZm8gKmluZm8gPSBuY2lfZ2V0X2RydmRhdGEobmRldik7CisJaW50IHI7CisKKwlpZiAoIWluZm8tPnBoeV9vcHMtPndyaXRlKSB7CisJCXIgPSAtRU5PVFNVUFA7CisJCWdvdG8gc2VuZF9leGl0OworCX0KKworCWlmIChpbmZvLT5tb2RlICE9IE5YUF9OQ0lfTU9ERV9OQ0kpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gc2VuZF9leGl0OworCX0KKworCXIgPSBpbmZvLT5waHlfb3BzLT53cml0ZShpbmZvLT5waHlfaWQsIHNrYik7CisJaWYgKHIgPCAwKQorCQlrZnJlZV9za2Ioc2tiKTsKKworc2VuZF9leGl0OgorCXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IG5jaV9vcHMgbnhwX25jaV9vcHMgPSB7CisJLm9wZW4gPSBueHBfbmNpX29wZW4sCisJLmNsb3NlID0gbnhwX25jaV9jbG9zZSwKKwkuc2VuZCA9IG54cF9uY2lfc2VuZCwKKwkuZndfZG93bmxvYWQgPSBueHBfbmNpX2Z3X2Rvd25sb2FkLAorfTsKKworaW50IG54cF9uY2lfcHJvYmUodm9pZCAqcGh5X2lkLCBzdHJ1Y3QgZGV2aWNlICpwZGV2LAorCQkgIHN0cnVjdCBueHBfbmNpX3BoeV9vcHMgKnBoeV9vcHMsIHVuc2lnbmVkIGludCBtYXhfcGF5bG9hZCwKKwkJICBzdHJ1Y3QgbmNpX2RldiAqKm5kZXYpCit7CisJc3RydWN0IG54cF9uY2lfaW5mbyAqaW5mbzsKKwlpbnQgcjsKKworCWluZm8gPSBkZXZtX2t6YWxsb2MocGRldiwgc2l6ZW9mKHN0cnVjdCBueHBfbmNpX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluZm8pIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gcHJvYmVfZXhpdDsKKwl9CisKKwlpbmZvLT5waHlfaWQgPSBwaHlfaWQ7CisJaW5mby0+cGRldiA9IHBkZXY7CisJaW5mby0+cGh5X29wcyA9IHBoeV9vcHM7CisJaW5mby0+bWF4X3BheWxvYWQgPSBtYXhfcGF5bG9hZDsKKwlJTklUX1dPUksoJmluZm8tPmZ3X2luZm8ud29yaywgbnhwX25jaV9md193b3JrKTsKKwlpbml0X2NvbXBsZXRpb24oJmluZm8tPmZ3X2luZm8uY21kX2NvbXBsZXRpb24pOworCW11dGV4X2luaXQoJmluZm8tPmluZm9fbG9jayk7CisKKwlpZiAoaW5mby0+cGh5X29wcy0+c2V0X21vZGUpIHsKKwkJciA9IGluZm8tPnBoeV9vcHMtPnNldF9tb2RlKGluZm8tPnBoeV9pZCwgTlhQX05DSV9NT0RFX0NPTEQpOworCQlpZiAociA8IDApCisJCQlnb3RvIHByb2JlX2V4aXQ7CisJfQorCisJaW5mby0+bW9kZSA9IE5YUF9OQ0lfTU9ERV9DT0xEOworCisJaW5mby0+bmRldiA9IG5jaV9hbGxvY2F0ZV9kZXZpY2UoJm54cF9uY2lfb3BzLCBOWFBfTkNJX05GQ19QUk9UT0NPTFMsCisJCQkJCSBOWFBfTkNJX0hEUl9MRU4sIDApOworCWlmICghaW5mby0+bmRldikgeworCQlyID0gLUVOT01FTTsKKwkJZ290byBwcm9iZV9leGl0OworCX0KKworCW5jaV9zZXRfcGFyZW50X2RldihpbmZvLT5uZGV2LCBwZGV2KTsKKwluY2lfc2V0X2RydmRhdGEoaW5mby0+bmRldiwgaW5mbyk7CisJciA9IG5jaV9yZWdpc3Rlcl9kZXZpY2UoaW5mby0+bmRldik7CisJaWYgKHIgPCAwKQorCQlnb3RvIHByb2JlX2V4aXRfZnJlZV9uY2k7CisKKwkqbmRldiA9IGluZm8tPm5kZXY7CisKKwlnb3RvIHByb2JlX2V4aXQ7CisKK3Byb2JlX2V4aXRfZnJlZV9uY2k6CisJbmNpX2ZyZWVfZGV2aWNlKGluZm8tPm5kZXYpOworcHJvYmVfZXhpdDoKKwlyZXR1cm4gcjsKK30KK0VYUE9SVF9TWU1CT0wobnhwX25jaV9wcm9iZSk7CisKK3ZvaWQgbnhwX25jaV9yZW1vdmUoc3RydWN0IG5jaV9kZXYgKm5kZXYpCit7CisJc3RydWN0IG54cF9uY2lfaW5mbyAqaW5mbyA9IG5jaV9nZXRfZHJ2ZGF0YShuZGV2KTsKKworCWlmIChpbmZvLT5tb2RlID09IE5YUF9OQ0lfTU9ERV9GVykKKwkJbnhwX25jaV9md193b3JrX2NvbXBsZXRlKGluZm8sIC1FU0hVVERPV04pOworCWNhbmNlbF93b3JrX3N5bmMoJmluZm8tPmZ3X2luZm8ud29yayk7CisKKwltdXRleF9sb2NrKCZpbmZvLT5pbmZvX2xvY2spOworCisJaWYgKGluZm8tPnBoeV9vcHMtPnNldF9tb2RlKQorCQlpbmZvLT5waHlfb3BzLT5zZXRfbW9kZShpbmZvLT5waHlfaWQsIE5YUF9OQ0lfTU9ERV9DT0xEKTsKKworCW5jaV91bnJlZ2lzdGVyX2RldmljZShuZGV2KTsKKwluY2lfZnJlZV9kZXZpY2UobmRldik7CisKKwltdXRleF91bmxvY2soJmluZm8tPmluZm9fbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MKG54cF9uY2lfcmVtb3ZlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJOWFAgTkNJIE5GQyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkNsw6ltZW50IFBlcnJvY2hhdWQgPGNsZW1lbnQucGVycm9jaGF1ZEBueHAuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvbnhwLW5jaS9maXJtd2FyZS5jIGIvZHJpdmVycy9uZmMvbnhwLW5jaS9maXJtd2FyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOTE3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25mYy9ueHAtbmNpL2Zpcm13YXJlLmMKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBHZW5lcmljIGRyaXZlciBmb3IgTlhQIE5DSSBORkMgY2hpcHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgIE5YUCBTZW1pY29uZHVjdG9ycyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBBdXRob3I6IENsw6ltZW50IFBlcnJvY2hhdWQgPGNsZW1lbnQucGVycm9jaGF1ZEBueHAuY29tPgorICoKKyAqIERlcml2ZWQgZnJvbSBQTjU0NCBkZXZpY2UgZHJpdmVyOgorICogQ29weXJpZ2h0IChDKSAyMDEyICBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZmMuaD4KKyNpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvYWNjZXNzX29rLmg+CisKKyNpbmNsdWRlICJueHAtbmNpLmgiCisKKy8qIENyeXB0byBvcGVyYXRpb25zIGNhbiB0YWtlIHVwIHRvIDMwIHNlY29uZHMgKi8KKyNkZWZpbmUgTlhQX05DSV9GV19BTlNXRVJfVElNRU9VVAltc2Vjc190b19qaWZmaWVzKDMwMDAwKQorCisjZGVmaW5lIE5YUF9OQ0lfRldfQ01EX1JFU0VUCQkweEYwCisjZGVmaW5lIE5YUF9OQ0lfRldfQ01EX0dFVFZFUlNJT04JMHhGMQorI2RlZmluZSBOWFBfTkNJX0ZXX0NNRF9DSEVDS0lOVEVHUklUWQkweEUwCisjZGVmaW5lIE5YUF9OQ0lfRldfQ01EX1dSSVRFCQkweEMwCisjZGVmaW5lIE5YUF9OQ0lfRldfQ01EX1JFQUQJCTB4QTIKKyNkZWZpbmUgTlhQX05DSV9GV19DTURfR0VUU0VTU0lPTlNUQVRFCTB4RjIKKyNkZWZpbmUgTlhQX05DSV9GV19DTURfTE9HCQkweEE3CisjZGVmaW5lIE5YUF9OQ0lfRldfQ01EX0ZPUkNFCQkweEQwCisjZGVmaW5lIE5YUF9OQ0lfRldfQ01EX0dFVF9ESUVfSUQJMHhGNAorCisjZGVmaW5lIE5YUF9OQ0lfRldfQ0hVTktfRkxBRwkweDA0MDAKKworI2RlZmluZSBOWFBfTkNJX0ZXX1JFU1VMVF9PSwkJCQkweDAwCisjZGVmaW5lIE5YUF9OQ0lfRldfUkVTVUxUX0lOVkFMSURfQUREUgkJCTB4MDEKKyNkZWZpbmUgTlhQX05DSV9GV19SRVNVTFRfR0VORVJJQ19FUlJPUgkJCTB4MDIKKyNkZWZpbmUgTlhQX05DSV9GV19SRVNVTFRfVU5LTk9XTl9DTUQJCQkweDBCCisjZGVmaW5lIE5YUF9OQ0lfRldfUkVTVUxUX0FCT1JURURfQ01ECQkJMHgwQworI2RlZmluZSBOWFBfTkNJX0ZXX1JFU1VMVF9QTExfRVJST1IJCQkweDBECisjZGVmaW5lIE5YUF9OQ0lfRldfUkVTVUxUX0FERFJfUkFOR0VfT0ZMX0VSUk9SCQkweDFFCisjZGVmaW5lIE5YUF9OQ0lfRldfUkVTVUxUX0JVRkZFUl9PRkxfRVJST1IJCTB4MUYKKyNkZWZpbmUgTlhQX05DSV9GV19SRVNVTFRfTUVNX0JTWQkJCTB4MjAKKyNkZWZpbmUgTlhQX05DSV9GV19SRVNVTFRfU0lHTkFUVVJFX0VSUk9SCQkweDIxCisjZGVmaW5lIE5YUF9OQ0lfRldfUkVTVUxUX0ZJUk1XQVJFX1ZFUlNJT05fRVJST1IJMHgyNAorI2RlZmluZSBOWFBfTkNJX0ZXX1JFU1VMVF9QUk9UT0NPTF9FUlJPUgkJMHgyOAorI2RlZmluZSBOWFBfTkNJX0ZXX1JFU1VMVF9TRldVX0RFR1JBREVECQkJMHgyQQorI2RlZmluZSBOWFBfTkNJX0ZXX1JFU1VMVF9QSF9TVEFUVVNfRklSU1RfQ0hVTksJCTB4MkQKKyNkZWZpbmUgTlhQX05DSV9GV19SRVNVTFRfUEhfU1RBVFVTX05FWFRfQ0hVTksJCTB4MkUKKyNkZWZpbmUgTlhQX05DSV9GV19SRVNVTFRfUEhfU1RBVFVTX0lOVEVSTkFMX0VSUk9SXzUJMHhDNQorCit2b2lkIG54cF9uY2lfZndfd29ya19jb21wbGV0ZShzdHJ1Y3QgbnhwX25jaV9pbmZvICppbmZvLCBpbnQgcmVzdWx0KQoreworCXN0cnVjdCBueHBfbmNpX2Z3X2luZm8gKmZ3X2luZm8gPSAmaW5mby0+ZndfaW5mbzsKKwlpbnQgcjsKKworCWlmIChpbmZvLT5waHlfb3BzLT5zZXRfbW9kZSkgeworCQlyID0gaW5mby0+cGh5X29wcy0+c2V0X21vZGUoaW5mby0+cGh5X2lkLCBOWFBfTkNJX01PREVfQ09MRCk7CisJCWlmIChyIDwgMCAmJiByZXN1bHQgPT0gMCkKKwkJCXJlc3VsdCA9IC1yOworCX0KKworCWluZm8tPm1vZGUgPSBOWFBfTkNJX01PREVfQ09MRDsKKworCWlmIChmd19pbmZvLT5mdykgeworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2luZm8tPmZ3KTsKKwkJZndfaW5mby0+ZncgPSBOVUxMOworCX0KKworCW5mY19md19kb3dubG9hZF9kb25lKGluZm8tPm5kZXYtPm5mY19kZXYsIGZ3X2luZm8tPm5hbWUsICh1MzIpIC1yZXN1bHQpOworfQorCisvKiBjcmNfY2NpdHQgY2Fubm90IGJlIHVzZWQgc2luY2UgaXQgaXMgY29tcHV0ZWQgTVNCIGZpcnN0IGFuZCBub3QgTFNCIGZpcnN0ICovCitzdGF0aWMgdTE2IG54cF9uY2lfZndfY3JjKHU4IGNvbnN0ICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJdTE2IGNyYyA9IDB4ZmZmZjsKKworCXdoaWxlIChsZW4tLSkgeworCQljcmMgPSAoKGNyYyA+PiA4KSB8IChjcmMgPDwgOCkpIF4gKmJ1ZmZlcisrOworCQljcmMgXj0gKGNyYyAmIDB4ZmYpID4+IDQ7CisJCWNyYyBePSAoY3JjICYgMHhmZikgPDwgMTI7CisJCWNyYyBePSAoY3JjICYgMHhmZikgPDwgNTsKKwl9CisKKwlyZXR1cm4gY3JjOworfQorCitzdGF0aWMgaW50IG54cF9uY2lfZndfc2VuZF9jaHVuayhzdHJ1Y3QgbnhwX25jaV9pbmZvICppbmZvKQoreworCXN0cnVjdCBueHBfbmNpX2Z3X2luZm8gKmZ3X2luZm8gPSAmaW5mby0+ZndfaW5mbzsKKwl1MTYgaGVhZGVyLCBjcmM7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzaXplX3QgY2h1bmtfbGVuOworCXNpemVfdCByZW1haW5pbmdfbGVuOworCWludCByOworCisJc2tiID0gbmNpX3NrYl9hbGxvYyhpbmZvLT5uZGV2LCBpbmZvLT5tYXhfcGF5bG9hZCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpIHsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gY2h1bmtfZXhpdDsKKwl9CisKKwljaHVua19sZW4gPSBpbmZvLT5tYXhfcGF5bG9hZCAtIE5YUF9OQ0lfRldfSERSX0xFTiAtIE5YUF9OQ0lfRldfQ1JDX0xFTjsKKwlyZW1haW5pbmdfbGVuID0gZndfaW5mby0+ZnJhbWVfc2l6ZSAtIGZ3X2luZm8tPndyaXR0ZW47CisKKwlpZiAocmVtYWluaW5nX2xlbiA+IGNodW5rX2xlbikgeworCQloZWFkZXIgPSBOWFBfTkNJX0ZXX0NIVU5LX0ZMQUc7CisJfSBlbHNlIHsKKwkJY2h1bmtfbGVuID0gcmVtYWluaW5nX2xlbjsKKwkJaGVhZGVyID0gMHgwMDAwOworCX0KKworCWhlYWRlciB8PSBjaHVua19sZW4gJiBOWFBfTkNJX0ZXX0ZSQU1FX0xFTl9NQVNLOworCXB1dF91bmFsaWduZWRfYmUxNihoZWFkZXIsIHNrYl9wdXQoc2tiLCBOWFBfTkNJX0ZXX0hEUl9MRU4pKTsKKworCW1lbWNweShza2JfcHV0KHNrYiwgY2h1bmtfbGVuKSwgZndfaW5mby0+ZGF0YSArIGZ3X2luZm8tPndyaXR0ZW4sCisJICAgICAgIGNodW5rX2xlbik7CisKKwljcmMgPSBueHBfbmNpX2Z3X2NyYyhza2ItPmRhdGEsIGNodW5rX2xlbiArIE5YUF9OQ0lfRldfSERSX0xFTik7CisJcHV0X3VuYWxpZ25lZF9iZTE2KGNyYywgc2tiX3B1dChza2IsIE5YUF9OQ0lfRldfQ1JDX0xFTikpOworCisJciA9IGluZm8tPnBoeV9vcHMtPndyaXRlKGluZm8tPnBoeV9pZCwgc2tiKTsKKwlpZiAociA+PSAwKQorCQlyID0gY2h1bmtfbGVuOworCisJa2ZyZWVfc2tiKHNrYik7CisKK2NodW5rX2V4aXQ6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgbnhwX25jaV9md19zZW5kKHN0cnVjdCBueHBfbmNpX2luZm8gKmluZm8pCit7CisJc3RydWN0IG54cF9uY2lfZndfaW5mbyAqZndfaW5mbyA9ICZpbmZvLT5md19pbmZvOworCWxvbmcgY29tcGxldGlvbl9yYzsKKwlpbnQgcjsKKworCXJlaW5pdF9jb21wbGV0aW9uKCZmd19pbmZvLT5jbWRfY29tcGxldGlvbik7CisKKwlpZiAoZndfaW5mby0+d3JpdHRlbiA9PSAwKSB7CisJCWZ3X2luZm8tPmZyYW1lX3NpemUgPSBnZXRfdW5hbGlnbmVkX2JlMTYoZndfaW5mby0+ZGF0YSkgJgorCQkJCSAgICAgIE5YUF9OQ0lfRldfRlJBTUVfTEVOX01BU0s7CisJCWZ3X2luZm8tPmRhdGEgKz0gTlhQX05DSV9GV19IRFJfTEVOOworCQlmd19pbmZvLT5zaXplIC09IE5YUF9OQ0lfRldfSERSX0xFTjsKKwl9CisKKwlpZiAoZndfaW5mby0+ZnJhbWVfc2l6ZSA+IGZ3X2luZm8tPnNpemUpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlyID0gbnhwX25jaV9md19zZW5kX2NodW5rKGluZm8pOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisKKwlmd19pbmZvLT53cml0dGVuICs9IHI7CisKKwlpZiAoKmZ3X2luZm8tPmRhdGEgPT0gTlhQX05DSV9GV19DTURfUkVTRVQpIHsKKwkJZndfaW5mby0+Y21kX3Jlc3VsdCA9IDA7CisJCWlmIChmd19pbmZvLT5mdykKKwkJCXNjaGVkdWxlX3dvcmsoJmZ3X2luZm8tPndvcmspOworCX0gZWxzZSB7CisJCWNvbXBsZXRpb25fcmMgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dCgKKwkJCSZmd19pbmZvLT5jbWRfY29tcGxldGlvbiwgTlhQX05DSV9GV19BTlNXRVJfVElNRU9VVCk7CisJCWlmIChjb21wbGV0aW9uX3JjID09IDApCisJCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBueHBfbmNpX2Z3X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBueHBfbmNpX2luZm8gKmluZm87CisJc3RydWN0IG54cF9uY2lfZndfaW5mbyAqZndfaW5mbzsKKwlpbnQgcjsKKworCWZ3X2luZm8gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG54cF9uY2lfZndfaW5mbywgd29yayk7CisJaW5mbyA9IGNvbnRhaW5lcl9vZihmd19pbmZvLCBzdHJ1Y3QgbnhwX25jaV9pbmZvLCBmd19pbmZvKTsKKworCW11dGV4X2xvY2soJmluZm8tPmluZm9fbG9jayk7CisKKwlyID0gZndfaW5mby0+Y21kX3Jlc3VsdDsKKwlpZiAociA8IDApCisJCWdvdG8gZXhpdF93b3JrOworCisJaWYgKGZ3X2luZm8tPndyaXR0ZW4gPT0gZndfaW5mby0+ZnJhbWVfc2l6ZSkgeworCQlmd19pbmZvLT5kYXRhICs9IGZ3X2luZm8tPmZyYW1lX3NpemU7CisJCWZ3X2luZm8tPnNpemUgLT0gZndfaW5mby0+ZnJhbWVfc2l6ZTsKKwkJZndfaW5mby0+d3JpdHRlbiA9IDA7CisJfQorCisJaWYgKGZ3X2luZm8tPnNpemUgPiAwKQorCQlyID0gbnhwX25jaV9md19zZW5kKGluZm8pOworCitleGl0X3dvcms6CisJaWYgKHIgPCAwIHx8IGZ3X2luZm8tPnNpemUgPT0gMCkKKwkJbnhwX25jaV9md193b3JrX2NvbXBsZXRlKGluZm8sIHIpOworCW11dGV4X3VubG9jaygmaW5mby0+aW5mb19sb2NrKTsKK30KKworaW50IG54cF9uY2lfZndfZG93bmxvYWQoc3RydWN0IG5jaV9kZXYgKm5kZXYsIGNvbnN0IGNoYXIgKmZpcm13YXJlX25hbWUpCit7CisJc3RydWN0IG54cF9uY2lfaW5mbyAqaW5mbyA9IG5jaV9nZXRfZHJ2ZGF0YShuZGV2KTsKKwlzdHJ1Y3QgbnhwX25jaV9md19pbmZvICpmd19pbmZvID0gJmluZm8tPmZ3X2luZm87CisJaW50IHI7CisKKwltdXRleF9sb2NrKCZpbmZvLT5pbmZvX2xvY2spOworCisJaWYgKCFpbmZvLT5waHlfb3BzLT5zZXRfbW9kZSB8fCAhaW5mby0+cGh5X29wcy0+d3JpdGUpIHsKKwkJciA9IC1FTk9UU1VQUDsKKwkJZ290byBmd19kb3dubG9hZF9leGl0OworCX0KKworCWlmICghZmlybXdhcmVfbmFtZSB8fCBmaXJtd2FyZV9uYW1lWzBdID09ICdcMCcpIHsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZndfZG93bmxvYWRfZXhpdDsKKwl9CisKKwlzdHJjcHkoZndfaW5mby0+bmFtZSwgZmlybXdhcmVfbmFtZSk7CisKKwlyID0gcmVxdWVzdF9maXJtd2FyZSgmZndfaW5mby0+ZncsIGZpcm13YXJlX25hbWUsCisJCQkgICAgIG5kZXYtPm5mY19kZXYtPmRldi5wYXJlbnQpOworCWlmIChyIDwgMCkKKwkJZ290byBmd19kb3dubG9hZF9leGl0OworCisJciA9IGluZm8tPnBoeV9vcHMtPnNldF9tb2RlKGluZm8tPnBoeV9pZCwgTlhQX05DSV9NT0RFX0ZXKTsKKwlpZiAociA8IDApIHsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19pbmZvLT5mdyk7CisJCWdvdG8gZndfZG93bmxvYWRfZXhpdDsKKwl9CisKKwlpbmZvLT5tb2RlID0gTlhQX05DSV9NT0RFX0ZXOworCisJZndfaW5mby0+ZGF0YSA9IGZ3X2luZm8tPmZ3LT5kYXRhOworCWZ3X2luZm8tPnNpemUgPSBmd19pbmZvLT5mdy0+c2l6ZTsKKwlmd19pbmZvLT53cml0dGVuID0gMDsKKwlmd19pbmZvLT5mcmFtZV9zaXplID0gMDsKKwlmd19pbmZvLT5jbWRfcmVzdWx0ID0gMDsKKworCXNjaGVkdWxlX3dvcmsoJmZ3X2luZm8tPndvcmspOworCitmd19kb3dubG9hZF9leGl0OgorCW11dGV4X3VubG9jaygmaW5mby0+aW5mb19sb2NrKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBueHBfbmNpX2Z3X3JlYWRfc3RhdHVzKHU4IHN0YXQpCit7CisJc3dpdGNoIChzdGF0KSB7CisJY2FzZSBOWFBfTkNJX0ZXX1JFU1VMVF9PSzoKKwkJcmV0dXJuIDA7CisJY2FzZSBOWFBfTkNJX0ZXX1JFU1VMVF9JTlZBTElEX0FERFI6CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgTlhQX05DSV9GV19SRVNVTFRfVU5LTk9XTl9DTUQ6CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgTlhQX05DSV9GV19SRVNVTFRfQUJPUlRFRF9DTUQ6CisJCXJldHVybiAtRU1TR1NJWkU7CisJY2FzZSBOWFBfTkNJX0ZXX1JFU1VMVF9BRERSX1JBTkdFX09GTF9FUlJPUjoKKwkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOworCWNhc2UgTlhQX05DSV9GV19SRVNVTFRfQlVGRkVSX09GTF9FUlJPUjoKKwkJcmV0dXJuIC1FTk9CVUZTOworCWNhc2UgTlhQX05DSV9GV19SRVNVTFRfTUVNX0JTWToKKwkJcmV0dXJuIC1FTk9LRVk7CisJY2FzZSBOWFBfTkNJX0ZXX1JFU1VMVF9TSUdOQVRVUkVfRVJST1I6CisJCXJldHVybiAtRUtFWVJFSkVDVEVEOworCWNhc2UgTlhQX05DSV9GV19SRVNVTFRfRklSTVdBUkVfVkVSU0lPTl9FUlJPUjoKKwkJcmV0dXJuIC1FQUxSRUFEWTsKKwljYXNlIE5YUF9OQ0lfRldfUkVTVUxUX1BST1RPQ09MX0VSUk9SOgorCQlyZXR1cm4gLUVQUk9UTzsKKwljYXNlIE5YUF9OQ0lfRldfUkVTVUxUX1NGV1VfREVHUkFERUQ6CisJCXJldHVybiAtRUhXUE9JU09OOworCWNhc2UgTlhQX05DSV9GV19SRVNVTFRfUEhfU1RBVFVTX0ZJUlNUX0NIVU5LOgorCQlyZXR1cm4gMDsKKwljYXNlIE5YUF9OQ0lfRldfUkVTVUxUX1BIX1NUQVRVU19ORVhUX0NIVU5LOgorCQlyZXR1cm4gMDsKKwljYXNlIE5YUF9OQ0lfRldfUkVTVUxUX1BIX1NUQVRVU19JTlRFUk5BTF9FUlJPUl81OgorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKK3N0YXRpYyB1MTYgbnhwX25jaV9md19jaGVja19jcmMoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MTYgY3JjLCBmcmFtZV9jcmM7CisJc2l6ZV90IGxlbiA9IHNrYi0+bGVuIC0gTlhQX05DSV9GV19DUkNfTEVOOworCisJY3JjID0gbnhwX25jaV9md19jcmMoc2tiLT5kYXRhLCBsZW4pOworCWZyYW1lX2NyYyA9IGdldF91bmFsaWduZWRfYmUxNihza2ItPmRhdGEgKyBsZW4pOworCisJcmV0dXJuIChjcmMgXiBmcmFtZV9jcmMpOworfQorCit2b2lkIG54cF9uY2lfZndfcmVjdl9mcmFtZShzdHJ1Y3QgbmNpX2RldiAqbmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbnhwX25jaV9pbmZvICppbmZvID0gbmNpX2dldF9kcnZkYXRhKG5kZXYpOworCXN0cnVjdCBueHBfbmNpX2Z3X2luZm8gKmZ3X2luZm8gPSAmaW5mby0+ZndfaW5mbzsKKworCWNvbXBsZXRlKCZmd19pbmZvLT5jbWRfY29tcGxldGlvbik7CisKKwlpZiAoc2tiKSB7CisJCWlmIChueHBfbmNpX2Z3X2NoZWNrX2NyYyhza2IpICE9IDB4MDApCisJCQlmd19pbmZvLT5jbWRfcmVzdWx0ID0gLUVCQURNU0c7CisJCWVsc2UKKwkJCWZ3X2luZm8tPmNtZF9yZXN1bHQgPSBueHBfbmNpX2Z3X3JlYWRfc3RhdHVzKAorCQkJCQkqc2tiX3B1bGwoc2tiLCBOWFBfTkNJX0ZXX0hEUl9MRU4pKTsKKwkJa2ZyZWVfc2tiKHNrYik7CisJfSBlbHNlIHsKKwkJZndfaW5mby0+Y21kX3Jlc3VsdCA9IC1FSU87CisJfQorCisJaWYgKGZ3X2luZm8tPmZ3KQorCQlzY2hlZHVsZV93b3JrKCZmd19pbmZvLT53b3JrKTsKK30KK0VYUE9SVF9TWU1CT0wobnhwX25jaV9md19yZWN2X2ZyYW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL254cC1uY2kvaTJjLmMgYi9kcml2ZXJzL25mYy9ueHAtbmNpL2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YmQ2N2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25mYy9ueHAtbmNpL2kyYy5jCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogSTJDIGxpbmsgbGF5ZXIgZm9yIHRoZSBOWFAgTkNJIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCAgTlhQIFNlbWljb25kdWN0b3JzICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEF1dGhvcnM6IENsw6ltZW50IFBlcnJvY2hhdWQgPGNsZW1lbnQucGVycm9jaGF1ZEBueHAuY29tPgorICoKKyAqIERlcml2ZWQgZnJvbSBQTjU0NCBkZXZpY2UgZHJpdmVyOgorICogQ29weXJpZ2h0IChDKSAyMDEyICBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25mYy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL254cC1uY2kuaD4KKyNpbmNsdWRlIDxsaW51eC91bmFsaWduZWQvYWNjZXNzX29rLmg+CisKKyNpbmNsdWRlIDxuZXQvbmZjL25mYy5oPgorCisjaW5jbHVkZSAibnhwLW5jaS5oIgorCisjZGVmaW5lIE5YUF9OQ0lfSTJDX0RSSVZFUl9OQU1FCSJueHAtbmNpX2kyYyIKKworI2RlZmluZSBOWFBfTkNJX0kyQ19NQVhfUEFZTE9BRAkzMgorCitzdHJ1Y3QgbnhwX25jaV9pMmNfcGh5IHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjX2RldjsKKwlzdHJ1Y3QgbmNpX2RldiAqbmRldjsKKworCXVuc2lnbmVkIGludCBncGlvX2VuOworCXVuc2lnbmVkIGludCBncGlvX2Z3OworCisJaW50IGhhcmRfZmF1bHQ7IC8qCisJCQkgKiA8IDAgaWYgaGFyZHdhcmUgZXJyb3Igb2NjdXJyZWQgKGUuZy4gaTJjIGVycikKKwkJCSAqIGFuZCBwcmV2ZW50cyBub3JtYWwgb3BlcmF0aW9uLgorCQkJICovCit9OworCitzdGF0aWMgaW50IG54cF9uY2lfaTJjX3NldF9tb2RlKHZvaWQgKnBoeV9pZCwKKwkJCQkgICAgZW51bSBueHBfbmNpX21vZGUgbW9kZSkKK3sKKwlzdHJ1Y3QgbnhwX25jaV9pMmNfcGh5ICpwaHkgPSAoc3RydWN0IG54cF9uY2lfaTJjX3BoeSAqKSBwaHlfaWQ7CisKKwlncGlvX3NldF92YWx1ZShwaHktPmdwaW9fZncsIChtb2RlID09IE5YUF9OQ0lfTU9ERV9GVykgPyAxIDogMCk7CisJZ3Bpb19zZXRfdmFsdWUocGh5LT5ncGlvX2VuLCAobW9kZSAhPSBOWFBfTkNJX01PREVfQ09MRCkgPyAxIDogMCk7CisJdXNsZWVwX3JhbmdlKDEwMDAwLCAxNTAwMCk7CisKKwlpZiAobW9kZSA9PSBOWFBfTkNJX01PREVfQ09MRCkKKwkJcGh5LT5oYXJkX2ZhdWx0ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG54cF9uY2lfaTJjX3dyaXRlKHZvaWQgKnBoeV9pZCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgbnhwX25jaV9pMmNfcGh5ICpwaHkgPSBwaHlfaWQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHBoeS0+aTJjX2RldjsKKworCWlmIChwaHktPmhhcmRfZmF1bHQgIT0gMCkKKwkJcmV0dXJuIHBoeS0+aGFyZF9mYXVsdDsKKworCXIgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwlpZiAociA9PSAtRVJFTU9URUlPKSB7CisJCS8qIFJldHJ5LCBjaGlwIHdhcyBpbiBzdGFuZGJ5ICovCisJCXVzbGVlcF9yYW5nZSgxMTAwMDAsIDEyMDAwMCk7CisJCXIgPSBpMmNfbWFzdGVyX3NlbmQoY2xpZW50LCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKKwl9CisKKwlpZiAociA8IDApIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsICJFcnJvciAlZCBvbiBJMkMgc2VuZFxuIiwgcik7CisJfSBlbHNlIGlmIChyICE9IHNrYi0+bGVuKSB7CisJCW5mY19lcnIoJmNsaWVudC0+ZGV2LAorCQkJIkludmFsaWQgbGVuZ3RoIHNlbnQ6ICV1IChleHBlY3RlZCAldSlcbiIsCisJCQlyLCBza2ItPmxlbik7CisJCXIgPSAtRVJFTU9URUlPOworCX0gZWxzZSB7CisJCS8qIFN1Y2Nlc3MgYnV0IHJldHVybiAwIGFuZCBub3QgbnVtYmVyIG9mIGJ5dGVzICovCisJCXIgPSAwOworCX0KKworCXJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IG54cF9uY2lfcGh5X29wcyBpMmNfcGh5X29wcyA9IHsKKwkuc2V0X21vZGUgPSBueHBfbmNpX2kyY19zZXRfbW9kZSwKKwkud3JpdGUgPSBueHBfbmNpX2kyY193cml0ZSwKK307CisKK3N0YXRpYyBpbnQgbnhwX25jaV9pMmNfZndfcmVhZChzdHJ1Y3QgbnhwX25jaV9pMmNfcGh5ICpwaHksCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKipza2IpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHBoeS0+aTJjX2RldjsKKwl1MTYgaGVhZGVyOworCXNpemVfdCBmcmFtZV9sZW47CisJaW50IHI7CisKKwlyID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgKHU4ICopICZoZWFkZXIsIE5YUF9OQ0lfRldfSERSX0xFTik7CisJaWYgKHIgPCAwKSB7CisJCWdvdG8gZndfcmVhZF9leGl0OworCX0gZWxzZSBpZiAociAhPSBOWFBfTkNJX0ZXX0hEUl9MRU4pIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsICJJbmNvcnJlY3QgaGVhZGVyIGxlbmd0aDogJXVcbiIsIHIpOworCQlyID0gLUVCQURNU0c7CisJCWdvdG8gZndfcmVhZF9leGl0OworCX0KKworCWZyYW1lX2xlbiA9IChnZXRfdW5hbGlnbmVkX2JlMTYoJmhlYWRlcikgJiBOWFBfTkNJX0ZXX0ZSQU1FX0xFTl9NQVNLKSArCisJCSAgICBOWFBfTkNJX0ZXX0NSQ19MRU47CisKKwkqc2tiID0gYWxsb2Nfc2tiKE5YUF9OQ0lfRldfSERSX0xFTiArIGZyYW1lX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCpza2IgPT0gTlVMTCkgeworCQlyID0gLUVOT01FTTsKKwkJZ290byBmd19yZWFkX2V4aXQ7CisJfQorCisJbWVtY3B5KHNrYl9wdXQoKnNrYiwgTlhQX05DSV9GV19IRFJfTEVOKSwgJmhlYWRlciwgTlhQX05DSV9GV19IRFJfTEVOKTsKKworCXIgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCBza2JfcHV0KCpza2IsIGZyYW1lX2xlbiksIGZyYW1lX2xlbik7CisJaWYgKHIgIT0gZnJhbWVfbGVuKSB7CisJCW5mY19lcnIoJmNsaWVudC0+ZGV2LAorCQkJIkludmFsaWQgZnJhbWUgbGVuZ3RoOiAldSAoZXhwZWN0ZWQgJXp1KVxuIiwKKwkJCXIsIGZyYW1lX2xlbik7CisJCXIgPSAtRUJBRE1TRzsKKwkJZ290byBmd19yZWFkX2V4aXRfZnJlZV9za2I7CisJfQorCisJcmV0dXJuIDA7CisKK2Z3X3JlYWRfZXhpdF9mcmVlX3NrYjoKKwlrZnJlZV9za2IoKnNrYik7Citmd19yZWFkX2V4aXQ6CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgbnhwX25jaV9pMmNfbmNpX3JlYWQoc3RydWN0IG54cF9uY2lfaTJjX3BoeSAqcGh5LAorCQkJCXN0cnVjdCBza19idWZmICoqc2tiKQoreworCXN0cnVjdCBuY2lfY3RybF9oZHIgaGVhZGVyOyAvKiBNYXkgYWN0dWFsbHkgYmUgYSBkYXRhIGhlYWRlciAqLworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBwaHktPmkyY19kZXY7CisJaW50IHI7CisKKwlyID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgKHU4ICopICZoZWFkZXIsIE5DSV9DVFJMX0hEUl9TSVpFKTsKKwlpZiAociA8IDApIHsKKwkJZ290byBuY2lfcmVhZF9leGl0OworCX0gZWxzZSBpZiAociAhPSBOQ0lfQ1RSTF9IRFJfU0laRSkgeworCQluZmNfZXJyKCZjbGllbnQtPmRldiwgIkluY29ycmVjdCBoZWFkZXIgbGVuZ3RoOiAldVxuIiwgcik7CisJCXIgPSAtRUJBRE1TRzsKKwkJZ290byBuY2lfcmVhZF9leGl0OworCX0KKworCSpza2IgPSBhbGxvY19za2IoTkNJX0NUUkxfSERSX1NJWkUgKyBoZWFkZXIucGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCpza2IgPT0gTlVMTCkgeworCQlyID0gLUVOT01FTTsKKwkJZ290byBuY2lfcmVhZF9leGl0OworCX0KKworCW1lbWNweShza2JfcHV0KCpza2IsIE5DSV9DVFJMX0hEUl9TSVpFKSwgKHZvaWQgKikgJmhlYWRlciwKKwkgICAgICAgTkNJX0NUUkxfSERSX1NJWkUpOworCisJciA9IGkyY19tYXN0ZXJfcmVjdihjbGllbnQsIHNrYl9wdXQoKnNrYiwgaGVhZGVyLnBsZW4pLCBoZWFkZXIucGxlbik7CisJaWYgKHIgIT0gaGVhZGVyLnBsZW4pIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsCisJCQkiSW52YWxpZCBmcmFtZSBwYXlsb2FkIGxlbmd0aDogJXUgKGV4cGVjdGVkICV1KVxuIiwKKwkJCXIsIGhlYWRlci5wbGVuKTsKKwkJciA9IC1FQkFETVNHOworCQlnb3RvIG5jaV9yZWFkX2V4aXRfZnJlZV9za2I7CisJfQorCisJcmV0dXJuIDA7CisKK25jaV9yZWFkX2V4aXRfZnJlZV9za2I6CisJa2ZyZWVfc2tiKCpza2IpOworbmNpX3JlYWRfZXhpdDoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGlycXJldHVybl90IG54cF9uY2lfaTJjX2lycV90aHJlYWRfZm4oaW50IGlycSwgdm9pZCAqcGh5X2lkKQoreworCXN0cnVjdCBueHBfbmNpX2kyY19waHkgKnBoeSA9IHBoeV9pZDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OworCXN0cnVjdCBueHBfbmNpX2luZm8gKmluZm87CisKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlpbnQgciA9IDA7CisKKwlpZiAoIXBoeSB8fCAhcGh5LT5uZGV2KQorCQlnb3RvIGV4aXRfaXJxX25vbmU7CisKKwljbGllbnQgPSBwaHktPmkyY19kZXY7CisKKwlpZiAoIWNsaWVudCB8fCBpcnEgIT0gY2xpZW50LT5pcnEpCisJCWdvdG8gZXhpdF9pcnFfbm9uZTsKKworCWluZm8gPSBuY2lfZ2V0X2RydmRhdGEocGh5LT5uZGV2KTsKKworCWlmICghaW5mbykKKwkJZ290byBleGl0X2lycV9ub25lOworCisJbXV0ZXhfbG9jaygmaW5mby0+aW5mb19sb2NrKTsKKworCWlmIChwaHktPmhhcmRfZmF1bHQgIT0gMCkKKwkJZ290byBleGl0X2lycV9oYW5kbGVkOworCisJc3dpdGNoIChpbmZvLT5tb2RlKSB7CisJY2FzZSBOWFBfTkNJX01PREVfTkNJOgorCQlyID0gbnhwX25jaV9pMmNfbmNpX3JlYWQocGh5LCAmc2tiKTsKKwkJYnJlYWs7CisJY2FzZSBOWFBfTkNJX01PREVfRlc6CisJCXIgPSBueHBfbmNpX2kyY19md19yZWFkKHBoeSwgJnNrYik7CisJCWJyZWFrOworCWNhc2UgTlhQX05DSV9NT0RFX0NPTEQ6CisJCXIgPSAtRVJFTU9URUlPOworCQlicmVhazsKKwl9CisKKwlpZiAociA9PSAtRVJFTU9URUlPKSB7CisJCXBoeS0+aGFyZF9mYXVsdCA9IHI7CisJCXNrYiA9IE5VTEw7CisJfSBlbHNlIGlmIChyIDwgMCkgeworCQluZmNfZXJyKCZjbGllbnQtPmRldiwgIlJlYWQgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHIpOworCQlnb3RvIGV4aXRfaXJxX2hhbmRsZWQ7CisJfQorCisJc3dpdGNoIChpbmZvLT5tb2RlKSB7CisJY2FzZSBOWFBfTkNJX01PREVfTkNJOgorCQluY2lfcmVjdl9mcmFtZShwaHktPm5kZXYsIHNrYik7CisJCWJyZWFrOworCWNhc2UgTlhQX05DSV9NT0RFX0ZXOgorCQlueHBfbmNpX2Z3X3JlY3ZfZnJhbWUocGh5LT5uZGV2LCBza2IpOworCQlicmVhazsKKwljYXNlIE5YUF9OQ0lfTU9ERV9DT0xEOgorCQlicmVhazsKKwl9CisKK2V4aXRfaXJxX2hhbmRsZWQ6CisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5pbmZvX2xvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK2V4aXRfaXJxX25vbmU6CisJV0FSTl9PTl9PTkNFKDEpOworCXJldHVybiBJUlFfTk9ORTsKK30KKworI2lmZGVmIENPTkZJR19PRgorCitzdGF0aWMgaW50IG54cF9uY2lfaTJjX3BhcnNlX2RldnRyZWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbnhwX25jaV9pMmNfcGh5ICpwaHkgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBwOworCWludCByOworCisJcHAgPSBjbGllbnQtPmRldi5vZl9ub2RlOworCWlmICghcHApCisJCXJldHVybiAtRU5PREVWOworCisJciA9IG9mX2dldF9uYW1lZF9ncGlvKHBwLCAiZW5hYmxlLWdwaW9zIiwgMCk7CisJaWYgKHIgPT0gLUVQUk9CRV9ERUZFUikKKwkJciA9IG9mX2dldF9uYW1lZF9ncGlvKHBwLCAiZW5hYmxlLWdwaW9zIiwgMCk7CisJaWYgKHIgPCAwKSB7CisJCW5mY19lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIGdldCBFTiBncGlvLCBlcnJvcjogJWRcbiIsIHIpOworCQlyZXR1cm4gcjsKKwl9CisJcGh5LT5ncGlvX2VuID0gcjsKKworCXIgPSBvZl9nZXRfbmFtZWRfZ3BpbyhwcCwgImZpcm13YXJlLWdwaW9zIiwgMCk7CisJaWYgKHIgPT0gLUVQUk9CRV9ERUZFUikKKwkJciA9IG9mX2dldF9uYW1lZF9ncGlvKHBwLCAiZmlybXdhcmUtZ3Bpb3MiLCAwKTsKKwlpZiAociA8IDApIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gZ2V0IEZXIGdwaW8sIGVycm9yOiAlZFxuIiwgcik7CisJCXJldHVybiByOworCX0KKwlwaHktPmdwaW9fZncgPSByOworCisJciA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHBwLCAwKTsKKwlpZiAociA8IDApIHsKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gZ2V0IGlycSwgZXJyb3I6ICVkXG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCWNsaWVudC0+aXJxID0gcjsKKworCXJldHVybiAwOworfQorCisjZWxzZQorCitzdGF0aWMgaW50IG54cF9uY2lfaTJjX3BhcnNlX2RldnRyZWUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgbnhwX25jaV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IG54cF9uY2lfaTJjX3BoeSAqcGh5OworCXN0cnVjdCBueHBfbmNpX25mY19wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlpbnQgcjsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLCBJMkNfRlVOQ19JMkMpKSB7CisJCW5mY19lcnIoJmNsaWVudC0+ZGV2LCAiTmVlZCBJMkNfRlVOQ19JMkNcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBwcm9iZV9leGl0OworCX0KKworCXBoeSA9IGRldm1fa3phbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZihzdHJ1Y3QgbnhwX25jaV9pMmNfcGh5KSwKKwkJCSAgIEdGUF9LRVJORUwpOworCWlmICghcGh5KSB7CisJCXIgPSAtRU5PTUVNOworCQlnb3RvIHByb2JlX2V4aXQ7CisJfQorCisJcGh5LT5pMmNfZGV2ID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHBoeSk7CisKKwlwZGF0YSA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoIXBkYXRhICYmIGNsaWVudC0+ZGV2Lm9mX25vZGUpIHsKKwkJciA9IG54cF9uY2lfaTJjX3BhcnNlX2RldnRyZWUoY2xpZW50KTsKKwkJaWYgKHIgPCAwKSB7CisJCQluZmNfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBnZXQgRFQgZGF0YVxuIik7CisJCQlnb3RvIHByb2JlX2V4aXQ7CisJCX0KKwl9IGVsc2UgaWYgKHBkYXRhKSB7CisJCXBoeS0+Z3Bpb19lbiA9IHBkYXRhLT5ncGlvX2VuOworCQlwaHktPmdwaW9fZncgPSBwZGF0YS0+Z3Bpb19mdzsKKwkJY2xpZW50LT5pcnEgPSBwZGF0YS0+aXJxOworCX0gZWxzZSB7CisJCW5mY19lcnIoJmNsaWVudC0+ZGV2LCAiTm8gcGxhdGZvcm0gZGF0YVxuIik7CisJCXIgPSAtRUlOVkFMOworCQlnb3RvIHByb2JlX2V4aXQ7CisJfQorCisJciA9IGRldm1fZ3Bpb19yZXF1ZXN0X29uZSgmcGh5LT5pMmNfZGV2LT5kZXYsIHBoeS0+Z3Bpb19lbiwKKwkJCQkgIEdQSU9GX09VVF9JTklUX0xPVywgIm54cF9uY2lfZW4iKTsKKwlpZiAociA8IDApCisJCWdvdG8gcHJvYmVfZXhpdDsKKworCXIgPSBkZXZtX2dwaW9fcmVxdWVzdF9vbmUoJnBoeS0+aTJjX2Rldi0+ZGV2LCBwaHktPmdwaW9fZncsCisJCQkJICBHUElPRl9PVVRfSU5JVF9MT1csICJueHBfbmNpX2Z3Iik7CisJaWYgKHIgPCAwKQorCQlnb3RvIHByb2JlX2V4aXQ7CisKKwlyID0gbnhwX25jaV9wcm9iZShwaHksICZjbGllbnQtPmRldiwgJmkyY19waHlfb3BzLAorCQkJICBOWFBfTkNJX0kyQ19NQVhfUEFZTE9BRCwgJnBoeS0+bmRldik7CisJaWYgKHIgPCAwKQorCQlnb3RvIHByb2JlX2V4aXQ7CisKKwlyID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2xpZW50LT5pcnEsIE5VTEwsCisJCQkJIG54cF9uY2lfaTJjX2lycV90aHJlYWRfZm4sCisJCQkJIElSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX09ORVNIT1QsCisJCQkJIE5YUF9OQ0lfSTJDX0RSSVZFUl9OQU1FLCBwaHkpOworCWlmIChyIDwgMCkKKwkJbmZjX2VycigmY2xpZW50LT5kZXYsICJVbmFibGUgdG8gcmVnaXN0ZXIgSVJRIGhhbmRsZXJcbiIpOworCitwcm9iZV9leGl0OgorCXJldHVybiByOworfQorCitzdGF0aWMgaW50IG54cF9uY2lfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCBueHBfbmNpX2kyY19waHkgKnBoeSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJbnhwX25jaV9yZW1vdmUocGh5LT5uZGV2KTsKKwlmcmVlX2lycShjbGllbnQtPmlycSwgcGh5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgbnhwX25jaV9pMmNfaWRfdGFibGVbXSA9IHsKKwl7Im54cC1uY2lfaTJjIiwgMH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbnhwX25jaV9pMmNfaWRfdGFibGUpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9ueHBfbmNpX2kyY19tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibnhwLG54cC1uY2ktaTJjIiwgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9ueHBfbmNpX2kyY19tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBueHBfbmNpX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSBOWFBfTkNJX0kyQ19EUklWRVJfTkFNRSwKKwkJICAgLm93bmVyICA9IFRISVNfTU9EVUxFLAorCQkgICAub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIob2ZfbnhwX25jaV9pMmNfbWF0Y2gpLAorCQkgIH0sCisJLnByb2JlID0gbnhwX25jaV9pMmNfcHJvYmUsCisJLmlkX3RhYmxlID0gbnhwX25jaV9pMmNfaWRfdGFibGUsCisJLnJlbW92ZSA9IG54cF9uY2lfaTJjX3JlbW92ZSwKK307CisKK21vZHVsZV9pMmNfZHJpdmVyKG54cF9uY2lfaTJjX2RyaXZlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiSTJDIGRyaXZlciBmb3IgTlhQIE5DSSBORkMgY29udHJvbGxlcnMiKTsKK01PRFVMRV9BVVRIT1IoIkNsw6ltZW50IFBlcnJvY2hhdWQgPGNsZW1lbnQucGVycm9jaGF1ZEBueHAuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvbnhwLW5jaS9ueHAtbmNpLmggYi9kcml2ZXJzL25mYy9ueHAtbmNpL254cC1uY2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWZlY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZmMvbnhwLW5jaS9ueHAtbmNpLmgKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCAgTlhQIFNlbWljb25kdWN0b3JzICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIEF1dGhvcnM6IENsw6ltZW50IFBlcnJvY2hhdWQgPGNsZW1lbnQucGVycm9jaGF1ZEBueHAuY29tPgorICoKKyAqIERlcml2ZWQgZnJvbSBQTjU0NCBkZXZpY2UgZHJpdmVyOgorICogQ29weXJpZ2h0IChDKSAyMDEyICBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorKi8KKworI2lmbmRlZiBfX0xPQ0FMX05YUF9OQ0lfSF8KKyNkZWZpbmUgX19MT0NBTF9OWFBfTkNJX0hfCisKKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL254cC1uY2kuaD4KKworI2luY2x1ZGUgPG5ldC9uZmMvbmNpX2NvcmUuaD4KKworI2RlZmluZSBOWFBfTkNJX0ZXX0hEUl9MRU4JMgorI2RlZmluZSBOWFBfTkNJX0ZXX0NSQ19MRU4JMgorCisjZGVmaW5lIE5YUF9OQ0lfRldfRlJBTUVfTEVOX01BU0sJMHgwM0ZGCisKK2VudW0gbnhwX25jaV9tb2RlIHsKKwlOWFBfTkNJX01PREVfQ09MRCwKKwlOWFBfTkNJX01PREVfTkNJLAorCU5YUF9OQ0lfTU9ERV9GVworfTsKKworc3RydWN0IG54cF9uY2lfcGh5X29wcyB7CisJaW50ICgqc2V0X21vZGUpKHZvaWQgKmlkLCBlbnVtIG54cF9uY2lfbW9kZSBtb2RlKTsKKwlpbnQgKCp3cml0ZSkodm9pZCAqaWQsIHN0cnVjdCBza19idWZmICpza2IpOworfTsKKworc3RydWN0IG54cF9uY2lfZndfaW5mbyB7CisJY2hhciBuYW1lW05GQ19GSVJNV0FSRV9OQU1FX01BWFNJWkUgKyAxXTsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OworCisJc2l6ZV90IHNpemU7CisJc2l6ZV90IHdyaXR0ZW47CisKKwljb25zdCB1OCAqZGF0YTsKKwlzaXplX3QgZnJhbWVfc2l6ZTsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworCXN0cnVjdCBjb21wbGV0aW9uIGNtZF9jb21wbGV0aW9uOworCisJaW50IGNtZF9yZXN1bHQ7Cit9OworCitzdHJ1Y3QgbnhwX25jaV9pbmZvIHsKKwlzdHJ1Y3QgbmNpX2RldiAqbmRldjsKKwl2b2lkICpwaHlfaWQ7CisJc3RydWN0IGRldmljZSAqcGRldjsKKworCWVudW0gbnhwX25jaV9tb2RlIG1vZGU7CisKKwlzdHJ1Y3QgbnhwX25jaV9waHlfb3BzICpwaHlfb3BzOworCXVuc2lnbmVkIGludCBtYXhfcGF5bG9hZDsKKworCXN0cnVjdCBtdXRleCBpbmZvX2xvY2s7CisKKwlzdHJ1Y3QgbnhwX25jaV9md19pbmZvIGZ3X2luZm87Cit9OworCitpbnQgbnhwX25jaV9md19kb3dubG9hZChzdHJ1Y3QgbmNpX2RldiAqbmRldiwgY29uc3QgY2hhciAqZmlybXdhcmVfbmFtZSk7Cit2b2lkIG54cF9uY2lfZndfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBueHBfbmNpX2Z3X3JlY3ZfZnJhbWUoc3RydWN0IG5jaV9kZXYgKm5kZXYsIHN0cnVjdCBza19idWZmICpza2IpOwordm9pZCBueHBfbmNpX2Z3X3dvcmtfY29tcGxldGUoc3RydWN0IG54cF9uY2lfaW5mbyAqaW5mbywgaW50IHJlc3VsdCk7CisKK2ludCBueHBfbmNpX3Byb2JlKHZvaWQgKnBoeV9pZCwgc3RydWN0IGRldmljZSAqcGRldiwKKwkJICBzdHJ1Y3QgbnhwX25jaV9waHlfb3BzICpwaHlfb3BzLCB1bnNpZ25lZCBpbnQgbWF4X3BheWxvYWQsCisJCSAgc3RydWN0IG5jaV9kZXYgKipuZGV2KTsKK3ZvaWQgbnhwX25jaV9yZW1vdmUoc3RydWN0IG5jaV9kZXYgKm5kZXYpOworCisjZW5kaWYgLyogX19MT0NBTF9OWFBfTkNJX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25mYy9wbjUzMy5jIGIvZHJpdmVycy9uZmMvcG41MzMuYwppbmRleCBkNDZhNzAwYS4uYTAzZTRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZmMvcG41MzMuYworKysgYi9kcml2ZXJzL25mYy9wbjUzMy5jCkBAIC0xODIwLDcgKzE4MjAsNyBAQAogCWlmIChJU19FUlIocmVzcCkpIHsKIAkJcmMgPSBQVFJfRVJSKHJlc3ApOwogCi0JCW5mY19lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJSRiBzZXR0aW5nIGVycm9yICVkIiwgcmMpOworCQluZmNfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiUkYgc2V0dGluZyBlcnJvciAlZFxuIiwgcmMpOwogCiAJCXJldHVybiByYzsKIAl9CkBAIC0yNTU0LDggKzI1NTQsMTAgQEAKIAl9CiAKIAlza2IgPSBwbjUzM19idWlsZF9yZXNwb25zZShkZXYpOwotCWlmICghc2tiKQorCWlmICghc2tiKSB7CisJCXJjID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKKwl9CiAKIAlhcmctPmNiKGFyZy0+Y2JfY29udGV4dCwgc2tiLCAwKTsKIAlrZnJlZShhcmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvcG41NDQvaTJjLmMgYi9kcml2ZXJzL25mYy9wbjU0NC9pMmMuYwppbmRleCBjZGRlNzQ1Li42ZmQ5ODZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9wbjU0NC9pMmMuYworKysgYi9kcml2ZXJzL25mYy9wbjU0NC9pMmMuYwpAQCAtOTUzLDcgKzk1Myw3IEBACiAJfQogCiAJbmZjX2luZm8oZGV2LCAiR1BJTyByZXNvdXJjZSwgbm86JWQgaXJxOiVkXG4iLAotCQkJZGVzY190b19ncGlvKGdwaW9kX2lycSksIHJldCk7CisJCSBkZXNjX3RvX2dwaW8oZ3Bpb2RfaXJxKSwgcmV0KTsKIAljbGllbnQtPmlycSA9IHJldDsKIAogCXJldHVybiAwOwpAQCAtMTA2MiwxMSArMTA2Miw4IEBACiAKIAlwaHkgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IHBuNTQ0X2kyY19waHkpLAogCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaHkpIHsKLQkJbmZjX2VycigmY2xpZW50LT5kZXYsCi0JCQkiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgcG41NDQgaTJjIHBoeS5cbiIpOworCWlmICghcGh5KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlJTklUX1dPUksoJnBoeS0+Zndfd29yaywgcG41NDRfaGNpX2kyY19md193b3JrKTsKIAlwaHktPmZ3X3dvcmtfc3RhdGUgPSBGV19XT1JLX1NUQVRFX0lETEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25mYy9wb3J0MTAwLmMgYi9kcml2ZXJzL25mYy9wb3J0MTAwLmMKaW5kZXggNGFjNGQzMS4uODdkNTA5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZmMvcG9ydDEwMC5jCisrKyBiL2RyaXZlcnMvbmZjL3BvcnQxMDAuYwpAQCAtNjA0LDExICs2MDQsMTEgQEAKIAljYXNlIC1FQ09OTlJFU0VUOgogCWNhc2UgLUVOT0VOVDoKIAkJbmZjX2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwKLQkJCSJUaGUgdXJiIGhhcyBiZWVuIGNhbmNlbGVkIChzdGF0dXMgJWQpIiwgdXJiLT5zdGF0dXMpOworCQkJIlRoZSB1cmIgaGFzIGJlZW4gY2FuY2VsZWQgKHN0YXR1cyAlZClcbiIsIHVyYi0+c3RhdHVzKTsKIAkJZ290byBzY2hlZF93cTsKIAljYXNlIC1FU0hVVERPV046CiAJZGVmYXVsdDoKLQkJbmZjX2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlVyYiBmYWlsdXJlIChzdGF0dXMgJWQpIiwKKwkJbmZjX2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlVyYiBmYWlsdXJlIChzdGF0dXMgJWQpXG4iLAogCQkJdXJiLT5zdGF0dXMpOwogCQlnb3RvIHNjaGVkX3dxOwogCX0KQEAgLTYxNiw3ICs2MTYsNyBAQAogCWluX2ZyYW1lID0gZGV2LT5pbl91cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAogCWlmICghcG9ydDEwMF9yeF9mcmFtZV9pc192YWxpZChpbl9mcmFtZSkpIHsKLQkJbmZjX2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlJlY2VpdmVkIGFuIGludmFsaWQgZnJhbWUiKTsKKwkJbmZjX2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlJlY2VpdmVkIGFuIGludmFsaWQgZnJhbWVcbiIpOwogCQljbWQtPnN0YXR1cyA9IC1FSU87CiAJCWdvdG8gc2NoZWRfd3E7CiAJfQpAQCAtNjI2LDcgKzYyNiw3IEBACiAKIAlpZiAoIXBvcnQxMDBfcnhfZnJhbWVfaXNfY21kX3Jlc3BvbnNlKGRldiwgaW5fZnJhbWUpKSB7CiAJCW5mY19lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiSXQncyBub3QgdGhlIHJlc3BvbnNlIHRvIHRoZSBsYXN0IGNvbW1hbmQiKTsKKwkJCSJJdCdzIG5vdCB0aGUgcmVzcG9uc2UgdG8gdGhlIGxhc3QgY29tbWFuZFxuIik7CiAJCWNtZC0+c3RhdHVzID0gLUVJTzsKIAkJZ290byBzY2hlZF93cTsKIAl9CkBAIC02NTcsMTEgKzY1NywxMSBAQAogCWNhc2UgLUVDT05OUkVTRVQ6CiAJY2FzZSAtRU5PRU5UOgogCQluZmNfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LAotCQkJIlRoZSB1cmIgaGFzIGJlZW4gc3RvcHBlZCAoc3RhdHVzICVkKSIsIHVyYi0+c3RhdHVzKTsKKwkJCSJUaGUgdXJiIGhhcyBiZWVuIHN0b3BwZWQgKHN0YXR1cyAlZClcbiIsIHVyYi0+c3RhdHVzKTsKIAkJZ290byBzY2hlZF93cTsKIAljYXNlIC1FU0hVVERPV046CiAJZGVmYXVsdDoKLQkJbmZjX2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlVyYiBmYWlsdXJlIChzdGF0dXMgJWQpIiwKKwkJbmZjX2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlVyYiBmYWlsdXJlIChzdGF0dXMgJWQpXG4iLAogCQkJdXJiLT5zdGF0dXMpOwogCQlnb3RvIHNjaGVkX3dxOwogCX0KQEAgLTY2OSw3ICs2NjksNyBAQAogCWluX2ZyYW1lID0gZGV2LT5pbl91cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAogCWlmICghcG9ydDEwMF9yeF9mcmFtZV9pc19hY2soaW5fZnJhbWUpKSB7Ci0JCW5mY19lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJSZWNlaXZlZCBhbiBpbnZhbGlkIGFjayIpOworCQluZmNfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiUmVjZWl2ZWQgYW4gaW52YWxpZCBhY2tcbiIpOwogCQljbWQtPnN0YXR1cyA9IC1FSU87CiAJCWdvdG8gc2NoZWRfd3E7CiAJfQpAQCAtNjc3LDcgKzY3Nyw3IEBACiAJcmMgPSBwb3J0MTAwX3N1Ym1pdF91cmJfZm9yX3Jlc3BvbnNlKGRldiwgR0ZQX0FUT01JQyk7CiAJaWYgKHJjKSB7CiAJCW5mY19lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsCi0JCQkidXNiX3N1Ym1pdF91cmIgZmFpbGVkIHdpdGggcmVzdWx0ICVkIiwgcmMpOworCQkJInVzYl9zdWJtaXRfdXJiIGZhaWxlZCB3aXRoIHJlc3VsdCAlZFxuIiwgcmMpOwogCQljbWQtPnN0YXR1cyA9IHJjOwogCQlnb3RvIHNjaGVkX3dxOwogCX0KQEAgLTg3MywxMSArODczLDExIEBACiAJY2FzZSAtRUNPTk5SRVNFVDoKIAljYXNlIC1FTk9FTlQ6CiAJCW5mY19lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiVGhlIHVyYiBoYXMgYmVlbiBzdG9wcGVkIChzdGF0dXMgJWQpIiwgdXJiLT5zdGF0dXMpOworCQkJIlRoZSB1cmIgaGFzIGJlZW4gc3RvcHBlZCAoc3RhdHVzICVkKVxuIiwgdXJiLT5zdGF0dXMpOwogCQlicmVhazsKIAljYXNlIC1FU0hVVERPV046CiAJZGVmYXVsdDoKLQkJbmZjX2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlVyYiBmYWlsdXJlIChzdGF0dXMgJWQpIiwKKwkJbmZjX2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlVyYiBmYWlsdXJlIChzdGF0dXMgJWQpXG4iLAogCQkJdXJiLT5zdGF0dXMpOwogCX0KIH0KQEAgLTEwOTQsNyArMTA5NCw3IEBACiAKIAlpZiAocmVzcC0+bGVuIDwgNCkgewogCQluZmNfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LAotCQkJIkludmFsaWQgcGFja2V0IGxlbmd0aCByZWNlaXZlZC5cbiIpOworCQkJIkludmFsaWQgcGFja2V0IGxlbmd0aCByZWNlaXZlZFxuIik7CiAJCXJjID0gLUVJTzsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0xMjUwLDcgKzEyNTAsNyBAQAogCQkgICAgICAgUE9SVDEwMF9NREFBX1RHVF9XQVNfQUNUSVZBVEVEX01BU0s7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW5mY19lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJVbmtub253biBjb21tYW5kIHR5cGUuXG4iKTsKKwkJbmZjX2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwgIlVua25vd24gY29tbWFuZCB0eXBlXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMTQ4MSw3ICsxNDgxLDcgQEAKIAljbWRfdHlwZV9tYXNrID0gcG9ydDEwMF9nZXRfY29tbWFuZF90eXBlX21hc2soZGV2KTsKIAlpZiAoIWNtZF90eXBlX21hc2spIHsKIAkJbmZjX2VycigmaW50ZXJmYWNlLT5kZXYsCi0JCQkiQ291bGQgbm90IGdldCBzdXBwb3J0ZWQgY29tbWFuZCB0eXBlcy5cbiIpOworCQkJIkNvdWxkIG5vdCBnZXQgc3VwcG9ydGVkIGNvbW1hbmQgdHlwZXNcbiIpOwogCQlyYyA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtMTQ5NCw3ICsxNDk0LDcgQEAKIAlyYyA9IHBvcnQxMDBfc2V0X2NvbW1hbmRfdHlwZShkZXYsIGRldi0+Y21kX3R5cGUpOwogCWlmIChyYykgewogCQluZmNfZXJyKCZpbnRlcmZhY2UtPmRldiwKLQkJCSJUaGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29tbWFuZCB0eXBlICV1LlxuIiwKKwkJCSJUaGUgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29tbWFuZCB0eXBlICV1XG4iLAogCQkJZGV2LT5jbWRfdHlwZSk7CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtMTUwMiw3ICsxNTAyLDcgQEAKIAlmd192ZXJzaW9uID0gcG9ydDEwMF9nZXRfZmlybXdhcmVfdmVyc2lvbihkZXYpOwogCWlmICghZndfdmVyc2lvbikKIAkJbmZjX2VycigmaW50ZXJmYWNlLT5kZXYsCi0JCQkiQ291bGQgbm90IGdldCBkZXZpY2UgZmlybXdhcmUgdmVyc2lvbi5cbiIpOworCQkJIkNvdWxkIG5vdCBnZXQgZGV2aWNlIGZpcm13YXJlIHZlcnNpb25cbiIpOwogCiAJbmZjX2luZm8oJmludGVyZmFjZS0+ZGV2LAogCQkgIlNvbnkgTkZDIFBvcnQtMTAwIFNlcmllcyBhdHRhY2hlZCAoZmlybXdhcmUgdiV4LiUwMngpXG4iLApAQCAtMTUxNSw3ICsxNTE1LDcgQEAKIAkJCQkJCQkgICBkZXYtPnNrYl90YWlscm9vbSk7CiAJaWYgKCFkZXYtPm5mY19kaWdpdGFsX2RldikgewogCQluZmNfZXJyKCZpbnRlcmZhY2UtPmRldiwKLQkJCSJDb3VsZCBub3QgYWxsb2NhdGUgbmZjX2RpZ2l0YWxfZGV2LlxuIik7CisJCQkiQ291bGQgbm90IGFsbG9jYXRlIG5mY19kaWdpdGFsX2RldlxuIik7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0xNTI2LDcgKzE1MjYsNyBAQAogCXJjID0gbmZjX2RpZ2l0YWxfcmVnaXN0ZXJfZGV2aWNlKGRldi0+bmZjX2RpZ2l0YWxfZGV2KTsKIAlpZiAocmMpIHsKIAkJbmZjX2VycigmaW50ZXJmYWNlLT5kZXYsCi0JCQkiQ291bGQgbm90IHJlZ2lzdGVyIGRpZ2l0YWwgZGV2aWNlLlxuIik7CisJCQkiQ291bGQgbm90IHJlZ2lzdGVyIGRpZ2l0YWwgZGV2aWNlXG4iKTsKIAkJZ290byBmcmVlX25mY19kZXY7CiAJfQogCkBAIC0xNTYyLDcgKzE1NjIsNyBAQAogCiAJa2ZyZWUoZGV2LT5jbWQpOwogCi0JbmZjX2luZm8oJmludGVyZmFjZS0+ZGV2LCAiU29ueSBQb3J0LTEwMCBORkMgZGV2aWNlIGRpc2Nvbm5lY3RlZCIpOworCW5mY19pbmZvKCZpbnRlcmZhY2UtPmRldiwgIlNvbnkgUG9ydC0xMDAgTkZDIGRldmljZSBkaXNjb25uZWN0ZWRcbiIpOwogfQogCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgcG9ydDEwMF9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25mYy9zdDIxbmZjYS9zdDIxbmZjYS5jIGIvZHJpdmVycy9uZmMvc3QyMW5mY2Evc3QyMW5mY2EuYwppbmRleCAyNGQzZDI0Li5kMjUxZjcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9zdDIxbmZjYS9zdDIxbmZjYS5jCisrKyBiL2RyaXZlcnMvbmZjL3N0MjFuZmNhL3N0MjFuZmNhLmMKQEAgLTU3Miw3ICs1NzIsNyBAQAogCXJldHVybiByOwogfQogCi1zdGF0aWMgaW50IHN0MjFuZmNhX2dldF9pc28xNDQ0M18zX3VpZChzdHJ1Y3QgbmZjX2hjaV9kZXYgKmhkZXYsIHU4ICpnYXRlLAorc3RhdGljIGludCBzdDIxbmZjYV9nZXRfaXNvMTQ0NDNfM191aWQoc3RydWN0IG5mY19oY2lfZGV2ICpoZGV2LCB1OCAqdWlkLAogCQkJCSAgICAgICBpbnQgKmxlbikKIHsKIAlpbnQgcjsKQEAgLTU4OCw3ICs1ODgsNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JZ2F0ZSA9IHVpZF9za2ItPmRhdGE7CisJbWVtY3B5KHVpZCwgdWlkX3NrYi0+ZGF0YSwgdWlkX3NrYi0+bGVuKTsKIAkqbGVuID0gdWlkX3NrYi0+bGVuOwogZXhpdDoKIAlrZnJlZV9za2IodWlkX3NrYik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25mYy9zdDIxbmZjYS9zdDIxbmZjYV9zZS5jIGIvZHJpdmVycy9uZmMvc3QyMW5mY2Evc3QyMW5mY2Ffc2UuYwppbmRleCBiZDEzY2FjLi4zMTk3ZTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9zdDIxbmZjYS9zdDIxbmZjYV9zZS5jCisrKyBiL2RyaXZlcnMvbmZjL3N0MjFuZmNhL3N0MjFuZmNhX3NlLmMKQEAgLTMxMCw2ICszMTAsMTMgQEAKIAljYXNlIFNUMjFORkNBX0VWVF9DT05ORUNUSVZJVFk6CiAJCWJyZWFrOwogCWNhc2UgU1QyMU5GQ0FfRVZUX1RSQU5TQUNUSU9OOgorCQkvKgorCQkgKiBBY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbiBldHNpIDEwMiA2MjIKKwkJICogMTEuMi4yLjQgRVZUX1RSQU5TQUNUSU9OIFRhYmxlIDUyCisJCSAqIERlc2NyaXB0aW9uCVRhZwlMZW5ndGgKKwkJICogQUlECQk4MQk1IHRvIDE2CisJCSAqIFBBUkFNRVRFUlMJODIJMCB0byAyNTUKKwkJICovCiAJCWlmIChza2ItPmxlbiA8IE5GQ19NSU5fQUlEX0xFTkdUSCArIDIgJiYKIAkJICAgIHNrYi0+ZGF0YVswXSAhPSBORkNfRVZUX1RSQU5TQUNUSU9OX0FJRF9UQUcpCiAJCQlyZXR1cm4gLUVQUk9UTzsKQEAgLTMxOCw4ICszMjUsMTAgQEAKIAkJCQkJCSAgIHNrYi0+bGVuIC0gMiwgR0ZQX0tFUk5FTCk7CiAKIAkJdHJhbnNhY3Rpb24tPmFpZF9sZW4gPSBza2ItPmRhdGFbMV07Ci0JCW1lbWNweSh0cmFuc2FjdGlvbi0+YWlkLCAmc2tiLT5kYXRhWzJdLCBza2ItPmRhdGFbMV0pOworCQltZW1jcHkodHJhbnNhY3Rpb24tPmFpZCwgJnNrYi0+ZGF0YVsyXSwKKwkJICAgICAgIHRyYW5zYWN0aW9uLT5haWRfbGVuKTsKIAorCQkvKiBDaGVjayBuZXh0IGJ5dGUgaXMgUEFSQU1FVEVSUyB0YWcgKDgyKSAqLwogCQlpZiAoc2tiLT5kYXRhW3RyYW5zYWN0aW9uLT5haWRfbGVuICsgMl0gIT0KIAkJICAgIE5GQ19FVlRfVFJBTlNBQ1RJT05fUEFSQU1TX1RBRykKIAkJCXJldHVybiAtRVBST1RPOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZmMvc3QyMW5mY2IvaTJjLmMgYi9kcml2ZXJzL25mYy9zdDIxbmZjYi9pMmMuYwppbmRleCBlYjg4NjkzLi43NmE0Y2FkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9zdDIxbmZjYi9pMmMuYworKysgYi9kcml2ZXJzL25mYy9zdDIxbmZjYi9pMmMuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJCXJldHVybiBwaHktPm5kbGMtPmhhcmRfZmF1bHQ7CiAKIAlyID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgc2tiLT5kYXRhLCBza2ItPmxlbik7Ci0JaWYgKHIgPT0gLUVSRU1PVEVJTykgeyAgLyogUmV0cnksIGNoaXAgd2FzIGluIHN0YW5kYnkgKi8KKwlpZiAociA8IDApIHsgIC8qIFJldHJ5LCBjaGlwIHdhcyBpbiBzdGFuZGJ5ICovCiAJCXVzbGVlcF9yYW5nZSgxMDAwLCA0MDAwKTsKIAkJciA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pOwogCX0KQEAgLTE0OCw3ICsxNDgsNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSBwaHktPmkyY19kZXY7CiAKIAlyID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgYnVmLCBTVDIxTkZDQl9OQ0lfSTJDX01JTl9TSVpFKTsKLQlpZiAociA9PSAtRVJFTU9URUlPKSB7ICAvKiBSZXRyeSwgY2hpcCB3YXMgaW4gc3RhbmRieSAqLworCWlmIChyIDwgMCkgeyAgLyogUmV0cnksIGNoaXAgd2FzIGluIHN0YW5kYnkgKi8KIAkJdXNsZWVwX3JhbmdlKDEwMDAsIDQwMDApOwogCQlyID0gaTJjX21hc3Rlcl9yZWN2KGNsaWVudCwgYnVmLCBTVDIxTkZDQl9OQ0lfSTJDX01JTl9TSVpFKTsKIAl9CkBAIC0zMTMsMTEgKzMxMyw4IEBACiAKIAlwaHkgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2Yoc3RydWN0IHN0MjFuZmNiX2kyY19waHkpLAogCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwaHkpIHsKLQkJbmZjX2VycigmY2xpZW50LT5kZXYsCi0JCQkiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3Igc3QyMW5mY2IgaTJjIHBoeS5cbiIpOworCWlmICghcGh5KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlwaHktPmkyY19kZXYgPSBjbGllbnQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmZjL3N0MjFuZmNiL25kbGMuYyBiL2RyaXZlcnMvbmZjL3N0MjFuZmNiL25kbGMuYwppbmRleCA1ZmJmNTlkLi42MDE0YjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9zdDIxbmZjYi9uZGxjLmMKKysrIGIvZHJpdmVycy9uZmMvc3QyMW5mY2IvbmRsYy5jCkBAIC0yNTYsMTAgKzI1Niw5IEBACiAJc3RydWN0IGxsdF9uZGxjICpuZGxjOwogCiAJbmRsYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgbGx0X25kbGMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW5kbGMpIHsKLQkJbmZjX2VycihkZXYsICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBuZGxjLlxuIik7CisJaWYgKCFuZGxjKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKIAluZGxjLT5vcHMgPSBwaHlfb3BzOwogCW5kbGMtPnBoeV9pZCA9IHBoeV9pZDsKIAluZGxjLT5kZXYgPSBkZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25mYy9zdDIxbmZjYi9zdDIxbmZjYl9zZS5jIGIvZHJpdmVycy9uZmMvc3QyMW5mY2Ivc3QyMW5mY2Jfc2UuYwppbmRleCA3YzgyZTlkLi4yNDg2MmE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9zdDIxbmZjYi9zdDIxbmZjYl9zZS5jCisrKyBiL2RyaXZlcnMvbmZjL3N0MjFuZmNiL3N0MjFuZmNiX3NlLmMKQEAgLTMyMSw2ICszMjEsMTIgQEAKIAogCWJyZWFrOwogCWNhc2UgU1QyMU5GQ0JfRVZUX1RSQU5TQUNUSU9OOgorCQkvKiBBY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbiBldHNpIDEwMiA2MjIKKwkJICogMTEuMi4yLjQgRVZUX1RSQU5TQUNUSU9OIFRhYmxlIDUyCisJCSAqIERlc2NyaXB0aW9uICBUYWcgICAgIExlbmd0aAorCQkgKiBBSUQgICAgICAgICAgODEgICAgICA1IHRvIDE2CisJCSAqIFBBUkFNRVRFUlMgICA4MiAgICAgIDAgdG8gMjU1CisJCSAqLwogCQlpZiAoc2tiLT5sZW4gPCBORkNfTUlOX0FJRF9MRU5HVEggKyAyICYmCiAJCSAgICBza2ItPmRhdGFbMF0gIT0gTkZDX0VWVF9UUkFOU0FDVElPTl9BSURfVEFHKQogCQkJcmV0dXJuIC1FUFJPVE87CkBAIC0zMjksOCArMzM1LDkgQEAKIAkJCQkJICAgIHNrYi0+bGVuIC0gMiwgR0ZQX0tFUk5FTCk7CiAKIAkJdHJhbnNhY3Rpb24tPmFpZF9sZW4gPSBza2ItPmRhdGFbMV07Ci0JCW1lbWNweSh0cmFuc2FjdGlvbi0+YWlkLCAmc2tiLT5kYXRhWzJdLCBza2ItPmRhdGFbMV0pOworCQltZW1jcHkodHJhbnNhY3Rpb24tPmFpZCwgJnNrYi0+ZGF0YVsyXSwgdHJhbnNhY3Rpb24tPmFpZF9sZW4pOwogCisJCS8qIENoZWNrIG5leHQgYnl0ZSBpcyBQQVJBTUVURVJTIHRhZyAoODIpICovCiAJCWlmIChza2ItPmRhdGFbdHJhbnNhY3Rpb24tPmFpZF9sZW4gKyAyXSAhPQogCQkgICAgTkZDX0VWVF9UUkFOU0FDVElPTl9QQVJBTVNfVEFHKQogCQkJcmV0dXJuIC1FUFJPVE87CkBAIC0zNDAsNiArMzQ3LDcgQEAKIAkJICAgICAgIHRyYW5zYWN0aW9uLT5haWRfbGVuICsgNCwgdHJhbnNhY3Rpb24tPnBhcmFtc19sZW4pOwogCiAJCXIgPSBuZmNfc2VfdHJhbnNhY3Rpb24obmRldi0+bmZjX2RldiwgaG9zdCwgdHJhbnNhY3Rpb24pOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMTsKIAl9CkBAIC01NDIsMTQgKzU1MCwxMiBAQAogCiAJciA9IG5jaV9oY2lfZGV2X3Nlc3Npb25faW5pdChuZGV2KTsKIAlpZiAociAhPSBOQ0lfSENJX0FOWV9PSykKLQkJZ290byBleGl0OworCQlnb3RvIGZyZWVfZGVzdF9wYXJhbXM7CiAKIAlyID0gbmNpX25mY2VlX21vZGVfc2V0KG5kZXYsIG5kZXYtPmhjaV9kZXYtPmNvbm5faW5mby0+aWQsCiAJCQkgICAgICAgTkNJX05GQ0VFX0VOQUJMRSk7CiAJaWYgKHIgIT0gTkNJX1NUQVRVU19PSykKLQkJZ290byBleGl0OwotCi0JcmV0dXJuIDA7CisJCWdvdG8gZnJlZV9kZXN0X3BhcmFtczsKIAogZnJlZV9kZXN0X3BhcmFtczoKIAlrZnJlZShkZXN0X3BhcmFtcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2FkZHJlc3MuYyBiL2RyaXZlcnMvb2YvYWRkcmVzcy5jCmluZGV4IGFkMjkwNjkuLjc4YTdkY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvYWRkcmVzcy5jCisrKyBiL2RyaXZlcnMvb2YvYWRkcmVzcy5jCkBAIC00NTAsMTIgKzQ1MCwxNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IG9mX2VtcHR5X3Jhbmdlc19xdWlyayh2b2lkKQorc3RhdGljIGludCBvZl9lbXB0eV9yYW5nZXNfcXVpcmsoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAlpZiAoSVNfRU5BQkxFRChDT05GSUdfUFBDKSkgewotCQkvKiBUbyBzYXZlIGN5Y2xlcywgd2UgY2FjaGUgdGhlIHJlc3VsdCAqLworCQkvKiBUbyBzYXZlIGN5Y2xlcywgd2UgY2FjaGUgdGhlIHJlc3VsdCBmb3IgZ2xvYmFsICJNYWMiIHNldHRpbmcgKi8KIAkJc3RhdGljIGludCBxdWlya19zdGF0ZSA9IC0xOwogCisJCS8qIFBBLVNFTUkgc2RjIERUIGJ1ZyAqLworCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICIxNjgybS1zZGMiKSkKKwkJCXJldHVybiB0cnVlOworCisJCS8qIE1ha2UgcXVpcmsgY2FjaGVkICovCiAJCWlmIChxdWlya19zdGF0ZSA8IDApCiAJCQlxdWlya19zdGF0ZSA9CiAJCQkJb2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlciBNYWNpbnRvc2giKSB8fApAQCAtNDkwLDcgKzQ5NSw3IEBACiAJICogVGhpcyBjb2RlIGlzIG9ubHkgZW5hYmxlZCBvbiBwb3dlcnBjLiAtLWdjbAogCSAqLwogCXJhbmdlcyA9IG9mX2dldF9wcm9wZXJ0eShwYXJlbnQsIHJwcm9wLCAmcmxlbik7Ci0JaWYgKHJhbmdlcyA9PSBOVUxMICYmICFvZl9lbXB0eV9yYW5nZXNfcXVpcmsoKSkgeworCWlmIChyYW5nZXMgPT0gTlVMTCAmJiAhb2ZfZW1wdHlfcmFuZ2VzX3F1aXJrKHBhcmVudCkpIHsKIAkJcHJfZGVidWcoIk9GOiBubyByYW5nZXM7IGNhbm5vdCB0cmFuc2xhdGVcbiIpOwogCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2Jhc2UuYyBiL2RyaXZlcnMvb2YvYmFzZS5jCmluZGV4IGFkYjg3NjQuLjRjYzA2YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvYmFzZS5jCisrKyBiL2RyaXZlcnMvb2YvYmFzZS5jCkBAIC03MTUsMTMgKzcxNSw4IEBACiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZDsKIAlpbnQgbGVuOwotCWNvbnN0IGNoYXIgKmVuZDsKIAotCWVuZCA9IHN0cmNocihwYXRoLCAnOicpOwotCWlmICghZW5kKQotCQllbmQgPSBzdHJjaHJudWwocGF0aCwgJy8nKTsKLQotCWxlbiA9IGVuZCAtIHBhdGg7CisJbGVuID0gc3RyY3NwbihwYXRoLCAiLzoiKTsKIAlpZiAoIWxlbikKIAkJcmV0dXJuIE5VTEw7CiAKQEAgLTE4OTMsMTAgKzE4ODgsOCBAQAogCQkJbmFtZSA9IG9mX2dldF9wcm9wZXJ0eShvZl9jaG9zZW4sICJsaW51eCxzdGRvdXQtcGF0aCIsIE5VTEwpOwogCQlpZiAoSVNfRU5BQkxFRChDT05GSUdfUFBDKSAmJiAhbmFtZSkKIAkJCW5hbWUgPSBvZl9nZXRfcHJvcGVydHkob2ZfYWxpYXNlcywgInN0ZG91dCIsIE5VTEwpOwotCQlpZiAobmFtZSkgeworCQlpZiAobmFtZSkKIAkJCW9mX3N0ZG91dCA9IG9mX2ZpbmRfbm9kZV9vcHRzX2J5X3BhdGgobmFtZSwgJm9mX3N0ZG91dF9vcHRpb25zKTsKLQkJCWFkZF9wcmVmZXJyZWRfY29uc29sZSgic3Rkb3V0LXBhdGgiLCAwLCBOVUxMKTsKLQkJfQogCX0KIAogCWlmICghb2ZfYWxpYXNlcykKQEAgLTE5NjcsNiArMTk2MCwzMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwob2ZfYWxpYXNfZ2V0X2lkKTsKIAorLyoqCisgKiBvZl9hbGlhc19nZXRfaGlnaGVzdF9pZCAtIEdldCBoaWdoZXN0IGFsaWFzIGlkIGZvciB0aGUgZ2l2ZW4gc3RlbQorICogQHN0ZW06CUFsaWFzIHN0ZW0gdG8gYmUgZXhhbWluZWQKKyAqCisgKiBUaGUgZnVuY3Rpb24gdHJhdmVscyB0aGUgbG9va3VwIHRhYmxlIHRvIGdldCB0aGUgaGlnaGVzdCBhbGlhcyBpZCBmb3IgdGhlCisgKiBnaXZlbiBhbGlhcyBzdGVtLiAgSXQgcmV0dXJucyB0aGUgYWxpYXMgaWQgaWYgZm91bmQuCisgKi8KK2ludCBvZl9hbGlhc19nZXRfaGlnaGVzdF9pZChjb25zdCBjaGFyICpzdGVtKQoreworCXN0cnVjdCBhbGlhc19wcm9wICphcHA7CisJaW50IGlkID0gLUVOT0RFVjsKKworCW11dGV4X2xvY2soJm9mX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFwcCwgJmFsaWFzZXNfbG9va3VwLCBsaW5rKSB7CisJCWlmIChzdHJjbXAoYXBwLT5zdGVtLCBzdGVtKSAhPSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKGFwcC0+aWQgPiBpZCkKKwkJCWlkID0gYXBwLT5pZDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZvZl9tdXRleCk7CisKKwlyZXR1cm4gaWQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9hbGlhc19nZXRfaGlnaGVzdF9pZCk7CisKIGNvbnN0IF9fYmUzMiAqb2ZfcHJvcF9uZXh0X3UzMihzdHJ1Y3QgcHJvcGVydHkgKnByb3AsIGNvbnN0IF9fYmUzMiAqY3VyLAogCQkJICAgICAgIHUzMiAqcHUpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2RldmljZS5jIGIvZHJpdmVycy9vZi9kZXZpY2UuYwppbmRleCA0NmQ2Yzc1Yy4uMjBjMTMzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9kZXZpY2UuYworKysgYi9kcml2ZXJzL29mL2RldmljZS5jCkBAIC0yLDYgKzIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lvbW11Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CkBAIC02Niw2ICs2OSw4NyBAQAogCXJldHVybiBkZXZpY2VfYWRkKCZvZmRldi0+ZGV2KTsKIH0KIAorLyoqCisgKiBvZl9kbWFfY29uZmlndXJlIC0gU2V0dXAgRE1BIGNvbmZpZ3VyYXRpb24KKyAqIEBkZXY6CURldmljZSB0byBhcHBseSBETUEgY29uZmlndXJhdGlvbgorICogQG5wOgkJUG9pbnRlciB0byBPRiBub2RlIGhhdmluZyBETUEgY29uZmlndXJhdGlvbgorICoKKyAqIFRyeSB0byBnZXQgZGV2aWNlcydzIERNQSBjb25maWd1cmF0aW9uIGZyb20gRFQgYW5kIHVwZGF0ZSBpdAorICogYWNjb3JkaW5nbHkuCisgKgorICogSWYgcGxhdGZvcm0gY29kZSBuZWVkcyB0byB1c2UgaXRzIG93biBzcGVjaWFsIERNQSBjb25maWd1cmF0aW9uLCBpdAorICogY2FuIHVzZSBhIHBsYXRmb3JtIGJ1cyBub3RpZmllciBhbmQgaGFuZGxlIEJVU19OT1RJRllfQUREX0RFVklDRSBldmVudHMKKyAqIHRvIGZpeCB1cCBETUEgY29uZmlndXJhdGlvbi4KKyAqLwordm9pZCBvZl9kbWFfY29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwl1NjQgZG1hX2FkZHIsIHBhZGRyLCBzaXplOworCWludCByZXQ7CisJYm9vbCBjb2hlcmVudDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwlzdHJ1Y3QgaW9tbXVfb3BzICppb21tdTsKKworCS8qCisJICogU2V0IGRlZmF1bHQgY29oZXJlbnRfZG1hX21hc2sgdG8gMzIgYml0LiAgRHJpdmVycyBhcmUgZXhwZWN0ZWQgdG8KKwkgKiBzZXR1cCB0aGUgY29ycmVjdCBzdXBwb3J0ZWQgbWFzay4KKwkgKi8KKwlpZiAoIWRldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBETUFfQklUX01BU0soMzIpOworCisJLyoKKwkgKiBTZXQgaXQgdG8gY29oZXJlbnRfZG1hX21hc2sgYnkgZGVmYXVsdCBpZiB0aGUgYXJjaGl0ZWN0dXJlCisJICogY29kZSBoYXMgbm90IHNldCBpdC4KKwkgKi8KKwlpZiAoIWRldi0+ZG1hX21hc2spCisJCWRldi0+ZG1hX21hc2sgPSAmZGV2LT5jb2hlcmVudF9kbWFfbWFzazsKKworCXJldCA9IG9mX2RtYV9nZXRfcmFuZ2UobnAsICZkbWFfYWRkciwgJnBhZGRyLCAmc2l6ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZG1hX2FkZHIgPSBvZmZzZXQgPSAwOworCQlzaXplID0gZGV2LT5jb2hlcmVudF9kbWFfbWFzayArIDE7CisJfSBlbHNlIHsKKwkJb2Zmc2V0ID0gUEZOX0RPV04ocGFkZHIgLSBkbWFfYWRkcik7CisKKwkJLyoKKwkJICogQWRkIGEgd29yayBhcm91bmQgdG8gdHJlYXQgdGhlIHNpemUgYXMgbWFzayArIDEgaW4gY2FzZQorCQkgKiBpdCBpcyBkZWZpbmVkIGluIERUIGFzIGEgbWFzay4KKwkJICovCisJCWlmIChzaXplICYgMSkgeworCQkJZGV2X3dhcm4oZGV2LCAiSW52YWxpZCBzaXplIDB4JWxseCBmb3IgZG1hLXJhbmdlXG4iLAorCQkJCSBzaXplKTsKKwkJCXNpemUgPSBzaXplICsgMTsKKwkJfQorCisJCWlmICghc2l6ZSkgeworCQkJZGV2X2VycihkZXYsICJBZGp1c3RlZCBzaXplIDB4JWxseCBpbnZhbGlkXG4iLCBzaXplKTsKKwkJCXJldHVybjsKKwkJfQorCQlkZXZfZGJnKGRldiwgImRtYV9wZm5fb2Zmc2V0KCUjMDhseClcbiIsIG9mZnNldCk7CisJfQorCisJZGV2LT5kbWFfcGZuX29mZnNldCA9IG9mZnNldDsKKworCS8qCisJICogTGltaXQgY29oZXJlbnQgYW5kIGRtYSBtYXNrIGJhc2VkIG9uIHNpemUgYW5kIGRlZmF1bHQgbWFzaworCSAqIHNldCBieSB0aGUgZHJpdmVyLgorCSAqLworCWRldi0+Y29oZXJlbnRfZG1hX21hc2sgPSBtaW4oZGV2LT5jb2hlcmVudF9kbWFfbWFzaywKKwkJCQkgICAgIERNQV9CSVRfTUFTSyhpbG9nMihkbWFfYWRkciArIHNpemUpKSk7CisJKmRldi0+ZG1hX21hc2sgPSBtaW4oKCpkZXYtPmRtYV9tYXNrKSwKKwkJCSAgICAgRE1BX0JJVF9NQVNLKGlsb2cyKGRtYV9hZGRyICsgc2l6ZSkpKTsKKworCWNvaGVyZW50ID0gb2ZfZG1hX2lzX2NvaGVyZW50KG5wKTsKKwlkZXZfZGJnKGRldiwgImRldmljZSBpcyVzZG1hIGNvaGVyZW50XG4iLAorCQljb2hlcmVudCA/ICIgIiA6ICIgbm90ICIpOworCisJaW9tbXUgPSBvZl9pb21tdV9jb25maWd1cmUoZGV2LCBucCk7CisJZGV2X2RiZyhkZXYsICJkZXZpY2UgaXMlc2JlaGluZCBhbiBpb21tdVxuIiwKKwkJaW9tbXUgPyAiICIgOiAiIG5vdCAiKTsKKworCWFyY2hfc2V0dXBfZG1hX29wcyhkZXYsIGRtYV9hZGRyLCBzaXplLCBpb21tdSwgY29oZXJlbnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZG1hX2NvbmZpZ3VyZSk7CisKIGludCBvZl9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmcGRldi0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvaXJxLmMgYi9kcml2ZXJzL29mL2lycS5jCmluZGV4IDBkNzc2NTguLjFhNzk4MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvaXJxLmMKKysrIGIvZHJpdmVycy9vZi9pcnEuYwpAQCAtMjkwLDcgKzI5MCw3IEBACiAJc3RydWN0IGRldmljZV9ub2RlICpwOwogCWNvbnN0IF9fYmUzMiAqaW50c3BlYywgKnRtcCwgKmFkZHI7CiAJdTMyIGludHNpemUsIGludGxlbjsKLQlpbnQgaSwgcmVzID0gLUVJTlZBTDsKKwlpbnQgaSwgcmVzOwogCiAJcHJfZGVidWcoIm9mX2lycV9wYXJzZV9vbmU6IGRldj0lcywgaW5kZXg9JWRcbiIsIG9mX25vZGVfZnVsbF9uYW1lKGRldmljZSksIGluZGV4KTsKIApAQCAtMzIzLDE1ICszMjMsMTkgQEAKIAogCS8qIEdldCBzaXplIG9mIGludGVycnVwdCBzcGVjaWZpZXIgKi8KIAl0bXAgPSBvZl9nZXRfcHJvcGVydHkocCwgIiNpbnRlcnJ1cHQtY2VsbHMiLCBOVUxMKTsKLQlpZiAodG1wID09IE5VTEwpCisJaWYgKHRtcCA9PSBOVUxMKSB7CisJCXJlcyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OworCX0KIAlpbnRzaXplID0gYmUzMl90b19jcHUoKnRtcCk7CiAKIAlwcl9kZWJ1ZygiIGludHNpemU9JWQgaW50bGVuPSVkXG4iLCBpbnRzaXplLCBpbnRsZW4pOwogCiAJLyogQ2hlY2sgaW5kZXggKi8KLQlpZiAoKGluZGV4ICsgMSkgKiBpbnRzaXplID4gaW50bGVuKQorCWlmICgoaW5kZXggKyAxKSAqIGludHNpemUgPiBpbnRsZW4pIHsKKwkJcmVzID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CisJfQogCiAJLyogQ29weSBpbnRzcGVjIGludG8gaXJxIHN0cnVjdHVyZSAqLwogCWludHNwZWMgKz0gaW5kZXggKiBpbnRzaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9vZl9tZGlvLmMgYi9kcml2ZXJzL29mL29mX21kaW8uYwppbmRleCAxYmQ0MzA1Li4wYzA2NDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL29mX21kaW8uYworKysgYi9kcml2ZXJzL29mL29mX21kaW8uYwpAQCAtODgsNyArODgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9mX21kaW9fcGFyc2VfYWRkcihzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCitpbnQgb2ZfbWRpb19wYXJzZV9hZGRyKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKIAl1MzIgYWRkcjsKIAlpbnQgcmV0OwpAQCAtMTA4LDYgKzEwOCw3IEBACiAKIAlyZXR1cm4gYWRkcjsKIH0KK0VYUE9SVF9TWU1CT0wob2ZfbWRpb19wYXJzZV9hZGRyKTsKIAogLyoqCiAgKiBvZl9tZGlvYnVzX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgbWlpX2J1cyBhbmQgY3JlYXRlIFBIWXMgZnJvbSB0aGUgZGV2aWNlIHRyZWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2Yvb2ZfcGNpLmMgYi9kcml2ZXJzL29mL29mX3BjaS5jCmluZGV4IDYyNDI2ZDguLjU3NTFkYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2Yvb2ZfcGNpLmMKKysrIGIvZHJpdmVycy9vZi9vZl9wY2kuYwpAQCAtMiw2ICsyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKQEAgLTExNiw2ICsxMTcsMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG9mX2dldF9wY2lfZG9tYWluX25yKTsKIAorLyoqCisgKiBvZl9wY2lfZG1hX2NvbmZpZ3VyZSAtIFNldHVwIERNQSBjb25maWd1cmF0aW9uCisgKiBAZGV2OiBwdHIgdG8gcGNpX2RldiBzdHJ1Y3Qgb2YgdGhlIFBDSSBkZXZpY2UKKyAqCisgKiBGdW5jdGlvbiB0byB1cGRhdGUgUENJIGRldmljZXMncyBETUEgY29uZmlndXJhdGlvbiB1c2luZyB0aGUgc2FtZQorICogaW5mbyBmcm9tIHRoZSBPRiBub2RlIG9mIGhvc3QgYnJpZGdlJ3MgcGFyZW50IChpZiBhbnkpLgorICovCit2b2lkIG9mX3BjaV9kbWFfY29uZmlndXJlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwY2lfZGV2LT5kZXY7CisJc3RydWN0IGRldmljZSAqYnJpZGdlID0gcGNpX2dldF9ob3N0X2JyaWRnZV9kZXZpY2UocGNpX2Rldik7CisKKwlpZiAoIWJyaWRnZS0+cGFyZW50KQorCQlyZXR1cm47CisKKwlvZl9kbWFfY29uZmlndXJlKGRldiwgYnJpZGdlLT5wYXJlbnQtPm9mX25vZGUpOworCXBjaV9wdXRfaG9zdF9icmlkZ2VfZGV2aWNlKGJyaWRnZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvZl9wY2lfZG1hX2NvbmZpZ3VyZSk7CisKICNpZiBkZWZpbmVkKENPTkZJR19PRl9BRERSRVNTKQogLyoqCiAgKiBvZl9wY2lfZ2V0X2hvc3RfYnJpZGdlX3Jlc291cmNlcyAtIFBhcnNlIFBDSSBob3N0IGJyaWRnZSByZXNvdXJjZXMgZnJvbSBEVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9wbGF0Zm9ybS5jIGIvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCmluZGV4IGIxODk3MzMuLmEwMWY1N2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL29mL3BsYXRmb3JtLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2lvbW11Lmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTE1MCw1OSArMTQ5LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0wob2ZfZGV2aWNlX2FsbG9jKTsKIAotLyoqCi0gKiBvZl9kbWFfY29uZmlndXJlIC0gU2V0dXAgRE1BIGNvbmZpZ3VyYXRpb24KLSAqIEBkZXY6CURldmljZSB0byBhcHBseSBETUEgY29uZmlndXJhdGlvbgotICoKLSAqIFRyeSB0byBnZXQgZGV2aWNlcydzIERNQSBjb25maWd1cmF0aW9uIGZyb20gRFQgYW5kIHVwZGF0ZSBpdAotICogYWNjb3JkaW5nbHkuCi0gKgotICogSW4gY2FzZSBpZiBwbGF0Zm9ybSBjb2RlIG5lZWQgdG8gdXNlIG93biBzcGVjaWFsIERNQSBjb25maWd1cmF0aW9uLGl0Ci0gKiBjYW4gdXNlIFBsYXRmb3JtIGJ1cyBub3RpZmllciBhbmQgaGFuZGxlIEJVU19OT1RJRllfQUREX0RFVklDRSBldmVudAotICogdG8gZml4IHVwIERNQSBjb25maWd1cmF0aW9uLgotICovCi1zdGF0aWMgdm9pZCBvZl9kbWFfY29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQl1NjQgZG1hX2FkZHIsIHBhZGRyLCBzaXplOwotCWludCByZXQ7Ci0JYm9vbCBjb2hlcmVudDsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQlzdHJ1Y3QgaW9tbXVfb3BzICppb21tdTsKLQotCS8qCi0JICogU2V0IGRlZmF1bHQgZG1hLW1hc2sgdG8gMzIgYml0LiBEcml2ZXJzIGFyZSBleHBlY3RlZCB0byBzZXR1cAotCSAqIHRoZSBjb3JyZWN0IHN1cHBvcnRlZCBkbWFfbWFzay4KLQkgKi8KLQlkZXYtPmNvaGVyZW50X2RtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQotCS8qCi0JICogU2V0IGl0IHRvIGNvaGVyZW50X2RtYV9tYXNrIGJ5IGRlZmF1bHQgaWYgdGhlIGFyY2hpdGVjdHVyZQotCSAqIGNvZGUgaGFzIG5vdCBzZXQgaXQuCi0JICovCi0JaWYgKCFkZXYtPmRtYV9tYXNrKQotCQlkZXYtPmRtYV9tYXNrID0gJmRldi0+Y29oZXJlbnRfZG1hX21hc2s7Ci0KLQlyZXQgPSBvZl9kbWFfZ2V0X3JhbmdlKGRldi0+b2Zfbm9kZSwgJmRtYV9hZGRyLCAmcGFkZHIsICZzaXplKTsKLQlpZiAocmV0IDwgMCkgewotCQlkbWFfYWRkciA9IG9mZnNldCA9IDA7Ci0JCXNpemUgPSBkZXYtPmNvaGVyZW50X2RtYV9tYXNrOwotCX0gZWxzZSB7Ci0JCW9mZnNldCA9IFBGTl9ET1dOKHBhZGRyIC0gZG1hX2FkZHIpOwotCQlkZXZfZGJnKGRldiwgImRtYV9wZm5fb2Zmc2V0KCUjMDhseClcbiIsIG9mZnNldCk7Ci0JfQotCWRldi0+ZG1hX3Bmbl9vZmZzZXQgPSBvZmZzZXQ7Ci0KLQljb2hlcmVudCA9IG9mX2RtYV9pc19jb2hlcmVudChkZXYtPm9mX25vZGUpOwotCWRldl9kYmcoZGV2LCAiZGV2aWNlIGlzJXNkbWEgY29oZXJlbnRcbiIsCi0JCWNvaGVyZW50ID8gIiAiIDogIiBub3QgIik7Ci0KLQlpb21tdSA9IG9mX2lvbW11X2NvbmZpZ3VyZShkZXYpOwotCWRldl9kYmcoZGV2LCAiZGV2aWNlIGlzJXNiZWhpbmQgYW4gaW9tbXVcbiIsCi0JCWlvbW11ID8gIiAiIDogIiBub3QgIik7Ci0KLQlhcmNoX3NldHVwX2RtYV9vcHMoZGV2LCBkbWFfYWRkciwgc2l6ZSwgaW9tbXUsIGNvaGVyZW50KTsKLX0KLQogc3RhdGljIHZvaWQgb2ZfZG1hX2RlY29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlhcmNoX3RlYXJkb3duX2RtYV9vcHMoZGV2KTsKQEAgLTIzNiw3ICsxODIsNyBAQAogCiAJZGV2LT5kZXYuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlOwogCWRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwbGF0Zm9ybV9kYXRhOwotCW9mX2RtYV9jb25maWd1cmUoJmRldi0+ZGV2KTsKKwlvZl9kbWFfY29uZmlndXJlKCZkZXYtPmRldiwgZGV2LT5kZXYub2Zfbm9kZSk7CiAKIAlpZiAob2ZfZGV2aWNlX2FkZChkZXYpICE9IDApIHsKIAkJb2ZfZG1hX2RlY29uZmlndXJlKCZkZXYtPmRldik7CkBAIC0yOTksNyArMjQ1LDcgQEAKIAkJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIiVzIiwgYnVzX2lkKTsKIAllbHNlCiAJCW9mX2RldmljZV9tYWtlX2J1c19pZCgmZGV2LT5kZXYpOwotCW9mX2RtYV9jb25maWd1cmUoJmRldi0+ZGV2KTsKKwlvZl9kbWFfY29uZmlndXJlKCZkZXYtPmRldiwgZGV2LT5kZXYub2Zfbm9kZSk7CiAKIAkvKiBBbGxvdyB0aGUgSFcgUGVyaXBoZXJhbCBJRCB0byBiZSBvdmVycmlkZGVuICovCiAJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAiYXJtLHByaW1lY2VsbC1wZXJpcGhpZCIsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi91bml0dGVzdC5jIGIvZHJpdmVycy9vZi91bml0dGVzdC5jCmluZGV4IGFiYTg5NDYuLjUyYzQ1YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvdW5pdHRlc3QuYworKysgYi9kcml2ZXJzL29mL3VuaXR0ZXN0LmMKQEAgLTk3LDYgKzk3LDExIEBACiAJCSAib3B0aW9uIHBhdGggdGVzdCwgc3ViY2FzZSAjMSBmYWlsZWRcbiIpOwogCW9mX25vZGVfcHV0KG5wKTsKIAorCW5wID0gb2ZfZmluZF9ub2RlX29wdHNfYnlfcGF0aCgiL3Rlc3RjYXNlLWRhdGEvdGVzdGNhc2UtZGV2aWNlMTp0ZXN0L29wdGlvbiIsICZvcHRpb25zKTsKKwlzZWxmdGVzdChucCAmJiAhc3RyY21wKCJ0ZXN0L29wdGlvbiIsIG9wdGlvbnMpLAorCQkgIm9wdGlvbiBwYXRoIHRlc3QsIHN1YmNhc2UgIzIgZmFpbGVkXG4iKTsKKwlvZl9ub2RlX3B1dChucCk7CisKIAlucCA9IG9mX2ZpbmRfbm9kZV9vcHRzX2J5X3BhdGgoIi90ZXN0Y2FzZS1kYXRhOnRlc3RvcHRpb24iLCBOVUxMKTsKIAlzZWxmdGVzdChucCwgIk5VTEwgb3B0aW9uIHBhdGggdGVzdCBmYWlsZWRcbiIpOwogCW9mX25vZGVfcHV0KG5wKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2NjaW8tZG1hLmMgYi9kcml2ZXJzL3BhcmlzYy9jY2lvLWRtYS5jCmluZGV4IDhiNDkwZDcuLjZiYzE2ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2NjaW8tZG1hLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvY2Npby1kbWEuYwpAQCAtMTAyMSw3ICsxMDIxLDYgQEAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIGludCBjY2lvX3Byb2NfaW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCiB7Ci0JaW50IGxlbiA9IDA7CiAJc3RydWN0IGlvYyAqaW9jID0gaW9jX2xpc3Q7CiAKIAl3aGlsZSAoaW9jICE9IE5VTEwpIHsKQEAgLTEwMzEsMjIgKzEwMzAsMjIgQEAKIAkJaW50IGo7CiAjZW5kaWYKIAotCQlsZW4gKz0gc2VxX3ByaW50ZihtLCAiJXNcbiIsIGlvYy0+bmFtZSk7CisJCXNlcV9wcmludGYobSwgIiVzXG4iLCBpb2MtPm5hbWUpOwogCQkKLQkJbGVuICs9IHNlcV9wcmludGYobSwgIkN1am8gMi4wIGJ1ZyAgICA6ICVzXG4iLAotCQkJCSAgKGlvYy0+Y3VqbzIwX2J1ZyA/ICJ5ZXMiIDogIm5vIikpOworCQlzZXFfcHJpbnRmKG0sICJDdWpvIDIuMCBidWcgICAgOiAlc1xuIiwKKwkJCSAgIChpb2MtPmN1am8yMF9idWcgPyAieWVzIiA6ICJubyIpKTsKIAkJCi0JCWxlbiArPSBzZXFfcHJpbnRmKG0sICJJTyBQRElSIHNpemUgICAgOiAlZCBieXRlcyAoJWQgZW50cmllcylcbiIsCi0JCQkgICAgICAgdG90YWxfcGFnZXMgKiA4LCB0b3RhbF9wYWdlcyk7CisJCXNlcV9wcmludGYobSwgIklPIFBESVIgc2l6ZSAgICA6ICVkIGJ5dGVzICglZCBlbnRyaWVzKVxuIiwKKwkJCSAgIHRvdGFsX3BhZ2VzICogOCwgdG90YWxfcGFnZXMpOwogCiAjaWZkZWYgQ0NJT19DT0xMRUNUX1NUQVRTCi0JCWxlbiArPSBzZXFfcHJpbnRmKG0sICJJTyBQRElSIGVudHJpZXMgOiAlbGQgZnJlZSAgJWxkIHVzZWQgKCVkJSUpXG4iLAotCQkJCSAgdG90YWxfcGFnZXMgLSBpb2MtPnVzZWRfcGFnZXMsIGlvYy0+dXNlZF9wYWdlcywKLQkJCQkgIChpbnQpKGlvYy0+dXNlZF9wYWdlcyAqIDEwMCAvIHRvdGFsX3BhZ2VzKSk7CisJCXNlcV9wcmludGYobSwgIklPIFBESVIgZW50cmllcyA6ICVsZCBmcmVlICAlbGQgdXNlZCAoJWQlJSlcbiIsCisJCQkgICB0b3RhbF9wYWdlcyAtIGlvYy0+dXNlZF9wYWdlcywgaW9jLT51c2VkX3BhZ2VzLAorCQkJICAgKGludCkoaW9jLT51c2VkX3BhZ2VzICogMTAwIC8gdG90YWxfcGFnZXMpKTsKICNlbmRpZgogCi0JCWxlbiArPSBzZXFfcHJpbnRmKG0sICJSZXNvdXJjZSBiaXRtYXAgOiAlZCBieXRlcyAoJWQgcGFnZXMpXG4iLCAKLQkJCQkgIGlvYy0+cmVzX3NpemUsIHRvdGFsX3BhZ2VzKTsKKwkJc2VxX3ByaW50ZihtLCAiUmVzb3VyY2UgYml0bWFwIDogJWQgYnl0ZXMgKCVkIHBhZ2VzKVxuIiwKKwkJCSAgIGlvYy0+cmVzX3NpemUsIHRvdGFsX3BhZ2VzKTsKIAogI2lmZGVmIENDSU9fQ09MTEVDVF9TVEFUUwogCQltaW4gPSBtYXggPSBpb2MtPmF2Z19zZWFyY2hbMF07CkBAIC0xMDU4LDI2ICsxMDU3LDI2IEBACiAJCQkJbWluID0gaW9jLT5hdmdfc2VhcmNoW2pdOwogCQl9CiAJCWF2ZyAvPSBDQ0lPX1NFQVJDSF9TQU1QTEU7Ci0JCWxlbiArPSBzZXFfcHJpbnRmKG0sICIgIEJpdG1hcCBzZWFyY2ggOiAlbGQvJWxkLyVsZCAobWluL2F2Zy9tYXggQ1BVIEN5Y2xlcylcbiIsCi0JCQkJICBtaW4sIGF2ZywgbWF4KTsKKwkJc2VxX3ByaW50ZihtLCAiICBCaXRtYXAgc2VhcmNoIDogJWxkLyVsZC8lbGQgKG1pbi9hdmcvbWF4IENQVSBDeWNsZXMpXG4iLAorCQkJICAgbWluLCBhdmcsIG1heCk7CiAKLQkJbGVuICs9IHNlcV9wcmludGYobSwgInBjaV9tYXBfc2luZ2xlKCk6ICU4bGQgY2FsbHMgICU4bGQgcGFnZXMgKGF2ZyAlZC8xMDAwKVxuIiwKLQkJCQkgIGlvYy0+bXNpbmdsZV9jYWxscywgaW9jLT5tc2luZ2xlX3BhZ2VzLAotCQkJCSAgKGludCkoKGlvYy0+bXNpbmdsZV9wYWdlcyAqIDEwMDApL2lvYy0+bXNpbmdsZV9jYWxscykpOworCQlzZXFfcHJpbnRmKG0sICJwY2lfbWFwX3NpbmdsZSgpOiAlOGxkIGNhbGxzICAlOGxkIHBhZ2VzIChhdmcgJWQvMTAwMClcbiIsCisJCQkgICBpb2MtPm1zaW5nbGVfY2FsbHMsIGlvYy0+bXNpbmdsZV9wYWdlcywKKwkJCSAgIChpbnQpKChpb2MtPm1zaW5nbGVfcGFnZXMgKiAxMDAwKS9pb2MtPm1zaW5nbGVfY2FsbHMpKTsKIAogCQkvKiBLTFVHRSAtIHVubWFwX3NnIGNhbGxzIHVubWFwX3NpbmdsZSBmb3IgZWFjaCBtYXBwZWQgcGFnZSAqLwogCQltaW4gPSBpb2MtPnVzaW5nbGVfY2FsbHMgLSBpb2MtPnVzZ19jYWxsczsKIAkJbWF4ID0gaW9jLT51c2luZ2xlX3BhZ2VzIC0gaW9jLT51c2dfcGFnZXM7Ci0JCWxlbiArPSBzZXFfcHJpbnRmKG0sICJwY2lfdW5tYXBfc2luZ2xlOiAlOGxkIGNhbGxzICAlOGxkIHBhZ2VzIChhdmcgJWQvMTAwMClcbiIsCi0JCQkJICBtaW4sIG1heCwgKGludCkoKG1heCAqIDEwMDApL21pbikpOworCQlzZXFfcHJpbnRmKG0sICJwY2lfdW5tYXBfc2luZ2xlOiAlOGxkIGNhbGxzICAlOGxkIHBhZ2VzIChhdmcgJWQvMTAwMClcbiIsCisJCQkgICBtaW4sIG1heCwgKGludCkoKG1heCAqIDEwMDApL21pbikpOwogIAotCQlsZW4gKz0gc2VxX3ByaW50ZihtLCAicGNpX21hcF9zZygpICAgIDogJThsZCBjYWxscyAgJThsZCBwYWdlcyAoYXZnICVkLzEwMDApXG4iLAotCQkJCSAgaW9jLT5tc2dfY2FsbHMsIGlvYy0+bXNnX3BhZ2VzLAotCQkJCSAgKGludCkoKGlvYy0+bXNnX3BhZ2VzICogMTAwMCkvaW9jLT5tc2dfY2FsbHMpKTsKKwkJc2VxX3ByaW50ZihtLCAicGNpX21hcF9zZygpICAgIDogJThsZCBjYWxscyAgJThsZCBwYWdlcyAoYXZnICVkLzEwMDApXG4iLAorCQkJICAgaW9jLT5tc2dfY2FsbHMsIGlvYy0+bXNnX3BhZ2VzLAorCQkJICAgKGludCkoKGlvYy0+bXNnX3BhZ2VzICogMTAwMCkvaW9jLT5tc2dfY2FsbHMpKTsKIAotCQlsZW4gKz0gc2VxX3ByaW50ZihtLCAicGNpX3VubWFwX3NnKCkgIDogJThsZCBjYWxscyAgJThsZCBwYWdlcyAoYXZnICVkLzEwMDApXG5cblxuIiwKLQkJCQkgIGlvYy0+dXNnX2NhbGxzLCBpb2MtPnVzZ19wYWdlcywKLQkJCQkgIChpbnQpKChpb2MtPnVzZ19wYWdlcyAqIDEwMDApL2lvYy0+dXNnX2NhbGxzKSk7CisJCXNlcV9wcmludGYobSwgInBjaV91bm1hcF9zZygpICA6ICU4bGQgY2FsbHMgICU4bGQgcGFnZXMgKGF2ZyAlZC8xMDAwKVxuXG5cbiIsCisJCQkgICBpb2MtPnVzZ19jYWxscywgaW9jLT51c2dfcGFnZXMsCisJCQkgICAoaW50KSgoaW9jLT51c2dfcGFnZXMgKiAxMDAwKS9pb2MtPnVzZ19jYWxscykpOwogI2VuZGlmCS8qIENDSU9fQ09MTEVDVF9TVEFUUyAqLwogCiAJCWlvYyA9IGlvYy0+bmV4dDsKQEAgLTExMDEsNyArMTEwMCw2IEBACiAKIHN0YXRpYyBpbnQgY2Npb19wcm9jX2JpdG1hcF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKIHsKLQlpbnQgbGVuID0gMDsKIAlzdHJ1Y3QgaW9jICppb2MgPSBpb2NfbGlzdDsKIAogCXdoaWxlIChpb2MgIT0gTlVMTCkgewpAQCAtMTExMCwxMSArMTEwOCwxMSBAQAogCiAJCWZvciAoaiA9IDA7IGogPCAoaW9jLT5yZXNfc2l6ZSAvIHNpemVvZih1MzIpKTsgaisrKSB7CiAJCQlpZiAoKGogJiA3KSA9PSAwKQotCQkJCWxlbiArPSBzZXFfcHV0cyhtLCAiXG4gICAiKTsKLQkJCWxlbiArPSBzZXFfcHJpbnRmKG0sICIlMDh4IiwgKnJlc19wdHIpOworCQkJCXNlcV9wdXRzKG0sICJcbiAgICIpOworCQkJc2VxX3ByaW50ZihtLCAiJTA4eCIsICpyZXNfcHRyKTsKIAkJCXJlc19wdHIrKzsKIAkJfQotCQlsZW4gKz0gc2VxX3B1dHMobSwgIlxuXG4iKTsKKwkJc2VxX3B1dHMobSwgIlxuXG4iKTsKIAkJaW9jID0gaW9jLT5uZXh0OwogCQlicmVhazsgLyogWFhYIC0gcmVtb3ZlIG1lICovCiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wYXJpc2MvZWlzYV9lbnVtZXJhdG9yLmMgYi9kcml2ZXJzL3BhcmlzYy9laXNhX2VudW1lcmF0b3IuYwppbmRleCBjYWExNTMxLi5hNjU2ZDllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9laXNhX2VudW1lcmF0b3IuYworKysgYi9kcml2ZXJzL3BhcmlzYy9laXNhX2VudW1lcmF0b3IuYwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJCX0KIAkJaWYgKGZsYWdzICYgSFBFRV9GVU5DVElPTl9JTkZPX0NGR19GUkVFX0ZPUk0pIHsKIAkJCS8qIEkgaGF2ZSBubyBpZGVhIGhvdyB0byBoYW5kbGUgdGhpcyAqLwotCQkJcHJpbnRrKCJmdW5jdGlvbiAlZCBoYXZlIGZyZWUtZm9ybSBjb25mZ2l1cmF0aW9uLCBza2lwcGluZyAiLAorCQkJcHJpbnRrKCJmdW5jdGlvbiAlZCBoYXZlIGZyZWUtZm9ybSBjb25maWd1cmF0aW9uLCBza2lwcGluZyAiLAogCQkJCW51bV9mdW5jKTsKIAkJCXBvcyA9IHAwICsgZnVuY3Rpb25fbGVuOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9zYmFfaW9tbXUuYyBiL2RyaXZlcnMvcGFyaXNjL3NiYV9pb21tdS5jCmluZGV4IDFmZjFiNjcuLmYwNzQ3MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL3NiYV9pb21tdS5jCisrKyBiL2RyaXZlcnMvcGFyaXNjL3NiYV9pb21tdS5jCkBAIC0xNzc0LDM3ICsxNzc0LDM1IEBACiAjaWZkZWYgU0JBX0NPTExFQ1RfU1RBVFMKIAl1bnNpZ25lZCBsb25nIGF2ZyA9IDAsIG1pbiwgbWF4OwogI2VuZGlmCi0JaW50IGksIGxlbiA9IDA7CisJaW50IGk7CiAKLQlsZW4gKz0gc2VxX3ByaW50ZihtLCAiJXMgcmV2ICVkLiVkXG4iLAotCQlzYmFfZGV2LT5uYW1lLAotCQkoc2JhX2Rldi0+aHdfcmV2ICYgMHg3KSArIDEsCi0JCShzYmFfZGV2LT5od19yZXYgJiAweDE4KSA+PiAzCi0JCSk7Ci0JbGVuICs9IHNlcV9wcmludGYobSwgIklPIFBESVIgc2l6ZSAgICA6ICVkIGJ5dGVzICglZCBlbnRyaWVzKVxuIiwKLQkJKGludCkgKChpb2MtPnJlc19zaXplIDw8IDMpICogc2l6ZW9mKHU2NCkpLCAvKiA4IGJpdHMvYnl0ZSAqLwotCQl0b3RhbF9wYWdlcyk7CisJc2VxX3ByaW50ZihtLCAiJXMgcmV2ICVkLiVkXG4iLAorCQkgICBzYmFfZGV2LT5uYW1lLAorCQkgICAoc2JhX2Rldi0+aHdfcmV2ICYgMHg3KSArIDEsCisJCSAgIChzYmFfZGV2LT5od19yZXYgJiAweDE4KSA+PiAzKTsKKwlzZXFfcHJpbnRmKG0sICJJTyBQRElSIHNpemUgICAgOiAlZCBieXRlcyAoJWQgZW50cmllcylcbiIsCisJCSAgIChpbnQpKChpb2MtPnJlc19zaXplIDw8IDMpICogc2l6ZW9mKHU2NCkpLCAvKiA4IGJpdHMvYnl0ZSAqLworCQkgICB0b3RhbF9wYWdlcyk7CiAKLQlsZW4gKz0gc2VxX3ByaW50ZihtLCAiUmVzb3VyY2UgYml0bWFwIDogJWQgYnl0ZXMgKCVkIHBhZ2VzKVxuIiwgCi0JCWlvYy0+cmVzX3NpemUsIGlvYy0+cmVzX3NpemUgPDwgMyk7ICAgLyogOCBiaXRzIHBlciBieXRlICovCisJc2VxX3ByaW50ZihtLCAiUmVzb3VyY2UgYml0bWFwIDogJWQgYnl0ZXMgKCVkIHBhZ2VzKVxuIiwKKwkJICAgaW9jLT5yZXNfc2l6ZSwgaW9jLT5yZXNfc2l6ZSA8PCAzKTsgICAvKiA4IGJpdHMgcGVyIGJ5dGUgKi8KIAotCWxlbiArPSBzZXFfcHJpbnRmKG0sICJMTU1JT19CQVNFL01BU0svUk9VVEUgJTA4eCAlMDh4ICUwOHhcbiIsCi0JCVJFQURfUkVHMzIoc2JhX2Rldi0+c2JhX2hwYSArIExNTUlPX0RJU1RfQkFTRSksCi0JCVJFQURfUkVHMzIoc2JhX2Rldi0+c2JhX2hwYSArIExNTUlPX0RJU1RfTUFTSyksCi0JCVJFQURfUkVHMzIoc2JhX2Rldi0+c2JhX2hwYSArIExNTUlPX0RJU1RfUk9VVEUpCi0JCSk7CisJc2VxX3ByaW50ZihtLCAiTE1NSU9fQkFTRS9NQVNLL1JPVVRFICUwOHggJTA4eCAlMDh4XG4iLAorCQkgICBSRUFEX1JFRzMyKHNiYV9kZXYtPnNiYV9ocGEgKyBMTU1JT19ESVNUX0JBU0UpLAorCQkgICBSRUFEX1JFRzMyKHNiYV9kZXYtPnNiYV9ocGEgKyBMTU1JT19ESVNUX01BU0spLAorCQkgICBSRUFEX1JFRzMyKHNiYV9kZXYtPnNiYV9ocGEgKyBMTU1JT19ESVNUX1JPVVRFKSk7CiAKIAlmb3IgKGk9MDsgaTw0OyBpKyspCi0JCWxlbiArPSBzZXFfcHJpbnRmKG0sICJESVIlZF9CQVNFL01BU0svUk9VVEUgJTA4eCAlMDh4ICUwOHhcbiIsIGksCi0JCQlSRUFEX1JFRzMyKHNiYV9kZXYtPnNiYV9ocGEgKyBMTU1JT19ESVJFQ1QwX0JBU0UgICsgaSoweDE4KSwKLQkJCVJFQURfUkVHMzIoc2JhX2Rldi0+c2JhX2hwYSArIExNTUlPX0RJUkVDVDBfTUFTSyAgKyBpKjB4MTgpLAotCQkJUkVBRF9SRUczMihzYmFfZGV2LT5zYmFfaHBhICsgTE1NSU9fRElSRUNUMF9ST1VURSArIGkqMHgxOCkKLQkJKTsKKwkJc2VxX3ByaW50ZihtLCAiRElSJWRfQkFTRS9NQVNLL1JPVVRFICUwOHggJTA4eCAlMDh4XG4iLAorCQkJICAgaSwKKwkJCSAgIFJFQURfUkVHMzIoc2JhX2Rldi0+c2JhX2hwYSArIExNTUlPX0RJUkVDVDBfQkFTRSAgKyBpKjB4MTgpLAorCQkJICAgUkVBRF9SRUczMihzYmFfZGV2LT5zYmFfaHBhICsgTE1NSU9fRElSRUNUMF9NQVNLICArIGkqMHgxOCksCisJCQkgICBSRUFEX1JFRzMyKHNiYV9kZXYtPnNiYV9ocGEgKyBMTU1JT19ESVJFQ1QwX1JPVVRFICsgaSoweDE4KSk7CiAKICNpZmRlZiBTQkFfQ09MTEVDVF9TVEFUUwotCWxlbiArPSBzZXFfcHJpbnRmKG0sICJJTyBQRElSIGVudHJpZXMgOiAlbGQgZnJlZSAgJWxkIHVzZWQgKCVkJSUpXG4iLAotCQl0b3RhbF9wYWdlcyAtIGlvYy0+dXNlZF9wYWdlcywgaW9jLT51c2VkX3BhZ2VzLAotCQkoaW50KSAoaW9jLT51c2VkX3BhZ2VzICogMTAwIC8gdG90YWxfcGFnZXMpKTsKKwlzZXFfcHJpbnRmKG0sICJJTyBQRElSIGVudHJpZXMgOiAlbGQgZnJlZSAgJWxkIHVzZWQgKCVkJSUpXG4iLAorCQkgICB0b3RhbF9wYWdlcyAtIGlvYy0+dXNlZF9wYWdlcywgaW9jLT51c2VkX3BhZ2VzLAorCQkgICAoaW50KShpb2MtPnVzZWRfcGFnZXMgKiAxMDAgLyB0b3RhbF9wYWdlcykpOwogCiAJbWluID0gbWF4ID0gaW9jLT5hdmdfc2VhcmNoWzBdOwogCWZvciAoaSA9IDA7IGkgPCBTQkFfU0VBUkNIX1NBTVBMRTsgaSsrKSB7CkBAIC0xODEzLDI2ICsxODExLDI2IEBACiAJCWlmIChpb2MtPmF2Z19zZWFyY2hbaV0gPCBtaW4pIG1pbiA9IGlvYy0+YXZnX3NlYXJjaFtpXTsKIAl9CiAJYXZnIC89IFNCQV9TRUFSQ0hfU0FNUExFOwotCWxlbiArPSBzZXFfcHJpbnRmKG0sICIgIEJpdG1hcCBzZWFyY2ggOiAlbGQvJWxkLyVsZCAobWluL2F2Zy9tYXggQ1BVIEN5Y2xlcylcbiIsCi0JCW1pbiwgYXZnLCBtYXgpOworCXNlcV9wcmludGYobSwgIiAgQml0bWFwIHNlYXJjaCA6ICVsZC8lbGQvJWxkIChtaW4vYXZnL21heCBDUFUgQ3ljbGVzKVxuIiwKKwkJICAgbWluLCBhdmcsIG1heCk7CiAKLQlsZW4gKz0gc2VxX3ByaW50ZihtLCAicGNpX21hcF9zaW5nbGUoKTogJTEybGQgY2FsbHMgICUxMmxkIHBhZ2VzIChhdmcgJWQvMTAwMClcbiIsCi0JCWlvYy0+bXNpbmdsZV9jYWxscywgaW9jLT5tc2luZ2xlX3BhZ2VzLAotCQkoaW50KSAoKGlvYy0+bXNpbmdsZV9wYWdlcyAqIDEwMDApL2lvYy0+bXNpbmdsZV9jYWxscykpOworCXNlcV9wcmludGYobSwgInBjaV9tYXBfc2luZ2xlKCk6ICUxMmxkIGNhbGxzICAlMTJsZCBwYWdlcyAoYXZnICVkLzEwMDApXG4iLAorCQkgICBpb2MtPm1zaW5nbGVfY2FsbHMsIGlvYy0+bXNpbmdsZV9wYWdlcywKKwkJICAgKGludCkoKGlvYy0+bXNpbmdsZV9wYWdlcyAqIDEwMDApL2lvYy0+bXNpbmdsZV9jYWxscykpOwogCiAJLyogS0xVR0UgLSB1bm1hcF9zZyBjYWxscyB1bm1hcF9zaW5nbGUgZm9yIGVhY2ggbWFwcGVkIHBhZ2UgKi8KIAltaW4gPSBpb2MtPnVzaW5nbGVfY2FsbHM7CiAJbWF4ID0gaW9jLT51c2luZ2xlX3BhZ2VzIC0gaW9jLT51c2dfcGFnZXM7Ci0JbGVuICs9IHNlcV9wcmludGYobSwgInBjaV91bm1hcF9zaW5nbGU6ICUxMmxkIGNhbGxzICAlMTJsZCBwYWdlcyAoYXZnICVkLzEwMDApXG4iLAotCQltaW4sIG1heCwgKGludCkgKChtYXggKiAxMDAwKS9taW4pKTsKKwlzZXFfcHJpbnRmKG0sICJwY2lfdW5tYXBfc2luZ2xlOiAlMTJsZCBjYWxscyAgJTEybGQgcGFnZXMgKGF2ZyAlZC8xMDAwKVxuIiwKKwkJICAgbWluLCBtYXgsIChpbnQpKChtYXggKiAxMDAwKS9taW4pKTsKIAotCWxlbiArPSBzZXFfcHJpbnRmKG0sICJwY2lfbWFwX3NnKCkgICAgOiAlMTJsZCBjYWxscyAgJTEybGQgcGFnZXMgKGF2ZyAlZC8xMDAwKVxuIiwKLQkJaW9jLT5tc2dfY2FsbHMsIGlvYy0+bXNnX3BhZ2VzLCAKLQkJKGludCkgKChpb2MtPm1zZ19wYWdlcyAqIDEwMDApL2lvYy0+bXNnX2NhbGxzKSk7CisJc2VxX3ByaW50ZihtLCAicGNpX21hcF9zZygpICAgIDogJTEybGQgY2FsbHMgICUxMmxkIHBhZ2VzIChhdmcgJWQvMTAwMClcbiIsCisJCSAgIGlvYy0+bXNnX2NhbGxzLCBpb2MtPm1zZ19wYWdlcywKKwkJICAgKGludCkoKGlvYy0+bXNnX3BhZ2VzICogMTAwMCkvaW9jLT5tc2dfY2FsbHMpKTsKIAotCWxlbiArPSBzZXFfcHJpbnRmKG0sICJwY2lfdW5tYXBfc2coKSAgOiAlMTJsZCBjYWxscyAgJTEybGQgcGFnZXMgKGF2ZyAlZC8xMDAwKVxuIiwKLQkJaW9jLT51c2dfY2FsbHMsIGlvYy0+dXNnX3BhZ2VzLAotCQkoaW50KSAoKGlvYy0+dXNnX3BhZ2VzICogMTAwMCkvaW9jLT51c2dfY2FsbHMpKTsKKwlzZXFfcHJpbnRmKG0sICJwY2lfdW5tYXBfc2coKSAgOiAlMTJsZCBjYWxscyAgJTEybGQgcGFnZXMgKGF2ZyAlZC8xMDAwKVxuIiwKKwkJICAgaW9jLT51c2dfY2FsbHMsIGlvYy0+dXNnX3BhZ2VzLAorCQkgICAoaW50KSgoaW9jLT51c2dfcGFnZXMgKiAxMDAwKS9pb2MtPnVzZ19jYWxscykpOwogI2VuZGlmCiAKIAlyZXR1cm4gMDsKQEAgLTE4NTgsMTQgKzE4NTYsMTQgQEAKIAlzdHJ1Y3Qgc2JhX2RldmljZSAqc2JhX2RldiA9IHNiYV9saXN0OwogCXN0cnVjdCBpb2MgKmlvYyA9ICZzYmFfZGV2LT5pb2NbMF07CS8qIEZJWE1FOiBNdWx0aS1JT0Mgc3VwcG9ydCEgKi8KIAl1bnNpZ25lZCBpbnQgKnJlc19wdHIgPSAodW5zaWduZWQgaW50ICopaW9jLT5yZXNfbWFwOwotCWludCBpLCBsZW4gPSAwOworCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IChpb2MtPnJlc19zaXplL3NpemVvZih1bnNpZ25lZCBpbnQpKTsgKytpLCArK3Jlc19wdHIpIHsKIAkJaWYgKChpICYgNykgPT0gMCkKLQkJCWxlbiArPSBzZXFfcHJpbnRmKG0sICJcbiAgICIpOwotCQlsZW4gKz0gc2VxX3ByaW50ZihtLCAiICUwOHgiLCAqcmVzX3B0cik7CisJCQlzZXFfcHV0cyhtLCAiXG4gICAiKTsKKwkJc2VxX3ByaW50ZihtLCAiICUwOHgiLCAqcmVzX3B0cik7CiAJfQotCWxlbiArPSBzZXFfcHJpbnRmKG0sICJcbiIpOworCXNlcV9wdXRjKG0sICdcbicpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0LWJyaWRnZS5jIGIvZHJpdmVycy9wY2kvaG9zdC1icmlkZ2UuYwppbmRleCAzOWIyZGJlLi41ZjRhMmUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0LWJyaWRnZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QtYnJpZGdlLmMKQEAgLTE2LDEzICsxNiwyNyBAQAogCXJldHVybiBidXM7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2hvc3RfYnJpZGdlICpmaW5kX3BjaV9ob3N0X2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQorc3RydWN0IHBjaV9ob3N0X2JyaWRnZSAqcGNpX2ZpbmRfaG9zdF9icmlkZ2Uoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgcGNpX2J1cyAqcm9vdF9idXMgPSBmaW5kX3BjaV9yb290X2J1cyhidXMpOwogCiAJcmV0dXJuIHRvX3BjaV9ob3N0X2JyaWRnZShyb290X2J1cy0+YnJpZGdlKTsKIH0KIAorc3RydWN0IGRldmljZSAqcGNpX2dldF9ob3N0X2JyaWRnZV9kZXZpY2Uoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2J1cyAqcm9vdF9idXMgPSBmaW5kX3BjaV9yb290X2J1cyhkZXYtPmJ1cyk7CisJc3RydWN0IGRldmljZSAqYnJpZGdlID0gcm9vdF9idXMtPmJyaWRnZTsKKworCWtvYmplY3RfZ2V0KCZicmlkZ2UtPmtvYmopOworCXJldHVybiBicmlkZ2U7Cit9CisKK3ZvaWQgIHBjaV9wdXRfaG9zdF9icmlkZ2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlrb2JqZWN0X3B1dCgmZGV2LT5rb2JqKTsKK30KKwogdm9pZCBwY2lfc2V0X2hvc3RfYnJpZGdlX3JlbGVhc2Uoc3RydWN0IHBjaV9ob3N0X2JyaWRnZSAqYnJpZGdlLAogCQkJCSB2b2lkICgqcmVsZWFzZV9mbikoc3RydWN0IHBjaV9ob3N0X2JyaWRnZSAqKSwKIAkJCQkgdm9pZCAqcmVsZWFzZV9kYXRhKQpAQCAtMzQsNyArNDgsNyBAQAogdm9pZCBwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLCBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbiwKIAkJCSAgICAgc3RydWN0IHJlc291cmNlICpyZXMpCiB7Ci0Jc3RydWN0IHBjaV9ob3N0X2JyaWRnZSAqYnJpZGdlID0gZmluZF9wY2lfaG9zdF9icmlkZ2UoYnVzKTsKKwlzdHJ1Y3QgcGNpX2hvc3RfYnJpZGdlICpicmlkZ2UgPSBwY2lfZmluZF9ob3N0X2JyaWRnZShidXMpOwogCXN0cnVjdCByZXNvdXJjZV9lbnRyeSAqd2luZG93OwogCXJlc291cmNlX3NpemVfdCBvZmZzZXQgPSAwOwogCkBAIC01OSw3ICs3Myw3IEBACiB2b2lkIHBjaWJpb3NfYnVzX3RvX3Jlc291cmNlKHN0cnVjdCBwY2lfYnVzICpidXMsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAogCQkJICAgICBzdHJ1Y3QgcGNpX2J1c19yZWdpb24gKnJlZ2lvbikKIHsKLQlzdHJ1Y3QgcGNpX2hvc3RfYnJpZGdlICpicmlkZ2UgPSBmaW5kX3BjaV9ob3N0X2JyaWRnZShidXMpOworCXN0cnVjdCBwY2lfaG9zdF9icmlkZ2UgKmJyaWRnZSA9IHBjaV9maW5kX2hvc3RfYnJpZGdlKGJ1cyk7CiAJc3RydWN0IHJlc291cmNlX2VudHJ5ICp3aW5kb3c7CiAJcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvcGNpL2hvc3QvS2NvbmZpZwppbmRleCA3Yjg5MmE5Li4xZGZiNTY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9LY29uZmlnCkBAIC0xMDYsNCArMTA2LDIzIEBACiAJYm9vbCAiQVJNIFZlcnNhdGlsZSBQQiBQQ0kgY29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEFSQ0hfVkVSU0FUSUxFCiAKK2NvbmZpZyBQQ0lFX0lQUk9DCisJdHJpc3RhdGUgIkJyb2FkY29tIGlQcm9jIFBDSWUgY29udHJvbGxlciIKKwlkZXBlbmRzIG9uIE9GICYmIEFSTQorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgaVByb2MgUENJZSBjb3JlIGNvbnRyb2xsZXIgc3VwcG9ydCBmb3IgQnJvYWRjb20ncworCSAgaVByb2MgZmFtaWx5IG9mIFNvQ3MuIEFuIGFwcHJvcHJpYXRlIGJ1cyBpbnRlcmZhY2UgZHJpdmVyIGFsc28gbmVlZHMKKwkgIHRvIGJlIGVuYWJsZWQKKworY29uZmlnIFBDSUVfSVBST0NfUExBVEZPUk0KKwl0cmlzdGF0ZSAiQnJvYWRjb20gaVByb2MgUENJZSBwbGF0Zm9ybSBidXMgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9CQ01fSVBST0MgfHwgKEFSTSAmJiBDT01QSUxFX1RFU1QpCisJZGVwZW5kcyBvbiBPRgorCXNlbGVjdCBQQ0lFX0lQUk9DCisJZGVmYXVsdCBBUkNIX0JDTV9JUFJPQworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBCcm9hZGNvbSBpUHJvYyBQQ0llIGNvbnRyb2xsZXIKKwkgIHRocm91Z2ggdGhlIGdlbmVyaWMgcGxhdGZvcm0gYnVzIGludGVyZmFjZQorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L01ha2VmaWxlIGIvZHJpdmVycy9wY2kvaG9zdC9NYWtlZmlsZQppbmRleCBlNjFkOTFjLi5mNzMzYjRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvTWFrZWZpbGUKQEAgLTEzLDMgKzEzLDUgQEAKIG9iai0kKENPTkZJR19QQ0lfWEdFTkUpICs9IHBjaS14Z2VuZS5vCiBvYmotJChDT05GSUdfUENJX0xBWUVSU0NBUEUpICs9IHBjaS1sYXllcnNjYXBlLm8KIG9iai0kKENPTkZJR19QQ0lfVkVSU0FUSUxFKSArPSBwY2ktdmVyc2F0aWxlLm8KK29iai0kKENPTkZJR19QQ0lFX0lQUk9DKSArPSBwY2llLWlwcm9jLm8KK29iai0kKENPTkZJR19QQ0lFX0lQUk9DX1BMQVRGT1JNKSArPSBwY2llLWlwcm9jLXBsYXRmb3JtLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWV4eW5vcy5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktZXh5bm9zLmMKaW5kZXggZDIwMmIzNy4uYzEzOTIzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktZXh5bm9zLmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktZXh5bm9zLmMKQEAgLTM5Niw3ICszOTYsNyBAQAogCiAJLyogZW5hYmxlIElOVFggaW50ZXJydXB0ICovCiAJdmFsID0gSVJRX0lOVEFfQVNTRVJUIHwgSVJRX0lOVEJfQVNTRVJUIHwKLQkJSVJRX0lOVENfQVNTRVJUIHwgSVJRX0lOVERfQVNTRVJULAorCQlJUlFfSU5UQ19BU1NFUlQgfCBJUlFfSU5URF9BU1NFUlQ7CiAJZXh5bm9zX2VsYl93cml0ZWwoZXh5bm9zX3BjaWUsIHZhbCwgUENJRV9JUlFfRU5fUFVMU0UpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1rZXlzdG9uZS1kdy5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2kta2V5c3RvbmUtZHcuYwppbmRleCA2NmQ4ZWE0Li5mMzQ4OTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1rZXlzdG9uZS1kdy5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWtleXN0b25lLWR3LmMKQEAgLTQ5NiwxMSArNDk2LDEyIEBACiAKIAkvKiBJbmRleCAxIGlzIHRoZSBhcHBsaWNhdGlvbiByZWcuIHNwYWNlIGFkZHJlc3MgKi8KIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOwotCWtzX3BjaWUtPmFwcCA9ICpyZXM7CiAJa3NfcGNpZS0+dmFfYXBwX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UocHAtPmRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKGtzX3BjaWUtPnZhX2FwcF9iYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoa3NfcGNpZS0+dmFfYXBwX2Jhc2UpOwogCisJa3NfcGNpZS0+YXBwID0gKnJlczsKKwogCS8qIENyZWF0ZSBsZWdhY3kgSVJRIGRvbWFpbiAqLwogCWtzX3BjaWUtPmxlZ2FjeV9pcnFfZG9tYWluID0KIAkJCWlycV9kb21haW5fYWRkX2xpbmVhcihrc19wY2llLT5sZWdhY3lfaW50Y19ucCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWxheWVyc2NhcGUuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLWxheWVyc2NhcGUuYwppbmRleCA2OGM5ZTVlLi40YTZlNjJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1sYXllcnNjYXBlLmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktbGF5ZXJzY2FwZS5jCkBAIC0xMjcsMTQgKzEyNywxMSBAQAogCXBjaWUtPmRldiA9ICZwZGV2LT5kZXY7CiAKIAlkYmlfYmFzZSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJyZWdzIik7Ci0JaWYgKCFkYmlfYmFzZSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nICpyZWdzKiBzcGFjZVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCXBjaWUtPmRiaSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBkYmlfYmFzZSk7Ci0JaWYgKElTX0VSUihwY2llLT5kYmkpKQorCWlmIChJU19FUlIocGNpZS0+ZGJpKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaXNzaW5nICpyZWdzKiBzcGFjZVxuIik7CiAJCXJldHVybiBQVFJfRVJSKHBjaWUtPmRiaSk7CisJfQogCiAJcGNpZS0+c2NmZyA9IHN5c2Nvbl9yZWdtYXBfbG9va3VwX2J5X3BoYW5kbGUocGRldi0+ZGV2Lm9mX25vZGUsCiAJCQkJCQkgICAgICJmc2wscGNpZS1zY2ZnIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1tdmVidS5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2ktbXZlYnUuYwppbmRleCAxMzA5Y2ZiLi4xYWI4NjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1tdmVidS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLW12ZWJ1LmMKQEAgLTEyOSw2ICsxMjksNyBAQAogCXNpemVfdCBtZW13aW5fc2l6ZTsKIAlwaHlzX2FkZHJfdCBpb3dpbl9iYXNlOwogCXNpemVfdCBpb3dpbl9zaXplOworCXUzMiBzYXZlZF9wY2llX3N0YXQ7CiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgbXZlYnVfd3JpdGVsKHN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQsIHUzMiB2YWwsIHUzMiByZWcpCkBAIC04OTksNiArOTAwLDM1IEBACiAJCXBjaWUtPm1zaS0+ZGV2ID0gJnBjaWUtPnBkZXYtPmRldjsKIH0KIAorc3RhdGljIGludCBtdmVidV9wY2llX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtdmVidV9wY2llICpwY2llOworCWludCBpOworCisJcGNpZSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWZvciAoaSA9IDA7IGkgPCBwY2llLT5ucG9ydHM7IGkrKykgeworCQlzdHJ1Y3QgbXZlYnVfcGNpZV9wb3J0ICpwb3J0ID0gcGNpZS0+cG9ydHMgKyBpOworCQlwb3J0LT5zYXZlZF9wY2llX3N0YXQgPSBtdmVidV9yZWFkbChwb3J0LCBQQ0lFX1NUQVRfT0ZGKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdmVidV9wY2llX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG12ZWJ1X3BjaWUgKnBjaWU7CisJaW50IGk7CisKKwlwY2llID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJZm9yIChpID0gMDsgaSA8IHBjaWUtPm5wb3J0czsgaSsrKSB7CisJCXN0cnVjdCBtdmVidV9wY2llX3BvcnQgKnBvcnQgPSBwY2llLT5wb3J0cyArIGk7CisJCW12ZWJ1X3dyaXRlbChwb3J0LCBwb3J0LT5zYXZlZF9wY2llX3N0YXQsIFBDSUVfU1RBVF9PRkYpOworCQltdmVidV9wY2llX3NldHVwX2h3KHBvcnQpOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG12ZWJ1X3BjaWVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbXZlYnVfcGNpZSAqcGNpZTsKQEAgLTEwNTYsNiArMTA4Niw4IEBACiAJbXZlYnVfcGNpZV9tc2lfZW5hYmxlKHBjaWUpOwogCW12ZWJ1X3BjaWVfZW5hYmxlKHBjaWUpOwogCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGNpZSk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTA2OCwxMiArMTEwMCwxOCBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG12ZWJ1X3BjaWVfb2ZfbWF0Y2hfdGFibGUpOwogCitzdGF0aWMgc3RydWN0IGRldl9wbV9vcHMgbXZlYnVfcGNpZV9wbV9vcHMgPSB7CisJLnN1c3BlbmRfbm9pcnEgPSBtdmVidV9wY2llX3N1c3BlbmQsCisJLnJlc3VtZV9ub2lycSA9IG12ZWJ1X3BjaWVfcmVzdW1lLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXZlYnVfcGNpZV9kcml2ZXIgPSB7CiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSAibXZlYnUtcGNpZSIsCiAJCS5vZl9tYXRjaF90YWJsZSA9IG12ZWJ1X3BjaWVfb2ZfbWF0Y2hfdGFibGUsCiAJCS8qIGRyaXZlciB1bmxvYWRpbmcvdW5iaW5kaW5nIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkICovCiAJCS5zdXBwcmVzc19iaW5kX2F0dHJzID0gdHJ1ZSwKKwkJLnBtID0gJm12ZWJ1X3BjaWVfcG1fb3BzLAogCX0sCiAJLnByb2JlID0gbXZlYnVfcGNpZV9wcm9iZSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS1yY2FyLWdlbjIuYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXJjYXItZ2VuMi5jCmluZGV4IGRkNmI4NGUuLjM2N2UyOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXJjYXItZ2VuMi5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpLXJjYXItZ2VuMi5jCkBAIC0zMDEsNiArMzAxLDkgQEAKIAlpZiAoIW1lbV9yZXMgfHwgIW1lbV9yZXMtPnN0YXJ0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWlmIChtZW1fcmVzLT5zdGFydCAmIDB4RkZGRikKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlwcml2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCiAJCQkgICAgc2l6ZW9mKHN0cnVjdCByY2FyX3BjaV9wcml2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwcml2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2ktdmVyc2F0aWxlLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS12ZXJzYXRpbGUuYwppbmRleCA0NjRiZjQ5Li4wODYzZDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaS12ZXJzYXRpbGUuYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaS12ZXJzYXRpbGUuYwpAQCAtMTM4LDE5ICsxMzgsMTkgQEAKIAlMSVNUX0hFQUQocGNpX3Jlcyk7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKQotCQlyZXR1cm4gLUVOT0RFVjsKIAl2ZXJzYXRpbGVfcGNpX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHZlcnNhdGlsZV9wY2lfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHZlcnNhdGlsZV9wY2lfYmFzZSk7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOwotCWlmICghcmVzKQotCQlyZXR1cm4gLUVOT0RFVjsKIAl2ZXJzYXRpbGVfY2ZnX2Jhc2VbMF0gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHZlcnNhdGlsZV9jZmdfYmFzZVswXSkpCisJCXJldHVybiBQVFJfRVJSKHZlcnNhdGlsZV9jZmdfYmFzZVswXSk7CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDIpOwotCWlmICghcmVzKQotCQlyZXR1cm4gLUVOT0RFVjsKIAl2ZXJzYXRpbGVfY2ZnX2Jhc2VbMV0gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHZlcnNhdGlsZV9jZmdfYmFzZVsxXSkpCisJCXJldHVybiBQVFJfRVJSKHZlcnNhdGlsZV9jZmdfYmFzZVsxXSk7CiAKIAlyZXQgPSB2ZXJzYXRpbGVfcGNpX3BhcnNlX3JlcXVlc3Rfb2ZfcGNpX3JhbmdlcygmcGRldi0+ZGV2LCAmcGNpX3Jlcyk7CiAJaWYgKHJldCkKQEAgLTIxNCw2ICsyMTQsNyBAQAogCiAJcGNpX2ZpeHVwX2lycXMocGNpX2NvbW1vbl9zd2l6emxlLCBvZl9pcnFfcGFyc2VfYW5kX21hcF9wY2kpOwogCXBjaV9hc3NpZ25fdW5hc3NpZ25lZF9idXNfcmVzb3VyY2VzKGJ1cyk7CisJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWRlc2lnbndhcmUuYwppbmRleCAxZjRlYTZmLi4yZTlmODRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtZGVzaWdud2FyZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1kZXNpZ253YXJlLmMKQEAgLTM0Miw3ICszNDIsNyBAQAogCS5tYXAgPSBkd19wY2llX21zaV9tYXAsCiB9OwogCi1pbnQgX19pbml0IGR3X3BjaWVfaG9zdF9pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQoraW50IGR3X3BjaWVfaG9zdF9pbml0KHN0cnVjdCBwY2llX3BvcnQgKnBwKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwcC0+ZGV2LT5vZl9ub2RlOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UocHAtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtaXByb2MtcGxhdGZvcm0uYyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1pcHJvYy1wbGF0Zm9ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWQ2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtaXByb2MtcGxhdGZvcm0uYwpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorCisjaW5jbHVkZSAicGNpZS1pcHJvYy5oIgorCitzdGF0aWMgaW50IGlwcm9jX3BjaWVfcGx0Zm1fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaXByb2NfcGNpZSAqcGNpZTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IHJlc291cmNlIHJlZzsKKwlyZXNvdXJjZV9zaXplX3QgaW9iYXNlID0gMDsKKwlMSVNUX0hFQUQocmVzKTsKKwlpbnQgcmV0OworCisJcGNpZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGlwcm9jX3BjaWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjaWUpCisJCXJldHVybiAtRU5PTUVNOworCisJcGNpZS0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwY2llKTsKKworCXJldCA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZWcpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocGNpZS0+ZGV2LCAidW5hYmxlIHRvIG9idGFpbiBjb250cm9sbGVyIHJlc291cmNlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGNpZS0+YmFzZSA9IGRldm1faW9yZW1hcChwY2llLT5kZXYsIHJlZy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVnKSk7CisJaWYgKCFwY2llLT5iYXNlKSB7CisJCWRldl9lcnIocGNpZS0+ZGV2LCAidW5hYmxlIHRvIG1hcCBjb250cm9sbGVyIHJlZ2lzdGVyc1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFBIWSB1c2UgaXMgb3B0aW9uYWwgKi8KKwlwY2llLT5waHkgPSBkZXZtX3BoeV9nZXQoJnBkZXYtPmRldiwgInBjaWUtcGh5Iik7CisJaWYgKElTX0VSUihwY2llLT5waHkpKSB7CisJCWlmIChQVFJfRVJSKHBjaWUtPnBoeSkgPT0gLUVQUk9CRV9ERUZFUikKKwkJCXJldHVybiAtRVBST0JFX0RFRkVSOworCQlwY2llLT5waHkgPSBOVUxMOworCX0KKworCXJldCA9IG9mX3BjaV9nZXRfaG9zdF9icmlkZ2VfcmVzb3VyY2VzKG5wLCAwLCAweGZmLCAmcmVzLCAmaW9iYXNlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocGNpZS0+ZGV2LAorCQkJInVuYWJsZSB0byBnZXQgUENJIGhvc3QgYnJpZGdlIHJlc291cmNlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGNpZS0+cmVzb3VyY2VzID0gJnJlczsKKworCXJldCA9IGlwcm9jX3BjaWVfc2V0dXAocGNpZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHBjaWUtPmRldiwgIlBDSWUgY29udHJvbGxlciBzZXR1cCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwcm9jX3BjaWVfcGx0Zm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGlwcm9jX3BjaWUgKnBjaWUgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJldHVybiBpcHJvY19wY2llX3JlbW92ZShwY2llKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaXByb2NfcGNpZV9vZl9tYXRjaF90YWJsZVtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxpcHJvYy1wY2llIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpcHJvY19wY2llX29mX21hdGNoX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaXByb2NfcGNpZV9wbHRmbV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiaXByb2MtcGNpZSIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihpcHJvY19wY2llX29mX21hdGNoX3RhYmxlKSwKKwl9LAorCS5wcm9iZSA9IGlwcm9jX3BjaWVfcGx0Zm1fcHJvYmUsCisJLnJlbW92ZSA9IGlwcm9jX3BjaWVfcGx0Zm1fcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaXByb2NfcGNpZV9wbHRmbV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJSYXkgSnVpIDxyanVpQGJyb2FkY29tLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gaVBST0MgUENJZSBwbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1pcHJvYy5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWlwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5ZTFiNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1pcHJvYy5jCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEhhdWtlIE1laHJ0ZW5zIDxoYXVrZUBoYXVrZS1tLmRlPgorICogQ29weXJpZ2h0IChDKSAyMDE1IEJyb2FkY29tIENvcnBvcmF0Y29tbW9uIGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9tc2kuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tYnVzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcGh5L3BoeS5oPgorCisjaW5jbHVkZSAicGNpZS1pcHJvYy5oIgorCisjZGVmaW5lIENMS19DT05UUk9MX09GRlNFVCAgICAgICAgICAgMHgwMDAKKyNkZWZpbmUgRVBfTU9ERV9TVVJWSVZFX1BFUlNUX1NISUZUICAxCisjZGVmaW5lIEVQX01PREVfU1VSVklWRV9QRVJTVCAgICAgICAgQklUKEVQX01PREVfU1VSVklWRV9QRVJTVF9TSElGVCkKKyNkZWZpbmUgUkNfUENJRV9SU1RfT1VUUFVUX1NISUZUICAgICAwCisjZGVmaW5lIFJDX1BDSUVfUlNUX09VVFBVVCAgICAgICAgICAgQklUKFJDX1BDSUVfUlNUX09VVFBVVF9TSElGVCkKKworI2RlZmluZSBDRkdfSU5EX0FERFJfT0ZGU0VUICAgICAgICAgIDB4MTIwCisjZGVmaW5lIENGR19JTkRfQUREUl9NQVNLICAgICAgICAgICAgMHgwMDAwMWZmYworCisjZGVmaW5lIENGR19JTkRfREFUQV9PRkZTRVQgICAgICAgICAgMHgxMjQKKworI2RlZmluZSBDRkdfQUREUl9PRkZTRVQgICAgICAgICAgICAgIDB4MWY4CisjZGVmaW5lIENGR19BRERSX0JVU19OVU1fU0hJRlQgICAgICAgMjAKKyNkZWZpbmUgQ0ZHX0FERFJfQlVTX05VTV9NQVNLICAgICAgICAweDBmZjAwMDAwCisjZGVmaW5lIENGR19BRERSX0RFVl9OVU1fU0hJRlQgICAgICAgMTUKKyNkZWZpbmUgQ0ZHX0FERFJfREVWX05VTV9NQVNLICAgICAgICAweDAwMGY4MDAwCisjZGVmaW5lIENGR19BRERSX0ZVTkNfTlVNX1NISUZUICAgICAgMTIKKyNkZWZpbmUgQ0ZHX0FERFJfRlVOQ19OVU1fTUFTSyAgICAgICAweDAwMDA3MDAwCisjZGVmaW5lIENGR19BRERSX1JFR19OVU1fU0hJRlQgICAgICAgMgorI2RlZmluZSBDRkdfQUREUl9SRUdfTlVNX01BU0sgICAgICAgIDB4MDAwMDBmZmMKKyNkZWZpbmUgQ0ZHX0FERFJfQ0ZHX1RZUEVfU0hJRlQgICAgICAwCisjZGVmaW5lIENGR19BRERSX0NGR19UWVBFX01BU0sgICAgICAgMHgwMDAwMDAwMworCisjZGVmaW5lIENGR19EQVRBX09GRlNFVCAgICAgICAgICAgICAgMHgxZmMKKworI2RlZmluZSBTWVNfUkNfSU5UWF9FTiAgICAgICAgICAgICAgIDB4MzMwCisjZGVmaW5lIFNZU19SQ19JTlRYX01BU0sgICAgICAgICAgICAgMHhmCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGlwcm9jX3BjaWUgKnN5c190b19wY2llKHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cykKK3sKKwlyZXR1cm4gc3lzLT5wcml2YXRlX2RhdGE7Cit9CisKKy8qKgorICogTm90ZSBhY2Nlc3MgdG8gdGhlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGFyZSBwcm90ZWN0ZWQgYXQgdGhlIGhpZ2hlciBsYXllcgorICogYnkgJ3BjaV9sb2NrJyBpbiBkcml2ZXJzL3BjaS9hY2Nlc3MuYworICovCitzdGF0aWMgdm9pZCBfX2lvbWVtICppcHJvY19wY2llX21hcF9jZmdfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCQkJCSAgICBpbnQgd2hlcmUpCit7CisJc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzID0gYnVzLT5zeXNkYXRhOworCXN0cnVjdCBpcHJvY19wY2llICpwY2llID0gc3lzX3RvX3BjaWUoc3lzKTsKKwl1bnNpZ25lZCBzbG90ID0gUENJX1NMT1QoZGV2Zm4pOworCXVuc2lnbmVkIGZuID0gUENJX0ZVTkMoZGV2Zm4pOworCXVuc2lnbmVkIGJ1c25vID0gYnVzLT5udW1iZXI7CisJdTMyIHZhbDsKKworCS8qIHJvb3QgY29tcGxleCBhY2Nlc3MgKi8KKwlpZiAoYnVzbm8gPT0gMCkgeworCQlpZiAoc2xvdCA+PSAxKQorCQkJcmV0dXJuIE5VTEw7CisJCXdyaXRlbCh3aGVyZSAmIENGR19JTkRfQUREUl9NQVNLLAorCQkgICAgICAgcGNpZS0+YmFzZSArIENGR19JTkRfQUREUl9PRkZTRVQpOworCQlyZXR1cm4gKHBjaWUtPmJhc2UgKyBDRkdfSU5EX0RBVEFfT0ZGU0VUKTsKKwl9CisKKwlpZiAoZm4gPiAxKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEVQIGRldmljZSBhY2Nlc3MgKi8KKwl2YWwgPSAoYnVzbm8gPDwgQ0ZHX0FERFJfQlVTX05VTV9TSElGVCkgfAorCQkoc2xvdCA8PCBDRkdfQUREUl9ERVZfTlVNX1NISUZUKSB8CisJCShmbiA8PCBDRkdfQUREUl9GVU5DX05VTV9TSElGVCkgfAorCQkod2hlcmUgJiBDRkdfQUREUl9SRUdfTlVNX01BU0spIHwKKwkJKDEgJiBDRkdfQUREUl9DRkdfVFlQRV9NQVNLKTsKKwl3cml0ZWwodmFsLCBwY2llLT5iYXNlICsgQ0ZHX0FERFJfT0ZGU0VUKTsKKworCXJldHVybiAocGNpZS0+YmFzZSArIENGR19EQVRBX09GRlNFVCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX29wcyBpcHJvY19wY2llX29wcyA9IHsKKwkubWFwX2J1cyA9IGlwcm9jX3BjaWVfbWFwX2NmZ19idXMsCisJLnJlYWQgPSBwY2lfZ2VuZXJpY19jb25maWdfcmVhZDMyLAorCS53cml0ZSA9IHBjaV9nZW5lcmljX2NvbmZpZ193cml0ZTMyLAorfTsKKworc3RhdGljIHZvaWQgaXByb2NfcGNpZV9yZXNldChzdHJ1Y3QgaXByb2NfcGNpZSAqcGNpZSkKK3sKKwl1MzIgdmFsOworCisJLyoKKwkgKiBDb25maWd1cmUgdGhlIFBDSWUgY29udHJvbGxlciBhcyByb290IGNvbXBsZXggYW5kIHNlbmQgYSBkb3duc3RyZWFtCisJICogcmVzZXQKKwkgKi8KKwl2YWwgPSBFUF9NT0RFX1NVUlZJVkVfUEVSU1QgfCBSQ19QQ0lFX1JTVF9PVVRQVVQ7CisJd3JpdGVsKHZhbCwgcGNpZS0+YmFzZSArIENMS19DT05UUk9MX09GRlNFVCk7CisJdWRlbGF5KDI1MCk7CisJdmFsICY9IH5FUF9NT0RFX1NVUlZJVkVfUEVSU1Q7CisJd3JpdGVsKHZhbCwgcGNpZS0+YmFzZSArIENMS19DT05UUk9MX09GRlNFVCk7CisJbXNsZWVwKDI1MCk7Cit9CisKK3N0YXRpYyBpbnQgaXByb2NfcGNpZV9jaGVja19saW5rKHN0cnVjdCBpcHJvY19wY2llICpwY2llLCBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXU4IGhkcl90eXBlOworCXUzMiBsaW5rX2N0cmw7CisJdTE2IHBvcywgbGlua19zdGF0dXM7CisJaW50IGxpbmtfaXNfYWN0aXZlID0gMDsKKworCS8qIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGluIEVQIG1vZGUgKi8KKwlwY2lfYnVzX3JlYWRfY29uZmlnX2J5dGUoYnVzLCAwLCBQQ0lfSEVBREVSX1RZUEUsICZoZHJfdHlwZSk7CisJaWYgKChoZHJfdHlwZSAmIDB4N2YpICE9IFBDSV9IRUFERVJfVFlQRV9CUklER0UpIHsKKwkJZGV2X2VycihwY2llLT5kZXYsICJpbiBFUCBtb2RlLCBoZHI9JSMwMnhcbiIsIGhkcl90eXBlKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogZm9yY2UgY2xhc3MgdG8gUENJX0NMQVNTX0JSSURHRV9QQ0kgKDB4MDYwNCkgKi8KKwlwY2lfYnVzX3dyaXRlX2NvbmZpZ193b3JkKGJ1cywgMCwgUENJX0NMQVNTX0RFVklDRSwKKwkJCQkgIFBDSV9DTEFTU19CUklER0VfUENJKTsKKworCS8qIGNoZWNrIGxpbmsgc3RhdHVzIHRvIHNlZSBpZiBsaW5rIGlzIGFjdGl2ZSAqLworCXBvcyA9IHBjaV9idXNfZmluZF9jYXBhYmlsaXR5KGJ1cywgMCwgUENJX0NBUF9JRF9FWFApOworCXBjaV9idXNfcmVhZF9jb25maWdfd29yZChidXMsIDAsIHBvcyArIFBDSV9FWFBfTE5LU1RBLCAmbGlua19zdGF0dXMpOworCWlmIChsaW5rX3N0YXR1cyAmIFBDSV9FWFBfTE5LU1RBX05MVykKKwkJbGlua19pc19hY3RpdmUgPSAxOworCisJaWYgKCFsaW5rX2lzX2FjdGl2ZSkgeworCQkvKiB0cnkgR0VOIDEgbGluayBzcGVlZCAqLworI2RlZmluZSBQQ0lfTElOS19TVEFUVVNfQ1RSTF8yX09GRlNFVCAweDBkYworI2RlZmluZSBQQ0lfVEFSR0VUX0xJTktfU1BFRURfTUFTSyAgICAweGYKKyNkZWZpbmUgUENJX1RBUkdFVF9MSU5LX1NQRUVEX0dFTjIgICAgMHgyCisjZGVmaW5lIFBDSV9UQVJHRVRfTElOS19TUEVFRF9HRU4xICAgIDB4MQorCQlwY2lfYnVzX3JlYWRfY29uZmlnX2R3b3JkKGJ1cywgMCwKKwkJCQkJICBQQ0lfTElOS19TVEFUVVNfQ1RSTF8yX09GRlNFVCwKKwkJCQkJICAmbGlua19jdHJsKTsKKwkJaWYgKChsaW5rX2N0cmwgJiBQQ0lfVEFSR0VUX0xJTktfU1BFRURfTUFTSykgPT0KKwkJICAgIFBDSV9UQVJHRVRfTElOS19TUEVFRF9HRU4yKSB7CisJCQlsaW5rX2N0cmwgJj0gflBDSV9UQVJHRVRfTElOS19TUEVFRF9NQVNLOworCQkJbGlua19jdHJsIHw9IFBDSV9UQVJHRVRfTElOS19TUEVFRF9HRU4xOworCQkJcGNpX2J1c193cml0ZV9jb25maWdfZHdvcmQoYnVzLCAwLAorCQkJCQkgICBQQ0lfTElOS19TVEFUVVNfQ1RSTF8yX09GRlNFVCwKKwkJCQkJICAgbGlua19jdHJsKTsKKwkJCW1zbGVlcCgxMDApOworCisJCQlwb3MgPSBwY2lfYnVzX2ZpbmRfY2FwYWJpbGl0eShidXMsIDAsIFBDSV9DQVBfSURfRVhQKTsKKwkJCXBjaV9idXNfcmVhZF9jb25maWdfd29yZChidXMsIDAsIHBvcyArIFBDSV9FWFBfTE5LU1RBLAorCQkJCQkJICZsaW5rX3N0YXR1cyk7CisJCQlpZiAobGlua19zdGF0dXMgJiBQQ0lfRVhQX0xOS1NUQV9OTFcpCisJCQkJbGlua19pc19hY3RpdmUgPSAxOworCQl9CisJfQorCisJZGV2X2luZm8ocGNpZS0+ZGV2LCAibGluazogJXNcbiIsIGxpbmtfaXNfYWN0aXZlID8gIlVQIiA6ICJET1dOIik7CisKKwlyZXR1cm4gbGlua19pc19hY3RpdmUgPyAwIDogLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgaXByb2NfcGNpZV9lbmFibGUoc3RydWN0IGlwcm9jX3BjaWUgKnBjaWUpCit7CisJd3JpdGVsKFNZU19SQ19JTlRYX01BU0ssIHBjaWUtPmJhc2UgKyBTWVNfUkNfSU5UWF9FTik7Cit9CisKK2ludCBpcHJvY19wY2llX3NldHVwKHN0cnVjdCBpcHJvY19wY2llICpwY2llKQoreworCWludCByZXQ7CisJc3RydWN0IHBjaV9idXMgKmJ1czsKKworCWlmICghcGNpZSB8fCAhcGNpZS0+ZGV2IHx8ICFwY2llLT5iYXNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwY2llLT5waHkpIHsKKwkJcmV0ID0gcGh5X2luaXQocGNpZS0+cGh5KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihwY2llLT5kZXYsICJ1bmFibGUgdG8gaW5pdGlhbGl6ZSBQQ0llIFBIWVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gcGh5X3Bvd2VyX29uKHBjaWUtPnBoeSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIocGNpZS0+ZGV2LCAidW5hYmxlIHRvIHBvd2VyIG9uIFBDSWUgUEhZXG4iKTsKKwkJCWdvdG8gZXJyX2V4aXRfcGh5OworCQl9CisKKwl9CisKKwlpcHJvY19wY2llX3Jlc2V0KHBjaWUpOworCisJcGNpZS0+c3lzZGF0YS5wcml2YXRlX2RhdGEgPSBwY2llOworCisJYnVzID0gcGNpX2NyZWF0ZV9yb290X2J1cyhwY2llLT5kZXYsIDAsICZpcHJvY19wY2llX29wcywKKwkJCQkgICZwY2llLT5zeXNkYXRhLCBwY2llLT5yZXNvdXJjZXMpOworCWlmICghYnVzKSB7CisJCWRldl9lcnIocGNpZS0+ZGV2LCAidW5hYmxlIHRvIGNyZWF0ZSBQQ0kgcm9vdCBidXNcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9wb3dlcl9vZmZfcGh5OworCX0KKwlwY2llLT5yb290X2J1cyA9IGJ1czsKKworCXJldCA9IGlwcm9jX3BjaWVfY2hlY2tfbGluayhwY2llLCBidXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihwY2llLT5kZXYsICJubyBQQ0llIEVQIGRldmljZSBkZXRlY3RlZFxuIik7CisJCWdvdG8gZXJyX3JtX3Jvb3RfYnVzOworCX0KKworCWlwcm9jX3BjaWVfZW5hYmxlKHBjaWUpOworCisJcGNpX3NjYW5fY2hpbGRfYnVzKGJ1cyk7CisJcGNpX2Fzc2lnbl91bmFzc2lnbmVkX2J1c19yZXNvdXJjZXMoYnVzKTsKKwlwY2lfZml4dXBfaXJxcyhwY2lfY29tbW9uX3N3aXp6bGUsIG9mX2lycV9wYXJzZV9hbmRfbWFwX3BjaSk7CisJcGNpX2J1c19hZGRfZGV2aWNlcyhidXMpOworCisJcmV0dXJuIDA7CisKK2Vycl9ybV9yb290X2J1czoKKwlwY2lfc3RvcF9yb290X2J1cyhidXMpOworCXBjaV9yZW1vdmVfcm9vdF9idXMoYnVzKTsKKworZXJyX3Bvd2VyX29mZl9waHk6CisJaWYgKHBjaWUtPnBoeSkKKwkJcGh5X3Bvd2VyX29mZihwY2llLT5waHkpOworZXJyX2V4aXRfcGh5OgorCWlmIChwY2llLT5waHkpCisJCXBoeV9leGl0KHBjaWUtPnBoeSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpcHJvY19wY2llX3NldHVwKTsKKworaW50IGlwcm9jX3BjaWVfcmVtb3ZlKHN0cnVjdCBpcHJvY19wY2llICpwY2llKQoreworCXBjaV9zdG9wX3Jvb3RfYnVzKHBjaWUtPnJvb3RfYnVzKTsKKwlwY2lfcmVtb3ZlX3Jvb3RfYnVzKHBjaWUtPnJvb3RfYnVzKTsKKworCWlmIChwY2llLT5waHkpIHsKKwkJcGh5X3Bvd2VyX29mZihwY2llLT5waHkpOworCQlwaHlfZXhpdChwY2llLT5waHkpOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpcHJvY19wY2llX3JlbW92ZSk7CisKK01PRFVMRV9BVVRIT1IoIlJheSBKdWkgPHJqdWlAYnJvYWRjb20uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSBpUFJPQyBQQ0llIGNvbW1vbiBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1pcHJvYy5oIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLWlwcm9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI4MDc1ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1pcHJvYy5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX1BDSUVfSVBST0NfSAorI2RlZmluZSBfUENJRV9JUFJPQ19ICisKKyNkZWZpbmUgSVBST0NfUENJRV9NQVhfTlVNX0lSUVMgNgorCisvKioKKyAqIGlQcm9jIFBDSWUgZGV2aWNlCisgKiBAZGV2OiBwb2ludGVyIHRvIGRldmljZSBkYXRhIHN0cnVjdHVyZQorICogQGJhc2U6IFBDSWUgaG9zdCBjb250cm9sbGVyIEkvTyByZWdpc3RlciBiYXNlCisgKiBAcmVzb3VyY2VzOiBsaW5rZWQgbGlzdCBvZiBhbGwgUENJIHJlc291cmNlcworICogQHN5c2RhdGE6IFBlciBQQ0kgY29udHJvbGxlciBkYXRhCisgKiBAcm9vdF9idXM6IHBvaW50ZXIgdG8gcm9vdCBidXMKKyAqIEBwaHk6IG9wdGlvbmFsIFBIWSBkZXZpY2UgdGhhdCBjb250cm9scyB0aGUgU2VyZGVzCisgKiBAaXJxczogaW50ZXJydXB0IElEcworICovCitzdHJ1Y3QgaXByb2NfcGNpZSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpyZXNvdXJjZXM7CisJc3RydWN0IHBjaV9zeXNfZGF0YSBzeXNkYXRhOworCXN0cnVjdCBwY2lfYnVzICpyb290X2J1czsKKwlzdHJ1Y3QgcGh5ICpwaHk7CisJaW50IGlycXNbSVBST0NfUENJRV9NQVhfTlVNX0lSUVNdOworfTsKKworaW50IGlwcm9jX3BjaWVfc2V0dXAoc3RydWN0IGlwcm9jX3BjaWUgKnBjaWUpOworaW50IGlwcm9jX3BjaWVfcmVtb3ZlKHN0cnVjdCBpcHJvY19wY2llICpwY2llKTsKKworI2VuZGlmIC8qIF9QQ0lFX0lQUk9DX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1yY2FyLmMgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtcmNhci5jCmluZGV4IGM1N2JkMGEuLmMwODYyMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1yY2FyLmMKKysrIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLXJjYXIuYwpAQCAtNjQsOCArNjQsOCBAQAogI2RlZmluZSAgTEFSX0VOQUJMRQkJKDEgPDwgMSkKIAogLyogUENJZSBhZGRyZXNzIHJlZyAmIG1hc2sgKi8KLSNkZWZpbmUgUENJRVBBUkwoeCkJCSgweDAzNDAwICsgKCh4KSAqIDB4MjApKQotI2RlZmluZSBQQ0lFUEFSSCh4KQkJKDB4MDM0MDQgKyAoKHgpICogMHgyMCkpCisjZGVmaW5lIFBDSUVQQUxSKHgpCQkoMHgwMzQwMCArICgoeCkgKiAweDIwKSkKKyNkZWZpbmUgUENJRVBBVVIoeCkJCSgweDAzNDA0ICsgKCh4KSAqIDB4MjApKQogI2RlZmluZSBQQ0lFUEFNUih4KQkJKDB4MDM0MDggKyAoKHgpICogMHgyMCkpCiAjZGVmaW5lIFBDSUVQVENUTFIoeCkJCSgweDAzNDBjICsgKCh4KSAqIDB4MjApKQogI2RlZmluZSAgUEFSX0VOQUJMRQkJKDEgPDwgMzEpCkBAIC0zNDEsOCArMzQxLDkgQEAKIAllbHNlCiAJCXJlc19zdGFydCA9IHJlcy0+c3RhcnQ7CiAKLQlyY2FyX3BjaV93cml0ZV9yZWcocGNpZSwgdXBwZXJfMzJfYml0cyhyZXNfc3RhcnQpLCBQQ0lFUEFSSCh3aW4pKTsKLQlyY2FyX3BjaV93cml0ZV9yZWcocGNpZSwgbG93ZXJfMzJfYml0cyhyZXNfc3RhcnQpLCBQQ0lFUEFSTCh3aW4pKTsKKwlyY2FyX3BjaV93cml0ZV9yZWcocGNpZSwgdXBwZXJfMzJfYml0cyhyZXNfc3RhcnQpLCBQQ0lFUEFVUih3aW4pKTsKKwlyY2FyX3BjaV93cml0ZV9yZWcocGNpZSwgbG93ZXJfMzJfYml0cyhyZXNfc3RhcnQpICYgfjB4N0YsCisJCQkgICBQQ0lFUEFMUih3aW4pKTsKIAogCS8qIEZpcnN0IHJlc291cmNlIGlzIGZvciBJTyAqLwogCW1hc2sgPSBQQVJfRU5BQkxFOwpAQCAtNTAxLDcgKzUwMiw3IEBACiAKIAkvKiBFbmFibGUgTVNJICovCiAJaWYgKElTX0VOQUJMRUQoQ09ORklHX1BDSV9NU0kpKQotCQlyY2FyX3BjaV93cml0ZV9yZWcocGNpZSwgMHgxMDFmMDAwMCwgUENJRU1TSVRYUik7CisJCXJjYXJfcGNpX3dyaXRlX3JlZyhwY2llLCAweDgwMWYwMDAwLCBQQ0lFTVNJVFhSKTsKIAogCS8qIEZpbmlzaCBpbml0aWFsaXphdGlvbiAtIGVzdGFibGlzaCBhIFBDSSBFeHByZXNzIGxpbmsgKi8KIAlyY2FyX3BjaV93cml0ZV9yZWcocGNpZSwgQ0ZJTklULCBQQ0lFVENUTFIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG9zdC9wY2llLXNwZWFyMTN4eC5jIGIvZHJpdmVycy9wY2kvaG9zdC9wY2llLXNwZWFyMTN4eC5jCmluZGV4IDg2NjQ2NWYuLjAyMGQ3ODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvc3QvcGNpZS1zcGVhcjEzeHguYworKysgYi9kcml2ZXJzL3BjaS9ob3N0L3BjaWUtc3BlYXIxM3h4LmMKQEAgLTI2OSw3ICsyNjksNyBAQAogCS5ob3N0X2luaXQgPSBzcGVhcjEzeHhfcGNpZV9ob3N0X2luaXQsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBzcGVhcjEzeHhfYWRkX3BjaWVfcG9ydChzdHJ1Y3QgcGNpZV9wb3J0ICpwcCwKK3N0YXRpYyBpbnQgc3BlYXIxM3h4X2FkZF9wY2llX3BvcnQoc3RydWN0IHBjaWVfcG9ydCAqcHAsCiAJCQkJCSBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CkBAIC0yOTksNyArMjk5LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgc3BlYXIxM3h4X3BjaWVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgc3BlYXIxM3h4X3BjaWVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc3BlYXIxM3h4X3BjaWUgKnNwZWFyMTN4eF9wY2llOwogCXN0cnVjdCBwY2llX3BvcnQgKnBwOwpAQCAtMzcwLDcgKzM3MCw3IEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3BlYXIxM3h4X3BjaWVfb2ZfbWF0Y2gpOwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcGVhcjEzeHhfcGNpZV9kcml2ZXIgX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNwZWFyMTN4eF9wY2llX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gc3BlYXIxM3h4X3BjaWVfcHJvYmUsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUJPSAic3BlYXItcGNpZSIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwY2lfaG90cGx1Z19wY2kuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX3BjaS5jCmluZGV4IDdkNDhlY2EuLjc4OGRiNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BjaV9ob3RwbHVnX3BjaS5jCkBAIC0yODYsMTEgKzI4NiwxMiBAQAogCX0KIAlwYXJlbnQgPSBzbG90LT5kZXYtPmJ1czsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcGFyZW50LT5kZXZpY2VzLCBidXNfbGlzdCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnBhcmVudC0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKIAkJaWYgKFBDSV9TTE9UKGRldi0+ZGV2Zm4pICE9IFBDSV9TTE9UKHNsb3QtPmRldmZuKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAocGNpX2lzX2JyaWRnZShkZXYpKQogCQkJcGNpX2hwX2FkZF9icmlkZ2UoZGV2KTsKKwl9CiAKIAogCXBjaV9hc3NpZ25fdW5hc3NpZ25lZF9icmlkZ2VfcmVzb3VyY2VzKHBhcmVudC0+c2VsZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9jb3JlLmMgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9jb3JlLmMKaW5kZXggOTZjNWM3Mi4uMTUzMDI0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfY29yZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2NvcmUuYwpAQCAtNzM4LDcgKzczOCw3IEBACiAgKi8KIHN0YXRpYyB1OCBidXNfc3RydWN0dXJlX2ZpeHVwKHU4IGJ1c25vKQogewotCXN0cnVjdCBwY2lfYnVzICpidXM7CisJc3RydWN0IHBjaV9idXMgKmJ1cywgKmI7CiAJc3RydWN0IHBjaV9kZXYgKmRldjsKIAl1MTYgbDsKIApAQCAtNzY1LDcgKzc2NSwxMSBAQAogCQkJCQkobCAhPSAweDAwMDApICYmIChsICE9IDB4ZmZmZikpIHsKIAkJCWRlYnVnKCIlcyAtIEluc2lkZSBidXNfc3RydWN0dXJlX2ZpeHVwKClcbiIsCiAJCQkJCQkJX19mdW5jX18pOwotCQkJcGNpX3NjYW5fYnVzKGJ1c25vLCBpYm1waHBfcGNpX2J1cy0+b3BzLCBOVUxMKTsKKwkJCWIgPSBwY2lfc2Nhbl9idXMoYnVzbm8sIGlibXBocF9wY2lfYnVzLT5vcHMsIE5VTEwpOworCQkJaWYgKCFiKQorCQkJCWNvbnRpbnVlOworCisJCQlwY2lfYnVzX2FkZF9kZXZpY2VzKGIpOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jIGIvZHJpdmVycy9wY2kvcGNpLWFjcGkuYwppbmRleCA0ODkwNjM5Li42ZjZmMTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2ktYWNwaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS1hY3BpLmMKQEAgLTE4LDYgKzE4LDE1IEBACiAjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+CiAjaW5jbHVkZSAicGNpLmgiCiAKKy8qCisgKiBUaGUgVVVJRCBpcyBkZWZpbmVkIGluIHRoZSBQQ0kgRmlybXdhcmUgU3BlY2lmaWNhdGlvbiBhdmFpbGFibGUgaGVyZToKKyAqIGh0dHBzOi8vd3d3LnBjaXNpZy5jb20vbWVtYmVycy9kb3dubG9hZHMvcGNpZndfcjNfMV8xM0RlYzEwLnBkZgorICovCitjb25zdCB1OCBwY2lfYWNwaV9kc21fdXVpZFtdID0geworCTB4ZDAsIDB4MzcsIDB4YzksIDB4ZTUsIDB4NTMsIDB4MzUsIDB4N2EsIDB4NGQsCisJMHg5MSwgMHgxNywgMHhlYSwgMHg0ZCwgMHgxOSwgMHhjMywgMHg0MywgMHg0ZAorfTsKKwogcGh5c19hZGRyX3QgYWNwaV9wY2lfcm9vdF9nZXRfbWNmZ19hZGRyKGFjcGlfaGFuZGxlIGhhbmRsZSkKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9OT1RfRVhJU1Q7CkBAIC0yNDgsNiArMjU3LDkgQEAKIAlhY3BpX2hhbmRsZSBoYW5kbGUsIHBoYW5kbGU7CiAJc3RydWN0IHBjaV9idXMgKnBidXM7CiAKKwlpZiAoYWNwaV9wY2lfZGlzYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCiAJaGFuZGxlID0gTlVMTDsKIAlmb3IgKHBidXMgPSBkZXYtPmJ1czsgcGJ1czsgcGJ1cyA9IHBidXMtPnBhcmVudCkgewogCQloYW5kbGUgPSBhY3BpX3BjaV9nZXRfYnJpZGdlX2hhbmRsZShwYnVzKTsKQEAgLTUyOCwxMSArNTQwLDMyIEBACiAKIHZvaWQgYWNwaV9wY2lfYWRkX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogeworCXVuaW9uIGFjcGlfb2JqZWN0ICpvYmo7CisJc3RydWN0IHBjaV9ob3N0X2JyaWRnZSAqYnJpZGdlOworCiAJaWYgKGFjcGlfcGNpX2Rpc2FibGVkIHx8ICFidXMtPmJyaWRnZSkKIAkJcmV0dXJuOwogCiAJYWNwaV9wY2lfc2xvdF9lbnVtZXJhdGUoYnVzKTsKIAlhY3BpcGhwX2VudW1lcmF0ZV9zbG90cyhidXMpOworCisJLyoKKwkgKiBGb3IgYSBob3N0IGJyaWRnZSwgY2hlY2sgaXRzIF9EU00gZm9yIGZ1bmN0aW9uIDggYW5kIGlmCisJICogdGhhdCBpcyBhdmFpbGFibGUsIG1hcmsgaXQgaW4gcGNpX2hvc3RfYnJpZGdlLgorCSAqLworCWlmICghcGNpX2lzX3Jvb3RfYnVzKGJ1cykpCisJCXJldHVybjsKKworCW9iaiA9IGFjcGlfZXZhbHVhdGVfZHNtKEFDUElfSEFORExFKGJ1cy0+YnJpZGdlKSwgcGNpX2FjcGlfZHNtX3V1aWQsIDMsCisJCQkJUkVTRVRfREVMQVlfRFNNLCBOVUxMKTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuOworCisJaWYgKG9iai0+dHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUiAmJiBvYmotPmludGVnZXIudmFsdWUgPT0gMSkgeworCQlicmlkZ2UgPSBwY2lfZmluZF9ob3N0X2JyaWRnZShidXMpOworCQlicmlkZ2UtPmlnbm9yZV9yZXNldF9kZWxheSA9IDE7CisJfQorCUFDUElfRlJFRShvYmopOwogfQogCiB2b2lkIGFjcGlfcGNpX3JlbW92ZV9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKQEAgLTU1OCw2ICs1OTEsNTcgQEAKIAkJCQkgICAgICBjaGVja19jaGlsZHJlbik7CiB9CiAKKy8qKgorICogcGNpX2FjcGlfb3B0aW1pemVfZGVsYXkgLSBvcHRpbWl6ZSBQQ0kgRDMgYW5kIEQzY29sZCBkZWxheSBmcm9tIEFDUEkKKyAqIEBwZGV2OiB0aGUgUENJIGRldmljZSB3aG9zZSBkZWxheSBpcyB0byBiZSB1cGRhdGVkCisgKiBAYWRldjogdGhlIGNvbXBhbmlvbiBBQ1BJIGRldmljZSBvZiB0aGlzIFBDSSBkZXZpY2UKKyAqCisgKiBVcGRhdGUgdGhlIGQzX2RlbGF5IGFuZCBkM2NvbGRfZGVsYXkgb2YgYSBQQ0kgZGV2aWNlIGZyb20gdGhlIEFDUEkgX0RTTQorICogY29udHJvbCBtZXRob2Qgb2YgZWl0aGVyIHRoZSBkZXZpY2UgaXRzZWxmIG9yIHRoZSBQQ0kgaG9zdCBicmlkZ2UuCisgKgorICogRnVuY3Rpb24gOCwgIlJlc2V0IERlbGF5LCIgYXBwbGllcyB0byB0aGUgZW50aXJlIGhpZXJhcmNoeSBiZWxvdyBhIFBDSQorICogaG9zdCBicmlkZ2UuICBJZiBpdCByZXR1cm5zIG9uZSwgdGhlIE9TIG1heSBhc3N1bWUgdGhhdCBhbGwgZGV2aWNlcyBpbgorICogdGhlIGhpZXJhcmNoeSBoYXZlIGFscmVhZHkgY29tcGxldGVkIHBvd2VyLW9uIHJlc2V0IGRlbGF5cy4KKyAqCisgKiBGdW5jdGlvbiA5LCAiRGV2aWNlIFJlYWRpbmVzcyBEdXJhdGlvbnMsIiBhcHBsaWVzIG9ubHkgdG8gdGhlIG9iamVjdAorICogd2hlcmUgaXQgaXMgbG9jYXRlZC4gIEl0IHJldHVybnMgZGVsYXkgZHVyYXRpb25zIHJlcXVpcmVkIGFmdGVyIHZhcmlvdXMKKyAqIGV2ZW50cyBpZiB0aGUgZGV2aWNlIHJlcXVpcmVzIGxlc3MgdGltZSB0aGFuIHRoZSBzcGVjIHJlcXVpcmVzLiAgRGVsYXlzCisgKiBmcm9tIHRoaXMgZnVuY3Rpb24gdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhlIFJlc2V0IERlbGF5IGZ1bmN0aW9uLgorICoKKyAqIFRoZXNlIF9EU00gZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGJ5IHRoZSBkcmFmdCBFQ04gb2YgSmFudWFyeSAyOCwgMjAxNCwKKyAqIHRpdGxlZCAiQUNQSSBhZGRpdGlvbnMgZm9yIEZXIGxhdGVuY3kgb3B0aW1pemF0aW9ucy4iCisgKi8KK3N0YXRpYyB2b2lkIHBjaV9hY3BpX29wdGltaXplX2RlbGF5KHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICBhY3BpX2hhbmRsZSBoYW5kbGUpCit7CisJc3RydWN0IHBjaV9ob3N0X2JyaWRnZSAqYnJpZGdlID0gcGNpX2ZpbmRfaG9zdF9icmlkZ2UocGRldi0+YnVzKTsKKwlpbnQgdmFsdWU7CisJdW5pb24gYWNwaV9vYmplY3QgKm9iaiwgKmVsZW1lbnRzOworCisJaWYgKGJyaWRnZS0+aWdub3JlX3Jlc2V0X2RlbGF5KQorCQlwZGV2LT5kM2NvbGRfZGVsYXkgPSAwOworCisJb2JqID0gYWNwaV9ldmFsdWF0ZV9kc20oaGFuZGxlLCBwY2lfYWNwaV9kc21fdXVpZCwgMywKKwkJCQlGVU5DVElPTl9ERUxBWV9EU00sIE5VTEwpOworCWlmICghb2JqKQorCQlyZXR1cm47CisKKwlpZiAob2JqLT50eXBlID09IEFDUElfVFlQRV9QQUNLQUdFICYmIG9iai0+cGFja2FnZS5jb3VudCA9PSA1KSB7CisJCWVsZW1lbnRzID0gb2JqLT5wYWNrYWdlLmVsZW1lbnRzOworCQlpZiAoZWxlbWVudHNbMF0udHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikgeworCQkJdmFsdWUgPSAoaW50KWVsZW1lbnRzWzBdLmludGVnZXIudmFsdWUgLyAxMDAwOworCQkJaWYgKHZhbHVlIDwgUENJX1BNX0QzQ09MRF9XQUlUKQorCQkJCXBkZXYtPmQzY29sZF9kZWxheSA9IHZhbHVlOworCQl9CisJCWlmIChlbGVtZW50c1szXS50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKSB7CisJCQl2YWx1ZSA9IChpbnQpZWxlbWVudHNbM10uaW50ZWdlci52YWx1ZSAvIDEwMDA7CisJCQlpZiAodmFsdWUgPCBQQ0lfUE1fRDNfV0FJVCkKKwkJCQlwZGV2LT5kM19kZWxheSA9IHZhbHVlOworCQl9CisJfQorCUFDUElfRlJFRShvYmopOworfQorCiBzdGF0aWMgdm9pZCBwY2lfYWNwaV9zZXR1cChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSB0b19wY2lfZGV2KGRldik7CkBAIC01NjYsNiArNjUwLDggQEAKIAlpZiAoIWFkZXYpCiAJCXJldHVybjsKIAorCXBjaV9hY3BpX29wdGltaXplX2RlbGF5KHBjaV9kZXYsIGFkZXYtPmhhbmRsZSk7CisKIAlwY2lfYWNwaV9hZGRfcG1fbm90aWZpZXIoYWRldiwgcGNpX2Rldik7CiAJaWYgKCFhZGV2LT53YWtldXAuZmxhZ3MudmFsaWQpCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS1sYWJlbC5jIGIvZHJpdmVycy9wY2kvcGNpLWxhYmVsLmMKaW5kZXggMmFiMWI0Ny4uMDI0YjVjMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpLWxhYmVsLmMKKysrIGIvZHJpdmVycy9wY2kvcGNpLWxhYmVsLmMKQEAgLTMxLDggKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9wY2ktYWNwaS5oPgogI2luY2x1ZGUgInBjaS5oIgogCi0jZGVmaW5lCURFVklDRV9MQUJFTF9EU00JMHgwNwotCiAjaWZkZWYgQ09ORklHX0RNSQogZW51bSBzbWJpb3NfYXR0cl9lbnVtIHsKIAlTTUJJT1NfQVRUUl9OT05FID0gMCwKQEAgLTE0OCwxMSArMTQ2LDYgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FDUEkKLXN0YXRpYyBjb25zdCBjaGFyIGRldmljZV9sYWJlbF9kc21fdXVpZFtdID0gewotCTB4RDAsIDB4MzcsIDB4QzksIDB4RTUsIDB4NTMsIDB4MzUsIDB4N0EsIDB4NEQsCi0JMHg5MSwgMHgxNywgMHhFQSwgMHg0RCwgMHgxOSwgMHhDMywgMHg0MywgMHg0RAotfTsKLQogZW51bSBhY3BpX2F0dHJfZW51bSB7CiAJQUNQSV9BVFRSX0xBQkVMX1NIT1csCiAJQUNQSV9BVFRSX0lOREVYX1NIT1csCkBAIC0xNzksNyArMTcyLDcgQEAKIAlpZiAoIWhhbmRsZSkKIAkJcmV0dXJuIC0xOwogCi0Jb2JqID0gYWNwaV9ldmFsdWF0ZV9kc20oaGFuZGxlLCBkZXZpY2VfbGFiZWxfZHNtX3V1aWQsIDB4MiwKKwlvYmogPSBhY3BpX2V2YWx1YXRlX2RzbShoYW5kbGUsIHBjaV9hY3BpX2RzbV91dWlkLCAweDIsCiAJCQkJREVWSUNFX0xBQkVMX0RTTSwgTlVMTCk7CiAJaWYgKCFvYmopCiAJCXJldHVybiAtMTsKQEAgLTIxOSw3ICsyMTIsNyBAQAogCWlmICghaGFuZGxlKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlyZXR1cm4gISFhY3BpX2NoZWNrX2RzbShoYW5kbGUsIGRldmljZV9sYWJlbF9kc21fdXVpZCwgMHgyLAorCXJldHVybiAhIWFjcGlfY2hlY2tfZHNtKGhhbmRsZSwgcGNpX2FjcGlfZHNtX3V1aWQsIDB4MiwKIAkJCQkxIDw8IERFVklDRV9MQUJFTF9EU00pOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2kuYyBiL2RyaXZlcnMvcGNpL3BjaS5jCmluZGV4IDgxZjA2ZTguLmFjYzRiNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5jCkBAIC0xMjYsMTUgKzEyNiwxNiBAQAogI2lmZGVmIENPTkZJR19IQVNfSU9NRU0KIHZvaWQgX19pb21lbSAqcGNpX2lvcmVtYXBfYmFyKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyKQogeworCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gJnBkZXYtPnJlc291cmNlW2Jhcl07CisKIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGUgQkFSIGlzIGFjdHVhbGx5IGEgbWVtb3J5IHJlc291cmNlLCBub3QgYW4gSU8gcmVzb3VyY2UKIAkgKi8KLQlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGRldiwgYmFyKSAmIElPUkVTT1VSQ0VfTUVNKSkgewotCQlXQVJOX09OKDEpOworCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCB8fCAhKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkpIHsKKwkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImNhbid0IGlvcmVtYXAgQkFSICVkOiAlcFJcbiIsIGJhciwgcmVzKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCXJldHVybiBpb3JlbWFwX25vY2FjaGUocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGJhciksCi0JCQkJICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIGJhcikpOworCXJldHVybiBpb3JlbWFwX25vY2FjaGUocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBjaV9pb3JlbWFwX2Jhcik7CiAjZW5kaWYKQEAgLTE0NSwxOSArMTQ2LDIyIEBACiAJCQkJICAgdTggcG9zLCBpbnQgY2FwLCBpbnQgKnR0bCkKIHsKIAl1OCBpZDsKKwl1MTYgZW50OworCisJcGNpX2J1c19yZWFkX2NvbmZpZ19ieXRlKGJ1cywgZGV2Zm4sIHBvcywgJnBvcyk7CiAKIAl3aGlsZSAoKCp0dGwpLS0pIHsKLQkJcGNpX2J1c19yZWFkX2NvbmZpZ19ieXRlKGJ1cywgZGV2Zm4sIHBvcywgJnBvcyk7CiAJCWlmIChwb3MgPCAweDQwKQogCQkJYnJlYWs7CiAJCXBvcyAmPSB+MzsKLQkJcGNpX2J1c19yZWFkX2NvbmZpZ19ieXRlKGJ1cywgZGV2Zm4sIHBvcyArIFBDSV9DQVBfTElTVF9JRCwKLQkJCQkJICZpZCk7CisJCXBjaV9idXNfcmVhZF9jb25maWdfd29yZChidXMsIGRldmZuLCBwb3MsICZlbnQpOworCisJCWlkID0gZW50ICYgMHhmZjsKIAkJaWYgKGlkID09IDB4ZmYpCiAJCQlicmVhazsKIAkJaWYgKGlkID09IGNhcCkKIAkJCXJldHVybiBwb3M7Ci0JCXBvcyArPSBQQ0lfQ0FQX0xJU1RfTkVYVDsKKwkJcG9zID0gKGVudCA+PiA4KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDkyLDYgKzI0OTYsNyBAQAogCSpwaW5wID0gcGluOwogCXJldHVybiBQQ0lfU0xPVChkZXYtPmRldmZuKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9jb21tb25fc3dpenpsZSk7CiAKIC8qKgogICoJcGNpX3JlbGVhc2VfcmVnaW9uIC0gUmVsZWFzZSBhIFBDSSBiYXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaS5oIGIvZHJpdmVycy9wY2kvcGNpLmgKaW5kZXggYmFlNTkzYy4uOWJkNzYyYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaS5oCisrKyBiL2RyaXZlcnMvcGNpL3BjaS5oCkBAIC0zMjMsNCArMzIzLDYgQEAKIH0KICNlbmRpZgogCitzdHJ1Y3QgcGNpX2hvc3RfYnJpZGdlICpwY2lfZmluZF9ob3N0X2JyaWRnZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKTsKKwogI2VuZGlmIC8qIERSSVZFUlNfUENJX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9lcnJwcmludC5jIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMKaW5kZXggYzY4NDlkOS4uMTY3ZmU0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMKQEAgLTEzMiwxNiArMTMyLDggQEAKIHN0YXRpYyB2b2lkIF9fcHJpbnRfdGxwX2hlYWRlcihzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBhZXJfaGVhZGVyX2xvZ19yZWdzICp0KQogewotCXVuc2lnbmVkIGNoYXIgKnRscCA9ICh1bnNpZ25lZCBjaGFyICopJnQ7Ci0KLQlkZXZfZXJyKCZkZXYtPmRldiwgIiAgVExQIEhlYWRlcjoiCi0JCSIgJTAyeCUwMnglMDJ4JTAyeCAlMDJ4JTAyeCUwMnglMDJ4IgotCQkiICUwMnglMDJ4JTAyeCUwMnggJTAyeCUwMnglMDJ4JTAyeFxuIiwKLQkJKih0bHAgKyAzKSwgKih0bHAgKyAyKSwgKih0bHAgKyAxKSwgKnRscCwKLQkJKih0bHAgKyA3KSwgKih0bHAgKyA2KSwgKih0bHAgKyA1KSwgKih0bHAgKyA0KSwKLQkJKih0bHAgKyAxMSksICoodGxwICsgMTApLCAqKHRscCArIDkpLAotCQkqKHRscCArIDgpLCAqKHRscCArIDE1KSwgKih0bHAgKyAxNCksCi0JCSoodGxwICsgMTMpLCAqKHRscCArIDEyKSk7CisJZGV2X2VycigmZGV2LT5kZXYsICIgIFRMUCBIZWFkZXI6ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCisJCXQtPmR3MCwgdC0+ZHcxLCB0LT5kdzIsIHQtPmR3Myk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fYWVyX3ByaW50X2Vycm9yKHN0cnVjdCBwY2lfZGV2ICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wY2llL2FzcG0uYyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCmluZGV4IDgyMDc0MGEuLjdkNGZjZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCisrKyBiL2RyaXZlcnMvcGNpL3BjaWUvYXNwbS5jCkBAIC03ODIsMjQgKzc4Miw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHBjaV9kaXNhYmxlX2xpbmtfc3RhdGUpOwogCi12b2lkIHBjaWVfY2xlYXJfYXNwbShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotCXN0cnVjdCBwY2lfZGV2ICpjaGlsZDsKLQotCWlmIChhc3BtX2ZvcmNlKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIENsZWFyIGFueSBBU1BNIHNldHVwIHRoYXQgdGhlIGZpcm13YXJlIGhhcyBjYXJyaWVkIG91dCBvbiB0aGlzIGJ1cwotCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7Ci0JCV9fcGNpX2Rpc2FibGVfbGlua19zdGF0ZShjaGlsZCwgUENJRV9MSU5LX1NUQVRFX0wwUyB8Ci0JCQkJCSBQQ0lFX0xJTktfU1RBVEVfTDEgfAotCQkJCQkgUENJRV9MSU5LX1NUQVRFX0NMS1BNLAotCQkJCQkgZmFsc2UsIHRydWUpOwotCX0KLX0KLQogc3RhdGljIGludCBwY2llX2FzcG1fc2V0X3BvbGljeShjb25zdCBjaGFyICp2YWwsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQogewogCWludCBpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcHJvYmUuYyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKaW5kZXggOGQyZjQwMC4uNjY3NWE3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcHJvYmUuYworKysgYi9kcml2ZXJzL3BjaS9wcm9iZS5jCkBAIC02LDYgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaV9ob3RwbHVnLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMTUyMCw2ICsxNTIxLDcgQEAKIAlkZXYtPmRldi5kbWFfbWFzayA9ICZkZXYtPmRtYV9tYXNrOwogCWRldi0+ZGV2LmRtYV9wYXJtcyA9ICZkZXYtPmRtYV9wYXJtczsKIAlkZXYtPmRldi5jb2hlcmVudF9kbWFfbWFzayA9IDB4ZmZmZmZmZmZ1bGw7CisJb2ZfcGNpX2RtYV9jb25maWd1cmUoZGV2KTsKIAogCXBjaV9zZXRfZG1hX21heF9zZWdfc2l6ZShkZXYsIDY1NTM2KTsKIAlwY2lfc2V0X2RtYV9zZWdfYm91bmRhcnkoZGV2LCAweGZmZmZmZmZmKTsKQEAgLTE5OTMsNiArMTk5NSw3IEBACiAJa2ZyZWUoYik7CiAJcmV0dXJuIE5VTEw7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfY3JlYXRlX3Jvb3RfYnVzKTsKIAogaW50IHBjaV9idXNfaW5zZXJ0X2J1c25fcmVzKHN0cnVjdCBwY2lfYnVzICpiLCBpbnQgYnVzLCBpbnQgYnVzX21heCkKIHsKQEAgLTIwODcsNyArMjA5MCw2IEBACiAJaWYgKCFmb3VuZCkKIAkJcGNpX2J1c191cGRhdGVfYnVzbl9yZXNfZW5kKGIsIG1heCk7CiAKLQlwY2lfYnVzX2FkZF9kZXZpY2VzKGIpOwogCXJldHVybiBiOwogfQogRVhQT1JUX1NZTUJPTChwY2lfc2Nhbl9yb290X2J1cyk7CkBAIC0yMTIzLDcgKzIxMjUsNiBAQAogCWIgPSBwY2lfY3JlYXRlX3Jvb3RfYnVzKE5VTEwsIGJ1cywgb3BzLCBzeXNkYXRhLCAmcmVzb3VyY2VzKTsKIAlpZiAoYikgewogCQlwY2lfc2Nhbl9jaGlsZF9idXMoYik7Ci0JCXBjaV9idXNfYWRkX2RldmljZXMoYik7CiAJfSBlbHNlIHsKIAkJcGNpX2ZyZWVfcmVzb3VyY2VfbGlzdCgmcmVzb3VyY2VzKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9xdWlya3MuYyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCmluZGV4IDg1ZjI0N2UuLmM2ZGMxZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1aXJrcy5jCkBAIC0zMTgyLDcgKzMxODIsNyBAQAogCQkJfHwgbmhpLT5zdWJzeXN0ZW1fdmVuZG9yICE9IDB4MjIyMgogCQkJfHwgbmhpLT5zdWJzeXN0ZW1fZGV2aWNlICE9IDB4MTExMSkKIAkJZ290byBvdXQ7Ci0JZGV2X2luZm8oJmRldi0+ZGV2LCAicXVpcms6IHdhdGluZyBmb3IgdGh1bmRlcmJvbHQgdG8gcmVlc3RhYmxpc2ggcGNpIHR1bm5lbHMuLi5cbiIpOworCWRldl9pbmZvKCZkZXYtPmRldiwgInF1aXJrOiB3YWl0aW5nIGZvciB0aHVuZGVyYm9sdCB0byByZWVzdGFibGlzaCBQQ0kgdHVubmVscy4uLlxuIik7CiAJZGV2aWNlX3BtX3dhaXRfZm9yX2RldigmZGV2LT5kZXYsICZuaGktPmRldik7CiBvdXQ6CiAJcGNpX2Rldl9wdXQobmhpKTsKQEAgLTM4MjIsNiArMzgyMiwzOCBAQAogCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxNTRGLCBwY2lfcXVpcmtfbWZfZW5kcG9pbnRfYWNzIH0sCiAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDE1NTEsIHBjaV9xdWlya19tZl9lbmRwb2ludF9hY3MgfSwKIAl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTU1OCwgcGNpX3F1aXJrX21mX2VuZHBvaW50X2FjcyB9LAorCS8qIDgyNTgwICovCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDE1MDksIHBjaV9xdWlya19tZl9lbmRwb2ludF9hY3MgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTUwRSwgcGNpX3F1aXJrX21mX2VuZHBvaW50X2FjcyB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxNTBGLCBwY2lfcXVpcmtfbWZfZW5kcG9pbnRfYWNzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDE1MTAsIHBjaV9xdWlya19tZl9lbmRwb2ludF9hY3MgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTUxMSwgcGNpX3F1aXJrX21mX2VuZHBvaW50X2FjcyB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxNTE2LCBwY2lfcXVpcmtfbWZfZW5kcG9pbnRfYWNzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDE1MjcsIHBjaV9xdWlya19tZl9lbmRwb2ludF9hY3MgfSwKKwkvKiA4MjU3NiAqLworCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMEM5LCBwY2lfcXVpcmtfbWZfZW5kcG9pbnRfYWNzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwRTYsIHBjaV9xdWlya19tZl9lbmRwb2ludF9hY3MgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTBFNywgcGNpX3F1aXJrX21mX2VuZHBvaW50X2FjcyB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMEU4LCBwY2lfcXVpcmtfbWZfZW5kcG9pbnRfYWNzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDE1MEEsIHBjaV9xdWlya19tZl9lbmRwb2ludF9hY3MgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTUwRCwgcGNpX3F1aXJrX21mX2VuZHBvaW50X2FjcyB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxNTE4LCBwY2lfcXVpcmtfbWZfZW5kcG9pbnRfYWNzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDE1MjYsIHBjaV9xdWlya19tZl9lbmRwb2ludF9hY3MgfSwKKwkvKiA4MjU3NSAqLworCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMEE3LCBwY2lfcXVpcmtfbWZfZW5kcG9pbnRfYWNzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwQTksIHBjaV9xdWlya19tZl9lbmRwb2ludF9hY3MgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTBENiwgcGNpX3F1aXJrX21mX2VuZHBvaW50X2FjcyB9LAorCS8qIEkzNTAgKi8KKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTUyMSwgcGNpX3F1aXJrX21mX2VuZHBvaW50X2FjcyB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxNTIyLCBwY2lfcXVpcmtfbWZfZW5kcG9pbnRfYWNzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDE1MjMsIHBjaV9xdWlya19tZl9lbmRwb2ludF9hY3MgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTUyNCwgcGNpX3F1aXJrX21mX2VuZHBvaW50X2FjcyB9LAorCS8qIDgyNTcxIChRdWFkcyBvbWl0dGVkIGR1ZSB0byBub24tQUNTIHN3aXRjaCkgKi8KKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTA1RSwgcGNpX3F1aXJrX21mX2VuZHBvaW50X2FjcyB9LAorCXsgUENJX1ZFTkRPUl9JRF9JTlRFTCwgMHgxMDVGLCBwY2lfcXVpcmtfbWZfZW5kcG9pbnRfYWNzIH0sCisJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCAweDEwNjAsIHBjaV9xdWlya19tZl9lbmRwb2ludF9hY3MgfSwKKwl7IFBDSV9WRU5ET1JfSURfSU5URUwsIDB4MTBEOSwgcGNpX3F1aXJrX21mX2VuZHBvaW50X2FjcyB9LAorCS8qIEludGVsIFBDSCByb290IHBvcnRzICovCiAJeyBQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfQU5ZX0lELCBwY2lfcXVpcmtfaW50ZWxfcGNoX2FjcyB9LAogCXsgMHgxOWEyLCAweDcxMCwgcGNpX3F1aXJrX21mX2VuZHBvaW50X2FjcyB9LCAvKiBFbXVsZXggQkUzLVIgKi8KIAl7IDB4MTBkZiwgMHg3MjAsIHBjaV9xdWlya19tZl9lbmRwb2ludF9hY3MgfSwgLyogRW11bGV4IFNreWhhd2stUiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcmVtb3ZlLmMgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwppbmRleCA4YmQ3NmM5Li44YTI4MGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9yZW1vdmUuYworKysgYi9kcml2ZXJzL3BjaS9yZW1vdmUuYwpAQCAtMTM5LDYgKzEzOSw3IEBACiAJLyogc3RvcCB0aGUgaG9zdCBicmlkZ2UgKi8KIAlkZXZpY2VfcmVsZWFzZV9kcml2ZXIoJmhvc3RfYnJpZGdlLT5kZXYpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX3N0b3Bfcm9vdF9idXMpOwogCiB2b2lkIHBjaV9yZW1vdmVfcm9vdF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykKIHsKQEAgLTE1OCwzICsxNTksNCBAQAogCS8qIHJlbW92ZSB0aGUgaG9zdCBicmlkZ2UgKi8KIAlkZXZpY2VfdW5yZWdpc3RlcigmaG9zdF9icmlkZ2UtPmRldik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfcmVtb3ZlX3Jvb3RfYnVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKaW5kZXggNjYwM2Q0MC4uNGZkMGNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtYnVzLmMKQEAgLTE4MTMsMyArMTgxMyw0IEBACiAJX19wY2lfYnVzX2Fzc2lnbl9yZXNvdXJjZXMoYnVzLCAmYWRkX2xpc3QsIE5VTEwpOwogCUJVR19PTighbGlzdF9lbXB0eSgmYWRkX2xpc3QpKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9hc3NpZ25fdW5hc3NpZ25lZF9idXNfcmVzb3VyY2VzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLWlycS5jIGIvZHJpdmVycy9wY2kvc2V0dXAtaXJxLmMKaW5kZXggNGUyZDU5NS4uOTVjMjI1YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtaXJxLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtaXJxLmMKQEAgLTY1LDMgKzY1LDQgQEAKIAlmb3JfZWFjaF9wY2lfZGV2KGRldikKIAkJcGRldl9maXh1cF9pcnEoZGV2LCBzd2l6emxlLCBtYXBfaXJxKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBjaV9maXh1cF9pcnFzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKaW5kZXggYjdjM2E1ZS4uMjMyZjkyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKKysrIGIvZHJpdmVycy9wY2kvc2V0dXAtcmVzLmMKQEAgLTEyMCw2ICsxMjAsNyBAQAogCWlmICghcm9vdCkgewogCQlkZXZfaW5mbygmZGV2LT5kZXYsICJjYW4ndCBjbGFpbSBCQVIgJWQgJXBSOiBubyBjb21wYXRpYmxlIGJyaWRnZSB3aW5kb3dcbiIsCiAJCQkgcmVzb3VyY2UsIHJlcyk7CisJCXJlcy0+ZmxhZ3MgfD0gSU9SRVNPVVJDRV9VTlNFVDsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMjcsNiArMTI4LDcgQEAKIAlpZiAoY29uZmxpY3QpIHsKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiY2FuJ3QgY2xhaW0gQkFSICVkICVwUjogYWRkcmVzcyBjb25mbGljdCB3aXRoICVzICVwUlxuIiwKIAkJCSByZXNvdXJjZSwgcmVzLCBjb25mbGljdC0+bmFtZSwgY29uZmxpY3QpOworCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnIGIvZHJpdmVycy9wY21jaWEvS2NvbmZpZwppbmRleCAzYmI0OTI1Li40NWY2N2M2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNtY2lhL0tjb25maWcKQEAgLTY5LDggKzY5LDcgQEAKIAl0cmlzdGF0ZSAiQ2FyZEJ1cyB5ZW50YS1jb21wYXRpYmxlIGJyaWRnZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENJCiAJc2VsZWN0IENBUkRCVVMgaWYgIUVYUEVSVAotCXNlbGVjdCBQQ0NBUkRfTk9OU1RBVElDIGlmIFBDTUNJQSAhPSBuICYmIElTQQotCXNlbGVjdCBQQ0NBUkRfUENJIGlmIFBDTUNJQSAhPW4gJiYgIUlTQQorCXNlbGVjdCBQQ0NBUkRfTk9OU1RBVElDIGlmIFBDTUNJQSAhPSBuCiAJLS0taGVscC0tLQogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBDYXJkQnVzIGhvc3QgYnJpZGdlcy4gIFZpcnR1YWxseQogCSAgYWxsIG1vZGVybiBQQ01DSUEgYnJpZGdlcyBhcmUgQ2FyZEJ1cyBjb21wYXRpYmxlLiAgQSAiYnJpZGdlIiBpcwpAQCAtMTEwLDggKzEwOSw3IEBACiBjb25maWcgUEQ2NzI5CiAJdHJpc3RhdGUgIkNpcnJ1cyBQRDY3MjkgY29tcGF0aWJsZSBicmlkZ2Ugc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFBDTUNJQSAmJiBQQ0kKLQlzZWxlY3QgUENDQVJEX05PTlNUQVRJQyBpZiBQQ01DSUEgIT0gbiAmJiBJU0EKLQlzZWxlY3QgUENDQVJEX1BDSSBpZiBQQ01DSUEgIT1uICYmICFJU0EKKwlzZWxlY3QgUENDQVJEX05PTlNUQVRJQwogCWhlbHAKIAkgIFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhlIENpcnJ1cyBQRDY3MjkgUENJLXRvLVBDTUNJQSBicmlkZ2UKIAkgIGRldmljZSwgZm91bmQgaW4gc29tZSBvbGRlciBsYXB0b3BzIGFuZCBQQ01DSUEgY2FyZCByZWFkZXJzLgpAQCAtMTE5LDggKzExNyw3IEBACiBjb25maWcgSTgyMDkyCiAJdHJpc3RhdGUgImk4MjA5MiBjb21wYXRpYmxlIGJyaWRnZSBzdXBwb3J0IgogCWRlcGVuZHMgb24gUENNQ0lBICYmIFBDSQotCXNlbGVjdCBQQ0NBUkRfTk9OU1RBVElDIGlmIFBDTUNJQSAhPSBuICYmIElTQQotCXNlbGVjdCBQQ0NBUkRfUENJIGlmIFBDTUNJQSAhPW4gJiYgIUlTQQorCXNlbGVjdCBQQ0NBUkRfTk9OU1RBVElDCiAJaGVscAogCSAgVGhpcyBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgSW50ZWwgSTgyMDkyQUEgUENJLXRvLVBDTUNJQSBicmlkZ2UgZGV2aWNlLAogCSAgZm91bmQgaW4gc29tZSBvbGRlciBsYXB0b3BzIGFuZCBtb3JlIGNvbW1vbmx5IGluIGV2YWx1YXRpb24gYm9hcmRzIGZvciB0aGUKQEAgLTI5MSw5ICsyODgsNiBAQAogCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IHRoZSBDb21wYWN0Rmxhc2ggY29udHJvbGxlciBvbiB0aGUKIAkgIFBBIFNlbWkgRWxlY3RyYSBldmFsIGJvYXJkLgogCi1jb25maWcgUENDQVJEX1BDSQotCWJvb2wKLQogY29uZmlnIFBDQ0FSRF9OT05TVEFUSUMKIAlib29sCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL01ha2VmaWxlIGIvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKaW5kZXggZjFhN2NhMC4uMjdlOTRiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wY21jaWEvTWFrZWZpbGUKQEAgLTEyLDcgKzEyLDYgQEAKIHBjbWNpYV9yc3JjLXkJCQkJCSs9IHJzcmNfbWdyLm8KIHBjbWNpYV9yc3JjLSQoQ09ORklHX1BDQ0FSRF9OT05TVEFUSUMpCQkrPSByc3JjX25vbnN0YXRpYy5vCiBwY21jaWFfcnNyYy0kKENPTkZJR19QQ0NBUkRfSU9EWU4pCQkrPSByc3JjX2lvZHluLm8KLXBjbWNpYV9yc3JjLSQoQ09ORklHX1BDQ0FSRF9QQ0kpCQkrPSByc3JjX3BjaS5vCiBvYmotJChDT05GSUdfUENDQVJEKQkJCQkrPSBwY21jaWFfcnNyYy5vCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcnNyY19wY2kuYyBiL2RyaXZlcnMvcGNtY2lhL3JzcmNfcGNpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjdiM2IuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9wY21jaWEvcnNyY19wY2kuYworKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotCi0jaW5jbHVkZSA8cGNtY2lhL3NzLmg+Ci0jaW5jbHVkZSA8cGNtY2lhL2Npc3RwbC5oPgotI2luY2x1ZGUgImNzX2ludGVybmFsLmgiCi0KLQotc3RydWN0IHBjbWNpYV9hbGlnbl9kYXRhIHsKLQl1bnNpZ25lZCBsb25nCW1hc2s7Ci0JdW5zaWduZWQgbG9uZwlvZmZzZXQ7Ci19OwotCi1zdGF0aWMgcmVzb3VyY2Vfc2l6ZV90IHBjbWNpYV9hbGlnbih2b2lkICphbGlnbl9kYXRhLAotCQkJCWNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzLAotCQkJCXJlc291cmNlX3NpemVfdCBzaXplLCByZXNvdXJjZV9zaXplX3QgYWxpZ24pCi17Ci0Jc3RydWN0IHBjbWNpYV9hbGlnbl9kYXRhICpkYXRhID0gYWxpZ25fZGF0YTsKLQlyZXNvdXJjZV9zaXplX3Qgc3RhcnQ7Ci0KLQlzdGFydCA9IChyZXMtPnN0YXJ0ICYgfmRhdGEtPm1hc2spICsgZGF0YS0+b2Zmc2V0OwotCWlmIChzdGFydCA8IHJlcy0+c3RhcnQpCi0JCXN0YXJ0ICs9IGRhdGEtPm1hc2sgKyAxOwotCXJldHVybiBzdGFydDsKLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqZmluZF9pb19yZWdpb24oc3RydWN0IHBjbWNpYV9zb2NrZXQgKnMsCi0JCQkJCXVuc2lnbmVkIGxvbmcgYmFzZSwgaW50IG51bSwKLQkJCQkJdW5zaWduZWQgbG9uZyBhbGlnbikKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBjbWNpYV9tYWtlX3Jlc291cmNlKDAsIG51bSwgSU9SRVNPVVJDRV9JTywKLQkJCQkJCWRldl9uYW1lKCZzLT5kZXYpKTsKLQlzdHJ1Y3QgcGNtY2lhX2FsaWduX2RhdGEgZGF0YTsKLQlpbnQgcmV0OwotCi0JZGF0YS5tYXNrID0gYWxpZ24gLSAxOwotCWRhdGEub2Zmc2V0ID0gYmFzZSAmIGRhdGEubWFzazsKLQotCXJldCA9IHBjaV9idXNfYWxsb2NfcmVzb3VyY2Uocy0+Y2JfZGV2LT5idXMsIHJlcywgbnVtLCAxLAotCQkJCQkgICAgIGJhc2UsIDAsIHBjbWNpYV9hbGlnbiwgJmRhdGEpOwotCWlmIChyZXQgIT0gMCkgewotCQlrZnJlZShyZXMpOwotCQlyZXMgPSBOVUxMOwotCX0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgaW50IHJlc19wY2lfZmluZF9pbyhzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcywgdW5zaWduZWQgaW50IGF0dHIsCi0JCQl1bnNpZ25lZCBpbnQgKmJhc2UsIHVuc2lnbmVkIGludCBudW0sCi0JCQl1bnNpZ25lZCBpbnQgYWxpZ24sIHN0cnVjdCByZXNvdXJjZSAqKnBhcmVudCkKLXsKLQlpbnQgaSwgcmV0ID0gMDsKLQotCS8qIENoZWNrIGZvciBhbiBhbHJlYWR5LWFsbG9jYXRlZCB3aW5kb3cgdGhhdCBtdXN0IGNvbmZsaWN0IHdpdGgKLQkgKiB3aGF0IHdhcyBhc2tlZCBmb3IuICBJdCBpcyBhIGhhY2sgYmVjYXVzZSBpdCBkb2VzIG5vdCBjYXRjaCBhbGwKLQkgKiBwb3RlbnRpYWwgY29uZmxpY3RzLCBqdXN0IHRoZSBtb3N0IG9idmlvdXMgb25lcy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lPX1dJTjsgaSsrKSB7Ci0JCWlmICghcy0+aW9baV0ucmVzKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCEqYmFzZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgocy0+aW9baV0ucmVzLT5zdGFydCAmIChhbGlnbi0xKSkgPT0gKmJhc2UpCi0JCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfSU9fV0lOOyBpKyspIHsKLQkJc3RydWN0IHJlc291cmNlICpyZXMgPSBzLT5pb1tpXS5yZXM7Ci0JCXVuc2lnbmVkIGludCB0cnk7Ci0KLQkJaWYgKHJlcyAmJiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfQklUUykgIT0KLQkJCShhdHRyICYgSU9SRVNPVVJDRV9CSVRTKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICghcmVzKSB7Ci0JCQlpZiAoYWxpZ24gPT0gMCkKLQkJCQlhbGlnbiA9IDB4MTAwMDA7Ci0KLQkJCXJlcyA9IHMtPmlvW2ldLnJlcyA9IGZpbmRfaW9fcmVnaW9uKHMsICpiYXNlLCBudW0sCi0JCQkJCQkJCWFsaWduKTsKLQkJCWlmICghcmVzKQotCQkJCXJldHVybiAtRUlOVkFMOwotCi0JCQkqYmFzZSA9IHJlcy0+c3RhcnQ7Ci0JCQlzLT5pb1tpXS5yZXMtPmZsYWdzID0KLQkJCQkoKHJlcy0+ZmxhZ3MgJiB+SU9SRVNPVVJDRV9CSVRTKSB8Ci0JCQkJCShhdHRyICYgSU9SRVNPVVJDRV9CSVRTKSk7Ci0JCQlzLT5pb1tpXS5JblVzZSA9IG51bTsKLQkJCSpwYXJlbnQgPSByZXM7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qIFRyeSB0byBleHRlbmQgdG9wIG9mIHdpbmRvdyAqLwotCQl0cnkgPSByZXMtPmVuZCArIDE7Ci0JCWlmICgoKmJhc2UgPT0gMCkgfHwgKCpiYXNlID09IHRyeSkpIHsKLQkJCXJldCA9IGFkanVzdF9yZXNvdXJjZShzLT5pb1tpXS5yZXMsIHJlcy0+c3RhcnQsCi0JCQkJCSAgICAgIHJlc291cmNlX3NpemUocmVzKSArIG51bSk7Ci0JCQlpZiAocmV0KQotCQkJCWNvbnRpbnVlOwotCQkJKmJhc2UgPSB0cnk7Ci0JCQlzLT5pb1tpXS5JblVzZSArPSBudW07Ci0JCQkqcGFyZW50ID0gcmVzOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKiBUcnkgdG8gZXh0ZW5kIGJvdHRvbSBvZiB3aW5kb3cgKi8KLQkJdHJ5ID0gcmVzLT5zdGFydCAtIG51bTsKLQkJaWYgKCgqYmFzZSA9PSAwKSB8fCAoKmJhc2UgPT0gdHJ5KSkgewotCQkJcmV0ID0gYWRqdXN0X3Jlc291cmNlKHMtPmlvW2ldLnJlcywKLQkJCQkJICAgICAgcmVzLT5zdGFydCAtIG51bSwKLQkJCQkJICAgICAgcmVzb3VyY2Vfc2l6ZShyZXMpICsgbnVtKTsKLQkJCWlmIChyZXQpCi0JCQkJY29udGludWU7Ci0JCQkqYmFzZSA9IHRyeTsKLQkJCXMtPmlvW2ldLkluVXNlICs9IG51bTsKLQkJCSpwYXJlbnQgPSByZXM7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqcmVzX3BjaV9maW5kX21lbSh1X2xvbmcgYmFzZSwgdV9sb25nIG51bSwKLQkJdV9sb25nIGFsaWduLCBpbnQgbG93LCBzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IHBjbWNpYV9tYWtlX3Jlc291cmNlKDAsIG51bSwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCQlkZXZfbmFtZSgmcy0+ZGV2KSk7Ci0Jc3RydWN0IHBjbWNpYV9hbGlnbl9kYXRhIGRhdGE7Ci0JdW5zaWduZWQgbG9uZyBtaW47Ci0JaW50IHJldDsKLQotCWlmIChhbGlnbiA8IDB4MjAwMDApCi0JCWFsaWduID0gMHgyMDAwMDsKLQlkYXRhLm1hc2sgPSBhbGlnbiAtIDE7Ci0JZGF0YS5vZmZzZXQgPSBiYXNlICYgZGF0YS5tYXNrOwotCi0JbWluID0gMDsKLQlpZiAoIWxvdykKLQkJbWluID0gMHgxMDAwMDBVTDsKLQotCXJldCA9IHBjaV9idXNfYWxsb2NfcmVzb3VyY2Uocy0+Y2JfZGV2LT5idXMsCi0JCQlyZXMsIG51bSwgMSwgbWluLCAwLAotCQkJcGNtY2lhX2FsaWduLCAmZGF0YSk7Ci0KLQlpZiAocmV0ICE9IDApIHsKLQkJa2ZyZWUocmVzKTsKLQkJcmVzID0gTlVMTDsKLQl9Ci0JcmV0dXJuIHJlczsKLX0KLQotCi1zdGF0aWMgaW50IHJlc19wY2lfaW5pdChzdHJ1Y3QgcGNtY2lhX3NvY2tldCAqcykKLXsKLQlpZiAoIXMtPmNiX2RldiB8fCAhKHMtPmZlYXR1cmVzICYgU1NfQ0FQX1BBR0VfUkVHUykpIHsKLQkJZGV2X2Vycigmcy0+ZGV2LCAibm90IHN1cHBvcnRlZCBieSByZXNfcGNpXG4iKTsKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHBjY2FyZF9yZXNvdXJjZV9vcHMgcGNjYXJkX25vbnN0YXRpY19vcHMgPSB7Ci0JLnZhbGlkYXRlX21lbSA9IE5VTEwsCi0JLmZpbmRfaW8gPSByZXNfcGNpX2ZpbmRfaW8sCi0JLmZpbmRfbWVtID0gcmVzX3BjaV9maW5kX21lbSwKLQkuaW5pdCA9IHJlc19wY2lfaW5pdCwKLQkuZXhpdCA9IE5VTEwsCi19OwotRVhQT1JUX1NZTUJPTChwY2NhcmRfbm9uc3RhdGljX29wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9LY29uZmlnIGIvZHJpdmVycy9waHkvS2NvbmZpZwppbmRleCAyOTYyZGUyLi5hNTNiZDViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGh5L0tjb25maWcKQEAgLTM1LDYgKzM1LDEzIEBACiAJZGVwZW5kcyBvbiBPRgogCXNlbGVjdCBHRU5FUklDX1BIWQogCitjb25maWcgUEhZX0RNODE2WF9VU0IKKwl0cmlzdGF0ZSAiVEkgZG04MTZ4IFVTQiBQSFkgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9PTUFQMlBMVVMKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwloZWxwCisJICBFbmFibGUgdGhpcyBmb3IgZG04MTZ4IFVTQiB0byB3b3JrLgorCiBjb25maWcgUEhZX0VYWU5PU19NSVBJX1ZJREVPCiAJdHJpc3RhdGUgIlM1UC9FWFlOT1MgU29DIHNlcmllcyBNSVBJIENTSS0yL0RTSSBQSFkgZHJpdmVyIgogCWRlcGVuZHMgb24gSEFTX0lPTUVNCkBAIC0xNzQsNiArMTgxLDE3IEBACiAJICBUaGlzIGRyaXZlciBjb250cm9scyB0aGUgZW50aXJlIFVTQiBQSFkgYmxvY2ssIGJvdGggdGhlIFVTQiBPVEcKIAkgIHBhcnRzLCBhcyB3ZWxsIGFzIHRoZSAyIHJlZ3VsYXIgVVNCIDIgaG9zdCBQSFlzLgogCitjb25maWcgUEhZX1NVTjlJX1VTQgorCXRyaXN0YXRlICJBbGx3aW5uZXIgc3VuOWkgU29DIFVTQiBQSFkgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9TVU5YSSAmJiBIQVNfSU9NRU0gJiYgT0YKKwlkZXBlbmRzIG9uIFJFU0VUX0NPTlRST0xMRVIKKwlzZWxlY3QgR0VORVJJQ19QSFkKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byBzdXBwb3J0IHRoZSB0cmFuc2NlaXZlciB0aGF0IGlzIHBhcnQgb2YgQWxsd2lubmVyCisJICBzdW45aSBTb0NzLgorCisJICBUaGlzIGRyaXZlciBjb250cm9scyBlYWNoIGluZGl2aWR1YWwgVVNCIDIgaG9zdCBQSFkuCisKIGNvbmZpZyBQSFlfU0FNU1VOR19VU0IyCiAJdHJpc3RhdGUgIlNhbXN1bmcgVVNCIDIuMCBQSFkgZHJpdmVyIgogCWRlcGVuZHMgb24gSEFTX0lPTUVNCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9NYWtlZmlsZSBiL2RyaXZlcnMvcGh5L01ha2VmaWxlCmluZGV4IGYwODBlMWIuLmYxMjYyNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGh5L01ha2VmaWxlCkBAIC01LDYgKzUsNyBAQAogb2JqLSQoQ09ORklHX0dFTkVSSUNfUEhZKQkJKz0gcGh5LWNvcmUubwogb2JqLSQoQ09ORklHX1BIWV9CRVJMSU5fVVNCKQkJKz0gcGh5LWJlcmxpbi11c2Iubwogb2JqLSQoQ09ORklHX1BIWV9CRVJMSU5fU0FUQSkJCSs9IHBoeS1iZXJsaW4tc2F0YS5vCitvYmotJChDT05GSUdfUEhZX0RNODE2WF9VU0IpCQkrPSBwaHktZG04MTZ4LXVzYi5vCiBvYmotJChDT05GSUdfQVJNQURBMzc1X1VTQkNMVVNURVJfUEhZKQkrPSBwaHktYXJtYWRhMzc1LXVzYjIubwogb2JqLSQoQ09ORklHX0JDTV9LT05BX1VTQjJfUEhZKQkJKz0gcGh5LWJjbS1rb25hLXVzYjIubwogb2JqLSQoQ09ORklHX1BIWV9FWFlOT1NfRFBfVklERU8pCSs9IHBoeS1leHlub3MtZHAtdmlkZW8ubwpAQCAtMjAsNiArMjEsNyBAQAogb2JqLSQoQ09ORklHX1BIWV9FWFlOT1M1MjUwX1NBVEEpCSs9IHBoeS1leHlub3M1MjUwLXNhdGEubwogb2JqLSQoQ09ORklHX1BIWV9ISVg1SEQyX1NBVEEpCQkrPSBwaHktaGl4NWhkMi1zYXRhLm8KIG9iai0kKENPTkZJR19QSFlfU1VONElfVVNCKQkJKz0gcGh5LXN1bjRpLXVzYi5vCitvYmotJChDT05GSUdfUEhZX1NVTjlJX1VTQikJCSs9IHBoeS1zdW45aS11c2Iubwogb2JqLSQoQ09ORklHX1BIWV9TQU1TVU5HX1VTQjIpCQkrPSBwaHktZXh5bm9zLXVzYjIubwogcGh5LWV4eW5vcy11c2IyLXkJCQkrPSBwaHktc2Ftc3VuZy11c2IyLm8KIHBoeS1leHlub3MtdXNiMi0kKENPTkZJR19QSFlfRVhZTk9TNDIxMF9VU0IyKQkrPSBwaHktZXh5bm9zNDIxMC11c2IyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1hcm1hZGEzNzUtdXNiMi5jIGIvZHJpdmVycy9waHkvcGh5LWFybWFkYTM3NS11c2IyLmMKaW5kZXggN2M5OWNhMi4uOGNjYzM5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWFybWFkYTM3NS11c2IyLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LWFybWFkYTM3NS11c2IyLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlzdHJ1Y3QgYXJtYWRhMzc1X2NsdXN0ZXJfcGh5ICpjbHVzdGVyX3BoeTsKIAl1MzIgcmVnOwogCi0JY2x1c3Rlcl9waHkgPSBkZXZfZ2V0X2RydmRhdGEocGh5LT5kZXYucGFyZW50KTsKKwljbHVzdGVyX3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwogCWlmICghY2x1c3Rlcl9waHkpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0xMzEsNiArMTMxLDcgQEAKIAljbHVzdGVyX3BoeS0+cmVnID0gdXNiX2NsdXN0ZXJfYmFzZTsKIAogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGNsdXN0ZXJfcGh5KTsKKwlwaHlfc2V0X2RydmRhdGEocGh5LCBjbHVzdGVyX3BoeSk7CiAKIAlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcigmcGRldi0+ZGV2LAogCQkJCQkJICAgICBhcm1hZGEzNzVfdXNiX3BoeV94bGF0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktYmVybGluLXNhdGEuYyBiL2RyaXZlcnMvcGh5L3BoeS1iZXJsaW4tc2F0YS5jCmluZGV4IDA5OWVlZTguLjZmM2UwNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1iZXJsaW4tc2F0YS5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1iZXJsaW4tc2F0YS5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIAlpZiAocHJpdi0+bnBoeXMgPT0gMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwcml2LT5waHlzID0gZGV2bV9remFsbG9jKGRldiwgcHJpdi0+bnBoeXMgKiBzaXplb2YoKnByaXYtPnBoeXMpLAorCXByaXYtPnBoeXMgPSBkZXZtX2tjYWxsb2MoZGV2LCBwcml2LT5ucGh5cywgc2l6ZW9mKCpwcml2LT5waHlzKSwKIAkJCQkgIEdGUF9LRVJORUwpOwogCWlmICghcHJpdi0+cGh5cykKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktYmVybGluLXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LWJlcmxpbi11c2IuYwppbmRleCBjOGE4ZDUzLi5jNmZjOTViIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktYmVybGluLXVzYi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1iZXJsaW4tdXNiLmMKQEAgLTEwMyw5ICsxMDMsNiBAQAogI2RlZmluZSBNT0RFX1RFU1RfRU4JCUJJVCgxMSkKICNkZWZpbmUgQU5BX1RFU1RfRENfQ1RSTCh4KQkoKHgpIDw8IDEyKQogCi0jZGVmaW5lIHRvX3BoeV9iZXJsaW5fdXNiX3ByaXYocCkJXAotCWNvbnRhaW5lcl9vZigocCksIHN0cnVjdCBwaHlfYmVybGluX3VzYl9wcml2LCBwaHkpCi0KIHN0YXRpYyBjb25zdCB1MzIgcGh5X2Jlcmxpbl9wbGxfZGl2aWRlcnNbXSA9IHsKIAkvKiBCZXJsaW4gMiAqLwogCUNMS19SRUZfRElWKDB4YykgfCBGRUVEQkFDS19DTEtfRElWKDB4NTQpLApAQCAtMTE1LDE0ICsxMTIsMTMgQEAKIAogc3RydWN0IHBoeV9iZXJsaW5fdXNiX3ByaXYgewogCXZvaWQgX19pb21lbQkJKmJhc2U7Ci0Jc3RydWN0IHBoeQkJKnBoeTsKIAlzdHJ1Y3QgcmVzZXRfY29udHJvbAkqcnN0X2N0cmw7CiAJdTMyCQkJcGxsX2RpdmlkZXI7CiB9OwogCiBzdGF0aWMgaW50IHBoeV9iZXJsaW5fdXNiX3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBoeSkKIHsKLQlzdHJ1Y3QgcGh5X2Jlcmxpbl91c2JfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShwaHktPmRldi5wYXJlbnQpOworCXN0cnVjdCBwaHlfYmVybGluX3VzYl9wcml2ICpwcml2ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CiAKIAlyZXNldF9jb250cm9sX3Jlc2V0KHByaXYtPnJzdF9jdHJsKTsKIApAQCAtMTc1LDYgKzE3MSw3IEBACiAJCW9mX21hdGNoX2RldmljZShwaHlfYmVybGluX3NhdGFfb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOwogCXN0cnVjdCBwaHlfYmVybGluX3VzYl9wcml2ICpwcml2OwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBwaHkgKnBoeTsKIAlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7CiAKIAlwcml2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcHJpdiksIEdGUF9LRVJORUwpOwpAQCAtMTkyLDIwICsxODksMTggQEAKIAogCXByaXYtPnBsbF9kaXZpZGVyID0gKigodTMyICopbWF0Y2gtPmRhdGEpOwogCi0JcHJpdi0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKCZwZGV2LT5kZXYsIE5VTEwsICZwaHlfYmVybGluX3VzYl9vcHMpOwotCWlmIChJU19FUlIocHJpdi0+cGh5KSkgeworCXBoeSA9IGRldm1fcGh5X2NyZWF0ZSgmcGRldi0+ZGV2LCBOVUxMLCAmcGh5X2Jlcmxpbl91c2Jfb3BzKTsKKwlpZiAoSVNfRVJSKHBoeSkpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBQSFlcbiIpOwotCQlyZXR1cm4gUFRSX0VSUihwcml2LT5waHkpOworCQlyZXR1cm4gUFRSX0VSUihwaHkpOwogCX0KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOworCXBoeV9zZXRfZHJ2ZGF0YShwaHksIHByaXYpOwogCiAJcGh5X3Byb3ZpZGVyID0KIAkJZGV2bV9vZl9waHlfcHJvdmlkZXJfcmVnaXN0ZXIoJnBkZXYtPmRldiwgb2ZfcGh5X3NpbXBsZV94bGF0ZSk7Ci0JaWYgKElTX0VSUihwaHlfcHJvdmlkZXIpKQotCQlyZXR1cm4gUFRSX0VSUihwaHlfcHJvdmlkZXIpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwaHlfcHJvdmlkZXIpOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwaHlfYmVybGluX3VzYl9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktY29yZS5jIGIvZHJpdmVycy9waHkvcGh5LWNvcmUuYwppbmRleCBhMTJkMzUzLi4zNzkxODM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktY29yZS5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1jb3JlLmMKQEAgLTUyLDcgKzUyLDkgQEAKIAogc3RhdGljIGludCBkZXZtX3BoeV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcywgdm9pZCAqbWF0Y2hfZGF0YSkKIHsKLQlyZXR1cm4gcmVzID09IG1hdGNoX2RhdGE7CisJc3RydWN0IHBoeSAqKnBoeSA9IHJlczsKKworCXJldHVybiAqcGh5ID09IG1hdGNoX2RhdGE7CiB9CiAKIC8qKgpAQCAtMjIzLDYgKzIyNSw3IEBACiAJcmV0ID0gcGh5X3BtX3J1bnRpbWVfZ2V0X3N5bmMocGh5KTsKIAlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT1RTVVBQKQogCQlyZXR1cm4gcmV0OworCXJldCA9IDA7IC8qIE92ZXJyaWRlIHBvc3NpYmxlIHJldCA9PSAtRU5PVFNVUFAgKi8KIAogCW11dGV4X2xvY2soJnBoeS0+bXV0ZXgpOwogCWlmIChwaHktPmluaXRfY291bnQgPT0gMCAmJiBwaHktPm9wcy0+aW5pdCkgewpAQCAtMjMxLDggKzIzNCw2IEBACiAJCQlkZXZfZXJyKCZwaHktPmRldiwgInBoeSBpbml0IGZhaWxlZCAtLT4gJWRcbiIsIHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQotCX0gZWxzZSB7Ci0JCXJldCA9IDA7IC8qIE92ZXJyaWRlIHBvc3NpYmxlIHJldCA9PSAtRU5PVFNVUFAgKi8KIAl9CiAJKytwaHktPmluaXRfY291bnQ7CiAKQEAgLTI1Myw2ICsyNTQsNyBAQAogCXJldCA9IHBoeV9wbV9ydW50aW1lX2dldF9zeW5jKHBoeSk7CiAJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9UU1VQUCkKIAkJcmV0dXJuIHJldDsKKwlyZXQgPSAwOyAvKiBPdmVycmlkZSBwb3NzaWJsZSByZXQgPT0gLUVOT1RTVVBQICovCiAKIAltdXRleF9sb2NrKCZwaHktPm11dGV4KTsKIAlpZiAocGh5LT5pbml0X2NvdW50ID09IDEgJiYgcGh5LT5vcHMtPmV4aXQpIHsKQEAgLTI4Nyw2ICsyODksNyBAQAogCXJldCA9IHBoeV9wbV9ydW50aW1lX2dldF9zeW5jKHBoeSk7CiAJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9UU1VQUCkKIAkJcmV0dXJuIHJldDsKKwlyZXQgPSAwOyAvKiBPdmVycmlkZSBwb3NzaWJsZSByZXQgPT0gLUVOT1RTVVBQICovCiAKIAltdXRleF9sb2NrKCZwaHktPm11dGV4KTsKIAlpZiAocGh5LT5wb3dlcl9jb3VudCA9PSAwICYmIHBoeS0+b3BzLT5wb3dlcl9vbikgewpAQCAtMjk1LDggKzI5OCw2IEBACiAJCQlkZXZfZXJyKCZwaHktPmRldiwgInBoeSBwb3dlcm9uIGZhaWxlZCAtLT4gJWRcbiIsIHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQotCX0gZWxzZSB7Ci0JCXJldCA9IDA7IC8qIE92ZXJyaWRlIHBvc3NpYmxlIHJldCA9PSAtRU5PVFNVUFAgKi8KIAl9CiAJKytwaHktPnBvd2VyX2NvdW50OwogCW11dGV4X3VubG9jaygmcGh5LT5tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktZG04MTZ4LXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LWRtODE2eC11c2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQyNTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waHkvcGh5LWRtODE2eC11c2IuYwpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkICJhcyBpcyIgV0lUSE9VVCBBTlkgV0FSUkFOVFkgb2YgYW55CisgKiBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZDsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5CisgKiBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvcGh5X2NvbXBhbmlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorCisvKgorICogVFJNIGhhcyB0d28gc2V0cyBvZiBVU0JfQ1RSTCByZWdpc3RlcnMuLiBUaGUgY29ycmVjdCByZWdpc3RlciBiaXRzCisgKiBhcmUgaW4gVFJNIHNlY3Rpb24gMjQuOS44LjIgVVNCX0NUUkwgUmVnaXN0ZXIuIFRoZSBUUk0gZG9jdW1lbnRzIHRoZQorICogcGh5IGFzIGJlaW5nIFNSNzBMWCBTeW5vcHN5cyBVU0IgMi4wIE9URyBuYW5vUEhZLiBJdCBhbHNvIHNlZW1zIGF0CisgKiBsZWFzdCBkbTgxNnggcmV2IGMgaWdub3JlcyB3cml0ZXMgdG8gVVNCX0NUUkwgcmVnaXN0ZXIsIGJ1dCB0aGUgVEkKKyAqIGtlcm5lbCBpcyB3cml0aW5nIHRvIHRob3NlIHNvIGl0J3MgcG9zc2libGUgdGhhdCBsYXRlciByZXZpc2lvbnMKKyAqIGhhdmUgd29ya25pZyBVU0JfQ1RSTCByZWdpc3Rlci4KKyAqCisgKiBBbHNvIG5vdGUgdGhhdCBBdCBsZWFzdCBVU0JfQ1RSTCByZWdpc3RlciBzZWVtcyB0byBiZSBkbTgxNnggc3BlY2lmaWMKKyAqIGFjY29yZGluZyB0byB0aGUgVFJNLiBJdCdzIHBvc3NpYmxlIHRoYXQgVVNCUEhZX0NUUkwgaXMgbW9yZSBnZW5lcmljLAorICogYnV0IHRoYXQgd291bGQgaGF2ZSB0byBiZSBjaGVja2VkIGFnYWluc3QgdGhlIFNSNzBMWCBkb2N1bWVudGF0aW9uCisgKiB3aGljaCBkb2VzIG5vdCBzZWVtIHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS4KKyAqCisgKiBGaW5hbGx5LCB0aGUgcGh5IG9uIGRtODE0eCBhbmQgYW0zMzV4IGlzIGRpZmZlcmVudCBmcm9tIGRtODE2eC4KKyAqLworI2RlZmluZSBETTgxNlhfVVNCX0NUUkxfUEhZQ0xLU1JDCUJJVCg4KQkvKiAxID0gUExMIHJlZiBjbG9jayAqLworI2RlZmluZSBETTgxNlhfVVNCX0NUUkxfUEhZU0xFRVAxCUJJVCgxKQkvKiBFbmFibGUgdGhlIGZpcnN0IHBoeSAqLworI2RlZmluZSBETTgxNlhfVVNCX0NUUkxfUEhZU0xFRVAwCUJJVCgwKQkvKiBFbmFibGUgdGhlIHNlY29uZCBwaHkgKi8KKworI2RlZmluZSBETTgxNlhfVVNCUEhZX0NUUkxfVFhSSVNFVFVORQkxCisjZGVmaW5lIERNODE2WF9VU0JQSFlfQ1RSTF9UWFZSRUZUVU5FCTB4YworI2RlZmluZSBETTgxNlhfVVNCUEhZX0NUUkxfVFhQUkVFTVRVTkUJMHgyCisKK3N0cnVjdCBkbTgxNnhfdXNiX3BoeSB7CisJc3RydWN0IHJlZ21hcCAqc3lzY29uOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBpbnQgaW5zdGFuY2U7CisJc3RydWN0IGNsayAqcmVmY2xrOworCXN0cnVjdCB1c2JfcGh5IHBoeTsKKwl1bnNpZ25lZCBpbnQgdXNiX2N0cmw7CQkvKiBTaGFyZWQgYmV0d2VlbiBwaHkwIGFuZCBwaHkxICovCisJdW5zaWduZWQgaW50IHVzYnBoeV9jdHJsOworfTsKKworc3RhdGljIGludCBkbTgxNnhfdXNiX3BoeV9zZXRfaG9zdChzdHJ1Y3QgdXNiX290ZyAqb3RnLCBzdHJ1Y3QgdXNiX2J1cyAqaG9zdCkKK3sKKwlvdGctPmhvc3QgPSBob3N0OworCWlmICghaG9zdCkKKwkJb3RnLT5zdGF0ZSA9IE9UR19TVEFURV9VTkRFRklORUQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbTgxNnhfdXNiX3BoeV9zZXRfcGVyaXBoZXJhbChzdHJ1Y3QgdXNiX290ZyAqb3RnLAorCQkJCQkgc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlvdGctPmdhZGdldCA9IGdhZGdldDsKKwlpZiAoIWdhZGdldCkKKwkJb3RnLT5zdGF0ZSA9IE9UR19TVEFURV9VTkRFRklORUQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbTgxNnhfdXNiX3BoeV9pbml0KHN0cnVjdCBwaHkgKngpCit7CisJc3RydWN0IGRtODE2eF91c2JfcGh5ICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoeCk7CisJdW5zaWduZWQgaW50IHZhbDsKKwlpbnQgZXJyb3I7CisKKwlpZiAoY2xrX2dldF9yYXRlKHBoeS0+cmVmY2xrKSAhPSAyNDAwMDAwMCkKKwkJZGV2X3dhcm4ocGh5LT5kZXYsICJub25zdGFuZGFyZCBwaHkgcmVmY2xrXG4iKTsKKworCS8qIFNldCBQTEwgcmVmIGNsb2NrIGFuZCBwdXQgcGh5cyB0byBzbGVlcCAqLworCWVycm9yID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBoeS0+c3lzY29uLCBwaHktPnVzYl9jdHJsLAorCQkJCSAgIERNODE2WF9VU0JfQ1RSTF9QSFlDTEtTUkMgfAorCQkJCSAgIERNODE2WF9VU0JfQ1RSTF9QSFlTTEVFUDEgfAorCQkJCSAgIERNODE2WF9VU0JfQ1RSTF9QSFlTTEVFUDAsCisJCQkJICAgMCk7CisJcmVnbWFwX3JlYWQocGh5LT5zeXNjb24sIHBoeS0+dXNiX2N0cmwsICZ2YWwpOworCWlmICgodmFsICYgMykgIT0gMCkKKwkJZGV2X2luZm8ocGh5LT5kZXYsCisJCQkgIldvcmtpbmcgZG04MTZ4IFVTQl9DVFJMISAoMHglMDh4KVxuIiwKKwkJCSB2YWwpOworCisJLyoKKwkgKiBUSSBrZXJuZWwgc2V0cyB0aGVzZSB2YWx1ZXMgZm9yICJzeW1tZXRyaWNhbCBleWUgZGlhZ3JhbSBhbmQKKwkgKiBiZXR0ZXIgc2lnbmFsIHF1YWxpdHkiIHNvIGxldCdzIGFzc3VtZSBzb21lYm9keSBjaGVja2VkIHRoZQorCSAqIHZhbHVlcyB3aXRoIGEgc2NvcGUgYW5kIHNldCB0aGVtIGhlcmUgdG9vLgorCSAqLworCXJlZ21hcF9yZWFkKHBoeS0+c3lzY29uLCBwaHktPnVzYnBoeV9jdHJsLCAmdmFsKTsKKwl2YWwgfD0gRE04MTZYX1VTQlBIWV9DVFJMX1RYUklTRVRVTkUgfAorCQlETTgxNlhfVVNCUEhZX0NUUkxfVFhWUkVGVFVORSB8CisJCURNODE2WF9VU0JQSFlfQ1RSTF9UWFBSRUVNVFVORTsKKwlyZWdtYXBfd3JpdGUocGh5LT5zeXNjb24sIHBoeS0+dXNicGh5X2N0cmwsIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwaHlfb3BzIG9wcyA9IHsKKwkuaW5pdAkJPSBkbTgxNnhfdXNiX3BoeV9pbml0LAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgZG04MTZ4X3VzYl9waHlfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZG04MTZ4X3VzYl9waHkgKnBoeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGludCBtYXNrLCB2YWw7CisJaW50IGVycm9yID0gMDsKKworCW1hc2sgPSBCSVQocGh5LT5pbnN0YW5jZSk7CisJdmFsID0gfkJJVChwaHktPmluc3RhbmNlKTsKKwllcnJvciA9IHJlZ21hcF91cGRhdGVfYml0cyhwaHktPnN5c2NvbiwgcGh5LT51c2JfY3RybCwKKwkJCQkgICBtYXNrLCB2YWwpOworCWlmIChlcnJvcikKKwkJZGV2X2VycihwaHktPmRldiwgInBoeSVpIGZhaWxlZCB0byBwb3dlciBvZmZcbiIsCisJCQlwaHktPmluc3RhbmNlKTsKKwljbGtfZGlzYWJsZShwaHktPnJlZmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkbTgxNnhfdXNiX3BoeV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRtODE2eF91c2JfcGh5ICpwaHkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBpbnQgbWFzaywgdmFsOworCWludCBlcnJvcjsKKworCWVycm9yID0gY2xrX2VuYWJsZShwaHktPnJlZmNsayk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwkvKgorCSAqIE5vdGUgdGhhdCBhdCBsZWFzdCBkbTgxNnggcmV2IGMgZG9lcyBub3Qgc2VlbSB0byBkbworCSAqIGFueXRoaW5nIHdpdGggdGhlIFVTQl9DVFJMIHJlZ2lzdGVyLiBCdXQgbGV0J3MgZm9sbG93CisJICogd2hhdCB0aGUgVEkgdHJlZSBpcyBkb2luZyBpbiBjYXNlIGxhdGVyIHJldmlzaW9ucyB1c2UKKwkgKiBVU0JfQ1RSTC4KKwkgKi8KKwltYXNrID0gQklUKHBoeS0+aW5zdGFuY2UpOworCXZhbCA9IEJJVChwaHktPmluc3RhbmNlKTsKKwllcnJvciA9IHJlZ21hcF91cGRhdGVfYml0cyhwaHktPnN5c2NvbiwgcGh5LT51c2JfY3RybCwKKwkJCQkgICBtYXNrLCB2YWwpOworCWlmIChlcnJvcikgeworCQlkZXZfZXJyKHBoeS0+ZGV2LCAicGh5JWkgZmFpbGVkIHRvIHBvd2VyIG9uXG4iLAorCQkJcGh5LT5pbnN0YW5jZSk7CisJCWNsa19kaXNhYmxlKHBoeS0+cmVmY2xrKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgVU5JVkVSU0FMX0RFVl9QTV9PUFMoZG04MTZ4X3VzYl9waHlfcG1fb3BzLAorCQkJICAgIGRtODE2eF91c2JfcGh5X3J1bnRpbWVfc3VzcGVuZCwKKwkJCSAgICBkbTgxNnhfdXNiX3BoeV9ydW50aW1lX3Jlc3VtZSwKKwkJCSAgICBOVUxMKTsKKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZG04MTZ4X3VzYl9waHlfaWRfdGFibGVbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gInRpLGRtODE2OC11c2ItcGh5IiwKKwl9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGRtODE2eF91c2JfcGh5X2lkX3RhYmxlKTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGRtODE2eF91c2JfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRtODE2eF91c2JfcGh5ICpwaHk7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHBoeSAqZ2VuZXJpY19waHk7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCXN0cnVjdCB1c2Jfb3RnICpvdGc7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CisJY29uc3Qgc3RydWN0IHVzYl9waHlfZGF0YSAqcGh5X2RhdGE7CisJaW50IGVycm9yOworCisJb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKGRtODE2eF91c2JfcGh5X2lkX3RhYmxlKSwKKwkJCQkmcGRldi0+ZGV2KTsKKwlpZiAoIW9mX2lkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBoeSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBoeSksIEdGUF9LRVJORUwpOworCWlmICghcGh5KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PRU5UOworCisJcGh5LT5zeXNjb24gPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLAorCQkJCQkJICAgICAgInN5c2NvbiIpOworCWlmIChJU19FUlIocGh5LT5zeXNjb24pKQorCQlyZXR1cm4gUFRSX0VSUihwaHktPnN5c2Nvbik7CisKKwkvKgorCSAqIEFjY29yZGluZyB0byBzcHJzNjE0ZS5wZGYsIHRoZSBmaXJzdCB1c2JfY3RybCBpcyBzaGFyZWQgYW5kCisJICogdGhlIHNlY29uZCBpbnN0YW5jZSBmb3IgdXNiX2N0cmwgaXMgcmVzZXJ2ZWQuLiBBbHNvIHRoZQorCSAqIHJlZ2lzdGVyIGJpdHMgYXJlIGRpZmZlcmVudCBmcm9tIGVhcmxpZXIgVFJNcy4KKwkgKi8KKwlwaHktPnVzYl9jdHJsID0gMHgyMDsKKwlwaHktPnVzYnBoeV9jdHJsID0gKHJlcy0+c3RhcnQgJiAweGZmKSArIDQ7CisJaWYgKHBoeS0+dXNicGh5X2N0cmwgPT0gMHgyYykKKwkJcGh5LT5pbnN0YW5jZSA9IDE7CisKKwlwaHlfZGF0YSA9IG9mX2lkLT5kYXRhOworCisJb3RnID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqb3RnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvdGcpCisJCXJldHVybiAtRU5PTUVNOworCisJcGh5LT5kZXYgPSAmcGRldi0+ZGV2OworCXBoeS0+cGh5LmRldiA9IHBoeS0+ZGV2OworCXBoeS0+cGh5LmxhYmVsID0gImRtODE2OF91c2JfcGh5IjsKKwlwaHktPnBoeS5vdGcgPSBvdGc7CisJcGh5LT5waHkudHlwZSA9IFVTQl9QSFlfVFlQRV9VU0IyOworCW90Zy0+c2V0X2hvc3QgPSBkbTgxNnhfdXNiX3BoeV9zZXRfaG9zdDsKKwlvdGctPnNldF9wZXJpcGhlcmFsID0gZG04MTZ4X3VzYl9waHlfc2V0X3BlcmlwaGVyYWw7CisJb3RnLT51c2JfcGh5ID0gJnBoeS0+cGh5OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGh5KTsKKworCXBoeS0+cmVmY2xrID0gZGV2bV9jbGtfZ2V0KHBoeS0+ZGV2LCAicmVmY2xrIik7CisJaWYgKElTX0VSUihwaHktPnJlZmNsaykpCisJCXJldHVybiBQVFJfRVJSKHBoeS0+cmVmY2xrKTsKKwllcnJvciA9IGNsa19wcmVwYXJlKHBoeS0+cmVmY2xrKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCXBtX3J1bnRpbWVfZW5hYmxlKHBoeS0+ZGV2KTsKKwlnZW5lcmljX3BoeSA9IGRldm1fcGh5X2NyZWF0ZShwaHktPmRldiwgTlVMTCwgJm9wcyk7CisJaWYgKElTX0VSUihnZW5lcmljX3BoeSkpCisJCXJldHVybiBQVFJfRVJSKGdlbmVyaWNfcGh5KTsKKworCXBoeV9zZXRfZHJ2ZGF0YShnZW5lcmljX3BoeSwgcGh5KTsKKworCXBoeV9wcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKHBoeS0+ZGV2LAorCQkJCQkJICAgICBvZl9waHlfc2ltcGxlX3hsYXRlKTsKKwlpZiAoSVNfRVJSKHBoeV9wcm92aWRlcikpCisJCXJldHVybiBQVFJfRVJSKHBoeV9wcm92aWRlcik7CisKKwl1c2JfYWRkX3BoeV9kZXYoJnBoeS0+cGh5KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRtODE2eF91c2JfcGh5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkbTgxNnhfdXNiX3BoeSAqcGh5ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwl1c2JfcmVtb3ZlX3BoeSgmcGh5LT5waHkpOworCXBtX3J1bnRpbWVfZGlzYWJsZShwaHktPmRldik7CisJY2xrX3VucHJlcGFyZShwaHktPnJlZmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZG04MTZ4X3VzYl9waHlfZHJpdmVyID0geworCS5wcm9iZQkJPSBkbTgxNnhfdXNiX3BoeV9wcm9iZSwKKwkucmVtb3ZlCQk9IGRtODE2eF91c2JfcGh5X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiZG04MTZ4LXVzYi1waHkiLAorCQkucG0JPSAmZG04MTZ4X3VzYl9waHlfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoZG04MTZ4X3VzYl9waHlfaWRfdGFibGUpLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGRtODE2eF91c2JfcGh5X2RyaXZlcik7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06ZG04MTZ4X3VzYiIpOworTU9EVUxFX0FVVEhPUigiVG9ueSBMaW5kZ3JlbiA8dG9ueUBhdG9taWRlLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiZG04MTZ4IHVzYiBwaHkgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zLWRwLXZpZGVvLmMgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zLWRwLXZpZGVvLmMKaW5kZXggZjg2Y2JlNi4uMTc5Y2JmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWV4eW5vcy1kcC12aWRlby5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3MtZHAtdmlkZW8uYwpAQCAtMzAsMjggKzMwLDEzIEBACiAJY29uc3Qgc3RydWN0IGV4eW5vc19kcF92aWRlb19waHlfZHJ2ZGF0YSAqZHJ2ZGF0YTsKIH07CiAKLXN0YXRpYyB2b2lkIGV4eW5vc19kcF92aWRlb19waHlfcHdyX2lzb2woc3RydWN0IGV4eW5vc19kcF92aWRlb19waHkgKnN0YXRlLAotCQkJCQkJCXVuc2lnbmVkIGludCBvbikKLXsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCi0JaWYgKElTX0VSUihzdGF0ZS0+cmVncykpCi0JCXJldHVybjsKLQotCXZhbCA9IG9uID8gMCA6IEVYWU5PUzVfUEhZX0VOQUJMRTsKLQotCXJlZ21hcF91cGRhdGVfYml0cyhzdGF0ZS0+cmVncywgc3RhdGUtPmRydmRhdGEtPnBoeV9jdHJsX29mZnNldCwKLQkJCSAgIEVYWU5PUzVfUEhZX0VOQUJMRSwgdmFsKTsKLX0KLQogc3RhdGljIGludCBleHlub3NfZHBfdmlkZW9fcGh5X3Bvd2VyX29uKHN0cnVjdCBwaHkgKnBoeSkKIHsKIAlzdHJ1Y3QgZXh5bm9zX2RwX3ZpZGVvX3BoeSAqc3RhdGUgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKIAogCS8qIERpc2FibGUgcG93ZXIgaXNvbGF0aW9uIG9uIERQLVBIWSAqLwotCWV4eW5vc19kcF92aWRlb19waHlfcHdyX2lzb2woc3RhdGUsIDApOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhzdGF0ZS0+cmVncywgc3RhdGUtPmRydmRhdGEtPnBoeV9jdHJsX29mZnNldCwKKwkJCQkgIEVYWU5PUzVfUEhZX0VOQUJMRSwgRVhZTk9TNV9QSFlfRU5BQkxFKTsKIH0KIAogc3RhdGljIGludCBleHlub3NfZHBfdmlkZW9fcGh5X3Bvd2VyX29mZihzdHJ1Y3QgcGh5ICpwaHkpCkBAIC01OSw5ICs0NCw4IEBACiAJc3RydWN0IGV4eW5vc19kcF92aWRlb19waHkgKnN0YXRlID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7CiAKIAkvKiBFbmFibGUgcG93ZXIgaXNvbGF0aW9uIG9uIERQLVBIWSAqLwotCWV4eW5vc19kcF92aWRlb19waHlfcHdyX2lzb2woc3RhdGUsIDEpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhzdGF0ZS0+cmVncywgc3RhdGUtPmRydmRhdGEtPnBoeV9jdHJsX29mZnNldCwKKwkJCQkgIEVYWU5PUzVfUEhZX0VOQUJMRSwgMCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGh5X29wcyBleHlub3NfZHBfdmlkZW9fcGh5X29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1leHlub3MtbWlwaS12aWRlby5jIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vcy1taXBpLXZpZGVvLmMKaW5kZXggZjAxN2IyZi4uZGY3NTE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWV4eW5vcy1taXBpLXZpZGVvLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vcy1taXBpLXZpZGVvLmMKQEAgLTQzLDcgKzQzLDYgQEAKIAl9IHBoeXNbRVhZTk9TX01JUElfUEhZU19OVU1dOwogCXNwaW5sb2NrX3Qgc2xvY2s7CiAJdm9pZCBfX2lvbWVtICpyZWdzOwotCXN0cnVjdCBtdXRleCBtdXRleDsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiB9OwogCkBAIC01OSw4ICs1OCw5IEBACiAJZWxzZQogCQlyZXNldCA9IEVYWU5PUzRfTUlQSV9QSFlfU1JFU0VUTjsKIAotCWlmIChzdGF0ZS0+cmVnbWFwKSB7Ci0JCW11dGV4X2xvY2soJnN0YXRlLT5tdXRleCk7CisJc3Bpbl9sb2NrKCZzdGF0ZS0+c2xvY2spOworCisJaWYgKCFJU19FUlIoc3RhdGUtPnJlZ21hcCkpIHsKIAkJcmVnbWFwX3JlYWQoc3RhdGUtPnJlZ21hcCwgb2Zmc2V0LCAmdmFsKTsKIAkJaWYgKG9uKQogCQkJdmFsIHw9IHJlc2V0OwpAQCAtNzIsMTEgKzcyLDkgQEAKIAkJZWxzZSBpZiAoISh2YWwgJiBFWFlOT1M0X01JUElfUEhZX1JFU0VUX01BU0spKQogCQkJdmFsICY9IH5FWFlOT1M0X01JUElfUEhZX0VOQUJMRTsKIAkJcmVnbWFwX3dyaXRlKHN0YXRlLT5yZWdtYXAsIG9mZnNldCwgdmFsKTsKLQkJbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+bXV0ZXgpOwogCX0gZWxzZSB7CiAJCWFkZHIgPSBzdGF0ZS0+cmVncyArIEVYWU5PU19NSVBJX1BIWV9DT05UUk9MKGlkIC8gMik7CiAKLQkJc3Bpbl9sb2NrKCZzdGF0ZS0+c2xvY2spOwogCQl2YWwgPSByZWFkbChhZGRyKTsKIAkJaWYgKG9uKQogCQkJdmFsIHw9IHJlc2V0OwpAQCAtOTAsOSArODgsOSBAQAogCQkJdmFsICY9IH5FWFlOT1M0X01JUElfUEhZX0VOQUJMRTsKIAogCQl3cml0ZWwodmFsLCBhZGRyKTsKLQkJc3Bpbl91bmxvY2soJnN0YXRlLT5zbG9jayk7CiAJfQogCisJc3Bpbl91bmxvY2soJnN0YXRlLT5zbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE1OCw3ICsxNTYsNiBAQAogCiAJZGV2X3NldF9kcnZkYXRhKGRldiwgc3RhdGUpOwogCXNwaW5fbG9ja19pbml0KCZzdGF0ZS0+c2xvY2spOwotCW11dGV4X2luaXQoJnN0YXRlLT5tdXRleCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgRVhZTk9TX01JUElfUEhZU19OVU07IGkrKykgewogCQlzdHJ1Y3QgcGh5ICpwaHkgPSBkZXZtX3BoeV9jcmVhdGUoZGV2LCBOVUxMLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWV4eW5vczQyMTAtdXNiMi5jIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vczQyMTAtdXNiMi5jCmluZGV4IDIzNmE1MmEuLmYzMGJiYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1leHlub3M0MjEwLXVzYjIuYworKysgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNDIxMC11c2IyLmMKQEAgLTI1MCw3ICsyNTAsNiBAQAogCQkucG93ZXJfb24JPSBleHlub3M0MjEwX3Bvd2VyX29uLAogCQkucG93ZXJfb2ZmCT0gZXh5bm9zNDIxMF9wb3dlcl9vZmYsCiAJfSwKLQl7fSwKIH07CiAKIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3VzYjJfcGh5X2NvbmZpZyBleHlub3M0MjEwX3VzYjJfcGh5X2NvbmZpZyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1leHlub3M0eDEyLXVzYjIuYyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M0eDEyLXVzYjIuYwppbmRleCAwYjlkZTg4Li43NjVkYTkwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zNHgxMi11c2IyLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LWV4eW5vczR4MTItdXNiMi5jCkBAIC0zNjEsNyArMzYxLDYgQEAKIAkJLnBvd2VyX29uCT0gZXh5bm9zNHgxMl9wb3dlcl9vbiwKIAkJLnBvd2VyX29mZgk9IGV4eW5vczR4MTJfcG93ZXJfb2ZmLAogCX0sCi0Je30sCiB9OwogCiBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9jb25maWcgZXh5bm9zMzI1MF91c2IyX3BoeV9jb25maWcgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zNS11c2JkcmQuYyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M1LXVzYmRyZC5jCmluZGV4IDA0Mzc0MDEuLmQ3MmVmMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1leHlub3M1LXVzYmRyZC5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M1LXVzYmRyZC5jCkBAIC01MzEsNyArNTMxLDcgQEAKIHsKIAlzdHJ1Y3QgZXh5bm9zNV91c2JkcmRfcGh5ICpwaHlfZHJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlpZiAoV0FSTl9PTihhcmdzLT5hcmdzWzBdID4gRVhZTk9TNV9EUkRQSFlTX05VTSkpCisJaWYgKFdBUk5fT04oYXJncy0+YXJnc1swXSA+PSBFWFlOT1M1X0RSRFBIWVNfTlVNKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CiAKIAlyZXR1cm4gcGh5X2RyZC0+cGh5c1thcmdzLT5hcmdzWzBdXS5waHk7CkBAIC02MjQsNiArNjI0LDEzIEBACiAJLmhhc19jb21tb25fY2xrX2dhdGUJPSB0cnVlLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3M1X3VzYmRyZF9waHlfZHJ2ZGF0YSBleHlub3M1NDMzX3VzYmRyZF9waHkgPSB7CisJLnBoeV9jZmcJCT0gcGh5X2NmZ19leHlub3M1LAorCS5wbXVfb2Zmc2V0X3VzYmRyZDBfcGh5CT0gRVhZTk9TNV9VU0JEUkRfUEhZX0NPTlRST0wsCisJLnBtdV9vZmZzZXRfdXNiZHJkMV9waHkJPSBFWFlOT1M1NDMzX1VTQkhPU1QzMF9QSFlfQ09OVFJPTCwKKwkuaGFzX2NvbW1vbl9jbGtfZ2F0ZQk9IGZhbHNlLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCBleHlub3M1X3VzYmRyZF9waHlfZHJ2ZGF0YSBleHlub3M3X3VzYmRyZF9waHkgPSB7CiAJLnBoeV9jZmcJCT0gcGh5X2NmZ19leHlub3M1LAogCS5wbXVfb2Zmc2V0X3VzYmRyZDBfcGh5CT0gRVhZTk9TNV9VU0JEUkRfUEhZX0NPTlRST0wsCkBAIC02MzgsNiArNjQ1LDkgQEAKIAkJLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1NDIwLXVzYmRyZC1waHkiLAogCQkuZGF0YSA9ICZleHlub3M1NDIwX3VzYmRyZF9waHkKIAl9LCB7CisJCS5jb21wYXRpYmxlID0gInNhbXN1bmcsZXh5bm9zNTQzMy11c2JkcmQtcGh5IiwKKwkJLmRhdGEgPSAmZXh5bm9zNTQzM191c2JkcmRfcGh5CisJfSwgewogCQkuY29tcGF0aWJsZSA9ICJzYW1zdW5nLGV4eW5vczctdXNiZHJkLXBoeSIsCiAJCS5kYXRhID0gJmV4eW5vczdfdXNiZHJkX3BoeQogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktZXh5bm9zNTI1MC11c2IyLmMgYi9kcml2ZXJzL3BoeS9waHktZXh5bm9zNTI1MC11c2IyLmMKaW5kZXggMWMxMzlhYS4uMmVkMTczNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LWV4eW5vczUyNTAtdXNiMi5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1leHlub3M1MjUwLXVzYjIuYwpAQCAtMzkxLDcgKzM5MSw2IEBACiAJCS5wb3dlcl9vbgk9IGV4eW5vczUyNTBfcG93ZXJfb24sCiAJCS5wb3dlcl9vZmYJPSBleHlub3M1MjUwX3Bvd2VyX29mZiwKIAl9LAotCXt9LAogfTsKIAogY29uc3Qgc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfY29uZmlnIGV4eW5vczUyNTBfdXNiMl9waHlfY29uZmlnID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LWhpeDVoZDItc2F0YS5jIGIvZHJpdmVycy9waHkvcGh5LWhpeDVoZDItc2F0YS5jCmluZGV4IDM0OTE1YjQuLmQ2YjIyNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1oaXg1aGQyLXNhdGEuYworKysgYi9kcml2ZXJzL3BoeS9waHktaGl4NWhkMi1zYXRhLmMKQEAgLTE0Nyw2ICsxNDcsOSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRUlOVkFMOworCiAJcHJpdi0+YmFzZSA9IGRldm1faW9yZW1hcChkZXYsIHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAJaWYgKCFwcml2LT5iYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1taXBoeTI4bHAuYyBiL2RyaXZlcnMvcGh5L3BoeS1taXBoeTI4bHAuYwppbmRleCA5YjI4NDhlLi5jNGNjMTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktbWlwaHkyOGxwLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LW1pcGh5MjhscC5jCkBAIC0yMjgsNiArMjI4LDcgQEAKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJc3RydWN0IG11dGV4IG1pcGh5X211dGV4OwogCXN0cnVjdCBtaXBoeTI4bHBfcGh5ICoqcGh5czsKKwlpbnQgbnBoeXM7CiB9OwogCiBzdHJ1Y3QgbWlwaHlfaW5pdHZhbCB7CkBAIC0xMTE2LDcgKzExMTcsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBvZl9nZXRfY2hpbGRfY291bnQoZGV2LT5vZl9ub2RlKTsgaW5kZXgrKykKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtaXBoeV9kZXYtPm5waHlzOyBpbmRleCsrKQogCQlpZiAocGh5bm9kZSA9PSBtaXBoeV9kZXYtPnBoeXNbaW5kZXhdLT5waHktPmRldi5vZl9ub2RlKSB7CiAJCQltaXBoeV9waHkgPSBtaXBoeV9kZXYtPnBoeXNbaW5kZXhdOwogCQkJYnJlYWs7CkBAIC0xMTM4LDYgKzExMzksNyBAQAogCiBzdGF0aWMgc3RydWN0IHBoeV9vcHMgbWlwaHkyOGxwX29wcyA9IHsKIAkuaW5pdCA9IG1pcGh5MjhscF9pbml0LAorCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAogc3RhdGljIGludCBtaXBoeTI4bHBfcHJvYmVfcmVzZXRzKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKQEAgLTEyMDAsMTYgKzEyMDIsMTUgQEAKIAlzdHJ1Y3QgbWlwaHkyOGxwX2RldiAqbWlwaHlfZGV2OwogCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnByb3ZpZGVyOwogCXN0cnVjdCBwaHkgKnBoeTsKLQlpbnQgY2hhbmNvdW50LCBwb3J0ID0gMDsKLQlpbnQgcmV0OworCWludCByZXQsIHBvcnQgPSAwOwogCiAJbWlwaHlfZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbWlwaHlfZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtaXBoeV9kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JY2hhbmNvdW50ID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5wKTsKLQltaXBoeV9kZXYtPnBoeXMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHBoeSkgKiBjaGFuY291bnQsCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOworCW1pcGh5X2Rldi0+bnBoeXMgPSBvZl9nZXRfY2hpbGRfY291bnQobnApOworCW1pcGh5X2Rldi0+cGh5cyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBtaXBoeV9kZXYtPm5waHlzLAorCQkJCSAgICAgICBzaXplb2YoKm1pcGh5X2Rldi0+cGh5cyksIEdGUF9LRVJORUwpOwogCWlmICghbWlwaHlfZGV2LT5waHlzKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTI1OCwxMCArMTI1OSw3IEBACiAJfQogCiAJcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcigmcGRldi0+ZGV2LCBtaXBoeTI4bHBfeGxhdGUpOwotCWlmIChJU19FUlIocHJvdmlkZXIpKQotCQlyZXR1cm4gUFRSX0VSUihwcm92aWRlcik7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHByb3ZpZGVyKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbWlwaHkyOGxwX29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9waHktbWlwaHkzNjV4LmMgYi9kcml2ZXJzL3BoeS9waHktbWlwaHkzNjV4LmMKaW5kZXggNmM4MDE1NC4uMDE5YzJkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LW1pcGh5MzY1eC5jCisrKyBiL2RyaXZlcnMvcGh5L3BoeS1taXBoeTM2NXguYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC9zeXNjb24uaD4KICNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KIAotI2luY2x1ZGUgPGR0LWJpbmRpbmdzL3BoeS9waHktbWlwaHkzNjV4Lmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvcGh5L3BoeS5oPgogCiAjZGVmaW5lIEhGQ19USU1FT1VUCQkxMDAKIApAQCAtMTUwLDYgKzE1MCw3IEBACiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCXN0cnVjdCBtdXRleCBtaXBoeV9tdXRleDsKIAlzdHJ1Y3QgbWlwaHkzNjV4X3BoeSAqKnBoeXM7CisJaW50IG5waHlzOwogfTsKIAogLyoKQEAgLTE3Niw3ICsxNzcsNyBAQAogc3RhdGljIGludCBtaXBoeTM2NXhfc2V0X3BhdGgoc3RydWN0IG1pcGh5MzY1eF9waHkgKm1pcGh5X3BoeSwKIAkJCSAgICAgIHN0cnVjdCBtaXBoeTM2NXhfZGV2ICptaXBoeV9kZXYpCiB7Ci0JYm9vbCBzYXRhID0gKG1pcGh5X3BoeS0+dHlwZSA9PSBNSVBIWV9UWVBFX1NBVEEpOworCWJvb2wgc2F0YSA9IChtaXBoeV9waHktPnR5cGUgPT0gUEhZX1RZUEVfU0FUQSk7CiAKIAlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKG1pcGh5X2Rldi0+cmVnbWFwLAogCQkJCSAgbWlwaHlfcGh5LT5jdHJscmVnLApAQCAtNDMwLDcgKzQzMSw3IEBACiAJfQogCiAJLyogSW5pdGlhbGlzZSBNaXBoeSBmb3IgUENJZSBvciBTQVRBICovCi0JaWYgKG1pcGh5X3BoeS0+dHlwZSA9PSBNSVBIWV9UWVBFX1BDSUUpCisJaWYgKG1pcGh5X3BoeS0+dHlwZSA9PSBQSFlfVFlQRV9QQ0lFKQogCQlyZXQgPSBtaXBoeTM2NXhfaW5pdF9wY2llX3BvcnQobWlwaHlfcGh5LCBtaXBoeV9kZXYpOwogCWVsc2UKIAkJcmV0ID0gbWlwaHkzNjV4X2luaXRfc2F0YV9wb3J0KG1pcGh5X3BoeSwgbWlwaHlfZGV2KTsKQEAgLTQ1NCw4ICs0NTUsOCBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCWlmICghKCghc3RybmNtcChuYW1lLCAic2F0YSIsIDQpICYmIHR5cGUgPT0gTUlQSFlfVFlQRV9TQVRBKSB8fAotCSAgICAgICghc3RybmNtcChuYW1lLCAicGNpZSIsIDQpICYmIHR5cGUgPT0gTUlQSFlfVFlQRV9QQ0lFKSkpCisJaWYgKCEoKCFzdHJuY21wKG5hbWUsICJzYXRhIiwgNCkgJiYgdHlwZSA9PSBQSFlfVFlQRV9TQVRBKSB8fAorCSAgICAgICghc3RybmNtcChuYW1lLCAicGNpZSIsIDQpICYmIHR5cGUgPT0gUEhZX1RZUEVfUENJRSkpKQogCQlyZXR1cm4gMDsKIAogCW1pcGh5X3BoeS0+YmFzZSA9IG9mX2lvbWFwKHBoeW5vZGUsIGluZGV4KTsKQEAgLTQ4NSw3ICs0ODYsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CiAKLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBvZl9nZXRfY2hpbGRfY291bnQoZGV2LT5vZl9ub2RlKTsgaW5kZXgrKykKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtaXBoeV9kZXYtPm5waHlzOyBpbmRleCsrKQogCQlpZiAocGh5bm9kZSA9PSBtaXBoeV9kZXYtPnBoeXNbaW5kZXhdLT5waHktPmRldi5vZl9ub2RlKSB7CiAJCQltaXBoeV9waHkgPSBtaXBoeV9kZXYtPnBoeXNbaW5kZXhdOwogCQkJYnJlYWs7CkBAIC00OTgsOCArNDk5LDggQEAKIAogCW1pcGh5X3BoeS0+dHlwZSA9IGFyZ3MtPmFyZ3NbMF07CiAKLQlpZiAoIShtaXBoeV9waHktPnR5cGUgPT0gTUlQSFlfVFlQRV9TQVRBIHx8Ci0JICAgICAgbWlwaHlfcGh5LT50eXBlID09IE1JUEhZX1RZUEVfUENJRSkpIHsKKwlpZiAoIShtaXBoeV9waHktPnR5cGUgPT0gUEhZX1RZUEVfU0FUQSB8fAorCSAgICAgIG1pcGh5X3BoeS0+dHlwZSA9PSBQSFlfVFlQRV9QQ0lFKSkgewogCQlkZXZfZXJyKGRldiwgIlVuc3VwcG9ydGVkIGRldmljZSB0eXBlOiAlZFxuIiwgbWlwaHlfcGh5LT50eXBlKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQpAQCAtNTQxLDE2ICs1NDIsMTUgQEAKIAlzdHJ1Y3QgbWlwaHkzNjV4X2RldiAqbWlwaHlfZGV2OwogCXN0cnVjdCBwaHlfcHJvdmlkZXIgKnByb3ZpZGVyOwogCXN0cnVjdCBwaHkgKnBoeTsKLQlpbnQgY2hhbmNvdW50LCBwb3J0ID0gMDsKLQlpbnQgcmV0OworCWludCByZXQsIHBvcnQgPSAwOwogCiAJbWlwaHlfZGV2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbWlwaHlfZGV2KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtaXBoeV9kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JY2hhbmNvdW50ID0gb2ZfZ2V0X2NoaWxkX2NvdW50KG5wKTsKLQltaXBoeV9kZXYtPnBoeXMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHBoeSkgKiBjaGFuY291bnQsCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOworCW1pcGh5X2Rldi0+bnBoeXMgPSBvZl9nZXRfY2hpbGRfY291bnQobnApOworCW1pcGh5X2Rldi0+cGh5cyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBtaXBoeV9kZXYtPm5waHlzLAorCQkJCSAgICAgICBzaXplb2YoKm1pcGh5X2Rldi0+cGh5cyksIEdGUF9LRVJORUwpOwogCWlmICghbWlwaHlfZGV2LT5waHlzKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LW9tYXAtY29udHJvbC5jIGIvZHJpdmVycy9waHkvcGh5LW9tYXAtY29udHJvbC5jCmluZGV4IGVmZTcyNGYuLmU5YzQxYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1vbWFwLWNvbnRyb2wuYworKysgYi9kcml2ZXJzL3BoeS9waHktb21hcC1jb250cm9sLmMKQEAgLTIxNiw3ICsyMTYsNiBAQAogCQlyZXR1cm47CiAKIAljdHJsX3BoeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCiAJaWYgKCFjdHJsX3BoeSkgewogCQlkZXZfZXJyKGRldiwgIkludmFsaWQgY29udHJvbCBwaHkgZGV2aWNlXG4iKTsKIAkJcmV0dXJuOwpAQCAtMjQxLDggKzI0MCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX2NvbnRyb2xfdXNiX3NldF9tb2RlKTsKIAotI2lmZGVmIENPTkZJR19PRgotCiBzdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgb3RnaHNfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX09UR0hTOwogc3RhdGljIGNvbnN0IGVudW0gb21hcF9jb250cm9sX3BoeV90eXBlIHVzYjJfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX1VTQjI7CiBzdGF0aWMgY29uc3QgZW51bSBvbWFwX2NvbnRyb2xfcGh5X3R5cGUgcGlwZTNfZGF0YSA9IE9NQVBfQ1RSTF9UWVBFX1BJUEUzOwpAQCAtMjc4LDggKzI3NSw2IEBACiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgb21hcF9jb250cm9sX3BoeV9pZF90YWJsZSk7Ci0jZW5kaWYKLQogCiBzdGF0aWMgaW50IG9tYXBfY29udHJvbF9waHlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKQEAgLTI4Nyw4ICsyODIsNyBAQAogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOwogCXN0cnVjdCBvbWFwX2NvbnRyb2xfcGh5ICpjb250cm9sX3BoeTsKIAotCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKG9mX21hdGNoX3B0cihvbWFwX2NvbnRyb2xfcGh5X2lkX3RhYmxlKSwKLQkJCQkmcGRldi0+ZGV2KTsKKwlvZl9pZCA9IG9mX21hdGNoX2RldmljZShvbWFwX2NvbnRyb2xfcGh5X2lkX3RhYmxlLCAmcGRldi0+ZGV2KTsKIAlpZiAoIW9mX2lkKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMzQ0LDcgKzMzOCw3IEBACiAJLnByb2JlCQk9IG9tYXBfY29udHJvbF9waHlfcHJvYmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gIm9tYXAtY29udHJvbC1waHkiLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIob21hcF9jb250cm9sX3BoeV9pZF90YWJsZSksCisJCS5vZl9tYXRjaF90YWJsZSA9IG9tYXBfY29udHJvbF9waHlfaWRfdGFibGUsCiAJfSwKIH07CiAKQEAgLTM2MCw3ICszNTQsNyBAQAogfQogbW9kdWxlX2V4aXQob21hcF9jb250cm9sX3BoeV9leGl0KTsKIAotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTogb21hcF9jb250cm9sX3BoeSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpvbWFwX2NvbnRyb2xfcGh5Iik7CiBNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cyBJbmMuIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk9NQVAgQ29udHJvbCBNb2R1bGUgUEhZIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LW9tYXAtdXNiMi5jIGIvZHJpdmVycy9waHkvcGh5LW9tYXAtdXNiMi5jCmluZGV4IDZmNGFlZjMuLjE4M2VmNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1vbWFwLXVzYjIuYworKysgYi9kcml2ZXJzL3BoeS9waHktb21hcC11c2IyLmMKQEAgLTE0NCw3ICsxNDQsNiBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIH07CiAKLSNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX3BoeV9kYXRhIG9tYXBfdXNiMl9kYXRhID0gewogCS5sYWJlbCA9ICJvbWFwX3VzYjIiLAogCS5mbGFncyA9IE9NQVBfVVNCMl9IQVNfU1RBUlRfU1JQIHwgT01BUF9VU0IyX0hBU19TRVRfVkJVUywKQEAgLTE4NSw3ICsxODQsNiBAQAogCXt9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9tYXBfdXNiMl9pZF90YWJsZSk7Ci0jZW5kaWYKIAogc3RhdGljIGludCBvbWFwX3VzYjJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKQEAgLTIwMCw3ICsxOTgsNyBAQAogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOwogCXN0cnVjdCB1c2JfcGh5X2RhdGEgKnBoeV9kYXRhOwogCi0Jb2ZfaWQgPSBvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKG9tYXBfdXNiMl9pZF90YWJsZSksICZwZGV2LT5kZXYpOworCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKG9tYXBfdXNiMl9pZF90YWJsZSwgJnBkZXYtPmRldik7CiAKIAlpZiAoIW9mX2lkKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI5NiwxMCArMjk0LDExIEBACiAJCQlkZXZfd2FybigmcGRldi0+ZGV2LAogCQkJCSAiZm91bmQgdXNiX290Z19zc19yZWZjbGs5NjBtLCBwbGVhc2UgZml4IERUU1xuIik7CiAJCX0KLQl9IGVsc2UgewotCQljbGtfcHJlcGFyZShwaHktPm9wdGNsayk7CiAJfQogCisJaWYgKCFJU19FUlIocGh5LT5vcHRjbGspKQorCQljbGtfcHJlcGFyZShwaHktPm9wdGNsayk7CisKIAl1c2JfYWRkX3BoeV9kZXYoJnBoeS0+cGh5KTsKIAogCXJldHVybiAwOwpAQCAtMzc3LDEzICszNzYsMTMgQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAib21hcC11c2IyIiwKIAkJLnBtCT0gREVWX1BNX09QUywKLQkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG9tYXBfdXNiMl9pZF90YWJsZSksCisJCS5vZl9tYXRjaF90YWJsZSA9IG9tYXBfdXNiMl9pZF90YWJsZSwKIAl9LAogfTsKIAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihvbWFwX3VzYjJfZHJpdmVyKTsKIAotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTogb21hcF91c2IyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm9tYXBfdXNiMiIpOwogTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMgSW5jLiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQIFVTQjIgcGh5IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXFjb20tdWZzLmMgYi9kcml2ZXJzL3BoeS9waHktcWNvbS11ZnMuYwppbmRleCA0NGVlOTgzLi5mOWM2MThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktcWNvbS11ZnMuYworKysgYi9kcml2ZXJzL3BoeS9waHktcWNvbS11ZnMuYwpAQCAtNzMsNiArNzMsNyBAQAogb3V0OgogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1ZnNfcWNvbV9waHlfY2FsaWJyYXRlKTsKIAogc3RydWN0IHBoeSAqdWZzX3Fjb21fcGh5X2dlbmVyaWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJCQlzdHJ1Y3QgdWZzX3Fjb21fcGh5ICpjb21tb25fY2ZnLApAQCAtMTAxLDYgKzEwMiw3IEBACiAJaWYgKElTX0VSUihnZW5lcmljX3BoeSkpIHsKIAkJZXJyID0gIFBUUl9FUlIoZ2VuZXJpY19waHkpOwogCQlkZXZfZXJyKGRldiwgIiVzOiBmYWlsZWQgdG8gY3JlYXRlIHBoeSAlZFxuIiwgX19mdW5jX18sIGVycik7CisJCWdlbmVyaWNfcGh5ID0gTlVMTDsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xMTAsNiArMTEyLDcgQEAKIG91dDoKIAlyZXR1cm4gZ2VuZXJpY19waHk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1ZnNfcWNvbV9waHlfZ2VuZXJpY19wcm9iZSk7CiAKIC8qCiAgKiBUaGlzIGFzc3VtZXMgdGhlIGVtYmVkZGVkIHBoeSBzdHJ1Y3R1cmUgaW5zaWRlIGdlbmVyaWNfcGh5IGlzIG9mIHR5cGUKQEAgLTEyMSw2ICsxMjQsNyBAQAogewogCXJldHVybiAoc3RydWN0IHVmc19xY29tX3BoeSAqKXBoeV9nZXRfZHJ2ZGF0YShnZW5lcmljX3BoeSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChnZXRfdWZzX3Fjb21fcGh5KTsKIAogc3RhdGljCiBpbnQgdWZzX3Fjb21fcGh5X2Jhc2VfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LApAQCAtMTMxLDQwICsxMzUsMjMgQEAKIAlpbnQgZXJyID0gMDsKIAogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJwaHlfbWVtIik7Ci0JaWYgKCFyZXMpIHsKLQkJZGV2X2VycihkZXYsICIlczogcGh5X21lbSByZXNvdXJjZSBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJcGh5X2NvbW1vbi0+bW1pbyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7CiAJaWYgKElTX0VSUigodm9pZCBjb25zdCAqKXBoeV9jb21tb24tPm1taW8pKSB7CiAJCWVyciA9IFBUUl9FUlIoKHZvaWQgY29uc3QgKilwaHlfY29tbW9uLT5tbWlvKTsKIAkJcGh5X2NvbW1vbi0+bW1pbyA9IE5VTEw7CiAJCWRldl9lcnIoZGV2LCAiJXM6IGlvcmVtYXAgZm9yIHBoeV9tZW0gcmVzb3VyY2UgZmFpbGVkICVkXG4iLAogCQkJX19mdW5jX18sIGVycik7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gZXJyOwogCX0KIAogCS8qICJkZXZfcmVmX2Nsa19jdHJsX21lbSIgaXMgb3B0aW9uYWwgcmVzb3VyY2UgKi8KIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAogCQkJCQkgICAiZGV2X3JlZl9jbGtfY3RybF9tZW0iKTsKLQlpZiAoIXJlcykgewotCQlkZXZfZGJnKGRldiwgIiVzOiBkZXZfcmVmX2Nsa19jdHJsX21lbSByZXNvdXJjZSBub3QgZm91bmRcbiIsCi0JCQlfX2Z1bmNfXyk7Ci0JCWdvdG8gb3V0OwotCX0KLQogCXBoeV9jb21tb24tPmRldl9yZWZfY2xrX2N0cmxfbW1pbyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7Ci0JaWYgKElTX0VSUigodm9pZCBjb25zdCAqKXBoeV9jb21tb24tPmRldl9yZWZfY2xrX2N0cmxfbW1pbykpIHsKLQkJZXJyID0gUFRSX0VSUigodm9pZCBjb25zdCAqKXBoeV9jb21tb24tPmRldl9yZWZfY2xrX2N0cmxfbW1pbyk7CisJaWYgKElTX0VSUigodm9pZCBjb25zdCAqKXBoeV9jb21tb24tPmRldl9yZWZfY2xrX2N0cmxfbW1pbykpCiAJCXBoeV9jb21tb24tPmRldl9yZWZfY2xrX2N0cmxfbW1pbyA9IE5VTEw7Ci0JCWRldl9lcnIoZGV2LCAiJXM6IGlvcmVtYXAgZm9yIGRldl9yZWZfY2xrX2N0cmxfbWVtIHJlc291cmNlIGZhaWxlZCAlZFxuIiwKLQkJCV9fZnVuY19fLCBlcnIpOwotCX0KIAotb3V0OgotCXJldHVybiBlcnI7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgX191ZnNfcWNvbV9waHlfY2xrX2dldChzdHJ1Y3QgcGh5ICpwaHksCkBAIC0yMjgsNiArMjE1LDcgQEAKIG91dDoKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodWZzX3Fjb21fcGh5X2luaXRfY2xrcyk7CiAKIGludAogdWZzX3Fjb21fcGh5X2luaXRfdnJlZ3VsYXRvcnMoc3RydWN0IHBoeSAqZ2VuZXJpY19waHksCkBAIC0yNTIsNiArMjQwLDcgQEAKIG91dDoKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodWZzX3Fjb21fcGh5X2luaXRfdnJlZ3VsYXRvcnMpOwogCiBzdGF0aWMgaW50IF9fdWZzX3Fjb21fcGh5X2luaXRfdnJlZyhzdHJ1Y3QgcGh5ICpwaHksCiAJCXN0cnVjdCB1ZnNfcWNvbV9waHlfdnJlZyAqdnJlZywgY29uc3QgY2hhciAqbmFtZSwgYm9vbCBvcHRpb25hbCkKQEAgLTM0NiwxMCArMzM1LDEwIEBACiAJCQlnb3RvIG91dDsKIAkJfQogCQl1QV9sb2FkID0gb24gPyB2cmVnLT5tYXhfdUEgOiAwOwotCQlyZXQgPSByZWd1bGF0b3Jfc2V0X29wdGltdW1fbW9kZShyZWcsIHVBX2xvYWQpOworCQlyZXQgPSByZWd1bGF0b3Jfc2V0X2xvYWQocmVnLCB1QV9sb2FkKTsKIAkJaWYgKHJldCA+PSAwKSB7CiAJCQkvKgotCQkJICogcmVndWxhdG9yX3NldF9vcHRpbXVtX21vZGUoKSByZXR1cm5zIG5ldyByZWd1bGF0b3IKKwkJCSAqIHJlZ3VsYXRvcl9zZXRfbG9hZCgpIHJldHVybnMgbmV3IHJlZ3VsYXRvcgogCQkJICogbW9kZSB1cG9uIHN1Y2Nlc3MuCiAJCQkgKi8KIAkJCXJldCA9IDA7CkBAIC02NDcsNiArNjM2LDcgQEAKIAogCXJldHVybiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodWZzX3Fjb21fcGh5X3JlbW92ZSk7CiAKIGludCB1ZnNfcWNvbV9waHlfZXhpdChzdHJ1Y3QgcGh5ICpnZW5lcmljX3BoeSkKIHsKQEAgLTY1Nyw2ICs2NDcsNyBAQAogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh1ZnNfcWNvbV9waHlfZXhpdCk7CiAKIGludCB1ZnNfcWNvbV9waHlfaXNfcGNzX3JlYWR5KHN0cnVjdCBwaHkgKmdlbmVyaWNfcGh5KQogewpAQCAtNzI1LDYgKzcxNiw3IEBACiBvdXQ6CiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVmc19xY29tX3BoeV9wb3dlcl9vbik7CiAKIGludCB1ZnNfcWNvbV9waHlfcG93ZXJfb2ZmKHN0cnVjdCBwaHkgKmdlbmVyaWNfcGh5KQogewpAQCAtNzQzLDMgKzczNSw0IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVmc19xY29tX3BoeV9wb3dlcl9vZmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LXJvY2tjaGlwLXVzYi5jCmluZGV4IDIyMDExYzMuLjdkNGMzMzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1yb2NrY2hpcC11c2IuYworKysgYi9kcml2ZXJzL3BoeS9waHktcm9ja2NoaXAtdXNiLmMKQEAgLTYxLDggKzYxLDYgQEAKIAkJcmV0dXJuIHJldDsKIAogCWNsa19kaXNhYmxlX3VucHJlcGFyZShwaHktPmNsayk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKIAogCXJldHVybiAwOwogfQpAQCAtNzgsOCArNzYsMTAgQEAKIAogCS8qIFBvd2VyIHVwIHVzYiBwaHkgYW5hbG9nIGJsb2NrcyBieSBzZXQgc2lkZHEgMCAqLwogCXJldCA9IHJvY2tjaGlwX3VzYl9waHlfcG93ZXIocGh5LCAwKTsKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBoeS0+Y2xrKTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS1zYW1zdW5nLXVzYjIuYyBiL2RyaXZlcnMvcGh5L3BoeS1zYW1zdW5nLXVzYjIuYwppbmRleCA0YTEyZjY2Li41NWI2OTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktc2Ftc3VuZy11c2IyLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LXNhbXN1bmctdXNiMi5jCkBAIC0zNywxMCArMzcsMTQgQEAKIAkJc3Bpbl9sb2NrKCZkcnYtPmxvY2spOwogCQlyZXQgPSBpbnN0LT5jZmctPnBvd2VyX29uKGluc3QpOwogCQlzcGluX3VubG9jaygmZHJ2LT5sb2NrKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gZXJyX3Bvd2VyX29uOwogCX0KIAogCXJldHVybiAwOwogCitlcnJfcG93ZXJfb246CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydi0+cmVmX2Nsayk7CiBlcnJfaW5zdGFuY2VfY2xrOgogCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPmNsayk7CiBlcnJfbWFpbl9jbGs6CkBAIC01MSw3ICs1NSw3IEBACiB7CiAJc3RydWN0IHNhbXN1bmdfdXNiMl9waHlfaW5zdGFuY2UgKmluc3QgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKIAlzdHJ1Y3Qgc2Ftc3VuZ191c2IyX3BoeV9kcml2ZXIgKmRydiA9IGluc3QtPmRydjsKLQlpbnQgcmV0ID0gMDsKKwlpbnQgcmV0OwogCiAJZGV2X2RiZyhkcnYtPmRldiwgIlJlcXVlc3QgdG8gcG93ZXJfb2ZmIFwiJXNcIiB1c2IgcGh5XG4iLAogCQlpbnN0LT5jZmctPmxhYmVsKTsKQEAgLTU5LDEwICs2MywxMiBAQAogCQlzcGluX2xvY2soJmRydi0+bG9jayk7CiAJCXJldCA9IGluc3QtPmNmZy0+cG93ZXJfb2ZmKGluc3QpOwogCQlzcGluX3VubG9jaygmZHJ2LT5sb2NrKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPnJlZl9jbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnYtPmNsayk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBwaHlfb3BzIHNhbXN1bmdfdXNiMl9waHlfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXNwZWFyMTMxMC1taXBoeS5jIGIvZHJpdmVycy9waHkvcGh5LXNwZWFyMTMxMC1taXBoeS5jCmluZGV4IDlmNDdmYWUuLjY1YWU2NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1zcGVhcjEzMTAtbWlwaHkuYworKysgYi9kcml2ZXJzL3BoeS9waHktc3BlYXIxMzEwLW1pcGh5LmMKQEAgLTE5MiwxNCArMTkyLDE0IEBACiAKIAlpZiAoYXJncy0+YXJnc19jb3VudCA8IDEpIHsKIAkJZGV2X2VycihkZXYsICJEVCBkaWQgbm90IHBhc3MgY29ycmVjdCBubyBvZiBhcmdzXG4iKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogCX0KIAogCXByaXYtPm1vZGUgPSBhcmdzLT5hcmdzWzBdOwogCiAJaWYgKHByaXYtPm1vZGUgIT0gU0FUQSAmJiBwcml2LT5tb2RlICE9IFBDSUUpIHsKIAkJZGV2X2VycihkZXYsICJEVCBkaWQgbm90IHBhc3MgY29ycmVjdCBwaHkgbW9kZVxuIik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAl9CiAKIAlyZXR1cm4gcHJpdi0+cGh5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXNwZWFyMTM0MC1taXBoeS5jIGIvZHJpdmVycy9waHkvcGh5LXNwZWFyMTM0MC1taXBoeS5jCmluZGV4IGU0MmJjMjAuLjFhMDBjMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGh5L3BoeS1zcGVhcjEzNDAtbWlwaHkuYworKysgYi9kcml2ZXJzL3BoeS9waHktc3BlYXIxMzQwLW1pcGh5LmMKQEAgLTIyOSwxNCArMjI5LDE0IEBACiAKIAlpZiAoYXJncy0+YXJnc19jb3VudCA8IDEpIHsKIAkJZGV2X2VycihkZXYsICJEVCBkaWQgbm90IHBhc3MgY29ycmVjdCBubyBvZiBhcmdzXG4iKTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogCX0KIAogCXByaXYtPm1vZGUgPSBhcmdzLT5hcmdzWzBdOwogCiAJaWYgKHByaXYtPm1vZGUgIT0gU0FUQSAmJiBwcml2LT5tb2RlICE9IFBDSUUpIHsKIAkJZGV2X2VycihkZXYsICJEVCBkaWQgbm90IHBhc3MgY29ycmVjdCBwaHkgbW9kZVxuIik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKIAl9CiAKIAlyZXR1cm4gcHJpdi0+cGh5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXN0aWg0MXgtdXNiLmMgYi9kcml2ZXJzL3BoeS9waHktc3RpaDQxeC11c2IuYwppbmRleCBhNjAzODAxLi5jMDkzYjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktc3RpaDQxeC11c2IuYworKysgYi9kcml2ZXJzL3BoeS9waHktc3RpaDQxeC11c2IuYwpAQCAtODcsOCArODcsMTIgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHBoeV9kZXYtPnJlZ21hcCwgcGh5X2Rldi0+Y2ZnLT5zeXNjZmcsCi0JCQlwaHlfZGV2LT5jZmctPm9zY29rLCBwaHlfZGV2LT5jZmctPm9zY29rKTsKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMocGh5X2Rldi0+cmVnbWFwLCBwaHlfZGV2LT5jZmctPnN5c2NmZywKKwkJCQkgcGh5X2Rldi0+Y2ZnLT5vc2NvaywgcGh5X2Rldi0+Y2ZnLT5vc2Nvayk7CisJaWYgKHJldCkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBoeV9kZXYtPmNsayk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHN0aWg0MXhfdXNiX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXN1bjlpLXVzYi5jIGIvZHJpdmVycy9waHkvcGh5LXN1bjlpLXVzYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOTU5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BoeS9waHktc3VuOWktdXNiLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBBbGx3aW5uZXIgc3VuOWkgVVNCIHBoeSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQtMjAxNSBDaGVuLVl1IFRzYWkgPHdlbnNAY3NpZS5vcmc+CisgKgorICogQmFzZWQgb24gcGh5LXN1bjRpLXVzYi5jIGZyb20KKyAqIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisgKgorICogYW5kIGNvZGUgZnJvbQorICogQWxsd2lubmVyIFRlY2hub2xvZ3kgQ28uLCBMdGQuIDx3d3cuYWxsd2lubmVydGVjaC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Ivb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPgorCisjZGVmaW5lIFNVTlhJX0FIQl9JTkNSMTZfQlVSU1RfRU4JQklUKDExKQorI2RlZmluZSBTVU5YSV9BSEJfSU5DUjhfQlVSU1RfRU4JQklUKDEwKQorI2RlZmluZSBTVU5YSV9BSEJfSU5DUjRfQlVSU1RfRU4JQklUKDkpCisjZGVmaW5lIFNVTlhJX0FIQl9JTkNSWF9BTElHTl9FTglCSVQoOCkKKyNkZWZpbmUgU1VOWElfVUxQSV9CWVBBU1NfRU4JCUJJVCgwKQorCisvKiB1c2IxIEhTSUMgc3BlY2lmaWMgYml0cyAqLworI2RlZmluZSBTVU5YSV9FSENJX0hTX0ZPUkNFCQlCSVQoMjApCisjZGVmaW5lIFNVTlhJX0hTSUNfQ09OTkVDVF9ERVQJCUJJVCgxNykKKyNkZWZpbmUgU1VOWElfSFNJQ19DT05ORUNUX0lOVAkJQklUKDE2KQorI2RlZmluZSBTVU5YSV9IU0lDCQkJQklUKDEpCisKK3N0cnVjdCBzdW45aV91c2JfcGh5IHsKKwlzdHJ1Y3QgcGh5ICpwaHk7CisJdm9pZCBfX2lvbWVtICpwbXU7CisJc3RydWN0IHJlc2V0X2NvbnRyb2wgKnJlc2V0OworCXN0cnVjdCBjbGsgKmNsazsKKwlzdHJ1Y3QgY2xrICpoc2ljX2NsazsKKwllbnVtIHVzYl9waHlfaW50ZXJmYWNlIHR5cGU7Cit9OworCitzdGF0aWMgdm9pZCBzdW45aV91c2JfcGh5X3Bhc3NieShzdHJ1Y3Qgc3VuOWlfdXNiX3BoeSAqcGh5LCBpbnQgZW5hYmxlKQoreworCXUzMiBiaXRzLCByZWdfdmFsdWU7CisKKwliaXRzID0gU1VOWElfQUhCX0lOQ1IxNl9CVVJTVF9FTiB8IFNVTlhJX0FIQl9JTkNSOF9CVVJTVF9FTiB8CisJCVNVTlhJX0FIQl9JTkNSNF9CVVJTVF9FTiB8IFNVTlhJX0FIQl9JTkNSWF9BTElHTl9FTiB8CisJCVNVTlhJX1VMUElfQllQQVNTX0VOOworCisJaWYgKHBoeS0+dHlwZSA9PSBVU0JQSFlfSU5URVJGQUNFX01PREVfSFNJQykKKwkJYml0cyB8PSBTVU5YSV9IU0lDIHwgU1VOWElfRUhDSV9IU19GT1JDRSB8CisJCQlTVU5YSV9IU0lDX0NPTk5FQ1RfREVUIHwgU1VOWElfSFNJQ19DT05ORUNUX0lOVDsKKworCXJlZ192YWx1ZSA9IHJlYWRsKHBoeS0+cG11KTsKKworCWlmIChlbmFibGUpCisJCXJlZ192YWx1ZSB8PSBiaXRzOworCWVsc2UKKwkJcmVnX3ZhbHVlICY9IH5iaXRzOworCisJd3JpdGVsKHJlZ192YWx1ZSwgcGh5LT5wbXUpOworfQorCitzdGF0aWMgaW50IHN1bjlpX3VzYl9waHlfaW5pdChzdHJ1Y3QgcGh5ICpfcGh5KQoreworCXN0cnVjdCBzdW45aV91c2JfcGh5ICpwaHkgPSBwaHlfZ2V0X2RydmRhdGEoX3BoeSk7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShwaHktPmNsayk7CisJaWYgKHJldCkKKwkJZ290byBlcnJfY2xrOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHBoeS0+aHNpY19jbGspOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2hzaWNfY2xrOworCisJcmV0ID0gcmVzZXRfY29udHJvbF9kZWFzc2VydChwaHktPnJlc2V0KTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9yZXNldDsKKworCXN1bjlpX3VzYl9waHlfcGFzc2J5KHBoeSwgMSk7CisJcmV0dXJuIDA7CisKK2Vycl9yZXNldDoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocGh5LT5oc2ljX2Nsayk7CisKK2Vycl9oc2ljX2NsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUocGh5LT5jbGspOworCitlcnJfY2xrOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3VuOWlfdXNiX3BoeV9leGl0KHN0cnVjdCBwaHkgKl9waHkpCit7CisJc3RydWN0IHN1bjlpX3VzYl9waHkgKnBoeSA9IHBoeV9nZXRfZHJ2ZGF0YShfcGh5KTsKKworCXN1bjlpX3VzYl9waHlfcGFzc2J5KHBoeSwgMCk7CisJcmVzZXRfY29udHJvbF9hc3NlcnQocGh5LT5yZXNldCk7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHBoeS0+aHNpY19jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShwaHktPmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwaHlfb3BzIHN1bjlpX3VzYl9waHlfb3BzID0geworCS5pbml0CQk9IHN1bjlpX3VzYl9waHlfaW5pdCwKKwkuZXhpdAkJPSBzdW45aV91c2JfcGh5X2V4aXQsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBzdW45aV91c2JfcGh5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHN1bjlpX3VzYl9waHkgKnBoeTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CisJc3RydWN0IHBoeV9wcm92aWRlciAqcGh5X3Byb3ZpZGVyOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJcGh5ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpwaHkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBoeSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwaHktPnR5cGUgPSBvZl91c2JfZ2V0X3BoeV9tb2RlKG5wKTsKKwlpZiAocGh5LT50eXBlID09IFVTQlBIWV9JTlRFUkZBQ0VfTU9ERV9IU0lDKSB7CisJCXBoeS0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImhzaWNfNDgwTSIpOworCQlpZiAoSVNfRVJSKHBoeS0+Y2xrKSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGhzaWNfNDgwTSBjbG9ja1xuIik7CisJCQlyZXR1cm4gUFRSX0VSUihwaHktPmNsayk7CisJCX0KKworCQlwaHktPmhzaWNfY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImhzaWNfMTJNIik7CisJCWlmIChJU19FUlIocGh5LT5jbGspKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgaHNpY18xMk0gY2xvY2tcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIocGh5LT5jbGspOworCQl9CisKKwkJcGh5LT5yZXNldCA9IGRldm1fcmVzZXRfY29udHJvbF9nZXQoZGV2LCAiaHNpYyIpOworCQlpZiAoSVNfRVJSKHBoeS0+cmVzZXQpKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgcmVzZXQgY29udHJvbFxuIik7CisJCQlyZXR1cm4gUFRSX0VSUihwaHktPnJlc2V0KTsKKwkJfQorCX0gZWxzZSB7CisJCXBoeS0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInBoeSIpOworCQlpZiAoSVNfRVJSKHBoeS0+Y2xrKSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHBoeSBjbG9ja1xuIik7CisJCQlyZXR1cm4gUFRSX0VSUihwaHktPmNsayk7CisJCX0KKworCQlwaHktPnJlc2V0ID0gZGV2bV9yZXNldF9jb250cm9sX2dldChkZXYsICJwaHkiKTsKKwkJaWYgKElTX0VSUihwaHktPnJlc2V0KSkgeworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHJlc2V0IGNvbnRyb2xcbiIpOworCQkJcmV0dXJuIFBUUl9FUlIocGh5LT5yZXNldCk7CisJCX0KKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXBoeS0+cG11ID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBoeS0+cG11KSkKKwkJcmV0dXJuIFBUUl9FUlIocGh5LT5wbXUpOworCisJcGh5LT5waHkgPSBkZXZtX3BoeV9jcmVhdGUoZGV2LCBOVUxMLCAmc3VuOWlfdXNiX3BoeV9vcHMpOworCWlmIChJU19FUlIocGh5LT5waHkpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBQSFlcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwaHktPnBoeSk7CisJfQorCisJcGh5X3NldF9kcnZkYXRhKHBoeS0+cGh5LCBwaHkpOworCXBoeV9wcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKGRldiwgb2ZfcGh5X3NpbXBsZV94bGF0ZSk7CisKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHBoeV9wcm92aWRlcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjlpX3VzYl9waHlfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW45aS1hODAtdXNiLXBoeSIgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3VuOWlfdXNiX3BoeV9vZl9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN1bjlpX3VzYl9waHlfZHJpdmVyID0geworCS5wcm9iZQk9IHN1bjlpX3VzYl9waHlfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm9mX21hdGNoX3RhYmxlCT0gc3VuOWlfdXNiX3BoeV9vZl9tYXRjaCwKKwkJLm5hbWUgID0gInN1bjlpLXVzYi1waHkiLAorCX0KK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHN1bjlpX3VzYl9waHlfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbGx3aW5uZXIgc3VuOWkgVVNCIHBoeSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkNoZW4tWXUgVHNhaSA8d2Vuc0Bjc2llLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L3BoeS10aS1waXBlMy5jIGIvZHJpdmVycy9waHkvcGh5LXRpLXBpcGUzLmMKaW5kZXggOTVjODhmOS4uNTNmMjk1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waHkvcGh5LXRpLXBpcGUzLmMKKysrIGIvZHJpdmVycy9waHkvcGh5LXRpLXBpcGUzLmMKQEAgLTE2NSwxNSArMTY1LDExIEBACiAJCWNwdV9yZWxheCgpOwogCQl2YWwgPSB0aV9waXBlM19yZWFkbChwaHktPnBsbF9jdHJsX2Jhc2UsIFBMTF9TVEFUVVMpOwogCQlpZiAodmFsICYgUExMX0xPQ0spCi0JCQlicmVhazsKKwkJCXJldHVybiAwOwogCX0gd2hpbGUgKCF0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKTsKIAotCWlmICghKHZhbCAmIFBMTF9MT0NLKSkgewotCQlkZXZfZXJyKHBoeS0+ZGV2LCAiRFBMTCBmYWlsZWQgdG8gbG9ja1xuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JcmV0dXJuIDA7CisJZGV2X2VycihwaHktPmRldiwgIkRQTEwgZmFpbGVkIHRvIGxvY2tcbiIpOworCXJldHVybiAtRUJVU1k7CiB9CiAKIHN0YXRpYyBpbnQgdGlfcGlwZTNfZHBsbF9wcm9ncmFtKHN0cnVjdCB0aV9waXBlMyAqcGh5KQpAQCAtMjkxLDkgKzI4Nyw3IEBACiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKIAotI2lmZGVmIENPTkZJR19PRgogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGlfcGlwZTNfaWRfdGFibGVbXTsKLSNlbmRpZgogCiBzdGF0aWMgaW50IHRpX3BpcGUzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CkBAIC0zMTUsOCArMzA5LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmcGh5LT5sb2NrKTsKIAogCWlmICghb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgInRpLHBoeS1waXBlMy1wY2llIikpIHsKLQkJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKHRpX3BpcGUzX2lkX3RhYmxlKSwKLQkJCQkJJnBkZXYtPmRldik7CisJCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKHRpX3BpcGUzX2lkX3RhYmxlLCAmcGRldi0+ZGV2KTsKIAkJaWYgKCFtYXRjaCkKIAkJCXJldHVybiAtRUlOVkFMOwogCkBAIC01NzQsNyArNTY3LDYgQEAKIAlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyh0aV9waXBlM19zdXNwZW5kLCB0aV9waXBlM19yZXN1bWUpCiB9OwogCi0jaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB0aV9waXBlM19pZF90YWJsZVtdID0gewogCXsKIAkJLmNvbXBhdGlibGUgPSAidGkscGh5LXVzYjMiLApAQCAtNTk0LDcgKzU4Niw2IEBACiAJe30KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB0aV9waXBlM19pZF90YWJsZSk7Ci0jZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGlfcGlwZTNfZHJpdmVyID0gewogCS5wcm9iZQkJPSB0aV9waXBlM19wcm9iZSwKQEAgLTYwMiwxMyArNTkzLDEzIEBACiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInRpLXBpcGUzIiwKIAkJLnBtCT0gJnRpX3BpcGUzX3BtX29wcywKLQkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRpX3BpcGUzX2lkX3RhYmxlKSwKKwkJLm9mX21hdGNoX3RhYmxlID0gdGlfcGlwZTNfaWRfdGFibGUsCiAJfSwKIH07CiAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGlfcGlwZTNfZHJpdmVyKTsKIAotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTogdGlfcGlwZTMiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06dGlfcGlwZTMiKTsKIE1PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIEluYy4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVEkgUElQRTMgcGh5IGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXR3bDQwMzAtdXNiLmMgYi9kcml2ZXJzL3BoeS9waHktdHdsNDAzMC11c2IuYwppbmRleCA4ZTg3ZjU0Li5iYzQyZDZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHktdHdsNDAzMC11c2IuYworKysgYi9kcml2ZXJzL3BoeS9waHktdHdsNDAzMC11c2IuYwpAQCAtNjY2LDcgKzY2Niw2IEBACiAJdHdsLT5kZXYJCT0gJnBkZXYtPmRldjsKIAl0d2wtPmlycQkJPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwogCXR3bC0+dmJ1c19zdXBwbGllZAk9IGZhbHNlOwotCXR3bC0+bGlua3N0YXQJCT0gLUVJTlZBTDsKIAl0d2wtPmxpbmtzdGF0CQk9IE9NQVBfTVVTQl9VTktOT1dOOwogCiAJdHdsLT5waHkuZGV2CQk9IHR3bC0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waHkvcGh5LXhnZW5lLmMgYi9kcml2ZXJzL3BoeS9waHkteGdlbmUuYwppbmRleCAyOTIxNGEzLi4zODUzNjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BoeS9waHkteGdlbmUuYworKysgYi9kcml2ZXJzL3BoeS9waHkteGdlbmUuYwpAQCAtMTY1Nyw3ICsxNjU3LDYgQEAKIAlzdHJ1Y3QgcGh5X3Byb3ZpZGVyICpwaHlfcHJvdmlkZXI7CiAJc3RydWN0IHhnZW5lX3BoeV9jdHggKmN0eDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlpbnQgcmMgPSAwOwogCXUzMiBkZWZhdWx0X3NwZFtdID0gREVGQVVMVF9TQVRBX1NQRF9TRUw7CiAJdTMyIGRlZmF1bHRfdHhib29zdF9nYWluW10gPSBERUZBVUxUX1NBVEFfVFhCT09TVF9HQUlOOwogCXUzMiBkZWZhdWx0X3R4ZXllX2RpcmVjdGlvbltdID0gREVGQVVMVF9TQVRBX1RYRVlFRElSRUNUSU9OOwpAQCAtMTY3NiwxMCArMTY3NSw4IEBACiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWN0eC0+c2RzX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKLQlpZiAoSVNfRVJSKGN0eC0+c2RzX2Jhc2UpKSB7Ci0JCXJjID0gUFRSX0VSUihjdHgtPnNkc19iYXNlKTsKLQkJZ290byBlcnJvcjsKLQl9CisJaWYgKElTX0VSUihjdHgtPnNkc19iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoY3R4LT5zZHNfYmFzZSk7CiAKIAkvKiBSZXRyaWV2ZSBvcHRpb25hbCBjbG9jayAqLwogCWN0eC0+Y2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKQEAgLTE3MDQsMjggKzE3MDEsMTcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0xBTkU7IGkrKykKIAkJY3R4LT5zYXRhX3BhcmFtLnNwZWVkW2ldID0gMjsgLyogRGVmYXVsdCB0byBHZW4zICovCiAKLQljdHgtPmRldiA9ICZwZGV2LT5kZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY3R4KTsKIAogCWN0eC0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKGN0eC0+ZGV2LCBOVUxMLCAmeGdlbmVfcGh5X29wcyk7CiAJaWYgKElTX0VSUihjdHgtPnBoeSkpIHsKIAkJZGV2X2RiZygmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBQSFlcbiIpOwotCQlyYyA9IFBUUl9FUlIoY3R4LT5waHkpOwotCQlnb3RvIGVycm9yOworCQlyZXR1cm4gUFRSX0VSUihjdHgtPnBoeSk7CiAJfQogCXBoeV9zZXRfZHJ2ZGF0YShjdHgtPnBoeSwgY3R4KTsKIAotCXBoeV9wcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKGN0eC0+ZGV2LAotCQkJCQkJICAgICB4Z2VuZV9waHlfeGxhdGUpOwotCWlmIChJU19FUlIocGh5X3Byb3ZpZGVyKSkgewotCQlyYyA9IFBUUl9FUlIocGh5X3Byb3ZpZGVyKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0JcmV0dXJuIHJjOworCXBoeV9wcm92aWRlciA9IGRldm1fb2ZfcGh5X3Byb3ZpZGVyX3JlZ2lzdGVyKGN0eC0+ZGV2LCB4Z2VuZV9waHlfeGxhdGUpOworCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocGh5X3Byb3ZpZGVyKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgeGdlbmVfcGh5X29mX21hdGNoW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvS2NvbmZpZyBiL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCmluZGV4IGVlOWY0NGEuLmM2ZjI5OWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGluY3RybC9LY29uZmlnCkBAIC02NywyMyArNjcsMjAgQEAKIAloZWxwCiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUgYXQ5MSBwaW5jdHJsIGRyaXZlcgogCi1jb25maWcgUElOQ1RSTF9CQ00yODM1Ci0JYm9vbAotCXNlbGVjdCBQSU5NVVgKLQlzZWxlY3QgUElOQ09ORgotCi1jb25maWcgUElOQ1RSTF9CQ00yODFYWAotCWJvb2wgIkJyb2FkY29tIEJDTTI4MXh4IHBpbmN0cmwgZHJpdmVyIgotCWRlcGVuZHMgb24gT0YgJiYgKEFSQ0hfQkNNX01PQklMRSB8fCBDT01QSUxFX1RFU1QpCi0Jc2VsZWN0IFBJTk1VWAorY29uZmlnIFBJTkNUUkxfQU1ECisJYm9vbCAiQU1EIEdQSU8gcGluIGNvbnRyb2wiCisJZGVwZW5kcyBvbiBHUElPTElCCisJc2VsZWN0IEdQSU9MSUJfSVJRQ0hJUAogCXNlbGVjdCBQSU5DT05GCiAJc2VsZWN0IEdFTkVSSUNfUElOQ09ORgotCXNlbGVjdCBSRUdNQVBfTU1JTwogCWhlbHAKLQkgIFNheSBZIGhlcmUgdG8gc3VwcG9ydCBCcm9hZGNvbSBCQ00yODF4eCBwaW5jdHJsIGRyaXZlciwgd2hpY2ggaXMgdXNlZAotCSAgZm9yIHRoZSBCQ00yODF4eCBTb0MgZmFtaWx5LCBpbmNsdWRpbmcgQkNNMTExMzAsIEJDTTExMTQwLCBCQ00xMTM1MSwKLQkgIEJDTTI4MTQ1LCBhbmQgQkNNMjgxNTUgU29Dcy4gIFRoaXMgZHJpdmVyIHJlcXVpcmVzIHRoZSBwaW5jdHJsCi0JICBmcmFtZXdvcmsuICBHUElPIGlzIHByb3ZpZGVkIGJ5IGEgc2VwYXJhdGUgR1BJTyBkcml2ZXIuCisJICBkcml2ZXIgZm9yIG1lbW9yeSBtYXBwZWQgR1BJTyBmdW5jdGlvbmFsaXR5IG9uIEFNRCBwbGF0Zm9ybXMKKwkgICh4ODYgb3IgYXJtKS5Nb3N0IHBpbnMgYXJlIHVzdWFsbHkgbXV4ZWQgdG8gc29tZSBvdGhlcgorCSAgZnVuY3Rpb25hbGl0eSBieSBmaXJtd2FyZSxzbyBvbmx5IGEgc21hbGwgYW1vdW50IGlzIGF2YWlsYWJsZQorCSAgZm9yIGdwaW8gdXNlLgorCisJICBSZXF1aXJlcyBBQ1BJL0ZEVCBkZXZpY2UgZW51bWVyYXRpb24gY29kZSB0byBzZXQgdXAgYSBwbGF0Zm9ybQorCSAgZGV2aWNlLgogCiBjb25maWcgUElOQ1RSTF9MQU5USVEKIAlib29sCkBAIC0xNTQsNiArMTUxLDEwIEBACiAJYm9vbAogCXNlbGVjdCBQSU5DVFJMX1RFR1JBCiAKK2NvbmZpZyBQSU5DVFJMX1RFR1JBMjEwCisJYm9vbAorCXNlbGVjdCBQSU5DVFJMX1RFR1JBCisKIGNvbmZpZyBQSU5DVFJMX1RFR1JBX1hVU0IKIAlkZWZfYm9vbCB5IGlmIEFSQ0hfVEVHUkEKIAlzZWxlY3QgR0VORVJJQ19QSFkKQEAgLTIwNyw2ICsyMDgsNyBAQAogCWhlbHAKIAkgIFRoaXMgc2VsZWN0ZXMgdGhlIHBpbmN0cmwgZHJpdmVyIGZvciBYaWxpbnggWnlucS4KIAorc291cmNlICJkcml2ZXJzL3BpbmN0cmwvYmNtL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvcGluY3RybC9iZXJsaW4vS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9waW5jdHJsL2ZyZWVzY2FsZS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL3BpbmN0cmwvaW50ZWwvS2NvbmZpZyIKQEAgLTIxOCw2ICsyMjAsNyBAQAogc291cmNlICJkcml2ZXJzL3BpbmN0cmwvc3BlYXIvS2NvbmZpZyIKIHNvdXJjZSAiZHJpdmVycy9waW5jdHJsL3N1bnhpL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvcGluY3RybC92dDg1MDAvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL0tjb25maWciCiAKIGNvbmZpZyBQSU5DVFJMX1hXQVkKIAlib29sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvTWFrZWZpbGUgYi9kcml2ZXJzL3BpbmN0cmwvTWFrZWZpbGUKaW5kZXggMDQ3NTIwNi4uNmVhZGYwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGluY3RybC9NYWtlZmlsZQpAQCAtMTQsOCArMTQsNyBAQAogb2JqLSQoQ09ORklHX1BJTkNUUkxfQkY1NHgpCSs9IHBpbmN0cmwtYWRpMi1iZjU0eC5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9CRjYweCkJKz0gcGluY3RybC1hZGkyLWJmNjB4Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX0FUOTEpCSs9IHBpbmN0cmwtYXQ5MS5vCi1vYmotJChDT05GSUdfUElOQ1RSTF9CQ00yODM1KQkrPSBwaW5jdHJsLWJjbTI4MzUubwotb2JqLSQoQ09ORklHX1BJTkNUUkxfQkNNMjgxWFgpCSs9IHBpbmN0cmwtYmNtMjgxeHgubworb2JqLSQoQ09ORklHX1BJTkNUUkxfQU1EKQkrPSBwaW5jdHJsLWFtZC5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9GQUxDT04pCSs9IHBpbmN0cmwtZmFsY29uLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX01FU09OKQkrPSBtZXNvbi8KIG9iai0kKENPTkZJR19QSU5DVFJMX1BBTE1BUykJKz0gcGluY3RybC1wYWxtYXMubwpAQCAtMjcsNiArMjYsNyBAQAogb2JqLSQoQ09ORklHX1BJTkNUUkxfVEVHUkEzMCkJKz0gcGluY3RybC10ZWdyYTMwLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1RFR1JBMTE0KQkrPSBwaW5jdHJsLXRlZ3JhMTE0Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1RFR1JBMTI0KQkrPSBwaW5jdHJsLXRlZ3JhMTI0Lm8KK29iai0kKENPTkZJR19QSU5DVFJMX1RFR1JBMjEwKQkrPSBwaW5jdHJsLXRlZ3JhMjEwLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1RFR1JBX1hVU0IpCSs9IHBpbmN0cmwtdGVncmEteHVzYi5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9UWjEwOTApCSs9IHBpbmN0cmwtdHoxMDkwLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX1RaMTA5MF9QREMpCSs9IHBpbmN0cmwtdHoxMDkwLXBkYy5vCkBAIC0zOCw2ICszOCw3IEBACiBvYmotJChDT05GSUdfUElOQ1RSTF9TVCkgCSs9IHBpbmN0cmwtc3Qubwogb2JqLSQoQ09ORklHX1BJTkNUUkxfWllOUSkJKz0gcGluY3RybC16eW5xLm8KIAorb2JqLSQoQ09ORklHX0FSQ0hfQkNNKQkJKz0gYmNtLwogb2JqLSQoQ09ORklHX0FSQ0hfQkVSTElOKQkrPSBiZXJsaW4vCiBvYmoteQkJCQkrPSBmcmVlc2NhbGUvCiBvYmotJChDT05GSUdfWDg2KQkJKz0gaW50ZWwvCkBAIC00OSwzICs1MCw0IEBACiBvYmotJChDT05GSUdfUExBVF9TUEVBUikJKz0gc3BlYXIvCiBvYmotJChDT05GSUdfQVJDSF9TVU5YSSkJKz0gc3VueGkvCiBvYmotJChDT05GSUdfQVJDSF9WVDg1MDApCSs9IHZ0ODUwMC8KK29iai0kKENPTkZJR19BUkNIX01FRElBVEVLKQkrPSBtZWRpYXRlay8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9iY20vS2NvbmZpZyBiL2RyaXZlcnMvcGluY3RybC9iY20vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDExZDRkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2JjbS9LY29uZmlnCkBAIC0wLDAgKzEsNTYgQEAKKyMKKyMgQnJvYWRjb20gcGluY3RybCBkcml2ZXJzCisjCisKK2NvbmZpZyBQSU5DVFJMX0JDTTI4MVhYCisJYm9vbCAiQnJvYWRjb20gQkNNMjgxeHggcGluY3RybCBkcml2ZXIiCisJZGVwZW5kcyBvbiBPRiAmJiAoQVJDSF9CQ01fTU9CSUxFIHx8IENPTVBJTEVfVEVTVCkKKwlzZWxlY3QgUElOTVVYCisJc2VsZWN0IFBJTkNPTkYKKwlzZWxlY3QgR0VORVJJQ19QSU5DT05GCisJc2VsZWN0IFJFR01BUF9NTUlPCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBzdXBwb3J0IEJyb2FkY29tIEJDTTI4MXh4IHBpbmN0cmwgZHJpdmVyLCB3aGljaCBpcyB1c2VkCisJICBmb3IgdGhlIEJDTTI4MXh4IFNvQyBmYW1pbHksIGluY2x1ZGluZyBCQ00xMTEzMCwgQkNNMTExNDAsIEJDTTExMzUxLAorCSAgQkNNMjgxNDUsIGFuZCBCQ00yODE1NSBTb0NzLiAgVGhpcyBkcml2ZXIgcmVxdWlyZXMgdGhlIHBpbmN0cmwKKwkgIGZyYW1ld29yay4gIEdQSU8gaXMgcHJvdmlkZWQgYnkgYSBzZXBhcmF0ZSBHUElPIGRyaXZlci4KKworY29uZmlnIFBJTkNUUkxfQkNNMjgzNQorCWJvb2wKKwlzZWxlY3QgUElOTVVYCisJc2VsZWN0IFBJTkNPTkYKKworY29uZmlnIFBJTkNUUkxfQ1lHTlVTX0dQSU8KKwlib29sICJCcm9hZGNvbSBDeWdudXMgR1BJTyAod2l0aCBQSU5DT05GKSBkcml2ZXIiCisJZGVwZW5kcyBvbiBPRl9HUElPICYmIEFSQ0hfQkNNX0NZR05VUworCXNlbGVjdCBHUElPTElCX0lSUUNISVAKKwlzZWxlY3QgUElOQ09ORgorCXNlbGVjdCBHRU5FUklDX1BJTkNPTkYKKwlkZWZhdWx0IEFSQ0hfQkNNX0NZR05VUworCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBlbmFibGUgdGhlIEJyb2FkY29tIEN5Z251cyBHUElPIGRyaXZlci4KKworCSAgVGhlIEJyb2FkY29tIEN5Z251cyBTb0MgaGFzIDMgR1BJTyBjb250cm9sbGVycyBpbmNsdWRpbmcgdGhlIEFTSVUKKwkgIEdQSU8gY29udHJvbGxlciAoQVNJVSksIHRoZSBjaGlwQ29tbW9uRyBHUElPIGNvbnRyb2xsZXIgKENDTSksIGFuZAorCSAgdGhlIGFsd2F5cy1PTiBHUElPIGNvbnRyb2xsZXIgKENSTVUvQU9OKS4gQWxsIDMgR1BJTyBjb250cm9sbGVycyBhcmUKKwkgIHN1cHBvcnRlZCBieSB0aGlzIGRyaXZlci4KKworCSAgQWxsIDMgQ3lnbnVzIEdQSU8gY29udHJvbGxlcnMgc3VwcG9ydCBiYXNpYyBQSU5DT05GIGZ1bmN0aW9ucyBzdWNoCisJICBhcyBiaWFzIHB1bGwgdXAsIHB1bGwgZG93biwgYW5kIGRyaXZlIHN0cmVuZ3RoIGNvbmZpZ3VyYXRpb25zLCB3aGVuCisJICB0aGVzZSBwaW5zIGFyZSBtdXhlZCB0byBHUElPLgorCisJICBQaW5zIGZyb20gdGhlIEFTSVUgR1BJTyBjYW4gYmUgaW5kaXZpZHVhbGx5IG11eGVkIHRvIEdQSU8gZnVuY3Rpb24sCisJICB0aHJvdWdoIGludGVyYWN0aW9uIHdpdGggdGhlIEN5Z251cyBJT01VWCBjb250cm9sbGVyLgorCitjb25maWcgUElOQ1RSTF9DWUdOVVNfTVVYCisJYm9vbCAiQnJvYWRjb20gQ3lnbnVzIElPTVVYIGRyaXZlciIKKwlkZXBlbmRzIG9uIChBUkNIX0JDTV9DWUdOVVMgfHwgQ09NUElMRV9URVNUKQorCXNlbGVjdCBQSU5NVVgKKwlzZWxlY3QgR0VORVJJQ19QSU5DT05GCisJZGVmYXVsdCBBUkNIX0JDTV9DWUdOVVMKKwloZWxwCisJICBTYXkgeWVzIGhlcmUgdG8gZW5hYmxlIHRoZSBCcm9hZGNvbSBDeWdudXMgSU9NVVggZHJpdmVyLgorCisJICBUaGUgQnJvYWRjb20gQ3lnbnVzIElPTVVYIGRyaXZlciBzdXBwb3J0cyBncm91cCBiYXNlZCBJT01VWAorCSAgY29uZmlndXJhdGlvbiwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgY2VydGFpbiBpbmRpdmlkdWFsIHBpbnMKKwkgIGNhbiBiZSBvdmVycmlkZWQgdG8gR1BJTyBmdW5jdGlvbgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2JjbS9NYWtlZmlsZSBiL2RyaXZlcnMvcGluY3RybC9iY20vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyZjcwZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9iY20vTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACisjIEJyb2FkY29tIHBpbmN0cmwgc3VwcG9ydAorCitvYmotJChDT05GSUdfUElOQ1RSTF9CQ00yODFYWCkJCSs9IHBpbmN0cmwtYmNtMjgxeHgubworb2JqLSQoQ09ORklHX1BJTkNUUkxfQkNNMjgzNSkJCSs9IHBpbmN0cmwtYmNtMjgzNS5vCitvYmotJChDT05GSUdfUElOQ1RSTF9DWUdOVVNfR1BJTykJKz0gcGluY3RybC1jeWdudXMtZ3Bpby5vCitvYmotJChDT05GSUdfUElOQ1RSTF9DWUdOVVNfTVVYKQkrPSBwaW5jdHJsLWN5Z251cy1tdXgubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLWJjbTI4MXh4LmMgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtYmNtMjgxeHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQxZjFjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLWJjbTI4MXh4LmMKQEAgLTAsMCArMSwxNDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5tdXguaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYtZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICIuLi9jb3JlLmgiCisjaW5jbHVkZSAiLi4vcGluY3RybC11dGlscy5oIgorCisvKiBCQ00yODFYWCBQaW4gQ29udHJvbCBSZWdpc3RlcnMgRGVmaW5pdGlvbnMgKi8KKworLyogRnVuY3Rpb24gU2VsZWN0IGJpdHMgYXJlIHRoZSBzYW1lIGZvciBhbGwgcGluIGNvbnRyb2wgcmVnaXN0ZXJzICovCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SRUdfRl9TRUxfTUFTSwkJMHgwNzAwCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SRUdfRl9TRUxfU0hJRlQJCTgKKworLyogU3RhbmRhcmQgcGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEJDTTI4MVhYX1NURF9QSU5fUkVHX0RSVl9TVFJfTUFTSwkweDAwMDcKKyNkZWZpbmUgQkNNMjgxWFhfU1REX1BJTl9SRUdfRFJWX1NUUl9TSElGVAkwCisjZGVmaW5lIEJDTTI4MVhYX1NURF9QSU5fUkVHX0lOUFVUX0RJU19NQVNLCTB4MDAwOAorI2RlZmluZSBCQ00yODFYWF9TVERfUElOX1JFR19JTlBVVF9ESVNfU0hJRlQJMworI2RlZmluZSBCQ00yODFYWF9TVERfUElOX1JFR19TTEVXX01BU0sJCTB4MDAxMAorI2RlZmluZSBCQ00yODFYWF9TVERfUElOX1JFR19TTEVXX1NISUZUCQk0CisjZGVmaW5lIEJDTTI4MVhYX1NURF9QSU5fUkVHX1BVTExfVVBfTUFTSwkweDAwMjAKKyNkZWZpbmUgQkNNMjgxWFhfU1REX1BJTl9SRUdfUFVMTF9VUF9TSElGVAk1CisjZGVmaW5lIEJDTTI4MVhYX1NURF9QSU5fUkVHX1BVTExfRE5fTUFTSwkweDAwNDAKKyNkZWZpbmUgQkNNMjgxWFhfU1REX1BJTl9SRUdfUFVMTF9ETl9TSElGVAk2CisjZGVmaW5lIEJDTTI4MVhYX1NURF9QSU5fUkVHX0hZU1RfTUFTSwkJMHgwMDgwCisjZGVmaW5lIEJDTTI4MVhYX1NURF9QSU5fUkVHX0hZU1RfU0hJRlQJCTcKKworLyogSTJDIHBpbiByZWdpc3RlciAqLworI2RlZmluZSBCQ00yODFYWF9JMkNfUElOX1JFR19JTlBVVF9ESVNfTUFTSwkweDAwMDQKKyNkZWZpbmUgQkNNMjgxWFhfSTJDX1BJTl9SRUdfSU5QVVRfRElTX1NISUZUCTIKKyNkZWZpbmUgQkNNMjgxWFhfSTJDX1BJTl9SRUdfU0xFV19NQVNLCQkweDAwMDgKKyNkZWZpbmUgQkNNMjgxWFhfSTJDX1BJTl9SRUdfU0xFV19TSElGVAkJMworI2RlZmluZSBCQ00yODFYWF9JMkNfUElOX1JFR19QVUxMX1VQX1NUUl9NQVNLCTB4MDA3MAorI2RlZmluZSBCQ00yODFYWF9JMkNfUElOX1JFR19QVUxMX1VQX1NUUl9TSElGVAk0CisKKy8qIEhETUkgcGluIHJlZ2lzdGVyICovCisjZGVmaW5lIEJDTTI4MVhYX0hETUlfUElOX1JFR19JTlBVVF9ESVNfTUFTSwkweDAwMDgKKyNkZWZpbmUgQkNNMjgxWFhfSERNSV9QSU5fUkVHX0lOUFVUX0RJU19TSElGVAkzCisjZGVmaW5lIEJDTTI4MVhYX0hETUlfUElOX1JFR19NT0RFX01BU0sJCTB4MDAxMAorI2RlZmluZSBCQ00yODFYWF9IRE1JX1BJTl9SRUdfTU9ERV9TSElGVAk0CisKKy8qKgorICogYmNtMjgxeHhfcGluX3R5cGUgLSB0eXBlcyBvZiBwaW4gcmVnaXN0ZXIKKyAqLworZW51bSBiY20yODF4eF9waW5fdHlwZSB7CisJQkNNMjgxWFhfUElOX1RZUEVfVU5LTk9XTiA9IDAsCisJQkNNMjgxWFhfUElOX1RZUEVfU1RELAorCUJDTTI4MVhYX1BJTl9UWVBFX0kyQywKKwlCQ00yODFYWF9QSU5fVFlQRV9IRE1JLAorfTsKKworc3RhdGljIGVudW0gYmNtMjgxeHhfcGluX3R5cGUgc3RkX3BpbiA9IEJDTTI4MVhYX1BJTl9UWVBFX1NURDsKK3N0YXRpYyBlbnVtIGJjbTI4MXh4X3Bpbl90eXBlIGkyY19waW4gPSBCQ00yODFYWF9QSU5fVFlQRV9JMkM7CitzdGF0aWMgZW51bSBiY20yODF4eF9waW5fdHlwZSBoZG1pX3BpbiA9IEJDTTI4MVhYX1BJTl9UWVBFX0hETUk7CisKKy8qKgorICogYmNtMjgxeHhfcGluX2Z1bmN0aW9uLSBkZWZpbmUgcGluIGZ1bmN0aW9uCisgKi8KK3N0cnVjdCBiY20yODF4eF9waW5fZnVuY3Rpb24geworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqIGNvbnN0ICpncm91cHM7CisJY29uc3QgdW5zaWduZWQgbmdyb3VwczsKK307CisKKy8qKgorICogYmNtMjgxeHhfcGluY3RybF9kYXRhIC0gQnJvYWRjb20tc3BlY2lmaWMgcGluY3RybCBkYXRhCisgKiBAcmVnX2Jhc2UgLSBiYXNlIG9mIHBpbmN0cmwgcmVnaXN0ZXJzCisgKi8KK3N0cnVjdCBiY20yODF4eF9waW5jdHJsX2RhdGEgeworCXZvaWQgX19pb21lbSAqcmVnX2Jhc2U7CisKKwkvKiBMaXN0IG9mIGFsbCBwaW5zICovCisJY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgKnBpbnM7CisJY29uc3QgdW5zaWduZWQgbnBpbnM7CisKKwljb25zdCBzdHJ1Y3QgYmNtMjgxeHhfcGluX2Z1bmN0aW9uICpmdW5jdGlvbnM7CisJY29uc3QgdW5zaWduZWQgbmZ1bmN0aW9uczsKKworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKK307CisKKy8qCisgKiBQaW4gbnVtYmVyIGRlZmluaXRpb24uICBUaGUgb3JkZXIgaGVyZSBtdXN0IGJlIHRoZSBzYW1lIGFzIGRlZmluZWQgaW4gdGhlCisgKiBQQURDVFJMUkVHIGJsb2NrIGluIHRoZSBSREIuCisgKi8KKyNkZWZpbmUgQkNNMjgxWFhfUElOX0FEQ1NZTkMJCTAKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0JBVF9STQkJMQorI2RlZmluZSBCQ00yODFYWF9QSU5fQlNDMV9TQ0wJCTIKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0JTQzFfU0RBCQkzCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9CU0MyX1NDTAkJNAorI2RlZmluZSBCQ00yODFYWF9QSU5fQlNDMl9TREEJCTUKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0NMQVNTR1BXUgkJNgorI2RlZmluZSBCQ00yODFYWF9QSU5fQ0xLX0NYOAkJNworI2RlZmluZSBCQ00yODFYWF9QSU5fQ0xLT1VUXzAJCTgKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0NMS09VVF8xCQk5CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9DTEtPVVRfMgkJMTAKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0NMS09VVF8zCQkxMQorI2RlZmluZSBCQ00yODFYWF9QSU5fQ0xLUkVRX0lOXzAJMTIKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0NMS1JFUV9JTl8xCTEzCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9DV1NfU1lTX1JFUTEJMTQKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0NXU19TWVNfUkVRMgkxNQorI2RlZmluZSBCQ00yODFYWF9QSU5fQ1dTX1NZU19SRVEzCTE2CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9ESUdNSUMxX0NMSwkxNworI2RlZmluZSBCQ00yODFYWF9QSU5fRElHTUlDMV9EUQkJMTgKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0RJR01JQzJfQ0xLCTE5CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9ESUdNSUMyX0RRCQkyMAorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BFTjEzCQkyMQorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BFTjE0CQkyMgorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BFTjE1CQkyMworI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzAwCQkyNAorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzAxCQkyNQorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzAyCQkyNgorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzAzCQkyNworI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzA0CQkyOAorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzA1CQkyOQorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzA2CQkzMAorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzA3CQkzMQorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzA4CQkzMgorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzA5CQkzMworI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzEwCQkzNAorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzExCQkzNQorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzEyCQkzNgorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzEzCQkzNworI2RlZmluZSBCQ00yODFYWF9QSU5fR1BJTzE0CQkzOAorI2RlZmluZSBCQ00yODFYWF9QSU5fR1BTX1BBQkxBTksJMzkKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0dQU19UTUFSSwkJNDAKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0hETUlfU0NMCQk0MQorI2RlZmluZSBCQ00yODFYWF9QSU5fSERNSV9TREEJCTQyCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9JQ19ETQkJNDMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0lDX0RQCQk0NAorI2RlZmluZSBCQ00yODFYWF9QSU5fS1BfQ09MX0lQXzAJNDUKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0tQX0NPTF9JUF8xCTQ2CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9LUF9DT0xfSVBfMgk0NworI2RlZmluZSBCQ00yODFYWF9QSU5fS1BfQ09MX0lQXzMJNDgKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0tQX1JPV19PUF8wCTQ5CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9LUF9ST1dfT1BfMQk1MAorI2RlZmluZSBCQ00yODFYWF9QSU5fS1BfUk9XX09QXzIJNTEKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0tQX1JPV19PUF8zCTUyCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfQl8wCQk1MworI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX0JfMQkJNTQKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9CXzIJCTU1CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfQl8zCQk1NgorI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX0JfNAkJNTcKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9CXzUJCTU4CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfQl82CQk1OQorI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX0JfNwkJNjAKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9HXzAJCTYxCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfR18xCQk2MgorI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX0dfMgkJNjMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9HXzMJCTY0CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfR180CQk2NQorI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX0dfNQkJNjYKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9HXzYJCTY3CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfR183CQk2OAorI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX0hTWU5DCQk2OQorI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX09FCQk3MAorI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX1BDTEsJCTcxCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfUl8wCQk3MgorI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX1JfMQkJNzMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9SXzIJCTc0CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfUl8zCQk3NQorI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX1JfNAkJNzYKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9SXzUJCTc3CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfUl82CQk3OAorI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX1JfNwkJNzkKKyNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9WU1lOQwkJODAKKyNkZWZpbmUgQkNNMjgxWFhfUElOX01ETUdQSU8wCQk4MQorI2RlZmluZSBCQ00yODFYWF9QSU5fTURNR1BJTzEJCTgyCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NRE1HUElPMgkJODMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX01ETUdQSU8zCQk4NAorI2RlZmluZSBCQ00yODFYWF9QSU5fTURNR1BJTzQJCTg1CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NRE1HUElPNQkJODYKKyNkZWZpbmUgQkNNMjgxWFhfUElOX01ETUdQSU82CQk4NworI2RlZmluZSBCQ00yODFYWF9QSU5fTURNR1BJTzcJCTg4CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NRE1HUElPOAkJODkKKyNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV8wCTkwCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfMQk5MQorI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9EQVRBXzIJOTIKKyNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV8zCTkzCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfNAk5NAorI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9EQVRBXzUJOTUKKyNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV82CTk2CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfNwk5NworI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9EQVRBXzgJOTgKKyNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV85CTk5CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfMTAJMTAwCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfMTEJMTAxCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfMTIJMTAyCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfMTMJMTAzCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfMTQJMTA0CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfMTUJMTA1CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0hBMAkJMTA2CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0hBVDAJCTEwNworI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9IQVQxCQkxMDgKKyNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfSENFMF9OCTEwOQorI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9IQ0UxX04JMTEwCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0hSRF9OCQkxMTEKKyNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfSFdSX04JCTExMgorI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9SVU4wCQkxMTMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfUlVOMQkJMTE0CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NVFhfU0NBTl9DTEsJMTE1CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NVFhfU0NBTl9EQVRBCTExNgorI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9BRF8wCQkxMTcKKyNkZWZpbmUgQkNNMjgxWFhfUElOX05BTkRfQURfMQkJMTE4CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9OQU5EX0FEXzIJCTExOQorI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9BRF8zCQkxMjAKKyNkZWZpbmUgQkNNMjgxWFhfUElOX05BTkRfQURfNAkJMTIxCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9OQU5EX0FEXzUJCTEyMgorI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9BRF82CQkxMjMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX05BTkRfQURfNwkJMTI0CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9OQU5EX0FMRQkJMTI1CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9OQU5EX0NFTl8wCQkxMjYKKyNkZWZpbmUgQkNNMjgxWFhfUElOX05BTkRfQ0VOXzEJCTEyNworI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9DTEUJCTEyOAorI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9PRU4JCTEyOQorI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9SRFlfMAkJMTMwCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9OQU5EX1JEWV8xCQkxMzEKKyNkZWZpbmUgQkNNMjgxWFhfUElOX05BTkRfV0VOCQkxMzIKKyNkZWZpbmUgQkNNMjgxWFhfUElOX05BTkRfV1AJCTEzMworI2RlZmluZSBCQ00yODFYWF9QSU5fUEMxCQkxMzQKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1BDMgkJMTM1CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9QTVVfSU5UCQkxMzYKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1BNVV9TQ0wJCTEzNworI2RlZmluZSBCQ00yODFYWF9QSU5fUE1VX1NEQQkJMTM4CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SRlNUMkdfTVRTTE9URU4zRwkxMzkKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzBfUlhfQ1RMCTE0MAorI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMF9SWEMJMTQxCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8wX1JYRF8wCTE0MgorI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMF9SWERfMQkxNDMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzBfUlhEXzIJMTQ0CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8wX1JYRF8zCTE0NQorI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMF9UWF9DVEwJMTQ2CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8wX1RYQwkxNDcKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzBfVFhEXzAJMTQ4CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8wX1RYRF8xCTE0OQorI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMF9UWERfMgkxNTAKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzBfVFhEXzMJMTUxCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8xX1JYX0NUTAkxNTIKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzFfUlhDCTE1MworI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMV9SWERfMAkxNTQKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzFfUlhEXzEJMTU1CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8xX1JYRF8yCTE1NgorI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMV9SWERfMwkxNTcKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzFfVFhfQ1RMCTE1OAorI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMV9UWEMJMTU5CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8xX1RYRF8wCTE2MAorI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMV9UWERfMQkxNjEKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzFfVFhEXzIJMTYyCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8xX1RYRF8zCTE2MworI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfR1BJT18wCTE2NAorI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfR1BJT18xCTE2NQorI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfR1BJT18yCTE2NgorI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfR1BJT18zCTE2NworI2RlZmluZSBCQ00yODFYWF9QSU5fUlRYREFUQTJHX1RYREFUQTNHMQkxNjgKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1JUWEVOMkdfVFhEQVRBM0cyCTE2OQorI2RlZmluZSBCQ00yODFYWF9QSU5fUlhEQVRBM0cwCQkxNzAKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1JYREFUQTNHMQkJMTcxCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9SWERBVEEzRzIJCTE3MgorI2RlZmluZSBCQ00yODFYWF9QSU5fU0RJTzFfQ0xLCQkxNzMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NESU8xX0NNRAkJMTc0CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TRElPMV9EQVRBXzAJMTc1CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TRElPMV9EQVRBXzEJMTc2CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TRElPMV9EQVRBXzIJMTc3CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TRElPMV9EQVRBXzMJMTc4CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TRElPNF9DTEsJCTE3OQorI2RlZmluZSBCQ00yODFYWF9QSU5fU0RJTzRfQ01ECQkxODAKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NESU80X0RBVEFfMAkxODEKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NESU80X0RBVEFfMQkxODIKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NESU80X0RBVEFfMgkxODMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NESU80X0RBVEFfMwkxODQKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NJTV9DTEsJCTE4NQorI2RlZmluZSBCQ00yODFYWF9QSU5fU0lNX0RBVEEJCTE4NgorI2RlZmluZSBCQ00yODFYWF9QSU5fU0lNX0RFVAkJMTg3CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TSU1fUkVTRVROCQkxODgKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NJTTJfQ0xLCQkxODkKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NJTTJfREFUQQkJMTkwCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TSU0yX0RFVAkJMTkxCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TSU0yX1JFU0VUTgkxOTIKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NSSV9DCQkxOTMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NSSV9ECQkxOTQKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NSSV9FCQkxOTUKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUF9FWFRDTEsJCTE5NgorI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQMF9DTEsJCTE5NworI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQMF9GUwkJMTk4CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AwX1JYRAkJMTk5CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AwX1RYRAkJMjAwCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AyX0NMSwkJMjAxCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AyX0ZTXzAJCTIwMgorI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQMl9GU18xCQkyMDMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDJfRlNfMgkJMjA0CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AyX0ZTXzMJCTIwNQorI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQMl9SWERfMAkJMjA2CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AyX1JYRF8xCQkyMDcKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDJfVFhEXzAJCTIwOAorI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQMl9UWERfMQkJMjA5CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AzX0NMSwkJMjEwCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AzX0ZTCQkyMTEKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDNfUlhECQkyMTIKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDNfVFhECQkyMTMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDRfQ0xLCQkyMTQKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDRfRlMJCTIxNQorI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQNF9SWEQJCTIxNgorI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQNF9UWEQJCTIxNworI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQNV9DTEsJCTIxOAorI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQNV9GUwkJMjE5CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1A1X1JYRAkJMjIwCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1A1X1RYRAkJMjIxCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1A2X0NMSwkJMjIyCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1A2X0ZTCQkyMjMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDZfUlhECQkyMjQKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDZfVFhECQkyMjUKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1NUQVRfMQkJMjI2CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TVEFUXzIJCTIyNworI2RlZmluZSBCQ00yODFYWF9QSU5fU1lTQ0xLRU4JCTIyOAorI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VDTEsJCTIyOQorI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VEVDAwCQkyMzAKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1RSQUNFRFQwMQkJMjMxCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRURUMDIJCTIzMgorI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VEVDAzCQkyMzMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1RSQUNFRFQwNAkJMjM0CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRURUMDUJCTIzNQorI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VEVDA2CQkyMzYKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1RSQUNFRFQwNwkJMjM3CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRURUMDgJCTIzOAorI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VEVDA5CQkyMzkKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1RSQUNFRFQxMAkJMjQwCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRURUMTEJCTI0MQorI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VEVDEyCQkyNDIKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1RSQUNFRFQxMwkJMjQzCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRURUMTQJCTI0NAorI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VEVDE1CQkyNDUKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1RYREFUQTNHMAkJMjQ2CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9UWFBXUklORAkJMjQ3CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9VQVJUQjFfVUNUUwkyNDgKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1VBUlRCMV9VUlRTCTI0OQorI2RlZmluZSBCQ00yODFYWF9QSU5fVUFSVEIxX1VSWEQJMjUwCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9VQVJUQjFfVVRYRAkyNTEKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1VBUlRCMl9VUlhECTI1MgorI2RlZmluZSBCQ00yODFYWF9QSU5fVUFSVEIyX1VUWEQJMjUzCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9VQVJUQjNfVUNUUwkyNTQKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1VBUlRCM19VUlRTCTI1NQorI2RlZmluZSBCQ00yODFYWF9QSU5fVUFSVEIzX1VSWEQJMjU2CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9VQVJUQjNfVVRYRAkyNTcKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1VBUlRCNF9VQ1RTCTI1OAorI2RlZmluZSBCQ00yODFYWF9QSU5fVUFSVEI0X1VSVFMJMjU5CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9VQVJUQjRfVVJYRAkyNjAKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1VBUlRCNF9VVFhECTI2MQorI2RlZmluZSBCQ00yODFYWF9QSU5fVkNfQ0FNMV9TQ0wJMjYyCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9WQ19DQU0xX1NEQQkyNjMKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1ZDX0NBTTJfU0NMCTI2NAorI2RlZmluZSBCQ00yODFYWF9QSU5fVkNfQ0FNMl9TREEJMjY1CisjZGVmaW5lIEJDTTI4MVhYX1BJTl9WQ19DQU0zX1NDTAkyNjYKKyNkZWZpbmUgQkNNMjgxWFhfUElOX1ZDX0NBTTNfU0RBCTI2NworCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9ERVNDKGEsIGIsIGMpIFwKKwl7IC5udW1iZXIgPSBhLCAubmFtZSA9IGIsIC5kcnZfZGF0YSA9ICZjIyNfcGluIH0KKworLyoKKyAqIFBpbiBkZXNjcmlwdGlvbiBkZWZpbml0aW9uLiAgVGhlIG9yZGVyIGhlcmUgbXVzdCBiZSB0aGUgc2FtZSBhcyBkZWZpbmVkIGluCisgKiB0aGUgUEFEQ1RSTFJFRyBibG9jayBpbiB0aGUgUkRCLCBzaW5jZSB0aGUgcGluIG51bWJlciBpcyB1c2VkIGFzIGFuIGluZGV4CisgKiBpbnRvIHRoaXMgYXJyYXkuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyBiY20yODF4eF9waW5jdHJsX3BpbnNbXSA9IHsKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fQURDU1lOQywgImFkY3N5bmMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9CQVRfUk0sICJiYXRfcm0iLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9CU0MxX1NDTCwgImJzYzFfc2NsIiwgaTJjKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fQlNDMV9TREEsICJic2MxX3NkYSIsIGkyYyksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0JTQzJfU0NMLCAiYnNjMl9zY2wiLCBpMmMpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9CU0MyX1NEQSwgImJzYzJfc2RhIiwgaTJjKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fQ0xBU1NHUFdSLCAiY2xhc3NncHdyIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fQ0xLX0NYOCwgImNsa19jeDgiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9DTEtPVVRfMCwgImNsa291dF8wIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fQ0xLT1VUXzEsICJjbGtvdXRfMSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0NMS09VVF8yLCAiY2xrb3V0XzIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9DTEtPVVRfMywgImNsa291dF8zIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fQ0xLUkVRX0lOXzAsICJjbGtyZXFfaW5fMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0NMS1JFUV9JTl8xLCAiY2xrcmVxX2luXzEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9DV1NfU1lTX1JFUTEsICJjd3Nfc3lzX3JlcTEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9DV1NfU1lTX1JFUTIsICJjd3Nfc3lzX3JlcTIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9DV1NfU1lTX1JFUTMsICJjd3Nfc3lzX3JlcTMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9ESUdNSUMxX0NMSywgImRpZ21pYzFfY2xrIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fRElHTUlDMV9EUSwgImRpZ21pYzFfZHEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9ESUdNSUMyX0NMSywgImRpZ21pYzJfY2xrIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fRElHTUlDMl9EUSwgImRpZ21pYzJfZHEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUEVOMTMsICJncGVuMTMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUEVOMTQsICJncGVuMTQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUEVOMTUsICJncGVuMTUiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMDAsICJncGlvMDAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMDEsICJncGlvMDEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMDIsICJncGlvMDIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMDMsICJncGlvMDMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMDQsICJncGlvMDQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMDUsICJncGlvMDUiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMDYsICJncGlvMDYiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMDcsICJncGlvMDciLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMDgsICJncGlvMDgiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMDksICJncGlvMDkiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMTAsICJncGlvMTAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMTEsICJncGlvMTEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMTIsICJncGlvMTIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMTMsICJncGlvMTMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUElPMTQsICJncGlvMTQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUFNfUEFCTEFOSywgImdwc19wYWJsYW5rIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fR1BTX1RNQVJLLCAiZ3BzX3RtYXJrIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fSERNSV9TQ0wsICJoZG1pX3NjbCIsIGhkbWkpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9IRE1JX1NEQSwgImhkbWlfc2RhIiwgaGRtaSksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0lDX0RNLCAiaWNfZG0iLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9JQ19EUCwgImljX2RwIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fS1BfQ09MX0lQXzAsICJrcF9jb2xfaXBfMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0tQX0NPTF9JUF8xLCAia3BfY29sX2lwXzEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9LUF9DT0xfSVBfMiwgImtwX2NvbF9pcF8yIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fS1BfQ09MX0lQXzMsICJrcF9jb2xfaXBfMyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0tQX1JPV19PUF8wLCAia3Bfcm93X29wXzAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9LUF9ST1dfT1BfMSwgImtwX3Jvd19vcF8xIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fS1BfUk9XX09QXzIsICJrcF9yb3dfb3BfMiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0tQX1JPV19PUF8zLCAia3Bfcm93X29wXzMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfQl8wLCAibGNkX2JfMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9CXzEsICJsY2RfYl8xIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX0JfMiwgImxjZF9iXzIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfQl8zLCAibGNkX2JfMyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9CXzQsICJsY2RfYl80Iiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX0JfNSwgImxjZF9iXzUiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfQl82LCAibGNkX2JfNiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9CXzcsICJsY2RfYl83Iiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX0dfMCwgImxjZF9nXzAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfR18xLCAibGNkX2dfMSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9HXzIsICJsY2RfZ18yIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX0dfMywgImxjZF9nXzMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfR180LCAibGNkX2dfNCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9HXzUsICJsY2RfZ181Iiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX0dfNiwgImxjZF9nXzYiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfR183LCAibGNkX2dfNyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9IU1lOQywgImxjZF9oc3luYyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9PRSwgImxjZF9vZSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9QQ0xLLCAibGNkX3BjbGsiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfUl8wLCAibGNkX3JfMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9SXzEsICJsY2Rfcl8xIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX1JfMiwgImxjZF9yXzIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfUl8zLCAibGNkX3JfMyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9SXzQsICJsY2Rfcl80Iiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX1JfNSwgImxjZF9yXzUiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfUl82LCAibGNkX3JfNiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9SXzcsICJsY2Rfcl83Iiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX1ZTWU5DLCAibGNkX3ZzeW5jIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTURNR1BJTzAsICJtZG1ncGlvMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01ETUdQSU8xLCAibWRtZ3BpbzEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NRE1HUElPMiwgIm1kbWdwaW8yIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTURNR1BJTzMsICJtZG1ncGlvMyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01ETUdQSU80LCAibWRtZ3BpbzQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NRE1HUElPNSwgIm1kbWdwaW81Iiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTURNR1BJTzYsICJtZG1ncGlvNiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01ETUdQSU83LCAibWRtZ3BpbzciLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NRE1HUElPOCwgIm1kbWdwaW84Iiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzAsICJtcGhpX2RhdGFfMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV8xLCAibXBoaV9kYXRhXzEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfMiwgIm1waGlfZGF0YV8yIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzMsICJtcGhpX2RhdGFfMyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV80LCAibXBoaV9kYXRhXzQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfNSwgIm1waGlfZGF0YV81Iiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzYsICJtcGhpX2RhdGFfNiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV83LCAibXBoaV9kYXRhXzciLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfOCwgIm1waGlfZGF0YV84Iiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzksICJtcGhpX2RhdGFfOSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV8xMCwgIm1waGlfZGF0YV8xMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV8xMSwgIm1waGlfZGF0YV8xMSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV8xMiwgIm1waGlfZGF0YV8xMiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV8xMywgIm1waGlfZGF0YV8xMyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV8xNCwgIm1waGlfZGF0YV8xNCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV8xNSwgIm1waGlfZGF0YV8xNSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfSEEwLCAibXBoaV9oYTAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0hBVDAsICJtcGhpX2hhdDAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0hBVDEsICJtcGhpX2hhdDEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0hDRTBfTiwgIm1waGlfaGNlMF9uIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9IQ0UxX04sICJtcGhpX2hjZTFfbiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfSFJEX04sICJtcGhpX2hyZF9uIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9IV1JfTiwgIm1waGlfaHdyX24iLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX1JVTjAsICJtcGhpX3J1bjAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX1JVTjEsICJtcGhpX3J1bjEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NVFhfU0NBTl9DTEssICJtdHhfc2Nhbl9jbGsiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NVFhfU0NBTl9EQVRBLCAibXR4X3NjYW5fZGF0YSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfQURfMCwgIm5hbmRfYWRfMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfQURfMSwgIm5hbmRfYWRfMSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfQURfMiwgIm5hbmRfYWRfMiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfQURfMywgIm5hbmRfYWRfMyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfQURfNCwgIm5hbmRfYWRfNCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfQURfNSwgIm5hbmRfYWRfNSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfQURfNiwgIm5hbmRfYWRfNiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfQURfNywgIm5hbmRfYWRfNyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfQUxFLCAibmFuZF9hbGUiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9OQU5EX0NFTl8wLCAibmFuZF9jZW5fMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfQ0VOXzEsICJuYW5kX2Nlbl8xIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9DTEUsICJuYW5kX2NsZSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfT0VOLCAibmFuZF9vZW4iLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9OQU5EX1JEWV8wLCAibmFuZF9yZHlfMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfUkRZXzEsICJuYW5kX3JkeV8xIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9XRU4sICJuYW5kX3dlbiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfV1AsICJuYW5kX3dwIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUEMxLCAicGMxIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUEMyLCAicGMyIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUE1VX0lOVCwgInBtdV9pbnQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9QTVVfU0NMLCAicG11X3NjbCIsIGkyYyksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1BNVV9TREEsICJwbXVfc2RhIiwgaTJjKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkZTVDJHX01UU0xPVEVOM0csICJyZnN0MmdfbXRzbG90ZW4zZyIsCisJCXN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzBfUlhfQ1RMLCAicmdtaWlfMF9yeF9jdGwiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8wX1JYQywgInJnbWlpXzBfcnhjIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMF9SWERfMCwgInJnbWlpXzBfcnhkXzAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8wX1JYRF8xLCAicmdtaWlfMF9yeGRfMSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzBfUlhEXzIsICJyZ21paV8wX3J4ZF8yIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMF9SWERfMywgInJnbWlpXzBfcnhkXzMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8wX1RYX0NUTCwgInJnbWlpXzBfdHhfY3RsIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMF9UWEMsICJyZ21paV8wX3R4YyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzBfVFhEXzAsICJyZ21paV8wX3R4ZF8wIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMF9UWERfMSwgInJnbWlpXzBfdHhkXzEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8wX1RYRF8yLCAicmdtaWlfMF90eGRfMiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzBfVFhEXzMsICJyZ21paV8wX3R4ZF8zIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMV9SWF9DVEwsICJyZ21paV8xX3J4X2N0bCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzFfUlhDLCAicmdtaWlfMV9yeGMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8xX1JYRF8wLCAicmdtaWlfMV9yeGRfMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzFfUlhEXzEsICJyZ21paV8xX3J4ZF8xIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMV9SWERfMiwgInJnbWlpXzFfcnhkXzIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8xX1JYRF8zLCAicmdtaWlfMV9yeGRfMyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzFfVFhfQ1RMLCAicmdtaWlfMV90eF9jdGwiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8xX1RYQywgInJnbWlpXzFfdHhjIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMV9UWERfMCwgInJnbWlpXzFfdHhkXzAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8xX1RYRF8xLCAicmdtaWlfMV90eGRfMSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzFfVFhEXzIsICJyZ21paV8xX3R4ZF8yIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMV9UWERfMywgInJnbWlpXzFfdHhkXzMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV9HUElPXzAsICJyZ21paV9ncGlvXzAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV9HUElPXzEsICJyZ21paV9ncGlvXzEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV9HUElPXzIsICJyZ21paV9ncGlvXzIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV9HUElPXzMsICJyZ21paV9ncGlvXzMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SVFhEQVRBMkdfVFhEQVRBM0cxLAorCQkicnR4ZGF0YTJnX3R4ZGF0YTNnMSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JUWEVOMkdfVFhEQVRBM0cyLCAicnR4ZW4yZ190eGRhdGEzZzIiLAorCQlzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SWERBVEEzRzAsICJyeGRhdGEzZzAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SWERBVEEzRzEsICJyeGRhdGEzZzEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SWERBVEEzRzIsICJyeGRhdGEzZzIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPMV9DTEssICJzZGlvMV9jbGsiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPMV9DTUQsICJzZGlvMV9jbWQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPMV9EQVRBXzAsICJzZGlvMV9kYXRhXzAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPMV9EQVRBXzEsICJzZGlvMV9kYXRhXzEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPMV9EQVRBXzIsICJzZGlvMV9kYXRhXzIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPMV9EQVRBXzMsICJzZGlvMV9kYXRhXzMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPNF9DTEssICJzZGlvNF9jbGsiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPNF9DTUQsICJzZGlvNF9jbWQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPNF9EQVRBXzAsICJzZGlvNF9kYXRhXzAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPNF9EQVRBXzEsICJzZGlvNF9kYXRhXzEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPNF9EQVRBXzIsICJzZGlvNF9kYXRhXzIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TRElPNF9EQVRBXzMsICJzZGlvNF9kYXRhXzMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TSU1fQ0xLLCAic2ltX2NsayIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NJTV9EQVRBLCAic2ltX2RhdGEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TSU1fREVULCAic2ltX2RldCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NJTV9SRVNFVE4sICJzaW1fcmVzZXRuIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU0lNMl9DTEssICJzaW0yX2NsayIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NJTTJfREFUQSwgInNpbTJfZGF0YSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NJTTJfREVULCAic2ltMl9kZXQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TSU0yX1JFU0VUTiwgInNpbTJfcmVzZXRuIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1JJX0MsICJzcmlfYyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NSSV9ELCAic3JpX2QiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TUklfRSwgInNyaV9lIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQX0VYVENMSywgInNzcF9leHRjbGsiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AwX0NMSywgInNzcDBfY2xrIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQMF9GUywgInNzcDBfZnMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AwX1JYRCwgInNzcDBfcnhkIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQMF9UWEQsICJzc3AwX3R4ZCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDJfQ0xLLCAic3NwMl9jbGsiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AyX0ZTXzAsICJzc3AyX2ZzXzAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AyX0ZTXzEsICJzc3AyX2ZzXzEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AyX0ZTXzIsICJzc3AyX2ZzXzIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AyX0ZTXzMsICJzc3AyX2ZzXzMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AyX1JYRF8wLCAic3NwMl9yeGRfMCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDJfUlhEXzEsICJzc3AyX3J4ZF8xIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQMl9UWERfMCwgInNzcDJfdHhkXzAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AyX1RYRF8xLCAic3NwMl90eGRfMSIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDNfQ0xLLCAic3NwM19jbGsiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AzX0ZTLCAic3NwM19mcyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDNfUlhELCAic3NwM19yeGQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AzX1RYRCwgInNzcDNfdHhkIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQNF9DTEssICJzc3A0X2NsayIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDRfRlMsICJzc3A0X2ZzIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQNF9SWEQsICJzc3A0X3J4ZCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDRfVFhELCAic3NwNF90eGQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1A1X0NMSywgInNzcDVfY2xrIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQNV9GUywgInNzcDVfZnMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1A1X1JYRCwgInNzcDVfcnhkIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQNV9UWEQsICJzc3A1X3R4ZCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDZfQ0xLLCAic3NwNl9jbGsiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1A2X0ZTLCAic3NwNl9mcyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDZfUlhELCAic3NwNl9yeGQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1A2X1RYRCwgInNzcDZfdHhkIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1RBVF8xLCAic3RhdF8xIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1RBVF8yLCAic3RhdF8yIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1lTQ0xLRU4sICJzeXNjbGtlbiIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFQ0xLLCAidHJhY2VjbGsiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMDAsICJ0cmFjZWR0MDAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMDEsICJ0cmFjZWR0MDEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMDIsICJ0cmFjZWR0MDIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMDMsICJ0cmFjZWR0MDMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMDQsICJ0cmFjZWR0MDQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMDUsICJ0cmFjZWR0MDUiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMDYsICJ0cmFjZWR0MDYiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMDcsICJ0cmFjZWR0MDciLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMDgsICJ0cmFjZWR0MDgiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMDksICJ0cmFjZWR0MDkiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMTAsICJ0cmFjZWR0MTAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMTEsICJ0cmFjZWR0MTEiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMTIsICJ0cmFjZWR0MTIiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMTMsICJ0cmFjZWR0MTMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMTQsICJ0cmFjZWR0MTQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UUkFDRURUMTUsICJ0cmFjZWR0MTUiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UWERBVEEzRzAsICJ0eGRhdGEzZzAiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9UWFBXUklORCwgInR4cHdyaW5kIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVUFSVEIxX1VDVFMsICJ1YXJ0YjFfdWN0cyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1VBUlRCMV9VUlRTLCAidWFydGIxX3VydHMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9VQVJUQjFfVVJYRCwgInVhcnRiMV91cnhkIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVUFSVEIxX1VUWEQsICJ1YXJ0YjFfdXR4ZCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1VBUlRCMl9VUlhELCAidWFydGIyX3VyeGQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9VQVJUQjJfVVRYRCwgInVhcnRiMl91dHhkIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVUFSVEIzX1VDVFMsICJ1YXJ0YjNfdWN0cyIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1VBUlRCM19VUlRTLCAidWFydGIzX3VydHMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9VQVJUQjNfVVJYRCwgInVhcnRiM191cnhkIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVUFSVEIzX1VUWEQsICJ1YXJ0YjNfdXR4ZCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1VBUlRCNF9VQ1RTLCAidWFydGI0X3VjdHMiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9VQVJUQjRfVVJUUywgInVhcnRiNF91cnRzIiwgc3RkKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVUFSVEI0X1VSWEQsICJ1YXJ0YjRfdXJ4ZCIsIHN0ZCksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1VBUlRCNF9VVFhELCAidWFydGI0X3V0eGQiLCBzdGQpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9WQ19DQU0xX1NDTCwgInZjX2NhbTFfc2NsIiwgaTJjKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVkNfQ0FNMV9TREEsICJ2Y19jYW0xX3NkYSIsIGkyYyksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1ZDX0NBTTJfU0NMLCAidmNfY2FtMl9zY2wiLCBpMmMpLAorCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9WQ19DQU0yX1NEQSwgInZjX2NhbTJfc2RhIiwgaTJjKSwKKwlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVkNfQ0FNM19TQ0wsICJ2Y19jYW0zX3NjbCIsIGkyYyksCisJQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1ZDX0NBTTNfU0RBLCAidmNfY2FtM19zZGEiLCBpMmMpLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBiY20yODF4eF9hbHRfZ3JvdXBzW10gPSB7CisJImFkY3N5bmMiLAorCSJiYXRfcm0iLAorCSJic2MxX3NjbCIsCisJImJzYzFfc2RhIiwKKwkiYnNjMl9zY2wiLAorCSJic2MyX3NkYSIsCisJImNsYXNzZ3B3ciIsCisJImNsa19jeDgiLAorCSJjbGtvdXRfMCIsCisJImNsa291dF8xIiwKKwkiY2xrb3V0XzIiLAorCSJjbGtvdXRfMyIsCisJImNsa3JlcV9pbl8wIiwKKwkiY2xrcmVxX2luXzEiLAorCSJjd3Nfc3lzX3JlcTEiLAorCSJjd3Nfc3lzX3JlcTIiLAorCSJjd3Nfc3lzX3JlcTMiLAorCSJkaWdtaWMxX2NsayIsCisJImRpZ21pYzFfZHEiLAorCSJkaWdtaWMyX2NsayIsCisJImRpZ21pYzJfZHEiLAorCSJncGVuMTMiLAorCSJncGVuMTQiLAorCSJncGVuMTUiLAorCSJncGlvMDAiLAorCSJncGlvMDEiLAorCSJncGlvMDIiLAorCSJncGlvMDMiLAorCSJncGlvMDQiLAorCSJncGlvMDUiLAorCSJncGlvMDYiLAorCSJncGlvMDciLAorCSJncGlvMDgiLAorCSJncGlvMDkiLAorCSJncGlvMTAiLAorCSJncGlvMTEiLAorCSJncGlvMTIiLAorCSJncGlvMTMiLAorCSJncGlvMTQiLAorCSJncHNfcGFibGFuayIsCisJImdwc190bWFyayIsCisJImhkbWlfc2NsIiwKKwkiaGRtaV9zZGEiLAorCSJpY19kbSIsCisJImljX2RwIiwKKwkia3BfY29sX2lwXzAiLAorCSJrcF9jb2xfaXBfMSIsCisJImtwX2NvbF9pcF8yIiwKKwkia3BfY29sX2lwXzMiLAorCSJrcF9yb3dfb3BfMCIsCisJImtwX3Jvd19vcF8xIiwKKwkia3Bfcm93X29wXzIiLAorCSJrcF9yb3dfb3BfMyIsCisJImxjZF9iXzAiLAorCSJsY2RfYl8xIiwKKwkibGNkX2JfMiIsCisJImxjZF9iXzMiLAorCSJsY2RfYl80IiwKKwkibGNkX2JfNSIsCisJImxjZF9iXzYiLAorCSJsY2RfYl83IiwKKwkibGNkX2dfMCIsCisJImxjZF9nXzEiLAorCSJsY2RfZ18yIiwKKwkibGNkX2dfMyIsCisJImxjZF9nXzQiLAorCSJsY2RfZ181IiwKKwkibGNkX2dfNiIsCisJImxjZF9nXzciLAorCSJsY2RfaHN5bmMiLAorCSJsY2Rfb2UiLAorCSJsY2RfcGNsayIsCisJImxjZF9yXzAiLAorCSJsY2Rfcl8xIiwKKwkibGNkX3JfMiIsCisJImxjZF9yXzMiLAorCSJsY2Rfcl80IiwKKwkibGNkX3JfNSIsCisJImxjZF9yXzYiLAorCSJsY2Rfcl83IiwKKwkibGNkX3ZzeW5jIiwKKwkibWRtZ3BpbzAiLAorCSJtZG1ncGlvMSIsCisJIm1kbWdwaW8yIiwKKwkibWRtZ3BpbzMiLAorCSJtZG1ncGlvNCIsCisJIm1kbWdwaW81IiwKKwkibWRtZ3BpbzYiLAorCSJtZG1ncGlvNyIsCisJIm1kbWdwaW84IiwKKwkibXBoaV9kYXRhXzAiLAorCSJtcGhpX2RhdGFfMSIsCisJIm1waGlfZGF0YV8yIiwKKwkibXBoaV9kYXRhXzMiLAorCSJtcGhpX2RhdGFfNCIsCisJIm1waGlfZGF0YV81IiwKKwkibXBoaV9kYXRhXzYiLAorCSJtcGhpX2RhdGFfNyIsCisJIm1waGlfZGF0YV84IiwKKwkibXBoaV9kYXRhXzkiLAorCSJtcGhpX2RhdGFfMTAiLAorCSJtcGhpX2RhdGFfMTEiLAorCSJtcGhpX2RhdGFfMTIiLAorCSJtcGhpX2RhdGFfMTMiLAorCSJtcGhpX2RhdGFfMTQiLAorCSJtcGhpX2RhdGFfMTUiLAorCSJtcGhpX2hhMCIsCisJIm1waGlfaGF0MCIsCisJIm1waGlfaGF0MSIsCisJIm1waGlfaGNlMF9uIiwKKwkibXBoaV9oY2UxX24iLAorCSJtcGhpX2hyZF9uIiwKKwkibXBoaV9od3JfbiIsCisJIm1waGlfcnVuMCIsCisJIm1waGlfcnVuMSIsCisJIm10eF9zY2FuX2NsayIsCisJIm10eF9zY2FuX2RhdGEiLAorCSJuYW5kX2FkXzAiLAorCSJuYW5kX2FkXzEiLAorCSJuYW5kX2FkXzIiLAorCSJuYW5kX2FkXzMiLAorCSJuYW5kX2FkXzQiLAorCSJuYW5kX2FkXzUiLAorCSJuYW5kX2FkXzYiLAorCSJuYW5kX2FkXzciLAorCSJuYW5kX2FsZSIsCisJIm5hbmRfY2VuXzAiLAorCSJuYW5kX2Nlbl8xIiwKKwkibmFuZF9jbGUiLAorCSJuYW5kX29lbiIsCisJIm5hbmRfcmR5XzAiLAorCSJuYW5kX3JkeV8xIiwKKwkibmFuZF93ZW4iLAorCSJuYW5kX3dwIiwKKwkicGMxIiwKKwkicGMyIiwKKwkicG11X2ludCIsCisJInBtdV9zY2wiLAorCSJwbXVfc2RhIiwKKwkicmZzdDJnX210c2xvdGVuM2ciLAorCSJyZ21paV8wX3J4X2N0bCIsCisJInJnbWlpXzBfcnhjIiwKKwkicmdtaWlfMF9yeGRfMCIsCisJInJnbWlpXzBfcnhkXzEiLAorCSJyZ21paV8wX3J4ZF8yIiwKKwkicmdtaWlfMF9yeGRfMyIsCisJInJnbWlpXzBfdHhfY3RsIiwKKwkicmdtaWlfMF90eGMiLAorCSJyZ21paV8wX3R4ZF8wIiwKKwkicmdtaWlfMF90eGRfMSIsCisJInJnbWlpXzBfdHhkXzIiLAorCSJyZ21paV8wX3R4ZF8zIiwKKwkicmdtaWlfMV9yeF9jdGwiLAorCSJyZ21paV8xX3J4YyIsCisJInJnbWlpXzFfcnhkXzAiLAorCSJyZ21paV8xX3J4ZF8xIiwKKwkicmdtaWlfMV9yeGRfMiIsCisJInJnbWlpXzFfcnhkXzMiLAorCSJyZ21paV8xX3R4X2N0bCIsCisJInJnbWlpXzFfdHhjIiwKKwkicmdtaWlfMV90eGRfMCIsCisJInJnbWlpXzFfdHhkXzEiLAorCSJyZ21paV8xX3R4ZF8yIiwKKwkicmdtaWlfMV90eGRfMyIsCisJInJnbWlpX2dwaW9fMCIsCisJInJnbWlpX2dwaW9fMSIsCisJInJnbWlpX2dwaW9fMiIsCisJInJnbWlpX2dwaW9fMyIsCisJInJ0eGRhdGEyZ190eGRhdGEzZzEiLAorCSJydHhlbjJnX3R4ZGF0YTNnMiIsCisJInJ4ZGF0YTNnMCIsCisJInJ4ZGF0YTNnMSIsCisJInJ4ZGF0YTNnMiIsCisJInNkaW8xX2NsayIsCisJInNkaW8xX2NtZCIsCisJInNkaW8xX2RhdGFfMCIsCisJInNkaW8xX2RhdGFfMSIsCisJInNkaW8xX2RhdGFfMiIsCisJInNkaW8xX2RhdGFfMyIsCisJInNkaW80X2NsayIsCisJInNkaW80X2NtZCIsCisJInNkaW80X2RhdGFfMCIsCisJInNkaW80X2RhdGFfMSIsCisJInNkaW80X2RhdGFfMiIsCisJInNkaW80X2RhdGFfMyIsCisJInNpbV9jbGsiLAorCSJzaW1fZGF0YSIsCisJInNpbV9kZXQiLAorCSJzaW1fcmVzZXRuIiwKKwkic2ltMl9jbGsiLAorCSJzaW0yX2RhdGEiLAorCSJzaW0yX2RldCIsCisJInNpbTJfcmVzZXRuIiwKKwkic3JpX2MiLAorCSJzcmlfZCIsCisJInNyaV9lIiwKKwkic3NwX2V4dGNsayIsCisJInNzcDBfY2xrIiwKKwkic3NwMF9mcyIsCisJInNzcDBfcnhkIiwKKwkic3NwMF90eGQiLAorCSJzc3AyX2NsayIsCisJInNzcDJfZnNfMCIsCisJInNzcDJfZnNfMSIsCisJInNzcDJfZnNfMiIsCisJInNzcDJfZnNfMyIsCisJInNzcDJfcnhkXzAiLAorCSJzc3AyX3J4ZF8xIiwKKwkic3NwMl90eGRfMCIsCisJInNzcDJfdHhkXzEiLAorCSJzc3AzX2NsayIsCisJInNzcDNfZnMiLAorCSJzc3AzX3J4ZCIsCisJInNzcDNfdHhkIiwKKwkic3NwNF9jbGsiLAorCSJzc3A0X2ZzIiwKKwkic3NwNF9yeGQiLAorCSJzc3A0X3R4ZCIsCisJInNzcDVfY2xrIiwKKwkic3NwNV9mcyIsCisJInNzcDVfcnhkIiwKKwkic3NwNV90eGQiLAorCSJzc3A2X2NsayIsCisJInNzcDZfZnMiLAorCSJzc3A2X3J4ZCIsCisJInNzcDZfdHhkIiwKKwkic3RhdF8xIiwKKwkic3RhdF8yIiwKKwkic3lzY2xrZW4iLAorCSJ0cmFjZWNsayIsCisJInRyYWNlZHQwMCIsCisJInRyYWNlZHQwMSIsCisJInRyYWNlZHQwMiIsCisJInRyYWNlZHQwMyIsCisJInRyYWNlZHQwNCIsCisJInRyYWNlZHQwNSIsCisJInRyYWNlZHQwNiIsCisJInRyYWNlZHQwNyIsCisJInRyYWNlZHQwOCIsCisJInRyYWNlZHQwOSIsCisJInRyYWNlZHQxMCIsCisJInRyYWNlZHQxMSIsCisJInRyYWNlZHQxMiIsCisJInRyYWNlZHQxMyIsCisJInRyYWNlZHQxNCIsCisJInRyYWNlZHQxNSIsCisJInR4ZGF0YTNnMCIsCisJInR4cHdyaW5kIiwKKwkidWFydGIxX3VjdHMiLAorCSJ1YXJ0YjFfdXJ0cyIsCisJInVhcnRiMV91cnhkIiwKKwkidWFydGIxX3V0eGQiLAorCSJ1YXJ0YjJfdXJ4ZCIsCisJInVhcnRiMl91dHhkIiwKKwkidWFydGIzX3VjdHMiLAorCSJ1YXJ0YjNfdXJ0cyIsCisJInVhcnRiM191cnhkIiwKKwkidWFydGIzX3V0eGQiLAorCSJ1YXJ0YjRfdWN0cyIsCisJInVhcnRiNF91cnRzIiwKKwkidWFydGI0X3VyeGQiLAorCSJ1YXJ0YjRfdXR4ZCIsCisJInZjX2NhbTFfc2NsIiwKKwkidmNfY2FtMV9zZGEiLAorCSJ2Y19jYW0yX3NjbCIsCisJInZjX2NhbTJfc2RhIiwKKwkidmNfY2FtM19zY2wiLAorCSJ2Y19jYW0zX3NkYSIsCit9OworCisvKiBFdmVyeSBwaW4gY2FuIGltcGxlbWVudCBhbGwgQUxUMS1BTFQ0IGZ1bmN0aW9ucyAqLworI2RlZmluZSBCQ00yODFYWF9QSU5fRlVOQ1RJT04oZmNuX25hbWUpCQkJXAorewkJCQkJCQlcCisJLm5hbWUgPSAjZmNuX25hbWUsCQkJCVwKKwkuZ3JvdXBzID0gYmNtMjgxeHhfYWx0X2dyb3VwcywJCQlcCisJLm5ncm91cHMgPSBBUlJBWV9TSVpFKGJjbTI4MXh4X2FsdF9ncm91cHMpLAlcCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYmNtMjgxeHhfcGluX2Z1bmN0aW9uIGJjbTI4MXh4X2Z1bmN0aW9uc1tdID0geworCUJDTTI4MVhYX1BJTl9GVU5DVElPTihhbHQxKSwKKwlCQ00yODFYWF9QSU5fRlVOQ1RJT04oYWx0MiksCisJQkNNMjgxWFhfUElOX0ZVTkNUSU9OKGFsdDMpLAorCUJDTTI4MVhYX1BJTl9GVU5DVElPTihhbHQ0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYmNtMjgxeHhfcGluY3RybF9kYXRhIGJjbTI4MXh4X3BpbmN0cmwgPSB7CisJLnBpbnMgPSBiY20yODF4eF9waW5jdHJsX3BpbnMsCisJLm5waW5zID0gQVJSQVlfU0laRShiY20yODF4eF9waW5jdHJsX3BpbnMpLAorCS5mdW5jdGlvbnMgPSBiY20yODF4eF9mdW5jdGlvbnMsCisJLm5mdW5jdGlvbnMgPSBBUlJBWV9TSVpFKGJjbTI4MXh4X2Z1bmN0aW9ucyksCit9OworCitzdGF0aWMgaW5saW5lIGVudW0gYmNtMjgxeHhfcGluX3R5cGUgcGluX3R5cGVfZ2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQkJCSAgdW5zaWduZWQgcGluKQoreworCXN0cnVjdCBiY20yODF4eF9waW5jdHJsX2RhdGEgKnBkYXRhID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisKKwlpZiAocGluID49IHBkYXRhLT5ucGlucykKKwkJcmV0dXJuIEJDTTI4MVhYX1BJTl9UWVBFX1VOS05PV047CisKKwlyZXR1cm4gKihlbnVtIGJjbTI4MXh4X3Bpbl90eXBlICopKHBkYXRhLT5waW5zW3Bpbl0uZHJ2X2RhdGEpOworfQorCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9TSElGVCh0eXBlLCBwYXJhbSkgXAorCShCQ00yODFYWF8gIyMgdHlwZSAjIyBfUElOX1JFR18gIyMgcGFyYW0gIyMgX1NISUZUKQorCisjZGVmaW5lIEJDTTI4MVhYX1BJTl9NQVNLKHR5cGUsIHBhcmFtKSBcCisJKEJDTTI4MVhYXyAjIyB0eXBlICMjIF9QSU5fUkVHXyAjIyBwYXJhbSAjIyBfTUFTSykKKworLyoKKyAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHVzZWQgdG8gYnVpbGQgdXAgdGhlIHZhbHVlIGFuZCBtYXNrIHVzZWQgdG8gd3JpdGUgdG8KKyAqIGEgcGluIHJlZ2lzdGVyLCBidXQgZG9lcyBub3QgYWN0dWFsbHkgd3JpdGUgdG8gdGhlIHJlZ2lzdGVyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtMjgxeHhfcGluX3VwZGF0ZSh1MzIgKnJlZ192YWwsIHUzMiAqcmVnX21hc2ssCisJCQkJICAgICAgIHUzMiBwYXJhbV92YWwsIHUzMiBwYXJhbV9zaGlmdCwKKwkJCQkgICAgICAgdTMyIHBhcmFtX21hc2spCit7CisJKnJlZ192YWwgJj0gfnBhcmFtX21hc2s7CisJKnJlZ192YWwgfD0gKHBhcmFtX3ZhbCA8PCBwYXJhbV9zaGlmdCkgJiBwYXJhbV9tYXNrOworCSpyZWdfbWFzayB8PSBwYXJhbV9tYXNrOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgYmNtMjgxeHhfcGluY3RybF9yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDMyLAorCS5yZWdfc3RyaWRlID0gNCwKKwkudmFsX2JpdHMgPSAzMiwKKwkubWF4X3JlZ2lzdGVyID0gQkNNMjgxWFhfUElOX1ZDX0NBTTNfU0RBLAorfTsKKworc3RhdGljIGludCBiY20yODF4eF9waW5jdHJsX2dldF9ncm91cHNfY291bnQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2KQoreworCXN0cnVjdCBiY20yODF4eF9waW5jdHJsX2RhdGEgKnBkYXRhID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisKKwlyZXR1cm4gcGRhdGEtPm5waW5zOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYmNtMjgxeHhfcGluY3RybF9nZXRfZ3JvdXBfbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJCQkgICB1bnNpZ25lZCBncm91cCkKK3sKKwlzdHJ1Y3QgYmNtMjgxeHhfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJcmV0dXJuIHBkYXRhLT5waW5zW2dyb3VwXS5uYW1lOworfQorCitzdGF0aWMgaW50IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2dyb3VwX3BpbnMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJCQkgICB1bnNpZ25lZCBncm91cCwKKwkJCQkJICAgY29uc3QgdW5zaWduZWQgKipwaW5zLAorCQkJCQkgICB1bnNpZ25lZCAqbnVtX3BpbnMpCit7CisJc3RydWN0IGJjbTI4MXh4X3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCSpwaW5zID0gJnBkYXRhLT5waW5zW2dyb3VwXS5udW1iZXI7CisJKm51bV9waW5zID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiY20yODF4eF9waW5jdHJsX3Bpbl9kYmdfc2hvdyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJCSAgc3RydWN0IHNlcV9maWxlICpzLAorCQkJCQkgIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzZXFfcHJpbnRmKHMsICIgJXMiLCBkZXZfbmFtZShwY3RsZGV2LT5kZXYpKTsKK30KKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX29wcyBiY20yODF4eF9waW5jdHJsX29wcyA9IHsKKwkuZ2V0X2dyb3Vwc19jb3VudCA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2dyb3Vwc19jb3VudCwKKwkuZ2V0X2dyb3VwX25hbWUgPSBiY20yODF4eF9waW5jdHJsX2dldF9ncm91cF9uYW1lLAorCS5nZXRfZ3JvdXBfcGlucyA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2dyb3VwX3BpbnMsCisJLnBpbl9kYmdfc2hvdyA9IGJjbTI4MXh4X3BpbmN0cmxfcGluX2RiZ19zaG93LAorCS5kdF9ub2RlX3RvX21hcCA9IHBpbmNvbmZfZ2VuZXJpY19kdF9ub2RlX3RvX21hcF9waW4sCisJLmR0X2ZyZWVfbWFwID0gcGluY3RybF91dGlsc19kdF9mcmVlX21hcCwKK307CisKK3N0YXRpYyBpbnQgYmNtMjgxeHhfcGluY3RybF9nZXRfZmNuc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpCit7CisJc3RydWN0IGJjbTI4MXh4X3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCXJldHVybiBwZGF0YS0+bmZ1bmN0aW9uczsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmJjbTI4MXh4X3BpbmN0cmxfZ2V0X2Zjbl9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQkJCSB1bnNpZ25lZCBmdW5jdGlvbikKK3sKKwlzdHJ1Y3QgYmNtMjgxeHhfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJcmV0dXJuIHBkYXRhLT5mdW5jdGlvbnNbZnVuY3Rpb25dLm5hbWU7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjgxeHhfcGluY3RybF9nZXRfZmNuX2dyb3VwcyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJCSAgIHVuc2lnbmVkIGZ1bmN0aW9uLAorCQkJCQkgICBjb25zdCBjaGFyICogY29uc3QgKipncm91cHMsCisJCQkJCSAgIHVuc2lnbmVkICogY29uc3QgbnVtX2dyb3VwcykKK3sKKwlzdHJ1Y3QgYmNtMjgxeHhfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJKmdyb3VwcyA9IHBkYXRhLT5mdW5jdGlvbnNbZnVuY3Rpb25dLmdyb3VwczsKKwkqbnVtX2dyb3VwcyA9IHBkYXRhLT5mdW5jdGlvbnNbZnVuY3Rpb25dLm5ncm91cHM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20yODF4eF9waW5tdXhfc2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCSAgICAgICB1bnNpZ25lZCBmdW5jdGlvbiwKKwkJCSAgICAgICB1bnNpZ25lZCBncm91cCkKK3sKKwlzdHJ1Y3QgYmNtMjgxeHhfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCWNvbnN0IHN0cnVjdCBiY20yODF4eF9waW5fZnVuY3Rpb24gKmYgPSAmcGRhdGEtPmZ1bmN0aW9uc1tmdW5jdGlvbl07CisJdTMyIG9mZnNldCA9IDQgKiBwZGF0YS0+cGluc1tncm91cF0ubnVtYmVyOworCWludCByYyA9IDA7CisKKwlkZXZfZGJnKHBjdGxkZXYtPmRldiwKKwkJIiVzKCk6IEVuYWJsZSBmdW5jdGlvbiAlcyAoJWQpIG9mIHBpbiAlcyAoJWQpIEBvZmZzZXQgMHgleC5cbiIsCisJCV9fZnVuY19fLCBmLT5uYW1lLCBmdW5jdGlvbiwgcGRhdGEtPnBpbnNbZ3JvdXBdLm5hbWUsCisJCXBkYXRhLT5waW5zW2dyb3VwXS5udW1iZXIsIG9mZnNldCk7CisKKwlyYyA9IHJlZ21hcF91cGRhdGVfYml0cyhwZGF0YS0+cmVnbWFwLCBvZmZzZXQsCisJCUJDTTI4MVhYX1BJTl9SRUdfRl9TRUxfTUFTSywKKwkJZnVuY3Rpb24gPDwgQkNNMjgxWFhfUElOX1JFR19GX1NFTF9TSElGVCk7CisJaWYgKHJjKQorCQlkZXZfZXJyKHBjdGxkZXYtPmRldiwKKwkJCSJFcnJvciB1cGRhdGluZyByZWdpc3RlciBmb3IgcGluICVzICglZCkuXG4iLAorCQkJcGRhdGEtPnBpbnNbZ3JvdXBdLm5hbWUsIHBkYXRhLT5waW5zW2dyb3VwXS5udW1iZXIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3RydWN0IHBpbm11eF9vcHMgYmNtMjgxeHhfcGluY3RybF9waW5tdXhfb3BzID0geworCS5nZXRfZnVuY3Rpb25zX2NvdW50ID0gYmNtMjgxeHhfcGluY3RybF9nZXRfZmNuc19jb3VudCwKKwkuZ2V0X2Z1bmN0aW9uX25hbWUgPSBiY20yODF4eF9waW5jdHJsX2dldF9mY25fbmFtZSwKKwkuZ2V0X2Z1bmN0aW9uX2dyb3VwcyA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2Zjbl9ncm91cHMsCisJLnNldF9tdXggPSBiY20yODF4eF9waW5tdXhfc2V0LAorfTsKKworc3RhdGljIGludCBiY20yODF4eF9waW5jdHJsX3Bpbl9jb25maWdfZ2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQkJICAgdW5zaWduZWQgcGluLAorCQkJCQkgICB1bnNpZ25lZCBsb25nICpjb25maWcpCit7CisJcmV0dXJuIC1FTk9UU1VQUDsKK30KKworCisvKiBHb2VzIHRocm91Z2ggdGhlIGNvbmZpZ3MgYW5kIHVwZGF0ZSByZWdpc3RlciB2YWwvbWFzayAqLworc3RhdGljIGludCBiY20yODF4eF9zdGRfcGluX3VwZGF0ZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICAgdW5zaWduZWQgcGluLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgKmNvbmZpZ3MsCisJCQkJICAgdW5zaWduZWQgbnVtX2NvbmZpZ3MsCisJCQkJICAgdTMyICp2YWwsCisJCQkJICAgdTMyICptYXNrKQoreworCXN0cnVjdCBiY20yODF4eF9waW5jdHJsX2RhdGEgKnBkYXRhID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisJaW50IGk7CisJZW51bSBwaW5fY29uZmlnX3BhcmFtIHBhcmFtOworCXUxNiBhcmc7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbmZpZ3M7IGkrKykgeworCQlwYXJhbSA9IHBpbmNvbmZfdG9fY29uZmlnX3BhcmFtKGNvbmZpZ3NbaV0pOworCQlhcmcgPSBwaW5jb25mX3RvX2NvbmZpZ19hcmd1bWVudChjb25maWdzW2ldKTsKKworCQlzd2l0Y2ggKHBhcmFtKSB7CisJCWNhc2UgUElOX0NPTkZJR19JTlBVVF9TQ0hNSVRUX0VOQUJMRToKKwkJCWFyZyA9IChhcmcgPj0gMSA/IDEgOiAwKTsKKwkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCBhcmcsCisJCQkJQkNNMjgxWFhfUElOX1NISUZUKFNURCwgSFlTVCksCisJCQkJQkNNMjgxWFhfUElOX01BU0soU1RELCBIWVNUKSk7CisJCQlicmVhazsKKwkJLyoKKwkJICogVGhlIHBpbiBiaWFzIGNhbiBvbmx5IGJlIG9uZSBvZiBwdWxsLXVwLCBwdWxsLWRvd24sIG9yCisJCSAqIGRpc2FibGUuICBUaGUgdXNlciBkb2VzIG5vdCBuZWVkIHRvIHNwZWNpZnkgYSB2YWx1ZSBmb3IgdGhlCisJCSAqIHByb3BlcnR5LCBhbmQgdGhlIGRlZmF1bHQgdmFsdWUgZnJvbSBwaW5jb25mLWdlbmVyaWMgaXMKKwkJICogaWdub3JlZC4KKwkJICovCisJCWNhc2UgUElOX0NPTkZJR19CSUFTX0RJU0FCTEU6CisJCQliY20yODF4eF9waW5fdXBkYXRlKHZhbCwgbWFzaywgMCwKKwkJCQlCQ00yODFYWF9QSU5fU0hJRlQoU1RELCBQVUxMX1VQKSwKKwkJCQlCQ00yODFYWF9QSU5fTUFTSyhTVEQsIFBVTExfVVApKTsKKwkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCAwLAorCQkJCUJDTTI4MVhYX1BJTl9TSElGVChTVEQsIFBVTExfRE4pLAorCQkJCUJDTTI4MVhYX1BJTl9NQVNLKFNURCwgUFVMTF9ETikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9VUDoKKwkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCAxLAorCQkJCUJDTTI4MVhYX1BJTl9TSElGVChTVEQsIFBVTExfVVApLAorCQkJCUJDTTI4MVhYX1BJTl9NQVNLKFNURCwgUFVMTF9VUCkpOworCQkJYmNtMjgxeHhfcGluX3VwZGF0ZSh2YWwsIG1hc2ssIDAsCisJCQkJQkNNMjgxWFhfUElOX1NISUZUKFNURCwgUFVMTF9ETiksCisJCQkJQkNNMjgxWFhfUElOX01BU0soU1RELCBQVUxMX0ROKSk7CisJCQlicmVhazsKKworCQljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX0RPV046CisJCQliY20yODF4eF9waW5fdXBkYXRlKHZhbCwgbWFzaywgMCwKKwkJCQlCQ00yODFYWF9QSU5fU0hJRlQoU1RELCBQVUxMX1VQKSwKKwkJCQlCQ00yODFYWF9QSU5fTUFTSyhTVEQsIFBVTExfVVApKTsKKwkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCAxLAorCQkJCUJDTTI4MVhYX1BJTl9TSElGVChTVEQsIFBVTExfRE4pLAorCQkJCUJDTTI4MVhYX1BJTl9NQVNLKFNURCwgUFVMTF9ETikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQSU5fQ09ORklHX1NMRVdfUkFURToKKwkJCWFyZyA9IChhcmcgPj0gMSA/IDEgOiAwKTsKKwkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCBhcmcsCisJCQkJQkNNMjgxWFhfUElOX1NISUZUKFNURCwgU0xFVyksCisJCQkJQkNNMjgxWFhfUElOX01BU0soU1RELCBTTEVXKSk7CisJCQlicmVhazsKKworCQljYXNlIFBJTl9DT05GSUdfSU5QVVRfRU5BQkxFOgorCQkJLyogaW52ZXJzZWQgc2luY2UgcmVnaXN0ZXIgaXMgZm9yIGlucHV0IF9kaXNhYmxlXyAqLworCQkJYXJnID0gKGFyZyA+PSAxID8gMCA6IDEpOworCQkJYmNtMjgxeHhfcGluX3VwZGF0ZSh2YWwsIG1hc2ssIGFyZywKKwkJCQlCQ00yODFYWF9QSU5fU0hJRlQoU1RELCBJTlBVVF9ESVMpLAorCQkJCUJDTTI4MVhYX1BJTl9NQVNLKFNURCwgSU5QVVRfRElTKSk7CisJCQlicmVhazsKKworCQljYXNlIFBJTl9DT05GSUdfRFJJVkVfU1RSRU5HVEg6CisJCQkvKiBWYWxpZCByYW5nZSBpcyAyLTE2IG1BLCBldmVuIG51bWJlcnMgb25seSAqLworCQkJaWYgKChhcmcgPCAyKSB8fCAoYXJnID4gMTYpIHx8IChhcmcgJSAyKSkgeworCQkJCWRldl9lcnIocGN0bGRldi0+ZGV2LAorCQkJCQkiSW52YWxpZCBEcml2ZSBTdHJlbmd0aCB2YWx1ZSAoJWQpIGZvciAiCisJCQkJCSJwaW4gJXMgKCVkKS4gVmFsaWQgdmFsdWVzIGFyZSAiCisJCQkJCSIoMi4uMTYpIG1BLCBldmVuIG51bWJlcnMgb25seS5cbiIsCisJCQkJCWFyZywgcGRhdGEtPnBpbnNbcGluXS5uYW1lLCBwaW4pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJYmNtMjgxeHhfcGluX3VwZGF0ZSh2YWwsIG1hc2ssIChhcmcvMiktMSwKKwkJCQlCQ00yODFYWF9QSU5fU0hJRlQoU1RELCBEUlZfU1RSKSwKKwkJCQlCQ00yODFYWF9QSU5fTUFTSyhTVEQsIERSVl9TVFIpKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkZXZfZXJyKHBjdGxkZXYtPmRldiwKKwkJCQkiVW5yZWNvZ25pemVkIHBpbiBjb25maWcgJWQgZm9yIHBpbiAlcyAoJWQpLlxuIiwKKwkJCQlwYXJhbSwgcGRhdGEtPnBpbnNbcGluXS5uYW1lLCBwaW4pOworCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJfSAvKiBzd2l0Y2ggY29uZmlnICovCisJfSAvKiBmb3IgZWFjaCBjb25maWcgKi8KKworCXJldHVybiAwOworfQorCisvKgorICogVGhlIHB1bGwtdXAgc3RyZW5ndGggZm9yIGFuIEkyQyBwaW4gaXMgcmVwcmVzZW50ZWQgYnkgYml0cyA0LTYgaW4gdGhlCisgKiByZWdpc3RlciB3aXRoIHRoZSBmb2xsb3dpbmcgbWFwcGluZzoKKyAqICAgMGIwMDA6IE5vIHB1bGwtdXAKKyAqICAgMGIwMDE6IDEyMDAgT2htCisgKiAgIDBiMDEwOiAxODAwIE9obQorICogICAwYjAxMTogNzIwIE9obQorICogICAwYjEwMDogMjcwMCBPaG0KKyAqICAgMGIxMDE6IDgzMSBPaG0KKyAqICAgMGIxMTA6IDEwODAgT2htCisgKiAgIDBiMTExOiA1NjggT2htCisgKiBUaGlzIGFycmF5IG1hcHMgcHVsbC11cCBzdHJlbmd0aCBpbiBPaG1zIHRvIHJlZ2lzdGVyIHZhbHVlcyAoMStpbmRleCkuCisgKi8KK3N0YXRpYyBjb25zdCB1MTYgYmNtMjgxeHhfcHVsbHVwX21hcFtdID0geworCTEyMDAsIDE4MDAsIDcyMCwgMjcwMCwgODMxLCAxMDgwLCA1NjgKK307CisKKy8qIEdvZXMgdGhyb3VnaCB0aGUgY29uZmlncyBhbmQgdXBkYXRlIHJlZ2lzdGVyIHZhbC9tYXNrICovCitzdGF0aWMgaW50IGJjbTI4MXh4X2kyY19waW5fdXBkYXRlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQkgICB1bnNpZ25lZCBwaW4sCisJCQkJICAgdW5zaWduZWQgbG9uZyAqY29uZmlncywKKwkJCQkgICB1bnNpZ25lZCBudW1fY29uZmlncywKKwkJCQkgICB1MzIgKnZhbCwKKwkJCQkgICB1MzIgKm1hc2spCit7CisJc3RydWN0IGJjbTI4MXh4X3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKwlpbnQgaSwgajsKKwllbnVtIHBpbl9jb25maWdfcGFyYW0gcGFyYW07CisJdTE2IGFyZzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY29uZmlnczsgaSsrKSB7CisJCXBhcmFtID0gcGluY29uZl90b19jb25maWdfcGFyYW0oY29uZmlnc1tpXSk7CisJCWFyZyA9IHBpbmNvbmZfdG9fY29uZmlnX2FyZ3VtZW50KGNvbmZpZ3NbaV0pOworCisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9VUDoKKwkJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKGJjbTI4MXh4X3B1bGx1cF9tYXApOyBqKyspCisJCQkJaWYgKGJjbTI4MXh4X3B1bGx1cF9tYXBbal0gPT0gYXJnKQorCQkJCQlicmVhazsKKworCQkJaWYgKGogPT0gQVJSQVlfU0laRShiY20yODF4eF9wdWxsdXBfbWFwKSkgeworCQkJCWRldl9lcnIocGN0bGRldi0+ZGV2LAorCQkJCQkiSW52YWxpZCBwdWxsLXVwIHZhbHVlICglZCkgZm9yIHBpbiAlcyAiCisJCQkJCSIoJWQpLiBWYWxpZCB2YWx1ZXMgYXJlIDU2OCwgNzIwLCA4MzEsICIKKwkJCQkJIjEwODAsIDEyMDAsIDE4MDAsIDI3MDAgT2htcy5cbiIsCisJCQkJCWFyZywgcGRhdGEtPnBpbnNbcGluXS5uYW1lLCBwaW4pOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQliY20yODF4eF9waW5fdXBkYXRlKHZhbCwgbWFzaywgaisxLAorCQkJCUJDTTI4MVhYX1BJTl9TSElGVChJMkMsIFBVTExfVVBfU1RSKSwKKwkJCQlCQ00yODFYWF9QSU5fTUFTSyhJMkMsIFBVTExfVVBfU1RSKSk7CisJCQlicmVhazsKKworCQljYXNlIFBJTl9DT05GSUdfQklBU19ESVNBQkxFOgorCQkJYmNtMjgxeHhfcGluX3VwZGF0ZSh2YWwsIG1hc2ssIDAsCisJCQkJQkNNMjgxWFhfUElOX1NISUZUKEkyQywgUFVMTF9VUF9TVFIpLAorCQkJCUJDTTI4MVhYX1BJTl9NQVNLKEkyQywgUFVMTF9VUF9TVFIpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUElOX0NPTkZJR19TTEVXX1JBVEU6CisJCQlhcmcgPSAoYXJnID49IDEgPyAxIDogMCk7CisJCQliY20yODF4eF9waW5fdXBkYXRlKHZhbCwgbWFzaywgYXJnLAorCQkJCUJDTTI4MVhYX1BJTl9TSElGVChJMkMsIFNMRVcpLAorCQkJCUJDTTI4MVhYX1BJTl9NQVNLKEkyQywgU0xFVykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBQSU5fQ09ORklHX0lOUFVUX0VOQUJMRToKKwkJCS8qIGludmVyc2VkIHNpbmNlIHJlZ2lzdGVyIGlzIGZvciBpbnB1dCBfZGlzYWJsZV8gKi8KKwkJCWFyZyA9IChhcmcgPj0gMSA/IDAgOiAxKTsKKwkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCBhcmcsCisJCQkJQkNNMjgxWFhfUElOX1NISUZUKEkyQywgSU5QVVRfRElTKSwKKwkJCQlCQ00yODFYWF9QSU5fTUFTSyhJMkMsIElOUFVUX0RJUykpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIocGN0bGRldi0+ZGV2LAorCQkJCSJVbnJlY29nbml6ZWQgcGluIGNvbmZpZyAlZCBmb3IgcGluICVzICglZCkuXG4iLAorCQkJCXBhcmFtLCBwZGF0YS0+cGluc1twaW5dLm5hbWUsIHBpbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9IC8qIHN3aXRjaCBjb25maWcgKi8KKwl9IC8qIGZvciBlYWNoIGNvbmZpZyAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIEdvZXMgdGhyb3VnaCB0aGUgY29uZmlncyBhbmQgdXBkYXRlIHJlZ2lzdGVyIHZhbC9tYXNrICovCitzdGF0aWMgaW50IGJjbTI4MXh4X2hkbWlfcGluX3VwZGF0ZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICAgIHVuc2lnbmVkIHBpbiwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyAqY29uZmlncywKKwkJCQkgICAgdW5zaWduZWQgbnVtX2NvbmZpZ3MsCisJCQkJICAgIHUzMiAqdmFsLAorCQkJCSAgICB1MzIgKm1hc2spCit7CisJc3RydWN0IGJjbTI4MXh4X3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKwlpbnQgaTsKKwllbnVtIHBpbl9jb25maWdfcGFyYW0gcGFyYW07CisJdTE2IGFyZzsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fY29uZmlnczsgaSsrKSB7CisJCXBhcmFtID0gcGluY29uZl90b19jb25maWdfcGFyYW0oY29uZmlnc1tpXSk7CisJCWFyZyA9IHBpbmNvbmZfdG9fY29uZmlnX2FyZ3VtZW50KGNvbmZpZ3NbaV0pOworCisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBQSU5fQ09ORklHX1NMRVdfUkFURToKKwkJCWFyZyA9IChhcmcgPj0gMSA/IDEgOiAwKTsKKwkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCBhcmcsCisJCQkJQkNNMjgxWFhfUElOX1NISUZUKEhETUksIE1PREUpLAorCQkJCUJDTTI4MVhYX1BJTl9NQVNLKEhETUksIE1PREUpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgUElOX0NPTkZJR19JTlBVVF9FTkFCTEU6CisJCQkvKiBpbnZlcnNlZCBzaW5jZSByZWdpc3RlciBpcyBmb3IgaW5wdXQgX2Rpc2FibGVfICovCisJCQlhcmcgPSAoYXJnID49IDEgPyAwIDogMSk7CisJCQliY20yODF4eF9waW5fdXBkYXRlKHZhbCwgbWFzaywgYXJnLAorCQkJCUJDTTI4MVhYX1BJTl9TSElGVChIRE1JLCBJTlBVVF9ESVMpLAorCQkJCUJDTTI4MVhYX1BJTl9NQVNLKEhETUksIElOUFVUX0RJUykpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIocGN0bGRldi0+ZGV2LAorCQkJCSJVbnJlY29nbml6ZWQgcGluIGNvbmZpZyAlZCBmb3IgcGluICVzICglZCkuXG4iLAorCQkJCXBhcmFtLCBwZGF0YS0+cGluc1twaW5dLm5hbWUsIHBpbik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQl9IC8qIHN3aXRjaCBjb25maWcgKi8KKwl9IC8qIGZvciBlYWNoIGNvbmZpZyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjgxeHhfcGluY3RybF9waW5fY29uZmlnX3NldChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJCSAgIHVuc2lnbmVkIHBpbiwKKwkJCQkJICAgdW5zaWduZWQgbG9uZyAqY29uZmlncywKKwkJCQkJICAgdW5zaWduZWQgbnVtX2NvbmZpZ3MpCit7CisJc3RydWN0IGJjbTI4MXh4X3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKwllbnVtIGJjbTI4MXh4X3Bpbl90eXBlIHBpbl90eXBlOworCXUzMiBvZmZzZXQgPSA0ICogcGluOworCXUzMiBjZmdfdmFsLCBjZmdfbWFzazsKKwlpbnQgcmM7CisKKwljZmdfdmFsID0gMDsKKwljZmdfbWFzayA9IDA7CisJcGluX3R5cGUgPSBwaW5fdHlwZV9nZXQocGN0bGRldiwgcGluKTsKKworCS8qIERpZmZlcmVudCBwaW5zIGhhdmUgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLworCXN3aXRjaCAocGluX3R5cGUpIHsKKwljYXNlIEJDTTI4MVhYX1BJTl9UWVBFX1NURDoKKwkJcmMgPSBiY20yODF4eF9zdGRfcGluX3VwZGF0ZShwY3RsZGV2LCBwaW4sIGNvbmZpZ3MsCisJCQludW1fY29uZmlncywgJmNmZ192YWwsICZjZmdfbWFzayk7CisJCWJyZWFrOworCisJY2FzZSBCQ00yODFYWF9QSU5fVFlQRV9JMkM6CisJCXJjID0gYmNtMjgxeHhfaTJjX3Bpbl91cGRhdGUocGN0bGRldiwgcGluLCBjb25maWdzLAorCQkJbnVtX2NvbmZpZ3MsICZjZmdfdmFsLCAmY2ZnX21hc2spOworCQlicmVhazsKKworCWNhc2UgQkNNMjgxWFhfUElOX1RZUEVfSERNSToKKwkJcmMgPSBiY20yODF4eF9oZG1pX3Bpbl91cGRhdGUocGN0bGRldiwgcGluLCBjb25maWdzLAorCQkJbnVtX2NvbmZpZ3MsICZjZmdfdmFsLCAmY2ZnX21hc2spOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIocGN0bGRldi0+ZGV2LCAiVW5rbm93biBwaW4gdHlwZSBmb3IgcGluICVzICglZCkuXG4iLAorCQkJcGRhdGEtPnBpbnNbcGluXS5uYW1lLCBwaW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKworCX0gLyogc3dpdGNoIHBpbiB0eXBlICovCisKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWRldl9kYmcocGN0bGRldi0+ZGV2LAorCQkiJXMoKTogU2V0IHBpbiAlcyAoJWQpIHdpdGggY29uZmlnIDB4JXgsIG1hc2sgMHgleFxuIiwKKwkJX19mdW5jX18sIHBkYXRhLT5waW5zW3Bpbl0ubmFtZSwgcGluLCBjZmdfdmFsLCBjZmdfbWFzayk7CisKKwlyYyA9IHJlZ21hcF91cGRhdGVfYml0cyhwZGF0YS0+cmVnbWFwLCBvZmZzZXQsIGNmZ19tYXNrLCBjZmdfdmFsKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycihwY3RsZGV2LT5kZXYsCisJCQkiRXJyb3IgdXBkYXRpbmcgcmVnaXN0ZXIgZm9yIHBpbiAlcyAoJWQpLlxuIiwKKwkJCXBkYXRhLT5waW5zW3Bpbl0ubmFtZSwgcGluKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBpbmNvbmZfb3BzIGJjbTI4MXh4X3BpbmN0cmxfcGluY29uZl9vcHMgPSB7CisJLnBpbl9jb25maWdfZ2V0ID0gYmNtMjgxeHhfcGluY3RybF9waW5fY29uZmlnX2dldCwKKwkucGluX2NvbmZpZ19zZXQgPSBiY20yODF4eF9waW5jdHJsX3Bpbl9jb25maWdfc2V0LAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX2Rlc2MgYmNtMjgxeHhfcGluY3RybF9kZXNjID0geworCS8qIG5hbWUsIHBpbnMsIG5waW5zIG1lbWJlcnMgaW5pdGlhbGl6ZWQgaW4gcHJvYmUgZnVuY3Rpb24gKi8KKwkucGN0bG9wcyA9ICZiY20yODF4eF9waW5jdHJsX29wcywKKwkucG14b3BzID0gJmJjbTI4MXh4X3BpbmN0cmxfcGlubXV4X29wcywKKwkuY29uZm9wcyA9ICZiY20yODF4eF9waW5jdHJsX3BpbmNvbmZfb3BzLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYmNtMjgxeHhfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiY20yODF4eF9waW5jdHJsX2RhdGEgKnBkYXRhID0gJmJjbTI4MXh4X3BpbmN0cmw7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsOworCisJLyogU28gZmFyIFdlIGNhbiBhc3N1bWUgdGhlcmUgaXMgb25seSAxIGJhbmsgb2YgcmVnaXN0ZXJzICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlwZGF0YS0+cmVnX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBkYXRhLT5yZWdfYmFzZSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGlvcmVtYXAgTUVNIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgZHluYW1pYyBwYXJ0IG9mIHBpbmN0cmxfZGVzYyAqLworCXBkYXRhLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X21taW8oJnBkZXYtPmRldiwgcGRhdGEtPnJlZ19iYXNlLAorCQkmYmNtMjgxeHhfcGluY3RybF9yZWdtYXBfY29uZmlnKTsKKwlpZiAoSVNfRVJSKHBkYXRhLT5yZWdtYXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlJlZ21hcCBNTUlPIGluaXQgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWJjbTI4MXh4X3BpbmN0cmxfZGVzYy5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7CisJYmNtMjgxeHhfcGluY3RybF9kZXNjLnBpbnMgPSBiY20yODF4eF9waW5jdHJsLnBpbnM7CisJYmNtMjgxeHhfcGluY3RybF9kZXNjLm5waW5zID0gYmNtMjgxeHhfcGluY3RybC5ucGluczsKKworCXBjdGwgPSBwaW5jdHJsX3JlZ2lzdGVyKCZiY20yODF4eF9waW5jdHJsX2Rlc2MsCisJCQkJJnBkZXYtPmRldiwKKwkJCQlwZGF0YSk7CisJaWYgKCFwY3RsKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBwaW5jdHJsXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRhdGEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJjbTI4MXh4X3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImJyY20sYmNtMTEzNTEtcGluY3RybCIsIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYmNtMjgxeHhfcGluY3RybF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYmNtMjgxeHgtcGluY3RybCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGJjbTI4MXh4X3BpbmN0cmxfb2ZfbWF0Y2gsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXJfcHJvYmUoYmNtMjgxeHhfcGluY3RybF9kcml2ZXIsIGJjbTI4MXh4X3BpbmN0cmxfcHJvYmUpOworCitNT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSBDb3Jwb3JhdGlvbiA8YmNtLWtlcm5lbC1mZWVkYmFjay1saXN0QGJyb2FkY29tLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIlNoZXJtYW4gWWluIDxzeWluQGJyb2FkY29tLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gQkNNMjgxeHggcGluY3RybCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1iY20yODM1LmMgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtYmNtMjgzNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOTA4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtYmNtMjgzNS5jCkBAIC0wLDAgKzEsMTA4MCBAQAorLyoKKyAqIERyaXZlciBmb3IgQnJvYWRjb20gQkNNMjgzNSBHUElPIHVuaXQgKHBpbmN0cmwgKyBHUElPKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBDaHJpcyBCb290LCBTaW1vbiBBcmxvdHQsIFN0ZXBoZW4gV2FycmVuCisgKgorICogVGhpcyBkcml2ZXIgaXMgaW5zcGlyZWQgYnk6CisgKiBwaW5jdHJsLW5vbWFkaWsuYywgcGxlYXNlIHNlZSBvcmlnaW5hbCBmaWxlIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24KKyAqIHBpbmN0cmwtdGVncmEuYywgcGxlYXNlIHNlZSBvcmlnaW5hbCBmaWxlIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZGVzYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBNT0RVTEVfTkFNRSAicGluY3RybC1iY20yODM1IgorI2RlZmluZSBCQ00yODM1X05VTV9HUElPUyA1NAorI2RlZmluZSBCQ00yODM1X05VTV9CQU5LUyAyCisKKyNkZWZpbmUgQkNNMjgzNV9QSU5fQklUTUFQX1NaIFwKKwlESVZfUk9VTkRfVVAoQkNNMjgzNV9OVU1fR1BJT1MsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpCisKKy8qIEdQSU8gcmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBHUEZTRUwwCQkweDAJLyogRnVuY3Rpb24gU2VsZWN0ICovCisjZGVmaW5lIEdQU0VUMAkJMHgxYwkvKiBQaW4gT3V0cHV0IFNldCAqLworI2RlZmluZSBHUENMUjAJCTB4MjgJLyogUGluIE91dHB1dCBDbGVhciAqLworI2RlZmluZSBHUExFVjAJCTB4MzQJLyogUGluIExldmVsICovCisjZGVmaW5lIEdQRURTMAkJMHg0MAkvKiBQaW4gRXZlbnQgRGV0ZWN0IFN0YXR1cyAqLworI2RlZmluZSBHUFJFTjAJCTB4NGMJLyogUGluIFJpc2luZyBFZGdlIERldGVjdCBFbmFibGUgKi8KKyNkZWZpbmUgR1BGRU4wCQkweDU4CS8qIFBpbiBGYWxsaW5nIEVkZ2UgRGV0ZWN0IEVuYWJsZSAqLworI2RlZmluZSBHUEhFTjAJCTB4NjQJLyogUGluIEhpZ2ggRGV0ZWN0IEVuYWJsZSAqLworI2RlZmluZSBHUExFTjAJCTB4NzAJLyogUGluIExvdyBEZXRlY3QgRW5hYmxlICovCisjZGVmaW5lIEdQQVJFTjAJCTB4N2MJLyogUGluIEFzeW5jIFJpc2luZyBFZGdlIERldGVjdCAqLworI2RlZmluZSBHUEFGRU4wCQkweDg4CS8qIFBpbiBBc3luYyBGYWxsaW5nIEVkZ2UgRGV0ZWN0ICovCisjZGVmaW5lIEdQUFVECQkweDk0CS8qIFBpbiBQdWxsLXVwL2Rvd24gRW5hYmxlICovCisjZGVmaW5lIEdQUFVEQ0xLMAkweDk4CS8qIFBpbiBQdWxsLXVwL2Rvd24gRW5hYmxlIENsb2NrICovCisKKyNkZWZpbmUgRlNFTF9SRUcocCkJCShHUEZTRUwwICsgKCgocCkgLyAxMCkgKiA0KSkKKyNkZWZpbmUgRlNFTF9TSElGVChwKQkJKCgocCkgJSAxMCkgKiAzKQorI2RlZmluZSBHUElPX1JFR19PRkZTRVQocCkJKChwKSAvIDMyKQorI2RlZmluZSBHUElPX1JFR19TSElGVChwKQkoKHApICUgMzIpCisKK2VudW0gYmNtMjgzNV9waW5jb25mX3BhcmFtIHsKKwkvKiBhcmd1bWVudDogYmNtMjgzNV9waW5jb25mX3B1bGwgKi8KKwlCQ00yODM1X1BJTkNPTkZfUEFSQU1fUFVMTCwKK307CisKK2VudW0gYmNtMjgzNV9waW5jb25mX3B1bGwgeworCUJDTTI4MzVfUElOQ09ORklHX1BVTExfTk9ORSwKKwlCQ00yODM1X1BJTkNPTkZJR19QVUxMX0RPV04sCisJQkNNMjgzNV9QSU5DT05GSUdfUFVMTF9VUCwKK307CisKKyNkZWZpbmUgQkNNMjgzNV9QSU5DT05GX1BBQ0soX3BhcmFtXywgX2FyZ18pICgoX3BhcmFtXykgPDwgMTYgfCAoX2FyZ18pKQorI2RlZmluZSBCQ00yODM1X1BJTkNPTkZfVU5QQUNLX1BBUkFNKF9jb25mXykgKChfY29uZl8pID4+IDE2KQorI2RlZmluZSBCQ00yODM1X1BJTkNPTkZfVU5QQUNLX0FSRyhfY29uZl8pICgoX2NvbmZfKSAmIDB4ZmZmZikKKworc3RydWN0IGJjbTI4MzVfZ3Bpb19pcnFkYXRhIHsKKwlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYzsKKwlpbnQgYmFuazsKK307CisKK3N0cnVjdCBiY20yODM1X3BpbmN0cmwgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJaW50IGlycVtCQ00yODM1X05VTV9CQU5LU107CisKKwkvKiBub3RlOiBsb2NraW5nIGFzc3VtZXMgZWFjaCBiYW5rIHdpbGwgaGF2ZSBpdHMgb3duIHVuc2lnbmVkIGxvbmcgKi8KKwl1bnNpZ25lZCBsb25nIGVuYWJsZWRfaXJxX21hcFtCQ00yODM1X05VTV9CQU5LU107CisJdW5zaWduZWQgaW50IGlycV90eXBlW0JDTTI4MzVfTlVNX0dQSU9TXTsKKworCXN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bF9kZXY7CisJc3RydWN0IGlycV9kb21haW4gKmlycV9kb21haW47CisJc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7CisJc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSBncGlvX3JhbmdlOworCisJc3RydWN0IGJjbTI4MzVfZ3Bpb19pcnFkYXRhIGlycV9kYXRhW0JDTTI4MzVfTlVNX0JBTktTXTsKKwlzcGlubG9ja190IGlycV9sb2NrW0JDTTI4MzVfTlVNX0JBTktTXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgZ3Bpb19sb2NrX2NsYXNzOworCisvKiBwaW5zIGFyZSBqdXN0IG5hbWVkIEdQSU8wLi5HUElPNTMgKi8KKyNkZWZpbmUgQkNNMjgzNV9HUElPX1BJTihhKSBQSU5DVFJMX1BJTihhLCAiZ3BpbyIgI2EpCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgYmNtMjgzNV9ncGlvX3BpbnNbXSA9IHsKKwlCQ00yODM1X0dQSU9fUElOKDApLAorCUJDTTI4MzVfR1BJT19QSU4oMSksCisJQkNNMjgzNV9HUElPX1BJTigyKSwKKwlCQ00yODM1X0dQSU9fUElOKDMpLAorCUJDTTI4MzVfR1BJT19QSU4oNCksCisJQkNNMjgzNV9HUElPX1BJTig1KSwKKwlCQ00yODM1X0dQSU9fUElOKDYpLAorCUJDTTI4MzVfR1BJT19QSU4oNyksCisJQkNNMjgzNV9HUElPX1BJTig4KSwKKwlCQ00yODM1X0dQSU9fUElOKDkpLAorCUJDTTI4MzVfR1BJT19QSU4oMTApLAorCUJDTTI4MzVfR1BJT19QSU4oMTEpLAorCUJDTTI4MzVfR1BJT19QSU4oMTIpLAorCUJDTTI4MzVfR1BJT19QSU4oMTMpLAorCUJDTTI4MzVfR1BJT19QSU4oMTQpLAorCUJDTTI4MzVfR1BJT19QSU4oMTUpLAorCUJDTTI4MzVfR1BJT19QSU4oMTYpLAorCUJDTTI4MzVfR1BJT19QSU4oMTcpLAorCUJDTTI4MzVfR1BJT19QSU4oMTgpLAorCUJDTTI4MzVfR1BJT19QSU4oMTkpLAorCUJDTTI4MzVfR1BJT19QSU4oMjApLAorCUJDTTI4MzVfR1BJT19QSU4oMjEpLAorCUJDTTI4MzVfR1BJT19QSU4oMjIpLAorCUJDTTI4MzVfR1BJT19QSU4oMjMpLAorCUJDTTI4MzVfR1BJT19QSU4oMjQpLAorCUJDTTI4MzVfR1BJT19QSU4oMjUpLAorCUJDTTI4MzVfR1BJT19QSU4oMjYpLAorCUJDTTI4MzVfR1BJT19QSU4oMjcpLAorCUJDTTI4MzVfR1BJT19QSU4oMjgpLAorCUJDTTI4MzVfR1BJT19QSU4oMjkpLAorCUJDTTI4MzVfR1BJT19QSU4oMzApLAorCUJDTTI4MzVfR1BJT19QSU4oMzEpLAorCUJDTTI4MzVfR1BJT19QSU4oMzIpLAorCUJDTTI4MzVfR1BJT19QSU4oMzMpLAorCUJDTTI4MzVfR1BJT19QSU4oMzQpLAorCUJDTTI4MzVfR1BJT19QSU4oMzUpLAorCUJDTTI4MzVfR1BJT19QSU4oMzYpLAorCUJDTTI4MzVfR1BJT19QSU4oMzcpLAorCUJDTTI4MzVfR1BJT19QSU4oMzgpLAorCUJDTTI4MzVfR1BJT19QSU4oMzkpLAorCUJDTTI4MzVfR1BJT19QSU4oNDApLAorCUJDTTI4MzVfR1BJT19QSU4oNDEpLAorCUJDTTI4MzVfR1BJT19QSU4oNDIpLAorCUJDTTI4MzVfR1BJT19QSU4oNDMpLAorCUJDTTI4MzVfR1BJT19QSU4oNDQpLAorCUJDTTI4MzVfR1BJT19QSU4oNDUpLAorCUJDTTI4MzVfR1BJT19QSU4oNDYpLAorCUJDTTI4MzVfR1BJT19QSU4oNDcpLAorCUJDTTI4MzVfR1BJT19QSU4oNDgpLAorCUJDTTI4MzVfR1BJT19QSU4oNDkpLAorCUJDTTI4MzVfR1BJT19QSU4oNTApLAorCUJDTTI4MzVfR1BJT19QSU4oNTEpLAorCUJDTTI4MzVfR1BJT19QSU4oNTIpLAorCUJDTTI4MzVfR1BJT19QSU4oNTMpLAorfTsKKworLyogb25lIHBpbiBwZXIgZ3JvdXAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmNtMjgzNV9ncGlvX2dyb3Vwc1tdID0geworCSJncGlvMCIsCisJImdwaW8xIiwKKwkiZ3BpbzIiLAorCSJncGlvMyIsCisJImdwaW80IiwKKwkiZ3BpbzUiLAorCSJncGlvNiIsCisJImdwaW83IiwKKwkiZ3BpbzgiLAorCSJncGlvOSIsCisJImdwaW8xMCIsCisJImdwaW8xMSIsCisJImdwaW8xMiIsCisJImdwaW8xMyIsCisJImdwaW8xNCIsCisJImdwaW8xNSIsCisJImdwaW8xNiIsCisJImdwaW8xNyIsCisJImdwaW8xOCIsCisJImdwaW8xOSIsCisJImdwaW8yMCIsCisJImdwaW8yMSIsCisJImdwaW8yMiIsCisJImdwaW8yMyIsCisJImdwaW8yNCIsCisJImdwaW8yNSIsCisJImdwaW8yNiIsCisJImdwaW8yNyIsCisJImdwaW8yOCIsCisJImdwaW8yOSIsCisJImdwaW8zMCIsCisJImdwaW8zMSIsCisJImdwaW8zMiIsCisJImdwaW8zMyIsCisJImdwaW8zNCIsCisJImdwaW8zNSIsCisJImdwaW8zNiIsCisJImdwaW8zNyIsCisJImdwaW8zOCIsCisJImdwaW8zOSIsCisJImdwaW80MCIsCisJImdwaW80MSIsCisJImdwaW80MiIsCisJImdwaW80MyIsCisJImdwaW80NCIsCisJImdwaW80NSIsCisJImdwaW80NiIsCisJImdwaW80NyIsCisJImdwaW80OCIsCisJImdwaW80OSIsCisJImdwaW81MCIsCisJImdwaW81MSIsCisJImdwaW81MiIsCisJImdwaW81MyIsCit9OworCitlbnVtIGJjbTI4MzVfZnNlbCB7CisJQkNNMjgzNV9GU0VMX0dQSU9fSU4gPSAwLAorCUJDTTI4MzVfRlNFTF9HUElPX09VVCA9IDEsCisJQkNNMjgzNV9GU0VMX0FMVDAgPSA0LAorCUJDTTI4MzVfRlNFTF9BTFQxID0gNSwKKwlCQ00yODM1X0ZTRUxfQUxUMiA9IDYsCisJQkNNMjgzNV9GU0VMX0FMVDMgPSA3LAorCUJDTTI4MzVfRlNFTF9BTFQ0ID0gMywKKwlCQ00yODM1X0ZTRUxfQUxUNSA9IDIsCisJQkNNMjgzNV9GU0VMX0NPVU5UID0gOCwKKwlCQ00yODM1X0ZTRUxfTUFTSyA9IDB4NywKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmNtMjgzNV9mdW5jdGlvbnNbQkNNMjgzNV9GU0VMX0NPVU5UXSA9IHsKKwlbQkNNMjgzNV9GU0VMX0dQSU9fSU5dID0gImdwaW9faW4iLAorCVtCQ00yODM1X0ZTRUxfR1BJT19PVVRdID0gImdwaW9fb3V0IiwKKwlbQkNNMjgzNV9GU0VMX0FMVDBdID0gImFsdDAiLAorCVtCQ00yODM1X0ZTRUxfQUxUMV0gPSAiYWx0MSIsCisJW0JDTTI4MzVfRlNFTF9BTFQyXSA9ICJhbHQyIiwKKwlbQkNNMjgzNV9GU0VMX0FMVDNdID0gImFsdDMiLAorCVtCQ00yODM1X0ZTRUxfQUxUNF0gPSAiYWx0NCIsCisJW0JDTTI4MzVfRlNFTF9BTFQ1XSA9ICJhbHQ1IiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaXJxX3R5cGVfbmFtZXNbXSA9IHsKKwlbSVJRX1RZUEVfTk9ORV0gPSAibm9uZSIsCisJW0lSUV9UWVBFX0VER0VfUklTSU5HXSA9ICJlZGdlLXJpc2luZyIsCisJW0lSUV9UWVBFX0VER0VfRkFMTElOR10gPSAiZWRnZS1mYWxsaW5nIiwKKwlbSVJRX1RZUEVfRURHRV9CT1RIXSA9ICJlZGdlLWJvdGgiLAorCVtJUlFfVFlQRV9MRVZFTF9ISUdIXSA9ICJsZXZlbC1oaWdoIiwKKwlbSVJRX1RZUEVfTEVWRUxfTE9XXSA9ICJsZXZlbC1sb3ciLAorfTsKKworc3RhdGljIGlubGluZSB1MzIgYmNtMjgzNV9ncGlvX3JkKHN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjLCB1bnNpZ25lZCByZWcpCit7CisJcmV0dXJuIHJlYWRsKHBjLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJjbTI4MzVfZ3Bpb193cihzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYywgdW5zaWduZWQgcmVnLAorCQl1MzIgdmFsKQoreworCXdyaXRlbCh2YWwsIHBjLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYmNtMjgzNV9ncGlvX2dldF9iaXQoc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMsIHVuc2lnbmVkIHJlZywKKwkJdW5zaWduZWQgYml0KQoreworCXJlZyArPSBHUElPX1JFR19PRkZTRVQoYml0KSAqIDQ7CisJcmV0dXJuIChiY20yODM1X2dwaW9fcmQocGMsIHJlZykgPj4gR1BJT19SRUdfU0hJRlQoYml0KSkgJiAxOworfQorCisvKiBub3RlIE5PVCBhIHJlYWQvbW9kaWZ5L3dyaXRlIGN5Y2xlICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtMjgzNV9ncGlvX3NldF9iaXQoc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMsCisJCXVuc2lnbmVkIHJlZywgdW5zaWduZWQgYml0KQoreworCXJlZyArPSBHUElPX1JFR19PRkZTRVQoYml0KSAqIDQ7CisJYmNtMjgzNV9ncGlvX3dyKHBjLCByZWcsIEJJVChHUElPX1JFR19TSElGVChiaXQpKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgZW51bSBiY20yODM1X2ZzZWwgYmNtMjgzNV9waW5jdHJsX2ZzZWxfZ2V0KAorCQlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYywgdW5zaWduZWQgcGluKQoreworCXUzMiB2YWwgPSBiY20yODM1X2dwaW9fcmQocGMsIEZTRUxfUkVHKHBpbikpOworCWVudW0gYmNtMjgzNV9mc2VsIHN0YXR1cyA9ICh2YWwgPj4gRlNFTF9TSElGVChwaW4pKSAmIEJDTTI4MzVfRlNFTF9NQVNLOworCisJZGV2X2RiZyhwYy0+ZGV2LCAiZ2V0ICUwOHggKCV1ID0+ICVzKVxuIiwgdmFsLCBwaW4sCisJCQliY20yODM1X2Z1bmN0aW9uc1tzdGF0dXNdKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY20yODM1X3BpbmN0cmxfZnNlbF9zZXQoCisJCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjLCB1bnNpZ25lZCBwaW4sCisJCWVudW0gYmNtMjgzNV9mc2VsIGZzZWwpCit7CisJdTMyIHZhbCA9IGJjbTI4MzVfZ3Bpb19yZChwYywgRlNFTF9SRUcocGluKSk7CisJZW51bSBiY20yODM1X2ZzZWwgY3VyID0gKHZhbCA+PiBGU0VMX1NISUZUKHBpbikpICYgQkNNMjgzNV9GU0VMX01BU0s7CisKKwlkZXZfZGJnKHBjLT5kZXYsICJyZWFkICUwOHggKCV1ID0+ICVzKVxuIiwgdmFsLCBwaW4sCisJCQliY20yODM1X2Z1bmN0aW9uc1tjdXJdKTsKKworCWlmIChjdXIgPT0gZnNlbCkKKwkJcmV0dXJuOworCisJaWYgKGN1ciAhPSBCQ00yODM1X0ZTRUxfR1BJT19JTiAmJiBmc2VsICE9IEJDTTI4MzVfRlNFTF9HUElPX0lOKSB7CisJCS8qIGFsd2F5cyB0cmFuc2l0aW9uIHRocm91Z2ggR1BJT19JTiAqLworCQl2YWwgJj0gfihCQ00yODM1X0ZTRUxfTUFTSyA8PCBGU0VMX1NISUZUKHBpbikpOworCQl2YWwgfD0gQkNNMjgzNV9GU0VMX0dQSU9fSU4gPDwgRlNFTF9TSElGVChwaW4pOworCisJCWRldl9kYmcocGMtPmRldiwgInRyYW5zICUwOHggKCV1IDw9ICVzKVxuIiwgdmFsLCBwaW4sCisJCQkJYmNtMjgzNV9mdW5jdGlvbnNbQkNNMjgzNV9GU0VMX0dQSU9fSU5dKTsKKwkJYmNtMjgzNV9ncGlvX3dyKHBjLCBGU0VMX1JFRyhwaW4pLCB2YWwpOworCX0KKworCXZhbCAmPSB+KEJDTTI4MzVfRlNFTF9NQVNLIDw8IEZTRUxfU0hJRlQocGluKSk7CisJdmFsIHw9IGZzZWwgPDwgRlNFTF9TSElGVChwaW4pOworCisJZGV2X2RiZyhwYy0+ZGV2LCAid3JpdGUgJTA4eCAoJXUgPD0gJXMpXG4iLCB2YWwsIHBpbiwKKwkJCWJjbTI4MzVfZnVuY3Rpb25zW2ZzZWxdKTsKKwliY20yODM1X2dwaW9fd3IocGMsIEZTRUxfUkVHKHBpbiksIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjgzNV9ncGlvX3JlcXVlc3Qoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBwaW5jdHJsX3JlcXVlc3RfZ3BpbyhjaGlwLT5iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgYmNtMjgzNV9ncGlvX2ZyZWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXBpbmN0cmxfZnJlZV9ncGlvKGNoaXAtPmJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW50IGJjbTI4MzVfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBwaW5jdHJsX2dwaW9fZGlyZWN0aW9uX2lucHV0KGNoaXAtPmJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW50IGJjbTI4MzVfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjID0gZGV2X2dldF9kcnZkYXRhKGNoaXAtPmRldik7CisKKwlyZXR1cm4gYmNtMjgzNV9ncGlvX2dldF9iaXQocGMsIEdQTEVWMCwgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBiY20yODM1X2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gcGluY3RybF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoY2hpcC0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTI4MzVfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMgPSBkZXZfZ2V0X2RydmRhdGEoY2hpcC0+ZGV2KTsKKworCWJjbTI4MzVfZ3Bpb19zZXRfYml0KHBjLCB2YWx1ZSA/IEdQU0VUMCA6IEdQQ0xSMCwgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBiY20yODM1X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IGRldl9nZXRfZHJ2ZGF0YShjaGlwLT5kZXYpOworCisJcmV0dXJuIGlycV9saW5lYXJfcmV2bWFwKHBjLT5pcnFfZG9tYWluLCBvZmZzZXQpOworfQorCitzdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBiY20yODM1X2dwaW9fY2hpcCA9IHsKKwkubGFiZWwgPSBNT0RVTEVfTkFNRSwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkucmVxdWVzdCA9IGJjbTI4MzVfZ3Bpb19yZXF1ZXN0LAorCS5mcmVlID0gYmNtMjgzNV9ncGlvX2ZyZWUsCisJLmRpcmVjdGlvbl9pbnB1dCA9IGJjbTI4MzVfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCisJLmRpcmVjdGlvbl9vdXRwdXQgPSBiY20yODM1X2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkuZ2V0ID0gYmNtMjgzNV9ncGlvX2dldCwKKwkuc2V0ID0gYmNtMjgzNV9ncGlvX3NldCwKKwkudG9faXJxID0gYmNtMjgzNV9ncGlvX3RvX2lycSwKKwkuYmFzZSA9IC0xLAorCS5uZ3BpbyA9IEJDTTI4MzVfTlVNX0dQSU9TLAorCS5jYW5fc2xlZXAgPSBmYWxzZSwKK307CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBiY20yODM1X2dwaW9faXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBiY20yODM1X2dwaW9faXJxZGF0YSAqaXJxZGF0YSA9IGRldl9pZDsKKwlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IGlycWRhdGEtPnBjOworCWludCBiYW5rID0gaXJxZGF0YS0+YmFuazsKKwl1bnNpZ25lZCBsb25nIGV2ZW50czsKKwl1bnNpZ25lZCBvZmZzZXQ7CisJdW5zaWduZWQgZ3BpbzsKKwl1bnNpZ25lZCBpbnQgdHlwZTsKKworCWV2ZW50cyA9IGJjbTI4MzVfZ3Bpb19yZChwYywgR1BFRFMwICsgYmFuayAqIDQpOworCWV2ZW50cyAmPSBwYy0+ZW5hYmxlZF9pcnFfbWFwW2JhbmtdOworCWZvcl9lYWNoX3NldF9iaXQob2Zmc2V0LCAmZXZlbnRzLCAzMikgeworCQlncGlvID0gKDMyICogYmFuaykgKyBvZmZzZXQ7CisJCXR5cGUgPSBwYy0+aXJxX3R5cGVbZ3Bpb107CisKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycV9saW5lYXJfcmV2bWFwKHBjLT5pcnFfZG9tYWluLCBncGlvKSk7CisJfQorCXJldHVybiBldmVudHMgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19iY20yODM1X2dwaW9faXJxX2NvbmZpZyhzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYywKKwl1bnNpZ25lZCByZWcsIHVuc2lnbmVkIG9mZnNldCwgYm9vbCBlbmFibGUpCit7CisJdTMyIHZhbHVlOworCXJlZyArPSBHUElPX1JFR19PRkZTRVQob2Zmc2V0KSAqIDQ7CisJdmFsdWUgPSBiY20yODM1X2dwaW9fcmQocGMsIHJlZyk7CisJaWYgKGVuYWJsZSkKKwkJdmFsdWUgfD0gQklUKEdQSU9fUkVHX1NISUZUKG9mZnNldCkpOworCWVsc2UKKwkJdmFsdWUgJj0gfihCSVQoR1BJT19SRUdfU0hJRlQob2Zmc2V0KSkpOworCWJjbTI4MzVfZ3Bpb193cihwYywgcmVnLCB2YWx1ZSk7Cit9CisKKy8qIGZhc3QgcGF0aCBmb3IgSVJRIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIGJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjLAorCXVuc2lnbmVkIG9mZnNldCwgYm9vbCBlbmFibGUpCit7CisJc3dpdGNoIChwYy0+aXJxX3R5cGVbb2Zmc2V0XSkgeworCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CisJCV9fYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIEdQUkVOMCwgb2Zmc2V0LCBlbmFibGUpOworCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCQlfX2JjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBHUEZFTjAsIG9mZnNldCwgZW5hYmxlKTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJX19iY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgR1BSRU4wLCBvZmZzZXQsIGVuYWJsZSk7CisJCV9fYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIEdQRkVOMCwgb2Zmc2V0LCBlbmFibGUpOworCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKKwkJX19iY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgR1BIRU4wLCBvZmZzZXQsIGVuYWJsZSk7CisJCWJyZWFrOworCisJY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6CisJCV9fYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIEdQTEVOMCwgb2Zmc2V0LCBlbmFibGUpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGJjbTI4MzVfZ3Bpb19pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXVuc2lnbmVkIGdwaW8gPSBpcnFkX3RvX2h3aXJxKGRhdGEpOworCXVuc2lnbmVkIG9mZnNldCA9IEdQSU9fUkVHX1NISUZUKGdwaW8pOworCXVuc2lnbmVkIGJhbmsgPSBHUElPX1JFR19PRkZTRVQoZ3Bpbyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYy0+aXJxX2xvY2tbYmFua10sIGZsYWdzKTsKKwlzZXRfYml0KG9mZnNldCwgJnBjLT5lbmFibGVkX2lycV9tYXBbYmFua10pOworCWJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBncGlvLCB0cnVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYy0+aXJxX2xvY2tbYmFua10sIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYmNtMjgzNV9ncGlvX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXVuc2lnbmVkIGdwaW8gPSBpcnFkX3RvX2h3aXJxKGRhdGEpOworCXVuc2lnbmVkIG9mZnNldCA9IEdQSU9fUkVHX1NISUZUKGdwaW8pOworCXVuc2lnbmVkIGJhbmsgPSBHUElPX1JFR19PRkZTRVQoZ3Bpbyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYy0+aXJxX2xvY2tbYmFua10sIGZsYWdzKTsKKwliY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgZ3BpbywgZmFsc2UpOworCWNsZWFyX2JpdChvZmZzZXQsICZwYy0+ZW5hYmxlZF9pcnFfbWFwW2JhbmtdKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYy0+aXJxX2xvY2tbYmFua10sIGZsYWdzKTsKK30KKworc3RhdGljIGludCBfX2JjbTI4MzVfZ3Bpb19pcnFfc2V0X3R5cGVfZGlzYWJsZWQoc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMsCisJdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIElSUV9UWVBFX05PTkU6CisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6CisJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gdHlwZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHNsb3dlciBwYXRoIGZvciByZWNvbmZpZ3VyaW5nIElSUSB0eXBlICovCitzdGF0aWMgaW50IF9fYmNtMjgzNV9ncGlvX2lycV9zZXRfdHlwZV9lbmFibGVkKHN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjLAorCXVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJUlFfVFlQRV9OT05FOgorCQlpZiAocGMtPmlycV90eXBlW29mZnNldF0gIT0gdHlwZSkgeworCQkJYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIG9mZnNldCwgZmFsc2UpOworCQkJcGMtPmlycV90eXBlW29mZnNldF0gPSB0eXBlOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKKwkJaWYgKHBjLT5pcnFfdHlwZVtvZmZzZXRdID09IElSUV9UWVBFX0VER0VfQk9USCkgeworCQkJLyogUklTSU5HIGFscmVhZHkgZW5hYmxlZCwgZGlzYWJsZSBGQUxMSU5HICovCisJCQlwYy0+aXJxX3R5cGVbb2Zmc2V0XSA9IElSUV9UWVBFX0VER0VfRkFMTElORzsKKwkJCWJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBvZmZzZXQsIGZhbHNlKTsKKwkJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gdHlwZTsKKwkJfSBlbHNlIGlmIChwYy0+aXJxX3R5cGVbb2Zmc2V0XSAhPSB0eXBlKSB7CisJCQliY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgb2Zmc2V0LCBmYWxzZSk7CisJCQlwYy0+aXJxX3R5cGVbb2Zmc2V0XSA9IHR5cGU7CisJCQliY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgb2Zmc2V0LCB0cnVlKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgorCQlpZiAocGMtPmlycV90eXBlW29mZnNldF0gPT0gSVJRX1RZUEVfRURHRV9CT1RIKSB7CisJCQkvKiBGQUxMSU5HIGFscmVhZHkgZW5hYmxlZCwgZGlzYWJsZSBSSVNJTkcgKi8KKwkJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gSVJRX1RZUEVfRURHRV9SSVNJTkc7CisJCQliY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgb2Zmc2V0LCBmYWxzZSk7CisJCQlwYy0+aXJxX3R5cGVbb2Zmc2V0XSA9IHR5cGU7CisJCX0gZWxzZSBpZiAocGMtPmlycV90eXBlW29mZnNldF0gIT0gdHlwZSkgeworCQkJYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIG9mZnNldCwgZmFsc2UpOworCQkJcGMtPmlycV90eXBlW29mZnNldF0gPSB0eXBlOworCQkJYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIG9mZnNldCwgdHJ1ZSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJaWYgKHBjLT5pcnFfdHlwZVtvZmZzZXRdID09IElSUV9UWVBFX0VER0VfUklTSU5HKSB7CisJCQkvKiBSSVNJTkcgYWxyZWFkeSBlbmFibGVkLCBlbmFibGUgRkFMTElORyB0b28gKi8KKwkJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gSVJRX1RZUEVfRURHRV9GQUxMSU5HOworCQkJYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIG9mZnNldCwgdHJ1ZSk7CisJCQlwYy0+aXJxX3R5cGVbb2Zmc2V0XSA9IHR5cGU7CisJCX0gZWxzZSBpZiAocGMtPmlycV90eXBlW29mZnNldF0gPT0gSVJRX1RZUEVfRURHRV9GQUxMSU5HKSB7CisJCQkvKiBGQUxMSU5HIGFscmVhZHkgZW5hYmxlZCwgZW5hYmxlIFJJU0lORyB0b28gKi8KKwkJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gSVJRX1RZUEVfRURHRV9SSVNJTkc7CisJCQliY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgb2Zmc2V0LCB0cnVlKTsKKwkJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gdHlwZTsKKwkJfSBlbHNlIGlmIChwYy0+aXJxX3R5cGVbb2Zmc2V0XSAhPSB0eXBlKSB7CisJCQliY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgb2Zmc2V0LCBmYWxzZSk7CisJCQlwYy0+aXJxX3R5cGVbb2Zmc2V0XSA9IHR5cGU7CisJCQliY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgb2Zmc2V0LCB0cnVlKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJaWYgKHBjLT5pcnFfdHlwZVtvZmZzZXRdICE9IHR5cGUpIHsKKwkJCWJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBvZmZzZXQsIGZhbHNlKTsKKwkJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gdHlwZTsKKwkJCWJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBvZmZzZXQsIHRydWUpOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJjbTI4MzVfZ3Bpb19pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOworCXVuc2lnbmVkIGdwaW8gPSBpcnFkX3RvX2h3aXJxKGRhdGEpOworCXVuc2lnbmVkIG9mZnNldCA9IEdQSU9fUkVHX1NISUZUKGdwaW8pOworCXVuc2lnbmVkIGJhbmsgPSBHUElPX1JFR19PRkZTRVQoZ3Bpbyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjLT5pcnFfbG9ja1tiYW5rXSwgZmxhZ3MpOworCisJaWYgKHRlc3RfYml0KG9mZnNldCwgJnBjLT5lbmFibGVkX2lycV9tYXBbYmFua10pKQorCQlyZXQgPSBfX2JjbTI4MzVfZ3Bpb19pcnFfc2V0X3R5cGVfZW5hYmxlZChwYywgZ3BpbywgdHlwZSk7CisJZWxzZQorCQlyZXQgPSBfX2JjbTI4MzVfZ3Bpb19pcnFfc2V0X3R5cGVfZGlzYWJsZWQocGMsIGdwaW8sIHR5cGUpOworCisJaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX0JPVEgpCisJCV9faXJxX3NldF9oYW5kbGVyX2xvY2tlZChkYXRhLT5pcnEsIGhhbmRsZV9lZGdlX2lycSk7CisJZWxzZQorCQlfX2lycV9zZXRfaGFuZGxlcl9sb2NrZWQoZGF0YS0+aXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjLT5pcnFfbG9ja1tiYW5rXSwgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYmNtMjgzNV9ncGlvX2lycV9hY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisJdW5zaWduZWQgZ3BpbyA9IGlycWRfdG9faHdpcnEoZGF0YSk7CisKKwliY20yODM1X2dwaW9fc2V0X2JpdChwYywgR1BFRFMwLCBncGlvKTsKK30KKworc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBiY20yODM1X2dwaW9faXJxX2NoaXAgPSB7CisJLm5hbWUgPSBNT0RVTEVfTkFNRSwKKwkuaXJxX2VuYWJsZSA9IGJjbTI4MzVfZ3Bpb19pcnFfZW5hYmxlLAorCS5pcnFfZGlzYWJsZSA9IGJjbTI4MzVfZ3Bpb19pcnFfZGlzYWJsZSwKKwkuaXJxX3NldF90eXBlID0gYmNtMjgzNV9ncGlvX2lycV9zZXRfdHlwZSwKKwkuaXJxX2FjayA9IGJjbTI4MzVfZ3Bpb19pcnFfYWNrLAorCS5pcnFfbWFzayA9IGJjbTI4MzVfZ3Bpb19pcnFfZGlzYWJsZSwKKwkuaXJxX3VubWFzayA9IGJjbTI4MzVfZ3Bpb19pcnFfZW5hYmxlLAorfTsKKworc3RhdGljIGludCBiY20yODM1X3BjdGxfZ2V0X2dyb3Vwc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpCit7CisJcmV0dXJuIEFSUkFZX1NJWkUoYmNtMjgzNV9ncGlvX2dyb3Vwcyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpiY20yODM1X3BjdGxfZ2V0X2dyb3VwX25hbWUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQl1bnNpZ25lZCBzZWxlY3RvcikKK3sKKwlyZXR1cm4gYmNtMjgzNV9ncGlvX2dyb3Vwc1tzZWxlY3Rvcl07Cit9CisKK3N0YXRpYyBpbnQgYmNtMjgzNV9wY3RsX2dldF9ncm91cF9waW5zKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJdW5zaWduZWQgc2VsZWN0b3IsCisJCWNvbnN0IHVuc2lnbmVkICoqcGlucywKKwkJdW5zaWduZWQgKm51bV9waW5zKQoreworCSpwaW5zID0gJmJjbTI4MzVfZ3Bpb19waW5zW3NlbGVjdG9yXS5udW1iZXI7CisJKm51bV9waW5zID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiY20yODM1X3BjdGxfcGluX2RiZ19zaG93KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJc3RydWN0IHNlcV9maWxlICpzLAorCQl1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKwllbnVtIGJjbTI4MzVfZnNlbCBmc2VsID0gYmNtMjgzNV9waW5jdHJsX2ZzZWxfZ2V0KHBjLCBvZmZzZXQpOworCWNvbnN0IGNoYXIgKmZuYW1lID0gYmNtMjgzNV9mdW5jdGlvbnNbZnNlbF07CisJaW50IHZhbHVlID0gYmNtMjgzNV9ncGlvX2dldF9iaXQocGMsIEdQTEVWMCwgb2Zmc2V0KTsKKwlpbnQgaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhwYy0+aXJxX2RvbWFpbiwgb2Zmc2V0KTsKKworCXNlcV9wcmludGYocywgImZ1bmN0aW9uICVzIGluICVzOyBpcnEgJWQgKCVzKSIsCisJCWZuYW1lLCB2YWx1ZSA/ICJoaSIgOiAibG8iLAorCQlpcnEsIGlycV90eXBlX25hbWVzW3BjLT5pcnFfdHlwZVtvZmZzZXRdXSk7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTI4MzVfcGN0bF9kdF9mcmVlX21hcChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCXN0cnVjdCBwaW5jdHJsX21hcCAqbWFwcywgdW5zaWduZWQgbnVtX21hcHMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX21hcHM7IGkrKykKKwkJaWYgKG1hcHNbaV0udHlwZSA9PSBQSU5fTUFQX1RZUEVfQ09ORklHU19QSU4pCisJCQlrZnJlZShtYXBzW2ldLmRhdGEuY29uZmlncy5jb25maWdzKTsKKworCWtmcmVlKG1hcHMpOworfQorCitzdGF0aWMgaW50IGJjbTI4MzVfcGN0bF9kdF9ub2RlX3RvX21hcF9mdW5jKHN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjLAorCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCB1MzIgcGluLCB1MzIgZm51bSwKKwkJc3RydWN0IHBpbmN0cmxfbWFwICoqbWFwcykKK3sKKwlzdHJ1Y3QgcGluY3RybF9tYXAgKm1hcCA9ICptYXBzOworCisJaWYgKGZudW0gPj0gQVJSQVlfU0laRShiY20yODM1X2Z1bmN0aW9ucykpIHsKKwkJZGV2X2VycihwYy0+ZGV2LCAiJXM6IGludmFsaWQgYnJjbSxmdW5jdGlvbiAlZFxuIiwKKwkJCW9mX25vZGVfZnVsbF9uYW1lKG5wKSwgZm51bSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1hcC0+dHlwZSA9IFBJTl9NQVBfVFlQRV9NVVhfR1JPVVA7CisJbWFwLT5kYXRhLm11eC5ncm91cCA9IGJjbTI4MzVfZ3Bpb19ncm91cHNbcGluXTsKKwltYXAtPmRhdGEubXV4LmZ1bmN0aW9uID0gYmNtMjgzNV9mdW5jdGlvbnNbZm51bV07CisJKCptYXBzKSsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjgzNV9wY3RsX2R0X25vZGVfdG9fbWFwX3B1bGwoc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMsCisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHUzMiBwaW4sIHUzMiBwdWxsLAorCQlzdHJ1Y3QgcGluY3RybF9tYXAgKiptYXBzKQoreworCXN0cnVjdCBwaW5jdHJsX21hcCAqbWFwID0gKm1hcHM7CisJdW5zaWduZWQgbG9uZyAqY29uZmlnczsKKworCWlmIChwdWxsID4gMikgeworCQlkZXZfZXJyKHBjLT5kZXYsICIlczogaW52YWxpZCBicmNtLHB1bGwgJWRcbiIsCisJCQlvZl9ub2RlX2Z1bGxfbmFtZShucCksIHB1bGwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwljb25maWdzID0ga3phbGxvYyhzaXplb2YoKmNvbmZpZ3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbmZpZ3MpCisJCXJldHVybiAtRU5PTUVNOworCWNvbmZpZ3NbMF0gPSBCQ00yODM1X1BJTkNPTkZfUEFDSyhCQ00yODM1X1BJTkNPTkZfUEFSQU1fUFVMTCwgcHVsbCk7CisKKwltYXAtPnR5cGUgPSBQSU5fTUFQX1RZUEVfQ09ORklHU19QSU47CisJbWFwLT5kYXRhLmNvbmZpZ3MuZ3JvdXBfb3JfcGluID0gYmNtMjgzNV9ncGlvX3BpbnNbcGluXS5uYW1lOworCW1hcC0+ZGF0YS5jb25maWdzLmNvbmZpZ3MgPSBjb25maWdzOworCW1hcC0+ZGF0YS5jb25maWdzLm51bV9jb25maWdzID0gMTsKKwkoKm1hcHMpKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiY20yODM1X3BjdGxfZHRfbm9kZV90b19tYXAoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQlzdHJ1Y3QgcGluY3RybF9tYXAgKiptYXAsIHVuc2lnbmVkICpudW1fbWFwcykKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCXN0cnVjdCBwcm9wZXJ0eSAqcGlucywgKmZ1bmNzLCAqcHVsbHM7CisJaW50IG51bV9waW5zLCBudW1fZnVuY3MsIG51bV9wdWxscywgbWFwc19wZXJfcGluOworCXN0cnVjdCBwaW5jdHJsX21hcCAqbWFwcywgKmN1cl9tYXA7CisJaW50IGksIGVycjsKKwl1MzIgcGluLCBmdW5jLCBwdWxsOworCisJcGlucyA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJicmNtLHBpbnMiLCBOVUxMKTsKKwlpZiAoIXBpbnMpIHsKKwkJZGV2X2VycihwYy0+ZGV2LCAiJXM6IG1pc3NpbmcgYnJjbSxwaW5zIHByb3BlcnR5XG4iLAorCQkJCW9mX25vZGVfZnVsbF9uYW1lKG5wKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZ1bmNzID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgImJyY20sZnVuY3Rpb24iLCBOVUxMKTsKKwlwdWxscyA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJicmNtLHB1bGwiLCBOVUxMKTsKKworCWlmICghZnVuY3MgJiYgIXB1bGxzKSB7CisJCWRldl9lcnIocGMtPmRldiwKKwkJCSIlczogbmVpdGhlciBicmNtLGZ1bmN0aW9uIG5vciBicmNtLHB1bGwgc3BlY2lmaWVkXG4iLAorCQkJb2Zfbm9kZV9mdWxsX25hbWUobnApKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbnVtX3BpbnMgPSBwaW5zLT5sZW5ndGggLyA0OworCW51bV9mdW5jcyA9IGZ1bmNzID8gKGZ1bmNzLT5sZW5ndGggLyA0KSA6IDA7CisJbnVtX3B1bGxzID0gcHVsbHMgPyAocHVsbHMtPmxlbmd0aCAvIDQpIDogMDsKKworCWlmIChudW1fZnVuY3MgPiAxICYmIG51bV9mdW5jcyAhPSBudW1fcGlucykgeworCQlkZXZfZXJyKHBjLT5kZXYsCisJCQkiJXM6IGJyY20sZnVuY3Rpb24gbXVzdCBoYXZlIDEgb3IgJWQgZW50cmllc1xuIiwKKwkJCW9mX25vZGVfZnVsbF9uYW1lKG5wKSwgbnVtX3BpbnMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobnVtX3B1bGxzID4gMSAmJiBudW1fcHVsbHMgIT0gbnVtX3BpbnMpIHsKKwkJZGV2X2VycihwYy0+ZGV2LAorCQkJIiVzOiBicmNtLHB1bGwgbXVzdCBoYXZlIDEgb3IgJWQgZW50cmllc1xuIiwKKwkJCW9mX25vZGVfZnVsbF9uYW1lKG5wKSwgbnVtX3BpbnMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltYXBzX3Blcl9waW4gPSAwOworCWlmIChudW1fZnVuY3MpCisJCW1hcHNfcGVyX3BpbisrOworCWlmIChudW1fcHVsbHMpCisJCW1hcHNfcGVyX3BpbisrOworCWN1cl9tYXAgPSBtYXBzID0ga3phbGxvYyhudW1fcGlucyAqIG1hcHNfcGVyX3BpbiAqIHNpemVvZigqbWFwcyksCisJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFtYXBzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGluczsgaSsrKSB7CisJCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5wLCAiYnJjbSxwaW5zIiwgaSwgJnBpbik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dDsKKwkJaWYgKHBpbiA+PSBBUlJBWV9TSVpFKGJjbTI4MzVfZ3Bpb19waW5zKSkgeworCQkJZGV2X2VycihwYy0+ZGV2LCAiJXM6IGludmFsaWQgYnJjbSxwaW5zIHZhbHVlICVkXG4iLAorCQkJCW9mX25vZGVfZnVsbF9uYW1lKG5wKSwgcGluKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChudW1fZnVuY3MpIHsKKwkJCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5wLCAiYnJjbSxmdW5jdGlvbiIsCisJCQkJCShudW1fZnVuY3MgPiAxKSA/IGkgOiAwLCAmZnVuYyk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0OworCQkJZXJyID0gYmNtMjgzNV9wY3RsX2R0X25vZGVfdG9fbWFwX2Z1bmMocGMsIG5wLCBwaW4sCisJCQkJCQkJZnVuYywgJmN1cl9tYXApOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAobnVtX3B1bGxzKSB7CisJCQllcnIgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChucCwgImJyY20scHVsbCIsCisJCQkJCShudW1fZnVuY3MgPiAxKSA/IGkgOiAwLCAmcHVsbCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0OworCQkJZXJyID0gYmNtMjgzNV9wY3RsX2R0X25vZGVfdG9fbWFwX3B1bGwocGMsIG5wLCBwaW4sCisJCQkJCQkJcHVsbCwgJmN1cl9tYXApOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCSptYXAgPSBtYXBzOworCSpudW1fbWFwcyA9IG51bV9waW5zICogbWFwc19wZXJfcGluOworCisJcmV0dXJuIDA7CisKK291dDoKKwlrZnJlZShtYXBzKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfb3BzIGJjbTI4MzVfcGN0bF9vcHMgPSB7CisJLmdldF9ncm91cHNfY291bnQgPSBiY20yODM1X3BjdGxfZ2V0X2dyb3Vwc19jb3VudCwKKwkuZ2V0X2dyb3VwX25hbWUgPSBiY20yODM1X3BjdGxfZ2V0X2dyb3VwX25hbWUsCisJLmdldF9ncm91cF9waW5zID0gYmNtMjgzNV9wY3RsX2dldF9ncm91cF9waW5zLAorCS5waW5fZGJnX3Nob3cgPSBiY20yODM1X3BjdGxfcGluX2RiZ19zaG93LAorCS5kdF9ub2RlX3RvX21hcCA9IGJjbTI4MzVfcGN0bF9kdF9ub2RlX3RvX21hcCwKKwkuZHRfZnJlZV9tYXAgPSBiY20yODM1X3BjdGxfZHRfZnJlZV9tYXAsCit9OworCitzdGF0aWMgaW50IGJjbTI4MzVfcG14X2dldF9mdW5jdGlvbnNfY291bnQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2KQoreworCXJldHVybiBCQ00yODM1X0ZTRUxfQ09VTlQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpiY20yODM1X3BteF9nZXRfZnVuY3Rpb25fbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCXVuc2lnbmVkIHNlbGVjdG9yKQoreworCXJldHVybiBiY20yODM1X2Z1bmN0aW9uc1tzZWxlY3Rvcl07Cit9CisKK3N0YXRpYyBpbnQgYmNtMjgzNV9wbXhfZ2V0X2Z1bmN0aW9uX2dyb3VwcyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCXVuc2lnbmVkIHNlbGVjdG9yLAorCQljb25zdCBjaGFyICogY29uc3QgKipncm91cHMsCisJCXVuc2lnbmVkICogY29uc3QgbnVtX2dyb3VwcykKK3sKKwkvKiBldmVyeSBwaW4gY2FuIGRvIGV2ZXJ5IGZ1bmN0aW9uICovCisJKmdyb3VwcyA9IGJjbTI4MzVfZ3Bpb19ncm91cHM7CisJKm51bV9ncm91cHMgPSBBUlJBWV9TSVpFKGJjbTI4MzVfZ3Bpb19ncm91cHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjgzNV9wbXhfc2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJdW5zaWduZWQgZnVuY19zZWxlY3RvciwKKwkJdW5zaWduZWQgZ3JvdXBfc2VsZWN0b3IpCit7CisJc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCWJjbTI4MzVfcGluY3RybF9mc2VsX3NldChwYywgZ3JvdXBfc2VsZWN0b3IsIGZ1bmNfc2VsZWN0b3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTI4MzVfcG14X2dwaW9fZGlzYWJsZV9mcmVlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSAqcmFuZ2UsCisJCXVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJLyogZGlzYWJsZSBieSBzZXR0aW5nIHRvIEdQSU9fSU4gKi8KKwliY20yODM1X3BpbmN0cmxfZnNlbF9zZXQocGMsIG9mZnNldCwgQkNNMjgzNV9GU0VMX0dQSU9fSU4pOworfQorCitzdGF0aWMgaW50IGJjbTI4MzVfcG14X2dwaW9fc2V0X2RpcmVjdGlvbihzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCXN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgKnJhbmdlLAorCQl1bnNpZ25lZCBvZmZzZXQsCisJCWJvb2wgaW5wdXQpCit7CisJc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKwllbnVtIGJjbTI4MzVfZnNlbCBmc2VsID0gaW5wdXQgPworCQlCQ00yODM1X0ZTRUxfR1BJT19JTiA6IEJDTTI4MzVfRlNFTF9HUElPX09VVDsKKworCWJjbTI4MzVfcGluY3RybF9mc2VsX3NldChwYywgb2Zmc2V0LCBmc2VsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbm11eF9vcHMgYmNtMjgzNV9wbXhfb3BzID0geworCS5nZXRfZnVuY3Rpb25zX2NvdW50ID0gYmNtMjgzNV9wbXhfZ2V0X2Z1bmN0aW9uc19jb3VudCwKKwkuZ2V0X2Z1bmN0aW9uX25hbWUgPSBiY20yODM1X3BteF9nZXRfZnVuY3Rpb25fbmFtZSwKKwkuZ2V0X2Z1bmN0aW9uX2dyb3VwcyA9IGJjbTI4MzVfcG14X2dldF9mdW5jdGlvbl9ncm91cHMsCisJLnNldF9tdXggPSBiY20yODM1X3BteF9zZXQsCisJLmdwaW9fZGlzYWJsZV9mcmVlID0gYmNtMjgzNV9wbXhfZ3Bpb19kaXNhYmxlX2ZyZWUsCisJLmdwaW9fc2V0X2RpcmVjdGlvbiA9IGJjbTI4MzVfcG14X2dwaW9fc2V0X2RpcmVjdGlvbiwKK307CisKK3N0YXRpYyBpbnQgYmNtMjgzNV9waW5jb25mX2dldChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQl1bnNpZ25lZCBwaW4sIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKK3sKKwkvKiBObyB3YXkgdG8gcmVhZCBiYWNrIGNvbmZpZyBpbiBIVyAqLworCXJldHVybiAtRU5PVFNVUFA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjgzNV9waW5jb25mX3NldChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQl1bnNpZ25lZCBwaW4sIHVuc2lnbmVkIGxvbmcgKmNvbmZpZ3MsCisJCQl1bnNpZ25lZCBudW1fY29uZmlncykKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCWVudW0gYmNtMjgzNV9waW5jb25mX3BhcmFtIHBhcmFtOworCXUxNiBhcmc7CisJdTMyIG9mZiwgYml0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9jb25maWdzOyBpKyspIHsKKwkJcGFyYW0gPSBCQ00yODM1X1BJTkNPTkZfVU5QQUNLX1BBUkFNKGNvbmZpZ3NbaV0pOworCQlhcmcgPSBCQ00yODM1X1BJTkNPTkZfVU5QQUNLX0FSRyhjb25maWdzW2ldKTsKKworCQlpZiAocGFyYW0gIT0gQkNNMjgzNV9QSU5DT05GX1BBUkFNX1BVTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlvZmYgPSBHUElPX1JFR19PRkZTRVQocGluKTsKKwkJYml0ID0gR1BJT19SRUdfU0hJRlQocGluKTsKKworCQliY20yODM1X2dwaW9fd3IocGMsIEdQUFVELCBhcmcgJiAzKTsKKwkJLyoKKwkJICogRG9jcyBzYXkgdG8gd2FpdCAxNTAgY3ljbGVzLCBidXQgbm90IG9mIHdoYXQuIFdlIGFzc3VtZSBhCisJCSAqIDEgTUh6IGNsb2NrIGhlcmUsIHdoaWNoIGlzIHByZXR0eSBzbG93Li4uCisJCSAqLworCQl1ZGVsYXkoMTUwKTsKKwkJYmNtMjgzNV9ncGlvX3dyKHBjLCBHUFBVRENMSzAgKyAob2ZmICogNCksIEJJVChiaXQpKTsKKwkJdWRlbGF5KDE1MCk7CisJCWJjbTI4MzVfZ3Bpb193cihwYywgR1BQVURDTEswICsgKG9mZiAqIDQpLCAwKTsKKwl9IC8qIGZvciBlYWNoIGNvbmZpZyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY29uZl9vcHMgYmNtMjgzNV9waW5jb25mX29wcyA9IHsKKwkucGluX2NvbmZpZ19nZXQgPSBiY20yODM1X3BpbmNvbmZfZ2V0LAorCS5waW5fY29uZmlnX3NldCA9IGJjbTI4MzVfcGluY29uZl9zZXQsCit9OworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfZGVzYyBiY20yODM1X3BpbmN0cmxfZGVzYyA9IHsKKwkubmFtZSA9IE1PRFVMRV9OQU1FLAorCS5waW5zID0gYmNtMjgzNV9ncGlvX3BpbnMsCisJLm5waW5zID0gQVJSQVlfU0laRShiY20yODM1X2dwaW9fcGlucyksCisJLnBjdGxvcHMgPSAmYmNtMjgzNV9wY3RsX29wcywKKwkucG14b3BzID0gJmJjbTI4MzVfcG14X29wcywKKwkuY29uZm9wcyA9ICZiY20yODM1X3BpbmNvbmZfb3BzLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgYmNtMjgzNV9waW5jdHJsX2dwaW9fcmFuZ2UgPSB7CisJLm5hbWUgPSBNT0RVTEVfTkFNRSwKKwkubnBpbnMgPSBCQ00yODM1X05VTV9HUElPUywKK307CisKK3N0YXRpYyBpbnQgYmNtMjgzNV9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOworCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjOworCXN0cnVjdCByZXNvdXJjZSBpb21lbTsKKwlpbnQgZXJyLCBpOworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGJjbTI4MzVfZ3Bpb19waW5zKSAhPSBCQ00yODM1X05VTV9HUElPUyk7CisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoYmNtMjgzNV9ncGlvX2dyb3VwcykgIT0gQkNNMjgzNV9OVU1fR1BJT1MpOworCisJcGMgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwYyk7CisJcGMtPmRldiA9IGRldjsKKworCWVyciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZpb21lbSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCBnZXQgSU8gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwYy0+YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsICZpb21lbSk7CisJaWYgKElTX0VSUihwYy0+YmFzZSkpCisJCXJldHVybiBQVFJfRVJSKHBjLT5iYXNlKTsKKworCXBjLT5ncGlvX2NoaXAgPSBiY20yODM1X2dwaW9fY2hpcDsKKwlwYy0+Z3Bpb19jaGlwLmRldiA9IGRldjsKKwlwYy0+Z3Bpb19jaGlwLm9mX25vZGUgPSBucDsKKworCXBjLT5pcnFfZG9tYWluID0gaXJxX2RvbWFpbl9hZGRfbGluZWFyKG5wLCBCQ00yODM1X05VTV9HUElPUywKKwkJCSZpcnFfZG9tYWluX3NpbXBsZV9vcHMsIE5VTEwpOworCWlmICghcGMtPmlycV9kb21haW4pIHsKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgY3JlYXRlIElSUSBkb21haW5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQkNNMjgzNV9OVU1fR1BJT1M7IGkrKykgeworCQlpbnQgaXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKHBjLT5pcnFfZG9tYWluLCBpKTsKKwkJaXJxX3NldF9sb2NrZGVwX2NsYXNzKGlycSwgJmdwaW9fbG9ja19jbGFzcyk7CisJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcihpcnEsICZiY20yODM1X2dwaW9faXJxX2NoaXAsCisJCQkJaGFuZGxlX2xldmVsX2lycSk7CisJCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgcGMpOworCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEJDTTI4MzVfTlVNX0JBTktTOyBpKyspIHsKKwkJdW5zaWduZWQgbG9uZyBldmVudHM7CisJCXVuc2lnbmVkIG9mZnNldDsKKwkJaW50IGxlbjsKKwkJY2hhciAqbmFtZTsKKworCQkvKiBjbGVhciBldmVudCBkZXRlY3Rpb24gZmxhZ3MgKi8KKwkJYmNtMjgzNV9ncGlvX3dyKHBjLCBHUFJFTjAgKyBpICogNCwgMCk7CisJCWJjbTI4MzVfZ3Bpb193cihwYywgR1BGRU4wICsgaSAqIDQsIDApOworCQliY20yODM1X2dwaW9fd3IocGMsIEdQSEVOMCArIGkgKiA0LCAwKTsKKwkJYmNtMjgzNV9ncGlvX3dyKHBjLCBHUExFTjAgKyBpICogNCwgMCk7CisJCWJjbTI4MzVfZ3Bpb193cihwYywgR1BBUkVOMCArIGkgKiA0LCAwKTsKKwkJYmNtMjgzNV9ncGlvX3dyKHBjLCBHUEFGRU4wICsgaSAqIDQsIDApOworCisJCS8qIGNsZWFyIGFsbCB0aGUgZXZlbnRzICovCisJCWV2ZW50cyA9IGJjbTI4MzVfZ3Bpb19yZChwYywgR1BFRFMwICsgaSAqIDQpOworCQlmb3JfZWFjaF9zZXRfYml0KG9mZnNldCwgJmV2ZW50cywgMzIpCisJCQliY20yODM1X2dwaW9fd3IocGMsIEdQRURTMCArIGkgKiA0LCBCSVQob2Zmc2V0KSk7CisKKwkJcGMtPmlycVtpXSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCBpKTsKKwkJcGMtPmlycV9kYXRhW2ldLnBjID0gcGM7CisJCXBjLT5pcnFfZGF0YVtpXS5iYW5rID0gaTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBjLT5pcnFfbG9ja1tpXSk7CisKKwkJbGVuID0gc3RybGVuKGRldl9uYW1lKHBjLT5kZXYpKSArIDE2OworCQluYW1lID0gZGV2bV9remFsbG9jKHBjLT5kZXYsIGxlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghbmFtZSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlzbnByaW50ZihuYW1lLCBsZW4sICIlczpiYW5rJWQiLCBkZXZfbmFtZShwYy0+ZGV2KSwgaSk7CisKKwkJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIHBjLT5pcnFbaV0sCisJCQliY20yODM1X2dwaW9faXJxX2hhbmRsZXIsIElSUUZfU0hBUkVELAorCQkJbmFtZSwgJnBjLT5pcnFfZGF0YVtpXSk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHJlcXVlc3QgSVJRICVkXG4iLCBwYy0+aXJxW2ldKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwllcnIgPSBncGlvY2hpcF9hZGQoJnBjLT5ncGlvX2NoaXApOworCWlmIChlcnIpIHsKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgYWRkIEdQSU8gY2hpcFxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcGMtPnBjdGxfZGV2ID0gcGluY3RybF9yZWdpc3RlcigmYmNtMjgzNV9waW5jdHJsX2Rlc2MsIGRldiwgcGMpOworCWlmICghcGMtPnBjdGxfZGV2KSB7CisJCWdwaW9jaGlwX3JlbW92ZSgmcGMtPmdwaW9fY2hpcCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBjLT5ncGlvX3JhbmdlID0gYmNtMjgzNV9waW5jdHJsX2dwaW9fcmFuZ2U7CisJcGMtPmdwaW9fcmFuZ2UuYmFzZSA9IHBjLT5ncGlvX2NoaXAuYmFzZTsKKwlwYy0+Z3Bpb19yYW5nZS5nYyA9ICZwYy0+Z3Bpb19jaGlwOworCXBpbmN0cmxfYWRkX2dwaW9fcmFuZ2UocGMtPnBjdGxfZGV2LCAmcGMtPmdwaW9fcmFuZ2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtMjgzNV9waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlwaW5jdHJsX3VucmVnaXN0ZXIocGMtPnBjdGxfZGV2KTsKKwlncGlvY2hpcF9yZW1vdmUoJnBjLT5ncGlvX2NoaXApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJjbTI4MzVfcGluY3RybF9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY20yODM1LWdwaW8iIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBiY20yODM1X3BpbmN0cmxfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiY20yODM1X3BpbmN0cmxfZHJpdmVyID0geworCS5wcm9iZSA9IGJjbTI4MzVfcGluY3RybF9wcm9iZSwKKwkucmVtb3ZlID0gYmNtMjgzNV9waW5jdHJsX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9IE1PRFVMRV9OQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBiY20yODM1X3BpbmN0cmxfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJjbTI4MzVfcGluY3RybF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJDaHJpcyBCb290LCBTaW1vbiBBcmxvdHQsIFN0ZXBoZW4gV2FycmVuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJDTTI4MzUgUGluIGNvbnRyb2wgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtY3lnbnVzLWdwaW8uYyBiL2RyaXZlcnMvcGluY3RybC9iY20vcGluY3RybC1jeWdudXMtZ3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZDVjMWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtY3lnbnVzLWdwaW8uYwpAQCAtMCwwICsxLDkwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBCcm9hZGNvbSBDeWdudXMgR1BJTyBkcml2ZXIgdGhhdCBzdXBwb3J0cyAzCisgKiBHUElPIGNvbnRyb2xsZXJzIG9uIEN5Z251cyBpbmNsdWRpbmcgdGhlIEFTSVUgR1BJTyBjb250cm9sbGVyLCB0aGUKKyAqIGNoaXBDb21tb25HIEdQSU8gY29udHJvbGxlciwgYW5kIHRoZSBhbHdheXMtb24gR1BJTyBjb250cm9sbGVyLiBCYXNpYworICogUElOQ09ORiBzdWNoIGFzIGJpYXMgcHVsbCB1cC9kb3duLCBhbmQgZHJpdmUgc3RyZW5ndGggYXJlIGFsc28gc3VwcG9ydGVkCisgKiBpbiB0aGlzIGRyaXZlci4KKyAqCisgKiBQaW5zIGZyb20gdGhlIEFTSVUgR1BJTyBjYW4gYmUgaW5kaXZpZHVhbGx5IG11eGVkIHRvIEdQSU8gZnVuY3Rpb24sCisgKiB0aHJvdWdoIHRoZSBpbnRlcmFjdGlvbiB3aXRoIHRoZSBDeWdudXMgSU9NVVggY29udHJvbGxlcgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5tdXguaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYtZ2VuZXJpYy5oPgorCisjaW5jbHVkZSAiLi4vcGluY3RybC11dGlscy5oIgorCisjZGVmaW5lIENZR05VU19HUElPX0RBVEFfSU5fT0ZGU0VUICAgMHgwMAorI2RlZmluZSBDWUdOVVNfR1BJT19EQVRBX09VVF9PRkZTRVQgIDB4MDQKKyNkZWZpbmUgQ1lHTlVTX0dQSU9fT1VUX0VOX09GRlNFVCAgICAweDA4CisjZGVmaW5lIENZR05VU19HUElPX0lOX1RZUEVfT0ZGU0VUICAgMHgwYworI2RlZmluZSBDWUdOVVNfR1BJT19JTlRfREVfT0ZGU0VUICAgIDB4MTAKKyNkZWZpbmUgQ1lHTlVTX0dQSU9fSU5UX0VER0VfT0ZGU0VUICAweDE0CisjZGVmaW5lIENZR05VU19HUElPX0lOVF9NU0tfT0ZGU0VUICAgMHgxOAorI2RlZmluZSBDWUdOVVNfR1BJT19JTlRfU1RBVF9PRkZTRVQgIDB4MWMKKyNkZWZpbmUgQ1lHTlVTX0dQSU9fSU5UX01TVEFUX09GRlNFVCAweDIwCisjZGVmaW5lIENZR05VU19HUElPX0lOVF9DTFJfT0ZGU0VUICAgMHgyNAorI2RlZmluZSBDWUdOVVNfR1BJT19QQURfUkVTX09GRlNFVCAgIDB4MzQKKyNkZWZpbmUgQ1lHTlVTX0dQSU9fUkVTX0VOX09GRlNFVCAgICAweDM4CisKKy8qIGRyaXZlIHN0cmVuZ3RoIGNvbnRyb2wgZm9yIEFTSVUgR1BJTyAqLworI2RlZmluZSBDWUdOVVNfR1BJT19BU0lVX0RSVjBfQ1RSTF9PRkZTRVQgMHg1OAorCisvKiBkcml2ZSBzdHJlbmd0aCBjb250cm9sIGZvciBDQ00vQ1JNVSAoQU9OKSBHUElPICovCisjZGVmaW5lIENZR05VU19HUElPX0RSVjBfQ1RSTF9PRkZTRVQgIDB4MDAKKworI2RlZmluZSBHUElPX0JBTktfU0laRSAweDIwMAorI2RlZmluZSBOR1BJT1NfUEVSX0JBTksgMzIKKyNkZWZpbmUgR1BJT19CQU5LKHBpbikgKChwaW4pIC8gTkdQSU9TX1BFUl9CQU5LKQorCisjZGVmaW5lIENZR05VU19HUElPX1JFRyhwaW4sIHJlZykgKEdQSU9fQkFOSyhwaW4pICogR1BJT19CQU5LX1NJWkUgKyAocmVnKSkKKyNkZWZpbmUgQ1lHTlVTX0dQSU9fU0hJRlQocGluKSAoKHBpbikgJSBOR1BJT1NfUEVSX0JBTkspCisKKyNkZWZpbmUgR1BJT19EUlZfU1RSRU5HVEhfQklUX1NISUZUICAyMAorI2RlZmluZSBHUElPX0RSVl9TVFJFTkdUSF9CSVRTICAgICAgIDMKKyNkZWZpbmUgR1BJT19EUlZfU1RSRU5HVEhfQklUX01BU0sgICAoKDEgPDwgR1BJT19EUlZfU1RSRU5HVEhfQklUUykgLSAxKQorCisvKgorICogQ3lnbnVzIEdQSU8gY29yZQorICoKKyAqIEBkZXY6IHBvaW50ZXIgdG8gZGV2aWNlCisgKiBAYmFzZTogSS9PIHJlZ2lzdGVyIGJhc2UgZm9yIEN5Z251cyBHUElPIGNvbnRyb2xsZXIKKyAqIEBpb19jdHJsOiBJL08gcmVnaXN0ZXIgYmFzZSBmb3IgY2VydGFpbiB0eXBlIG9mIEN5Z251cyBHUElPIGNvbnRyb2xsZXIgdGhhdAorICogaGFzIHRoZSBQSU5DT05GIHN1cHBvcnQgaW1wbGVtZW50ZWQgb3V0c2lkZSBvZiB0aGUgR1BJTyBibG9jaworICogQGxvY2s6IGxvY2sgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gSS9PIHJlZ2lzdGVycworICogQGdjOiBHUElPIGNoaXAKKyAqIEBudW1fYmFua3M6IG51bWJlciBvZiBHUElPIGJhbmtzLCBlYWNoIGJhbmsgc3VwcG9ydHMgdXAgdG8gMzIgR1BJT3MKKyAqIEBwaW5tdXhfaXNfc3VwcG9ydGVkOiBmbGFnIHRvIGluZGljYXRlIHRoaXMgR1BJTyBjb250cm9sbGVyIGNvbnRhaW5zIHBpbnMKKyAqIHRoYXQgY2FuIGJlIGluZGl2aWR1YWxseSBtdXhlZCB0byBHUElPCisgKiBAcGN0bDogcG9pbnRlciB0byBwaW5jdHJsX2RldgorICogQHBjdGxkZXNjOiBwaW5jdHJsIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGN5Z251c19ncGlvIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdm9pZCBfX2lvbWVtICppb19jdHJsOworCisJc3BpbmxvY2tfdCBsb2NrOworCisJc3RydWN0IGdwaW9fY2hpcCBnYzsKKwl1bnNpZ25lZCBudW1fYmFua3M7CisKKwlib29sIHBpbm11eF9pc19zdXBwb3J0ZWQ7CisKKwlzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGw7CisJc3RydWN0IHBpbmN0cmxfZGVzYyBwY3RsZGVzYzsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGN5Z251c19ncGlvICp0b19jeWdudXNfZ3BpbyhzdHJ1Y3QgZ3Bpb19jaGlwICpnYykKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgY3lnbnVzX2dwaW8sIGdjKTsKK30KKworLyoKKyAqIE1hcHBpbmcgZnJvbSBQSU5DT05GIHBpbnMgdG8gR1BJTyBwaW5zIGlzIDEtdG8tMQorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGN5Z251c19waW5fdG9fZ3Bpbyh1bnNpZ25lZCBwaW4pCit7CisJcmV0dXJuIHBpbjsKK30KKworLyoqCisgKiAgY3lnbnVzX3NldF9iaXQgLSBzZXQgb3IgY2xlYXIgb25lIGJpdCAoY29ycmVzcG9uZGluZyB0byB0aGUgR1BJTyBwaW4pIGluIGEKKyAqICBDeWdudXMgR1BJTyByZWdpc3RlcgorICoKKyAqICBAY3lnbnVzX2dwaW86IEN5Z251cyBHUElPIGRldmljZQorICogIEByZWc6IHJlZ2lzdGVyIG9mZnNldAorICogIEBncGlvOiBHUElPIHBpbgorICogIEBzZXQ6IHNldCBvciBjbGVhcgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3lnbnVzX3NldF9iaXQoc3RydWN0IGN5Z251c19ncGlvICpjaGlwLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJCSAgdW5zaWduZWQgZ3BpbywgYm9vbCBzZXQpCit7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IENZR05VU19HUElPX1JFRyhncGlvLCByZWcpOworCXVuc2lnbmVkIGludCBzaGlmdCA9IENZR05VU19HUElPX1NISUZUKGdwaW8pOworCXUzMiB2YWw7CisKKwl2YWwgPSByZWFkbChjaGlwLT5iYXNlICsgb2Zmc2V0KTsKKwlpZiAoc2V0KQorCQl2YWwgfD0gQklUKHNoaWZ0KTsKKwllbHNlCisJCXZhbCAmPSB+QklUKHNoaWZ0KTsKKwl3cml0ZWwodmFsLCBjaGlwLT5iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSBib29sIGN5Z251c19nZXRfYml0KHN0cnVjdCBjeWdudXNfZ3BpbyAqY2hpcCwgdW5zaWduZWQgaW50IHJlZywKKwkJCQkgIHVuc2lnbmVkIGdwaW8pCit7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IENZR05VU19HUElPX1JFRyhncGlvLCByZWcpOworCXVuc2lnbmVkIGludCBzaGlmdCA9IENZR05VU19HUElPX1NISUZUKGdwaW8pOworCisJcmV0dXJuICEhKHJlYWRsKGNoaXAtPmJhc2UgKyBvZmZzZXQpICYgQklUKHNoaWZ0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGN5Z251c19ncGlvX2lycV9oYW5kbGVyKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7CisJc3RydWN0IGN5Z251c19ncGlvICpjaGlwID0gdG9fY3lnbnVzX2dwaW8oZ2MpOworCXN0cnVjdCBpcnFfY2hpcCAqaXJxX2NoaXAgPSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKKwlpbnQgaSwgYml0OworCisJY2hhaW5lZF9pcnFfZW50ZXIoaXJxX2NoaXAsIGRlc2MpOworCisJLyogZ28gdGhyb3VnaCB0aGUgZW50aXJlIEdQSU8gYmFua3MgYW5kIGhhbmRsZSBhbGwgaW50ZXJydXB0cyAqLworCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fYmFua3M7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHZhbCA9IHJlYWRsKGNoaXAtPmJhc2UgKyAoaSAqIEdQSU9fQkFOS19TSVpFKSArCisJCQkJCSAgQ1lHTlVTX0dQSU9fSU5UX01TVEFUX09GRlNFVCk7CisKKwkJZm9yX2VhY2hfc2V0X2JpdChiaXQsICZ2YWwsIE5HUElPU19QRVJfQkFOSykgeworCQkJdW5zaWduZWQgcGluID0gTkdQSU9TX1BFUl9CQU5LICogaSArIGJpdDsKKwkJCWludCBjaGlsZF9pcnEgPSBpcnFfZmluZF9tYXBwaW5nKGdjLT5pcnFkb21haW4sIHBpbik7CisKKwkJCS8qCisJCQkgKiBDbGVhciB0aGUgaW50ZXJydXB0IGJlZm9yZSBpbnZva2luZyB0aGUKKwkJCSAqIGhhbmRsZXIsIHNvIHdlIGRvIG5vdCBsZWF2ZSBhbnkgd2luZG93CisJCQkgKi8KKwkJCXdyaXRlbChCSVQoYml0KSwgY2hpcC0+YmFzZSArIChpICogR1BJT19CQU5LX1NJWkUpICsKKwkJCSAgICAgICBDWUdOVVNfR1BJT19JTlRfQ0xSX09GRlNFVCk7CisKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShjaGlsZF9pcnEpOworCQl9CisJfQorCisJY2hhaW5lZF9pcnFfZXhpdChpcnFfY2hpcCwgZGVzYyk7Cit9CisKKworc3RhdGljIHZvaWQgY3lnbnVzX2dwaW9faXJxX2FjayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgY3lnbnVzX2dwaW8gKmNoaXAgPSB0b19jeWdudXNfZ3BpbyhnYyk7CisJdW5zaWduZWQgZ3BpbyA9IGQtPmh3aXJxOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSBDWUdOVVNfR1BJT19SRUcoZ3BpbywKKwkJCUNZR05VU19HUElPX0lOVF9DTFJfT0ZGU0VUKTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSBDWUdOVVNfR1BJT19TSElGVChncGlvKTsKKwl1MzIgdmFsID0gQklUKHNoaWZ0KTsKKworCXdyaXRlbCh2YWwsIGNoaXAtPmJhc2UgKyBvZmZzZXQpOworfQorCisvKioKKyAqICBjeWdudXNfZ3Bpb19pcnFfc2V0X21hc2sgLSBtYXNrL3VubWFzayBhIEdQSU8gaW50ZXJydXB0CisgKgorICogIEBkOiBJUlEgY2hpcCBkYXRhCisgKiAgQHVubWFzazogbWFzay91bm1hc2sgR1BJTyBpbnRlcnJ1cHQKKyAqLworc3RhdGljIHZvaWQgY3lnbnVzX2dwaW9faXJxX3NldF9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCwgYm9vbCB1bm1hc2spCit7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgY3lnbnVzX2dwaW8gKmNoaXAgPSB0b19jeWdudXNfZ3BpbyhnYyk7CisJdW5zaWduZWQgZ3BpbyA9IGQtPmh3aXJxOworCisJY3lnbnVzX3NldF9iaXQoY2hpcCwgQ1lHTlVTX0dQSU9fSU5UX01TS19PRkZTRVQsIGdwaW8sIHVubWFzayk7Cit9CisKK3N0YXRpYyB2b2lkIGN5Z251c19ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBjeWdudXNfZ3BpbyAqY2hpcCA9IHRvX2N5Z251c19ncGlvKGdjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKwljeWdudXNfZ3Bpb19pcnFfc2V0X21hc2soZCwgZmFsc2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgY3lnbnVzX2dwaW9faXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgY3lnbnVzX2dwaW8gKmNoaXAgPSB0b19jeWdudXNfZ3BpbyhnYyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5sb2NrLCBmbGFncyk7CisJY3lnbnVzX2dwaW9faXJxX3NldF9tYXNrKGQsIHRydWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBjeWdudXNfZ3Bpb19pcnFfc2V0X3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBjeWdudXNfZ3BpbyAqY2hpcCA9IHRvX2N5Z251c19ncGlvKGdjKTsKKwl1bnNpZ25lZCBncGlvID0gZC0+aHdpcnE7CisJYm9vbCBsZXZlbF90cmlnZ2VyZWQgPSBmYWxzZTsKKwlib29sIGR1YWxfZWRnZSA9IGZhbHNlOworCWJvb2wgcmlzaW5nX29yX2hpZ2ggPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoICh0eXBlICYgSVJRX1RZUEVfU0VOU0VfTUFTSykgeworCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CisJCXJpc2luZ19vcl9oaWdoID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJZHVhbF9lZGdlID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0xFVkVMX0hJR0g6CisJCWxldmVsX3RyaWdnZXJlZCA9IHRydWU7CisJCXJpc2luZ19vcl9oaWdoID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJbGV2ZWxfdHJpZ2dlcmVkID0gdHJ1ZTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNoaXAtPmRldiwgImludmFsaWQgR1BJTyBJUlEgdHlwZSAweCV4XG4iLAorCQkJdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5sb2NrLCBmbGFncyk7CisJY3lnbnVzX3NldF9iaXQoY2hpcCwgQ1lHTlVTX0dQSU9fSU5fVFlQRV9PRkZTRVQsIGdwaW8sCisJCSAgICAgICBsZXZlbF90cmlnZ2VyZWQpOworCWN5Z251c19zZXRfYml0KGNoaXAsIENZR05VU19HUElPX0lOVF9ERV9PRkZTRVQsIGdwaW8sIGR1YWxfZWRnZSk7CisJY3lnbnVzX3NldF9iaXQoY2hpcCwgQ1lHTlVTX0dQSU9fSU5UX0VER0VfT0ZGU0VULCBncGlvLAorCQkgICAgICAgcmlzaW5nX29yX2hpZ2gpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoY2hpcC0+ZGV2LAorCQkiZ3BpbzoldSBsZXZlbF90cmlnZ2VyZWQ6JWQgZHVhbF9lZGdlOiVkIHJpc2luZ19vcl9oaWdoOiVkXG4iLAorCQlncGlvLCBsZXZlbF90cmlnZ2VyZWQsIGR1YWxfZWRnZSwgcmlzaW5nX29yX2hpZ2gpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY3lnbnVzX2dwaW9faXJxX2NoaXAgPSB7CisJLm5hbWUgPSAiYmNtLWN5Z251cy1ncGlvIiwKKwkuaXJxX2FjayA9IGN5Z251c19ncGlvX2lycV9hY2ssCisJLmlycV9tYXNrID0gY3lnbnVzX2dwaW9faXJxX21hc2ssCisJLmlycV91bm1hc2sgPSBjeWdudXNfZ3Bpb19pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUgPSBjeWdudXNfZ3Bpb19pcnFfc2V0X3R5cGUsCit9OworCisvKgorICogUmVxdWVzdCB0aGUgQ3lnbnVzIElPTVVYIHBpbm11eCBjb250cm9sbGVyIHRvIG11eCBpbmRpdmlkdWFsIHBpbnMgdG8gR1BJTworICovCitzdGF0aWMgaW50IGN5Z251c19ncGlvX3JlcXVlc3Qoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgY3lnbnVzX2dwaW8gKmNoaXAgPSB0b19jeWdudXNfZ3BpbyhnYyk7CisJdW5zaWduZWQgZ3BpbyA9IGdjLT5iYXNlICsgb2Zmc2V0OworCisJLyogbm90IGFsbCBDeWdudXMgR1BJTyBwaW5zIGNhbiBiZSBtdXhlZCBpbmRpdmlkdWFsbHkgKi8KKwlpZiAoIWNoaXAtPnBpbm11eF9pc19zdXBwb3J0ZWQpCisJCXJldHVybiAwOworCisJcmV0dXJuIHBpbmN0cmxfcmVxdWVzdF9ncGlvKGdwaW8pOworfQorCitzdGF0aWMgdm9pZCBjeWdudXNfZ3Bpb19mcmVlKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IGN5Z251c19ncGlvICpjaGlwID0gdG9fY3lnbnVzX2dwaW8oZ2MpOworCXVuc2lnbmVkIGdwaW8gPSBnYy0+YmFzZSArIG9mZnNldDsKKworCWlmICghY2hpcC0+cGlubXV4X2lzX3N1cHBvcnRlZCkKKwkJcmV0dXJuOworCisJcGluY3RybF9mcmVlX2dwaW8oZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbnQgY3lnbnVzX2dwaW9fZGlyZWN0aW9uX2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBncGlvKQoreworCXN0cnVjdCBjeWdudXNfZ3BpbyAqY2hpcCA9IHRvX2N5Z251c19ncGlvKGdjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKwljeWdudXNfc2V0X2JpdChjaGlwLCBDWUdOVVNfR1BJT19PVVRfRU5fT0ZGU0VULCBncGlvLCBmYWxzZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJZGV2X2RiZyhjaGlwLT5kZXYsICJncGlvOiV1IHNldCBpbnB1dFxuIiwgZ3Bpbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjeWdudXNfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBncGlvLAorCQkJCQlpbnQgdmFsKQoreworCXN0cnVjdCBjeWdudXNfZ3BpbyAqY2hpcCA9IHRvX2N5Z251c19ncGlvKGdjKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKwljeWdudXNfc2V0X2JpdChjaGlwLCBDWUdOVVNfR1BJT19PVVRfRU5fT0ZGU0VULCBncGlvLCB0cnVlKTsKKwljeWdudXNfc2V0X2JpdChjaGlwLCBDWUdOVVNfR1BJT19EQVRBX09VVF9PRkZTRVQsIGdwaW8sICEhKHZhbCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoY2hpcC0+ZGV2LCAiZ3BpbzoldSBzZXQgb3V0cHV0LCB2YWx1ZTolZFxuIiwgZ3BpbywgdmFsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjeWdudXNfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGdwaW8sIGludCB2YWwpCit7CisJc3RydWN0IGN5Z251c19ncGlvICpjaGlwID0gdG9fY3lnbnVzX2dwaW8oZ2MpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+bG9jaywgZmxhZ3MpOworCWN5Z251c19zZXRfYml0KGNoaXAsIENZR05VU19HUElPX0RBVEFfT1VUX09GRlNFVCwgZ3BpbywgISEodmFsKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJZGV2X2RiZyhjaGlwLT5kZXYsICJncGlvOiV1IHNldCwgdmFsdWU6JWRcbiIsIGdwaW8sIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgY3lnbnVzX2dwaW9fZ2V0KHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBncGlvKQoreworCXN0cnVjdCBjeWdudXNfZ3BpbyAqY2hpcCA9IHRvX2N5Z251c19ncGlvKGdjKTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gQ1lHTlVTX0dQSU9fUkVHKGdwaW8sCisJCQkJCSAgICAgIENZR05VU19HUElPX0RBVEFfSU5fT0ZGU0VUKTsKKwl1bnNpZ25lZCBpbnQgc2hpZnQgPSBDWUdOVVNfR1BJT19TSElGVChncGlvKTsKKworCXJldHVybiAhIShyZWFkbChjaGlwLT5iYXNlICsgb2Zmc2V0KSAmIEJJVChzaGlmdCkpOworfQorCitzdGF0aWMgaW50IGN5Z251c19nZXRfZ3JvdXBzX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldikKK3sKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIE9ubHkgb25lIGdyb3VwOiAiZ3Bpb19ncnAiLCBzaW5jZSB0aGlzIGxvY2FsIHBpbmN0cmwgZGV2aWNlIG9ubHkgcGVyZm9ybXMKKyAqIEdQSU8gc3BlY2lmaWMgUElOQ09ORiBjb25maWd1cmF0aW9ucworICovCitzdGF0aWMgY29uc3QgY2hhciAqY3lnbnVzX2dldF9ncm91cF9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQkJIHVuc2lnbmVkIHNlbGVjdG9yKQoreworCXJldHVybiAiZ3Bpb19ncnAiOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfb3BzIGN5Z251c19wY3RybF9vcHMgPSB7CisJLmdldF9ncm91cHNfY291bnQgPSBjeWdudXNfZ2V0X2dyb3Vwc19jb3VudCwKKwkuZ2V0X2dyb3VwX25hbWUgPSBjeWdudXNfZ2V0X2dyb3VwX25hbWUsCisJLmR0X25vZGVfdG9fbWFwID0gcGluY29uZl9nZW5lcmljX2R0X25vZGVfdG9fbWFwX3BpbiwKKwkuZHRfZnJlZV9tYXAgPSBwaW5jdHJsX3V0aWxzX2R0X2ZyZWVfbWFwLAorfTsKKworc3RhdGljIGludCBjeWdudXNfZ3Bpb19zZXRfcHVsbChzdHJ1Y3QgY3lnbnVzX2dwaW8gKmNoaXAsIHVuc2lnbmVkIGdwaW8sCisJCQkJYm9vbCBkaXNhYmxlLCBib29sIHB1bGxfdXApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZGlzYWJsZSkgeworCQljeWdudXNfc2V0X2JpdChjaGlwLCBDWUdOVVNfR1BJT19SRVNfRU5fT0ZGU0VULCBncGlvLCBmYWxzZSk7CisJfSBlbHNlIHsKKwkJY3lnbnVzX3NldF9iaXQoY2hpcCwgQ1lHTlVTX0dQSU9fUEFEX1JFU19PRkZTRVQsIGdwaW8sCisJCQkgICAgICAgcHVsbF91cCk7CisJCWN5Z251c19zZXRfYml0KGNoaXAsIENZR05VU19HUElPX1JFU19FTl9PRkZTRVQsIGdwaW8sIHRydWUpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKworCWRldl9kYmcoY2hpcC0+ZGV2LCAiZ3BpbzoldSBzZXQgcHVsbHVwOiVkXG4iLCBncGlvLCBwdWxsX3VwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjeWdudXNfZ3Bpb19nZXRfcHVsbChzdHJ1Y3QgY3lnbnVzX2dwaW8gKmNoaXAsIHVuc2lnbmVkIGdwaW8sCisJCQkJIGJvb2wgKmRpc2FibGUsIGJvb2wgKnB1bGxfdXApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5sb2NrLCBmbGFncyk7CisJKmRpc2FibGUgPSAhY3lnbnVzX2dldF9iaXQoY2hpcCwgQ1lHTlVTX0dQSU9fUkVTX0VOX09GRlNFVCwgZ3Bpbyk7CisJKnB1bGxfdXAgPSBjeWdudXNfZ2V0X2JpdChjaGlwLCBDWUdOVVNfR1BJT19QQURfUkVTX09GRlNFVCwgZ3Bpbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGN5Z251c19ncGlvX3NldF9zdHJlbmd0aChzdHJ1Y3QgY3lnbnVzX2dwaW8gKmNoaXAsIHVuc2lnbmVkIGdwaW8sCisJCQkJICAgIHVuc2lnbmVkIHN0cmVuZ3RoKQoreworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1bnNpZ25lZCBpbnQgaSwgb2Zmc2V0LCBzaGlmdDsKKwl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBtYWtlIHN1cmUgZHJpdmUgc3RyZW5ndGggaXMgc3VwcG9ydGVkICovCisJaWYgKHN0cmVuZ3RoIDwgMiB8fCAgc3RyZW5ndGggPiAxNiB8fCAoc3RyZW5ndGggJSAyKSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCWlmIChjaGlwLT5pb19jdHJsKSB7CisJCWJhc2UgPSBjaGlwLT5pb19jdHJsOworCQlvZmZzZXQgPSBDWUdOVVNfR1BJT19EUlYwX0NUUkxfT0ZGU0VUOworCX0gZWxzZSB7CisJCWJhc2UgPSBjaGlwLT5iYXNlOworCQlvZmZzZXQgPSBDWUdOVVNfR1BJT19SRUcoZ3BpbywKKwkJCQkJIENZR05VU19HUElPX0FTSVVfRFJWMF9DVFJMX09GRlNFVCk7CisJfQorCisJc2hpZnQgPSBDWUdOVVNfR1BJT19TSElGVChncGlvKTsKKworCWRldl9kYmcoY2hpcC0+ZGV2LCAiZ3BpbzoldSBzZXQgZHJpdmUgc3RyZW5ndGg6JWQgbUFcbiIsIGdwaW8sCisJCXN0cmVuZ3RoKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5sb2NrLCBmbGFncyk7CisJc3RyZW5ndGggPSAoc3RyZW5ndGggLyAyKSAtIDE7CisJZm9yIChpID0gMDsgaSA8IEdQSU9fRFJWX1NUUkVOR1RIX0JJVFM7IGkrKykgeworCQl2YWwgPSByZWFkbChiYXNlICsgb2Zmc2V0KTsKKwkJdmFsICY9IH5CSVQoc2hpZnQpOworCQl2YWwgfD0gKChzdHJlbmd0aCA+PiBpKSAmIDB4MSkgPDwgc2hpZnQ7CisJCXdyaXRlbCh2YWwsIGJhc2UgKyBvZmZzZXQpOworCQlvZmZzZXQgKz0gNDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3lnbnVzX2dwaW9fZ2V0X3N0cmVuZ3RoKHN0cnVjdCBjeWdudXNfZ3BpbyAqY2hpcCwgdW5zaWduZWQgZ3BpbywKKwkJCQkgICAgdTE2ICpzdHJlbmd0aCkKK3sKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgaW50IGksIG9mZnNldCwgc2hpZnQ7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNoaXAtPmlvX2N0cmwpIHsKKwkJYmFzZSA9IGNoaXAtPmlvX2N0cmw7CisJCW9mZnNldCA9IENZR05VU19HUElPX0RSVjBfQ1RSTF9PRkZTRVQ7CisJfSBlbHNlIHsKKwkJYmFzZSA9IGNoaXAtPmJhc2U7CisJCW9mZnNldCA9IENZR05VU19HUElPX1JFRyhncGlvLAorCQkJCQkgQ1lHTlVTX0dQSU9fQVNJVV9EUlYwX0NUUkxfT0ZGU0VUKTsKKwl9CisKKwlzaGlmdCA9IENZR05VU19HUElPX1NISUZUKGdwaW8pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKwkqc3RyZW5ndGggPSAwOworCWZvciAoaSA9IDA7IGkgPCBHUElPX0RSVl9TVFJFTkdUSF9CSVRTOyBpKyspIHsKKwkJdmFsID0gcmVhZGwoYmFzZSArIG9mZnNldCkgJiBCSVQoc2hpZnQpOworCQl2YWwgPj49IHNoaWZ0OworCQkqc3RyZW5ndGggKz0gKHZhbCA8PCBpKTsKKwkJb2Zmc2V0ICs9IDQ7CisJfQorCisJLyogY29udmVydCB0byBtQSAqLworCSpzdHJlbmd0aCA9ICgqc3RyZW5ndGggKyAxKSAqIDI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3lnbnVzX3Bpbl9jb25maWdfZ2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgcGluLAorCQkJCSB1bnNpZ25lZCBsb25nICpjb25maWcpCit7CisJc3RydWN0IGN5Z251c19ncGlvICpjaGlwID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisJZW51bSBwaW5fY29uZmlnX3BhcmFtIHBhcmFtID0gcGluY29uZl90b19jb25maWdfcGFyYW0oKmNvbmZpZyk7CisJdW5zaWduZWQgZ3BpbyA9IGN5Z251c19waW5fdG9fZ3BpbyhwaW4pOworCXUxNiBhcmc7CisJYm9vbCBkaXNhYmxlLCBwdWxsX3VwOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBQSU5fQ09ORklHX0JJQVNfRElTQUJMRToKKwkJY3lnbnVzX2dwaW9fZ2V0X3B1bGwoY2hpcCwgZ3BpbywgJmRpc2FibGUsICZwdWxsX3VwKTsKKwkJaWYgKGRpc2FibGUpCisJCQlyZXR1cm4gMDsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX1VQOgorCQljeWdudXNfZ3Bpb19nZXRfcHVsbChjaGlwLCBncGlvLCAmZGlzYWJsZSwgJnB1bGxfdXApOworCQlpZiAoIWRpc2FibGUgJiYgcHVsbF91cCkKKwkJCXJldHVybiAwOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhc2UgUElOX0NPTkZJR19CSUFTX1BVTExfRE9XTjoKKwkJY3lnbnVzX2dwaW9fZ2V0X3B1bGwoY2hpcCwgZ3BpbywgJmRpc2FibGUsICZwdWxsX3VwKTsKKwkJaWYgKCFkaXNhYmxlICYmICFwdWxsX3VwKQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgorCQlyZXQgPSBjeWdudXNfZ3Bpb19nZXRfc3RyZW5ndGgoY2hpcCwgZ3BpbywgJmFyZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQllbHNlCisJCQkqY29uZmlnID0gcGluY29uZl90b19jb25maWdfcGFja2VkKHBhcmFtLCBhcmcpOworCisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gLUVOT1RTVVBQOworfQorCitzdGF0aWMgaW50IGN5Z251c19waW5fY29uZmlnX3NldChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIHBpbiwKKwkJCQkgdW5zaWduZWQgbG9uZyAqY29uZmlncywgdW5zaWduZWQgbnVtX2NvbmZpZ3MpCit7CisJc3RydWN0IGN5Z251c19ncGlvICpjaGlwID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisJZW51bSBwaW5fY29uZmlnX3BhcmFtIHBhcmFtOworCXUxNiBhcmc7CisJdW5zaWduZWQgaSwgZ3BpbyA9IGN5Z251c19waW5fdG9fZ3BpbyhwaW4pOworCWludCByZXQgPSAtRU5PVFNVUFA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbmZpZ3M7IGkrKykgeworCQlwYXJhbSA9IHBpbmNvbmZfdG9fY29uZmlnX3BhcmFtKGNvbmZpZ3NbaV0pOworCQlhcmcgPSBwaW5jb25mX3RvX2NvbmZpZ19hcmd1bWVudChjb25maWdzW2ldKTsKKworCQlzd2l0Y2ggKHBhcmFtKSB7CisJCWNhc2UgUElOX0NPTkZJR19CSUFTX0RJU0FCTEU6CisJCQlyZXQgPSBjeWdudXNfZ3Bpb19zZXRfcHVsbChjaGlwLCBncGlvLCB0cnVlLCBmYWxzZSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCisJCWNhc2UgUElOX0NPTkZJR19CSUFTX1BVTExfVVA6CisJCQlyZXQgPSBjeWdudXNfZ3Bpb19zZXRfcHVsbChjaGlwLCBncGlvLCBmYWxzZSwgdHJ1ZSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCisJCWNhc2UgUElOX0NPTkZJR19CSUFTX1BVTExfRE9XTjoKKwkJCXJldCA9IGN5Z251c19ncGlvX3NldF9wdWxsKGNoaXAsIGdwaW8sIGZhbHNlLCBmYWxzZSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCisJCWNhc2UgUElOX0NPTkZJR19EUklWRV9TVFJFTkdUSDoKKwkJCXJldCA9IGN5Z251c19ncGlvX3NldF9zdHJlbmd0aChjaGlwLCBncGlvLCBhcmcpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZGV2X2VycihjaGlwLT5kZXYsICJpbnZhbGlkIGNvbmZpZ3VyYXRpb25cbiIpOworCQkJcmV0dXJuIC1FTk9UU1VQUDsKKwkJfQorCX0gLyogZm9yIGVhY2ggY29uZmlnICovCisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmNvbmZfb3BzIGN5Z251c19wY29uZl9vcHMgPSB7CisJLmlzX2dlbmVyaWMgPSB0cnVlLAorCS5waW5fY29uZmlnX2dldCA9IGN5Z251c19waW5fY29uZmlnX2dldCwKKwkucGluX2NvbmZpZ19zZXQgPSBjeWdudXNfcGluX2NvbmZpZ19zZXQsCit9OworCisvKgorICogTWFwIGEgR1BJTyBpbiB0aGUgbG9jYWwgZ3Bpb19jaGlwIHBpbiBzcGFjZSB0byBhIHBpbiBpbiB0aGUgQ3lnbnVzIElPTVVYCisgKiBwaW5jdHJsIHBpbiBzcGFjZQorICovCitzdHJ1Y3QgY3lnbnVzX2dwaW9fcGluX3JhbmdlIHsKKwl1bnNpZ25lZCBvZmZzZXQ7CisJdW5zaWduZWQgcGluX2Jhc2U7CisJdW5zaWduZWQgbnVtX3BpbnM7Cit9OworCisjZGVmaW5lIENZR05VU19QSU5SQU5HRShvLCBwLCBuKSB7IC5vZmZzZXQgPSBvLCAucGluX2Jhc2UgPSBwLCAubnVtX3BpbnMgPSBuIH0KKworLyoKKyAqIFBpbiBtYXBwaW5nIHRhYmxlIGZvciBtYXBwaW5nIGxvY2FsIEdQSU8gcGlucyB0byBDeWdudXMgSU9NVVggcGluY3RybCBwaW5zCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3lnbnVzX2dwaW9fcGluX3JhbmdlIGN5Z251c19ncGlvX3BpbnRhYmxlW10gPSB7CisJQ1lHTlVTX1BJTlJBTkdFKDAsIDQyLCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoMSwgNDQsIDMpLAorCUNZR05VU19QSU5SQU5HRSg0LCA0OCwgMSksCisJQ1lHTlVTX1BJTlJBTkdFKDUsIDUwLCAzKSwKKwlDWUdOVVNfUElOUkFOR0UoOCwgMTI2LCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoOSwgMTU1LCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoMTAsIDE1MiwgMSksCisJQ1lHTlVTX1BJTlJBTkdFKDExLCAxNTQsIDEpLAorCUNZR05VU19QSU5SQU5HRSgxMiwgMTUzLCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoMTMsIDEyNywgMyksCisJQ1lHTlVTX1BJTlJBTkdFKDE2LCAxNDAsIDEpLAorCUNZR05VU19QSU5SQU5HRSgxNywgMTQ1LCA3KSwKKwlDWUdOVVNfUElOUkFOR0UoMjQsIDEzMCwgMTApLAorCUNZR05VU19QSU5SQU5HRSgzNCwgMTQxLCA0KSwKKwlDWUdOVVNfUElOUkFOR0UoMzgsIDU0LCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoMzksIDU2LCAzKSwKKwlDWUdOVVNfUElOUkFOR0UoNDIsIDYwLCAzKSwKKwlDWUdOVVNfUElOUkFOR0UoNDUsIDY0LCAzKSwKKwlDWUdOVVNfUElOUkFOR0UoNDgsIDY4LCAyKSwKKwlDWUdOVVNfUElOUkFOR0UoNTAsIDg0LCA2KSwKKwlDWUdOVVNfUElOUkFOR0UoNTYsIDk0LCA2KSwKKwlDWUdOVVNfUElOUkFOR0UoNjIsIDcyLCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoNjMsIDcwLCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoNjQsIDgwLCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoNjUsIDc0LCAzKSwKKwlDWUdOVVNfUElOUkFOR0UoNjgsIDc4LCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoNjksIDgyLCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoNzAsIDE1NiwgMTcpLAorCUNZR05VU19QSU5SQU5HRSg4NywgMTA0LCAxMiksCisJQ1lHTlVTX1BJTlJBTkdFKDk5LCAxMDIsIDIpLAorCUNZR05VU19QSU5SQU5HRSgxMDEsIDkwLCA0KSwKKwlDWUdOVVNfUElOUkFOR0UoMTA1LCAxMTYsIDEwKSwKKwlDWUdOVVNfUElOUkFOR0UoMTIzLCAxMSwgMSksCisJQ1lHTlVTX1BJTlJBTkdFKDEyNCwgMzgsIDQpLAorCUNZR05VU19QSU5SQU5HRSgxMjgsIDQzLCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoMTI5LCA0NywgMSksCisJQ1lHTlVTX1BJTlJBTkdFKDEzMCwgNDksIDEpLAorCUNZR05VU19QSU5SQU5HRSgxMzEsIDUzLCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoMTMyLCA1NSwgMSksCisJQ1lHTlVTX1BJTlJBTkdFKDEzMywgNTksIDEpLAorCUNZR05VU19QSU5SQU5HRSgxMzQsIDYzLCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoMTM1LCA2NywgMSksCisJQ1lHTlVTX1BJTlJBTkdFKDEzNiwgNzEsIDEpLAorCUNZR05VU19QSU5SQU5HRSgxMzcsIDczLCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoMTM4LCA3NywgMSksCisJQ1lHTlVTX1BJTlJBTkdFKDEzOSwgNzksIDEpLAorCUNZR05VU19QSU5SQU5HRSgxNDAsIDgxLCAxKSwKKwlDWUdOVVNfUElOUkFOR0UoMTQxLCA4MywgMSksCisJQ1lHTlVTX1BJTlJBTkdFKDE0MiwgMTAsIDEpCit9OworCisvKgorICogVGhlIEN5Z251cyBJT01VWCBjb250cm9sbGVyIG1haW5seSBzdXBwb3J0cyBncm91cCBiYXNlZCBtdXggY29uZmlndXJhdGlvbiwKKyAqIGJ1dCBjZXJ0YWluIHBpbnMgY2FuIGJlIG11eGVkIHRvIEdQSU8gaW5kaXZpZHVhbGx5LiBPbmx5IHRoZSBBU0lVIEdQSU8KKyAqIGNvbnRyb2xsZXIgY2FuIHN1cHBvcnQgdGhpcywgc28gaXQncyBhbiBvcHRpb25hbCBjb25maWd1cmF0aW9uCisgKgorICogUmV0dXJuIC1FTk9ERVYgbWVhbnMgbm8gc3VwcG9ydCBhbmQgdGhhdCdzIGZpbmUKKyAqLworc3RhdGljIGludCBjeWdudXNfZ3Bpb19waW5tdXhfYWRkX3JhbmdlKHN0cnVjdCBjeWdudXNfZ3BpbyAqY2hpcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUgPSBjaGlwLT5kZXYtPm9mX25vZGU7CisJc3RydWN0IGRldmljZV9ub2RlICpwaW5tdXhfbm9kZTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwaW5tdXhfcGRldjsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9ICZjaGlwLT5nYzsKKwlpbnQgaSwgcmV0ID0gMDsKKworCS8qIHBhcnNlIERUIHRvIGZpbmQgdGhlIHBoYW5kbGUgdG8gdGhlIHBpbm11eCBjb250cm9sbGVyICovCisJcGlubXV4X25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5vZGUsICJwaW5tdXgiLCAwKTsKKwlpZiAoIXBpbm11eF9ub2RlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBpbm11eF9wZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShwaW5tdXhfbm9kZSk7CisJLyogbm8gbG9uZ2VyIG5lZWQgdGhlIHBpbm11eCBub2RlICovCisJb2Zfbm9kZV9wdXQocGlubXV4X25vZGUpOworCWlmICghcGlubXV4X3BkZXYpIHsKKwkJZGV2X2VycihjaGlwLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHBpbm11eCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBub3cgbmVlZCB0byBjcmVhdGUgdGhlIG1hcHBpbmcgYmV0d2VlbiBsb2NhbCBHUElPIGFuZCBQSU5NVVggcGlucyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN5Z251c19ncGlvX3BpbnRhYmxlKTsgaSsrKSB7CisJCXJldCA9IGdwaW9jaGlwX2FkZF9waW5fcmFuZ2UoZ2MsIGRldl9uYW1lKCZwaW5tdXhfcGRldi0+ZGV2KSwKKwkJCQkJICAgICBjeWdudXNfZ3Bpb19waW50YWJsZVtpXS5vZmZzZXQsCisJCQkJCSAgICAgY3lnbnVzX2dwaW9fcGludGFibGVbaV0ucGluX2Jhc2UsCisJCQkJCSAgICAgY3lnbnVzX2dwaW9fcGludGFibGVbaV0ubnVtX3BpbnMpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGNoaXAtPmRldiwgInVuYWJsZSB0byBhZGQgR1BJTyBwaW4gcmFuZ2VcbiIpOworCQkJZ290byBlcnJfcHV0X2RldmljZTsKKwkJfQorCX0KKworCWNoaXAtPnBpbm11eF9pc19zdXBwb3J0ZWQgPSB0cnVlOworCisJLyogbm8gbmVlZCBmb3IgcGlubXV4X3BkZXYgZGV2aWNlIHJlZmVyZW5jZSBhbnltb3JlICovCisJcHV0X2RldmljZSgmcGlubXV4X3BkZXYtPmRldik7CisJcmV0dXJuIDA7CisKK2Vycl9wdXRfZGV2aWNlOgorCXB1dF9kZXZpY2UoJnBpbm11eF9wZGV2LT5kZXYpOworCWdwaW9jaGlwX3JlbW92ZV9waW5fcmFuZ2VzKGdjKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ3lnbnVzIEdQSU8gY29udHJvbGxlciBzdXBwb3J0cyBzb21lIFBJTkNPTkYgcmVsYXRlZCBjb25maWd1cmF0aW9ucyBzdWNoIGFzCisgKiBwdWxsIHVwLCBwdWxsIGRvd24sIGFuZCBkcml2ZSBzdHJlbmd0aCwgd2hlbiB0aGUgcGluIGlzIGNvbmZpZ3VyZWQgdG8gR1BJTworICoKKyAqIEhlcmUgYSBsb2NhbCBwaW5jdHJsIGRldmljZSBpcyBjcmVhdGVkIHdpdGggc2ltcGxlIDEtdG8tMSBwaW4gbWFwcGluZyB0byB0aGUKKyAqIGxvY2FsIEdQSU8gcGlucworICovCitzdGF0aWMgaW50IGN5Z251c19ncGlvX3JlZ2lzdGVyX3BpbmNvbmYoc3RydWN0IGN5Z251c19ncGlvICpjaGlwKQoreworCXN0cnVjdCBwaW5jdHJsX2Rlc2MgKnBjdGxkZXNjID0gJmNoaXAtPnBjdGxkZXNjOworCXN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjICpwaW5zOworCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gJmNoaXAtPmdjOworCWludCBpOworCisJcGlucyA9IGRldm1fa2NhbGxvYyhjaGlwLT5kZXYsIGdjLT5uZ3Bpbywgc2l6ZW9mKCpwaW5zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaW5zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBnYy0+bmdwaW87IGkrKykgeworCQlwaW5zW2ldLm51bWJlciA9IGk7CisJCXBpbnNbaV0ubmFtZSA9IGRldm1fa2FzcHJpbnRmKGNoaXAtPmRldiwgR0ZQX0tFUk5FTCwKKwkJCQkJICAgICAgImdwaW8tJWQiLCBpKTsKKwkJaWYgKCFwaW5zW2ldLm5hbWUpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwY3RsZGVzYy0+bmFtZSA9IGRldl9uYW1lKGNoaXAtPmRldik7CisJcGN0bGRlc2MtPnBjdGxvcHMgPSAmY3lnbnVzX3BjdHJsX29wczsKKwlwY3RsZGVzYy0+cGlucyA9IHBpbnM7CisJcGN0bGRlc2MtPm5waW5zID0gZ2MtPm5ncGlvOworCXBjdGxkZXNjLT5jb25mb3BzID0gJmN5Z251c19wY29uZl9vcHM7CisKKwljaGlwLT5wY3RsID0gcGluY3RybF9yZWdpc3RlcihwY3RsZGVzYywgY2hpcC0+ZGV2LCBjaGlwKTsKKwlpZiAoIWNoaXAtPnBjdGwpIHsKKwkJZGV2X2VycihjaGlwLT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgcGluY3RybCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3lnbnVzX2dwaW9fdW5yZWdpc3Rlcl9waW5jb25mKHN0cnVjdCBjeWdudXNfZ3BpbyAqY2hpcCkKK3sKKwlpZiAoY2hpcC0+cGN0bCkKKwkJcGluY3RybF91bnJlZ2lzdGVyKGNoaXAtPnBjdGwpOworfQorCitzdHJ1Y3QgY3lnbnVzX2dwaW9fZGF0YSB7CisJdW5zaWduZWQgbnVtX2dwaW9zOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjeWdudXNfZ3Bpb19kYXRhIGN5Z251c19jbW1fZ3Bpb19kYXRhID0geworCS5udW1fZ3Bpb3MgPSAyNCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3lnbnVzX2dwaW9fZGF0YSBjeWdudXNfYXNpdV9ncGlvX2RhdGEgPSB7CisJLm51bV9ncGlvcyA9IDE0NiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3lnbnVzX2dwaW9fZGF0YSBjeWdudXNfY3JtdV9ncGlvX2RhdGEgPSB7CisJLm51bV9ncGlvcyA9IDYsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBjeWdudXNfZ3Bpb19vZl9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAiYnJjbSxjeWdudXMtY2NtLWdwaW8iLAorCQkuZGF0YSA9ICZjeWdudXNfY21tX2dwaW9fZGF0YSwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUgPSAiYnJjbSxjeWdudXMtYXNpdS1ncGlvIiwKKwkJLmRhdGEgPSAmY3lnbnVzX2FzaXVfZ3Bpb19kYXRhLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJicmNtLGN5Z251cy1jcm11LWdwaW8iLAorCQkuZGF0YSA9ICZjeWdudXNfY3JtdV9ncGlvX2RhdGEsCisJfQorfTsKKworc3RhdGljIGludCBjeWdudXNfZ3Bpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGN5Z251c19ncGlvICpjaGlwOworCXN0cnVjdCBncGlvX2NoaXAgKmdjOworCXUzMiBuZ3Bpb3M7CisJaW50IGlycSwgcmV0OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCWNvbnN0IHN0cnVjdCBjeWdudXNfZ3Bpb19kYXRhICpncGlvX2RhdGE7CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZShjeWdudXNfZ3Bpb19vZl9tYXRjaCwgZGV2KTsKKwlpZiAoIW1hdGNoKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlncGlvX2RhdGEgPSBtYXRjaC0+ZGF0YTsKKwluZ3Bpb3MgPSBncGlvX2RhdGEtPm51bV9ncGlvczsKKworCWNoaXAgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmNoaXApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoaXApCisJCXJldHVybiAtRU5PTUVNOworCisJY2hpcC0+ZGV2ID0gZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNoaXApOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwljaGlwLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGNoaXAtPmJhc2UpKSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIG1hcCBJL08gbWVtb3J5XG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2hpcC0+YmFzZSk7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlpZiAocmVzKSB7CisJCWNoaXAtPmlvX2N0cmwgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKGNoaXAtPmlvX2N0cmwpKSB7CisJCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBtYXAgSS9PIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gUFRSX0VSUihjaGlwLT5pb19jdHJsKTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pbml0KCZjaGlwLT5sb2NrKTsKKworCWdjID0gJmNoaXAtPmdjOworCWdjLT5iYXNlID0gLTE7CisJZ2MtPm5ncGlvID0gbmdwaW9zOworCWNoaXAtPm51bV9iYW5rcyA9IChuZ3Bpb3MgKyBOR1BJT1NfUEVSX0JBTksgLSAxKSAvIE5HUElPU19QRVJfQkFOSzsKKwlnYy0+bGFiZWwgPSBkZXZfbmFtZShkZXYpOworCWdjLT5kZXYgPSBkZXY7CisJZ2MtPm9mX25vZGUgPSBkZXYtPm9mX25vZGU7CisJZ2MtPnJlcXVlc3QgPSBjeWdudXNfZ3Bpb19yZXF1ZXN0OworCWdjLT5mcmVlID0gY3lnbnVzX2dwaW9fZnJlZTsKKwlnYy0+ZGlyZWN0aW9uX2lucHV0ID0gY3lnbnVzX2dwaW9fZGlyZWN0aW9uX2lucHV0OworCWdjLT5kaXJlY3Rpb25fb3V0cHV0ID0gY3lnbnVzX2dwaW9fZGlyZWN0aW9uX291dHB1dDsKKwlnYy0+c2V0ID0gY3lnbnVzX2dwaW9fc2V0OworCWdjLT5nZXQgPSBjeWdudXNfZ3Bpb19nZXQ7CisKKwlyZXQgPSBncGlvY2hpcF9hZGQoZ2MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIGFkZCBHUElPIGNoaXBcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGN5Z251c19ncGlvX3Bpbm11eF9hZGRfcmFuZ2UoY2hpcCk7CisJaWYgKHJldCAmJiByZXQgIT0gLUVOT0RFVikgeworCQlkZXZfZXJyKGRldiwgInVuYWJsZSB0byBhZGQgR1BJTyBwaW4gcmFuZ2VcbiIpOworCQlnb3RvIGVycl9ybV9ncGlvY2hpcDsKKwl9CisKKwlyZXQgPSBjeWdudXNfZ3Bpb19yZWdpc3Rlcl9waW5jb25mKGNoaXApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgcGluY29uZlxuIik7CisJCWdvdG8gZXJyX3JtX2dwaW9jaGlwOworCX0KKworCS8qIG9wdGlvbmFsIEdQSU8gaW50ZXJydXB0IHN1cHBvcnQgKi8KKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmIChpcnEpIHsKKwkJcmV0ID0gZ3Bpb2NoaXBfaXJxY2hpcF9hZGQoZ2MsICZjeWdudXNfZ3Bpb19pcnFfY2hpcCwgMCwKKwkJCQkJICAgaGFuZGxlX3NpbXBsZV9pcnEsIElSUV9UWVBFX05PTkUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKGRldiwgIm5vIEdQSU8gaXJxY2hpcFxuIik7CisJCQlnb3RvIGVycl91bnJlZ2lzdGVyX3BpbmNvbmY7CisJCX0KKworCQlncGlvY2hpcF9zZXRfY2hhaW5lZF9pcnFjaGlwKGdjLCAmY3lnbnVzX2dwaW9faXJxX2NoaXAsIGlycSwKKwkJCQkJICAgICBjeWdudXNfZ3Bpb19pcnFfaGFuZGxlcik7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl91bnJlZ2lzdGVyX3BpbmNvbmY6CisJY3lnbnVzX2dwaW9fdW5yZWdpc3Rlcl9waW5jb25mKGNoaXApOworCitlcnJfcm1fZ3Bpb2NoaXA6CisJZ3Bpb2NoaXBfcmVtb3ZlKGdjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGN5Z251c19ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJjeWdudXMtZ3BpbyIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGN5Z251c19ncGlvX29mX21hdGNoLAorCX0sCisJLnByb2JlID0gY3lnbnVzX2dwaW9fcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjeWdudXNfZ3Bpb19pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9wcm9iZSgmY3lnbnVzX2dwaW9fZHJpdmVyLCBjeWdudXNfZ3Bpb19wcm9iZSk7Cit9CithcmNoX2luaXRjYWxsX3N5bmMoY3lnbnVzX2dwaW9faW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvYmNtL3BpbmN0cmwtY3lnbnVzLW11eC5jIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLWN5Z251cy1tdXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWE5MjgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2JjbS9waW5jdHJsLWN5Z251cy1tdXguYwpAQCAtMCwwICsxLDEwMjIgQEAKKy8qIENvcHlyaWdodCAoQykgMjAxNC0yMDE1IEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgImFzIGlzIiBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBDeWdudXMgSU9NVVggZHJpdmVyIHRoYXQgc3VwcG9ydHMgZ3JvdXAgYmFzZWQgUElOTVVYCisgKiBjb25maWd1cmF0aW9uLiBBbHRob3VnaCBQSU5NVVggY29uZmlndXJhdGlvbiBpcyBtYWlubHkgZ3JvdXAgYmFzZWQsIHRoZQorICogQ3lnbnVzIElPTVVYIGNvbnRyb2xsZXIgYWxsb3dzIGNlcnRhaW4gcGlucyB0byBiZSBpbmRpdmlkdWFsbHkgbXV4ZWQgdG8gR1BJTworICogZnVuY3Rpb24sIGFuZCB0aGVyZWZvcmUgYmUgY29udHJvbGxlZCBieSB0aGUgQ3lnbnVzIEFTSVUgR1BJTyBjb250cm9sbGVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5tdXguaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYtZ2VuZXJpYy5oPgorI2luY2x1ZGUgIi4uL2NvcmUuaCIKKyNpbmNsdWRlICIuLi9waW5jdHJsLXV0aWxzLmgiCisKKyNkZWZpbmUgQ1lHTlVTX05VTV9JT01VWF9SRUdTICAgICA4CisjZGVmaW5lIENZR05VU19OVU1fTVVYX1BFUl9SRUcgICAgOAorI2RlZmluZSBDWUdOVVNfTlVNX0lPTVVYICAgICAgICAgIChDWUdOVVNfTlVNX0lPTVVYX1JFR1MgKiBcCisJCQkJICAgQ1lHTlVTX05VTV9NVVhfUEVSX1JFRykKKworLyoKKyAqIEN5Z251cyBJT01VWCByZWdpc3RlciBkZXNjcmlwdGlvbgorICoKKyAqIEBvZmZzZXQ6IHJlZ2lzdGVyIG9mZnNldCBmb3IgbXV4IGNvbmZpZ3VyYXRpb24gb2YgYSBncm91cAorICogQHNoaWZ0OiBiaXQgc2hpZnQgZm9yIG11eCBjb25maWd1cmF0aW9uIG9mIGEgZ3JvdXAKKyAqIEBhbHQ6IGFsdGVybmF0ZSBmdW5jdGlvbiB0byBzZXQgdG8KKyAqLworc3RydWN0IGN5Z251c19tdXggeworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IHNoaWZ0OworCXVuc2lnbmVkIGludCBhbHQ7Cit9OworCisvKgorICogS2VlcCB0cmFjayBvZiBDeWdudXMgSU9NVVggY29uZmlndXJhdGlvbiBhbmQgcHJldmVudCBkb3VibGUgY29uZmlndXJhdGlvbgorICoKKyAqIEBjeWdudXNfbXV4OiBDeWdudXMgSU9NVVggcmVnaXN0ZXIgZGVzY3JpcHRpb24KKyAqIEBpc19jb25maWd1cmVkOiBmbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgYSBtdXggc2V0dGluZyBoYXMgYWxyZWFkeSBiZWVuCisgKiBjb25maWd1cmVkCisgKi8KK3N0cnVjdCBjeWdudXNfbXV4X2xvZyB7CisJc3RydWN0IGN5Z251c19tdXggbXV4OworCWJvb2wgaXNfY29uZmlndXJlZDsKK307CisKKy8qCisgKiBHcm91cCBiYXNlZCBJT01VWCBjb25maWd1cmF0aW9uCisgKgorICogQG5hbWU6IG5hbWUgb2YgdGhlIGdyb3VwCisgKiBAcGluczogYXJyYXkgb2YgcGlucyB1c2VkIGJ5IHRoaXMgZ3JvdXAKKyAqIEBudW1fcGluczogdG90YWwgbnVtYmVyIG9mIHBpbnMgdXNlZCBieSB0aGlzIGdyb3VwCisgKiBAbXV4OiBDeWdudXMgZ3JvdXAgYmFzZWQgSU9NVVggY29uZmlndXJhdGlvbgorICovCitzdHJ1Y3QgY3lnbnVzX3Bpbl9ncm91cCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCB1bnNpZ25lZCAqcGluczsKKwl1bnNpZ25lZCBudW1fcGluczsKKwlzdHJ1Y3QgY3lnbnVzX211eCBtdXg7Cit9OworCisvKgorICogQ3lnbnVzIG11eCBmdW5jdGlvbiBhbmQgc3VwcG9ydGVkIHBpbiBncm91cHMKKyAqCisgKiBAbmFtZTogbmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAqIEBncm91cHM6IGFycmF5IG9mIGdyb3VwcyB0aGF0IGNhbiBiZSBzdXBwb3J0ZWQgYnkgdGhpcyBmdW5jdGlvbgorICogQG51bV9ncm91cHM6IHRvdGFsIG51bWJlciBvZiBncm91cHMgdGhhdCBjYW4gYmUgc3VwcG9ydGVkIGJ5IHRoaXMgZnVuY3Rpb24KKyAqLworc3RydWN0IGN5Z251c19waW5fZnVuY3Rpb24geworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqIGNvbnN0ICpncm91cHM7CisJdW5zaWduZWQgbnVtX2dyb3VwczsKK307CisKKy8qCisgKiBDeWdudXMgSU9NVVggcGluY3RybCBjb3JlCisgKgorICogQHBjdGw6IHBvaW50ZXIgdG8gcGluY3RybF9kZXYKKyAqIEBkZXY6IHBvaW50ZXIgdG8gZGV2aWNlCisgKiBAYmFzZTA6IGZpcnN0IEkvTyByZWdpc3RlciBiYXNlIG9mIHRoZSBDeWdudXMgSU9NVVggY29udHJvbGxlcgorICogQGJhc2UxOiBzZWNvbmQgSS9PIHJlZ2lzdGVyIGJhc2UKKyAqIEBncm91cHM6IHBvaW50ZXIgdG8gYXJyYXkgb2YgZ3JvdXBzCisgKiBAbnVtX2dyb3VwczogdG90YWwgbnVtYmVyIG9mIGdyb3VwcworICogQGZ1bmN0aW9uczogcG9pbnRlciB0byBhcnJheSBvZiBmdW5jdGlvbnMKKyAqIEBudW1fZnVuY3Rpb25zOiB0b3RhbCBudW1iZXIgb2YgZnVuY3Rpb25zCisgKiBAbXV4X2xvZzogcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgbXV4IGxvZ3MKKyAqIEBsb2NrOiBsb2NrIHRvIHByb3RlY3QgcmVnaXN0ZXIgYWNjZXNzCisgKi8KK3N0cnVjdCBjeWdudXNfcGluY3RybCB7CisJc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwl2b2lkIF9faW9tZW0gKmJhc2UwOworCXZvaWQgX19pb21lbSAqYmFzZTE7CisKKwljb25zdCBzdHJ1Y3QgY3lnbnVzX3Bpbl9ncm91cCAqZ3JvdXBzOworCXVuc2lnbmVkIG51bV9ncm91cHM7CisKKwljb25zdCBzdHJ1Y3QgY3lnbnVzX3Bpbl9mdW5jdGlvbiAqZnVuY3Rpb25zOworCXVuc2lnbmVkIG51bV9mdW5jdGlvbnM7CisKKwlzdHJ1Y3QgY3lnbnVzX211eF9sb2cgKm11eF9sb2c7CisKKwlzcGlubG9ja190IGxvY2s7Cit9OworCisvKgorICogQ2VydGFpbiBwaW5zIGNhbiBiZSBpbmRpdmlkdWFsbHkgbXV4ZWQgdG8gR1BJTyBmdW5jdGlvbgorICoKKyAqIEBpc19zdXBwb3J0ZWQ6IGZsYWcgdG8gaW5kaWNhdGUgR1BJTyBtdXggaXMgc3VwcG9ydGVkIGZvciB0aGlzIHBpbgorICogQG9mZnNldDogcmVnaXN0ZXIgb2Zmc2V0IGZvciBHUElPIG11eCBvdmVycmlkZSBvZiBhIHBpbgorICogQHNoaWZ0OiBiaXQgc2hpZnQgZm9yIEdQSU8gbXV4IG92ZXJyaWRlIG9mIGEgcGluCisgKi8KK3N0cnVjdCBjeWdudXNfZ3Bpb19tdXggeworCWludCBpc19zdXBwb3J0ZWQ7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgc2hpZnQ7Cit9OworCisvKgorICogRGVzY3JpcHRpb24gb2YgYSBwaW4gaW4gQ3lnbnVzCisgKgorICogQHBpbjogcGluIG51bWJlcgorICogQG5hbWU6IHBpbiBuYW1lCisgKiBAZ3Bpb19tdXg6IEdQSU8gb3ZlcnJpZGUgcmVsYXRlZCBpbmZvcm1hdGlvbgorICovCitzdHJ1Y3QgY3lnbnVzX3BpbiB7CisJdW5zaWduZWQgcGluOworCWNoYXIgKm5hbWU7CisJc3RydWN0IGN5Z251c19ncGlvX211eCBncGlvX211eDsKK307CisKKyNkZWZpbmUgQ1lHTlVTX1BJTl9ERVNDKHAsIG4sIGksIG8sIHMpCVwKK3sJCQkJCVwKKwkucGluID0gcCwJCQlcCisJLm5hbWUgPSBuLAkJCVwKKwkuZ3Bpb19tdXggPSB7CQkJXAorCQkuaXNfc3VwcG9ydGVkID0gaSwJXAorCQkub2Zmc2V0ID0gbywJCVwKKwkJLnNoaWZ0ID0gcywJCVwKKwl9LAkJCQlcCit9CisKKy8qCisgKiBMaXN0IG9mIHBpbnMgaW4gQ3lnbnVzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3lnbnVzX3BpbiBjeWdudXNfcGluc1tdID0geworCUNZR05VU19QSU5fREVTQygwLCAiZXh0X2RldmljZV9yZXNldF9uIiwgMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDEsICJjaGlwX21vZGUwIiwgMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDIsICJjaGlwX21vZGUxIiwgMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDMsICJjaGlwX21vZGUyIiwgMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDQsICJjaGlwX21vZGUzIiwgMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDUsICJjaGlwX21vZGU0IiwgMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDYsICJic2MwX3NjbCIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQyg3LCAiYnNjMF9zZGEiLCAwLCAwLCAwKSwKKwlDWUdOVVNfUElOX0RFU0MoOCwgImJzYzFfc2NsIiwgMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDksICJic2MxX3NkYSIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygxMCwgImQxd19kcSIsIDEsIDB4MjgsIDApLAorCUNZR05VU19QSU5fREVTQygxMSwgImQxd293c3R6X2wiLCAxLCAweDQsIDI4KSwKKwlDWUdOVVNfUElOX0RFU0MoMTIsICJncGlvMCIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygxMywgImdwaW8xIiwgMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDE0LCAiZ3BpbzIiLCAwLCAwLCAwKSwKKwlDWUdOVVNfUElOX0RFU0MoMTUsICJncGlvMyIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygxNiwgImdwaW80IiwgMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDE3LCAiZ3BpbzUiLCAwLCAwLCAwKSwKKwlDWUdOVVNfUElOX0RFU0MoMTgsICJncGlvNiIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygxOSwgImdwaW83IiwgMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDIwLCAiZ3BpbzgiLCAwLCAwLCAwKSwKKwlDWUdOVVNfUElOX0RFU0MoMjEsICJncGlvOSIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygyMiwgImdwaW8xMCIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygyMywgImdwaW8xMSIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygyNCwgImdwaW8xMiIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygyNSwgImdwaW8xMyIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygyNiwgImdwaW8xNCIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygyNywgImdwaW8xNSIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygyOCwgImdwaW8xNiIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygyOSwgImdwaW8xNyIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygzMCwgImdwaW8xOCIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygzMSwgImdwaW8xOSIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygzMiwgImdwaW8yMCIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygzMywgImdwaW8yMSIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygzNCwgImdwaW8yMiIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygzNSwgImdwaW8yMyIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygzNiwgIm1kYyIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygzNywgIm1kaW8iLCAwLCAwLCAwKSwKKwlDWUdOVVNfUElOX0RFU0MoMzgsICJwd20wIiwgMSwgMHgxMCwgMzApLAorCUNZR05VU19QSU5fREVTQygzOSwgInB3bTEiLCAxLCAweDEwLCAyOCksCisJQ1lHTlVTX1BJTl9ERVNDKDQwLCAicHdtMiIsIDEsIDB4MTAsIDI2KSwKKwlDWUdOVVNfUElOX0RFU0MoNDEsICJwd20zIiwgMSwgMHgxMCwgMjQpLAorCUNZR05VU19QSU5fREVTQyg0MiwgInNjMF9jbGsiLCAxLCAweDEwLCAyMiksCisJQ1lHTlVTX1BJTl9ERVNDKDQzLCAic2MwX2NtZHZjY19sIiwgMSwgMHgxMCwgMjApLAorCUNZR05VU19QSU5fREVTQyg0NCwgInNjMF9kZXRlY3QiLCAxLCAweDEwLCAxOCksCisJQ1lHTlVTX1BJTl9ERVNDKDQ1LCAic2MwX2ZjYiIsIDEsIDB4MTAsIDE2KSwKKwlDWUdOVVNfUElOX0RFU0MoNDYsICJzYzBfaW8iLCAxLCAweDEwLCAxNCksCisJQ1lHTlVTX1BJTl9ERVNDKDQ3LCAic2MwX3JzdF9sIiwgMSwgMHgxMCwgMTIpLAorCUNZR05VU19QSU5fREVTQyg0OCwgInNjMV9jbGsiLCAxLCAweDEwLCAxMCksCisJQ1lHTlVTX1BJTl9ERVNDKDQ5LCAic2MxX2NtZHZjY19sIiwgMSwgMHgxMCwgOCksCisJQ1lHTlVTX1BJTl9ERVNDKDUwLCAic2MxX2RldGVjdCIsIDEsIDB4MTAsIDYpLAorCUNZR05VU19QSU5fREVTQyg1MSwgInNjMV9mY2IiLCAxLCAweDEwLCA0KSwKKwlDWUdOVVNfUElOX0RFU0MoNTIsICJzYzFfaW8iLCAxLCAweDEwLCAyKSwKKwlDWUdOVVNfUElOX0RFU0MoNTMsICJzYzFfcnN0X2wiLCAxLCAweDEwLCAwKSwKKwlDWUdOVVNfUElOX0RFU0MoNTQsICJzcGkwX2NsayIsIDEsIDB4MTgsIDEwKSwKKwlDWUdOVVNfUElOX0RFU0MoNTUsICJzcGkwX21vc2kiLCAxLCAweDE4LCA2KSwKKwlDWUdOVVNfUElOX0RFU0MoNTYsICJzcGkwX21pc28iLCAxLCAweDE4LCA4KSwKKwlDWUdOVVNfUElOX0RFU0MoNTcsICJzcGkwX3NzIiwgMSwgMHgxOCwgNCksCisJQ1lHTlVTX1BJTl9ERVNDKDU4LCAic3BpMV9jbGsiLCAxLCAweDE4LCAyKSwKKwlDWUdOVVNfUElOX0RFU0MoNTksICJzcGkxX21vc2kiLCAxLCAweDFjLCAzMCksCisJQ1lHTlVTX1BJTl9ERVNDKDYwLCAic3BpMV9taXNvIiwgMSwgMHgxOCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDYxLCAic3BpMV9zcyIsIDEsIDB4MWMsIDI4KSwKKwlDWUdOVVNfUElOX0RFU0MoNjIsICJzcGkyX2NsayIsIDEsIDB4MWMsIDI2KSwKKwlDWUdOVVNfUElOX0RFU0MoNjMsICJzcGkyX21vc2kiLCAxLCAweDFjLCAyMiksCisJQ1lHTlVTX1BJTl9ERVNDKDY0LCAic3BpMl9taXNvIiwgMSwgMHgxYywgMjQpLAorCUNZR05VU19QSU5fREVTQyg2NSwgInNwaTJfc3MiLCAxLCAweDFjLCAyMCksCisJQ1lHTlVTX1BJTl9ERVNDKDY2LCAic3BpM19jbGsiLCAxLCAweDFjLCAxOCksCisJQ1lHTlVTX1BJTl9ERVNDKDY3LCAic3BpM19tb3NpIiwgMSwgMHgxYywgMTQpLAorCUNZR05VU19QSU5fREVTQyg2OCwgInNwaTNfbWlzbyIsIDEsIDB4MWMsIDE2KSwKKwlDWUdOVVNfUElOX0RFU0MoNjksICJzcGkzX3NzIiwgMSwgMHgxYywgMTIpLAorCUNZR05VU19QSU5fREVTQyg3MCwgInVhcnQwX2N0cyIsIDEsIDB4MWMsIDEwKSwKKwlDWUdOVVNfUElOX0RFU0MoNzEsICJ1YXJ0MF9ydHMiLCAxLCAweDFjLCA4KSwKKwlDWUdOVVNfUElOX0RFU0MoNzIsICJ1YXJ0MF9yeCIsIDEsIDB4MWMsIDYpLAorCUNZR05VU19QSU5fREVTQyg3MywgInVhcnQwX3R4IiwgMSwgMHgxYywgNCksCisJQ1lHTlVTX1BJTl9ERVNDKDc0LCAidWFydDFfY3RzIiwgMSwgMHgxYywgMiksCisJQ1lHTlVTX1BJTl9ERVNDKDc1LCAidWFydDFfZGNkIiwgMSwgMHgxYywgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDc2LCAidWFydDFfZHNyIiwgMSwgMHgyMCwgMTQpLAorCUNZR05VU19QSU5fREVTQyg3NywgInVhcnQxX2R0ciIsIDEsIDB4MjAsIDEyKSwKKwlDWUdOVVNfUElOX0RFU0MoNzgsICJ1YXJ0MV9yaSIsIDEsIDB4MjAsIDEwKSwKKwlDWUdOVVNfUElOX0RFU0MoNzksICJ1YXJ0MV9ydHMiLCAxLCAweDIwLCA4KSwKKwlDWUdOVVNfUElOX0RFU0MoODAsICJ1YXJ0MV9yeCIsIDEsIDB4MjAsIDYpLAorCUNZR05VU19QSU5fREVTQyg4MSwgInVhcnQxX3R4IiwgMSwgMHgyMCwgNCksCisJQ1lHTlVTX1BJTl9ERVNDKDgyLCAidWFydDNfcngiLCAxLCAweDIwLCAyKSwKKwlDWUdOVVNfUElOX0RFU0MoODMsICJ1YXJ0M190eCIsIDEsIDB4MjAsIDApLAorCUNZR05VU19QSU5fREVTQyg4NCwgInNkaW8xX2Nsa19zZGNhcmQiLCAxLCAweDE0LCA2KSwKKwlDWUdOVVNfUElOX0RFU0MoODUsICJzZGlvMV9jbWQiLCAxLCAweDE0LCA0KSwKKwlDWUdOVVNfUElOX0RFU0MoODYsICJzZGlvMV9kYXRhMCIsIDEsIDB4MTQsIDIpLAorCUNZR05VU19QSU5fREVTQyg4NywgInNkaW8xX2RhdGExIiwgMSwgMHgxNCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDg4LCAic2RpbzFfZGF0YTIiLCAxLCAweDE4LCAzMCksCisJQ1lHTlVTX1BJTl9ERVNDKDg5LCAic2RpbzFfZGF0YTMiLCAxLCAweDE4LCAyOCksCisJQ1lHTlVTX1BJTl9ERVNDKDkwLCAic2RpbzFfd3BfbiIsIDEsIDB4MTgsIDI0KSwKKwlDWUdOVVNfUElOX0RFU0MoOTEsICJzZGlvMV9jYXJkX3JzdCIsIDEsIDB4MTQsIDEwKSwKKwlDWUdOVVNfUElOX0RFU0MoOTIsICJzZGlvMV9sZWRfb24iLCAxLCAweDE4LCAyNiksCisJQ1lHTlVTX1BJTl9ERVNDKDkzLCAic2RpbzFfY2QiLCAxLCAweDE0LCA4KSwKKwlDWUdOVVNfUElOX0RFU0MoOTQsICJzZGlvMF9jbGtfc2RjYXJkIiwgMSwgMHgxNCwgMjYpLAorCUNZR05VU19QSU5fREVTQyg5NSwgInNkaW8wX2NtZCIsIDEsIDB4MTQsIDI0KSwKKwlDWUdOVVNfUElOX0RFU0MoOTYsICJzZGlvMF9kYXRhMCIsIDEsIDB4MTQsIDIyKSwKKwlDWUdOVVNfUElOX0RFU0MoOTcsICJzZGlvMF9kYXRhMSIsIDEsIDB4MTQsIDIwKSwKKwlDWUdOVVNfUElOX0RFU0MoOTgsICJzZGlvMF9kYXRhMiIsIDEsIDB4MTQsIDE4KSwKKwlDWUdOVVNfUElOX0RFU0MoOTksICJzZGlvMF9kYXRhMyIsIDEsIDB4MTQsIDE2KSwKKwlDWUdOVVNfUElOX0RFU0MoMTAwLCAic2RpbzBfd3BfbiIsIDEsIDB4MTQsIDEyKSwKKwlDWUdOVVNfUElOX0RFU0MoMTAxLCAic2RpbzBfY2FyZF9yc3QiLCAxLCAweDE0LCAzMCksCisJQ1lHTlVTX1BJTl9ERVNDKDEwMiwgInNkaW8wX2xlZF9vbiIsIDEsIDB4MTQsIDE0KSwKKwlDWUdOVVNfUElOX0RFU0MoMTAzLCAic2RpbzBfY2QiLCAxLCAweDE0LCAyOCksCisJQ1lHTlVTX1BJTl9ERVNDKDEwNCwgInNmbGFzaF9jbGsiLCAxLCAweDE4LCAyMiksCisJQ1lHTlVTX1BJTl9ERVNDKDEwNSwgInNmbGFzaF9jc19sIiwgMSwgMHgxOCwgMjApLAorCUNZR05VU19QSU5fREVTQygxMDYsICJzZmxhc2hfbW9zaSIsIDEsIDB4MTgsIDE0KSwKKwlDWUdOVVNfUElOX0RFU0MoMTA3LCAic2ZsYXNoX21pc28iLCAxLCAweDE4LCAxNiksCisJQ1lHTlVTX1BJTl9ERVNDKDEwOCwgInNmbGFzaF93cF9uIiwgMSwgMHgxOCwgMTIpLAorCUNZR05VU19QSU5fREVTQygxMDksICJzZmxhc2hfaG9sZF9uIiwgMSwgMHgxOCwgMTgpLAorCUNZR05VU19QSU5fREVTQygxMTAsICJuYW5kX2FsZSIsIDEsIDB4YywgMzApLAorCUNZR05VU19QSU5fREVTQygxMTEsICJuYW5kX2NlMF9sIiwgMSwgMHhjLCAyOCksCisJQ1lHTlVTX1BJTl9ERVNDKDExMiwgIm5hbmRfY2UxX2wiLCAxLCAweGMsIDI2KSwKKwlDWUdOVVNfUElOX0RFU0MoMTEzLCAibmFuZF9jbGUiLCAxLCAweGMsIDI0KSwKKwlDWUdOVVNfUElOX0RFU0MoMTE0LCAibmFuZF9kcTAiLCAxLCAweGMsIDIyKSwKKwlDWUdOVVNfUElOX0RFU0MoMTE1LCAibmFuZF9kcTEiLCAxLCAweGMsIDIwKSwKKwlDWUdOVVNfUElOX0RFU0MoMTE2LCAibmFuZF9kcTIiLCAxLCAweGMsIDE4KSwKKwlDWUdOVVNfUElOX0RFU0MoMTE3LCAibmFuZF9kcTMiLCAxLCAweGMsIDE2KSwKKwlDWUdOVVNfUElOX0RFU0MoMTE4LCAibmFuZF9kcTQiLCAxLCAweGMsIDE0KSwKKwlDWUdOVVNfUElOX0RFU0MoMTE5LCAibmFuZF9kcTUiLCAxLCAweGMsIDEyKSwKKwlDWUdOVVNfUElOX0RFU0MoMTIwLCAibmFuZF9kcTYiLCAxLCAweGMsIDEwKSwKKwlDWUdOVVNfUElOX0RFU0MoMTIxLCAibmFuZF9kcTciLCAxLCAweGMsIDgpLAorCUNZR05VU19QSU5fREVTQygxMjIsICJuYW5kX3JiX2wiLCAxLCAweGMsIDYpLAorCUNZR05VU19QSU5fREVTQygxMjMsICJuYW5kX3JlX2wiLCAxLCAweGMsIDQpLAorCUNZR05VU19QSU5fREVTQygxMjQsICJuYW5kX3dlX2wiLCAxLCAweGMsIDIpLAorCUNZR05VU19QSU5fREVTQygxMjUsICJuYW5kX3dwX2wiLCAxLCAweGMsIDApLAorCUNZR05VU19QSU5fREVTQygxMjYsICJsY2RfY2xhYyIsIDEsIDB4NCwgMjYpLAorCUNZR05VU19QSU5fREVTQygxMjcsICJsY2RfY2xjcCIsIDEsIDB4NCwgMjQpLAorCUNZR05VU19QSU5fREVTQygxMjgsICJsY2RfY2xkMCIsIDEsIDB4NCwgMjIpLAorCUNZR05VU19QSU5fREVTQygxMjksICJsY2RfY2xkMSIsIDEsIDB4NCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDEzMCwgImxjZF9jbGQxMCIsIDEsIDB4NCwgMjApLAorCUNZR05VU19QSU5fREVTQygxMzEsICJsY2RfY2xkMTEiLCAxLCAweDQsIDE4KSwKKwlDWUdOVVNfUElOX0RFU0MoMTMyLCAibGNkX2NsZDEyIiwgMSwgMHg0LCAxNiksCisJQ1lHTlVTX1BJTl9ERVNDKDEzMywgImxjZF9jbGQxMyIsIDEsIDB4NCwgMTQpLAorCUNZR05VU19QSU5fREVTQygxMzQsICJsY2RfY2xkMTQiLCAxLCAweDQsIDEyKSwKKwlDWUdOVVNfUElOX0RFU0MoMTM1LCAibGNkX2NsZDE1IiwgMSwgMHg0LCAxMCksCisJQ1lHTlVTX1BJTl9ERVNDKDEzNiwgImxjZF9jbGQxNiIsIDEsIDB4NCwgOCksCisJQ1lHTlVTX1BJTl9ERVNDKDEzNywgImxjZF9jbGQxNyIsIDEsIDB4NCwgNiksCisJQ1lHTlVTX1BJTl9ERVNDKDEzOCwgImxjZF9jbGQxOCIsIDEsIDB4NCwgNCksCisJQ1lHTlVTX1BJTl9ERVNDKDEzOSwgImxjZF9jbGQxOSIsIDEsIDB4NCwgMiksCisJQ1lHTlVTX1BJTl9ERVNDKDE0MCwgImxjZF9jbGQyIiwgMSwgMHg4LCAyMiksCisJQ1lHTlVTX1BJTl9ERVNDKDE0MSwgImxjZF9jbGQyMCIsIDEsIDB4OCwgMzApLAorCUNZR05VU19QSU5fREVTQygxNDIsICJsY2RfY2xkMjEiLCAxLCAweDgsIDI4KSwKKwlDWUdOVVNfUElOX0RFU0MoMTQzLCAibGNkX2NsZDIyIiwgMSwgMHg4LCAyNiksCisJQ1lHTlVTX1BJTl9ERVNDKDE0NCwgImxjZF9jbGQyMyIsIDEsIDB4OCwgMjQpLAorCUNZR05VU19QSU5fREVTQygxNDUsICJsY2RfY2xkMyIsIDEsIDB4OCwgMjApLAorCUNZR05VU19QSU5fREVTQygxNDYsICJsY2RfY2xkNCIsIDEsIDB4OCwgMTgpLAorCUNZR05VU19QSU5fREVTQygxNDcsICJsY2RfY2xkNSIsIDEsIDB4OCwgMTYpLAorCUNZR05VU19QSU5fREVTQygxNDgsICJsY2RfY2xkNiIsIDEsIDB4OCwgMTQpLAorCUNZR05VU19QSU5fREVTQygxNDksICJsY2RfY2xkNyIsIDEsIDB4OCwgMTIpLAorCUNZR05VU19QSU5fREVTQygxNTAsICJsY2RfY2xkOCIsIDEsIDB4OCwgMTApLAorCUNZR05VU19QSU5fREVTQygxNTEsICJsY2RfY2xkOSIsIDEsIDB4OCwgOCksCisJQ1lHTlVTX1BJTl9ERVNDKDE1MiwgImxjZF9jbGZwIiwgMSwgMHg4LCA2KSwKKwlDWUdOVVNfUElOX0RFU0MoMTUzLCAibGNkX2NsbGUiLCAxLCAweDgsIDQpLAorCUNZR05VU19QSU5fREVTQygxNTQsICJsY2RfY2xscCIsIDEsIDB4OCwgMiksCisJQ1lHTlVTX1BJTl9ERVNDKDE1NSwgImxjZF9jbHBvd2VyIiwgMSwgMHg4LCAwKSwKKwlDWUdOVVNfUElOX0RFU0MoMTU2LCAiY2FtZXJhX3ZzeW5jIiwgMSwgMHg0LCAzMCksCisJQ1lHTlVTX1BJTl9ERVNDKDE1NywgImNhbWVyYV90cmlnZ2VyIiwgMSwgMHgwLCAwKSwKKwlDWUdOVVNfUElOX0RFU0MoMTU4LCAiY2FtZXJhX3N0cm9iZSIsIDEsIDB4MCwgMiksCisJQ1lHTlVTX1BJTl9ERVNDKDE1OSwgImNhbWVyYV9zdGFuZGJ5IiwgMSwgMHgwLCA0KSwKKwlDWUdOVVNfUElOX0RFU0MoMTYwLCAiY2FtZXJhX3Jlc2V0X24iLCAxLCAweDAsIDYpLAorCUNZR05VU19QSU5fREVTQygxNjEsICJjYW1lcmFfcGl4ZGF0YTkiLCAxLCAweDAsIDgpLAorCUNZR05VU19QSU5fREVTQygxNjIsICJjYW1lcmFfcGl4ZGF0YTgiLCAxLCAweDAsIDEwKSwKKwlDWUdOVVNfUElOX0RFU0MoMTYzLCAiY2FtZXJhX3BpeGRhdGE3IiwgMSwgMHgwLCAxMiksCisJQ1lHTlVTX1BJTl9ERVNDKDE2NCwgImNhbWVyYV9waXhkYXRhNiIsIDEsIDB4MCwgMTQpLAorCUNZR05VU19QSU5fREVTQygxNjUsICJjYW1lcmFfcGl4ZGF0YTUiLCAxLCAweDAsIDE2KSwKKwlDWUdOVVNfUElOX0RFU0MoMTY2LCAiY2FtZXJhX3BpeGRhdGE0IiwgMSwgMHgwLCAxOCksCisJQ1lHTlVTX1BJTl9ERVNDKDE2NywgImNhbWVyYV9waXhkYXRhMyIsIDEsIDB4MCwgMjApLAorCUNZR05VU19QSU5fREVTQygxNjgsICJjYW1lcmFfcGl4ZGF0YTIiLCAxLCAweDAsIDIyKSwKKwlDWUdOVVNfUElOX0RFU0MoMTY5LCAiY2FtZXJhX3BpeGRhdGExIiwgMSwgMHgwLCAyNCksCisJQ1lHTlVTX1BJTl9ERVNDKDE3MCwgImNhbWVyYV9waXhkYXRhMCIsIDEsIDB4MCwgMjYpLAorCUNZR05VU19QSU5fREVTQygxNzEsICJjYW1lcmFfcGl4Y2xrIiwgMSwgMHgwLCAyOCksCisJQ1lHTlVTX1BJTl9ERVNDKDE3MiwgImNhbWVyYV9oc3luYyIsIDEsIDB4MCwgMzApLAorCUNZR05VU19QSU5fREVTQygxNzMsICJjYW1lcmFfcGxsX3JlZl9jbGsiLCAwLCAwLCAwKSwKKwlDWUdOVVNfUElOX0RFU0MoMTc0LCAidXNiX2lkX2luZGljYXRpb24iLCAwLCAwLCAwKSwKKwlDWUdOVVNfUElOX0RFU0MoMTc1LCAidXNiX3ZidXNfaW5kaWNhdGlvbiIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygxNzYsICJncGlvMF8zcDMiLCAwLCAwLCAwKSwKKwlDWUdOVVNfUElOX0RFU0MoMTc3LCAiZ3BpbzFfM3AzIiwgMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9ERVNDKDE3OCwgImdwaW8yXzNwMyIsIDAsIDAsIDApLAorCUNZR05VU19QSU5fREVTQygxNzksICJncGlvM18zcDMiLCAwLCAwLCAwKSwKK307CisKKy8qCisgKiBMaXN0IG9mIGdyb3VwcyBvZiBwaW5zCisgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBic2MxX3BpbnNbXSA9IHsgOCwgOSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHBjaWVfY2xrcmVxX3BpbnNbXSA9IHsgOCwgOSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaTJzMl8wX3BpbnNbXSA9IHsgMTIgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpMnMyXzFfcGluc1tdID0geyAxMyB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGkyczJfMl9waW5zW10gPSB7IDE0IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaTJzMl8zX3BpbnNbXSA9IHsgMTUgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpMnMyXzRfcGluc1tdID0geyAxNiB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcHdtNF9waW5zW10gPSB7IDE3IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgcHdtNV9waW5zW10gPSB7IDE4IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXkwX3BpbnNbXSA9IHsgMjAgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXkxX3BpbnNbXSA9IHsgMjEgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXkyX3BpbnNbXSA9IHsgMjIgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXkzX3BpbnNbXSA9IHsgMjMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXk0X3BpbnNbXSA9IHsgMjQgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXk1X3BpbnNbXSA9IHsgMjUgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtleTZfcGluc1tdID0geyAyNiB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGF1ZGlvX2R0ZTBfcGluc1tdID0geyAyNiB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQga2V5N19waW5zW10gPSB7IDI3IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgYXVkaW9fZHRlMV9waW5zW10gPSB7IDI3IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXk4X3BpbnNbXSA9IHsgMjggfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXk5X3BpbnNbXSA9IHsgMjkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXkxMF9waW5zW10gPSB7IDMwIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQga2V5MTFfcGluc1tdID0geyAzMSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGtleTEyX3BpbnNbXSA9IHsgMzIgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXkxM19waW5zW10gPSB7IDMzIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXkxNF9waW5zW10gPSB7IDM0IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgYXVkaW9fZHRlMl9waW5zW10gPSB7IDM0IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBrZXkxNV9waW5zW10gPSB7IDM1IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgYXVkaW9fZHRlM19waW5zW10gPSB7IDM1IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwd20wX3BpbnNbXSA9IHsgMzggfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwd20xX3BpbnNbXSA9IHsgMzkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwd20yX3BpbnNbXSA9IHsgNDAgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwd20zX3BpbnNbXSA9IHsgNDEgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNkaW8wX3BpbnNbXSA9IHsgOTQsIDk1LCA5NiwgOTcsIDk4LCA5OSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc21hcnRfY2FyZDBfcGluc1tdID0geyA0MiwgNDMsIDQ0LCA0NiwgNDcgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpMnMwXzBfcGluc1tdID0geyA0MiwgNDMsIDQ0LCA0NiB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwZGlmX3BpbnNbXSA9IHsgNDcgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNtYXJ0X2NhcmQxX3BpbnNbXSA9IHsgNDgsIDQ5LCA1MCwgNTIsIDUzIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaTJzMV8wX3BpbnNbXSA9IHsgNDgsIDQ5LCA1MCwgNTIgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwaTBfcGluc1tdID0geyA1NCwgNTUsIDU2LCA1NyB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3BpMV9waW5zW10gPSB7IDU4LCA1OSwgNjAsIDYxIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcGkyX3BpbnNbXSA9IHsgNjIsIDYzLCA2NCwgNjUgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwaTNfcGluc1tdID0geyA2NiwgNjcsIDY4LCA2OSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHN3X2xlZDBfMF9waW5zW10gPSB7IDY2LCA2NywgNjgsIDY5IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkMXdfcGluc1tdID0geyAxMCwgMTEgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0NF9waW5zW10gPSB7IDEwLCAxMSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHN3X2xlZDJfMF9waW5zW10gPSB7IDEwLCAxMSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbGNkX3BpbnNbXSA9IHsgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsCisJMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLCAxNDQsIDE0NSwgMTQ2LCAxNDcsCisJMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcmFtXzBfcGluc1tdID0geyAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywKKwkxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsIDE0NCwgMTQ1LCAxNDYsIDE0NywKKwkxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwaTVfcGluc1tdID0geyAxNDEsIDE0MiwgMTQzLCAxNDQgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVhcnQwX3BpbnNbXSA9IHsgNzAsIDcxLCA3MiwgNzMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzd19sZWQwXzFfcGluc1tdID0geyA3MCwgNzEsIDcyLCA3MyB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgdWFydDFfZHRlX3BpbnNbXSA9IHsgNzUsIDc2LCA3NywgNzggfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0Ml9waW5zW10gPSB7IDc1LCA3NiwgNzcsIDc4IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0MV9waW5zW10gPSB7IDc0LCA3OSwgODAsIDgxIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0M19waW5zW10gPSB7IDgyLCA4MyB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcXNwaV8wX3BpbnNbXSA9IHsgMTA0LCAxMDUsIDEwNiwgMTA3IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBuYW5kX3BpbnNbXSA9IHsgMTEwLCAxMTEsIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsCisJMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNkaW8wX2NkX3BpbnNbXSA9IHsgMTAzIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzZGlvMF9tbWNfcGluc1tdID0geyAxMDAsIDEwMSwgMTAyIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzZGlvMV9kYXRhXzBfcGluc1tdID0geyA4NiwgODcgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjYW4wX3BpbnNbXSA9IHsgODYsIDg3IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3BpNF8wX3BpbnNbXSA9IHsgODYsIDg3IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzZGlvMV9kYXRhXzFfcGluc1tdID0geyA4OCwgODkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjYW4xX3BpbnNbXSA9IHsgODgsIDg5IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3BpNF8xX3BpbnNbXSA9IHsgODgsIDg5IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzZGlvMV9jZF9waW5zW10gPSB7IDkzIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzZGlvMV9sZWRfcGluc1tdID0geyA4NCwgODUgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzd19sZWQyXzFfcGluc1tdID0geyA4NCwgODUgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNkaW8xX21tY19waW5zW10gPSB7IDkwLCA5MSwgOTIgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNhbV9sZWRfcGluc1tdID0geyAxNTYsIDE1NywgMTU4LCAxNTksIDE2MCB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHN3X2xlZDFfcGluc1tdID0geyAxNTYsIDE1NywgMTU4LCAxNTkgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNhbV8wX3BpbnNbXSA9IHsgMTY5LCAxNzAsIDE3MSwgMTY5LCAxNzAgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNhbV8xX3BpbnNbXSA9IHsgMTYxLCAxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LAorCTE2OCB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNyYW1fMV9waW5zW10gPSB7IDE2MSwgMTYyLCAxNjMsIDE2NCwgMTY1LCAxNjYsIDE2NywKKwkxNjggfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHFzcGlfMV9waW5zW10gPSB7IDEwOCwgMTA5IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzbWFydF9jYXJkMF9mY2JfcGluc1tdID0geyA0NSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGkyczBfMV9waW5zW10gPSB7IDQ1IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzbWFydF9jYXJkMV9mY2JfcGluc1tdID0geyA1MSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGkyczFfMV9waW5zW10gPSB7IDUxIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBncGlvMF8zcDNfcGluc1tdID0geyAxNzYgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1c2IwX29jX3BpbnNbXSA9IHsgMTc2IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBncGlvMV8zcDNfcGluc1tdID0geyAxNzcgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1c2IxX29jX3BpbnNbXSA9IHsgMTc3IH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBncGlvMl8zcDNfcGluc1tdID0geyAxNzggfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1c2IyX29jX3BpbnNbXSA9IHsgMTc4IH07CisKKyNkZWZpbmUgQ1lHTlVTX1BJTl9HUk9VUChncm91cF9uYW1lLCBvZmYsIHNoLCBhbCkJXAorewkJCQkJCQlcCisJLm5hbWUgPSBfX3N0cmluZ2lmeShncm91cF9uYW1lKSAiX2dycCIsCQlcCisJLnBpbnMgPSBncm91cF9uYW1lICMjIF9waW5zLAkJCVwKKwkubnVtX3BpbnMgPSBBUlJBWV9TSVpFKGdyb3VwX25hbWUgIyMgX3BpbnMpLAlcCisJLm11eCA9IHsJCQkJCVwKKwkJLm9mZnNldCA9IG9mZiwJCQkJXAorCQkuc2hpZnQgPSBzaCwJCQkJXAorCQkuYWx0ID0gYWwsCQkJCVwKKwl9CQkJCQkJXAorfQorCisvKgorICogTGlzdCBvZiBDeWdudXMgcGluIGdyb3VwcworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGN5Z251c19waW5fZ3JvdXAgY3lnbnVzX3Bpbl9ncm91cHNbXSA9IHsKKwlDWUdOVVNfUElOX0dST1VQKGkyczJfMCwgMHgwLCAwLCAyKSwKKwlDWUdOVVNfUElOX0dST1VQKGkyczJfMSwgMHgwLCA0LCAyKSwKKwlDWUdOVVNfUElOX0dST1VQKGkyczJfMiwgMHgwLCA4LCAyKSwKKwlDWUdOVVNfUElOX0dST1VQKGkyczJfMywgMHgwLCAxMiwgMiksCisJQ1lHTlVTX1BJTl9HUk9VUChpMnMyXzQsIDB4MCwgMTYsIDIpLAorCUNZR05VU19QSU5fR1JPVVAocHdtNCwgMHgwLCAyMCwgMCksCisJQ1lHTlVTX1BJTl9HUk9VUChwd201LCAweDAsIDI0LCAyKSwKKwlDWUdOVVNfUElOX0dST1VQKGtleTAsIDB4NCwgMCwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChrZXkxLCAweDQsIDQsIDEpLAorCUNZR05VU19QSU5fR1JPVVAoa2V5MiwgMHg0LCA4LCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKGtleTMsIDB4NCwgMTIsIDEpLAorCUNZR05VU19QSU5fR1JPVVAoa2V5NCwgMHg0LCAxNiwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChrZXk1LCAweDQsIDIwLCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKGtleTYsIDB4NCwgMjQsIDEpLAorCUNZR05VU19QSU5fR1JPVVAoYXVkaW9fZHRlMCwgMHg0LCAyNCwgMiksCisJQ1lHTlVTX1BJTl9HUk9VUChrZXk3LCAweDQsIDI4LCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKGF1ZGlvX2R0ZTEsIDB4NCwgMjgsIDIpLAorCUNZR05VU19QSU5fR1JPVVAoa2V5OCwgMHg4LCAwLCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKGtleTksIDB4OCwgNCwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChrZXkxMCwgMHg4LCA4LCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKGtleTExLCAweDgsIDEyLCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKGtleTEyLCAweDgsIDE2LCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKGtleTEzLCAweDgsIDIwLCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKGtleTE0LCAweDgsIDI0LCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKGF1ZGlvX2R0ZTIsIDB4OCwgMjQsIDIpLAorCUNZR05VU19QSU5fR1JPVVAoa2V5MTUsIDB4OCwgMjgsIDEpLAorCUNZR05VU19QSU5fR1JPVVAoYXVkaW9fZHRlMywgMHg4LCAyOCwgMiksCisJQ1lHTlVTX1BJTl9HUk9VUChwd20wLCAweGMsIDAsIDApLAorCUNZR05VU19QSU5fR1JPVVAocHdtMSwgMHhjLCA0LCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKHB3bTIsIDB4YywgOCwgMCksCisJQ1lHTlVTX1BJTl9HUk9VUChwd20zLCAweGMsIDEyLCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKHNkaW8wLCAweGMsIDE2LCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKHNtYXJ0X2NhcmQwLCAweGMsIDIwLCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKGkyczBfMCwgMHhjLCAyMCwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChzcGRpZiwgMHhjLCAyMCwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChzbWFydF9jYXJkMSwgMHhjLCAyNCwgMCksCisJQ1lHTlVTX1BJTl9HUk9VUChpMnMxXzAsIDB4YywgMjQsIDEpLAorCUNZR05VU19QSU5fR1JPVVAoc3BpMCwgMHgxMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9HUk9VUChzcGkxLCAweDEwLCA0LCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKHNwaTIsIDB4MTAsIDgsIDApLAorCUNZR05VU19QSU5fR1JPVVAoc3BpMywgMHgxMCwgMTIsIDApLAorCUNZR05VU19QSU5fR1JPVVAoc3dfbGVkMF8wLCAweDEwLCAxMiwgMiksCisJQ1lHTlVTX1BJTl9HUk9VUChkMXcsIDB4MTAsIDE2LCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKHVhcnQ0LCAweDEwLCAxNiwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChzd19sZWQyXzAsIDB4MTAsIDE2LCAyKSwKKwlDWUdOVVNfUElOX0dST1VQKGxjZCwgMHgxMCwgMjAsIDApLAorCUNZR05VU19QSU5fR1JPVVAoc3JhbV8wLCAweDEwLCAyMCwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChzcGk1LCAweDEwLCAyMCwgMiksCisJQ1lHTlVTX1BJTl9HUk9VUCh1YXJ0MCwgMHgxNCwgMCwgMCksCisJQ1lHTlVTX1BJTl9HUk9VUChzd19sZWQwXzEsIDB4MTQsIDAsIDIpLAorCUNZR05VU19QSU5fR1JPVVAodWFydDFfZHRlLCAweDE0LCA0LCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKHVhcnQyLCAweDE0LCA0LCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKHVhcnQxLCAweDE0LCA4LCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKHVhcnQzLCAweDE0LCAxMiwgMCksCisJQ1lHTlVTX1BJTl9HUk9VUChxc3BpXzAsIDB4MTQsIDE2LCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKG5hbmQsIDB4MTQsIDIwLCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKHNkaW8wX2NkLCAweDE4LCAwLCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKHNkaW8wX21tYywgMHgxOCwgNCwgMCksCisJQ1lHTlVTX1BJTl9HUk9VUChzZGlvMV9kYXRhXzAsIDB4MTgsIDgsIDApLAorCUNZR05VU19QSU5fR1JPVVAoY2FuMCwgMHgxOCwgOCwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChzcGk0XzAsIDB4MTgsIDgsIDIpLAorCUNZR05VU19QSU5fR1JPVVAoc2RpbzFfZGF0YV8xLCAweDE4LCAxMiwgMCksCisJQ1lHTlVTX1BJTl9HUk9VUChjYW4xLCAweDE4LCAxMiwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChzcGk0XzEsIDB4MTgsIDEyLCAyKSwKKwlDWUdOVVNfUElOX0dST1VQKHNkaW8xX2NkLCAweDE4LCAxNiwgMCksCisJQ1lHTlVTX1BJTl9HUk9VUChzZGlvMV9sZWQsIDB4MTgsIDIwLCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKHN3X2xlZDJfMSwgMHgxOCwgMjAsIDIpLAorCUNZR05VU19QSU5fR1JPVVAoc2RpbzFfbW1jLCAweDE4LCAyNCwgMCksCisJQ1lHTlVTX1BJTl9HUk9VUChjYW1fbGVkLCAweDFjLCAwLCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKHN3X2xlZDEsIDB4MWMsIDAsIDEpLAorCUNZR05VU19QSU5fR1JPVVAoY2FtXzAsIDB4MWMsIDQsIDApLAorCUNZR05VU19QSU5fR1JPVVAoY2FtXzEsIDB4MWMsIDgsIDApLAorCUNZR05VU19QSU5fR1JPVVAoc3JhbV8xLCAweDFjLCA4LCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKHFzcGlfMSwgMHgxYywgMTIsIDApLAorCUNZR05VU19QSU5fR1JPVVAoYnNjMSwgMHgxYywgMTYsIDApLAorCUNZR05VU19QSU5fR1JPVVAocGNpZV9jbGtyZXEsIDB4MWMsIDE2LCAxKSwKKwlDWUdOVVNfUElOX0dST1VQKHNtYXJ0X2NhcmQwX2ZjYiwgMHgyMCwgMCwgMCksCisJQ1lHTlVTX1BJTl9HUk9VUChpMnMwXzEsIDB4MjAsIDAsIDEpLAorCUNZR05VU19QSU5fR1JPVVAoc21hcnRfY2FyZDFfZmNiLCAweDIwLCA0LCAwKSwKKwlDWUdOVVNfUElOX0dST1VQKGkyczFfMSwgMHgyMCwgNCwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChncGlvMF8zcDMsIDB4MjgsIDAsIDApLAorCUNZR05VU19QSU5fR1JPVVAodXNiMF9vYywgMHgyOCwgMCwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChncGlvMV8zcDMsIDB4MjgsIDQsIDApLAorCUNZR05VU19QSU5fR1JPVVAodXNiMV9vYywgMHgyOCwgNCwgMSksCisJQ1lHTlVTX1BJTl9HUk9VUChncGlvMl8zcDMsIDB4MjgsIDgsIDApLAorCUNZR05VU19QSU5fR1JPVVAodXNiMl9vYywgMHgyOCwgOCwgMSksCit9OworCisvKgorICogTGlzdCBvZiBncm91cHMgc3VwcG9ydGVkIGJ5IGZ1bmN0aW9ucworICovCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyczBfZ3Jwc1tdID0geyAiaTJzMF8wX2dycCIsICJpMnMwXzFfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnMxX2dycHNbXSA9IHsgImkyczFfMF9ncnAiLCAiaTJzMV8xX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaTJzMl9ncnBzW10gPSB7ICJpMnMyXzBfZ3JwIiwgImkyczJfMV9ncnAiLAorCSJpMnMyXzJfZ3JwIiwgImkyczJfM19ncnAiLCAiaTJzMl80X2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BkaWZfZ3Jwc1tdID0geyAic3BkaWZfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20wX2dycHNbXSA9IHsgInB3bTBfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20xX2dycHNbXSA9IHsgInB3bTFfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20yX2dycHNbXSA9IHsgInB3bTJfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd20zX2dycHNbXSA9IHsgInB3bTNfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd200X2dycHNbXSA9IHsgInB3bTRfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd201X2dycHNbXSA9IHsgInB3bTVfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlfZ3Jwc1tdID0geyAia2V5MF9ncnAiLCAia2V5MV9ncnAiLCAia2V5Ml9ncnAiLAorCSJrZXkzX2dycCIsICJrZXk0X2dycCIsICJrZXk1X2dycCIsICJrZXk2X2dycCIsICJrZXk3X2dycCIsICJrZXk4X2dycCIsCisJImtleTlfZ3JwIiwgImtleTEwX2dycCIsICJrZXkxMV9ncnAiLCAia2V5MTJfZ3JwIiwgImtleTEzX2dycCIsCisJImtleTE0X2dycCIsICJrZXkxNV9ncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF1ZGlvX2R0ZV9ncnBzW10gPSB7ICJhdWRpb19kdGUwX2dycCIsCisJImF1ZGlvX2R0ZTFfZ3JwIiwgImF1ZGlvX2R0ZTJfZ3JwIiwgImF1ZGlvX2R0ZTNfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbWFydF9jYXJkMF9ncnBzW10gPSB7ICJzbWFydF9jYXJkMF9ncnAiLAorCSJzbWFydF9jYXJkMF9mY2JfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzbWFydF9jYXJkMV9ncnBzW10gPSB7ICJzbWFydF9jYXJkMV9ncnAiLAorCSJzbWFydF9jYXJkMV9mY2JfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkwX2dycHNbXSA9IHsgInNwaTBfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkxX2dycHNbXSA9IHsgInNwaTFfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkyX2dycHNbXSA9IHsgInNwaTJfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGkzX2dycHNbXSA9IHsgInNwaTNfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcGk0X2dycHNbXSA9IHsgInNwaTRfMF9ncnAiLCAic3BpNF8xX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BpNV9ncnBzW10gPSB7ICJzcGk1X2dycCIgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzd19sZWQwX2dycHNbXSA9IHsgInN3X2xlZDBfMF9ncnAiLAorCSJzd19sZWQwXzFfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzd19sZWQxX2dycHNbXSA9IHsgInN3X2xlZDFfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzd19sZWQyX2dycHNbXSA9IHsgInN3X2xlZDJfMF9ncnAiLAorCSJzd19sZWQyXzFfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkMXdfZ3Jwc1tdID0geyAiZDF3X2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbGNkX2dycHNbXSA9IHsgImxjZF9ncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNyYW1fZ3Jwc1tdID0geyAic3JhbV8wX2dycCIsICJzcmFtXzFfZ3JwIiB9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnQwX2dycHNbXSA9IHsgInVhcnQwX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydDFfZ3Jwc1tdID0geyAidWFydDFfZ3JwIiwgInVhcnQxX2R0ZV9ncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHVhcnQyX2dycHNbXSA9IHsgInVhcnQyX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydDNfZ3Jwc1tdID0geyAidWFydDNfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0NF9ncnBzW10gPSB7ICJ1YXJ0NF9ncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHFzcGlfZ3Jwc1tdID0geyAicXNwaV8wX2dycCIsICJxc3BpXzFfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW5kX2dycHNbXSA9IHsgIm5hbmRfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZGlvMF9ncnBzW10gPSB7ICJzZGlvMF9ncnAiLCAic2RpbzBfY2RfZ3JwIiwKKwkic2RpbzBfbW1jX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2RpbzFfZ3Jwc1tdID0geyAic2RpbzFfZGF0YV8wX2dycCIsCisJInNkaW8xX2RhdGFfMV9ncnAiLCAic2RpbzFfY2RfZ3JwIiwgInNkaW8xX2xlZF9ncnAiLCAic2RpbzFfbW1jX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FuMF9ncnBzW10gPSB7ICJjYW4wX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FuMV9ncnBzW10gPSB7ICJjYW4xX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2FtX2dycHNbXSA9IHsgImNhbV9sZWRfZ3JwIiwgImNhbV8wX2dycCIsCisJImNhbV8xX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYnNjMV9ncnBzW10gPSB7ICJic2MxX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGNpZV9jbGtyZXFfZ3Jwc1tdID0geyAicGNpZV9jbGtyZXFfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1c2IwX29jX2dycHNbXSA9IHsgInVzYjBfb2NfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1c2IxX29jX2dycHNbXSA9IHsgInVzYjFfb2NfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1c2IyX29jX2dycHNbXSA9IHsgInVzYjJfb2NfZ3JwIiB9OworCisjZGVmaW5lIENZR05VU19QSU5fRlVOQ1RJT04oZnVuYykJCQkJXAorewkJCQkJCQkJXAorCS5uYW1lID0gI2Z1bmMsCQkJCQkJXAorCS5ncm91cHMgPSBmdW5jICMjIF9ncnBzLAkJCQlcCisJLm51bV9ncm91cHMgPSBBUlJBWV9TSVpFKGZ1bmMgIyMgX2dycHMpLAkJXAorfQorCisvKgorICogTGlzdCBvZiBzdXBwb3J0ZWQgZnVuY3Rpb25zIGluIEN5Z251cworICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGN5Z251c19waW5fZnVuY3Rpb24gY3lnbnVzX3Bpbl9mdW5jdGlvbnNbXSA9IHsKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKGkyczApLAorCUNZR05VU19QSU5fRlVOQ1RJT04oaTJzMSksCisJQ1lHTlVTX1BJTl9GVU5DVElPTihpMnMyKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHNwZGlmKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHB3bTApLAorCUNZR05VU19QSU5fRlVOQ1RJT04ocHdtMSksCisJQ1lHTlVTX1BJTl9GVU5DVElPTihwd20yKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHB3bTMpLAorCUNZR05VU19QSU5fRlVOQ1RJT04ocHdtNCksCisJQ1lHTlVTX1BJTl9GVU5DVElPTihwd201KSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKGtleSksCisJQ1lHTlVTX1BJTl9GVU5DVElPTihhdWRpb19kdGUpLAorCUNZR05VU19QSU5fRlVOQ1RJT04oc21hcnRfY2FyZDApLAorCUNZR05VU19QSU5fRlVOQ1RJT04oc21hcnRfY2FyZDEpLAorCUNZR05VU19QSU5fRlVOQ1RJT04oc3BpMCksCisJQ1lHTlVTX1BJTl9GVU5DVElPTihzcGkxKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHNwaTIpLAorCUNZR05VU19QSU5fRlVOQ1RJT04oc3BpMyksCisJQ1lHTlVTX1BJTl9GVU5DVElPTihzcGk0KSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHNwaTUpLAorCUNZR05VU19QSU5fRlVOQ1RJT04oc3dfbGVkMCksCisJQ1lHTlVTX1BJTl9GVU5DVElPTihzd19sZWQxKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHN3X2xlZDIpLAorCUNZR05VU19QSU5fRlVOQ1RJT04oZDF3KSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKGxjZCksCisJQ1lHTlVTX1BJTl9GVU5DVElPTihzcmFtKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHVhcnQwKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHVhcnQxKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHVhcnQyKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHVhcnQzKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHVhcnQ0KSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHFzcGkpLAorCUNZR05VU19QSU5fRlVOQ1RJT04obmFuZCksCisJQ1lHTlVTX1BJTl9GVU5DVElPTihzZGlvMCksCisJQ1lHTlVTX1BJTl9GVU5DVElPTihzZGlvMSksCisJQ1lHTlVTX1BJTl9GVU5DVElPTihjYW4wKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKGNhbjEpLAorCUNZR05VU19QSU5fRlVOQ1RJT04oY2FtKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKGJzYzEpLAorCUNZR05VU19QSU5fRlVOQ1RJT04ocGNpZV9jbGtyZXEpLAorCUNZR05VU19QSU5fRlVOQ1RJT04odXNiMF9vYyksCisJQ1lHTlVTX1BJTl9GVU5DVElPTih1c2IxX29jKSwKKwlDWUdOVVNfUElOX0ZVTkNUSU9OKHVzYjJfb2MpLAorfTsKKworc3RhdGljIGludCBjeWdudXNfZ2V0X2dyb3Vwc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdHJsX2RldikKK3sKKwlzdHJ1Y3QgY3lnbnVzX3BpbmN0cmwgKnBpbmN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RybF9kZXYpOworCisJcmV0dXJuIHBpbmN0cmwtPm51bV9ncm91cHM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjeWdudXNfZ2V0X2dyb3VwX25hbWUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RybF9kZXYsCisJCQkJCSB1bnNpZ25lZCBzZWxlY3RvcikKK3sKKwlzdHJ1Y3QgY3lnbnVzX3BpbmN0cmwgKnBpbmN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RybF9kZXYpOworCisJcmV0dXJuIHBpbmN0cmwtPmdyb3Vwc1tzZWxlY3Rvcl0ubmFtZTsKK30KKworc3RhdGljIGludCBjeWdudXNfZ2V0X2dyb3VwX3BpbnMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RybF9kZXYsCisJCQkJIHVuc2lnbmVkIHNlbGVjdG9yLCBjb25zdCB1bnNpZ25lZCAqKnBpbnMsCisJCQkJIHVuc2lnbmVkICpudW1fcGlucykKK3sKKwlzdHJ1Y3QgY3lnbnVzX3BpbmN0cmwgKnBpbmN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RybF9kZXYpOworCisJKnBpbnMgPSBwaW5jdHJsLT5ncm91cHNbc2VsZWN0b3JdLnBpbnM7CisJKm51bV9waW5zID0gcGluY3RybC0+Z3JvdXBzW3NlbGVjdG9yXS5udW1fcGluczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjeWdudXNfcGluX2RiZ19zaG93KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0cmxfZGV2LAorCQkJCXN0cnVjdCBzZXFfZmlsZSAqcywgdW5zaWduZWQgb2Zmc2V0KQoreworCXNlcV9wcmludGYocywgIiAlcyIsIGRldl9uYW1lKHBjdHJsX2Rldi0+ZGV2KSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9vcHMgY3lnbnVzX3BpbmN0cmxfb3BzID0geworCS5nZXRfZ3JvdXBzX2NvdW50ID0gY3lnbnVzX2dldF9ncm91cHNfY291bnQsCisJLmdldF9ncm91cF9uYW1lID0gY3lnbnVzX2dldF9ncm91cF9uYW1lLAorCS5nZXRfZ3JvdXBfcGlucyA9IGN5Z251c19nZXRfZ3JvdXBfcGlucywKKwkucGluX2RiZ19zaG93ID0gY3lnbnVzX3Bpbl9kYmdfc2hvdywKKwkuZHRfbm9kZV90b19tYXAgPSBwaW5jb25mX2dlbmVyaWNfZHRfbm9kZV90b19tYXBfZ3JvdXAsCisJLmR0X2ZyZWVfbWFwID0gcGluY3RybF91dGlsc19kdF9mcmVlX21hcCwKK307CisKK3N0YXRpYyBpbnQgY3lnbnVzX2dldF9mdW5jdGlvbnNfY291bnQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RybF9kZXYpCit7CisJc3RydWN0IGN5Z251c19waW5jdHJsICpwaW5jdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0cmxfZGV2KTsKKworCXJldHVybiBwaW5jdHJsLT5udW1fZnVuY3Rpb25zOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY3lnbnVzX2dldF9mdW5jdGlvbl9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0cmxfZGV2LAorCQkJCQkgICAgdW5zaWduZWQgc2VsZWN0b3IpCit7CisJc3RydWN0IGN5Z251c19waW5jdHJsICpwaW5jdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0cmxfZGV2KTsKKworCXJldHVybiBwaW5jdHJsLT5mdW5jdGlvbnNbc2VsZWN0b3JdLm5hbWU7Cit9CisKK3N0YXRpYyBpbnQgY3lnbnVzX2dldF9mdW5jdGlvbl9ncm91cHMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RybF9kZXYsCisJCQkJICAgICAgdW5zaWduZWQgc2VsZWN0b3IsCisJCQkJICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICoqZ3JvdXBzLAorCQkJCSAgICAgIHVuc2lnbmVkICogY29uc3QgbnVtX2dyb3VwcykKK3sKKwlzdHJ1Y3QgY3lnbnVzX3BpbmN0cmwgKnBpbmN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RybF9kZXYpOworCisJKmdyb3VwcyA9IHBpbmN0cmwtPmZ1bmN0aW9uc1tzZWxlY3Rvcl0uZ3JvdXBzOworCSpudW1fZ3JvdXBzID0gcGluY3RybC0+ZnVuY3Rpb25zW3NlbGVjdG9yXS5udW1fZ3JvdXBzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3lnbnVzX3Bpbm11eF9zZXQoc3RydWN0IGN5Z251c19waW5jdHJsICpwaW5jdHJsLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgY3lnbnVzX3Bpbl9mdW5jdGlvbiAqZnVuYywKKwkJCSAgICAgY29uc3Qgc3RydWN0IGN5Z251c19waW5fZ3JvdXAgKmdycCwKKwkJCSAgICAgc3RydWN0IGN5Z251c19tdXhfbG9nICptdXhfbG9nKQoreworCWNvbnN0IHN0cnVjdCBjeWdudXNfbXV4ICptdXggPSAmZ3JwLT5tdXg7CisJaW50IGk7CisJdTMyIHZhbCwgbWFzayA9IDB4NzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZm9yIChpID0gMDsgaSA8IENZR05VU19OVU1fSU9NVVg7IGkrKykgeworCQlpZiAobXV4LT5vZmZzZXQgIT0gbXV4X2xvZ1tpXS5tdXgub2Zmc2V0IHx8CisJCSAgICBtdXgtPnNoaWZ0ICE9IG11eF9sb2dbaV0ubXV4LnNoaWZ0KQorCQkJY29udGludWU7CisKKwkJLyogbWF0Y2ggZm91bmQgaWYgd2UgcmVhY2ggaGVyZSAqLworCisJCS8qIGlmIHRoaXMgaXMgYSBuZXcgY29uZmlndXJhdGlvbiwganVzdCBkbyBpdCEgKi8KKwkJaWYgKCFtdXhfbG9nW2ldLmlzX2NvbmZpZ3VyZWQpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBJT01VWCBoYXMgYmVlbiBjb25maWd1cmVkIHByZXZpb3VzbHkgYW5kIG9uZSBpcyB0cnlpbmcgdG8KKwkJICogY29uZmlndXJlIGl0IHRvIGEgZGlmZmVyZW50IGZ1bmN0aW9uCisJCSAqLworCQlpZiAobXV4X2xvZ1tpXS5tdXguYWx0ICE9IG11eC0+YWx0KSB7CisJCQlkZXZfZXJyKHBpbmN0cmwtPmRldiwKKwkJCQkiZG91YmxlIGNvbmZpZ3VyYXRpb24gZXJyb3IgZGV0ZWN0ZWQhXG4iKTsKKwkJCWRldl9lcnIocGluY3RybC0+ZGV2LCAiZnVuYzolcyBncnA6JXNcbiIsCisJCQkJZnVuYy0+bmFtZSwgZ3JwLT5uYW1lKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIE9uZSB0cmllcyB0byBjb25maWd1cmUgaXQgdG8gdGhlIHNhbWUgZnVuY3Rpb24uCisJCQkgKiBKdXN0IHF1aXQgYW5kIGRvbid0IGJvdGhlcgorCQkJICovCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCW11eF9sb2dbaV0ubXV4LmFsdCA9IG11eC0+YWx0OworCW11eF9sb2dbaV0uaXNfY29uZmlndXJlZCA9IHRydWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGluY3RybC0+bG9jaywgZmxhZ3MpOworCisJdmFsID0gcmVhZGwocGluY3RybC0+YmFzZTAgKyBncnAtPm11eC5vZmZzZXQpOworCXZhbCAmPSB+KG1hc2sgPDwgZ3JwLT5tdXguc2hpZnQpOworCXZhbCB8PSBncnAtPm11eC5hbHQgPDwgZ3JwLT5tdXguc2hpZnQ7CisJd3JpdGVsKHZhbCwgcGluY3RybC0+YmFzZTAgKyBncnAtPm11eC5vZmZzZXQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGluY3RybC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3lnbnVzX3Bpbm11eF9zZXRfbXV4KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0cmxfZGV2LAorCQkJCSB1bnNpZ25lZCBmdW5jX3NlbGVjdCwgdW5zaWduZWQgZ3JwX3NlbGVjdCkKK3sKKwlzdHJ1Y3QgY3lnbnVzX3BpbmN0cmwgKnBpbmN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RybF9kZXYpOworCWNvbnN0IHN0cnVjdCBjeWdudXNfcGluX2Z1bmN0aW9uICpmdW5jID0KKwkJJnBpbmN0cmwtPmZ1bmN0aW9uc1tmdW5jX3NlbGVjdF07CisJY29uc3Qgc3RydWN0IGN5Z251c19waW5fZ3JvdXAgKmdycCA9ICZwaW5jdHJsLT5ncm91cHNbZ3JwX3NlbGVjdF07CisKKwlkZXZfZGJnKHBjdHJsX2Rldi0+ZGV2LCAiZnVuYzoldSBuYW1lOiVzIGdycDoldSBuYW1lOiVzXG4iLAorCQlmdW5jX3NlbGVjdCwgZnVuYy0+bmFtZSwgZ3JwX3NlbGVjdCwgZ3JwLT5uYW1lKTsKKworCWRldl9kYmcocGN0cmxfZGV2LT5kZXYsICJvZmZzZXQ6MHglMDh4IHNoaWZ0OiV1IGFsdDoldVxuIiwKKwkJZ3JwLT5tdXgub2Zmc2V0LCBncnAtPm11eC5zaGlmdCwgZ3JwLT5tdXguYWx0KTsKKworCXJldHVybiBjeWdudXNfcGlubXV4X3NldChwaW5jdHJsLCBmdW5jLCBncnAsIHBpbmN0cmwtPm11eF9sb2cpOworfQorCitzdGF0aWMgaW50IGN5Z251c19ncGlvX3JlcXVlc3RfZW5hYmxlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0cmxfZGV2LAorCQkJCSAgICAgIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgKnJhbmdlLAorCQkJCSAgICAgIHVuc2lnbmVkIHBpbikKK3sKKwlzdHJ1Y3QgY3lnbnVzX3BpbmN0cmwgKnBpbmN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RybF9kZXYpOworCWNvbnN0IHN0cnVjdCBjeWdudXNfZ3Bpb19tdXggKm11eCA9IHBjdHJsX2Rldi0+ZGVzYy0+cGluc1twaW5dLmRydl9kYXRhOworCXUzMiB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIG5vdCBhbGwgcGlucyBzdXBwb3J0IEdQSU8gcGlubXV4IG92ZXJyaWRlICovCisJaWYgKCFtdXgtPmlzX3N1cHBvcnRlZCkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaW5jdHJsLT5sb2NrLCBmbGFncyk7CisKKwl2YWwgPSByZWFkbChwaW5jdHJsLT5iYXNlMSArIG11eC0+b2Zmc2V0KTsKKwl2YWwgfD0gMHgzIDw8IG11eC0+c2hpZnQ7CisJd3JpdGVsKHZhbCwgcGluY3RybC0+YmFzZTEgKyBtdXgtPm9mZnNldCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaW5jdHJsLT5sb2NrLCBmbGFncyk7CisKKwlkZXZfZGJnKHBjdHJsX2Rldi0+ZGV2LAorCQkiZ3BpbyByZXF1ZXN0IGVuYWJsZSBwaW49JXUgb2Zmc2V0PTB4JXggc2hpZnQ9JXVcbiIsCisJCXBpbiwgbXV4LT5vZmZzZXQsIG11eC0+c2hpZnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGN5Z251c19ncGlvX2Rpc2FibGVfZnJlZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdHJsX2RldiwKKwkJCQkgICAgIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgKnJhbmdlLAorCQkJCSAgICAgdW5zaWduZWQgcGluKQoreworCXN0cnVjdCBjeWdudXNfcGluY3RybCAqcGluY3RybCA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdHJsX2Rldik7CisJc3RydWN0IGN5Z251c19ncGlvX211eCAqbXV4ID0gcGN0cmxfZGV2LT5kZXNjLT5waW5zW3Bpbl0uZHJ2X2RhdGE7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFtdXgtPmlzX3N1cHBvcnRlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBpbmN0cmwtPmxvY2ssIGZsYWdzKTsKKworCXZhbCA9IHJlYWRsKHBpbmN0cmwtPmJhc2UxICsgbXV4LT5vZmZzZXQpOworCXZhbCAmPSB+KDB4MyA8PCBtdXgtPnNoaWZ0KTsKKwl3cml0ZWwodmFsLCBwaW5jdHJsLT5iYXNlMSArIG11eC0+b2Zmc2V0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBpbmN0cmwtPmxvY2ssIGZsYWdzKTsKKworCWRldl9lcnIocGN0cmxfZGV2LT5kZXYsCisJCSJncGlvIGRpc2FibGUgZnJlZSBwaW49JXUgb2Zmc2V0PTB4JXggc2hpZnQ9JXVcbiIsCisJCXBpbiwgbXV4LT5vZmZzZXQsIG11eC0+c2hpZnQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbm11eF9vcHMgY3lnbnVzX3Bpbm11eF9vcHMgPSB7CisJLmdldF9mdW5jdGlvbnNfY291bnQgPSBjeWdudXNfZ2V0X2Z1bmN0aW9uc19jb3VudCwKKwkuZ2V0X2Z1bmN0aW9uX25hbWUgPSBjeWdudXNfZ2V0X2Z1bmN0aW9uX25hbWUsCisJLmdldF9mdW5jdGlvbl9ncm91cHMgPSBjeWdudXNfZ2V0X2Z1bmN0aW9uX2dyb3VwcywKKwkuc2V0X211eCA9IGN5Z251c19waW5tdXhfc2V0X211eCwKKwkuZ3Bpb19yZXF1ZXN0X2VuYWJsZSA9IGN5Z251c19ncGlvX3JlcXVlc3RfZW5hYmxlLAorCS5ncGlvX2Rpc2FibGVfZnJlZSA9IGN5Z251c19ncGlvX2Rpc2FibGVfZnJlZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGluY3RybF9kZXNjIGN5Z251c19waW5jdHJsX2Rlc2MgPSB7CisJLm5hbWUgPSAiY3lnbnVzLXBpbm11eCIsCisJLnBjdGxvcHMgPSAmY3lnbnVzX3BpbmN0cmxfb3BzLAorCS5wbXhvcHMgPSAmY3lnbnVzX3Bpbm11eF9vcHMsCit9OworCitzdGF0aWMgaW50IGN5Z251c19tdXhfbG9nX2luaXQoc3RydWN0IGN5Z251c19waW5jdHJsICpwaW5jdHJsKQoreworCXN0cnVjdCBjeWdudXNfbXV4X2xvZyAqbG9nOworCXVuc2lnbmVkIGludCBpLCBqOworCisJcGluY3RybC0+bXV4X2xvZyA9IGRldm1fa2NhbGxvYyhwaW5jdHJsLT5kZXYsIENZR05VU19OVU1fSU9NVVgsCisJCQkJCXNpemVvZihzdHJ1Y3QgY3lnbnVzX211eF9sb2cpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXBpbmN0cmwtPm11eF9sb2cpCisJCXJldHVybiAtRU5PTUVNOworCisJbG9nID0gcGluY3RybC0+bXV4X2xvZzsKKwlmb3IgKGkgPSAwOyBpIDwgQ1lHTlVTX05VTV9JT01VWF9SRUdTOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IENZR05VU19OVU1fTVVYX1BFUl9SRUc7IGorKykgeworCQkJbG9nID0gJnBpbmN0cmwtPm11eF9sb2dbaSAqIENZR05VU19OVU1fTVVYX1BFUl9SRUcKKwkJCQkrIGpdOworCQkJbG9nLT5tdXgub2Zmc2V0ID0gaSAqIDQ7CisJCQlsb2ctPm11eC5zaGlmdCA9IGogKiA0OworCQkJbG9nLT5tdXguYWx0ID0gMDsKKwkJCWxvZy0+aXNfY29uZmlndXJlZCA9IGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3lnbnVzX3Bpbm11eF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBjeWdudXNfcGluY3RybCAqcGluY3RybDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjICpwaW5zOworCXVuc2lnbmVkIG51bV9waW5zID0gQVJSQVlfU0laRShjeWdudXNfcGlucyk7CisKKwlwaW5jdHJsID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGluY3RybCksIEdGUF9LRVJORUwpOworCWlmICghcGluY3RybCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwaW5jdHJsLT5kZXYgPSAmcGRldi0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBpbmN0cmwpOworCXNwaW5fbG9ja19pbml0KCZwaW5jdHJsLT5sb2NrKTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcGluY3RybC0+YmFzZTAgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHBpbmN0cmwtPmJhc2UwKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gbWFwIEkvTyBzcGFjZVxuIik7CisJCXJldHVybiBQVFJfRVJSKHBpbmN0cmwtPmJhc2UwKTsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDEpOworCXBpbmN0cmwtPmJhc2UxID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihwaW5jdHJsLT5iYXNlMSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIG1hcCBJL08gc3BhY2VcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwaW5jdHJsLT5iYXNlMSk7CisJfQorCisJcmV0ID0gY3lnbnVzX211eF9sb2dfaW5pdChwaW5jdHJsKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBpbml0aWFsaXplIElPTVVYIGxvZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcGlucyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBudW1fcGlucywgc2l6ZW9mKCpwaW5zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaW5zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fcGluczsgaSsrKSB7CisJCXBpbnNbaV0ubnVtYmVyID0gY3lnbnVzX3BpbnNbaV0ucGluOworCQlwaW5zW2ldLm5hbWUgPSBjeWdudXNfcGluc1tpXS5uYW1lOworCQlwaW5zW2ldLmRydl9kYXRhID0gJmN5Z251c19waW5zW2ldLmdwaW9fbXV4OworCX0KKworCXBpbmN0cmwtPmdyb3VwcyA9IGN5Z251c19waW5fZ3JvdXBzOworCXBpbmN0cmwtPm51bV9ncm91cHMgPSBBUlJBWV9TSVpFKGN5Z251c19waW5fZ3JvdXBzKTsKKwlwaW5jdHJsLT5mdW5jdGlvbnMgPSBjeWdudXNfcGluX2Z1bmN0aW9uczsKKwlwaW5jdHJsLT5udW1fZnVuY3Rpb25zID0gQVJSQVlfU0laRShjeWdudXNfcGluX2Z1bmN0aW9ucyk7CisJY3lnbnVzX3BpbmN0cmxfZGVzYy5waW5zID0gcGluczsKKwljeWdudXNfcGluY3RybF9kZXNjLm5waW5zID0gbnVtX3BpbnM7CisKKwlwaW5jdHJsLT5wY3RsID0gcGluY3RybF9yZWdpc3RlcigmY3lnbnVzX3BpbmN0cmxfZGVzYywgJnBkZXYtPmRldiwKKwkJCXBpbmN0cmwpOworCWlmICghcGluY3RybC0+cGN0bCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgQ3lnbnVzIElPTVVYIHBpbmN0cmxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY3lnbnVzX3Bpbm11eF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxjeWdudXMtcGlubXV4IiB9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY3lnbnVzX3Bpbm11eF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiY3lnbnVzLXBpbm11eCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IGN5Z251c19waW5tdXhfb2ZfbWF0Y2gsCisJCS5zdXBwcmVzc19iaW5kX2F0dHJzID0gdHJ1ZSwKKwl9LAorCS5wcm9iZSA9IGN5Z251c19waW5tdXhfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjeWdudXNfcGlubXV4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZjeWdudXNfcGlubXV4X2RyaXZlcik7Cit9CithcmNoX2luaXRjYWxsKGN5Z251c19waW5tdXhfaW5pdCk7CisKK01PRFVMRV9BVVRIT1IoIlJheSBKdWkgPHJqdWlAYnJvYWRjb20uY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSBDeWdudXMgSU9NVVggZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvZnJlZXNjYWxlL3BpbmN0cmwtaW14LmMgYi9kcml2ZXJzL3BpbmN0cmwvZnJlZXNjYWxlL3BpbmN0cmwtaW14LmMKaW5kZXggNDQ4ZjEwOS4uZTI2MWYxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL2ZyZWVzY2FsZS9waW5jdHJsLWlteC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9mcmVlc2NhbGUvcGluY3RybC1pbXguYwpAQCAtNTQyLDEwICs1NDIsMTMgQEAKIAkJc3RydWN0IGlteF9waW5fcmVnICpwaW5fcmVnOwogCQlzdHJ1Y3QgaW14X3BpbiAqcGluID0gJmdycC0+cGluc1tpXTsKIAotCQlpZiAoaW5mby0+ZmxhZ3MgJiBTSEFSRV9NVVhfQ09ORl9SRUcpCisJCWlmIChpbmZvLT5mbGFncyAmIFNIQVJFX01VWF9DT05GX1JFRykgewogCQkJY29uZl9yZWcgPSBtdXhfcmVnOwotCQllbHNlCisJCX0gZWxzZSB7CiAJCQljb25mX3JlZyA9IGJlMzJfdG9fY3B1KCpsaXN0KyspOworCQkJaWYgKCFjb25mX3JlZykKKwkJCQljb25mX3JlZyA9IC0xOworCQl9CiAKIAkJcGluX2lkID0gbXV4X3JlZyA/IG11eF9yZWcgLyA0IDogY29uZl9yZWcgLyA0OwogCQlwaW5fcmVnID0gJmluZm8tPnBpbl9yZWdzW3Bpbl9pZF07CkBAIC02NDUsNyArNjQ4LDcgQEAKIHsKIAlzdHJ1Y3QgaW14X3BpbmN0cmwgKmlwY3RsOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCWludCByZXQ7CisJaW50IHJldCwgaTsKIAogCWlmICghaW5mbyB8fCAhaW5mby0+cGlucyB8fCAhaW5mby0+bnBpbnMpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAid3JvbmcgcGluY3RybCBpbmZvXG4iKTsKQEAgLTY2Miw3ICs2NjUsMTEgQEAKIAkJCQkgICAgICBpbmZvLT5ucGlucywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpbmZvLT5waW5fcmVncykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtc2V0KGluZm8tPnBpbl9yZWdzLCAweGZmLCBzaXplb2YoKmluZm8tPnBpbl9yZWdzKSAqIGluZm8tPm5waW5zKTsKKworCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5ucGluczsgaSsrKSB7CisJCWluZm8tPnBpbl9yZWdzW2ldLm11eF9yZWcgPSAtMTsKKwkJaW5mby0+cGluX3JlZ3NbaV0uY29uZl9yZWcgPSAtMTsKKwl9CiAKIAlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlwY3RsLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvZnJlZXNjYWxlL3BpbmN0cmwtdmY2MTAuYyBiL2RyaXZlcnMvcGluY3RybC9mcmVlc2NhbGUvcGluY3RybC12ZjYxMC5jCmluZGV4IGZjODYyNzYuLjM3YTAzNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9mcmVlc2NhbGUvcGluY3RybC12ZjYxMC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9mcmVlc2NhbGUvcGluY3RybC12ZjYxMC5jCkBAIC0zMDIsNyArMzAyLDcgQEAKIAkuZmxhZ3MgPSBTSEFSRV9NVVhfQ09ORl9SRUcsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB2ZjYxMF9waW5jdHJsX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2ZjYxMF9waW5jdHJsX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsdmY2MTAtaW9tdXhjIiwgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvS2NvbmZpZyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9LY29uZmlnCmluZGV4IGI4MDFkODYuLmZlNWUwN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9pbnRlbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9LY29uZmlnCkBAIC0yNSwzICsyNSwyMCBAQAogCWhlbHAKIAkgIENoZXJyeXZpZXcvQnJhc3dlbGwgcGluY3RybCBkcml2ZXIgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRoYXQKIAkgIGFsbG93cyBjb25maWd1cmluZyBvZiBTb0MgcGlucyBhbmQgdXNpbmcgdGhlbSBhcyBHUElPcy4KKworY29uZmlnIFBJTkNUUkxfSU5URUwKKwl0cmlzdGF0ZQorCXNlbGVjdCBQSU5NVVgKKwlzZWxlY3QgUElOQ09ORgorCXNlbGVjdCBHRU5FUklDX1BJTkNPTkYKKwlzZWxlY3QgR1BJT0xJQgorCXNlbGVjdCBHUElPTElCX0lSUUNISVAKKworY29uZmlnIFBJTkNUUkxfU1VOUklTRVBPSU5UCisJdHJpc3RhdGUgIkludGVsIFN1bnJpc2Vwb2ludCBwaW5jdHJsIGFuZCBHUElPIGRyaXZlciIKKwlkZXBlbmRzIG9uIEFDUEkKKwlzZWxlY3QgUElOQ1RSTF9JTlRFTAorCWhlbHAKKwkgIFN1bnJpc2Vwb2ludCBpcyB0aGUgUENIIG9mIEludGVsIFNreWxha2UuIFRoaXMgcGluY3RybCBkcml2ZXIKKwkgIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0aGF0IGFsbG93cyBjb25maWd1cmluZyBvZiBQQ0ggcGlucyBhbmQKKwkgIHVzaW5nIHRoZW0gYXMgR1BJT3MuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvTWFrZWZpbGUgYi9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvTWFrZWZpbGUKaW5kZXggNGMyMTBlNC4uZmVlNzU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL2ludGVsL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9NYWtlZmlsZQpAQCAtMiwzICsyLDUgQEAKIAogb2JqLSQoQ09ORklHX1BJTkNUUkxfQkFZVFJBSUwpCQkrPSBwaW5jdHJsLWJheXRyYWlsLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX0NIRVJSWVZJRVcpCSs9IHBpbmN0cmwtY2hlcnJ5dmlldy5vCitvYmotJChDT05GSUdfUElOQ1RSTF9JTlRFTCkJCSs9IHBpbmN0cmwtaW50ZWwubworb2JqLSQoQ09ORklHX1BJTkNUUkxfU1VOUklTRVBPSU5UKQkrPSBwaW5jdHJsLXN1bnJpc2Vwb2ludC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1iYXl0cmFpbC5jIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtYmF5dHJhaWwuYwppbmRleCA1YWZlMDNlLi4yMDYyYzIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1iYXl0cmFpbC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLWJheXRyYWlsLmMKQEAgLTY2LDYgKzY2LDEwIEBACiAjZGVmaW5lIEJZVF9ESVJfTUFTSwkJKEJJVCgxKSB8IEJJVCgyKSkKICNkZWZpbmUgQllUX1RSSUdfTUFTSwkJKEJJVCgyNikgfCBCSVQoMjUpIHwgQklUKDI0KSkKIAorI2RlZmluZSBCWVRfQ09ORjBfUkVTVE9SRV9NQVNLCShCWVRfRElSRUNUX0lSUV9FTiB8IEJZVF9UUklHX01BU0sgfCBcCisJCQkJIEJZVF9QSU5fTVVYKQorI2RlZmluZSBCWVRfVkFMX1JFU1RPUkVfTUFTSwkoQllUX0RJUl9NQVNLIHwgQllUX0xFVkVMKQorCiAjZGVmaW5lIEJZVF9OR1BJT19TQ09SRQkJMTAyCiAjZGVmaW5lIEJZVF9OR1BJT19OQ09SRQkJMjgKICNkZWZpbmUgQllUX05HUElPX1NVUwkJNDQKQEAgLTEzNCwxMiArMTM4LDE4IEBACiAJfSwKIH07CiAKK3N0cnVjdCBieXRfZ3Bpb19waW5fY29udGV4dCB7CisJdTMyIGNvbmYwOworCXUzMiB2YWw7Cit9OworCiBzdHJ1Y3QgYnl0X2dwaW8gewogCXN0cnVjdCBncGlvX2NoaXAJCWNoaXA7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7CiAJc3BpbmxvY2tfdAkJCWxvY2s7CiAJdm9pZCBfX2lvbWVtCQkJKnJlZ19iYXNlOwogCXN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UJKnJhbmdlOworCXN0cnVjdCBieXRfZ3Bpb19waW5fY29udGV4dAkqc2F2ZWRfY29udGV4dDsKIH07CiAKICNkZWZpbmUgdG9fYnl0X2dwaW8oYykJY29udGFpbmVyX29mKGMsIHN0cnVjdCBieXRfZ3BpbywgY2hpcCkKQEAgLTE1OCw0MCArMTY4LDYyIEBACiAJcmV0dXJuIHZnLT5yZWdfYmFzZSArIHJlZ19vZmZzZXQgKyByZWc7CiB9CiAKLXN0YXRpYyBib29sIGlzX3NwZWNpYWxfcGluKHN0cnVjdCBieXRfZ3BpbyAqdmcsIHVuc2lnbmVkIG9mZnNldCkKK3N0YXRpYyB2b2lkIGJ5dF9ncGlvX2NsZWFyX3RyaWdnZXJpbmcoc3RydWN0IGJ5dF9ncGlvICp2ZywgdW5zaWduZWQgb2Zmc2V0KQoreworCXZvaWQgX19pb21lbSAqcmVnID0gYnl0X2dwaW9fcmVnKCZ2Zy0+Y2hpcCwgb2Zmc2V0LCBCWVRfQ09ORjBfUkVHKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2Zy0+bG9jaywgZmxhZ3MpOworCXZhbHVlID0gcmVhZGwocmVnKTsKKwl2YWx1ZSAmPSB+KEJZVF9UUklHX1BPUyB8IEJZVF9UUklHX05FRyB8IEJZVF9UUklHX0xWTCk7CisJd3JpdGVsKHZhbHVlLCByZWcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZnLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB1MzIgYnl0X2dldF9ncGlvX211eChzdHJ1Y3QgYnl0X2dwaW8gKnZnLCB1bnNpZ25lZCBvZmZzZXQpCiB7CiAJLyogU0NPUkUgcGluIDkyLTkzICovCiAJaWYgKCFzdHJjbXAodmctPnJhbmdlLT5uYW1lLCBCWVRfU0NPUkVfQUNQSV9VSUQpICYmCiAJCW9mZnNldCA+PSA5MiAmJiBvZmZzZXQgPD0gOTMpCi0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gMTsKIAogCS8qIFNVUyBwaW4gMTEtMjEgKi8KIAlpZiAoIXN0cmNtcCh2Zy0+cmFuZ2UtPm5hbWUsIEJZVF9TVVNfQUNQSV9VSUQpICYmCiAJCW9mZnNldCA+PSAxMSAmJiBvZmZzZXQgPD0gMjEpCi0JCXJldHVybiB0cnVlOworCQlyZXR1cm4gMTsKIAotCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBieXRfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKIHsKIAlzdHJ1Y3QgYnl0X2dwaW8gKnZnID0gdG9fYnl0X2dwaW8oY2hpcCk7CiAJdm9pZCBfX2lvbWVtICpyZWcgPSBieXRfZ3Bpb19yZWcoY2hpcCwgb2Zmc2V0LCBCWVRfQ09ORjBfUkVHKTsKLQl1MzIgdmFsdWU7Ci0JYm9vbCBzcGVjaWFsOworCXUzMiB2YWx1ZSwgZ3Bpb19tdXg7CiAKIAkvKgogCSAqIEluIG1vc3QgY2FzZXMsIGZ1bmMgcGluIG11eCAwMDAgbWVhbnMgR1BJTyBmdW5jdGlvbi4KIAkgKiBCdXQsIHNvbWUgcGlucyBtYXkgaGF2ZSBmdW5jIHBpbiBtdXggMDAxIHJlcHJlc2VudHMKLQkgKiBHUElPIGZ1bmN0aW9uLiBPbmx5IGFsbG93IHVzZXIgdG8gZXhwb3J0IHBpbiB3aXRoCi0JICogZnVuYyBwaW4gbXV4IHByZXNldCBhcyBHUElPIGZ1bmN0aW9uIGJ5IEJJT1MvRlcuCisJICogR1BJTyBmdW5jdGlvbi4KKwkgKgorCSAqIEJlY2F1c2UgdGhlcmUgYXJlIGRldmljZXMgb3V0IHRoZXJlIHdoZXJlIHNvbWUgcGlucyB3ZXJlIG5vdAorCSAqIGNvbmZpZ3VyZWQgY29ycmVjdGx5IHdlIGFsbG93IGNoYW5naW5nIHRoZSBtdXggdmFsdWUgZnJvbQorCSAqIHJlcXVlc3QgKGJ1dCBwcmludCBvdXQgd2FybmluZyBhYm91dCB0aGF0KS4KIAkgKi8KIAl2YWx1ZSA9IHJlYWRsKHJlZykgJiBCWVRfUElOX01VWDsKLQlzcGVjaWFsID0gaXNfc3BlY2lhbF9waW4odmcsIG9mZnNldCk7Ci0JaWYgKChzcGVjaWFsICYmIHZhbHVlICE9IDEpIHx8ICghc3BlY2lhbCAmJiB2YWx1ZSkpIHsKLQkJZGV2X2VycigmdmctPnBkZXYtPmRldiwKLQkJCSJwaW4gJXUgY2Fubm90IGJlIHVzZWQgYXMgR1BJTy5cbiIsIG9mZnNldCk7Ci0JCXJldHVybiAtRUlOVkFMOworCWdwaW9fbXV4ID0gYnl0X2dldF9ncGlvX211eCh2Zywgb2Zmc2V0KTsKKwlpZiAoV0FSTl9PTihncGlvX211eCAhPSB2YWx1ZSkpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdmctPmxvY2ssIGZsYWdzKTsKKwkJdmFsdWUgPSByZWFkbChyZWcpICYgfkJZVF9QSU5fTVVYOworCQl2YWx1ZSB8PSBncGlvX211eDsKKwkJd3JpdGVsKHZhbHVlLCByZWcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2Zy0+bG9jaywgZmxhZ3MpOworCisJCWRldl93YXJuKCZ2Zy0+cGRldi0+ZGV2LAorCQkJICJwaW4gJXUgZm9yY2libHkgcmUtY29uZmlndXJlZCBhcyBHUElPXG4iLCBvZmZzZXQpOwogCX0KIAogCXBtX3J1bnRpbWVfZ2V0KCZ2Zy0+cGRldi0+ZGV2KTsKQEAgLTIwMiwxNCArMjM0LDggQEAKIHN0YXRpYyB2b2lkIGJ5dF9ncGlvX2ZyZWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewogCXN0cnVjdCBieXRfZ3BpbyAqdmcgPSB0b19ieXRfZ3BpbyhjaGlwKTsKLQl2b2lkIF9faW9tZW0gKnJlZyA9IGJ5dF9ncGlvX3JlZygmdmctPmNoaXAsIG9mZnNldCwgQllUX0NPTkYwX1JFRyk7Ci0JdTMyIHZhbHVlOwogCi0JLyogY2xlYXIgaW50ZXJydXB0IHRyaWdnZXJpbmcgKi8KLQl2YWx1ZSA9IHJlYWRsKHJlZyk7Ci0JdmFsdWUgJj0gfihCWVRfVFJJR19QT1MgfCBCWVRfVFJJR19ORUcgfCBCWVRfVFJJR19MVkwpOwotCXdyaXRlbCh2YWx1ZSwgcmVnKTsKLQorCWJ5dF9ncGlvX2NsZWFyX3RyaWdnZXJpbmcodmcsIG9mZnNldCk7CiAJcG1fcnVudGltZV9wdXQoJnZnLT5wZGV2LT5kZXYpOwogfQogCkBAIC0yMzYsMjMgKzI2MiwxMyBAQAogCXZhbHVlICY9IH4oQllUX0RJUkVDVF9JUlFfRU4gfCBCWVRfVFJJR19QT1MgfCBCWVRfVFJJR19ORUcgfAogCQkgICBCWVRfVFJJR19MVkwpOwogCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgotCQl2YWx1ZSB8PSBCWVRfVFJJR19MVkw7Ci0JY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKLQkJdmFsdWUgfD0gQllUX1RSSUdfUE9TOwotCQlicmVhazsKLQljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKLQkJdmFsdWUgfD0gQllUX1RSSUdfTFZMOwotCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgotCQl2YWx1ZSB8PSBCWVRfVFJJR19ORUc7Ci0JCWJyZWFrOwotCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgotCQl2YWx1ZSB8PSAoQllUX1RSSUdfTkVHIHwgQllUX1RSSUdfUE9TKTsKLQkJYnJlYWs7Ci0JfQogCXdyaXRlbCh2YWx1ZSwgcmVnKTsKIAorCWlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9CT1RIKQorCQlfX2lycV9zZXRfaGFuZGxlcl9sb2NrZWQoZC0+aXJxLCBoYW5kbGVfZWRnZV9pcnEpOworCWVsc2UgaWYgKHR5cGUgJiBJUlFfVFlQRV9MRVZFTF9NQVNLKQorCQlfX2lycV9zZXRfaGFuZGxlcl9sb2NrZWQoZC0+aXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZnLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKQEAgLTQxMCw1OCArNDI2LDgwIEBACiAJc3RydWN0IGlycV9kYXRhICpkYXRhID0gaXJxX2Rlc2NfZ2V0X2lycV9kYXRhKGRlc2MpOwogCXN0cnVjdCBieXRfZ3BpbyAqdmcgPSB0b19ieXRfZ3BpbyhpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpKTsKIAlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXAoZGF0YSk7Ci0JdTMyIGJhc2UsIHBpbiwgbWFzazsKKwl1MzIgYmFzZSwgcGluOwogCXZvaWQgX19pb21lbSAqcmVnOwotCXUzMiBwZW5kaW5nOworCXVuc2lnbmVkIGxvbmcgcGVuZGluZzsKIAl1bnNpZ25lZCB2aXJxOwotCWludCBsb29wbGltaXQgPSAwOwogCiAJLyogY2hlY2sgZnJvbSBHUElPIGNvbnRyb2xsZXIgd2hpY2ggcGluIHRyaWdnZXJlZCB0aGUgaW50ZXJydXB0ICovCiAJZm9yIChiYXNlID0gMDsgYmFzZSA8IHZnLT5jaGlwLm5ncGlvOyBiYXNlICs9IDMyKSB7Ci0KIAkJcmVnID0gYnl0X2dwaW9fcmVnKCZ2Zy0+Y2hpcCwgYmFzZSwgQllUX0lOVF9TVEFUX1JFRyk7Ci0KLQkJd2hpbGUgKChwZW5kaW5nID0gcmVhZGwocmVnKSkpIHsKLQkJCXBpbiA9IF9fZmZzKHBlbmRpbmcpOwotCQkJbWFzayA9IEJJVChwaW4pOwotCQkJLyogQ2xlYXIgYmVmb3JlIGhhbmRsaW5nIHNvIHdlIGNhbid0IGxvc2UgYW4gZWRnZSAqLwotCQkJd3JpdGVsKG1hc2ssIHJlZyk7Ci0KKwkJcGVuZGluZyA9IHJlYWRsKHJlZyk7CisJCWZvcl9lYWNoX3NldF9iaXQocGluLCAmcGVuZGluZywgMzIpIHsKIAkJCXZpcnEgPSBpcnFfZmluZF9tYXBwaW5nKHZnLT5jaGlwLmlycWRvbWFpbiwgYmFzZSArIHBpbik7CiAJCQlnZW5lcmljX2hhbmRsZV9pcnEodmlycSk7Ci0KLQkJCS8qIEluIGNhc2UgYmlvcyBvciB1c2VyIHNldHMgdHJpZ2dlcmluZyBpbmNvcnJldGx5IGEgcGluCi0JCQkgKiBtaWdodCByZW1haW4gaW4gImludGVycnVwdCB0cmlnZ2VyZWQiIHN0YXRlLgotCQkJICovCi0JCQlpZiAobG9vcGxpbWl0KysgPiAzMikgewotCQkJCWRldl9lcnIoJnZnLT5wZGV2LT5kZXYsCi0JCQkJCSJHcGlvICVkIGludGVycnVwdCBmbG9vZCwgZGlzYWJsaW5nXG4iLAotCQkJCQliYXNlICsgcGluKTsKLQotCQkJCXJlZyA9IGJ5dF9ncGlvX3JlZygmdmctPmNoaXAsIGJhc2UgKyBwaW4sCi0JCQkJCQkgICBCWVRfQ09ORjBfUkVHKTsKLQkJCQltYXNrID0gcmVhZGwocmVnKTsKLQkJCQltYXNrICY9IH4oQllUX1RSSUdfTkVHIHwgQllUX1RSSUdfUE9TIHwKLQkJCQkJICBCWVRfVFJJR19MVkwpOwotCQkJCXdyaXRlbChtYXNrLCByZWcpOwotCQkJCW1hc2sgPSByZWFkbChyZWcpOyAvKiBmbHVzaCAqLwotCQkJCWJyZWFrOwotCQkJfQogCQl9CiAJfQogCWNoaXAtPmlycV9lb2koZGF0YSk7CiB9CiAKK3N0YXRpYyB2b2lkIGJ5dF9pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBieXRfZ3BpbyAqdmcgPSB0b19ieXRfZ3BpbyhnYyk7CisJdW5zaWduZWQgb2Zmc2V0ID0gaXJxZF90b19od2lycShkKTsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKworCXJlZyA9IGJ5dF9ncGlvX3JlZygmdmctPmNoaXAsIG9mZnNldCwgQllUX0lOVF9TVEFUX1JFRyk7CisJd3JpdGVsKEJJVChvZmZzZXQgJSAzMiksIHJlZyk7Cit9CisKIHN0YXRpYyB2b2lkIGJ5dF9pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBieXRfZ3BpbyAqdmcgPSB0b19ieXRfZ3BpbyhnYyk7CisJdW5zaWduZWQgb2Zmc2V0ID0gaXJxZF90b19od2lycShkKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZvaWQgX19pb21lbSAqcmVnOworCXUzMiB2YWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2Zy0+bG9jaywgZmxhZ3MpOworCisJcmVnID0gYnl0X2dwaW9fcmVnKCZ2Zy0+Y2hpcCwgb2Zmc2V0LCBCWVRfQ09ORjBfUkVHKTsKKwl2YWx1ZSA9IHJlYWRsKHJlZyk7CisKKwlzd2l0Y2ggKGlycWRfZ2V0X3RyaWdnZXJfdHlwZShkKSkgeworCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKKwkJdmFsdWUgfD0gQllUX1RSSUdfTFZMOworCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CisJCXZhbHVlIHw9IEJZVF9UUklHX1BPUzsKKwkJYnJlYWs7CisJY2FzZSBJUlFfVFlQRV9MRVZFTF9MT1c6CisJCXZhbHVlIHw9IEJZVF9UUklHX0xWTDsKKwljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKKwkJdmFsdWUgfD0gQllUX1RSSUdfTkVHOworCQlicmVhazsKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJdmFsdWUgfD0gKEJZVF9UUklHX05FRyB8IEJZVF9UUklHX1BPUyk7CisJCWJyZWFrOworCX0KKworCXdyaXRlbCh2YWx1ZSwgcmVnKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZnLT5sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGJ5dF9pcnFfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgYnl0X2dwaW8gKnZnID0gdG9fYnl0X2dwaW8oZ2MpOworCisJYnl0X2dwaW9fY2xlYXJfdHJpZ2dlcmluZyh2ZywgaXJxZF90b19od2lycShkKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYnl0X2lycWNoaXAgPSB7CiAJLm5hbWUgPSAiQllULUdQSU8iLAorCS5pcnFfYWNrID0gYnl0X2lycV9hY2ssCiAJLmlycV9tYXNrID0gYnl0X2lycV9tYXNrLAogCS5pcnFfdW5tYXNrID0gYnl0X2lycV91bm1hc2ssCiAJLmlycV9zZXRfdHlwZSA9IGJ5dF9pcnFfdHlwZSwKQEAgLTQ3Miw2ICs1MTAsMjEgQEAKIHsKIAl2b2lkIF9faW9tZW0gKnJlZzsKIAl1MzIgYmFzZSwgdmFsdWU7CisJaW50IGk7CisKKwkvKgorCSAqIENsZWFyIGludGVycnVwdCB0cmlnZ2VycyBmb3IgYWxsIHBpbnMgdGhhdCBhcmUgR1BJT3MgYW5kCisJICogZG8gbm90IHVzZSBkaXJlY3QgSVJRIG1vZGUuIFRoaXMgd2lsbCBwcmV2ZW50IHNwdXJpb3VzCisJICogaW50ZXJydXB0cyBmcm9tIG1pc2NvbmZpZ3VyZWQgcGlucy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmctPmNoaXAubmdwaW87IGkrKykgeworCQl2YWx1ZSA9IHJlYWRsKGJ5dF9ncGlvX3JlZygmdmctPmNoaXAsIGksIEJZVF9DT05GMF9SRUcpKTsKKwkJaWYgKCh2YWx1ZSAmIEJZVF9QSU5fTVVYKSA9PSBieXRfZ2V0X2dwaW9fbXV4KHZnLCBpKSAmJgorCQkgICAgISh2YWx1ZSAmIEJZVF9ESVJFQ1RfSVJRX0VOKSkgeworCQkJYnl0X2dwaW9fY2xlYXJfdHJpZ2dlcmluZyh2ZywgaSk7CisJCQlkZXZfZGJnKCZ2Zy0+cGRldi0+ZGV2LCAiZGlzYWJsaW5nIEdQSU8gJWRcbiIsIGkpOworCQl9CisJfQogCiAJLyogY2xlYXIgaW50ZXJydXB0IHN0YXR1cyB0cmlnZ2VyIHJlZ2lzdGVycyAqLwogCWZvciAoYmFzZSA9IDA7IGJhc2UgPCB2Zy0+Y2hpcC5uZ3BpbzsgYmFzZSArPSAzMikgewpAQCAtNTQxLDYgKzU5NCwxMSBAQAogCWdjLT5jYW5fc2xlZXAgPSBmYWxzZTsKIAlnYy0+ZGV2ID0gZGV2OwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisJdmctPnNhdmVkX2NvbnRleHQgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgZ2MtPm5ncGlvLAorCQkJCSAgICAgICBzaXplb2YoKnZnLT5zYXZlZF9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisjZW5kaWYKKwogCXJldCA9IGdwaW9jaGlwX2FkZChnYyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgYWRkaW5nIGJ5dC1ncGlvIGNoaXBcbiIpOwpAQCAtNTY5LDYgKzYyNyw2OSBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgaW50IGJ5dF9ncGlvX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgYnl0X2dwaW8gKnZnID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmctPmNoaXAubmdwaW87IGkrKykgeworCQl2b2lkIF9faW9tZW0gKnJlZzsKKwkJdTMyIHZhbHVlOworCisJCXJlZyA9IGJ5dF9ncGlvX3JlZygmdmctPmNoaXAsIGksIEJZVF9DT05GMF9SRUcpOworCQl2YWx1ZSA9IHJlYWRsKHJlZykgJiBCWVRfQ09ORjBfUkVTVE9SRV9NQVNLOworCQl2Zy0+c2F2ZWRfY29udGV4dFtpXS5jb25mMCA9IHZhbHVlOworCisJCXJlZyA9IGJ5dF9ncGlvX3JlZygmdmctPmNoaXAsIGksIEJZVF9WQUxfUkVHKTsKKwkJdmFsdWUgPSByZWFkbChyZWcpICYgQllUX1ZBTF9SRVNUT1JFX01BU0s7CisJCXZnLT5zYXZlZF9jb250ZXh0W2ldLnZhbCA9IHZhbHVlOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ5dF9ncGlvX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBieXRfZ3BpbyAqdmcgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB2Zy0+Y2hpcC5uZ3BpbzsgaSsrKSB7CisJCXZvaWQgX19pb21lbSAqcmVnOworCQl1MzIgdmFsdWU7CisKKwkJcmVnID0gYnl0X2dwaW9fcmVnKCZ2Zy0+Y2hpcCwgaSwgQllUX0NPTkYwX1JFRyk7CisJCXZhbHVlID0gcmVhZGwocmVnKTsKKwkJaWYgKCh2YWx1ZSAmIEJZVF9DT05GMF9SRVNUT1JFX01BU0spICE9CisJCSAgICAgdmctPnNhdmVkX2NvbnRleHRbaV0uY29uZjApIHsKKwkJCXZhbHVlICY9IH5CWVRfQ09ORjBfUkVTVE9SRV9NQVNLOworCQkJdmFsdWUgfD0gdmctPnNhdmVkX2NvbnRleHRbaV0uY29uZjA7CisJCQl3cml0ZWwodmFsdWUsIHJlZyk7CisJCQlkZXZfaW5mbyhkZXYsICJyZXN0b3JlZCBwaW4gJWQgY29uZjAgJSMwOHgiLCBpLCB2YWx1ZSk7CisJCX0KKworCQlyZWcgPSBieXRfZ3Bpb19yZWcoJnZnLT5jaGlwLCBpLCBCWVRfVkFMX1JFRyk7CisJCXZhbHVlID0gcmVhZGwocmVnKTsKKwkJaWYgKCh2YWx1ZSAmIEJZVF9WQUxfUkVTVE9SRV9NQVNLKSAhPQorCQkgICAgIHZnLT5zYXZlZF9jb250ZXh0W2ldLnZhbCkgeworCQkJdTMyIHY7CisKKwkJCXYgPSB2YWx1ZSAmIH5CWVRfVkFMX1JFU1RPUkVfTUFTSzsKKwkJCXYgfD0gdmctPnNhdmVkX2NvbnRleHRbaV0udmFsOworCQkJaWYgKHYgIT0gdmFsdWUpIHsKKwkJCQl3cml0ZWwodiwgcmVnKTsKKwkJCQlkZXZfZGJnKGRldiwgInJlc3RvcmVkIHBpbiAlZCB2YWwgJSMwOHhcbiIsCisJCQkJCWksIHYpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIGludCBieXRfZ3Bpb19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXJldHVybiAwOwpAQCAtNTgwLDggKzcwMSw5IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBieXRfZ3Bpb19wbV9vcHMgPSB7Ci0JLnJ1bnRpbWVfc3VzcGVuZCA9IGJ5dF9ncGlvX3J1bnRpbWVfc3VzcGVuZCwKLQkucnVudGltZV9yZXN1bWUgPSBieXRfZ3Bpb19ydW50aW1lX3Jlc3VtZSwKKwlTRVRfTEFURV9TWVNURU1fU0xFRVBfUE1fT1BTKGJ5dF9ncGlvX3N1c3BlbmQsIGJ5dF9ncGlvX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMoYnl0X2dwaW9fcnVudGltZV9zdXNwZW5kLCBieXRfZ3Bpb19ydW50aW1lX3Jlc3VtZSwKKwkJCSAgIE5VTEwpCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIGJ5dF9ncGlvX2FjcGlfbWF0Y2hbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLWNoZXJyeXZpZXcuYyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLWNoZXJyeXZpZXcuYwppbmRleCAzMDM0ZmQwLi44MmY2OTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1jaGVycnl2aWV3LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtY2hlcnJ5dmlldy5jCkBAIC0xMjI2LDYgKzEyMjYsNyBAQAogc3RhdGljIGludCBjaHZfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKIAkJCQkgICAgIGludCB2YWx1ZSkKIHsKKwljaHZfZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7CiAJcmV0dXJuIHBpbmN0cmxfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGNoaXAtPmJhc2UgKyBvZmZzZXQpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1pbnRlbC5jIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtaW50ZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDc2OGU1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtaW50ZWwuYwpAQCAtMCwwICsxLDExNDkgQEAKKy8qCisgKiBJbnRlbCBwaW5jdHJsL0dQSU8gY29yZSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yczogTWF0aGlhcyBOeW1hbiA8bWF0aGlhcy5ueW1hbkBsaW51eC5pbnRlbC5jb20+CisgKiAgICAgICAgICBNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0BsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY3RybC5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGlubXV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLWdlbmVyaWMuaD4KKworI2luY2x1ZGUgInBpbmN0cmwtaW50ZWwuaCIKKworLyogTWF4aW11bSBudW1iZXIgb2YgcGFkcyBpbiBlYWNoIGdyb3VwICovCisjZGVmaW5lIE5QQURTX0lOX0dQUAkJCTI0CisKKy8qIE9mZnNldCBmcm9tIHJlZ3MgKi8KKyNkZWZpbmUgUEFEQkFSCQkJCTB4MDBjCisjZGVmaW5lIEdQSV9JUwkJCQkweDEwMAorI2RlZmluZSBHUElfR1BFX1NUUwkJCTB4MTQwCisjZGVmaW5lIEdQSV9HUEVfRU4JCQkweDE2MAorCisjZGVmaW5lIFBBRE9XTl9CSVRTCQkJNAorI2RlZmluZSBQQURPV05fU0hJRlQocCkJCQkoKHApICUgOCAqIFBBRE9XTl9CSVRTKQorI2RlZmluZSBQQURPV05fTUFTSyhwKQkJCSgweGYgPDwgUEFET1dOX1NISUZUKHApKQorCisvKiBPZmZzZXQgZnJvbSBwYWRfcmVncyAqLworI2RlZmluZSBQQURDRkcwCQkJCTB4MDAwCisjZGVmaW5lIFBBRENGRzBfUlhFVkNGR19TSElGVAkJMjUKKyNkZWZpbmUgUEFEQ0ZHMF9SWEVWQ0ZHX01BU0sJCSgzIDw8IFBBRENGRzBfUlhFVkNGR19TSElGVCkKKyNkZWZpbmUgUEFEQ0ZHMF9SWEVWQ0ZHX0xFVkVMCQkwCisjZGVmaW5lIFBBRENGRzBfUlhFVkNGR19FREdFCQkxCisjZGVmaW5lIFBBRENGRzBfUlhFVkNGR19ESVNBQkxFRAkyCisjZGVmaW5lIFBBRENGRzBfUlhFVkNGR19FREdFX0JPVEgJMworI2RlZmluZSBQQURDRkcwX1JYSU5WCQkJQklUKDIzKQorI2RlZmluZSBQQURDRkcwX0dQSVJPVVRJT1hBUElDCQlCSVQoMjApCisjZGVmaW5lIFBBRENGRzBfR1BJUk9VVFNDSQkJQklUKDE5KQorI2RlZmluZSBQQURDRkcwX0dQSVJPVVRTTUkJCUJJVCgxOCkKKyNkZWZpbmUgUEFEQ0ZHMF9HUElST1VUTk1JCQlCSVQoMTcpCisjZGVmaW5lIFBBRENGRzBfUE1PREVfU0hJRlQJCTEwCisjZGVmaW5lIFBBRENGRzBfUE1PREVfTUFTSwkJKDB4ZiA8PCBQQURDRkcwX1BNT0RFX1NISUZUKQorI2RlZmluZSBQQURDRkcwX0dQSU9SWERJUwkJQklUKDkpCisjZGVmaW5lIFBBRENGRzBfR1BJT1RYRElTCQlCSVQoOCkKKyNkZWZpbmUgUEFEQ0ZHMF9HUElPUlhTVEFURQkJQklUKDEpCisjZGVmaW5lIFBBRENGRzBfR1BJT1RYU1RBVEUJCUJJVCgwKQorCisjZGVmaW5lIFBBRENGRzEJCQkJMHgwMDQKKyNkZWZpbmUgUEFEQ0ZHMV9URVJNX1VQCQkJQklUKDEzKQorI2RlZmluZSBQQURDRkcxX1RFUk1fU0hJRlQJCTEwCisjZGVmaW5lIFBBRENGRzFfVEVSTV9NQVNLCQkoNyA8PCBQQURDRkcxX1RFUk1fU0hJRlQpCisjZGVmaW5lIFBBRENGRzFfVEVSTV8yMEsJCTQKKyNkZWZpbmUgUEFEQ0ZHMV9URVJNXzJLCQkJMworI2RlZmluZSBQQURDRkcxX1RFUk1fNUsJCQkyCisjZGVmaW5lIFBBRENGRzFfVEVSTV8xSwkJCTEKKworc3RydWN0IGludGVsX3BhZF9jb250ZXh0IHsKKwl1MzIgcGFkY2ZnMDsKKwl1MzIgcGFkY2ZnMTsKK307CisKK3N0cnVjdCBpbnRlbF9jb21tdW5pdHlfY29udGV4dCB7CisJdTMyICppbnRtYXNrOworfTsKKworc3RydWN0IGludGVsX3BpbmN0cmxfY29udGV4dCB7CisJc3RydWN0IGludGVsX3BhZF9jb250ZXh0ICpwYWRzOworCXN0cnVjdCBpbnRlbF9jb21tdW5pdHlfY29udGV4dCAqY29tbXVuaXRpZXM7Cit9OworCisvKioKKyAqIHN0cnVjdCBpbnRlbF9waW5jdHJsIC0gSW50ZWwgcGluY3RybCBwcml2YXRlIHN0cnVjdHVyZQorICogQGRldjogUG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZQorICogQGxvY2s6IExvY2sgdG8gc2VyaWFsaXplIHJlZ2lzdGVyIGFjY2VzcworICogQHBjdGxkZXNjOiBQaW4gY29udHJvbGxlciBkZXNjcmlwdGlvbgorICogQHBjdGxkZXY6IFBvaW50ZXIgdG8gdGhlIHBpbiBjb250cm9sbGVyIGRldmljZQorICogQGNoaXA6IEdQSU8gY2hpcCBpbiB0aGlzIHBpbiBjb250cm9sbGVyCisgKiBAc29jOiBTb0MvUENIIHNwZWNpZmljIHBpbiBjb25maWd1cmF0aW9uIGRhdGEKKyAqIEBjb21tdW5pdGllczogQWxsIGNvbW11bml0aWVzIGluIHRoaXMgcGluIGNvbnRyb2xsZXIKKyAqIEBuY29tbXVuaXRpZXM6IE51bWJlciBvZiBjb21tdW5pdGllcyBpbiB0aGlzIHBpbiBjb250cm9sbGVyCisgKiBAY29udGV4dDogQ29uZmlndXJhdGlvbiBzYXZlZCBvdmVyIHN5c3RlbSBzbGVlcAorICovCitzdHJ1Y3QgaW50ZWxfcGluY3RybCB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgcGluY3RybF9kZXNjIHBjdGxkZXNjOworCXN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldjsKKwlzdHJ1Y3QgZ3Bpb19jaGlwIGNoaXA7CisJY29uc3Qgc3RydWN0IGludGVsX3BpbmN0cmxfc29jX2RhdGEgKnNvYzsKKwlzdHJ1Y3QgaW50ZWxfY29tbXVuaXR5ICpjb21tdW5pdGllczsKKwlzaXplX3QgbmNvbW11bml0aWVzOworCXN0cnVjdCBpbnRlbF9waW5jdHJsX2NvbnRleHQgY29udGV4dDsKK307CisKKyNkZWZpbmUgZ3Bpb2NoaXBfdG9fcGluY3RybChjKQljb250YWluZXJfb2YoYywgc3RydWN0IGludGVsX3BpbmN0cmwsIGNoaXApCisjZGVmaW5lIHBpbl90b19wYWRubyhjLCBwKQkoKHApIC0gKGMpLT5waW5fYmFzZSkKKworc3RhdGljIHN0cnVjdCBpbnRlbF9jb21tdW5pdHkgKmludGVsX2dldF9jb21tdW5pdHkoc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsLAorCQkJCQkJICAgdW5zaWduZWQgcGluKQoreworCXN0cnVjdCBpbnRlbF9jb21tdW5pdHkgKmNvbW11bml0eTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwY3RybC0+bmNvbW11bml0aWVzOyBpKyspIHsKKwkJY29tbXVuaXR5ID0gJnBjdHJsLT5jb21tdW5pdGllc1tpXTsKKwkJaWYgKHBpbiA+PSBjb21tdW5pdHktPnBpbl9iYXNlICYmCisJCSAgICBwaW4gPCBjb21tdW5pdHktPnBpbl9iYXNlICsgY29tbXVuaXR5LT5ucGlucykKKwkJCXJldHVybiBjb21tdW5pdHk7CisJfQorCisJZGV2X3dhcm4ocGN0cmwtPmRldiwgImZhaWxlZCB0byBmaW5kIGNvbW11bml0eSBmb3IgcGluICV1XG4iLCBwaW4pOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBfX2lvbWVtICppbnRlbF9nZXRfcGFkY2ZnKHN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCwgdW5zaWduZWQgcGluLAorCQkJCSAgICAgIHVuc2lnbmVkIHJlZykKK3sKKwljb25zdCBzdHJ1Y3QgaW50ZWxfY29tbXVuaXR5ICpjb21tdW5pdHk7CisJdW5zaWduZWQgcGFkbm87CisKKwljb21tdW5pdHkgPSBpbnRlbF9nZXRfY29tbXVuaXR5KHBjdHJsLCBwaW4pOworCWlmICghY29tbXVuaXR5KQorCQlyZXR1cm4gTlVMTDsKKworCXBhZG5vID0gcGluX3RvX3BhZG5vKGNvbW11bml0eSwgcGluKTsKKwlyZXR1cm4gY29tbXVuaXR5LT5wYWRfcmVncyArIHJlZyArIHBhZG5vICogODsKK30KKworc3RhdGljIGJvb2wgaW50ZWxfcGFkX293bmVkX2J5X2hvc3Qoc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsLCB1bnNpZ25lZCBwaW4pCit7CisJY29uc3Qgc3RydWN0IGludGVsX2NvbW11bml0eSAqY29tbXVuaXR5OworCXVuc2lnbmVkIHBhZG5vLCBncHAsIGdwcF9vZmZzZXQsIG9mZnNldDsKKwl2b2lkIF9faW9tZW0gKnBhZG93bjsKKworCWNvbW11bml0eSA9IGludGVsX2dldF9jb21tdW5pdHkocGN0cmwsIHBpbik7CisJaWYgKCFjb21tdW5pdHkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoIWNvbW11bml0eS0+cGFkb3duX29mZnNldCkKKwkJcmV0dXJuIHRydWU7CisKKwlwYWRubyA9IHBpbl90b19wYWRubyhjb21tdW5pdHksIHBpbik7CisJZ3BwID0gcGFkbm8gLyBOUEFEU19JTl9HUFA7CisJZ3BwX29mZnNldCA9IHBhZG5vICUgTlBBRFNfSU5fR1BQOworCW9mZnNldCA9IGNvbW11bml0eS0+cGFkb3duX29mZnNldCArIGdwcCAqIDE2ICsgKGdwcF9vZmZzZXQgLyA4KSAqIDQ7CisJcGFkb3duID0gY29tbXVuaXR5LT5yZWdzICsgb2Zmc2V0OworCisJcmV0dXJuICEocmVhZGwocGFkb3duKSAmIFBBRE9XTl9NQVNLKHBhZG5vKSk7Cit9CisKK3N0YXRpYyBib29sIGludGVsX3BhZF9yZXNlcnZlZF9mb3JfYWNwaShzdHJ1Y3QgaW50ZWxfcGluY3RybCAqcGN0cmwsCisJCQkJCXVuc2lnbmVkIHBpbikKK3sKKwljb25zdCBzdHJ1Y3QgaW50ZWxfY29tbXVuaXR5ICpjb21tdW5pdHk7CisJdW5zaWduZWQgcGFkbm8sIGdwcCwgb2Zmc2V0OworCXZvaWQgX19pb21lbSAqaG9zdG93bjsKKworCWNvbW11bml0eSA9IGludGVsX2dldF9jb21tdW5pdHkocGN0cmwsIHBpbik7CisJaWYgKCFjb21tdW5pdHkpCisJCXJldHVybiB0cnVlOworCWlmICghY29tbXVuaXR5LT5ob3N0b3duX29mZnNldCkKKwkJcmV0dXJuIGZhbHNlOworCisJcGFkbm8gPSBwaW5fdG9fcGFkbm8oY29tbXVuaXR5LCBwaW4pOworCWdwcCA9IHBhZG5vIC8gTlBBRFNfSU5fR1BQOworCW9mZnNldCA9IGNvbW11bml0eS0+aG9zdG93bl9vZmZzZXQgKyBncHAgKiA0OworCWhvc3Rvd24gPSBjb21tdW5pdHktPnJlZ3MgKyBvZmZzZXQ7CisKKwlyZXR1cm4gIShyZWFkbChob3N0b3duKSAmIEJJVChwYWRubyAlIE5QQURTX0lOX0dQUCkpOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9wYWRfbG9ja2VkKHN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCwgdW5zaWduZWQgcGluKQoreworCXN0cnVjdCBpbnRlbF9jb21tdW5pdHkgKmNvbW11bml0eTsKKwl1bnNpZ25lZCBwYWRubywgZ3BwLCBvZmZzZXQ7CisJdTMyIHZhbHVlOworCisJY29tbXVuaXR5ID0gaW50ZWxfZ2V0X2NvbW11bml0eShwY3RybCwgcGluKTsKKwlpZiAoIWNvbW11bml0eSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKCFjb21tdW5pdHktPnBhZGNmZ2xvY2tfb2Zmc2V0KQorCQlyZXR1cm4gZmFsc2U7CisKKwlwYWRubyA9IHBpbl90b19wYWRubyhjb21tdW5pdHksIHBpbik7CisJZ3BwID0gcGFkbm8gLyBOUEFEU19JTl9HUFA7CisKKwkvKgorCSAqIElmIFBBRENGR0xPQ0sgYW5kIFBBRENGR0xPQ0tUWCBiaXRzIGFyZSBib3RoIGNsZWFyIGZvciB0aGlzIHBhZCwKKwkgKiB0aGUgcGFkIGlzIGNvbnNpZGVyZWQgdW5sb2NrZWQuIEFueSBvdGhlciBjYXNlIG1lYW5zIHRoYXQgaXQgaXMKKwkgKiBlaXRoZXIgZnVsbHkgb3IgcGFydGlhbGx5IGxvY2tlZCBhbmQgd2UgZG9uJ3QgdG91Y2ggaXQuCisJICovCisJb2Zmc2V0ID0gY29tbXVuaXR5LT5wYWRjZmdsb2NrX29mZnNldCArIGdwcCAqIDg7CisJdmFsdWUgPSByZWFkbChjb21tdW5pdHktPnJlZ3MgKyBvZmZzZXQpOworCWlmICh2YWx1ZSAmIEJJVChwaW4gJSBOUEFEU19JTl9HUFApKQorCQlyZXR1cm4gdHJ1ZTsKKworCW9mZnNldCA9IGNvbW11bml0eS0+cGFkY2ZnbG9ja19vZmZzZXQgKyA0ICsgZ3BwICogODsKKwl2YWx1ZSA9IHJlYWRsKGNvbW11bml0eS0+cmVncyArIG9mZnNldCk7CisJaWYgKHZhbHVlICYgQklUKHBpbiAlIE5QQURTX0lOX0dQUCkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBpbnRlbF9wYWRfdXNhYmxlKHN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCwgdW5zaWduZWQgcGluKQoreworCXJldHVybiBpbnRlbF9wYWRfb3duZWRfYnlfaG9zdChwY3RybCwgcGluKSAmJgorCQkhaW50ZWxfcGFkX3Jlc2VydmVkX2Zvcl9hY3BpKHBjdHJsLCBwaW4pICYmCisJCSFpbnRlbF9wYWRfbG9ja2VkKHBjdHJsLCBwaW4pOworfQorCitzdGF0aWMgaW50IGludGVsX2dldF9ncm91cHNfY291bnQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2KQoreworCXN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJcmV0dXJuIHBjdHJsLT5zb2MtPm5ncm91cHM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICppbnRlbF9nZXRfZ3JvdXBfbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICAgICAgdW5zaWduZWQgZ3JvdXApCit7CisJc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisKKwlyZXR1cm4gcGN0cmwtPnNvYy0+Z3JvdXBzW2dyb3VwXS5uYW1lOworfQorCitzdGF0aWMgaW50IGludGVsX2dldF9ncm91cF9waW5zKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgdW5zaWduZWQgZ3JvdXAsCisJCQkgICAgICBjb25zdCB1bnNpZ25lZCAqKnBpbnMsIHVuc2lnbmVkICpucGlucykKK3sKKwlzdHJ1Y3QgaW50ZWxfcGluY3RybCAqcGN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCSpwaW5zID0gcGN0cmwtPnNvYy0+Z3JvdXBzW2dyb3VwXS5waW5zOworCSpucGlucyA9IHBjdHJsLT5zb2MtPmdyb3Vwc1tncm91cF0ubnBpbnM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3Bpbl9kYmdfc2hvdyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHN0cnVjdCBzZXFfZmlsZSAqcywKKwkJCSAgICAgICB1bnNpZ25lZCBwaW4pCit7CisJc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisJdTMyIGNmZzAsIGNmZzEsIG1vZGU7CisJYm9vbCBsb2NrZWQsIGFjcGk7CisKKwlpZiAoIWludGVsX3BhZF9vd25lZF9ieV9ob3N0KHBjdHJsLCBwaW4pKSB7CisJCXNlcV9wdXRzKHMsICJub3QgYXZhaWxhYmxlIik7CisJCXJldHVybjsKKwl9CisKKwljZmcwID0gcmVhZGwoaW50ZWxfZ2V0X3BhZGNmZyhwY3RybCwgcGluLCBQQURDRkcwKSk7CisJY2ZnMSA9IHJlYWRsKGludGVsX2dldF9wYWRjZmcocGN0cmwsIHBpbiwgUEFEQ0ZHMSkpOworCisJbW9kZSA9IChjZmcwICYgUEFEQ0ZHMF9QTU9ERV9NQVNLKSA+PiBQQURDRkcwX1BNT0RFX1NISUZUOworCWlmICghbW9kZSkKKwkJc2VxX3B1dHMocywgIkdQSU8gIik7CisJZWxzZQorCQlzZXFfcHJpbnRmKHMsICJtb2RlICVkICIsIG1vZGUpOworCisJc2VxX3ByaW50ZihzLCAiMHglMDh4IDB4JTA4eCIsIGNmZzAsIGNmZzEpOworCisJbG9ja2VkID0gaW50ZWxfcGFkX2xvY2tlZChwY3RybCwgcGluKTsKKwlhY3BpID0gaW50ZWxfcGFkX3Jlc2VydmVkX2Zvcl9hY3BpKHBjdHJsLCBwaW4pOworCisJaWYgKGxvY2tlZCB8fCBhY3BpKSB7CisJCXNlcV9wdXRzKHMsICIgWyIpOworCQlpZiAobG9ja2VkKSB7CisJCQlzZXFfcHV0cyhzLCAiTE9DS0VEIik7CisJCQlpZiAoYWNwaSkKKwkJCQlzZXFfcHV0cyhzLCAiLCAiKTsKKwkJfQorCQlpZiAoYWNwaSkKKwkJCXNlcV9wdXRzKHMsICJBQ1BJIik7CisJCXNlcV9wdXRzKHMsICJdIik7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfb3BzIGludGVsX3BpbmN0cmxfb3BzID0geworCS5nZXRfZ3JvdXBzX2NvdW50ID0gaW50ZWxfZ2V0X2dyb3Vwc19jb3VudCwKKwkuZ2V0X2dyb3VwX25hbWUgPSBpbnRlbF9nZXRfZ3JvdXBfbmFtZSwKKwkuZ2V0X2dyb3VwX3BpbnMgPSBpbnRlbF9nZXRfZ3JvdXBfcGlucywKKwkucGluX2RiZ19zaG93ID0gaW50ZWxfcGluX2RiZ19zaG93LAorfTsKKworc3RhdGljIGludCBpbnRlbF9nZXRfZnVuY3Rpb25zX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldikKK3sKKwlzdHJ1Y3QgaW50ZWxfcGluY3RybCAqcGN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCXJldHVybiBwY3RybC0+c29jLT5uZnVuY3Rpb25zOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqaW50ZWxfZ2V0X2Z1bmN0aW9uX25hbWUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJCQkgICB1bnNpZ25lZCBmdW5jdGlvbikKK3sKKwlzdHJ1Y3QgaW50ZWxfcGluY3RybCAqcGN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCXJldHVybiBwY3RybC0+c29jLT5mdW5jdGlvbnNbZnVuY3Rpb25dLm5hbWU7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfZ2V0X2Z1bmN0aW9uX2dyb3VwcyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICAgICB1bnNpZ25lZCBmdW5jdGlvbiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqKmdyb3VwcywKKwkJCQkgICAgIHVuc2lnbmVkICogY29uc3Qgbmdyb3VwcykKK3sKKwlzdHJ1Y3QgaW50ZWxfcGluY3RybCAqcGN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCSpncm91cHMgPSBwY3RybC0+c29jLT5mdW5jdGlvbnNbZnVuY3Rpb25dLmdyb3VwczsKKwkqbmdyb3VwcyA9IHBjdHJsLT5zb2MtPmZ1bmN0aW9uc1tmdW5jdGlvbl0ubmdyb3VwczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF9waW5tdXhfc2V0X211eChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIGZ1bmN0aW9uLAorCQkJCXVuc2lnbmVkIGdyb3VwKQoreworCXN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCWNvbnN0IHN0cnVjdCBpbnRlbF9waW5ncm91cCAqZ3JwID0gJnBjdHJsLT5zb2MtPmdyb3Vwc1tncm91cF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBBbGwgcGlucyBpbiB0aGUgZ3JvdXBzIG5lZWRzIHRvIGJlIGFjY2Vzc2libGUgYW5kIHdyaXRhYmxlCisJICogYmVmb3JlIHdlIGNhbiBlbmFibGUgdGhlIG11eCBmb3IgdGhpcyBncm91cC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZ3JwLT5ucGluczsgaSsrKSB7CisJCWlmICghaW50ZWxfcGFkX3VzYWJsZShwY3RybCwgZ3JwLT5waW5zW2ldKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwkvKiBOb3cgZW5hYmxlIHRoZSBtdXggc2V0dGluZyBmb3IgZWFjaCBwaW4gaW4gdGhlIGdyb3VwICovCisJZm9yIChpID0gMDsgaSA8IGdycC0+bnBpbnM7IGkrKykgeworCQl2b2lkIF9faW9tZW0gKnBhZGNmZzA7CisJCXUzMiB2YWx1ZTsKKworCQlwYWRjZmcwID0gaW50ZWxfZ2V0X3BhZGNmZyhwY3RybCwgZ3JwLT5waW5zW2ldLCBQQURDRkcwKTsKKwkJdmFsdWUgPSByZWFkbChwYWRjZmcwKTsKKworCQl2YWx1ZSAmPSB+UEFEQ0ZHMF9QTU9ERV9NQVNLOworCQl2YWx1ZSB8PSBncnAtPm1vZGUgPDwgUEFEQ0ZHMF9QTU9ERV9TSElGVDsKKworCQl3cml0ZWwodmFsdWUsIHBhZGNmZzApOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF9ncGlvX3JlcXVlc3RfZW5hYmxlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQkgICAgIHN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgKnJhbmdlLAorCQkJCSAgICAgdW5zaWduZWQgcGluKQoreworCXN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCXZvaWQgX19pb21lbSAqcGFkY2ZnMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFpbnRlbF9wYWRfdXNhYmxlKHBjdHJsLCBwaW4pKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcGFkY2ZnMCA9IGludGVsX2dldF9wYWRjZmcocGN0cmwsIHBpbiwgUEFEQ0ZHMCk7CisJLyogUHV0IHRoZSBwYWQgaW50byBHUElPIG1vZGUgKi8KKwl2YWx1ZSA9IHJlYWRsKHBhZGNmZzApICYgflBBRENGRzBfUE1PREVfTUFTSzsKKwkvKiBEaXNhYmxlIFNDSS9TTUkvTk1JIGdlbmVyYXRpb24gKi8KKwl2YWx1ZSAmPSB+KFBBRENGRzBfR1BJUk9VVElPWEFQSUMgfCBQQURDRkcwX0dQSVJPVVRTQ0kpOworCXZhbHVlICY9IH4oUEFEQ0ZHMF9HUElST1VUU01JIHwgUEFEQ0ZHMF9HUElST1VUTk1JKTsKKwkvKiBEaXNhYmxlIFRYIGJ1ZmZlciBhbmQgZW5hYmxlIFJYICh0aGlzIHdpbGwgYmUgaW5wdXQpICovCisJdmFsdWUgJj0gflBBRENGRzBfR1BJT1JYRElTOworCXZhbHVlIHw9IFBBRENGRzBfR1BJT1RYRElTOworCXdyaXRlbCh2YWx1ZSwgcGFkY2ZnMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3RybC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfZ3Bpb19zZXRfZGlyZWN0aW9uKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQkgICAgc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSAqcmFuZ2UsCisJCQkJICAgIHVuc2lnbmVkIHBpbiwgYm9vbCBpbnB1dCkKK3sKKwlzdHJ1Y3QgaW50ZWxfcGluY3RybCAqcGN0cmwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKwl2b2lkIF9faW9tZW0gKnBhZGNmZzA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsdWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKKworCXBhZGNmZzAgPSBpbnRlbF9nZXRfcGFkY2ZnKHBjdHJsLCBwaW4sIFBBRENGRzApOworCisJdmFsdWUgPSByZWFkbChwYWRjZmcwKTsKKwlpZiAoaW5wdXQpCisJCXZhbHVlIHw9IFBBRENGRzBfR1BJT1RYRElTOworCWVsc2UKKwkJdmFsdWUgJj0gflBBRENGRzBfR1BJT1RYRElTOworCXdyaXRlbCh2YWx1ZSwgcGFkY2ZnMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3RybC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGlubXV4X29wcyBpbnRlbF9waW5tdXhfb3BzID0geworCS5nZXRfZnVuY3Rpb25zX2NvdW50ID0gaW50ZWxfZ2V0X2Z1bmN0aW9uc19jb3VudCwKKwkuZ2V0X2Z1bmN0aW9uX25hbWUgPSBpbnRlbF9nZXRfZnVuY3Rpb25fbmFtZSwKKwkuZ2V0X2Z1bmN0aW9uX2dyb3VwcyA9IGludGVsX2dldF9mdW5jdGlvbl9ncm91cHMsCisJLnNldF9tdXggPSBpbnRlbF9waW5tdXhfc2V0X211eCwKKwkuZ3Bpb19yZXF1ZXN0X2VuYWJsZSA9IGludGVsX2dwaW9fcmVxdWVzdF9lbmFibGUsCisJLmdwaW9fc2V0X2RpcmVjdGlvbiA9IGludGVsX2dwaW9fc2V0X2RpcmVjdGlvbiwKK307CisKK3N0YXRpYyBpbnQgaW50ZWxfY29uZmlnX2dldChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIHBpbiwKKwkJCSAgICB1bnNpZ25lZCBsb25nICpjb25maWcpCit7CisJc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisJZW51bSBwaW5fY29uZmlnX3BhcmFtIHBhcmFtID0gcGluY29uZl90b19jb25maWdfcGFyYW0oKmNvbmZpZyk7CisJdTMyIHZhbHVlLCB0ZXJtOworCXUxNiBhcmcgPSAwOworCisJaWYgKCFpbnRlbF9wYWRfb3duZWRfYnlfaG9zdChwY3RybCwgcGluKSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXZhbHVlID0gcmVhZGwoaW50ZWxfZ2V0X3BhZGNmZyhwY3RybCwgcGluLCBQQURDRkcxKSk7CisJdGVybSA9ICh2YWx1ZSAmIFBBRENGRzFfVEVSTV9NQVNLKSA+PiBQQURDRkcxX1RFUk1fU0hJRlQ7CisKKwlzd2l0Y2ggKHBhcmFtKSB7CisJY2FzZSBQSU5fQ09ORklHX0JJQVNfRElTQUJMRToKKwkJaWYgKHRlcm0pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX1VQOgorCQlpZiAoIXRlcm0gfHwgISh2YWx1ZSAmIFBBRENGRzFfVEVSTV9VUCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKHRlcm0pIHsKKwkJY2FzZSBQQURDRkcxX1RFUk1fMUs6CisJCQlhcmcgPSAxMDAwOworCQkJYnJlYWs7CisJCWNhc2UgUEFEQ0ZHMV9URVJNXzJLOgorCQkJYXJnID0gMjAwMDsKKwkJCWJyZWFrOworCQljYXNlIFBBRENGRzFfVEVSTV81SzoKKwkJCWFyZyA9IDUwMDA7CisJCQlicmVhazsKKwkJY2FzZSBQQURDRkcxX1RFUk1fMjBLOgorCQkJYXJnID0gMjAwMDA7CisJCQlicmVhazsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9ET1dOOgorCQlpZiAoIXRlcm0gfHwgdmFsdWUgJiBQQURDRkcxX1RFUk1fVVApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKHRlcm0pIHsKKwkJY2FzZSBQQURDRkcxX1RFUk1fNUs6CisJCQlhcmcgPSA1MDAwOworCQkJYnJlYWs7CisJCWNhc2UgUEFEQ0ZHMV9URVJNXzIwSzoKKwkJCWFyZyA9IDIwMDAwOworCQkJYnJlYWs7CisJCX0KKworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJKmNvbmZpZyA9IHBpbmNvbmZfdG9fY29uZmlnX3BhY2tlZChwYXJhbSwgYXJnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF9jb25maWdfc2V0X3B1bGwoc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsLCB1bnNpZ25lZCBwaW4sCisJCQkJIHVuc2lnbmVkIGxvbmcgY29uZmlnKQoreworCXVuc2lnbmVkIHBhcmFtID0gcGluY29uZl90b19jb25maWdfcGFyYW0oY29uZmlnKTsKKwl1bnNpZ25lZCBhcmcgPSBwaW5jb25mX3RvX2NvbmZpZ19hcmd1bWVudChjb25maWcpOworCXZvaWQgX19pb21lbSAqcGFkY2ZnMTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCXUzMiB2YWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOworCisJcGFkY2ZnMSA9IGludGVsX2dldF9wYWRjZmcocGN0cmwsIHBpbiwgUEFEQ0ZHMSk7CisJdmFsdWUgPSByZWFkbChwYWRjZmcxKTsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIFBJTl9DT05GSUdfQklBU19ESVNBQkxFOgorCQl2YWx1ZSAmPSB+KFBBRENGRzFfVEVSTV9NQVNLIHwgUEFEQ0ZHMV9URVJNX1VQKTsKKwkJYnJlYWs7CisKKwljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX1VQOgorCQl2YWx1ZSAmPSB+UEFEQ0ZHMV9URVJNX01BU0s7CisKKwkJdmFsdWUgfD0gUEFEQ0ZHMV9URVJNX1VQOworCisJCXN3aXRjaCAoYXJnKSB7CisJCWNhc2UgMjAwMDA6CisJCQl2YWx1ZSB8PSBQQURDRkcxX1RFUk1fMjBLIDw8IFBBRENGRzFfVEVSTV9TSElGVDsKKwkJCWJyZWFrOworCQljYXNlIDUwMDA6CisJCQl2YWx1ZSB8PSBQQURDRkcxX1RFUk1fNUsgPDwgUEFEQ0ZHMV9URVJNX1NISUZUOworCQkJYnJlYWs7CisJCWNhc2UgMjAwMDoKKwkJCXZhbHVlIHw9IFBBRENGRzFfVEVSTV8ySyA8PCBQQURDRkcxX1RFUk1fU0hJRlQ7CisJCQlicmVhazsKKwkJY2FzZSAxMDAwOgorCQkJdmFsdWUgfD0gUEFEQ0ZHMV9URVJNXzFLIDw8IFBBRENGRzFfVEVSTV9TSElGVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9ET1dOOgorCQl2YWx1ZSAmPSB+KFBBRENGRzFfVEVSTV9VUCB8IFBBRENGRzFfVEVSTV9NQVNLKTsKKworCQlzd2l0Y2ggKGFyZykgeworCQljYXNlIDIwMDAwOgorCQkJdmFsdWUgfD0gUEFEQ0ZHMV9URVJNXzIwSyA8PCBQQURDRkcxX1RFUk1fU0hJRlQ7CisJCQlicmVhazsKKwkJY2FzZSA1MDAwOgorCQkJdmFsdWUgfD0gUEFEQ0ZHMV9URVJNXzVLIDw8IFBBRENGRzFfVEVSTV9TSElGVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCisJCWJyZWFrOworCX0KKworCWlmICghcmV0KQorCQl3cml0ZWwodmFsdWUsIHBhZGNmZzEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfY29uZmlnX3NldChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIHBpbiwKKwkJCSAgdW5zaWduZWQgbG9uZyAqY29uZmlncywgdW5zaWduZWQgbmNvbmZpZ3MpCit7CisJc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisJaW50IGksIHJldDsKKworCWlmICghaW50ZWxfcGFkX3VzYWJsZShwY3RybCwgcGluKSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCWZvciAoaSA9IDA7IGkgPCBuY29uZmlnczsgaSsrKSB7CisJCXN3aXRjaCAocGluY29uZl90b19jb25maWdfcGFyYW0oY29uZmlnc1tpXSkpIHsKKwkJY2FzZSBQSU5fQ09ORklHX0JJQVNfRElTQUJMRToKKwkJY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9VUDoKKwkJY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9ET1dOOgorCQkJcmV0ID0gaW50ZWxfY29uZmlnX3NldF9wdWxsKHBjdHJsLCBwaW4sIGNvbmZpZ3NbaV0pOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRU5PVFNVUFA7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jb25mX29wcyBpbnRlbF9waW5jb25mX29wcyA9IHsKKwkuaXNfZ2VuZXJpYyA9IHRydWUsCisJLnBpbl9jb25maWdfZ2V0ID0gaW50ZWxfY29uZmlnX2dldCwKKwkucGluX2NvbmZpZ19zZXQgPSBpbnRlbF9jb25maWdfc2V0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX2Rlc2MgaW50ZWxfcGluY3RybF9kZXNjID0geworCS5wY3Rsb3BzID0gJmludGVsX3BpbmN0cmxfb3BzLAorCS5wbXhvcHMgPSAmaW50ZWxfcGlubXV4X29wcywKKwkuY29uZm9wcyA9ICZpbnRlbF9waW5jb25mX29wcywKKwkub3duZXIgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgaW50ZWxfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gcGluY3RybF9yZXF1ZXN0X2dwaW8oY2hpcC0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2dwaW9fZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcGluY3RybF9mcmVlX2dwaW8oY2hpcC0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCA9IGdwaW9jaGlwX3RvX3BpbmN0cmwoY2hpcCk7CisJdm9pZCBfX2lvbWVtICpyZWc7CisKKwlyZWcgPSBpbnRlbF9nZXRfcGFkY2ZnKHBjdHJsLCBvZmZzZXQsIFBBRENGRzApOworCWlmICghcmVnKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAhIShyZWFkbChyZWcpICYgUEFEQ0ZHMF9HUElPUlhTVEFURSk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCA9IGdwaW9jaGlwX3RvX3BpbmN0cmwoY2hpcCk7CisJdm9pZCBfX2lvbWVtICpyZWc7CisKKwlyZWcgPSBpbnRlbF9nZXRfcGFkY2ZnKHBjdHJsLCBvZmZzZXQsIFBBRENGRzApOworCWlmIChyZWcpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJdTMyIHBhZGNmZzA7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnBjdHJsLT5sb2NrLCBmbGFncyk7CisJCXBhZGNmZzAgPSByZWFkbChyZWcpOworCQlpZiAodmFsdWUpCisJCQlwYWRjZmcwIHw9IFBBRENGRzBfR1BJT1RYU1RBVEU7CisJCWVsc2UKKwkJCXBhZGNmZzAgJj0gflBBRENGRzBfR1BJT1RYU1RBVEU7CisJCXdyaXRlbChwYWRjZmcwLCByZWcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3RybC0+bG9jaywgZmxhZ3MpOworCX0KK30KKworc3RhdGljIGludCBpbnRlbF9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIHBpbmN0cmxfZ3Bpb19kaXJlY3Rpb25faW5wdXQoY2hpcC0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwKKwkJCQkgICAgICAgaW50IHZhbHVlKQoreworCWludGVsX2dwaW9fc2V0KGNoaXAsIG9mZnNldCwgdmFsdWUpOworCXJldHVybiBwaW5jdHJsX2dwaW9fZGlyZWN0aW9uX291dHB1dChjaGlwLT5iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBncGlvX2NoaXAgaW50ZWxfZ3Bpb19jaGlwID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5yZXF1ZXN0ID0gaW50ZWxfZ3Bpb19yZXF1ZXN0LAorCS5mcmVlID0gaW50ZWxfZ3Bpb19mcmVlLAorCS5kaXJlY3Rpb25faW5wdXQgPSBpbnRlbF9ncGlvX2RpcmVjdGlvbl9pbnB1dCwKKwkuZGlyZWN0aW9uX291dHB1dCA9IGludGVsX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKKwkuZ2V0ID0gaW50ZWxfZ3Bpb19nZXQsCisJLnNldCA9IGludGVsX2dwaW9fc2V0LAorfTsKKworc3RhdGljIHZvaWQgaW50ZWxfZ3Bpb19pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCA9IGdwaW9jaGlwX3RvX3BpbmN0cmwoZ2MpOworCWNvbnN0IHN0cnVjdCBpbnRlbF9jb21tdW5pdHkgKmNvbW11bml0eTsKKwl1bnNpZ25lZCBwaW4gPSBpcnFkX3RvX2h3aXJxKGQpOworCisJc3Bpbl9sb2NrKCZwY3RybC0+bG9jayk7CisKKwljb21tdW5pdHkgPSBpbnRlbF9nZXRfY29tbXVuaXR5KHBjdHJsLCBwaW4pOworCWlmIChjb21tdW5pdHkpIHsKKwkJdW5zaWduZWQgcGFkbm8gPSBwaW5fdG9fcGFkbm8oY29tbXVuaXR5LCBwaW4pOworCQl1bnNpZ25lZCBncHBfb2Zmc2V0ID0gcGFkbm8gJSBOUEFEU19JTl9HUFA7CisJCXVuc2lnbmVkIGdwcCA9IHBhZG5vIC8gTlBBRFNfSU5fR1BQOworCisJCXdyaXRlbChCSVQoZ3BwX29mZnNldCksIGNvbW11bml0eS0+cmVncyArIEdQSV9JUyArIGdwcCAqIDQpOworCX0KKworCXNwaW5fdW5sb2NrKCZwY3RybC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2dwaW9faXJxX21hc2tfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCwgYm9vbCBtYXNrKQoreworCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsID0gZ3Bpb2NoaXBfdG9fcGluY3RybChnYyk7CisJY29uc3Qgc3RydWN0IGludGVsX2NvbW11bml0eSAqY29tbXVuaXR5OworCXVuc2lnbmVkIHBpbiA9IGlycWRfdG9faHdpcnEoZCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwY3RybC0+bG9jaywgZmxhZ3MpOworCisJY29tbXVuaXR5ID0gaW50ZWxfZ2V0X2NvbW11bml0eShwY3RybCwgcGluKTsKKwlpZiAoY29tbXVuaXR5KSB7CisJCXVuc2lnbmVkIHBhZG5vID0gcGluX3RvX3BhZG5vKGNvbW11bml0eSwgcGluKTsKKwkJdW5zaWduZWQgZ3BwX29mZnNldCA9IHBhZG5vICUgTlBBRFNfSU5fR1BQOworCQl1bnNpZ25lZCBncHAgPSBwYWRubyAvIE5QQURTX0lOX0dQUDsKKwkJdm9pZCBfX2lvbWVtICpyZWc7CisJCXUzMiB2YWx1ZTsKKworCQlyZWcgPSBjb21tdW5pdHktPnJlZ3MgKyBjb21tdW5pdHktPmllX29mZnNldCArIGdwcCAqIDQ7CisJCXZhbHVlID0gcmVhZGwocmVnKTsKKwkJaWYgKG1hc2spCisJCQl2YWx1ZSAmPSB+QklUKGdwcF9vZmZzZXQpOworCQllbHNlCisJCQl2YWx1ZSB8PSBCSVQoZ3BwX29mZnNldCk7CisJCXdyaXRlbCh2YWx1ZSwgcmVnKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3RybC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlpbnRlbF9ncGlvX2lycV9tYXNrX3VubWFzayhkLCB0cnVlKTsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfZ3Bpb19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlpbnRlbF9ncGlvX2lycV9tYXNrX3VubWFzayhkLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfZ3Bpb19pcnFfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIHR5cGUpCit7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgaW50ZWxfcGluY3RybCAqcGN0cmwgPSBncGlvY2hpcF90b19waW5jdHJsKGdjKTsKKwl1bnNpZ25lZCBwaW4gPSBpcnFkX3RvX2h3aXJxKGQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdm9pZCBfX2lvbWVtICpyZWc7CisJdTMyIHZhbHVlOworCisJcmVnID0gaW50ZWxfZ2V0X3BhZGNmZyhwY3RybCwgcGluLCBQQURDRkcwKTsKKwlpZiAoIXJlZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKKworCXZhbHVlID0gcmVhZGwocmVnKTsKKworCXZhbHVlICY9IH4oUEFEQ0ZHMF9SWEVWQ0ZHX01BU0sgfCBQQURDRkcwX1JYSU5WKTsKKworCWlmICgodHlwZSAmIElSUV9UWVBFX0VER0VfQk9USCkgPT0gSVJRX1RZUEVfRURHRV9CT1RIKSB7CisJCXZhbHVlIHw9IFBBRENGRzBfUlhFVkNGR19FREdFX0JPVEggPDwgUEFEQ0ZHMF9SWEVWQ0ZHX1NISUZUOworCX0gZWxzZSBpZiAodHlwZSAmIElSUV9UWVBFX0VER0VfRkFMTElORykgeworCQl2YWx1ZSB8PSBQQURDRkcwX1JYRVZDRkdfRURHRSA8PCBQQURDRkcwX1JYRVZDRkdfU0hJRlQ7CisJCXZhbHVlIHw9IFBBRENGRzBfUlhJTlY7CisJfSBlbHNlIGlmICh0eXBlICYgSVJRX1RZUEVfRURHRV9SSVNJTkcpIHsKKwkJdmFsdWUgfD0gUEFEQ0ZHMF9SWEVWQ0ZHX0VER0UgPDwgUEFEQ0ZHMF9SWEVWQ0ZHX1NISUZUOworCX0gZWxzZSBpZiAodHlwZSAmIElSUV9UWVBFX0xFVkVMX0xPVykgeworCQl2YWx1ZSB8PSBQQURDRkcwX1JYSU5WOworCX0gZWxzZSB7CisJCXZhbHVlIHw9IFBBRENGRzBfUlhFVkNGR19ESVNBQkxFRCA8PCBQQURDRkcwX1JYRVZDRkdfU0hJRlQ7CisJfQorCisJd3JpdGVsKHZhbHVlLCByZWcpOworCisJaWYgKHR5cGUgJiBJUlFfVFlQRV9FREdFX0JPVEgpCisJCV9faXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLT5pcnEsIGhhbmRsZV9lZGdlX2lycSk7CisJZWxzZSBpZiAodHlwZSAmIElSUV9UWVBFX0xFVkVMX01BU0spCisJCV9faXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLT5pcnEsIGhhbmRsZV9sZXZlbF9pcnEpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGN0cmwtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVsX2dwaW9faXJxX3dha2Uoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCBpbnQgb24pCit7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgaW50ZWxfcGluY3RybCAqcGN0cmwgPSBncGlvY2hpcF90b19waW5jdHJsKGdjKTsKKwljb25zdCBzdHJ1Y3QgaW50ZWxfY29tbXVuaXR5ICpjb21tdW5pdHk7CisJdW5zaWduZWQgcGluID0gaXJxZF90b19od2lycShkKTsKKwl1bnNpZ25lZCBwYWRubywgZ3BwLCBncHBfb2Zmc2V0OworCXUzMiBncGVfZW47CisKKwljb21tdW5pdHkgPSBpbnRlbF9nZXRfY29tbXVuaXR5KHBjdHJsLCBwaW4pOworCWlmICghY29tbXVuaXR5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBhZG5vID0gcGluX3RvX3BhZG5vKGNvbW11bml0eSwgcGluKTsKKwlncHAgPSBwYWRubyAvIE5QQURTX0lOX0dQUDsKKwlncHBfb2Zmc2V0ID0gcGFkbm8gJSBOUEFEU19JTl9HUFA7CisKKwkvKiBDbGVhciB0aGUgZXhpc3Rpbmcgd2FrZSBzdGF0dXMgKi8KKwl3cml0ZWwoQklUKGdwcF9vZmZzZXQpLCBjb21tdW5pdHktPnJlZ3MgKyBHUElfR1BFX1NUUyArIGdwcCAqIDQpOworCisJLyoKKwkgKiBUaGUgY29udHJvbGxlciB3aWxsIGdlbmVyYXRlIHdha2Ugd2hlbiBHUEUgb2YgdGhlIGNvcnJlc3BvbmRpbmcKKwkgKiBwYWQgaXMgZW5hYmxlZCBhbmQgaXQgaXMgbm90IHJvdXRlZCB0byBTQ0kgKEdQSVJPVVRTQ0kgaXMgbm90CisJICogc2V0KS4KKwkgKi8KKwlncGVfZW4gPSByZWFkbChjb21tdW5pdHktPnJlZ3MgKyBHUElfR1BFX0VOICsgZ3BwICogNCk7CisJaWYgKG9uKQorCQlncGVfZW4gfD0gQklUKGdwcF9vZmZzZXQpOworCWVsc2UKKwkJZ3BlX2VuICY9IH5CSVQoZ3BwX29mZnNldCk7CisJd3JpdGVsKGdwZV9lbiwgY29tbXVuaXR5LT5yZWdzICsgR1BJX0dQRV9FTiArIGdwcCAqIDQpOworCisJZGV2X2RiZyhwY3RybC0+ZGV2LCAiJXNhYmxlIHdha2UgZm9yIHBpbiAldVxuIiwgb24gPyAiZW4iIDogImRpcyIsIHBpbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX2dwaW9fY29tbXVuaXR5X2lycV9oYW5kbGVyKHN0cnVjdCBncGlvX2NoaXAgKmdjLAorCWNvbnN0IHN0cnVjdCBpbnRlbF9jb21tdW5pdHkgKmNvbW11bml0eSkKK3sKKwlpbnQgZ3BwOworCisJZm9yIChncHAgPSAwOyBncHAgPCBjb21tdW5pdHktPm5ncHBzOyBncHArKykgeworCQl1bnNpZ25lZCBsb25nIHBlbmRpbmcsIGVuYWJsZWQsIGdwcF9vZmZzZXQ7CisKKwkJcGVuZGluZyA9IHJlYWRsKGNvbW11bml0eS0+cmVncyArIEdQSV9JUyArIGdwcCAqIDQpOworCQllbmFibGVkID0gcmVhZGwoY29tbXVuaXR5LT5yZWdzICsgY29tbXVuaXR5LT5pZV9vZmZzZXQgKworCQkJCWdwcCAqIDQpOworCisJCS8qIE9ubHkgaW50ZXJydXB0cyB0aGF0IGFyZSBlbmFibGVkICovCisJCXBlbmRpbmcgJj0gZW5hYmxlZDsKKworCQlmb3JfZWFjaF9zZXRfYml0KGdwcF9vZmZzZXQsICZwZW5kaW5nLCBOUEFEU19JTl9HUFApIHsKKwkJCXVuc2lnbmVkIHBhZG5vLCBpcnE7CisKKwkJCS8qCisJCQkgKiBUaGUgbGFzdCBncm91cCBpbiBjb21tdW5pdHkgY2FuIGhhdmUgbGVzcyBwaW5zCisJCQkgKiB0aGFuIE5QQURTX0lOX0dQUC4KKwkJCSAqLworCQkJcGFkbm8gPSBncHBfb2Zmc2V0ICsgZ3BwICogTlBBRFNfSU5fR1BQOworCQkJaWYgKHBhZG5vID49IGNvbW11bml0eS0+bnBpbnMpCisJCQkJYnJlYWs7CisKKwkJCWlycSA9IGlycV9maW5kX21hcHBpbmcoZ2MtPmlycWRvbWFpbiwKKwkJCQkJICAgICAgIGNvbW11bml0eS0+cGluX2Jhc2UgKyBwYWRubyk7CisJCQlnZW5lcmljX2hhbmRsZV9pcnEoaXJxKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaW50ZWxfZ3Bpb19pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7CisJc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsID0gZ3Bpb2NoaXBfdG9fcGluY3RybChnYyk7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2dldF9jaGlwKGlycSk7CisJaW50IGk7CisKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKworCS8qIE5lZWQgdG8gY2hlY2sgYWxsIGNvbW11bml0aWVzIGZvciBwZW5kaW5nIGludGVycnVwdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcGN0cmwtPm5jb21tdW5pdGllczsgaSsrKQorCQlpbnRlbF9ncGlvX2NvbW11bml0eV9pcnFfaGFuZGxlcihnYywgJnBjdHJsLT5jb21tdW5pdGllc1tpXSk7CisKKwljaGFpbmVkX2lycV9leGl0KGNoaXAsIGRlc2MpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIGludGVsX2dwaW9faXJxY2hpcCA9IHsKKwkubmFtZSA9ICJpbnRlbC1ncGlvIiwKKwkuaXJxX2FjayA9IGludGVsX2dwaW9faXJxX2FjaywKKwkuaXJxX21hc2sgPSBpbnRlbF9ncGlvX2lycV9tYXNrLAorCS5pcnFfdW5tYXNrID0gaW50ZWxfZ3Bpb19pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3R5cGUgPSBpbnRlbF9ncGlvX2lycV90eXBlLAorCS5pcnFfc2V0X3dha2UgPSBpbnRlbF9ncGlvX2lycV93YWtlLAorfTsKKworc3RhdGljIHZvaWQgaW50ZWxfZ3Bpb19pcnFfaW5pdChzdHJ1Y3QgaW50ZWxfcGluY3RybCAqcGN0cmwpCit7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGN0cmwtPm5jb21tdW5pdGllczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBpbnRlbF9jb21tdW5pdHkgKmNvbW11bml0eTsKKwkJdm9pZCBfX2lvbWVtICpiYXNlOworCQl1bnNpZ25lZCBncHA7CisKKwkJY29tbXVuaXR5ID0gJnBjdHJsLT5jb21tdW5pdGllc1tpXTsKKwkJYmFzZSA9IGNvbW11bml0eS0+cmVnczsKKworCQlmb3IgKGdwcCA9IDA7IGdwcCA8IGNvbW11bml0eS0+bmdwcHM7IGdwcCsrKSB7CisJCQkvKiBNYXNrIGFuZCBjbGVhciBhbGwgaW50ZXJydXB0cyAqLworCQkJd3JpdGVsKDAsIGJhc2UgKyBjb21tdW5pdHktPmllX29mZnNldCArIGdwcCAqIDQpOworCQkJd3JpdGVsKDB4ZmZmZiwgYmFzZSArIEdQSV9JUyArIGdwcCAqIDQpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGludGVsX2dwaW9fcHJvYmUoc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsLCBpbnQgaXJxKQoreworCWludCByZXQ7CisKKwlwY3RybC0+Y2hpcCA9IGludGVsX2dwaW9fY2hpcDsKKworCXBjdHJsLT5jaGlwLm5ncGlvID0gcGN0cmwtPnNvYy0+bnBpbnM7CisJcGN0cmwtPmNoaXAubGFiZWwgPSBkZXZfbmFtZShwY3RybC0+ZGV2KTsKKwlwY3RybC0+Y2hpcC5kZXYgPSBwY3RybC0+ZGV2OworCXBjdHJsLT5jaGlwLmJhc2UgPSAtMTsKKworCXJldCA9IGdwaW9jaGlwX2FkZCgmcGN0cmwtPmNoaXApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihwY3RybC0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGdwaW9jaGlwXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBncGlvY2hpcF9hZGRfcGluX3JhbmdlKCZwY3RybC0+Y2hpcCwgZGV2X25hbWUocGN0cmwtPmRldiksCisJCQkJICAgICAwLCAwLCBwY3RybC0+c29jLT5ucGlucyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHBjdHJsLT5kZXYsICJmYWlsZWQgdG8gYWRkIEdQSU8gcGluIHJhbmdlXG4iKTsKKwkJZ3Bpb2NoaXBfcmVtb3ZlKCZwY3RybC0+Y2hpcCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZ3Bpb2NoaXBfaXJxY2hpcF9hZGQoJnBjdHJsLT5jaGlwLCAmaW50ZWxfZ3Bpb19pcnFjaGlwLCAwLAorCQkJCSAgIGhhbmRsZV9zaW1wbGVfaXJxLCBJUlFfVFlQRV9OT05FKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocGN0cmwtPmRldiwgImZhaWxlZCB0byBhZGQgaXJxY2hpcFxuIik7CisJCWdwaW9jaGlwX3JlbW92ZSgmcGN0cmwtPmNoaXApOworCQlyZXR1cm4gcmV0OworCX0KKworCWdwaW9jaGlwX3NldF9jaGFpbmVkX2lycWNoaXAoJnBjdHJsLT5jaGlwLCAmaW50ZWxfZ3Bpb19pcnFjaGlwLCBpcnEsCisJCQkJICAgICBpbnRlbF9ncGlvX2lycV9oYW5kbGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlbF9waW5jdHJsX3BtX2luaXQoc3RydWN0IGludGVsX3BpbmN0cmwgKnBjdHJsKQoreworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorCWNvbnN0IHN0cnVjdCBpbnRlbF9waW5jdHJsX3NvY19kYXRhICpzb2MgPSBwY3RybC0+c29jOworCXN0cnVjdCBpbnRlbF9jb21tdW5pdHlfY29udGV4dCAqY29tbXVuaXRpZXM7CisJc3RydWN0IGludGVsX3BhZF9jb250ZXh0ICpwYWRzOworCWludCBpOworCisJcGFkcyA9IGRldm1fa2NhbGxvYyhwY3RybC0+ZGV2LCBzb2MtPm5waW5zLCBzaXplb2YoKnBhZHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBhZHMpCisJCXJldHVybiAtRU5PTUVNOworCisJY29tbXVuaXRpZXMgPSBkZXZtX2tjYWxsb2MocGN0cmwtPmRldiwgcGN0cmwtPm5jb21tdW5pdGllcywKKwkJCQkgICBzaXplb2YoKmNvbW11bml0aWVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjb21tdW5pdGllcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKworCWZvciAoaSA9IDA7IGkgPCBwY3RybC0+bmNvbW11bml0aWVzOyBpKyspIHsKKwkJc3RydWN0IGludGVsX2NvbW11bml0eSAqY29tbXVuaXR5ID0gJnBjdHJsLT5jb21tdW5pdGllc1tpXTsKKwkJdTMyICppbnRtYXNrOworCisJCWludG1hc2sgPSBkZXZtX2tjYWxsb2MocGN0cmwtPmRldiwgY29tbXVuaXR5LT5uZ3BwcywKKwkJCQkgICAgICAgc2l6ZW9mKCppbnRtYXNrKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaW50bWFzaykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWNvbW11bml0aWVzW2ldLmludG1hc2sgPSBpbnRtYXNrOworCX0KKworCXBjdHJsLT5jb250ZXh0LnBhZHMgPSBwYWRzOworCXBjdHJsLT5jb250ZXh0LmNvbW11bml0aWVzID0gY29tbXVuaXRpZXM7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitpbnQgaW50ZWxfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJY29uc3Qgc3RydWN0IGludGVsX3BpbmN0cmxfc29jX2RhdGEgKnNvY19kYXRhKQoreworCXN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybDsKKwlpbnQgaSwgcmV0LCBpcnE7CisKKwlpZiAoIXNvY19kYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBjdHJsID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGN0cmwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjdHJsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBjdHJsLT5kZXYgPSAmcGRldi0+ZGV2OworCXBjdHJsLT5zb2MgPSBzb2NfZGF0YTsKKwlzcGluX2xvY2tfaW5pdCgmcGN0cmwtPmxvY2spOworCisJLyoKKwkgKiBNYWtlIGEgY29weSBvZiB0aGUgY29tbXVuaXRpZXMgd2hpY2ggd2UgY2FuIHVzZSB0byBob2xkIHBvaW50ZXJzCisJICogdG8gdGhlIHJlZ2lzdGVycy4KKwkgKi8KKwlwY3RybC0+bmNvbW11bml0aWVzID0gcGN0cmwtPnNvYy0+bmNvbW11bml0aWVzOworCXBjdHJsLT5jb21tdW5pdGllcyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBwY3RybC0+bmNvbW11bml0aWVzLAorCQkJCSAgc2l6ZW9mKCpwY3RybC0+Y29tbXVuaXRpZXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjdHJsLT5jb21tdW5pdGllcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgcGN0cmwtPm5jb21tdW5pdGllczsgaSsrKSB7CisJCXN0cnVjdCBpbnRlbF9jb21tdW5pdHkgKmNvbW11bml0eSA9ICZwY3RybC0+Y29tbXVuaXRpZXNbaV07CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCQl2b2lkIF9faW9tZW0gKnJlZ3M7CisJCXUzMiBwYWRiYXI7CisKKwkJKmNvbW11bml0eSA9IHBjdHJsLT5zb2MtPmNvbW11bml0aWVzW2ldOworCisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwKKwkJCQkJICAgIGNvbW11bml0eS0+YmFybm8pOworCQlyZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJCWlmIChJU19FUlIocmVncykpCisJCQlyZXR1cm4gUFRSX0VSUihyZWdzKTsKKworCQkvKiBSZWFkIG9mZnNldCBvZiB0aGUgcGFkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzICovCisJCXBhZGJhciA9IHJlYWRsKHJlZ3MgKyBQQURCQVIpOworCisJCWNvbW11bml0eS0+cmVncyA9IHJlZ3M7CisJCWNvbW11bml0eS0+cGFkX3JlZ3MgPSByZWdzICsgcGFkYmFyOworCQljb21tdW5pdHktPm5ncHBzID0gRElWX1JPVU5EX1VQKGNvbW11bml0eS0+bnBpbnMsIE5QQURTX0lOX0dQUCk7CisJfQorCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGludGVycnVwdCBudW1iZXJcbiIpOworCQlyZXR1cm4gaXJxOworCX0KKworCXJldCA9IGludGVsX3BpbmN0cmxfcG1faW5pdChwY3RybCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBjdHJsLT5wY3RsZGVzYyA9IGludGVsX3BpbmN0cmxfZGVzYzsKKwlwY3RybC0+cGN0bGRlc2MubmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCXBjdHJsLT5wY3RsZGVzYy5waW5zID0gcGN0cmwtPnNvYy0+cGluczsKKwlwY3RybC0+cGN0bGRlc2MubnBpbnMgPSBwY3RybC0+c29jLT5ucGluczsKKworCXBjdHJsLT5wY3RsZGV2ID0gcGluY3RybF9yZWdpc3RlcigmcGN0cmwtPnBjdGxkZXNjLCAmcGRldi0+ZGV2LCBwY3RybCk7CisJaWYgKCFwY3RybC0+cGN0bGRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgcGluY3RybCBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXQgPSBpbnRlbF9ncGlvX3Byb2JlKHBjdHJsLCBpcnEpOworCWlmIChyZXQpIHsKKwkJcGluY3RybF91bnJlZ2lzdGVyKHBjdHJsLT5wY3RsZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwY3RybCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGludGVsX3BpbmN0cmxfcHJvYmUpOworCitpbnQgaW50ZWxfcGluY3RybF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaW50ZWxfcGluY3RybCAqcGN0cmwgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWdwaW9jaGlwX3JlbW92ZSgmcGN0cmwtPmNoaXApOworCXBpbmN0cmxfdW5yZWdpc3RlcihwY3RybC0+cGN0bGRldik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGludGVsX3BpbmN0cmxfcmVtb3ZlKTsKKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAoraW50IGludGVsX3BpbmN0cmxfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBpbnRlbF9jb21tdW5pdHlfY29udGV4dCAqY29tbXVuaXRpZXM7CisJc3RydWN0IGludGVsX3BhZF9jb250ZXh0ICpwYWRzOworCWludCBpOworCisJcGFkcyA9IHBjdHJsLT5jb250ZXh0LnBhZHM7CisJZm9yIChpID0gMDsgaSA8IHBjdHJsLT5zb2MtPm5waW5zOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgKmRlc2MgPSAmcGN0cmwtPnNvYy0+cGluc1tpXTsKKwkJdTMyIHZhbDsKKworCQlpZiAoIWludGVsX3BhZF91c2FibGUocGN0cmwsIGRlc2MtPm51bWJlcikpCisJCQljb250aW51ZTsKKworCQl2YWwgPSByZWFkbChpbnRlbF9nZXRfcGFkY2ZnKHBjdHJsLCBkZXNjLT5udW1iZXIsIFBBRENGRzApKTsKKwkJcGFkc1tpXS5wYWRjZmcwID0gdmFsICYgflBBRENGRzBfR1BJT1JYU1RBVEU7CisJCXZhbCA9IHJlYWRsKGludGVsX2dldF9wYWRjZmcocGN0cmwsIGRlc2MtPm51bWJlciwgUEFEQ0ZHMSkpOworCQlwYWRzW2ldLnBhZGNmZzEgPSB2YWw7CisJfQorCisJY29tbXVuaXRpZXMgPSBwY3RybC0+Y29udGV4dC5jb21tdW5pdGllczsKKwlmb3IgKGkgPSAwOyBpIDwgcGN0cmwtPm5jb21tdW5pdGllczsgaSsrKSB7CisJCXN0cnVjdCBpbnRlbF9jb21tdW5pdHkgKmNvbW11bml0eSA9ICZwY3RybC0+Y29tbXVuaXRpZXNbaV07CisJCXZvaWQgX19pb21lbSAqYmFzZTsKKwkJdW5zaWduZWQgZ3BwOworCisJCWJhc2UgPSBjb21tdW5pdHktPnJlZ3MgKyBjb21tdW5pdHktPmllX29mZnNldDsKKwkJZm9yIChncHAgPSAwOyBncHAgPCBjb21tdW5pdHktPm5ncHBzOyBncHArKykKKwkJCWNvbW11bml0aWVzW2ldLmludG1hc2tbZ3BwXSA9IHJlYWRsKGJhc2UgKyBncHAgKiA0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGludGVsX3BpbmN0cmxfc3VzcGVuZCk7CisKK2ludCBpbnRlbF9waW5jdHJsX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBpbnRlbF9waW5jdHJsICpwY3RybCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWNvbnN0IHN0cnVjdCBpbnRlbF9jb21tdW5pdHlfY29udGV4dCAqY29tbXVuaXRpZXM7CisJY29uc3Qgc3RydWN0IGludGVsX3BhZF9jb250ZXh0ICpwYWRzOworCWludCBpOworCisJLyogTWFzayBhbGwgaW50ZXJydXB0cyAqLworCWludGVsX2dwaW9faXJxX2luaXQocGN0cmwpOworCisJcGFkcyA9IHBjdHJsLT5jb250ZXh0LnBhZHM7CisJZm9yIChpID0gMDsgaSA8IHBjdHJsLT5zb2MtPm5waW5zOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgKmRlc2MgPSAmcGN0cmwtPnNvYy0+cGluc1tpXTsKKwkJdm9pZCBfX2lvbWVtICpwYWRjZmc7CisJCXUzMiB2YWw7CisKKwkJaWYgKCFpbnRlbF9wYWRfdXNhYmxlKHBjdHJsLCBkZXNjLT5udW1iZXIpKQorCQkJY29udGludWU7CisKKwkJcGFkY2ZnID0gaW50ZWxfZ2V0X3BhZGNmZyhwY3RybCwgZGVzYy0+bnVtYmVyLCBQQURDRkcwKTsKKwkJdmFsID0gcmVhZGwocGFkY2ZnKSAmIH5QQURDRkcwX0dQSU9SWFNUQVRFOworCQlpZiAodmFsICE9IHBhZHNbaV0ucGFkY2ZnMCkgeworCQkJd3JpdGVsKHBhZHNbaV0ucGFkY2ZnMCwgcGFkY2ZnKTsKKwkJCWRldl9kYmcoZGV2LCAicmVzdG9yZWQgcGluICV1IHBhZGNmZzAgJSMwOHhcbiIsCisJCQkJZGVzYy0+bnVtYmVyLCByZWFkbChwYWRjZmcpKTsKKwkJfQorCisJCXBhZGNmZyA9IGludGVsX2dldF9wYWRjZmcocGN0cmwsIGRlc2MtPm51bWJlciwgUEFEQ0ZHMSk7CisJCXZhbCA9IHJlYWRsKHBhZGNmZyk7CisJCWlmICh2YWwgIT0gcGFkc1tpXS5wYWRjZmcxKSB7CisJCQl3cml0ZWwocGFkc1tpXS5wYWRjZmcxLCBwYWRjZmcpOworCQkJZGV2X2RiZyhkZXYsICJyZXN0b3JlZCBwaW4gJXUgcGFkY2ZnMSAlIzA4eFxuIiwKKwkJCQlkZXNjLT5udW1iZXIsIHJlYWRsKHBhZGNmZykpOworCQl9CisJfQorCisJY29tbXVuaXRpZXMgPSBwY3RybC0+Y29udGV4dC5jb21tdW5pdGllczsKKwlmb3IgKGkgPSAwOyBpIDwgcGN0cmwtPm5jb21tdW5pdGllczsgaSsrKSB7CisJCXN0cnVjdCBpbnRlbF9jb21tdW5pdHkgKmNvbW11bml0eSA9ICZwY3RybC0+Y29tbXVuaXRpZXNbaV07CisJCXZvaWQgX19pb21lbSAqYmFzZTsKKwkJdW5zaWduZWQgZ3BwOworCisJCWJhc2UgPSBjb21tdW5pdHktPnJlZ3MgKyBjb21tdW5pdHktPmllX29mZnNldDsKKwkJZm9yIChncHAgPSAwOyBncHAgPCBjb21tdW5pdHktPm5ncHBzOyBncHArKykgeworCQkJd3JpdGVsKGNvbW11bml0aWVzW2ldLmludG1hc2tbZ3BwXSwgYmFzZSArIGdwcCAqIDQpOworCQkJZGV2X2RiZyhkZXYsICJyZXN0b3JlZCBtYXNrICVkLyV1ICUjMDh4XG4iLCBpLCBncHAsCisJCQkJcmVhZGwoYmFzZSArIGdwcCAqIDQpKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW50ZWxfcGluY3RybF9yZXN1bWUpOworI2VuZGlmCisKK01PRFVMRV9BVVRIT1IoIk1hdGhpYXMgTnltYW4gPG1hdGhpYXMubnltYW5AbGludXguaW50ZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiTWlrYSBXZXN0ZXJiZXJnIDxtaWthLndlc3RlcmJlcmdAbGludXguaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBwaW5jdHJsL0dQSU8gY29yZSBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLWludGVsLmggYi9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1pbnRlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzhiNTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvaW50ZWwvcGluY3RybC1pbnRlbC5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29yZSBwaW5jdHJsL0dQSU8gZHJpdmVyIGZvciBJbnRlbCBHUElPIGNvbnRyb2xsZXJzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yczogTWF0aGlhcyBOeW1hbiA8bWF0aGlhcy5ueW1hbkBsaW51eC5pbnRlbC5jb20+CisgKiAgICAgICAgICBNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0BsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFBJTkNUUkxfSU5URUxfSAorI2RlZmluZSBQSU5DVFJMX0lOVEVMX0gKKworc3RydWN0IHBpbmN0cmxfcGluX2Rlc2M7CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlOworc3RydWN0IGRldmljZTsKKworLyoqCisgKiBzdHJ1Y3QgaW50ZWxfcGluZ3JvdXAgLSBEZXNjcmlwdGlvbiBhYm91dCBncm91cCBvZiBwaW5zCisgKiBAbmFtZTogTmFtZSBvZiB0aGUgZ3JvdXBzCisgKiBAcGluczogQWxsIHBpbnMgaW4gdGhpcyBncm91cAorICogQG5waW5zOiBOdW1iZXIgb2YgcGlucyBpbiB0aGlzIGdyb3VwcworICogQG1vZGU6IE5hdGl2ZSBtb2RlIGluIHdoaWNoIHRoZSBncm91cCBpcyBtdXhlZCBvdXQgQHBpbnMKKyAqLworc3RydWN0IGludGVsX3Bpbmdyb3VwIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IHVuc2lnbmVkICpwaW5zOworCXNpemVfdCBucGluczsKKwl1bnNpZ25lZCBzaG9ydCBtb2RlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaW50ZWxfZnVuY3Rpb24gLSBEZXNjcmlwdGlvbiBhYm91dCBhIGZ1bmN0aW9uCisgKiBAbmFtZTogTmFtZSBvZiB0aGUgZnVuY3Rpb24KKyAqIEBncm91cHM6IEFuIGFycmF5IG9mIGdyb3VwcyBmb3IgdGhpcyBmdW5jdGlvbgorICogQG5ncm91cHM6IE51bWJlciBvZiBncm91cHMgaW4gQGdyb3VwcworICovCitzdHJ1Y3QgaW50ZWxfZnVuY3Rpb24geworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqIGNvbnN0ICpncm91cHM7CisJc2l6ZV90IG5ncm91cHM7Cit9OworCisvKioKKyAqIHN0cnVjdCBpbnRlbF9jb21tdW5pdHkgLSBJbnRlbCBwaW4gY29tbXVuaXR5IGRlc2NyaXB0aW9uCisgKiBAYmFybm86IE1NSU8gQkFSIG51bWJlciB3aGVyZSByZWdpc3RlcnMgZm9yIHRoaXMgY29tbXVuaXR5IHJlc2lkZQorICogQHBhZG93bl9vZmZzZXQ6IFJlZ2lzdGVyIG9mZnNldCBvZiBQQURfT1dOIHJlZ2lzdGVyIGZyb20gQHJlZ3MuIElmICUwCisgKiAgICAgICAgICAgICAgICAgdGhlbiB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBvd25lci4KKyAqIEBwYWRjZmdsb2NrX29mZnNldDogUmVnaXN0ZXIgb2Zmc2V0IG9mIFBBRENGR0xPQ0sgZnJvbSBAcmVncy4gSWYgJTAgdGhlbgorICogICAgICAgICAgICAgICAgICAgICBsb2NraW5nIGlzIG5vdCBzdXBwb3J0ZWQuCisgKiBAaG9zdG93bl9vZmZzZXQ6IFJlZ2lzdGVyIG9mZnNldCBvZiBIT1NUU1dfT1dOIGZyb20gQHJlZ3MuIElmICUwIHRoZW4gaXQKKyAqICAgICAgICAgICAgICAgICAgaXMgYXNzdW1lZCB0aGF0IHRoZSBob3N0IG93bnMgdGhlIHBpbiAocmF0aGVyIHRoYW4KKyAqICAgICAgICAgICAgICAgICAgQUNQSSkuCisgKiBAaWVfb2Zmc2V0OiBSZWdpc3RlciBvZmZzZXQgb2YgR1BJX0lFIGZyb20gQHJlZ3MuCisgKiBAcGluX2Jhc2U6IFN0YXJ0aW5nIHBpbiBvZiBwaW5zIGluIHRoaXMgY29tbXVuaXR5CisgKiBAbnBpbnM6IE51bWJlciBvZiBwaW5zIGluIHRoaXMgY29tbXVuaXR5CisgKiBAcmVnczogQ29tbXVuaXR5IHNwZWNpZmljIGNvbW1vbiByZWdpc3RlcnMgKHJlc2VydmVkIGZvciBjb3JlIGRyaXZlcikKKyAqIEBwYWRfcmVnczogQ29tbXVuaXR5IHNwZWNpZmljIHBhZCByZWdpc3RlcnMgKHJlc2VydmVkIGZvciBjb3JlIGRyaXZlcikKKyAqIEBuZ3BwczogTnVtYmVyIG9mIGdyb3VwcyAoaHcgZ3JvdXBzKSBpbiB0aGlzIGNvbW11bml0eSAocmVzZXJ2ZWQgZm9yCisgKiAgICAgICAgIGNvcmUgZHJpdmVyKQorICovCitzdHJ1Y3QgaW50ZWxfY29tbXVuaXR5IHsKKwl1bnNpZ25lZCBiYXJubzsKKwl1bnNpZ25lZCBwYWRvd25fb2Zmc2V0OworCXVuc2lnbmVkIHBhZGNmZ2xvY2tfb2Zmc2V0OworCXVuc2lnbmVkIGhvc3Rvd25fb2Zmc2V0OworCXVuc2lnbmVkIGllX29mZnNldDsKKwl1bnNpZ25lZCBwaW5fYmFzZTsKKwlzaXplX3QgbnBpbnM7CisJdm9pZCBfX2lvbWVtICpyZWdzOworCXZvaWQgX19pb21lbSAqcGFkX3JlZ3M7CisJc2l6ZV90IG5ncHBzOworfTsKKworI2RlZmluZSBQSU5fR1JPVVAobiwgcCwgbSkJCQlcCisJewkJCQkJXAorCQkubmFtZSA9IChuKSwJCQlcCisJCS5waW5zID0gKHApLAkJCVwKKwkJLm5waW5zID0gQVJSQVlfU0laRSgocCkpLAlcCisJCS5tb2RlID0gKG0pLAkJCVwKKwl9CisKKyNkZWZpbmUgRlVOQ1RJT04obiwgZykJCQkJXAorCXsJCQkJCVwKKwkJLm5hbWUgPSAobiksCQkJXAorCQkuZ3JvdXBzID0gKGcpLAkJCVwKKwkJLm5ncm91cHMgPSBBUlJBWV9TSVpFKChnKSksCVwKKwl9CisKKy8qKgorICogc3RydWN0IGludGVsX3BpbmN0cmxfc29jX2RhdGEgLSBJbnRlbCBwaW4gY29udHJvbGxlciBwZXItU29DIGNvbmZpZ3VyYXRpb24KKyAqIEB1aWQ6IEFDUEkgX1VJRCBmb3IgdGhlIHByb2JlIGRyaXZlciB1c2UgaWYgbmVlZGVkCisgKiBAcGluczogQXJyYXkgaWYgcGlucyB0aGlzIHBpbmN0cmwgY29udHJvbHMKKyAqIEBucGluczogTnVtYmVyIG9mIHBpbnMgaW4gdGhlIGFycmF5CisgKiBAZ3JvdXBzOiBBcnJheSBvZiBwaW4gZ3JvdXBzCisgKiBAbmdyb3VwczogTnVtYmVyIG9mIGdyb3VwcyBpbiB0aGUgYXJyYXkKKyAqIEBmdW5jdGlvbnM6IEFycmF5IG9mIGZ1bmN0aW9ucworICogQG5mdW5jdGlvbnM6IE51bWJlciBvZiBmdW5jdGlvbnMgaW4gdGhlIGFycmF5CisgKiBAY29tbXVuaXRpZXM6IEFycmF5IG9mIGNvbW11bml0aWVzIHRoaXMgcGluY3RybCBoYW5kbGVzCisgKiBAbmNvbW11bml0aWVzOiBOdW1iZXIgb2YgY29tbXVuaXRpZXMgaW4gdGhlIGFycmF5CisgKgorICogVGhlIEBjb21tdW5pdGllcyBpcyB1c2VkIGFzIGEgdGVtcGxhdGUgYnkgdGhlIGNvcmUgZHJpdmVyLiBJdCB3aWxsIG1ha2UKKyAqIGNvcHkgb2YgYWxsIGNvbW11bml0aWVzIGFuZCBmaWxsIGluIHJlc3Qgb2YgdGhlIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgaW50ZWxfcGluY3RybF9zb2NfZGF0YSB7CisJY29uc3QgY2hhciAqdWlkOworCWNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjICpwaW5zOworCXNpemVfdCBucGluczsKKwljb25zdCBzdHJ1Y3QgaW50ZWxfcGluZ3JvdXAgKmdyb3VwczsKKwlzaXplX3Qgbmdyb3VwczsKKwljb25zdCBzdHJ1Y3QgaW50ZWxfZnVuY3Rpb24gKmZ1bmN0aW9uczsKKwlzaXplX3QgbmZ1bmN0aW9uczsKKwljb25zdCBzdHJ1Y3QgaW50ZWxfY29tbXVuaXR5ICpjb21tdW5pdGllczsKKwlzaXplX3QgbmNvbW11bml0aWVzOworfTsKKworaW50IGludGVsX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCWNvbnN0IHN0cnVjdCBpbnRlbF9waW5jdHJsX3NvY19kYXRhICpzb2NfZGF0YSk7CitpbnQgaW50ZWxfcGluY3RybF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldik7CisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK2ludCBpbnRlbF9waW5jdHJsX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KTsKK2ludCBpbnRlbF9waW5jdHJsX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworI2VuZGlmCisKKyNlbmRpZiAvKiBQSU5DVFJMX0lOVEVMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLXN1bnJpc2Vwb2ludC5jIGIvZHJpdmVycy9waW5jdHJsL2ludGVsL3BpbmN0cmwtc3VucmlzZXBvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkMDI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9pbnRlbC9waW5jdHJsLXN1bnJpc2Vwb2ludC5jCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogSW50ZWwgU3VucmlzZXBvaW50IFBDSCBwaW5jdHJsL0dQSU8gZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yczogTWF0aGlhcyBOeW1hbiA8bWF0aGlhcy5ueW1hbkBsaW51eC5pbnRlbC5jb20+CisgKiAgICAgICAgICBNaWthIFdlc3RlcmJlcmcgPG1pa2Eud2VzdGVyYmVyZ0BsaW51eC5pbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisKKyNpbmNsdWRlICJwaW5jdHJsLWludGVsLmgiCisKKyNkZWZpbmUgU1BUX1BBRF9PV04JMHgwMjAKKyNkZWZpbmUgU1BUX1BBRENGR0xPQ0sJMHgwYTAKKyNkZWZpbmUgU1BUX0hPU1RTV19PV04JMHgwZDAKKyNkZWZpbmUgU1BUX0dQSV9JRQkweDEyMAorCisjZGVmaW5lIFNQVF9DT01NVU5JVFkoYiwgcywgZSkJCQkJXAorCXsJCQkJCQlcCisJCS5iYXJubyA9IChiKSwJCQkJXAorCQkucGFkb3duX29mZnNldCA9IFNQVF9QQURfT1dOLAkJXAorCQkucGFkY2ZnbG9ja19vZmZzZXQgPSBTUFRfUEFEQ0ZHTE9DSywJXAorCQkuaG9zdG93bl9vZmZzZXQgPSBTUFRfSE9TVFNXX09XTiwJXAorCQkuaWVfb2Zmc2V0ID0gU1BUX0dQSV9JRSwJCVwKKwkJLnBpbl9iYXNlID0gKHMpLAkJCVwKKwkJLm5waW5zID0gKChlKSAtIChzKSArIDEpLAkJXAorCX0KKworLyogU3VucmlzZXBvaW50LUxQICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2Mgc3B0bHBfcGluc1tdID0geworCS8qIEdQUF9BICovCisJUElOQ1RSTF9QSU4oMCwgIlJDSU5CIiksCisJUElOQ1RSTF9QSU4oMSwgIkxBRF8wIiksCisJUElOQ1RSTF9QSU4oMiwgIkxBRF8xIiksCisJUElOQ1RSTF9QSU4oMywgIkxBRF8yIiksCisJUElOQ1RSTF9QSU4oNCwgIkxBRF8zIiksCisJUElOQ1RSTF9QSU4oNSwgIkxGUkFNRUIiKSwKKwlQSU5DVFJMX1BJTig2LCAiU0VSSVEiKSwKKwlQSU5DVFJMX1BJTig3LCAiUElSUUFCIiksCisJUElOQ1RSTF9QSU4oOCwgIkNMS1JVTkIiKSwKKwlQSU5DVFJMX1BJTig5LCAiQ0xLT1VUX0xQQ18wIiksCisJUElOQ1RSTF9QSU4oMTAsICJDTEtPVVRfTFBDXzEiKSwKKwlQSU5DVFJMX1BJTigxMSwgIlBNRUIiKSwKKwlQSU5DVFJMX1BJTigxMiwgIkJNX0JVU1lCIiksCisJUElOQ1RSTF9QSU4oMTMsICJTVVNXQVJOQl9TVVNfUFdSRE5BQ0siKSwKKwlQSU5DVFJMX1BJTigxNCwgIlNVU19TVEFUQiIpLAorCVBJTkNUUkxfUElOKDE1LCAiU1VTQUNLQiIpLAorCVBJTkNUUkxfUElOKDE2LCAiU0RfMVA4X1NFTCIpLAorCVBJTkNUUkxfUElOKDE3LCAiU0RfUFdSX0VOX0IiKSwKKwlQSU5DVFJMX1BJTigxOCwgIklTSF9HUF8wIiksCisJUElOQ1RSTF9QSU4oMTksICJJU0hfR1BfMSIpLAorCVBJTkNUUkxfUElOKDIwLCAiSVNIX0dQXzIiKSwKKwlQSU5DVFJMX1BJTigyMSwgIklTSF9HUF8zIiksCisJUElOQ1RSTF9QSU4oMjIsICJJU0hfR1BfNCIpLAorCVBJTkNUUkxfUElOKDIzLCAiSVNIX0dQXzUiKSwKKwkvKiBHUFBfQiAqLworCVBJTkNUUkxfUElOKDI0LCAiQ09SRV9WSURfMCIpLAorCVBJTkNUUkxfUElOKDI1LCAiQ09SRV9WSURfMSIpLAorCVBJTkNUUkxfUElOKDI2LCAiVlJBTEVSVEIiKSwKKwlQSU5DVFJMX1BJTigyNywgIkNQVV9HUF8yIiksCisJUElOQ1RSTF9QSU4oMjgsICJDUFVfR1BfMyIpLAorCVBJTkNUUkxfUElOKDI5LCAiU1JDQ0xLUkVRQl8wIiksCisJUElOQ1RSTF9QSU4oMzAsICJTUkNDTEtSRVFCXzEiKSwKKwlQSU5DVFJMX1BJTigzMSwgIlNSQ0NMS1JFUUJfMiIpLAorCVBJTkNUUkxfUElOKDMyLCAiU1JDQ0xLUkVRQl8zIiksCisJUElOQ1RSTF9QSU4oMzMsICJTUkNDTEtSRVFCXzQiKSwKKwlQSU5DVFJMX1BJTigzNCwgIlNSQ0NMS1JFUUJfNSIpLAorCVBJTkNUUkxfUElOKDM1LCAiRVhUX1BXUl9HQVRFQiIpLAorCVBJTkNUUkxfUElOKDM2LCAiU0xQX1MwQiIpLAorCVBJTkNUUkxfUElOKDM3LCAiUExUUlNUQiIpLAorCVBJTkNUUkxfUElOKDM4LCAiU1BLUiIpLAorCVBJTkNUUkxfUElOKDM5LCAiR1NQSTBfQ1NCIiksCisJUElOQ1RSTF9QSU4oNDAsICJHU1BJMF9DTEsiKSwKKwlQSU5DVFJMX1BJTig0MSwgIkdTUEkwX01JU08iKSwKKwlQSU5DVFJMX1BJTig0MiwgIkdTUEkwX01PU0kiKSwKKwlQSU5DVFJMX1BJTig0MywgIkdTUEkxX0NTQiIpLAorCVBJTkNUUkxfUElOKDQ0LCAiR1NQSTFfQ0xLIiksCisJUElOQ1RSTF9QSU4oNDUsICJHU1BJMV9NSVNPIiksCisJUElOQ1RSTF9QSU4oNDYsICJHU1BJMV9NT1NJIiksCisJUElOQ1RSTF9QSU4oNDcsICJTTUwxQUxFUlRCIiksCisJLyogR1BQX0MgKi8KKwlQSU5DVFJMX1BJTig0OCwgIlNNQkNMSyIpLAorCVBJTkNUUkxfUElOKDQ5LCAiU01CREFUQSIpLAorCVBJTkNUUkxfUElOKDUwLCAiU01CQUxFUlRCIiksCisJUElOQ1RSTF9QSU4oNTEsICJTTUwwQ0xLIiksCisJUElOQ1RSTF9QSU4oNTIsICJTTUwwREFUQSIpLAorCVBJTkNUUkxfUElOKDUzLCAiU01MMEFMRVJUQiIpLAorCVBJTkNUUkxfUElOKDU0LCAiU01MMUNMSyIpLAorCVBJTkNUUkxfUElOKDU1LCAiU01MMURBVEEiKSwKKwlQSU5DVFJMX1BJTig1NiwgIlVBUlQwX1JYRCIpLAorCVBJTkNUUkxfUElOKDU3LCAiVUFSVDBfVFhEIiksCisJUElOQ1RSTF9QSU4oNTgsICJVQVJUMF9SVFNCIiksCisJUElOQ1RSTF9QSU4oNTksICJVQVJUMF9DVFNCIiksCisJUElOQ1RSTF9QSU4oNjAsICJVQVJUMV9SWEQiKSwKKwlQSU5DVFJMX1BJTig2MSwgIlVBUlQxX1RYRCIpLAorCVBJTkNUUkxfUElOKDYyLCAiVUFSVDFfUlRTQiIpLAorCVBJTkNUUkxfUElOKDYzLCAiVUFSVDFfQ1RTQiIpLAorCVBJTkNUUkxfUElOKDY0LCAiSTJDMF9TREEiKSwKKwlQSU5DVFJMX1BJTig2NSwgIkkyQzBfU0NMIiksCisJUElOQ1RSTF9QSU4oNjYsICJJMkMxX1NEQSIpLAorCVBJTkNUUkxfUElOKDY3LCAiSTJDMV9TQ0wiKSwKKwlQSU5DVFJMX1BJTig2OCwgIlVBUlQyX1JYRCIpLAorCVBJTkNUUkxfUElOKDY5LCAiVUFSVDJfVFhEIiksCisJUElOQ1RSTF9QSU4oNzAsICJVQVJUMl9SVFNCIiksCisJUElOQ1RSTF9QSU4oNzEsICJVQVJUMl9DVFNCIiksCisJLyogR1BQX0QgKi8KKwlQSU5DVFJMX1BJTig3MiwgIlNQSTFfQ1NCIiksCisJUElOQ1RSTF9QSU4oNzMsICJTUEkxX0NMSyIpLAorCVBJTkNUUkxfUElOKDc0LCAiU1BJMV9NSVNPX0lPXzEiKSwKKwlQSU5DVFJMX1BJTig3NSwgIlNQSTFfTU9TSV9JT18wIiksCisJUElOQ1RSTF9QSU4oNzYsICJGTEFTSFRSSUciKSwKKwlQSU5DVFJMX1BJTig3NywgIklTSF9JMkMwX1NEQSIpLAorCVBJTkNUUkxfUElOKDc4LCAiSVNIX0kyQzBfU0NMIiksCisJUElOQ1RSTF9QSU4oNzksICJJU0hfSTJDMV9TREEiKSwKKwlQSU5DVFJMX1BJTig4MCwgIklTSF9JMkMxX1NDTCIpLAorCVBJTkNUUkxfUElOKDgxLCAiSVNIX1NQSV9DU0IiKSwKKwlQSU5DVFJMX1BJTig4MiwgIklTSF9TUElfQ0xLIiksCisJUElOQ1RSTF9QSU4oODMsICJJU0hfU1BJX01JU08iKSwKKwlQSU5DVFJMX1BJTig4NCwgIklTSF9TUElfTU9TSSIpLAorCVBJTkNUUkxfUElOKDg1LCAiSVNIX1VBUlQwX1JYRCIpLAorCVBJTkNUUkxfUElOKDg2LCAiSVNIX1VBUlQwX1RYRCIpLAorCVBJTkNUUkxfUElOKDg3LCAiSVNIX1VBUlQwX1JUU0IiKSwKKwlQSU5DVFJMX1BJTig4OCwgIklTSF9VQVJUMF9DVFNCIiksCisJUElOQ1RSTF9QSU4oODksICJETUlDX0NMS18xIiksCisJUElOQ1RSTF9QSU4oOTAsICJETUlDX0RBVEFfMSIpLAorCVBJTkNUUkxfUElOKDkxLCAiRE1JQ19DTEtfMCIpLAorCVBJTkNUUkxfUElOKDkyLCAiRE1JQ19EQVRBXzAiKSwKKwlQSU5DVFJMX1BJTig5MywgIlNQSTFfSU9fMiIpLAorCVBJTkNUUkxfUElOKDk0LCAiU1BJMV9JT18zIiksCisJUElOQ1RSTF9QSU4oOTUsICJTU1BfTUNMSyIpLAorCS8qIEdQUF9FICovCisJUElOQ1RSTF9QSU4oOTYsICJTQVRBWFBDSUVfMCIpLAorCVBJTkNUUkxfUElOKDk3LCAiU0FUQVhQQ0lFXzEiKSwKKwlQSU5DVFJMX1BJTig5OCwgIlNBVEFYUENJRV8yIiksCisJUElOQ1RSTF9QSU4oOTksICJDUFVfR1BfMCIpLAorCVBJTkNUUkxfUElOKDEwMCwgIlNBVEFfREVWU0xQXzAiKSwKKwlQSU5DVFJMX1BJTigxMDEsICJTQVRBX0RFVlNMUF8xIiksCisJUElOQ1RSTF9QSU4oMTAyLCAiU0FUQV9ERVZTTFBfMiIpLAorCVBJTkNUUkxfUElOKDEwMywgIkNQVV9HUF8xIiksCisJUElOQ1RSTF9QSU4oMTA0LCAiU0FUQV9MRURCIiksCisJUElOQ1RSTF9QSU4oMTA1LCAiVVNCMl9PQ0JfMCIpLAorCVBJTkNUUkxfUElOKDEwNiwgIlVTQjJfT0NCXzEiKSwKKwlQSU5DVFJMX1BJTigxMDcsICJVU0IyX09DQl8yIiksCisJUElOQ1RSTF9QSU4oMTA4LCAiVVNCMl9PQ0JfMyIpLAorCVBJTkNUUkxfUElOKDEwOSwgIkREU1BfSFBEXzAiKSwKKwlQSU5DVFJMX1BJTigxMTAsICJERFNQX0hQRF8xIiksCisJUElOQ1RSTF9QSU4oMTExLCAiRERTUF9IUERfMiIpLAorCVBJTkNUUkxfUElOKDExMiwgIkREU1BfSFBEXzMiKSwKKwlQSU5DVFJMX1BJTigxMTMsICJFRFBfSFBEIiksCisJUElOQ1RSTF9QSU4oMTE0LCAiRERQQl9DVFJMQ0xLIiksCisJUElOQ1RSTF9QSU4oMTE1LCAiRERQQl9DVFJMREFUQSIpLAorCVBJTkNUUkxfUElOKDExNiwgIkREUENfQ1RSTENMSyIpLAorCVBJTkNUUkxfUElOKDExNywgIkREUENfQ1RSTERBVEEiKSwKKwlQSU5DVFJMX1BJTigxMTgsICJERFBEX0NUUkxDTEsiKSwKKwlQSU5DVFJMX1BJTigxMTksICJERFBEX0NUUkxEQVRBIiksCisJLyogR1BQX0YgKi8KKwlQSU5DVFJMX1BJTigxMjAsICJTU1AyX1NDTEsiKSwKKwlQSU5DVFJMX1BJTigxMjEsICJTU1AyX1NGUk0iKSwKKwlQSU5DVFJMX1BJTigxMjIsICJTU1AyX1RYRCIpLAorCVBJTkNUUkxfUElOKDEyMywgIlNTUDJfUlhEIiksCisJUElOQ1RSTF9QSU4oMTI0LCAiSTJDMl9TREEiKSwKKwlQSU5DVFJMX1BJTigxMjUsICJJMkMyX1NDTCIpLAorCVBJTkNUUkxfUElOKDEyNiwgIkkyQzNfU0RBIiksCisJUElOQ1RSTF9QSU4oMTI3LCAiSTJDM19TQ0wiKSwKKwlQSU5DVFJMX1BJTigxMjgsICJJMkM0X1NEQSIpLAorCVBJTkNUUkxfUElOKDEyOSwgIkkyQzRfU0NMIiksCisJUElOQ1RSTF9QSU4oMTMwLCAiSTJDNV9TREEiKSwKKwlQSU5DVFJMX1BJTigxMzEsICJJMkM1X1NDTCIpLAorCVBJTkNUUkxfUElOKDEzMiwgIkVNTUNfQ01EIiksCisJUElOQ1RSTF9QSU4oMTMzLCAiRU1NQ19EQVRBXzAiKSwKKwlQSU5DVFJMX1BJTigxMzQsICJFTU1DX0RBVEFfMSIpLAorCVBJTkNUUkxfUElOKDEzNSwgIkVNTUNfREFUQV8yIiksCisJUElOQ1RSTF9QSU4oMTM2LCAiRU1NQ19EQVRBXzMiKSwKKwlQSU5DVFJMX1BJTigxMzcsICJFTU1DX0RBVEFfNCIpLAorCVBJTkNUUkxfUElOKDEzOCwgIkVNTUNfREFUQV81IiksCisJUElOQ1RSTF9QSU4oMTM5LCAiRU1NQ19EQVRBXzYiKSwKKwlQSU5DVFJMX1BJTigxNDAsICJFTU1DX0RBVEFfNyIpLAorCVBJTkNUUkxfUElOKDE0MSwgIkVNTUNfUkNMSyIpLAorCVBJTkNUUkxfUElOKDE0MiwgIkVNTUNfQ0xLIiksCisJUElOQ1RSTF9QSU4oMTQzLCAiR1BQX0ZfMjMiKSwKKwkvKiBHUFBfRyAqLworCVBJTkNUUkxfUElOKDE0NCwgIlNEX0NNRCIpLAorCVBJTkNUUkxfUElOKDE0NSwgIlNEX0RBVEFfMCIpLAorCVBJTkNUUkxfUElOKDE0NiwgIlNEX0RBVEFfMSIpLAorCVBJTkNUUkxfUElOKDE0NywgIlNEX0RBVEFfMiIpLAorCVBJTkNUUkxfUElOKDE0OCwgIlNEX0RBVEFfMyIpLAorCVBJTkNUUkxfUElOKDE0OSwgIlNEX0NEQiIpLAorCVBJTkNUUkxfUElOKDE1MCwgIlNEX0NMSyIpLAorCVBJTkNUUkxfUElOKDE1MSwgIlNEX1dQIiksCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3B0bHBfc3BpMF9waW5zW10gPSB7IDM5LCA0MCwgNDEsIDQyIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3B0bHBfc3BpMV9waW5zW10gPSB7IDQzLCA0NCwgNDUsIDQ2IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3B0bHBfdWFydDBfcGluc1tdID0geyA1NiwgNTcsIDU4LCA1OSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwdGxwX3VhcnQxX3BpbnNbXSA9IHsgNjAsIDYxLCA2MiwgNjMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcHRscF91YXJ0Ml9waW5zW10gPSB7IDY4LCA2OSwgNzEsIDcxIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3B0bHBfaTJjMF9waW5zW10gPSB7IDY0LCA2NSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwdGxwX2kyYzFfcGluc1tdID0geyA2NiwgNjcgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcHRscF9pMmMyX3BpbnNbXSA9IHsgMTI0LCAxMjUgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcHRscF9pMmMzX3BpbnNbXSA9IHsgMTI2LCAxMjcgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcHRscF9pMmM0X3BpbnNbXSA9IHsgMTI4LCAxMjkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcHRscF9pMmM0Yl9waW5zW10gPSB7IDg1LCA4NiB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwdGxwX2kyYzVfcGluc1tdID0geyAxMzAsIDEzMSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwdGxwX3NzcDJfcGluc1tdID0geyAxMjAsIDEyMSwgMTIyLCAxMjMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcHRscF9lbW1jX3BpbnNbXSA9IHsKKwkxMzIsIDEzMywgMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3B0bHBfc2RfcGluc1tdID0geworCTE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbnRlbF9waW5ncm91cCBzcHRscF9ncm91cHNbXSA9IHsKKwlQSU5fR1JPVVAoInNwaTBfZ3JwIiwgc3B0bHBfc3BpMF9waW5zLCAxKSwKKwlQSU5fR1JPVVAoInNwaTFfZ3JwIiwgc3B0bHBfc3BpMV9waW5zLCAxKSwKKwlQSU5fR1JPVVAoInVhcnQwX2dycCIsIHNwdGxwX3VhcnQwX3BpbnMsIDEpLAorCVBJTl9HUk9VUCgidWFydDFfZ3JwIiwgc3B0bHBfdWFydDFfcGlucywgMSksCisJUElOX0dST1VQKCJ1YXJ0Ml9ncnAiLCBzcHRscF91YXJ0Ml9waW5zLCAxKSwKKwlQSU5fR1JPVVAoImkyYzBfZ3JwIiwgc3B0bHBfaTJjMF9waW5zLCAxKSwKKwlQSU5fR1JPVVAoImkyYzFfZ3JwIiwgc3B0bHBfaTJjMV9waW5zLCAxKSwKKwlQSU5fR1JPVVAoImkyYzJfZ3JwIiwgc3B0bHBfaTJjMl9waW5zLCAxKSwKKwlQSU5fR1JPVVAoImkyYzNfZ3JwIiwgc3B0bHBfaTJjM19waW5zLCAxKSwKKwlQSU5fR1JPVVAoImkyYzRfZ3JwIiwgc3B0bHBfaTJjNF9waW5zLCAxKSwKKwlQSU5fR1JPVVAoImkyYzRiX2dycCIsIHNwdGxwX2kyYzRiX3BpbnMsIDMpLAorCVBJTl9HUk9VUCgiaTJjNV9ncnAiLCBzcHRscF9pMmM1X3BpbnMsIDEpLAorCVBJTl9HUk9VUCgic3NwMl9ncnAiLCBzcHRscF9zc3AyX3BpbnMsIDEpLAorCVBJTl9HUk9VUCgiZW1tY19ncnAiLCBzcHRscF9lbW1jX3BpbnMsIDEpLAorCVBJTl9HUk9VUCgic2RfZ3JwIiwgc3B0bHBfc2RfcGlucywgMSksCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwdGxwX3NwaTBfZ3JvdXBzW10gPSB7ICJzcGkwX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3B0bHBfc3BpMV9ncm91cHNbXSA9IHsgInNwaTBfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcHRscF91YXJ0MF9ncm91cHNbXSA9IHsgInVhcnQwX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3B0bHBfdWFydDFfZ3JvdXBzW10gPSB7ICJ1YXJ0MV9ncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwdGxwX3VhcnQyX2dyb3Vwc1tdID0geyAidWFydDJfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcHRscF9pMmMwX2dyb3Vwc1tdID0geyAiaTJjMF9ncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwdGxwX2kyYzFfZ3JvdXBzW10gPSB7ICJpMmMxX2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3B0bHBfaTJjMl9ncm91cHNbXSA9IHsgImkyYzJfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcHRscF9pMmMzX2dyb3Vwc1tdID0geyAiaTJjM19ncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwdGxwX2kyYzRfZ3JvdXBzW10gPSB7ICJpMmM0X2dycCIsICJpMmM0Yl9ncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwdGxwX2kyYzVfZ3JvdXBzW10gPSB7ICJpMmM1X2dycCIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3B0bHBfc3NwMl9ncm91cHNbXSA9IHsgInNzcDJfZ3JwIiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzcHRscF9lbW1jX2dyb3Vwc1tdID0geyAiZW1tY19ncnAiIH07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwdGxwX3NkX2dyb3Vwc1tdID0geyAic2RfZ3JwIiB9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2Z1bmN0aW9uIHNwdGxwX2Z1bmN0aW9uc1tdID0geworCUZVTkNUSU9OKCJzcGkwIiwgc3B0bHBfc3BpMF9ncm91cHMpLAorCUZVTkNUSU9OKCJzcGkxIiwgc3B0bHBfc3BpMV9ncm91cHMpLAorCUZVTkNUSU9OKCJ1YXJ0MCIsIHNwdGxwX3VhcnQwX2dyb3VwcyksCisJRlVOQ1RJT04oInVhcnQxIiwgc3B0bHBfdWFydDFfZ3JvdXBzKSwKKwlGVU5DVElPTigidWFydDIiLCBzcHRscF91YXJ0Ml9ncm91cHMpLAorCUZVTkNUSU9OKCJpMmMwIiwgc3B0bHBfaTJjMF9ncm91cHMpLAorCUZVTkNUSU9OKCJpMmMxIiwgc3B0bHBfaTJjMV9ncm91cHMpLAorCUZVTkNUSU9OKCJpMmMyIiwgc3B0bHBfaTJjMl9ncm91cHMpLAorCUZVTkNUSU9OKCJpMmMzIiwgc3B0bHBfaTJjM19ncm91cHMpLAorCUZVTkNUSU9OKCJpMmM0Iiwgc3B0bHBfaTJjNF9ncm91cHMpLAorCUZVTkNUSU9OKCJpMmM1Iiwgc3B0bHBfaTJjNV9ncm91cHMpLAorCUZVTkNUSU9OKCJzc3AyIiwgc3B0bHBfc3NwMl9ncm91cHMpLAorCUZVTkNUSU9OKCJlbW1jIiwgc3B0bHBfZW1tY19ncm91cHMpLAorCUZVTkNUSU9OKCJzZCIsIHNwdGxwX3NkX2dyb3VwcyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX2NvbW11bml0eSBzcHRscF9jb21tdW5pdGllc1tdID0geworCVNQVF9DT01NVU5JVFkoMCwgMCwgNDcpLAorCVNQVF9DT01NVU5JVFkoMSwgNDgsIDExOSksCisJU1BUX0NPTU1VTklUWSgyLCAxMjAsIDE1MSksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGludGVsX3BpbmN0cmxfc29jX2RhdGEgc3B0bHBfc29jX2RhdGEgPSB7CisJLnBpbnMgPSBzcHRscF9waW5zLAorCS5ucGlucyA9IEFSUkFZX1NJWkUoc3B0bHBfcGlucyksCisJLmdyb3VwcyA9IHNwdGxwX2dyb3VwcywKKwkubmdyb3VwcyA9IEFSUkFZX1NJWkUoc3B0bHBfZ3JvdXBzKSwKKwkuZnVuY3Rpb25zID0gc3B0bHBfZnVuY3Rpb25zLAorCS5uZnVuY3Rpb25zID0gQVJSQVlfU0laRShzcHRscF9mdW5jdGlvbnMpLAorCS5jb21tdW5pdGllcyA9IHNwdGxwX2NvbW11bml0aWVzLAorCS5uY29tbXVuaXRpZXMgPSBBUlJBWV9TSVpFKHNwdGxwX2NvbW11bml0aWVzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgc3B0X3BpbmN0cmxfYWNwaV9tYXRjaFtdID0geworCXsgIklOVDM0NEIiLCAoa2VybmVsX3Vsb25nX3QpJnNwdGxwX3NvY19kYXRhIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBzcHRfcGluY3RybF9hY3BpX21hdGNoKTsKKworc3RhdGljIGludCBzcHRfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBpbnRlbF9waW5jdHJsX3NvY19kYXRhICpzb2NfZGF0YTsKKwljb25zdCBzdHJ1Y3QgYWNwaV9kZXZpY2VfaWQgKmlkOworCisJaWQgPSBhY3BpX21hdGNoX2RldmljZShzcHRfcGluY3RybF9hY3BpX21hdGNoLCAmcGRldi0+ZGV2KTsKKwlpZiAoIWlkIHx8ICFpZC0+ZHJpdmVyX2RhdGEpCisJCXJldHVybiAtRU5PREVWOworCisJc29jX2RhdGEgPSAoY29uc3Qgc3RydWN0IGludGVsX3BpbmN0cmxfc29jX2RhdGEgKilpZC0+ZHJpdmVyX2RhdGE7CisJcmV0dXJuIGludGVsX3BpbmN0cmxfcHJvYmUocGRldiwgc29jX2RhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc3B0X3BpbmN0cmxfcG1fb3BzID0geworCVNFVF9MQVRFX1NZU1RFTV9TTEVFUF9QTV9PUFMoaW50ZWxfcGluY3RybF9zdXNwZW5kLAorCQkJCSAgICAgaW50ZWxfcGluY3RybF9yZXN1bWUpCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzcHRfcGluY3RybF9kcml2ZXIgPSB7CisJLnByb2JlID0gc3B0X3BpbmN0cmxfcHJvYmUsCisJLnJlbW92ZSA9IGludGVsX3BpbmN0cmxfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInN1bnJpc2Vwb2ludC1waW5jdHJsIiwKKwkJLmFjcGlfbWF0Y2hfdGFibGUgPSBzcHRfcGluY3RybF9hY3BpX21hdGNoLAorCQkucG0gPSAmc3B0X3BpbmN0cmxfcG1fb3BzLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzcHRfcGluY3RybF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3B0X3BpbmN0cmxfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChzcHRfcGluY3RybF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHNwdF9waW5jdHJsX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3B0X3BpbmN0cmxfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNwdF9waW5jdHJsX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXRoaWFzIE55bWFuIDxtYXRoaWFzLm55bWFuQGxpbnV4LmludGVsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIk1pa2EgV2VzdGVyYmVyZyA8bWlrYS53ZXN0ZXJiZXJnQGxpbnV4LmludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgU3VucmlzZXBvaW50IFBDSCBwaW5jdHJsL0dQSU8gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvS2NvbmZpZyBiL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODNjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvS2NvbmZpZwpAQCAtMCwwICsxLDIzIEBACitpZiBBUkNIX01FRElBVEVLIHx8IENPTVBJTEVfVEVTVAorCitjb25maWcgUElOQ1RSTF9NVEtfQ09NTU9OCisJYm9vbAorCXNlbGVjdCBQSU5NVVgKKwlzZWxlY3QgR0VORVJJQ19QSU5DT05GCisJc2VsZWN0IEdQSU9MSUIKKwlzZWxlY3QgT0ZfR1BJTworCisjIEZvciBBUk12NyBTb0NzCitjb25maWcgUElOQ1RSTF9NVDgxMzUKKwlib29sICJNZWRpYXRlayBNVDgxMzUgcGluIGNvbnRyb2wiIGlmIENPTVBJTEVfVEVTVCAmJiAhTUFDSF9NVDgxMzUKKwlkZWZhdWx0IE1BQ0hfTVQ4MTM1CisJc2VsZWN0IFBJTkNUUkxfTVRLX0NPTU1PTgorCisjIEZvciBBUk12OCBTb0NzCitjb25maWcgUElOQ1RSTF9NVDgxNzMKKwlib29sICJNZWRpYXRlayBNVDgxNzMgcGluIGNvbnRyb2wiCisJZGVwZW5kcyBvbiBBUk02NCB8fCBDT01QSUxFX1RFU1QKKwlkZWZhdWx0IEFSTTY0ICYmIEFSQ0hfTUVESUFURUsKKwlzZWxlY3QgUElOQ1RSTF9NVEtfQ09NTU9OCisKK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvTWFrZWZpbGUgYi9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2MDZhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMgQ29yZQorb2JqLSQoQ09ORklHX1BJTkNUUkxfTVRLX0NPTU1PTikJKz0gcGluY3RybC1tdGstY29tbW9uLm8KKworIyBTb0MgRHJpdmVycworb2JqLSQoQ09ORklHX1BJTkNUUkxfTVQ4MTM1KQkJKz0gcGluY3RybC1tdDgxMzUubworb2JqLSQoQ09ORklHX1BJTkNUUkxfTVQ4MTczKQkJKz0gcGluY3RybC1tdDgxNzMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL3BpbmN0cmwtbXQ4MTM1LmMgYi9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvcGluY3RybC1tdDgxMzUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWUxZTE4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL3BpbmN0cmwtbXQ4MTM1LmMKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTWVkaWFUZWsgSW5jLgorICogQXV0aG9yOiBIb25nemhvdS5ZYW5nIDxob25nemhvdS55YW5nQG1lZGlhdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvcGluY3RybC9tdDY1eHguaD4KKworI2luY2x1ZGUgInBpbmN0cmwtbXRrLWNvbW1vbi5oIgorI2luY2x1ZGUgInBpbmN0cmwtbXRrLW10ODEzNS5oIgorCisjZGVmaW5lIERSVl9CQVNFMQkJCQkweDUwMAorI2RlZmluZSBEUlZfQkFTRTIJCQkJMHg1MTAKKyNkZWZpbmUgUFVQRF9CQVNFMQkJCQkweDQwMAorI2RlZmluZSBQVVBEX0JBU0UyCQkJCTB4NDUwCisjZGVmaW5lIFIwX0JBU0UxCQkJCTB4NGQwCisjZGVmaW5lIFIxX0JBU0UxCQkJCTB4MjAwCisjZGVmaW5lIFIxX0JBU0UyCQkJCTB4MjUwCisKK3N0cnVjdCBtdGtfc3BlY19wdWxsX3NldCB7CisJdW5zaWduZWQgaW50IHBpbjsKKwl1bnNpZ25lZCBpbnQgcHVwZF9vZmZzZXQ7CisJdW5zaWduZWQgY2hhciBwdXBkX2JpdDsKKwl1bnNpZ25lZCBpbnQgcjBfb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgcjBfYml0OworCXVuc2lnbmVkIGludCByMV9vZmZzZXQ7CisJdW5zaWduZWQgY2hhciByMV9iaXQ7Cit9OworCisjZGVmaW5lIFNQRUNfUFVMTChfcGluLCBfcHVwZF9vZmZzZXQsIF9wdXBkX2JpdCwgX3IwX29mZnNldCwgXAorCV9yMF9iaXQsIF9yMV9vZmZzZXQsIF9yMV9iaXQpCVwKKwl7CVwKKwkJLnBpbiA9IF9waW4sCVwKKwkJLnB1cGRfb2Zmc2V0ID0gX3B1cGRfb2Zmc2V0LAlcCisJCS5wdXBkX2JpdCA9IF9wdXBkX2JpdCwJXAorCQkucjBfb2Zmc2V0ID0gX3IwX29mZnNldCwgXAorCQkucjBfYml0ID0gX3IwX2JpdCwgXAorCQkucjFfb2Zmc2V0ID0gX3IxX29mZnNldCwgXAorCQkucjFfYml0ID0gX3IxX2JpdCwgXAorCX0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZHJ2X2dyb3VwX2Rlc2MgbXQ4MTM1X2Rydl9ncnBbXSA9ICB7CisJLyogRThFNEUyIDIvNC82LzgvMTAvMTIvMTQvMTYgKi8KKwlNVEtfRFJWX0dSUCgyLCAxNiwgMCwgMiwgMiksCisJLyogRThFNCAgNC84LzEyLzE2ICovCisJTVRLX0RSVl9HUlAoNCwgMTYsIDEsIDIsIDQpLAorCS8qIEU0RTIgIDIvNC82LzggKi8KKwlNVEtfRFJWX0dSUCgyLCA4LCAwLCAxLCAyKSwKKwkvKiBFMTZFOEU0IDQvOC8xMi8xNi8yMC8yNC8yOC8zMiAqLworCU1US19EUlZfR1JQKDQsIDMyLCAwLCAyLCA0KQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfcGluX2Rydl9ncnAgbXQ4MTM1X3Bpbl9kcnZbXSA9IHsKKwlNVEtfUElOX0RSVl9HUlAoMCwgRFJWX0JBU0UxLCAwLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoMSwgRFJWX0JBU0UxLCAwLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoMiwgRFJWX0JBU0UxLCAwLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoMywgRFJWX0JBU0UxLCAwLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoNCwgRFJWX0JBU0UxLCA0LCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoNSwgRFJWX0JBU0UxLCA4LCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoNiwgRFJWX0JBU0UxLCAwLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoNywgRFJWX0JBU0UxLCAwLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoOCwgRFJWX0JBU0UxLCAwLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoOSwgRFJWX0JBU0UxLCAwLCAwKSwKKworCU1US19QSU5fRFJWX0dSUCgxMCwgRFJWX0JBU0UxLCAxMiwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDExLCBEUlZfQkFTRTEsIDEyLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMTIsIERSVl9CQVNFMSwgMTIsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMywgRFJWX0JBU0UxLCAxMiwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDE0LCBEUlZfQkFTRTEsIDEyLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMTUsIERSVl9CQVNFMSwgMTIsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxNiwgRFJWX0JBU0UxLCAxMiwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDE3LCBEUlZfQkFTRTEsIDE2LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMTgsIERSVl9CQVNFMSwgMTYsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxOSwgRFJWX0JBU0UxLCAxNiwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDIwLCBEUlZfQkFTRTEsIDE2LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMjEsIERSVl9CQVNFMSwgMTYsIDEpLAorCU1US19QSU5fRFJWX0dSUCgyMiwgRFJWX0JBU0UxLCAxNiwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDIzLCBEUlZfQkFTRTEsIDE2LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMjQsIERSVl9CQVNFMSwgMTYsIDEpLAorCU1US19QSU5fRFJWX0dSUCgzMywgRFJWX0JBU0UxLCAyNCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDM0LCBEUlZfQkFTRTIsIDEyLCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMzcsIERSVl9CQVNFMiwgMjAsIDEpLAorCU1US19QSU5fRFJWX0dSUCgzOCwgRFJWX0JBU0UyLCAyMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDM5LCBEUlZfQkFTRTIsIDIwLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNDAsIERSVl9CQVNFMiwgMjQsIDEpLAorCU1US19QSU5fRFJWX0dSUCg0MSwgRFJWX0JBU0UyLCAyNCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDQyLCBEUlZfQkFTRTIsIDI0LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNDMsIERSVl9CQVNFMiwgMjgsIDEpLAorCU1US19QSU5fRFJWX0dSUCg0NCwgRFJWX0JBU0UyLCAyOCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDQ1LCBEUlZfQkFTRTIsIDI4LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNDYsIERSVl9CQVNFMiwgMjgsIDEpLAorCU1US19QSU5fRFJWX0dSUCg0NywgRFJWX0JBU0UyLCAyOCwgMSksCisKKwlNVEtfUElOX0RSVl9HUlAoNDksIERSVl9CQVNFMisweDEwLCAwLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNTAsIERSVl9CQVNFMisweDEwLCA0LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNTEsIERSVl9CQVNFMisweDEwLCA4LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNTIsIERSVl9CQVNFMisweDEwLCAxMiwgMiksCisJTVRLX1BJTl9EUlZfR1JQKDUzLCBEUlZfQkFTRTIrMHgxMCwgMTYsIDEpLAorCU1US19QSU5fRFJWX0dSUCg1NCwgRFJWX0JBU0UyKzB4MTAsIDIwLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNTUsIERSVl9CQVNFMisweDEwLCAyNCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDU2LCBEUlZfQkFTRTIrMHgxMCwgMjgsIDEpLAorCisJTVRLX1BJTl9EUlZfR1JQKDU3LCBEUlZfQkFTRTIrMHgyMCwgMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDU4LCBEUlZfQkFTRTIrMHgyMCwgMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDU5LCBEUlZfQkFTRTIrMHgyMCwgMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDYwLCBEUlZfQkFTRTIrMHgyMCwgMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDYxLCBEUlZfQkFTRTIrMHgyMCwgMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDYyLCBEUlZfQkFTRTIrMHgyMCwgMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDYzLCBEUlZfQkFTRTIrMHgyMCwgNCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDY0LCBEUlZfQkFTRTIrMHgyMCwgOCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDY1LCBEUlZfQkFTRTIrMHgyMCwgMTIsIDEpLAorCU1US19QSU5fRFJWX0dSUCg2NiwgRFJWX0JBU0UyKzB4MjAsIDE2LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNjcsIERSVl9CQVNFMisweDIwLCAyMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDY4LCBEUlZfQkFTRTIrMHgyMCwgMjQsIDEpLAorCU1US19QSU5fRFJWX0dSUCg2OSwgRFJWX0JBU0UyKzB4MjAsIDI4LCAxKSwKKworCU1US19QSU5fRFJWX0dSUCg3MCwgRFJWX0JBU0UyKzB4MzAsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCg3MSwgRFJWX0JBU0UyKzB4MzAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCg3MiwgRFJWX0JBU0UyKzB4MzAsIDgsIDEpLAorCU1US19QSU5fRFJWX0dSUCg3MywgRFJWX0JBU0UyKzB4MzAsIDEyLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNzQsIERSVl9CQVNFMisweDMwLCAxNiwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDc1LCBEUlZfQkFTRTIrMHgzMCwgMjAsIDEpLAorCU1US19QSU5fRFJWX0dSUCg3NiwgRFJWX0JBU0UyKzB4MzAsIDI0LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNzcsIERSVl9CQVNFMisweDMwLCAyOCwgMyksCisJTVRLX1BJTl9EUlZfR1JQKDc4LCBEUlZfQkFTRTIrMHgzMCwgMjgsIDMpLAorCisJTVRLX1BJTl9EUlZfR1JQKDc5LCBEUlZfQkFTRTIrMHg0MCwgMCwgMyksCisJTVRLX1BJTl9EUlZfR1JQKDgwLCBEUlZfQkFTRTIrMHg0MCwgNCwgMyksCisKKwlNVEtfUElOX0RSVl9HUlAoODEsIERSVl9CQVNFMisweDMwLCAyOCwgMyksCisJTVRLX1BJTl9EUlZfR1JQKDgyLCBEUlZfQkFTRTIrMHgzMCwgMjgsIDMpLAorCisJTVRLX1BJTl9EUlZfR1JQKDgzLCBEUlZfQkFTRTIrMHg0MCwgOCwgMyksCisJTVRLX1BJTl9EUlZfR1JQKDg0LCBEUlZfQkFTRTIrMHg0MCwgOCwgMyksCisJTVRLX1BJTl9EUlZfR1JQKDg1LCBEUlZfQkFTRTIrMHg0MCwgMTIsIDMpLAorCU1US19QSU5fRFJWX0dSUCg4NiwgRFJWX0JBU0UyKzB4NDAsIDE2LCAzKSwKKwlNVEtfUElOX0RSVl9HUlAoODcsIERSVl9CQVNFMisweDQwLCA4LCAzKSwKKwlNVEtfUElOX0RSVl9HUlAoODgsIERSVl9CQVNFMisweDQwLCA4LCAzKSwKKworCU1US19QSU5fRFJWX0dSUCg4OSwgRFJWX0JBU0UyKzB4NTAsIDEyLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoOTAsIERSVl9CQVNFMisweDUwLCAxMiwgMCksCisJTVRLX1BJTl9EUlZfR1JQKDkxLCBEUlZfQkFTRTIrMHg1MCwgMTIsIDApLAorCU1US19QSU5fRFJWX0dSUCg5MiwgRFJWX0JBU0UyKzB4NTAsIDEyLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoOTMsIERSVl9CQVNFMisweDUwLCAxMiwgMCksCisJTVRLX1BJTl9EUlZfR1JQKDk0LCBEUlZfQkFTRTIrMHg1MCwgMTIsIDApLAorCU1US19QSU5fRFJWX0dSUCg5NSwgRFJWX0JBU0UyKzB4NTAsIDEyLCAwKSwKKworCU1US19QSU5fRFJWX0dSUCg5NiwgRFJWX0JBU0UxKzB4YjAsIDI4LCAwKSwKKworCU1US19QSU5fRFJWX0dSUCg5NywgRFJWX0JBU0UyKzB4NTAsIDEyLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoOTgsIERSVl9CQVNFMisweDUwLCAxNiwgMCksCisJTVRLX1BJTl9EUlZfR1JQKDk5LCBEUlZfQkFTRTIrMHg1MCwgMjAsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMDIsIERSVl9CQVNFMisweDUwLCAyNCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDEwMywgRFJWX0JBU0UyKzB4NTAsIDI4LCAxKSwKKworCisJTVRLX1BJTl9EUlZfR1JQKDEwNCwgRFJWX0JBU0UyKzB4NjAsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMDUsIERSVl9CQVNFMisweDYwLCA0LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMTA2LCBEUlZfQkFTRTIrMHg2MCwgNCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDEwNywgRFJWX0JBU0UyKzB4NjAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMDgsIERSVl9CQVNFMisweDYwLCA0LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMTA5LCBEUlZfQkFTRTIrMHg2MCwgOCwgMiksCisJTVRLX1BJTl9EUlZfR1JQKDExMCwgRFJWX0JBU0UyKzB4NjAsIDEyLCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMTExLCBEUlZfQkFTRTIrMHg2MCwgMTYsIDIpLAorCU1US19QSU5fRFJWX0dSUCgxMTIsIERSVl9CQVNFMisweDYwLCAyMCwgMiksCisJTVRLX1BJTl9EUlZfR1JQKDExMywgRFJWX0JBU0UyKzB4NjAsIDI0LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMTE0LCBEUlZfQkFTRTIrMHg2MCwgMjgsIDIpLAorCisJTVRLX1BJTl9EUlZfR1JQKDExNSwgRFJWX0JBU0UyKzB4NzAsIDAsIDIpLAorCU1US19QSU5fRFJWX0dSUCgxMTYsIERSVl9CQVNFMisweDcwLCA0LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMTE3LCBEUlZfQkFTRTIrMHg3MCwgOCwgMiksCisJTVRLX1BJTl9EUlZfR1JQKDExOCwgRFJWX0JBU0UyKzB4NzAsIDEyLCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMTE5LCBEUlZfQkFTRTIrMHg3MCwgMTYsIDIpLAorCU1US19QSU5fRFJWX0dSUCgxMjAsIERSVl9CQVNFMisweDcwLCAyMCwgMiksCisKKwlNVEtfUElOX0RSVl9HUlAoMTgxLCBEUlZfQkFTRTErMHhhMCwgMTIsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxODIsIERSVl9CQVNFMSsweGEwLCAxNiwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDE4MywgRFJWX0JBU0UxKzB4YTAsIDIwLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMTg0LCBEUlZfQkFTRTErMHhhMCwgMjQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxODUsIERSVl9CQVNFMSsweGEwLCAyOCwgMSksCisKKwlNVEtfUElOX0RSVl9HUlAoMTg2LCBEUlZfQkFTRTErMHhiMCwgMCwgMiksCisJTVRLX1BJTl9EUlZfR1JQKDE4NywgRFJWX0JBU0UxKzB4YjAsIDAsIDIpLAorCU1US19QSU5fRFJWX0dSUCgxODgsIERSVl9CQVNFMSsweGIwLCAwLCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMTg5LCBEUlZfQkFTRTErMHhiMCwgMCwgMiksCisJTVRLX1BJTl9EUlZfR1JQKDE5MCwgRFJWX0JBU0UxKzB4YjAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxOTEsIERSVl9CQVNFMSsweGIwLCA4LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMTkyLCBEUlZfQkFTRTErMHhiMCwgMTIsIDEpLAorCisJTVRLX1BJTl9EUlZfR1JQKDE5NywgRFJWX0JBU0UxKzB4YjAsIDE2LCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoMTk4LCBEUlZfQkFTRTErMHhiMCwgMTYsIDApLAorCU1US19QSU5fRFJWX0dSUCgxOTksIERSVl9CQVNFMSsweGIwLCAyMCwgMCksCisJTVRLX1BJTl9EUlZfR1JQKDIwMCwgRFJWX0JBU0UxKzB4YjAsIDI0LCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoMjAxLCBEUlZfQkFTRTErMHhiMCwgMTYsIDApLAorCU1US19QSU5fRFJWX0dSUCgyMDIsIERSVl9CQVNFMSsweGIwLCAxNiwgMCkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX3NwZWNfcHVsbF9zZXQgc3BlY19wdXBkW10gPSB7CisJU1BFQ19QVUxMKDAsIFBVUERfQkFTRTEsIDAsIFIwX0JBU0UxLCA5LCBSMV9CQVNFMSwgMCksCisJU1BFQ19QVUxMKDEsIFBVUERfQkFTRTEsIDEsIFIwX0JBU0UxLCA4LCBSMV9CQVNFMSwgMSksCisJU1BFQ19QVUxMKDIsIFBVUERfQkFTRTEsIDIsIFIwX0JBU0UxLCA3LCBSMV9CQVNFMSwgMiksCisJU1BFQ19QVUxMKDMsIFBVUERfQkFTRTEsIDMsIFIwX0JBU0UxLCA2LCBSMV9CQVNFMSwgMyksCisJU1BFQ19QVUxMKDQsIFBVUERfQkFTRTEsIDQsIFIwX0JBU0UxLCAxLCBSMV9CQVNFMSwgNCksCisJU1BFQ19QVUxMKDUsIFBVUERfQkFTRTEsIDUsIFIwX0JBU0UxLCAwLCBSMV9CQVNFMSwgNSksCisJU1BFQ19QVUxMKDYsIFBVUERfQkFTRTEsIDYsIFIwX0JBU0UxLCA1LCBSMV9CQVNFMSwgNiksCisJU1BFQ19QVUxMKDcsIFBVUERfQkFTRTEsIDcsIFIwX0JBU0UxLCA0LCBSMV9CQVNFMSwgNyksCisJU1BFQ19QVUxMKDgsIFBVUERfQkFTRTEsIDgsIFIwX0JBU0UxLCAzLCBSMV9CQVNFMSwgOCksCisJU1BFQ19QVUxMKDksIFBVUERfQkFTRTEsIDksIFIwX0JBU0UxLCAyLCBSMV9CQVNFMSwgOSksCisJU1BFQ19QVUxMKDg5LCBQVVBEX0JBU0UyLCA5LCBSMF9CQVNFMSwgMTgsIFIxX0JBU0UyLCA5KSwKKwlTUEVDX1BVTEwoOTAsIFBVUERfQkFTRTIsIDEwLCBSMF9CQVNFMSwgMTksIFIxX0JBU0UyLCAxMCksCisJU1BFQ19QVUxMKDkxLCBQVVBEX0JBU0UyLCAxMSwgUjBfQkFTRTEsIDIzLCBSMV9CQVNFMiwgMTEpLAorCVNQRUNfUFVMTCg5MiwgUFVQRF9CQVNFMiwgMTIsIFIwX0JBU0UxLCAyNCwgUjFfQkFTRTIsIDEyKSwKKwlTUEVDX1BVTEwoOTMsIFBVUERfQkFTRTIsIDEzLCBSMF9CQVNFMSwgMjUsIFIxX0JBU0UyLCAxMyksCisJU1BFQ19QVUxMKDk0LCBQVVBEX0JBU0UyLCAxNCwgUjBfQkFTRTEsIDIyLCBSMV9CQVNFMiwgMTQpLAorCVNQRUNfUFVMTCg5NSwgUFVQRF9CQVNFMiwgMTUsIFIwX0JBU0UxLCAyMCwgUjFfQkFTRTIsIDE1KSwKKwlTUEVDX1BVTEwoOTYsIFBVUERfQkFTRTIrMHgxMCwgMCwgUjBfQkFTRTEsIDE2LCBSMV9CQVNFMisweDEwLCAwKSwKKwlTUEVDX1BVTEwoOTcsIFBVUERfQkFTRTIrMHgxMCwgMSwgUjBfQkFTRTEsIDIxLCBSMV9CQVNFMisweDEwLCAxKSwKKwlTUEVDX1BVTEwoOTgsIFBVUERfQkFTRTIrMHgxMCwgMiwgUjBfQkFTRTEsIDE3LCBSMV9CQVNFMisweDEwLCAyKSwKKwlTUEVDX1BVTEwoMTk3LCBQVVBEX0JBU0UxKzB4YzAsIDUsIFIwX0JBU0UxLCAxMywgUjFfQkFTRTIrMHhjMCwgNSksCisJU1BFQ19QVUxMKDE5OCwgUFVQRF9CQVNFMisweGMwLCA2LCBSMF9CQVNFMSwgMTQsIFIxX0JBU0UyKzB4YzAsIDYpLAorCVNQRUNfUFVMTCgxOTksIFBVUERfQkFTRTIrMHhjMCwgNywgUjBfQkFTRTEsIDExLCBSMV9CQVNFMisweGMwLCA3KSwKKwlTUEVDX1BVTEwoMjAwLCBQVVBEX0JBU0UyKzB4YzAsIDgsIFIwX0JBU0UxLCAxMCwgUjFfQkFTRTIrMHhjMCwgOCksCisJU1BFQ19QVUxMKDIwMSwgUFVQRF9CQVNFMisweGMwLCA5LCBSMF9CQVNFMSwgMTMsIFIxX0JBU0UyKzB4YzAsIDkpLAorCVNQRUNfUFVMTCgyMDIsIFBVUERfQkFTRTIrMHhjMCwgMTAsIFIwX0JBU0UxLCAxMiwgUjFfQkFTRTIrMHhjMCwgMTApCit9OworCitzdGF0aWMgaW50IHNwZWNfcHVsbF9zZXQoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCB1bnNpZ25lZCBpbnQgcGluLAorCQl1bnNpZ25lZCBjaGFyIGFsaWduLCBib29sIGlzdXAsIHVuc2lnbmVkIGludCByMXIwKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCByZWdfcHVwZCwgcmVnX3NldF9yMCwgcmVnX3NldF9yMTsKKwl1bnNpZ25lZCBpbnQgcmVnX3JzdF9yMCwgcmVnX3JzdF9yMTsKKwlib29sIGZpbmQgPSBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNwZWNfcHVwZCk7IGkrKykgeworCQlpZiAocGluID09IHNwZWNfcHVwZFtpXS5waW4pIHsKKwkJCWZpbmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZpbmQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGlzdXApCisJCXJlZ19wdXBkID0gc3BlY19wdXBkW2ldLnB1cGRfb2Zmc2V0ICsgYWxpZ247CisJZWxzZQorCQlyZWdfcHVwZCA9IHNwZWNfcHVwZFtpXS5wdXBkX29mZnNldCArIChhbGlnbiA8PCAxKTsKKworCXJlZ21hcF93cml0ZShyZWdtYXAsIHJlZ19wdXBkLCBzcGVjX3B1cGRbaV0ucHVwZF9iaXQpOworCisJcmVnX3NldF9yMCA9IHNwZWNfcHVwZFtpXS5yMF9vZmZzZXQgKyBhbGlnbjsKKwlyZWdfcnN0X3IwID0gc3BlY19wdXBkW2ldLnIwX29mZnNldCArIChhbGlnbiA8PCAxKTsKKwlyZWdfc2V0X3IxID0gc3BlY19wdXBkW2ldLnIxX29mZnNldCArIGFsaWduOworCXJlZ19yc3RfcjEgPSBzcGVjX3B1cGRbaV0ucjFfb2Zmc2V0ICsgKGFsaWduIDw8IDEpOworCisJc3dpdGNoIChyMXIwKSB7CisJY2FzZSBNVEtfUFVQRF9TRVRfUjFSMF8wMDoKKwkJcmVnbWFwX3dyaXRlKHJlZ21hcCwgcmVnX3JzdF9yMCwgc3BlY19wdXBkW2ldLnIwX2JpdCk7CisJCXJlZ21hcF93cml0ZShyZWdtYXAsIHJlZ19yc3RfcjEsIHNwZWNfcHVwZFtpXS5yMV9iaXQpOworCQlicmVhazsKKwljYXNlIE1US19QVVBEX1NFVF9SMVIwXzAxOgorCQlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfc2V0X3IwLCBzcGVjX3B1cGRbaV0ucjBfYml0KTsKKwkJcmVnbWFwX3dyaXRlKHJlZ21hcCwgcmVnX3JzdF9yMSwgc3BlY19wdXBkW2ldLnIxX2JpdCk7CisJCWJyZWFrOworCWNhc2UgTVRLX1BVUERfU0VUX1IxUjBfMTA6CisJCXJlZ21hcF93cml0ZShyZWdtYXAsIHJlZ19yc3RfcjAsIHNwZWNfcHVwZFtpXS5yMF9iaXQpOworCQlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfc2V0X3IxLCBzcGVjX3B1cGRbaV0ucjFfYml0KTsKKwkJYnJlYWs7CisJY2FzZSBNVEtfUFVQRF9TRVRfUjFSMF8xMToKKwkJcmVnbWFwX3dyaXRlKHJlZ21hcCwgcmVnX3NldF9yMCwgc3BlY19wdXBkW2ldLnIwX2JpdCk7CisJCXJlZ21hcF93cml0ZShyZWdtYXAsIHJlZ19zZXRfcjEsIHNwZWNfcHVwZFtpXS5yMV9iaXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfcGluY3RybF9kZXZkYXRhIG10ODEzNV9waW5jdHJsX2RhdGEgPSB7CisJLnBpbnMgPSBtdGtfcGluc19tdDgxMzUsCisJLm5waW5zID0gQVJSQVlfU0laRShtdGtfcGluc19tdDgxMzUpLAorCS5ncnBfZGVzYyA9IG10ODEzNV9kcnZfZ3JwLAorCS5uX2dycF9jbHMgPSBBUlJBWV9TSVpFKG10ODEzNV9kcnZfZ3JwKSwKKwkucGluX2Rydl9ncnAgPSBtdDgxMzVfcGluX2RydiwKKwkubl9waW5fZHJ2X2dycHMgPSBBUlJBWV9TSVpFKG10ODEzNV9waW5fZHJ2KSwKKwkuc3BlY19wdWxsX3NldCA9IHNwZWNfcHVsbF9zZXQsCisJLmRpcl9vZmZzZXQgPSAweDAwMDAsCisJLmllc19vZmZzZXQgPSAweDAxMDAsCisJLnB1bGxlbl9vZmZzZXQgPSAweDAyMDAsCisJLnNtdF9vZmZzZXQgPSAweDAzMDAsCisJLnB1bGxzZWxfb2Zmc2V0ID0gMHgwNDAwLAorCS5pbnZzZXJfb2Zmc2V0ID0gMHgwNjAwLAorCS5kb3V0X29mZnNldCA9IDB4MDgwMCwKKwkuZGluX29mZnNldCA9IDB4MEEwMCwKKwkucGlubXV4X29mZnNldCA9IDB4MEMwMCwKKwkudHlwZTFfc3RhcnQgPSAzNCwKKwkudHlwZTFfZW5kID0gMTQ5LAorCS5wb3J0X3NoZiA9IDQsCisJLnBvcnRfbWFzayA9IDB4ZiwKKwkucG9ydF9hbGlnbiA9IDQsCisJLmNoaXBfdHlwZSA9IE1US19DSElQX1RZUEVfQkFTRSwKKwkuZWludF9vZmZzZXRzID0geworCQkubmFtZSA9ICJtdDgxMzVfZWludCIsCisJCS5zdGF0ICAgICAgPSAweDAwMCwKKwkJLmFjayAgICAgICA9IDB4MDQwLAorCQkubWFzayAgICAgID0gMHgwODAsCisJCS5tYXNrX3NldCAgPSAweDBjMCwKKwkJLm1hc2tfY2xyICA9IDB4MTAwLAorCQkuc2VucyAgICAgID0gMHgxNDAsCisJCS5zZW5zX3NldCAgPSAweDE4MCwKKwkJLnNlbnNfY2xyICA9IDB4MWMwLAorCQkuc29mdCAgICAgID0gMHgyMDAsCisJCS5zb2Z0X3NldCAgPSAweDI0MCwKKwkJLnNvZnRfY2xyICA9IDB4MjgwLAorCQkucG9sICAgICAgID0gMHgzMDAsCisJCS5wb2xfc2V0ICAgPSAweDM0MCwKKwkJLnBvbF9jbHIgICA9IDB4MzgwLAorCQkuZG9tX2VuICAgID0gMHg0MDAsCisJCS5kYm5jX2N0cmwgPSAweDUwMCwKKwkJLmRibmNfc2V0ICA9IDB4NjAwLAorCQkuZGJuY19jbHIgID0gMHg3MDAsCisJCS5wb3J0X21hc2sgPSA3LAorCQkucG9ydHMgICAgID0gNiwKKwl9LAorCS5hcF9udW0gPSAxOTIsCisJLmRiX2NudCA9IDE2LAorfTsKKworc3RhdGljIGludCBtdDgxMzVfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiBtdGtfcGN0cmxfaW5pdChwZGV2LCAmbXQ4MTM1X3BpbmN0cmxfZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG10ODEzNV9wY3RybF9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ4MTM1LXBpbmN0cmwiLAorCX0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXQ4MTM1X3BjdHJsX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXRrX3BpbmN0cmxfZHJpdmVyID0geworCS5wcm9iZSA9IG10ODEzNV9waW5jdHJsX3Byb2JlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1lZGlhdGVrLW10ODEzNS1waW5jdHJsIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG10ODEzNV9wY3RybF9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXRrX3BpbmN0cmxfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm10a19waW5jdHJsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG10a19waW5jdHJsX2luaXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lZGlhVGVrIFBpbmN0cmwgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJIb25nemhvdSBZYW5nIDxob25nemhvdS55YW5nQG1lZGlhdGVrLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9waW5jdHJsLW10ODE3My5jIGIvZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL3BpbmN0cmwtbXQ4MTczLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyZWE4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9waW5jdHJsLW10ODE3My5jCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgTWVkaWFUZWsgSW5jLgorICogQXV0aG9yOiBIb25nemhvdS5ZYW5nIDxob25nemhvdS55YW5nQG1lZGlhdGVrLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvcGluY3RybC9tdDY1eHguaD4KKworI2luY2x1ZGUgInBpbmN0cmwtbXRrLWNvbW1vbi5oIgorI2luY2x1ZGUgInBpbmN0cmwtbXRrLW10ODE3My5oIgorCisjZGVmaW5lIERSVl9CQVNFCQkJCTB4YjAwCisKKy8qKgorICogc3RydWN0IG10a19waW5faWVzX3NtdF9zZXQgLSBGb3Igc3BlY2lhbCBwaW5zJyBpZXMgYW5kIHNtdCBzZXR0aW5nLgorICogQHN0YXJ0OiBUaGUgc3RhcnQgcGluIG51bWJlciBvZiB0aG9zZSBzcGVjaWFsIHBpbnMuCisgKiBAZW5kOiBUaGUgZW5kIHBpbiBudW1iZXIgb2YgdGhvc2Ugc3BlY2lhbCBwaW5zLgorICogQG9mZnNldDogVGhlIG9mZnNldCBvZiBzcGVjaWFsIHNldHRpbmcgcmVnaXN0ZXIuCisgKiBAYml0OiBUaGUgYml0IG9mIHNwZWNpYWwgc2V0dGluZyByZWdpc3Rlci4KKyAqLworc3RydWN0IG10a19waW5faWVzX3NtdF9zZXQgeworCXVuc2lnbmVkIGludCBzdGFydDsKKwl1bnNpZ25lZCBpbnQgZW5kOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgY2hhciBiaXQ7Cit9OworCisjZGVmaW5lIE1US19QSU5fSUVTX1NNVF9TRVQoX3N0YXJ0LCBfZW5kLCBfb2Zmc2V0LCBfYml0KQlcCisJewlcCisJCS5zdGFydCA9IF9zdGFydCwJXAorCQkuZW5kID0gX2VuZCwJXAorCQkuYml0ID0gX2JpdCwJXAorCQkub2Zmc2V0ID0gX29mZnNldCwJXAorCX0KKworLyoqCisgKiBzdHJ1Y3QgbXRrX3Bpbl9zcGVjX3B1cGRfc2V0IC0gRm9yIHNwZWNpYWwgcGlucycgcHVsbCB1cC9kb3duIHNldHRpbmcuCisgKiBAcGluOiBUaGUgcGluIG51bWJlci4KKyAqIEBvZmZzZXQ6IFRoZSBvZmZzZXQgb2Ygc3BlY2lhbCBwdWxsIHVwL2Rvd24gc2V0dGluZyByZWdpc3Rlci4KKyAqIEBwdXBkX2JpdDogVGhlIHB1bGwgdXAvZG93biBiaXQgaW4gdGhpcyByZWdpc3Rlci4KKyAqIEByMF9iaXQ6IFRoZSByMCBiaXQgb2YgcHVsbCByZXNpc3Rvci4KKyAqIEByMV9iaXQ6IFRoZSByMSBiaXQgb2YgcHVsbCByZXNpc3Rvci4KKyAqLworc3RydWN0IG10a19waW5fc3BlY19wdXBkX3NldCB7CisJdW5zaWduZWQgaW50IHBpbjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgcHVwZF9iaXQ7CisJdW5zaWduZWQgY2hhciByMV9iaXQ7CisJdW5zaWduZWQgY2hhciByMF9iaXQ7Cit9OworCisjZGVmaW5lIE1US19QSU5fUFVQRF9TUEVDKF9waW4sIF9vZmZzZXQsIF9wdXBkLCBfcjEsIF9yMCkJXAorCXsJXAorCQkucGluID0gX3BpbiwJXAorCQkub2Zmc2V0ID0gX29mZnNldCwJXAorCQkucHVwZF9iaXQgPSBfcHVwZCwJXAorCQkucjFfYml0ID0gX3IxLAkJXAorCQkucjBfYml0ID0gX3IwLAkJXAorCX0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfcGluX3NwZWNfcHVwZF9zZXQgbXQ4MTczX3NwZWNfcHVwZFtdID0geworCU1US19QSU5fUFVQRF9TUEVDKDExOSwgMHhlMDAsIDIsIDEsIDApLCAgLyogS1JPVzAgKi8KKwlNVEtfUElOX1BVUERfU1BFQygxMjAsIDB4ZTAwLCA2LCA1LCA0KSwgIC8qIEtST1cxICovCisJTVRLX1BJTl9QVVBEX1NQRUMoMTIxLCAweGUwMCwgMTAsIDksIDgpLCAvKiBLUk9XMiAqLworCU1US19QSU5fUFVQRF9TUEVDKDEyMiwgMHhlMTAsIDIsIDEsIDApLCAgLyogS0NPTDAgKi8KKwlNVEtfUElOX1BVUERfU1BFQygxMjMsIDB4ZTEwLCA2LCA1LCA0KSwgIC8qIEtDT0wxICovCisJTVRLX1BJTl9QVVBEX1NQRUMoMTI0LCAweGUxMCwgMTAsIDksIDgpLCAvKiBLQ09MMiAqLworCisJTVRLX1BJTl9QVVBEX1NQRUMoNjcsIDB4ZDEwLCAyLCAxLCAwKSwgICAvKiBtczAgRFMgKi8KKwlNVEtfUElOX1BVUERfU1BFQyg2OCwgMHhkMDAsIDIsIDEsIDApLCAgIC8qIG1zMCBSU1QgKi8KKwlNVEtfUElOX1BVUERfU1BFQyg2NiwgMHhjMTAsIDIsIDEsIDApLCAgIC8qIG1zMCBjbWQgKi8KKwlNVEtfUElOX1BVUERfU1BFQyg2NSwgMHhjMDAsIDIsIDEsIDApLCAgIC8qIG1zMCBjbGsgKi8KKwlNVEtfUElOX1BVUERfU1BFQyg1NywgMHhjMjAsIDIsIDEsIDApLCAgIC8qIG1zMCBkYXRhMCAqLworCU1US19QSU5fUFVQRF9TUEVDKDU4LCAweGMyMCwgMiwgMSwgMCksICAgLyogbXMwIGRhdGExICovCisJTVRLX1BJTl9QVVBEX1NQRUMoNTksIDB4YzIwLCAyLCAxLCAwKSwgICAvKiBtczAgZGF0YTIgKi8KKwlNVEtfUElOX1BVUERfU1BFQyg2MCwgMHhjMjAsIDIsIDEsIDApLCAgIC8qIG1zMCBkYXRhMyAqLworCU1US19QSU5fUFVQRF9TUEVDKDYxLCAweGMyMCwgMiwgMSwgMCksICAgLyogbXMwIGRhdGE0ICovCisJTVRLX1BJTl9QVVBEX1NQRUMoNjIsIDB4YzIwLCAyLCAxLCAwKSwgICAvKiBtczAgZGF0YTUgKi8KKwlNVEtfUElOX1BVUERfU1BFQyg2MywgMHhjMjAsIDIsIDEsIDApLCAgIC8qIG1zMCBkYXRhNiAqLworCU1US19QSU5fUFVQRF9TUEVDKDY0LCAweGMyMCwgMiwgMSwgMCksICAgLyogbXMwIGRhdGE3ICovCisKKwlNVEtfUElOX1BVUERfU1BFQyg3OCwgMHhjNTAsIDIsIDEsIDApLCAgICAvKiBtczEgY21kICovCisJTVRLX1BJTl9QVVBEX1NQRUMoNzMsIDB4ZDIwLCAyLCAxLCAwKSwgICAgLyogbXMxIGRhdDAgKi8KKwlNVEtfUElOX1BVUERfU1BFQyg3NCwgMHhkMjAsIDYsIDUsIDQpLCAgICAvKiBtczEgZGF0MSAqLworCU1US19QSU5fUFVQRF9TUEVDKDc1LCAweGQyMCwgMTAsIDksIDgpLCAgIC8qIG1zMSBkYXQyICovCisJTVRLX1BJTl9QVVBEX1NQRUMoNzYsIDB4ZDIwLCAxNCwgMTMsIDEyKSwgLyogbXMxIGRhdDMgKi8KKwlNVEtfUElOX1BVUERfU1BFQyg3NywgMHhjNDAsIDIsIDEsIDApLCAgICAvKiBtczEgY2xrICovCisKKwlNVEtfUElOX1BVUERfU1BFQygxMDAsIDB4ZDQwLCAyLCAxLCAwKSwgICAgLyogbXMyIGRhdDAgKi8KKwlNVEtfUElOX1BVUERfU1BFQygxMDEsIDB4ZDQwLCA2LCA1LCA0KSwgICAgLyogbXMyIGRhdDEgKi8KKwlNVEtfUElOX1BVUERfU1BFQygxMDIsIDB4ZDQwLCAxMCwgOSwgOCksICAgLyogbXMyIGRhdDIgKi8KKwlNVEtfUElOX1BVUERfU1BFQygxMDMsIDB4ZDQwLCAxNCwgMTMsIDEyKSwgLyogbXMyIGRhdDMgKi8KKwlNVEtfUElOX1BVUERfU1BFQygxMDQsIDB4YzgwLCAyLCAxLCAwKSwgICAgLyogbXMyIGNsayAqLworCU1US19QSU5fUFVQRF9TUEVDKDEwNSwgMHhjOTAsIDIsIDEsIDApLCAgICAvKiBtczIgY21kICovCisKKwlNVEtfUElOX1BVUERfU1BFQygyMiwgMHhkNjAsIDIsIDEsIDApLCAgICAvKiBtczMgZGF0MCAqLworCU1US19QSU5fUFVQRF9TUEVDKDIzLCAweGQ2MCwgNiwgNSwgNCksICAgIC8qIG1zMyBkYXQxICovCisJTVRLX1BJTl9QVVBEX1NQRUMoMjQsIDB4ZDYwLCAxMCwgOSwgOCksICAgLyogbXMzIGRhdDIgKi8KKwlNVEtfUElOX1BVUERfU1BFQygyNSwgMHhkNjAsIDE0LCAxMywgMTIpLCAvKiBtczMgZGF0MyAqLworCU1US19QSU5fUFVQRF9TUEVDKDI2LCAweGNjMCwgMiwgMSwgMCksICAgIC8qIG1zMyBjbGsgKi8KKwlNVEtfUElOX1BVUERfU1BFQygyNywgMHhjZDAsIDIsIDEsIDApICAgICAvKiBtczMgY21kICovCit9OworCitzdGF0aWMgaW50IHNwZWNfcHVsbF9zZXQoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCB1bnNpZ25lZCBpbnQgcGluLAorCQl1bnNpZ25lZCBjaGFyIGFsaWduLCBib29sIGlzdXAsIHVuc2lnbmVkIGludCByMXIwKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCByZWdfcHVwZCwgcmVnX3NldCwgcmVnX3JzdDsKKwl1bnNpZ25lZCBpbnQgYml0X3B1cGQsIGJpdF9yMCwgYml0X3IxOworCWNvbnN0IHN0cnVjdCBtdGtfcGluX3NwZWNfcHVwZF9zZXQgKnNwZWNfcHVwZF9waW47CisJYm9vbCBmaW5kID0gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtdDgxNzNfc3BlY19wdXBkKTsgaSsrKSB7CisJCWlmIChwaW4gPT0gbXQ4MTczX3NwZWNfcHVwZFtpXS5waW4pIHsKKwkJCWZpbmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZpbmQpCisJCXJldHVybiAtRUlOVkFMOworCisJc3BlY19wdXBkX3BpbiA9IG10ODE3M19zcGVjX3B1cGQgKyBpOworCXJlZ19zZXQgPSBzcGVjX3B1cGRfcGluLT5vZmZzZXQgKyBhbGlnbjsKKwlyZWdfcnN0ID0gc3BlY19wdXBkX3Bpbi0+b2Zmc2V0ICsgKGFsaWduIDw8IDEpOworCisJaWYgKGlzdXApCisJCXJlZ19wdXBkID0gcmVnX3JzdDsKKwllbHNlCisJCXJlZ19wdXBkID0gcmVnX3NldDsKKworCWJpdF9wdXBkID0gQklUKHNwZWNfcHVwZF9waW4tPnB1cGRfYml0KTsKKwlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfcHVwZCwgYml0X3B1cGQpOworCisJYml0X3IwID0gQklUKHNwZWNfcHVwZF9waW4tPnIwX2JpdCk7CisJYml0X3IxID0gQklUKHNwZWNfcHVwZF9waW4tPnIxX2JpdCk7CisKKwlzd2l0Y2ggKHIxcjApIHsKKwljYXNlIE1US19QVVBEX1NFVF9SMVIwXzAwOgorCQlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfcnN0LCBiaXRfcjApOworCQlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfcnN0LCBiaXRfcjEpOworCQlicmVhazsKKwljYXNlIE1US19QVVBEX1NFVF9SMVIwXzAxOgorCQlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfc2V0LCBiaXRfcjApOworCQlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfcnN0LCBiaXRfcjEpOworCQlicmVhazsKKwljYXNlIE1US19QVVBEX1NFVF9SMVIwXzEwOgorCQlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfcnN0LCBiaXRfcjApOworCQlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfc2V0LCBiaXRfcjEpOworCQlicmVhazsKKwljYXNlIE1US19QVVBEX1NFVF9SMVIwXzExOgorCQlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfc2V0LCBiaXRfcjApOworCQlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfc2V0LCBiaXRfcjEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfcGluX2llc19zbXRfc2V0IG10ODE3M19pZXNfc210X3NldFtdID0geworCU1US19QSU5fSUVTX1NNVF9TRVQoMCwgNCwgMHg5MzAsIDEpLAorCU1US19QSU5fSUVTX1NNVF9TRVQoNSwgOSwgMHg5MzAsIDIpLAorCU1US19QSU5fSUVTX1NNVF9TRVQoMTAsIDEzLCAweDkzMCwgMTApLAorCU1US19QSU5fSUVTX1NNVF9TRVQoMTQsIDE1LCAweDk0MCwgMTApLAorCU1US19QSU5fSUVTX1NNVF9TRVQoMTYsIDE2LCAweDkzMCwgMCksCisJTVRLX1BJTl9JRVNfU01UX1NFVCgxNywgMTcsIDB4OTUwLCAyKSwKKwlNVEtfUElOX0lFU19TTVRfU0VUKDE4LCAyMSwgMHg5NDAsIDMpLAorCU1US19QSU5fSUVTX1NNVF9TRVQoMjksIDMyLCAweDkzMCwgMyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCgzMywgMzMsIDB4OTMwLCA0KSwKKwlNVEtfUElOX0lFU19TTVRfU0VUKDM0LCAzNiwgMHg5MzAsIDUpLAorCU1US19QSU5fSUVTX1NNVF9TRVQoMzcsIDM4LCAweDkzMCwgNiksCisJTVRLX1BJTl9JRVNfU01UX1NFVCgzOSwgMzksIDB4OTMwLCA3KSwKKwlNVEtfUElOX0lFU19TTVRfU0VUKDQwLCA0MSwgMHg5MzAsIDkpLAorCU1US19QSU5fSUVTX1NNVF9TRVQoNDIsIDQyLCAweDk0MCwgMCksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg0MywgNDQsIDB4OTMwLCAxMSksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg0NSwgNDYsIDB4OTMwLCAxMiksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg1NywgNjQsIDB4YzIwLCAxMyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg2NSwgNjUsIDB4YzEwLCAxMyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg2NiwgNjYsIDB4YzAwLCAxMyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg2NywgNjcsIDB4ZDEwLCAxMyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg2OCwgNjgsIDB4ZDAwLCAxMyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg2OSwgNzIsIDB4OTQwLCAxNCksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg3MywgNzYsIDB4YzYwLCAxMyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg3NywgNzcsIDB4YzQwLCAxMyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg3OCwgNzgsIDB4YzUwLCAxMyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg3OSwgODIsIDB4OTQwLCAxNSksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg4MywgODMsIDB4OTUwLCAwKSwKKwlNVEtfUElOX0lFU19TTVRfU0VUKDg0LCA4NSwgMHg5NTAsIDEpLAorCU1US19QSU5fSUVTX1NNVF9TRVQoODYsIDkxLCAweDk1MCwgMiksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg5MiwgOTIsIDB4OTMwLCAxMyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg5MywgOTUsIDB4OTMwLCAxNCksCisJTVRLX1BJTl9JRVNfU01UX1NFVCg5NiwgOTksIDB4OTMwLCAxNSksCisJTVRLX1BJTl9JRVNfU01UX1NFVCgxMDAsIDEwMywgMHhjYTAsIDEzKSwKKwlNVEtfUElOX0lFU19TTVRfU0VUKDEwNCwgMTA0LCAweGM4MCwgMTMpLAorCU1US19QSU5fSUVTX1NNVF9TRVQoMTA1LCAxMDUsIDB4YzkwLCAxMyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCgxMDYsIDEwNywgMHg5NDAsIDQpLAorCU1US19QSU5fSUVTX1NNVF9TRVQoMTA4LCAxMTIsIDB4OTQwLCAxKSwKKwlNVEtfUElOX0lFU19TTVRfU0VUKDExMywgMTE2LCAweDk0MCwgMiksCisJTVRLX1BJTl9JRVNfU01UX1NFVCgxMTcsIDExOCwgMHg5NDAsIDUpLAorCU1US19QSU5fSUVTX1NNVF9TRVQoMTE5LCAxMjQsIDB4OTQwLCA2KSwKKwlNVEtfUElOX0lFU19TTVRfU0VUKDEyNSwgMTI2LCAweDk0MCwgNyksCisJTVRLX1BJTl9JRVNfU01UX1NFVCgxMjcsIDEyNywgMHg5NDAsIDApLAorCU1US19QSU5fSUVTX1NNVF9TRVQoMTI4LCAxMjgsIDB4OTUwLCA4KSwKKwlNVEtfUElOX0lFU19TTVRfU0VUKDEyOSwgMTMwLCAweDk1MCwgOSksCisJTVRLX1BJTl9JRVNfU01UX1NFVCgxMzEsIDEzMiwgMHg5NTAsIDgpLAorCU1US19QSU5fSUVTX1NNVF9TRVQoMTMzLCAxMzQsIDB4OTEwLCA4KQorfTsKKworc3RhdGljIGludCBzcGVjX2llc19zbXRfc2V0KHN0cnVjdCByZWdtYXAgKnJlZ21hcCwgdW5zaWduZWQgaW50IHBpbiwKKwkJdW5zaWduZWQgY2hhciBhbGlnbiwgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCBpLCByZWdfYWRkciwgYml0OworCWJvb2wgZmluZCA9IGZhbHNlOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXQ4MTczX2llc19zbXRfc2V0KTsgaSsrKSB7CisJCWlmIChwaW4gPj0gbXQ4MTczX2llc19zbXRfc2V0W2ldLnN0YXJ0ICYmCisJCQkJcGluIDw9IG10ODE3M19pZXNfc210X3NldFtpXS5lbmQpIHsKKwkJCWZpbmQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoIWZpbmQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZhbHVlKQorCQlyZWdfYWRkciA9IG10ODE3M19pZXNfc210X3NldFtpXS5vZmZzZXQgKyBhbGlnbjsKKwllbHNlCisJCXJlZ19hZGRyID0gbXQ4MTczX2llc19zbXRfc2V0W2ldLm9mZnNldCArIChhbGlnbiA8PCAxKTsKKworCWJpdCA9IEJJVChtdDgxNzNfaWVzX3NtdF9zZXRbaV0uYml0KTsKKwlyZWdtYXBfd3JpdGUocmVnbWFwLCByZWdfYWRkciwgYml0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZHJ2X2dyb3VwX2Rlc2MgbXQ4MTczX2Rydl9ncnBbXSA9ICB7CisJLyogMEU0RThTUiA0LzgvMTIvMTYgKi8KKwlNVEtfRFJWX0dSUCg0LCAxNiwgMSwgMiwgNCksCisJLyogMEUyRTRTUiAgMi80LzYvOCAqLworCU1US19EUlZfR1JQKDIsIDgsIDEsIDIsIDIpLAorCS8qIEU4RTRFMiAgMi80LzYvOC8xMC8xMi8xNC8xNiAqLworCU1US19EUlZfR1JQKDIsIDE2LCAwLCAyLCAyKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfcGluX2Rydl9ncnAgbXQ4MTczX3Bpbl9kcnZbXSA9IHsKKwlNVEtfUElOX0RSVl9HUlAoMCwgRFJWX0JBU0UrMHgyMCwgMTIsIDApLAorCU1US19QSU5fRFJWX0dSUCgxLCBEUlZfQkFTRSsweDIwLCAxMiwgMCksCisJTVRLX1BJTl9EUlZfR1JQKDIsIERSVl9CQVNFKzB4MjAsIDEyLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoMywgRFJWX0JBU0UrMHgyMCwgMTIsIDApLAorCU1US19QSU5fRFJWX0dSUCg0LCBEUlZfQkFTRSsweDIwLCAxMiwgMCksCisJTVRLX1BJTl9EUlZfR1JQKDUsIERSVl9CQVNFKzB4MzAsIDAsIDApLAorCU1US19QSU5fRFJWX0dSUCg2LCBEUlZfQkFTRSsweDMwLCAwLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoNywgRFJWX0JBU0UrMHgzMCwgMCwgMCksCisJTVRLX1BJTl9EUlZfR1JQKDgsIERSVl9CQVNFKzB4MzAsIDAsIDApLAorCU1US19QSU5fRFJWX0dSUCg5LCBEUlZfQkFTRSsweDMwLCAwLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoMTAsIERSVl9CQVNFKzB4MzAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMSwgRFJWX0JBU0UrMHgzMCwgNCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDEyLCBEUlZfQkFTRSsweDMwLCA0LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMTMsIERSVl9CQVNFKzB4MzAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxNCwgRFJWX0JBU0UrMHg0MCwgOCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDE1LCBEUlZfQkFTRSsweDQwLCA4LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMTYsIERSVl9CQVNFLCA4LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMTcsIDB4Y2UwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMjIsIDB4Y2UwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMjMsIDB4Y2UwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMjQsIDB4Y2UwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMjUsIDB4Y2UwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMjYsIDB4Y2MwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMjcsIDB4Y2QwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMjgsIDB4ZDcwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMjksIERSVl9CQVNFKzB4ODAsIDEyLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMzAsIERSVl9CQVNFKzB4ODAsIDEyLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMzEsIERSVl9CQVNFKzB4ODAsIDEyLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMzIsIERSVl9CQVNFKzB4ODAsIDEyLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMzMsIERSVl9CQVNFKzB4MTAsIDEyLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMzQsIERSVl9CQVNFKzB4MTAsIDgsIDEpLAorCU1US19QSU5fRFJWX0dSUCgzNSwgRFJWX0JBU0UrMHgxMCwgOCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDM2LCBEUlZfQkFTRSsweDEwLCA4LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMzcsIERSVl9CQVNFKzB4MTAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgzOCwgRFJWX0JBU0UrMHgxMCwgNCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDM5LCBEUlZfQkFTRSsweDIwLCAwLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoNDAsIERSVl9CQVNFKzB4MjAsIDgsIDApLAorCU1US19QSU5fRFJWX0dSUCg0MSwgRFJWX0JBU0UrMHgyMCwgOCwgMCksCisJTVRLX1BJTl9EUlZfR1JQKDQyLCBEUlZfQkFTRSsweDUwLCA4LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNTcsIDB4YzIwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNTgsIDB4YzIwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNTksIDB4YzIwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNjAsIDB4YzIwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNjEsIDB4YzIwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNjIsIDB4YzIwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNjMsIDB4YzIwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNjQsIDB4YzIwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNjUsIDB4YzAwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNjYsIDB4YzEwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNjcsIDB4ZDEwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNjgsIDB4ZDAwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoNjksIERSVl9CQVNFKzB4ODAsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCg3MCwgRFJWX0JBU0UrMHg4MCwgMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDcxLCBEUlZfQkFTRSsweDgwLCAwLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoNzIsIERSVl9CQVNFKzB4ODAsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCg3MywgMHhjNjAsIDgsIDIpLAorCU1US19QSU5fRFJWX0dSUCg3NCwgMHhjNjAsIDgsIDIpLAorCU1US19QSU5fRFJWX0dSUCg3NSwgMHhjNjAsIDgsIDIpLAorCU1US19QSU5fRFJWX0dSUCg3NiwgMHhjNjAsIDgsIDIpLAorCU1US19QSU5fRFJWX0dSUCg3NywgMHhjNDAsIDgsIDIpLAorCU1US19QSU5fRFJWX0dSUCg3OCwgMHhjNTAsIDgsIDIpLAorCU1US19QSU5fRFJWX0dSUCg3OSwgRFJWX0JBU0UrMHg3MCwgMTIsIDEpLAorCU1US19QSU5fRFJWX0dSUCg4MCwgRFJWX0JBU0UrMHg3MCwgMTIsIDEpLAorCU1US19QSU5fRFJWX0dSUCg4MSwgRFJWX0JBU0UrMHg3MCwgMTIsIDEpLAorCU1US19QSU5fRFJWX0dSUCg4MiwgRFJWX0JBU0UrMHg3MCwgMTIsIDEpLAorCU1US19QSU5fRFJWX0dSUCg4MywgRFJWX0JBU0UsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCg4NCwgRFJWX0JBU0UsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCg4NSwgRFJWX0JBU0UsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCg4NSwgRFJWX0JBU0UrMHg2MCwgOCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDg2LCBEUlZfQkFTRSsweDYwLCA4LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoODcsIERSVl9CQVNFKzB4NjAsIDgsIDEpLAorCU1US19QSU5fRFJWX0dSUCg4OCwgRFJWX0JBU0UrMHg2MCwgOCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDg5LCBEUlZfQkFTRSsweDYwLCA4LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoOTAsIERSVl9CQVNFKzB4NjAsIDgsIDEpLAorCU1US19QSU5fRFJWX0dSUCg5MSwgRFJWX0JBU0UrMHg2MCwgOCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDkyLCBEUlZfQkFTRSsweDYwLCA0LCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoOTMsIERSVl9CQVNFKzB4NjAsIDAsIDApLAorCU1US19QSU5fRFJWX0dSUCg5NCwgRFJWX0JBU0UrMHg2MCwgMCwgMCksCisJTVRLX1BJTl9EUlZfR1JQKDk1LCBEUlZfQkFTRSsweDYwLCAwLCAwKSwKKwlNVEtfUElOX0RSVl9HUlAoOTYsIERSVl9CQVNFKzB4ODAsIDgsIDEpLAorCU1US19QSU5fRFJWX0dSUCg5NywgRFJWX0JBU0UrMHg4MCwgOCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDk4LCBEUlZfQkFTRSsweDgwLCA4LCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoOTksIERSVl9CQVNFKzB4ODAsIDgsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMDAsIDB4Y2EwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMTAxLCAweGNhMCwgOCwgMiksCisJTVRLX1BJTl9EUlZfR1JQKDEwMiwgMHhjYTAsIDgsIDIpLAorCU1US19QSU5fRFJWX0dSUCgxMDMsIDB4Y2EwLCA4LCAyKSwKKwlNVEtfUElOX0RSVl9HUlAoMTA0LCAweGM4MCwgOCwgMiksCisJTVRLX1BJTl9EUlZfR1JQKDEwNSwgMHhjOTAsIDgsIDIpLAorCU1US19QSU5fRFJWX0dSUCgxMDgsIERSVl9CQVNFKzB4NTAsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMDksIERSVl9CQVNFKzB4NTAsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMTAsIERSVl9CQVNFKzB4NTAsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMTEsIERSVl9CQVNFKzB4NTAsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMTIsIERSVl9CQVNFKzB4NTAsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMTMsIERSVl9CQVNFKzB4ODAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMTQsIERSVl9CQVNFKzB4ODAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMTUsIERSVl9CQVNFKzB4ODAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMTYsIERSVl9CQVNFKzB4ODAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMTcsIERSVl9CQVNFKzB4OTAsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMTgsIERSVl9CQVNFKzB4OTAsIDAsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMTksIERSVl9CQVNFKzB4NTAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMjAsIERSVl9CQVNFKzB4NTAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMjEsIERSVl9CQVNFKzB4NTAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMjIsIERSVl9CQVNFKzB4NTAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMjMsIERSVl9CQVNFKzB4NTAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMjQsIERSVl9CQVNFKzB4NTAsIDQsIDEpLAorCU1US19QSU5fRFJWX0dSUCgxMjUsIERSVl9CQVNFKzB4MzAsIDEyLCAxKSwKKwlNVEtfUElOX0RSVl9HUlAoMTI2LCBEUlZfQkFTRSsweDMwLCAxMiwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDEyNywgRFJWX0JBU0UrMHg1MCwgOCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDEyOCwgRFJWX0JBU0UrMHg0MCwgMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDEyOSwgRFJWX0JBU0UrMHg0MCwgMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDEzMCwgRFJWX0JBU0UrMHg0MCwgMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDEzMSwgRFJWX0JBU0UrMHg0MCwgMCwgMSksCisJTVRLX1BJTl9EUlZfR1JQKDEzMiwgRFJWX0JBU0UrMHg0MCwgMCwgMSkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX3BpbmN0cmxfZGV2ZGF0YSBtdDgxNzNfcGluY3RybF9kYXRhID0geworCS5waW5zID0gbXRrX3BpbnNfbXQ4MTczLAorCS5ucGlucyA9IEFSUkFZX1NJWkUobXRrX3BpbnNfbXQ4MTczKSwKKwkuZ3JwX2Rlc2MgPSBtdDgxNzNfZHJ2X2dycCwKKwkubl9ncnBfY2xzID0gQVJSQVlfU0laRShtdDgxNzNfZHJ2X2dycCksCisJLnBpbl9kcnZfZ3JwID0gbXQ4MTczX3Bpbl9kcnYsCisJLm5fcGluX2Rydl9ncnBzID0gQVJSQVlfU0laRShtdDgxNzNfcGluX2RydiksCisJLnNwZWNfcHVsbF9zZXQgPSBzcGVjX3B1bGxfc2V0LAorCS5zcGVjX2llc19zbXRfc2V0ID0gc3BlY19pZXNfc210X3NldCwKKwkuZGlyX29mZnNldCA9IDB4MDAwMCwKKwkucHVsbGVuX29mZnNldCA9IDB4MDEwMCwKKwkucHVsbHNlbF9vZmZzZXQgPSAweDAyMDAsCisJLmRvdXRfb2Zmc2V0ID0gMHgwNDAwLAorCS5kaW5fb2Zmc2V0ID0gMHgwNTAwLAorCS5waW5tdXhfb2Zmc2V0ID0gMHgwNjAwLAorCS50eXBlMV9zdGFydCA9IDEzNSwKKwkudHlwZTFfZW5kID0gMTM1LAorCS5wb3J0X3NoZiA9IDQsCisJLnBvcnRfbWFzayA9IDB4ZiwKKwkucG9ydF9hbGlnbiA9IDQsCisJLmVpbnRfb2Zmc2V0cyA9IHsKKwkJLm5hbWUgPSAibXQ4MTczX2VpbnQiLAorCQkuc3RhdCAgICAgID0gMHgwMDAsCisJCS5hY2sgICAgICAgPSAweDA0MCwKKwkJLm1hc2sgICAgICA9IDB4MDgwLAorCQkubWFza19zZXQgID0gMHgwYzAsCisJCS5tYXNrX2NsciAgPSAweDEwMCwKKwkJLnNlbnMgICAgICA9IDB4MTQwLAorCQkuc2Vuc19zZXQgID0gMHgxODAsCisJCS5zZW5zX2NsciAgPSAweDFjMCwKKwkJLnNvZnQgICAgICA9IDB4MjAwLAorCQkuc29mdF9zZXQgID0gMHgyNDAsCisJCS5zb2Z0X2NsciAgPSAweDI4MCwKKwkJLnBvbCAgICAgICA9IDB4MzAwLAorCQkucG9sX3NldCAgID0gMHgzNDAsCisJCS5wb2xfY2xyICAgPSAweDM4MCwKKwkJLmRvbV9lbiAgICA9IDB4NDAwLAorCQkuZGJuY19jdHJsID0gMHg1MDAsCisJCS5kYm5jX3NldCAgPSAweDYwMCwKKwkJLmRibmNfY2xyICA9IDB4NzAwLAorCQkucG9ydF9tYXNrID0gNywKKwkJLnBvcnRzICAgICA9IDYsCisJfSwKKwkuYXBfbnVtID0gMjI0LAorCS5kYl9jbnQgPSAxNiwKK307CisKK3N0YXRpYyBpbnQgbXQ4MTczX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gbXRrX3BjdHJsX2luaXQocGRldiwgJm10ODE3M19waW5jdHJsX2RhdGEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdDgxNzNfcGN0cmxfbWF0Y2hbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10ODE3My1waW5jdHJsIiwKKwl9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG10ODE3M19wY3RybF9tYXRjaCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG10a19waW5jdHJsX2RyaXZlciA9IHsKKwkucHJvYmUgPSBtdDgxNzNfcGluY3RybF9wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtZWRpYXRlay1tdDgxNzMtcGluY3RybCIsCisJCS5vZl9tYXRjaF90YWJsZSA9IG10ODE3M19wY3RybF9tYXRjaCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXRrX3BpbmN0cmxfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm10a19waW5jdHJsX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG10a19waW5jdHJsX2luaXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lZGlhVGVrIFBpbmN0cmwgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJIb25nemhvdSBZYW5nIDxob25nemhvdS55YW5nQG1lZGlhdGVrLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9waW5jdHJsLW10ay1jb21tb24uYyBiL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9waW5jdHJsLW10ay1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTMyOTRjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL3BpbmN0cmwtbXRrLWNvbW1vbi5jCkBAIC0wLDAgKzEsMTI1NyBAQAorLyoKKyAqIG10NjV4eCBwaW5jdHJsIGRyaXZlciBiYXNlZCBvbiBBbGx3aW5uZXIgQTFYIHBpbmN0cmwgZHJpdmVyLgorICogQ29weXJpZ2h0IChjKSAyMDE0IE1lZGlhVGVrIEluYy4KKyAqIEF1dGhvcjogSG9uZ3pob3UuWWFuZyA8aG9uZ3pob3UueWFuZ0BtZWRpYXRlay5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9tYWNoaW5lLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jb25mLWdlbmVyaWMuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvc3lzY29uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxkdC1iaW5kaW5ncy9waW5jdHJsL210NjV4eC5oPgorCisjaW5jbHVkZSAiLi4vY29yZS5oIgorI2luY2x1ZGUgIi4uL3BpbmNvbmYuaCIKKyNpbmNsdWRlICIuLi9waW5jdHJsLXV0aWxzLmgiCisjaW5jbHVkZSAicGluY3RybC1tdGstY29tbW9uLmgiCisKKyNkZWZpbmUgTUFYX0dQSU9fTU9ERV9QRVJfUkVHIDUKKyNkZWZpbmUgR1BJT19NT0RFX0JJVFMgICAgICAgIDMKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtdGtfZ3Bpb19mdW5jdGlvbnNbXSA9IHsKKwkiZnVuYzAiLCAiZnVuYzEiLCAiZnVuYzIiLCAiZnVuYzMiLAorCSJmdW5jNCIsICJmdW5jNSIsICJmdW5jNiIsICJmdW5jNyIsCit9OworCisvKgorICogVGhlcmUgYXJlIHR3byBiYXNlIGFkZHJlc3MgZm9yIHB1bGwgcmVsYXRlZCBjb25maWd1cmF0aW9uCisgKiBpbiBtdDgxMzUsIGFuZCBkaWZmZXJlbnQgR1BJTyBwaW5zIHVzZSBkaWZmZXJlbnQgYmFzZSBhZGRyZXNzLgorICogV2hlbiBwaW4gbnVtYmVyIGdyZWF0ZXIgdGhhbiB0eXBlMV9zdGFydCBhbmQgbGVzcyB0aGFuIHR5cGUxX2VuZCwKKyAqIHNob3VsZCB1c2UgdGhlIHNlY29uZCBiYXNlIGFkZHJlc3MuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmVnbWFwICptdGtfZ2V0X3JlZ21hcChzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwsCisJCXVuc2lnbmVkIGxvbmcgcGluKQoreworCWlmIChwaW4gPj0gcGN0bC0+ZGV2ZGF0YS0+dHlwZTFfc3RhcnQgJiYgcGluIDwgcGN0bC0+ZGV2ZGF0YS0+dHlwZTFfZW5kKQorCQlyZXR1cm4gcGN0bC0+cmVnbWFwMjsKKwlyZXR1cm4gcGN0bC0+cmVnbWFwMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBtdGtfZ2V0X3BvcnQoc3RydWN0IG10a19waW5jdHJsICpwY3RsLCB1bnNpZ25lZCBsb25nIHBpbikKK3sKKwkvKiBEaWZmZXJlbnQgU29DIGhhcyBkaWZmZXJlbnQgbWFzayBhbmQgcG9ydCBzaGlmdC4gKi8KKwlyZXR1cm4gKChwaW4gPj4gNCkgJiBwY3RsLT5kZXZkYXRhLT5wb3J0X21hc2spCisJCQk8PCBwY3RsLT5kZXZkYXRhLT5wb3J0X3NoZjsKK30KKworc3RhdGljIGludCBtdGtfcG14X2dwaW9fc2V0X2RpcmVjdGlvbihzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQlzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlICpyYW5nZSwgdW5zaWduZWQgb2Zmc2V0LAorCQkJYm9vbCBpbnB1dCkKK3sKKwl1bnNpZ25lZCBpbnQgcmVnX2FkZHI7CisJdW5zaWduZWQgaW50IGJpdDsKKwlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCXJlZ19hZGRyID0gbXRrX2dldF9wb3J0KHBjdGwsIG9mZnNldCkgKyBwY3RsLT5kZXZkYXRhLT5kaXJfb2Zmc2V0OworCWJpdCA9IEJJVChvZmZzZXQgJiAweGYpOworCisJaWYgKGlucHV0KQorCQkvKiBEaWZmZXJlbnQgU29DIGhhcyBkaWZmZXJlbnQgYWxpZ25tZW50IG9mZnNldC4gKi8KKwkJcmVnX2FkZHIgPSBDTFJfQUREUihyZWdfYWRkciwgcGN0bCk7CisJZWxzZQorCQlyZWdfYWRkciA9IFNFVF9BRERSKHJlZ19hZGRyLCBwY3RsKTsKKworCXJlZ21hcF93cml0ZShtdGtfZ2V0X3JlZ21hcChwY3RsLCBvZmZzZXQpLCByZWdfYWRkciwgYml0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXRrX2dwaW9fc2V0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGludCByZWdfYWRkcjsKKwl1bnNpZ25lZCBpbnQgYml0OworCXN0cnVjdCBtdGtfcGluY3RybCAqcGN0bCA9IGRldl9nZXRfZHJ2ZGF0YShjaGlwLT5kZXYpOworCisJcmVnX2FkZHIgPSBtdGtfZ2V0X3BvcnQocGN0bCwgb2Zmc2V0KSArIHBjdGwtPmRldmRhdGEtPmRvdXRfb2Zmc2V0OworCWJpdCA9IEJJVChvZmZzZXQgJiAweGYpOworCisJaWYgKHZhbHVlKQorCQlyZWdfYWRkciA9IFNFVF9BRERSKHJlZ19hZGRyLCBwY3RsKTsKKwllbHNlCisJCXJlZ19hZGRyID0gQ0xSX0FERFIocmVnX2FkZHIsIHBjdGwpOworCisJcmVnbWFwX3dyaXRlKG10a19nZXRfcmVnbWFwKHBjdGwsIG9mZnNldCksIHJlZ19hZGRyLCBiaXQpOworfQorCitzdGF0aWMgdm9pZCBtdGtfcGNvbmZfc2V0X2llc19zbXQoc3RydWN0IG10a19waW5jdHJsICpwY3RsLCB1bnNpZ25lZCBwaW4sCisJCWludCB2YWx1ZSwgZW51bSBwaW5fY29uZmlnX3BhcmFtIHBhcmFtKQoreworCXVuc2lnbmVkIGludCByZWdfYWRkciwgb2Zmc2V0OworCXVuc2lnbmVkIGludCBiaXQ7CisJaW50IHJldDsKKworCS8qCisJICogRHVlIHRvIHNvbWUgcGlucyBhcmUgaXJyZWd1bGFyLCB0aGVpciBpbnB1dCBlbmFibGUgYW5kIHNtdAorCSAqIGNvbnRyb2wgcmVnaXN0ZXIgYXJlIGRpc2NvbnRpbnVvdXMsIGJ1dCB0aGV5IGFyZSBtYXBwaW5nIHRvZ2V0aGVyLgorCSAqIFNvIHdlIG5lZWQgdGhpcyBzcGVjaWFsIGhhbmRsZS4KKwkgKi8KKwlpZiAocGN0bC0+ZGV2ZGF0YS0+c3BlY19pZXNfc210X3NldCkgeworCQlyZXQgPSBwY3RsLT5kZXZkYXRhLT5zcGVjX2llc19zbXRfc2V0KG10a19nZXRfcmVnbWFwKHBjdGwsIHBpbiksCisJCQlwaW4sIHBjdGwtPmRldmRhdGEtPnBvcnRfYWxpZ24sIHZhbHVlKTsKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm47CisJfQorCisJYml0ID0gQklUKHBpbiAmIDB4Zik7CisKKwlpZiAocGFyYW0gPT0gUElOX0NPTkZJR19JTlBVVF9FTkFCTEUpCisJCW9mZnNldCA9IHBjdGwtPmRldmRhdGEtPmllc19vZmZzZXQ7CisJZWxzZQorCQlvZmZzZXQgPSBwY3RsLT5kZXZkYXRhLT5zbXRfb2Zmc2V0OworCisJaWYgKHZhbHVlKQorCQlyZWdfYWRkciA9IFNFVF9BRERSKG10a19nZXRfcG9ydChwY3RsLCBwaW4pICsgb2Zmc2V0LCBwY3RsKTsKKwllbHNlCisJCXJlZ19hZGRyID0gQ0xSX0FERFIobXRrX2dldF9wb3J0KHBjdGwsIHBpbikgKyBvZmZzZXQsIHBjdGwpOworCisJcmVnbWFwX3dyaXRlKG10a19nZXRfcmVnbWFwKHBjdGwsIHBpbiksIHJlZ19hZGRyLCBiaXQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG10a19waW5fZHJ2X2dycCAqbXRrX2ZpbmRfcGluX2Rydl9ncnBfYnlfcGluKAorCQlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwsICB1bnNpZ25lZCBsb25nIHBpbikgeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBjdGwtPmRldmRhdGEtPm5fcGluX2Rydl9ncnBzOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IG10a19waW5fZHJ2X2dycCAqcGluX2RydiA9CisJCQkJcGN0bC0+ZGV2ZGF0YS0+cGluX2Rydl9ncnAgKyBpOworCQlpZiAocGluID09IHBpbl9kcnYtPnBpbikKKwkJCXJldHVybiBwaW5fZHJ2OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG10a19wY29uZl9zZXRfZHJpdmluZyhzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwsCisJCXVuc2lnbmVkIGludCBwaW4sIHVuc2lnbmVkIGNoYXIgZHJpdmluZykKK3sKKwljb25zdCBzdHJ1Y3QgbXRrX3Bpbl9kcnZfZ3JwICpwaW5fZHJ2OworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgaW50IGJpdHMsIG1hc2ssIHNoaWZ0OworCWNvbnN0IHN0cnVjdCBtdGtfZHJ2X2dyb3VwX2Rlc2MgKmRydl9ncnA7CisKKwlpZiAocGluID49IHBjdGwtPmRldmRhdGEtPm5waW5zKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXBpbl9kcnYgPSBtdGtfZmluZF9waW5fZHJ2X2dycF9ieV9waW4ocGN0bCwgcGluKTsKKwlpZiAoIXBpbl9kcnYgfHwgcGluX2Rydi0+Z3JwID4gcGN0bC0+ZGV2ZGF0YS0+bl9ncnBfY2xzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRydl9ncnAgPSBwY3RsLT5kZXZkYXRhLT5ncnBfZGVzYyArIHBpbl9kcnYtPmdycDsKKwlpZiAoZHJpdmluZyA+PSBkcnZfZ3JwLT5taW5fZHJ2ICYmIGRyaXZpbmcgPD0gZHJ2X2dycC0+bWF4X2RydgorCQkmJiAhKGRyaXZpbmcgJSBkcnZfZ3JwLT5zdGVwKSkgeworCQl2YWwgPSBkcml2aW5nIC8gZHJ2X2dycC0+c3RlcCAtIDE7CisJCWJpdHMgPSBkcnZfZ3JwLT5oaWdoX2JpdCAtIGRydl9ncnAtPmxvd19iaXQgKyAxOworCQltYXNrID0gQklUKGJpdHMpIC0gMTsKKwkJc2hpZnQgPSBwaW5fZHJ2LT5iaXQgKyBkcnZfZ3JwLT5sb3dfYml0OworCQltYXNrIDw8PSBzaGlmdDsKKwkJdmFsIDw8PSBzaGlmdDsKKwkJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtdGtfZ2V0X3JlZ21hcChwY3RsLCBwaW4pLAorCQkJCXBpbl9kcnYtPm9mZnNldCwgbWFzaywgdmFsKTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBtdGtfcGNvbmZfc2V0X3B1bGxfc2VsZWN0KHN0cnVjdCBtdGtfcGluY3RybCAqcGN0bCwKKwkJdW5zaWduZWQgaW50IHBpbiwgYm9vbCBlbmFibGUsIGJvb2wgaXN1cCwgdW5zaWduZWQgaW50IGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgYml0OworCXVuc2lnbmVkIGludCByZWdfcHVsbGVuLCByZWdfcHVsbHNlbDsKKwlpbnQgcmV0OworCisJLyogU29tZSBwaW5zJyBwdWxsIHNldHRpbmcgYXJlIHZlcnkgZGlmZmVyZW50LAorCSAqIHRoZXkgaGF2ZSBzZXBhcmF0ZSBwdWxsIHVwL2Rvd24gYml0LCBSMCBhbmQgUjEKKwkgKiByZXNpc3RvciBiaXQsIHNvIHdlIG5lZWQgdGhpcyBzcGVjaWFsIGhhbmRsZS4KKwkgKi8KKwlpZiAocGN0bC0+ZGV2ZGF0YS0+c3BlY19wdWxsX3NldCkgeworCQlyZXQgPSBwY3RsLT5kZXZkYXRhLT5zcGVjX3B1bGxfc2V0KG10a19nZXRfcmVnbWFwKHBjdGwsIHBpbiksCisJCQlwaW4sIHBjdGwtPmRldmRhdGEtPnBvcnRfYWxpZ24sIGlzdXAsIGFyZyk7CisJCWlmICghcmV0KQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogRm9yIGdlbmVyaWMgcHVsbCBjb25maWcsIGRlZmF1bHQgYXJnIHZhbHVlIHNob3VsZCBiZSAwIG9yIDEuICovCisJaWYgKGFyZyAhPSAwICYmIGFyZyAhPSAxKSB7CisJCWRldl9lcnIocGN0bC0+ZGV2LCAiaW52YWxpZCBwdWxsLXVwIGFyZ3VtZW50ICVkIG9uIHBpbiAlZCAuXG4iLAorCQkJYXJnLCBwaW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwliaXQgPSBCSVQocGluICYgMHhmKTsKKwlpZiAoZW5hYmxlKQorCQlyZWdfcHVsbGVuID0gU0VUX0FERFIobXRrX2dldF9wb3J0KHBjdGwsIHBpbikgKworCQkJcGN0bC0+ZGV2ZGF0YS0+cHVsbGVuX29mZnNldCwgcGN0bCk7CisJZWxzZQorCQlyZWdfcHVsbGVuID0gQ0xSX0FERFIobXRrX2dldF9wb3J0KHBjdGwsIHBpbikgKworCQkJcGN0bC0+ZGV2ZGF0YS0+cHVsbGVuX29mZnNldCwgcGN0bCk7CisKKwlpZiAoaXN1cCkKKwkJcmVnX3B1bGxzZWwgPSBTRVRfQUREUihtdGtfZ2V0X3BvcnQocGN0bCwgcGluKSArCisJCQlwY3RsLT5kZXZkYXRhLT5wdWxsc2VsX29mZnNldCwgcGN0bCk7CisJZWxzZQorCQlyZWdfcHVsbHNlbCA9IENMUl9BRERSKG10a19nZXRfcG9ydChwY3RsLCBwaW4pICsKKwkJCXBjdGwtPmRldmRhdGEtPnB1bGxzZWxfb2Zmc2V0LCBwY3RsKTsKKworCXJlZ21hcF93cml0ZShtdGtfZ2V0X3JlZ21hcChwY3RsLCBwaW4pLCByZWdfcHVsbGVuLCBiaXQpOworCXJlZ21hcF93cml0ZShtdGtfZ2V0X3JlZ21hcChwY3RsLCBwaW4pLCByZWdfcHVsbHNlbCwgYml0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfcGNvbmZfcGFyc2VfY29uZihzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCXVuc2lnbmVkIGludCBwaW4sIGVudW0gcGluX2NvbmZpZ19wYXJhbSBwYXJhbSwKKwkJZW51bSBwaW5fY29uZmlnX3BhcmFtIGFyZykKK3sKKwlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCXN3aXRjaCAocGFyYW0pIHsKKwljYXNlIFBJTl9DT05GSUdfQklBU19ESVNBQkxFOgorCQltdGtfcGNvbmZfc2V0X3B1bGxfc2VsZWN0KHBjdGwsIHBpbiwgZmFsc2UsIGZhbHNlLCBhcmcpOworCQlicmVhazsKKwljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX1VQOgorCQltdGtfcGNvbmZfc2V0X3B1bGxfc2VsZWN0KHBjdGwsIHBpbiwgdHJ1ZSwgdHJ1ZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBQSU5fQ09ORklHX0JJQVNfUFVMTF9ET1dOOgorCQltdGtfcGNvbmZfc2V0X3B1bGxfc2VsZWN0KHBjdGwsIHBpbiwgdHJ1ZSwgZmFsc2UsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgUElOX0NPTkZJR19JTlBVVF9FTkFCTEU6CisJCW10a19wY29uZl9zZXRfaWVzX3NtdChwY3RsLCBwaW4sIGFyZywgcGFyYW0pOworCQlicmVhazsKKwljYXNlIFBJTl9DT05GSUdfT1VUUFVUOgorCQltdGtfZ3Bpb19zZXQocGN0bC0+Y2hpcCwgcGluLCBhcmcpOworCQltdGtfcG14X2dwaW9fc2V0X2RpcmVjdGlvbihwY3RsZGV2LCBOVUxMLCBwaW4sIGZhbHNlKTsKKwkJYnJlYWs7CisJY2FzZSBQSU5fQ09ORklHX0lOUFVUX1NDSE1JVFRfRU5BQkxFOgorCQltdGtfcGNvbmZfc2V0X2llc19zbXQocGN0bCwgcGluLCBhcmcsIHBhcmFtKTsKKwkJYnJlYWs7CisJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgorCQltdGtfcGNvbmZfc2V0X2RyaXZpbmcocGN0bCwgcGluLCBhcmcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfcGNvbmZfZ3JvdXBfZ2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQkgdW5zaWduZWQgZ3JvdXAsCisJCQkJIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKK3sKKwlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCSpjb25maWcgPSBwY3RsLT5ncm91cHNbZ3JvdXBdLmNvbmZpZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10a19wY29uZl9ncm91cF9zZXQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNpZ25lZCBncm91cCwKKwkJCQkgdW5zaWduZWQgbG9uZyAqY29uZmlncywgdW5zaWduZWQgbnVtX2NvbmZpZ3MpCit7CisJc3RydWN0IG10a19waW5jdHJsICpwY3RsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisJc3RydWN0IG10a19waW5jdHJsX2dyb3VwICpnID0gJnBjdGwtPmdyb3Vwc1tncm91cF07CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbmZpZ3M7IGkrKykgeworCQltdGtfcGNvbmZfcGFyc2VfY29uZihwY3RsZGV2LCBnLT5waW4sCisJCQlwaW5jb25mX3RvX2NvbmZpZ19wYXJhbShjb25maWdzW2ldKSwKKwkJCXBpbmNvbmZfdG9fY29uZmlnX2FyZ3VtZW50KGNvbmZpZ3NbaV0pKTsKKworCQlnLT5jb25maWcgPSBjb25maWdzW2ldOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmNvbmZfb3BzIG10a19wY29uZl9vcHMgPSB7CisJLnBpbl9jb25maWdfZ3JvdXBfZ2V0CT0gbXRrX3Bjb25mX2dyb3VwX2dldCwKKwkucGluX2NvbmZpZ19ncm91cF9zZXQJPSBtdGtfcGNvbmZfZ3JvdXBfc2V0LAorfTsKKworc3RhdGljIHN0cnVjdCBtdGtfcGluY3RybF9ncm91cCAqCittdGtfcGN0cmxfZmluZF9ncm91cF9ieV9waW4oc3RydWN0IG10a19waW5jdHJsICpwY3RsLCB1MzIgcGluKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHBjdGwtPm5ncm91cHM7IGkrKykgeworCQlzdHJ1Y3QgbXRrX3BpbmN0cmxfZ3JvdXAgKmdycCA9IHBjdGwtPmdyb3VwcyArIGk7CisKKwkJaWYgKGdycC0+cGluID09IHBpbikKKwkJCXJldHVybiBncnA7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2Rlc2NfZnVuY3Rpb24gKm10a19wY3RybF9maW5kX2Z1bmN0aW9uX2J5X3BpbigKKwkJc3RydWN0IG10a19waW5jdHJsICpwY3RsLCB1MzIgcGluX251bSwgdTMyIGZudW0pCit7CisJY29uc3Qgc3RydWN0IG10a19kZXNjX3BpbiAqcGluID0gcGN0bC0+ZGV2ZGF0YS0+cGlucyArIHBpbl9udW07CisJY29uc3Qgc3RydWN0IG10a19kZXNjX2Z1bmN0aW9uICpmdW5jID0gcGluLT5mdW5jdGlvbnM7CisKKwl3aGlsZSAoZnVuYyAmJiBmdW5jLT5uYW1lKSB7CisJCWlmIChmdW5jLT5tdXh2YWwgPT0gZm51bSkKKwkJCXJldHVybiBmdW5jOworCQlmdW5jKys7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sIG10a19wY3RybF9pc19mdW5jdGlvbl92YWxpZChzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwsCisJCXUzMiBwaW5fbnVtLCB1MzIgZm51bSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwY3RsLT5kZXZkYXRhLT5ucGluczsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBtdGtfZGVzY19waW4gKnBpbiA9IHBjdGwtPmRldmRhdGEtPnBpbnMgKyBpOworCisJCWlmIChwaW4tPnBpbi5udW1iZXIgPT0gcGluX251bSkgeworCQkJY29uc3Qgc3RydWN0IG10a19kZXNjX2Z1bmN0aW9uICpmdW5jID0KKwkJCQkJcGluLT5mdW5jdGlvbnM7CisKKwkJCXdoaWxlIChmdW5jICYmIGZ1bmMtPm5hbWUpIHsKKwkJCQlpZiAoZnVuYy0+bXV4dmFsID09IGZudW0pCisJCQkJCXJldHVybiB0cnVlOworCQkJCWZ1bmMrKzsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgbXRrX3BjdHJsX2R0X25vZGVfdG9fbWFwX2Z1bmMoc3RydWN0IG10a19waW5jdHJsICpwY3RsLAorCQl1MzIgcGluLCB1MzIgZm51bSwgc3RydWN0IG10a19waW5jdHJsX2dyb3VwICpncnAsCisJCXN0cnVjdCBwaW5jdHJsX21hcCAqKm1hcCwgdW5zaWduZWQgKnJlc2VydmVkX21hcHMsCisJCXVuc2lnbmVkICpudW1fbWFwcykKK3sKKwlib29sIHJldDsKKworCWlmICgqbnVtX21hcHMgPT0gKnJlc2VydmVkX21hcHMpCisJCXJldHVybiAtRU5PU1BDOworCisJKCptYXApWypudW1fbWFwc10udHlwZSA9IFBJTl9NQVBfVFlQRV9NVVhfR1JPVVA7CisJKCptYXApWypudW1fbWFwc10uZGF0YS5tdXguZ3JvdXAgPSBncnAtPm5hbWU7CisKKwlyZXQgPSBtdGtfcGN0cmxfaXNfZnVuY3Rpb25fdmFsaWQocGN0bCwgcGluLCBmbnVtKTsKKwlpZiAoIXJldCkgeworCQlkZXZfZXJyKHBjdGwtPmRldiwgImludmFsaWQgZnVuY3Rpb24gJWQgb24gcGluICVkIC5cbiIsCisJCQkJZm51bSwgcGluKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKCptYXApWypudW1fbWFwc10uZGF0YS5tdXguZnVuY3Rpb24gPSBtdGtfZ3Bpb19mdW5jdGlvbnNbZm51bV07CisJKCpudW1fbWFwcykrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10a19wY3RybF9kdF9zdWJub2RlX3RvX21hcChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJCSAgICAgIHN0cnVjdCBwaW5jdHJsX21hcCAqKm1hcCwKKwkJCQkgICAgICB1bnNpZ25lZCAqcmVzZXJ2ZWRfbWFwcywKKwkJCQkgICAgICB1bnNpZ25lZCAqbnVtX21hcHMpCit7CisJc3RydWN0IHByb3BlcnR5ICpwaW5zOworCXUzMiBwaW5mdW5jLCBwaW4sIGZ1bmM7CisJaW50IG51bV9waW5zLCBudW1fZnVuY3MsIG1hcHNfcGVyX3BpbjsKKwl1bnNpZ25lZCBsb25nICpjb25maWdzOworCXVuc2lnbmVkIGludCBudW1fY29uZmlnczsKKwlib29sIGhhc19jb25maWcgPSAwOworCWludCBpLCBlcnI7CisJdW5zaWduZWQgcmVzZXJ2ZSA9IDA7CisJc3RydWN0IG10a19waW5jdHJsX2dyb3VwICpncnA7CisJc3RydWN0IG10a19waW5jdHJsICpwY3RsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisKKwlwaW5zID0gb2ZfZmluZF9wcm9wZXJ0eShub2RlLCAicGlubXV4IiwgTlVMTCk7CisJaWYgKCFwaW5zKSB7CisJCWRldl9lcnIocGN0bC0+ZGV2LCAibWlzc2luZyBwaW5zIHByb3BlcnR5IGluIG5vZGUgJXMgLlxuIiwKKwkJCQlub2RlLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyID0gcGluY29uZl9nZW5lcmljX3BhcnNlX2R0X2NvbmZpZyhub2RlLCBwY3RsZGV2LCAmY29uZmlncywKKwkJJm51bV9jb25maWdzKTsKKwlpZiAobnVtX2NvbmZpZ3MpCisJCWhhc19jb25maWcgPSAxOworCisJbnVtX3BpbnMgPSBwaW5zLT5sZW5ndGggLyBzaXplb2YodTMyKTsKKwludW1fZnVuY3MgPSBudW1fcGluczsKKwltYXBzX3Blcl9waW4gPSAwOworCWlmIChudW1fZnVuY3MpCisJCW1hcHNfcGVyX3BpbisrOworCWlmIChoYXNfY29uZmlnICYmIG51bV9waW5zID49IDEpCisJCW1hcHNfcGVyX3BpbisrOworCisJaWYgKCFudW1fcGlucyB8fCAhbWFwc19wZXJfcGluKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlc2VydmUgPSBudW1fcGlucyAqIG1hcHNfcGVyX3BpbjsKKworCWVyciA9IHBpbmN0cmxfdXRpbHNfcmVzZXJ2ZV9tYXAocGN0bGRldiwgbWFwLAorCQkJcmVzZXJ2ZWRfbWFwcywgbnVtX21hcHMsIHJlc2VydmUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BpbnM7IGkrKykgeworCQllcnIgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9pbmRleChub2RlLCAicGlubXV4IiwKKwkJCQlpLCAmcGluZnVuYyk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWw7CisKKwkJcGluID0gTVRLX0dFVF9QSU5fTk8ocGluZnVuYyk7CisJCWZ1bmMgPSBNVEtfR0VUX1BJTl9GVU5DKHBpbmZ1bmMpOworCisJCWlmIChwaW4gPj0gcGN0bC0+ZGV2ZGF0YS0+bnBpbnMgfHwKKwkJCQlmdW5jID49IEFSUkFZX1NJWkUobXRrX2dwaW9fZnVuY3Rpb25zKSkgeworCQkJZGV2X2VycihwY3RsLT5kZXYsICJpbnZhbGlkIHBpbnMgdmFsdWUuXG4iKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlncnAgPSBtdGtfcGN0cmxfZmluZF9ncm91cF9ieV9waW4ocGN0bCwgcGluKTsKKwkJaWYgKCFncnApIHsKKwkJCWRldl9lcnIocGN0bC0+ZGV2LCAidW5hYmxlIHRvIG1hdGNoIHBpbiAlZCB0byBncm91cFxuIiwKKwkJCQkJcGluKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZXJyID0gbXRrX3BjdHJsX2R0X25vZGVfdG9fbWFwX2Z1bmMocGN0bCwgcGluLCBmdW5jLCBncnAsIG1hcCwKKwkJCQlyZXNlcnZlZF9tYXBzLCBudW1fbWFwcyk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBmYWlsOworCisJCWlmIChoYXNfY29uZmlnKSB7CisJCQllcnIgPSBwaW5jdHJsX3V0aWxzX2FkZF9tYXBfY29uZmlncyhwY3RsZGV2LCBtYXAsCisJCQkJCXJlc2VydmVkX21hcHMsIG51bV9tYXBzLCBncnAtPm5hbWUsCisJCQkJCWNvbmZpZ3MsIG51bV9jb25maWdzLAorCQkJCQlQSU5fTUFQX1RZUEVfQ09ORklHU19HUk9VUCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG10a19wY3RybF9kdF9ub2RlX3RvX21hcChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnBfY29uZmlnLAorCQkJCSBzdHJ1Y3QgcGluY3RybF9tYXAgKiptYXAsIHVuc2lnbmVkICpudW1fbWFwcykKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXVuc2lnbmVkIHJlc2VydmVkX21hcHM7CisJaW50IHJldDsKKworCSptYXAgPSBOVUxMOworCSpudW1fbWFwcyA9IDA7CisJcmVzZXJ2ZWRfbWFwcyA9IDA7CisKKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5wX2NvbmZpZywgbnApIHsKKwkJcmV0ID0gbXRrX3BjdHJsX2R0X3N1Ym5vZGVfdG9fbWFwKHBjdGxkZXYsIG5wLCBtYXAsCisJCQkJJnJlc2VydmVkX21hcHMsIG51bV9tYXBzKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXBpbmN0cmxfdXRpbHNfZHRfZnJlZV9tYXAocGN0bGRldiwgKm1hcCwgKm51bV9tYXBzKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfcGN0cmxfZ2V0X2dyb3Vwc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpCit7CisJc3RydWN0IG10a19waW5jdHJsICpwY3RsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisKKwlyZXR1cm4gcGN0bC0+bmdyb3VwczsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKm10a19wY3RybF9nZXRfZ3JvdXBfbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJCSAgICAgIHVuc2lnbmVkIGdyb3VwKQoreworCXN0cnVjdCBtdGtfcGluY3RybCAqcGN0bCA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJcmV0dXJuIHBjdGwtPmdyb3Vwc1tncm91cF0ubmFtZTsKK30KKworc3RhdGljIGludCBtdGtfcGN0cmxfZ2V0X2dyb3VwX3BpbnMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJCSAgICAgIHVuc2lnbmVkIGdyb3VwLAorCQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkICoqcGlucywKKwkJCQkgICAgICB1bnNpZ25lZCAqbnVtX3BpbnMpCit7CisJc3RydWN0IG10a19waW5jdHJsICpwY3RsID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisKKwkqcGlucyA9ICh1bnNpZ25lZCAqKSZwY3RsLT5ncm91cHNbZ3JvdXBdLnBpbjsKKwkqbnVtX3BpbnMgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9vcHMgbXRrX3BjdHJsX29wcyA9IHsKKwkuZHRfbm9kZV90b19tYXAJCT0gbXRrX3BjdHJsX2R0X25vZGVfdG9fbWFwLAorCS5kdF9mcmVlX21hcAkJPSBwaW5jdHJsX3V0aWxzX2R0X2ZyZWVfbWFwLAorCS5nZXRfZ3JvdXBzX2NvdW50CT0gbXRrX3BjdHJsX2dldF9ncm91cHNfY291bnQsCisJLmdldF9ncm91cF9uYW1lCQk9IG10a19wY3RybF9nZXRfZ3JvdXBfbmFtZSwKKwkuZ2V0X2dyb3VwX3BpbnMJCT0gbXRrX3BjdHJsX2dldF9ncm91cF9waW5zLAorfTsKKworc3RhdGljIGludCBtdGtfcG14X2dldF9mdW5jc19jbnQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2KQoreworCXJldHVybiBBUlJBWV9TSVpFKG10a19ncGlvX2Z1bmN0aW9ucyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptdGtfcG14X2dldF9mdW5jX25hbWUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJCQkgICB1bnNpZ25lZCBzZWxlY3RvcikKK3sKKwlyZXR1cm4gbXRrX2dwaW9fZnVuY3Rpb25zW3NlbGVjdG9yXTsKK30KKworc3RhdGljIGludCBtdGtfcG14X2dldF9mdW5jX2dyb3VwcyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICAgICB1bnNpZ25lZCBmdW5jdGlvbiwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqKmdyb3VwcywKKwkJCQkgICAgIHVuc2lnbmVkICogY29uc3QgbnVtX2dyb3VwcykKK3sKKwlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCSpncm91cHMgPSBwY3RsLT5ncnBfbmFtZXM7CisJKm51bV9ncm91cHMgPSBwY3RsLT5uZ3JvdXBzOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRrX3BteF9zZXRfbW9kZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCXVuc2lnbmVkIGxvbmcgcGluLCB1bnNpZ25lZCBsb25nIG1vZGUpCit7CisJdW5zaWduZWQgaW50IHJlZ19hZGRyOworCXVuc2lnbmVkIGNoYXIgYml0OworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgaW50IG1hc2sgPSAoMUwgPDwgR1BJT19NT0RFX0JJVFMpIC0gMTsKKwlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCXJlZ19hZGRyID0gKChwaW4gLyBNQVhfR1BJT19NT0RFX1BFUl9SRUcpIDw8IHBjdGwtPmRldmRhdGEtPnBvcnRfc2hmKQorCQkJKyBwY3RsLT5kZXZkYXRhLT5waW5tdXhfb2Zmc2V0OworCisJYml0ID0gcGluICUgTUFYX0dQSU9fTU9ERV9QRVJfUkVHOworCW1hc2sgPDw9IChHUElPX01PREVfQklUUyAqIGJpdCk7CisJdmFsID0gKG1vZGUgPDwgKEdQSU9fTU9ERV9CSVRTICogYml0KSk7CisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhtdGtfZ2V0X3JlZ21hcChwY3RsLCBwaW4pLAorCQkJcmVnX2FkZHIsIG1hc2ssIHZhbCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2Rlc2NfcGluICoKK210a19maW5kX3Bpbl9ieV9laW50X251bShzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwsIHVuc2lnbmVkIGludCBlaW50X251bSkKK3sKKwlpbnQgaTsKKwljb25zdCBzdHJ1Y3QgbXRrX2Rlc2NfcGluICpwaW47CisKKwlmb3IgKGkgPSAwOyBpIDwgcGN0bC0+ZGV2ZGF0YS0+bnBpbnM7IGkrKykgeworCQlwaW4gPSBwY3RsLT5kZXZkYXRhLT5waW5zICsgaTsKKwkJaWYgKHBpbi0+ZWludC5laW50bnVtID09IGVpbnRfbnVtKQorCQkJcmV0dXJuIHBpbjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBtdGtfcG14X3NldF9tdXgoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJICAgIHVuc2lnbmVkIGZ1bmN0aW9uLAorCQkJICAgIHVuc2lnbmVkIGdyb3VwKQoreworCWJvb2wgcmV0OworCWNvbnN0IHN0cnVjdCBtdGtfZGVzY19mdW5jdGlvbiAqZGVzYzsKKwlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKwlzdHJ1Y3QgbXRrX3BpbmN0cmxfZ3JvdXAgKmcgPSBwY3RsLT5ncm91cHMgKyBncm91cDsKKworCXJldCA9IG10a19wY3RybF9pc19mdW5jdGlvbl92YWxpZChwY3RsLCBnLT5waW4sIGZ1bmN0aW9uKTsKKwlpZiAoIXJldCkgeworCQlkZXZfZXJyKHBjdGwtPmRldiwgImludmFpbGQgZnVuY3Rpb24gJWQgb24gZ3JvdXAgJWQgLlxuIiwKKwkJCQlmdW5jdGlvbiwgZ3JvdXApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXNjID0gbXRrX3BjdHJsX2ZpbmRfZnVuY3Rpb25fYnlfcGluKHBjdGwsIGctPnBpbiwgZnVuY3Rpb24pOworCWlmICghZGVzYykKKwkJcmV0dXJuIC1FSU5WQUw7CisJbXRrX3BteF9zZXRfbW9kZShwY3RsZGV2LCBnLT5waW4sIGRlc2MtPm11eHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGlubXV4X29wcyBtdGtfcG14X29wcyA9IHsKKwkuZ2V0X2Z1bmN0aW9uc19jb3VudAk9IG10a19wbXhfZ2V0X2Z1bmNzX2NudCwKKwkuZ2V0X2Z1bmN0aW9uX25hbWUJPSBtdGtfcG14X2dldF9mdW5jX25hbWUsCisJLmdldF9mdW5jdGlvbl9ncm91cHMJPSBtdGtfcG14X2dldF9mdW5jX2dyb3VwcywKKwkuc2V0X211eAkJPSBtdGtfcG14X3NldF9tdXgsCisJLmdwaW9fc2V0X2RpcmVjdGlvbgk9IG10a19wbXhfZ3Bpb19zZXRfZGlyZWN0aW9uLAorfTsKKworc3RhdGljIGludCBtdGtfZ3Bpb19yZXF1ZXN0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlyZXR1cm4gcGluY3RybF9yZXF1ZXN0X2dwaW8oY2hpcC0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19ncGlvX2ZyZWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXBpbmN0cmxfZnJlZV9ncGlvKGNoaXAtPmJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW50IG10a19ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQl1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIHBpbmN0cmxfZ3Bpb19kaXJlY3Rpb25faW5wdXQoY2hpcC0+YmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAorCQkJCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwltdGtfZ3Bpb19zZXQoY2hpcCwgb2Zmc2V0LCB2YWx1ZSk7CisJcmV0dXJuIHBpbmN0cmxfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGNoaXAtPmJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW50IG10a19ncGlvX2dldF9kaXJlY3Rpb24oc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGludCByZWdfYWRkcjsKKwl1bnNpZ25lZCBpbnQgYml0OworCXVuc2lnbmVkIGludCByZWFkX3ZhbCA9IDA7CisKKwlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwgPSBkZXZfZ2V0X2RydmRhdGEoY2hpcC0+ZGV2KTsKKworCXJlZ19hZGRyID0gIG10a19nZXRfcG9ydChwY3RsLCBvZmZzZXQpICsgcGN0bC0+ZGV2ZGF0YS0+ZGlyX29mZnNldDsKKwliaXQgPSBCSVQob2Zmc2V0ICYgMHhmKTsKKwlyZWdtYXBfcmVhZChwY3RsLT5yZWdtYXAxLCByZWdfYWRkciwgJnJlYWRfdmFsKTsKKwlyZXR1cm4gISEocmVhZF92YWwgJiBiaXQpOworfQorCitzdGF0aWMgaW50IG10a19ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJdW5zaWduZWQgaW50IHJlZ19hZGRyOworCXVuc2lnbmVkIGludCBiaXQ7CisJdW5zaWduZWQgaW50IHJlYWRfdmFsID0gMDsKKwlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwgPSBkZXZfZ2V0X2RydmRhdGEoY2hpcC0+ZGV2KTsKKworCWlmIChtdGtfZ3Bpb19nZXRfZGlyZWN0aW9uKGNoaXAsIG9mZnNldCkpCisJCXJlZ19hZGRyID0gbXRrX2dldF9wb3J0KHBjdGwsIG9mZnNldCkgKworCQkJcGN0bC0+ZGV2ZGF0YS0+ZG91dF9vZmZzZXQ7CisJZWxzZQorCQlyZWdfYWRkciA9IG10a19nZXRfcG9ydChwY3RsLCBvZmZzZXQpICsKKwkJCXBjdGwtPmRldmRhdGEtPmRpbl9vZmZzZXQ7CisKKwliaXQgPSBCSVQob2Zmc2V0ICYgMHhmKTsKKwlyZWdtYXBfcmVhZChwY3RsLT5yZWdtYXAxLCByZWdfYWRkciwgJnJlYWRfdmFsKTsKKwlyZXR1cm4gISEocmVhZF92YWwgJiBiaXQpOworfQorCitzdGF0aWMgaW50IG10a19ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJY29uc3Qgc3RydWN0IG10a19kZXNjX3BpbiAqcGluOworCXN0cnVjdCBtdGtfcGluY3RybCAqcGN0bCA9IGRldl9nZXRfZHJ2ZGF0YShjaGlwLT5kZXYpOworCWludCBpcnE7CisKKwlwaW4gPSBwY3RsLT5kZXZkYXRhLT5waW5zICsgb2Zmc2V0OworCWlmIChwaW4tPmVpbnQuZWludG51bSA9PSBOT19FSU5UX1NVUFBPUlQpCisJCXJldHVybiAtRUlOVkFMOworCisJaXJxID0gaXJxX2ZpbmRfbWFwcGluZyhwY3RsLT5kb21haW4sIHBpbi0+ZWludC5laW50bnVtKTsKKwlpZiAoIWlycSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gaXJxOworfQorCitzdGF0aWMgaW50IG10a19waW5jdHJsX2lycV9yZXF1ZXN0X3Jlc291cmNlcyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IG10a19waW5jdHJsICpwY3RsID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJY29uc3Qgc3RydWN0IG10a19kZXNjX3BpbiAqcGluOworCWludCByZXQ7CisKKwlwaW4gPSBtdGtfZmluZF9waW5fYnlfZWludF9udW0ocGN0bCwgZC0+aHdpcnEpOworCisJaWYgKCFwaW4pIHsKKwkJZGV2X2VycihwY3RsLT5kZXYsICJDYW4gbm90IGZpbmQgcGluXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gZ3Bpb2NoaXBfbG9ja19hc19pcnEocGN0bC0+Y2hpcCwgcGluLT5waW4ubnVtYmVyKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIocGN0bC0+ZGV2LCAidW5hYmxlIHRvIGxvY2sgSFcgSVJRICVsdSBmb3IgSVJRXG4iLAorCQkJaXJxZF90b19od2lycShkKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogc2V0IG11eCB0byBJTlQgbW9kZSAqLworCW10a19wbXhfc2V0X21vZGUocGN0bC0+cGN0bF9kZXYsIHBpbi0+cGluLm51bWJlciwgcGluLT5laW50LmVpbnRtdXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG10a19waW5jdHJsX2lycV9yZWxlYXNlX3Jlc291cmNlcyhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IG10a19waW5jdHJsICpwY3RsID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJY29uc3Qgc3RydWN0IG10a19kZXNjX3BpbiAqcGluOworCisJcGluID0gbXRrX2ZpbmRfcGluX2J5X2VpbnRfbnVtKHBjdGwsIGQtPmh3aXJxKTsKKworCWlmICghcGluKSB7CisJCWRldl9lcnIocGN0bC0+ZGV2LCAiQ2FuIG5vdCBmaW5kIHBpblxuIik7CisJCXJldHVybjsKKwl9CisKKwlncGlvY2hpcF91bmxvY2tfYXNfaXJxKHBjdGwtPmNoaXAsIHBpbi0+cGluLm51bWJlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm10a19laW50X2dldF9vZmZzZXQoc3RydWN0IG10a19waW5jdHJsICpwY3RsLAorCXVuc2lnbmVkIGludCBlaW50X251bSwgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl1bnNpZ25lZCBpbnQgZWludF9iYXNlID0gMDsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKworCWlmIChlaW50X251bSA+PSBwY3RsLT5kZXZkYXRhLT5hcF9udW0pCisJCWVpbnRfYmFzZSA9IHBjdGwtPmRldmRhdGEtPmFwX251bTsKKworCXJlZyA9IHBjdGwtPmVpbnRfcmVnX2Jhc2UgKyBvZmZzZXQgKyAoKGVpbnRfbnVtIC0gZWludF9iYXNlKSAvIDMyKSAqIDQ7CisKKwlyZXR1cm4gcmVnOworfQorCisvKgorICogbXRrX2Nhbl9lbl9kZWJvdW5jZTogQ2hlY2sgdGhlIEVJTlQgbnVtYmVyIGlzIGFibGUgdG8gZW5hYmxlIGRlYm91bmNlIG9yIG5vdAorICogQGVpbnRfbnVtOiB0aGUgRUlOVCBudW1iZXIgdG8gc2V0bXRrX3BpbmN0cmwKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtdGtfZWludF9jYW5fZW5fZGVib3VuY2Uoc3RydWN0IG10a19waW5jdHJsICpwY3RsLAorCXVuc2lnbmVkIGludCBlaW50X251bSkKK3sKKwl1bnNpZ25lZCBpbnQgc2VuczsKKwl1bnNpZ25lZCBpbnQgYml0ID0gQklUKGVpbnRfbnVtICUgMzIpOworCWNvbnN0IHN0cnVjdCBtdGtfZWludF9vZmZzZXRzICplaW50X29mZnNldHMgPQorCQkmcGN0bC0+ZGV2ZGF0YS0+ZWludF9vZmZzZXRzOworCisJdm9pZCBfX2lvbWVtICpyZWcgPSBtdGtfZWludF9nZXRfb2Zmc2V0KHBjdGwsIGVpbnRfbnVtLAorCQkJZWludF9vZmZzZXRzLT5zZW5zKTsKKworCWlmIChyZWFkbChyZWcpICYgYml0KQorCQlzZW5zID0gTVRfTEVWRUxfU0VOU0lUSVZFOworCWVsc2UKKwkJc2VucyA9IE1UX0VER0VfU0VOU0lUSVZFOworCisJaWYgKChlaW50X251bSA8IHBjdGwtPmRldmRhdGEtPmRiX2NudCkgJiYgKHNlbnMgIT0gTVRfRURHRV9TRU5TSVRJVkUpKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKgorICogbXRrX2VpbnRfZ2V0X21hc2s6IFRvIGdldCB0aGUgZWludCBtYXNrCisgKiBAZWludF9udW06IHRoZSBFSU5UIG51bWJlciB0byBnZXQKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBtdGtfZWludF9nZXRfbWFzayhzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwsCisJdW5zaWduZWQgaW50IGVpbnRfbnVtKQoreworCXVuc2lnbmVkIGludCBiaXQgPSBCSVQoZWludF9udW0gJSAzMik7CisJY29uc3Qgc3RydWN0IG10a19laW50X29mZnNldHMgKmVpbnRfb2Zmc2V0cyA9CisJCSZwY3RsLT5kZXZkYXRhLT5laW50X29mZnNldHM7CisKKwl2b2lkIF9faW9tZW0gKnJlZyA9IG10a19laW50X2dldF9vZmZzZXQocGN0bCwgZWludF9udW0sCisJCQllaW50X29mZnNldHMtPm1hc2spOworCisJcmV0dXJuICEhKHJlYWRsKHJlZykgJiBiaXQpOworfQorCitzdGF0aWMgaW50IG10a19laW50X2ZsaXBfZWRnZShzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwsIGludCBod2lycSkKK3sKKwlpbnQgc3RhcnRfbGV2ZWwsIGN1cnJfbGV2ZWw7CisJdW5zaWduZWQgaW50IHJlZ19vZmZzZXQ7CisJY29uc3Qgc3RydWN0IG10a19laW50X29mZnNldHMgKmVpbnRfb2Zmc2V0cyA9ICYocGN0bC0+ZGV2ZGF0YS0+ZWludF9vZmZzZXRzKTsKKwl1MzIgbWFzayA9IDEgPDwgKGh3aXJxICYgMHgxZik7CisJdTMyIHBvcnQgPSAoaHdpcnEgPj4gNSkgJiBlaW50X29mZnNldHMtPnBvcnRfbWFzazsKKwl2b2lkIF9faW9tZW0gKnJlZyA9IHBjdGwtPmVpbnRfcmVnX2Jhc2UgKyAocG9ydCA8PCAyKTsKKwljb25zdCBzdHJ1Y3QgbXRrX2Rlc2NfcGluICpwaW47CisKKwlwaW4gPSBtdGtfZmluZF9waW5fYnlfZWludF9udW0ocGN0bCwgaHdpcnEpOworCWN1cnJfbGV2ZWwgPSBtdGtfZ3Bpb19nZXQocGN0bC0+Y2hpcCwgcGluLT5waW4ubnVtYmVyKTsKKwlkbyB7CisJCXN0YXJ0X2xldmVsID0gY3Vycl9sZXZlbDsKKwkJaWYgKHN0YXJ0X2xldmVsKQorCQkJcmVnX29mZnNldCA9IGVpbnRfb2Zmc2V0cy0+cG9sX2NscjsKKwkJZWxzZQorCQkJcmVnX29mZnNldCA9IGVpbnRfb2Zmc2V0cy0+cG9sX3NldDsKKwkJd3JpdGVsKG1hc2ssIHJlZyArIHJlZ19vZmZzZXQpOworCisJCWN1cnJfbGV2ZWwgPSBtdGtfZ3Bpb19nZXQocGN0bC0+Y2hpcCwgcGluLT5waW4ubnVtYmVyKTsKKwl9IHdoaWxlIChzdGFydF9sZXZlbCAhPSBjdXJyX2xldmVsKTsKKworCXJldHVybiBzdGFydF9sZXZlbDsKK30KKworc3RhdGljIHZvaWQgbXRrX2VpbnRfbWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJc3RydWN0IG10a19waW5jdHJsICpwY3RsID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJY29uc3Qgc3RydWN0IG10a19laW50X29mZnNldHMgKmVpbnRfb2Zmc2V0cyA9CisJCQkmcGN0bC0+ZGV2ZGF0YS0+ZWludF9vZmZzZXRzOworCXUzMiBtYXNrID0gQklUKGQtPmh3aXJxICYgMHgxZik7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBtdGtfZWludF9nZXRfb2Zmc2V0KHBjdGwsIGQtPmh3aXJxLAorCQkJZWludF9vZmZzZXRzLT5tYXNrX3NldCk7CisKKwl3cml0ZWwobWFzaywgcmVnKTsKK30KKworc3RhdGljIHZvaWQgbXRrX2VpbnRfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwljb25zdCBzdHJ1Y3QgbXRrX2VpbnRfb2Zmc2V0cyAqZWludF9vZmZzZXRzID0KKwkJJnBjdGwtPmRldmRhdGEtPmVpbnRfb2Zmc2V0czsKKwl1MzIgbWFzayA9IEJJVChkLT5od2lycSAmIDB4MWYpOworCXZvaWQgX19pb21lbSAqcmVnID0gbXRrX2VpbnRfZ2V0X29mZnNldChwY3RsLCBkLT5od2lycSwKKwkJCWVpbnRfb2Zmc2V0cy0+bWFza19jbHIpOworCisJd3JpdGVsKG1hc2ssIHJlZyk7CisKKwlpZiAocGN0bC0+ZWludF9kdWFsX2VkZ2VzW2QtPmh3aXJxXSkKKwkJbXRrX2VpbnRfZmxpcF9lZGdlKHBjdGwsIGQtPmh3aXJxKTsKK30KKworc3RhdGljIGludCBtdGtfZ3Bpb19zZXRfZGVib3VuY2Uoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LAorCXVuc2lnbmVkIGRlYm91bmNlKQoreworCXN0cnVjdCBtdGtfcGluY3RybCAqcGN0bCA9IGRldl9nZXRfZHJ2ZGF0YShjaGlwLT5kZXYpOworCWludCBlaW50X251bSwgdmlycSwgZWludF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHNldF9vZmZzZXQsIGJpdCwgY2xyX2JpdCwgY2xyX29mZnNldCwgcnN0LCBpLCB1bm1hc2ssIGRibmM7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkYm5jX2FycltdID0gezAgLCAxLCAxNiwgMzIsIDY0LCAxMjgsIDI1Nn07CisJY29uc3Qgc3RydWN0IG10a19kZXNjX3BpbiAqcGluOworCXN0cnVjdCBpcnFfZGF0YSAqZDsKKworCXBpbiA9IHBjdGwtPmRldmRhdGEtPnBpbnMgKyBvZmZzZXQ7CisJaWYgKHBpbi0+ZWludC5laW50bnVtID09IE5PX0VJTlRfU1VQUE9SVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllaW50X251bSA9IHBpbi0+ZWludC5laW50bnVtOworCXZpcnEgPSBpcnFfZmluZF9tYXBwaW5nKHBjdGwtPmRvbWFpbiwgZWludF9udW0pOworCWVpbnRfb2Zmc2V0ID0gKGVpbnRfbnVtICUgNCkgKiA4OworCWQgPSBpcnFfZ2V0X2lycV9kYXRhKHZpcnEpOworCisJc2V0X29mZnNldCA9IChlaW50X251bSAvIDQpICogNCArIHBjdGwtPmRldmRhdGEtPmVpbnRfb2Zmc2V0cy5kYm5jX3NldDsKKwljbHJfb2Zmc2V0ID0gKGVpbnRfbnVtIC8gNCkgKiA0ICsgcGN0bC0+ZGV2ZGF0YS0+ZWludF9vZmZzZXRzLmRibmNfY2xyOworCWlmICghbXRrX2VpbnRfY2FuX2VuX2RlYm91bmNlKHBjdGwsIGVpbnRfbnVtKSkKKwkJcmV0dXJuIC1FTk9TWVM7CisKKwlkYm5jID0gQVJSQVlfU0laRShkYm5jX2Fycik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGJuY19hcnIpOyBpKyspIHsKKwkJaWYgKGRlYm91bmNlIDw9IGRibmNfYXJyW2ldKSB7CisJCQlkYm5jID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFtdGtfZWludF9nZXRfbWFzayhwY3RsLCBlaW50X251bSkpIHsKKwkJbXRrX2VpbnRfbWFzayhkKTsKKwkJdW5tYXNrID0gMTsKKwl9CisKKwljbHJfYml0ID0gMHhmZiA8PCBlaW50X29mZnNldDsKKwl3cml0ZWwoY2xyX2JpdCwgcGN0bC0+ZWludF9yZWdfYmFzZSArIGNscl9vZmZzZXQpOworCisJYml0ID0gKChkYm5jIDw8IEVJTlRfREJOQ19TRVRfREJOQ19CSVRTKSB8IEVJTlRfREJOQ19TRVRfRU4pIDw8CisJCWVpbnRfb2Zmc2V0OworCXJzdCA9IEVJTlRfREJOQ19SU1RfQklUIDw8IGVpbnRfb2Zmc2V0OworCXdyaXRlbChyc3QgfCBiaXQsIHBjdGwtPmVpbnRfcmVnX2Jhc2UgKyBzZXRfb2Zmc2V0KTsKKworCS8qIERlbGF5IGEgd2hpbGUgKG1vcmUgdGhhbiAyVCkgdG8gd2FpdCBmb3IgaHcgZGVib3VuY2UgY291bnRlciByZXNldAorCXdvcmsgY29ycmVjdGx5ICovCisJdWRlbGF5KDEpOworCWlmICh1bm1hc2sgPT0gMSkKKwkJbXRrX2VpbnRfdW5tYXNrKGQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3Bpb19jaGlwIG10a19ncGlvX2NoaXAgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkucmVxdWVzdAkJPSBtdGtfZ3Bpb19yZXF1ZXN0LAorCS5mcmVlCQkJPSBtdGtfZ3Bpb19mcmVlLAorCS5kaXJlY3Rpb25faW5wdXQJPSBtdGtfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCisJLmRpcmVjdGlvbl9vdXRwdXQJPSBtdGtfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LAorCS5nZXQJCQk9IG10a19ncGlvX2dldCwKKwkuc2V0CQkJPSBtdGtfZ3Bpb19zZXQsCisJLnRvX2lycQkJCT0gbXRrX2dwaW9fdG9faXJxLAorCS5zZXRfZGVib3VuY2UJCT0gbXRrX2dwaW9fc2V0X2RlYm91bmNlLAorCS5vZl9ncGlvX25fY2VsbHMJPSAyLAorfTsKKworc3RhdGljIGludCBtdGtfZWludF9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHR5cGUpCit7CisJc3RydWN0IG10a19waW5jdHJsICpwY3RsID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJY29uc3Qgc3RydWN0IG10a19laW50X29mZnNldHMgKmVpbnRfb2Zmc2V0cyA9CisJCSZwY3RsLT5kZXZkYXRhLT5laW50X29mZnNldHM7CisJdTMyIG1hc2sgPSBCSVQoZC0+aHdpcnEgJiAweDFmKTsKKwl2b2lkIF9faW9tZW0gKnJlZzsKKworCWlmICgoKHR5cGUgJiBJUlFfVFlQRV9FREdFX0JPVEgpICYmICh0eXBlICYgSVJRX1RZUEVfTEVWRUxfTUFTSykpIHx8CisJCSgodHlwZSAmIElSUV9UWVBFX0xFVkVMX01BU0spID09IElSUV9UWVBFX0xFVkVMX01BU0spKSB7CisJCWRldl9lcnIocGN0bC0+ZGV2LCAiQ2FuJ3QgY29uZmlndXJlIElSUSVkIChFSU5UJWx1KSBmb3IgdHlwZSAweCVYXG4iLAorCQkJZC0+aXJxLCBkLT5od2lycSwgdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgodHlwZSAmIElSUV9UWVBFX0VER0VfQk9USCkgPT0gSVJRX1RZUEVfRURHRV9CT1RIKQorCQlwY3RsLT5laW50X2R1YWxfZWRnZXNbZC0+aHdpcnFdID0gMTsKKwllbHNlCisJCXBjdGwtPmVpbnRfZHVhbF9lZGdlc1tkLT5od2lycV0gPSAwOworCisJaWYgKHR5cGUgJiAoSVJRX1RZUEVfTEVWRUxfTE9XIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkgeworCQlyZWcgPSBtdGtfZWludF9nZXRfb2Zmc2V0KHBjdGwsIGQtPmh3aXJxLAorCQkJZWludF9vZmZzZXRzLT5wb2xfY2xyKTsKKwkJd3JpdGVsKG1hc2ssIHJlZyk7CisJfSBlbHNlIHsKKwkJcmVnID0gbXRrX2VpbnRfZ2V0X29mZnNldChwY3RsLCBkLT5od2lycSwKKwkJCWVpbnRfb2Zmc2V0cy0+cG9sX3NldCk7CisJCXdyaXRlbChtYXNrLCByZWcpOworCX0KKworCWlmICh0eXBlICYgKElSUV9UWVBFX0VER0VfUklTSU5HIHwgSVJRX1RZUEVfRURHRV9GQUxMSU5HKSkgeworCQlyZWcgPSBtdGtfZWludF9nZXRfb2Zmc2V0KHBjdGwsIGQtPmh3aXJxLAorCQkJZWludF9vZmZzZXRzLT5zZW5zX2Nscik7CisJCXdyaXRlbChtYXNrLCByZWcpOworCX0gZWxzZSB7CisJCXJlZyA9IG10a19laW50X2dldF9vZmZzZXQocGN0bCwgZC0+aHdpcnEsCisJCQllaW50X29mZnNldHMtPnNlbnNfc2V0KTsKKwkJd3JpdGVsKG1hc2ssIHJlZyk7CisJfQorCisJaWYgKHBjdGwtPmVpbnRfZHVhbF9lZGdlc1tkLT5od2lycV0pCisJCW10a19laW50X2ZsaXBfZWRnZShwY3RsLCBkLT5od2lycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXRrX2VpbnRfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwljb25zdCBzdHJ1Y3QgbXRrX2VpbnRfb2Zmc2V0cyAqZWludF9vZmZzZXRzID0KKwkJJnBjdGwtPmRldmRhdGEtPmVpbnRfb2Zmc2V0czsKKwl1MzIgbWFzayA9IEJJVChkLT5od2lycSAmIDB4MWYpOworCXZvaWQgX19pb21lbSAqcmVnID0gbXRrX2VpbnRfZ2V0X29mZnNldChwY3RsLCBkLT5od2lycSwKKwkJCWVpbnRfb2Zmc2V0cy0+YWNrKTsKKworCXdyaXRlbChtYXNrLCByZWcpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIG10a19waW5jdHJsX2lycV9jaGlwID0geworCS5uYW1lID0gIm10LWVpbnQiLAorCS5pcnFfbWFzayA9IG10a19laW50X21hc2ssCisJLmlycV91bm1hc2sgPSBtdGtfZWludF91bm1hc2ssCisJLmlycV9hY2sgPSBtdGtfZWludF9hY2ssCisJLmlycV9zZXRfdHlwZSA9IG10a19laW50X3NldF90eXBlLAorCS5pcnFfcmVxdWVzdF9yZXNvdXJjZXMgPSBtdGtfcGluY3RybF9pcnFfcmVxdWVzdF9yZXNvdXJjZXMsCisJLmlycV9yZWxlYXNlX3Jlc291cmNlcyA9IG10a19waW5jdHJsX2lycV9yZWxlYXNlX3Jlc291cmNlcywKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXRrX2VpbnRfaW5pdChzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwpCit7CisJY29uc3Qgc3RydWN0IG10a19laW50X29mZnNldHMgKmVpbnRfb2Zmc2V0cyA9CisJCSZwY3RsLT5kZXZkYXRhLT5laW50X29mZnNldHM7CisJdm9pZCBfX2lvbWVtICpyZWcgPSBwY3RsLT5laW50X3JlZ19iYXNlICsgZWludF9vZmZzZXRzLT5kb21fZW47CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGN0bC0+ZGV2ZGF0YS0+YXBfbnVtOyBpICs9IDMyKSB7CisJCXdyaXRlbCgweGZmZmZmZmZmLCByZWcpOworCQlyZWcgKz0gNDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorbXRrX2VpbnRfZGVib3VuY2VfcHJvY2VzcyhzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwsIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgcnN0LCBjdHJsX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgYml0LCBkYm5jOworCWNvbnN0IHN0cnVjdCBtdGtfZWludF9vZmZzZXRzICplaW50X29mZnNldHMgPQorCQkmcGN0bC0+ZGV2ZGF0YS0+ZWludF9vZmZzZXRzOworCisJY3RybF9vZmZzZXQgPSAoaW5kZXggLyA0KSAqIDQgKyBlaW50X29mZnNldHMtPmRibmNfY3RybDsKKwlkYm5jID0gcmVhZGwocGN0bC0+ZWludF9yZWdfYmFzZSArIGN0cmxfb2Zmc2V0KTsKKwliaXQgPSBFSU5UX0RCTkNfU0VUX0VOIDw8ICgoaW5kZXggJSA0KSAqIDgpOworCWlmICgoYml0ICYgZGJuYykgPiAwKSB7CisJCWN0cmxfb2Zmc2V0ID0gKGluZGV4IC8gNCkgKiA0ICsgZWludF9vZmZzZXRzLT5kYm5jX3NldDsKKwkJcnN0ID0gRUlOVF9EQk5DX1JTVF9CSVQgPDwgKChpbmRleCAlIDQpICogOCk7CisJCXdyaXRlbChyc3QsIHBjdGwtPmVpbnRfcmVnX2Jhc2UgKyBjdHJsX29mZnNldCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBtdGtfZWludF9pcnFfaGFuZGxlcih1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZ2V0X2NoaXAoaXJxKTsKKwlzdHJ1Y3QgbXRrX3BpbmN0cmwgKnBjdGwgPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOworCXVuc2lnbmVkIGludCBzdGF0dXMsIGVpbnRfbnVtOworCWludCBvZmZzZXQsIGluZGV4LCB2aXJxOworCWNvbnN0IHN0cnVjdCBtdGtfZWludF9vZmZzZXRzICplaW50X29mZnNldHMgPQorCQkmcGN0bC0+ZGV2ZGF0YS0+ZWludF9vZmZzZXRzOworCXZvaWQgX19pb21lbSAqcmVnID0gIG10a19laW50X2dldF9vZmZzZXQocGN0bCwgMCwgZWludF9vZmZzZXRzLT5zdGF0KTsKKwlpbnQgZHVhbF9lZGdlcywgc3RhcnRfbGV2ZWwsIGN1cnJfbGV2ZWw7CisJY29uc3Qgc3RydWN0IG10a19kZXNjX3BpbiAqcGluOworCisJY2hhaW5lZF9pcnFfZW50ZXIoY2hpcCwgZGVzYyk7CisJZm9yIChlaW50X251bSA9IDA7IGVpbnRfbnVtIDwgcGN0bC0+ZGV2ZGF0YS0+YXBfbnVtOyBlaW50X251bSArPSAzMikgeworCQlzdGF0dXMgPSByZWFkbChyZWcpOworCQlyZWcgKz0gNDsKKwkJd2hpbGUgKHN0YXR1cykgeworCQkJb2Zmc2V0ID0gX19mZnMoc3RhdHVzKTsKKwkJCWluZGV4ID0gZWludF9udW0gKyBvZmZzZXQ7CisJCQl2aXJxID0gaXJxX2ZpbmRfbWFwcGluZyhwY3RsLT5kb21haW4sIGluZGV4KTsKKwkJCXN0YXR1cyAmPSB+QklUKG9mZnNldCk7CisKKwkJCWR1YWxfZWRnZXMgPSBwY3RsLT5laW50X2R1YWxfZWRnZXNbaW5kZXhdOworCQkJaWYgKGR1YWxfZWRnZXMpIHsKKwkJCQkvKiBDbGVhciBzb2Z0LWlycSBpbiBjYXNlIHdlIHJhaXNlZCBpdAorCQkJCSAgIGxhc3QgdGltZSAqLworCQkJCXdyaXRlbChCSVQob2Zmc2V0KSwgcmVnIC0gZWludF9vZmZzZXRzLT5zdGF0ICsKKwkJCQkJZWludF9vZmZzZXRzLT5zb2Z0X2Nscik7CisKKwkJCQlwaW4gPSBtdGtfZmluZF9waW5fYnlfZWludF9udW0ocGN0bCwgaW5kZXgpOworCQkJCXN0YXJ0X2xldmVsID0gbXRrX2dwaW9fZ2V0KHBjdGwtPmNoaXAsCisJCQkJCQkJICAgcGluLT5waW4ubnVtYmVyKTsKKwkJCX0KKworCQkJZ2VuZXJpY19oYW5kbGVfaXJxKHZpcnEpOworCisJCQlpZiAoZHVhbF9lZGdlcykgeworCQkJCWN1cnJfbGV2ZWwgPSBtdGtfZWludF9mbGlwX2VkZ2UocGN0bCwgaW5kZXgpOworCisJCQkJLyogSWYgbGV2ZWwgY2hhbmdlZCwgd2UgbWlnaHQgbG9zdCBvbmUgZWRnZQorCQkJCSAgIGludGVycnVwdCwgcmFpc2VkIGl0IHRocm91Z2ggc29mdC1pcnEgKi8KKwkJCQlpZiAoc3RhcnRfbGV2ZWwgIT0gY3Vycl9sZXZlbCkKKwkJCQkJd3JpdGVsKEJJVChvZmZzZXQpLCByZWcgLQorCQkJCQkJZWludF9vZmZzZXRzLT5zdGF0ICsKKwkJCQkJCWVpbnRfb2Zmc2V0cy0+c29mdF9zZXQpOworCQkJfQorCisJCQlpZiAoaW5kZXggPCBwY3RsLT5kZXZkYXRhLT5kYl9jbnQpCisJCQkJbXRrX2VpbnRfZGVib3VuY2VfcHJvY2VzcyhwY3RsICwgaW5kZXgpOworCQl9CisJfQorCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKK3N0YXRpYyBpbnQgbXRrX3BjdHJsX2J1aWxkX3N0YXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG10a19waW5jdHJsICpwY3RsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlwY3RsLT5uZ3JvdXBzID0gcGN0bC0+ZGV2ZGF0YS0+bnBpbnM7CisKKwkvKiBBbGxvY2F0ZSBncm91cHMgKi8KKwlwY3RsLT5ncm91cHMgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgcGN0bC0+bmdyb3VwcywKKwkJCQkgICAgc2l6ZW9mKCpwY3RsLT5ncm91cHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjdGwtPmdyb3VwcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBXZSBhc3N1bWUgdGhhdCBvbmUgcGluIGlzIG9uZSBncm91cCwgdXNlIHBpbiBuYW1lIGFzIGdyb3VwIG5hbWUuICovCisJcGN0bC0+Z3JwX25hbWVzID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIHBjdGwtPm5ncm91cHMsCisJCQkJICAgICAgIHNpemVvZigqcGN0bC0+Z3JwX25hbWVzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY3RsLT5ncnBfbmFtZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IHBjdGwtPmRldmRhdGEtPm5waW5zOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IG10a19kZXNjX3BpbiAqcGluID0gcGN0bC0+ZGV2ZGF0YS0+cGlucyArIGk7CisJCXN0cnVjdCBtdGtfcGluY3RybF9ncm91cCAqZ3JvdXAgPSBwY3RsLT5ncm91cHMgKyBpOworCisJCWdyb3VwLT5uYW1lID0gcGluLT5waW4ubmFtZTsKKwkJZ3JvdXAtPnBpbiA9IHBpbi0+cGluLm51bWJlcjsKKworCQlwY3RsLT5ncnBfbmFtZXNbaV0gPSBwaW4tPnBpbi5uYW1lOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfZGVzYyBtdGtfcGN0cmxfZGVzYyA9IHsKKwkuY29uZm9wcwk9ICZtdGtfcGNvbmZfb3BzLAorCS5wY3Rsb3BzCT0gJm10a19wY3RybF9vcHMsCisJLnBteG9wcwkJPSAmbXRrX3BteF9vcHMsCit9OworCitpbnQgbXRrX3BjdHJsX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJY29uc3Qgc3RydWN0IG10a19waW5jdHJsX2RldmRhdGEgKmRhdGEpCit7CisJc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgKnBpbnM7CisJc3RydWN0IG10a19waW5jdHJsICpwY3RsOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZSwgKm5vZGU7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpLCByZXQsIGlycTsKKworCXBjdGwgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwY3RsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY3RsKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBjdGwpOworCisJcHJvcCA9IG9mX2ZpbmRfcHJvcGVydHkobnAsICJwaW5zLWFyZS1udW1iZXJlZCIsIE5VTEwpOworCWlmICghcHJvcCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJvbmx5IHN1cHBvcnQgcGlucy1hcmUtbnVtYmVyZWQgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJtZWRpYXRlayxwY3RsLXJlZ21hcCIsIDApOworCWlmIChub2RlKSB7CisJCXBjdGwtPnJlZ21hcDEgPSBzeXNjb25fbm9kZV90b19yZWdtYXAobm9kZSk7CisJCWlmIChJU19FUlIocGN0bC0+cmVnbWFwMSkpCisJCQlyZXR1cm4gUFRSX0VSUihwY3RsLT5yZWdtYXAxKTsKKwl9CisKKwkvKiBPbmx5IDgxMzUgaGFzIHR3byBiYXNlIGFkZHIsIG90aGVyIFNvQ3MgaGF2ZSBvbmx5IG9uZS4gKi8KKwlub2RlID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgIm1lZGlhdGVrLHBjdGwtcmVnbWFwIiwgMSk7CisJaWYgKG5vZGUpIHsKKwkJcGN0bC0+cmVnbWFwMiA9IHN5c2Nvbl9ub2RlX3RvX3JlZ21hcChub2RlKTsKKwkJaWYgKElTX0VSUihwY3RsLT5yZWdtYXAyKSkKKwkJCXJldHVybiBQVFJfRVJSKHBjdGwtPnJlZ21hcDIpOworCX0KKworCXBjdGwtPmRldmRhdGEgPSBkYXRhOworCXJldCA9IG10a19wY3RybF9idWlsZF9zdGF0ZShwZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImJ1aWxkIHN0YXRlIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBpbnMgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgcGN0bC0+ZGV2ZGF0YS0+bnBpbnMsIHNpemVvZigqcGlucyksCisJCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwaW5zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBwY3RsLT5kZXZkYXRhLT5ucGluczsgaSsrKQorCQlwaW5zW2ldID0gcGN0bC0+ZGV2ZGF0YS0+cGluc1tpXS5waW47CisJbXRrX3BjdHJsX2Rlc2MubmFtZSA9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCW10a19wY3RybF9kZXNjLm93bmVyID0gVEhJU19NT0RVTEU7CisJbXRrX3BjdHJsX2Rlc2MucGlucyA9IHBpbnM7CisJbXRrX3BjdHJsX2Rlc2MubnBpbnMgPSBwY3RsLT5kZXZkYXRhLT5ucGluczsKKwlwY3RsLT5kZXYgPSAmcGRldi0+ZGV2OworCXBjdGwtPnBjdGxfZGV2ID0gcGluY3RybF9yZWdpc3RlcigmbXRrX3BjdHJsX2Rlc2MsICZwZGV2LT5kZXYsIHBjdGwpOworCWlmICghcGN0bC0+cGN0bF9kZXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGRuJ3QgcmVnaXN0ZXIgcGluY3RybCBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwY3RsLT5jaGlwID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGN0bC0+Y2hpcCksIEdGUF9LRVJORUwpOworCWlmICghcGN0bC0+Y2hpcCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIHBjdHJsX2Vycm9yOworCX0KKworCXBjdGwtPmNoaXAgPSAmbXRrX2dwaW9fY2hpcDsKKwlwY3RsLT5jaGlwLT5uZ3BpbyA9IHBjdGwtPmRldmRhdGEtPm5waW5zOworCXBjdGwtPmNoaXAtPmxhYmVsID0gZGV2X25hbWUoJnBkZXYtPmRldik7CisJcGN0bC0+Y2hpcC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwY3RsLT5jaGlwLT5iYXNlID0gMDsKKworCXJldCA9IGdwaW9jaGlwX2FkZChwY3RsLT5jaGlwKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gcGN0cmxfZXJyb3I7CisJfQorCisJLyogUmVnaXN0ZXIgdGhlIEdQSU8gdG8gcGluIG1hcHBpbmdzLiAqLworCXJldCA9IGdwaW9jaGlwX2FkZF9waW5fcmFuZ2UocGN0bC0+Y2hpcCwgZGV2X25hbWUoJnBkZXYtPmRldiksCisJCQkwLCAwLCBwY3RsLT5kZXZkYXRhLT5ucGlucyk7CisJaWYgKHJldCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGNoaXBfZXJyb3I7CisJfQorCisJLyogR2V0IEVJTlQgcmVnaXN0ZXIgYmFzZSBmcm9tIGR0cy4gKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byBnZXQgUGluY3RybCByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gY2hpcF9lcnJvcjsKKwl9CisKKwlwY3RsLT5laW50X3JlZ19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihwY3RsLT5laW50X3JlZ19iYXNlKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGNoaXBfZXJyb3I7CisJfQorCisJcGN0bC0+ZWludF9kdWFsX2VkZ2VzID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIHBjdGwtPmRldmRhdGEtPmFwX251bSwKKwkJCQkJICAgICBzaXplb2YoaW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwY3RsLT5laW50X2R1YWxfZWRnZXMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBjaGlwX2Vycm9yOworCX0KKworCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKKwlpZiAoIWlycSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZG4ndCBwYXJzZSBhbmQgbWFwIGlycVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gY2hpcF9lcnJvcjsKKwl9CisKKwlwY3RsLT5kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIobnAsCisJCXBjdGwtPmRldmRhdGEtPmFwX251bSwgJmlycV9kb21haW5fc2ltcGxlX29wcywgTlVMTCk7CisJaWYgKCFwY3RsLT5kb21haW4pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgcmVnaXN0ZXIgSVJRIGRvbWFpblxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gY2hpcF9lcnJvcjsKKwl9CisKKwltdGtfZWludF9pbml0KHBjdGwpOworCWZvciAoaSA9IDA7IGkgPCBwY3RsLT5kZXZkYXRhLT5hcF9udW07IGkrKykgeworCQlpbnQgdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhwY3RsLT5kb21haW4sIGkpOworCisJCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmbXRrX3BpbmN0cmxfaXJxX2NoaXAsCisJCQloYW5kbGVfbGV2ZWxfaXJxKTsKKwkJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgcGN0bCk7CisJCXNldF9pcnFfZmxhZ3ModmlycSwgSVJRRl9WQUxJRCk7CisJfTsKKworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGlycSwgbXRrX2VpbnRfaXJxX2hhbmRsZXIpOworCWlycV9zZXRfaGFuZGxlcl9kYXRhKGlycSwgcGN0bCk7CisJc2V0X2lycV9mbGFncyhpcnEsIElSUUZfVkFMSUQpOworCXJldHVybiAwOworCitjaGlwX2Vycm9yOgorCWdwaW9jaGlwX3JlbW92ZShwY3RsLT5jaGlwKTsKK3BjdHJsX2Vycm9yOgorCXBpbmN0cmxfdW5yZWdpc3RlcihwY3RsLT5wY3RsX2Rldik7CisJcmV0dXJuIHJldDsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNZWRpYVRlayBQaW5jdHJsIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiSG9uZ3pob3UgWWFuZyA8aG9uZ3pob3UueWFuZ0BtZWRpYXRlay5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvcGluY3RybC1tdGstY29tbW9uLmggYi9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvcGluY3RybC1tdGstY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1NzcxZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9waW5jdHJsLW10ay1jb21tb24uaApAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBNZWRpYVRlayBJbmMuCisgKiBBdXRob3I6IEhvbmd6aG91LllhbmcgPGhvbmd6aG91LnlhbmdAbWVkaWF0ZWsuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fUElOQ1RSTF9NVEtfQ09NTU9OX0gKKyNkZWZpbmUgX19QSU5DVFJMX01US19DT01NT05fSAorCisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKKyNkZWZpbmUgTk9fRUlOVF9TVVBQT1JUICAgIDI1NQorI2RlZmluZSBNVEtfQ0hJUF9UWVBFX0JBU0UgICAgIDAKKyNkZWZpbmUgTVRLX0NISVBfVFlQRV9QTUlDICAgICAxCisjZGVmaW5lIE1UX0VER0VfU0VOU0lUSVZFICAgICAgICAgICAwCisjZGVmaW5lIE1UX0xFVkVMX1NFTlNJVElWRSAgICAgICAgICAxCisjZGVmaW5lIEVJTlRfREJOQ19TRVRfREJOQ19CSVRTICAgICA0CisjZGVmaW5lIEVJTlRfREJOQ19SU1RfQklUICAgICAgICAgICAoMHgxIDw8IDEpCisjZGVmaW5lIEVJTlRfREJOQ19TRVRfRU4gICAgICAgICAgICAoMHgxIDw8IDApCisKK3N0cnVjdCBtdGtfZGVzY19mdW5jdGlvbiB7CisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBjaGFyIG11eHZhbDsKK307CisKK3N0cnVjdCBtdGtfZGVzY19laW50IHsKKwl1bnNpZ25lZCBjaGFyIGVpbnRtdXg7CisJdW5zaWduZWQgY2hhciBlaW50bnVtOworfTsKKworc3RydWN0IG10a19kZXNjX3BpbiB7CisJc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MJcGluOworCWNvbnN0IGNoYXIgKmNoaXA7CisJY29uc3Qgc3RydWN0IG10a19kZXNjX2VpbnQgZWludDsKKwljb25zdCBzdHJ1Y3QgbXRrX2Rlc2NfZnVuY3Rpb24JKmZ1bmN0aW9uczsKK307CisKKyNkZWZpbmUgTVRLX1BJTihfcGluLCBfcGFkLCBfY2hpcCwgX2VpbnQsIC4uLikJCVwKKwl7CQkJCQkJCVwKKwkJLnBpbiA9IF9waW4sCQkJCQlcCisJCS5jaGlwID0gX2NoaXAsCQkJCQlcCisJCS5laW50ID0gX2VpbnQsCQkJCQlcCisJCS5mdW5jdGlvbnMgPSAoc3RydWN0IG10a19kZXNjX2Z1bmN0aW9uW10pewlcCisJCQlfX1ZBX0FSR1NfXywgeyB9IH0sCQkJXAorCX0KKworI2RlZmluZSBNVEtfRUlOVF9GVU5DVElPTihfZWludG11eCwgX2VpbnRudW0pCQkJCVwKKwl7CQkJCQkJCVwKKwkJLmVpbnRtdXggPSBfZWludG11eCwJCQkJCVwKKwkJLmVpbnRudW0gPSBfZWludG51bSwJCQkJCVwKKwl9CisKKyNkZWZpbmUgTVRLX0ZVTkNUSU9OKF92YWwsIF9uYW1lKQkJCQlcCisJewkJCQkJCQlcCisJCS5tdXh2YWwgPSBfdmFsLAkJCQkJXAorCQkubmFtZSA9IF9uYW1lLAkJCQkJXAorCX0KKworI2RlZmluZSBTRVRfQUREUih4LCB5KSAgKHggKyAoeS0+ZGV2ZGF0YS0+cG9ydF9hbGlnbikpCisjZGVmaW5lIENMUl9BRERSKHgsIHkpICAoeCArICh5LT5kZXZkYXRhLT5wb3J0X2FsaWduIDw8IDEpKQorCitzdHJ1Y3QgbXRrX3BpbmN0cmxfZ3JvdXAgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJdW5zaWduZWQgbG9uZwljb25maWc7CisJdW5zaWduZWQJcGluOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbXRrX2Rydl9ncm91cF9kZXNjIC0gUHJvdmlkZSBkcml2aW5nIGdyb3VwIGRhdGEuCisgKiBAbWF4X2RydjogVGhlIG1heGltdW0gY3VycmVudCBvZiB0aGlzIGdyb3VwLgorICogQG1pbl9kcnY6IFRoZSBtaW5pbXVtIGN1cnJlbnQgb2YgdGhpcyBncm91cC4KKyAqIEBsb3dfYml0OiBUaGUgbG93ZXN0IGJpdCBvZiB0aGlzIGdyb3VwLgorICogQGhpZ2hfYml0OiBUaGUgaGlnaGVzdCBiaXQgb2YgdGhpcyBncm91cC4KKyAqIEBzdGVwOiBUaGUgc3RlcCBjdXJyZW50IG9mIHRoaXMgZ3JvdXAuCisgKi8KK3N0cnVjdCBtdGtfZHJ2X2dyb3VwX2Rlc2MgeworCXVuc2lnbmVkIGNoYXIgbWluX2RydjsKKwl1bnNpZ25lZCBjaGFyIG1heF9kcnY7CisJdW5zaWduZWQgY2hhciBsb3dfYml0OworCXVuc2lnbmVkIGNoYXIgaGlnaF9iaXQ7CisJdW5zaWduZWQgY2hhciBzdGVwOworfTsKKworI2RlZmluZSBNVEtfRFJWX0dSUChfbWluLCBfbWF4LCBfbG93LCBfaGlnaCwgX3N0ZXApCVwKKwl7CVwKKwkJLm1pbl9kcnYgPSBfbWluLAlcCisJCS5tYXhfZHJ2ID0gX21heCwJXAorCQkubG93X2JpdCA9IF9sb3csCVwKKwkJLmhpZ2hfYml0ID0gX2hpZ2gsCVwKKwkJLnN0ZXAgPSBfc3RlcCwJCVwKKwl9CisKKy8qKgorICogc3RydWN0IG10a19waW5fZHJ2X2dycCAtIFByb3ZpZGUgZWFjaCBwaW4gZHJpdmluZyBpbmZvLgorICogQHBpbjogVGhlIHBpbiBudW1iZXIuCisgKiBAb2Zmc2V0OiBUaGUgb2Zmc2V0IG9mIGRyaXZpbmcgcmVnaXN0ZXIgZm9yIHRoaXMgcGluLgorICogQGJpdDogVGhlIGJpdCBvZiBkcml2aW5nIHJlZ2lzdGVyIGZvciB0aGlzIHBpbi4KKyAqIEBncnA6IFRoZSBncm91cCBmb3IgdGhpcyBwaW4gYmVsb25ncyB0by4KKyAqLworc3RydWN0IG10a19waW5fZHJ2X2dycCB7CisJdW5zaWduZWQgaW50IHBpbjsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCXVuc2lnbmVkIGNoYXIgYml0OworCXVuc2lnbmVkIGNoYXIgZ3JwOworfTsKKworI2RlZmluZSBNVEtfUElOX0RSVl9HUlAoX3BpbiwgX29mZnNldCwgX2JpdCwgX2dycCkJXAorCXsJXAorCQkucGluID0gX3BpbiwJXAorCQkub2Zmc2V0ID0gX29mZnNldCwJXAorCQkuYml0ID0gX2JpdCwJXAorCQkuZ3JwID0gX2dycCwJXAorCX0KKworc3RydWN0IG10a19laW50X29mZnNldHMgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50ICBzdGF0OworCXVuc2lnbmVkIGludCAgYWNrOworCXVuc2lnbmVkIGludCAgbWFzazsKKwl1bnNpZ25lZCBpbnQgIG1hc2tfc2V0OworCXVuc2lnbmVkIGludCAgbWFza19jbHI7CisJdW5zaWduZWQgaW50ICBzZW5zOworCXVuc2lnbmVkIGludCAgc2Vuc19zZXQ7CisJdW5zaWduZWQgaW50ICBzZW5zX2NscjsKKwl1bnNpZ25lZCBpbnQgIHNvZnQ7CisJdW5zaWduZWQgaW50ICBzb2Z0X3NldDsKKwl1bnNpZ25lZCBpbnQgIHNvZnRfY2xyOworCXVuc2lnbmVkIGludCAgcG9sOworCXVuc2lnbmVkIGludCAgcG9sX3NldDsKKwl1bnNpZ25lZCBpbnQgIHBvbF9jbHI7CisJdW5zaWduZWQgaW50ICBkb21fZW47CisJdW5zaWduZWQgaW50ICBkYm5jX2N0cmw7CisJdW5zaWduZWQgaW50ICBkYm5jX3NldDsKKwl1bnNpZ25lZCBpbnQgIGRibmNfY2xyOworCXU4ICBwb3J0X21hc2s7CisJdTggIHBvcnRzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbXRrX3BpbmN0cmxfZGV2ZGF0YSAtIFByb3ZpZGUgSFcgR1BJTyByZWxhdGVkIGRhdGEuCisgKiBAcGluczogQW4gYXJyYXkgZGVzY3JpYmluZyBhbGwgcGlucyB0aGUgcGluIGNvbnRyb2xsZXIgYWZmZWN0cy4KKyAqIEBucGluczogVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIEBwaW5zLgorICoKKyAqIEBncnBfZGVzYzogVGhlIGRyaXZpbmcgZ3JvdXAgaW5mby4KKyAqIEBwaW5fZHJ2X2dycDogVGhlIGRyaXZpbmcgZ3JvdXAgZm9yIGFsbCBwaW5zLgorICogQHNwZWNfcHVsbF9zZXQ6IEVhY2ggU29DIG1heSBoYXZlIHNwZWNpYWwgcGlucyBmb3IgcHVsbCB1cC9kb3duIHNldHRpbmcsCisgKiAgdGhlc2UgcGlucycgcHVsbCBzZXR0aW5nIGFyZSB2ZXJ5IGRpZmZlcmVudCwgdGhleSBoYXZlIHNlcGFyYXRlIHB1bGwKKyAqICB1cC9kb3duIGJpdCwgUjAgYW5kIFIxIHJlc2lzdG9yIGJpdCwgc28gdGhleSBuZWVkIHNwZWNpYWwgcHVsbCBzZXR0aW5nLgorICogIElmIHNwZWNpYWwgc2V0dGluZyBpcyBzdWNjZXNzLCB0aGlzIHNob3VsZCByZXR1cm4gMCwgb3RoZXJ3aXNlIGl0IHNob3VsZAorICogIHJldHVybiBub24temVybyB2YWx1ZS4KKyAqIEBzcGVjX2llc19zbXRfc2V0OiBTb21lIHBpbnMgYXJlIGlycmVndWxhciwgdGhlaXIgaW5wdXQgZW5hYmxlIGFuZCBzbXQKKyAqIGNvbnRyb2wgcmVnaXN0ZXIgYXJlIGRpc2NvbnRpbnVvdXMsIGJ1dCB0aGV5IGFyZSBtYXBwaW5nIHRvZ2V0aGVyLiBUaGF0CisgKiBtZWFucyB3aGVuIHVzZXIgc2V0IHNtdCwgaW5wdXQgZW5hYmxlIGlzIHNldCBhdCB0aGUgc2FtZSB0aW1lLiBTbyB0aGV5CisgKiBhbHNvIG5lZWQgc3BlY2lhbCBjb250cm9sLiBJZiBzcGVjaWFsIGNvbnRyb2wgaXMgc3VjY2VzcywgdGhpcyBzaG91bGQKKyAqIHJldHVybiAwLCBvdGhlcndpc2UgcmV0dXJuIG5vbi16ZXJvIHZhbHVlLgorICoKKyAqIEBkaXJfb2Zmc2V0OiBUaGUgZGlyZWN0aW9uIHJlZ2lzdGVyIG9mZnNldC4KKyAqIEBwdWxsZW5fb2Zmc2V0OiBUaGUgcHVsbC11cC9wdWxsLWRvd24gZW5hYmxlIHJlZ2lzdGVyIG9mZnNldC4KKyAqIEBwaW5tdXhfb2Zmc2V0OiBUaGUgcGlubXV4IHJlZ2lzdGVyIG9mZnNldC4KKyAqCisgKiBAdHlwZTFfc3RhcnQ6IFNvbWUgY2hpcHMgaGF2ZSB0d28gYmFzZSBhZGRyZXNzZXMgZm9yIHB1bGwgc2VsZWN0IHJlZ2lzdGVyLAorICogIHRoYXQgbWVhbnMgc29tZSBwaW5zIHVzZSB0aGUgZmlyc3QgYWRkcmVzcyBhbmQgb3RoZXJzIHVzZSB0aGUgc2Vjb25kLiBUaGlzCisgKiAgbWVtYmVyIHJlY29yZCB0aGUgc3RhcnQgb2YgcGluIG51bWJlciB0byB1c2UgdGhlIHNlY29uZCBhZGRyZXNzLgorICogQHR5cGUxX2VuZDogVGhlIGVuZCBvZiBwaW4gbnVtYmVyIHRvIHVzZSB0aGUgc2Vjb25kIGFkZHJlc3MuCisgKgorICogQHBvcnRfc2hmOiBUaGUgc2hpZnQgYmV0d2VlbiB0d28gcmVnaXN0ZXJzLgorICogQHBvcnRfbWFzazogVGhlIG1hc2sgb2YgcmVnaXN0ZXIuCisgKiBAcG9ydF9hbGlnbjogUHJvdmlkZSBjbGVhciByZWdpc3RlciBhbmQgc2V0IHJlZ2lzdGVyIHN0ZXAuCisgKi8KK3N0cnVjdCBtdGtfcGluY3RybF9kZXZkYXRhIHsKKwljb25zdCBzdHJ1Y3QgbXRrX2Rlc2NfcGluCSpwaW5zOworCXVuc2lnbmVkIGludAkJCQlucGluczsKKwljb25zdCBzdHJ1Y3QgbXRrX2Rydl9ncm91cF9kZXNjCSpncnBfZGVzYzsKKwl1bnNpZ25lZCBpbnQJbl9ncnBfY2xzOworCWNvbnN0IHN0cnVjdCBtdGtfcGluX2Rydl9ncnAJKnBpbl9kcnZfZ3JwOworCXVuc2lnbmVkIGludAluX3Bpbl9kcnZfZ3JwczsKKwlpbnQgKCpzcGVjX3B1bGxfc2V0KShzdHJ1Y3QgcmVnbWFwICpyZWcsIHVuc2lnbmVkIGludCBwaW4sCisJCQl1bnNpZ25lZCBjaGFyIGFsaWduLCBib29sIGlzdXAsIHVuc2lnbmVkIGludCBhcmcpOworCWludCAoKnNwZWNfaWVzX3NtdF9zZXQpKHN0cnVjdCByZWdtYXAgKnJlZywgdW5zaWduZWQgaW50IHBpbiwKKwkJCXVuc2lnbmVkIGNoYXIgYWxpZ24sIGludCB2YWx1ZSk7CisJdW5zaWduZWQgaW50IGRpcl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IGllc19vZmZzZXQ7CisJdW5zaWduZWQgaW50IHNtdF9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHB1bGxlbl9vZmZzZXQ7CisJdW5zaWduZWQgaW50IHB1bGxzZWxfb2Zmc2V0OworCXVuc2lnbmVkIGludCBkcnZfb2Zmc2V0OworCXVuc2lnbmVkIGludCBpbnZzZXJfb2Zmc2V0OworCXVuc2lnbmVkIGludCBkb3V0X29mZnNldDsKKwl1bnNpZ25lZCBpbnQgZGluX29mZnNldDsKKwl1bnNpZ25lZCBpbnQgcGlubXV4X29mZnNldDsKKwl1bnNpZ25lZCBzaG9ydCB0eXBlMV9zdGFydDsKKwl1bnNpZ25lZCBzaG9ydCB0eXBlMV9lbmQ7CisJdW5zaWduZWQgY2hhciAgcG9ydF9zaGY7CisJdW5zaWduZWQgY2hhciAgcG9ydF9tYXNrOworCXVuc2lnbmVkIGNoYXIgIHBvcnRfYWxpZ247CisJdW5zaWduZWQgY2hhcgljaGlwX3R5cGU7CisJc3RydWN0IG10a19laW50X29mZnNldHMgZWludF9vZmZzZXRzOworCXVuc2lnbmVkIGludAlhcF9udW07CisJdW5zaWduZWQgaW50CWRiX2NudDsKK307CisKK3N0cnVjdCBtdGtfcGluY3RybCB7CisJc3RydWN0IHJlZ21hcAkqcmVnbWFwMTsKKwlzdHJ1Y3QgcmVnbWFwCSpyZWdtYXAyOworCXN0cnVjdCBkZXZpY2UgICAgICAgICAgICpkZXY7CisJc3RydWN0IGdwaW9fY2hpcAkqY2hpcDsKKwlzdHJ1Y3QgbXRrX3BpbmN0cmxfZ3JvdXAJKmdyb3VwczsKKwl1bnNpZ25lZAkJCW5ncm91cHM7CisJY29uc3QgY2hhciAgICAgICAgICAqKmdycF9uYW1lczsKKwlzdHJ1Y3QgcGluY3RybF9kZXYgICAgICAqcGN0bF9kZXY7CisJY29uc3Qgc3RydWN0IG10a19waW5jdHJsX2RldmRhdGEgICpkZXZkYXRhOworCXZvaWQgX19pb21lbQkJKmVpbnRfcmVnX2Jhc2U7CisJc3RydWN0IGlycV9kb21haW4JKmRvbWFpbjsKKwlpbnQJCQkqZWludF9kdWFsX2VkZ2VzOworfTsKKworaW50IG10a19wY3RybF9pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCWNvbnN0IHN0cnVjdCBtdGtfcGluY3RybF9kZXZkYXRhICpkYXRhKTsKKworI2VuZGlmIC8qIF9fUElOQ1RSTF9NVEtfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9waW5jdHJsLW10ay1tdDgxMzUuaCBiL2RyaXZlcnMvcGluY3RybC9tZWRpYXRlay9waW5jdHJsLW10ay1tdDgxMzUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTdhZWRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL3BpbmN0cmwtbXRrLW10ODEzNS5oCkBAIC0wLDAgKzEsMjExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCBNZWRpYVRlayBJbmMuCisgKiBBdXRob3I6IEhvbmd6aG91LllhbmcgPGhvbmd6aG91LnlhbmdAbWVkaWF0ZWsuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9fUElOQ1RSTF9NVEtfTVQ4MTM1X0gKKyNkZWZpbmUgX19QSU5DVFJMX01US19NVDgxMzVfSAorCisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisjaW5jbHVkZSAicGluY3RybC1tdGstY29tbW9uLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXRrX2Rlc2NfcGluIG10a19waW5zX210ODEzNVtdID0geworCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDAsICJNU0RDMF9EQVQ3IiksCisJCSJEMjEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNDkpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8wIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzBfREFUNyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ0OSIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkkyU09VVF9EQVQiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJEQUNfREFUX09VVCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBDTTFfRE8iKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJTUEkxX01PIiksCisJCU1US19GVU5DVElPTig3LCAiTkFMRSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxLCAiTVNEQzBfREFUNiIpLAorCQkiRDIyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDQ4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMwX0RBVDYiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNDgiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNJTl9XUyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkRBQ19XUyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBDTTFfV1MiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJTUEkxX0NTTiIpLAorCQlNVEtfRlVOQ1RJT04oNywgIk5DTEUiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMiwgIk1TREMwX0RBVDUiKSwKKwkJIkUyMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA0NyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzIiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMF9EQVQ1IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDQ3IiksCisJCU1US19GVU5DVElPTigzLCAiSTJTSU5fQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJEQUNfQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJQQ00xX0NLIiksCisJCU1US19GVU5DVElPTig2LCAiU1BJMV9DTEsiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJOTEQ0IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDMsICJNU0RDMF9EQVQ0IiksCisJCSJGMjEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNDYpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8zIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzBfREFUNCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ0NiIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkFfRlVOQ19DSyIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIkxTQ0UxQl8yWCIpLAorCQlNVEtfRlVOQ1RJT04oNywgIk5MRDUiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNCwgIk1TREMwX0NNRCIpLAorCQkiRjIwIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDQxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMwX0NNRCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ0MSIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkFfRlVOQ19ET1VUWzBdIiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX1RFU1RfSU9bMF0iKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJMUlNUQl8yWCIpLAorCQlNVEtfRlVOQ1RJT04oNywgIk5STkIiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNSwgIk1TREMwX0NMSyIpLAorCQkiRzE4IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDQwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMwX0NMSyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ0MCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkFfRlVOQ19ET1VUWzFdIiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX1RFU1RfSU9bMV0iKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJMUFRFIiksCisJCU1US19GVU5DVElPTig3LCAiTlJFQiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig2LCAiTVNEQzBfREFUMyIpLAorCQkiRzIxIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDQ1KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMwX0RBVDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNDUiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJBX0ZVTkNfRE9VVFsyXSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVTQl9URVNUX0lPWzJdIiksCisJCU1US19GVU5DVElPTig2LCAiTFNDRTBCXzJYIiksCisJCU1US19GVU5DVElPTig3LCAiTkxENyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig3LCAiTVNEQzBfREFUMiIpLAorCQkiRTIxIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDQ0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMwX0RBVDIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNDQiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJBX0ZVTkNfRE9VVFszXSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVTQl9URVNUX0lPWzNdIiksCisJCU1US19GVU5DVElPTig2LCAiTFNBMF8yWCIpLAorCQlNVEtfRlVOQ1RJT04oNywgIk5MRDE0IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDgsICJNU0RDMF9EQVQxIiksCisJCSJFMjMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNDMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU84IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzBfREFUMSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ0MyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVTQl9URVNUX0lPWzRdIiksCisJCU1US19GVU5DVElPTig2LCAiTFNDS18yWCIpLAorCQlNVEtfRlVOQ1RJT04oNywgIk5MRDExIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDksICJNU0RDMF9EQVQwIiksCisJCSJGMjIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNDIpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU85IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzBfREFUMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ0MiIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVTQl9URVNUX0lPWzVdIiksCisJCU1US19GVU5DVElPTig2LCAiTFNEQV8yWCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMCwgIk5DRUIwIiksCisJCSJHMjAiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTM5KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJOQ0VCMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMzkiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQ0IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDExLCAiTkNFQjEiKSwKKwkJIkwxNyIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNDApLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk5DRUIxIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE0MCIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlVTQl9EUlZWQlVTIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEFfT1VUNSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMiwgIk5STkIiKSwKKwkJIkcxOSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNDEpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk5STkIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTQxIiksCisJCU1US19GVU5DVElPTigzLCAiQV9GVU5DX0RPVVRbNF0iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQ2IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEzLCAiTkNMRSIpLAorCQkiSjE4IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE0MiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEzIiksCisJCU1US19GVU5DVElPTigxLCAiTkNMRSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNDIiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJBX0ZVTkNfRE9VVFs1XSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMlBETl8xWCIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIk5BTEUiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQ3IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE0LCAiTkFMRSIpLAorCQkiSjE5IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE0MyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE0IiksCisJCU1US19GVU5DVElPTigxLCAiTkFMRSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJBX0ZVTkNfRE9VVFs2XSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMk1DTEtfMVgiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJJUkRBX1JYRCIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIk5DTEUiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQ4IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE1LCAiTlJFQiIpLAorCQkiTDE4IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE0NCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE1IiksCisJCU1US19GVU5DVElPTigxLCAiTlJFQiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNDQiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJBX0ZVTkNfRE9VVFs3XSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMlJTVF8xWCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIklSREFfVFhEIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEFfT1VUOSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNiwgIk5XRUIiKSwKKwkJIkoyMCIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNDUpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk5XRUIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTQ1IiksCisJCU1US19GVU5DVElPTigzLCAiQV9GVU5DX0RJTlswXSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMlBDTEtfMVgiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJJUkRBX1BETiIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RBX09VVDEwIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE3LCAiTkxEMCIpLAorCQkiSzIxIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE0NiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE3IiksCisJCU1US19GVU5DVElPTigxLCAiTkxEMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNDYiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJBX0ZVTkNfRElOWzFdIiksCisJCU1US19GVU5DVElPTig0LCAiQ00yREFUXzFYWzBdIiksCisJCU1US19GVU5DVElPTig1LCAiSTJTSU5fQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJEQUNfQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQxMSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxOCwgIk5MRDEiKSwKKwkJIksyMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNDcpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xOCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk5MRDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTQ3IiksCisJCU1US19GVU5DVElPTigzLCAiQV9GVU5DX0RJTlsyXSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMkRBVF8xWFsxXSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkkyU0lOX1dTIiksCisJCU1US19GVU5DVElPTig2LCAiREFDX1dTIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEFfT1VUMTIiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTksICJOTEQyIiksCisJCSJKMjEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTQ4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTkiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJOTEQyIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE0OCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkFfRlVOQ19ESU5bM10iKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJDTTJEQVRfMVhbMl0iKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJJMlNPVVRfREFUIiksCisJCU1US19GVU5DVElPTig2LCAiREFDX0RBVF9PVVQiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQxMyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigyMCwgIk5MRDMiKSwKKwkJIkoyMyIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNDkpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8yMCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk5MRDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTQ5IiksCisJCU1US19GVU5DVElPTigzLCAiQV9GVU5DX0RJTls0XSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMkRBVF8xWFszXSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RBX09VVDE0IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDIxLCAiTkxENCIpLAorCQkiSjIyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE1MCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzIxIiksCisJCU1US19GVU5DVElPTigxLCAiTkxENCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJBX0ZVTkNfRElOWzVdIiksCisJCU1US19GVU5DVElPTig0LCAiQ00yREFUXzFYWzRdIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEFfT1VUMTUiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMjIsICJOTEQ1IiksCisJCSJIMjEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTUxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMjIiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJOTEQ1IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE1MSIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkFfRlVOQ19ESU5bNl0iKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJDTTJEQVRfMVhbNV0iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQxNiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigyMywgIk5MRDYiKSwKKwkJIkgyMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNTIpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8yMyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk5MRDYiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTUyIiksCisJCU1US19GVU5DVElPTigzLCAiQV9GVU5DX0RJTls3XSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMkRBVF8xWFs2XSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RBX09VVDE3IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDI0LCAiTkxENyIpLAorCQkiSDIwIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE1MyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzI0IiksCisJCU1US19GVU5DVElPTigxLCAiTkxENyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNTMiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJBX0ZVTkNfRElOWzhdIiksCisJCU1US19GVU5DVElPTig0LCAiQ00yREFUXzFYWzddIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEFfT1VUMTgiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMjUsICJOTEQ4IiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNTQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8yNSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk5MRDgiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTU0IiksCisJCU1US19GVU5DVElPTig0LCAiQ00yREFUXzFYWzhdIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDI2LCAiTkxEOSIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTU1KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMjYiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJOTEQ5IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE1NSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMkRBVF8xWFs5XSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBXTTEiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMjcsICJOTEQxMCIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTU2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMjciKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJOTEQxMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNTYiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJDTTJWU1lOQ18xWCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBXTTIiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMjgsICJOTEQxMSIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTU3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMjgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJOTEQxMSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNTciKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJDTTJIU1lOQ18xWCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBXTTMiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMjksICJOTEQxMiIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTU4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMjkiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJOTEQxMiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNTgiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNJTl9DSyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkRBQ19DSyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBDTTFfQ0siKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMzAsICJOTEQxMyIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTU5KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMzAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJOTEQxMyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNTkiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNJTl9XUyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkRBQ19XUyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBDTTFfV1MiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMzEsICJOTEQxNCIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTYwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMzEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJOTEQxNCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNjAiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNPVVRfREFUIiksCisJCU1US19GVU5DVElPTig0LCAiREFDX0RBVF9PVVQiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJQQ00xX0RPIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDMyLCAiTkxEMTUiKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE2MSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzMyIiksCisJCU1US19GVU5DVElPTigxLCAiTkxEMTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTYxIiksCisJCU1US19GVU5DVElPTigzLCAiRElTUF9QV00iKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV000IiksCisJCU1US19GVU5DVElPTig1LCAiUENNMV9ESSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigzMywgIk1TREMwX1JTVEIiKSwKKwkJIkcyMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA1MCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzMzIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzBfUlNUQiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ1MCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkkyU0lOX0RBVCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBDTTFfREkiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJTUEkxX01JIiksCisJCU1US19GVU5DVElPTig3LCAiTkxEMTAiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMzQsICJJRERJRyIpLAorCQkiTjE3IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDM0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMzQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJJRERJRyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQzNCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigzNSwgIlNDTDMiKSwKKwkJIkwxOSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA5NiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzM1IiksCisJCU1US19GVU5DVElPTigxLCAiU0NMMyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ5NiIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkNMS002IiksCisJCU1US19GVU5DVElPTig0LCAiUFdNNiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigzNiwgIlNEQTMiKSwKKwkJIkwyMCIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA5NyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzM2IiksCisJCU1US19GVU5DVElPTigxLCAiU0RBMyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ5NyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigzNywgIkFVRF9DTEtfTU9TSSIpLAorCQkiTDIxIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDQsIDE5KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMzciKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJBVURfQ0xLIiksCisJCU1US19GVU5DVElPTigyLCAiQURDX0NLIiksCisJCU1US19GVU5DVElPTigzLCAiIEhETUlfU0RBVEEwIiksCisJCU1US19GVU5DVElPTig0LCAiRUlOVDE5IiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX1RFU1RfSU9bNl0iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQxOSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigzOCwgIkFVRF9EQVRfTU9TSSIpLAorCQkiTDIzIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDQsIDIxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMzgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJBVURfREFUX01PU0kiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJBRENfV1MiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJBVURfREFUX01JU08iKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJFSU5UMjEiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfVEVTVF9JT1s3XSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RBX09VVDIwIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDM5LCAiQVVEX0RBVF9NSVNPIiksCisJCSJMMjIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oNCwgMjApLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8zOSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkFVRF9EQVRfTUlTTyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkFEQ19EQVRfSU4iKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJBVURfREFUX01PU0kiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJFSU5UMjAiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfVEVTVF9JT1s4XSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RBX09VVDIxIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDQwLCAiREFDX0NMSyIpLAorCQkiUDIxIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDIyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEQUNfQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMjIiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICIgSERNSV9TREFUQTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfVEVTVF9JT1s5XSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RBX09VVDIyIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDQxLCAiREFDX1dTIiksCisJCSJOMTgiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMjQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU80MSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRBQ19XUyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQyNCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIiBIRE1JX1NEQVRBMiIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVTQl9URVNUX0lPWzEwXSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RBX09VVDIzIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDQyLCAiREFDX0RBVF9PVVQiKSwKKwkJIk4yMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAyMyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzQyIiksCisJCU1US19GVU5DVElPTigxLCAiREFDX0RBVF9PVVQiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMjMiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICIgSERNSV9TREFUQTMiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfVEVTVF9JT1sxMV0iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQyNCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig0MywgIlBXUkFQX1NQSTBfTU8iKSwKKwkJIk0yMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAyOSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzQzIiksCisJCU1US19GVU5DVElPTigxLCAiUFdSQVBfU1BJREkiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMjkiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNDQsICJQV1JBUF9TUEkwX01JIiksCisJCSJQMjMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMjgpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU80NCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlBXUkFQX1NQSURPIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDI4IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDQ1LCAiUFdSQVBfU1BJMF9DU04iKSwKKwkJIk0yMSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAyNyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzQ1IiksCisJCU1US19GVU5DVElPTigxLCAiUFdSQVBfU1BJQ1NfQl9JIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDI3IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDQ2LCAiUFdSQVBfU1BJMF9DTEsiKSwKKwkJIlAyMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAyNiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzQ2IiksCisJCU1US19GVU5DVElPTigxLCAiUFdSQVBfU1BJQ0tfSSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQyNiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig0NywgIlBXUkFQX0VWRU5UIiksCisJCSJNMjMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMjUpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU80NyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlBXUkFQX0VWRU5UX0lOIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDI1IiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEFfT1VUMiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig0OCwgIlJUQzMyS19DSyIpLAorCQkiTjIwIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKE5PX0VJTlRfU1VQUE9SVCwgTk9fRUlOVF9TVVBQT1JUKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNDgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJSVEMzMktfQ0siKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNDksICJXQVRDSERPRyIpLAorCQkiUjIyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDM2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNDkiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJXQVRDSERPRyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQzNiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig1MCwgIlNSQ0xLRU5BIiksCisJCSJUMjIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMzgpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU81MCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlNSQ0xLRU5BIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDM4IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDUxLCAiU1JDVk9MVEVOIiksCisJCSJUMjMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMzcpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU81MSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlNSQ1ZPTFRFTiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQzNyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig1MiwgIkVJTlQwIiksCisJCSJUMjEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMSwgMCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzUyIiksCisJCU1US19GVU5DVElPTigxLCAiRUlOVDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJQV00xIiksCisJCU1US19GVU5DVElPTigzLCAiQ0xLTTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICIgU1BESUZfT1VUIiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX1RFU1RfSU9bMTJdIiksCisJCU1US19GVU5DVElPTig3LCAiVVNCX1NDTCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig1MywgIlVSWEQyIiksCisJCSJSMTgiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgODMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU81MyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlVSWEQyIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDgzIiksCisJCU1US19GVU5DVElPTig0LCAiIEhETUlfTFJDSyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkNMS00zIiksCisJCU1US19GVU5DVElPTig3LCAiVVRYRDIiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNTQsICJVVFhEMiIpLAorCQkiUjE3IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDgyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNTQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJVVFhEMiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ4MiIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIiBIRE1JX0JDS19PVVQiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJDTEtNMiIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlVSWEQyIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDU1LCAiVUNUUzIiKSwKKwkJIlIyMCIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA4NCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzU1IiksCisJCU1US19GVU5DVElPTigxLCAiVUNUUzIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UODQiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJQV00xIiksCisJCU1US19GVU5DVElPTig3LCAiVVJUUzIiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNTYsICJVUlRTMiIpLAorCQkiUjE5IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDg1KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNTYiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJVUlRTMiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ4NSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBXTTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJVQ1RTMiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig1NywgIkpUQ0siKSwKKwkJIlYxNyIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxODgpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU81NyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkpUQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTg4IiksCisJCU1US19GVU5DVElPTigzLCAiRFNQMV9JQ0siKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNTgsICJKVERPIiksCisJCSJUMTYiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTkwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNTgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJKVERPIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE5MCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkRTUDJfSU1TIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDU5LCAiSlRSU1RfQiIpLAorCQkiVDE5IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDApLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU81OSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkpUUlNUX0IiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkRTUDJfSUNLIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDYwLCAiSlRESSIpLAorCQkiVDE4IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE4OSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzYwIiksCisJCU1US19GVU5DVElPTigxLCAiSlRESSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxODkiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJEU1AxX0lNUyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig2MSwgIkpSVENLIiksCisJCSJUMjAiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTg3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNjEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJKUlRDSyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxODciKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJEU1AxX0lEIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDYyLCAiSlRNUyIpLAorCQkiVDE3IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE5MSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzYyIiksCisJCU1US19GVU5DVElPTigxLCAiSlRNUyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxOTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJEU1AyX0lEIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDYzLCAiTVNEQzFfSU5TSSIpLAorCQkiVjE4IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDEsIDE1KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNjMiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMV9JTlNJIiksCisJCU1US19GVU5DVElPTigzLCAiU0NMNSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlBXTTYiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJDTEtNNSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RCX09VVDYiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNjQsICJNU0RDMV9TRFdQSSIpLAorCQkiVzE4IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDU4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNjQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMV9TRFdQSSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ1OCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlNEQTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV003IiksCisJCU1US19GVU5DVElPTig1LCAiQ0xLTTYiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQl9PVVQ3IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDY1LCAiTVNEQzJfSU5TSSIpLAorCQkiVTIyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDEsIDE0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNjUiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMl9JTlNJIiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX1RFU1RfSU9bMjddIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEFfT1VUMyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig2NiwgIk1TREMyX1NEV1BJIiksCisJCSJVMjEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNjYpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU82NiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMyX1NEV1BJIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDY2IiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX1RFU1RfSU9bMjhdIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDY3LCAiVVJYRDQiKSwKKwkJIlYyMyIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA4OSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzY3IiksCisJCU1US19GVU5DVElPTigxLCAiVVJYRDQiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UODkiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJVUlhEMSIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlVUWEQ0IiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEJfT1VUMTAiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNjgsICJVVFhENCIpLAorCQkiVjIyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDg4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNjgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJVVFhENCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ4OCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlVUWEQxIiksCisJCU1US19GVU5DVElPTig2LCAiVVJYRDQiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQl9PVVQxMSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig2OSwgIlVSWEQxIiksCisJCSJXMjIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNzkpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU82OSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlVSWEQxIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDc5IiksCisJCU1US19GVU5DVElPTigzLCAiVVJYRDQiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJVVFhEMSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RCX09VVDI0IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDcwLCAiVVRYRDEiKSwKKwkJIlYyMSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA3OCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzcwIiksCisJCU1US19GVU5DVElPTigxLCAiVVRYRDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNzgiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJVVFhENCIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlVSWEQxIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEJfT1VUMjUiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNzEsICJVQ1RTMSIpLAorCQkiVjE5IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDgwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNzEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJVQ1RTMSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ4MCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkNMS00wIiksCisJCU1US19GVU5DVElPTig2LCAiVVJUUzEiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQl9PVVQzMSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig3MiwgIlVSVFMxIiksCisJCSJWMjAiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgODEpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU83MiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlVSVFMxIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDgxIiksCisJCU1US19GVU5DVElPTig1LCAiQ0xLTTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJVQ1RTMSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RCX09VVDIxIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDczLCAiUFdNMSIpLAorCQkiVzE3IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDczKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNzMiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJQV00xIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDczIiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX0RSVlZCVVMiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJESVNQX1BXTSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RCX09VVDgiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNzQsICJQV00yIiksCisJCSJZMTciLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNzQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU83NCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlBXTTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNzQiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJEUEkzM19DSyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlBXTTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVUlhEMiIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIkRJU1BfUFdNIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEJfT1VUOSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig3NSwgIlBXTTMiKSwKKwkJIlkxOSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA3NSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzc1IiksCisJCU1US19GVU5DVElPTigxLCAiUFdNMyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ3NSIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkRQSTMzX0QwIiksCisJCU1US19GVU5DVElPTig0LCAiUFdNNiIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVUWEQyIiksCisJCU1US19GVU5DVElPTig2LCAiRElTUF9QV00iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQl9PVVQxMiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig3NiwgIlBXTTQiKSwKKwkJIlcxOSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA3NiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzc2IiksCisJCU1US19GVU5DVElPTigxLCAiUFdNNCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ3NiIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkRQSTMzX0QxIiksCisJCU1US19GVU5DVElPTig0LCAiUFdNNyIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIkRJU1BfUFdNIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEJfT1VUMTMiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNzcsICJNU0RDMl9EQVQyIiksCisJCSJXMjEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNjMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU83NyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMyX0RBVDIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNjMiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJEU1AyX0lNUyIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIkRQSTMzX0Q2IiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEFfT1VUMjUiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNzgsICJNU0RDMl9EQVQzIiksCisJCSJBQTIzIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDY0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNzgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMl9EQVQzIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDY0IiksCisJCU1US19GVU5DVElPTig0LCAiRFNQMl9JRCIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIkRQSTMzX0Q3IiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEFfT1VUMjYiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNzksICJNU0RDMl9DTUQiKSwKKwkJIlkyMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA2MCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzc5IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzJfQ01EIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDYwIiksCisJCU1US19GVU5DVElPTig0LCAiRFNQMV9JTVMiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJQQ00xX1dTIiksCisJCU1US19GVU5DVElPTig2LCAiRFBJMzNfRDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQwIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDgwLCAiTVNEQzJfQ0xLIiksCisJCSJBQTIyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDU5KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPODAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMl9DTEsiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNTkiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJEU1AxX0lDSyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBDTTFfQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJEUEkzM19EMiIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RBX09VVDEiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oODEsICJNU0RDMl9EQVQxIiksCisJCSJZMjEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNjIpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU84MSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMyX0RBVDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNjIiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJEU1AyX0lDSyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBDTTFfRE8iKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJEUEkzM19ENSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig4MiwgIk1TREMyX0RBVDAiKSwKKwkJIkFCMjIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNjEpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU84MiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMyX0RBVDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNjEiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJEU1AxX0lEIiksCisJCU1US19GVU5DVElPTig1LCAiUENNMV9ESSIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIkRQSTMzX0Q0IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDgzLCAiTVNEQzFfREFUMCIpLAorCQkiQUMxOSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA1MyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzgzIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzFfREFUMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ1MyIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlNDTDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV00yIiksCisJCU1US19GVU5DVElPTig1LCAiQ0xLTTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQl9PVVQyIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDg0LCAiTVNEQzFfREFUMSIpLAorCQkiQUExOSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA1NCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzg0IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzFfREFUMSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ1NCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlNEQTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV00zIiksCisJCU1US19GVU5DVElPTig1LCAiQ0xLTTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQl9PVVQzIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDg1LCAiTVNEQzFfQ01EIiksCisJCSJBQTIwIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDUyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPODUiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMV9DTUQiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJTREEwIiksCisJCU1US19GVU5DVElPTig0LCAiUFdNMSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkNMS00wIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEJfT1VUMSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig4NiwgIk1TREMxX0NMSyIpLAorCQkiQUIxOSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA1MSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzg2IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzFfQ0xLIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDUxIiksCisJCU1US19GVU5DVElPTigzLCAiU0NMMCIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkRJU1BfUFdNIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEJfT1VUMCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig4NywgIk1TREMxX0RBVDIiKSwKKwkJIkFBMjEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNTUpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU84NyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMxX0RBVDIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJTQ0w0IiksCisJCU1US19GVU5DVElPTig0LCAiUFdNNCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkNMS00zIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEJfT1VUNCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig4OCwgIk1TREMxX0RBVDMiKSwKKwkJIkFCMjAiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNTYpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU84OCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMxX0RBVDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNTYiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJTREE0IiksCisJCU1US19GVU5DVElPTig0LCAiUFdNNSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkNMS000IiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEJfT1VUNSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig4OSwgIk1TREM0X0RBVDAiKSwKKwkJIkFCOCIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMzMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU84OSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREM0X0RBVDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTMzIiksCisJCU1US19GVU5DVElPTig0LCAiRVhUX0ZSQU1FX1NZTkMiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfRFJWVkJVUyIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIkFfRlVOQ19ESU5bOV0iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJMUFRFIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDkwLCAiTVNEQzRfREFUMSIpLAorCQkiQUI3IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEzNCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzkwIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzRfREFUMSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMzQiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJBX0ZVTkNfRElOWzEwXSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkxSU1RCXzFYIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDkxLCAiTVNEQzRfREFUNSIpLAorCQkiQUE4IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEzNiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzkxIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzRfREFUNSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMzYiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNJTl9XUyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkRBQ19XUyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBDTTFfV1MiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJBX0ZVTkNfRElOWzExXSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlNQSTFfQ1NOIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDkyLCAiTVNEQzRfREFUNiIpLAorCQkiQUM0IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEzNyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzkyIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzRfREFUNiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMzciKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNPVVRfREFUIiksCisJCU1US19GVU5DVElPTig0LCAiREFDX0RBVF9PVVQiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJQQ00xX0RPIiksCisJCU1US19GVU5DVElPTig2LCAiQV9GVU5DX0RJTlsxMl0iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJTUEkxX01PIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDkzLCAiTVNEQzRfREFUNyIpLAorCQkiQUM2IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEzOCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzkzIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzRfREFUNyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMzgiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNJTl9EQVQiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJQQ00xX0RJIiksCisJCU1US19GVU5DVElPTig2LCAiQV9GVU5DX0RJTlsxM10iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJTUEkxX01JIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDk0LCAiTVNEQzRfREFUNCIpLAorCQkiQUE3IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEzNSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzk0IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzRfREFUNCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMzUiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNJTl9DSyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkRBQ19DSyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBDTTFfQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJBX0ZVTkNfRElOWzE0XSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlNQSTFfQ0xLIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDk1LCAiTVNEQzRfREFUMiIpLAorCQkiQUI2IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEzMSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzk1IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzRfREFUMiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMzEiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNJTl9XUyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMlBETl8yWCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkRBQ19XUyIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlBDTTFfV1MiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJMU0NFMEJfMVgiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oOTYsICJNU0RDNF9DTEsiKSwKKwkJIkFCNSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMjkpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU85NiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREM0X0NMSyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMjkiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJEUEkxX0NLXzJYIiksCisJCU1US19GVU5DVElPTig0LCAiQ00yUENMS18yWCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBXTTQiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJQQ00xX0RJIiksCisJCU1US19GVU5DVElPTig3LCAiTFNDS18xWCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig5NywgIk1TREM0X0RBVDMiKSwKKwkJIlk4IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEzMiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzk3IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzRfREFUMyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMzIiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNPVVRfREFUIiksCisJCU1US19GVU5DVElPTig0LCAiQ00yUlNUXzJYIiksCisJCU1US19GVU5DVElPTig1LCAiREFDX0RBVF9PVVQiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJQQ00xX0RPIiksCisJCU1US19GVU5DVElPTig3LCAiTFNDRTFCXzFYIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDk4LCAiTVNEQzRfQ01EIiksCisJCSJBQzMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTI4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPOTgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDNF9DTUQiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTI4IiksCisJCU1US19GVU5DVElPTigzLCAiRFBJMV9ERV8yWCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBXTTMiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJMU0RBXzFYIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDk5LCAiTVNEQzRfUlNUQiIpLAorCQkiQUI0IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEzMCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzk5IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzRfUlNUQiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMzAiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNJTl9DSyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMk1DTEtfMlgiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJEQUNfQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJQQ00xX0NLIiksCisJCU1US19GVU5DVElPTig3LCAiTFNBMF8xWCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMDAsICJTREEwIiksCisJCSJXOSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA5MSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEwMCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlNEQTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UOTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJDTEtNMSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlBXTTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJBX0ZVTkNfRElOWzE1XSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMDEsICJTQ0wwIiksCisJCSJXMTEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgOTApLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTQ0wwIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDkwIiksCisJCU1US19GVU5DVElPTigzLCAiQ0xLTTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJESVNQX1BXTSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkFfRlVOQ19ESU5bMTZdIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEwMiwgIkVJTlQxMF9BVVhJTjIiKSwKKwkJIkFBMyIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigxLCAxMCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEwMiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkVJTlQxMCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVTQl9URVNUX0lPWzE2XSIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlRFU1RCX09VVDE2IiksCisJCU1US19GVU5DVElPTig3LCAiQV9GVU5DX0RJTlsxN10iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTAzLCAiRUlOVDExX0FVWElOMyIpLAorCQkiQUIyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDEsIDExKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTAzIiksCisJCU1US19GVU5DVElPTigxLCAiRUlOVDExIiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX1RFU1RfSU9bMTddIiksCisJCU1US19GVU5DVElPTig2LCAiVEVTVEJfT1VUMTciKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJBX0ZVTkNfRElOWzE4XSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMDQsICJFSU5UMTZfQVVYSU40IiksCisJCSJBQjMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMSwgMTYpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMDQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJFSU5UMTYiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfVEVTVF9JT1sxOF0iKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJURVNUQl9PVVQxOCIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkFfRlVOQ19ESU5bMTldIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEwNSwgIkkyU19DTEsiKSwKKwkJIlc2IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTA1IiksCisJCU1US19GVU5DVElPTigxLCAiSTJTSU5fQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJEQUNfQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQQ00xX0NLIiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX1RFU1RfSU9bMTldIiksCisJCU1US19GVU5DVElPTig2LCAiVEVTVEJfT1VUMTkiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJBX0ZVTkNfRElOWzIwXSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMDYsICJJMlNfV1MiKSwKKwkJIkFBNiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTihOT19FSU5UX1NVUFBPUlQsIE5PX0VJTlRfU1VQUE9SVCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEwNiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkkyU0lOX1dTIiksCisJCU1US19GVU5DVElPTigzLCAiREFDX1dTIiksCisJCU1US19GVU5DVElPTig0LCAiUENNMV9XUyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVTQl9URVNUX0lPWzIwXSIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlRFU1RCX09VVDIwIiksCisJCU1US19GVU5DVElPTig3LCAiQV9GVU5DX0RJTlsyMV0iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTA3LCAiSTJTX0RBVEFfSU4iKSwKKwkJIkFBNSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEwNyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkkyU0lOX0RBVCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlBDTTFfREkiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfVEVTVF9JT1syMV0iKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJURVNUQl9PVVQyMiIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkFfRlVOQ19ESU5bMjJdIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEwOCwgIkkyU19EQVRBX09VVCIpLAorCQkiQUE0IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKE5PX0VJTlRfU1VQUE9SVCwgTk9fRUlOVF9TVVBQT1JUKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTA4IiksCisJCU1US19GVU5DVElPTigxLCAiSTJTT1VUX0RBVCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkRBQ19EQVRfT1VUIiksCisJCU1US19GVU5DVElPTig0LCAiUENNMV9ETyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVTQl9URVNUX0lPWzIyXSIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlRFU1RCX09VVDIzIiksCisJCU1US19GVU5DVElPTig3LCAiQV9GVU5DX0RJTlsyM10iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTA5LCAiRUlOVDUiKSwKKwkJIlc1IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDEsIDUpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMDkiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJFSU5UNSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIlBXTTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJDTEtNMyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkdQVV9KVFJTVEIiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfVEVTVF9JT1syM10iKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJURVNUQl9PVVQyNiIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkFfRlVOQ19ESU5bMjRdIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDExMCwgIkVJTlQ2IiksCisJCSJWNSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigxLCA2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTEwIiksCisJCU1US19GVU5DVElPTigxLCAiRUlOVDYiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJQV002IiksCisJCU1US19GVU5DVElPTigzLCAiQ0xLTTQiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJHUFVfSlRNUyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVTQl9URVNUX0lPWzI0XSIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlRFU1RCX09VVDI3IiksCisJCU1US19GVU5DVElPTig3LCAiQV9GVU5DX0RJTlsyNV0iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTExLCAiRUlOVDciKSwKKwkJIlczIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDEsIDcpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJFSU5UNyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIlBXTTciKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJDTEtNNSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkdQVV9KVERPIiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX1RFU1RfSU9bMjVdIiksCisJCU1US19GVU5DVElPTig2LCAiVEVTVEJfT1VUMjgiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJBX0ZVTkNfRElOWzI2XSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMTIsICJFSU5UOCIpLAorCQkiVjYiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMSwgOCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzExMiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkVJTlQ4IiksCisJCU1US19GVU5DVElPTigyLCAiRElTUF9QV00iKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJDTEtNNiIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkdQVV9KVERJIiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX1RFU1RfSU9bMjZdIiksCisJCU1US19GVU5DVElPTig2LCAiVEVTVEJfT1VUMjkiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJFWFRfRlJBTUVfU1lOQyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMTMsICJFSU5UOSIpLAorCQkiVzgiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMSwgOSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzExMyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkVJTlQ5IiksCisJCU1US19GVU5DVElPTig0LCAiR1BVX0pUQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfRFJWVkJVUyIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlRFU1RCX09VVDMwIiksCisJCU1US19GVU5DVElPTig3LCAiQV9GVU5DX0RJTlsyN10iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTE0LCAiTFBDRTFCIiksCisJCSJXNCIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMjcpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMTQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJMUENFMUIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTI3IiksCisJCU1US19GVU5DVElPTig1LCAiUFdNMiIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlRFU1RCX09VVDE0IiksCisJCU1US19GVU5DVElPTig3LCAiQV9GVU5DX0RJTlsyOF0iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTE1LCAiTFBDRTBCIiksCisJCSJUNSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMjYpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJMUENFMEIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTI2IiksCisJCU1US19GVU5DVElPTig1LCAiUFdNMSIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlRFU1RCX09VVDE1IiksCisJCU1US19GVU5DVElPTig3LCAiQV9GVU5DX0RJTlsyOV0iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTE2LCAiRElTUF9QV00iKSwKKwkJIlY0IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDc3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTE2IiksCisJCU1US19GVU5DVElPTigxLCAiRElTUF9QV00iKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNzciKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJMU0RJIiksCisJCU1US19GVU5DVElPTig0LCAiUFdNMSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBXTTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJQV00zIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDExNywgIkVJTlQxIiksCisJCSJUNiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigxLCAxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTE3IiksCisJCU1US19GVU5DVElPTigxLCAiRUlOVDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJQV00yIiksCisJCU1US19GVU5DVElPTigzLCAiQ0xLTTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfVEVTVF9JT1sxM10iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJVU0JfU0RBIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDExOCwgIkVJTlQyIiksCisJCSJUNCIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigxLCAyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTE4IiksCisJCU1US19GVU5DVElPTigxLCAiRUlOVDIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJQV00zIiksCisJCU1US19GVU5DVElPTigzLCAiQ0xLTTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfVEVTVF9JT1sxNF0iKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJTUkNMS0VOQUkyIiksCisJCU1US19GVU5DVElPTig3LCAiQV9GVU5DX0RJTlszMF0iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTE5LCAiRUlOVDMiKSwKKwkJIlI0IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDEsIDMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMTkiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJFSU5UMyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVTQl9URVNUX0lPWzE1XSIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlNSQ0xLRU5BSTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJFWFRfMjZNX0NLIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEyMCwgIkVJTlQ0IiksCisJCSJSNSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigxLCA0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTIwIiksCisJCU1US19GVU5DVElPTigxLCAiRUlOVDQiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJQV000IiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX0RSVlZCVVMiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJBX0ZVTkNfRElOWzMxXSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMjEsICJEUElERSIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTAwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTIxIiksCisJCU1US19GVU5DVElPTigxLCAiRFBJMF9ERSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNPVVRfREFUIiksCisJCU1US19GVU5DVElPTig0LCAiREFDX0RBVF9PVVQiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJQQ00xX0RPIiksCisJCU1US19GVU5DVElPTig2LCAiSVJEQV9UWEQiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTIyLCAiRFBJQ0siKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEwMSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEyMiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRQSTBfQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTAxIiksCisJCU1US19GVU5DVElPTigzLCAiSTJTSU5fREFUIiksCisJCU1US19GVU5DVElPTig1LCAiUENNMV9ESSIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIklSREFfUEROIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEyMywgIkRQSUc0IiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMTQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMjMiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEUEkwX0c0IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDExNCIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMkRBVF8yWFswXSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkRTUDJfSUQiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTI0LCAiRFBJRzUiKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDExNSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEyNCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRQSTBfRzUiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTE1IiksCisJCU1US19GVU5DVElPTig0LCAiQ00yREFUXzJYWzFdIiksCisJCU1US19GVU5DVElPTig1LCAiRFNQMl9JQ0siKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTI1LCAiRFBJUjMiKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEyMSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEyNSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRQSTBfUjMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTIxIiksCisJCU1US19GVU5DVElPTig0LCAiQ00yREFUXzJYWzddIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEyNiwgIkRQSUcxIiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMTEpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMjYiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEUEkwX0cxIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDExMSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkRTUDFfSUNLIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEyNywgIkRQSVZTWU5DIiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA5OCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEyNyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRQSTBfVlNZTkMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UOTgiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNJTl9DSyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkRBQ19DSyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBDTTFfQ0siKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTI4LCAiRFBJSFNZTkMiKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDk5KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTI4IiksCisJCU1US19GVU5DVElPTigxLCAiRFBJMF9IU1lOQyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ5OSIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkkyU0lOX1dTIiksCisJCU1US19GVU5DVElPTig0LCAiREFDX1dTIiksCisJCU1US19GVU5DVElPTig1LCAiUENNMV9XUyIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIklSREFfUlhEIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEyOSwgIkRQSUIwIiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMDIpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMjkiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEUEkwX0IwIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDEwMiIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlNDTDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJESVNQX1BXTSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMzAsICJEUElCMSIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTAzKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTMwIiksCisJCU1US19GVU5DVElPTigxLCAiRFBJMF9CMSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJDTEtNMCIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlNEQTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJQV00xIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEzMSwgIkRQSUIyIiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMDQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMzEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEUEkwX0IyIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDEwNCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkNMS00xIiksCisJCU1US19GVU5DVElPTig0LCAiU0NMMSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBXTTIiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTMyLCAiRFBJQjMiKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEwNSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEzMiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRQSTBfQjMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTA1IiksCisJCU1US19GVU5DVElPTigzLCAiQ0xLTTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJTREExIiksCisJCU1US19GVU5DVElPTig1LCAiUFdNMyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMzMsICJEUElCNCIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTA2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTMzIiksCisJCU1US19GVU5DVElPTigxLCAiRFBJMF9CNCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMDYiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJDTEtNMyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlNDTDIiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJQV000IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEzNCwgIkRQSUI1IiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMDcpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMzQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEUEkwX0I1IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDEwNyIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkNMS000IiksCisJCU1US19GVU5DVElPTig0LCAiU0RBMiIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBXTTUiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTM1LCAiRFBJQjYiKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEwOCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEzNSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRQSTBfQjYiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTA4IiksCisJCU1US19GVU5DVElPTigzLCAiQ0xLTTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJTQ0wzIiksCisJCU1US19GVU5DVElPTig1LCAiUFdNNiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMzYsICJEUElCNyIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTA5KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTM2IiksCisJCU1US19GVU5DVElPTigxLCAiRFBJMF9CNyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMDkiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJDTEtNNiIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlNEQTMiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJQV003IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEzNywgIkRQSUcwIiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMTApLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMzciKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEUEkwX0cwIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDExMCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkRTUDFfSUQiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTM4LCAiRFBJRzIiKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDExMiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEzOCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRQSTBfRzIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTEyIiksCisJCU1US19GVU5DVElPTig1LCAiRFNQMV9JTVMiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTM5LCAiRFBJRzMiKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDExMyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEzOSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRQSTBfRzMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTEzIiksCisJCU1US19GVU5DVElPTig1LCAiRFNQMl9JTVMiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTQwLCAiRFBJRzYiKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDExNiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE0MCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRQSTBfRzYiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTE2IiksCisJCU1US19GVU5DVElPTig0LCAiQ00yREFUXzJYWzJdIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE0MSwgIkRQSUc3IiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMTcpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEUEkwX0c3IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDExNyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMkRBVF8yWFszXSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNDIsICJEUElSMCIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTE4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTQyIiksCisJCU1US19GVU5DVElPTigxLCAiRFBJMF9SMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMTgiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJDTTJEQVRfMlhbNF0iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTQzLCAiRFBJUjEiKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDExOSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE0MyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRQSTBfUjEiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTE5IiksCisJCU1US19GVU5DVElPTig0LCAiQ00yREFUXzJYWzVdIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE0NCwgIkRQSVIyIiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMjApLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNDQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEUEkwX1IyIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDEyMCIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMkRBVF8yWFs2XSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNDUsICJEUElSNCIpLAorCQlOVUxMLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTIyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTQ1IiksCisJCU1US19GVU5DVElPTigxLCAiRFBJMF9SNCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxMjIiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJDTTJEQVRfMlhbOF0iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTQ2LCAiRFBJUjUiKSwKKwkJTlVMTCwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDEyMyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE0NiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkRQSTBfUjUiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTIzIiksCisJCU1US19GVU5DVElPTig0LCAiQ00yREFUXzJYWzldIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE0NywgIkRQSVI2IiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMjQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNDciKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEUEkwX1I2IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDEyNCIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMlZTWU5DXzJYIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE0OCwgIkRQSVI3IiksCisJCU5VTEwsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxMjUpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNDgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEUEkwX1I3IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDEyNSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNNMkhTWU5DXzJYIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE0OSwgIlRETjMvTFZEUyhURE4zKSIpLAorCQkiQUEyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDM2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTQ5IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDM2IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE1MCwgIlREUDMvTFZEUyhURFAzKSIpLAorCQkiQUExIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDM1KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTUwIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDM1IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE1MSwgIlRETjIvTFZEUyhUQ04pIiksCisJCSJZMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNjkpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTY5IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE1MiwgIlREUDIvTFZEUyhUQ1ApIiksCisJCSJZMSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNjgpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTY4IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE1MywgIlRDTi9MVkRTKFRETjIpIiksCisJCSJXMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNjMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNTMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTYzIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE1NCwgIlRDUC9MVkRTKFREUDIpIiksCisJCSJXMSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNjIpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNTQiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTYyIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE1NSwgIlRETjEvTFZEUyhURE4xKSIpLAorCQkiVjMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTY3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTU1IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE2NyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNTYsICJURFAxL0xWRFMoVERQMSkiKSwKKwkJIlYyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE2NiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE1NiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNjYiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTU3LCAiVEROMC9MVkRTKFRETjApIiksCisJCSJVMyIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNjUpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNTciKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTY1IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE1OCwgIlREUDAvTFZEUyhURFAwKSIpLAorCQkiVTIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTY0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTU4IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE2NCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNTksICJSRE4zIiksCisJCSJONSIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxOCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE1OSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxOCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNjAsICJSRFAzIiksCisJCSJONCIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAzMCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE2MCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQzMCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNjEsICJSRE4yIiksCisJCSJUMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAzMSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE2MSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQzMSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNjIsICJSRFAyIiksCisJCSJUMyIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAzMiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE2MiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQzMiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNjMsICJSQ04iKSwKKwkJIlAyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDMzKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTYzIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDMzIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE2NCwgIlJDUCIpLAorCQkiUDMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMzkpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNjQiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMzkiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTY1LCAiUkROMSIpLAorCQkiUjMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oTk9fRUlOVF9TVVBQT1JULCBOT19FSU5UX1NVUFBPUlQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNjUiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTY2LCAiUkRQMSIpLAorCQkiUjIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oTk9fRUlOVF9TVVBQT1JULCBOT19FSU5UX1NVUFBPUlQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNjYiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTY3LCAiUkROMCIpLAorCQkiTjMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oTk9fRUlOVF9TVVBQT1JULCBOT19FSU5UX1NVUFBPUlQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNjciKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTY4LCAiUkRQMCIpLAorCQkiTjIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oTk9fRUlOVF9TVVBQT1JULCBOT19FSU5UX1NVUFBPUlQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNjgiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTY5LCAiUkROMV9BIiksCisJCSJNNCIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNzUpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNjkiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJDTURBVDYiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTc1IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE3MCwgIlJEUDFfQSIpLAorCQkiTTMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTc0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTcwIiksCisJCU1US19GVU5DVElPTigxLCAiQ01EQVQ3IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE3NCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNzEsICJSQ05fQSIpLAorCQkiTDMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTcxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTcxIiksCisJCU1US19GVU5DVElPTigxLCAiQ01EQVQ4IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE3MSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNzIsICJSQ1BfQSIpLAorCQkiTDIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTcwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTcyIiksCisJCU1US19GVU5DVElPTigxLCAiQ01EQVQ5IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE3MCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNzMsICJSRE4wX0EiKSwKKwkJIk0yIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE3MyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE3MyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkNNSFNZTkMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTczIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE3NCwgIlJEUDBfQSIpLAorCQkiTTEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTcyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTc0IiksCisJCU1US19GVU5DVElPTigxLCAiQ01WU1lOQyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNzIiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTc1LCAiUkROMV9CIiksCisJCSJIMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxODEpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNzUiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJDTURBVDIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTgxIiksCisJCU1US19GVU5DVElPTigzLCAiQ01DU0QyIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE3NiwgIlJEUDFfQiIpLAorCQkiSDEiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTgwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTc2IiksCisJCU1US19GVU5DVElPTigxLCAiQ01EQVQzIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE4MCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkNNQ1NEMyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNzcsICJSQ05fQiIpLAorCQkiSzMiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTc3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTc3IiksCisJCU1US19GVU5DVElPTigxLCAiQ01EQVQ0IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE3NyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNzgsICJSQ1BfQiIpLAorCQkiSzIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTc2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTc4IiksCisJCU1US19GVU5DVElPTigxLCAiQ01EQVQ1IiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE3NiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNzksICJSRE4wX0IiKSwKKwkJIkozIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE3OSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE3OSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkNNREFUMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxNzkiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJDTUNTRDAiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTgwLCAiUkRQMF9CIiksCisJCSJKMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCAxNzgpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xODAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJDTURBVDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTc4IiksCisJCU1US19GVU5DVElPTigzLCAiQ01DU0QxIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE4MSwgIkNNUENMSyIpLAorCQkiSzQiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTgyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTgxIiksCisJCU1US19GVU5DVElPTigxLCAiQ01QQ0xLIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE4MiIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkNNQ1NLIiksCisJCU1US19GVU5DVElPTig0LCAiQ00yTUNMS180WCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlRTX0FVWEFEQ19TRUxbM10iKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJWRU5DX1RFU1RfQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQyNyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxODIsICJDTU1DTEsiKSwKKwkJIko1IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE4MyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE4MiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkNNTUNMSyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQxODMiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJUU19BVVhBRENfU0VMWzJdIiksCisJCU1US19GVU5DVElPTig3LCAiVEVTVEFfT1VUMjgiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTgzLCAiQ01SU1QiKSwKKwkJIko2IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE4NSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE4MyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkNNUlNUIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE4NSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlRTX0FVWEFEQ19TRUxbMV0iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQzMCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxODQsICJDTVBETiIpLAorCQkiSjQiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTg0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTg0IiksCisJCU1US19GVU5DVElPTigxLCAiQ01QRE4iKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTg0IiksCisJCU1US19GVU5DVElPTig1LCAiVFNfQVVYQURDX1NFTFswXSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlRFU1RBX09VVDI5IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE4NSwgIkNNRkxBU0giKSwKKwkJIkc0IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE4NiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE4NSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkNNRkxBU0giKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTg2IiksCisJCU1US19GVU5DVElPTigzLCAiQ00yTUNMS18zWCIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIk1GR19URVNUX0NLXzEiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJURVNUQV9PVVQzMSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxODYsICJNUkdfSTJTX1BDTV9DTEsiKSwKKwkJIkY1IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKE5PX0VJTlRfU1VQUE9SVCwgTk9fRUlOVF9TVVBQT1JUKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTg2IiksCisJCU1US19GVU5DVElPTigxLCAiTVJHX0kyU19QQ01fQ0xLIiksCisJCU1US19GVU5DVElPTigzLCAiSTJTSU5fQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQQ00wX0NLIiksCisJCU1US19GVU5DVElPTig1LCAiRFNQMl9JQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJJTUdfVEVTVF9DSyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlVTQl9TQ0wiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTg3LCAiTVJHX0kyU19QQ01fU1lOQyIpLAorCQkiRzYiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgMTYpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xODciKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNUkdfSTJTX1BDTV9TWU5DIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDE2IiksCisJCU1US19GVU5DVElPTigzLCAiSTJTSU5fV1MiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQQ00wX1dTIiksCisJCU1US19GVU5DVElPTig2LCAiRElTUF9URVNUX0NLIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE4OCwgIk1SR19JMlNfUENNX1JYIiksCisJCSJHMyIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTihOT19FSU5UX1NVUFBPUlQsIE5PX0VJTlRfU1VQUE9SVCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE4OCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1SR19JMlNfUENNX1JYIiksCisJCU1US19GVU5DVElPTigzLCAiSTJTSU5fREFUIiksCisJCU1US19GVU5DVElPTig0LCAiUENNMF9ESSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkRTUDJfSUQiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJNRkdfVEVTVF9DSyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIlVTQl9TREEiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTg5LCAiTVJHX0kyU19QQ01fVFgiKSwKKwkJIkc1IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDE3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTg5IiksCisJCU1US19GVU5DVElPTigxLCAiTVJHX0kyU19QQ01fVFgiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UMTciKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlNPVVRfREFUIiksCisJCU1US19GVU5DVElPTig0LCAiUENNMF9ETyIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlZERUNfVEVTVF9DSyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxOTAsICJTUkNMS0VOQUkiKSwKKwkJIks1IiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKE5PX0VJTlRfU1VQUE9SVCwgTk9fRUlOVF9TVVBQT1JUKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTkwIiksCisJCU1US19GVU5DVElPTigxLCAiU1JDTEtFTkFJIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE5MSwgIlVSWEQzIiksCisJCSJDMyIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA4NyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE5MSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlVSWEQzIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDg3IiksCisJCU1US19GVU5DVElPTigzLCAiVVRYRDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJUU19BVVhfU1QiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJQV000IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE5MiwgIlVUWEQzIiksCisJCSJCMiIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA4NiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE5MiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlVUWEQzIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDg2IiksCisJCU1US19GVU5DVElPTigzLCAiVVJYRDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJUU19BVVhfQ1NfQiIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlBXTTMiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTkzLCAiU0RBMiIpLAorCQkiRzIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgOTUpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xOTMiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTREEyIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDk1IiksCisJCU1US19GVU5DVElPTigzLCAiQ0xLTTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV001IiksCisJCU1US19GVU5DVElPTig1LCAiVFNfQVVYX1BXREIiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTk0LCAiU0NMMiIpLAorCQkiRjQiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgOTQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xOTQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTQ0wyIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDk0IiksCisJCU1US19GVU5DVElPTigzLCAiQ0xLTTQiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV000IiksCisJCU1US19GVU5DVElPTig1LCAiVFNfQVVYQURDX1RFU1RfQ0siKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTk1LCAiU0RBMSIpLAorCQkiRjIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgOTMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xOTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTREExIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDkzIiksCisJCU1US19GVU5DVElPTigzLCAiQ0xLTTMiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV00zIiksCisJCU1US19GVU5DVElPTig1LCAiVFNfQVVYX1NDTEtfUFdEQiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxOTYsICJTQ0wxIiksCisJCSJGMyIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA5MiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE5NiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlNDTDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UOTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJDTEtNMiIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlBXTTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJUU19BVVhfRElOIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE5NywgIk1TREMzX0RBVDIiKSwKKwkJIkUxIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDcxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTk3IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzNfREFUMiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ3MSIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlNDTDYiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV001IiksCisJCU1US19GVU5DVElPTig1LCAiQ0xLTTQiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJNRkdfVEVTVF9DS18yIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE5OCwgIk1TREMzX0RBVDMiKSwKKwkJIkMyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDcyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTk4IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzNfREFUMyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ3MiIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlNEQTYiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV002IiksCisJCU1US19GVU5DVElPTig1LCAiQ0xLTTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJNRkdfVEVTVF9DS18zIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE5OSwgIk1TREMzX0NNRCIpLAorCQkiRDIiLCAibXQ4MTM1IiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMiwgNjgpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xOTkiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDM19DTUQiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNjgiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJTREEyIiksCisJCU1US19GVU5DVElPTig0LCAiUFdNMiIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkNMS00xIiksCisJCU1US19GVU5DVElPTig2LCAiTUZHX1RFU1RfQ0tfNCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigyMDAsICJNU0RDM19DTEsiKSwKKwkJIkUyIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDY3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMjAwIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzNfQ0xLIiksCisJCU1US19GVU5DVElPTigyLCAiRUlOVDY3IiksCisJCU1US19GVU5DVElPTigzLCAiU0NMMiIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlBXTTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJDTEtNMCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigyMDEsICJNU0RDM19EQVQxIiksCisJCSJEMyIsICJtdDgxMzUiLAorCQlNVEtfRUlOVF9GVU5DVElPTigyLCA3MCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzIwMSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMzX0RBVDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJFSU5UNzAiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJTREEzIiksCisJCU1US19GVU5DVElPTig0LCAiUFdNNCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkNMS00zIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDIwMiwgIk1TREMzX0RBVDAiKSwKKwkJIkUzIiwgIm10ODEzNSIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDIsIDY5KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMjAyIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzNfREFUMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkVJTlQ2OSIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlNDTDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV00zIiksCisJCU1US19GVU5DVElPTig1LCAiQ0xLTTIiKQorCSksCit9OworCisjZW5kaWYgLyogX19QSU5DVFJMX01US19NVDgxMzVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL3BpbmN0cmwtbXRrLW10ODE3My5oIGIvZHJpdmVycy9waW5jdHJsL21lZGlhdGVrL3BpbmN0cmwtbXRrLW10ODE3My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZTViNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvbWVkaWF0ZWsvcGluY3RybC1tdGstbXQ4MTczLmgKQEAgLTAsMCArMSwxMjI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IE1lZGlhVGVrIEluYy4KKyAqIEF1dGhvcjogSG9uZ3pob3UuWWFuZyA8aG9uZ3pob3UueWFuZ0BtZWRpYXRlay5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19QSU5DVFJMX01US19NVDgxNzNfSAorI2RlZmluZSBfX1BJTkNUUkxfTVRLX01UODE3M19ICisKKyNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KKyNpbmNsdWRlICJwaW5jdHJsLW10ay1jb21tb24uaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBtdGtfZGVzY19waW4gbXRrX3BpbnNfbXQ4MTczW10gPSB7CisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMCwgIkVJTlQwIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIklSREFfUEROIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMV9XUyIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkFVRF9TUERJRiIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlVUWEQwIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9BXzIwXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxLCAiRUlOVDEiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDEpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xIiksCisJCU1US19GVU5DVElPTigxLCAiSVJEQV9SWEQiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJMlMxX0JDSyIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlNEQTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJVUlhEMCIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV8yMV8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMiwgIkVJTlQyIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIklSREFfVFhEIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMV9NQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJTQ0w1IiksCisJCU1US19GVU5DVElPTig0LCAiVVRYRDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0FfMjJfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDMsICJFSU5UMyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzMiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJEU0kxX1RFIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMV9ET18xIiksCisJCU1US19GVU5DVElPTigzLCAiU0RBMyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlVSWEQzIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9BXzIzXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig0LCAiRUlOVDQiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU80IiksCisJCU1US19GVU5DVElPTigxLCAiRElTUF9QV00xIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMV9ET18yIiksCisJCU1US19GVU5DVElPTigzLCAiU0NMMyIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlVDVFMzIiksCisJCU1US19GVU5DVElPTig2LCAiU0ZXUF9CIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDUsICJFSU5UNSIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgNSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzUiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJQQ00xX0NMSyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkkyUzJfV1MiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJTUElfQ0tfM18iKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJVUlRTMyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkFQX01EMzJfSlRBR19UTVMiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJTRk9VVCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig2LCAiRUlOVDYiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDYpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU82IiksCisJCU1US19GVU5DVElPTigxLCAiUENNMV9TWU5DIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMl9CQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJTUElfTUlfM18iKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJBUF9NRDMyX0pUQUdfVENLIiksCisJCU1US19GVU5DVElPTig2LCAiU0ZDUzAiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNywgIkVJTlQ3IiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlBDTTFfREkiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJMlMyX0RJXzEiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJTUElfTU9fM18iKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJBUF9NRDMyX0pUQUdfVERJIiksCisJCU1US19GVU5DVElPTig2LCAiU0ZIT0xEIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDgsICJFSU5UOCIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgOCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJQQ00xX0RPIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMl9ESV8yIiksCisJCU1US19GVU5DVElPTigzLCAiU1BJX0NTXzNfIiksCisJCU1US19GVU5DVElPTig0LCAiQVVEX1NQRElGIiksCisJCU1US19GVU5DVElPTig1LCAiQVBfTUQzMl9KVEFHX1RETyIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlNGSU4iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oOSwgIkVJTlQ5IiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA5KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPOSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlVTQl9EUlZWQlVTX1AwIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMl9NQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJVU0JfRFJWVkJVU19QMSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkFQX01EMzJfSlRBR19UUlNUIiksCisJCU1US19GVU5DVElPTig2LCAiU0ZDSyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMCwgIkVJTlQxMCIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTApLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkNMS00wIiksCisJCU1US19GVU5DVElPTigyLCAiRFNJMV9URSIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkRJU1BfUFdNMSIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlBXTTQiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJJUkRBX1JYRCIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMSwgIkVJTlQxMSIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTEpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkNMS00xIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTM19XUyIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlVTQl9EUlZWQlVTX1AwIiksCisJCU1US19GVU5DVElPTig0LCAiUFdNNSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIklSREFfVFhEIiksCisJCU1US19GVU5DVElPTig2LCAiVVNCX0RSVlZCVVNfUDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0JfMzBfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEyLCAiRUlOVDEyIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEyIiksCisJCU1US19GVU5DVElPTigxLCAiQ0xLTTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJMlMzX0JDSyIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlNSQ0xLRU5BMCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkkyUzJfV1MiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0JfMzJfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEzLCAiRUlOVDEzIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEzIiksCisJCU1US19GVU5DVElPTigxLCAiQ0xLTTMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJMlMzX01DSyIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlNSQ0xLRU5BMCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkkyUzJfQkNLIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9BXzMyXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNCwgIkVJTlQxNCIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xNCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkNNREFUMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkNNQ1NEMCIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNMS00yIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzZfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDE1LCAiRUlOVDE1IiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxNSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE1IiksCisJCU1US19GVU5DVElPTigxLCAiQ01EQVQxIiksCisJCU1US19GVU5DVElPTigyLCAiQ01DU0QxIiksCisJCU1US19GVU5DVElPTigzLCAiQ01GTEFTSCIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIkNMS00zIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzI5XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNiwgIklERElHIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxNiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE2IiksCisJCU1US19GVU5DVElPTigxLCAiSURESUciKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJDTUZMQVNIIiksCisJCU1US19GVU5DVElPTig0LCAiUFdNNSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxNywgIldBVENIRE9HIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxNyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE3IiksCisJCU1US19GVU5DVElPTigxLCAiV0FUQ0hET0dfQU8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTgsICJDRUMiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDE4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJDRUMiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTksICJIRE1JU0NLIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxOSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzE5IiksCisJCU1US19GVU5DVElPTigxLCAiSERNSVNDSyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkhEQ1BfU0NMIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDIwLCAiSERNSVNEIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAyMCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzIwIiksCisJCU1US19GVU5DVElPTigxLCAiSERNSVNEIiksCisJCU1US19GVU5DVElPTigyLCAiSERDUF9TREEiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMjEsICJIVFBMRyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMjEpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8yMSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkhUUExHIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDIyLCAiTVNEQzNfREFUMCIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMjIpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8yMiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMzX0RBVDAiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMjMsICJNU0RDM19EQVQxIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAyMyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzIzIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzNfREFUMSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigyNCwgIk1TREMzX0RBVDIiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDI0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMjQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDM19EQVQyIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDI1LCAiTVNEQzNfREFUMyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMjUpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8yNSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMzX0RBVDMiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMjYsICJNU0RDM19DTEsiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDI2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMjYiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDM19DTEsiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMjcsICJNU0RDM19DTUQiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDI3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMjciKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDM19DTUQiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMjgsICJNU0RDM19EU0wiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDI4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMjgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDM19EU0wiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMjksICJVQ1RTMiIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMjkpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8yOSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlVDVFMyIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDMwLCAiVVJUUzIiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDMwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMzAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJVUlRTMiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigzMSwgIlVSWEQyIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAzMSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzMxIiksCisJCU1US19GVU5DVElPTigxLCAiVVJYRDIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJVVFhEMiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigzMiwgIlVUWEQyIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAzMiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzMyIiksCisJCU1US19GVU5DVElPTigxLCAiVVRYRDIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJVUlhEMiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigzMywgIkRBSUNMSyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMzMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8zMyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIiBNUkdfQ0xLIiksCisJCU1US19GVU5DVElPTigyLCAiUENNMF9DTEsiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMzQsICJEQUlQQ01JTiIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMzQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8zNCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIiBNUkdfREkiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJQQ00wX0RJIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDM1LCAiREFJUENNT1VUIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAzNSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzM1IiksCisJCU1US19GVU5DVElPTigxLCAiIE1SR19ETyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIlBDTTBfRE8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMzYsICJEQUlTWU5DIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAzNiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzM2IiksCisJCU1US19GVU5DVElPTigxLCAiIE1SR19TWU5DIiksCisJCU1US19GVU5DVElPTigyLCAiUENNMF9TWU5DIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDM3LCAiRUlOVDE2IiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAzNyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzM3IiksCisJCU1US19GVU5DVElPTigxLCAiVVNCX0RSVlZCVVNfUDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJVU0JfRFJWVkJVU19QMSIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlBXTTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV00xIiksCisJCU1US19GVU5DVElPTig1LCAiUFdNMiIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIkNMS00wIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDM4LCAiQ09OTl9SU1QiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDM4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMzgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJVU0JfRFJWVkJVU19QMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIlVTQl9EUlZWQlVTX1AxIiksCisJCU1US19GVU5DVElPTig2LCAiQ0xLTTEiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMzksICJDTTJNQ0xLIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAzOSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzM5IiksCisJCU1US19GVU5DVElPTigxLCAiQ00yTUNMSyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkNNQ1NEMCIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV8xN18iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNDAsICJDTVBDTEsiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDQwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJDTVBDTEsiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJDTUNTSyIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkNNQ1NEMiIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV8xOF8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNDEsICJDTU1DTEsiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDQxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJDTU1DTEsiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0FfMTlfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDQyLCAiRFNJX1RFIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA0MiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzQyIiksCisJCU1US19GVU5DVElPTigxLCAiRFNJX1RFIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDQzLCAiU0RBMiIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgNDMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU80MyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlNEQTIiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNDQsICJTQ0wyIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA0NCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzQ0IiksCisJCU1US19GVU5DVElPTigxLCAiU0NMMiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig0NSwgIlNEQTAiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDQ1KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNDUiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTREEwIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDQ2LCAiU0NMMCIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgNDYpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU80NiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlNDTDAiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNDcsICJSRE4wX0EiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDQ3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNDciKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJDTURBVDIiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNDgsICJSRFAwX0EiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDQ4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNDgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJDTURBVDMiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNDksICJSRE4xX0EiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDQ5KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNDkiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJDTURBVDQiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNTAsICJSRFAxX0EiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDUwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJDTURBVDUiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNTEsICJSQ05fQSIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgNTEpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU81MSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkNNREFUNiIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig1MiwgIlJDUF9BIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA1MiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzUyIiksCisJCU1US19GVU5DVElPTigxLCAiQ01EQVQ3IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDUzLCAiUkROMl9BIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA1MyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzUzIiksCisJCU1US19GVU5DVElPTigxLCAiQ01EQVQ4IiksCisJCU1US19GVU5DVElPTigyLCAiQ01DU0QzIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDU0LCAiUkRQMl9BIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA1NCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzU0IiksCisJCU1US19GVU5DVElPTigxLCAiQ01EQVQ5IiksCisJCU1US19GVU5DVElPTigyLCAiQ01DU0QyIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDU1LCAiUkROM19BIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA1NSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzU1IiksCisJCU1US19GVU5DVElPTigxLCAiQ01IU1lOQyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkNNQ1NEMSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig1NiwgIlJEUDNfQSIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgNTYpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU81NiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkNNVlNZTkMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJDTUNTRDAiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNTcsICJNU0RDMF9EQVQwIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA1NyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzU3IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzBfREFUMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkkyUzFfV1MiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0JfN18iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNTgsICJNU0RDMF9EQVQxIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA1OCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzU4IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzBfREFUMSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkkyUzFfQkNLIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzhfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDU5LCAiTVNEQzBfREFUMiIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgNTkpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU81OSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMwX0RBVDIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJMlMxX01DSyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQl85XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig2MCwgIk1TREMwX0RBVDMiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDYwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNjAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMF9EQVQzIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMV9ET18xIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzEwXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig2MSwgIk1TREMwX0RBVDQiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDYxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNjEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMF9EQVQ0IiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMV9ET18yIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzExXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig2MiwgIk1TREMwX0RBVDUiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDYyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNjIiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMF9EQVQ1IiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMl9XUyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQl8xMl8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNjMsICJNU0RDMF9EQVQ2IiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA2MyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzYzIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzBfREFUNiIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkkyUzJfQkNLIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzEzXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig2NCwgIk1TREMwX0RBVDciKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDY0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNjQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMF9EQVQ3IiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMl9ESV8xIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzE0XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig2NSwgIk1TREMwX0NMSyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgNjUpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU82NSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMwX0NMSyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQl8xNl8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNjYsICJNU0RDMF9DTUQiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDY2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNjYiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMF9DTUQiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJMlMyX0RJXzIiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0JfMTVfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDY3LCAiTVNEQzBfRFNMIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA2NyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzY3IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzBfRFNMIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzE3XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig2OCwgIk1TREMwX1JTVF8iKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDY4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNjgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMF9SU1RCIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMl9NQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0JfMThfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDY5LCAiU1BJX0NLIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA2OSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzY5IiksCisJCU1US19GVU5DVElPTigxLCAiU1BJX0NLXzBfIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTM19ET18xIiksCisJCU1US19GVU5DVElPTigzLCAiUFdNMCIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlBXTTUiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJJMlMyX01DSyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQl8xOV8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNzAsICJTUElfTUkiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDcwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNzAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTUElfTUlfMF8iKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJMlMzX0RPXzIiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJQV00xIiksCisJCU1US19GVU5DVElPTig0LCAiU1BJX01PXzBfIiksCisJCU1US19GVU5DVElPTig1LCAiSTJTMl9ESV8xIiksCisJCU1US19GVU5DVElPTig2LCAiRFNJMV9URSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQl8yMF8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNzEsICJTUElfTU8iKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDcxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNzEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTUElfTU9fMF8iKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJMlMzX0RPXzMiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJQV00yIiksCisJCU1US19GVU5DVElPTig0LCAiU1BJX01JXzBfIiksCisJCU1US19GVU5DVElPTig1LCAiSTJTMl9ESV8yIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzIxXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig3MiwgIlNQSV9DUyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgNzIpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU83MiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlNQSV9DU18wXyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkkyUzNfRE9fNCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlBXTTMiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJQV002IiksCisJCU1US19GVU5DVElPTig1LCAiRElTUF9QV00xIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzIyXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig3MywgIk1TREMxX0RBVDAiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDczKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNzMiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMV9EQVQwIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzI0XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig3NCwgIk1TREMxX0RBVDEiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDc0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNzQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMV9EQVQxIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzI1XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig3NSwgIk1TREMxX0RBVDIiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDc1KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNzUiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMV9EQVQyIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzI2XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig3NiwgIk1TREMxX0RBVDMiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDc2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNzYiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMV9EQVQzIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzI3XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig3NywgIk1TREMxX0NMSyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgNzcpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU83NyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMxX0NMSyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQl8yOF8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oNzgsICJNU0RDMV9DTUQiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDc4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPNzgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMV9DTUQiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0JfMjNfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDc5LCAiUFdSQVBfU1BJMF9NSSIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgNzkpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU83OSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlBXUkFQX1NQSU1JIiksCisJCU1US19GVU5DVElPTigyLCAiUFdSQVBfU1BJTU8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oODAsICJQV1JBUF9TUEkwX01PIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA4MCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzgwIiksCisJCU1US19GVU5DVElPTigxLCAiUFdSQVBfU1BJTU8iKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJQV1JBUF9TUElNSSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig4MSwgIlBXUkFQX1NQSTBfQ0siKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDgxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPODEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJQV1JBUF9TUElDSyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig4MiwgIlBXUkFQX1NQSTBfQ1NOIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA4MiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzgyIiksCisJCU1US19GVU5DVElPTigxLCAiUFdSQVBfU1BJQ1MiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oODMsICJBVURfQ0xLX01PU0kiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDgzKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPODMiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJBVURfQ0xLX01PU0kiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oODQsICJBVURfREFUX01JU08iKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDg0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPODQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJBVURfREFUX01JU08iKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJBVURfREFUX01PU0kiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oODUsICJBVURfREFUX01PU0kiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDg1KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPODUiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJBVURfREFUX01PU0kiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJBVURfREFUX01JU08iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oODYsICJSVEMzMktfQ0siKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDg2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPODYiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJSVEMzMktfQ0siKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oODcsICJESVNQX1BXTTAiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDg3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPODciKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJESVNQX1BXTTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJESVNQX1BXTTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0JfMzFfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDg4LCAiU1JDTEtFTkFJIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA4OCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzg4IiksCisJCU1US19GVU5DVElPTigxLCAiU1JDTEtFTkFJIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDg5LCAiU1JDTEtFTkFJMiIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgODkpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU84OSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlNSQ0xLRU5BSTIiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oOTAsICJTUkNMS0VOQTAiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDkwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPOTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTUkNMS0VOQTAiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oOTEsICJTUkNMS0VOQTEiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDkxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPOTEiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTUkNMS0VOQTEiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oOTIsICJQQ01fQ0xLIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA5MiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzkyIiksCisJCU1US19GVU5DVElPTigxLCAiUENNMV9DTEsiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJMlMwX0JDSyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV8yNF8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oOTMsICJQQ01fU1lOQyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgOTMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU85MyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlBDTTFfU1lOQyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkkyUzBfV1MiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0FfMjVfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDk0LCAiUENNX1JYIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA5NCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzk0IiksCisJCU1US19GVU5DVElPTigxLCAiUENNMV9ESSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkkyUzBfREkiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0FfMjZfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDk1LCAiUENNX1RYIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA5NSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzk1IiksCisJCU1US19GVU5DVElPTigxLCAiUENNMV9ETyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkkyUzBfRE8iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0FfMjdfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDk2LCAiVVJYRDEiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDk2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPOTYiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJVUlhEMSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIlVUWEQxIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9BXzI4XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTig5NywgIlVUWEQxIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCA5NyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzk3IiksCisJCU1US19GVU5DVElPTigxLCAiVVRYRDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJVUlhEMSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV8yOV8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oOTgsICJVUlRTMSIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgOTgpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU85OCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlVSVFMxIiksCisJCU1US19GVU5DVElPTigyLCAiVUNUUzEiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0FfMzBfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDk5LCAiVUNUUzEiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDk5KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPOTkiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJVQ1RTMSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIlVSVFMxIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9BXzMxXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMDAsICJNU0RDMl9EQVQwIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMDApLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMl9EQVQwIiksCisJCU1US19GVU5DVElPTigzLCAiVVNCX0RSVlZCVVNfUDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJTREE1IiksCisJCU1US19GVU5DVElPTig1LCAiVVNCX0RSVlZCVVNfUDEiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0JfMF8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTAxLCAiTVNEQzJfREFUMSIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTAxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTAxIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzJfREFUMSIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkFVRF9TUERJRiIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlNDTDUiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0JfMV8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTAyLCAiTVNEQzJfREFUMiIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTAyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTAyIiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzJfREFUMiIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlVUWEQwIiksCisJCU1US19GVU5DVElPTig1LCAiUFdNMCIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlNQSV9DS18xXyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQl8yXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMDMsICJNU0RDMl9EQVQzIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMDMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJNU0RDMl9EQVQzIiksCisJCU1US19GVU5DVElPTigzLCAiVVJYRDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJQV00xIiksCisJCU1US19GVU5DVElPTig2LCAiU1BJX01JXzFfIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9CXzNfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEwNCwgIk1TREMyX0NMSyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTA0KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTA0IiksCisJCU1US19GVU5DVElPTigxLCAiTVNEQzJfQ0xLIiksCisJCU1US19GVU5DVElPTigzLCAiVVRYRDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDQsICJTREEzIiksCisJCU1US19GVU5DVElPTig1LCAiUFdNMiIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIlNQSV9NT18xXyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQl80XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMDUsICJNU0RDMl9DTUQiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDEwNSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEwNSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIk1TREMyX0NNRCIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlVSWEQzIiksCisJCU1US19GVU5DVElPTig0LCAiU0NMMyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlBXTTMiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJTUElfQ1NfMV8iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0JfNV8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTA2LCAiU0RBMyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTA2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTA2IiksCisJCU1US19GVU5DVElPTigxLCAiU0RBMyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMDcsICJTQ0wzIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMDcpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMDciKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTQ0wzIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEwOCwgIkpUTVMiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDEwOCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEwOCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkpUTVMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICIgTUZHX0pUQUdfVE1TIiksCisJCU1US19GVU5DVElPTig1LCAiQVBfTUQzMl9KVEFHX1RNUyIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIkRGRF9UTVMiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTA5LCAiSlRDSyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTA5KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTA5IiksCisJCU1US19GVU5DVElPTigxLCAiSlRDSyIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIiBNRkdfSlRBR19UQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJBUF9NRDMyX0pUQUdfVENLIiksCisJCU1US19GVU5DVElPTig2LCAiREZEX1RDSyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMTAsICJKVERJIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMTApLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMTAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJKVERJIiksCisJCU1US19GVU5DVElPTigyLCAiIE1GR19KVEFHX1RESSIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIkFQX01EMzJfSlRBR19UREkiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJERkRfVERJIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDExMSwgIkpURE8iKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDExMSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzExMSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkpURE8iKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJNRkdfSlRBR19URE8iKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJBUF9NRDMyX0pUQUdfVERPIiksCisJCU1US19GVU5DVElPTig2LCAiREZEX1RETyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMTIsICJKVFJTVF9CIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMTIpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMTIiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJKVFJTVF9CIiksCisJCU1US19GVU5DVElPTigyLCAiIE1GR19KVEFHX1RSU1ROIiksCisJCU1US19GVU5DVElPTig1LCAiQVBfTUQzMl9KVEFHX1RSU1QiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJERkRfTlRSU1QiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTEzLCAiVVJYRDAiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDExMyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzExMyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlVSWEQwIiksCisJCU1US19GVU5DVElPTigyLCAiVVRYRDAiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJJMlMyX1dTIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9BXzBfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDExNCwgIlVUWEQwIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMTQpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMTQiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJVVFhEMCIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIlVSWEQwIiksCisJCU1US19GVU5DVElPTig2LCAiSTJTMl9CQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0FfMV8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTE1LCAiVVJUUzAiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDExNSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzExNSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlVSVFMwIiksCisJCU1US19GVU5DVElPTigyLCAiVUNUUzAiKSwKKwkJTVRLX0ZVTkNUSU9OKDYsICJJMlMyX01DSyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV8yXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMTYsICJVQ1RTMCIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTE2KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTE2IiksCisJCU1US19GVU5DVElPTigxLCAiVUNUUzAiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJVUlRTMCIpLAorCQlNVEtfRlVOQ1RJT04oNiwgIkkyUzJfRElfMSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV8zXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMTcsICJVUlhEMyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTE3KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTE3IiksCisJCU1US19GVU5DVElPTigxLCAiVVJYRDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJVVFhEMyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV85XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMTgsICJVVFhEMyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTE4KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTE4IiksCisJCU1US19GVU5DVElPTigxLCAiVVRYRDMiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJVUlhEMyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV8xMF8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTE5LCAiS1BST1cwIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMTkpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMTkiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJLUk9XMCIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV8xMV8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTIwLCAiS1BST1cxIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMjApLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMjAiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJLUk9XMSIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlBXTTYiKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0FfMTJfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEyMSwgIktQUk9XMiIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTIxKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTIxIiksCisJCU1US19GVU5DVElPTigxLCAiS1JPVzIiKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJUkRBX1BETiIpLAorCQlNVEtfRlVOQ1RJT04oMywgIlVTQl9EUlZWQlVTX1AwIiksCisJCU1US19GVU5DVElPTig0LCAiUFdNNCIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlVTQl9EUlZWQlVTX1AxIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9BXzEzXyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMjIsICJLUENPTDAiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDEyMiksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEyMiIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIktDT0wwIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9BXzE0XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMjMsICJLUENPTDEiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDEyMyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEyMyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIktDT0wxIiksCisJCU1US19GVU5DVElPTigyLCAiSVJEQV9SWEQiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJQV001IiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9BXzE1XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMjQsICJLUENPTDIiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDEyNCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEyNCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIktDT0wyIiksCisJCU1US19GVU5DVElPTigyLCAiSVJEQV9UWEQiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJVU0JfRFJWVkJVU19QMCIpLAorCQlNVEtfRlVOQ1RJT04oNCwgIlBXTTMiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJVU0JfRFJWVkJVU19QMSIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV8xNl8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTI1LCAiU0RBMSIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTI1KSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTI1IiksCisJCU1US19GVU5DVElPTigxLCAiU0RBMSIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMjYsICJTQ0wxIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMjYpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMjYiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTQ0wxIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEyNywgIkxDTV9SU1QiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDEyNyksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEyNyIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkxDTV9SU1QiKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTI4LCAiSTJTMF9MUkNLIiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMjgpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMjgiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJJMlMwX1dTIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMV9XUyIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkkyUzJfV1MiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJTUElfQ0tfMl8iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0FfNF8iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTI5LCAiSTJTMF9CQ0siKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDEyOSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEyOSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkkyUzBfQkNLIiksCisJCU1US19GVU5DVElPTigyLCAiSTJTMV9CQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlMyX0JDSyIpLAorCQlNVEtfRlVOQ1RJT04oNSwgIlNQSV9NSV8yXyIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV81XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMzAsICJJMlMwX01DSyIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTMwKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTMwIiksCisJCU1US19GVU5DVElPTigxLCAiSTJTMF9NQ0siKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJMlMxX01DSyIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkkyUzJfTUNLIiksCisJCU1US19GVU5DVElPTig1LCAiU1BJX01PXzJfIiksCisJCU1US19GVU5DVElPTig3LCAiREJHX01PTl9BXzZfIikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEzMSwgIkkyUzBfREFUQTAiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDEzMSksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEzMSIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIkkyUzBfRE8iKSwKKwkJTVRLX0ZVTkNUSU9OKDIsICJJMlMxX0RPXzEiKSwKKwkJTVRLX0ZVTkNUSU9OKDMsICJJMlMyX0RJXzEiKSwKKwkJTVRLX0ZVTkNUSU9OKDUsICJTUElfQ1NfMl8iKSwKKwkJTVRLX0ZVTkNUSU9OKDcsICJEQkdfTU9OX0FfN18iKQorCSksCisJTVRLX1BJTigKKwkJUElOQ1RSTF9QSU4oMTMyLCAiSTJTMF9EQVRBMSIpLAorCQlOVUxMLCAibXQ4MTczIiwKKwkJTVRLX0VJTlRfRlVOQ1RJT04oMCwgMTMyKSwKKwkJTVRLX0ZVTkNUSU9OKDAsICJHUElPMTMyIiksCisJCU1US19GVU5DVElPTigxLCAiSTJTMF9ESSIpLAorCQlNVEtfRlVOQ1RJT04oMiwgIkkyUzFfRE9fMiIpLAorCQlNVEtfRlVOQ1RJT04oMywgIkkyUzJfRElfMiIpLAorCQlNVEtfRlVOQ1RJT04oNywgIkRCR19NT05fQV84XyIpCisJKSwKKwlNVEtfUElOKAorCQlQSU5DVFJMX1BJTigxMzMsICJTREE0IiksCisJCU5VTEwsICJtdDgxNzMiLAorCQlNVEtfRUlOVF9GVU5DVElPTigwLCAxMzMpLAorCQlNVEtfRlVOQ1RJT04oMCwgIkdQSU8xMzMiKSwKKwkJTVRLX0ZVTkNUSU9OKDEsICJTREE0IikKKwkpLAorCU1US19QSU4oCisJCVBJTkNUUkxfUElOKDEzNCwgIlNDTDQiKSwKKwkJTlVMTCwgIm10ODE3MyIsCisJCU1US19FSU5UX0ZVTkNUSU9OKDAsIDEzNCksCisJCU1US19GVU5DVElPTigwLCAiR1BJTzEzNCIpLAorCQlNVEtfRlVOQ1RJT04oMSwgIlNDTDQiKQorCSksCit9OworCisjZW5kaWYgLyogX19QSU5DVFJMX01US19NVDgxNzNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL21lc29uL01ha2VmaWxlIGIvZHJpdmVycy9waW5jdHJsL21lc29uL01ha2VmaWxlCmluZGV4IGVhZmMyMTYuLmM3NTFkMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vTWFrZWZpbGUKQEAgLTEsMiArMSwyIEBACi1vYmoteQkrPSBwaW5jdHJsLW1lc29uOC5vCitvYmoteQkrPSBwaW5jdHJsLW1lc29uOC5vIHBpbmN0cmwtbWVzb244Yi5vCiBvYmoteQkrPSBwaW5jdHJsLW1lc29uLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmMgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi5jCmluZGV4IGEyYmY0OWMuLmVkY2QxNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24uYwpAQCAtMTMsOCArMTMsOSBAQAogCiAvKgogICogVGhlIGF2YWlsYWJsZSBwaW5zIGFyZSBvcmdhbml6ZWQgaW4gYmFua3MgKEEsQixDLEQsRSxYLFksWixBTywKLSAqIEJPT1QsQ0FSRCBmb3IgbWVzb242IGFuZCBYLFksRFYsSCxaLEFPLEJPT1QsQ0FSRCBmb3IgbWVzb244KSBhbmQKLSAqIGVhY2ggYmFuayBoYXMgYSB2YXJpYWJsZSBudW1iZXIgb2YgcGlucy4KKyAqIEJPT1QsQ0FSRCBmb3IgbWVzb242LCBYLFksRFYsSCxaLEFPLEJPT1QsQ0FSRCBmb3IgbWVzb244IGFuZAorICogWCxZLERWLEgsQU8sQk9PVCxDQVJELERJRiBmb3IgbWVzb244YikgYW5kIGVhY2ggYmFuayBoYXMgYQorICogdmFyaWFibGUgbnVtYmVyIG9mIHBpbnMuCiAgKgogICogVGhlIEFPIGJhbmsgaXMgc3BlY2lhbCBiZWNhdXNlIGl0IGJlbG9uZ3MgdG8gdGhlIEFsd2F5cy1PbiBwb3dlcgogICogZG9tYWluIHdoaWNoIGNhbid0IGJlIHBvd2VyZWQgb2ZmOyB0aGUgYmFuayBhbHNvIHVzZXMgYSBzZXQgb2YKQEAgLTU0NCw2ICs1NDUsMTAgQEAKIAkJLmNvbXBhdGlibGUgPSAiYW1sb2dpYyxtZXNvbjgtcGluY3RybCIsCiAJCS5kYXRhID0gJm1lc29uOF9waW5jdHJsX2RhdGEsCiAJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gImFtbG9naWMsbWVzb244Yi1waW5jdHJsIiwKKwkJLmRhdGEgPSAmbWVzb244Yl9waW5jdHJsX2RhdGEsCisJfSwKIAl7IH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbWVzb25fcGluY3RybF9kdF9tYXRjaCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi5oIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb24uaAppbmRleCBiZmVhOGFkLi4wZmU3ZDUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbi5oCisrKyBiL2RyaXZlcnMvcGluY3RybC9tZXNvbi9waW5jdHJsLW1lc29uLmgKQEAgLTE1NSw2ICsxNTUsOCBAQAogCXN0cnVjdCBtZXNvbl9kb21haW4gKmRvbWFpbnM7CiB9OwogCisjZGVmaW5lIFBJTih4LCBiKQkoYiArIHgpCisKICNkZWZpbmUgR1JPVVAoZ3JwLCByLCBiKQkJCQkJCVwKIAl7CQkJCQkJCQlcCiAJCS5uYW1lID0gI2dycCwJCQkJCQlcCkBAIC0xNjUsMTAgKzE2NywxMCBAQAogCQkuZG9tYWluID0gMCwJCQkJCQlcCiAJIH0KIAotI2RlZmluZSBHUElPX0dST1VQKGdwaW8pCQkJCQkJXAorI2RlZmluZSBHUElPX0dST1VQKGdwaW8sIGIpCQkJCQkJXAogCXsJCQkJCQkJCVwKIAkJLm5hbWUgPSAjZ3BpbywJCQkJCQlcCi0JCS5waW5zID0gKGNvbnN0IHVuc2lnbmVkIGludFtdKXsgUElOXyAjIyBncGlvfSwJCVwKKwkJLnBpbnMgPSAoY29uc3QgdW5zaWduZWQgaW50W10peyBQSU4oZ3BpbywgYikgfSwJCVwKIAkJLm51bV9waW5zID0gMSwJCQkJCQlcCiAJCS5pc19ncGlvID0gdHJ1ZSwJCQkJCVwKIAkgfQpAQCAtMjA0LDYgKzIwNiw3IEBACiAJCX0sCQkJCQkJCVwKIAkgfQogCi0jZGVmaW5lIE1FU09OX1BJTih4KSBQSU5DVFJMX1BJTihQSU5fICMjIHgsICN4KQorI2RlZmluZSBNRVNPTl9QSU4oeCwgYikgUElOQ1RSTF9QSU4oUElOKHgsIGIpLCAjeCkKIAogZXh0ZXJuIHN0cnVjdCBtZXNvbl9waW5jdHJsX2RhdGEgbWVzb244X3BpbmN0cmxfZGF0YTsKK2V4dGVybiBzdHJ1Y3QgbWVzb25fcGluY3RybF9kYXRhIG1lc29uOGJfcGluY3RybF9kYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244LmMgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbjguYwppbmRleCBmOGFhM2EyLi43YjFjYzkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbjguYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbjguYwpAQCAtMTQsNjIwICsxNCw0ODIgQEAKICNpbmNsdWRlIDxkdC1iaW5kaW5ncy9ncGlvL21lc29uOC1ncGlvLmg+CiAjaW5jbHVkZSAicGluY3RybC1tZXNvbi5oIgogCi0jZGVmaW5lIEFPX09GRlNFVAkxMjAKLQotI2RlZmluZSBQSU5fR1BJT1hfMAlHUElPWF8wCi0jZGVmaW5lIFBJTl9HUElPWF8xCUdQSU9YXzEKLSNkZWZpbmUgUElOX0dQSU9YXzIJR1BJT1hfMgotI2RlZmluZSBQSU5fR1BJT1hfMwlHUElPWF8zCi0jZGVmaW5lIFBJTl9HUElPWF80CUdQSU9YXzQKLSNkZWZpbmUgUElOX0dQSU9YXzUJR1BJT1hfNQotI2RlZmluZSBQSU5fR1BJT1hfNglHUElPWF82Ci0jZGVmaW5lIFBJTl9HUElPWF83CUdQSU9YXzcKLSNkZWZpbmUgUElOX0dQSU9YXzgJR1BJT1hfOAotI2RlZmluZSBQSU5fR1BJT1hfOQlHUElPWF85Ci0jZGVmaW5lIFBJTl9HUElPWF8xMAlHUElPWF8xMAotI2RlZmluZSBQSU5fR1BJT1hfMTEJR1BJT1hfMTEKLSNkZWZpbmUgUElOX0dQSU9YXzEyCUdQSU9YXzEyCi0jZGVmaW5lIFBJTl9HUElPWF8xMwlHUElPWF8xMwotI2RlZmluZSBQSU5fR1BJT1hfMTQJR1BJT1hfMTQKLSNkZWZpbmUgUElOX0dQSU9YXzE1CUdQSU9YXzE1Ci0jZGVmaW5lIFBJTl9HUElPWF8xNglHUElPWF8xNgotI2RlZmluZSBQSU5fR1BJT1hfMTcJR1BJT1hfMTcKLSNkZWZpbmUgUElOX0dQSU9YXzE4CUdQSU9YXzE4Ci0jZGVmaW5lIFBJTl9HUElPWF8xOQlHUElPWF8xOQotI2RlZmluZSBQSU5fR1BJT1hfMjAJR1BJT1hfMjAKLSNkZWZpbmUgUElOX0dQSU9YXzIxCUdQSU9YXzIxCi0jZGVmaW5lIFBJTl9HUElPWV8wCUdQSU9ZXzAKLSNkZWZpbmUgUElOX0dQSU9ZXzEJR1BJT1lfMQotI2RlZmluZSBQSU5fR1BJT1lfMglHUElPWV8yCi0jZGVmaW5lIFBJTl9HUElPWV8zCUdQSU9ZXzMKLSNkZWZpbmUgUElOX0dQSU9ZXzQJR1BJT1lfNAotI2RlZmluZSBQSU5fR1BJT1lfNQlHUElPWV81Ci0jZGVmaW5lIFBJTl9HUElPWV82CUdQSU9ZXzYKLSNkZWZpbmUgUElOX0dQSU9ZXzcJR1BJT1lfNwotI2RlZmluZSBQSU5fR1BJT1lfOAlHUElPWV84Ci0jZGVmaW5lIFBJTl9HUElPWV85CUdQSU9ZXzkKLSNkZWZpbmUgUElOX0dQSU9ZXzEwCUdQSU9ZXzEwCi0jZGVmaW5lIFBJTl9HUElPWV8xMQlHUElPWV8xMQotI2RlZmluZSBQSU5fR1BJT1lfMTIJR1BJT1lfMTIKLSNkZWZpbmUgUElOX0dQSU9ZXzEzCUdQSU9ZXzEzCi0jZGVmaW5lIFBJTl9HUElPWV8xNAlHUElPWV8xNAotI2RlZmluZSBQSU5fR1BJT1lfMTUJR1BJT1lfMTUKLSNkZWZpbmUgUElOX0dQSU9ZXzE2CUdQSU9ZXzE2Ci0jZGVmaW5lIFBJTl9HUElPRFZfMAlHUElPRFZfMAotI2RlZmluZSBQSU5fR1BJT0RWXzEJR1BJT0RWXzEKLSNkZWZpbmUgUElOX0dQSU9EVl8yCUdQSU9EVl8yCi0jZGVmaW5lIFBJTl9HUElPRFZfMwlHUElPRFZfMwotI2RlZmluZSBQSU5fR1BJT0RWXzQJR1BJT0RWXzQKLSNkZWZpbmUgUElOX0dQSU9EVl81CUdQSU9EVl81Ci0jZGVmaW5lIFBJTl9HUElPRFZfNglHUElPRFZfNgotI2RlZmluZSBQSU5fR1BJT0RWXzcJR1BJT0RWXzcKLSNkZWZpbmUgUElOX0dQSU9EVl84CUdQSU9EVl84Ci0jZGVmaW5lIFBJTl9HUElPRFZfOQlHUElPRFZfOQotI2RlZmluZSBQSU5fR1BJT0RWXzEwCUdQSU9EVl8xMAotI2RlZmluZSBQSU5fR1BJT0RWXzExCUdQSU9EVl8xMQotI2RlZmluZSBQSU5fR1BJT0RWXzEyCUdQSU9EVl8xMgotI2RlZmluZSBQSU5fR1BJT0RWXzEzCUdQSU9EVl8xMwotI2RlZmluZSBQSU5fR1BJT0RWXzE0CUdQSU9EVl8xNAotI2RlZmluZSBQSU5fR1BJT0RWXzE1CUdQSU9EVl8xNQotI2RlZmluZSBQSU5fR1BJT0RWXzE2CUdQSU9EVl8xNgotI2RlZmluZSBQSU5fR1BJT0RWXzE3CUdQSU9EVl8xNwotI2RlZmluZSBQSU5fR1BJT0RWXzE4CUdQSU9EVl8xOAotI2RlZmluZSBQSU5fR1BJT0RWXzE5CUdQSU9EVl8xOQotI2RlZmluZSBQSU5fR1BJT0RWXzIwCUdQSU9EVl8yMAotI2RlZmluZSBQSU5fR1BJT0RWXzIxCUdQSU9EVl8yMQotI2RlZmluZSBQSU5fR1BJT0RWXzIyCUdQSU9EVl8yMgotI2RlZmluZSBQSU5fR1BJT0RWXzIzCUdQSU9EVl8yMwotI2RlZmluZSBQSU5fR1BJT0RWXzI0CUdQSU9EVl8yNAotI2RlZmluZSBQSU5fR1BJT0RWXzI1CUdQSU9EVl8yNQotI2RlZmluZSBQSU5fR1BJT0RWXzI2CUdQSU9EVl8yNgotI2RlZmluZSBQSU5fR1BJT0RWXzI3CUdQSU9EVl8yNwotI2RlZmluZSBQSU5fR1BJT0RWXzI4CUdQSU9EVl8yOAotI2RlZmluZSBQSU5fR1BJT0RWXzI5CUdQSU9EVl8yOQotI2RlZmluZSBQSU5fR1BJT0hfMAlHUElPSF8wCi0jZGVmaW5lIFBJTl9HUElPSF8xCUdQSU9IXzEKLSNkZWZpbmUgUElOX0dQSU9IXzIJR1BJT0hfMgotI2RlZmluZSBQSU5fR1BJT0hfMwlHUElPSF8zCi0jZGVmaW5lIFBJTl9HUElPSF80CUdQSU9IXzQKLSNkZWZpbmUgUElOX0dQSU9IXzUJR1BJT0hfNQotI2RlZmluZSBQSU5fR1BJT0hfNglHUElPSF82Ci0jZGVmaW5lIFBJTl9HUElPSF83CUdQSU9IXzcKLSNkZWZpbmUgUElOX0dQSU9IXzgJR1BJT0hfOAotI2RlZmluZSBQSU5fR1BJT0hfOQlHUElPSF85Ci0jZGVmaW5lIFBJTl9HUElPWl8wCUdQSU9aXzAKLSNkZWZpbmUgUElOX0dQSU9aXzEJR1BJT1pfMQotI2RlZmluZSBQSU5fR1BJT1pfMglHUElPWl8yCi0jZGVmaW5lIFBJTl9HUElPWl8zCUdQSU9aXzMKLSNkZWZpbmUgUElOX0dQSU9aXzQJR1BJT1pfNAotI2RlZmluZSBQSU5fR1BJT1pfNQlHUElPWl81Ci0jZGVmaW5lIFBJTl9HUElPWl82CUdQSU9aXzYKLSNkZWZpbmUgUElOX0dQSU9aXzcJR1BJT1pfNwotI2RlZmluZSBQSU5fR1BJT1pfOAlHUElPWl84Ci0jZGVmaW5lIFBJTl9HUElPWl85CUdQSU9aXzkKLSNkZWZpbmUgUElOX0dQSU9aXzEwCUdQSU9aXzEwCi0jZGVmaW5lIFBJTl9HUElPWl8xMQlHUElPWl8xMQotI2RlZmluZSBQSU5fR1BJT1pfMTIJR1BJT1pfMTIKLSNkZWZpbmUgUElOX0dQSU9aXzEzCUdQSU9aXzEzCi0jZGVmaW5lIFBJTl9HUElPWl8xNAlHUElPWl8xNAotI2RlZmluZSBQSU5fQ0FSRF8wCUNBUkRfMAotI2RlZmluZSBQSU5fQ0FSRF8xCUNBUkRfMQotI2RlZmluZSBQSU5fQ0FSRF8yCUNBUkRfMgotI2RlZmluZSBQSU5fQ0FSRF8zCUNBUkRfMwotI2RlZmluZSBQSU5fQ0FSRF80CUNBUkRfNAotI2RlZmluZSBQSU5fQ0FSRF81CUNBUkRfNQotI2RlZmluZSBQSU5fQ0FSRF82CUNBUkRfNgotI2RlZmluZSBQSU5fQk9PVF8wCUJPT1RfMAotI2RlZmluZSBQSU5fQk9PVF8xCUJPT1RfMQotI2RlZmluZSBQSU5fQk9PVF8yCUJPT1RfMgotI2RlZmluZSBQSU5fQk9PVF8zCUJPT1RfMwotI2RlZmluZSBQSU5fQk9PVF80CUJPT1RfNAotI2RlZmluZSBQSU5fQk9PVF81CUJPT1RfNQotI2RlZmluZSBQSU5fQk9PVF82CUJPT1RfNgotI2RlZmluZSBQSU5fQk9PVF83CUJPT1RfNwotI2RlZmluZSBQSU5fQk9PVF84CUJPT1RfOAotI2RlZmluZSBQSU5fQk9PVF85CUJPT1RfOQotI2RlZmluZSBQSU5fQk9PVF8xMAlCT09UXzEwCi0jZGVmaW5lIFBJTl9CT09UXzExCUJPT1RfMTEKLSNkZWZpbmUgUElOX0JPT1RfMTIJQk9PVF8xMgotI2RlZmluZSBQSU5fQk9PVF8xMwlCT09UXzEzCi0jZGVmaW5lIFBJTl9CT09UXzE0CUJPT1RfMTQKLSNkZWZpbmUgUElOX0JPT1RfMTUJQk9PVF8xNQotI2RlZmluZSBQSU5fQk9PVF8xNglCT09UXzE2Ci0jZGVmaW5lIFBJTl9CT09UXzE3CUJPT1RfMTcKLSNkZWZpbmUgUElOX0JPT1RfMTgJQk9PVF8xOAotCi0jZGVmaW5lIFBJTl9HUElPQU9fMAkoQU9fT0ZGU0VUICsgR1BJT0FPXzApCi0jZGVmaW5lIFBJTl9HUElPQU9fMQkoQU9fT0ZGU0VUICsgR1BJT0FPXzEpCi0jZGVmaW5lIFBJTl9HUElPQU9fMgkoQU9fT0ZGU0VUICsgR1BJT0FPXzIpCi0jZGVmaW5lIFBJTl9HUElPQU9fMwkoQU9fT0ZGU0VUICsgR1BJT0FPXzMpCi0jZGVmaW5lIFBJTl9HUElPQU9fNAkoQU9fT0ZGU0VUICsgR1BJT0FPXzQpCi0jZGVmaW5lIFBJTl9HUElPQU9fNQkoQU9fT0ZGU0VUICsgR1BJT0FPXzUpCi0jZGVmaW5lIFBJTl9HUElPQU9fNgkoQU9fT0ZGU0VUICsgR1BJT0FPXzYpCi0jZGVmaW5lIFBJTl9HUElPQU9fNwkoQU9fT0ZGU0VUICsgR1BJT0FPXzcpCi0jZGVmaW5lIFBJTl9HUElPQU9fOAkoQU9fT0ZGU0VUICsgR1BJT0FPXzgpCi0jZGVmaW5lIFBJTl9HUElPQU9fOQkoQU9fT0ZGU0VUICsgR1BJT0FPXzkpCi0jZGVmaW5lIFBJTl9HUElPQU9fMTAJKEFPX09GRlNFVCArIEdQSU9BT18xMCkKLSNkZWZpbmUgUElOX0dQSU9BT18xMQkoQU9fT0ZGU0VUICsgR1BJT0FPXzExKQotI2RlZmluZSBQSU5fR1BJT0FPXzEyCShBT19PRkZTRVQgKyBHUElPQU9fMTIpCi0jZGVmaW5lIFBJTl9HUElPQU9fMTMJKEFPX09GRlNFVCArIEdQSU9BT18xMykKLSNkZWZpbmUgUElOX0dQSU9fQlNEX0VOCShBT19PRkZTRVQgKyBHUElPX0JTRF9FTikKLSNkZWZpbmUgUElOX0dQSU9fVEVTVF9OCShBT19PRkZTRVQgKyBHUElPX1RFU1RfTikKKyNkZWZpbmUgQU9fT0ZGCTEyMAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgbWVzb244X3BpbnNbXSA9IHsKLQlNRVNPTl9QSU4oR1BJT1hfMCksCi0JTUVTT05fUElOKEdQSU9YXzEpLAotCU1FU09OX1BJTihHUElPWF8yKSwKLQlNRVNPTl9QSU4oR1BJT1hfMyksCi0JTUVTT05fUElOKEdQSU9YXzQpLAotCU1FU09OX1BJTihHUElPWF81KSwKLQlNRVNPTl9QSU4oR1BJT1hfNiksCi0JTUVTT05fUElOKEdQSU9YXzcpLAotCU1FU09OX1BJTihHUElPWF84KSwKLQlNRVNPTl9QSU4oR1BJT1hfOSksCi0JTUVTT05fUElOKEdQSU9YXzEwKSwKLQlNRVNPTl9QSU4oR1BJT1hfMTEpLAotCU1FU09OX1BJTihHUElPWF8xMiksCi0JTUVTT05fUElOKEdQSU9YXzEzKSwKLQlNRVNPTl9QSU4oR1BJT1hfMTQpLAotCU1FU09OX1BJTihHUElPWF8xNSksCi0JTUVTT05fUElOKEdQSU9YXzE2KSwKLQlNRVNPTl9QSU4oR1BJT1hfMTcpLAotCU1FU09OX1BJTihHUElPWF8xOCksCi0JTUVTT05fUElOKEdQSU9YXzE5KSwKLQlNRVNPTl9QSU4oR1BJT1hfMjApLAotCU1FU09OX1BJTihHUElPWF8yMSksCi0JTUVTT05fUElOKEdQSU9ZXzApLAotCU1FU09OX1BJTihHUElPWV8xKSwKLQlNRVNPTl9QSU4oR1BJT1lfMiksCi0JTUVTT05fUElOKEdQSU9ZXzMpLAotCU1FU09OX1BJTihHUElPWV80KSwKLQlNRVNPTl9QSU4oR1BJT1lfNSksCi0JTUVTT05fUElOKEdQSU9ZXzYpLAotCU1FU09OX1BJTihHUElPWV83KSwKLQlNRVNPTl9QSU4oR1BJT1lfOCksCi0JTUVTT05fUElOKEdQSU9ZXzkpLAotCU1FU09OX1BJTihHUElPWV8xMCksCi0JTUVTT05fUElOKEdQSU9ZXzExKSwKLQlNRVNPTl9QSU4oR1BJT1lfMTIpLAotCU1FU09OX1BJTihHUElPWV8xMyksCi0JTUVTT05fUElOKEdQSU9ZXzE0KSwKLQlNRVNPTl9QSU4oR1BJT1lfMTUpLAotCU1FU09OX1BJTihHUElPWV8xNiksCi0JTUVTT05fUElOKEdQSU9EVl8wKSwKLQlNRVNPTl9QSU4oR1BJT0RWXzEpLAotCU1FU09OX1BJTihHUElPRFZfMiksCi0JTUVTT05fUElOKEdQSU9EVl8zKSwKLQlNRVNPTl9QSU4oR1BJT0RWXzQpLAotCU1FU09OX1BJTihHUElPRFZfNSksCi0JTUVTT05fUElOKEdQSU9EVl82KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzcpLAotCU1FU09OX1BJTihHUElPRFZfOCksCi0JTUVTT05fUElOKEdQSU9EVl85KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzEwKSwKLQlNRVNPTl9QSU4oR1BJT0RWXzExKSwKLQlNRVNPTl9QSU4oR1BJT0RWXzEyKSwKLQlNRVNPTl9QSU4oR1BJT0RWXzEzKSwKLQlNRVNPTl9QSU4oR1BJT0RWXzE0KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzE1KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzE2KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzE3KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzE4KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzE5KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzIwKSwKLQlNRVNPTl9QSU4oR1BJT0RWXzIxKSwKLQlNRVNPTl9QSU4oR1BJT0RWXzIyKSwKLQlNRVNPTl9QSU4oR1BJT0RWXzIzKSwKLQlNRVNPTl9QSU4oR1BJT0RWXzI0KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzI1KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzI2KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzI3KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzI4KSwKLQlNRVNPTl9QSU4oR1BJT0RWXzI5KSwKLQlNRVNPTl9QSU4oR1BJT0hfMCksCi0JTUVTT05fUElOKEdQSU9IXzEpLAotCU1FU09OX1BJTihHUElPSF8yKSwKLQlNRVNPTl9QSU4oR1BJT0hfMyksCi0JTUVTT05fUElOKEdQSU9IXzQpLAotCU1FU09OX1BJTihHUElPSF81KSwKLQlNRVNPTl9QSU4oR1BJT0hfNiksCi0JTUVTT05fUElOKEdQSU9IXzcpLAotCU1FU09OX1BJTihHUElPSF84KSwKLQlNRVNPTl9QSU4oR1BJT0hfOSksCi0JTUVTT05fUElOKEdQSU9aXzApLAotCU1FU09OX1BJTihHUElPWl8xKSwKLQlNRVNPTl9QSU4oR1BJT1pfMiksCi0JTUVTT05fUElOKEdQSU9aXzMpLAotCU1FU09OX1BJTihHUElPWl80KSwKLQlNRVNPTl9QSU4oR1BJT1pfNSksCi0JTUVTT05fUElOKEdQSU9aXzYpLAotCU1FU09OX1BJTihHUElPWl83KSwKLQlNRVNPTl9QSU4oR1BJT1pfOCksCi0JTUVTT05fUElOKEdQSU9aXzkpLAotCU1FU09OX1BJTihHUElPWl8xMCksCi0JTUVTT05fUElOKEdQSU9aXzExKSwKLQlNRVNPTl9QSU4oR1BJT1pfMTIpLAotCU1FU09OX1BJTihHUElPWl8xMyksCi0JTUVTT05fUElOKEdQSU9aXzE0KSwKLQlNRVNPTl9QSU4oQ0FSRF8wKSwKLQlNRVNPTl9QSU4oQ0FSRF8xKSwKLQlNRVNPTl9QSU4oQ0FSRF8yKSwKLQlNRVNPTl9QSU4oQ0FSRF8zKSwKLQlNRVNPTl9QSU4oQ0FSRF80KSwKLQlNRVNPTl9QSU4oQ0FSRF81KSwKLQlNRVNPTl9QSU4oQ0FSRF82KSwKLQlNRVNPTl9QSU4oQk9PVF8wKSwKLQlNRVNPTl9QSU4oQk9PVF8xKSwKLQlNRVNPTl9QSU4oQk9PVF8yKSwKLQlNRVNPTl9QSU4oQk9PVF8zKSwKLQlNRVNPTl9QSU4oQk9PVF80KSwKLQlNRVNPTl9QSU4oQk9PVF81KSwKLQlNRVNPTl9QSU4oQk9PVF82KSwKLQlNRVNPTl9QSU4oQk9PVF83KSwKLQlNRVNPTl9QSU4oQk9PVF84KSwKLQlNRVNPTl9QSU4oQk9PVF85KSwKLQlNRVNPTl9QSU4oQk9PVF8xMCksCi0JTUVTT05fUElOKEJPT1RfMTEpLAotCU1FU09OX1BJTihCT09UXzEyKSwKLQlNRVNPTl9QSU4oQk9PVF8xMyksCi0JTUVTT05fUElOKEJPT1RfMTQpLAotCU1FU09OX1BJTihCT09UXzE1KSwKLQlNRVNPTl9QSU4oQk9PVF8xNiksCi0JTUVTT05fUElOKEJPT1RfMTcpLAotCU1FU09OX1BJTihCT09UXzE4KSwKLQlNRVNPTl9QSU4oR1BJT0FPXzApLAotCU1FU09OX1BJTihHUElPQU9fMSksCi0JTUVTT05fUElOKEdQSU9BT18yKSwKLQlNRVNPTl9QSU4oR1BJT0FPXzMpLAotCU1FU09OX1BJTihHUElPQU9fNCksCi0JTUVTT05fUElOKEdQSU9BT181KSwKLQlNRVNPTl9QSU4oR1BJT0FPXzYpLAotCU1FU09OX1BJTihHUElPQU9fNyksCi0JTUVTT05fUElOKEdQSU9BT184KSwKLQlNRVNPTl9QSU4oR1BJT0FPXzkpLAotCU1FU09OX1BJTihHUElPQU9fMTApLAotCU1FU09OX1BJTihHUElPQU9fMTEpLAotCU1FU09OX1BJTihHUElPQU9fMTIpLAotCU1FU09OX1BJTihHUElPQU9fMTMpLAotCU1FU09OX1BJTihHUElPX0JTRF9FTiksCi0JTUVTT05fUElOKEdQSU9fVEVTVF9OKSwKKwlNRVNPTl9QSU4oR1BJT1hfMCwgMCksCisJTUVTT05fUElOKEdQSU9YXzEsIDApLAorCU1FU09OX1BJTihHUElPWF8yLCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfMywgMCksCisJTUVTT05fUElOKEdQSU9YXzQsIDApLAorCU1FU09OX1BJTihHUElPWF81LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfNiwgMCksCisJTUVTT05fUElOKEdQSU9YXzcsIDApLAorCU1FU09OX1BJTihHUElPWF84LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfOSwgMCksCisJTUVTT05fUElOKEdQSU9YXzEwLCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfMTEsIDApLAorCU1FU09OX1BJTihHUElPWF8xMiwgMCksCisJTUVTT05fUElOKEdQSU9YXzEzLCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfMTQsIDApLAorCU1FU09OX1BJTihHUElPWF8xNSwgMCksCisJTUVTT05fUElOKEdQSU9YXzE2LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfMTcsIDApLAorCU1FU09OX1BJTihHUElPWF8xOCwgMCksCisJTUVTT05fUElOKEdQSU9YXzE5LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfMjAsIDApLAorCU1FU09OX1BJTihHUElPWF8yMSwgMCksCisJTUVTT05fUElOKEdQSU9ZXzAsIDApLAorCU1FU09OX1BJTihHUElPWV8xLCAwKSwKKwlNRVNPTl9QSU4oR1BJT1lfMiwgMCksCisJTUVTT05fUElOKEdQSU9ZXzMsIDApLAorCU1FU09OX1BJTihHUElPWV80LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1lfNSwgMCksCisJTUVTT05fUElOKEdQSU9ZXzYsIDApLAorCU1FU09OX1BJTihHUElPWV83LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1lfOCwgMCksCisJTUVTT05fUElOKEdQSU9ZXzksIDApLAorCU1FU09OX1BJTihHUElPWV8xMCwgMCksCisJTUVTT05fUElOKEdQSU9ZXzExLCAwKSwKKwlNRVNPTl9QSU4oR1BJT1lfMTIsIDApLAorCU1FU09OX1BJTihHUElPWV8xMywgMCksCisJTUVTT05fUElOKEdQSU9ZXzE0LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1lfMTUsIDApLAorCU1FU09OX1BJTihHUElPWV8xNiwgMCksCisJTUVTT05fUElOKEdQSU9EVl8wLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzEsIDApLAorCU1FU09OX1BJTihHUElPRFZfMiwgMCksCisJTUVTT05fUElOKEdQSU9EVl8zLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzQsIDApLAorCU1FU09OX1BJTihHUElPRFZfNSwgMCksCisJTUVTT05fUElOKEdQSU9EVl82LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzcsIDApLAorCU1FU09OX1BJTihHUElPRFZfOCwgMCksCisJTUVTT05fUElOKEdQSU9EVl85LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzEwLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzExLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzEyLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzEzLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzE0LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzE1LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzE2LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzE3LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzE4LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzE5LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzIwLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzIxLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzIyLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzIzLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzI0LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzI1LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzI2LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzI3LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzI4LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0RWXzI5LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0hfMCwgMCksCisJTUVTT05fUElOKEdQSU9IXzEsIDApLAorCU1FU09OX1BJTihHUElPSF8yLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0hfMywgMCksCisJTUVTT05fUElOKEdQSU9IXzQsIDApLAorCU1FU09OX1BJTihHUElPSF81LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0hfNiwgMCksCisJTUVTT05fUElOKEdQSU9IXzcsIDApLAorCU1FU09OX1BJTihHUElPSF84LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0hfOSwgMCksCisJTUVTT05fUElOKEdQSU9aXzAsIDApLAorCU1FU09OX1BJTihHUElPWl8xLCAwKSwKKwlNRVNPTl9QSU4oR1BJT1pfMiwgMCksCisJTUVTT05fUElOKEdQSU9aXzMsIDApLAorCU1FU09OX1BJTihHUElPWl80LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1pfNSwgMCksCisJTUVTT05fUElOKEdQSU9aXzYsIDApLAorCU1FU09OX1BJTihHUElPWl83LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1pfOCwgMCksCisJTUVTT05fUElOKEdQSU9aXzksIDApLAorCU1FU09OX1BJTihHUElPWl8xMCwgMCksCisJTUVTT05fUElOKEdQSU9aXzExLCAwKSwKKwlNRVNPTl9QSU4oR1BJT1pfMTIsIDApLAorCU1FU09OX1BJTihHUElPWl8xMywgMCksCisJTUVTT05fUElOKEdQSU9aXzE0LCAwKSwKKwlNRVNPTl9QSU4oQ0FSRF8wLCAwKSwKKwlNRVNPTl9QSU4oQ0FSRF8xLCAwKSwKKwlNRVNPTl9QSU4oQ0FSRF8yLCAwKSwKKwlNRVNPTl9QSU4oQ0FSRF8zLCAwKSwKKwlNRVNPTl9QSU4oQ0FSRF80LCAwKSwKKwlNRVNPTl9QSU4oQ0FSRF81LCAwKSwKKwlNRVNPTl9QSU4oQ0FSRF82LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8wLCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8xLCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8yLCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8zLCAwKSwKKwlNRVNPTl9QSU4oQk9PVF80LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF81LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF82LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF83LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF84LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF85LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8xMCwgMCksCisJTUVTT05fUElOKEJPT1RfMTEsIDApLAorCU1FU09OX1BJTihCT09UXzEyLCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8xMywgMCksCisJTUVTT05fUElOKEJPT1RfMTQsIDApLAorCU1FU09OX1BJTihCT09UXzE1LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8xNiwgMCksCisJTUVTT05fUElOKEJPT1RfMTcsIDApLAorCU1FU09OX1BJTihCT09UXzE4LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0FPXzAsIEFPX09GRiksCisJTUVTT05fUElOKEdQSU9BT18xLCBBT19PRkYpLAorCU1FU09OX1BJTihHUElPQU9fMiwgQU9fT0ZGKSwKKwlNRVNPTl9QSU4oR1BJT0FPXzMsIEFPX09GRiksCisJTUVTT05fUElOKEdQSU9BT180LCBBT19PRkYpLAorCU1FU09OX1BJTihHUElPQU9fNSwgQU9fT0ZGKSwKKwlNRVNPTl9QSU4oR1BJT0FPXzYsIEFPX09GRiksCisJTUVTT05fUElOKEdQSU9BT183LCBBT19PRkYpLAorCU1FU09OX1BJTihHUElPQU9fOCwgQU9fT0ZGKSwKKwlNRVNPTl9QSU4oR1BJT0FPXzksIEFPX09GRiksCisJTUVTT05fUElOKEdQSU9BT18xMCwgQU9fT0ZGKSwKKwlNRVNPTl9QSU4oR1BJT0FPXzExLCBBT19PRkYpLAorCU1FU09OX1BJTihHUElPQU9fMTIsIEFPX09GRiksCisJTUVTT05fUElOKEdQSU9BT18xMywgQU9fT0ZGKSwKKwlNRVNPTl9QSU4oR1BJT19CU0RfRU4sIEFPX09GRiksCisJTUVTT05fUElOKEdQSU9fVEVTVF9OLCBBT19PRkYpLAogfTsKIAogLyogYmFuayBYICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QwX2FfcGluc1tdID0geyBQSU5fR1BJT1hfMCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9kMV9hX3BpbnNbXSA9IHsgUElOX0dQSU9YXzEgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDJfYV9waW5zW10gPSB7IFBJTl9HUElPWF8yIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QzX2FfcGluc1tdID0geyBQSU5fR1BJT1hfMyB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9jbGtfYV9waW5zW10gPSB7IFBJTl9HUElPWF84IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2NtZF9hX3BpbnNbXSA9IHsgUElOX0dQSU9YXzkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDBfYV9waW5zW10gPSB7IFBJTihHUElPWF8wLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9kMV9hX3BpbnNbXSA9IHsgUElOKEdQSU9YXzEsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QyX2FfcGluc1tdID0geyBQSU4oR1BJT1hfMiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDNfYV9waW5zW10gPSB7IFBJTihHUElPWF8zLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9jbGtfYV9waW5zW10gPSB7IFBJTihHUElPWF84LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9jbWRfYV9waW5zW10gPSB7IFBJTihHUElPWF85LCAwKSB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfZDBfYV9waW5zW10gPSB7IFBJTl9HUElPWF8wIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfZDEzX2FfcGluc1tdID0geyBQSU5fR1BJT1hfMSwgUElOX0dQSU9YXzIsCi0JCQkJCQlQSU5fR1BJT1hfMyB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2Q0N19hX3BpbnNbXSA9IHsgUElOX0dQSU9YXzQsIFBJTl9HUElPWF81LAotCQkJCQkJUElOX0dQSU9YXzYsIFBJTl9HUElPWF83IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfY2xrX2FfcGluc1tdID0geyBQSU5fR1BJT1hfOCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2NtZF9hX3BpbnNbXSA9IHsgUElOX0dQSU9YXzkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19kMF9hX3BpbnNbXSA9IHsgUElOKEdQSU9YXzAsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfZDEzX2FfcGluc1tdID0geyBQSU4oR1BJT1hfMSwgMCksIFBJTihHUElPWF8yLCAwKSwKKwkJCQkJCVBJTihHUElPWF8zLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2Q0N19hX3BpbnNbXSA9IHsgUElOKEdQSU9YXzQsIDApLCBQSU4oR1BJT1hfNSwgMCksCisJCQkJCQlQSU4oR1BJT1hfNiwgMCksIFBJTihHUElPWF83LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2Nsa19hX3BpbnNbXSA9IHsgUElOKEdQSU9YXzgsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfY21kX2FfcGluc1tdID0geyBQSU4oR1BJT1hfOSwgMCkgfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY21fb3V0X2FfcGluc1tdID0geyBQSU5fR1BJT1hfNCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY21faW5fYV9waW5zW10gPSB7IFBJTl9HUElPWF81IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjbV9mc19hX3BpbnNbXSA9IHsgUElOX0dQSU9YXzYgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNtX2Nsa19hX3BpbnNbXSA9IHsgUElOX0dQSU9YXzcgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNtX291dF9hX3BpbnNbXSA9IHsgUElOKEdQSU9YXzQsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjbV9pbl9hX3BpbnNbXSA9IHsgUElOKEdQSU9YXzUsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjbV9mc19hX3BpbnNbXSA9IHsgUElOKEdQSU9YXzYsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjbV9jbGtfYV9waW5zW10gPSB7IFBJTihHUElPWF83LCAwKSB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfdHhfYTBfcGluc1tdID0geyBQSU5fR1BJT1hfNCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J4X2EwX3BpbnNbXSA9IHsgUElOX0dQSU9YXzUgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9jdHNfYTBfcGluc1tdID0geyBQSU5fR1BJT1hfNiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J0c19hMF9waW5zW10gPSB7IFBJTl9HUElPWF83IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfdHhfYTBfcGluc1tdID0geyBQSU4oR1BJT1hfNCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9yeF9hMF9waW5zW10gPSB7IFBJTihHUElPWF81LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X2N0c19hMF9waW5zW10gPSB7IFBJTihHUElPWF82LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J0c19hMF9waW5zW10gPSB7IFBJTihHUElPWF83LCAwKSB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfdHhfYTFfcGluc1tdID0geyBQSU5fR1BJT1hfMTIgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9yeF9hMV9waW5zW10gPSB7IFBJTl9HUElPWF8xMyB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X2N0c19hMV9waW5zW10gPSB7IFBJTl9HUElPWF8xNCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J0c19hMV9waW5zW10gPSB7IFBJTl9HUElPWF8xNSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3R4X2ExX3BpbnNbXSA9IHsgUElOKEdQSU9YXzEyLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J4X2ExX3BpbnNbXSA9IHsgUElOKEdQSU9YXzEzLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X2N0c19hMV9waW5zW10gPSB7IFBJTihHUElPWF8xNCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9ydHNfYTFfcGluc1tdID0geyBQSU4oR1BJT1hfMTUsIDApIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF90eF9iMF9waW5zW10gPSB7IFBJTl9HUElPWF8xNiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J4X2IwX3BpbnNbXSA9IHsgUElOX0dQSU9YXzE3IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfY3RzX2IwX3BpbnNbXSA9IHsgUElOX0dQSU9YXzE4IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnRzX2IwX3BpbnNbXSA9IHsgUElOX0dQSU9YXzE5IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfdHhfYjBfcGluc1tdID0geyBQSU4oR1BJT1hfMTYsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnhfYjBfcGluc1tdID0geyBQSU4oR1BJT1hfMTcsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfY3RzX2IwX3BpbnNbXSA9IHsgUElOKEdQSU9YXzE4LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J0c19iMF9waW5zW10gPSB7IFBJTihHUElPWF8xOSwgMCkgfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpc283ODE2X2RldF9waW5zW10gPSB7IFBJTl9HUElPWF8xNiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpc283ODE2X3Jlc2V0X3BpbnNbXSA9IHsgUElOX0dQSU9YXzE3IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGlzbzc4MTZfY2xrX3BpbnNbXSA9IHsgUElOX0dQSU9YXzE4IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGlzbzc4MTZfZGF0YV9waW5zW10gPSB7IFBJTl9HUElPWF8xOSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpc283ODE2X2RldF9waW5zW10gPSB7IFBJTihHUElPWF8xNiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaXNvNzgxNl9yZXNldF9waW5zW10gPSB7IFBJTihHUElPWF8xNywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaXNvNzgxNl9jbGtfcGluc1tdID0geyBQSU4oR1BJT1hfMTgsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGlzbzc4MTZfZGF0YV9waW5zW10gPSB7IFBJTihHUElPWF8xOSwgMCkgfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2QwX3BpbnNbXSA9IHsgUElOX0dQSU9YXzE2IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfZDBfcGluc1tdID0geyBQSU5fR1BJT1hfMTcgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9kMF9waW5zW10gPSB7IFBJTihHUElPWF8xNiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3Nja19kMF9waW5zW10gPSB7IFBJTihHUElPWF8xNywgMCkgfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB4dGFsXzMya19vdXRfcGluc1tdID0geyBQSU5fR1BJT1hfMTAgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgeHRhbF8yNG1fb3V0X3BpbnNbXSA9IHsgUElOX0dQSU9YXzExIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHh0YWxfMzJrX291dF9waW5zW10gPSB7IFBJTihHUElPWF8xMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgeHRhbF8yNG1fb3V0X3BpbnNbXSA9IHsgUElOKEdQSU9YXzExLCAwKSB9OwogCiAvKiBiYW5rIFkgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF90eF9jX3BpbnNbXSA9IHsgUElOX0dQSU9ZXzAgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9yeF9jX3BpbnNbXSA9IHsgUElOX0dQSU9ZXzEgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9jdHNfY19waW5zW10gPSB7IFBJTl9HUElPWV8yIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnRzX2NfcGluc1tdID0geyBQSU5fR1BJT1lfMyB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3R4X2NfcGluc1tdID0geyBQSU4oR1BJT1lfMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9yeF9jX3BpbnNbXSA9IHsgUElOKEdQSU9ZXzEsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfY3RzX2NfcGluc1tdID0geyBQSU4oR1BJT1lfMiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9ydHNfY19waW5zW10gPSB7IFBJTihHUElPWV8zLCAwKSB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjbV9vdXRfYl9waW5zW10gPSB7IFBJTl9HUElPWV80IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjbV9pbl9iX3BpbnNbXSA9IHsgUElOX0dQSU9ZXzUgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNtX2ZzX2JfcGluc1tdID0geyBQSU5fR1BJT1lfNiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY21fY2xrX2JfcGluc1tdID0geyBQSU5fR1BJT1lfNyB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY21fb3V0X2JfcGluc1tdID0geyBQSU4oR1BJT1lfNCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNtX2luX2JfcGluc1tdID0geyBQSU4oR1BJT1lfNSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNtX2ZzX2JfcGluc1tdID0geyBQSU4oR1BJT1lfNiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGNtX2Nsa19iX3BpbnNbXSA9IHsgUElOKEdQSU9ZXzcsIDApIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9jMF9waW5zW10gPSB7IFBJTl9HUElPWV8wIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfYzBfcGluc1tdID0geyBQSU5fR1BJT1lfMSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2MwX3BpbnNbXSA9IHsgUElOKEdQSU9ZXzAsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfYzBfcGluc1tdID0geyBQSU4oR1BJT1lfMSwgMCkgfTsKIAogLyogYmFuayBEViAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdmluX3JnYl9waW5zW10gPSB7IFBJTl9HUElPRFZfMCwgUElOX0dQSU9EVl8xLAotCQkJCQkgICAgICBQSU5fR1BJT0RWXzIsIFBJTl9HUElPRFZfMywKLQkJCQkJICAgICAgUElOX0dQSU9EVl80LCBQSU5fR1BJT0RWXzUsCi0JCQkJCSAgICAgIFBJTl9HUElPRFZfNiwgUElOX0dQSU9EVl83LAotCQkJCQkgICAgICBQSU5fR1BJT0RWXzgsIFBJTl9HUElPRFZfOSwKLQkJCQkJICAgICAgUElOX0dQSU9EVl8xMCwgUElOX0dQSU9EVl8xMSwKLQkJCQkJICAgICAgUElOX0dQSU9EVl8xMiwgUElOX0dQSU9EVl8xMywKLQkJCQkJICAgICAgUElOX0dQSU9EVl8xNCwgUElOX0dQSU9EVl8xNSwKLQkJCQkJICAgICAgUElOX0dQSU9EVl8xNiwgUElOX0dQSU9EVl8xNywKLQkJCQkJICAgICAgUElOX0dQSU9EVl8xOCwgUElOX0dQSU9EVl8xOSwKLQkJCQkJICAgICAgUElOX0dQSU9EVl8yMCwgUElOX0dQSU9EVl8yMSwKLQkJCQkJICAgICAgUElOX0dQSU9EVl8yMiwgUElOX0dQSU9EVl8yMyB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdmluX3ZzX3BpbnNbXSA9IHsgUElOX0dQSU9EVl8yNCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdmluX2hzX3BpbnNbXSA9IHsgUElOX0dQSU9EVl8yNSB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdmluX2Nsa19waW5zW10gPSB7IFBJTl9HUElPRFZfMjYgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHZpbl9kZV9waW5zW10gPSB7IFBJTl9HUElPRFZfMjcgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHZpbl9yZ2JfcGluc1tdID0geyBQSU4oR1BJT0RWXzAsIDApLCBQSU4oR1BJT0RWXzEsIDApLAorCQkJCQkgICAgICBQSU4oR1BJT0RWXzIsIDApLCBQSU4oR1BJT0RWXzMsIDApLAorCQkJCQkgICAgICBQSU4oR1BJT0RWXzQsIDApLCBQSU4oR1BJT0RWXzUsIDApLAorCQkJCQkgICAgICBQSU4oR1BJT0RWXzYsIDApLCBQSU4oR1BJT0RWXzcsIDApLAorCQkJCQkgICAgICBQSU4oR1BJT0RWXzgsIDApLCBQSU4oR1BJT0RWXzksIDApLAorCQkJCQkgICAgICBQSU4oR1BJT0RWXzEwLCAwKSwgUElOKEdQSU9EVl8xMSwgMCksCisJCQkJCSAgICAgIFBJTihHUElPRFZfMTIsIDApLCBQSU4oR1BJT0RWXzEzLCAwKSwKKwkJCQkJICAgICAgUElOKEdQSU9EVl8xNCwgMCksIFBJTihHUElPRFZfMTUsIDApLAorCQkJCQkgICAgICBQSU4oR1BJT0RWXzE2LCAwKSwgUElOKEdQSU9EVl8xNywgMCksCisJCQkJCSAgICAgIFBJTihHUElPRFZfMTgsIDApLCBQSU4oR1BJT0RWXzE5LCAwKSwKKwkJCQkJICAgICAgUElOKEdQSU9EVl8yMCwgMCksIFBJTihHUElPRFZfMjEsIDApLAorCQkJCQkgICAgICBQSU4oR1BJT0RWXzIyLCAwKSwgUElOKEdQSU9EVl8yMywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHZpbl92c19waW5zW10gPSB7IFBJTihHUElPRFZfMjQsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR2aW5faHNfcGluc1tdID0geyBQSU4oR1BJT0RWXzI1LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBkdmluX2Nsa19waW5zW10gPSB7IFBJTihHUElPRFZfMjYsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGR2aW5fZGVfcGluc1tdID0geyBQSU4oR1BJT0RWXzI3LCAwKSB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY18wX3BpbnNbXSA9IHsgUElOX0dQSU9EVl8wIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY18xX3BpbnNbXSA9IHsgUElOX0dQSU9EVl8xIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY18yX3BpbnNbXSA9IHsgUElOX0dQSU9EVl8yIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY18zX3BpbnNbXSA9IHsgUElOX0dQSU9EVl8zIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY180X3BpbnNbXSA9IHsgUElOX0dQSU9EVl80IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY181X3BpbnNbXSA9IHsgUElOX0dQSU9EVl81IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY182X3BpbnNbXSA9IHsgUElOX0dQSU9EVl82IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY183X3BpbnNbXSA9IHsgUElOX0dQSU9EVl83IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY184X3BpbnNbXSA9IHsgUElOX0dQSU9EVl84IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY185X3BpbnNbXSA9IHsgUElOX0dQSU9EVl85IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY18xMF9waW5zW10gPSB7IFBJTl9HUElPRFZfMTAgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzExX3BpbnNbXSA9IHsgUElOX0dQSU9EVl8xMSB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBlbmNfMTJfcGluc1tdID0geyBQSU5fR1BJT0RWXzEyIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY18xM19waW5zW10gPSB7IFBJTl9HUElPRFZfMTMgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzE0X3BpbnNbXSA9IHsgUElOX0dQSU9EVl8xNCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBlbmNfMTVfcGluc1tdID0geyBQSU5fR1BJT0RWXzE1IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY18xNl9waW5zW10gPSB7IFBJTl9HUElPRFZfMTYgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzE3X3BpbnNbXSA9IHsgUElOX0dQSU9EVl8xNyB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBlbmNfMF9waW5zW10gPSB7IFBJTihHUElPRFZfMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzFfcGluc1tdID0geyBQSU4oR1BJT0RWXzEsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY18yX3BpbnNbXSA9IHsgUElOKEdQSU9EVl8yLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBlbmNfM19waW5zW10gPSB7IFBJTihHUElPRFZfMywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzRfcGluc1tdID0geyBQSU4oR1BJT0RWXzQsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY181X3BpbnNbXSA9IHsgUElOKEdQSU9EVl81LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBlbmNfNl9waW5zW10gPSB7IFBJTihHUElPRFZfNiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzdfcGluc1tdID0geyBQSU4oR1BJT0RWXzcsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVuY184X3BpbnNbXSA9IHsgUElOKEdQSU9EVl84LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBlbmNfOV9waW5zW10gPSB7IFBJTihHUElPRFZfOSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzEwX3BpbnNbXSA9IHsgUElOKEdQSU9EVl8xMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzExX3BpbnNbXSA9IHsgUElOKEdQSU9EVl8xMSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzEyX3BpbnNbXSA9IHsgUElOKEdQSU9EVl8xMiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzEzX3BpbnNbXSA9IHsgUElOKEdQSU9EVl8xMywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzE0X3BpbnNbXSA9IHsgUElOKEdQSU9EVl8xNCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzE1X3BpbnNbXSA9IHsgUElOKEdQSU9EVl8xNSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzE2X3BpbnNbXSA9IHsgUElOKEdQSU9EVl8xNiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZW5jXzE3X3BpbnNbXSA9IHsgUElOKEdQSU9EVl8xNywgMCkgfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3R4X2IxX3BpbnNbXSA9IHsgUElOX0dQSU9EVl8yNCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J4X2IxX3BpbnNbXSA9IHsgUElOX0dQSU9EVl8yNSB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X2N0c19iMV9waW5zW10gPSB7IFBJTl9HUElPRFZfMjYgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9ydHNfYjFfcGluc1tdID0geyBQSU5fR1BJT0RWXzI3IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfdHhfYjFfcGluc1tdID0geyBQSU4oR1BJT0RWXzI0LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J4X2IxX3BpbnNbXSA9IHsgUElOKEdQSU9EVl8yNSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9jdHNfYjFfcGluc1tdID0geyBQSU4oR1BJT0RWXzI2LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J0c19iMV9waW5zW10gPSB7IFBJTihHUElPRFZfMjcsIDApIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmdhX3ZzX3BpbnNbXSA9IHsgUElOX0dQSU9EVl8yNCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB2Z2FfaHNfcGluc1tdID0geyBQSU5fR1BJT0RWXzI1IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZnYV92c19waW5zW10gPSB7IFBJTihHUElPRFZfMjQsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHZnYV9oc19waW5zW10gPSB7IFBJTihHUElPRFZfMjUsIDApIH07CiAKIC8qIGJhbmsgSCAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBoZG1pX2hwZF9waW5zW10gPSB7IFBJTl9HUElPSF8wIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhkbWlfc2RhX3BpbnNbXSA9IHsgUElOX0dQSU9IXzEgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaGRtaV9zY2xfcGluc1tdID0geyBQSU5fR1BJT0hfMiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBoZG1pX2NlY19waW5zW10gPSB7IFBJTl9HUElPSF8zIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhkbWlfaHBkX3BpbnNbXSA9IHsgUElOKEdQSU9IXzAsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhkbWlfc2RhX3BpbnNbXSA9IHsgUElOKEdQSU9IXzEsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhkbWlfc2NsX3BpbnNbXSA9IHsgUElOKEdQSU9IXzIsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGhkbWlfY2VjX3BpbnNbXSA9IHsgUElOKEdQSU9IXzMsIDApIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX3NzMF8wX3BpbnNbXSA9IHsgUElOX0dQSU9IXzMgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX21pc29fMF9waW5zW10gPSB7IFBJTl9HUElPSF80IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNwaV9tb3NpXzBfcGluc1tdID0geyBQSU5fR1BJT0hfNSB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzcGlfc2Nsa18wX3BpbnNbXSA9IHsgUElOX0dQSU9IXzYgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX3NzMF8wX3BpbnNbXSA9IHsgUElOKEdQSU9IXzMsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNwaV9taXNvXzBfcGluc1tdID0geyBQSU4oR1BJT0hfNCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX21vc2lfMF9waW5zW10gPSB7IFBJTihHUElPSF81LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzcGlfc2Nsa18wX3BpbnNbXSA9IHsgUElOKEdQSU9IXzYsIDApIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9kMV9waW5zW10gPSB7IFBJTl9HUElPSF83IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfZDFfcGluc1tdID0geyBQSU5fR1BJT0hfOCB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2QxX3BpbnNbXSA9IHsgUElOKEdQSU9IXzcsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfZDFfcGluc1tdID0geyBQSU4oR1BJT0hfOCwgMCkgfTsKIAogLyogYmFuayBaICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNwaV9zczBfMV9waW5zW10gPSB7IFBJTl9HUElPWl85IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNwaV9zczFfMV9waW5zW10gPSB7IFBJTl9HUElPWl8xMCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzcGlfc2Nsa18xX3BpbnNbXSA9IHsgUElOX0dQSU9aXzExIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNwaV9tb3NpXzFfcGluc1tdID0geyBQSU5fR1BJT1pfMTIgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX21pc29fMV9waW5zW10gPSB7IFBJTl9HUElPWl8xMyB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzcGlfc3MyXzFfcGluc1tdID0geyBQSU5fR1BJT1pfMTQgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX3NzMF8xX3BpbnNbXSA9IHsgUElOKEdQSU9aXzksIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNwaV9zczFfMV9waW5zW10gPSB7IFBJTihHUElPWl8xMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX3NjbGtfMV9waW5zW10gPSB7IFBJTihHUElPWl8xMSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX21vc2lfMV9waW5zW10gPSB7IFBJTihHUElPWl8xMiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX21pc29fMV9waW5zW10gPSB7IFBJTihHUElPWl8xMywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX3NzMl8xX3BpbnNbXSA9IHsgUElOKEdQSU9aXzE0LCAwKSB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF90eF9jbGtfNTBtX3BpbnNbXSA9IHsgUElOX0dQSU9aXzQgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX3R4X2VuX3BpbnNbXSA9IHsgUElOX0dQSU9aXzUgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX3R4ZDFfcGluc1tdID0geyBQSU5fR1BJT1pfNiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfdHhkMF9waW5zW10gPSB7IFBJTl9HUElPWl83IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF9yeF9jbGtfaW5fcGluc1tdID0geyBQSU5fR1BJT1pfOCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfcnhfZHZfcGluc1tdID0geyBQSU5fR1BJT1pfOSB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfcnhkMV9waW5zW10gPSB7IFBJTl9HUElPWl8xMCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfcnhkMF9waW5zW10gPSB7IFBJTl9HUElPWl8xMSB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfbWRpb19waW5zW10gPSB7IFBJTl9HUElPWl8xMiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfbWRjX3BpbnNbXSA9IHsgUElOX0dQSU9aXzEzIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF90eF9jbGtfNTBtX3BpbnNbXSA9IHsgUElOKEdQSU9aXzQsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF90eF9lbl9waW5zW10gPSB7IFBJTihHUElPWl81LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfdHhkMV9waW5zW10gPSB7IFBJTihHUElPWl82LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfdHhkMF9waW5zW10gPSB7IFBJTihHUElPWl83LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfcnhfY2xrX2luX3BpbnNbXSA9IHsgUElOKEdQSU9aXzgsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF9yeF9kdl9waW5zW10gPSB7IFBJTihHUElPWl85LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfcnhkMV9waW5zW10gPSB7IFBJTihHUElPWl8xMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX3J4ZDBfcGluc1tdID0geyBQSU4oR1BJT1pfMTEsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF9tZGlvX3BpbnNbXSA9IHsgUElOKEdQSU9aXzEyLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfbWRjX3BpbnNbXSA9IHsgUElOKEdQSU9aXzEzLCAwKSB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zZGFfYTBfcGluc1tdID0geyBQSU5fR1BJT1pfMCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2NrX2EwX3BpbnNbXSA9IHsgUElOX0dQSU9aXzEgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9hMF9waW5zW10gPSB7IFBJTihHUElPWl8wLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2NrX2EwX3BpbnNbXSA9IHsgUElOKEdQSU9aXzEsIDApIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9iX3BpbnNbXSA9IHsgUElOX0dQSU9aXzIgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3Nja19iX3BpbnNbXSA9IHsgUElOX0dQSU9aXzMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9iX3BpbnNbXSA9IHsgUElOKEdQSU9aXzIsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfYl9waW5zW10gPSB7IFBJTihHUElPWl8zLCAwKSB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zZGFfYzFfcGluc1tdID0geyBQSU5fR1BJT1pfNCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2NrX2MxX3BpbnNbXSA9IHsgUElOX0dQSU9aXzUgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9jMV9waW5zW10gPSB7IFBJTihHUElPWl80LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2NrX2MxX3BpbnNbXSA9IHsgUElOKEdQSU9aXzUsIDApIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9hMV9waW5zW10gPSB7IFBJTl9HUElPWl8wIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfYTFfcGluc1tdID0geyBQSU5fR1BJT1pfMSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2ExX3BpbnNbXSA9IHsgUElOKEdQSU9aXzAsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfYTFfcGluc1tdID0geyBQSU4oR1BJT1pfMSwgMCkgfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2EyX3BpbnNbXSA9IHsgUElOX0dQSU9aXzAgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3Nja19hMl9waW5zW10gPSB7IFBJTl9HUElPWl8xIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zZGFfYTJfcGluc1tdID0geyBQSU4oR1BJT1pfMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3Nja19hMl9waW5zW10gPSB7IFBJTihHUElPWl8xLCAwKSB9OwogCiAvKiBiYW5rIEJPT1QgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDBfY19waW5zW10gPSB7IFBJTl9CT09UXzAgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDFfY19waW5zW10gPSB7IFBJTl9CT09UXzEgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDJfY19waW5zW10gPSB7IFBJTl9CT09UXzIgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDNfY19waW5zW10gPSB7IFBJTl9CT09UXzMgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfY21kX2NfcGluc1tdID0geyBQSU5fQk9PVF8xNiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9jbGtfY19waW5zW10gPSB7IFBJTl9CT09UXzE3IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QwX2NfcGluc1tdID0geyBQSU4oQk9PVF8wLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9kMV9jX3BpbnNbXSA9IHsgUElOKEJPT1RfMSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDJfY19waW5zW10gPSB7IFBJTihCT09UXzIsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QzX2NfcGluc1tdID0geyBQSU4oQk9PVF8zLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9jbWRfY19waW5zW10gPSB7IFBJTihCT09UXzE2LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9jbGtfY19waW5zW10gPSB7IFBJTihCT09UXzE3LCAwKSB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfZDBfY19waW5zW10gPSB7IFBJTl9CT09UXzB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2QxM19jX3BpbnNbXSA9IHsgUElOX0JPT1RfMSwgUElOX0JPT1RfMiwKLQkJCQkJCVBJTl9CT09UXzMgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19kNDdfY19waW5zW10gPSB7IFBJTl9CT09UXzQsIFBJTl9CT09UXzUsCi0JCQkJCQlQSU5fQk9PVF82LCBQSU5fQk9PVF83IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfY21kX2NfcGluc1tdID0geyBQSU5fQk9PVF8xNiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2Nsa19jX3BpbnNbXSA9IHsgUElOX0JPT1RfMTcgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19kMF9jX3BpbnNbXSA9IHsgUElOKEJPT1RfMCwgMCl9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2QxM19jX3BpbnNbXSA9IHsgUElOKEJPT1RfMSwgMCksIFBJTihCT09UXzIsIDApLAorCQkJCQkJUElOKEJPT1RfMywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19kNDdfY19waW5zW10gPSB7IFBJTihCT09UXzQsIDApLCBQSU4oQk9PVF81LCAwKSwKKwkJCQkJCVBJTihCT09UXzYsIDApLCBQSU4oQk9PVF83LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2NtZF9jX3BpbnNbXSA9IHsgUElOKEJPT1RfMTYsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfY2xrX2NfcGluc1tdID0geyBQSU4oQk9PVF8xNywgMCkgfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2lvX3BpbnNbXSA9IHsgUElOX0JPT1RfMCwgUElOX0JPT1RfMSwKLQkJCQkJICAgICBQSU5fQk9PVF8yLCBQSU5fQk9PVF8zLAotCQkJCQkgICAgIFBJTl9CT09UXzQsIFBJTl9CT09UXzUsCi0JCQkJCSAgICAgUElOX0JPT1RfNiwgUElOX0JPT1RfNyB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2lvX2NlMF9waW5zW10gPSB7IFBJTl9CT09UXzggfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9pb19jZTFfcGluc1tdID0geyBQSU5fQk9PVF85IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfaW9fcmIwX3BpbnNbXSA9IHsgUElOX0JPT1RfMTAgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9hbGVfcGluc1tdID0geyBQSU5fQk9PVF8xMSB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2NsZV9waW5zW10gPSB7IFBJTl9CT09UXzEyIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfd2VuX2Nsa19waW5zW10gPSB7IFBJTl9CT09UXzEzIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfcmVuX2Nsa19waW5zW10gPSB7IFBJTl9CT09UXzE0IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfZHFzX3BpbnNbXSA9IHsgUElOX0JPT1RfMTUgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9jZTJfcGluc1tdID0geyBQSU5fQk9PVF8xNiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2NlM19waW5zW10gPSB7IFBJTl9CT09UXzE3IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfaW9fcGluc1tdID0geyBQSU4oQk9PVF8wLCAwKSwgUElOKEJPT1RfMSwgMCksCisJCQkJCSAgICAgUElOKEJPT1RfMiwgMCksIFBJTihCT09UXzMsIDApLAorCQkJCQkgICAgIFBJTihCT09UXzQsIDApLCBQSU4oQk9PVF81LCAwKSwKKwkJCQkJICAgICBQSU4oQk9PVF82LCAwKSwgUElOKEJPT1RfNywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9pb19jZTBfcGluc1tdID0geyBQSU4oQk9PVF84LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2lvX2NlMV9waW5zW10gPSB7IFBJTihCT09UXzksIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfaW9fcmIwX3BpbnNbXSA9IHsgUElOKEJPT1RfMTAsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfYWxlX3BpbnNbXSA9IHsgUElOKEJPT1RfMTEsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfY2xlX3BpbnNbXSA9IHsgUElOKEJPT1RfMTIsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfd2VuX2Nsa19waW5zW10gPSB7IFBJTihCT09UXzEzLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX3Jlbl9jbGtfcGluc1tdID0geyBQSU4oQk9PVF8xNCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9kcXNfcGluc1tdID0geyBQSU4oQk9PVF8xNSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9jZTJfcGluc1tdID0geyBQSU4oQk9PVF8xNiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9jZTNfcGluc1tdID0geyBQSU4oQk9PVF8xNywgMCkgfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub3JfZF9waW5zW10gPSB7IFBJTl9CT09UXzExIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5vcl9xX3BpbnNbXSA9IHsgUElOX0JPT1RfMTIgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbm9yX2NfcGluc1tdID0geyBQSU5fQk9PVF8xMyB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub3JfY3NfcGluc1tdID0geyBQSU5fQk9PVF8xOCB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub3JfZF9waW5zW10gPSB7IFBJTihCT09UXzExLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub3JfcV9waW5zW10gPSB7IFBJTihCT09UXzEyLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub3JfY19waW5zW10gPSB7IFBJTihCT09UXzEzLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub3JfY3NfcGluc1tdID0geyBQSU4oQk9PVF8xOCwgMCkgfTsKIAogLyogYmFuayBDQVJEICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QxX2JfcGluc1tdID0geyBQSU5fQ0FSRF8wIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QwX2JfcGluc1tdID0geyBQSU5fQ0FSRF8xIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2Nsa19iX3BpbnNbXSA9IHsgUElOX0NBUkRfMiB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9jbWRfYl9waW5zW10gPSB7IFBJTl9DQVJEXzMgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDNfYl9waW5zW10gPSB7IFBJTl9DQVJEXzQgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDJfYl9waW5zW10gPSB7IFBJTl9DQVJEXzUgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDFfYl9waW5zW10gPSB7IFBJTihDQVJEXzAsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QwX2JfcGluc1tdID0geyBQSU4oQ0FSRF8xLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9jbGtfYl9waW5zW10gPSB7IFBJTihDQVJEXzIsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2NtZF9iX3BpbnNbXSA9IHsgUElOKENBUkRfMywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDNfYl9waW5zW10gPSB7IFBJTihDQVJEXzQsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QyX2JfcGluc1tdID0geyBQSU4oQ0FSRF81LCAwKSB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfZDEzX2JfcGluc1tdID0geyBQSU5fQ0FSRF8wLCBQSU5fQ0FSRF80LAotCQkJCQkJUElOX0NBUkRfNSB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2QwX2JfcGluc1tdID0geyBQSU5fQ0FSRF8xIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfY2xrX2JfcGluc1tdID0geyBQSU5fQ0FSRF8yIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfY21kX2JfcGluc1tdID0geyBQSU5fQ0FSRF8zIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfZDEzX2JfcGluc1tdID0geyBQSU4oQ0FSRF8wLCAwKSwgUElOKENBUkRfNCwgMCksCisJCQkJCQlQSU4oQ0FSRF81LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2QwX2JfcGluc1tdID0geyBQSU4oQ0FSRF8xLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2Nsa19iX3BpbnNbXSA9IHsgUElOKENBUkRfMiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19jbWRfYl9waW5zW10gPSB7IFBJTihDQVJEXzMsIDApIH07CiAKIC8qIGJhbmsgQU8gKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF90eF9hb19hX3BpbnNbXSA9IHsgUElOX0dQSU9BT18wIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnhfYW9fYV9waW5zW10gPSB7IFBJTl9HUElPQU9fMSB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X2N0c19hb19hX3BpbnNbXSA9IHsgUElOX0dQSU9BT18yIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnRzX2FvX2FfcGluc1tdID0geyBQSU5fR1BJT0FPXzMgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF90eF9hb19hX3BpbnNbXSA9IHsgUElOKEdQSU9BT18wLCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnhfYW9fYV9waW5zW10gPSB7IFBJTihHUElPQU9fMSwgQU9fT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X2N0c19hb19hX3BpbnNbXSA9IHsgUElOKEdQSU9BT18yLCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnRzX2FvX2FfcGluc1tdID0geyBQSU4oR1BJT0FPXzMsIEFPX09GRikgfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByZW1vdGVfaW5wdXRfcGluc1tdID0geyBQSU5fR1BJT0FPXzcgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcmVtb3RlX2lucHV0X3BpbnNbXSA9IHsgUElOKEdQSU9BT183LCBBT19PRkYpIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NsYXZlX3Nja19hb19waW5zW10gPSB7IFBJTl9HUElPQU9fNCB9Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2xhdmVfc2RhX2FvX3BpbnNbXSA9IHsgUElOX0dQSU9BT181IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zbGF2ZV9zY2tfYW9fcGluc1tdID0geyBQSU4oR1BJT0FPXzQsIEFPX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NsYXZlX3NkYV9hb19waW5zW10gPSB7IFBJTihHUElPQU9fNSwgQU9fT0ZGKSB9OwogCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfdHhfYW9fYjBfcGluc1tdID0geyBQSU5fR1BJT0FPXzAgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9yeF9hb19iMF9waW5zW10gPSB7IFBJTl9HUElPQU9fMSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3R4X2FvX2IwX3BpbnNbXSA9IHsgUElOKEdQSU9BT18wLCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnhfYW9fYjBfcGluc1tdID0geyBQSU4oR1BJT0FPXzEsIEFPX09GRikgfTsKIAotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3R4X2FvX2IxX3BpbnNbXSA9IHsgUElOX0dQSU9BT180IH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnhfYW9fYjFfcGluc1tdID0geyBQSU5fR1BJT0FPXzUgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF90eF9hb19iMV9waW5zW10gPSB7IFBJTihHUElPQU9fNCwgQU9fT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J4X2FvX2IxX3BpbnNbXSA9IHsgUElOKEdQSU9BT181LCBBT19PRkYpIH07CiAKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX21zdF9zY2tfYW9fcGluc1tdID0geyBQSU5fR1BJT0FPXzQgfTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX21zdF9zZGFfYW9fcGluc1tdID0geyBQSU5fR1BJT0FPXzUgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX21zdF9zY2tfYW9fcGluc1tdID0geyBQSU4oR1BJT0FPXzQsIEFPX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX21zdF9zZGFfYW9fcGluc1tdID0geyBQSU4oR1BJT0FPXzUsIEFPX09GRikgfTsKIAogc3RhdGljIHN0cnVjdCBtZXNvbl9wbXhfZ3JvdXAgbWVzb244X2dyb3Vwc1tdID0gewotCUdQSU9fR1JPVVAoR1BJT1hfMCksCi0JR1BJT19HUk9VUChHUElPWF8xKSwKLQlHUElPX0dST1VQKEdQSU9YXzIpLAotCUdQSU9fR1JPVVAoR1BJT1hfMyksCi0JR1BJT19HUk9VUChHUElPWF80KSwKLQlHUElPX0dST1VQKEdQSU9YXzUpLAotCUdQSU9fR1JPVVAoR1BJT1hfNiksCi0JR1BJT19HUk9VUChHUElPWF83KSwKLQlHUElPX0dST1VQKEdQSU9YXzgpLAotCUdQSU9fR1JPVVAoR1BJT1hfOSksCi0JR1BJT19HUk9VUChHUElPWF8xMCksCi0JR1BJT19HUk9VUChHUElPWF8xMSksCi0JR1BJT19HUk9VUChHUElPWF8xMiksCi0JR1BJT19HUk9VUChHUElPWF8xMyksCi0JR1BJT19HUk9VUChHUElPWF8xNCksCi0JR1BJT19HUk9VUChHUElPWF8xNSksCi0JR1BJT19HUk9VUChHUElPWF8xNiksCi0JR1BJT19HUk9VUChHUElPWF8xNyksCi0JR1BJT19HUk9VUChHUElPWF8xOCksCi0JR1BJT19HUk9VUChHUElPWF8xOSksCi0JR1BJT19HUk9VUChHUElPWF8yMCksCi0JR1BJT19HUk9VUChHUElPWF8yMSksCi0JR1BJT19HUk9VUChHUElPWV8wKSwKLQlHUElPX0dST1VQKEdQSU9ZXzEpLAotCUdQSU9fR1JPVVAoR1BJT1lfMiksCi0JR1BJT19HUk9VUChHUElPWV8zKSwKLQlHUElPX0dST1VQKEdQSU9ZXzQpLAotCUdQSU9fR1JPVVAoR1BJT1lfNSksCi0JR1BJT19HUk9VUChHUElPWV82KSwKLQlHUElPX0dST1VQKEdQSU9ZXzcpLAotCUdQSU9fR1JPVVAoR1BJT1lfOCksCi0JR1BJT19HUk9VUChHUElPWV85KSwKLQlHUElPX0dST1VQKEdQSU9ZXzEwKSwKLQlHUElPX0dST1VQKEdQSU9ZXzExKSwKLQlHUElPX0dST1VQKEdQSU9ZXzEyKSwKLQlHUElPX0dST1VQKEdQSU9ZXzEzKSwKLQlHUElPX0dST1VQKEdQSU9ZXzE0KSwKLQlHUElPX0dST1VQKEdQSU9ZXzE1KSwKLQlHUElPX0dST1VQKEdQSU9ZXzE2KSwKLQlHUElPX0dST1VQKEdQSU9EVl8wKSwKLQlHUElPX0dST1VQKEdQSU9EVl8xKSwKLQlHUElPX0dST1VQKEdQSU9EVl8yKSwKLQlHUElPX0dST1VQKEdQSU9EVl8zKSwKLQlHUElPX0dST1VQKEdQSU9EVl80KSwKLQlHUElPX0dST1VQKEdQSU9EVl81KSwKLQlHUElPX0dST1VQKEdQSU9EVl82KSwKLQlHUElPX0dST1VQKEdQSU9EVl83KSwKLQlHUElPX0dST1VQKEdQSU9EVl84KSwKLQlHUElPX0dST1VQKEdQSU9EVl85KSwKLQlHUElPX0dST1VQKEdQSU9EVl8xMCksCi0JR1BJT19HUk9VUChHUElPRFZfMTEpLAotCUdQSU9fR1JPVVAoR1BJT0RWXzEyKSwKLQlHUElPX0dST1VQKEdQSU9EVl8xMyksCi0JR1BJT19HUk9VUChHUElPRFZfMTQpLAotCUdQSU9fR1JPVVAoR1BJT0RWXzE1KSwKLQlHUElPX0dST1VQKEdQSU9EVl8xNiksCi0JR1BJT19HUk9VUChHUElPRFZfMTcpLAotCUdQSU9fR1JPVVAoR1BJT0RWXzE4KSwKLQlHUElPX0dST1VQKEdQSU9EVl8xOSksCi0JR1BJT19HUk9VUChHUElPRFZfMjApLAotCUdQSU9fR1JPVVAoR1BJT0RWXzIxKSwKLQlHUElPX0dST1VQKEdQSU9EVl8yMiksCi0JR1BJT19HUk9VUChHUElPRFZfMjMpLAotCUdQSU9fR1JPVVAoR1BJT0RWXzI0KSwKLQlHUElPX0dST1VQKEdQSU9EVl8yNSksCi0JR1BJT19HUk9VUChHUElPRFZfMjYpLAotCUdQSU9fR1JPVVAoR1BJT0RWXzI3KSwKLQlHUElPX0dST1VQKEdQSU9EVl8yOCksCi0JR1BJT19HUk9VUChHUElPRFZfMjkpLAotCUdQSU9fR1JPVVAoR1BJT0hfMCksCi0JR1BJT19HUk9VUChHUElPSF8xKSwKLQlHUElPX0dST1VQKEdQSU9IXzIpLAotCUdQSU9fR1JPVVAoR1BJT0hfMyksCi0JR1BJT19HUk9VUChHUElPSF80KSwKLQlHUElPX0dST1VQKEdQSU9IXzUpLAotCUdQSU9fR1JPVVAoR1BJT0hfNiksCi0JR1BJT19HUk9VUChHUElPSF83KSwKLQlHUElPX0dST1VQKEdQSU9IXzgpLAotCUdQSU9fR1JPVVAoR1BJT0hfOSksCi0JR1BJT19HUk9VUChHUElPWl8wKSwKLQlHUElPX0dST1VQKEdQSU9aXzEpLAotCUdQSU9fR1JPVVAoR1BJT1pfMiksCi0JR1BJT19HUk9VUChHUElPWl8zKSwKLQlHUElPX0dST1VQKEdQSU9aXzQpLAotCUdQSU9fR1JPVVAoR1BJT1pfNSksCi0JR1BJT19HUk9VUChHUElPWl82KSwKLQlHUElPX0dST1VQKEdQSU9aXzcpLAotCUdQSU9fR1JPVVAoR1BJT1pfOCksCi0JR1BJT19HUk9VUChHUElPWl85KSwKLQlHUElPX0dST1VQKEdQSU9aXzEwKSwKLQlHUElPX0dST1VQKEdQSU9aXzExKSwKLQlHUElPX0dST1VQKEdQSU9aXzEyKSwKLQlHUElPX0dST1VQKEdQSU9aXzEzKSwKLQlHUElPX0dST1VQKEdQSU9aXzE0KSwKLQlHUElPX0dST1VQKEdQSU9BT18wKSwKLQlHUElPX0dST1VQKEdQSU9BT18xKSwKLQlHUElPX0dST1VQKEdQSU9BT18yKSwKLQlHUElPX0dST1VQKEdQSU9BT18zKSwKLQlHUElPX0dST1VQKEdQSU9BT180KSwKLQlHUElPX0dST1VQKEdQSU9BT181KSwKLQlHUElPX0dST1VQKEdQSU9BT182KSwKLQlHUElPX0dST1VQKEdQSU9BT183KSwKLQlHUElPX0dST1VQKEdQSU9BT184KSwKLQlHUElPX0dST1VQKEdQSU9BT185KSwKLQlHUElPX0dST1VQKEdQSU9BT18xMCksCi0JR1BJT19HUk9VUChHUElPQU9fMTEpLAotCUdQSU9fR1JPVVAoR1BJT0FPXzEyKSwKLQlHUElPX0dST1VQKEdQSU9BT18xMyksCi0JR1BJT19HUk9VUChHUElPX0JTRF9FTiksCi0JR1BJT19HUk9VUChHUElPX1RFU1RfTiksCisJR1BJT19HUk9VUChHUElPWF8wLCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzEsIDApLAorCUdQSU9fR1JPVVAoR1BJT1hfMiwgMCksCisJR1BJT19HUk9VUChHUElPWF8zLCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzQsIDApLAorCUdQSU9fR1JPVVAoR1BJT1hfNSwgMCksCisJR1BJT19HUk9VUChHUElPWF82LCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzcsIDApLAorCUdQSU9fR1JPVVAoR1BJT1hfOCwgMCksCisJR1BJT19HUk9VUChHUElPWF85LCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzEwLCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzExLCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzEyLCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzEzLCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzE0LCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzE1LCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzE2LCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzE3LCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzE4LCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzE5LCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzIwLCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzIxLCAwKSwKKwlHUElPX0dST1VQKEdQSU9ZXzAsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMSwgMCksCisJR1BJT19HUk9VUChHUElPWV8yLCAwKSwKKwlHUElPX0dST1VQKEdQSU9ZXzMsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfNCwgMCksCisJR1BJT19HUk9VUChHUElPWV81LCAwKSwKKwlHUElPX0dST1VQKEdQSU9ZXzYsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfNywgMCksCisJR1BJT19HUk9VUChHUElPWV84LCAwKSwKKwlHUElPX0dST1VQKEdQSU9ZXzksIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTAsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTEsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTIsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTMsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTQsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTUsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTYsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzAsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzEsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzIsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzMsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzQsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzUsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzYsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzcsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzgsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzksIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzEwLCAwKSwKKwlHUElPX0dST1VQKEdQSU9EVl8xMSwgMCksCisJR1BJT19HUk9VUChHUElPRFZfMTIsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzEzLCAwKSwKKwlHUElPX0dST1VQKEdQSU9EVl8xNCwgMCksCisJR1BJT19HUk9VUChHUElPRFZfMTUsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzE2LCAwKSwKKwlHUElPX0dST1VQKEdQSU9EVl8xNywgMCksCisJR1BJT19HUk9VUChHUElPRFZfMTgsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzE5LCAwKSwKKwlHUElPX0dST1VQKEdQSU9EVl8yMCwgMCksCisJR1BJT19HUk9VUChHUElPRFZfMjEsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzIyLCAwKSwKKwlHUElPX0dST1VQKEdQSU9EVl8yMywgMCksCisJR1BJT19HUk9VUChHUElPRFZfMjQsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzI1LCAwKSwKKwlHUElPX0dST1VQKEdQSU9EVl8yNiwgMCksCisJR1BJT19HUk9VUChHUElPRFZfMjcsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzI4LCAwKSwKKwlHUElPX0dST1VQKEdQSU9EVl8yOSwgMCksCisJR1BJT19HUk9VUChHUElPSF8wLCAwKSwKKwlHUElPX0dST1VQKEdQSU9IXzEsIDApLAorCUdQSU9fR1JPVVAoR1BJT0hfMiwgMCksCisJR1BJT19HUk9VUChHUElPSF8zLCAwKSwKKwlHUElPX0dST1VQKEdQSU9IXzQsIDApLAorCUdQSU9fR1JPVVAoR1BJT0hfNSwgMCksCisJR1BJT19HUk9VUChHUElPSF82LCAwKSwKKwlHUElPX0dST1VQKEdQSU9IXzcsIDApLAorCUdQSU9fR1JPVVAoR1BJT0hfOCwgMCksCisJR1BJT19HUk9VUChHUElPSF85LCAwKSwKKwlHUElPX0dST1VQKEdQSU9aXzAsIDApLAorCUdQSU9fR1JPVVAoR1BJT1pfMSwgMCksCisJR1BJT19HUk9VUChHUElPWl8yLCAwKSwKKwlHUElPX0dST1VQKEdQSU9aXzMsIDApLAorCUdQSU9fR1JPVVAoR1BJT1pfNCwgMCksCisJR1BJT19HUk9VUChHUElPWl81LCAwKSwKKwlHUElPX0dST1VQKEdQSU9aXzYsIDApLAorCUdQSU9fR1JPVVAoR1BJT1pfNywgMCksCisJR1BJT19HUk9VUChHUElPWl84LCAwKSwKKwlHUElPX0dST1VQKEdQSU9aXzksIDApLAorCUdQSU9fR1JPVVAoR1BJT1pfMTAsIDApLAorCUdQSU9fR1JPVVAoR1BJT1pfMTEsIDApLAorCUdQSU9fR1JPVVAoR1BJT1pfMTIsIDApLAorCUdQSU9fR1JPVVAoR1BJT1pfMTMsIDApLAorCUdQSU9fR1JPVVAoR1BJT1pfMTQsIDApLAorCUdQSU9fR1JPVVAoR1BJT0FPXzAsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fMSwgQU9fT0ZGKSwKKwlHUElPX0dST1VQKEdQSU9BT18yLCBBT19PRkYpLAorCUdQSU9fR1JPVVAoR1BJT0FPXzMsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fNCwgQU9fT0ZGKSwKKwlHUElPX0dST1VQKEdQSU9BT181LCBBT19PRkYpLAorCUdQSU9fR1JPVVAoR1BJT0FPXzYsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fNywgQU9fT0ZGKSwKKwlHUElPX0dST1VQKEdQSU9BT184LCBBT19PRkYpLAorCUdQSU9fR1JPVVAoR1BJT0FPXzksIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fMTAsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fMTEsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fMTIsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fMTMsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPX0JTRF9FTiwgQU9fT0ZGKSwKKwlHUElPX0dST1VQKEdQSU9fVEVTVF9OLCBBT19PRkYpLAogCiAJLyogYmFuayBYICovCiAJR1JPVVAoc2RfZDBfYSwJCTgsCTUpLApAQCAtMTA0NSwxOSArOTA3LDE5IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IG1lc29uX2JhbmsgbWVzb244X2JhbmtzW10gPSB7Ci0JLyogICBuYW1lICAgIGZpcnN0ICAgICAgICAgbGFzdCAgICAgICAgICAgICBwdWxsZW4gIHB1bGwgICAgIGRpciAgICAgb3V0ICAgICBpbiAgKi8KLQlCQU5LKCJYIiwgICAgUElOX0dQSU9YXzAsICBQSU5fR1BJT1hfMjEsICAgIDQsICAwLCAgNCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMiwgIDApLAotCUJBTksoIlkiLCAgICBQSU5fR1BJT1lfMCwgIFBJTl9HUElPWV8xNiwgICAgMywgIDAsICAzLCAgMCwgIDMsICAwLCAgNCwgIDAsICA1LCAgMCksCi0JQkFOSygiRFYiLCAgIFBJTl9HUElPRFZfMCwgUElOX0dQSU9EVl8yOSwgICAwLCAgMCwgIDAsICAwLCAgNywgIDAsICA4LCAgMCwgIDksICAwKSwKLQlCQU5LKCJIIiwgICAgUElOX0dQSU9IXzAsICBQSU5fR1BJT0hfOSwgICAgIDEsIDE2LCAgMSwgMTYsICA5LCAxOSwgMTAsIDE5LCAxMSwgMTkpLAotCUJBTksoIloiLCAgICBQSU5fR1BJT1pfMCwgIFBJTl9HUElPWl8xNCwgICAgMSwgIDAsICAxLCAgMCwgIDMsIDE3LCAgNCwgMTcsICA1LCAxNyksCi0JQkFOSygiQ0FSRCIsIFBJTl9DQVJEXzAsICAgUElOX0NBUkRfNiwgICAgICAyLCAyMCwgIDIsIDIwLCAgMCwgMjIsICAxLCAyMiwgIDIsIDIyKSwKLQlCQU5LKCJCT09UIiwgUElOX0JPT1RfMCwgICBQSU5fQk9PVF8xOCwgICAgIDIsICAwLCAgMiwgIDAsICA5LCAgMCwgMTAsICAwLCAxMSwgIDApLAorCS8qICAgbmFtZSAgICBmaXJzdCAgICAgICAgICAgICBsYXN0ICAgICAgICAgICAgICAgICBwdWxsZW4gIHB1bGwgICAgZGlyICAgICBvdXQgICAgIGluICAqLworCUJBTksoIlgiLCAgICBQSU4oR1BJT1hfMCwgMCksICBQSU4oR1BJT1hfMjEsIDApLCAgICA0LCAgMCwgIDQsICAwLCAgMCwgIDAsICAxLCAgMCwgIDIsICAwKSwKKwlCQU5LKCJZIiwgICAgUElOKEdQSU9ZXzAsIDApLCAgUElOKEdQSU9ZXzE2LCAwKSwgICAgMywgIDAsICAzLCAgMCwgIDMsICAwLCAgNCwgIDAsICA1LCAgMCksCisJQkFOSygiRFYiLCAgIFBJTihHUElPRFZfMCwgMCksIFBJTihHUElPRFZfMjksIDApLCAgIDAsICAwLCAgMCwgIDAsICA3LCAgMCwgIDgsICAwLCAgOSwgIDApLAorCUJBTksoIkgiLCAgICBQSU4oR1BJT0hfMCwgMCksICBQSU4oR1BJT0hfOSwgMCksICAgICAxLCAxNiwgIDEsIDE2LCAgOSwgMTksIDEwLCAxOSwgMTEsIDE5KSwKKwlCQU5LKCJaIiwgICAgUElOKEdQSU9aXzAsIDApLCAgUElOKEdQSU9aXzE0LCAwKSwgICAgMSwgIDAsICAxLCAgMCwgIDMsIDE3LCAgNCwgMTcsICA1LCAxNyksCisJQkFOSygiQ0FSRCIsIFBJTihDQVJEXzAsIDApLCAgIFBJTihDQVJEXzYsIDApLCAgICAgIDIsIDIwLCAgMiwgMjAsICAwLCAyMiwgIDEsIDIyLCAgMiwgMjIpLAorCUJBTksoIkJPT1QiLCBQSU4oQk9PVF8wLCAwKSwgICBQSU4oQk9PVF8xOCwgMCksICAgICAyLCAgMCwgIDIsICAwLCAgOSwgIDAsIDEwLCAgMCwgMTEsICAwKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgbWVzb25fYmFuayBtZXNvbjhfYW9fYmFua3NbXSA9IHsKLQkvKiAgIG5hbWUgICAgZmlyc3QgICAgICAgICBsYXN0ICAgICAgICAgICAgIHB1bGxlbiAgcHVsbCAgICAgZGlyICAgICBvdXQgICAgIGluICAqLwotCUJBTksoIkFPIiwgICBQSU5fR1BJT0FPXzAsIFBJTl9HUElPX1RFU1RfTiwgMCwgIDAsICAwLCAxNiwgIDAsICAwLCAgMCwgMTYsICAxLCAgMCksCisJLyogICBuYW1lICAgIGZpcnN0ICAgICAgICAgICAgICAgICAgbGFzdCAgICAgICAgICAgICAgICAgICAgICBwdWxsZW4gIHB1bGwgICAgZGlyICAgICBvdXQgICAgIGluICAqLworCUJBTksoIkFPIiwgICBQSU4oR1BJT0FPXzAsIEFPX09GRiksIFBJTihHUElPX1RFU1RfTiwgQU9fT0ZGKSwgMCwgIDAsICAwLCAxNiwgIDAsICAwLCAgMCwgMTYsICAxLCAgMCksCiB9OwogCiBzdGF0aWMgc3RydWN0IG1lc29uX2RvbWFpbl9kYXRhIG1lc29uOF9kb21haW5fZGF0YVtdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244Yi5jIGIvZHJpdmVycy9waW5jdHJsL21lc29uL3BpbmN0cmwtbWVzb244Yi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmN2VhNjIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvbWVzb24vcGluY3RybC1tZXNvbjhiLmMKQEAgLTAsMCArMSw4OTkgQEAKKy8qCisgKiBQaW4gY29udHJvbGxlciBhbmQgR1BJTyBkcml2ZXIgZm9yIEFtbG9naWMgTWVzb244Yi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgRW5kbGVzcyBNb2JpbGUsIEluYy4KKyAqIEF1dGhvcjogQ2FybG8gQ2Fpb25lIDxjYXJsb0BlbmRsZXNzbS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8ZHQtYmluZGluZ3MvZ3Bpby9tZXNvbjhiLWdwaW8uaD4KKyNpbmNsdWRlICJwaW5jdHJsLW1lc29uLmgiCisKKyNkZWZpbmUgQU9fT0ZGCTEzMAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgbWVzb244Yl9waW5zW10gPSB7CisJTUVTT05fUElOKEdQSU9YXzAsIDApLAorCU1FU09OX1BJTihHUElPWF8xLCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfMiwgMCksCisJTUVTT05fUElOKEdQSU9YXzMsIDApLAorCU1FU09OX1BJTihHUElPWF80LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfNSwgMCksCisJTUVTT05fUElOKEdQSU9YXzYsIDApLAorCU1FU09OX1BJTihHUElPWF83LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfOCwgMCksCisJTUVTT05fUElOKEdQSU9YXzksIDApLAorCU1FU09OX1BJTihHUElPWF8xMCwgMCksCisJTUVTT05fUElOKEdQSU9YXzExLCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfMTYsIDApLAorCU1FU09OX1BJTihHUElPWF8xNywgMCksCisJTUVTT05fUElOKEdQSU9YXzE4LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1hfMTksIDApLAorCU1FU09OX1BJTihHUElPWF8yMCwgMCksCisJTUVTT05fUElOKEdQSU9YXzIxLCAwKSwKKworCU1FU09OX1BJTihHUElPWV8wLCAwKSwKKwlNRVNPTl9QSU4oR1BJT1lfMSwgMCksCisJTUVTT05fUElOKEdQSU9ZXzMsIDApLAorCU1FU09OX1BJTihHUElPWV82LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1lfNywgMCksCisJTUVTT05fUElOKEdQSU9ZXzgsIDApLAorCU1FU09OX1BJTihHUElPWV85LCAwKSwKKwlNRVNPTl9QSU4oR1BJT1lfMTAsIDApLAorCU1FU09OX1BJTihHUElPWV8xMSwgMCksCisJTUVTT05fUElOKEdQSU9ZXzEyLCAwKSwKKwlNRVNPTl9QSU4oR1BJT1lfMTMsIDApLAorCU1FU09OX1BJTihHUElPWV8xNCwgMCksCisKKwlNRVNPTl9QSU4oR1BJT0RWXzksIDApLAorCU1FU09OX1BJTihHUElPRFZfMjQsIDApLAorCU1FU09OX1BJTihHUElPRFZfMjUsIDApLAorCU1FU09OX1BJTihHUElPRFZfMjYsIDApLAorCU1FU09OX1BJTihHUElPRFZfMjcsIDApLAorCU1FU09OX1BJTihHUElPRFZfMjgsIDApLAorCU1FU09OX1BJTihHUElPRFZfMjksIDApLAorCisJTUVTT05fUElOKEdQSU9IXzAsIDApLAorCU1FU09OX1BJTihHUElPSF8xLCAwKSwKKwlNRVNPTl9QSU4oR1BJT0hfMiwgMCksCisJTUVTT05fUElOKEdQSU9IXzMsIDApLAorCU1FU09OX1BJTihHUElPSF80LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0hfNSwgMCksCisJTUVTT05fUElOKEdQSU9IXzYsIDApLAorCU1FU09OX1BJTihHUElPSF83LCAwKSwKKwlNRVNPTl9QSU4oR1BJT0hfOCwgMCksCisJTUVTT05fUElOKEdQSU9IXzksIDApLAorCisJTUVTT05fUElOKENBUkRfMCwgMCksCisJTUVTT05fUElOKENBUkRfMSwgMCksCisJTUVTT05fUElOKENBUkRfMiwgMCksCisJTUVTT05fUElOKENBUkRfMywgMCksCisJTUVTT05fUElOKENBUkRfNCwgMCksCisJTUVTT05fUElOKENBUkRfNSwgMCksCisJTUVTT05fUElOKENBUkRfNiwgMCksCisKKwlNRVNPTl9QSU4oQk9PVF8wLCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8xLCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8yLCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8zLCAwKSwKKwlNRVNPTl9QSU4oQk9PVF80LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF81LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF82LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF83LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF84LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF85LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8xMCwgMCksCisJTUVTT05fUElOKEJPT1RfMTEsIDApLAorCU1FU09OX1BJTihCT09UXzEyLCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8xMywgMCksCisJTUVTT05fUElOKEJPT1RfMTQsIDApLAorCU1FU09OX1BJTihCT09UXzE1LCAwKSwKKwlNRVNPTl9QSU4oQk9PVF8xNiwgMCksCisJTUVTT05fUElOKEJPT1RfMTcsIDApLAorCU1FU09OX1BJTihCT09UXzE4LCAwKSwKKworCU1FU09OX1BJTihESUZfMF9QLCAwKSwKKwlNRVNPTl9QSU4oRElGXzBfTiwgMCksCisJTUVTT05fUElOKERJRl8xX1AsIDApLAorCU1FU09OX1BJTihESUZfMV9OLCAwKSwKKwlNRVNPTl9QSU4oRElGXzJfUCwgMCksCisJTUVTT05fUElOKERJRl8yX04sIDApLAorCU1FU09OX1BJTihESUZfM19QLCAwKSwKKwlNRVNPTl9QSU4oRElGXzNfTiwgMCksCisJTUVTT05fUElOKERJRl80X1AsIDApLAorCU1FU09OX1BJTihESUZfNF9OLCAwKSwKKworCU1FU09OX1BJTihHUElPQU9fMCwgQU9fT0ZGKSwKKwlNRVNPTl9QSU4oR1BJT0FPXzEsIEFPX09GRiksCisJTUVTT05fUElOKEdQSU9BT18yLCBBT19PRkYpLAorCU1FU09OX1BJTihHUElPQU9fMywgQU9fT0ZGKSwKKwlNRVNPTl9QSU4oR1BJT0FPXzQsIEFPX09GRiksCisJTUVTT05fUElOKEdQSU9BT181LCBBT19PRkYpLAorCU1FU09OX1BJTihHUElPQU9fNiwgQU9fT0ZGKSwKKwlNRVNPTl9QSU4oR1BJT0FPXzcsIEFPX09GRiksCisJTUVTT05fUElOKEdQSU9BT184LCBBT19PRkYpLAorCU1FU09OX1BJTihHUElPQU9fOSwgQU9fT0ZGKSwKKwlNRVNPTl9QSU4oR1BJT0FPXzEwLCBBT19PRkYpLAorCU1FU09OX1BJTihHUElPQU9fMTEsIEFPX09GRiksCisJTUVTT05fUElOKEdQSU9BT18xMiwgQU9fT0ZGKSwKKwlNRVNPTl9QSU4oR1BJT0FPXzEzLCBBT19PRkYpLAorCU1FU09OX1BJTihHUElPX0JTRF9FTiwgQU9fT0ZGKSwKKwlNRVNPTl9QSU4oR1BJT19URVNUX04sIEFPX09GRiksCit9OworCisvKiBiYW5rIFggKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDBfYV9waW5zW10JPSB7IFBJTihHUElPWF8wLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9kMV9hX3BpbnNbXQk9IHsgUElOKEdQSU9YXzEsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QyX2FfcGluc1tdCT0geyBQSU4oR1BJT1hfMiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDNfYV9waW5zW10JPSB7IFBJTihHUElPWF8zLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2QwXzBfYV9waW5zW10JPSB7IFBJTihHUElPWF80LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2Q0N19hX3BpbnNbXQk9IHsgUElOKEdQSU9YXzQsIDApLCBQSU4oR1BJT1hfNSwgMCksCisJCQkJCQkgICAgUElOKEdQSU9YXzYsIDApLCBQSU4oR1BJT1hfNywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19kMTNfMF9hX3BpbnNbXQk9IHsgUElOKEdQSU9YXzUsIDApLCBQSU4oR1BJT1hfNiwgMCksCisJCQkJCQkgICAgUElOKEdQSU9YXzcsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2Nsa19hX3BpbnNbXQk9IHsgUElOKEdQSU9YXzgsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2NtZF9hX3BpbnNbXQk9IHsgUElOKEdQSU9YXzksIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHh0YWxfMzJrX291dF9waW5zW10JPSB7IFBJTihHUElPWF8xMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgeHRhbF8yNG1fb3V0X3BpbnNbXQk9IHsgUElOKEdQSU9YXzExLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3R4X2IwX3BpbnNbXQk9IHsgUElOKEdQSU9YXzE2LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J4X2IwX3BpbnNbXQk9IHsgUElOKEdQSU9YXzE3LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X2N0c19iMF9waW5zW10JPSB7IFBJTihHUElPWF8xOCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9ydHNfYjBfcGluc1tdCT0geyBQSU4oR1BJT1hfMTksIDApIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19kMF8xX2FfcGluc1tdCT0geyBQSU4oR1BJT1hfMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19kMTNfMV9hX3BpbnNbXQk9IHsgUElOKEdQSU9YXzEsIDApLCBQSU4oR1BJT1hfMiwgMCksCisJCQkJCQkgICAgUElOKEdQSU9YXzMsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBjbV9vdXRfYV9waW5zW10JPSB7IFBJTihHUElPWF80LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY21faW5fYV9waW5zW10JPSB7IFBJTihHUElPWF81LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY21fZnNfYV9waW5zW10JPSB7IFBJTihHUElPWF82LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY21fY2xrX2FfcGluc1tdCT0geyBQSU4oR1BJT1hfNywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19jbGtfYV9waW5zW10JPSB7IFBJTihHUElPWF84LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2NtZF9hX3BpbnNbXQk9IHsgUElOKEdQSU9YXzksIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV92c18wX3BpbnNbXQk9IHsgUElOKEdQSU9YXzEwLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fZV9waW5zW10JCT0geyBQSU4oR1BJT1hfMTAsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV92c18xX3BpbnNbXQk9IHsgUElOKEdQSU9YXzExLCAwKSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfdHhfYV9waW5zW10JPSB7IFBJTihHUElPWF80LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J4X2FfcGluc1tdCT0geyBQSU4oR1BJT1hfNSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9jdHNfYV9waW5zW10JPSB7IFBJTihHUElPWF82LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J0c19hX3BpbnNbXQk9IHsgUElOKEdQSU9YXzcsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfdHhfYjFfcGluc1tdCT0geyBQSU4oR1BJT1hfOCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9yeF9iMV9waW5zW10JPSB7IFBJTihHUElPWF85LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X2N0c19iMV9waW5zW10JPSB7IFBJTihHUElPWF8xMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9ydHNfYjFfcGluc1tdCT0geyBQSU4oR1BJT1hfMjAsIDApIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaXNvNzgxNl8wX2Nsa19waW5zW10JPSB7IFBJTihHUElPWF82LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpc283ODE2XzBfZGF0YV9waW5zW10JPSB7IFBJTihHUElPWF83LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzcGlfc2Nsa18wX3BpbnNbXQk9IHsgUElOKEdQSU9YXzgsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNwaV9taXNvXzBfcGluc1tdCT0geyBQSU4oR1BJT1hfOSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX21vc2lfMF9waW5zW10JPSB7IFBJTihHUElPWF8xMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaXNvNzgxNl9kZXRfcGluc1tdCT0geyBQSU4oR1BJT1hfMTYsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGlzbzc4MTZfcmVzZXRfcGluc1tdCT0geyBQSU4oR1BJT1hfMTcsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGlzbzc4MTZfMV9jbGtfcGluc1tdCT0geyBQSU4oR1BJT1hfMTgsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGlzbzc4MTZfMV9kYXRhX3BpbnNbXQk9IHsgUElOKEdQSU9YXzE5LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzcGlfc3MwXzBfcGluc1tdCT0geyBQSU4oR1BJT1hfMjAsIDApIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHNpbl9jbGtfYl9waW5zW10JPSB7IFBJTihHUElPWF84LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0c2luX3NvcF9iX3BpbnNbXQk9IHsgUElOKEdQSU9YXzksIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHRzaW5fZDBfYl9waW5zW10JPSB7IFBJTihHUElPWF8xMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX2JfcGluc1tdCQk9IHsgUElOKEdQSU9YXzExLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2QwX3BpbnNbXQk9IHsgUElOKEdQSU9YXzE2LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2NrX2QwX3BpbnNbXQk9IHsgUElOKEdQSU9YXzE3LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB0c2luX2RfdmFsaWRfYl9waW5zW10gPSB7IFBJTihHUElPWF8yMCwgMCkgfTsKKworLyogYmFuayBZICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHRzaW5fZF92YWxpZF9hX3BpbnNbXSA9IHsgUElOKEdQSU9ZXzAsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHRzaW5fc29wX2FfcGluc1tdCT0geyBQSU4oR1BJT1lfMSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHNpbl9kMTdfYV9waW5zW10JPSB7IFBJTihHUElPWV82LCAwKSwgUElOKEdQSU9ZXzcsIDApLAorCQkJCQkJICAgIFBJTihHUElPWV8xMCwgMCksIFBJTihHUElPWV8xMSwgMCksCisJCQkJCQkgICAgUElOKEdQSU9ZXzEyLCAwKSwgUElOKEdQSU9ZXzEzLCAwKSwKKwkJCQkJCSAgICBQSU4oR1BJT1lfMTQsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHRzaW5fY2xrX2FfcGluc1tdCT0geyBQSU4oR1BJT1lfOCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdHNpbl9kMF9hX3BpbnNbXQk9IHsgUElOKEdQSU9ZXzksIDApIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BkaWZfb3V0XzBfcGluc1tdCT0geyBQSU4oR1BJT1lfMywgMCkgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB4dGFsXzI0bV9waW5zW10JPSB7IFBJTihHUElPWV8zLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpc283ODE2XzJfY2xrX3BpbnNbXQk9IHsgUElOKEdQSU9ZXzEzLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpc283ODE2XzJfZGF0YV9waW5zW10gPSB7IFBJTihHUElPWV8xNCwgMCkgfTsKKworLyogYmFuayBEViAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fZF9waW5zW10JCT0geyBQSU4oR1BJT0RWXzI4LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fYzBfcGluc1tdCQk9IHsgUElOKEdQSU9EVl8yOSwgMCkgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fdnNfMl9waW5zW10JPSB7IFBJTihHUElPRFZfOSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcHdtX3ZzXzNfcGluc1tdCT0geyBQSU4oR1BJT0RWXzI4LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwd21fdnNfNF9waW5zW10JPSB7IFBJTihHUElPRFZfMjksIDApIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgeHRhbDI0X291dF9waW5zW10JPSB7IFBJTihHUElPRFZfMjksIDApIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF90eF9jX3BpbnNbXQk9IHsgUElOKEdQSU9EVl8yNCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9yeF9jX3BpbnNbXQk9IHsgUElOKEdQSU9EVl8yNSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9jdHNfY19waW5zW10JPSB7IFBJTihHUElPRFZfMjYsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnRzX2NfcGluc1tdCT0geyBQSU4oR1BJT0RWXzI3LCAwKSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9jMV9waW5zW10JCT0geyBQSU4oR1BJT0RWXzksIDApIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9hX3BpbnNbXQk9IHsgUElOKEdQSU9EVl8yNCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3Nja19hX3BpbnNbXQk9IHsgUElOKEdQSU9EVl8yNSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9iMF9waW5zW10JPSB7IFBJTihHUElPRFZfMjYsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfYjBfcGluc1tdCT0geyBQSU4oR1BJT0RWXzI3LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2MwX3BpbnNbXQk9IHsgUElOKEdQSU9EVl8yOCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3Nja19jMF9waW5zW10JPSB7IFBJTihHUElPRFZfMjksIDApIH07CisKKy8qIGJhbmsgSCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBoZG1pX2hwZF9waW5zW10JPSB7IFBJTihHUElPSF8wLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBoZG1pX3NkYV9waW5zW10JPSB7IFBJTihHUElPSF8xLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBoZG1pX3NjbF9waW5zW10JPSB7IFBJTihHUElPSF8yLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBoZG1pX2NlY18wX3BpbnNbXQk9IHsgUElOKEdQSU9IXzMsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF90eGQxXzBfcGluc1tdCT0geyBQSU4oR1BJT0hfNSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX3R4ZDBfMF9waW5zW10JPSB7IFBJTihHUElPSF82LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjbGtfMjRtX291dF9waW5zW10JPSB7IFBJTihHUElPSF85LCAwKSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNwaV9zczFfcGluc1tdCT0geyBQSU4oR1BJT0hfMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX3NzMl9waW5zW10JPSB7IFBJTihHUElPSF8xLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzcGlfc3MwXzFfcGluc1tdCT0geyBQSU4oR1BJT0hfMywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BpX21pc29fMV9waW5zW10JPSB7IFBJTihHUElPSF80LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzcGlfbW9zaV8xX3BpbnNbXQk9IHsgUElOKEdQSU9IXzUsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNwaV9zY2xrXzFfcGluc1tdCT0geyBQSU4oR1BJT0hfNiwgMCkgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfdHhkM19waW5zW10JPSB7IFBJTihHUElPSF83LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfdHhkMl9waW5zW10JPSB7IFBJTihHUElPSF84LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfdHhfY2xrX3BpbnNbXQk9IHsgUElOKEdQSU9IXzksIDApIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3NkYV9iMV9waW5zW10JPSB7IFBJTihHUElPSF8zLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2NrX2IxX3BpbnNbXQk9IHsgUElOKEdQSU9IXzQsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zZGFfYzFfcGluc1tdCT0geyBQSU4oR1BJT0hfNSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3Nja19jMV9waW5zW10JPSB7IFBJTihHUElPSF82LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2QxX3BpbnNbXQk9IHsgUElOKEdQSU9IXzcsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19zY2tfZDFfcGluc1tdCT0geyBQSU4oR1BJT0hfOCwgMCkgfTsKKworLyogYmFuayBCT09UICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfaW9fcGluc1tdCT0geyBQSU4oQk9PVF8wLCAwKSwgUElOKEJPT1RfMSwgMCksCisJCQkJCQkgICAgUElOKEJPT1RfMiwgMCksIFBJTihCT09UXzMsIDApLAorCQkJCQkJICAgIFBJTihCT09UXzQsIDApLCBQSU4oQk9PVF81LCAwKSwKKwkJCQkJCSAgICBQSU4oQk9PVF82LCAwKSwgUElOKEJPT1RfNywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9pb19jZTBfcGluc1tdCT0geyBQSU4oQk9PVF84LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2lvX2NlMV9waW5zW10JPSB7IFBJTihCT09UXzksIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfaW9fcmIwX3BpbnNbXQk9IHsgUElOKEJPT1RfMTAsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfYWxlX3BpbnNbXQk9IHsgUElOKEJPT1RfMTEsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfY2xlX3BpbnNbXQk9IHsgUElOKEJPT1RfMTIsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5hbmRfd2VuX2Nsa19waW5zW10JPSB7IFBJTihCT09UXzEzLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX3Jlbl9jbGtfcGluc1tdCT0geyBQSU4oQk9PVF8xNCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbmFuZF9kcXNfMF9waW5zW10JPSB7IFBJTihCT09UXzE1LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuYW5kX2Rxc18xX3BpbnNbXQk9IHsgUElOKEJPT1RfMTgsIDApIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19kMF9jX3BpbnNbXQk9IHsgUElOKEJPT1RfMCwgMCl9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2QxM19jX3BpbnNbXQk9IHsgUElOKEJPT1RfMSwgMCksIFBJTihCT09UXzIsIDApLAorCQkJCQkJICAgIFBJTihCT09UXzMsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfZDQ3X2NfcGluc1tdCT0geyBQSU4oQk9PVF80LCAwKSwgUElOKEJPT1RfNSwgMCksCisJCQkJCQkgICAgUElOKEJPT1RfNiwgMCksIFBJTihCT09UXzcsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfY2xrX2NfcGluc1tdCT0geyBQSU4oQk9PVF84LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZHhjX2NtZF9jX3BpbnNbXQk9IHsgUElOKEJPT1RfMTAsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5vcl9kX3BpbnNbXQkJPSB7IFBJTihCT09UXzExLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBub3JfcV9waW5zW10JCT0geyBQSU4oQk9PVF8xMiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbm9yX2NfcGluc1tdCQk9IHsgUElOKEJPT1RfMTMsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG5vcl9jc19waW5zW10JCT0geyBQSU4oQk9PVF8xOCwgMCkgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9kMF9jX3BpbnNbXQk9IHsgUElOKEJPT1RfMCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDFfY19waW5zW10JPSB7IFBJTihCT09UXzEsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QyX2NfcGluc1tdCT0geyBQSU4oQk9PVF8yLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9kM19jX3BpbnNbXQk9IHsgUElOKEJPT1RfMywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfY21kX2NfcGluc1tdCT0geyBQSU4oQk9PVF84LCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9jbGtfY19waW5zW10JPSB7IFBJTihCT09UXzEwLCAwKSB9OworCisvKiBiYW5rIENBUkQgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDFfYl9waW5zW10JPSB7IFBJTihDQVJEXzAsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QwX2JfcGluc1tdCT0geyBQSU4oQ0FSRF8xLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzZF9jbGtfYl9waW5zW10JPSB7IFBJTihDQVJEXzIsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2NtZF9iX3BpbnNbXQk9IHsgUElOKENBUkRfMywgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2RfZDNfYl9waW5zW10JPSB7IFBJTihDQVJEXzQsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkX2QyX2JfcGluc1tdCT0geyBQSU4oQ0FSRF81LCAwKSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfZDEzX2JfcGluc1tdCT0geyBQSU4oQ0FSRF8wLCAwKSwgUElOKENBUkRfNCwgMCksCisJCQkJCQkgICAgUElOKENBUkRfNSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19kMF9iX3BpbnNbXQk9IHsgUElOKENBUkRfMSwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2R4Y19jbGtfYl9waW5zW10JPSB7IFBJTihDQVJEXzIsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHNkeGNfY21kX2JfcGluc1tdCT0geyBQSU4oQ0FSRF8zLCAwKSB9OworCisvKiBiYW5rIEFPICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfdHhfYW9fYV9waW5zW10JPSB7IFBJTihHUElPQU9fMCwgQU9fT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J4X2FvX2FfcGluc1tdCT0geyBQSU4oR1BJT0FPXzEsIEFPX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9jdHNfYW9fYV9waW5zW10JPSB7IFBJTihHUElPQU9fMiwgQU9fT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J0c19hb19hX3BpbnNbXQk9IHsgUElOKEdQSU9BT18zLCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19tc3Rfc2NrX2FvX3BpbnNbXSA9IHsgUElOKEdQSU9BT180LCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyY19tc3Rfc2RhX2FvX3BpbnNbXSA9IHsgUElOKEdQSU9BT181LCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNsa18zMmtfaW5fb3V0X3BpbnNbXQk9IHsgUElOKEdQSU9BT182LCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJlbW90ZV9pbnB1dF9waW5zW10JPSB7IFBJTihHUElPQU9fNywgQU9fT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBoZG1pX2NlY18xX3BpbnNbXQk9IHsgUElOKEdQSU9BT18xMiwgQU9fT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpcl9ibGFzdGVyX3BpbnNbXQk9IHsgUElOKEdQSU9BT18xMywgQU9fT0ZGKSB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHB3bV9jMl9waW5zW10JCT0geyBQSU4oR1BJT0FPXzMsIEFPX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJjX3Nja19hb19waW5zW10JPSB7IFBJTihHUElPQU9fNCwgQU9fT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMmNfc2RhX2FvX3BpbnNbXQk9IHsgUElOKEdQSU9BT181LCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGlyX3JlbW90ZV9vdXRfcGluc1tdCT0geyBQSU4oR1BJT0FPXzcsIEFPX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJzX2FtX2Nsa19vdXRfcGluc1tdCT0geyBQSU4oR1BJT0FPXzgsIEFPX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJzX2FvX2Nsa19vdXRfcGluc1tdCT0geyBQSU4oR1BJT0FPXzksIEFPX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgaTJzX2xyX2Nsa19vdXRfcGluc1tdCT0geyBQSU4oR1BJT0FPXzEwLCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyc19vdXRfMDFfcGluc1tdCT0geyBQSU4oR1BJT0FPXzExLCBBT19PRkYpIH07CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF90eF9hb19iMF9waW5zW10JPSB7IFBJTihHUElPQU9fMCwgQU9fT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3J4X2FvX2IwX3BpbnNbXQk9IHsgUElOKEdQSU9BT18xLCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfY3RzX2FvX2JfcGluc1tdCT0geyBQSU4oR1BJT0FPXzIsIEFPX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdWFydF9ydHNfYW9fYl9waW5zW10JPSB7IFBJTihHUElPQU9fMywgQU9fT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1YXJ0X3R4X2FvX2IxX3BpbnNbXQk9IHsgUElOKEdQSU9BT180LCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHVhcnRfcnhfYW9fYjFfcGluc1tdCT0geyBQSU4oR1BJT0FPXzUsIEFPX09GRikgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3BkaWZfb3V0XzFfcGluc1tdCT0geyBQSU4oR1BJT0FPXzYsIEFPX09GRikgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMnNfaW5fY2gwMV9waW5zW10JPSB7IFBJTihHUElPQU9fNiwgQU9fT0ZGKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBpMnNfYW9fY2xrX2luX3BpbnNbXQk9IHsgUElOKEdQSU9BT185LCBBT19PRkYpIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGkyc19scl9jbGtfaW5fcGluc1tdCT0geyBQSU4oR1BJT0FPXzEwLCBBT19PRkYpIH07CisKKy8qIGJhbmsgRElGICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF9yeGQxX3BpbnNbXQk9IHsgUElOKERJRl8wX1AsIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF9yeGQwX3BpbnNbXQk9IHsgUElOKERJRl8wX04sIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF9yeF9kdl9waW5zW10JPSB7IFBJTihESUZfMV9QLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfcnhfY2xrX3BpbnNbXQk9IHsgUElOKERJRl8xX04sIDApIH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV0aF90eGQwXzFfcGluc1tdCT0geyBQSU4oRElGXzJfUCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX3R4ZDFfMV9waW5zW10JPSB7IFBJTihESUZfMl9OLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfdHhfZW5fcGluc1tdCT0geyBQSU4oRElGXzNfUCwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX3JlZl9jbGtfcGluc1tdCT0geyBQSU4oRElGXzNfTiwgMCkgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXRoX21kY19waW5zW10JPSB7IFBJTihESUZfNF9QLCAwKSB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldGhfbWRpb19lbl9waW5zW10JPSB7IFBJTihESUZfNF9OLCAwKSB9OworCitzdGF0aWMgc3RydWN0IG1lc29uX3BteF9ncm91cCBtZXNvbjhiX2dyb3Vwc1tdID0geworCUdQSU9fR1JPVVAoR1BJT1hfMCwgMCksCisJR1BJT19HUk9VUChHUElPWF8xLCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzIsIDApLAorCUdQSU9fR1JPVVAoR1BJT1hfMywgMCksCisJR1BJT19HUk9VUChHUElPWF80LCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzUsIDApLAorCUdQSU9fR1JPVVAoR1BJT1hfNiwgMCksCisJR1BJT19HUk9VUChHUElPWF83LCAwKSwKKwlHUElPX0dST1VQKEdQSU9YXzgsIDApLAorCUdQSU9fR1JPVVAoR1BJT1hfOSwgMCksCisJR1BJT19HUk9VUChHUElPWF8xMCwgMCksCisJR1BJT19HUk9VUChHUElPWF8xMSwgMCksCisJR1BJT19HUk9VUChHUElPWF8xNiwgMCksCisJR1BJT19HUk9VUChHUElPWF8xNywgMCksCisJR1BJT19HUk9VUChHUElPWF8xOCwgMCksCisJR1BJT19HUk9VUChHUElPWF8xOSwgMCksCisJR1BJT19HUk9VUChHUElPWF8yMCwgMCksCisJR1BJT19HUk9VUChHUElPWF8yMSwgMCksCisKKwlHUElPX0dST1VQKEdQSU9ZXzAsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMSwgMCksCisJR1BJT19HUk9VUChHUElPWV8zLCAwKSwKKwlHUElPX0dST1VQKEdQSU9ZXzYsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfNywgMCksCisJR1BJT19HUk9VUChHUElPWV84LCAwKSwKKwlHUElPX0dST1VQKEdQSU9ZXzksIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTAsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTEsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTIsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTMsIDApLAorCUdQSU9fR1JPVVAoR1BJT1lfMTQsIDApLAorCisJR1BJT19HUk9VUChHUElPRFZfOSwgMCksCisJR1BJT19HUk9VUChHUElPRFZfMjQsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzI1LCAwKSwKKwlHUElPX0dST1VQKEdQSU9EVl8yNiwgMCksCisJR1BJT19HUk9VUChHUElPRFZfMjcsIDApLAorCUdQSU9fR1JPVVAoR1BJT0RWXzI4LCAwKSwKKwlHUElPX0dST1VQKEdQSU9EVl8yOSwgMCksCisKKwlHUElPX0dST1VQKEdQSU9IXzAsIDApLAorCUdQSU9fR1JPVVAoR1BJT0hfMSwgMCksCisJR1BJT19HUk9VUChHUElPSF8yLCAwKSwKKwlHUElPX0dST1VQKEdQSU9IXzMsIDApLAorCUdQSU9fR1JPVVAoR1BJT0hfNCwgMCksCisJR1BJT19HUk9VUChHUElPSF81LCAwKSwKKwlHUElPX0dST1VQKEdQSU9IXzYsIDApLAorCUdQSU9fR1JPVVAoR1BJT0hfNywgMCksCisJR1BJT19HUk9VUChHUElPSF84LCAwKSwKKwlHUElPX0dST1VQKEdQSU9IXzksIDApLAorCisJR1BJT19HUk9VUChESUZfMF9QLCAwKSwKKwlHUElPX0dST1VQKERJRl8wX04sIDApLAorCUdQSU9fR1JPVVAoRElGXzFfUCwgMCksCisJR1BJT19HUk9VUChESUZfMV9OLCAwKSwKKwlHUElPX0dST1VQKERJRl8yX1AsIDApLAorCUdQSU9fR1JPVVAoRElGXzJfTiwgMCksCisJR1BJT19HUk9VUChESUZfM19QLCAwKSwKKwlHUElPX0dST1VQKERJRl8zX04sIDApLAorCUdQSU9fR1JPVVAoRElGXzRfUCwgMCksCisJR1BJT19HUk9VUChESUZfNF9OLCAwKSwKKworCUdQSU9fR1JPVVAoR1BJT0FPXzAsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fMSwgQU9fT0ZGKSwKKwlHUElPX0dST1VQKEdQSU9BT18yLCBBT19PRkYpLAorCUdQSU9fR1JPVVAoR1BJT0FPXzMsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fNCwgQU9fT0ZGKSwKKwlHUElPX0dST1VQKEdQSU9BT181LCBBT19PRkYpLAorCUdQSU9fR1JPVVAoR1BJT0FPXzYsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fNywgQU9fT0ZGKSwKKwlHUElPX0dST1VQKEdQSU9BT184LCBBT19PRkYpLAorCUdQSU9fR1JPVVAoR1BJT0FPXzksIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fMTAsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fMTEsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fMTIsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPQU9fMTMsIEFPX09GRiksCisJR1BJT19HUk9VUChHUElPX0JTRF9FTiwgQU9fT0ZGKSwKKwlHUElPX0dST1VQKEdQSU9fVEVTVF9OLCBBT19PRkYpLAorCisJLyogYmFuayBYICovCisJR1JPVVAoc2RfZDBfYSwJCTgsCTUpLAorCUdST1VQKHNkX2QxX2EsCQk4LAk0KSwKKwlHUk9VUChzZF9kMl9hLAkJOCwJMyksCisJR1JPVVAoc2RfZDNfYSwJCTgsCTIpLAorCUdST1VQKHNkeGNfZDBfMF9hLAk1LAkyOSksCisJR1JPVVAoc2R4Y19kNDdfYSwJNSwJMTIpLAorCUdST1VQKHNkeGNfZDEzXzBfYSwJNSwJMjgpLAorCUdST1VQKHNkX2Nsa19hLAkJOCwJMSksCisJR1JPVVAoc2RfY21kX2EsCQk4LAkwKSwKKwlHUk9VUCh4dGFsXzMya19vdXQsCTMsCTIyKSwKKwlHUk9VUCh4dGFsXzI0bV9vdXQsCTMsCTIwKSwKKwlHUk9VUCh1YXJ0X3R4X2IwLAk0LAk5KSwKKwlHUk9VUCh1YXJ0X3J4X2IwLAk0LAk4KSwKKwlHUk9VUCh1YXJ0X2N0c19iMCwJNCwJNyksCisJR1JPVVAodWFydF9ydHNfYjAsCTQsCTYpLAorCUdST1VQKHNkeGNfZDBfMV9hLAk1LAkxNCksCisJR1JPVVAoc2R4Y19kMTNfMV9hLAk1LAkxMyksCisJR1JPVVAocGNtX291dF9hLAkzLAkzMCksCisJR1JPVVAocGNtX2luX2EsCQkzLAkyOSksCisJR1JPVVAocGNtX2ZzX2EsCQkzLAkyOCksCisJR1JPVVAocGNtX2Nsa19hLAkzLAkyNyksCisJR1JPVVAoc2R4Y19jbGtfYSwJNSwJMTEpLAorCUdST1VQKHNkeGNfY21kX2EsCTUsCTEwKSwKKwlHUk9VUChwd21fdnNfMCwJCTcsCTMxKSwKKwlHUk9VUChwd21fZSwJCTksCTE5KSwKKwlHUk9VUChwd21fdnNfMSwJCTcsCTMwKSwKKwlHUk9VUCh1YXJ0X3R4X2EsCTQsCTE3KSwKKwlHUk9VUCh1YXJ0X3J4X2EsCTQsCTE2KSwKKwlHUk9VUCh1YXJ0X2N0c19hLAk0LAkxNSksCisJR1JPVVAodWFydF9ydHNfYSwJNCwJMTQpLAorCUdST1VQKHVhcnRfdHhfYjEsCTYsCTE5KSwKKwlHUk9VUCh1YXJ0X3J4X2IxLAk2LAkxOCksCisJR1JPVVAodWFydF9jdHNfYjEsCTYsCTE3KSwKKwlHUk9VUCh1YXJ0X3J0c19iMSwJNiwJMTYpLAorCUdST1VQKGlzbzc4MTZfMF9jbGssCTUsCTkpLAorCUdST1VQKGlzbzc4MTZfMF9kYXRhLAk1LAk4KSwKKwlHUk9VUChzcGlfc2Nsa18wLAk0LAkyMiksCisJR1JPVVAoc3BpX21pc29fMCwJNCwJMjQpLAorCUdST1VQKHNwaV9tb3NpXzAsCTQsCTIzKSwKKwlHUk9VUChpc283ODE2X2RldCwJNCwJMjEpLAorCUdST1VQKGlzbzc4MTZfcmVzZXQsCTQsCTIwKSwKKwlHUk9VUChpc283ODE2XzFfY2xrLAk0LAkxOSksCisJR1JPVVAoaXNvNzgxNl8xX2RhdGEsCTQsCTE4KSwKKwlHUk9VUChzcGlfc3MwXzAsCTQsCTI1KSwKKwlHUk9VUCh0c2luX2Nsa19iLAkzLAk2KSwKKwlHUk9VUCh0c2luX3NvcF9iLAkzLAk3KSwKKwlHUk9VUCh0c2luX2QwX2IsCTMsCTgpLAorCUdST1VQKHB3bV9iLAkJMiwJMyksCisJR1JPVVAoaTJjX3NkYV9kMCwJNCwJNSksCisJR1JPVVAoaTJjX3Nja19kMCwJNCwJNCksCisJR1JPVVAodHNpbl9kX3ZhbGlkX2IsCTMsCTkpLAorCisJLyogYmFuayBZICovCisJR1JPVVAodHNpbl9kX3ZhbGlkX2EsCTMsCTIpLAorCUdST1VQKHRzaW5fc29wX2EsCTMsCTEpLAorCUdST1VQKHRzaW5fZDE3X2EsCTMsCTUpLAorCUdST1VQKHRzaW5fY2xrX2EsCTMsCTApLAorCUdST1VQKHRzaW5fZDBfYSwJMywJNCksCisJR1JPVVAoc3BkaWZfb3V0XzAsCTEsCTcpLAorCUdST1VQKHh0YWxfMjRtLAkJMywJMTgpLAorCUdST1VQKGlzbzc4MTZfMl9jbGssCTUsCTcpLAorCUdST1VQKGlzbzc4MTZfMl9kYXRhLAk1LAk2KSwKKworCS8qIGJhbmsgRFYgKi8KKwlHUk9VUChwd21fZCwJCTMsCTI2KSwKKwlHUk9VUChwd21fYzAsCQkzLAkyNSksCisJR1JPVVAocHdtX3ZzXzIsCQk3LAkyOCksCisJR1JPVVAocHdtX3ZzXzMsCQk3LAkyNyksCisJR1JPVVAocHdtX3ZzXzQsCQk3LAkyNiksCisJR1JPVVAoeHRhbDI0X291dCwJNywJMjUpLAorCUdST1VQKHVhcnRfdHhfYywJNiwJMjMpLAorCUdST1VQKHVhcnRfcnhfYywJNiwJMjIpLAorCUdST1VQKHVhcnRfY3RzX2MsCTYsCTIxKSwKKwlHUk9VUCh1YXJ0X3J0c19jLAk2LAkyMCksCisJR1JPVVAocHdtX2MxLAkJMywJMjQpLAorCUdST1VQKGkyY19zZGFfYSwJOSwJMzEpLAorCUdST1VQKGkyY19zY2tfYSwJOSwJMzApLAorCUdST1VQKGkyY19zZGFfYjAsCTksCTI5KSwKKwlHUk9VUChpMmNfc2NrX2IwLAk5LAkyOCksCisJR1JPVVAoaTJjX3NkYV9jMCwJOSwJMjcpLAorCUdST1VQKGkyY19zY2tfYzAsCTksCTI2KSwKKworCS8qIGJhbmsgSCAqLworCUdST1VQKGhkbWlfaHBkLAkJMSwJMjYpLAorCUdST1VQKGhkbWlfc2RhLAkJMSwJMjUpLAorCUdST1VQKGhkbWlfc2NsLAkJMSwJMjQpLAorCUdST1VQKGhkbWlfY2VjXzAsCTEsCTIzKSwKKwlHUk9VUChldGhfdHhkMV8wLAk3LAkyMSksCisJR1JPVVAoZXRoX3R4ZDBfMCwJNywJMjApLAorCUdST1VQKGNsa18yNG1fb3V0LAk0LAkxKSwKKwlHUk9VUChzcGlfc3MxLAkJOCwJMTEpLAorCUdST1VQKHNwaV9zczIsCQk4LAkxMiksCisJR1JPVVAoc3BpX3NzMF8xLAk5LAkxMyksCisJR1JPVVAoc3BpX21pc29fMSwJOSwJMTIpLAorCUdST1VQKHNwaV9tb3NpXzEsCTksCTExKSwKKwlHUk9VUChzcGlfc2Nsa18xLAk5LAkxMCksCisJR1JPVVAoZXRoX3R4ZDMsCQk2LAkxMyksCisJR1JPVVAoZXRoX3R4ZDIsCQk2LAkxMiksCisJR1JPVVAoZXRoX3R4X2NsaywJNiwJMTEpLAorCUdST1VQKGkyY19zZGFfYjEsCTUsCTI3KSwKKwlHUk9VUChpMmNfc2NrX2IxLAk1LAkyNiksCisJR1JPVVAoaTJjX3NkYV9jMSwJNSwJMjUpLAorCUdST1VQKGkyY19zY2tfYzEsCTUsCTI0KSwKKwlHUk9VUChpMmNfc2RhX2QxLAk0LAkzKSwKKwlHUk9VUChpMmNfc2NrX2QxLAk0LAkyKSwKKworCS8qIGJhbmsgQk9PVCAqLworCUdST1VQKG5hbmRfaW8sCQkyLAkyNiksCisJR1JPVVAobmFuZF9pb19jZTAsCTIsCTI1KSwKKwlHUk9VUChuYW5kX2lvX2NlMSwJMiwJMjQpLAorCUdST1VQKG5hbmRfaW9fcmIwLAkyLAkxNyksCisJR1JPVVAobmFuZF9hbGUsCQkyLAkyMSksCisJR1JPVVAobmFuZF9jbGUsCQkyLAkyMCksCisJR1JPVVAobmFuZF93ZW5fY2xrLAkyLAkxOSksCisJR1JPVVAobmFuZF9yZW5fY2xrLAkyLAkxOCksCisJR1JPVVAobmFuZF9kcXNfMCwJMiwJMjcpLAorCUdST1VQKG5hbmRfZHFzXzEsCTIsCTI4KSwKKwlHUk9VUChzZHhjX2QwX2MsCTQsCTMwKSwKKwlHUk9VUChzZHhjX2QxM19jLAk0LAkyOSksCisJR1JPVVAoc2R4Y19kNDdfYywJNCwJMjgpLAorCUdST1VQKHNkeGNfY2xrX2MsCTcsCTE5KSwKKwlHUk9VUChzZHhjX2NtZF9jLAk3LAkxOCksCisJR1JPVVAobm9yX2QsCQk1LAkxKSwKKwlHUk9VUChub3JfcSwJCTUsCTMpLAorCUdST1VQKG5vcl9jLAkJNSwJMiksCisJR1JPVVAobm9yX2NzLAkJNSwJMCksCisJR1JPVVAoc2RfZDBfYywJCTYsCTI5KSwKKwlHUk9VUChzZF9kMV9jLAkJNiwJMjgpLAorCUdST1VQKHNkX2QyX2MsCQk2LAkyNyksCisJR1JPVVAoc2RfZDNfYywJCTYsCTI2KSwKKwlHUk9VUChzZF9jbWRfYywJCTYsCTMwKSwKKwlHUk9VUChzZF9jbGtfYywJCTYsCTMxKSwKKworCS8qIGJhbmsgQ0FSRCAqLworCUdST1VQKHNkX2QxX2IsCQkyLAkxNCksCisJR1JPVVAoc2RfZDBfYiwJCTIsCTE1KSwKKwlHUk9VUChzZF9jbGtfYiwJCTIsCTExKSwKKwlHUk9VUChzZF9jbWRfYiwJCTIsCTEwKSwKKwlHUk9VUChzZF9kM19iLAkJMiwJMTIpLAorCUdST1VQKHNkX2QyX2IsCQkyLAkxMyksCisJR1JPVVAoc2R4Y19kMTNfYiwJMiwJNiksCisJR1JPVVAoc2R4Y19kMF9iLAkyLAk3KSwKKwlHUk9VUChzZHhjX2Nsa19iLAkyLAk1KSwKKwlHUk9VUChzZHhjX2NtZF9iLAkyLAk0KSwKKworCS8qIGJhbmsgQU8gKi8KKwlHUk9VUCh1YXJ0X3R4X2FvX2EsCTAsCTEyKSwKKwlHUk9VUCh1YXJ0X3J4X2FvX2EsCTAsCTExKSwKKwlHUk9VUCh1YXJ0X2N0c19hb19hLAkwLAkxMCksCisJR1JPVVAodWFydF9ydHNfYW9fYSwJMCwJOSksCisJR1JPVVAoaTJjX21zdF9zY2tfYW8sCTAsCTYpLAorCUdST1VQKGkyY19tc3Rfc2RhX2FvLAkwLAk1KSwKKwlHUk9VUChjbGtfMzJrX2luX291dCwJMCwJMTgpLAorCUdST1VQKHJlbW90ZV9pbnB1dCwJMCwJMCksCisJR1JPVVAoaGRtaV9jZWNfMSwJMCwJMTcpLAorCUdST1VQKGlyX2JsYXN0ZXIsCTAsCTMxKSwKKwlHUk9VUChwd21fYzIsCQkwLAkyMiksCisJR1JPVVAoaTJjX3Nja19hbywJMCwJMiksCisJR1JPVVAoaTJjX3NkYV9hbywJMCwJMSksCisJR1JPVVAoaXJfcmVtb3RlX291dCwJMCwJMjEpLAorCUdST1VQKGkyc19hbV9jbGtfb3V0LAkwLAkzMCksCisJR1JPVVAoaTJzX2FvX2Nsa19vdXQsCTAsCTI5KSwKKwlHUk9VUChpMnNfbHJfY2xrX291dCwJMCwJMjgpLAorCUdST1VQKGkyc19vdXRfMDEsCTAsCTI3KSwKKwlHUk9VUCh1YXJ0X3R4X2FvX2IwLAkwLAkyNiksCisJR1JPVVAodWFydF9yeF9hb19iMCwJMCwJMjUpLAorCUdST1VQKHVhcnRfY3RzX2FvX2IsCTAsCTgpLAorCUdST1VQKHVhcnRfcnRzX2FvX2IsCTAsCTcpLAorCUdST1VQKHVhcnRfdHhfYW9fYjEsCTAsCTI0KSwKKwlHUk9VUCh1YXJ0X3J4X2FvX2IxLAkwLAkyMyksCisJR1JPVVAoc3BkaWZfb3V0XzEsCTAsCTE2KSwKKwlHUk9VUChpMnNfaW5fY2gwMSwJMCwJMTMpLAorCUdST1VQKGkyc19hb19jbGtfaW4sCTAsCTE1KSwKKwlHUk9VUChpMnNfbHJfY2xrX2luLAkwLAkxNCksCisKKwkvKiBiYW5rIERJRiAqLworCUdST1VQKGV0aF9yeGQxLAkJNiwJMCksCisJR1JPVVAoZXRoX3J4ZDAsCQk2LAkxKSwKKwlHUk9VUChldGhfcnhfZHYsCTYsCTIpLAorCUdST1VQKGV0aF9yeF9jbGssCTYsCTMpLAorCUdST1VQKGV0aF90eGQwXzEsCTYsCTQpLAorCUdST1VQKGV0aF90eGQxXzEsCTYsCTUpLAorCUdST1VQKGV0aF90eF9lbiwJNiwJMCksCisJR1JPVVAoZXRoX3JlZl9jbGssCTYsCTgpLAorCUdST1VQKGV0aF9tZGMsCQk2LAk5KSwKKwlHUk9VUChldGhfbWRpb19lbiwJNiwJMTApLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBncGlvX2dyb3Vwc1tdID0geworCSJHUElPWF8wIiwgIkdQSU9YXzEiLCAiR1BJT1hfMiIsICJHUElPWF8zIiwgIkdQSU9YXzQiLAorCSJHUElPWF81IiwgIkdQSU9YXzYiLCAiR1BJT1hfNyIsICJHUElPWF84IiwgIkdQSU9YXzkiLAorCSJHUElPWF8xMCIsICJHUElPWF8xMSIsICJHUElPWF8xNiIsICJHUElPWF8xNyIsICJHUElPWF8xOCIsCisJIkdQSU9YXzE5IiwgIkdQSU9YXzIwIiwgIkdQSU9YXzIxIiwKKworCSJHUElPWV8wIiwgIkdQSU9ZXzEiLCAiR1BJT1lfMyIsICJHUElPWV82IiwgIkdQSU9ZXzciLAorCSJHUElPWV84IiwgIkdQSU9ZXzkiLCAiR1BJT1lfMTAiLCAiR1BJT1lfMTEiLCAiR1BJT1lfMTIiLAorCSJHUElPWV8xMyIsICJHUElPWV8xNCIsCisKKwkiR1BJT0RWXzkiLCAiR1BJT0RWXzI0IiwgIkdQSU9EVl8yNSIsICJHUElPRFZfMjYiLAorCSJHUElPRFZfMjciLCAiR1BJT0RWXzI4IiwgIkdQSU9EVl8yOSIsCisKKwkiR1BJT0hfMCIsICJHUElPSF8xIiwgIkdQSU9IXzIiLCAiR1BJT0hfMyIsICJHUElPSF80IiwKKwkiR1BJT0hfNSIsICJHUElPSF82IiwgIkdQSU9IXzciLCAiR1BJT0hfOCIsICJHUElPSF85IiwKKworCSJDQVJEXzAiLCAiQ0FSRF8xIiwgIkNBUkRfMiIsICJDQVJEXzMiLCAiQ0FSRF80IiwKKwkiQ0FSRF81IiwgIkNBUkRfNiIsCisKKwkiQk9PVF8wIiwgIkJPT1RfMSIsICJCT09UXzIiLCAiQk9PVF8zIiwgIkJPT1RfNCIsCisJIkJPT1RfNSIsICJCT09UXzYiLCAiQk9PVF83IiwgIkJPT1RfOCIsICJCT09UXzkiLAorCSJCT09UXzEwIiwgIkJPT1RfMTEiLCAiQk9PVF8xMiIsICJCT09UXzEzIiwgIkJPT1RfMTQiLAorCSJCT09UXzE1IiwgIkJPT1RfMTYiLCAiQk9PVF8xNyIsICJCT09UXzE4IiwKKworCSJHUElPQU9fMCIsICJHUElPQU9fMSIsICJHUElPQU9fMiIsICJHUElPQU9fMyIsCisJIkdQSU9BT180IiwgIkdQSU9BT181IiwgIkdQSU9BT182IiwgIkdQSU9BT183IiwKKwkiR1BJT0FPXzgiLCAiR1BJT0FPXzkiLCAiR1BJT0FPXzEwIiwgIkdQSU9BT18xMSIsCisJIkdQSU9BT18xMiIsICJHUElPQU9fMTMiLCAiR1BJT19CU0RfRU4iLCAiR1BJT19URVNUX04iLAorCisJIkRJRl8wX1AiLCAiRElGXzBfTiIsICJESUZfMV9QIiwgIkRJRl8xX04iLAorCSJESUZfMl9QIiwgIkRJRl8yX04iLCAiRElGXzNfUCIsICJESUZfM19OIiwKKwkiRElGXzRfUCIsICJESUZfNF9OIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZF9hX2dyb3Vwc1tdID0geworCSJzZF9kMF9hIiwgInNkX2QxX2EiLCAic2RfZDJfYSIsICJzZF9kM19hIiwgInNkX2Nsa19hIiwKKwkic2RfY21kX2EiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkeGNfYV9ncm91cHNbXSA9IHsKKwkic2R4Y19kMF8wX2EiLCAic2R4Y19kMTNfMF9hIiwgInNkeGNfZDQ3X2EiLCAic2R4Y19jbGtfYSIsCisJInNkeGNfY21kX2EiLCAic2R4Y19kMF8xX2EiLCAic2R4Y19kMF8xM18xX2EiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBjbV9hX2dyb3Vwc1tdID0geworCSJwY21fb3V0X2EiLCAicGNtX2luX2EiLCAicGNtX2ZzX2EiLCAicGNtX2Nsa19hIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0X2FfZ3JvdXBzW10gPSB7CisJInVhcnRfdHhfYSIsICJ1YXJ0X3J4X2EiLCAidWFydF9jdHNfYSIsICJ1YXJ0X3J0c19hIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0X2JfZ3JvdXBzW10gPSB7CisJInVhcnRfdHhfYjAiLCAidWFydF9yeF9iMCIsICJ1YXJ0X2N0c19iMCIsICJ1YXJ0X3J0c19iMCIsCisJInVhcnRfdHhfYjEiLCAidWFydF9yeF9iMSIsICJ1YXJ0X2N0c19iMSIsICJ1YXJ0X3J0c19iMSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaXNvNzgxNl9ncm91cHNbXSA9IHsKKwkiaXNvNzgxNl9kZXQiLCAiaXNvNzgxNl9yZXNldCIsICJpc283ODE2XzBfY2xrIiwgImlzbzc4MTZfMF9kYXRhIiwKKwkiaXNvNzgxNl8xX2NsayIsICJpc283ODE2XzFfZGF0YSIsICJpc283ODE2XzJfY2xrIiwgImlzbzc4MTZfMl9kYXRhIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNfZF9ncm91cHNbXSA9IHsKKwkiaTJjX3NkYV9kMCIsICJpMmNfc2NrX2QwIiwgImkyY19zZGFfZDEiLCAiaTJjX3Nja19kMSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgeHRhbF9ncm91cHNbXSA9IHsKKwkieHRhbF8zMmtfb3V0IiwgInh0YWxfMjRtX291dCIsICJ4dGFsXzI0bSIsICJ4dGFsMjRfb3V0IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0X2NfZ3JvdXBzW10gPSB7CisJInVhcnRfdHhfYyIsICJ1YXJ0X3J4X2MiLCAidWFydF9jdHNfYyIsICJ1YXJ0X3J0c19jIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNfY19ncm91cHNbXSA9IHsKKwkiaTJjX3NkYV9jMCIsICJpMmNfc2NrX2MwIiwgImkyY19zZGFfYzEiLCAiaTJjX3Nja19jMSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGRtaV9ncm91cHNbXSA9IHsKKwkiaGRtaV9ocGQiLCAiaGRtaV9zZGEiLCAiaGRtaV9zY2wiLCAiaGRtaV9jZWNfMCIsCisJImhkbWlfY2VjXzEiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNwaV9ncm91cHNbXSA9IHsKKwkic3BpX3NzMF8wIiwgInNwaV9taXNvXzAiLCAic3BpX21vc2lfMCIsICJzcGlfc2Nsa18wIiwKKwkic3BpX3NzMF8xIiwgInNwaV9zczEiLCAic3BpX3NjbGtfMSIsICJzcGlfbW9zaV8xIiwKKwkic3BpX21pc29fMSIsICJzcGlfc3MyIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBldGhlcm5ldF9ncm91cHNbXSA9IHsKKwkiZXRoX3R4X2NsayIsICJldGhfdHhfZW4iLCAiZXRoX3R4ZDFfMCIsICJldGhfdHhkMV8xIiwKKwkiZXRoX3R4ZDBfMCIsICJldGhfdHhkMF8xIiwgImV0aF9yeF9jbGsiLCAiZXRoX3J4X2R2IiwKKwkiZXRoX3J4ZDEiLCAiZXRoX3J4ZDAiLCAiZXRoX21kaW9fZW4iLCAiZXRoX21kYyIsICJldGhfcmVmX2NsayIsCisJImV0aF90eGQyIiwgImV0aF90eGQzIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNfYV9ncm91cHNbXSA9IHsKKwkiaTJjX3NkYV9hIiwgImkyY19zY2tfYSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGkyY19iX2dyb3Vwc1tdID0geworCSJpMmNfc2RhX2IwIiwgImkyY19zY2tfYjAiLCAiaTJjX3NkYV9iMSIsICJpMmNfc2NrX2IxIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZF9jX2dyb3Vwc1tdID0geworCSJzZF9kMF9jIiwgInNkX2QxX2MiLCAic2RfZDJfYyIsICJzZF9kM19jIiwKKwkic2RfY21kX2MiLCAic2RfY2xrX2MiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkeGNfY19ncm91cHNbXSA9IHsKKwkic2R4Y19kMF9jIiwgInNkeGNfZDEzX2MiLCAic2R4Y19kNDdfYyIsICJzZHhjX2NtZF9jIiwKKwkic2R4Y19jbGtfYyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFuZF9ncm91cHNbXSA9IHsKKwkibmFuZF9pbyIsICJuYW5kX2lvX2NlMCIsICJuYW5kX2lvX2NlMSIsCisJIm5hbmRfaW9fcmIwIiwgIm5hbmRfYWxlIiwgIm5hbmRfY2xlIiwKKwkibmFuZF93ZW5fY2xrIiwgIm5hbmRfcmVuX2NsayIsICJuYW5kX2RxczAiLAorCSJuYW5kX2RxczEiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5vcl9ncm91cHNbXSA9IHsKKwkibm9yX2QiLCAibm9yX3EiLCAibm9yX2MiLCAibm9yX2NzIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzZF9iX2dyb3Vwc1tdID0geworCSJzZF9kMV9iIiwgInNkX2QwX2IiLCAic2RfY2xrX2IiLCAic2RfY21kX2IiLAorCSJzZF9kM19iIiwgInNkX2QyX2IiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNkeGNfYl9ncm91cHNbXSA9IHsKKwkic2R4Y19kMTNfYiIsICJzZHhjX2QwX2IiLCAic2R4Y19jbGtfYiIsICJzZHhjX2NtZF9iIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1YXJ0X2FvX2dyb3Vwc1tdID0geworCSJ1YXJ0X3R4X2FvX2EiLCAidWFydF9yeF9hb19hIiwgInVhcnRfY3RzX2FvX2EiLCAidWFydF9ydHNfYW9fYSIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVtb3RlX2dyb3Vwc1tdID0geworCSJyZW1vdGVfaW5wdXQiLCAiaXJfYmxhc3RlciIsICJpcl9yZW1vdGVfb3V0IgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNfc2xhdmVfYW9fZ3JvdXBzW10gPSB7CisJImkyY19zY2tfYW8iLCAiaTJjX3NkYV9hbyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWFydF9hb19iX2dyb3Vwc1tdID0geworCSJ1YXJ0X3R4X2FvX2IwIiwgInVhcnRfcnhfYW9fYjAiLCAidWFydF90eF9hb19iMSIsICJ1YXJ0X3J4X2FvX2IxIiwKKwkidWFydF9jdHNfYW9fYiIsICJ1YXJ0X3J0c19hb19iIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMmNfbXN0X2FvX2dyb3Vwc1tdID0geworCSJpMmNfbXN0X3Nja19hbyIsICJpMmNfbXN0X3NkYV9hbyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2xrX2dyb3Vwc1tdID0geworCSJjbGtfMjRtX291dCIsICJjbGtfMzJrX2luX291dCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3BkaWZfZ3JvdXBzW10gPSB7CisJInNwZGlmX291dF8xIiwgInNwZGlmX291dF8wIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpMnNfZ3JvdXBzW10gPSB7CisJImkyc19hbV9jbGtfb3V0IiwgImkyc19hb19jbGtfb3V0IiwgImkyc19scl9jbGtfb3V0IiwKKwkiaTJzX291dF8wMSIsICJpMnNfaW5fY2gwMSIsICJpMnNfYW9fY2xrX2luIiwKKwkiaTJzX2xyX2Nsa19pbiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2JfZ3JvdXBzW10gPSB7CisJInB3bV9iIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fY19ncm91cHNbXSA9IHsKKwkicHdtX2MwIiwgInB3bV9jMSIsICJwd21fYzIiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHB3bV9kX2dyb3Vwc1tdID0geworCSJwd21fZCIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHdtX2VfZ3JvdXBzW10gPSB7CisJInB3bV9lIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwd21fdnNfZ3JvdXBzW10gPSB7CisJInB3bV92c18wIiwgInB3bV92c18xIiwgInB3bV92c18yIiwKKwkicHdtX3ZzXzMiLCAicHdtX3ZzXzQiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRzaW5fYV9ncm91cHNbXSA9IHsKKwkidHNpbl9kMF9hIiwgInRzaW5fZDE3X2EiLCAidHNpbl9jbGtfYSIsICJ0c2luX3NvcF9hIiwKKwkidHNpbl9kX3ZhbGlkX2EiCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRzaW5fYl9ncm91cHNbXSA9IHsKKwkidHNpbl9kMF9iIiwgInRzaW5fY2xrX2IiLCAidHNpbl9zb3BfYiIsICJ0c2luX2RfdmFsaWRfYiIKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVzb25fcG14X2Z1bmMgbWVzb244Yl9mdW5jdGlvbnNbXSA9IHsKKwlGVU5DVElPTihncGlvKSwKKwlGVU5DVElPTihzZF9hKSwKKwlGVU5DVElPTihzZHhjX2EpLAorCUZVTkNUSU9OKHBjbV9hKSwKKwlGVU5DVElPTih1YXJ0X2EpLAorCUZVTkNUSU9OKHVhcnRfYiksCisJRlVOQ1RJT04oaXNvNzgxNiksCisJRlVOQ1RJT04oaTJjX2QpLAorCUZVTkNUSU9OKHh0YWwpLAorCUZVTkNUSU9OKHVhcnRfYyksCisJRlVOQ1RJT04oaTJjX2MpLAorCUZVTkNUSU9OKGhkbWkpLAorCUZVTkNUSU9OKHNwaSksCisJRlVOQ1RJT04oZXRoZXJuZXQpLAorCUZVTkNUSU9OKGkyY19hKSwKKwlGVU5DVElPTihpMmNfYiksCisJRlVOQ1RJT04oc2RfYyksCisJRlVOQ1RJT04oc2R4Y19jKSwKKwlGVU5DVElPTihuYW5kKSwKKwlGVU5DVElPTihub3IpLAorCUZVTkNUSU9OKHNkX2IpLAorCUZVTkNUSU9OKHNkeGNfYiksCisJRlVOQ1RJT04odWFydF9hbyksCisJRlVOQ1RJT04ocmVtb3RlKSwKKwlGVU5DVElPTihpMmNfc2xhdmVfYW8pLAorCUZVTkNUSU9OKHVhcnRfYW9fYiksCisJRlVOQ1RJT04oaTJjX21zdF9hbyksCisJRlVOQ1RJT04oY2xrKSwKKwlGVU5DVElPTihzcGRpZiksCisJRlVOQ1RJT04oaTJzKSwKKwlGVU5DVElPTihwd21fYiksCisJRlVOQ1RJT04ocHdtX2MpLAorCUZVTkNUSU9OKHB3bV9kKSwKKwlGVU5DVElPTihwd21fZSksCisJRlVOQ1RJT04ocHdtX3ZzKSwKKwlGVU5DVElPTih0c2luX2EpLAorCUZVTkNUSU9OKHRzaW5fYiksCit9OworCitzdGF0aWMgc3RydWN0IG1lc29uX2JhbmsgbWVzb244Yl9iYW5rc1tdID0geworCS8qICAgbmFtZSAgICBmaXJzdCAgICAgICAgICAgICAgICAgICAgICBsYXN0ICAgICAgICAgICAgICAgICAgIHB1bGxlbiAgcHVsbCAgICBkaXIgICAgIG91dCAgICAgaW4gICovCisJQkFOSygiWCIsICAgIFBJTihHUElPWF8wLCAwKSwJCVBJTihHUElPWF8yMSwgMCksICAgICAgNCwgIDAsICA0LCAgMCwgIDAsICAwLCAgMSwgIDAsICAyLCAgMCksCisJQkFOSygiWSIsICAgIFBJTihHUElPWV8wLCAwKSwJCVBJTihHUElPWV8xNCwgMCksICAgICAgMywgIDAsICAzLCAgMCwgIDMsICAwLCAgNCwgIDAsICA1LCAgMCksCisJQkFOSygiRFYiLCAgIFBJTihHUElPRFZfOSwgMCksCQlQSU4oR1BJT0RWXzI5LCAwKSwgICAgIDAsICAwLCAgMCwgIDAsICA3LCAgMCwgIDgsICAwLCAgOSwgIDApLAorCUJBTksoIkgiLCAgICBQSU4oR1BJT0hfMCwgMCksCQlQSU4oR1BJT0hfOSwgMCksICAgICAgIDEsIDE2LCAgMSwgMTYsICA5LCAxOSwgMTAsIDE5LCAxMSwgMTkpLAorCUJBTksoIkNBUkQiLCBQSU4oQ0FSRF8wLCAwKSwJCVBJTihDQVJEXzYsIDApLCAgICAgICAgMiwgMjAsICAyLCAyMCwgIDAsIDIyLCAgMSwgMjIsICAyLCAyMiksCisJQkFOSygiQk9PVCIsIFBJTihCT09UXzAsIDApLAkJUElOKEJPT1RfMTgsIDApLCAgICAgICAyLCAgMCwgIDIsICAwLCAgOSwgIDAsIDEwLCAgMCwgMTEsICAwKSwKKwlCQU5LKCJESUYiLCAgUElOKERJRl8wX1AsIDApLAkJUElOKERJRl80X04sIDApLCAgICAgICA1LCAgOCwgIDUsICA4LCAxMiwgMTIsIDEzLCAxMiwgMTQsIDEyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWVzb25fYmFuayBtZXNvbjhiX2FvX2JhbmtzW10gPSB7CisJLyogICBuYW1lICAgIGZpcnN0ICAgICAgICAgICAgICAgICAgbGFzdCAgICAgICAgICAgICAgICAgICAgICBwdWxsZW4gIHB1bGwgICAgZGlyICAgICBvdXQgICAgIGluICAqLworCUJBTksoIkFPIiwgICBQSU4oR1BJT0FPXzAsIEFPX09GRiksIFBJTihHUElPX1RFU1RfTiwgQU9fT0ZGKSwgMCwgIDAsICAwLCAxNiwgIDAsICAwLCAgMCwgMTYsICAxLCAgMCksCit9OworCitzdGF0aWMgc3RydWN0IG1lc29uX2RvbWFpbl9kYXRhIG1lc29uOGJfZG9tYWluX2RhdGFbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJiYW5rcyIsCisJCS5iYW5rcwkJPSBtZXNvbjhiX2JhbmtzLAorCQkubnVtX2JhbmtzCT0gQVJSQVlfU0laRShtZXNvbjhiX2JhbmtzKSwKKwkJLnBpbl9iYXNlCT0gMCwKKwkJLm51bV9waW5zCT0gODMsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJhby1iYW5rIiwKKwkJLmJhbmtzCQk9IG1lc29uOGJfYW9fYmFua3MsCisJCS5udW1fYmFua3MJPSBBUlJBWV9TSVpFKG1lc29uOGJfYW9fYmFua3MpLAorCQkucGluX2Jhc2UJPSA4MywKKwkJLm51bV9waW5zCT0gMTYsCisJfSwKK307CisKK3N0cnVjdCBtZXNvbl9waW5jdHJsX2RhdGEgbWVzb244Yl9waW5jdHJsX2RhdGEgPSB7CisJLnBpbnMJCT0gbWVzb244Yl9waW5zLAorCS5ncm91cHMJCT0gbWVzb244Yl9ncm91cHMsCisJLmZ1bmNzCQk9IG1lc29uOGJfZnVuY3Rpb25zLAorCS5kb21haW5fZGF0YQk9IG1lc29uOGJfZG9tYWluX2RhdGEsCisJLm51bV9waW5zCT0gQVJSQVlfU0laRShtZXNvbjhiX3BpbnMpLAorCS5udW1fZ3JvdXBzCT0gQVJSQVlfU0laRShtZXNvbjhiX2dyb3VwcyksCisJLm51bV9mdW5jcwk9IEFSUkFZX1NJWkUobWVzb244Yl9mdW5jdGlvbnMpLAorCS5udW1fZG9tYWlucwk9IEFSUkFZX1NJWkUobWVzb244Yl9kb21haW5fZGF0YSksCit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L0tjb25maWcgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvS2NvbmZpZwppbmRleCBkNmRkODM1Li4xNzA2MDI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvS2NvbmZpZworKysgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvS2NvbmZpZwpAQCAtMjYsNiArMjYsMTAgQEAKIAlib29sCiAJc2VsZWN0IFBJTkNUUkxfTVZFQlUKIAorY29uZmlnIFBJTkNUUkxfQVJNQURBXzM5WAorCWJvb2wKKwlzZWxlY3QgUElOQ1RSTF9NVkVCVQorCiBjb25maWcgUElOQ1RSTF9BUk1BREFfWFAKIAlib29sCiAJc2VsZWN0IFBJTkNUUkxfTVZFQlUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9NYWtlZmlsZSBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9NYWtlZmlsZQppbmRleCBhMDgxOGU5Li41NTRkOGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L01ha2VmaWxlCkBAIC00LDUgKzQsNiBAQAogb2JqLSQoQ09ORklHX1BJTkNUUkxfQVJNQURBXzM3MCkgKz0gcGluY3RybC1hcm1hZGEtMzcwLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX0FSTUFEQV8zNzUpICs9IHBpbmN0cmwtYXJtYWRhLTM3NS5vCiBvYmotJChDT05GSUdfUElOQ1RSTF9BUk1BREFfMzhYKSArPSBwaW5jdHJsLWFybWFkYS0zOHgubworb2JqLSQoQ09ORklHX1BJTkNUUkxfQVJNQURBXzM5WCkgKz0gcGluY3RybC1hcm1hZGEtMzl4Lm8KIG9iai0kKENPTkZJR19QSU5DVFJMX0FSTUFEQV9YUCkgICs9IHBpbmN0cmwtYXJtYWRhLXhwLm8KIG9iai0kKENPTkZJR19QSU5DVFJMX09SSU9OKSAgKz0gcGluY3RybC1vcmlvbi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzcwLmMgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzcwLmMKaW5kZXggYzRmNTFkMC4uNDJmOTMwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM3MC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zNzAuYwpAQCAtMzc5LDcgKzM3OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbXZlYnVfcGluY3RybF9zb2NfaW5mbyBhcm1hZGFfMzcwX3BpbmN0cmxfaW5mbzsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJtYWRhXzM3MF9waW5jdHJsX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhcm1hZGFfMzcwX3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsbXY4OGY2NzEwLXBpbmN0cmwiIH0sCiAJeyB9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zNzUuYyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zNzUuYwppbmRleCBjZDdjOGY1Li5jYTFlNzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzc1LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM3NS5jCkBAIC0zOTksNyArMzk5LDcgQEAKIAogc3RhdGljIHN0cnVjdCBtdmVidV9waW5jdHJsX3NvY19pbmZvIGFybWFkYV8zNzVfcGluY3RybF9pbmZvOwogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBhcm1hZGFfMzc1X3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybWFkYV8zNzVfcGluY3RybF9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxtdjg4ZjY3MjAtcGluY3RybCIgfSwKIAl7IH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM4eC5jIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtYXJtYWRhLTM4eC5jCmluZGV4IDczMDJmNjYuLjgzYmJjYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zOHguYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzh4LmMKQEAgLTM4OSw3ICszODksNyBAQAogCiBzdGF0aWMgc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gYXJtYWRhXzM4eF9waW5jdHJsX2luZm87CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybWFkYV8zOHhfcGluY3RybF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXJtYWRhXzM4eF9waW5jdHJsX29mX21hdGNoW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12ODhmNjgxMC1waW5jdHJsIiwKIAkJLmRhdGEgICAgICAgPSAodm9pZCAqKSBWXzg4RjY4MTAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzl4LmMgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEtMzl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0OTE2MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS0zOXguYwpAQCAtMCwwICsxLDQzMiBAQAorLyoKKyAqIE1hcnZlbGwgQXJtYWRhIDM5eCBwaW5jdHJsIGRyaXZlciBiYXNlZCBvbiBtdmVidSBwaW5jdHJsIGNvcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgTWFydmVsbAorICoKKyAqIFRob21hcyBQZXRhenpvbmkgPHRob21hcy5wZXRhenpvbmlAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisKKyNpbmNsdWRlICJwaW5jdHJsLW12ZWJ1LmgiCisKK3N0YXRpYyB2b2lkIF9faW9tZW0gKm1wcF9iYXNlOworCitzdGF0aWMgaW50IGFybWFkYV8zOXhfbXBwX2N0cmxfZ2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCXJldHVybiBkZWZhdWx0X21wcF9jdHJsX2dldChtcHBfYmFzZSwgcGlkLCBjb25maWcpOworfQorCitzdGF0aWMgaW50IGFybWFkYV8zOXhfbXBwX2N0cmxfc2V0KHVuc2lnbmVkIHBpZCwgdW5zaWduZWQgbG9uZyBjb25maWcpCit7CisJcmV0dXJuIGRlZmF1bHRfbXBwX2N0cmxfc2V0KG1wcF9iYXNlLCBwaWQsIGNvbmZpZyk7Cit9CisKK2VudW0geworCVZfODhGNjkyMCA9IEJJVCgwKSwKKwlWXzg4RjY5MjggPSBCSVQoMSksCisJVl84OEY2OTIwX1BMVVMgPSAoVl84OEY2OTIwIHwgVl84OEY2OTI4KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXZlYnVfbXBwX21vZGUgYXJtYWRhXzM5eF9tcHBfbW9kZXNbXSA9IHsKKwlNUFBfTU9ERSgwLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInVhMCIsICAgICAicnhkIiwgICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDEsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAidWEwIiwgICAgICJ0eGQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoMiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJpMmMwIiwgICAgInNjayIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgzLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImkyYzAiLCAgICAic2RhIiwgICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDQsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAidWExIiwgICAgICJ0eGQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInVhMCIsICAgICAicnRzIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDcsICJzbWkiLCAgICAgIm1kYyIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSg1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInVhMSIsICAgICAicnhkIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTAiLCAgICAgImN0cyIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig3LCAic21pIiwgICAgICJtZGlvIiwgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoNiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImNzMyIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig3LCAieHNtaSIsICAgICJtZGlvIiwgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoNywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImFkOSIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig3LCAieHNtaSIsICAgICJtZGMiLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoOCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImFkMTAiLCAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig3LCAicHRwIiwgICAgICJ0cmlnIiwgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoOSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImFkMTEiLCAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig3LCAicHRwIiwgICAgICJjbGsiLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoMTAsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAgICJhZDEyIiwgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNywgInB0cCIsICAgICAiZXZlbnQiLCAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDExLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgICAiYWQxMyIsICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDcsICJsZWQiLCAgICAgImNsayIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgxMiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJwY2llMCIsICAgInJzdG91dCIsICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAgICJhZDE0IiwgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNywgImxlZCIsICAgICAic3RiIiwgICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDEzLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgICAiYWQxNSIsICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDcsICJsZWQiLCAgICAgImRhdGEiLCAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgxNCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJtIiwgICAgICAgInZ0dCIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAgICJ3ZW4xIiwgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNywgInVhMSIsICAgICAidHhkIiwgICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDE1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInBjaWUwIiwgICAicnN0b3V0IiwgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkwIiwgICAgIm1vc2kiLCAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig3LCAiaTJjMSIsICAgICJzY2siLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoMTYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAibSIsICAgICAgICJkZWNjIiwgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTAiLCAgICAibWlzbyIsICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDcsICJpMmMxIiwgICAgInNkYSIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgxNywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTEiLCAgICAgInJ4ZCIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMCIsICAgICJzY2siLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNywgInNtaSIsICAgICAibWRpbyIsICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDE4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInVhMSIsICAgICAidHhkIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkwIiwgICAgImNzMCIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig3LCAiaTJjMiIsICAgICJzY2siLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoMTksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2F0YTEiLCAgICJwcmVzZW50IiwgIFZfODhGNjkyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJ1YTAiLCAgICAgImN0cyIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig2LCAidWExIiwgICAgICJyeGQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNywgImkyYzIiLCAgICAic2RhIiwgICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDIwLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNhdGEwIiwgICAicHJlc2VudCIsICBWXzg4RjY5MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAidWEwIiwgICAgICJydHMiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNiwgInVhMSIsICAgICAidHhkIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDcsICJzbWkiLCAgICAgIm1kYyIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgyMSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzcGkwIiwgICAgImNzMSIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAic2F0YTAiLCAgICJwcmVzZW50IiwgIFZfODhGNjkyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZCIsICAgICAgImNtZCIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAgICJib290Y3MiLCAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oOCwgImdlIiwgICAgICAicnhkMCIsICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDIyLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNwaTAiLCAgICAibW9zaSIsICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImFkMCIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgyMywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzcGkwIiwgICAgInNjayIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAgICJhZDIiLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoMjQsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic3BpMCIsICAgICJtaXNvIiwgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInVhMCIsICAgICAiY3RzIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTEiLCAgICAgInJ4ZCIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QiLCAgICAgICJkNCIsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgICAicmVhZHluIiwgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDI1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNwaTAiLCAgICAiY3MwIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJ1YTAiLCAgICAgInJ0cyIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWExIiwgICAgICJ0eGQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkIiwgICAgICAiZDUiLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImNzMCIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgyNiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzcGkwIiwgICAgImNzMiIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAiaTJjMSIsICAgICJzY2siLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkIiwgICAgICAiZDYiLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImNzMSIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgyNywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzcGkwIiwgICAgImNzMyIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAiaTJjMSIsICAgICJzZGEiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkIiwgICAgICAiZDciLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImNzMiIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig4LCAiZ2UiLCAgICAgICJ0eGNsa291dCIsIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoMjgsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QiLCAgICAgICJjbGsiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgICAiYWQ1IiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDgsICJnZSIsICAgICAgInR4ZDAiLCAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgyOSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImFsZTAiLCAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig4LCAiZ2UiLCAgICAgICJ0eGQxIiwgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoMzAsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAgICJvZW4iLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oOCwgImdlIiwgICAgICAidHhkMiIsICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDMxLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgICAiYWxlMSIsICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDgsICJnZSIsICAgICAgInR4ZDMiLCAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgzMiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgIndlbjAiLCAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig4LCAiZ2UiLCAgICAgICJ0eGN0bCIsICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoMzMsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAibSIsICAgICAgICJkZWNjIiwgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgICAiYWQzIiwgICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDM0LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgICAiYWQxIiwgICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDM1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInJlZiIsICAgICAiY2xrIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImExIiwgICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgzNiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImEwIiwgICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSgzNywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZCIsICAgICAgImQzIiwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAgICJhZDgiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oOCwgImdlIiwgICAgICAicnhjbGsiLCAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDM4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInJlZiIsICAgICAiY2xrIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzZCIsICAgICAgImQwIiwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAgICJhZDQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oOCwgImdlIiwgICAgICAicnhkMSIsICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDM5LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgImkyYzEiLCAgICAic2NrIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDMsICJ1YTAiLCAgICAgImN0cyIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic2QiLCAgICAgICJkMSIsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgICAiYTIiLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDgsICJnZSIsICAgICAgInJ4ZDIiLCAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSg0MCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJpMmMxIiwgICAgInNkYSIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWEwIiwgICAgICJydHMiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNkIiwgICAgICAiZDIiLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImFkNiIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig4LCAiZ2UiLCAgICAgICJyeGQzIiwgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoNDEsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAidWExIiwgICAgICJyeGQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInVhMCIsICAgICAiY3RzIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkxIiwgICAgImNzMyIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAiZGV2IiwgICAgICJidXJzdG4iLCAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNiwgIm5kIiwgICAgICAicmJuMCIsICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDgsICJnZSIsICAgICAgInJ4Y3RsIiwgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSg0MiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJ1YTEiLCAgICAgInR4ZCIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidWEwIiwgICAgICJydHMiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgImRldiIsICAgICAiYWQ3IiwgICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDQzLAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInBjaWUwIiwgICAiY2xrcmVxIiwgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJtIiwgICAgICAgInZ0dCIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAibSIsICAgICAgICJkZWNjIiwgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTEiLCAgICAiY3MyIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJkZXYiLCAgICAgImNsa291dCIsICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig2LCAibmQiLCAgICAgICJyYm4xIiwgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoNDQsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic2F0YTAiLCAgICJwcmVzZW50IiwgIFZfODhGNjkyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJzYXRhMSIsICAgInByZXNlbnQiLCAgVl84OEY2OTI4KSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNywgImxlZCIsICAgICAiY2xrIiwgICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDQ1LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInJlZiIsICAgICAiY2xrIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJwY2llMCIsICAgInJzdG91dCIsICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig2LCAidWExIiwgICAgICJyeGQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoNDYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAicmVmIiwgICAgICJjbGsiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInBjaWUwIiwgICAicnN0b3V0IiwgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDYsICJ1YTEiLCAgICAgInR4ZCIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig3LCAibGVkIiwgICAgICJzdGIiLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoNDcsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAic2F0YTAiLCAgICJwcmVzZW50IiwgIFZfODhGNjkyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJzYXRhMSIsICAgInByZXNlbnQiLCAgVl84OEY2OTI4KSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNywgImxlZCIsICAgICAiZGF0YSIsICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDQ4LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMSwgInNhdGEwIiwgICAicHJlc2VudCIsICBWXzg4RjY5MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigyLCAibSIsICAgICAgICJ2dHQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInRkbSIsICAgICAicGNsayIsICAgICBWXzg4RjY5MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAiYXVkaW8iLCAgICJtY2xrIiwgICAgIFZfODhGNjkyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZCIsICAgICAgImQ0IiwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig2LCAicGNpZTAiLCAgICJjbGtyZXEiLCAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNywgInVhMSIsICAgICAidHhkIiwgICAgICBWXzg4RjY5MjBfUExVUykpLAorCU1QUF9NT0RFKDQ5LAorCQkgTVBQX1ZBUl9GVU5DVElPTigwLCAiZ3BpbyIsICAgIE5VTEwsICAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInRkbSIsICAgICAiZnN5bmMiLCAgICBWXzg4RjY5MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAiYXVkaW8iLCAgICJscmNsayIsICAgIFZfODhGNjkyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZCIsICAgICAgImQ1IiwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig3LCAidWEyIiwgICAgICJyeGQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoNTAsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAicGNpZTAiLCAgICJyc3RvdXQiLCAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgInRkbSIsICAgICAiZHJ4IiwgICAgICBWXzg4RjY5MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAiYXVkaW8iLCAgICJleHRjbGsiLCAgIFZfODhGNjkyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZCIsICAgICAgImNtZCIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig3LCAidWEyIiwgICAgICJyeGQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoNTEsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidGRtIiwgICAgICJkdHgiLCAgICAgIFZfODhGNjkyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJhdWRpbyIsICAgInNkbyIsICAgICAgVl84OEY2OTI4KSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgIm0iLCAgICAgICAiZGVjYyIsICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDcsICJ1YTIiLCAgICAgInR4ZCIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSg1MiwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJwY2llMCIsICAgInJzdG91dCIsICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidGRtIiwgICAgICJpbnRuIiwgICAgIFZfODhGNjkyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJhdWRpbyIsICAgInNkaSIsICAgICAgVl84OEY2OTI4KSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkIiwgICAgICAiZDYiLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDcsICJpMmMzIiwgICAgInNjayIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSg1MywKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzYXRhMSIsICAgInByZXNlbnQiLCAgVl84OEY2OTI4KSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInNhdGEwIiwgICAicHJlc2VudCIsICBWXzg4RjY5MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAidGRtIiwgICAgICJyc3RuIiwgICAgIFZfODhGNjkyOCksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJhdWRpbyIsICAgImJjbGsiLCAgICAgVl84OEY2OTI4KSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkIiwgICAgICAiZDciLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDcsICJpMmMzIiwgICAgInNkYSIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSg1NCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJzYXRhMCIsICAgInByZXNlbnQiLCAgVl84OEY2OTI4KSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgInNhdGExIiwgICAicHJlc2VudCIsICBWXzg4RjY5MjgpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTAiLCAgICJyc3RvdXQiLCAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkIiwgICAgICAiZDMiLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDcsICJ1YTMiLCAgICAgInR4ZCIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSg1NSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDEsICJ1YTEiLCAgICAgImN0cyIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMSIsICAgICJjczEiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkIiwgICAgICAiZDAiLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDYsICJ1YTEiLCAgICAgInJ4ZCIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig3LCAidWEzIiwgICAgICJyeGQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoNTYsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAidWExIiwgICAgICJydHMiLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMywgIm0iLCAgICAgICAiZGVjYyIsICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkxIiwgICAgIm1vc2kiLCAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig2LCAidWExIiwgICAgICJ0eGQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoNTcsCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig0LCAic3BpMSIsICAgICJzY2siLCAgICAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNSwgInNkIiwgICAgICAiY2xrIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDYsICJ1YTEiLCAgICAgInR4ZCIsICAgICAgVl84OEY2OTIwX1BMVVMpKSwKKwlNUFBfTU9ERSg1OCwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMCwgImdwaW8iLCAgICBOVUxMLCAgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDIsICJpMmMxIiwgICAgInNjayIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigzLCAicGNpZTIiLCAgICJjbGtyZXEiLCAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oNCwgInNwaTEiLCAgICAibWlzbyIsICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDUsICJzZCIsICAgICAgImQxIiwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig2LCAidWExIiwgICAgICJyeGQiLCAgICAgIFZfODhGNjkyMF9QTFVTKSksCisJTVBQX01PREUoNTksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDAsICJncGlvIiwgICAgTlVMTCwgICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTigxLCAicGNpZTAiLCAgICJyc3RvdXQiLCAgIFZfODhGNjkyMF9QTFVTKSwKKwkJIE1QUF9WQVJfRlVOQ1RJT04oMiwgImkyYzEiLCAgICAic2RhIiwgICAgICBWXzg4RjY5MjBfUExVUyksCisJCSBNUFBfVkFSX0ZVTkNUSU9OKDQsICJzcGkxIiwgICAgImNzMCIsICAgICAgVl84OEY2OTIwX1BMVVMpLAorCQkgTVBQX1ZBUl9GVU5DVElPTig1LCAic2QiLCAgICAgICJkMiIsICAgICAgIFZfODhGNjkyMF9QTFVTKSksCit9OworCitzdGF0aWMgc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gYXJtYWRhXzM5eF9waW5jdHJsX2luZm87CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybWFkYV8zOXhfcGluY3RybF9vZl9tYXRjaFtdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAibWFydmVsbCxtdjg4ZjY5MjAtcGluY3RybCIsCisJCS5kYXRhICAgICAgID0gKHZvaWQgKikgVl84OEY2OTIwLAorCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJtYXJ2ZWxsLG12ODhmNjkyOC1waW5jdHJsIiwKKwkJLmRhdGEgICAgICAgPSAodm9pZCAqKSBWXzg4RjY5MjgsCisJfSwKKwl7IH0sCit9OworCitzdGF0aWMgc3RydWN0IG12ZWJ1X21wcF9jdHJsIGFybWFkYV8zOXhfbXBwX2NvbnRyb2xzW10gPSB7CisJTVBQX0ZVTkNfQ1RSTCgwLCA1OSwgTlVMTCwgYXJtYWRhXzM5eF9tcHBfY3RybCksCit9OworCitzdGF0aWMgc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSBhcm1hZGFfMzl4X21wcF9ncGlvX3Jhbmdlc1tdID0geworCU1QUF9HUElPX1JBTkdFKDAsICAgMCwgIDAsIDMyKSwKKwlNUFBfR1BJT19SQU5HRSgxLCAgMzIsIDMyLCAyNyksCit9OworCitzdGF0aWMgaW50IGFybWFkYV8zOXhfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdmVidV9waW5jdHJsX3NvY19pbmZvICpzb2MgPSAmYXJtYWRhXzM5eF9waW5jdHJsX2luZm87CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2ggPQorCQlvZl9tYXRjaF9kZXZpY2UoYXJtYWRhXzM5eF9waW5jdHJsX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCWlmICghbWF0Y2gpCisJCXJldHVybiAtRU5PREVWOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwltcHBfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIobXBwX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihtcHBfYmFzZSk7CisKKwlzb2MtPnZhcmlhbnQgPSAodW5zaWduZWQpIG1hdGNoLT5kYXRhICYgMHhmZjsKKwlzb2MtPmNvbnRyb2xzID0gYXJtYWRhXzM5eF9tcHBfY29udHJvbHM7CisJc29jLT5uY29udHJvbHMgPSBBUlJBWV9TSVpFKGFybWFkYV8zOXhfbXBwX2NvbnRyb2xzKTsKKwlzb2MtPmdwaW9yYW5nZXMgPSBhcm1hZGFfMzl4X21wcF9ncGlvX3JhbmdlczsKKwlzb2MtPm5ncGlvcmFuZ2VzID0gQVJSQVlfU0laRShhcm1hZGFfMzl4X21wcF9ncGlvX3Jhbmdlcyk7CisJc29jLT5tb2RlcyA9IGFybWFkYV8zOXhfbXBwX21vZGVzOworCXNvYy0+bm1vZGVzID0gYXJtYWRhXzM5eF9tcHBfY29udHJvbHNbMF0ubnBpbnM7CisKKwlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IHNvYzsKKworCXJldHVybiBtdmVidV9waW5jdHJsX3Byb2JlKHBkZXYpOworfQorCitzdGF0aWMgaW50IGFybWFkYV8zOXhfcGluY3RybF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlyZXR1cm4gbXZlYnVfcGluY3RybF9yZW1vdmUocGRldik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFybWFkYV8zOXhfcGluY3RybF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYXJtYWRhLTM5eC1waW5jdHJsIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGFybWFkYV8zOXhfcGluY3RybF9vZl9tYXRjaCksCisJfSwKKwkucHJvYmUgPSBhcm1hZGFfMzl4X3BpbmN0cmxfcHJvYmUsCisJLnJlbW92ZSA9IGFybWFkYV8zOXhfcGluY3RybF9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFybWFkYV8zOXhfcGluY3RybF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgUGV0YXp6b25pIDx0aG9tYXMucGV0YXp6b25pQGZyZWUtZWxlY3Ryb25zLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTWFydmVsbCBBcm1hZGEgMzl4IHBpbmN0cmwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1hcm1hZGEteHAuYyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS14cC5jCmluZGV4IGZjMzM3NjEuLjU3OGRiOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS14cC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWFybWFkYS14cC5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSAicGluY3RybC1tdmVidS5oIgogCiBzdGF0aWMgdm9pZCBfX2lvbWVtICptcHBfYmFzZTsKK3N0YXRpYyB1MzIgKm1wcF9zYXZlZF9yZWdzOwogCiBzdGF0aWMgaW50IGFybWFkYV94cF9tcHBfY3RybF9nZXQodW5zaWduZWQgcGlkLCB1bnNpZ25lZCBsb25nICpjb25maWcpCiB7CkBAIC0zNjEsNyArMzYyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBtdmVidV9waW5jdHJsX3NvY19pbmZvIGFybWFkYV94cF9waW5jdHJsX2luZm87CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFybWFkYV94cF9waW5jdHJsX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhcm1hZGFfeHBfcGluY3RybF9vZl9tYXRjaFtdID0gewogCXsKIAkJLmNvbXBhdGlibGUgPSAibWFydmVsbCxtdjc4MjMwLXBpbmN0cmwiLAogCQkuZGF0YSAgICAgICA9ICh2b2lkICopIFZfTVY3ODIzMCwKQEAgLTQwNiwxMiArNDA3LDQyIEBACiAJTVBQX0dQSU9fUkFOR0UoMiwgIDY0LCA2NCwgIDMpLAogfTsKIAorc3RhdGljIGludCBhcm1hZGFfeHBfcGluY3RybF9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICAgICBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gKnNvYyA9CisJCXBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCBpLCBucmVnczsKKworCW5yZWdzID0gRElWX1JPVU5EX1VQKHNvYy0+bm1vZGVzLCBNVkVCVV9NUFBTX1BFUl9SRUcpOworCisJZm9yIChpID0gMDsgaSA8IG5yZWdzOyBpKyspCisJCW1wcF9zYXZlZF9yZWdzW2ldID0gcmVhZGwobXBwX2Jhc2UgKyBpICogNCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcm1hZGFfeHBfcGluY3RybF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXZlYnVfcGluY3RybF9zb2NfaW5mbyAqc29jID0KKwkJcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGksIG5yZWdzOworCisJbnJlZ3MgPSBESVZfUk9VTkRfVVAoc29jLT5ubW9kZXMsIE1WRUJVX01QUFNfUEVSX1JFRyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJlZ3M7IGkrKykKKwkJd3JpdGVsKG1wcF9zYXZlZF9yZWdzW2ldLCBtcHBfYmFzZSArIGkgKiA0KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGFybWFkYV94cF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG12ZWJ1X3BpbmN0cmxfc29jX2luZm8gKnNvYyA9ICZhcm1hZGFfeHBfcGluY3RybF9pbmZvOwogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoID0KIAkJb2ZfbWF0Y2hfZGV2aWNlKGFybWFkYV94cF9waW5jdHJsX29mX21hdGNoLCAmcGRldi0+ZGV2KTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgbnJlZ3M7CiAKIAlpZiAoIW1hdGNoKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTQ1OSw2ICs0OTAsMTMgQEAKIAkJYnJlYWs7CiAJfQogCisJbnJlZ3MgPSBESVZfUk9VTkRfVVAoc29jLT5ubW9kZXMsIE1WRUJVX01QUFNfUEVSX1JFRyk7CisKKwltcHBfc2F2ZWRfcmVncyA9IGRldm1fa21hbGxvYygmcGRldi0+ZGV2LCBucmVncyAqIHNpemVvZih1MzIpLAorCQkJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghbXBwX3NhdmVkX3JlZ3MpCisJCXJldHVybiAtRU5PTUVNOworCiAJcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBzb2M7CiAKIAlyZXR1cm4gbXZlYnVfcGluY3RybF9wcm9iZShwZGV2KTsKQEAgLTQ3Niw2ICs1MTQsOCBAQAogCX0sCiAJLnByb2JlID0gYXJtYWRhX3hwX3BpbmN0cmxfcHJvYmUsCiAJLnJlbW92ZSA9IGFybWFkYV94cF9waW5jdHJsX3JlbW92ZSwKKwkuc3VzcGVuZCA9IGFybWFkYV94cF9waW5jdHJsX3N1c3BlbmQsCisJLnJlc3VtZSA9IGFybWFkYV94cF9waW5jdHJsX3Jlc3VtZSwKIH07CiAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXJtYWRhX3hwX3BpbmN0cmxfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWtpcmt3b29kLmMgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1raXJrd29vZC5jCmluZGV4IGRiYzY3M2MuLjBmMDdkYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLWtpcmt3b29kLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwta2lya3dvb2QuYwpAQCAtNDU2LDcgKzQ1Niw3IEBACiAJLm5ncGlvcmFuZ2VzID0gQVJSQVlfU0laRShtdjg4ZjYyOHhfZ3Bpb19yYW5nZXMpLAogfTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQga2lya3dvb2RfcGluY3RybF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQga2lya3dvb2RfcGluY3RybF9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCw4OGY2MTgwLXBpbmN0cmwiLCAuZGF0YSA9ICZtdjg4ZjYxODBfaW5mbyB9LAogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCw4OGY2MTkwLXBpbmN0cmwiLCAuZGF0YSA9ICZtdjg4ZjYxOTBfaW5mbyB9LAogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCw4OGY2MTkyLXBpbmN0cmwiLCAuZGF0YSA9ICZtdjg4ZjYxOTJfaW5mbyB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtb3Jpb24uYyBiL2RyaXZlcnMvcGluY3RybC9tdmVidS9waW5jdHJsLW9yaW9uLmMKaW5kZXggM2E2MzJlZi4uM2I3MTIyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL212ZWJ1L3BpbmN0cmwtb3Jpb24uYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbXZlYnUvcGluY3RybC1vcmlvbi5jCkBAIC0yMTEsNyArMjExLDcgQEAKICAqIFRoZXJlIGFyZSBtdWx0aXBsZSB2YXJpYW50cyBvZiB0aGUgT3Jpb24gU29DcywgYnV0IGluIHRlcm1zIG9mIHBpbgogICogbXV4aW5nLCB0aGV5IGFyZSBpZGVudGljYWwuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9yaW9uX3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG9yaW9uX3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsODhmNTE4MWwtcGluY3RybCIsIC5kYXRhID0gJm12ODhmNTE4MWxfaW5mbyB9LAogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCw4OGY1MTgyLXBpbmN0cmwiLCAuZGF0YSA9ICZtdjg4ZjUxODJfaW5mbyB9LAogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCw4OGY1MjgxLXBpbmN0cmwiLCAuZGF0YSA9ICZtdjg4ZjUyODFfaW5mbyB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL25vbWFkaWsvcGluY3RybC1hYng1MDAuYyBiL2RyaXZlcnMvcGluY3RybC9ub21hZGlrL3BpbmN0cmwtYWJ4NTAwLmMKaW5kZXggMTgwNmIyNC4uMjNkYjRjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL25vbWFkaWsvcGluY3RybC1hYng1MDAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvbm9tYWRpay9waW5jdHJsLWFieDUwMC5jCkBAIC00NjYsNyArNDY2LDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlkZXZfZGJnKHBjdC0+ZGV2LCAidW5rbm93IGFsdF9zZXR0aW5nICVkXG4iLCBhbHRfc2V0dGluZyk7CisJCWRldl9kYmcocGN0LT5kZXYsICJ1bmtub3duIGFsdF9zZXR0aW5nICVkXG4iLCBhbHRfc2V0dGluZyk7CiAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmNvbmYtZ2VuZXJpYy5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmNvbmYtZ2VuZXJpYy5jCmluZGV4IDRkYjkyZjYuLmU2M2FkOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jb25mLWdlbmVyaWMuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY29uZi1nZW5lcmljLmMKQEAgLTI4MywyMyArMjgzLDQwIEBACiAJc3RydWN0IGRldmljZSAqZGV2ID0gcGN0bGRldi0+ZGV2OwogCXVuc2lnbmVkIGxvbmcgKmNvbmZpZ3MgPSBOVUxMOwogCXVuc2lnbmVkIG51bV9jb25maWdzID0gMDsKLQl1bnNpZ25lZCByZXNlcnZlOworCXVuc2lnbmVkIHJlc2VydmUsIHN0cmluZ3NfY291bnQ7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wOwogCWNvbnN0IGNoYXIgKmdyb3VwOwogCWNvbnN0IGNoYXIgKnN1Ym5vZGVfdGFyZ2V0X3R5cGUgPSAicGlucyI7CiAKKwlyZXQgPSBvZl9wcm9wZXJ0eV9jb3VudF9zdHJpbmdzKG5wLCAicGlucyIpOworCWlmIChyZXQgPCAwKSB7CisJCXJldCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MobnAsICJncm91cHMiKTsKKwkJaWYgKHJldCA8IDApCisJCQkvKiBza2lwIHRoaXMgbm9kZTsgbWF5IGNvbnRhaW4gY29uZmlnIGNoaWxkIG5vZGVzICovCisJCQlyZXR1cm4gMDsKKwkJaWYgKHR5cGUgPT0gUElOX01BUF9UWVBFX0lOVkFMSUQpCisJCQl0eXBlID0gUElOX01BUF9UWVBFX0NPTkZJR1NfR1JPVVA7CisJCXN1Ym5vZGVfdGFyZ2V0X3R5cGUgPSAiZ3JvdXBzIjsKKwl9IGVsc2UgeworCQlpZiAodHlwZSA9PSBQSU5fTUFQX1RZUEVfSU5WQUxJRCkKKwkJCXR5cGUgPSBQSU5fTUFQX1RZUEVfQ09ORklHU19QSU47CisJfQorCXN0cmluZ3NfY291bnQgPSByZXQ7CisKIAlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhucCwgImZ1bmN0aW9uIiwgJmZ1bmN0aW9uKTsKIAlpZiAocmV0IDwgMCkgewogCQkvKiBFSU5WQUw9bWlzc2luZywgd2hpY2ggaXMgZmluZSBzaW5jZSBpdCdzIG9wdGlvbmFsICovCiAJCWlmIChyZXQgIT0gLUVJTlZBTCkKLQkJCWRldl9lcnIoZGV2LCAiY291bGQgbm90IHBhcnNlIHByb3BlcnR5IGZ1bmN0aW9uXG4iKTsKKwkJCWRldl9lcnIoZGV2LCAiJXM6IGNvdWxkIG5vdCBwYXJzZSBwcm9wZXJ0eSBmdW5jdGlvblxuIiwKKwkJCQlvZl9ub2RlX2Z1bGxfbmFtZShucCkpOwogCQlmdW5jdGlvbiA9IE5VTEw7CiAJfQogCiAJcmV0ID0gcGluY29uZl9nZW5lcmljX3BhcnNlX2R0X2NvbmZpZyhucCwgcGN0bGRldiwgJmNvbmZpZ3MsCiAJCQkJCSAgICAgICZudW1fY29uZmlncyk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgcGFyc2Ugbm9kZSBwcm9wZXJ0eVxuIik7CisJCWRldl9lcnIoZGV2LCAiJXM6IGNvdWxkIG5vdCBwYXJzZSBub2RlIHByb3BlcnR5XG4iLAorCQkJb2Zfbm9kZV9mdWxsX25hbWUobnApKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTMwOSwyMSArMzI2LDcgQEAKIAlpZiAobnVtX2NvbmZpZ3MpCiAJCXJlc2VydmUrKzsKIAotCXJldCA9IG9mX3Byb3BlcnR5X2NvdW50X3N0cmluZ3MobnAsICJwaW5zIik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcmV0ID0gb2ZfcHJvcGVydHlfY291bnRfc3RyaW5ncyhucCwgImdyb3VwcyIpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgcGFyc2UgcHJvcGVydHkgcGlucy9ncm91cHNcbiIpOwotCQkJZ290byBleGl0OwotCQl9Ci0JCWlmICh0eXBlID09IFBJTl9NQVBfVFlQRV9JTlZBTElEKQotCQkJdHlwZSA9IFBJTl9NQVBfVFlQRV9DT05GSUdTX0dST1VQOwotCQlzdWJub2RlX3RhcmdldF90eXBlID0gImdyb3VwcyI7Ci0JfSBlbHNlIHsKLQkJaWYgKHR5cGUgPT0gUElOX01BUF9UWVBFX0lOVkFMSUQpCi0JCQl0eXBlID0gUElOX01BUF9UWVBFX0NPTkZJR1NfUElOOwotCX0KLQlyZXNlcnZlICo9IHJldDsKKwlyZXNlcnZlICo9IHN0cmluZ3NfY291bnQ7CiAKIAlyZXQgPSBwaW5jdHJsX3V0aWxzX3Jlc2VydmVfbWFwKHBjdGxkZXYsIG1hcCwgcmVzZXJ2ZWRfbWFwcywKIAkJCW51bV9tYXBzLCByZXNlcnZlKTsKQEAgLTM2NywxNSArMzcwLDIyIEBACiAJKm1hcCA9IE5VTEw7CiAJKm51bV9tYXBzID0gMDsKIAorCXJldCA9IHBpbmNvbmZfZ2VuZXJpY19kdF9zdWJub2RlX3RvX21hcChwY3RsZGV2LCBucF9jb25maWcsIG1hcCwKKwkJCQkJCSZyZXNlcnZlZF9tYXBzLCBudW1fbWFwcywgdHlwZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXhpdDsKKwogCWZvcl9lYWNoX2NoaWxkX29mX25vZGUobnBfY29uZmlnLCBucCkgewogCQlyZXQgPSBwaW5jb25mX2dlbmVyaWNfZHRfc3Vibm9kZV90b19tYXAocGN0bGRldiwgbnAsIG1hcCwKIAkJCQkJJnJlc2VydmVkX21hcHMsIG51bV9tYXBzLCB0eXBlKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXBpbmN0cmxfdXRpbHNfZHRfZnJlZV9tYXAocGN0bGRldiwgKm1hcCwgKm51bV9tYXBzKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGV4aXQ7CiAJfQogCXJldHVybiAwOworCitleGl0OgorCXBpbmN0cmxfdXRpbHNfZHRfZnJlZV9tYXAocGN0bGRldiwgKm1hcCwgKm51bV9tYXBzKTsKKwlyZXR1cm4gcmV0OwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGluY29uZl9nZW5lcmljX2R0X25vZGVfdG9fbWFwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYW1kLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGUzYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYW1kLmMKQEAgLTAsMCArMSw4NjkgQEAKKy8qCisgKiBHUElPIGRyaXZlciBmb3IgQU1ECisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LDIwMTUgQU1EIENvcnBvcmF0aW9uLgorICogQXV0aG9yczogS2VuIFh1ZSA8S2VuLlh1ZUBhbWQuY29tPgorICogICAgICBXdSwgSmVmZiA8SmVmZi5XdUBhbWQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi1nZW5lcmljLmg+CisKKyNpbmNsdWRlICJwaW5jdHJsLXV0aWxzLmgiCisjaW5jbHVkZSAicGluY3RybC1hbWQuaCIKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYW1kX2dwaW8gKnRvX2FtZF9ncGlvKHN0cnVjdCBncGlvX2NoaXAgKmdjKQoreworCXJldHVybiBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCBhbWRfZ3BpbywgZ2MpOworfQorCitzdGF0aWMgaW50IGFtZF9ncGlvX2RpcmVjdGlvbl9pbnB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHBpbl9yZWc7CisJc3RydWN0IGFtZF9ncGlvICpncGlvX2RldiA9IHRvX2FtZF9ncGlvKGdjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOworCXBpbl9yZWcgPSByZWFkbChncGlvX2Rldi0+YmFzZSArIG9mZnNldCAqIDQpOworCS8qCisJICogU3VwcG9zZSBCSU9TIG9yIEJvb3Rsb2FkZXIgc2V0cyBzcGVjaWZpYyBkZWJvdW5jZSBmb3IgdGhlCisJICogR1BJTy4gaWYgbm90LCBzZXQgZGVib3VuY2UgdG8gYmUgIDIuNzVtcyBhbmQgcmVtb3ZlIGdsaXRjaC4KKwkqLworCWlmICgocGluX3JlZyAmIERCX1RNUl9PVVRfTUFTSykgPT0gMCkgeworCQlwaW5fcmVnIHw9IDB4ZjsKKwkJcGluX3JlZyB8PSBCSVQoREJfVE1SX09VVF9VTklUX09GRik7CisJCXBpbl9yZWcgfD0gREJfVFlQRV9SRU1PVkVfR0xJVENIIDw8IERCX0NOVFJMX09GRjsKKwkJcGluX3JlZyAmPSB+QklUKERCX1RNUl9MQVJHRV9PRkYpOworCX0KKworCXBpbl9yZWcgJj0gfkJJVChPVVRQVVRfRU5BQkxFX09GRik7CisJd3JpdGVsKHBpbl9yZWcsIGdwaW9fZGV2LT5iYXNlICsgb2Zmc2V0ICogNCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCwKKwkJaW50IHZhbHVlKQoreworCXUzMiBwaW5fcmVnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFtZF9ncGlvICpncGlvX2RldiA9IHRvX2FtZF9ncGlvKGdjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOworCXBpbl9yZWcgPSByZWFkbChncGlvX2Rldi0+YmFzZSArIG9mZnNldCAqIDQpOworCXBpbl9yZWcgfD0gQklUKE9VVFBVVF9FTkFCTEVfT0ZGKTsKKwlpZiAodmFsdWUpCisJCXBpbl9yZWcgfD0gQklUKE9VVFBVVF9WQUxVRV9PRkYpOworCWVsc2UKKwkJcGluX3JlZyAmPSB+QklUKE9VVFBVVF9WQUxVRV9PRkYpOworCXdyaXRlbChwaW5fcmVnLCBncGlvX2Rldi0+YmFzZSArIG9mZnNldCAqIDQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWRfZ3Bpb19nZXRfdmFsdWUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwl1MzIgcGluX3JlZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhbWRfZ3BpbyAqZ3Bpb19kZXYgPSB0b19hbWRfZ3BpbyhnYyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKKwlwaW5fcmVnID0gcmVhZGwoZ3Bpb19kZXYtPmJhc2UgKyBvZmZzZXQgKiA0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuICEhKHBpbl9yZWcgJiBCSVQoUElOX1NUU19PRkYpKTsKK30KKworc3RhdGljIHZvaWQgYW1kX2dwaW9fc2V0X3ZhbHVlKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwl1MzIgcGluX3JlZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBhbWRfZ3BpbyAqZ3Bpb19kZXYgPSB0b19hbWRfZ3BpbyhnYyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKKwlwaW5fcmVnID0gcmVhZGwoZ3Bpb19kZXYtPmJhc2UgKyBvZmZzZXQgKiA0KTsKKwlpZiAodmFsdWUpCisJCXBpbl9yZWcgfD0gQklUKE9VVFBVVF9WQUxVRV9PRkYpOworCWVsc2UKKwkJcGluX3JlZyAmPSB+QklUKE9VVFBVVF9WQUxVRV9PRkYpOworCXdyaXRlbChwaW5fcmVnLCBncGlvX2Rldi0+YmFzZSArIG9mZnNldCAqIDQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2dwaW9fc2V0X2RlYm91bmNlKHN0cnVjdCBncGlvX2NoaXAgKmdjLCB1bnNpZ25lZCBvZmZzZXQsCisJCXVuc2lnbmVkIGRlYm91bmNlKQoreworCXUzMiB0aW1lOworCXUzMiBwaW5fcmVnOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFtZF9ncGlvICpncGlvX2RldiA9IHRvX2FtZF9ncGlvKGdjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOworCXBpbl9yZWcgPSByZWFkbChncGlvX2Rldi0+YmFzZSArIG9mZnNldCAqIDQpOworCisJaWYgKGRlYm91bmNlKSB7CisJCXBpbl9yZWcgfD0gREJfVFlQRV9SRU1PVkVfR0xJVENIIDw8IERCX0NOVFJMX09GRjsKKwkJcGluX3JlZyAmPSB+REJfVE1SX09VVF9NQVNLOworCQkvKgorCQlEZWJvdW5jZQlEZWJvdW5jZQlUaW1lcglNYXgKKwkJVG1yTGFyZ2UJVG1yT3V0VW5pdAlVbml0CURlYm91bmNlCisJCQkJCQkJVGltZQorCQkwCTAJNjEgdXNlYyAoMiBSdGNDbGspCTk3NiB1c2VjCisJCTAJMQkyNDQgdXNlYyAoOCBSdGNDbGspCTMuOSBtc2VjCisJCTEJMAkxNS42IG1zZWMgKDUxMiBSdGNDbGspCTI1MCBtc2VjCisJCTEJMQk2Mi41IG1zZWMgKDIwNDggUnRjQ2xrKQkxIHNlYworCQkqLworCisJCWlmIChkZWJvdW5jZSA8IDYxKSB7CisJCQlwaW5fcmVnIHw9IDE7CisJCQlwaW5fcmVnICY9IH5CSVQoREJfVE1SX09VVF9VTklUX09GRik7CisJCQlwaW5fcmVnICY9IH5CSVQoREJfVE1SX0xBUkdFX09GRik7CisJCX0gZWxzZSBpZiAoZGVib3VuY2UgPCA5NzYpIHsKKwkJCXRpbWUgPSBkZWJvdW5jZSAvIDYxOworCQkJcGluX3JlZyB8PSB0aW1lICYgREJfVE1SX09VVF9NQVNLOworCQkJcGluX3JlZyAmPSB+QklUKERCX1RNUl9PVVRfVU5JVF9PRkYpOworCQkJcGluX3JlZyAmPSB+QklUKERCX1RNUl9MQVJHRV9PRkYpOworCQl9IGVsc2UgaWYgKGRlYm91bmNlIDwgMzkwMCkgeworCQkJdGltZSA9IGRlYm91bmNlIC8gMjQ0OworCQkJcGluX3JlZyB8PSB0aW1lICYgREJfVE1SX09VVF9NQVNLOworCQkJcGluX3JlZyB8PSBCSVQoREJfVE1SX09VVF9VTklUX09GRik7CisJCQlwaW5fcmVnICY9IH5CSVQoREJfVE1SX0xBUkdFX09GRik7CisJCX0gZWxzZSBpZiAoZGVib3VuY2UgPCAyNTAwMDApIHsKKwkJCXRpbWUgPSBkZWJvdW5jZSAvIDE1NjAwOworCQkJcGluX3JlZyB8PSB0aW1lICYgREJfVE1SX09VVF9NQVNLOworCQkJcGluX3JlZyAmPSB+QklUKERCX1RNUl9PVVRfVU5JVF9PRkYpOworCQkJcGluX3JlZyB8PSBCSVQoREJfVE1SX0xBUkdFX09GRik7CisJCX0gZWxzZSBpZiAoZGVib3VuY2UgPCAxMDAwMDAwKSB7CisJCQl0aW1lID0gZGVib3VuY2UgLyA2MjUwMDsKKwkJCXBpbl9yZWcgfD0gdGltZSAmIERCX1RNUl9PVVRfTUFTSzsKKwkJCXBpbl9yZWcgfD0gQklUKERCX1RNUl9PVVRfVU5JVF9PRkYpOworCQkJcGluX3JlZyB8PSBCSVQoREJfVE1SX0xBUkdFX09GRik7CisJCX0gZWxzZSB7CisJCQlwaW5fcmVnICY9IH5EQl9DTlRSbF9NQVNLOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCXBpbl9yZWcgJj0gfkJJVChEQl9UTVJfT1VUX1VOSVRfT0ZGKTsKKwkJcGluX3JlZyAmPSB+QklUKERCX1RNUl9MQVJHRV9PRkYpOworCQlwaW5fcmVnICY9IH5EQl9UTVJfT1VUX01BU0s7CisJCXBpbl9yZWcgJj0gfkRCX0NOVFJsX01BU0s7CisJfQorCXdyaXRlbChwaW5fcmVnLCBncGlvX2Rldi0+YmFzZSArIG9mZnNldCAqIDQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgdm9pZCBhbWRfZ3Bpb19kYmdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHN0cnVjdCBncGlvX2NoaXAgKmdjKQoreworCXUzMiBwaW5fcmVnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGJhbmssIGksIHBpbl9udW07CisJc3RydWN0IGFtZF9ncGlvICpncGlvX2RldiA9IHRvX2FtZF9ncGlvKGdjKTsKKworCWNoYXIgKmxldmVsX3RyaWc7CisJY2hhciAqYWN0aXZlX2xldmVsOworCWNoYXIgKmludGVycnVwdF9lbmFibGU7CisJY2hhciAqaW50ZXJydXB0X21hc2s7CisJY2hhciAqd2FrZV9jbnRybDA7CisJY2hhciAqd2FrZV9jbnRybDE7CisJY2hhciAqd2FrZV9jbnRybDI7CisJY2hhciAqcGluX3N0czsKKwljaGFyICpwdWxsX3VwX3NlbDsKKwljaGFyICpwdWxsX3VwX2VuYWJsZTsKKwljaGFyICpwdWxsX2Rvd25fZW5hYmxlOworCWNoYXIgKm91dHB1dF92YWx1ZTsKKwljaGFyICpvdXRwdXRfZW5hYmxlOworCisJZm9yIChiYW5rID0gMDsgYmFuayA8IEFNRF9HUElPX1RPVEFMX0JBTktTOyBiYW5rKyspIHsKKwkJc2VxX3ByaW50ZihzLCAiR1BJTyBiYW5rJWRcdCIsIGJhbmspOworCisJCXN3aXRjaCAoYmFuaykgeworCQljYXNlIDA6CisJCQlpID0gMDsKKwkJCXBpbl9udW0gPSBBTURfR1BJT19QSU5TX0JBTkswOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWkgPSA2NDsKKwkJCXBpbl9udW0gPSBBTURfR1BJT19QSU5TX0JBTksxICsgaTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlpID0gMTI4OworCQkJcGluX251bSA9IEFNRF9HUElPX1BJTlNfQkFOSzIgKyBpOworCQkJYnJlYWs7CisJCX0KKworCQlmb3IgKDsgaSA8IHBpbl9udW07IGkrKykgeworCQkJc2VxX3ByaW50ZihzLCAicGluJWRcdCIsIGkpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7CisJCQlwaW5fcmVnID0gcmVhZGwoZ3Bpb19kZXYtPmJhc2UgKyBpICogNCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAocGluX3JlZyAmIEJJVChJTlRFUlJVUFRfRU5BQkxFX09GRikpIHsKKwkJCQlpbnRlcnJ1cHRfZW5hYmxlID0gImludGVycnVwdCBpcyBlbmFibGVkfCI7CisKKwkJCQlpZiAoIShwaW5fcmVnICYgQklUKEFDVElWRV9MRVZFTF9PRkYpKQorCQkJCSYmICEocGluX3JlZyAmIEJJVChBQ1RJVkVfTEVWRUxfT0ZGKzEpKSkKKwkJCQkJYWN0aXZlX2xldmVsID0gIkFjdGl2ZSBsb3d8IjsKKwkJCQllbHNlIGlmIChwaW5fcmVnICYgQklUKEFDVElWRV9MRVZFTF9PRkYpCisJCQkJJiYgIShwaW5fcmVnICYgQklUKEFDVElWRV9MRVZFTF9PRkYrMSkpKQorCQkJCQlhY3RpdmVfbGV2ZWwgPSAiQWN0aXZlIGhpZ2h8IjsKKwkJCQllbHNlIGlmICghKHBpbl9yZWcgJiBCSVQoQUNUSVZFX0xFVkVMX09GRikpCisJCQkJCSYmIHBpbl9yZWcgJiBCSVQoQUNUSVZFX0xFVkVMX09GRisxKSkKKwkJCQkJYWN0aXZlX2xldmVsID0gIkFjdGl2ZSBvbiBib3RofCI7CisJCQkJZWxzZQorCQkJCQlhY3RpdmVfbGV2ZWwgPSAiVW5rbm93IEFjdGl2ZSBsZXZlbHwiOworCisJCQkJaWYgKHBpbl9yZWcgJiBCSVQoTEVWRUxfVFJJR19PRkYpKQorCQkJCQlsZXZlbF90cmlnID0gIkxldmVsIHRyaWdnZXJ8IjsKKwkJCQllbHNlCisJCQkJCWxldmVsX3RyaWcgPSAiRWRnZSB0cmlnZ2VyfCI7CisKKwkJCX0gZWxzZSB7CisJCQkJaW50ZXJydXB0X2VuYWJsZSA9CisJCQkJCSJpbnRlcnJ1cHQgaXMgZGlzYWJsZWR8IjsKKwkJCQlhY3RpdmVfbGV2ZWwgPSAiICI7CisJCQkJbGV2ZWxfdHJpZyA9ICIgIjsKKwkJCX0KKworCQkJaWYgKHBpbl9yZWcgJiBCSVQoSU5URVJSVVBUX01BU0tfT0ZGKSkKKwkJCQlpbnRlcnJ1cHRfbWFzayA9CisJCQkJCSJpbnRlcnJ1cHQgaXMgdW5tYXNrZWR8IjsKKwkJCWVsc2UKKwkJCQlpbnRlcnJ1cHRfbWFzayA9CisJCQkJCSJpbnRlcnJ1cHQgaXMgbWFza2VkfCI7CisKKwkJCWlmIChwaW5fcmVnICYgQklUKFdBS0VfQ05UUkxfT0ZGKSkKKwkJCQl3YWtlX2NudHJsMCA9ICJlbmFibGUgd2FrZXVwIGluIFMwaTMgc3RhdGV8IjsKKwkJCWVsc2UKKwkJCQl3YWtlX2NudHJsMCA9ICJkaXNhYmxlIHdha2V1cCBpbiBTMGkzIHN0YXRlfCI7CisKKwkJCWlmIChwaW5fcmVnICYgQklUKFdBS0VfQ05UUkxfT0ZGKSkKKwkJCQl3YWtlX2NudHJsMSA9ICJlbmFibGUgd2FrZXVwIGluIFMzIHN0YXRlfCI7CisJCQllbHNlCisJCQkJd2FrZV9jbnRybDEgPSAiZGlzYWJsZSB3YWtldXAgaW4gUzMgc3RhdGV8IjsKKworCQkJaWYgKHBpbl9yZWcgJiBCSVQoV0FLRV9DTlRSTF9PRkYpKQorCQkJCXdha2VfY250cmwyID0gImVuYWJsZSB3YWtldXAgaW4gUzQvUzUgc3RhdGV8IjsKKwkJCWVsc2UKKwkJCQl3YWtlX2NudHJsMiA9ICJkaXNhYmxlIHdha2V1cCBpbiBTNC9TNSBzdGF0ZXwiOworCisJCQlpZiAocGluX3JlZyAmIEJJVChQVUxMX1VQX0VOQUJMRV9PRkYpKSB7CisJCQkJcHVsbF91cF9lbmFibGUgPSAicHVsbC11cCBpcyBlbmFibGVkfCI7CisJCQkJaWYgKHBpbl9yZWcgJiBCSVQoUFVMTF9VUF9TRUxfT0ZGKSkKKwkJCQkJcHVsbF91cF9zZWwgPSAiOGsgcHVsbC11cHwiOworCQkJCWVsc2UKKwkJCQkJcHVsbF91cF9zZWwgPSAiNGsgcHVsbC11cHwiOworCQkJfSBlbHNlIHsKKwkJCQlwdWxsX3VwX2VuYWJsZSA9ICJwdWxsLXVwIGlzIGRpc2FibGVkfCI7CisJCQkJcHVsbF91cF9zZWwgPSAiICI7CisJCQl9CisKKwkJCWlmIChwaW5fcmVnICYgQklUKFBVTExfRE9XTl9FTkFCTEVfT0ZGKSkKKwkJCQlwdWxsX2Rvd25fZW5hYmxlID0gInB1bGwtZG93biBpcyBlbmFibGVkfCI7CisJCQllbHNlCisJCQkJcHVsbF9kb3duX2VuYWJsZSA9ICJQdWxsLWRvd24gaXMgZGlzYWJsZWR8IjsKKworCQkJaWYgKHBpbl9yZWcgJiBCSVQoT1VUUFVUX0VOQUJMRV9PRkYpKSB7CisJCQkJcGluX3N0cyA9ICIgIjsKKwkJCQlvdXRwdXRfZW5hYmxlID0gIm91dHB1dCBpcyBlbmFibGVkfCI7CisJCQkJaWYgKHBpbl9yZWcgJiBCSVQoT1VUUFVUX1ZBTFVFX09GRikpCisJCQkJCW91dHB1dF92YWx1ZSA9ICJvdXRwdXQgaXMgaGlnaHwiOworCQkJCWVsc2UKKwkJCQkJb3V0cHV0X3ZhbHVlID0gIm91dHB1dCBpcyBsb3d8IjsKKwkJCX0gZWxzZSB7CisJCQkJb3V0cHV0X2VuYWJsZSA9ICJvdXRwdXQgaXMgZGlzYWJsZWR8IjsKKwkJCQlvdXRwdXRfdmFsdWUgPSAiICI7CisKKwkJCQlpZiAocGluX3JlZyAmIEJJVChQSU5fU1RTX09GRikpCisJCQkJCXBpbl9zdHMgPSAiaW5wdXQgaXMgaGlnaHwiOworCQkJCWVsc2UKKwkJCQkJcGluX3N0cyA9ICJpbnB1dCBpcyBsb3d8IjsKKwkJCX0KKworCQkJc2VxX3ByaW50ZihzLCAiJXMgJXMgJXMgJXMgJXMgJXNcbiIKKwkJCQkiICVzICVzICVzICVzICVzICVzICVzIDB4JXhcbiIsCisJCQkJbGV2ZWxfdHJpZywgYWN0aXZlX2xldmVsLCBpbnRlcnJ1cHRfZW5hYmxlLAorCQkJCWludGVycnVwdF9tYXNrLCB3YWtlX2NudHJsMCwgd2FrZV9jbnRybDEsCisJCQkJd2FrZV9jbnRybDIsIHBpbl9zdHMsIHB1bGxfdXBfc2VsLAorCQkJCXB1bGxfdXBfZW5hYmxlLCBwdWxsX2Rvd25fZW5hYmxlLAorCQkJCW91dHB1dF92YWx1ZSwgb3V0cHV0X2VuYWJsZSwgcGluX3JlZyk7CisJCX0KKwl9Cit9CisjZWxzZQorI2RlZmluZSBhbWRfZ3Bpb19kYmdfc2hvdyBOVUxMCisjZW5kaWYKKworc3RhdGljIHZvaWQgYW1kX2dwaW9faXJxX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJdTMyIHBpbl9yZWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBhbWRfZ3BpbyAqZ3Bpb19kZXYgPSB0b19hbWRfZ3BpbyhnYyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKKwlwaW5fcmVnID0gcmVhZGwoZ3Bpb19kZXYtPmJhc2UgKyAoZC0+aHdpcnEpKjQpOworCS8qCisJCVN1cHBvc2UgQklPUyBvciBCb290bG9hZGVyIHNldHMgc3BlY2lmaWMgZGVib3VuY2UgZm9yIHRoZQorCQlHUElPLiBpZiBub3QsIHNldCBkZWJvdW5jZSB0byBiZSAgMi43NW1zLgorCSovCisJaWYgKChwaW5fcmVnICYgREJfVE1SX09VVF9NQVNLKSA9PSAwKSB7CisJCXBpbl9yZWcgfD0gMHhmOworCQlwaW5fcmVnIHw9IEJJVChEQl9UTVJfT1VUX1VOSVRfT0ZGKTsKKwkJcGluX3JlZyAmPSB+QklUKERCX1RNUl9MQVJHRV9PRkYpOworCX0KKwlwaW5fcmVnIHw9IEJJVChJTlRFUlJVUFRfRU5BQkxFX09GRik7CisJcGluX3JlZyB8PSBCSVQoSU5URVJSVVBUX01BU0tfT0ZGKTsKKwl3cml0ZWwocGluX3JlZywgZ3Bpb19kZXYtPmJhc2UgKyAoZC0+aHdpcnEpKjQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9ncGlvX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1MzIgcGluX3JlZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IGFtZF9ncGlvICpncGlvX2RldiA9IHRvX2FtZF9ncGlvKGdjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOworCXBpbl9yZWcgPSByZWFkbChncGlvX2Rldi0+YmFzZSArIChkLT5od2lycSkqNCk7CisJcGluX3JlZyAmPSB+QklUKElOVEVSUlVQVF9FTkFCTEVfT0ZGKTsKKwlwaW5fcmVnICY9IH5CSVQoSU5URVJSVVBUX01BU0tfT0ZGKTsKKwl3cml0ZWwocGluX3JlZywgZ3Bpb19kZXYtPmJhc2UgKyAoZC0+aHdpcnEpKjQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1MzIgcGluX3JlZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IGFtZF9ncGlvICpncGlvX2RldiA9IHRvX2FtZF9ncGlvKGdjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOworCXBpbl9yZWcgPSByZWFkbChncGlvX2Rldi0+YmFzZSArIChkLT5od2lycSkqNCk7CisJcGluX3JlZyAmPSB+QklUKElOVEVSUlVQVF9NQVNLX09GRik7CisJd3JpdGVsKHBpbl9yZWcsIGdwaW9fZGV2LT5iYXNlICsgKGQtPmh3aXJxKSo0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhbWRfZ3Bpb19pcnFfdW5tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1MzIgcGluX3JlZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBncGlvX2NoaXAgKmdjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJc3RydWN0IGFtZF9ncGlvICpncGlvX2RldiA9IHRvX2FtZF9ncGlvKGdjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOworCXBpbl9yZWcgPSByZWFkbChncGlvX2Rldi0+YmFzZSArIChkLT5od2lycSkqNCk7CisJcGluX3JlZyB8PSBCSVQoSU5URVJSVVBUX01BU0tfT0ZGKTsKKwl3cml0ZWwocGluX3JlZywgZ3Bpb19kZXYtPmJhc2UgKyAoZC0+aHdpcnEpKjQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9ncGlvX2lycV9lb2koc3RydWN0IGlycV9kYXRhICpkKQoreworCXUzMiByZWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBhbWRfZ3BpbyAqZ3Bpb19kZXYgPSB0b19hbWRfZ3BpbyhnYyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKKwlyZWcgPSByZWFkbChncGlvX2Rldi0+YmFzZSArIFdBS0VfSU5UX01BU1RFUl9SRUcpOworCXJlZyB8PSBFT0lfTUFTSzsKKwl3cml0ZWwocmVnLCBncGlvX2Rldi0+YmFzZSArIFdBS0VfSU5UX01BU1RFUl9SRUcpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2dwaW9faXJxX3NldF90eXBlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IHR5cGUpCit7CisJaW50IHJldCA9IDA7CisJdTMyIHBpbl9yZWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBhbWRfZ3BpbyAqZ3Bpb19kZXYgPSB0b19hbWRfZ3BpbyhnYyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKKwlwaW5fcmVnID0gcmVhZGwoZ3Bpb19kZXYtPmJhc2UgKyAoZC0+aHdpcnEpKjQpOworCisJc3dpdGNoICh0eXBlICYgSVJRX1RZUEVfU0VOU0VfTUFTSykgeworCWNhc2UgSVJRX1RZUEVfRURHRV9SSVNJTkc6CisJCXBpbl9yZWcgJj0gfkJJVChMRVZFTF9UUklHX09GRik7CisJCXBpbl9yZWcgJj0gfihBQ1RJVkVfTEVWRUxfTUFTSyA8PCBBQ1RJVkVfTEVWRUxfT0ZGKTsKKwkJcGluX3JlZyB8PSBBQ1RJVkVfSElHSCA8PCBBQ1RJVkVfTEVWRUxfT0ZGOworCQlwaW5fcmVnIHw9IERCX1RZUEVfUkVNT1ZFX0dMSVRDSCA8PCBEQl9DTlRSTF9PRkY7CisJCV9faXJxX3NldF9oYW5kbGVyX2xvY2tlZChkLT5pcnEsIGhhbmRsZV9lZGdlX2lycSk7CisJCWJyZWFrOworCisJY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6CisJCXBpbl9yZWcgJj0gfkJJVChMRVZFTF9UUklHX09GRik7CisJCXBpbl9yZWcgJj0gfihBQ1RJVkVfTEVWRUxfTUFTSyA8PCBBQ1RJVkVfTEVWRUxfT0ZGKTsKKwkJcGluX3JlZyB8PSBBQ1RJVkVfTE9XIDw8IEFDVElWRV9MRVZFTF9PRkY7CisJCXBpbl9yZWcgfD0gREJfVFlQRV9SRU1PVkVfR0xJVENIIDw8IERCX0NOVFJMX09GRjsKKwkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0VER0VfQk9USDoKKwkJcGluX3JlZyAmPSB+QklUKExFVkVMX1RSSUdfT0ZGKTsKKwkJcGluX3JlZyAmPSB+KEFDVElWRV9MRVZFTF9NQVNLIDw8IEFDVElWRV9MRVZFTF9PRkYpOworCQlwaW5fcmVnIHw9IEJPVEhfRUFER0UgPDwgQUNUSVZFX0xFVkVMX09GRjsKKwkJcGluX3JlZyB8PSBEQl9UWVBFX1JFTU9WRV9HTElUQ0ggPDwgREJfQ05UUkxfT0ZGOworCQlfX2lycV9zZXRfaGFuZGxlcl9sb2NrZWQoZC0+aXJxLCBoYW5kbGVfZWRnZV9pcnEpOworCQlicmVhazsKKworCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKKwkJcGluX3JlZyB8PSBMRVZFTF9UUklHR0VSIDw8IExFVkVMX1RSSUdfT0ZGOworCQlwaW5fcmVnICY9IH4oQUNUSVZFX0xFVkVMX01BU0sgPDwgQUNUSVZFX0xFVkVMX09GRik7CisJCXBpbl9yZWcgfD0gQUNUSVZFX0hJR0ggPDwgQUNUSVZFX0xFVkVMX09GRjsKKwkJcGluX3JlZyAmPSB+KERCX0NOVFJsX01BU0sgPDwgREJfQ05UUkxfT0ZGKTsKKwkJcGluX3JlZyB8PSBEQl9UWVBFX1BSRVNFUlZFX0xPV19HTElUQ0ggPDwgREJfQ05UUkxfT0ZGOworCQlfX2lycV9zZXRfaGFuZGxlcl9sb2NrZWQoZC0+aXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKKwkJcGluX3JlZyB8PSBMRVZFTF9UUklHR0VSIDw8IExFVkVMX1RSSUdfT0ZGOworCQlwaW5fcmVnICY9IH4oQUNUSVZFX0xFVkVMX01BU0sgPDwgQUNUSVZFX0xFVkVMX09GRik7CisJCXBpbl9yZWcgfD0gQUNUSVZFX0xPVyA8PCBBQ1RJVkVfTEVWRUxfT0ZGOworCQlwaW5fcmVnICY9IH4oREJfQ05UUmxfTUFTSyA8PCBEQl9DTlRSTF9PRkYpOworCQlwaW5fcmVnIHw9IERCX1RZUEVfUFJFU0VSVkVfSElHSF9HTElUQ0ggPDwgREJfQ05UUkxfT0ZGOworCQlfX2lycV9zZXRfaGFuZGxlcl9sb2NrZWQoZC0+aXJxLCBoYW5kbGVfbGV2ZWxfaXJxKTsKKwkJYnJlYWs7CisKKwljYXNlIElSUV9UWVBFX05PTkU6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycigmZ3Bpb19kZXYtPnBkZXYtPmRldiwgIkludmFsaWQgdHlwZSB2YWx1ZVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJcGluX3JlZyB8PSBDTFJfSU5UUl9TVEFUIDw8IElOVEVSUlVQVF9TVFNfT0ZGOworCXdyaXRlbChwaW5fcmVnLCBncGlvX2Rldi0+YmFzZSArIChkLT5od2lycSkqNCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwkvKgorCSAqIGJhc2VkIG9uIEhXIGRlc2lnbix0aGVyZSBpcyBubyBuZWVkIHRvIGFjayBIVworCSAqIGJlZm9yZSBoYW5kbGUgY3VycmVudCBpcnEuIEJ1dCB0aGlzIHJvdXRpbmUgaXMKKwkgKiBuZWNlc3NhcnkgZm9yIGhhbmRsZV9lZGdlX2lycQorCSovCit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYW1kX2dwaW9faXJxY2hpcCA9IHsKKwkubmFtZSAgICAgICAgID0gImFtZF9ncGlvIiwKKwkuaXJxX2FjayAgICAgID0gYW1kX2lycV9hY2ssCisJLmlycV9lbmFibGUgICA9IGFtZF9ncGlvX2lycV9lbmFibGUsCisJLmlycV9kaXNhYmxlICA9IGFtZF9ncGlvX2lycV9kaXNhYmxlLAorCS5pcnFfbWFzayAgICAgPSBhbWRfZ3Bpb19pcnFfbWFzaywKKwkuaXJxX3VubWFzayAgID0gYW1kX2dwaW9faXJxX3VubWFzaywKKwkuaXJxX2VvaSAgICAgID0gYW1kX2dwaW9faXJxX2VvaSwKKwkuaXJxX3NldF90eXBlID0gYW1kX2dwaW9faXJxX3NldF90eXBlLAorfTsKKworc3RhdGljIHZvaWQgYW1kX2dwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXUzMiBpOworCXUzMiBvZmY7CisJdTMyIHJlZzsKKwl1MzIgcGluX3JlZzsKKwl1NjQgcmVnNjQ7CisJaW50IGhhbmRsZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2dldF9jaGlwKGlycSk7CisJc3RydWN0IGdwaW9fY2hpcCAqZ2MgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBhbWRfZ3BpbyAqZ3Bpb19kZXYgPSB0b19hbWRfZ3BpbyhnYyk7CisKKwljaGFpbmVkX2lycV9lbnRlcihjaGlwLCBkZXNjKTsKKwkvKmVuYWJsZSBHUElPIGludGVycnVwdCBhZ2FpbiovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7CisJcmVnID0gcmVhZGwoZ3Bpb19kZXYtPmJhc2UgKyBXQUtFX0lOVF9TVEFUVVNfUkVHMSk7CisJcmVnNjQgPSByZWc7CisJcmVnNjQgPSByZWc2NCA8PCAzMjsKKworCXJlZyA9IHJlYWRsKGdwaW9fZGV2LT5iYXNlICsgV0FLRV9JTlRfU1RBVFVTX1JFRzApOworCXJlZzY0IHw9IHJlZzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBmaXJzdCA0NiBiaXRzIGluZGljYXRlcyBpbnRlcnJ1cHQgc3RhdHVzLgorCSAqIG9uZSBiaXQgcmVwcmVzZW50cyBmb3VyIGludGVycnVwdCBzb3VyY2VzLgorCSovCisJZm9yIChvZmYgPSAwOyBvZmYgPCA0NiA7IG9mZisrKSB7CisJCWlmIChyZWc2NCAmIEJJVChvZmYpKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQkJcGluX3JlZyA9IHJlYWRsKGdwaW9fZGV2LT5iYXNlICsKKwkJCQkJCShvZmYgKiA0ICsgaSkgKiA0KTsKKwkJCQlpZiAoKHBpbl9yZWcgJiBCSVQoSU5URVJSVVBUX1NUU19PRkYpKSB8fAorCQkJCQkocGluX3JlZyAmIEJJVChXQUtFX1NUU19PRkYpKSkgeworCQkJCQlpcnEgPSBpcnFfZmluZF9tYXBwaW5nKGdjLT5pcnFkb21haW4sCisJCQkJCQkJCW9mZiAqIDQgKyBpKTsKKwkJCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycSk7CisJCQkJCXdyaXRlbChwaW5fcmVnLAorCQkJCQkJZ3Bpb19kZXYtPmJhc2UKKwkJCQkJCSsgKG9mZiAqIDQgKyBpKSAqIDQpOworCQkJCQloYW5kbGVkKys7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYgKGhhbmRsZWQgPT0gMCkKKwkJaGFuZGxlX2JhZF9pcnEoaXJxLCBkZXNjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZncGlvX2Rldi0+bG9jaywgZmxhZ3MpOworCXJlZyA9IHJlYWRsKGdwaW9fZGV2LT5iYXNlICsgV0FLRV9JTlRfTUFTVEVSX1JFRyk7CisJcmVnIHw9IEVPSV9NQVNLOworCXdyaXRlbChyZWcsIGdwaW9fZGV2LT5iYXNlICsgV0FLRV9JTlRfTUFTVEVSX1JFRyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKKworCWNoYWluZWRfaXJxX2V4aXQoY2hpcCwgZGVzYyk7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2dldF9ncm91cHNfY291bnQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2KQoreworCXN0cnVjdCBhbWRfZ3BpbyAqZ3Bpb19kZXYgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCXJldHVybiBncGlvX2Rldi0+bmdyb3VwczsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmFtZF9nZXRfZ3JvdXBfbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCisJCQkJICAgICAgdW5zaWduZWQgZ3JvdXApCit7CisJc3RydWN0IGFtZF9ncGlvICpncGlvX2RldiA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCisJcmV0dXJuIGdwaW9fZGV2LT5ncm91cHNbZ3JvdXBdLm5hbWU7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2dldF9ncm91cF9waW5zKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCSAgICAgIHVuc2lnbmVkIGdyb3VwLAorCQkJICAgICAgY29uc3QgdW5zaWduZWQgKipwaW5zLAorCQkJICAgICAgdW5zaWduZWQgKm51bV9waW5zKQoreworCXN0cnVjdCBhbWRfZ3BpbyAqZ3Bpb19kZXYgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKKworCSpwaW5zID0gZ3Bpb19kZXYtPmdyb3Vwc1tncm91cF0ucGluczsKKwkqbnVtX3BpbnMgPSBncGlvX2Rldi0+Z3JvdXBzW2dyb3VwXS5ucGluczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX29wcyBhbWRfcGluY3RybF9vcHMgPSB7CisJLmdldF9ncm91cHNfY291bnQJPSBhbWRfZ2V0X2dyb3Vwc19jb3VudCwKKwkuZ2V0X2dyb3VwX25hbWUJCT0gYW1kX2dldF9ncm91cF9uYW1lLAorCS5nZXRfZ3JvdXBfcGlucwkJPSBhbWRfZ2V0X2dyb3VwX3BpbnMsCisjaWZkZWYgQ09ORklHX09GCisJLmR0X25vZGVfdG9fbWFwCQk9IHBpbmNvbmZfZ2VuZXJpY19kdF9ub2RlX3RvX21hcF9ncm91cCwKKwkuZHRfZnJlZV9tYXAJCT0gcGluY3RybF91dGlsc19kdF9mcmVlX21hcCwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBhbWRfcGluY29uZl9nZXQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAorCQkJICB1bnNpZ25lZCBpbnQgcGluLAorCQkJICB1bnNpZ25lZCBsb25nICpjb25maWcpCit7CisJdTMyIHBpbl9yZWc7CisJdW5zaWduZWQgYXJnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGFtZF9ncGlvICpncGlvX2RldiA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOworCWVudW0gcGluX2NvbmZpZ19wYXJhbSBwYXJhbSA9IHBpbmNvbmZfdG9fY29uZmlnX3BhcmFtKCpjb25maWcpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7CisJcGluX3JlZyA9IHJlYWRsKGdwaW9fZGV2LT5iYXNlICsgcGluKjQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fZGV2LT5sb2NrLCBmbGFncyk7CisJc3dpdGNoIChwYXJhbSkgeworCWNhc2UgUElOX0NPTkZJR19JTlBVVF9ERUJPVU5DRToKKwkJYXJnID0gcGluX3JlZyAmIERCX1RNUl9PVVRfTUFTSzsKKwkJYnJlYWs7CisKKwljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX0RPV046CisJCWFyZyA9IChwaW5fcmVnID4+IFBVTExfRE9XTl9FTkFCTEVfT0ZGKSAmIEJJVCgwKTsKKwkJYnJlYWs7CisKKwljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX1VQOgorCQlhcmcgPSAocGluX3JlZyA+PiBQVUxMX1VQX1NFTF9PRkYpICYgKEJJVCgwKSB8IEJJVCgxKSk7CisJCWJyZWFrOworCisJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgorCQlhcmcgPSAocGluX3JlZyA+PiBEUlZfU1RSRU5HVEhfU0VMX09GRikgJiBEUlZfU1RSRU5HVEhfU0VMX01BU0s7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZGV2X2VycigmZ3Bpb19kZXYtPnBkZXYtPmRldiwgIkludmFsaWQgY29uZmlnIHBhcmFtICUwNHhcbiIsCisJCQlwYXJhbSk7CisJCXJldHVybiAtRU5PVFNVUFA7CisJfQorCisJKmNvbmZpZyA9IHBpbmNvbmZfdG9fY29uZmlnX3BhY2tlZChwYXJhbSwgYXJnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZF9waW5jb25mX3NldChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsIHVuc2lnbmVkIGludCBwaW4sCisJCQkJdW5zaWduZWQgbG9uZyAqY29uZmlncywgdW5zaWduZWQgbnVtX2NvbmZpZ3MpCit7CisJaW50IGk7CisJdTMyIGFyZzsKKwlpbnQgcmV0ID0gMDsKKwl1MzIgcGluX3JlZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWVudW0gcGluX2NvbmZpZ19wYXJhbSBwYXJhbTsKKwlzdHJ1Y3QgYW1kX2dwaW8gKmdwaW9fZGV2ID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbmZpZ3M7IGkrKykgeworCQlwYXJhbSA9IHBpbmNvbmZfdG9fY29uZmlnX3BhcmFtKGNvbmZpZ3NbaV0pOworCQlhcmcgPSBwaW5jb25mX3RvX2NvbmZpZ19hcmd1bWVudChjb25maWdzW2ldKTsKKwkJcGluX3JlZyA9IHJlYWRsKGdwaW9fZGV2LT5iYXNlICsgcGluKjQpOworCisJCXN3aXRjaCAocGFyYW0pIHsKKwkJY2FzZSBQSU5fQ09ORklHX0lOUFVUX0RFQk9VTkNFOgorCQkJcGluX3JlZyAmPSB+REJfVE1SX09VVF9NQVNLOworCQkJcGluX3JlZyB8PSBhcmcgJiBEQl9UTVJfT1VUX01BU0s7CisJCQlicmVhazsKKworCQljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX0RPV046CisJCQlwaW5fcmVnICY9IH5CSVQoUFVMTF9ET1dOX0VOQUJMRV9PRkYpOworCQkJcGluX3JlZyB8PSAoYXJnICYgQklUKDApKSA8PCBQVUxMX0RPV05fRU5BQkxFX09GRjsKKwkJCWJyZWFrOworCisJCWNhc2UgUElOX0NPTkZJR19CSUFTX1BVTExfVVA6CisJCQlwaW5fcmVnICY9IH5CSVQoUFVMTF9VUF9TRUxfT0ZGKTsKKwkJCXBpbl9yZWcgfD0gKGFyZyAmIEJJVCgwKSkgPDwgUFVMTF9VUF9TRUxfT0ZGOworCQkJcGluX3JlZyAmPSB+QklUKFBVTExfVVBfRU5BQkxFX09GRik7CisJCQlwaW5fcmVnIHw9ICgoYXJnPj4xKSAmIEJJVCgwKSkgPDwgUFVMTF9VUF9FTkFCTEVfT0ZGOworCQkJYnJlYWs7CisKKwkJY2FzZSBQSU5fQ09ORklHX0RSSVZFX1NUUkVOR1RIOgorCQkJcGluX3JlZyAmPSB+KERSVl9TVFJFTkdUSF9TRUxfTUFTSworCQkJCQk8PCBEUlZfU1RSRU5HVEhfU0VMX09GRik7CisJCQlwaW5fcmVnIHw9IChhcmcgJiBEUlZfU1RSRU5HVEhfU0VMX01BU0spCisJCQkJCTw8IERSVl9TVFJFTkdUSF9TRUxfT0ZGOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoJmdwaW9fZGV2LT5wZGV2LT5kZXYsCisJCQkJIkludmFsaWQgY29uZmlnIHBhcmFtICUwNHhcbiIsIHBhcmFtKTsKKwkJCXJldCA9IC1FTk9UU1VQUDsKKwkJfQorCisJCXdyaXRlbChwaW5fcmVnLCBncGlvX2Rldi0+YmFzZSArIHBpbio0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3Bpb19kZXYtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3BpbmNvbmZfZ3JvdXBfZ2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQl1bnNpZ25lZCBpbnQgZ3JvdXAsCisJCQkJdW5zaWduZWQgbG9uZyAqY29uZmlnKQoreworCWNvbnN0IHVuc2lnbmVkICpwaW5zOworCXVuc2lnbmVkIG5waW5zOworCWludCByZXQ7CisKKwlyZXQgPSBhbWRfZ2V0X2dyb3VwX3BpbnMocGN0bGRldiwgZ3JvdXAsICZwaW5zLCAmbnBpbnMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoYW1kX3BpbmNvbmZfZ2V0KHBjdGxkZXYsIHBpbnNbMF0sIGNvbmZpZykpCisJCQlyZXR1cm4gLUVOT1RTVVBQOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3BpbmNvbmZfZ3JvdXBfc2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKKwkJCQl1bnNpZ25lZCBncm91cCwgdW5zaWduZWQgbG9uZyAqY29uZmlncywKKwkJCQl1bnNpZ25lZCBudW1fY29uZmlncykKK3sKKwljb25zdCB1bnNpZ25lZCAqcGluczsKKwl1bnNpZ25lZCBucGluczsKKwlpbnQgaSwgcmV0OworCisJcmV0ID0gYW1kX2dldF9ncm91cF9waW5zKHBjdGxkZXYsIGdyb3VwLCAmcGlucywgJm5waW5zKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWZvciAoaSA9IDA7IGkgPCBucGluczsgaSsrKSB7CisJCWlmIChhbWRfcGluY29uZl9zZXQocGN0bGRldiwgcGluc1tpXSwgY29uZmlncywgbnVtX2NvbmZpZ3MpKQorCQkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY29uZl9vcHMgYW1kX3BpbmNvbmZfb3BzID0geworCS5waW5fY29uZmlnX2dldAkJPSBhbWRfcGluY29uZl9nZXQsCisJLnBpbl9jb25maWdfc2V0CQk9IGFtZF9waW5jb25mX3NldCwKKwkucGluX2NvbmZpZ19ncm91cF9nZXQgPSBhbWRfcGluY29uZl9ncm91cF9nZXQsCisJLnBpbl9jb25maWdfZ3JvdXBfc2V0ID0gYW1kX3BpbmNvbmZfZ3JvdXBfc2V0LAorfTsKKworc3RhdGljIHN0cnVjdCBwaW5jdHJsX2Rlc2MgYW1kX3BpbmN0cmxfZGVzYyA9IHsKKwkucGlucwk9IGtlcm5jel9waW5zLAorCS5ucGlucyA9IEFSUkFZX1NJWkUoa2VybmN6X3BpbnMpLAorCS5wY3Rsb3BzID0gJmFtZF9waW5jdHJsX29wcywKKwkuY29uZm9wcyA9ICZhbWRfcGluY29uZl9vcHMsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCit9OworCitzdGF0aWMgaW50IGFtZF9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisJaW50IGlycV9iYXNlOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBhbWRfZ3BpbyAqZ3Bpb19kZXY7CisKKwlncGlvX2RldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJCXNpemVvZihzdHJ1Y3QgYW1kX2dwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdwaW9fZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZncGlvX2Rldi0+bG9jayk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBnZXQgZ3BpbyBpbyByZXNvdXJjZS5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlncGlvX2Rldi0+YmFzZSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJCQlyZXNvdXJjZV9zaXplKHJlcykpOworCWlmIChJU19FUlIoZ3Bpb19kZXYtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihncGlvX2Rldi0+YmFzZSk7CisKKwlpcnFfYmFzZSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKGlycV9iYXNlIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGdwaW8gSVJRLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWdwaW9fZGV2LT5wZGV2ID0gcGRldjsKKwlncGlvX2Rldi0+Z2MuZGlyZWN0aW9uX2lucHV0CT0gYW1kX2dwaW9fZGlyZWN0aW9uX2lucHV0OworCWdwaW9fZGV2LT5nYy5kaXJlY3Rpb25fb3V0cHV0CT0gYW1kX2dwaW9fZGlyZWN0aW9uX291dHB1dDsKKwlncGlvX2Rldi0+Z2MuZ2V0CQkJPSBhbWRfZ3Bpb19nZXRfdmFsdWU7CisJZ3Bpb19kZXYtPmdjLnNldAkJCT0gYW1kX2dwaW9fc2V0X3ZhbHVlOworCWdwaW9fZGV2LT5nYy5zZXRfZGVib3VuY2UJPSBhbWRfZ3Bpb19zZXRfZGVib3VuY2U7CisJZ3Bpb19kZXYtPmdjLmRiZ19zaG93CQk9IGFtZF9ncGlvX2RiZ19zaG93OworCisJZ3Bpb19kZXYtPmdjLmJhc2UJCQk9IDA7CisJZ3Bpb19kZXYtPmdjLmxhYmVsCQkJPSBwZGV2LT5uYW1lOworCWdwaW9fZGV2LT5nYy5vd25lcgkJCT0gVEhJU19NT0RVTEU7CisJZ3Bpb19kZXYtPmdjLmRldgkJCT0gJnBkZXYtPmRldjsKKwlncGlvX2Rldi0+Z2MubmdwaW8JCQk9IFRPVEFMX05VTUJFUl9PRl9QSU5TOworI2lmIGRlZmluZWQoQ09ORklHX09GX0dQSU8pCisJZ3Bpb19kZXYtPmdjLm9mX25vZGUJCQk9IHBkZXYtPmRldi5vZl9ub2RlOworI2VuZGlmCisKKwlncGlvX2Rldi0+Z3JvdXBzID0ga2VybmN6X2dyb3VwczsKKwlncGlvX2Rldi0+bmdyb3VwcyA9IEFSUkFZX1NJWkUoa2VybmN6X2dyb3Vwcyk7CisKKwlhbWRfcGluY3RybF9kZXNjLm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlncGlvX2Rldi0+cGN0cmwgPSBwaW5jdHJsX3JlZ2lzdGVyKCZhbWRfcGluY3RybF9kZXNjLAorCQkJCQkmcGRldi0+ZGV2LCBncGlvX2Rldik7CisJaWYgKCFncGlvX2Rldi0+cGN0cmwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ291bGRuJ3QgcmVnaXN0ZXIgcGluY3RybCBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXQgPSBncGlvY2hpcF9hZGQoJmdwaW9fZGV2LT5nYyk7CisJaWYgKHJldCkKKwkJZ290byBvdXQxOworCisJcmV0ID0gZ3Bpb2NoaXBfYWRkX3Bpbl9yYW5nZSgmZ3Bpb19kZXYtPmdjLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwKKwkJCQkwLCAwLCBUT1RBTF9OVU1CRVJfT0ZfUElOUyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIHBpbiByYW5nZVxuIik7CisJCWdvdG8gb3V0MjsKKwl9CisKKwlyZXQgPSBncGlvY2hpcF9pcnFjaGlwX2FkZCgmZ3Bpb19kZXYtPmdjLAorCQkJCSZhbWRfZ3Bpb19pcnFjaGlwLAorCQkJCTAsCisJCQkJaGFuZGxlX3NpbXBsZV9pcnEsCisJCQkJSVJRX1RZUEVfTk9ORSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgYWRkIGlycWNoaXBcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDI7CisJfQorCisJZ3Bpb2NoaXBfc2V0X2NoYWluZWRfaXJxY2hpcCgmZ3Bpb19kZXYtPmdjLAorCQkJCSAmYW1kX2dwaW9faXJxY2hpcCwKKwkJCQkgaXJxX2Jhc2UsCisJCQkJIGFtZF9ncGlvX2lycV9oYW5kbGVyKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGdwaW9fZGV2KTsKKworCWRldl9kYmcoJnBkZXYtPmRldiwgImFtZCBncGlvIGRyaXZlciBsb2FkZWRcbiIpOworCXJldHVybiByZXQ7CisKK291dDI6CisJZ3Bpb2NoaXBfcmVtb3ZlKCZncGlvX2Rldi0+Z2MpOworCitvdXQxOgorCXBpbmN0cmxfdW5yZWdpc3RlcihncGlvX2Rldi0+cGN0cmwpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFtZF9ncGlvICpncGlvX2RldjsKKworCWdwaW9fZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlncGlvY2hpcF9yZW1vdmUoJmdwaW9fZGV2LT5nYyk7CisJcGluY3RybF91bnJlZ2lzdGVyKGdwaW9fZGV2LT5wY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCBhbWRfZ3Bpb19hY3BpX21hdGNoW10gPSB7CisJeyAiQU1EMDAzMCIsIDAgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShhY3BpLCBhbWRfZ3Bpb19hY3BpX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYW1kX2dwaW9fZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJhbWRfZ3BpbyIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKGFtZF9ncGlvX2FjcGlfbWF0Y2gpLAorCX0sCisJLnByb2JlCQk9IGFtZF9ncGlvX3Byb2JlLAorCS5yZW1vdmUJCT0gYW1kX2dwaW9fcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhbWRfZ3Bpb19kcml2ZXIpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKCJLZW4gWHVlIDxLZW4uWHVlQGFtZC5jb20+LCBKZWZmIFd1IDxKZWZmLld1QGFtZC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFNRCBHUElPIHBpbmN0cmwgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hbWQuaCBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZmVhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hbWQuaApAQCAtMCwwICsxLDI2MSBAQAorLyoKKyAqIEdQSU8gZHJpdmVyIGZvciBBTUQKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsMjAxNSBLZW4gWHVlIDxLZW4uWHVlQGFtZC5jb20+CisgKgkJSmVmZiBXdSA8SmVmZi5XdUBhbWQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfUElOQ1RSTF9BTURfSAorI2RlZmluZSBfUElOQ1RSTF9BTURfSAorCisjZGVmaW5lIFRPVEFMX05VTUJFUl9PRl9QSU5TCTE5MgorI2RlZmluZSBBTURfR1BJT19QSU5TX1BFUl9CQU5LICA2NAorI2RlZmluZSBBTURfR1BJT19UT1RBTF9CQU5LUyAgICAzCisKKyNkZWZpbmUgQU1EX0dQSU9fUElOU19CQU5LMCAgICAgNjMKKyNkZWZpbmUgQU1EX0dQSU9fUElOU19CQU5LMSAgICAgNjQKKyNkZWZpbmUgQU1EX0dQSU9fUElOU19CQU5LMiAgICAgNTYKKworI2RlZmluZSBXQUtFX0lOVF9NQVNURVJfUkVHIDB4ZmMKKyNkZWZpbmUgRU9JX01BU0sgKDEgPDwgMjkpCisKKyNkZWZpbmUgV0FLRV9JTlRfU1RBVFVTX1JFRzAgMHgyZjgKKyNkZWZpbmUgV0FLRV9JTlRfU1RBVFVTX1JFRzEgMHgyZmMKKworI2RlZmluZSBEQl9UTVJfT1VUX09GRgkJCTAKKyNkZWZpbmUgREJfVE1SX09VVF9VTklUX09GRgkJNAorI2RlZmluZSBEQl9DTlRSTF9PRkYJCQk1CisjZGVmaW5lIERCX1RNUl9MQVJHRV9PRkYJCTcKKyNkZWZpbmUgTEVWRUxfVFJJR19PRkYJCQk4CisjZGVmaW5lIEFDVElWRV9MRVZFTF9PRkYJCTkKKyNkZWZpbmUgSU5URVJSVVBUX0VOQUJMRV9PRkYJCTExCisjZGVmaW5lIElOVEVSUlVQVF9NQVNLX09GRgkJMTIKKyNkZWZpbmUgV0FLRV9DTlRSTF9PRkYJCQkxMworI2RlZmluZSBQSU5fU1RTX09GRgkJCTE2CisjZGVmaW5lIERSVl9TVFJFTkdUSF9TRUxfT0ZGCQkxNworI2RlZmluZSBQVUxMX1VQX1NFTF9PRkYJCQkxOQorI2RlZmluZSBQVUxMX1VQX0VOQUJMRV9PRkYJCTIwCisjZGVmaW5lIFBVTExfRE9XTl9FTkFCTEVfT0ZGCQkyMQorI2RlZmluZSBPVVRQVVRfVkFMVUVfT0ZGCQkyMgorI2RlZmluZSBPVVRQVVRfRU5BQkxFX09GRgkJMjMKKyNkZWZpbmUgU1dfQ05UUkxfSU5fT0ZGCQkJMjQKKyNkZWZpbmUgU1dfQ05UUkxfRU5fT0ZGCQkJMjUKKyNkZWZpbmUgSU5URVJSVVBUX1NUU19PRkYJCTI4CisjZGVmaW5lIFdBS0VfU1RTX09GRgkJCTI5CisKKyNkZWZpbmUgREJfVE1SX09VVF9NQVNLCTB4RlVMCisjZGVmaW5lIERCX0NOVFJsX01BU0sJMHgzVUwKKyNkZWZpbmUgQUNUSVZFX0xFVkVMX01BU0sJMHgzVUwKKyNkZWZpbmUgRFJWX1NUUkVOR1RIX1NFTF9NQVNLCTB4M1VMCisKKyNkZWZpbmUgREJfVFlQRV9OT19ERUJPVU5DRSAgICAgICAgICAgICAgIDB4MFVMCisjZGVmaW5lIERCX1RZUEVfUFJFU0VSVkVfTE9XX0dMSVRDSCAgICAgICAweDFVTAorI2RlZmluZSBEQl9UWVBFX1BSRVNFUlZFX0hJR0hfR0xJVENIICAgICAgMHgyVUwKKyNkZWZpbmUgREJfVFlQRV9SRU1PVkVfR0xJVENIICAgICAgICAgICAgIDB4M1VMCisKKyNkZWZpbmUgRURHRV9UUkFHR0VSCTB4MFVMCisjZGVmaW5lIExFVkVMX1RSSUdHRVIJMHgxVUwKKworI2RlZmluZSBBQ1RJVkVfSElHSAkweDBVTAorI2RlZmluZSBBQ1RJVkVfTE9XCTB4MVVMCisjZGVmaW5lIEJPVEhfRUFER0UJMHgyVUwKKworI2RlZmluZSBFTkFCTEVfSU5URVJSVVBUCTB4MVVMCisjZGVmaW5lIERJU0FCTEVfSU5URVJSVVBUCTB4MFVMCisKKyNkZWZpbmUgRU5BQkxFX0lOVEVSUlVQVF9NQVNLCTB4MFVMCisjZGVmaW5lIERJU0FCTEVfSU5URVJSVVBUX01BU0sJMHgxVUwKKworI2RlZmluZSBDTFJfSU5UUl9TVEFUCTB4MVVMCisKK3N0cnVjdCBhbWRfcGluZ3JvdXAgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgdW5zaWduZWQgKnBpbnM7CisJdW5zaWduZWQgbnBpbnM7Cit9OworCitzdHJ1Y3QgYW1kX2Z1bmN0aW9uIHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKiBjb25zdCAqZ3JvdXBzOworCXVuc2lnbmVkIG5ncm91cHM7Cit9OworCitzdHJ1Y3QgYW1kX2dwaW8geworCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGxvY2s7CisJdm9pZCBfX2lvbWVtICAgICAgICAgICAgKmJhc2U7CisKKwljb25zdCBzdHJ1Y3QgYW1kX3Bpbmdyb3VwICpncm91cHM7CisJdTMyIG5ncm91cHM7CisJc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RybDsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICAgICAgICBnYzsKKwlzdHJ1Y3QgcmVzb3VyY2UgICAgICAgICAqcmVzOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgICpwZGV2OworfTsKKworLyogIEtFUk5DWiBjb25maWd1cmF0aW9uKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyBrZXJuY3pfcGluc1tdID0geworCVBJTkNUUkxfUElOKDAsICJHUElPXzAiKSwKKwlQSU5DVFJMX1BJTigxLCAiR1BJT18xIiksCisJUElOQ1RSTF9QSU4oMiwgIkdQSU9fMiIpLAorCVBJTkNUUkxfUElOKDMsICJHUElPXzMiKSwKKwlQSU5DVFJMX1BJTig0LCAiR1BJT180IiksCisJUElOQ1RSTF9QSU4oNSwgIkdQSU9fNSIpLAorCVBJTkNUUkxfUElOKDYsICJHUElPXzYiKSwKKwlQSU5DVFJMX1BJTig3LCAiR1BJT183IiksCisJUElOQ1RSTF9QSU4oOCwgIkdQSU9fOCIpLAorCVBJTkNUUkxfUElOKDksICJHUElPXzkiKSwKKwlQSU5DVFJMX1BJTigxMCwgIkdQSU9fMTAiKSwKKwlQSU5DVFJMX1BJTigxMSwgIkdQSU9fMTEiKSwKKwlQSU5DVFJMX1BJTigxMiwgIkdQSU9fMTIiKSwKKwlQSU5DVFJMX1BJTigxMywgIkdQSU9fMTMiKSwKKwlQSU5DVFJMX1BJTigxNCwgIkdQSU9fMTQiKSwKKwlQSU5DVFJMX1BJTigxNSwgIkdQSU9fMTUiKSwKKwlQSU5DVFJMX1BJTigxNiwgIkdQSU9fMTYiKSwKKwlQSU5DVFJMX1BJTigxNywgIkdQSU9fMTciKSwKKwlQSU5DVFJMX1BJTigxOCwgIkdQSU9fMTgiKSwKKwlQSU5DVFJMX1BJTigxOSwgIkdQSU9fMTkiKSwKKwlQSU5DVFJMX1BJTigyMCwgIkdQSU9fMjAiKSwKKwlQSU5DVFJMX1BJTigyMywgIkdQSU9fMjMiKSwKKwlQSU5DVFJMX1BJTigyNCwgIkdQSU9fMjQiKSwKKwlQSU5DVFJMX1BJTigyNSwgIkdQSU9fMjUiKSwKKwlQSU5DVFJMX1BJTigyNiwgIkdQSU9fMjYiKSwKKwlQSU5DVFJMX1BJTigzOSwgIkdQSU9fMzkiKSwKKwlQSU5DVFJMX1BJTig0MCwgIkdQSU9fNDAiKSwKKwlQSU5DVFJMX1BJTig0MywgIkdQSU9fNDIiKSwKKwlQSU5DVFJMX1BJTig0NiwgIkdQSU9fNDYiKSwKKwlQSU5DVFJMX1BJTig0NywgIkdQSU9fNDciKSwKKwlQSU5DVFJMX1BJTig0OCwgIkdQSU9fNDgiKSwKKwlQSU5DVFJMX1BJTig0OSwgIkdQSU9fNDkiKSwKKwlQSU5DVFJMX1BJTig1MCwgIkdQSU9fNTAiKSwKKwlQSU5DVFJMX1BJTig1MSwgIkdQSU9fNTEiKSwKKwlQSU5DVFJMX1BJTig1MiwgIkdQSU9fNTIiKSwKKwlQSU5DVFJMX1BJTig1MywgIkdQSU9fNTMiKSwKKwlQSU5DVFJMX1BJTig1NCwgIkdQSU9fNTQiKSwKKwlQSU5DVFJMX1BJTig1NSwgIkdQSU9fNTUiKSwKKwlQSU5DVFJMX1BJTig1NiwgIkdQSU9fNTYiKSwKKwlQSU5DVFJMX1BJTig1NywgIkdQSU9fNTciKSwKKwlQSU5DVFJMX1BJTig1OCwgIkdQSU9fNTgiKSwKKwlQSU5DVFJMX1BJTig1OSwgIkdQSU9fNTkiKSwKKwlQSU5DVFJMX1BJTig2MCwgIkdQSU9fNjAiKSwKKwlQSU5DVFJMX1BJTig2MSwgIkdQSU9fNjEiKSwKKwlQSU5DVFJMX1BJTig2MiwgIkdQSU9fNjIiKSwKKwlQSU5DVFJMX1BJTig2NCwgIkdQSU9fNjQiKSwKKwlQSU5DVFJMX1BJTig2NSwgIkdQSU9fNjUiKSwKKwlQSU5DVFJMX1BJTig2NiwgIkdQSU9fNjYiKSwKKwlQSU5DVFJMX1BJTig2OCwgIkdQSU9fNjgiKSwKKwlQSU5DVFJMX1BJTig2OSwgIkdQSU9fNjkiKSwKKwlQSU5DVFJMX1BJTig3MCwgIkdQSU9fNzAiKSwKKwlQSU5DVFJMX1BJTig3MSwgIkdQSU9fNzEiKSwKKwlQSU5DVFJMX1BJTig3MiwgIkdQSU9fNzIiKSwKKwlQSU5DVFJMX1BJTig3NCwgIkdQSU9fNzQiKSwKKwlQSU5DVFJMX1BJTig3NSwgIkdQSU9fNzUiKSwKKwlQSU5DVFJMX1BJTig3NiwgIkdQSU9fNzYiKSwKKwlQSU5DVFJMX1BJTig4NCwgIkdQSU9fODQiKSwKKwlQSU5DVFJMX1BJTig4NSwgIkdQSU9fODUiKSwKKwlQSU5DVFJMX1BJTig4NiwgIkdQSU9fODYiKSwKKwlQSU5DVFJMX1BJTig4NywgIkdQSU9fODciKSwKKwlQSU5DVFJMX1BJTig4OCwgIkdQSU9fODgiKSwKKwlQSU5DVFJMX1BJTig4OSwgIkdQSU9fODkiKSwKKwlQSU5DVFJMX1BJTig5MCwgIkdQSU9fOTAiKSwKKwlQSU5DVFJMX1BJTig5MSwgIkdQSU9fOTEiKSwKKwlQSU5DVFJMX1BJTig5MiwgIkdQSU9fOTIiKSwKKwlQSU5DVFJMX1BJTig5MywgIkdQSU9fOTMiKSwKKwlQSU5DVFJMX1BJTig5NSwgIkdQSU9fOTUiKSwKKwlQSU5DVFJMX1BJTig5NiwgIkdQSU9fOTYiKSwKKwlQSU5DVFJMX1BJTig5NywgIkdQSU9fOTciKSwKKwlQSU5DVFJMX1BJTig5OCwgIkdQSU9fOTgiKSwKKwlQSU5DVFJMX1BJTig5OSwgIkdQSU9fOTkiKSwKKwlQSU5DVFJMX1BJTigxMDAsICJHUElPXzEwMCIpLAorCVBJTkNUUkxfUElOKDEwMSwgIkdQSU9fMTAxIiksCisJUElOQ1RSTF9QSU4oMTAyLCAiR1BJT18xMDIiKSwKKwlQSU5DVFJMX1BJTigxMTMsICJHUElPXzExMyIpLAorCVBJTkNUUkxfUElOKDExNCwgIkdQSU9fMTE0IiksCisJUElOQ1RSTF9QSU4oMTE1LCAiR1BJT18xMTUiKSwKKwlQSU5DVFJMX1BJTigxMTYsICJHUElPXzExNiIpLAorCVBJTkNUUkxfUElOKDExNywgIkdQSU9fMTE3IiksCisJUElOQ1RSTF9QSU4oMTE4LCAiR1BJT18xMTgiKSwKKwlQSU5DVFJMX1BJTigxMTksICJHUElPXzExOSIpLAorCVBJTkNUUkxfUElOKDEyMCwgIkdQSU9fMTIwIiksCisJUElOQ1RSTF9QSU4oMTIxLCAiR1BJT18xMjEiKSwKKwlQSU5DVFJMX1BJTigxMjIsICJHUElPXzEyMiIpLAorCVBJTkNUUkxfUElOKDEyNiwgIkdQSU9fMTI2IiksCisJUElOQ1RSTF9QSU4oMTI5LCAiR1BJT18xMjkiKSwKKwlQSU5DVFJMX1BJTigxMzAsICJHUElPXzEzMCIpLAorCVBJTkNUUkxfUElOKDEzMSwgIkdQSU9fMTMxIiksCisJUElOQ1RSTF9QSU4oMTMyLCAiR1BJT18xMzIiKSwKKwlQSU5DVFJMX1BJTigxMzMsICJHUElPXzEzMyIpLAorCVBJTkNUUkxfUElOKDEzNSwgIkdQSU9fMTM1IiksCisJUElOQ1RSTF9QSU4oMTM2LCAiR1BJT18xMzYiKSwKKwlQSU5DVFJMX1BJTigxMzcsICJHUElPXzEzNyIpLAorCVBJTkNUUkxfUElOKDEzOCwgIkdQSU9fMTM4IiksCisJUElOQ1RSTF9QSU4oMTM5LCAiR1BJT18xMzkiKSwKKwlQSU5DVFJMX1BJTigxNDAsICJHUElPXzE0MCIpLAorCVBJTkNUUkxfUElOKDE0MSwgIkdQSU9fMTQxIiksCisJUElOQ1RSTF9QSU4oMTQyLCAiR1BJT18xNDIiKSwKKwlQSU5DVFJMX1BJTigxNDMsICJHUElPXzE0MyIpLAorCVBJTkNUUkxfUElOKDE0NCwgIkdQSU9fMTQ0IiksCisJUElOQ1RSTF9QSU4oMTQ1LCAiR1BJT18xNDUiKSwKKwlQSU5DVFJMX1BJTigxNDYsICJHUElPXzE0NiIpLAorCVBJTkNUUkxfUElOKDE0NywgIkdQSU9fMTQ3IiksCisJUElOQ1RSTF9QSU4oMTQ4LCAiR1BJT18xNDgiKSwKKwlQSU5DVFJMX1BJTigxNjYsICJHUElPXzE2NiIpLAorCVBJTkNUUkxfUElOKDE2NywgIkdQSU9fMTY3IiksCisJUElOQ1RSTF9QSU4oMTY4LCAiR1BJT18xNjgiKSwKKwlQSU5DVFJMX1BJTigxNjksICJHUElPXzE2OSIpLAorCVBJTkNUUkxfUElOKDE3MCwgIkdQSU9fMTcwIiksCisJUElOQ1RSTF9QSU4oMTcxLCAiR1BJT18xNzEiKSwKKwlQSU5DVFJMX1BJTigxNzIsICJHUElPXzE3MiIpLAorCVBJTkNUUkxfUElOKDE3MywgIkdQSU9fMTczIiksCisJUElOQ1RSTF9QSU4oMTc0LCAiR1BJT18xNzQiKSwKKwlQSU5DVFJMX1BJTigxNzUsICJHUElPXzE3NSIpLAorCVBJTkNUUkxfUElOKDE3NiwgIkdQSU9fMTc2IiksCisJUElOQ1RSTF9QSU4oMTc3LCAiR1BJT18xNzciKSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpMmMwX3BpbnNbXSA9IHsxNDUsIDE0Nn07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaTJjMV9waW5zW10gPSB7MTQ3LCAxNDh9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGkyYzJfcGluc1tdID0gezExMywgMTE0fTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpMmMzX3BpbnNbXSA9IHsxOSwgMjB9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgdWFydDBfcGluc1tdID0gezEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5fTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0MV9waW5zW10gPSB7MTQwLCAxNDEsIDE0MiwgMTQzLCAxNDR9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFtZF9waW5ncm91cCBrZXJuY3pfZ3JvdXBzW10gPSB7CisJeworCQkubmFtZSA9ICJpMmMwIiwKKwkJLnBpbnMgPSBpMmMwX3BpbnMsCisJCS5ucGlucyA9IDIsCisJfSwKKwl7CisJCS5uYW1lID0gImkyYzEiLAorCQkucGlucyA9IGkyYzFfcGlucywKKwkJLm5waW5zID0gMiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiaTJjMiIsCisJCS5waW5zID0gaTJjMl9waW5zLAorCQkubnBpbnMgPSAyLAorCX0sCisJeworCQkubmFtZSA9ICJpMmMzIiwKKwkJLnBpbnMgPSBpMmMzX3BpbnMsCisJCS5ucGlucyA9IDIsCisJfSwKKwl7CisJCS5uYW1lID0gInVhcnQwIiwKKwkJLnBpbnMgPSB1YXJ0MF9waW5zLAorCQkubnBpbnMgPSA5LAorCX0sCisJeworCQkubmFtZSA9ICJ1YXJ0MSIsCisJCS5waW5zID0gdWFydDFfcGlucywKKwkJLm5waW5zID0gNSwKKwl9LAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hczM3MjIuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFzMzcyMi5jCmluZGV4IDE2OWIxYmYuLmRiMDU3MWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFzMzcyMi5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWFzMzcyMi5jCkBAIC02MjUsNyArNjI1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYXMzNzIyX3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFzMzcyMl9waW5jdHJsX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhbXMsYXMzNzIyLXBpbmN0cmwiLCB9LAogCXsgfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hdDkxLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1hdDkxLmMKaW5kZXggZjRjZDBiOS4uMmY3OTdjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYXQ5MS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWF0OTEuYwpAQCAtNDUxLDE4ICs0NTEsMTggQEAKIAogc3RhdGljIGJvb2wgYXQ5MV9tdXhfZ2V0X2RlZ2xpdGNoKHZvaWQgX19pb21lbSAqcGlvLCB1bnNpZ25lZCBwaW4pCiB7Ci0JcmV0dXJuIChfX3Jhd19yZWFkbChwaW8gKyBQSU9fSUZTUikgPj4gcGluKSAmIDB4MTsKKwlyZXR1cm4gKHJlYWRsX3JlbGF4ZWQocGlvICsgUElPX0lGU1IpID4+IHBpbikgJiAweDE7CiB9CiAKIHN0YXRpYyB2b2lkIGF0OTFfbXV4X3NldF9kZWdsaXRjaCh2b2lkIF9faW9tZW0gKnBpbywgdW5zaWduZWQgbWFzaywgYm9vbCBpc19vbikKIHsKLQlfX3Jhd193cml0ZWwobWFzaywgcGlvICsgKGlzX29uID8gUElPX0lGRVIgOiBQSU9fSUZEUikpOworCXdyaXRlbF9yZWxheGVkKG1hc2ssIHBpbyArIChpc19vbiA/IFBJT19JRkVSIDogUElPX0lGRFIpKTsKIH0KIAogc3RhdGljIGJvb2wgYXQ5MV9tdXhfcGlvM19nZXRfZGVnbGl0Y2godm9pZCBfX2lvbWVtICpwaW8sIHVuc2lnbmVkIHBpbikKIHsKLQlpZiAoKF9fcmF3X3JlYWRsKHBpbyArIFBJT19JRlNSKSA+PiBwaW4pICYgMHgxKQotCQlyZXR1cm4gISgoX19yYXdfcmVhZGwocGlvICsgUElPX0lGU0NTUikgPj4gcGluKSAmIDB4MSk7CisJaWYgKChyZWFkbF9yZWxheGVkKHBpbyArIFBJT19JRlNSKSA+PiBwaW4pICYgMHgxKQorCQlyZXR1cm4gISgocmVhZGxfcmVsYXhlZChwaW8gKyBQSU9fSUZTQ1NSKSA+PiBwaW4pICYgMHgxKTsKIAogCXJldHVybiBmYWxzZTsKIH0KQEAgLTQ3MCw1NSArNDcwLDU1IEBACiBzdGF0aWMgdm9pZCBhdDkxX211eF9waW8zX3NldF9kZWdsaXRjaCh2b2lkIF9faW9tZW0gKnBpbywgdW5zaWduZWQgbWFzaywgYm9vbCBpc19vbikKIHsKIAlpZiAoaXNfb24pCi0JCV9fcmF3X3dyaXRlbChtYXNrLCBwaW8gKyBQSU9fSUZTQ0RSKTsKKwkJd3JpdGVsX3JlbGF4ZWQobWFzaywgcGlvICsgUElPX0lGU0NEUik7CiAJYXQ5MV9tdXhfc2V0X2RlZ2xpdGNoKHBpbywgbWFzaywgaXNfb24pOwogfQogCiBzdGF0aWMgYm9vbCBhdDkxX211eF9waW8zX2dldF9kZWJvdW5jZSh2b2lkIF9faW9tZW0gKnBpbywgdW5zaWduZWQgcGluLCB1MzIgKmRpdikKIHsKLQkqZGl2ID0gX19yYXdfcmVhZGwocGlvICsgUElPX1NDRFIpOworCSpkaXYgPSByZWFkbF9yZWxheGVkKHBpbyArIFBJT19TQ0RSKTsKIAotCXJldHVybiAoKF9fcmF3X3JlYWRsKHBpbyArIFBJT19JRlNSKSA+PiBwaW4pICYgMHgxKSAmJgotCSAgICAgICAoKF9fcmF3X3JlYWRsKHBpbyArIFBJT19JRlNDU1IpID4+IHBpbikgJiAweDEpOworCXJldHVybiAoKHJlYWRsX3JlbGF4ZWQocGlvICsgUElPX0lGU1IpID4+IHBpbikgJiAweDEpICYmCisJICAgICAgICgocmVhZGxfcmVsYXhlZChwaW8gKyBQSU9fSUZTQ1NSKSA+PiBwaW4pICYgMHgxKTsKIH0KIAogc3RhdGljIHZvaWQgYXQ5MV9tdXhfcGlvM19zZXRfZGVib3VuY2Uodm9pZCBfX2lvbWVtICpwaW8sIHVuc2lnbmVkIG1hc2ssCiAJCQkJYm9vbCBpc19vbiwgdTMyIGRpdikKIHsKIAlpZiAoaXNfb24pIHsKLQkJX19yYXdfd3JpdGVsKG1hc2ssIHBpbyArIFBJT19JRlNDRVIpOwotCQlfX3Jhd193cml0ZWwoZGl2ICYgUElPX1NDRFJfRElWLCBwaW8gKyBQSU9fU0NEUik7Ci0JCV9fcmF3X3dyaXRlbChtYXNrLCBwaW8gKyBQSU9fSUZFUik7CisJCXdyaXRlbF9yZWxheGVkKG1hc2ssIHBpbyArIFBJT19JRlNDRVIpOworCQl3cml0ZWxfcmVsYXhlZChkaXYgJiBQSU9fU0NEUl9ESVYsIHBpbyArIFBJT19TQ0RSKTsKKwkJd3JpdGVsX3JlbGF4ZWQobWFzaywgcGlvICsgUElPX0lGRVIpOwogCX0gZWxzZQotCQlfX3Jhd193cml0ZWwobWFzaywgcGlvICsgUElPX0lGU0NEUik7CisJCXdyaXRlbF9yZWxheGVkKG1hc2ssIHBpbyArIFBJT19JRlNDRFIpOwogfQogCiBzdGF0aWMgYm9vbCBhdDkxX211eF9waW8zX2dldF9wdWxsZG93bih2b2lkIF9faW9tZW0gKnBpbywgdW5zaWduZWQgcGluKQogewotCXJldHVybiAhKChfX3Jhd19yZWFkbChwaW8gKyBQSU9fUFBEU1IpID4+IHBpbikgJiAweDEpOworCXJldHVybiAhKChyZWFkbF9yZWxheGVkKHBpbyArIFBJT19QUERTUikgPj4gcGluKSAmIDB4MSk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0OTFfbXV4X3BpbzNfc2V0X3B1bGxkb3duKHZvaWQgX19pb21lbSAqcGlvLCB1bnNpZ25lZCBtYXNrLCBib29sIGlzX29uKQogewogCWlmIChpc19vbikKLQkJX19yYXdfd3JpdGVsKG1hc2ssIHBpbyArIFBJT19QVURSKTsKKwkJd3JpdGVsX3JlbGF4ZWQobWFzaywgcGlvICsgUElPX1BVRFIpOwogCi0JX19yYXdfd3JpdGVsKG1hc2ssIHBpbyArIChpc19vbiA/IFBJT19QUERFUiA6IFBJT19QUEREUikpOworCXdyaXRlbF9yZWxheGVkKG1hc2ssIHBpbyArIChpc19vbiA/IFBJT19QUERFUiA6IFBJT19QUEREUikpOwogfQogCiBzdGF0aWMgdm9pZCBhdDkxX211eF9waW8zX2Rpc2FibGVfc2NobWl0dF90cmlnKHZvaWQgX19pb21lbSAqcGlvLCB1bnNpZ25lZCBtYXNrKQogewotCV9fcmF3X3dyaXRlbChfX3Jhd19yZWFkbChwaW8gKyBQSU9fU0NITUlUVCkgfCBtYXNrLCBwaW8gKyBQSU9fU0NITUlUVCk7CisJd3JpdGVsX3JlbGF4ZWQocmVhZGxfcmVsYXhlZChwaW8gKyBQSU9fU0NITUlUVCkgfCBtYXNrLCBwaW8gKyBQSU9fU0NITUlUVCk7CiB9CiAKIHN0YXRpYyBib29sIGF0OTFfbXV4X3BpbzNfZ2V0X3NjaG1pdHRfdHJpZyh2b2lkIF9faW9tZW0gKnBpbywgdW5zaWduZWQgcGluKQogewotCXJldHVybiAoX19yYXdfcmVhZGwocGlvICsgUElPX1NDSE1JVFQpID4+IHBpbikgJiAweDE7CisJcmV0dXJuIChyZWFkbF9yZWxheGVkKHBpbyArIFBJT19TQ0hNSVRUKSA+PiBwaW4pICYgMHgxOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiByZWFkX2RyaXZlX3N0cmVuZ3RoKHZvaWQgX19pb21lbSAqcmVnLCB1bnNpZ25lZCBwaW4pCiB7Ci0JdW5zaWduZWQgdG1wID0gX19yYXdfcmVhZGwocmVnKTsKKwl1bnNpZ25lZCB0bXAgPSByZWFkbF9yZWxheGVkKHJlZyk7CiAKIAl0bXAgPSB0bXAgPj4gdHdvX2JpdF9waW5fdmFsdWVfc2hpZnRfYW1vdW50KHBpbik7CiAKQEAgLTU1NCwxMyArNTU0LDEzIEBACiAKIHN0YXRpYyB2b2lkIHNldF9kcml2ZV9zdHJlbmd0aCh2b2lkIF9faW9tZW0gKnJlZywgdW5zaWduZWQgcGluLCB1MzIgc3RyZW5ndGgpCiB7Ci0JdW5zaWduZWQgdG1wID0gX19yYXdfcmVhZGwocmVnKTsKKwl1bnNpZ25lZCB0bXAgPSByZWFkbF9yZWxheGVkKHJlZyk7CiAJdW5zaWduZWQgc2hpZnQgPSB0d29fYml0X3Bpbl92YWx1ZV9zaGlmdF9hbW91bnQocGluKTsKIAogCXRtcCAmPSB+KERSSVZFX1NUUkVOR1RIX01BU0sgIDw8ICBzaGlmdCk7CiAJdG1wIHw9IHN0cmVuZ3RoIDw8IHNoaWZ0OwogCi0JX19yYXdfd3JpdGVsKHRtcCwgcmVnKTsKKwl3cml0ZWxfcmVsYXhlZCh0bXAsIHJlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0OTFfbXV4X3NhbWE1ZDNfc2V0X2RyaXZlc3RyZW5ndGgodm9pZCBfX2lvbWVtICpwaW8sIHVuc2lnbmVkIHBpbiwKQEAgLTExMTQsNyArMTExNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF0OTFfcGluY3RybF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXQ5MV9waW5jdHJsX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhdG1lbCxzYW1hNWQzLXBpbmN0cmwiLCAuZGF0YSA9ICZzYW1hNWQzX29wcyB9LAogCXsgLmNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTl4NS1waW5jdHJsIiwgLmRhdGEgPSAmYXQ5MXNhbTl4NV9vcHMgfSwKIAl7IC5jb21wYXRpYmxlID0gImF0bWVsLGF0OTFybTkyMDAtcGluY3RybCIsIC5kYXRhID0gJmF0OTFybTkyMDBfb3BzIH0sCkBAIC0xMjQwLDggKzEyNDAsNyBAQAogCiAJaWYgKCFpbmZvLT5wY3RsKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZWdpc3RlciBBVDkxIHBpbmN0cmwgZHJpdmVyXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIFdlIHdpbGwgaGFuZGxlIGEgcmFuZ2Ugb2YgR1BJTyBwaW5zICovCkBAIC0xMjUyLDkgKzEyNTEsNiBAQAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJpbml0aWFsaXplZCBBVDkxIHBpbmN0cmwgZHJpdmVyXG4iKTsKIAogCXJldHVybiAwOwotCi1lcnI6Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBhdDkxX3BpbmN0cmxfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xNDc3LDI4ICsxNDczLDI1IEBACiAJLyogdGhlIGludGVycnVwdCBpcyBhbHJlYWR5IGNsZWFyZWQgYmVmb3JlIGJ5IHJlYWRpbmcgSVNSICovCiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ3Bpb19pcnFfc3RhcnR1cChzdHJ1Y3QgaXJxX2RhdGEgKmQpCitzdGF0aWMgaW50IGdwaW9faXJxX3JlcXVlc3RfcmVzKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAlzdHJ1Y3QgYXQ5MV9ncGlvX2NoaXAgKmF0OTFfZ3BpbyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCXVuc2lnbmVkCXBpbiA9IGQtPmh3aXJxOwogCWludCByZXQ7CiAKIAlyZXQgPSBncGlvY2hpcF9sb2NrX2FzX2lycSgmYXQ5MV9ncGlvLT5jaGlwLCBwaW4pOwotCWlmIChyZXQpIHsKKwlpZiAocmV0KQogCQlkZXZfZXJyKGF0OTFfZ3Bpby0+Y2hpcC5kZXYsICJ1bmFibGUgdG8gbG9jayBwaW5kICVsdSBJUlFcbiIsCiAJCQlkLT5od2lycSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCWdwaW9faXJxX3VubWFzayhkKTsKLQlyZXR1cm4gMDsKKworCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGdwaW9faXJxX3NodXRkb3duKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3N0YXRpYyB2b2lkIGdwaW9faXJxX3JlbGVhc2VfcmVzKHN0cnVjdCBpcnFfZGF0YSAqZCkKIHsKIAlzdHJ1Y3QgYXQ5MV9ncGlvX2NoaXAgKmF0OTFfZ3BpbyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwogCXVuc2lnbmVkCXBpbiA9IGQtPmh3aXJxOwogCi0JZ3Bpb19pcnFfbWFzayhkKTsKIAlncGlvY2hpcF91bmxvY2tfYXNfaXJxKCZhdDkxX2dwaW8tPmNoaXAsIHBpbik7CiB9CiAKQEAgLTE1MzgsOSArMTUzMSw5IEBACiAKIAkJcGlvID0gZ3Bpb19jaGlwc1tpXS0+cmVnYmFzZTsKIAotCQliYWNrdXBzW2ldID0gX19yYXdfcmVhZGwocGlvICsgUElPX0lNUik7Ci0JCV9fcmF3X3dyaXRlbChiYWNrdXBzW2ldLCBwaW8gKyBQSU9fSURSKTsKLQkJX19yYXdfd3JpdGVsKHdha2V1cHNbaV0sIHBpbyArIFBJT19JRVIpOworCQliYWNrdXBzW2ldID0gcmVhZGxfcmVsYXhlZChwaW8gKyBQSU9fSU1SKTsKKwkJd3JpdGVsX3JlbGF4ZWQoYmFja3Vwc1tpXSwgcGlvICsgUElPX0lEUik7CisJCXdyaXRlbF9yZWxheGVkKHdha2V1cHNbaV0sIHBpbyArIFBJT19JRVIpOwogCiAJCWlmICghd2FrZXVwc1tpXSkKIAkJCWNsa19kaXNhYmxlX3VucHJlcGFyZShncGlvX2NoaXBzW2ldLT5jbG9jayk7CkBAIC0xNTY1LDggKzE1NTgsOCBAQAogCQlpZiAoIXdha2V1cHNbaV0pCiAJCQljbGtfcHJlcGFyZV9lbmFibGUoZ3Bpb19jaGlwc1tpXS0+Y2xvY2spOwogCi0JCV9fcmF3X3dyaXRlbCh3YWtldXBzW2ldLCBwaW8gKyBQSU9fSURSKTsKLQkJX19yYXdfd3JpdGVsKGJhY2t1cHNbaV0sIHBpbyArIFBJT19JRVIpOworCQl3cml0ZWxfcmVsYXhlZCh3YWtldXBzW2ldLCBwaW8gKyBQSU9fSURSKTsKKwkJd3JpdGVsX3JlbGF4ZWQoYmFja3Vwc1tpXSwgcGlvICsgUElPX0lFUik7CiAJfQogfQogCkBAIC0xNTc3LDggKzE1NzAsOCBAQAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBncGlvX2lycWNoaXAgPSB7CiAJLm5hbWUJCT0gIkdQSU8iLAogCS5pcnFfYWNrCT0gZ3Bpb19pcnFfYWNrLAotCS5pcnFfc3RhcnR1cAk9IGdwaW9faXJxX3N0YXJ0dXAsCi0JLmlycV9zaHV0ZG93bgk9IGdwaW9faXJxX3NodXRkb3duLAorCS5pcnFfcmVxdWVzdF9yZXNvdXJjZXMgPSBncGlvX2lycV9yZXF1ZXN0X3JlcywKKwkuaXJxX3JlbGVhc2VfcmVzb3VyY2VzID0gZ3Bpb19pcnFfcmVsZWFzZV9yZXMsCiAJLmlycV9kaXNhYmxlCT0gZ3Bpb19pcnFfbWFzaywKIAkuaXJxX21hc2sJPSBncGlvX2lycV9tYXNrLAogCS5pcnFfdW5tYXNrCT0gZ3Bpb19pcnFfdW5tYXNrLApAQCAtMTY5Nyw3ICsxNjkwLDcgQEAKIAkubmdwaW8JCQk9IE1BWF9OQl9HUElPX1BFUl9CQU5LLAogfTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgYXQ5MV9ncGlvX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhdDkxX2dwaW9fb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05eDUtZ3BpbyIsIC5kYXRhID0gJmF0OTFzYW05eDVfb3BzLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXJtOTIwMC1ncGlvIiwgLmRhdGEgPSAmYXQ5MXJtOTIwMF9vcHMgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWJjbTI4MXh4LmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1iY20yODF4eC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODhjZmU1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWJjbTI4MXh4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgQnJvYWRjb20gQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCAiYXMgaXMiIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQotICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQotICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvb2YuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgotI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi5oPgotI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvcGluY29uZi1nZW5lcmljLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgImNvcmUuaCIKLSNpbmNsdWRlICJwaW5jdHJsLXV0aWxzLmgiCi0KLS8qIEJDTTI4MVhYIFBpbiBDb250cm9sIFJlZ2lzdGVycyBEZWZpbml0aW9ucyAqLwotCi0vKiBGdW5jdGlvbiBTZWxlY3QgYml0cyBhcmUgdGhlIHNhbWUgZm9yIGFsbCBwaW4gY29udHJvbCByZWdpc3RlcnMgKi8KLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JFR19GX1NFTF9NQVNLCQkweDA3MDAKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JFR19GX1NFTF9TSElGVAkJOAotCi0vKiBTdGFuZGFyZCBwaW4gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQkNNMjgxWFhfU1REX1BJTl9SRUdfRFJWX1NUUl9NQVNLCTB4MDAwNwotI2RlZmluZSBCQ00yODFYWF9TVERfUElOX1JFR19EUlZfU1RSX1NISUZUCTAKLSNkZWZpbmUgQkNNMjgxWFhfU1REX1BJTl9SRUdfSU5QVVRfRElTX01BU0sJMHgwMDA4Ci0jZGVmaW5lIEJDTTI4MVhYX1NURF9QSU5fUkVHX0lOUFVUX0RJU19TSElGVAkzCi0jZGVmaW5lIEJDTTI4MVhYX1NURF9QSU5fUkVHX1NMRVdfTUFTSwkJMHgwMDEwCi0jZGVmaW5lIEJDTTI4MVhYX1NURF9QSU5fUkVHX1NMRVdfU0hJRlQJCTQKLSNkZWZpbmUgQkNNMjgxWFhfU1REX1BJTl9SRUdfUFVMTF9VUF9NQVNLCTB4MDAyMAotI2RlZmluZSBCQ00yODFYWF9TVERfUElOX1JFR19QVUxMX1VQX1NISUZUCTUKLSNkZWZpbmUgQkNNMjgxWFhfU1REX1BJTl9SRUdfUFVMTF9ETl9NQVNLCTB4MDA0MAotI2RlZmluZSBCQ00yODFYWF9TVERfUElOX1JFR19QVUxMX0ROX1NISUZUCTYKLSNkZWZpbmUgQkNNMjgxWFhfU1REX1BJTl9SRUdfSFlTVF9NQVNLCQkweDAwODAKLSNkZWZpbmUgQkNNMjgxWFhfU1REX1BJTl9SRUdfSFlTVF9TSElGVAkJNwotCi0vKiBJMkMgcGluIHJlZ2lzdGVyICovCi0jZGVmaW5lIEJDTTI4MVhYX0kyQ19QSU5fUkVHX0lOUFVUX0RJU19NQVNLCTB4MDAwNAotI2RlZmluZSBCQ00yODFYWF9JMkNfUElOX1JFR19JTlBVVF9ESVNfU0hJRlQJMgotI2RlZmluZSBCQ00yODFYWF9JMkNfUElOX1JFR19TTEVXX01BU0sJCTB4MDAwOAotI2RlZmluZSBCQ00yODFYWF9JMkNfUElOX1JFR19TTEVXX1NISUZUCQkzCi0jZGVmaW5lIEJDTTI4MVhYX0kyQ19QSU5fUkVHX1BVTExfVVBfU1RSX01BU0sJMHgwMDcwCi0jZGVmaW5lIEJDTTI4MVhYX0kyQ19QSU5fUkVHX1BVTExfVVBfU1RSX1NISUZUCTQKLQotLyogSERNSSBwaW4gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQkNNMjgxWFhfSERNSV9QSU5fUkVHX0lOUFVUX0RJU19NQVNLCTB4MDAwOAotI2RlZmluZSBCQ00yODFYWF9IRE1JX1BJTl9SRUdfSU5QVVRfRElTX1NISUZUCTMKLSNkZWZpbmUgQkNNMjgxWFhfSERNSV9QSU5fUkVHX01PREVfTUFTSwkJMHgwMDEwCi0jZGVmaW5lIEJDTTI4MVhYX0hETUlfUElOX1JFR19NT0RFX1NISUZUCTQKLQotLyoqCi0gKiBiY20yODF4eF9waW5fdHlwZSAtIHR5cGVzIG9mIHBpbiByZWdpc3RlcgotICovCi1lbnVtIGJjbTI4MXh4X3Bpbl90eXBlIHsKLQlCQ00yODFYWF9QSU5fVFlQRV9VTktOT1dOID0gMCwKLQlCQ00yODFYWF9QSU5fVFlQRV9TVEQsCi0JQkNNMjgxWFhfUElOX1RZUEVfSTJDLAotCUJDTTI4MVhYX1BJTl9UWVBFX0hETUksCi19OwotCi1zdGF0aWMgZW51bSBiY20yODF4eF9waW5fdHlwZSBzdGRfcGluID0gQkNNMjgxWFhfUElOX1RZUEVfU1REOwotc3RhdGljIGVudW0gYmNtMjgxeHhfcGluX3R5cGUgaTJjX3BpbiA9IEJDTTI4MVhYX1BJTl9UWVBFX0kyQzsKLXN0YXRpYyBlbnVtIGJjbTI4MXh4X3Bpbl90eXBlIGhkbWlfcGluID0gQkNNMjgxWFhfUElOX1RZUEVfSERNSTsKLQotLyoqCi0gKiBiY20yODF4eF9waW5fZnVuY3Rpb24tIGRlZmluZSBwaW4gZnVuY3Rpb24KLSAqLwotc3RydWN0IGJjbTI4MXh4X3Bpbl9mdW5jdGlvbiB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQljb25zdCBjaGFyICogY29uc3QgKmdyb3VwczsKLQljb25zdCB1bnNpZ25lZCBuZ3JvdXBzOwotfTsKLQotLyoqCi0gKiBiY20yODF4eF9waW5jdHJsX2RhdGEgLSBCcm9hZGNvbS1zcGVjaWZpYyBwaW5jdHJsIGRhdGEKLSAqIEByZWdfYmFzZSAtIGJhc2Ugb2YgcGluY3RybCByZWdpc3RlcnMKLSAqLwotc3RydWN0IGJjbTI4MXh4X3BpbmN0cmxfZGF0YSB7Ci0Jdm9pZCBfX2lvbWVtICpyZWdfYmFzZTsKLQotCS8qIExpc3Qgb2YgYWxsIHBpbnMgKi8KLQljb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyAqcGluczsKLQljb25zdCB1bnNpZ25lZCBucGluczsKLQotCWNvbnN0IHN0cnVjdCBiY20yODF4eF9waW5fZnVuY3Rpb24gKmZ1bmN0aW9uczsKLQljb25zdCB1bnNpZ25lZCBuZnVuY3Rpb25zOwotCi0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotfTsKLQotLyoKLSAqIFBpbiBudW1iZXIgZGVmaW5pdGlvbi4gIFRoZSBvcmRlciBoZXJlIG11c3QgYmUgdGhlIHNhbWUgYXMgZGVmaW5lZCBpbiB0aGUKLSAqIFBBRENUUkxSRUcgYmxvY2sgaW4gdGhlIFJEQi4KLSAqLwotI2RlZmluZSBCQ00yODFYWF9QSU5fQURDU1lOQwkJMAotI2RlZmluZSBCQ00yODFYWF9QSU5fQkFUX1JNCQkxCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9CU0MxX1NDTAkJMgotI2RlZmluZSBCQ00yODFYWF9QSU5fQlNDMV9TREEJCTMKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0JTQzJfU0NMCQk0Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9CU0MyX1NEQQkJNQotI2RlZmluZSBCQ00yODFYWF9QSU5fQ0xBU1NHUFdSCQk2Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9DTEtfQ1g4CQk3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9DTEtPVVRfMAkJOAotI2RlZmluZSBCQ00yODFYWF9QSU5fQ0xLT1VUXzEJCTkKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0NMS09VVF8yCQkxMAotI2RlZmluZSBCQ00yODFYWF9QSU5fQ0xLT1VUXzMJCTExCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9DTEtSRVFfSU5fMAkxMgotI2RlZmluZSBCQ00yODFYWF9QSU5fQ0xLUkVRX0lOXzEJMTMKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0NXU19TWVNfUkVRMQkxNAotI2RlZmluZSBCQ00yODFYWF9QSU5fQ1dTX1NZU19SRVEyCTE1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9DV1NfU1lTX1JFUTMJMTYKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0RJR01JQzFfQ0xLCTE3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9ESUdNSUMxX0RRCQkxOAotI2RlZmluZSBCQ00yODFYWF9QSU5fRElHTUlDMl9DTEsJMTkKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0RJR01JQzJfRFEJCTIwCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUEVOMTMJCTIxCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUEVOMTQJCTIyCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUEVOMTUJCTIzCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMDAJCTI0Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMDEJCTI1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMDIJCTI2Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMDMJCTI3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMDQJCTI4Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMDUJCTI5Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMDYJCTMwCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMDcJCTMxCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMDgJCTMyCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMDkJCTMzCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMTAJCTM0Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMTEJCTM1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMTIJCTM2Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMTMJCTM3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUElPMTQJCTM4Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9HUFNfUEFCTEFOSwkzOQotI2RlZmluZSBCQ00yODFYWF9QSU5fR1BTX1RNQVJLCQk0MAotI2RlZmluZSBCQ00yODFYWF9QSU5fSERNSV9TQ0wJCTQxCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9IRE1JX1NEQQkJNDIKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0lDX0RNCQk0MwotI2RlZmluZSBCQ00yODFYWF9QSU5fSUNfRFAJCTQ0Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9LUF9DT0xfSVBfMAk0NQotI2RlZmluZSBCQ00yODFYWF9QSU5fS1BfQ09MX0lQXzEJNDYKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0tQX0NPTF9JUF8yCTQ3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9LUF9DT0xfSVBfMwk0OAotI2RlZmluZSBCQ00yODFYWF9QSU5fS1BfUk9XX09QXzAJNDkKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0tQX1JPV19PUF8xCTUwCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9LUF9ST1dfT1BfMgk1MQotI2RlZmluZSBCQ00yODFYWF9QSU5fS1BfUk9XX09QXzMJNTIKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9CXzAJCTUzCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfQl8xCQk1NAotI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX0JfMgkJNTUKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9CXzMJCTU2Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfQl80CQk1NwotI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX0JfNQkJNTgKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9CXzYJCTU5Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfQl83CQk2MAotI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX0dfMAkJNjEKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9HXzEJCTYyCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfR18yCQk2MwotI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX0dfMwkJNjQKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9HXzQJCTY1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfR181CQk2NgotI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX0dfNgkJNjcKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9HXzcJCTY4Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfSFNZTkMJCTY5Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfT0UJCTcwCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfUENMSwkJNzEKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9SXzAJCTcyCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfUl8xCQk3MwotI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX1JfMgkJNzQKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9SXzMJCTc1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfUl80CQk3NgotI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX1JfNQkJNzcKLSNkZWZpbmUgQkNNMjgxWFhfUElOX0xDRF9SXzYJCTc4Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9MQ0RfUl83CQk3OQotI2RlZmluZSBCQ00yODFYWF9QSU5fTENEX1ZTWU5DCQk4MAotI2RlZmluZSBCQ00yODFYWF9QSU5fTURNR1BJTzAJCTgxCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9NRE1HUElPMQkJODIKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01ETUdQSU8yCQk4MwotI2RlZmluZSBCQ00yODFYWF9QSU5fTURNR1BJTzMJCTg0Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9NRE1HUElPNAkJODUKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01ETUdQSU81CQk4NgotI2RlZmluZSBCQ00yODFYWF9QSU5fTURNR1BJTzYJCTg3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9NRE1HUElPNwkJODgKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01ETUdQSU84CQk4OQotI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9EQVRBXzAJOTAKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV8xCTkxCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfMgk5MgotI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9EQVRBXzMJOTMKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV80CTk0Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfNQk5NQotI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9EQVRBXzYJOTYKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV83CTk3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfOAk5OAotI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9EQVRBXzkJOTkKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV8xMAkxMDAKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV8xMQkxMDEKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV8xMgkxMDIKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV8xMwkxMDMKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV8xNAkxMDQKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfREFUQV8xNQkxMDUKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfSEEwCQkxMDYKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfSEFUMAkJMTA3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0hBVDEJCTEwOAotI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9IQ0UwX04JMTA5Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX0hDRTFfTgkxMTAKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01QSElfSFJEX04JCTExMQotI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9IV1JfTgkJMTEyCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9NUEhJX1JVTjAJCTExMwotI2RlZmluZSBCQ00yODFYWF9QSU5fTVBISV9SVU4xCQkxMTQKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01UWF9TQ0FOX0NMSwkxMTUKLSNkZWZpbmUgQkNNMjgxWFhfUElOX01UWF9TQ0FOX0RBVEEJMTE2Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9OQU5EX0FEXzAJCTExNwotI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9BRF8xCQkxMTgKLSNkZWZpbmUgQkNNMjgxWFhfUElOX05BTkRfQURfMgkJMTE5Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9OQU5EX0FEXzMJCTEyMAotI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9BRF80CQkxMjEKLSNkZWZpbmUgQkNNMjgxWFhfUElOX05BTkRfQURfNQkJMTIyCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9OQU5EX0FEXzYJCTEyMwotI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9BRF83CQkxMjQKLSNkZWZpbmUgQkNNMjgxWFhfUElOX05BTkRfQUxFCQkxMjUKLSNkZWZpbmUgQkNNMjgxWFhfUElOX05BTkRfQ0VOXzAJCTEyNgotI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9DRU5fMQkJMTI3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9OQU5EX0NMRQkJMTI4Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9OQU5EX09FTgkJMTI5Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9OQU5EX1JEWV8wCQkxMzAKLSNkZWZpbmUgQkNNMjgxWFhfUElOX05BTkRfUkRZXzEJCTEzMQotI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9XRU4JCTEzMgotI2RlZmluZSBCQ00yODFYWF9QSU5fTkFORF9XUAkJMTMzCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9QQzEJCTEzNAotI2RlZmluZSBCQ00yODFYWF9QSU5fUEMyCQkxMzUKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1BNVV9JTlQJCTEzNgotI2RlZmluZSBCQ00yODFYWF9QSU5fUE1VX1NDTAkJMTM3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9QTVVfU0RBCQkxMzgKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JGU1QyR19NVFNMT1RFTjNHCTEzOQotI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMF9SWF9DVEwJMTQwCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8wX1JYQwkxNDEKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzBfUlhEXzAJMTQyCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8wX1JYRF8xCTE0MwotI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMF9SWERfMgkxNDQKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzBfUlhEXzMJMTQ1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8wX1RYX0NUTAkxNDYKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzBfVFhDCTE0NwotI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMF9UWERfMAkxNDgKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzBfVFhEXzEJMTQ5Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8wX1RYRF8yCTE1MAotI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMF9UWERfMwkxNTEKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzFfUlhfQ1RMCTE1MgotI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMV9SWEMJMTUzCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8xX1JYRF8wCTE1NAotI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMV9SWERfMQkxNTUKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzFfUlhEXzIJMTU2Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8xX1JYRF8zCTE1NwotI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMV9UWF9DVEwJMTU4Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8xX1RYQwkxNTkKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzFfVFhEXzAJMTYwCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV8xX1RYRF8xCTE2MQotI2RlZmluZSBCQ00yODFYWF9QSU5fUkdNSUlfMV9UWERfMgkxNjIKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JHTUlJXzFfVFhEXzMJMTYzCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV9HUElPXzAJMTY0Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV9HUElPXzEJMTY1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV9HUElPXzIJMTY2Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SR01JSV9HUElPXzMJMTY3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SVFhEQVRBMkdfVFhEQVRBM0cxCTE2OAotI2RlZmluZSBCQ00yODFYWF9QSU5fUlRYRU4yR19UWERBVEEzRzIJMTY5Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9SWERBVEEzRzAJCTE3MAotI2RlZmluZSBCQ00yODFYWF9QSU5fUlhEQVRBM0cxCQkxNzEKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1JYREFUQTNHMgkJMTcyCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TRElPMV9DTEsJCTE3MwotI2RlZmluZSBCQ00yODFYWF9QSU5fU0RJTzFfQ01ECQkxNzQKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NESU8xX0RBVEFfMAkxNzUKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NESU8xX0RBVEFfMQkxNzYKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NESU8xX0RBVEFfMgkxNzcKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NESU8xX0RBVEFfMwkxNzgKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NESU80X0NMSwkJMTc5Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TRElPNF9DTUQJCTE4MAotI2RlZmluZSBCQ00yODFYWF9QSU5fU0RJTzRfREFUQV8wCTE4MQotI2RlZmluZSBCQ00yODFYWF9QSU5fU0RJTzRfREFUQV8xCTE4MgotI2RlZmluZSBCQ00yODFYWF9QSU5fU0RJTzRfREFUQV8yCTE4MwotI2RlZmluZSBCQ00yODFYWF9QSU5fU0RJTzRfREFUQV8zCTE4NAotI2RlZmluZSBCQ00yODFYWF9QSU5fU0lNX0NMSwkJMTg1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TSU1fREFUQQkJMTg2Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TSU1fREVUCQkxODcKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NJTV9SRVNFVE4JCTE4OAotI2RlZmluZSBCQ00yODFYWF9QSU5fU0lNMl9DTEsJCTE4OQotI2RlZmluZSBCQ00yODFYWF9QSU5fU0lNMl9EQVRBCQkxOTAKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NJTTJfREVUCQkxOTEKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NJTTJfUkVTRVROCTE5MgotI2RlZmluZSBCQ00yODFYWF9QSU5fU1JJX0MJCTE5MwotI2RlZmluZSBCQ00yODFYWF9QSU5fU1JJX0QJCTE5NAotI2RlZmluZSBCQ00yODFYWF9QSU5fU1JJX0UJCTE5NQotI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQX0VYVENMSwkJMTk2Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AwX0NMSwkJMTk3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AwX0ZTCQkxOTgKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDBfUlhECQkxOTkKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDBfVFhECQkyMDAKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDJfQ0xLCQkyMDEKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDJfRlNfMAkJMjAyCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AyX0ZTXzEJCTIwMwotI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQMl9GU18yCQkyMDQKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDJfRlNfMwkJMjA1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AyX1JYRF8wCQkyMDYKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDJfUlhEXzEJCTIwNwotI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQMl9UWERfMAkJMjA4Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1AyX1RYRF8xCQkyMDkKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDNfQ0xLCQkyMTAKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDNfRlMJCTIxMQotI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQM19SWEQJCTIxMgotI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQM19UWEQJCTIxMwotI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQNF9DTEsJCTIxNAotI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQNF9GUwkJMjE1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1A0X1JYRAkJMjE2Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1A0X1RYRAkJMjE3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1A1X0NMSwkJMjE4Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TU1A1X0ZTCQkyMTkKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDVfUlhECQkyMjAKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDVfVFhECQkyMjEKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDZfQ0xLCQkyMjIKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NTUDZfRlMJCTIyMwotI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQNl9SWEQJCTIyNAotI2RlZmluZSBCQ00yODFYWF9QSU5fU1NQNl9UWEQJCTIyNQotI2RlZmluZSBCQ00yODFYWF9QSU5fU1RBVF8xCQkyMjYKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NUQVRfMgkJMjI3Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9TWVNDTEtFTgkJMjI4Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRUNMSwkJMjI5Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRURUMDAJCTIzMAotI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VEVDAxCQkyMzEKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1RSQUNFRFQwMgkJMjMyCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRURUMDMJCTIzMwotI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VEVDA0CQkyMzQKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1RSQUNFRFQwNQkJMjM1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRURUMDYJCTIzNgotI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VEVDA3CQkyMzcKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1RSQUNFRFQwOAkJMjM4Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRURUMDkJCTIzOQotI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VEVDEwCQkyNDAKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1RSQUNFRFQxMQkJMjQxCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRURUMTIJCTI0MgotI2RlZmluZSBCQ00yODFYWF9QSU5fVFJBQ0VEVDEzCQkyNDMKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1RSQUNFRFQxNAkJMjQ0Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9UUkFDRURUMTUJCTI0NQotI2RlZmluZSBCQ00yODFYWF9QSU5fVFhEQVRBM0cwCQkyNDYKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1RYUFdSSU5ECQkyNDcKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1VBUlRCMV9VQ1RTCTI0OAotI2RlZmluZSBCQ00yODFYWF9QSU5fVUFSVEIxX1VSVFMJMjQ5Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9VQVJUQjFfVVJYRAkyNTAKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1VBUlRCMV9VVFhECTI1MQotI2RlZmluZSBCQ00yODFYWF9QSU5fVUFSVEIyX1VSWEQJMjUyCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9VQVJUQjJfVVRYRAkyNTMKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1VBUlRCM19VQ1RTCTI1NAotI2RlZmluZSBCQ00yODFYWF9QSU5fVUFSVEIzX1VSVFMJMjU1Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9VQVJUQjNfVVJYRAkyNTYKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1VBUlRCM19VVFhECTI1NwotI2RlZmluZSBCQ00yODFYWF9QSU5fVUFSVEI0X1VDVFMJMjU4Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9VQVJUQjRfVVJUUwkyNTkKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1VBUlRCNF9VUlhECTI2MAotI2RlZmluZSBCQ00yODFYWF9QSU5fVUFSVEI0X1VUWEQJMjYxCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9WQ19DQU0xX1NDTAkyNjIKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1ZDX0NBTTFfU0RBCTI2MwotI2RlZmluZSBCQ00yODFYWF9QSU5fVkNfQ0FNMl9TQ0wJMjY0Ci0jZGVmaW5lIEJDTTI4MVhYX1BJTl9WQ19DQU0yX1NEQQkyNjUKLSNkZWZpbmUgQkNNMjgxWFhfUElOX1ZDX0NBTTNfU0NMCTI2NgotI2RlZmluZSBCQ00yODFYWF9QSU5fVkNfQ0FNM19TREEJMjY3Ci0KLSNkZWZpbmUgQkNNMjgxWFhfUElOX0RFU0MoYSwgYiwgYykgXAotCXsgLm51bWJlciA9IGEsIC5uYW1lID0gYiwgLmRydl9kYXRhID0gJmMjI19waW4gfQotCi0vKgotICogUGluIGRlc2NyaXB0aW9uIGRlZmluaXRpb24uICBUaGUgb3JkZXIgaGVyZSBtdXN0IGJlIHRoZSBzYW1lIGFzIGRlZmluZWQgaW4KLSAqIHRoZSBQQURDVFJMUkVHIGJsb2NrIGluIHRoZSBSREIsIHNpbmNlIHRoZSBwaW4gbnVtYmVyIGlzIHVzZWQgYXMgYW4gaW5kZXgKLSAqIGludG8gdGhpcyBhcnJheS4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jdHJsX3Bpbl9kZXNjIGJjbTI4MXh4X3BpbmN0cmxfcGluc1tdID0gewotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9BRENTWU5DLCAiYWRjc3luYyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0JBVF9STSwgImJhdF9ybSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0JTQzFfU0NMLCAiYnNjMV9zY2wiLCBpMmMpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9CU0MxX1NEQSwgImJzYzFfc2RhIiwgaTJjKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fQlNDMl9TQ0wsICJic2MyX3NjbCIsIGkyYyksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0JTQzJfU0RBLCAiYnNjMl9zZGEiLCBpMmMpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9DTEFTU0dQV1IsICJjbGFzc2dwd3IiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9DTEtfQ1g4LCAiY2xrX2N4OCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0NMS09VVF8wLCAiY2xrb3V0XzAiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9DTEtPVVRfMSwgImNsa291dF8xIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fQ0xLT1VUXzIsICJjbGtvdXRfMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0NMS09VVF8zLCAiY2xrb3V0XzMiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9DTEtSRVFfSU5fMCwgImNsa3JlcV9pbl8wIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fQ0xLUkVRX0lOXzEsICJjbGtyZXFfaW5fMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0NXU19TWVNfUkVRMSwgImN3c19zeXNfcmVxMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0NXU19TWVNfUkVRMiwgImN3c19zeXNfcmVxMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0NXU19TWVNfUkVRMywgImN3c19zeXNfcmVxMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0RJR01JQzFfQ0xLLCAiZGlnbWljMV9jbGsiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9ESUdNSUMxX0RRLCAiZGlnbWljMV9kcSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0RJR01JQzJfQ0xLLCAiZGlnbWljMl9jbGsiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9ESUdNSUMyX0RRLCAiZGlnbWljMl9kcSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQRU4xMywgImdwZW4xMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQRU4xNCwgImdwZW4xNCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQRU4xNSwgImdwZW4xNSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8wMCwgImdwaW8wMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8wMSwgImdwaW8wMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8wMiwgImdwaW8wMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8wMywgImdwaW8wMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8wNCwgImdwaW8wNCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8wNSwgImdwaW8wNSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8wNiwgImdwaW8wNiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8wNywgImdwaW8wNyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8wOCwgImdwaW8wOCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8wOSwgImdwaW8wOSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8xMCwgImdwaW8xMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8xMSwgImdwaW8xMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8xMiwgImdwaW8xMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8xMywgImdwaW8xMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQSU8xNCwgImdwaW8xNCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0dQU19QQUJMQU5LLCAiZ3BzX3BhYmxhbmsiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9HUFNfVE1BUkssICJncHNfdG1hcmsiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9IRE1JX1NDTCwgImhkbWlfc2NsIiwgaGRtaSksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0hETUlfU0RBLCAiaGRtaV9zZGEiLCBoZG1pKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fSUNfRE0sICJpY19kbSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0lDX0RQLCAiaWNfZHAiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9LUF9DT0xfSVBfMCwgImtwX2NvbF9pcF8wIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fS1BfQ09MX0lQXzEsICJrcF9jb2xfaXBfMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0tQX0NPTF9JUF8yLCAia3BfY29sX2lwXzIiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9LUF9DT0xfSVBfMywgImtwX2NvbF9pcF8zIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fS1BfUk9XX09QXzAsICJrcF9yb3dfb3BfMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0tQX1JPV19PUF8xLCAia3Bfcm93X29wXzEiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9LUF9ST1dfT1BfMiwgImtwX3Jvd19vcF8yIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fS1BfUk9XX09QXzMsICJrcF9yb3dfb3BfMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9CXzAsICJsY2RfYl8wIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX0JfMSwgImxjZF9iXzEiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfQl8yLCAibGNkX2JfMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9CXzMsICJsY2RfYl8zIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX0JfNCwgImxjZF9iXzQiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfQl81LCAibGNkX2JfNSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9CXzYsICJsY2RfYl82Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX0JfNywgImxjZF9iXzciLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfR18wLCAibGNkX2dfMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9HXzEsICJsY2RfZ18xIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX0dfMiwgImxjZF9nXzIiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfR18zLCAibGNkX2dfMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9HXzQsICJsY2RfZ180Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX0dfNSwgImxjZF9nXzUiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfR182LCAibGNkX2dfNiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9HXzcsICJsY2RfZ183Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX0hTWU5DLCAibGNkX2hzeW5jIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX09FLCAibGNkX29lIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX1BDTEssICJsY2RfcGNsayIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9SXzAsICJsY2Rfcl8wIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX1JfMSwgImxjZF9yXzEiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfUl8yLCAibGNkX3JfMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9SXzMsICJsY2Rfcl8zIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX1JfNCwgImxjZF9yXzQiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfUl81LCAibGNkX3JfNSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX0xDRF9SXzYsICJsY2Rfcl82Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTENEX1JfNywgImxjZF9yXzciLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9MQ0RfVlNZTkMsICJsY2RfdnN5bmMiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NRE1HUElPMCwgIm1kbWdwaW8wIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTURNR1BJTzEsICJtZG1ncGlvMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01ETUdQSU8yLCAibWRtZ3BpbzIiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NRE1HUElPMywgIm1kbWdwaW8zIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTURNR1BJTzQsICJtZG1ncGlvNCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01ETUdQSU81LCAibWRtZ3BpbzUiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NRE1HUElPNiwgIm1kbWdwaW82Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTURNR1BJTzcsICJtZG1ncGlvNyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01ETUdQSU84LCAibWRtZ3BpbzgiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfMCwgIm1waGlfZGF0YV8wIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzEsICJtcGhpX2RhdGFfMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV8yLCAibXBoaV9kYXRhXzIiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfMywgIm1waGlfZGF0YV8zIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzQsICJtcGhpX2RhdGFfNCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV81LCAibXBoaV9kYXRhXzUiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfNiwgIm1waGlfZGF0YV82Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzcsICJtcGhpX2RhdGFfNyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfREFUQV84LCAibXBoaV9kYXRhXzgiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0RBVEFfOSwgIm1waGlfZGF0YV85Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzEwLCAibXBoaV9kYXRhXzEwIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzExLCAibXBoaV9kYXRhXzExIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzEyLCAibXBoaV9kYXRhXzEyIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzEzLCAibXBoaV9kYXRhXzEzIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzE0LCAibXBoaV9kYXRhXzE0Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9EQVRBXzE1LCAibXBoaV9kYXRhXzE1Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9IQTAsICJtcGhpX2hhMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfSEFUMCwgIm1waGlfaGF0MCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfSEFUMSwgIm1waGlfaGF0MSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfSENFMF9OLCAibXBoaV9oY2UwX24iLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0hDRTFfTiwgIm1waGlfaGNlMV9uIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTVBISV9IUkRfTiwgIm1waGlfaHJkX24iLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9NUEhJX0hXUl9OLCAibXBoaV9od3JfbiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfUlVOMCwgIm1waGlfcnVuMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01QSElfUlVOMSwgIm1waGlfcnVuMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01UWF9TQ0FOX0NMSywgIm10eF9zY2FuX2NsayIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX01UWF9TQ0FOX0RBVEEsICJtdHhfc2Nhbl9kYXRhIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9BRF8wLCAibmFuZF9hZF8wIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9BRF8xLCAibmFuZF9hZF8xIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9BRF8yLCAibmFuZF9hZF8yIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9BRF8zLCAibmFuZF9hZF8zIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9BRF80LCAibmFuZF9hZF80Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9BRF81LCAibmFuZF9hZF81Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9BRF82LCAibmFuZF9hZF82Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9BRF83LCAibmFuZF9hZF83Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9BTEUsICJuYW5kX2FsZSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfQ0VOXzAsICJuYW5kX2Nlbl8wIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9DRU5fMSwgIm5hbmRfY2VuXzEiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9OQU5EX0NMRSwgIm5hbmRfY2xlIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9PRU4sICJuYW5kX29lbiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX05BTkRfUkRZXzAsICJuYW5kX3JkeV8wIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9SRFlfMSwgIm5hbmRfcmR5XzEiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9OQU5EX1dFTiwgIm5hbmRfd2VuIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fTkFORF9XUCwgIm5hbmRfd3AiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9QQzEsICJwYzEiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9QQzIsICJwYzIiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9QTVVfSU5ULCAicG11X2ludCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1BNVV9TQ0wsICJwbXVfc2NsIiwgaTJjKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUE1VX1NEQSwgInBtdV9zZGEiLCBpMmMpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SRlNUMkdfTVRTTE9URU4zRywgInJmc3QyZ19tdHNsb3RlbjNnIiwKLQkJc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMF9SWF9DVEwsICJyZ21paV8wX3J4X2N0bCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzBfUlhDLCAicmdtaWlfMF9yeGMiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8wX1JYRF8wLCAicmdtaWlfMF9yeGRfMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzBfUlhEXzEsICJyZ21paV8wX3J4ZF8xIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMF9SWERfMiwgInJnbWlpXzBfcnhkXzIiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8wX1JYRF8zLCAicmdtaWlfMF9yeGRfMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzBfVFhfQ1RMLCAicmdtaWlfMF90eF9jdGwiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8wX1RYQywgInJnbWlpXzBfdHhjIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMF9UWERfMCwgInJnbWlpXzBfdHhkXzAiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8wX1RYRF8xLCAicmdtaWlfMF90eGRfMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzBfVFhEXzIsICJyZ21paV8wX3R4ZF8yIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMF9UWERfMywgInJnbWlpXzBfdHhkXzMiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8xX1JYX0NUTCwgInJnbWlpXzFfcnhfY3RsIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMV9SWEMsICJyZ21paV8xX3J4YyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzFfUlhEXzAsICJyZ21paV8xX3J4ZF8wIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMV9SWERfMSwgInJnbWlpXzFfcnhkXzEiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8xX1JYRF8yLCAicmdtaWlfMV9yeGRfMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzFfUlhEXzMsICJyZ21paV8xX3J4ZF8zIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMV9UWF9DVEwsICJyZ21paV8xX3R4X2N0bCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzFfVFhDLCAicmdtaWlfMV90eGMiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8xX1RYRF8wLCAicmdtaWlfMV90eGRfMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJXzFfVFhEXzEsICJyZ21paV8xX3R4ZF8xIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUkdNSUlfMV9UWERfMiwgInJnbWlpXzFfdHhkXzIiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9SR01JSV8xX1RYRF8zLCAicmdtaWlfMV90eGRfMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJX0dQSU9fMCwgInJnbWlpX2dwaW9fMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJX0dQSU9fMSwgInJnbWlpX2dwaW9fMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJX0dQSU9fMiwgInJnbWlpX2dwaW9fMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JHTUlJX0dQSU9fMywgInJnbWlpX2dwaW9fMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JUWERBVEEyR19UWERBVEEzRzEsCi0JCSJydHhkYXRhMmdfdHhkYXRhM2cxIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fUlRYRU4yR19UWERBVEEzRzIsICJydHhlbjJnX3R4ZGF0YTNnMiIsCi0JCXN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JYREFUQTNHMCwgInJ4ZGF0YTNnMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JYREFUQTNHMSwgInJ4ZGF0YTNnMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1JYREFUQTNHMiwgInJ4ZGF0YTNnMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU8xX0NMSywgInNkaW8xX2NsayIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU8xX0NNRCwgInNkaW8xX2NtZCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU8xX0RBVEFfMCwgInNkaW8xX2RhdGFfMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU8xX0RBVEFfMSwgInNkaW8xX2RhdGFfMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU8xX0RBVEFfMiwgInNkaW8xX2RhdGFfMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU8xX0RBVEFfMywgInNkaW8xX2RhdGFfMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU80X0NMSywgInNkaW80X2NsayIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU80X0NNRCwgInNkaW80X2NtZCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU80X0RBVEFfMCwgInNkaW80X2RhdGFfMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU80X0RBVEFfMSwgInNkaW80X2RhdGFfMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU80X0RBVEFfMiwgInNkaW80X2RhdGFfMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NESU80X0RBVEFfMywgInNkaW80X2RhdGFfMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NJTV9DTEssICJzaW1fY2xrIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU0lNX0RBVEEsICJzaW1fZGF0YSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NJTV9ERVQsICJzaW1fZGV0Iiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU0lNX1JFU0VUTiwgInNpbV9yZXNldG4iLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TSU0yX0NMSywgInNpbTJfY2xrIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU0lNMl9EQVRBLCAic2ltMl9kYXRhIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU0lNMl9ERVQsICJzaW0yX2RldCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NJTTJfUkVTRVROLCAic2ltMl9yZXNldG4iLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TUklfQywgInNyaV9jIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1JJX0QsICJzcmlfZCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NSSV9FLCAic3JpX2UiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1BfRVhUQ0xLLCAic3NwX2V4dGNsayIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDBfQ0xLLCAic3NwMF9jbGsiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AwX0ZTLCAic3NwMF9mcyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDBfUlhELCAic3NwMF9yeGQiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AwX1RYRCwgInNzcDBfdHhkIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQMl9DTEssICJzc3AyX2NsayIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDJfRlNfMCwgInNzcDJfZnNfMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDJfRlNfMSwgInNzcDJfZnNfMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDJfRlNfMiwgInNzcDJfZnNfMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDJfRlNfMywgInNzcDJfZnNfMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDJfUlhEXzAsICJzc3AyX3J4ZF8wIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQMl9SWERfMSwgInNzcDJfcnhkXzEiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1AyX1RYRF8wLCAic3NwMl90eGRfMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDJfVFhEXzEsICJzc3AyX3R4ZF8xIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQM19DTEssICJzc3AzX2NsayIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDNfRlMsICJzc3AzX2ZzIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQM19SWEQsICJzc3AzX3J4ZCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDNfVFhELCAic3NwM190eGQiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1A0X0NMSywgInNzcDRfY2xrIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQNF9GUywgInNzcDRfZnMiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1A0X1JYRCwgInNzcDRfcnhkIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQNF9UWEQsICJzc3A0X3R4ZCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDVfQ0xLLCAic3NwNV9jbGsiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1A1X0ZTLCAic3NwNV9mcyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDVfUlhELCAic3NwNV9yeGQiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TU1A1X1RYRCwgInNzcDVfdHhkIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQNl9DTEssICJzc3A2X2NsayIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDZfRlMsICJzc3A2X2ZzIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fU1NQNl9SWEQsICJzc3A2X3J4ZCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1NTUDZfVFhELCAic3NwNl90eGQiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TVEFUXzEsICJzdGF0XzEiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TVEFUXzIsICJzdGF0XzIiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9TWVNDTEtFTiwgInN5c2Nsa2VuIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVFJBQ0VDTEssICJ0cmFjZWNsayIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQwMCwgInRyYWNlZHQwMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQwMSwgInRyYWNlZHQwMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQwMiwgInRyYWNlZHQwMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQwMywgInRyYWNlZHQwMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQwNCwgInRyYWNlZHQwNCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQwNSwgInRyYWNlZHQwNSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQwNiwgInRyYWNlZHQwNiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQwNywgInRyYWNlZHQwNyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQwOCwgInRyYWNlZHQwOCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQwOSwgInRyYWNlZHQwOSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQxMCwgInRyYWNlZHQxMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQxMSwgInRyYWNlZHQxMSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQxMiwgInRyYWNlZHQxMiIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQxMywgInRyYWNlZHQxMyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQxNCwgInRyYWNlZHQxNCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RSQUNFRFQxNSwgInRyYWNlZHQxNSIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RYREFUQTNHMCwgInR4ZGF0YTNnMCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1RYUFdSSU5ELCAidHhwd3JpbmQiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9VQVJUQjFfVUNUUywgInVhcnRiMV91Y3RzIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVUFSVEIxX1VSVFMsICJ1YXJ0YjFfdXJ0cyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1VBUlRCMV9VUlhELCAidWFydGIxX3VyeGQiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9VQVJUQjFfVVRYRCwgInVhcnRiMV91dHhkIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVUFSVEIyX1VSWEQsICJ1YXJ0YjJfdXJ4ZCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1VBUlRCMl9VVFhELCAidWFydGIyX3V0eGQiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9VQVJUQjNfVUNUUywgInVhcnRiM191Y3RzIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVUFSVEIzX1VSVFMsICJ1YXJ0YjNfdXJ0cyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1VBUlRCM19VUlhELCAidWFydGIzX3VyeGQiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9VQVJUQjNfVVRYRCwgInVhcnRiM191dHhkIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVUFSVEI0X1VDVFMsICJ1YXJ0YjRfdWN0cyIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1VBUlRCNF9VUlRTLCAidWFydGI0X3VydHMiLCBzdGQpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9VQVJUQjRfVVJYRCwgInVhcnRiNF91cnhkIiwgc3RkKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVUFSVEI0X1VUWEQsICJ1YXJ0YjRfdXR4ZCIsIHN0ZCksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1ZDX0NBTTFfU0NMLCAidmNfY2FtMV9zY2wiLCBpMmMpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9WQ19DQU0xX1NEQSwgInZjX2NhbTFfc2RhIiwgaTJjKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVkNfQ0FNMl9TQ0wsICJ2Y19jYW0yX3NjbCIsIGkyYyksCi0JQkNNMjgxWFhfUElOX0RFU0MoQkNNMjgxWFhfUElOX1ZDX0NBTTJfU0RBLCAidmNfY2FtMl9zZGEiLCBpMmMpLAotCUJDTTI4MVhYX1BJTl9ERVNDKEJDTTI4MVhYX1BJTl9WQ19DQU0zX1NDTCwgInZjX2NhbTNfc2NsIiwgaTJjKSwKLQlCQ00yODFYWF9QSU5fREVTQyhCQ00yODFYWF9QSU5fVkNfQ0FNM19TREEsICJ2Y19jYW0zX3NkYSIsIGkyYyksCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGJjbTI4MXh4X2FsdF9ncm91cHNbXSA9IHsKLQkiYWRjc3luYyIsCi0JImJhdF9ybSIsCi0JImJzYzFfc2NsIiwKLQkiYnNjMV9zZGEiLAotCSJic2MyX3NjbCIsCi0JImJzYzJfc2RhIiwKLQkiY2xhc3NncHdyIiwKLQkiY2xrX2N4OCIsCi0JImNsa291dF8wIiwKLQkiY2xrb3V0XzEiLAotCSJjbGtvdXRfMiIsCi0JImNsa291dF8zIiwKLQkiY2xrcmVxX2luXzAiLAotCSJjbGtyZXFfaW5fMSIsCi0JImN3c19zeXNfcmVxMSIsCi0JImN3c19zeXNfcmVxMiIsCi0JImN3c19zeXNfcmVxMyIsCi0JImRpZ21pYzFfY2xrIiwKLQkiZGlnbWljMV9kcSIsCi0JImRpZ21pYzJfY2xrIiwKLQkiZGlnbWljMl9kcSIsCi0JImdwZW4xMyIsCi0JImdwZW4xNCIsCi0JImdwZW4xNSIsCi0JImdwaW8wMCIsCi0JImdwaW8wMSIsCi0JImdwaW8wMiIsCi0JImdwaW8wMyIsCi0JImdwaW8wNCIsCi0JImdwaW8wNSIsCi0JImdwaW8wNiIsCi0JImdwaW8wNyIsCi0JImdwaW8wOCIsCi0JImdwaW8wOSIsCi0JImdwaW8xMCIsCi0JImdwaW8xMSIsCi0JImdwaW8xMiIsCi0JImdwaW8xMyIsCi0JImdwaW8xNCIsCi0JImdwc19wYWJsYW5rIiwKLQkiZ3BzX3RtYXJrIiwKLQkiaGRtaV9zY2wiLAotCSJoZG1pX3NkYSIsCi0JImljX2RtIiwKLQkiaWNfZHAiLAotCSJrcF9jb2xfaXBfMCIsCi0JImtwX2NvbF9pcF8xIiwKLQkia3BfY29sX2lwXzIiLAotCSJrcF9jb2xfaXBfMyIsCi0JImtwX3Jvd19vcF8wIiwKLQkia3Bfcm93X29wXzEiLAotCSJrcF9yb3dfb3BfMiIsCi0JImtwX3Jvd19vcF8zIiwKLQkibGNkX2JfMCIsCi0JImxjZF9iXzEiLAotCSJsY2RfYl8yIiwKLQkibGNkX2JfMyIsCi0JImxjZF9iXzQiLAotCSJsY2RfYl81IiwKLQkibGNkX2JfNiIsCi0JImxjZF9iXzciLAotCSJsY2RfZ18wIiwKLQkibGNkX2dfMSIsCi0JImxjZF9nXzIiLAotCSJsY2RfZ18zIiwKLQkibGNkX2dfNCIsCi0JImxjZF9nXzUiLAotCSJsY2RfZ182IiwKLQkibGNkX2dfNyIsCi0JImxjZF9oc3luYyIsCi0JImxjZF9vZSIsCi0JImxjZF9wY2xrIiwKLQkibGNkX3JfMCIsCi0JImxjZF9yXzEiLAotCSJsY2Rfcl8yIiwKLQkibGNkX3JfMyIsCi0JImxjZF9yXzQiLAotCSJsY2Rfcl81IiwKLQkibGNkX3JfNiIsCi0JImxjZF9yXzciLAotCSJsY2RfdnN5bmMiLAotCSJtZG1ncGlvMCIsCi0JIm1kbWdwaW8xIiwKLQkibWRtZ3BpbzIiLAotCSJtZG1ncGlvMyIsCi0JIm1kbWdwaW80IiwKLQkibWRtZ3BpbzUiLAotCSJtZG1ncGlvNiIsCi0JIm1kbWdwaW83IiwKLQkibWRtZ3BpbzgiLAotCSJtcGhpX2RhdGFfMCIsCi0JIm1waGlfZGF0YV8xIiwKLQkibXBoaV9kYXRhXzIiLAotCSJtcGhpX2RhdGFfMyIsCi0JIm1waGlfZGF0YV80IiwKLQkibXBoaV9kYXRhXzUiLAotCSJtcGhpX2RhdGFfNiIsCi0JIm1waGlfZGF0YV83IiwKLQkibXBoaV9kYXRhXzgiLAotCSJtcGhpX2RhdGFfOSIsCi0JIm1waGlfZGF0YV8xMCIsCi0JIm1waGlfZGF0YV8xMSIsCi0JIm1waGlfZGF0YV8xMiIsCi0JIm1waGlfZGF0YV8xMyIsCi0JIm1waGlfZGF0YV8xNCIsCi0JIm1waGlfZGF0YV8xNSIsCi0JIm1waGlfaGEwIiwKLQkibXBoaV9oYXQwIiwKLQkibXBoaV9oYXQxIiwKLQkibXBoaV9oY2UwX24iLAotCSJtcGhpX2hjZTFfbiIsCi0JIm1waGlfaHJkX24iLAotCSJtcGhpX2h3cl9uIiwKLQkibXBoaV9ydW4wIiwKLQkibXBoaV9ydW4xIiwKLQkibXR4X3NjYW5fY2xrIiwKLQkibXR4X3NjYW5fZGF0YSIsCi0JIm5hbmRfYWRfMCIsCi0JIm5hbmRfYWRfMSIsCi0JIm5hbmRfYWRfMiIsCi0JIm5hbmRfYWRfMyIsCi0JIm5hbmRfYWRfNCIsCi0JIm5hbmRfYWRfNSIsCi0JIm5hbmRfYWRfNiIsCi0JIm5hbmRfYWRfNyIsCi0JIm5hbmRfYWxlIiwKLQkibmFuZF9jZW5fMCIsCi0JIm5hbmRfY2VuXzEiLAotCSJuYW5kX2NsZSIsCi0JIm5hbmRfb2VuIiwKLQkibmFuZF9yZHlfMCIsCi0JIm5hbmRfcmR5XzEiLAotCSJuYW5kX3dlbiIsCi0JIm5hbmRfd3AiLAotCSJwYzEiLAotCSJwYzIiLAotCSJwbXVfaW50IiwKLQkicG11X3NjbCIsCi0JInBtdV9zZGEiLAotCSJyZnN0MmdfbXRzbG90ZW4zZyIsCi0JInJnbWlpXzBfcnhfY3RsIiwKLQkicmdtaWlfMF9yeGMiLAotCSJyZ21paV8wX3J4ZF8wIiwKLQkicmdtaWlfMF9yeGRfMSIsCi0JInJnbWlpXzBfcnhkXzIiLAotCSJyZ21paV8wX3J4ZF8zIiwKLQkicmdtaWlfMF90eF9jdGwiLAotCSJyZ21paV8wX3R4YyIsCi0JInJnbWlpXzBfdHhkXzAiLAotCSJyZ21paV8wX3R4ZF8xIiwKLQkicmdtaWlfMF90eGRfMiIsCi0JInJnbWlpXzBfdHhkXzMiLAotCSJyZ21paV8xX3J4X2N0bCIsCi0JInJnbWlpXzFfcnhjIiwKLQkicmdtaWlfMV9yeGRfMCIsCi0JInJnbWlpXzFfcnhkXzEiLAotCSJyZ21paV8xX3J4ZF8yIiwKLQkicmdtaWlfMV9yeGRfMyIsCi0JInJnbWlpXzFfdHhfY3RsIiwKLQkicmdtaWlfMV90eGMiLAotCSJyZ21paV8xX3R4ZF8wIiwKLQkicmdtaWlfMV90eGRfMSIsCi0JInJnbWlpXzFfdHhkXzIiLAotCSJyZ21paV8xX3R4ZF8zIiwKLQkicmdtaWlfZ3Bpb18wIiwKLQkicmdtaWlfZ3Bpb18xIiwKLQkicmdtaWlfZ3Bpb18yIiwKLQkicmdtaWlfZ3Bpb18zIiwKLQkicnR4ZGF0YTJnX3R4ZGF0YTNnMSIsCi0JInJ0eGVuMmdfdHhkYXRhM2cyIiwKLQkicnhkYXRhM2cwIiwKLQkicnhkYXRhM2cxIiwKLQkicnhkYXRhM2cyIiwKLQkic2RpbzFfY2xrIiwKLQkic2RpbzFfY21kIiwKLQkic2RpbzFfZGF0YV8wIiwKLQkic2RpbzFfZGF0YV8xIiwKLQkic2RpbzFfZGF0YV8yIiwKLQkic2RpbzFfZGF0YV8zIiwKLQkic2RpbzRfY2xrIiwKLQkic2RpbzRfY21kIiwKLQkic2RpbzRfZGF0YV8wIiwKLQkic2RpbzRfZGF0YV8xIiwKLQkic2RpbzRfZGF0YV8yIiwKLQkic2RpbzRfZGF0YV8zIiwKLQkic2ltX2NsayIsCi0JInNpbV9kYXRhIiwKLQkic2ltX2RldCIsCi0JInNpbV9yZXNldG4iLAotCSJzaW0yX2NsayIsCi0JInNpbTJfZGF0YSIsCi0JInNpbTJfZGV0IiwKLQkic2ltMl9yZXNldG4iLAotCSJzcmlfYyIsCi0JInNyaV9kIiwKLQkic3JpX2UiLAotCSJzc3BfZXh0Y2xrIiwKLQkic3NwMF9jbGsiLAotCSJzc3AwX2ZzIiwKLQkic3NwMF9yeGQiLAotCSJzc3AwX3R4ZCIsCi0JInNzcDJfY2xrIiwKLQkic3NwMl9mc18wIiwKLQkic3NwMl9mc18xIiwKLQkic3NwMl9mc18yIiwKLQkic3NwMl9mc18zIiwKLQkic3NwMl9yeGRfMCIsCi0JInNzcDJfcnhkXzEiLAotCSJzc3AyX3R4ZF8wIiwKLQkic3NwMl90eGRfMSIsCi0JInNzcDNfY2xrIiwKLQkic3NwM19mcyIsCi0JInNzcDNfcnhkIiwKLQkic3NwM190eGQiLAotCSJzc3A0X2NsayIsCi0JInNzcDRfZnMiLAotCSJzc3A0X3J4ZCIsCi0JInNzcDRfdHhkIiwKLQkic3NwNV9jbGsiLAotCSJzc3A1X2ZzIiwKLQkic3NwNV9yeGQiLAotCSJzc3A1X3R4ZCIsCi0JInNzcDZfY2xrIiwKLQkic3NwNl9mcyIsCi0JInNzcDZfcnhkIiwKLQkic3NwNl90eGQiLAotCSJzdGF0XzEiLAotCSJzdGF0XzIiLAotCSJzeXNjbGtlbiIsCi0JInRyYWNlY2xrIiwKLQkidHJhY2VkdDAwIiwKLQkidHJhY2VkdDAxIiwKLQkidHJhY2VkdDAyIiwKLQkidHJhY2VkdDAzIiwKLQkidHJhY2VkdDA0IiwKLQkidHJhY2VkdDA1IiwKLQkidHJhY2VkdDA2IiwKLQkidHJhY2VkdDA3IiwKLQkidHJhY2VkdDA4IiwKLQkidHJhY2VkdDA5IiwKLQkidHJhY2VkdDEwIiwKLQkidHJhY2VkdDExIiwKLQkidHJhY2VkdDEyIiwKLQkidHJhY2VkdDEzIiwKLQkidHJhY2VkdDE0IiwKLQkidHJhY2VkdDE1IiwKLQkidHhkYXRhM2cwIiwKLQkidHhwd3JpbmQiLAotCSJ1YXJ0YjFfdWN0cyIsCi0JInVhcnRiMV91cnRzIiwKLQkidWFydGIxX3VyeGQiLAotCSJ1YXJ0YjFfdXR4ZCIsCi0JInVhcnRiMl91cnhkIiwKLQkidWFydGIyX3V0eGQiLAotCSJ1YXJ0YjNfdWN0cyIsCi0JInVhcnRiM191cnRzIiwKLQkidWFydGIzX3VyeGQiLAotCSJ1YXJ0YjNfdXR4ZCIsCi0JInVhcnRiNF91Y3RzIiwKLQkidWFydGI0X3VydHMiLAotCSJ1YXJ0YjRfdXJ4ZCIsCi0JInVhcnRiNF91dHhkIiwKLQkidmNfY2FtMV9zY2wiLAotCSJ2Y19jYW0xX3NkYSIsCi0JInZjX2NhbTJfc2NsIiwKLQkidmNfY2FtMl9zZGEiLAotCSJ2Y19jYW0zX3NjbCIsCi0JInZjX2NhbTNfc2RhIiwKLX07Ci0KLS8qIEV2ZXJ5IHBpbiBjYW4gaW1wbGVtZW50IGFsbCBBTFQxLUFMVDQgZnVuY3Rpb25zICovCi0jZGVmaW5lIEJDTTI4MVhYX1BJTl9GVU5DVElPTihmY25fbmFtZSkJCQlcCi17CQkJCQkJCVwKLQkubmFtZSA9ICNmY25fbmFtZSwJCQkJXAotCS5ncm91cHMgPSBiY20yODF4eF9hbHRfZ3JvdXBzLAkJCVwKLQkubmdyb3VwcyA9IEFSUkFZX1NJWkUoYmNtMjgxeHhfYWx0X2dyb3VwcyksCVwKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBiY20yODF4eF9waW5fZnVuY3Rpb24gYmNtMjgxeHhfZnVuY3Rpb25zW10gPSB7Ci0JQkNNMjgxWFhfUElOX0ZVTkNUSU9OKGFsdDEpLAotCUJDTTI4MVhYX1BJTl9GVU5DVElPTihhbHQyKSwKLQlCQ00yODFYWF9QSU5fRlVOQ1RJT04oYWx0MyksCi0JQkNNMjgxWFhfUElOX0ZVTkNUSU9OKGFsdDQpLAotfTsKLQotc3RhdGljIHN0cnVjdCBiY20yODF4eF9waW5jdHJsX2RhdGEgYmNtMjgxeHhfcGluY3RybCA9IHsKLQkucGlucyA9IGJjbTI4MXh4X3BpbmN0cmxfcGlucywKLQkubnBpbnMgPSBBUlJBWV9TSVpFKGJjbTI4MXh4X3BpbmN0cmxfcGlucyksCi0JLmZ1bmN0aW9ucyA9IGJjbTI4MXh4X2Z1bmN0aW9ucywKLQkubmZ1bmN0aW9ucyA9IEFSUkFZX1NJWkUoYmNtMjgxeHhfZnVuY3Rpb25zKSwKLX07Ci0KLXN0YXRpYyBpbmxpbmUgZW51bSBiY20yODF4eF9waW5fdHlwZSBwaW5fdHlwZV9nZXQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAotCQkJCQkJICB1bnNpZ25lZCBwaW4pCi17Ci0Jc3RydWN0IGJjbTI4MXh4X3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKLQotCWlmIChwaW4gPj0gcGRhdGEtPm5waW5zKQotCQlyZXR1cm4gQkNNMjgxWFhfUElOX1RZUEVfVU5LTk9XTjsKLQotCXJldHVybiAqKGVudW0gYmNtMjgxeHhfcGluX3R5cGUgKikocGRhdGEtPnBpbnNbcGluXS5kcnZfZGF0YSk7Ci19Ci0KLSNkZWZpbmUgQkNNMjgxWFhfUElOX1NISUZUKHR5cGUsIHBhcmFtKSBcCi0JKEJDTTI4MVhYXyAjIyB0eXBlICMjIF9QSU5fUkVHXyAjIyBwYXJhbSAjIyBfU0hJRlQpCi0KLSNkZWZpbmUgQkNNMjgxWFhfUElOX01BU0sodHlwZSwgcGFyYW0pIFwKLQkoQkNNMjgxWFhfICMjIHR5cGUgIyMgX1BJTl9SRUdfICMjIHBhcmFtICMjIF9NQVNLKQotCi0vKgotICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdXNlZCB0byBidWlsZCB1cCB0aGUgdmFsdWUgYW5kIG1hc2sgdXNlZCB0byB3cml0ZSB0bwotICogYSBwaW4gcmVnaXN0ZXIsIGJ1dCBkb2VzIG5vdCBhY3R1YWxseSB3cml0ZSB0byB0aGUgcmVnaXN0ZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBiY20yODF4eF9waW5fdXBkYXRlKHUzMiAqcmVnX3ZhbCwgdTMyICpyZWdfbWFzaywKLQkJCQkgICAgICAgdTMyIHBhcmFtX3ZhbCwgdTMyIHBhcmFtX3NoaWZ0LAotCQkJCSAgICAgICB1MzIgcGFyYW1fbWFzaykKLXsKLQkqcmVnX3ZhbCAmPSB+cGFyYW1fbWFzazsKLQkqcmVnX3ZhbCB8PSAocGFyYW1fdmFsIDw8IHBhcmFtX3NoaWZ0KSAmIHBhcmFtX21hc2s7Ci0JKnJlZ19tYXNrIHw9IHBhcmFtX21hc2s7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBiY20yODF4eF9waW5jdHJsX3JlZ21hcF9jb25maWcgPSB7Ci0JLnJlZ19iaXRzID0gMzIsCi0JLnJlZ19zdHJpZGUgPSA0LAotCS52YWxfYml0cyA9IDMyLAotCS5tYXhfcmVnaXN0ZXIgPSBCQ00yODFYWF9QSU5fVkNfQ0FNM19TREEsCi19OwotCi1zdGF0aWMgaW50IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2dyb3Vwc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpCi17Ci0Jc3RydWN0IGJjbTI4MXh4X3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKLQotCXJldHVybiBwZGF0YS0+bnBpbnM7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpiY20yODF4eF9waW5jdHJsX2dldF9ncm91cF9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJCQkJCSAgIHVuc2lnbmVkIGdyb3VwKQotewotCXN0cnVjdCBiY20yODF4eF9waW5jdHJsX2RhdGEgKnBkYXRhID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7Ci0KLQlyZXR1cm4gcGRhdGEtPnBpbnNbZ3JvdXBdLm5hbWU7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtMjgxeHhfcGluY3RybF9nZXRfZ3JvdXBfcGlucyhzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCi0JCQkJCSAgIHVuc2lnbmVkIGdyb3VwLAotCQkJCQkgICBjb25zdCB1bnNpZ25lZCAqKnBpbnMsCi0JCQkJCSAgIHVuc2lnbmVkICpudW1fcGlucykKLXsKLQlzdHJ1Y3QgYmNtMjgxeHhfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwotCi0JKnBpbnMgPSAmcGRhdGEtPnBpbnNbZ3JvdXBdLm51bWJlcjsKLQkqbnVtX3BpbnMgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbTI4MXh4X3BpbmN0cmxfcGluX2RiZ19zaG93KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJCQkJICBzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCi0JCQkJCSAgdW5zaWduZWQgb2Zmc2V0KQotewotCXNlcV9wcmludGYocywgIiAlcyIsIGRldl9uYW1lKHBjdGxkZXYtPmRldikpOwotfQotCi1zdGF0aWMgc3RydWN0IHBpbmN0cmxfb3BzIGJjbTI4MXh4X3BpbmN0cmxfb3BzID0gewotCS5nZXRfZ3JvdXBzX2NvdW50ID0gYmNtMjgxeHhfcGluY3RybF9nZXRfZ3JvdXBzX2NvdW50LAotCS5nZXRfZ3JvdXBfbmFtZSA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2dyb3VwX25hbWUsCi0JLmdldF9ncm91cF9waW5zID0gYmNtMjgxeHhfcGluY3RybF9nZXRfZ3JvdXBfcGlucywKLQkucGluX2RiZ19zaG93ID0gYmNtMjgxeHhfcGluY3RybF9waW5fZGJnX3Nob3csCi0JLmR0X25vZGVfdG9fbWFwID0gcGluY29uZl9nZW5lcmljX2R0X25vZGVfdG9fbWFwX3BpbiwKLQkuZHRfZnJlZV9tYXAgPSBwaW5jdHJsX3V0aWxzX2R0X2ZyZWVfbWFwLAotfTsKLQotc3RhdGljIGludCBiY20yODF4eF9waW5jdHJsX2dldF9mY25zX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldikKLXsKLQlzdHJ1Y3QgYmNtMjgxeHhfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwotCi0JcmV0dXJuIHBkYXRhLT5uZnVuY3Rpb25zOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqYmNtMjgxeHhfcGluY3RybF9nZXRfZmNuX25hbWUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAotCQkJCQkJIHVuc2lnbmVkIGZ1bmN0aW9uKQotewotCXN0cnVjdCBiY20yODF4eF9waW5jdHJsX2RhdGEgKnBkYXRhID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7Ci0KLQlyZXR1cm4gcGRhdGEtPmZ1bmN0aW9uc1tmdW5jdGlvbl0ubmFtZTsKLX0KLQotc3RhdGljIGludCBiY20yODF4eF9waW5jdHJsX2dldF9mY25fZ3JvdXBzKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJCQkJICAgdW5zaWduZWQgZnVuY3Rpb24sCi0JCQkJCSAgIGNvbnN0IGNoYXIgKiBjb25zdCAqKmdyb3VwcywKLQkJCQkJICAgdW5zaWduZWQgKiBjb25zdCBudW1fZ3JvdXBzKQotewotCXN0cnVjdCBiY20yODF4eF9waW5jdHJsX2RhdGEgKnBkYXRhID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7Ci0KLQkqZ3JvdXBzID0gcGRhdGEtPmZ1bmN0aW9uc1tmdW5jdGlvbl0uZ3JvdXBzOwotCSpudW1fZ3JvdXBzID0gcGRhdGEtPmZ1bmN0aW9uc1tmdW5jdGlvbl0ubmdyb3VwczsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJjbTI4MXh4X3Bpbm11eF9zZXQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAotCQkJICAgICAgIHVuc2lnbmVkIGZ1bmN0aW9uLAotCQkJICAgICAgIHVuc2lnbmVkIGdyb3VwKQotewotCXN0cnVjdCBiY20yODF4eF9waW5jdHJsX2RhdGEgKnBkYXRhID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7Ci0JY29uc3Qgc3RydWN0IGJjbTI4MXh4X3Bpbl9mdW5jdGlvbiAqZiA9ICZwZGF0YS0+ZnVuY3Rpb25zW2Z1bmN0aW9uXTsKLQl1MzIgb2Zmc2V0ID0gNCAqIHBkYXRhLT5waW5zW2dyb3VwXS5udW1iZXI7Ci0JaW50IHJjID0gMDsKLQotCWRldl9kYmcocGN0bGRldi0+ZGV2LAotCQkiJXMoKTogRW5hYmxlIGZ1bmN0aW9uICVzICglZCkgb2YgcGluICVzICglZCkgQG9mZnNldCAweCV4LlxuIiwKLQkJX19mdW5jX18sIGYtPm5hbWUsIGZ1bmN0aW9uLCBwZGF0YS0+cGluc1tncm91cF0ubmFtZSwKLQkJcGRhdGEtPnBpbnNbZ3JvdXBdLm51bWJlciwgb2Zmc2V0KTsKLQotCXJjID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBkYXRhLT5yZWdtYXAsIG9mZnNldCwKLQkJQkNNMjgxWFhfUElOX1JFR19GX1NFTF9NQVNLLAotCQlmdW5jdGlvbiA8PCBCQ00yODFYWF9QSU5fUkVHX0ZfU0VMX1NISUZUKTsKLQlpZiAocmMpCi0JCWRldl9lcnIocGN0bGRldi0+ZGV2LAotCQkJIkVycm9yIHVwZGF0aW5nIHJlZ2lzdGVyIGZvciBwaW4gJXMgKCVkKS5cbiIsCi0JCQlwZGF0YS0+cGluc1tncm91cF0ubmFtZSwgcGRhdGEtPnBpbnNbZ3JvdXBdLm51bWJlcik7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGlubXV4X29wcyBiY20yODF4eF9waW5jdHJsX3Bpbm11eF9vcHMgPSB7Ci0JLmdldF9mdW5jdGlvbnNfY291bnQgPSBiY20yODF4eF9waW5jdHJsX2dldF9mY25zX2NvdW50LAotCS5nZXRfZnVuY3Rpb25fbmFtZSA9IGJjbTI4MXh4X3BpbmN0cmxfZ2V0X2Zjbl9uYW1lLAotCS5nZXRfZnVuY3Rpb25fZ3JvdXBzID0gYmNtMjgxeHhfcGluY3RybF9nZXRfZmNuX2dyb3VwcywKLQkuc2V0X211eCA9IGJjbTI4MXh4X3Bpbm11eF9zZXQsCi19OwotCi1zdGF0aWMgaW50IGJjbTI4MXh4X3BpbmN0cmxfcGluX2NvbmZpZ19nZXQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAotCQkJCQkgICB1bnNpZ25lZCBwaW4sCi0JCQkJCSAgIHVuc2lnbmVkIGxvbmcgKmNvbmZpZykKLXsKLQlyZXR1cm4gLUVOT1RTVVBQOwotfQotCi0KLS8qIEdvZXMgdGhyb3VnaCB0aGUgY29uZmlncyBhbmQgdXBkYXRlIHJlZ2lzdGVyIHZhbC9tYXNrICovCi1zdGF0aWMgaW50IGJjbTI4MXh4X3N0ZF9waW5fdXBkYXRlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJCQkgICB1bnNpZ25lZCBwaW4sCi0JCQkJICAgdW5zaWduZWQgbG9uZyAqY29uZmlncywKLQkJCQkgICB1bnNpZ25lZCBudW1fY29uZmlncywKLQkJCQkgICB1MzIgKnZhbCwKLQkJCQkgICB1MzIgKm1hc2spCi17Ci0Jc3RydWN0IGJjbTI4MXh4X3BpbmN0cmxfZGF0YSAqcGRhdGEgPSBwaW5jdHJsX2Rldl9nZXRfZHJ2ZGF0YShwY3RsZGV2KTsKLQlpbnQgaTsKLQllbnVtIHBpbl9jb25maWdfcGFyYW0gcGFyYW07Ci0JdTE2IGFyZzsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fY29uZmlnczsgaSsrKSB7Ci0JCXBhcmFtID0gcGluY29uZl90b19jb25maWdfcGFyYW0oY29uZmlnc1tpXSk7Ci0JCWFyZyA9IHBpbmNvbmZfdG9fY29uZmlnX2FyZ3VtZW50KGNvbmZpZ3NbaV0pOwotCi0JCXN3aXRjaCAocGFyYW0pIHsKLQkJY2FzZSBQSU5fQ09ORklHX0lOUFVUX1NDSE1JVFRfRU5BQkxFOgotCQkJYXJnID0gKGFyZyA+PSAxID8gMSA6IDApOwotCQkJYmNtMjgxeHhfcGluX3VwZGF0ZSh2YWwsIG1hc2ssIGFyZywKLQkJCQlCQ00yODFYWF9QSU5fU0hJRlQoU1RELCBIWVNUKSwKLQkJCQlCQ00yODFYWF9QSU5fTUFTSyhTVEQsIEhZU1QpKTsKLQkJCWJyZWFrOwotCQkvKgotCQkgKiBUaGUgcGluIGJpYXMgY2FuIG9ubHkgYmUgb25lIG9mIHB1bGwtdXAsIHB1bGwtZG93biwgb3IKLQkJICogZGlzYWJsZS4gIFRoZSB1c2VyIGRvZXMgbm90IG5lZWQgdG8gc3BlY2lmeSBhIHZhbHVlIGZvciB0aGUKLQkJICogcHJvcGVydHksIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBmcm9tIHBpbmNvbmYtZ2VuZXJpYyBpcwotCQkgKiBpZ25vcmVkLgotCQkgKi8KLQkJY2FzZSBQSU5fQ09ORklHX0JJQVNfRElTQUJMRToKLQkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCAwLAotCQkJCUJDTTI4MVhYX1BJTl9TSElGVChTVEQsIFBVTExfVVApLAotCQkJCUJDTTI4MVhYX1BJTl9NQVNLKFNURCwgUFVMTF9VUCkpOwotCQkJYmNtMjgxeHhfcGluX3VwZGF0ZSh2YWwsIG1hc2ssIDAsCi0JCQkJQkNNMjgxWFhfUElOX1NISUZUKFNURCwgUFVMTF9ETiksCi0JCQkJQkNNMjgxWFhfUElOX01BU0soU1RELCBQVUxMX0ROKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX1VQOgotCQkJYmNtMjgxeHhfcGluX3VwZGF0ZSh2YWwsIG1hc2ssIDEsCi0JCQkJQkNNMjgxWFhfUElOX1NISUZUKFNURCwgUFVMTF9VUCksCi0JCQkJQkNNMjgxWFhfUElOX01BU0soU1RELCBQVUxMX1VQKSk7Ci0JCQliY20yODF4eF9waW5fdXBkYXRlKHZhbCwgbWFzaywgMCwKLQkJCQlCQ00yODFYWF9QSU5fU0hJRlQoU1RELCBQVUxMX0ROKSwKLQkJCQlCQ00yODFYWF9QSU5fTUFTSyhTVEQsIFBVTExfRE4pKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUElOX0NPTkZJR19CSUFTX1BVTExfRE9XTjoKLQkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCAwLAotCQkJCUJDTTI4MVhYX1BJTl9TSElGVChTVEQsIFBVTExfVVApLAotCQkJCUJDTTI4MVhYX1BJTl9NQVNLKFNURCwgUFVMTF9VUCkpOwotCQkJYmNtMjgxeHhfcGluX3VwZGF0ZSh2YWwsIG1hc2ssIDEsCi0JCQkJQkNNMjgxWFhfUElOX1NISUZUKFNURCwgUFVMTF9ETiksCi0JCQkJQkNNMjgxWFhfUElOX01BU0soU1RELCBQVUxMX0ROKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBJTl9DT05GSUdfU0xFV19SQVRFOgotCQkJYXJnID0gKGFyZyA+PSAxID8gMSA6IDApOwotCQkJYmNtMjgxeHhfcGluX3VwZGF0ZSh2YWwsIG1hc2ssIGFyZywKLQkJCQlCQ00yODFYWF9QSU5fU0hJRlQoU1RELCBTTEVXKSwKLQkJCQlCQ00yODFYWF9QSU5fTUFTSyhTVEQsIFNMRVcpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUElOX0NPTkZJR19JTlBVVF9FTkFCTEU6Ci0JCQkvKiBpbnZlcnNlZCBzaW5jZSByZWdpc3RlciBpcyBmb3IgaW5wdXQgX2Rpc2FibGVfICovCi0JCQlhcmcgPSAoYXJnID49IDEgPyAwIDogMSk7Ci0JCQliY20yODF4eF9waW5fdXBkYXRlKHZhbCwgbWFzaywgYXJnLAotCQkJCUJDTTI4MVhYX1BJTl9TSElGVChTVEQsIElOUFVUX0RJUyksCi0JCQkJQkNNMjgxWFhfUElOX01BU0soU1RELCBJTlBVVF9ESVMpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUElOX0NPTkZJR19EUklWRV9TVFJFTkdUSDoKLQkJCS8qIFZhbGlkIHJhbmdlIGlzIDItMTYgbUEsIGV2ZW4gbnVtYmVycyBvbmx5ICovCi0JCQlpZiAoKGFyZyA8IDIpIHx8IChhcmcgPiAxNikgfHwgKGFyZyAlIDIpKSB7Ci0JCQkJZGV2X2VycihwY3RsZGV2LT5kZXYsCi0JCQkJCSJJbnZhbGlkIERyaXZlIFN0cmVuZ3RoIHZhbHVlICglZCkgZm9yICIKLQkJCQkJInBpbiAlcyAoJWQpLiBWYWxpZCB2YWx1ZXMgYXJlICIKLQkJCQkJIigyLi4xNikgbUEsIGV2ZW4gbnVtYmVycyBvbmx5LlxuIiwKLQkJCQkJYXJnLCBwZGF0YS0+cGluc1twaW5dLm5hbWUsIHBpbik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQliY20yODF4eF9waW5fdXBkYXRlKHZhbCwgbWFzaywgKGFyZy8yKS0xLAotCQkJCUJDTTI4MVhYX1BJTl9TSElGVChTVEQsIERSVl9TVFIpLAotCQkJCUJDTTI4MVhYX1BJTl9NQVNLKFNURCwgRFJWX1NUUikpOwotCQkJYnJlYWs7Ci0KLQkJZGVmYXVsdDoKLQkJCWRldl9lcnIocGN0bGRldi0+ZGV2LAotCQkJCSJVbnJlY29nbml6ZWQgcGluIGNvbmZpZyAlZCBmb3IgcGluICVzICglZCkuXG4iLAotCQkJCXBhcmFtLCBwZGF0YS0+cGluc1twaW5dLm5hbWUsIHBpbik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQl9IC8qIHN3aXRjaCBjb25maWcgKi8KLQl9IC8qIGZvciBlYWNoIGNvbmZpZyAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBUaGUgcHVsbC11cCBzdHJlbmd0aCBmb3IgYW4gSTJDIHBpbiBpcyByZXByZXNlbnRlZCBieSBiaXRzIDQtNiBpbiB0aGUKLSAqIHJlZ2lzdGVyIHdpdGggdGhlIGZvbGxvd2luZyBtYXBwaW5nOgotICogICAwYjAwMDogTm8gcHVsbC11cAotICogICAwYjAwMTogMTIwMCBPaG0KLSAqICAgMGIwMTA6IDE4MDAgT2htCi0gKiAgIDBiMDExOiA3MjAgT2htCi0gKiAgIDBiMTAwOiAyNzAwIE9obQotICogICAwYjEwMTogODMxIE9obQotICogICAwYjExMDogMTA4MCBPaG0KLSAqICAgMGIxMTE6IDU2OCBPaG0KLSAqIFRoaXMgYXJyYXkgbWFwcyBwdWxsLXVwIHN0cmVuZ3RoIGluIE9obXMgdG8gcmVnaXN0ZXIgdmFsdWVzICgxK2luZGV4KS4KLSAqLwotc3RhdGljIGNvbnN0IHUxNiBiY20yODF4eF9wdWxsdXBfbWFwW10gPSB7Ci0JMTIwMCwgMTgwMCwgNzIwLCAyNzAwLCA4MzEsIDEwODAsIDU2OAotfTsKLQotLyogR29lcyB0aHJvdWdoIHRoZSBjb25maWdzIGFuZCB1cGRhdGUgcmVnaXN0ZXIgdmFsL21hc2sgKi8KLXN0YXRpYyBpbnQgYmNtMjgxeHhfaTJjX3Bpbl91cGRhdGUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAotCQkJCSAgIHVuc2lnbmVkIHBpbiwKLQkJCQkgICB1bnNpZ25lZCBsb25nICpjb25maWdzLAotCQkJCSAgIHVuc2lnbmVkIG51bV9jb25maWdzLAotCQkJCSAgIHUzMiAqdmFsLAotCQkJCSAgIHUzMiAqbWFzaykKLXsKLQlzdHJ1Y3QgYmNtMjgxeHhfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwotCWludCBpLCBqOwotCWVudW0gcGluX2NvbmZpZ19wYXJhbSBwYXJhbTsKLQl1MTYgYXJnOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9jb25maWdzOyBpKyspIHsKLQkJcGFyYW0gPSBwaW5jb25mX3RvX2NvbmZpZ19wYXJhbShjb25maWdzW2ldKTsKLQkJYXJnID0gcGluY29uZl90b19jb25maWdfYXJndW1lbnQoY29uZmlnc1tpXSk7Ci0KLQkJc3dpdGNoIChwYXJhbSkgewotCQljYXNlIFBJTl9DT05GSUdfQklBU19QVUxMX1VQOgotCQkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoYmNtMjgxeHhfcHVsbHVwX21hcCk7IGorKykKLQkJCQlpZiAoYmNtMjgxeHhfcHVsbHVwX21hcFtqXSA9PSBhcmcpCi0JCQkJCWJyZWFrOwotCi0JCQlpZiAoaiA9PSBBUlJBWV9TSVpFKGJjbTI4MXh4X3B1bGx1cF9tYXApKSB7Ci0JCQkJZGV2X2VycihwY3RsZGV2LT5kZXYsCi0JCQkJCSJJbnZhbGlkIHB1bGwtdXAgdmFsdWUgKCVkKSBmb3IgcGluICVzICIKLQkJCQkJIiglZCkuIFZhbGlkIHZhbHVlcyBhcmUgNTY4LCA3MjAsIDgzMSwgIgotCQkJCQkiMTA4MCwgMTIwMCwgMTgwMCwgMjcwMCBPaG1zLlxuIiwKLQkJCQkJYXJnLCBwZGF0YS0+cGluc1twaW5dLm5hbWUsIHBpbik7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0KLQkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCBqKzEsCi0JCQkJQkNNMjgxWFhfUElOX1NISUZUKEkyQywgUFVMTF9VUF9TVFIpLAotCQkJCUJDTTI4MVhYX1BJTl9NQVNLKEkyQywgUFVMTF9VUF9TVFIpKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgUElOX0NPTkZJR19CSUFTX0RJU0FCTEU6Ci0JCQliY20yODF4eF9waW5fdXBkYXRlKHZhbCwgbWFzaywgMCwKLQkJCQlCQ00yODFYWF9QSU5fU0hJRlQoSTJDLCBQVUxMX1VQX1NUUiksCi0JCQkJQkNNMjgxWFhfUElOX01BU0soSTJDLCBQVUxMX1VQX1NUUikpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQSU5fQ09ORklHX1NMRVdfUkFURToKLQkJCWFyZyA9IChhcmcgPj0gMSA/IDEgOiAwKTsKLQkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCBhcmcsCi0JCQkJQkNNMjgxWFhfUElOX1NISUZUKEkyQywgU0xFVyksCi0JCQkJQkNNMjgxWFhfUElOX01BU0soSTJDLCBTTEVXKSk7Ci0JCQlicmVhazsKLQotCQljYXNlIFBJTl9DT05GSUdfSU5QVVRfRU5BQkxFOgotCQkJLyogaW52ZXJzZWQgc2luY2UgcmVnaXN0ZXIgaXMgZm9yIGlucHV0IF9kaXNhYmxlXyAqLwotCQkJYXJnID0gKGFyZyA+PSAxID8gMCA6IDEpOwotCQkJYmNtMjgxeHhfcGluX3VwZGF0ZSh2YWwsIG1hc2ssIGFyZywKLQkJCQlCQ00yODFYWF9QSU5fU0hJRlQoSTJDLCBJTlBVVF9ESVMpLAotCQkJCUJDTTI4MVhYX1BJTl9NQVNLKEkyQywgSU5QVVRfRElTKSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZGV2X2VycihwY3RsZGV2LT5kZXYsCi0JCQkJIlVucmVjb2duaXplZCBwaW4gY29uZmlnICVkIGZvciBwaW4gJXMgKCVkKS5cbiIsCi0JCQkJcGFyYW0sIHBkYXRhLT5waW5zW3Bpbl0ubmFtZSwgcGluKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCX0gLyogc3dpdGNoIGNvbmZpZyAqLwotCX0gLyogZm9yIGVhY2ggY29uZmlnICovCi0KLQlyZXR1cm4gMDsKLX0KLQotLyogR29lcyB0aHJvdWdoIHRoZSBjb25maWdzIGFuZCB1cGRhdGUgcmVnaXN0ZXIgdmFsL21hc2sgKi8KLXN0YXRpYyBpbnQgYmNtMjgxeHhfaGRtaV9waW5fdXBkYXRlKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJCQkgICAgdW5zaWduZWQgcGluLAotCQkJCSAgICB1bnNpZ25lZCBsb25nICpjb25maWdzLAotCQkJCSAgICB1bnNpZ25lZCBudW1fY29uZmlncywKLQkJCQkgICAgdTMyICp2YWwsCi0JCQkJICAgIHUzMiAqbWFzaykKLXsKLQlzdHJ1Y3QgYmNtMjgxeHhfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwotCWludCBpOwotCWVudW0gcGluX2NvbmZpZ19wYXJhbSBwYXJhbTsKLQl1MTYgYXJnOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9jb25maWdzOyBpKyspIHsKLQkJcGFyYW0gPSBwaW5jb25mX3RvX2NvbmZpZ19wYXJhbShjb25maWdzW2ldKTsKLQkJYXJnID0gcGluY29uZl90b19jb25maWdfYXJndW1lbnQoY29uZmlnc1tpXSk7Ci0KLQkJc3dpdGNoIChwYXJhbSkgewotCQljYXNlIFBJTl9DT05GSUdfU0xFV19SQVRFOgotCQkJYXJnID0gKGFyZyA+PSAxID8gMSA6IDApOwotCQkJYmNtMjgxeHhfcGluX3VwZGF0ZSh2YWwsIG1hc2ssIGFyZywKLQkJCQlCQ00yODFYWF9QSU5fU0hJRlQoSERNSSwgTU9ERSksCi0JCQkJQkNNMjgxWFhfUElOX01BU0soSERNSSwgTU9ERSkpOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSBQSU5fQ09ORklHX0lOUFVUX0VOQUJMRToKLQkJCS8qIGludmVyc2VkIHNpbmNlIHJlZ2lzdGVyIGlzIGZvciBpbnB1dCBfZGlzYWJsZV8gKi8KLQkJCWFyZyA9IChhcmcgPj0gMSA/IDAgOiAxKTsKLQkJCWJjbTI4MXh4X3Bpbl91cGRhdGUodmFsLCBtYXNrLCBhcmcsCi0JCQkJQkNNMjgxWFhfUElOX1NISUZUKEhETUksIElOUFVUX0RJUyksCi0JCQkJQkNNMjgxWFhfUElOX01BU0soSERNSSwgSU5QVVRfRElTKSk7Ci0JCQlicmVhazsKLQotCQlkZWZhdWx0OgotCQkJZGV2X2VycihwY3RsZGV2LT5kZXYsCi0JCQkJIlVucmVjb2duaXplZCBwaW4gY29uZmlnICVkIGZvciBwaW4gJXMgKCVkKS5cbiIsCi0JCQkJcGFyYW0sIHBkYXRhLT5waW5zW3Bpbl0ubmFtZSwgcGluKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCX0gLyogc3dpdGNoIGNvbmZpZyAqLwotCX0gLyogZm9yIGVhY2ggY29uZmlnICovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiY20yODF4eF9waW5jdHJsX3Bpbl9jb25maWdfc2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJCQkJICAgdW5zaWduZWQgcGluLAotCQkJCQkgICB1bnNpZ25lZCBsb25nICpjb25maWdzLAotCQkJCQkgICB1bnNpZ25lZCBudW1fY29uZmlncykKLXsKLQlzdHJ1Y3QgYmNtMjgxeHhfcGluY3RybF9kYXRhICpwZGF0YSA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwotCWVudW0gYmNtMjgxeHhfcGluX3R5cGUgcGluX3R5cGU7Ci0JdTMyIG9mZnNldCA9IDQgKiBwaW47Ci0JdTMyIGNmZ192YWwsIGNmZ19tYXNrOwotCWludCByYzsKLQotCWNmZ192YWwgPSAwOwotCWNmZ19tYXNrID0gMDsKLQlwaW5fdHlwZSA9IHBpbl90eXBlX2dldChwY3RsZGV2LCBwaW4pOwotCi0JLyogRGlmZmVyZW50IHBpbnMgaGF2ZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBvcHRpb25zICovCi0Jc3dpdGNoIChwaW5fdHlwZSkgewotCWNhc2UgQkNNMjgxWFhfUElOX1RZUEVfU1REOgotCQlyYyA9IGJjbTI4MXh4X3N0ZF9waW5fdXBkYXRlKHBjdGxkZXYsIHBpbiwgY29uZmlncywKLQkJCW51bV9jb25maWdzLCAmY2ZnX3ZhbCwgJmNmZ19tYXNrKTsKLQkJYnJlYWs7Ci0KLQljYXNlIEJDTTI4MVhYX1BJTl9UWVBFX0kyQzoKLQkJcmMgPSBiY20yODF4eF9pMmNfcGluX3VwZGF0ZShwY3RsZGV2LCBwaW4sIGNvbmZpZ3MsCi0JCQludW1fY29uZmlncywgJmNmZ192YWwsICZjZmdfbWFzayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBCQ00yODFYWF9QSU5fVFlQRV9IRE1JOgotCQlyYyA9IGJjbTI4MXh4X2hkbWlfcGluX3VwZGF0ZShwY3RsZGV2LCBwaW4sIGNvbmZpZ3MsCi0JCQludW1fY29uZmlncywgJmNmZ192YWwsICZjZmdfbWFzayk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZGV2X2VycihwY3RsZGV2LT5kZXYsICJVbmtub3duIHBpbiB0eXBlIGZvciBwaW4gJXMgKCVkKS5cbiIsCi0JCQlwZGF0YS0+cGluc1twaW5dLm5hbWUsIHBpbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCi0JfSAvKiBzd2l0Y2ggcGluIHR5cGUgKi8KLQotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JZGV2X2RiZyhwY3RsZGV2LT5kZXYsCi0JCSIlcygpOiBTZXQgcGluICVzICglZCkgd2l0aCBjb25maWcgMHgleCwgbWFzayAweCV4XG4iLAotCQlfX2Z1bmNfXywgcGRhdGEtPnBpbnNbcGluXS5uYW1lLCBwaW4sIGNmZ192YWwsIGNmZ19tYXNrKTsKLQotCXJjID0gcmVnbWFwX3VwZGF0ZV9iaXRzKHBkYXRhLT5yZWdtYXAsIG9mZnNldCwgY2ZnX21hc2ssIGNmZ192YWwpOwotCWlmIChyYykgewotCQlkZXZfZXJyKHBjdGxkZXYtPmRldiwKLQkJCSJFcnJvciB1cGRhdGluZyByZWdpc3RlciBmb3IgcGluICVzICglZCkuXG4iLAotCQkJcGRhdGEtPnBpbnNbcGluXS5uYW1lLCBwaW4pOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGluY29uZl9vcHMgYmNtMjgxeHhfcGluY3RybF9waW5jb25mX29wcyA9IHsKLQkucGluX2NvbmZpZ19nZXQgPSBiY20yODF4eF9waW5jdHJsX3Bpbl9jb25maWdfZ2V0LAotCS5waW5fY29uZmlnX3NldCA9IGJjbTI4MXh4X3BpbmN0cmxfcGluX2NvbmZpZ19zZXQsCi19OwotCi1zdGF0aWMgc3RydWN0IHBpbmN0cmxfZGVzYyBiY20yODF4eF9waW5jdHJsX2Rlc2MgPSB7Ci0JLyogbmFtZSwgcGlucywgbnBpbnMgbWVtYmVycyBpbml0aWFsaXplZCBpbiBwcm9iZSBmdW5jdGlvbiAqLwotCS5wY3Rsb3BzID0gJmJjbTI4MXh4X3BpbmN0cmxfb3BzLAotCS5wbXhvcHMgPSAmYmNtMjgxeHhfcGluY3RybF9waW5tdXhfb3BzLAotCS5jb25mb3BzID0gJmJjbTI4MXh4X3BpbmN0cmxfcGluY29uZl9vcHMsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBiY20yODF4eF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IGJjbTI4MXh4X3BpbmN0cmxfZGF0YSAqcGRhdGEgPSAmYmNtMjgxeHhfcGluY3RybDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKLQlzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGw7Ci0KLQkvKiBTbyBmYXIgV2UgY2FuIGFzc3VtZSB0aGVyZSBpcyBvbmx5IDEgYmFuayBvZiByZWdpc3RlcnMgKi8KLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCXBkYXRhLT5yZWdfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwotCWlmIChJU19FUlIocGRhdGEtPnJlZ19iYXNlKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gaW9yZW1hcCBNRU0gcmVzb3VyY2VcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBkeW5hbWljIHBhcnQgb2YgcGluY3RybF9kZXNjICovCi0JcGRhdGEtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pbygmcGRldi0+ZGV2LCBwZGF0YS0+cmVnX2Jhc2UsCi0JCSZiY20yODF4eF9waW5jdHJsX3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIocGRhdGEtPnJlZ21hcCkpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiUmVnbWFwIE1NSU8gaW5pdCBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JYmNtMjgxeHhfcGluY3RybF9kZXNjLm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKLQliY20yODF4eF9waW5jdHJsX2Rlc2MucGlucyA9IGJjbTI4MXh4X3BpbmN0cmwucGluczsKLQliY20yODF4eF9waW5jdHJsX2Rlc2MubnBpbnMgPSBiY20yODF4eF9waW5jdHJsLm5waW5zOwotCi0JcGN0bCA9IHBpbmN0cmxfcmVnaXN0ZXIoJmJjbTI4MXh4X3BpbmN0cmxfZGVzYywKLQkJCQkmcGRldi0+ZGV2LAotCQkJCXBkYXRhKTsKLQlpZiAoIXBjdGwpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHBpbmN0cmxcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYmNtMjgxeHhfcGluY3RybF9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY20xMTM1MS1waW5jdHJsIiwgfSwKLQl7IH0sCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiY20yODF4eF9waW5jdHJsX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJiY20yODF4eC1waW5jdHJsIiwKLQkJLm9mX21hdGNoX3RhYmxlID0gYmNtMjgxeHhfcGluY3RybF9vZl9tYXRjaCwKLQl9LAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcl9wcm9iZShiY20yODF4eF9waW5jdHJsX2RyaXZlciwgYmNtMjgxeHhfcGluY3RybF9wcm9iZSk7Ci0KLU1PRFVMRV9BVVRIT1IoIkJyb2FkY29tIENvcnBvcmF0aW9uIDxiY20ta2VybmVsLWZlZWRiYWNrLWxpc3RAYnJvYWRjb20uY29tPiIpOwotTU9EVUxFX0FVVEhPUigiU2hlcm1hbiBZaW4gPHN5aW5AYnJvYWRjb20uY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJCcm9hZGNvbSBCQ00yODF4eCBwaW5jdHJsIGRyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYmNtMjgzNS5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtYmNtMjgzNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWE4YTNmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWJjbTI4MzUuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNzIgKzAsMCBAQAotLyoKLSAqIERyaXZlciBmb3IgQnJvYWRjb20gQkNNMjgzNSBHUElPIHVuaXQgKHBpbmN0cmwgKyBHUElPKQotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBDaHJpcyBCb290LCBTaW1vbiBBcmxvdHQsIFN0ZXBoZW4gV2FycmVuCi0gKgotICogVGhpcyBkcml2ZXIgaXMgaW5zcGlyZWQgYnk6Ci0gKiBwaW5jdHJsLW5vbWFkaWsuYywgcGxlYXNlIHNlZSBvcmlnaW5hbCBmaWxlIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24KLSAqIHBpbmN0cmwtdGVncmEuYywgcGxlYXNlIHNlZSBvcmlnaW5hbCBmaWxlIGZvciBjb3B5cmlnaHQgaW5mb3JtYXRpb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxZGVzYy5oPgotI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9vZi5oPgotI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L3BpbmN0cmwvY29uc3VtZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL21hY2hpbmUuaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmNvbmYuaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3BpbmN0cmwuaD4KLSNpbmNsdWRlIDxsaW51eC9waW5jdHJsL3Bpbm11eC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2RlZmluZSBNT0RVTEVfTkFNRSAicGluY3RybC1iY20yODM1IgotI2RlZmluZSBCQ00yODM1X05VTV9HUElPUyA1NAotI2RlZmluZSBCQ00yODM1X05VTV9CQU5LUyAyCi0KLSNkZWZpbmUgQkNNMjgzNV9QSU5fQklUTUFQX1NaIFwKLQlESVZfUk9VTkRfVVAoQkNNMjgzNV9OVU1fR1BJT1MsIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpCi0KLS8qIEdQSU8gcmVnaXN0ZXIgb2Zmc2V0cyAqLwotI2RlZmluZSBHUEZTRUwwCQkweDAJLyogRnVuY3Rpb24gU2VsZWN0ICovCi0jZGVmaW5lIEdQU0VUMAkJMHgxYwkvKiBQaW4gT3V0cHV0IFNldCAqLwotI2RlZmluZSBHUENMUjAJCTB4MjgJLyogUGluIE91dHB1dCBDbGVhciAqLwotI2RlZmluZSBHUExFVjAJCTB4MzQJLyogUGluIExldmVsICovCi0jZGVmaW5lIEdQRURTMAkJMHg0MAkvKiBQaW4gRXZlbnQgRGV0ZWN0IFN0YXR1cyAqLwotI2RlZmluZSBHUFJFTjAJCTB4NGMJLyogUGluIFJpc2luZyBFZGdlIERldGVjdCBFbmFibGUgKi8KLSNkZWZpbmUgR1BGRU4wCQkweDU4CS8qIFBpbiBGYWxsaW5nIEVkZ2UgRGV0ZWN0IEVuYWJsZSAqLwotI2RlZmluZSBHUEhFTjAJCTB4NjQJLyogUGluIEhpZ2ggRGV0ZWN0IEVuYWJsZSAqLwotI2RlZmluZSBHUExFTjAJCTB4NzAJLyogUGluIExvdyBEZXRlY3QgRW5hYmxlICovCi0jZGVmaW5lIEdQQVJFTjAJCTB4N2MJLyogUGluIEFzeW5jIFJpc2luZyBFZGdlIERldGVjdCAqLwotI2RlZmluZSBHUEFGRU4wCQkweDg4CS8qIFBpbiBBc3luYyBGYWxsaW5nIEVkZ2UgRGV0ZWN0ICovCi0jZGVmaW5lIEdQUFVECQkweDk0CS8qIFBpbiBQdWxsLXVwL2Rvd24gRW5hYmxlICovCi0jZGVmaW5lIEdQUFVEQ0xLMAkweDk4CS8qIFBpbiBQdWxsLXVwL2Rvd24gRW5hYmxlIENsb2NrICovCi0KLSNkZWZpbmUgRlNFTF9SRUcocCkJCShHUEZTRUwwICsgKCgocCkgLyAxMCkgKiA0KSkKLSNkZWZpbmUgRlNFTF9TSElGVChwKQkJKCgocCkgJSAxMCkgKiAzKQotI2RlZmluZSBHUElPX1JFR19PRkZTRVQocCkJKChwKSAvIDMyKQotI2RlZmluZSBHUElPX1JFR19TSElGVChwKQkoKHApICUgMzIpCi0KLWVudW0gYmNtMjgzNV9waW5jb25mX3BhcmFtIHsKLQkvKiBhcmd1bWVudDogYmNtMjgzNV9waW5jb25mX3B1bGwgKi8KLQlCQ00yODM1X1BJTkNPTkZfUEFSQU1fUFVMTCwKLX07Ci0KLWVudW0gYmNtMjgzNV9waW5jb25mX3B1bGwgewotCUJDTTI4MzVfUElOQ09ORklHX1BVTExfTk9ORSwKLQlCQ00yODM1X1BJTkNPTkZJR19QVUxMX0RPV04sCi0JQkNNMjgzNV9QSU5DT05GSUdfUFVMTF9VUCwKLX07Ci0KLSNkZWZpbmUgQkNNMjgzNV9QSU5DT05GX1BBQ0soX3BhcmFtXywgX2FyZ18pICgoX3BhcmFtXykgPDwgMTYgfCAoX2FyZ18pKQotI2RlZmluZSBCQ00yODM1X1BJTkNPTkZfVU5QQUNLX1BBUkFNKF9jb25mXykgKChfY29uZl8pID4+IDE2KQotI2RlZmluZSBCQ00yODM1X1BJTkNPTkZfVU5QQUNLX0FSRyhfY29uZl8pICgoX2NvbmZfKSAmIDB4ZmZmZikKLQotc3RydWN0IGJjbTI4MzVfZ3Bpb19pcnFkYXRhIHsKLQlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYzsKLQlpbnQgYmFuazsKLX07Ci0KLXN0cnVjdCBiY20yODM1X3BpbmN0cmwgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQl2b2lkIF9faW9tZW0gKmJhc2U7Ci0JaW50IGlycVtCQ00yODM1X05VTV9CQU5LU107Ci0KLQkvKiBub3RlOiBsb2NraW5nIGFzc3VtZXMgZWFjaCBiYW5rIHdpbGwgaGF2ZSBpdHMgb3duIHVuc2lnbmVkIGxvbmcgKi8KLQl1bnNpZ25lZCBsb25nIGVuYWJsZWRfaXJxX21hcFtCQ00yODM1X05VTV9CQU5LU107Ci0JdW5zaWduZWQgaW50IGlycV90eXBlW0JDTTI4MzVfTlVNX0dQSU9TXTsKLQotCXN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bF9kZXY7Ci0Jc3RydWN0IGlycV9kb21haW4gKmlycV9kb21haW47Ci0Jc3RydWN0IGdwaW9fY2hpcCBncGlvX2NoaXA7Ci0Jc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSBncGlvX3JhbmdlOwotCi0Jc3RydWN0IGJjbTI4MzVfZ3Bpb19pcnFkYXRhIGlycV9kYXRhW0JDTTI4MzVfTlVNX0JBTktTXTsKLQlzcGlubG9ja190IGlycV9sb2NrW0JDTTI4MzVfTlVNX0JBTktTXTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgZ3Bpb19sb2NrX2NsYXNzOwotCi0vKiBwaW5zIGFyZSBqdXN0IG5hbWVkIEdQSU8wLi5HUElPNTMgKi8KLSNkZWZpbmUgQkNNMjgzNV9HUElPX1BJTihhKSBQSU5DVFJMX1BJTihhLCAiZ3BpbyIgI2EpCi1zdGF0aWMgc3RydWN0IHBpbmN0cmxfcGluX2Rlc2MgYmNtMjgzNV9ncGlvX3BpbnNbXSA9IHsKLQlCQ00yODM1X0dQSU9fUElOKDApLAotCUJDTTI4MzVfR1BJT19QSU4oMSksCi0JQkNNMjgzNV9HUElPX1BJTigyKSwKLQlCQ00yODM1X0dQSU9fUElOKDMpLAotCUJDTTI4MzVfR1BJT19QSU4oNCksCi0JQkNNMjgzNV9HUElPX1BJTig1KSwKLQlCQ00yODM1X0dQSU9fUElOKDYpLAotCUJDTTI4MzVfR1BJT19QSU4oNyksCi0JQkNNMjgzNV9HUElPX1BJTig4KSwKLQlCQ00yODM1X0dQSU9fUElOKDkpLAotCUJDTTI4MzVfR1BJT19QSU4oMTApLAotCUJDTTI4MzVfR1BJT19QSU4oMTEpLAotCUJDTTI4MzVfR1BJT19QSU4oMTIpLAotCUJDTTI4MzVfR1BJT19QSU4oMTMpLAotCUJDTTI4MzVfR1BJT19QSU4oMTQpLAotCUJDTTI4MzVfR1BJT19QSU4oMTUpLAotCUJDTTI4MzVfR1BJT19QSU4oMTYpLAotCUJDTTI4MzVfR1BJT19QSU4oMTcpLAotCUJDTTI4MzVfR1BJT19QSU4oMTgpLAotCUJDTTI4MzVfR1BJT19QSU4oMTkpLAotCUJDTTI4MzVfR1BJT19QSU4oMjApLAotCUJDTTI4MzVfR1BJT19QSU4oMjEpLAotCUJDTTI4MzVfR1BJT19QSU4oMjIpLAotCUJDTTI4MzVfR1BJT19QSU4oMjMpLAotCUJDTTI4MzVfR1BJT19QSU4oMjQpLAotCUJDTTI4MzVfR1BJT19QSU4oMjUpLAotCUJDTTI4MzVfR1BJT19QSU4oMjYpLAotCUJDTTI4MzVfR1BJT19QSU4oMjcpLAotCUJDTTI4MzVfR1BJT19QSU4oMjgpLAotCUJDTTI4MzVfR1BJT19QSU4oMjkpLAotCUJDTTI4MzVfR1BJT19QSU4oMzApLAotCUJDTTI4MzVfR1BJT19QSU4oMzEpLAotCUJDTTI4MzVfR1BJT19QSU4oMzIpLAotCUJDTTI4MzVfR1BJT19QSU4oMzMpLAotCUJDTTI4MzVfR1BJT19QSU4oMzQpLAotCUJDTTI4MzVfR1BJT19QSU4oMzUpLAotCUJDTTI4MzVfR1BJT19QSU4oMzYpLAotCUJDTTI4MzVfR1BJT19QSU4oMzcpLAotCUJDTTI4MzVfR1BJT19QSU4oMzgpLAotCUJDTTI4MzVfR1BJT19QSU4oMzkpLAotCUJDTTI4MzVfR1BJT19QSU4oNDApLAotCUJDTTI4MzVfR1BJT19QSU4oNDEpLAotCUJDTTI4MzVfR1BJT19QSU4oNDIpLAotCUJDTTI4MzVfR1BJT19QSU4oNDMpLAotCUJDTTI4MzVfR1BJT19QSU4oNDQpLAotCUJDTTI4MzVfR1BJT19QSU4oNDUpLAotCUJDTTI4MzVfR1BJT19QSU4oNDYpLAotCUJDTTI4MzVfR1BJT19QSU4oNDcpLAotCUJDTTI4MzVfR1BJT19QSU4oNDgpLAotCUJDTTI4MzVfR1BJT19QSU4oNDkpLAotCUJDTTI4MzVfR1BJT19QSU4oNTApLAotCUJDTTI4MzVfR1BJT19QSU4oNTEpLAotCUJDTTI4MzVfR1BJT19QSU4oNTIpLAotCUJDTTI4MzVfR1BJT19QSU4oNTMpLAotfTsKLQotLyogb25lIHBpbiBwZXIgZ3JvdXAgKi8KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmNtMjgzNV9ncGlvX2dyb3Vwc1tdID0gewotCSJncGlvMCIsCi0JImdwaW8xIiwKLQkiZ3BpbzIiLAotCSJncGlvMyIsCi0JImdwaW80IiwKLQkiZ3BpbzUiLAotCSJncGlvNiIsCi0JImdwaW83IiwKLQkiZ3BpbzgiLAotCSJncGlvOSIsCi0JImdwaW8xMCIsCi0JImdwaW8xMSIsCi0JImdwaW8xMiIsCi0JImdwaW8xMyIsCi0JImdwaW8xNCIsCi0JImdwaW8xNSIsCi0JImdwaW8xNiIsCi0JImdwaW8xNyIsCi0JImdwaW8xOCIsCi0JImdwaW8xOSIsCi0JImdwaW8yMCIsCi0JImdwaW8yMSIsCi0JImdwaW8yMiIsCi0JImdwaW8yMyIsCi0JImdwaW8yNCIsCi0JImdwaW8yNSIsCi0JImdwaW8yNiIsCi0JImdwaW8yNyIsCi0JImdwaW8yOCIsCi0JImdwaW8yOSIsCi0JImdwaW8zMCIsCi0JImdwaW8zMSIsCi0JImdwaW8zMiIsCi0JImdwaW8zMyIsCi0JImdwaW8zNCIsCi0JImdwaW8zNSIsCi0JImdwaW8zNiIsCi0JImdwaW8zNyIsCi0JImdwaW8zOCIsCi0JImdwaW8zOSIsCi0JImdwaW80MCIsCi0JImdwaW80MSIsCi0JImdwaW80MiIsCi0JImdwaW80MyIsCi0JImdwaW80NCIsCi0JImdwaW80NSIsCi0JImdwaW80NiIsCi0JImdwaW80NyIsCi0JImdwaW80OCIsCi0JImdwaW80OSIsCi0JImdwaW81MCIsCi0JImdwaW81MSIsCi0JImdwaW81MiIsCi0JImdwaW81MyIsCi19OwotCi1lbnVtIGJjbTI4MzVfZnNlbCB7Ci0JQkNNMjgzNV9GU0VMX0dQSU9fSU4gPSAwLAotCUJDTTI4MzVfRlNFTF9HUElPX09VVCA9IDEsCi0JQkNNMjgzNV9GU0VMX0FMVDAgPSA0LAotCUJDTTI4MzVfRlNFTF9BTFQxID0gNSwKLQlCQ00yODM1X0ZTRUxfQUxUMiA9IDYsCi0JQkNNMjgzNV9GU0VMX0FMVDMgPSA3LAotCUJDTTI4MzVfRlNFTF9BTFQ0ID0gMywKLQlCQ00yODM1X0ZTRUxfQUxUNSA9IDIsCi0JQkNNMjgzNV9GU0VMX0NPVU5UID0gOCwKLQlCQ00yODM1X0ZTRUxfTUFTSyA9IDB4NywKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYmNtMjgzNV9mdW5jdGlvbnNbQkNNMjgzNV9GU0VMX0NPVU5UXSA9IHsKLQlbQkNNMjgzNV9GU0VMX0dQSU9fSU5dID0gImdwaW9faW4iLAotCVtCQ00yODM1X0ZTRUxfR1BJT19PVVRdID0gImdwaW9fb3V0IiwKLQlbQkNNMjgzNV9GU0VMX0FMVDBdID0gImFsdDAiLAotCVtCQ00yODM1X0ZTRUxfQUxUMV0gPSAiYWx0MSIsCi0JW0JDTTI4MzVfRlNFTF9BTFQyXSA9ICJhbHQyIiwKLQlbQkNNMjgzNV9GU0VMX0FMVDNdID0gImFsdDMiLAotCVtCQ00yODM1X0ZTRUxfQUxUNF0gPSAiYWx0NCIsCi0JW0JDTTI4MzVfRlNFTF9BTFQ1XSA9ICJhbHQ1IiwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaXJxX3R5cGVfbmFtZXNbXSA9IHsKLQlbSVJRX1RZUEVfTk9ORV0gPSAibm9uZSIsCi0JW0lSUV9UWVBFX0VER0VfUklTSU5HXSA9ICJlZGdlLXJpc2luZyIsCi0JW0lSUV9UWVBFX0VER0VfRkFMTElOR10gPSAiZWRnZS1mYWxsaW5nIiwKLQlbSVJRX1RZUEVfRURHRV9CT1RIXSA9ICJlZGdlLWJvdGgiLAotCVtJUlFfVFlQRV9MRVZFTF9ISUdIXSA9ICJsZXZlbC1oaWdoIiwKLQlbSVJRX1RZUEVfTEVWRUxfTE9XXSA9ICJsZXZlbC1sb3ciLAotfTsKLQotc3RhdGljIGlubGluZSB1MzIgYmNtMjgzNV9ncGlvX3JkKHN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjLCB1bnNpZ25lZCByZWcpCi17Ci0JcmV0dXJuIHJlYWRsKHBjLT5iYXNlICsgcmVnKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGJjbTI4MzVfZ3Bpb193cihzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYywgdW5zaWduZWQgcmVnLAotCQl1MzIgdmFsKQotewotCXdyaXRlbCh2YWwsIHBjLT5iYXNlICsgcmVnKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmNtMjgzNV9ncGlvX2dldF9iaXQoc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMsIHVuc2lnbmVkIHJlZywKLQkJdW5zaWduZWQgYml0KQotewotCXJlZyArPSBHUElPX1JFR19PRkZTRVQoYml0KSAqIDQ7Ci0JcmV0dXJuIChiY20yODM1X2dwaW9fcmQocGMsIHJlZykgPj4gR1BJT19SRUdfU0hJRlQoYml0KSkgJiAxOwotfQotCi0vKiBub3RlIE5PVCBhIHJlYWQvbW9kaWZ5L3dyaXRlIGN5Y2xlICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYmNtMjgzNV9ncGlvX3NldF9iaXQoc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMsCi0JCXVuc2lnbmVkIHJlZywgdW5zaWduZWQgYml0KQotewotCXJlZyArPSBHUElPX1JFR19PRkZTRVQoYml0KSAqIDQ7Ci0JYmNtMjgzNV9ncGlvX3dyKHBjLCByZWcsIEJJVChHUElPX1JFR19TSElGVChiaXQpKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgZW51bSBiY20yODM1X2ZzZWwgYmNtMjgzNV9waW5jdHJsX2ZzZWxfZ2V0KAotCQlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYywgdW5zaWduZWQgcGluKQotewotCXUzMiB2YWwgPSBiY20yODM1X2dwaW9fcmQocGMsIEZTRUxfUkVHKHBpbikpOwotCWVudW0gYmNtMjgzNV9mc2VsIHN0YXR1cyA9ICh2YWwgPj4gRlNFTF9TSElGVChwaW4pKSAmIEJDTTI4MzVfRlNFTF9NQVNLOwotCi0JZGV2X2RiZyhwYy0+ZGV2LCAiZ2V0ICUwOHggKCV1ID0+ICVzKVxuIiwgdmFsLCBwaW4sCi0JCQliY20yODM1X2Z1bmN0aW9uc1tzdGF0dXNdKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBiY20yODM1X3BpbmN0cmxfZnNlbF9zZXQoCi0JCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjLCB1bnNpZ25lZCBwaW4sCi0JCWVudW0gYmNtMjgzNV9mc2VsIGZzZWwpCi17Ci0JdTMyIHZhbCA9IGJjbTI4MzVfZ3Bpb19yZChwYywgRlNFTF9SRUcocGluKSk7Ci0JZW51bSBiY20yODM1X2ZzZWwgY3VyID0gKHZhbCA+PiBGU0VMX1NISUZUKHBpbikpICYgQkNNMjgzNV9GU0VMX01BU0s7Ci0KLQlkZXZfZGJnKHBjLT5kZXYsICJyZWFkICUwOHggKCV1ID0+ICVzKVxuIiwgdmFsLCBwaW4sCi0JCQliY20yODM1X2Z1bmN0aW9uc1tjdXJdKTsKLQotCWlmIChjdXIgPT0gZnNlbCkKLQkJcmV0dXJuOwotCi0JaWYgKGN1ciAhPSBCQ00yODM1X0ZTRUxfR1BJT19JTiAmJiBmc2VsICE9IEJDTTI4MzVfRlNFTF9HUElPX0lOKSB7Ci0JCS8qIGFsd2F5cyB0cmFuc2l0aW9uIHRocm91Z2ggR1BJT19JTiAqLwotCQl2YWwgJj0gfihCQ00yODM1X0ZTRUxfTUFTSyA8PCBGU0VMX1NISUZUKHBpbikpOwotCQl2YWwgfD0gQkNNMjgzNV9GU0VMX0dQSU9fSU4gPDwgRlNFTF9TSElGVChwaW4pOwotCi0JCWRldl9kYmcocGMtPmRldiwgInRyYW5zICUwOHggKCV1IDw9ICVzKVxuIiwgdmFsLCBwaW4sCi0JCQkJYmNtMjgzNV9mdW5jdGlvbnNbQkNNMjgzNV9GU0VMX0dQSU9fSU5dKTsKLQkJYmNtMjgzNV9ncGlvX3dyKHBjLCBGU0VMX1JFRyhwaW4pLCB2YWwpOwotCX0KLQotCXZhbCAmPSB+KEJDTTI4MzVfRlNFTF9NQVNLIDw8IEZTRUxfU0hJRlQocGluKSk7Ci0JdmFsIHw9IGZzZWwgPDwgRlNFTF9TSElGVChwaW4pOwotCi0JZGV2X2RiZyhwYy0+ZGV2LCAid3JpdGUgJTA4eCAoJXUgPD0gJXMpXG4iLCB2YWwsIHBpbiwKLQkJCWJjbTI4MzVfZnVuY3Rpb25zW2ZzZWxdKTsKLQliY20yODM1X2dwaW9fd3IocGMsIEZTRUxfUkVHKHBpbiksIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtMjgzNV9ncGlvX3JlcXVlc3Qoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBwaW5jdHJsX3JlcXVlc3RfZ3BpbyhjaGlwLT5iYXNlICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgYmNtMjgzNV9ncGlvX2ZyZWUoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXBpbmN0cmxfZnJlZV9ncGlvKGNoaXAtPmJhc2UgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW50IGJjbTI4MzVfZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBwaW5jdHJsX2dwaW9fZGlyZWN0aW9uX2lucHV0KGNoaXAtPmJhc2UgKyBvZmZzZXQpOwotfQotCi1zdGF0aWMgaW50IGJjbTI4MzVfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjID0gZGV2X2dldF9kcnZkYXRhKGNoaXAtPmRldik7Ci0KLQlyZXR1cm4gYmNtMjgzNV9ncGlvX2dldF9iaXQocGMsIEdQTEVWMCwgb2Zmc2V0KTsKLX0KLQotc3RhdGljIGludCBiY20yODM1X2dwaW9fZGlyZWN0aW9uX291dHB1dChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLAotCQl1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlyZXR1cm4gcGluY3RybF9ncGlvX2RpcmVjdGlvbl9vdXRwdXQoY2hpcC0+YmFzZSArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbTI4MzVfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMgPSBkZXZfZ2V0X2RydmRhdGEoY2hpcC0+ZGV2KTsKLQotCWJjbTI4MzVfZ3Bpb19zZXRfYml0KHBjLCB2YWx1ZSA/IEdQU0VUMCA6IEdQQ0xSMCwgb2Zmc2V0KTsKLX0KLQotc3RhdGljIGludCBiY20yODM1X2dwaW9fdG9faXJxKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IGRldl9nZXRfZHJ2ZGF0YShjaGlwLT5kZXYpOwotCi0JcmV0dXJuIGlycV9saW5lYXJfcmV2bWFwKHBjLT5pcnFfZG9tYWluLCBvZmZzZXQpOwotfQotCi1zdGF0aWMgc3RydWN0IGdwaW9fY2hpcCBiY20yODM1X2dwaW9fY2hpcCA9IHsKLQkubGFiZWwgPSBNT0RVTEVfTkFNRSwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkucmVxdWVzdCA9IGJjbTI4MzVfZ3Bpb19yZXF1ZXN0LAotCS5mcmVlID0gYmNtMjgzNV9ncGlvX2ZyZWUsCi0JLmRpcmVjdGlvbl9pbnB1dCA9IGJjbTI4MzVfZ3Bpb19kaXJlY3Rpb25faW5wdXQsCi0JLmRpcmVjdGlvbl9vdXRwdXQgPSBiY20yODM1X2dwaW9fZGlyZWN0aW9uX291dHB1dCwKLQkuZ2V0ID0gYmNtMjgzNV9ncGlvX2dldCwKLQkuc2V0ID0gYmNtMjgzNV9ncGlvX3NldCwKLQkudG9faXJxID0gYmNtMjgzNV9ncGlvX3RvX2lycSwKLQkuYmFzZSA9IC0xLAotCS5uZ3BpbyA9IEJDTTI4MzVfTlVNX0dQSU9TLAotCS5jYW5fc2xlZXAgPSBmYWxzZSwKLX07Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBiY20yODM1X2dwaW9faXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQotewotCXN0cnVjdCBiY20yODM1X2dwaW9faXJxZGF0YSAqaXJxZGF0YSA9IGRldl9pZDsKLQlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IGlycWRhdGEtPnBjOwotCWludCBiYW5rID0gaXJxZGF0YS0+YmFuazsKLQl1bnNpZ25lZCBsb25nIGV2ZW50czsKLQl1bnNpZ25lZCBvZmZzZXQ7Ci0JdW5zaWduZWQgZ3BpbzsKLQl1bnNpZ25lZCBpbnQgdHlwZTsKLQotCWV2ZW50cyA9IGJjbTI4MzVfZ3Bpb19yZChwYywgR1BFRFMwICsgYmFuayAqIDQpOwotCWV2ZW50cyAmPSBwYy0+ZW5hYmxlZF9pcnFfbWFwW2JhbmtdOwotCWZvcl9lYWNoX3NldF9iaXQob2Zmc2V0LCAmZXZlbnRzLCAzMikgewotCQlncGlvID0gKDMyICogYmFuaykgKyBvZmZzZXQ7Ci0JCXR5cGUgPSBwYy0+aXJxX3R5cGVbZ3Bpb107Ci0KLQkJLyogYWNrIGVkZ2UgdHJpZ2dlcmVkIElSUXMgaW1tZWRpYXRlbHkgKi8KLQkJaWYgKCEodHlwZSAmIElSUV9UWVBFX0xFVkVMX01BU0spKQotCQkJYmNtMjgzNV9ncGlvX3NldF9iaXQocGMsIEdQRURTMCwgZ3Bpbyk7Ci0KLQkJZ2VuZXJpY19oYW5kbGVfaXJxKGlycV9saW5lYXJfcmV2bWFwKHBjLT5pcnFfZG9tYWluLCBncGlvKSk7Ci0KLQkJLyogYWNrIGxldmVsIHRyaWdnZXJlZCBJUlEgYWZ0ZXIgaGFuZGxpbmcgdGhlbSAqLwotCQlpZiAodHlwZSAmIElSUV9UWVBFX0xFVkVMX01BU0spCi0JCQliY20yODM1X2dwaW9fc2V0X2JpdChwYywgR1BFRFMwLCBncGlvKTsKLQl9Ci0JcmV0dXJuIGV2ZW50cyA/IElSUV9IQU5ETEVEIDogSVJRX05PTkU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2JjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjLAotCXVuc2lnbmVkIHJlZywgdW5zaWduZWQgb2Zmc2V0LCBib29sIGVuYWJsZSkKLXsKLQl1MzIgdmFsdWU7Ci0JcmVnICs9IEdQSU9fUkVHX09GRlNFVChvZmZzZXQpICogNDsKLQl2YWx1ZSA9IGJjbTI4MzVfZ3Bpb19yZChwYywgcmVnKTsKLQlpZiAoZW5hYmxlKQotCQl2YWx1ZSB8PSBCSVQoR1BJT19SRUdfU0hJRlQob2Zmc2V0KSk7Ci0JZWxzZQotCQl2YWx1ZSAmPSB+KEJJVChHUElPX1JFR19TSElGVChvZmZzZXQpKSk7Ci0JYmNtMjgzNV9ncGlvX3dyKHBjLCByZWcsIHZhbHVlKTsKLX0KLQotLyogZmFzdCBwYXRoIGZvciBJUlEgaGFuZGxlciAqLwotc3RhdGljIHZvaWQgYmNtMjgzNV9ncGlvX2lycV9jb25maWcoc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMsCi0JdW5zaWduZWQgb2Zmc2V0LCBib29sIGVuYWJsZSkKLXsKLQlzd2l0Y2ggKHBjLT5pcnFfdHlwZVtvZmZzZXRdKSB7Ci0JY2FzZSBJUlFfVFlQRV9FREdFX1JJU0lORzoKLQkJX19iY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgR1BSRU4wLCBvZmZzZXQsIGVuYWJsZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6Ci0JCV9fYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIEdQRkVOMCwgb2Zmc2V0LCBlbmFibGUpOwotCQlicmVhazsKLQotCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgotCQlfX2JjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBHUFJFTjAsIG9mZnNldCwgZW5hYmxlKTsKLQkJX19iY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgR1BGRU4wLCBvZmZzZXQsIGVuYWJsZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgotCQlfX2JjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBHUEhFTjAsIG9mZnNldCwgZW5hYmxlKTsKLQkJYnJlYWs7Ci0KLQljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKLQkJX19iY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgR1BMRU4wLCBvZmZzZXQsIGVuYWJsZSk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHZvaWQgYmNtMjgzNV9ncGlvX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JdW5zaWduZWQgZ3BpbyA9IGlycWRfdG9faHdpcnEoZGF0YSk7Ci0JdW5zaWduZWQgb2Zmc2V0ID0gR1BJT19SRUdfU0hJRlQoZ3Bpbyk7Ci0JdW5zaWduZWQgYmFuayA9IEdQSU9fUkVHX09GRlNFVChncGlvKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBjLT5pcnFfbG9ja1tiYW5rXSwgZmxhZ3MpOwotCXNldF9iaXQob2Zmc2V0LCAmcGMtPmVuYWJsZWRfaXJxX21hcFtiYW5rXSk7Ci0JYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIGdwaW8sIHRydWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjLT5pcnFfbG9ja1tiYW5rXSwgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBiY20yODM1X2dwaW9faXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQotewotCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JdW5zaWduZWQgZ3BpbyA9IGlycWRfdG9faHdpcnEoZGF0YSk7Ci0JdW5zaWduZWQgb2Zmc2V0ID0gR1BJT19SRUdfU0hJRlQoZ3Bpbyk7Ci0JdW5zaWduZWQgYmFuayA9IEdQSU9fUkVHX09GRlNFVChncGlvKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBjLT5pcnFfbG9ja1tiYW5rXSwgZmxhZ3MpOwotCWJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBncGlvLCBmYWxzZSk7Ci0JY2xlYXJfYml0KG9mZnNldCwgJnBjLT5lbmFibGVkX2lycV9tYXBbYmFua10pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjLT5pcnFfbG9ja1tiYW5rXSwgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW50IF9fYmNtMjgzNV9ncGlvX2lycV9zZXRfdHlwZV9kaXNhYmxlZChzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYywKLQl1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGludCB0eXBlKQotewotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgSVJRX1RZUEVfTk9ORToKLQljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgotCWNhc2UgSVJRX1RZUEVfRURHRV9GQUxMSU5HOgotCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgotCWNhc2UgSVJRX1RZUEVfTEVWRUxfSElHSDoKLQljYXNlIElSUV9UWVBFX0xFVkVMX0xPVzoKLQkJcGMtPmlycV90eXBlW29mZnNldF0gPSB0eXBlOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogc2xvd2VyIHBhdGggZm9yIHJlY29uZmlndXJpbmcgSVJRIHR5cGUgKi8KLXN0YXRpYyBpbnQgX19iY20yODM1X2dwaW9faXJxX3NldF90eXBlX2VuYWJsZWQoc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMsCi0JdW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdHlwZSkKLXsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIElSUV9UWVBFX05PTkU6Ci0JCWlmIChwYy0+aXJxX3R5cGVbb2Zmc2V0XSAhPSB0eXBlKSB7Ci0JCQliY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgb2Zmc2V0LCBmYWxzZSk7Ci0JCQlwYy0+aXJxX3R5cGVbb2Zmc2V0XSA9IHR5cGU7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgotCQlpZiAocGMtPmlycV90eXBlW29mZnNldF0gPT0gSVJRX1RZUEVfRURHRV9CT1RIKSB7Ci0JCQkvKiBSSVNJTkcgYWxyZWFkeSBlbmFibGVkLCBkaXNhYmxlIEZBTExJTkcgKi8KLQkJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gSVJRX1RZUEVfRURHRV9GQUxMSU5HOwotCQkJYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIG9mZnNldCwgZmFsc2UpOwotCQkJcGMtPmlycV90eXBlW29mZnNldF0gPSB0eXBlOwotCQl9IGVsc2UgaWYgKHBjLT5pcnFfdHlwZVtvZmZzZXRdICE9IHR5cGUpIHsKLQkJCWJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBvZmZzZXQsIGZhbHNlKTsKLQkJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gdHlwZTsKLQkJCWJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBvZmZzZXQsIHRydWUpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBJUlFfVFlQRV9FREdFX0ZBTExJTkc6Ci0JCWlmIChwYy0+aXJxX3R5cGVbb2Zmc2V0XSA9PSBJUlFfVFlQRV9FREdFX0JPVEgpIHsKLQkJCS8qIEZBTExJTkcgYWxyZWFkeSBlbmFibGVkLCBkaXNhYmxlIFJJU0lORyAqLwotCQkJcGMtPmlycV90eXBlW29mZnNldF0gPSBJUlFfVFlQRV9FREdFX1JJU0lORzsKLQkJCWJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBvZmZzZXQsIGZhbHNlKTsKLQkJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gdHlwZTsKLQkJfSBlbHNlIGlmIChwYy0+aXJxX3R5cGVbb2Zmc2V0XSAhPSB0eXBlKSB7Ci0JCQliY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgb2Zmc2V0LCBmYWxzZSk7Ci0JCQlwYy0+aXJxX3R5cGVbb2Zmc2V0XSA9IHR5cGU7Ci0JCQliY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgb2Zmc2V0LCB0cnVlKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgSVJRX1RZUEVfRURHRV9CT1RIOgotCQlpZiAocGMtPmlycV90eXBlW29mZnNldF0gPT0gSVJRX1RZUEVfRURHRV9SSVNJTkcpIHsKLQkJCS8qIFJJU0lORyBhbHJlYWR5IGVuYWJsZWQsIGVuYWJsZSBGQUxMSU5HIHRvbyAqLwotCQkJcGMtPmlycV90eXBlW29mZnNldF0gPSBJUlFfVFlQRV9FREdFX0ZBTExJTkc7Ci0JCQliY20yODM1X2dwaW9faXJxX2NvbmZpZyhwYywgb2Zmc2V0LCB0cnVlKTsKLQkJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gdHlwZTsKLQkJfSBlbHNlIGlmIChwYy0+aXJxX3R5cGVbb2Zmc2V0XSA9PSBJUlFfVFlQRV9FREdFX0ZBTExJTkcpIHsKLQkJCS8qIEZBTExJTkcgYWxyZWFkeSBlbmFibGVkLCBlbmFibGUgUklTSU5HIHRvbyAqLwotCQkJcGMtPmlycV90eXBlW29mZnNldF0gPSBJUlFfVFlQRV9FREdFX1JJU0lORzsKLQkJCWJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBvZmZzZXQsIHRydWUpOwotCQkJcGMtPmlycV90eXBlW29mZnNldF0gPSB0eXBlOwotCQl9IGVsc2UgaWYgKHBjLT5pcnFfdHlwZVtvZmZzZXRdICE9IHR5cGUpIHsKLQkJCWJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBvZmZzZXQsIGZhbHNlKTsKLQkJCXBjLT5pcnFfdHlwZVtvZmZzZXRdID0gdHlwZTsKLQkJCWJjbTI4MzVfZ3Bpb19pcnFfY29uZmlnKHBjLCBvZmZzZXQsIHRydWUpOwotCQl9Ci0JCWJyZWFrOwotCi0JY2FzZSBJUlFfVFlQRV9MRVZFTF9ISUdIOgotCWNhc2UgSVJRX1RZUEVfTEVWRUxfTE9XOgotCQlpZiAocGMtPmlycV90eXBlW29mZnNldF0gIT0gdHlwZSkgewotCQkJYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIG9mZnNldCwgZmFsc2UpOwotCQkJcGMtPmlycV90eXBlW29mZnNldF0gPSB0eXBlOwotCQkJYmNtMjgzNV9ncGlvX2lycV9jb25maWcocGMsIG9mZnNldCwgdHJ1ZSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtMjgzNV9ncGlvX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCB0eXBlKQotewotCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JdW5zaWduZWQgZ3BpbyA9IGlycWRfdG9faHdpcnEoZGF0YSk7Ci0JdW5zaWduZWQgb2Zmc2V0ID0gR1BJT19SRUdfU0hJRlQoZ3Bpbyk7Ci0JdW5zaWduZWQgYmFuayA9IEdQSU9fUkVHX09GRlNFVChncGlvKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGMtPmlycV9sb2NrW2JhbmtdLCBmbGFncyk7Ci0KLQlpZiAodGVzdF9iaXQob2Zmc2V0LCAmcGMtPmVuYWJsZWRfaXJxX21hcFtiYW5rXSkpCi0JCXJldCA9IF9fYmNtMjgzNV9ncGlvX2lycV9zZXRfdHlwZV9lbmFibGVkKHBjLCBncGlvLCB0eXBlKTsKLQllbHNlCi0JCXJldCA9IF9fYmNtMjgzNV9ncGlvX2lycV9zZXRfdHlwZV9kaXNhYmxlZChwYywgZ3BpbywgdHlwZSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYy0+aXJxX2xvY2tbYmFua10sIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgYmNtMjgzNV9ncGlvX2lycV9jaGlwID0gewotCS5uYW1lID0gTU9EVUxFX05BTUUsCi0JLmlycV9lbmFibGUgPSBiY20yODM1X2dwaW9faXJxX2VuYWJsZSwKLQkuaXJxX2Rpc2FibGUgPSBiY20yODM1X2dwaW9faXJxX2Rpc2FibGUsCi0JLmlycV9zZXRfdHlwZSA9IGJjbTI4MzVfZ3Bpb19pcnFfc2V0X3R5cGUsCi19OwotCi1zdGF0aWMgaW50IGJjbTI4MzVfcGN0bF9nZXRfZ3JvdXBzX2NvdW50KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldikKLXsKLQlyZXR1cm4gQVJSQVlfU0laRShiY20yODM1X2dwaW9fZ3JvdXBzKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmJjbTI4MzVfcGN0bF9nZXRfZ3JvdXBfbmFtZShzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCi0JCXVuc2lnbmVkIHNlbGVjdG9yKQotewotCXJldHVybiBiY20yODM1X2dwaW9fZ3JvdXBzW3NlbGVjdG9yXTsKLX0KLQotc3RhdGljIGludCBiY20yODM1X3BjdGxfZ2V0X2dyb3VwX3BpbnMoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAotCQl1bnNpZ25lZCBzZWxlY3RvciwKLQkJY29uc3QgdW5zaWduZWQgKipwaW5zLAotCQl1bnNpZ25lZCAqbnVtX3BpbnMpCi17Ci0JKnBpbnMgPSAmYmNtMjgzNV9ncGlvX3BpbnNbc2VsZWN0b3JdLm51bWJlcjsKLQkqbnVtX3BpbnMgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGJjbTI4MzVfcGN0bF9waW5fZGJnX3Nob3coc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAotCQlzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCi0JCXVuc2lnbmVkIG9mZnNldCkKLXsKLQlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwotCWVudW0gYmNtMjgzNV9mc2VsIGZzZWwgPSBiY20yODM1X3BpbmN0cmxfZnNlbF9nZXQocGMsIG9mZnNldCk7Ci0JY29uc3QgY2hhciAqZm5hbWUgPSBiY20yODM1X2Z1bmN0aW9uc1tmc2VsXTsKLQlpbnQgdmFsdWUgPSBiY20yODM1X2dwaW9fZ2V0X2JpdChwYywgR1BMRVYwLCBvZmZzZXQpOwotCWludCBpcnEgPSBpcnFfZmluZF9tYXBwaW5nKHBjLT5pcnFfZG9tYWluLCBvZmZzZXQpOwotCi0Jc2VxX3ByaW50ZihzLCAiZnVuY3Rpb24gJXMgaW4gJXM7IGlycSAlZCAoJXMpIiwKLQkJZm5hbWUsIHZhbHVlID8gImhpIiA6ICJsbyIsCi0JCWlycSwgaXJxX3R5cGVfbmFtZXNbcGMtPmlycV90eXBlW29mZnNldF1dKTsKLX0KLQotc3RhdGljIHZvaWQgYmNtMjgzNV9wY3RsX2R0X2ZyZWVfbWFwKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJc3RydWN0IHBpbmN0cmxfbWFwICptYXBzLCB1bnNpZ25lZCBudW1fbWFwcykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBudW1fbWFwczsgaSsrKQotCQlpZiAobWFwc1tpXS50eXBlID09IFBJTl9NQVBfVFlQRV9DT05GSUdTX1BJTikKLQkJCWtmcmVlKG1hcHNbaV0uZGF0YS5jb25maWdzLmNvbmZpZ3MpOwotCi0Ja2ZyZWUobWFwcyk7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtMjgzNV9wY3RsX2R0X25vZGVfdG9fbWFwX2Z1bmMoc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGMsCi0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIHUzMiBwaW4sIHUzMiBmbnVtLAotCQlzdHJ1Y3QgcGluY3RybF9tYXAgKiptYXBzKQotewotCXN0cnVjdCBwaW5jdHJsX21hcCAqbWFwID0gKm1hcHM7Ci0KLQlpZiAoZm51bSA+PSBBUlJBWV9TSVpFKGJjbTI4MzVfZnVuY3Rpb25zKSkgewotCQlkZXZfZXJyKHBjLT5kZXYsICIlczogaW52YWxpZCBicmNtLGZ1bmN0aW9uICVkXG4iLAotCQkJb2Zfbm9kZV9mdWxsX25hbWUobnApLCBmbnVtKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWFwLT50eXBlID0gUElOX01BUF9UWVBFX01VWF9HUk9VUDsKLQltYXAtPmRhdGEubXV4Lmdyb3VwID0gYmNtMjgzNV9ncGlvX2dyb3Vwc1twaW5dOwotCW1hcC0+ZGF0YS5tdXguZnVuY3Rpb24gPSBiY20yODM1X2Z1bmN0aW9uc1tmbnVtXTsKLQkoKm1hcHMpKys7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiY20yODM1X3BjdGxfZHRfbm9kZV90b19tYXBfcHVsbChzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYywKLQkJc3RydWN0IGRldmljZV9ub2RlICpucCwgdTMyIHBpbiwgdTMyIHB1bGwsCi0JCXN0cnVjdCBwaW5jdHJsX21hcCAqKm1hcHMpCi17Ci0Jc3RydWN0IHBpbmN0cmxfbWFwICptYXAgPSAqbWFwczsKLQl1bnNpZ25lZCBsb25nICpjb25maWdzOwotCi0JaWYgKHB1bGwgPiAyKSB7Ci0JCWRldl9lcnIocGMtPmRldiwgIiVzOiBpbnZhbGlkIGJyY20scHVsbCAlZFxuIiwKLQkJCW9mX25vZGVfZnVsbF9uYW1lKG5wKSwgcHVsbCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWNvbmZpZ3MgPSBremFsbG9jKHNpemVvZigqY29uZmlncyksIEdGUF9LRVJORUwpOwotCWlmICghY29uZmlncykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JY29uZmlnc1swXSA9IEJDTTI4MzVfUElOQ09ORl9QQUNLKEJDTTI4MzVfUElOQ09ORl9QQVJBTV9QVUxMLCBwdWxsKTsKLQotCW1hcC0+dHlwZSA9IFBJTl9NQVBfVFlQRV9DT05GSUdTX1BJTjsKLQltYXAtPmRhdGEuY29uZmlncy5ncm91cF9vcl9waW4gPSBiY20yODM1X2dwaW9fcGluc1twaW5dLm5hbWU7Ci0JbWFwLT5kYXRhLmNvbmZpZ3MuY29uZmlncyA9IGNvbmZpZ3M7Ci0JbWFwLT5kYXRhLmNvbmZpZ3MubnVtX2NvbmZpZ3MgPSAxOwotCSgqbWFwcykrKzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJjbTI4MzVfcGN0bF9kdF9ub2RlX3RvX21hcChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYsCi0JCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCi0JCXN0cnVjdCBwaW5jdHJsX21hcCAqKm1hcCwgdW5zaWduZWQgKm51bV9tYXBzKQotewotCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7Ci0Jc3RydWN0IHByb3BlcnR5ICpwaW5zLCAqZnVuY3MsICpwdWxsczsKLQlpbnQgbnVtX3BpbnMsIG51bV9mdW5jcywgbnVtX3B1bGxzLCBtYXBzX3Blcl9waW47Ci0Jc3RydWN0IHBpbmN0cmxfbWFwICptYXBzLCAqY3VyX21hcDsKLQlpbnQgaSwgZXJyOwotCXUzMiBwaW4sIGZ1bmMsIHB1bGw7Ci0KLQlwaW5zID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgImJyY20scGlucyIsIE5VTEwpOwotCWlmICghcGlucykgewotCQlkZXZfZXJyKHBjLT5kZXYsICIlczogbWlzc2luZyBicmNtLHBpbnMgcHJvcGVydHlcbiIsCi0JCQkJb2Zfbm9kZV9mdWxsX25hbWUobnApKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZnVuY3MgPSBvZl9maW5kX3Byb3BlcnR5KG5wLCAiYnJjbSxmdW5jdGlvbiIsIE5VTEwpOwotCXB1bGxzID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgImJyY20scHVsbCIsIE5VTEwpOwotCi0JaWYgKCFmdW5jcyAmJiAhcHVsbHMpIHsKLQkJZGV2X2VycihwYy0+ZGV2LAotCQkJIiVzOiBuZWl0aGVyIGJyY20sZnVuY3Rpb24gbm9yIGJyY20scHVsbCBzcGVjaWZpZWRcbiIsCi0JCQlvZl9ub2RlX2Z1bGxfbmFtZShucCkpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQludW1fcGlucyA9IHBpbnMtPmxlbmd0aCAvIDQ7Ci0JbnVtX2Z1bmNzID0gZnVuY3MgPyAoZnVuY3MtPmxlbmd0aCAvIDQpIDogMDsKLQludW1fcHVsbHMgPSBwdWxscyA/IChwdWxscy0+bGVuZ3RoIC8gNCkgOiAwOwotCi0JaWYgKG51bV9mdW5jcyA+IDEgJiYgbnVtX2Z1bmNzICE9IG51bV9waW5zKSB7Ci0JCWRldl9lcnIocGMtPmRldiwKLQkJCSIlczogYnJjbSxmdW5jdGlvbiBtdXN0IGhhdmUgMSBvciAlZCBlbnRyaWVzXG4iLAotCQkJb2Zfbm9kZV9mdWxsX25hbWUobnApLCBudW1fcGlucyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChudW1fcHVsbHMgPiAxICYmIG51bV9wdWxscyAhPSBudW1fcGlucykgewotCQlkZXZfZXJyKHBjLT5kZXYsCi0JCQkiJXM6IGJyY20scHVsbCBtdXN0IGhhdmUgMSBvciAlZCBlbnRyaWVzXG4iLAotCQkJb2Zfbm9kZV9mdWxsX25hbWUobnApLCBudW1fcGlucyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW1hcHNfcGVyX3BpbiA9IDA7Ci0JaWYgKG51bV9mdW5jcykKLQkJbWFwc19wZXJfcGluKys7Ci0JaWYgKG51bV9wdWxscykKLQkJbWFwc19wZXJfcGluKys7Ci0JY3VyX21hcCA9IG1hcHMgPSBremFsbG9jKG51bV9waW5zICogbWFwc19wZXJfcGluICogc2l6ZW9mKCptYXBzKSwKLQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIW1hcHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9waW5zOyBpKyspIHsKLQkJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobnAsICJicmNtLHBpbnMiLCBpLCAmcGluKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0OwotCQlpZiAocGluID49IEFSUkFZX1NJWkUoYmNtMjgzNV9ncGlvX3BpbnMpKSB7Ci0JCQlkZXZfZXJyKHBjLT5kZXYsICIlczogaW52YWxpZCBicmNtLHBpbnMgdmFsdWUgJWRcbiIsCi0JCQkJb2Zfbm9kZV9mdWxsX25hbWUobnApLCBwaW4pOwotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaWYgKG51bV9mdW5jcykgewotCQkJZXJyID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfaW5kZXgobnAsICJicmNtLGZ1bmN0aW9uIiwKLQkJCQkJKG51bV9mdW5jcyA+IDEpID8gaSA6IDAsICZmdW5jKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBvdXQ7Ci0JCQllcnIgPSBiY20yODM1X3BjdGxfZHRfbm9kZV90b19tYXBfZnVuYyhwYywgbnAsIHBpbiwKLQkJCQkJCQlmdW5jLCAmY3VyX21hcCk7Ci0JCQlpZiAoZXJyKQotCQkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmIChudW1fcHVsbHMpIHsKLQkJCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2luZGV4KG5wLCAiYnJjbSxwdWxsIiwKLQkJCQkJKG51bV9mdW5jcyA+IDEpID8gaSA6IDAsICZwdWxsKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBvdXQ7Ci0JCQllcnIgPSBiY20yODM1X3BjdGxfZHRfbm9kZV90b19tYXBfcHVsbChwYywgbnAsIHBpbiwKLQkJCQkJCQlwdWxsLCAmY3VyX21hcCk7Ci0JCQlpZiAoZXJyKQotCQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JKm1hcCA9IG1hcHM7Ci0JKm51bV9tYXBzID0gbnVtX3BpbnMgKiBtYXBzX3Blcl9waW47Ci0KLQlyZXR1cm4gMDsKLQotb3V0OgotCWtmcmVlKG1hcHMpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9vcHMgYmNtMjgzNV9wY3RsX29wcyA9IHsKLQkuZ2V0X2dyb3Vwc19jb3VudCA9IGJjbTI4MzVfcGN0bF9nZXRfZ3JvdXBzX2NvdW50LAotCS5nZXRfZ3JvdXBfbmFtZSA9IGJjbTI4MzVfcGN0bF9nZXRfZ3JvdXBfbmFtZSwKLQkuZ2V0X2dyb3VwX3BpbnMgPSBiY20yODM1X3BjdGxfZ2V0X2dyb3VwX3BpbnMsCi0JLnBpbl9kYmdfc2hvdyA9IGJjbTI4MzVfcGN0bF9waW5fZGJnX3Nob3csCi0JLmR0X25vZGVfdG9fbWFwID0gYmNtMjgzNV9wY3RsX2R0X25vZGVfdG9fbWFwLAotCS5kdF9mcmVlX21hcCA9IGJjbTI4MzVfcGN0bF9kdF9mcmVlX21hcCwKLX07Ci0KLXN0YXRpYyBpbnQgYmNtMjgzNV9wbXhfZ2V0X2Z1bmN0aW9uc19jb3VudChzdHJ1Y3QgcGluY3RybF9kZXYgKnBjdGxkZXYpCi17Ci0JcmV0dXJuIEJDTTI4MzVfRlNFTF9DT1VOVDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmJjbTI4MzVfcG14X2dldF9mdW5jdGlvbl9uYW1lKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJdW5zaWduZWQgc2VsZWN0b3IpCi17Ci0JcmV0dXJuIGJjbTI4MzVfZnVuY3Rpb25zW3NlbGVjdG9yXTsKLX0KLQotc3RhdGljIGludCBiY20yODM1X3BteF9nZXRfZnVuY3Rpb25fZ3JvdXBzKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJdW5zaWduZWQgc2VsZWN0b3IsCi0JCWNvbnN0IGNoYXIgKiBjb25zdCAqKmdyb3VwcywKLQkJdW5zaWduZWQgKiBjb25zdCBudW1fZ3JvdXBzKQotewotCS8qIGV2ZXJ5IHBpbiBjYW4gZG8gZXZlcnkgZnVuY3Rpb24gKi8KLQkqZ3JvdXBzID0gYmNtMjgzNV9ncGlvX2dyb3VwczsKLQkqbnVtX2dyb3VwcyA9IEFSUkFZX1NJWkUoYmNtMjgzNV9ncGlvX2dyb3Vwcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBiY20yODM1X3BteF9zZXQoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAotCQl1bnNpZ25lZCBmdW5jX3NlbGVjdG9yLAotCQl1bnNpZ25lZCBncm91cF9zZWxlY3RvcikKLXsKLQlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwotCi0JYmNtMjgzNV9waW5jdHJsX2ZzZWxfc2V0KHBjLCBncm91cF9zZWxlY3RvciwgZnVuY19zZWxlY3Rvcik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYmNtMjgzNV9wbXhfZ3Bpb19kaXNhYmxlX2ZyZWUoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAotCQlzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlICpyYW5nZSwKLQkJdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7Ci0KLQkvKiBkaXNhYmxlIGJ5IHNldHRpbmcgdG8gR1BJT19JTiAqLwotCWJjbTI4MzVfcGluY3RybF9mc2VsX3NldChwYywgb2Zmc2V0LCBCQ00yODM1X0ZTRUxfR1BJT19JTik7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtMjgzNV9wbXhfZ3Bpb19zZXRfZGlyZWN0aW9uKHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSAqcmFuZ2UsCi0JCXVuc2lnbmVkIG9mZnNldCwKLQkJYm9vbCBpbnB1dCkKLXsKLQlzdHJ1Y3QgYmNtMjgzNV9waW5jdHJsICpwYyA9IHBpbmN0cmxfZGV2X2dldF9kcnZkYXRhKHBjdGxkZXYpOwotCWVudW0gYmNtMjgzNV9mc2VsIGZzZWwgPSBpbnB1dCA/Ci0JCUJDTTI4MzVfRlNFTF9HUElPX0lOIDogQkNNMjgzNV9GU0VMX0dQSU9fT1VUOwotCi0JYmNtMjgzNV9waW5jdHJsX2ZzZWxfc2V0KHBjLCBvZmZzZXQsIGZzZWwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcGlubXV4X29wcyBiY20yODM1X3BteF9vcHMgPSB7Ci0JLmdldF9mdW5jdGlvbnNfY291bnQgPSBiY20yODM1X3BteF9nZXRfZnVuY3Rpb25zX2NvdW50LAotCS5nZXRfZnVuY3Rpb25fbmFtZSA9IGJjbTI4MzVfcG14X2dldF9mdW5jdGlvbl9uYW1lLAotCS5nZXRfZnVuY3Rpb25fZ3JvdXBzID0gYmNtMjgzNV9wbXhfZ2V0X2Z1bmN0aW9uX2dyb3VwcywKLQkuc2V0X211eCA9IGJjbTI4MzVfcG14X3NldCwKLQkuZ3Bpb19kaXNhYmxlX2ZyZWUgPSBiY20yODM1X3BteF9ncGlvX2Rpc2FibGVfZnJlZSwKLQkuZ3Bpb19zZXRfZGlyZWN0aW9uID0gYmNtMjgzNV9wbXhfZ3Bpb19zZXRfZGlyZWN0aW9uLAotfTsKLQotc3RhdGljIGludCBiY20yODM1X3BpbmNvbmZfZ2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJCXVuc2lnbmVkIHBpbiwgdW5zaWduZWQgbG9uZyAqY29uZmlnKQotewotCS8qIE5vIHdheSB0byByZWFkIGJhY2sgY29uZmlnIGluIEhXICovCi0JcmV0dXJuIC1FTk9UU1VQUDsKLX0KLQotc3RhdGljIGludCBiY20yODM1X3BpbmNvbmZfc2V0KHN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwKLQkJCXVuc2lnbmVkIHBpbiwgdW5zaWduZWQgbG9uZyAqY29uZmlncywKLQkJCXVuc2lnbmVkIG51bV9jb25maWdzKQotewotCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjID0gcGluY3RybF9kZXZfZ2V0X2RydmRhdGEocGN0bGRldik7Ci0JZW51bSBiY20yODM1X3BpbmNvbmZfcGFyYW0gcGFyYW07Ci0JdTE2IGFyZzsKLQl1MzIgb2ZmLCBiaXQ7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbmZpZ3M7IGkrKykgewotCQlwYXJhbSA9IEJDTTI4MzVfUElOQ09ORl9VTlBBQ0tfUEFSQU0oY29uZmlnc1tpXSk7Ci0JCWFyZyA9IEJDTTI4MzVfUElOQ09ORl9VTlBBQ0tfQVJHKGNvbmZpZ3NbaV0pOwotCi0JCWlmIChwYXJhbSAhPSBCQ00yODM1X1BJTkNPTkZfUEFSQU1fUFVMTCkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCW9mZiA9IEdQSU9fUkVHX09GRlNFVChwaW4pOwotCQliaXQgPSBHUElPX1JFR19TSElGVChwaW4pOwotCi0JCWJjbTI4MzVfZ3Bpb193cihwYywgR1BQVUQsIGFyZyAmIDMpOwotCQkvKgotCQkgKiBEb2NzIHNheSB0byB3YWl0IDE1MCBjeWNsZXMsIGJ1dCBub3Qgb2Ygd2hhdC4gV2UgYXNzdW1lIGEKLQkJICogMSBNSHogY2xvY2sgaGVyZSwgd2hpY2ggaXMgcHJldHR5IHNsb3cuLi4KLQkJICovCi0JCXVkZWxheSgxNTApOwotCQliY20yODM1X2dwaW9fd3IocGMsIEdQUFVEQ0xLMCArIChvZmYgKiA0KSwgQklUKGJpdCkpOwotCQl1ZGVsYXkoMTUwKTsKLQkJYmNtMjgzNV9ncGlvX3dyKHBjLCBHUFBVRENMSzAgKyAob2ZmICogNCksIDApOwotCX0gLyogZm9yIGVhY2ggY29uZmlnICovCi0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jb25mX29wcyBiY20yODM1X3BpbmNvbmZfb3BzID0gewotCS5waW5fY29uZmlnX2dldCA9IGJjbTI4MzVfcGluY29uZl9nZXQsCi0JLnBpbl9jb25maWdfc2V0ID0gYmNtMjgzNV9waW5jb25mX3NldCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcGluY3RybF9kZXNjIGJjbTI4MzVfcGluY3RybF9kZXNjID0gewotCS5uYW1lID0gTU9EVUxFX05BTUUsCi0JLnBpbnMgPSBiY20yODM1X2dwaW9fcGlucywKLQkubnBpbnMgPSBBUlJBWV9TSVpFKGJjbTI4MzVfZ3Bpb19waW5zKSwKLQkucGN0bG9wcyA9ICZiY20yODM1X3BjdGxfb3BzLAotCS5wbXhvcHMgPSAmYmNtMjgzNV9wbXhfb3BzLAotCS5jb25mb3BzID0gJmJjbTI4MzVfcGluY29uZl9vcHMsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgc3RydWN0IHBpbmN0cmxfZ3Bpb19yYW5nZSBiY20yODM1X3BpbmN0cmxfZ3Bpb19yYW5nZSA9IHsKLQkubmFtZSA9IE1PRFVMRV9OQU1FLAotCS5ucGlucyA9IEJDTTI4MzVfTlVNX0dQSU9TLAotfTsKLQotc3RhdGljIGludCBiY20yODM1X3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7Ci0Jc3RydWN0IGJjbTI4MzVfcGluY3RybCAqcGM7Ci0Jc3RydWN0IHJlc291cmNlIGlvbWVtOwotCWludCBlcnIsIGk7Ci0JQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoYmNtMjgzNV9ncGlvX3BpbnMpICE9IEJDTTI4MzVfTlVNX0dQSU9TKTsKLQlCVUlMRF9CVUdfT04oQVJSQVlfU0laRShiY20yODM1X2dwaW9fZ3JvdXBzKSAhPSBCQ00yODM1X05VTV9HUElPUyk7Ci0KLQlwYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqcGMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBjKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHBjKTsKLQlwYy0+ZGV2ID0gZGV2OwotCi0JZXJyID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJmlvbWVtKTsKLQlpZiAoZXJyKSB7Ci0JCWRldl9lcnIoZGV2LCAiY291bGQgbm90IGdldCBJTyBtZW1vcnlcbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCXBjLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgJmlvbWVtKTsKLQlpZiAoSVNfRVJSKHBjLT5iYXNlKSkKLQkJcmV0dXJuIFBUUl9FUlIocGMtPmJhc2UpOwotCi0JcGMtPmdwaW9fY2hpcCA9IGJjbTI4MzVfZ3Bpb19jaGlwOwotCXBjLT5ncGlvX2NoaXAuZGV2ID0gZGV2OwotCXBjLT5ncGlvX2NoaXAub2Zfbm9kZSA9IG5wOwotCi0JcGMtPmlycV9kb21haW4gPSBpcnFfZG9tYWluX2FkZF9saW5lYXIobnAsIEJDTTI4MzVfTlVNX0dQSU9TLAotCQkJJmlycV9kb21haW5fc2ltcGxlX29wcywgTlVMTCk7Ci0JaWYgKCFwYy0+aXJxX2RvbWFpbikgewotCQlkZXZfZXJyKGRldiwgImNvdWxkIG5vdCBjcmVhdGUgSVJRIGRvbWFpblxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBCQ00yODM1X05VTV9HUElPUzsgaSsrKSB7Ci0JCWludCBpcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcocGMtPmlycV9kb21haW4sIGkpOwotCQlpcnFfc2V0X2xvY2tkZXBfY2xhc3MoaXJxLCAmZ3Bpb19sb2NrX2NsYXNzKTsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmJjbTI4MzVfZ3Bpb19pcnFfY2hpcCwKLQkJCQloYW5kbGVfc2ltcGxlX2lycSk7Ci0JCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgcGMpOwotCQlzZXRfaXJxX2ZsYWdzKGlycSwgSVJRRl9WQUxJRCk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IEJDTTI4MzVfTlVNX0JBTktTOyBpKyspIHsKLQkJdW5zaWduZWQgbG9uZyBldmVudHM7Ci0JCXVuc2lnbmVkIG9mZnNldDsKLQkJaW50IGxlbjsKLQkJY2hhciAqbmFtZTsKLQotCQkvKiBjbGVhciBldmVudCBkZXRlY3Rpb24gZmxhZ3MgKi8KLQkJYmNtMjgzNV9ncGlvX3dyKHBjLCBHUFJFTjAgKyBpICogNCwgMCk7Ci0JCWJjbTI4MzVfZ3Bpb193cihwYywgR1BGRU4wICsgaSAqIDQsIDApOwotCQliY20yODM1X2dwaW9fd3IocGMsIEdQSEVOMCArIGkgKiA0LCAwKTsKLQkJYmNtMjgzNV9ncGlvX3dyKHBjLCBHUExFTjAgKyBpICogNCwgMCk7Ci0JCWJjbTI4MzVfZ3Bpb193cihwYywgR1BBUkVOMCArIGkgKiA0LCAwKTsKLQkJYmNtMjgzNV9ncGlvX3dyKHBjLCBHUEFGRU4wICsgaSAqIDQsIDApOwotCi0JCS8qIGNsZWFyIGFsbCB0aGUgZXZlbnRzICovCi0JCWV2ZW50cyA9IGJjbTI4MzVfZ3Bpb19yZChwYywgR1BFRFMwICsgaSAqIDQpOwotCQlmb3JfZWFjaF9zZXRfYml0KG9mZnNldCwgJmV2ZW50cywgMzIpCi0JCQliY20yODM1X2dwaW9fd3IocGMsIEdQRURTMCArIGkgKiA0LCBCSVQob2Zmc2V0KSk7Ci0KLQkJcGMtPmlycVtpXSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCBpKTsKLQkJcGMtPmlycV9kYXRhW2ldLnBjID0gcGM7Ci0JCXBjLT5pcnFfZGF0YVtpXS5iYW5rID0gaTsKLQkJc3Bpbl9sb2NrX2luaXQoJnBjLT5pcnFfbG9ja1tpXSk7Ci0KLQkJbGVuID0gc3RybGVuKGRldl9uYW1lKHBjLT5kZXYpKSArIDE2OwotCQluYW1lID0gZGV2bV9remFsbG9jKHBjLT5kZXYsIGxlbiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmFtZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQlzbnByaW50ZihuYW1lLCBsZW4sICIlczpiYW5rJWQiLCBkZXZfbmFtZShwYy0+ZGV2KSwgaSk7Ci0KLQkJZXJyID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIHBjLT5pcnFbaV0sCi0JCQliY20yODM1X2dwaW9faXJxX2hhbmRsZXIsIElSUUZfU0hBUkVELAotCQkJbmFtZSwgJnBjLT5pcnFfZGF0YVtpXSk7Ci0JCWlmIChlcnIpIHsKLQkJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHJlcXVlc3QgSVJRICVkXG4iLCBwYy0+aXJxW2ldKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9Ci0KLQllcnIgPSBncGlvY2hpcF9hZGQoJnBjLT5ncGlvX2NoaXApOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgYWRkIEdQSU8gY2hpcFxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcGMtPnBjdGxfZGV2ID0gcGluY3RybF9yZWdpc3RlcigmYmNtMjgzNV9waW5jdHJsX2Rlc2MsIGRldiwgcGMpOwotCWlmICghcGMtPnBjdGxfZGV2KSB7Ci0JCWdwaW9jaGlwX3JlbW92ZSgmcGMtPmdwaW9fY2hpcCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXBjLT5ncGlvX3JhbmdlID0gYmNtMjgzNV9waW5jdHJsX2dwaW9fcmFuZ2U7Ci0JcGMtPmdwaW9fcmFuZ2UuYmFzZSA9IHBjLT5ncGlvX2NoaXAuYmFzZTsKLQlwYy0+Z3Bpb19yYW5nZS5nYyA9ICZwYy0+Z3Bpb19jaGlwOwotCXBpbmN0cmxfYWRkX2dwaW9fcmFuZ2UocGMtPnBjdGxfZGV2LCAmcGMtPmdwaW9fcmFuZ2UpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmNtMjgzNV9waW5jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBiY20yODM1X3BpbmN0cmwgKnBjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0KLQlwaW5jdHJsX3VucmVnaXN0ZXIocGMtPnBjdGxfZGV2KTsKLQlncGlvY2hpcF9yZW1vdmUoJnBjLT5ncGlvX2NoaXApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGJjbTI4MzVfcGluY3RybF9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYnJjbSxiY20yODM1LWdwaW8iIH0sCi0Je30KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBiY20yODM1X3BpbmN0cmxfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBiY20yODM1X3BpbmN0cmxfZHJpdmVyID0gewotCS5wcm9iZSA9IGJjbTI4MzVfcGluY3RybF9wcm9iZSwKLQkucmVtb3ZlID0gYmNtMjgzNV9waW5jdHJsX3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9IE1PRFVMRV9OQU1FLAotCQkub2ZfbWF0Y2hfdGFibGUgPSBiY20yODM1X3BpbmN0cmxfbWF0Y2gsCi0JfSwKLX07Ci1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJjbTI4MzVfcGluY3RybF9kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJDaHJpcyBCb290LCBTaW1vbiBBcmxvdHQsIFN0ZXBoZW4gV2FycmVuIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIkJDTTI4MzUgUGluIGNvbnRyb2wgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1sYW50aXEuaCBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWxhbnRpcS5oCmluZGV4IGM3Y2ZhZDUuLmViODliYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWxhbnRpcS5oCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLWxhbnRpcS5oCkBAIC0xOTMsNCArMTkzLDQgQEAKIGV4dGVybiBpbnQgbHRxX3BpbmN0cmxfcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJCQkgICBzdHJ1Y3QgbHRxX3Bpbm11eF9pbmZvICppbmZvKTsKIGV4dGVybiBpbnQgbHRxX3BpbmN0cmxfdW5yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKLSNlbmRpZgkvKiBfX1BJTkNUUkxfUFhBM1hYX0ggKi8KKyNlbmRpZgkvKiBfX1BJTkNUUkxfTEFOVElRX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXBhbG1hcy5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcGFsbWFzLmMKaW5kZXggMjY0NjFlMy4uMjYzMWRmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcGFsbWFzLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtcGFsbWFzLmMKQEAgLTk4Nyw3ICs5ODcsNyBAQAogCS5udW1fcGluX2dyb3VwcyA9IEFSUkFZX1NJWkUodHBzODAwMzZfcGluZ3JvdXBzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBhbG1hc19waW5jdHJsX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwYWxtYXNfcGluY3RybF9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAidGkscGFsbWFzLXBpbmN0cmwiLCAuZGF0YSA9ICZ0cHM2NTkxM19waW5jdHJsX2RhdGF9LAogCXsgLmNvbXBhdGlibGUgPSAidGksdHBzNjU5MTMtcGluY3RybCIsIC5kYXRhID0gJnRwczY1OTEzX3BpbmN0cmxfZGF0YX0sCiAJeyAuY29tcGF0aWJsZSA9ICJ0aSx0cHM4MDAzNi1waW5jdHJsIiwgLmRhdGEgPSAmdHBzODAwMzZfcGluY3RybF9kYXRhfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXNpbmdsZS5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2luZ2xlLmMKaW5kZXggNjllODQ0Mi4uMTNiNDVmMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2luZ2xlLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc2luZ2xlLmMKQEAgLTE1MDEsNyArMTUwMSw3IEBACiAJCX0JCQkJCQkJXAogCX0gd2hpbGUgKDApOwogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBwY3Nfb2ZfbWF0Y2hbXTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBjc19vZl9tYXRjaFtdOwogCiBzdGF0aWMgaW50IHBjc19hZGRfZ3Bpb19mdW5jKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgc3RydWN0IHBjc19kZXZpY2UgKnBjcykKIHsKQEAgLTIwMDAsNyArMjAwMCw3IEBACiAJLmZsYWdzID0gUENTX0ZFQVRfUElOQ09ORiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBjc19vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcGNzX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJ0aSxvbWFwMy1wYWRjb25mIiwgLmRhdGEgPSAmcGluY3RybF9zaW5nbGVfb21hcF93a3VwIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ0aSxvbWFwNC1wYWRjb25mIiwgLmRhdGEgPSAmcGluY3RybF9zaW5nbGVfb21hcF93a3VwIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJ0aSxvbWFwNS1wYWRjb25mIiwgLmRhdGEgPSAmcGluY3RybF9zaW5nbGVfb21hcF93a3VwIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtc3QuYwppbmRleCA5ZTVlYzAwLi42NWJmNzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC1zdC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXN0LmMKQEAgLTIwNiw2ICsyMDYsOCBAQAogI2RlZmluZSBncGlvX2NoaXBfdG9fYmFuayhjaGlwKSBcCiAJCWNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3Qgc3RfZ3Bpb19iYW5rLCBncGlvX2NoaXApCiAKKyNkZWZpbmUgcGNfdG9fYmFuayhwYykgXAorCQljb250YWluZXJfb2YocGMsIHN0cnVjdCBzdF9ncGlvX2JhbmssIHBjKQogCiBlbnVtIHN0X3JldGltZV9zdHlsZSB7CiAJc3RfcmV0aW1lX3N0eWxlX25vbmUsCkBAIC0zOTgsNiArNDAwLDE2IEBACiAJLnJ0ID0gMTAwLAogfTsKIAorc3RhdGljIHN0cnVjdCBzdF9waW9fY29udHJvbCAqc3RfZ2V0X3Bpb19jb250cm9sKAorCQkJc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCBpbnQgcGluKQoreworCXN0cnVjdCBwaW5jdHJsX2dwaW9fcmFuZ2UgKnJhbmdlID0KKwkJCSBwaW5jdHJsX2ZpbmRfZ3Bpb19yYW5nZV9mcm9tX3BpbihwY3RsZGV2LCBwaW4pOworCXN0cnVjdCBzdF9ncGlvX2JhbmsgKmJhbmsgPSBncGlvX3JhbmdlX3RvX2JhbmsocmFuZ2UpOworCisJcmV0dXJuICZiYW5rLT5wYzsKK30KKwogLyogTG93IGxldmVsIGZ1bmN0aW9ucy4uICovCiBzdGF0aWMgaW5saW5lIGludCBzdF9ncGlvX2JhbmsoaW50IGdwaW8pCiB7CkBAIC00NjAsNiArNDcyLDIwIEBACiAJcmVnbWFwX2ZpZWxkX3dyaXRlKGFsdCwgdmFsKTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBzdF9wY3RsX2dldF9waW5fZnVuY3Rpb24oc3RydWN0IHN0X3Bpb19jb250cm9sICpwYywgaW50IHBpbikKK3sKKwlzdHJ1Y3QgcmVnbWFwX2ZpZWxkICphbHQgPSBwYy0+YWx0OworCXVuc2lnbmVkIGludCB2YWw7CisJaW50IG9mZnNldCA9IHBpbiAqIDQ7CisKKwlpZiAoIWFsdCkKKwkJcmV0dXJuIDA7CisKKwlyZWdtYXBfZmllbGRfcmVhZChhbHQsICZ2YWwpOworCisJcmV0dXJuICh2YWwgPj4gb2Zmc2V0KSAmIDB4ZjsKK30KKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RfcGluY29uZl9kZWxheV90b19iaXQodW5zaWduZWQgaW50IGRlbGF5LAogCWNvbnN0IHN0cnVjdCBzdF9wY3RsX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGxvbmcgY29uZmlnKQogewpAQCAtNzU3LDYgKzc4MywzNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN0X2dwaW9fZ2V0X2RpcmVjdGlvbihzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IHN0X2dwaW9fYmFuayAqYmFuayA9IGdwaW9fY2hpcF90b19iYW5rKGNoaXApOworCXN0cnVjdCBzdF9waW9fY29udHJvbCBwYyA9IGJhbmstPnBjOworCXVuc2lnbmVkIGxvbmcgY29uZmlnOworCXVuc2lnbmVkIGludCBkaXJlY3Rpb24gPSAwOworCXVuc2lnbmVkIGludCBmdW5jdGlvbjsKKwl1bnNpZ25lZCBpbnQgdmFsdWU7CisJaW50IGkgPSAwOworCisJLyogQWx0ZXJuYXRlIGZ1bmN0aW9uIGRpcmVjdGlvbiBpcyBoYW5kbGVkIGJ5IFBpbmN0cmwgKi8KKwlmdW5jdGlvbiA9IHN0X3BjdGxfZ2V0X3Bpbl9mdW5jdGlvbigmcGMsIG9mZnNldCk7CisJaWYgKGZ1bmN0aW9uKSB7CisJCXN0X3BpbmNvbmZfZ2V0X2RpcmVjdGlvbigmcGMsIG9mZnNldCwgJmNvbmZpZyk7CisJCXJldHVybiAhU1RfUElOQ09ORl9VTlBBQ0tfT0UoY29uZmlnKTsKKwl9CisKKwkvKgorCSAqIEdQSU8gZGlyZWN0aW9uIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkKKwkgKiAtIFNlZSBzdF9ncGlvX2RpcmVjdGlvbigpIGFib3ZlIGZvciBhbiBleHBsYW5hdGlvbgorCSAqLworCWZvciAoaSA9IDA7IGkgPD0gMjsgaSsrKSB7CisJCXZhbHVlID0gcmVhZGwoYmFuay0+YmFzZSArIFJFR19QSU9fUEMoaSkpOworCQlkaXJlY3Rpb24gfD0gKCh2YWx1ZSA+PiBvZmZzZXQpICYgMHgxKSA8PCBpOworCX0KKworCXJldHVybiAoZGlyZWN0aW9uID09IFNUX0dQSU9fRElSRUNUSU9OX0lOKTsKK30KKwogc3RhdGljIGludCBzdF9ncGlvX3hsYXRlKHN0cnVjdCBncGlvX2NoaXAgKmdjLAogCQkJY29uc3Qgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqZ3Bpb3NwZWMsIHUzMiAqZmxhZ3MpCiB7CkBAIC05MDQsMTYgKzk1OSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc3RfcGlvX2NvbnRyb2wgKnN0X2dldF9waW9fY29udHJvbCgKLQkJCXN0cnVjdCBwaW5jdHJsX2RldiAqcGN0bGRldiwgaW50IHBpbikKLXsKLQlzdHJ1Y3QgcGluY3RybF9ncGlvX3JhbmdlICpyYW5nZSA9Ci0JCQkgcGluY3RybF9maW5kX2dwaW9fcmFuZ2VfZnJvbV9waW4ocGN0bGRldiwgcGluKTsKLQlzdHJ1Y3Qgc3RfZ3Bpb19iYW5rICpiYW5rID0gZ3Bpb19yYW5nZV90b19iYW5rKHJhbmdlKTsKLQotCXJldHVybiAmYmFuay0+cGM7Ci19Ci0KIHN0YXRpYyBpbnQgc3RfcG14X3NldF9tdXgoc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LCB1bnNpZ25lZCBmc2VsZWN0b3IsCiAJCQl1bnNpZ25lZCBncm91cCkKIHsKQEAgLTEwMTEsMTcgKzEwNTYsMzAgQEAKIHN0YXRpYyB2b2lkIHN0X3BpbmNvbmZfZGJnX3Nob3coc3RydWN0IHBpbmN0cmxfZGV2ICpwY3RsZGV2LAogCQkJCSAgIHN0cnVjdCBzZXFfZmlsZSAqcywgdW5zaWduZWQgcGluX2lkKQogeworCXN0cnVjdCBzdF9waW9fY29udHJvbCAqcGM7CiAJdW5zaWduZWQgbG9uZyBjb25maWc7CisJdW5zaWduZWQgaW50IGZ1bmN0aW9uOworCWludCBvZmZzZXQgPSBzdF9ncGlvX3BpbihwaW5faWQpOworCWNoYXIgZlsxNl07CiAKIAltdXRleF91bmxvY2soJnBjdGxkZXYtPm11dGV4KTsKKwlwYyA9IHN0X2dldF9waW9fY29udHJvbChwY3RsZGV2LCBwaW5faWQpOwogCXN0X3BpbmNvbmZfZ2V0KHBjdGxkZXYsIHBpbl9pZCwgJmNvbmZpZyk7CiAJbXV0ZXhfbG9jaygmcGN0bGRldi0+bXV0ZXgpOwotCXNlcV9wcmludGYocywgIltPRTolbGQsUFU6JWxkLE9EOiVsZF1cbiIKKworCWZ1bmN0aW9uID0gc3RfcGN0bF9nZXRfcGluX2Z1bmN0aW9uKHBjLCBvZmZzZXQpOworCWlmIChmdW5jdGlvbikKKwkJc25wcmludGYoZiwgMTAsICJBbHQgRm4gJWQiLCBmdW5jdGlvbik7CisJZWxzZQorCQlzbnByaW50ZihmLCA1LCAiR1BJTyIpOworCisJc2VxX3ByaW50ZihzLCAiW09FOiVkLFBVOiVsZCxPRDolbGRdXHQlc1xuIgogCQkiXHRcdFtyZXRpbWU6JWxkLGludmNsazolbGQsY2xrbm90ZGF0OiVsZCwiCiAJCSJkZTolbGQscnQtY2xrOiVsZCxydC1kZWxheTolbGRdIiwKLQkJU1RfUElOQ09ORl9VTlBBQ0tfT0UoY29uZmlnKSwKKwkJIXN0X2dwaW9fZ2V0X2RpcmVjdGlvbigmcGNfdG9fYmFuayhwYyktPmdwaW9fY2hpcCwgb2Zmc2V0KSwKIAkJU1RfUElOQ09ORl9VTlBBQ0tfUFUoY29uZmlnKSwKIAkJU1RfUElOQ09ORl9VTlBBQ0tfT0QoY29uZmlnKSwKKwkJZiwKIAkJU1RfUElOQ09ORl9VTlBBQ0tfUlQoY29uZmlnKSwKIAkJU1RfUElOQ09ORl9VTlBBQ0tfUlRfSU5WRVJUQ0xLKGNvbmZpZyksCiAJCVNUX1BJTkNPTkZfVU5QQUNLX1JUX0NMS05PVERBVEEoY29uZmlnKSwKQEAgLTE0MzgsNiArMTQ5Niw3IEBACiAJLnNldAkJCT0gc3RfZ3Bpb19zZXQsCiAJLmRpcmVjdGlvbl9pbnB1dAk9IHN0X2dwaW9fZGlyZWN0aW9uX2lucHV0LAogCS5kaXJlY3Rpb25fb3V0cHV0CT0gc3RfZ3Bpb19kaXJlY3Rpb25fb3V0cHV0LAorCS5nZXRfZGlyZWN0aW9uCQk9IHN0X2dwaW9fZ2V0X2RpcmVjdGlvbiwKIAkubmdwaW8JCQk9IFNUX0dQSU9fUElOU19QRVJfQkFOSywKIAkub2ZfZ3Bpb19uX2NlbGxzCT0gMSwKIAkub2ZfeGxhdGUJCT0gc3RfZ3Bpb194bGF0ZSwKQEAgLTE1MzEsNyArMTU5MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0X3BjdGxfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0X3BjdGxfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTUtc2JjLXBpbmN0cmwiLCAuZGF0YSA9ICZzdGloNDE1X3NiY19kYXRhIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE1LXJlYXItcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTVfcmVhcl9kYXRhIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE1LWxlZnQtcGluY3RybCIsIC5kYXRhID0gJnN0aWg0MTVfbGVmdF9kYXRhIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuYwppbmRleCBlNTk0OWQ1Li40Yzk1YzIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhLmMKQEAgLTEwMyw2ICsxMDMsNyBAQAogCXsibnZpZGlhLGxvY2siLAkJCVRFR1JBX1BJTkNPTkZfUEFSQU1fTE9DS30sCiAJeyJudmlkaWEsaW8tcmVzZXQiLAkJVEVHUkFfUElOQ09ORl9QQVJBTV9JT1JFU0VUfSwKIAl7Im52aWRpYSxyY3Ytc2VsIiwJCVRFR1JBX1BJTkNPTkZfUEFSQU1fUkNWX1NFTH0sCisJeyJudmlkaWEsaW8taHYiLAkJVEVHUkFfUElOQ09ORl9QQVJBTV9SQ1ZfU0VMfSwKIAl7Im52aWRpYSxoaWdoLXNwZWVkLW1vZGUiLAlURUdSQV9QSU5DT05GX1BBUkFNX0hJR0hfU1BFRURfTU9ERX0sCiAJeyJudmlkaWEsc2NobWl0dCIsCQlURUdSQV9QSU5DT05GX1BBUkFNX1NDSE1JVFR9LAogCXsibnZpZGlhLGxvdy1wb3dlci1tb2RlIiwJVEVHUkFfUElOQ09ORl9QQVJBTV9MT1dfUE9XRVJfTU9ERX0sCkBAIC0zNDgsMTQgKzM0OSwyNCBAQAogCQkqd2lkdGggPSAxOwogCQlicmVhazsKIAljYXNlIFRFR1JBX1BJTkNPTkZfUEFSQU1fSElHSF9TUEVFRF9NT0RFOgotCQkqYmFuayA9IGctPmRydl9iYW5rOwotCQkqcmVnID0gZy0+ZHJ2X3JlZzsKKwkJaWYgKHBteC0+c29jLT5oc21faW5fbXV4KSB7CisJCQkqYmFuayA9IGctPm11eF9iYW5rOworCQkJKnJlZyA9IGctPm11eF9yZWc7CisJCX0gZWxzZSB7CisJCQkqYmFuayA9IGctPmRydl9iYW5rOworCQkJKnJlZyA9IGctPmRydl9yZWc7CisJCX0KIAkJKmJpdCA9IGctPmhzbV9iaXQ7CiAJCSp3aWR0aCA9IDE7CiAJCWJyZWFrOwogCWNhc2UgVEVHUkFfUElOQ09ORl9QQVJBTV9TQ0hNSVRUOgotCQkqYmFuayA9IGctPmRydl9iYW5rOwotCQkqcmVnID0gZy0+ZHJ2X3JlZzsKKwkJaWYgKHBteC0+c29jLT5zY2htaXR0X2luX211eCkgeworCQkJKmJhbmsgPSBnLT5tdXhfYmFuazsKKwkJCSpyZWcgPSBnLT5tdXhfcmVnOworCQl9IGVsc2UgeworCQkJKmJhbmsgPSBnLT5kcnZfYmFuazsKKwkJCSpyZWcgPSBnLT5kcnZfcmVnOworCQl9CiAJCSpiaXQgPSBnLT5zY2htaXR0X2JpdDsKIAkJKndpZHRoID0gMTsKIAkJYnJlYWs7CkBAIC0zOTAsOCArNDAxLDEzIEBACiAJCSp3aWR0aCA9IGctPnNsd3Jfd2lkdGg7CiAJCWJyZWFrOwogCWNhc2UgVEVHUkFfUElOQ09ORl9QQVJBTV9EUklWRV9UWVBFOgotCQkqYmFuayA9IGctPmRydl9iYW5rOwotCQkqcmVnID0gZy0+ZHJ2X3JlZzsKKwkJaWYgKHBteC0+c29jLT5kcnZ0eXBlX2luX211eCkgeworCQkJKmJhbmsgPSBnLT5tdXhfYmFuazsKKwkJCSpyZWcgPSBnLT5tdXhfcmVnOworCQl9IGVsc2UgeworCQkJKmJhbmsgPSBnLT5kcnZfYmFuazsKKwkJCSpyZWcgPSBnLT5kcnZfcmVnOworCQl9CiAJCSpiaXQgPSBnLT5kcnZ0eXBlX2JpdDsKIAkJKndpZHRoID0gMjsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5oIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEuaAppbmRleCA4ZDk0ZDEzLi4xNjE1ZGI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYS5oCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhLmgKQEAgLTEzOSwyNiArMTM5LDI2IEBACiAJdTMyIHB1cGRfYmFuazoyOwogCXUzMiB0cmlfYmFuazoyOwogCXUzMiBkcnZfYmFuazoyOwotCXUzMiBtdXhfYml0OjY7Ci0JdTMyIHB1cGRfYml0OjY7Ci0JdTMyIHRyaV9iaXQ6NjsKLQl1MzIgZWlucHV0X2JpdDo2OwotCXUzMiBvZHJhaW5fYml0OjY7Ci0JdTMyIGxvY2tfYml0OjY7Ci0JdTMyIGlvcmVzZXRfYml0OjY7Ci0JdTMyIHJjdl9zZWxfYml0OjY7Ci0JdTMyIGhzbV9iaXQ6NjsKLQl1MzIgc2NobWl0dF9iaXQ6NjsKLQl1MzIgbHBtZF9iaXQ6NjsKLQl1MzIgZHJ2ZG5fYml0OjY7Ci0JdTMyIGRydnVwX2JpdDo2OwotCXUzMiBzbHdyX2JpdDo2OwotCXUzMiBzbHdmX2JpdDo2OwotCXUzMiBkcnZ0eXBlX2JpdDo2OwotCXUzMiBkcnZkbl93aWR0aDo2OwotCXUzMiBkcnZ1cF93aWR0aDo2OwotCXUzMiBzbHdyX3dpZHRoOjY7Ci0JdTMyIHNsd2Zfd2lkdGg6NjsKKwlzMzIgbXV4X2JpdDo2OworCXMzMiBwdXBkX2JpdDo2OworCXMzMiB0cmlfYml0OjY7CisJczMyIGVpbnB1dF9iaXQ6NjsKKwlzMzIgb2RyYWluX2JpdDo2OworCXMzMiBsb2NrX2JpdDo2OworCXMzMiBpb3Jlc2V0X2JpdDo2OworCXMzMiByY3Zfc2VsX2JpdDo2OworCXMzMiBoc21fYml0OjY7CisJczMyIHNjaG1pdHRfYml0OjY7CisJczMyIGxwbWRfYml0OjY7CisJczMyIGRydmRuX2JpdDo2OworCXMzMiBkcnZ1cF9iaXQ6NjsKKwlzMzIgc2x3cl9iaXQ6NjsKKwlzMzIgc2x3Zl9iaXQ6NjsKKwlzMzIgZHJ2dHlwZV9iaXQ6NjsKKwlzMzIgZHJ2ZG5fd2lkdGg6NjsKKwlzMzIgZHJ2dXBfd2lkdGg6NjsKKwlzMzIgc2x3cl93aWR0aDo2OworCXMzMiBzbHdmX3dpZHRoOjY7CiB9OwogCiAvKioKQEAgLTE4Miw2ICsxODIsOSBAQAogCXVuc2lnbmVkIG5mdW5jdGlvbnM7CiAJY29uc3Qgc3RydWN0IHRlZ3JhX3Bpbmdyb3VwICpncm91cHM7CiAJdW5zaWduZWQgbmdyb3VwczsKKwlib29sIGhzbV9pbl9tdXg7CisJYm9vbCBzY2htaXR0X2luX211eDsKKwlib29sIGRydnR5cGVfaW5fbXV4OwogfTsKIAogaW50IHRlZ3JhX3BpbmN0cmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMTE0LmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTExNC5jCmluZGV4IDUyZTRlYzYuLjA1ZTQ5ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMTE0LmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmExMTQuYwpAQCAtMTU0Nyw2ICsxNTQ3LDcgQEAKICNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19BCQkweDg2OAkvKiBiYW5rIDAgKi8KICNkZWZpbmUgUElOR1JPVVBfUkVHX0EJCQkweDMwMDAJLyogYmFuayAxICovCiAKKyNkZWZpbmUgRFJWX1BJTkdST1VQX1JFRyhyKQkJKChyKSAtIERSVl9QSU5HUk9VUF9SRUdfQSkKICNkZWZpbmUgUElOR1JPVVBfUkVHKHIpCQkJKChyKSAtIFBJTkdST1VQX1JFR19BKQogCiAjZGVmaW5lIFBJTkdST1VQX0JJVF9ZKGIpCQkoYikKQEAgLTE1NzIsMjAgKzE1NzMsMTcgQEAKIAkJLnRyaV9yZWcgPSBQSU5HUk9VUF9SRUcociksCQkJCVwKIAkJLnRyaV9iYW5rID0gMSwJCQkJCQlcCiAJCS50cmlfYml0ID0gNCwJCQkJCQlcCi0JCS5laW5wdXRfYml0ID0gUElOR1JPVVBfQklUX1koNSksCQkJXAorCQkuZWlucHV0X2JpdCA9IDUsCQkJCQlcCiAJCS5vZHJhaW5fYml0ID0gUElOR1JPVVBfQklUXyMjb2QoNiksCQkJXAotCQkubG9ja19iaXQgPSBQSU5HUk9VUF9CSVRfWSg3KSwJCQkJXAorCQkubG9ja19iaXQgPSA3LAkJCQkJCVwKIAkJLmlvcmVzZXRfYml0ID0gUElOR1JPVVBfQklUXyMjaW9yKDgpLAkJCVwKIAkJLnJjdl9zZWxfYml0ID0gUElOR1JPVVBfQklUXyMjcmN2X3NlbCg5KSwJCVwKIAkJLmRydl9yZWcgPSAtMSwJCQkJCQlcCiAJfQogCi0jZGVmaW5lIERSVl9QSU5HUk9VUF9SRUcocikJCSgocikgLSBEUlZfUElOR1JPVVBfUkVHX0EpCi0KLSNkZWZpbmUgRFJWX1BJTkdST1VQKHBnX25hbWUsIHIsIGhzbV9iLCBzY2htaXR0X2IsIGxwbWRfYiwJCVwKLQkJICAgICBkcnZkbl9iLCBkcnZkbl93LCBkcnZ1cF9iLCBkcnZ1cF93LAkJXAotCQkgICAgIHNsd3JfYiwgc2x3cl93LCBzbHdmX2IsIHNsd2ZfdywJCQlcCi0JCSAgICAgZHJ2dHlwZSkJCQkJCQlcCisjZGVmaW5lIERSVl9QSU5HUk9VUChwZ19uYW1lLCByLCBoc21fYiwgc2NobWl0dF9iLCBscG1kX2IsIGRydmRuX2IsCVwKKwkJICAgICBkcnZkbl93LCBkcnZ1cF9iLCBkcnZ1cF93LCBzbHdyX2IsIHNsd3JfdywJCVwKKwkJICAgICBzbHdmX2IsIHNsd2ZfdywgZHJ2dHlwZSkJCQkJXAogCXsJCQkJCQkJCVwKIAkJLm5hbWUgPSAiZHJpdmVfIiAjcGdfbmFtZSwJCQkJXAogCQkucGlucyA9IGRyaXZlXyMjcGdfbmFtZSMjX3BpbnMsCQkJCVwKQEAgLTE4NDMsNiArMTg0MSw5IEBACiAJLm5mdW5jdGlvbnMgPSBBUlJBWV9TSVpFKHRlZ3JhMTE0X2Z1bmN0aW9ucyksCiAJLmdyb3VwcyA9IHRlZ3JhMTE0X2dyb3VwcywKIAkubmdyb3VwcyA9IEFSUkFZX1NJWkUodGVncmExMTRfZ3JvdXBzKSwKKwkuaHNtX2luX211eCA9IGZhbHNlLAorCS5zY2htaXR0X2luX211eCA9IGZhbHNlLAorCS5kcnZ0eXBlX2luX211eCA9IGZhbHNlLAogfTsKIAogc3RhdGljIGludCB0ZWdyYTExNF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTEyNC5jIGIvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmExMjQuYwppbmRleCAyYjIwOTA2Li43Y2Q0NGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTEyNC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMTI0LmMKQEAgLTE1MzYsNiArMTUzNiw3IEBACiAJVEVHUkFfTVVYX0NMSywKIAlURUdSQV9NVVhfQ0xLMTIsCiAJVEVHUkFfTVVYX0NQVSwKKwlURUdSQV9NVVhfQ1NJLAogCVRFR1JBX01VWF9EQVAsCiAJVEVHUkFfTVVYX0RBUDEsCiAJVEVHUkFfTVVYX0RBUDIsCkBAIC0xNTQ0LDYgKzE1NDUsNyBAQAogCVRFR1JBX01VWF9ESVNQTEFZQV9BTFQsCiAJVEVHUkFfTVVYX0RJU1BMQVlCLAogCVRFR1JBX01VWF9EUCwKKwlURUdSQV9NVVhfRFNJX0IsCiAJVEVHUkFfTVVYX0RUViwKIAlURUdSQV9NVVhfRVhUUEVSSVBIMSwKIAlURUdSQV9NVVhfRVhUUEVSSVBIMiwKQEAgLTE2MTMsOCArMTYxNSw2IEBACiAJVEVHUkFfTVVYX1ZJX0FMVDMsCiAJVEVHUkFfTVVYX1ZJTUNMSzIsCiAJVEVHUkFfTVVYX1ZJTUNMSzJfQUxULAotCVRFR1JBX01VWF9DU0ksCi0JVEVHUkFfTVVYX0RTSV9CLAogfTsKIAogI2RlZmluZSBGVU5DVElPTihmbmFtZSkJCQkJCVwKQEAgLTE2MzAsNiArMTYzMCw3IEBACiAJRlVOQ1RJT04oY2xrKSwKIAlGVU5DVElPTihjbGsxMiksCiAJRlVOQ1RJT04oY3B1KSwKKwlGVU5DVElPTihjc2kpLAogCUZVTkNUSU9OKGRhcCksCiAJRlVOQ1RJT04oZGFwMSksCiAJRlVOQ1RJT04oZGFwMiksCkBAIC0xNjM4LDYgKzE2MzksNyBAQAogCUZVTkNUSU9OKGRpc3BsYXlhX2FsdCksCiAJRlVOQ1RJT04oZGlzcGxheWIpLAogCUZVTkNUSU9OKGRwKSwKKwlGVU5DVElPTihkc2lfYiksCiAJRlVOQ1RJT04oZHR2KSwKIAlGVU5DVElPTihleHRwZXJpcGgxKSwKIAlGVU5DVElPTihleHRwZXJpcGgyKSwKQEAgLTE3MDcsMTUgKzE3MDksMTUgQEAKIAlGVU5DVElPTih2aV9hbHQzKSwKIAlGVU5DVElPTih2aW1jbGsyKSwKIAlGVU5DVElPTih2aW1jbGsyX2FsdCksCi0JRlVOQ1RJT04oY3NpKSwKLQlGVU5DVElPTihkc2lfYiksCiB9OwogCiAjZGVmaW5lIERSVl9QSU5HUk9VUF9SRUdfQQkJMHg4NjgJLyogYmFuayAwICovCiAjZGVmaW5lIFBJTkdST1VQX1JFR19BCQkJMHgzMDAwCS8qIGJhbmsgMSAqLwogI2RlZmluZSBNSVBJX1BBRF9DVFJMX1BJTkdST1VQX1JFR19BCTB4ODIwCS8qIGJhbmsgMiAqLwogCisjZGVmaW5lIERSVl9QSU5HUk9VUF9SRUcocikJCSgocikgLSBEUlZfUElOR1JPVVBfUkVHX0EpCiAjZGVmaW5lIFBJTkdST1VQX1JFRyhyKQkJCSgocikgLSBQSU5HUk9VUF9SRUdfQSkKKyNkZWZpbmUgTUlQSV9QQURfQ1RSTF9QSU5HUk9VUF9SRUdfWShyKQkoKHIpIC0gTUlQSV9QQURfQ1RSTF9QSU5HUk9VUF9SRUdfQSkKIAogI2RlZmluZSBQSU5HUk9VUF9CSVRfWShiKQkJKGIpCiAjZGVmaW5lIFBJTkdST1VQX0JJVF9OKGIpCQkoLTEpCkBAIC0xNzQwLDIwICsxNzQyLDE3IEBACiAJCS50cmlfcmVnID0gUElOR1JPVVBfUkVHKHIpLAkJCQlcCiAJCS50cmlfYmFuayA9IDEsCQkJCQkJXAogCQkudHJpX2JpdCA9IDQsCQkJCQkJXAotCQkuZWlucHV0X2JpdCA9IFBJTkdST1VQX0JJVF9ZKDUpLAkJCVwKKwkJLmVpbnB1dF9iaXQgPSA1LAkJCQkJXAogCQkub2RyYWluX2JpdCA9IFBJTkdST1VQX0JJVF8jI29kKDYpLAkJCVwKLQkJLmxvY2tfYml0ID0gUElOR1JPVVBfQklUX1koNyksCQkJCVwKKwkJLmxvY2tfYml0ID0gNywJCQkJCQlcCiAJCS5pb3Jlc2V0X2JpdCA9IFBJTkdST1VQX0JJVF8jI2lvcig4KSwJCQlcCiAJCS5yY3Zfc2VsX2JpdCA9IFBJTkdST1VQX0JJVF8jI3Jjdl9zZWwoOSksCQlcCiAJCS5kcnZfcmVnID0gLTEsCQkJCQkJXAogCX0KIAotI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHKHIpCQkoKHIpIC0gRFJWX1BJTkdST1VQX1JFR19BKQotCi0jZGVmaW5lIERSVl9QSU5HUk9VUChwZ19uYW1lLCByLCBoc21fYiwgc2NobWl0dF9iLCBscG1kX2IsCQlcCi0JCSAgICAgZHJ2ZG5fYiwgZHJ2ZG5fdywgZHJ2dXBfYiwgZHJ2dXBfdywJCVwKLQkJICAgICBzbHdyX2IsIHNsd3Jfdywgc2x3Zl9iLCBzbHdmX3csCQkJXAotCQkgICAgIGRydnR5cGUpCQkJCQkJXAorI2RlZmluZSBEUlZfUElOR1JPVVAocGdfbmFtZSwgciwgaHNtX2IsIHNjaG1pdHRfYiwgbHBtZF9iLCBkcnZkbl9iLAlcCisJCSAgICAgZHJ2ZG5fdywgZHJ2dXBfYiwgZHJ2dXBfdywgc2x3cl9iLCBzbHdyX3csCQlcCisJCSAgICAgc2x3Zl9iLCBzbHdmX3csIGRydnR5cGUpCQkJCVwKIAl7CQkJCQkJCQlcCiAJCS5uYW1lID0gImRyaXZlXyIgI3BnX25hbWUsCQkJCVwKIAkJLnBpbnMgPSBkcml2ZV8jI3BnX25hbWUjI19waW5zLAkJCQlcCkBAIC0xNzgyLDggKzE3ODEsNiBAQAogCQkuZHJ2dHlwZV9iaXQgPSBQSU5HUk9VUF9CSVRfIyNkcnZ0eXBlKDYpLAkJXAogCX0KIAotI2RlZmluZSBNSVBJX1BBRF9DVFJMX1BJTkdST1VQX1JFR19ZKHIpCSgocikgLSBNSVBJX1BBRF9DVFJMX1BJTkdST1VQX1JFR19BKQotCiAjZGVmaW5lIE1JUElfUEFEX0NUUkxfUElOR1JPVVAocGdfbmFtZSwgciwgYiwgZjAsIGYxKQkJCVwKIAl7CQkJCQkJCQlcCiAJCS5uYW1lID0gIm1pcGlfcGFkX2N0cmxfIiAjcGdfbmFtZSwJCQlcCkBAIC0yMDQ0LDggKzIwNDEsOCBAQAogCURSVl9QSU5HUk9VUChzZGlvNCwgICAgICAgMHg5YzQsICAyLCAgMywgIDQsICAxMiwgIDUsICAyMCwgIDUsICAyOCwgIDIsICAzMCwgIDIsICBOKSwKIAlEUlZfUElOR1JPVVAoYW80LCAgICAgICAgIDB4OWM4LCAgMiwgIDMsICA0LCAgMTIsICA3LCAgMjAsICA3LCAgMjgsICAyLCAgMzAsICAyLCAgWSksCiAKLQkvKgkJICAgICAgIHBnX25hbWUsIHIgICAgICBiICBmMCwgIGYxICovCi0JTUlQSV9QQURfQ1RSTF9QSU5HUk9VUChkc2lfYiwgICAweDgyMCwgMSwgQ1NJLCBEU0lfQikKKwkvKiAgICAgICAgICAgICAgICAgICAgIHBnX25hbWUsIHIsICAgICBiLCBmMCwgIGYxICovCisJTUlQSV9QQURfQ1RSTF9QSU5HUk9VUChkc2lfYiwgICAweDgyMCwgMSwgQ1NJLCBEU0lfQiksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX3BpbmN0cmxfc29jX2RhdGEgdGVncmExMjRfcGluY3RybCA9IHsKQEAgLTIwNTYsNiArMjA1Myw5IEBACiAJLm5mdW5jdGlvbnMgPSBBUlJBWV9TSVpFKHRlZ3JhMTI0X2Z1bmN0aW9ucyksCiAJLmdyb3VwcyA9IHRlZ3JhMTI0X2dyb3VwcywKIAkubmdyb3VwcyA9IEFSUkFZX1NJWkUodGVncmExMjRfZ3JvdXBzKSwKKwkuaHNtX2luX211eCA9IGZhbHNlLAorCS5zY2htaXR0X2luX211eCA9IGZhbHNlLAorCS5kcnZ0eXBlX2luX211eCA9IGZhbHNlLAogfTsKIAogc3RhdGljIGludCB0ZWdyYTEyNF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTIwLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTIwLmMKaW5kZXggZDNhNTcyMi4uNDgzM2RiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEyMC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMjAuYwpAQCAtMjIyMSw2ICsyMjIxLDkgQEAKIAkubmZ1bmN0aW9ucyA9IEFSUkFZX1NJWkUodGVncmEyMF9mdW5jdGlvbnMpLAogCS5ncm91cHMgPSB0ZWdyYTIwX2dyb3VwcywKIAkubmdyb3VwcyA9IEFSUkFZX1NJWkUodGVncmEyMF9ncm91cHMpLAorCS5oc21faW5fbXV4ID0gZmFsc2UsCisJLnNjaG1pdHRfaW5fbXV4ID0gZmFsc2UsCisJLmRydnR5cGVfaW5fbXV4ID0gZmFsc2UsCiB9OwogCiBzdGF0aWMgaW50IHRlZ3JhMjBfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEyMTAuYyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMjEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyYjQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMjEwLmMKQEAgLTAsMCArMSwxNTg4IEBACisvKgorICogUGluY3RybCBkYXRhIGZvciB0aGUgTlZJRElBIFRlZ3JhMjEwIHBpbm11eAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgTlZJRElBIENPUlBPUkFUSU9OLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5jdHJsLmg+CisjaW5jbHVkZSA8bGludXgvcGluY3RybC9waW5tdXguaD4KKworI2luY2x1ZGUgInBpbmN0cmwtdGVncmEuaCIKKworLyoKKyAqIE1vc3QgcGlucyBhZmZlY3RlZCBieSB0aGUgcGlubXV4IGNhbiBhbHNvIGJlIEdQSU9zLiBEZWZpbmUgdGhlc2UgZmlyc3QuCisgKiBUaGVzZSBtdXN0IG1hdGNoIGhvdyB0aGUgR1BJTyBkcml2ZXIgbmFtZXMvbnVtYmVycyBpdHMgcGlucy4KKyAqLworI2RlZmluZSBfR1BJTyhvZmZzZXQpCQkJCShvZmZzZXQpCisKKyNkZWZpbmUgVEVHUkFfUElOX1BFWF9MMF9SU1RfTl9QQTAJCV9HUElPKDApCisjZGVmaW5lIFRFR1JBX1BJTl9QRVhfTDBfQ0xLUkVRX05fUEExCQlfR1BJTygxKQorI2RlZmluZSBURUdSQV9QSU5fUEVYX1dBS0VfTl9QQTIJCV9HUElPKDIpCisjZGVmaW5lIFRFR1JBX1BJTl9QRVhfTDFfUlNUX05fUEEzCQlfR1BJTygzKQorI2RlZmluZSBURUdSQV9QSU5fUEVYX0wxX0NMS1JFUV9OX1BBNAkJX0dQSU8oNCkKKyNkZWZpbmUgVEVHUkFfUElOX1NBVEFfTEVEX0FDVElWRV9QQTUJCV9HUElPKDUpCisjZGVmaW5lIFRFR1JBX1BJTl9QQTYJCQkJX0dQSU8oNikKKyNkZWZpbmUgVEVHUkFfUElOX0RBUDFfRlNfUEIwCQkJX0dQSU8oOCkKKyNkZWZpbmUgVEVHUkFfUElOX0RBUDFfRElOX1BCMQkJCV9HUElPKDkpCisjZGVmaW5lIFRFR1JBX1BJTl9EQVAxX0RPVVRfUEIyCQkJX0dQSU8oMTApCisjZGVmaW5lIFRFR1JBX1BJTl9EQVAxX1NDTEtfUEIzCQkJX0dQSU8oMTEpCisjZGVmaW5lIFRFR1JBX1BJTl9TUEkyX01PU0lfUEI0CQkJX0dQSU8oMTIpCisjZGVmaW5lIFRFR1JBX1BJTl9TUEkyX01JU09fUEI1CQkJX0dQSU8oMTMpCisjZGVmaW5lIFRFR1JBX1BJTl9TUEkyX1NDS19QQjYJCQlfR1BJTygxNCkKKyNkZWZpbmUgVEVHUkFfUElOX1NQSTJfQ1MwX1BCNwkJCV9HUElPKDE1KQorI2RlZmluZSBURUdSQV9QSU5fU1BJMV9NT1NJX1BDMAkJCV9HUElPKDE2KQorI2RlZmluZSBURUdSQV9QSU5fU1BJMV9NSVNPX1BDMQkJCV9HUElPKDE3KQorI2RlZmluZSBURUdSQV9QSU5fU1BJMV9TQ0tfUEMyCQkJX0dQSU8oMTgpCisjZGVmaW5lIFRFR1JBX1BJTl9TUEkxX0NTMF9QQzMJCQlfR1BJTygxOSkKKyNkZWZpbmUgVEVHUkFfUElOX1NQSTFfQ1MxX1BDNAkJCV9HUElPKDIwKQorI2RlZmluZSBURUdSQV9QSU5fU1BJNF9TQ0tfUEM1CQkJX0dQSU8oMjEpCisjZGVmaW5lIFRFR1JBX1BJTl9TUEk0X0NTMF9QQzYJCQlfR1BJTygyMikKKyNkZWZpbmUgVEVHUkFfUElOX1NQSTRfTU9TSV9QQzcJCQlfR1BJTygyMykKKyNkZWZpbmUgVEVHUkFfUElOX1NQSTRfTUlTT19QRDAJCQlfR1BJTygyNCkKKyNkZWZpbmUgVEVHUkFfUElOX1VBUlQzX1RYX1BEMQkJCV9HUElPKDI1KQorI2RlZmluZSBURUdSQV9QSU5fVUFSVDNfUlhfUEQyCQkJX0dQSU8oMjYpCisjZGVmaW5lIFRFR1JBX1BJTl9VQVJUM19SVFNfUEQzCQkJX0dQSU8oMjcpCisjZGVmaW5lIFRFR1JBX1BJTl9VQVJUM19DVFNfUEQ0CQkJX0dQSU8oMjgpCisjZGVmaW5lIFRFR1JBX1BJTl9ETUlDMV9DTEtfUEUwCQkJX0dQSU8oMzIpCisjZGVmaW5lIFRFR1JBX1BJTl9ETUlDMV9EQVRfUEUxCQkJX0dQSU8oMzMpCisjZGVmaW5lIFRFR1JBX1BJTl9ETUlDMl9DTEtfUEUyCQkJX0dQSU8oMzQpCisjZGVmaW5lIFRFR1JBX1BJTl9ETUlDMl9EQVRfUEUzCQkJX0dQSU8oMzUpCisjZGVmaW5lIFRFR1JBX1BJTl9ETUlDM19DTEtfUEU0CQkJX0dQSU8oMzYpCisjZGVmaW5lIFRFR1JBX1BJTl9ETUlDM19EQVRfUEU1CQkJX0dQSU8oMzcpCisjZGVmaW5lIFRFR1JBX1BJTl9QRTYJCQkJX0dQSU8oMzgpCisjZGVmaW5lIFRFR1JBX1BJTl9QRTcJCQkJX0dQSU8oMzkpCisjZGVmaW5lIFRFR1JBX1BJTl9HRU4zX0kyQ19TQ0xfUEYwCQlfR1BJTyg0MCkKKyNkZWZpbmUgVEVHUkFfUElOX0dFTjNfSTJDX1NEQV9QRjEJCV9HUElPKDQxKQorI2RlZmluZSBURUdSQV9QSU5fVUFSVDJfVFhfUEcwCQkJX0dQSU8oNDgpCisjZGVmaW5lIFRFR1JBX1BJTl9VQVJUMl9SWF9QRzEJCQlfR1BJTyg0OSkKKyNkZWZpbmUgVEVHUkFfUElOX1VBUlQyX1JUU19QRzIJCQlfR1BJTyg1MCkKKyNkZWZpbmUgVEVHUkFfUElOX1VBUlQyX0NUU19QRzMJCQlfR1BJTyg1MSkKKyNkZWZpbmUgVEVHUkFfUElOX1dJRklfRU5fUEgwCQkJX0dQSU8oNTYpCisjZGVmaW5lIFRFR1JBX1BJTl9XSUZJX1JTVF9QSDEJCQlfR1BJTyg1NykKKyNkZWZpbmUgVEVHUkFfUElOX1dJRklfV0FLRV9BUF9QSDIJCV9HUElPKDU4KQorI2RlZmluZSBURUdSQV9QSU5fQVBfV0FLRV9CVF9QSDMJCV9HUElPKDU5KQorI2RlZmluZSBURUdSQV9QSU5fQlRfUlNUX1BINAkJCV9HUElPKDYwKQorI2RlZmluZSBURUdSQV9QSU5fQlRfV0FLRV9BUF9QSDUJCV9HUElPKDYxKQorI2RlZmluZSBURUdSQV9QSU5fUEg2CQkJCV9HUElPKDYyKQorI2RlZmluZSBURUdSQV9QSU5fQVBfV0FLRV9ORkNfUEg3CQlfR1BJTyg2MykKKyNkZWZpbmUgVEVHUkFfUElOX05GQ19FTl9QSTAJCQlfR1BJTyg2NCkKKyNkZWZpbmUgVEVHUkFfUElOX05GQ19JTlRfUEkxCQkJX0dQSU8oNjUpCisjZGVmaW5lIFRFR1JBX1BJTl9HUFNfRU5fUEkyCQkJX0dQSU8oNjYpCisjZGVmaW5lIFRFR1JBX1BJTl9HUFNfUlNUX1BJMwkJCV9HUElPKDY3KQorI2RlZmluZSBURUdSQV9QSU5fVUFSVDRfVFhfUEk0CQkJX0dQSU8oNjgpCisjZGVmaW5lIFRFR1JBX1BJTl9VQVJUNF9SWF9QSTUJCQlfR1BJTyg2OSkKKyNkZWZpbmUgVEVHUkFfUElOX1VBUlQ0X1JUU19QSTYJCQlfR1BJTyg3MCkKKyNkZWZpbmUgVEVHUkFfUElOX1VBUlQ0X0NUU19QSTcJCQlfR1BJTyg3MSkKKyNkZWZpbmUgVEVHUkFfUElOX0dFTjFfSTJDX1NEQV9QSjAJCV9HUElPKDcyKQorI2RlZmluZSBURUdSQV9QSU5fR0VOMV9JMkNfU0NMX1BKMQkJX0dQSU8oNzMpCisjZGVmaW5lIFRFR1JBX1BJTl9HRU4yX0kyQ19TQ0xfUEoyCQlfR1BJTyg3NCkKKyNkZWZpbmUgVEVHUkFfUElOX0dFTjJfSTJDX1NEQV9QSjMJCV9HUElPKDc1KQorI2RlZmluZSBURUdSQV9QSU5fREFQNF9GU19QSjQJCQlfR1BJTyg3NikKKyNkZWZpbmUgVEVHUkFfUElOX0RBUDRfRElOX1BKNQkJCV9HUElPKDc3KQorI2RlZmluZSBURUdSQV9QSU5fREFQNF9ET1VUX1BKNgkJCV9HUElPKDc4KQorI2RlZmluZSBURUdSQV9QSU5fREFQNF9TQ0xLX1BKNwkJCV9HUElPKDc5KQorI2RlZmluZSBURUdSQV9QSU5fUEswCQkJCV9HUElPKDgwKQorI2RlZmluZSBURUdSQV9QSU5fUEsxCQkJCV9HUElPKDgxKQorI2RlZmluZSBURUdSQV9QSU5fUEsyCQkJCV9HUElPKDgyKQorI2RlZmluZSBURUdSQV9QSU5fUEszCQkJCV9HUElPKDgzKQorI2RlZmluZSBURUdSQV9QSU5fUEs0CQkJCV9HUElPKDg0KQorI2RlZmluZSBURUdSQV9QSU5fUEs1CQkJCV9HUElPKDg1KQorI2RlZmluZSBURUdSQV9QSU5fUEs2CQkJCV9HUElPKDg2KQorI2RlZmluZSBURUdSQV9QSU5fUEs3CQkJCV9HUElPKDg3KQorI2RlZmluZSBURUdSQV9QSU5fUEwwCQkJCV9HUElPKDg4KQorI2RlZmluZSBURUdSQV9QSU5fUEwxCQkJCV9HUElPKDg5KQorI2RlZmluZSBURUdSQV9QSU5fU0RNTUMxX0NMS19QTTAJCV9HUElPKDk2KQorI2RlZmluZSBURUdSQV9QSU5fU0RNTUMxX0NNRF9QTTEJCV9HUElPKDk3KQorI2RlZmluZSBURUdSQV9QSU5fU0RNTUMxX0RBVDNfUE0yCQlfR1BJTyg5OCkKKyNkZWZpbmUgVEVHUkFfUElOX1NETU1DMV9EQVQyX1BNMwkJX0dQSU8oOTkpCisjZGVmaW5lIFRFR1JBX1BJTl9TRE1NQzFfREFUMV9QTTQJCV9HUElPKDEwMCkKKyNkZWZpbmUgVEVHUkFfUElOX1NETU1DMV9EQVQwX1BNNQkJX0dQSU8oMTAxKQorI2RlZmluZSBURUdSQV9QSU5fU0RNTUMzX0NMS19QUDAJCV9HUElPKDEyMCkKKyNkZWZpbmUgVEVHUkFfUElOX1NETU1DM19DTURfUFAxCQlfR1BJTygxMjEpCisjZGVmaW5lIFRFR1JBX1BJTl9TRE1NQzNfREFUM19QUDIJCV9HUElPKDEyMikKKyNkZWZpbmUgVEVHUkFfUElOX1NETU1DM19EQVQyX1BQMwkJX0dQSU8oMTIzKQorI2RlZmluZSBURUdSQV9QSU5fU0RNTUMzX0RBVDFfUFA0CQlfR1BJTygxMjQpCisjZGVmaW5lIFRFR1JBX1BJTl9TRE1NQzNfREFUMF9QUDUJCV9HUElPKDEyNSkKKyNkZWZpbmUgVEVHUkFfUElOX0NBTTFfTUNMS19QUzAJCQlfR1BJTygxNDQpCisjZGVmaW5lIFRFR1JBX1BJTl9DQU0yX01DTEtfUFMxCQkJX0dQSU8oMTQ1KQorI2RlZmluZSBURUdSQV9QSU5fQ0FNX0kyQ19TQ0xfUFMyCQlfR1BJTygxNDYpCisjZGVmaW5lIFRFR1JBX1BJTl9DQU1fSTJDX1NEQV9QUzMJCV9HUElPKDE0NykKKyNkZWZpbmUgVEVHUkFfUElOX0NBTV9SU1RfUFM0CQkJX0dQSU8oMTQ4KQorI2RlZmluZSBURUdSQV9QSU5fQ0FNX0FGX0VOX1BTNQkJCV9HUElPKDE0OSkKKyNkZWZpbmUgVEVHUkFfUElOX0NBTV9GTEFTSF9FTl9QUzYJCV9HUElPKDE1MCkKKyNkZWZpbmUgVEVHUkFfUElOX0NBTTFfUFdETl9QUzcJCQlfR1BJTygxNTEpCisjZGVmaW5lIFRFR1JBX1BJTl9DQU0yX1BXRE5fUFQwCQkJX0dQSU8oMTUyKQorI2RlZmluZSBURUdSQV9QSU5fQ0FNMV9TVFJPQkVfUFQxCQlfR1BJTygxNTMpCisjZGVmaW5lIFRFR1JBX1BJTl9VQVJUMV9UWF9QVTAJCQlfR1BJTygxNjApCisjZGVmaW5lIFRFR1JBX1BJTl9VQVJUMV9SWF9QVTEJCQlfR1BJTygxNjEpCisjZGVmaW5lIFRFR1JBX1BJTl9VQVJUMV9SVFNfUFUyCQkJX0dQSU8oMTYyKQorI2RlZmluZSBURUdSQV9QSU5fVUFSVDFfQ1RTX1BVMwkJCV9HUElPKDE2MykKKyNkZWZpbmUgVEVHUkFfUElOX0xDRF9CTF9QV01fUFYwCQlfR1BJTygxNjgpCisjZGVmaW5lIFRFR1JBX1BJTl9MQ0RfQkxfRU5fUFYxCQkJX0dQSU8oMTY5KQorI2RlZmluZSBURUdSQV9QSU5fTENEX1JTVF9QVjIJCQlfR1BJTygxNzApCisjZGVmaW5lIFRFR1JBX1BJTl9MQ0RfR1BJTzFfUFYzCQkJX0dQSU8oMTcxKQorI2RlZmluZSBURUdSQV9QSU5fTENEX0dQSU8yX1BWNAkJCV9HUElPKDE3MikKKyNkZWZpbmUgVEVHUkFfUElOX0FQX1JFQURZX1BWNQkJCV9HUElPKDE3MykKKyNkZWZpbmUgVEVHUkFfUElOX1RPVUNIX1JTVF9QVjYJCQlfR1BJTygxNzQpCisjZGVmaW5lIFRFR1JBX1BJTl9UT1VDSF9DTEtfUFY3CQkJX0dQSU8oMTc1KQorI2RlZmluZSBURUdSQV9QSU5fTU9ERU1fV0FLRV9BUF9QWDAJCV9HUElPKDE4NCkKKyNkZWZpbmUgVEVHUkFfUElOX1RPVUNIX0lOVF9QWDEJCQlfR1BJTygxODUpCisjZGVmaW5lIFRFR1JBX1BJTl9NT1RJT05fSU5UX1BYMgkJX0dQSU8oMTg2KQorI2RlZmluZSBURUdSQV9QSU5fQUxTX1BST1hfSU5UX1BYMwkJX0dQSU8oMTg3KQorI2RlZmluZSBURUdSQV9QSU5fVEVNUF9BTEVSVF9QWDQJCV9HUElPKDE4OCkKKyNkZWZpbmUgVEVHUkFfUElOX0JVVFRPTl9QT1dFUl9PTl9QWDUJCV9HUElPKDE4OSkKKyNkZWZpbmUgVEVHUkFfUElOX0JVVFRPTl9WT0xfVVBfUFg2CQlfR1BJTygxOTApCisjZGVmaW5lIFRFR1JBX1BJTl9CVVRUT05fVk9MX0RPV05fUFg3CQlfR1BJTygxOTEpCisjZGVmaW5lIFRFR1JBX1BJTl9CVVRUT05fU0xJREVfU1dfUFkwCQlfR1BJTygxOTIpCisjZGVmaW5lIFRFR1JBX1BJTl9CVVRUT05fSE9NRV9QWTEJCV9HUElPKDE5MykKKyNkZWZpbmUgVEVHUkFfUElOX0xDRF9URV9QWTIJCQlfR1BJTygxOTQpCisjZGVmaW5lIFRFR1JBX1BJTl9QV1JfSTJDX1NDTF9QWTMJCV9HUElPKDE5NSkKKyNkZWZpbmUgVEVHUkFfUElOX1BXUl9JMkNfU0RBX1BZNAkJX0dQSU8oMTk2KQorI2RlZmluZSBURUdSQV9QSU5fQ0xLXzMyS19PVVRfUFk1CQlfR1BJTygxOTcpCisjZGVmaW5lIFRFR1JBX1BJTl9QWjAJCQkJX0dQSU8oMjAwKQorI2RlZmluZSBURUdSQV9QSU5fUFoxCQkJCV9HUElPKDIwMSkKKyNkZWZpbmUgVEVHUkFfUElOX1BaMgkJCQlfR1BJTygyMDIpCisjZGVmaW5lIFRFR1JBX1BJTl9QWjMJCQkJX0dQSU8oMjAzKQorI2RlZmluZSBURUdSQV9QSU5fUFo0CQkJCV9HUElPKDIwNCkKKyNkZWZpbmUgVEVHUkFfUElOX1BaNQkJCQlfR1BJTygyMDUpCisjZGVmaW5lIFRFR1JBX1BJTl9EQVAyX0ZTX1BBQTAJCQlfR1BJTygyMDgpCisjZGVmaW5lIFRFR1JBX1BJTl9EQVAyX1NDTEtfUEFBMQkJX0dQSU8oMjA5KQorI2RlZmluZSBURUdSQV9QSU5fREFQMl9ESU5fUEFBMgkJCV9HUElPKDIxMCkKKyNkZWZpbmUgVEVHUkFfUElOX0RBUDJfRE9VVF9QQUEzCQlfR1BJTygyMTEpCisjZGVmaW5lIFRFR1JBX1BJTl9BVURfTUNMS19QQkIwCQkJX0dQSU8oMjE2KQorI2RlZmluZSBURUdSQV9QSU5fRFZGU19QV01fUEJCMQkJCV9HUElPKDIxNykKKyNkZWZpbmUgVEVHUkFfUElOX0RWRlNfQ0xLX1BCQjIJCQlfR1BJTygyMTgpCisjZGVmaW5lIFRFR1JBX1BJTl9HUElPX1gxX0FVRF9QQkIzCQlfR1BJTygyMTkpCisjZGVmaW5lIFRFR1JBX1BJTl9HUElPX1gzX0FVRF9QQkI0CQlfR1BJTygyMjApCisjZGVmaW5lIFRFR1JBX1BJTl9IRE1JX0NFQ19QQ0MwCQkJX0dQSU8oMjI0KQorI2RlZmluZSBURUdSQV9QSU5fSERNSV9JTlRfRFBfSFBEX1BDQzEJCV9HUElPKDIyNSkKKyNkZWZpbmUgVEVHUkFfUElOX1NQRElGX09VVF9QQ0MyCQlfR1BJTygyMjYpCisjZGVmaW5lIFRFR1JBX1BJTl9TUERJRl9JTl9QQ0MzCQkJX0dQSU8oMjI3KQorI2RlZmluZSBURUdSQV9QSU5fVVNCX1ZCVVNfRU4wX1BDQzQJCV9HUElPKDIyOCkKKyNkZWZpbmUgVEVHUkFfUElOX1VTQl9WQlVTX0VOMV9QQ0M1CQlfR1BJTygyMjkpCisjZGVmaW5lIFRFR1JBX1BJTl9EUF9IUEQwX1BDQzYJCQlfR1BJTygyMzApCisjZGVmaW5lIFRFR1JBX1BJTl9QQ0M3CQkJCV9HUElPKDIzMSkKKyNkZWZpbmUgVEVHUkFfUElOX1NQSTJfQ1MxX1BERDAJCQlfR1BJTygyMzIpCisjZGVmaW5lIFRFR1JBX1BJTl9RU1BJX1NDS19QRUUwCQkJX0dQSU8oMjQwKQorI2RlZmluZSBURUdSQV9QSU5fUVNQSV9DU19OX1BFRTEJCV9HUElPKDI0MSkKKyNkZWZpbmUgVEVHUkFfUElOX1FTUElfSU8wX1BFRTIJCQlfR1BJTygyNDIpCisjZGVmaW5lIFRFR1JBX1BJTl9RU1BJX0lPMV9QRUUzCQkJX0dQSU8oMjQzKQorI2RlZmluZSBURUdSQV9QSU5fUVNQSV9JTzJfUEVFNAkJCV9HUElPKDI0NCkKKyNkZWZpbmUgVEVHUkFfUElOX1FTUElfSU8zX1BFRTUJCQlfR1BJTygyNDUpCisKKy8qIEFsbCBub24tR1BJTyBwaW5zIGZvbGxvdyAqLworI2RlZmluZSBOVU1fR1BJT1MJCQkJKFRFR1JBX1BJTl9RU1BJX0lPM19QRUU1ICsgMSkKKyNkZWZpbmUgX1BJTihvZmZzZXQpCQkJCShOVU1fR1BJT1MgKyAob2Zmc2V0KSkKKworLyogTm9uLUdQSU8gcGlucyAqLworI2RlZmluZSBURUdSQV9QSU5fQ09SRV9QV1JfUkVRCQkJX1BJTigwKQorI2RlZmluZSBURUdSQV9QSU5fQ1BVX1BXUl9SRVEJCQlfUElOKDEpCisjZGVmaW5lIFRFR1JBX1BJTl9QV1JfSU5UX04JCQlfUElOKDIpCisjZGVmaW5lIFRFR1JBX1BJTl9DTEtfMzJLX0lOCQkJX1BJTigzKQorI2RlZmluZSBURUdSQV9QSU5fSlRBR19SVENLCQkJX1BJTig0KQorI2RlZmluZSBURUdSQV9QSU5fQkFUVF9CQ0wJCQlfUElOKDUpCisjZGVmaW5lIFRFR1JBX1BJTl9DTEtfUkVRCQkJX1BJTig2KQorI2RlZmluZSBURUdSQV9QSU5fU0hVVERPV04JCQlfUElOKDcpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGluY3RybF9waW5fZGVzYyB0ZWdyYTIxMF9waW5zW10gPSB7CisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1BFWF9MMF9SU1RfTl9QQTAsICJQRVhfTDBfUlNUX04gUEEwIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1BFWF9MMF9DTEtSRVFfTl9QQTEsICJQRVhfTDBfQ0xLUkVRX04gUEExIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1BFWF9XQUtFX05fUEEyLCAiUEVYX1dBS0VfTiBQQTIiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUEVYX0wxX1JTVF9OX1BBMywgIlBFWF9MMV9SU1RfTiBQQTMiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUEVYX0wxX0NMS1JFUV9OX1BBNCwgIlBFWF9MMV9DTEtSRVFfTiBQQTQiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0FUQV9MRURfQUNUSVZFX1BBNSwgIlNBVEFfTEVEX0FDVElWRSBQQTUiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUEE2LCAiUEE2IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RBUDFfRlNfUEIwLCAiREFQMV9GUyBQQjAiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fREFQMV9ESU5fUEIxLCAiREFQMV9ESU4gUEIxIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RBUDFfRE9VVF9QQjIsICJEQVAxX0RPVVQgUEIyIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RBUDFfU0NMS19QQjMsICJEQVAxX1NDTEsgUEIzIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NQSTJfTU9TSV9QQjQsICJTUEkyX01PU0kgUEI0IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NQSTJfTUlTT19QQjUsICJTUEkyX01JU08gUEI1IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NQSTJfU0NLX1BCNiwgIlNQSTJfU0NLIFBCNiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TUEkyX0NTMF9QQjcsICJTUEkyX0NTMCBQQjciKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fU1BJMV9NT1NJX1BDMCwgIlNQSTFfTU9TSSBQQzAiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fU1BJMV9NSVNPX1BDMSwgIlNQSTFfTUlTTyBQQzEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fU1BJMV9TQ0tfUEMyLCAiU1BJMV9TQ0sgUEMyIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NQSTFfQ1MwX1BDMywgIlNQSTFfQ1MwIFBDMyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TUEkxX0NTMV9QQzQsICJTUEkxX0NTMSBQQzQiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fU1BJNF9TQ0tfUEM1LCAiU1BJNF9TQ0sgUEM1IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NQSTRfQ1MwX1BDNiwgIlNQSTRfQ1MwIFBDNiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TUEk0X01PU0lfUEM3LCAiU1BJNF9NT1NJIFBDNyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TUEk0X01JU09fUEQwLCAiU1BJNF9NSVNPIFBEMCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9VQVJUM19UWF9QRDEsICJVQVJUM19UWCBQRDEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fVUFSVDNfUlhfUEQyLCAiVUFSVDNfUlggUEQyIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1VBUlQzX1JUU19QRDMsICJVQVJUM19SVFMgUEQzIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1VBUlQzX0NUU19QRDQsICJVQVJUM19DVFMgUEQ0IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RNSUMxX0NMS19QRTAsICJETUlDMV9DTEsgUEUwIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RNSUMxX0RBVF9QRTEsICJETUlDMV9EQVQgUEUxIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RNSUMyX0NMS19QRTIsICJETUlDMl9DTEsgUEUyIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RNSUMyX0RBVF9QRTMsICJETUlDMl9EQVQgUEUzIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RNSUMzX0NMS19QRTQsICJETUlDM19DTEsgUEU0IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RNSUMzX0RBVF9QRTUsICJETUlDM19EQVQgUEU1IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1BFNiwgIlBFNiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QRTcsICJQRTciKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fR0VOM19JMkNfU0NMX1BGMCwgIkdFTjNfSTJDX1NDTCBQRjAiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fR0VOM19JMkNfU0RBX1BGMSwgIkdFTjNfSTJDX1NEQSBQRjEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fVUFSVDJfVFhfUEcwLCAiVUFSVDJfVFggUEcwIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1VBUlQyX1JYX1BHMSwgIlVBUlQyX1JYIFBHMSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9VQVJUMl9SVFNfUEcyLCAiVUFSVDJfUlRTIFBHMiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9VQVJUMl9DVFNfUEczLCAiVUFSVDJfQ1RTIFBHMyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9XSUZJX0VOX1BIMCwgIldJRklfRU4gUEgwIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1dJRklfUlNUX1BIMSwgIldJRklfUlNUIFBIMSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9XSUZJX1dBS0VfQVBfUEgyLCAiV0lGSV9XQUtFX0FQIFBIMiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9BUF9XQUtFX0JUX1BIMywgIkFQX1dBS0VfQlQgUEgzIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0JUX1JTVF9QSDQsICJCVF9SU1QgUEg0IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0JUX1dBS0VfQVBfUEg1LCAiQlRfV0FLRV9BUCBQSDUiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUEg2LCAiUEg2IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0FQX1dBS0VfTkZDX1BINywgIkFQX1dBS0VfTkZDIFBINyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9ORkNfRU5fUEkwLCAiTkZDX0VOIFBJMCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9ORkNfSU5UX1BJMSwgIk5GQ19JTlQgUEkxIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0dQU19FTl9QSTIsICJHUFNfRU4gUEkyIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0dQU19SU1RfUEkzLCAiR1BTX1JTVCBQSTMiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fVUFSVDRfVFhfUEk0LCAiVUFSVDRfVFggUEk0IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1VBUlQ0X1JYX1BJNSwgIlVBUlQ0X1JYIFBJNSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9VQVJUNF9SVFNfUEk2LCAiVUFSVDRfUlRTIFBJNiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9VQVJUNF9DVFNfUEk3LCAiVUFSVDRfQ1RTIFBJNyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9HRU4xX0kyQ19TREFfUEowLCAiR0VOMV9JMkNfU0RBIFBKMCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9HRU4xX0kyQ19TQ0xfUEoxLCAiR0VOMV9JMkNfU0NMIFBKMSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9HRU4yX0kyQ19TQ0xfUEoyLCAiR0VOMl9JMkNfU0NMIFBKMiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9HRU4yX0kyQ19TREFfUEozLCAiR0VOMl9JMkNfU0RBIFBKMyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9EQVA0X0ZTX1BKNCwgIkRBUDRfRlMgUEo0IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RBUDRfRElOX1BKNSwgIkRBUDRfRElOIFBKNSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9EQVA0X0RPVVRfUEo2LCAiREFQNF9ET1VUIFBKNiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9EQVA0X1NDTEtfUEo3LCAiREFQNF9TQ0xLIFBKNyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QSzAsICJQSzAiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUEsxLCAiUEsxIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1BLMiwgIlBLMiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QSzMsICJQSzMiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUEs0LCAiUEs0IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1BLNSwgIlBLNSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QSzYsICJQSzYiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUEs3LCAiUEs3IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1BMMCwgIlBMMCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QTDEsICJQTDEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0RNTUMxX0NMS19QTTAsICJTRE1NQzFfQ0xLIFBNMCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TRE1NQzFfQ01EX1BNMSwgIlNETU1DMV9DTUQgUE0xIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NETU1DMV9EQVQzX1BNMiwgIlNETU1DMV9EQVQzIFBNMiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TRE1NQzFfREFUMl9QTTMsICJTRE1NQzFfREFUMiBQTTMiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0RNTUMxX0RBVDFfUE00LCAiU0RNTUMxX0RBVDEgUE00IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NETU1DMV9EQVQwX1BNNSwgIlNETU1DMV9EQVQwIFBNNSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TRE1NQzNfQ0xLX1BQMCwgIlNETU1DM19DTEsgUFAwIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NETU1DM19DTURfUFAxLCAiU0RNTUMzX0NNRCBQUDEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0RNTUMzX0RBVDNfUFAyLCAiU0RNTUMzX0RBVDMgUFAyIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NETU1DM19EQVQyX1BQMywgIlNETU1DM19EQVQyIFBQMyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TRE1NQzNfREFUMV9QUDQsICJTRE1NQzNfREFUMSBQUDQiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0RNTUMzX0RBVDBfUFA1LCAiU0RNTUMzX0RBVDAgUFA1IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NBTTFfTUNMS19QUzAsICJDQU0xX01DTEsgUFMwIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NBTTJfTUNMS19QUzEsICJDQU0yX01DTEsgUFMxIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0NBTV9JMkNfU0NMX1BTMiwgIkNBTV9JMkNfU0NMIFBTMiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DQU1fSTJDX1NEQV9QUzMsICJDQU1fSTJDX1NEQSBQUzMiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ0FNX1JTVF9QUzQsICJDQU1fUlNUIFBTNCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DQU1fQUZfRU5fUFM1LCAiQ0FNX0FGX0VOIFBTNSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DQU1fRkxBU0hfRU5fUFM2LCAiQ0FNX0ZMQVNIX0VOIFBTNiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DQU0xX1BXRE5fUFM3LCAiQ0FNMV9QV0ROIFBTNyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DQU0yX1BXRE5fUFQwLCAiQ0FNMl9QV0ROIFBUMCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DQU0xX1NUUk9CRV9QVDEsICJDQU0xX1NUUk9CRSBQVDEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fVUFSVDFfVFhfUFUwLCAiVUFSVDFfVFggUFUwIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1VBUlQxX1JYX1BVMSwgIlVBUlQxX1JYIFBVMSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9VQVJUMV9SVFNfUFUyLCAiVUFSVDFfUlRTIFBVMiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9VQVJUMV9DVFNfUFUzLCAiVUFSVDFfQ1RTIFBVMyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9MQ0RfQkxfUFdNX1BWMCwgIkxDRF9CTF9QV00gUFYwIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0xDRF9CTF9FTl9QVjEsICJMQ0RfQkxfRU4gUFYxIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0xDRF9SU1RfUFYyLCAiTENEX1JTVCBQVjIiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fTENEX0dQSU8xX1BWMywgIkxDRF9HUElPMSBQVjMiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fTENEX0dQSU8yX1BWNCwgIkxDRF9HUElPMiBQVjQiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQVBfUkVBRFlfUFY1LCAiQVBfUkVBRFkgUFY1IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1RPVUNIX1JTVF9QVjYsICJUT1VDSF9SU1QgUFY2IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1RPVUNIX0NMS19QVjcsICJUT1VDSF9DTEsgUFY3IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX01PREVNX1dBS0VfQVBfUFgwLCAiTU9ERU1fV0FLRV9BUCBQWDAiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fVE9VQ0hfSU5UX1BYMSwgIlRPVUNIX0lOVCBQWDEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fTU9USU9OX0lOVF9QWDIsICJNT1RJT05fSU5UIFBYMiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9BTFNfUFJPWF9JTlRfUFgzLCAiQUxTX1BST1hfSU5UIFBYMyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9URU1QX0FMRVJUX1BYNCwgIlRFTVBfQUxFUlQgUFg0IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0JVVFRPTl9QT1dFUl9PTl9QWDUsICJCVVRUT05fUE9XRVJfT04gUFg1IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0JVVFRPTl9WT0xfVVBfUFg2LCAiQlVUVE9OX1ZPTF9VUCBQWDYiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQlVUVE9OX1ZPTF9ET1dOX1BYNywgIkJVVFRPTl9WT0xfRE9XTiBQWDciKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQlVUVE9OX1NMSURFX1NXX1BZMCwgIkJVVFRPTl9TTElERV9TVyBQWTAiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQlVUVE9OX0hPTUVfUFkxLCAiQlVUVE9OX0hPTUUgUFkxIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0xDRF9URV9QWTIsICJMQ0RfVEUgUFkyIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1BXUl9JMkNfU0NMX1BZMywgIlBXUl9JMkNfU0NMIFBZMyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QV1JfSTJDX1NEQV9QWTQsICJQV1JfSTJDX1NEQSBQWTQiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ0xLXzMyS19PVVRfUFk1LCAiQ0xLXzMyS19PVVQgUFk1IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1BaMCwgIlBaMCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QWjEsICJQWjEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUFoyLCAiUFoyIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1BaMywgIlBaMyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QWjQsICJQWjQiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUFo1LCAiUFo1IiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RBUDJfRlNfUEFBMCwgIkRBUDJfRlMgUEFBMCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9EQVAyX1NDTEtfUEFBMSwgIkRBUDJfU0NMSyBQQUExIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RBUDJfRElOX1BBQTIsICJEQVAyX0RJTiBQQUEyIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0RBUDJfRE9VVF9QQUEzLCAiREFQMl9ET1VUIFBBQTMiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQVVEX01DTEtfUEJCMCwgIkFVRF9NQ0xLIFBCQjAiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fRFZGU19QV01fUEJCMSwgIkRWRlNfUFdNIFBCQjEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fRFZGU19DTEtfUEJCMiwgIkRWRlNfQ0xLIFBCQjIiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fR1BJT19YMV9BVURfUEJCMywgIkdQSU9fWDFfQVVEIFBCQjMiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fR1BJT19YM19BVURfUEJCNCwgIkdQSU9fWDNfQVVEIFBCQjQiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fSERNSV9DRUNfUENDMCwgIkhETUlfQ0VDIFBDQzAiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fSERNSV9JTlRfRFBfSFBEX1BDQzEsICJIRE1JX0lOVF9EUF9IUEQgUENDMSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9TUERJRl9PVVRfUENDMiwgIlNQRElGX09VVCBQQ0MyIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1NQRElGX0lOX1BDQzMsICJTUERJRl9JTiBQQ0MzIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX1VTQl9WQlVTX0VOMF9QQ0M0LCAiVVNCX1ZCVVNfRU4wIFBDQzQiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fVVNCX1ZCVVNfRU4xX1BDQzUsICJVU0JfVkJVU19FTjEgUENDNSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9EUF9IUEQwX1BDQzYsICJEUF9IUEQwIFBDQzYiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUENDNywgIlBDQzciKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fU1BJMl9DUzFfUEREMCwgIlNQSTJfQ1MxIFBERDAiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUVNQSV9TQ0tfUEVFMCwgIlFTUElfU0NLIFBFRTAiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fUVNQSV9DU19OX1BFRTEsICJRU1BJX0NTX04gUEVFMSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9RU1BJX0lPMF9QRUUyLCAiUVNQSV9JTzAgUEVFMiIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9RU1BJX0lPMV9QRUUzLCAiUVNQSV9JTzEgUEVFMyIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9RU1BJX0lPMl9QRUU0LCAiUVNQSV9JTzIgUEVFNCIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9RU1BJX0lPM19QRUU1LCAiUVNQSV9JTzMgUEVFNSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9DT1JFX1BXUl9SRVEsICJDT1JFX1BXUl9SRVEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ1BVX1BXUl9SRVEsICJDUFVfUFdSX1JFUSIpLAorCVBJTkNUUkxfUElOKFRFR1JBX1BJTl9QV1JfSU5UX04sICJQV1JfSU5UX04iKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ0xLXzMyS19JTiwgIkNMS18zMktfSU4iKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fSlRBR19SVENLLCAiSlRBR19SVENLIiksCisJUElOQ1RSTF9QSU4oVEVHUkFfUElOX0JBVFRfQkNMLCAiQkFUVF9CQ0wiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fQ0xLX1JFUSwgIkNMS19SRVEiKSwKKwlQSU5DVFJMX1BJTihURUdSQV9QSU5fU0hVVERPV04sICJTSFVURE9XTiIpLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHBleF9sMF9yc3Rfbl9wYTBfcGluc1tdID0geworCVRFR1JBX1BJTl9QRVhfTDBfUlNUX05fUEEwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHBleF9sMF9jbGtyZXFfbl9wYTFfcGluc1tdID0geworCVRFR1JBX1BJTl9QRVhfTDBfQ0xLUkVRX05fUEExLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHBleF93YWtlX25fcGEyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUEVYX1dBS0VfTl9QQTIsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcGV4X2wxX3JzdF9uX3BhM19waW5zW10gPSB7CisJVEVHUkFfUElOX1BFWF9MMV9SU1RfTl9QQTMsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcGV4X2wxX2Nsa3JlcV9uX3BhNF9waW5zW10gPSB7CisJVEVHUkFfUElOX1BFWF9MMV9DTEtSRVFfTl9QQTQsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2F0YV9sZWRfYWN0aXZlX3BhNV9waW5zW10gPSB7CisJVEVHUkFfUElOX1NBVEFfTEVEX0FDVElWRV9QQTUsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcGE2X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUEE2LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRhcDFfZnNfcGIwX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fREFQMV9GU19QQjAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZGFwMV9kaW5fcGIxX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fREFQMV9ESU5fUEIxLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRhcDFfZG91dF9wYjJfcGluc1tdID0geworCVRFR1JBX1BJTl9EQVAxX0RPVVRfUEIyLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRhcDFfc2Nsa19wYjNfcGluc1tdID0geworCVRFR1JBX1BJTl9EQVAxX1NDTEtfUEIzLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwaTJfbW9zaV9wYjRfcGluc1tdID0geworCVRFR1JBX1BJTl9TUEkyX01PU0lfUEI0LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwaTJfbWlzb19wYjVfcGluc1tdID0geworCVRFR1JBX1BJTl9TUEkyX01JU09fUEI1LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwaTJfc2NrX3BiNl9waW5zW10gPSB7CisJVEVHUkFfUElOX1NQSTJfU0NLX1BCNiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcGkyX2NzMF9wYjdfcGluc1tdID0geworCVRFR1JBX1BJTl9TUEkyX0NTMF9QQjcsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3BpMV9tb3NpX3BjMF9waW5zW10gPSB7CisJVEVHUkFfUElOX1NQSTFfTU9TSV9QQzAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3BpMV9taXNvX3BjMV9waW5zW10gPSB7CisJVEVHUkFfUElOX1NQSTFfTUlTT19QQzEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3BpMV9zY2tfcGMyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fU1BJMV9TQ0tfUEMyLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwaTFfY3MwX3BjM19waW5zW10gPSB7CisJVEVHUkFfUElOX1NQSTFfQ1MwX1BDMywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcGkxX2NzMV9wYzRfcGluc1tdID0geworCVRFR1JBX1BJTl9TUEkxX0NTMV9QQzQsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3BpNF9zY2tfcGM1X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fU1BJNF9TQ0tfUEM1LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwaTRfY3MwX3BjNl9waW5zW10gPSB7CisJVEVHUkFfUElOX1NQSTRfQ1MwX1BDNiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcGk0X21vc2lfcGM3X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fU1BJNF9NT1NJX1BDNywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcGk0X21pc29fcGQwX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fU1BJNF9NSVNPX1BEMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0M190eF9wZDFfcGluc1tdID0geworCVRFR1JBX1BJTl9VQVJUM19UWF9QRDEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgdWFydDNfcnhfcGQyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fVUFSVDNfUlhfUEQyLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVhcnQzX3J0c19wZDNfcGluc1tdID0geworCVRFR1JBX1BJTl9VQVJUM19SVFNfUEQzLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVhcnQzX2N0c19wZDRfcGluc1tdID0geworCVRFR1JBX1BJTl9VQVJUM19DVFNfUEQ0LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRtaWMxX2Nsa19wZTBfcGluc1tdID0geworCVRFR1JBX1BJTl9ETUlDMV9DTEtfUEUwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRtaWMxX2RhdF9wZTFfcGluc1tdID0geworCVRFR1JBX1BJTl9ETUlDMV9EQVRfUEUxLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRtaWMyX2Nsa19wZTJfcGluc1tdID0geworCVRFR1JBX1BJTl9ETUlDMl9DTEtfUEUyLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRtaWMyX2RhdF9wZTNfcGluc1tdID0geworCVRFR1JBX1BJTl9ETUlDMl9EQVRfUEUzLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRtaWMzX2Nsa19wZTRfcGluc1tdID0geworCVRFR1JBX1BJTl9ETUlDM19DTEtfUEU0LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRtaWMzX2RhdF9wZTVfcGluc1tdID0geworCVRFR1JBX1BJTl9ETUlDM19EQVRfUEU1LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHBlNl9waW5zW10gPSB7CisJVEVHUkFfUElOX1BFNiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwZTdfcGluc1tdID0geworCVRFR1JBX1BJTl9QRTcsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZ2VuM19pMmNfc2NsX3BmMF9waW5zW10gPSB7CisJVEVHUkFfUElOX0dFTjNfSTJDX1NDTF9QRjAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZ2VuM19pMmNfc2RhX3BmMV9waW5zW10gPSB7CisJVEVHUkFfUElOX0dFTjNfSTJDX1NEQV9QRjEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgdWFydDJfdHhfcGcwX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fVUFSVDJfVFhfUEcwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVhcnQyX3J4X3BnMV9waW5zW10gPSB7CisJVEVHUkFfUElOX1VBUlQyX1JYX1BHMSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0Ml9ydHNfcGcyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fVUFSVDJfUlRTX1BHMiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0Ml9jdHNfcGczX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fVUFSVDJfQ1RTX1BHMywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB3aWZpX2VuX3BoMF9waW5zW10gPSB7CisJVEVHUkFfUElOX1dJRklfRU5fUEgwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHdpZmlfcnN0X3BoMV9waW5zW10gPSB7CisJVEVHUkFfUElOX1dJRklfUlNUX1BIMSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB3aWZpX3dha2VfYXBfcGgyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fV0lGSV9XQUtFX0FQX1BIMiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBhcF93YWtlX2J0X3BoM19waW5zW10gPSB7CisJVEVHUkFfUElOX0FQX1dBS0VfQlRfUEgzLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGJ0X3JzdF9waDRfcGluc1tdID0geworCVRFR1JBX1BJTl9CVF9SU1RfUEg0LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGJ0X3dha2VfYXBfcGg1X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQlRfV0FLRV9BUF9QSDUsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcGg2X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUEg2LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGFwX3dha2VfbmZjX3BoN19waW5zW10gPSB7CisJVEVHUkFfUElOX0FQX1dBS0VfTkZDX1BINywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBuZmNfZW5fcGkwX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fTkZDX0VOX1BJMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBuZmNfaW50X3BpMV9waW5zW10gPSB7CisJVEVHUkFfUElOX05GQ19JTlRfUEkxLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGdwc19lbl9waTJfcGluc1tdID0geworCVRFR1JBX1BJTl9HUFNfRU5fUEkyLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGdwc19yc3RfcGkzX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fR1BTX1JTVF9QSTMsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgdWFydDRfdHhfcGk0X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fVUFSVDRfVFhfUEk0LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVhcnQ0X3J4X3BpNV9waW5zW10gPSB7CisJVEVHUkFfUElOX1VBUlQ0X1JYX1BJNSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0NF9ydHNfcGk2X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fVUFSVDRfUlRTX1BJNiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0NF9jdHNfcGk3X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fVUFSVDRfQ1RTX1BJNywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBnZW4xX2kyY19zZGFfcGowX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fR0VOMV9JMkNfU0RBX1BKMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBnZW4xX2kyY19zY2xfcGoxX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fR0VOMV9JMkNfU0NMX1BKMSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBnZW4yX2kyY19zY2xfcGoyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fR0VOMl9JMkNfU0NMX1BKMiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBnZW4yX2kyY19zZGFfcGozX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fR0VOMl9JMkNfU0RBX1BKMywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkYXA0X2ZzX3BqNF9waW5zW10gPSB7CisJVEVHUkFfUElOX0RBUDRfRlNfUEo0LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRhcDRfZGluX3BqNV9waW5zW10gPSB7CisJVEVHUkFfUElOX0RBUDRfRElOX1BKNSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkYXA0X2RvdXRfcGo2X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fREFQNF9ET1VUX1BKNiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkYXA0X3NjbGtfcGo3X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fREFQNF9TQ0xLX1BKNywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwazBfcGluc1tdID0geworCVRFR1JBX1BJTl9QSzAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcGsxX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUEsxLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHBrMl9waW5zW10gPSB7CisJVEVHUkFfUElOX1BLMiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwazNfcGluc1tdID0geworCVRFR1JBX1BJTl9QSzMsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcGs0X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUEs0LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHBrNV9waW5zW10gPSB7CisJVEVHUkFfUElOX1BLNSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwazZfcGluc1tdID0geworCVRFR1JBX1BJTl9QSzYsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcGs3X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUEs3LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHBsMF9waW5zW10gPSB7CisJVEVHUkFfUElOX1BMMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwbDFfcGluc1tdID0geworCVRFR1JBX1BJTl9QTDEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2RtbWMxX2Nsa19wbTBfcGluc1tdID0geworCVRFR1JBX1BJTl9TRE1NQzFfQ0xLX1BNMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzZG1tYzFfY21kX3BtMV9waW5zW10gPSB7CisJVEVHUkFfUElOX1NETU1DMV9DTURfUE0xLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNkbW1jMV9kYXQzX3BtMl9waW5zW10gPSB7CisJVEVHUkFfUElOX1NETU1DMV9EQVQzX1BNMiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzZG1tYzFfZGF0Ml9wbTNfcGluc1tdID0geworCVRFR1JBX1BJTl9TRE1NQzFfREFUMl9QTTMsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2RtbWMxX2RhdDFfcG00X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fU0RNTUMxX0RBVDFfUE00LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNkbW1jMV9kYXQwX3BtNV9waW5zW10gPSB7CisJVEVHUkFfUElOX1NETU1DMV9EQVQwX1BNNSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzZG1tYzNfY2xrX3BwMF9waW5zW10gPSB7CisJVEVHUkFfUElOX1NETU1DM19DTEtfUFAwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNkbW1jM19jbWRfcHAxX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fU0RNTUMzX0NNRF9QUDEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2RtbWMzX2RhdDNfcHAyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fU0RNTUMzX0RBVDNfUFAyLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNkbW1jM19kYXQyX3BwM19waW5zW10gPSB7CisJVEVHUkFfUElOX1NETU1DM19EQVQyX1BQMywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzZG1tYzNfZGF0MV9wcDRfcGluc1tdID0geworCVRFR1JBX1BJTl9TRE1NQzNfREFUMV9QUDQsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2RtbWMzX2RhdDBfcHA1X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fU0RNTUMzX0RBVDBfUFA1LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNhbTFfbWNsa19wczBfcGluc1tdID0geworCVRFR1JBX1BJTl9DQU0xX01DTEtfUFMwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNhbTJfbWNsa19wczFfcGluc1tdID0geworCVRFR1JBX1BJTl9DQU0yX01DTEtfUFMxLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNhbV9pMmNfc2NsX3BzMl9waW5zW10gPSB7CisJVEVHUkFfUElOX0NBTV9JMkNfU0NMX1BTMiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjYW1faTJjX3NkYV9wczNfcGluc1tdID0geworCVRFR1JBX1BJTl9DQU1fSTJDX1NEQV9QUzMsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2FtX3JzdF9wczRfcGluc1tdID0geworCVRFR1JBX1BJTl9DQU1fUlNUX1BTNCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjYW1fYWZfZW5fcHM1X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQ0FNX0FGX0VOX1BTNSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjYW1fZmxhc2hfZW5fcHM2X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQ0FNX0ZMQVNIX0VOX1BTNiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjYW0xX3B3ZG5fcHM3X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQ0FNMV9QV0ROX1BTNywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjYW0yX3B3ZG5fcHQwX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQ0FNMl9QV0ROX1BUMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjYW0xX3N0cm9iZV9wdDFfcGluc1tdID0geworCVRFR1JBX1BJTl9DQU0xX1NUUk9CRV9QVDEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgdWFydDFfdHhfcHUwX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fVUFSVDFfVFhfUFUwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVhcnQxX3J4X3B1MV9waW5zW10gPSB7CisJVEVHUkFfUElOX1VBUlQxX1JYX1BVMSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0MV9ydHNfcHUyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fVUFSVDFfUlRTX1BVMiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB1YXJ0MV9jdHNfcHUzX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fVUFSVDFfQ1RTX1BVMywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBsY2RfYmxfcHdtX3B2MF9waW5zW10gPSB7CisJVEVHUkFfUElOX0xDRF9CTF9QV01fUFYwLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxjZF9ibF9lbl9wdjFfcGluc1tdID0geworCVRFR1JBX1BJTl9MQ0RfQkxfRU5fUFYxLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxjZF9yc3RfcHYyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fTENEX1JTVF9QVjIsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbGNkX2dwaW8xX3B2M19waW5zW10gPSB7CisJVEVHUkFfUElOX0xDRF9HUElPMV9QVjMsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbGNkX2dwaW8yX3B2NF9waW5zW10gPSB7CisJVEVHUkFfUElOX0xDRF9HUElPMl9QVjQsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgYXBfcmVhZHlfcHY1X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQVBfUkVBRFlfUFY1LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHRvdWNoX3JzdF9wdjZfcGluc1tdID0geworCVRFR1JBX1BJTl9UT1VDSF9SU1RfUFY2LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHRvdWNoX2Nsa19wdjdfcGluc1tdID0geworCVRFR1JBX1BJTl9UT1VDSF9DTEtfUFY3LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1vZGVtX3dha2VfYXBfcHgwX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fTU9ERU1fV0FLRV9BUF9QWDAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgdG91Y2hfaW50X3B4MV9waW5zW10gPSB7CisJVEVHUkFfUElOX1RPVUNIX0lOVF9QWDEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbW90aW9uX2ludF9weDJfcGluc1tdID0geworCVRFR1JBX1BJTl9NT1RJT05fSU5UX1BYMiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBhbHNfcHJveF9pbnRfcHgzX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQUxTX1BST1hfSU5UX1BYMywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCB0ZW1wX2FsZXJ0X3B4NF9waW5zW10gPSB7CisJVEVHUkFfUElOX1RFTVBfQUxFUlRfUFg0LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGJ1dHRvbl9wb3dlcl9vbl9weDVfcGluc1tdID0geworCVRFR1JBX1BJTl9CVVRUT05fUE9XRVJfT05fUFg1LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGJ1dHRvbl92b2xfdXBfcHg2X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQlVUVE9OX1ZPTF9VUF9QWDYsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgYnV0dG9uX3ZvbF9kb3duX3B4N19waW5zW10gPSB7CisJVEVHUkFfUElOX0JVVFRPTl9WT0xfRE9XTl9QWDcsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgYnV0dG9uX3NsaWRlX3N3X3B5MF9waW5zW10gPSB7CisJVEVHUkFfUElOX0JVVFRPTl9TTElERV9TV19QWTAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgYnV0dG9uX2hvbWVfcHkxX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQlVUVE9OX0hPTUVfUFkxLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxjZF90ZV9weTJfcGluc1tdID0geworCVRFR1JBX1BJTl9MQ0RfVEVfUFkyLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHB3cl9pMmNfc2NsX3B5M19waW5zW10gPSB7CisJVEVHUkFfUElOX1BXUl9JMkNfU0NMX1BZMywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwd3JfaTJjX3NkYV9weTRfcGluc1tdID0geworCVRFR1JBX1BJTl9QV1JfSTJDX1NEQV9QWTQsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2xrXzMya19vdXRfcHk1X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQ0xLXzMyS19PVVRfUFk1LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHB6MF9waW5zW10gPSB7CisJVEVHUkFfUElOX1BaMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwejFfcGluc1tdID0geworCVRFR1JBX1BJTl9QWjEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcHoyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUFoyLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHB6M19waW5zW10gPSB7CisJVEVHUkFfUElOX1BaMywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwejRfcGluc1tdID0geworCVRFR1JBX1BJTl9QWjQsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcHo1X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUFo1LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRhcDJfZnNfcGFhMF9waW5zW10gPSB7CisJVEVHUkFfUElOX0RBUDJfRlNfUEFBMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkYXAyX3NjbGtfcGFhMV9waW5zW10gPSB7CisJVEVHUkFfUElOX0RBUDJfU0NMS19QQUExLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRhcDJfZGluX3BhYTJfcGluc1tdID0geworCVRFR1JBX1BJTl9EQVAyX0RJTl9QQUEyLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRhcDJfZG91dF9wYWEzX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fREFQMl9ET1VUX1BBQTMsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgYXVkX21jbGtfcGJiMF9waW5zW10gPSB7CisJVEVHUkFfUElOX0FVRF9NQ0xLX1BCQjAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHZmc19wd21fcGJiMV9waW5zW10gPSB7CisJVEVHUkFfUElOX0RWRlNfUFdNX1BCQjEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHZmc19jbGtfcGJiMl9waW5zW10gPSB7CisJVEVHUkFfUElOX0RWRlNfQ0xLX1BCQjIsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZ3Bpb194MV9hdWRfcGJiM19waW5zW10gPSB7CisJVEVHUkFfUElOX0dQSU9fWDFfQVVEX1BCQjMsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZ3Bpb194M19hdWRfcGJiNF9waW5zW10gPSB7CisJVEVHUkFfUElOX0dQSU9fWDNfQVVEX1BCQjQsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaGRtaV9jZWNfcGNjMF9waW5zW10gPSB7CisJVEVHUkFfUElOX0hETUlfQ0VDX1BDQzAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaGRtaV9pbnRfZHBfaHBkX3BjYzFfcGluc1tdID0geworCVRFR1JBX1BJTl9IRE1JX0lOVF9EUF9IUERfUENDMSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzcGRpZl9vdXRfcGNjMl9waW5zW10gPSB7CisJVEVHUkFfUElOX1NQRElGX09VVF9QQ0MyLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNwZGlmX2luX3BjYzNfcGluc1tdID0geworCVRFR1JBX1BJTl9TUERJRl9JTl9QQ0MzLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHVzYl92YnVzX2VuMF9wY2M0X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fVVNCX1ZCVVNfRU4wX1BDQzQsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgdXNiX3ZidXNfZW4xX3BjYzVfcGluc1tdID0geworCVRFR1JBX1BJTl9VU0JfVkJVU19FTjFfUENDNSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcF9ocGQwX3BjYzZfcGluc1tdID0geworCVRFR1JBX1BJTl9EUF9IUEQwX1BDQzYsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcGNjN19waW5zW10gPSB7CisJVEVHUkFfUElOX1BDQzcsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc3BpMl9jczFfcGRkMF9waW5zW10gPSB7CisJVEVHUkFfUElOX1NQSTJfQ1MxX1BERDAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcXNwaV9zY2tfcGVlMF9waW5zW10gPSB7CisJVEVHUkFfUElOX1FTUElfU0NLX1BFRTAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgcXNwaV9jc19uX3BlZTFfcGluc1tdID0geworCVRFR1JBX1BJTl9RU1BJX0NTX05fUEVFMSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBxc3BpX2lvMF9wZWUyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUVNQSV9JTzBfUEVFMiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBxc3BpX2lvMV9wZWUzX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUVNQSV9JTzFfUEVFMywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBxc3BpX2lvMl9wZWU0X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUVNQSV9JTzJfUEVFNCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBxc3BpX2lvM19wZWU1X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUVNQSV9JTzNfUEVFNSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjb3JlX3B3cl9yZXFfcGluc1tdID0geworCVRFR1JBX1BJTl9DT1JFX1BXUl9SRVEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY3B1X3B3cl9yZXFfcGluc1tdID0geworCVRFR1JBX1BJTl9DUFVfUFdSX1JFUSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBwd3JfaW50X25fcGluc1tdID0geworCVRFR1JBX1BJTl9QV1JfSU5UX04sCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2xrXzMya19pbl9waW5zW10gPSB7CisJVEVHUkFfUElOX0NMS18zMktfSU4sCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQganRhZ19ydGNrX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fSlRBR19SVENLLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGJhdHRfYmNsX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fQkFUVF9CQ0wsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2xrX3JlcV9waW5zW10gPSB7CisJVEVHUkFfUElOX0NMS19SRVEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2h1dGRvd25fcGluc1tdID0geworCVRFR1JBX1BJTl9TSFVURE9XTiwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9wYTZfcGluc1tdID0geworCVRFR1JBX1BJTl9QQTYsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfcGNjN19waW5zW10gPSB7CisJVEVHUkFfUElOX1BDQzcsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfcGU2X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUEU2LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX3BlN19waW5zW10gPSB7CisJVEVHUkFfUElOX1BFNywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9waDZfcGluc1tdID0geworCVRFR1JBX1BJTl9QSDYsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfcGswX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUEswLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX3BrMV9waW5zW10gPSB7CisJVEVHUkFfUElOX1BLMSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9wazJfcGluc1tdID0geworCVRFR1JBX1BJTl9QSzIsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfcGszX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUEszLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX3BrNF9waW5zW10gPSB7CisJVEVHUkFfUElOX1BLNCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9wazVfcGluc1tdID0geworCVRFR1JBX1BJTl9QSzUsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfcGs2X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUEs2LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX3BrN19waW5zW10gPSB7CisJVEVHUkFfUElOX1BLNywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9wbDBfcGluc1tdID0geworCVRFR1JBX1BJTl9QTDAsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfcGwxX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUEwxLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX3B6MF9waW5zW10gPSB7CisJVEVHUkFfUElOX1BaMCwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9wejFfcGluc1tdID0geworCVRFR1JBX1BJTl9QWjEsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfcHoyX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUFoyLAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX3B6M19waW5zW10gPSB7CisJVEVHUkFfUElOX1BaMywKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBkcml2ZV9wejRfcGluc1tdID0geworCVRFR1JBX1BJTl9QWjQsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfcHo1X3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fUFo1LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX3NkbW1jMV9waW5zW10gPSB7CisJVEVHUkFfUElOX1NETU1DMV9DTEtfUE0wLAorCVRFR1JBX1BJTl9TRE1NQzFfQ01EX1BNMSwKKwlURUdSQV9QSU5fU0RNTUMxX0RBVDNfUE0yLAorCVRFR1JBX1BJTl9TRE1NQzFfREFUMl9QTTMsCisJVEVHUkFfUElOX1NETU1DMV9EQVQxX1BNNCwKKwlURUdSQV9QSU5fU0RNTUMxX0RBVDBfUE01LAorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRyaXZlX3NkbW1jMl9waW5zW10gPSB7Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfc2RtbWMzX3BpbnNbXSA9IHsKKwlURUdSQV9QSU5fU0RNTUMzX0NMS19QUDAsCisJVEVHUkFfUElOX1NETU1DM19DTURfUFAxLAorCVRFR1JBX1BJTl9TRE1NQzNfREFUM19QUDIsCisJVEVHUkFfUElOX1NETU1DM19EQVQyX1BQMywKKwlURUdSQV9QSU5fU0RNTUMzX0RBVDFfUFA0LAorCVRFR1JBX1BJTl9TRE1NQzNfREFUMF9QUDUsCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgZHJpdmVfc2RtbWM0X3BpbnNbXSA9IHsKK307CisKK2VudW0gdGVncmFfbXV4IHsKKwlURUdSQV9NVVhfQVVELAorCVRFR1JBX01VWF9CQ0wsCisJVEVHUkFfTVVYX0JMSU5LLAorCVRFR1JBX01VWF9DQ0xBLAorCVRFR1JBX01VWF9DRUMsCisJVEVHUkFfTVVYX0NMRFZGUywKKwlURUdSQV9NVVhfQ0xLLAorCVRFR1JBX01VWF9DT1JFLAorCVRFR1JBX01VWF9DUFUsCisJVEVHUkFfTVVYX0RJU1BMQVlBLAorCVRFR1JBX01VWF9ESVNQTEFZQiwKKwlURUdSQV9NVVhfRE1JQzEsCisJVEVHUkFfTVVYX0RNSUMyLAorCVRFR1JBX01VWF9ETUlDMywKKwlURUdSQV9NVVhfRFAsCisJVEVHUkFfTVVYX0RUViwKKwlURUdSQV9NVVhfRVhUUEVSSVBIMywKKwlURUdSQV9NVVhfSTJDMSwKKwlURUdSQV9NVVhfSTJDMiwKKwlURUdSQV9NVVhfSTJDMywKKwlURUdSQV9NVVhfSTJDUE1VLAorCVRFR1JBX01VWF9JMkNWSSwKKwlURUdSQV9NVVhfSTJTMSwKKwlURUdSQV9NVVhfSTJTMiwKKwlURUdSQV9NVVhfSTJTMywKKwlURUdSQV9NVVhfSTJTNEEsCisJVEVHUkFfTVVYX0kyUzRCLAorCVRFR1JBX01VWF9JMlM1QSwKKwlURUdSQV9NVVhfSTJTNUIsCisJVEVHUkFfTVVYX0lRQzAsCisJVEVHUkFfTVVYX0lRQzEsCisJVEVHUkFfTVVYX0pUQUcsCisJVEVHUkFfTVVYX1BFLAorCVRFR1JBX01VWF9QRTAsCisJVEVHUkFfTVVYX1BFMSwKKwlURUdSQV9NVVhfUE1JLAorCVRFR1JBX01VWF9QV00wLAorCVRFR1JBX01VWF9QV00xLAorCVRFR1JBX01VWF9QV00yLAorCVRFR1JBX01VWF9QV00zLAorCVRFR1JBX01VWF9RU1BJLAorCVRFR1JBX01VWF9SU1ZEMCwKKwlURUdSQV9NVVhfUlNWRDEsCisJVEVHUkFfTVVYX1JTVkQyLAorCVRFR1JBX01VWF9SU1ZEMywKKwlURUdSQV9NVVhfU0FUQSwKKwlURUdSQV9NVVhfU0RNTUMxLAorCVRFR1JBX01VWF9TRE1NQzMsCisJVEVHUkFfTVVYX1NIVVRET1dOLAorCVRFR1JBX01VWF9TT0MsCisJVEVHUkFfTVVYX1NPUjAsCisJVEVHUkFfTVVYX1NPUjEsCisJVEVHUkFfTVVYX1NQRElGLAorCVRFR1JBX01VWF9TUEkxLAorCVRFR1JBX01VWF9TUEkyLAorCVRFR1JBX01VWF9TUEkzLAorCVRFR1JBX01VWF9TUEk0LAorCVRFR1JBX01VWF9TWVMsCisJVEVHUkFfTVVYX1RPVUNILAorCVRFR1JBX01VWF9VQVJULAorCVRFR1JBX01VWF9VQVJUQSwKKwlURUdSQV9NVVhfVUFSVEIsCisJVEVHUkFfTVVYX1VBUlRDLAorCVRFR1JBX01VWF9VQVJURCwKKwlURUdSQV9NVVhfVVNCLAorCVRFR1JBX01VWF9WR1AxLAorCVRFR1JBX01VWF9WR1AyLAorCVRFR1JBX01VWF9WR1AzLAorCVRFR1JBX01VWF9WR1A0LAorCVRFR1JBX01VWF9WR1A1LAorCVRFR1JBX01VWF9WR1A2LAorCVRFR1JBX01VWF9WSU1DTEssCisJVEVHUkFfTVVYX1ZJTUNMSzIsCit9OworCisjZGVmaW5lIEZVTkNUSU9OKGZuYW1lKQkJCQkJXAorCXsJCQkJCQlcCisJCS5uYW1lID0gI2ZuYW1lLAkJCQlcCisJfQorCitzdGF0aWMgc3RydWN0IHRlZ3JhX2Z1bmN0aW9uIHRlZ3JhMjEwX2Z1bmN0aW9uc1tdID0geworCUZVTkNUSU9OKGF1ZCksCisJRlVOQ1RJT04oYmNsKSwKKwlGVU5DVElPTihibGluayksCisJRlVOQ1RJT04oY2NsYSksCisJRlVOQ1RJT04oY2VjKSwKKwlGVU5DVElPTihjbGR2ZnMpLAorCUZVTkNUSU9OKGNsayksCisJRlVOQ1RJT04oY29yZSksCisJRlVOQ1RJT04oY3B1KSwKKwlGVU5DVElPTihkaXNwbGF5YSksCisJRlVOQ1RJT04oZGlzcGxheWIpLAorCUZVTkNUSU9OKGRtaWMxKSwKKwlGVU5DVElPTihkbWljMiksCisJRlVOQ1RJT04oZG1pYzMpLAorCUZVTkNUSU9OKGRwKSwKKwlGVU5DVElPTihkdHYpLAorCUZVTkNUSU9OKGV4dHBlcmlwaDMpLAorCUZVTkNUSU9OKGkyYzEpLAorCUZVTkNUSU9OKGkyYzIpLAorCUZVTkNUSU9OKGkyYzMpLAorCUZVTkNUSU9OKGkyY3BtdSksCisJRlVOQ1RJT04oaTJjdmkpLAorCUZVTkNUSU9OKGkyczEpLAorCUZVTkNUSU9OKGkyczIpLAorCUZVTkNUSU9OKGkyczMpLAorCUZVTkNUSU9OKGkyczRhKSwKKwlGVU5DVElPTihpMnM0YiksCisJRlVOQ1RJT04oaTJzNWEpLAorCUZVTkNUSU9OKGkyczViKSwKKwlGVU5DVElPTihpcWMwKSwKKwlGVU5DVElPTihpcWMxKSwKKwlGVU5DVElPTihqdGFnKSwKKwlGVU5DVElPTihwZSksCisJRlVOQ1RJT04ocGUwKSwKKwlGVU5DVElPTihwZTEpLAorCUZVTkNUSU9OKHBtaSksCisJRlVOQ1RJT04ocHdtMCksCisJRlVOQ1RJT04ocHdtMSksCisJRlVOQ1RJT04ocHdtMiksCisJRlVOQ1RJT04ocHdtMyksCisJRlVOQ1RJT04ocXNwaSksCisJRlVOQ1RJT04ocnN2ZDApLAorCUZVTkNUSU9OKHJzdmQxKSwKKwlGVU5DVElPTihyc3ZkMiksCisJRlVOQ1RJT04ocnN2ZDMpLAorCUZVTkNUSU9OKHNhdGEpLAorCUZVTkNUSU9OKHNkbW1jMSksCisJRlVOQ1RJT04oc2RtbWMzKSwKKwlGVU5DVElPTihzaHV0ZG93biksCisJRlVOQ1RJT04oc29jKSwKKwlGVU5DVElPTihzb3IwKSwKKwlGVU5DVElPTihzb3IxKSwKKwlGVU5DVElPTihzcGRpZiksCisJRlVOQ1RJT04oc3BpMSksCisJRlVOQ1RJT04oc3BpMiksCisJRlVOQ1RJT04oc3BpMyksCisJRlVOQ1RJT04oc3BpNCksCisJRlVOQ1RJT04oc3lzKSwKKwlGVU5DVElPTih0b3VjaCksCisJRlVOQ1RJT04odWFydCksCisJRlVOQ1RJT04odWFydGEpLAorCUZVTkNUSU9OKHVhcnRiKSwKKwlGVU5DVElPTih1YXJ0YyksCisJRlVOQ1RJT04odWFydGQpLAorCUZVTkNUSU9OKHVzYiksCisJRlVOQ1RJT04odmdwMSksCisJRlVOQ1RJT04odmdwMiksCisJRlVOQ1RJT04odmdwMyksCisJRlVOQ1RJT04odmdwNCksCisJRlVOQ1RJT04odmdwNSksCisJRlVOQ1RJT04odmdwNiksCisJRlVOQ1RJT04odmltY2xrKSwKKwlGVU5DVElPTih2aW1jbGsyKSwKK307CisKKyNkZWZpbmUgRFJWX1BJTkdST1VQX1JFR19BCQkweDhkNAkvKiBiYW5rIDAgKi8KKyNkZWZpbmUgUElOR1JPVVBfUkVHX0EJCQkweDMwMDAJLyogYmFuayAxICovCisKKyNkZWZpbmUgRFJWX1BJTkdST1VQX1JFRyhyKQkJKChyKSAtIERSVl9QSU5HUk9VUF9SRUdfQSkKKyNkZWZpbmUgUElOR1JPVVBfUkVHKHIpCQkJKChyKSAtIFBJTkdST1VQX1JFR19BKQorCisjZGVmaW5lIFBJTkdST1VQX0JJVF9ZKGIpCQkoYikKKyNkZWZpbmUgUElOR1JPVVBfQklUX04oYikJCSgtMSkKKworI2RlZmluZSBQSU5HUk9VUChwZ19uYW1lLCBmMCwgZjEsIGYyLCBmMywgciwgaHNtLCBkcnZ0eXBlLCBlX2lvX2h2LAlcCisJCSByZHJ2LCBkcnZkbl9iLCBkcnZkbl93LCBkcnZ1cF9iLCBkcnZ1cF93LCBzbHdyX2IsCVwKKwkJIHNsd3Jfdywgc2x3Zl9iLCBzbHdmX3cpCQkJCVwKKwl7CQkJCQkJCQlcCisJCS5uYW1lID0gI3BnX25hbWUsCQkJCQlcCisJCS5waW5zID0gcGdfbmFtZSMjX3BpbnMsCQkJCQlcCisJCS5ucGlucyA9IEFSUkFZX1NJWkUocGdfbmFtZSMjX3BpbnMpLAkJCVwKKwkJLmZ1bmNzID0gewkJCQkJCVwKKwkJCVRFR1JBX01VWF8jI2YwLAkJCQkJXAorCQkJVEVHUkFfTVVYXyMjZjEsCQkJCQlcCisJCQlURUdSQV9NVVhfIyNmMiwJCQkJCVwKKwkJCVRFR1JBX01VWF8jI2YzLAkJCQkJXAorCQl9LAkJCQkJCQlcCisJCS5tdXhfcmVnID0gUElOR1JPVVBfUkVHKHIpLAkJCQlcCisJCS5tdXhfYmFuayA9IDEsCQkJCQkJXAorCQkubXV4X2JpdCA9IDAsCQkJCQkJXAorCQkucHVwZF9yZWcgPSBQSU5HUk9VUF9SRUcociksCQkJCVwKKwkJLnB1cGRfYmFuayA9IDEsCQkJCQkJXAorCQkucHVwZF9iaXQgPSAyLAkJCQkJCVwKKwkJLnRyaV9yZWcgPSBQSU5HUk9VUF9SRUcociksCQkJCVwKKwkJLnRyaV9iYW5rID0gMSwJCQkJCQlcCisJCS50cmlfYml0ID0gNCwJCQkJCQlcCisJCS5laW5wdXRfYml0ID0gNiwJCQkJCVwKKwkJLm9kcmFpbl9iaXQgPSAxMSwJCQkJCVwKKwkJLmxvY2tfYml0ID0gNywJCQkJCQlcCisJCS5pb3Jlc2V0X2JpdCA9IC0xLAkJCQkJXAorCQkucmN2X3NlbF9iaXQgPSBQSU5HUk9VUF9CSVRfIyNlX2lvX2h2KDEwKSwJCVwKKwkJLmhzbV9iaXQgPSBQSU5HUk9VUF9CSVRfIyNoc20oOSksCQkJXAorCQkuc2NobWl0dF9iaXQgPSAxMiwJCQkJCVwKKwkJLmRydnR5cGVfYml0ID0gUElOR1JPVVBfQklUXyMjZHJ2dHlwZSgxMyksCQlcCisJCS5kcnZfcmVnID0gRFJWX1BJTkdST1VQX1JFRyhyZHJ2KSwJCQlcCisJCS5kcnZfYmFuayA9IDAsCQkJCQkJXAorCQkubHBtZF9iaXQgPSAtMSwJCQkJCQlcCisJCS5kcnZkbl9iaXQgPSBkcnZkbl9iLAkJCQkJXAorCQkuZHJ2ZG5fd2lkdGggPSBkcnZkbl93LAkJCQkJXAorCQkuZHJ2dXBfYml0ID0gZHJ2dXBfYiwJCQkJCVwKKwkJLmRydnVwX3dpZHRoID0gZHJ2dXBfdywJCQkJCVwKKwkJLnNsd3JfYml0ID0gc2x3cl9iLAkJCQkJXAorCQkuc2x3cl93aWR0aCA9IHNsd3JfdywJCQkJCVwKKwkJLnNsd2ZfYml0ID0gc2x3Zl9iLAkJCQkJXAorCQkuc2x3Zl93aWR0aCA9IHNsd2ZfdywJCQkJCVwKKwl9CisKKyNkZWZpbmUgRFJWX1BJTkdST1VQKHBnX25hbWUsIHIsIGRydmRuX2IsIGRydmRuX3csIGRydnVwX2IsIGRydnVwX3csCVwKKwkJICAgICBzbHdyX2IsIHNsd3Jfdywgc2x3Zl9iLCBzbHdmX3cpCQkJXAorCXsJCQkJCQkJCVwKKwkJLm5hbWUgPSAiZHJpdmVfIiAjcGdfbmFtZSwJCQkJXAorCQkucGlucyA9IGRyaXZlXyMjcGdfbmFtZSMjX3BpbnMsCQkJCVwKKwkJLm5waW5zID0gQVJSQVlfU0laRShkcml2ZV8jI3BnX25hbWUjI19waW5zKSwJCVwKKwkJLm11eF9yZWcgPSAtMSwJCQkJCQlcCisJCS5wdXBkX3JlZyA9IC0xLAkJCQkJCVwKKwkJLnRyaV9yZWcgPSAtMSwJCQkJCQlcCisJCS5laW5wdXRfYml0ID0gLTEsCQkJCQlcCisJCS5vZHJhaW5fYml0ID0gLTEsCQkJCQlcCisJCS5sb2NrX2JpdCA9IC0xLAkJCQkJCVwKKwkJLmlvcmVzZXRfYml0ID0gLTEsCQkJCQlcCisJCS5yY3Zfc2VsX2JpdCA9IC0xLAkJCQkJXAorCQkuZHJ2X3JlZyA9IERSVl9QSU5HUk9VUF9SRUcociksCQkJCVwKKwkJLmRydl9iYW5rID0gMCwJCQkJCQlcCisJCS5oc21fYml0ID0gLTEsCQkJCQkJXAorCQkuc2NobWl0dF9iaXQgPSAtMSwJCQkJCVwKKwkJLmxwbWRfYml0ID0gLTEsCQkJCQkJXAorCQkuZHJ2ZG5fYml0ID0gZHJ2ZG5fYiwJCQkJCVwKKwkJLmRydmRuX3dpZHRoID0gZHJ2ZG5fdywJCQkJCVwKKwkJLmRydnVwX2JpdCA9IGRydnVwX2IsCQkJCQlcCisJCS5kcnZ1cF93aWR0aCA9IGRydnVwX3csCQkJCQlcCisJCS5zbHdyX2JpdCA9IHNsd3JfYiwJCQkJCVwKKwkJLnNsd3Jfd2lkdGggPSBzbHdyX3csCQkJCQlcCisJCS5zbHdmX2JpdCA9IHNsd2ZfYiwJCQkJCVwKKwkJLnNsd2Zfd2lkdGggPSBzbHdmX3csCQkJCQlcCisJCS5kcnZ0eXBlX2JpdCA9IC0xLAkJCQkJXAorCX0KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9waW5ncm91cCB0ZWdyYTIxMF9ncm91cHNbXSA9IHsKKwkvKiAgICAgICBwZ19uYW1lLCAgICAgICAgICAgICAgZjAsICAgICAgICAgZjEsICAgICBmMiwgICAgZjMsICAgIHIsICAgICAgaHNtLCBkcnZ0eXBlLCBlX2lvX2h2LCByZHJ2LCAgZHJ2ZG5fYiwgZHJ2ZG5fdywgZHJ2dXBfYiwgZHJ2dXBfdywgc2x3cl9iLCBzbHdyX3csIHNsd2ZfYiwgc2x3Zl93ICovCisJUElOR1JPVVAoc2RtbWMxX2Nsa19wbTAsICAgICAgIFNETU1DMSwgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwMDAsIFksICAgWSwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChzZG1tYzFfY21kX3BtMSwgICAgICAgU0RNTUMxLCAgICAgU1BJMywgICBSU1ZEMiwgUlNWRDMsIDB4MzAwNCwgWSwgICBZLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHNkbW1jMV9kYXQzX3BtMiwgICAgICBTRE1NQzEsICAgICBTUEkzLCAgIFJTVkQyLCBSU1ZEMywgMHgzMDA4LCBZLCAgIFksICAgICAgIE4sICAgICAgIC0xLCAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoc2RtbWMxX2RhdDJfcG0zLCAgICAgIFNETU1DMSwgICAgIFNQSTMsICAgUlNWRDIsIFJTVkQzLCAweDMwMGMsIFksICAgWSwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChzZG1tYzFfZGF0MV9wbTQsICAgICAgU0RNTUMxLCAgICAgU1BJMywgICBSU1ZEMiwgUlNWRDMsIDB4MzAxMCwgWSwgICBZLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHNkbW1jMV9kYXQwX3BtNSwgICAgICBTRE1NQzEsICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMDE0LCBZLCAgIFksICAgICAgIE4sICAgICAgIC0xLCAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoc2RtbWMzX2Nsa19wcDAsICAgICAgIFNETU1DMywgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwMWMsIFksICAgWSwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChzZG1tYzNfY21kX3BwMSwgICAgICAgU0RNTUMzLCAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzAyMCwgWSwgICBZLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHNkbW1jM19kYXQwX3BwNSwgICAgICBTRE1NQzMsICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMDI0LCBZLCAgIFksICAgICAgIE4sICAgICAgIC0xLCAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoc2RtbWMzX2RhdDFfcHA0LCAgICAgIFNETU1DMywgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwMjgsIFksICAgWSwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChzZG1tYzNfZGF0Ml9wcDMsICAgICAgU0RNTUMzLCAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzAyYywgWSwgICBZLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHNkbW1jM19kYXQzX3BwMiwgICAgICBTRE1NQzMsICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMDMwLCBZLCAgIFksICAgICAgIE4sICAgICAgIC0xLCAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAocGV4X2wwX3JzdF9uX3BhMCwgICAgIFBFMCwgICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwMzgsIE4sICAgTiwgICAgICAgWSwgICAgICAgMHhhNWMsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChwZXhfbDBfY2xrcmVxX25fcGExLCAgUEUwLCAgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzAzYywgTiwgICBOLCAgICAgICBZLCAgICAgICAweGE1OCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHBleF93YWtlX25fcGEyLCAgICAgICBQRSwgICAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMDQwLCBOLCAgIE4sICAgICAgIFksICAgICAgIDB4YTY4LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAocGV4X2wxX3JzdF9uX3BhMywgICAgIFBFMSwgICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwNDQsIE4sICAgTiwgICAgICAgWSwgICAgICAgMHhhNjQsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChwZXhfbDFfY2xrcmVxX25fcGE0LCAgUEUxLCAgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzA0OCwgTiwgICBOLCAgICAgICBZLCAgICAgICAweGE2MCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHNhdGFfbGVkX2FjdGl2ZV9wYTUsICBTQVRBLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMDRjLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YTk0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoc3BpMV9tb3NpX3BjMCwgICAgICAgIFNQSTEsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwNTAsIFksICAgWSwgICAgICAgTiwgICAgICAgMHhhZTAsIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDI4LCAgICAgMiwgICAgICAzMCwgICAgIDIpLAorCVBJTkdST1VQKHNwaTFfbWlzb19wYzEsICAgICAgICBTUEkxLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMDU0LCBZLCAgIFksICAgICAgIE4sICAgICAgIDB4YWRjLCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAyOCwgICAgIDIsICAgICAgMzAsICAgICAyKSwKKwlQSU5HUk9VUChzcGkxX3Nja19wYzIsICAgICAgICAgU1BJMSwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzA1OCwgWSwgICBZLCAgICAgICBOLCAgICAgICAweGFlNCwgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgMjgsICAgICAyLCAgICAgIDMwLCAgICAgMiksCisJUElOR1JPVVAoc3BpMV9jczBfcGMzLCAgICAgICAgIFNQSTEsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwNWMsIFksICAgWSwgICAgICAgTiwgICAgICAgMHhhZDQsIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDI4LCAgICAgMiwgICAgICAzMCwgICAgIDIpLAorCVBJTkdST1VQKHNwaTFfY3MxX3BjNCwgICAgICAgICBTUEkxLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMDYwLCBZLCAgIFksICAgICAgIE4sICAgICAgIDB4YWQ4LCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAyOCwgICAgIDIsICAgICAgMzAsICAgICAyKSwKKwlQSU5HUk9VUChzcGkyX21vc2lfcGI0LCAgICAgICAgU1BJMiwgICAgICAgRFRWLCAgICBSU1ZEMiwgUlNWRDMsIDB4MzA2NCwgWSwgICBZLCAgICAgICBOLCAgICAgICAweGFmNCwgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgMjgsICAgICAyLCAgICAgIDMwLCAgICAgMiksCisJUElOR1JPVVAoc3BpMl9taXNvX3BiNSwgICAgICAgIFNQSTIsICAgICAgIERUViwgICAgUlNWRDIsIFJTVkQzLCAweDMwNjgsIFksICAgWSwgICAgICAgTiwgICAgICAgMHhhZjAsIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDI4LCAgICAgMiwgICAgICAzMCwgICAgIDIpLAorCVBJTkdST1VQKHNwaTJfc2NrX3BiNiwgICAgICAgICBTUEkyLCAgICAgICBEVFYsICAgIFJTVkQyLCBSU1ZEMywgMHgzMDZjLCBZLCAgIFksICAgICAgIE4sICAgICAgIDB4YWY4LCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAyOCwgICAgIDIsICAgICAgMzAsICAgICAyKSwKKwlQSU5HUk9VUChzcGkyX2NzMF9wYjcsICAgICAgICAgU1BJMiwgICAgICAgRFRWLCAgICBSU1ZEMiwgUlNWRDMsIDB4MzA3MCwgWSwgICBZLCAgICAgICBOLCAgICAgICAweGFlOCwgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgMjgsICAgICAyLCAgICAgIDMwLCAgICAgMiksCisJUElOR1JPVVAoc3BpMl9jczFfcGRkMCwgICAgICAgIFNQSTIsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwNzQsIFksICAgWSwgICAgICAgTiwgICAgICAgMHhhZWMsIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDI4LCAgICAgMiwgICAgICAzMCwgICAgIDIpLAorCVBJTkdST1VQKHNwaTRfbW9zaV9wYzcsICAgICAgICBTUEk0LCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMDc4LCBZLCAgIFksICAgICAgIE4sICAgICAgIDB4YjA0LCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAyOCwgICAgIDIsICAgICAgMzAsICAgICAyKSwKKwlQSU5HUk9VUChzcGk0X21pc29fcGQwLCAgICAgICAgU1BJNCwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzA3YywgWSwgICBZLCAgICAgICBOLCAgICAgICAweGIwMCwgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgMjgsICAgICAyLCAgICAgIDMwLCAgICAgMiksCisJUElOR1JPVVAoc3BpNF9zY2tfcGM1LCAgICAgICAgIFNQSTQsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwODAsIFksICAgWSwgICAgICAgTiwgICAgICAgMHhiMDgsIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDI4LCAgICAgMiwgICAgICAzMCwgICAgIDIpLAorCVBJTkdST1VQKHNwaTRfY3MwX3BjNiwgICAgICAgICBTUEk0LCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMDg0LCBZLCAgIFksICAgICAgIE4sICAgICAgIDB4YWZjLCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAyOCwgICAgIDIsICAgICAgMzAsICAgICAyKSwKKwlQSU5HUk9VUChxc3BpX3Nja19wZWUwLCAgICAgICAgUVNQSSwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzA4OCwgWSwgICBZLCAgICAgICBOLCAgICAgICAweGE5MCwgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgMjgsICAgICAyLCAgICAgIDMwLCAgICAgMiksCisJUElOR1JPVVAocXNwaV9jc19uX3BlZTEsICAgICAgIFFTUEksICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwOGMsIFksICAgWSwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChxc3BpX2lvMF9wZWUyLCAgICAgICAgUVNQSSwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzA5MCwgWSwgICBZLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHFzcGlfaW8xX3BlZTMsICAgICAgICBRU1BJLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMDk0LCBZLCAgIFksICAgICAgIE4sICAgICAgIC0xLCAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAocXNwaV9pbzJfcGVlNCwgICAgICAgIFFTUEksICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwOTgsIFksICAgWSwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChxc3BpX2lvM19wZWU1LCAgICAgICAgUVNQSSwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzA5YywgWSwgICBZLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGRtaWMxX2Nsa19wZTAsICAgICAgICBETUlDMSwgICAgICBJMlMzLCAgIFJTVkQyLCBSU1ZEMywgMHgzMGE0LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OTg0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoZG1pYzFfZGF0X3BlMSwgICAgICAgIERNSUMxLCAgICAgIEkyUzMsICAgUlNWRDIsIFJTVkQzLCAweDMwYTgsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg5ODgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChkbWljMl9jbGtfcGUyLCAgICAgICAgRE1JQzIsICAgICAgSTJTMywgICBSU1ZEMiwgUlNWRDMsIDB4MzBhYywgTiwgICBOLCAgICAgICBOLCAgICAgICAweDk4YywgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGRtaWMyX2RhdF9wZTMsICAgICAgICBETUlDMiwgICAgICBJMlMzLCAgIFJTVkQyLCBSU1ZEMywgMHgzMGIwLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OTkwLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoZG1pYzNfY2xrX3BlNCwgICAgICAgIERNSUMzLCAgICAgIEkyUzVBLCAgUlNWRDIsIFJTVkQzLCAweDMwYjQsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg5OTQsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChkbWljM19kYXRfcGU1LCAgICAgICAgRE1JQzMsICAgICAgSTJTNUEsICBSU1ZEMiwgUlNWRDMsIDB4MzBiOCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweDk5OCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGdlbjFfaTJjX3NjbF9wajEsICAgICBJMkMxLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMGJjLCBOLCAgIE4sICAgICAgIFksICAgICAgIDB4OWE4LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoZ2VuMV9pMmNfc2RhX3BqMCwgICAgIEkyQzEsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwYzAsIE4sICAgTiwgICAgICAgWSwgICAgICAgMHg5YWMsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChnZW4yX2kyY19zY2xfcGoyLCAgICAgSTJDMiwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzBjNCwgTiwgICBOLCAgICAgICBZLCAgICAgICAweDliMCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGdlbjJfaTJjX3NkYV9wajMsICAgICBJMkMyLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMGM4LCBOLCAgIE4sICAgICAgIFksICAgICAgIDB4OWI0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoZ2VuM19pMmNfc2NsX3BmMCwgICAgIEkyQzMsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwY2MsIE4sICAgTiwgICAgICAgWSwgICAgICAgMHg5YjgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChnZW4zX2kyY19zZGFfcGYxLCAgICAgSTJDMywgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzBkMCwgTiwgICBOLCAgICAgICBZLCAgICAgICAweDliYywgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGNhbV9pMmNfc2NsX3BzMiwgICAgICBJMkMzLCAgICAgICBJMkNWSSwgIFJTVkQyLCBSU1ZEMywgMHgzMGQ0LCBOLCAgIE4sICAgICAgIFksICAgICAgIDB4OTM0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoY2FtX2kyY19zZGFfcHMzLCAgICAgIEkyQzMsICAgICAgIEkyQ1ZJLCAgUlNWRDIsIFJTVkQzLCAweDMwZDgsIE4sICAgTiwgICAgICAgWSwgICAgICAgMHg5MzgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChwd3JfaTJjX3NjbF9weTMsICAgICAgSTJDUE1VLCAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzBkYywgTiwgICBOLCAgICAgICBZLCAgICAgICAweGE2YywgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHB3cl9pMmNfc2RhX3B5NCwgICAgICBJMkNQTVUsICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMGUwLCBOLCAgIE4sICAgICAgIFksICAgICAgIDB4YTcwLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAodWFydDFfdHhfcHUwLCAgICAgICAgIFVBUlRBLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwZTQsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhiMjgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUCh1YXJ0MV9yeF9wdTEsICAgICAgICAgVUFSVEEsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzBlOCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweGIyNCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHVhcnQxX3J0c19wdTIsICAgICAgICBVQVJUQSwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMGVjLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YjIwLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAodWFydDFfY3RzX3B1MywgICAgICAgIFVBUlRBLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMwZjAsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhiMWMsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUCh1YXJ0Ml90eF9wZzAsICAgICAgICAgVUFSVEIsICAgICAgSTJTNEEsICBTUERJRiwgVUFSVCwgIDB4MzBmNCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweGIzOCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHVhcnQyX3J4X3BnMSwgICAgICAgICBVQVJUQiwgICAgICBJMlM0QSwgIFNQRElGLCBVQVJULCAgMHgzMGY4LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YjM0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAodWFydDJfcnRzX3BnMiwgICAgICAgIFVBUlRCLCAgICAgIEkyUzRBLCAgUlNWRDIsIFVBUlQsICAweDMwZmMsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhiMzAsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUCh1YXJ0Ml9jdHNfcGczLCAgICAgICAgVUFSVEIsICAgICAgSTJTNEEsICBSU1ZEMiwgVUFSVCwgIDB4MzEwMCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweGIyYywgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHVhcnQzX3R4X3BkMSwgICAgICAgICBVQVJUQywgICAgICBTUEk0LCAgIFJTVkQyLCBSU1ZEMywgMHgzMTA0LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YjQ4LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAodWFydDNfcnhfcGQyLCAgICAgICAgIFVBUlRDLCAgICAgIFNQSTQsICAgUlNWRDIsIFJTVkQzLCAweDMxMDgsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhiNDQsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUCh1YXJ0M19ydHNfcGQzLCAgICAgICAgVUFSVEMsICAgICAgU1BJNCwgICBSU1ZEMiwgUlNWRDMsIDB4MzEwYywgTiwgICBOLCAgICAgICBOLCAgICAgICAweGI0MCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHVhcnQzX2N0c19wZDQsICAgICAgICBVQVJUQywgICAgICBTUEk0LCAgIFJTVkQyLCBSU1ZEMywgMHgzMTEwLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YjNjLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAodWFydDRfdHhfcGk0LCAgICAgICAgIFVBUlRELCAgICAgIFVBUlQsICAgUlNWRDIsIFJTVkQzLCAweDMxMTQsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhiNTgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUCh1YXJ0NF9yeF9waTUsICAgICAgICAgVUFSVEQsICAgICAgVUFSVCwgICBSU1ZEMiwgUlNWRDMsIDB4MzExOCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweGI1NCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHVhcnQ0X3J0c19waTYsICAgICAgICBVQVJURCwgICAgICBVQVJULCAgIFJTVkQyLCBSU1ZEMywgMHgzMTFjLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YjUwLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAodWFydDRfY3RzX3BpNywgICAgICAgIFVBUlRELCAgICAgIFVBUlQsICAgUlNWRDIsIFJTVkQzLCAweDMxMjAsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhiNGMsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChkYXAxX2ZzX3BiMCwgICAgICAgICAgSTJTMSwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzEyNCwgWSwgICBZLCAgICAgICBOLCAgICAgICAweDk1YywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgMjgsICAgICAyLCAgICAgIDMwLCAgICAgMiksCisJUElOR1JPVVAoZGFwMV9kaW5fcGIxLCAgICAgICAgIEkyUzEsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxMjgsIFksICAgWSwgICAgICAgTiwgICAgICAgMHg5NTQsIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDI4LCAgICAgMiwgICAgICAzMCwgICAgIDIpLAorCVBJTkdST1VQKGRhcDFfZG91dF9wYjIsICAgICAgICBJMlMxLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMTJjLCBZLCAgIFksICAgICAgIE4sICAgICAgIDB4OTU4LCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAyOCwgICAgIDIsICAgICAgMzAsICAgICAyKSwKKwlQSU5HUk9VUChkYXAxX3NjbGtfcGIzLCAgICAgICAgSTJTMSwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzEzMCwgWSwgICBZLCAgICAgICBOLCAgICAgICAweDk2MCwgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgMjgsICAgICAyLCAgICAgIDMwLCAgICAgMiksCisJUElOR1JPVVAoZGFwMl9mc19wYWEwLCAgICAgICAgIEkyUzIsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxMzQsIFksICAgWSwgICAgICAgTiwgICAgICAgMHg5NmMsIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDI4LCAgICAgMiwgICAgICAzMCwgICAgIDIpLAorCVBJTkdST1VQKGRhcDJfZGluX3BhYTIsICAgICAgICBJMlMyLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMTM4LCBZLCAgIFksICAgICAgIE4sICAgICAgIDB4OTY0LCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAyOCwgICAgIDIsICAgICAgMzAsICAgICAyKSwKKwlQSU5HUk9VUChkYXAyX2RvdXRfcGFhMywgICAgICAgSTJTMiwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzEzYywgWSwgICBZLCAgICAgICBOLCAgICAgICAweDk2OCwgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgMjgsICAgICAyLCAgICAgIDMwLCAgICAgMiksCisJUElOR1JPVVAoZGFwMl9zY2xrX3BhYTEsICAgICAgIEkyUzIsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxNDAsIFksICAgWSwgICAgICAgTiwgICAgICAgMHg5NzAsIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDI4LCAgICAgMiwgICAgICAzMCwgICAgIDIpLAorCVBJTkdST1VQKGRhcDRfZnNfcGo0LCAgICAgICAgICBJMlM0QiwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMTQ0LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OTdjLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoZGFwNF9kaW5fcGo1LCAgICAgICAgIEkyUzRCLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxNDgsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg5NzQsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChkYXA0X2RvdXRfcGo2LCAgICAgICAgSTJTNEIsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzE0YywgTiwgICBOLCAgICAgICBOLCAgICAgICAweDk3OCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGRhcDRfc2Nsa19wajcsICAgICAgICBJMlM0QiwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMTUwLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OTgwLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoY2FtMV9tY2xrX3BzMCwgICAgICAgIEVYVFBFUklQSDMsIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxNTQsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg5MTgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChjYW0yX21jbGtfcHMxLCAgICAgICAgRVhUUEVSSVBIMywgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzE1OCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweDkyNCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGp0YWdfcnRjaywgICAgICAgICAgICBKVEFHLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMTVjLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YTJjLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoY2xrXzMya19pbiwgICAgICAgICAgIENMSywgICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxNjAsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg5NDAsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChjbGtfMzJrX291dF9weTUsICAgICAgU09DLCAgICAgICAgQkxJTkssICBSU1ZEMiwgUlNWRDMsIDB4MzE2NCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweDk0NCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGJhdHRfYmNsLCAgICAgICAgICAgICBCQ0wsICAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMTY4LCBOLCAgIE4sICAgICAgIFksICAgICAgIDB4OGY4LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoY2xrX3JlcSwgICAgICAgICAgICAgIFNZUywgICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxNmMsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg5NDgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChjcHVfcHdyX3JlcSwgICAgICAgICAgQ1BVLCAgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzE3MCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweDk1MCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHB3cl9pbnRfbiwgICAgICAgICAgICBQTUksICAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMTc0LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YTc0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoc2h1dGRvd24sICAgICAgICAgICAgIFNIVVRET1dOLCAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxNzgsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhhYzgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChjb3JlX3B3cl9yZXEsICAgICAgICAgQ09SRSwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzE3YywgTiwgICBOLCAgICAgICBOLCAgICAgICAweDk0YywgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGF1ZF9tY2xrX3BiYjAsICAgICAgICBBVUQsICAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMTgwLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OGY0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoZHZmc19wd21fcGJiMSwgICAgICAgIFJTVkQwLCAgICAgIENMRFZGUywgU1BJMywgIFJTVkQzLCAweDMxODQsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg5YTQsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChkdmZzX2Nsa19wYmIyLCAgICAgICAgUlNWRDAsICAgICAgQ0xEVkZTLCBTUEkzLCAgUlNWRDMsIDB4MzE4OCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweDlhMCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGdwaW9feDFfYXVkX3BiYjMsICAgICBSU1ZEMCwgICAgICBSU1ZEMSwgIFNQSTMsICBSU1ZEMywgMHgzMThjLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YTE0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoZ3Bpb194M19hdWRfcGJiNCwgICAgIFJTVkQwLCAgICAgIFJTVkQxLCAgU1BJMywgIFJTVkQzLCAweDMxOTAsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhhMTgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChwY2M3LCAgICAgICAgICAgICAgICAgUlNWRDAsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzE5NCwgTiwgICBOLCAgICAgICBZLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGhkbWlfY2VjX3BjYzAsICAgICAgICBDRUMsICAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMTk4LCBOLCAgIE4sICAgICAgIFksICAgICAgIDB4YTI0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoaGRtaV9pbnRfZHBfaHBkX3BjYzEsIERQLCAgICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxOWMsIE4sICAgTiwgICAgICAgWSwgICAgICAgMHhhMjgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChzcGRpZl9vdXRfcGNjMiwgICAgICAgU1BESUYsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzFhMCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweGFkMCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHNwZGlmX2luX3BjYzMsICAgICAgICBTUERJRiwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMWE0LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YWNjLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAodXNiX3ZidXNfZW4wX3BjYzQsICAgIFVTQiwgICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxYTgsIE4sICAgTiwgICAgICAgWSwgICAgICAgMHhiNWMsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUCh1c2JfdmJ1c19lbjFfcGNjNSwgICAgVVNCLCAgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzFhYywgTiwgICBOLCAgICAgICBZLCAgICAgICAweGI2MCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGRwX2hwZDBfcGNjNiwgICAgICAgICBEUCwgICAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMWIwLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OTljLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAod2lmaV9lbl9waDAsICAgICAgICAgIFJTVkQwLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxYjQsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhiNjQsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUCh3aWZpX3JzdF9waDEsICAgICAgICAgUlNWRDAsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzFiOCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweGI2OCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHdpZmlfd2FrZV9hcF9waDIsICAgICBSU1ZEMCwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMWJjLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YjZjLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoYXBfd2FrZV9idF9waDMsICAgICAgIFJTVkQwLCAgICAgIFVBUlRCLCAgU1BESUYsIFJTVkQzLCAweDMxYzAsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg4ZWMsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChidF9yc3RfcGg0LCAgICAgICAgICAgUlNWRDAsICAgICAgVUFSVEIsICBTUERJRiwgUlNWRDMsIDB4MzFjNCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweDhmYywgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGJ0X3dha2VfYXBfcGg1LCAgICAgICBSU1ZEMCwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMWM4LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OTAwLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoYXBfd2FrZV9uZmNfcGg3LCAgICAgIFJTVkQwLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxY2MsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg4ZjAsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChuZmNfZW5fcGkwLCAgICAgICAgICAgUlNWRDAsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzFkMCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweGE1MCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKG5mY19pbnRfcGkxLCAgICAgICAgICBSU1ZEMCwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMWQ0LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YTU0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoZ3BzX2VuX3BpMiwgICAgICAgICAgIFJTVkQwLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxZDgsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhhMWMsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChncHNfcnN0X3BpMywgICAgICAgICAgUlNWRDAsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzFkYywgTiwgICBOLCAgICAgICBOLCAgICAgICAweGEyMCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGNhbV9yc3RfcHM0LCAgICAgICAgICBWR1AxLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMWUwLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OTNjLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoY2FtX2FmX2VuX3BzNSwgICAgICAgIFZJTUNMSywgICAgIFZHUDIsICAgUlNWRDIsIFJTVkQzLCAweDMxZTQsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg5MmMsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChjYW1fZmxhc2hfZW5fcHM2LCAgICAgVklNQ0xLLCAgICAgVkdQMywgICBSU1ZEMiwgUlNWRDMsIDB4MzFlOCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweDkzMCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGNhbTFfcHdkbl9wczcsICAgICAgICBWR1A0LCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMWVjLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OTFjLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoY2FtMl9wd2RuX3B0MCwgICAgICAgIFZHUDUsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMxZjAsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg5MjgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChjYW0xX3N0cm9iZV9wdDEsICAgICAgVkdQNiwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzFmNCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweDkyMCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGxjZF90ZV9weTIsICAgICAgICAgICBESVNQTEFZQSwgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMWY4LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YTQ0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAobGNkX2JsX3B3bV9wdjAsICAgICAgIERJU1BMQVlBLCAgIFBXTTAsICAgU09SMCwgIFJTVkQzLCAweDMxZmMsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhhMzQsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChsY2RfYmxfZW5fcHYxLCAgICAgICAgUlNWRDAsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzIwMCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweGEzMCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGxjZF9yc3RfcHYyLCAgICAgICAgICBSU1ZEMCwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMjA0LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YTQwLCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAobGNkX2dwaW8xX3B2MywgICAgICAgIERJU1BMQVlCLCAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMyMDgsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhhMzgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChsY2RfZ3BpbzJfcHY0LCAgICAgICAgRElTUExBWUIsICAgUFdNMSwgICBSU1ZEMiwgU09SMSwgIDB4MzIwYywgTiwgICBOLCAgICAgICBOLCAgICAgICAweGEzYywgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGFwX3JlYWR5X3B2NSwgICAgICAgICBSU1ZEMCwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMjEwLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OGU4LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAodG91Y2hfcnN0X3B2NiwgICAgICAgIFJTVkQwLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMyMTQsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhiMTgsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUCh0b3VjaF9jbGtfcHY3LCAgICAgICAgVE9VQ0gsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzIxOCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweGIxMCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKG1vZGVtX3dha2VfYXBfcHgwLCAgICBSU1ZEMCwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMjFjLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4YTQ4LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAodG91Y2hfaW50X3B4MSwgICAgICAgIFJTVkQwLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMyMjAsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhiMTQsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChtb3Rpb25faW50X3B4MiwgICAgICAgUlNWRDAsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzIyNCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweGE0YywgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGFsc19wcm94X2ludF9weDMsICAgICBSU1ZEMCwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMjI4LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OGU0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAodGVtcF9hbGVydF9weDQsICAgICAgIFJTVkQwLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMyMmMsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHhiMGMsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChidXR0b25fcG93ZXJfb25fcHg1LCAgUlNWRDAsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzIzMCwgTiwgICBOLCAgICAgICBOLCAgICAgICAweDkwOCwgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGJ1dHRvbl92b2xfdXBfcHg2LCAgICBSU1ZEMCwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMjM0LCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OTE0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAoYnV0dG9uX3ZvbF9kb3duX3B4NywgIFJTVkQwLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMyMzgsIE4sICAgTiwgICAgICAgTiwgICAgICAgMHg5MTAsIDEyLCAgICAgIDUsICAgICAgIDIwLCAgICAgIDUsICAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChidXR0b25fc2xpZGVfc3dfcHkwLCAgUlNWRDAsICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzIzYywgTiwgICBOLCAgICAgICBOLCAgICAgICAweDkwYywgMTIsICAgICAgNSwgICAgICAgMjAsICAgICAgNSwgICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKGJ1dHRvbl9ob21lX3B5MSwgICAgICBSU1ZEMCwgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMjQwLCBOLCAgIE4sICAgICAgIE4sICAgICAgIDB4OTA0LCAxMiwgICAgICA1LCAgICAgICAyMCwgICAgICA1LCAgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAocGE2LCAgICAgICAgICAgICAgICAgIFNBVEEsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMyNDQsIE4sICAgTiwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChwZTYsICAgICAgICAgICAgICAgICAgUlNWRDAsICAgICAgSTJTNUEsICBQV00yLCAgUlNWRDMsIDB4MzI0OCwgTiwgICBOLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHBlNywgICAgICAgICAgICAgICAgICBSU1ZEMCwgICAgICBJMlM1QSwgIFBXTTMsICBSU1ZEMywgMHgzMjRjLCBOLCAgIE4sICAgICAgIE4sICAgICAgIC0xLCAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAocGg2LCAgICAgICAgICAgICAgICAgIFJTVkQwLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMyNTAsIE4sICAgTiwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChwazAsICAgICAgICAgICAgICAgICAgSVFDMCwgICAgICAgSTJTNUIsICBSU1ZEMiwgUlNWRDMsIDB4MzI1NCwgWSwgICBZLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHBrMSwgICAgICAgICAgICAgICAgICBJUUMwLCAgICAgICBJMlM1QiwgIFJTVkQyLCBSU1ZEMywgMHgzMjU4LCBZLCAgIFksICAgICAgIE4sICAgICAgIC0xLCAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAocGsyLCAgICAgICAgICAgICAgICAgIElRQzAsICAgICAgIEkyUzVCLCAgUlNWRDIsIFJTVkQzLCAweDMyNWMsIFksICAgWSwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChwazMsICAgICAgICAgICAgICAgICAgSVFDMCwgICAgICAgSTJTNUIsICBSU1ZEMiwgUlNWRDMsIDB4MzI2MCwgWSwgICBZLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHBrNCwgICAgICAgICAgICAgICAgICBJUUMxLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMjY0LCBZLCAgIFksICAgICAgIE4sICAgICAgIC0xLCAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAocGs1LCAgICAgICAgICAgICAgICAgIElRQzEsICAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMyNjgsIFksICAgWSwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChwazYsICAgICAgICAgICAgICAgICAgSVFDMSwgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzI2YywgWSwgICBZLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHBrNywgICAgICAgICAgICAgICAgICBJUUMxLCAgICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMjcwLCBZLCAgIFksICAgICAgIE4sICAgICAgIC0xLCAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAocGwwLCAgICAgICAgICAgICAgICAgIFJTVkQwLCAgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMyNzQsIFksICAgWSwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChwbDEsICAgICAgICAgICAgICAgICAgU09DLCAgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzI3OCwgWSwgICBZLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHB6MCwgICAgICAgICAgICAgICAgICBWSU1DTEsyLCAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMjdjLCBOLCAgIE4sICAgICAgIE4sICAgICAgIC0xLCAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAocHoxLCAgICAgICAgICAgICAgICAgIFZJTUNMSzIsICAgIFNETU1DMSwgUlNWRDIsIFJTVkQzLCAweDMyODAsIE4sICAgTiwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChwejIsICAgICAgICAgICAgICAgICAgU0RNTUMzLCAgICAgQ0NMQSwgICBSU1ZEMiwgUlNWRDMsIDB4MzI4NCwgTiwgICBOLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCVBJTkdST1VQKHB6MywgICAgICAgICAgICAgICAgICBTRE1NQzMsICAgICBSU1ZEMSwgIFJTVkQyLCBSU1ZEMywgMHgzMjg4LCBOLCAgIE4sICAgICAgIE4sICAgICAgIC0xLCAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgIC0xLCAgICAgLTEsICAgICAtMSksCisJUElOR1JPVVAocHo0LCAgICAgICAgICAgICAgICAgIFNETU1DMSwgICAgIFJTVkQxLCAgUlNWRDIsIFJTVkQzLCAweDMyOGMsIE4sICAgTiwgICAgICAgTiwgICAgICAgLTEsICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgLTEsICAgICAtMSwgICAgIC0xKSwKKwlQSU5HUk9VUChwejUsICAgICAgICAgICAgICAgICAgU09DLCAgICAgICAgUlNWRDEsICBSU1ZEMiwgUlNWRDMsIDB4MzI5MCwgTiwgICBOLCAgICAgICBOLCAgICAgICAtMSwgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAtMSwgICAgIC0xLCAgICAgLTEpLAorCisJLyogcGdfbmFtZSwgciwgZHJ2ZG5fYiwgZHJ2ZG5fdywgZHJ2dXBfYiwgZHJ2dXBfdywgc2x3cl9iLCBzbHdyX3csIHNsd2ZfYiwgc2x3Zl93ICovCisJRFJWX1BJTkdST1VQKHBhNiwgICAgMHg5YzAsIDEyLCA1LCAgMjAsIDUsICAtMSwgLTEsIC0xLCAtMSksCisJRFJWX1BJTkdST1VQKHBjYzcsICAgMHg5YzQsIDEyLCA1LCAgMjAsIDUsICAtMSwgLTEsIC0xLCAtMSksCisJRFJWX1BJTkdST1VQKHBlNiwgICAgMHg5YzgsIDEyLCA1LCAgMjAsIDUsICAtMSwgLTEsIC0xLCAtMSksCisJRFJWX1BJTkdST1VQKHBlNywgICAgMHg5Y2MsIDEyLCA1LCAgMjAsIDUsICAtMSwgLTEsIC0xLCAtMSksCisJRFJWX1BJTkdST1VQKHBoNiwgICAgMHg5ZDAsIDEyLCA1LCAgMjAsIDUsICAtMSwgLTEsIC0xLCAtMSksCisJRFJWX1BJTkdST1VQKHBrMCwgICAgMHg5ZDQsIC0xLCAtMSwgLTEsIC0xLCAyOCwgMiwgIDMwLCAyKSwKKwlEUlZfUElOR1JPVVAocGsxLCAgICAweDlkOCwgLTEsIC0xLCAtMSwgLTEsIDI4LCAyLCAgMzAsIDIpLAorCURSVl9QSU5HUk9VUChwazIsICAgIDB4OWRjLCAtMSwgLTEsIC0xLCAtMSwgMjgsIDIsICAzMCwgMiksCisJRFJWX1BJTkdST1VQKHBrMywgICAgMHg5ZTAsIC0xLCAtMSwgLTEsIC0xLCAyOCwgMiwgIDMwLCAyKSwKKwlEUlZfUElOR1JPVVAocGs0LCAgICAweDllNCwgLTEsIC0xLCAtMSwgLTEsIDI4LCAyLCAgMzAsIDIpLAorCURSVl9QSU5HUk9VUChwazUsICAgIDB4OWU4LCAtMSwgLTEsIC0xLCAtMSwgMjgsIDIsICAzMCwgMiksCisJRFJWX1BJTkdST1VQKHBrNiwgICAgMHg5ZWMsIC0xLCAtMSwgLTEsIC0xLCAyOCwgMiwgIDMwLCAyKSwKKwlEUlZfUElOR1JPVVAocGs3LCAgICAweDlmMCwgLTEsIC0xLCAtMSwgLTEsIDI4LCAyLCAgMzAsIDIpLAorCURSVl9QSU5HUk9VUChwbDAsICAgIDB4OWY0LCAtMSwgLTEsIC0xLCAtMSwgMjgsIDIsICAzMCwgMiksCisJRFJWX1BJTkdST1VQKHBsMSwgICAgMHg5ZjgsIC0xLCAtMSwgLTEsIC0xLCAyOCwgMiwgIDMwLCAyKSwKKwlEUlZfUElOR1JPVVAocHowLCAgICAweDlmYywgMTIsIDcsICAyMCwgNywgIC0xLCAtMSwgLTEsIC0xKSwKKwlEUlZfUElOR1JPVVAocHoxLCAgICAweGEwMCwgMTIsIDcsICAyMCwgNywgIC0xLCAtMSwgLTEsIC0xKSwKKwlEUlZfUElOR1JPVVAocHoyLCAgICAweGEwNCwgMTIsIDcsICAyMCwgNywgIC0xLCAtMSwgLTEsIC0xKSwKKwlEUlZfUElOR1JPVVAocHozLCAgICAweGEwOCwgMTIsIDcsICAyMCwgNywgIC0xLCAtMSwgLTEsIC0xKSwKKwlEUlZfUElOR1JPVVAocHo0LCAgICAweGEwYywgMTIsIDcsICAyMCwgNywgIC0xLCAtMSwgLTEsIC0xKSwKKwlEUlZfUElOR1JPVVAocHo1LCAgICAweGExMCwgMTIsIDcsICAyMCwgNywgIC0xLCAtMSwgLTEsIC0xKSwKKwlEUlZfUElOR1JPVVAoc2RtbWMxLCAweGE5OCwgMTIsIDcsICAyMCwgNywgIDI4LCAyLCAgMzAsIDIpLAorCURSVl9QSU5HUk9VUChzZG1tYzIsIDB4YTljLCAyLCAgNiwgIDgsICA2LCAgMjgsIDIsICAzMCwgMiksCisJRFJWX1BJTkdST1VQKHNkbW1jMywgMHhhYjAsIDEyLCA3LCAgMjAsIDcsICAyOCwgMiwgIDMwLCAyKSwKKwlEUlZfUElOR1JPVVAoc2RtbWM0LCAweGFiNCwgMiwgIDYsICA4LCAgNiwgIDI4LCAyLCAgMzAsIDIpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWdyYV9waW5jdHJsX3NvY19kYXRhIHRlZ3JhMjEwX3BpbmN0cmwgPSB7CisJLm5ncGlvcyA9IE5VTV9HUElPUywKKwkucGlucyA9IHRlZ3JhMjEwX3BpbnMsCisJLm5waW5zID0gQVJSQVlfU0laRSh0ZWdyYTIxMF9waW5zKSwKKwkuZnVuY3Rpb25zID0gdGVncmEyMTBfZnVuY3Rpb25zLAorCS5uZnVuY3Rpb25zID0gQVJSQVlfU0laRSh0ZWdyYTIxMF9mdW5jdGlvbnMpLAorCS5ncm91cHMgPSB0ZWdyYTIxMF9ncm91cHMsCisJLm5ncm91cHMgPSBBUlJBWV9TSVpFKHRlZ3JhMjEwX2dyb3VwcyksCisJLmhzbV9pbl9tdXggPSB0cnVlLAorCS5zY2htaXR0X2luX211eCA9IHRydWUsCisJLmRydnR5cGVfaW5fbXV4ID0gdHJ1ZSwKK307CisKK3N0YXRpYyBpbnQgdGVncmEyMTBfcGluY3RybF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiB0ZWdyYV9waW5jdHJsX3Byb2JlKHBkZXYsICZ0ZWdyYTIxMF9waW5jdHJsKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmEyMTBfcGluY3RybF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjEwLXBpbm11eCIsIH0sCisJeyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRlZ3JhMjEwX3BpbmN0cmxfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZWdyYTIxMF9waW5jdHJsX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0ZWdyYTIxMC1waW5jdHJsIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gdGVncmEyMTBfcGluY3RybF9vZl9tYXRjaCwKKwl9LAorCS5wcm9iZSA9IHRlZ3JhMjEwX3BpbmN0cmxfcHJvYmUsCisJLnJlbW92ZSA9IHRlZ3JhX3BpbmN0cmxfcmVtb3ZlLAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGVncmEyMTBfcGluY3RybF9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJOVklESUEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTlZJRElBIFRlZ3JhMjEwIHBpbmN0cmwgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTMwLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ZWdyYTMwLmMKaW5kZXggZjZlZGMyZi4uNDdiMmZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdGVncmEzMC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXRlZ3JhMzAuYwpAQCAtMjEwOCw3MCArMjEwOCw2OSBAQAogI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHX0EJCTB4ODY4CS8qIGJhbmsgMCAqLwogI2RlZmluZSBQSU5HUk9VUF9SRUdfQQkJCTB4MzAwMAkvKiBiYW5rIDEgKi8KIAorI2RlZmluZSBEUlZfUElOR1JPVVBfUkVHKHIpCQkoKHIpIC0gRFJWX1BJTkdST1VQX1JFR19BKQogI2RlZmluZSBQSU5HUk9VUF9SRUcocikJCQkoKHIpIC0gUElOR1JPVVBfUkVHX0EpCiAKICNkZWZpbmUgUElOR1JPVVBfQklUX1koYikJCShiKQogI2RlZmluZSBQSU5HUk9VUF9CSVRfTihiKQkJKC0xKQogCi0jZGVmaW5lIFBJTkdST1VQKHBnX25hbWUsIGYwLCBmMSwgZjIsIGYzLCByLCBvZCwgaW9yKQkJXAotCXsJCQkJCQkJXAotCQkubmFtZSA9ICNwZ19uYW1lLAkJCQlcCi0JCS5waW5zID0gcGdfbmFtZSMjX3BpbnMsCQkJCVwKLQkJLm5waW5zID0gQVJSQVlfU0laRShwZ19uYW1lIyNfcGlucyksCQlcCi0JCS5mdW5jcyA9IHsJCQkJCVwKLQkJCVRFR1JBX01VWF8jI2YwLAkJCQlcCi0JCQlURUdSQV9NVVhfIyNmMSwJCQkJXAotCQkJVEVHUkFfTVVYXyMjZjIsCQkJCVwKLQkJCVRFR1JBX01VWF8jI2YzLAkJCQlcCi0JCX0sCQkJCQkJXAotCQkubXV4X3JlZyA9IFBJTkdST1VQX1JFRyhyKSwJCQlcCi0JCS5tdXhfYmFuayA9IDEsCQkJCQlcCi0JCS5tdXhfYml0ID0gMCwJCQkJCVwKLQkJLnB1cGRfcmVnID0gUElOR1JPVVBfUkVHKHIpLAkJCVwKLQkJLnB1cGRfYmFuayA9IDEsCQkJCQlcCi0JCS5wdXBkX2JpdCA9IDIsCQkJCQlcCi0JCS50cmlfcmVnID0gUElOR1JPVVBfUkVHKHIpLAkJCVwKLQkJLnRyaV9iYW5rID0gMSwJCQkJCVwKLQkJLnRyaV9iaXQgPSA0LAkJCQkJXAotCQkuZWlucHV0X2JpdCA9IFBJTkdST1VQX0JJVF9ZKDUpLAkJXAotCQkub2RyYWluX2JpdCA9IFBJTkdST1VQX0JJVF8jI29kKDYpLAkJXAotCQkubG9ja19iaXQgPSBQSU5HUk9VUF9CSVRfWSg3KSwJCQlcCi0JCS5pb3Jlc2V0X2JpdCA9IFBJTkdST1VQX0JJVF8jI2lvcig4KSwJCVwKLQkJLnJjdl9zZWxfYml0ID0gLTEsCQkJCVwKLQkJLmRydl9yZWcgPSAtMSwJCQkJCVwKKyNkZWZpbmUgUElOR1JPVVAocGdfbmFtZSwgZjAsIGYxLCBmMiwgZjMsIHIsIG9kLCBpb3IpCQkJXAorCXsJCQkJCQkJCVwKKwkJLm5hbWUgPSAjcGdfbmFtZSwJCQkJCVwKKwkJLnBpbnMgPSBwZ19uYW1lIyNfcGlucywJCQkJCVwKKwkJLm5waW5zID0gQVJSQVlfU0laRShwZ19uYW1lIyNfcGlucyksCQkJXAorCQkuZnVuY3MgPSB7CQkJCQkJXAorCQkJVEVHUkFfTVVYXyMjZjAsCQkJCQlcCisJCQlURUdSQV9NVVhfIyNmMSwJCQkJCVwKKwkJCVRFR1JBX01VWF8jI2YyLAkJCQkJXAorCQkJVEVHUkFfTVVYXyMjZjMsCQkJCQlcCisJCX0sCQkJCQkJCVwKKwkJLm11eF9yZWcgPSBQSU5HUk9VUF9SRUcociksCQkJCVwKKwkJLm11eF9iYW5rID0gMSwJCQkJCQlcCisJCS5tdXhfYml0ID0gMCwJCQkJCQlcCisJCS5wdXBkX3JlZyA9IFBJTkdST1VQX1JFRyhyKSwJCQkJXAorCQkucHVwZF9iYW5rID0gMSwJCQkJCQlcCisJCS5wdXBkX2JpdCA9IDIsCQkJCQkJXAorCQkudHJpX3JlZyA9IFBJTkdST1VQX1JFRyhyKSwJCQkJXAorCQkudHJpX2JhbmsgPSAxLAkJCQkJCVwKKwkJLnRyaV9iaXQgPSA0LAkJCQkJCVwKKwkJLmVpbnB1dF9iaXQgPSA1LAkJCQkJXAorCQkub2RyYWluX2JpdCA9IFBJTkdST1VQX0JJVF8jI29kKDYpLAkJCVwKKwkJLmxvY2tfYml0ID0gNywJCQkJCQlcCisJCS5pb3Jlc2V0X2JpdCA9IFBJTkdST1VQX0JJVF8jI2lvcig4KSwJCQlcCisJCS5yY3Zfc2VsX2JpdCA9IC0xLAkJCQkJXAorCQkuZHJ2X3JlZyA9IC0xLAkJCQkJCVwKIAl9CiAKLSNkZWZpbmUgRFJWX1BJTkdST1VQX1JFRyhyKQkJKChyKSAtIERSVl9QSU5HUk9VUF9SRUdfQSkKLQotI2RlZmluZSBEUlZfUElOR1JPVVAocGdfbmFtZSwgciwgaHNtX2IsIHNjaG1pdHRfYiwgbHBtZF9iLAlcCi0JCSAgICAgZHJ2ZG5fYiwgZHJ2ZG5fdywgZHJ2dXBfYiwgZHJ2dXBfdywJXAotCQkgICAgIHNsd3JfYiwgc2x3cl93LCBzbHdmX2IsIHNsd2ZfdykJCVwKLQl7CQkJCQkJCVwKLQkJLm5hbWUgPSAiZHJpdmVfIiAjcGdfbmFtZSwJCQlcCi0JCS5waW5zID0gZHJpdmVfIyNwZ19uYW1lIyNfcGlucywJCQlcCi0JCS5ucGlucyA9IEFSUkFZX1NJWkUoZHJpdmVfIyNwZ19uYW1lIyNfcGlucyksCVwKLQkJLm11eF9yZWcgPSAtMSwJCQkJCVwKLQkJLnB1cGRfcmVnID0gLTEsCQkJCQlcCi0JCS50cmlfcmVnID0gLTEsCQkJCQlcCi0JCS5laW5wdXRfYml0ID0gLTEsCQkJCVwKLQkJLm9kcmFpbl9iaXQgPSAtMSwJCQkJXAotCQkubG9ja19iaXQgPSAtMSwJCQkJCVwKLQkJLmlvcmVzZXRfYml0ID0gLTEsCQkJCVwKLQkJLnJjdl9zZWxfYml0ID0gLTEsCQkJCVwKLQkJLmRydl9yZWcgPSBEUlZfUElOR1JPVVBfUkVHKHIpLAkJCVwKLQkJLmRydl9iYW5rID0gMCwJCQkJCVwKLQkJLmhzbV9iaXQgPSBoc21fYiwJCQkJXAotCQkuc2NobWl0dF9iaXQgPSBzY2htaXR0X2IsCQkJXAotCQkubHBtZF9iaXQgPSBscG1kX2IsCQkJCVwKLQkJLmRydmRuX2JpdCA9IGRydmRuX2IsCQkJCVwKLQkJLmRydmRuX3dpZHRoID0gZHJ2ZG5fdywJCQkJXAotCQkuZHJ2dXBfYml0ID0gZHJ2dXBfYiwJCQkJXAotCQkuZHJ2dXBfd2lkdGggPSBkcnZ1cF93LAkJCQlcCi0JCS5zbHdyX2JpdCA9IHNsd3JfYiwJCQkJXAotCQkuc2x3cl93aWR0aCA9IHNsd3JfdywJCQkJXAotCQkuc2x3Zl9iaXQgPSBzbHdmX2IsCQkJCVwKLQkJLnNsd2Zfd2lkdGggPSBzbHdmX3csCQkJCVwKLQkJLmRydnR5cGVfYml0ID0gLTEsCQkJCVwKKyNkZWZpbmUgRFJWX1BJTkdST1VQKHBnX25hbWUsIHIsIGhzbV9iLCBzY2htaXR0X2IsIGxwbWRfYiwgZHJ2ZG5fYiwJXAorCQkgICAgIGRydmRuX3csIGRydnVwX2IsIGRydnVwX3csIHNsd3JfYiwgc2x3cl93LAkJXAorCQkgICAgIHNsd2ZfYiwgc2x3Zl93KQkJCQkJXAorCXsJCQkJCQkJCVwKKwkJLm5hbWUgPSAiZHJpdmVfIiAjcGdfbmFtZSwJCQkJXAorCQkucGlucyA9IGRyaXZlXyMjcGdfbmFtZSMjX3BpbnMsCQkJCVwKKwkJLm5waW5zID0gQVJSQVlfU0laRShkcml2ZV8jI3BnX25hbWUjI19waW5zKSwJCVwKKwkJLm11eF9yZWcgPSAtMSwJCQkJCQlcCisJCS5wdXBkX3JlZyA9IC0xLAkJCQkJCVwKKwkJLnRyaV9yZWcgPSAtMSwJCQkJCQlcCisJCS5laW5wdXRfYml0ID0gLTEsCQkJCQlcCisJCS5vZHJhaW5fYml0ID0gLTEsCQkJCQlcCisJCS5sb2NrX2JpdCA9IC0xLAkJCQkJCVwKKwkJLmlvcmVzZXRfYml0ID0gLTEsCQkJCQlcCisJCS5yY3Zfc2VsX2JpdCA9IC0xLAkJCQkJXAorCQkuZHJ2X3JlZyA9IERSVl9QSU5HUk9VUF9SRUcociksCQkJCVwKKwkJLmRydl9iYW5rID0gMCwJCQkJCQlcCisJCS5oc21fYml0ID0gaHNtX2IsCQkJCQlcCisJCS5zY2htaXR0X2JpdCA9IHNjaG1pdHRfYiwJCQkJXAorCQkubHBtZF9iaXQgPSBscG1kX2IsCQkJCQlcCisJCS5kcnZkbl9iaXQgPSBkcnZkbl9iLAkJCQkJXAorCQkuZHJ2ZG5fd2lkdGggPSBkcnZkbl93LAkJCQkJXAorCQkuZHJ2dXBfYml0ID0gZHJ2dXBfYiwJCQkJCVwKKwkJLmRydnVwX3dpZHRoID0gZHJ2dXBfdywJCQkJCVwKKwkJLnNsd3JfYml0ID0gc2x3cl9iLAkJCQkJXAorCQkuc2x3cl93aWR0aCA9IHNsd3JfdywJCQkJCVwKKwkJLnNsd2ZfYml0ID0gc2x3Zl9iLAkJCQkJXAorCQkuc2x3Zl93aWR0aCA9IHNsd2ZfdywJCQkJCVwKKwkJLmRydnR5cGVfYml0ID0gLTEsCQkJCQlcCiAJfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHRlZ3JhX3Bpbmdyb3VwIHRlZ3JhMzBfZ3JvdXBzW10gPSB7CkBAIC0yNDc3LDYgKzI0NzYsOSBAQAogCS5uZnVuY3Rpb25zID0gQVJSQVlfU0laRSh0ZWdyYTMwX2Z1bmN0aW9ucyksCiAJLmdyb3VwcyA9IHRlZ3JhMzBfZ3JvdXBzLAogCS5uZ3JvdXBzID0gQVJSQVlfU0laRSh0ZWdyYTMwX2dyb3VwcyksCisJLmhzbV9pbl9tdXggPSBmYWxzZSwKKwkuc2NobWl0dF9pbl9tdXggPSBmYWxzZSwKKwkuZHJ2dHlwZV9pbl9tdXggPSBmYWxzZSwKIH07CiAKIHN0YXRpYyBpbnQgdGVncmEzMF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ejEwOTAtcGRjLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ejEwOTAtcGRjLmMKaW5kZXggZmFiNmFhZi4uOGE4OTExYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdHoxMDkwLXBkYy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXR6MTA5MC1wZGMuYwpAQCAtOTY5LDcgKzk2OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHR6MTA5MF9wZGNfcGluY3RybF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdHoxMDkwX3BkY19waW5jdHJsX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJpbWcsdHoxMDkwLXBkYy1waW5jdHJsIiwgfSwKIAl7IH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3BpbmN0cmwtdHoxMDkwLmMgYi9kcml2ZXJzL3BpbmN0cmwvcGluY3RybC10ejEwOTAuYwppbmRleCA4YmQ3MzA3NS4uZmM1NTk0YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXR6MTA5MC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9waW5jdHJsLXR6MTA5MC5jCkBAIC0xOTg0LDcgKzE5ODQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB0ejEwOTBfcGluY3RybF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdHoxMDkwX3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImltZyx0ejEwOTAtcGluY3RybCIsIH0sCiAJeyB9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtbXNtLmMgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLW1zbS5jCmluZGV4IGE1MzVmOWMuLmYzZDgwMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtbXNtLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1tc20uYwpAQCAtMTkzLDExICsxOTMsMTEgQEAKIAkJKm1hc2sgPSA3OwogCQlicmVhazsKIAljYXNlIFBJTl9DT05GSUdfT1VUUFVUOgorCWNhc2UgUElOX0NPTkZJR19JTlBVVF9FTkFCTEU6CiAJCSpiaXQgPSBnLT5vZV9iaXQ7CiAJCSptYXNrID0gMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihwY3RybC0+ZGV2LCAiSW52YWxpZCBjb25maWcgcGFyYW0gJTA0eFxuIiwgcGFyYW0pOwogCQlyZXR1cm4gLUVOT1RTVVBQOwogCX0KIApAQCAtMjYxLDEwICsyNjEsMTQgQEAKIAkJdmFsID0gcmVhZGwocGN0cmwtPnJlZ3MgKyBnLT5pb19yZWcpOwogCQlhcmcgPSAhISh2YWwgJiBCSVQoZy0+aW5fYml0KSk7CiAJCWJyZWFrOworCWNhc2UgUElOX0NPTkZJR19JTlBVVF9FTkFCTEU6CisJCS8qIFBpbiBpcyBvdXRwdXQgKi8KKwkJaWYgKGFyZykKKwkJCXJldHVybiAtRUlOVkFMOworCQlhcmcgPSAxOworCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKHBjdHJsLT5kZXYsICJVbnN1cHBvcnRlZCBjb25maWcgcGFyYW1ldGVyOiAleFxuIiwKLQkJCXBhcmFtKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRU5PVFNVUFA7CiAJfQogCiAJKmNvbmZpZyA9IHBpbmNvbmZfdG9fY29uZmlnX3BhY2tlZChwYXJhbSwgYXJnKTsKQEAgLTMzMyw2ICszMzcsMTAgQEAKIAkJCS8qIGVuYWJsZSBvdXRwdXQgKi8KIAkJCWFyZyA9IDE7CiAJCQlicmVhazsKKwkJY2FzZSBQSU5fQ09ORklHX0lOUFVUX0VOQUJMRToKKwkJCS8qIGRpc2FibGUgb3V0cHV0ICovCisJCQlhcmcgPSAwOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlkZXZfZXJyKHBjdHJsLT5kZXYsICJVbnN1cHBvcnRlZCBjb25maWcgcGFyYW1ldGVyOiAleFxuIiwKIAkJCQlwYXJhbSk7CkBAIC0zNTcsNiArMzY1LDcgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwaW5jb25mX29wcyBtc21fcGluY29uZl9vcHMgPSB7CisJLmlzX2dlbmVyaWMJCT0gdHJ1ZSwKIAkucGluX2NvbmZpZ19ncm91cF9nZXQJPSBtc21fY29uZmlnX2dyb3VwX2dldCwKIAkucGluX2NvbmZpZ19ncm91cF9zZXQJPSBtc21fY29uZmlnX2dyb3VwX3NldCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNwbWktZ3Bpby5jIGIvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zcG1pLWdwaW8uYwppbmRleCAwZjExYTI2Li5iMmQyMjIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNwbWktZ3Bpby5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc3BtaS1ncGlvLmMKQEAgLTgxMCw2ICs4MTAsNyBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBwbWljX2dwaW9fb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20scG04OTE2LWdwaW8iIH0sCS8qIDQgR1BJTydzICovCiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODk0MS1ncGlvIiB9LAkvKiAzNiBHUElPJ3MgKi8KIAl7IC5jb21wYXRpYmxlID0gInFjb20scG1hODA4NC1ncGlvIiB9LAkvKiAyMiBHUElPJ3MgKi8KIAl7IH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNwbWktbXBwLmMgYi9kcml2ZXJzL3BpbmN0cmwvcWNvbS9waW5jdHJsLXNwbWktbXBwLmMKaW5kZXggYTg5MjRkYi4uOGYzNmM1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3Fjb20vcGluY3RybC1zcG1pLW1wcC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9xY29tL3BpbmN0cmwtc3BtaS1tcHAuYwpAQCAtOTI1LDYgKzkyNSw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBtaWNfbXBwX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtODg0MS1tcHAiIH0sCS8qIDQgTVBQJ3MgKi8KKwl7IC5jb21wYXRpYmxlID0gInFjb20scG04OTE2LW1wcCIgfSwJLyogNCBNUFAncyAqLwogCXsgLmNvbXBhdGlibGUgPSAicWNvbSxwbTg5NDEtbXBwIiB9LAkvKiA4IE1QUCdzICovCiAJeyAuY29tcGF0aWJsZSA9ICJxY29tLHBtYTgwODQtbXBwIiB9LAkvKiA4IE1QUCdzICovCiAJeyB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NhbXN1bmcvcGluY3RybC1leHlub3MuYyBiL2RyaXZlcnMvcGluY3RybC9zYW1zdW5nL3BpbmN0cmwtZXh5bm9zLmMKaW5kZXggYzhmODNmOS4uMGI3YWZhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NhbXN1bmcvcGluY3RybC1leHlub3MuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLWV4eW5vcy5jCkBAIC0xMjQwLDYgKzEyNDAsMTU5IEBACiAJfSwKIH07CiAKKy8qIHBpbiBiYW5rcyBvZiBleHlub3M1NDMzIHBpbi1jb250cm9sbGVyIC0gQUxJVkUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19waW5fYmFua19kYXRhIGV4eW5vczU0MzNfcGluX2JhbmtzMFtdID0geworCUVYWU5PU19QSU5fQkFOS19FSU5UVyg4LCAweDAwMCwgImdwYTAiLCAweDAwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVFcoOCwgMHgwMjAsICJncGExIiwgMHgwNCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRXKDgsIDB4MDQwLCAiZ3BhMiIsIDB4MDgpLAorCUVYWU5PU19QSU5fQkFOS19FSU5UVyg4LCAweDA2MCwgImdwYTMiLCAweDBjKSwKK307CisKKy8qIHBpbiBiYW5rcyBvZiBleHlub3M1NDMzIHBpbi1jb250cm9sbGVyIC0gQVVEICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfcGluX2JhbmtfZGF0YSBleHlub3M1NDMzX3Bpbl9iYW5rczFbXSA9IHsKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNywgMHgwMDAsICJncHowIiwgMHgwMCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDQsIDB4MDIwLCAiZ3B6MSIsIDB4MDQpLAorfTsKKworLyogcGluIGJhbmtzIG9mIGV4eW5vczU0MzMgcGluLWNvbnRyb2xsZXIgLSBDUElGICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfcGluX2JhbmtfZGF0YSBleHlub3M1NDMzX3Bpbl9iYW5rczJbXSA9IHsKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoMiwgMHgwMDAsICJncHY2IiwgMHgwMCksCit9OworCisvKiBwaW4gYmFua3Mgb2YgZXh5bm9zNTQzMyBwaW4tY29udHJvbGxlciAtIGVTRSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3Bpbl9iYW5rX2RhdGEgZXh5bm9zNTQzM19waW5fYmFua3MzW10gPSB7CisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDMsIDB4MDAwLCAiZ3BqMiIsIDB4MDApLAorfTsKKworLyogcGluIGJhbmtzIG9mIGV4eW5vczU0MzMgcGluLWNvbnRyb2xsZXIgLSBGSU5HRVIgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19waW5fYmFua19kYXRhIGV4eW5vczU0MzNfcGluX2JhbmtzNFtdID0geworCUVYWU5PU19QSU5fQkFOS19FSU5URyg0LCAweDAwMCwgImdwZDUiLCAweDAwKSwKK307CisKKy8qIHBpbiBiYW5rcyBvZiBleHlub3M1NDMzIHBpbi1jb250cm9sbGVyIC0gRlNZUyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3Bpbl9iYW5rX2RhdGEgZXh5bm9zNTQzM19waW5fYmFua3M1W10gPSB7CisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDYsIDB4MDAwLCAiZ3BoMSIsIDB4MDApLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg3LCAweDAyMCwgImdwcjQiLCAweDA0KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNSwgMHgwNDAsICJncHIwIiwgMHgwOCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDgsIDB4MDYwLCAiZ3ByMSIsIDB4MGMpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URygyLCAweDA4MCwgImdwcjIiLCAweDEwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoOCwgMHgwYTAsICJncHIzIiwgMHgxNCksCit9OworCisvKiBwaW4gYmFua3Mgb2YgZXh5bm9zNTQzMyBwaW4tY29udHJvbGxlciAtIElNRU0gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19waW5fYmFua19kYXRhIGV4eW5vczU0MzNfcGluX2JhbmtzNltdID0geworCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDAwMCwgImdwZjAiLCAweDAwKSwKK307CisKKy8qIHBpbiBiYW5rcyBvZiBleHlub3M1NDMzIHBpbi1jb250cm9sbGVyIC0gTkZDICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfcGluX2JhbmtfZGF0YSBleHlub3M1NDMzX3Bpbl9iYW5rczdbXSA9IHsKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoMywgMHgwMDAsICJncGowIiwgMHgwMCksCit9OworCisvKiBwaW4gYmFua3Mgb2YgZXh5bm9zNTQzMyBwaW4tY29udHJvbGxlciAtIFBFUklDICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfcGluX2JhbmtfZGF0YSBleHlub3M1NDMzX3Bpbl9iYW5rczhbXSA9IHsKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNiwgMHgwMDAsICJncHY3IiwgMHgwMCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDUsIDB4MDIwLCAiZ3BiMCIsIDB4MDQpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDA0MCwgImdwYzAiLCAweDA4KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoMiwgMHgwNjAsICJncGMxIiwgMHgwYyksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDYsIDB4MDgwLCAiZ3BjMiIsIDB4MTApLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg4LCAweDBhMCwgImdwYzMiLCAweDE0KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoMiwgMHgwYzAsICJncGcwIiwgMHgxOCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDQsIDB4MGUwLCAiZ3BkMCIsIDB4MWMpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg2LCAweDEwMCwgImdwZDEiLCAweDIwKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoOCwgMHgxMjAsICJncGQyIiwgMHgyNCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDUsIDB4MTQwLCAiZ3BkNCIsIDB4MjgpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URygyLCAweDE2MCwgImdwZDgiLCAweDJjKSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoNywgMHgxODAsICJncGQ2IiwgMHgzMCksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDMsIDB4MWEwLCAiZ3BkNyIsIDB4MzQpLAorCUVYWU5PU19QSU5fQkFOS19FSU5URyg1LCAweDFjMCwgImdwZzEiLCAweDM4KSwKKwlFWFlOT1NfUElOX0JBTktfRUlOVEcoMiwgMHgxZTAsICJncGcyIiwgMHgzYyksCisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDgsIDB4MjAwLCAiZ3BnMyIsIDB4NDApLAorfTsKKworLyogcGluIGJhbmtzIG9mIGV4eW5vczU0MzMgcGluLWNvbnRyb2xsZXIgLSBUT1VDSCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3Bpbl9iYW5rX2RhdGEgZXh5bm9zNTQzM19waW5fYmFua3M5W10gPSB7CisJRVhZTk9TX1BJTl9CQU5LX0VJTlRHKDMsIDB4MDAwLCAiZ3BqMSIsIDB4MDApLAorfTsKKworLyoKKyAqIFNhbXN1bmcgcGluY3RybCBkcml2ZXIgZGF0YSBmb3IgRXh5bm9zNTQzMyBTb0MuIEV4eW5vczU0MzMgU29DIGluY2x1ZGVzCisgKiB0ZW4gZ3Bpby9waW4tbXV4L3BpbmNvbmZpZyBjb250cm9sbGVycy4KKyAqLworY29uc3Qgc3RydWN0IHNhbXN1bmdfcGluX2N0cmwgZXh5bm9zNTQzM19waW5fY3RybFtdID0geworCXsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgMCBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1NDMzX3Bpbl9iYW5rczAsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQzM19waW5fYmFua3MwKSwKKwkJLmVpbnRfd2t1cF9pbml0ID0gZXh5bm9zX2VpbnRfd2t1cF9pbml0LAorCQkuc3VzcGVuZAk9IGV4eW5vc19waW5jdHJsX3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gZXh5bm9zX3BpbmN0cmxfcmVzdW1lLAorCX0sIHsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgMSBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1NDMzX3Bpbl9iYW5rczEsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQzM19waW5fYmFua3MxKSwKKwkJLmVpbnRfZ3Bpb19pbml0ID0gZXh5bm9zX2VpbnRfZ3Bpb19pbml0LAorCQkuc3VzcGVuZAk9IGV4eW5vc19waW5jdHJsX3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gZXh5bm9zX3BpbmN0cmxfcmVzdW1lLAorCX0sIHsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgMiBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1NDMzX3Bpbl9iYW5rczIsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQzM19waW5fYmFua3MyKSwKKwkJLmVpbnRfZ3Bpb19pbml0ID0gZXh5bm9zX2VpbnRfZ3Bpb19pbml0LAorCQkuc3VzcGVuZAk9IGV4eW5vc19waW5jdHJsX3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gZXh5bm9zX3BpbmN0cmxfcmVzdW1lLAorCX0sIHsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgMyBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1NDMzX3Bpbl9iYW5rczMsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQzM19waW5fYmFua3MzKSwKKwkJLmVpbnRfZ3Bpb19pbml0ID0gZXh5bm9zX2VpbnRfZ3Bpb19pbml0LAorCQkuc3VzcGVuZAk9IGV4eW5vc19waW5jdHJsX3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gZXh5bm9zX3BpbmN0cmxfcmVzdW1lLAorCX0sIHsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgNCBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1NDMzX3Bpbl9iYW5rczQsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQzM19waW5fYmFua3M0KSwKKwkJLmVpbnRfZ3Bpb19pbml0ID0gZXh5bm9zX2VpbnRfZ3Bpb19pbml0LAorCQkuc3VzcGVuZAk9IGV4eW5vc19waW5jdHJsX3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gZXh5bm9zX3BpbmN0cmxfcmVzdW1lLAorCX0sIHsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgNSBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1NDMzX3Bpbl9iYW5rczUsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQzM19waW5fYmFua3M1KSwKKwkJLmVpbnRfZ3Bpb19pbml0ID0gZXh5bm9zX2VpbnRfZ3Bpb19pbml0LAorCQkuc3VzcGVuZAk9IGV4eW5vc19waW5jdHJsX3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gZXh5bm9zX3BpbmN0cmxfcmVzdW1lLAorCX0sIHsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgNiBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1NDMzX3Bpbl9iYW5rczYsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQzM19waW5fYmFua3M2KSwKKwkJLmVpbnRfZ3Bpb19pbml0ID0gZXh5bm9zX2VpbnRfZ3Bpb19pbml0LAorCQkuc3VzcGVuZAk9IGV4eW5vc19waW5jdHJsX3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gZXh5bm9zX3BpbmN0cmxfcmVzdW1lLAorCX0sIHsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgNyBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1NDMzX3Bpbl9iYW5rczcsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQzM19waW5fYmFua3M3KSwKKwkJLmVpbnRfZ3Bpb19pbml0ID0gZXh5bm9zX2VpbnRfZ3Bpb19pbml0LAorCQkuc3VzcGVuZAk9IGV4eW5vc19waW5jdHJsX3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gZXh5bm9zX3BpbmN0cmxfcmVzdW1lLAorCX0sIHsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgOCBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1NDMzX3Bpbl9iYW5rczgsCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQzM19waW5fYmFua3M4KSwKKwkJLmVpbnRfZ3Bpb19pbml0ID0gZXh5bm9zX2VpbnRfZ3Bpb19pbml0LAorCQkuc3VzcGVuZAk9IGV4eW5vc19waW5jdHJsX3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gZXh5bm9zX3BpbmN0cmxfcmVzdW1lLAorCX0sIHsKKwkJLyogcGluLWNvbnRyb2xsZXIgaW5zdGFuY2UgOSBkYXRhICovCisJCS5waW5fYmFua3MJPSBleHlub3M1NDMzX3Bpbl9iYW5rczksCisJCS5ucl9iYW5rcwk9IEFSUkFZX1NJWkUoZXh5bm9zNTQzM19waW5fYmFua3M5KSwKKwkJLmVpbnRfZ3Bpb19pbml0ID0gZXh5bm9zX2VpbnRfZ3Bpb19pbml0LAorCQkuc3VzcGVuZAk9IGV4eW5vc19waW5jdHJsX3N1c3BlbmQsCisJCS5yZXN1bWUJCT0gZXh5bm9zX3BpbmN0cmxfcmVzdW1lLAorCX0sCit9OworCiAvKiBwaW4gYmFua3Mgb2YgZXh5bm9zNyBwaW4tY29udHJvbGxlciAtIEFMSVZFICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNhbXN1bmdfcGluX2JhbmtfZGF0YSBleHlub3M3X3Bpbl9iYW5rczBbXSBfX2luaXRjb25zdCA9IHsKIAlFWFlOT1NfUElOX0JBTktfRUlOVFcoOCwgMHgwMDAsICJncGEwIiwgMHgwMCksCkBAIC0xMzI0LDcgKzE0NzcsNiBAQAogCQkvKiBwaW4tY29udHJvbGxlciBpbnN0YW5jZSAwIEFsaXZlIGRhdGEgKi8KIAkJLnBpbl9iYW5rcwk9IGV4eW5vczdfcGluX2JhbmtzMCwKIAkJLm5yX2JhbmtzCT0gQVJSQVlfU0laRShleHlub3M3X3Bpbl9iYW5rczApLAotCQkuZWludF9ncGlvX2luaXQgPSBleHlub3NfZWludF9ncGlvX2luaXQsCiAJCS5laW50X3drdXBfaW5pdCA9IGV4eW5vc19laW50X3drdXBfaW5pdCwKIAl9LCB7CiAJCS8qIHBpbi1jb250cm9sbGVyIGluc3RhbmNlIDEgQlVTMCBkYXRhICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLXNhbXN1bmcuYyBiL2RyaXZlcnMvcGluY3RybC9zYW1zdW5nL3BpbmN0cmwtc2Ftc3VuZy5jCmluZGV4IGVjNTgwYWYuLmVkMTY1YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zYW1zdW5nL3BpbmN0cmwtc2Ftc3VuZy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zYW1zdW5nL3BpbmN0cmwtc2Ftc3VuZy5jCkBAIC0xMjM5LDYgKzEyMzksOCBAQAogCQkuZGF0YSA9ICh2b2lkICopZXh5bm9zNTI2MF9waW5fY3RybCB9LAogCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1NDIwLXBpbmN0cmwiLAogCQkuZGF0YSA9ICh2b2lkICopZXh5bm9zNTQyMF9waW5fY3RybCB9LAorCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M1NDMzLXBpbmN0cmwiLAorCQkuZGF0YSA9ICh2b2lkICopZXh5bm9zNTQzM19waW5fY3RybCB9LAogCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxzNXB2MjEwLXBpbmN0cmwiLAogCQkuZGF0YSA9ICh2b2lkICopczVwdjIxMF9waW5fY3RybCB9LAogCXsgLmNvbXBhdGlibGUgPSAic2Ftc3VuZyxleHlub3M3LXBpbmN0cmwiLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NhbXN1bmcvcGluY3RybC1zYW1zdW5nLmggYi9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLXNhbXN1bmcuaAppbmRleCAxYjhjMDEzLi5jMTIzOWZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLXNhbXN1bmcuaAorKysgYi9kcml2ZXJzL3BpbmN0cmwvc2Ftc3VuZy9waW5jdHJsLXNhbXN1bmcuaApAQCAtMjcxLDYgKzI3MSw3IEBACiBleHRlcm4gY29uc3Qgc3RydWN0IHNhbXN1bmdfcGluX2N0cmwgZXh5bm9zNTI1MF9waW5fY3RybFtdOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3Bpbl9jdHJsIGV4eW5vczUyNjBfcGluX2N0cmxbXTsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19waW5fY3RybCBleHlub3M1NDIwX3Bpbl9jdHJsW107CitleHRlcm4gY29uc3Qgc3RydWN0IHNhbXN1bmdfcGluX2N0cmwgZXh5bm9zNTQzM19waW5fY3RybFtdOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzYW1zdW5nX3Bpbl9jdHJsIGV4eW5vczdfcGluX2N0cmxbXTsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19waW5fY3RybCBzM2M2NHh4X3Bpbl9jdHJsW107CiBleHRlcm4gY29uc3Qgc3RydWN0IHNhbXN1bmdfcGluX2N0cmwgczNjMjQxMl9waW5fY3RybFtdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9jb3JlLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL2NvcmUuYwppbmRleCBhNTYyODA4Li43YjJjOTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL2NvcmUuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL2NvcmUuYwpAQCAtOTIsMTAgKzkyLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW9tZW0gKnNoX3BmY19waHlzX3RvX3ZpcnQoc3RydWN0IHNoX3BmYyAqcGZjLAotCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQorc3RhdGljIHZvaWQgX19pb21lbSAqc2hfcGZjX3BoeXNfdG9fdmlydChzdHJ1Y3Qgc2hfcGZjICpwZmMsIHUzMiByZWcpCiB7CiAJc3RydWN0IHNoX3BmY193aW5kb3cgKndpbmRvdzsKKwlwaHlzX2FkZHJfdCBhZGRyZXNzID0gcmVnOwogCXVuc2lnbmVkIGludCBpOwogCiAJLyogc2NhbiB0aHJvdWdoIHBoeXNpY2FsIHdpbmRvd3MgYW5kIGNvbnZlcnQgYWRkcmVzcyAqLwpAQCAtMTQ0LDggKzE0NCw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXVuc2lnbmVkIGxvbmcgc2hfcGZjX3JlYWRfcmF3X3JlZyh2b2lkIF9faW9tZW0gKm1hcHBlZF9yZWcsCi0JCQkJICB1bnNpZ25lZCBsb25nIHJlZ193aWR0aCkKK3UzMiBzaF9wZmNfcmVhZF9yYXdfcmVnKHZvaWQgX19pb21lbSAqbWFwcGVkX3JlZywgdW5zaWduZWQgaW50IHJlZ193aWR0aCkKIHsKIAlzd2l0Y2ggKHJlZ193aWR0aCkgewogCWNhc2UgODoKQEAgLTE2MCw4ICsxNTksOCBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHNoX3BmY193cml0ZV9yYXdfcmVnKHZvaWQgX19pb21lbSAqbWFwcGVkX3JlZywgdW5zaWduZWQgbG9uZyByZWdfd2lkdGgsCi0JCQkgIHVuc2lnbmVkIGxvbmcgZGF0YSkKK3ZvaWQgc2hfcGZjX3dyaXRlX3Jhd19yZWcodm9pZCBfX2lvbWVtICptYXBwZWRfcmVnLCB1bnNpZ25lZCBpbnQgcmVnX3dpZHRoLAorCQkJICB1MzIgZGF0YSkKIHsKIAlzd2l0Y2ggKHJlZ193aWR0aCkgewogCWNhc2UgODoKQEAgLTE4MCwxMCArMTc5LDkgQEAKIAogc3RhdGljIHZvaWQgc2hfcGZjX2NvbmZpZ19yZWdfaGVscGVyKHN0cnVjdCBzaF9wZmMgKnBmYywKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBwaW5tdXhfY2ZnX3JlZyAqY3JwLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyBpbl9wb3MsCi0JCQkJICAgICB2b2lkIF9faW9tZW0gKiptYXBwZWRfcmVncCwKLQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKm1hc2twLAotCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqcG9zcCkKKwkJCQkgICAgIHVuc2lnbmVkIGludCBpbl9wb3MsCisJCQkJICAgICB2b2lkIF9faW9tZW0gKiptYXBwZWRfcmVncCwgdTMyICptYXNrcCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqcG9zcCkKIHsKIAl1bnNpZ25lZCBpbnQgazsKIApAQCAtMjAyLDE1ICsyMDAsMTYgQEAKIAogc3RhdGljIHZvaWQgc2hfcGZjX3dyaXRlX2NvbmZpZ19yZWcoc3RydWN0IHNoX3BmYyAqcGZjLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGlubXV4X2NmZ19yZWcgKmNycCwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBmaWVsZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKKwkJCQkgICAgdW5zaWduZWQgaW50IGZpZWxkLCB1MzIgdmFsdWUpCiB7CiAJdm9pZCBfX2lvbWVtICptYXBwZWRfcmVnOwotCXVuc2lnbmVkIGxvbmcgbWFzaywgcG9zLCBkYXRhOworCXVuc2lnbmVkIGludCBwb3M7CisJdTMyIG1hc2ssIGRhdGE7CiAKIAlzaF9wZmNfY29uZmlnX3JlZ19oZWxwZXIocGZjLCBjcnAsIGZpZWxkLCAmbWFwcGVkX3JlZywgJm1hc2ssICZwb3MpOwogCi0JZGV2X2RiZyhwZmMtPmRldiwgIndyaXRlX3JlZyBhZGRyID0gJWx4LCB2YWx1ZSA9ICVsZCwgZmllbGQgPSAlbGQsICIKLQkJInJfd2lkdGggPSAlbGQsIGZfd2lkdGggPSAlbGRcbiIsCisJZGV2X2RiZyhwZmMtPmRldiwgIndyaXRlX3JlZyBhZGRyID0gJXgsIHZhbHVlID0gMHgleCwgZmllbGQgPSAldSwgIgorCQkicl93aWR0aCA9ICV1LCBmX3dpZHRoID0gJXVcbiIsCiAJCWNycC0+cmVnLCB2YWx1ZSwgZmllbGQsIGNycC0+cmVnX3dpZHRoLCBjcnAtPmZpZWxkX3dpZHRoKTsKIAogCW1hc2sgPSB+KG1hc2sgPDwgcG9zKTsKQEAgLTIyOSwyNiArMjI4LDI4IEBACiB9CiAKIHN0YXRpYyBpbnQgc2hfcGZjX2dldF9jb25maWdfcmVnKHN0cnVjdCBzaF9wZmMgKnBmYywgdTE2IGVudW1faWQsCi0JCQkJIGNvbnN0IHN0cnVjdCBwaW5tdXhfY2ZnX3JlZyAqKmNycCwgaW50ICpmaWVsZHAsCi0JCQkJIGludCAqdmFsdWVwKQorCQkJCSBjb25zdCBzdHJ1Y3QgcGlubXV4X2NmZ19yZWcgKipjcnAsCisJCQkJIHVuc2lnbmVkIGludCAqZmllbGRwLCB1MzIgKnZhbHVlcCkKIHsKLQljb25zdCBzdHJ1Y3QgcGlubXV4X2NmZ19yZWcgKmNvbmZpZ19yZWc7Ci0JdW5zaWduZWQgbG9uZyByX3dpZHRoLCBmX3dpZHRoLCBjdXJyX3dpZHRoLCBuY29tYjsKLQl1bnNpZ25lZCBpbnQgaywgbSwgbiwgcG9zLCBiaXRfcG9zOworCXVuc2lnbmVkIGludCBrID0gMDsKIAotCWsgPSAwOwogCXdoaWxlICgxKSB7Ci0JCWNvbmZpZ19yZWcgPSBwZmMtPmluZm8tPmNmZ19yZWdzICsgazsKLQotCQlyX3dpZHRoID0gY29uZmlnX3JlZy0+cmVnX3dpZHRoOwotCQlmX3dpZHRoID0gY29uZmlnX3JlZy0+ZmllbGRfd2lkdGg7CisJCWNvbnN0IHN0cnVjdCBwaW5tdXhfY2ZnX3JlZyAqY29uZmlnX3JlZyA9CisJCQlwZmMtPmluZm8tPmNmZ19yZWdzICsgazsKKwkJdW5zaWduZWQgaW50IHJfd2lkdGggPSBjb25maWdfcmVnLT5yZWdfd2lkdGg7CisJCXVuc2lnbmVkIGludCBmX3dpZHRoID0gY29uZmlnX3JlZy0+ZmllbGRfd2lkdGg7CisJCXVuc2lnbmVkIGludCBjdXJyX3dpZHRoOworCQl1bnNpZ25lZCBpbnQgYml0X3BvczsKKwkJdW5zaWduZWQgaW50IHBvcyA9IDA7CisJCXVuc2lnbmVkIGludCBtID0gMDsKIAogCQlpZiAoIXJfd2lkdGgpCiAJCQlicmVhazsKIAotCQlwb3MgPSAwOwotCQltID0gMDsKIAkJZm9yIChiaXRfcG9zID0gMDsgYml0X3BvcyA8IHJfd2lkdGg7IGJpdF9wb3MgKz0gY3Vycl93aWR0aCkgeworCQkJdTMyIG5jb21iOworCQkJdTMyIG47CisKIAkJCWlmIChmX3dpZHRoKQogCQkJCWN1cnJfd2lkdGggPSBmX3dpZHRoOwogCQkJZWxzZQpAQCAtMjk3LDExICsyOTgsOCBAQAogCiBpbnQgc2hfcGZjX2NvbmZpZ19tdXgoc3RydWN0IHNoX3BmYyAqcGZjLCB1bnNpZ25lZCBtYXJrLCBpbnQgcGlubXV4X3R5cGUpCiB7Ci0JY29uc3Qgc3RydWN0IHBpbm11eF9jZmdfcmVnICpjciA9IE5VTEw7Ci0JdTE2IGVudW1faWQ7CiAJY29uc3Qgc3RydWN0IHBpbm11eF9yYW5nZSAqcmFuZ2U7Ci0JaW50IGluX3JhbmdlLCBwb3MsIGZpZWxkLCB2YWx1ZTsKLQlpbnQgcmV0OworCWludCBwb3MgPSAwOwogCiAJc3dpdGNoIChwaW5tdXhfdHlwZSkgewogCWNhc2UgUElOTVVYX1RZUEVfR1BJTzoKQEAgLTMyMSwxMyArMzE5LDE1IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXBvcyA9IDA7Ci0JZW51bV9pZCA9IDA7Ci0JZmllbGQgPSAwOwotCXZhbHVlID0gMDsKLQogCS8qIEl0ZXJhdGUgb3ZlciBhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZmllbGRzIHdlIG5lZWQgdG8gdXBkYXRlLiAqLwogCXdoaWxlICgxKSB7CisJCWNvbnN0IHN0cnVjdCBwaW5tdXhfY2ZnX3JlZyAqY3I7CisJCXVuc2lnbmVkIGludCBmaWVsZDsKKwkJdTE2IGVudW1faWQ7CisJCXUzMiB2YWx1ZTsKKwkJaW50IGluX3JhbmdlOworCQlpbnQgcmV0OworCiAJCXBvcyA9IHNoX3BmY19tYXJrX3RvX2VudW0ocGZjLCBtYXJrLCBwb3MsICZlbnVtX2lkKTsKIAkJaWYgKHBvcyA8IDApCiAJCQlyZXR1cm4gcG9zOwpAQCAtNTc5LDkgKzU3OSw2IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIHNoX3BmY19pZF90YWJsZVtdID0gewotI2lmZGVmIENPTkZJR19QSU5DVFJMX1BGQ19FTUVWMgotCXsgInBmYy1lbWV2MiIsIChrZXJuZWxfdWxvbmdfdCkmZW1ldjJfcGlubXV4X2luZm8gfSwKLSNlbmRpZgogI2lmZGVmIENPTkZJR19QSU5DVFJMX1BGQ19SOEE3M0E0CiAJeyAicGZjLXI4YTczYTQiLCAoa2VybmVsX3Vsb25nX3QpJnI4YTczYTRfcGlubXV4X2luZm8gfSwKICNlbmRpZgpAQCAtNTk0LDEyICs1OTEsNiBAQAogI2lmZGVmIENPTkZJR19QSU5DVFJMX1BGQ19SOEE3Nzc5CiAJeyAicGZjLXI4YTc3NzkiLCAoa2VybmVsX3Vsb25nX3QpJnI4YTc3NzlfcGlubXV4X2luZm8gfSwKICNlbmRpZgotI2lmZGVmIENPTkZJR19QSU5DVFJMX1BGQ19SOEE3NzkwCi0JeyAicGZjLXI4YTc3OTAiLCAoa2VybmVsX3Vsb25nX3QpJnI4YTc3OTBfcGlubXV4X2luZm8gfSwKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QSU5DVFJMX1BGQ19SOEE3NzkxCi0JeyAicGZjLXI4YTc3OTEiLCAoa2VybmVsX3Vsb25nX3QpJnI4YTc3OTFfcGlubXV4X2luZm8gfSwKLSNlbmRpZgogI2lmZGVmIENPTkZJR19QSU5DVFJMX1BGQ19TSDcyMDMKIAl7ICJwZmMtc2g3MjAzIiwgKGtlcm5lbF91bG9uZ190KSZzaDcyMDNfcGlubXV4X2luZm8gfSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9jb3JlLmggYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL2NvcmUuaAppbmRleCA2YjU5ZDYzLi42ZGM4YTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL2NvcmUuaAorKysgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL2NvcmUuaApAQCAtNTcsMTAgKzU3LDkgQEAKIGludCBzaF9wZmNfcmVnaXN0ZXJfcGluY3RybChzdHJ1Y3Qgc2hfcGZjICpwZmMpOwogaW50IHNoX3BmY191bnJlZ2lzdGVyX3BpbmN0cmwoc3RydWN0IHNoX3BmYyAqcGZjKTsKIAotdW5zaWduZWQgbG9uZyBzaF9wZmNfcmVhZF9yYXdfcmVnKHZvaWQgX19pb21lbSAqbWFwcGVkX3JlZywKLQkJCQkgIHVuc2lnbmVkIGxvbmcgcmVnX3dpZHRoKTsKLXZvaWQgc2hfcGZjX3dyaXRlX3Jhd19yZWcodm9pZCBfX2lvbWVtICptYXBwZWRfcmVnLCB1bnNpZ25lZCBsb25nIHJlZ193aWR0aCwKLQkJCSAgdW5zaWduZWQgbG9uZyBkYXRhKTsKK3UzMiBzaF9wZmNfcmVhZF9yYXdfcmVnKHZvaWQgX19pb21lbSAqbWFwcGVkX3JlZywgdW5zaWduZWQgaW50IHJlZ193aWR0aCk7Cit2b2lkIHNoX3BmY193cml0ZV9yYXdfcmVnKHZvaWQgX19pb21lbSAqbWFwcGVkX3JlZywgdW5zaWduZWQgaW50IHJlZ193aWR0aCwKKwkJCSAgdTMyIGRhdGEpOwogCiBpbnQgc2hfcGZjX2dldF9waW5faW5kZXgoc3RydWN0IHNoX3BmYyAqcGZjLCB1bnNpZ25lZCBpbnQgcGluKTsKIGludCBzaF9wZmNfY29uZmlnX211eChzdHJ1Y3Qgc2hfcGZjICpwZmMsIHVuc2lnbmVkIG1hcmssIGludCBwaW5tdXhfdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL2dwaW8uYyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvZ3Bpby5jCmluZGV4IDgwZjY0MWUuLmJhMzUzNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvZ3Bpby5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvZ3Bpby5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIHN0cnVjdCBzaF9wZmNfZ3Bpb19kYXRhX3JlZyB7CiAJY29uc3Qgc3RydWN0IHBpbm11eF9kYXRhX3JlZyAqaW5mbzsKLQl1bnNpZ25lZCBsb25nIHNoYWRvdzsKKwl1MzIgc2hhZG93OwogfTsKIAogc3RydWN0IHNoX3BmY19ncGlvX3BpbiB7CkBAIC01OSwxOSArNTksMjAgQEAKIAkqYml0ID0gZ3Bpb19waW4tPmRiaXQ7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGdwaW9fcmVhZF9kYXRhX3JlZyhzdHJ1Y3Qgc2hfcGZjX2NoaXAgKmNoaXAsCi0JCQkJCWNvbnN0IHN0cnVjdCBwaW5tdXhfZGF0YV9yZWcgKmRyZWcpCitzdGF0aWMgdTMyIGdwaW9fcmVhZF9kYXRhX3JlZyhzdHJ1Y3Qgc2hfcGZjX2NoaXAgKmNoaXAsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGlubXV4X2RhdGFfcmVnICpkcmVnKQogewotCXZvaWQgX19pb21lbSAqbWVtID0gZHJlZy0+cmVnIC0gY2hpcC0+bWVtLT5waHlzICsgY2hpcC0+bWVtLT52aXJ0OworCXBoeXNfYWRkcl90IGFkZHJlc3MgPSBkcmVnLT5yZWc7CisJdm9pZCBfX2lvbWVtICptZW0gPSBhZGRyZXNzIC0gY2hpcC0+bWVtLT5waHlzICsgY2hpcC0+bWVtLT52aXJ0OwogCiAJcmV0dXJuIHNoX3BmY19yZWFkX3Jhd19yZWcobWVtLCBkcmVnLT5yZWdfd2lkdGgpOwogfQogCiBzdGF0aWMgdm9pZCBncGlvX3dyaXRlX2RhdGFfcmVnKHN0cnVjdCBzaF9wZmNfY2hpcCAqY2hpcCwKLQkJCQljb25zdCBzdHJ1Y3QgcGlubXV4X2RhdGFfcmVnICpkcmVnLAotCQkJCXVuc2lnbmVkIGxvbmcgdmFsdWUpCisJCQkJY29uc3Qgc3RydWN0IHBpbm11eF9kYXRhX3JlZyAqZHJlZywgdTMyIHZhbHVlKQogewotCXZvaWQgX19pb21lbSAqbWVtID0gZHJlZy0+cmVnIC0gY2hpcC0+bWVtLT5waHlzICsgY2hpcC0+bWVtLT52aXJ0OworCXBoeXNfYWRkcl90IGFkZHJlc3MgPSBkcmVnLT5yZWc7CisJdm9pZCBfX2lvbWVtICptZW0gPSBhZGRyZXNzIC0gY2hpcC0+bWVtLT5waHlzICsgY2hpcC0+bWVtLT52aXJ0OwogCiAJc2hfcGZjX3dyaXRlX3Jhd19yZWcobWVtLCBkcmVnLT5yZWdfd2lkdGgsIHZhbHVlKTsKIH0KQEAgLTg1LDcgKzg2LDcgQEAKIAl1bnNpZ25lZCBpbnQgYml0OwogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yIChpID0gMCwgZHJlZyA9IHBmYy0+aW5mby0+ZGF0YV9yZWdzOyBkcmVnLT5yZWc7ICsraSwgKytkcmVnKSB7CisJZm9yIChpID0gMCwgZHJlZyA9IHBmYy0+aW5mby0+ZGF0YV9yZWdzOyBkcmVnLT5yZWdfd2lkdGg7ICsraSwgKytkcmVnKSB7CiAJCWZvciAoYml0ID0gMDsgYml0IDwgZHJlZy0+cmVnX3dpZHRoOyBiaXQrKykgewogCQkJaWYgKGRyZWctPmVudW1faWRzW2JpdF0gPT0gcGluLT5lbnVtX2lkKSB7CiAJCQkJZ3Bpb19waW4tPmRyZWcgPSBpOwpAQCAtMTU0LDE3ICsxNTUsMTcgQEAKIAkJCSAgICAgICBpbnQgdmFsdWUpCiB7CiAJc3RydWN0IHNoX3BmY19ncGlvX2RhdGFfcmVnICpyZWc7Ci0JdW5zaWduZWQgbG9uZyBwb3M7CiAJdW5zaWduZWQgaW50IGJpdDsKKwl1bnNpZ25lZCBpbnQgcG9zOwogCiAJZ3Bpb19nZXRfZGF0YV9yZWcoY2hpcCwgb2Zmc2V0LCAmcmVnLCAmYml0KTsKIAogCXBvcyA9IHJlZy0+aW5mby0+cmVnX3dpZHRoIC0gKGJpdCArIDEpOwogCiAJaWYgKHZhbHVlKQotCQlzZXRfYml0KHBvcywgJnJlZy0+c2hhZG93KTsKKwkJcmVnLT5zaGFkb3cgfD0gQklUKHBvcyk7CiAJZWxzZQotCQljbGVhcl9iaXQocG9zLCAmcmVnLT5zaGFkb3cpOworCQlyZWctPnNoYWRvdyAmPSB+QklUKHBvcyk7CiAKIAlncGlvX3dyaXRlX2RhdGFfcmVnKGNoaXAsIHJlZy0+aW5mbywgcmVnLT5zaGFkb3cpOwogfQpAQCAtMTg2LDggKzE4Nyw4IEBACiB7CiAJc3RydWN0IHNoX3BmY19jaGlwICpjaGlwID0gZ3Bpb190b19wZmNfY2hpcChnYyk7CiAJc3RydWN0IHNoX3BmY19ncGlvX2RhdGFfcmVnICpyZWc7Ci0JdW5zaWduZWQgbG9uZyBwb3M7CiAJdW5zaWduZWQgaW50IGJpdDsKKwl1bnNpZ25lZCBpbnQgcG9zOwogCiAJZ3Bpb19nZXRfZGF0YV9yZWcoY2hpcCwgb2Zmc2V0LCAmcmVnLCAmYml0KTsKIApAQCAtMzQxLDYgKzM0Miw3IEBACiBpbnQgc2hfcGZjX3JlZ2lzdGVyX2dwaW9jaGlwKHN0cnVjdCBzaF9wZmMgKnBmYykKIHsKIAlzdHJ1Y3Qgc2hfcGZjX2NoaXAgKmNoaXA7CisJcGh5c19hZGRyX3QgYWRkcmVzczsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgcmV0OwogCkBAIC0zNTIsMTEgKzM1NCwxMiBAQAogCSAqIHRoYXQgY292ZXJzIHRoZSBkYXRhIHJlZ2lzdGVycy4gSW4gdGhhdCBjYXNlIGRvbid0IHRyeSB0byBoYW5kbGUKIAkgKiBHUElPcy4KIAkgKi8KKwlhZGRyZXNzID0gcGZjLT5pbmZvLT5kYXRhX3JlZ3NbMF0ucmVnOwogCWZvciAoaSA9IDA7IGkgPCBwZmMtPm51bV93aW5kb3dzOyArK2kpIHsKIAkJc3RydWN0IHNoX3BmY193aW5kb3cgKndpbmRvdyA9ICZwZmMtPndpbmRvd3NbaV07CiAKLQkJaWYgKHBmYy0+aW5mby0+ZGF0YV9yZWdzWzBdLnJlZyA+PSB3aW5kb3ctPnBoeXMgJiYKLQkJICAgIHBmYy0+aW5mby0+ZGF0YV9yZWdzWzBdLnJlZyA8IHdpbmRvdy0+cGh5cyArIHdpbmRvdy0+c2l6ZSkKKwkJaWYgKGFkZHJlc3MgPj0gd2luZG93LT5waHlzICYmCisJCSAgICBhZGRyZXNzIDwgd2luZG93LT5waHlzICsgd2luZG93LT5zaXplKQogCQkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkwLmMgYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3BmYy1yOGE3NzkwLmMKaW5kZXggODBjMTg0My4uMjJhNTQ3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9wZmMtcjhhNzc5MC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvcGZjLXI4YTc3OTAuYwpAQCAtMTc5OSw2ICsxNzk5LDgxIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF1ZGlvX2Nsa291dF9kX211eFtdID0gewogCUFVRElPX0NMS09VVF9EX01BUkssCiB9OworLyogLSBBVkIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX2xpbmtfcGluc1tdID0geworCVJDQVJfR1BfUElOKDMsIDExKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9saW5rX211eFtdID0geworCUFWQl9MSU5LX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdmJfbWFnaWNfcGluc1tdID0geworCVJDQVJfR1BfUElOKDIsIDE0KSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9tYWdpY19tdXhbXSA9IHsKKwlBVkJfTUFHSUNfTUFSSywKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9waHlfaW50X3BpbnNbXSA9IHsKKwlSQ0FSX0dQX1BJTigyLCAxNSksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdmJfcGh5X2ludF9tdXhbXSA9IHsKKwlBVkJfUEhZX0lOVF9NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX21kaW9fcGluc1tdID0geworCVJDQVJfR1BfUElOKDIsIDExKSwgUkNBUl9HUF9QSU4oMiwgMTIpLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX21kaW9fbXV4W10gPSB7CisJQVZCX01EQ19NQVJLLCBBVkJfTURJT19NQVJLLAorfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgYXZiX21paV9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oMCwgOCksIFJDQVJfR1BfUElOKDAsIDkpLCBSQ0FSX0dQX1BJTigwLCAxMCksCisJUkNBUl9HUF9QSU4oMCwgMTEpLAorCisJUkNBUl9HUF9QSU4oMywgMTMpLCBSQ0FSX0dQX1BJTigyLCAwKSwgUkNBUl9HUF9QSU4oMiwgMSksCisJUkNBUl9HUF9QSU4oMiwgMiksCisKKwlSQ0FSX0dQX1BJTigyLCA3KSwgUkNBUl9HUF9QSU4oMiwgOCksIFJDQVJfR1BfUElOKDIsIDkpLAorCVJDQVJfR1BfUElOKDIsIDEwKSwgUkNBUl9HUF9QSU4oMywgOCksIFJDQVJfR1BfUElOKDMsIDEwKSwKKwlSQ0FSX0dQX1BJTigzLCAxMiksCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdmJfbWlpX211eFtdID0geworCUFWQl9UWEQwX01BUkssIEFWQl9UWEQxX01BUkssIEFWQl9UWEQyX01BUkssCisJQVZCX1RYRDNfTUFSSywKKworCUFWQl9SWEQwX01BUkssIEFWQl9SWEQxX01BUkssIEFWQl9SWEQyX01BUkssCisJQVZCX1JYRDNfTUFSSywKKworCUFWQl9SWF9FUl9NQVJLLCBBVkJfUlhfQ0xLX01BUkssIEFWQl9SWF9EVl9NQVJLLAorCUFWQl9DUlNfTUFSSywgQVZCX1RYX0VOX01BUkssIEFWQl9UWF9DTEtfTUFSSywKKwlBVkJfQ09MX01BUkssCit9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhdmJfZ21paV9waW5zW10gPSB7CisJUkNBUl9HUF9QSU4oMCwgOCksIFJDQVJfR1BfUElOKDAsIDkpLCBSQ0FSX0dQX1BJTigwLCAxMCksCisJUkNBUl9HUF9QSU4oMCwgMTEpLCBSQ0FSX0dQX1BJTigwLCAxMiksIFJDQVJfR1BfUElOKDAsIDEzKSwKKwlSQ0FSX0dQX1BJTigwLCAxNCksIFJDQVJfR1BfUElOKDAsIDE1KSwKKworCVJDQVJfR1BfUElOKDMsIDEzKSwgUkNBUl9HUF9QSU4oMiwgMCksIFJDQVJfR1BfUElOKDIsIDEpLAorCVJDQVJfR1BfUElOKDIsIDIpLCBSQ0FSX0dQX1BJTigyLCAzKSwgUkNBUl9HUF9QSU4oMiwgNCksCisJUkNBUl9HUF9QSU4oMiwgNSksIFJDQVJfR1BfUElOKDIsIDYpLAorCisJUkNBUl9HUF9QSU4oMiwgNyksIFJDQVJfR1BfUElOKDIsIDgpLCBSQ0FSX0dQX1BJTigyLCA5KSwKKwlSQ0FSX0dQX1BJTigyLCAxMCksIFJDQVJfR1BfUElOKDIsIDEzKSwgUkNBUl9HUF9QSU4oMiwgMTYpLAorCVJDQVJfR1BfUElOKDMsIDgpLCBSQ0FSX0dQX1BJTigzLCA5KSwgUkNBUl9HUF9QSU4oMywgMTApLAorCVJDQVJfR1BfUElOKDMsIDEyKSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGF2Yl9nbWlpX211eFtdID0geworCUFWQl9UWEQwX01BUkssIEFWQl9UWEQxX01BUkssIEFWQl9UWEQyX01BUkssCisJQVZCX1RYRDNfTUFSSywgQVZCX1RYRDRfTUFSSywgQVZCX1RYRDVfTUFSSywKKwlBVkJfVFhENl9NQVJLLCBBVkJfVFhEN19NQVJLLAorCisJQVZCX1JYRDBfTUFSSywgQVZCX1JYRDFfTUFSSywgQVZCX1JYRDJfTUFSSywKKwlBVkJfUlhEM19NQVJLLCBBVkJfUlhENF9NQVJLLCBBVkJfUlhENV9NQVJLLAorCUFWQl9SWEQ2X01BUkssIEFWQl9SWEQ3X01BUkssCisKKwlBVkJfUlhfRVJfTUFSSywgQVZCX1JYX0NMS19NQVJLLCBBVkJfUlhfRFZfTUFSSywKKwlBVkJfQ1JTX01BUkssIEFWQl9HVFhfQ0xLX01BUkssIEFWQl9HVFhSRUZDTEtfTUFSSywKKwlBVkJfVFhfRU5fTUFSSywgQVZCX1RYX0VSX01BUkssIEFWQl9UWF9DTEtfTUFSSywKKwlBVkJfQ09MX01BUkssCit9OwogLyogLSBEVSBSR0IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZHVfcmdiNjY2X3BpbnNbXSA9IHsKIAkvKiBSWzc6Ml0sIEdbNzoyXSwgQls3OjJdICovCkBAIC0zODIzLDYgKzM4OTgsMTIgQEAKIAlTSF9QRkNfUElOX0dST1VQKGF1ZGlvX2Nsa291dF9iKSwKIAlTSF9QRkNfUElOX0dST1VQKGF1ZGlvX2Nsa291dF9jKSwKIAlTSF9QRkNfUElOX0dST1VQKGF1ZGlvX2Nsa291dF9kKSwKKwlTSF9QRkNfUElOX0dST1VQKGF2Yl9saW5rKSwKKwlTSF9QRkNfUElOX0dST1VQKGF2Yl9tYWdpYyksCisJU0hfUEZDX1BJTl9HUk9VUChhdmJfcGh5X2ludCksCisJU0hfUEZDX1BJTl9HUk9VUChhdmJfbWRpbyksCisJU0hfUEZDX1BJTl9HUk9VUChhdmJfbWlpKSwKKwlTSF9QRkNfUElOX0dST1VQKGF2Yl9nbWlpKSwKIAlTSF9QRkNfUElOX0dST1VQKGR1X3JnYjY2NiksCiAJU0hfUEZDX1BJTl9HUk9VUChkdV9yZ2I4ODgpLAogCVNIX1BGQ19QSU5fR1JPVVAoZHVfY2xrX291dF8wKSwKQEAgLTQxMDEsNiArNDE4MiwxNSBAQAogCSJhdWRpb19jbGtvdXRfZCIsCiB9OwogCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF2Yl9ncm91cHNbXSA9IHsKKwkiYXZiX2xpbmsiLAorCSJhdmJfbWFnaWMiLAorCSJhdmJfcGh5X2ludCIsCisJImF2Yl9tZGlvIiwKKwkiYXZiX21paSIsCisJImF2Yl9nbWlpIiwKK307CisKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZHVfZ3JvdXBzW10gPSB7CiAJImR1X3JnYjY2NiIsCiAJImR1X3JnYjg4OCIsCkBAIC00NTA3LDYgKzQ1OTcsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNoX3BmY19mdW5jdGlvbiBwaW5tdXhfZnVuY3Rpb25zW10gPSB7CiAJU0hfUEZDX0ZVTkNUSU9OKGF1ZGlvX2NsayksCisJU0hfUEZDX0ZVTkNUSU9OKGF2YiksCiAJU0hfUEZDX0ZVTkNUSU9OKGR1KSwKIAlTSF9QRkNfRlVOQ1RJT04oZHUwKSwKIAlTSF9QRkNfRlVOQ1RJT04oZHUxKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvc2hfcGZjLmggYi9kcml2ZXJzL3BpbmN0cmwvc2gtcGZjL3NoX3BmYy5oCmluZGV4IGM4MzcyODYuLmM3NTA4ZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zaC1wZmMvc2hfcGZjLmgKKysrIGIvZHJpdmVycy9waW5jdHJsL3NoLXBmYy9zaF9wZmMuaApAQCAtNjksOSArNjksMTAgQEAKIH07CiAKIHN0cnVjdCBwaW5tdXhfY2ZnX3JlZyB7Ci0JdW5zaWduZWQgbG9uZyByZWcsIHJlZ193aWR0aCwgZmllbGRfd2lkdGg7CisJdTMyIHJlZzsKKwl1OCByZWdfd2lkdGgsIGZpZWxkX3dpZHRoOwogCWNvbnN0IHUxNiAqZW51bV9pZHM7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyAqdmFyX2ZpZWxkX3dpZHRoOworCWNvbnN0IHU4ICp2YXJfZmllbGRfd2lkdGg7CiB9OwogCiAjZGVmaW5lIFBJTk1VWF9DRkdfUkVHKG5hbWUsIHIsIHJfd2lkdGgsIGZfd2lkdGgpIFwKQEAgLTgwLDEyICs4MSwxMyBAQAogCiAjZGVmaW5lIFBJTk1VWF9DRkdfUkVHX1ZBUihuYW1lLCByLCByX3dpZHRoLCB2YXJfZncwLCB2YXJfZnduLi4uKSBcCiAJLnJlZyA9IHIsIC5yZWdfd2lkdGggPSByX3dpZHRoLAlcCi0JLnZhcl9maWVsZF93aWR0aCA9IChjb25zdCB1bnNpZ25lZCBsb25nIFtyX3dpZHRoXSkgXAorCS52YXJfZmllbGRfd2lkdGggPSAoY29uc3QgdTggW3Jfd2lkdGhdKSBcCiAJCXsgdmFyX2Z3MCwgdmFyX2Z3biwgMCB9LCBcCiAJLmVudW1faWRzID0gKGNvbnN0IHUxNiBbXSkKIAogc3RydWN0IHBpbm11eF9kYXRhX3JlZyB7Ci0JdW5zaWduZWQgbG9uZyByZWcsIHJlZ193aWR0aDsKKwl1MzIgcmVnOworCXU4IHJlZ193aWR0aDsKIAljb25zdCB1MTYgKmVudW1faWRzOwogfTsKIApAQCAtMTQ4LDcgKzE1MCw3IEBACiAJY29uc3Qgc3RydWN0IHBpbm11eF9pcnEgKmdwaW9faXJxOwogCXVuc2lnbmVkIGludCBncGlvX2lycV9zaXplOwogCi0JdW5zaWduZWQgbG9uZyB1bmxvY2tfcmVnOworCXUzMiB1bmxvY2tfcmVnOwogfTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTMwMiwyMCArMzA0LDIxIEBACiAvKgogICogUE9SVG5DUiBtYWNybwogICovCi0jZGVmaW5lIF9QQ1JIKGluLCBpbl9wZCwgaW5fcHUsIG91dCkJXAotCTAsIChvdXQpLCAoaW4pLCAwLAkJXAotCTAsIDAsIDAsIDAsCQkJXAotCTAsIDAsIChpbl9wZCksIDAsCQlcCi0JMCwgMCwgKGluX3B1KSwgMAotCiAjZGVmaW5lIFBPUlRDUihuciwgcmVnKQkJCQkJCQlcCiAJewkJCQkJCQkJXAotCQlQSU5NVVhfQ0ZHX1JFRygiUE9SVCIgbnIgIkNSIiwgcmVnLCA4LCA0KSB7CQlcCi0JCQlfUENSSChQT1JUIyNuciMjX0lOLCAwLCAwLCBQT1JUIyNuciMjX09VVCksCVwKLQkJCQlQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19GTjEsCQlcCi0JCQkJUE9SVCMjbnIjI19GTjIsIFBPUlQjI25yIyNfRk4zLAkJXAotCQkJCVBPUlQjI25yIyNfRk40LCBQT1JUIyNuciMjX0ZONSwJCVwKLQkJCQlQT1JUIyNuciMjX0ZONiwgUE9SVCMjbnIjI19GTjcgfQlcCisJCVBJTk1VWF9DRkdfUkVHX1ZBUigiUE9SVCIgbnIgIkNSIiwgcmVnLCA4LCAyLCAyLCAxLCAzKSB7XAorCQkJLyogUFVMTURbMTowXSwgaGFuZGxlZCBieSAuc2V0X2JpYXMoKSAqLwlcCisJCQkwLCAwLCAwLCAwLAkJCQkJXAorCQkJLyogSUUgYW5kIE9FICovCQkJCQlcCisJCQkwLCBQT1JUIyNuciMjX09VVCwgUE9SVCMjbnIjI19JTiwgMCwJCVwKKwkJCS8qIFNFQywgbm90IHN1cHBvcnRlZCAqLwkJCVwKKwkJCTAsIDAsCQkJCQkJXAorCQkJLyogUFRNRFsyOjBdICovCQkJCQlcCisJCQlQT1JUIyNuciMjX0ZOMCwgUE9SVCMjbnIjI19GTjEsCQkJXAorCQkJUE9SVCMjbnIjI19GTjIsIFBPUlQjI25yIyNfRk4zLAkJCVwKKwkJCVBPUlQjI25yIyNfRk40LCBQT1JUIyNuciMjX0ZONSwJCQlcCisJCQlQT1JUIyNuciMjX0ZONiwgUE9SVCMjbnIjI19GTjcJCQlcCisJCX0JCQkJCQkJXAogCX0KIAogI2VuZGlmIC8qIF9fU0hfUEZDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zaXJmL3BpbmN0cmwtc2lyZi5jIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1zaXJmLmMKaW5kZXggMmExZjA3Mi4uZTJlZmJiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1zaXJmLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3NpcmYvcGluY3RybC1zaXJmLmMKQEAgLTM5LDEwICszOSw5IEBACiBzdHJ1Y3Qgc2lyZnNvY19ncGlvX2NoaXAgewogCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgY2hpcDsKIAlzdHJ1Y3Qgc2lyZnNvY19ncGlvX2Jhbmsgc2dwaW9fYmFua1tTSVJGU09DX0dQSU9fTk9fT0ZfQkFOS1NdOworCXNwaW5sb2NrX3QgbG9jazsKIH07CiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2dwaW9fbG9jayk7Ci0KIHN0YXRpYyBzdHJ1Y3Qgc2lyZnNvY19waW5fZ3JvdXAgKnNpcmZzb2NfcGluX2dyb3VwczsKIHN0YXRpYyBpbnQgc2lyZnNvY19waW5ncnBfY250OwogCkBAIC00MjcsMTMgKzQyNiwxMyBAQAogCiAJb2Zmc2V0ID0gU0lSRlNPQ19HUElPX0NUUkwoYmFuay0+aWQsIGlkeCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2dwaW9fbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzZ3Bpby0+bG9jaywgZmxhZ3MpOwogCiAJdmFsID0gcmVhZGwoc2dwaW8tPmNoaXAucmVncyArIG9mZnNldCk7CiAKIAl3cml0ZWwodmFsLCBzZ3Bpby0+Y2hpcC5yZWdzICsgb2Zmc2V0KTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNncGlvX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZ3Bpby0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCBfX3NpcmZzb2NfZ3Bpb19pcnFfbWFzayhzdHJ1Y3Qgc2lyZnNvY19ncGlvX2NoaXAgKnNncGlvLApAQCAtNDQ1LDE0ICs0NDQsMTQgQEAKIAogCW9mZnNldCA9IFNJUkZTT0NfR1BJT19DVFJMKGJhbmstPmlkLCBpZHgpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNncGlvX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc2dwaW8tPmxvY2ssIGZsYWdzKTsKIAogCXZhbCA9IHJlYWRsKHNncGlvLT5jaGlwLnJlZ3MgKyBvZmZzZXQpOwogCXZhbCAmPSB+U0lSRlNPQ19HUElPX0NUTF9JTlRSX0VOX01BU0s7CiAJdmFsICY9IH5TSVJGU09DX0dQSU9fQ1RMX0lOVFJfU1RTX01BU0s7CiAJd3JpdGVsKHZhbCwgc2dwaW8tPmNoaXAucmVncyArIG9mZnNldCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZ3Bpb19sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2dwaW8tPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgc2lyZnNvY19ncGlvX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKQEAgLTQ3NSwxNCArNDc0LDE0IEBACiAKIAlvZmZzZXQgPSBTSVJGU09DX0dQSU9fQ1RSTChiYW5rLT5pZCwgaWR4KTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzZ3Bpb19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNncGlvLT5sb2NrLCBmbGFncyk7CiAKIAl2YWwgPSByZWFkbChzZ3Bpby0+Y2hpcC5yZWdzICsgb2Zmc2V0KTsKIAl2YWwgJj0gflNJUkZTT0NfR1BJT19DVExfSU5UUl9TVFNfTUFTSzsKIAl2YWwgfD0gU0lSRlNPQ19HUElPX0NUTF9JTlRSX0VOX01BU0s7CiAJd3JpdGVsKHZhbCwgc2dwaW8tPmNoaXAucmVncyArIG9mZnNldCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZ3Bpb19sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2dwaW8tPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGludCBzaXJmc29jX2dwaW9faXJxX3R5cGUoc3RydWN0IGlycV9kYXRhICpkLCB1bnNpZ25lZCB0eXBlKQpAQCAtNDk2LDcgKzQ5NSw3IEBACiAKIAlvZmZzZXQgPSBTSVJGU09DX0dQSU9fQ1RSTChiYW5rLT5pZCwgaWR4KTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzZ3Bpb19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNncGlvLT5sb2NrLCBmbGFncyk7CiAKIAl2YWwgPSByZWFkbChzZ3Bpby0+Y2hpcC5yZWdzICsgb2Zmc2V0KTsKIAl2YWwgJj0gfihTSVJGU09DX0dQSU9fQ1RMX0lOVFJfU1RTX01BU0sgfCBTSVJGU09DX0dQSU9fQ1RMX09VVF9FTl9NQVNLKTsKQEAgLTUzMyw3ICs1MzIsNyBAQAogCiAJd3JpdGVsKHZhbCwgc2dwaW8tPmNoaXAucmVncyArIG9mZnNldCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZ3Bpb19sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2dwaW8tPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTY4LDcgKzU2Nyw3IEBACiAJc3RhdHVzID0gcmVhZGwoc2dwaW8tPmNoaXAucmVncyArIFNJUkZTT0NfR1BJT19JTlRfU1RBVFVTKGJhbmstPmlkKSk7CiAJaWYgKCFzdGF0dXMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkJIiVzOiBncGlvIGlkICVkIHN0YXR1cyAlI3ggbm8gaW50ZXJydXB0IGlzIGZsYWdlZFxuIiwKKwkJCSIlczogZ3BpbyBpZCAlZCBzdGF0dXMgJSN4IG5vIGludGVycnVwdCBpcyBmbGFnZ2VkXG4iLAogCQkJX19mdW5jX18sIGJhbmstPmlkLCBzdGF0dXMpOwogCQloYW5kbGVfYmFkX2lycShpcnEsIGRlc2MpOwogCQlyZXR1cm47CkBAIC02OTcsMTEgKzY5NiwxMSBAQAogCiAJb2Zmc2V0ID0gU0lSRlNPQ19HUElPX0NUUkwoYmFuay0+aWQsIGlkeCk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2dwaW9fbG9jaywgZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzZ3Bpby0+bG9jaywgZmxhZ3MpOwogCiAJc2lyZnNvY19ncGlvX3NldF9vdXRwdXQoc2dwaW8sIGJhbmssIG9mZnNldCwgdmFsdWUpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2dwaW9fbG9jaywgZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNncGlvLT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc5Myw2ICs3OTIsNyBAQAogCXNncGlvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqc2dwaW8pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNncGlvKQogCQlyZXR1cm4gLUVOT01FTTsKKwlzcGluX2xvY2tfaW5pdCgmc2dwaW8tPmxvY2spOwogCiAJcmVncyA9IG9mX2lvbWFwKG5wLCAwKTsKIAlpZiAoIXJlZ3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW40aS1hMTAuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjRpLWExMC5jCmluZGV4IDI0YzVkODguLjczNzZhOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjRpLWExMC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjRpLWExMC5jCkBAIC0xMDExLDYgKzEwMTEsNyBAQAogCS5waW5zID0gc3VuNGlfYTEwX3BpbnMsCiAJLm5waW5zID0gQVJSQVlfU0laRShzdW40aV9hMTBfcGlucyksCiAJLmlycV9iYW5rcyA9IDEsCisJLmlycV9yZWFkX25lZWRzX211eCA9IHRydWUsCiB9OwogCiBzdGF0aWMgaW50IHN1bjRpX2ExMF9waW5jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0xMDE5LDcgKzEwMjAsNyBAQAogCQkJCSAgJnN1bjRpX2ExMF9waW5jdHJsX2RhdGEpOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzdW40aV9hMTBfcGluY3RybF9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNGlfYTEwX3BpbmN0cmxfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW40aS1hMTAtcGluY3RybCIsIH0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW41aS1hMTBzLmMgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW41aS1hMTBzLmMKaW5kZXggNDVhMzUxYS4uNjM2NzY2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNWktYTEwcy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjVpLWExMHMuYwpAQCAtNjcwLDcgKzY3MCw3IEBACiAJCQkJICAmc3VuNWlfYTEwc19waW5jdHJsX2RhdGEpOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzdW41aV9hMTBzX3BpbmN0cmxfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjVpX2ExMHNfcGluY3RybF9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjVpLWExMHMtcGluY3RybCIsIH0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW41aS1hMTMuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjVpLWExMy5jCmluZGV4IDRiZDIzNDcuLjJiYjA3YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjVpLWExMy5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjVpLWExMy5jCkBAIC0zODgsNyArMzg4LDcgQEAKIAkJCQkgICZzdW41aV9hMTNfcGluY3RybF9kYXRhKTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNWlfYTEzX3BpbmN0cmxfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjVpX2ExM19waW5jdHJsX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNWktYTEzLXBpbmN0cmwiLCB9LAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNmktYTMxLXIuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjZpLWEzMS1yLmMKaW5kZXggMDIxNzRmYS4uOTU5NmIwYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjZpLWEzMS1yLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNmktYTMxLXIuYwpAQCAtMTIwLDcgKzEyMCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNmlfYTMxX3JfcGluY3RybF9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNmlfYTMxX3JfcGluY3RybF9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjZpLWEzMS1yLXBpbmN0cmwiLCB9LAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNmktYTMxLmMgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW42aS1hMzEuYwppbmRleCAxODAzOGYwLi4wMjI4NjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW42aS1hMzEuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW42aS1hMzEuYwpAQCAtOTIyLDcgKzkyMiw3IEBACiAJCQkJICAmc3VuNmlfYTMxX3BpbmN0cmxfZGF0YSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjZpX2EzMV9waW5jdHJsX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW42aV9hMzFfcGluY3RybF9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjZpLWEzMS1waW5jdHJsIiwgfSwKIAl7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjZpLWEzMXMuYyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjZpLWEzMXMuYwppbmRleCA5YjVhOTFmLi5kMzcyNWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW42aS1hMzFzLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuNmktYTMxcy5jCkBAIC03OTQsNyArNzk0LDcgQEAKIAkJCQkgICZzdW42aV9hMzFzX3BpbmN0cmxfZGF0YSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjZpX2EzMXNfcGluY3RybF9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuNmlfYTMxc19waW5jdHJsX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhbGx3aW5uZXIsc3VuNmktYTMxcy1waW5jdHJsIiwgfSwKIAl7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjdpLWEyMC5jIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuN2ktYTIwLmMKaW5kZXggNmFmNmNjOC4uY2YxY2UwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuN2ktYTIwLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuN2ktYTIwLmMKQEAgLTEwNDUsNyArMTA0NSw3IEBACiAJCQkJICAmc3VuN2lfYTIwX3BpbmN0cmxfZGF0YSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjdpX2EyMF9waW5jdHJsX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW43aV9hMjBfcGluY3RybF9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjdpLWEyMC1waW5jdHJsIiwgfSwKIAl7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWEyMy1yLmMgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1hMjMtci5jCmluZGV4IDMyN2UwM2YuLjA1NjI4NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjhpLWEyMy1yLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktYTIzLXIuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuOGlfYTIzX3JfcGluY3RybF9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuOGlfYTIzX3JfcGluY3RybF9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjhpLWEyMy1yLXBpbmN0cmwiLCB9LAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOGktYTIzLmMgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1hMjMuYwppbmRleCA2MjY5NWM5Li41NTA4M2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1hMjMuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW44aS1hMjMuYwpAQCAtNTcxLDcgKzU3MSw3IEBACiAJCQkJICAmc3VuOGlfYTIzX3BpbmN0cmxfZGF0YSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN1bjhpX2EyM19waW5jdHJsX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzdW44aV9hMjNfcGluY3RybF9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYWxsd2lubmVyLHN1bjhpLWEyMy1waW5jdHJsIiwgfSwKIAl7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bjlpLWE4MC5jIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOWktYTgwLmMKaW5kZXggYWRiMjk0Mi4uMWI1ODBiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOWktYTgwLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VuOWktYTgwLmMKQEAgLTcyOSw3ICs3MjksNyBAQAogCQkJCSAgJnN1bjlpX2E4MF9waW5jdHJsX2RhdGEpOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzdW45aV9hODBfcGluY3RybF9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3VuOWlfYTgwX3BpbmN0cmxfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImFsbHdpbm5lcixzdW45aS1hODAtcGluY3RybCIsIH0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW54aS5jIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VueGkuYwppbmRleCAzZDA3NDQzLi5mOGUxNzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW54aS5jCisrKyBiL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bnhpLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICIuLi9jb3JlLmgiCisjaW5jbHVkZSAiLi4vLi4vZ3Bpby9ncGlvbGliLmgiCiAjaW5jbHVkZSAicGluY3RybC1zdW54aS5oIgogCiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIHN1bnhpX3BpbmN0cmxfZWRnZV9pcnFfY2hpcDsKQEAgLTQ2NCwxMCArNDY1LDE5IEBACiBzdGF0aWMgaW50IHN1bnhpX3BpbmN0cmxfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQogewogCXN0cnVjdCBzdW54aV9waW5jdHJsICpwY3RsID0gZGV2X2dldF9kcnZkYXRhKGNoaXAtPmRldik7Ci0KIAl1MzIgcmVnID0gc3VueGlfZGF0YV9yZWcob2Zmc2V0KTsKIAl1OCBpbmRleCA9IHN1bnhpX2RhdGFfb2Zmc2V0KG9mZnNldCk7Ci0JdTMyIHZhbCA9IChyZWFkbChwY3RsLT5tZW1iYXNlICsgcmVnKSA+PiBpbmRleCkgJiBEQVRBX1BJTlNfTUFTSzsKKwl1MzIgc2V0X211eCA9IHBjdGwtPmRlc2MtPmlycV9yZWFkX25lZWRzX211eCAmJgorCQkJdGVzdF9iaXQoRkxBR19VU0VEX0FTX0lSUSwgJmNoaXAtPmRlc2Nbb2Zmc2V0XS5mbGFncyk7CisJdTMyIHZhbDsKKworCWlmIChzZXRfbXV4KQorCQlzdW54aV9wbXhfc2V0KHBjdGwtPnBjdGxfZGV2LCBvZmZzZXQsIFNVTjRJX0ZVTkNfSU5QVVQpOworCisJdmFsID0gKHJlYWRsKHBjdGwtPm1lbWJhc2UgKyByZWcpID4+IGluZGV4KSAmIERBVEFfUElOU19NQVNLOworCisJaWYgKHNldF9tdXgpCisJCXN1bnhpX3BteF9zZXQocGN0bC0+cGN0bF9kZXYsIG9mZnNldCwgU1VONElfRlVOQ19JUlEpOwogCiAJcmV0dXJuIHZhbDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bnhpLmggYi9kcml2ZXJzL3BpbmN0cmwvc3VueGkvcGluY3RybC1zdW54aS5oCmluZGV4IDVhNTE1MjMuLmUyNDhlODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC9zdW54aS9waW5jdHJsLXN1bnhpLmgKKysrIGIvZHJpdmVycy9waW5jdHJsL3N1bnhpL3BpbmN0cmwtc3VueGkuaApAQCAtNzcsNiArNzcsOSBAQAogI2RlZmluZSBJUlFfTEVWRUxfTE9XCQkweDAzCiAjZGVmaW5lIElSUV9FREdFX0JPVEgJCTB4MDQKIAorI2RlZmluZSBTVU40SV9GVU5DX0lOUFVUCTAKKyNkZWZpbmUgU1VONElfRlVOQ19JUlEJCTYKKwogc3RydWN0IHN1bnhpX2Rlc2NfZnVuY3Rpb24gewogCWNvbnN0IGNoYXIJKm5hbWU7CiAJdTgJCW11eHZhbDsKQEAgLTk0LDYgKzk3LDcgQEAKIAlpbnQJCQkJbnBpbnM7CiAJdW5zaWduZWQJCQlwaW5fYmFzZTsKIAl1bnNpZ25lZAkJCWlycV9iYW5rczsKKwlib29sCQkJCWlycV9yZWFkX25lZWRzX211eDsKIH07CiAKIHN0cnVjdCBzdW54aV9waW5jdHJsX2Z1bmN0aW9uIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC92dDg1MDAvcGluY3RybC12dDg1MDAuYyBiL2RyaXZlcnMvcGluY3RybC92dDg1MDAvcGluY3RybC12dDg1MDAuYwppbmRleCBjZjhiYmM5Li5jYTk0NmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvdnQ4NTAwL3BpbmN0cmwtdnQ4NTAwLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3Z0ODUwMC9waW5jdHJsLXZ0ODUwMC5jCkBAIC00NzgsNyArNDc4LDcgQEAKIAlyZXR1cm4gd210X3BpbmN0cmxfcmVtb3ZlKHBkZXYpOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB3bXRfcGluY3RybF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd210X3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInZpYSx2dDg1MDAtcGluY3RybCIgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3Z0ODUwMC9waW5jdHJsLXdtODUwNS5jIGIvZHJpdmVycy9waW5jdHJsL3Z0ODUwMC9waW5jdHJsLXdtODUwNS5jCmluZGV4IDNmOWMzMmQuLjYyNmZjN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC92dDg1MDAvcGluY3RybC13bTg1MDUuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvdnQ4NTAwL3BpbmN0cmwtd204NTA1LmMKQEAgLTUwOSw3ICs1MDksNyBAQAogCXJldHVybiB3bXRfcGluY3RybF9yZW1vdmUocGRldik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtdF9waW5jdHJsX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bXRfcGluY3RybF9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAid20sd204NTA1LXBpbmN0cmwiIH0sCiAJeyAvKiBzZW50aW5lbCAqLyB9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGluY3RybC92dDg1MDAvcGluY3RybC13bTg2NTAuYyBiL2RyaXZlcnMvcGluY3RybC92dDg1MDAvcGluY3RybC13bTg2NTAuYwppbmRleCA0ZTgwZjk4Li44OTUzYWJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BpbmN0cmwvdnQ4NTAwL3BpbmN0cmwtd204NjUwLmMKKysrIGIvZHJpdmVycy9waW5jdHJsL3Z0ODUwMC9waW5jdHJsLXdtODY1MC5jCkBAIC0zNDcsNyArMzQ3LDcgQEAKIAlyZXR1cm4gd210X3BpbmN0cmxfcmVtb3ZlKHBkZXYpOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB3bXRfcGluY3RybF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd210X3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gIndtLHdtODY1MC1waW5jdHJsIiB9LAogCXsgLyogc2VudGluZWwgKi8gfSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BpbmN0cmwvdnQ4NTAwL3BpbmN0cmwtd204NzUwLmMgYi9kcml2ZXJzL3BpbmN0cmwvdnQ4NTAwL3BpbmN0cmwtd204NzUwLmMKaW5kZXggNDdiNTJhNy4uYzc5MDUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9waW5jdHJsL3Z0ODUwMC9waW5jdHJsLXdtODc1MC5jCisrKyBiL2RyaXZlcnMvcGluY3RybC92dDg1MDAvcGluY3RybC13bTg3NTAuYwpAQCAtMzg2LDcgKzM4Niw3IEBACiAJcmV0dXJuIHdtdF9waW5jdHJsX3JlbW92ZShwZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgd210X3BpbmN0cmxfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtdF9waW5jdHJsX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJ3bSx3bTg3NTAtcGluY3RybCIgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9waW5jdHJsL3Z0ODUwMC9waW5jdHJsLXdtODg1MC5jIGIvZHJpdmVycy9waW5jdHJsL3Z0ODUwMC9waW5jdHJsLXdtODg1MC5jCmluZGV4IDhiYmIzOGMuLmYyMzJiMTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGluY3RybC92dDg1MDAvcGluY3RybC13bTg4NTAuYworKysgYi9kcml2ZXJzL3BpbmN0cmwvdnQ4NTAwL3BpbmN0cmwtd204ODUwLmMKQEAgLTM2NSw3ICszNjUsNyBAQAogCXJldHVybiB3bXRfcGluY3RybF9yZW1vdmUocGRldik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtdF9waW5jdHJsX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB3bXRfcGluY3RybF9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAid20sd204ODUwLXBpbmN0cmwiIH0sCiAJeyAvKiBzZW50aW5lbCAqLyB9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FwcGxlLWdtdXguYyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2FwcGxlLWdtdXguYwppbmRleCBiOTQyOWZiLi42NmQ2ZDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9hcHBsZS1nbXV4LmMKKysrIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvYXBwbGUtZ211eC5jCkBAIC02MjQsMTkgKzYyNCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGFwcGxlX2dtdXhfaW5pdCh2b2lkKQotewotCXJldHVybiBwbnBfcmVnaXN0ZXJfZHJpdmVyKCZnbXV4X3BucF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYXBwbGVfZ211eF9leGl0KHZvaWQpCi17Ci0JcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZnbXV4X3BucF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChhcHBsZV9nbXV4X2luaXQpOwotbW9kdWxlX2V4aXQoYXBwbGVfZ211eF9leGl0KTsKLQorbW9kdWxlX3BucF9kcml2ZXIoZ211eF9wbnBfZHJpdmVyKTsKIE1PRFVMRV9BVVRIT1IoIlNldGggRm9yc2hlZSA8c2V0aC5mb3JzaGVlQGNhbm9uaWNhbC5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFwcGxlIEdtdXggRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9jb21wYWwtbGFwdG9wLmMKaW5kZXggMTVjMGZhYi4uYjRlOTQ0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvY29tcGFsLWxhcHRvcC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2NvbXBhbC1sYXB0b3AuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAJdW5zaWduZWQgY2hhciBjdXJyX3B3bTsKIAogCS8qIFBvd2VyIHN1cHBseSAqLwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgcHN5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeTsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2luZm8gcHN5X2luZm87CiAJY2hhciBiYXRfbW9kZWxfbmFtZVtCQVRfTU9ERUxfTkFNRV9MRU4gKyAxXTsKIAljaGFyIGJhdF9tYW51ZmFjdHVyZXJfbmFtZVtCQVRfTUFOVUZBQ1RVUkVSX05BTUVfTEVOICsgMV07CkBAIC01NjUsOCArNTY1LDcgQEAKIAkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgY29tcGFsX2RhdGEgKmRhdGE7Ci0JZGF0YSA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBjb21wYWxfZGF0YSwgcHN5KTsKKwlzdHJ1Y3QgY29tcGFsX2RhdGEgKmRhdGEgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAogCXN3aXRjaCAocHNwKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CkBAIC04NzUsMTMgKzg3NCwxNiBAQAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoZG1pLCBjb21wYWxfZG1pX3RhYmxlKTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBwc3lfYmF0X2Rlc2MgPSB7CisJLm5hbWUJCT0gRFJJVkVSX05BTUUsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwk9IGNvbXBhbF9iYXRfcHJvcGVydGllcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKGNvbXBhbF9iYXRfcHJvcGVydGllcyksCisJLmdldF9wcm9wZXJ0eQk9IGJhdF9nZXRfcHJvcGVydHksCit9OworCiBzdGF0aWMgdm9pZCBpbml0aWFsaXplX3Bvd2VyX3N1cHBseV9kYXRhKHN0cnVjdCBjb21wYWxfZGF0YSAqZGF0YSkKIHsKLQlkYXRhLT5wc3kubmFtZSA9IERSSVZFUl9OQU1FOwotCWRhdGEtPnBzeS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQlkYXRhLT5wc3kucHJvcGVydGllcyA9IGNvbXBhbF9iYXRfcHJvcGVydGllczsKLQlkYXRhLT5wc3kubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGNvbXBhbF9iYXRfcHJvcGVydGllcyk7Ci0JZGF0YS0+cHN5LmdldF9wcm9wZXJ0eSA9IGJhdF9nZXRfcHJvcGVydHk7CiAKIAllY19yZWFkX3NlcXVlbmNlKEJBVF9NQU5VRkFDVFVSRVJfTkFNRV9BRERSLAogCQkJCQlkYXRhLT5iYXRfbWFudWZhY3R1cmVyX25hbWUsCkBAIC0xMDExLDYgKzEwMTMsNyBAQAogCWludCBlcnI7CiAJc3RydWN0IGNvbXBhbF9kYXRhICpkYXRhOwogCXN0cnVjdCBkZXZpY2UgKmh3bW9uX2RldjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAKIAlpZiAoIWV4dHJhX2ZlYXR1cmVzKQogCQlyZXR1cm4gMDsKQEAgLTEwMjYsOSArMTAyOSw5IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcygmcGRldi0+ZGV2LAotCQkJCQkJICAgICAgImNvbXBhbCIsIGRhdGEsCi0JCQkJCQkgICAgICBjb21wYWxfaHdtb25fZ3JvdXBzKTsKKwlod21vbl9kZXYgPSBkZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2dyb3VwcygmcGRldi0+ZGV2LAorCQkJCQkJCSAgICJjb21wYWwiLCBkYXRhLAorCQkJCQkJCSAgIGNvbXBhbF9od21vbl9ncm91cHMpOwogCWlmIChJU19FUlIoaHdtb25fZGV2KSkgewogCQllcnIgPSBQVFJfRVJSKGh3bW9uX2Rldik7CiAJCWdvdG8gcmVtb3ZlOwpAQCAtMTAzNiw3ICsxMDM5LDEzIEBACiAKIAkvKiBQb3dlciBzdXBwbHkgKi8KIAlpbml0aWFsaXplX3Bvd2VyX3N1cHBseV9kYXRhKGRhdGEpOwotCXBvd2VyX3N1cHBseV9yZWdpc3RlcigmY29tcGFsX2RldmljZS0+ZGV2LCAmZGF0YS0+cHN5KTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gZGF0YTsKKwlkYXRhLT5wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNvbXBhbF9kZXZpY2UtPmRldiwgJnBzeV9iYXRfZGVzYywKKwkJCQkJICAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihkYXRhLT5wc3kpKSB7CisJCWVyciA9IFBUUl9FUlIoZGF0YS0+cHN5KTsKKwkJZ290byByZW1vdmU7CisJfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CiAKQEAgLTEwNzEsNyArMTA4MCw3IEBACiAJcHdtX2Rpc2FibGVfY29udHJvbCgpOwogCiAJZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkYXRhLT5wc3kpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRhdGEtPnBzeSk7CiAKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmY29tcGFsX3BsYXRmb3JtX2F0dHJfZ3JvdXApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9mdWppdHN1LXRhYmxldC5jIGIvZHJpdmVycy9wbGF0Zm9ybS94ODYvZnVqaXRzdS10YWJsZXQuYwppbmRleCA1M2JkYmIwLi5iYWVhMDc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9mdWppdHN1LXRhYmxldC5jCisrKyBiL2RyaXZlcnMvcGxhdGZvcm0veDg2L2Z1aml0c3UtdGFibGV0LmMKQEAgLTU5LDcgKzU5LDcgQEAKIAlLRVlfUkVTRVJWRUQsCiAJS0VZX1NDUk9MTERPV04sCiAJS0VZX1NDUk9MTFVQLAotCUtFWV9ESVJFQ1RJT04sCisJS0VZX1JPVEFURV9ESVNQTEFZLAogCUtFWV9MRUZUQ1RSTCwKIAlLRVlfQlJJR0hUTkVTU1VQLAogCUtFWV9CUklHSFRORVNTRE9XTiwKQEAgLTExNiw3ICsxMTYsNyBAQAogCUtFWV9SRVNFUlZFRCwKIAlLRVlfUFJPRzEsCiAJS0VZX1BST0cyLAotCUtFWV9ESVJFQ1RJT04sCisJS0VZX1JPVEFURV9ESVNQTEFZLAogCUtFWV9SRVNFUlZFRCwKIAlLRVlfUkVTRVJWRUQsCiAJS0VZX1JFU0VSVkVELApAQCAtMTUzLDcgKzE1Myw3IEBACiAJS0VZX1JFU0VSVkVELAogCUtFWV9SRVNFUlZFRCwKIAlLRVlfTUFJTCwKLQlLRVlfRElSRUNUSU9OLAorCUtFWV9ST1RBVEVfRElTUExBWSwKIAlLRVlfRVNDLAogCUtFWV9FTlRFUiwKIAlLRVlfQlJJR0hUTkVTU1VQLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvaHAtd21pLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYwppbmRleCAwYWIyYjM3Li4wNjY5NzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni9ocC13bWkuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiAJeyBLRV9LRVksIDB4MjBlOCwgeyBLRVlfTUVESUEgfSB9LAogCXsgS0VfS0VZLCAweDIxNDIsIHsgS0VZX01FRElBIH0gfSwKIAl7IEtFX0tFWSwgMHgyMTNiLCB7IEtFWV9JTkZPIH0gfSwKLQl7IEtFX0tFWSwgMHgyMTY5LCB7IEtFWV9ESVJFQ1RJT04gfSB9LAorCXsgS0VfS0VZLCAweDIxNjksIHsgS0VZX1JPVEFURV9ESVNQTEFZIH0gfSwKIAl7IEtFX0tFWSwgMHgyMTZhLCB7IEtFWV9TRVRVUCB9IH0sCiAJeyBLRV9LRVksIDB4MjMxYiwgeyBLRVlfSEVMUCB9IH0sCiAJeyBLRV9FTkQsIDAgfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvYmFzZS5oIGIvZHJpdmVycy9wbnAvYmFzZS5oCmluZGV4IGM4ODczYjAuLjMxNTFmZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG5wL2Jhc2UuaAorKysgYi9kcml2ZXJzL3BucC9iYXNlLmgKQEAgLTMsNyArMyw3IEBACiAgKglCam9ybiBIZWxnYWFzIDxiam9ybi5oZWxnYWFzQGhwLmNvbT4KICAqLwogCi1leHRlcm4gc3BpbmxvY2tfdCBwbnBfbG9jazsKK2V4dGVybiBzdHJ1Y3QgbXV0ZXggcG5wX2xvY2s7CiBleHRlcm4gY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqcG5wX2Rldl9ncm91cHNbXTsKIHZvaWQgKnBucF9hbGxvYyhsb25nIHNpemUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9jYXJkLmMgYi9kcml2ZXJzL3BucC9jYXJkLmMKaW5kZXggODc0YzIzNi4uMzFhZDlmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvY2FyZC5jCisrKyBiL2RyaXZlcnMvcG5wL2NhcmQuYwpAQCAtNSw2ICs1LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9wbnAuaD4KQEAgLTI0NCwxMCArMjQ1LDEwIEBACiAJfQogCiAJcG5wX2ludGVyZmFjZV9hdHRhY2hfY2FyZChjYXJkKTsKLQlzcGluX2xvY2soJnBucF9sb2NrKTsKKwltdXRleF9sb2NrKCZwbnBfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmY2FyZC0+Z2xvYmFsX2xpc3QsICZwbnBfY2FyZHMpOwogCWxpc3RfYWRkX3RhaWwoJmNhcmQtPnByb3RvY29sX2xpc3QsICZjYXJkLT5wcm90b2NvbC0+Y2FyZHMpOwotCXNwaW5fdW5sb2NrKCZwbnBfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwbnBfbG9jayk7CiAKIAkvKiB3ZSB3YWl0IHVudGlsIG5vdyB0byBhZGQgZGV2aWNlcyBpbiBvcmRlciB0byBlbnN1cmUgdGhlIGRyaXZlcnMKIAkgKiB3aWxsIGJlIGFibGUgdG8gdXNlIGFsbCBvZiB0aGUgcmVsYXRlZCBkZXZpY2VzIG9uIHRoZSBjYXJkCkBAIC0yNzYsMTAgKzI3NywxMCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcywgKnRlbXA7CiAKIAlkZXZpY2VfdW5yZWdpc3RlcigmY2FyZC0+ZGV2KTsKLQlzcGluX2xvY2soJnBucF9sb2NrKTsKKwltdXRleF9sb2NrKCZwbnBfbG9jayk7CiAJbGlzdF9kZWwoJmNhcmQtPmdsb2JhbF9saXN0KTsKIAlsaXN0X2RlbCgmY2FyZC0+cHJvdG9jb2xfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnBucF9sb2NrKTsKKwltdXRleF91bmxvY2soJnBucF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCB0ZW1wLCAmY2FyZC0+ZGV2aWNlcykgewogCQlzdHJ1Y3QgcG5wX2RldiAqZGV2ID0gY2FyZF90b19wbnBfZGV2KHBvcyk7CiAJCXBucF9yZW1vdmVfY2FyZF9kZXZpY2UoZGV2KTsKQEAgLTI5NywxMCArMjk4LDEwIEBACiAJZGV2LT5jYXJkX2xpbmsgPSBOVUxMOwogCWRldl9zZXRfbmFtZSgmZGV2LT5kZXYsICIlMDJ4OiUwMnguJTAyeCIsCiAJCSAgICAgZGV2LT5wcm90b2NvbC0+bnVtYmVyLCBjYXJkLT5udW1iZXIsIGRldi0+bnVtYmVyKTsKLQlzcGluX2xvY2soJnBucF9sb2NrKTsKKwltdXRleF9sb2NrKCZwbnBfbG9jayk7CiAJZGV2LT5jYXJkID0gY2FyZDsKIAlsaXN0X2FkZF90YWlsKCZkZXYtPmNhcmRfbGlzdCwgJmNhcmQtPmRldmljZXMpOwotCXNwaW5fdW5sb2NrKCZwbnBfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwbnBfbG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTMxMCwxMCArMzExLDEwIEBACiAgKi8KIHZvaWQgcG5wX3JlbW92ZV9jYXJkX2RldmljZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewotCXNwaW5fbG9jaygmcG5wX2xvY2spOworCW11dGV4X2xvY2soJnBucF9sb2NrKTsKIAlkZXYtPmNhcmQgPSBOVUxMOwogCWxpc3RfZGVsKCZkZXYtPmNhcmRfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnBucF9sb2NrKTsKKwltdXRleF91bmxvY2soJnBucF9sb2NrKTsKIAlfX3BucF9yZW1vdmVfZGV2aWNlKGRldik7CiB9CiAKQEAgLTQyNiw5ICs0MjcsOSBAQAogCWlmIChlcnJvciA8IDApCiAJCXJldHVybiBlcnJvcjsKIAotCXNwaW5fbG9jaygmcG5wX2xvY2spOworCW11dGV4X2xvY2soJnBucF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZkcnYtPmdsb2JhbF9saXN0LCAmcG5wX2NhcmRfZHJpdmVycyk7Ci0Jc3Bpbl91bmxvY2soJnBucF9sb2NrKTsKKwltdXRleF91bmxvY2soJnBucF9sb2NrKTsKIAogCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRlbXAsICZwbnBfY2FyZHMpIHsKIAkJc3RydWN0IHBucF9jYXJkICpjYXJkID0KQEAgLTQ0NCw5ICs0NDUsOSBAQAogICovCiB2b2lkIHBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKHN0cnVjdCBwbnBfY2FyZF9kcml2ZXIgKmRydikKIHsKLQlzcGluX2xvY2soJnBucF9sb2NrKTsKKwltdXRleF9sb2NrKCZwbnBfbG9jayk7CiAJbGlzdF9kZWwoJmRydi0+Z2xvYmFsX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZwbnBfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwbnBfbG9jayk7CiAJcG5wX3VucmVnaXN0ZXJfZHJpdmVyKCZkcnYtPmxpbmspOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BucC9jb3JlLmMgYi9kcml2ZXJzL3BucC9jb3JlLmMKaW5kZXggY2I2Y2U0Mi4uYjU0NjIwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvY29yZS5jCisrKyBiL2RyaXZlcnMvcG5wL2NvcmUuYwpAQCAtOSw2ICs5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMTksNyArMjAsNyBAQAogCiBzdGF0aWMgTElTVF9IRUFEKHBucF9wcm90b2NvbHMpOwogTElTVF9IRUFEKHBucF9nbG9iYWwpOwotREVGSU5FX1NQSU5MT0NLKHBucF9sb2NrKTsKK0RFRklORV9NVVRFWChwbnBfbG9jayk7CiAKIC8qCiAgKiBBQ1BJIG9yIFBOUEJJT1Mgc2hvdWxkIHRlbGwgdXMgYWJvdXQgYWxsIHBsYXRmb3JtIGRldmljZXMsIHNvIHdlIGNhbgpAQCAtNDEsNiArNDIsMTMgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgdm9pZCBwbnBfcmVtb3ZlX3Byb3RvY29sKHN0cnVjdCBwbnBfcHJvdG9jb2wgKnByb3RvY29sKQoreworCW11dGV4X2xvY2soJnBucF9sb2NrKTsKKwlsaXN0X2RlbCgmcHJvdG9jb2wtPnByb3RvY29sX2xpc3QpOworCW11dGV4X3VubG9jaygmcG5wX2xvY2spOworfQorCiAvKioKICAqIHBucF9wcm90b2NvbF9yZWdpc3RlciAtIGFkZHMgYSBwbnAgcHJvdG9jb2wgdG8gdGhlIHBucCBsYXllcgogICogQHByb3RvY29sOiBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIHBucF9wcm90b2NvbCBzdHJ1Y3R1cmUKQEAgLTQ5LDEzICs1NywxNCBAQAogICovCiBpbnQgcG5wX3JlZ2lzdGVyX3Byb3RvY29sKHN0cnVjdCBwbnBfcHJvdG9jb2wgKnByb3RvY29sKQogewotCWludCBub2RlbnVtOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBvczsKKwlpbnQgbm9kZW51bSwgcmV0OwogCiAJSU5JVF9MSVNUX0hFQUQoJnByb3RvY29sLT5kZXZpY2VzKTsKIAlJTklUX0xJU1RfSEVBRCgmcHJvdG9jb2wtPmNhcmRzKTsKIAlub2RlbnVtID0gMDsKLQlzcGluX2xvY2soJnBucF9sb2NrKTsKKworCW11dGV4X2xvY2soJnBucF9sb2NrKTsKIAogCS8qIGFzc2lnbiB0aGUgbG93ZXN0IHVudXNlZCBudW1iZXIgKi8KIAlsaXN0X2Zvcl9lYWNoKHBvcywgJnBucF9wcm90b2NvbHMpIHsKQEAgLTY2LDEyICs3NSwxOCBAQAogCQl9CiAJfQogCi0JbGlzdF9hZGRfdGFpbCgmcHJvdG9jb2wtPnByb3RvY29sX2xpc3QsICZwbnBfcHJvdG9jb2xzKTsKLQlzcGluX3VubG9jaygmcG5wX2xvY2spOwotCiAJcHJvdG9jb2wtPm51bWJlciA9IG5vZGVudW07CiAJZGV2X3NldF9uYW1lKCZwcm90b2NvbC0+ZGV2LCAicG5wJWQiLCBub2RlbnVtKTsKLQlyZXR1cm4gZGV2aWNlX3JlZ2lzdGVyKCZwcm90b2NvbC0+ZGV2KTsKKworCWxpc3RfYWRkX3RhaWwoJnByb3RvY29sLT5wcm90b2NvbF9saXN0LCAmcG5wX3Byb3RvY29scyk7CisKKwltdXRleF91bmxvY2soJnBucF9sb2NrKTsKKworCXJldCA9IGRldmljZV9yZWdpc3RlcigmcHJvdG9jb2wtPmRldik7CisJaWYgKHJldCkKKwkJcG5wX3JlbW92ZV9wcm90b2NvbChwcm90b2NvbCk7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTgwLDkgKzk1LDcgQEAKICAqLwogdm9pZCBwbnBfdW5yZWdpc3Rlcl9wcm90b2NvbChzdHJ1Y3QgcG5wX3Byb3RvY29sICpwcm90b2NvbCkKIHsKLQlzcGluX2xvY2soJnBucF9sb2NrKTsKLQlsaXN0X2RlbCgmcHJvdG9jb2wtPnByb3RvY29sX2xpc3QpOwotCXNwaW5fdW5sb2NrKCZwbnBfbG9jayk7CisJcG5wX3JlbW92ZV9wcm90b2NvbChwcm90b2NvbCk7CiAJZGV2aWNlX3VucmVnaXN0ZXIoJnByb3RvY29sLT5kZXYpOwogfQogCkBAIC0xNTcsMTggKzE3MCwzNiBAQAogCXJldHVybiBkZXY7CiB9CiAKK3N0YXRpYyB2b2lkIHBucF9kZWxpc3RfZGV2aWNlKHN0cnVjdCBwbnBfZGV2ICpkZXYpCit7CisJbXV0ZXhfbG9jaygmcG5wX2xvY2spOworCWxpc3RfZGVsKCZkZXYtPmdsb2JhbF9saXN0KTsKKwlsaXN0X2RlbCgmZGV2LT5wcm90b2NvbF9saXN0KTsKKwltdXRleF91bmxvY2soJnBucF9sb2NrKTsKK30KKwogaW50IF9fcG5wX2FkZF9kZXZpY2Uoc3RydWN0IHBucF9kZXYgKmRldikKIHsKKwlpbnQgcmV0OworCiAJcG5wX2ZpeHVwX2RldmljZShkZXYpOwogCWRldi0+c3RhdHVzID0gUE5QX1JFQURZOwotCXNwaW5fbG9jaygmcG5wX2xvY2spOworCisJbXV0ZXhfbG9jaygmcG5wX2xvY2spOworCiAJbGlzdF9hZGRfdGFpbCgmZGV2LT5nbG9iYWxfbGlzdCwgJnBucF9nbG9iYWwpOwogCWxpc3RfYWRkX3RhaWwoJmRldi0+cHJvdG9jb2xfbGlzdCwgJmRldi0+cHJvdG9jb2wtPmRldmljZXMpOwotCXNwaW5fdW5sb2NrKCZwbnBfbG9jayk7Ci0JaWYgKGRldi0+cHJvdG9jb2wtPmNhbl93YWtldXApCisKKwltdXRleF91bmxvY2soJnBucF9sb2NrKTsKKworCXJldCA9IGRldmljZV9yZWdpc3RlcigmZGV2LT5kZXYpOworCWlmIChyZXQpCisJCXBucF9kZWxpc3RfZGV2aWNlKGRldik7CisJZWxzZSBpZiAoZGV2LT5wcm90b2NvbC0+Y2FuX3dha2V1cCkKIAkJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZSgmZGV2LT5kZXYsCiAJCQkJZGV2LT5wcm90b2NvbC0+Y2FuX3dha2V1cChkZXYpKTsKLQlyZXR1cm4gZGV2aWNlX3JlZ2lzdGVyKCZkZXYtPmRldik7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMjAzLDEwICsyMzQsNyBAQAogCiB2b2lkIF9fcG5wX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHBucF9kZXYgKmRldikKIHsKLQlzcGluX2xvY2soJnBucF9sb2NrKTsKLQlsaXN0X2RlbCgmZGV2LT5nbG9iYWxfbGlzdCk7Ci0JbGlzdF9kZWwoJmRldi0+cHJvdG9jb2xfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnBucF9sb2NrKTsKKwlwbnBfZGVsaXN0X2RldmljZShkZXYpOwogCWRldmljZV91bnJlZ2lzdGVyKCZkZXYtPmRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL2RyaXZlci5jIGIvZHJpdmVycy9wbnAvZHJpdmVyLmMKaW5kZXggNGU1N2QzMy4uMTUzYTQ5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wbnAvZHJpdmVyLmMKKysrIGIvZHJpdmVycy9wbnAvZHJpdmVyLmMKQEAgLTU4LDIyICs1OCwyMiBAQAogCiBpbnQgcG5wX2RldmljZV9hdHRhY2goc3RydWN0IHBucF9kZXYgKnBucF9kZXYpCiB7Ci0Jc3Bpbl9sb2NrKCZwbnBfbG9jayk7CisJbXV0ZXhfbG9jaygmcG5wX2xvY2spOwogCWlmIChwbnBfZGV2LT5zdGF0dXMgIT0gUE5QX1JFQURZKSB7Ci0JCXNwaW5fdW5sb2NrKCZwbnBfbG9jayk7CisJCW11dGV4X3VubG9jaygmcG5wX2xvY2spOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlwbnBfZGV2LT5zdGF0dXMgPSBQTlBfQVRUQUNIRUQ7Ci0Jc3Bpbl91bmxvY2soJnBucF9sb2NrKTsKKwltdXRleF91bmxvY2soJnBucF9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBwbnBfZGV2aWNlX2RldGFjaChzdHJ1Y3QgcG5wX2RldiAqcG5wX2RldikKIHsKLQlzcGluX2xvY2soJnBucF9sb2NrKTsKKwltdXRleF9sb2NrKCZwbnBfbG9jayk7CiAJaWYgKHBucF9kZXYtPnN0YXR1cyA9PSBQTlBfQVRUQUNIRUQpCiAJCXBucF9kZXYtPnN0YXR1cyA9IFBOUF9SRUFEWTsKLQlzcGluX3VubG9jaygmcG5wX2xvY2spOworCW11dGV4X3VubG9jaygmcG5wX2xvY2spOwogCXBucF9kaXNhYmxlX2RldihwbnBfZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcG5wYWNwaS9jb3JlLmMgYi9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYwppbmRleCBkMmI3ODBhLi41MTUzZDFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYworKysgYi9kcml2ZXJzL3BucC9wbnBhY3BpL2NvcmUuYwpAQCAtMjQ4LDYgKzI0OCw3IEBACiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJQUNQSV9DT01QQU5JT05fU0VUKCZkZXYtPmRldiwgZGV2aWNlKTsKIAlkZXYtPmRhdGEgPSBkZXZpY2U7CiAJLyogLmVuYWJsZWQgbWVhbnMgdGhlIGRldmljZSBjYW4gZGVjb2RlIHRoZSByZXNvdXJjZXMgKi8KIAlkZXYtPmFjdGl2ZSA9IGRldmljZS0+c3RhdHVzLmVuYWJsZWQ7CkBAIC0yOTAsMTEgKzI5MSw5IEBACiAJCXJldHVybiBlcnJvcjsKIAl9CiAKLQllcnJvciA9IGFjcGlfYmluZF9vbmUoJmRldi0+ZGV2LCBkZXZpY2UpOwotCiAJbnVtKys7CiAKLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBhY3BpX3N0YXR1cyBfX2luaXQgcG5wYWNwaV9hZGRfZGV2aWNlX2hhbmRsZXIoYWNwaV9oYW5kbGUgaGFuZGxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbnAvcXVpcmtzLmMgYi9kcml2ZXJzL3BucC9xdWlya3MuYwppbmRleCBlYmYwZDY3Li45NDNjMWNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9xdWlya3MuYworKysgYi9kcml2ZXJzL3BucC9xdWlya3MuYwpAQCAtMjQ2LDEzICsyNDYsMTYgQEAKIAkgKi8KIAlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKIAkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHR5cGU7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCB0eXBlOwogCi0JCQl0eXBlID0gcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIGkpICYKLQkJCQkJKElPUkVTT1VSQ0VfSU8gfCBJT1JFU09VUkNFX01FTSk7CisJCQlmbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBpKTsKKwkJCXR5cGUgPSBmbGFncyAmIChJT1JFU09VUkNFX0lPIHwgSU9SRVNPVVJDRV9NRU0pOwogCQkJaWYgKCF0eXBlIHx8IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSkgPT0gMCkKIAkJCQljb250aW51ZTsKIAorCQkJaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkKKwkJCQljb250aW51ZTsKKwogCQkJcGNpX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGkpOwogCQkJcGNpX2VuZCA9IHBjaV9yZXNvdXJjZV9lbmQocGRldiwgaSk7CiAJCQlmb3IgKGogPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci84OHBtODYweF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyLzg4cG04NjB4X2JhdHRlcnkuYwppbmRleCBiZDNjOTk3Li5kNDk1NzliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyLzg4cG04NjB4X2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyLzg4cG04NjB4X2JhdHRlcnkuYwpAQCAtOTgsNyArOTgsNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICppMmM7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCi0Jc3RydWN0IHBvd2VyX3N1cHBseSBiYXR0ZXJ5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRlcnk7CiAJc3RydWN0IG11dGV4IGxvY2s7CiAJaW50IHN0YXR1czsKIAlpbnQgaXJxX2NjOwpAQCAtNzk4LDkgKzc5OCw4IEBACiAKIHN0YXRpYyB2b2lkIHBtODYweF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKIHsKLQlzdHJ1Y3QgcG04NjB4X2JhdHRlcnlfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcG04NjB4X2JhdHRlcnlfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi5wYXJlbnQpOwogCi0JaW5mbyA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBwbTg2MHhfYmF0dGVyeV9pbmZvLCBiYXR0ZXJ5KTsKIAljYWxjX3Jlc2lzdG9yKGluZm8pOwogfQogCkBAIC04MDgsNyArODA3LDcgQEAKIAkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgcG04NjB4X2JhdHRlcnlfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgcG04NjB4X2JhdHRlcnlfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi5wYXJlbnQpOwogCWludCBkYXRhOwogCWludCByZXQ7CiAKQEAgLTg3NCw3ICs4NzMsNyBAQAogCQkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IHBtODYweF9iYXR0ZXJ5X2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYtPnBhcmVudCk7CisJc3RydWN0IHBtODYweF9iYXR0ZXJ5X2luZm8gKmluZm8gPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYucGFyZW50KTsKIAogCXN3aXRjaCAocHNwKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTDoKQEAgLTkwMSw2ICs5MDAsMTYgQEAKIAlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBwbTg2MHhfYmF0dGVyeV9kZXNjID0geworCS5uYW1lCQkJPSAiYmF0dGVyeS1tb25pdG9yIiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwkJPSBwbTg2MHhfYmF0dF9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJCT0gQVJSQVlfU0laRShwbTg2MHhfYmF0dF9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQkJPSBwbTg2MHhfYmF0dF9nZXRfcHJvcCwKKwkuc2V0X3Byb3BlcnR5CQk9IHBtODYweF9iYXR0X3NldF9wcm9wLAorCS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkCT0gcG04NjB4X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQsCit9OworCiBzdGF0aWMgaW50IHBtODYweF9iYXR0ZXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHBtODYweF9jaGlwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwpAQCAtOTM2LDE0ICs5NDUsNiBAQAogCiAJcG04NjB4X2luaXRfYmF0dGVyeShpbmZvKTsKIAotCWluZm8tPmJhdHRlcnkubmFtZSA9ICJiYXR0ZXJ5LW1vbml0b3IiOwotCWluZm8tPmJhdHRlcnkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JaW5mby0+YmF0dGVyeS5wcm9wZXJ0aWVzID0gcG04NjB4X2JhdHRfcHJvcHM7Ci0JaW5mby0+YmF0dGVyeS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUocG04NjB4X2JhdHRfcHJvcHMpOwotCWluZm8tPmJhdHRlcnkuZ2V0X3Byb3BlcnR5ID0gcG04NjB4X2JhdHRfZ2V0X3Byb3A7Ci0JaW5mby0+YmF0dGVyeS5zZXRfcHJvcGVydHkgPSBwbTg2MHhfYmF0dF9zZXRfcHJvcDsKLQlpbmZvLT5iYXR0ZXJ5LmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSBwbTg2MHhfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZDsKLQogCWlmIChwZGF0YSAmJiBwZGF0YS0+bWF4X2NhcGFjaXR5KQogCQlpbmZvLT5tYXhfY2FwYWNpdHkgPSBwZGF0YS0+bWF4X2NhcGFjaXR5OwogCWVsc2UKQEAgLTk1MywxMCArOTU0LDExIEBACiAJZWxzZQogCQlpbmZvLT5yZXNpc3RvciA9IDMwMDsJLyogc2V0IGRlZmF1bHQgaW50ZXJuYWwgcmVzaXN0b3IgKi8KIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmaW5mby0+YmF0dGVyeSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlpbmZvLT5iYXR0ZXJ5LmRldi0+cGFyZW50ID0gJnBkZXYtPmRldjsKKwlpbmZvLT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZwbTg2MHhfYmF0dGVyeV9kZXNjLAorCQkJCQkgICAgICBOVUxMKTsKKwlpZiAoSVNfRVJSKGluZm8tPmJhdHRlcnkpKQorCQlyZXR1cm4gUFRSX0VSUihpbmZvLT5iYXR0ZXJ5KTsKKwlpbmZvLT5iYXR0ZXJ5LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKIAogCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGluZm8tPmlycV9jYywgTlVMTCwKIAkJCQlwbTg2MHhfY291bG9tYl9oYW5kbGVyLCBJUlFGX09ORVNIT1QsCkBAIC05ODEsNyArOTgzLDcgQEAKIG91dF9jb3Vsb21iOgogCWZyZWVfaXJxKGluZm8tPmlycV9jYywgaW5mbyk7CiBvdXRfcmVnOgotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZpbmZvLT5iYXR0ZXJ5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihpbmZvLT5iYXR0ZXJ5KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05OTEsNyArOTkzLDcgQEAKIAogCWZyZWVfaXJxKGluZm8tPmlycV9iYXR0LCBpbmZvKTsKIAlmcmVlX2lycShpbmZvLT5pcnFfY2MsIGluZm8pOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZpbmZvLT5iYXR0ZXJ5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihpbmZvLT5iYXR0ZXJ5KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci84OHBtODYweF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyLzg4cG04NjB4X2NoYXJnZXIuYwppbmRleCA3MzRlYzRhLi4wZTQ0OGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyLzg4cG04NjB4X2NoYXJnZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyLzg4cG04NjB4X2NoYXJnZXIuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJc3RydWN0IGkyY19jbGllbnQgKmkyY184NjA2OwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAotCXN0cnVjdCBwb3dlcl9zdXBwbHkgdXNiOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnVzYjsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlpbnQgaXJxX251bXM7CiAJaW50IGlycVs3XTsKQEAgLTI5NiwxNCArMjk2LDIwIEBACiAJcHN5ID0gcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lKHBtODYweF9zdXBwbGllZF90b1swXSk7CiAJaWYgKCFwc3kpCiAJCXJldHVybiAtRUlOVkFMOwotCXJldCA9IHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csICZkYXRhKTsKLQlpZiAocmV0KQorCXJldCA9IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKKwkJCSZkYXRhKTsKKwlpZiAocmV0KSB7CisJCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIAkJcmV0dXJuIHJldDsKKwl9CiAJdmJhdHQgPSBkYXRhLmludHZhbCAvIDEwMDA7CiAKLQlyZXQgPSBwc3ktPmdldF9wcm9wZXJ0eShwc3ksIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsICZkYXRhKTsKLQlpZiAocmV0KQorCXJldCA9IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULCAmZGF0YSk7CisJaWYgKHJldCkgeworCQlwb3dlcl9zdXBwbHlfcHV0KHBzeSk7CiAJCXJldHVybiByZXQ7CisJfQorCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIAogCW11dGV4X2xvY2soJmluZm8tPmxvY2spOwogCWluZm8tPnByZXNlbnQgPSBkYXRhLmludHZhbDsKQEAgLTQxNCw3ICs0MjAsNyBAQAogCiAJc2V0X2NoYXJnaW5nX2ZzbShpbmZvKTsKIAotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZpbmZvLT51c2IpOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGluZm8tPnVzYik7CiBvdXQ6CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtNDMwLDcgKzQzNiw3IEBACiAJcHN5ID0gcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lKHBtODYweF9zdXBwbGllZF90b1swXSk7CiAJaWYgKCFwc3kpCiAJCWdvdG8gb3V0OwotCXJldCA9IHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfVEVNUCwgJnRlbXApOworCXJldCA9IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9URU1QLCAmdGVtcCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXQ7CiAJdmFsdWUgPSB0ZW1wLmludHZhbCAvIDEwOwpAQCAtNDQ2LDYgKzQ1Miw3IEBACiAKIAlzZXRfY2hhcmdpbmdfZnNtKGluZm8pOwogb3V0OgorCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKQEAgLTQ4NSw5ICs0OTIsMTAgQEAKIAlwc3kgPSBwb3dlcl9zdXBwbHlfZ2V0X2J5X25hbWUocG04NjB4X3N1cHBsaWVkX3RvWzBdKTsKIAlpZiAoIXBzeSkKIAkJZ290byBvdXQ7Ci0JcmV0ID0gcHN5LT5nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywgJnZhbCk7CisJcmV0ID0gcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShwc3ksIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCQkJJnZhbCk7CiAJaWYgKHJldCkKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3BzeV9wdXQ7CiAJdmJhdHQgPSB2YWwuaW50dmFsIC8gMTAwMDsKIAkvKgogCSAqIENIR19ET05FIGludGVycnVwdCBpcyBmYXN0ZXIgdGhhbiBDSEdfREVUIGludGVycnVwdCB3aGVuCkBAIC00OTgsMTAgKzUwNiwxMyBAQAogCSAqLwogCXJldCA9IHBtODYweF9yZWdfcmVhZChpbmZvLT5pMmMsIFBNODYwN19TVEFUVVNfMik7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9wc3lfcHV0OwogCWlmICh2YmF0dCA+IENIQVJHRV9USFJFU0hPTEQgJiYgcmV0ICYgU1RBVFVTMl9DSEcpCi0JCXBzeS0+c2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsICZ2YWwpOworCQlwb3dlcl9zdXBwbHlfc2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsCisJCQkJJnZhbCk7CiAKK291dF9wc3lfcHV0OgorCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIG91dDoKIAltdXRleF91bmxvY2soJmluZm8tPmxvY2spOwogCWRldl9kYmcoaW5mby0+ZGV2LCAiJXMsIEFsbG93ZWQ6ICVkXG4iLCBfX2Z1bmNfXywgaW5mby0+YWxsb3dlZCk7CkBAIC01ODQsOCArNTk1LDcgQEAKIAkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkgICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgcG04NjB4X2NoYXJnZXJfaW5mbyAqaW5mbyA9Ci0JICAgIGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgcG04NjB4X2NoYXJnZXJfaW5mbyAqaW5mbyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKQEAgLTY0NSw5ICs2NTUsMTggQEAKIAl7ICJ2Y2hnIiwgcG04NjB4X3ZjaGdfaGFuZGxlciB9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBwbTg2MHhfY2hhcmdlcl9kZXNjID0geworCS5uYW1lCQk9ICJ1c2IiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQiwKKwkucHJvcGVydGllcwk9IHBtODYweF91c2JfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShwbTg2MHhfdXNiX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CT0gcG04NjB4X3VzYl9nZXRfcHJvcCwKK307CisKIHN0YXRpYyBpbnQgcG04NjB4X2NoYXJnZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcG04NjB4X2NoaXAgKmNoaXAgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCXN0cnVjdCBwbTg2MHhfY2hhcmdlcl9pbmZvICppbmZvOwogCWludCByZXQ7CiAJaW50IGNvdW50OwpAQCAtNjg1LDE2ICs3MDQsMTUgQEAKIAltdXRleF9pbml0KCZpbmZvLT5sb2NrKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKIAotCWluZm8tPnVzYi5uYW1lID0gInVzYiI7Ci0JaW5mby0+dXNiLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7Ci0JaW5mby0+dXNiLnN1cHBsaWVkX3RvID0gcG04NjB4X3N1cHBsaWVkX3RvOwotCWluZm8tPnVzYi5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKHBtODYweF9zdXBwbGllZF90byk7Ci0JaW5mby0+dXNiLnByb3BlcnRpZXMgPSBwbTg2MHhfdXNiX3Byb3BzOwotCWluZm8tPnVzYi5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUocG04NjB4X3VzYl9wcm9wcyk7Ci0JaW5mby0+dXNiLmdldF9wcm9wZXJ0eSA9IHBtODYweF91c2JfZ2V0X3Byb3A7Ci0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZpbmZvLT51c2IpOwotCWlmIChyZXQpCisJcHN5X2NmZy5kcnZfZGF0YSA9IGluZm87CisJcHN5X2NmZy5zdXBwbGllZF90byA9IHBtODYweF9zdXBwbGllZF90bzsKKwlwc3lfY2ZnLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJWkUocG04NjB4X3N1cHBsaWVkX3RvKTsKKwlpbmZvLT51c2IgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnBtODYweF9jaGFyZ2VyX2Rlc2MsCisJCQkJCSAgJnBzeV9jZmcpOworCWlmIChJU19FUlIoaW5mby0+dXNiKSkgeworCQlyZXQgPSBQVFJfRVJSKGluZm8tPnVzYik7CiAJCWdvdG8gb3V0OworCX0KIAogCXBtODYweF9pbml0X2NoYXJnZXIoaW5mbyk7CiAKQEAgLTcxMSw3ICs3MjksNyBAQAogCXJldHVybiAwOwogCiBvdXRfaXJxOgotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZpbmZvLT51c2IpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGluZm8tPnVzYik7CiAJd2hpbGUgKC0taSA+PSAwKQogCQlmcmVlX2lycShpbmZvLT5pcnFbaV0sIGluZm8pOwogb3V0OgpAQCAtNzIzLDcgKzc0MSw3IEBACiAJc3RydWN0IHBtODYweF9jaGFyZ2VyX2luZm8gKmluZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlpbnQgaTsKIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZpbmZvLT51c2IpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGluZm8tPnVzYik7CiAJZnJlZV9pcnEoaW5mby0+aXJxWzBdLCBpbmZvKTsKIAlmb3IgKGkgPSAwOyBpIDwgaW5mby0+aXJxX251bXM7IGkrKykKIAkJZnJlZV9pcnEoaW5mby0+aXJxW2ldLCBpbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvS2NvbmZpZyBiL2RyaXZlcnMvcG93ZXIvS2NvbmZpZwppbmRleCAyN2I3NTFiLi40MDkxZmIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL0tjb25maWcKKysrIGIvZHJpdmVycy9wb3dlci9LY29uZmlnCkBAIC0xOTIsNiArMTkyLDI3IEBACiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBiYXR0ZXJpZXMgY2hhcmdlciBpbnRlZ3JhdGVkIGludG8KIAkgIERBOTA1MiBQTUlDLgogCitjb25maWcgQ0hBUkdFUl9EQTkxNTAKKwl0cmlzdGF0ZSAiRGlhbG9nIFNlbWljb25kdWN0b3IgREE5MTUwIENoYXJnZXIgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE1GRF9EQTkxNTAKKwlkZXBlbmRzIG9uIERBOTE1MF9HUEFEQworCWRlcGVuZHMgb24gSUlPCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgY2hhcmdlciB1bml0IG9mIHRoZSBEQTkxNTAKKwkgIEludGVncmF0ZWQgQ2hhcmdlciAmIEZ1ZWwtR2F1Z2UgSUMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsIGJlCisJICBjYWxsZWQgZGE5MTUwLWNoYXJnZXIuCisKK2NvbmZpZyBBWFAyODhfRlVFTF9HQVVHRQorCXRyaXN0YXRlICJYLVBvd2VycyBBWFAyODggRnVlbCBHYXVnZSIKKwlkZXBlbmRzIG9uIE1GRF9BWFAyMFggJiYgSUlPCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIGhhdmUgc3VwcG9ydCBmb3IgWC1Qb3dlciBwb3dlciBtYW5hZ2VtZW50IElDIChQTUlDKQorCSAgRnVlbCBHYXVnZS4gVGhlIGRldmljZSBwcm92aWRlcyBiYXR0ZXJ5IHN0YXRpc3RpY3MgYW5kIHN0YXR1cworCSAgbW9uaXRvcmluZyBhcyB3ZWxsIGFzIGFsZXJ0cyBmb3IgYmF0dGVyeSBvdmVyL3VuZGVyIHZvbHRhZ2UgYW5kCisJICBvdmVyL3VuZGVyIHRlbXBlcmF0dXJlLgorCiBjb25maWcgQkFUVEVSWV9NQVgxNzA0MAogCXRyaXN0YXRlICJNYXhpbSBNQVgxNzA0MCBGdWVsIEdhdWdlIgogCWRlcGVuZHMgb24gSTJDCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlIGIvZHJpdmVycy9wb3dlci9NYWtlZmlsZQppbmRleCAzNmY5ZTBkLi5iN2IwMTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKQEAgLTEsNCArMSw0IEBACi1jY2ZsYWdzLSQoQ09ORklHX1BPV0VSX1NVUFBMWV9ERUJVRykgOj0gLURERUJVRworc3ViZGlyLWNjZmxhZ3MtJChDT05GSUdfUE9XRVJfU1VQUExZX0RFQlVHKSA6PSAtRERFQlVHCiAKIHBvd2VyX3N1cHBseS15CQkJCTo9IHBvd2VyX3N1cHBseV9jb3JlLm8KIHBvd2VyX3N1cHBseS0kKENPTkZJR19TWVNGUykJCSs9IHBvd2VyX3N1cHBseV9zeXNmcy5vCkBAIC0zMiw2ICszMiw3IEBACiBvYmotJChDT05GSUdfQkFUVEVSWV9CUTI3eDAwKQkrPSBicTI3eDAwX2JhdHRlcnkubwogb2JqLSQoQ09ORklHX0JBVFRFUllfREE5MDMwKQkrPSBkYTkwMzBfYmF0dGVyeS5vCiBvYmotJChDT05GSUdfQkFUVEVSWV9EQTkwNTIpCSs9IGRhOTA1Mi1iYXR0ZXJ5Lm8KK29iai0kKENPTkZJR19DSEFSR0VSX0RBOTE1MCkJKz0gZGE5MTUwLWNoYXJnZXIubwogb2JqLSQoQ09ORklHX0JBVFRFUllfTUFYMTcwNDApCSs9IG1heDE3MDQwX2JhdHRlcnkubwogb2JqLSQoQ09ORklHX0JBVFRFUllfTUFYMTcwNDIpCSs9IG1heDE3MDQyX2JhdHRlcnkubwogb2JqLSQoQ09ORklHX0JBVFRFUllfWjIpCSs9IHoyX2JhdHRlcnkubwpAQCAtNjIsMyArNjMsNCBAQAogb2JqLSQoQ09ORklHX0NIQVJHRVJfU01CMzQ3KQkrPSBzbWIzNDctY2hhcmdlci5vCiBvYmotJChDT05GSUdfQ0hBUkdFUl9UUFM2NTA5MCkJKz0gdHBzNjUwOTAtY2hhcmdlci5vCiBvYmotJChDT05GSUdfUE9XRVJfUkVTRVQpCSs9IHJlc2V0Lworb2JqLSQoQ09ORklHX0FYUDI4OF9GVUVMX0dBVUdFKSArPSBheHAyODhfZnVlbF9nYXVnZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2FiODUwMF9idGVtcC5jIGIvZHJpdmVycy9wb3dlci9hYjg1MDBfYnRlbXAuYwppbmRleCA0ZWJmN2IwLi44ZjgwNDRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2FiODUwMF9idGVtcC5jCisrKyBiL2RyaXZlcnMvcG93ZXIvYWI4NTAwX2J0ZW1wLmMKQEAgLTQ1LDkgKzQ1LDYgQEAKICNkZWZpbmUgQlRFTVBfQkFUQ1RSTF9DVVJSX1NSQ182MFVBCTYwCiAjZGVmaW5lIEJURU1QX0JBVENUUkxfQ1VSUl9TUkNfMTIwVUEJMTIwCiAKLSNkZWZpbmUgdG9fYWI4NTAwX2J0ZW1wX2RldmljZV9pbmZvKHgpIGNvbnRhaW5lcl9vZigoeCksIFwKLQlzdHJ1Y3QgYWI4NTAwX2J0ZW1wLCBidGVtcF9wc3kpOwotCiAvKioKICAqIHN0cnVjdCBhYjg1MDBfYnRlbXBfaW50ZXJydXB0cyAtIGFiODUwMCBpbnRlcnJ1cHRzCiAgKiBAbmFtZToJbmFtZSBvZiB0aGUgaW50ZXJydXB0CkBAIC0xMDIsNyArOTksNyBAQAogCXN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjOwogCXN0cnVjdCBhYjg1MDBfZmcgKmZnOwogCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqYm07Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSBidGVtcF9wc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYnRlbXBfcHN5OwogCXN0cnVjdCBhYjg1MDBfYnRlbXBfZXZlbnRzIGV2ZW50czsKIAlzdHJ1Y3QgYWI4NTAwX2J0ZW1wX3JhbmdlcyBidGVtcF9yYW5nZXM7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKmJ0ZW1wX3dxOwpAQCAtNjU0LDE0ICs2NTEsMTQgQEAKIAkJaWYgKChkaS0+YmF0X3RlbXAgIT0gZGktPnByZXZfYmF0X3RlbXApIHx8ICFkaS0+aW5pdGlhbGl6ZWQpIHsKIAkJCWRpLT5pbml0aWFsaXplZCA9IHRydWU7CiAJCQlkaS0+YmF0X3RlbXAgPSBiYXRfdGVtcDsKLQkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZkaS0+YnRlbXBfcHN5KTsKKwkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5idGVtcF9wc3kpOwogCQl9CiAJfSBlbHNlIGlmIChiYXRfdGVtcCA8IGRpLT5wcmV2X2JhdF90ZW1wKSB7CiAJCWRpLT5iYXRfdGVtcC0tOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmZGktPmJ0ZW1wX3BzeSk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5idGVtcF9wc3kpOwogCX0gZWxzZSBpZiAoYmF0X3RlbXAgPiBkaS0+cHJldl9iYXRfdGVtcCkgewogCQlkaS0+YmF0X3RlbXArKzsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmRpLT5idGVtcF9wc3kpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+YnRlbXBfcHN5KTsKIAl9CiAJZGktPnByZXZfYmF0X3RlbXAgPSBiYXRfdGVtcDsKIApAQCAtNjg5LDcgKzY4Niw3IEBACiAJZGV2X2VycihkaS0+ZGV2LCAiQmF0dGVyeSByZW1vdmFsIGRldGVjdGVkIVxuIik7CiAKIAlkaS0+ZXZlbnRzLmJhdHRfcmVtID0gdHJ1ZTsKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmZGktPmJ0ZW1wX3BzeSk7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJ0ZW1wX3BzeSk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC03MTUsNyArNzEyLDcgQEAKIAkJZGktPmV2ZW50cy5idGVtcF9oaWdoID0gZmFsc2U7CiAJCWRpLT5ldmVudHMuYnRlbXBfbWVkaGlnaCA9IGZhbHNlOwogCQlkaS0+ZXZlbnRzLmJ0ZW1wX2xvd21lZCA9IGZhbHNlOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmZGktPmJ0ZW1wX3BzeSk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5idGVtcF9wc3kpOwogCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTczOCw3ICs3MzUsNyBAQAogCWRpLT5ldmVudHMuYnRlbXBfbWVkaGlnaCA9IGZhbHNlOwogCWRpLT5ldmVudHMuYnRlbXBfbG93bWVkID0gZmFsc2U7CiAJZGktPmV2ZW50cy5idGVtcF9sb3cgPSBmYWxzZTsKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmZGktPmJ0ZW1wX3BzeSk7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJ0ZW1wX3BzeSk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC03NjAsNyArNzU3LDcgQEAKIAlkaS0+ZXZlbnRzLmJ0ZW1wX21lZGhpZ2ggPSBmYWxzZTsKIAlkaS0+ZXZlbnRzLmJ0ZW1wX2hpZ2ggPSBmYWxzZTsKIAlkaS0+ZXZlbnRzLmJ0ZW1wX2xvdyA9IGZhbHNlOwotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZkaS0+YnRlbXBfcHN5KTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+YnRlbXBfcHN5KTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTc4Miw3ICs3NzksNyBAQAogCWRpLT5ldmVudHMuYnRlbXBfbG93bWVkID0gZmFsc2U7CiAJZGktPmV2ZW50cy5idGVtcF9oaWdoID0gZmFsc2U7CiAJZGktPmV2ZW50cy5idGVtcF9sb3cgPSBmYWxzZTsKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmZGktPmJ0ZW1wX3BzeSk7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJ0ZW1wX3BzeSk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC04ODQsOSArODgxLDcgQEAKIAllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaTsKLQotCWRpID0gdG9fYWI4NTAwX2J0ZW1wX2RldmljZV9pbmZvKHBzeSk7CisJc3RydWN0IGFiODUwMF9idGVtcCAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAogCXN3aXRjaCAocHNwKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgpAQCAtOTE5LDE0ICs5MTQsMTQgQEAKIAogCXBzeSA9IChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICopZGF0YTsKIAlleHQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlkaSA9IHRvX2FiODUwMF9idGVtcF9kZXZpY2VfaW5mbyhwc3kpOworCWRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAkvKgogCSAqIEZvciBhbGwgcHN5IHdoZXJlIHRoZSBuYW1lIG9mIHlvdXIgZHJpdmVyCiAJICogYXBwZWFycyBpbiBhbnkgc3VwcGxpZWRfdG8KIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgZXh0LT5udW1fc3VwcGxpY2FudHM7IGkrKykgewotCQlpZiAoIXN0cmNtcChleHQtPnN1cHBsaWVkX3RvW2ldLCBwc3ktPm5hbWUpKQorCQlpZiAoIXN0cmNtcChleHQtPnN1cHBsaWVkX3RvW2ldLCBwc3ktPmRlc2MtPm5hbWUpKQogCQkJcHN5X2ZvdW5kID0gdHJ1ZTsKIAl9CiAKQEAgLTkzNCwxNiArOTI5LDE2IEBACiAJCXJldHVybiAwOwogCiAJLyogR28gdGhyb3VnaCBhbGwgcHJvcGVydGllcyBmb3IgdGhlIHBzeSAqLwotCWZvciAoaiA9IDA7IGogPCBleHQtPm51bV9wcm9wZXJ0aWVzOyBqKyspIHsKKwlmb3IgKGogPSAwOyBqIDwgZXh0LT5kZXNjLT5udW1fcHJvcGVydGllczsgaisrKSB7CiAJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHByb3A7Ci0JCXByb3AgPSBleHQtPnByb3BlcnRpZXNbal07CisJCXByb3AgPSBleHQtPmRlc2MtPnByb3BlcnRpZXNbal07CiAKLQkJaWYgKGV4dC0+Z2V0X3Byb3BlcnR5KGV4dCwgcHJvcCwgJnJldCkpCisJCWlmIChwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KGV4dCwgcHJvcCwgJnJldCkpCiAJCQljb250aW51ZTsKIAogCQlzd2l0Y2ggKHByb3ApIHsKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgotCQkJc3dpdGNoIChleHQtPnR5cGUpIHsKKwkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7CiAJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOgogCQkJCS8qIEFDIGRpc2Nvbm5lY3RlZCAqLwogCQkJCWlmICghcmV0LmludHZhbCAmJiBkaS0+ZXZlbnRzLmFjX2Nvbm4pIHsKQEAgLTk5MCwxMCArOTg1LDEwIEBACiAgKi8KIHN0YXRpYyB2b2lkIGFiODUwMF9idGVtcF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKIHsKLQlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaSA9IHRvX2FiODUwMF9idGVtcF9kZXZpY2VfaW5mbyhwc3kpOworCXN0cnVjdCBhYjg1MDBfYnRlbXAgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAljbGFzc19mb3JfZWFjaF9kZXZpY2UocG93ZXJfc3VwcGx5X2NsYXNzLCBOVUxMLAotCQkmZGktPmJ0ZW1wX3BzeSwgYWI4NTAwX2J0ZW1wX2dldF9leHRfcHN5X2RhdGEpOworCQlkaS0+YnRlbXBfcHN5LCBhYjg1MDBfYnRlbXBfZ2V0X2V4dF9wc3lfZGF0YSk7CiB9CiAKIC8qIGFiODUwMCBidGVtcCBkcml2ZXIgaW50ZXJydXB0cyBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBpc3IgKi8KQEAgLTEwNDQsNyArMTAzOSw3IEBACiAJZGVzdHJveV93b3JrcXVldWUoZGktPmJ0ZW1wX3dxKTsKIAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRpLT5idGVtcF9wc3kpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5idGVtcF9wc3kpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDU0LDEwICsxMDQ5LDIwIEBACiAJImFiODUwMF9mZyIsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFiODUwMF9idGVtcF9kZXNjID0geworCS5uYW1lCQkJPSAiYWI4NTAwX2J0ZW1wIiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwkJPSBhYjg1MDBfYnRlbXBfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUoYWI4NTAwX2J0ZW1wX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CQk9IGFiODUwMF9idGVtcF9nZXRfcHJvcGVydHksCisJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQJPSBhYjg1MDBfYnRlbXBfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKK307CisKIHN0YXRpYyBpbnQgYWI4NTAwX2J0ZW1wX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKIAlzdHJ1Y3QgYWI4NTAwX2J0ZW1wICpkaTsKIAlpbnQgaXJxLCBpLCByZXQgPSAwOwogCXU4IHZhbDsKQEAgLTEwODksMTcgKzEwOTQsOSBAQAogCiAJZGktPmluaXRpYWxpemVkID0gZmFsc2U7CiAKLQkvKiBCVEVNUCBzdXBwbHkgKi8KLQlkaS0+YnRlbXBfcHN5Lm5hbWUgPSAiYWI4NTAwX2J0ZW1wIjsKLQlkaS0+YnRlbXBfcHN5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCWRpLT5idGVtcF9wc3kucHJvcGVydGllcyA9IGFiODUwMF9idGVtcF9wcm9wczsKLQlkaS0+YnRlbXBfcHN5Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShhYjg1MDBfYnRlbXBfcHJvcHMpOwotCWRpLT5idGVtcF9wc3kuZ2V0X3Byb3BlcnR5ID0gYWI4NTAwX2J0ZW1wX2dldF9wcm9wZXJ0eTsKLQlkaS0+YnRlbXBfcHN5LnN1cHBsaWVkX3RvID0gc3VwcGx5X2ludGVyZmFjZTsKLQlkaS0+YnRlbXBfcHN5Lm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJWkUoc3VwcGx5X2ludGVyZmFjZSk7Ci0JZGktPmJ0ZW1wX3BzeS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0KLQkJYWI4NTAwX2J0ZW1wX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQ7Ci0KKwlwc3lfY2ZnLnN1cHBsaWVkX3RvID0gc3VwcGx5X2ludGVyZmFjZTsKKwlwc3lfY2ZnLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJWkUoc3VwcGx5X2ludGVyZmFjZSk7CisJcHN5X2NmZy5kcnZfZGF0YSA9IGRpOwogCiAJLyogQ3JlYXRlIGEgd29yayBxdWV1ZSBmb3IgdGhlIGJ0ZW1wICovCiAJZGktPmJ0ZW1wX3dxID0KQEAgLTExNDAsOSArMTEzNywxMSBAQAogCX0KIAogCS8qIFJlZ2lzdGVyIEJURU1QIHBvd2VyIHN1cHBseSBjbGFzcyAqLwotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkaS0+ZGV2LCAmZGktPmJ0ZW1wX3BzeSk7Ci0JaWYgKHJldCkgeworCWRpLT5idGVtcF9wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGktPmRldiwgJmFiODUwMF9idGVtcF9kZXNjLAorCQkJCQkgICAgICAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihkaS0+YnRlbXBfcHN5KSkgewogCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgQlRFTVAgcHN5XG4iKTsKKwkJcmV0ID0gUFRSX0VSUihkaS0+YnRlbXBfcHN5KTsKIAkJZ290byBmcmVlX2J0ZW1wX3dxOwogCX0KIApAQCAtMTE3MSw3ICsxMTcwLDcgQEAKIAlyZXR1cm4gcmV0OwogCiBmcmVlX2lycToKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmZGktPmJ0ZW1wX3BzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmJ0ZW1wX3BzeSk7CiAKIAkvKiBXZSBhbHNvIGhhdmUgdG8gZnJlZSBhbGwgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgaXJxcyAqLwogCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9hYjg1MDBfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9hYjg1MDBfY2hhcmdlci5jCmluZGV4IDhjOGQxNzAuLmUzODgxNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvYWI4NTAwX2NoYXJnZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL2FiODUwMF9jaGFyZ2VyLmMKQEAgLTQzNSw3ICs0MzUsNyBAQAogCQlpZiAoIWNvbm5lY3RlZCkKIAkJCWRpLT5mbGFncy52YnVzX2Ryb3BfZW5kID0gZmFsc2U7CiAKLQkJc3lzZnNfbm90aWZ5KCZkaS0+dXNiX2NoZy5wc3kuZGV2LT5rb2JqLCBOVUxMLCAicHJlc2VudCIpOworCQlzeXNmc19ub3RpZnkoJmRpLT51c2JfY2hnLnBzeS0+ZGV2LmtvYmosIE5VTEwsICJwcmVzZW50Iik7CiAKIAkJaWYgKGNvbm5lY3RlZCkgewogCQkJbXV0ZXhfbG9jaygmZGktPmNoYXJnZXJfYXR0YWNoZWRfbXV0ZXgpOwpAQCAtMTUxNiw3ICsxNTE2LDcgQEAKIAogCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBEaXNhYmxlZCBBQyBjaGFyZ2luZ1xuIiwgX19mdW5jX18pOwogCX0KLQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksICZkaS0+YWNfY2hnLnBzeSk7CisJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+YWNfY2hnLnBzeSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTY3Miw3ICsxNjcyLDcgQEAKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmZGktPmNoZWNrX3ZiYXRfd29yayk7CiAKIAl9Ci0JYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCAmZGktPnVzYl9jaGcucHN5KTsKKwlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTgxMSw5ICsxODExLDkgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGk7CiAKLQlpZiAoY2hhcmdlci0+cHN5LnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMpCisJaWYgKGNoYXJnZXItPnBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUykKIAkJZGkgPSB0b19hYjg1MDBfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKLQllbHNlIGlmIChjaGFyZ2VyLT5wc3kudHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IpCisJZWxzZSBpZiAoY2hhcmdlci0+cHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX1VTQikKIAkJZGkgPSB0b19hYjg1MDBfY2hhcmdlcl91c2JfZGV2aWNlX2luZm8oY2hhcmdlcik7CiAJZWxzZQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMTgzOSw5ICsxODM5LDkgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGk7CiAKLQlpZiAoY2hhcmdlci0+cHN5LnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMpCisJaWYgKGNoYXJnZXItPnBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUykKIAkJZGkgPSB0b19hYjg1MDBfY2hhcmdlcl9hY19kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKLQllbHNlIGlmIChjaGFyZ2VyLT5wc3kudHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IpCisJZWxzZSBpZiAoY2hhcmdlci0+cHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX1VTQikKIAkJZGkgPSB0b19hYjg1MDBfY2hhcmdlcl91c2JfZGV2aWNlX2luZm8oY2hhcmdlcik7CiAJZWxzZQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMTg3OSw3ICsxODc5LDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBhYjg1MDBfY2hhcmdlciAqZGk7CiAKLQlpZiAoY2hhcmdlci0+cHN5LnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCKQorCWlmIChjaGFyZ2VyLT5wc3ktPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCKQogCQlkaSA9IHRvX2FiODUwMF9jaGFyZ2VyX3VzYl9kZXZpY2VfaW5mbyhjaGFyZ2VyKTsKIAllbHNlCiAJCXJldHVybiAtRU5YSU87CkBAIC0xOTEwLDcgKzE5MTAsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IGFiODUwMF9jaGFyZ2VyICpkaTsKIAotCWlmIChjaGFyZ2VyLT5wc3kudHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IpCisJaWYgKGNoYXJnZXItPnBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IpCiAJCWRpID0gdG9fYWI4NTAwX2NoYXJnZXJfdXNiX2RldmljZV9pbmZvKGNoYXJnZXIpOwogCWVsc2UKIAkJcmV0dXJuIC1FTlhJTzsKQEAgLTE5MzcsNyArMTkzNyw3IEBACiAJc3RydWN0IHV4NTAwX2NoYXJnZXIgKnVzYl9jaGc7CiAKIAl1c2JfY2hnID0gKHN0cnVjdCB1eDUwMF9jaGFyZ2VyICopZGF0YTsKLQlwc3kgPSAmdXNiX2NoZy0+cHN5OworCXBzeSA9IHVzYl9jaGctPnBzeTsKIAogCWRpID0gdG9fYWI4NTAwX2NoYXJnZXJfdXNiX2RldmljZV9pbmZvKHVzYl9jaGcpOwogCkBAIC0xOTQ1LDcgKzE5NDUsNyBAQAogCiAJLyogRm9yIGFsbCBwc3kgd2hlcmUgdGhlIGRyaXZlciBuYW1lIGFwcGVhcnMgaW4gYW55IHN1cHBsaWVkX3RvICovCiAJZm9yIChpID0gMDsgaSA8IGV4dC0+bnVtX3N1cHBsaWNhbnRzOyBpKyspIHsKLQkJaWYgKCFzdHJjbXAoZXh0LT5zdXBwbGllZF90b1tpXSwgcHN5LT5uYW1lKSkKKwkJaWYgKCFzdHJjbXAoZXh0LT5zdXBwbGllZF90b1tpXSwgcHN5LT5kZXNjLT5uYW1lKSkKIAkJCXBzeV9mb3VuZCA9IHRydWU7CiAJfQogCkBAIC0xOTUzLDE2ICsxOTUzLDE2IEBACiAJCXJldHVybiAwOwogCiAJLyogR28gdGhyb3VnaCBhbGwgcHJvcGVydGllcyBmb3IgdGhlIHBzeSAqLwotCWZvciAoaiA9IDA7IGogPCBleHQtPm51bV9wcm9wZXJ0aWVzOyBqKyspIHsKKwlmb3IgKGogPSAwOyBqIDwgZXh0LT5kZXNjLT5udW1fcHJvcGVydGllczsgaisrKSB7CiAJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHByb3A7Ci0JCXByb3AgPSBleHQtPnByb3BlcnRpZXNbal07CisJCXByb3AgPSBleHQtPmRlc2MtPnByb3BlcnRpZXNbal07CiAKLQkJaWYgKGV4dC0+Z2V0X3Byb3BlcnR5KGV4dCwgcHJvcCwgJnJldCkpCisJCWlmIChwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KGV4dCwgcHJvcCwgJnJldCkpCiAJCQljb250aW51ZTsKIAogCQlzd2l0Y2ggKHByb3ApIHsKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJCXN3aXRjaCAoZXh0LT50eXBlKSB7CisJCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgewogCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgogCQkJCWRpLT52YmF0ID0gcmV0LmludHZhbCAvIDEwMDA7CiAJCQkJYnJlYWs7CkBAIC0xOTkzLDcgKzE5OTMsNyBAQAogCQlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIsIGNoZWNrX3ZiYXRfd29yay53b3JrKTsKIAogCWNsYXNzX2Zvcl9lYWNoX2RldmljZShwb3dlcl9zdXBwbHlfY2xhc3MsIE5VTEwsCi0JCSZkaS0+dXNiX2NoZy5wc3ksIGFiODUwMF9jaGFyZ2VyX2dldF9leHRfcHN5X2RhdGEpOworCQlkaS0+dXNiX2NoZy5wc3ksIGFiODUwMF9jaGFyZ2VyX2dldF9leHRfcHN5X2RhdGEpOwogCiAJLyogRmlyc3QgcnVuIG9sZF92YmF0IGlzIDAuICovCiAJaWYgKGRpLT5vbGRfdmJhdCA9PSAwKQpAQCAtMjAwOSw3ICsyMDA5LDcgQEAKIAkJCWRpLT52YmF0LCBkaS0+b2xkX3ZiYXQpOwogCQlhYjg1MDBfY2hhcmdlcl9zZXRfdmJ1c19pbl9jdXJyKGRpLAogCQkJCQlkaS0+bWF4X3VzYl9pbl9jdXJyLnVzYl90eXBlX21heCk7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZkaS0+dXNiX2NoZy5wc3kpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+dXNiX2NoZy5wc3kpOwogCX0KIAogCWRpLT5vbGRfdmJhdCA9IGRpLT52YmF0OwpAQCAtMjA0OSw3ICsyMDQ5LDcgQEAKIAkJfQogCQlpZiAoIShyZWdfdmFsdWUgJiBNQUlOX0NIX05PSykpIHsKIAkJCWRpLT5mbGFncy5tYWluZXh0Y2hub3RvayA9IGZhbHNlOwotCQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCAmZGktPmFjX2NoZy5wc3kpOworCQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+YWNfY2hnLnBzeSk7CiAJCX0KIAl9CiAJaWYgKGRpLT5mbGFncy52YnVzX292dikgewpAQCAtMjA2Miw3ICsyMDYyLDcgQEAKIAkJfQogCQlpZiAoIShyZWdfdmFsdWUgJiBWQlVTX09WVl9USCkpIHsKIAkJCWRpLT5mbGFncy52YnVzX292diA9IGZhbHNlOwotCQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCAmZGktPnVzYl9jaGcucHN5KTsKKwkJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKIAkJfQogCX0KIAkvKiBJZiB3ZSBzdGlsbCBoYXZlIGEgZmFpbHVyZSwgc2NoZWR1bGUgYSBuZXcgY2hlY2sgKi8KQEAgLTIxMzIsOCArMjEzMiw4IEBACiAJCWRpLT5hYy5jaGFyZ2VyX2Nvbm5lY3RlZCA9IDA7CiAJfQogCi0JYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCAmZGktPmFjX2NoZy5wc3kpOwotCXN5c2ZzX25vdGlmeSgmZGktPmFjX2NoZy5wc3kuZGV2LT5rb2JqLCBOVUxMLCAicHJlc2VudCIpOworCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPmFjX2NoZy5wc3kpOworCXN5c2ZzX25vdGlmeSgmZGktPmFjX2NoZy5wc3ktPmRldi5rb2JqLCBOVUxMLCAicHJlc2VudCIpOwogfQogCiBzdGF0aWMgdm9pZCBhYjg1MDBfY2hhcmdlcl91c2JfYXR0YWNoZWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0yMjQwLDcgKzIyNDAsNyBAQAogCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBkaS0+dmJ1c19kZXRlY3RlZCA9IGZhbHNlXG4iLCBfX2Z1bmNfXyk7CiAJCWRpLT52YnVzX2RldGVjdGVkID0gZmFsc2U7CiAJCWFiODUwMF9jaGFyZ2VyX3NldF91c2JfY29ubmVjdGVkKGRpLCBmYWxzZSk7Ci0JCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgJmRpLT51c2JfY2hnLnBzeSk7CisJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKIAl9IGVsc2UgewogCQlkZXZfZGJnKGRpLT5kZXYsICIlcyBkaS0+dmJ1c19kZXRlY3RlZCA9IHRydWVcbiIsIF9fZnVuY19fKTsKIAkJZGktPnZidXNfZGV0ZWN0ZWQgPSB0cnVlOwpAQCAtMjI1MCw3ICsyMjUwLDcgQEAKIAkJCWlmICghcmV0KSB7CiAJCQkJYWI4NTAwX2NoYXJnZXJfc2V0X3VzYl9jb25uZWN0ZWQoZGksIHRydWUpOwogCQkJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwKLQkJCQkJCQkgICAgJmRpLT51c2JfY2hnLnBzeSk7CisJCQkJCQkJICAgIGRpLT51c2JfY2hnLnBzeSk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQkvKgpAQCAtMjI2Nyw3ICsyMjY3LDcgQEAKIAkJCQkJYWI4NTAwX2NoYXJnZXJfc2V0X3VzYl9jb25uZWN0ZWQoZGksCiAJCQkJCQl0cnVlKTsKIAkJCQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLAotCQkJCQkJJmRpLT51c2JfY2hnLnBzeSk7CisJCQkJCQlkaS0+dXNiX2NoZy5wc3kpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMjI5NSw3ICsyMjk1LDcgQEAKIAl9CiAKIAlhYjg1MDBfY2hhcmdlcl9zZXRfdXNiX2Nvbm5lY3RlZChkaSwgdHJ1ZSk7Ci0JYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCAmZGktPnVzYl9jaGcucHN5KTsKKwlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7CiB9CiAKIC8qKgpAQCAtMjM5Myw3ICsyMzkzLDcgQEAKIAlpZiAoIShkZXRlY3RlZF9jaGFyZ2VycyAmIFVTQl9QV19DT05OKSkgewogCQlkaS0+dmJ1c19kZXRlY3RlZCA9IGZhbHNlOwogCQlhYjg1MDBfY2hhcmdlcl9zZXRfdXNiX2Nvbm5lY3RlZChkaSwgZmFsc2UpOwotCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksICZkaS0+dXNiX2NoZy5wc3kpOworCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTI0MDQsNyArMjQwNCw3IEBACiAJCWlmIChyZXQgPT0gLUVOWElPKSB7CiAJCQkvKiBObyB2YWxpZCBjaGFyZ2VyIHR5cGUgZGV0ZWN0ZWQgKi8KIAkJCWFiODUwMF9jaGFyZ2VyX3NldF91c2JfY29ubmVjdGVkKGRpLCBmYWxzZSk7Ci0JCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksICZkaS0+dXNiX2NoZy5wc3kpOworCQkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+dXNiX2NoZy5wc3kpOwogCQl9CiAJCXJldHVybjsKIAl9CkBAIC0yNDYzLDcgKzI0NjMsNyBAQAogCWNhc2UgQUI4NTAwX0JNX1VTQl9TVEFURV9TVVNQRU5EOgogCWNhc2UgQUI4NTAwX0JNX1VTQl9TVEFURV9NQVg6CiAJCWFiODUwMF9jaGFyZ2VyX3NldF91c2JfY29ubmVjdGVkKGRpLCBmYWxzZSk7Ci0JCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgJmRpLT51c2JfY2hnLnBzeSk7CisJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKIAkJYnJlYWs7CiAKIAljYXNlIEFCODUwMF9CTV9VU0JfU1RBVEVfUkVTVU1FOgpAQCAtMjQ4Niw3ICsyNDg2LDcgQEAKIAkJCQlyZXR1cm47CiAKIAkJCWFiODUwMF9jaGFyZ2VyX3NldF91c2JfY29ubmVjdGVkKGRpLCB0cnVlKTsKLQkJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgJmRpLT51c2JfY2hnLnBzeSk7CisJCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT51c2JfY2hnLnBzeSk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTI1MzAsNyArMjUzMCw3IEBACiAJfQogCiAJaWYgKHByZXZfc3RhdHVzICE9IGRpLT5mbGFncy51c2JjaGFyZ2Vybm90b2spCi0JCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgJmRpLT51c2JfY2hnLnBzeSk7CisJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKIH0KIAogLyoqCkBAIC0yNTYwLDcgKzI1NjAsNyBAQAogCWVsc2UKIAkJZGktPmZsYWdzLm1haW5fdGhlcm1hbF9wcm90ID0gZmFsc2U7CiAKLQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksICZkaS0+YWNfY2hnLnBzeSk7CisJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+YWNfY2hnLnBzeSk7CiB9CiAKIC8qKgpAQCAtMjU5MCw3ICsyNTkwLDcgQEAKIAllbHNlCiAJCWRpLT5mbGFncy51c2JfdGhlcm1hbF9wcm90ID0gZmFsc2U7CiAKLQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksICZkaS0+dXNiX2NoZy5wc3kpOworCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKIH0KIAogLyoqCkBAIC0yNjUxLDcgKzI2NTEsNyBAQAogCiAJZGV2X2RiZyhkaS0+ZGV2LCAiTWFpbiBjaGFyZ2VyIG5vdCBva1xuIik7CiAJZGktPmZsYWdzLm1haW5leHRjaG5vdG9rID0gdHJ1ZTsKLQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksICZkaS0+YWNfY2hnLnBzeSk7CisJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+YWNfY2hnLnBzeSk7CiAKIAkvKiBTY2hlZHVsZSBhIG5ldyBIVyBmYWlsdXJlIGNoZWNrICovCiAJcXVldWVfZGVsYXllZF93b3JrKGRpLT5jaGFyZ2VyX3dxLCAmZGktPmNoZWNrX2h3X2ZhaWx1cmVfd29yaywgMCk7CkBAIC0yODgwLDExICsyODgwLDExIEBACiAJICovCiAJaWYgKGRpLT5hYy5jaGFyZ2VyX29ubGluZSkgewogCQlkaS0+YWMud2RfZXhwaXJlZCA9IHRydWU7Ci0JCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgJmRpLT5hY19jaGcucHN5KTsKKwkJYWI4NTAwX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLCBkaS0+YWNfY2hnLnBzeSk7CiAJfQogCWlmIChkaS0+dXNiLmNoYXJnZXJfb25saW5lKSB7CiAJCWRpLT51c2Iud2RfZXhwaXJlZCA9IHRydWU7Ci0JCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgJmRpLT51c2JfY2hnLnBzeSk7CisJCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKIAl9CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0yOTI3LDcgKzI5MjcsNyBAQAogCiAJZGV2X2RiZyhkaS0+ZGV2LCAiVkJVUyBvdmVydm9sdGFnZSBkZXRlY3RlZFxuIik7CiAJZGktPmZsYWdzLnZidXNfb3Z2ID0gdHJ1ZTsKLQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksICZkaS0+dXNiX2NoZy5wc3kpOworCWFiODUwMF9wb3dlcl9zdXBwbHlfY2hhbmdlZChkaSwgZGktPnVzYl9jaGcucHN5KTsKIAogCS8qIFNjaGVkdWxlIGEgbmV3IEhXIGZhaWx1cmUgY2hlY2sgKi8KIAlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmNoYXJnZXJfd3EsICZkaS0+Y2hlY2tfaHdfZmFpbHVyZV93b3JrLCAwKTsKQEAgLTM0MjgsMTAgKzM0MjgsMTAgQEAKIAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAJaWYgKGRpLT51c2JfY2hnLmVuYWJsZWQpCi0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkaS0+dXNiX2NoZy5wc3kpOworCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkaS0+dXNiX2NoZy5wc3kpOwogCiAJaWYgKGRpLT5hY19jaGcuZW5hYmxlZCAmJiAhZGktPmFjX2NoZy5leHRlcm5hbCkKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRpLT5hY19jaGcucHN5KTsKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmFjX2NoZy5wc3kpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNDQyLDEwICszNDQyLDI3IEBACiAJImFiODUwMF9idGVtcCIsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFiODUwMF9hY19jaGdfZGVzYyA9IHsKKwkubmFtZQkJPSAiYWI4NTAwX2FjIiwKKwkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUywKKwkucHJvcGVydGllcwk9IGFiODUwMF9jaGFyZ2VyX2FjX3Byb3BzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoYWI4NTAwX2NoYXJnZXJfYWNfcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJPSBhYjg1MDBfY2hhcmdlcl9hY19nZXRfcHJvcGVydHksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFiODUwMF91c2JfY2hnX2Rlc2MgPSB7CisJLm5hbWUJCT0gImFiODUwMF91c2IiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQiwKKwkucHJvcGVydGllcwk9IGFiODUwMF9jaGFyZ2VyX3VzYl9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKGFiODUwMF9jaGFyZ2VyX3VzYl9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IGFiODUwMF9jaGFyZ2VyX3VzYl9nZXRfcHJvcGVydHksCit9OworCiBzdGF0aWMgaW50IGFiODUwMF9jaGFyZ2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIGFjX3BzeV9jZmcgPSB7fSwgdXNiX3BzeV9jZmcgPSB7fTsKIAlzdHJ1Y3QgYWI4NTAwX2NoYXJnZXIgKmRpOwogCWludCBpcnEsIGksIGNoYXJnZXJfc3RhdHVzLCByZXQgPSAwLCBjaF9zdGF0OwogCkBAIC0zNDgzLDE1ICszNTAwLDE1IEBACiAJZGktPmF1dG9wb3dlciA9IGZhbHNlOwogCWRpLT5pbnZhbGlkX2NoYXJnZXJfZGV0ZWN0X3N0YXRlID0gMDsKIAorCS8qIEFDIGFuZCBVU0Igc3VwcGx5IGNvbmZpZyAqLworCWFjX3BzeV9jZmcuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOworCWFjX3BzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbHlfaW50ZXJmYWNlKTsKKwlhY19wc3lfY2ZnLmRydl9kYXRhID0gJmRpLT5hY19jaGc7CisJdXNiX3BzeV9jZmcuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOworCXVzYl9wc3lfY2ZnLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJWkUoc3VwcGx5X2ludGVyZmFjZSk7CisJdXNiX3BzeV9jZmcuZHJ2X2RhdGEgPSAmZGktPnVzYl9jaGc7CisKIAkvKiBBQyBzdXBwbHkgKi8KLQkvKiBwb3dlcl9zdXBwbHkgYmFzZSBjbGFzcyAqLwotCWRpLT5hY19jaGcucHN5Lm5hbWUgPSAiYWI4NTAwX2FjIjsKLQlkaS0+YWNfY2hnLnBzeS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7Ci0JZGktPmFjX2NoZy5wc3kucHJvcGVydGllcyA9IGFiODUwMF9jaGFyZ2VyX2FjX3Byb3BzOwotCWRpLT5hY19jaGcucHN5Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShhYjg1MDBfY2hhcmdlcl9hY19wcm9wcyk7Ci0JZGktPmFjX2NoZy5wc3kuZ2V0X3Byb3BlcnR5ID0gYWI4NTAwX2NoYXJnZXJfYWNfZ2V0X3Byb3BlcnR5OwotCWRpLT5hY19jaGcucHN5LnN1cHBsaWVkX3RvID0gc3VwcGx5X2ludGVyZmFjZTsKLQlkaS0+YWNfY2hnLnBzeS5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKHN1cHBseV9pbnRlcmZhY2UpLAogCS8qIHV4NTAwX2NoYXJnZXIgc3ViLWNsYXNzICovCiAJZGktPmFjX2NoZy5vcHMuZW5hYmxlID0gJmFiODUwMF9jaGFyZ2VyX2FjX2VuOwogCWRpLT5hY19jaGcub3BzLmNoZWNrX2VuYWJsZSA9ICZhYjg1MDBfY2hhcmdlcl9hY19jaGVja19lbmFibGU7CkBAIC0zNTExLDE0ICszNTI4LDYgQEAKIAkJCSZjaGFyZ2VyX25vdGlmaWVyX2xpc3QsICZjaGFyZ2VyX25iKTsKIAogCS8qIFVTQiBzdXBwbHkgKi8KLQkvKiBwb3dlcl9zdXBwbHkgYmFzZSBjbGFzcyAqLwotCWRpLT51c2JfY2hnLnBzeS5uYW1lID0gImFiODUwMF91c2IiOwotCWRpLT51c2JfY2hnLnBzeS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOwotCWRpLT51c2JfY2hnLnBzeS5wcm9wZXJ0aWVzID0gYWI4NTAwX2NoYXJnZXJfdXNiX3Byb3BzOwotCWRpLT51c2JfY2hnLnBzeS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoYWI4NTAwX2NoYXJnZXJfdXNiX3Byb3BzKTsKLQlkaS0+dXNiX2NoZy5wc3kuZ2V0X3Byb3BlcnR5ID0gYWI4NTAwX2NoYXJnZXJfdXNiX2dldF9wcm9wZXJ0eTsKLQlkaS0+dXNiX2NoZy5wc3kuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOwotCWRpLT51c2JfY2hnLnBzeS5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKHN1cHBseV9pbnRlcmZhY2UpLAogCS8qIHV4NTAwX2NoYXJnZXIgc3ViLWNsYXNzICovCiAJZGktPnVzYl9jaGcub3BzLmVuYWJsZSA9ICZhYjg1MDBfY2hhcmdlcl91c2JfZW47CiAJZGktPnVzYl9jaGcub3BzLmNoZWNrX2VuYWJsZSA9ICZhYjg1MDBfY2hhcmdlcl91c2JfY2hlY2tfZW5hYmxlOwpAQCAtMzYxNiwxOCArMzYyNSwyNCBAQAogCiAJLyogUmVnaXN0ZXIgQUMgY2hhcmdlciBjbGFzcyAqLwogCWlmIChkaS0+YWNfY2hnLmVuYWJsZWQpIHsKLQkJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRpLT5kZXYsICZkaS0+YWNfY2hnLnBzeSk7Ci0JCWlmIChyZXQpIHsKKwkJZGktPmFjX2NoZy5wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGktPmRldiwKKwkJCQkJCSAgICAgICAmYWI4NTAwX2FjX2NoZ19kZXNjLAorCQkJCQkJICAgICAgICZhY19wc3lfY2ZnKTsKKwkJaWYgKElTX0VSUihkaS0+YWNfY2hnLnBzeSkpIHsKIAkJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBBQyBjaGFyZ2VyXG4iKTsKKwkJCXJldCA9IFBUUl9FUlIoZGktPmFjX2NoZy5wc3kpOwogCQkJZ290byBmcmVlX2NoYXJnZXJfd3E7CiAJCX0KIAl9CiAKIAkvKiBSZWdpc3RlciBVU0IgY2hhcmdlciBjbGFzcyAqLwogCWlmIChkaS0+dXNiX2NoZy5lbmFibGVkKSB7Ci0JCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkaS0+ZGV2LCAmZGktPnVzYl9jaGcucHN5KTsKLQkJaWYgKHJldCkgeworCQlkaS0+dXNiX2NoZy5wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGktPmRldiwKKwkJCQkJCQkmYWI4NTAwX3VzYl9jaGdfZGVzYywKKwkJCQkJCQkmdXNiX3BzeV9jZmcpOworCQlpZiAoSVNfRVJSKGRpLT51c2JfY2hnLnBzeSkpIHsKIAkJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBVU0IgY2hhcmdlclxuIik7CisJCQlyZXQgPSBQVFJfRVJSKGRpLT51c2JfY2hnLnBzeSk7CiAJCQlnb3RvIGZyZWVfYWM7CiAJCX0KIAl9CkBAIC0zNjUwLDggKzM2NjUsOCBAQAogCWlmIChjaGFyZ2VyX3N0YXR1cyAmIEFDX1BXX0NPTk4pIHsKIAkJZGktPmFjLmNoYXJnZXJfY29ubmVjdGVkID0gMTsKIAkJZGktPmFjX2Nvbm4gPSB0cnVlOwotCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksICZkaS0+YWNfY2hnLnBzeSk7Ci0JCXN5c2ZzX25vdGlmeSgmZGktPmFjX2NoZy5wc3kuZGV2LT5rb2JqLCBOVUxMLCAicHJlc2VudCIpOworCQlhYjg1MDBfcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGksIGRpLT5hY19jaGcucHN5KTsKKwkJc3lzZnNfbm90aWZ5KCZkaS0+YWNfY2hnLnBzeS0+ZGV2LmtvYmosIE5VTEwsICJwcmVzZW50Iik7CiAJfQogCiAJaWYgKGNoYXJnZXJfc3RhdHVzICYgVVNCX1BXX0NPTk4pIHsKQEAgLTM3MTIsMTAgKzM3MjcsMTAgQEAKIAl1c2JfcHV0X3BoeShkaS0+dXNiX3BoeSk7CiBmcmVlX3VzYjoKIAlpZiAoZGktPnVzYl9jaGcuZW5hYmxlZCkKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRpLT51c2JfY2hnLnBzeSk7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT51c2JfY2hnLnBzeSk7CiBmcmVlX2FjOgogCWlmIChkaS0+YWNfY2hnLmVuYWJsZWQpCi0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkaS0+YWNfY2hnLnBzeSk7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5hY19jaGcucHN5KTsKIGZyZWVfY2hhcmdlcl93cToKIAlkZXN0cm95X3dvcmtxdWV1ZShkaS0+Y2hhcmdlcl93cSk7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvYWI4NTAwX2ZnLmMgYi9kcml2ZXJzL3Bvd2VyL2FiODUwMF9mZy5jCmluZGV4IGM5MDg2NTguLjM4MzBkYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvYWI4NTAwX2ZnLmMKKysrIGIvZHJpdmVycy9wb3dlci9hYjg1MDBfZmcuYwpAQCAtNTcsOSArNTcsNiBAQAogI2RlZmluZSBpbnRlcnBvbGF0ZSh4LCB4MSwgeTEsIHgyLCB5MikgXAogCSgoeTEpICsgKCgoKHkyKSAtICh5MSkpICogKCh4KSAtICh4MSkpKSAvICgoeDIpIC0gKHgxKSkpKTsKIAotI2RlZmluZSB0b19hYjg1MDBfZmdfZGV2aWNlX2luZm8oeCkgY29udGFpbmVyX29mKCh4KSwgXAotCXN0cnVjdCBhYjg1MDBfZmcsIGZnX3BzeSk7Ci0KIC8qKgogICogc3RydWN0IGFiODUwMF9mZ19pbnRlcnJ1cHRzIC0gYWI4NTAwIGZnIGludGVydXB0cwogICogQG5hbWU6CW5hbWUgb2YgdGhlIGludGVycnVwdApAQCAtMjI5LDcgKzIyNiw3IEBACiAJc3RydWN0IGFiODUwMCAqcGFyZW50OwogCXN0cnVjdCBhYjg1MDBfZ3BhZGMgKmdwYWRjOwogCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqYm07Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSBmZ19wc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqZmdfcHN5OwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpmZ193cTsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGZnX3BlcmlvZGljX3dvcms7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBmZ19sb3dfYmF0X3dvcms7CkBAIC02MjIsMTQgKzYxOSwxNCBAQAogCXU4IGxvdywgaGlnaDsKIAlpbnQgdmFsOwogCWludCByZXQ7Ci0JaW50IHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCiAJaWYgKCFjb21wbGV0aW9uX2RvbmUoJmRpLT5hYjg1MDBfZmdfY29tcGxldGUpKSB7CiAJCXRpbWVvdXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoCiAJCQkmZGktPmFiODUwMF9mZ19jb21wbGV0ZSwKIAkJCUlOU19DVVJSX1RJTUVPVVQpOwogCQlkZXZfZGJnKGRpLT5kZXYsICJGaW5hbGl6ZSB0aW1lOiAlZCBtc1xuIiwKLQkJCSgoSU5TX0NVUlJfVElNRU9VVCAtIHRpbWVvdXQpICogMTAwMCkgLyBIWik7CisJCQlqaWZmaWVzX3RvX21zZWNzKElOU19DVVJSX1RJTUVPVVQgLSB0aW1lb3V0KSk7CiAJCWlmICghdGltZW91dCkgewogCQkJcmV0ID0gLUVUSU1FOwogCQkJZGlzYWJsZV9pcnEoZGktPmlycSk7CkBAIC03MTYsNyArNzEzLDcgQEAKIGludCBhYjg1MDBfZmdfaW5zdF9jdXJyX2Jsb2NraW5nKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQogewogCWludCByZXQ7Ci0JaW50IHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCWludCByZXMgPSAwOwogCiAJcmV0ID0gYWI4NTAwX2ZnX2luc3RfY3Vycl9zdGFydChkaSk7CkBAIC03MzEsNyArNzI4LDcgQEAKIAkJCSZkaS0+YWI4NTAwX2ZnX3N0YXJ0ZWQsCiAJCQlJTlNfQ1VSUl9USU1FT1VUKTsKIAkJZGV2X2RiZyhkaS0+ZGV2LCAiU3RhcnQgdGltZTogJWQgbXNcbiIsCi0JCQkoKElOU19DVVJSX1RJTUVPVVQgLSB0aW1lb3V0KSAqIDEwMDApIC8gSFopOworCQkJamlmZmllc190b19tc2VjcyhJTlNfQ1VSUl9USU1FT1VUIC0gdGltZW91dCkpOwogCQlpZiAoIXRpbWVvdXQpIHsKIAkJCXJldCA9IC1FVElNRTsKIAkJCWRldl9lcnIoZGktPmRldiwgImNvbXBsZXRpb24gdGltZWQgb3V0IFslZF1cbiIsCkBAIC0xMzkxLDcgKzEzODgsNyBAQAogCQkJCWRpLT5iYXRfY2FwLnByZXZfcGVyY2VudCwKIAkJCQlkaS0+YmF0X2NhcC5jYXBfc2NhbGUuc2NhbGVkX2NhcCk7CiAJCX0KLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmRpLT5mZ19wc3kpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+ZmdfcHN5KTsKIAkJaWYgKGRpLT5mbGFncy5mdWxseV9jaGFyZ2VkICYmIGRpLT5mbGFncy5mb3JjZV9mdWxsKSB7CiAJCQlkZXZfZGJnKGRpLT5kZXYsICJCYXR0ZXJ5IGZ1bGwsIG5vdGlmeWluZy5cbiIpOwogCQkJZGktPmZsYWdzLmZvcmNlX2Z1bGwgPSBmYWxzZTsKQEAgLTE4NTAsNyArMTg0Nyw3IEBACiAJCWlmICghZGktPmZsYWdzLmJhdF9vdnYpIHsKIAkJCWRldl9kYmcoZGktPmRldiwgIkJhdHRlcnkgT1ZWXG4iKTsKIAkJCWRpLT5mbGFncy5iYXRfb3Z2ID0gdHJ1ZTsKLQkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZkaS0+ZmdfcHN5KTsKKwkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5mZ19wc3kpOwogCQl9CiAJCS8qIE5vdCB5ZXQgcmVjb3ZlcmVkIGZyb20gb3Z2LCByZXNjaGVkdWxlIHRoaXMgdGVzdCAqLwogCQlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPmZnX3dxLCAmZGktPmZnX2NoZWNrX2h3X2ZhaWx1cmVfd29yaywKQEAgLTE4NTgsNyArMTg1NSw3IEBACiAJCX0gZWxzZSB7CiAJCQlkZXZfZGJnKGRpLT5kZXYsICJCYXR0ZXJ5IHJlY292ZXJlZCBmcm9tIE9WVlxuIik7CiAJCQlkaS0+ZmxhZ3MuYmF0X292diA9IGZhbHNlOwotCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmRpLT5mZ19wc3kpOworCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmZnX3BzeSk7CiAJfQogfQogCkBAIC0yMDk2LDkgKzIwOTMsNyBAQAogCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBhYjg1MDBfZmcgKmRpOwotCi0JZGkgPSB0b19hYjg1MDBfZmdfZGV2aWNlX2luZm8ocHN5KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJLyoKIAkgKiBJZiBiYXR0ZXJ5IGlzIGlkZW50aWZpZWQgYXMgdW5rbm93biBhbmQgY2hhcmdpbmcgb2YgdW5rbm93bgpAQCAtMjE4MSwxNCArMjE3NiwxNCBAQAogCiAJcHN5ID0gKHN0cnVjdCBwb3dlcl9zdXBwbHkgKilkYXRhOwogCWV4dCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWRpID0gdG9fYWI4NTAwX2ZnX2RldmljZV9pbmZvKHBzeSk7CisJZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAogCS8qCiAJICogRm9yIGFsbCBwc3kgd2hlcmUgdGhlIG5hbWUgb2YgeW91ciBkcml2ZXIKIAkgKiBhcHBlYXJzIGluIGFueSBzdXBwbGllZF90bwogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBleHQtPm51bV9zdXBwbGljYW50czsgaSsrKSB7Ci0JCWlmICghc3RyY21wKGV4dC0+c3VwcGxpZWRfdG9baV0sIHBzeS0+bmFtZSkpCisJCWlmICghc3RyY21wKGV4dC0+c3VwcGxpZWRfdG9baV0sIHBzeS0+ZGVzYy0+bmFtZSkpCiAJCQlwc3lfZm91bmQgPSB0cnVlOwogCX0KIApAQCAtMjE5NiwxNiArMjE5MSwxNiBAQAogCQlyZXR1cm4gMDsKIAogCS8qIEdvIHRocm91Z2ggYWxsIHByb3BlcnRpZXMgZm9yIHRoZSBwc3kgKi8KLQlmb3IgKGogPSAwOyBqIDwgZXh0LT5udW1fcHJvcGVydGllczsgaisrKSB7CisJZm9yIChqID0gMDsgaiA8IGV4dC0+ZGVzYy0+bnVtX3Byb3BlcnRpZXM7IGorKykgewogCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wOwotCQlwcm9wID0gZXh0LT5wcm9wZXJ0aWVzW2pdOworCQlwcm9wID0gZXh0LT5kZXNjLT5wcm9wZXJ0aWVzW2pdOwogCi0JCWlmIChleHQtPmdldF9wcm9wZXJ0eShleHQsIHByb3AsICZyZXQpKQorCQlpZiAocG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShleHQsIHByb3AsICZyZXQpKQogCQkJY29udGludWU7CiAKIAkJc3dpdGNoIChwcm9wKSB7CiAJCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgotCQkJc3dpdGNoIChleHQtPnR5cGUpIHsKKwkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7CiAJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6CiAJCQkJc3dpdGNoIChyZXQuaW50dmFsKSB7CiAJCQkJY2FzZSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV046CkBAIC0yMjQ0LDcgKzIyMzksNyBAQAogCQkJfTsKIAkJCWJyZWFrOwogCQljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6Ci0JCQlzd2l0Y2ggKGV4dC0+dHlwZSkgeworCQkJc3dpdGNoIChleHQtPmRlc2MtPnR5cGUpIHsKIAkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWToKIAkJCQlpZiAoIWRpLT5mbGFncy5iYXR0X2lkX3JlY2VpdmVkICYmCiAJCQkJICAgIGRpLT5ibS0+YmF0dF9pZCAhPSBCQVRURVJZX1VOS05PV04pIHsKQEAgLTIyNzQsNyArMjI2OSw3IEBACiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgotCQkJc3dpdGNoIChleHQtPnR5cGUpIHsKKwkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7CiAJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6CiAJCQkJaWYgKGRpLT5mbGFncy5iYXR0X2lkX3JlY2VpdmVkKQogCQkJCQlkaS0+YmF0X3RlbXAgPSByZXQuaW50dmFsOwpAQCAtMjM5OSwxMCArMjM5NCwxMCBAQAogICovCiBzdGF0aWMgdm9pZCBhYjg1MDBfZmdfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCiB7Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGkgPSB0b19hYjg1MDBfZmdfZGV2aWNlX2luZm8ocHN5KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJY2xhc3NfZm9yX2VhY2hfZGV2aWNlKHBvd2VyX3N1cHBseV9jbGFzcywgTlVMTCwKLQkJJmRpLT5mZ19wc3ksIGFiODUwMF9mZ19nZXRfZXh0X3BzeV9kYXRhKTsKKwkJZGktPmZnX3BzeSwgYWI4NTAwX2ZnX2dldF9leHRfcHN5X2RhdGEpOwogfQogCiAvKioKQEAgLTI1ODAsOSArMjU3NSw3IEBACiAJaW50IHJldDsKIAl1OCByZWdfdmFsdWU7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGk7Ci0KLQlkaSA9IHRvX2FiODUwMF9mZ19kZXZpY2VfaW5mbyhwc3kpOworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKIAkJQUI4NTA1X1JUQ19QQ1VUX0ZMQUdfVElNRV9SRUcsICZyZWdfdmFsdWUpOwpAQCAtMjYwNSw5ICsyNTk4LDcgQEAKIAlpbnQgcmV0OwogCWxvbmcgdW5zaWduZWQgcmVnX3ZhbHVlOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhYjg1MDBfZmcgKmRpOwotCi0JZGkgPSB0b19hYjg1MDBfZmdfZGV2aWNlX2luZm8ocHN5KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJcmVnX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAKQEAgLTI2MzMsOSArMjYyNCw3IEBACiAJaW50IHJldDsKIAl1OCByZWdfdmFsdWU7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGk7Ci0KLQlkaSA9IHRvX2FiODUwMF9mZ19kZXZpY2VfaW5mbyhwc3kpOworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKIAkJQUI4NTA1X1JUQ19QQ1VUX01BWF9USU1FX1JFRywgJnJlZ192YWx1ZSk7CkBAIC0yNjU5LDkgKzI2NDgsNyBAQAogCWludCByZXQ7CiAJaW50IHJlZ192YWx1ZTsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKLQotCWRpID0gdG9fYWI4NTAwX2ZnX2RldmljZV9pbmZvKHBzeSk7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAogCXJlZ192YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCWlmIChyZWdfdmFsdWUgPiAweDdGKSB7CkBAIC0yNjg2LDkgKzI2NzMsNyBAQAogCWludCByZXQ7CiAJdTggcmVnX3ZhbHVlOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhYjg1MDBfZmcgKmRpOwotCi0JZGkgPSB0b19hYjg1MDBfZmdfZGV2aWNlX2luZm8ocHN5KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCiAJCUFCODUwNV9SVENfUENVVF9SRVNUQVJUX1JFRywgJnJlZ192YWx1ZSk7CkBAIC0yNzExLDkgKzI2OTYsNyBAQAogCWludCByZXQ7CiAJaW50IHJlZ192YWx1ZTsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKLQotCWRpID0gdG9fYWI4NTAwX2ZnX2RldmljZV9pbmZvKHBzeSk7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAogCXJlZ192YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCWlmIChyZWdfdmFsdWUgPiAweEYpIHsKQEAgLTI3MzksOSArMjcyMiw3IEBACiAJaW50IHJldDsKIAl1OCByZWdfdmFsdWU7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGk7Ci0KLQlkaSA9IHRvX2FiODUwMF9mZ19kZXZpY2VfaW5mbyhwc3kpOworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKIAkJCQkJCUFCODUwNV9SVENfUENVVF9USU1FX1JFRywgJnJlZ192YWx1ZSk7CkBAIC0yNzY0LDkgKzI3NDUsNyBAQAogCWludCByZXQ7CiAJdTggcmVnX3ZhbHVlOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhYjg1MDBfZmcgKmRpOwotCi0JZGkgPSB0b19hYjg1MDBfZmdfZGV2aWNlX2luZm8ocHN5KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCiAJCQkJCQlBQjg1MDVfUlRDX1BDVVRfUkVTVEFSVF9SRUcsICZyZWdfdmFsdWUpOwpAQCAtMjc4OSw5ICsyNzY4LDcgQEAKIAlpbnQgcmV0OwogCXU4IHJlZ192YWx1ZTsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKLQotCWRpID0gdG9fYWI4NTAwX2ZnX2RldmljZV9pbmZvKHBzeSk7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAogCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAogCQkJCQkJQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHLCAmcmVnX3ZhbHVlKTsKQEAgLTI4MTIsOSArMjc4OSw3IEBACiAJaW50IHJldDsKIAlpbnQgcmVnX3ZhbHVlOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhYjg1MDBfZmcgKmRpOwotCi0JZGkgPSB0b19hYjg1MDBfZmdfZGV2aWNlX2luZm8ocHN5KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJcmVnX3ZhbHVlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CiAJaWYgKHJlZ192YWx1ZSA+IDB4MSkgewpAQCAtMjg0MCw5ICsyODE1LDcgQEAKIAlpbnQgcmV0OwogCXU4IHJlZ192YWx1ZTsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKLQotCWRpID0gdG9fYWI4NTAwX2ZnX2RldmljZV9pbmZvKHBzeSk7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAogCXJldCA9IGFieDUwMF9nZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkaS0+ZGV2LCBBQjg1MDBfUlRDLAogCQkJCQkJQUI4NTA1X1JUQ19QQ1VUX0NUTF9TVEFUVVNfUkVHLCAgJnJlZ192YWx1ZSk7CkBAIC0yODY1LDkgKzI4MzgsNyBAQAogCWludCByZXQ7CiAJdTggcmVnX3ZhbHVlOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhYjg1MDBfZmcgKmRpOwotCi0JZGkgPSB0b19hYjg1MDBfZmdfZGV2aWNlX2luZm8ocHN5KTsKKwlzdHJ1Y3QgYWI4NTAwX2ZnICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJcmV0ID0gYWJ4NTAwX2dldF9yZWdpc3Rlcl9pbnRlcnJ1cHRpYmxlKGRpLT5kZXYsIEFCODUwMF9SVEMsCiAJCQkJCQlBQjg1MDVfUlRDX1BDVVRfREVCT1VOQ0VfUkVHLCAgJnJlZ192YWx1ZSk7CkBAIC0yODkwLDkgKzI4NjEsNyBAQAogCWludCByZXQ7CiAJaW50IHJlZ192YWx1ZTsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKLQotCWRpID0gdG9fYWI4NTAwX2ZnX2RldmljZV9pbmZvKHBzeSk7CisJc3RydWN0IGFiODUwMF9mZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAogCXJlZ192YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMTApOwogCWlmIChyZWdfdmFsdWUgPiAweDcpIHsKQEAgLTI5MTcsOSArMjg4Niw3IEBACiAJaW50IHJldDsKIAl1OCByZWdfdmFsdWU7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGFiODUwMF9mZyAqZGk7Ci0KLQlkaSA9IHRvX2FiODUwMF9mZ19kZXZpY2VfaW5mbyhwc3kpOworCXN0cnVjdCBhYjg1MDBfZmcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAlyZXQgPSBhYng1MDBfZ2V0X3JlZ2lzdGVyX2ludGVycnVwdGlibGUoZGktPmRldiwgQUI4NTAwX1JUQywKIAkJCQkJCUFCODUwNV9SVENfUENVVF9DVExfU1RBVFVTX1JFRywgJnJlZ192YWx1ZSk7CkBAIC0yOTU0LDQ0ICsyOTIxLDM4IEBACiAJCWFiODUwNV9wb3dlcmN1dF9lbmFibGVfc3RhdHVzX3JlYWQsIE5VTEwpLAogfTsKIAotc3RhdGljIGludCBhYjg1MDBfZmdfc3lzZnNfcHN5X2NyZWF0ZV9hdHRycyhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGFiODUwMF9mZ19zeXNmc19wc3lfY3JlYXRlX2F0dHJzKHN0cnVjdCBhYjg1MDBfZmcgKmRpKQogewogCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBhYjg1MDBfZmcgKmRpOwotCi0JZGkgPSB0b19hYjg1MDBfZmdfZGV2aWNlX2luZm8ocHN5KTsKIAogCWlmICgoKGlzX2FiODUwNShkaS0+cGFyZW50KSB8fCBpc19hYjk1NDAoZGktPnBhcmVudCkpICYmCi0JICAgICBhYng1MDBfZ2V0X2NoaXBfaWQoZGV2LT5wYXJlbnQpID49IEFCODUwMF9DVVQyUDApCisJICAgICBhYng1MDBfZ2V0X2NoaXBfaWQoZGktPmRldikgPj0gQUI4NTAwX0NVVDJQMCkKIAkgICAgfHwgaXNfYWI4NTQwKGRpLT5wYXJlbnQpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwNV9mZ19zeXNmc19wc3lfYXR0cnMpOyBpKyspCi0JCQlpZiAoZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwKKwkJCWlmIChkZXZpY2VfY3JlYXRlX2ZpbGUoJmRpLT5mZ19wc3ktPmRldiwKIAkJCQkJICAgICAgICZhYjg1MDVfZmdfc3lzZnNfcHN5X2F0dHJzW2ldKSkKIAkJCQlnb3RvIHN5c2ZzX3BzeV9jcmVhdGVfYXR0cnNfZmFpbGVkX2FiODUwNTsKIAl9CiAJcmV0dXJuIDA7CiBzeXNmc19wc3lfY3JlYXRlX2F0dHJzX2ZhaWxlZF9hYjg1MDU6Ci0JZGV2X2VycihkZXYsICJGYWlsZWQgY3JlYXRpbmcgc3lzZnMgcHN5IGF0dHJzIGZvciBhYjg1MDUuXG4iKTsKKwlkZXZfZXJyKCZkaS0+ZmdfcHN5LT5kZXYsICJGYWlsZWQgY3JlYXRpbmcgc3lzZnMgcHN5IGF0dHJzIGZvciBhYjg1MDUuXG4iKTsKIAl3aGlsZSAoaS0tKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoZGV2LCAmYWI4NTA1X2ZnX3N5c2ZzX3BzeV9hdHRyc1tpXSk7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmZGktPmZnX3BzeS0+ZGV2LAorCQkJCSAgICZhYjg1MDVfZmdfc3lzZnNfcHN5X2F0dHJzW2ldKTsKIAogCXJldHVybiAtRUlPOwogfQogCi1zdGF0aWMgdm9pZCBhYjg1MDBfZmdfc3lzZnNfcHN5X3JlbW92ZV9hdHRycyhzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgdm9pZCBhYjg1MDBfZmdfc3lzZnNfcHN5X3JlbW92ZV9hdHRycyhzdHJ1Y3QgYWI4NTAwX2ZnICpkaSkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKLQotCWRpID0gdG9fYWI4NTAwX2ZnX2RldmljZV9pbmZvKHBzeSk7CiAKIAlpZiAoKChpc19hYjg1MDUoZGktPnBhcmVudCkgfHwgaXNfYWI5NTQwKGRpLT5wYXJlbnQpKSAmJgotCSAgICAgYWJ4NTAwX2dldF9jaGlwX2lkKGRldi0+cGFyZW50KSA+PSBBQjg1MDBfQ1VUMlAwKQorCSAgICAgYWJ4NTAwX2dldF9jaGlwX2lkKGRpLT5kZXYpID49IEFCODUwMF9DVVQyUDApCiAJICAgIHx8IGlzX2FiODU0MChkaS0+cGFyZW50KSkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYjg1MDVfZmdfc3lzZnNfcHN5X2F0dHJzKTsgaSsrKQotCQkJKHZvaWQpZGV2aWNlX3JlbW92ZV9maWxlKGRldiwgJmFiODUwNV9mZ19zeXNmc19wc3lfYXR0cnNbaV0pOworCQkJKHZvaWQpZGV2aWNlX3JlbW92ZV9maWxlKCZkaS0+ZmdfcHN5LT5kZXYsCisJCQkJCQkgJmFiODUwNV9mZ19zeXNmc19wc3lfYXR0cnNbaV0pOwogCX0KIH0KIApAQCAtMzA1NiwxNyArMzAxNywyMCBAQAogCWFiODUwMF9mZ19zeXNmc19leGl0KGRpKTsKIAogCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7Ci0JYWI4NTAwX2ZnX3N5c2ZzX3BzeV9yZW1vdmVfYXR0cnMoZGktPmZnX3BzeS5kZXYpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkaS0+ZmdfcHN5KTsKKwlhYjg1MDBfZmdfc3lzZnNfcHN5X3JlbW92ZV9hdHRycyhkaSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmZnX3BzeSk7CiAJcmV0dXJuIHJldDsKIH0KIAogLyogYWI4NTAwIGZnIGRyaXZlciBpbnRlcnJ1cHRzIGFuZCB0aGVpciByZXNwZWN0aXZlIGlzciAqLwotc3RhdGljIHN0cnVjdCBhYjg1MDBfZmdfaW50ZXJydXB0cyBhYjg1MDBfZmdfaXJxW10gPSB7CitzdGF0aWMgc3RydWN0IGFiODUwMF9mZ19pbnRlcnJ1cHRzIGFiODUwMF9mZ19pcnFfdGhbXSA9IHsKIAl7Ik5DT05WX0FDQ1UiLCBhYjg1MDBfZmdfY2NfY29udmVuZF9oYW5kbGVyfSwKIAl7IkJBVFRfT1ZWIiwgYWI4NTAwX2ZnX2JhdHRfb3Z2X2hhbmRsZXJ9LAogCXsiTE9XX0JBVF9GIiwgYWI4NTAwX2ZnX2xvd2JhdGZfaGFuZGxlcn0sCiAJeyJDQ19JTlRfQ0FMSUIiLCBhYjg1MDBfZmdfY2NfaW50X2NhbGliX2hhbmRsZXJ9LAorfTsKKworc3RhdGljIHN0cnVjdCBhYjg1MDBfZmdfaW50ZXJydXB0cyBhYjg1MDBfZmdfaXJxX2JoW10gPSB7CiAJeyJDQ0VPQyIsIGFiODUwMF9mZ19jY19kYXRhX2VuZF9oYW5kbGVyfSwKIH07CiAKQEAgLTMwNzUsMTAgKzMwMzksMjAgQEAKIAkiYWI4NTAwX3VzYiIsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGFiODUwMF9mZ19kZXNjID0geworCS5uYW1lCQkJPSAiYWI4NTAwX2ZnIiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwkJPSBhYjg1MDBfZmdfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUoYWI4NTAwX2ZnX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CQk9IGFiODUwMF9mZ19nZXRfcHJvcGVydHksCisJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQJPSBhYjg1MDBfZmdfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKK307CisKIHN0YXRpYyBpbnQgYWI4NTAwX2ZnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOwogCXN0cnVjdCBhYng1MDBfYm1fZGF0YSAqcGxhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKIAlzdHJ1Y3QgYWI4NTAwX2ZnICpkaTsKIAlpbnQgaSwgaXJxOwogCWludCByZXQgPSAwOwpAQCAtMzExMCwxNCArMzA4NCw5IEBACiAJZGktPnBhcmVudCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlkaS0+Z3BhZGMgPSBhYjg1MDBfZ3BhZGNfZ2V0KCJhYjg1MDAtZ3BhZGMuMCIpOwogCi0JZGktPmZnX3BzeS5uYW1lID0gImFiODUwMF9mZyI7Ci0JZGktPmZnX3BzeS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQlkaS0+ZmdfcHN5LnByb3BlcnRpZXMgPSBhYjg1MDBfZmdfcHJvcHM7Ci0JZGktPmZnX3BzeS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoYWI4NTAwX2ZnX3Byb3BzKTsKLQlkaS0+ZmdfcHN5LmdldF9wcm9wZXJ0eSA9IGFiODUwMF9mZ19nZXRfcHJvcGVydHk7Ci0JZGktPmZnX3BzeS5zdXBwbGllZF90byA9IHN1cHBseV9pbnRlcmZhY2U7Ci0JZGktPmZnX3BzeS5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKHN1cHBseV9pbnRlcmZhY2UpLAotCWRpLT5mZ19wc3kuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9IGFiODUwMF9mZ19leHRlcm5hbF9wb3dlcl9jaGFuZ2VkOworCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOworCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbHlfaW50ZXJmYWNlKTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gZGk7CiAKIAlkaS0+YmF0X2NhcC5tYXhfbWFoX2Rlc2lnbiA9IE1JTExJX1RPX01JQ1JPICoKIAkJZGktPmJtLT5iYXRfdHlwZVtkaS0+Ym0tPmJhdHRfaWRdLmNoYXJnZV9mdWxsX2Rlc2lnbjsKQEAgLTMxNzgsOSArMzE0NywxMCBAQAogCWRpLT5mbGFncy5iYXR0X2lkX3JlY2VpdmVkID0gZmFsc2U7CiAKIAkvKiBSZWdpc3RlciBGRyBwb3dlciBzdXBwbHkgY2xhc3MgKi8KLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGktPmRldiwgJmRpLT5mZ19wc3kpOwotCWlmIChyZXQpIHsKKwlkaS0+ZmdfcHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRpLT5kZXYsICZhYjg1MDBfZmdfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoZGktPmZnX3BzeSkpIHsKIAkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIEZHIHBzeVxuIik7CisJCXJldCA9IFBUUl9FUlIoZGktPmZnX3BzeSk7CiAJCWdvdG8gZnJlZV9pbnN0X2N1cnJfd3E7CiAJfQogCkBAIC0zMTk0LDIxICszMTY0LDM2IEBACiAJaW5pdF9jb21wbGV0aW9uKCZkaS0+YWI4NTAwX2ZnX3N0YXJ0ZWQpOwogCWluaXRfY29tcGxldGlvbigmZGktPmFiODUwMF9mZ19jb21wbGV0ZSk7CiAKLQkvKiBSZWdpc3RlciBpbnRlcnJ1cHRzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWI4NTAwX2ZnX2lycSk7IGkrKykgewotCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfZmdfaXJxW2ldLm5hbWUpOwotCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIE5VTEwsIGFiODUwMF9mZ19pcnFbaV0uaXNyLAotCQkJSVJRRl9TSEFSRUQgfCBJUlFGX05PX1NVU1BFTkQsCi0JCQlhYjg1MDBfZmdfaXJxW2ldLm5hbWUsIGRpKTsKKwkvKiBSZWdpc3RlciBwcmltYXJ5IGludGVycnVwdCBoYW5kbGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFiODUwMF9mZ19pcnFfdGgpOyBpKyspIHsKKwkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgYWI4NTAwX2ZnX2lycV90aFtpXS5uYW1lKTsKKwkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBhYjg1MDBfZmdfaXJxX3RoW2ldLmlzciwKKwkJCQkgIElSUUZfU0hBUkVEIHwgSVJRRl9OT19TVVNQRU5ELAorCQkJCSAgYWI4NTAwX2ZnX2lycV90aFtpXS5uYW1lLCBkaSk7CiAKIAkJaWYgKHJldCAhPSAwKSB7Ci0JCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gcmVxdWVzdCAlcyBJUlEgJWQ6ICVkXG4iCi0JCQkJLCBhYjg1MDBfZmdfaXJxW2ldLm5hbWUsIGlycSwgcmV0KTsKKwkJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZXF1ZXN0ICVzIElSUSAlZDogJWRcbiIsCisJCQkJYWI4NTAwX2ZnX2lycV90aFtpXS5uYW1lLCBpcnEsIHJldCk7CiAJCQlnb3RvIGZyZWVfaXJxOwogCQl9CiAJCWRldl9kYmcoZGktPmRldiwgIlJlcXVlc3RlZCAlcyBJUlEgJWQ6ICVkXG4iLAotCQkJYWI4NTAwX2ZnX2lycVtpXS5uYW1lLCBpcnEsIHJldCk7CisJCQlhYjg1MDBfZmdfaXJxX3RoW2ldLm5hbWUsIGlycSwgcmV0KTsKIAl9CisKKwkvKiBSZWdpc3RlciB0aHJlYWRlZCBpbnRlcnJ1cHQgaGFuZGxlciAqLworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIGFiODUwMF9mZ19pcnFfYmhbMF0ubmFtZSk7CisJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaXJxLCBOVUxMLCBhYjg1MDBfZmdfaXJxX2JoWzBdLmlzciwKKwkJCQlJUlFGX1NIQVJFRCB8IElSUUZfTk9fU1VTUEVORCB8IElSUUZfT05FU0hPVCwKKwkJCWFiODUwMF9mZ19pcnFfYmhbMF0ubmFtZSwgZGkpOworCisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZXF1ZXN0ICVzIElSUSAlZDogJWRcbiIsCisJCQlhYjg1MDBfZmdfaXJxX2JoWzBdLm5hbWUsIGlycSwgcmV0KTsKKwkJZ290byBmcmVlX2lycTsKKwl9CisJZGV2X2RiZyhkaS0+ZGV2LCAiUmVxdWVzdGVkICVzIElSUSAlZDogJWRcbiIsCisJCWFiODUwMF9mZ19pcnFfYmhbMF0ubmFtZSwgaXJxLCByZXQpOworCiAJZGktPmlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJDQ0VPQyIpOwogCWRpc2FibGVfaXJxKGRpLT5pcnEpOwogCWRpLT5uYnJfY2Nlb2NfaXJxX2NudCA9IDA7CkBAIC0zMjIxLDcgKzMyMDYsNyBAQAogCQlnb3RvIGZyZWVfaXJxOwogCX0KIAotCXJldCA9IGFiODUwMF9mZ19zeXNmc19wc3lfY3JlYXRlX2F0dHJzKGRpLT5mZ19wc3kuZGV2KTsKKwlyZXQgPSBhYjg1MDBfZmdfc3lzZnNfcHN5X2NyZWF0ZV9hdHRycyhkaSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRpLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIEZHIHBzeVxuIik7CiAJCWFiODUwMF9mZ19zeXNmc19leGl0KGRpKTsKQEAgLTMyNDMsMTMgKzMyMjgsMTUgQEAKIAlyZXR1cm4gcmV0OwogCiBmcmVlX2lycToKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmZGktPmZnX3BzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmZnX3BzeSk7CiAKLQkvKiBXZSBhbHNvIGhhdmUgdG8gZnJlZSBhbGwgc3VjY2Vzc2Z1bGx5IHJlZ2lzdGVyZWQgaXJxcyAqLwotCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkgewotCQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfZmdfaXJxW2ldLm5hbWUpOworCS8qIFdlIGFsc28gaGF2ZSB0byBmcmVlIGFsbCByZWdpc3RlcmVkIGlycXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYjg1MDBfZmdfaXJxX3RoKTsgaSsrKSB7CisJCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIGFiODUwMF9mZ19pcnFfdGhbaV0ubmFtZSk7CiAJCWZyZWVfaXJxKGlycSwgZGkpOwogCX0KKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBhYjg1MDBfZmdfaXJxX2JoWzBdLm5hbWUpOworCWZyZWVfaXJxKGlycSwgZGkpOwogZnJlZV9pbnN0X2N1cnJfd3E6CiAJZGVzdHJveV93b3JrcXVldWUoZGktPmZnX3dxKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9hYng1MDBfY2hhcmdhbGcuYyBiL2RyaXZlcnMvcG93ZXIvYWJ4NTAwX2NoYXJnYWxnLmMKaW5kZXggYWI1NGI4ZC4uNTQxZjcwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9hYng1MDBfY2hhcmdhbGcuYworKysgYi9kcml2ZXJzL3Bvd2VyL2FieDUwMF9jaGFyZ2FsZy5jCkBAIC01MCw5ICs1MCw2IEBACiAjZGVmaW5lIENIQVJHQUxHX0NVUlJfU1RFUF9MT1cJCTAKICNkZWZpbmUgQ0hBUkdBTEdfQ1VSUl9TVEVQX0hJR0gJMTAwCiAKLSNkZWZpbmUgdG9fYWJ4NTAwX2NoYXJnYWxnX2RldmljZV9pbmZvKHgpIGNvbnRhaW5lcl9vZigoeCksIFwKLQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnLCBjaGFyZ2FsZ19wc3kpOwotCiBlbnVtIGFieDUwMF9jaGFyZ2VycyB7CiAJTk9fQ0hHLAogCUFDX0NIRywKQEAgLTI1Niw3ICsyNTMsNyBAQAogCXN0cnVjdCBhYjg1MDAgKnBhcmVudDsKIAlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX2N1cnJlbnRfc3RlcF9zdGF0dXMgY3Vycl9zdGF0dXM7CiAJc3RydWN0IGFieDUwMF9ibV9kYXRhICpibTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGNoYXJnYWxnX3BzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpjaGFyZ2FsZ19wc3k7CiAJc3RydWN0IHV4NTAwX2NoYXJnZXIgKmFjX2NoZzsKIAlzdHJ1Y3QgdXg1MDBfY2hhcmdlciAqdXNiX2NoZzsKIAlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnX2V2ZW50cyBldmVudHM7CkBAIC02OTUsNyArNjkyLDcgQEAKIAlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwogCWRpLT5tYWludGVuYW5jZV9jaGcgPSBmYWxzZTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZkaS0+Y2hhcmdhbGdfd2Rfd29yayk7Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmRpLT5jaGFyZ2FsZ19wc3kpOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5jaGFyZ2FsZ19wc3kpOwogfQogCiAvKioKQEAgLTcxNSw3ICs3MTIsNyBAQAogCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKIAlkaS0+bWFpbnRlbmFuY2VfY2hnID0gZmFsc2U7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmZGktPmNoYXJnYWxnX3dkX3dvcmspOwotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZkaS0+Y2hhcmdhbGdfcHN5KTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+Y2hhcmdhbGdfcHN5KTsKIH0KIAogLyoqCkBAIC04NDIsNyArODM5LDcgQEAKIAkJCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOwogCQkJZGktPm1haW50ZW5hbmNlX2NoZyA9IHRydWU7CiAJCQlkZXZfZGJnKGRpLT5kZXYsICJFT0MgcmVhY2hlZCFcbiIpOwotCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmRpLT5jaGFyZ2FsZ19wc3kpOworCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmNoYXJnYWxnX3BzeSk7CiAJCX0gZWxzZSB7CiAJCQlkZXZfZGJnKGRpLT5kZXYsCiAJCQkJIiBFT0MgbGltaXQgcmVhY2hlZCBmb3IgdGhlICVkIgpAQCAtOTg3LDEwICs5ODQsMTAgQEAKIAogCXBzeSA9IChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICopZGF0YTsKIAlleHQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlkaSA9IHRvX2FieDUwMF9jaGFyZ2FsZ19kZXZpY2VfaW5mbyhwc3kpOworCWRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJLyogRm9yIGFsbCBwc3kgd2hlcmUgdGhlIGRyaXZlciBuYW1lIGFwcGVhcnMgaW4gYW55IHN1cHBsaWVkX3RvICovCiAJZm9yIChpID0gMDsgaSA8IGV4dC0+bnVtX3N1cHBsaWNhbnRzOyBpKyspIHsKLQkJaWYgKCFzdHJjbXAoZXh0LT5zdXBwbGllZF90b1tpXSwgcHN5LT5uYW1lKSkKKwkJaWYgKCFzdHJjbXAoZXh0LT5zdXBwbGllZF90b1tpXSwgcHN5LT5kZXNjLT5uYW1lKSkKIAkJCXBzeV9mb3VuZCA9IHRydWU7CiAJfQogCWlmICghcHN5X2ZvdW5kKQpAQCAtMTAwMSwyOSArOTk4LDMxIEBACiAJICogcHJvcGVydHkgYmVjYXVzZSBvZiBoYW5kbGluZyB0aGF0IHN5c2ZzIGVudHJ5IG9uIGl0cyBvd24sIHRoaXMgaXMKIAkgKiB0aGUgcGxhY2UgdG8gZ2V0IHRoZSBiYXR0ZXJ5IGNhcGFjaXR5LgogCSAqLwotCWlmICghZXh0LT5nZXRfcHJvcGVydHkoZXh0LCBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwgJnJldCkpIHsKKwlpZiAoIXBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkoZXh0LCBQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwgJnJldCkpIHsKIAkJZGktPmJhdHRfZGF0YS5wZXJjZW50ID0gcmV0LmludHZhbDsKIAkJY2FwYWNpdHlfdXBkYXRlZCA9IHRydWU7CiAJfQogCiAJLyogR28gdGhyb3VnaCBhbGwgcHJvcGVydGllcyBmb3IgdGhlIHBzeSAqLwotCWZvciAoaiA9IDA7IGogPCBleHQtPm51bV9wcm9wZXJ0aWVzOyBqKyspIHsKKwlmb3IgKGogPSAwOyBqIDwgZXh0LT5kZXNjLT5udW1fcHJvcGVydGllczsgaisrKSB7CiAJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHByb3A7Ci0JCXByb3AgPSBleHQtPnByb3BlcnRpZXNbal07CisJCXByb3AgPSBleHQtPmRlc2MtPnByb3BlcnRpZXNbal07CiAKLQkJLyogSW5pdGlhbGl6ZSBjaGFyZ2VycyBpZiBub3QgYWxyZWFkeSBkb25lICovCisJCS8qCisJCSAqIEluaXRpYWxpemUgY2hhcmdlcnMgaWYgbm90IGFscmVhZHkgZG9uZS4KKwkJICogVGhlIGFiODUwMF9jaGFyZ2VyKi8KIAkJaWYgKCFkaS0+YWNfY2hnICYmCi0JCQlleHQtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMpCisJCQlleHQtPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMpCiAJCQlkaS0+YWNfY2hnID0gcHN5X3RvX3V4NTAwX2NoYXJnZXIoZXh0KTsKIAkJZWxzZSBpZiAoIWRpLT51c2JfY2hnICYmCi0JCQlleHQtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCKQorCQkJZXh0LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX1VTQikKIAkJCWRpLT51c2JfY2hnID0gcHN5X3RvX3V4NTAwX2NoYXJnZXIoZXh0KTsKIAotCQlpZiAoZXh0LT5nZXRfcHJvcGVydHkoZXh0LCBwcm9wLCAmcmV0KSkKKwkJaWYgKHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkoZXh0LCBwcm9wLCAmcmV0KSkKIAkJCWNvbnRpbnVlOwogCQlzd2l0Y2ggKHByb3ApIHsKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgotCQkJc3dpdGNoIChleHQtPnR5cGUpIHsKKwkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7CiAJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6CiAJCQkJLyogQmF0dGVyeSBwcmVzZW50ICovCiAJCQkJaWYgKHJldC5pbnR2YWwpCkBAIC0xMDcwLDcgKzEwNjksNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6Ci0JCQlzd2l0Y2ggKGV4dC0+dHlwZSkgeworCQkJc3dpdGNoIChleHQtPmRlc2MtPnR5cGUpIHsKIAkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWToKIAkJCQlicmVhazsKIAkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM6CkBAIC0xMTE1LDcgKzExMTQsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6Ci0JCQlzd2l0Y2ggKGV4dC0+dHlwZSkgeworCQkJc3dpdGNoIChleHQtPmRlc2MtPnR5cGUpIHsKIAkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWToKIAkJCQlicmVhazsKIAkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM6CkBAIC0xMTk4LDcgKzExOTcsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJCXN3aXRjaCAoZXh0LT50eXBlKSB7CisJCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgewogCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgogCQkJCWRpLT5iYXR0X2RhdGEudm9sdCA9IHJldC5pbnR2YWwgLyAxMDAwOwogCQkJCWJyZWFrOwpAQCAtMTIxNCw3ICsxMjEzLDcgQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9BVkc6Ci0JCQlzd2l0Y2ggKGV4dC0+dHlwZSkgeworCQkJc3dpdGNoIChleHQtPmRlc2MtPnR5cGUpIHsKIAkJCWNhc2UgUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM6CiAJCQkJLyogQVZHIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hlbiB3ZSBhcmUKIAkJCQkgKiBpbiBDViBtb2RlICovCkBAIC0xMjM5LDcgKzEyMzgsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgotCQkJc3dpdGNoIChleHQtPnR5cGUpIHsKKwkJCXN3aXRjaCAoZXh0LT5kZXNjLT50eXBlKSB7CiAJCQljYXNlIFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk6CiAJCQkJaWYgKHJldC5pbnR2YWwpCiAJCQkJCWRpLT5ldmVudHMuYmF0dF91bmtub3duID0gZmFsc2U7CkBAIC0xMjU3LDcgKzEyNTYsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKLQkJCXN3aXRjaCAoZXh0LT50eXBlKSB7CisJCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgewogCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzoKIAkJCQkJZGktPmNoZ19pbmZvLmFjX2N1cnIgPQogCQkJCQkJcmV0LmludHZhbCAvIDEwMDA7CkBAIC0xMjc1LDcgKzEyNzQsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKLQkJCXN3aXRjaCAoZXh0LT50eXBlKSB7CisJCQlzd2l0Y2ggKGV4dC0+ZGVzYy0+dHlwZSkgewogCQkJY2FzZSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOgogCQkJCWRpLT5iYXR0X2RhdGEuYXZnX2N1cnIgPSByZXQuaW50dmFsIC8gMTAwMDsKIAkJCQlicmVhazsKQEAgLTEzMTEsNyArMTMxMCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGFieDUwMF9jaGFyZ2FsZ19leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKIHsKLQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaSA9IHRvX2FieDUwMF9jaGFyZ2FsZ19kZXZpY2VfaW5mbyhwc3kpOworCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAkvKgogCSAqIFRyaWdnZXIgZXhlY3V0aW9uIG9mIHRoZSBhbGdvcml0aG0gaW5zdGFudGx5IGFuZCByZWFkCkBAIC0xMzM2LDcgKzEzMzUsNyBAQAogCiAJLyogQ29sbGVjdCBkYXRhIGZyb20gYWxsIHBvd2VyX3N1cHBseSBjbGFzcyBkZXZpY2VzICovCiAJY2xhc3NfZm9yX2VhY2hfZGV2aWNlKHBvd2VyX3N1cHBseV9jbGFzcywgTlVMTCwKLQkJJmRpLT5jaGFyZ2FsZ19wc3ksIGFieDUwMF9jaGFyZ2FsZ19nZXRfZXh0X3BzeV9kYXRhKTsKKwkJZGktPmNoYXJnYWxnX3BzeSwgYWJ4NTAwX2NoYXJnYWxnX2dldF9leHRfcHN5X2RhdGEpOwogCiAJYWJ4NTAwX2NoYXJnYWxnX2VuZF9vZl9jaGFyZ2UoZGkpOwogCWFieDUwMF9jaGFyZ2FsZ19jaGVja190ZW1wKGRpKTsKQEAgLTE0NzgsNyArMTQ3Nyw3IEBACiAJCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CiAJCWRpLT5tYWludGVuYW5jZV9jaGcgPSBmYWxzZTsKIAkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9TVVNQRU5ERUQpOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmZGktPmNoYXJnYWxnX3BzeSk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5jaGFyZ2FsZ19wc3kpOwogCQkvKiBJbnRlbnRpb25hbCBmYWxsdGhyb3VnaCAqLwogCiAJY2FzZSBTVEFURV9TVVNQRU5ERUQ6CkBAIC0xNTc2LDcgKzE1NzUsNyBAQAogCQlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CiAJCWRpLT5lb2NfY250ID0gMDsKIAkJZGktPm1haW50ZW5hbmNlX2NoZyA9IGZhbHNlOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmZGktPmNoYXJnYWxnX3BzeSk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5jaGFyZ2FsZ19wc3kpOwogCiAJCWJyZWFrOwogCkBAIC0xNjI0LDcgKzE2MjMsNyBAQAogCQkJZGktPmJtLT5iYXRfdHlwZVsKIAkJCQlkaS0+Ym0tPmJhdHRfaWRdLm1haW50X2FfY3VyX2x2bCk7CiAJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfTUFJTlRFTkFOQ0VfQSk7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZkaS0+Y2hhcmdhbGdfcHN5KTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmNoYXJnYWxnX3BzeSk7CiAJCS8qIEludGVudGlvbmFsIGZhbGx0aHJvdWdoKi8KIAogCWNhc2UgU1RBVEVfTUFJTlRFTkFOQ0VfQToKQEAgLTE2NDQsNyArMTY0Myw3IEBACiAJCQlkaS0+Ym0tPmJhdF90eXBlWwogCQkJCWRpLT5ibS0+YmF0dF9pZF0ubWFpbnRfYl9jdXJfbHZsKTsKIAkJYWJ4NTAwX2NoYXJnYWxnX3N0YXRlX3RvKGRpLCBTVEFURV9NQUlOVEVOQU5DRV9CKTsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmRpLT5jaGFyZ2FsZ19wc3kpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+Y2hhcmdhbGdfcHN5KTsKIAkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2gqLwogCiAJY2FzZSBTVEFURV9NQUlOVEVOQU5DRV9COgpAQCAtMTY2Myw3ICsxNjYyLDcgQEAKIAkJYWJ4NTAwX2NoYXJnYWxnX3N0b3BfbWFpbnRlbmFuY2VfdGltZXIoZGkpOwogCQlkaS0+Y2hhcmdlX3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CiAJCWFieDUwMF9jaGFyZ2FsZ19zdGF0ZV90byhkaSwgU1RBVEVfVEVNUF9MT1dISUdIKTsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmRpLT5jaGFyZ2FsZ19wc3kpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkaS0+Y2hhcmdhbGdfcHN5KTsKIAkJLyogSW50ZW50aW9uYWwgZmFsbHRocm91Z2ggKi8KIAogCWNhc2UgU1RBVEVfVEVNUF9MT1dISUdIOgpAQCAtMTc3OSw5ICsxNzc4LDcgQEAKIAllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgYWJ4NTAwX2NoYXJnYWxnICpkaTsKLQotCWRpID0gdG9fYWJ4NTAwX2NoYXJnYWxnX2RldmljZV9pbmZvKHBzeSk7CisJc3RydWN0IGFieDUwMF9jaGFyZ2FsZyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAogCXN3aXRjaCAocHNwKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CkBAIC0yMDM0LDcgKzIwMzEsNyBAQAogCS8qIERlbGV0ZSB0aGUgd29yayBxdWV1ZSAqLwogCWRlc3Ryb3lfd29ya3F1ZXVlKGRpLT5jaGFyZ2FsZ193cSk7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmZGktPmNoYXJnYWxnX3BzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmNoYXJnYWxnX3BzeSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwNDMsMTAgKzIwNDAsMjAgQEAKIAkiYWI4NTAwX2ZnIiwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYWJ4NTAwX2NoYXJnYWxnX2Rlc2MgPSB7CisJLm5hbWUJCQk9ICJhYng1MDBfY2hhcmdhbGciLAorCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5wcm9wZXJ0aWVzCQk9IGFieDUwMF9jaGFyZ2FsZ19wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJCT0gQVJSQVlfU0laRShhYng1MDBfY2hhcmdhbGdfcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJCT0gYWJ4NTAwX2NoYXJnYWxnX2dldF9wcm9wZXJ0eSwKKwkuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZAk9IGFieDUwMF9jaGFyZ2FsZ19leHRlcm5hbF9wb3dlcl9jaGFuZ2VkLAorfTsKKwogc3RhdGljIGludCBhYng1MDBfY2hhcmdhbGdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CiAJc3RydWN0IGFieDUwMF9ibV9kYXRhICpwbGF0ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCXN0cnVjdCBhYng1MDBfY2hhcmdhbGcgKmRpOwogCWludCByZXQgPSAwOwogCkBAIC0yMDc0LDE2ICsyMDgxLDkgQEAKIAlkaS0+ZGV2ID0gJnBkZXYtPmRldjsKIAlkaS0+cGFyZW50ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCi0JLyogY2hhcmdhbGcgc3VwcGx5ICovCi0JZGktPmNoYXJnYWxnX3BzeS5uYW1lID0gImFieDUwMF9jaGFyZ2FsZyI7Ci0JZGktPmNoYXJnYWxnX3BzeS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQlkaS0+Y2hhcmdhbGdfcHN5LnByb3BlcnRpZXMgPSBhYng1MDBfY2hhcmdhbGdfcHJvcHM7Ci0JZGktPmNoYXJnYWxnX3BzeS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoYWJ4NTAwX2NoYXJnYWxnX3Byb3BzKTsKLQlkaS0+Y2hhcmdhbGdfcHN5LmdldF9wcm9wZXJ0eSA9IGFieDUwMF9jaGFyZ2FsZ19nZXRfcHJvcGVydHk7Ci0JZGktPmNoYXJnYWxnX3BzeS5zdXBwbGllZF90byA9IHN1cHBseV9pbnRlcmZhY2U7Ci0JZGktPmNoYXJnYWxnX3BzeS5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKHN1cHBseV9pbnRlcmZhY2UpLAotCWRpLT5jaGFyZ2FsZ19wc3kuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9Ci0JCWFieDUwMF9jaGFyZ2FsZ19leHRlcm5hbF9wb3dlcl9jaGFuZ2VkOworCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBzdXBwbHlfaW50ZXJmYWNlOworCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShzdXBwbHlfaW50ZXJmYWNlKTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gZGk7CiAKIAkvKiBJbml0aWxpYWxpemUgc2FmZXR5IHRpbWVyICovCiAJaHJ0aW1lcl9pbml0KCZkaS0+c2FmZXR5X3RpbWVyLCBDTE9DS19SRUFMVElNRSwgSFJUSU1FUl9NT0RFX0FCUyk7CkBAIC0yMTE1LDkgKzIxMTUsMTEgQEAKIAlkaS0+Y2hnX2luZm8ucHJldl9jb25uX2NoZyA9IC0xOwogCiAJLyogUmVnaXN0ZXIgY2hhcmdhbGcgcG93ZXIgc3VwcGx5IGNsYXNzICovCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRpLT5kZXYsICZkaS0+Y2hhcmdhbGdfcHN5KTsKLQlpZiAocmV0KSB7CisJZGktPmNoYXJnYWxnX3BzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkaS0+ZGV2LCAmYWJ4NTAwX2NoYXJnYWxnX2Rlc2MsCisJCQkJCQkgJnBzeV9jZmcpOworCWlmIChJU19FUlIoZGktPmNoYXJnYWxnX3BzeSkpIHsKIAkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGNoYXJnYWxnIHBzeVxuIik7CisJCXJldCA9IFBUUl9FUlIoZGktPmNoYXJnYWxnX3BzeSk7CiAJCWdvdG8gZnJlZV9jaGFyZ2FsZ193cTsKIAl9CiAKQEAgLTIxMzgsNyArMjE0MCw3IEBACiAJcmV0dXJuIHJldDsKIAogZnJlZV9wc3k6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRpLT5jaGFyZ2FsZ19wc3kpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5jaGFyZ2FsZ19wc3kpOwogZnJlZV9jaGFyZ2FsZ193cToKIAlkZXN0cm95X3dvcmtxdWV1ZShkaS0+Y2hhcmdhbGdfd3EpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2FwbV9wb3dlci5jIGIvZHJpdmVycy9wb3dlci9hcG1fcG93ZXIuYwppbmRleCAzOTc2MzAxLi45ZDFhN2ZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2FwbV9wb3dlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvYXBtX3Bvd2VyLmMKQEAgLTE1LDEwICsxNSwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L2FwbS1lbXVsYXRpb24uaD4KIAogCi0jZGVmaW5lIFBTWV9QUk9QKHBzeSwgcHJvcCwgdmFsKSAocHN5LT5nZXRfcHJvcGVydHkocHN5LCBcCisjZGVmaW5lIFBTWV9QUk9QKHBzeSwgcHJvcCwgdmFsKSAocG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShwc3ksIFwKIAkJCSBQT1dFUl9TVVBQTFlfUFJPUF8jI3Byb3AsIHZhbCkpCiAKLSNkZWZpbmUgX01QU1lfUFJPUChwcm9wLCB2YWwpIChtYWluX2JhdHRlcnktPmdldF9wcm9wZXJ0eShtYWluX2JhdHRlcnksIFwKKyNkZWZpbmUgX01QU1lfUFJPUChwcm9wLCB2YWwpIChwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KG1haW5fYmF0dGVyeSwgXAogCQkJCQkJCSBwcm9wLCB2YWwpKQogCiAjZGVmaW5lIE1QU1lfUFJPUChwcm9wLCB2YWwpIF9NUFNZX1BST1AoUE9XRVJfU1VQUExZX1BST1BfIyNwcm9wLCB2YWwpCkBAIC00OCw3ICs0OCw3IEBACiAKIAlicC0+YmF0ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKLQlpZiAoYnAtPmJhdC0+dXNlX2Zvcl9hcG0pIHsKKwlpZiAoYnAtPmJhdC0+ZGVzYy0+dXNlX2Zvcl9hcG0pIHsKIAkJLyogbmljZSwgd2UgZXhwbGljaXRseSBhc2tlZCB0byByZXBvcnQgdGhpcyBiYXR0ZXJ5LiAqLwogCQlicC0+bWFpbiA9IGJwLT5iYXQ7CiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9heHAyODhfZnVlbF9nYXVnZS5jIGIvZHJpdmVycy9wb3dlci9heHAyODhfZnVlbF9nYXVnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMWNjNWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL2F4cDI4OF9mdWVsX2dhdWdlLmMKQEAgLTAsMCArMSwxMTU0IEBACisvKgorICogYXhwMjg4X2Z1ZWxfZ2F1Z2UuYyAtIFhwb3dlciBBWFAyODggUE1JQyBGdWVsIEdhdWdlIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLglTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9heHAyMHguaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKworI2RlZmluZSBDSFJHX1NUQVRfQkFUX1NBRkVfTU9ERQkJKDEgPDwgMykKKyNkZWZpbmUgQ0hSR19TVEFUX0JBVF9WQUxJRAkJCSgxIDw8IDQpCisjZGVmaW5lIENIUkdfU1RBVF9CQVRfUFJFU0VOVAkJKDEgPDwgNSkKKyNkZWZpbmUgQ0hSR19TVEFUX0NIQVJHSU5HCQkJKDEgPDwgNikKKyNkZWZpbmUgQ0hSR19TVEFUX1BNSUNfT1RQCQkJKDEgPDwgNykKKworI2RlZmluZSBDSFJHX0NDQ1ZfQ0NfTUFTSwkJCTB4ZiAgICAgLyogNCBiaXRzICovCisjZGVmaW5lIENIUkdfQ0NDVl9DQ19CSVRfUE9TCQkwCisjZGVmaW5lIENIUkdfQ0NDVl9DQ19PRkZTRVQJCQkyMDAgICAgIC8qIDIwMG1BICovCisjZGVmaW5lIENIUkdfQ0NDVl9DQ19MU0JfUkVTCQkyMDAgICAgIC8qIDIwMG1BICovCisjZGVmaW5lIENIUkdfQ0NDVl9JVEVSTV8yMFAJCQkoMSA8PCA0KSAgICAvKiAyMCUgb2YgQ0MgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWX01BU0sJCQkweDYwICAgICAgICAvKiAyIGJpdHMgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWX0JJVF9QT1MJCTUKKyNkZWZpbmUgQ0hSR19DQ0NWX0NWXzQxMDBNVgkJCTB4MCAgICAgLyogNC4xMFYgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWXzQxNTBNVgkJCTB4MSAgICAgLyogNC4xNVYgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWXzQyMDBNVgkJCTB4MiAgICAgLyogNC4yMFYgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NWXzQzNTBNVgkJCTB4MyAgICAgLyogNC4zNVYgKi8KKyNkZWZpbmUgQ0hSR19DQ0NWX0NIR19FTgkJCSgxIDw8IDcpCisKKyNkZWZpbmUgQ1ZfNDEwMAkJCQkJCTQxMDAgICAgLyogNDEwMG1WICovCisjZGVmaW5lIENWXzQxNTAJCQkJCQk0MTUwICAgIC8qIDQxNTBtViAqLworI2RlZmluZSBDVl80MjAwCQkJCQkJNDIwMCAgICAvKiA0MjAwbVYgKi8KKyNkZWZpbmUgQ1ZfNDM1MAkJCQkJCTQzNTAgICAgLyogNDM1MG1WICovCisKKyNkZWZpbmUgVEVNUF9JUlFfQ0ZHX1FXQlRVCQkJKDEgPDwgMCkKKyNkZWZpbmUgVEVNUF9JUlFfQ0ZHX1dCVFUJCQkoMSA8PCAxKQorI2RlZmluZSBURU1QX0lSUV9DRkdfUVdCVE8JCQkoMSA8PCAyKQorI2RlZmluZSBURU1QX0lSUV9DRkdfV0JUTwkJCSgxIDw8IDMpCisjZGVmaW5lIFRFTVBfSVJRX0NGR19NQVNLCQkJMHhmCisKKyNkZWZpbmUgRkdfSVJRX0NGR19MT1dCQVRUX1dMMgkJKDEgPDwgMCkKKyNkZWZpbmUgRkdfSVJRX0NGR19MT1dCQVRUX1dMMQkJKDEgPDwgMSkKKyNkZWZpbmUgRkdfSVJRX0NGR19MT1dCQVRUX01BU0sJCTB4MworI2RlZmluZSBMT1dCQVRfSVJRX1NUQVRfTE9XQkFUVF9XTDIJKDEgPDwgMCkKKyNkZWZpbmUgTE9XQkFUX0lSUV9TVEFUX0xPV0JBVFRfV0wxCSgxIDw8IDEpCisKKyNkZWZpbmUgRkdfQ05UTF9PQ1ZfQURKX1NUQVQJCSgxIDw8IDIpCisjZGVmaW5lIEZHX0NOVExfT0NWX0FESl9FTgkJCSgxIDw8IDMpCisjZGVmaW5lIEZHX0NOVExfQ0FQX0FESl9TVEFUCQkoMSA8PCA0KQorI2RlZmluZSBGR19DTlRMX0NBUF9BREpfRU4JCQkoMSA8PCA1KQorI2RlZmluZSBGR19DTlRMX0NDX0VOCQkJCSgxIDw8IDYpCisjZGVmaW5lIEZHX0NOVExfR0FVR0VfRU4JCQkoMSA8PCA3KQorCisjZGVmaW5lIEZHX1JFUF9DQVBfVkFMSUQJCQkoMSA8PCA3KQorI2RlZmluZSBGR19SRVBfQ0FQX1ZBTF9NQVNLCQkJMHg3RgorCisjZGVmaW5lIEZHX0RFU19DQVAxX1ZBTElECQkJKDEgPDwgNykKKyNkZWZpbmUgRkdfREVTX0NBUDFfVkFMX01BU0sJCTB4N0YKKyNkZWZpbmUgRkdfREVTX0NBUDBfVkFMX01BU0sJCTB4RkYKKyNkZWZpbmUgRkdfREVTX0NBUF9SRVNfTFNCCQkJMTQ1NiAgICAvKiAxLjQ1Nm1BaHIgKi8KKworI2RlZmluZSBGR19DQ19NVFIxX1ZBTElECQkJKDEgPDwgNykKKyNkZWZpbmUgRkdfQ0NfTVRSMV9WQUxfTUFTSwkJCTB4N0YKKyNkZWZpbmUgRkdfQ0NfTVRSMF9WQUxfTUFTSwkJCTB4RkYKKyNkZWZpbmUgRkdfREVTX0NDX1JFU19MU0IJCQkxNDU2ICAgIC8qIDEuNDU2bUFociAqLworCisjZGVmaW5lIEZHX09DVl9DQVBfVkFMSUQJCQkoMSA8PCA3KQorI2RlZmluZSBGR19PQ1ZfQ0FQX1ZBTF9NQVNLCQkJMHg3RgorI2RlZmluZSBGR19DQ19DQVBfVkFMSUQJCQkJKDEgPDwgNykKKyNkZWZpbmUgRkdfQ0NfQ0FQX1ZBTF9NQVNLCQkJMHg3RgorCisjZGVmaW5lIEZHX0xPV19DQVBfVEhSMV9NQVNLCQkweGYwICAgIC8qIDUlIHRwIDIwJSAqLworI2RlZmluZSBGR19MT1dfQ0FQX1RIUjFfVkFMCQkJMHhhMCAgICAvKiAxNSBwZXJjICovCisjZGVmaW5lIEZHX0xPV19DQVBfVEhSMl9NQVNLCQkweDBmICAgIC8qIDAlIHRvIDE1JSAqLworI2RlZmluZSBGR19MT1dfQ0FQX1dBUk5fVEhSCQkJMTQgIC8qIDE0IHBlcmMgKi8KKyNkZWZpbmUgRkdfTE9XX0NBUF9DUklUX1RIUgkJCTQgICAvKiA0IHBlcmMgKi8KKyNkZWZpbmUgRkdfTE9XX0NBUF9TSEROX1RIUgkJCTAgICAvKiAwIHBlcmMgKi8KKworI2RlZmluZSBTVEFUVVNfTU9OX0RFTEFZX0pJRkZJRVMgICAgKEhaICogNjApICAgLyo2MCBzZWMgKi8KKyNkZWZpbmUgTlJfUkVUUllfQ05UICAgIDMKKyNkZWZpbmUgREVWX05BTUUJImF4cDI4OF9mdWVsX2dhdWdlIgorCisvKiAxLjFtViBwZXIgTFNCIGV4cHJlc3NlZCBpbiB1ViAqLworI2RlZmluZSBWT0xUQUdFX0ZST01fQURDKGEpCQkJKChhICogMTEpIC8gMTApCisvKiBwcm9wZXJ0aWVzIGNvbnZlcnRlZCB0byB0ZW50aHMgb2YgZGVncmVlcywgdVYsIHVBLCB1VyAqLworI2RlZmluZSBQUk9QX1RFTVAoYSkJCSgoYSkgKiAxMCkKKyNkZWZpbmUgVU5QUk9QX1RFTVAoYSkJCSgoYSkgLyAxMCkKKyNkZWZpbmUgUFJPUF9WT0xUKGEpCQkoKGEpICogMTAwMCkKKyNkZWZpbmUgUFJPUF9DVVJSKGEpCQkoKGEpICogMTAwMCkKKworI2RlZmluZSBBWFAyODhfRkdfSU5UUl9OVU0JNgorZW51bSB7CisJUVdCVFVfSVJRID0gMCwKKwlXQlRVX0lSUSwKKwlRV0JUT19JUlEsCisJV0JUT19JUlEsCisJV0wyX0lSUSwKKwlXTDFfSVJRLAorfTsKKworc3RydWN0IGF4cDI4OF9mZ19pbmZvIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBheHAyMHhfZmdfcGRhdGEgKnBkYXRhOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwX2RhdGEgKnJlZ21hcF9pcnFjOworCWludCBpcnFbQVhQMjg4X0ZHX0lOVFJfTlVNXTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXQ7CisJc3RydWN0IG11dGV4IGxvY2s7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHN0YXR1c19tb25pdG9yOworCXN0cnVjdCBkZW50cnkgKmRlYnVnX2ZpbGU7Cit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgZnVlbF9nYXVnZV9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0FMRVJUX01JTiwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUFYLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUlOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUlOLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRSwKK307CisKK3N0YXRpYyBpbnQgZnVlbF9nYXVnZV9yZWdfcmVhZGIoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvLCBpbnQgcmVnKQoreworCWludCByZXQsIGk7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWZvciAoaSA9IDA7IGkgPCBOUl9SRVRSWV9DTlQ7IGkrKykgeworCQlyZXQgPSByZWdtYXBfcmVhZChpbmZvLT5yZWdtYXAsIHJlZywgJnZhbCk7CisJCWlmIChyZXQgPT0gLUVCVVNZKQorCQkJY29udGludWU7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJheHAyODggcmVnIHJlYWQgZXJyOiVkXG4iLCByZXQpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3JlZ193cml0ZWIoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvLCBpbnQgcmVnLCB1OCB2YWwpCit7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF93cml0ZShpbmZvLT5yZWdtYXAsIHJlZywgKHVuc2lnbmVkIGludCl2YWwpOworCisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgImF4cDI4OCByZWcgd3JpdGUgZXJyOiVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwbWljX3JlYWRfYWRjX3ZhbChjb25zdCBjaGFyICpuYW1lLCBpbnQgKnJhd192YWwsCisJCXN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0LCB2YWwgPSAwOworCXN0cnVjdCBpaW9fY2hhbm5lbCAqaW5kaW9fY2hhbjsKKworCWluZGlvX2NoYW4gPSBpaW9fY2hhbm5lbF9nZXQoTlVMTCwgbmFtZSk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGluZGlvX2NoYW4pKSB7CisJCXJldCA9IFBUUl9FUlIoaW5kaW9fY2hhbik7CisJCWdvdG8gZXhpdDsKKwl9CisJcmV0ID0gaWlvX3JlYWRfY2hhbm5lbF9yYXcoaW5kaW9fY2hhbiwgJnZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAorCQkJIklJTyBjaGFubmVsIHJlYWQgZXJyb3I6ICV4LCAleFxuIiwgcmV0LCB2YWwpOworCQlnb3RvIGVycl9leGl0OworCX0KKworCWRldl9kYmcoJmluZm8tPnBkZXYtPmRldiwgImFkYyByYXcgdmFsPSV4XG4iLCB2YWwpOworCSpyYXdfdmFsID0gdmFsOworCitlcnJfZXhpdDoKKwlpaW9fY2hhbm5lbF9yZWxlYXNlKGluZGlvX2NoYW4pOworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCitzdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfZGVidWdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvID0gcy0+cHJpdmF0ZTsKKwlpbnQgcmF3X3ZhbCwgcmV0OworCisJc2VxX3ByaW50ZihzLCAiIFBXUl9TVEFUVVNbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyMFhfUFdSX0lOUFVUX1NUQVRVUywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX1BXUl9JTlBVVF9TVEFUVVMpKTsKKwlzZXFfcHJpbnRmKHMsICJQV1JfT1BfTU9ERVslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDIwWF9QV1JfT1BfTU9ERSwKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX1BXUl9PUF9NT0RFKSk7CisJc2VxX3ByaW50ZihzLCAiIENIUkdfQ1RSTDFbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyMFhfQ0hSR19DVFJMMSwKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0NIUkdfQ1RSTDEpKTsKKwlzZXFfcHJpbnRmKHMsICIgICAgICAgVkxURlslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDIwWF9WX0xURl9ESVNDSFJHLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfVl9MVEZfRElTQ0hSRykpOworCXNlcV9wcmludGYocywgIiAgICAgICBWSFRGWyUwMnhdIDogJTAyeFxuIiwKKwkJQVhQMjBYX1ZfSFRGX0RJU0NIUkcsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9WX0hURl9ESVNDSFJHKSk7CisJc2VxX3ByaW50ZihzLCAiICAgIENDX0NUUkxbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyMFhfQ0NfQ1RSTCwKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0NDX0NUUkwpKTsKKwlzZXFfcHJpbnRmKHMsICJCQVRURVJZIENBUFslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDIwWF9GR19SRVMsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9GR19SRVMpKTsKKwlzZXFfcHJpbnRmKHMsICIgICAgRkdfUkRDMVslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19SREMxX1JFRywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX1JEQzFfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiICAgIEZHX1JEQzBbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfUkRDMF9SRUcsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19SREMwX1JFRykpOworCXNlcV9wcmludGYocywgIiAgICBGR19PQ1ZIWyUwMnhdIDogJTAyeFxuIiwKKwkJQVhQMjg4X0ZHX09DVkhfUkVHLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfT0NWSF9SRUcpKTsKKwlzZXFfcHJpbnRmKHMsICIgICAgRkdfT0NWTFslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19PQ1ZMX1JFRywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX09DVkxfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiRkdfREVTX0NBUDFbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfREVTX0NBUDFfUkVHLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfREVTX0NBUDFfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiRkdfREVTX0NBUDBbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfREVTX0NBUDBfUkVHLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfREVTX0NBUDBfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiIEZHX0NDX01UUjFbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfQ0NfTVRSMV9SRUcsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19DQ19NVFIxX1JFRykpOworCXNlcV9wcmludGYocywgIiBGR19DQ19NVFIwWyUwMnhdIDogJTAyeFxuIiwKKwkJQVhQMjg4X0ZHX0NDX01UUjBfUkVHLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfQ0NfTVRSMF9SRUcpKTsKKwlzZXFfcHJpbnRmKHMsICIgRkdfT0NWX0NBUFslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19PQ1ZfQ0FQX1JFRywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX09DVl9DQVBfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiICBGR19DQ19DQVBbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfQ0NfQ0FQX1JFRywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0NDX0NBUF9SRUcpKTsKKwlzZXFfcHJpbnRmKHMsICIgRkdfTE9XX0NBUFslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19MT1dfQ0FQX1JFRywKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0xPV19DQVBfUkVHKSk7CisJc2VxX3ByaW50ZihzLCAiVFVOSU5HX0NUTDBbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfVFVORTAsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19UVU5FMCkpOworCXNlcV9wcmludGYocywgIlRVTklOR19DVEwxWyUwMnhdIDogJTAyeFxuIiwKKwkJQVhQMjg4X0ZHX1RVTkUxLAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfVFVORTEpKTsKKwlzZXFfcHJpbnRmKHMsICJUVU5JTkdfQ1RMMlslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19UVU5FMiwKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX1RVTkUyKSk7CisJc2VxX3ByaW50ZihzLCAiVFVOSU5HX0NUTDNbJTAyeF0gOiAlMDJ4XG4iLAorCQlBWFAyODhfRkdfVFVORTMsCisJCWZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19UVU5FMykpOworCXNlcV9wcmludGYocywgIlRVTklOR19DVEw0WyUwMnhdIDogJTAyeFxuIiwKKwkJQVhQMjg4X0ZHX1RVTkU0LAorCQlmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfVFVORTQpKTsKKwlzZXFfcHJpbnRmKHMsICJUVU5JTkdfQ1RMNVslMDJ4XSA6ICUwMnhcbiIsCisJCUFYUDI4OF9GR19UVU5FNSwKKwkJZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX1RVTkU1KSk7CisKKwlyZXQgPSBwbWljX3JlYWRfYWRjX3ZhbCgiYXhwMjg4LWJhdHQtdGVtcCIsICZyYXdfdmFsLCBpbmZvKTsKKwlpZiAocmV0ID49IDApCisJCXNlcV9wcmludGYocywgImF4cDI4OC1iYXR0dGVtcCA6ICVkXG4iLCByYXdfdmFsKTsKKwlyZXQgPSBwbWljX3JlYWRfYWRjX3ZhbCgiYXhwMjg4LXBtaWMtdGVtcCIsICZyYXdfdmFsLCBpbmZvKTsKKwlpZiAocmV0ID49IDApCisJCXNlcV9wcmludGYocywgImF4cDI4OC1wbWljdGVtcCA6ICVkXG4iLCByYXdfdmFsKTsKKwlyZXQgPSBwbWljX3JlYWRfYWRjX3ZhbCgiYXhwMjg4LXN5c3RlbS10ZW1wIiwgJnJhd192YWwsIGluZm8pOworCWlmIChyZXQgPj0gMCkKKwkJc2VxX3ByaW50ZihzLCAiYXhwMjg4LXN5c3R0ZW1wIDogJWRcbiIsIHJhd192YWwpOworCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtY2hyZy1jdXJyIiwgJnJhd192YWwsIGluZm8pOworCWlmIChyZXQgPj0gMCkKKwkJc2VxX3ByaW50ZihzLCAiYXhwMjg4LWNocmdjdXJyIDogJWRcbiIsIHJhd192YWwpOworCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtY2hyZy1kLWN1cnIiLCAmcmF3X3ZhbCwgaW5mbyk7CisJaWYgKHJldCA+PSAwKQorCQlzZXFfcHJpbnRmKHMsICJheHAyODgtZGNocmdjdXIgOiAlZFxuIiwgcmF3X3ZhbCk7CisJcmV0ID0gcG1pY19yZWFkX2FkY192YWwoImF4cDI4OC1iYXR0LXZvbHQiLCAmcmF3X3ZhbCwgaW5mbyk7CisJaWYgKHJldCA+PSAwKQorCQlzZXFfcHJpbnRmKHMsICJheHAyODgtYmF0dHZvbHQgOiAlZFxuIiwgcmF3X3ZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWJ1Z19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBmdWVsX2dhdWdlX2RlYnVnX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmZ19kZWJ1Z19mb3BzID0geworCS5vcGVuICAgICAgID0gZGVidWdfb3BlbiwKKwkucmVhZCAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlICAgID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgdm9pZCBmdWVsX2dhdWdlX2NyZWF0ZV9kZWJ1Z2ZzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbmZvLT5kZWJ1Z19maWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZnVlbGdhdWdlIiwgMDY2NiwgTlVMTCwKKwkJaW5mbywgJmZnX2RlYnVnX2ZvcHMpOworfQorCitzdGF0aWMgdm9pZCBmdWVsX2dhdWdlX3JlbW92ZV9kZWJ1Z2ZzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlkZWJ1Z2ZzX3JlbW92ZShpbmZvLT5kZWJ1Z19maWxlKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZnVlbF9nYXVnZV9jcmVhdGVfZGVidWdmcyhzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZnVlbF9nYXVnZV9yZW1vdmVfZGVidWdmcyhzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgZnVlbF9nYXVnZV9nZXRfc3RhdHVzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcHdyX3N0YXQsIHJldDsKKwlpbnQgY2hhcmdlLCBkaXNjaGFyZ2U7CisKKwlwd3Jfc3RhdCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9QV1JfSU5QVVRfU1RBVFVTKTsKKwlpZiAocHdyX3N0YXQgPCAwKSB7CisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwKKwkJCSJQV1IgU1RBVCByZWFkIGZhaWxlZDolZFxuIiwgcHdyX3N0YXQpOworCQlyZXR1cm47CisJfQorCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtY2hyZy1jdXJyIiwgJmNoYXJnZSwgaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAorCQkJIkFEQyBjaGFyZ2UgY3VycmVudCByZWFkIGZhaWxlZDolZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKwlyZXQgPSBwbWljX3JlYWRfYWRjX3ZhbCgiYXhwMjg4LWNocmctZC1jdXJyIiwgJmRpc2NoYXJnZSwgaW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAorCQkJIkFEQyBkaXNjaGFyZ2UgY3VycmVudCByZWFkIGZhaWxlZDolZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjaGFyZ2UgPiAwKQorCQlpbmZvLT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCWVsc2UgaWYgKGRpc2NoYXJnZSA+IDApCisJCWluZm8tPnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisJZWxzZSB7CisJCWlmIChwd3Jfc3RhdCAmIENIUkdfU1RBVF9CQVRfUFJFU0VOVCkKKwkJCWluZm8tPnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKKwkJZWxzZQorCQkJaW5mby0+c3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CisJfQorfQorCitzdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfZ2V0X3ZiYXR0KHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbywgaW50ICp2YmF0dCkKK3sKKwlpbnQgcmV0ID0gMCwgcmF3X3ZhbDsKKworCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtYmF0dC12b2x0IiwgJnJhd192YWwsIGluZm8pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHZiYXR0X3JlYWRfZmFpbDsKKworCSp2YmF0dCA9IFZPTFRBR0VfRlJPTV9BREMocmF3X3ZhbCk7Cit2YmF0dF9yZWFkX2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX2dldF9jdXJyZW50KHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbywgaW50ICpjdXIpCit7CisJaW50IHJldCwgdmFsdWUgPSAwOworCWludCBjaGFyZ2UsIGRpc2NoYXJnZTsKKworCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtY2hyZy1jdXJyIiwgJmNoYXJnZSwgaW5mbyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gY3VycmVudF9yZWFkX2ZhaWw7CisJcmV0ID0gcG1pY19yZWFkX2FkY192YWwoImF4cDI4OC1jaHJnLWQtY3VyciIsICZkaXNjaGFyZ2UsIGluZm8pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGN1cnJlbnRfcmVhZF9mYWlsOworCisJaWYgKGNoYXJnZSA+IDApCisJCXZhbHVlID0gY2hhcmdlOworCWVsc2UgaWYgKGRpc2NoYXJnZSA+IDApCisJCXZhbHVlID0gLTEgKiBkaXNjaGFyZ2U7CisKKwkqY3VyID0gdmFsdWU7CitjdXJyZW50X3JlYWRfZmFpbDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRlbXBfdG9fYWRjKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbywgaW50IHR2YWwpCit7CisJaW50IHJudGMgPSAwLCBpLCByZXQsIGFkY192YWw7CisJaW50IHJtaW4sIHJtYXgsIHRtaW4sIHRtYXg7CisJaW50IHRjc3ogPSBpbmZvLT5wZGF0YS0+dGNzejsKKworCS8qIGdldCB0aGUgUm50YyByZXNpdGFuY2UgdmFsdWUgZm9yIHRoaXMgdGVtcCAqLworCWlmICh0dmFsID4gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbMF1bMV0pIHsKKwkJcm50YyA9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlWzBdWzBdOworCX0gZWxzZSBpZiAodHZhbCA8PSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVt0Y3N6LTFdWzFdKSB7CisJCXJudGMgPSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVt0Y3N6LTFdWzBdOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDE7IGkgPCB0Y3N6OyBpKyspIHsKKwkJCWlmICh0dmFsID4gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaV1bMV0pIHsKKwkJCQlybWluID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaS0xXVswXTsKKwkJCQlybWF4ID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaV1bMF07CisJCQkJdG1pbiA9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW2ktMV1bMV07CisJCQkJdG1heCA9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW2ldWzFdOworCQkJCXJudGMgPSBybWluICsgKChybWF4IC0gcm1pbikgKgorCQkJCQkodHZhbCAtIHRtaW4pIC8gKHRtYXggLSB0bWluKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiB3ZSBuZWVkIHRoZSBjdXJyZW50IHRvIGNhbGN1bGF0ZSB0aGUgcHJvcGVyIGFkYyB2b2x0YWdlICovCisJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0FEQ19SQVRFKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICIlczpyZWFkIGVycjolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldCA9IDB4MzA7CisJfQorCisJLyoKKwkgKiB0ZW1wZXJhdHVyZSBpcyBwcm9wb3J0aW9uYWwgdG8gTlRTIHRoZXJtaXN0b3IgcmVzaXN0YW5jZQorCSAqIEFEQ19SQVRFWzUtNF0gZGV0ZXJtaW5lcyBjdXJyZW50LCAwMD0yMHVBLDAxPTQwdUEsMTA9NjB1QSwxMT04MHVBCisJICogWzEyLWJpdCBBREMgVkFMXSA9IFJfTlRDKM6pKSAqIGN1cnJlbnQgLyA4MDAKKwkgKi8KKwlhZGNfdmFsID0gcm50YyAqICgyMCArICgyMCAqICgocmV0ID4+IDQpICYgMHgzKSkpIC8gODAwOworCisJcmV0dXJuIGFkY192YWw7Cit9CisKK3N0YXRpYyBpbnQgYWRjX3RvX3RlbXAoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvLCBpbnQgYWRjX3ZhbCkKK3sKKwlpbnQgcmV0LCByLCBpLCB0dmFsID0gMDsKKwlpbnQgcm1pbiwgcm1heCwgdG1pbiwgdG1heDsKKwlpbnQgdGNzeiA9IGluZm8tPnBkYXRhLT50Y3N6OworCisJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0FEQ19SQVRFKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICIlczpyZWFkIGVycjolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldCA9IDB4MzA7CisJfQorCisJLyoKKwkgKiB0ZW1wZXJhdHVyZSBpcyBwcm9wb3J0aW9uYWwgdG8gTlRTIHRoZXJtaXN0b3IgcmVzaXN0YW5jZQorCSAqIEFEQ19SQVRFWzUtNF0gZGV0ZXJtaW5lcyBjdXJyZW50LCAwMD0yMHVBLDAxPTQwdUEsMTA9NjB1QSwxMT04MHVBCisJICogUl9OVEMozqkpID0gWzEyLWJpdCBBREMgVkFMXSAqIDgwMCAvIGN1cnJlbnQKKwkgKi8KKwlyID0gYWRjX3ZhbCAqIDgwMCAvICgyMCArICgyMCAqICgocmV0ID4+IDQpICYgMHgzKSkpOworCisJaWYgKHIgPCBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVswXVswXSkgeworCQl0dmFsID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbMF1bMV07CisJfSBlbHNlIGlmIChyID49IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW3Rjc3otMV1bMF0pIHsKKwkJdHZhbCA9IGluZm8tPnBkYXRhLT50aGVybWlzdG9yX2N1cnZlW3Rjc3otMV1bMV07CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMTsgaSA8IHRjc3o7IGkrKykgeworCQkJaWYgKHIgPCBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVtpXVswXSkgeworCQkJCXJtaW4gPSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVtpLTFdWzBdOworCQkJCXJtYXggPSBpbmZvLT5wZGF0YS0+dGhlcm1pc3Rvcl9jdXJ2ZVtpXVswXTsKKwkJCQl0bWluID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaS0xXVsxXTsKKwkJCQl0bWF4ID0gaW5mby0+cGRhdGEtPnRoZXJtaXN0b3JfY3VydmVbaV1bMV07CisJCQkJdHZhbCA9IHRtaW4gKyAoKHRtYXggLSB0bWluKSAqCisJCQkJCShyIC0gcm1pbikgLyAocm1heCAtIHJtaW4pKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiB0dmFsOworfQorCitzdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfZ2V0X2J0ZW1wKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbywgaW50ICpidGVtcCkKK3sKKwlpbnQgcmV0LCByYXdfdmFsID0gMDsKKworCXJldCA9IHBtaWNfcmVhZF9hZGNfdmFsKCJheHAyODgtYmF0dC10ZW1wIiwgJnJhd192YWwsIGluZm8pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHRlbXBfcmVhZF9mYWlsOworCisJKmJ0ZW1wID0gYWRjX3RvX3RlbXAoaW5mbywgcmF3X3ZhbCk7CisKK3RlbXBfcmVhZF9mYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnVlbF9nYXVnZV9nZXRfdm9jdihzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8sIGludCAqdm9jdikKK3sKKwlpbnQgcmV0LCB2YWx1ZTsKKworCS8qIDEyLWJpdCBkYXRhIHZhbHVlLCB1cHBlciA4IGluIE9DVkgsIGxvd2VyIDQgaW4gT0NWTCAqLworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19PQ1ZIX1JFRyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdm9jdl9yZWFkX2ZhaWw7CisJdmFsdWUgPSByZXQgPDwgNDsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19PQ1ZMX1JFRyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdm9jdl9yZWFkX2ZhaWw7CisJdmFsdWUgfD0gKHJldCAmIDB4Zik7CisKKwkqdm9jdiA9IFZPTFRBR0VfRlJPTV9BREModmFsdWUpOwordm9jdl9yZWFkX2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX2JhdHRlcnlfaGVhbHRoKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgdGVtcCwgdm9jdjsKKwlpbnQgcmV0LCBoZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047CisKKwlyZXQgPSBmdWVsX2dhdWdlX2dldF9idGVtcChpbmZvLCAmdGVtcCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gaGVhbHRoX3JlYWRfZmFpbDsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfZ2V0X3ZvY3YoaW5mbywgJnZvY3YpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGhlYWx0aF9yZWFkX2ZhaWw7CisKKwlpZiAodm9jdiA+IGluZm8tPnBkYXRhLT5tYXhfdm9sdCkKKwkJaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKKwllbHNlIGlmICh0ZW1wID4gaW5mby0+cGRhdGEtPm1heF90ZW1wKQorCQloZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOworCWVsc2UgaWYgKHRlbXAgPCBpbmZvLT5wZGF0YS0+bWluX3RlbXApCisJCWhlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfQ09MRDsKKwllbHNlIGlmICh2b2N2IDwgaW5mby0+cGRhdGEtPm1pbl92b2x0KQorCQloZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7CisJZWxzZQorCQloZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisKK2hlYWx0aF9yZWFkX2ZhaWw6CisJcmV0dXJuIGhlYWx0aDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3NldF9oaWdoX2J0ZW1wX2FsZXJ0KHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0LCBhZGNfdmFsOworCisJLyogcHJvZ3JhbSB0ZW1wZXJhdHVyZSB0aHJlc2hvbGQgYXMgMS8xNiBBREMgdmFsdWUgKi8KKwlhZGNfdmFsID0gdGVtcF90b19hZGMoaW5mbywgaW5mby0+cGRhdGEtPm1heF90ZW1wKTsKKwlyZXQgPSBmdWVsX2dhdWdlX3JlZ193cml0ZWIoaW5mbywgQVhQMjBYX1ZfSFRGX0RJU0NIUkcsIGFkY192YWwgPj4gNCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZ1ZWxfZ2F1Z2Vfc2V0X2xvd19idGVtcF9hbGVydChzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7CisJaW50IHJldCwgYWRjX3ZhbDsKKworCS8qIHByb2dyYW0gdGVtcGVyYXR1cmUgdGhyZXNob2xkIGFzIDEvMTYgQURDIHZhbHVlICovCisJYWRjX3ZhbCA9IHRlbXBfdG9fYWRjKGluZm8sIGluZm8tPnBkYXRhLT5taW5fdGVtcCk7CisJcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sIEFYUDIwWF9WX0xURl9ESVNDSFJHLCBhZGNfdmFsID4+IDQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwcywKKwkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHJvcCwKKwkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8gPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHMpOworCWludCByZXQgPSAwLCB2YWx1ZTsKKworCW11dGV4X2xvY2soJmluZm8tPmxvY2spOworCXN3aXRjaCAocHJvcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgorCQlmdWVsX2dhdWdlX2dldF9zdGF0dXMoaW5mbyk7CisJCXZhbC0+aW50dmFsID0gaW5mby0+c3RhdHVzOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJdmFsLT5pbnR2YWwgPSBmdWVsX2dhdWdlX2JhdHRlcnlfaGVhbHRoKGluZm8pOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCQlyZXQgPSBmdWVsX2dhdWdlX2dldF92YmF0dChpbmZvLCAmdmFsdWUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKKwkJdmFsLT5pbnR2YWwgPSBQUk9QX1ZPTFQodmFsdWUpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfT0NWOgorCQlyZXQgPSBmdWVsX2dhdWdlX2dldF92b2N2KGluZm8sICZ2YWx1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOworCQl2YWwtPmludHZhbCA9IFBST1BfVk9MVCh2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1c6CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfZ2V0X2N1cnJlbnQoaW5mbywgJnZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZ1ZWxfZ2F1Z2VfcmVhZF9lcnI7CisJCXZhbC0+aW50dmFsID0gUFJPUF9DVVJSKHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCQlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfUFdSX09QX01PREUpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKKworCQlpZiAocmV0ICYgQ0hSR19TVEFUX0JBVF9QUkVTRU5UKQorCQkJdmFsLT5pbnR2YWwgPSAxOworCQllbHNlCisJCQl2YWwtPmludHZhbCA9IDA7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9GR19SRVMpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKKworCQlpZiAoIShyZXQgJiBGR19SRVBfQ0FQX1ZBTElEKSkKKwkJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwKKwkJCQkiY2FwYWNpdHkgbWVhc3VyZW1lbnQgbm90IHZhbGlkXG4iKTsKKwkJdmFsLT5pbnR2YWwgPSAocmV0ICYgRkdfUkVQX0NBUF9WQUxfTUFTSyk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFlfQUxFUlRfTUlOOgorCQlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyODhfRkdfTE9XX0NBUF9SRUcpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKKwkJdmFsLT5pbnR2YWwgPSAocmV0ICYgMHgwZik7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKKwkJcmV0ID0gZnVlbF9nYXVnZV9nZXRfYnRlbXAoaW5mbywgJnZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZ1ZWxfZ2F1Z2VfcmVhZF9lcnI7CisJCXZhbC0+aW50dmFsID0gUFJPUF9URU1QKHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX01BWDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYOgorCQl2YWwtPmludHZhbCA9IFBST1BfVEVNUChpbmZvLT5wZGF0YS0+bWF4X3RlbXApOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUlOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NSU46CisJCXZhbC0+aW50dmFsID0gUFJPUF9URU1QKGluZm8tPnBkYXRhLT5taW5fdGVtcCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9MSU9OOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1c6CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19DQ19NVFIxX1JFRyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOworCisJCXZhbHVlID0gKHJldCAmIEZHX0NDX01UUjFfVkFMX01BU0spIDw8IDg7CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19DQ19NVFIwX1JFRyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOworCQl2YWx1ZSB8PSAocmV0ICYgRkdfQ0NfTVRSMF9WQUxfTUFTSyk7CisJCXZhbC0+aW50dmFsID0gdmFsdWUgKiBGR19ERVNfQ0FQX1JFU19MU0I7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEw6CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19ERVNfQ0FQMV9SRUcpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZnVlbF9nYXVnZV9yZWFkX2VycjsKKworCQl2YWx1ZSA9IChyZXQgJiBGR19ERVNfQ0FQMV9WQUxfTUFTSykgPDwgODsKKwkJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0RFU19DQVAwX1JFRyk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmdWVsX2dhdWdlX3JlYWRfZXJyOworCQl2YWx1ZSB8PSAocmV0ICYgRkdfREVTX0NBUDBfVkFMX01BU0spOworCQl2YWwtPmludHZhbCA9IHZhbHVlICogRkdfREVTX0NBUF9SRVNfTFNCOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSBQUk9QX0NVUlIoaW5mby0+cGRhdGEtPmRlc2lnbl9jYXApOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUFYX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSBQUk9QX1ZPTFQoaW5mby0+cGRhdGEtPm1heF92b2x0KTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR046CisJCXZhbC0+aW50dmFsID0gUFJPUF9WT0xUKGluZm8tPnBkYXRhLT5taW5fdm9sdCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKKwkJdmFsLT5zdHJ2YWwgPSBpbmZvLT5wZGF0YS0+YmF0dGlkOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltdXRleF91bmxvY2soJmluZm8tPmxvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJmluZm8tPmxvY2spOworCXJldHVybiAwOworCitmdWVsX2dhdWdlX3JlYWRfZXJyOgorCW11dGV4X3VubG9jaygmaW5mby0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3NldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwcywKKwkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHJvcCwKKwkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8gPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHMpOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmaW5mby0+bG9jayk7CisJc3dpdGNoIChwcm9wKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJCWluZm8tPnN0YXR1cyA9IHZhbC0+aW50dmFsOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfTUlOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTEVSVF9NSU46CisJCWlmICgodmFsLT5pbnR2YWwgPCBQRF9ERUZfTUlOX1RFTVApIHx8CisJCQkodmFsLT5pbnR2YWwgPiBQRF9ERUZfTUFYX1RFTVApKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaW5mby0+cGRhdGEtPm1pbl90ZW1wID0gVU5QUk9QX1RFTVAodmFsLT5pbnR2YWwpOworCQlyZXQgPSBmdWVsX2dhdWdlX3NldF9sb3dfYnRlbXBfYWxlcnQoaW5mbyk7CisJCWlmIChyZXQgPCAwKQorCQkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LAorCQkJCSJ0ZW1wIGFsZXJ0IG1pbiBzZXQgZmFpbDolZFxuIiwgcmV0KTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX01BWDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUFYOgorCQlpZiAoKHZhbC0+aW50dmFsIDwgUERfREVGX01JTl9URU1QKSB8fAorCQkJKHZhbC0+aW50dmFsID4gUERfREVGX01BWF9URU1QKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWluZm8tPnBkYXRhLT5tYXhfdGVtcCA9IFVOUFJPUF9URU1QKHZhbC0+aW50dmFsKTsKKwkJcmV0ID0gZnVlbF9nYXVnZV9zZXRfaGlnaF9idGVtcF9hbGVydChpbmZvKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsCisJCQkJInRlbXAgYWxlcnQgbWF4IHNldCBmYWlsOiVkXG4iLCByZXQpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0FMRVJUX01JTjoKKwkJaWYgKCh2YWwtPmludHZhbCA8IDApIHx8ICh2YWwtPmludHZhbCA+IDE1KSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDI4OF9GR19MT1dfQ0FQX1JFRyk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJCXJldCAmPSAweGYwOworCQlyZXQgfD0gKHZhbC0+aW50dmFsICYgMHhmKTsKKwkJcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sIEFYUDI4OF9GR19MT1dfQ0FQX1JFRywgcmV0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZpbmZvLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZ1ZWxfZ2F1Z2VfcHJvcGVydHlfaXNfd3JpdGVhYmxlKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX01JTjoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQUxFUlRfTUlOOgorCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUF9NQVg6CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QX0FMRVJUX01BWDoKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZX0FMRVJUX01JTjoKKwkJcmV0ID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmdWVsX2dhdWdlX3N0YXR1c19tb25pdG9yKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8gPSBjb250YWluZXJfb2Yod29yaywKKwkJc3RydWN0IGF4cDI4OF9mZ19pbmZvLCBzdGF0dXNfbW9uaXRvci53b3JrKTsKKworCWZ1ZWxfZ2F1Z2VfZ2V0X3N0YXR1cyhpbmZvKTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChpbmZvLT5iYXQpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW5mby0+c3RhdHVzX21vbml0b3IsIFNUQVRVU19NT05fREVMQVlfSklGRklFUyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBmdWVsX2dhdWdlX3RocmVhZF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8gPSBkZXY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVhQMjg4X0ZHX0lOVFJfTlVNOyBpKyspIHsKKwkJaWYgKGluZm8tPmlycVtpXSA9PSBpcnEpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA+PSBBWFAyODhfRkdfSU5UUl9OVU0pIHsKKwkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwgInNwdXJpb3VzIGludGVycnVwdCEhXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXN3aXRjaCAoaSkgeworCWNhc2UgUVdCVFVfSVJROgorCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LAorCQkJIlF1aXQgQmF0dGVyeSB1bmRlciB0ZW1wZXJhdHVyZSBpbiB3b3JrIG1vZGUgSVJRIChRV0JUVSlcbiIpOworCQlicmVhazsKKwljYXNlIFdCVFVfSVJROgorCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LAorCQkJIkJhdHRlcnkgdW5kZXIgdGVtcGVyYXR1cmUgaW4gd29yayBtb2RlIElSUSAoV0JUVSlcbiIpOworCQlicmVhazsKKwljYXNlIFFXQlRPX0lSUToKKwkJZGV2X2luZm8oJmluZm8tPnBkZXYtPmRldiwKKwkJCSJRdWl0IEJhdHRlcnkgb3ZlciB0ZW1wZXJhdHVyZSBpbiB3b3JrIG1vZGUgSVJRIChRV0JUTylcbiIpOworCQlicmVhazsKKwljYXNlIFdCVE9fSVJROgorCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LAorCQkJIkJhdHRlcnkgb3ZlciB0ZW1wZXJhdHVyZSBpbiB3b3JrIG1vZGUgSVJRIChXQlRPKVxuIik7CisJCWJyZWFrOworCWNhc2UgV0wyX0lSUToKKwkJZGV2X2luZm8oJmluZm8tPnBkZXYtPmRldiwgIkxvdyBCYXR0IFdhcm5pbmcoMikgSU5UUlxuIik7CisJCWJyZWFrOworCWNhc2UgV0wxX0lSUToKKwkJZGV2X2luZm8oJmluZm8tPnBkZXYtPmRldiwgIkxvdyBCYXR0IFdhcm5pbmcoMSkgSU5UUlxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZpbmZvLT5wZGV2LT5kZXYsICJTcHVyaW91cyBJbnRlcnJ1cHQhISFcbiIpOworCX0KKworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGluZm8tPmJhdCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBmdWVsX2dhdWdlX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQoreworCXN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOworCisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoaW5mby0+YmF0KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBmdWVsX2dhdWdlX2Rlc2MgPSB7CisJLm5hbWUJCQk9IERFVl9OQU1FLAorCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5wcm9wZXJ0aWVzCQk9IGZ1ZWxfZ2F1Z2VfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUoZnVlbF9nYXVnZV9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQkJPSBmdWVsX2dhdWdlX2dldF9wcm9wZXJ0eSwKKwkuc2V0X3Byb3BlcnR5CQk9IGZ1ZWxfZ2F1Z2Vfc2V0X3Byb3BlcnR5LAorCS5wcm9wZXJ0eV9pc193cml0ZWFibGUJPSBmdWVsX2dhdWdlX3Byb3BlcnR5X2lzX3dyaXRlYWJsZSwKKwkuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZAk9IGZ1ZWxfZ2F1Z2VfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKK307CisKK3N0YXRpYyBpbnQgZnVlbF9nYXVnZV9zZXRfbG93YmF0dF90aHJlc2hvbGRzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0OworCXU4IHJlZ192YWw7CisKKwlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfRkdfUkVTKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICIlczpyZWFkIGVycjolZFxuIiwgX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IChyZXQgJiBGR19SRVBfQ0FQX1ZBTF9NQVNLKTsKKworCWlmIChyZXQgPiBGR19MT1dfQ0FQX1dBUk5fVEhSKQorCQlyZWdfdmFsID0gRkdfTE9XX0NBUF9XQVJOX1RIUjsKKwllbHNlIGlmIChyZXQgPiBGR19MT1dfQ0FQX0NSSVRfVEhSKQorCQlyZWdfdmFsID0gRkdfTE9XX0NBUF9DUklUX1RIUjsKKwllbHNlCisJCXJlZ192YWwgPSBGR19MT1dfQ0FQX1NIRE5fVEhSOworCisJcmVnX3ZhbCB8PSBGR19MT1dfQ0FQX1RIUjFfVkFMOworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLCBBWFAyODhfRkdfTE9XX0NBUF9SRUcsIHJlZ192YWwpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICIlczp3cml0ZSBlcnI6JWRcbiIsIF9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3Byb2dyYW1fdmJhdHRfZnVsbChzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7CisJaW50IHJldDsKKwl1OCB2YWw7CisKKwlyZXQgPSBmdWVsX2dhdWdlX3JlZ19yZWFkYihpbmZvLCBBWFAyMFhfQ0hSR19DVFJMMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmdfcHJvZ19vY3ZfZmFpbDsKKwllbHNlCisJCXZhbCA9IChyZXQgJiB+Q0hSR19DQ0NWX0NWX01BU0spOworCisJc3dpdGNoIChpbmZvLT5wZGF0YS0+bWF4X3ZvbHQpIHsKKwljYXNlIENWXzQxMDA6CisJCXZhbCB8PSAoQ0hSR19DQ0NWX0NWXzQxMDBNViA8PCBDSFJHX0NDQ1ZfQ1ZfQklUX1BPUyk7CisJCWJyZWFrOworCWNhc2UgQ1ZfNDE1MDoKKwkJdmFsIHw9IChDSFJHX0NDQ1ZfQ1ZfNDE1ME1WIDw8IENIUkdfQ0NDVl9DVl9CSVRfUE9TKTsKKwkJYnJlYWs7CisJY2FzZSBDVl80MjAwOgorCQl2YWwgfD0gKENIUkdfQ0NDVl9DVl80MjAwTVYgPDwgQ0hSR19DQ0NWX0NWX0JJVF9QT1MpOworCQlicmVhazsKKwljYXNlIENWXzQzNTA6CisJCXZhbCB8PSAoQ0hSR19DQ0NWX0NWXzQzNTBNViA8PCBDSFJHX0NDQ1ZfQ1ZfQklUX1BPUyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZhbCB8PSAoQ0hSR19DQ0NWX0NWXzQyMDBNViA8PCBDSFJHX0NDQ1ZfQ1ZfQklUX1BPUyk7CisJCWJyZWFrOworCX0KKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLCBBWFAyMFhfQ0hSR19DVFJMMSwgdmFsKTsKK2ZnX3Byb2dfb2N2X2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3Byb2dyYW1fZGVzaWduX2NhcChzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7CisJaW50IHJldDsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLAorCQlBWFAyODhfRkdfREVTX0NBUDFfUkVHLCBpbmZvLT5wZGF0YS0+Y2FwMSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZmdfcHJvZ19kZXNjYXBfZmFpbDsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLAorCQlBWFAyODhfRkdfREVTX0NBUDBfUkVHLCBpbmZvLT5wZGF0YS0+Y2FwMCk7CisKK2ZnX3Byb2dfZGVzY2FwX2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmdWVsX2dhdWdlX3Byb2dyYW1fb2N2X2N1cnZlKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0ID0gMCwgaTsKKworCWZvciAoaSA9IDA7IGkgPCBPQ1ZfQ1VSVkVfU0laRTsgaSsrKSB7CisJCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLAorCQkJQVhQMjg4X0ZHX09DVl9DVVJWRV9SRUcgKyBpLCBpbmZvLT5wZGF0YS0+b2N2X2N1cnZlW2ldKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGZnX3Byb2dfb2N2X2ZhaWw7CisJfQorCitmZ19wcm9nX29jdl9mYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnVlbF9nYXVnZV9wcm9ncmFtX3JkY192YWxzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sCisJCUFYUDI4OF9GR19SREMxX1JFRywgaW5mby0+cGRhdGEtPnJkYzEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZnX3Byb2dfb2N2X2ZhaWw7CisKKwlyZXQgPSBmdWVsX2dhdWdlX3JlZ193cml0ZWIoaW5mbywKKwkJQVhQMjg4X0ZHX1JEQzBfUkVHLCBpbmZvLT5wZGF0YS0+cmRjMCk7CisKK2ZnX3Byb2dfb2N2X2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZnVlbF9nYXVnZV9pbml0X2NvbmZpZ19yZWdzKHN0cnVjdCBheHAyODhfZmdfaW5mbyAqaW5mbykKK3sKKwlpbnQgcmV0OworCisJLyoKKwkgKiBjaGVjayBpZiB0aGUgY29uZmlnIGRhdGEgaXMgYWxyZWFkeQorCSAqIHByb2dyYW1tZWQgYW5kIGlmIHNvIGp1c3QgcmV0dXJuLgorCSAqLworCisJcmV0ID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjg4X0ZHX0RFU19DQVAxX1JFRyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwgIkNBUDEgcmVnIHJlYWQgZXJyISFcbiIpOworCX0gZWxzZSBpZiAoIShyZXQgJiBGR19ERVNfQ0FQMV9WQUxJRCkpIHsKKwkJZGV2X2luZm8oJmluZm8tPnBkZXYtPmRldiwgIkZHIGRhdGEgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWRcbiIpOworCX0gZWxzZSB7CisJCWRldl9pbmZvKCZpbmZvLT5wZGV2LT5kZXYsICJGRyBkYXRhIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJcmV0ID0gZnVlbF9nYXVnZV9wcm9ncmFtX3ZiYXR0X2Z1bGwoaW5mbyk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgInNldCB2YmF0dCBmdWxsIGZhaWw6JWRcbiIsIHJldCk7CisKKwlyZXQgPSBmdWVsX2dhdWdlX3Byb2dyYW1fZGVzaWduX2NhcChpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAic2V0IGRlc2lnbiBjYXAgZmFpbDolZFxuIiwgcmV0KTsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcHJvZ3JhbV9yZGNfdmFscyhpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAic2V0IHJkYyBmYWlsOiVkXG4iLCByZXQpOworCisJcmV0ID0gZnVlbF9nYXVnZV9wcm9ncmFtX29jdl9jdXJ2ZShpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAic2V0IG9jdiBjdXJ2ZSBmYWlsOiVkXG4iLCByZXQpOworCisJcmV0ID0gZnVlbF9nYXVnZV9zZXRfbG93YmF0dF90aHJlc2hvbGRzKGluZm8pOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKCZpbmZvLT5wZGV2LT5kZXYsICJsb3diYXR0IHRociBzZXQgZmFpbDolZFxuIiwgcmV0KTsKKworCXJldCA9IGZ1ZWxfZ2F1Z2VfcmVnX3dyaXRlYihpbmZvLCBBWFAyMFhfQ0NfQ1RSTCwgMHhlZik7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgImdhdWdlIGNudGwgc2V0IGZhaWw6JWRcbiIsIHJldCk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1ZWxfZ2F1Z2VfaW5pdF9pcnEoc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvKQoreworCWludCByZXQsIGksIHBpcnE7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVhQMjg4X0ZHX0lOVFJfTlVNOyBpKyspIHsKKwkJcGlycSA9IHBsYXRmb3JtX2dldF9pcnEoaW5mby0+cGRldiwgaSk7CisJCWluZm8tPmlycVtpXSA9IHJlZ21hcF9pcnFfZ2V0X3ZpcnEoaW5mby0+cmVnbWFwX2lycWMsIHBpcnEpOworCQlpZiAoaW5mby0+aXJxW2ldIDwgMCkgeworCQkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwKKwkJCQkicmVnbWFwX2lycSBnZXQgdmlycSBmYWlsZWQgZm9yIElSUSAlZDogJWRcbiIsCisJCQkJcGlycSwgaW5mby0+aXJxW2ldKTsKKwkJCWluZm8tPmlycVtpXSA9IC0xOworCQkJZ290byBpbnRyX2ZhaWxlZDsKKwkJfQorCQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpbmZvLT5pcnFbaV0sCisJCQkJTlVMTCwgZnVlbF9nYXVnZV90aHJlYWRfaGFuZGxlciwKKwkJCQlJUlFGX09ORVNIT1QsIERFVl9OQU1FLCBpbmZvKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X3dhcm4oJmluZm8tPnBkZXYtPmRldiwKKwkJCQkicmVxdWVzdCBpcnEgZmFpbGVkIGZvciBJUlEgJWQ6ICVkXG4iLAorCQkJCXBpcnEsIGluZm8tPmlycVtpXSk7CisJCQlpbmZvLT5pcnFbaV0gPSAtMTsKKwkJCWdvdG8gaW50cl9mYWlsZWQ7CisJCX0gZWxzZSB7CisJCQlkZXZfaW5mbygmaW5mby0+cGRldi0+ZGV2LCAiSFcgSVJRICVkIC0+IFZJUlEgJWRcbiIsCisJCQkJcGlycSwgaW5mby0+aXJxW2ldKTsKKwkJfQorCX0KKwlyZXR1cm47CisKK2ludHJfZmFpbGVkOgorCWZvciAoOyBpID4gMDsgaS0tKSB7CisJCWZyZWVfaXJxKGluZm8tPmlycVtpIC0gMV0sIGluZm8pOworCQlpbmZvLT5pcnFbaSAtIDFdID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZCBmdWVsX2dhdWdlX2luaXRfaHdfcmVncyhzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm8pCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJcmV0ID0gZnVlbF9nYXVnZV9zZXRfaGlnaF9idGVtcF9hbGVydChpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycigmaW5mby0+cGRldi0+ZGV2LCAiaGlnaCBiYXR0IHRlbXAgc2V0IGZhaWw6JWRcbiIsIHJldCk7CisKKwlyZXQgPSBmdWVsX2dhdWdlX3NldF9sb3dfYnRlbXBfYWxlcnQoaW5mbyk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmluZm8tPnBkZXYtPmRldiwgImxvdyBiYXR0IHRlbXAgc2V0IGZhaWw6JWRcbiIsIHJldCk7CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCXZhbCA9IGZ1ZWxfZ2F1Z2VfcmVnX3JlYWRiKGluZm8sIEFYUDIwWF9JUlEzX0VOKTsKKwl2YWwgfD0gVEVNUF9JUlFfQ0ZHX01BU0s7CisJZnVlbF9nYXVnZV9yZWdfd3JpdGViKGluZm8sIEFYUDIwWF9JUlEzX0VOLCB2YWwpOworCisJdmFsID0gZnVlbF9nYXVnZV9yZWdfcmVhZGIoaW5mbywgQVhQMjBYX0lSUTRfRU4pOworCXZhbCB8PSBGR19JUlFfQ0ZHX0xPV0JBVFRfTUFTSzsKKwl2YWwgPSBmdWVsX2dhdWdlX3JlZ193cml0ZWIoaW5mbywgQVhQMjBYX0lSUTRfRU4sIHZhbCk7Cit9CisKK3N0YXRpYyBpbnQgYXhwMjg4X2Z1ZWxfZ2F1Z2VfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgYXhwMjg4X2ZnX2luZm8gKmluZm87CisJc3RydWN0IGF4cDIweF9kZXYgKmF4cDIweCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CisKKwlpbmZvID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbmZvLT5wZGV2ID0gcGRldjsKKwlpbmZvLT5yZWdtYXAgPSBheHAyMHgtPnJlZ21hcDsKKwlpbmZvLT5yZWdtYXBfaXJxYyA9IGF4cDIweC0+cmVnbWFwX2lycWM7CisJaW5mby0+c3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOworCWluZm8tPnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKCFpbmZvLT5wZGF0YSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKKworCW11dGV4X2luaXQoJmluZm8tPmxvY2spOworCUlOSVRfREVMQVlFRF9XT1JLKCZpbmZvLT5zdGF0dXNfbW9uaXRvciwgZnVlbF9nYXVnZV9zdGF0dXNfbW9uaXRvcik7CisKKwlwc3lfY2ZnLmRydl9kYXRhID0gaW5mbzsKKwlpbmZvLT5iYXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmZ1ZWxfZ2F1Z2VfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoaW5mby0+YmF0KSkgeworCQlyZXQgPSBQVFJfRVJSKGluZm8tPmJhdCk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBiYXR0ZXJ5OiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlmdWVsX2dhdWdlX2NyZWF0ZV9kZWJ1Z2ZzKGluZm8pOworCWZ1ZWxfZ2F1Z2VfaW5pdF9jb25maWdfcmVncyhpbmZvKTsKKwlmdWVsX2dhdWdlX2luaXRfaXJxKGluZm8pOworCWZ1ZWxfZ2F1Z2VfaW5pdF9od19yZWdzKGluZm8pOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmaW5mby0+c3RhdHVzX21vbml0b3IsIFNUQVRVU19NT05fREVMQVlfSklGRklFUyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBheHAyODhfZmdfaWRfdGFibGVbXSA9IHsKKwl7IC5uYW1lID0gREVWX05BTUUgfSwKKwl7fSwKK307CisKK3N0YXRpYyBpbnQgYXhwMjg4X2Z1ZWxfZ2F1Z2VfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGF4cDI4OF9mZ19pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmluZm8tPnN0YXR1c19tb25pdG9yKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihpbmZvLT5iYXQpOworCWZ1ZWxfZ2F1Z2VfcmVtb3ZlX2RlYnVnZnMoaW5mbyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVhQMjg4X0ZHX0lOVFJfTlVNOyBpKyspCisJCWlmIChpbmZvLT5pcnFbaV0gPj0gMCkKKwkJCWZyZWVfaXJxKGluZm8tPmlycVtpXSwgaW5mbyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXhwMjg4X2Z1ZWxfZ2F1Z2VfZHJpdmVyID0geworCS5wcm9iZSA9IGF4cDI4OF9mdWVsX2dhdWdlX3Byb2JlLAorCS5yZW1vdmUgPSBheHAyODhfZnVlbF9nYXVnZV9yZW1vdmUsCisJLmlkX3RhYmxlID0gYXhwMjg4X2ZnX2lkX3RhYmxlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gREVWX05BTUUsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXhwMjg4X2Z1ZWxfZ2F1Z2VfZHJpdmVyKTsKKworTU9EVUxFX0FVVEhPUigiVG9kZCBCcmFuZHQgPHRvZGQuZS5icmFuZHRAbGludXguaW50ZWwuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYcG93ZXIgQVhQMjg4IEZ1ZWwgR2F1Z2UgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2JxMjQxNXhfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9icTI0MTV4X2NoYXJnZXIuYwppbmRleCAxZjQ5OTg2Li42YzUzNGRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2JxMjQxNXhfY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvYnEyNDE1eF9jaGFyZ2VyLmMKQEAgLTEzLDEyICsxMyw2IEBACiAgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KLSAqLwotCi0vKgogICogRGF0YXNoZWV0czoKICAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNDE1MAogICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI0MTUwYQpAQCAtMjYsNiArMjAsOCBAQAogICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9icTI0MTUzCiAgKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjQxNTNhCiAgKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjQxNTUKKyAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNDE1N3MKKyAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvYnEyNDE1OAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTE0Nyw2ICsxNDMsNyBAQAogCUJRMjQxNTUsCiAJQlEyNDE1NiwKIAlCUTI0MTU2QSwKKwlCUTI0MTU3UywKIAlCUTI0MTU4LAogfTsKIApAQCAtMTYyLDE4ICsxNTksMjAgQEAKIAkiYnEyNDE1NSIsCiAJImJxMjQxNTYiLAogCSJicTI0MTU2YSIsCisJImJxMjQxNTdzIiwKIAkiYnEyNDE1OCIsCiB9OwogCiBzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgYnEyNDE1eF9wbGF0Zm9ybV9kYXRhIGluaXRfZGF0YTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGNoYXJnZXI7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqY2hhcmdlcjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgY2hhcmdlcl9kZXNjOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpub3RpZnlfcHN5OwogCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKIAllbnVtIGJxMjQxNXhfbW9kZSByZXBvcnRlZF9tb2RlOy8qIG1vZGUgcmVwb3J0ZWQgYnkgaG9vayBmdW5jdGlvbiAqLwotCWVudW0gYnEyNDE1eF9tb2RlIG1vZGU7CQkvKiBjdXJyZW50IGNvbmZpZ3VyZWQgbW9kZSAqLworCWVudW0gYnEyNDE1eF9tb2RlIG1vZGU7CQkvKiBjdXJyZW50bHkgY29uZmlndXJlZCBtb2RlICovCiAJZW51bSBicTI0MTV4X2NoaXAgY2hpcDsKIAljb25zdCBjaGFyICp0aW1lcl9lcnJvcjsKIAljaGFyICptb2RlbDsKQEAgLTM1Miw4ICszNTEsNyBAQAogCQkJQlEyNDE1WF9CSVRfQ0UpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7Ci0JCWVsc2UKLQkJCXJldHVybiByZXQgPiAwID8gMCA6IDE7CisJCXJldHVybiByZXQgPiAwID8gMCA6IDE7CiAJY2FzZSBCUTI0MTVYX0NIQVJHRVJfRU5BQkxFOgogCQlyZXR1cm4gYnEyNDE1eF9pMmNfd3JpdGVfYml0KGJxLCBCUTI0MTVYX1JFR19DT05UUk9MLAogCQkJCTAsIEJRMjQxNVhfQklUX0NFKTsKQEAgLTQyNiwyMCArNDI0LDE3IEBACiAJCWNhc2UgMDoKIAkJCWlmIChicS0+Y2hpcCA9PSBCUTI0MTUxQSkKIAkJCQlyZXR1cm4gYnEtPmNoaXA7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIEJRMjQxNTE7CisJCQlyZXR1cm4gQlEyNDE1MTsKIAkJY2FzZSAxOgogCQkJaWYgKGJxLT5jaGlwID09IEJRMjQxNTBBIHx8CiAJCQkJYnEtPmNoaXAgPT0gQlEyNDE1MiB8fAogCQkJCWJxLT5jaGlwID09IEJRMjQxNTUpCiAJCQkJcmV0dXJuIGJxLT5jaGlwOwotCQkJZWxzZQotCQkJCXJldHVybiBCUTI0MTUwOworCQkJcmV0dXJuIEJRMjQxNTA7CiAJCWNhc2UgMjoKIAkJCWlmIChicS0+Y2hpcCA9PSBCUTI0MTUzQSkKIAkJCQlyZXR1cm4gYnEtPmNoaXA7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIEJRMjQxNTM7CisJCQlyZXR1cm4gQlEyNDE1MzsKIAkJZGVmYXVsdDoKIAkJCXJldHVybiBCUVVOS05PV047CiAJCX0KQEAgLTQ1MCw5ICs0NDUsMTAgQEAKIAkJY2FzZSAwOgogCQkJaWYgKGJxLT5jaGlwID09IEJRMjQxNTZBKQogCQkJCXJldHVybiBicS0+Y2hpcDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gQlEyNDE1NjsKKwkJCXJldHVybiBCUTI0MTU2OwogCQljYXNlIDI6CisJCQlpZiAoYnEtPmNoaXAgPT0gQlEyNDE1N1MpCisJCQkJcmV0dXJuIGJxLT5jaGlwOwogCQkJcmV0dXJuIEJRMjQxNTg7CiAJCWRlZmF1bHQ6CiAJCQlyZXR1cm4gQlFVTktOT1dOOwpAQCAtNDgwLDI0ICs0NzYsMjIgQEAKIAljYXNlIEJRMjQxNTI6CiAJCWlmIChyZXQgPj0gMCAmJiByZXQgPD0gMykKIAkJCXJldHVybiByZXQ7Ci0JCWVsc2UKLQkJCXJldHVybiAtMTsKKwkJcmV0dXJuIC0xOwogCWNhc2UgQlEyNDE1MzoKIAljYXNlIEJRMjQxNTNBOgogCWNhc2UgQlEyNDE1NjoKIAljYXNlIEJRMjQxNTZBOgorCWNhc2UgQlEyNDE1N1M6CiAJY2FzZSBCUTI0MTU4OgogCQlpZiAocmV0ID09IDMpCiAJCQlyZXR1cm4gMDsKIAkJZWxzZSBpZiAocmV0ID09IDEpCiAJCQlyZXR1cm4gMTsKLQkJZWxzZQotCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLTE7CiAJY2FzZSBCUTI0MTU1OgogCQlpZiAocmV0ID09IDMpCiAJCQlyZXR1cm4gMzsKLQkJZWxzZQotCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLTE7CiAJY2FzZSBCUVVOS05PV046CiAJCXJldHVybiAtMTsKIAl9CkBAIC03OTEsNyArNzg1LDcgQEAKIAlicTI0MTV4X3NldF9kZWZhdWx0X3ZhbHVlKGJxLCBiYXR0ZXJ5X3JlZ3VsYXRpb25fdm9sdGFnZSk7CiAKIAlicS0+bW9kZSA9IG1vZGU7Ci0Jc3lzZnNfbm90aWZ5KCZicS0+Y2hhcmdlci5kZXYtPmtvYmosIE5VTEwsICJtb2RlIik7CisJc3lzZnNfbm90aWZ5KCZicS0+Y2hhcmdlci0+ZGV2LmtvYmosIE5VTEwsICJtb2RlIik7CiAKIAlyZXR1cm4gMDsKIApAQCAtODE2LDcgKzgxMCw4IEBACiAKIAlkZXZfZGJnKGJxLT5kZXYsICJub3RpZmllciBjYWxsIHdhcyBjYWxsZWRcbiIpOwogCi0JcmV0ID0gcHN5LT5nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX01BWCwgJnByb3ApOworCXJldCA9IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX01BWCwKKwkJCSZwcm9wKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiBOT1RJRllfT0s7CiAKQEAgLTg3NCw3ICs4NjksNyBAQAogc3RhdGljIHZvaWQgYnEyNDE1eF90aW1lcl9lcnJvcihzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgKmJxLCBjb25zdCBjaGFyICptc2cpCiB7CiAJYnEtPnRpbWVyX2Vycm9yID0gbXNnOwotCXN5c2ZzX25vdGlmeSgmYnEtPmNoYXJnZXIuZGV2LT5rb2JqLCBOVUxMLCAidGltZXIiKTsKKwlzeXNmc19ub3RpZnkoJmJxLT5jaGFyZ2VyLT5kZXYua29iaiwgTlVMTCwgInRpbWVyIik7CiAJZGV2X2VycihicS0+ZGV2LCAiJXNcbiIsIG1zZyk7CiAJaWYgKGJxLT5hdXRvbW9kZSA+IDApCiAJCWJxLT5hdXRvbW9kZSA9IDA7CkBAIC04OTIsNyArODg3LDcgQEAKIAlpbnQgYm9vc3Q7CiAKIAlpZiAoYnEtPmF1dG9tb2RlID4gMCAmJiAoYnEtPnJlcG9ydGVkX21vZGUgIT0gYnEtPm1vZGUpKSB7Ci0JCXN5c2ZzX25vdGlmeSgmYnEtPmNoYXJnZXIuZGV2LT5rb2JqLCBOVUxMLCAicmVwb3J0ZWRfbW9kZSIpOworCQlzeXNmc19ub3RpZnkoJmJxLT5jaGFyZ2VyLT5kZXYua29iaiwgTlVMTCwgInJlcG9ydGVkX21vZGUiKTsKIAkJYnEyNDE1eF9zZXRfbW9kZShicSwgYnEtPnJlcG9ydGVkX21vZGUpOwogCX0KIApAQCAtOTk4LDggKzk5Myw3IEBACiAJCQkJCSAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJCQkgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IGJxMjQxNXhfZGV2aWNlICpicSA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBicTI0MTV4X2RldmljZSwKLQkJCQkJCSBjaGFyZ2VyKTsKKwlzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgKmJxID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJaW50IHJldDsKIAogCXN3aXRjaCAocHNwKSB7CkBAIC0xMDMwLDEyICsxMDI0LDE0IEBACiAJaW50IHJldDsKIAlpbnQgY2hpcDsKIAljaGFyIHJldnN0cls4XTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0geyAuZHJ2X2RhdGEgPSBicSwgfTsKIAotCWJxLT5jaGFyZ2VyLm5hbWUgPSBicS0+bmFtZTsKLQlicS0+Y2hhcmdlci50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOwotCWJxLT5jaGFyZ2VyLnByb3BlcnRpZXMgPSBicTI0MTV4X3Bvd2VyX3N1cHBseV9wcm9wczsKLQlicS0+Y2hhcmdlci5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoYnEyNDE1eF9wb3dlcl9zdXBwbHlfcHJvcHMpOwotCWJxLT5jaGFyZ2VyLmdldF9wcm9wZXJ0eSA9IGJxMjQxNXhfcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eTsKKwlicS0+Y2hhcmdlcl9kZXNjLm5hbWUgPSBicS0+bmFtZTsKKwlicS0+Y2hhcmdlcl9kZXNjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CisJYnEtPmNoYXJnZXJfZGVzYy5wcm9wZXJ0aWVzID0gYnEyNDE1eF9wb3dlcl9zdXBwbHlfcHJvcHM7CisJYnEtPmNoYXJnZXJfZGVzYy5udW1fcHJvcGVydGllcyA9CisJCQlBUlJBWV9TSVpFKGJxMjQxNXhfcG93ZXJfc3VwcGx5X3Byb3BzKTsKKwlicS0+Y2hhcmdlcl9kZXNjLmdldF9wcm9wZXJ0eSA9IGJxMjQxNXhfcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eTsKIAogCXJldCA9IGJxMjQxNXhfZGV0ZWN0X2NoaXAoYnEpOwogCWlmIChyZXQgPCAwKQpAQCAtMTA1OCwxMCArMTA1NCwxMSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoYnEtPmRldiwgJmJxLT5jaGFyZ2VyKTsKLQlpZiAocmV0KSB7CisJYnEtPmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoYnEtPmRldiwgJmJxLT5jaGFyZ2VyX2Rlc2MsCisJCQkJCSAgICAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihicS0+Y2hhcmdlcikpIHsKIAkJa2ZyZWUoYnEtPm1vZGVsKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIFBUUl9FUlIoYnEtPmNoYXJnZXIpOwogCX0KIAogCXJldHVybiAwOwpAQCAtMTA3Myw3ICsxMDcwLDcgQEAKIAlpZiAoYnEtPmF1dG9tb2RlID4gMCkKIAkJYnEtPmF1dG9tb2RlID0gMDsKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmJxLT53b3JrKTsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmYnEtPmNoYXJnZXIpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGJxLT5jaGFyZ2VyKTsKIAlrZnJlZShicS0+bW9kZWwpOwogfQogCkBAIC0xMDg1LDggKzEwODIsNyBAQAogCQkJCQkgY2hhciAqYnVmKQogewogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBicTI0MTV4X2RldmljZSAqYnEgPSBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UsCi0JCQkJCQljaGFyZ2VyKTsKKwlzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgKmJxID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJZW51bSBicTI0MTV4X2NvbW1hbmQgY29tbWFuZDsKIAlpbnQgcmV0OwogCkBAIC0xMTE5LDggKzExMTUsNyBAQAogCQkJCSAgICAgICBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGJxMjQxNXhfZGV2aWNlICpicSA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBicTI0MTV4X2RldmljZSwKLQkJCQkJCWNoYXJnZXIpOworCXN0cnVjdCBicTI0MTV4X2RldmljZSAqYnEgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChzdHJuY21wKGJ1ZiwgImF1dG8iLCA0KSA9PSAwKQpAQCAtMTE0MSw4ICsxMTM2LDcgQEAKIAkJCQkJY2hhciAqYnVmKQogewogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBicTI0MTV4X2RldmljZSAqYnEgPSBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UsCi0JCQkJCQkgY2hhcmdlcik7CisJc3RydWN0IGJxMjQxNXhfZGV2aWNlICpicSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJaWYgKGJxLT50aW1lcl9lcnJvcikKIAkJcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIGJxLT50aW1lcl9lcnJvcik7CkBAIC0xMTY2LDggKzExNjAsNyBAQAogCQkJCSAgICAgIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgKmJxID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IGJxMjQxNXhfZGV2aWNlLAotCQkJCQkJIGNoYXJnZXIpOworCXN0cnVjdCBicTI0MTV4X2RldmljZSAqYnEgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAllbnVtIGJxMjQxNXhfbW9kZSBtb2RlOwogCWludCByZXQgPSAwOwogCkBAIC0xMjE5LDggKzEyMTIsNyBAQAogCQkJCSAgICAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGJxMjQxNXhfZGV2aWNlICpicSA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBicTI0MTV4X2RldmljZSwKLQkJCQkJCWNoYXJnZXIpOworCXN0cnVjdCBicTI0MTV4X2RldmljZSAqYnEgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAlzc2l6ZV90IHJldCA9IDA7CiAKIAlpZiAoYnEtPmF1dG9tb2RlID4gMCkKQEAgLTEyNTcsOCArMTI0OSw3IEBACiAJCQkJCQljaGFyICpidWYpCiB7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGJxMjQxNXhfZGV2aWNlICpicSA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBicTI0MTV4X2RldmljZSwKLQkJCQkJCSBjaGFyZ2VyKTsKKwlzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgKmJxID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAlpZiAoYnEtPmF1dG9tb2RlIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMjg2LDggKzEyNzcsNyBAQAogCQkJCQkgICBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGJxMjQxNXhfZGV2aWNlICpicSA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBicTI0MTV4X2RldmljZSwKLQkJCQkJCSBjaGFyZ2VyKTsKKwlzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgKmJxID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJc3NpemVfdCByZXQgPSAwOwogCXVuc2lnbmVkIGludCByZWc7CiAJdW5zaWduZWQgaW50IHZhbDsKQEAgLTEzMjIsOCArMTMxMiw3IEBACiAJCQkJCSAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGJxMjQxNXhfZGV2aWNlICpicSA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBicTI0MTV4X2RldmljZSwKLQkJCQkJCSBjaGFyZ2VyKTsKKwlzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgKmJxID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJc3NpemVfdCByZXQgPSAwOwogCiAJcmV0ICs9IGJxMjQxNXhfc3lzZnNfcHJpbnRfcmVnKGJxLCBCUTI0MTVYX1JFR19TVEFUVVMsIGJ1ZityZXQpOwpAQCAtMTM0MSw4ICsxMzMwLDcgQEAKIAkJCQkgICAgICAgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBicTI0MTV4X2RldmljZSAqYnEgPSBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UsCi0JCQkJCQkgY2hhcmdlcik7CisJc3RydWN0IGJxMjQxNXhfZGV2aWNlICpicSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCWxvbmcgdmFsOwogCWludCByZXQ7CiAKQEAgLTEzNzMsOCArMTM2MSw3IEBACiAJCQkJCWNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgKmJxID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IGJxMjQxNXhfZGV2aWNlLAotCQkJCQkJIGNoYXJnZXIpOworCXN0cnVjdCBicTI0MTV4X2RldmljZSAqYnEgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAlpbnQgcmV0OwogCiAJaWYgKHN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJjdXJyZW50X2xpbWl0IikgPT0gMCkKQEAgLTE0MDIsOCArMTM4OSw3IEBACiAJCQkJCXNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgKmJxID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IGJxMjQxNXhfZGV2aWNlLAotCQkJCQkJIGNoYXJnZXIpOworCXN0cnVjdCBicTI0MTV4X2RldmljZSAqYnEgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAllbnVtIGJxMjQxNXhfY29tbWFuZCBjb21tYW5kOwogCWxvbmcgdmFsOwogCWludCByZXQ7CkBAIC0xNDM4LDggKzE0MjQsNyBAQAogCQkJCQkgY2hhciAqYnVmKQogewogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBicTI0MTV4X2RldmljZSAqYnEgPSBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UsCi0JCQkJCQkgY2hhcmdlcik7CisJc3RydWN0IGJxMjQxNXhfZGV2aWNlICpicSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCWVudW0gYnEyNDE1eF9jb21tYW5kIGNvbW1hbmQ7CiAJaW50IHJldDsKIApAQCAtMTUzMCwxMyArMTUxNSwxMyBAQAogCiBzdGF0aWMgaW50IGJxMjQxNXhfc3lzZnNfaW5pdChzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgKmJxKQogewotCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmJxLT5jaGFyZ2VyLmRldi0+a29iaiwKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKCZicS0+Y2hhcmdlci0+ZGV2LmtvYmosCiAJCQkmYnEyNDE1eF9zeXNmc19hdHRyX2dyb3VwKTsKIH0KIAogc3RhdGljIHZvaWQgYnEyNDE1eF9zeXNmc19leGl0KHN0cnVjdCBicTI0MTV4X2RldmljZSAqYnEpCiB7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZicS0+Y2hhcmdlci5kZXYtPmtvYmosICZicTI0MTV4X3N5c2ZzX2F0dHJfZ3JvdXApOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmYnEtPmNoYXJnZXItPmRldi5rb2JqLCAmYnEyNDE1eF9zeXNmc19hdHRyX2dyb3VwKTsKIH0KIAogLyogbWFpbiBicTI0MTV4IHByb2JlIGZ1bmN0aW9uICovCkBAIC0xNjA5LDI3ICsxNTk0LDI3IEBACiAJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksY3VycmVudC1saW1pdCIsCiAJCQkJJmJxLT5pbml0X2RhdGEuY3VycmVudF9saW1pdCk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yXzI7CisJCQlnb3RvIGVycm9yXzM7CiAJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksd2Vhay1iYXR0ZXJ5LXZvbHRhZ2UiLAogCQkJCSZicS0+aW5pdF9kYXRhLndlYWtfYmF0dGVyeV92b2x0YWdlKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfMjsKKwkJCWdvdG8gZXJyb3JfMzsKIAkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJ0aSxiYXR0ZXJ5LXJlZ3VsYXRpb24tdm9sdGFnZSIsCiAJCQkJJmJxLT5pbml0X2RhdGEuYmF0dGVyeV9yZWd1bGF0aW9uX3ZvbHRhZ2UpOwogCQlpZiAocmV0KQotCQkJZ290byBlcnJvcl8yOworCQkJZ290byBlcnJvcl8zOwogCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgInRpLGNoYXJnZS1jdXJyZW50IiwKIAkJCQkmYnEtPmluaXRfZGF0YS5jaGFyZ2VfY3VycmVudCk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yXzI7CisJCQlnb3RvIGVycm9yXzM7CiAJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGksdGVybWluYXRpb24tY3VycmVudCIsCiAJCQkJJmJxLT5pbml0X2RhdGEudGVybWluYXRpb25fY3VycmVudCk7CiAJCWlmIChyZXQpCi0JCQlnb3RvIGVycm9yXzI7CisJCQlnb3RvIGVycm9yXzM7CiAJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAidGkscmVzaXN0b3Itc2Vuc2UiLAogCQkJCSZicS0+aW5pdF9kYXRhLnJlc2lzdG9yX3NlbnNlKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gZXJyb3JfMjsKKwkJCWdvdG8gZXJyb3JfMzsKIAl9IGVsc2UgewogCQltZW1jcHkoJmJxLT5pbml0X2RhdGEsIHBkYXRhLCBzaXplb2YoYnEtPmluaXRfZGF0YSkpOwogCX0KQEAgLTE2MzksMTkgKzE2MjQsMTkgQEAKIAlyZXQgPSBicTI0MTV4X3Bvd2VyX3N1cHBseV9pbml0KGJxKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoYnEtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBwb3dlciBzdXBwbHk6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycm9yXzI7CisJCWdvdG8gZXJyb3JfMzsKIAl9CiAKIAlyZXQgPSBicTI0MTV4X3N5c2ZzX2luaXQoYnEpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihicS0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBlbnRyaWVzOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJvcl8zOworCQlnb3RvIGVycm9yXzQ7CiAJfQogCiAJcmV0ID0gYnEyNDE1eF9zZXRfZGVmYXVsdHMoYnEpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihicS0+ZGV2LCAiZmFpbGVkIHRvIHNldCBkZWZhdWx0IHZhbHVlczogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyb3JfNDsKKwkJZ290byBlcnJvcl81OwogCX0KIAogCWlmIChicS0+bm90aWZ5X3BzeSkgewpAQCAtMTY1OSw3ICsxNjQ0LDcgQEAKIAkJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ19ub3RpZmllcigmYnEtPm5iKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X2VycihicS0+ZGV2LCAiZmFpbGVkIHRvIHJlZyBub3RpZmllcjogJWRcbiIsIHJldCk7Ci0JCQlnb3RvIGVycm9yXzU7CisJCQlnb3RvIGVycm9yXzY7CiAJCX0KIAogCQkvKiBRdWVyeSBmb3IgaW5pdGlhbCByZXBvcnRlZF9tb2RlIGFuZCBzZXQgaXQgKi8KQEAgLTE2NzksMTEgKzE2NjQsMTQgQEAKIAlkZXZfaW5mbyhicS0+ZGV2LCAiZHJpdmVyIHJlZ2lzdGVyZWRcbiIpOwogCXJldHVybiAwOwogCitlcnJvcl82OgogZXJyb3JfNToKLWVycm9yXzQ6CiAJYnEyNDE1eF9zeXNmc19leGl0KGJxKTsKLWVycm9yXzM6CitlcnJvcl80OgogCWJxMjQxNXhfcG93ZXJfc3VwcGx5X2V4aXQoYnEpOworZXJyb3JfMzoKKwlpZiAoYnEtPm5vdGlmeV9wc3kpCisJCXBvd2VyX3N1cHBseV9wdXQoYnEtPm5vdGlmeV9wc3kpOwogZXJyb3JfMjoKIAlrZnJlZShuYW1lKTsKIGVycm9yXzE6CkBAIC0xNzAwLDggKzE2ODgsMTAgQEAKIHsKIAlzdHJ1Y3QgYnEyNDE1eF9kZXZpY2UgKmJxID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQlpZiAoYnEtPm5vdGlmeV9wc3kpCisJaWYgKGJxLT5ub3RpZnlfcHN5KSB7CiAJCXBvd2VyX3N1cHBseV91bnJlZ19ub3RpZmllcigmYnEtPm5iKTsKKwkJcG93ZXJfc3VwcGx5X3B1dChicS0+bm90aWZ5X3BzeSk7CisJfQogCiAJYnEyNDE1eF9zeXNmc19leGl0KGJxKTsKIAlicTI0MTV4X3Bvd2VyX3N1cHBseV9leGl0KGJxKTsKQEAgLTE3MzEsNiArMTcyMSw3IEBACiAJeyAiYnEyNDE1NSIsIEJRMjQxNTUgfSwKIAl7ICJicTI0MTU2IiwgQlEyNDE1NiB9LAogCXsgImJxMjQxNTZhIiwgQlEyNDE1NkEgfSwKKwl7ICJicTI0MTU3cyIsIEJRMjQxNTdTIH0sCiAJeyAiYnEyNDE1OCIsIEJRMjQxNTggfSwKIAl7fSwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2JxMjQxOTBfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9icTI0MTkwX2NoYXJnZXIuYwppbmRleCBkMGU4MjM2Li40MDdjNGFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2JxMjQxOTBfY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvYnEyNDE5MF9jaGFyZ2VyLmMKQEAgLTE1Miw4ICsxNTIsOCBAQAogc3RydWN0IGJxMjQxOTBfZGV2X2luZm8gewogCXN0cnVjdCBpMmNfY2xpZW50CQkqY2xpZW50OwogCXN0cnVjdCBkZXZpY2UJCQkqZGV2OwotCXN0cnVjdCBwb3dlcl9zdXBwbHkJCWNoYXJnZXI7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseQkJYmF0dGVyeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CQkqY2hhcmdlcjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CQkqYmF0dGVyeTsKIAljaGFyCQkJCW1vZGVsX25hbWVbSTJDX05BTUVfU0laRV07CiAJa2VybmVsX3Vsb25nX3QJCQltb2RlbDsKIAl1bnNpZ25lZCBpbnQJCQlncGlvX2ludDsKQEAgLTQyMyw4ICs0MjMsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBicTI0MTkwX2Rldl9pbmZvICpiZGkgPQotCQkJY29udGFpbmVyX29mKHBzeSwgc3RydWN0IGJxMjQxOTBfZGV2X2luZm8sIGNoYXJnZXIpOworCXN0cnVjdCBicTI0MTkwX2Rldl9pbmZvICpiZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAlzdHJ1Y3QgYnEyNDE5MF9zeXNmc19maWVsZF9pbmZvICppbmZvOwogCWludCByZXQ7CiAJdTggdjsKQEAgLTQ0NCw4ICs0NDMsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IGJxMjQxOTBfZGV2X2luZm8gKmJkaSA9Ci0JCQljb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgYnEyNDE5MF9kZXZfaW5mbywgY2hhcmdlcik7CisJc3RydWN0IGJxMjQxOTBfZGV2X2luZm8gKmJkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCXN0cnVjdCBicTI0MTkwX3N5c2ZzX2ZpZWxkX2luZm8gKmluZm87CiAJaW50IHJldDsKIAl1OCB2OwpAQCAtNDY5LDEzICs0NjcsMTMgQEAKIHsKIAlicTI0MTkwX3N5c2ZzX2luaXRfYXR0cnMoKTsKIAotCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmJkaS0+Y2hhcmdlci5kZXYtPmtvYmosCisJcmV0dXJuIHN5c2ZzX2NyZWF0ZV9ncm91cCgmYmRpLT5jaGFyZ2VyLT5kZXYua29iaiwKIAkJCSZicTI0MTkwX3N5c2ZzX2F0dHJfZ3JvdXApOwogfQogCiBzdGF0aWMgdm9pZCBicTI0MTkwX3N5c2ZzX3JlbW92ZV9ncm91cChzdHJ1Y3QgYnEyNDE5MF9kZXZfaW5mbyAqYmRpKQogewotCXN5c2ZzX3JlbW92ZV9ncm91cCgmYmRpLT5jaGFyZ2VyLmRldi0+a29iaiwgJmJxMjQxOTBfc3lzZnNfYXR0cl9ncm91cCk7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZiZGktPmNoYXJnZXItPmRldi5rb2JqLCAmYnEyNDE5MF9zeXNmc19hdHRyX2dyb3VwKTsKIH0KICNlbHNlCiBzdGF0aWMgaW50IGJxMjQxOTBfc3lzZnNfY3JlYXRlX2dyb3VwKHN0cnVjdCBicTI0MTkwX2Rldl9pbmZvICpiZGkpCkBAIC04MDcsOCArODA1LDcgQEAKIHN0YXRpYyBpbnQgYnEyNDE5MF9jaGFyZ2VyX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCiAJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgYnEyNDE5MF9kZXZfaW5mbyAqYmRpID0KLQkJCWNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBicTI0MTkwX2Rldl9pbmZvLCBjaGFyZ2VyKTsKKwlzdHJ1Y3QgYnEyNDE5MF9kZXZfaW5mbyAqYmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJaW50IHJldDsKIAogCWRldl9kYmcoYmRpLT5kZXYsICJwcm9wOiAlZFxuIiwgcHNwKTsKQEAgLTg2MSw4ICs4NTgsNyBAQAogCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCWNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IGJxMjQxOTBfZGV2X2luZm8gKmJkaSA9Ci0JCQljb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgYnEyNDE5MF9kZXZfaW5mbywgY2hhcmdlcik7CisJc3RydWN0IGJxMjQxOTBfZGV2X2luZm8gKmJkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCWludCByZXQ7CiAKIAlkZXZfZGJnKGJkaS0+ZGV2LCAicHJvcDogJWRcbiIsIHBzcCk7CkBAIC05MjIsMTggKzkxOCwxNSBAQAogCSJtYWluLWJhdHRlcnkiLAogfTsKIAotc3RhdGljIHZvaWQgYnEyNDE5MF9jaGFyZ2VyX2luaXQoc3RydWN0IHBvd2VyX3N1cHBseSAqY2hhcmdlcikKLXsKLQljaGFyZ2VyLT5uYW1lID0gImJxMjQxOTAtY2hhcmdlciI7Ci0JY2hhcmdlci0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQjsKLQljaGFyZ2VyLT5wcm9wZXJ0aWVzID0gYnEyNDE5MF9jaGFyZ2VyX3Byb3BlcnRpZXM7Ci0JY2hhcmdlci0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGJxMjQxOTBfY2hhcmdlcl9wcm9wZXJ0aWVzKTsKLQljaGFyZ2VyLT5zdXBwbGllZF90byA9IGJxMjQxOTBfY2hhcmdlcl9zdXBwbGllZF90bzsKLQljaGFyZ2VyLT5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKGJxMjQxOTBfY2hhcmdlcl9zdXBwbGllZF90byk7Ci0JY2hhcmdlci0+Z2V0X3Byb3BlcnR5ID0gYnEyNDE5MF9jaGFyZ2VyX2dldF9wcm9wZXJ0eTsKLQljaGFyZ2VyLT5zZXRfcHJvcGVydHkgPSBicTI0MTkwX2NoYXJnZXJfc2V0X3Byb3BlcnR5OwotCWNoYXJnZXItPnByb3BlcnR5X2lzX3dyaXRlYWJsZSA9IGJxMjQxOTBfY2hhcmdlcl9wcm9wZXJ0eV9pc193cml0ZWFibGU7Ci19CitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGJxMjQxOTBfY2hhcmdlcl9kZXNjID0geworCS5uYW1lCQkJPSAiYnEyNDE5MC1jaGFyZ2VyIiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCLAorCS5wcm9wZXJ0aWVzCQk9IGJxMjQxOTBfY2hhcmdlcl9wcm9wZXJ0aWVzLAorCS5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKGJxMjQxOTBfY2hhcmdlcl9wcm9wZXJ0aWVzKSwKKwkuZ2V0X3Byb3BlcnR5CQk9IGJxMjQxOTBfY2hhcmdlcl9nZXRfcHJvcGVydHksCisJLnNldF9wcm9wZXJ0eQkJPSBicTI0MTkwX2NoYXJnZXJfc2V0X3Byb3BlcnR5LAorCS5wcm9wZXJ0eV9pc193cml0ZWFibGUJPSBicTI0MTkwX2NoYXJnZXJfcHJvcGVydHlfaXNfd3JpdGVhYmxlLAorfTsKIAogLyogQmF0dGVyeSBwb3dlciBzdXBwbHkgcHJvcGVydHkgcm91dGluZXMgKi8KIApAQCAtMTEwMiw4ICsxMDk1LDcgQEAKIHN0YXRpYyBpbnQgYnEyNDE5MF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCiAJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgYnEyNDE5MF9kZXZfaW5mbyAqYmRpID0KLQkJCWNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBicTI0MTkwX2Rldl9pbmZvLCBiYXR0ZXJ5KTsKKwlzdHJ1Y3QgYnEyNDE5MF9kZXZfaW5mbyAqYmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJaW50IHJldDsKIAogCWRldl9kYmcoYmRpLT5kZXYsICJwcm9wOiAlZFxuIiwgcHNwKTsKQEAgLTExNDQsOCArMTEzNiw3IEBACiAJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJY29uc3QgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgYnEyNDE5MF9kZXZfaW5mbyAqYmRpID0KLQkJCWNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBicTI0MTkwX2Rldl9pbmZvLCBiYXR0ZXJ5KTsKKwlzdHJ1Y3QgYnEyNDE5MF9kZXZfaW5mbyAqYmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJaW50IHJldDsKIAogCWRldl9kYmcoYmRpLT5kZXYsICJwcm9wOiAlZFxuIiwgcHNwKTsKQEAgLTExOTMsMTYgKzExODQsMTUgQEAKIAlQT1dFUl9TVVBQTFlfUFJPUF9TQ09QRSwKIH07CiAKLXN0YXRpYyB2b2lkIGJxMjQxOTBfYmF0dGVyeV9pbml0KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRlcnkpCi17Ci0JYmF0dGVyeS0+bmFtZSA9ICJicTI0MTkwLWJhdHRlcnkiOwotCWJhdHRlcnktPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCWJhdHRlcnktPnByb3BlcnRpZXMgPSBicTI0MTkwX2JhdHRlcnlfcHJvcGVydGllczsKLQliYXR0ZXJ5LT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoYnEyNDE5MF9iYXR0ZXJ5X3Byb3BlcnRpZXMpOwotCWJhdHRlcnktPmdldF9wcm9wZXJ0eSA9IGJxMjQxOTBfYmF0dGVyeV9nZXRfcHJvcGVydHk7Ci0JYmF0dGVyeS0+c2V0X3Byb3BlcnR5ID0gYnEyNDE5MF9iYXR0ZXJ5X3NldF9wcm9wZXJ0eTsKLQliYXR0ZXJ5LT5wcm9wZXJ0eV9pc193cml0ZWFibGUgPSBicTI0MTkwX2JhdHRlcnlfcHJvcGVydHlfaXNfd3JpdGVhYmxlOwotfQorc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBicTI0MTkwX2JhdHRlcnlfZGVzYyA9IHsKKwkubmFtZQkJCT0gImJxMjQxOTAtYmF0dGVyeSIsCisJLnR5cGUJCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCisJLnByb3BlcnRpZXMJCT0gYnEyNDE5MF9iYXR0ZXJ5X3Byb3BlcnRpZXMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUoYnEyNDE5MF9iYXR0ZXJ5X3Byb3BlcnRpZXMpLAorCS5nZXRfcHJvcGVydHkJCT0gYnEyNDE5MF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eSwKKwkuc2V0X3Byb3BlcnR5CQk9IGJxMjQxOTBfYmF0dGVyeV9zZXRfcHJvcGVydHksCisJLnByb3BlcnR5X2lzX3dyaXRlYWJsZQk9IGJxMjQxOTBfYmF0dGVyeV9wcm9wZXJ0eV9pc193cml0ZWFibGUsCit9OwogCiBzdGF0aWMgaXJxcmV0dXJuX3QgYnEyNDE5MF9pcnFfaGFuZGxlcl90aHJlYWQoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKQEAgLTEyNjksOCArMTI1OSw4IEBACiAJICogaW50ZXJydXB0IHJlY2VpdmVkKS4KIAkgKi8KIAlpZiAoYWxlcnRfdXNlcnNwYWNlICYmICFiZGktPmZpcnN0X3RpbWUpIHsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmJkaS0+Y2hhcmdlcik7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZiZGktPmJhdHRlcnkpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChiZGktPmNoYXJnZXIpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChiZGktPmJhdHRlcnkpOwogCQliZGktPmZpcnN0X3RpbWUgPSBmYWxzZTsKIAl9CiAKQEAgLTEzNjIsNiArMTM1Miw3IEBACiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyID0gdG9faTJjX2FkYXB0ZXIoY2xpZW50LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY2xpZW50LT5kZXY7CiAJc3RydWN0IGJxMjQxOTBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIGNoYXJnZXJfY2ZnID0ge30sIGJhdHRlcnlfY2ZnID0ge307CiAJc3RydWN0IGJxMjQxOTBfZGV2X2luZm8gKmJkaTsKIAlpbnQgcmV0OwogCkBAIC0xNDE2LDE5ICsxNDA3LDIzIEBACiAJCWdvdG8gb3V0MjsKIAl9CiAKLQlicTI0MTkwX2NoYXJnZXJfaW5pdCgmYmRpLT5jaGFyZ2VyKTsKLQotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkZXYsICZiZGktPmNoYXJnZXIpOwotCWlmIChyZXQpIHsKKwljaGFyZ2VyX2NmZy5kcnZfZGF0YSA9IGJkaTsKKwljaGFyZ2VyX2NmZy5zdXBwbGllZF90byA9IGJxMjQxOTBfY2hhcmdlcl9zdXBwbGllZF90bzsKKwljaGFyZ2VyX2NmZy5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKGJxMjQxOTBfY2hhcmdlcl9zdXBwbGllZF90byksCisJYmRpLT5jaGFyZ2VyID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRldiwgJmJxMjQxOTBfY2hhcmdlcl9kZXNjLAorCQkJCQkJJmNoYXJnZXJfY2ZnKTsKKwlpZiAoSVNfRVJSKGJkaS0+Y2hhcmdlcikpIHsKIAkJZGV2X2VycihkZXYsICJDYW4ndCByZWdpc3RlciBjaGFyZ2VyXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihiZGktPmNoYXJnZXIpOwogCQlnb3RvIG91dDI7CiAJfQogCi0JYnEyNDE5MF9iYXR0ZXJ5X2luaXQoJmJkaS0+YmF0dGVyeSk7Ci0KLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGV2LCAmYmRpLT5iYXR0ZXJ5KTsKLQlpZiAocmV0KSB7CisJYmF0dGVyeV9jZmcuZHJ2X2RhdGEgPSBiZGk7CisJYmRpLT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRldiwgJmJxMjQxOTBfYmF0dGVyeV9kZXNjLAorCQkJCQkJJmJhdHRlcnlfY2ZnKTsKKwlpZiAoSVNfRVJSKGJkaS0+YmF0dGVyeSkpIHsKIAkJZGV2X2VycihkZXYsICJDYW4ndCByZWdpc3RlciBiYXR0ZXJ5XG4iKTsKKwkJcmV0ID0gUFRSX0VSUihiZGktPmJhdHRlcnkpOwogCQlnb3RvIG91dDM7CiAJfQogCkBAIC0xNDQxLDkgKzE0MzYsOSBAQAogCXJldHVybiAwOwogCiBvdXQ0OgotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZiZGktPmJhdHRlcnkpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGJkaS0+YmF0dGVyeSk7CiBvdXQzOgotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZiZGktPmNoYXJnZXIpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGJkaS0+Y2hhcmdlcik7CiBvdXQyOgogCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOwogb3V0MToKQEAgLTE0NjIsOCArMTQ1Nyw4IEBACiAJcG1fcnVudGltZV9wdXRfc3luYyhiZGktPmRldik7CiAKIAlicTI0MTkwX3N5c2ZzX3JlbW92ZV9ncm91cChiZGkpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZiZGktPmJhdHRlcnkpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZiZGktPmNoYXJnZXIpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGJkaS0+YmF0dGVyeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYmRpLT5jaGFyZ2VyKTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoYmRpLT5kZXYpOwogCiAJaWYgKGJkaS0+Z3Bpb19pbnQpCkBAIC0xNDk5LDggKzE0OTQsOCBAQAogCXBtX3J1bnRpbWVfcHV0X3N5bmMoYmRpLT5kZXYpOwogCiAJLyogVGhpbmdzIG1heSBoYXZlIGNoYW5nZWQgd2hpbGUgc3VzcGVuZGVkIHNvIGFsZXJ0IHVwcGVyIGxheWVyICovCi0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmJkaS0+Y2hhcmdlcik7Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmJkaS0+YmF0dGVyeSk7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoYmRpLT5jaGFyZ2VyKTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChiZGktPmJhdHRlcnkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2JxMjQ3MzUtY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9icTI0NzM1LWNoYXJnZXIuYwppbmRleCBkMDIyYjgyLi45NjFhMTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2JxMjQ3MzUtY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvYnEyNDczNS1jaGFyZ2VyLmMKQEAgLTQ0LDE0ICs0NCwxNSBAQAogI2RlZmluZSBCUTI0NzM1X0RFVklDRV9JRAkJMHhmZgogCiBzdHJ1Y3QgYnEyNDczNSB7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseQljaGFyZ2VyOwotCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7Ci0Jc3RydWN0IGJxMjQ3MzVfcGxhdGZvcm0JKnBkYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHkJCSpjaGFyZ2VyOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYwljaGFyZ2VyX2Rlc2M7CisJc3RydWN0IGkyY19jbGllbnQJCSpjbGllbnQ7CisJc3RydWN0IGJxMjQ3MzVfcGxhdGZvcm0JCSpwZGF0YTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGJxMjQ3MzUgKnRvX2JxMjQ3MzUoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQogewotCXJldHVybiBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgYnEyNDczNSwgY2hhcmdlcik7CisJcmV0dXJuIHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogfQogCiBzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgYnEyNDczNV9jaGFyZ2VyX3Byb3BlcnRpZXNbXSA9IHsKQEAgLTE5Miw5ICsxOTMsNyBAQAogCQkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IGJxMjQ3MzUgKmNoYXJnZXI7Ci0KLQljaGFyZ2VyID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IGJxMjQ3MzUsIGNoYXJnZXIpOworCXN0cnVjdCBicTI0NzM1ICpjaGFyZ2VyID0gdG9fYnEyNDczNShwc3kpOwogCiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKQEAgLTI0OCw3ICsyNDcsOCBAQAogewogCWludCByZXQ7CiAJc3RydWN0IGJxMjQ3MzUgKmNoYXJnZXI7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqc3VwcGx5OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqc3VwcGx5X2Rlc2M7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCWNoYXIgKm5hbWU7CiAKIAljaGFyZ2VyID0gZGV2bV9remFsbG9jKCZjbGllbnQtPmRldiwgc2l6ZW9mKCpjaGFyZ2VyKSwgR0ZQX0tFUk5FTCk7CkBAIC0yNzcsMTYgKzI3NywxOCBAQAogCiAJY2hhcmdlci0+Y2xpZW50ID0gY2xpZW50OwogCi0Jc3VwcGx5ID0gJmNoYXJnZXItPmNoYXJnZXI7CisJc3VwcGx5X2Rlc2MgPSAmY2hhcmdlci0+Y2hhcmdlcl9kZXNjOwogCi0Jc3VwcGx5LT5uYW1lID0gbmFtZTsKLQlzdXBwbHktPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKLQlzdXBwbHktPnByb3BlcnRpZXMgPSBicTI0NzM1X2NoYXJnZXJfcHJvcGVydGllczsKLQlzdXBwbHktPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShicTI0NzM1X2NoYXJnZXJfcHJvcGVydGllcyk7Ci0Jc3VwcGx5LT5nZXRfcHJvcGVydHkgPSBicTI0NzM1X2NoYXJnZXJfZ2V0X3Byb3BlcnR5OwotCXN1cHBseS0+c3VwcGxpZWRfdG8gPSBjaGFyZ2VyLT5wZGF0YS0+c3VwcGxpZWRfdG87Ci0Jc3VwcGx5LT5udW1fc3VwcGxpY2FudHMgPSBjaGFyZ2VyLT5wZGF0YS0+bnVtX3N1cHBsaWNhbnRzOwotCXN1cHBseS0+b2Zfbm9kZSA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7CisJc3VwcGx5X2Rlc2MtPm5hbWUgPSBuYW1lOworCXN1cHBseV9kZXNjLT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7CisJc3VwcGx5X2Rlc2MtPnByb3BlcnRpZXMgPSBicTI0NzM1X2NoYXJnZXJfcHJvcGVydGllczsKKwlzdXBwbHlfZGVzYy0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGJxMjQ3MzVfY2hhcmdlcl9wcm9wZXJ0aWVzKTsKKwlzdXBwbHlfZGVzYy0+Z2V0X3Byb3BlcnR5ID0gYnEyNDczNV9jaGFyZ2VyX2dldF9wcm9wZXJ0eTsKKworCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBjaGFyZ2VyLT5wZGF0YS0+c3VwcGxpZWRfdG87CisJcHN5X2NmZy5udW1fc3VwcGxpY2FudHMgPSBjaGFyZ2VyLT5wZGF0YS0+bnVtX3N1cHBsaWNhbnRzOworCXBzeV9jZmcub2Zfbm9kZSA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7CisJcHN5X2NmZy5kcnZfZGF0YSA9IGNoYXJnZXI7CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBjaGFyZ2VyKTsKIApAQCAtMzQxLDggKzM0MywxMCBAQAogCQl9CiAJfQogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgc3VwcGx5KTsKLQlpZiAocmV0IDwgMCkgeworCWNoYXJnZXItPmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBzdXBwbHlfZGVzYywKKwkJCQkJCSAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihjaGFyZ2VyLT5jaGFyZ2VyKSkgeworCQlyZXQgPSBQVFJfRVJSKGNoYXJnZXItPmNoYXJnZXIpOwogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBwb3dlciBzdXBwbHk6ICVkXG4iLAogCQkJcmV0KTsKIAkJZ290byBlcnJfZnJlZV9uYW1lOwpAQCAtMzU0LDcgKzM1OCw4IEBACiAJCQkJCQlJUlFGX1RSSUdHRVJfUklTSU5HIHwKIAkJCQkJCUlSUUZfVFJJR0dFUl9GQUxMSU5HIHwKIAkJCQkJCUlSUUZfT05FU0hPVCwKLQkJCQkJCXN1cHBseS0+bmFtZSwgc3VwcGx5KTsKKwkJCQkJCXN1cHBseV9kZXNjLT5uYW1lLAorCQkJCQkJY2hhcmdlci0+Y2hhcmdlcik7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAogCQkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgSVJRICVkIGVyciAlZFxuIiwKQEAgLTM2NSw3ICszNzAsNyBAQAogCiAJcmV0dXJuIDA7CiBlcnJfdW5yZWdpc3Rlcl9zdXBwbHk6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoc3VwcGx5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihjaGFyZ2VyLT5jaGFyZ2VyKTsKIGVycl9mcmVlX25hbWU6CiAJaWYgKG5hbWUgIT0gY2hhcmdlci0+cGRhdGEtPm5hbWUpCiAJCWtmcmVlKG5hbWUpOwpAQCAtMzgxLDEwICszODYsMTAgQEAKIAkJZGV2bV9mcmVlX2lycSgmY2hhcmdlci0+Y2xpZW50LT5kZXYsIGNoYXJnZXItPmNsaWVudC0+aXJxLAogCQkJICAgICAgJmNoYXJnZXItPmNoYXJnZXIpOwogCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmNoYXJnZXItPmNoYXJnZXIpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGNoYXJnZXItPmNoYXJnZXIpOwogCi0JaWYgKGNoYXJnZXItPmNoYXJnZXIubmFtZSAhPSBjaGFyZ2VyLT5wZGF0YS0+bmFtZSkKLQkJa2ZyZWUoY2hhcmdlci0+Y2hhcmdlci5uYW1lKTsKKwlpZiAoY2hhcmdlci0+Y2hhcmdlcl9kZXNjLm5hbWUgIT0gY2hhcmdlci0+cGRhdGEtPm5hbWUpCisJCWtmcmVlKGNoYXJnZXItPmNoYXJnZXJfZGVzYy5uYW1lKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9icTI3eDAwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvYnEyN3gwMF9iYXR0ZXJ5LmMKaW5kZXggYjcyYmE3Yy4uYTU3NDMzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9icTI3eDAwX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL2JxMjd4MDBfYmF0dGVyeS5jCkBAIC0xNiwxNCArMTYsMTIgQEAKICAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVECiAgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCiAgKgotICovCi0KLS8qCiAgKiBEYXRhc2hlZXRzOgogICogaHR0cDovL2ZvY3VzLnRpLmNvbS9kb2NzL3Byb2QvZm9sZGVycy9wcmludC9icTI3MDAwLmh0bWwKICAqIGh0dHA6Ly9mb2N1cy50aS5jb20vZG9jcy9wcm9kL2ZvbGRlcnMvcHJpbnQvYnEyNzUwMC5odG1sCiAgKiBodHRwOi8vd3d3LnRpLmNvbS9wcm9kdWN0L2JxMjc0MjUtZzEKICAqIGh0dHA6Ly93d3cudGkuY29tL3Byb2R1Y3QvQlEyNzc0Mi1HMQorICogaHR0cDovL3d3dy50aS5jb20vcHJvZHVjdC9CUTI3NTEwLUczCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgpAQCAtNzQsNiArNzIsMTAgQEAKIAogI2RlZmluZSBCUTI3NzQyX1BPV0VSX0FWRwkJMHg3NgogCisjZGVmaW5lIEJRMjc1MTBfUkVHX1NPQwkJCTB4MjAKKyNkZWZpbmUgQlEyNzUxMF9SRUdfRENBUAkJMHgyRSAvKiBEZXNpZ24gY2FwYWNpdHkgKi8KKyNkZWZpbmUgQlEyNzUxMF9SRUdfQ1lDVAkJMHgxRSAvKiBDeWNsZSBjb3VudCB0b3RhbCAqLworCiAvKiBicTI3NDI1IHJlZ2lzdGVyIGFkZHJlc3NlcyBhcmUgc2FtZSBhcyBicTI3eDAwIGFkZHJlc3NlcyBtaW51cyA0ICovCiAjZGVmaW5lIEJRMjc0MjVfUkVHX09GRlNFVAkJMHgwNAogI2RlZmluZSBCUTI3NDI1X1JFR19TT0MJCSgweDFDICsgQlEyNzQyNV9SRUdfT0ZGU0VUKQpAQCAtODcsNyArODksNyBAQAogCWludCAoKnJlYWQpKHN0cnVjdCBicTI3eDAwX2RldmljZV9pbmZvICpkaSwgdTggcmVnLCBib29sIHNpbmdsZSk7CiB9OwogCi1lbnVtIGJxMjd4MDBfY2hpcCB7IEJRMjcwMDAsIEJRMjc1MDAsIEJRMjc0MjUsIEJRMjc3NDJ9OworZW51bSBicTI3eDAwX2NoaXAgeyBCUTI3MDAwLCBCUTI3NTAwLCBCUTI3NDI1LCBCUTI3NzQyLCBCUTI3NTEwfTsKIAogc3RydWN0IGJxMjd4MDBfcmVnX2NhY2hlIHsKIAlpbnQgdGVtcGVyYXR1cmU7CkBAIC0xMTQsNyArMTE2LDcgQEAKIAl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAotCXN0cnVjdCBwb3dlcl9zdXBwbHkJYmF0OworCXN0cnVjdCBwb3dlcl9zdXBwbHkJKmJhdDsKIAogCXN0cnVjdCBicTI3eDAwX2FjY2Vzc19tZXRob2RzIGJ1czsKIApAQCAtMTc0LDYgKzE3NiwyNCBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKIH07CiAKK3N0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBicTI3NTEwX2JhdHRlcnlfcHJvcHNbXSA9IHsKKwlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWV9MRVZFTCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RJTUVfVE9fRU1QVFlfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTEwsCisJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTF9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQsCisJUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSCwKK307CisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcG9sbF9pbnRlcnZhbCA9IDM2MDsKIG1vZHVsZV9wYXJhbShwb2xsX2ludGVydmFsLCB1aW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocG9sbF9pbnRlcnZhbCwgImJhdHRlcnkgcG9sbCBpbnRlcnZhbCBpbiBzZWNvbmRzIC0gIiBcCkBAIC0xOTgsNyArMjE4LDggQEAKICAqLwogc3RhdGljIGJvb2wgYnEyN3h4eF9pc19jaGlwX3ZlcnNpb25faGlnaGVyKHN0cnVjdCBicTI3eDAwX2RldmljZV9pbmZvICpkaSkKIHsKLQlpZiAoZGktPmNoaXAgPT0gQlEyNzQyNSB8fCBkaS0+Y2hpcCA9PSBCUTI3NTAwIHx8IGRpLT5jaGlwID09IEJRMjc3NDIpCisJaWYgKGRpLT5jaGlwID09IEJRMjc0MjUgfHwgZGktPmNoaXAgPT0gQlEyNzUwMCB8fCBkaS0+Y2hpcCA9PSBCUTI3NzQyCisJICAgIHx8IGRpLT5jaGlwID09IEJRMjc1MTApCiAJCXJldHVybiB0cnVlOwogCXJldHVybiBmYWxzZTsKIH0KQEAgLTIxMyw2ICsyMzQsOCBAQAogCiAJaWYgKGRpLT5jaGlwID09IEJRMjc1MDAgfHwgZGktPmNoaXAgPT0gQlEyNzc0MikKIAkJcnNvYyA9IGJxMjd4MDBfcmVhZChkaSwgQlEyNzUwMF9SRUdfU09DLCBmYWxzZSk7CisJZWxzZSBpZiAoZGktPmNoaXAgPT0gQlEyNzUxMCkKKwkJcnNvYyA9IGJxMjd4MDBfcmVhZChkaSwgQlEyNzUxMF9SRUdfU09DLCBmYWxzZSk7CiAJZWxzZSBpZiAoZGktPmNoaXAgPT0gQlEyNzQyNSkKIAkJcnNvYyA9IGJxMjd4MDBfcmVhZChkaSwgQlEyNzQyNV9SRUdfU09DLCBmYWxzZSk7CiAJZWxzZQpAQCAtMjg2LDYgKzMwOSw4IEBACiAJaWYgKGJxMjd4eHhfaXNfY2hpcF92ZXJzaW9uX2hpZ2hlcihkaSkpIHsKIAkJaWYgKGRpLT5jaGlwID09IEJRMjc0MjUpCiAJCQlpbG1kID0gYnEyN3gwMF9yZWFkKGRpLCBCUTI3NDI1X1JFR19EQ0FQLCBmYWxzZSk7CisJCWVsc2UgaWYgKGRpLT5jaGlwID09IEJRMjc1MTApCisJCQlpbG1kID0gYnEyN3gwMF9yZWFkKGRpLCBCUTI3NTEwX1JFR19EQ0FQLCBmYWxzZSk7CiAJCWVsc2UKIAkJCWlsbWQgPSBicTI3eDAwX3JlYWQoZGksIEJRMjc1MDBfUkVHX0RDQVAsIGZhbHNlKTsKIAl9IGVsc2UKQEAgLTM1NCw3ICszNzksMTAgQEAKIHsKIAlpbnQgY3ljdDsKIAotCWN5Y3QgPSBicTI3eDAwX3JlYWQoZGksIEJRMjd4MDBfUkVHX0NZQ1QsIGZhbHNlKTsKKwlpZiAoZGktPmNoaXAgPT0gQlEyNzUxMCkKKwkJY3ljdCA9IGJxMjd4MDBfcmVhZChkaSwgQlEyNzUxMF9SRUdfQ1lDVCwgZmFsc2UpOworCWVsc2UKKwkJY3ljdCA9IGJxMjd4MDBfcmVhZChkaSwgQlEyN3gwMF9SRUdfQ1lDVCwgZmFsc2UpOwogCWlmIChjeWN0IDwgMCkKIAkJZGV2X2VycihkaS0+ZGV2LCAiZXJyb3IgcmVhZGluZyBjeWNsZSBjb3VudCB0b3RhbFxuIik7CiAKQEAgLTQyNSw2ICs0NTMsMTAgQEAKIAkJZWxzZQogCQkJdHZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKIAkJcmV0dXJuIHR2YWw7CisJfSBlbHNlIGlmIChkaS0+Y2hpcCA9PSBCUTI3NTEwKSB7CisJCWlmICh0dmFsICYgQlEyNzUwMF9GTEFHX09UQykKKwkJCXJldHVybiBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJIRUFUOworCQlyZXR1cm4gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOwogCX0gZWxzZSB7CiAJCWlmICh0dmFsICYgQlEyNzAwMF9GTEFHX0VEVjEpCiAJCQl0dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOwpAQCAtNDQwLDYgKzQ3Miw3IEBACiB7CiAJc3RydWN0IGJxMjd4MDBfcmVnX2NhY2hlIGNhY2hlID0gezAsIH07CiAJYm9vbCBpc19icTI3NTAwID0gZGktPmNoaXAgPT0gQlEyNzUwMDsKKwlib29sIGlzX2JxMjc1MTAgPSBkaS0+Y2hpcCA9PSBCUTI3NTEwOwogCWJvb2wgaXNfYnEyNzQyNSA9IGRpLT5jaGlwID09IEJRMjc0MjU7CiAJYm9vbCBpc19icTI3NzQyID0gZGktPmNoaXAgPT0gQlEyNzc0MjsKIAlib29sIGZsYWdzXzFiID0gIShpc19icTI3NTAwIHx8IGlzX2JxMjc3NDIpOwpAQCAtNDQ5LDcgKzQ4Miw3IEBACiAJCS8qIHJlYWQgZXJyb3IgKi8KIAkJY2FjaGUuZmxhZ3MgPSAtMTsKIAlpZiAoY2FjaGUuZmxhZ3MgPj0gMCkgewotCQlpZiAoIWlzX2JxMjc1MDAgJiYgIWlzX2JxMjc0MjUgJiYgIWlzX2JxMjc3NDIKKwkJaWYgKCFpc19icTI3NTAwICYmICFpc19icTI3NDI1ICYmICFpc19icTI3NzQyICYmICFpc19icTI3NTEwCiAJCQkJJiYgKGNhY2hlLmZsYWdzICYgQlEyNzAwMF9GTEFHX0NJKSkgewogCQkJZGV2X2luZm8oZGktPmRldiwgImJhdHRlcnkgaXMgbm90IGNhbGlicmF0ZWQhIGlnbm9yaW5nIGNhcGFjaXR5IHZhbHVlc1xuIik7CiAJCQljYWNoZS5jYXBhY2l0eSA9IC1FTk9EQVRBOwpAQCAtNDYxLDcgKzQ5NCw3IEBACiAJCQljYWNoZS5oZWFsdGggPSAtRU5PREFUQTsKIAkJfSBlbHNlIHsKIAkJCWNhY2hlLmNhcGFjaXR5ID0gYnEyN3gwMF9iYXR0ZXJ5X3JlYWRfcnNvYyhkaSk7Ci0JCQlpZiAoaXNfYnEyNzc0MikKKwkJCWlmIChpc19icTI3NzQyIHx8IGlzX2JxMjc1MTApCiAJCQkJY2FjaGUudGltZV90b19lbXB0eSA9CiAJCQkJCWJxMjd4MDBfYmF0dGVyeV9yZWFkX3RpbWUoZGksCiAJCQkJCQkJQlEyN3gwMF9SRUdfVFRFKTsKQEAgLTQ5OCw3ICs1MzEsNyBAQAogCX0KIAogCWlmIChkaS0+Y2FjaGUuY2FwYWNpdHkgIT0gY2FjaGUuY2FwYWNpdHkpCi0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZkaS0+YmF0KTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJhdCk7CiAKIAlpZiAobWVtY21wKCZkaS0+Y2FjaGUsICZjYWNoZSwgc2l6ZW9mKGNhY2hlKSkgIT0gMCkKIAkJZGktPmNhY2hlID0gY2FjaGU7CkBAIC01NzAsNyArNjAzLDcgQEAKIAkJCXN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKIAkJZWxzZSBpZiAoZGktPmNhY2hlLmZsYWdzICYgQlEyNzAwMF9GTEFHX0NIR1MpCiAJCQlzdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwotCQllbHNlIGlmIChwb3dlcl9zdXBwbHlfYW1faV9zdXBwbGllZCgmZGktPmJhdCkpCisJCWVsc2UgaWYgKHBvd2VyX3N1cHBseV9hbV9pX3N1cHBsaWVkKGRpLT5iYXQpKQogCQkJc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CiAJCWVsc2UKIAkJCXN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CkBAIC02NDIsMTUgKzY3NSwxMiBAQAogCXJldHVybiAwOwogfQogCi0jZGVmaW5lIHRvX2JxMjd4MDBfZGV2aWNlX2luZm8oeCkgY29udGFpbmVyX29mKCh4KSwgXAotCQkJCXN0cnVjdCBicTI3eDAwX2RldmljZV9pbmZvLCBiYXQpOwotCiBzdGF0aWMgaW50IGJxMjd4MDBfYmF0dGVyeV9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAogCQkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IGJxMjd4MDBfZGV2aWNlX2luZm8gKmRpID0gdG9fYnEyN3gwMF9kZXZpY2VfaW5mbyhwc3kpOworCXN0cnVjdCBicTI3eDAwX2RldmljZV9pbmZvICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJbXV0ZXhfbG9jaygmZGktPmxvY2spOwogCWlmICh0aW1lX2lzX2JlZm9yZV9qaWZmaWVzKGRpLT5sYXN0X3VwZGF0ZSArIDUgKiBIWikpIHsKQEAgLTcyOCwzNSArNzU4LDQ3IEBACiAKIHN0YXRpYyB2b2lkIGJxMjd4MDBfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCiB7Ci0Jc3RydWN0IGJxMjd4MDBfZGV2aWNlX2luZm8gKmRpID0gdG9fYnEyN3gwMF9kZXZpY2VfaW5mbyhwc3kpOworCXN0cnVjdCBicTI3eDAwX2RldmljZV9pbmZvICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+d29yayk7CiAJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkaS0+d29yaywgMCk7CiB9CiAKLXN0YXRpYyBpbnQgYnEyN3gwMF9wb3dlcnN1cHBseV9pbml0KHN0cnVjdCBicTI3eDAwX2RldmljZV9pbmZvICpkaSkKK3N0YXRpYyBpbnQgYnEyN3gwMF9wb3dlcnN1cHBseV9pbml0KHN0cnVjdCBicTI3eDAwX2RldmljZV9pbmZvICpkaSwKKwkJCQkgICAgY29uc3QgY2hhciAqbmFtZSkKIHsKIAlpbnQgcmV0OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqcHN5X2Rlc2M7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHsgLmRydl9kYXRhID0gZGksIH07CiAKLQlkaS0+YmF0LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCXBzeV9kZXNjID0gZGV2bV9remFsbG9jKGRpLT5kZXYsIHNpemVvZigqcHN5X2Rlc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBzeV9kZXNjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBzeV9kZXNjLT5uYW1lID0gbmFtZTsKKwlwc3lfZGVzYy0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CiAJaWYgKGRpLT5jaGlwID09IEJRMjc0MjUpIHsKLQkJZGktPmJhdC5wcm9wZXJ0aWVzID0gYnEyNzQyNV9iYXR0ZXJ5X3Byb3BzOwotCQlkaS0+YmF0Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShicTI3NDI1X2JhdHRlcnlfcHJvcHMpOworCQlwc3lfZGVzYy0+cHJvcGVydGllcyA9IGJxMjc0MjVfYmF0dGVyeV9wcm9wczsKKwkJcHN5X2Rlc2MtPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShicTI3NDI1X2JhdHRlcnlfcHJvcHMpOwogCX0gZWxzZSBpZiAoZGktPmNoaXAgPT0gQlEyNzc0MikgewotCQlkaS0+YmF0LnByb3BlcnRpZXMgPSBicTI3NzQyX2JhdHRlcnlfcHJvcHM7Ci0JCWRpLT5iYXQubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGJxMjc3NDJfYmF0dGVyeV9wcm9wcyk7CisJCXBzeV9kZXNjLT5wcm9wZXJ0aWVzID0gYnEyNzc0Ml9iYXR0ZXJ5X3Byb3BzOworCQlwc3lfZGVzYy0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGJxMjc3NDJfYmF0dGVyeV9wcm9wcyk7CisJfSBlbHNlIGlmIChkaS0+Y2hpcCA9PSBCUTI3NTEwKSB7CisJCXBzeV9kZXNjLT5wcm9wZXJ0aWVzID0gYnEyNzUxMF9iYXR0ZXJ5X3Byb3BzOworCQlwc3lfZGVzYy0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGJxMjc1MTBfYmF0dGVyeV9wcm9wcyk7CiAJfSBlbHNlIHsKLQkJZGktPmJhdC5wcm9wZXJ0aWVzID0gYnEyN3gwMF9iYXR0ZXJ5X3Byb3BzOwotCQlkaS0+YmF0Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShicTI3eDAwX2JhdHRlcnlfcHJvcHMpOworCQlwc3lfZGVzYy0+cHJvcGVydGllcyA9IGJxMjd4MDBfYmF0dGVyeV9wcm9wczsKKwkJcHN5X2Rlc2MtPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShicTI3eDAwX2JhdHRlcnlfcHJvcHMpOwogCX0KLQlkaS0+YmF0LmdldF9wcm9wZXJ0eSA9IGJxMjd4MDBfYmF0dGVyeV9nZXRfcHJvcGVydHk7Ci0JZGktPmJhdC5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gYnEyN3gwMF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkOworCXBzeV9kZXNjLT5nZXRfcHJvcGVydHkgPSBicTI3eDAwX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OworCXBzeV9kZXNjLT5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gYnEyN3gwMF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmRpLT53b3JrLCBicTI3eDAwX2JhdHRlcnlfcG9sbCk7CiAJbXV0ZXhfaW5pdCgmZGktPmxvY2spOwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRpLT5kZXYsICZkaS0+YmF0KTsKLQlpZiAocmV0KSB7CisJZGktPmJhdCA9IHBvd2VyX3N1cHBseV9yZWdpc3Rlcl9ub193cyhkaS0+ZGV2LCBwc3lfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoZGktPmJhdCkpIHsKKwkJcmV0ID0gUFRSX0VSUihkaS0+YmF0KTsKIAkJZGV2X2VycihkaS0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGJhdHRlcnk6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTc4MCw3ICs4MjIsNyBAQAogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkaS0+d29yayk7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmZGktPmJhdCk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmJhdCk7CiAKIAltdXRleF9kZXN0cm95KCZkaS0+bG9jayk7CiB9CkBAIC04NDQsMzcgKzg4NiwzNCBAQAogCWlmIChudW0gPCAwKQogCQlyZXR1cm4gbnVtOwogCi0JbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMtJWQiLCBpZC0+bmFtZSwgbnVtKTsKKwluYW1lID0gZGV2bV9rYXNwcmludGYoJmNsaWVudC0+ZGV2LCBHRlBfS0VSTkVMLCAiJXMtJWQiLCBpZC0+bmFtZSwgbnVtKTsKIAlpZiAoIW5hbWUpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgZGV2aWNlIG5hbWVcbiIpOwogCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlnb3RvIGJhdHRfZmFpbGVkXzE7CisJCWdvdG8gYmF0dF9mYWlsZWQ7CiAJfQogCiAJZGkgPSBkZXZtX2t6YWxsb2MoJmNsaWVudC0+ZGV2LCBzaXplb2YoKmRpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkaSkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2UgaW5mbyBkYXRhXG4iKTsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBiYXR0X2ZhaWxlZF8yOworCQlnb3RvIGJhdHRfZmFpbGVkOwogCX0KIAogCWRpLT5pZCA9IG51bTsKIAlkaS0+ZGV2ID0gJmNsaWVudC0+ZGV2OwogCWRpLT5jaGlwID0gaWQtPmRyaXZlcl9kYXRhOwotCWRpLT5iYXQubmFtZSA9IG5hbWU7CiAJZGktPmJ1cy5yZWFkID0gJmJxMjd4MDBfcmVhZF9pMmM7CiAKLQlyZXR2YWwgPSBicTI3eDAwX3Bvd2Vyc3VwcGx5X2luaXQoZGkpOworCXJldHZhbCA9IGJxMjd4MDBfcG93ZXJzdXBwbHlfaW5pdChkaSwgbmFtZSk7CiAJaWYgKHJldHZhbCkKLQkJZ290byBiYXR0X2ZhaWxlZF8yOworCQlnb3RvIGJhdHRfZmFpbGVkOwogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgZGkpOwogCiAJcmV0dXJuIDA7CiAKLWJhdHRfZmFpbGVkXzI6Ci0Ja2ZyZWUobmFtZSk7Ci1iYXR0X2ZhaWxlZF8xOgorYmF0dF9mYWlsZWQ6CiAJbXV0ZXhfbG9jaygmYmF0dGVyeV9tdXRleCk7CiAJaWRyX3JlbW92ZSgmYmF0dGVyeV9pZCwgbnVtKTsKIAltdXRleF91bmxvY2soJmJhdHRlcnlfbXV0ZXgpOwpAQCAtODg4LDggKzkyNyw2IEBACiAKIAlicTI3eDAwX3Bvd2Vyc3VwcGx5X3VucmVnaXN0ZXIoZGkpOwogCi0Ja2ZyZWUoZGktPmJhdC5uYW1lKTsKLQogCW11dGV4X2xvY2soJmJhdHRlcnlfbXV0ZXgpOwogCWlkcl9yZW1vdmUoJmJhdHRlcnlfaWQsIGRpLT5pZCk7CiAJbXV0ZXhfdW5sb2NrKCZiYXR0ZXJ5X211dGV4KTsKQEAgLTkwMiw2ICs5MzksNyBAQAogCXsgImJxMjc1MDAiLCBCUTI3NTAwIH0sCiAJeyAiYnEyNzQyNSIsIEJRMjc0MjUgfSwKIAl7ICJicTI3NzQyIiwgQlEyNzc0MiB9LAorCXsgImJxMjc1MTAiLCBCUTI3NTEwIH0sCiAJe30sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGJxMjd4MDBfaWQpOwpAQCAtOTc3LDYgKzEwMTUsNyBAQAogewogCXN0cnVjdCBicTI3eDAwX2RldmljZV9pbmZvICpkaTsKIAlzdHJ1Y3QgYnEyNzAwMF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCWNvbnN0IGNoYXIgKm5hbWU7CiAKIAlpZiAoIXBkYXRhKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIm5vIHBsYXRmb3JtX2RhdGEgc3VwcGxpZWRcbiIpOwpAQCAtOTk5LDEwICsxMDM4LDEwIEBACiAJZGktPmRldiA9ICZwZGV2LT5kZXY7CiAJZGktPmNoaXAgPSBCUTI3MDAwOwogCi0JZGktPmJhdC5uYW1lID0gcGRhdGEtPm5hbWUgPzogZGV2X25hbWUoJnBkZXYtPmRldik7CisJbmFtZSA9IHBkYXRhLT5uYW1lID86IGRldl9uYW1lKCZwZGV2LT5kZXYpOwogCWRpLT5idXMucmVhZCA9ICZicTI3MDAwX3JlYWRfcGxhdGZvcm07CiAKLQlyZXR1cm4gYnEyN3gwMF9wb3dlcnN1cHBseV9pbml0KGRpKTsKKwlyZXR1cm4gYnEyN3gwMF9wb3dlcnN1cHBseV9pbml0KGRpLCBuYW1lKTsKIH0KIAogc3RhdGljIGludCBicTI3MDAwX2JhdHRlcnlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2NoYXJnZXItbWFuYWdlci5jIGIvZHJpdmVycy9wb3dlci9jaGFyZ2VyLW1hbmFnZXIuYwppbmRleCAxNGIwZDg1Li4wYWVkMTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2NoYXJnZXItbWFuYWdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvY2hhcmdlci1tYW5hZ2VyLmMKQEAgLTEwMywxMCArMTAzLDExIEBACiAJCWlmICghcHN5KQogCQkJYnJlYWs7CiAKLQkJcmV0ID0gcHN5LT5nZXRfcHJvcGVydHkocHN5LAotCQkJCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsICZ2YWwpOworCQlyZXQgPSBwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwkJCQkmdmFsKTsKIAkJaWYgKHJldCA9PSAwICYmIHZhbC5pbnR2YWwpCiAJCQlwcmVzZW50ID0gdHJ1ZTsKKwkJcG93ZXJfc3VwcGx5X3B1dChwc3kpOwogCQlicmVhazsKIAljYXNlIENNX0NIQVJHRVJfU1RBVDoKIAkJZm9yIChpID0gMDsgY20tPmRlc2MtPnBzeV9jaGFyZ2VyX3N0YXRbaV07IGkrKykgewpAQCAtMTE4LDggKzExOSw5IEBACiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCXJldCA9IHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKLQkJCQkJJnZhbCk7CisJCQlyZXQgPSBwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KHBzeSwKKwkJCQlQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5ULCAmdmFsKTsKKwkJCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIAkJCWlmIChyZXQgPT0gMCAmJiB2YWwuaW50dmFsKSB7CiAJCQkJcHJlc2VudCA9IHRydWU7CiAJCQkJYnJlYWs7CkBAIC0xNTUsNyArMTU3LDkgQEAKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJcmV0ID0gcHN5LT5nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsICZ2YWwpOworCQlyZXQgPSBwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorCQkJCSZ2YWwpOworCQlwb3dlcl9zdXBwbHlfcHV0KHBzeSk7CiAJCWlmIChyZXQgPT0gMCAmJiB2YWwuaW50dmFsKSB7CiAJCQlvbmxpbmUgPSB0cnVlOwogCQkJYnJlYWs7CkBAIC0xODMsOCArMTg3LDkgQEAKIAlpZiAoIWZ1ZWxfZ2F1Z2UpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0ID0gZnVlbF9nYXVnZS0+Z2V0X3Byb3BlcnR5KGZ1ZWxfZ2F1Z2UsCisJcmV0ID0gcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShmdWVsX2dhdWdlLAogCQkJCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLCAmdmFsKTsKKwlwb3dlcl9zdXBwbHlfcHV0KGZ1ZWxfZ2F1Z2UpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTIyMywyMCArMjI4LDI2IEBACiAJCX0KIAogCQkvKiAyLiBUaGUgY2hhcmdlciBzaG91bGQgYmUgb25saW5lIChleHQtcG93ZXIpICovCi0JCXJldCA9IHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLCAmdmFsKTsKKwkJcmV0ID0gcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShwc3ksIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKKwkJCQkmdmFsKTsKIAkJaWYgKHJldCkgewogCQkJZGV2X3dhcm4oY20tPmRldiwgIkNhbm5vdCByZWFkIE9OTElORSB2YWx1ZSBmcm9tICVzXG4iLAogCQkJCSBjbS0+ZGVzYy0+cHN5X2NoYXJnZXJfc3RhdFtpXSk7CisJCQlwb3dlcl9zdXBwbHlfcHV0KHBzeSk7CiAJCQljb250aW51ZTsKIAkJfQotCQlpZiAodmFsLmludHZhbCA9PSAwKQorCQlpZiAodmFsLmludHZhbCA9PSAwKSB7CisJCQlwb3dlcl9zdXBwbHlfcHV0KHBzeSk7CiAJCQljb250aW51ZTsKKwkJfQogCiAJCS8qCiAJCSAqIDMuIFRoZSBjaGFyZ2VyIHNob3VsZCBub3QgYmUgRlVMTCwgRElTQ0hBUkdJTkcsCiAJCSAqIG9yIE5PVF9DSEFSR0lORy4KIAkJICovCi0JCXJldCA9IHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLCAmdmFsKTsKKwkJcmV0ID0gcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShwc3ksIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKKwkJCQkmdmFsKTsKKwkJcG93ZXJfc3VwcGx5X3B1dChwc3kpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfd2FybihjbS0+ZGV2LCAiQ2Fubm90IHJlYWQgU1RBVFVTIHZhbHVlIGZyb20gJXNcbiIsCiAJCQkJIGNtLT5kZXNjLT5wc3lfY2hhcmdlcl9zdGF0W2ldKTsKQEAgLTI2NCw2ICsyNzUsNyBAQAogCXN0cnVjdCBjaGFyZ2VyX2Rlc2MgKmRlc2MgPSBjbS0+ZGVzYzsKIAl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCB2YWw7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqZnVlbF9nYXVnZTsKKwlib29sIGlzX2Z1bGwgPSBmYWxzZTsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgdVY7CiAKQEAgLTI3OSwzMCArMjkxLDM4IEBACiAJCXZhbC5pbnR2YWwgPSAwOwogCiAJCS8qIE5vdCBmdWxsIGlmIGNhcGFjaXR5IG9mIGZ1ZWwgZ2F1Z2UgaXNuJ3QgZnVsbCAqLwotCQlyZXQgPSBmdWVsX2dhdWdlLT5nZXRfcHJvcGVydHkoZnVlbF9nYXVnZSwKKwkJcmV0ID0gcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShmdWVsX2dhdWdlLAogCQkJCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLCAmdmFsKTsKLQkJaWYgKCFyZXQgJiYgdmFsLmludHZhbCA+IGRlc2MtPmZ1bGxiYXR0X2Z1bGxfY2FwYWNpdHkpCi0JCQlyZXR1cm4gdHJ1ZTsKKwkJaWYgKCFyZXQgJiYgdmFsLmludHZhbCA+IGRlc2MtPmZ1bGxiYXR0X2Z1bGxfY2FwYWNpdHkpIHsKKwkJCWlzX2Z1bGwgPSB0cnVlOworCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKIAkvKiBGdWxsLCBpZiBpdCdzIG92ZXIgdGhlIGZ1bGxiYXR0IHZvbHRhZ2UgKi8KIAlpZiAoZGVzYy0+ZnVsbGJhdHRfdVYgPiAwKSB7CiAJCXJldCA9IGdldF9iYXR0X3VWKGNtLCAmdVYpOwotCQlpZiAoIXJldCAmJiB1ViA+PSBkZXNjLT5mdWxsYmF0dF91VikKLQkJCXJldHVybiB0cnVlOworCQlpZiAoIXJldCAmJiB1ViA+PSBkZXNjLT5mdWxsYmF0dF91VikgeworCQkJaXNfZnVsbCA9IHRydWU7CisJCQlnb3RvIG91dDsKKwkJfQogCX0KIAogCS8qIEZ1bGwsIGlmIHRoZSBjYXBhY2l0eSBpcyBtb3JlIHRoYW4gZnVsbGJhdHRfc29jICovCiAJaWYgKGRlc2MtPmZ1bGxiYXR0X3NvYyA+IDApIHsKIAkJdmFsLmludHZhbCA9IDA7CiAKLQkJcmV0ID0gZnVlbF9nYXVnZS0+Z2V0X3Byb3BlcnR5KGZ1ZWxfZ2F1Z2UsCisJCXJldCA9IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkoZnVlbF9nYXVnZSwKIAkJCQlQT1dFUl9TVVBQTFlfUFJPUF9DQVBBQ0lUWSwgJnZhbCk7Ci0JCWlmICghcmV0ICYmIHZhbC5pbnR2YWwgPj0gZGVzYy0+ZnVsbGJhdHRfc29jKQotCQkJcmV0dXJuIHRydWU7CisJCWlmICghcmV0ICYmIHZhbC5pbnR2YWwgPj0gZGVzYy0+ZnVsbGJhdHRfc29jKSB7CisJCQlpc19mdWxsID0gdHJ1ZTsKKwkJCWdvdG8gb3V0OworCQl9CiAJfQogCi0JcmV0dXJuIGZhbHNlOworb3V0OgorCXBvd2VyX3N1cHBseV9wdXQoZnVlbF9nYXVnZSk7CisJcmV0dXJuIGlzX2Z1bGw7CiB9CiAKIC8qKgpAQCAtNTc1LDE0ICs1OTUsMTggQEAKIAkJCQkJaW50ICp0ZW1wKQogewogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmZ1ZWxfZ2F1Z2U7CisJaW50IHJldDsKIAogCWZ1ZWxfZ2F1Z2UgPSBwb3dlcl9zdXBwbHlfZ2V0X2J5X25hbWUoY20tPmRlc2MtPnBzeV9mdWVsX2dhdWdlKTsKIAlpZiAoIWZ1ZWxfZ2F1Z2UpCiAJCXJldHVybiAtRU5PREVWOwogCi0JcmV0dXJuIGZ1ZWxfZ2F1Z2UtPmdldF9wcm9wZXJ0eShmdWVsX2dhdWdlLAorCXJldCA9IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkoZnVlbF9nYXVnZSwKIAkJCQlQT1dFUl9TVVBQTFlfUFJPUF9URU1QLAogCQkJCSh1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqKXRlbXApOworCXBvd2VyX3N1cHBseV9wdXQoZnVlbF9nYXVnZSk7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGNtX2dldF9iYXR0ZXJ5X3RlbXBlcmF0dXJlKHN0cnVjdCBjaGFyZ2VyX21hbmFnZXIgKmNtLApAQCAtODYxLDEwICs4ODUsOSBAQAogCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IGNoYXJnZXJfbWFuYWdlciAqY20gPSBjb250YWluZXJfb2YocHN5LAotCQkJc3RydWN0IGNoYXJnZXJfbWFuYWdlciwgY2hhcmdlcl9wc3kpOworCXN0cnVjdCBjaGFyZ2VyX21hbmFnZXIgKmNtID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJc3RydWN0IGNoYXJnZXJfZGVzYyAqZGVzYyA9IGNtLT5kZXNjOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmZ1ZWxfZ2F1Z2U7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqZnVlbF9nYXVnZSA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAJaW50IHVWOwogCkBAIC05MDAsMjYgKzkyMywyNiBAQAogCQkJcmV0ID0gLUVOT0RFVjsKIAkJCWJyZWFrOwogCQl9Ci0JCXJldCA9IGZ1ZWxfZ2F1Z2UtPmdldF9wcm9wZXJ0eShmdWVsX2dhdWdlLAorCQlyZXQgPSBwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KGZ1ZWxfZ2F1Z2UsCiAJCQkJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csIHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVNUDoKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVBfQU1CSUVOVDoKIAkJcmV0dXJuIGNtX2dldF9iYXR0ZXJ5X3RlbXBlcmF0dXJlKGNtLCAmdmFsLT5pbnR2YWwpOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0FQQUNJVFk6Ci0JCWZ1ZWxfZ2F1Z2UgPSBwb3dlcl9zdXBwbHlfZ2V0X2J5X25hbWUoY20tPmRlc2MtPnBzeV9mdWVsX2dhdWdlKTsKLQkJaWYgKCFmdWVsX2dhdWdlKSB7Ci0JCQlyZXQgPSAtRU5PREVWOwotCQkJYnJlYWs7Ci0JCX0KLQogCQlpZiAoIWlzX2JhdHRfcHJlc2VudChjbSkpIHsKIAkJCS8qIFRoZXJlIGlzIG5vIGJhdHRlcnkuIEFzc3VtZSAxMDAlICovCiAJCQl2YWwtPmludHZhbCA9IDEwMDsKIAkJCWJyZWFrOwogCQl9CiAKLQkJcmV0ID0gZnVlbF9nYXVnZS0+Z2V0X3Byb3BlcnR5KGZ1ZWxfZ2F1Z2UsCisJCWZ1ZWxfZ2F1Z2UgPSBwb3dlcl9zdXBwbHlfZ2V0X2J5X25hbWUoY20tPmRlc2MtPnBzeV9mdWVsX2dhdWdlKTsKKwkJaWYgKCFmdWVsX2dhdWdlKSB7CisJCQlyZXQgPSAtRU5PREVWOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KGZ1ZWxfZ2F1Z2UsCiAJCQkJCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLCB2YWwpOwogCQlpZiAocmV0KQogCQkJYnJlYWs7CkBAIC05NzUsNyArOTk4LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAotCQkJcmV0ID0gZnVlbF9nYXVnZS0+Z2V0X3Byb3BlcnR5KGZ1ZWxfZ2F1Z2UsCisJCQlyZXQgPSBwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KGZ1ZWxfZ2F1Z2UsCiAJCQkJCQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XLAogCQkJCQkJdmFsKTsKIAkJCWlmIChyZXQpIHsKQEAgLTk5Myw2ICsxMDE2LDggQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJaWYgKGZ1ZWxfZ2F1Z2UpCisJCXBvd2VyX3N1cHBseV9wdXQoZnVlbF9nYXVnZSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTAxNSw3ICsxMDQwLDcgQEAKIAkgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5IHBzeV9kZWZhdWx0ID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBwc3lfZGVmYXVsdCA9IHsKIAkubmFtZSA9ICJiYXR0ZXJ5IiwKIAkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCiAJLnByb3BlcnRpZXMgPSBkZWZhdWx0X2NoYXJnZXJfcHJvcHMsCkBAIC0xMzk2LDcgKzE0MjEsNyBAQAogCQlkZXZfaW5mbyhjbS0+ZGV2LCAiJyVzJyByZWd1bGF0b3IncyBleHRlcm5hbGx5X2NvbnRyb2wgaXMgJWRcbiIsCiAJCQkgY2hhcmdlci0+cmVndWxhdG9yX25hbWUsIGNoYXJnZXItPmV4dGVybmFsbHlfY29udHJvbCk7CiAKLQkJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbS0+Y2hhcmdlcl9wc3kuZGV2LT5rb2JqLAorCQlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNtLT5jaGFyZ2VyX3BzeS0+ZGV2LmtvYmosCiAJCQkJCSZjaGFyZ2VyLT5hdHRyX2cpOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycihjbS0+ZGV2LCAiQ2Fubm90IGNyZWF0ZSBzeXNmcyBlbnRyeSBvZiAlcyByZWd1bGF0b3JcbiIsCkBAIC0xNDI0LDEzICsxNDQ5LDEzIEBACiAJaW50IHJldDsKIAogCS8qIFZlcmlmeSB3aGV0aGVyIGZ1ZWwgZ2F1Z2UgcHJvdmlkZXMgYmF0dGVyeSB0ZW1wZXJhdHVyZSAqLwotCXJldCA9IGZ1ZWxfZ2F1Z2UtPmdldF9wcm9wZXJ0eShmdWVsX2dhdWdlLAorCXJldCA9IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkoZnVlbF9nYXVnZSwKIAkJCQkJUE9XRVJfU1VQUExZX1BST1BfVEVNUCwgJnZhbCk7CiAKIAlpZiAoIXJldCkgewotCQljbS0+Y2hhcmdlcl9wc3kucHJvcGVydGllc1tjbS0+Y2hhcmdlcl9wc3kubnVtX3Byb3BlcnRpZXNdID0KKwkJY20tPmNoYXJnZXJfcHN5X2Rlc2MucHJvcGVydGllc1tjbS0+Y2hhcmdlcl9wc3lfZGVzYy5udW1fcHJvcGVydGllc10gPQogCQkJCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVA7Ci0JCWNtLT5jaGFyZ2VyX3BzeS5udW1fcHJvcGVydGllcysrOworCQljbS0+Y2hhcmdlcl9wc3lfZGVzYy5udW1fcHJvcGVydGllcysrOwogCQljbS0+ZGVzYy0+bWVhc3VyZV9iYXR0ZXJ5X3RlbXAgPSB0cnVlOwogCX0KICNpZmRlZiBDT05GSUdfVEhFUk1BTApAQCAtMTQ0MSw5ICsxNDY2LDkgQEAKIAkJCXJldHVybiBQVFJfRVJSKGNtLT50emRfYmF0dCk7CiAKIAkJLyogVXNlIGV4dGVybmFsIHRoZXJtb21ldGVyICovCi0JCWNtLT5jaGFyZ2VyX3BzeS5wcm9wZXJ0aWVzW2NtLT5jaGFyZ2VyX3BzeS5udW1fcHJvcGVydGllc10gPQorCQljbS0+Y2hhcmdlcl9wc3lfZGVzYy5wcm9wZXJ0aWVzW2NtLT5jaGFyZ2VyX3BzeV9kZXNjLm51bV9wcm9wZXJ0aWVzXSA9CiAJCQkJUE9XRVJfU1VQUExZX1BST1BfVEVNUF9BTUJJRU5UOwotCQljbS0+Y2hhcmdlcl9wc3kubnVtX3Byb3BlcnRpZXMrKzsKKwkJY20tPmNoYXJnZXJfcHN5X2Rlc2MubnVtX3Byb3BlcnRpZXMrKzsKIAkJY20tPmRlc2MtPm1lYXN1cmVfYmF0dGVyeV90ZW1wID0gdHJ1ZTsKIAkJcmV0ID0gMDsKIAl9CkBAIC0xNDU5LDcgKzE0ODQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNoYXJnZXJfbWFuYWdlcl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgY2hhcmdlcl9tYW5hZ2VyX21hdGNoW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJjaGFyZ2VyLW1hbmFnZXIiLAogCX0sCkBAIC0xNjAzLDYgKzE2MjgsNyBAQAogCWludCBqID0gMDsKIAl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCB2YWw7CiAJc3RydWN0IHBvd2VyX3N1cHBseSAqZnVlbF9nYXVnZTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAKIAlpZiAoSVNfRVJSKGRlc2MpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHBsYXRmb3JtIGRhdGEgKGRlc2MpIGZvdW5kXG4iKTsKQEAgLTE2MTcsNiArMTY0Myw3IEBACiAJLyogQmFzaWMgVmFsdWVzLiBVbnNwZWNpZmllZCBhcmUgTnVsbCBvciAwICovCiAJY20tPmRldiA9ICZwZGV2LT5kZXY7CiAJY20tPmRlc2MgPSBkZXNjOworCXBzeV9jZmcuZHJ2X2RhdGEgPSBjbTsKIAogCS8qIEluaXRpYWxpemUgYWxhcm0gdGltZXIgKi8KIAlpZiAoYWxhcm10aW1lcl9nZXRfcnRjZGV2KCkpIHsKQEAgLTE2NzIsMTMgKzE2OTksNyBAQAogCQkJCWRlc2MtPnBzeV9jaGFyZ2VyX3N0YXRbaV0pOwogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KLQl9Ci0KLQlmdWVsX2dhdWdlID0gcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lKGRlc2MtPnBzeV9mdWVsX2dhdWdlKTsKLQlpZiAoIWZ1ZWxfZ2F1Z2UpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IGZpbmQgcG93ZXIgc3VwcGx5IFwiJXNcIlxuIiwKLQkJCWRlc2MtPnBzeV9mdWVsX2dhdWdlKTsKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXBvd2VyX3N1cHBseV9wdXQocHN5KTsKIAl9CiAKIAlpZiAoZGVzYy0+cG9sbGluZ19pbnRlcnZhbF9tcyA9PSAwIHx8CkBAIC0xNjk2LDQwICsxNzE3LDQ2IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjbSk7CiAKLQltZW1jcHkoJmNtLT5jaGFyZ2VyX3BzeSwgJnBzeV9kZWZhdWx0LCBzaXplb2YocHN5X2RlZmF1bHQpKTsKKwltZW1jcHkoJmNtLT5jaGFyZ2VyX3BzeV9kZXNjLCAmcHN5X2RlZmF1bHQsIHNpemVvZihwc3lfZGVmYXVsdCkpOwogCiAJaWYgKCFkZXNjLT5wc3lfbmFtZSkKIAkJc3RybmNweShjbS0+cHN5X25hbWVfYnVmLCBwc3lfZGVmYXVsdC5uYW1lLCBQU1lfTkFNRV9NQVgpOwogCWVsc2UKIAkJc3RybmNweShjbS0+cHN5X25hbWVfYnVmLCBkZXNjLT5wc3lfbmFtZSwgUFNZX05BTUVfTUFYKTsKLQljbS0+Y2hhcmdlcl9wc3kubmFtZSA9IGNtLT5wc3lfbmFtZV9idWY7CisJY20tPmNoYXJnZXJfcHN5X2Rlc2MubmFtZSA9IGNtLT5wc3lfbmFtZV9idWY7CiAKIAkvKiBBbGxvY2F0ZSBmb3IgcHN5IHByb3BlcnRpZXMgYmVjYXVzZSB0aGV5IG1heSB2YXJ5ICovCi0JY20tPmNoYXJnZXJfcHN5LnByb3BlcnRpZXMgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwKKwljbS0+Y2hhcmdlcl9wc3lfZGVzYy5wcm9wZXJ0aWVzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsCiAJCQkJc2l6ZW9mKGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5KQogCQkJCSogKEFSUkFZX1NJWkUoZGVmYXVsdF9jaGFyZ2VyX3Byb3BzKSArCiAJCQkJTlVNX0NIQVJHRVJfUFNZX09QVElPTkFMKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbS0+Y2hhcmdlcl9wc3kucHJvcGVydGllcykKKwlpZiAoIWNtLT5jaGFyZ2VyX3BzeV9kZXNjLnByb3BlcnRpZXMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtY3B5KGNtLT5jaGFyZ2VyX3BzeS5wcm9wZXJ0aWVzLCBkZWZhdWx0X2NoYXJnZXJfcHJvcHMsCisJbWVtY3B5KGNtLT5jaGFyZ2VyX3BzeV9kZXNjLnByb3BlcnRpZXMsIGRlZmF1bHRfY2hhcmdlcl9wcm9wcywKIAkJc2l6ZW9mKGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5KSAqCiAJCUFSUkFZX1NJWkUoZGVmYXVsdF9jaGFyZ2VyX3Byb3BzKSk7Ci0JY20tPmNoYXJnZXJfcHN5Lm51bV9wcm9wZXJ0aWVzID0gcHN5X2RlZmF1bHQubnVtX3Byb3BlcnRpZXM7CisJY20tPmNoYXJnZXJfcHN5X2Rlc2MubnVtX3Byb3BlcnRpZXMgPSBwc3lfZGVmYXVsdC5udW1fcHJvcGVydGllczsKIAogCS8qIEZpbmQgd2hpY2ggb3B0aW9uYWwgcHN5LXByb3BlcnRpZXMgYXJlIGF2YWlsYWJsZSAqLwotCWlmICghZnVlbF9nYXVnZS0+Z2V0X3Byb3BlcnR5KGZ1ZWxfZ2F1Z2UsCi0JCQkJCSAgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVywgJnZhbCkpIHsKLQkJY20tPmNoYXJnZXJfcHN5LnByb3BlcnRpZXNbY20tPmNoYXJnZXJfcHN5Lm51bV9wcm9wZXJ0aWVzXSA9Ci0JCQkJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzsKLQkJY20tPmNoYXJnZXJfcHN5Lm51bV9wcm9wZXJ0aWVzKys7CisJZnVlbF9nYXVnZSA9IHBvd2VyX3N1cHBseV9nZXRfYnlfbmFtZShkZXNjLT5wc3lfZnVlbF9nYXVnZSk7CisJaWYgKCFmdWVsX2dhdWdlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBmaW5kIHBvd2VyIHN1cHBseSBcIiVzXCJcbiIsCisJCQlkZXNjLT5wc3lfZnVlbF9nYXVnZSk7CisJCXJldHVybiAtRU5PREVWOwogCX0KLQlpZiAoIWZ1ZWxfZ2F1Z2UtPmdldF9wcm9wZXJ0eShmdWVsX2dhdWdlLAorCWlmICghcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eShmdWVsX2dhdWdlLAorCQkJCQkgIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1csICZ2YWwpKSB7CisJCWNtLT5jaGFyZ2VyX3BzeV9kZXNjLnByb3BlcnRpZXNbY20tPmNoYXJnZXJfcHN5X2Rlc2MubnVtX3Byb3BlcnRpZXNdID0KKwkJCQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOworCQljbS0+Y2hhcmdlcl9wc3lfZGVzYy5udW1fcHJvcGVydGllcysrOworCX0KKwlpZiAoIXBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkoZnVlbF9nYXVnZSwKIAkJCQkJICBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVywKIAkJCQkJICAmdmFsKSkgewotCQljbS0+Y2hhcmdlcl9wc3kucHJvcGVydGllc1tjbS0+Y2hhcmdlcl9wc3kubnVtX3Byb3BlcnRpZXNdID0KKwkJY20tPmNoYXJnZXJfcHN5X2Rlc2MucHJvcGVydGllc1tjbS0+Y2hhcmdlcl9wc3lfZGVzYy5udW1fcHJvcGVydGllc10gPQogCQkJCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XOwotCQljbS0+Y2hhcmdlcl9wc3kubnVtX3Byb3BlcnRpZXMrKzsKKwkJY20tPmNoYXJnZXJfcHN5X2Rlc2MubnVtX3Byb3BlcnRpZXMrKzsKIAl9CiAKIAlyZXQgPSBjbV9pbml0X3RoZXJtYWxfZGF0YShjbSwgZnVlbF9nYXVnZSk7CkBAIC0xNzM3LDE0ICsxNzY0LDE2IEBACiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZXJtYWwgZGF0YVxuIik7CiAJCWNtLT5kZXNjLT5tZWFzdXJlX2JhdHRlcnlfdGVtcCA9IGZhbHNlOwogCX0KKwlwb3dlcl9zdXBwbHlfcHV0KGZ1ZWxfZ2F1Z2UpOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmNtLT5mdWxsYmF0dF92Y2hrX3dvcmssIGZ1bGxiYXR0X3ZjaGspOwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKE5VTEwsICZjbS0+Y2hhcmdlcl9wc3kpOwotCWlmIChyZXQpIHsKKwljbS0+Y2hhcmdlcl9wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoTlVMTCwgJmNtLT5jaGFyZ2VyX3BzeV9kZXNjLAorCQkJCQkJJnBzeV9jZmcpOworCWlmIChJU19FUlIoY20tPmNoYXJnZXJfcHN5KSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW5ub3QgcmVnaXN0ZXIgY2hhcmdlci1tYW5hZ2VyIHdpdGggbmFtZSBcIiVzXCJcbiIsCi0JCQljbS0+Y2hhcmdlcl9wc3kubmFtZSk7Ci0JCXJldHVybiByZXQ7CisJCQljbS0+Y2hhcmdlcl9wc3lfZGVzYy5uYW1lKTsKKwkJcmV0dXJuIFBUUl9FUlIoY20tPmNoYXJnZXJfcHN5KTsKIAl9CiAKIAkvKiBSZWdpc3RlciBleHRjb24gZGV2aWNlIGZvciBjaGFyZ2VyIGNhYmxlICovCkBAIC0xNzkwLDcgKzE4MTksNyBAQAogCQlzdHJ1Y3QgY2hhcmdlcl9yZWd1bGF0b3IgKmNoYXJnZXI7CiAKIAkJY2hhcmdlciA9ICZkZXNjLT5jaGFyZ2VyX3JlZ3VsYXRvcnNbaV07Ci0JCXN5c2ZzX3JlbW92ZV9ncm91cCgmY20tPmNoYXJnZXJfcHN5LmRldi0+a29iaiwKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbS0+Y2hhcmdlcl9wc3ktPmRldi5rb2JqLAogCQkJCSZjaGFyZ2VyLT5hdHRyX2cpOwogCX0KIGVycl9yZWdfZXh0Y29uOgpAQCAtMTgwOCw3ICsxODM3LDcgQEAKIAkJcmVndWxhdG9yX3B1dChkZXNjLT5jaGFyZ2VyX3JlZ3VsYXRvcnNbaV0uY29uc3VtZXIpOwogCX0KIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZjbS0+Y2hhcmdlcl9wc3kpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGNtLT5jaGFyZ2VyX3BzeSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTg0MCw3ICsxODY5LDcgQEAKIAlmb3IgKGkgPSAwIDsgaSA8IGRlc2MtPm51bV9jaGFyZ2VyX3JlZ3VsYXRvcnMgOyBpKyspCiAJCXJlZ3VsYXRvcl9wdXQoZGVzYy0+Y2hhcmdlcl9yZWd1bGF0b3JzW2ldLmNvbnN1bWVyKTsKIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZjbS0+Y2hhcmdlcl9wc3kpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGNtLT5jaGFyZ2VyX3BzeSk7CiAKIAl0cnlfY2hhcmdlcl9lbmFibGUoY20sIGZhbHNlKTsKIApAQCAtMTk5OSw3ICsyMDI4LDcgQEAKIAlib29sIGZvdW5kID0gZmFsc2U7CiAKIAlmb3IgKGkgPSAwOyBjbS0+ZGVzYy0+cHN5X2NoYXJnZXJfc3RhdFtpXTsgaSsrKSB7Ci0JCWlmICghc3RyY21wKHBzeS0+bmFtZSwgY20tPmRlc2MtPnBzeV9jaGFyZ2VyX3N0YXRbaV0pKSB7CisJCWlmICghc3RyY21wKHBzeS0+ZGVzYy0+bmFtZSwgY20tPmRlc2MtPnBzeV9jaGFyZ2VyX3N0YXRbaV0pKSB7CiAJCQlmb3VuZCA9IHRydWU7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9jb2xsaWVfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9jb2xsaWVfYmF0dGVyeS5jCmluZGV4IDU5NGU0ZGIuLjJkYTllZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvY29sbGllX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL2NvbGxpZV9iYXR0ZXJ5LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogc3RydWN0IGNvbGxpZV9iYXQgewogCWludCBzdGF0dXM7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSBwc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5OwogCWludCBmdWxsX2Nocmc7CiAKIAlzdHJ1Y3QgbXV0ZXggd29ya19sb2NrOyAvKiBwcm90ZWN0cyBkYXRhICovCkBAIC05OCw3ICs5OCw3IEBACiAJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgY29sbGllX2JhdCAqYmF0ID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IGNvbGxpZV9iYXQsIHBzeSk7CisJc3RydWN0IGNvbGxpZV9iYXQgKmJhdCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJaWYgKGJhdC0+aXNfcHJlc2VudCAmJiAhYmF0LT5pc19wcmVzZW50KGJhdCkKIAkJCSYmIHBzcCAhPSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UKSB7CkBAIC0xNTUsMTQgKzE1NSwxNCBAQAogc3RhdGljIHZvaWQgY29sbGllX2JhdF91cGRhdGUoc3RydWN0IGNvbGxpZV9iYXQgKmJhdCkKIHsKIAlpbnQgb2xkOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9ICZiYXQtPnBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBiYXQtPnBzeTsKIAogCW11dGV4X2xvY2soJmJhdC0+d29ya19sb2NrKTsKIAogCW9sZCA9IGJhdC0+c3RhdHVzOwogCiAJaWYgKGJhdC0+aXNfcHJlc2VudCAmJiAhYmF0LT5pc19wcmVzZW50KGJhdCkpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBub3QgcHJlc2VudFxuIiwgcHN5LT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBub3QgcHJlc2VudFxuIiwgcHN5LT5kZXNjLT5uYW1lKTsKIAkJYmF0LT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CiAJCWJhdC0+ZnVsbF9jaHJnID0gLTE7CiAJfSBlbHNlIGlmIChwb3dlcl9zdXBwbHlfYW1faV9zdXBwbGllZChwc3kpKSB7CkBAIC0yMjAsMTggKzIyMCwyMCBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGNvbGxpZV9iYXRfbWFpbl9kZXNjID0geworCS5uYW1lCQk9ICJtYWluLWJhdHRlcnkiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCisJLnByb3BlcnRpZXMJPSBjb2xsaWVfYmF0X21haW5fcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShjb2xsaWVfYmF0X21haW5fcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJPSBjb2xsaWVfYmF0X2dldF9wcm9wZXJ0eSwKKwkuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9IGNvbGxpZV9iYXRfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKKwkudXNlX2Zvcl9hcG0JPSAxLAorfTsKKwogc3RhdGljIHN0cnVjdCBjb2xsaWVfYmF0IGNvbGxpZV9iYXRfbWFpbiA9IHsKIAkuc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORywKIAkuZnVsbF9jaHJnID0gLTEsCi0JLnBzeSA9IHsKLQkJLm5hbWUJCT0gIm1haW4tYmF0dGVyeSIsCi0JCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCi0JCS5wcm9wZXJ0aWVzCT0gY29sbGllX2JhdF9tYWluX3Byb3BzLAotCQkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKGNvbGxpZV9iYXRfbWFpbl9wcm9wcyksCi0JCS5nZXRfcHJvcGVydHkJPSBjb2xsaWVfYmF0X2dldF9wcm9wZXJ0eSwKLQkJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSBjb2xsaWVfYmF0X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQsCi0JCS51c2VfZm9yX2FwbQk9IDEsCi0JfSwKKwkucHN5ID0gTlVMTCwKIAogCS5ncGlvX2Z1bGwgPSBDT0xMSUVfR1BJT19DTywKIAkuZ3Bpb19jaGFyZ2Vfb24gPSBDT0xMSUVfR1BJT19DSEFSR0VfT04sCkBAIC0yNDksMTggKzI1MSwxOSBAQAogCS5hZGNfdGVtcF9kaXZpZGVyID0gMTAwMDAsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGNvbGxpZV9iYXRfYnVfZGVzYyA9IHsKKwkubmFtZQkJPSAiYmFja3VwLWJhdHRlcnkiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCisJLnByb3BlcnRpZXMJPSBjb2xsaWVfYmF0X2J1X3Byb3BzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoY29sbGllX2JhdF9idV9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IGNvbGxpZV9iYXRfZ2V0X3Byb3BlcnR5LAorCS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gY29sbGllX2JhdF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkLAorfTsKKwogc3RhdGljIHN0cnVjdCBjb2xsaWVfYmF0IGNvbGxpZV9iYXRfYnUgPSB7CiAJLnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTiwKIAkuZnVsbF9jaHJnID0gLTEsCi0KLQkucHN5ID0gewotCQkubmFtZQkJPSAiYmFja3VwLWJhdHRlcnkiLAotCQkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAotCQkucHJvcGVydGllcwk9IGNvbGxpZV9iYXRfYnVfcHJvcHMsCi0JCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoY29sbGllX2JhdF9idV9wcm9wcyksCi0JCS5nZXRfcHJvcGVydHkJPSBjb2xsaWVfYmF0X2dldF9wcm9wZXJ0eSwKLQkJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSBjb2xsaWVfYmF0X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQsCi0JfSwKKwkucHN5ID0gTlVMTCwKIAogCS5ncGlvX2Z1bGwgPSAtMSwKIAkuZ3Bpb19jaGFyZ2Vfb24gPSAtMSwKQEAgLTMxOSw2ICszMjIsNyBAQAogc3RhdGljIGludCBjb2xsaWVfYmF0X3Byb2JlKHN0cnVjdCB1Y2IxeDAwX2RldiAqZGV2KQogewogCWludCByZXQ7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X21haW5fY2ZnID0ge30sIHBzeV9idV9jZmcgPSB7fTsKIAogCWlmICghbWFjaGluZV9pc19jb2xsaWUoKSkKIAkJcmV0dXJuIC1FTk9ERVY7CkBAIC0zMzQsMTIgKzMzOCwyMyBAQAogCiAJSU5JVF9XT1JLKCZiYXRfd29yaywgY29sbGllX2JhdF93b3JrKTsKIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmZGV2LT51Y2ItPmRldiwgJmNvbGxpZV9iYXRfbWFpbi5wc3kpOwotCWlmIChyZXQpCisJcHN5X21haW5fY2ZnLmRydl9kYXRhID0gJmNvbGxpZV9iYXRfbWFpbjsKKwljb2xsaWVfYmF0X21haW4ucHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZkZXYtPnVjYi0+ZGV2LAorCQkJCQkJICAgICZjb2xsaWVfYmF0X21haW5fZGVzYywKKwkJCQkJCSAgICAmcHN5X21haW5fY2ZnKTsKKwlpZiAoSVNfRVJSKGNvbGxpZV9iYXRfbWFpbi5wc3kpKSB7CisJCXJldCA9IFBUUl9FUlIoY29sbGllX2JhdF9tYWluLnBzeSk7CiAJCWdvdG8gZXJyX3BzeV9yZWdfbWFpbjsKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmRldi0+dWNiLT5kZXYsICZjb2xsaWVfYmF0X2J1LnBzeSk7Ci0JaWYgKHJldCkKKwl9CisKKwlwc3lfbWFpbl9jZmcuZHJ2X2RhdGEgPSAmY29sbGllX2JhdF9idTsKKwljb2xsaWVfYmF0X2J1LnBzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmZGV2LT51Y2ItPmRldiwKKwkJCQkJCSAgJmNvbGxpZV9iYXRfYnVfZGVzYywKKwkJCQkJCSAgJnBzeV9idV9jZmcpOworCWlmIChJU19FUlIoY29sbGllX2JhdF9idS5wc3kpKSB7CisJCXJldCA9IFBUUl9FUlIoY29sbGllX2JhdF9idS5wc3kpOwogCQlnb3RvIGVycl9wc3lfcmVnX2J1OworCX0KIAogCXJldCA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKENPTExJRV9HUElPX0NPKSwKIAkJCQljb2xsaWVfYmF0X2dwaW9faXNyLApAQCAtMzU0LDkgKzM2OSw5IEBACiAJcmV0dXJuIDA7CiAKIGVycl9pcnE6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmNvbGxpZV9iYXRfYnUucHN5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcihjb2xsaWVfYmF0X2J1LnBzeSk7CiBlcnJfcHN5X3JlZ19idToKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmY29sbGllX2JhdF9tYWluLnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoY29sbGllX2JhdF9tYWluLnBzeSk7CiBlcnJfcHN5X3JlZ19tYWluOgogCiAJLyogc2VlIGNvbW1lbnQgaW4gY29sbGllX2JhdF9yZW1vdmUgKi8KQEAgLTM2OSw4ICszODQsOCBAQAogewogCWZyZWVfaXJxKGdwaW9fdG9faXJxKENPTExJRV9HUElPX0NPKSwgJmNvbGxpZV9iYXRfbWFpbik7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmY29sbGllX2JhdF9idS5wc3kpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZjb2xsaWVfYmF0X21haW4ucHN5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcihjb2xsaWVfYmF0X2J1LnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoY29sbGllX2JhdF9tYWluLnBzeSk7CiAKIAkvKgogCSAqIE5vdyBjYW5jZWwgdGhlIGJhdF93b3JrLiAgV2Ugd29uJ3QgZ2V0IGFueSBtb3JlIHNjaGVkdWxlcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZGE5MDMwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvZGE5MDMwX2JhdHRlcnkuYwppbmRleCA3OGNkNWQ2Li41Y2EwZjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2RhOTAzMF9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9kYTkwMzBfYmF0dGVyeS5jCkBAIC04OSw3ICs4OSw4IEBACiB9OwogCiBzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIgewotCXN0cnVjdCBwb3dlcl9zdXBwbHkgcHN5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgcHN5X2Rlc2M7CiAKIAlzdHJ1Y3QgZGV2aWNlICptYXN0ZXI7CiAKQEAgLTI0NSw3ICsyNDYsNyBAQAogCiAJZGE5MDN4X3dyaXRlKGNoYXJnZXItPm1hc3RlciwgREE5MDMwX0NIQVJHRV9DT05UUk9MLCB2YWwpOwogCi0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmNoYXJnZXItPnBzeSk7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hhcmdlci0+cHN5KTsKIH0KIAogc3RhdGljIHZvaWQgZGE5MDMwX2NoYXJnZXJfY2hlY2tfc3RhdGUoc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyKQpAQCAtMzQxLDggKzM0Miw3IEBACiAJCQkJICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJCSAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyOwotCWNoYXJnZXIgPSBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgZGE5MDMwX2NoYXJnZXIsIHBzeSk7CisJc3RydWN0IGRhOTAzMF9jaGFyZ2VyICpjaGFyZ2VyID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAlzd2l0Y2ggKHBzcCkgewogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgpAQCAtNDQ3LDE2ICs0NDcsMTYgQEAKIAogc3RhdGljIHZvaWQgZGE5MDMwX2JhdHRlcnlfc2V0dXBfcHN5KHN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlcikKIHsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSAmY2hhcmdlci0+cHN5OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqcHN5X2Rlc2MgPSAmY2hhcmdlci0+cHN5X2Rlc2M7CiAJc3RydWN0IHBvd2VyX3N1cHBseV9pbmZvICppbmZvID0gY2hhcmdlci0+YmF0dGVyeV9pbmZvOwogCi0JcHN5LT5uYW1lID0gaW5mby0+bmFtZTsKLQlwc3ktPnVzZV9mb3JfYXBtID0gaW5mby0+dXNlX2Zvcl9hcG07Ci0JcHN5LT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQlwc3ktPmdldF9wcm9wZXJ0eSA9IGRhOTAzMF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKKwlwc3lfZGVzYy0+bmFtZSA9IGluZm8tPm5hbWU7CisJcHN5X2Rlc2MtPnVzZV9mb3JfYXBtID0gaW5mby0+dXNlX2Zvcl9hcG07CisJcHN5X2Rlc2MtPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCXBzeV9kZXNjLT5nZXRfcHJvcGVydHkgPSBkYTkwMzBfYmF0dGVyeV9nZXRfcHJvcGVydHk7CiAKLQlwc3ktPnByb3BlcnRpZXMgPSBkYTkwMzBfYmF0dGVyeV9wcm9wczsKLQlwc3ktPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShkYTkwMzBfYmF0dGVyeV9wcm9wcyk7CisJcHN5X2Rlc2MtPnByb3BlcnRpZXMgPSBkYTkwMzBfYmF0dGVyeV9wcm9wczsKKwlwc3lfZGVzYy0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGRhOTAzMF9iYXR0ZXJ5X3Byb3BzKTsKIH07CiAKIHN0YXRpYyBpbnQgZGE5MDMwX2JhdHRlcnlfY2hhcmdlcl9pbml0KHN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlcikKQEAgLTQ5NCw2ICs0OTQsNyBAQAogc3RhdGljIGludCBkYTkwMzBfYmF0dGVyeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBkYTkwMzBfY2hhcmdlciAqY2hhcmdlcjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAJc3RydWN0IGRhOTAzMF9iYXR0ZXJ5X2luZm8gKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJaW50IHJldDsKIApAQCAtNTQxLDkgKzU0MiwxMyBAQAogCQlnb3RvIGVycl9ub3RpZmllcjsKIAogCWRhOTAzMF9iYXR0ZXJ5X3NldHVwX3BzeShjaGFyZ2VyKTsKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNoYXJnZXItPnBzeSk7Ci0JaWYgKHJldCkKKwlwc3lfY2ZnLmRydl9kYXRhID0gY2hhcmdlcjsKKwljaGFyZ2VyLT5wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNoYXJnZXItPnBzeV9kZXNjLAorCQkJCQkgICAgICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGNoYXJnZXItPnBzeSkpIHsKKwkJcmV0ID0gUFRSX0VSUihjaGFyZ2VyLT5wc3kpOwogCQlnb3RvIGVycl9wc19yZWdpc3RlcjsKKwl9CiAKIAljaGFyZ2VyLT5kZWJ1Z19maWxlID0gZGE5MDMwX2JhdF9jcmVhdGVfZGVidWdmcyhjaGFyZ2VyKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGFyZ2VyKTsKQEAgLTU3MSw3ICs1NzYsNyBAQAogCQkJCSAgIERBOTAzMF9FVkVOVF9DSElPVkVSIHwgREE5MDMwX0VWRU5UX1RCQVQpOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2hhcmdlci0+d29yayk7CiAJZGE5MDMwX3NldF9jaGFyZ2UoY2hhcmdlciwgMCk7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmNoYXJnZXItPnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoY2hhcmdlci0+cHN5KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9kYTkwNTItYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9kYTkwNTItYmF0dGVyeS5jCmluZGV4IGQxNzI1MGYuLjgzMGVjNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvZGE5MDUyLWJhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL2RhOTA1Mi1iYXR0ZXJ5LmMKQEAgLTE2OSw3ICsxNjksNyBAQAogCiBzdHJ1Y3QgZGE5MDUyX2JhdHRlcnkgewogCXN0cnVjdCBkYTkwNTIgKmRhOTA1MjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IHBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7CiAJc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG5iOwogCWludCBjaGFyZ2VyX3R5cGU7CiAJaW50IHN0YXR1czsKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCiAJaWYgKGlycSA9PSBEQTkwNTJfSVJRX0NIR0VORCB8fCBpcnEgPT0gREE5MDUyX0lSUV9EQ0lOIHx8CiAJICAgIGlycSA9PSBEQTkwNTJfSVJRX1ZCVVMgfHwgaXJxID09IERBOTA1Ml9JUlFfVEJBVCkgewotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmYmF0LT5wc3kpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChiYXQtPnBzeSk7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtNDk5LDggKzQ5OSw3IEBACiB7CiAJaW50IHJldDsKIAlpbnQgaWxsZWdhbDsKLQlzdHJ1Y3QgZGE5MDUyX2JhdHRlcnkgKmJhdCA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBkYTkwNTJfYmF0dGVyeSwKLQkJCQkJCSAgcHN5KTsKKwlzdHJ1Y3QgZGE5MDUyX2JhdHRlcnkgKmJhdCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJcmV0ID0gZGE5MDUyX2JhdF9jaGVja19wcmVzZW5jZShiYXQsICZpbGxlZ2FsKTsKIAlpZiAocmV0IDwgMCkKQEAgLTU2MSw3ICs1NjAsNyBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1ksCiB9OwogCi1zdGF0aWMgc3RydWN0IHBvd2VyX3N1cHBseSB0ZW1wbGF0ZV9iYXR0ZXJ5ID0geworc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBwc3lfZGVzYyA9IHsKIAkubmFtZQkJPSAiZGE5MDUyLWJhdCIsCiAJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKIAkucHJvcGVydGllcwk9IGRhOTA1Ml9iYXRfcHJvcHMsCkBAIC01OTEsNiArNTkwLDcgQEAKIHsKIAlzdHJ1Y3QgZGE5MDUyX3BkYXRhICpwZGF0YTsKIAlzdHJ1Y3QgZGE5MDUyX2JhdHRlcnkgKmJhdDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAJaW50IHJldDsKIAlpbnQgaTsKIApAQCAtNTk5LDggKzU5OSw5IEBACiAJaWYgKCFiYXQpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcHN5X2NmZy5kcnZfZGF0YSA9IGJhdDsKKwogCWJhdC0+ZGE5MDUyID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCWJhdC0+cHN5ID0gdGVtcGxhdGVfYmF0dGVyeTsKIAliYXQtPmNoYXJnZXJfdHlwZSA9IERBOTA1Ml9OT0NIQVJHRVI7CiAJYmF0LT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CiAJYmF0LT5oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047CkBAIC02MDgsOSArNjA5LDkgQEAKIAogCXBkYXRhID0gYmF0LT5kYTkwNTItPmRldi0+cGxhdGZvcm1fZGF0YTsKIAlpZiAocGRhdGEgIT0gTlVMTCAmJiBwZGF0YS0+dXNlX2Zvcl9hcG0pCi0JCWJhdC0+cHN5LnVzZV9mb3JfYXBtID0gcGRhdGEtPnVzZV9mb3JfYXBtOworCQlwc3lfZGVzYy51c2VfZm9yX2FwbSA9IHBkYXRhLT51c2VfZm9yX2FwbTsKIAllbHNlCi0JCWJhdC0+cHN5LnVzZV9mb3JfYXBtID0gMTsKKwkJcHN5X2Rlc2MudXNlX2Zvcl9hcG0gPSAxOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGE5MDUyX2JhdF9pcnFzKTsgaSsrKSB7CiAJCXJldCA9IGRhOTA1Ml9yZXF1ZXN0X2lycShiYXQtPmRhOTA1MiwKQEAgLTYyNSw5ICs2MjYsMTEgQEAKIAkJfQogCX0KIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmYmF0LT5wc3kpOwotCSBpZiAocmV0KQorCWJhdC0+cHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZwc3lfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoYmF0LT5wc3kpKSB7CisJCXJldCA9IFBUUl9FUlIoYmF0LT5wc3kpOwogCQlnb3RvIGVycjsKKwl9CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBiYXQpOwogCXJldHVybiAwOwpAQCAtNjQ2LDcgKzY0OSw3IEBACiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGE5MDUyX2JhdF9pcnFzKTsgaSsrKQogCQlkYTkwNTJfZnJlZV9pcnEoYmF0LT5kYTkwNTIsIGRhOTA1Ml9iYXRfaXJxX2JpdHNbaV0sIGJhdCk7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmYmF0LT5wc3kpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGJhdC0+cHN5KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9kYTkxNTAtY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9kYTkxNTAtY2hhcmdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDk5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Bvd2VyL2RhOTE1MC1jaGFyZ2VyLmMKQEAgLTAsMCArMSw2OTQgQEAKKy8qCisgKiBEQTkxNTAgQ2hhcmdlciBEcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgRGlhbG9nIFNlbWljb25kdWN0b3IKKyAqCisgKiBBdXRob3I6IEFkYW0gVGhvbXNvbiA8QWRhbS5UaG9tc29uLk9wZW5zb3VyY2VAZGlhc2VtaS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvZGE5MTUwL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvZGE5MTUwL3JlZ2lzdGVycy5oPgorCisvKiBQcml2YXRlIGRhdGEgKi8KK3N0cnVjdCBkYTkxNTBfY2hhcmdlciB7CisJc3RydWN0IGRhOTE1MCAqZGE5MTUwOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnVzYjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0ZXJ5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnN1cHBseV9vbmxpbmU7CisKKwlzdHJ1Y3QgdXNiX3BoeSAqdXNiX3BoeTsKKwlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgb3RnX25iOworCXN0cnVjdCB3b3JrX3N0cnVjdCBvdGdfd29yazsKKwl1bnNpZ25lZCBsb25nIHVzYl9ldmVudDsKKworCXN0cnVjdCBpaW9fY2hhbm5lbCAqaWJ1c19jaGFuOworCXN0cnVjdCBpaW9fY2hhbm5lbCAqdmJ1c19jaGFuOworCXN0cnVjdCBpaW9fY2hhbm5lbCAqdGp1bmNfY2hhbjsKKwlzdHJ1Y3QgaWlvX2NoYW5uZWwgKnZiYXRfY2hhbjsKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGRhOTE1MF9jaGFyZ2VyX3N1cHBseV9vbmxpbmUoc3RydWN0IGRhOTE1MF9jaGFyZ2VyICpjaGFyZ2VyLAorCQkJCQkgICAgICAgc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJCQkgICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwl2YWwtPmludHZhbCA9IChwc3kgPT0gY2hhcmdlci0+c3VwcGx5X29ubGluZSkgPyAxIDogMDsKKworCXJldHVybiAwOworfQorCisvKiBDaGFyZ2VyIFByb3BlcnRpZXMgKi8KK3N0YXRpYyBpbnQgZGE5MTUwX2NoYXJnZXJfdmJ1c192b2x0YWdlX25vdyhzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIgKmNoYXJnZXIsCisJCQkJCSAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJaW50IHZfdmFsLCByZXQ7CisKKwkvKiBSZWFkIHByb2Nlc3NlZCB2YWx1ZSAtIG1WIHVuaXRzICovCisJcmV0ID0gaWlvX3JlYWRfY2hhbm5lbF9wcm9jZXNzZWQoY2hhcmdlci0+dmJ1c19jaGFuLCAmdl92YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQ29udmVydCB2b2x0YWdlIHRvIGV4cGVjdGVkIHVWIHVuaXRzICovCisJdmFsLT5pbnR2YWwgPSB2X3ZhbCAqIDEwMDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYTkxNTBfY2hhcmdlcl9pYnVzX2N1cnJlbnRfYXZnKHN0cnVjdCBkYTkxNTBfY2hhcmdlciAqY2hhcmdlciwKKwkJCQkJICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpbnQgaV92YWwsIHJldDsKKworCS8qIFJlYWQgcHJvY2Vzc2VkIHZhbHVlIC0gbUEgdW5pdHMgKi8KKwlyZXQgPSBpaW9fcmVhZF9jaGFubmVsX3Byb2Nlc3NlZChjaGFyZ2VyLT5pYnVzX2NoYW4sICZpX3ZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBDb252ZXJ0IGN1cnJlbnQgdG8gZXhwZWN0ZWQgdUEgdW5pdHMgKi8KKwl2YWwtPmludHZhbCA9IGlfdmFsICogMTAwMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhOTE1MF9jaGFyZ2VyX3RqdW5jX3RlbXAoc3RydWN0IGRhOTE1MF9jaGFyZ2VyICpjaGFyZ2VyLAorCQkJCSAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpbnQgdF92YWwsIHJldDsKKworCS8qIFJlYWQgcHJvY2Vzc2VkIHZhbHVlIC0gMC4wMDEgZGVncmVlcyBDIHVuaXRzICovCisJcmV0ID0gaWlvX3JlYWRfY2hhbm5lbF9wcm9jZXNzZWQoY2hhcmdlci0+dGp1bmNfY2hhbiwgJnRfdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIENvbnZlcnQgdGVtcCB0byBleHBlY3QgMC4xIGRlZ3JlZXMgQyB1bml0cyAqLworCXZhbC0+aW50dmFsID0gdF92YWwgLyAxMDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGRhOTE1MF9jaGFyZ2VyX3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCit9OworCitzdGF0aWMgaW50IGRhOTE1MF9jaGFyZ2VyX2dldF9wcm9wKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCQkgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkJICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIgKmNoYXJnZXIgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYucGFyZW50KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKKwkJcmV0ID0gZGE5MTUwX2NoYXJnZXJfc3VwcGx5X29ubGluZShjaGFyZ2VyLCBwc3ksIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CisJCXJldCA9IGRhOTE1MF9jaGFyZ2VyX3ZidXNfdm9sdGFnZV9ub3coY2hhcmdlciwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX0FWRzoKKwkJcmV0ID0gZGE5MTUwX2NoYXJnZXJfaWJ1c19jdXJyZW50X2F2ZyhjaGFyZ2VyLCB2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CisJCXJldCA9IGRhOTE1MF9jaGFyZ2VyX3RqdW5jX3RlbXAoY2hhcmdlciwgdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogQmF0dGVyeSBQcm9wZXJ0aWVzICovCitzdGF0aWMgaW50IGRhOTE1MF9jaGFyZ2VyX2JhdHRlcnlfc3RhdHVzKHN0cnVjdCBkYTkxNTBfY2hhcmdlciAqY2hhcmdlciwKKwkJCQkJIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJdTggcmVnOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIGJhdHRlcnkgaXMgZGlzY2hhcmdpbmcgKi8KKwlyZWcgPSBkYTkxNTBfcmVnX3JlYWQoY2hhcmdlci0+ZGE5MTUwLCBEQTkxNTBfU1RBVFVTX0gpOworCisJaWYgKCgocmVnICYgREE5MTUwX1ZCVVNfU1RBVF9NQVNLKSA9PSBEQTkxNTBfVkJVU19TVEFUX09GRikgfHwKKwkgICAgKChyZWcgJiBEQTkxNTBfVkJVU19TVEFUX01BU0spID09IERBOTE1MF9WQlVTX1NUQVRfV0FJVCkpIHsKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCisJCXJldHVybiAwOworCX0KKworCXJlZyA9IGRhOTE1MF9yZWdfcmVhZChjaGFyZ2VyLT5kYTkxNTAsIERBOTE1MF9TVEFUVVNfSik7CisKKwkvKiBOb3cgY2hlY2sgZm9yIG90aGVyIHN0YXRlcyAqLworCXN3aXRjaCAocmVnICYgREE5MTUwX0NIR19TVEFUX01BU0spIHsKKwljYXNlIERBOTE1MF9DSEdfU1RBVF9BQ1Q6CisJY2FzZSBEQTkxNTBfQ0hHX1NUQVRfUFJFOgorCWNhc2UgREE5MTUwX0NIR19TVEFUX0NDOgorCWNhc2UgREE5MTUwX0NIR19TVEFUX0NWOgorCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisJCWJyZWFrOworCWNhc2UgREE5MTUwX0NIR19TVEFUX09GRjoKKwljYXNlIERBOTE1MF9DSEdfU1RBVF9TVVNQOgorCWNhc2UgREE5MTUwX0NIR19TVEFUX1RFTVA6CisJY2FzZSBEQTkxNTBfQ0hHX1NUQVRfVElNRToKKwljYXNlIERBOTE1MF9DSEdfU1RBVF9CQVQ6CisJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CisJCWJyZWFrOworCWNhc2UgREE5MTUwX0NIR19TVEFUX0ZVTEw6CisJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGE5MTUwX2NoYXJnZXJfYmF0dGVyeV9oZWFsdGgoc3RydWN0IGRhOTE1MF9jaGFyZ2VyICpjaGFyZ2VyLAorCQkJCQkgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwl1OCByZWc7CisKKwlyZWcgPSBkYTkxNTBfcmVnX3JlYWQoY2hhcmdlci0+ZGE5MTUwLCBEQTkxNTBfU1RBVFVTX0opOworCisJLyogQ2hlY2sgaWYgdGVtcGVyYXR1cmUgbGltaXQgcmVhY2hlZCAqLworCXN3aXRjaCAocmVnICYgREE5MTUwX0NIR19URU1QX01BU0spIHsKKwljYXNlIERBOTE1MF9DSEdfVEVNUF9VTkRFUjoKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0NPTEQ7CisJCXJldHVybiAwOworCWNhc2UgREE5MTUwX0NIR19URU1QX09WRVI6CisJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSSEVBVDsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyogQ2hlY2sgZm9yIG90aGVyIGhlYWx0aCBzdGF0ZXMgKi8KKwlzd2l0Y2ggKHJlZyAmIERBOTE1MF9DSEdfU1RBVF9NQVNLKSB7CisJY2FzZSBEQTkxNTBfQ0hHX1NUQVRfQUNUOgorCWNhc2UgREE5MTUwX0NIR19TVEFUX1BSRToKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7CisJCWJyZWFrOworCWNhc2UgREE5MTUwX0NIR19TVEFUX1RJTUU6CisJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0Q7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhOTE1MF9jaGFyZ2VyX2JhdHRlcnlfcHJlc2VudChzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIgKmNoYXJnZXIsCisJCQkJCSAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwl1OCByZWc7CisKKwkvKiBDaGVjayBpZiBiYXR0ZXJ5IHByZXNlbnQgb3IgcmVtb3ZlZCAqLworCXJlZyA9IGRhOTE1MF9yZWdfcmVhZChjaGFyZ2VyLT5kYTkxNTAsIERBOTE1MF9TVEFUVVNfSik7CisJaWYgKChyZWcgJiBEQTkxNTBfQ0hHX1NUQVRfTUFTSykgPT0gREE5MTUwX0NIR19TVEFUX0JBVCkKKwkJdmFsLT5pbnR2YWwgPSAwOworCWVsc2UKKwkJdmFsLT5pbnR2YWwgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGE5MTUwX2NoYXJnZXJfYmF0dGVyeV9jaGFyZ2VfdHlwZShzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIgKmNoYXJnZXIsCisJCQkJCSAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJdTggcmVnOworCisJcmVnID0gZGE5MTUwX3JlZ19yZWFkKGNoYXJnZXItPmRhOTE1MCwgREE5MTUwX1NUQVRVU19KKTsKKworCXN3aXRjaCAocmVnICYgREE5MTUwX0NIR19TVEFUX01BU0spIHsKKwljYXNlIERBOTE1MF9DSEdfU1RBVF9DQzoKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfRkFTVDsKKwkJYnJlYWs7CisJY2FzZSBEQTkxNTBfQ0hHX1NUQVRfQUNUOgorCWNhc2UgREE5MTUwX0NIR19TVEFUX1BSRToKKwljYXNlIERBOTE1MF9DSEdfU1RBVF9DVjoKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfVFJJQ0tMRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfTk9ORTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGE5MTUwX2NoYXJnZXJfYmF0dGVyeV92b2x0YWdlX21pbihzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIgKmNoYXJnZXIsCisJCQkJCSAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJdTggcmVnOworCisJcmVnID0gZGE5MTUwX3JlZ19yZWFkKGNoYXJnZXItPmRhOTE1MCwgREE5MTUwX1BQUl9DSEdDVFJMX0MpOworCisJLyogVmFsdWUgc3RhcnRzIGF0IDI1MDAgbVYsIDUwIG1WIGluY3JlbWVudHMsIHByZXNlbnRlZCBpbiB1ViAqLworCXZhbC0+aW50dmFsID0gKChyZWcgJiBEQTkxNTBfQ0hHX1ZGQVVMVF9NQVNLKSAqIDUwMDAwKSArIDI1MDAwMDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYTkxNTBfY2hhcmdlcl9iYXR0ZXJ5X3ZvbHRhZ2Vfbm93KHN0cnVjdCBkYTkxNTBfY2hhcmdlciAqY2hhcmdlciwKKwkJCQkJICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpbnQgdl92YWwsIHJldDsKKworCS8qIFJlYWQgcHJvY2Vzc2VkIHZhbHVlIC0gbVYgdW5pdHMgKi8KKwlyZXQgPSBpaW9fcmVhZF9jaGFubmVsX3Byb2Nlc3NlZChjaGFyZ2VyLT52YmF0X2NoYW4sICZ2X3ZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwl2YWwtPmludHZhbCA9IHZfdmFsICogMTAwMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhOTE1MF9jaGFyZ2VyX2JhdHRlcnlfY3VycmVudF9tYXgoc3RydWN0IGRhOTE1MF9jaGFyZ2VyICpjaGFyZ2VyLAorCQkJCQkgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCWludCByZWc7CisKKwlyZWcgPSBkYTkxNTBfcmVnX3JlYWQoY2hhcmdlci0+ZGE5MTUwLCBEQTkxNTBfUFBSX0NIR0NUUkxfRCk7CisKKwkvKiAyNW1BIGluY3JlbWVudHMgKi8KKwl2YWwtPmludHZhbCA9IHJlZyAqIDI1MDAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGE5MTUwX2NoYXJnZXJfYmF0dGVyeV92b2x0YWdlX21heChzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIgKmNoYXJnZXIsCisJCQkJCSAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCit7CisJdTggcmVnOworCisJcmVnID0gZGE5MTUwX3JlZ19yZWFkKGNoYXJnZXItPmRhOTE1MCwgREE5MTUwX1BQUl9DSEdDVFJMX0IpOworCisJLyogVmFsdWUgc3RhcnRzIGF0IDM2NTAgbVYsIDI1IG1WIGluY3JlbWVudHMsIHByZXNlbnRlZCBpbiB1ViAqLworCXZhbC0+aW50dmFsID0gKChyZWcgJiBEQTkxNTBfQ0hHX1ZCQVRfTUFTSykgKiAyNTAwMCkgKyAzNjUwMDAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgZGE5MTUwX2NoYXJnZXJfYmF0X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLAorCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEgsCisJUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCwKKwlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRSwKKwlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01JTl9ERVNJR04sCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlRfTUFYLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NPTlNUQU5UX0NIQVJHRV9WT0xUQUdFX01BWCwKK307CisKK3N0YXRpYyBpbnQgZGE5MTUwX2NoYXJnZXJfYmF0dGVyeV9nZXRfcHJvcChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkJCSAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCQkJICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIgKmNoYXJnZXIgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYucGFyZW50KTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJcmV0ID0gZGE5MTUwX2NoYXJnZXJfYmF0dGVyeV9zdGF0dXMoY2hhcmdlciwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXJldCA9IGRhOTE1MF9jaGFyZ2VyX3N1cHBseV9vbmxpbmUoY2hhcmdlciwgcHN5LCB2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0hFQUxUSDoKKwkJcmV0ID0gZGE5MTUwX2NoYXJnZXJfYmF0dGVyeV9oZWFsdGgoY2hhcmdlciwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCQlyZXQgPSBkYTkxNTBfY2hhcmdlcl9iYXR0ZXJ5X3ByZXNlbnQoY2hhcmdlciwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRToKKwkJcmV0ID0gZGE5MTUwX2NoYXJnZXJfYmF0dGVyeV9jaGFyZ2VfdHlwZShjaGFyZ2VyLCB2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKKwkJcmV0ID0gZGE5MTUwX2NoYXJnZXJfYmF0dGVyeV92b2x0YWdlX21pbihjaGFyZ2VyLCB2YWwpOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgorCQlyZXQgPSBkYTkxNTBfY2hhcmdlcl9iYXR0ZXJ5X3ZvbHRhZ2Vfbm93KGNoYXJnZXIsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX0NVUlJFTlRfTUFYOgorCQlyZXQgPSBkYTkxNTBfY2hhcmdlcl9iYXR0ZXJ5X2N1cnJlbnRfbWF4KGNoYXJnZXIsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ09OU1RBTlRfQ0hBUkdFX1ZPTFRBR0VfTUFYOgorCQlyZXQgPSBkYTkxNTBfY2hhcmdlcl9iYXR0ZXJ5X3ZvbHRhZ2VfbWF4KGNoYXJnZXIsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkYTkxNTBfY2hhcmdlcl9jaGdfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRhOTE1MF9jaGFyZ2VyICpjaGFyZ2VyID0gZGF0YTsKKworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoYXJnZXItPmJhdHRlcnkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZGE5MTUwX2NoYXJnZXJfdGp1bmNfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRhOTE1MF9jaGFyZ2VyICpjaGFyZ2VyID0gZGF0YTsKKworCS8qIE5vdGhpbmcgd2UgY2FuIHJlYWxseSBkbyBleGNlcHQgcmVwb3J0IHRoaXMuICovCisJZGV2X2NyaXQoY2hhcmdlci0+ZGV2LCAiVEp1bmMgb3ZlciB0ZW1wZXJhdHVyZSEhIVxuIik7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hhcmdlci0+dXNiKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGRhOTE1MF9jaGFyZ2VyX3ZmYXVsdF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIgKmNoYXJnZXIgPSBkYXRhOworCisJLyogTm90aGluZyB3ZSBjYW4gcmVhbGx5IGRvIGV4Y2VwdCByZXBvcnQgdGhpcy4gKi8KKwlkZXZfY3JpdChjaGFyZ2VyLT5kZXYsICJWU1lTIHVuZGVyIHZvbHRhZ2UhISFcbiIpOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoYXJnZXItPnVzYik7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hhcmdlci0+YmF0dGVyeSk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBkYTkxNTBfY2hhcmdlcl92YnVzX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkYTkxNTBfY2hhcmdlciAqY2hhcmdlciA9IGRhdGE7CisJdTggcmVnOworCisJcmVnID0gZGE5MTUwX3JlZ19yZWFkKGNoYXJnZXItPmRhOTE1MCwgREE5MTUwX1NUQVRVU19IKTsKKworCS8qIENoYXJnZXIgcGx1Z2dlZCBpbiBvciBiYXR0ZXJ5IG9ubHkgKi8KKwlzd2l0Y2ggKHJlZyAmIERBOTE1MF9WQlVTX1NUQVRfTUFTSykgeworCWNhc2UgREE5MTUwX1ZCVVNfU1RBVF9PRkY6CisJY2FzZSBEQTkxNTBfVkJVU19TVEFUX1dBSVQ6CisJCWNoYXJnZXItPnN1cHBseV9vbmxpbmUgPSBjaGFyZ2VyLT5iYXR0ZXJ5OworCQlicmVhazsKKwljYXNlIERBOTE1MF9WQlVTX1NUQVRfQ0hHOgorCQljaGFyZ2VyLT5zdXBwbHlfb25saW5lID0gY2hhcmdlci0+dXNiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfd2FybihjaGFyZ2VyLT5kZXYsICJVbmtub3duIFZCVVMgc3RhdGUgLSByZWcgPSAweCV4XG4iLAorCQkJIHJlZyk7CisJCWNoYXJnZXItPnN1cHBseV9vbmxpbmUgPSBOVUxMOworCQlicmVhazsKKwl9CisKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChjaGFyZ2VyLT51c2IpOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoYXJnZXItPmJhdHRlcnkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBkYTkxNTBfY2hhcmdlcl9vdGdfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IGRhOTE1MF9jaGFyZ2VyICpjaGFyZ2VyID0KKwkJY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBkYTkxNTBfY2hhcmdlciwgb3RnX3dvcmspOworCisJc3dpdGNoIChjaGFyZ2VyLT51c2JfZXZlbnQpIHsKKwljYXNlIFVTQl9FVkVOVF9JRDoKKwkJLyogRW5hYmxlIE9URyBCb29zdCAqLworCQlkYTkxNTBfc2V0X2JpdHMoY2hhcmdlci0+ZGE5MTUwLCBEQTkxNTBfUFBSX0JLQ1RSTF9BLAorCQkJCURBOTE1MF9WQlVTX01PREVfTUFTSywgREE5MTUwX1ZCVVNfTU9ERV9PVEcpOworCQlicmVhazsKKwljYXNlIFVTQl9FVkVOVF9OT05FOgorCQkvKiBSZXZlcnQgdG8gY2hhcmdlIG1vZGUgKi8KKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hhcmdlci0+dXNiKTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoY2hhcmdlci0+YmF0dGVyeSk7CisJCWRhOTE1MF9zZXRfYml0cyhjaGFyZ2VyLT5kYTkxNTAsIERBOTE1MF9QUFJfQktDVFJMX0EsCisJCQkJREE5MTUwX1ZCVVNfTU9ERV9NQVNLLCBEQTkxNTBfVkJVU19NT0RFX0NIRyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBkYTkxNTBfY2hhcmdlcl9vdGdfbmNiKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJCSAgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIgKmNoYXJnZXIgPQorCQljb250YWluZXJfb2YobmIsIHN0cnVjdCBkYTkxNTBfY2hhcmdlciwgb3RnX25iKTsKKworCWRldl9kYmcoY2hhcmdlci0+ZGV2LCAiREE5MTUwIE9URyBub3RpZnkgJWx1XG4iLCB2YWwpOworCisJY2hhcmdlci0+dXNiX2V2ZW50ID0gdmFsOworCXNjaGVkdWxlX3dvcmsoJmNoYXJnZXItPm90Z193b3JrKTsKKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBpbnQgZGE5MTUwX2NoYXJnZXJfcmVnaXN0ZXJfaXJxKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJICAgICAgIGlycV9oYW5kbGVyX3QgaGFuZGxlciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqaXJxX25hbWUpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIgKmNoYXJnZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaXJxLCByZXQ7CisKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBpcnFfbmFtZSk7CisJaWYgKGlycSA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IElSUSBDSEdfU1RBVFVTOiAlZFxuIiwgaXJxKTsKKwkJcmV0dXJuIGlycTsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIE5VTEwsIGhhbmRsZXIsIElSUUZfT05FU0hPVCwgaXJxX25hbWUsCisJCQkJICAgY2hhcmdlcik7CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJUlEgJWQ6ICVkXG4iLCBpcnEsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkYTkxNTBfY2hhcmdlcl91bnJlZ2lzdGVyX2lycShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCQkgIGNvbnN0IGNoYXIgKmlycV9uYW1lKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IGRhOTE1MF9jaGFyZ2VyICpjaGFyZ2VyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGlycTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsIGlycV9uYW1lKTsKKwlpZiAoaXJxIDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBnZXQgSVJRIENIR19TVEFUVVM6ICVkXG4iLCBpcnEpOworCQlyZXR1cm47CisJfQorCisJZnJlZV9pcnEoaXJxLCBjaGFyZ2VyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyB1c2JfZGVzYyA9IHsKKwkubmFtZQkJPSAiZGE5MTUwLXVzYiIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCLAorCS5wcm9wZXJ0aWVzCT0gZGE5MTUwX2NoYXJnZXJfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShkYTkxNTBfY2hhcmdlcl9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IGRhOTE1MF9jaGFyZ2VyX2dldF9wcm9wLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBiYXR0ZXJ5X2Rlc2MgPSB7CisJLm5hbWUJCT0gImRhOTE1MC1iYXR0ZXJ5IiwKKwkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5wcm9wZXJ0aWVzCT0gZGE5MTUwX2NoYXJnZXJfYmF0X3Byb3BzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoZGE5MTUwX2NoYXJnZXJfYmF0X3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CT0gZGE5MTUwX2NoYXJnZXJfYmF0dGVyeV9nZXRfcHJvcCwKK307CisKK3N0YXRpYyBpbnQgZGE5MTUwX2NoYXJnZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBkYTkxNTAgKmRhOTE1MCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisJc3RydWN0IGRhOTE1MF9jaGFyZ2VyICpjaGFyZ2VyOworCXU4IHJlZzsKKwlpbnQgcmV0OworCisJY2hhcmdlciA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNoYXJnZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2hhcmdlcik7CisJY2hhcmdlci0+ZGE5MTUwID0gZGE5MTUwOworCWNoYXJnZXItPmRldiA9IGRldjsKKworCS8qIEFjcXVpcmUgQURDIGNoYW5uZWxzICovCisJY2hhcmdlci0+aWJ1c19jaGFuID0gaWlvX2NoYW5uZWxfZ2V0KGRldiwgIkNIQU5fSUJVUyIpOworCWlmIChJU19FUlIoY2hhcmdlci0+aWJ1c19jaGFuKSkgeworCQlyZXQgPSBQVFJfRVJSKGNoYXJnZXItPmlidXNfY2hhbik7CisJCWdvdG8gaWJ1c19jaGFuX2ZhaWw7CisJfQorCisJY2hhcmdlci0+dmJ1c19jaGFuID0gaWlvX2NoYW5uZWxfZ2V0KGRldiwgIkNIQU5fVkJVUyIpOworCWlmIChJU19FUlIoY2hhcmdlci0+dmJ1c19jaGFuKSkgeworCQlyZXQgPSBQVFJfRVJSKGNoYXJnZXItPnZidXNfY2hhbik7CisJCWdvdG8gdmJ1c19jaGFuX2ZhaWw7CisJfQorCisJY2hhcmdlci0+dGp1bmNfY2hhbiA9IGlpb19jaGFubmVsX2dldChkZXYsICJDSEFOX1RKVU5DIik7CisJaWYgKElTX0VSUihjaGFyZ2VyLT50anVuY19jaGFuKSkgeworCQlyZXQgPSBQVFJfRVJSKGNoYXJnZXItPnRqdW5jX2NoYW4pOworCQlnb3RvIHRqdW5jX2NoYW5fZmFpbDsKKwl9CisKKwljaGFyZ2VyLT52YmF0X2NoYW4gPSBpaW9fY2hhbm5lbF9nZXQoZGV2LCAiQ0hBTl9WQkFUIik7CisJaWYgKElTX0VSUihjaGFyZ2VyLT52YmF0X2NoYW4pKSB7CisJCXJldCA9IFBUUl9FUlIoY2hhcmdlci0+dmJhdF9jaGFuKTsKKwkJZ290byB2YmF0X2NoYW5fZmFpbDsKKwl9CisKKwkvKiBSZWdpc3RlciBwb3dlciBzdXBwbGllcyAqLworCWNoYXJnZXItPnVzYiA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkZXYsICZ1c2JfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUihjaGFyZ2VyLT51c2IpKSB7CisJCXJldCA9IFBUUl9FUlIoY2hhcmdlci0+dXNiKTsKKwkJZ290byB1c2JfZmFpbDsKKwl9CisKKwljaGFyZ2VyLT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRldiwgJmJhdHRlcnlfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUihjaGFyZ2VyLT5iYXR0ZXJ5KSkgeworCQlyZXQgPSBQVFJfRVJSKGNoYXJnZXItPmJhdHRlcnkpOworCQlnb3RvIGJhdHRlcnlfZmFpbDsKKwl9CisKKwkvKiBHZXQgaW5pdGlhbCBvbmxpbmUgc3VwcGx5ICovCisJcmVnID0gZGE5MTUwX3JlZ19yZWFkKGRhOTE1MCwgREE5MTUwX1NUQVRVU19IKTsKKworCXN3aXRjaCAocmVnICYgREE5MTUwX1ZCVVNfU1RBVF9NQVNLKSB7CisJY2FzZSBEQTkxNTBfVkJVU19TVEFUX09GRjoKKwljYXNlIERBOTE1MF9WQlVTX1NUQVRfV0FJVDoKKwkJY2hhcmdlci0+c3VwcGx5X29ubGluZSA9IGNoYXJnZXItPmJhdHRlcnk7CisJCWJyZWFrOworCWNhc2UgREE5MTUwX1ZCVVNfU1RBVF9DSEc6CisJCWNoYXJnZXItPnN1cHBseV9vbmxpbmUgPSBjaGFyZ2VyLT51c2I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl93YXJuKGRldiwgIlVua25vd24gVkJVUyBzdGF0ZSAtIHJlZyA9IDB4JXhcbiIsIHJlZyk7CisJCWNoYXJnZXItPnN1cHBseV9vbmxpbmUgPSBOVUxMOworCQlicmVhazsKKwl9CisKKwkvKiBTZXR1cCBPVEcgcmVwb3J0aW5nICYgY29uZmlndXJhdGlvbiAqLworCWNoYXJnZXItPnVzYl9waHkgPSBkZXZtX3VzYl9nZXRfcGh5KGRldiwgVVNCX1BIWV9UWVBFX1VTQjIpOworCWlmICghSVNfRVJSX09SX05VTEwoY2hhcmdlci0+dXNiX3BoeSkpIHsKKwkJSU5JVF9XT1JLKCZjaGFyZ2VyLT5vdGdfd29yaywgZGE5MTUwX2NoYXJnZXJfb3RnX3dvcmspOworCQljaGFyZ2VyLT5vdGdfbmIubm90aWZpZXJfY2FsbCA9IGRhOTE1MF9jaGFyZ2VyX290Z19uY2I7CisJCXVzYl9yZWdpc3Rlcl9ub3RpZmllcihjaGFyZ2VyLT51c2JfcGh5LCAmY2hhcmdlci0+b3RnX25iKTsKKwl9CisKKwkvKiBSZWdpc3RlciBJUlFzICovCisJcmV0ID0gZGE5MTUwX2NoYXJnZXJfcmVnaXN0ZXJfaXJxKHBkZXYsIGRhOTE1MF9jaGFyZ2VyX2NoZ19pcnEsCisJCQkJCSAgIkNIR19TVEFUVVMiKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBjaGdfaXJxX2ZhaWw7CisKKwlyZXQgPSBkYTkxNTBfY2hhcmdlcl9yZWdpc3Rlcl9pcnEocGRldiwgZGE5MTUwX2NoYXJnZXJfdGp1bmNfaXJxLAorCQkJCQkgICJDSEdfVEpVTkMiKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byB0anVuY19pcnFfZmFpbDsKKworCXJldCA9IGRhOTE1MF9jaGFyZ2VyX3JlZ2lzdGVyX2lycShwZGV2LCBkYTkxNTBfY2hhcmdlcl92ZmF1bHRfaXJxLAorCQkJCQkgICJDSEdfVkZBVUxUIik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdmZhdWx0X2lycV9mYWlsOworCisJcmV0ID0gZGE5MTUwX2NoYXJnZXJfcmVnaXN0ZXJfaXJxKHBkZXYsIGRhOTE1MF9jaGFyZ2VyX3ZidXNfaXJxLAorCQkJCQkgICJDSEdfVkJVUyIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHZidXNfaXJxX2ZhaWw7CisKKwlyZXR1cm4gMDsKKworCit2YnVzX2lycV9mYWlsOgorCWRhOTE1MF9jaGFyZ2VyX3VucmVnaXN0ZXJfaXJxKHBkZXYsICJDSEdfVkZBVUxUIik7Cit2ZmF1bHRfaXJxX2ZhaWw6CisJZGE5MTUwX2NoYXJnZXJfdW5yZWdpc3Rlcl9pcnEocGRldiwgIkNIR19USlVOQyIpOwordGp1bmNfaXJxX2ZhaWw6CisJZGE5MTUwX2NoYXJnZXJfdW5yZWdpc3Rlcl9pcnEocGRldiwgIkNIR19TVEFUVVMiKTsKK2NoZ19pcnFfZmFpbDoKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKGNoYXJnZXItPnVzYl9waHkpKQorCQl1c2JfdW5yZWdpc3Rlcl9ub3RpZmllcihjaGFyZ2VyLT51c2JfcGh5LCAmY2hhcmdlci0+b3RnX25iKTsKK2JhdHRlcnlfZmFpbDoKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihjaGFyZ2VyLT51c2IpOworCit1c2JfZmFpbDoKKwlpaW9fY2hhbm5lbF9yZWxlYXNlKGNoYXJnZXItPnZiYXRfY2hhbik7CisKK3ZiYXRfY2hhbl9mYWlsOgorCWlpb19jaGFubmVsX3JlbGVhc2UoY2hhcmdlci0+dGp1bmNfY2hhbik7CisKK3RqdW5jX2NoYW5fZmFpbDoKKwlpaW9fY2hhbm5lbF9yZWxlYXNlKGNoYXJnZXItPnZidXNfY2hhbik7CisKK3ZidXNfY2hhbl9mYWlsOgorCWlpb19jaGFubmVsX3JlbGVhc2UoY2hhcmdlci0+aWJ1c19jaGFuKTsKKworaWJ1c19jaGFuX2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkYTkxNTBfY2hhcmdlcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGE5MTUwX2NoYXJnZXIgKmNoYXJnZXIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgaXJxOworCisJLyogTWFrZSBzdXJlIElSUXMgYXJlIHJlbGVhc2VkIGJlZm9yZSB1bnJlZ2lzdGVyaW5nIHBvd2VyIHN1cHBsaWVzICovCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIkNIR19WQlVTIik7CisJZnJlZV9pcnEoaXJxLCBjaGFyZ2VyKTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJDSEdfVkZBVUxUIik7CisJZnJlZV9pcnEoaXJxLCBjaGFyZ2VyKTsKKworCWlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJDSEdfVEpVTkMiKTsKKwlmcmVlX2lycShpcnEsIGNoYXJnZXIpOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIkNIR19TVEFUVVMiKTsKKwlmcmVlX2lycShpcnEsIGNoYXJnZXIpOworCisJaWYgKCFJU19FUlJfT1JfTlVMTChjaGFyZ2VyLT51c2JfcGh5KSkKKwkJdXNiX3VucmVnaXN0ZXJfbm90aWZpZXIoY2hhcmdlci0+dXNiX3BoeSwgJmNoYXJnZXItPm90Z19uYik7CisKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihjaGFyZ2VyLT5iYXR0ZXJ5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihjaGFyZ2VyLT51c2IpOworCisJLyogUmVsZWFzZSBBREMgY2hhbm5lbHMgKi8KKwlpaW9fY2hhbm5lbF9yZWxlYXNlKGNoYXJnZXItPmlidXNfY2hhbik7CisJaWlvX2NoYW5uZWxfcmVsZWFzZShjaGFyZ2VyLT52YnVzX2NoYW4pOworCWlpb19jaGFubmVsX3JlbGVhc2UoY2hhcmdlci0+dGp1bmNfY2hhbik7CisJaWlvX2NoYW5uZWxfcmVsZWFzZShjaGFyZ2VyLT52YmF0X2NoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRhOTE1MF9jaGFyZ2VyX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJkYTkxNTAtY2hhcmdlciIsCisJfSwKKwkucHJvYmUgPSBkYTkxNTBfY2hhcmdlcl9wcm9iZSwKKwkucmVtb3ZlID0gZGE5MTUwX2NoYXJnZXJfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihkYTkxNTBfY2hhcmdlcl9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNoYXJnZXIgRHJpdmVyIGZvciBEQTkxNTAiKTsKK01PRFVMRV9BVVRIT1IoIkFkYW0gVGhvbXNvbiA8QWRhbS5UaG9tc29uLk9wZW5zb3VyY2VAZGlhc2VtaS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2RzMjc2MF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL2RzMjc2MF9iYXR0ZXJ5LmMKaW5kZXggODViNGU2ZS4uODBmNzNjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9kczI3NjBfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvZHMyNzYwX2JhdHRlcnkuYwpAQCAtNTMsNyArNTMsOCBAQAogCWludCBjaGFyZ2Vfc3RhdHVzOwkJLyogUE9XRVJfU1VQUExZX1NUQVRVU18qICovCiAKIAlpbnQgZnVsbF9jb3VudGVyOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYmF0X2Rlc2M7CiAJc3RydWN0IGRldmljZSAqdzFfZGV2OwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICptb25pdG9yX3dxdWV1ZTsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIG1vbml0b3Jfd29yazsKQEAgLTI1NCw3ICsyNTUsNyBAQAogCWlmIChkaS0+Y2hhcmdlX3N0YXR1cyA9PSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV04pCiAJCWRpLT5mdWxsX2NvdW50ZXIgPSAwOwogCi0JaWYgKHBvd2VyX3N1cHBseV9hbV9pX3N1cHBsaWVkKCZkaS0+YmF0KSkgeworCWlmIChwb3dlcl9zdXBwbHlfYW1faV9zdXBwbGllZChkaS0+YmF0KSkgewogCQlpZiAoZGktPmN1cnJlbnRfdUEgPiAxMDAwMCkgewogCQkJZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwogCQkJZGktPmZ1bGxfY291bnRlciA9IDA7CkBAIC0yODcsNyArMjg4LDcgQEAKIAl9CiAKIAlpZiAoZGktPmNoYXJnZV9zdGF0dXMgIT0gb2xkX2NoYXJnZV9zdGF0dXMpCi0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZkaS0+YmF0KTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGktPmJhdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGRzMjc2MF9iYXR0ZXJ5X3dyaXRlX3N0YXR1cyhzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaSwKQEAgLTM0NiwxMiArMzQ3LDkgQEAKIAlxdWV1ZV9kZWxheWVkX3dvcmsoZGktPm1vbml0b3Jfd3F1ZXVlLCAmZGktPm1vbml0b3Jfd29yaywgaW50ZXJ2YWwpOwogfQogCi0jZGVmaW5lIHRvX2RzMjc2MF9kZXZpY2VfaW5mbyh4KSBjb250YWluZXJfb2YoKHgpLCBzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvLCBcCi0JCQkJCSAgICAgIGJhdCk7Ci0KIHN0YXRpYyB2b2lkIGRzMjc2MF9iYXR0ZXJ5X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQogewotCXN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gKmRpID0gdG9fZHMyNzYwX2RldmljZV9pbmZvKHBzeSk7CisJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAogCWRldl9kYmcoZGktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKQEAgLTM3Nyw3ICszNzUsNyBAQAogCSAqIHRoYXQgZXJyb3IuCiAJICovCiAKLQlpZiAoIXBvd2VyX3N1cHBseV9hbV9pX3N1cHBsaWVkKCZkaS0+YmF0KSkKKwlpZiAoIXBvd2VyX3N1cHBseV9hbV9pX3N1cHBsaWVkKGRpLT5iYXQpKQogCQlyZXR1cm47CiAKIAliaWFzID0gKHNpZ25lZCBjaGFyKSBkaS0+Y3VycmVudF9yYXcgKwpAQCAtMzk2LDcgKzM5NCw3IEBACiAKIHN0YXRpYyB2b2lkIGRzMjc2MF9iYXR0ZXJ5X3NldF9jaGFyZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKIHsKLQlzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaSA9IHRvX2RzMjc2MF9kZXZpY2VfaW5mbyhwc3kpOworCXN0cnVjdCBkczI3NjBfZGV2aWNlX2luZm8gKmRpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAkvKiBwb3N0cG9uZSB0aGUgYWN0dWFsIHdvcmsgYnkgMjAgc2Vjcy4gVGhpcyBpcyBmb3IgZGVib3VuY2luZyBHUElPCiAJICogc2lnbmFscyBhbmQgdG8gbGV0IHRoZSBjdXJyZW50IHZhbHVlIHNldHRsZS4gU2VlIEFONDE4OC4gKi8KQEAgLTQwNyw3ICs0MDUsNyBAQAogCQkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSB0b19kczI3NjBfZGV2aWNlX2luZm8ocHN5KTsKKwlzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKQEAgLTQ1OCw3ICs0NTYsNyBAQAogCQkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJICAgICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGkgPSB0b19kczI3NjBfZGV2aWNlX2luZm8ocHN5KTsKKwlzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMOgpAQCAtNTA4LDYgKzUwNiw3IEBACiAKIHN0YXRpYyBpbnQgZHMyNzYwX2JhdHRlcnlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAJY2hhciBzdGF0dXM7CiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IGRzMjc2MF9kZXZpY2VfaW5mbyAqZGk7CkBAIC01MjAsMjAgKzUxOSwyMiBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGkpOwogCi0JZGktPmRldgkJCT0gJnBkZXYtPmRldjsKLQlkaS0+dzFfZGV2CQk9IHBkZXYtPmRldi5wYXJlbnQ7Ci0JZGktPmJhdC5uYW1lCQk9IGRldl9uYW1lKCZwZGV2LT5kZXYpOwotCWRpLT5iYXQudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCWRpLT5iYXQucHJvcGVydGllcwk9IGRzMjc2MF9iYXR0ZXJ5X3Byb3BzOwotCWRpLT5iYXQubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKGRzMjc2MF9iYXR0ZXJ5X3Byb3BzKTsKLQlkaS0+YmF0LmdldF9wcm9wZXJ0eQk9IGRzMjc2MF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKLQlkaS0+YmF0LnNldF9wcm9wZXJ0eQk9IGRzMjc2MF9iYXR0ZXJ5X3NldF9wcm9wZXJ0eTsKLQlkaS0+YmF0LnByb3BlcnR5X2lzX3dyaXRlYWJsZSA9CisJZGktPmRldgkJCQk9ICZwZGV2LT5kZXY7CisJZGktPncxX2RldgkJCT0gcGRldi0+ZGV2LnBhcmVudDsKKwlkaS0+YmF0X2Rlc2MubmFtZQkJPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlkaS0+YmF0X2Rlc2MudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCWRpLT5iYXRfZGVzYy5wcm9wZXJ0aWVzCQk9IGRzMjc2MF9iYXR0ZXJ5X3Byb3BzOworCWRpLT5iYXRfZGVzYy5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoZHMyNzYwX2JhdHRlcnlfcHJvcHMpOworCWRpLT5iYXRfZGVzYy5nZXRfcHJvcGVydHkJPSBkczI3NjBfYmF0dGVyeV9nZXRfcHJvcGVydHk7CisJZGktPmJhdF9kZXNjLnNldF9wcm9wZXJ0eQk9IGRzMjc2MF9iYXR0ZXJ5X3NldF9wcm9wZXJ0eTsKKwlkaS0+YmF0X2Rlc2MucHJvcGVydHlfaXNfd3JpdGVhYmxlID0KIAkJCQkgIGRzMjc2MF9iYXR0ZXJ5X3Byb3BlcnR5X2lzX3dyaXRlYWJsZTsKLQlkaS0+YmF0LnNldF9jaGFyZ2VkCT0gZHMyNzYwX2JhdHRlcnlfc2V0X2NoYXJnZWQ7Ci0JZGktPmJhdC5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0KKwlkaS0+YmF0X2Rlc2Muc2V0X2NoYXJnZWQJPSBkczI3NjBfYmF0dGVyeV9zZXRfY2hhcmdlZDsKKwlkaS0+YmF0X2Rlc2MuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9CiAJCQkJICBkczI3NjBfYmF0dGVyeV9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkOwogCisJcHN5X2NmZy5kcnZfZGF0YQkJPSBkaTsKKwogCWRpLT5jaGFyZ2Vfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOwogCiAJLyogZW5hYmxlIHNsZWVwIG1vZGUgZmVhdHVyZSAqLwpAQCAtNTU1LDkgKzU1NiwxMCBAQAogCWlmIChjdXJyZW50X2FjY3VtKQogCQlkczI3NjBfYmF0dGVyeV9zZXRfY3VycmVudF9hY2N1bShkaSwgY3VycmVudF9hY2N1bSk7CiAKLQlyZXR2YWwgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmRpLT5iYXQpOwotCWlmIChyZXR2YWwpIHsKKwlkaS0+YmF0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZkaS0+YmF0X2Rlc2MsICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGRpLT5iYXQpKSB7CiAJCWRldl9lcnIoZGktPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBiYXR0ZXJ5XG4iKTsKKwkJcmV0dmFsID0gUFRSX0VSUihkaS0+YmF0KTsKIAkJZ290byBiYXR0X2ZhaWxlZDsKIAl9CiAKQEAgLTU3NCw3ICs1NzYsNyBAQAogCWdvdG8gc3VjY2VzczsKIAogd29ya3F1ZXVlX2ZhaWxlZDoKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmZGktPmJhdCk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmJhdCk7CiBiYXR0X2ZhaWxlZDoKIGRpX2FsbG9jX2ZhaWxlZDoKIHN1Y2Nlc3M6CkBAIC01ODgsNyArNTkwLDcgQEAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmRpLT5tb25pdG9yX3dvcmspOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGktPnNldF9jaGFyZ2VkX3dvcmspOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGRpLT5tb25pdG9yX3dxdWV1ZSk7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRpLT5iYXQpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRpLT5iYXQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02MTAsNyArNjEyLDcgQEAKIAlzdHJ1Y3QgZHMyNzYwX2RldmljZV9pbmZvICpkaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJZGktPmNoYXJnZV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmRpLT5iYXQpOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRpLT5iYXQpOwogCiAJbW9kX2RlbGF5ZWRfd29yayhkaS0+bW9uaXRvcl93cXVldWUsICZkaS0+bW9uaXRvcl93b3JrLCBIWik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZHMyNzgwX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvZHMyNzgwX2JhdHRlcnkuYwppbmRleCA5ZjQxOGZhLi5hN2EwNDI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2RzMjc4MF9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9kczI3ODBfYmF0dGVyeS5jCkBAIC0zNyw3ICszNyw4IEBACiAKIHN0cnVjdCBkczI3ODBfZGV2aWNlX2luZm8gewogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXQ7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGJhdF9kZXNjOwogCXN0cnVjdCBkZXZpY2UgKncxX2RldjsKIH07CiAKQEAgLTUyLDcgKzUzLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqCiB0b19kczI3ODBfZGV2aWNlX2luZm8oc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQogewotCXJldHVybiBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvLCBiYXQpOworCXJldHVybiBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcG93ZXJfc3VwcGx5ICp0b19wb3dlcl9zdXBwbHkoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtNzU3LDYgKzc1OCw3IEBACiAKIHN0YXRpYyBpbnQgZHMyNzgwX2JhdHRlcnlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGRzMjc4MF9kZXZpY2VfaW5mbyAqZGV2X2luZm87CiAKQEAgLTc3MCwyNSArNzcyLDI5IEBACiAKIAlkZXZfaW5mby0+ZGV2CQkJPSAmcGRldi0+ZGV2OwogCWRldl9pbmZvLT53MV9kZXYJCT0gcGRldi0+ZGV2LnBhcmVudDsKLQlkZXZfaW5mby0+YmF0Lm5hbWUJCT0gZGV2X25hbWUoJnBkZXYtPmRldik7Ci0JZGV2X2luZm8tPmJhdC50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JZGV2X2luZm8tPmJhdC5wcm9wZXJ0aWVzCT0gZHMyNzgwX2JhdHRlcnlfcHJvcHM7Ci0JZGV2X2luZm8tPmJhdC5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoZHMyNzgwX2JhdHRlcnlfcHJvcHMpOwotCWRldl9pbmZvLT5iYXQuZ2V0X3Byb3BlcnR5CT0gZHMyNzgwX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OworCWRldl9pbmZvLT5iYXRfZGVzYy5uYW1lCQk9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCWRldl9pbmZvLT5iYXRfZGVzYy50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CisJZGV2X2luZm8tPmJhdF9kZXNjLnByb3BlcnRpZXMJPSBkczI3ODBfYmF0dGVyeV9wcm9wczsKKwlkZXZfaW5mby0+YmF0X2Rlc2MubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGRzMjc4MF9iYXR0ZXJ5X3Byb3BzKTsKKwlkZXZfaW5mby0+YmF0X2Rlc2MuZ2V0X3Byb3BlcnR5CT0gZHMyNzgwX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZkZXZfaW5mby0+YmF0KTsKLQlpZiAocmV0KSB7CisJcHN5X2NmZy5kcnZfZGF0YQkJPSBkZXZfaW5mbzsKKworCWRldl9pbmZvLT5iYXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmRldl9pbmZvLT5iYXRfZGVzYywKKwkJCQkJICAgICAgJnBzeV9jZmcpOworCWlmIChJU19FUlIoZGV2X2luZm8tPmJhdCkpIHsKIAkJZGV2X2VycihkZXZfaW5mby0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGJhdHRlcnlcbiIpOworCQlyZXQgPSBQVFJfRVJSKGRldl9pbmZvLT5iYXQpOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXZfaW5mby0+YmF0LmRldi0+a29iaiwgJmRzMjc4MF9hdHRyX2dyb3VwKTsKKwlyZXQgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldl9pbmZvLT5iYXQtPmRldi5rb2JqLCAmZHMyNzgwX2F0dHJfZ3JvdXApOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXZfaW5mby0+ZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBncm91cFxuIik7CiAJCWdvdG8gZmFpbF91bnJlZ2lzdGVyOwogCX0KIAotCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmZGV2X2luZm8tPmJhdC5kZXYtPmtvYmosCisJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwKIAkJCQkJJmRzMjc4MF9wYXJhbV9lZXByb21fYmluX2F0dHIpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXZfaW5mby0+ZGV2LApAQCAtNzk2LDcgKzgwMiw3IEBACiAJCWdvdG8gZmFpbF9yZW1vdmVfZ3JvdXA7CiAJfQogCi0JcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZkZXZfaW5mby0+YmF0LmRldi0+a29iaiwKKwlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmRldl9pbmZvLT5iYXQtPmRldi5rb2JqLAogCQkJCQkmZHMyNzgwX3VzZXJfZWVwcm9tX2Jpbl9hdHRyKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2X2luZm8tPmRldiwKQEAgLTgwNywxMiArODEzLDEyIEBACiAJcmV0dXJuIDA7CiAKIGZhaWxfcmVtb3ZlX2Jpbl9maWxlOgotCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmZGV2X2luZm8tPmJhdC5kZXYtPmtvYmosCisJc3lzZnNfcmVtb3ZlX2Jpbl9maWxlKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwKIAkJCQkmZHMyNzgwX3BhcmFtX2VlcHJvbV9iaW5fYXR0cik7CiBmYWlsX3JlbW92ZV9ncm91cDoKLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldl9pbmZvLT5iYXQuZGV2LT5rb2JqLCAmZHMyNzgwX2F0dHJfZ3JvdXApOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosICZkczI3ODBfYXR0cl9ncm91cCk7CiBmYWlsX3VucmVnaXN0ZXI6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRldl9pbmZvLT5iYXQpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRldl9pbmZvLT5iYXQpOwogZmFpbDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtODIxLDEwICs4MjcsMTMgQEAKIHsKIAlzdHJ1Y3QgZHMyNzgwX2RldmljZV9pbmZvICpkZXZfaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JLyogcmVtb3ZlIGF0dHJpYnV0ZXMgKi8KLQlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldl9pbmZvLT5iYXQuZGV2LT5rb2JqLCAmZHMyNzgwX2F0dHJfZ3JvdXApOworCS8qCisJICogUmVtb3ZlIGF0dHJpYnV0ZXMgYmVmb3JlIHVucmVnaXN0ZXJpbmcgcG93ZXIgc3VwcGx5CisJICogYmVjYXVzZSAnYmF0JyB3aWxsIGJlIGZyZWVkIG9uIHBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCkgY2FsbC4KKwkgKi8KKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldl9pbmZvLT5iYXQtPmRldi5rb2JqLCAmZHMyNzgwX2F0dHJfZ3JvdXApOwogCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRldl9pbmZvLT5iYXQpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGRldl9pbmZvLT5iYXQpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2RzMjc4MV9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL2RzMjc4MV9iYXR0ZXJ5LmMKaW5kZXggMGE1YWNjNi4uNTZkNTgzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9kczI3ODFfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvZHMyNzgxX2JhdHRlcnkuYwpAQCAtMzUsNyArMzUsOCBAQAogCiBzdHJ1Y3QgZHMyNzgxX2RldmljZV9pbmZvIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSBiYXQ7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBiYXRfZGVzYzsKIAlzdHJ1Y3QgZGV2aWNlICp3MV9kZXY7CiB9OwogCkBAIC01MCw3ICs1MSw3IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkczI3ODFfZGV2aWNlX2luZm8gKgogdG9fZHMyNzgxX2RldmljZV9pbmZvKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKIHsKLQlyZXR1cm4gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbywgYmF0KTsKKwlyZXR1cm4gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBvd2VyX3N1cHBseSAqdG9fcG93ZXJfc3VwcGx5KHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTMyOCw3ICszMjksNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHBvd2VyX3N1cHBseV9hbV9pX3N1cHBsaWVkKCZkZXZfaW5mby0+YmF0KSkgeworCWlmIChwb3dlcl9zdXBwbHlfYW1faV9zdXBwbGllZChkZXZfaW5mby0+YmF0KSkgewogCQlpZiAoY2FwYWNpdHkgPT0gMTAwKQogCQkJKnN0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKIAkJZWxzZSBpZiAoY3VycmVudF91QSA+IDUwMDAwKQpAQCAtNzUyLDYgKzc1Myw3IEBACiAKIHN0YXRpYyBpbnQgZHMyNzgxX2JhdHRlcnlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm87CiAKQEAgLTc2MywyNSArNzY1LDI5IEBACiAKIAlkZXZfaW5mby0+ZGV2CQkJPSAmcGRldi0+ZGV2OwogCWRldl9pbmZvLT53MV9kZXYJCT0gcGRldi0+ZGV2LnBhcmVudDsKLQlkZXZfaW5mby0+YmF0Lm5hbWUJCT0gZGV2X25hbWUoJnBkZXYtPmRldik7Ci0JZGV2X2luZm8tPmJhdC50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JZGV2X2luZm8tPmJhdC5wcm9wZXJ0aWVzCT0gZHMyNzgxX2JhdHRlcnlfcHJvcHM7Ci0JZGV2X2luZm8tPmJhdC5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoZHMyNzgxX2JhdHRlcnlfcHJvcHMpOwotCWRldl9pbmZvLT5iYXQuZ2V0X3Byb3BlcnR5CT0gZHMyNzgxX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OworCWRldl9pbmZvLT5iYXRfZGVzYy5uYW1lCQk9IGRldl9uYW1lKCZwZGV2LT5kZXYpOworCWRldl9pbmZvLT5iYXRfZGVzYy50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CisJZGV2X2luZm8tPmJhdF9kZXNjLnByb3BlcnRpZXMJPSBkczI3ODFfYmF0dGVyeV9wcm9wczsKKwlkZXZfaW5mby0+YmF0X2Rlc2MubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGRzMjc4MV9iYXR0ZXJ5X3Byb3BzKTsKKwlkZXZfaW5mby0+YmF0X2Rlc2MuZ2V0X3Byb3BlcnR5CT0gZHMyNzgxX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZkZXZfaW5mby0+YmF0KTsKLQlpZiAocmV0KSB7CisJcHN5X2NmZy5kcnZfZGF0YQkJPSBkZXZfaW5mbzsKKworCWRldl9pbmZvLT5iYXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmRldl9pbmZvLT5iYXRfZGVzYywKKwkJCQkJCSZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGRldl9pbmZvLT5iYXQpKSB7CiAJCWRldl9lcnIoZGV2X2luZm8tPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBiYXR0ZXJ5XG4iKTsKKwkJcmV0ID0gUFRSX0VSUihkZXZfaW5mby0+YmF0KTsKIAkJZ290byBmYWlsOwogCX0KIAotCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGV2X2luZm8tPmJhdC5kZXYtPmtvYmosICZkczI3ODFfYXR0cl9ncm91cCk7CisJcmV0ID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwgJmRzMjc4MV9hdHRyX2dyb3VwKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2X2luZm8tPmRldiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZ3JvdXBcbiIpOwogCQlnb3RvIGZhaWxfdW5yZWdpc3RlcjsKIAl9CiAKLQlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmRldl9pbmZvLT5iYXQuZGV2LT5rb2JqLAorCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosCiAJCQkJCSZkczI3ODFfcGFyYW1fZWVwcm9tX2Jpbl9hdHRyKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2X2luZm8tPmRldiwKQEAgLTc4OSw3ICs3OTUsNyBAQAogCQlnb3RvIGZhaWxfcmVtb3ZlX2dyb3VwOwogCX0KIAotCXJldCA9IHN5c2ZzX2NyZWF0ZV9iaW5fZmlsZSgmZGV2X2luZm8tPmJhdC5kZXYtPmtvYmosCisJcmV0ID0gc3lzZnNfY3JlYXRlX2Jpbl9maWxlKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwKIAkJCQkJJmRzMjc4MV91c2VyX2VlcHJvbV9iaW5fYXR0cik7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldl9pbmZvLT5kZXYsCkBAIC04MDAsMTIgKzgwNiwxMiBAQAogCXJldHVybiAwOwogCiBmYWlsX3JlbW92ZV9iaW5fZmlsZToKLQlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJmRldl9pbmZvLT5iYXQuZGV2LT5rb2JqLAorCXN5c2ZzX3JlbW92ZV9iaW5fZmlsZSgmZGV2X2luZm8tPmJhdC0+ZGV2LmtvYmosCiAJCQkJJmRzMjc4MV9wYXJhbV9lZXByb21fYmluX2F0dHIpOwogZmFpbF9yZW1vdmVfZ3JvdXA6Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXZfaW5mby0+YmF0LmRldi0+a29iaiwgJmRzMjc4MV9hdHRyX2dyb3VwKTsKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRldl9pbmZvLT5iYXQtPmRldi5rb2JqLCAmZHMyNzgxX2F0dHJfZ3JvdXApOwogZmFpbF91bnJlZ2lzdGVyOgotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkZXZfaW5mby0+YmF0KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkZXZfaW5mby0+YmF0KTsKIGZhaWw6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTgxNCwxMCArODIwLDEzIEBACiB7CiAJc3RydWN0IGRzMjc4MV9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCS8qIHJlbW92ZSBhdHRyaWJ1dGVzICovCi0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXZfaW5mby0+YmF0LmRldi0+a29iaiwgJmRzMjc4MV9hdHRyX2dyb3VwKTsKKwkvKgorCSAqIFJlbW92ZSBhdHRyaWJ1dGVzIGJlZm9yZSB1bnJlZ2lzdGVyaW5nIHBvd2VyIHN1cHBseQorCSAqIGJlY2F1c2UgJ2JhdCcgd2lsbCBiZSBmcmVlZCBvbiBwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigpIGNhbGwuCisJICovCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkZXZfaW5mby0+YmF0LT5kZXYua29iaiwgJmRzMjc4MV9hdHRyX2dyb3VwKTsKIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkZXZfaW5mby0+YmF0KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkZXZfaW5mby0+YmF0KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9kczI3ODJfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9kczI3ODJfYmF0dGVyeS5jCmluZGV4IDM5Njk0ODguLmVkNGQ3NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvZHMyNzgyX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL2RzMjc4Ml9iYXR0ZXJ5LmMKQEAgLTUzLDExICs1MywxMiBAQAogCWludCAoKmdldF9iYXR0ZXJ5X2NhcGFjaXR5KShzdHJ1Y3QgZHMyNzh4X2luZm8gKmluZm8sIGludCAqY2FwYWNpdHkpOwogfTsKIAotI2RlZmluZSB0b19kczI3OHhfaW5mbyh4KSBjb250YWluZXJfb2YoeCwgc3RydWN0IGRzMjc4eF9pbmZvLCBiYXR0ZXJ5KQorI2RlZmluZSB0b19kczI3OHhfaW5mbyh4KSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEoeCkKIAogc3RydWN0IGRzMjc4eF9pbmZvIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkqY2xpZW50OwotCXN0cnVjdCBwb3dlcl9zdXBwbHkJYmF0dGVyeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CSpiYXR0ZXJ5OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYwliYXR0ZXJ5X2Rlc2M7CiAJc3RydWN0IGRzMjc4eF9iYXR0ZXJ5X29wcyAgKm9wczsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCWJhdF93b3JrOwogCWludAkJCWlkOwpAQCAtMjg1LDcgKzI4Niw3IEBACiAJZHMyNzh4X2dldF9zdGF0dXMoaW5mbywgJmluZm8tPnN0YXR1cyk7CiAKIAlpZiAoKG9sZF9zdGF0dXMgIT0gaW5mby0+c3RhdHVzKSB8fCAob2xkX2NhcGFjaXR5ICE9IGluZm8tPmNhcGFjaXR5KSkKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmluZm8tPmJhdHRlcnkpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChpbmZvLT5iYXR0ZXJ5KTsKIH0KIAogc3RhdGljIHZvaWQgZHMyNzh4X2JhdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTMwNiw3ICszMDcsNyBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCiB9OwogCi1zdGF0aWMgdm9pZCBkczI3OHhfcG93ZXJfc3VwcGx5X2luaXQoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeSkKK3N0YXRpYyB2b2lkIGRzMjc4eF9wb3dlcl9zdXBwbHlfaW5pdChzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKmJhdHRlcnkpCiB7CiAJYmF0dGVyeS0+dHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKIAliYXR0ZXJ5LT5wcm9wZXJ0aWVzCQk9IGRzMjc4eF9iYXR0ZXJ5X3Byb3BzOwpAQCAtMzE5LDggKzMyMCw4IEBACiB7CiAJc3RydWN0IGRzMjc4eF9pbmZvICppbmZvID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmaW5mby0+YmF0dGVyeSk7Ci0Ja2ZyZWUoaW5mby0+YmF0dGVyeS5uYW1lKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihpbmZvLT5iYXR0ZXJ5KTsKKwlrZnJlZShpbmZvLT5iYXR0ZXJ5X2Rlc2MubmFtZSk7CiAKIAltdXRleF9sb2NrKCZiYXR0ZXJ5X2xvY2spOwogCWlkcl9yZW1vdmUoJmJhdHRlcnlfaWQsIGluZm8tPmlkKTsKQEAgLTM3Nyw2ICszNzgsNyBAQAogCQkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgZHMyNzh4X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAJc3RydWN0IGRzMjc4eF9pbmZvICppbmZvOwogCWludCByZXQ7CiAJaW50IG51bTsKQEAgLTQwNCw4ICs0MDYsOSBAQAogCQlnb3RvIGZhaWxfaW5mbzsKIAl9CiAKLQlpbmZvLT5iYXR0ZXJ5Lm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzLSVkIiwgY2xpZW50LT5uYW1lLCBudW0pOwotCWlmICghaW5mby0+YmF0dGVyeS5uYW1lKSB7CisJaW5mby0+YmF0dGVyeV9kZXNjLm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzLSVkIiwKKwkJCQkJICAgIGNsaWVudC0+bmFtZSwgbnVtKTsKKwlpZiAoIWluZm8tPmJhdHRlcnlfZGVzYy5uYW1lKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbF9uYW1lOwogCX0KQEAgLTQxNywxNiArNDIwLDE5IEBACiAJaW5mby0+Y2xpZW50ID0gY2xpZW50OwogCWluZm8tPmlkID0gbnVtOwogCWluZm8tPm9wcyAgPSAmZHMyNzh4X29wc1tpZC0+ZHJpdmVyX2RhdGFdOwotCWRzMjc4eF9wb3dlcl9zdXBwbHlfaW5pdCgmaW5mby0+YmF0dGVyeSk7CisJZHMyNzh4X3Bvd2VyX3N1cHBseV9pbml0KCZpbmZvLT5iYXR0ZXJ5X2Rlc2MpOworCXBzeV9jZmcuZHJ2X2RhdGEgPSBpbmZvOwogCiAJaW5mby0+Y2FwYWNpdHkgPSAxMDA7CiAJaW5mby0+c3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmluZm8tPmJhdF93b3JrLCBkczI3OHhfYmF0X3dvcmspOwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmluZm8tPmJhdHRlcnkpOwotCWlmIChyZXQpIHsKKwlpbmZvLT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKKwkJCQkJICAgICAgJmluZm8tPmJhdHRlcnlfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoaW5mby0+YmF0dGVyeSkpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgYmF0dGVyeVxuIik7CisJCXJldCA9IFBUUl9FUlIoaW5mby0+YmF0dGVyeSk7CiAJCWdvdG8gZmFpbF9yZWdpc3RlcjsKIAl9IGVsc2UgewogCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmluZm8tPmJhdF93b3JrLCBEUzI3OHhfREVMQVkpOwpAQCAtNDM1LDcgKzQ0MSw3IEBACiAJcmV0dXJuIDA7CiAKIGZhaWxfcmVnaXN0ZXI6Ci0Ja2ZyZWUoaW5mby0+YmF0dGVyeS5uYW1lKTsKKwlrZnJlZShpbmZvLT5iYXR0ZXJ5X2Rlc2MubmFtZSk7CiBmYWlsX25hbWU6CiAJa2ZyZWUoaW5mbyk7CiBmYWlsX2luZm86CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2dlbmVyaWMtYWRjLWJhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvZ2VuZXJpYy1hZGMtYmF0dGVyeS5jCmluZGV4IGQ3MjczM2UuLmZlZGM1ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvZ2VuZXJpYy1hZGMtYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvZ2VuZXJpYy1hZGMtYmF0dGVyeS5jCkBAIC00NCw3ICs0NCw4IEBACiB9OwogCiBzdHJ1Y3QgZ2FiIHsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5CXBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CQkqcHN5OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYwlwc3lfZGVzYzsKIAlzdHJ1Y3QgaWlvX2NoYW5uZWwJKmNoYW5uZWxbR0FCX01BWF9DSEFOX1RZUEVdOwogCXN0cnVjdCBnYWJfcGxhdGZvcm1fZGF0YQkqcGRhdGE7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBiYXRfd29yazsKQEAgLTU1LDcgKzU2LDcgQEAKIAogc3RhdGljIHN0cnVjdCBnYWIgKnRvX2dlbmVyaWNfYmF0KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKIHsKLQlyZXR1cm4gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IGdhYiwgcHN5KTsKKwlyZXR1cm4gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiB9CiAKIHN0YXRpYyB2b2lkIGdhYl9leHRfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCkBAIC0xNTEsNyArMTUyLDcgQEAKIAogCWFkY19iYXQgPSB0b19nZW5lcmljX2JhdChwc3kpOwogCWlmICghYWRjX2JhdCkgewotCQlkZXZfZXJyKHBzeS0+ZGV2LCAibm8gYmF0dGVyeSBpbmZvcyA/IVxuIik7CisJCWRldl9lcnIoJnBzeS0+ZGV2LCAibm8gYmF0dGVyeSBpbmZvcyA/IVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlwZGF0YSA9IGFkY19iYXQtPnBkYXRhOwpAQCAtMTU5LDcgKzE2MCw3IEBACiAKIAlzd2l0Y2ggKHBzcCkgewogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgotCQlnYWJfZ2V0X3N0YXR1cyhhZGNfYmF0KTsKKwkJdmFsLT5pbnR2YWwgPSBnYWJfZ2V0X3N0YXR1cyhhZGNfYmF0KTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRU1QVFlfREVTSUdOOgogCQl2YWwtPmludHZhbCA9IDA7CkBAIC0yMTAsNyArMjExLDcgQEAKIAlwZGF0YSA9IGFkY19iYXQtPnBkYXRhOwogCXN0YXR1cyA9IGFkY19iYXQtPnN0YXR1czsKIAotCWlzX3BsdWdnZWQgPSBwb3dlcl9zdXBwbHlfYW1faV9zdXBwbGllZCgmYWRjX2JhdC0+cHN5KTsKKwlpc19wbHVnZ2VkID0gcG93ZXJfc3VwcGx5X2FtX2lfc3VwcGxpZWQoYWRjX2JhdC0+cHN5KTsKIAlhZGNfYmF0LT5jYWJsZV9wbHVnZ2VkID0gaXNfcGx1Z2dlZDsKIAogCWlmICghaXNfcGx1Z2dlZCkKQEAgLTIyMSw3ICsyMjIsNyBAQAogCQlhZGNfYmF0LT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOwogCiAJaWYgKHN0YXR1cyAhPSBhZGNfYmF0LT5zdGF0dXMpCi0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZhZGNfYmF0LT5wc3kpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChhZGNfYmF0LT5wc3kpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgZ2FiX2NoYXJnZWQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQpAQCAtMjM5LDcgKzI0MCw4IEBACiBzdGF0aWMgaW50IGdhYl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBnYWIgKmFkY19iYXQ7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqcHN5X2Rlc2M7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCXN0cnVjdCBnYWJfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSAqcHJvcGVydGllczsKIAlpbnQgcmV0ID0gMDsKQEAgLTI1MiwzMiArMjU0LDM0IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCXBzeSA9ICZhZGNfYmF0LT5wc3k7Ci0JcHN5LT5uYW1lID0gcGRhdGEtPmJhdHRlcnlfaW5mby5uYW1lOworCXBzeV9jZmcuZHJ2X2RhdGEgPSBhZGNfYmF0OworCXBzeV9kZXNjID0gJmFkY19iYXQtPnBzeV9kZXNjOworCXBzeV9kZXNjLT5uYW1lID0gcGRhdGEtPmJhdHRlcnlfaW5mby5uYW1lOwogCiAJLyogYm9vdHVwIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgYmF0dGVyeSAqLwogCWFkY19iYXQtPmNhYmxlX3BsdWdnZWQgPSBmYWxzZTsKIAlhZGNfYmF0LT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwotCXBzeS0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JcHN5LT5nZXRfcHJvcGVydHkgPSBnYWJfZ2V0X3Byb3BlcnR5OwotCXBzeS0+ZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9IGdhYl9leHRfcG93ZXJfY2hhbmdlZDsKKwlwc3lfZGVzYy0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CisJcHN5X2Rlc2MtPmdldF9wcm9wZXJ0eSA9IGdhYl9nZXRfcHJvcGVydHk7CisJcHN5X2Rlc2MtPmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSBnYWJfZXh0X3Bvd2VyX2NoYW5nZWQ7CiAJYWRjX2JhdC0+cGRhdGEgPSBwZGF0YTsKIAogCS8qCiAJICogY29weWluZyB0aGUgc3RhdGljIHByb3BlcnRpZXMgYW5kIGFsbG9jYXRpbmcgZXh0cmEgbWVtb3J5IGZvciBob2xkaW5nCiAJICogdGhlIGV4dHJhIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIHJlY2VpdmVkIGZyb20gcGxhdGZvcm0gZGF0YS4KIAkgKi8KLQlwc3ktPnByb3BlcnRpZXMgPSBrY2FsbG9jKEFSUkFZX1NJWkUoZ2FiX3Byb3BzKSArCisJcHN5X2Rlc2MtPnByb3BlcnRpZXMgPSBrY2FsbG9jKEFSUkFZX1NJWkUoZ2FiX3Byb3BzKSArCiAJCQkJCUFSUkFZX1NJWkUoZ2FiX2NoYW5fbmFtZSksCi0JCQkJCXNpemVvZigqcHN5LT5wcm9wZXJ0aWVzKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwc3ktPnByb3BlcnRpZXMpIHsKKwkJCQkJc2l6ZW9mKCpwc3lfZGVzYy0+cHJvcGVydGllcyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghcHN5X2Rlc2MtPnByb3BlcnRpZXMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBmaXJzdF9tZW1fZmFpbDsKIAl9CiAKLQltZW1jcHkocHN5LT5wcm9wZXJ0aWVzLCBnYWJfcHJvcHMsIHNpemVvZihnYWJfcHJvcHMpKTsKKwltZW1jcHkocHN5X2Rlc2MtPnByb3BlcnRpZXMsIGdhYl9wcm9wcywgc2l6ZW9mKGdhYl9wcm9wcykpOwogCXByb3BlcnRpZXMgPSAoZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgKikKLQkJCQkoKGNoYXIgKilwc3ktPnByb3BlcnRpZXMgKyBzaXplb2YoZ2FiX3Byb3BzKSk7CisJCQkoKGNoYXIgKilwc3lfZGVzYy0+cHJvcGVydGllcyArIHNpemVvZihnYWJfcHJvcHMpKTsKIAogCS8qCiAJICogZ2V0dGluZyBjaGFubmVsIGZyb20gaWlvIGFuZCBjb3B5aW5nIHRoZSBiYXR0ZXJ5IHByb3BlcnRpZXMKQEAgLTI5MSw3ICsyOTUsNyBAQAogCQkJYWRjX2JhdC0+Y2hhbm5lbFtjaGFuXSA9IE5VTEw7CiAJCX0gZWxzZSB7CiAJCQkvKiBjb3B5aW5nIHByb3BlcnRpZXMgZm9yIHN1cHBvcnRlZCBjaGFubmVscyBvbmx5ICovCi0JCQltZW1jcHkocHJvcGVydGllcyArIHNpemVvZigqKHBzeS0+cHJvcGVydGllcykpICogaW5kZXgsCisJCQltZW1jcHkocHJvcGVydGllcyArIHNpemVvZigqKHBzeV9kZXNjLT5wcm9wZXJ0aWVzKSkgKiBpbmRleCwKIAkJCQkJJmdhYl9keW5fcHJvcHNbY2hhbl0sCiAJCQkJCXNpemVvZihnYWJfZHluX3Byb3BzW2NoYW5dKSk7CiAJCQlpbmRleCsrOwpAQCAtMzEwLDExICszMTQsMTMgQEAKIAkgKiBhcyBjb21lIGNoYW5uZWxzIG1heSBiZSBub3QgYmUgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuU28KIAkgKiB3ZSBuZWVkIHRvIHRha2UgY2FyZSBvZiB0aGF0LgogCSAqLwotCXBzeS0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGdhYl9wcm9wcykgKyBpbmRleDsKKwlwc3lfZGVzYy0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGdhYl9wcm9wcykgKyBpbmRleDsKIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCBwc3kpOwotCWlmIChyZXQpCisJYWRjX2JhdC0+cHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsIHBzeV9kZXNjLCAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihhZGNfYmF0LT5wc3kpKSB7CisJCXJldCA9IFBUUl9FUlIoYWRjX2JhdC0+cHN5KTsKIAkJZ290byBlcnJfcmVnX2ZhaWw7CisJfQogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmFkY19iYXQtPmJhdF93b3JrLCBnYWJfd29yayk7CiAKQEAgLTM0MiwxNCArMzQ4LDE0IEBACiBlcnJfZ3BpbzoKIAlncGlvX2ZyZWUocGRhdGEtPmdwaW9fY2hhcmdlX2ZpbmlzaGVkKTsKIGdwaW9fcmVxX2ZhaWw6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocHN5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihhZGNfYmF0LT5wc3kpOwogZXJyX3JlZ19mYWlsOgogCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBBUlJBWV9TSVpFKGdhYl9jaGFuX25hbWUpOyBjaGFuKyspIHsKIAkJaWYgKGFkY19iYXQtPmNoYW5uZWxbY2hhbl0pCiAJCQlpaW9fY2hhbm5lbF9yZWxlYXNlKGFkY19iYXQtPmNoYW5uZWxbY2hhbl0pOwogCX0KIHNlY29uZF9tZW1fZmFpbDoKLQlrZnJlZShwc3ktPnByb3BlcnRpZXMpOworCWtmcmVlKHBzeV9kZXNjLT5wcm9wZXJ0aWVzKTsKIGZpcnN0X21lbV9mYWlsOgogCXJldHVybiByZXQ7CiB9CkBAIC0zNjAsNyArMzY2LDcgQEAKIAlzdHJ1Y3QgZ2FiICphZGNfYmF0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGdhYl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGFkY19iYXQtPnBkYXRhOwogCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmFkY19iYXQtPnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYWRjX2JhdC0+cHN5KTsKIAogCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvX2NoYXJnZV9maW5pc2hlZCkpIHsKIAkJZnJlZV9pcnEoZ3Bpb190b19pcnEocGRhdGEtPmdwaW9fY2hhcmdlX2ZpbmlzaGVkKSwgYWRjX2JhdCk7CkBAIC0zNzIsNyArMzc4LDcgQEAKIAkJCWlpb19jaGFubmVsX3JlbGVhc2UoYWRjX2JhdC0+Y2hhbm5lbFtjaGFuXSk7CiAJfQogCi0Ja2ZyZWUoYWRjX2JhdC0+cHN5LnByb3BlcnRpZXMpOworCWtmcmVlKGFkY19iYXQtPnBzeV9kZXNjLnByb3BlcnRpZXMpOwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmFkY19iYXQtPmJhdF93b3JrKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvZ29sZGZpc2hfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9nb2xkZmlzaF9iYXR0ZXJ5LmMKaW5kZXggMjllYmE4OC4uYTUwYmI5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9nb2xkZmlzaF9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9nb2xkZmlzaF9iYXR0ZXJ5LmMKQEAgLTMwLDggKzMwLDggQEAKIAlpbnQgaXJxOwogCXNwaW5sb2NrX3QgbG9jazsKIAotCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0dGVyeTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGFjOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYWM7CiB9OwogCiAjZGVmaW5lIEdPTERGSVNIX0JBVFRFUllfUkVBRChkYXRhLCBhZGRyKSBcCkBAIC02Nyw4ICs2Nyw3IEBACiAJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBnb2xkZmlzaF9iYXR0ZXJ5X2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YocHN5LAotCQlzdHJ1Y3QgZ29sZGZpc2hfYmF0dGVyeV9kYXRhLCBhYyk7CisJc3RydWN0IGdvbGRmaXNoX2JhdHRlcnlfZGF0YSAqZGF0YSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCWludCByZXQgPSAwOwogCiAJc3dpdGNoIChwc3ApIHsKQEAgLTg2LDggKzg1LDcgQEAKIAkJCQkgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJCSB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBnb2xkZmlzaF9iYXR0ZXJ5X2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YocHN5LAotCQlzdHJ1Y3QgZ29sZGZpc2hfYmF0dGVyeV9kYXRhLCBiYXR0ZXJ5KTsKKwlzdHJ1Y3QgZ29sZGZpc2hfYmF0dGVyeV9kYXRhICpkYXRhID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKHBzcCkgewpAQCAtMTM5LDIwICsxMzcsMzYgQEAKIAlzdGF0dXMgJj0gQkFUVEVSWV9JTlRfTUFTSzsKIAogCWlmIChzdGF0dXMgJiBCQVRURVJZX1NUQVRVU19DSEFOR0VEKQotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmZGF0YS0+YmF0dGVyeSk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGRhdGEtPmJhdHRlcnkpOwogCWlmIChzdGF0dXMgJiBBQ19TVEFUVVNfQ0hBTkdFRCkKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmRhdGEtPmFjKTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGF0YS0+YWMpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGF0YS0+bG9jaywgaXJxX2ZsYWdzKTsKIAlyZXR1cm4gc3RhdHVzID8gSVJRX0hBTkRMRUQgOiBJUlFfTk9ORTsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBiYXR0ZXJ5X2Rlc2MgPSB7CisJLnByb3BlcnRpZXMJPSBnb2xkZmlzaF9iYXR0ZXJ5X3Byb3BzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoZ29sZGZpc2hfYmF0dGVyeV9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IGdvbGRmaXNoX2JhdHRlcnlfZ2V0X3Byb3BlcnR5LAorCS5uYW1lCQk9ICJiYXR0ZXJ5IiwKKwkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBhY19kZXNjID0geworCS5wcm9wZXJ0aWVzCT0gZ29sZGZpc2hfYWNfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShnb2xkZmlzaF9hY19wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IGdvbGRmaXNoX2FjX2dldF9wcm9wZXJ0eSwKKwkubmFtZQkJPSAiYWMiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TLAorfTsKIAogc3RhdGljIGludCBnb2xkZmlzaF9iYXR0ZXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJc3RydWN0IGdvbGRmaXNoX2JhdHRlcnlfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAKIAlkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwogCWlmIChkYXRhID09IE5VTEwpCkBAIC0xNjAsMTggKzE3NCw2IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmZGF0YS0+bG9jayk7CiAKLQlkYXRhLT5iYXR0ZXJ5LnByb3BlcnRpZXMgPSBnb2xkZmlzaF9iYXR0ZXJ5X3Byb3BzOwotCWRhdGEtPmJhdHRlcnkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGdvbGRmaXNoX2JhdHRlcnlfcHJvcHMpOwotCWRhdGEtPmJhdHRlcnkuZ2V0X3Byb3BlcnR5ID0gZ29sZGZpc2hfYmF0dGVyeV9nZXRfcHJvcGVydHk7Ci0JZGF0YS0+YmF0dGVyeS5uYW1lID0gImJhdHRlcnkiOwotCWRhdGEtPmJhdHRlcnkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0KLQlkYXRhLT5hYy5wcm9wZXJ0aWVzID0gZ29sZGZpc2hfYWNfcHJvcHM7Ci0JZGF0YS0+YWMubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGdvbGRmaXNoX2FjX3Byb3BzKTsKLQlkYXRhLT5hYy5nZXRfcHJvcGVydHkgPSBnb2xkZmlzaF9hY19nZXRfcHJvcGVydHk7Ci0JZGF0YS0+YWMubmFtZSA9ICJhYyI7Ci0JZGF0YS0+YWMudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOwotCiAJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJaWYgKHIgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwbGF0Zm9ybV9nZXRfcmVzb3VyY2UgZmFpbGVkXG4iKTsKQEAgLTE5NSwxNCArMTk3LDE3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmZGF0YS0+YWMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJcHN5X2NmZy5kcnZfZGF0YSA9IGRhdGE7CiAKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmRhdGEtPmJhdHRlcnkpOwotCWlmIChyZXQpIHsKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRhdGEtPmFjKTsKLQkJcmV0dXJuIHJldDsKKwlkYXRhLT5hYyA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmYWNfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoZGF0YS0+YWMpKQorCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5hYyk7CisKKwlkYXRhLT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZiYXR0ZXJ5X2Rlc2MsCisJCQkJCQkmcHN5X2NmZyk7CisJaWYgKElTX0VSUihkYXRhLT5iYXR0ZXJ5KSkgeworCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkYXRhLT5hYyk7CisJCXJldHVybiBQVFJfRVJSKGRhdGEtPmJhdHRlcnkpOwogCX0KIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRhdGEpOwpAQCAtMjE2LDggKzIyMSw4IEBACiB7CiAJc3RydWN0IGdvbGRmaXNoX2JhdHRlcnlfZGF0YSAqZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRhdGEtPmJhdHRlcnkpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkYXRhLT5hYyk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGF0YS0+YmF0dGVyeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGF0YS0+YWMpOwogCWJhdHRlcnlfZGF0YSA9IE5VTEw7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2dwaW8tY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9ncGlvLWNoYXJnZXIuYwppbmRleCBiNzQyNGM4Li5jNTg2OWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2dwaW8tY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvZ3Bpby1jaGFyZ2VyLmMKQEAgLTMyLDcgKzMyLDggQEAKIAl1bnNpZ25lZCBpbnQgaXJxOwogCWJvb2wgd2FrZXVwX2VuYWJsZWQ7CiAKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGNoYXJnZXI7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqY2hhcmdlcjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgY2hhcmdlcl9kZXNjOwogfTsKIAogc3RhdGljIGlycXJldHVybl90IGdwaW9fY2hhcmdlcl9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCkBAIC00Niw3ICs0Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGdwaW9fY2hhcmdlciAqcHN5X3RvX2dwaW9fY2hhcmdlcihzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCiB7Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBncGlvX2NoYXJnZXIsIGNoYXJnZXIpOworCXJldHVybiBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIH0KIAogc3RhdGljIGludCBncGlvX2NoYXJnZXJfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKQEAgLTEyNyw4ICsxMjgsOSBAQAogc3RhdGljIGludCBncGlvX2NoYXJnZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAljb25zdCBzdHJ1Y3QgZ3Bpb19jaGFyZ2VyX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCXN0cnVjdCBncGlvX2NoYXJnZXIgKmdwaW9fY2hhcmdlcjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpjaGFyZ2VyOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqY2hhcmdlcl9kZXNjOwogCWludCByZXQ7CiAJaW50IGlycTsKIApAQCAtMTU0LDE2ICsxNTYsMTggQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JY2hhcmdlciA9ICZncGlvX2NoYXJnZXItPmNoYXJnZXI7CisJY2hhcmdlcl9kZXNjID0gJmdwaW9fY2hhcmdlci0+Y2hhcmdlcl9kZXNjOwogCi0JY2hhcmdlci0+bmFtZSA9IHBkYXRhLT5uYW1lID8gcGRhdGEtPm5hbWUgOiAiZ3Bpby1jaGFyZ2VyIjsKLQljaGFyZ2VyLT50eXBlID0gcGRhdGEtPnR5cGU7Ci0JY2hhcmdlci0+cHJvcGVydGllcyA9IGdwaW9fY2hhcmdlcl9wcm9wZXJ0aWVzOwotCWNoYXJnZXItPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShncGlvX2NoYXJnZXJfcHJvcGVydGllcyk7Ci0JY2hhcmdlci0+Z2V0X3Byb3BlcnR5ID0gZ3Bpb19jaGFyZ2VyX2dldF9wcm9wZXJ0eTsKLQljaGFyZ2VyLT5zdXBwbGllZF90byA9IHBkYXRhLT5zdXBwbGllZF90bzsKLQljaGFyZ2VyLT5udW1fc3VwcGxpY2FudHMgPSBwZGF0YS0+bnVtX3N1cHBsaWNhbnRzOwotCWNoYXJnZXItPm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwljaGFyZ2VyX2Rlc2MtPm5hbWUgPSBwZGF0YS0+bmFtZSA/IHBkYXRhLT5uYW1lIDogImdwaW8tY2hhcmdlciI7CisJY2hhcmdlcl9kZXNjLT50eXBlID0gcGRhdGEtPnR5cGU7CisJY2hhcmdlcl9kZXNjLT5wcm9wZXJ0aWVzID0gZ3Bpb19jaGFyZ2VyX3Byb3BlcnRpZXM7CisJY2hhcmdlcl9kZXNjLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoZ3Bpb19jaGFyZ2VyX3Byb3BlcnRpZXMpOworCWNoYXJnZXJfZGVzYy0+Z2V0X3Byb3BlcnR5ID0gZ3Bpb19jaGFyZ2VyX2dldF9wcm9wZXJ0eTsKKworCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBwZGF0YS0+c3VwcGxpZWRfdG87CisJcHN5X2NmZy5udW1fc3VwcGxpY2FudHMgPSBwZGF0YS0+bnVtX3N1cHBsaWNhbnRzOworCXBzeV9jZmcub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOworCXBzeV9jZmcuZHJ2X2RhdGEgPSBncGlvX2NoYXJnZXI7CiAKIAlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPmdwaW8sIGRldl9uYW1lKCZwZGV2LT5kZXYpKTsKIAlpZiAocmV0KSB7CkBAIC0xNzgsOCArMTgyLDEwIEBACiAKIAlncGlvX2NoYXJnZXItPnBkYXRhID0gcGRhdGE7CiAKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgY2hhcmdlcik7Ci0JaWYgKHJldCA8IDApIHsKKwlncGlvX2NoYXJnZXItPmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJCQkJCSAgICAgIGNoYXJnZXJfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoZ3Bpb19jaGFyZ2VyLT5jaGFyZ2VyKSkgeworCQlyZXQgPSBQVFJfRVJSKGdwaW9fY2hhcmdlci0+Y2hhcmdlcik7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBwb3dlciBzdXBwbHk6ICVkXG4iLAogCQkJcmV0KTsKIAkJZ290byBlcnJfZ3Bpb19mcmVlOwpAQCAtMTg5LDcgKzE5NSw3IEBACiAJaWYgKGlycSA+IDApIHsKIAkJcmV0ID0gcmVxdWVzdF9hbnlfY29udGV4dF9pcnEoaXJxLCBncGlvX2NoYXJnZXJfaXJxLAogCQkJCUlSUUZfVFJJR0dFUl9SSVNJTkcgfCBJUlFGX1RSSUdHRVJfRkFMTElORywKLQkJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwgY2hhcmdlcik7CisJCQkJZGV2X25hbWUoJnBkZXYtPmRldiksIGdwaW9fY2hhcmdlci0+Y2hhcmdlcik7CiAJCWlmIChyZXQgPCAwKQogCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGlycTogJWRcbiIsIHJldCk7CiAJCWVsc2UKQEAgLTIxMyw5ICsyMTksOSBAQAogCXN0cnVjdCBncGlvX2NoYXJnZXIgKmdwaW9fY2hhcmdlciA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJaWYgKGdwaW9fY2hhcmdlci0+aXJxKQotCQlmcmVlX2lycShncGlvX2NoYXJnZXItPmlycSwgJmdwaW9fY2hhcmdlci0+Y2hhcmdlcik7CisJCWZyZWVfaXJxKGdwaW9fY2hhcmdlci0+aXJxLCBncGlvX2NoYXJnZXItPmNoYXJnZXIpOwogCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmdwaW9fY2hhcmdlci0+Y2hhcmdlcik7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZ3Bpb19jaGFyZ2VyLT5jaGFyZ2VyKTsKIAogCWdwaW9fZnJlZShncGlvX2NoYXJnZXItPnBkYXRhLT5ncGlvKTsKIApAQCAtMjQxLDcgKzI0Nyw3IEBACiAKIAlpZiAoZGV2aWNlX21heV93YWtldXAoZGV2KSAmJiBncGlvX2NoYXJnZXItPndha2V1cF9lbmFibGVkKQogCQlkaXNhYmxlX2lycV93YWtlKGdwaW9fY2hhcmdlci0+aXJxKTsKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmZ3Bpb19jaGFyZ2VyLT5jaGFyZ2VyKTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChncGlvX2NoYXJnZXItPmNoYXJnZXIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2ludGVsX21pZF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL2ludGVsX21pZF9iYXR0ZXJ5LmMKaW5kZXggZGUzZjM5ZS4uOWZhNGFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9pbnRlbF9taWRfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvaW50ZWxfbWlkX2JhdHRlcnkuYwpAQCAtMTA3LDggKzEwNyw4IEBACiAJdW5zaWduZWQgaW50IGJhdHRfcHJldl9jaGFyZ2VfZnVsbDsJLyogaW4gbUFTICovCiAJdW5zaWduZWQgaW50IGJhdHRfY2hhcmdlX3JhdGU7CQkvKiBpbiB1bml0cyBwZXIgc2Vjb25kICovCiAKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IHVzYjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHQ7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqdXNiOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHQ7CiAJaW50IGlycTsJCQkJLyogR1BFX0lEIG9yIElSUSMgKi8KIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqbW9uaXRvcl93cXVldWU7CiAJc3RydWN0IGRlbGF5ZWRfd29yayBtb25pdG9yX2JhdHRlcnk7CkBAIC00MDQsOCArNDA0LDcgQEAKIAkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyAqcGJpID0gY29udGFpbmVyX29mKHBzeSwKLQkJCQlzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbywgdXNiKTsKKwlzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyAqcGJpID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAkvKiB1cGRhdGUgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyBtZW1iZXJzICovCiAJcG1pY19iYXR0ZXJ5X3JlYWRfc3RhdHVzKHBiaSk7CkBAIC00NDQsOCArNDQzLDcgQEAKIAkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbyAqcGJpID0gY29udGFpbmVyX29mKHBzeSwKLQkJCQlzdHJ1Y3QgcG1pY19wb3dlcl9tb2R1bGVfaW5mbywgYmF0dCk7CisJc3RydWN0IHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gKnBiaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJLyogdXBkYXRlIHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gbWVtYmVycyAqLwogCXBtaWNfYmF0dGVyeV9yZWFkX3N0YXR1cyhwYmkpOwpAQCAtNjQwLDYgKzYzOCwyNSBAQAogCQkJX19mdW5jX18pOwogfQogCisvKgorICogRGVzY3JpcHRpb24gb2YgcG93ZXIgc3VwcGxpZXMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBwbWljX3VzYl9kZXNjID0geworCS5uYW1lCQk9ICJwbWljLXVzYiIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCLAorCS5wcm9wZXJ0aWVzCT0gcG1pY191c2JfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShwbWljX3VzYl9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IHBtaWNfdXNiX2dldF9wcm9wZXJ0eSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgcG1pY19iYXR0X2Rlc2MgPSB7CisJLm5hbWUJCT0gInBtaWMtYmF0dCIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwk9IHBtaWNfYmF0dGVyeV9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKHBtaWNfYmF0dGVyeV9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IHBtaWNfYmF0dGVyeV9nZXRfcHJvcGVydHksCit9OworCiAvKioKICAqIHBtaWNfYmF0dGVyeV9wcm9iZSAtIHBtaWMgYmF0dGVyeSBpbml0aWFsaXplCiAgKiBAaXJxOiBwbWljIGJhdHRlcnkgZGV2aWNlIGlycQpAQCAtNjUzLDYgKzY3MCw3IEBACiB7CiAJaW50IHJldHZhbCA9IDA7CiAJc3RydWN0IHBtaWNfcG93ZXJfbW9kdWxlX2luZm8gKnBiaTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAKIAlkZXZfZGJnKGRldiwgInBtaWMtYmF0dGVyeTogZm91bmQgcG1pYyBiYXR0ZXJ5IGRldmljZVxuIik7CiAKQEAgLTY2Niw2ICs2ODQsNyBAQAogCXBiaS0+ZGV2ID0gZGV2OwogCXBiaS0+aXJxID0gaXJxOwogCWRldl9zZXRfZHJ2ZGF0YShkZXYsIHBiaSk7CisJcHN5X2NmZy5kcnZfZGF0YSA9IHBiaTsKIAogCS8qIGluaXRpYWxpemUgYWxsIHJlcXVpcmVkIGZyYW1ld29yayBiZWZvcmUgZW5hYmxpbmcgaW50ZXJydXB0cyAqLwogCUlOSVRfV09SSygmcGJpLT5oYW5kbGVyLCBwbWljX2JhdHRlcnlfaGFuZGxlX2ludHJwdCk7CkBAIC02ODcsMTYgKzcwNiwxMiBAQAogCX0KIAogCS8qIHJlZ2lzdGVyIHBtaWMtYmF0dCB3aXRoIHBvd2VyIHN1cHBseSBzdWJzeXN0ZW0gKi8KLQlwYmktPmJhdHQubmFtZSA9ICJwbWljLWJhdHQiOwotCXBiaS0+YmF0dC50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQlwYmktPmJhdHQucHJvcGVydGllcyA9IHBtaWNfYmF0dGVyeV9wcm9wczsKLQlwYmktPmJhdHQubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHBtaWNfYmF0dGVyeV9wcm9wcyk7Ci0JcGJpLT5iYXR0LmdldF9wcm9wZXJ0eSA9IHBtaWNfYmF0dGVyeV9nZXRfcHJvcGVydHk7Ci0JcmV0dmFsID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRldiwgJnBiaS0+YmF0dCk7Ci0JaWYgKHJldHZhbCkgeworCXBiaS0+YmF0dCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkZXYsICZwbWljX3VzYl9kZXNjLCAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihwYmktPmJhdHQpKSB7CiAJCWRldl9lcnIoZGV2LAogCQkJIiVzKCk6IGZhaWxlZCB0byByZWdpc3RlciBwbWljIGJhdHRlcnkgZGV2aWNlIHdpdGggcG93ZXIgc3VwcGx5IHN1YnN5c3RlbVxuIiwKIAkJCQlfX2Z1bmNfXyk7CisJCXJldHZhbCA9IFBUUl9FUlIocGJpLT5iYXR0KTsKIAkJZ290byBwb3dlcl9yZWdfZmFpbGVkOwogCX0KIApAQCAtNzA3LDE2ICs3MjIsMTIgQEAKIAlxdWV1ZV9kZWxheWVkX3dvcmsocGJpLT5tb25pdG9yX3dxdWV1ZSwgJnBiaS0+bW9uaXRvcl9iYXR0ZXJ5LCBIWiAqIDEpOwogCiAJLyogcmVnaXN0ZXIgcG1pYy11c2Igd2l0aCBwb3dlciBzdXBwbHkgc3Vic3lzdGVtICovCi0JcGJpLT51c2IubmFtZSA9ICJwbWljLXVzYiI7Ci0JcGJpLT51c2IudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQjsKLQlwYmktPnVzYi5wcm9wZXJ0aWVzID0gcG1pY191c2JfcHJvcHM7Ci0JcGJpLT51c2IubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHBtaWNfdXNiX3Byb3BzKTsKLQlwYmktPnVzYi5nZXRfcHJvcGVydHkgPSBwbWljX3VzYl9nZXRfcHJvcGVydHk7Ci0JcmV0dmFsID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRldiwgJnBiaS0+dXNiKTsKLQlpZiAocmV0dmFsKSB7CisJcGJpLT51c2IgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGV2LCAmcG1pY19iYXR0X2Rlc2MsICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKHBiaS0+dXNiKSkgewogCQlkZXZfZXJyKGRldiwKIAkJCSIlcygpOiBmYWlsZWQgdG8gcmVnaXN0ZXIgcG1pYyB1c2IgZGV2aWNlIHdpdGggcG93ZXIgc3VwcGx5IHN1YnN5c3RlbVxuIiwKIAkJCQlfX2Z1bmNfXyk7CisJCXJldHZhbCA9IFBUUl9FUlIocGJpLT51c2IpOwogCQlnb3RvIHBvd2VyX3JlZ19mYWlsZWRfMTsKIAl9CiAKQEAgLTcyOCw3ICs3MzksNyBAQAogCXJldHVybiByZXR2YWw7CiAKIHBvd2VyX3JlZ19mYWlsZWRfMToKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmcGJpLT5iYXR0KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihwYmktPmJhdHQpOwogcG93ZXJfcmVnX2ZhaWxlZDoKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnBiaS0+bW9uaXRvcl9iYXR0ZXJ5KTsKIHJlcXVlc3RpcnFfZmFpbGVkOgpAQCAtNzYyLDggKzc3Myw4IEBACiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwYmktPm1vbml0b3JfYmF0dGVyeSk7CiAJZGVzdHJveV93b3JrcXVldWUocGJpLT5tb25pdG9yX3dxdWV1ZSk7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmcGJpLT51c2IpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZwYmktPmJhdHQpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBiaS0+dXNiKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihwYmktPmJhdHQpOwogCiAJY2FuY2VsX3dvcmtfc3luYygmcGJpLT5oYW5kbGVyKTsKIAlrZnJlZShwYmkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9pcGFxX21pY3JvX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvaXBhcV9taWNyb19iYXR0ZXJ5LmMKaW5kZXggOWQ2OTQ2MC4uZjAzMDE0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9pcGFxX21pY3JvX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL2lwYXFfbWljcm9fYmF0dGVyeS5jCkBAIC05Myw3ICs5Myw3IEBACiAKIHN0YXRpYyBpbnQgZ2V0X2NhcGFjaXR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKmIpCiB7Ci0Jc3RydWN0IG1pY3JvX2JhdHRlcnkgKm1iID0gZGV2X2dldF9kcnZkYXRhKGItPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgbWljcm9fYmF0dGVyeSAqbWIgPSBkZXZfZ2V0X2RydmRhdGEoYi0+ZGV2LnBhcmVudCk7CiAKIAlzd2l0Y2ggKG1iLT5mbGFnICYgMHgwNykgewogCWNhc2UgTUlDUk9fQkFUVF9TVEFUVVNfSElHSDoKQEAgLTExMyw3ICsxMTMsNyBAQAogCiBzdGF0aWMgaW50IGdldF9zdGF0dXMoc3RydWN0IHBvd2VyX3N1cHBseSAqYikKIHsKLQlzdHJ1Y3QgbWljcm9fYmF0dGVyeSAqbWIgPSBkZXZfZ2V0X2RydmRhdGEoYi0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCBtaWNyb19iYXR0ZXJ5ICptYiA9IGRldl9nZXRfZHJ2ZGF0YShiLT5kZXYucGFyZW50KTsKIAogCWlmIChtYi0+ZmxhZyA9PSBNSUNST19CQVRUX1NUQVRVU19VTktOT1dOKQogCQlyZXR1cm4gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOwpAQCAtMTMyLDcgKzEzMiw3IEBACiAJCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgbWljcm9fYmF0dGVyeSAqbWIgPSBkZXZfZ2V0X2RydmRhdGEoYi0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCBtaWNyb19iYXR0ZXJ5ICptYiA9IGRldl9nZXRfZHJ2ZGF0YShiLT5kZXYucGFyZW50KTsKIAogCXN3aXRjaCAocHNwKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URUNITk9MT0dZOgpAQCAtMTgwLDcgKzE4MCw3IEBACiAJCQkJIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQkgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgbWljcm9fYmF0dGVyeSAqbWIgPSBkZXZfZ2V0X2RydmRhdGEoYi0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCBtaWNyb19iYXR0ZXJ5ICptYiA9IGRldl9nZXRfZHJ2ZGF0YShiLT5kZXYucGFyZW50KTsKIAogCXN3aXRjaCAocHNwKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CkBAIC0yMDIsNyArMjAyLDcgQEAKIAlQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5IG1pY3JvX2JhdHRfcG93ZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIG1pY3JvX2JhdHRfcG93ZXJfZGVzYyA9IHsKIAkubmFtZQkJCT0gIm1haW4tYmF0dGVyeSIsCiAJLnR5cGUJCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCiAJLnByb3BlcnRpZXMJCT0gbWljcm9fYmF0dF9wb3dlcl9wcm9wcywKQEAgLTIxNSw3ICsyMTUsNyBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5IG1pY3JvX2FjX3Bvd2VyID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBtaWNyb19hY19wb3dlcl9kZXNjID0gewogCS5uYW1lCQkJPSAiYWMiLAogCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUywKIAkucHJvcGVydGllcwkJPSBtaWNyb19hY19wb3dlcl9wcm9wcywKQEAgLTIyMyw5ICsyMjMsMTIgQEAKIAkuZ2V0X3Byb3BlcnR5CQk9IG1pY3JvX2FjX2dldF9wcm9wZXJ0eSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5ICptaWNyb19iYXR0X3Bvd2VyLCAqbWljcm9fYWNfcG93ZXI7CisKIHN0YXRpYyBpbnQgbWljcm9fYmF0dF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBtaWNyb19iYXR0ZXJ5ICptYjsKKwlpbnQgcmV0OwogCiAJbWIgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptYiksIEdGUF9LRVJORUwpOwogCWlmICghbWIpCkBAIC0yMzMsMTQgKzIzNiwzNiBAQAogCiAJbWItPm1pY3JvID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCW1iLT53cSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJpcGFxLWJhdHRlcnktd3EiKTsKKwlpZiAoIW1iLT53cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlJTklUX0RFTEFZRURfV09SSygmbWItPnVwZGF0ZSwgbWljcm9fYmF0dGVyeV93b3JrKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtYik7CiAJcXVldWVfZGVsYXllZF93b3JrKG1iLT53cSwgJm1iLT51cGRhdGUsIDEpOwotCXBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmbWljcm9fYmF0dF9wb3dlcik7Ci0JcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZtaWNyb19hY19wb3dlcik7CisKKwltaWNyb19iYXR0X3Bvd2VyID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCQkgJm1pY3JvX2JhdHRfcG93ZXJfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUihtaWNyb19iYXR0X3Bvd2VyKSkgeworCQlyZXQgPSBQVFJfRVJSKG1pY3JvX2JhdHRfcG93ZXIpOworCQlnb3RvIGJhdHRfZXJyOworCX0KKworCW1pY3JvX2FjX3Bvd2VyID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCSAgICAgICAmbWljcm9fYWNfcG93ZXJfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUihtaWNyb19hY19wb3dlcikpIHsKKwkJcmV0ID0gUFRSX0VSUihtaWNyb19hY19wb3dlcik7CisJCWdvdG8gYWNfZXJyOworCX0KIAogCWRldl9pbmZvKCZwZGV2LT5kZXYsICJpUEFRIG1pY3JvIGJhdHRlcnkgZHJpdmVyXG4iKTsKIAlyZXR1cm4gMDsKKworYWNfZXJyOgorCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKG1pY3JvX2FjX3Bvd2VyKTsKK2JhdHRfZXJyOgorCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbWItPnVwZGF0ZSk7CisJZGVzdHJveV93b3JrcXVldWUobWItPndxKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG1pY3JvX2JhdHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC0yNDgsOSArMjczLDEwIEBACiB7CiAJc3RydWN0IG1pY3JvX2JhdHRlcnkgKm1iID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmbWljcm9fYWNfcG93ZXIpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZtaWNyb19iYXR0X3Bvd2VyKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihtaWNyb19hY19wb3dlcik7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIobWljcm9fYmF0dF9wb3dlcik7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZtYi0+dXBkYXRlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShtYi0+d3EpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2lzcDE3MDRfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9pc3AxNzA0X2NoYXJnZXIuYwppbmRleCAwYjRjZjlkLi5mMmE3ZDk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2lzcDE3MDRfY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvaXNwMTcwNF9jaGFyZ2VyLmMKQEAgLTU3LDExICs1NywxMiBAQAogfTsKIAogc3RydWN0IGlzcDE3MDRfY2hhcmdlciB7Ci0Jc3RydWN0IGRldmljZQkJKmRldjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5CXBzeTsKLQlzdHJ1Y3QgdXNiX3BoeQkJKnBoeTsKLQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJbmI7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CisJc3RydWN0IGRldmljZQkJCSpkZXY7CisJc3RydWN0IHBvd2VyX3N1cHBseQkJKnBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MJcHN5X2Rlc2M7CisJc3RydWN0IHVzYl9waHkJCQkqcGh5OworCXN0cnVjdCBub3RpZmllcl9ibG9jawkJbmI7CisJc3RydWN0IHdvcmtfc3RydWN0CQl3b3JrOwogCiAJLyogcHJvcGVydGllcyAqLwogCWNoYXIJCQltb2RlbFs4XTsKQEAgLTI1OSwxMCArMjYwLDEwIEBACiAKIAkJCS8qIGRldGVjdCB3YWxsIGNoYXJnZXIgKi8KIAkJCWlmIChpc3AxNzA0X2NoYXJnZXJfZGV0ZWN0X2RjcChpc3ApKSB7Ci0JCQkJaXNwLT5wc3kudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9EQ1A7CisJCQkJaXNwLT5wc3lfZGVzYy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCX0RDUDsKIAkJCQlpc3AtPmN1cnJlbnRfbWF4ID0gMTgwMDsKIAkJCX0gZWxzZSB7Ci0JCQkJaXNwLT5wc3kudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQjsKKwkJCQlpc3AtPnBzeV9kZXNjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CiAJCQkJaXNwLT5jdXJyZW50X21heCA9IDUwMDsKIAkJCX0KIApAQCAtMjcxLDcgKzI3Miw3IEBACiAJCQkJdXNiX2dhZGdldF9jb25uZWN0KGlzcC0+cGh5LT5vdGctPmdhZGdldCk7CiAJCX0KIAotCQlpZiAoaXNwLT5wc3kudHlwZSAhPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0JfRENQKSB7CisJCWlmIChpc3AtPnBzeV9kZXNjLnR5cGUgIT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCX0RDUCkgewogCQkJLyoKIAkJCSAqIE9ubHkgNTAwbUEgaGVyZSBvciBoaWdoIHNwZWVkIGNoaXJwCiAJCQkgKiBoYW5kc2hha2luZyBtYXkgYnJlYWsKQEAgLTI4MCwxNCArMjgxLDE0IEBACiAJCQkJaXNwLT5jdXJyZW50X21heCA9IDUwMDsKIAogCQkJaWYgKGlzcC0+Y3VycmVudF9tYXggPiAxMDApCi0JCQkJaXNwLT5wc3kudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQl9DRFA7CisJCQkJaXNwLT5wc3lfZGVzYy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCX0NEUDsKIAkJfQogCQlicmVhazsKIAljYXNlIFVTQl9FVkVOVF9OT05FOgogCQlpc3AtPm9ubGluZSA9IGZhbHNlOwogCQlpc3AtPnByZXNlbnQgPSAwOwogCQlpc3AtPmN1cnJlbnRfbWF4ID0gMDsKLQkJaXNwLT5wc3kudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQjsKKwkJaXNwLT5wc3lfZGVzYy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOwogCiAJCS8qCiAJCSAqIERpc2FibGUgZGF0YSBwdWxsdXBzLiBXZSBuZWVkIHRvIHByZXZlbnQgdGhlIGNvbnRyb2xsZXIgZnJvbQpAQCAtMzA2LDcgKzMwNyw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZpc3AtPnBzeSk7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQoaXNwLT5wc3kpOwogb3V0OgogCW11dGV4X3VubG9jaygmbG9jayk7CiB9CkBAIC0zMjYsOCArMzI3LDcgQEAKIAkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgaXNwMTcwNF9jaGFyZ2VyICppc3AgPQotCQljb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgaXNwMTcwNF9jaGFyZ2VyLCBwc3kpOworCXN0cnVjdCBpc3AxNzA0X2NoYXJnZXIgKmlzcCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CkBAIC00MDMsNiArNDAzLDcgQEAKIHsKIAlzdHJ1Y3QgaXNwMTcwNF9jaGFyZ2VyCSppc3A7CiAJaW50CQkJcmV0ID0gLUVOT0RFVjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAKIAlzdHJ1Y3QgaXNwMTcwNF9jaGFyZ2VyX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CkBAIC00NTQsMTUgKzQ1NSwxOSBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIGZhaWwxOwogCi0JaXNwLT5wc3kubmFtZQkJPSAiaXNwMTcwNCI7Ci0JaXNwLT5wc3kudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7Ci0JaXNwLT5wc3kucHJvcGVydGllcwk9IHBvd2VyX3Byb3BzOwotCWlzcC0+cHN5Lm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShwb3dlcl9wcm9wcyk7Ci0JaXNwLT5wc3kuZ2V0X3Byb3BlcnR5CT0gaXNwMTcwNF9jaGFyZ2VyX2dldF9wcm9wZXJ0eTsKKwlpc3AtPnBzeV9kZXNjLm5hbWUJCT0gImlzcDE3MDQiOworCWlzcC0+cHN5X2Rlc2MudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CisJaXNwLT5wc3lfZGVzYy5wcm9wZXJ0aWVzCT0gcG93ZXJfcHJvcHM7CisJaXNwLT5wc3lfZGVzYy5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUocG93ZXJfcHJvcHMpOworCWlzcC0+cHN5X2Rlc2MuZ2V0X3Byb3BlcnR5CT0gaXNwMTcwNF9jaGFyZ2VyX2dldF9wcm9wZXJ0eTsKIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3Rlcihpc3AtPmRldiwgJmlzcC0+cHN5KTsKLQlpZiAocmV0KQorCXBzeV9jZmcuZHJ2X2RhdGEJCT0gaXNwOworCisJaXNwLT5wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoaXNwLT5kZXYsICZpc3AtPnBzeV9kZXNjLCAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihpc3AtPnBzeSkpIHsKKwkJcmV0ID0gUFRSX0VSUihpc3AtPnBzeSk7CiAJCWdvdG8gZmFpbDE7CisJfQogCiAJLyoKIAkgKiBSRVZJU0lUOiB1c2luZyB3b3JrIGluIG9yZGVyIHRvIGFsbG93IHRoZSB1c2Igbm90aWZpY2F0aW9ucyB0byBiZQpAQCAtNDk4LDcgKzUwMyw3IEBACiAKIAlyZXR1cm4gMDsKIGZhaWwyOgotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZpc3AtPnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoaXNwLT5wc3kpOwogZmFpbDE6CiAJaXNwMTcwNF9jaGFyZ2VyX3NldF9wb3dlcihpc3AsIDApOwogZmFpbDA6CkBAIC01MTIsNyArNTE3LDcgQEAKIAlzdHJ1Y3QgaXNwMTcwNF9jaGFyZ2VyICppc3AgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCXVzYl91bnJlZ2lzdGVyX25vdGlmaWVyKGlzcC0+cGh5LCAmaXNwLT5uYik7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmlzcC0+cHN5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcihpc3AtPnBzeSk7CiAJaXNwMTcwNF9jaGFyZ2VyX3NldF9wb3dlcihpc3AsIDApOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2p6NDc0MC1iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL2p6NDc0MC1iYXR0ZXJ5LmMKaW5kZXggOWNkMzkxZC4uYWJkZmMyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9qejQ3NDAtYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvano0NzQwLWJhdHRlcnkuYwpAQCAtNDYsNyArNDYsOCBAQAogCiAJc3RydWN0IGNvbXBsZXRpb24gcmVhZF9jb21wbGV0aW9uOwogCi0Jc3RydWN0IHBvd2VyX3N1cHBseSBiYXR0ZXJ5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGJhdHRlcnlfZGVzYzsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7CiAKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKQEAgLTU0LDcgKzU1LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QganpfYmF0dGVyeSAqcHN5X3RvX2p6X2JhdHRlcnkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQogewotCXJldHVybiBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QganpfYmF0dGVyeSwgYmF0dGVyeSk7CisJcmV0dXJuIHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QganpfYmF0dGVyeV9pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZpZCkKQEAgLTIxMyw3ICsyMTQsNyBAQAogCX0KIAogCWlmIChoYXNfY2hhbmdlZCkKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmp6X2JhdHRlcnktPmJhdHRlcnkpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChqel9iYXR0ZXJ5LT5iYXR0ZXJ5KTsKIH0KIAogc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IGp6X2JhdHRlcnlfcHJvcGVydGllc1tdID0gewpAQCAtMjQyLDggKzI0Myw5IEBACiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGp6X2JhdHRlcnlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKIAlzdHJ1Y3QganpfYmF0dGVyeSAqanpfYmF0dGVyeTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0ZXJ5OworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqYmF0dGVyeV9kZXNjOwogCXN0cnVjdCByZXNvdXJjZSAqbWVtOwogCiAJaWYgKCFwZGF0YSkgewpAQCAtMjcxLDE0ICsyNzMsMTcgQEAKIAlpZiAoSVNfRVJSKGp6X2JhdHRlcnktPmJhc2UpKQogCQlyZXR1cm4gUFRSX0VSUihqel9iYXR0ZXJ5LT5iYXNlKTsKIAotCWJhdHRlcnkgPSAmanpfYmF0dGVyeS0+YmF0dGVyeTsKLQliYXR0ZXJ5LT5uYW1lID0gcGRhdGEtPmluZm8ubmFtZTsKLQliYXR0ZXJ5LT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQliYXR0ZXJ5LT5wcm9wZXJ0aWVzCT0ganpfYmF0dGVyeV9wcm9wZXJ0aWVzOwotCWJhdHRlcnktPm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShqel9iYXR0ZXJ5X3Byb3BlcnRpZXMpOwotCWJhdHRlcnktPmdldF9wcm9wZXJ0eSA9IGp6X2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwotCWJhdHRlcnktPmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSBqel9iYXR0ZXJ5X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQ7Ci0JYmF0dGVyeS0+dXNlX2Zvcl9hcG0gPSAxOworCWJhdHRlcnlfZGVzYyA9ICZqel9iYXR0ZXJ5LT5iYXR0ZXJ5X2Rlc2M7CisJYmF0dGVyeV9kZXNjLT5uYW1lID0gcGRhdGEtPmluZm8ubmFtZTsKKwliYXR0ZXJ5X2Rlc2MtPnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCWJhdHRlcnlfZGVzYy0+cHJvcGVydGllcwk9IGp6X2JhdHRlcnlfcHJvcGVydGllczsKKwliYXR0ZXJ5X2Rlc2MtPm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShqel9iYXR0ZXJ5X3Byb3BlcnRpZXMpOworCWJhdHRlcnlfZGVzYy0+Z2V0X3Byb3BlcnR5CT0ganpfYmF0dGVyeV9nZXRfcHJvcGVydHk7CisJYmF0dGVyeV9kZXNjLT5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0KKwkJCQkJanpfYmF0dGVyeV9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkOworCWJhdHRlcnlfZGVzYy0+dXNlX2Zvcl9hcG0JPSAxOworCisJcHN5X2NmZy5kcnZfZGF0YSA9IGp6X2JhdHRlcnk7CiAKIAlqel9iYXR0ZXJ5LT5wZGF0YSA9IHBkYXRhOwogCWp6X2JhdHRlcnktPnBkZXYgPSBwZGV2OwpAQCAtMzMwLDkgKzMzNSwxMSBAQAogCWVsc2UKIAkJano0NzQwX2FkY19zZXRfY29uZmlnKHBkZXYtPmRldi5wYXJlbnQsIEpaX0FEQ19DT05GSUdfQkFUX01CLCAwKTsKIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmanpfYmF0dGVyeS0+YmF0dGVyeSk7Ci0JaWYgKHJldCkgeworCWp6X2JhdHRlcnktPmJhdHRlcnkgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgYmF0dGVyeV9kZXNjLAorCQkJCQkJCSZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGp6X2JhdHRlcnktPmJhdHRlcnkpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgInBvd2VyIHN1cHBseSBiYXR0ZXJ5IHJlZ2lzdGVyIGZhaWxlZC5cbiIpOworCQlyZXQgPSBQVFJfRVJSKGp6X2JhdHRlcnktPmJhdHRlcnkpOwogCQlnb3RvIGVycl9mcmVlX2NoYXJnZV9pcnE7CiAJfQogCkBAIC0zNjQsNyArMzcxLDcgQEAKIAkJZ3Bpb19mcmVlKGp6X2JhdHRlcnktPnBkYXRhLT5ncGlvX2NoYXJnZSk7CiAJfQogCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmp6X2JhdHRlcnktPmJhdHRlcnkpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGp6X2JhdHRlcnktPmJhdHRlcnkpOwogCiAJZnJlZV9pcnEoanpfYmF0dGVyeS0+aXJxLCBqel9iYXR0ZXJ5KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9scDg3MjdfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9scDg3MjdfY2hhcmdlci5jCmluZGV4IDMyZGU2MzYuLjdlNzQxZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvbHA4NzI3X2NoYXJnZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL2xwODcyN19jaGFyZ2VyLmMKQEAgLTgwLDkgKzgwLDkgQEAKIH07CiAKIHN0cnVjdCBscDg3MjdfcHN5IHsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGFjOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgdXNiOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0dDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICphYzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICp1c2I7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dDsKIH07CiAKIHN0cnVjdCBscDg3MjdfY2hnIHsKQEAgLTI0Miw5ICsyNDIsOSBAQAogCWxwODcyN19pZF9kZXRlY3Rpb24ocGNoZywgaWRubywgdmJ1cyk7CiAJbHA4NzI3X2VuYWJsZV9jaGdkZXQocGNoZyk7CiAKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcGNoZy0+cHN5LT5hYyk7Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJnBjaGctPnBzeS0+dXNiKTsKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcGNoZy0+cHN5LT5iYXR0KTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChwY2hnLT5wc3ktPmFjKTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChwY2hnLT5wc3ktPnVzYik7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQocGNoZy0+cHN5LT5iYXR0KTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IGxwODcyN19pc3JfZnVuYyhpbnQgaXJxLCB2b2lkICpwdHIpCkBAIC0zMTEsMTIgKzMxMSwxMiBAQAogCQkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IGxwODcyN19jaGcgKnBjaGcgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYtPnBhcmVudCk7CisJc3RydWN0IGxwODcyN19jaGcgKnBjaGcgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYucGFyZW50KTsKIAogCWlmIChwc3AgIT0gUE9XRVJfU1VQUExZX1BST1BfT05MSU5FKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXZhbC0+aW50dmFsID0gbHA4NzI3X2lzX2NoYXJnZXJfYXR0YWNoZWQocHN5LT5uYW1lLCBwY2hnLT5kZXZpZCk7CisJdmFsLT5pbnR2YWwgPSBscDg3MjdfaXNfY2hhcmdlcl9hdHRhY2hlZChwc3ktPmRlc2MtPm5hbWUsIHBjaGctPmRldmlkKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzM3LDE0ICszMzcsMTQgQEAKIAkJCQkgICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJCSAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBscDg3MjdfY2hnICpwY2hnID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCBscDg3MjdfY2hnICpwY2hnID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IGxwODcyN19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBjaGctPnBkYXRhOwogCWVudW0gbHA4NzI3X2RpZV90ZW1wIHRlbXA7CiAJdTggcmVhZDsKIAogCXN3aXRjaCAocHNwKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6Ci0JCWlmICghbHA4NzI3X2lzX2NoYXJnZXJfYXR0YWNoZWQocHN5LT5uYW1lLCBwY2hnLT5kZXZpZCkpIHsKKwkJaWYgKCFscDg3MjdfaXNfY2hhcmdlcl9hdHRhY2hlZChwc3ktPmRlc2MtPm5hbWUsIHBjaGctPmRldmlkKSkgewogCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTQwMCwxMyArNDAwLDEzIEBACiAKIHN0YXRpYyB2b2lkIGxwODcyN19jaGFyZ2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQogewotCXN0cnVjdCBscDg3MjdfY2hnICpwY2hnID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCBscDg3MjdfY2hnICpwY2hnID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LnBhcmVudCk7CiAJdTggZW9jX2xldmVsOwogCXU4IGljaGc7CiAJdTggdmFsOwogCiAJLyogc2tpcCBpZiBubyBjaGFyZ2VyIGV4aXN0cyAqLwotCWlmICghbHA4NzI3X2lzX2NoYXJnZXJfYXR0YWNoZWQocHN5LT5uYW1lLCBwY2hnLT5kZXZpZCkpCisJaWYgKCFscDg3MjdfaXNfY2hhcmdlcl9hdHRhY2hlZChwc3ktPmRlc2MtPm5hbWUsIHBjaGctPmRldmlkKSkKIAkJcmV0dXJuOwogCiAJLyogdXBkYXRlIGNoYXJnaW5nIHBhcmFtZXRlcnMgKi8KQEAgLTQxOCw4ICs0MTgsMzQgQEAKIAl9CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbHA4NzI3X2FjX2Rlc2MgPSB7CisJLm5hbWUJCQk9ICJhYyIsCisJLnR5cGUJCQk9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TLAorCS5wcm9wZXJ0aWVzCQk9IGxwODcyN19jaGFyZ2VyX3Byb3AsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUobHA4NzI3X2NoYXJnZXJfcHJvcCksCisJLmdldF9wcm9wZXJ0eQkJPSBscDg3MjdfY2hhcmdlcl9nZXRfcHJvcGVydHksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGxwODcyN191c2JfZGVzYyA9IHsKKwkubmFtZQkJCT0gInVzYiIsCisJLnR5cGUJCQk9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQiwKKwkucHJvcGVydGllcwkJPSBscDg3MjdfY2hhcmdlcl9wcm9wLAorCS5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKGxwODcyN19jaGFyZ2VyX3Byb3ApLAorCS5nZXRfcHJvcGVydHkJCT0gbHA4NzI3X2NoYXJnZXJfZ2V0X3Byb3BlcnR5LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBscDg3MjdfYmF0dF9kZXNjID0geworCS5uYW1lCQkJPSAibWFpbl9iYXR0IiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwkJPSBscDg3MjdfYmF0dGVyeV9wcm9wLAorCS5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKGxwODcyN19iYXR0ZXJ5X3Byb3ApLAorCS5nZXRfcHJvcGVydHkJCT0gbHA4NzI3X2JhdHRlcnlfZ2V0X3Byb3BlcnR5LAorCS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkCT0gbHA4NzI3X2NoYXJnZXJfY2hhbmdlZCwKK307CisKIHN0YXRpYyBpbnQgbHA4NzI3X3JlZ2lzdGVyX3BzeShzdHJ1Y3QgbHA4NzI3X2NoZyAqcGNoZykKIHsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307IC8qIE9ubHkgZm9yIGFjIGFuZCB1c2IgKi8KIAlzdHJ1Y3QgbHA4NzI3X3BzeSAqcHN5OwogCiAJcHN5ID0gZGV2bV9remFsbG9jKHBjaGctPmRldiwgc2l6ZW9mKCpwc3kpLCBHRlBfS0VSTkVMKTsKQEAgLTQyOCw0NCArNDU0LDI4IEBACiAKIAlwY2hnLT5wc3kgPSBwc3k7CiAKLQlwc3ktPmFjLm5hbWUgPSAiYWMiOwotCXBzeS0+YWMudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOwotCXBzeS0+YWMucHJvcGVydGllcyA9IGxwODcyN19jaGFyZ2VyX3Byb3A7Ci0JcHN5LT5hYy5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUobHA4NzI3X2NoYXJnZXJfcHJvcCk7Ci0JcHN5LT5hYy5nZXRfcHJvcGVydHkgPSBscDg3MjdfY2hhcmdlcl9nZXRfcHJvcGVydHk7Ci0JcHN5LT5hYy5zdXBwbGllZF90byA9IGJhdHRlcnlfc3VwcGxpZWRfdG87Ci0JcHN5LT5hYy5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKGJhdHRlcnlfc3VwcGxpZWRfdG8pOworCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBiYXR0ZXJ5X3N1cHBsaWVkX3RvOworCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShiYXR0ZXJ5X3N1cHBsaWVkX3RvKTsKIAotCWlmIChwb3dlcl9zdXBwbHlfcmVnaXN0ZXIocGNoZy0+ZGV2LCAmcHN5LT5hYykpCisJcHN5LT5hYyA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihwY2hnLT5kZXYsICZscDg3MjdfYWNfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIocHN5LT5hYykpCiAJCWdvdG8gZXJyX3BzeV9hYzsKIAotCXBzeS0+dXNiLm5hbWUgPSAidXNiIjsKLQlwc3ktPnVzYi50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOwotCXBzeS0+dXNiLnByb3BlcnRpZXMgPSBscDg3MjdfY2hhcmdlcl9wcm9wOwotCXBzeS0+dXNiLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShscDg3MjdfY2hhcmdlcl9wcm9wKTsKLQlwc3ktPnVzYi5nZXRfcHJvcGVydHkgPSBscDg3MjdfY2hhcmdlcl9nZXRfcHJvcGVydHk7Ci0JcHN5LT51c2Iuc3VwcGxpZWRfdG8gPSBiYXR0ZXJ5X3N1cHBsaWVkX3RvOwotCXBzeS0+dXNiLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJWkUoYmF0dGVyeV9zdXBwbGllZF90byk7Ci0KLQlpZiAocG93ZXJfc3VwcGx5X3JlZ2lzdGVyKHBjaGctPmRldiwgJnBzeS0+dXNiKSkKKwlwc3ktPnVzYiA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihwY2hnLT5kZXYsICZscDg3MjdfdXNiX2Rlc2MsCisJCQkJCSAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihwc3ktPnVzYikpCiAJCWdvdG8gZXJyX3BzeV91c2I7CiAKLQlwc3ktPmJhdHQubmFtZSA9ICJtYWluX2JhdHQiOwotCXBzeS0+YmF0dC50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQlwc3ktPmJhdHQucHJvcGVydGllcyA9IGxwODcyN19iYXR0ZXJ5X3Byb3A7Ci0JcHN5LT5iYXR0Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShscDg3MjdfYmF0dGVyeV9wcm9wKTsKLQlwc3ktPmJhdHQuZ2V0X3Byb3BlcnR5ID0gbHA4NzI3X2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwotCXBzeS0+YmF0dC5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gbHA4NzI3X2NoYXJnZXJfY2hhbmdlZDsKLQotCWlmIChwb3dlcl9zdXBwbHlfcmVnaXN0ZXIocGNoZy0+ZGV2LCAmcHN5LT5iYXR0KSkKKwlwc3ktPmJhdHQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIocGNoZy0+ZGV2LCAmbHA4NzI3X2JhdHRfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUihwc3ktPmJhdHQpKQogCQlnb3RvIGVycl9wc3lfYmF0dDsKIAogCXJldHVybiAwOwogCiBlcnJfcHN5X2JhdHQ6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnBzeS0+dXNiKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcihwc3ktPnVzYik7CiBlcnJfcHN5X3VzYjoKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmcHN5LT5hYyk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocHN5LT5hYyk7CiBlcnJfcHN5X2FjOgogCXJldHVybiAtRVBFUk07CiB9CkBAIC00NzcsOSArNDg3LDkgQEAKIAlpZiAoIXBzeSkKIAkJcmV0dXJuOwogCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnBzeS0+YWMpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZwc3ktPnVzYik7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnBzeS0+YmF0dCk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocHN5LT5hYyk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocHN5LT51c2IpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBzeS0+YmF0dCk7CiB9CiAKICNpZmRlZiBDT05GSUdfT0YKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbHA4Nzg4LWNoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvbHA4Nzg4LWNoYXJnZXIuYwppbmRleCAyMWZjMjMzLi5mNWE0OGZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2xwODc4OC1jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9scDg3ODgtY2hhcmdlci5jCkBAIC0xMDUsOCArMTA1LDggQEAKICAqLwogc3RydWN0IGxwODc4OF9jaGFyZ2VyIHsKIAlzdHJ1Y3QgbHA4Nzg4ICpscDsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGNoYXJnZXI7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSBiYXR0ZXJ5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmNoYXJnZXI7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2hhcmdlcl93b3JrOwogCXN0cnVjdCBpaW9fY2hhbm5lbCAqY2hhbltMUDg3ODhfTlVNX0NIR19BRENdOwogCXN0cnVjdCBscDg3ODhfY2hnX2lycSBpcnFzW0xQODc4OF9NQVhfQ0hHX0lSUVNdOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgbHA4Nzg4X2NoYXJnZXIgKnBjaGcgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYtPnBhcmVudCk7CisJc3RydWN0IGxwODc4OF9jaGFyZ2VyICpwY2hnID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LnBhcmVudCk7CiAJdTggcmVhZDsKIAogCXN3aXRjaCAocHNwKSB7CkBAIC0zMzcsNyArMzM3LDcgQEAKIAkJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBscDg3ODhfY2hhcmdlciAqcGNoZyA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgbHA4Nzg4X2NoYXJnZXIgKnBjaGcgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYucGFyZW50KTsKIAogCXN3aXRjaCAocHNwKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CkBAIC0zOTcsMzYgKzM5Nyw1MCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGxwODc4OF9wc3lfY2hhcmdlcl9kZXNjID0geworCS5uYW1lCQk9IExQODc4OF9DSEFSR0VSX05BTUUsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCisJLnByb3BlcnRpZXMJPSBscDg3ODhfY2hhcmdlcl9wcm9wLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUobHA4Nzg4X2NoYXJnZXJfcHJvcCksCisJLmdldF9wcm9wZXJ0eQk9IGxwODc4OF9jaGFyZ2VyX2dldF9wcm9wZXJ0eSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbHA4Nzg4X3BzeV9iYXR0ZXJ5X2Rlc2MgPSB7CisJLm5hbWUJCT0gTFA4Nzg4X0JBVFRFUllfTkFNRSwKKwkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5wcm9wZXJ0aWVzCT0gbHA4Nzg4X2JhdHRlcnlfcHJvcCwKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKGxwODc4OF9iYXR0ZXJ5X3Byb3ApLAorCS5nZXRfcHJvcGVydHkJPSBscDg3ODhfYmF0dGVyeV9nZXRfcHJvcGVydHksCit9OworCiBzdGF0aWMgaW50IGxwODc4OF9wc3lfcmVnaXN0ZXIoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJCQlzdHJ1Y3QgbHA4Nzg4X2NoYXJnZXIgKnBjaGcpCiB7Ci0JcGNoZy0+Y2hhcmdlci5uYW1lID0gTFA4Nzg4X0NIQVJHRVJfTkFNRTsKLQlwY2hnLT5jaGFyZ2VyLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKLQlwY2hnLT5jaGFyZ2VyLnByb3BlcnRpZXMgPSBscDg3ODhfY2hhcmdlcl9wcm9wOwotCXBjaGctPmNoYXJnZXIubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKGxwODc4OF9jaGFyZ2VyX3Byb3ApOwotCXBjaGctPmNoYXJnZXIuZ2V0X3Byb3BlcnR5ID0gbHA4Nzg4X2NoYXJnZXJfZ2V0X3Byb3BlcnR5OwotCXBjaGctPmNoYXJnZXIuc3VwcGxpZWRfdG8gPSBiYXR0ZXJ5X3N1cHBsaWVkX3RvOwotCXBjaGctPmNoYXJnZXIubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShiYXR0ZXJ5X3N1cHBsaWVkX3RvKTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBjaGFyZ2VyX2NmZyA9IHt9OwogCi0JaWYgKHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmcGNoZy0+Y2hhcmdlcikpCisJY2hhcmdlcl9jZmcuc3VwcGxpZWRfdG8gPSBiYXR0ZXJ5X3N1cHBsaWVkX3RvOworCWNoYXJnZXJfY2ZnLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJWkUoYmF0dGVyeV9zdXBwbGllZF90byk7CisKKwlwY2hnLT5jaGFyZ2VyID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCSAgICAgICZscDg3ODhfcHN5X2NoYXJnZXJfZGVzYywKKwkJCQkJICAgICAgJmNoYXJnZXJfY2ZnKTsKKwlpZiAoSVNfRVJSKHBjaGctPmNoYXJnZXIpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JcGNoZy0+YmF0dGVyeS5uYW1lID0gTFA4Nzg4X0JBVFRFUllfTkFNRTsKLQlwY2hnLT5iYXR0ZXJ5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCXBjaGctPmJhdHRlcnkucHJvcGVydGllcyA9IGxwODc4OF9iYXR0ZXJ5X3Byb3A7Ci0JcGNoZy0+YmF0dGVyeS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUobHA4Nzg4X2JhdHRlcnlfcHJvcCk7Ci0JcGNoZy0+YmF0dGVyeS5nZXRfcHJvcGVydHkgPSBscDg3ODhfYmF0dGVyeV9nZXRfcHJvcGVydHk7Ci0KLQlpZiAocG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZwY2hnLT5iYXR0ZXJ5KSkKKwlwY2hnLT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCSAgICAgICZscDg3ODhfcHN5X2JhdHRlcnlfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUihwY2hnLT5iYXR0ZXJ5KSkgeworCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihwY2hnLT5jaGFyZ2VyKTsKIAkJcmV0dXJuIC1FUEVSTTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgbHA4Nzg4X3BzeV91bnJlZ2lzdGVyKHN0cnVjdCBscDg3ODhfY2hhcmdlciAqcGNoZykKIHsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmcGNoZy0+YmF0dGVyeSk7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnBjaGctPmNoYXJnZXIpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBjaGctPmJhdHRlcnkpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBjaGctPmNoYXJnZXIpOwogfQogCiBzdGF0aWMgdm9pZCBscDg3ODhfY2hhcmdlcl9ldmVudChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC00NzAsOCArNDg0LDggQEAKIAljYXNlIExQODc4OF9JTlRfRU9DOgogCWNhc2UgTFA4Nzg4X0lOVF9CQVRUX0xPVzoKIAljYXNlIExQODc4OF9JTlRfTk9fQkFUVDoKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJnBjaGctPmNoYXJnZXIpOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcGNoZy0+YmF0dGVyeSk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBjaGctPmNoYXJnZXIpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwY2hnLT5iYXR0ZXJ5KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2x0YzI5NDEtYmF0dGVyeS1nYXVnZS5jIGIvZHJpdmVycy9wb3dlci9sdGMyOTQxLWJhdHRlcnktZ2F1Z2UuYwppbmRleCBlMzFjOTI3Li5kYWViMDg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2x0YzI5NDEtYmF0dGVyeS1nYXVnZS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvbHRjMjk0MS1iYXR0ZXJ5LWdhdWdlLmMKQEAgLTU5LDcgKzU5LDggQEAKIAogc3RydWN0IGx0YzI5NHhfaW5mbyB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsJLyogSTJDIENsaWVudCBwb2ludGVyICovCi0Jc3RydWN0IHBvd2VyX3N1cHBseSBzdXBwbHk7CS8qIFN1cHBseSBwb2ludGVyICovCisJc3RydWN0IHBvd2VyX3N1cHBseSAqc3VwcGx5OwkvKiBTdXBwbHkgcG9pbnRlciAqLworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBzdXBwbHlfZGVzYzsJLyogU3VwcGx5IGRlc2NyaXB0aW9uICovCiAJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOwkvKiBXb3JrIHNjaGVkdWxlciAqLwogCWludCBudW1fcmVnczsJLyogTnVtYmVyIG9mIHJlZ2lzdGVycyAoY2hpcCB0eXBlKSAqLwogCWludCBpZDsJCS8qIElkZW50aWZpZXIgb2YgbHRjMjk0eCBjaGlwICovCkBAIC0yOTQsOCArMjk1LDcgQEAKIAkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wLAogCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IGx0YzI5NHhfaW5mbyAqaW5mbyA9Ci0JCWNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBsdGMyOTR4X2luZm8sIHN1cHBseSk7CisJc3RydWN0IGx0YzI5NHhfaW5mbyAqaW5mbyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJc3dpdGNoIChwcm9wKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfTk9XOgpAQCAtMzE3LDggKzMxNyw3IEBACiAJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCWNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IGx0YzI5NHhfaW5mbyAqaW5mbyA9Ci0JCWNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBsdGMyOTR4X2luZm8sIHN1cHBseSk7CisJc3RydWN0IGx0YzI5NHhfaW5mbyAqaW5mbyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9OT1c6CkBAIC0zNDUsNyArMzQ0LDcgQEAKIAogCWlmIChjaGFyZ2UgIT0gaW5mby0+Y2hhcmdlKSB7CiAJCWluZm8tPmNoYXJnZSA9IGNoYXJnZTsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmluZm8tPnN1cHBseSk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGluZm8tPnN1cHBseSk7CiAJfQogfQogCkBAIC0zNzEsOCArMzcwLDggQEAKIAlzdHJ1Y3QgbHRjMjk0eF9pbmZvICppbmZvID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKIAljYW5jZWxfZGVsYXllZF93b3JrKCZpbmZvLT53b3JrKTsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmaW5mby0+c3VwcGx5KTsKLQlrZnJlZShpbmZvLT5zdXBwbHkubmFtZSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoaW5mby0+c3VwcGx5KTsKKwlrZnJlZShpbmZvLT5zdXBwbHlfZGVzYy5uYW1lKTsKIAltdXRleF9sb2NrKCZsdGMyOTR4X2xvY2spOwogCWlkcl9yZW1vdmUoJmx0YzI5NHhfaWQsIGluZm8tPmlkKTsKIAltdXRleF91bmxvY2soJmx0YzI5NHhfbG9jayk7CkBAIC0zODIsNiArMzgxLDcgQEAKIHN0YXRpYyBpbnQgbHRjMjk0eF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCXN0cnVjdCBsdGMyOTR4X2luZm8gKmluZm87CiAJaW50IHJldDsKIAlpbnQgbnVtOwpAQCAtNDA2LDggKzQwNiw5IEBACiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgaW5mbyk7CiAKIAlpbmZvLT5udW1fcmVncyA9IGlkLT5kcml2ZXJfZGF0YTsKLQlpbmZvLT5zdXBwbHkubmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMtJWQiLCBjbGllbnQtPm5hbWUsIG51bSk7Ci0JaWYgKCFpbmZvLT5zdXBwbHkubmFtZSkgeworCWluZm8tPnN1cHBseV9kZXNjLm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzLSVkIiwgY2xpZW50LT5uYW1lLAorCQkJCQkgICBudW0pOworCWlmICghaW5mby0+c3VwcGx5X2Rlc2MubmFtZSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxfbmFtZTsKIAl9CkBAIC00NDAsMzAgKzQ0MSwzMiBAQAogCX0gZWxzZSB7CiAJCWlmIChwcmVzY2FsZXJfZXhwID4gTFRDMjk0MV9NQVhfUFJFU0NBTEVSX0VYUCkKIAkJCXByZXNjYWxlcl9leHAgPSBMVEMyOTQxX01BWF9QUkVTQ0FMRVJfRVhQOwotCQlpbmZvLT5RbHNiID0gKCg1OCAqIDUwMDAwKSAvIHJfc2Vuc2UpIC8KKwkJaW5mby0+UWxzYiA9ICgoODUgKiA1MDAwMCkgLyByX3NlbnNlKSAvCiAJCQkJKDEyOCAvICgxIDw8IHByZXNjYWxlcl9leHApKTsKIAl9CiAKIAlpbmZvLT5jbGllbnQgPSBjbGllbnQ7CiAJaW5mby0+aWQgPSBudW07Ci0JaW5mby0+c3VwcGx5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCWluZm8tPnN1cHBseS5wcm9wZXJ0aWVzID0gbHRjMjk0eF9wcm9wZXJ0aWVzOworCWluZm8tPnN1cHBseV9kZXNjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCWluZm8tPnN1cHBseV9kZXNjLnByb3BlcnRpZXMgPSBsdGMyOTR4X3Byb3BlcnRpZXM7CiAJaWYgKGluZm8tPm51bV9yZWdzID49IExUQzI5NFhfUkVHX1RFTVBFUkFUVVJFX0xTQikKLQkJaW5mby0+c3VwcGx5Lm51bV9wcm9wZXJ0aWVzID0KKwkJaW5mby0+c3VwcGx5X2Rlc2MubnVtX3Byb3BlcnRpZXMgPQogCQkJQVJSQVlfU0laRShsdGMyOTR4X3Byb3BlcnRpZXMpOwogCWVsc2UgaWYgKGluZm8tPm51bV9yZWdzID49IExUQzI5NFhfUkVHX0NVUlJFTlRfTFNCKQotCQlpbmZvLT5zdXBwbHkubnVtX3Byb3BlcnRpZXMgPQorCQlpbmZvLT5zdXBwbHlfZGVzYy5udW1fcHJvcGVydGllcyA9CiAJCQlBUlJBWV9TSVpFKGx0YzI5NHhfcHJvcGVydGllcykgLSAxOwogCWVsc2UgaWYgKGluZm8tPm51bV9yZWdzID49IExUQzI5NFhfUkVHX1ZPTFRBR0VfTFNCKQotCQlpbmZvLT5zdXBwbHkubnVtX3Byb3BlcnRpZXMgPQorCQlpbmZvLT5zdXBwbHlfZGVzYy5udW1fcHJvcGVydGllcyA9CiAJCQlBUlJBWV9TSVpFKGx0YzI5NHhfcHJvcGVydGllcykgLSAyOwogCWVsc2UKLQkJaW5mby0+c3VwcGx5Lm51bV9wcm9wZXJ0aWVzID0KKwkJaW5mby0+c3VwcGx5X2Rlc2MubnVtX3Byb3BlcnRpZXMgPQogCQkJQVJSQVlfU0laRShsdGMyOTR4X3Byb3BlcnRpZXMpIC0gMzsKLQlpbmZvLT5zdXBwbHkuZ2V0X3Byb3BlcnR5ID0gbHRjMjk0eF9nZXRfcHJvcGVydHk7Ci0JaW5mby0+c3VwcGx5LnNldF9wcm9wZXJ0eSA9IGx0YzI5NHhfc2V0X3Byb3BlcnR5OwotCWluZm8tPnN1cHBseS5wcm9wZXJ0eV9pc193cml0ZWFibGUgPSBsdGMyOTR4X3Byb3BlcnR5X2lzX3dyaXRlYWJsZTsKLQlpbmZvLT5zdXBwbHkuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZAk9IE5VTEw7CisJaW5mby0+c3VwcGx5X2Rlc2MuZ2V0X3Byb3BlcnR5ID0gbHRjMjk0eF9nZXRfcHJvcGVydHk7CisJaW5mby0+c3VwcGx5X2Rlc2Muc2V0X3Byb3BlcnR5ID0gbHRjMjk0eF9zZXRfcHJvcGVydHk7CisJaW5mby0+c3VwcGx5X2Rlc2MucHJvcGVydHlfaXNfd3JpdGVhYmxlID0gbHRjMjk0eF9wcm9wZXJ0eV9pc193cml0ZWFibGU7CisJaW5mby0+c3VwcGx5X2Rlc2MuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZAk9IE5VTEw7CisKKwlwc3lfY2ZnLmRydl9kYXRhID0gaW5mbzsKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZpbmZvLT53b3JrLCBsdGMyOTR4X3dvcmspOwogCkBAIC00NzMsOSArNDc2LDExIEBACiAJCWdvdG8gZmFpbF9jb21tOwogCX0KIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmY2xpZW50LT5kZXYsICZpbmZvLT5zdXBwbHkpOwotCWlmIChyZXQpIHsKKwlpbmZvLT5zdXBwbHkgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmaW5mby0+c3VwcGx5X2Rlc2MsCisJCQkJCSAgICAgJnBzeV9jZmcpOworCWlmIChJU19FUlIoaW5mby0+c3VwcGx5KSkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBsdGMyOTQxXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihpbmZvLT5zdXBwbHkpOwogCQlnb3RvIGZhaWxfcmVnaXN0ZXI7CiAJfSBlbHNlIHsKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZpbmZvLT53b3JrLCBMVEMyOTRYX1dPUktfREVMQVkgKiBIWik7CkBAIC00ODQsNyArNDg5LDcgQEAKIAlyZXR1cm4gMDsKIAogZmFpbF9yZWdpc3RlcjoKLQlrZnJlZShpbmZvLT5zdXBwbHkubmFtZSk7CisJa2ZyZWUoaW5mby0+c3VwcGx5X2Rlc2MubmFtZSk7CiBmYWlsX2NvbW06CiBmYWlsX25hbWU6CiBmYWlsX2luZm86CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDE0NTc3X2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvbWF4MTQ1NzdfY2hhcmdlci5jCmluZGV4IGVmNDEwM2UuLmEzNmJjYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvbWF4MTQ1NzdfY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvbWF4MTQ1NzdfY2hhcmdlci5jCkBAIC0yMiwxMiArMjIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21mZC9tYXgxNDU3Ny5oPgogCiBzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciB7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBtYXgxNDU3NwkqbWF4MTQ1Nzc7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseQljaGFyZ2VyOwotCi0JdW5zaWduZWQgaW50CQljaGFyZ2luZ19zdGF0ZTsKLQl1bnNpZ25lZCBpbnQJCWJhdHRlcnlfc3RhdGU7CisJc3RydWN0IGRldmljZQkJKmRldjsKKwlzdHJ1Y3QgbWF4MTQ1NzcJCSptYXgxNDU3NzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CSpjaGFyZ2VyOwogCiAJc3RydWN0IG1heDE0NTc3X2NoYXJnZXJfcGxhdGZvcm1fZGF0YQkqcGRhdGE7CiB9OwpAQCAtNTcsMTAgKzU0LDEwIEBACiAJfQogfQogCi1zdGF0aWMgaW50IG1heDE0NTc3X2dldF9jaGFyZ2VyX3N0YXRlKHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcpCitzdGF0aWMgaW50IG1heDE0NTc3X2dldF9jaGFyZ2VyX3N0YXRlKHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcsIGludCAqdmFsKQogewogCXN0cnVjdCByZWdtYXAgKnJtYXAgPSBjaGctPm1heDE0NTc3LT5yZWdtYXA7Ci0JaW50IHN0YXRlID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwlpbnQgcmV0OwogCXU4IHJlZ19kYXRhOwogCiAJLyoKQEAgLTc0LDIzICs3MSwzMiBAQAogCSAqICAtIGhhbmRsZSBwcm9wZXJseSBkZWFkLWJhdHRlcnkgY2hhcmdpbmcgKHJlc3BlY3QgdGltZXIpCiAJICogIC0gaGFuZGxlIHRpbWVycyAoZmFzdC1jaGFyZ2UgYW5kIHByZXF1YWwpIC9NQkNDSEdFUlIvCiAJICovCi0JbWF4MTQ1NzdfcmVhZF9yZWcocm1hcCwgTUFYMTQ1NzdfQ0hHX1JFR19DSEdfQ1RSTDIsICZyZWdfZGF0YSk7Ci0JaWYgKChyZWdfZGF0YSAmIENIR0NUUkwyX01CQ0hPU1RFTl9NQVNLKSA9PSAwKQotCQlnb3RvIHN0YXRlX3NldDsKKwlyZXQgPSBtYXgxNDU3N19yZWFkX3JlZyhybWFwLCBNQVgxNDU3N19DSEdfUkVHX0NIR19DVFJMMiwgJnJlZ19kYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CiAKLQltYXgxNDU3N19yZWFkX3JlZyhybWFwLCBNQVgxNDU3N19DSEdfUkVHX1NUQVRVUzMsICZyZWdfZGF0YSk7CisJaWYgKChyZWdfZGF0YSAmIENIR0NUUkwyX01CQ0hPU1RFTl9NQVNLKSA9PSAwKSB7CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBtYXgxNDU3N19yZWFkX3JlZyhybWFwLCBNQVgxNDU3N19DSEdfUkVHX1NUQVRVUzMsICZyZWdfZGF0YSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCiAJaWYgKHJlZ19kYXRhICYgU1RBVFVTM19DR01CQ19NQVNLKSB7CiAJCS8qIENoYXJnZXIgb3IgVVNCLWNhYmxlIGlzIGNvbm5lY3RlZCAqLwogCQlpZiAocmVnX2RhdGEgJiBTVEFUVVMzX0VPQ19NQVNLKQotCQkJc3RhdGUgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisJCQkqdmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOwogCQllbHNlCi0JCQlzdGF0ZSA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7Ci0JCWdvdG8gc3RhdGVfc2V0OworCQkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CisJCWdvdG8gb3V0OwogCX0KIAotc3RhdGVfc2V0OgotCWNoZy0+Y2hhcmdpbmdfc3RhdGUgPSBzdGF0ZTsKLQlyZXR1cm4gc3RhdGU7CisJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisKK291dDoKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtOTgsOCArMTA0LDEwIEBACiAgKiAgLSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfTk9ORQogICogIC0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX0ZBU1QKICAqLwotc3RhdGljIGludCBtYXgxNDU3N19nZXRfY2hhcmdlX3R5cGUoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZykKK3N0YXRpYyBpbnQgbWF4MTQ1NzdfZ2V0X2NoYXJnZV90eXBlKHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcsIGludCAqdmFsKQogeworCWludCByZXQsIGNoYXJnaW5nOworCiAJLyoKIAkgKiBUT0RPOiBDSEFSR0VfVFlQRV9UUklDS0xFIChWQ0hHUl9SQyBvciBFT0MpPwogCSAqIEFzIHNwZWMgc2F5czoKQEAgLTEwOCwxOCArMTE2LDI5IEBACiAJICogIHRvcC1vZmYgdGltZXIgc3RhcnRzLiBUaGUgZGV2aWNlIGNvbnRpbnVlcyB0byB0cmlja2xlCiAJICogIGNoYXJnZSB0aGUgYmF0dGVyeSB1bnRpbCB0aGUgdG9wLW9mZiB0aW1lciBydW5zIG91dC4iCiAJICovCi0JaWYgKG1heDE0NTc3X2dldF9jaGFyZ2VyX3N0YXRlKGNoZykgPT0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORykKLQkJcmV0dXJuIFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9GQVNUOwotCXJldHVybiBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfTk9ORTsKKwlyZXQgPSBtYXgxNDU3N19nZXRfY2hhcmdlcl9zdGF0ZShjaGcsICZjaGFyZ2luZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoY2hhcmdpbmcgPT0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORykKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9GQVNUOworCWVsc2UKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9OT05FOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWF4MTQ1NzdfZ2V0X29ubGluZShzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciAqY2hnKQorc3RhdGljIGludCBtYXgxNDU3N19nZXRfb25saW5lKHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcsIGludCAqdmFsKQogewogCXN0cnVjdCByZWdtYXAgKnJtYXAgPSBjaGctPm1heDE0NTc3LT5yZWdtYXA7CiAJdTggcmVnX2RhdGE7CisJaW50IHJldDsKIAllbnVtIG1heDE0NTc3X211aWNfY2hhcmdlcl90eXBlIGNoZ190eXBlOwogCi0JbWF4MTQ1NzdfcmVhZF9yZWcocm1hcCwgTUFYMTQ1NzdfTVVJQ19SRUdfU1RBVFVTMiwgJnJlZ19kYXRhKTsKKwlyZXQgPSBtYXgxNDU3N19yZWFkX3JlZyhybWFwLCBNQVgxNDU3N19NVUlDX1JFR19TVEFUVVMyLCAmcmVnX2RhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJcmVnX2RhdGEgPSAoKHJlZ19kYXRhICYgU1RBVFVTMl9DSEdUWVBfTUFTSykgPj4gU1RBVFVTMl9DSEdUWVBfU0hJRlQpOwogCWNoZ190eXBlID0gbWF4aW1fZ2V0X2NoYXJnZXJfdHlwZShjaGctPm1heDE0NTc3LT5kZXZfdHlwZSwgcmVnX2RhdGEpOwogCXN3aXRjaCAoY2hnX3R5cGUpIHsKQEAgLTEyOSwxNCArMTQ4LDE3IEBACiAJY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfU1BFQ0lBTF8xQToKIAljYXNlIE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9ERUFEX0JBVFRFUlk6CiAJY2FzZSBNQVg3NzgzNl9DSEFSR0VSX1RZUEVfU1BFQ0lBTF9CSUFTOgotCQlyZXR1cm4gMTsKKwkJKnZhbCA9IDE7CisJCWJyZWFrOwogCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX05PTkU6CiAJY2FzZSBNQVgxNDU3N19DSEFSR0VSX1RZUEVfRE9XTlNUUkVBTV9QT1JUOgogCWNhc2UgTUFYMTQ1NzdfQ0hBUkdFUl9UWVBFX1JFU0VSVkVEOgogCWNhc2UgTUFYNzc4MzZfQ0hBUkdFUl9UWVBFX1JFU0VSVkVEOgogCWRlZmF1bHQ6Ci0JCXJldHVybiAwOworCQkqdmFsID0gMDsKIAl9CisKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTE0NSwzMCArMTY3LDM4IEBACiAgKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFCiAgKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX0dPT0QKICAqLwotc3RhdGljIGludCBtYXgxNDU3N19nZXRfYmF0dGVyeV9oZWFsdGgoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZykKK3N0YXRpYyBpbnQgbWF4MTQ1NzdfZ2V0X2JhdHRlcnlfaGVhbHRoKHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGcsIGludCAqdmFsKQogewogCXN0cnVjdCByZWdtYXAgKnJtYXAgPSBjaGctPm1heDE0NTc3LT5yZWdtYXA7Ci0JaW50IHN0YXRlID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworCWludCByZXQ7CiAJdTggcmVnX2RhdGE7CiAJZW51bSBtYXgxNDU3N19tdWljX2NoYXJnZXJfdHlwZSBjaGdfdHlwZTsKIAotCW1heDE0NTc3X3JlYWRfcmVnKHJtYXAsIE1BWDE0NTc3X01VSUNfUkVHX1NUQVRVUzIsICZyZWdfZGF0YSk7CisJcmV0ID0gbWF4MTQ1NzdfcmVhZF9yZWcocm1hcCwgTUFYMTQ1NzdfTVVJQ19SRUdfU1RBVFVTMiwgJnJlZ19kYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKIAlyZWdfZGF0YSA9ICgocmVnX2RhdGEgJiBTVEFUVVMyX0NIR1RZUF9NQVNLKSA+PiBTVEFUVVMyX0NIR1RZUF9TSElGVCk7CiAJY2hnX3R5cGUgPSBtYXhpbV9nZXRfY2hhcmdlcl90eXBlKGNoZy0+bWF4MTQ1NzctPmRldl90eXBlLCByZWdfZGF0YSk7CiAJaWYgKGNoZ190eXBlID09IE1BWDE0NTc3X0NIQVJHRVJfVFlQRV9ERUFEX0JBVFRFUlkpIHsKLQkJc3RhdGUgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7Ci0JCWdvdG8gc3RhdGVfc2V0OworCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9ERUFEOworCQlnb3RvIG91dDsKIAl9CiAKLQltYXgxNDU3N19yZWFkX3JlZyhybWFwLCBNQVgxNDU3N19DSEdfUkVHX1NUQVRVUzMsICZyZWdfZGF0YSk7CisJcmV0ID0gbWF4MTQ1NzdfcmVhZF9yZWcocm1hcCwgTUFYMTQ1NzdfQ0hHX1JFR19TVEFUVVMzLCAmcmVnX2RhdGEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKwogCWlmIChyZWdfZGF0YSAmIFNUQVRVUzNfT1ZQX01BU0spIHsKLQkJc3RhdGUgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOwotCQlnb3RvIHN0YXRlX3NldDsKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7CisJCWdvdG8gb3V0OwogCX0KIAotc3RhdGVfc2V0OgotCWNoZy0+YmF0dGVyeV9zdGF0ZSA9IHN0YXRlOwotCXJldHVybiBzdGF0ZTsKKwkvKiBOb3QgZGVhZCwgbm90IG92ZXJ2b2x0YWdlICovCisJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKKworb3V0OgorCXJldHVybiByZXQ7CiB9CiAKIC8qCkBAIC0xNzYsOSArMjA2LDExIEBACiAgKiBUaGUgbWF4MTQ1NzcgY2hpcCBkb2Vzbid0IHJlcG9ydCBhbnkgc3RhdHVzIG9mIGJhdHRlcnkgcHJlc2VuY2UuCiAgKiBMZXRzIGFzc3VtZSB0aGF0IGl0IHdpbGwgYWx3YXlzIGJlIHVzZWQgd2l0aCBzb21lIGJhdHRlcnkuCiAgKi8KLXN0YXRpYyBpbnQgbWF4MTQ1NzdfZ2V0X3ByZXNlbnQoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZykKK3N0YXRpYyBpbnQgbWF4MTQ1NzdfZ2V0X3ByZXNlbnQoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZywgaW50ICp2YWwpCiB7Ci0JcmV0dXJuIDE7CisJKnZhbCA9IDE7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBtYXgxNDU3N19zZXRfZmFzdF9jaGFyZ2VfdGltZXIoc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZywKQEAgLTM4OSwyNiArNDIxLDI0IEBACiAJCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZyA9IGNvbnRhaW5lcl9vZihwc3ksCi0JCQkJCQkgIHN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyLAotCQkJCQkJICBjaGFyZ2VyKTsKKwlzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlciAqY2hnID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKHBzcCkgewogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgotCQl2YWwtPmludHZhbCA9IG1heDE0NTc3X2dldF9jaGFyZ2VyX3N0YXRlKGNoZyk7CisJCXJldCA9IG1heDE0NTc3X2dldF9jaGFyZ2VyX3N0YXRlKGNoZywgJnZhbC0+aW50dmFsKTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRToKLQkJdmFsLT5pbnR2YWwgPSBtYXgxNDU3N19nZXRfY2hhcmdlX3R5cGUoY2hnKTsKKwkJcmV0ID0gbWF4MTQ1NzdfZ2V0X2NoYXJnZV90eXBlKGNoZywgJnZhbC0+aW50dmFsKTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9IRUFMVEg6Ci0JCXZhbC0+aW50dmFsID0gbWF4MTQ1NzdfZ2V0X2JhdHRlcnlfaGVhbHRoKGNoZyk7CisJCXJldCA9IG1heDE0NTc3X2dldF9iYXR0ZXJ5X2hlYWx0aChjaGcsICZ2YWwtPmludHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKLQkJdmFsLT5pbnR2YWwgPSBtYXgxNDU3N19nZXRfcHJlc2VudChjaGcpOworCQlyZXQgPSBtYXgxNDU3N19nZXRfcHJlc2VudChjaGcsICZ2YWwtPmludHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgotCQl2YWwtPmludHZhbCA9IG1heDE0NTc3X2dldF9vbmxpbmUoY2hnKTsKKwkJcmV0ID0gbWF4MTQ1NzdfZ2V0X29ubGluZShjaGcsICZ2YWwtPmludHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfTU9ERUxfTkFNRToKIAkJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUobW9kZWxfbmFtZXMpICE9IE1BWElNX0RFVklDRV9UWVBFX05VTSk7CkBAIC00MjQsNiArNDU0LDE0IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBtYXgxNDU3N19jaGFyZ2VyX2Rlc2MgPSB7CisJLm5hbWUgPSAibWF4MTQ1NzctY2hhcmdlciIsCisJLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5wcm9wZXJ0aWVzID0gbWF4MTQ1NzdfY2hhcmdlcl9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKG1heDE0NTc3X2NoYXJnZXJfcHJvcHMpLAorCS5nZXRfcHJvcGVydHkgPSBtYXgxNDU3N19jaGFyZ2VyX2dldF9wcm9wZXJ0eSwKK307CisKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBzdHJ1Y3QgbWF4MTQ1NzdfY2hhcmdlcl9wbGF0Zm9ybV9kYXRhICptYXgxNDU3N19jaGFyZ2VyX2R0X2luaXQoCiAJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCkBAIC01MzEsNiArNTY5LDcgQEAKIHN0YXRpYyBpbnQgbWF4MTQ1NzdfY2hhcmdlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBtYXgxNDU3N19jaGFyZ2VyICpjaGc7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCXN0cnVjdCBtYXgxNDU3NyAqbWF4MTQ1NzcgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJaW50IHJldDsKIApAQCAtNTUwLDIxICs1ODksMTggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JY2hnLT5jaGFyZ2VyLm5hbWUgPSAibWF4MTQ1NzctY2hhcmdlciIsCi0JY2hnLT5jaGFyZ2VyLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAotCWNoZy0+Y2hhcmdlci5wcm9wZXJ0aWVzID0gbWF4MTQ1NzdfY2hhcmdlcl9wcm9wcywKLQljaGctPmNoYXJnZXIubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKG1heDE0NTc3X2NoYXJnZXJfcHJvcHMpLAotCWNoZy0+Y2hhcmdlci5nZXRfcHJvcGVydHkgPSBtYXgxNDU3N19jaGFyZ2VyX2dldF9wcm9wZXJ0eSwKLQogCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZmFzdF9jaGFyZ2VfdGltZXIpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBjcmVhdGUgc3lzZnMgZW50cnlcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2hnLT5jaGFyZ2VyKTsKLQlpZiAocmV0KSB7CisJcHN5X2NmZy5kcnZfZGF0YSA9IGNoZzsKKwljaGctPmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJm1heDE0NTc3X2NoYXJnZXJfZGVzYywKKwkJCQkJCSZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGNoZy0+Y2hhcmdlcikpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXJcbiIpOworCQlyZXQgPSBQVFJfRVJSKGNoZy0+Y2hhcmdlcik7CiAJCWdvdG8gZXJyOwogCX0KIApAQCAtNTg1LDcgKzYyMSw3IEBACiAJc3RydWN0IG1heDE0NTc3X2NoYXJnZXIgKmNoZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9mYXN0X2NoYXJnZV90aW1lcik7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmNoZy0+Y2hhcmdlcik7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoY2hnLT5jaGFyZ2VyKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXgxNzA0MF9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL21heDE3MDQwX2JhdHRlcnkuYwppbmRleCAxNGQ0NDcwLi44Njg5YzgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL21heDE3MDQwX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL21heDE3MDQwX2JhdHRlcnkuYwpAQCAtNDAsNyArNDAsNyBAQAogc3RydWN0IG1heDE3MDQwX2NoaXAgewogCXN0cnVjdCBpMmNfY2xpZW50CQkqY2xpZW50OwogCXN0cnVjdCBkZWxheWVkX3dvcmsJCXdvcms7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseQkJYmF0dGVyeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CQkqYmF0dGVyeTsKIAlzdHJ1Y3QgbWF4MTcwNDBfcGxhdGZvcm1fZGF0YQkqcGRhdGE7CiAKIAkvKiBTdGF0ZSBPZiBDb25uZWN0ICovCkBAIC01Nyw4ICs1Nyw3IEBACiAJCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IG1heDE3MDQwX2NoaXAgKmNoaXAgPSBjb250YWluZXJfb2YocHN5LAotCQkJCXN0cnVjdCBtYXgxNzA0MF9jaGlwLCBiYXR0ZXJ5KTsKKwlzdHJ1Y3QgbWF4MTcwNDBfY2hpcCAqY2hpcCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKQEAgLTE4OCw3ICsxODcsOCBAQAogCW1heDE3MDQwX2dldF9vbmxpbmUoY2hpcC0+Y2xpZW50KTsKIAltYXgxNzA0MF9nZXRfc3RhdHVzKGNoaXAtPmNsaWVudCk7CiAKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNoaXAtPndvcmssIE1BWDE3MDQwX0RFTEFZKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwgJmNoaXAtPndvcmssCisJCQkgICBNQVgxNzA0MF9ERUxBWSk7CiB9CiAKIHN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBtYXgxNzA0MF9iYXR0ZXJ5X3Byb3BzW10gPSB7CkBAIC0xOTgsMTIgKzE5OCwyMCBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBtYXgxNzA0MF9iYXR0ZXJ5X2Rlc2MgPSB7CisJLm5hbWUJCT0gImJhdHRlcnkiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCisJLmdldF9wcm9wZXJ0eQk9IG1heDE3MDQwX2dldF9wcm9wZXJ0eSwKKwkucHJvcGVydGllcwk9IG1heDE3MDQwX2JhdHRlcnlfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShtYXgxNzA0MF9iYXR0ZXJ5X3Byb3BzKSwKK307CisKIHN0YXRpYyBpbnQgbWF4MTcwNDBfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKIAlzdHJ1Y3QgbWF4MTcwNDBfY2hpcCAqY2hpcDsKLQlpbnQgcmV0OwogCiAJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFKSkKIAkJcmV0dXJuIC1FSU87CkBAIC0yMTYsMjQgKzIyNCwyMSBAQAogCWNoaXAtPnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoaXApOworCXBzeV9jZmcuZHJ2X2RhdGEgPSBjaGlwOwogCi0JY2hpcC0+YmF0dGVyeS5uYW1lCQk9ICJiYXR0ZXJ5IjsKLQljaGlwLT5iYXR0ZXJ5LnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQljaGlwLT5iYXR0ZXJ5LmdldF9wcm9wZXJ0eQk9IG1heDE3MDQwX2dldF9wcm9wZXJ0eTsKLQljaGlwLT5iYXR0ZXJ5LnByb3BlcnRpZXMJPSBtYXgxNzA0MF9iYXR0ZXJ5X3Byb3BzOwotCWNoaXAtPmJhdHRlcnkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDE3MDQwX2JhdHRlcnlfcHJvcHMpOwotCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmNoaXAtPmJhdHRlcnkpOwotCWlmIChyZXQpIHsKKwljaGlwLT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKKwkJCQkmbWF4MTcwNDBfYmF0dGVyeV9kZXNjLCAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihjaGlwLT5iYXR0ZXJ5KSkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIFBUUl9FUlIoY2hpcC0+YmF0dGVyeSk7CiAJfQogCiAJbWF4MTcwNDBfcmVzZXQoY2xpZW50KTsKIAltYXgxNzA0MF9nZXRfdmVyc2lvbihjbGllbnQpOwogCiAJSU5JVF9ERUZFUlJBQkxFX1dPUksoJmNoaXAtPndvcmssIG1heDE3MDQwX3dvcmspOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+d29yaywgTUFYMTcwNDBfREVMQVkpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmY2hpcC0+d29yaywKKwkJCSAgIE1BWDE3MDQwX0RFTEFZKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQyLDcgKzI0Nyw3IEBACiB7CiAJc3RydWN0IG1heDE3MDQwX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZjaGlwLT5iYXR0ZXJ5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihjaGlwLT5iYXR0ZXJ5KTsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZjaGlwLT53b3JrKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI2Myw3ICsyNjgsOCBAQAogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CiAJc3RydWN0IG1heDE3MDQwX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY2hpcC0+d29yaywgTUFYMTcwNDBfREVMQVkpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLCAmY2hpcC0+d29yaywKKwkJCSAgIE1BWDE3MDQwX0RFTEFZKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuYwppbmRleCAxZGE2YzVmLi42Y2M1ZTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuYwpAQCAtNjMsMTMgKzYzLDEwIEBACiAjZGVmaW5lIGRQX0FDQ18xMDAJMHgxOTAwCiAjZGVmaW5lIGRQX0FDQ18yMDAJMHgzMjAwCiAKLSNkZWZpbmUgTUFYMTcwNDJfSUNfVkVSU0lPTgkweDAwOTIKLSNkZWZpbmUgTUFYMTcwNDdfSUNfVkVSU0lPTgkweDAwQUMJLyogc2FtZSBmb3IgbWF4MTcwNTAgKi8KLQogc3RydWN0IG1heDE3MDQyX2NoaXAgewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0dGVyeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0ZXJ5OwogCWVudW0gbWF4MTcweHhfY2hpcF90eXBlIGNoaXBfdHlwZTsKIAlzdHJ1Y3QgbWF4MTcwNDJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CkBAIC05Niw4ICs5Myw3IEBACiAJCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXAgPSBjb250YWluZXJfb2YocHN5LAotCQkJCXN0cnVjdCBtYXgxNzA0Ml9jaGlwLCBiYXR0ZXJ5KTsKKwlzdHJ1Y3QgbWF4MTcwNDJfY2hpcCAqY2hpcCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKIAlpbnQgcmV0OwogCXUzMiBkYXRhOwpAQCAtMTMyLDcgKzEyOCw3IEBACiAJCXZhbC0+aW50dmFsICo9IDIwMDAwOyAvKiBVbml0cyBvZiBMU0IgPSAyMG1WICovCiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOOgotCQlpZiAoY2hpcC0+Y2hpcF90eXBlID09IE1BWDE3MDQyKQorCQlpZiAoY2hpcC0+Y2hpcF90eXBlID09IE1BWElNX0RFVklDRV9UWVBFX01BWDE3MDQyKQogCQkJcmV0ID0gcmVnbWFwX3JlYWQobWFwLCBNQVgxNzA0Ml9WX2VtcHR5LCAmZGF0YSk7CiAJCWVsc2UKIAkJCXJldCA9IHJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDdfVl9lbXB0eSwgJmRhdGEpOwpAQCAtMjcyLDYgKzI2OCw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbWF4MTA3NDJfdW5sb2NrX21vZGVsKHN0cnVjdCBtYXgxNzA0Ml9jaGlwICpjaGlwKQogewogCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKKwogCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX01MT0NLUmVnMSwgTU9ERUxfVU5MT0NLMSk7CiAJcmVnbWFwX3dyaXRlKG1hcCwgTUFYMTcwNDJfTUxPQ0tSZWcyLCBNT0RFTF9VTkxPQ0syKTsKIH0KQEAgLTI4OSw2ICsyODYsNyBAQAogewogCXN0cnVjdCByZWdtYXAgKm1hcCA9IGNoaXAtPnJlZ21hcDsKIAlpbnQgaTsKKwogCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCiAJCXJlZ21hcF93cml0ZShtYXAsIGFkZHIgKyBpLAogCQkJY2hpcC0+cGRhdGEtPmNvbmZpZ19kYXRhLT5jZWxsX2NoYXJfdGJsW2ldKTsKQEAgLTM3OSw3ICszNzcsOCBAQAogCXJlZ21hcF93cml0ZShtYXAsIE1BWDE3MDQyX0ZpbHRlckNGRywKIAkJCWNvbmZpZy0+ZmlsdGVyX2NmZyk7CiAJcmVnbWFwX3dyaXRlKG1hcCwgTUFYMTcwNDJfUmVsYXhDRkcsIGNvbmZpZy0+cmVsYXhfY2ZnKTsKLQlpZiAoY2hpcC0+Y2hpcF90eXBlID09IE1BWDE3MDQ3KQorCWlmIChjaGlwLT5jaGlwX3R5cGUgPT0gTUFYSU1fREVWSUNFX1RZUEVfTUFYMTcwNDcgfHwKKwkJCWNoaXAtPmNoaXBfdHlwZSA9PSBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA1MCkKIAkJcmVnbWFwX3dyaXRlKG1hcCwgTUFYMTcwNDdfRnVsbFNPQ1RociwKIAkJCQkJCWNvbmZpZy0+ZnVsbF9zb2NfdGhyZXNoKTsKIH0KQEAgLTM5Miw3ICszOTEsNyBAQAogCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0Ml9SQ09NUDAsIGNvbmZpZy0+cmNvbXAwKTsKIAltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfVGVtcENvLAljb25maWctPnRjb21wYzApOwogCW1heDE3MDQyX3dyaXRlX3ZlcmlmeV9yZWcobWFwLCBNQVgxNzA0Ml9JQ0hHVGVybSwgY29uZmlnLT5pY2hndF90ZXJtKTsKLQlpZiAoY2hpcC0+Y2hpcF90eXBlID09IE1BWDE3MDQyKSB7CisJaWYgKGNoaXAtPmNoaXBfdHlwZSA9PSBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA0MikgewogCQlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9FbXB0eVRlbXBDbywJY29uZmlnLT5lbXB0eV90ZW1wY28pOwogCQltYXgxNzA0Ml93cml0ZV92ZXJpZnlfcmVnKG1hcCwgTUFYMTcwNDJfS19lbXB0eTAsCiAJCQkJCWNvbmZpZy0+a2VtcHR5MCk7CkBAIC01MDEsMTQgKzUwMCwxNCBAQAogCiAJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfRnVsbENBUCwgY29uZmlnLT5mdWxsY2FwKTsKIAltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9GdWxsQ0FQTm9tLCBjb25maWctPmZ1bGxjYXBub20pOwotCWlmIChjaGlwLT5jaGlwX3R5cGUgPT0gTUFYMTcwNDIpCisJaWYgKGNoaXAtPmNoaXBfdHlwZSA9PSBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA0MikKIAkJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfU09DX2VtcHR5LAogCQkJCQkJY29uZmlnLT5zb2NlbXB0eSk7CiAJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfTEF2Z19lbXB0eSwgY29uZmlnLT5sYXZnX2VtcHR5KTsKIAltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9kUWFjYywgY29uZmlnLT5kcWFjYyk7CiAJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yKG1hcCwgTUFYMTcwNDJfZFBhY2MsIGNvbmZpZy0+ZHBhY2MpOwogCi0JaWYgKGNoaXAtPmNoaXBfdHlwZSA9PSBNQVgxNzA0MikKKwlpZiAoY2hpcC0+Y2hpcF90eXBlID09IE1BWElNX0RFVklDRV9UWVBFX01BWDE3MDQyKQogCQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0Ml9WX2VtcHR5LCBjb25maWctPnZlbXB0eSk7CiAJZWxzZQogCQltYXgxNzA0Ml9vdmVycmlkZV9wb3IobWFwLCBNQVgxNzA0N19WX2VtcHR5LCBjb25maWctPnZlbXB0eSk7CkBAIC01MjksNyArNTI4LDYgQEAKIHsKIAlzdHJ1Y3QgcmVnbWFwICptYXAgPSBjaGlwLT5yZWdtYXA7CiAJaW50IHJldDsKLQlpbnQgdmFsOwogCiAJbWF4MTcwNDJfb3ZlcnJpZGVfcG9yX3ZhbHVlcyhjaGlwKTsKIAkvKiBBZnRlciBQb3dlciB1cCwgdGhlIE1BWDE3MDQyIHJlcXVpcmVzIDUwMG1TIGluIG9yZGVyCkBAIC01NzIsOCArNTcwLDcgQEAKIAltYXgxNzA0Ml9sb2FkX25ld19jYXBhY2l0eV9wYXJhbXMoY2hpcCk7CiAKIAkvKiBJbml0IGNvbXBsZXRlLCBDbGVhciB0aGUgUE9SIGJpdCAqLwotCXJlZ21hcF9yZWFkKG1hcCwgTUFYMTcwNDJfU1RBVFVTLCAmdmFsKTsKLQlyZWdtYXBfd3JpdGUobWFwLCBNQVgxNzA0Ml9TVEFUVVMsIHZhbCAmICh+U1RBVFVTX1BPUl9CSVQpKTsKKwlyZWdtYXBfdXBkYXRlX2JpdHMobWFwLCBNQVgxNzA0Ml9TVEFUVVMsIFNUQVRVU19QT1JfQklULCAweDApOwogCXJldHVybiAwOwogfQogCkBAIC02MDQsNyArNjAxLDcgQEAKIAkJbWF4MTcwNDJfc2V0X3NvY190aHJlc2hvbGQoY2hpcCwgMSk7CiAJfQogCi0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmNoaXAtPmJhdHRlcnkpOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoaXAtPmJhdHRlcnkpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNjY0LDEwICs2NjEsMjggQEAKIAkudmFsX2Zvcm1hdF9lbmRpYW4gPSBSRUdNQVBfRU5ESUFOX05BVElWRSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbWF4MTcwNDJfcHN5X2Rlc2MgPSB7CisJLm5hbWUJCT0gIm1heDE3MHh4X2JhdHRlcnkiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCisJLmdldF9wcm9wZXJ0eQk9IG1heDE3MDQyX2dldF9wcm9wZXJ0eSwKKwkucHJvcGVydGllcwk9IG1heDE3MDQyX2JhdHRlcnlfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShtYXgxNzA0Ml9iYXR0ZXJ5X3Byb3BzKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbWF4MTcwNDJfbm9fY3VycmVudF9zZW5zZV9wc3lfZGVzYyA9IHsKKwkubmFtZQkJPSAibWF4MTcweHhfYmF0dGVyeSIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkuZ2V0X3Byb3BlcnR5CT0gbWF4MTcwNDJfZ2V0X3Byb3BlcnR5LAorCS5wcm9wZXJ0aWVzCT0gbWF4MTcwNDJfYmF0dGVyeV9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDE3MDQyX2JhdHRlcnlfcHJvcHMpIC0gMiwKK307CisKIHN0YXRpYyBpbnQgbWF4MTcwNDJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSB0b19pMmNfYWRhcHRlcihjbGllbnQtPmRldi5wYXJlbnQpOworCWNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqbWF4MTcwNDJfZGVzYyA9ICZtYXgxNzA0Ml9wc3lfZGVzYzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAJc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXA7CiAJaW50IHJldDsKIAlpbnQgaTsKQEAgLTY5NCwyOSArNzA5LDEzIEBACiAJfQogCiAJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgY2hpcCk7Ci0KLQlyZWdtYXBfcmVhZChjaGlwLT5yZWdtYXAsIE1BWDE3MDQyX0Rldk5hbWUsICZ2YWwpOwotCWlmICh2YWwgPT0gTUFYMTcwNDJfSUNfVkVSU0lPTikgewotCQlkZXZfZGJnKCZjbGllbnQtPmRldiwgImNoaXAgdHlwZSBtYXgxNzA0MiBkZXRlY3RlZFxuIik7Ci0JCWNoaXAtPmNoaXBfdHlwZSA9IE1BWDE3MDQyOwotCX0gZWxzZSBpZiAodmFsID09IE1BWDE3MDQ3X0lDX1ZFUlNJT04pIHsKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJjaGlwIHR5cGUgbWF4MTcwNDcvNTAgZGV0ZWN0ZWRcbiIpOwotCQljaGlwLT5jaGlwX3R5cGUgPSBNQVgxNzA0NzsKLQl9IGVsc2UgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImRldmljZSB2ZXJzaW9uIG1pc21hdGNoOiAleFxuIiwgdmFsKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JY2hpcC0+YmF0dGVyeS5uYW1lCQk9ICJtYXgxNzB4eF9iYXR0ZXJ5IjsKLQljaGlwLT5iYXR0ZXJ5LnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQljaGlwLT5iYXR0ZXJ5LmdldF9wcm9wZXJ0eQk9IG1heDE3MDQyX2dldF9wcm9wZXJ0eTsKLQljaGlwLT5iYXR0ZXJ5LnByb3BlcnRpZXMJPSBtYXgxNzA0Ml9iYXR0ZXJ5X3Byb3BzOwotCWNoaXAtPmJhdHRlcnkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDE3MDQyX2JhdHRlcnlfcHJvcHMpOworCWNoaXAtPmNoaXBfdHlwZSA9IGlkLT5kcml2ZXJfZGF0YTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gY2hpcDsKIAogCS8qIFdoZW4gY3VycmVudCBpcyBub3QgbWVhc3VyZWQsCiAJICogQ1VSUkVOVF9OT1cgYW5kIENVUlJFTlRfQVZHIHByb3BlcnRpZXMgc2hvdWxkIGJlIGludmlzaWJsZS4gKi8KIAlpZiAoIWNoaXAtPnBkYXRhLT5lbmFibGVfY3VycmVudF9zZW5zZSkKLQkJY2hpcC0+YmF0dGVyeS5udW1fcHJvcGVydGllcyAtPSAyOworCQltYXgxNzA0Ml9kZXNjID0gJm1heDE3MDQyX25vX2N1cnJlbnRfc2Vuc2VfcHN5X2Rlc2M7CiAKIAlpZiAoY2hpcC0+cGRhdGEtPnJfc25zID09IDApCiAJCWNoaXAtPnBkYXRhLT5yX3NucyA9IE1BWDE3MDQyX0RFRkFVTFRfU05TX1JFU0lTVE9SOwpAQCAtNzMzLDIxICs3MzIsMjIgQEAKIAkJcmVnbWFwX3dyaXRlKGNoaXAtPnJlZ21hcCwgTUFYMTcwNDJfTGVhcm5DRkcsIDB4MDAwNyk7CiAJfQogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgJmNoaXAtPmJhdHRlcnkpOwotCWlmIChyZXQpIHsKKwljaGlwLT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwgbWF4MTcwNDJfZGVzYywKKwkJCQkJCSZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGNoaXAtPmJhdHRlcnkpKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXJcbiIpOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gUFRSX0VSUihjaGlwLT5iYXR0ZXJ5KTsKIAl9CiAKIAlpZiAoY2xpZW50LT5pcnEpIHsKIAkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2xpZW50LT5pcnEsIE5VTEwsCiAJCQkJCW1heDE3MDQyX3RocmVhZF9oYW5kbGVyLAogCQkJCQlJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfT05FU0hPVCwKLQkJCQkJY2hpcC0+YmF0dGVyeS5uYW1lLCBjaGlwKTsKKwkJCQkJY2hpcC0+YmF0dGVyeS0+ZGVzYy0+bmFtZSwgY2hpcCk7CiAJCWlmICghcmV0KSB7Ci0JCQlyZWdtYXBfcmVhZChjaGlwLT5yZWdtYXAsIE1BWDE3MDQyX0NPTkZJRywgJnZhbCk7Ci0JCQl2YWwgfD0gQ09ORklHX0FMUlRfQklUX0VOQkw7Ci0JCQlyZWdtYXBfd3JpdGUoY2hpcC0+cmVnbWFwLCBNQVgxNzA0Ml9DT05GSUcsIHZhbCk7CisJCQlyZWdtYXBfdXBkYXRlX2JpdHMoY2hpcC0+cmVnbWFwLCBNQVgxNzA0Ml9DT05GSUcsCisJCQkJCUNPTkZJR19BTFJUX0JJVF9FTkJMLAorCQkJCQlDT05GSUdfQUxSVF9CSVRfRU5CTCk7CiAJCQltYXgxNzA0Ml9zZXRfc29jX3RocmVzaG9sZChjaGlwLCAxKTsKIAkJfSBlbHNlIHsKIAkJCWNsaWVudC0+aXJxID0gMDsKQEAgLTc3Myw3ICs3NzMsNyBAQAogCiAJaWYgKGNsaWVudC0+aXJxKQogCQlmcmVlX2lycShjbGllbnQtPmlycSwgY2hpcCk7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmNoaXAtPmJhdHRlcnkpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGNoaXAtPmJhdHRlcnkpOwogCXJldHVybiAwOwogfQogCkBAIC04MjMsOSArODIzLDkgQEAKICNlbmRpZgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbWF4MTcwNDJfaWRbXSA9IHsKLQl7ICJtYXgxNzA0MiIsIDAgfSwKLQl7ICJtYXgxNzA0NyIsIDEgfSwKLQl7ICJtYXgxNzA1MCIsIDIgfSwKKwl7ICJtYXgxNzA0MiIsIE1BWElNX0RFVklDRV9UWVBFX01BWDE3MDQyIH0sCisJeyAibWF4MTcwNDciLCBNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA0NyB9LAorCXsgIm1heDE3MDUwIiwgTUFYSU1fREVWSUNFX1RZUEVfTUFYMTcwNTAgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbWF4MTcwNDJfaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXg3NzY5M19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL21heDc3NjkzX2NoYXJnZXIuYwppbmRleCBiMDQyOTcwLi43NTQ4NzllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL21heDc3NjkzX2NoYXJnZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL21heDc3NjkzX2NoYXJnZXIuYwpAQCAtMjIsMTQgKzIyLDE0IEBACiAjaW5jbHVkZSA8bGludXgvbWZkL21heDc3NjkzLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL21heDc3NjkzLXByaXZhdGUuaD4KIAotc3RhdGljIGNvbnN0IGNoYXIgKm1heDc3NjkzX2NoYXJnZXJfbmFtZQkJPSAibWF4Nzc2OTMtY2hhcmdlciI7CisjZGVmaW5lIE1BWDc3NjkzX0NIQVJHRVJfTkFNRQkJCQkibWF4Nzc2OTMtY2hhcmdlciIKIHN0YXRpYyBjb25zdCBjaGFyICptYXg3NzY5M19jaGFyZ2VyX21vZGVsCQk9ICJNQVg3NzY5MyI7CiBzdGF0aWMgY29uc3QgY2hhciAqbWF4Nzc2OTNfY2hhcmdlcl9tYW51ZmFjdHVyZXIJPSAiTWF4aW0gSW50ZWdyYXRlZCI7CiAKIHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyIHsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCBtYXg3NzY5M19kZXYJKm1heDc3NjkzOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkJY2hhcmdlcjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CSpjaGFyZ2VyOwogCiAJdTMyIGNvbnN0YW50X3ZvbHQ7CiAJdTMyIG1pbl9zeXN0ZW1fdm9sdDsKQEAgLTM4LDEzICszOCwxNCBAQAogCXUzMiBjaGFyZ2VfaW5wdXRfdGhyZXNob2xkX3ZvbHQ7CiB9OwogCi1zdGF0aWMgaW50IG1heDc3NjkzX2dldF9jaGFyZ2VyX3N0YXRlKHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfZ2V0X2NoYXJnZXJfc3RhdGUoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgKnZhbCkKIHsKLQlpbnQgc3RhdGU7CisJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgZGF0YTsKIAotCWlmIChyZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0RFVEFJTFNfMDEsICZkYXRhKSA8IDApCi0JCXJldHVybiBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19ERVRBSUxTXzAxLCAmZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlkYXRhICY9IENIR19ERVRBSUxTXzAxX0NIR19NQVNLOwogCWRhdGEgPj49IENIR19ERVRBSUxTXzAxX0NIR19TSElGVDsKQEAgLTU2LDM1ICs1NywzNiBAQAogCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVE9QX09GRjoKIAkvKiBJbiBoaWdoIHRlbXAgdGhlIGNoYXJnaW5nIGN1cnJlbnQgaXMgcmVkdWNlZCwgYnV0IHN0aWxsIGNoYXJnaW5nICovCiAJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19ISUdIX1RFTVA6Ci0JCXN0YXRlID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfRE9ORToKLQkJc3RhdGUgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVElNRVJfRVhQSVJFRDoKIAljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1RIRVJNSVNUT1JfU1VTUEVORDoKLQkJc3RhdGUgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwogCQlicmVhazsKIAljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX09GRjoKIAljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX09WRVJfVEVNUDoKIAljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX1dBVENIRE9HX0VYUElSRUQ6Ci0JCXN0YXRlID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfUkVTRVJWRUQ6CiAJZGVmYXVsdDoKLQkJc3RhdGUgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CiAJfQogCi0JcmV0dXJuIHN0YXRlOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1heDc3NjkzX2dldF9jaGFyZ2VfdHlwZShzdHJ1Y3QgcmVnbWFwICpyZWdtYXApCitzdGF0aWMgaW50IG1heDc3NjkzX2dldF9jaGFyZ2VfdHlwZShzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQogewotCWludCBzdGF0ZTsKKwlpbnQgcmV0OwogCXVuc2lnbmVkIGludCBkYXRhOwogCi0JaWYgKHJlZ21hcF9yZWFkKHJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfREVUQUlMU18wMSwgJmRhdGEpIDwgMCkKLQkJcmV0dXJuIFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9VTktOT1dOOworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgTUFYNzc2OTNfQ0hHX1JFR19DSEdfREVUQUlMU18wMSwgJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJZGF0YSAmPSBDSEdfREVUQUlMU18wMV9DSEdfTUFTSzsKIAlkYXRhID4+PSBDSEdfREVUQUlMU18wMV9DSEdfU0hJRlQ7CkBAIC05NiwxMyArOTgsMTMgQEAKIAkgKiAxMDAgYW5kIDI1MCBtQS4gSXQgaXMgaGlnaGVyIHRoYW4gcHJlcXVhbGlmaWNhdGlvbiBjdXJyZW50LgogCSAqLwogCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVE9QX09GRjoKLQkJc3RhdGUgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfVFJJQ0tMRTsKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9UUklDS0xFOwogCQlicmVhazsKIAljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0ZBU1RfQ09OU1RfQ1VSUkVOVDoKIAljYXNlIE1BWDc3NjkzX0NIQVJHSU5HX0ZBU1RfQ09OU1RfVk9MVEFHRToKIAkvKiBJbiBoaWdoIHRlbXAgdGhlIGNoYXJnaW5nIGN1cnJlbnQgaXMgcmVkdWNlZCwgYnV0IHN0aWxsIGNoYXJnaW5nICovCiAJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19ISUdIX1RFTVA6Ci0JCXN0YXRlID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX0ZBU1Q7CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfRkFTVDsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19ET05FOgogCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfVElNRVJfRVhQSVJFRDoKQEAgLTExMCwxNCArMTEyLDE0IEBACiAJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19PRkY6CiAJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19PVkVSX1RFTVA6CiAJY2FzZSBNQVg3NzY5M19DSEFSR0lOR19XQVRDSERPR19FWFBJUkVEOgotCQlzdGF0ZSA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9OT05FOworCQkqdmFsID0gUE9XRVJfU1VQUExZX0NIQVJHRV9UWVBFX05PTkU7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc2OTNfQ0hBUkdJTkdfUkVTRVJWRUQ6CiAJZGVmYXVsdDoKLQkJc3RhdGUgPSBQT1dFUl9TVVBQTFlfQ0hBUkdFX1RZUEVfVU5LTk9XTjsKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9DSEFSR0VfVFlQRV9VTktOT1dOOwogCX0KIAotCXJldHVybiBzdGF0ZTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTEyOSw2OSArMTMxLDc4IEBACiAgKiAgLSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV04KICAqICAtIFBPV0VSX1NVUFBMWV9IRUFMVEhfVU5TUEVDX0ZBSUxVUkUKICAqLwotc3RhdGljIGludCBtYXg3NzY5M19nZXRfYmF0dGVyeV9oZWFsdGgoc3RydWN0IHJlZ21hcCAqcmVnbWFwKQorc3RhdGljIGludCBtYXg3NzY5M19nZXRfYmF0dGVyeV9oZWFsdGgoc3RydWN0IHJlZ21hcCAqcmVnbWFwLCBpbnQgKnZhbCkKIHsKLQlpbnQgc3RhdGU7CisJaW50IHJldDsKIAl1bnNpZ25lZCBpbnQgZGF0YTsKIAotCWlmIChyZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0RFVEFJTFNfMDEsICZkYXRhKSA8IDApCi0JCXJldHVybiBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOS05PV047CisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19ERVRBSUxTXzAxLCAmZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKIAlkYXRhICY9IENIR19ERVRBSUxTXzAxX0JBVF9NQVNLOwogCWRhdGEgPj49IENIR19ERVRBSUxTXzAxX0JBVF9TSElGVDsKIAogCXN3aXRjaCAoZGF0YSkgewogCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9OT0JBVDoKLQkJc3RhdGUgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7CisJCSp2YWwgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX0RFQUQ7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9QUkVRVUFMSUZJQ0FUSU9OOgogCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9HT09EOgogCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9MT1dWT0xUQUdFOgotCQlzdGF0ZSA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfR09PRDsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3NzY5M19CQVRURVJZX1RJTUVSX0VYUElSRUQ6CiAJCS8qCiAJCSAqIFRvb2sgbG9uZ2VyIHRvIGNoYXJnZSB0aGFuIGV4cGVjdGVkLCBjaGFyZ2luZyBzdXNwZW5kZWQuCiAJCSAqIERhbWFnZWQgYmF0dGVyeT8KIAkJICovCi0JCXN0YXRlID0gUE9XRVJfU1VQUExZX0hFQUxUSF9TQUZFVFlfVElNRVJfRVhQSVJFOworCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9TQUZFVFlfVElNRVJfRVhQSVJFOwogCQlicmVhazsKIAljYXNlIE1BWDc3NjkzX0JBVFRFUllfT1ZFUlZPTFRBR0U6Ci0JCXN0YXRlID0gUE9XRVJfU1VQUExZX0hFQUxUSF9PVkVSVk9MVEFHRTsKKwkJKnZhbCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUlZPTFRBR0U7CiAJCWJyZWFrOwogCWNhc2UgTUFYNzc2OTNfQkFUVEVSWV9PVkVSQ1VSUkVOVDoKLQkJc3RhdGUgPSBQT1dFUl9TVVBQTFlfSEVBTFRIX1VOU1BFQ19GQUlMVVJFOworCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTlNQRUNfRkFJTFVSRTsKIAkJYnJlYWs7CiAJY2FzZSBNQVg3NzY5M19CQVRURVJZX1JFU0VSVkVEOgogCWRlZmF1bHQ6Ci0JCXN0YXRlID0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTktOT1dOOworCQkqdmFsID0gUE9XRVJfU1VQUExZX0hFQUxUSF9VTktOT1dOOwogCQlicmVhazsKIAl9CiAKLQlyZXR1cm4gc3RhdGU7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWF4Nzc2OTNfZ2V0X3ByZXNlbnQoc3RydWN0IHJlZ21hcCAqcmVnbWFwKQorc3RhdGljIGludCBtYXg3NzY5M19nZXRfcHJlc2VudChzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQogewogCXVuc2lnbmVkIGludCBkYXRhOworCWludCByZXQ7CiAKIAkvKgogCSAqIFJlYWQgQ0hHX0lOVF9PSyByZWdpc3Rlci4gSGlnaCBERVRCQVQgYml0IGhlcmUgc2hvdWxkIGJlCiAJICogZXF1YWwgdG8gdmFsdWUgMHgwIGluIENIR19ERVRBSUxTXzAxL0JBVCBmaWVsZC4KIAkgKi8KLQlyZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0lOVF9PSywgJmRhdGEpOwotCWlmIChkYXRhICYgQ0hHX0lOVF9PS19ERVRCQVRfTUFTSykKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBNQVg3NzY5M19DSEdfUkVHX0NIR19JTlRfT0ssICZkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCSp2YWwgPSAoZGF0YSAmIENIR19JTlRfT0tfREVUQkFUX01BU0spID8gMCA6IDE7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtYXg3NzY5M19nZXRfb25saW5lKHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKK3N0YXRpYyBpbnQgbWF4Nzc2OTNfZ2V0X29ubGluZShzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsIGludCAqdmFsKQogewogCXVuc2lnbmVkIGludCBkYXRhOworCWludCByZXQ7CiAKLQlyZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0lOVF9PSywgJmRhdGEpOwotCWlmIChkYXRhICYgQ0hHX0lOVF9PS19DSEdJTl9NQVNLKQotCQlyZXR1cm4gMTsKKwlyZXQgPSByZWdtYXBfcmVhZChyZWdtYXAsIE1BWDc3NjkzX0NIR19SRUdfQ0hHX0lOVF9PSywgJmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKnZhbCA9IChkYXRhICYgQ0hHX0lOVF9PS19DSEdJTl9NQVNLKSA/IDEgOiAwOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwOSwyNyArMjIwLDI1IEBACiAJCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IG1heDc3NjkzX2NoYXJnZXIgKmNoZyA9IGNvbnRhaW5lcl9vZihwc3ksCi0JCQkJCQkgIHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyLAotCQkJCQkJICBjaGFyZ2VyKTsKKwlzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gY2hnLT5tYXg3NzY5My0+cmVnbWFwOwogCWludCByZXQgPSAwOwogCiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKLQkJdmFsLT5pbnR2YWwgPSBtYXg3NzY5M19nZXRfY2hhcmdlcl9zdGF0ZShyZWdtYXApOworCQlyZXQgPSBtYXg3NzY5M19nZXRfY2hhcmdlcl9zdGF0ZShyZWdtYXAsICZ2YWwtPmludHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX1RZUEU6Ci0JCXZhbC0+aW50dmFsID0gbWF4Nzc2OTNfZ2V0X2NoYXJnZV90eXBlKHJlZ21hcCk7CisJCXJldCA9IG1heDc3NjkzX2dldF9jaGFyZ2VfdHlwZShyZWdtYXAsICZ2YWwtPmludHZhbCk7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfSEVBTFRIOgotCQl2YWwtPmludHZhbCA9IG1heDc3NjkzX2dldF9iYXR0ZXJ5X2hlYWx0aChyZWdtYXApOworCQlyZXQgPSBtYXg3NzY5M19nZXRfYmF0dGVyeV9oZWFsdGgocmVnbWFwLCAmdmFsLT5pbnR2YWwpOwogCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6Ci0JCXZhbC0+aW50dmFsID0gbWF4Nzc2OTNfZ2V0X3ByZXNlbnQocmVnbWFwKTsKKwkJcmV0ID0gbWF4Nzc2OTNfZ2V0X3ByZXNlbnQocmVnbWFwLCAmdmFsLT5pbnR2YWwpOwogCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORToKLQkJdmFsLT5pbnR2YWwgPSBtYXg3NzY5M19nZXRfb25saW5lKHJlZ21hcCk7CisJCXJldCA9IG1heDc3NjkzX2dldF9vbmxpbmUocmVnbWFwLCAmdmFsLT5pbnR2YWwpOwogCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX01PREVMX05BTUU6CiAJCXZhbC0+c3RydmFsID0gbWF4Nzc2OTNfY2hhcmdlcl9tb2RlbDsKQEAgLTI0NCw2ICsyNTMsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIG1heDc3NjkzX2NoYXJnZXJfZGVzYyA9IHsKKwkubmFtZQkJPSBNQVg3NzY5M19DSEFSR0VSX05BTUUsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwk9IG1heDc3NjkzX2NoYXJnZXJfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShtYXg3NzY5M19jaGFyZ2VyX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CT0gbWF4Nzc2OTNfY2hhcmdlcl9nZXRfcHJvcGVydHksCit9OworCiBzdGF0aWMgc3NpemVfdCBkZXZpY2VfYXR0cl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKIAkJaW50ICgqZm4pKHN0cnVjdCBtYXg3NzY5M19jaGFyZ2VyICosIHVuc2lnbmVkIGxvbmcpKQpAQCAtNjU5LDYgKzY3Niw3IEBACiBzdGF0aWMgaW50IG1heDc3NjkzX2NoYXJnZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbWF4Nzc2OTNfY2hhcmdlciAqY2hnOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKIAlzdHJ1Y3QgbWF4Nzc2OTNfZGV2ICptYXg3NzY5MyA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlpbnQgcmV0OwogCkBAIC02NzgsMTEgKzY5Niw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCWNoZy0+Y2hhcmdlci5uYW1lID0gbWF4Nzc2OTNfY2hhcmdlcl9uYW1lOwotCWNoZy0+Y2hhcmdlci50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQljaGctPmNoYXJnZXIucHJvcGVydGllcyA9IG1heDc3NjkzX2NoYXJnZXJfcHJvcHM7Ci0JY2hnLT5jaGFyZ2VyLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShtYXg3NzY5M19jaGFyZ2VyX3Byb3BzKTsKLQljaGctPmNoYXJnZXIuZ2V0X3Byb3BlcnR5ID0gbWF4Nzc2OTNfY2hhcmdlcl9nZXRfcHJvcGVydHk7CisJcHN5X2NmZy5kcnZfZGF0YSA9IGNoZzsKIAogCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfZmFzdF9jaGFyZ2VfdGltZXIpOwogCWlmIChyZXQpIHsKQEAgLTcwMyw5ICs3MTcsMTIgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjaGctPmNoYXJnZXIpOwotCWlmIChyZXQpIHsKKwljaGctPmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJCQkJCSZtYXg3NzY5M19jaGFyZ2VyX2Rlc2MsCisJCQkJCQkmcHN5X2NmZyk7CisJaWYgKElTX0VSUihjaGctPmNoYXJnZXIpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihjaGctPmNoYXJnZXIpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTcyNyw3ICs3NDQsNyBAQAogCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfdG9wX29mZl90aHJlc2hvbGRfY3VycmVudCk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9mYXN0X2NoYXJnZV90aW1lcik7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmY2hnLT5jaGFyZ2VyKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihjaGctPmNoYXJnZXIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDg5MDNfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9tYXg4OTAzX2NoYXJnZXIuYwppbmRleCA5OWUzY2RjLi5iZjJiNGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL21heDg5MDNfY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmMKQEAgLTMxLDcgKzMxLDggQEAKIHN0cnVjdCBtYXg4OTAzX2RhdGEgewogCXN0cnVjdCBtYXg4OTAzX3BkYXRhIHBkYXRhOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IHBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHBzeV9kZXNjOwogCWJvb2wgZmF1bHQ7CiAJYm9vbCB1c2JfaW47CiAJYm9vbCB0YV9pbjsKQEAgLTQ3LDggKzQ4LDcgQEAKIAkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBtYXg4OTAzX2RhdGEgKmRhdGEgPSBjb250YWluZXJfb2YocHN5LAotCQkJc3RydWN0IG1heDg5MDNfZGF0YSwgcHN5KTsKKwlzdHJ1Y3QgbWF4ODkwM19kYXRhICpkYXRhID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAlzd2l0Y2ggKHBzcCkgewogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTOgpAQCAtMTA0LDE3ICsxMDQsMTcgQEAKIAlkZXZfZGJnKGRhdGEtPmRldiwgIlRBKERDLUlOKSBDaGFyZ2VyICVzLlxuIiwgdGFfaW4gPwogCQkJIkNvbm5lY3RlZCIgOiAiRGlzY29ubmVjdGVkIik7CiAKLQlvbGRfdHlwZSA9IGRhdGEtPnBzeS50eXBlOworCW9sZF90eXBlID0gZGF0YS0+cHN5X2Rlc2MudHlwZTsKIAogCWlmIChkYXRhLT50YV9pbikKLQkJZGF0YS0+cHN5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKKwkJZGF0YS0+cHN5X2Rlc2MudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOwogCWVsc2UgaWYgKGRhdGEtPnVzYl9pbikKLQkJZGF0YS0+cHN5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CisJCWRhdGEtPnBzeV9kZXNjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CiAJZWxzZQotCQlkYXRhLT5wc3kudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CisJCWRhdGEtPnBzeV9kZXNjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwogCi0JaWYgKG9sZF90eXBlICE9IGRhdGEtPnBzeS50eXBlKQotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmZGF0YS0+cHN5KTsKKwlpZiAob2xkX3R5cGUgIT0gZGF0YS0+cHN5X2Rlc2MudHlwZSkKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoZGF0YS0+cHN5KTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTE0MywxNyArMTQzLDE3IEBACiAJZGV2X2RiZyhkYXRhLT5kZXYsICJVU0IgQ2hhcmdlciAlcy5cbiIsIHVzYl9pbiA/CiAJCQkiQ29ubmVjdGVkIiA6ICJEaXNjb25uZWN0ZWQiKTsKIAotCW9sZF90eXBlID0gZGF0YS0+cHN5LnR5cGU7CisJb2xkX3R5cGUgPSBkYXRhLT5wc3lfZGVzYy50eXBlOwogCiAJaWYgKGRhdGEtPnRhX2luKQotCQlkYXRhLT5wc3kudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOworCQlkYXRhLT5wc3lfZGVzYy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7CiAJZWxzZSBpZiAoZGF0YS0+dXNiX2luKQotCQlkYXRhLT5wc3kudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQjsKKwkJZGF0YS0+cHN5X2Rlc2MudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQjsKIAllbHNlCi0JCWRhdGEtPnBzeS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKKwkJZGF0YS0+cHN5X2Rlc2MudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CiAKLQlpZiAob2xkX3R5cGUgIT0gZGF0YS0+cHN5LnR5cGUpCi0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZkYXRhLT5wc3kpOworCWlmIChvbGRfdHlwZSAhPSBkYXRhLT5wc3lfZGVzYy50eXBlKQorCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChkYXRhLT5wc3kpOwogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQpAQCAtMTg0LDYgKzE4NCw3IEBACiAJc3RydWN0IG1heDg5MDNfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwogCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgZ3BpbzsKIAlpbnQgdGFfaW4gPSAwOwpAQCAtMjgwLDE3ICsyODEsMjAgQEAKIAlkYXRhLT50YV9pbiA9IHRhX2luOwogCWRhdGEtPnVzYl9pbiA9IHVzYl9pbjsKIAotCWRhdGEtPnBzeS5uYW1lID0gIm1heDg5MDNfY2hhcmdlciI7Ci0JZGF0YS0+cHN5LnR5cGUgPSAodGFfaW4pID8gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMgOgorCWRhdGEtPnBzeV9kZXNjLm5hbWUgPSAibWF4ODkwM19jaGFyZ2VyIjsKKwlkYXRhLT5wc3lfZGVzYy50eXBlID0gKHRhX2luKSA/IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TIDoKIAkJCSgodXNiX2luKSA/IFBPV0VSX1NVUFBMWV9UWVBFX1VTQiA6CiAJCQkgUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSk7Ci0JZGF0YS0+cHN5LmdldF9wcm9wZXJ0eSA9IG1heDg5MDNfZ2V0X3Byb3BlcnR5OwotCWRhdGEtPnBzeS5wcm9wZXJ0aWVzID0gbWF4ODkwM19jaGFyZ2VyX3Byb3BzOwotCWRhdGEtPnBzeS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUobWF4ODkwM19jaGFyZ2VyX3Byb3BzKTsKKwlkYXRhLT5wc3lfZGVzYy5nZXRfcHJvcGVydHkgPSBtYXg4OTAzX2dldF9wcm9wZXJ0eTsKKwlkYXRhLT5wc3lfZGVzYy5wcm9wZXJ0aWVzID0gbWF4ODkwM19jaGFyZ2VyX3Byb3BzOworCWRhdGEtPnBzeV9kZXNjLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShtYXg4OTAzX2NoYXJnZXJfcHJvcHMpOwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRldiwgJmRhdGEtPnBzeSk7Ci0JaWYgKHJldCkgeworCXBzeV9jZmcuZHJ2X2RhdGEgPSBkYXRhOworCisJZGF0YS0+cHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRldiwgJmRhdGEtPnBzeV9kZXNjLCAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihkYXRhLT5wc3kpKSB7CiAJCWRldl9lcnIoZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXIuXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihkYXRhLT5wc3kpOwogCQlnb3RvIGVycjsKIAl9CiAKQEAgLTMzOSw3ICszNDMsNyBAQAogCWlmIChwZGF0YS0+ZGNfdmFsaWQpCiAJCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBkYXRhLT5kb2spLCBkYXRhKTsKIGVycl9wc3k6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmRhdGEtPnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGF0YS0+cHN5KTsKIGVycjoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzU3LDcgKzM2MSw3IEBACiAJCQlmcmVlX2lycShncGlvX3RvX2lycShwZGF0YS0+dW9rKSwgZGF0YSk7CiAJCWlmIChwZGF0YS0+ZGNfdmFsaWQpCiAJCQlmcmVlX2lycShncGlvX3RvX2lycShwZGF0YS0+ZG9rKSwgZGF0YSk7Ci0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkYXRhLT5wc3kpOworCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkYXRhLT5wc3kpOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXg4OTI1X3Bvd2VyLmMgYi9kcml2ZXJzL3Bvd2VyL21heDg5MjVfcG93ZXIuYwppbmRleCBhNmQ0NWVlLi41N2ViNWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL21heDg5MjVfcG93ZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL21heDg5MjVfcG93ZXIuYwpAQCAtNjgsOSArNjgsOSBAQAogCXN0cnVjdCBpMmNfY2xpZW50CSpncG07CiAJc3RydWN0IGkyY19jbGllbnQJKmFkYzsKIAotCXN0cnVjdCBwb3dlcl9zdXBwbHkJYWM7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseQl1c2I7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseQliYXR0ZXJ5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkJKmFjOworCXN0cnVjdCBwb3dlcl9zdXBwbHkJKnVzYjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CSpiYXR0ZXJ5OwogCWludAkJCWlycV9iYXNlOwogCXVuc2lnbmVkCQlhY19vbmxpbmU6MTsKIAl1bnNpZ25lZAkJdXNiX29ubGluZToxOwpAQCAtMTk2LDcgKzE5Niw3IEBACiAJCQkgICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJICAgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IG1heDg5MjVfcG93ZXJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgbWF4ODkyNV9wb3dlcl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LnBhcmVudCk7CiAJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKHBzcCkgewpAQCAtMjMwLDcgKzIzMCw3IEBACiAJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IG1heDg5MjVfcG93ZXJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgbWF4ODkyNV9wb3dlcl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LnBhcmVudCk7CiAJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKHBzcCkgewpAQCAtMjY0LDcgKzI2NCw3IEBACiAJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IG1heDg5MjVfcG93ZXJfaW5mbyAqaW5mbyA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgbWF4ODkyNV9wb3dlcl9pbmZvICppbmZvID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LnBhcmVudCk7CiAJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKHBzcCkgewpAQCAtMzQ3LDYgKzM0NywzMCBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUywKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYWNfZGVzYyA9IHsKKwkubmFtZQkJPSAibWF4ODkyNS1hYyIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCisJLnByb3BlcnRpZXMJPSBtYXg4OTI1X2FjX3Byb3BzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUobWF4ODkyNV9hY19wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IG1heDg5MjVfYWNfZ2V0X3Byb3AsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHVzYl9kZXNjID0geworCS5uYW1lCQk9ICJtYXg4OTI1LXVzYiIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCLAorCS5wcm9wZXJ0aWVzCT0gbWF4ODkyNV91c2JfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShtYXg4OTI1X3VzYl9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IG1heDg5MjVfdXNiX2dldF9wcm9wLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBiYXR0ZXJ5X2Rlc2MgPSB7CisJLm5hbWUJCT0gIm1heDg5MjUtYmF0dGVyeSIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwk9IG1heDg5MjVfYmF0dGVyeV9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDg5MjVfYmF0dGVyeV9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IG1heDg5MjVfYmF0X2dldF9wcm9wLAorfTsKKwogI2RlZmluZSBSRVFVRVNUX0lSUShfaXJxLCBfbmFtZSkJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoY2hpcC0+aXJxX2Jhc2UgKyBfaXJxLCBOVUxMLAkJXApAQCAtNDgyLDYgKzUwNiw3IEBACiBzdGF0aWMgaW50IG1heDg5MjVfcG93ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgbWF4ODkyNV9jaGlwICpjaGlwID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsgLyogT25seSBmb3IgYWMgYW5kIHVzYiAqLwogCXN0cnVjdCBtYXg4OTI1X3Bvd2VyX3BkYXRhICpwZGF0YSA9IE5VTEw7CiAJc3RydWN0IG1heDg5MjVfcG93ZXJfaW5mbyAqaW5mbzsKIAlpbnQgcmV0OwpAQCAtNTAyLDQwICs1MjcsMjkgQEAKIAlpbmZvLT5hZGMgPSBjaGlwLT5hZGM7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CiAKLQlpbmZvLT5hYy5uYW1lID0gIm1heDg5MjUtYWMiOwotCWluZm8tPmFjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKLQlpbmZvLT5hYy5wcm9wZXJ0aWVzID0gbWF4ODkyNV9hY19wcm9wczsKLQlpbmZvLT5hYy5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUobWF4ODkyNV9hY19wcm9wcyk7Ci0JaW5mby0+YWMuZ2V0X3Byb3BlcnR5ID0gbWF4ODkyNV9hY19nZXRfcHJvcDsKLQlpbmZvLT5hYy5zdXBwbGllZF90byA9IHBkYXRhLT5zdXBwbGllZF90bzsKLQlpbmZvLT5hYy5udW1fc3VwcGxpY2FudHMgPSBwZGF0YS0+bnVtX3N1cHBsaWNhbnRzOwotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmaW5mby0+YWMpOwotCWlmIChyZXQpCisJcHN5X2NmZy5zdXBwbGllZF90byA9IHBkYXRhLT5zdXBwbGllZF90bzsKKwlwc3lfY2ZnLm51bV9zdXBwbGljYW50cyA9IHBkYXRhLT5udW1fc3VwcGxpY2FudHM7CisKKwlpbmZvLT5hYyA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmYWNfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoaW5mby0+YWMpKSB7CisJCXJldCA9IFBUUl9FUlIoaW5mby0+YWMpOwogCQlnb3RvIG91dDsKLQlpbmZvLT5hYy5kZXYtPnBhcmVudCA9ICZwZGV2LT5kZXY7CisJfQorCWluZm8tPmFjLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKIAotCWluZm8tPnVzYi5uYW1lID0gIm1heDg5MjUtdXNiIjsKLQlpbmZvLT51c2IudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQjsKLQlpbmZvLT51c2IucHJvcGVydGllcyA9IG1heDg5MjVfdXNiX3Byb3BzOwotCWluZm8tPnVzYi5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUobWF4ODkyNV91c2JfcHJvcHMpOwotCWluZm8tPnVzYi5nZXRfcHJvcGVydHkgPSBtYXg4OTI1X3VzYl9nZXRfcHJvcDsKLQlpbmZvLT51c2Iuc3VwcGxpZWRfdG8gPSBwZGF0YS0+c3VwcGxpZWRfdG87Ci0JaW5mby0+dXNiLm51bV9zdXBwbGljYW50cyA9IHBkYXRhLT5udW1fc3VwcGxpY2FudHM7Ci0KLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmluZm8tPnVzYik7Ci0JaWYgKHJldCkKKwlpbmZvLT51c2IgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnVzYl9kZXNjLCAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihpbmZvLT51c2IpKSB7CisJCXJldCA9IFBUUl9FUlIoaW5mby0+dXNiKTsKIAkJZ290byBvdXRfdXNiOwotCWluZm8tPnVzYi5kZXYtPnBhcmVudCA9ICZwZGV2LT5kZXY7CisJfQorCWluZm8tPnVzYi0+ZGV2LnBhcmVudCA9ICZwZGV2LT5kZXY7CiAKLQlpbmZvLT5iYXR0ZXJ5Lm5hbWUgPSAibWF4ODkyNS1iYXR0ZXJ5IjsKLQlpbmZvLT5iYXR0ZXJ5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCWluZm8tPmJhdHRlcnkucHJvcGVydGllcyA9IG1heDg5MjVfYmF0dGVyeV9wcm9wczsKLQlpbmZvLT5iYXR0ZXJ5Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShtYXg4OTI1X2JhdHRlcnlfcHJvcHMpOwotCWluZm8tPmJhdHRlcnkuZ2V0X3Byb3BlcnR5ID0gbWF4ODkyNV9iYXRfZ2V0X3Byb3A7Ci0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZpbmZvLT5iYXR0ZXJ5KTsKLQlpZiAocmV0KQorCWluZm8tPmJhdHRlcnkgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmJhdHRlcnlfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUihpbmZvLT5iYXR0ZXJ5KSkgeworCQlyZXQgPSBQVFJfRVJSKGluZm8tPmJhdHRlcnkpOwogCQlnb3RvIG91dF9iYXR0ZXJ5OwotCWluZm8tPmJhdHRlcnkuZGV2LT5wYXJlbnQgPSAmcGRldi0+ZGV2OworCX0KKwlpbmZvLT5iYXR0ZXJ5LT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKIAogCWluZm8tPmJhdHRfZGV0ZWN0ID0gcGRhdGEtPmJhdHRfZGV0ZWN0OwogCWluZm8tPnRvcG9mZl90aHJlc2hvbGQgPSBwZGF0YS0+dG9wb2ZmX3RocmVzaG9sZDsKQEAgLTU0Nyw5ICs1NjEsOSBAQAogCW1heDg5MjVfaW5pdF9jaGFyZ2VyKGNoaXAsIGluZm8pOwogCXJldHVybiAwOwogb3V0X2JhdHRlcnk6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmluZm8tPmJhdHRlcnkpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGluZm8tPmJhdHRlcnkpOwogb3V0X3VzYjoKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmaW5mby0+YWMpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGluZm8tPmFjKTsKIG91dDoKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTU5LDkgKzU3Myw5IEBACiAJc3RydWN0IG1heDg5MjVfcG93ZXJfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJaWYgKGluZm8pIHsKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmluZm8tPmFjKTsKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmluZm8tPnVzYik7Ci0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZpbmZvLT5iYXR0ZXJ5KTsKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoaW5mby0+YWMpOworCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihpbmZvLT51c2IpOworCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihpbmZvLT5iYXR0ZXJ5KTsKIAkJbWF4ODkyNV9kZWluaXRfY2hhcmdlcihpbmZvKTsKIAl9CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDg5OTdfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9tYXg4OTk3X2NoYXJnZXIuYwppbmRleCBhZWZhMGM5Li4wYjJlYWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL21heDg5OTdfY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvbWF4ODk5N19jaGFyZ2VyLmMKQEAgLTMwLDcgKzMwLDcgQEAKIHN0cnVjdCBjaGFyZ2VyX2RhdGEgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbWF4ODk5N19kZXYgKmlvZGV2OwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0dGVyeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0ZXJ5OwogfTsKIAogc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IG1heDg5OTdfYmF0dGVyeV9wcm9wc1tdID0gewpAQCAtNDQsOCArNDQsNyBAQAogCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IGNoYXJnZXJfZGF0YSAqY2hhcmdlciA9IGNvbnRhaW5lcl9vZihwc3ksCi0JCQlzdHJ1Y3QgY2hhcmdlcl9kYXRhLCBiYXR0ZXJ5KTsKKwlzdHJ1Y3QgY2hhcmdlcl9kYXRhICpjaGFyZ2VyID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IGNoYXJnZXItPmlvZGV2LT5pMmM7CiAJaW50IHJldDsKIAl1OCByZWc7CkBAIC04NiwxMiArODUsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBtYXg4OTk3X2JhdHRlcnlfZGVzYyA9IHsKKwkubmFtZQkJPSAibWF4ODk5N19wbWljIiwKKwkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5nZXRfcHJvcGVydHkJPSBtYXg4OTk3X2JhdHRlcnlfZ2V0X3Byb3BlcnR5LAorCS5wcm9wZXJ0aWVzCT0gbWF4ODk5N19iYXR0ZXJ5X3Byb3BzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUobWF4ODk5N19iYXR0ZXJ5X3Byb3BzKSwKK307CisKIHN0YXRpYyBpbnQgbWF4ODk5N19iYXR0ZXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGNoYXJnZXJfZGF0YSAqY2hhcmdlcjsKIAlzdHJ1Y3QgbWF4ODk5N19kZXYgKmlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCBtYXg4OTk3X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShpb2Rldi0+ZGV2KTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAKIAlpZiAoIXBkYXRhKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE0NywxOSArMTU1LDE4IEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjaGFyZ2VyKTsKIAotCWNoYXJnZXItPmJhdHRlcnkubmFtZSA9ICJtYXg4OTk3X3BtaWMiOwotCWNoYXJnZXItPmJhdHRlcnkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JY2hhcmdlci0+YmF0dGVyeS5nZXRfcHJvcGVydHkgPSBtYXg4OTk3X2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwotCWNoYXJnZXItPmJhdHRlcnkucHJvcGVydGllcyA9IG1heDg5OTdfYmF0dGVyeV9wcm9wczsKLQljaGFyZ2VyLT5iYXR0ZXJ5Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShtYXg4OTk3X2JhdHRlcnlfcHJvcHMpOwogCiAJY2hhcmdlci0+ZGV2ID0gJnBkZXYtPmRldjsKIAljaGFyZ2VyLT5pb2RldiA9IGlvZGV2OwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjaGFyZ2VyLT5iYXR0ZXJ5KTsKLQlpZiAocmV0KSB7CisJcHN5X2NmZy5kcnZfZGF0YSA9IGNoYXJnZXI7CisKKwljaGFyZ2VyLT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCQkgJm1heDg5OTdfYmF0dGVyeV9kZXNjLAorCQkJCQkJICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGNoYXJnZXItPmJhdHRlcnkpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKLQkJcmV0dXJuIHJldDsKKwkJcmV0dXJuIFBUUl9FUlIoY2hhcmdlci0+YmF0dGVyeSk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xNjksNyArMTc2LDcgQEAKIHsKIAlzdHJ1Y3QgY2hhcmdlcl9kYXRhICpjaGFyZ2VyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmY2hhcmdlci0+YmF0dGVyeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoY2hhcmdlci0+YmF0dGVyeSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4ODk5OF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL21heDg5OThfY2hhcmdlci5jCmluZGV4IDA4Njk0YzcuLjQ3NDQ4ZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvbWF4ODk5OF9jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9tYXg4OTk4X2NoYXJnZXIuYwpAQCAtMzAsNyArMzAsNyBAQAogc3RydWN0IG1heDg5OThfYmF0dGVyeV9kYXRhIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IG1heDg5OThfZGV2ICppb2RldjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeTsKIH07CiAKIHN0YXRpYyBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBtYXg4OTk4X2JhdHRlcnlfcHJvcHNbXSA9IHsKQEAgLTQzLDggKzQzLDcgQEAKIAkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBtYXg4OTk4X2JhdHRlcnlfZGF0YSAqbWF4ODk5OCA9IGNvbnRhaW5lcl9vZihwc3ksCi0JCQlzdHJ1Y3QgbWF4ODk5OF9iYXR0ZXJ5X2RhdGEsIGJhdHRlcnkpOworCXN0cnVjdCBtYXg4OTk4X2JhdHRlcnlfZGF0YSAqbWF4ODk5OCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBtYXg4OTk4LT5pb2Rldi0+aTJjOwogCWludCByZXQ7CiAJdTggcmVnOwpAQCAtNzUsMTAgKzc0LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbWF4ODk5OF9iYXR0ZXJ5X2Rlc2MgPSB7CisJLm5hbWUJCT0gIm1heDg5OThfcG1pYyIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkuZ2V0X3Byb3BlcnR5CT0gbWF4ODk5OF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eSwKKwkucHJvcGVydGllcwk9IG1heDg5OThfYmF0dGVyeV9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDg5OThfYmF0dGVyeV9wcm9wcyksCit9OworCiBzdGF0aWMgaW50IG1heDg5OThfYmF0dGVyeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBtYXg4OTk4X2RldiAqaW9kZXYgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IG1heDg5OThfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGlvZGV2LT5kZXYpOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKIAlzdHJ1Y3QgbWF4ODk5OF9iYXR0ZXJ5X2RhdGEgKm1heDg5OTg7CiAJc3RydWN0IGkyY19jbGllbnQgKmkyYzsKIAlpbnQgcmV0ID0gMDsKQEAgLTE2MSwxNSArMTY5LDE1IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCW1heDg5OTgtPmJhdHRlcnkubmFtZSA9ICJtYXg4OTk4X3BtaWMiOwotCW1heDg5OTgtPmJhdHRlcnkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JbWF4ODk5OC0+YmF0dGVyeS5nZXRfcHJvcGVydHkgPSBtYXg4OTk4X2JhdHRlcnlfZ2V0X3Byb3BlcnR5OwotCW1heDg5OTgtPmJhdHRlcnkucHJvcGVydGllcyA9IG1heDg5OThfYmF0dGVyeV9wcm9wczsKLQltYXg4OTk4LT5iYXR0ZXJ5Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShtYXg4OTk4X2JhdHRlcnlfcHJvcHMpOworCXBzeV9jZmcuZHJ2X2RhdGEgPSBtYXg4OTk4OwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKG1heDg5OTgtPmRldiwgJm1heDg5OTgtPmJhdHRlcnkpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihtYXg4OTk4LT5kZXYsICJmYWlsZWQ6IHBvd2VyIHN1cHBseSByZWdpc3RlclxuIik7CisJbWF4ODk5OC0+YmF0dGVyeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihtYXg4OTk4LT5kZXYsCisJCQkJCQkgJm1heDg5OThfYmF0dGVyeV9kZXNjLAorCQkJCQkJICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKG1heDg5OTgtPmJhdHRlcnkpKSB7CisJCXJldCA9IFBUUl9FUlIobWF4ODk5OC0+YmF0dGVyeSk7CisJCWRldl9lcnIobWF4ODk5OC0+ZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXI6ICVkXG4iLAorCQkJcmV0KTsKIAkJZ290byBlcnI7CiAJfQogCkBAIC0xODIsNyArMTkwLDcgQEAKIHsKIAlzdHJ1Y3QgbWF4ODk5OF9iYXR0ZXJ5X2RhdGEgKm1heDg5OTggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZtYXg4OTk4LT5iYXR0ZXJ5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihtYXg4OTk4LT5iYXR0ZXJ5KTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9vbHBjX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvb2xwY19iYXR0ZXJ5LmMKaW5kZXggYWQ5Y2RlNy4uYTk0NDMzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9vbHBjX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL29scGNfYmF0dGVyeS5jCkBAIC04MSw3ICs4MSw3IEBACiAJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAogfTsKIAotc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgb2xwY19hYyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2Mgb2xwY19hY19kZXNjID0gewogCS5uYW1lID0gIm9scGMtYWMiLAogCS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCiAJLnByb3BlcnRpZXMgPSBvbHBjX2FjX3Byb3BzLApAQCAtODksNiArODksOCBAQAogCS5nZXRfcHJvcGVydHkgPSBvbHBjX2FjX2dldF9wcm9wLAogfTsKIAorc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgKm9scGNfYWM7CisKIHN0YXRpYyBjaGFyIGJhdF9zZXJpYWxbMTddOyAvKiBJY2sgKi8KIAogc3RhdGljIGludCBvbHBjX2JhdF9nZXRfc3RhdHVzKHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwsIHVpbnQ4X3QgZWNfYnl0ZSkKQEAgLTU3NCwyMSArNTc2LDIzIEBACiAgKgkJSW5pdGlhbGlzYXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5IG9scGNfYmF0ID0geworc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBvbHBjX2JhdF9kZXNjID0gewogCS5uYW1lID0gIm9scGMtYmF0dGVyeSIsCiAJLmdldF9wcm9wZXJ0eSA9IG9scGNfYmF0X2dldF9wcm9wZXJ0eSwKIAkudXNlX2Zvcl9hcG0gPSAxLAogfTsKIAorc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgKm9scGNfYmF0OworCiBzdGF0aWMgaW50IG9scGNfYmF0dGVyeV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCiAJCQkJcG1fbWVzc2FnZV90IHN0YXRlKQogewotCWlmIChkZXZpY2VfbWF5X3dha2V1cChvbHBjX2FjLmRldikpCisJaWYgKGRldmljZV9tYXlfd2FrZXVwKCZvbHBjX2FjLT5kZXYpKQogCQlvbHBjX2VjX3dha2V1cF9zZXQoRUNfU0NJX1NSQ19BQ1BXUik7CiAJZWxzZQogCQlvbHBjX2VjX3dha2V1cF9jbGVhcihFQ19TQ0lfU1JDX0FDUFdSKTsKIAotCWlmIChkZXZpY2VfbWF5X3dha2V1cChvbHBjX2JhdC5kZXYpKQorCWlmIChkZXZpY2VfbWF5X3dha2V1cCgmb2xwY19iYXQtPmRldikpCiAJCW9scGNfZWNfd2FrZXVwX3NldChFQ19TQ0lfU1JDX0JBVFRFUlkgfCBFQ19TQ0lfU1JDX0JBVFNPQwogCQkJCSAgIHwgRUNfU0NJX1NSQ19CQVRFUlIpOwogCWVsc2UKQEAgLTYxOSw1MiArNjIzLDU0IEBACiAKIAkvKiBJZ25vcmUgdGhlIHN0YXR1cy4gSXQgZG9lc24ndCBhY3R1YWxseSBtYXR0ZXIgKi8KIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmb2xwY19hYyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlvbHBjX2FjID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZvbHBjX2FjX2Rlc2MsIE5VTEwpOworCWlmIChJU19FUlIob2xwY19hYykpCisJCXJldHVybiBQVFJfRVJSKG9scGNfYWMpOwogCiAJaWYgKG9scGNfYm9hcmRfYXRfbGVhc3Qob2xwY19ib2FyZF9wcmUoMHhkMCkpKSB7IC8qIFhPLTEuNSAqLwotCQlvbHBjX2JhdC5wcm9wZXJ0aWVzID0gb2xwY194bzE1X2JhdF9wcm9wczsKLQkJb2xwY19iYXQubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKG9scGNfeG8xNV9iYXRfcHJvcHMpOworCQlvbHBjX2JhdF9kZXNjLnByb3BlcnRpZXMgPSBvbHBjX3hvMTVfYmF0X3Byb3BzOworCQlvbHBjX2JhdF9kZXNjLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShvbHBjX3hvMTVfYmF0X3Byb3BzKTsKIAl9IGVsc2UgeyAvKiBYTy0xICovCi0JCW9scGNfYmF0LnByb3BlcnRpZXMgPSBvbHBjX3hvMV9iYXRfcHJvcHM7Ci0JCW9scGNfYmF0Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShvbHBjX3hvMV9iYXRfcHJvcHMpOworCQlvbHBjX2JhdF9kZXNjLnByb3BlcnRpZXMgPSBvbHBjX3hvMV9iYXRfcHJvcHM7CisJCW9scGNfYmF0X2Rlc2MubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKG9scGNfeG8xX2JhdF9wcm9wcyk7CiAJfQogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZvbHBjX2JhdCk7Ci0JaWYgKHJldCkKKwlvbHBjX2JhdCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmb2xwY19iYXRfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUihvbHBjX2JhdCkpIHsKKwkJcmV0ID0gUFRSX0VSUihvbHBjX2JhdCk7CiAJCWdvdG8gYmF0dGVyeV9mYWlsZWQ7CisJfQogCi0JcmV0ID0gZGV2aWNlX2NyZWF0ZV9iaW5fZmlsZShvbHBjX2JhdC5kZXYsICZvbHBjX2JhdF9lZXByb20pOworCXJldCA9IGRldmljZV9jcmVhdGVfYmluX2ZpbGUoJm9scGNfYmF0LT5kZXYsICZvbHBjX2JhdF9lZXByb20pOwogCWlmIChyZXQpCiAJCWdvdG8gZWVwcm9tX2ZhaWxlZDsKIAotCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZShvbHBjX2JhdC5kZXYsICZvbHBjX2JhdF9lcnJvcik7CisJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZvbHBjX2JhdC0+ZGV2LCAmb2xwY19iYXRfZXJyb3IpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfZmFpbGVkOwogCiAJaWYgKG9scGNfZWNfd2FrZXVwX2F2YWlsYWJsZSgpKSB7Ci0JCWRldmljZV9zZXRfd2FrZXVwX2NhcGFibGUob2xwY19hYy5kZXYsIHRydWUpOwotCQlkZXZpY2Vfc2V0X3dha2V1cF9jYXBhYmxlKG9scGNfYmF0LmRldiwgdHJ1ZSk7CisJCWRldmljZV9zZXRfd2FrZXVwX2NhcGFibGUoJm9scGNfYWMtPmRldiwgdHJ1ZSk7CisJCWRldmljZV9zZXRfd2FrZXVwX2NhcGFibGUoJm9scGNfYmF0LT5kZXYsIHRydWUpOwogCX0KIAogCXJldHVybiAwOwogCiBlcnJvcl9mYWlsZWQ6Ci0JZGV2aWNlX3JlbW92ZV9iaW5fZmlsZShvbHBjX2JhdC5kZXYsICZvbHBjX2JhdF9lZXByb20pOworCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoJm9scGNfYmF0LT5kZXYsICZvbHBjX2JhdF9lZXByb20pOwogZWVwcm9tX2ZhaWxlZDoKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcigmb2xwY19iYXQpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKG9scGNfYmF0KTsKIGJhdHRlcnlfZmFpbGVkOgotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZvbHBjX2FjKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihvbHBjX2FjKTsKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG9scGNfYmF0dGVyeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUob2xwY19iYXQuZGV2LCAmb2xwY19iYXRfZXJyb3IpOwotCWRldmljZV9yZW1vdmVfYmluX2ZpbGUob2xwY19iYXQuZGV2LCAmb2xwY19iYXRfZWVwcm9tKTsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcigmb2xwY19iYXQpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZvbHBjX2FjKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJm9scGNfYmF0LT5kZXYsICZvbHBjX2JhdF9lcnJvcik7CisJZGV2aWNlX3JlbW92ZV9iaW5fZmlsZSgmb2xwY19iYXQtPmRldiwgJm9scGNfYmF0X2VlcHJvbSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIob2xwY19iYXQpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKG9scGNfYWMpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3BjZjUwNjMzLWNoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvcGNmNTA2MzMtY2hhcmdlci5jCmluZGV4IDc3MWM0ZjAuLmQwNTU5N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcGNmNTA2MzMtY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcGNmNTA2MzMtY2hhcmdlci5jCkBAIC0zMyw5ICszMyw5IEBACiAJaW50IGFkYXB0ZXJfb25saW5lOwogCWludCB1c2Jfb25saW5lOwogCi0Jc3RydWN0IHBvd2VyX3N1cHBseSB1c2I7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSBhZGFwdGVyOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgYWM7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqdXNiOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmFkYXB0ZXI7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYWM7CiB9OwogCiBpbnQgcGNmNTA2MzNfbWJjX3VzYl9jdXJsaW1fc2V0KHN0cnVjdCBwY2Y1MDYzMyAqcGNmLCBpbnQgbWEpCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkJCQlQQ0Y1MDYzM19NQkNDMV9DSEdFTkEsIFBDRjUwNjMzX01CQ0MxX0NIR0VOQSk7CiAJfQogCi0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJm1iYy0+dXNiKTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChtYmMtPnVzYik7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjc4LDkgKzI3OCw5IEBACiAJZWxzZSBpZiAoaXJxID09IFBDRjUwNjMzX0lSUV9BRFBSRU0pCiAJCW1iYy0+YWRhcHRlcl9vbmxpbmUgPSAwOwogCi0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJm1iYy0+YWMpOwotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZtYmMtPnVzYik7Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJm1iYy0+YWRhcHRlcik7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQobWJjLT5hYyk7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQobWJjLT51c2IpOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKG1iYy0+YWRhcHRlcik7CiAKIAlpZiAobWJjLT5wY2YtPnBkYXRhLT5tYmNfZXZlbnRfY2FsbGJhY2spCiAJCW1iYy0+cGNmLT5wZGF0YS0+bWJjX2V2ZW50X2NhbGxiYWNrKG1iYy0+cGNmLCBpcnEpOwpAQCAtMjkwLDggKzI5MCw3IEBACiAJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBwY2Y1MDYzM19tYmMgKm1iYyA9IGNvbnRhaW5lcl9vZihwc3ksCi0JCQkJc3RydWN0IHBjZjUwNjMzX21iYywgYWRhcHRlcik7CisJc3RydWN0IHBjZjUwNjMzX21iYyAqbWJjID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKHBzcCkgewpAQCAtMzA5LDcgKzMwOCw3IEBACiAJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBwY2Y1MDYzM19tYmMgKm1iYyA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBwY2Y1MDYzM19tYmMsIHVzYik7CisJc3RydWN0IHBjZjUwNjMzX21iYyAqbWJjID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJaW50IHJldCA9IDA7CiAJdTggdXNibGltID0gcGNmNTA2MzNfcmVnX3JlYWQobWJjLT5wY2YsIFBDRjUwNjMzX1JFR19NQkNDNykgJgogCQkJCQkJUENGNTA2MzNfTUJDQzdfVVNCX01BU0s7CkBAIC0zMzAsNyArMzI5LDcgQEAKIAkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IHBjZjUwNjMzX21iYyAqbWJjID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IHBjZjUwNjMzX21iYywgYWMpOworCXN0cnVjdCBwY2Y1MDYzM19tYmMgKm1iYyA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCWludCByZXQgPSAwOwogCXU4IHVzYmxpbSA9IHBjZjUwNjMzX3JlZ19yZWFkKG1iYy0+cGNmLCBQQ0Y1MDYzM19SRUdfTUJDQzcpICYKIAkJCQkJCVBDRjUwNjMzX01CQ0M3X1VTQl9NQVNLOwpAQCAtMzY2LDggKzM2NSwzMyBAQAogCVBDRjUwNjMzX0lSUV9MT1dCQVQsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHBjZjUwNjMzX21iY19hZGFwdGVyX2Rlc2MgPSB7CisJLm5hbWUJCT0gImFkYXB0ZXIiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TLAorCS5wcm9wZXJ0aWVzCT0gcG93ZXJfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShwb3dlcl9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9ICZhZGFwdGVyX2dldF9wcm9wZXJ0eSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgcGNmNTA2MzNfbWJjX3VzYl9kZXNjID0geworCS5uYW1lCQk9ICJ1c2IiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQiwKKwkucHJvcGVydGllcwk9IHBvd2VyX3Byb3BzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUocG93ZXJfcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJPSB1c2JfZ2V0X3Byb3BlcnR5LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBwY2Y1MDYzM19tYmNfYWNfZGVzYyA9IHsKKwkubmFtZQkJPSAiYWMiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TLAorCS5wcm9wZXJ0aWVzCT0gcG93ZXJfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShwb3dlcl9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IGFjX2dldF9wcm9wZXJ0eSwKK307CisKIHN0YXRpYyBpbnQgcGNmNTA2MzNfbWJjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCXN0cnVjdCBwY2Y1MDYzM19tYmMgKm1iYzsKIAlpbnQgcmV0OwogCWludCBpOwpAQCAtMzg1LDQ5ICs0MDksMzYgQEAKIAkJcGNmNTA2MzNfcmVnaXN0ZXJfaXJxKG1iYy0+cGNmLCBtYmNfaXJxX2hhbmRsZXJzW2ldLAogCQkJCQlwY2Y1MDYzM19tYmNfaXJxX2hhbmRsZXIsIG1iYyk7CiAKKwlwc3lfY2ZnLnN1cHBsaWVkX3RvCQk9IG1iYy0+cGNmLT5wZGF0YS0+YmF0dGVyaWVzOworCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzCQk9IG1iYy0+cGNmLT5wZGF0YS0+bnVtX2JhdHRlcmllczsKKwlwc3lfY2ZnLmRydl9kYXRhCQk9IG1iYzsKKwogCS8qIENyZWF0ZSBwb3dlciBzdXBwbGllcyAqLwotCW1iYy0+YWRhcHRlci5uYW1lCQk9ICJhZGFwdGVyIjsKLQltYmMtPmFkYXB0ZXIudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKLQltYmMtPmFkYXB0ZXIucHJvcGVydGllcwkJPSBwb3dlcl9wcm9wczsKLQltYmMtPmFkYXB0ZXIubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKHBvd2VyX3Byb3BzKTsKLQltYmMtPmFkYXB0ZXIuZ2V0X3Byb3BlcnR5CT0gJmFkYXB0ZXJfZ2V0X3Byb3BlcnR5OwotCW1iYy0+YWRhcHRlci5zdXBwbGllZF90bwk9IG1iYy0+cGNmLT5wZGF0YS0+YmF0dGVyaWVzOwotCW1iYy0+YWRhcHRlci5udW1fc3VwcGxpY2FudHMJPSBtYmMtPnBjZi0+cGRhdGEtPm51bV9iYXR0ZXJpZXM7Ci0KLQltYmMtPnVzYi5uYW1lCQkJPSAidXNiIjsKLQltYmMtPnVzYi50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7Ci0JbWJjLT51c2IucHJvcGVydGllcwkJPSBwb3dlcl9wcm9wczsKLQltYmMtPnVzYi5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKHBvd2VyX3Byb3BzKTsKLQltYmMtPnVzYi5nZXRfcHJvcGVydHkJCT0gdXNiX2dldF9wcm9wZXJ0eTsKLQltYmMtPnVzYi5zdXBwbGllZF90bwkJPSBtYmMtPnBjZi0+cGRhdGEtPmJhdHRlcmllczsKLQltYmMtPnVzYi5udW1fc3VwcGxpY2FudHMJPSBtYmMtPnBjZi0+cGRhdGEtPm51bV9iYXR0ZXJpZXM7Ci0KLQltYmMtPmFjLm5hbWUJCQk9ICJhYyI7Ci0JbWJjLT5hYy50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKLQltYmMtPmFjLnByb3BlcnRpZXMJCT0gcG93ZXJfcHJvcHM7Ci0JbWJjLT5hYy5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKHBvd2VyX3Byb3BzKTsKLQltYmMtPmFjLmdldF9wcm9wZXJ0eQkJPSBhY19nZXRfcHJvcGVydHk7Ci0JbWJjLT5hYy5zdXBwbGllZF90bwkJPSBtYmMtPnBjZi0+cGRhdGEtPmJhdHRlcmllczsKLQltYmMtPmFjLm51bV9zdXBwbGljYW50cwkJPSBtYmMtPnBjZi0+cGRhdGEtPm51bV9iYXR0ZXJpZXM7Ci0KLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJm1iYy0+YWRhcHRlcik7Ci0JaWYgKHJldCkgeworCW1iYy0+YWRhcHRlciA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAorCQkJCQkgICAgICZwY2Y1MDYzM19tYmNfYWRhcHRlcl9kZXNjLAorCQkJCQkgICAgICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKG1iYy0+YWRhcHRlcikpIHsKIAkJZGV2X2VycihtYmMtPnBjZi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGFkYXB0ZXJcbiIpOworCQlyZXQgPSBQVFJfRVJSKG1iYy0+YWRhcHRlcik7CiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZtYmMtPnVzYik7Ci0JaWYgKHJldCkgeworCW1iYy0+dXNiID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZwY2Y1MDYzM19tYmNfdXNiX2Rlc2MsCisJCQkJCSAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihtYmMtPnVzYikpIHsKIAkJZGV2X2VycihtYmMtPnBjZi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHVzYlxuIik7Ci0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZtYmMtPmFkYXB0ZXIpOworCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihtYmMtPmFkYXB0ZXIpOworCQlyZXQgPSBQVFJfRVJSKG1iYy0+dXNiKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJm1iYy0+YWMpOwotCWlmIChyZXQpIHsKKwltYmMtPmFjID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZwY2Y1MDYzM19tYmNfYWNfZGVzYywKKwkJCQkJJnBzeV9jZmcpOworCWlmIChJU19FUlIobWJjLT5hYykpIHsKIAkJZGV2X2VycihtYmMtPnBjZi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIGFjXG4iKTsKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJm1iYy0+YWRhcHRlcik7Ci0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZtYmMtPnVzYik7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKG1iYy0+YWRhcHRlcik7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKG1iYy0+dXNiKTsKKwkJcmV0ID0gUFRSX0VSUihtYmMtPmFjKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTQ1NCw5ICs0NjUsOSBAQAogCQlwY2Y1MDYzM19mcmVlX2lycShtYmMtPnBjZiwgbWJjX2lycV9oYW5kbGVyc1tpXSk7CiAKIAlzeXNmc19yZW1vdmVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmbWJjX2F0dHJfZ3JvdXApOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZtYmMtPnVzYik7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJm1iYy0+YWRhcHRlcik7Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJm1iYy0+YWMpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKG1iYy0+dXNiKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihtYmMtPmFkYXB0ZXIpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKG1iYy0+YWMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3BkYV9wb3dlci5jIGIvZHJpdmVycy9wb3dlci9wZGFfcG93ZXIuYwppbmRleCAwYzUyZTJhLi5kZmUxZWU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3BkYV9wb3dlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcGRhX3Bvd2VyLmMKQEAgLTM0LDYgKzM0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBzdXBwbHlfdGltZXI7CiBzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgcG9sbGluZ190aW1lcjsKIHN0YXRpYyBpbnQgcG9sbGluZzsKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwZGFfcHN5X2FjLCAqcGRhX3BzeV91c2I7CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfUEhZKQogc3RhdGljIHN0cnVjdCB1c2JfcGh5ICp0cmFuc2NlaXZlcjsKQEAgLTU4LDcgKzU5LDcgQEAKIHsKIAlzd2l0Y2ggKHBzcCkgewogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgotCQlpZiAocHN5LT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TKQorCQlpZiAocHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TKQogCQkJdmFsLT5pbnR2YWwgPSBwZGF0YS0+aXNfYWNfb25saW5lID8KIAkJCQkgICAgICBwZGF0YS0+aXNfYWNfb25saW5lKCkgOiAwOwogCQllbHNlCkBAIC04MCwyMSArODEsMTcgQEAKIAkiYmFja3VwLWJhdHRlcnkiLAogfTsKIAotc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgcGRhX3BzeV9hYyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgcGRhX3BzeV9hY19kZXNjID0gewogCS5uYW1lID0gImFjIiwKIAkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TLAotCS5zdXBwbGllZF90byA9IHBkYV9wb3dlcl9zdXBwbGllZF90bywKLQkubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShwZGFfcG93ZXJfc3VwcGxpZWRfdG8pLAogCS5wcm9wZXJ0aWVzID0gcGRhX3Bvd2VyX3Byb3BzLAogCS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUocGRhX3Bvd2VyX3Byb3BzKSwKIAkuZ2V0X3Byb3BlcnR5ID0gcGRhX3Bvd2VyX2dldF9wcm9wZXJ0eSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5IHBkYV9wc3lfdXNiID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBwZGFfcHN5X3VzYl9kZXNjID0gewogCS5uYW1lID0gInVzYiIsCiAJLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IsCi0JLnN1cHBsaWVkX3RvID0gcGRhX3Bvd2VyX3N1cHBsaWVkX3RvLAotCS5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKHBkYV9wb3dlcl9zdXBwbGllZF90byksCiAJLnByb3BlcnRpZXMgPSBwZGFfcG93ZXJfcHJvcHMsCiAJLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShwZGFfcG93ZXJfcHJvcHMpLAogCS5nZXRfcHJvcGVydHkgPSBwZGFfcG93ZXJfZ2V0X3Byb3BlcnR5LApAQCAtMTQ3LDEyICsxNDQsMTIgQEAKIHsKIAlpZiAoYWNfc3RhdHVzID09IFBEQV9QU1lfVE9fQ0hBTkdFKSB7CiAJCWFjX3N0YXR1cyA9IG5ld19hY19zdGF0dXM7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZwZGFfcHN5X2FjKTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQocGRhX3BzeV9hYyk7CiAJfQogCiAJaWYgKHVzYl9zdGF0dXMgPT0gUERBX1BTWV9UT19DSEFOR0UpIHsKIAkJdXNiX3N0YXR1cyA9IG5ld191c2Jfc3RhdHVzOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcGRhX3BzeV91c2IpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwZGFfcHN5X3VzYik7CiAJfQogfQogCkBAIC0xNzYsOSArMTczLDkgQEAKIAogc3RhdGljIGlycXJldHVybl90IHBvd2VyX2NoYW5nZWRfaXNyKGludCBpcnEsIHZvaWQgKnBvd2VyX3N1cHBseSkKIHsKLQlpZiAocG93ZXJfc3VwcGx5ID09ICZwZGFfcHN5X2FjKQorCWlmIChwb3dlcl9zdXBwbHkgPT0gcGRhX3BzeV9hYykKIAkJYWNfc3RhdHVzID0gUERBX1BTWV9UT19DSEFOR0U7Ci0JZWxzZSBpZiAocG93ZXJfc3VwcGx5ID09ICZwZGFfcHN5X3VzYikKKwllbHNlIGlmIChwb3dlcl9zdXBwbHkgPT0gcGRhX3BzeV91c2IpCiAJCXVzYl9zdGF0dXMgPSBQREFfUFNZX1RPX0NIQU5HRTsKIAllbHNlCiAJCXJldHVybiBJUlFfTk9ORTsKQEAgLTI2Miw2ICsyNTksNyBAQAogCiBzdGF0aWMgaW50IHBkYV9wb3dlcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKIAlpbnQgcmV0ID0gMDsKIAogCWRldiA9ICZwZGV2LT5kZXY7CkBAIC0zMDksMTAgKzMwNywxMSBAQAogCXVzYl9pcnEgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAidXNiIik7CiAKIAlpZiAocGRhdGEtPnN1cHBsaWVkX3RvKSB7Ci0JCXBkYV9wc3lfYWMuc3VwcGxpZWRfdG8gPSBwZGF0YS0+c3VwcGxpZWRfdG87Ci0JCXBkYV9wc3lfYWMubnVtX3N1cHBsaWNhbnRzID0gcGRhdGEtPm51bV9zdXBwbGljYW50czsKLQkJcGRhX3BzeV91c2Iuc3VwcGxpZWRfdG8gPSBwZGF0YS0+c3VwcGxpZWRfdG87Ci0JCXBkYV9wc3lfdXNiLm51bV9zdXBwbGljYW50cyA9IHBkYXRhLT5udW1fc3VwcGxpY2FudHM7CisJCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBwZGF0YS0+c3VwcGxpZWRfdG87CisJCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzID0gcGRhdGEtPm51bV9zdXBwbGljYW50czsKKwl9IGVsc2UgeworCQlwc3lfY2ZnLnN1cHBsaWVkX3RvID0gcGRhX3Bvd2VyX3N1cHBsaWVkX3RvOworCQlwc3lfY2ZnLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJWkUocGRhX3Bvd2VyX3N1cHBsaWVkX3RvKTsKIAl9CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfUEhZKQpAQCAtMzI2LDE3ICszMjUsMTkgQEAKICNlbmRpZgogCiAJaWYgKHBkYXRhLT5pc19hY19vbmxpbmUpIHsKLQkJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZwZGFfcHN5X2FjKTsKLQkJaWYgKHJldCkgeworCQlwZGFfcHN5X2FjID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCQkgICAmcGRhX3BzeV9hY19kZXNjLCAmcHN5X2NmZyk7CisJCWlmIChJU19FUlIocGRhX3BzeV9hYykpIHsKIAkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyICVzIHBvd2VyIHN1cHBseVxuIiwKLQkJCQlwZGFfcHN5X2FjLm5hbWUpOworCQkJCXBkYV9wc3lfYWNfZGVzYy5uYW1lKTsKKwkJCXJldCA9IFBUUl9FUlIocGRhX3BzeV9hYyk7CiAJCQlnb3RvIGFjX3N1cHBseV9mYWlsZWQ7CiAJCX0KIAogCQlpZiAoYWNfaXJxKSB7CiAJCQlyZXQgPSByZXF1ZXN0X2lycShhY19pcnEtPnN0YXJ0LCBwb3dlcl9jaGFuZ2VkX2lzciwKIAkJCQkJICBnZXRfaXJxX2ZsYWdzKGFjX2lycSksIGFjX2lycS0+bmFtZSwKLQkJCQkJICAmcGRhX3BzeV9hYyk7CisJCQkJCSAgcGRhX3BzeV9hYyk7CiAJCQlpZiAocmV0KSB7CiAJCQkJZGV2X2VycihkZXYsICJyZXF1ZXN0IGFjIGlycSBmYWlsZWRcbiIpOwogCQkJCWdvdG8gYWNfaXJxX2ZhaWxlZDsKQEAgLTM0NywxNyArMzQ4LDIwIEBACiAJfQogCiAJaWYgKHBkYXRhLT5pc191c2Jfb25saW5lKSB7Ci0JCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmcGRhX3BzeV91c2IpOwotCQlpZiAocmV0KSB7CisJCXBkYV9wc3lfdXNiID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsCisJCQkJCQkgICAgJnBkYV9wc3lfdXNiX2Rlc2MsCisJCQkJCQkgICAgJnBzeV9jZmcpOworCQlpZiAoSVNfRVJSKHBkYV9wc3lfdXNiKSkgewogCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgJXMgcG93ZXIgc3VwcGx5XG4iLAotCQkJCXBkYV9wc3lfdXNiLm5hbWUpOworCQkJCXBkYV9wc3lfdXNiX2Rlc2MubmFtZSk7CisJCQlyZXQgPSBQVFJfRVJSKHBkYV9wc3lfdXNiKTsKIAkJCWdvdG8gdXNiX3N1cHBseV9mYWlsZWQ7CiAJCX0KIAogCQlpZiAodXNiX2lycSkgewogCQkJcmV0ID0gcmVxdWVzdF9pcnEodXNiX2lycS0+c3RhcnQsIHBvd2VyX2NoYW5nZWRfaXNyLAogCQkJCQkgIGdldF9pcnFfZmxhZ3ModXNiX2lycSksCi0JCQkJCSAgdXNiX2lycS0+bmFtZSwgJnBkYV9wc3lfdXNiKTsKKwkJCQkJICB1c2JfaXJxLT5uYW1lLCBwZGFfcHN5X3VzYik7CiAJCQlpZiAocmV0KSB7CiAJCQkJZGV2X2VycihkZXYsICJyZXF1ZXN0IHVzYiBpcnEgZmFpbGVkXG4iKTsKIAkJCQlnb3RvIHVzYl9pcnFfZmFpbGVkOwpAQCAtMzk0LDIxICszOTgsMjEgQEAKICNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfUEhZKQogb3RnX3JlZ19ub3RpZmllcl9mYWlsZWQ6CiAJaWYgKHBkYXRhLT5pc191c2Jfb25saW5lICYmIHVzYl9pcnEpCi0JCWZyZWVfaXJxKHVzYl9pcnEtPnN0YXJ0LCAmcGRhX3BzeV91c2IpOworCQlmcmVlX2lycSh1c2JfaXJxLT5zdGFydCwgcGRhX3BzeV91c2IpOwogI2VuZGlmCiB1c2JfaXJxX2ZhaWxlZDoKIAlpZiAocGRhdGEtPmlzX3VzYl9vbmxpbmUpCi0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZwZGFfcHN5X3VzYik7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBkYV9wc3lfdXNiKTsKIHVzYl9zdXBwbHlfZmFpbGVkOgogCWlmIChwZGF0YS0+aXNfYWNfb25saW5lICYmIGFjX2lycSkKLQkJZnJlZV9pcnEoYWNfaXJxLT5zdGFydCwgJnBkYV9wc3lfYWMpOworCQlmcmVlX2lycShhY19pcnEtPnN0YXJ0LCBwZGFfcHN5X2FjKTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfUEhZKQogCWlmICghSVNfRVJSX09SX05VTEwodHJhbnNjZWl2ZXIpKQogCQl1c2JfcHV0X3BoeSh0cmFuc2NlaXZlcik7CiAjZW5kaWYKIGFjX2lycV9mYWlsZWQ6CiAJaWYgKHBkYXRhLT5pc19hY19vbmxpbmUpCi0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZwZGFfcHN5X2FjKTsKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocGRhX3BzeV9hYyk7CiBhY19zdXBwbHlfZmFpbGVkOgogCWlmIChhY19kcmF3KSB7CiAJCXJlZ3VsYXRvcl9wdXQoYWNfZHJhdyk7CkBAIC00MjQsOSArNDI4LDkgQEAKIHN0YXRpYyBpbnQgcGRhX3Bvd2VyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCWlmIChwZGF0YS0+aXNfdXNiX29ubGluZSAmJiB1c2JfaXJxKQotCQlmcmVlX2lycSh1c2JfaXJxLT5zdGFydCwgJnBkYV9wc3lfdXNiKTsKKwkJZnJlZV9pcnEodXNiX2lycS0+c3RhcnQsIHBkYV9wc3lfdXNiKTsKIAlpZiAocGRhdGEtPmlzX2FjX29ubGluZSAmJiBhY19pcnEpCi0JCWZyZWVfaXJxKGFjX2lycS0+c3RhcnQsICZwZGFfcHN5X2FjKTsKKwkJZnJlZV9pcnEoYWNfaXJxLT5zdGFydCwgcGRhX3BzeV9hYyk7CiAKIAlpZiAocG9sbGluZykKIAkJZGVsX3RpbWVyX3N5bmMoJnBvbGxpbmdfdGltZXIpOwpAQCAtNDM0LDkgKzQzOCw5IEBACiAJZGVsX3RpbWVyX3N5bmMoJnN1cHBseV90aW1lcik7CiAKIAlpZiAocGRhdGEtPmlzX3VzYl9vbmxpbmUpCi0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZwZGFfcHN5X3VzYik7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBkYV9wc3lfdXNiKTsKIAlpZiAocGRhdGEtPmlzX2FjX29ubGluZSkKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnBkYV9wc3lfYWMpOworCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihwZGFfcHN5X2FjKTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19VU0JfUEhZKQogCWlmICghSVNfRVJSX09SX05VTEwodHJhbnNjZWl2ZXIpKQogCQl1c2JfcHV0X3BoeSh0cmFuc2NlaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3BtMjMwMV9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3BtMjMwMV9jaGFyZ2VyLmMKaW5kZXggNzc3MzI0OS4uY2MwODkzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9wbTIzMDFfY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcG0yMzAxX2NoYXJnZXIuYwpAQCAtMjE2LDcgKzIxNiw3IEBACiB7CiAJZGV2X2VycihwbTItPmRldiwgIk92ZXJ2b2x0YWdlIGRldGVjdGVkXG4iKTsKIAlwbTItPmZsYWdzLm92diA9IHRydWU7Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJnBtMi0+YWNfY2hnLnBzeSk7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKIAogCS8qIFNjaGVkdWxlIGEgbmV3IEhXIGZhaWx1cmUgY2hlY2sgKi8KIAlxdWV1ZV9kZWxheWVkX3dvcmsocG0yLT5jaGFyZ2VyX3dxLCAmcG0yLT5jaGVja19od19mYWlsdXJlX3dvcmssIDApOwpAQCAtMjI5LDcgKzIyOSw3IEBACiAJZGV2X2RiZyhwbTItPmRldiAsICIyMCBtaW51dGVzIHdhdGNoZG9nIGV4cGlyZWRcbiIpOwogCiAJcG0yLT5hYy53ZF9leHBpcmVkID0gdHJ1ZTsKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcG0yLT5hY19jaGcucHN5KTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NzMsNyArNTczLDcgQEAKIAlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIgKnBtMjsKIAl1OCB2YWw7CiAKLQlpZiAoY2hhcmdlci0+cHN5LnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMpCisJaWYgKGNoYXJnZXItPnBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUykKIAkJcG0yID0gdG9fcG0yeHh4X2NoYXJnZXJfYWNfZGV2aWNlX2luZm8oY2hhcmdlcik7CiAJZWxzZQogCQlyZXR1cm4gLUVOWElPOwpAQCAtODE2LDcgKzgxNiw3IEBACiAKIAkJZGV2X2RiZyhwbTItPmRldiwgIlBNMjMwMTogIiAiRGlzYWJsZWQgQUMgY2hhcmdpbmdcbiIpOwogCX0KLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcG0yLT5hY19jaGcucHN5KTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOwogCiBlcnJvcl9vY2N1cmVkOgogCXJldHVybiByZXQ7CkBAIC04MjcsNyArODI3LDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yOwogCi0JaWYgKGNoYXJnZXItPnBzeS50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TKQorCWlmIChjaGFyZ2VyLT5wc3ktPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMpCiAJCXBtMiA9IHRvX3BtMnh4eF9jaGFyZ2VyX2FjX2RldmljZV9pbmZvKGNoYXJnZXIpOwogCWVsc2UKIAkJcmV0dXJuIC1FTlhJTzsKQEAgLTg0NSw4ICs4NDUsOCBAQAogCQlzdHJ1Y3QgcG0yeHh4X2NoYXJnZXIsIGFjX3dvcmspOwogCiAKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcG0yLT5hY19jaGcucHN5KTsKLQlzeXNmc19ub3RpZnkoJnBtMi0+YWNfY2hnLnBzeS5kZXYtPmtvYmosIE5VTEwsICJwcmVzZW50Iik7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKKwlzeXNmc19ub3RpZnkoJnBtMi0+YWNfY2hnLnBzeS0+ZGV2LmtvYmosIE5VTEwsICJwcmVzZW50Iik7CiB9OwogCiBzdGF0aWMgdm9pZCBwbTJ4eHhfY2hhcmdlcl9jaGVja19od19mYWlsdXJlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtODYyLDcgKzg2Miw3IEBACiAJCWlmICghKHJlZ192YWx1ZSAmIChQTTJYWFhfSU5UNF9TX0lUVlBXUjFPVlYgfAogCQkJCQlQTTJYWFhfSU5UNF9TX0lUVlBXUjJPVlYpKSkgewogCQkJcG0yLT5mbGFncy5vdnYgPSBmYWxzZTsKLQkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZwbTItPmFjX2NoZy5wc3kpOworCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQocG0yLT5hY19jaGcucHN5KTsKIAkJfQogCX0KIApAQCAtODk1LDcgKzg5NSw3IEBACiAJCQkJfCBQTTJYWFhfSU5UNV9TX0lUVEhFUk1BTFNIVVRET1dORkFMTCkpCiAJCXBtMi0+ZmxhZ3MubWFpbl90aGVybWFsX3Byb3QgPSBmYWxzZTsKIAotCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZwbTItPmFjX2NoZy5wc3kpOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBtMi0+YWNfY2hnLnBzeSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcG0yeHh4X2ludGVycnVwdHMgcG0yeHh4X2ludCA9IHsKQEAgLTk4OSw2ICs5ODksNyBAQAogCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHBtMnh4eF9wbGF0Zm9ybV9kYXRhICpwbF9kYXRhID0gaTJjX2NsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCXN0cnVjdCBwbTJ4eHhfY2hhcmdlciAqcG0yOwogCWludCByZXQgPSAwOwogCXU4IHZhbDsKQEAgLTEwNDIsMTMgKzEwNDMsMTQgQEAKIAogCS8qIEFDIHN1cHBseSAqLwogCS8qIHBvd2VyX3N1cHBseSBiYXNlIGNsYXNzICovCi0JcG0yLT5hY19jaGcucHN5Lm5hbWUgPSBwbTItPnBkYXRhLT5sYWJlbDsKLQlwbTItPmFjX2NoZy5wc3kudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOwotCXBtMi0+YWNfY2hnLnBzeS5wcm9wZXJ0aWVzID0gcG0yeHh4X2NoYXJnZXJfYWNfcHJvcHM7Ci0JcG0yLT5hY19jaGcucHN5Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShwbTJ4eHhfY2hhcmdlcl9hY19wcm9wcyk7Ci0JcG0yLT5hY19jaGcucHN5LmdldF9wcm9wZXJ0eSA9IHBtMnh4eF9jaGFyZ2VyX2FjX2dldF9wcm9wZXJ0eTsKLQlwbTItPmFjX2NoZy5wc3kuc3VwcGxpZWRfdG8gPSBwbTItPnBkYXRhLT5zdXBwbGllZF90bzsKLQlwbTItPmFjX2NoZy5wc3kubnVtX3N1cHBsaWNhbnRzID0gcG0yLT5wZGF0YS0+bnVtX3N1cHBsaWNhbnRzOworCXBtMi0+YWNfY2hnX2Rlc2MubmFtZSA9IHBtMi0+cGRhdGEtPmxhYmVsOworCXBtMi0+YWNfY2hnX2Rlc2MudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOworCXBtMi0+YWNfY2hnX2Rlc2MucHJvcGVydGllcyA9IHBtMnh4eF9jaGFyZ2VyX2FjX3Byb3BzOworCXBtMi0+YWNfY2hnX2Rlc2MubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHBtMnh4eF9jaGFyZ2VyX2FjX3Byb3BzKTsKKwlwbTItPmFjX2NoZ19kZXNjLmdldF9wcm9wZXJ0eSA9IHBtMnh4eF9jaGFyZ2VyX2FjX2dldF9wcm9wZXJ0eTsKKworCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBwbTItPnBkYXRhLT5zdXBwbGllZF90bzsKKwlwc3lfY2ZnLm51bV9zdXBwbGljYW50cyA9IHBtMi0+cGRhdGEtPm51bV9zdXBwbGljYW50czsKIAkvKiBwbTJ4eHhfY2hhcmdlciBzdWItY2xhc3MgKi8KIAlwbTItPmFjX2NoZy5vcHMuZW5hYmxlID0gJnBtMnh4eF9jaGFyZ2VyX2FjX2VuOwogCXBtMi0+YWNfY2hnLm9wcy5raWNrX3dkID0gJnBtMnh4eF9jaGFyZ2VyX3dhdGNoZG9nX2tpY2s7CkBAIC0xMDkzLDkgKzEwOTUsMTEgQEAKIAl9CiAKIAkvKiBSZWdpc3RlciBBQyBjaGFyZ2VyIGNsYXNzICovCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKHBtMi0+ZGV2LCAmcG0yLT5hY19jaGcucHN5KTsKLQlpZiAocmV0KSB7CisJcG0yLT5hY19jaGcucHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKHBtMi0+ZGV2LCAmcG0yLT5hY19jaGdfZGVzYywKKwkJCQkJCSZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKHBtMi0+YWNfY2hnLnBzeSkpIHsKIAkJZGV2X2VycihwbTItPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBBQyBjaGFyZ2VyXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihwbTItPmFjX2NoZy5wc3kpOwogCQlnb3RvIGZyZWVfcmVndWxhdG9yOwogCX0KIApAQCAtMTE2Nyw4ICsxMTcxLDggQEAKIAkJYWI4NTAwX292ZXJyaWRlX3R1cm5fb25fc3RhdCh+QUI4NTAwX1BPV19LRVlfMV9PTiwKIAkJCQkJICAgICBBQjg1MDBfTUFJTl9DSF9ERVQpOwogCQlwbTItPmFjX2Nvbm4gPSB0cnVlOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcG0yLT5hY19jaGcucHN5KTsKLQkJc3lzZnNfbm90aWZ5KCZwbTItPmFjX2NoZy5wc3kuZGV2LT5rb2JqLCBOVUxMLCAicHJlc2VudCIpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwbTItPmFjX2NoZy5wc3kpOworCQlzeXNmc19ub3RpZnkoJnBtMi0+YWNfY2hnLnBzeS0+ZGV2LmtvYmosIE5VTEwsICJwcmVzZW50Iik7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMTgzLDcgKzExODcsNyBAQAogCWZyZWVfaXJxKGdwaW9fdG9faXJxKHBtMi0+cGRhdGEtPmdwaW9faXJxX251bWJlciksIHBtMik7CiB1bnJlZ2lzdGVyX3BtMnh4eF9jaGFyZ2VyOgogCS8qIHVucmVnaXN0ZXIgcG93ZXIgc3VwcGx5ICovCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnBtMi0+YWNfY2hnLnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocG0yLT5hY19jaGcucHN5KTsKIGZyZWVfcmVndWxhdG9yOgogCS8qIGRpc2FibGUgdGhlIHJlZ3VsYXRvciAqLwogCXJlZ3VsYXRvcl9wdXQocG0yLT5yZWd1KTsKQEAgLTEyMTgsNyArMTIyMiw3IEBACiAJLyogZGlzYWJsZSB0aGUgcmVndWxhdG9yICovCiAJcmVndWxhdG9yX3B1dChwbTItPnJlZ3UpOwogCi0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnBtMi0+YWNfY2hnLnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocG0yLT5hY19jaGcucHN5KTsKIAogCWlmIChncGlvX2lzX3ZhbGlkKHBtMi0+bHBuX3BpbikpCiAJCWdwaW9fZnJlZShwbTItPmxwbl9waW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wbTIzMDFfY2hhcmdlci5oIGIvZHJpdmVycy9wb3dlci9wbTIzMDFfY2hhcmdlci5oCmluZGV4IDhjZTNjYzAuLjI0MTgxY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcG0yMzAxX2NoYXJnZXIuaAorKysgYi9kcml2ZXJzL3Bvd2VyL3BtMjMwMV9jaGFyZ2VyLmgKQEAgLTQ4Niw2ICs0ODYsNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCBjaGVja19tYWluX3RoZXJtYWxfcHJvdF93b3JrOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgY2hlY2tfaHdfZmFpbHVyZV93b3JrOwogCXN0cnVjdCB1eDUwMF9jaGFyZ2VyIGFjX2NoZzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYWNfY2hnX2Rlc2M7CiAJc3RydWN0IHBtMnh4eF9jaGFyZ2VyX2V2ZW50X2ZsYWdzIGZsYWdzOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wbXVfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci9wbXVfYmF0dGVyeS5jCmluZGV4IDAyM2QyNDk5Li45YzhkNTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3BtdV9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9wbXVfYmF0dGVyeS5jCkBAIC0xNywxMyArMTcsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcG11X2JhdHRlcnlfZGV2IHsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXQ7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGJhdF9kZXNjOwogCXN0cnVjdCBwbXVfYmF0dGVyeV9pbmZvICpwYmk7CiAJY2hhciBuYW1lWzE2XTsKIAlpbnQgcHJvcHZhbDsKIH0gKnBiYXRzW1BNVV9NQVhfQkFUVEVSSUVTXTsKIAotI2RlZmluZSB0b19wbXVfYmF0dGVyeV9kZXYoeCkgY29udGFpbmVyX29mKHgsIHN0cnVjdCBwbXVfYmF0dGVyeV9kZXYsIGJhdCkKKyNkZWZpbmUgdG9fcG11X2JhdHRlcnlfZGV2KHgpIHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YSh4KQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJUG93ZXIKQEAgLTQ5LDcgKzUwLDcgQEAKIAlQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBvd2VyX3N1cHBseSBwbXVfYWMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHBtdV9hY19kZXNjID0gewogCS5uYW1lID0gInBtdS1hYyIsCiAJLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUywKIAkucHJvcGVydGllcyA9IHBtdV9hY19wcm9wcywKQEAgLTU3LDYgKzU4LDggQEAKIAkuZ2V0X3Byb3BlcnR5ID0gcG11X2dldF9hY19wcm9wLAogfTsKIAorc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBtdV9hYzsKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCUJhdHRlcnkgcHJvcGVydGllcwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE0Miw3ICsxNDUsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwbXVfYmF0X2luaXQodm9pZCkKIHsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCWludCBpOwogCiAJYmF0X3BkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJwbXUtYmF0dGVyeSIsCkBAIC0xNTIsMjUgKzE1NSwzMiBAQAogCQlnb3RvIHBkZXZfcmVnaXN0ZXJfZmFpbGVkOwogCX0KIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmYmF0X3BkZXYtPmRldiwgJnBtdV9hYyk7Ci0JaWYgKHJldCkKKwlwbXVfYWMgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmJhdF9wZGV2LT5kZXYsICZwbXVfYWNfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUihwbXVfYWMpKSB7CisJCXJldCA9IFBUUl9FUlIocG11X2FjKTsKIAkJZ290byBhY19yZWdpc3Rlcl9mYWlsZWQ7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IHBtdV9iYXR0ZXJ5X2NvdW50OyBpKyspIHsKKwkJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCQlzdHJ1Y3QgcG11X2JhdHRlcnlfZGV2ICpwYmF0ID0ga3phbGxvYyhzaXplb2YoKnBiYXQpLAogCQkJCQkJICAgICAgIEdGUF9LRVJORUwpOwogCQlpZiAoIXBiYXQpCiAJCQlicmVhazsKIAogCQlzcHJpbnRmKHBiYXQtPm5hbWUsICJQTVVfYmF0dGVyeV8lZCIsIGkpOwotCQlwYmF0LT5iYXQubmFtZSA9IHBiYXQtPm5hbWU7Ci0JCXBiYXQtPmJhdC5wcm9wZXJ0aWVzID0gcG11X2JhdF9wcm9wczsKLQkJcGJhdC0+YmF0Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShwbXVfYmF0X3Byb3BzKTsKLQkJcGJhdC0+YmF0LmdldF9wcm9wZXJ0eSA9IHBtdV9iYXRfZ2V0X3Byb3BlcnR5OworCQlwYmF0LT5iYXRfZGVzYy5uYW1lID0gcGJhdC0+bmFtZTsKKwkJcGJhdC0+YmF0X2Rlc2MucHJvcGVydGllcyA9IHBtdV9iYXRfcHJvcHM7CisJCXBiYXQtPmJhdF9kZXNjLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShwbXVfYmF0X3Byb3BzKTsKKwkJcGJhdC0+YmF0X2Rlc2MuZ2V0X3Byb3BlcnR5ID0gcG11X2JhdF9nZXRfcHJvcGVydHk7CiAJCXBiYXQtPnBiaSA9ICZwbXVfYmF0dGVyaWVzW2ldOworCQlwc3lfY2ZnLmRydl9kYXRhID0gcGJhdDsKIAotCQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmJhdF9wZGV2LT5kZXYsICZwYmF0LT5iYXQpOwotCQlpZiAocmV0KSB7CisJCXBiYXQtPmJhdCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmYmF0X3BkZXYtPmRldiwKKwkJCQkJCSAgJnBiYXQtPmJhdF9kZXNjLAorCQkJCQkJICAmcHN5X2NmZyk7CisJCWlmIChJU19FUlIocGJhdC0+YmF0KSkgeworCQkJcmV0ID0gUFRSX0VSUihwYmF0LT5iYXQpOwogCQkJa2ZyZWUocGJhdCk7CiAJCQlnb3RvIGJhdHRlcnlfcmVnaXN0ZXJfZmFpbGVkOwogCQl9CkBAIC0xODMsMTAgKzE5MywxMCBAQAogCXdoaWxlIChpLS0pIHsKIAkJaWYgKCFwYmF0c1tpXSkKIAkJCWNvbnRpbnVlOwotCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmcGJhdHNbaV0tPmJhdCk7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBiYXRzW2ldLT5iYXQpOwogCQlrZnJlZShwYmF0c1tpXSk7CiAJfQotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZwbXVfYWMpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBtdV9hYyk7CiBhY19yZWdpc3Rlcl9mYWlsZWQ6CiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoYmF0X3BkZXYpOwogcGRldl9yZWdpc3Rlcl9mYWlsZWQ6CkBAIC0yMDEsMTAgKzIxMSwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCBQTVVfTUFYX0JBVFRFUklFUzsgaSsrKSB7CiAJCWlmICghcGJhdHNbaV0pCiAJCQljb250aW51ZTsKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnBiYXRzW2ldLT5iYXQpOworCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihwYmF0c1tpXS0+YmF0KTsKIAkJa2ZyZWUocGJhdHNbaV0pOwogCX0KLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmcG11X2FjKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihwbXVfYWMpOwogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGJhdF9wZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfY29yZS5jIGIvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfY29yZS5jCmluZGV4IDY5NGU4Y2QuLjJlZDRhNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X2NvcmUuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9jb3JlLmMKQEAgLTQwLDE2ICs0MCwxNiBAQAogCiAJLyogU3VwcG9ydCBib3RoIHN1cHBsaWVkX3RvIGFuZCBzdXBwbGllZF9mcm9tIG1vZGVzICovCiAJaWYgKHN1cHBseS0+c3VwcGxpZWRfZnJvbSkgewotCQlpZiAoIXN1cHBsaWVyLT5uYW1lKQorCQlpZiAoIXN1cHBsaWVyLT5kZXNjLT5uYW1lKQogCQkJcmV0dXJuIGZhbHNlOwogCQlmb3IgKGkgPSAwOyBpIDwgc3VwcGx5LT5udW1fc3VwcGxpZXM7IGkrKykKLQkJCWlmICghc3RyY21wKHN1cHBsaWVyLT5uYW1lLCBzdXBwbHktPnN1cHBsaWVkX2Zyb21baV0pKQorCQkJaWYgKCFzdHJjbXAoc3VwcGxpZXItPmRlc2MtPm5hbWUsIHN1cHBseS0+c3VwcGxpZWRfZnJvbVtpXSkpCiAJCQkJcmV0dXJuIHRydWU7CiAJfSBlbHNlIHsKLQkJaWYgKCFzdXBwbHktPm5hbWUpCisJCWlmICghc3VwcGx5LT5kZXNjLT5uYW1lKQogCQkJcmV0dXJuIGZhbHNlOwogCQlmb3IgKGkgPSAwOyBpIDwgc3VwcGxpZXItPm51bV9zdXBwbGljYW50czsgaSsrKQotCQkJaWYgKCFzdHJjbXAoc3VwcGxpZXItPnN1cHBsaWVkX3RvW2ldLCBzdXBwbHktPm5hbWUpKQorCQkJaWYgKCFzdHJjbXAoc3VwcGxpZXItPnN1cHBsaWVkX3RvW2ldLCBzdXBwbHktPmRlc2MtPm5hbWUpKQogCQkJCXJldHVybiB0cnVlOwogCX0KIApAQCAtNjIsOCArNjIsOCBAQAogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaWYgKF9fcG93ZXJfc3VwcGx5X2lzX3N1cHBsaWVkX2J5KHBzeSwgcHN0KSkgewotCQlpZiAocHN0LT5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKQotCQkJcHN0LT5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHBzdCk7CisJCWlmIChwc3QtPmRlc2MtPmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQpCisJCQlwc3QtPmRlc2MtPmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQocHN0KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTc1LDcgKzc1LDcgQEAKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHBvd2VyX3N1cHBseSwKIAkJCQkJCWNoYW5nZWRfd29yayk7CiAKLQlkZXZfZGJnKHBzeS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwc3ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHN5LT5jaGFuZ2VkX2xvY2ssIGZsYWdzKTsKIAkvKgpAQCAtOTMsNyArOTMsNyBAQAogCQlwb3dlcl9zdXBwbHlfdXBkYXRlX2xlZHMocHN5KTsKIAkJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJnBvd2VyX3N1cHBseV9ub3RpZmllciwKIAkJCQlQU1lfRVZFTlRfUFJPUF9DSEFOR0VELCBwc3kpOwotCQlrb2JqZWN0X3VldmVudCgmcHN5LT5kZXYtPmtvYmosIEtPQkpfQ0hBTkdFKTsKKwkJa29iamVjdF91ZXZlbnQoJnBzeS0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnBzeS0+Y2hhbmdlZF9sb2NrLCBmbGFncyk7CiAJfQogCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkgKiB0byB0cnVlLgogCSAqLwogCWlmIChsaWtlbHkoIXBzeS0+Y2hhbmdlZCkpCi0JCXBtX3JlbGF4KHBzeS0+ZGV2KTsKKwkJcG1fcmVsYXgoJnBzeS0+ZGV2KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwc3ktPmNoYW5nZWRfbG9jaywgZmxhZ3MpOwogfQogCkBAIC0xMTEsMTEgKzExMSwxMSBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkZXZfZGJnKHBzeS0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKCZwc3ktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHN5LT5jaGFuZ2VkX2xvY2ssIGZsYWdzKTsKIAlwc3ktPmNoYW5nZWQgPSB0cnVlOwotCXBtX3N0YXlfYXdha2UocHN5LT5kZXYpOworCXBtX3N0YXlfYXdha2UoJnBzeS0+ZGV2KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwc3ktPmNoYW5nZWRfbG9jaywgZmxhZ3MpOwogCXNjaGVkdWxlX3dvcmsoJnBzeS0+Y2hhbmdlZF93b3JrKTsKIH0KQEAgLTEzOCw5ICsxMzgsOSBAQAogCQkJYnJlYWs7CiAKIAkJaWYgKG5wID09IGVwc3ktPm9mX25vZGUpIHsKLQkJCWRldl9pbmZvKHBzeS0+ZGV2LCAiJXM6IEZvdW5kIHN1cHBseSA6ICVzXG4iLAotCQkJCXBzeS0+bmFtZSwgZXBzeS0+bmFtZSk7Ci0JCQlwc3ktPnN1cHBsaWVkX2Zyb21baS0xXSA9IChjaGFyICopZXBzeS0+bmFtZTsKKwkJCWRldl9pbmZvKCZwc3ktPmRldiwgIiVzOiBGb3VuZCBzdXBwbHkgOiAlc1xuIiwKKwkJCQlwc3ktPmRlc2MtPm5hbWUsIGVwc3ktPmRlc2MtPm5hbWUpOworCQkJcHN5LT5zdXBwbGllZF9mcm9tW2ktMV0gPSAoY2hhciAqKWVwc3ktPmRlc2MtPm5hbWU7CiAJCQlwc3ktPm51bV9zdXBwbGllcysrOwogCQkJb2Zfbm9kZV9wdXQobnApOwogCQkJYnJlYWs7CkBAIC0xNTgsNyArMTU4LDcgQEAKIAllcnJvciA9IGNsYXNzX2Zvcl9lYWNoX2RldmljZShwb3dlcl9zdXBwbHlfY2xhc3MsIE5VTEwsIHBzeSwKIAkJCQkgICAgICBfX3Bvd2VyX3N1cHBseV9wb3B1bGF0ZV9zdXBwbGllZF9mcm9tKTsKIAotCWRldl9kYmcocHN5LT5kZXYsICIlcyAlZFxuIiwgX19mdW5jX18sIGVycm9yKTsKKwlkZXZfZGJnKCZwc3ktPmRldiwgIiVzICVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMjIwLDcgKzIyMCw3IEBACiAJCW9mX25vZGVfcHV0KG5wKTsKIAogCQlpZiAocmV0KSB7Ci0JCQlkZXZfZGJnKHBzeS0+ZGV2LCAiRmFpbGVkIHRvIGZpbmQgc3VwcGx5IVxuIik7CisJCQlkZXZfZGJnKCZwc3ktPmRldiwgIkZhaWxlZCB0byBmaW5kIHN1cHBseSFcbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0gd2hpbGUgKG5wKTsKQEAgLTIzMCwxNyArMjMwLDE4IEBACiAJCXJldHVybiAwOwogCiAJLyogQWxsIHN1cHBsaWVzIGZvdW5kLCBhbGxvY2F0ZSBjaGFyICoqIGFycmF5IGZvciBmaWxsaW5nICovCi0JcHN5LT5zdXBwbGllZF9mcm9tID0gZGV2bV9remFsbG9jKHBzeS0+ZGV2LCBzaXplb2YocHN5LT5zdXBwbGllZF9mcm9tKSwKKwlwc3ktPnN1cHBsaWVkX2Zyb20gPSBkZXZtX2t6YWxsb2MoJnBzeS0+ZGV2LCBzaXplb2YocHN5LT5zdXBwbGllZF9mcm9tKSwKIAkJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIXBzeS0+c3VwcGxpZWRfZnJvbSkgewotCQlkZXZfZXJyKHBzeS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzdXBwbHkgbGlzdFxuIik7CisJCWRldl9lcnIoJnBzeS0+ZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciBzdXBwbHkgbGlzdFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCSpwc3ktPnN1cHBsaWVkX2Zyb20gPSBkZXZtX2t6YWxsb2MocHN5LT5kZXYsIHNpemVvZihjaGFyICopICogKGNudCAtIDEpLAorCSpwc3ktPnN1cHBsaWVkX2Zyb20gPSBkZXZtX2t6YWxsb2MoJnBzeS0+ZGV2LAorCQkJCQkgICBzaXplb2YoY2hhciAqKSAqIChjbnQgLSAxKSwKIAkJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYgKCEqcHN5LT5zdXBwbGllZF9mcm9tKSB7Ci0JCWRldl9lcnIocHN5LT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN1cHBseSBsaXN0XG4iKTsKKwkJZGV2X2VycigmcHN5LT5kZXYsICJDb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN1cHBseSBsaXN0XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yNjAsNyArMjYxLDggQEAKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICplcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlpZiAoX19wb3dlcl9zdXBwbHlfaXNfc3VwcGxpZWRfYnkoZXBzeSwgcHN5KSkKLQkJaWYgKCFlcHN5LT5nZXRfcHJvcGVydHkoZXBzeSwgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLCAmcmV0KSkKKwkJaWYgKCFlcHN5LT5kZXNjLT5nZXRfcHJvcGVydHkoZXBzeSwgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorCQkJCQkmcmV0KSkKIAkJCXJldHVybiByZXQuaW50dmFsOwogCiAJcmV0dXJuIDA7CkBAIC0yNzMsNyArMjc1LDcgQEAKIAllcnJvciA9IGNsYXNzX2Zvcl9lYWNoX2RldmljZShwb3dlcl9zdXBwbHlfY2xhc3MsIE5VTEwsIHBzeSwKIAkJCQkgICAgICBfX3Bvd2VyX3N1cHBseV9hbV9pX3N1cHBsaWVkKTsKIAotCWRldl9kYmcocHN5LT5kZXYsICIlcyAlZFxuIiwgX19mdW5jX18sIGVycm9yKTsKKwlkZXZfZGJnKCZwc3ktPmRldiwgIiVzICVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpOwogCiAJcmV0dXJuIGVycm9yOwogfQpAQCAtMjg2LDggKzI4OCw5IEBACiAJdW5zaWduZWQgaW50ICpjb3VudCA9IGRhdGE7CiAKIAkoKmNvdW50KSsrOwotCWlmIChwc3ktPnR5cGUgIT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSkKLQkJaWYgKCFwc3ktPmdldF9wcm9wZXJ0eShwc3ksIFBPV0VSX1NVUFBMWV9QUk9QX09OTElORSwgJnJldCkpCisJaWYgKHBzeS0+ZGVzYy0+dHlwZSAhPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZKQorCQlpZiAoIXBzeS0+ZGVzYy0+Z2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLAorCQkJCQkmcmV0KSkKIAkJCXJldHVybiByZXQuaW50dmFsOwogCiAJcmV0dXJuIDA7CkBAIC0zMTQsOCArMzE3LDEwIEBACiAKIGludCBwb3dlcl9zdXBwbHlfc2V0X2JhdHRlcnlfY2hhcmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCiB7Ci0JaWYgKHBzeS0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZICYmIHBzeS0+c2V0X2NoYXJnZWQpIHsKLQkJcHN5LT5zZXRfY2hhcmdlZChwc3kpOworCWlmIChhdG9taWNfcmVhZCgmcHN5LT51c2VfY250KSA+PSAwICYmCisJCQlwc3ktPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSAmJgorCQkJcHN5LT5kZXNjLT5zZXRfY2hhcmdlZCkgeworCQlwc3ktPmRlc2MtPnNldF9jaGFyZ2VkKHBzeSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMzI4LDI4ICszMzMsNzQgQEAKIAljb25zdCBjaGFyICpuYW1lID0gZGF0YTsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXJldHVybiBzdHJjbXAocHN5LT5uYW1lLCBuYW1lKSA9PSAwOworCXJldHVybiBzdHJjbXAocHN5LT5kZXNjLT5uYW1lLCBuYW1lKSA9PSAwOwogfQogCisvKioKKyAqIHBvd2VyX3N1cHBseV9nZXRfYnlfbmFtZSgpIC0gU2VhcmNoIGZvciBhIHBvd2VyIHN1cHBseSBhbmQgcmV0dXJucyBpdHMgcmVmCisgKiBAbmFtZTogUG93ZXIgc3VwcGx5IG5hbWUgdG8gZmV0Y2gKKyAqCisgKiBJZiBwb3dlciBzdXBwbHkgd2FzIGZvdW5kLCBpdCBpbmNyZWFzZXMgcmVmZXJlbmNlIGNvdW50IGZvciB0aGUKKyAqIGludGVybmFsIHBvd2VyIHN1cHBseSdzIGRldmljZS4gVGhlIHVzZXIgc2hvdWxkIHBvd2VyX3N1cHBseV9wdXQoKQorICogYWZ0ZXIgdXNhZ2UuCisgKgorICogUmV0dXJuOiBPbiBzdWNjZXNzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBwb3dlciBzdXBwbHkgd2l0aAorICogbWF0Y2hpbmcgbmFtZSBlcXVhbHMgdG8gQG5hbWUsIGEgTlVMTCBvdGhlcndpc2UuCisgKi8KIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBvd2VyX3N1cHBseV9nZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQogeworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IE5VTEw7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gY2xhc3NfZmluZF9kZXZpY2UocG93ZXJfc3VwcGx5X2NsYXNzLCBOVUxMLCBuYW1lLAogCQkJCQlwb3dlcl9zdXBwbHlfbWF0Y2hfZGV2aWNlX2J5X25hbWUpOwogCi0JcmV0dXJuIGRldiA/IGRldl9nZXRfZHJ2ZGF0YShkZXYpIDogTlVMTDsKKwlpZiAoZGV2KSB7CisJCXBzeSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCQlhdG9taWNfaW5jKCZwc3ktPnVzZV9jbnQpOworCX0KKworCXJldHVybiBwc3k7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwb3dlcl9zdXBwbHlfZ2V0X2J5X25hbWUpOwogCisvKioKKyAqIHBvd2VyX3N1cHBseV9wdXQoKSAtIERyb3AgcmVmZXJlbmNlIG9idGFpbmVkIHdpdGggcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lCisgKiBAcHN5OiBSZWZlcmVuY2UgdG8gcHV0CisgKgorICogVGhlIHJlZmVyZW5jZSB0byBwb3dlciBzdXBwbHkgc2hvdWxkIGJlIHB1dCBiZWZvcmUgdW5yZWdpc3RlcmluZworICogdGhlIHBvd2VyIHN1cHBseS4KKyAqLwordm9pZCBwb3dlcl9zdXBwbHlfcHV0KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKK3sKKwltaWdodF9zbGVlcCgpOworCisJYXRvbWljX2RlYygmcHN5LT51c2VfY250KTsKKwlwdXRfZGV2aWNlKCZwc3ktPmRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwb3dlcl9zdXBwbHlfcHV0KTsKKwogI2lmZGVmIENPTkZJR19PRgogc3RhdGljIGludCBwb3dlcl9zdXBwbHlfbWF0Y2hfZGV2aWNlX25vZGUoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCB2b2lkICpkYXRhKQogewogCXJldHVybiBkZXYtPnBhcmVudCAmJiBkZXYtPnBhcmVudC0+b2Zfbm9kZSA9PSBkYXRhOwogfQogCisvKioKKyAqIHBvd2VyX3N1cHBseV9nZXRfYnlfcGhhbmRsZSgpIC0gU2VhcmNoIGZvciBhIHBvd2VyIHN1cHBseSBhbmQgcmV0dXJucyBpdHMgcmVmCisgKiBAbnA6IFBvaW50ZXIgdG8gZGV2aWNlIG5vZGUgaG9sZGluZyBwaGFuZGxlIHByb3BlcnR5CisgKiBAcGhhbmRsZV9uYW1lOiBOYW1lIG9mIHByb3BlcnR5IGhvbGRpbmcgYSBwb3dlciBzdXBwbHkgbmFtZQorICoKKyAqIElmIHBvd2VyIHN1cHBseSB3YXMgZm91bmQsIGl0IGluY3JlYXNlcyByZWZlcmVuY2UgY291bnQgZm9yIHRoZQorICogaW50ZXJuYWwgcG93ZXIgc3VwcGx5J3MgZGV2aWNlLiBUaGUgdXNlciBzaG91bGQgcG93ZXJfc3VwcGx5X3B1dCgpCisgKiBhZnRlciB1c2FnZS4KKyAqCisgKiBSZXR1cm46IE9uIHN1Y2Nlc3MgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHBvd2VyIHN1cHBseSB3aXRoCisgKiBtYXRjaGluZyBuYW1lIGVxdWFscyB0byB2YWx1ZSB1bmRlciBAcHJvcGVydHksIE5VTEwgb3IgRVJSX1BUUiBvdGhlcndpc2UuCisgKi8KIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBvd2VyX3N1cHBseV9nZXRfYnlfcGhhbmRsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCQkJCWNvbnN0IGNoYXIgKnByb3BlcnR5KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqcG93ZXJfc3VwcGx5X25wOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9IE5VTEw7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCiAJcG93ZXJfc3VwcGx5X25wID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgcHJvcGVydHksIDApOwpAQCAtMzYxLDIxICs0MTIsNzAgQEAKIAogCW9mX25vZGVfcHV0KHBvd2VyX3N1cHBseV9ucCk7CiAKLQlyZXR1cm4gZGV2ID8gZGV2X2dldF9kcnZkYXRhKGRldikgOiBOVUxMOworCWlmIChkZXYpIHsKKwkJcHN5ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJCWF0b21pY19pbmMoJnBzeS0+dXNlX2NudCk7CisJfQorCisJcmV0dXJuIHBzeTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBvd2VyX3N1cHBseV9nZXRfYnlfcGhhbmRsZSk7CiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKK2ludCBwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCSAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCisJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlpZiAoYXRvbWljX3JlYWQoJnBzeS0+dXNlX2NudCkgPD0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcHN5LT5kZXNjLT5nZXRfcHJvcGVydHkocHN5LCBwc3AsIHZhbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwb3dlcl9zdXBwbHlfZ2V0X3Byb3BlcnR5KTsKKworaW50IHBvd2VyX3N1cHBseV9zZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCSAgICBjb25zdCB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQoreworCWlmIChhdG9taWNfcmVhZCgmcHN5LT51c2VfY250KSA8PSAwIHx8ICFwc3ktPmRlc2MtPnNldF9wcm9wZXJ0eSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcHN5LT5kZXNjLT5zZXRfcHJvcGVydHkocHN5LCBwc3AsIHZhbCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwb3dlcl9zdXBwbHlfc2V0X3Byb3BlcnR5KTsKKworaW50IHBvd2VyX3N1cHBseV9wcm9wZXJ0eV9pc193cml0ZWFibGUoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3ApCit7CisJaWYgKGF0b21pY19yZWFkKCZwc3ktPnVzZV9jbnQpIDw9IDAgfHwKKwkJCSFwc3ktPmRlc2MtPnByb3BlcnR5X2lzX3dyaXRlYWJsZSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gcHN5LT5kZXNjLT5wcm9wZXJ0eV9pc193cml0ZWFibGUocHN5LCBwc3ApOworfQorRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X3Byb3BlcnR5X2lzX3dyaXRlYWJsZSk7CisKK3ZvaWQgcG93ZXJfc3VwcGx5X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQoreworCWlmIChhdG9taWNfcmVhZCgmcHN5LT51c2VfY250KSA8PSAwIHx8CisJCQkhcHN5LT5kZXNjLT5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKQorCQlyZXR1cm47CisKKwlwc3ktPmRlc2MtPmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQocHN5KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBvd2VyX3N1cHBseV9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKTsKKwogaW50IHBvd2VyX3N1cHBseV9wb3dlcnMoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIHN5c2ZzX2NyZWF0ZV9saW5rKCZwc3ktPmRldi0+a29iaiwgJmRldi0+a29iaiwgInBvd2VycyIpOworCXJldHVybiBzeXNmc19jcmVhdGVfbGluaygmcHN5LT5kZXYua29iaiwgJmRldi0+a29iaiwgInBvd2VycyIpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X3Bvd2Vycyk7CiAKIHN0YXRpYyB2b2lkIHBvd2VyX3N1cHBseV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHBvd2VyX3N1cHBseSwgZGV2KTsKIAlwcl9kZWJ1ZygiZGV2aWNlOiAnJXMnOiAlc1xuIiwgZGV2X25hbWUoZGV2KSwgX19mdW5jX18pOwotCWtmcmVlKGRldik7CisJa2ZyZWUocHN5KTsKIH0KIAogaW50IHBvd2VyX3N1cHBseV9yZWdfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKQEAgLTQwMCw3ICs1MDAsNyBAQAogCiAJV0FSTl9PTih0emQgPT0gTlVMTCk7CiAJcHN5ID0gdHpkLT5kZXZkYXRhOwotCXJldCA9IHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfVEVNUCwgJnZhbCk7CisJcmV0ID0gcHN5LT5kZXNjLT5nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9URU1QLCAmdmFsKTsKIAogCS8qIENvbnZlcnQgdGVudGhzIG9mIGRlZ3JlZSBDZWxzaXVzIHRvIG1pbGxpIGRlZ3JlZSBDZWxzaXVzLiAqLwogCWlmICghcmV0KQpAQCAtNDE3LDE0ICs1MTcsMTQgQEAKIHsKIAlpbnQgaTsKIAotCWlmIChwc3ktPm5vX3RoZXJtYWwpCisJaWYgKHBzeS0+ZGVzYy0+bm9fdGhlcm1hbCkKIAkJcmV0dXJuIDA7CiAKIAkvKiBSZWdpc3RlciBiYXR0ZXJ5IHpvbmUgZGV2aWNlIHBzeSByZXBvcnRzIHRlbXBlcmF0dXJlICovCi0JZm9yIChpID0gMDsgaSA8IHBzeS0+bnVtX3Byb3BlcnRpZXM7IGkrKykgewotCQlpZiAocHN5LT5wcm9wZXJ0aWVzW2ldID09IFBPV0VSX1NVUFBMWV9QUk9QX1RFTVApIHsKLQkJCXBzeS0+dHpkID0gdGhlcm1hbF96b25lX2RldmljZV9yZWdpc3Rlcihwc3ktPm5hbWUsIDAsIDAsCi0JCQkJCXBzeSwgJnBzeV90emRfb3BzLCBOVUxMLCAwLCAwKTsKKwlmb3IgKGkgPSAwOyBpIDwgcHN5LT5kZXNjLT5udW1fcHJvcGVydGllczsgaSsrKSB7CisJCWlmIChwc3ktPmRlc2MtPnByb3BlcnRpZXNbaV0gPT0gUE9XRVJfU1VQUExZX1BST1BfVEVNUCkgeworCQkJcHN5LT50emQgPSB0aGVybWFsX3pvbmVfZGV2aWNlX3JlZ2lzdGVyKHBzeS0+ZGVzYy0+bmFtZSwKKwkJCQkJMCwgMCwgcHN5LCAmcHN5X3R6ZF9vcHMsIE5VTEwsIDAsIDApOwogCQkJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTyhwc3ktPnR6ZCk7CiAJCX0KIAl9CkBAIC00NDcsNyArNTQ3LDcgQEAKIAlpbnQgcmV0OwogCiAJcHN5ID0gdGNkLT5kZXZkYXRhOwotCXJldCA9IHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwKKwlyZXQgPSBwc3ktPmRlc2MtPmdldF9wcm9wZXJ0eShwc3ksCiAJCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT05UUk9MX0xJTUlUX01BWCwgJnZhbCk7CiAJaWYgKCFyZXQpCiAJCSpzdGF0ZSA9IHZhbC5pbnR2YWw7CkBAIC00NjMsNyArNTYzLDcgQEAKIAlpbnQgcmV0OwogCiAJcHN5ID0gdGNkLT5kZXZkYXRhOwotCXJldCA9IHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwKKwlyZXQgPSBwc3ktPmRlc2MtPmdldF9wcm9wZXJ0eShwc3ksCiAJCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9DT05UUk9MX0xJTUlULCAmdmFsKTsKIAlpZiAoIXJldCkKIAkJKnN0YXRlID0gdmFsLmludHZhbDsKQEAgLTQ4MCw3ICs1ODAsNyBAQAogCiAJcHN5ID0gdGNkLT5kZXZkYXRhOwogCXZhbC5pbnR2YWwgPSBzdGF0ZTsKLQlyZXQgPSBwc3ktPnNldF9wcm9wZXJ0eShwc3ksCisJcmV0ID0gcHN5LT5kZXNjLT5zZXRfcHJvcGVydHkocHN5LAogCQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09OVFJPTF9MSU1JVCwgJnZhbCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtNDk3LDExICs1OTcsMTEgQEAKIAlpbnQgaTsKIAogCS8qIFJlZ2lzdGVyIGZvciBjb29saW5nIGRldmljZSBpZiBwc3kgY2FuIGNvbnRyb2wgY2hhcmdpbmcgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcHN5LT5udW1fcHJvcGVydGllczsgaSsrKSB7Ci0JCWlmIChwc3ktPnByb3BlcnRpZXNbaV0gPT0KKwlmb3IgKGkgPSAwOyBpIDwgcHN5LT5kZXNjLT5udW1fcHJvcGVydGllczsgaSsrKSB7CisJCWlmIChwc3ktPmRlc2MtPnByb3BlcnRpZXNbaV0gPT0KIAkJCQlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfQ09OVFJPTF9MSU1JVCkgewogCQkJcHN5LT50Y2QgPSB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX3JlZ2lzdGVyKAotCQkJCQkJCShjaGFyICopcHN5LT5uYW1lLAorCQkJCQkJCShjaGFyICopcHN5LT5kZXNjLT5uYW1lLAogCQkJCQkJCXBzeSwgJnBzeV90Y2Rfb3BzKTsKIAkJCXJldHVybiBQVFJfRVJSX09SX1pFUk8ocHN5LT50Y2QpOwogCQl9CkBAIC01MzUsMTUgKzYzNSwyMSBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbnQgX19wb3dlcl9zdXBwbHlfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LAotCQkJCSAgIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwgYm9vbCB3cykKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpfX211c3RfY2hlY2sKK19fcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKmRlc2MsCisJCQkJICAgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgKmNmZywKKwkJCQkgICBib29sIHdzKQogewogCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7CiAJaW50IHJjOwogCi0JZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmICghZGV2KQotCQlyZXR1cm4gLUVOT01FTTsKKwlwc3kgPSBremFsbG9jKHNpemVvZigqcHN5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwc3kpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZGV2ID0gJnBzeS0+ZGV2OwogCiAJZGV2aWNlX2luaXRpYWxpemUoZGV2KTsKIApAQCAtNTUyLDkgKzY1OCwxNiBAQAogCWRldi0+cGFyZW50ID0gcGFyZW50OwogCWRldi0+cmVsZWFzZSA9IHBvd2VyX3N1cHBseV9kZXZfcmVsZWFzZTsKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBwc3kpOwotCXBzeS0+ZGV2ID0gZGV2OworCXBzeS0+ZGVzYyA9IGRlc2M7CisJYXRvbWljX2luYygmcHN5LT51c2VfY250KTsKKwlpZiAoY2ZnKSB7CisJCXBzeS0+ZHJ2X2RhdGEgPSBjZmctPmRydl9kYXRhOworCQlwc3ktPm9mX25vZGUgPSBjZmctPm9mX25vZGU7CisJCXBzeS0+c3VwcGxpZWRfdG8gPSBjZmctPnN1cHBsaWVkX3RvOworCQlwc3ktPm51bV9zdXBwbGljYW50cyA9IGNmZy0+bnVtX3N1cHBsaWNhbnRzOworCX0KIAotCXJjID0gZGV2X3NldF9uYW1lKGRldiwgIiVzIiwgcHN5LT5uYW1lKTsKKwlyYyA9IGRldl9zZXRfbmFtZShkZXYsICIlcyIsIGRlc2MtPm5hbWUpOwogCWlmIChyYykKIAkJZ290byBkZXZfc2V0X25hbWVfZmFpbGVkOwogCkBAIC01ODksNyArNzAyLDcgQEAKIAogCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBzeSk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcHN5OwogCiBjcmVhdGVfdHJpZ2dlcnNfZmFpbGVkOgogCXBzeV91bnJlZ2lzdGVyX2Nvb2xlcihwc3kpOwpAQCAtNjAyLDMzICs3MTUsMTU1IEBACiBjaGVja19zdXBwbGllc19mYWlsZWQ6CiBkZXZfc2V0X25hbWVfZmFpbGVkOgogCXB1dF9kZXZpY2UoZGV2KTsKLQlyZXR1cm4gcmM7CisJcmV0dXJuIEVSUl9QVFIocmMpOwogfQogCi1pbnQgcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQorLyoqCisgKiBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoKSAtIFJlZ2lzdGVyIG5ldyBwb3dlciBzdXBwbHkKKyAqIEBwYXJlbnQ6CURldmljZSB0byBiZSBhIHBhcmVudCBvZiBwb3dlciBzdXBwbHkncyBkZXZpY2UKKyAqIEBkZXNjOglEZXNjcmlwdGlvbiBvZiBwb3dlciBzdXBwbHksIG11c3QgYmUgdmFsaWQgdGhyb3VnaCB3aG9sZQorICoJCWxpZmV0aW1lIG9mIHRoaXMgcG93ZXIgc3VwcGx5CisgKiBAY2ZnOglSdW4tdGltZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGFjY2Vzc2VkIGR1cmluZyByZWdpc3RlcmluZywKKyAqCQltYXkgYmUgTlVMTAorICoKKyAqIFJldHVybjogQSBwb2ludGVyIHRvIG5ld2x5IGFsbG9jYXRlZCBwb3dlcl9zdXBwbHkgb24gc3VjY2VzcworICogb3IgRVJSX1BUUiBvdGhlcndpc2UuCisgKiBVc2UgcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoKSBvbiByZXR1cm5lZCBwb3dlcl9zdXBwbHkgcG9pbnRlciB0byByZWxlYXNlCisgKiByZXNvdXJjZXMuCisgKi8KK3N0cnVjdCBwb3dlcl9zdXBwbHkgKl9fbXVzdF9jaGVjayBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQljb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKmRlc2MsCisJCWNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnICpjZmcpCiB7Ci0JcmV0dXJuIF9fcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKHBhcmVudCwgcHN5LCB0cnVlKTsKKwlyZXR1cm4gX19wb3dlcl9zdXBwbHlfcmVnaXN0ZXIocGFyZW50LCBkZXNjLCBjZmcsIHRydWUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG93ZXJfc3VwcGx5X3JlZ2lzdGVyKTsKIAotaW50IHBvd2VyX3N1cHBseV9yZWdpc3Rlcl9ub193cyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKKy8qKgorICogcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCkgLSBSZWdpc3RlciBuZXcgbm9uLXdha2luZy1zb3VyY2UgcG93ZXIgc3VwcGx5CisgKiBAcGFyZW50OglEZXZpY2UgdG8gYmUgYSBwYXJlbnQgb2YgcG93ZXIgc3VwcGx5J3MgZGV2aWNlCisgKiBAZGVzYzoJRGVzY3JpcHRpb24gb2YgcG93ZXIgc3VwcGx5LCBtdXN0IGJlIHZhbGlkIHRocm91Z2ggd2hvbGUKKyAqCQlsaWZldGltZSBvZiB0aGlzIHBvd2VyIHN1cHBseQorICogQGNmZzoJUnVuLXRpbWUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBhY2Nlc3NlZCBkdXJpbmcgcmVnaXN0ZXJpbmcsCisgKgkJbWF5IGJlIE5VTEwKKyAqCisgKiBSZXR1cm46IEEgcG9pbnRlciB0byBuZXdseSBhbGxvY2F0ZWQgcG93ZXJfc3VwcGx5IG9uIHN1Y2Nlc3MKKyAqIG9yIEVSUl9QVFIgb3RoZXJ3aXNlLgorICogVXNlIHBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCkgb24gcmV0dXJuZWQgcG93ZXJfc3VwcGx5IHBvaW50ZXIgdG8gcmVsZWFzZQorICogcmVzb3VyY2VzLgorICovCitzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpfX211c3RfY2hlY2sKK3Bvd2VyX3N1cHBseV9yZWdpc3Rlcl9ub193cyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCWNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqZGVzYywKKwkJY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgKmNmZykKIHsKLQlyZXR1cm4gX19wb3dlcl9zdXBwbHlfcmVnaXN0ZXIocGFyZW50LCBwc3ksIGZhbHNlKTsKKwlyZXR1cm4gX19wb3dlcl9zdXBwbHlfcmVnaXN0ZXIocGFyZW50LCBkZXNjLCBjZmcsIGZhbHNlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBvd2VyX3N1cHBseV9yZWdpc3Rlcl9ub193cyk7CiAKK3N0YXRpYyB2b2lkIGRldm1fcG93ZXJfc3VwcGx5X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCit7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqKnBzeSA9IHJlczsKKworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCpwc3kpOworfQorCisvKioKKyAqIHBvd2VyX3N1cHBseV9yZWdpc3RlcigpIC0gUmVnaXN0ZXIgbWFuYWdlZCBwb3dlciBzdXBwbHkKKyAqIEBwYXJlbnQ6CURldmljZSB0byBiZSBhIHBhcmVudCBvZiBwb3dlciBzdXBwbHkncyBkZXZpY2UKKyAqIEBkZXNjOglEZXNjcmlwdGlvbiBvZiBwb3dlciBzdXBwbHksIG11c3QgYmUgdmFsaWQgdGhyb3VnaCB3aG9sZQorICoJCWxpZmV0aW1lIG9mIHRoaXMgcG93ZXIgc3VwcGx5CisgKiBAY2ZnOglSdW4tdGltZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGFjY2Vzc2VkIGR1cmluZyByZWdpc3RlcmluZywKKyAqCQltYXkgYmUgTlVMTAorICoKKyAqIFJldHVybjogQSBwb2ludGVyIHRvIG5ld2x5IGFsbG9jYXRlZCBwb3dlcl9zdXBwbHkgb24gc3VjY2VzcworICogb3IgRVJSX1BUUiBvdGhlcndpc2UuCisgKiBUaGUgcmV0dXJuZWQgcG93ZXJfc3VwcGx5IHBvaW50ZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVucmVnaXN0ZXJlZAorICogb24gZHJpdmVyIGRldGFjaC4KKyAqLworc3RydWN0IHBvd2VyX3N1cHBseSAqX19tdXN0X2NoZWNrCitkZXZtX3Bvd2VyX3N1cHBseV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCWNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqZGVzYywKKwkJY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICoqcHRyLCAqcHN5OworCisJcHRyID0gZGV2cmVzX2FsbG9jKGRldm1fcG93ZXJfc3VwcGx5X3JlbGVhc2UsIHNpemVvZigqcHRyKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXB0cikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJcHN5ID0gX19wb3dlcl9zdXBwbHlfcmVnaXN0ZXIocGFyZW50LCBkZXNjLCBjZmcsIHRydWUpOworCWlmIChJU19FUlIocHN5KSkgeworCQlkZXZyZXNfZnJlZShwdHIpOworCX0gZWxzZSB7CisJCSpwdHIgPSBwc3k7CisJCWRldnJlc19hZGQocGFyZW50LCBwdHIpOworCX0KKwlyZXR1cm4gcHN5OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9wb3dlcl9zdXBwbHlfcmVnaXN0ZXIpOworCisvKioKKyAqIHBvd2VyX3N1cHBseV9yZWdpc3RlcigpIC0gUmVnaXN0ZXIgbWFuYWdlZCBub24td2FraW5nLXNvdXJjZSBwb3dlciBzdXBwbHkKKyAqIEBwYXJlbnQ6CURldmljZSB0byBiZSBhIHBhcmVudCBvZiBwb3dlciBzdXBwbHkncyBkZXZpY2UKKyAqIEBkZXNjOglEZXNjcmlwdGlvbiBvZiBwb3dlciBzdXBwbHksIG11c3QgYmUgdmFsaWQgdGhyb3VnaCB3aG9sZQorICoJCWxpZmV0aW1lIG9mIHRoaXMgcG93ZXIgc3VwcGx5CisgKiBAY2ZnOglSdW4tdGltZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGFjY2Vzc2VkIGR1cmluZyByZWdpc3RlcmluZywKKyAqCQltYXkgYmUgTlVMTAorICoKKyAqIFJldHVybjogQSBwb2ludGVyIHRvIG5ld2x5IGFsbG9jYXRlZCBwb3dlcl9zdXBwbHkgb24gc3VjY2VzcworICogb3IgRVJSX1BUUiBvdGhlcndpc2UuCisgKiBUaGUgcmV0dXJuZWQgcG93ZXJfc3VwcGx5IHBvaW50ZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHVucmVnaXN0ZXJlZAorICogb24gZHJpdmVyIGRldGFjaC4KKyAqLworc3RydWN0IHBvd2VyX3N1cHBseSAqX19tdXN0X2NoZWNrCitkZXZtX3Bvd2VyX3N1cHBseV9yZWdpc3Rlcl9ub193cyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCWNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqZGVzYywKKwkJY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICoqcHRyLCAqcHN5OworCisJcHRyID0gZGV2cmVzX2FsbG9jKGRldm1fcG93ZXJfc3VwcGx5X3JlbGVhc2UsIHNpemVvZigqcHRyKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXB0cikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJcHN5ID0gX19wb3dlcl9zdXBwbHlfcmVnaXN0ZXIocGFyZW50LCBkZXNjLCBjZmcsIGZhbHNlKTsKKwlpZiAoSVNfRVJSKHBzeSkpIHsKKwkJZGV2cmVzX2ZyZWUocHRyKTsKKwl9IGVsc2UgeworCQkqcHRyID0gcHN5OworCQlkZXZyZXNfYWRkKHBhcmVudCwgcHRyKTsKKwl9CisJcmV0dXJuIHBzeTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1fcG93ZXJfc3VwcGx5X3JlZ2lzdGVyX25vX3dzKTsKKworLyoqCisgKiBwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigpIC0gUmVtb3ZlIHRoaXMgcG93ZXIgc3VwcGx5IGZyb20gc3lzdGVtCisgKiBAcHN5OglQb2ludGVyIHRvIHBvd2VyIHN1cHBseSB0byB1bnJlZ2lzdGVyCisgKgorICogUmVtb3ZlIHRoaXMgcG93ZXIgc3VwcGx5IGZyb20gdGhlIHN5c3RlbS4gVGhlIHJlc291cmNlcyBvZiBwb3dlciBzdXBwbHkKKyAqIHdpbGwgYmUgZnJlZWQgaGVyZSBvciBvbiBsYXN0IHBvd2VyX3N1cHBseV9wdXQoKSBjYWxsLgorICovCiB2b2lkIHBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKIHsKKwlXQVJOX09OKGF0b21pY19kZWNfcmV0dXJuKCZwc3ktPnVzZV9jbnQpKTsKIAljYW5jZWxfd29ya19zeW5jKCZwc3ktPmNoYW5nZWRfd29yayk7Ci0Jc3lzZnNfcmVtb3ZlX2xpbmsoJnBzeS0+ZGV2LT5rb2JqLCAicG93ZXJzIik7CisJc3lzZnNfcmVtb3ZlX2xpbmsoJnBzeS0+ZGV2LmtvYmosICJwb3dlcnMiKTsKIAlwb3dlcl9zdXBwbHlfcmVtb3ZlX3RyaWdnZXJzKHBzeSk7CiAJcHN5X3VucmVnaXN0ZXJfY29vbGVyKHBzeSk7CiAJcHN5X3VucmVnaXN0ZXJfdGhlcm1hbChwc3kpOwotCWRldmljZV9pbml0X3dha2V1cChwc3ktPmRldiwgZmFsc2UpOwotCWRldmljZV91bnJlZ2lzdGVyKHBzeS0+ZGV2KTsKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBzeS0+ZGV2LCBmYWxzZSk7CisJZGV2aWNlX3VucmVnaXN0ZXIoJnBzeS0+ZGV2KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKTsKIAordm9pZCAqcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKK3sKKwlyZXR1cm4gcHN5LT5kcnZfZGF0YTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YSk7CisKIHN0YXRpYyBpbnQgX19pbml0IHBvd2VyX3N1cHBseV9jbGFzc19pbml0KHZvaWQpCiB7CiAJcG93ZXJfc3VwcGx5X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAicG93ZXJfc3VwcGx5Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9sZWRzLmMgYi9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9sZWRzLmMKaW5kZXggZWZmYTA5My4uMmQ0MWE0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfbGVkcy5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X2xlZHMuYwpAQCAtMjUsMTAgKzI1LDEwIEBACiAJdW5zaWduZWQgbG9uZyBkZWxheV9vbiA9IDA7CiAJdW5zaWduZWQgbG9uZyBkZWxheV9vZmYgPSAwOwogCi0JaWYgKHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLCAmc3RhdHVzKSkKKwlpZiAocHN5LT5kZXNjLT5nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsICZzdGF0dXMpKQogCQlyZXR1cm47CiAKLQlkZXZfZGJnKHBzeS0+ZGV2LCAiJXMgJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMuaW50dmFsKTsKKwlkZXZfZGJnKCZwc3ktPmRldiwgIiVzICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzLmludHZhbCk7CiAKIAlzd2l0Y2ggKHN0YXR1cy5pbnR2YWwpIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDoKQEAgLTU4LDIxICs1OCwyMSBAQAogc3RhdGljIGludCBwb3dlcl9zdXBwbHlfY3JlYXRlX2JhdF90cmlnZ2VycyhzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCiB7CiAJcHN5LT5jaGFyZ2luZ19mdWxsX3RyaWdfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAotCQkJCQkiJXMtY2hhcmdpbmctb3ItZnVsbCIsIHBzeS0+bmFtZSk7CisJCQkJCSIlcy1jaGFyZ2luZy1vci1mdWxsIiwgcHN5LT5kZXNjLT5uYW1lKTsKIAlpZiAoIXBzeS0+Y2hhcmdpbmdfZnVsbF90cmlnX25hbWUpCiAJCWdvdG8gY2hhcmdpbmdfZnVsbF9mYWlsZWQ7CiAKIAlwc3ktPmNoYXJnaW5nX3RyaWdfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAotCQkJCQkiJXMtY2hhcmdpbmciLCBwc3ktPm5hbWUpOworCQkJCQkiJXMtY2hhcmdpbmciLCBwc3ktPmRlc2MtPm5hbWUpOwogCWlmICghcHN5LT5jaGFyZ2luZ190cmlnX25hbWUpCiAJCWdvdG8gY2hhcmdpbmdfZmFpbGVkOwogCi0JcHN5LT5mdWxsX3RyaWdfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMtZnVsbCIsIHBzeS0+bmFtZSk7CisJcHN5LT5mdWxsX3RyaWdfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMtZnVsbCIsIHBzeS0+ZGVzYy0+bmFtZSk7CiAJaWYgKCFwc3ktPmZ1bGxfdHJpZ19uYW1lKQogCQlnb3RvIGZ1bGxfZmFpbGVkOwogCiAJcHN5LT5jaGFyZ2luZ19ibGlua19mdWxsX3NvbGlkX3RyaWdfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLAotCQkiJXMtY2hhcmdpbmctYmxpbmstZnVsbC1zb2xpZCIsIHBzeS0+bmFtZSk7CisJCSIlcy1jaGFyZ2luZy1ibGluay1mdWxsLXNvbGlkIiwgcHN5LT5kZXNjLT5uYW1lKTsKIAlpZiAoIXBzeS0+Y2hhcmdpbmdfYmxpbmtfZnVsbF9zb2xpZF90cmlnX25hbWUpCiAJCWdvdG8gY2hhcmdpbmdfYmxpbmtfZnVsbF9zb2xpZF9mYWlsZWQ7CiAKQEAgLTExNSwxMCArMTE1LDEwIEBACiB7CiAJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgb25saW5lOwogCi0JaWYgKHBzeS0+Z2V0X3Byb3BlcnR5KHBzeSwgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLCAmb25saW5lKSkKKwlpZiAocHN5LT5kZXNjLT5nZXRfcHJvcGVydHkocHN5LCBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUsICZvbmxpbmUpKQogCQlyZXR1cm47CiAKLQlkZXZfZGJnKHBzeS0+ZGV2LCAiJXMgJWRcbiIsIF9fZnVuY19fLCBvbmxpbmUuaW50dmFsKTsKKwlkZXZfZGJnKCZwc3ktPmRldiwgIiVzICVkXG4iLCBfX2Z1bmNfXywgb25saW5lLmludHZhbCk7CiAKIAlpZiAob25saW5lLmludHZhbCkKIAkJbGVkX3RyaWdnZXJfZXZlbnQocHN5LT5vbmxpbmVfdHJpZywgTEVEX0ZVTEwpOwpAQCAtMTI4LDcgKzEyOCw4IEBACiAKIHN0YXRpYyBpbnQgcG93ZXJfc3VwcGx5X2NyZWF0ZV9nZW5fdHJpZ2dlcnMoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQogewotCXBzeS0+b25saW5lX3RyaWdfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMtb25saW5lIiwgcHN5LT5uYW1lKTsKKwlwc3ktPm9ubGluZV90cmlnX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIiVzLW9ubGluZSIsCisJCQkJCSAgcHN5LT5kZXNjLT5uYW1lKTsKIAlpZiAoIXBzeS0+b25saW5lX3RyaWdfbmFtZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTE0Nyw3ICsxNDgsNyBAQAogCiB2b2lkIHBvd2VyX3N1cHBseV91cGRhdGVfbGVkcyhzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCiB7Ci0JaWYgKHBzeS0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZKQorCWlmIChwc3ktPmRlc2MtPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSkKIAkJcG93ZXJfc3VwcGx5X3VwZGF0ZV9iYXRfbGVkcyhwc3kpOwogCWVsc2UKIAkJcG93ZXJfc3VwcGx5X3VwZGF0ZV9nZW5fbGVkcyhwc3kpOwpAQCAtMTU1LDE0ICsxNTYsMTQgQEAKIAogaW50IHBvd2VyX3N1cHBseV9jcmVhdGVfdHJpZ2dlcnMoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQogewotCWlmIChwc3ktPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSkKKwlpZiAocHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlkpCiAJCXJldHVybiBwb3dlcl9zdXBwbHlfY3JlYXRlX2JhdF90cmlnZ2Vycyhwc3kpOwogCXJldHVybiBwb3dlcl9zdXBwbHlfY3JlYXRlX2dlbl90cmlnZ2Vycyhwc3kpOwogfQogCiB2b2lkIHBvd2VyX3N1cHBseV9yZW1vdmVfdHJpZ2dlcnMoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KQogewotCWlmIChwc3ktPnR5cGUgPT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSkKKwlpZiAocHN5LT5kZXNjLT50eXBlID09IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlkpCiAJCXBvd2VyX3N1cHBseV9yZW1vdmVfYmF0X3RyaWdnZXJzKHBzeSk7CiAJZWxzZQogCQlwb3dlcl9zdXBwbHlfcmVtb3ZlX2dlbl90cmlnZ2Vycyhwc3kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYyBiL2RyaXZlcnMvcG93ZXIvcG93ZXJfc3VwcGx5X3N5c2ZzLmMKaW5kZXggNjI2NTNmNS4uOTEzNGUzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9wb3dlcl9zdXBwbHlfc3lzZnMuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Bvd2VyX3N1cHBseV9zeXNmcy5jCkBAIC03NCw5ICs3NCw5IEBACiAJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgdmFsdWU7CiAKIAlpZiAob2ZmID09IFBPV0VSX1NVUFBMWV9QUk9QX1RZUEUpIHsKLQkJdmFsdWUuaW50dmFsID0gcHN5LT50eXBlOworCQl2YWx1ZS5pbnR2YWwgPSBwc3ktPmRlc2MtPnR5cGU7CiAJfSBlbHNlIHsKLQkJcmV0ID0gcHN5LT5nZXRfcHJvcGVydHkocHN5LCBvZmYsICZ2YWx1ZSk7CisJCXJldCA9IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkocHN5LCBvZmYsICZ2YWx1ZSk7CiAKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChyZXQgPT0gLUVOT0RBVEEpCkBAIC0xMjUsNyArMTI1LDcgQEAKIAogCXZhbHVlLmludHZhbCA9IGxvbmdfdmFsOwogCi0JcmV0ID0gcHN5LT5zZXRfcHJvcGVydHkocHN5LCBvZmYsICZ2YWx1ZSk7CisJcmV0ID0gcHN5LT5kZXNjLT5zZXRfcHJvcGVydHkocHN5LCBvZmYsICZ2YWx1ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTIxOCwxMiArMjE4LDEyIEBACiAJaWYgKGF0dHJubyA9PSBQT1dFUl9TVVBQTFlfUFJPUF9UWVBFKQogCQlyZXR1cm4gbW9kZTsKIAotCWZvciAoaSA9IDA7IGkgPCBwc3ktPm51bV9wcm9wZXJ0aWVzOyBpKyspIHsKLQkJaW50IHByb3BlcnR5ID0gcHN5LT5wcm9wZXJ0aWVzW2ldOworCWZvciAoaSA9IDA7IGkgPCBwc3ktPmRlc2MtPm51bV9wcm9wZXJ0aWVzOyBpKyspIHsKKwkJaW50IHByb3BlcnR5ID0gcHN5LT5kZXNjLT5wcm9wZXJ0aWVzW2ldOwogCiAJCWlmIChwcm9wZXJ0eSA9PSBhdHRybm8pIHsKLQkJCWlmIChwc3ktPnByb3BlcnR5X2lzX3dyaXRlYWJsZSAmJgotCQkJICAgIHBzeS0+cHJvcGVydHlfaXNfd3JpdGVhYmxlKHBzeSwgcHJvcGVydHkpID4gMCkKKwkJCWlmIChwc3ktPmRlc2MtPnByb3BlcnR5X2lzX3dyaXRlYWJsZSAmJgorCQkJICAgIHBvd2VyX3N1cHBseV9wcm9wZXJ0eV9pc193cml0ZWFibGUocHN5LCBwcm9wZXJ0eSkgPiAwKQogCQkJCW1vZGUgfD0gU19JV1VTUjsKIAogCQkJcmV0dXJuIG1vZGU7CkBAIC0yNzksMTQgKzI3OSwxNCBAQAogCiAJZGV2X2RiZyhkZXYsICJ1ZXZlbnRcbiIpOwogCi0JaWYgKCFwc3kgfHwgIXBzeS0+ZGV2KSB7CisJaWYgKCFwc3kgfHwgIXBzeS0+ZGVzYykgewogCQlkZXZfZGJnKGRldiwgIk5vIHBvd2VyIHN1cHBseSB5ZXRcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCWRldl9kYmcoZGV2LCAiUE9XRVJfU1VQUExZX05BTUU9JXNcbiIsIHBzeS0+bmFtZSk7CisJZGV2X2RiZyhkZXYsICJQT1dFUl9TVVBQTFlfTkFNRT0lc1xuIiwgcHN5LT5kZXNjLT5uYW1lKTsKIAotCXJldCA9IGFkZF91ZXZlbnRfdmFyKGVudiwgIlBPV0VSX1NVUFBMWV9OQU1FPSVzIiwgcHN5LT5uYW1lKTsKKwlyZXQgPSBhZGRfdWV2ZW50X3ZhcihlbnYsICJQT1dFUl9TVVBQTFlfTkFNRT0lcyIsIHBzeS0+ZGVzYy0+bmFtZSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMjk0LDExICsyOTQsMTEgQEAKIAlpZiAoIXByb3BfYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWZvciAoaiA9IDA7IGogPCBwc3ktPm51bV9wcm9wZXJ0aWVzOyBqKyspIHsKKwlmb3IgKGogPSAwOyBqIDwgcHN5LT5kZXNjLT5udW1fcHJvcGVydGllczsgaisrKSB7CiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyOwogCQljaGFyICpsaW5lOwogCi0JCWF0dHIgPSAmcG93ZXJfc3VwcGx5X2F0dHJzW3BzeS0+cHJvcGVydGllc1tqXV07CisJCWF0dHIgPSAmcG93ZXJfc3VwcGx5X2F0dHJzW3BzeS0+ZGVzYy0+cHJvcGVydGllc1tqXV07CiAKIAkJcmV0ID0gcG93ZXJfc3VwcGx5X3Nob3dfcHJvcGVydHkoZGV2LCBhdHRyLCBwcm9wX2J1Zik7CiAJCWlmIChyZXQgPT0gLUVOT0RFViB8fCByZXQgPT0gLUVOT0RBVEEpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvS2NvbmZpZyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvS2NvbmZpZwppbmRleCAyN2Y2NjQ2Li5hYWQ5YzMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L0tjb25maWcKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9LY29uZmlnCkBAIC0xNTEsOSArMTUxLDE3IEBACiAJaGVscAogCSAgUmVib290IHN1cHBvcnQgZm9yIGdlbmVyaWMgU1lTQ09OIG1hcHBlZCByZWdpc3RlciByZXNldC4KIAorY29uZmlnIFBPV0VSX1JFU0VUX1NZU0NPTl9QT1dFUk9GRgorCWJvb2wgIkdlbmVyaWMgU1lTQ09OIHJlZ21hcCBwb3dlcm9mZiBkcml2ZXIiCisJZGVwZW5kcyBvbiBPRgorCXNlbGVjdCBNRkRfU1lTQ09OCisJaGVscAorCSAgUG93ZXJvZmYgc3VwcG9ydCBmb3IgZ2VuZXJpYyBTWVNDT04gbWFwcGVkIHJlZ2lzdGVyIHBvd2Vyb2ZmLgorCiBjb25maWcgUE9XRVJfUkVTRVRfUk1PQklMRQogCXRyaXN0YXRlICJSZW5lc2FzIFItTW9iaWxlIHJlc2V0IGRyaXZlciIKIAlkZXBlbmRzIG9uIEFSQ0hfUk1PQklMRSB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEhBU19JT01FTQogCWhlbHAKIAkgIFJlYm9vdCBzdXBwb3J0IGZvciBSZW5lc2FzIFItTW9iaWxlIGFuZCBTSC1Nb2JpbGUgU29Dcy4KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9yZXNldC9NYWtlZmlsZSBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvTWFrZWZpbGUKaW5kZXggMTFkZTE1Yi4uZGJlMDZjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9yZXNldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L01ha2VmaWxlCkBAIC0xNyw0ICsxNyw1IEBACiBvYmotJChDT05GSUdfUE9XRVJfUkVTRVRfWEdFTkUpICs9IHhnZW5lLXJlYm9vdC5vCiBvYmotJChDT05GSUdfUE9XRVJfUkVTRVRfS0VZU1RPTkUpICs9IGtleXN0b25lLXJlc2V0Lm8KIG9iai0kKENPTkZJR19QT1dFUl9SRVNFVF9TWVNDT04pICs9IHN5c2Nvbi1yZWJvb3Qubworb2JqLSQoQ09ORklHX1BPV0VSX1JFU0VUX1NZU0NPTl9QT1dFUk9GRikgKz0gc3lzY29uLXBvd2Vyb2ZmLm8KIG9iai0kKENPTkZJR19QT1dFUl9SRVNFVF9STU9CSUxFKSArPSBybW9iaWxlLXJlc2V0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvYXQ5MS1wb3dlcm9mZi5jIGIvZHJpdmVycy9wb3dlci9yZXNldC9hdDkxLXBvd2Vyb2ZmLmMKaW5kZXggNGI3MmVhNS4uOTg0N2NmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9yZXNldC9hdDkxLXBvd2Vyb2ZmLmMKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9hdDkxLXBvd2Vyb2ZmLmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBhdDkxX3Bvd2Vyb2ZmX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhdDkxX3Bvd2Vyb2ZmX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC1zaGR3YyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOXJsLXNoZHdjIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05eDUtc2hkd2MiLCB9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9yZXNldC9hdDkxLXJlc2V0LmMgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L2F0OTEtcmVzZXQuYwppbmRleCAxMzU4NGUyLi4wMWM3MDU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L2F0OTEtcmVzZXQuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L2F0OTEtcmVzZXQuYwpAQCAtNzMsOCArNzMsOCBAQAogCQk6ICJyIiAoYXQ5MV9yYW1jX2Jhc2VbMF0pLAogCQkgICJyIiAoYXQ5MV9yc3RjX2Jhc2UpLAogCQkgICJyIiAoMSksCi0JCSAgInIiIChBVDkxX1NEUkFNQ19MUENCX1BPV0VSX0RPV04pLAotCQkgICJyIiAoQVQ5MV9SU1RDX0tFWSB8IEFUOTFfUlNUQ19QRVJSU1QgfCBBVDkxX1JTVENfUFJPQ1JTVCkpOworCQkgICJyIiBjcHVfdG9fbGUzMihBVDkxX1NEUkFNQ19MUENCX1BPV0VSX0RPV04pLAorCQkgICJyIiBjcHVfdG9fbGUzMihBVDkxX1JTVENfS0VZIHwgQVQ5MV9SU1RDX1BFUlJTVCB8IEFUOTFfUlNUQ19QUk9DUlNUKSk7CiAKIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CkBAIC0xMTYsOCArMTE2LDggQEAKIAkJICAiciIgKGF0OTFfcmFtY19iYXNlWzFdKSwKIAkJICAiciIgKGF0OTFfcnN0Y19iYXNlKSwKIAkJICAiciIgKDEpLAotCQkgICJyIiAoQVQ5MV9ERFJTRFJDX0xQQ0JfUE9XRVJfRE9XTiksCi0JCSAgInIiIChBVDkxX1JTVENfS0VZIHwgQVQ5MV9SU1RDX1BFUlJTVCB8IEFUOTFfUlNUQ19QUk9DUlNUKQorCQkgICJyIiBjcHVfdG9fbGUzMihBVDkxX0REUlNEUkNfTFBDQl9QT1dFUl9ET1dOKSwKKwkJICAiciIgY3B1X3RvX2xlMzIoQVQ5MV9SU1RDX0tFWSB8IEFUOTFfUlNUQ19QRVJSU1QgfCBBVDkxX1JTVENfUFJPQ1JTVCkKIAkJOiAicjAiKTsKIAogCXJldHVybiBOT1RJRllfRE9ORTsKQEAgLTE1MiwxNCArMTUyLDE0IEBACiAJcHJfaW5mbygiQVQ5MTogU3RhcnRpbmcgYWZ0ZXIgJXNcbiIsIHJlYXNvbik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF0OTFfcmFtY19vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXQ5MV9yYW1jX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJhdG1lbCxhdDkxc2FtOTI2MC1zZHJhbWMiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiYXRtZWwsYXQ5MXNhbTlnNDUtZGRyYW1jIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gImF0bWVsLHNhbWE1ZDMtZGRyYW1jIiwgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF0OTFfcmVzZXRfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGF0OTFfcmVzZXRfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05MjYwLXJzdGMiLCAuZGF0YSA9IGF0OTFzYW05MjYwX3Jlc3RhcnQgfSwKIAl7IC5jb21wYXRpYmxlID0gImF0bWVsLGF0OTFzYW05ZzQ1LXJzdGMiLCAuZGF0YSA9IGF0OTFzYW05ZzQ1X3Jlc3RhcnQgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvaGlzaS1yZWJvb3QuYyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvaGlzaS1yZWJvb3QuYwppbmRleCA1Mzg1NDYwLi45YWI3ZjU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L2hpc2ktcmVib290LmMKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9oaXNpLXJlYm9vdC5jCkBAIC02NCw3ICs2NCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgaGlzaV9yZWJvb3Rfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGhpc2lfcmVib290X29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJoaXNpbGljb24sc3lzY3RybCIgfSwKIAl7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQva2V5c3RvbmUtcmVzZXQuYyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQva2V5c3RvbmUtcmVzZXQuYwppbmRleCBmYWVkZjE2Li5jNzBmMWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L2tleXN0b25lLXJlc2V0LmMKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9rZXlzdG9uZS1yZXNldC5jCkBAIC03MCw3ICs3MCw3IEBACiAJLnByaW9yaXR5ID0gMTI4LAogfTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcnNjdHJsX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByc2N0cmxfb2ZfbWF0Y2hbXSA9IHsKIAl7LmNvbXBhdGlibGUgPSAidGksa2V5c3RvbmUtcmVzZXQiLCB9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcmVzZXQvc3QtcG93ZXJvZmYuYyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvc3QtcG93ZXJvZmYuYwppbmRleCAyNzM4M2RlLi5hNDg4ODc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3N0LXBvd2Vyb2ZmLmMKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9zdC1wb3dlcm9mZi5jCkBAIC05Nyw3ICs5Nyw3IEBACiAJLnByaW9yaXR5ID0gMTkyLAogfTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgc3RfcmVzZXRfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0X3Jlc2V0X29mX21hdGNoW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJzdCxzdGloNDE1LXJlc3RhcnQiLAogCQkuZGF0YSA9ICh2b2lkICopJnN0aWg0MTVfcmVzZXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3N5c2Nvbi1wb3dlcm9mZi5jIGIvZHJpdmVycy9wb3dlci9yZXNldC9zeXNjb24tcG93ZXJvZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTYwYjBkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9yZXNldC9zeXNjb24tcG93ZXJvZmYuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIEdlbmVyaWMgU3lzY29uIFBvd2Vyb2ZmIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgTmF0aW9uYWwgSW5zdHJ1bWVudHMgQ29ycC4KKyAqIEF1dGhvcjogTW9yaXR6IEZpc2NoZXIgPG1vcml0ei5maXNjaGVyQGV0dHVzLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCitzdGF0aWMgc3RydWN0IHJlZ21hcCAqbWFwOworc3RhdGljIHUzMiBvZmZzZXQ7CitzdGF0aWMgdTMyIG1hc2s7CisKK3ZvaWQgc3lzY29uX3Bvd2Vyb2ZmKHZvaWQpCit7CisJLyogSXNzdWUgdGhlIHBvd2Vyb2ZmICovCisJcmVnbWFwX3dyaXRlKG1hcCwgb2Zmc2V0LCBtYXNrKTsKKworCW1kZWxheSgxMDAwKTsKKworCXByX2VtZXJnKCJVbmFibGUgdG8gcG93ZXJvZmYgc3lzdGVtXG4iKTsKK30KKworc3RhdGljIGludCBzeXNjb25fcG93ZXJvZmZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljaGFyIHN5bW5hbWVbS1NZTV9OQU1FX0xFTl07CisKKwltYXAgPSBzeXNjb25fcmVnbWFwX2xvb2t1cF9ieV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAicmVnbWFwIik7CisJaWYgKElTX0VSUihtYXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBnZXQgc3lzY29uIik7CisJCXJldHVybiBQVFJfRVJSKG1hcCk7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAib2Zmc2V0IiwgJm9mZnNldCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHJlYWQgJ29mZnNldCciKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAibWFzayIsICZtYXNrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmVhZCAnbWFzayciKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBtX3Bvd2VyX29mZikgeworCQlsb29rdXBfc3ltYm9sX25hbWUoKHVsb25nKXBtX3Bvd2VyX29mZiwgc3ltbmFtZSk7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJInBtX3Bvd2VyX29mZiBhbHJlYWR5IGNsYWltZWQgJXAgJXMiLAorCQlwbV9wb3dlcl9vZmYsIHN5bW5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXBtX3Bvd2VyX29mZiA9IHN5c2Nvbl9wb3dlcm9mZjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN5c2Nvbl9wb3dlcm9mZl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpZiAocG1fcG93ZXJfb2ZmID09IHN5c2Nvbl9wb3dlcm9mZikKKwkJcG1fcG93ZXJfb2ZmID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzeXNjb25fcG93ZXJvZmZfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInN5c2Nvbi1wb3dlcm9mZiIgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3lzY29uX3Bvd2Vyb2ZmX2RyaXZlciA9IHsKKwkucHJvYmUgPSBzeXNjb25fcG93ZXJvZmZfcHJvYmUsCisJLnJlbW92ZSA9IHN5c2Nvbl9wb3dlcm9mZl9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic3lzY29uLXBvd2Vyb2ZmIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gc3lzY29uX3Bvd2Vyb2ZmX29mX21hdGNoLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzeXNjb25fcG93ZXJvZmZfcmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzeXNjb25fcG93ZXJvZmZfZHJpdmVyKTsKK30KK2RldmljZV9pbml0Y2FsbChzeXNjb25fcG93ZXJvZmZfcmVnaXN0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9yZXNldC9zeXNjb24tcmVib290LmMgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3N5c2Nvbi1yZWJvb3QuYwppbmRleCBjNDA0OWY0Li5kM2M3ZDI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3N5c2Nvbi1yZWJvb3QuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3N5c2Nvbi1yZWJvb3QuYwpAQCAtNzYsNyArNzYsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN5c2Nvbl9yZWJvb3Rfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN5c2Nvbl9yZWJvb3Rfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInN5c2Nvbi1yZWJvb3QiIH0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3ZleHByZXNzLXBvd2Vyb2ZmLmMgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3ZleHByZXNzLXBvd2Vyb2ZmLmMKaW5kZXggYmUxMmQ5Yi4uNmE5YmY3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9yZXNldC92ZXhwcmVzcy1wb3dlcm9mZi5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQvdmV4cHJlc3MtcG93ZXJvZmYuYwpAQCAtODAsNyArODAsNyBAQAogCiBlbnVtIHZleHByZXNzX3Jlc2V0X2Z1bmMgeyBGVU5DX1JFU0VULCBGVU5DX1NIVVRET1dOLCBGVU5DX1JFQk9PVCB9OwogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCB2ZXhwcmVzc19yZXNldF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdmV4cHJlc3NfcmVzZXRfb2ZfbWF0Y2hbXSA9IHsKIAl7CiAJCS5jb21wYXRpYmxlID0gImFybSx2ZXhwcmVzcy1yZXNldCIsCiAJCS5kYXRhID0gKHZvaWQgKilGVU5DX1JFU0VULApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9yZXNldC94Z2VuZS1yZWJvb3QuYyBiL2RyaXZlcnMvcG93ZXIvcmVzZXQveGdlbmUtcmVib290LmMKaW5kZXggYjBlNTAwMi4uZjA3ZTkzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9yZXNldC94Z2VuZS1yZWJvb3QuYworKysgYi9kcml2ZXJzL3Bvd2VyL3Jlc2V0L3hnZW5lLXJlYm9vdC5jCkBAIC04Nyw3ICs4Nyw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgeGdlbmVfcmVib290X29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB4Z2VuZV9yZWJvb3Rfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImFwbSx4Z2VuZS1yZWJvb3QiIH0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3J0NTAzM19iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3J0NTAzM19iYXR0ZXJ5LmMKaW5kZXggN2I4OThmNC4uYTdhNjg3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9ydDUwMzNfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvcnQ1MDMzX2JhdHRlcnkuYwpAQCAtNzIsOCArNzIsNyBAQAogCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IHJ0NTAzM19iYXR0ZXJ5ICpiYXR0ZXJ5ID0gY29udGFpbmVyX29mKHBzeSwKLQkJCQlzdHJ1Y3QgcnQ1MDMzX2JhdHRlcnksIHBzeSk7CisJc3RydWN0IHJ0NTAzM19iYXR0ZXJ5ICpiYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAlzd2l0Y2ggKHBzcCkgewogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9OT1c6CkBAIC0xMDIsMTYgKzEwMSwyNSBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAogfTsKIAotc3RhdGljIHN0cnVjdCByZWdtYXBfY29uZmlnIHJ0NTAzM19iYXR0ZXJ5X3JlZ21hcF9jb25maWcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgcnQ1MDMzX2JhdHRlcnlfcmVnbWFwX2NvbmZpZyA9IHsKIAkucmVnX2JpdHMJPSA4LAogCS52YWxfYml0cwk9IDgsCiAJLm1heF9yZWdpc3Rlcgk9IFJUNTAzM19GVUVMX1JFR19FTkQsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHJ0NTAzM19iYXR0ZXJ5X2Rlc2MgPSB7CisJLm5hbWUJCT0gInJ0NTAzMy1iYXR0ZXJ5IiwKKwkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5nZXRfcHJvcGVydHkJPSBydDUwMzNfYmF0dGVyeV9nZXRfcHJvcGVydHksCisJLnByb3BlcnRpZXMJPSBydDUwMzNfYmF0dGVyeV9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKHJ0NTAzM19iYXR0ZXJ5X3Byb3BzKSwKK307CisKIHN0YXRpYyBpbnQgcnQ1MDMzX2JhdHRlcnlfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IHRvX2kyY19hZGFwdGVyKGNsaWVudC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgcHN5X2NmZyA9IHt9OwogCXN0cnVjdCBydDUwMzNfYmF0dGVyeSAqYmF0dGVyeTsKIAl1MzIgcmV0OwogCkBAIC0xMzEsMTYgKzEzOSwxMyBAQAogCX0KIAogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGJhdHRlcnkpOworCXBzeV9jZmcuZHJ2X2RhdGEgPSBiYXR0ZXJ5OwogCi0JYmF0dGVyeS0+cHN5Lm5hbWUJCT0gInJ0NTAzMy1iYXR0ZXJ5IjsKLQliYXR0ZXJ5LT5wc3kudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCWJhdHRlcnktPnBzeS5nZXRfcHJvcGVydHkJPSBydDUwMzNfYmF0dGVyeV9nZXRfcHJvcGVydHk7Ci0JYmF0dGVyeS0+cHN5LnByb3BlcnRpZXMJCT0gcnQ1MDMzX2JhdHRlcnlfcHJvcHM7Ci0JYmF0dGVyeS0+cHN5Lm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShydDUwMzNfYmF0dGVyeV9wcm9wcyk7Ci0KLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmYmF0dGVyeS0+cHN5KTsKLQlpZiAocmV0KSB7CisJYmF0dGVyeS0+cHN5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKKwkJCQkJICAgICAmcnQ1MDMzX2JhdHRlcnlfZGVzYywgJnBzeV9jZmcpOworCWlmIChJU19FUlIoYmF0dGVyeS0+cHN5KSkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBwb3dlciBzdXBwbHlcbiIpOworCQlyZXQgPSBQVFJfRVJSKGJhdHRlcnktPnBzeSk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xNTEsNyArMTU2LDcgQEAKIHsKIAlzdHJ1Y3QgcnQ1MDMzX2JhdHRlcnkgKmJhdHRlcnkgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZiYXR0ZXJ5LT5wc3kpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGJhdHRlcnktPnBzeSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvcng1MV9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3J4NTFfYmF0dGVyeS5jCmluZGV4IGEwMWFhY2IuLmFjNjIwNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvcng1MV9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9yeDUxX2JhdHRlcnkuYwpAQCAtMjksNyArMjksOCBAQAogCiBzdHJ1Y3Qgcng1MV9kZXZpY2VfaW5mbyB7CiAJc3RydWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdDsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYmF0X2Rlc2M7CiAJc3RydWN0IGlpb19jaGFubmVsICpjaGFubmVsX3RlbXA7CiAJc3RydWN0IGlpb19jaGFubmVsICpjaGFubmVsX2JzaTsKIAlzdHJ1Y3QgaWlvX2NoYW5uZWwgKmNoYW5uZWxfdmJhdDsKQEAgLTE2MSw4ICsxNjIsNyBAQAogCQkJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IHJ4NTFfZGV2aWNlX2luZm8gKmRpID0gY29udGFpbmVyX29mKChwc3kpLAotCQkJCXN0cnVjdCByeDUxX2RldmljZV9pbmZvLCBiYXQpOworCXN0cnVjdCByeDUxX2RldmljZV9pbmZvICpkaSA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFQ0hOT0xPR1k6CkBAIC0yMDQsNiArMjA0LDcgQEAKIAogc3RhdGljIGludCByeDUxX2JhdHRlcnlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAJc3RydWN0IHJ4NTFfZGV2aWNlX2luZm8gKmRpOwogCWludCByZXQ7CiAKQEAgLTIxNCwxMSArMjE1LDEzIEBACiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGkpOwogCiAJZGktPmRldiA9ICZwZGV2LT5kZXY7Ci0JZGktPmJhdC5uYW1lID0gZGV2X25hbWUoJnBkZXYtPmRldik7Ci0JZGktPmJhdC50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQlkaS0+YmF0LnByb3BlcnRpZXMgPSByeDUxX2JhdHRlcnlfcHJvcHM7Ci0JZGktPmJhdC5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUocng1MV9iYXR0ZXJ5X3Byb3BzKTsKLQlkaS0+YmF0LmdldF9wcm9wZXJ0eSA9IHJ4NTFfYmF0dGVyeV9nZXRfcHJvcGVydHk7CisJZGktPmJhdF9kZXNjLm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKKwlkaS0+YmF0X2Rlc2MudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7CisJZGktPmJhdF9kZXNjLnByb3BlcnRpZXMgPSByeDUxX2JhdHRlcnlfcHJvcHM7CisJZGktPmJhdF9kZXNjLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShyeDUxX2JhdHRlcnlfcHJvcHMpOworCWRpLT5iYXRfZGVzYy5nZXRfcHJvcGVydHkgPSByeDUxX2JhdHRlcnlfZ2V0X3Byb3BlcnR5OworCisJcHN5X2NmZy5kcnZfZGF0YSA9IGRpOwogCiAJZGktPmNoYW5uZWxfdGVtcCA9IGlpb19jaGFubmVsX2dldChkaS0+ZGV2LCAidGVtcCIpOwogCWlmIChJU19FUlIoZGktPmNoYW5uZWxfdGVtcCkpIHsKQEAgLTIzOCw5ICsyNDEsMTEgQEAKIAkJZ290byBlcnJvcl9jaGFubmVsX2JzaTsKIAl9CiAKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGktPmRldiwgJmRpLT5iYXQpOwotCWlmIChyZXQpCisJZGktPmJhdCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcihkaS0+ZGV2LCAmZGktPmJhdF9kZXNjLCAmcHN5X2NmZyk7CisJaWYgKElTX0VSUihkaS0+YmF0KSkgeworCQlyZXQgPSBQVFJfRVJSKGRpLT5iYXQpOwogCQlnb3RvIGVycm9yX2NoYW5uZWxfdmJhdDsKKwl9CiAKIAlyZXR1cm4gMDsKIApAQCAtMjU5LDcgKzI2NCw3IEBACiB7CiAJc3RydWN0IHJ4NTFfZGV2aWNlX2luZm8gKmRpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmZGktPmJhdCk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoZGktPmJhdCk7CiAKIAlpaW9fY2hhbm5lbF9yZWxlYXNlKGRpLT5jaGFubmVsX3ZiYXQpOwogCWlpb19jaGFubmVsX3JlbGVhc2UoZGktPmNoYW5uZWxfYnNpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvczNjX2FkY19iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3MzY19hZGNfYmF0dGVyeS5jCmluZGV4IDU5NDhjZTAuLjBmZmU1Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvczNjX2FkY19iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9zM2NfYWRjX2JhdHRlcnkuYwpAQCAtMjgsNyArMjgsNyBAQAogI2RlZmluZSBKSVRURVJfREVMQVkJCQk1MDAgLyogbXMgKi8KIAogc3RydWN0IHMzY19hZGNfYmF0IHsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5CQlwc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseQkJKnBzeTsKIAlzdHJ1Y3QgczNjX2FkY19jbGllbnQJCSpjbGllbnQ7CiAJc3RydWN0IHMzY19hZGNfYmF0X3BkYXRhCSpwZGF0YTsKIAlpbnQJCQkJdm9sdF92YWx1ZTsKQEAgLTczLDEwICs3MywxMCBAQAogCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBzM2NfYWRjX2JhdCAqYmF0ID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IHMzY19hZGNfYmF0LCBwc3kpOworCXN0cnVjdCBzM2NfYWRjX2JhdCAqYmF0ID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAKIAlpZiAoIWJhdCkgewotCQlkZXZfZXJyKHBzeS0+ZGV2LCAiJXM6IG5vIGJhdHRlcnkgaW5mb3MgPyFcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2VycigmcHN5LT5kZXYsICIlczogbm8gYmF0dGVyeSBpbmZvcyA/IVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEwNSwxNyArMTA1LDE3IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHMzY19hZGNfYmF0IGJhY2t1cF9iYXQgPSB7Ci0JLnBzeSA9IHsKLQkJLm5hbWUJCT0gImJhY2t1cC1iYXR0ZXJ5IiwKLQkJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKLQkJLnByb3BlcnRpZXMJPSBzM2NfYWRjX2JhY2t1cF9iYXRfcHJvcHMsCi0JCS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoczNjX2FkY19iYWNrdXBfYmF0X3Byb3BzKSwKLQkJLmdldF9wcm9wZXJ0eQk9IHMzY19hZGNfYmFja3VwX2JhdF9nZXRfcHJvcGVydHksCi0JCS51c2VfZm9yX2FwbQk9IDEsCi0JfSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYmFja3VwX2JhdF9kZXNjID0geworCS5uYW1lCQk9ICJiYWNrdXAtYmF0dGVyeSIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwk9IHMzY19hZGNfYmFja3VwX2JhdF9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHMzY19hZGNfYmFja3VwX2JhdF9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IHMzY19hZGNfYmFja3VwX2JhdF9nZXRfcHJvcGVydHksCisJLnVzZV9mb3JfYXBtCT0gMSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgczNjX2FkY19iYXQgYmFja3VwX2JhdDsKKwogc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHMzY19hZGNfbWFpbl9iYXRfcHJvcHNbXSA9IHsKIAlQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVMsCiAJUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX0ZVTExfREVTSUdOLApAQCAtMTQxLDcgKzE0MSw3IEBACiAJCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgczNjX2FkY19iYXQgKmJhdCA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBzM2NfYWRjX2JhdCwgcHN5KTsKKwlzdHJ1Y3QgczNjX2FkY19iYXQgKmJhdCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJaW50IG5ld19sZXZlbDsKIAlpbnQgZnVsbF92b2x0OwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAJdW5zaWduZWQgaW50IGx1dF9zaXplOwogCiAJaWYgKCFiYXQpIHsKLQkJZGV2X2Vycihwc3ktPmRldiwgIm5vIGJhdHRlcnkgaW5mb3MgPyFcbiIpOworCQlkZXZfZXJyKCZwc3ktPmRldiwgIm5vIGJhdHRlcnkgaW5mb3MgPyFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIzMiwxOCArMjMyLDE4IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHMzY19hZGNfYmF0IG1haW5fYmF0ID0gewotCS5wc3kgPSB7Ci0JCS5uYW1lCQkJPSAibWFpbi1iYXR0ZXJ5IiwKLQkJLnR5cGUJCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCi0JCS5wcm9wZXJ0aWVzCQk9IHMzY19hZGNfbWFpbl9iYXRfcHJvcHMsCi0JCS5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKHMzY19hZGNfbWFpbl9iYXRfcHJvcHMpLAotCQkuZ2V0X3Byb3BlcnR5CQk9IHMzY19hZGNfYmF0X2dldF9wcm9wZXJ0eSwKLQkJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSBzM2NfYWRjX2JhdF9leHRfcG93ZXJfY2hhbmdlZCwKLQkJLnVzZV9mb3JfYXBtCQk9IDEsCi0JfSwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbWFpbl9iYXRfZGVzYyA9IHsKKwkubmFtZQkJCT0gIm1haW4tYmF0dGVyeSIsCisJLnR5cGUJCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCisJLnByb3BlcnRpZXMJCT0gczNjX2FkY19tYWluX2JhdF9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJCT0gQVJSQVlfU0laRShzM2NfYWRjX21haW5fYmF0X3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CQk9IHMzY19hZGNfYmF0X2dldF9wcm9wZXJ0eSwKKwkuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9IHMzY19hZGNfYmF0X2V4dF9wb3dlcl9jaGFuZ2VkLAorCS51c2VfZm9yX2FwbQkJPSAxLAogfTsKIAorc3RhdGljIHN0cnVjdCBzM2NfYWRjX2JhdCBtYWluX2JhdDsKKwogc3RhdGljIHZvaWQgczNjX2FkY19iYXRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHMzY19hZGNfYmF0ICpiYXQgPSAmbWFpbl9iYXQ7CkBAIC0yNTEsNyArMjUxLDcgQEAKIAlpbnQgaXNfcGx1Z2dlZDsKIAlzdGF0aWMgaW50IHdhc19wbHVnZ2VkOwogCi0JaXNfcGx1Z2dlZCA9IHBvd2VyX3N1cHBseV9hbV9pX3N1cHBsaWVkKCZiYXQtPnBzeSk7CisJaXNfcGx1Z2dlZCA9IHBvd2VyX3N1cHBseV9hbV9pX3N1cHBsaWVkKGJhdC0+cHN5KTsKIAliYXQtPmNhYmxlX3BsdWdnZWQgPSBpc19wbHVnZ2VkOwogCWlmIChpc19wbHVnZ2VkICE9IHdhc19wbHVnZ2VkKSB7CiAJCXdhc19wbHVnZ2VkID0gaXNfcGx1Z2dlZDsKQEAgLTI3OSw3ICsyNzksNyBAQAogCQl9CiAJfQogCi0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmJhdC0+cHN5KTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChiYXQtPnBzeSk7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCBzM2NfYWRjX2JhdF9jaGFyZ2VkKGludCBpcnEsIHZvaWQgKmRldl9pZCkKQEAgLTMxMCwxNiArMzEwLDI1IEBACiAJbWFpbl9iYXQuY2FibGVfcGx1Z2dlZCA9IDA7CiAJbWFpbl9iYXQuc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORzsKIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmbWFpbl9iYXQucHN5KTsKLQlpZiAocmV0KQorCW1haW5fYmF0LnBzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmbWFpbl9iYXRfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUihtYWluX2JhdC5wc3kpKSB7CisJCXJldCA9IFBUUl9FUlIobWFpbl9iYXQucHN5KTsKIAkJZ290byBlcnJfcmVnX21haW47CisJfQogCWlmIChwZGF0YS0+YmFja3VwX3ZvbHRfbXVsdCkgeworCQljb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnCisJCQkJCQk9IHsgLmRydl9kYXRhID0gJmJhY2t1cF9iYXQsIH07CisKIAkJYmFja3VwX2JhdC5jbGllbnQgPSBjbGllbnQ7CiAJCWJhY2t1cF9iYXQucGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAkJYmFja3VwX2JhdC52b2x0X3ZhbHVlID0gLTE7Ci0JCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmYmFja3VwX2JhdC5wc3kpOwotCQlpZiAocmV0KQorCQliYWNrdXBfYmF0LnBzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAorCQkJCQkJICAgICAgICZiYWNrdXBfYmF0X2Rlc2MsCisJCQkJCQkgICAgICAgJnBzeV9jZmcpOworCQlpZiAoSVNfRVJSKGJhY2t1cF9iYXQucHN5KSkgeworCQkJcmV0ID0gUFRSX0VSUihiYWNrdXBfYmF0LnBzeSk7CiAJCQlnb3RvIGVycl9yZWdfYmFja3VwOworCQl9CiAJfQogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmJhdF93b3JrLCBzM2NfYWRjX2JhdF93b3JrKTsKQEAgLTM2MCw5ICszNjksOSBAQAogCQlncGlvX2ZyZWUocGRhdGEtPmdwaW9fY2hhcmdlX2ZpbmlzaGVkKTsKIGVycl9ncGlvOgogCWlmIChwZGF0YS0+YmFja3VwX3ZvbHRfbXVsdCkKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmJhY2t1cF9iYXQucHN5KTsKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYmFja3VwX2JhdC5wc3kpOwogZXJyX3JlZ19iYWNrdXA6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJm1haW5fYmF0LnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIobWFpbl9iYXQucHN5KTsKIGVycl9yZWdfbWFpbjoKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzcyLDkgKzM4MSw5IEBACiAJc3RydWN0IHMzY19hZGNfY2xpZW50ICpjbGllbnQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgczNjX2FkY19iYXRfcGRhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmbWFpbl9iYXQucHN5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihtYWluX2JhdC5wc3kpOwogCWlmIChwZGF0YS0+YmFja3VwX3ZvbHRfbXVsdCkKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmJhY2t1cF9iYXQucHN5KTsKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYmFja3VwX2JhdC5wc3kpOwogCiAJczNjX2FkY19yZWxlYXNlKGNsaWVudCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvc2JzLWJhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvc2JzLWJhdHRlcnkuYwppbmRleCBjN2I3YjQwLi5kZTExNzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Nicy1iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9zYnMtYmF0dGVyeS5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIAogc3RydWN0IHNic19pbmZvIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudAkJKmNsaWVudDsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5CQlwb3dlcl9zdXBwbHk7CisJc3RydWN0IHBvd2VyX3N1cHBseQkJKnBvd2VyX3N1cHBseTsKIAlzdHJ1Y3Qgc2JzX3BsYXRmb3JtX2RhdGEJKnBkYXRhOwogCWJvb2wJCQkJaXNfcHJlc2VudDsKIAlib29sCQkJCWdwaW9fZGV0ZWN0OwpAQCAtMzkxLDcgKzM5MSw3IEBACiAJCQljaGlwLT5sYXN0X3N0YXRlID0gdmFsLT5pbnR2YWw7CiAJCWVsc2UgaWYgKGNoaXAtPmxhc3Rfc3RhdGUgIT0gdmFsLT5pbnR2YWwpIHsKIAkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY2hpcC0+d29yayk7Ci0JCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmY2hpcC0+cG93ZXJfc3VwcGx5KTsKKwkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoaXAtPnBvd2VyX3N1cHBseSk7CiAJCQljaGlwLT5wb2xsX3RpbWUgPSAwOwogCQl9CiAJfSBlbHNlIHsKQEAgLTU1Niw4ICs1NTYsNyBAQAogCXVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNic19pbmZvICpjaGlwID0gY29udGFpbmVyX29mKHBzeSwKLQkJCQlzdHJ1Y3Qgc2JzX2luZm8sIHBvd2VyX3N1cHBseSk7CisJc3RydWN0IHNic19pbmZvICpjaGlwID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IGNoaXAtPmNsaWVudDsKIAogCXN3aXRjaCAocHNwKSB7CkBAIC02MzgsNyArNjM3LDcgQEAKIAlpZiAoIWNoaXAtPmdwaW9fZGV0ZWN0ICYmCiAJCWNoaXAtPmlzX3ByZXNlbnQgIT0gKHJldCA+PSAwKSkgewogCQljaGlwLT5pc19wcmVzZW50ID0gKHJldCA+PSAwKTsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmNoaXAtPnBvd2VyX3N1cHBseSk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoaXAtPnBvd2VyX3N1cHBseSk7CiAJfQogCiBkb25lOgpAQCAtNjcxLDkgKzY3MCw3IEBACiAKIHN0YXRpYyB2b2lkIHNic19leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSkKIHsKLQlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXA7Ci0KLQljaGlwID0gY29udGFpbmVyX29mKHBzeSwgc3RydWN0IHNic19pbmZvLCBwb3dlcl9zdXBwbHkpOworCXN0cnVjdCBzYnNfaW5mbyAqY2hpcCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJaWYgKGNoaXAtPmlnbm9yZV9jaGFuZ2VzID4gMCkgewogCQljaGlwLT5pZ25vcmVfY2hhbmdlcy0tOwpAQCAtNzEyLDcgKzcwOSw3IEBACiAKIAlpZiAoY2hpcC0+bGFzdF9zdGF0ZSAhPSByZXQpIHsKIAkJY2hpcC0+cG9sbF90aW1lID0gMDsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmNoaXAtPnBvd2VyX3N1cHBseSk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoaXAtPnBvd2VyX3N1cHBseSk7CiAJCXJldHVybjsKIAl9CiAJaWYgKGNoaXAtPnBvbGxfdGltZSA+IDApIHsKQEAgLTc5Niw0MiArNzkzLDQ4IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBzYnNfZGVmYXVsdF9kZXNjID0geworCS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcyA9IHNic19wcm9wZXJ0aWVzLAorCS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUoc2JzX3Byb3BlcnRpZXMpLAorCS5nZXRfcHJvcGVydHkgPSBzYnNfZ2V0X3Byb3BlcnR5LAorCS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gc2JzX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQsCit9OworCiBzdGF0aWMgaW50IHNic19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKIHsKIAlzdHJ1Y3Qgc2JzX2luZm8gKmNoaXA7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjICpzYnNfZGVzYzsKIAlzdHJ1Y3Qgc2JzX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAJaW50IHJjOwogCWludCBpcnE7Ci0JY2hhciAqbmFtZTsKIAotCW5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgInNicy0lcyIsIGRldl9uYW1lKCZjbGllbnQtPmRldikpOwotCWlmICghbmFtZSkgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkZXZpY2UgbmFtZVxuIik7CisJc2JzX2Rlc2MgPSBkZXZtX2ttZW1kdXAoJmNsaWVudC0+ZGV2LCAmc2JzX2RlZmF1bHRfZGVzYywKKwkJCXNpemVvZigqc2JzX2Rlc2MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNic19kZXNjKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CisKKwlzYnNfZGVzYy0+bmFtZSA9IGRldm1fa2FzcHJpbnRmKCZjbGllbnQtPmRldiwgR0ZQX0tFUk5FTCwgInNicy0lcyIsCisJCQlkZXZfbmFtZSgmY2xpZW50LT5kZXYpKTsKKwlpZiAoIXNic19kZXNjLT5uYW1lKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWNoaXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2JzX2luZm8pLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNoaXApIHsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGV4aXRfZnJlZV9uYW1lOwotCX0KKwlpZiAoIWNoaXApCisJCXJldHVybiAtRU5PTUVNOwogCiAJY2hpcC0+Y2xpZW50ID0gY2xpZW50OwogCWNoaXAtPmVuYWJsZV9kZXRlY3Rpb24gPSBmYWxzZTsKIAljaGlwLT5ncGlvX2RldGVjdCA9IGZhbHNlOwotCWNoaXAtPnBvd2VyX3N1cHBseS5uYW1lID0gbmFtZTsKLQljaGlwLT5wb3dlcl9zdXBwbHkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JY2hpcC0+cG93ZXJfc3VwcGx5LnByb3BlcnRpZXMgPSBzYnNfcHJvcGVydGllczsKLQljaGlwLT5wb3dlcl9zdXBwbHkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHNic19wcm9wZXJ0aWVzKTsKLQljaGlwLT5wb3dlcl9zdXBwbHkuZ2V0X3Byb3BlcnR5ID0gc2JzX2dldF9wcm9wZXJ0eTsKLQljaGlwLT5wb3dlcl9zdXBwbHkub2Zfbm9kZSA9IGNsaWVudC0+ZGV2Lm9mX25vZGU7CisJcHN5X2NmZy5vZl9ub2RlID0gY2xpZW50LT5kZXYub2Zfbm9kZTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gY2hpcDsKIAkvKiBpZ25vcmUgZmlyc3Qgbm90aWZpY2F0aW9uIG9mIGV4dGVybmFsIGNoYW5nZSwgaXQgaXMgZ2VuZXJhdGVkCiAJICogZnJvbSB0aGUgcG93ZXJfc3VwcGx5X3JlZ2lzdGVyIGNhbGwgYmFjawogCSAqLwogCWNoaXAtPmlnbm9yZV9jaGFuZ2VzID0gMTsKIAljaGlwLT5sYXN0X3N0YXRlID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOwotCWNoaXAtPnBvd2VyX3N1cHBseS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gc2JzX2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQ7CiAKIAlwZGF0YSA9IHNic19vZl9wb3B1bGF0ZV9wZGF0YShjbGllbnQpOwogCkBAIC04NzAsNyArODczLDcgQEAKIAogCXJjID0gcmVxdWVzdF9pcnEoaXJxLCBzYnNfaXJxLAogCQlJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0ZBTExJTkcsCi0JCWRldl9uYW1lKCZjbGllbnQtPmRldiksICZjaGlwLT5wb3dlcl9zdXBwbHkpOworCQlkZXZfbmFtZSgmY2xpZW50LT5kZXYpLCBjaGlwLT5wb3dlcl9zdXBwbHkpOwogCWlmIChyYykgewogCQlkZXZfd2FybigmY2xpZW50LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBpcnE6ICVkXG4iLCByYyk7CiAJCWdwaW9fZnJlZShwZGF0YS0+YmF0dGVyeV9kZXRlY3QpOwpAQCAtODkyLDEwICs4OTUsMTIgQEAKIAkJZ290byBleGl0X3BzdXBwbHk7CiAJfQogCi0JcmMgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmY2hpcC0+cG93ZXJfc3VwcGx5KTsKLQlpZiAocmMpIHsKKwljaGlwLT5wb3dlcl9zdXBwbHkgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCBzYnNfZGVzYywKKwkJCQkJCSAgICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGNoaXAtPnBvd2VyX3N1cHBseSkpIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsCiAJCQkiJXM6IEZhaWxlZCB0byByZWdpc3RlciBwb3dlciBzdXBwbHlcbiIsIF9fZnVuY19fKTsKKwkJcmMgPSBQVFJfRVJSKGNoaXAtPnBvd2VyX3N1cHBseSk7CiAJCWdvdG8gZXhpdF9wc3VwcGx5OwogCX0KIApAQCAtOTEwLDE1ICs5MTUsMTIgQEAKIAogZXhpdF9wc3VwcGx5OgogCWlmIChjaGlwLT5pcnEpCi0JCWZyZWVfaXJxKGNoaXAtPmlycSwgJmNoaXAtPnBvd2VyX3N1cHBseSk7CisJCWZyZWVfaXJxKGNoaXAtPmlycSwgY2hpcC0+cG93ZXJfc3VwcGx5KTsKIAlpZiAoY2hpcC0+Z3Bpb19kZXRlY3QpCiAJCWdwaW9fZnJlZShwZGF0YS0+YmF0dGVyeV9kZXRlY3QpOwogCiAJa2ZyZWUoY2hpcCk7CiAKLWV4aXRfZnJlZV9uYW1lOgotCWtmcmVlKG5hbWUpOwotCiAJcmV0dXJuIHJjOwogfQogCkBAIC05MjcsMTUgKzkyOSwxNCBAQAogCXN0cnVjdCBzYnNfaW5mbyAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJaWYgKGNoaXAtPmlycSkKLQkJZnJlZV9pcnEoY2hpcC0+aXJxLCAmY2hpcC0+cG93ZXJfc3VwcGx5KTsKKwkJZnJlZV9pcnEoY2hpcC0+aXJxLCBjaGlwLT5wb3dlcl9zdXBwbHkpOwogCWlmIChjaGlwLT5ncGlvX2RldGVjdCkKIAkJZ3Bpb19mcmVlKGNoaXAtPnBkYXRhLT5iYXR0ZXJ5X2RldGVjdCk7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmY2hpcC0+cG93ZXJfc3VwcGx5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihjaGlwLT5wb3dlcl9zdXBwbHkpOwogCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjaGlwLT53b3JrKTsKIAotCWtmcmVlKGNoaXAtPnBvd2VyX3N1cHBseS5uYW1lKTsKIAlrZnJlZShjaGlwKTsKIAljaGlwID0gTlVMTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zbWIzNDctY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9zbWIzNDctY2hhcmdlci5jCmluZGV4IGFjZjg0ZTguLjBiNjBhMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvc21iMzQ3LWNoYXJnZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL3NtYjM0Ny1jaGFyZ2VyLmMKQEAgLTEzOSw5ICsxMzksOSBAQAogCXN0cnVjdCBtdXRleAkJbG9jazsKIAlzdHJ1Y3QgZGV2aWNlCQkqZGV2OwogCXN0cnVjdCByZWdtYXAJCSpyZWdtYXA7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseQltYWluczsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5CXVzYjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5CWJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseQkqbWFpbnM7CisJc3RydWN0IHBvd2VyX3N1cHBseQkqdXNiOworCXN0cnVjdCBwb3dlcl9zdXBwbHkJKmJhdHRlcnk7CiAJYm9vbAkJCW1haW5zX29ubGluZTsKIAlib29sCQkJdXNiX29ubGluZTsKIAlib29sCQkJY2hhcmdpbmdfZW5hYmxlZDsKQEAgLTc0MSw3ICs3NDEsNyBAQAogCSAqLwogCWlmIChzdGF0X2MgJiBTVEFUX0NfQ0hBUkdFUl9FUlJPUikgewogCQlkZXZfZXJyKHNtYi0+ZGV2LCAiY2hhcmdpbmcgc3RvcHBlZCBkdWUgdG8gY2hhcmdlciBlcnJvclxuIik7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZzbWItPmJhdHRlcnkpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChzbWItPmJhdHRlcnkpOwogCQloYW5kbGVkID0gdHJ1ZTsKIAl9CiAKQEAgLTc1Miw3ICs3NTIsNyBAQAogCSAqLwogCWlmIChpcnFzdGF0X2MgJiAoSVJRU1RBVF9DX1RFUk1JTkFUSU9OX0lSUSB8IElSUVNUQVRfQ19UQVBFUl9JUlEpKSB7CiAJCWlmIChpcnFzdGF0X2MgJiBJUlFTVEFUX0NfVEVSTUlOQVRJT05fU1RBVCkKLQkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZzbWItPmJhdHRlcnkpOworCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoc21iLT5iYXR0ZXJ5KTsKIAkJZGV2X2RiZyhzbWItPmRldiwgImdvaW5nIHRvIEhXIG1haW50ZW5hbmNlIG1vZGVcbiIpOwogCQloYW5kbGVkID0gdHJ1ZTsKIAl9CkBAIC03NjYsNyArNzY2LDcgQEAKIAogCQlpZiAoaXJxc3RhdF9kICYgSVJRU1RBVF9EX0NIQVJHRV9USU1FT1VUX1NUQVQpCiAJCQlkZXZfd2FybihzbWItPmRldiwgImNoYXJnaW5nIHN0b3BwZWQgZHVlIHRvIHRpbWVvdXRcbiIpOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmc21iLT5iYXR0ZXJ5KTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoc21iLT5iYXR0ZXJ5KTsKIAkJaGFuZGxlZCA9IHRydWU7CiAJfQogCkBAIC03NzgsOSArNzc4LDkgQEAKIAkJaWYgKHNtYjM0N191cGRhdGVfcHNfc3RhdHVzKHNtYikgPiAwKSB7CiAJCQlzbWIzNDdfc3RhcnRfc3RvcF9jaGFyZ2luZyhzbWIpOwogCQkJaWYgKHNtYi0+cGRhdGEtPnVzZV9tYWlucykKLQkJCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmc21iLT5tYWlucyk7CisJCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoc21iLT5tYWlucyk7CiAJCQlpZiAoc21iLT5wZGF0YS0+dXNlX3VzYikKLQkJCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmc21iLT51c2IpOworCQkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHNtYi0+dXNiKTsKIAkJfQogCQloYW5kbGVkID0gdHJ1ZTsKIAl9CkBAIC04NDIsNyArODQyLDggQEAKIAkJZ290byBmYWlsOwogCiAJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaXJxLCBOVUxMLCBzbWIzNDdfaW50ZXJydXB0LAotCQkJCSAgIElSUUZfVFJJR0dFUl9GQUxMSU5HLCBjbGllbnQtPm5hbWUsIHNtYik7CisJCQkJICAgSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX09ORVNIT1QsCisJCQkJICAgY2xpZW50LT5uYW1lLCBzbWIpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIGZhaWxfZ3BpbzsKIApAQCAtOTM0LDggKzkzNSw3IEBACiAJCQkJICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwcm9wLAogCQkJCSAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3Qgc21iMzQ3X2NoYXJnZXIgKnNtYiA9Ci0JCWNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBzbWIzNDdfY2hhcmdlciwgbWFpbnMpOworCXN0cnVjdCBzbWIzNDdfY2hhcmdlciAqc21iID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJaW50IHJldDsKIAogCXN3aXRjaCAocHJvcCkgewpAQCAtOTc2LDggKzk3Niw3IEBACiAJCQkJICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHJvcCwKIAkJCQkgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBzbWIzNDdfY2hhcmdlciAqc21iID0KLQkJY29udGFpbmVyX29mKHBzeSwgc3RydWN0IHNtYjM0N19jaGFyZ2VyLCB1c2IpOworCXN0cnVjdCBzbWIzNDdfY2hhcmdlciAqc21iID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJaW50IHJldDsKIAogCXN3aXRjaCAocHJvcCkgewpAQCAtMTA2Myw4ICsxMDYyLDcgQEAKIAkJCQkgICAgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHJvcCwKIAkJCQkgICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3Qgc21iMzQ3X2NoYXJnZXIgKnNtYiA9Ci0JCQljb250YWluZXJfb2YocHN5LCBzdHJ1Y3Qgc21iMzQ3X2NoYXJnZXIsIGJhdHRlcnkpOworCXN0cnVjdCBzbWIzNDdfY2hhcmdlciAqc21iID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSk7CiAJY29uc3Qgc3RydWN0IHNtYjM0N19jaGFyZ2VyX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gc21iLT5wZGF0YTsKIAlpbnQgcmV0OwogCkBAIC0xMTg4LDExICsxMTg2LDM2IEBACiAJLnJlYWRhYmxlX3JlZwk9IHNtYjM0N19yZWFkYWJsZV9yZWcsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHNtYjM0N19tYWluc19kZXNjID0geworCS5uYW1lCQk9ICJzbWIzNDctbWFpbnMiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TLAorCS5nZXRfcHJvcGVydHkJPSBzbWIzNDdfbWFpbnNfZ2V0X3Byb3BlcnR5LAorCS5wcm9wZXJ0aWVzCT0gc21iMzQ3X21haW5zX3Byb3BlcnRpZXMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRShzbWIzNDdfbWFpbnNfcHJvcGVydGllcyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHNtYjM0N191c2JfZGVzYyA9IHsKKwkubmFtZQkJPSAic21iMzQ3LXVzYiIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCLAorCS5nZXRfcHJvcGVydHkJPSBzbWIzNDdfdXNiX2dldF9wcm9wZXJ0eSwKKwkucHJvcGVydGllcwk9IHNtYjM0N191c2JfcHJvcGVydGllcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKHNtYjM0N191c2JfcHJvcGVydGllcyksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHNtYjM0N19iYXR0ZXJ5X2Rlc2MgPSB7CisJLm5hbWUJCT0gInNtYjM0Ny1iYXR0ZXJ5IiwKKwkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5nZXRfcHJvcGVydHkJPSBzbWIzNDdfYmF0dGVyeV9nZXRfcHJvcGVydHksCisJLnByb3BlcnRpZXMJPSBzbWIzNDdfYmF0dGVyeV9wcm9wZXJ0aWVzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUoc21iMzQ3X2JhdHRlcnlfcHJvcGVydGllcyksCit9OworCiBzdGF0aWMgaW50IHNtYjM0N19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAogCQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewogCXN0YXRpYyBjaGFyICpiYXR0ZXJ5W10gPSB7ICJzbWIzNDctYmF0dGVyeSIgfTsKIAljb25zdCBzdHJ1Y3Qgc21iMzQ3X2NoYXJnZXJfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgbWFpbnNfdXNiX2NmZyA9IHt9LCBiYXR0ZXJ5X2NmZyA9IHt9OwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKIAlzdHJ1Y3Qgc21iMzQ3X2NoYXJnZXIgKnNtYjsKIAlpbnQgcmV0OwpAQCAtMTIyMiw0OSArMTI0NSwzNSBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCisJbWFpbnNfdXNiX2NmZy5zdXBwbGllZF90byA9IGJhdHRlcnk7CisJbWFpbnNfdXNiX2NmZy5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKGJhdHRlcnkpOworCW1haW5zX3VzYl9jZmcuZHJ2X2RhdGEgPSBzbWI7CiAJaWYgKHNtYi0+cGRhdGEtPnVzZV9tYWlucykgewotCQlzbWItPm1haW5zLm5hbWUgPSAic21iMzQ3LW1haW5zIjsKLQkJc21iLT5tYWlucy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7Ci0JCXNtYi0+bWFpbnMuZ2V0X3Byb3BlcnR5ID0gc21iMzQ3X21haW5zX2dldF9wcm9wZXJ0eTsKLQkJc21iLT5tYWlucy5wcm9wZXJ0aWVzID0gc21iMzQ3X21haW5zX3Byb3BlcnRpZXM7Ci0JCXNtYi0+bWFpbnMubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHNtYjM0N19tYWluc19wcm9wZXJ0aWVzKTsKLQkJc21iLT5tYWlucy5zdXBwbGllZF90byA9IGJhdHRlcnk7Ci0JCXNtYi0+bWFpbnMubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShiYXR0ZXJ5KTsKLQkJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRldiwgJnNtYi0+bWFpbnMpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7CisJCXNtYi0+bWFpbnMgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGV2LCAmc21iMzQ3X21haW5zX2Rlc2MsCisJCQkJCQkgICAmbWFpbnNfdXNiX2NmZyk7CisJCWlmIChJU19FUlIoc21iLT5tYWlucykpCisJCQlyZXR1cm4gUFRSX0VSUihzbWItPm1haW5zKTsKIAl9CiAKIAlpZiAoc21iLT5wZGF0YS0+dXNlX3VzYikgewotCQlzbWItPnVzYi5uYW1lID0gInNtYjM0Ny11c2IiOwotCQlzbWItPnVzYi50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOwotCQlzbWItPnVzYi5nZXRfcHJvcGVydHkgPSBzbWIzNDdfdXNiX2dldF9wcm9wZXJ0eTsKLQkJc21iLT51c2IucHJvcGVydGllcyA9IHNtYjM0N191c2JfcHJvcGVydGllczsKLQkJc21iLT51c2IubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHNtYjM0N191c2JfcHJvcGVydGllcyk7Ci0JCXNtYi0+dXNiLnN1cHBsaWVkX3RvID0gYmF0dGVyeTsKLQkJc21iLT51c2IubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShiYXR0ZXJ5KTsKLQkJcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRldiwgJnNtYi0+dXNiKTsKLQkJaWYgKHJldCA8IDApIHsKKwkJc21iLT51c2IgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGV2LCAmc21iMzQ3X3VzYl9kZXNjLAorCQkJCQkJICZtYWluc191c2JfY2ZnKTsKKwkJaWYgKElTX0VSUihzbWItPnVzYikpIHsKIAkJCWlmIChzbWItPnBkYXRhLT51c2VfbWFpbnMpCi0JCQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnNtYi0+bWFpbnMpOwotCQkJcmV0dXJuIHJldDsKKwkJCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihzbWItPm1haW5zKTsKKwkJCXJldHVybiBQVFJfRVJSKHNtYi0+dXNiKTsKIAkJfQogCX0KIAotCXNtYi0+YmF0dGVyeS5uYW1lID0gInNtYjM0Ny1iYXR0ZXJ5IjsKLQlzbWItPmJhdHRlcnkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0Jc21iLT5iYXR0ZXJ5LmdldF9wcm9wZXJ0eSA9IHNtYjM0N19iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKLQlzbWItPmJhdHRlcnkucHJvcGVydGllcyA9IHNtYjM0N19iYXR0ZXJ5X3Byb3BlcnRpZXM7Ci0Jc21iLT5iYXR0ZXJ5Lm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShzbWIzNDdfYmF0dGVyeV9wcm9wZXJ0aWVzKTsKLQotCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKGRldiwgJnNtYi0+YmF0dGVyeSk7Ci0JaWYgKHJldCA8IDApIHsKKwliYXR0ZXJ5X2NmZy5kcnZfZGF0YSA9IHNtYjsKKwlzbWItPmJhdHRlcnkgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoZGV2LCAmc21iMzQ3X2JhdHRlcnlfZGVzYywKKwkJCQkJICAgICAmYmF0dGVyeV9jZmcpOworCWlmIChJU19FUlIoc21iLT5iYXR0ZXJ5KSkgewogCQlpZiAoc21iLT5wZGF0YS0+dXNlX3VzYikKLQkJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZzbWItPnVzYik7CisJCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihzbWItPnVzYik7CiAJCWlmIChzbWItPnBkYXRhLT51c2VfbWFpbnMpCi0JCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcigmc21iLT5tYWlucyk7Ci0JCXJldHVybiByZXQ7CisJCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihzbWItPm1haW5zKTsKKwkJcmV0dXJuIFBUUl9FUlIoc21iLT5iYXR0ZXJ5KTsKIAl9CiAKIAkvKgpAQCAtMTI5NCwxMSArMTMwMywxMSBAQAogCQlncGlvX2ZyZWUoc21iLT5wZGF0YS0+aXJxX2dwaW8pOwogCX0KIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZzbWItPmJhdHRlcnkpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHNtYi0+YmF0dGVyeSk7CiAJaWYgKHNtYi0+cGRhdGEtPnVzZV91c2IpCi0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZzbWItPnVzYik7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHNtYi0+dXNiKTsKIAlpZiAoc21iLT5wZGF0YS0+dXNlX21haW5zKQotCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcigmc21iLT5tYWlucyk7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHNtYi0+bWFpbnMpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Rlc3RfcG93ZXIuYyBiL2RyaXZlcnMvcG93ZXIvdGVzdF9wb3dlci5jCmluZGV4IGYyNmIxZmEuLmY5ODZlMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvdGVzdF9wb3dlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvdGVzdF9wb3dlci5jCkBAIC0xNTMsMTIgKzE1MywxMiBAQAogCSJ0ZXN0X2JhdHRlcnkiLAogfTsKIAotc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgdGVzdF9wb3dlcl9zdXBwbGllc1tdID0geworc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnRlc3RfcG93ZXJfc3VwcGxpZXNbVEVTVF9QT1dFUl9OVU1dOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHRlc3RfcG93ZXJfZGVzY1tdID0gewogCVtURVNUX0FDXSA9IHsKIAkJLm5hbWUgPSAidGVzdF9hYyIsCiAJCS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCi0JCS5zdXBwbGllZF90byA9IHRlc3RfcG93ZXJfYWNfc3VwcGxpZWRfdG8sCi0JCS5udW1fc3VwcGxpY2FudHMgPSBBUlJBWV9TSVpFKHRlc3RfcG93ZXJfYWNfc3VwcGxpZWRfdG8pLAogCQkucHJvcGVydGllcyA9IHRlc3RfcG93ZXJfYWNfcHJvcHMsCiAJCS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUodGVzdF9wb3dlcl9hY19wcm9wcyksCiAJCS5nZXRfcHJvcGVydHkgPSB0ZXN0X3Bvd2VyX2dldF9hY19wcm9wZXJ0eSwKQEAgLTE3MywxNCArMTczLDI1IEBACiAJW1RFU1RfVVNCXSA9IHsKIAkJLm5hbWUgPSAidGVzdF91c2IiLAogCQkudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQiwKLQkJLnN1cHBsaWVkX3RvID0gdGVzdF9wb3dlcl9hY19zdXBwbGllZF90bywKLQkJLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJWkUodGVzdF9wb3dlcl9hY19zdXBwbGllZF90byksCiAJCS5wcm9wZXJ0aWVzID0gdGVzdF9wb3dlcl9hY19wcm9wcywKIAkJLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh0ZXN0X3Bvd2VyX2FjX3Byb3BzKSwKIAkJLmdldF9wcm9wZXJ0eSA9IHRlc3RfcG93ZXJfZ2V0X3VzYl9wcm9wZXJ0eSwKIAl9LAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHRlc3RfcG93ZXJfY29uZmlnc1tdID0geworCXsKKwkJLyogdGVzdF9hYyAqLworCQkuc3VwcGxpZWRfdG8gPSB0ZXN0X3Bvd2VyX2FjX3N1cHBsaWVkX3RvLAorCQkubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRSh0ZXN0X3Bvd2VyX2FjX3N1cHBsaWVkX3RvKSwKKwl9LCB7CisJCS8qIHRlc3RfYmF0dGVyeSAqLworCX0sIHsKKwkJLyogdGVzdF91c2IgKi8KKwkJLnN1cHBsaWVkX3RvID0gdGVzdF9wb3dlcl9hY19zdXBwbGllZF90bywKKwkJLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJWkUodGVzdF9wb3dlcl9hY19zdXBwbGllZF90byksCisJfSwKK307CiAKIHN0YXRpYyBpbnQgX19pbml0IHRlc3RfcG93ZXJfaW5pdCh2b2lkKQogewpAQCAtMTg4LDEyICsxOTksMTYgQEAKIAlpbnQgcmV0OwogCiAJQlVJTERfQlVHX09OKFRFU1RfUE9XRVJfTlVNICE9IEFSUkFZX1NJWkUodGVzdF9wb3dlcl9zdXBwbGllcykpOworCUJVSUxEX0JVR19PTihURVNUX1BPV0VSX05VTSAhPSBBUlJBWV9TSVpFKHRlc3RfcG93ZXJfY29uZmlncykpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVzdF9wb3dlcl9zdXBwbGllcyk7IGkrKykgewotCQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoTlVMTCwgJnRlc3RfcG93ZXJfc3VwcGxpZXNbaV0pOwotCQlpZiAocmV0KSB7CisJCXRlc3RfcG93ZXJfc3VwcGxpZXNbaV0gPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoTlVMTCwKKwkJCQkJCSZ0ZXN0X3Bvd2VyX2Rlc2NbaV0sCisJCQkJCQkmdGVzdF9wb3dlcl9jb25maWdzW2ldKTsKKwkJaWYgKElTX0VSUih0ZXN0X3Bvd2VyX3N1cHBsaWVzW2ldKSkgewogCQkJcHJfZXJyKCIlczogZmFpbGVkIHRvIHJlZ2lzdGVyICVzXG4iLCBfX2Z1bmNfXywKLQkJCQl0ZXN0X3Bvd2VyX3N1cHBsaWVzW2ldLm5hbWUpOworCQkJCXRlc3RfcG93ZXJfZGVzY1tpXS5uYW1lKTsKKwkJCXJldCA9IFBUUl9FUlIodGVzdF9wb3dlcl9zdXBwbGllc1tpXSk7CiAJCQlnb3RvIGZhaWxlZDsKIAkJfQogCX0KQEAgLTIwMiw3ICsyMTcsNyBAQAogCXJldHVybiAwOwogZmFpbGVkOgogCXdoaWxlICgtLWkgPj0gMCkKLQkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnRlc3RfcG93ZXJfc3VwcGxpZXNbaV0pOworCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcih0ZXN0X3Bvd2VyX3N1cHBsaWVzW2ldKTsKIAlyZXR1cm4gcmV0OwogfQogbW9kdWxlX2luaXQodGVzdF9wb3dlcl9pbml0KTsKQEAgLTIxNiwxMyArMjMxLDEzIEBACiAJdXNiX29ubGluZSA9IDA7CiAJYmF0dGVyeV9zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlc3RfcG93ZXJfc3VwcGxpZXMpOyBpKyspCi0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZ0ZXN0X3Bvd2VyX3N1cHBsaWVzW2ldKTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQodGVzdF9wb3dlcl9zdXBwbGllc1tpXSk7CiAJcHJfaW5mbygiJXM6ICdjaGFuZ2VkJyBldmVudCBzZW50LCBzbGVlcGluZyBmb3IgMTAgc2Vjb25kcy4uLlxuIiwKIAkJX19mdW5jX18pOwogCXNzbGVlcCgxMCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0ZXN0X3Bvd2VyX3N1cHBsaWVzKTsgaSsrKQotCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmdGVzdF9wb3dlcl9zdXBwbGllc1tpXSk7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHRlc3RfcG93ZXJfc3VwcGxpZXNbaV0pOwogCiAJbW9kdWxlX2luaXRpYWxpemVkID0gZmFsc2U7CiB9CkBAIC0zMjAsNyArMzM1LDcgQEAKIHN0YXRpYyBpbnQgcGFyYW1fc2V0X2FjX29ubGluZShjb25zdCBjaGFyICprZXksIGNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQogewogCWFjX29ubGluZSA9IG1hcF9nZXRfdmFsdWUobWFwX2FjX29ubGluZSwga2V5LCBhY19vbmxpbmUpOwotCXNpZ25hbF9wb3dlcl9zdXBwbHlfY2hhbmdlZCgmdGVzdF9wb3dlcl9zdXBwbGllc1tURVNUX0FDXSk7CisJc2lnbmFsX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKHRlc3RfcG93ZXJfc3VwcGxpZXNbVEVTVF9BQ10pOwogCXJldHVybiAwOwogfQogCkBAIC0zMzMsNyArMzQ4LDcgQEAKIHN0YXRpYyBpbnQgcGFyYW1fc2V0X3VzYl9vbmxpbmUoY29uc3QgY2hhciAqa2V5LCBjb25zdCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKIHsKIAl1c2Jfb25saW5lID0gbWFwX2dldF92YWx1ZShtYXBfYWNfb25saW5lLCBrZXksIHVzYl9vbmxpbmUpOwotCXNpZ25hbF9wb3dlcl9zdXBwbHlfY2hhbmdlZCgmdGVzdF9wb3dlcl9zdXBwbGllc1tURVNUX1VTQl0pOworCXNpZ25hbF9wb3dlcl9zdXBwbHlfY2hhbmdlZCh0ZXN0X3Bvd2VyX3N1cHBsaWVzW1RFU1RfVVNCXSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM0Nyw3ICszNjIsNyBAQAogCQkJCQljb25zdCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKIHsKIAliYXR0ZXJ5X3N0YXR1cyA9IG1hcF9nZXRfdmFsdWUobWFwX3N0YXR1cywga2V5LCBiYXR0ZXJ5X3N0YXR1cyk7Ci0Jc2lnbmFsX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKCZ0ZXN0X3Bvd2VyX3N1cHBsaWVzW1RFU1RfQkFUVEVSWV0pOworCXNpZ25hbF9wb3dlcl9zdXBwbHlfY2hhbmdlZCh0ZXN0X3Bvd2VyX3N1cHBsaWVzW1RFU1RfQkFUVEVSWV0pOwogCXJldHVybiAwOwogfQogCkBAIC0zNjEsNyArMzc2LDcgQEAKIAkJCQkJY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbSAqa3ApCiB7CiAJYmF0dGVyeV9oZWFsdGggPSBtYXBfZ2V0X3ZhbHVlKG1hcF9oZWFsdGgsIGtleSwgYmF0dGVyeV9oZWFsdGgpOwotCXNpZ25hbF9wb3dlcl9zdXBwbHlfY2hhbmdlZCgmdGVzdF9wb3dlcl9zdXBwbGllc1tURVNUX0JBVFRFUlldKTsKKwlzaWduYWxfcG93ZXJfc3VwcGx5X2NoYW5nZWQodGVzdF9wb3dlcl9zdXBwbGllc1tURVNUX0JBVFRFUlldKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzc1LDcgKzM5MCw3IEBACiAJCQkJCWNvbnN0IHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQogewogCWJhdHRlcnlfcHJlc2VudCA9IG1hcF9nZXRfdmFsdWUobWFwX3ByZXNlbnQsIGtleSwgYmF0dGVyeV9wcmVzZW50KTsKLQlzaWduYWxfcG93ZXJfc3VwcGx5X2NoYW5nZWQoJnRlc3RfcG93ZXJfc3VwcGxpZXNbVEVTVF9BQ10pOworCXNpZ25hbF9wb3dlcl9zdXBwbHlfY2hhbmdlZCh0ZXN0X3Bvd2VyX3N1cHBsaWVzW1RFU1RfQUNdKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzkxLDcgKzQwNiw3IEBACiB7CiAJYmF0dGVyeV90ZWNobm9sb2d5ID0gbWFwX2dldF92YWx1ZShtYXBfdGVjaG5vbG9neSwga2V5LAogCQkJCQkJYmF0dGVyeV90ZWNobm9sb2d5KTsKLQlzaWduYWxfcG93ZXJfc3VwcGx5X2NoYW5nZWQoJnRlc3RfcG93ZXJfc3VwcGxpZXNbVEVTVF9CQVRURVJZXSk7CisJc2lnbmFsX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKHRlc3RfcG93ZXJfc3VwcGxpZXNbVEVTVF9CQVRURVJZXSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxMiw3ICs0MjcsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWJhdHRlcnlfY2FwYWNpdHkgPSB0bXA7Ci0Jc2lnbmFsX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKCZ0ZXN0X3Bvd2VyX3N1cHBsaWVzW1RFU1RfQkFUVEVSWV0pOworCXNpZ25hbF9wb3dlcl9zdXBwbHlfY2hhbmdlZCh0ZXN0X3Bvd2VyX3N1cHBsaWVzW1RFU1RfQkFUVEVSWV0pOwogCXJldHVybiAwOwogfQogCkBAIC00MjcsNyArNDQyLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAliYXR0ZXJ5X3ZvbHRhZ2UgPSB0bXA7Ci0Jc2lnbmFsX3Bvd2VyX3N1cHBseV9jaGFuZ2VkKCZ0ZXN0X3Bvd2VyX3N1cHBsaWVzW1RFU1RfQkFUVEVSWV0pOworCXNpZ25hbF9wb3dlcl9zdXBwbHlfY2hhbmdlZCh0ZXN0X3Bvd2VyX3N1cHBsaWVzW1RFU1RfQkFUVEVSWV0pOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3Rvc2FfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci90b3NhX2JhdHRlcnkuYwppbmRleCBmNGQ4MGRmLi42ZTg4YzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3Rvc2FfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvdG9zYV9iYXR0ZXJ5LmMKQEAgLTI2LDcgKzI2LDcgQEAKIAogc3RydWN0IHRvc2FfYmF0IHsKIAlpbnQgc3RhdHVzOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgcHN5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeTsKIAlpbnQgZnVsbF9jaHJnOwogCiAJc3RydWN0IG11dGV4IHdvcmtfbG9jazsgLyogcHJvdGVjdHMgZGF0YSAqLwpAQCAtNjEsNyArNjEsNyBAQAogCW11dGV4X2xvY2soJmJhdF9sb2NrKTsKIAlncGlvX3NldF92YWx1ZShiYXQtPmdwaW9fYmF0LCAxKTsKIAltc2xlZXAoNSk7Ci0JdmFsdWUgPSB3bTk3eHhfcmVhZF9hdXhfYWRjKGRldl9nZXRfZHJ2ZGF0YShiYXQtPnBzeS5kZXYtPnBhcmVudCksCisJdmFsdWUgPSB3bTk3eHhfcmVhZF9hdXhfYWRjKGRldl9nZXRfZHJ2ZGF0YShiYXQtPnBzeS0+ZGV2LnBhcmVudCksCiAJCQliYXQtPmFkY19iYXQpOwogCWdwaW9fc2V0X3ZhbHVlKGJhdC0+Z3Bpb19iYXQsIDApOwogCW11dGV4X3VubG9jaygmYmF0X2xvY2spOwpAQCAtODEsNyArODEsNyBAQAogCW11dGV4X2xvY2soJmJhdF9sb2NrKTsKIAlncGlvX3NldF92YWx1ZShiYXQtPmdwaW9fdGVtcCwgMSk7CiAJbXNsZWVwKDUpOwotCXZhbHVlID0gd205N3h4X3JlYWRfYXV4X2FkYyhkZXZfZ2V0X2RydmRhdGEoYmF0LT5wc3kuZGV2LT5wYXJlbnQpLAorCXZhbHVlID0gd205N3h4X3JlYWRfYXV4X2FkYyhkZXZfZ2V0X2RydmRhdGEoYmF0LT5wc3ktPmRldi5wYXJlbnQpLAogCQkJYmF0LT5hZGNfdGVtcCk7CiAJZ3Bpb19zZXRfdmFsdWUoYmF0LT5ncGlvX3RlbXAsIDApOwogCW11dGV4X3VubG9jaygmYmF0X2xvY2spOwpAQCAtOTYsNyArOTYsNyBAQAogCQkJICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IHRvc2FfYmF0ICpiYXQgPSBjb250YWluZXJfb2YocHN5LCBzdHJ1Y3QgdG9zYV9iYXQsIHBzeSk7CisJc3RydWN0IHRvc2FfYmF0ICpiYXQgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEocHN5KTsKIAogCWlmIChiYXQtPmlzX3ByZXNlbnQgJiYgIWJhdC0+aXNfcHJlc2VudChiYXQpCiAJCQkmJiBwc3AgIT0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCkgewpAQCAtMTU4LDE0ICsxNTgsMTQgQEAKIHN0YXRpYyB2b2lkIHRvc2FfYmF0X3VwZGF0ZShzdHJ1Y3QgdG9zYV9iYXQgKmJhdCkKIHsKIAlpbnQgb2xkOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSA9ICZiYXQtPnBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kgPSBiYXQtPnBzeTsKIAogCW11dGV4X2xvY2soJmJhdC0+d29ya19sb2NrKTsKIAogCW9sZCA9IGJhdC0+c3RhdHVzOwogCiAJaWYgKGJhdC0+aXNfcHJlc2VudCAmJiAhYmF0LT5pc19wcmVzZW50KGJhdCkpIHsKLQkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBub3QgcHJlc2VudFxuIiwgcHN5LT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fTk9USUNFICIlcyBub3QgcHJlc2VudFxuIiwgcHN5LT5kZXNjLT5uYW1lKTsKIAkJYmF0LT5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047CiAJCWJhdC0+ZnVsbF9jaHJnID0gLTE7CiAJfSBlbHNlIGlmIChwb3dlcl9zdXBwbHlfYW1faV9zdXBwbGllZChwc3kpKSB7CkBAIC0yMjIsMTggKzIyMiwzOCBAQAogCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHRvc2FfYmF0X21haW5fZGVzYyA9IHsKKwkubmFtZQkJPSAibWFpbi1iYXR0ZXJ5IiwKKwkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAorCS5wcm9wZXJ0aWVzCT0gdG9zYV9iYXRfbWFpbl9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKHRvc2FfYmF0X21haW5fcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJPSB0b3NhX2JhdF9nZXRfcHJvcGVydHksCisJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSB0b3NhX2JhdF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkLAorCS51c2VfZm9yX2FwbQk9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHRvc2FfYmF0X2phY2tldF9kZXNjID0geworCS5uYW1lCQk9ICJqYWNrZXQtYmF0dGVyeSIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwk9IHRvc2FfYmF0X21haW5fcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRSh0b3NhX2JhdF9tYWluX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CT0gdG9zYV9iYXRfZ2V0X3Byb3BlcnR5LAorCS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gdG9zYV9iYXRfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgdG9zYV9iYXRfYnVfZGVzYyA9IHsKKwkubmFtZQkJPSAiYmFja3VwLWJhdHRlcnkiLAorCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCisJLnByb3BlcnRpZXMJPSB0b3NhX2JhdF9idV9wcm9wcywKKwkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKHRvc2FfYmF0X2J1X3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CT0gdG9zYV9iYXRfZ2V0X3Byb3BlcnR5LAorCS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gdG9zYV9iYXRfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKK307CisKIHN0YXRpYyBzdHJ1Y3QgdG9zYV9iYXQgdG9zYV9iYXRfbWFpbiA9IHsKIAkuc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19ESVNDSEFSR0lORywKIAkuZnVsbF9jaHJnID0gLTEsCi0JLnBzeSA9IHsKLQkJLm5hbWUJCT0gIm1haW4tYmF0dGVyeSIsCi0JCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCi0JCS5wcm9wZXJ0aWVzCT0gdG9zYV9iYXRfbWFpbl9wcm9wcywKLQkJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRSh0b3NhX2JhdF9tYWluX3Byb3BzKSwKLQkJLmdldF9wcm9wZXJ0eQk9IHRvc2FfYmF0X2dldF9wcm9wZXJ0eSwKLQkJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSB0b3NhX2JhdF9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkLAotCQkudXNlX2Zvcl9hcG0JPSAxLAotCX0sCisJLnBzeSA9IE5VTEwsCiAKIAkuZ3Bpb19mdWxsID0gVE9TQV9HUElPX0JBVDBfQ1JHLAogCS5ncGlvX2NoYXJnZV9vZmYgPSBUT1NBX0dQSU9fQ0hBUkdFX09GRiwKQEAgLTI1NCwxNCArMjc0LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgdG9zYV9iYXQgdG9zYV9iYXRfamFja2V0ID0gewogCS5zdGF0dXMgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HLAogCS5mdWxsX2NocmcgPSAtMSwKLQkucHN5ID0gewotCQkubmFtZQkJPSAiamFja2V0LWJhdHRlcnkiLAotCQkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAotCQkucHJvcGVydGllcwk9IHRvc2FfYmF0X21haW5fcHJvcHMsCi0JCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUodG9zYV9iYXRfbWFpbl9wcm9wcyksCi0JCS5nZXRfcHJvcGVydHkJPSB0b3NhX2JhdF9nZXRfcHJvcGVydHksCi0JCS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0gdG9zYV9iYXRfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCwKLQl9LAorCS5wc3kgPSBOVUxMLAogCiAJLmlzX3ByZXNlbnQgPSB0b3NhX2phY2tldF9iYXRfaXNfcHJlc2VudCwKIAkuZ3Bpb19mdWxsID0gVE9TQV9HUElPX0JBVDFfQ1JHLApAQCAtMjgzLDE1ICsyOTYsNyBAQAogc3RhdGljIHN0cnVjdCB0b3NhX2JhdCB0b3NhX2JhdF9idSA9IHsKIAkuc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOLAogCS5mdWxsX2NocmcgPSAtMSwKLQotCS5wc3kgPSB7Ci0JCS5uYW1lCQk9ICJiYWNrdXAtYmF0dGVyeSIsCi0JCS50eXBlCQk9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlksCi0JCS5wcm9wZXJ0aWVzCT0gdG9zYV9iYXRfYnVfcHJvcHMsCi0JCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUodG9zYV9iYXRfYnVfcHJvcHMpLAotCQkuZ2V0X3Byb3BlcnR5CT0gdG9zYV9iYXRfZ2V0X3Byb3BlcnR5LAotCQkuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9IHRvc2FfYmF0X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQsCi0JfSwKKwkucHN5ID0gTlVMTCwKIAogCS5ncGlvX2Z1bGwgPSAtMSwKIAkuZ3Bpb19jaGFyZ2Vfb2ZmID0gLTEsCkBAIC0zNDUsNiArMzUwLDkgQEAKIHN0YXRpYyBpbnQgdG9zYV9iYXRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogewogCWludCByZXQ7CisJc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgbWFpbl9wc3lfY2ZnID0ge30sCisJCQkJICAgamFja2V0X3BzeV9jZmcgPSB7fSwKKwkJCQkgICBidV9wc3lfY2ZnID0ge307CiAKIAlpZiAoIW1hY2hpbmVfaXNfdG9zYSgpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTM1OCwxNSArMzY2LDMxIEBACiAKIAlJTklUX1dPUksoJmJhdF93b3JrLCB0b3NhX2JhdF93b3JrKTsKIAotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmZGV2LT5kZXYsICZ0b3NhX2JhdF9tYWluLnBzeSk7Ci0JaWYgKHJldCkKKwltYWluX3BzeV9jZmcuZHJ2X2RhdGEgPSAmdG9zYV9iYXRfbWFpbjsKKwl0b3NhX2JhdF9tYWluLnBzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmZGV2LT5kZXYsCisJCQkJCQkgICZ0b3NhX2JhdF9tYWluX2Rlc2MsCisJCQkJCQkgICZtYWluX3BzeV9jZmcpOworCWlmIChJU19FUlIodG9zYV9iYXRfbWFpbi5wc3kpKSB7CisJCXJldCA9IFBUUl9FUlIodG9zYV9iYXRfbWFpbi5wc3kpOwogCQlnb3RvIGVycl9wc3lfcmVnX21haW47Ci0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZkZXYtPmRldiwgJnRvc2FfYmF0X2phY2tldC5wc3kpOwotCWlmIChyZXQpCisJfQorCisJamFja2V0X3BzeV9jZmcuZHJ2X2RhdGEgPSAmdG9zYV9iYXRfamFja2V0OworCXRvc2FfYmF0X2phY2tldC5wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmRldi0+ZGV2LAorCQkJCQkJICAgICZ0b3NhX2JhdF9qYWNrZXRfZGVzYywKKwkJCQkJCSAgICAmamFja2V0X3BzeV9jZmcpOworCWlmIChJU19FUlIodG9zYV9iYXRfamFja2V0LnBzeSkpIHsKKwkJcmV0ID0gUFRSX0VSUih0b3NhX2JhdF9qYWNrZXQucHN5KTsKIAkJZ290byBlcnJfcHN5X3JlZ19qYWNrZXQ7Ci0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZkZXYtPmRldiwgJnRvc2FfYmF0X2J1LnBzeSk7Ci0JaWYgKHJldCkKKwl9CisKKwlidV9wc3lfY2ZnLmRydl9kYXRhID0gJnRvc2FfYmF0X2J1OworCXRvc2FfYmF0X2J1LnBzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmZGV2LT5kZXYsICZ0b3NhX2JhdF9idV9kZXNjLAorCQkJCQkJJmJ1X3BzeV9jZmcpOworCWlmIChJU19FUlIodG9zYV9iYXRfYnUucHN5KSkgeworCQlyZXQgPSBQVFJfRVJSKHRvc2FfYmF0X2J1LnBzeSk7CiAJCWdvdG8gZXJyX3BzeV9yZWdfYnU7CisJfQogCiAJcmV0ID0gcmVxdWVzdF9pcnEoZ3Bpb190b19pcnEoVE9TQV9HUElPX0JBVDBfQ1JHKSwKIAkJCQl0b3NhX2JhdF9ncGlvX2lzciwKQEAgLTM5NSwxMSArNDE5LDExIEBACiBlcnJfcmVxX2phY2tldDoKIAlmcmVlX2lycShncGlvX3RvX2lycShUT1NBX0dQSU9fQkFUMF9DUkcpLCAmdG9zYV9iYXRfbWFpbik7CiBlcnJfcmVxX21haW46Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJnRvc2FfYmF0X2J1LnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIodG9zYV9iYXRfYnUucHN5KTsKIGVycl9wc3lfcmVnX2J1OgotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZ0b3NhX2JhdF9qYWNrZXQucHN5KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcih0b3NhX2JhdF9qYWNrZXQucHN5KTsKIGVycl9wc3lfcmVnX2phY2tldDoKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmdG9zYV9iYXRfbWFpbi5wc3kpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHRvc2FfYmF0X21haW4ucHN5KTsKIGVycl9wc3lfcmVnX21haW46CiAKIAkvKiBzZWUgY29tbWVudCBpbiB0b3NhX2JhdF9yZW1vdmUgKi8KQEAgLTQxNSw5ICs0MzksOSBAQAogCWZyZWVfaXJxKGdwaW9fdG9faXJxKFRPU0FfR1BJT19CQVQxX0NSRyksICZ0b3NhX2JhdF9qYWNrZXQpOwogCWZyZWVfaXJxKGdwaW9fdG9faXJxKFRPU0FfR1BJT19CQVQwX0NSRyksICZ0b3NhX2JhdF9tYWluKTsKIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZ0b3NhX2JhdF9idS5wc3kpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZ0b3NhX2JhdF9qYWNrZXQucHN5KTsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmdG9zYV9iYXRfbWFpbi5wc3kpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHRvc2FfYmF0X2J1LnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIodG9zYV9iYXRfamFja2V0LnBzeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIodG9zYV9iYXRfbWFpbi5wc3kpOwogCiAJLyoKIAkgKiBOb3cgY2FuY2VsIHRoZSBiYXRfd29yay4gIFdlIHdvbid0IGdldCBhbnkgbW9yZSBzY2hlZHVsZXMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3RwczY1MDkwLWNoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvdHBzNjUwOTAtY2hhcmdlci5jCmluZGV4IDBmNGU1OTcuLjdlOGZiZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvdHBzNjUwOTAtY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvdHBzNjUwOTAtY2hhcmdlci5jCkBAIC00Myw3ICs0Myw3IEBACiAJaW50CWlycTsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnBvbGxfdGFzazsKIAlib29sCQkJcGFzc2l2ZV9tb2RlOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkJYWM7CisJc3RydWN0IHBvd2VyX3N1cHBseQkqYWM7CiAJc3RydWN0IHRwczY1MDkwX3BsYXRmb3JtX2RhdGEgKnBkYXRhOwogfTsKIApAQCAtMTM1LDggKzEzNSw3IEBACiAJCQllbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCB0cHM2NTA5MF9jaGFyZ2VyICpjaGFyZ2VyID0gY29udGFpbmVyX29mKHBzeSwKLQkJCQkJc3RydWN0IHRwczY1MDkwX2NoYXJnZXIsIGFjKTsKKwlzdHJ1Y3QgdHBzNjUwOTBfY2hhcmdlciAqY2hhcmdlciA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJaWYgKHBzcCA9PSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkUpIHsKIAkJdmFsLT5pbnR2YWwgPSBjaGFyZ2VyLT5hY19vbmxpbmU7CkBAIC0xOTAsNyArMTg5LDcgQEAKIAl9CiAKIAlpZiAoY2hhcmdlci0+cHJldl9hY19vbmxpbmUgIT0gY2hhcmdlci0+YWNfb25saW5lKQotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmY2hhcmdlci0+YWMpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChjaGFyZ2VyLT5hYyk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0yMjksMTAgKzIyOCwxOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHRwczY1MDkwX2NoYXJnZXJfZGVzYyA9IHsKKwkubmFtZQkJCT0gInRwczY1MDkwLWFjIiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCisJLmdldF9wcm9wZXJ0eQkJPSB0cHM2NTA5MF9hY19nZXRfcHJvcGVydHksCisJLnByb3BlcnRpZXMJCT0gdHBzNjUwOTBfYWNfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCQk9IEFSUkFZX1NJWkUodHBzNjUwOTBfYWNfcHJvcHMpLAorfTsKKwogc3RhdGljIGludCB0cHM2NTA5MF9jaGFyZ2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHRwczY1MDkwX2NoYXJnZXIgKmNkYXRhOwogCXN0cnVjdCB0cHM2NTA5MF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAJdWludDhfdCBzdGF0dXMxID0gMDsKIAlpbnQgcmV0OwogCWludCBpcnE7CkBAIC0yNTksMTkgKzI2NywxNiBAQAogCWNkYXRhLT5kZXYJCQk9ICZwZGV2LT5kZXY7CiAJY2RhdGEtPnBkYXRhCQkJPSBwZGF0YTsKIAotCWNkYXRhLT5hYy5uYW1lCQkJPSAidHBzNjUwOTAtYWMiOwotCWNkYXRhLT5hYy50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9NQUlOUzsKLQljZGF0YS0+YWMuZ2V0X3Byb3BlcnR5CQk9IHRwczY1MDkwX2FjX2dldF9wcm9wZXJ0eTsKLQljZGF0YS0+YWMucHJvcGVydGllcwkJPSB0cHM2NTA5MF9hY19wcm9wczsKLQljZGF0YS0+YWMubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKHRwczY1MDkwX2FjX3Byb3BzKTsKLQljZGF0YS0+YWMuc3VwcGxpZWRfdG8JCT0gcGRhdGEtPnN1cHBsaWVkX3RvOwotCWNkYXRhLT5hYy5udW1fc3VwcGxpY2FudHMJPSBwZGF0YS0+bnVtX3N1cHBsaWNhbnRzOwotCWNkYXRhLT5hYy5vZl9ub2RlCQk9IHBkZXYtPmRldi5vZl9ub2RlOworCXBzeV9jZmcuc3VwcGxpZWRfdG8JCT0gcGRhdGEtPnN1cHBsaWVkX3RvOworCXBzeV9jZmcubnVtX3N1cHBsaWNhbnRzCQk9IHBkYXRhLT5udW1fc3VwcGxpY2FudHM7CisJcHN5X2NmZy5vZl9ub2RlCQkJPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlwc3lfY2ZnLmRydl9kYXRhCQk9IGNkYXRhOwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZjZGF0YS0+YWMpOwotCWlmIChyZXQpIHsKKwljZGF0YS0+YWMgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnRwczY1MDkwX2NoYXJnZXJfZGVzYywKKwkJCSZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGNkYXRhLT5hYykpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkOiBwb3dlciBzdXBwbHkgcmVnaXN0ZXJcbiIpOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gUFRSX0VSUihjZGF0YS0+YWMpOwogCX0KIAogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CkBAIC0zMDEsNyArMzA2LDcgQEAKIAkJCWdvdG8gZmFpbF91bnJlZ2lzdGVyX3N1cHBseTsKIAkJfQogCQljZGF0YS0+YWNfb25saW5lID0gMTsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmNkYXRhLT5hYyk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNkYXRhLT5hYyk7CiAJfQogCiAJaWYgKGlycSAhPSAtRU5YSU8pIHsKQEAgLTMyOCw3ICszMzMsNyBAQAogCXJldHVybiAwOwogCiBmYWlsX3VucmVnaXN0ZXJfc3VwcGx5OgotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZjZGF0YS0+YWMpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGNkYXRhLT5hYyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzM5LDEyICszNDQsMTIgQEAKIAogCWlmIChjZGF0YS0+aXJxID09IC1FTlhJTykKIAkJa3RocmVhZF9zdG9wKGNkYXRhLT5wb2xsX3Rhc2spOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZjZGF0YS0+YWMpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGNkYXRhLT5hYyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfdHBzNjUwOTBfY2hhcmdlcl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfdHBzNjUwOTBfY2hhcmdlcl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAidGksdHBzNjUwOTAtY2hhcmdlciIsIH0sCiAJeyAvKiBlbmQgKi8gfQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvdHdsNDAzMF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3R3bDQwMzBfY2hhcmdlci5jCmluZGV4IGQzNWI4M2UuLjAyYTUyMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvdHdsNDAzMF9jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci90d2w0MDMwX2NoYXJnZXIuYwpAQCAtODcsOCArODcsOCBAQAogCiBzdHJ1Y3QgdHdsNDAzMF9iY2kgewogCXN0cnVjdCBkZXZpY2UJCSpkZXY7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseQlhYzsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5CXVzYjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CSphYzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5CSp1c2I7CiAJc3RydWN0IHVzYl9waHkJCSp0cmFuc2NlaXZlcjsKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sJdXNiX25iOwogCXN0cnVjdCB3b3JrX3N0cnVjdAl3b3JrOwpAQCAtMzE4LDggKzMxOCw4IEBACiAJc3RydWN0IHR3bDQwMzBfYmNpICpiY2kgPSBhcmc7CiAKIAlkZXZfZGJnKGJjaS0+ZGV2LCAiQ0hHX1BSRVMgaXJxXG4iKTsKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmYmNpLT5hYyk7Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmJjaS0+dXNiKTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChiY2ktPmFjKTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZChiY2ktPnVzYik7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0zNDcsOCArMzQ3LDggQEAKIAogCWlmIChpcnFzMSAmIChUV0w0MDMwX0lDSEdMT1cgfCBUV0w0MDMwX0lDSEdFT0MpKSB7CiAJCS8qIGNoYXJnZXIgc3RhdGUgY2hhbmdlLCBpbmZvcm0gdGhlIGNvcmUgKi8KLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmJjaS0+YWMpOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmYmNpLT51c2IpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChiY2ktPmFjKTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoYmNpLT51c2IpOwogCX0KIAogCS8qIHZhcmlvdXMgbW9uaXRvcmluZyBldmVudHMsIGZvciBub3cgd2UganVzdCBsb2cgdGhlbSBoZXJlICovCkBAIC00NjMsNyArNDYzLDcgQEAKIAkJCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCB0d2w0MDMwX2JjaSAqYmNpID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCB0d2w0MDMwX2JjaSAqYmNpID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LnBhcmVudCk7CiAJaW50IGlzX2NoYXJnaW5nOwogCWludCBzdGF0ZTsKIAlpbnQgcmV0OwpAQCAtNDcyLDcgKzQ3Miw3IEBACiAJaWYgKHN0YXRlIDwgMCkKIAkJcmV0dXJuIHN0YXRlOwogCi0JaWYgKHBzeS0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IpCisJaWYgKHBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IpCiAJCWlzX2NoYXJnaW5nID0gc3RhdGUgJiBUV0w0MDMwX01TVEFURUNfVVNCOwogCWVsc2UKIAkJaXNfY2hhcmdpbmcgPSBzdGF0ZSAmIFRXTDQwMzBfTVNUQVRFQ19BQzsKQEAgLTQ4OCw3ICs0ODgsNyBAQAogCQkvKiBjaGFyZ2luZyBtdXN0IGJlIGFjdGl2ZSBmb3IgbWVhbmluZ2Z1bCByZXN1bHQgKi8KIAkJaWYgKCFpc19jaGFyZ2luZykKIAkJCXJldHVybiAtRU5PREFUQTsKLQkJaWYgKHBzeS0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IpIHsKKwkJaWYgKHBzeS0+ZGVzYy0+dHlwZSA9PSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IpIHsKIAkJCXJldCA9IHR3bDQwMzBiY2lfcmVhZF9hZGNfdmFsKFRXTDQwMzBfQkNJVkJVUyk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0OwpAQCAtNTU4LDYgKzU1OCwyMiBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgdHdsNDAzMF9iY2lfYWNfZGVzYyA9IHsKKwkubmFtZQkJPSAidHdsNDAzMF9hYyIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCisJLnByb3BlcnRpZXMJPSB0d2w0MDMwX2NoYXJnZXJfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRSh0d2w0MDMwX2NoYXJnZXJfcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJPSB0d2w0MDMwX2JjaV9nZXRfcHJvcGVydHksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHR3bDQwMzBfYmNpX3VzYl9kZXNjID0geworCS5uYW1lCQk9ICJ0d2w0MDMwX3VzYiIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfVVNCLAorCS5wcm9wZXJ0aWVzCT0gdHdsNDAzMF9jaGFyZ2VyX3Byb3BzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUodHdsNDAzMF9jaGFyZ2VyX3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CT0gdHdsNDAzMF9iY2lfZ2V0X3Byb3BlcnR5LAorfTsKKwogc3RhdGljIGludCBfX2luaXQgdHdsNDAzMF9iY2lfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgdHdsNDAzMF9iY2kgKmJjaTsKQEAgLTU4NCwyOCArNjAwLDIxIEBACiAJfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYmNpKTsKLQliY2ktPmFjLm5hbWUgPSAidHdsNDAzMF9hYyI7Ci0JYmNpLT5hYy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7Ci0JYmNpLT5hYy5wcm9wZXJ0aWVzID0gdHdsNDAzMF9jaGFyZ2VyX3Byb3BzOwotCWJjaS0+YWMubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHR3bDQwMzBfY2hhcmdlcl9wcm9wcyk7Ci0JYmNpLT5hYy5nZXRfcHJvcGVydHkgPSB0d2w0MDMwX2JjaV9nZXRfcHJvcGVydHk7CiAKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmJjaS0+YWMpOwotCWlmIChyZXQpIHsKKwliY2ktPmFjID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZ0d2w0MDMwX2JjaV9hY19kZXNjLAorCQkJCQlOVUxMKTsKKwlpZiAoSVNfRVJSKGJjaS0+YWMpKSB7CisJCXJldCA9IFBUUl9FUlIoYmNpLT5hYyk7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciBhYzogJWRcbiIsIHJldCk7CiAJCWdvdG8gZmFpbF9yZWdpc3Rlcl9hYzsKIAl9CiAKLQliY2ktPnVzYi5uYW1lID0gInR3bDQwMzBfdXNiIjsKLQliY2ktPnVzYi50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOwotCWJjaS0+dXNiLnByb3BlcnRpZXMgPSB0d2w0MDMwX2NoYXJnZXJfcHJvcHM7Ci0JYmNpLT51c2IubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHR3bDQwMzBfY2hhcmdlcl9wcm9wcyk7Ci0JYmNpLT51c2IuZ2V0X3Byb3BlcnR5ID0gdHdsNDAzMF9iY2lfZ2V0X3Byb3BlcnR5OwotCiAJYmNpLT51c2JfcmVnID0gcmVndWxhdG9yX2dldChiY2ktPmRldiwgImJjaTN2MSIpOwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZiY2ktPnVzYik7Ci0JaWYgKHJldCkgeworCWJjaS0+dXNiID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZ0d2w0MDMwX2JjaV91c2JfZGVzYywKKwkJCQkJIE5VTEwpOworCWlmIChJU19FUlIoYmNpLT51c2IpKSB7CisJCXJldCA9IFBUUl9FUlIoYmNpLT51c2IpOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgdXNiOiAlZFxuIiwgcmV0KTsKIAkJZ290byBmYWlsX3JlZ2lzdGVyX3VzYjsKIAl9CkBAIC02NzAsOSArNjc5LDkgQEAKIGZhaWxfYmNpX2lycToKIAlmcmVlX2lycShiY2ktPmlycV9jaGcsIGJjaSk7CiBmYWlsX2NoZ19pcnE6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmJjaS0+dXNiKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihiY2ktPnVzYik7CiBmYWlsX3JlZ2lzdGVyX3VzYjoKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmYmNpLT5hYyk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYmNpLT5hYyk7CiBmYWlsX3JlZ2lzdGVyX2FjOgogZmFpbF9ub19iYXR0ZXJ5OgogCWtmcmVlKGJjaSk7CkBAIC03MDAsOCArNzA5LDggQEAKIAl9CiAJZnJlZV9pcnEoYmNpLT5pcnFfYmNpLCBiY2kpOwogCWZyZWVfaXJxKGJjaS0+aXJxX2NoZywgYmNpKTsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmYmNpLT51c2IpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZiY2ktPmFjKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihiY2ktPnVzYik7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYmNpLT5hYyk7CiAJa2ZyZWUoYmNpKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci90d2w0MDMwX21hZGNfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci90d2w0MDMwX21hZGNfYmF0dGVyeS5jCmluZGV4IDdlZjQ0NWEuLmY1ODE3ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvdHdsNDAzMF9tYWRjX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL3R3bDQwMzBfbWFkY19iYXR0ZXJ5LmMKQEAgLTE5LDEwICsxOSwxNCBAQAogI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMvdHdsNDAzMC1tYWRjLmg+CiAjaW5jbHVkZSA8bGludXgvcG93ZXIvdHdsNDAzMF9tYWRjX2JhdHRlcnkuaD4KKyNpbmNsdWRlIDxsaW51eC9paW8vY29uc3VtZXIuaD4KIAogc3RydWN0IHR3bDQwMzBfbWFkY19iYXR0ZXJ5IHsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IHBzeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7CiAJc3RydWN0IHR3bDQwMzBfbWFkY19iYXRfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGlpb19jaGFubmVsICpjaGFubmVsX3RlbXA7CisJc3RydWN0IGlpb19jaGFubmVsICpjaGFubmVsX2ljaGc7CisJc3RydWN0IGlpb19jaGFubmVsICpjaGFubmVsX3ZiYXQ7CiB9OwogCiBzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgdHdsNDAzMF9tYWRjX2JhdF9wcm9wc1tdID0gewpAQCAtMzgsNDMgKzQyLDM0IEBACiAJUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9OT1csCiB9OwogCi1zdGF0aWMgaW50IG1hZGNfcmVhZChpbnQgaW5kZXgpCitzdGF0aWMgaW50IG1hZGNfcmVhZChzdHJ1Y3QgaWlvX2NoYW5uZWwgKmNoYW5uZWwpCiB7Ci0Jc3RydWN0IHR3bDQwMzBfbWFkY19yZXF1ZXN0IHJlcTsKLQlpbnQgdmFsOworCWludCB2YWwsIGVycjsKKwllcnIgPSBpaW9fcmVhZF9jaGFubmVsX3Byb2Nlc3NlZChjaGFubmVsLCAmdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKIAotCXJlcS5jaGFubmVscyA9IGluZGV4OwotCXJlcS5tZXRob2QgPSBUV0w0MDMwX01BRENfU1cyOwotCXJlcS50eXBlID0gVFdMNDAzMF9NQURDX1dBSVQ7Ci0JcmVxLmRvX2F2ZyA9IDA7Ci0JcmVxLnJhdyA9IGZhbHNlOwotCXJlcS5mdW5jX2NiID0gTlVMTDsKLQotCXZhbCA9IHR3bDQwMzBfbWFkY19jb252ZXJzaW9uKCZyZXEpOwotCWlmICh2YWwgPCAwKQotCQlyZXR1cm4gdmFsOwotCi0JcmV0dXJuIHJlcS5yYnVmW2ZmcyhpbmRleCkgLSAxXTsKKwlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgaW50IHR3bDQwMzBfbWFkY19iYXRfZ2V0X2NoYXJnaW5nX3N0YXR1cyh2b2lkKQorc3RhdGljIGludCB0d2w0MDMwX21hZGNfYmF0X2dldF9jaGFyZ2luZ19zdGF0dXMoc3RydWN0IHR3bDQwMzBfbWFkY19iYXR0ZXJ5ICpidCkKIHsKLQlyZXR1cm4gKG1hZGNfcmVhZChUV0w0MDMwX01BRENfSUNIRykgPiAwKSA/IDEgOiAwOworCXJldHVybiAobWFkY19yZWFkKGJ0LT5jaGFubmVsX2ljaGcpID4gMCkgPyAxIDogMDsKIH0KIAotc3RhdGljIGludCB0d2w0MDMwX21hZGNfYmF0X2dldF92b2x0YWdlKHZvaWQpCitzdGF0aWMgaW50IHR3bDQwMzBfbWFkY19iYXRfZ2V0X3ZvbHRhZ2Uoc3RydWN0IHR3bDQwMzBfbWFkY19iYXR0ZXJ5ICpidCkKIHsKLQlyZXR1cm4gbWFkY19yZWFkKFRXTDQwMzBfTUFEQ19WQkFUKTsKKwlyZXR1cm4gbWFkY19yZWFkKGJ0LT5jaGFubmVsX3ZiYXQpOwogfQogCi1zdGF0aWMgaW50IHR3bDQwMzBfbWFkY19iYXRfZ2V0X2N1cnJlbnQodm9pZCkKK3N0YXRpYyBpbnQgdHdsNDAzMF9tYWRjX2JhdF9nZXRfY3VycmVudChzdHJ1Y3QgdHdsNDAzMF9tYWRjX2JhdHRlcnkgKmJ0KQogewotCXJldHVybiBtYWRjX3JlYWQoVFdMNDAzMF9NQURDX0lDSEcpICogMTAwMDsKKwlyZXR1cm4gbWFkY19yZWFkKGJ0LT5jaGFubmVsX2ljaGcpICogMTAwMDsKIH0KIAotc3RhdGljIGludCB0d2w0MDMwX21hZGNfYmF0X2dldF90ZW1wKHZvaWQpCitzdGF0aWMgaW50IHR3bDQwMzBfbWFkY19iYXRfZ2V0X3RlbXAoc3RydWN0IHR3bDQwMzBfbWFkY19iYXR0ZXJ5ICpidCkKIHsKLQlyZXR1cm4gbWFkY19yZWFkKFRXTDQwMzBfTUFEQ19CVEVNUCkgKiAxMDsKKwlyZXR1cm4gbWFkY19yZWFkKGJ0LT5jaGFubmVsX3RlbXApICogMTA7CiB9CiAKIHN0YXRpYyBpbnQgdHdsNDAzMF9tYWRjX2JhdF92b2x0c2NhbGUoc3RydWN0IHR3bDQwMzBfbWFkY19iYXR0ZXJ5ICpiYXQsCkBAIC04NCw3ICs3OSw3IEBACiAJaW50IGksIHJlcyA9IDA7CiAKIAkvKiBjaG9vc2UgY2hhcmdpbmcgY3VydmUgKi8KLQlpZiAodHdsNDAzMF9tYWRjX2JhdF9nZXRfY2hhcmdpbmdfc3RhdHVzKCkpCisJaWYgKHR3bDQwMzBfbWFkY19iYXRfZ2V0X2NoYXJnaW5nX3N0YXR1cyhiYXQpKQogCQljYWxpYnJhdGlvbiA9IGJhdC0+cGRhdGEtPmNoYXJnaW5nOwogCWVsc2UKIAkJY2FsaWJyYXRpb24gPSBiYXQtPnBkYXRhLT5kaXNjaGFyZ2luZzsKQEAgLTExMywyOSArMTA4LDI4IEBACiAJCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgdHdsNDAzMF9tYWRjX2JhdHRlcnkgKmJhdCA9IGNvbnRhaW5lcl9vZihwc3ksCi0JCQkJCXN0cnVjdCB0d2w0MDMwX21hZGNfYmF0dGVyeSwgcHN5KTsKKwlzdHJ1Y3QgdHdsNDAzMF9tYWRjX2JhdHRlcnkgKmJhdCA9IHBvd2VyX3N1cHBseV9nZXRfZHJ2ZGF0YShwc3kpOwogCiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKIAkJaWYgKHR3bDQwMzBfbWFkY19iYXRfdm9sdHNjYWxlKGJhdCwKLQkJCQl0d2w0MDMwX21hZGNfYmF0X2dldF92b2x0YWdlKCkpID4gOTUpCisJCQkJdHdsNDAzMF9tYWRjX2JhdF9nZXRfdm9sdGFnZShiYXQpKSA+IDk1KQogCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7CiAJCWVsc2UgewotCQkJaWYgKHR3bDQwMzBfbWFkY19iYXRfZ2V0X2NoYXJnaW5nX3N0YXR1cygpKQorCQkJaWYgKHR3bDQwMzBfbWFkY19iYXRfZ2V0X2NoYXJnaW5nX3N0YXR1cyhiYXQpKQogCQkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKIAkJCWVsc2UKIAkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX05PVzoKLQkJdmFsLT5pbnR2YWwgPSB0d2w0MDMwX21hZGNfYmF0X2dldF92b2x0YWdlKCkgKiAxMDAwOworCQl2YWwtPmludHZhbCA9IHR3bDQwMzBfbWFkY19iYXRfZ2V0X3ZvbHRhZ2UoYmF0KSAqIDEwMDA7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVEVDSE5PTE9HWToKIAkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfVEVDSE5PTE9HWV9MSU9OOwogCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfTk9XOgotCQl2YWwtPmludHZhbCA9IHR3bDQwMzBfbWFkY19iYXRfZ2V0X2N1cnJlbnQoKTsKKwkJdmFsLT5pbnR2YWwgPSB0d2w0MDMwX21hZGNfYmF0X2dldF9jdXJyZW50KGJhdCk7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKIAkJLyogYXNzdW1lIGJhdHRlcnkgaXMgYWx3YXlzIHByZXNlbnQgKi8KQEAgLTE0MywyMyArMTM3LDIzIEBACiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfQ0hBUkdFX05PVzogewogCQkJaW50IHBlcmNlbnQgPSB0d2w0MDMwX21hZGNfYmF0X3ZvbHRzY2FsZShiYXQsCi0JCQkJCXR3bDQwMzBfbWFkY19iYXRfZ2V0X3ZvbHRhZ2UoKSk7CisJCQkJCXR3bDQwMzBfbWFkY19iYXRfZ2V0X3ZvbHRhZ2UoYmF0KSk7CiAJCQl2YWwtPmludHZhbCA9IChwZXJjZW50ICogYmF0LT5wZGF0YS0+Y2FwYWNpdHkpIC8gMTAwOwogCQkJYnJlYWs7CiAJCX0KIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZOgogCQl2YWwtPmludHZhbCA9IHR3bDQwMzBfbWFkY19iYXRfdm9sdHNjYWxlKGJhdCwKLQkJCQkJdHdsNDAzMF9tYWRjX2JhdF9nZXRfdm9sdGFnZSgpKTsKKwkJCQkJdHdsNDAzMF9tYWRjX2JhdF9nZXRfdm9sdGFnZShiYXQpKTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTDoKIAkJdmFsLT5pbnR2YWwgPSBiYXQtPnBkYXRhLT5jYXBhY2l0eTsKIAkJYnJlYWs7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9URU1QOgotCQl2YWwtPmludHZhbCA9IHR3bDQwMzBfbWFkY19iYXRfZ2V0X3RlbXAoKTsKKwkJdmFsLT5pbnR2YWwgPSB0d2w0MDMwX21hZGNfYmF0X2dldF90ZW1wKGJhdCk7CiAJCWJyZWFrOwogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfVElNRV9UT19FTVBUWV9OT1c6IHsKIAkJCWludCBwZXJjZW50ID0gdHdsNDAzMF9tYWRjX2JhdF92b2x0c2NhbGUoYmF0LAotCQkJCQl0d2w0MDMwX21hZGNfYmF0X2dldF92b2x0YWdlKCkpOworCQkJCQl0d2w0MDMwX21hZGNfYmF0X2dldF92b2x0YWdlKGJhdCkpOwogCQkJLyogaW4gbUFoICovCiAJCQlpbnQgY2hnID0gKHBlcmNlbnQgKiAoYmF0LT5wZGF0YS0+Y2FwYWNpdHkvMTAwMCkpLzEwMDsKIApAQCAtMTc2LDEyICsxNzAsMTkgQEAKIAogc3RhdGljIHZvaWQgdHdsNDAzMF9tYWRjX2JhdF9leHRfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCiB7Ci0Jc3RydWN0IHR3bDQwMzBfbWFkY19iYXR0ZXJ5ICpiYXQgPSBjb250YWluZXJfb2YocHN5LAotCQkJCQlzdHJ1Y3QgdHdsNDAzMF9tYWRjX2JhdHRlcnksIHBzeSk7Ci0KLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmYmF0LT5wc3kpOworCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBzeSk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgdHdsNDAzMF9tYWRjX2JhdF9kZXNjID0geworCS5uYW1lCQkJPSAidHdsNDAzMF9iYXR0ZXJ5IiwKKwkudHlwZQkJCT0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWSwKKwkucHJvcGVydGllcwkJPSB0d2w0MDMwX21hZGNfYmF0X3Byb3BzLAorCS5udW1fcHJvcGVydGllcwkJPSBBUlJBWV9TSVpFKHR3bDQwMzBfbWFkY19iYXRfcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJCT0gdHdsNDAzMF9tYWRjX2JhdF9nZXRfcHJvcGVydHksCisJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQJPSB0d2w0MDMwX21hZGNfYmF0X2V4dF9jaGFuZ2VkLAorCit9OworCiBzdGF0aWMgaW50IHR3bDQwMzBfY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCiB7CiAJcmV0dXJuICgoc3RydWN0IHR3bDQwMzBfbWFkY19iYXRfY2FsaWJyYXRpb24gKiliKS0+dm9sdGFnZSAtCkBAIC0xOTIsMTkgKzE5MywzMSBAQAogewogCXN0cnVjdCB0d2w0MDMwX21hZGNfYmF0dGVyeSAqdHdsNDAzMF9tYWRjX2JhdDsKIAlzdHJ1Y3QgdHdsNDAzMF9tYWRjX2JhdF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKKwlpbnQgcmV0ID0gMDsKIAotCXR3bDQwMzBfbWFkY19iYXQgPSBremFsbG9jKHNpemVvZigqdHdsNDAzMF9tYWRjX2JhdCksIEdGUF9LRVJORUwpOworCXR3bDQwMzBfbWFkY19iYXQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp0d2w0MDMwX21hZGNfYmF0KSwKKwkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIXR3bDQwMzBfbWFkY19iYXQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JdHdsNDAzMF9tYWRjX2JhdC0+cHN5Lm5hbWUgPSAidHdsNDAzMF9iYXR0ZXJ5IjsKLQl0d2w0MDMwX21hZGNfYmF0LT5wc3kudHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX0JBVFRFUlk7Ci0JdHdsNDAzMF9tYWRjX2JhdC0+cHN5LnByb3BlcnRpZXMgPSB0d2w0MDMwX21hZGNfYmF0X3Byb3BzOwotCXR3bDQwMzBfbWFkY19iYXQtPnBzeS5udW1fcHJvcGVydGllcyA9Ci0JCQkJCUFSUkFZX1NJWkUodHdsNDAzMF9tYWRjX2JhdF9wcm9wcyk7Ci0JdHdsNDAzMF9tYWRjX2JhdC0+cHN5LmdldF9wcm9wZXJ0eSA9IHR3bDQwMzBfbWFkY19iYXRfZ2V0X3Byb3BlcnR5OwotCXR3bDQwMzBfbWFkY19iYXQtPnBzeS5leHRlcm5hbF9wb3dlcl9jaGFuZ2VkID0KLQkJCQkJdHdsNDAzMF9tYWRjX2JhdF9leHRfY2hhbmdlZDsKKwl0d2w0MDMwX21hZGNfYmF0LT5jaGFubmVsX3RlbXAgPSBpaW9fY2hhbm5lbF9nZXQoJnBkZXYtPmRldiwgInRlbXAiKTsKKwlpZiAoSVNfRVJSKHR3bDQwMzBfbWFkY19iYXQtPmNoYW5uZWxfdGVtcCkpIHsKKwkJcmV0ID0gUFRSX0VSUih0d2w0MDMwX21hZGNfYmF0LT5jaGFubmVsX3RlbXApOworCQlnb3RvIGVycjsKKwl9CisKKwl0d2w0MDMwX21hZGNfYmF0LT5jaGFubmVsX2ljaGcgPSBpaW9fY2hhbm5lbF9nZXQoJnBkZXYtPmRldiwgImljaGciKTsKKwlpZiAoSVNfRVJSKHR3bDQwMzBfbWFkY19iYXQtPmNoYW5uZWxfaWNoZykpIHsKKwkJcmV0ID0gUFRSX0VSUih0d2w0MDMwX21hZGNfYmF0LT5jaGFubmVsX2ljaGcpOworCQlnb3RvIGVycl90ZW1wOworCX0KKworCXR3bDQwMzBfbWFkY19iYXQtPmNoYW5uZWxfdmJhdCA9IGlpb19jaGFubmVsX2dldCgmcGRldi0+ZGV2LCAidmJhdCIpOworCWlmIChJU19FUlIodHdsNDAzMF9tYWRjX2JhdC0+Y2hhbm5lbF92YmF0KSkgeworCQlyZXQgPSBQVFJfRVJSKHR3bDQwMzBfbWFkY19iYXQtPmNoYW5uZWxfdmJhdCk7CisJCWdvdG8gZXJyX2ljaGc7CisJfQogCiAJLyogc29ydCBjaGFyZ2luZyBhbmQgZGlzY2hhcmdpbmcgY2FsaWJyYXRpb24gZGF0YSAqLwogCXNvcnQocGRhdGEtPmNoYXJnaW5nLCBwZGF0YS0+Y2hhcmdpbmdfc2l6ZSwKQEAgLTIxNiwxNyArMjI5LDM2IEBACiAKIAl0d2w0MDMwX21hZGNfYmF0LT5wZGF0YSA9IHBkYXRhOwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHR3bDQwMzBfbWFkY19iYXQpOwotCXBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmdHdsNDAzMF9tYWRjX2JhdC0+cHN5KTsKKwlwc3lfY2ZnLmRydl9kYXRhID0gdHdsNDAzMF9tYWRjX2JhdDsKKwl0d2w0MDMwX21hZGNfYmF0LT5wc3kgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJCQkJCSAgICAgICZ0d2w0MDMwX21hZGNfYmF0X2Rlc2MsCisJCQkJCQkgICAgICAmcHN5X2NmZyk7CisJaWYgKElTX0VSUih0d2w0MDMwX21hZGNfYmF0LT5wc3kpKSB7CisJCXJldCA9IFBUUl9FUlIodHdsNDAzMF9tYWRjX2JhdC0+cHN5KTsKKwkJZ290byBlcnJfdmJhdDsKKwl9CiAKIAlyZXR1cm4gMDsKKworZXJyX3ZiYXQ6CisJaWlvX2NoYW5uZWxfcmVsZWFzZSh0d2w0MDMwX21hZGNfYmF0LT5jaGFubmVsX3ZiYXQpOworZXJyX2ljaGc6CisJaWlvX2NoYW5uZWxfcmVsZWFzZSh0d2w0MDMwX21hZGNfYmF0LT5jaGFubmVsX2ljaGcpOworZXJyX3RlbXA6CisJaWlvX2NoYW5uZWxfcmVsZWFzZSh0d2w0MDMwX21hZGNfYmF0LT5jaGFubmVsX3RlbXApOworZXJyOgorCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgdHdsNDAzMF9tYWRjX2JhdHRlcnlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHR3bDQwMzBfbWFkY19iYXR0ZXJ5ICpiYXQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZiYXQtPnBzeSk7Ci0Ja2ZyZWUoYmF0KTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihiYXQtPnBzeSk7CisKKwlpaW9fY2hhbm5lbF9yZWxlYXNlKGJhdC0+Y2hhbm5lbF92YmF0KTsKKwlpaW9fY2hhbm5lbF9yZWxlYXNlKGJhdC0+Y2hhbm5lbF9pY2hnKTsKKwlpaW9fY2hhbm5lbF9yZWxlYXNlKGJhdC0+Y2hhbm5lbF90ZW1wKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQzLDMgKzI3NSw0IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJMdWthcyBNw6RyZGlhbiA8bHVrYXNAZ29sZGVsaWNvLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigidHdsNDAzMF9tYWRjIGJhdHRlcnkgZHJpdmVyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnR3bDQwMzBfbWFkY19iYXR0ZXJ5Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3dtODMxeF9iYWNrdXAuYyBiL2RyaXZlcnMvcG93ZXIvd204MzF4X2JhY2t1cC5jCmluZGV4IDU2ZmI1MDkuLjJlMzMxMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvd204MzF4X2JhY2t1cC5jCisrKyBiL2RyaXZlcnMvcG93ZXIvd204MzF4X2JhY2t1cC5jCkBAIC0yMSw3ICsyMSw4IEBACiAKIHN0cnVjdCB3bTgzMXhfYmFja3VwIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXg7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSBiYWNrdXA7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmFja3VwOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyBiYWNrdXBfZGVzYzsKIAljaGFyIG5hbWVbMjBdOwogfTsKIApAQCAtMTE1LDcgKzExNiw3IEBACiAJCQkJICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkJICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCB3bTgzMXhfYmFja3VwICpkZXZkYXRhID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCB3bTgzMXhfYmFja3VwICpkZXZkYXRhID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGV2ZGF0YS0+d204MzF4OwogCWludCByZXQgPSAwOwogCkBAIC0xNjYsOCArMTY3LDYgQEAKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHdtODMxeF9wZGF0YSAqd204MzF4X3BkYXRhID0gd204MzF4LT5kZXYtPnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IHdtODMxeF9iYWNrdXAgKmRldmRhdGE7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqYmFja3VwOwotCWludCByZXQ7CiAKIAlkZXZkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgd204MzF4X2JhY2t1cCksCiAJCQkJR0ZQX0tFUk5FTCk7CkBAIC0xNzcsOCArMTc2LDYgQEAKIAlkZXZkYXRhLT53bTgzMXggPSB3bTgzMXg7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2ZGF0YSk7CiAKLQliYWNrdXAgPSAmZGV2ZGF0YS0+YmFja3VwOwotCiAJLyogV2UgaWdub3JlIGNvbmZpZ3VyYXRpb24gZmFpbHVyZXMgc2luY2Ugd2UgY2FuIHN0aWxsIHJlYWQKIAkgKiBiYWNrIHRoZSBzdGF0dXMgd2l0aG91dCBlbmFibGluZyB0aGUgY2hhcmdlciAod2hpY2ggbWF5CiAJICogYWxyZWFkeSBiZSBlbmFibGVkIGFueXdheSkuCkBAIC0xOTIsMjEgKzE4OSwyMiBAQAogCQlzbnByaW50ZihkZXZkYXRhLT5uYW1lLCBzaXplb2YoZGV2ZGF0YS0+bmFtZSksCiAJCQkgIndtODMxeC1iYWNrdXAiKTsKIAotCWJhY2t1cC0+bmFtZSA9IGRldmRhdGEtPm5hbWU7Ci0JYmFja3VwLT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKLQliYWNrdXAtPnByb3BlcnRpZXMgPSB3bTgzMXhfYmFja3VwX3Byb3BzOwotCWJhY2t1cC0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9iYWNrdXBfcHJvcHMpOwotCWJhY2t1cC0+Z2V0X3Byb3BlcnR5ID0gd204MzF4X2JhY2t1cF9nZXRfcHJvcDsKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgYmFja3VwKTsKKwlkZXZkYXRhLT5iYWNrdXBfZGVzYy5uYW1lID0gZGV2ZGF0YS0+bmFtZTsKKwlkZXZkYXRhLT5iYWNrdXBfZGVzYy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKKwlkZXZkYXRhLT5iYWNrdXBfZGVzYy5wcm9wZXJ0aWVzID0gd204MzF4X2JhY2t1cF9wcm9wczsKKwlkZXZkYXRhLT5iYWNrdXBfZGVzYy5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X2JhY2t1cF9wcm9wcyk7CisJZGV2ZGF0YS0+YmFja3VwX2Rlc2MuZ2V0X3Byb3BlcnR5ID0gd204MzF4X2JhY2t1cF9nZXRfcHJvcDsKKwlkZXZkYXRhLT5iYWNrdXAgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwKKwkJCQkJCSZkZXZkYXRhLT5iYWNrdXBfZGVzYywgTlVMTCk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBQVFJfRVJSX09SX1pFUk8oZGV2ZGF0YS0+YmFja3VwKTsKIH0KIAogc3RhdGljIGludCB3bTgzMXhfYmFja3VwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCB3bTgzMXhfYmFja3VwICpkZXZkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmZGV2ZGF0YS0+YmFja3VwKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihkZXZkYXRhLT5iYWNrdXApOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL3dtODMxeF9wb3dlci5jIGIvZHJpdmVycy9wb3dlci93bTgzMXhfcG93ZXIuYwppbmRleCAzYmVkMmY1Li4wMTYxYmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3dtODMxeF9wb3dlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvd204MzF4X3Bvd2VyLmMKQEAgLTIxLDkgKzIxLDEyIEBACiAKIHN0cnVjdCB3bTgzMXhfcG93ZXIgewogCXN0cnVjdCB3bTgzMXggKndtODMxeDsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IHdhbGw7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSB1c2I7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSBiYXR0ZXJ5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKndhbGw7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqdXNiOworCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHdhbGxfZGVzYzsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgdXNiX2Rlc2M7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGJhdHRlcnlfZGVzYzsKIAljaGFyIHdhbGxfbmFtZVsyMF07CiAJY2hhciB1c2JfbmFtZVsyMF07CiAJY2hhciBiYXR0ZXJ5X25hbWVbMjBdOwpAQCAtNjcsNyArNzAsNyBAQAogCQkJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCB3bTgzMXhfcG93ZXIgKndtODMxeF9wb3dlciA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd204MzF4X3Bvd2VyICp3bTgzMXhfcG93ZXIgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfcG93ZXItPndtODMxeDsKIAlpbnQgcmV0ID0gMDsKIApAQCAtOTgsNyArMTAxLDcgQEAKIAkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkgICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3Qgd204MzF4X3Bvd2VyICp3bTgzMXhfcG93ZXIgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYtPnBhcmVudCk7CisJc3RydWN0IHdtODMxeF9wb3dlciAqd204MzF4X3Bvd2VyID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gd204MzF4X3Bvd2VyLT53bTgzMXg7CiAJaW50IHJldCA9IDA7CiAKQEAgLTM5Myw3ICszOTYsNyBAQAogCQkJICAgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCSAgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCB3bTgzMXhfcG93ZXIgKndtODMxeF9wb3dlciA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd204MzF4X3Bvd2VyICp3bTgzMXhfcG93ZXIgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSB3bTgzMXhfcG93ZXItPndtODMxeDsKIAlpbnQgcmV0ID0gMDsKIApAQCAtNDUxLDcgKzQ1NCw3IEBACiAJLyogVGhlIGJhdHRlcnkgY2hhcmdlciBpcyBhdXRvbm9tb3VzIHNvIHdlIGRvbid0IG5lZWQgdG8gZG8KIAkgKiBhbnl0aGluZyBleGNlcHQga2ljayB1c2VyIHNwYWNlICovCiAJaWYgKHdtODMxeF9wb3dlci0+aGF2ZV9iYXR0ZXJ5KQotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmd204MzF4X3Bvd2VyLT5iYXR0ZXJ5KTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQod204MzF4X3Bvd2VyLT5iYXR0ZXJ5KTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTQ4Miw5ICs0ODUsOSBAQAogCiAJLyogSnVzdCBub3RpZnkgZm9yIGV2ZXJ5dGhpbmcgLSBsaXR0bGUgaGFybSBpbiBvdmVybm90aWZ5aW5nLiAqLwogCWlmICh3bTgzMXhfcG93ZXItPmhhdmVfYmF0dGVyeSkKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJndtODMxeF9wb3dlci0+YmF0dGVyeSk7Ci0JcG93ZXJfc3VwcGx5X2NoYW5nZWQoJndtODMxeF9wb3dlci0+dXNiKTsKLQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmd204MzF4X3Bvd2VyLT53YWxsKTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQod204MzF4X3Bvd2VyLT5iYXR0ZXJ5KTsKKwlwb3dlcl9zdXBwbHlfY2hhbmdlZCh3bTgzMXhfcG93ZXItPnVzYik7CisJcG93ZXJfc3VwcGx5X2NoYW5nZWQod204MzF4X3Bvd2VyLT53YWxsKTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KQEAgLTQ5NCw5ICs0OTcsNiBAQAogCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3Qgd204MzF4X3BkYXRhICp3bTgzMXhfcGRhdGEgPSB3bTgzMXgtPmRldi0+cGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3Qgd204MzF4X3Bvd2VyICpwb3dlcjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICp1c2I7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICp3YWxsOwogCWludCByZXQsIGlycSwgaTsKIAogCXBvd2VyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdtODMxeF9wb3dlciksIEdGUF9LRVJORUwpOwpAQCAtNTA2LDEwICs1MDYsNiBAQAogCXBvd2VyLT53bTgzMXggPSB3bTgzMXg7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcG93ZXIpOwogCi0JdXNiID0gJnBvd2VyLT51c2I7Ci0JYmF0dGVyeSA9ICZwb3dlci0+YmF0dGVyeTsKLQl3YWxsID0gJnBvd2VyLT53YWxsOwotCiAJaWYgKHdtODMxeF9wZGF0YSAmJiB3bTgzMXhfcGRhdGEtPndtODMxeF9udW0pIHsKIAkJc25wcmludGYocG93ZXItPndhbGxfbmFtZSwgc2l6ZW9mKHBvd2VyLT53YWxsX25hbWUpLAogCQkJICJ3bTgzMXgtd2FsbC4lZCIsIHdtODMxeF9wZGF0YS0+d204MzF4X251bSk7CkBAIC01MzEsMjMgKzUyNywyOCBAQAogCSAqLwogCXdtODMxeF9jb25maWdfYmF0dGVyeSh3bTgzMXgpOwogCi0Jd2FsbC0+bmFtZSA9IHBvd2VyLT53YWxsX25hbWU7Ci0Jd2FsbC0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOwotCXdhbGwtPnByb3BlcnRpZXMgPSB3bTgzMXhfd2FsbF9wcm9wczsKLQl3YWxsLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X3dhbGxfcHJvcHMpOwotCXdhbGwtPmdldF9wcm9wZXJ0eSA9IHdtODMxeF93YWxsX2dldF9wcm9wOwotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCB3YWxsKTsKLQlpZiAocmV0KQorCXBvd2VyLT53YWxsX2Rlc2MubmFtZSA9IHBvd2VyLT53YWxsX25hbWU7CisJcG93ZXItPndhbGxfZGVzYy50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlM7CisJcG93ZXItPndhbGxfZGVzYy5wcm9wZXJ0aWVzID0gd204MzF4X3dhbGxfcHJvcHM7CisJcG93ZXItPndhbGxfZGVzYy5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X3dhbGxfcHJvcHMpOworCXBvd2VyLT53YWxsX2Rlc2MuZ2V0X3Byb3BlcnR5ID0gd204MzF4X3dhbGxfZ2V0X3Byb3A7CisJcG93ZXItPndhbGwgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnBvd2VyLT53YWxsX2Rlc2MsCisJCQkJCSAgICBOVUxMKTsKKwlpZiAoSVNfRVJSKHBvd2VyLT53YWxsKSkgeworCQlyZXQgPSBQVFJfRVJSKHBvd2VyLT53YWxsKTsKIAkJZ290byBlcnJfa21hbGxvYzsKKwl9CiAKLQl1c2ItPm5hbWUgPSBwb3dlci0+dXNiX25hbWUsCi0JdXNiLT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOwotCXVzYi0+cHJvcGVydGllcyA9IHdtODMxeF91c2JfcHJvcHM7Ci0JdXNiLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X3VzYl9wcm9wcyk7Ci0JdXNiLT5nZXRfcHJvcGVydHkgPSB3bTgzMXhfdXNiX2dldF9wcm9wOwotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCB1c2IpOwotCWlmIChyZXQpCisJcG93ZXItPnVzYl9kZXNjLm5hbWUgPSBwb3dlci0+dXNiX25hbWUsCisJcG93ZXItPnVzYl9kZXNjLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0I7CisJcG93ZXItPnVzYl9kZXNjLnByb3BlcnRpZXMgPSB3bTgzMXhfdXNiX3Byb3BzOworCXBvd2VyLT51c2JfZGVzYy5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X3VzYl9wcm9wcyk7CisJcG93ZXItPnVzYl9kZXNjLmdldF9wcm9wZXJ0eSA9IHdtODMxeF91c2JfZ2V0X3Byb3A7CisJcG93ZXItPnVzYiA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmcG93ZXItPnVzYl9kZXNjLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBvd2VyLT51c2IpKSB7CisJCXJldCA9IFBUUl9FUlIocG93ZXItPnVzYik7CiAJCWdvdG8gZXJyX3dhbGw7CisJfQogCiAJcmV0ID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgV004MzFYX0NIQVJHRVJfQ09OVFJPTF8xKTsKIAlpZiAocmV0IDwgMCkKQEAgLTU1NSwxNCArNTU2LDE4IEBACiAJcG93ZXItPmhhdmVfYmF0dGVyeSA9IHJldCAmIFdNODMxWF9DSEdfRU5BOwogCiAJaWYgKHBvd2VyLT5oYXZlX2JhdHRlcnkpIHsKLQkJICAgIGJhdHRlcnktPm5hbWUgPSBwb3dlci0+YmF0dGVyeV9uYW1lOwotCQkgICAgYmF0dGVyeS0+cHJvcGVydGllcyA9IHdtODMxeF9iYXRfcHJvcHM7Ci0JCSAgICBiYXR0ZXJ5LT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X2JhdF9wcm9wcyk7Ci0JCSAgICBiYXR0ZXJ5LT5nZXRfcHJvcGVydHkgPSB3bTgzMXhfYmF0X2dldF9wcm9wOwotCQkgICAgYmF0dGVyeS0+dXNlX2Zvcl9hcG0gPSAxOwotCQkgICAgcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsIGJhdHRlcnkpOwotCQkgICAgaWYgKHJldCkKLQkJCSAgICBnb3RvIGVycl91c2I7CisJCXBvd2VyLT5iYXR0ZXJ5X2Rlc2MubmFtZSA9IHBvd2VyLT5iYXR0ZXJ5X25hbWU7CisJCXBvd2VyLT5iYXR0ZXJ5X2Rlc2MucHJvcGVydGllcyA9IHdtODMxeF9iYXRfcHJvcHM7CisJCXBvd2VyLT5iYXR0ZXJ5X2Rlc2MubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9iYXRfcHJvcHMpOworCQlwb3dlci0+YmF0dGVyeV9kZXNjLmdldF9wcm9wZXJ0eSA9IHdtODMxeF9iYXRfZ2V0X3Byb3A7CisJCXBvd2VyLT5iYXR0ZXJ5X2Rlc2MudXNlX2Zvcl9hcG0gPSAxOworCQlwb3dlci0+YmF0dGVyeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LAorCQkJCQkJICAgICAgICZwb3dlci0+YmF0dGVyeV9kZXNjLAorCQkJCQkJICAgICAgIE5VTEwpOworCQlpZiAoSVNfRVJSKHBvd2VyLT5iYXR0ZXJ5KSkgeworCQkJcmV0ID0gUFRSX0VSUihwb3dlci0+YmF0dGVyeSk7CisJCQlnb3RvIGVycl91c2I7CisJCX0KIAl9CiAKIAlpcnEgPSB3bTgzMXhfaXJxKHdtODMxeCwgcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIlNZU0xPIikpOwpAQCAtNjE1LDExICs2MjAsMTEgQEAKIAlmcmVlX2lycShpcnEsIHBvd2VyKTsKIGVycl9iYXR0ZXJ5OgogCWlmIChwb3dlci0+aGF2ZV9iYXR0ZXJ5KQotCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihiYXR0ZXJ5KTsKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocG93ZXItPmJhdHRlcnkpOwogZXJyX3VzYjoKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcih1c2IpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBvd2VyLT51c2IpOwogZXJyX3dhbGw6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIod2FsbCk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocG93ZXItPndhbGwpOwogZXJyX2ttYWxsb2M6CiAJa2ZyZWUocG93ZXIpOwogCXJldHVybiByZXQ7CkBAIC02NDUsOSArNjUwLDkgQEAKIAlmcmVlX2lycShpcnEsIHdtODMxeF9wb3dlcik7CiAKIAlpZiAod204MzF4X3Bvd2VyLT5oYXZlX2JhdHRlcnkpCi0JCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZ3bTgzMXhfcG93ZXItPmJhdHRlcnkpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZ3bTgzMXhfcG93ZXItPndhbGwpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZ3bTgzMXhfcG93ZXItPnVzYik7CisJCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHdtODMxeF9wb3dlci0+YmF0dGVyeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIod204MzF4X3Bvd2VyLT53YWxsKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcih3bTgzMXhfcG93ZXItPnVzYik7CiAJa2ZyZWUod204MzF4X3Bvd2VyKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvd204MzUwX3Bvd2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3dtODM1MF9wb3dlci5jCmluZGV4IGIzNjA3ZTIuLjVjNTg4MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvd204MzUwX3Bvd2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci93bTgzNTBfcG93ZXIuYwpAQCAtMTk2LDE0ICsxOTYsMTQgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTTgzNTBfSVJRX0NIR19UTzoKIAkJZGV2X2Vycih3bTgzNTAtPmRldiwgImNoYXJnZXIgdGltZW91dFxuIik7Ci0JCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZwb3dlci0+YmF0dGVyeSk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKHBvd2VyLT5iYXR0ZXJ5KTsKIAkJYnJlYWs7CiAKIAljYXNlIFdNODM1MF9JUlFfQ0hHX0JBVF9IT1Q6CiAJY2FzZSBXTTgzNTBfSVJRX0NIR19CQVRfQ09MRDoKIAljYXNlIFdNODM1MF9JUlFfQ0hHX1NUQVJUOgogCWNhc2UgV004MzUwX0lSUV9DSEdfRU5EOgotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcG93ZXItPmJhdHRlcnkpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwb3dlci0+YmF0dGVyeSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTTgzNTBfSVJRX0NIR19GQVNUX1JEWToKQEAgLTIzMSw5ICsyMzEsOSBAQAogCWNhc2UgV004MzUwX0lSUV9FWFRfV0FMTF9GQjoKIAkJd204MzUwX2NoYXJnZXJfY29uZmlnKHdtODM1MCwgcG9saWN5KTsKIAljYXNlIFdNODM1MF9JUlFfRVhUX0JBVF9GQjogICAvKiBGYWxsIHRocm91Z2ggKi8KLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJnBvd2VyLT5iYXR0ZXJ5KTsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJnBvd2VyLT51c2IpOwotCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmcG93ZXItPmFjKTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQocG93ZXItPmJhdHRlcnkpOworCQlwb3dlcl9zdXBwbHlfY2hhbmdlZChwb3dlci0+dXNiKTsKKwkJcG93ZXJfc3VwcGx5X2NoYW5nZWQocG93ZXItPmFjKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjUwLDcgKzI1MCw3IEBACiAJCQkgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkgICAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYucGFyZW50KTsKIAlpbnQgcmV0ID0gMDsKIAogCXN3aXRjaCAocHNwKSB7CkBAIC0yODAsNyArMjgwLDcgQEAKIAkJCSAgICAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkgICAgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3Qgd204MzUwICp3bTgzNTAgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYtPnBhcmVudCk7CisJc3RydWN0IHdtODM1MCAqd204MzUwID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LnBhcmVudCk7CiAJaW50IHJldCA9IDA7CiAKIAlzd2l0Y2ggKHBzcCkgewpAQCAtMzQ2LDcgKzM0Niw3IEBACiAJCQkJICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAogCQkJCSAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IHdtODM1MCAqd204MzUwID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi5wYXJlbnQpOwogCWludCByZXQgPSAwOwogCiAJc3dpdGNoIChwc3ApIHsKQEAgLTM4Miw2ICszODIsMzAgQEAKIAlQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfVFlQRSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2Mgd204MzUwX2FjX2Rlc2MgPSB7CisJLm5hbWUJCT0gIndtODM1MC1hYyIsCisJLnR5cGUJCT0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCisJLnByb3BlcnRpZXMJPSB3bTgzNTBfYWNfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRSh3bTgzNTBfYWNfcHJvcHMpLAorCS5nZXRfcHJvcGVydHkJPSB3bTgzNTBfYWNfZ2V0X3Byb3AsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIHdtODM1MF9iYXR0ZXJ5X2Rlc2MgPSB7CisJLm5hbWUJCT0gIndtODM1MC1iYXR0ZXJ5IiwKKwkucHJvcGVydGllcwk9IHdtODM1MF9iYXRfcHJvcHMsCisJLm51bV9wcm9wZXJ0aWVzCT0gQVJSQVlfU0laRSh3bTgzNTBfYmF0X3Byb3BzKSwKKwkuZ2V0X3Byb3BlcnR5CT0gd204MzUwX2JhdF9nZXRfcHJvcGVydHksCisJLnVzZV9mb3JfYXBtCT0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2Mgd204MzUwX3VzYl9kZXNjID0geworCS5uYW1lCQk9ICJ3bTgzNTAtdXNiIiwKKwkudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9VU0IsCisJLnByb3BlcnRpZXMJPSB3bTgzNTBfdXNiX3Byb3BzLAorCS5udW1fcHJvcGVydGllcwk9IEFSUkFZX1NJWkUod204MzUwX3VzYl9wcm9wcyksCisJLmdldF9wcm9wZXJ0eQk9IHdtODM1MF91c2JfZ2V0X3Byb3AsCit9OworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJSW5pdGlhbGlzYXRpb24KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00NDcsMzcgKzQ3MSwyNCBAQAogCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCB3bTgzNTBfcG93ZXIgKnBvd2VyID0gJndtODM1MC0+cG93ZXI7CiAJc3RydWN0IHdtODM1MF9jaGFyZ2VyX3BvbGljeSAqcG9saWN5ID0gcG93ZXItPnBvbGljeTsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICp1c2IgPSAmcG93ZXItPnVzYjsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0ZXJ5ID0gJnBvd2VyLT5iYXR0ZXJ5OwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmFjID0gJnBvd2VyLT5hYzsKIAlpbnQgcmV0OwogCi0JYWMtPm5hbWUgPSAid204MzUwLWFjIjsKLQlhYy0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOwotCWFjLT5wcm9wZXJ0aWVzID0gd204MzUwX2FjX3Byb3BzOwotCWFjLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzUwX2FjX3Byb3BzKTsKLQlhYy0+Z2V0X3Byb3BlcnR5ID0gd204MzUwX2FjX2dldF9wcm9wOwotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCBhYyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlwb3dlci0+YWMgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJndtODM1MF9hY19kZXNjLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHBvd2VyLT5hYykpCisJCXJldHVybiBQVFJfRVJSKHBvd2VyLT5hYyk7CiAKLQliYXR0ZXJ5LT5uYW1lID0gIndtODM1MC1iYXR0ZXJ5IjsKLQliYXR0ZXJ5LT5wcm9wZXJ0aWVzID0gd204MzUwX2JhdF9wcm9wczsKLQliYXR0ZXJ5LT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzUwX2JhdF9wcm9wcyk7Ci0JYmF0dGVyeS0+Z2V0X3Byb3BlcnR5ID0gd204MzUwX2JhdF9nZXRfcHJvcGVydHk7Ci0JYmF0dGVyeS0+dXNlX2Zvcl9hcG0gPSAxOwotCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCBiYXR0ZXJ5KTsKLQlpZiAocmV0KQorCXBvd2VyLT5iYXR0ZXJ5ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZ3bTgzNTBfYmF0dGVyeV9kZXNjLAorCQkJCQkgICAgICAgTlVMTCk7CisJaWYgKElTX0VSUihwb3dlci0+YmF0dGVyeSkpIHsKKwkJcmV0ID0gUFRSX0VSUihwb3dlci0+YmF0dGVyeSk7CiAJCWdvdG8gYmF0dGVyeV9mYWlsZWQ7CisJfQogCi0JdXNiLT5uYW1lID0gIndtODM1MC11c2IiLAotCXVzYi0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX1VTQjsKLQl1c2ItPnByb3BlcnRpZXMgPSB3bTgzNTBfdXNiX3Byb3BzOwotCXVzYi0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdtODM1MF91c2JfcHJvcHMpOwotCXVzYi0+Z2V0X3Byb3BlcnR5ID0gd204MzUwX3VzYl9nZXRfcHJvcDsKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgdXNiKTsKLQlpZiAocmV0KQorCXBvd2VyLT51c2IgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJndtODM1MF91c2JfZGVzYywgTlVMTCk7CisJaWYgKElTX0VSUihwb3dlci0+dXNiKSkgeworCQlyZXQgPSBQVFJfRVJSKHBvd2VyLT51c2IpOwogCQlnb3RvIHVzYl9mYWlsZWQ7CisJfQogCiAJcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9jaGFyZ2VyX3N0YXRlKTsKIAlpZiAocmV0IDwgMCkKQEAgLTQ5NCw5ICs1MDUsOSBAQAogCXJldHVybiByZXQ7CiAKIHVzYl9mYWlsZWQ6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYmF0dGVyeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocG93ZXItPmJhdHRlcnkpOwogYmF0dGVyeV9mYWlsZWQ6Ci0JcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoYWMpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKHBvd2VyLT5hYyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTA4LDkgKzUxOSw5IEBACiAKIAlmcmVlX2NoYXJnZXJfaXJxKHdtODM1MCk7CiAJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9jaGFyZ2VyX3N0YXRlKTsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmcG93ZXItPmJhdHRlcnkpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZwb3dlci0+YWMpOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZwb3dlci0+dXNiKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcihwb3dlci0+YmF0dGVyeSk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIocG93ZXItPmFjKTsKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3Rlcihwb3dlci0+dXNiKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci93bTk3eHhfYmF0dGVyeS5jIGIvZHJpdmVycy9wb3dlci93bTk3eHhfYmF0dGVyeS5jCmluZGV4IGE4ZTYyMDMuLmMyZjA5ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvd205N3h4X2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL3dtOTd4eF9iYXR0ZXJ5LmMKQEAgLTMyLDIwICszMiwyMCBAQAogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB3bTk3eHhfcmVhZF9iYXQoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzKQogewotCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGJhdF9wcy0+ZGV2LT5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHdtOTd4eF9wZGF0YSAqd21kYXRhID0gYmF0X3BzLT5kZXYucGFyZW50LT5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCB3bTk3eHhfYmF0dF9wZGF0YSAqcGRhdGEgPSB3bWRhdGEtPmJhdHRfcGRhdGE7CiAKLQlyZXR1cm4gd205N3h4X3JlYWRfYXV4X2FkYyhkZXZfZ2V0X2RydmRhdGEoYmF0X3BzLT5kZXYtPnBhcmVudCksCisJcmV0dXJuIHdtOTd4eF9yZWFkX2F1eF9hZGMoZGV2X2dldF9kcnZkYXRhKGJhdF9wcy0+ZGV2LnBhcmVudCksCiAJCQkJCXBkYXRhLT5iYXR0X2F1eCkgKiBwZGF0YS0+YmF0dF9tdWx0IC8KIAkJCQkJcGRhdGEtPmJhdHRfZGl2OwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB3bTk3eHhfcmVhZF90ZW1wKHN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhdF9wcykKIHsKLQlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBiYXRfcHMtPmRldi0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGJhdF9wcy0+ZGV2LnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3Qgd205N3h4X2JhdHRfcGRhdGEgKnBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOwogCi0JcmV0dXJuIHdtOTd4eF9yZWFkX2F1eF9hZGMoZGV2X2dldF9kcnZkYXRhKGJhdF9wcy0+ZGV2LT5wYXJlbnQpLAorCXJldHVybiB3bTk3eHhfcmVhZF9hdXhfYWRjKGRldl9nZXRfZHJ2ZGF0YShiYXRfcHMtPmRldi5wYXJlbnQpLAogCQkJCQlwZGF0YS0+dGVtcF9hdXgpICogcGRhdGEtPnRlbXBfbXVsdCAvCiAJCQkJCXBkYXRhLT50ZW1wX2RpdjsKIH0KQEAgLTU0LDcgKzU0LDcgQEAKIAkJCSAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBiYXRfcHMtPmRldi0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGJhdF9wcy0+ZGV2LnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3Qgd205N3h4X2JhdHRfcGRhdGEgKnBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOwogCiAJc3dpdGNoIChwc3ApIHsKQEAgLTEwNSw3ICsxMDUsNyBAQAogc3RhdGljIHZvaWQgd205N3h4X2JhdF91cGRhdGUoc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzKQogewogCWludCBvbGRfc3RhdHVzID0gYmF0X3N0YXR1czsKLQlzdHJ1Y3Qgd205N3h4X3BkYXRhICp3bWRhdGEgPSBiYXRfcHMtPmRldi0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCB3bTk3eHhfcGRhdGEgKndtZGF0YSA9IGJhdF9wcy0+ZGV2LnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3Qgd205N3h4X2JhdHRfcGRhdGEgKnBkYXRhID0gd21kYXRhLT5iYXR0X3BkYXRhOwogCiAJbXV0ZXhfbG9jaygmd29ya19sb2NrKTsKQEAgLTExNyw3ICsxMTcsNyBAQAogCQkJUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOwogCiAJaWYgKG9sZF9zdGF0dXMgIT0gYmF0X3N0YXR1cykgewotCQlwcl9kZWJ1ZygiJXM6ICVpIC0+ICVpXG4iLCBiYXRfcHMtPm5hbWUsIG9sZF9zdGF0dXMsCisJCXByX2RlYnVnKCIlczogJWkgLT4gJWlcbiIsIGJhdF9wcy0+ZGVzYy0+bmFtZSwgb2xkX3N0YXR1cywKIAkJCQkJYmF0X3N0YXR1cyk7CiAJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGJhdF9wcyk7CiAJfQpAQCAtMTI1LDcgKzEyNSw4IEBACiAJbXV0ZXhfdW5sb2NrKCZ3b3JrX2xvY2spOwogfQogCi1zdGF0aWMgc3RydWN0IHBvd2VyX3N1cHBseSBiYXRfcHMgPSB7CitzdGF0aWMgc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0X3BzeTsKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgYmF0X3BzeV9kZXNjID0gewogCS50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAogCS5nZXRfcHJvcGVydHkJCT0gd205N3h4X2JhdF9nZXRfcHJvcGVydHksCiAJLmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPSB3bTk3eHhfYmF0X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQsCkBAIC0xMzQsNyArMTM1LDcgQEAKIAogc3RhdGljIHZvaWQgd205N3h4X2JhdF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQl3bTk3eHhfYmF0X3VwZGF0ZSgmYmF0X3BzKTsKKwl3bTk3eHhfYmF0X3VwZGF0ZShiYXRfcHN5KTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IHdtOTd4eF9jaHJnX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQpAQCAtMjM3LDE4ICsyMzgsMjAgQEAKIAkJZGV2X2luZm8oJmRldi0+ZGV2LCAiUGxlYXNlIGNvbnNpZGVyIHNldHRpbmcgcHJvcGVyIGJhdHRlcnkgIgogCQkJCSJuYW1lIGluIHBsYXRmb3JtIGRlZmluaXRpb24gZmlsZSwgZmFsbGluZyAiCiAJCQkJImJhY2sgdG8gbmFtZSBcIndtOTd4eC1iYXR0XCJcbiIpOwotCQliYXRfcHMubmFtZSA9ICJ3bTk3eHgtYmF0dCI7CisJCWJhdF9wc3lfZGVzYy5uYW1lID0gIndtOTd4eC1iYXR0IjsKIAl9IGVsc2UKLQkJYmF0X3BzLm5hbWUgPSBwZGF0YS0+YmF0dF9uYW1lOworCQliYXRfcHN5X2Rlc2MubmFtZSA9IHBkYXRhLT5iYXR0X25hbWU7CiAKLQliYXRfcHMucHJvcGVydGllcyA9IHByb3A7Ci0JYmF0X3BzLm51bV9wcm9wZXJ0aWVzID0gcHJvcHM7CisJYmF0X3BzeV9kZXNjLnByb3BlcnRpZXMgPSBwcm9wOworCWJhdF9wc3lfZGVzYy5udW1fcHJvcGVydGllcyA9IHByb3BzOwogCi0JcmV0ID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZkZXYtPmRldiwgJmJhdF9wcyk7Ci0JaWYgKCFyZXQpCisJYmF0X3BzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmZGV2LT5kZXYsICZiYXRfcHN5X2Rlc2MsIE5VTEwpOworCWlmICghSVNfRVJSKGJhdF9wc3kpKSB7CiAJCXNjaGVkdWxlX3dvcmsoJmJhdF93b3JrKTsKLQllbHNlCisJfSBlbHNlIHsKKwkJcmV0ID0gUFRSX0VSUihiYXRfcHN5KTsKIAkJZ290byBlcnI0OworCX0KIAogCXJldHVybiAwOwogZXJyNDoKQEAgLTI3Myw3ICsyNzYsNyBAQAogCQlncGlvX2ZyZWUocGRhdGEtPmNoYXJnZV9ncGlvKTsKIAl9CiAJY2FuY2VsX3dvcmtfc3luYygmYmF0X3dvcmspOwotCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZiYXRfcHMpOworCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKGJhdF9wc3kpOwogCWtmcmVlKHByb3ApOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci96Ml9iYXR0ZXJ5LmMgYi9kcml2ZXJzL3Bvd2VyL3oyX2JhdHRlcnkuYwppbmRleCA4MTRkMmUzLi5iMjAxZTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL3oyX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL3oyX2JhdHRlcnkuYwpAQCAtMjEsMTIgKzIxLDEzIEBACiAjZGVmaW5lCVoyX0RFRkFVTFRfTkFNRQkiWjIiCiAKIHN0cnVjdCB6Ml9jaGFyZ2VyIHsKLQlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvCSppbmZvOwotCWludAkJCWJhdF9zdGF0dXM7Ci0Jc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5CWJhdHRfcHM7Ci0Jc3RydWN0IG11dGV4CQl3b3JrX2xvY2s7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CWJhdF93b3JrOworCXN0cnVjdCB6Ml9iYXR0ZXJ5X2luZm8JCSppbmZvOworCWludAkJCQliYXRfc3RhdHVzOworCXN0cnVjdCBpMmNfY2xpZW50CQkqY2xpZW50OworCXN0cnVjdCBwb3dlcl9zdXBwbHkJCSpiYXR0X3BzOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYwliYXR0X3BzX2Rlc2M7CisJc3RydWN0IG11dGV4CQkJd29ya19sb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJYmF0X3dvcms7CiB9OwogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB6Ml9yZWFkX2JhdChzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlcikKQEAgLTQ0LDggKzQ1LDcgQEAKIAkJCSAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKIHsKLQlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlciA9IGNvbnRhaW5lcl9vZihiYXR0X3BzLCBzdHJ1Y3QgejJfY2hhcmdlciwKLQkJCQkJCWJhdHRfcHMpOworCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyID0gcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKGJhdHRfcHMpOwogCXN0cnVjdCB6Ml9iYXR0ZXJ5X2luZm8gKmluZm8gPSBjaGFyZ2VyLT5pbmZvOwogCiAJc3dpdGNoIChwc3ApIHsKQEAgLTg1LDggKzg1LDggQEAKIAogc3RhdGljIHZvaWQgejJfYmF0dF9leHRfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0X3BzKQogewotCXN0cnVjdCB6Ml9jaGFyZ2VyICpjaGFyZ2VyID0gY29udGFpbmVyX29mKGJhdHRfcHMsIHN0cnVjdCB6Ml9jaGFyZ2VyLAotCQkJCQkJYmF0dF9wcyk7CisJc3RydWN0IHoyX2NoYXJnZXIgKmNoYXJnZXIgPSBwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEoYmF0dF9wcyk7CisKIAlzY2hlZHVsZV93b3JrKCZjaGFyZ2VyLT5iYXRfd29yayk7CiB9CiAKQEAgLTEwNiw5ICsxMDYsMTAgQEAKIAkJUE9XRVJfU1VQUExZX1NUQVRVU19VTktOT1dOOwogCiAJaWYgKG9sZF9zdGF0dXMgIT0gY2hhcmdlci0+YmF0X3N0YXR1cykgewotCQlwcl9kZWJ1ZygiJXM6ICVpIC0+ICVpXG4iLCBjaGFyZ2VyLT5iYXR0X3BzLm5hbWUsIG9sZF9zdGF0dXMsCi0JCQljaGFyZ2VyLT5iYXRfc3RhdHVzKTsKLQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmNoYXJnZXItPmJhdHRfcHMpOworCQlwcl9kZWJ1ZygiJXM6ICVpIC0+ICVpXG4iLCBjaGFyZ2VyLT5iYXR0X3BzLT5kZXNjLT5uYW1lLAorCQkJCW9sZF9zdGF0dXMsCisJCQkJY2hhcmdlci0+YmF0X3N0YXR1cyk7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKGNoYXJnZXItPmJhdHRfcHMpOwogCX0KIAogCW11dGV4X3VubG9jaygmY2hhcmdlci0+d29ya19sb2NrKTsKQEAgLTE2NiwxNiArMTY3LDE3IEBACiAJCQkJIlBsZWFzZSBjb25zaWRlciBzZXR0aW5nIHByb3BlciBiYXR0ZXJ5ICIKIAkJCQkibmFtZSBpbiBwbGF0Zm9ybSBkZWZpbml0aW9uIGZpbGUsIGZhbGxpbmcgIgogCQkJCSJiYWNrIHRvIG5hbWUgXCIgWjJfREVGQVVMVF9OQU1FIFwiXG4iKTsKLQkJY2hhcmdlci0+YmF0dF9wcy5uYW1lID0gWjJfREVGQVVMVF9OQU1FOworCQljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MubmFtZSA9IFoyX0RFRkFVTFRfTkFNRTsKIAl9IGVsc2UKLQkJY2hhcmdlci0+YmF0dF9wcy5uYW1lID0gaW5mby0+YmF0dF9uYW1lOworCQljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MubmFtZSA9IGluZm8tPmJhdHRfbmFtZTsKIAotCWNoYXJnZXItPmJhdHRfcHMucHJvcGVydGllcwkJPSBwcm9wOwotCWNoYXJnZXItPmJhdHRfcHMubnVtX3Byb3BlcnRpZXMJCT0gcHJvcHM7Ci0JY2hhcmdlci0+YmF0dF9wcy50eXBlCQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOwotCWNoYXJnZXItPmJhdHRfcHMuZ2V0X3Byb3BlcnR5CQk9IHoyX2JhdHRfZ2V0X3Byb3BlcnR5OwotCWNoYXJnZXItPmJhdHRfcHMuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZAk9IHoyX2JhdHRfZXh0X3Bvd2VyX2NoYW5nZWQ7Ci0JY2hhcmdlci0+YmF0dF9wcy51c2VfZm9yX2FwbQkJPSAxOworCWNoYXJnZXItPmJhdHRfcHNfZGVzYy5wcm9wZXJ0aWVzCT0gcHJvcDsKKwljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MubnVtX3Byb3BlcnRpZXMJPSBwcm9wczsKKwljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MudHlwZQkJPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCWNoYXJnZXItPmJhdHRfcHNfZGVzYy5nZXRfcHJvcGVydHkJPSB6Ml9iYXR0X2dldF9wcm9wZXJ0eTsKKwljaGFyZ2VyLT5iYXR0X3BzX2Rlc2MuZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZCA9CisJCQkJCQl6Ml9iYXR0X2V4dF9wb3dlcl9jaGFuZ2VkOworCWNoYXJnZXItPmJhdHRfcHNfZGVzYy51c2VfZm9yX2FwbQk9IDE7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE4Nyw2ICsxODksNyBAQAogCWludCBwcm9wcyA9IDE7CS8qIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQgKi8KIAlzdHJ1Y3QgejJfY2hhcmdlciAqY2hhcmdlcjsKIAlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvICppbmZvID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5X2NvbmZpZyBwc3lfY2ZnID0ge307CiAKIAlpZiAoaW5mbyA9PSBOVUxMKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LApAQCAtMjAzLDYgKzIwNiw3IEBACiAJY2hhcmdlci0+aW5mbyA9IGluZm87CiAJY2hhcmdlci0+Y2xpZW50ID0gY2xpZW50OwogCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGNoYXJnZXIpOworCXBzeV9jZmcuZHJ2X2RhdGEgPSBjaGFyZ2VyOwogCiAJbXV0ZXhfaW5pdCgmY2hhcmdlci0+d29ya19sb2NrKTsKIApAQCAtMjMwLDE2ICsyMzQsMjAgQEAKIAogCUlOSVRfV09SSygmY2hhcmdlci0+YmF0X3dvcmssIHoyX2JhdHRfd29yayk7CiAKLQlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmY2hhcmdlci0+YmF0dF9wcyk7Ci0JaWYgKHJldCkKKwljaGFyZ2VyLT5iYXR0X3BzID0gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZjbGllbnQtPmRldiwKKwkJCQkJCSAmY2hhcmdlci0+YmF0dF9wc19kZXNjLAorCQkJCQkJICZwc3lfY2ZnKTsKKwlpZiAoSVNfRVJSKGNoYXJnZXItPmJhdHRfcHMpKSB7CisJCXJldCA9IFBUUl9FUlIoY2hhcmdlci0+YmF0dF9wcyk7CiAJCWdvdG8gZXJyNDsKKwl9CiAKIAlzY2hlZHVsZV93b3JrKCZjaGFyZ2VyLT5iYXRfd29yayk7CiAKIAlyZXR1cm4gMDsKIAogZXJyNDoKLQlrZnJlZShjaGFyZ2VyLT5iYXR0X3BzLnByb3BlcnRpZXMpOworCWtmcmVlKGNoYXJnZXItPmJhdHRfcHNfZGVzYy5wcm9wZXJ0aWVzKTsKIGVycjM6CiAJaWYgKGluZm8tPmNoYXJnZV9ncGlvID49IDAgJiYgZ3Bpb19pc192YWxpZChpbmZvLT5jaGFyZ2VfZ3BpbykpCiAJCWZyZWVfaXJxKGdwaW9fdG9faXJxKGluZm8tPmNoYXJnZV9ncGlvKSwgY2hhcmdlcik7CkBAIC0yNTcsOSArMjY1LDkgQEAKIAlzdHJ1Y3QgejJfYmF0dGVyeV9pbmZvICppbmZvID0gY2hhcmdlci0+aW5mbzsKIAogCWNhbmNlbF93b3JrX3N5bmMoJmNoYXJnZXItPmJhdF93b3JrKTsKLQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmY2hhcmdlci0+YmF0dF9wcyk7CisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoY2hhcmdlci0+YmF0dF9wcyk7CiAKLQlrZnJlZShjaGFyZ2VyLT5iYXR0X3BzLnByb3BlcnRpZXMpOworCWtmcmVlKGNoYXJnZXItPmJhdHRfcHNfZGVzYy5wcm9wZXJ0aWVzKTsKIAlpZiAoaW5mby0+Y2hhcmdlX2dwaW8gPj0gMCAmJiBncGlvX2lzX3ZhbGlkKGluZm8tPmNoYXJnZV9ncGlvKSkgewogCQlmcmVlX2lycShncGlvX3RvX2lycShpbmZvLT5jaGFyZ2VfZ3BpbyksIGNoYXJnZXIpOwogCQlncGlvX2ZyZWUoaW5mby0+Y2hhcmdlX2dwaW8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlcmNhcC9pbnRlbF9yYXBsLmMgYi9kcml2ZXJzL3Bvd2VyY2FwL2ludGVsX3JhcGwuYwppbmRleCA5N2I1ZTRlLi5lMDM4NzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyY2FwL2ludGVsX3JhcGwuYworKysgYi9kcml2ZXJzL3Bvd2VyY2FwL2ludGVsX3JhcGwuYwpAQCAtNzMsNyArNzMsNyBAQAogCiAjZGVmaW5lIFRJTUVfV0lORE9XX01BWF9NU0VDIDQwMDAwCiAjZGVmaW5lIFRJTUVfV0lORE9XX01JTl9NU0VDIDI1MAotCisjZGVmaW5lIEVORVJHWV9VTklUX1NDQUxFICAgIDEwMDAgLyogc2NhbGUgZnJvbSBkcml2ZXIgdW5pdCB0byBwb3dlcmNhcCB1bml0ICovCiBlbnVtIHVuaXRfdHlwZSB7CiAJQVJCSVRSQVJZX1VOSVQsIC8qIG5vIHRyYW5zbGF0aW9uICovCiAJUE9XRVJfVU5JVCwKQEAgLTE1OCw2ICsxNTgsNyBAQAogCXN0cnVjdCByYXBsX3Bvd2VyX2xpbWl0IHJwbFtOUl9QT1dFUl9MSU1JVFNdOwogCXU2NCBhdHRyX21hcDsgLyogdHJhY2sgY2FwYWJpbGl0aWVzICovCiAJdW5zaWduZWQgaW50IHN0YXRlOworCXVuc2lnbmVkIGludCBkb21haW5fZW5lcmd5X3VuaXQ7CiAJaW50IHBhY2thZ2VfaWQ7CiB9OwogI2RlZmluZSBwb3dlcl96b25lX3RvX3JhcGxfZG9tYWluKF96b25lKSBcCkBAIC0xOTAsNiArMTkxLDcgQEAKIAl2b2lkICgqc2V0X2Zsb29yX2ZyZXEpKHN0cnVjdCByYXBsX2RvbWFpbiAqcmQsIGJvb2wgbW9kZSk7CiAJdTY0ICgqY29tcHV0ZV90aW1lX3dpbmRvdykoc3RydWN0IHJhcGxfcGFja2FnZSAqcnAsIHU2NCB2YWwsCiAJCQkJYm9vbCB0b19yYXcpOworCXVuc2lnbmVkIGludCBkcmFtX2RvbWFpbl9lbmVyZ3lfdW5pdDsKIH07CiBzdGF0aWMgc3RydWN0IHJhcGxfZGVmYXVsdHMgKnJhcGxfZGVmYXVsdHM7CiAKQEAgLTIyNyw3ICsyMjksOCBAQAogc3RhdGljIGludCByYXBsX3dyaXRlX2RhdGFfcmF3KHN0cnVjdCByYXBsX2RvbWFpbiAqcmQsCiAJCQllbnVtIHJhcGxfcHJpbWl0aXZlcyBwcmltLAogCQkJdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKTsKLXN0YXRpYyB1NjQgcmFwbF91bml0X3hsYXRlKGludCBwYWNrYWdlLCBlbnVtIHVuaXRfdHlwZSB0eXBlLCB1NjQgdmFsdWUsCitzdGF0aWMgdTY0IHJhcGxfdW5pdF94bGF0ZShzdHJ1Y3QgcmFwbF9kb21haW4gKnJkLCBpbnQgcGFja2FnZSwKKwkJCWVudW0gdW5pdF90eXBlIHR5cGUsIHU2NCB2YWx1ZSwKIAkJCWludCB0b19yYXcpOwogc3RhdGljIHZvaWQgcGFja2FnZV9wb3dlcl9saW1pdF9pcnFfc2F2ZShpbnQgcGFja2FnZV9pZCk7CiAKQEAgLTMwNSw3ICszMDgsOSBAQAogCiBzdGF0aWMgaW50IGdldF9tYXhfZW5lcmd5X2NvdW50ZXIoc3RydWN0IHBvd2VyY2FwX3pvbmUgKnBjZF9kZXYsIHU2NCAqZW5lcmd5KQogewotCSplbmVyZ3kgPSByYXBsX3VuaXRfeGxhdGUoMCwgRU5FUkdZX1VOSVQsIEVORVJHWV9TVEFUVVNfTUFTSywgMCk7CisJc3RydWN0IHJhcGxfZG9tYWluICpyZCA9IHBvd2VyX3pvbmVfdG9fcmFwbF9kb21haW4ocGNkX2Rldik7CisKKwkqZW5lcmd5ID0gcmFwbF91bml0X3hsYXRlKHJkLCAwLCBFTkVSR1lfVU5JVCwgRU5FUkdZX1NUQVRVU19NQVNLLCAwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjM5LDYgKzY0NCwxMSBAQAogCQkJcmQtPm1zcnNbNF0gPSBNU1JfRFJBTV9QT1dFUl9JTkZPOwogCQkJcmQtPnJwbFswXS5wcmltX2lkID0gUEwxX0VOQUJMRTsKIAkJCXJkLT5ycGxbMF0ubmFtZSA9IHBsMV9uYW1lOworCQkJcmQtPmRvbWFpbl9lbmVyZ3lfdW5pdCA9CisJCQkJcmFwbF9kZWZhdWx0cy0+ZHJhbV9kb21haW5fZW5lcmd5X3VuaXQ7CisJCQlpZiAocmQtPmRvbWFpbl9lbmVyZ3lfdW5pdCkKKwkJCQlwcl9pbmZvKCJEUkFNIGRvbWFpbiBlbmVyZ3kgdW5pdCAlZHBqXG4iLAorCQkJCQlyZC0+ZG9tYWluX2VuZXJneV91bml0KTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChtYXNrKSB7CkBAIC02NDgsMTEgKzY1OCwxMyBAQAogCX0KIH0KIAotc3RhdGljIHU2NCByYXBsX3VuaXRfeGxhdGUoaW50IHBhY2thZ2UsIGVudW0gdW5pdF90eXBlIHR5cGUsIHU2NCB2YWx1ZSwKK3N0YXRpYyB1NjQgcmFwbF91bml0X3hsYXRlKHN0cnVjdCByYXBsX2RvbWFpbiAqcmQsIGludCBwYWNrYWdlLAorCQkJZW51bSB1bml0X3R5cGUgdHlwZSwgdTY0IHZhbHVlLAogCQkJaW50IHRvX3JhdykKIHsKIAl1NjQgdW5pdHMgPSAxOwogCXN0cnVjdCByYXBsX3BhY2thZ2UgKnJwOworCXU2NCBzY2FsZSA9IDE7CiAKIAlycCA9IGZpbmRfcGFja2FnZV9ieV9pZChwYWNrYWdlKTsKIAlpZiAoIXJwKQpAQCAtNjYzLDcgKzY3NSwxMiBAQAogCQl1bml0cyA9IHJwLT5wb3dlcl91bml0OwogCQlicmVhazsKIAljYXNlIEVORVJHWV9VTklUOgotCQl1bml0cyA9IHJwLT5lbmVyZ3lfdW5pdDsKKwkJc2NhbGUgPSBFTkVSR1lfVU5JVF9TQ0FMRTsKKwkJLyogcGVyIGRvbWFpbiB1bml0IHRha2VzIHByZWNlZGVuY2UgKi8KKwkJaWYgKHJkICYmIHJkLT5kb21haW5fZW5lcmd5X3VuaXQpCisJCQl1bml0cyA9IHJkLT5kb21haW5fZW5lcmd5X3VuaXQ7CisJCWVsc2UKKwkJCXVuaXRzID0gcnAtPmVuZXJneV91bml0OwogCQlicmVhazsKIAljYXNlIFRJTUVfVU5JVDoKIAkJcmV0dXJuIHJhcGxfZGVmYXVsdHMtPmNvbXB1dGVfdGltZV93aW5kb3cocnAsIHZhbHVlLCB0b19yYXcpOwpAQCAtNjczLDExICs2OTAsMTEgQEAKIAl9OwogCiAJaWYgKHRvX3JhdykKLQkJcmV0dXJuIGRpdjY0X3U2NCh2YWx1ZSwgdW5pdHMpOworCQlyZXR1cm4gZGl2NjRfdTY0KHZhbHVlLCB1bml0cykgKiBzY2FsZTsKIAogCXZhbHVlICo9IHVuaXRzOwogCi0JcmV0dXJuIHZhbHVlOworCXJldHVybiBkaXY2NF91NjQodmFsdWUsIHNjYWxlKTsKIH0KIAogLyogaW4gdGhlIG9yZGVyIG9mIGVudW0gcmFwbF9wcmltaXRpdmVzICovCkBAIC03NzMsNyArNzkwLDcgQEAKIAlmaW5hbCA9IHZhbHVlICYgcnAtPm1hc2s7CiAJZmluYWwgPSBmaW5hbCA+PiBycC0+c2hpZnQ7CiAJaWYgKHhsYXRlKQotCQkqZGF0YSA9IHJhcGxfdW5pdF94bGF0ZShyZC0+cGFja2FnZV9pZCwgcnAtPnVuaXQsIGZpbmFsLCAwKTsKKwkJKmRhdGEgPSByYXBsX3VuaXRfeGxhdGUocmQsIHJkLT5wYWNrYWdlX2lkLCBycC0+dW5pdCwgZmluYWwsIDApOwogCWVsc2UKIAkJKmRhdGEgPSBmaW5hbDsKIApAQCAtNzk5LDcgKzgxNiw3IEBACiAJCQkiZmFpbGVkIHRvIHJlYWQgbXNyIDB4JXggb24gY3B1ICVkXG4iLCBtc3IsIGNwdSk7CiAJCXJldHVybiAtRUlPOwogCX0KLQl2YWx1ZSA9IHJhcGxfdW5pdF94bGF0ZShyZC0+cGFja2FnZV9pZCwgcnAtPnVuaXQsIHZhbHVlLCAxKTsKKwl2YWx1ZSA9IHJhcGxfdW5pdF94bGF0ZShyZCwgcmQtPnBhY2thZ2VfaWQsIHJwLT51bml0LCB2YWx1ZSwgMSk7CiAJbXNyX3ZhbCAmPSB+cnAtPm1hc2s7CiAJbXNyX3ZhbCB8PSB2YWx1ZSA8PCBycC0+c2hpZnQ7CiAJaWYgKHdybXNybF9zYWZlX29uX2NwdShjcHUsIG1zciwgbXNyX3ZhbCkpIHsKQEAgLTgxOCw3ICs4MzUsNyBAQAogICogY2FsY3VsYXRlIHVuaXRzIGRpZmZlciBvbiBkaWZmZXJlbnQgQ1BVcy4KICAqIFdlIGNvbnZlcnQgdGhlIHVuaXRzIHRvIGJlbG93IGZvcm1hdCBiYXNlZCBvbiBDUFVzLgogICogaS5lLgotICogZW5lcmd5IHVuaXQ6IG1pY3JvSm91bGVzIDogUmVwcmVzZW50ZWQgaW4gbWljcm9Kb3VsZXMgYnkgZGVmYXVsdAorICogZW5lcmd5IHVuaXQ6IHBpY29Kb3VsZXMgIDogUmVwcmVzZW50ZWQgaW4gcGljb0pvdWxlcyBieSBkZWZhdWx0CiAgKiBwb3dlciB1bml0IDogbWljcm9XYXR0cyAgOiBSZXByZXNlbnRlZCBpbiBtaWxsaVdhdHRzIGJ5IGRlZmF1bHQKICAqIHRpbWUgdW5pdCAgOiBtaWNyb3NlY29uZHM6IFJlcHJlc2VudGVkIGluIHNlY29uZHMgYnkgZGVmYXVsdAogICovCkBAIC04MzQsNyArODUxLDcgQEAKIAl9CiAKIAl2YWx1ZSA9IChtc3JfdmFsICYgRU5FUkdZX1VOSVRfTUFTSykgPj4gRU5FUkdZX1VOSVRfT0ZGU0VUOwotCXJwLT5lbmVyZ3lfdW5pdCA9IDEwMDAwMDAgLyAoMSA8PCB2YWx1ZSk7CisJcnAtPmVuZXJneV91bml0ID0gRU5FUkdZX1VOSVRfU0NBTEUgKiAxMDAwMDAwIC8gKDEgPDwgdmFsdWUpOwogCiAJdmFsdWUgPSAobXNyX3ZhbCAmIFBPV0VSX1VOSVRfTUFTSykgPj4gUE9XRVJfVU5JVF9PRkZTRVQ7CiAJcnAtPnBvd2VyX3VuaXQgPSAxMDAwMDAwIC8gKDEgPDwgdmFsdWUpOwpAQCAtODQyLDcgKzg1OSw3IEBACiAJdmFsdWUgPSAobXNyX3ZhbCAmIFRJTUVfVU5JVF9NQVNLKSA+PiBUSU1FX1VOSVRfT0ZGU0VUOwogCXJwLT50aW1lX3VuaXQgPSAxMDAwMDAwIC8gKDEgPDwgdmFsdWUpOwogCi0JcHJfZGVidWcoIkNvcmUgQ1BVIHBhY2thZ2UgJWQgZW5lcmd5PSVkdUosIHRpbWU9JWR1cywgcG93ZXI9JWR1V1xuIiwKKwlwcl9kZWJ1ZygiQ29yZSBDUFUgcGFja2FnZSAlZCBlbmVyZ3k9JWRwSiwgdGltZT0lZHVzLCBwb3dlcj0lZHVXXG4iLAogCQlycC0+aWQsIHJwLT5lbmVyZ3lfdW5pdCwgcnAtPnRpbWVfdW5pdCwgcnAtPnBvd2VyX3VuaXQpOwogCiAJcmV0dXJuIDA7CkBAIC04NTksNyArODc2LDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCXZhbHVlID0gKG1zcl92YWwgJiBFTkVSR1lfVU5JVF9NQVNLKSA+PiBFTkVSR1lfVU5JVF9PRkZTRVQ7Ci0JcnAtPmVuZXJneV91bml0ID0gMSA8PCB2YWx1ZTsKKwlycC0+ZW5lcmd5X3VuaXQgPSBFTkVSR1lfVU5JVF9TQ0FMRSAqIDEgPDwgdmFsdWU7CiAKIAl2YWx1ZSA9IChtc3JfdmFsICYgUE9XRVJfVU5JVF9NQVNLKSA+PiBQT1dFUl9VTklUX09GRlNFVDsKIAlycC0+cG93ZXJfdW5pdCA9ICgxIDw8IHZhbHVlKSAqIDEwMDA7CkBAIC04NjcsNyArODg0LDcgQEAKIAl2YWx1ZSA9IChtc3JfdmFsICYgVElNRV9VTklUX01BU0spID4+IFRJTUVfVU5JVF9PRkZTRVQ7CiAJcnAtPnRpbWVfdW5pdCA9IDEwMDAwMDAgLyAoMSA8PCB2YWx1ZSk7CiAKLQlwcl9kZWJ1ZygiQXRvbSBwYWNrYWdlICVkIGVuZXJneT0lZHVKLCB0aW1lPSVkdXMsIHBvd2VyPSVkdVdcbiIsCisJcHJfZGVidWcoIkF0b20gcGFja2FnZSAlZCBlbmVyZ3k9JWRwSiwgdGltZT0lZHVzLCBwb3dlcj0lZHVXXG4iLAogCQlycC0+aWQsIHJwLT5lbmVyZ3lfdW5pdCwgcnAtPnRpbWVfdW5pdCwgcnAtPnBvd2VyX3VuaXQpOwogCiAJcmV0dXJuIDA7CkBAIC0xMDE3LDYgKzEwMzQsMTMgQEAKIAkuY29tcHV0ZV90aW1lX3dpbmRvdyA9IHJhcGxfY29tcHV0ZV90aW1lX3dpbmRvd19jb3JlLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCByYXBsX2RlZmF1bHRzIHJhcGxfZGVmYXVsdHNfaHN3X3NlcnZlciA9IHsKKwkuY2hlY2tfdW5pdCA9IHJhcGxfY2hlY2tfdW5pdF9jb3JlLAorCS5zZXRfZmxvb3JfZnJlcSA9IHNldF9mbG9vcl9mcmVxX2RlZmF1bHQsCisJLmNvbXB1dGVfdGltZV93aW5kb3cgPSByYXBsX2NvbXB1dGVfdGltZV93aW5kb3dfY29yZSwKKwkuZHJhbV9kb21haW5fZW5lcmd5X3VuaXQgPSAxNTMwMCwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmFwbF9kZWZhdWx0cyByYXBsX2RlZmF1bHRzX2F0b20gPSB7CiAJLmNoZWNrX3VuaXQgPSByYXBsX2NoZWNrX3VuaXRfYXRvbSwKIAkuc2V0X2Zsb29yX2ZyZXEgPSBzZXRfZmxvb3JfZnJlcV9hdG9tLApAQCAtMTAzMCwxNCArMTA1NCwxNSBAQAogCQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpJl9vcHMsCVwKIAkJfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHg4Nl9jcHVfaWQgcmFwbF9pZHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeDg2X2NwdV9pZCByYXBsX2lkc1tdIF9faW5pdGNvbnN0ID0gewogCVJBUExfQ1BVKDB4MmEsIHJhcGxfZGVmYXVsdHNfY29yZSksLyogU2FuZHkgQnJpZGdlICovCiAJUkFQTF9DUFUoMHgyZCwgcmFwbF9kZWZhdWx0c19jb3JlKSwvKiBTYW5keSBCcmlkZ2UgRVAgKi8KIAlSQVBMX0NQVSgweDM3LCByYXBsX2RlZmF1bHRzX2F0b20pLC8qIFZhbGxleXZpZXcgKi8KIAlSQVBMX0NQVSgweDNhLCByYXBsX2RlZmF1bHRzX2NvcmUpLC8qIEl2eSBCcmlkZ2UgKi8KIAlSQVBMX0NQVSgweDNjLCByYXBsX2RlZmF1bHRzX2NvcmUpLC8qIEhhc3dlbGwgKi8KIAlSQVBMX0NQVSgweDNkLCByYXBsX2RlZmF1bHRzX2NvcmUpLC8qIEJyb2Fkd2VsbCAqLwotCVJBUExfQ1BVKDB4M2YsIHJhcGxfZGVmYXVsdHNfY29yZSksLyogSGFzd2VsbCAqLworCVJBUExfQ1BVKDB4M2YsIHJhcGxfZGVmYXVsdHNfaHN3X3NlcnZlciksLyogSGFzd2VsbCBzZXJ2ZXJzICovCisJUkFQTF9DUFUoMHg0ZiwgcmFwbF9kZWZhdWx0c19oc3dfc2VydmVyKSwvKiBCcm9hZHdlbGwgc2VydmVycyAqLwogCVJBUExfQ1BVKDB4NDUsIHJhcGxfZGVmYXVsdHNfY29yZSksLyogSGFzd2VsbCBVTFQgKi8KIAlSQVBMX0NQVSgweDRDLCByYXBsX2RlZmF1bHRzX2F0b20pLC8qIEJyYXN3ZWxsICovCiAJUkFQTF9DUFUoMHg0QSwgcmFwbF9kZWZhdWx0c19hdG9tKSwvKiBUYW5naWVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3B0cC9wdHBfY2hhcmRldi5jIGIvZHJpdmVycy9wdHAvcHRwX2NoYXJkZXYuYwppbmRleCBmOGE3NjA5Li5kYTdiYWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3B0cC9wdHBfY2hhcmRldi5jCisrKyBiL2RyaXZlcnMvcHRwL3B0cF9jaGFyZGV2LmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCXN0cnVjdCBwdHBfY2xvY2sgKnB0cCA9IGNvbnRhaW5lcl9vZihwYywgc3RydWN0IHB0cF9jbG9jaywgY2xvY2spOwogCXN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqb3BzID0gcHRwLT5pbmZvOwogCXN0cnVjdCBwdHBfY2xvY2tfdGltZSAqcGN0OwotCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlzdHJ1Y3QgdGltZXNwZWM2NCB0czsKIAlpbnQgZW5hYmxlLCBlcnIgPSAwOwogCXVuc2lnbmVkIGludCBpLCBwaW5faW5kZXg7CiAKQEAgLTE5NywxNiArMTk3LDE2IEBACiAJCX0KIAkJcGN0ID0gJnN5c29mZi0+dHNbMF07CiAJCWZvciAoaSA9IDA7IGkgPCBzeXNvZmYtPm5fc2FtcGxlczsgaSsrKSB7Ci0JCQlnZXRuc3RpbWVvZmRheSgmdHMpOworCQkJZ2V0bnN0aW1lb2ZkYXk2NCgmdHMpOwogCQkJcGN0LT5zZWMgPSB0cy50dl9zZWM7CiAJCQlwY3QtPm5zZWMgPSB0cy50dl9uc2VjOwogCQkJcGN0Kys7Ci0JCQlwdHAtPmluZm8tPmdldHRpbWUocHRwLT5pbmZvLCAmdHMpOworCQkJcHRwLT5pbmZvLT5nZXR0aW1lNjQocHRwLT5pbmZvLCAmdHMpOwogCQkJcGN0LT5zZWMgPSB0cy50dl9zZWM7CiAJCQlwY3QtPm5zZWMgPSB0cy50dl9uc2VjOwogCQkJcGN0Kys7CiAJCX0KLQkJZ2V0bnN0aW1lb2ZkYXkoJnRzKTsKKwkJZ2V0bnN0aW1lb2ZkYXk2NCgmdHMpOwogCQlwY3QtPnNlYyA9IHRzLnR2X3NlYzsKIAkJcGN0LT5uc2VjID0gdHMudHZfbnNlYzsKIAkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsIHN5c29mZiwgc2l6ZW9mKCpzeXNvZmYpKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcHRwL3B0cF9jbG9jay5jIGIvZHJpdmVycy9wdHAvcHRwX2Nsb2NrLmMKaW5kZXggMjk2YjBlYy4uMmU0ODFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wdHAvcHRwX2Nsb2NrLmMKKysrIGIvZHJpdmVycy9wdHAvcHRwX2Nsb2NrLmMKQEAgLTEwNywxMyArMTA3LDIxIEBACiBzdGF0aWMgaW50IHB0cF9jbG9ja19zZXR0aW1lKHN0cnVjdCBwb3NpeF9jbG9jayAqcGMsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHApCiB7CiAJc3RydWN0IHB0cF9jbG9jayAqcHRwID0gY29udGFpbmVyX29mKHBjLCBzdHJ1Y3QgcHRwX2Nsb2NrLCBjbG9jayk7Ci0JcmV0dXJuIHB0cC0+aW5mby0+c2V0dGltZShwdHAtPmluZm8sIHRwKTsKKwlzdHJ1Y3QgdGltZXNwZWM2NCB0cyA9IHRpbWVzcGVjX3RvX3RpbWVzcGVjNjQoKnRwKTsKKworCXJldHVybiAgcHRwLT5pbmZvLT5zZXR0aW1lNjQocHRwLT5pbmZvLCAmdHMpOwogfQogCiBzdGF0aWMgaW50IHB0cF9jbG9ja19nZXR0aW1lKHN0cnVjdCBwb3NpeF9jbG9jayAqcGMsIHN0cnVjdCB0aW1lc3BlYyAqdHApCiB7CiAJc3RydWN0IHB0cF9jbG9jayAqcHRwID0gY29udGFpbmVyX29mKHBjLCBzdHJ1Y3QgcHRwX2Nsb2NrLCBjbG9jayk7Ci0JcmV0dXJuIHB0cC0+aW5mby0+Z2V0dGltZShwdHAtPmluZm8sIHRwKTsKKwlzdHJ1Y3QgdGltZXNwZWM2NCB0czsKKwlpbnQgZXJyOworCisJZXJyID0gcHRwLT5pbmZvLT5nZXR0aW1lNjQocHRwLT5pbmZvLCAmdHMpOworCWlmICghZXJyKQorCQkqdHAgPSB0aW1lc3BlYzY0X3RvX3RpbWVzcGVjKHRzKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHB0cF9jbG9ja19hZGp0aW1lKHN0cnVjdCBwb3NpeF9jbG9jayAqcGMsIHN0cnVjdCB0aW1leCAqdHgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3B0cC9wdHBfaXhwNDZ4LmMgYi9kcml2ZXJzL3B0cC9wdHBfaXhwNDZ4LmMKaW5kZXggNjA0ZDM0MC4uOTM0YzEzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wdHAvcHRwX2l4cDQ2eC5jCisrKyBiL2RyaXZlcnMvcHRwL3B0cF9peHA0NnguYwpAQCAtMTc1LDcgKzE3NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHRwX2l4cF9nZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorc3RhdGljIGludCBwdHBfaXhwX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAl1NjQgbnM7CiAJdTMyIHJlbWFpbmRlcjsKQEAgLTE5NSw3ICsxOTUsNyBAQAogfQogCiBzdGF0aWMgaW50IHB0cF9peHBfc2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCSAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMpCisJCQkgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJdTY0IG5zOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNDgsOCArMjQ4LDggQEAKIAkucHBzCQk9IDAsCiAJLmFkamZyZXEJPSBwdHBfaXhwX2FkamZyZXEsCiAJLmFkanRpbWUJPSBwdHBfaXhwX2FkanRpbWUsCi0JLmdldHRpbWUJPSBwdHBfaXhwX2dldHRpbWUsCi0JLnNldHRpbWUJPSBwdHBfaXhwX3NldHRpbWUsCisJLmdldHRpbWU2NAk9IHB0cF9peHBfZ2V0dGltZSwKKwkuc2V0dGltZTY0CT0gcHRwX2l4cF9zZXR0aW1lLAogCS5lbmFibGUJCT0gcHRwX2l4cF9lbmFibGUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3B0cC9wdHBfcGNoLmMgYi9kcml2ZXJzL3B0cC9wdHBfcGNoLmMKaW5kZXggMjU1NDg3Mi4uM2FhMjJhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wdHAvcHRwX3BjaC5jCisrKyBiL2RyaXZlcnMvcHRwL3B0cF9wY2guYwpAQCAtNDQ5LDcgKzQ0OSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHRwX3BjaF9nZXR0aW1lKHN0cnVjdCBwdHBfY2xvY2tfaW5mbyAqcHRwLCBzdHJ1Y3QgdGltZXNwZWMgKnRzKQorc3RhdGljIGludCBwdHBfcGNoX2dldHRpbWUoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAl1NjQgbnM7CiAJdTMyIHJlbWFpbmRlcjsKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogfQogCiBzdGF0aWMgaW50IHB0cF9wY2hfc2V0dGltZShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKLQkJCSAgIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMpCisJCQkgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWM2NCAqdHMpCiB7CiAJdTY0IG5zOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC01MTgsOCArNTE4LDggQEAKIAkucHBzCQk9IDAsCiAJLmFkamZyZXEJPSBwdHBfcGNoX2FkamZyZXEsCiAJLmFkanRpbWUJPSBwdHBfcGNoX2FkanRpbWUsCi0JLmdldHRpbWUJPSBwdHBfcGNoX2dldHRpbWUsCi0JLnNldHRpbWUJPSBwdHBfcGNoX3NldHRpbWUsCisJLmdldHRpbWU2NAk9IHB0cF9wY2hfZ2V0dGltZSwKKwkuc2V0dGltZTY0CT0gcHRwX3BjaF9zZXR0aW1lLAogCS5lbmFibGUJCT0gcHRwX3BjaF9lbmFibGUsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9hY3Q4ODY1LXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYWN0ODg2NS1yZWd1bGF0b3IuYwppbmRleCA5ZWVjNDUzLi4yZmY3M2Q3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9hY3Q4ODY1LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FjdDg4NjUtcmVndWxhdG9yLmMKQEAgLTI5LDYgKzI5LDM1IEBACiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAKIC8qCisgKiBBQ1Q4NjAwIEdsb2JhbCBSZWdpc3RlciBNYXAuCisgKi8KKyNkZWZpbmUgQUNUODYwMF9TWVNfTU9ERQkweDAwCisjZGVmaW5lIEFDVDg2MDBfU1lTX0NUUkwJMHgwMQorI2RlZmluZSBBQ1Q4NjAwX0RDREMxX1ZTRVQJMHgxMAorI2RlZmluZSBBQ1Q4NjAwX0RDREMxX0NUUkwJMHgxMgorI2RlZmluZSBBQ1Q4NjAwX0RDREMyX1ZTRVQJMHgyMAorI2RlZmluZSBBQ1Q4NjAwX0RDREMyX0NUUkwJMHgyMgorI2RlZmluZSBBQ1Q4NjAwX0RDREMzX1ZTRVQJMHgzMAorI2RlZmluZSBBQ1Q4NjAwX0RDREMzX0NUUkwJMHgzMgorI2RlZmluZSBBQ1Q4NjAwX1NVRENEQzRfVlNFVAkweDQwCisjZGVmaW5lIEFDVDg2MDBfU1VEQ0RDNF9DVFJMCTB4NDEKKyNkZWZpbmUgQUNUODYwMF9MRE81X1ZTRVQJMHg1MAorI2RlZmluZSBBQ1Q4NjAwX0xETzVfQ1RSTAkweDUxCisjZGVmaW5lIEFDVDg2MDBfTERPNl9WU0VUCTB4NjAKKyNkZWZpbmUgQUNUODYwMF9MRE82X0NUUkwJMHg2MQorI2RlZmluZSBBQ1Q4NjAwX0xETzdfVlNFVAkweDcwCisjZGVmaW5lIEFDVDg2MDBfTERPN19DVFJMCTB4NzEKKyNkZWZpbmUgQUNUODYwMF9MRE84X1ZTRVQJMHg4MAorI2RlZmluZSBBQ1Q4NjAwX0xETzhfQ1RSTAkweDgxCisjZGVmaW5lIEFDVDg2MDBfTERPOTEwX0NUUkwJMHg5MQorI2RlZmluZSBBQ1Q4NjAwX0FQQ0gwCQkweEExCisjZGVmaW5lIEFDVDg2MDBfQVBDSDEJCTB4QTgKKyNkZWZpbmUgQUNUODYwMF9BUENIMgkJMHhBOQorI2RlZmluZSBBQ1Q4NjAwX0FQQ0hfU1RBVAkweEFBCisjZGVmaW5lIEFDVDg2MDBfT1RHMAkJMHhCMAorI2RlZmluZSBBQ1Q4NjAwX09URzEJCTB4QjIKKworLyoKICAqIEFDVDg4NDYgR2xvYmFsIFJlZ2lzdGVyIE1hcC4KICAqLwogI2RlZmluZQlBQ1Q4ODQ2X1NZUzAJCTB4MDAKQEAgLTk0LDEwICsxMjMsMTUgQEAKICNkZWZpbmUJQUNUODg2NV9FTkEJCTB4ODAJLyogT04gLSBbN10gKi8KICNkZWZpbmUJQUNUODg2NV9WU0VMX01BU0sJMHgzRgkvKiBWU0VUIC0gWzU6MF0gKi8KIAorCisjZGVmaW5lIEFDVDg2MDBfTERPMTBfRU5BCQkweDQwCS8qIE9OIC0gWzZdICovCisjZGVmaW5lIEFDVDg2MDBfU1VEQ0RDX1ZTRUxfTUFTSwkweEZGCS8qIFNVRENEQyBWU0VUIC0gWzc6MF0gKi8KKwogLyoKICAqIEFDVDg4NjUgdm9sdGFnZSBudW1iZXIKICAqLwogI2RlZmluZQlBQ1Q4ODY1X1ZPTFRBR0VfTlVNCTY0CisjZGVmaW5lIEFDVDg2MDBfU1VEQ0RDX1ZPTFRBR0VfTlVNCTI1NQogCiBzdHJ1Y3QgYWN0ODg2NSB7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwpAQCAtMTE2LDYgKzE1MCwxMyBAQAogCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMjQwMDAwMCwgNDgsIDYzLCAxMDAwMDApLAogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfbGluZWFyX3JhbmdlIGFjdDg2MDBfc3VkY2RjX3ZvbHRhZ2VfcmFuZ2VzW10gPSB7CisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgzMDAwMDAwLCAwLCA2MywgMCksCisJUkVHVUxBVE9SX0xJTkVBUl9SQU5HRSgzMDAwMDAwLCA2NCwgMTU5LCAxMDAwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTI2MDAwMDAsIDE2MCwgMTkxLCAyMDAwMDApLAorCVJFR1VMQVRPUl9MSU5FQVJfUkFOR0UoMTkwMDAwMDAsIDE5MSwgMjU1LCA0MDAwMDApLAorfTsKKwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGFjdDg4NjVfb3BzID0gewogCS5saXN0X3ZvbHRhZ2UJCT0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXJfcmFuZ2UsCiAJLm1hcF92b2x0YWdlCQk9IHJlZ3VsYXRvcl9tYXBfdm9sdGFnZV9saW5lYXJfcmFuZ2UsCkBAIC0xMjYsOSArMTY3LDE2IEBACiAJLmlzX2VuYWJsZWQJCT0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAogfTsKIAotI2RlZmluZSBBQ1Q4OHh4X1JFRyhfbmFtZSwgX2ZhbWlseSwgX2lkLCBfdnNlbF9yZWcpCQkJXAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIGFjdDg4NjVfbGRvX29wcyA9IHsKKwkuZW5hYmxlCQkJPSByZWd1bGF0b3JfZW5hYmxlX3JlZ21hcCwKKwkuZGlzYWJsZQkJPSByZWd1bGF0b3JfZGlzYWJsZV9yZWdtYXAsCisJLmlzX2VuYWJsZWQJCT0gcmVndWxhdG9yX2lzX2VuYWJsZWRfcmVnbWFwLAorfTsKKworI2RlZmluZSBBQ1Q4OHh4X1JFRyhfbmFtZSwgX2ZhbWlseSwgX2lkLCBfdnNlbF9yZWcsIF9zdXBwbHkpCQlcCiAJW19mYW1pbHkjI19JRF8jI19pZF0gPSB7CQkJCQlcCiAJCS5uYW1lCQkJPSBfbmFtZSwJCQlcCisJCS5zdXBwbHlfbmFtZQkJPSBfc3VwcGx5LAkJCVwKIAkJLmlkCQkJPSBfZmFtaWx5IyNfSURfIyNfaWQsCQlcCiAJCS50eXBlCQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCVwKIAkJLm9wcwkJCT0gJmFjdDg4NjVfb3BzLAkJCVwKQEAgLTE0MiwzMyArMTkwLDgwIEBACiAJCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCQkJXAogCX0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCByZWd1bGF0b3JfZGVzYyBhY3Q4NjAwX3JlZ3VsYXRvcnNbXSA9IHsKKwlBQ1Q4OHh4X1JFRygiRENEQzEiLCBBQ1Q4NjAwLCBEQ0RDMSwgVlNFVCwgInZwMSIpLAorCUFDVDg4eHhfUkVHKCJEQ0RDMiIsIEFDVDg2MDAsIERDREMyLCBWU0VULCAidnAyIiksCisJQUNUODh4eF9SRUcoIkRDREMzIiwgQUNUODYwMCwgRENEQzMsIFZTRVQsICJ2cDMiKSwKKwl7CisJCS5uYW1lID0gIlNVRENEQ19SRUc0IiwKKwkJLmlkID0gQUNUODYwMF9JRF9TVURDREM0LAorCQkub3BzID0gJmFjdDg4NjVfb3BzLAorCQkudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFLAorCQkubl92b2x0YWdlcyA9IEFDVDg2MDBfU1VEQ0RDX1ZPTFRBR0VfTlVNLAorCQkubGluZWFyX3JhbmdlcyA9IGFjdDg2MDBfc3VkY2RjX3ZvbHRhZ2VfcmFuZ2VzLAorCQkubl9saW5lYXJfcmFuZ2VzID0gQVJSQVlfU0laRShhY3Q4NjAwX3N1ZGNkY192b2x0YWdlX3JhbmdlcyksCisJCS52c2VsX3JlZyA9IEFDVDg2MDBfU1VEQ0RDNF9WU0VULAorCQkudnNlbF9tYXNrID0gQUNUODYwMF9TVURDRENfVlNFTF9NQVNLLAorCQkuZW5hYmxlX3JlZyA9IEFDVDg2MDBfU1VEQ0RDNF9DVFJMLAorCQkuZW5hYmxlX21hc2sgPSBBQ1Q4ODY1X0VOQSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwlBQ1Q4OHh4X1JFRygiTERPNSIsIEFDVDg2MDAsIExETzUsIFZTRVQsICJpbmwiKSwKKwlBQ1Q4OHh4X1JFRygiTERPNiIsIEFDVDg2MDAsIExETzYsIFZTRVQsICJpbmwiKSwKKwlBQ1Q4OHh4X1JFRygiTERPNyIsIEFDVDg2MDAsIExETzcsIFZTRVQsICJpbmwiKSwKKwlBQ1Q4OHh4X1JFRygiTERPOCIsIEFDVDg2MDAsIExETzgsIFZTRVQsICJpbmwiKSwKKwl7CisJCS5uYW1lID0gIkxET19SRUc5IiwKKwkJLmlkID0gQUNUODYwMF9JRF9MRE85LAorCQkub3BzID0gJmFjdDg4NjVfbGRvX29wcywKKwkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwKKwkJLm5fdm9sdGFnZXMgPSAxLAorCQkuZml4ZWRfdVYgPSAxODAwMDAwLAorCQkuZW5hYmxlX3JlZyA9IEFDVDg2MDBfTERPOTEwX0NUUkwsCisJCS5lbmFibGVfbWFzayA9IEFDVDg4NjVfRU5BLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPX1JFRzEwIiwKKwkJLmlkID0gQUNUODYwMF9JRF9MRE8xMCwKKwkJLm9wcyA9ICZhY3Q4ODY1X2xkb19vcHMsCisJCS50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0UsCisJCS5uX3ZvbHRhZ2VzID0gMSwKKwkJLmZpeGVkX3VWID0gMTIwMDAwMCwKKwkJLmVuYWJsZV9yZWcgPSBBQ1Q4NjAwX0xETzkxMF9DVFJMLAorCQkuZW5hYmxlX21hc2sgPSBBQ1Q4NjAwX0xETzEwX0VOQSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgYWN0ODg0Nl9yZWd1bGF0b3JzW10gPSB7Ci0JQUNUODh4eF9SRUcoIlJFRzEiLCBBQ1Q4ODQ2LCBSRUcxLCBWU0VUKSwKLQlBQ1Q4OHh4X1JFRygiUkVHMiIsIEFDVDg4NDYsIFJFRzIsIFZTRVQwKSwKLQlBQ1Q4OHh4X1JFRygiUkVHMyIsIEFDVDg4NDYsIFJFRzMsIFZTRVQwKSwKLQlBQ1Q4OHh4X1JFRygiUkVHNCIsIEFDVDg4NDYsIFJFRzQsIFZTRVQwKSwKLQlBQ1Q4OHh4X1JFRygiUkVHNSIsIEFDVDg4NDYsIFJFRzUsIFZTRVQpLAotCUFDVDg4eHhfUkVHKCJSRUc2IiwgQUNUODg0NiwgUkVHNiwgVlNFVCksCi0JQUNUODh4eF9SRUcoIlJFRzciLCBBQ1Q4ODQ2LCBSRUc3LCBWU0VUKSwKLQlBQ1Q4OHh4X1JFRygiUkVHOCIsIEFDVDg4NDYsIFJFRzgsIFZTRVQpLAotCUFDVDg4eHhfUkVHKCJSRUc5IiwgQUNUODg0NiwgUkVHOSwgVlNFVCksCi0JQUNUODh4eF9SRUcoIlJFRzEwIiwgQUNUODg0NiwgUkVHMTAsIFZTRVQpLAotCUFDVDg4eHhfUkVHKCJSRUcxMSIsIEFDVDg4NDYsIFJFRzExLCBWU0VUKSwKLQlBQ1Q4OHh4X1JFRygiUkVHMTIiLCBBQ1Q4ODQ2LCBSRUcxMiwgVlNFVCksCisJQUNUODh4eF9SRUcoIlJFRzEiLCBBQ1Q4ODQ2LCBSRUcxLCBWU0VULCAidnAxIiksCisJQUNUODh4eF9SRUcoIlJFRzIiLCBBQ1Q4ODQ2LCBSRUcyLCBWU0VUMCwgInZwMiIpLAorCUFDVDg4eHhfUkVHKCJSRUczIiwgQUNUODg0NiwgUkVHMywgVlNFVDAsICJ2cDMiKSwKKwlBQ1Q4OHh4X1JFRygiUkVHNCIsIEFDVDg4NDYsIFJFRzQsIFZTRVQwLCAidnA0IiksCisJQUNUODh4eF9SRUcoIlJFRzUiLCBBQ1Q4ODQ2LCBSRUc1LCBWU0VULCAiaW5sMSIpLAorCUFDVDg4eHhfUkVHKCJSRUc2IiwgQUNUODg0NiwgUkVHNiwgVlNFVCwgImlubDEiKSwKKwlBQ1Q4OHh4X1JFRygiUkVHNyIsIEFDVDg4NDYsIFJFRzcsIFZTRVQsICJpbmwxIiksCisJQUNUODh4eF9SRUcoIlJFRzgiLCBBQ1Q4ODQ2LCBSRUc4LCBWU0VULCAiaW5sMiIpLAorCUFDVDg4eHhfUkVHKCJSRUc5IiwgQUNUODg0NiwgUkVHOSwgVlNFVCwgImlubDIiKSwKKwlBQ1Q4OHh4X1JFRygiUkVHMTAiLCBBQ1Q4ODQ2LCBSRUcxMCwgVlNFVCwgImlubDMiKSwKKwlBQ1Q4OHh4X1JFRygiUkVHMTEiLCBBQ1Q4ODQ2LCBSRUcxMSwgVlNFVCwgImlubDMiKSwKKwlBQ1Q4OHh4X1JFRygiUkVHMTIiLCBBQ1Q4ODQ2LCBSRUcxMiwgVlNFVCwgImlubDMiKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgYWN0ODg2NV9yZWd1bGF0b3JzW10gPSB7Ci0JQUNUODh4eF9SRUcoIkRDRENfUkVHMSIsIEFDVDg4NjUsIERDREMxLCBWU0VUMSksCi0JQUNUODh4eF9SRUcoIkRDRENfUkVHMiIsIEFDVDg4NjUsIERDREMyLCBWU0VUMSksCi0JQUNUODh4eF9SRUcoIkRDRENfUkVHMyIsIEFDVDg4NjUsIERDREMzLCBWU0VUMSksCi0JQUNUODh4eF9SRUcoIkxET19SRUcxIiwgQUNUODg2NSwgTERPMSwgVlNFVCksCi0JQUNUODh4eF9SRUcoIkxET19SRUcyIiwgQUNUODg2NSwgTERPMiwgVlNFVCksCi0JQUNUODh4eF9SRUcoIkxET19SRUczIiwgQUNUODg2NSwgTERPMywgVlNFVCksCi0JQUNUODh4eF9SRUcoIkxET19SRUc0IiwgQUNUODg2NSwgTERPNCwgVlNFVCksCisJQUNUODh4eF9SRUcoIkRDRENfUkVHMSIsIEFDVDg4NjUsIERDREMxLCBWU0VUMSwgInZwMSIpLAorCUFDVDg4eHhfUkVHKCJEQ0RDX1JFRzIiLCBBQ1Q4ODY1LCBEQ0RDMiwgVlNFVDEsICJ2cDIiKSwKKwlBQ1Q4OHh4X1JFRygiRENEQ19SRUczIiwgQUNUODg2NSwgRENEQzMsIFZTRVQxLCAidnAzIiksCisJQUNUODh4eF9SRUcoIkxET19SRUcxIiwgQUNUODg2NSwgTERPMSwgVlNFVCwgImlubDQ1IiksCisJQUNUODh4eF9SRUcoIkxET19SRUcyIiwgQUNUODg2NSwgTERPMiwgVlNFVCwgImlubDQ1IiksCisJQUNUODh4eF9SRUcoIkxET19SRUczIiwgQUNUODg2NSwgTERPMywgVlNFVCwgImlubDY3IiksCisJQUNUODh4eF9SRUcoIkxET19SRUc0IiwgQUNUODg2NSwgTERPNCwgVlNFVCwgImlubDY3IiksCiB9OwogCiAjaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBhY3Q4ODY1X2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiYWN0aXZlLXNlbWksYWN0ODYwMCIsIC5kYXRhID0gKHZvaWQgKilBQ1Q4NjAwIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJhY3RpdmUtc2VtaSxhY3Q4ODQ2IiwgLmRhdGEgPSAodm9pZCAqKUFDVDg4NDYgfSwKIAl7IC5jb21wYXRpYmxlID0gImFjdGl2ZS1zZW1pLGFjdDg4NjUiLCAuZGF0YSA9ICh2b2lkICopQUNUODg2NSB9LAogCXsgfQpAQCAtMjAwLDYgKzI5NSwxOSBAQAogCVtBQ1Q4ODY1X0lEX0xETzRdCT0geyAubmFtZSA9ICJMRE9fUkVHNCJ9LAogfTsKIAorc3RhdGljIHN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggYWN0ODYwMF9tYXRjaGVzW10gPSB7CisJW0FDVDg2MDBfSURfRENEQzFdCT0geyAubmFtZSA9ICJEQ0RDX1JFRzEifSwKKwlbQUNUODYwMF9JRF9EQ0RDMl0JPSB7IC5uYW1lID0gIkRDRENfUkVHMiJ9LAorCVtBQ1Q4NjAwX0lEX0RDREMzXQk9IHsgLm5hbWUgPSAiRENEQ19SRUczIn0sCisJW0FDVDg2MDBfSURfU1VEQ0RDNF0JPSB7IC5uYW1lID0gIlNVRENEQ19SRUc0In0sCisJW0FDVDg2MDBfSURfTERPNV0JPSB7IC5uYW1lID0gIkxET19SRUc1In0sCisJW0FDVDg2MDBfSURfTERPNl0JPSB7IC5uYW1lID0gIkxET19SRUc2In0sCisJW0FDVDg2MDBfSURfTERPN10JPSB7IC5uYW1lID0gIkxET19SRUc3In0sCisJW0FDVDg2MDBfSURfTERPOF0JPSB7IC5uYW1lID0gIkxET19SRUc4In0sCisJW0FDVDg2MDBfSURfTERPOV0JPSB7IC5uYW1lID0gIkxET19SRUc5In0sCisJW0FDVDg2MDBfSURfTERPMTBdCT0geyAubmFtZSA9ICJMRE9fUkVHMTAifSwKK307CisKIHN0YXRpYyBpbnQgYWN0ODg2NV9wZGF0YV9mcm9tX2R0KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgc3RydWN0IGRldmljZV9ub2RlICoqb2Zfbm9kZSwKIAkJCQkgc3RydWN0IGFjdDg4NjVfcGxhdGZvcm1fZGF0YSAqcGRhdGEsCkBAIC0yMTcsNiArMzI1LDEwIEBACiAJfQogCiAJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBQ1Q4NjAwOgorCQltYXRjaGVzID0gYWN0ODYwMF9tYXRjaGVzOworCQludW1fbWF0Y2hlcyA9IEFSUkFZX1NJWkUoYWN0ODYwMF9tYXRjaGVzKTsKKwkJYnJlYWs7CiAJY2FzZSBBQ1Q4ODQ2OgogCQltYXRjaGVzID0gYWN0ODg0Nl9tYXRjaGVzOwogCQludW1fbWF0Y2hlcyA9IEFSUkFZX1NJWkUoYWN0ODg0Nl9tYXRjaGVzKTsKQEAgLTMxNyw2ICs0MjksMTIgQEAKIAl9CiAKIAlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFDVDg2MDA6CisJCXJlZ3VsYXRvcnMgPSBhY3Q4NjAwX3JlZ3VsYXRvcnM7CisJCW51bV9yZWd1bGF0b3JzID0gQVJSQVlfU0laRShhY3Q4NjAwX3JlZ3VsYXRvcnMpOworCQlvZmZfcmVnID0gLTE7CisJCW9mZl9tYXNrID0gLTE7CisJCWJyZWFrOwogCWNhc2UgQUNUODg0NjoKIAkJcmVndWxhdG9ycyA9IGFjdDg4NDZfcmVndWxhdG9yczsKIAkJbnVtX3JlZ3VsYXRvcnMgPSBBUlJBWV9TSVpFKGFjdDg4NDZfcmVndWxhdG9ycyk7CkBAIC0zNjYsNyArNDg0LDcgQEAKIAl9CiAKIAlpZiAob2ZfZGV2aWNlX2lzX3N5c3RlbV9wb3dlcl9jb250cm9sbGVyKGRldi0+b2Zfbm9kZSkpIHsKLQkJaWYgKCFwbV9wb3dlcl9vZmYpIHsKKwkJaWYgKCFwbV9wb3dlcl9vZmYgJiYgKG9mZl9yZWcgPiAwKSkgewogCQkJYWN0ODg2NV9pMmNfY2xpZW50ID0gY2xpZW50OwogCQkJYWN0ODg2NS0+b2ZmX3JlZyA9IG9mZl9yZWc7CiAJCQlhY3Q4ODY1LT5vZmZfbWFzayA9IG9mZl9tYXNrOwpAQCAtNDAyLDYgKzUyMCw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBhY3Q4ODY1X2lkc1tdID0geworCXsgLm5hbWUgPSAiYWN0ODYwMCIsIC5kcml2ZXJfZGF0YSA9IEFDVDg2MDAgfSwKIAl7IC5uYW1lID0gImFjdDg4NDYiLCAuZHJpdmVyX2RhdGEgPSBBQ1Q4ODQ2IH0sCiAJeyAubmFtZSA9ICJhY3Q4ODY1IiwgLmRyaXZlcl9kYXRhID0gQUNUODg2NSB9LAogCXsgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbGRvMS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvYXJpem9uYS1sZG8xLmMKaW5kZXggODE2OTE2NS4uYTFkMDdkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvYXJpem9uYS1sZG8xLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvYXJpem9uYS1sZG8xLmMKQEAgLTI4Miw2ICsyODIsOSBAQAogCQlhcml6b25hLT5leHRlcm5hbF9kY3ZkZCA9IHRydWU7CiAKIAlsZG8xLT5yZWd1bGF0b3IgPSBkZXZtX3JlZ3VsYXRvcl9yZWdpc3RlcigmcGRldi0+ZGV2LCBkZXNjLCAmY29uZmlnKTsKKworCW9mX25vZGVfcHV0KGNvbmZpZy5vZl9ub2RlKTsKKwogCWlmIChJU19FUlIobGRvMS0+cmVndWxhdG9yKSkgewogCQlyZXQgPSBQVFJfRVJSKGxkbzEtPnJlZ3VsYXRvcik7CiAJCWRldl9lcnIoYXJpem9uYS0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIExETzEgc3VwcGx5OiAlZFxuIiwKQEAgLTI4OSw4ICsyOTIsNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCW9mX25vZGVfcHV0KGNvbmZpZy5vZl9ub2RlKTsKLQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGxkbzEpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9hcml6b25hLW1pY3N1cHAuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbWljc3VwcC5jCmluZGV4IDIwMDc5MDAuLmZjYjk4ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbWljc3VwcC5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FyaXpvbmEtbWljc3VwcC5jCkBAIC0yNDYsNiArMjQ2LDcgQEAKIAkgKi8KIAlzd2l0Y2ggKGFyaXpvbmEtPnR5cGUpIHsKIAljYXNlIFdNNTExMDoKKwljYXNlIFdNODI4MDoKIAkJZGVzYyA9ICZhcml6b25hX21pY3N1cHBfZXh0OwogCQltaWNzdXBwLT5pbml0X2RhdGEgPSBhcml6b25hX21pY3N1cHBfZXh0X2RlZmF1bHQ7CiAJCWJyZWFrOwpAQCAtMjg0LDYgKzI4NSw5IEBACiAJbWljc3VwcC0+cmVndWxhdG9yID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKIAkJCQkJCSAgICAgZGVzYywKIAkJCQkJCSAgICAgJmNvbmZpZyk7CisKKwlvZl9ub2RlX3B1dChjb25maWcub2Zfbm9kZSk7CisKIAlpZiAoSVNfRVJSKG1pY3N1cHAtPnJlZ3VsYXRvcikpIHsKIAkJcmV0ID0gUFRSX0VSUihtaWNzdXBwLT5yZWd1bGF0b3IpOwogCQlkZXZfZXJyKGFyaXpvbmEtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBtaWMgc3VwcGx5OiAlZFxuIiwKQEAgLTI5MSw4ICsyOTUsNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCW9mX25vZGVfcHV0KGNvbmZpZy5vZl9ub2RlKTsKLQogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1pY3N1cHApOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKaW5kZXggMTI0NWRjYS4uNDQzZWFhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwpAQCAtNjQ4LDEwICs2NDgsMTIgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIXJkZXYtPmRlc2MtPm9wcy0+Z2V0X29wdGltdW1fbW9kZSkKKwlpZiAoIXJkZXYtPmRlc2MtPm9wcy0+Z2V0X29wdGltdW1fbW9kZSAmJgorCSAgICAhcmRldi0+ZGVzYy0+b3BzLT5zZXRfbG9hZCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIXJkZXYtPmRlc2MtPm9wcy0+c2V0X21vZGUpCisJaWYgKCFyZGV2LT5kZXNjLT5vcHMtPnNldF9tb2RlICYmCisJICAgICFyZGV2LT5kZXNjLT5vcHMtPnNldF9sb2FkKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIGdldCBvdXRwdXQgdm9sdGFnZSAqLwpAQCAtNjc2LDIyICs2NzgsMjkgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNpYmxpbmcsICZyZGV2LT5jb25zdW1lcl9saXN0LCBsaXN0KQogCQljdXJyZW50X3VBICs9IHNpYmxpbmctPnVBX2xvYWQ7CiAKLQkvKiBub3cgZ2V0IHRoZSBvcHRpbXVtIG1vZGUgZm9yIG91ciBuZXcgdG90YWwgcmVndWxhdG9yIGxvYWQgKi8KLQltb2RlID0gcmRldi0+ZGVzYy0+b3BzLT5nZXRfb3B0aW11bV9tb2RlKHJkZXYsIGlucHV0X3VWLAotCQkJCQkJICBvdXRwdXRfdVYsIGN1cnJlbnRfdUEpOworCWlmIChyZGV2LT5kZXNjLT5vcHMtPnNldF9sb2FkKSB7CisJCS8qIHNldCB0aGUgb3B0aW11bSBtb2RlIGZvciBvdXIgbmV3IHRvdGFsIHJlZ3VsYXRvciBsb2FkICovCisJCWVyciA9IHJkZXYtPmRlc2MtPm9wcy0+c2V0X2xvYWQocmRldiwgY3VycmVudF91QSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBzZXQgbG9hZCAlZFxuIiwgY3VycmVudF91QSk7CisJfSBlbHNlIHsKKwkJLyogbm93IGdldCB0aGUgb3B0aW11bSBtb2RlIGZvciBvdXIgbmV3IHRvdGFsIHJlZ3VsYXRvciBsb2FkICovCisJCW1vZGUgPSByZGV2LT5kZXNjLT5vcHMtPmdldF9vcHRpbXVtX21vZGUocmRldiwgaW5wdXRfdVYsCisJCQkJCQkJIG91dHB1dF91ViwgY3VycmVudF91QSk7CiAKLQkvKiBjaGVjayB0aGUgbmV3IG1vZGUgaXMgYWxsb3dlZCAqLwotCWVyciA9IHJlZ3VsYXRvcl9tb2RlX2NvbnN0cmFpbihyZGV2LCAmbW9kZSk7Ci0JaWYgKGVyciA8IDApIHsKLQkJcmRldl9lcnIocmRldiwgImZhaWxlZCB0byBnZXQgb3B0aW11bSBtb2RlIEAgJWQgdUEgJWQgLT4gJWQgdVZcbiIsCi0JCQkgY3VycmVudF91QSwgaW5wdXRfdVYsIG91dHB1dF91Vik7Ci0JCXJldHVybiBlcnI7CisJCS8qIGNoZWNrIHRoZSBuZXcgbW9kZSBpcyBhbGxvd2VkICovCisJCWVyciA9IHJlZ3VsYXRvcl9tb2RlX2NvbnN0cmFpbihyZGV2LCAmbW9kZSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlyZGV2X2VycihyZGV2LCAiZmFpbGVkIHRvIGdldCBvcHRpbXVtIG1vZGUgQCAlZCB1QSAlZCAtPiAlZCB1VlxuIiwKKwkJCQkgY3VycmVudF91QSwgaW5wdXRfdVYsIG91dHB1dF91Vik7CisJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJZXJyID0gcmRldi0+ZGVzYy0+b3BzLT5zZXRfbW9kZShyZGV2LCBtb2RlKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZGV2X2VycihyZGV2LCAiZmFpbGVkIHRvIHNldCBvcHRpbXVtIG1vZGUgJXhcbiIsIG1vZGUpOwogCX0KIAotCWVyciA9IHJkZXYtPmRlc2MtPm9wcy0+c2V0X21vZGUocmRldiwgbW9kZSk7Ci0JaWYgKGVyciA8IDApCi0JCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gc2V0IG9wdGltdW0gbW9kZSAleFxuIiwgbW9kZSk7Ci0KIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMzE2LDYgKzEzMjUsNTQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGludCByZWd1bGF0b3JfcmVzb2x2ZV9zdXBwbHkoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcmRldi0+ZGV2LnBhcmVudDsKKwlpbnQgcmV0OworCisJLyogTm8gc3VwcGx5IHRvIHJlc292bGU/ICovCisJaWYgKCFyZGV2LT5zdXBwbHlfbmFtZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTdXBwbHkgYWxyZWFkeSByZXNvbHZlZD8gKi8KKwlpZiAocmRldi0+c3VwcGx5KQorCQlyZXR1cm4gMDsKKworCXIgPSByZWd1bGF0b3JfZGV2X2xvb2t1cChkZXYsIHJkZXYtPnN1cHBseV9uYW1lLCAmcmV0KTsKKwlpZiAocmV0ID09IC1FTk9ERVYpIHsKKwkJLyoKKwkJICogTm8gc3VwcGx5IHdhcyBzcGVjaWZpZWQgZm9yIHRoaXMgcmVndWxhdG9yIGFuZAorCQkgKiB0aGVyZSB3aWxsIG5ldmVyIGJlIG9uZS4KKwkJICovCisJCXJldHVybiAwOworCX0KKworCWlmICghcikgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXNvbHZlICVzLXN1cHBseSBmb3IgJXNcbiIsCisJCQlyZGV2LT5zdXBwbHlfbmFtZSwgcmRldi0+ZGVzYy0+bmFtZSk7CisJCXJldHVybiAtRVBST0JFX0RFRkVSOworCX0KKworCS8qIFJlY3Vyc2l2ZWx5IHJlc29sdmUgdGhlIHN1cHBseSBvZiB0aGUgc3VwcGx5ICovCisJcmV0ID0gcmVndWxhdG9yX3Jlc29sdmVfc3VwcGx5KHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc2V0X3N1cHBseShyZGV2LCByKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIENhc2NhZGUgYWx3YXlzLW9uIHN0YXRlIHRvIHN1cHBseSAqLworCWlmIChfcmVndWxhdG9yX2lzX2VuYWJsZWQocmRldikpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShyZGV2LT5zdXBwbHkpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qIEludGVybmFsIHJlZ3VsYXRvciByZXF1ZXN0IGZ1bmN0aW9uICovCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqX3JlZ3VsYXRvcl9nZXQoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICppZCwKIAkJCQkJYm9vbCBleGNsdXNpdmUsIGJvb2wgYWxsb3dfZHVtbXkpCkBAIC0xMzg1LDYgKzE0NDIsMTIgQEAKIAkJZ290byBvdXQ7CiAJfQogCisJcmV0ID0gcmVndWxhdG9yX3Jlc29sdmVfc3VwcGx5KHJkZXYpOworCWlmIChyZXQgPCAwKSB7CisJCXJlZ3VsYXRvciA9IEVSUl9QVFIocmV0KTsKKwkJZ290byBvdXQ7CisJfQorCiAJaWYgKCF0cnlfbW9kdWxlX2dldChyZGV2LT5vd25lcikpCiAJCWdvdG8gb3V0OwogCkBAIC0xODM5LDEwICsxOTAyLDEyIEBACiAJfQogCiAJaWYgKHJkZXYtPmVuYV9waW4pIHsKLQkJcmV0ID0gcmVndWxhdG9yX2VuYV9ncGlvX2N0cmwocmRldiwgdHJ1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJcmRldi0+ZW5hX2dwaW9fc3RhdGUgPSAxOworCQlpZiAoIXJkZXYtPmVuYV9ncGlvX3N0YXRlKSB7CisJCQlyZXQgPSByZWd1bGF0b3JfZW5hX2dwaW9fY3RybChyZGV2LCB0cnVlKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQlyZGV2LT5lbmFfZ3Bpb19zdGF0ZSA9IDE7CisJCX0KIAl9IGVsc2UgaWYgKHJkZXYtPmRlc2MtPm9wcy0+ZW5hYmxlKSB7CiAJCXJldCA9IHJkZXYtPmRlc2MtPm9wcy0+ZW5hYmxlKHJkZXYpOwogCQlpZiAocmV0IDwgMCkKQEAgLTE5MzksMTAgKzIwMDQsMTIgQEAKIAl0cmFjZV9yZWd1bGF0b3JfZGlzYWJsZShyZGV2X2dldF9uYW1lKHJkZXYpKTsKIAogCWlmIChyZGV2LT5lbmFfcGluKSB7Ci0JCXJldCA9IHJlZ3VsYXRvcl9lbmFfZ3Bpb19jdHJsKHJkZXYsIGZhbHNlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCQlyZGV2LT5lbmFfZ3Bpb19zdGF0ZSA9IDA7CisJCWlmIChyZGV2LT5lbmFfZ3Bpb19zdGF0ZSkgeworCQkJcmV0ID0gcmVndWxhdG9yX2VuYV9ncGlvX2N0cmwocmRldiwgZmFsc2UpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCXJkZXYtPmVuYV9ncGlvX3N0YXRlID0gMDsKKwkJfQogCiAJfSBlbHNlIGlmIChyZGV2LT5kZXNjLT5vcHMtPmRpc2FibGUpIHsKIAkJcmV0ID0gcmRldi0+ZGVzYy0+b3BzLT5kaXNhYmxlKHJkZXYpOwpAQCAtMjk5NCw3ICszMDYxLDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHJlZ3VsYXRvcl9nZXRfbW9kZSk7CiAKIC8qKgotICogcmVndWxhdG9yX3NldF9vcHRpbXVtX21vZGUgLSBzZXQgcmVndWxhdG9yIG9wdGltdW0gb3BlcmF0aW5nIG1vZGUKKyAqIHJlZ3VsYXRvcl9zZXRfbG9hZCAtIHNldCByZWd1bGF0b3IgbG9hZAogICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQogICogQHVBX2xvYWQ6IGxvYWQgY3VycmVudAogICoKQEAgLTMwMTcsOSArMzA4NCw5IEBACiAgKiBEUk1TIHdpbGwgc3VtIHRoZSB0b3RhbCByZXF1ZXN0ZWQgbG9hZCBvbiB0aGUgcmVndWxhdG9yIGFuZCBjaGFuZ2UKICAqIHRvIHRoZSBtb3N0IGVmZmljaWVudCBvcGVyYXRpbmcgbW9kZSBpZiBwbGF0Zm9ybSBjb25zdHJhaW50cyBhbGxvdy4KICAqCi0gKiBSZXR1cm5zIHRoZSBuZXcgcmVndWxhdG9yIG1vZGUgb3IgZXJyb3IuCisgKiBPbiBlcnJvciBhIG5lZ2F0aXZlIGVycm5vIGlzIHJldHVybmVkLgogICovCi1pbnQgcmVndWxhdG9yX3NldF9vcHRpbXVtX21vZGUoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLCBpbnQgdUFfbG9hZCkKK2ludCByZWd1bGF0b3Jfc2V0X2xvYWQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLCBpbnQgdUFfbG9hZCkKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHJlZ3VsYXRvci0+cmRldjsKIAlpbnQgcmV0OwpAQCAtMzAzMSw3ICszMDk4LDcgQEAKIAogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3Jfc2V0X29wdGltdW1fbW9kZSk7CitFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3Jfc2V0X2xvYWQpOwogCiAvKioKICAqIHJlZ3VsYXRvcl9hbGxvd19ieXBhc3MgLSBhbGxvdyB0aGUgcmVndWxhdG9yIHRvIGdvIGludG8gYnlwYXNzIG1vZGUKQEAgLTM0OTUsNyArMzU2MiwxOCBAQAogCiBzdGF0aWMgdm9pZCByZGV2X2luaXRfZGVidWdmcyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKLQlyZGV2LT5kZWJ1Z2ZzID0gZGVidWdmc19jcmVhdGVfZGlyKHJkZXZfZ2V0X25hbWUocmRldiksIGRlYnVnZnNfcm9vdCk7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gcmRldi0+ZGV2LnBhcmVudDsKKwljb25zdCBjaGFyICpybmFtZSA9IHJkZXZfZ2V0X25hbWUocmRldik7CisJY2hhciBuYW1lW05BTUVfTUFYXTsKKworCS8qIEF2b2lkIGR1cGxpY2F0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeSBuYW1lcyAqLworCWlmIChwYXJlbnQgJiYgcm5hbWUgPT0gcmRldi0+ZGVzYy0+bmFtZSkgeworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlcy0lcyIsIGRldl9uYW1lKHBhcmVudCksCisJCQkgcm5hbWUpOworCQlybmFtZSA9IG5hbWU7CisJfQorCisJcmRldi0+ZGVidWdmcyA9IGRlYnVnZnNfY3JlYXRlX2RpcihybmFtZSwgZGVidWdmc19yb290KTsKIAlpZiAoIXJkZXYtPmRlYnVnZnMpIHsKIAkJcmRldl93YXJuKHJkZXYsICJGYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKIAkJcmV0dXJuOwpAQCAtMzUyOSw3ICszNjA3LDYgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJaW50IHJldCwgaTsKLQljb25zdCBjaGFyICpzdXBwbHkgPSBOVUxMOwogCiAJaWYgKHJlZ3VsYXRvcl9kZXNjID09IE5VTEwgfHwgY2ZnID09IE5VTEwpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwpAQCAtMzYyNiwxMiArMzcwMyw2IEBACiAJCQkJIGNvbmZpZy0+ZW5hX2dwaW8sIHJldCk7CiAJCQlnb3RvIHdhc2g7CiAJCX0KLQotCQlpZiAoY29uZmlnLT5lbmFfZ3Bpb19mbGFncyAmIEdQSU9GX09VVF9JTklUX0hJR0gpCi0JCQlyZGV2LT5lbmFfZ3Bpb19zdGF0ZSA9IDE7Ci0KLQkJaWYgKGNvbmZpZy0+ZW5hX2dwaW9faW52ZXJ0KQotCQkJcmRldi0+ZW5hX2dwaW9fc3RhdGUgPSAhcmRldi0+ZW5hX2dwaW9fc3RhdGU7CiAJfQogCiAJLyogc2V0IHJlZ3VsYXRvciBjb25zdHJhaW50cyAqLwpAQCAtMzY0Myw0MSArMzcxNCwxMCBAQAogCQlnb3RvIHNjcnViOwogCiAJaWYgKGluaXRfZGF0YSAmJiBpbml0X2RhdGEtPnN1cHBseV9yZWd1bGF0b3IpCi0JCXN1cHBseSA9IGluaXRfZGF0YS0+c3VwcGx5X3JlZ3VsYXRvcjsKKwkJcmRldi0+c3VwcGx5X25hbWUgPSBpbml0X2RhdGEtPnN1cHBseV9yZWd1bGF0b3I7CiAJZWxzZSBpZiAocmVndWxhdG9yX2Rlc2MtPnN1cHBseV9uYW1lKQotCQlzdXBwbHkgPSByZWd1bGF0b3JfZGVzYy0+c3VwcGx5X25hbWU7CisJCXJkZXYtPnN1cHBseV9uYW1lID0gcmVndWxhdG9yX2Rlc2MtPnN1cHBseV9uYW1lOwogCi0JaWYgKHN1cHBseSkgewotCQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcjsKLQotCQlyID0gcmVndWxhdG9yX2Rldl9sb29rdXAoZGV2LCBzdXBwbHksICZyZXQpOwotCi0JCWlmIChyZXQgPT0gLUVOT0RFVikgewotCQkJLyoKLQkJCSAqIE5vIHN1cHBseSB3YXMgc3BlY2lmaWVkIGZvciB0aGlzIHJlZ3VsYXRvciBhbmQKLQkJCSAqIHRoZXJlIHdpbGwgbmV2ZXIgYmUgb25lLgotCQkJICovCi0JCQlyZXQgPSAwOwotCQkJZ290byBhZGRfZGV2OwotCQl9IGVsc2UgaWYgKCFyKSB7Ci0JCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBmaW5kIHN1cHBseSAlc1xuIiwgc3VwcGx5KTsKLQkJCXJldCA9IC1FUFJPQkVfREVGRVI7Ci0JCQlnb3RvIHNjcnViOwotCQl9Ci0KLQkJcmV0ID0gc2V0X3N1cHBseShyZGV2LCByKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIHNjcnViOwotCi0JCS8qIEVuYWJsZSBzdXBwbHkgaWYgcmFpbCBpcyBlbmFibGVkICovCi0JCWlmIChfcmVndWxhdG9yX2lzX2VuYWJsZWQocmRldikpIHsKLQkJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUocmRldi0+c3VwcGx5KTsKLQkJCWlmIChyZXQgPCAwKQotCQkJCWdvdG8gc2NydWI7Ci0JCX0KLQl9Ci0KLWFkZF9kZXY6CiAJLyogYWRkIGNvbnN1bWVycyBkZXZpY2VzICovCiAJaWYgKGluaXRfZGF0YSkgewogCQlmb3IgKGkgPSAwOyBpIDwgaW5pdF9kYXRhLT5udW1fY29uc3VtZXJfc3VwcGxpZXM7IGkrKykgewpAQCAtMzcwNCw4ICszNzQ0LDYgQEAKIAl1bnNldF9yZWd1bGF0b3Jfc3VwcGxpZXMocmRldik7CiAKIHNjcnViOgotCWlmIChyZGV2LT5zdXBwbHkpCi0JCV9yZWd1bGF0b3JfcHV0KHJkZXYtPnN1cHBseSk7CiAJcmVndWxhdG9yX2VuYV9ncGlvX2ZyZWUocmRldik7CiAJa2ZyZWUocmRldi0+Y29uc3RyYWludHMpOwogd2FzaDoKQEAgLTM4MDAsOSArMzgzOCwxMSBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgJnJlZ3VsYXRvcl9saXN0LCBsaXN0KSB7CiAJCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKIAkJaWYgKHJkZXYtPnVzZV9jb3VudCA+IDAgIHx8IHJkZXYtPmNvbnN0cmFpbnRzLT5hbHdheXNfb24pIHsKLQkJCWVycm9yID0gX3JlZ3VsYXRvcl9kb19lbmFibGUocmRldik7Ci0JCQlpZiAoZXJyb3IpCi0JCQkJcmV0ID0gZXJyb3I7CisJCQlpZiAoIV9yZWd1bGF0b3JfaXNfZW5hYmxlZChyZGV2KSkgeworCQkJCWVycm9yID0gX3JlZ3VsYXRvcl9kb19lbmFibGUocmRldik7CisJCQkJaWYgKGVycm9yKQorCQkJCQlyZXQgPSBlcnJvcjsKKwkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmICghaGF2ZV9mdWxsX2NvbnN0cmFpbnRzKCkpCiAJCQkJZ290byB1bmxvY2s7CkBAIC0zOTM2LDYgKzM5NzYsMTEwIEBACiAjZW5kaWYKIH07CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKK3N0YXRpYyB2b2lkIHJlZ3VsYXRvcl9zdW1tYXJ5X3Nob3dfc3VidHJlZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsCisJCQkJCSAgIHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQkJCQkgICBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCA9IHMtPnByaXZhdGU7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmNoaWxkOworCXN0cnVjdCByZWd1bGF0aW9uX2NvbnN0cmFpbnRzICpjOworCXN0cnVjdCByZWd1bGF0b3IgKmNvbnN1bWVyOworCisJaWYgKCFyZGV2KQorCQlyZXR1cm47CisKKwlzZXFfcHJpbnRmKHMsICIlKnMlLSpzICUzZCAlNGQgJTZkICIsCisJCSAgIGxldmVsICogMyArIDEsICIiLAorCQkgICAzMCAtIGxldmVsICogMywgcmRldl9nZXRfbmFtZShyZGV2KSwKKwkJICAgcmRldi0+dXNlX2NvdW50LCByZGV2LT5vcGVuX2NvdW50LCByZGV2LT5ieXBhc3NfY291bnQpOworCisJc2VxX3ByaW50ZihzLCAiJTVkbVYgIiwgX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShyZGV2KSAvIDEwMDApOworCXNlcV9wcmludGYocywgIiU1ZG1BICIsIF9yZWd1bGF0b3JfZ2V0X2N1cnJlbnRfbGltaXQocmRldikgLyAxMDAwKTsKKworCWMgPSByZGV2LT5jb25zdHJhaW50czsKKwlpZiAoYykgeworCQlzd2l0Y2ggKHJkZXYtPmRlc2MtPnR5cGUpIHsKKwkJY2FzZSBSRUdVTEFUT1JfVk9MVEFHRToKKwkJCXNlcV9wcmludGYocywgIiU1ZG1WICU1ZG1WICIsCisJCQkJICAgYy0+bWluX3VWIC8gMTAwMCwgYy0+bWF4X3VWIC8gMTAwMCk7CisJCQlicmVhazsKKwkJY2FzZSBSRUdVTEFUT1JfQ1VSUkVOVDoKKwkJCXNlcV9wcmludGYocywgIiU1ZG1BICU1ZG1BICIsCisJCQkJICAgYy0+bWluX3VBIC8gMTAwMCwgYy0+bWF4X3VBIC8gMTAwMCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNlcV9wdXRzKHMsICJcbiIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb25zdW1lciwgJnJkZXYtPmNvbnN1bWVyX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNvbnN1bWVyLT5kZXYtPmNsYXNzID09ICZyZWd1bGF0b3JfY2xhc3MpCisJCQljb250aW51ZTsKKworCQlzZXFfcHJpbnRmKHMsICIlKnMlLSpzICIsCisJCQkgICAobGV2ZWwgKyAxKSAqIDMgKyAxLCAiIiwKKwkJCSAgIDMwIC0gKGxldmVsICsgMSkgKiAzLCBkZXZfbmFtZShjb25zdW1lci0+ZGV2KSk7CisKKwkJc3dpdGNoIChyZGV2LT5kZXNjLT50eXBlKSB7CisJCWNhc2UgUkVHVUxBVE9SX1ZPTFRBR0U6CisJCQlzZXFfcHJpbnRmKHMsICIlMzdkbVYgJTVkbVYiLAorCQkJCSAgIGNvbnN1bWVyLT5taW5fdVYgLyAxMDAwLAorCQkJCSAgIGNvbnN1bWVyLT5tYXhfdVYgLyAxMDAwKTsKKwkJCWJyZWFrOworCQljYXNlIFJFR1VMQVRPUl9DVVJSRU5UOgorCQkJYnJlYWs7CisJCX0KKworCQlzZXFfcHV0cyhzLCAiXG4iKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoaWxkLCBsaXN0LCBsaXN0KSB7CisJCS8qIGhhbmRsZSBvbmx5IG5vbi1yb290IHJlZ3VsYXRvcnMgc3VwcGxpZWQgYnkgY3VycmVudCByZGV2ICovCisJCWlmICghY2hpbGQtPnN1cHBseSB8fCBjaGlsZC0+c3VwcGx5LT5yZGV2ICE9IHJkZXYpCisJCQljb250aW51ZTsKKworCQlyZWd1bGF0b3Jfc3VtbWFyeV9zaG93X3N1YnRyZWUocywgY2hpbGQsIGxldmVsICsgMSk7CisJfQorfQorCitzdGF0aWMgaW50IHJlZ3VsYXRvcl9zdW1tYXJ5X3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSBzLT5wcml2YXRlOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OworCisJc2VxX3B1dHMocywgIiByZWd1bGF0b3IgICAgICAgICAgICAgICAgICAgICAgdXNlIG9wZW4gYnlwYXNzIHZvbHRhZ2UgY3VycmVudCAgICAgbWluICAgICBtYXhcbiIpOworCXNlcV9wdXRzKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCW11dGV4X2xvY2soJnJlZ3VsYXRvcl9saXN0X211dGV4KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmRldiwgbGlzdCwgbGlzdCkgeworCQlpZiAocmRldi0+c3VwcGx5KQorCQkJY29udGludWU7CisKKwkJcmVndWxhdG9yX3N1bW1hcnlfc2hvd19zdWJ0cmVlKHMsIHJkZXYsIDApOworCX0KKworCW11dGV4X3VubG9jaygmcmVndWxhdG9yX2xpc3RfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVndWxhdG9yX3N1bW1hcnlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgcmVndWxhdG9yX3N1bW1hcnlfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVndWxhdG9yX3N1bW1hcnlfZm9wcyA9IHsKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwkub3BlbgkJPSByZWd1bGF0b3Jfc3VtbWFyeV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCisjZW5kaWYKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHJlZ3VsYXRvcl9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTM5NDksNiArNDA5Myw5IEBACiAJZGVidWdmc19jcmVhdGVfZmlsZSgic3VwcGx5X21hcCIsIDA0NDQsIGRlYnVnZnNfcm9vdCwgTlVMTCwKIAkJCSAgICAmc3VwcGx5X21hcF9mb3BzKTsKIAorCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInJlZ3VsYXRvcl9zdW1tYXJ5IiwgMDQ0NCwgZGVidWdmc19yb290LAorCQkJICAgICZyZWd1bGF0b3JfbGlzdCwgJnJlZ3VsYXRvcl9zdW1tYXJ5X2ZvcHMpOworCiAJcmVndWxhdG9yX2R1bW15X2luaXQoKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kYTkyMTEtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci9kYTkyMTEtcmVndWxhdG9yLmMKaW5kZXggMDEzNDM0MS4uZGY3OWU0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGE5MjExLXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2RhOTIxMS1yZWd1bGF0b3IuYwpAQCAtMzA1LDggKzMwNSw3IEBACiAKIAlpZiAocmVnX3ZhbCAmIERBOTIxMV9FX09WX0NVUlJfQSkgewogCQlyZWd1bGF0b3Jfbm90aWZpZXJfY2FsbF9jaGFpbihjaGlwLT5yZGV2WzBdLAotCQkJUkVHVUxBVE9SX0VWRU5UX09WRVJfQ1VSUkVOVCwKLQkJCXJkZXZfZ2V0X2RydmRhdGEoY2hpcC0+cmRldlswXSkpOworCQkJUkVHVUxBVE9SX0VWRU5UX09WRVJfQ1VSUkVOVCwgTlVMTCk7CiAKIAkJZXJyID0gcmVnbWFwX3dyaXRlKGNoaXAtPnJlZ21hcCwgREE5MjExX1JFR19FVkVOVF9CLAogCQkJREE5MjExX0VfT1ZfQ1VSUl9BKTsKQEAgLTMxOCw4ICszMTcsNyBAQAogCiAJaWYgKHJlZ192YWwgJiBEQTkyMTFfRV9PVl9DVVJSX0IpIHsKIAkJcmVndWxhdG9yX25vdGlmaWVyX2NhbGxfY2hhaW4oY2hpcC0+cmRldlsxXSwKLQkJCVJFR1VMQVRPUl9FVkVOVF9PVkVSX0NVUlJFTlQsCi0JCQlyZGV2X2dldF9kcnZkYXRhKGNoaXAtPnJkZXZbMV0pKTsKKwkJCVJFR1VMQVRPUl9FVkVOVF9PVkVSX0NVUlJFTlQsIE5VTEwpOwogCiAJCWVyciA9IHJlZ21hcF93cml0ZShjaGlwLT5yZWdtYXAsIERBOTIxMV9SRUdfRVZFTlRfQiwKIAkJCURBOTIxMV9FX09WX0NVUlJfQik7CkBAIC0zNDQsNyArMzQyLDcgQEAKIAogCXJldCA9IHJlZ21hcF9yZWFkKGNoaXAtPnJlZ21hcCwgREE5MjExX1JFR19DT05GSUdfRSwgJmRhdGEpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgQ09OVFJPTF9FIHJlZzogJWRcbiIsIHJldCk7CisJCWRldl9lcnIoY2hpcC0+ZGV2LCAiRmFpbGVkIHRvIHJlYWQgQ09ORklHX0UgcmVnOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RieDUwMC1wcmNtdS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGJ4NTAwLXByY211LmMKaW5kZXggMmQxNmI5Zi4uMzk2M2RmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGJ4NTAwLXByY211LmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGJ4NTAwLXByY211LmMKQEAgLTk1LDE0ICs5NSw5IEBACiAKIHN0YXRpYyBpbnQgdXg1MDBfcmVndWxhdG9yX3Bvd2VyX3N0YXRlX2NudF9wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcy0+cHJpdmF0ZTsKLQlpbnQgZXJyOwotCiAJLyogcHJpbnQgcG93ZXIgc3RhdGUgY291bnQgKi8KLQllcnIgPSBzZXFfcHJpbnRmKHMsICJ1eDUwMC1yZWd1bGF0b3IgcG93ZXIgc3RhdGUgY291bnQ6ICVpXG4iLAotCQlwb3dlcl9zdGF0ZV9hY3RpdmVfZ2V0KCkpOwotCWlmIChlcnIgPCAwKQotCQlkZXZfZXJyKGRldiwgInNlcV9wcmludGYgb3ZlcmZsb3dcbiIpOworCXNlcV9wcmludGYocywgInV4NTAwLXJlZ3VsYXRvciBwb3dlciBzdGF0ZSBjb3VudDogJWlcbiIsCisJCSAgIHBvd2VyX3N0YXRlX2FjdGl2ZV9nZXQoKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyNCwxOSArMTE5LDExIEBACiAKIHN0YXRpYyBpbnQgdXg1MDBfcmVndWxhdG9yX3N0YXR1c19wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcy0+cHJpdmF0ZTsKLQlpbnQgZXJyOwogCWludCBpOwogCiAJLyogcHJpbnQgZHVtcCBoZWFkZXIgKi8KLQllcnIgPSBzZXFfcHV0cyhzLCAidXg1MDAtcmVndWxhdG9yIHN0YXR1czpcbiIpOwotCWlmIChlcnIgPCAwKQotCQlkZXZfZXJyKGRldiwgInNlcV9wdXRzIG92ZXJmbG93XG4iKTsKLQotCWVyciA9IHNlcV9wcmludGYocywgIiUzMXMgOiAlOHMgOiAlOHNcbiIsICJjdXJyZW50IiwKLQkJImJlZm9yZSIsICJhZnRlciIpOwotCWlmIChlcnIgPCAwKQotCQlkZXZfZXJyKGRldiwgInNlcV9wcmludGYgb3ZlcmZsb3dcbiIpOworCXNlcV9wdXRzKHMsICJ1eDUwMC1yZWd1bGF0b3Igc3RhdHVzOlxuIik7CisJc2VxX3ByaW50ZihzLCAiJTMxcyA6ICU4cyA6ICU4c1xuIiwgImN1cnJlbnQiLCAiYmVmb3JlIiwgImFmdGVyIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcmRlYnVnLm51bV9yZWd1bGF0b3JzOyBpKyspIHsKIAkJc3RydWN0IGRieDUwMF9yZWd1bGF0b3JfaW5mbyAqaW5mbzsKQEAgLTE0NCwxMiArMTMxLDExIEBACiAJCWluZm8gPSAmcmRlYnVnLnJlZ3VsYXRvcl9hcnJheVtpXTsKIAogCQkvKiBwcmludCBzdGF0dXMgKi8KLQkJZXJyID0gc2VxX3ByaW50ZihzLCAiJTIwcyA6ICU4cyA6ICU4cyA6ICU4c1xuIiwgaW5mby0+ZGVzYy5uYW1lLAotCQkJaW5mby0+aXNfZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCi0JCQlyZGVidWcuc3RhdGVfYmVmb3JlX3N1c3BlbmRbaV0gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAotCQkJcmRlYnVnLnN0YXRlX2FmdGVyX3N1c3BlbmRbaV0gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKLQkJaWYgKGVyciA8IDApCi0JCQlkZXZfZXJyKGRldiwgInNlcV9wcmludGYgb3ZlcmZsb3dcbiIpOworCQlzZXFfcHJpbnRmKHMsICIlMjBzIDogJThzIDogJThzIDogJThzXG4iLAorCQkJICAgaW5mby0+ZGVzYy5uYW1lLAorCQkJICAgaW5mby0+aXNfZW5hYmxlZCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIsCisJCQkgICByZGVidWcuc3RhdGVfYmVmb3JlX3N1c3BlbmRbaV0gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiLAorCQkJICAgcmRlYnVnLnN0YXRlX2FmdGVyX3N1c3BlbmRbaV0gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2RldnJlcy5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZGV2cmVzLmMKaW5kZXggOGY3ODViYy4uNmVjMWQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvZGV2cmVzLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvZGV2cmVzLmMKQEAgLTQxMywzICs0MTMsODggQEAKIAkJZGV2bV9yZWd1bGF0b3JfdW5yZWdpc3Rlcl9zdXBwbHlfYWxpYXMoZGV2LCBpZFtpXSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChkZXZtX3JlZ3VsYXRvcl9idWxrX3VucmVnaXN0ZXJfc3VwcGx5X2FsaWFzKTsKKworc3RydWN0IHJlZ3VsYXRvcl9ub3RpZmllcl9tYXRjaCB7CisJc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yOworCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmI7Cit9OworCitzdGF0aWMgaW50IGRldm1fcmVndWxhdG9yX21hdGNoX25vdGlmaWVyKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcmVzLAorCQkJCQkgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX25vdGlmaWVyX21hdGNoICptYXRjaCA9IHJlczsKKwlzdHJ1Y3QgcmVndWxhdG9yX25vdGlmaWVyX21hdGNoICp0YXJnZXQgPSBkYXRhOworCisJcmV0dXJuIG1hdGNoLT5yZWd1bGF0b3IgPT0gdGFyZ2V0LT5yZWd1bGF0b3IgJiYgbWF0Y2gtPm5iID09IHRhcmdldC0+bmI7Cit9CisKK3N0YXRpYyB2b2lkIGRldm1fcmVndWxhdG9yX2Rlc3Ryb3lfbm90aWZpZXIoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCit7CisJc3RydWN0IHJlZ3VsYXRvcl9ub3RpZmllcl9tYXRjaCAqbWF0Y2ggPSByZXM7CisKKwlyZWd1bGF0b3JfdW5yZWdpc3Rlcl9ub3RpZmllcihtYXRjaC0+cmVndWxhdG9yLCBtYXRjaC0+bmIpOworfQorCisvKioKKyAqIGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyX25vdGlmaWVyIC0gUmVzb3VyY2UgbWFuYWdlZAorICogcmVndWxhdG9yX3JlZ2lzdGVyX25vdGlmaWVyCisgKgorICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQorICogQG5iOiBub3RpZmllciBibG9jaworICoKKyAqIFRoZSBub3RpZmllciB3aWxsIGJlIHJlZ2lzdGVycyB1bmRlciB0aGUgY29uc3VtZXIgZGV2aWNlIGFuZCBiZQorICogYXV0b21hdGljYWxseSBiZSB1bnJlZ2lzdGVyZWQgd2hlbiB0aGUgc291cmNlIGRldmljZSBpcyB1bmJvdW5kLgorICovCitpbnQgZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLAorCQkJCSAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlzdHJ1Y3QgcmVndWxhdG9yX25vdGlmaWVyX21hdGNoICptYXRjaDsKKwlpbnQgcmV0OworCisJbWF0Y2ggPSBkZXZyZXNfYWxsb2MoZGV2bV9yZWd1bGF0b3JfZGVzdHJveV9ub3RpZmllciwKKwkJCSAgICAgc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3Jfbm90aWZpZXJfbWF0Y2gpLAorCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hdGNoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1hdGNoLT5yZWd1bGF0b3IgPSByZWd1bGF0b3I7CisJbWF0Y2gtPm5iID0gbmI7CisKKwlyZXQgPSByZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIocmVndWxhdG9yLCBuYik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2cmVzX2ZyZWUobWF0Y2gpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldnJlc19hZGQocmVndWxhdG9yLT5kZXYsIG1hdGNoKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIpOworCisvKioKKyAqIGRldm1fcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIgLSBSZXNvdXJjZSBtYW5hZ2VkCisgKiByZWd1bGF0b3JfdW5yZWdpc3Rlcl9ub3RpZmllcigpCisgKgorICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIHNvdXJjZQorICogQG5iOiBub3RpZmllciBibG9jaworICoKKyAqIFVucmVnaXN0ZXIgYSBub3RpZmllciByZWdpc3RlcmVkIHdpdGggZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIoKS4KKyAqIE5vcm1hbGx5IHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgbmVlZCB0byBiZSBjYWxsZWQgYW5kIHRoZSByZXNvdXJjZQorICogbWFuYWdlbWVudCBjb2RlIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHJlc291cmNlIGlzIGZyZWVkLgorICovCit2b2lkIGRldm1fcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLAorCQkJCQlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXN0cnVjdCByZWd1bGF0b3Jfbm90aWZpZXJfbWF0Y2ggbWF0Y2g7CisJaW50IHJjOworCisJbWF0Y2gucmVndWxhdG9yID0gcmVndWxhdG9yOworCW1hdGNoLm5iID0gbmI7CisKKwlyYyA9IGRldnJlc19yZWxlYXNlKHJlZ3VsYXRvci0+ZGV2LCBkZXZtX3JlZ3VsYXRvcl9kZXN0cm95X25vdGlmaWVyLAorCQkJICAgIGRldm1fcmVndWxhdG9yX21hdGNoX25vdGlmaWVyLCAmbWF0Y2gpOworCWlmIChyYyAhPSAwKQorCQlXQVJOX09OKHJjKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRldm1fcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2OTMuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDc3NjkzLmMKaW5kZXggMDdiMzEzZS4uOTY2NWE0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvbWF4Nzc2OTMuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9tYXg3NzY5My5jCkBAIC0xMjgsNiArMTI4LDggQEAKICNkZWZpbmUgcmVndWxhdG9yX2Rlc2NfZXNhZmVvdXQoX251bSkJewkJCVwKIAkubmFtZQkJPSAiRVNBRkVPVVQiI19udW0sCQkJXAogCS5pZAkJPSBNQVg3NzY5M19FU0FGRU9VVCMjX251bSwJCVwKKwkub2ZfbWF0Y2gJPSBvZl9tYXRjaF9wdHIoIkVTQUZFT1VUIiNfbnVtKSwJXAorCS5yZWd1bGF0b3JzX25vZGUJPSBvZl9tYXRjaF9wdHIoInJlZ3VsYXRvcnMiKSwJXAogCS5uX3ZvbHRhZ2VzCT0gNCwJCQkJCVwKIAkub3BzCQk9ICZtYXg3NzY5M19zYWZlb3V0X29wcywJCVwKIAkudHlwZQkJPSBSRUdVTEFUT1JfVk9MVEFHRSwJCQlcCkBAIC0xNDUsNiArMTQ3LDggQEAKIAl7CiAJCS5uYW1lID0gIkNIQVJHRVIiLAogCQkuaWQgPSBNQVg3NzY5M19DSEFSR0VSLAorCQkub2ZfbWF0Y2ggPSBvZl9tYXRjaF9wdHIoIkNIQVJHRVIiKSwKKwkJLnJlZ3VsYXRvcnNfbm9kZSA9IG9mX21hdGNoX3B0cigicmVndWxhdG9ycyIpLAogCQkub3BzID0gJm1heDc3NjkzX2NoYXJnZXJfb3BzLAogCQkudHlwZSA9IFJFR1VMQVRPUl9DVVJSRU5ULAogCQkub3duZXIgPSBUSElTX01PRFVMRSwKQEAgLTE1NCwxMDIgKzE1OCwyMyBAQAogCX0sCiB9OwogCi0jaWZkZWYgQ09ORklHX09GCi1zdGF0aWMgaW50IG1heDc3NjkzX3BtaWNfZHRfcGFyc2VfcmRhdGEoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgbWF4Nzc2OTNfcmVndWxhdG9yX2RhdGEgKipyZGF0YSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKnJtYXRjaDsKLQlzdHJ1Y3QgbWF4Nzc2OTNfcmVndWxhdG9yX2RhdGEgKnRtcDsKLQlpbnQgaSwgbWF0Y2hlZCA9IDA7Ci0KLQlucCA9IG9mX2dldF9jaGlsZF9ieV9uYW1lKGRldi0+cGFyZW50LT5vZl9ub2RlLCAicmVndWxhdG9ycyIpOwotCWlmICghbnApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jcm1hdGNoID0gZGV2bV9remFsbG9jKGRldiwKLQkJIHNpemVvZigqcm1hdGNoKSAqIEFSUkFZX1NJWkUocmVndWxhdG9ycyksIEdGUF9LRVJORUwpOwotCWlmICghcm1hdGNoKSB7Ci0JCW9mX25vZGVfcHV0KG5wKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVndWxhdG9ycyk7IGkrKykKLQkJcm1hdGNoW2ldLm5hbWUgPSByZWd1bGF0b3JzW2ldLm5hbWU7Ci0KLQltYXRjaGVkID0gb2ZfcmVndWxhdG9yX21hdGNoKGRldiwgbnAsIHJtYXRjaCwgQVJSQVlfU0laRShyZWd1bGF0b3JzKSk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotCWlmIChtYXRjaGVkIDw9IDApCi0JCXJldHVybiBtYXRjaGVkOwotCSpyZGF0YSA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqKnJkYXRhKSAqIG1hdGNoZWQsIEdGUF9LRVJORUwpOwotCWlmICghKCpyZGF0YSkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JdG1wID0gKnJkYXRhOwotCi0JZm9yIChpID0gMDsgaSA8IG1hdGNoZWQ7IGkrKykgewotCQl0bXAtPmluaXRkYXRhID0gcm1hdGNoW2ldLmluaXRfZGF0YTsKLQkJdG1wLT5vZl9ub2RlID0gcm1hdGNoW2ldLm9mX25vZGU7Ci0JCXRtcC0+aWQgPSByZWd1bGF0b3JzW2ldLmlkOwotCQl0bXArKzsKLQl9Ci0KLQlyZXR1cm4gbWF0Y2hlZDsKLX0KLSNlbHNlCi1zdGF0aWMgaW50IG1heDc3NjkzX3BtaWNfZHRfcGFyc2VfcmRhdGEoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQlzdHJ1Y3QgbWF4Nzc2OTNfcmVndWxhdG9yX2RhdGEgKipyZGF0YSkKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfT0YgKi8KLQotc3RhdGljIGludCBtYXg3NzY5M19wbWljX2luaXRfcmRhdGEoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICBzdHJ1Y3QgbWF4Nzc2OTNfcmVndWxhdG9yX2RhdGEgKipyZGF0YSkKLXsKLQlzdHJ1Y3QgbWF4Nzc2OTNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0JaW50IG51bV9yZWd1bGF0b3JzID0gMDsKLQotCXBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYtPnBhcmVudCk7Ci0JaWYgKHBkYXRhKSB7Ci0JCSpyZGF0YSA9IHBkYXRhLT5yZWd1bGF0b3JzOwotCQludW1fcmVndWxhdG9ycyA9IHBkYXRhLT5udW1fcmVndWxhdG9yczsKLQl9Ci0KLQlpZiAoISgqcmRhdGEpICYmIGRldi0+cGFyZW50LT5vZl9ub2RlKQotCQludW1fcmVndWxhdG9ycyA9IG1heDc3NjkzX3BtaWNfZHRfcGFyc2VfcmRhdGEoZGV2LCByZGF0YSk7Ci0KLQlyZXR1cm4gbnVtX3JlZ3VsYXRvcnM7Ci19Ci0KIHN0YXRpYyBpbnQgbWF4Nzc2OTNfcG1pY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBtYXg3NzY5M19kZXYgKmlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwotCXN0cnVjdCBtYXg3NzY5M19yZWd1bGF0b3JfZGF0YSAqcmRhdGEgPSBOVUxMOwotCWludCBudW1fcmRhdGEsIGk7CisJaW50IGk7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwogCi0JbnVtX3JkYXRhID0gbWF4Nzc2OTNfcG1pY19pbml0X3JkYXRhKCZwZGV2LT5kZXYsICZyZGF0YSk7Ci0JaWYgKCFyZGF0YSB8fCBudW1fcmRhdGEgPD0gMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBpbml0IGRhdGEgc3VwcGxpZWQuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JY29uZmlnLmRldiA9ICZwZGV2LT5kZXY7CisJY29uZmlnLmRldiA9IGlvZGV2LT5kZXY7CiAJY29uZmlnLnJlZ21hcCA9IGlvZGV2LT5yZWdtYXA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnVtX3JkYXRhOyBpKyspIHsKLQkJaW50IGlkID0gcmRhdGFbaV0uaWQ7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVndWxhdG9ycyk7IGkrKykgewogCQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKIAotCQljb25maWcuaW5pdF9kYXRhID0gcmRhdGFbaV0uaW5pdGRhdGE7Ci0JCWNvbmZpZy5vZl9ub2RlID0gcmRhdGFbaV0ub2Zfbm9kZTsKLQogCQlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKLQkJCQkJCSZyZWd1bGF0b3JzW2lkXSwgJmNvbmZpZyk7CisJCQkJCQkmcmVndWxhdG9yc1tpXSwgJmNvbmZpZyk7CiAJCWlmIChJU19FUlIocmRldikpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCQkiRmFpbGVkIHRvIGluaXRpYWxpemUgcmVndWxhdG9yLSVkXG4iLCBpZCk7CisJCQkJIkZhaWxlZCB0byBpbml0aWFsaXplIHJlZ3VsYXRvci0lZFxuIiwgaSk7CiAJCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NjAuYyBiL2RyaXZlcnMvcmVndWxhdG9yL21heDg2NjAuYwppbmRleCA3ZWVlMmNhLi40MDcxZDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9tYXg4NjYwLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvbWF4ODY2MC5jCkBAIC0zODIsNyArMzgyLDcgQEAKIAkJCQkgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaTJjX2lkKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKLQlzdHJ1Y3QgbWF4ODY2MF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoZGV2KTsKKwlzdHJ1Y3QgbWF4ODY2MF9wbGF0Zm9ybV9kYXRhIHBkYXRhX29mLCAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwogCXN0cnVjdCBtYXg4NjYwICptYXg4NjYwOwogCWludCBib290X29uLCBpLCBpZCwgcmV0ID0gLUVJTlZBTDsKQEAgLTM5MSw3ICszOTEsNiBAQAogCiAJaWYgKGRldi0+b2Zfbm9kZSAmJiAhcGRhdGEpIHsKIAkJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqaWQ7Ci0JCXN0cnVjdCBtYXg4NjYwX3BsYXRmb3JtX2RhdGEgcGRhdGFfb2Y7CiAKIAkJaWQgPSBvZl9tYXRjaF9kZXZpY2Uob2ZfbWF0Y2hfcHRyKG1heDg2NjBfZHRfaWRzKSwgZGV2KTsKIAkJaWYgKCFpZCkKQEAgLTQ0Myw5ICs0NDIsOSBAQAogCWZvciAoaSA9IDA7IGkgPCBwZGF0YS0+bnVtX3N1YmRldnM7IGkrKykgewogCiAJCWlmICghcGRhdGEtPnN1YmRldnNbaV0ucGxhdGZvcm1fZGF0YSkKLQkJCXJldHVybiByZXQ7Ci0KLQkJYm9vdF9vbiA9IHBkYXRhLT5zdWJkZXZzW2ldLnBsYXRmb3JtX2RhdGEtPmNvbnN0cmFpbnRzLmJvb3Rfb247CisJCQlib290X29uID0gZmFsc2U7CisJCWVsc2UKKwkJCWJvb3Rfb24gPSBwZGF0YS0+c3ViZGV2c1tpXS5wbGF0Zm9ybV9kYXRhLT5jb25zdHJhaW50cy5ib290X29uOwogCiAJCXN3aXRjaCAocGRhdGEtPnN1YmRldnNbaV0uaWQpIHsKIAkJY2FzZSBNQVg4NjYwX1YzOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvcGFsbWFzLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvcGFsbWFzLXJlZ3VsYXRvci5jCmluZGV4IDkyMDVmNDMuLjgyMTc2MTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3BhbG1hcy1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci9wYWxtYXMtcmVndWxhdG9yLmMKQEAgLTkxNiw2ICs5MTYsOSBAQAogCQkJICAgIChpZCA9PSBQQUxNQVNfUkVHX0xETzYpKQogCQkJCWRlc2MtPmVuYWJsZV90aW1lID0gMjAwMDsKIAkJfSBlbHNlIHsKKwkJCWlmICghZGRhdGEtPmhhc19yZWdlbjMgJiYgaWQgPT0gUEFMTUFTX1JFR19SRUdFTjMpCisJCQkJY29udGludWU7CisKIAkJCWRlc2MtPm5fdm9sdGFnZXMgPSAxOwogCQkJaWYgKHJlZ19pbml0ICYmIHJlZ19pbml0LT5yb29mX2Zsb29yKQogCQkJCWRlc2MtPm9wcyA9ICZwYWxtYXNfb3BzX2V4dF9jb250cm9sX2V4dHJlZzsKQEAgLTEzOTgsNiArMTQwMSw3IEBACiAJLmxkb19iZWdpbiA9IFBBTE1BU19SRUdfTERPMSwKIAkubGRvX2VuZCA9IFBBTE1BU19SRUdfTERPVVNCLAogCS5tYXhfcmVnID0gUEFMTUFTX05VTV9SRUdTLAorCS5oYXNfcmVnZW4zID0gdHJ1ZSwKIAkucGFsbWFzX3JlZ3NfaW5mbyA9IHBhbG1hc19nZW5lcmljX3JlZ3NfaW5mbywKIAkucGFsbWFzX21hdGNoZXMgPSBwYWxtYXNfbWF0Y2hlcywKIAkuc2xlZXBfcmVxX2luZm8gPSBwYWxtYV9zbGVlcF9yZXFfaW5mbywKQEAgLTE0MTEsNiArMTQxNSw3IEBACiAJLmxkb19iZWdpbiA9IFRQUzY1OTE3X1JFR19MRE8xLAogCS5sZG9fZW5kID0gVFBTNjU5MTdfUkVHX0xETzUsCiAJLm1heF9yZWcgPSBUUFM2NTkxN19OVU1fUkVHUywKKwkuaGFzX3JlZ2VuMyA9IHRydWUsCiAJLnBhbG1hc19yZWdzX2luZm8gPSB0cHM2NTkxN19yZWdzX2luZm8sCiAJLnBhbG1hc19tYXRjaGVzID0gdHBzNjU5MTdfbWF0Y2hlcywKIAkuc2xlZXBfcmVxX2luZm8gPSB0cHM2NTkxN19zbGVlcF9yZXFfaW5mbywKQEAgLTE1MDUsNyArMTUxMCw3IEBACiAJcGRhdGEtPmxkbzZfdmlicmF0b3IgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobm9kZSwgInRpLGxkbzYtdmlicmF0b3IiKTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfcGFsbWFzX21hdGNoX3RibFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfcGFsbWFzX21hdGNoX3RibFtdID0gewogCXsKIAkJLmNvbXBhdGlibGUgPSAidGkscGFsbWFzLXBtaWMiLAogCQkuZGF0YSA9ICZwYWxtYXNfZGRhdGEsCkBAIC0xNTcyLDYgKzE1NzcsMTIgQEAKIAlpZiAoIXBtaWMpCiAJCXJldHVybiAtRU5PTUVNOwogCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5vZGUsICJ0aSx0cHM2NTkwMzgtcG1pYyIpKSB7CisJCXBhbG1hc19nZW5lcmljX3JlZ3NfaW5mb1tQQUxNQVNfUkVHX1JFR0VOMl0uY3RybF9hZGRyID0KKwkJCQkJCQlUUFM2NTkwMzhfUkVHRU4yX0NUUkw7CisJCXBhbG1hc19kZGF0YS5oYXNfcmVnZW4zID0gZmFsc2U7CisJfQorCiAJcG1pYy0+ZGV2ID0gJnBkZXYtPmRldjsKIAlwbWljLT5wYWxtYXMgPSBwYWxtYXM7CiAJcGFsbWFzLT5wbWljID0gcG1pYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3Fjb21fcnBtLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvcWNvbV9ycG0tcmVndWxhdG9yLmMKaW5kZXggMDBjNWNjMy4uZTI1NDI3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvcWNvbV9ycG0tcmVndWxhdG9yLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvcWNvbV9ycG0tcmVndWxhdG9yLmMKQEAgLTM5Myw2ICszOTMsMjggQEAKIAlyZXR1cm4gdnJlZy0+aXNfZW5hYmxlZDsKIH0KIAorc3RhdGljIGludCBycG1fcmVnX3NldF9sb2FkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgbG9hZF91QSkKK3sKKwlzdHJ1Y3QgcWNvbV9ycG1fcmVnICp2cmVnID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwljb25zdCBzdHJ1Y3QgcnBtX3JlZ19wYXJ0cyAqcGFydHMgPSB2cmVnLT5wYXJ0czsKKwljb25zdCBzdHJ1Y3QgcmVxdWVzdF9tZW1iZXIgKnJlcSA9ICZwYXJ0cy0+aWE7CisJaW50IGxvYWRfbUEgPSBsb2FkX3VBIC8gMTAwMDsKKwlpbnQgbWF4X21BID0gcmVxLT5tYXNrID4+IHJlcS0+c2hpZnQ7CisJaW50IHJldDsKKworCWlmIChyZXEtPm1hc2sgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobG9hZF9tQSA+IG1heF9tQSkKKwkJbG9hZF9tQSA9IG1heF9tQTsKKworCW11dGV4X2xvY2soJnZyZWctPmxvY2spOworCXJldCA9IHJwbV9yZWdfd3JpdGUodnJlZywgcmVxLCBsb2FkX21BKTsKKwltdXRleF91bmxvY2soJnZyZWctPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHVWX29wcyA9IHsKIAkubGlzdF92b2x0YWdlID0gcmVndWxhdG9yX2xpc3Rfdm9sdGFnZV9saW5lYXJfcmFuZ2UsCiAKQEAgLTQwMiw2ICs0MjQsOCBAQAogCS5lbmFibGUgPSBycG1fcmVnX3VWX2VuYWJsZSwKIAkuZGlzYWJsZSA9IHJwbV9yZWdfdVZfZGlzYWJsZSwKIAkuaXNfZW5hYmxlZCA9IHJwbV9yZWdfaXNfZW5hYmxlZCwKKworCS5zZXRfbG9hZCA9IHJwbV9yZWdfc2V0X2xvYWQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgbVZfb3BzID0gewpAQCAtNDEzLDYgKzQzNyw4IEBACiAJLmVuYWJsZSA9IHJwbV9yZWdfbVZfZW5hYmxlLAogCS5kaXNhYmxlID0gcnBtX3JlZ19tVl9kaXNhYmxlLAogCS5pc19lbmFibGVkID0gcnBtX3JlZ19pc19lbmFibGVkLAorCisJLnNldF9sb2FkID0gcnBtX3JlZ19zZXRfbG9hZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX29wcyBzd2l0Y2hfb3BzID0gewpAQCAtNTgxLDMxICs2MDcsNiBAQAogCS5zdXBwb3J0c19mb3JjZV9tb2RlX2J5cGFzcyA9IGZhbHNlLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcnBtX29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHJwbS1wbTgwNTgtcGxkbyIsICAgICAuZGF0YSA9ICZwbTgwNThfcGxkbyB9LAotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxycG0tcG04MDU4LW5sZG8iLCAgICAgLmRhdGEgPSAmcG04MDU4X25sZG8gfSwKLQl7IC5jb21wYXRpYmxlID0gInFjb20scnBtLXBtODA1OC1zbXBzIiwgICAgIC5kYXRhID0gJnBtODA1OF9zbXBzIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHJwbS1wbTgwNTgtbmNwIiwgICAgICAuZGF0YSA9ICZwbTgwNThfbmNwIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHJwbS1wbTgwNTgtc3dpdGNoIiwgICAuZGF0YSA9ICZwbTgwNThfc3dpdGNoIH0sCi0KLQl7IC5jb21wYXRpYmxlID0gInFjb20scnBtLXBtODkwMS1wbGRvIiwgICAgIC5kYXRhID0gJnBtODkwMV9wbGRvIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHJwbS1wbTg5MDEtbmxkbyIsICAgICAuZGF0YSA9ICZwbTg5MDFfbmxkbyB9LAotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxycG0tcG04OTAxLWZ0c21wcyIsICAgLmRhdGEgPSAmcG04OTAxX2Z0c21wcyB9LAotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxycG0tcG04OTAxLXN3aXRjaCIsICAgLmRhdGEgPSAmcG04OTAxX3N3aXRjaCB9LAotCi0JeyAuY29tcGF0aWJsZSA9ICJxY29tLHJwbS1wbTg5MjEtcGxkbyIsICAgICAuZGF0YSA9ICZwbTg5MjFfcGxkbyB9LAotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxycG0tcG04OTIxLW5sZG8iLCAgICAgLmRhdGEgPSAmcG04OTIxX25sZG8gfSwKLQl7IC5jb21wYXRpYmxlID0gInFjb20scnBtLXBtODkyMS1ubGRvMTIwMCIsIC5kYXRhID0gJnBtODkyMV9ubGRvMTIwMCB9LAotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxycG0tcG04OTIxLXNtcHMiLCAgICAgLmRhdGEgPSAmcG04OTIxX3NtcHMgfSwKLQl7IC5jb21wYXRpYmxlID0gInFjb20scnBtLXBtODkyMS1mdHNtcHMiLCAgIC5kYXRhID0gJnBtODkyMV9mdHNtcHMgfSwKLQl7IC5jb21wYXRpYmxlID0gInFjb20scnBtLXBtODkyMS1uY3AiLCAgICAgIC5kYXRhID0gJnBtODkyMV9uY3AgfSwKLQl7IC5jb21wYXRpYmxlID0gInFjb20scnBtLXBtODkyMS1zd2l0Y2giLCAgIC5kYXRhID0gJnBtODkyMV9zd2l0Y2ggfSwKLQotCXsgLmNvbXBhdGlibGUgPSAicWNvbSxycG0tc21iMjA4IiwgLmRhdGEgPSAmc21iMjA4X3NtcHMgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBycG1fb2ZfbWF0Y2gpOwotCiBzdGF0aWMgaW50IHJwbV9yZWdfc2V0KHN0cnVjdCBxY29tX3JwbV9yZWcgKnZyZWcsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9tZW1iZXIgKnJlcSwKIAkJICAgICAgIGNvbnN0IGludCB2YWx1ZSkKQEAgLTYxOSw3ICs2MjAsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJwbV9yZWdfb2ZfcGFyc2VfZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBxY29tX3JwbV9yZWcgKnZyZWcpCitzdGF0aWMgaW50IHJwbV9yZWdfb2ZfcGFyc2VfZnJlcShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCQkgc3RydWN0IHFjb21fcnBtX3JlZyAqdnJlZykKIHsKIAlzdGF0aWMgY29uc3QgaW50IGZyZXFfdGFibGVbXSA9IHsKIAkJMTkyMDAwMDAsIDk2MDAwMDAsIDY0MDAwMDAsIDQ4MDAwMDAsIDM4NDAwMDAsIDMyMDAwMDAsIDI3NDAwMDAsCkBAIC02MzMsNyArNjM2LDcgQEAKIAlpbnQgaTsKIAogCWtleSA9ICJxY29tLHN3aXRjaC1tb2RlLWZyZXF1ZW5jeSI7Ci0JcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCBrZXksICZmcmVxKTsKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCBrZXksICZmcmVxKTsKIAlpZiAocmV0KSB7CiAJCWRldl9lcnIoZGV2LCAicmVndWxhdG9yIHJlcXVpcmVzICVzIHByb3BlcnR5XG4iLCBrZXkpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTY1MCw4NCArNjUzLDQwIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgcnBtX3JlZ19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIGludCBycG1fcmVnX29mX3BhcnNlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgcmVndWxhdG9yX2Rlc2MgKmRlc2MsCisJCQkgICAgc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgKmNvbmZpZykKIHsKLQlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqaW5pdGRhdGE7Ci0JY29uc3Qgc3RydWN0IHFjb21fcnBtX3JlZyAqdGVtcGxhdGU7Ci0JY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwotCXN0cnVjdCBxY29tX3JwbV9yZWcgKnZyZWc7CisJc3RydWN0IHFjb21fcnBtX3JlZyAqdnJlZyA9IGNvbmZpZy0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGRldmljZSAqZGV2ID0gY29uZmlnLT5kZXY7CiAJY29uc3QgY2hhciAqa2V5OwogCXUzMiBmb3JjZV9tb2RlOwogCWJvb2wgcHdtOwogCXUzMiB2YWw7CiAJaW50IHJldDsKIAotCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKHJwbV9vZl9tYXRjaCwgJnBkZXYtPmRldik7Ci0JdGVtcGxhdGUgPSBtYXRjaC0+ZGF0YTsKLQotCXZyZWcgPSBkZXZtX2ttYWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp2cmVnKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF2cmVnKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBhbGxvY2F0ZSB2cmVnXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCW1lbWNweSh2cmVnLCB0ZW1wbGF0ZSwgc2l6ZW9mKCp2cmVnKSk7Ci0JbXV0ZXhfaW5pdCgmdnJlZy0+bG9jayk7Ci0JdnJlZy0+ZGV2ID0gJnBkZXYtPmRldjsKLQl2cmVnLT5kZXNjLmlkID0gLTE7Ci0JdnJlZy0+ZGVzYy5vd25lciA9IFRISVNfTU9EVUxFOwotCXZyZWctPmRlc2MudHlwZSA9IFJFR1VMQVRPUl9WT0xUQUdFOwotCXZyZWctPmRlc2MubmFtZSA9IHBkZXYtPmRldi5vZl9ub2RlLT5uYW1lOwotCXZyZWctPmRlc2Muc3VwcGx5X25hbWUgPSAidmluIjsKLQotCXZyZWctPnJwbSA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKLQlpZiAoIXZyZWctPnJwbSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gcmV0cmlldmUgaGFuZGxlIHRvIHJwbVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWluaXRkYXRhID0gb2ZfZ2V0X3JlZ3VsYXRvcl9pbml0X2RhdGEoJnBkZXYtPmRldiwgcGRldi0+ZGV2Lm9mX25vZGUsCi0JCQkJCSAgICAgICZ2cmVnLT5kZXNjKTsKLQlpZiAoIWluaXRkYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWtleSA9ICJyZWciOwotCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCBrZXksICZ2YWwpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgJXNcbiIsIGtleSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXZyZWctPnJlc291cmNlID0gdmFsOwotCi0JaWYgKCh2cmVnLT5wYXJ0cy0+dVYubWFzayB8fCB2cmVnLT5wYXJ0cy0+bVYubWFzaykgJiYKLQkgICAgKCFpbml0ZGF0YS0+Y29uc3RyYWludHMubWluX3VWIHx8ICFpbml0ZGF0YS0+Y29uc3RyYWludHMubWF4X3VWKSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJubyB2b2x0YWdlIHNwZWNpZmllZCBmb3IgcmVndWxhdG9yXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJa2V5ID0gImJpYXMtcHVsbC1kb3duIjsKLQlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLCBrZXkpKSB7CisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLCBrZXkpKSB7CiAJCXJldCA9IHJwbV9yZWdfc2V0KHZyZWcsICZ2cmVnLT5wYXJ0cy0+cGQsIDEpOwogCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcyBpcyBpbnZhbGlkIiwga2V5KTsKKwkJCWRldl9lcnIoZGV2LCAiJXMgaXMgaW52YWxpZCIsIGtleSk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQogCiAJaWYgKHZyZWctPnBhcnRzLT5mcmVxLm1hc2spIHsKLQkJcmV0ID0gcnBtX3JlZ19vZl9wYXJzZV9mcmVxKCZwZGV2LT5kZXYsIHZyZWcpOworCQlyZXQgPSBycG1fcmVnX29mX3BhcnNlX2ZyZXEoZGV2LCBub2RlLCB2cmVnKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmICh2cmVnLT5wYXJ0cy0+cG0ubWFzaykgewogCQlrZXkgPSAicWNvbSxwb3dlci1tb2RlLWh5c3RlcmV0aWMiOwotCQlwd20gPSAhb2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLCBrZXkpOworCQlwd20gPSAhb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsIGtleSk7CiAKIAkJcmV0ID0gcnBtX3JlZ19zZXQodnJlZywgJnZyZWctPnBhcnRzLT5wbSwgcHdtKTsKIAkJaWYgKHJldCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHNldCBwb3dlciBtb2RlXG4iKTsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHNldCBwb3dlciBtb2RlXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC03MzYsMTEgKzY5NSwxMSBAQAogCQlmb3JjZV9tb2RlID0gLTE7CiAKIAkJa2V5ID0gInFjb20sZm9yY2UtbW9kZSI7Ci0JCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCBrZXksICZ2YWwpOworCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCBrZXksICZ2YWwpOwogCQlpZiAocmV0ID09IC1FSU5WQUwpIHsKIAkJCXZhbCA9IFFDT01fUlBNX0ZPUkNFX01PREVfTk9ORTsKIAkJfSBlbHNlIGlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVhZCAlc1xuIiwga2V5KTsKKwkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlYWQgJXNcbiIsIGtleSk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAKQEAgLTc3NSwyNSArNzM0LDE5MiBAQAogCQl9CiAKIAkJaWYgKGZvcmNlX21vZGUgPT0gLTEpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgZm9yY2UgbW9kZVxuIik7CisJCQlkZXZfZXJyKGRldiwgImludmFsaWQgZm9yY2UgbW9kZVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCiAJCXJldCA9IHJwbV9yZWdfc2V0KHZyZWcsICZ2cmVnLT5wYXJ0cy0+Zm0sIGZvcmNlX21vZGUpOwogCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gc2V0IGZvcmNlIG1vZGVcbiIpOworCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2V0IGZvcmNlIG1vZGVcbiIpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCX0KIAotCWNvbmZpZy5kZXYgPSAmcGRldi0+ZGV2OwotCWNvbmZpZy5pbml0X2RhdGEgPSBpbml0ZGF0YTsKLQljb25maWcuZHJpdmVyX2RhdGEgPSB2cmVnOwotCWNvbmZpZy5vZl9ub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Ci0JcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZ2cmVnLT5kZXNjLCAmY29uZmlnKTsKLQlpZiAoSVNfRVJSKHJkZXYpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbid0IHJlZ2lzdGVyIHJlZ3VsYXRvclxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHJkZXYpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgcnBtX3JlZ3VsYXRvcl9kYXRhIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCByZXNvdXJjZTsKKwljb25zdCBzdHJ1Y3QgcWNvbV9ycG1fcmVnICp0ZW1wbGF0ZTsKKwljb25zdCBjaGFyICpzdXBwbHk7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJwbV9yZWd1bGF0b3JfZGF0YSBycG1fcG04MDU4X3JlZ3VsYXRvcnNbXSA9IHsKKwl7ICJsMCIsICAgUUNPTV9SUE1fUE04MDU4X0xETzAsICAgJnBtODA1OF9ubGRvLCAidmRkX2wwX2wxX2x2cyIJfSwKKwl7ICJsMSIsICAgUUNPTV9SUE1fUE04MDU4X0xETzEsICAgJnBtODA1OF9ubGRvLCAidmRkX2wwX2wxX2x2cyIgfSwKKwl7ICJsMiIsICAgUUNPTV9SUE1fUE04MDU4X0xETzIsICAgJnBtODA1OF9wbGRvLCAidmRkX2wyX2wxMV9sMTIiIH0sCisJeyAibDMiLCAgIFFDT01fUlBNX1BNODA1OF9MRE8zLCAgICZwbTgwNThfcGxkbywgInZkZF9sM19sNF9sNSIgfSwKKwl7ICJsNCIsICAgUUNPTV9SUE1fUE04MDU4X0xETzQsICAgJnBtODA1OF9wbGRvLCAidmRkX2wzX2w0X2w1IiB9LAorCXsgImw1IiwgICBRQ09NX1JQTV9QTTgwNThfTERPNSwgICAmcG04MDU4X3BsZG8sICJ2ZGRfbDNfbDRfbDUiIH0sCisJeyAibDYiLCAgIFFDT01fUlBNX1BNODA1OF9MRE82LCAgICZwbTgwNThfcGxkbywgInZkZF9sNl9sNyIgfSwKKwl7ICJsNyIsICAgUUNPTV9SUE1fUE04MDU4X0xETzcsICAgJnBtODA1OF9wbGRvLCAidmRkX2w2X2w3IiB9LAorCXsgImw4IiwgICBRQ09NX1JQTV9QTTgwNThfTERPOCwgICAmcG04MDU4X3BsZG8sICJ2ZGRfbDgiIH0sCisJeyAibDkiLCAgIFFDT01fUlBNX1BNODA1OF9MRE85LCAgICZwbTgwNThfcGxkbywgInZkZF9sOSIgfSwKKwl7ICJsMTAiLCAgUUNPTV9SUE1fUE04MDU4X0xETzEwLCAgJnBtODA1OF9wbGRvLCAidmRkX2wxMCIgfSwKKwl7ICJsMTEiLCAgUUNPTV9SUE1fUE04MDU4X0xETzExLCAgJnBtODA1OF9wbGRvLCAidmRkX2wyX2wxMV9sMTIiIH0sCisJeyAibDEyIiwgIFFDT01fUlBNX1BNODA1OF9MRE8xMiwgICZwbTgwNThfcGxkbywgInZkZF9sMl9sMTFfbDEyIiB9LAorCXsgImwxMyIsICBRQ09NX1JQTV9QTTgwNThfTERPMTMsICAmcG04MDU4X3BsZG8sICJ2ZGRfbDEzX2wxNiIgfSwKKwl7ICJsMTQiLCAgUUNPTV9SUE1fUE04MDU4X0xETzE0LCAgJnBtODA1OF9wbGRvLCAidmRkX2wxNF9sMTUiIH0sCisJeyAibDE1IiwgIFFDT01fUlBNX1BNODA1OF9MRE8xNSwgICZwbTgwNThfcGxkbywgInZkZF9sMTRfbDE1IiB9LAorCXsgImwxNiIsICBRQ09NX1JQTV9QTTgwNThfTERPMTYsICAmcG04MDU4X3BsZG8sICJ2ZGRfbDEzX2wxNiIgfSwKKwl7ICJsMTciLCAgUUNPTV9SUE1fUE04MDU4X0xETzE3LCAgJnBtODA1OF9wbGRvLCAidmRkX2wxN19sMTgiIH0sCisJeyAibDE4IiwgIFFDT01fUlBNX1BNODA1OF9MRE8xOCwgICZwbTgwNThfcGxkbywgInZkZF9sMTdfbDE4IiB9LAorCXsgImwxOSIsICBRQ09NX1JQTV9QTTgwNThfTERPMTksICAmcG04MDU4X3BsZG8sICJ2ZGRfbDE5X2wyMCIgfSwKKwl7ICJsMjAiLCAgUUNPTV9SUE1fUE04MDU4X0xETzIwLCAgJnBtODA1OF9wbGRvLCAidmRkX2wxOV9sMjAiIH0sCisJeyAibDIxIiwgIFFDT01fUlBNX1BNODA1OF9MRE8yMSwgICZwbTgwNThfbmxkbywgInZkZF9sMjEiIH0sCisJeyAibDIyIiwgIFFDT01fUlBNX1BNODA1OF9MRE8yMiwgICZwbTgwNThfbmxkbywgInZkZF9sMjIiIH0sCisJeyAibDIzIiwgIFFDT01fUlBNX1BNODA1OF9MRE8yMywgICZwbTgwNThfbmxkbywgInZkZF9sMjNfbDI0X2wyNSIgfSwKKwl7ICJsMjQiLCAgUUNPTV9SUE1fUE04MDU4X0xETzI0LCAgJnBtODA1OF9ubGRvLCAidmRkX2wyM19sMjRfbDI1IiB9LAorCXsgImwyNSIsICBRQ09NX1JQTV9QTTgwNThfTERPMjUsICAmcG04MDU4X25sZG8sICJ2ZGRfbDIzX2wyNF9sMjUiIH0sCisKKwl7ICJzMCIsICAgUUNPTV9SUE1fUE04MDU4X1NNUFMwLCAgJnBtODA1OF9zbXBzLCAidmRkX3MwIiB9LAorCXsgInMxIiwgICBRQ09NX1JQTV9QTTgwNThfU01QUzEsICAmcG04MDU4X3NtcHMsICJ2ZGRfczEiIH0sCisJeyAiczIiLCAgIFFDT01fUlBNX1BNODA1OF9TTVBTMiwgICZwbTgwNThfc21wcywgInZkZF9zMiIgfSwKKwl7ICJzMyIsICAgUUNPTV9SUE1fUE04MDU4X1NNUFMzLCAgJnBtODA1OF9zbXBzLCAidmRkX3MzIiB9LAorCXsgInM0IiwgICBRQ09NX1JQTV9QTTgwNThfU01QUzQsICAmcG04MDU4X3NtcHMsICJ2ZGRfczQiIH0sCisKKwl7ICJsdnMwIiwgUUNPTV9SUE1fUE04MDU4X0xWUzAsICZwbTgwNThfc3dpdGNoLCAidmRkX2wwX2wxX2x2cyIgfSwKKwl7ICJsdnMxIiwgUUNPTV9SUE1fUE04MDU4X0xWUzEsICZwbTgwNThfc3dpdGNoLCAidmRkX2wwX2wxX2x2cyIgfSwKKworCXsgIm5jcCIsICBRQ09NX1JQTV9QTTgwNThfTkNQLCAmcG04MDU4X25jcCwgInZkZF9uY3AiIH0sCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJwbV9yZWd1bGF0b3JfZGF0YSBycG1fcG04OTAxX3JlZ3VsYXRvcnNbXSA9IHsKKwl7ICJsMCIsICAgUUNPTV9SUE1fUE04OTAxX0xETzAsICZwbTg5MDFfbmxkbywgInZkZF9sMCIgfSwKKwl7ICJsMSIsICAgUUNPTV9SUE1fUE04OTAxX0xETzEsICZwbTg5MDFfcGxkbywgInZkZF9sMSIgfSwKKwl7ICJsMiIsICAgUUNPTV9SUE1fUE04OTAxX0xETzIsICZwbTg5MDFfcGxkbywgInZkZF9sMiIgfSwKKwl7ICJsMyIsICAgUUNPTV9SUE1fUE04OTAxX0xETzMsICZwbTg5MDFfcGxkbywgInZkZF9sMyIgfSwKKwl7ICJsNCIsICAgUUNPTV9SUE1fUE04OTAxX0xETzQsICZwbTg5MDFfcGxkbywgInZkZF9sNCIgfSwKKwl7ICJsNSIsICAgUUNPTV9SUE1fUE04OTAxX0xETzUsICZwbTg5MDFfcGxkbywgInZkZF9sNSIgfSwKKwl7ICJsNiIsICAgUUNPTV9SUE1fUE04OTAxX0xETzYsICZwbTg5MDFfcGxkbywgInZkZF9sNiIgfSwKKworCXsgInMwIiwgICBRQ09NX1JQTV9QTTg5MDFfU01QUzAsICZwbTg5MDFfZnRzbXBzLCAidmRkX3MwIiB9LAorCXsgInMxIiwgICBRQ09NX1JQTV9QTTg5MDFfU01QUzEsICZwbTg5MDFfZnRzbXBzLCAidmRkX3MxIiB9LAorCXsgInMyIiwgICBRQ09NX1JQTV9QTTg5MDFfU01QUzIsICZwbTg5MDFfZnRzbXBzLCAidmRkX3MyIiB9LAorCXsgInMzIiwgICBRQ09NX1JQTV9QTTg5MDFfU01QUzMsICZwbTg5MDFfZnRzbXBzLCAidmRkX3MzIiB9LAorCXsgInM0IiwgICBRQ09NX1JQTV9QTTg5MDFfU01QUzQsICZwbTg5MDFfZnRzbXBzLCAidmRkX3M0IiB9LAorCisJeyAibHZzMCIsIFFDT01fUlBNX1BNODkwMV9MVlMwLCAmcG04OTAxX3N3aXRjaCwgImx2czBfaW4iIH0sCisJeyAibHZzMSIsIFFDT01fUlBNX1BNODkwMV9MVlMxLCAmcG04OTAxX3N3aXRjaCwgImx2czFfaW4iIH0sCisJeyAibHZzMiIsIFFDT01fUlBNX1BNODkwMV9MVlMyLCAmcG04OTAxX3N3aXRjaCwgImx2czJfaW4iIH0sCisJeyAibHZzMyIsIFFDT01fUlBNX1BNODkwMV9MVlMzLCAmcG04OTAxX3N3aXRjaCwgImx2czNfaW4iIH0sCisKKwl7ICJtdnMiLCBRQ09NX1JQTV9QTTg5MDFfTVZTLCAmcG04OTAxX3N3aXRjaCwgIm12c19pbiIgfSwKKwl7IH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnBtX3JlZ3VsYXRvcl9kYXRhIHJwbV9wbTg5MjFfcmVndWxhdG9yc1tdID0geworCXsgInMxIiwgIFFDT01fUlBNX1BNODkyMV9TTVBTMSwgJnBtODkyMV9zbXBzLCAidmRkX3MxIiB9LAorCXsgInMyIiwgIFFDT01fUlBNX1BNODkyMV9TTVBTMiwgJnBtODkyMV9zbXBzLCAidmRkX3MyIiB9LAorCXsgInMzIiwgIFFDT01fUlBNX1BNODkyMV9TTVBTMywgJnBtODkyMV9zbXBzIH0sCisJeyAiczQiLCAgUUNPTV9SUE1fUE04OTIxX1NNUFM0LCAmcG04OTIxX3NtcHMsICJ2ZGRfczQiIH0sCisJeyAiczciLCAgUUNPTV9SUE1fUE04OTIxX1NNUFM3LCAmcG04OTIxX3NtcHMsICJ2ZGRfczciIH0sCisJeyAiczgiLCAgUUNPTV9SUE1fUE04OTIxX1NNUFM4LCAmcG04OTIxX3NtcHMsICJ2ZGRfczgiICB9LAorCisJeyAibDEiLCAgUUNPTV9SUE1fUE04OTIxX0xETzEsICZwbTg5MjFfbmxkbywgInZkZF9sMV9sMl9sMTJfbDE4IiB9LAorCXsgImwyIiwgIFFDT01fUlBNX1BNODkyMV9MRE8yLCAmcG04OTIxX25sZG8sICJ2ZGRfbDFfbDJfbDEyX2wxOCIgfSwKKwl7ICJsMyIsICBRQ09NX1JQTV9QTTg5MjFfTERPMywgJnBtODkyMV9wbGRvLCAidmRkX2wzX2wxNV9sMTciIH0sCisJeyAibDQiLCAgUUNPTV9SUE1fUE04OTIxX0xETzQsICZwbTg5MjFfcGxkbywgInZkZF9sNF9sMTQiIH0sCisJeyAibDUiLCAgUUNPTV9SUE1fUE04OTIxX0xETzUsICZwbTg5MjFfcGxkbywgInZkZF9sNV9sOF9sMTYiIH0sCisJeyAibDYiLCAgUUNPTV9SUE1fUE04OTIxX0xETzYsICZwbTg5MjFfcGxkbywgInZkZF9sNl9sNyIgfSwKKwl7ICJsNyIsICBRQ09NX1JQTV9QTTg5MjFfTERPNywgJnBtODkyMV9wbGRvLCAidmRkX2w2X2w3IiB9LAorCXsgImw4IiwgIFFDT01fUlBNX1BNODkyMV9MRE84LCAmcG04OTIxX3BsZG8sICJ2ZGRfbDVfbDhfbDE2IiB9LAorCXsgImw5IiwgIFFDT01fUlBNX1BNODkyMV9MRE85LCAmcG04OTIxX3BsZG8sICJ2ZGRfbDlfbDExIiB9LAorCXsgImwxMCIsIFFDT01fUlBNX1BNODkyMV9MRE8xMCwgJnBtODkyMV9wbGRvLCAidmRkX2wxMF9sMjIiIH0sCisJeyAibDExIiwgUUNPTV9SUE1fUE04OTIxX0xETzExLCAmcG04OTIxX3BsZG8sICJ2ZGRfbDlfbDExIiB9LAorCXsgImwxMiIsIFFDT01fUlBNX1BNODkyMV9MRE8xMiwgJnBtODkyMV9ubGRvLCAidmRkX2wxX2wyX2wxMl9sMTgiIH0sCisJeyAibDE0IiwgUUNPTV9SUE1fUE04OTIxX0xETzE0LCAmcG04OTIxX3BsZG8sICJ2ZGRfbDRfbDE0IiB9LAorCXsgImwxNSIsIFFDT01fUlBNX1BNODkyMV9MRE8xNSwgJnBtODkyMV9wbGRvLCAidmRkX2wzX2wxNV9sMTciIH0sCisJeyAibDE2IiwgUUNPTV9SUE1fUE04OTIxX0xETzE2LCAmcG04OTIxX3BsZG8sICJ2ZGRfbDVfbDhfbDE2IiB9LAorCXsgImwxNyIsIFFDT01fUlBNX1BNODkyMV9MRE8xNywgJnBtODkyMV9wbGRvLCAidmRkX2wzX2wxNV9sMTciIH0sCisJeyAibDE4IiwgUUNPTV9SUE1fUE04OTIxX0xETzE4LCAmcG04OTIxX25sZG8sICJ2ZGRfbDFfbDJfbDEyX2wxOCIgfSwKKwl7ICJsMjEiLCBRQ09NX1JQTV9QTTg5MjFfTERPMjEsICZwbTg5MjFfcGxkbywgInZkZF9sMjFfbDIzX2wyOSIgfSwKKwl7ICJsMjIiLCBRQ09NX1JQTV9QTTg5MjFfTERPMjIsICZwbTg5MjFfcGxkbywgInZkZF9sMTBfbDIyIiB9LAorCXsgImwyMyIsIFFDT01fUlBNX1BNODkyMV9MRE8yMywgJnBtODkyMV9wbGRvLCAidmRkX2wyMV9sMjNfbDI5IiB9LAorCXsgImwyNCIsIFFDT01fUlBNX1BNODkyMV9MRE8yNCwgJnBtODkyMV9ubGRvMTIwMCwgInZkZF9sMjQiIH0sCisJeyAibDI1IiwgUUNPTV9SUE1fUE04OTIxX0xETzI1LCAmcG04OTIxX25sZG8xMjAwLCAidmRkX2wyNSIgfSwKKwl7ICJsMjYiLCBRQ09NX1JQTV9QTTg5MjFfTERPMjYsICZwbTg5MjFfbmxkbzEyMDAsICJ2ZGRfbDI2IiB9LAorCXsgImwyNyIsIFFDT01fUlBNX1BNODkyMV9MRE8yNywgJnBtODkyMV9ubGRvMTIwMCwgInZkZF9sMjciIH0sCisJeyAibDI4IiwgUUNPTV9SUE1fUE04OTIxX0xETzI4LCAmcG04OTIxX25sZG8xMjAwLCAidmRkX2wyOCIgfSwKKwl7ICJsMjkiLCBRQ09NX1JQTV9QTTg5MjFfTERPMjksICZwbTg5MjFfcGxkbywgInZkZF9sMjFfbDIzX2wyOSIgfSwKKworCXsgImx2czEiLCBRQ09NX1JQTV9QTTg5MjFfTFZTMSwgJnBtODkyMV9zd2l0Y2gsICJ2aW5fbHZzMV8zXzYiIH0sCisJeyAibHZzMiIsIFFDT01fUlBNX1BNODkyMV9MVlMyLCAmcG04OTIxX3N3aXRjaCwgInZpbl9sdnMyIiB9LAorCXsgImx2czMiLCBRQ09NX1JQTV9QTTg5MjFfTFZTMywgJnBtODkyMV9zd2l0Y2gsICJ2aW5fbHZzMV8zXzYiIH0sCisJeyAibHZzNCIsIFFDT01fUlBNX1BNODkyMV9MVlM0LCAmcG04OTIxX3N3aXRjaCwgInZpbl9sdnM0XzVfNyIgfSwKKwl7ICJsdnM1IiwgUUNPTV9SUE1fUE04OTIxX0xWUzUsICZwbTg5MjFfc3dpdGNoLCAidmluX2x2czRfNV83IiB9LAorCXsgImx2czYiLCBRQ09NX1JQTV9QTTg5MjFfTFZTNiwgJnBtODkyMV9zd2l0Y2gsICJ2aW5fbHZzMV8zXzYiIH0sCisJeyAibHZzNyIsIFFDT01fUlBNX1BNODkyMV9MVlM3LCAmcG04OTIxX3N3aXRjaCwgInZpbl9sdnM0XzVfNyIgfSwKKworCXsgInVzYi1zd2l0Y2giLCBRQ09NX1JQTV9VU0JfT1RHX1NXSVRDSCwgJnBtODkyMV9zd2l0Y2gsICJ2aW5fNXZzIiB9LAorCXsgImhkbWktc3dpdGNoIiwgUUNPTV9SUE1fSERNSV9TV0lUQ0gsICZwbTg5MjFfc3dpdGNoLCAidmluXzV2cyIgfSwKKwl7ICJuY3AiLCBRQ09NX1JQTV9QTTg5MjFfTkNQLCAmcG04OTIxX25jcCwgInZkZF9uY3AiIH0sCisJeyB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBycG1fb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInFjb20scnBtLXBtODA1OC1yZWd1bGF0b3JzIiwgLmRhdGEgPSAmcnBtX3BtODA1OF9yZWd1bGF0b3JzIH0sCisJeyAuY29tcGF0aWJsZSA9ICJxY29tLHJwbS1wbTg5MDEtcmVndWxhdG9ycyIsIC5kYXRhID0gJnJwbV9wbTg5MDFfcmVndWxhdG9ycyB9LAorCXsgLmNvbXBhdGlibGUgPSAicWNvbSxycG0tcG04OTIxLXJlZ3VsYXRvcnMiLCAuZGF0YSA9ICZycG1fcG04OTIxX3JlZ3VsYXRvcnMgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBycG1fb2ZfbWF0Y2gpOworCitzdGF0aWMgaW50IHJwbV9yZWdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3QgcnBtX3JlZ3VsYXRvcl9kYXRhICpyZWc7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OworCXN0cnVjdCBxY29tX3JwbV9yZWcgKnZyZWc7CisJc3RydWN0IHFjb21fcnBtICpycG07CisKKwlycG0gPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJaWYgKCFycG0pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHJldHJpZXZlIGhhbmRsZSB0byBycG1cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltYXRjaCA9IG9mX21hdGNoX2RldmljZShycG1fb2ZfbWF0Y2gsICZwZGV2LT5kZXYpOworCWZvciAocmVnID0gbWF0Y2gtPmRhdGE7IHJlZy0+bmFtZTsgcmVnKyspIHsKKwkJdnJlZyA9IGRldm1fa21hbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnZyZWcpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF2cmVnKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtY3B5KHZyZWcsIHJlZy0+dGVtcGxhdGUsIHNpemVvZigqdnJlZykpOworCQltdXRleF9pbml0KCZ2cmVnLT5sb2NrKTsKKworCQl2cmVnLT5kZXYgPSAmcGRldi0+ZGV2OworCQl2cmVnLT5yZXNvdXJjZSA9IHJlZy0+cmVzb3VyY2U7CisJCXZyZWctPnJwbSA9IHJwbTsKKworCQl2cmVnLT5kZXNjLmlkID0gLTE7CisJCXZyZWctPmRlc2Mub3duZXIgPSBUSElTX01PRFVMRTsKKwkJdnJlZy0+ZGVzYy50eXBlID0gUkVHVUxBVE9SX1ZPTFRBR0U7CisJCXZyZWctPmRlc2MubmFtZSA9IHJlZy0+bmFtZTsKKwkJdnJlZy0+ZGVzYy5zdXBwbHlfbmFtZSA9IHJlZy0+c3VwcGx5OworCQl2cmVnLT5kZXNjLm9mX21hdGNoID0gcmVnLT5uYW1lOworCQl2cmVnLT5kZXNjLm9mX3BhcnNlX2NiID0gcnBtX3JlZ19vZl9wYXJzZTsKKworCQljb25maWcuZGV2ID0gJnBkZXYtPmRldjsKKwkJY29uZmlnLmRyaXZlcl9kYXRhID0gdnJlZzsKKwkJcmRldiA9IGRldm1fcmVndWxhdG9yX3JlZ2lzdGVyKCZwZGV2LT5kZXYsICZ2cmVnLT5kZXNjLCAmY29uZmlnKTsKKwkJaWYgKElTX0VSUihyZGV2KSkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyICVzXG4iLCByZWctPm5hbWUpOworCQkJcmV0dXJuIFBUUl9FUlIocmRldik7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3N0dzQ4MXgtdm1tYy5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivc3R3NDgxeC12bW1jLmMKaW5kZXggODkwMjVmNS4uN2QyYWUzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivc3R3NDgxeC12bW1jLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivc3R3NDgxeC12bW1jLmMKQEAgLTU2LDYgKzU2LDcgQEAKIHsKIAlzdHJ1Y3Qgc3R3NDgxeCAqc3R3NDgxeCA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IHJlZ3VsYXRvcl9jb25maWcgY29uZmlnID0geyB9OworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2OwogCWludCByZXQ7CiAKIAkvKiBGaXJzdCBkaXNhYmxlIHRoZSBleHRlcm5hbCBWTU1DIGlmIGl0J3MgYWN0aXZlICovCkBAIC03NSwxMiArNzYsMTEgQEAKIAkJCQkJCSAgICAgIHBkZXYtPmRldi5vZl9ub2RlLAogCQkJCQkJICAgICAgJnZtbWNfcmVndWxhdG9yKTsKIAotCXN0dzQ4MXgtPnZtbWNfcmVndWxhdG9yID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwKLQkJCQkJCSZ2bW1jX3JlZ3VsYXRvciwgJmNvbmZpZyk7Ci0JaWYgKElTX0VSUihzdHc0ODF4LT52bW1jX3JlZ3VsYXRvcikpIHsKKwlyZGV2ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJnZtbWNfcmVndWxhdG9yLCAmY29uZmlnKTsKKwlpZiAoSVNfRVJSKHJkZXYpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwKIAkJCSJlcnJvciBpbml0aWFsaXppbmcgU1R3NDgxeCBWTU1DIHJlZ3VsYXRvclxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHN0dzQ4MXgtPnZtbWNfcmVndWxhdG9yKTsKKwkJcmV0dXJuIFBUUl9FUlIocmRldik7CiAJfQogCiAJZGV2X2luZm8oJnBkZXYtPmRldiwgImluaXRpYWxpemVkIFNUdzQ4MXggVk1NQyByZWd1bGF0b3JcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU5MTAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYwppbmRleCBlMmNmZmUwLi5mYjk5MWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzUwLXJlZ3VsYXRvci5jCmluZGV4IDdlYzdjMzkuLjk1ZjZiMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODM1MC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzNTAtcmVndWxhdG9yLmMKQEAgLTExNTEsMTcgKzExNTEsMTYgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBwbWljX3V2X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKWRhdGE7Ci0Jc3RydWN0IHdtODM1MCAqd204MzUwID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKIAogCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKIAlpZiAoaXJxID09IFdNODM1MF9JUlFfQ1MxIHx8IGlycSA9PSBXTTgzNTBfSVJRX0NTMikKIAkJcmVndWxhdG9yX25vdGlmaWVyX2NhbGxfY2hhaW4ocmRldiwKIAkJCQkJICAgICAgUkVHVUxBVE9SX0VWRU5UX1JFR1VMQVRJT05fT1VULAotCQkJCQkgICAgICB3bTgzNTApOworCQkJCQkgICAgICBOVUxMKTsKIAllbHNlCiAJCXJlZ3VsYXRvcl9ub3RpZmllcl9jYWxsX2NoYWluKHJkZXYsCiAJCQkJCSAgICAgIFJFR1VMQVRPUl9FVkVOVF9VTkRFUl9WT0xUQUdFLAotCQkJCQkgICAgICB3bTgzNTApOworCQkJCQkgICAgICBOVUxMKTsKIAltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnBtc2cvdmlydGlvX3JwbXNnX2J1cy5jIGIvZHJpdmVycy9ycG1zZy92aXJ0aW9fcnBtc2dfYnVzLmMKaW5kZXggOTJmNmFmNi4uNzMzNTRlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ycG1zZy92aXJ0aW9fcnBtc2dfYnVzLmMKKysrIGIvZHJpdmVycy9ycG1zZy92aXJ0aW9fcnBtc2dfYnVzLmMKQEAgLTk1MSw2ICs5NTEsNyBAQAogCXZvaWQgKmJ1ZnNfdmE7CiAJaW50IGVyciA9IDAsIGk7CiAJc2l6ZV90IHRvdGFsX2J1Zl9zcGFjZTsKKwlib29sIG5vdGlmeTsKIAogCXZycCA9IGt6YWxsb2Moc2l6ZW9mKCp2cnApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXZycCkKQEAgLTEwMzAsOCArMTAzMSwyMiBAQAogCQl9CiAJfQogCisJLyoKKwkgKiBQcmVwYXJlIHRvIGtpY2sgYnV0IGRvbid0IG5vdGlmeSB5ZXQgLSB3ZSBjYW4ndCBkbyB0aGlzIGJlZm9yZQorCSAqIGRldmljZSBpcyByZWFkeS4KKwkgKi8KKwlub3RpZnkgPSB2aXJ0cXVldWVfa2lja19wcmVwYXJlKHZycC0+cnZxKTsKKworCS8qIEZyb20gdGhpcyBwb2ludCBvbiwgd2UgY2FuIG5vdGlmeSBhbmQgZ2V0IGNhbGxiYWNrcy4gKi8KKwl2aXJ0aW9fZGV2aWNlX3JlYWR5KHZkZXYpOworCiAJLyogdGVsbCB0aGUgcmVtb3RlIHByb2Nlc3NvciBpdCBjYW4gc3RhcnQgc2VuZGluZyBtZXNzYWdlcyAqLwotCXZpcnRxdWV1ZV9raWNrKHZycC0+cnZxKTsKKwkvKgorCSAqIHRoaXMgbWlnaHQgYmUgY29uY3VycmVudCB3aXRoIGNhbGxiYWNrcywgYnV0IHdlIGFyZSBvbmx5CisJICogZG9pbmcgbm90aWZ5LCBub3QgYSBmdWxsIGtpY2sgaGVyZSwgc28gdGhhdCdzIG9rLgorCSAqLworCWlmIChub3RpZnkpCisJCXZpcnRxdWV1ZV9ub3RpZnkodnJwLT5ydnEpOwogCiAJZGV2X2luZm8oJnZkZXYtPmRldiwgInJwbXNnIGhvc3QgaXMgb25saW5lXG4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvY2xhc3MuYyBiL2RyaXZlcnMvcnRjL2NsYXNzLmMKaW5kZXggNDcyYTVhZC4uYzI5YmE3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvY2xhc3MuYworKysgYi9kcml2ZXJzL3J0Yy9jbGFzcy5jCkBAIC01NSw3ICs1NSw3IEBACiAJc3RydWN0IHRpbWVzcGVjNjQJZGVsdGEsIGRlbHRhX2RlbHRhOwogCWludCBlcnI7CiAKLQlpZiAoaGFzX3BlcnNpc3RlbnRfY2xvY2soKSkKKwlpZiAodGltZWtlZXBpbmdfcnRjX3NraXBzdXNwZW5kKCkpCiAJCXJldHVybiAwOwogCiAJaWYgKHN0cmNtcChkZXZfbmFtZSgmcnRjLT5kZXYpLCBDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFKSAhPSAwKQpAQCAtMTAyLDcgKzEwMiw3IEBACiAJc3RydWN0IHRpbWVzcGVjNjQJc2xlZXBfdGltZTsKIAlpbnQgZXJyOwogCi0JaWYgKGhhc19wZXJzaXN0ZW50X2Nsb2NrKCkpCisJaWYgKHRpbWVrZWVwaW5nX3J0Y19za2lwcmVzdW1lKCkpCiAJCXJldHVybiAwOwogCiAJcnRjX2hjdG9zeXNfcmV0ID0gLUVOT0RFVjsKQEAgLTExNywxMCArMTE3LDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHJ0Y192YWxpZF90bSgmdG0pICE9IDApIHsKLQkJcHJfZGVidWcoIiVzOiAgYm9ndXMgcmVzdW1lIHRpbWVcbiIsIGRldl9uYW1lKCZydGMtPmRldikpOwotCQlyZXR1cm4gMDsKLQl9CiAJbmV3X3J0Yy50dl9zZWMgPSBydGNfdG1fdG9fdGltZTY0KCZ0bSk7CiAJbmV3X3J0Yy50dl9uc2VjID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvaW50ZXJmYWNlLmMgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwppbmRleCAzNzIxNWNmLi5kNDNlZTQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3J0Yy9pbnRlcmZhY2UuYwpAQCAtNzIsNyArNzIsMTEgQEAKIAkJZXJyID0gLUVOT0RFVjsKIAllbHNlIGlmIChydGMtPm9wcy0+c2V0X3RpbWUpCiAJCWVyciA9IHJ0Yy0+b3BzLT5zZXRfdGltZShydGMtPmRldi5wYXJlbnQsIHRtKTsKLQllbHNlIGlmIChydGMtPm9wcy0+c2V0X21tc3MpIHsKKwllbHNlIGlmIChydGMtPm9wcy0+c2V0X21tc3M2NCkgeworCQl0aW1lNjRfdCBzZWNzNjQgPSBydGNfdG1fdG9fdGltZTY0KHRtKTsKKworCQllcnIgPSBydGMtPm9wcy0+c2V0X21tc3M2NChydGMtPmRldi5wYXJlbnQsIHNlY3M2NCk7CisJfSBlbHNlIGlmIChydGMtPm9wcy0+c2V0X21tc3MpIHsKIAkJdGltZTY0X3Qgc2VjczY0ID0gcnRjX3RtX3RvX3RpbWU2NCh0bSk7CiAJCWVyciA9IHJ0Yy0+b3BzLT5zZXRfbW1zcyhydGMtPmRldi5wYXJlbnQsIHNlY3M2NCk7CiAJfSBlbHNlCkBAIC05Niw2ICsxMDAsOCBAQAogCiAJaWYgKCFydGMtPm9wcykKIAkJZXJyID0gLUVOT0RFVjsKKwllbHNlIGlmIChydGMtPm9wcy0+c2V0X21tc3M2NCkKKwkJZXJyID0gcnRjLT5vcHMtPnNldF9tbXNzNjQocnRjLT5kZXYucGFyZW50LCBzZWNzKTsKIAllbHNlIGlmIChydGMtPm9wcy0+c2V0X21tc3MpCiAJCWVyciA9IHJ0Yy0+b3BzLT5zZXRfbW1zcyhydGMtPmRldi5wYXJlbnQsIHNlY3MpOwogCWVsc2UgaWYgKHJ0Yy0+b3BzLT5yZWFkX3RpbWUgJiYgcnRjLT5vcHMtPnNldF90aW1lKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtYWIzMTAwLmMgYi9kcml2ZXJzL3J0Yy9ydGMtYWIzMTAwLmMKaW5kZXggMWQwMzQwZi4uOWI3MjVjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWFiMzEwMC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1hYjMxMDAuYwpAQCAtNDMsMjEgKzQzLDIxIEBACiAvKgogICogUlRDIGNsb2NrIGZ1bmN0aW9ucyBhbmQgZGV2aWNlIHN0cnVjdCBkZWNsYXJhdGlvbgogICovCi1zdGF0aWMgaW50IGFiMzEwMF9ydGNfc2V0X21tc3Moc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHNlY3MpCitzdGF0aWMgaW50IGFiMzEwMF9ydGNfc2V0X21tc3Moc3RydWN0IGRldmljZSAqZGV2LCB0aW1lNjRfdCBzZWNzKQogewogCXU4IHJlZ3NbXSA9IHtBQjMxMDBfVEkwLCBBQjMxMDBfVEkxLCBBQjMxMDBfVEkyLAogCQkgICAgIEFCMzEwMF9USTMsIEFCMzEwMF9USTQsIEFCMzEwMF9USTV9OwogCXVuc2lnbmVkIGNoYXIgYnVmWzZdOwotCXU2NCBmYXRfdGltZSA9ICh1NjQpIHNlY3MgKiBBQjMxMDBfUlRDX0NMT0NLX1JBVEUgKiAyOworCXU2NCBod19jb3VudGVyID0gc2VjcyAqIEFCMzEwMF9SVENfQ0xPQ0tfUkFURSAqIDI7CiAJaW50IGVyciA9IDA7CiAJaW50IGk7CiAKLQlidWZbMF0gPSAoZmF0X3RpbWUpICYgMHhGRjsKLQlidWZbMV0gPSAoZmF0X3RpbWUgPj4gOCkgJiAweEZGOwotCWJ1ZlsyXSA9IChmYXRfdGltZSA+PiAxNikgJiAweEZGOwotCWJ1ZlszXSA9IChmYXRfdGltZSA+PiAyNCkgJiAweEZGOwotCWJ1Zls0XSA9IChmYXRfdGltZSA+PiAzMikgJiAweEZGOwotCWJ1Zls1XSA9IChmYXRfdGltZSA+PiA0MCkgJiAweEZGOworCWJ1ZlswXSA9IChod19jb3VudGVyKSAmIDB4RkY7CisJYnVmWzFdID0gKGh3X2NvdW50ZXIgPj4gOCkgJiAweEZGOworCWJ1ZlsyXSA9IChod19jb3VudGVyID4+IDE2KSAmIDB4RkY7CisJYnVmWzNdID0gKGh3X2NvdW50ZXIgPj4gMjQpICYgMHhGRjsKKwlidWZbNF0gPSAoaHdfY291bnRlciA+PiAzMikgJiAweEZGOworCWJ1Zls1XSA9IChod19jb3VudGVyID4+IDQwKSAmIDB4RkY7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAJCWVyciA9IGFieDUwMF9zZXRfcmVnaXN0ZXJfaW50ZXJydXB0aWJsZShkZXYsIDAsCkBAIC03NSw3ICs3NSw3IEBACiAKIHN0YXRpYyBpbnQgYWIzMTAwX3J0Y19yZWFkX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKnRtKQogewotCXVuc2lnbmVkIGxvbmcgdGltZTsKKwl0aW1lNjRfdCB0aW1lOwogCXU4IHJ0Y3ZhbDsKIAlpbnQgZXJyOwogCkBAIC04OCw3ICs4OCw3IEBACiAJCWRldl9pbmZvKGRldiwgImNsb2NrIG5vdCBzZXQgKGxvc3QgcG93ZXIpIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0gZWxzZSB7Ci0JCXU2NCBmYXRfdGltZTsKKwkJdTY0IGh3X2NvdW50ZXI7CiAJCXU4IGJ1Zls2XTsKIAogCQkvKiBSZWFkIG91dCB0aW1lIHJlZ2lzdGVycyAqLwpAQCAtOTgsMjIgKzk4LDIxIEBACiAJCWlmIChlcnIgIT0gMCkKIAkJCXJldHVybiBlcnI7CiAKLQkJZmF0X3RpbWUgPSAoKHU2NCkgYnVmWzVdIDw8IDQwKSB8ICgodTY0KSBidWZbNF0gPDwgMzIpIHwKKwkJaHdfY291bnRlciA9ICgodTY0KSBidWZbNV0gPDwgNDApIHwgKCh1NjQpIGJ1Zls0XSA8PCAzMikgfAogCQkJKCh1NjQpIGJ1ZlszXSA8PCAyNCkgfCAoKHU2NCkgYnVmWzJdIDw8IDE2KSB8CiAJCQkoKHU2NCkgYnVmWzFdIDw8IDgpIHwgKHU2NCkgYnVmWzBdOwotCQl0aW1lID0gKHVuc2lnbmVkIGxvbmcpIChmYXRfdGltZSAvCi0JCQkJCSh1NjQpIChBQjMxMDBfUlRDX0NMT0NLX1JBVEUgKiAyKSk7CisJCXRpbWUgPSBod19jb3VudGVyIC8gKHU2NCkgKEFCMzEwMF9SVENfQ0xPQ0tfUkFURSAqIDIpOwogCX0KIAotCXJ0Y190aW1lX3RvX3RtKHRpbWUsIHRtKTsKKwlydGNfdGltZTY0X3RvX3RtKHRpbWUsIHRtKTsKIAogCXJldHVybiBydGNfdmFsaWRfdG0odG0pOwogfQogCiBzdGF0aWMgaW50IGFiMzEwMF9ydGNfcmVhZF9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbGFybSkKIHsKLQl1bnNpZ25lZCBsb25nIHRpbWU7Ci0JdTY0IGZhdF90aW1lOworCXRpbWU2NF90IHRpbWU7CisJdTY0IGh3X2NvdW50ZXI7CiAJdTggYnVmWzZdOwogCXU4IHJ0Y3ZhbDsKIAlpbnQgZXJyOwpAQCAtMTM0LDExICsxMzMsMTEgQEAKIAkJCQkJCSAgICAgQUIzMTAwX0FMMCwgYnVmLCA0KTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwotCWZhdF90aW1lID0gKCh1NjQpIGJ1ZlszXSA8PCA0MCkgfCAoKHU2NCkgYnVmWzJdIDw8IDMyKSB8CisJaHdfY291bnRlciA9ICgodTY0KSBidWZbM10gPDwgNDApIHwgKCh1NjQpIGJ1ZlsyXSA8PCAzMikgfAogCQkoKHU2NCkgYnVmWzFdIDw8IDI0KSB8ICgodTY0KSBidWZbMF0gPDwgMTYpOwotCXRpbWUgPSAodW5zaWduZWQgbG9uZykgKGZhdF90aW1lIC8gKHU2NCkgKEFCMzEwMF9SVENfQ0xPQ0tfUkFURSAqIDIpKTsKKwl0aW1lID0gaHdfY291bnRlciAvICh1NjQpIChBQjMxMDBfUlRDX0NMT0NLX1JBVEUgKiAyKTsKIAotCXJ0Y190aW1lX3RvX3RtKHRpbWUsICZhbGFybS0+dGltZSk7CisJcnRjX3RpbWU2NF90b190bSh0aW1lLCAmYWxhcm0tPnRpbWUpOwogCiAJcmV0dXJuIHJ0Y192YWxpZF90bSgmYWxhcm0tPnRpbWUpOwogfQpAQCAtMTQ3LDE3ICsxNDYsMTcgQEAKIHsKIAl1OCByZWdzW10gPSB7QUIzMTAwX0FMMCwgQUIzMTAwX0FMMSwgQUIzMTAwX0FMMiwgQUIzMTAwX0FMM307CiAJdW5zaWduZWQgY2hhciBidWZbNF07Ci0JdW5zaWduZWQgbG9uZyBzZWNzOwotCXU2NCBmYXRfdGltZTsKKwl0aW1lNjRfdCBzZWNzOworCXU2NCBod19jb3VudGVyOwogCWludCBlcnI7CiAJaW50IGk7CiAKLQlydGNfdG1fdG9fdGltZSgmYWxhcm0tPnRpbWUsICZzZWNzKTsKLQlmYXRfdGltZSA9ICh1NjQpIHNlY3MgKiBBQjMxMDBfUlRDX0NMT0NLX1JBVEUgKiAyOwotCWJ1ZlswXSA9IChmYXRfdGltZSA+PiAxNikgJiAweEZGOwotCWJ1ZlsxXSA9IChmYXRfdGltZSA+PiAyNCkgJiAweEZGOwotCWJ1ZlsyXSA9IChmYXRfdGltZSA+PiAzMikgJiAweEZGOwotCWJ1ZlszXSA9IChmYXRfdGltZSA+PiA0MCkgJiAweEZGOworCXNlY3MgPSBydGNfdG1fdG9fdGltZTY0KCZhbGFybS0+dGltZSk7CisJaHdfY291bnRlciA9IHNlY3MgKiBBQjMxMDBfUlRDX0NMT0NLX1JBVEUgKiAyOworCWJ1ZlswXSA9IChod19jb3VudGVyID4+IDE2KSAmIDB4RkY7CisJYnVmWzFdID0gKGh3X2NvdW50ZXIgPj4gMjQpICYgMHhGRjsKKwlidWZbMl0gPSAoaHdfY291bnRlciA+PiAzMikgJiAweEZGOworCWJ1ZlszXSA9IChod19jb3VudGVyID4+IDQwKSAmIDB4RkY7CiAKIAkvKiBTZXQgdGhlIGFsYXJtICovCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewpAQCAtMTkzLDcgKzE5Miw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyBhYjMxMDBfcnRjX29wcyA9IHsKIAkucmVhZF90aW1lCT0gYWIzMTAwX3J0Y19yZWFkX3RpbWUsCi0JLnNldF9tbXNzCT0gYWIzMTAwX3J0Y19zZXRfbW1zcywKKwkuc2V0X21tc3M2NAk9IGFiMzEwMF9ydGNfc2V0X21tc3MsCiAJLnJlYWRfYWxhcm0JPSBhYjMxMDBfcnRjX3JlYWRfYWxhcm0sCiAJLnNldF9hbGFybQk9IGFiMzEwMF9ydGNfc2V0X2FsYXJtLAogCS5hbGFybV9pcnFfZW5hYmxlID0gYWIzMTAwX3J0Y19pcnFfZW5hYmxlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWF0OTFybTkyMDAuYyBiL2RyaXZlcnMvcnRjL3J0Yy1hdDkxcm05MjAwLmMKaW5kZXggYjRmNzc0NC4uYjI4M2ExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLWF0OTFybTkyMDAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtYXQ5MXJtOTIwMC5jCkBAIC0zMjQsNyArMzI0LDcgQEAKIAogCQlyZXQgPSBJUlFfSEFORExFRDsKIAl9Ci0Jc3Bpbl9sb2NrKCZzdXNwZW5kZWRfbG9jayk7CisJc3Bpbl91bmxvY2soJnN1c3BlbmRlZF9sb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jIGIvZHJpdmVycy9ydGMvcnRjLWNtb3MuYwppbmRleCA1YjJlNzYxLi44NzY0N2Y0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtY21vcy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1jbW9zLmMKQEAgLTQ1OSwyMyArNDU5LDI1IEBACiAJLyogTk9URTogIGF0IGxlYXN0IElDSDYgcmVwb3J0cyBiYXR0ZXJ5IHN0YXR1cyB1c2luZyBhIGRpZmZlcmVudAogCSAqIChub24tUlRDKSBiaXQ7IGFuZCBTUVdFIGlzIGlnbm9yZWQgb24gbWFueSBjdXJyZW50IHN5c3RlbXMuCiAJICovCi0JcmV0dXJuIHNlcV9wcmludGYoc2VxLAotCQkJInBlcmlvZGljX0lSUVx0OiAlc1xuIgotCQkJInVwZGF0ZV9JUlFcdDogJXNcbiIKLQkJCSJIUEVUX2VtdWxhdGVkXHQ6ICVzXG4iCi0JCQkvLyAic3F1YXJlX3dhdmVcdDogJXNcbiIKLQkJCSJCQ0RcdFx0OiAlc1xuIgotCQkJIkRTVF9lbmFibGVcdDogJXNcbiIKLQkJCSJwZXJpb2RpY19mcmVxXHQ6ICVkXG4iCi0JCQkiYmF0dF9zdGF0dXNcdDogJXNcbiIsCi0JCQkocnRjX2NvbnRyb2wgJiBSVENfUElFKSA/ICJ5ZXMiIDogIm5vIiwKLQkJCShydGNfY29udHJvbCAmIFJUQ19VSUUpID8gInllcyIgOiAibm8iLAotCQkJaXNfaHBldF9lbmFibGVkKCkgPyAieWVzIiA6ICJubyIsCi0JCQkvLyAocnRjX2NvbnRyb2wgJiBSVENfU1FXRSkgPyAieWVzIiA6ICJubyIsCi0JCQkocnRjX2NvbnRyb2wgJiBSVENfRE1fQklOQVJZKSA/ICJubyIgOiAieWVzIiwKLQkJCShydGNfY29udHJvbCAmIFJUQ19EU1RfRU4pID8gInllcyIgOiAibm8iLAotCQkJY21vcy0+cnRjLT5pcnFfZnJlcSwKLQkJCSh2YWxpZCAmIFJUQ19WUlQpID8gIm9rYXkiIDogImRlYWQiKTsKKwlzZXFfcHJpbnRmKHNlcSwKKwkJICAgInBlcmlvZGljX0lSUVx0OiAlc1xuIgorCQkgICAidXBkYXRlX0lSUVx0OiAlc1xuIgorCQkgICAiSFBFVF9lbXVsYXRlZFx0OiAlc1xuIgorCQkgICAvLyAic3F1YXJlX3dhdmVcdDogJXNcbiIKKwkJICAgIkJDRFx0XHQ6ICVzXG4iCisJCSAgICJEU1RfZW5hYmxlXHQ6ICVzXG4iCisJCSAgICJwZXJpb2RpY19mcmVxXHQ6ICVkXG4iCisJCSAgICJiYXR0X3N0YXR1c1x0OiAlc1xuIiwKKwkJICAgKHJ0Y19jb250cm9sICYgUlRDX1BJRSkgPyAieWVzIiA6ICJubyIsCisJCSAgIChydGNfY29udHJvbCAmIFJUQ19VSUUpID8gInllcyIgOiAibm8iLAorCQkgICBpc19ocGV0X2VuYWJsZWQoKSA/ICJ5ZXMiIDogIm5vIiwKKwkJICAgLy8gKHJ0Y19jb250cm9sICYgUlRDX1NRV0UpID8gInllcyIgOiAibm8iLAorCQkgICAocnRjX2NvbnRyb2wgJiBSVENfRE1fQklOQVJZKSA/ICJubyIgOiAieWVzIiwKKwkJICAgKHJ0Y19jb250cm9sICYgUlRDX0RTVF9FTikgPyAieWVzIiA6ICJubyIsCisJCSAgIGNtb3MtPnJ0Yy0+aXJxX2ZyZXEsCisJCSAgICh2YWxpZCAmIFJUQ19WUlQpID8gIm9rYXkiIDogImRlYWQiKTsKKworCXJldHVybiAwOwogfQogCiAjZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLWRzMTMwNS5jIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNS5jCmluZGV4IDEyOWFkZDc3Li4xMmIwNzE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtZHMxMzA1LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWRzMTMwNS5jCkBAIC00MzQsOSArNDM0LDkgQEAKIAl9CiAKIGRvbmU6Ci0JcmV0dXJuIHNlcV9wcmludGYoc2VxLAotCQkJInRyaWNrbGVfY2hhcmdlXHQ6ICVzJXNcbiIsCi0JCQlkaW9kZXMsIHJlc2lzdG9ycyk7CisJc2VxX3ByaW50ZihzZXEsICJ0cmlja2xlX2NoYXJnZVx0OiAlcyVzXG4iLCBkaW9kZXMsIHJlc2lzdG9ycyk7CisKKwlyZXR1cm4gMDsKIH0KIAogI2Vsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1oaWQtc2Vuc29yLXRpbWUuYyBiL2RyaXZlcnMvcnRjL3J0Yy1oaWQtc2Vuc29yLXRpbWUuYwppbmRleCBhZTdjMmJhLi5hZjRmODVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtaGlkLXNlbnNvci10aW1lLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLWhpZC1zZW5zb3ItdGltZS5jCkBAIC0yMTMsNyArMjEzLDcgQEAKIAkvKiBnZXQgYSByZXBvcnQgd2l0aCBhbGwgdmFsdWVzIHRocm91Z2ggcmVxdWVzdGluZyBvbmUgdmFsdWUgKi8KIAlzZW5zb3JfaHViX2lucHV0X2F0dHJfZ2V0X3Jhd192YWx1ZSh0aW1lX3N0YXRlLT5jb21tb25fYXR0cmlidXRlcy5oc2RldiwKIAkJCUhJRF9VU0FHRV9TRU5TT1JfVElNRSwgaGlkX3RpbWVfYWRkcmVzc2VzWzBdLAotCQkJdGltZV9zdGF0ZS0+aW5mb1swXS5yZXBvcnRfaWQpOworCQkJdGltZV9zdGF0ZS0+aW5mb1swXS5yZXBvcnRfaWQsIFNFTlNPUl9IVUJfU1lOQyk7CiAJLyogd2FpdCBmb3IgYWxsIHZhbHVlcyAoZXZlbnQpICovCiAJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9raWxsYWJsZV90aW1lb3V0KAogCQkJJnRpbWVfc3RhdGUtPmNvbXBfbGFzdF90aW1lLCBIWio2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1tYzEzeHh4LmMgYi9kcml2ZXJzL3J0Yy9ydGMtbWMxM3h4eC5jCmluZGV4IDViY2U5MDQuLjMyZGYxZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1tYzEzeHh4LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLW1jMTN4eHguYwpAQCAtODMsMjAgKzgzLDE5IEBACiAJCQlyZXR1cm4gcmV0OwogCX0gd2hpbGUgKGRheXMxICE9IGRheXMyKTsKIAotCXJ0Y190aW1lX3RvX3RtKGRheXMxICogU0VDX1BFUl9EQVkgKyBzZWNvbmRzLCB0bSk7CisJcnRjX3RpbWU2NF90b190bSgodGltZTY0X3QpZGF5czEgKiBTRUNfUEVSX0RBWSArIHNlY29uZHMsIHRtKTsKIAogCXJldHVybiBydGNfdmFsaWRfdG0odG0pOwogfQogCi1zdGF0aWMgaW50IG1jMTN4eHhfcnRjX3NldF9tbXNzKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBzZWNzKQorc3RhdGljIGludCBtYzEzeHh4X3J0Y19zZXRfbW1zcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHRpbWU2NF90IHNlY3MpCiB7CiAJc3RydWN0IG1jMTN4eHhfcnRjICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJdW5zaWduZWQgaW50IHNlY29uZHMsIGRheXM7CiAJdW5zaWduZWQgaW50IGFsYXJtc2Vjb25kczsKIAlpbnQgcmV0OwogCi0Jc2Vjb25kcyA9IHNlY3MgJSBTRUNfUEVSX0RBWTsKLQlkYXlzID0gc2VjcyAvIFNFQ19QRVJfREFZOworCWRheXMgPSBkaXZfczY0X3JlbShzZWNzLCBTRUNfUEVSX0RBWSwgJnNlY29uZHMpOwogCiAJbWMxM3h4eF9sb2NrKHByaXYtPm1jMTN4eHgpOwogCkBAIC0xNTksNyArMTU4LDcgQEAKIHsKIAlzdHJ1Y3QgbWMxM3h4eF9ydGMgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAl1bnNpZ25lZCBzZWNvbmRzLCBkYXlzOwotCXVuc2lnbmVkIGxvbmcgczE5NzA7CisJdGltZTY0X3QgczE5NzA7CiAJaW50IGVuYWJsZWQsIHBlbmRpbmc7CiAJaW50IHJldDsKIApAQCAtMTg5LDEwICsxODgsMTAgQEAKIAlhbGFybS0+ZW5hYmxlZCA9IGVuYWJsZWQ7CiAJYWxhcm0tPnBlbmRpbmcgPSBwZW5kaW5nOwogCi0JczE5NzAgPSBkYXlzICogU0VDX1BFUl9EQVkgKyBzZWNvbmRzOworCXMxOTcwID0gKHRpbWU2NF90KWRheXMgKiBTRUNfUEVSX0RBWSArIHNlY29uZHM7CiAKLQlydGNfdGltZV90b190bShzMTk3MCwgJmFsYXJtLT50aW1lKTsKLQlkZXZfZGJnKGRldiwgIiVzOiAlbHVcbiIsIF9fZnVuY19fLCBzMTk3MCk7CisJcnRjX3RpbWU2NF90b190bShzMTk3MCwgJmFsYXJtLT50aW1lKTsKKwlkZXZfZGJnKGRldiwgIiVzOiAlbGxkXG4iLCBfX2Z1bmNfXywgKGxvbmcgbG9uZylzMTk3MCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMCw4ICsxOTksOCBAQAogc3RhdGljIGludCBtYzEzeHh4X3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxybSAqYWxhcm0pCiB7CiAJc3RydWN0IG1jMTN4eHhfcnRjICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JdW5zaWduZWQgbG9uZyBzMTk3MDsKLQl1bnNpZ25lZCBzZWNvbmRzLCBkYXlzOworCXRpbWU2NF90IHMxOTcwOworCXUzMiBzZWNvbmRzLCBkYXlzOwogCWludCByZXQ7CiAKIAltYzEzeHh4X2xvY2socHJpdi0+bWMxM3h4eCk7CkBAIC0yMTUsMjAgKzIxNCwxNyBAQAogCWlmICh1bmxpa2VseShyZXQpKQogCQlnb3RvIG91dDsKIAotCXJldCA9IHJ0Y190bV90b190aW1lKCZhbGFybS0+dGltZSwgJnMxOTcwKTsKLQlpZiAodW5saWtlbHkocmV0KSkKLQkJZ290byBvdXQ7CisJczE5NzAgPSBydGNfdG1fdG9fdGltZTY0KCZhbGFybS0+dGltZSk7CiAKLQlkZXZfZGJnKGRldiwgIiVzOiBvJTIucyAlbHVcbiIsIF9fZnVuY19fLCBhbGFybS0+ZW5hYmxlZCA/ICJuIiA6ICJmZiIsCi0JCQlzMTk3MCk7CisJZGV2X2RiZyhkZXYsICIlczogbyUyLnMgJWxsZFxuIiwgX19mdW5jX18sIGFsYXJtLT5lbmFibGVkID8gIm4iIDogImZmIiwKKwkJCShsb25nIGxvbmcpczE5NzApOwogCiAJcmV0ID0gbWMxM3h4eF9ydGNfaXJxX2VuYWJsZV91bmxvY2tlZChkZXYsIGFsYXJtLT5lbmFibGVkLAogCQkJTUMxM1hYWF9JUlFfVE9EQSk7CiAJaWYgKHVubGlrZWx5KHJldCkpCiAJCWdvdG8gb3V0OwogCi0Jc2Vjb25kcyA9IHMxOTcwICUgU0VDX1BFUl9EQVk7Ci0JZGF5cyA9IHMxOTcwIC8gU0VDX1BFUl9EQVk7CisJZGF5cyA9IGRpdl9zNjRfcmVtKHMxOTcwLCBTRUNfUEVSX0RBWSwgJnNlY29uZHMpOwogCiAJcmV0ID0gbWMxM3h4eF9yZWdfd3JpdGUocHJpdi0+bWMxM3h4eCwgTUMxM1hYWF9SVENEQVlBLCBkYXlzKTsKIAlpZiAodW5saWtlbHkocmV0KSkKQEAgLTI2OCw3ICsyNjQsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJ0Y19jbGFzc19vcHMgbWMxM3h4eF9ydGNfb3BzID0gewogCS5yZWFkX3RpbWUgPSBtYzEzeHh4X3J0Y19yZWFkX3RpbWUsCi0JLnNldF9tbXNzID0gbWMxM3h4eF9ydGNfc2V0X21tc3MsCisJLnNldF9tbXNzNjQgPSBtYzEzeHh4X3J0Y19zZXRfbW1zcywKIAkucmVhZF9hbGFybSA9IG1jMTN4eHhfcnRjX3JlYWRfYWxhcm0sCiAJLnNldF9hbGFybSA9IG1jMTN4eHhfcnRjX3NldF9hbGFybSwKIAkuYWxhcm1faXJxX2VuYWJsZSA9IG1jMTN4eHhfcnRjX2FsYXJtX2lycV9lbmFibGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtbXJzdC5jIGIvZHJpdmVycy9ydGMvcnRjLW1yc3QuYwppbmRleCBlMjQzNmQxLi41NDhlYTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbXJzdC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1tcnN0LmMKQEAgLTI3NywxMyArMjc3LDE1IEBACiAJdmFsaWQgPSB2cnRjX2Ntb3NfcmVhZChSVENfVkFMSUQpOwogCXNwaW5fdW5sb2NrX2lycSgmcnRjX2xvY2spOwogCi0JcmV0dXJuIHNlcV9wcmludGYoc2VxLAotCQkJInBlcmlvZGljX0lSUVx0OiAlc1xuIgotCQkJImFsYXJtXHRcdDogJXNcbiIKLQkJCSJCQ0RcdFx0OiBub1xuIgotCQkJInBlcmlvZGljX2ZyZXFcdDogZGFpbHkgKG5vdCBhZGp1c3RhYmxlKVxuIiwKLQkJCShydGNfY29udHJvbCAmIFJUQ19QSUUpID8gIm9uIiA6ICJvZmYiLAotCQkJKHJ0Y19jb250cm9sICYgUlRDX0FJRSkgPyAib24iIDogIm9mZiIpOworCXNlcV9wcmludGYoc2VxLAorCQkgICAicGVyaW9kaWNfSVJRXHQ6ICVzXG4iCisJCSAgICJhbGFybVx0XHQ6ICVzXG4iCisJCSAgICJCQ0RcdFx0OiBub1xuIgorCQkgICAicGVyaW9kaWNfZnJlcVx0OiBkYWlseSAobm90IGFkanVzdGFibGUpXG4iLAorCQkgICAocnRjX2NvbnRyb2wgJiBSVENfUElFKSA/ICJvbiIgOiAib2ZmIiwKKwkJICAgKHJ0Y19jb250cm9sICYgUlRDX0FJRSkgPyAib24iIDogIm9mZiIpOworCisJcmV0dXJuIDA7CiB9CiAKICNlbHNlCkBAIC00MTMsOCArNDE1LDggQEAKIAltcnN0LT5kZXYgPSBOVUxMOwogfQogCi0jaWZkZWYJQ09ORklHX1BNCi1zdGF0aWMgaW50IG1yc3Rfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtZXNnKQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBtcnN0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBtcnN0X3J0YwkqbXJzdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXVuc2lnbmVkIGNoYXIJdG1wOwpAQCAtNDUzLDcgKzQ1NSw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG1yc3RfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBtcnN0X3N1c3BlbmQoZGV2LCBQTVNHX0hJQkVSTkFURSk7CisJcmV0dXJuIG1yc3Rfc3VzcGVuZChkZXYpOwogfQogCiBzdGF0aWMgaW50IG1yc3RfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKQEAgLTQ5MCw5ICs0OTIsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIFNJTVBMRV9ERVZfUE1fT1BTKG1yc3RfcG1fb3BzLCBtcnN0X3N1c3BlbmQsIG1yc3RfcmVzdW1lKTsKKyNkZWZpbmUgTVJTVF9QTV9PUFMgKCZtcnN0X3BtX29wcykKKwogI2Vsc2UKLSNkZWZpbmUJbXJzdF9zdXNwZW5kCU5VTEwKLSNkZWZpbmUJbXJzdF9yZXN1bWUJTlVMTAorI2RlZmluZSBNUlNUX1BNX09QUyBOVUxMCiAKIHN0YXRpYyBpbmxpbmUgaW50IG1yc3RfcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQogewpAQCAtNTI5LDkgKzUzMyw4IEBACiAJLnJlbW92ZQkJPSB2cnRjX21yc3RfcGxhdGZvcm1fcmVtb3ZlLAogCS5zaHV0ZG93bgk9IHZydGNfbXJzdF9wbGF0Zm9ybV9zaHV0ZG93biwKIAkuZHJpdmVyID0gewotCQkubmFtZQkJPSAoY2hhciAqKSBkcml2ZXJfbmFtZSwKLQkJLnN1c3BlbmQJPSBtcnN0X3N1c3BlbmQsCi0JCS5yZXN1bWUJCT0gbXJzdF9yZXN1bWUsCisJCS5uYW1lCT0gZHJpdmVyX25hbWUsCisJCS5wbQk9IE1SU1RfUE1fT1BTLAogCX0KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1teGMuYyBiL2RyaXZlcnMvcnRjL3J0Yy1teGMuYwppbmRleCAzYzNmOGQxLi4wOWQ0MjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtbXhjLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLW14Yy5jCkBAIC0xMDYsNyArMTA2LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBvYnRhaW4gdGhlIFJUQyB0aW1lIG9yIHRoZSBhbGFybSB2YWx1ZSBpbgogICogc2Vjb25kLgogICovCi1zdGF0aWMgdTMyIGdldF9hbGFybV9vcl90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHRpbWVfYWxhcm0pCitzdGF0aWMgdGltZTY0X3QgZ2V0X2FsYXJtX29yX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgdGltZV9hbGFybSkKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CkBAIC0xMjksMjkgKzEyOSwyOCBAQAogCWhyID0gaHJfbWluID4+IDg7CiAJbWluID0gaHJfbWluICYgMHhmZjsKIAotCXJldHVybiAoKChkYXkgKiAyNCArIGhyKSAqIDYwKSArIG1pbikgKiA2MCArIHNlYzsKKwlyZXR1cm4gKCgoKHRpbWU2NF90KWRheSAqIDI0ICsgaHIpICogNjApICsgbWluKSAqIDYwICsgc2VjOwogfQogCiAvKgogICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBSVEMgYWxhcm0gdmFsdWUgb3IgdGhlIHRpbWUgdmFsdWUuCiAgKi8KLXN0YXRpYyB2b2lkIHNldF9hbGFybV9vcl90aW1lKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHRpbWVfYWxhcm0sIHUzMiB0aW1lKQorc3RhdGljIHZvaWQgc2V0X2FsYXJtX29yX3RpbWUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgdGltZV9hbGFybSwgdGltZTY0X3QgdGltZSkKIHsKLQl1MzIgZGF5LCBociwgbWluLCBzZWMsIHRlbXA7CisJdTMyIHRvZCwgZGF5LCBociwgbWluLCBzZWMsIHRlbXA7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOwogCXN0cnVjdCBydGNfcGxhdF9kYXRhICpwZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcGRhdGEtPmlvYWRkcjsKIAotCWRheSA9IHRpbWUgLyA4NjQwMDsKLQl0aW1lIC09IGRheSAqIDg2NDAwOworCWRheSA9IGRpdl9zNjRfcmVtKHRpbWUsIDg2NDAwLCAmdG9kKTsKIAogCS8qIHRpbWUgaXMgd2l0aGluIGEgZGF5IG5vdyAqLwotCWhyID0gdGltZSAvIDM2MDA7Ci0JdGltZSAtPSBociAqIDM2MDA7CisJaHIgPSB0b2QgLyAzNjAwOworCXRvZCAtPSBociAqIDM2MDA7CiAKIAkvKiB0aW1lIGlzIHdpdGhpbiBhbiBob3VyIG5vdyAqLwotCW1pbiA9IHRpbWUgLyA2MDsKLQlzZWMgPSB0aW1lIC0gbWluICogNjA7CisJbWluID0gdG9kIC8gNjA7CisJc2VjID0gdG9kIC0gbWluICogNjA7CiAKIAl0ZW1wID0gKGhyIDw8IDgpICsgbWluOwogCkBAIC0xNzMsMjkgKzE3MiwxOCBAQAogICogVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBSVEMgYWxhcm0gcmVnaXN0ZXJzIGFuZCB0aGVuIGNsZWFycyBhbGwgdGhlCiAgKiBpbnRlcnJ1cHQgc3RhdHVzIGJpdHMuCiAgKi8KLXN0YXRpYyBpbnQgcnRjX3VwZGF0ZV9hbGFybShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqYWxybSkKK3N0YXRpYyB2b2lkIHJ0Y191cGRhdGVfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3RpbWUgKmFscm0pCiB7Ci0Jc3RydWN0IHJ0Y190aW1lIGFsYXJtX3RtLCBub3dfdG07Ci0JdW5zaWduZWQgbG9uZyBub3csIHRpbWU7CisJdGltZTY0X3QgdGltZTsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwZGF0YS0+aW9hZGRyOwogCi0Jbm93ID0gZ2V0X2FsYXJtX29yX3RpbWUoZGV2LCBNWENfUlRDX1RJTUUpOwotCXJ0Y190aW1lX3RvX3RtKG5vdywgJm5vd190bSk7Ci0JYWxhcm1fdG0udG1feWVhciA9IG5vd190bS50bV95ZWFyOwotCWFsYXJtX3RtLnRtX21vbiA9IG5vd190bS50bV9tb247Ci0JYWxhcm1fdG0udG1fbWRheSA9IG5vd190bS50bV9tZGF5OwotCWFsYXJtX3RtLnRtX2hvdXIgPSBhbHJtLT50bV9ob3VyOwotCWFsYXJtX3RtLnRtX21pbiA9IGFscm0tPnRtX21pbjsKLQlhbGFybV90bS50bV9zZWMgPSBhbHJtLT50bV9zZWM7Ci0JcnRjX3RtX3RvX3RpbWUoJmFsYXJtX3RtLCAmdGltZSk7CisJdGltZSA9IHJ0Y190bV90b190aW1lNjQoYWxybSk7CiAKIAkvKiBjbGVhciBhbGwgdGhlIGludGVycnVwdCBzdGF0dXMgYml0cyAqLwogCXdyaXRldyhyZWFkdyhpb2FkZHIgKyBSVENfUlRDSVNSKSwgaW9hZGRyICsgUlRDX1JUQ0lTUik7CiAJc2V0X2FsYXJtX29yX3RpbWUoZGV2LCBNWENfUlRDX0FMQVJNLCB0aW1lKTsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBteGNfcnRjX2lycV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYml0LApAQCAtMjgzLDE0ICsyNzEsMTQgQEAKICAqLwogc3RhdGljIGludCBteGNfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfdGltZSAqdG0pCiB7Ci0JdTMyIHZhbDsKKwl0aW1lNjRfdCB2YWw7CiAKIAkvKiBBdm9pZCByb2xsLW92ZXIgZnJvbSByZWFkaW5nIHRoZSBkaWZmZXJlbnQgcmVnaXN0ZXJzICovCiAJZG8gewogCQl2YWwgPSBnZXRfYWxhcm1fb3JfdGltZShkZXYsIE1YQ19SVENfVElNRSk7CiAJfSB3aGlsZSAodmFsICE9IGdldF9hbGFybV9vcl90aW1lKGRldiwgTVhDX1JUQ19USU1FKSk7CiAKLQlydGNfdGltZV90b190bSh2YWwsIHRtKTsKKwlydGNfdGltZTY0X3RvX3RtKHZhbCwgdG0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTgsNyArMjg2LDcgQEAKIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGludGVybmFsIFJUQyB0aW1lIGJhc2VkIG9uIHRtIGluIEdyZWdvcmlhbiBkYXRlLgogICovCi1zdGF0aWMgaW50IG14Y19ydGNfc2V0X21tc3Moc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIHRpbWUpCitzdGF0aWMgaW50IG14Y19ydGNfc2V0X21tc3Moc3RydWN0IGRldmljZSAqZGV2LCB0aW1lNjRfdCB0aW1lKQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKQEAgLTMwOSw5ICsyOTcsOSBAQAogCWlmIChpc19pbXgxX3J0YyhwZGF0YSkpIHsKIAkJc3RydWN0IHJ0Y190aW1lIHRtOwogCi0JCXJ0Y190aW1lX3RvX3RtKHRpbWUsICZ0bSk7CisJCXJ0Y190aW1lNjRfdG9fdG0odGltZSwgJnRtKTsKIAkJdG0udG1feWVhciA9IDcwOwotCQlydGNfdG1fdG9fdGltZSgmdG0sICZ0aW1lKTsKKwkJdGltZSA9IHJ0Y190bV90b190aW1lNjQoJnRtKTsKIAl9CiAKIAkvKiBBdm9pZCByb2xsLW92ZXIgZnJvbSByZWFkaW5nIHRoZSBkaWZmZXJlbnQgcmVnaXN0ZXJzICovCkBAIC0zMzMsNyArMzIxLDcgQEAKIAlzdHJ1Y3QgcnRjX3BsYXRfZGF0YSAqcGRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHBkYXRhLT5pb2FkZHI7CiAKLQlydGNfdGltZV90b190bShnZXRfYWxhcm1fb3JfdGltZShkZXYsIE1YQ19SVENfQUxBUk0pLCAmYWxybS0+dGltZSk7CisJcnRjX3RpbWU2NF90b190bShnZXRfYWxhcm1fb3JfdGltZShkZXYsIE1YQ19SVENfQUxBUk0pLCAmYWxybS0+dGltZSk7CiAJYWxybS0+cGVuZGluZyA9ICgocmVhZHcoaW9hZGRyICsgUlRDX1JUQ0lTUikgJiBSVENfQUxNX0JJVCkpID8gMSA6IDA7CiAKIAlyZXR1cm4gMDsKQEAgLTM0NiwxMSArMzM0LDggQEAKIHsKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CiAJc3RydWN0IHJ0Y19wbGF0X2RhdGEgKnBkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0JaW50IHJldDsKIAotCXJldCA9IHJ0Y191cGRhdGVfYWxhcm0oZGV2LCAmYWxybS0+dGltZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlydGNfdXBkYXRlX2FsYXJtKGRldiwgJmFscm0tPnRpbWUpOwogCiAJbWVtY3B5KCZwZGF0YS0+Z19ydGNfYWxhcm0sICZhbHJtLT50aW1lLCBzaXplb2Yoc3RydWN0IHJ0Y190aW1lKSk7CiAJbXhjX3J0Y19pcnFfZW5hYmxlKGRldiwgUlRDX0FMTV9CSVQsIGFscm0tPmVuYWJsZWQpOwpAQCAtMzYyLDcgKzM0Nyw3IEBACiBzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgbXhjX3J0Y19vcHMgPSB7CiAJLnJlbGVhc2UJCT0gbXhjX3J0Y19yZWxlYXNlLAogCS5yZWFkX3RpbWUJCT0gbXhjX3J0Y19yZWFkX3RpbWUsCi0JLnNldF9tbXNzCQk9IG14Y19ydGNfc2V0X21tc3MsCisJLnNldF9tbXNzNjQJCT0gbXhjX3J0Y19zZXRfbW1zcywKIAkucmVhZF9hbGFybQkJPSBteGNfcnRjX3JlYWRfYWxhcm0sCiAJLnNldF9hbGFybQkJPSBteGNfcnRjX3NldF9hbGFybSwKIAkuYWxhcm1faXJxX2VuYWJsZQk9IG14Y19ydGNfYWxhcm1faXJxX2VuYWJsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zNW0uYyBiL2RyaXZlcnMvcnRjL3J0Yy1zNW0uYwppbmRleCA4OWFjMWQ1Li40MDA4Yjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtczVtLmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXM1bS5jCkBAIC00OCw4ICs0OCw2IEBACiAJdW5zaWduZWQgaW50IGFsYXJtMDsKIAkvKiBGaXJzdCByZWdpc3RlciBmb3IgYWxhcm0gMSwgc2Vjb25kcyAqLwogCXVuc2lnbmVkIGludCBhbGFybTE7Ci0JLyogU01QTC9XVFNSIHJlZ2lzdGVyICovCi0JdW5zaWduZWQgaW50IHNtcGxfd3RzcjsKIAkvKgogCSAqIFJlZ2lzdGVyIGZvciB1cGRhdGUgZmxhZyAoVURSKS4gVHlwaWNhbGx5IHNldHRpbmcgVURSIGZpZWxkIHRvIDEKIAkgKiB3aWxsIGVuYWJsZSB1cGRhdGUgb2YgdGltZSBvciBhbGFybSByZWdpc3Rlci4gVGhlbiBpdCB3aWxsIGJlCkBAIC02Nyw3ICs2NSw2IEBACiAJLmN0cmwJCQk9IFM1TV9BTEFSTTFfQ09ORiwKIAkuYWxhcm0wCQkJPSBTNU1fQUxBUk0wX1NFQywKIAkuYWxhcm0xCQkJPSBTNU1fQUxBUk0xX1NFQywKLQkuc21wbF93dHNyCQk9IFM1TV9XVFNSX1NNUExfQ05UTCwKIAkucnRjX3Vkcl91cGRhdGUJCT0gUzVNX1JUQ19VRFJfQ09OLAogCS5ydGNfdWRyX21hc2sJCT0gUzVNX1JUQ19VRFJfTUFTSywKIH07CkBAIC04Miw3ICs3OSw2IEBACiAJLmN0cmwJCQk9IFMyTVBTX1JUQ19DVFJMLAogCS5hbGFybTAJCQk9IFMyTVBTX0FMQVJNMF9TRUMsCiAJLmFsYXJtMQkJCT0gUzJNUFNfQUxBUk0xX1NFQywKLQkuc21wbF93dHNyCQk9IFMyTVBTX1dUU1JfU01QTF9DTlRMLAogCS5ydGNfdWRyX3VwZGF0ZQkJPSBTMk1QU19SVENfVURSX0NPTiwKIAkucnRjX3Vkcl9tYXNrCQk9IFMyTVBTX1JUQ19XVURSX01BU0ssCiB9OwpAQCAtOTYsNyArOTIsNiBAQAogCWludCBpcnE7CiAJaW50IGRldmljZV90eXBlOwogCWludCBydGNfMjRocl9tb2RlOwotCWJvb2wgd3Rzcl9zbXBsOwogCWNvbnN0IHN0cnVjdCBzNW1fcnRjX3JlZ19jb25maWcJKnJlZ3M7CiB9OwogCkBAIC01OTcsMjggKzU5Miw2IEBACiAJLmFsYXJtX2lycV9lbmFibGUgPSBzNW1fcnRjX2FsYXJtX2lycV9lbmFibGUsCiB9OwogCi1zdGF0aWMgdm9pZCBzNW1fcnRjX2VuYWJsZV93dHNyKHN0cnVjdCBzNW1fcnRjX2luZm8gKmluZm8sIGJvb2wgZW5hYmxlKQotewotCWludCByZXQ7Ci0JcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGluZm8tPnJlZ21hcCwgaW5mby0+cmVncy0+c21wbF93dHNyLAotCQkJCSBXVFNSX0VOQUJMRV9NQVNLLAotCQkJCSBlbmFibGUgPyBXVFNSX0VOQUJMRV9NQVNLIDogMCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoaW5mby0+ZGV2LCAiJXM6IGZhaWwgdG8gdXBkYXRlIFdUU1IgcmVnKCVkKVxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotfQotCi1zdGF0aWMgdm9pZCBzNW1fcnRjX2VuYWJsZV9zbXBsKHN0cnVjdCBzNW1fcnRjX2luZm8gKmluZm8sIGJvb2wgZW5hYmxlKQotewotCWludCByZXQ7Ci0JcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGluZm8tPnJlZ21hcCwgaW5mby0+cmVncy0+c21wbF93dHNyLAotCQkJCSBTTVBMX0VOQUJMRV9NQVNLLAotCQkJCSBlbmFibGUgPyBTTVBMX0VOQUJMRV9NQVNLIDogMCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoaW5mby0+ZGV2LCAiJXM6IGZhaWwgdG8gdXBkYXRlIFNNUEwgcmVnKCVkKVxuIiwKLQkJCV9fZnVuY19fLCByZXQpOwotfQotCiBzdGF0aWMgaW50IHM1bTg3NjdfcnRjX2luaXRfcmVnKHN0cnVjdCBzNW1fcnRjX2luZm8gKmluZm8pCiB7CiAJdTggZGF0YVsyXTsKQEAgLTcxNSw3ICs2ODgsNiBAQAogCWluZm8tPmRldiA9ICZwZGV2LT5kZXY7CiAJaW5mby0+czVtODd4eCA9IHM1bTg3eHg7CiAJaW5mby0+ZGV2aWNlX3R5cGUgPSBzNW04N3h4LT5kZXZpY2VfdHlwZTsKLQlpbmZvLT53dHNyX3NtcGwgPSBzNW04N3h4LT53dHNyX3NtcGw7CiAKIAlpZiAoczVtODd4eC0+aXJxX2RhdGEpIHsKIAkJaW5mby0+aXJxID0gcmVnbWFwX2lycV9nZXRfdmlycShzNW04N3h4LT5pcnFfZGF0YSwgYWxhcm1faXJxKTsKQEAgLTczMSwxMSArNzAzLDYgQEAKIAogCXJldCA9IHM1bTg3NjdfcnRjX2luaXRfcmVnKGluZm8pOwogCi0JaWYgKGluZm8tPnd0c3Jfc21wbCkgewotCQlzNW1fcnRjX2VuYWJsZV93dHNyKGluZm8sIHRydWUpOwotCQlzNW1fcnRjX2VuYWJsZV9zbXBsKGluZm8sIHRydWUpOwotCX0KLQogCWRldmljZV9pbml0X3dha2V1cCgmcGRldi0+ZGV2LCAxKTsKIAogCWluZm8tPnJ0Y19kZXYgPSBkZXZtX3J0Y19kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldiwgInM1bS1ydGMiLApAQCAtNzY4LDM2ICs3MzUsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBzNW1fcnRjX3NodXRkb3duKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHM1bV9ydGNfaW5mbyAqaW5mbyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwotCWludCBpOwotCXVuc2lnbmVkIGludCB2YWwgPSAwOwotCWlmIChpbmZvLT53dHNyX3NtcGwpIHsKLQkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotCQkJczVtX3J0Y19lbmFibGVfd3RzcihpbmZvLCBmYWxzZSk7Ci0JCQlyZWdtYXBfcmVhZChpbmZvLT5yZWdtYXAsIGluZm8tPnJlZ3MtPnNtcGxfd3RzciwgJnZhbCk7Ci0JCQlwcl9kZWJ1ZygiJXM6IFdUU1JfU01QTCByZWcoMHglMDJ4KVxuIiwgX19mdW5jX18sIHZhbCk7Ci0JCQlpZiAodmFsICYgV1RTUl9FTkFCTEVfTUFTSykKLQkJCQlwcl9lbWVyZygiJXM6IGZhaWwgdG8gZGlzYWJsZSBXVFNSXG4iLAotCQkJCQkgX19mdW5jX18pOwotCQkJZWxzZSB7Ci0JCQkJcHJfaW5mbygiJXM6IHN1Y2Nlc3MgdG8gZGlzYWJsZSBXVFNSXG4iLAotCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogRGlzYWJsZSBTTVBMIHdoZW4gcG93ZXIgb2ZmICovCi0JczVtX3J0Y19lbmFibGVfc21wbChpbmZvLCBmYWxzZSk7Ci19Ci0KIHN0YXRpYyBpbnQgczVtX3J0Y19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgczVtX3J0Y19pbmZvICppbmZvID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQkvKiBQZXJmb3JtIGFsc28gYWxsIHNodXRkb3duIHN0ZXBzIHdoZW4gcmVtb3ZpbmcgKi8KLQlzNW1fcnRjX3NodXRkb3duKHBkZXYpOwogCWkyY191bnJlZ2lzdGVyX2RldmljZShpbmZvLT5pMmMpOwogCiAJcmV0dXJuIDA7CkBAIC04NDIsNyArNzgzLDYgQEAKIAl9LAogCS5wcm9iZQkJPSBzNW1fcnRjX3Byb2JlLAogCS5yZW1vdmUJCT0gczVtX3J0Y19yZW1vdmUsCi0JLnNodXRkb3duCT0gczVtX3J0Y19zaHV0ZG93biwKIAkuaWRfdGFibGUJPSBzNW1fcnRjX2lkLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLXRlZ3JhLmMgYi9kcml2ZXJzL3J0Yy9ydGMtdGVncmEuYwppbmRleCBkOTQ4Mjc3Li42MDIzMmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtdGVncmEuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtdGVncmEuYwpAQCAtMjYxLDcgKzI2MSw5IEBACiAJaWYgKCFkZXYgfHwgIWRldi0+ZHJpdmVyKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBzZXFfcHJpbnRmKHNlcSwgIm5hbWVcdFx0OiAlc1xuIiwgZGV2X25hbWUoZGV2KSk7CisJc2VxX3ByaW50ZihzZXEsICJuYW1lXHRcdDogJXNcbiIsIGRldl9uYW1lKGRldikpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB0ZWdyYV9ydGNfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy10ZXN0LmMgYi9kcml2ZXJzL3J0Yy9ydGMtdGVzdC5jCmluZGV4IDhmODZmYTkuLjNhMmRhNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy10ZXN0LmMKKysrIGIvZHJpdmVycy9ydGMvcnRjLXRlc3QuYwpAQCAtMTMsNiArMTMsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KIAorc3RhdGljIGludCB0ZXN0X21tc3M2NDsKK21vZHVsZV9wYXJhbSh0ZXN0X21tc3M2NCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0ModGVzdF9tbXNzNjQsICJUZXN0IHN0cnVjdCBydGNfY2xhc3Nfb3BzLnNldF9tbXNzNjQoKS4iKTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnRlc3QwID0gTlVMTCwgKnRlc3QxID0gTlVMTDsKIAogc3RhdGljIGludCB0ZXN0X3J0Y19yZWFkX2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTMwLDcgKzM0LDEzIEBACiBzdGF0aWMgaW50IHRlc3RfcnRjX3JlYWRfdGltZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJc3RydWN0IHJ0Y190aW1lICp0bSkKIHsKLQlydGNfdGltZV90b190bShnZXRfc2Vjb25kcygpLCB0bSk7CisJcnRjX3RpbWU2NF90b190bShrdGltZV9nZXRfcmVhbF9zZWNvbmRzKCksIHRtKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZXN0X3J0Y19zZXRfbW1zczY0KHN0cnVjdCBkZXZpY2UgKmRldiwgdGltZTY0X3Qgc2VjcykKK3sKKwlkZXZfaW5mbyhkZXYsICIlcywgc2VjcyA9ICVsbGRcbiIsIF9fZnVuY19fLCAobG9uZyBsb25nKXNlY3MpOwogCXJldHVybiAwOwogfQogCkBAIC01NSw3ICs2NSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcnRjX2NsYXNzX29wcyB0ZXN0X3J0Y19vcHMgPSB7CitzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgdGVzdF9ydGNfb3BzID0gewogCS5wcm9jID0gdGVzdF9ydGNfcHJvYywKIAkucmVhZF90aW1lID0gdGVzdF9ydGNfcmVhZF90aW1lLAogCS5yZWFkX2FsYXJtID0gdGVzdF9ydGNfcmVhZF9hbGFybSwKQEAgLTEwMSw2ICsxMTEsMTEgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBydGNfZGV2aWNlICpydGM7CiAKKwlpZiAodGVzdF9tbXNzNjQpIHsKKwkJdGVzdF9ydGNfb3BzLnNldF9tbXNzNjQgPSB0ZXN0X3J0Y19zZXRfbW1zczY0OworCQl0ZXN0X3J0Y19vcHMuc2V0X21tc3MgPSBOVUxMOworCX0KKwogCXJ0YyA9IGRldm1fcnRjX2RldmljZV9yZWdpc3RlcigmcGxhdF9kZXYtPmRldiwgInRlc3QiLAogCQkJCSZ0ZXN0X3J0Y19vcHMsIFRISVNfTU9EVUxFKTsKIAlpZiAoSVNfRVJSKHJ0YykpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3N5c3RvaGMuYyBiL2RyaXZlcnMvcnRjL3N5c3RvaGMuYwppbmRleCBlYjcxODcyLi43NzI4ZDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9zeXN0b2hjLmMKKysrIGIvZHJpdmVycy9ydGMvc3lzdG9oYy5jCkBAIC0xMSw3ICsxMSw3IEBACiAgKiBydGNfc2V0X250cF90aW1lIC0gU2F2ZSBOVFAgc3luY2hyb25pemVkIHRpbWUgdG8gdGhlIFJUQwogICogQG5vdzogQ3VycmVudCB0aW1lIG9mIGRheQogICoKLSAqIFJlcGxhY2VtZW50IGZvciB0aGUgTlRQIHBsYXRmb3JtIGZ1bmN0aW9uIHVwZGF0ZV9wZXJzaXN0ZW50X2Nsb2NrCisgKiBSZXBsYWNlbWVudCBmb3IgdGhlIE5UUCBwbGF0Zm9ybSBmdW5jdGlvbiB1cGRhdGVfcGVyc2lzdGVudF9jbG9jazY0CiAgKiB0aGF0IHN0b3JlcyB0aW1lIGZvciBsYXRlciByZXRyaWV2YWwgYnkgcnRjX2hjdG9zeXMuCiAgKgogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3NmdWwgUlRDIHVwZGF0ZSwgLUVOT0RFViBpZiBhIFJUQyB1cGRhdGUgaXMgbm90CkBAIC0zNSw3ICszNSwxMCBAQAogCWlmIChydGMpIHsKIAkJLyogcnRjX2hjdG9zeXMgZXhjbHVzaXZlbHkgdXNlcyBVVEMsIHNvIHdlIGNhbGwgc2V0X3RpbWUgaGVyZSwKIAkJICogbm90IHNldF9tbXNzLiAqLwotCQlpZiAocnRjLT5vcHMgJiYgKHJ0Yy0+b3BzLT5zZXRfdGltZSB8fCBydGMtPm9wcy0+c2V0X21tc3MpKQorCQlpZiAocnRjLT5vcHMgJiYKKwkJICAgIChydGMtPm9wcy0+c2V0X3RpbWUgfHwKKwkJICAgICBydGMtPm9wcy0+c2V0X21tc3M2NCB8fAorCQkgICAgIHJ0Yy0+b3BzLT5zZXRfbW1zcykpCiAJCQllcnIgPSBydGNfc2V0X3RpbWUocnRjLCAmdG0pOwogCQlydGNfY2xhc3NfY2xvc2UocnRjKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYwppbmRleCBiZTM0ZWY0Li4yNmE1MWRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCisrKyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKQEAgLTEyMzcsNyArMTIzNyw2IEBACiAgKi8KIHZvaWQgZGFzZF9rZnJlZV9yZXF1ZXN0KHN0cnVjdCBkYXNkX2Njd19yZXEgKmNxciwgc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2UpCiB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJc3RydWN0IGNjdzEgKmNjdzsKIAogCS8qIENsZWFyIGFueSBpZGFscyB1c2VkIGZvciB0aGUgcmVxdWVzdC4gKi8KQEAgLTEyNDUsNyArMTI0NCw2IEBACiAJZG8gewogCQljbGVhcl9ub3JtYWxpemVkX2NkYShjY3cpOwogCX0gd2hpbGUgKGNjdysrLT5mbGFncyAmIChDQ1dfRkxBR19DQyB8IENDV19GTEFHX0RDKSk7Ci0jZW5kaWYKIAlrZnJlZShjcXItPmNwYWRkcik7CiAJa2ZyZWUoY3FyLT5kYXRhKTsKIAlrZnJlZShjcXIpOwpAQCAtMjk2Nyw4ICsyOTY1LDYgQEAKICAqLwogc3RhdGljIGludCBkYXNkX2FsbG9jX3F1ZXVlKHN0cnVjdCBkYXNkX2Jsb2NrICpibG9jaykKIHsKLQlpbnQgcmM7Ci0KIAlibG9jay0+cmVxdWVzdF9xdWV1ZSA9IGJsa19pbml0X3F1ZXVlKGRvX2Rhc2RfcmVxdWVzdCwKIAkJCQkJICAgICAgICZibG9jay0+cmVxdWVzdF9xdWV1ZV9sb2NrKTsKIAlpZiAoYmxvY2stPnJlcXVlc3RfcXVldWUgPT0gTlVMTCkKQEAgLTI5NzYsMTQgKzI5NzIsNyBAQAogCiAJYmxvY2stPnJlcXVlc3RfcXVldWUtPnF1ZXVlZGF0YSA9IGJsb2NrOwogCi0JZWxldmF0b3JfZXhpdChibG9jay0+cmVxdWVzdF9xdWV1ZS0+ZWxldmF0b3IpOwotCWJsb2NrLT5yZXF1ZXN0X3F1ZXVlLT5lbGV2YXRvciA9IE5VTEw7Ci0JbXV0ZXhfbG9jaygmYmxvY2stPnJlcXVlc3RfcXVldWUtPnN5c2ZzX2xvY2spOwotCXJjID0gZWxldmF0b3JfaW5pdChibG9jay0+cmVxdWVzdF9xdWV1ZSwgImRlYWRsaW5lIik7Ci0JaWYgKHJjKQotCQlibGtfY2xlYW51cF9xdWV1ZShibG9jay0+cmVxdWVzdF9xdWV1ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZibG9jay0+cmVxdWVzdF9xdWV1ZS0+c3lzZnNfbG9jayk7Ci0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGlhZy5oIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZGlhZy5oCmluZGV4IGE4MDNjYzcuLmU4NGE1NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2RpYWcuaAorKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9kaWFnLmgKQEAgLTM4LDggKzM4LDYgQEAKIAl1OCByZGV2X2ZlYXR1cmVzOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLCBhbGlnbmVkKDQpKSk7CiAKLQotI2lmZGVmIENPTkZJR182NEJJVAogI2RlZmluZSBEQVNEX0RJQUdfRkxBR0FfREVGQVVMVAkJREFTRF9ESUFHX0ZMQUdBX0ZPUk1BVF82NEJJVAogCiB0eXBlZGVmIHU2NCBibG9ja251bV90OwpAQCAtODAsNDMgKzc4LDMgQEAKIAlzdHJ1Y3QgZGFzZF9kaWFnX2JpbyAqYmlvX2xpc3Q7CiAJdTggIHNwYXJlNFs4XTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCg4KSkpOwotI2Vsc2UgLyogQ09ORklHXzY0QklUICovCi0jZGVmaW5lIERBU0RfRElBR19GTEFHQV9ERUZBVUxUCQkweDAKLQotdHlwZWRlZiB1MzIgYmxvY2tudW1fdDsKLXR5cGVkZWYgczMyIHNibG9ja251bV90OwotCi1zdHJ1Y3QgZGFzZF9kaWFnX2JpbyB7Ci0JdTggdHlwZTsKLQl1OCBzdGF0dXM7Ci0JdTE2IHNwYXJlMTsKLQlibG9ja251bV90IGJsb2NrX251bWJlcjsKLQl1MzIgYWxldDsKLQl2b2lkICpidWZmZXI7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoOCkpKTsKLQotc3RydWN0IGRhc2RfZGlhZ19pbml0X2lvIHsKLQl1MTYgZGV2X25yOwotCXU4IGZsYWdhOwotCXU4IHNwYXJlMVsyMV07Ci0JdTMyIGJsb2NrX3NpemU7Ci0JYmxvY2tudW1fdCBvZmZzZXQ7Ci0Jc2Jsb2NrbnVtX3Qgc3RhcnRfYmxvY2s7Ci0JYmxvY2tudW1fdCBlbmRfYmxvY2s7Ci0JdTggc3BhcmUyWzI0XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCwgYWxpZ25lZCg4KSkpOwotCi1zdHJ1Y3QgZGFzZF9kaWFnX3J3X2lvIHsKLQl1MTYgZGV2X25yOwotCXU4IGZsYWdhOwotCXU4IHNwYXJlMVsyMV07Ci0JdTgga2V5OwotCXU4IGZsYWdzOwotCXU4IHNwYXJlMlsyXTsKLQl1MzIgYmxvY2tfY291bnQ7Ci0JdTMyIGFsZXQ7Ci0Jc3RydWN0IGRhc2RfZGlhZ19iaW8gKmJpb19saXN0OwotCXUzMiBpbnRlcnJ1cHRfcGFyYW1zOwotCXU4IHNwYXJlM1syMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQsIGFsaWduZWQoOCkpKTsKLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwppbmRleCBkNDdmNWI5Li40OWI0OGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCkBAIC0xNjMzLDcgKzE2MzMsNiBAQAogCiBzdGF0aWMgdTMyIGdldF9mY3hfbWF4X2RhdGEoc3RydWN0IGRhc2RfZGV2aWNlICpkZXZpY2UpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfNjRCSVQpCiAJaW50IHRwbSwgbWRjOwogCWludCBmY3hfaW5fY3NzLCBmY3hfaW5fZ25lcSwgZmN4X2luX2ZlYXR1cmVzOwogCXN0cnVjdCBkYXNkX2Vja2RfcHJpdmF0ZSAqcHJpdmF0ZTsKQEAgLTE2NTcsOSArMTY1Niw2IEBACiAJCXJldHVybiAwOwogCX0gZWxzZQogCQlyZXR1cm4gbWRjICogRkNYX01BWF9EQVRBX0ZBQ1RPUjsKLSNlbHNlCi0JcmV0dXJuIDA7Ci0jZW5kaWYKIH0KIAogLyoKQEAgLTI2MTUsMTAgKzI2MTEsOCBAQAogCQkJLyogRWNrZCBjYW4gb25seSBkbyBmdWxsIGJsb2Nrcy4gKi8KIAkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCQljb3VudCArPSBidi5idl9sZW4gPj4gKGJsb2NrLT5zMmJfc2hpZnQgKyA5KTsKLSNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkKIAkJaWYgKGlkYWxfaXNfbmVlZGVkIChwYWdlX2FkZHJlc3MoYnYuYnZfcGFnZSksIGJ2LmJ2X2xlbikpCiAJCQljaWRhdyArPSBidi5idl9sZW4gPj4gKGJsb2NrLT5zMmJfc2hpZnQgKyA5KTsKLSNlbmRpZgogCX0KIAkvKiBQYXJhbm9pYS4gKi8KIAlpZiAoY291bnQgIT0gbGFzdF9yZWMgLSBmaXJzdF9yZWMgKyAxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZmJhLmMgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYwppbmRleCAyYzhlNjhiLi5jOTI2MmU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9mYmEuYwpAQCAtMjg3LDEwICsyODcsOCBAQAogCQkJLyogRmJhIGNhbiBvbmx5IGRvIGZ1bGwgYmxvY2tzLiAqLwogCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJCWNvdW50ICs9IGJ2LmJ2X2xlbiA+PiAoYmxvY2stPnMyYl9zaGlmdCArIDkpOwotI2lmIGRlZmluZWQoQ09ORklHXzY0QklUKQogCQlpZiAoaWRhbF9pc19uZWVkZWQgKHBhZ2VfYWRkcmVzcyhidi5idl9wYWdlKSwgYnYuYnZfbGVuKSkKIAkJCWNpZGF3ICs9IGJ2LmJ2X2xlbiAvIGJsa3NpemU7Ci0jZW5kaWYKIAl9CiAJLyogUGFyYW5vaWEuICovCiAJaWYgKGNvdW50ICE9IGxhc3RfcmVjIC0gZmlyc3RfcmVjICsgMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaGFyL0tjb25maWcgYi9kcml2ZXJzL3MzOTAvY2hhci9LY29uZmlnCmluZGV4IGE1YzZmN2UuLmVhY2EzZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL0tjb25maWcKKysrIGIvZHJpdmVycy9zMzkwL2NoYXIvS2NvbmZpZwpAQCAtMTE1LDcgKzExNSw3IEBACiBjb25maWcgSE1DX0RSVgogCWRlZl90cmlzdGF0ZSBtCiAJcHJvbXB0ICJTdXBwb3J0IGZvciBmaWxlIHRyYW5zZmVycyBmcm9tIEhNQyBkcml2ZSBDRC9EVkQtUk9NIgotCWRlcGVuZHMgb24gUzM5MCAmJiA2NEJJVAorCWRlcGVuZHMgb24gUzM5MAogCXNlbGVjdCBDUkMxNgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgZmlsZSB0cmFuc2ZlcnMgZnJvbSBhIEhhcmR3YXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3NkaWFzLmMgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX3NkaWFzLmMKaW5kZXggNTYxYTA0MS4uZWI3Y2IwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9zZGlhcy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfc2RpYXMuYwpAQCAtMTc4LDExICsxNzgsNyBAQAogCXNjY2IuZXZidWYuZXZlbnRfcXVhbCA9IFNESUFTX0VRX1NUT1JFX0RBVEE7CiAJc2NjYi5ldmJ1Zi5kYXRhX2lkID0gU0RJQVNfRElfRkNQX0RVTVA7CiAJc2NjYi5ldmJ1Zi5ldmVudF9pZCA9IDQ3MTI7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJc2NjYi5ldmJ1Zi5hc2Ffc2l6ZSA9IFNESUFTX0FTQV9TSVpFXzY0OwotI2Vsc2UKLQlzY2NiLmV2YnVmLmFzYV9zaXplID0gU0RJQVNfQVNBX1NJWkVfMzI7Ci0jZW5kaWYKIAlzY2NiLmV2YnVmLmV2ZW50X3N0YXR1cyA9IDA7CiAJc2NjYi5ldmJ1Zi5ibGtfY250ID0gbnJfYmxrczsKIAlzY2NiLmV2YnVmLmFzYSA9ICh1bnNpZ25lZCBsb25nKWRlc3Q7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2hhci96Y29yZS5jIGIvZHJpdmVycy9zMzkwL2NoYXIvemNvcmUuYwppbmRleCBlZmNmNDg0Li5hNjhmY2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2hhci96Y29yZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaGFyL3pjb3JlLmMKQEAgLTIxMiwxMSArMjEyLDcgQEAKIAkuZHVtcF9sZXZlbAk9IDAsCiAJLnBhZ2Vfc2l6ZQk9IFBBR0VfU0laRSwKIAkubWVtX3N0YXJ0CT0gMCwKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAkuYnVpbGRfYXJjaAk9IERVTVBfQVJDSF9TMzkwWCwKLSNlbHNlCi0JLmJ1aWxkX2FyY2gJPSBEVU1QX0FSQ0hfUzM5MCwKLSNlbmRpZgogfTsKIAogLyoKQEAgLTUxNiwyMyArNTEyLDYgQEAKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKIH07CiAKLSNpZmRlZiBDT05GSUdfMzJCSVQKLQotc3RhdGljIHZvaWQgX19pbml0IHNldF9sY19tYXNrKHN0cnVjdCBzYXZlX2FyZWEgKm1hcCkKLXsKLQltZW1zZXQoJm1hcC0+ZXh0X3NhdmUsIDB4ZmYsIHNpemVvZihtYXAtPmV4dF9zYXZlKSk7Ci0JbWVtc2V0KCZtYXAtPnRpbWVyLCAweGZmLCBzaXplb2YobWFwLT50aW1lcikpOwotCW1lbXNldCgmbWFwLT5jbGtfY21wLCAweGZmLCBzaXplb2YobWFwLT5jbGtfY21wKSk7Ci0JbWVtc2V0KCZtYXAtPnBzdywgMHhmZiwgc2l6ZW9mKG1hcC0+cHN3KSk7Ci0JbWVtc2V0KCZtYXAtPnByZWZfcmVnLCAweGZmLCBzaXplb2YobWFwLT5wcmVmX3JlZykpOwotCW1lbXNldCgmbWFwLT5hY2NfcmVncywgMHhmZiwgc2l6ZW9mKG1hcC0+YWNjX3JlZ3MpKTsKLQltZW1zZXQoJm1hcC0+ZnBfcmVncywgMHhmZiwgc2l6ZW9mKG1hcC0+ZnBfcmVncykpOwotCW1lbXNldCgmbWFwLT5ncF9yZWdzLCAweGZmLCBzaXplb2YobWFwLT5ncF9yZWdzKSk7Ci0JbWVtc2V0KCZtYXAtPmN0cmxfcmVncywgMHhmZiwgc2l6ZW9mKG1hcC0+Y3RybF9yZWdzKSk7Ci19Ci0KLSNlbHNlIC8qIENPTkZJR18zMkJJVCAqLwotCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0X2xjX21hc2soc3RydWN0IHNhdmVfYXJlYSAqbWFwKQogewogCW1lbXNldCgmbWFwLT5mcF9yZWdzLCAweGZmLCBzaXplb2YobWFwLT5mcF9yZWdzKSk7CkBAIC01NDcsOCArNTI2LDYgQEAKIAltZW1zZXQoJm1hcC0+Y3RybF9yZWdzLCAweGZmLCBzaXplb2YobWFwLT5jdHJsX3JlZ3MpKTsKIH0KIAotI2VuZGlmIC8qIENPTkZJR18zMkJJVCAqLwotCiAvKgogICogSW5pdGlhbGl6ZSBkdW1wIGdsb2JhbHMgZm9yIGEgZ2l2ZW4gYXJjaGl0ZWN0dXJlCiAgKi8KQEAgLTY4OCwyMSArNjY1LDEyIEBACiAJaWYgKHJjKQogCQlnb3RvIGZhaWw7CiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlpZiAoYXJjaCA9PSBBUkNIX1MzOTApIHsKIAkJcHJfYWxlcnQoIlRoZSA2NC1iaXQgZHVtcCB0b29sIGNhbm5vdCBiZSB1c2VkIGZvciBhICIKIAkJCSAiMzItYml0IHN5c3RlbVxuIik7CiAJCXJjID0gLUVJTlZBTDsKIAkJZ290byBmYWlsOwogCX0KLSNlbHNlIC8qIENPTkZJR182NEJJVCAqLwotCWlmIChhcmNoID09IEFSQ0hfUzM5MFgpIHsKLQkJcHJfYWxlcnQoIlRoZSAzMi1iaXQgZHVtcCB0b29sIGNhbm5vdCBiZSB1c2VkIGZvciBhICIKLQkJCSAiNjQtYml0IHN5c3RlbVxuIik7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBmYWlsOwotCX0KLSNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8KIAogCXJjID0gZ2V0X21lbV9pbmZvKCZtZW1fc2l6ZSwgJm1lbV9lbmQpOwogCWlmIChyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vYmxhY2tsaXN0LmMgYi9kcml2ZXJzL3MzOTAvY2lvL2JsYWNrbGlzdC5jCmluZGV4IGIzZjc5MWIuLjIwMzE0YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vYmxhY2tsaXN0LmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9ibGFja2xpc3QuYwpAQCAtMzMwLDE4ICszMzAsMjAgQEAKIAlpZiAoIWl0ZXItPmluX3JhbmdlKSB7CiAJCS8qIEZpcnN0IGRldmljZSBpbiByYW5nZS4gKi8KIAkJaWYgKChpdGVyLT5kZXZubyA9PSBfX01BWF9TVUJDSEFOTkVMKSB8fAotCQkgICAgIWlzX2JsYWNrbGlzdGVkKGl0ZXItPnNzaWQsIGl0ZXItPmRldm5vICsgMSkpCisJCSAgICAhaXNfYmxhY2tsaXN0ZWQoaXRlci0+c3NpZCwgaXRlci0+ZGV2bm8gKyAxKSkgewogCQkJLyogU2luZ3VsYXIgZGV2aWNlLiAqLwotCQkJcmV0dXJuIHNlcV9wcmludGYocywgIjAuJXguJTA0eFxuIiwKLQkJCQkJICBpdGVyLT5zc2lkLCBpdGVyLT5kZXZubyk7CisJCQlzZXFfcHJpbnRmKHMsICIwLiV4LiUwNHhcbiIsIGl0ZXItPnNzaWQsIGl0ZXItPmRldm5vKTsKKwkJCXJldHVybiAwOworCQl9CiAJCWl0ZXItPmluX3JhbmdlID0gMTsKLQkJcmV0dXJuIHNlcV9wcmludGYocywgIjAuJXguJTA0eC0iLCBpdGVyLT5zc2lkLCBpdGVyLT5kZXZubyk7CisJCXNlcV9wcmludGYocywgIjAuJXguJTA0eC0iLCBpdGVyLT5zc2lkLCBpdGVyLT5kZXZubyk7CisJCXJldHVybiAwOwogCX0KIAlpZiAoKGl0ZXItPmRldm5vID09IF9fTUFYX1NVQkNIQU5ORUwpIHx8CiAJICAgICFpc19ibGFja2xpc3RlZChpdGVyLT5zc2lkLCBpdGVyLT5kZXZubyArIDEpKSB7CiAJCS8qIExhc3QgZGV2aWNlIGluIHJhbmdlLiAqLwogCQlpdGVyLT5pbl9yYW5nZSA9IDA7Ci0JCXJldHVybiBzZXFfcHJpbnRmKHMsICIwLiV4LiUwNHhcbiIsIGl0ZXItPnNzaWQsIGl0ZXItPmRldm5vKTsKKwkJc2VxX3ByaW50ZihzLCAiMC4leC4lMDR4XG4iLCBpdGVyLT5zc2lkLCBpdGVyLT5kZXZubyk7CiAJfQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYyBiL2RyaXZlcnMvczM5MC9jaW8vY2lvLmMKaW5kZXggMzU3ODEwNS4uMDdmYzVkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9jaW8uYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5jCkBAIC0xNDMsMTMgKzE0MywxMSBAQAogCW9yYi0+Y21kLnNwbmQgPSBwcml2LT5vcHRpb25zLnN1c3BlbmQ7CiAJb3JiLT5jbWQuc3NpYyA9IHByaXYtPm9wdGlvbnMuc3VzcGVuZCAmJiBwcml2LT5vcHRpb25zLmludGVyOwogCW9yYi0+Y21kLmxwbSA9IChscG0gIT0gMCkgPyBscG0gOiBzY2gtPmxwbTsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAkvKgogCSAqIGZvciA2NCBiaXQgd2UgYWx3YXlzIHN1cHBvcnQgNjQgYml0IElEQVdzIHdpdGggNGsgcGFnZSBzaXplIG9ubHkKIAkgKi8KIAlvcmItPmNtZC5jNjQgPSAxOwogCW9yYi0+Y21kLmkyayA9IDA7Ci0jZW5kaWYKIAlvcmItPmNtZC5rZXkgPSBrZXkgPj4gNDsKIAkvKiBpc3N1ZSAiU3RhcnQgU3ViY2hhbm5lbCIgKi8KIAlvcmItPmNtZC5jcGEgPSAoX191MzIpIF9fcGEoY3BhKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvLmgKaW5kZXggYTU2M2U0Yy4uN2U3MGY5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvLmgKQEAgLTg0LDcgKzg0LDYgQEAKICNkZWZpbmUgUURJT19TSUdBX1dSSVRFUQkweDA0CiAjZGVmaW5lIFFESU9fU0lHQV9RRUJTTV9GTEFHCTB4ODAKIAotI2lmZGVmIENPTkZJR182NEJJVAogc3RhdGljIGlubGluZSBpbnQgZG9fc3Ficyh1NjQgdG9rZW4sIHVuc2lnbmVkIGNoYXIgc3RhdGUsIGludCBxdWV1ZSwKIAkJCSAgaW50ICpzdGFydCwgaW50ICpjb3VudCkKIHsKQEAgLTEyMiwxMiArMTIxLDYgQEAKIAogCXJldHVybiAoX2NjcSA+PiAzMikgJiAweGZmOwogfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGRvX3NxYnModTY0IHRva2VuLCB1bnNpZ25lZCBjaGFyIHN0YXRlLCBpbnQgcXVldWUsCi0JCQkgIGludCAqc3RhcnQsIGludCAqY291bnQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgaW50IGRvX2VxYnModTY0IHRva2VuLCB1bnNpZ25lZCBjaGFyICpzdGF0ZSwgaW50IHF1ZXVlLAotCQkJICBpbnQgKnN0YXJ0LCBpbnQgKmNvdW50LCBpbnQgYWNrKSB7IHJldHVybiAwOyB9Ci0jZW5kaWYgLyogQ09ORklHXzY0QklUICovCiAKIHN0cnVjdCBxZGlvX2lycTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9xZGlvX3NldHVwLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fc2V0dXAuYwppbmRleCBmNzZiZmY2Li40OGIzODY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fc2V0dXAuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fc2V0dXAuYwpAQCAtOTEsMTAgKzkxLDcgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgcWVic21fcG9zc2libGUodm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlyZXR1cm4gY3NzX2dlbmVyYWxfY2hhcmFjdGVyaXN0aWNzLnFlYnNtOwotI2VuZGlmCi0JcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jIGIvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYwppbmRleCAzZDdmMTlmLi5mMGI5ODcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCisrKyBiL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKQEAgLTE2NSw3ICsxNjUsNyBAQAogICovCiBzdGF0aWMgaW50IGFwX2ludGVycnVwdHNfYXZhaWxhYmxlKHZvaWQpCiB7Ci0JcmV0dXJuIHRlc3RfZmFjaWxpdHkoMikgJiYgdGVzdF9mYWNpbGl0eSg2NSk7CisJcmV0dXJuIHRlc3RfZmFjaWxpdHkoNjUpOwogfQogCiAvKioKQEAgLTE3NCwxMiArMTc0LDEwIEBACiAgKgogICogUmV0dXJucyAxIGlmIEFQIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgogICovCi0jaWZkZWYgQ09ORklHXzY0QklUCiBzdGF0aWMgaW50IGFwX2NvbmZpZ3VyYXRpb25fYXZhaWxhYmxlKHZvaWQpCiB7Ci0JcmV0dXJuIHRlc3RfZmFjaWxpdHkoMikgJiYgdGVzdF9mYWNpbGl0eSgxMik7CisJcmV0dXJuIHRlc3RfZmFjaWxpdHkoMTIpOwogfQotI2VuZGlmCiAKIC8qKgogICogYXBfdGVzdF9xdWV1ZSgpOiBUZXN0IGFkanVuY3QgcHJvY2Vzc29yIHF1ZXVlLgpAQCAtMjM5LDcgKzIzNyw2IEBACiAJcmV0dXJuIHJlZzE7CiB9CiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKIC8qKgogICogYXBfcXVldWVfaW50ZXJydXB0aW9uX2NvbnRyb2woKTogRW5hYmxlIGludGVycnVwdGlvbiBmb3IgYSBzcGVjaWZpYyBBUC4KICAqIEBxaWQ6IFRoZSBBUCBxdWV1ZSBudW1iZXIKQEAgLTI2MSw5ICsyNTgsNyBAQAogCQk6ICJjYyIgKTsKIAlyZXR1cm4gcmVnMV9vdXQ7CiB9Ci0jZW5kaWYKIAotI2lmZGVmIENPTkZJR182NEJJVAogc3RhdGljIGlubGluZSBzdHJ1Y3QgYXBfcXVldWVfc3RhdHVzCiBfX2FwX3F1ZXJ5X2Z1bmN0aW9ucyhhcF9xaWRfdCBxaWQsIHVuc2lnbmVkIGludCAqZnVuY3Rpb25zKQogewpAQCAtMjgyLDkgKzI3Nyw3IEBACiAJKmZ1bmN0aW9ucyA9ICh1bnNpZ25lZCBpbnQpKHJlZzIgPj4gMzIpOwogCXJldHVybiByZWcxOwogfQotI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfNjRCSVQKIHN0YXRpYyBpbmxpbmUgaW50IF9fYXBfcXVlcnlfY29uZmlndXJhdGlvbihzdHJ1Y3QgYXBfY29uZmlnX2luZm8gKmNvbmZpZykKIHsKIAlyZWdpc3RlciB1bnNpZ25lZCBsb25nIHJlZzAgYXNtICgiMCIpID0gMHgwNDAwMDAwMFVMOwpAQCAtMzAyLDcgKzI5NSw2IEBACiAKIAlyZXR1cm4gcmVnMTsKIH0KLSNlbmRpZgogCiAvKioKICAqIGFwX3F1ZXJ5X2Z1bmN0aW9ucygpOiBRdWVyeSBzdXBwb3J0ZWQgZnVuY3Rpb25zLgpAQCAtMzE3LDcgKzMwOSw2IEBACiAgKi8KIHN0YXRpYyBpbnQgYXBfcXVlcnlfZnVuY3Rpb25zKGFwX3FpZF90IHFpZCwgdW5zaWduZWQgaW50ICpmdW5jdGlvbnMpCiB7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJc3RydWN0IGFwX3F1ZXVlX3N0YXR1cyBzdGF0dXM7CiAJaW50IGk7CiAJc3RhdHVzID0gX19hcF9xdWVyeV9mdW5jdGlvbnMocWlkLCBmdW5jdGlvbnMpOwpAQCAtMzQ4LDkgKzMzOSw2IEBACiAJCX0KIAl9CiAJcmV0dXJuIC1FQlVTWTsKLSNlbHNlCi0JcmV0dXJuIC1FSU5WQUw7Ci0jZW5kaWYKIH0KIAogLyoqCkBAIC0zNjQsNyArMzUyLDYgQEAKICAqLwogc3RhdGljIGludCBhcF9xdWV1ZV9lbmFibGVfaW50ZXJydXB0aW9uKGFwX3FpZF90IHFpZCwgdm9pZCAqaW5kKQogewotI2lmZGVmIENPTkZJR182NEJJVAogCXN0cnVjdCBhcF9xdWV1ZV9zdGF0dXMgc3RhdHVzOwogCWludCB0X2RlcHRoLCB0X2RldmljZV90eXBlLCByYywgaTsKIApAQCAtNDA0LDkgKzM5MSw2IEBACiAJCX0KIAl9CiAJcmV0dXJuIHJjOwotI2Vsc2UKLQlyZXR1cm4gLUVJTlZBTDsKLSNlbmRpZgogfQogCiAvKioKQEAgLTEyMzgsNyArMTIyMiw2IEBACiAgKi8KIHN0YXRpYyB2b2lkIGFwX3F1ZXJ5X2NvbmZpZ3VyYXRpb24odm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfNjRCSVQKIAlpZiAoYXBfY29uZmlndXJhdGlvbl9hdmFpbGFibGUoKSkgewogCQlpZiAoIWFwX2NvbmZpZ3VyYXRpb24pCiAJCQlhcF9jb25maWd1cmF0aW9uID0KQEAgLTEyNDgsOSArMTIzMSw2IEBACiAJCQlfX2FwX3F1ZXJ5X2NvbmZpZ3VyYXRpb24oYXBfY29uZmlndXJhdGlvbik7CiAJfSBlbHNlCiAJCWFwX2NvbmZpZ3VyYXRpb24gPSBOVUxMOwotI2Vsc2UKLQlhcF9jb25maWd1cmF0aW9uID0gTlVMTDsKLSNlbmRpZgogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvS2NvbmZpZyBiL2RyaXZlcnMvczM5MC9uZXQvS2NvbmZpZwppbmRleCBmMWI1MTExLi5iMjgzN2IxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9zMzkwL25ldC9LY29uZmlnCkBAIC01NywxNyArNTcsNiBAQAogCiAJICBUbyBjb21waWxlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTS4gVGhlIG1vZHVsZSBuYW1lIGlzICJzbXNnaXVjdl9hcHAiLgogCi1jb25maWcgQ0xBVwotCWRlZl90cmlzdGF0ZSBtCi0JcHJvbXB0ICJDTEFXIGRldmljZSBzdXBwb3J0IgotCWRlcGVuZHMgb24gQ0NXICYmIE5FVERFVklDRVMKLQloZWxwCi0JICBUaGlzIGRyaXZlciBzdXBwb3J0cyBjaGFubmVsIGF0dGFjaGVkIENMQVcgZGV2aWNlcy4KLQkgIENMQVcgaXMgQ29tbW9uIExpbmsgQWNjZXNzIGZvciBXb3Jrc3RhdGlvbi4gIENvbW1vbiBkZXZpY2VzCi0gICAgICAgICAgdGhhdCB1c2UgQ0xBVyBhcmUgUlMvNjAwMHMsIENpc2NvIFJvdXRlcnMgKENJUCkgYW5kIDMxNzIgZGV2aWNlcy4KLQkgIFRvIGNvbXBpbGUgYXMgYSBtb2R1bGUsIGNob29zZSBNLiBUaGUgbW9kdWxlIG5hbWUgaXMgY2xhdy4KLQkgIFRvIGNvbXBpbGUgaW50byB0aGUga2VybmVsLCBjaG9vc2UgWS4KLQogY29uZmlnIFFFVEgKIAlkZWZfdHJpc3RhdGUgeQogCXByb21wdCAiR2lnYWJpdCBFdGhlcm5ldCBkZXZpY2Ugc3VwcG9ydCIKQEAgLTEwNiw2ICs5NSw2IEBACiAKIGNvbmZpZyBDQ1dHUk9VUAogCXRyaXN0YXRlCi0JZGVmYXVsdCAoTENTIHx8IENUQ00gfHwgUUVUSCB8fCBDTEFXKQorCWRlZmF1bHQgKExDUyB8fCBDVENNIHx8IFFFVEgpCiAKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9uZXQvTWFrZWZpbGUgYi9kcml2ZXJzL3MzOTAvbmV0L01ha2VmaWxlCmluZGV4IGQyOGYwNWQuLmMzNTFiMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zMzkwL25ldC9NYWtlZmlsZQpAQCAtOCw3ICs4LDYgQEAKIG9iai0kKENPTkZJR19TTVNHSVVDVikgKz0gc21zZ2l1Y3Yubwogb2JqLSQoQ09ORklHX1NNU0dJVUNWX0VWRU5UKSArPSBzbXNnaXVjdl9hcHAubwogb2JqLSQoQ09ORklHX0xDUykgKz0gbGNzLm8KLW9iai0kKENPTkZJR19DTEFXKSArPSBjbGF3Lm8KIHFldGgteSArPSBxZXRoX2NvcmVfc3lzLm8gcWV0aF9jb3JlX21haW4ubyBxZXRoX2NvcmVfbXBjLm8KIG9iai0kKENPTkZJR19RRVRIKSArPSBxZXRoLm8KIHFldGhfbDIteSArPSBxZXRoX2wyX21haW4ubyBxZXRoX2wyX3N5cy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuYyBiL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjA5Y2EwLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzM3NyArMCwwIEBACi0vKgotICogICAgRVNDT04gQ0xBVyBuZXR3b3JrIGRyaXZlcgotICoKLSAqICBMaW51eCBmb3IgelNlcmllcyB2ZXJzaW9uCi0gKiAgICBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDIsIDIwMDkKLSAqICBBdXRob3IocykgT3JpZ2luYWwgY29kZSB3cml0dGVuIGJ5OgotICoJCUthenVvIElpbXVyYSA8aWltdXJhQGpwLmlibS5jb20+Ci0gKiAgIAkgICAgICBSZXdyaXR0ZW4gYnkKLSAqCQlBbmR5IFJpY2h0ZXIgPHJpY2h0ZXJhQHVzLmlibS5jb20+Ci0gKgkJTWFyYyBQcmljZSA8bXdwcmljZUB1cy5pYm0uY29tPgotICoKLSAqICAgIHN5c2ZzIHBhcm1zOgotICogICBncm91cCB4LngucnJycix4Lngud3d3dwotICogICByZWFkX2J1ZmZlciBubm5ubm5uCi0gKiAgIHdyaXRlX2J1ZmZlciBubm5ubm4KLSAqICAgaG9zdF9uYW1lICBhYWFhYWFhYQotICogICBhZGFwdGVyX25hbWUgYWFhYWFhYWEKLSAqICAgYXBpX3R5cGUgICAgYWFhYWFhYWEKLSAqCi0gKiAgZWcuCi0gKiAgIGdyb3VwICAwLjAuMDIwMCAwLjAuMDIwMQotICogICByZWFkX2J1ZmZlciAyNQotICogICB3cml0ZV9idWZmZXIgMjAKLSAqICAgaG9zdF9uYW1lIExJTlVYMzkwCi0gKiAgIGFkYXB0ZXJfbmFtZSBSUzZLCi0gKiAgIGFwaV90eXBlICAgICBUQ1BJUAotICoKLSAqICB3aGVyZQotICoKLSAqICAgVGhlIGRldmljZSBpZCBpcyBkZWNpZGVkIGJ5IHRoZSBvcmRlciBlbnRyaWVzCi0gKiAgIGFyZSBhZGRlZCB0byB0aGUgZ3JvdXAgdGhlIGZpcnN0IGlzIGNsYXcwIHRoZSBzZWNvbmQgY2xhdzEKLSAqICAgdXAgdG8gQ0xBV19NQVhfREVWCi0gKgotICogICBycnJyICAgICAtCXRoZSBmaXJzdCBvZiAyIGNvbnNlY3V0aXZlIGRldmljZSBhZGRyZXNzZXMgdXNlZCBmb3IgdGhlCi0gKgkJQ0xBVyBwcm90b2NvbC4KLSAqCQlUaGUgc3BlY2lmaWVkIGFkZHJlc3MgaXMgYWx3YXlzIHVzZWQgYXMgdGhlIGlucHV0IChSZWFkKQotICoJCWNoYW5uZWwgYW5kIHRoZSBuZXh0IGFkZHJlc3MgaXMgdXNlZCBhcyB0aGUgb3V0cHV0IGNoYW5uZWwuCi0gKgotICogICB3d3d3ICAgICAtCXRoZSBzZWNvbmQgb2YgMiBjb25zZWN1dGl2ZSBkZXZpY2UgYWRkcmVzc2VzIHVzZWQgZm9yCi0gKgkJdGhlIENMQVcgcHJvdG9jb2wuCi0gKiAgICAgICAgICAgICAgVGhlIHNwZWNpZmllZCBhZGRyZXNzIGlzIGFsd2F5cyB1c2VkIGFzIHRoZSBvdXRwdXQKLSAqCQljaGFubmVsIGFuZCB0aGUgcHJldmlvdXMgYWRkcmVzcyBpcyB1c2VkIGFzIHRoZSBpbnB1dCBjaGFubmVsLgotICoKLSAqICAgcmVhZF9idWZmZXIJLSAgICAgICBzcGVjaWZpZXMgbnVtYmVyIG9mIGlucHV0IGJ1ZmZlcnMgdG8gYWxsb2NhdGUuCi0gKiAgIHdyaXRlX2J1ZmZlciAgICAgICAtICAgICAgIHNwZWNpZmllcyBudW1iZXIgb2Ygb3V0cHV0IGJ1ZmZlcnMgdG8gYWxsb2NhdGUuCi0gKiAgIGhvc3RfbmFtZSAgICAgICAgICAtICAgICAgIGhvc3QgbmFtZQotICogICBhZGFwdG9yX25hbWUgICAgICAgLSAgICAgICBhZGFwdG9yIG5hbWUKLSAqICAgYXBpX3R5cGUgICAgICAgICAgIC0gICAgICAgQVBJIHR5cGUgVENQSVAgb3IgQVBJIHdpbGwgYmUgc2VudCBhbmQgZXhwZWN0ZWQKLSAqCQkJCWFzIHdzX25hbWUKLSAqCi0gKiAgIE5vdGUgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHM6Ci0gKiAgIDEpICBob3N0X25hbWUgbXVzdCBtYXRjaCB0aGUgY29uZmlndXJlZCBhZGFwdGVyX25hbWUgb24gdGhlIHJlbW90ZSBzaWRlCi0gKiAgIDIpICBhZGFwdG9yX25hbWUgbXVzdCBtYXRjaCB0aGUgY29uZmlndXJlZCBob3N0IG5hbWUgb24gdGhlIHJlbW90ZSBzaWRlCi0gKgotICogIENoYW5nZSBIaXN0b3J5Ci0gKiAgICAxLjAwICBJbml0aWFsIHJlbGVhc2Ugc2hpcHBlZAotICogICAgMS4xMCAgQ2hhbmdlcyBmb3IgQnVmZmVyIGFsbG9jYXRpb24KLSAqICAgIDEuMTUgIENoYW5nZWQgZm9yIDIuNiBLZXJuZWwgIE5vIGxvbmdlciBjb21waWxlcyBvbiAyLjQgb3IgbG93ZXIKLSAqICAgIDEuMjUgIEFkZGVkIFBhY2tpbmcgc3VwcG9ydAotICogICAgMS41Ci0gKi8KLQotI2RlZmluZSBLTVNHX0NPTVBPTkVOVCAiY2xhdyIKLQotI2luY2x1ZGUgPGFzbS9jY3dkZXYuaD4KLSNpbmNsdWRlIDxhc20vY2N3Z3JvdXAuaD4KLSNpbmNsdWRlIDxhc20vZGVidWcuaD4KLSNpbmNsdWRlIDxhc20vaWRhbHMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLSNpbmNsdWRlICJjbGF3LmgiCi0KLS8qCi0gICBDTEFXIHVzZXMgdGhlIHMzOTBkYmYgZmlsZSBzeXN0ZW0gIHNlZSBjbGF3X3RyYWNlIGFuZCBjbGF3X3NldHVwCi0qLwotCi1zdGF0aWMgY2hhciB2ZXJzaW9uW10gX19pbml0ZGF0YSA9ICJDTEFXIGRyaXZlciI7Ci1zdGF0aWMgY2hhciBkZWJ1Z19idWZmZXJbMjU1XTsKLS8qKgotICogRGVidWcgRmFjaWxpdHkgU3R1ZmYKLSAqLwotc3RhdGljIGRlYnVnX2luZm9fdCAqY2xhd19kYmZfc2V0dXA7Ci1zdGF0aWMgZGVidWdfaW5mb190ICpjbGF3X2RiZl90cmFjZTsKLQotLyoqCi0gKiAgQ0xBVyBEZWJ1ZyBGYWNpbGl0eSBmdW5jdGlvbnMKLSAqLwotc3RhdGljIHZvaWQKLWNsYXdfdW5yZWdpc3Rlcl9kZWJ1Z19mYWNpbGl0eSh2b2lkKQotewotCWRlYnVnX3VucmVnaXN0ZXIoY2xhd19kYmZfc2V0dXApOwotCWRlYnVnX3VucmVnaXN0ZXIoY2xhd19kYmZfdHJhY2UpOwotfQotCi1zdGF0aWMgaW50Ci1jbGF3X3JlZ2lzdGVyX2RlYnVnX2ZhY2lsaXR5KHZvaWQpCi17Ci0JY2xhd19kYmZfc2V0dXAgPSBkZWJ1Z19yZWdpc3RlcigiY2xhd19zZXR1cCIsIDIsIDEsIDgpOwotCWNsYXdfZGJmX3RyYWNlID0gZGVidWdfcmVnaXN0ZXIoImNsYXdfdHJhY2UiLCAyLCAyLCA4KTsKLQlpZiAoY2xhd19kYmZfc2V0dXAgPT0gTlVMTCB8fCBjbGF3X2RiZl90cmFjZSA9PSBOVUxMKSB7Ci0JCWNsYXdfdW5yZWdpc3Rlcl9kZWJ1Z19mYWNpbGl0eSgpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JZGVidWdfcmVnaXN0ZXJfdmlldyhjbGF3X2RiZl9zZXR1cCwgJmRlYnVnX2hleF9hc2NpaV92aWV3KTsKLQlkZWJ1Z19zZXRfbGV2ZWwoY2xhd19kYmZfc2V0dXAsIDIpOwotCWRlYnVnX3JlZ2lzdGVyX3ZpZXcoY2xhd19kYmZfdHJhY2UsICZkZWJ1Z19oZXhfYXNjaWlfdmlldyk7Ci0JZGVidWdfc2V0X2xldmVsKGNsYXdfZGJmX3RyYWNlLCAyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1jbGF3X3NldF9idXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0gKChzdHJ1Y3QgY2xhd19wcml2YmsgKilkZXYtPm1sX3ByaXYpLT50YnVzeSA9IDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotY2xhd19jbGVhcl9idXN5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JY2xlYXJfYml0KDAsICYoKChzdHJ1Y3QgY2xhd19wcml2YmsgKikgZGV2LT5tbF9wcml2KS0+dGJ1c3kpKTsKLQluZXRpZl93YWtlX3F1ZXVlKGRldik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1jbGF3X2NoZWNrX2J1c3koc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gKChzdHJ1Y3QgY2xhd19wcml2YmsgKikgZGV2LT5tbF9wcml2KS0+dGJ1c3k7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotY2xhd19zZXRiaXRfYnVzeShpbnQgbnIsc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQluZXRpZl9zdG9wX3F1ZXVlKGRldik7Ci0Jc2V0X2JpdChuciwgKHZvaWQgKikmKCgoc3RydWN0IGNsYXdfcHJpdmJrICopZGV2LT5tbF9wcml2KS0+dGJ1c3kpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1jbGF3X2NsZWFyYml0X2J1c3koaW50IG5yLHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JY2xlYXJfYml0KG5yLCAodm9pZCAqKSYoKChzdHJ1Y3QgY2xhd19wcml2YmsgKilkZXYtPm1sX3ByaXYpLT50YnVzeSkpOwotCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWNsYXdfdGVzdF9hbmRfc2V0Yml0X2J1c3koaW50IG5yLHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KG5yLAotCQkodm9pZCAqKSYoKChzdHJ1Y3QgY2xhd19wcml2YmsgKikgZGV2LT5tbF9wcml2KS0+dGJ1c3kpKTsKLX0KLQotCi0vKiBGdW5jdGlvbnMgZm9yIHRoZSBERVYgbWV0aG9kcyAqLwotCi1zdGF0aWMgaW50IGNsYXdfcHJvYmUoc3RydWN0IGNjd2dyb3VwX2RldmljZSAqY2dkZXYpOwotc3RhdGljIHZvaWQgY2xhd19yZW1vdmVfZGV2aWNlKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmNnZGV2KTsKLXN0YXRpYyB2b2lkIGNsYXdfcHVyZ2Vfc2tiX3F1ZXVlKHN0cnVjdCBza19idWZmX2hlYWQgKnEpOwotc3RhdGljIGludCBjbGF3X25ld19kZXZpY2Uoc3RydWN0IGNjd2dyb3VwX2RldmljZSAqY2dkZXYpOwotc3RhdGljIGludCBjbGF3X3NodXRkb3duX2RldmljZShzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpjZ2Rldik7Ci1zdGF0aWMgaW50IGNsYXdfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IGNsYXdfY2hhbmdlX210dSggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG5ld19tdHUpOwotc3RhdGljIGludCBjbGF3X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBjbGF3X2lycV9oYW5kbGVyKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LAotCXVuc2lnbmVkIGxvbmcgaW50cGFybSwgc3RydWN0IGlyYiAqaXJiKTsKLXN0YXRpYyB2b2lkIGNsYXdfaXJxX3Rhc2tsZXQgKCB1bnNpZ25lZCBsb25nIGRhdGEgKTsKLXN0YXRpYyBpbnQgY2xhd19yZWxlYXNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgY2xhd193cml0ZV9yZXRyeSAoIHN0cnVjdCBjaGJrICogcF9jaCApOwotc3RhdGljIHZvaWQgY2xhd193cml0ZV9uZXh0ICggc3RydWN0IGNoYmsgKiBwX2NoICk7Ci1zdGF0aWMgdm9pZCBjbGF3X3RpbWVyICggc3RydWN0IGNoYmsgKiBwX2NoICk7Ci0KLS8qIEZ1bmN0aW9ucyAqLwotc3RhdGljIGludCBhZGRfY2xhd19yZWFkcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCXN0cnVjdCBjY3diayogcF9maXJzdCwgc3RydWN0IGNjd2JrKiBwX2xhc3QpOwotc3RhdGljIHZvaWQgY2N3X2NoZWNrX3JldHVybl9jb2RlIChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgaW50IHJldHVybl9jb2RlKTsKLXN0YXRpYyB2b2lkIGNjd19jaGVja191bml0X2NoZWNrIChzdHJ1Y3QgY2hiayAqIHBfY2gsIHVuc2lnbmVkIGNoYXIgc2Vuc2UgKTsKLXN0YXRpYyBpbnQgZmluZF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmhvc3RfbmFtZSwgY2hhciAqd3NfbmFtZSApOwotc3RhdGljIGludCBjbGF3X2h3X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGxvbmcgbGlua2lkKTsKLXN0YXRpYyBpbnQgaW5pdF9jY3dfYmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBwcm9iZV9lcnJvciggc3RydWN0IGNjd2dyb3VwX2RldmljZSAqY2dkZXYpOwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpjbGF3X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotc3RhdGljIGludCBwYWdlc190b19vcmRlcl9vZl9tYWcoaW50IG51bV9vZl9wYWdlcyk7Ci1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmNsYXdfcGFja19za2Ioc3RydWN0IGNsYXdfcHJpdmJrICpwcml2cHRyKTsKLS8qIHN5c2ZzIEZ1bmN0aW9ucyAqLwotc3RhdGljIHNzaXplX3QgY2xhd19obmFtZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKLXN0YXRpYyBzc2l6ZV90IGNsYXdfaG5hbWVfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLXN0YXRpYyBzc2l6ZV90IGNsYXdfYWRuYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOwotc3RhdGljIHNzaXplX3QgY2xhd19hZG5hbWVfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLXN0YXRpYyBzc2l6ZV90IGNsYXdfYXBuYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOwotc3RhdGljIHNzaXplX3QgY2xhd19hcG5hbWVfd3JpdGUoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKLXN0YXRpYyBzc2l6ZV90IGNsYXdfd2J1ZmZfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7Ci1zdGF0aWMgc3NpemVfdCBjbGF3X3didWZmX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7Ci1zdGF0aWMgc3NpemVfdCBjbGF3X3JidWZmX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOwotc3RhdGljIHNzaXplX3QgY2xhd19yYnVmZl93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwotCi0vKiAgIEZ1bmN0aW9ucyBmb3IgU3lzdGVtIFZhbGlkYXRlICAqLwotc3RhdGljIGludCBjbGF3X3Byb2Nlc3NfY29udHJvbCggc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNjd2JrICogcF9jY3cpOwotc3RhdGljIGludCBjbGF3X3NlbmRfY29udHJvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3U4IHR5cGUsIF9fdTggbGluaywKLSAgICAgICBfX3U4IGNvcnJlbGF0b3IsIF9fdTggcmMgLCBjaGFyICpsb2NhbF9uYW1lLCBjaGFyICpyZW1vdGVfbmFtZSk7Ci1zdGF0aWMgaW50IGNsYXdfc25kX2Nvbm5fcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTggbGluayk7Ci1zdGF0aWMgaW50IGNsYXdfc25kX2Rpc2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNsYXdjdGwgKiBwX2N0bCk7Ci1zdGF0aWMgaW50IGNsYXdfc25kX3N5c192YWxpZGF0ZV9yc3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLSAgICAgICAgc3RydWN0IGNsYXdjdGwgKiBwX2N0bCwgX191MzIgcmV0dXJuX2NvZGUpOwotc3RhdGljIGludCBjbGF3X3N0cnRfY29ubl9yZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiApOwotc3RhdGljIHZvaWQgY2xhd19zdHJ0X3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGxvY2spOwotc3RhdGljIHZvaWQgY2xhd19zdHJ0X291dF9JTyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXN0YXRpYyB2b2lkIGNsYXdfZnJlZV93cnRfYnVmKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotCi0vKiBGdW5jdGlvbnMgZm9yIHVucGFjayByZWFkcyAgICovCi1zdGF0aWMgdm9pZCB1bnBhY2tfcmVhZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLQotc3RhdGljIGludCBjbGF3X3BtX3ByZXBhcmUoc3RydWN0IGNjd2dyb3VwX2RldmljZSAqZ2RldikKLXsKLQlyZXR1cm4gLUVQRVJNOwotfQotCi0vKiB0aGUgcm9vdCBkZXZpY2UgZm9yIGNsYXcgZ3JvdXAgZGV2aWNlcyAqLwotc3RhdGljIHN0cnVjdCBkZXZpY2UgKmNsYXdfcm9vdF9kZXY7Ci0KLS8qIGNjd2dyb3VwIHRhYmxlICAqLwotCi1zdGF0aWMgc3RydWN0IGNjd2dyb3VwX2RyaXZlciBjbGF3X2dyb3VwX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkub3duZXIJPSBUSElTX01PRFVMRSwKLQkJLm5hbWUJPSAiY2xhdyIsCi0JfSwKLQkuc2V0dXAJICAgICA9IGNsYXdfcHJvYmUsCi0JLnJlbW92ZSAgICAgID0gY2xhd19yZW1vdmVfZGV2aWNlLAotCS5zZXRfb25saW5lICA9IGNsYXdfbmV3X2RldmljZSwKLQkuc2V0X29mZmxpbmUgPSBjbGF3X3NodXRkb3duX2RldmljZSwKLQkucHJlcGFyZSAgICAgPSBjbGF3X3BtX3ByZXBhcmUsCi19OwotCi1zdGF0aWMgc3RydWN0IGNjd19kZXZpY2VfaWQgY2xhd19pZHNbXSA9IHsKLQl7Q0NXX0RFVklDRSgweDMwODgsIDB4NjEpLCAuZHJpdmVyX2luZm8gPSBjbGF3X2NoYW5uZWxfdHlwZV9jbGF3fSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKGNjdywgY2xhd19pZHMpOwotCi1zdGF0aWMgc3RydWN0IGNjd19kcml2ZXIgY2xhd19jY3dfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5vd25lcgk9IFRISVNfTU9EVUxFLAotCQkubmFtZQk9ICJjbGF3IiwKLQl9LAotCS5pZHMJPSBjbGF3X2lkcywKLQkucHJvYmUJPSBjY3dncm91cF9wcm9iZV9jY3dkZXYsCi0JLnJlbW92ZQk9IGNjd2dyb3VwX3JlbW92ZV9jY3dkZXYsCi0JLmludF9jbGFzcyA9IElSUUlPX0NMVywKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IGNsYXdfZHJpdmVyX2dyb3VwX3N0b3JlKHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkZHJ2LAotCQkJCSAgICAgICBjb25zdCBjaGFyICpidWYsCXNpemVfdCBjb3VudCkKLXsKLQlpbnQgZXJyOwotCWVyciA9IGNjd2dyb3VwX2NyZWF0ZV9kZXYoY2xhd19yb290X2RldiwgJmNsYXdfZ3JvdXBfZHJpdmVyLCAyLCBidWYpOwotCXJldHVybiBlcnIgPyBlcnIgOiBjb3VudDsKLX0KLXN0YXRpYyBEUklWRVJfQVRUUihncm91cCwgMDIwMCwgTlVMTCwgY2xhd19kcml2ZXJfZ3JvdXBfc3RvcmUpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqY2xhd19kcnZfYXR0cnNbXSA9IHsKLQkmZHJpdmVyX2F0dHJfZ3JvdXAuYXR0ciwKLQlOVUxMLAotfTsKLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGNsYXdfZHJ2X2F0dHJfZ3JvdXAgPSB7Ci0JLmF0dHJzID0gY2xhd19kcnZfYXR0cnMsCi19Owotc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmNsYXdfZHJ2X2F0dHJfZ3JvdXBzW10gPSB7Ci0JJmNsYXdfZHJ2X2F0dHJfZ3JvdXAsCi0JTlVMTCwKLX07Ci0KLS8qCi0qICAgICAgIEtleSBmdW5jdGlvbnMKLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqICAgY2xhd190eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQKLWNsYXdfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLSAgICAgICAgaW50ICAgICAgICAgICAgIHJjOwotCXN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdnB0ciA9IGRldi0+bWxfcHJpdjsKLQl1bnNpZ25lZCBsb25nIHNhdmVmbGFnczsKLSAgICAgICAgc3RydWN0IGNoYmsgKnBfY2g7Ci0KLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiY2xhd190eCIpOwotCXBfY2ggPSAmcHJpdnB0ci0+Y2hhbm5lbFtXUklURV9DSEFOTkVMXTsKLSAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoZ2V0X2Njd2Rldl9sb2NrKHBfY2gtPmNkZXYpLCBzYXZlZmxhZ3MpOwotICAgICAgICByYz1jbGF3X2h3X3R4KCBza2IsIGRldiwgMSApOwotICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKGdldF9jY3dkZXZfbG9jayhwX2NoLT5jZGV2KSwgc2F2ZWZsYWdzKTsKLQlDTEFXX0RCRl9URVhUXyg0LCB0cmFjZSwgImNsYXd0eCVkIiwgcmMpOwotCWlmIChyYykKLQkJcmMgPSBORVRERVZfVFhfQlVTWTsKLQllbHNlCi0JCXJjID0gTkVUREVWX1RYX09LOwotICAgICAgICByZXR1cm4gcmM7Ci19ICAgLyogIGVuZCBvZiBjbGF3X3R4ICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogIHBhY2sgdGhlIGNvbGxlY3QgcXVldWUgaW50byBhbiBza2IgYW5kIHJldHVybiBpdCAgICAgICAgICAgICAgICAqCi0gKiAgIElmIG5vdCBwYWNraW5nIGp1c3QgcmV0dXJuIHRoZSB0b3Agc2tiIGZyb20gdGhlIHF1ZXVlICAgICAgICAgICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHN0cnVjdCBza19idWZmICoKLWNsYXdfcGFja19za2Ioc3RydWN0IGNsYXdfcHJpdmJrICpwcml2cHRyKQotewotCXN0cnVjdCBza19idWZmICpuZXdfc2tiLCpoZWxkX3NrYjsKLQlzdHJ1Y3QgY2hiayAqcF9jaCA9ICZwcml2cHRyLT5jaGFubmVsW1dSSVRFX0NIQU5ORUxdOwotCXN0cnVjdCBjbGF3X2VudiAgKnBfZW52ID0gcHJpdnB0ci0+cF9lbnY7Ci0JaW50CXBrdF9jbnQscGtfaW5kLHNvX2ZhcjsKLQotCW5ld19za2IgPSBOVUxMOwkJLyogYXNzdW1lIG5vIGRpY2UgKi8KLQlwa3RfY250ID0gMDsKLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiUGFja1NLQmUiKTsKLQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmcF9jaC0+Y29sbGVjdF9xdWV1ZSkpIHsKLQkvKiBzb21lIGRhdGEgKi8KLQkJaGVsZF9za2IgPSBza2JfZGVxdWV1ZSgmcF9jaC0+Y29sbGVjdF9xdWV1ZSk7Ci0JCWlmIChoZWxkX3NrYikKLQkJCWRldl9rZnJlZV9za2JfYW55KGhlbGRfc2tiKTsKLQkJZWxzZQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmIChwX2Vudi0+cGFja2luZyAhPSBET19QQUNLRUQpCi0JCQlyZXR1cm4gaGVsZF9za2I7Ci0JCS8qIGdldCBhIG5ldyBTS0Igd2Ugd2lsbCBwYWNrIGF0IGxlYXN0IG9uZSAqLwotCQluZXdfc2tiID0gZGV2X2FsbG9jX3NrYihwX2Vudi0+d3JpdGVfc2l6ZSk7Ci0JCWlmIChuZXdfc2tiID09IE5VTEwpIHsKLQkJCWF0b21pY19pbmMoJmhlbGRfc2tiLT51c2Vycyk7Ci0JCQlza2JfcXVldWVfaGVhZCgmcF9jaC0+Y29sbGVjdF9xdWV1ZSxoZWxkX3NrYik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCQkvKiB3ZSBoYXZlIHBhY2tlZCBwYWNrZXQgYW5kIGEgcGxhY2UgdG8gcHV0IGl0ICAqLwotCQlwa19pbmQgPSAxOwotCQlzb19mYXIgPSAwOwotCQluZXdfc2tiLT5jYlsxXSA9ICdQJzsgLyogZXZlcnkgc2tiIG9uIHF1ZXVlIGhhcyBwYWNrIGhlYWRlciAqLwotCQl3aGlsZSAoKHBrX2luZCkgJiYgKGhlbGRfc2tiICE9IE5VTEwpKSB7Ci0JCQlpZiAoaGVsZF9za2ItPmxlbitzb19mYXIgPD0gcF9lbnYtPndyaXRlX3NpemUtOCkgewotCQkJCW1lbWNweShza2JfcHV0KG5ld19za2IsaGVsZF9za2ItPmxlbiksCi0JCQkJCWhlbGRfc2tiLT5kYXRhLGhlbGRfc2tiLT5sZW4pOwotCQkJCXByaXZwdHItPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJCQlzb19mYXIgKz0gaGVsZF9za2ItPmxlbjsKLQkJCQlwa3RfY250Kys7Ci0JCQkJZGV2X2tmcmVlX3NrYl9hbnkoaGVsZF9za2IpOwotCQkJCWhlbGRfc2tiID0gc2tiX2RlcXVldWUoJnBfY2gtPmNvbGxlY3RfcXVldWUpOwotCQkJCWlmIChoZWxkX3NrYikKLQkJCQkJYXRvbWljX2RlYygmaGVsZF9za2ItPnVzZXJzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGtfaW5kID0gMDsKLQkJCQlhdG9taWNfaW5jKCZoZWxkX3NrYi0+dXNlcnMpOwotCQkJCXNrYl9xdWV1ZV9oZWFkKCZwX2NoLT5jb2xsZWN0X3F1ZXVlLGhlbGRfc2tiKTsKLQkJCX0KLQkJfQotCX0KLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiUGFja1NLQngiKTsKLQlyZXR1cm4gbmV3X3NrYjsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICogICBjbGF3X2NoYW5nZV9tdHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludAotY2xhd19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQotewotCXN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdnB0ciA9IGRldi0+bWxfcHJpdjsKLQlpbnQgYnVmZl9zaXplOwotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJzZXRtdHUiKTsKLQlidWZmX3NpemUgPSBwcml2cHRyLT5wX2Vudi0+d3JpdGVfc2l6ZTsKLSAgICAgICAgaWYgKChuZXdfbXR1IDwgNjApIHx8IChuZXdfbXR1ID4gYnVmZl9zaXplKSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0gICAgICAgIGRldi0+bXR1ID0gbmV3X210dTsKLSAgICAgICAgcmV0dXJuIDA7Ci19ICAvKiAgIGVuZCBvZiBjbGF3X2NoYW5nZV9tdHUgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiAgIGNsYXdfb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludAotY2xhd19vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0KLSAgICAgICAgaW50ICAgICByYzsKLSAgICAgICAgaW50ICAgICBpOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgIHNhdmVmbGFncz0wOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgIHBhcm07Ci0gICAgICAgIHN0cnVjdCBjbGF3X3ByaXZiayAgKnByaXZwdHI7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7Ci0gICAgICAgIHN0cnVjdCB0aW1lcl9saXN0ICB0aW1lcjsKLSAgICAgICAgc3RydWN0IGNjd2JrICpwX2J1ZjsKLQotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJvcGVuIik7Ci0JcHJpdnB0ciA9IChzdHJ1Y3QgY2xhd19wcml2YmsgKilkZXYtPm1sX3ByaXY7Ci0gICAgICAgIC8qICAgYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgQ0NXIGJsb2NrcyAqLwotCWlmIChwcml2cHRyLT5idWZmc19hbGxvYyA9PSAwKSB7Ci0JICAgICAgICByYz1pbml0X2Njd19iayhkZXYpOwotICAgICAgICAJaWYgKHJjKSB7Ci0JCQlDTEFXX0RCRl9URVhUKDIsIHRyYWNlLCAib3Blbm1lbSIpOwotICAgICAgICAgICAgICAgIAlyZXR1cm4gLUVOT01FTTsKLSAgICAgICAgCX0KLQl9Ci0gICAgICAgIHByaXZwdHItPnN5c3RlbV92YWxpZGF0ZV9jb21wPTA7Ci0gICAgICAgIHByaXZwdHItPnJlbGVhc2VfcGVuZD0wOwotCWlmKHN0cm5jbXAocHJpdnB0ci0+cF9lbnYtPmFwaV90eXBlLFdTX0FQUExfTkFNRV9QQUNLRUQsNikgPT0gMCkgewotCQlwcml2cHRyLT5wX2Vudi0+cmVhZF9zaXplPURFRl9QQUNLX0JVRlNJWkU7Ci0JCXByaXZwdHItPnBfZW52LT53cml0ZV9zaXplPURFRl9QQUNLX0JVRlNJWkU7Ci0JCXByaXZwdHItPnBfZW52LT5wYWNraW5nPVBBQ0tJTkdfQVNLOwotCX0gZWxzZSB7Ci0JCXByaXZwdHItPnBfZW52LT5wYWNraW5nPTA7Ci0JCXByaXZwdHItPnBfZW52LT5yZWFkX3NpemU9Q0xBV19GUkFNRV9TSVpFOwotCQlwcml2cHRyLT5wX2Vudi0+d3JpdGVfc2l6ZT1DTEFXX0ZSQU1FX1NJWkU7Ci0JfQotICAgICAgICBjbGF3X3NldF9idXN5KGRldik7Ci0JdGFza2xldF9pbml0KCZwcml2cHRyLT5jaGFubmVsW1JFQURfQ0hBTk5FTF0udGFza2xldCwgY2xhd19pcnFfdGFza2xldCwKLQkJKHVuc2lnbmVkIGxvbmcpICZwcml2cHRyLT5jaGFubmVsW1JFQURfQ0hBTk5FTF0pOwotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDI7ICBpKyspIHsKLQkJQ0xBV19EQkZfVEVYVF8oMiwgdHJhY2UsICJvcG5fY2glZCIsIGkpOwotICAgICAgICAgICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXZwdHItPmNoYW5uZWxbaV0ud2FpdCk7Ci0JCS8qIHNrYl9xdWV1ZV9oZWFkX2luaXQoJnBfY2gtPmlvX3F1ZXVlKTsgKi8KLQkJaWYgKGkgPT0gV1JJVEVfQ0hBTk5FTCkKLQkJCXNrYl9xdWV1ZV9oZWFkX2luaXQoCi0JCQkJJnByaXZwdHItPmNoYW5uZWxbV1JJVEVfQ0hBTk5FTF0uY29sbGVjdF9xdWV1ZSk7Ci0gICAgICAgICAgICAgICAgcHJpdnB0ci0+Y2hhbm5lbFtpXS5mbGFnX2EgPSAwOwotICAgICAgICAgICAgICAgIHByaXZwdHItPmNoYW5uZWxbaV0uSU9fYWN0aXZlID0gMDsKLSAgICAgICAgICAgICAgICBwcml2cHRyLT5jaGFubmVsW2ldLmZsYWcgICY9IH5DTEFXX1RJTUVSOwotICAgICAgICAgICAgICAgIGluaXRfdGltZXIoJnRpbWVyKTsKLSAgICAgICAgICAgICAgICB0aW1lci5mdW5jdGlvbiA9ICh2b2lkICopY2xhd190aW1lcjsKLSAgICAgICAgICAgICAgICB0aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpKCZwcml2cHRyLT5jaGFubmVsW2ldKTsKLSAgICAgICAgICAgICAgICB0aW1lci5leHBpcmVzID0gamlmZmllcyArIDE1KkhaOwotICAgICAgICAgICAgICAgIGFkZF90aW1lcigmdGltZXIpOwotICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKGdldF9jY3dkZXZfbG9jaygKLQkJCXByaXZwdHItPmNoYW5uZWxbaV0uY2RldiksIHNhdmVmbGFncyk7Ci0gICAgICAgICAgICAgICAgcGFybSA9ICh1bnNpZ25lZCBsb25nKSAmcHJpdnB0ci0+Y2hhbm5lbFtpXTsKLSAgICAgICAgICAgICAgICBwcml2cHRyLT5jaGFubmVsW2ldLmNsYXdfc3RhdGUgPSBDTEFXX1NUQVJUX0hBTFRfSU87Ci0JCXJjID0gMDsKLQkJYWRkX3dhaXRfcXVldWUoJnByaXZwdHItPmNoYW5uZWxbaV0ud2FpdCwgJndhaXQpOwotICAgICAgICAgICAgICAgIHJjID0gY2N3X2RldmljZV9oYWx0KAotCQkJKHN0cnVjdCBjY3dfZGV2aWNlICopcHJpdnB0ci0+Y2hhbm5lbFtpXS5jZGV2LHBhcm0pOwotICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKLQkJCWdldF9jY3dkZXZfbG9jayhwcml2cHRyLT5jaGFubmVsW2ldLmNkZXYpLCBzYXZlZmxhZ3MpOwotICAgICAgICAgICAgICAgIHNjaGVkdWxlKCk7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnByaXZwdHItPmNoYW5uZWxbaV0ud2FpdCwgJndhaXQpOwotICAgICAgICAgICAgICAgIGlmKHJjICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBjY3dfY2hlY2tfcmV0dXJuX2NvZGUocHJpdnB0ci0+Y2hhbm5lbFtpXS5jZGV2LCByYyk7Ci0gICAgICAgICAgICAgICAgaWYoKHByaXZwdHItPmNoYW5uZWxbaV0uZmxhZyAmIENMQVdfVElNRVIpID09IDB4MDApCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWxfdGltZXIoJnRpbWVyKTsKLSAgICAgICAgfQotCWlmICgoKChwcml2cHRyLT5jaGFubmVsW1JFQURfQ0hBTk5FTF0ubGFzdF9kc3RhdCB8Ci0JCXByaXZwdHItPmNoYW5uZWxbV1JJVEVfQ0hBTk5FTF0ubGFzdF9kc3RhdCkgJgotICAgICAgICAgICB+KERFVl9TVEFUX0NITl9FTkQgfCBERVZfU1RBVF9ERVZfRU5EKSkgIT0gMHgwMCkgfHwKLQkgICAoKChwcml2cHRyLT5jaGFubmVsW1JFQURfQ0hBTk5FTF0uZmxhZyB8Ci0JCXByaXZwdHItPmNoYW5uZWxbV1JJVEVfQ0hBTk5FTF0uZmxhZykgJiBDTEFXX1RJTUVSKSAhPSAweDAwKSkgewotCQlkZXZfaW5mbygmcHJpdnB0ci0+Y2hhbm5lbFtSRUFEX0NIQU5ORUxdLmNkZXYtPmRldiwKLQkJCSIlczogcmVtb3RlIHNpZGUgaXMgbm90IHJlYWR5XG4iLCBkZXYtPm5hbWUpOwotCQlDTEFXX0RCRl9URVhUKDIsIHRyYWNlLCAibm90cmR5Iik7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IDI7ICBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKAotCQkJCWdldF9jY3dkZXZfbG9jayhwcml2cHRyLT5jaGFubmVsW2ldLmNkZXYpLAotCQkJCXNhdmVmbGFncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJtID0gKHVuc2lnbmVkIGxvbmcpICZwcml2cHRyLT5jaGFubmVsW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpdnB0ci0+Y2hhbm5lbFtpXS5jbGF3X3N0YXRlID0gQ0xBV19TVE9QOwotICAgICAgICAgICAgICAgICAgICAgICAgcmMgPSBjY3dfZGV2aWNlX2hhbHQoCi0JCQkJKHN0cnVjdCBjY3dfZGV2aWNlICopJnByaXZwdHItPmNoYW5uZWxbaV0uY2RldiwKLQkJCQlwYXJtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQkJZ2V0X2Njd2Rldl9sb2NrKHByaXZwdHItPmNoYW5uZWxbaV0uY2RldiksCi0JCQkJc2F2ZWZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjd19jaGVja19yZXR1cm5fY29kZSgKLQkJCQkJcHJpdnB0ci0+Y2hhbm5lbFtpXS5jZGV2LCByYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcHJpdnB0ci0+cF9idWZmX2NjdywKLQkJCShpbnQpcGFnZXNfdG9fb3JkZXJfb2ZfbWFnKHByaXZwdHItPnBfYnVmZl9jY3dfbnVtKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByaXZwdHItPnBfZW52LT5yZWFkX3NpemUgPCBQQUdFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcHJpdnB0ci0+cF9idWZmX3JlYWQsCi0JCQkgICAgICAgKGludClwYWdlc190b19vcmRlcl9vZl9tYWcoCi0JCQkgICAgICAgCQlwcml2cHRyLT5wX2J1ZmZfcmVhZF9udW0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zj1wcml2cHRyLT5wX3JlYWRfYWN0aXZlX2ZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBfYnVmIT1OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcF9idWYtPnBfYnVmZmVyLAotCQkJCSAgICAgIChpbnQpcGFnZXNfdG9fb3JkZXJfb2ZfbWFnKAotCQkJCSAgICAgIAlwcml2cHRyLT5wX2J1ZmZfcGFnZXNfcGVycmVhZCApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWY9cF9idWYtPm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChwcml2cHRyLT5wX2Vudi0+d3JpdGVfc2l6ZSA8IFBBR0VfU0laRSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcHJpdnB0ci0+cF9idWZmX3dyaXRlLAotCQkJICAgICAoaW50KXBhZ2VzX3RvX29yZGVyX29mX21hZygKLQkJCSAgICAgCXByaXZwdHItPnBfYnVmZl93cml0ZV9udW0pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zj1wcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwX2J1ZiE9TlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXBfYnVmLT5wX2J1ZmZlciwKLQkJCQkgICAgIChpbnQpcGFnZXNfdG9fb3JkZXJfb2ZfbWFnKAotCQkJCSAgICAgCXByaXZwdHItPnBfYnVmZl9wYWdlc19wZXJ3cml0ZSApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWY9cF9idWYtPm5leHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCQlwcml2cHRyLT5idWZmc19hbGxvYyA9IDA7Ci0JCXByaXZwdHItPmNoYW5uZWxbUkVBRF9DSEFOTkVMXS5mbGFnID0gMHgwMDsKLQkJcHJpdnB0ci0+Y2hhbm5lbFtXUklURV9DSEFOTkVMXS5mbGFnID0gMHgwMDsKLSAgICAgICAgICAgICAgICBwcml2cHRyLT5wX2J1ZmZfY2N3PU5VTEw7Ci0gICAgICAgICAgICAgICAgcHJpdnB0ci0+cF9idWZmX3JlYWQ9TlVMTDsKLSAgICAgICAgICAgICAgICBwcml2cHRyLT5wX2J1ZmZfd3JpdGU9TlVMTDsKLSAgICAgICAgICAgICAgICBjbGF3X2NsZWFyX2J1c3koZGV2KTsKLQkJQ0xBV19EQkZfVEVYVCgyLCB0cmFjZSwgIm9wZW4gRUlPIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FSU87Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAgIFNlbmQgU3lzdGVtVmFsaWRhdGUgY29tbWFuZCAqLwotCi0gICAgICAgIGNsYXdfY2xlYXJfYnVzeShkZXYpOwotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJvcGVub2siKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19ICAgIC8qICAgICBlbmQgb2YgY2xhd19vcGVuICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgY2xhd19pcnFfaGFuZGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZAotY2xhd19pcnFfaGFuZGxlcihzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwKLQl1bnNpZ25lZCBsb25nIGludHBhcm0sIHN0cnVjdCBpcmIgKmlyYikKLXsKLSAgICAgICAgc3RydWN0IGNoYmsgKnBfY2ggPSBOVUxMOwotICAgICAgICBzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXZwdHIgPSBOVUxMOwotICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKLSAgICAgICAgc3RydWN0IGNsYXdfZW52ICAqcF9lbnY7Ci0gICAgICAgIHN0cnVjdCBjaGJrICpwX2NoX3I9TlVMTDsKLQotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJjbGF3aXJxIik7Ci0gICAgICAgIC8qIEJ5cGFzcyBhbGwgJ3Vuc29saWNpdGVkIGludGVycnVwdHMnICovCi0JcHJpdnB0ciA9IGRldl9nZXRfZHJ2ZGF0YSgmY2Rldi0+ZGV2KTsKLQlpZiAoIXByaXZwdHIpIHsKLQkJZGV2X3dhcm4oJmNkZXYtPmRldiwgIkFuIHVuaW5pdGlhbGl6ZWQgQ0xBVyBkZXZpY2UgcmVjZWl2ZWQgYW4iCi0JCQkiIElSUSwgYy0lMDJ4IGQtJTAyeFxuIiwKLQkJCWlyYi0+c2Nzdy5jbWQuY3N0YXQsIGlyYi0+c2Nzdy5jbWQuZHN0YXQpOwotCQlDTEFXX0RCRl9URVhUKDIsIHRyYWNlLCAiYmFkaXJxIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLQkvKiBUcnkgdG8gZXh0cmFjdCBjaGFubmVsIGZyb20gZHJpdmVyIGRhdGEuICovCi0JaWYgKHByaXZwdHItPmNoYW5uZWxbUkVBRF9DSEFOTkVMXS5jZGV2ID09IGNkZXYpCi0JCXBfY2ggPSAmcHJpdnB0ci0+Y2hhbm5lbFtSRUFEX0NIQU5ORUxdOwotCWVsc2UgaWYgKHByaXZwdHItPmNoYW5uZWxbV1JJVEVfQ0hBTk5FTF0uY2RldiA9PSBjZGV2KQotCQlwX2NoID0gJnByaXZwdHItPmNoYW5uZWxbV1JJVEVfQ0hBTk5FTF07Ci0JZWxzZSB7Ci0JCWRldl93YXJuKCZjZGV2LT5kZXYsICJUaGUgZGV2aWNlIGlzIG5vdCBhIENMQVcgZGV2aWNlXG4iKTsKLQkJQ0xBV19EQkZfVEVYVCgyLCB0cmFjZSwgImJhZGNoYW4iKTsKLQkJcmV0dXJuOwotCX0KLQlDTEFXX0RCRl9URVhUXyg0LCB0cmFjZSwgIklSUUNIPSVkIiwgcF9jaC0+ZmxhZyk7Ci0KLQlkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgKHBfY2gtPm5kZXYpOwotICAgICAgICBwX2Vudj1wcml2cHRyLT5wX2VudjsKLQotCS8qIENvcHkgaW50ZXJydXB0aW9uIHJlc3BvbnNlIGJsb2NrLiAqLwotCW1lbWNweShwX2NoLT5pcmIsIGlyYiwgc2l6ZW9mKHN0cnVjdCBpcmIpKTsKLQotCS8qIENoZWNrIGZvciBnb29kIHN1YmNoYW5uZWwgcmV0dXJuIGNvZGUsIG90aGVyd2lzZSBpbmZvIG1lc3NhZ2UgKi8KLQlpZiAoaXJiLT5zY3N3LmNtZC5jc3RhdCAmJiAhKGlyYi0+c2Nzdy5jbWQuY3N0YXQgJiBTQ0hOX1NUQVRfUENJKSkgewotCQlkZXZfaW5mbygmY2Rldi0+ZGV2LAotCQkJIiVzOiBzdWJjaGFubmVsIGNoZWNrIGZvciBkZXZpY2U6ICUwNHggLSIKLQkJCSIgU2NoIFN0YXQgJTAyeCAgRGV2IFN0YXQgJTAyeCBDUEEgLSAlMDR4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBwX2NoLT5kZXZubywKLQkJCWlyYi0+c2Nzdy5jbWQuY3N0YXQsIGlyYi0+c2Nzdy5jbWQuZHN0YXQsCi0JCQlpcmItPnNjc3cuY21kLmNwYSk7Ci0JCUNMQVdfREJGX1RFWFQoMiwgdHJhY2UsICJjaGFuY2hrIik7Ci0gICAgICAgICAgICAgICAgLyogcmV0dXJuOyAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgdGhlIHJlYXNvbi1jb2RlIG9mIGEgdW5pdCBjaGVjayAqLwotCWlmIChpcmItPnNjc3cuY21kLmRzdGF0ICYgREVWX1NUQVRfVU5JVF9DSEVDSykKLSAgICAgICAgICAgICAgICBjY3dfY2hlY2tfdW5pdF9jaGVjayhwX2NoLCBpcmItPmVjd1swXSk7Ci0KLSAgICAgICAgLyogU3RhdGUgbWFjaGluZSB0byBicmluZyB0aGUgY29ubmVjdGlvbiB1cCwgZG93biBhbmQgdG8gcmVzdGFydCAqLwotCXBfY2gtPmxhc3RfZHN0YXQgPSBpcmItPnNjc3cuY21kLmRzdGF0OwotCi0gICAgICAgIHN3aXRjaCAocF9jaC0+Y2xhd19zdGF0ZSkgewotCWNhc2UgQ0xBV19TVE9QOi8qIEhBTFRfSU8gYnkgY2xhd19yZWxlYXNlIChoYWx0IHNlcXVlbmNlKSAqLwotCQlpZiAoISgocF9jaC0+aXJiLT5zY3N3LmNtZC5zdGN0bCAmIFNDU1dfU1RDVExfU0VDX1NUQVRVUykgfHwKLQkJKHBfY2gtPmlyYi0+c2Nzdy5jbWQuc3RjdGwgPT0gU0NTV19TVENUTF9TVEFUVVNfUEVORCkgfHwKLQkJKHBfY2gtPmlyYi0+c2Nzdy5jbWQuc3RjdGwgPT0KLQkJKFNDU1dfU1RDVExfQUxFUlRfU1RBVFVTIHwgU0NTV19TVENUTF9TVEFUVVNfUEVORCkpKSkKLQkJCXJldHVybjsKLQkJd2FrZV91cCgmcF9jaC0+d2FpdCk7ICAgLyogd2FrZSB1cCBjbGF3X3JlbGVhc2UgKi8KLQkJQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgInN0b3AiKTsKLQkJcmV0dXJuOwotCWNhc2UgQ0xBV19TVEFSVF9IQUxUX0lPOiAvKiBIQUxUX0lPIGlzc3VlZCBieSBjbGF3X29wZW4gICovCi0JCWlmICghKChwX2NoLT5pcmItPnNjc3cuY21kLnN0Y3RsICYgU0NTV19TVENUTF9TRUNfU1RBVFVTKSB8fAotCQkocF9jaC0+aXJiLT5zY3N3LmNtZC5zdGN0bCA9PSBTQ1NXX1NUQ1RMX1NUQVRVU19QRU5EKSB8fAotCQkocF9jaC0+aXJiLT5zY3N3LmNtZC5zdGN0bCA9PQotCQkoU0NTV19TVENUTF9BTEVSVF9TVEFUVVMgfCBTQ1NXX1NUQ1RMX1NUQVRVU19QRU5EKSkpKSB7Ci0JCQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiaGFsdGlvIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKHBfY2gtPmZsYWcgPT0gQ0xBV19SRUFEKSB7Ci0JCQlwX2NoLT5jbGF3X3N0YXRlID0gQ0xBV19TVEFSVF9SRUFEOwotCQkJd2FrZV91cCgmcF9jaC0+d2FpdCk7IC8qIHdha2UgY2xhd19vcGVuIChSRUFEKSovCi0JCX0gZWxzZSBpZiAocF9jaC0+ZmxhZyA9PSBDTEFXX1dSSVRFKSB7Ci0JCQlwX2NoLT5jbGF3X3N0YXRlID0gQ0xBV19TVEFSVF9XUklURTsKLQkJCS8qICAgICAgc2VuZCBTWVNURU1fVkFMSURBVEUgICAgICAgICAgICAgICAgICAgICovCi0JCQljbGF3X3N0cnRfcmVhZChkZXYsIExPQ0tfTk8pOwotCQkJY2xhd19zZW5kX2NvbnRyb2woZGV2LAotCQkJCVNZU1RFTV9WQUxJREFURV9SRVFVRVNULAotCQkJCTAsIDAsIDAsCi0JCQkJcF9lbnYtPmhvc3RfbmFtZSwKLQkJCQlwX2Vudi0+YWRhcHRlcl9uYW1lKTsKLQkJfSBlbHNlIHsKLQkJCWRldl93YXJuKCZjZGV2LT5kZXYsICJUaGUgQ0xBVyBkZXZpY2UgcmVjZWl2ZWQiCi0JCQkJIiBhbiB1bmV4cGVjdGVkIElSUSwgIgotCQkJCSJjLSUwMnggZC0lMDJ4XG4iLAotCQkJCWlyYi0+c2Nzdy5jbWQuY3N0YXQsCi0JCQkJaXJiLT5zY3N3LmNtZC5kc3RhdCk7Ci0JCQlyZXR1cm47Ci0JCQl9Ci0JCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJoYWx0aW8iKTsKLQkJcmV0dXJuOwotCWNhc2UgQ0xBV19TVEFSVF9SRUFEOgotCQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiUmVhZElSUSIpOwotCQlpZiAocF9jaC0+aXJiLT5zY3N3LmNtZC5kc3RhdCAmIERFVl9TVEFUX1VOSVRfQ0hFQ0spIHsKLQkJCWNsZWFyX2JpdCgwLCAodm9pZCAqKSZwX2NoLT5JT19hY3RpdmUpOwotCQkJaWYgKChwX2NoLT5pcmItPmVjd1swXSAmIDB4NDEpID09IDB4NDEgfHwKLQkJCSAgICAocF9jaC0+aXJiLT5lY3dbMF0gJiAweDQwKSA9PSAweDQwIHx8Ci0JCQkgICAgKHBfY2gtPmlyYi0+ZWN3WzBdKSAgICAgICAgPT0gMCkgewotCQkJCXByaXZwdHItPnN0YXRzLnJ4X2Vycm9ycysrOwotCQkJCWRldl9pbmZvKCZjZGV2LT5kZXYsCi0JCQkJCSIlczogUmVzdGFydCBpcyByZXF1aXJlZCBhZnRlciByZW1vdGUgIgotCQkJCQkic2lkZSByZWNvdmVycyBcbiIsCi0JCQkJCWRldi0+bmFtZSk7Ci0JCQl9Ci0JCQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAibm90cmR5Iik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKChwX2NoLT5pcmItPnNjc3cuY21kLmNzdGF0ICYgU0NITl9TVEFUX1BDSSkgJiYKLQkJCShwX2NoLT5pcmItPnNjc3cuY21kLmRzdGF0ID09IDApKSB7Ci0JCQlpZiAodGVzdF9hbmRfc2V0X2JpdChDTEFXX0JIX0FDVElWRSwKLQkJCQkodm9pZCAqKSZwX2NoLT5mbGFnX2EpID09IDApCi0JCQkJdGFza2xldF9zY2hlZHVsZSgmcF9jaC0+dGFza2xldCk7Ci0JCQllbHNlCi0JCQkJQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgIlBDSU5vQkgiKTsKLQkJCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJQQ0lfcmVhZCIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKChwX2NoLT5pcmItPnNjc3cuY21kLnN0Y3RsICYgU0NTV19TVENUTF9TRUNfU1RBVFVTKSB8fAotCQkgKHBfY2gtPmlyYi0+c2Nzdy5jbWQuc3RjdGwgPT0gU0NTV19TVENUTF9TVEFUVVNfUEVORCkgfHwKLQkJIChwX2NoLT5pcmItPnNjc3cuY21kLnN0Y3RsID09Ci0JCSAoU0NTV19TVENUTF9BTEVSVF9TVEFUVVMgfCBTQ1NXX1NUQ1RMX1NUQVRVU19QRU5EKSkpKSB7Ci0JCQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiU1BlbmRfcmQiKTsKLQkJCXJldHVybjsKLQkJfQotCQljbGVhcl9iaXQoMCwgKHZvaWQgKikmcF9jaC0+SU9fYWN0aXZlKTsKLQkJY2xhd19jbGVhcmJpdF9idXN5KFRCX1JFVFJZLCBkZXYpOwotCQlpZiAodGVzdF9hbmRfc2V0X2JpdChDTEFXX0JIX0FDVElWRSwKLQkJCSh2b2lkICopJnBfY2gtPmZsYWdfYSkgPT0gMCkKLQkJCXRhc2tsZXRfc2NoZWR1bGUoJnBfY2gtPnRhc2tsZXQpOwotCQllbHNlCi0JCQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiUmRCSEFjdCIpOwotCQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiUmRJUlFYaXQiKTsKLQkJcmV0dXJuOwotCWNhc2UgQ0xBV19TVEFSVF9XUklURToKLQkJaWYgKHBfY2gtPmlyYi0+c2Nzdy5jbWQuZHN0YXQgJiBERVZfU1RBVF9VTklUX0NIRUNLKSB7Ci0JCQlkZXZfaW5mbygmY2Rldi0+ZGV2LAotCQkJCSIlczogVW5pdCBDaGVjayBPY2N1cnJlZCBpbiAiCi0JCQkJIndyaXRlIGNoYW5uZWxcbiIsIGRldi0+bmFtZSk7Ci0JCQljbGVhcl9iaXQoMCwgKHZvaWQgKikmcF9jaC0+SU9fYWN0aXZlKTsKLQkJCWlmIChwX2NoLT5pcmItPmVjd1swXSAmIDB4ODApIHsKLQkJCQlkZXZfaW5mbygmY2Rldi0+ZGV2LAotCQkJCQkiJXM6IFJlc2V0dGluZyBFdmVudCAiCi0JCQkJCSJvY2N1cnJlZDpcbiIsIGRldi0+bmFtZSk7Ci0JCQkJaW5pdF90aW1lcigmcF9jaC0+dGltZXIpOwotCQkJCXBfY2gtPnRpbWVyLmZ1bmN0aW9uID0KLQkJCQkJKHZvaWQgKiljbGF3X3dyaXRlX3JldHJ5OwotCQkJCXBfY2gtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwX2NoOwotCQkJCXBfY2gtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTAqSFo7Ci0JCQkJYWRkX3RpbWVyKCZwX2NoLT50aW1lcik7Ci0JCQkJZGV2X2luZm8oJmNkZXYtPmRldiwKLQkJCQkJIiVzOiB3cml0ZSBjb25uZWN0aW9uICIKLQkJCQkJInJlc3RhcnRpbmdcbiIsIGRldi0+bmFtZSk7Ci0JCQl9Ci0JCQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAicnN0cnR3cnQiKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocF9jaC0+aXJiLT5zY3N3LmNtZC5kc3RhdCAmIERFVl9TVEFUX1VOSVRfRVhDRVApIHsKLQkJCWNsZWFyX2JpdCgwLCAodm9pZCAqKSZwX2NoLT5JT19hY3RpdmUpOwotCQkJZGV2X2luZm8oJmNkZXYtPmRldiwKLQkJCQkiJXM6IFVuaXQgRXhjZXB0aW9uICIKLQkJCQkib2NjdXJyZWQgaW4gd3JpdGUgY2hhbm5lbFxuIiwKLQkJCQlkZXYtPm5hbWUpOwotCQl9Ci0JCWlmICghKChwX2NoLT5pcmItPnNjc3cuY21kLnN0Y3RsICYgU0NTV19TVENUTF9TRUNfU1RBVFVTKSB8fAotCQkocF9jaC0+aXJiLT5zY3N3LmNtZC5zdGN0bCA9PSBTQ1NXX1NUQ1RMX1NUQVRVU19QRU5EKSB8fAotCQkocF9jaC0+aXJiLT5zY3N3LmNtZC5zdGN0bCA9PQotCQkoU0NTV19TVENUTF9BTEVSVF9TVEFUVVMgfCBTQ1NXX1NUQ1RMX1NUQVRVU19QRU5EKSkpKSB7Ci0JCQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAid3JpdGVVRSIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWNsZWFyX2JpdCgwLCAodm9pZCAqKSZwX2NoLT5JT19hY3RpdmUpOwotCQlpZiAoY2xhd190ZXN0X2FuZF9zZXRiaXRfYnVzeShUQl9UWCwgZGV2KSA9PSAwKSB7Ci0JCQljbGF3X3dyaXRlX25leHQocF9jaCk7Ci0JCQljbGF3X2NsZWFyYml0X2J1c3koVEJfVFgsIGRldik7Ci0JCQljbGF3X2NsZWFyX2J1c3koZGV2KTsKLQkJfQotCQlwX2NoX3IgPSAoc3RydWN0IGNoYmsgKikmcHJpdnB0ci0+Y2hhbm5lbFtSRUFEX0NIQU5ORUxdOwotCQlpZiAodGVzdF9hbmRfc2V0X2JpdChDTEFXX0JIX0FDVElWRSwKLQkJCSh2b2lkICopJnBfY2hfci0+ZmxhZ19hKSA9PSAwKQotCQkJdGFza2xldF9zY2hlZHVsZSgmcF9jaF9yLT50YXNrbGV0KTsKLQkJQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgIlN0V3RFeGl0Iik7Ci0JCXJldHVybjsKLQlkZWZhdWx0OgotCQlkZXZfd2FybigmY2Rldi0+ZGV2LAotCQkJIlRoZSBDTEFXIGRldmljZSBmb3IgJXMgcmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBJUlFcbiIsCi0JCQkgZGV2LT5uYW1lKTsKLQkJQ0xBV19EQkZfVEVYVCgyLCB0cmFjZSwgImJhZElSUSIpOwotCQlyZXR1cm47Ci0gICAgICAgIH0KLQotfSAgICAgICAvKiAgIGVuZCBvZiBjbGF3X2lycV9oYW5kbGVyICAgICovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgICBjbGF3X2lycV90YXNrbGV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyB2b2lkCi1jbGF3X2lycV90YXNrbGV0ICggdW5zaWduZWQgbG9uZyBkYXRhICkKLXsKLQlzdHJ1Y3QgY2hiayAqIHBfY2g7Ci0gICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICAqZGV2OwotCi0JcF9jaCA9IChzdHJ1Y3QgY2hiayAqKSBkYXRhOwotICAgICAgICBkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilwX2NoLT5uZGV2OwotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJJUlF0YXNrIik7Ci0gICAgICAgIHVucGFja19yZWFkKGRldik7Ci0gICAgICAgIGNsZWFyX2JpdChDTEFXX0JIX0FDVElWRSwgKHZvaWQgKikmcF9jaC0+ZmxhZ19hKTsKLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiVHNrbGV0WHQiKTsKLSAgICAgICAgcmV0dXJuOwotfSAgICAgICAvKiAgICBlbmQgb2YgY2xhd19pcnFfYmggICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgICBjbGF3X3JlbGVhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0YXRpYyBpbnQKLWNsYXdfcmVsZWFzZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotICAgICAgICBpbnQgICAgICAgICAgICAgICAgcmM7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICBpOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgc2F2ZWZsYWdzOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgcGFybTsKLSAgICAgICAgc3RydWN0IGNsYXdfcHJpdmJrICpwcml2cHRyOwotICAgICAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLSAgICAgICAgc3RydWN0IGNjd2JrKiAgICAgICAgICAgICBwX3RoaXNfY2N3OwotICAgICAgICBzdHJ1Y3QgY2N3YmsqICAgICAgICAgICAgIHBfYnVmOwotCi0JaWYgKCFkZXYpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0JcHJpdnB0ciA9IChzdHJ1Y3QgY2xhd19wcml2YmsgKilkZXYtPm1sX3ByaXY7Ci0gICAgICAgIGlmICghcHJpdnB0cikKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAicmVsZWFzZSIpOwotICAgICAgICBwcml2cHRyLT5yZWxlYXNlX3BlbmQ9MTsKLSAgICAgICAgY2xhd19zZXRiaXRfYnVzeShUQl9TVE9QLGRldik7Ci0gICAgICAgIGZvciAoIGkgPSAxOyBpID49MCA7ICBpLS0pIHsKLSAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgKLQkJCWdldF9jY3dkZXZfbG9jayhwcml2cHRyLT5jaGFubmVsW2ldLmNkZXYpLCBzYXZlZmxhZ3MpOwotCSAgICAgLyogICBkZWxfdGltZXIoJnByaXZwdHItPmNoYW5uZWxbUkVBRF9DSEFOTkVMXS50aW1lcik7ICAqLwotIAkJcHJpdnB0ci0+Y2hhbm5lbFtpXS5jbGF3X3N0YXRlID0gQ0xBV19TVE9QOwotICAgICAgICAgICAgICAgIHByaXZwdHItPmNoYW5uZWxbaV0uSU9fYWN0aXZlID0gMDsKLSAgICAgICAgICAgICAgICBwYXJtID0gKHVuc2lnbmVkIGxvbmcpICZwcml2cHRyLT5jaGFubmVsW2ldOwotCQlpZiAoaSA9PSBXUklURV9DSEFOTkVMKQotCQkJY2xhd19wdXJnZV9za2JfcXVldWUoCi0JCQkJJnByaXZwdHItPmNoYW5uZWxbV1JJVEVfQ0hBTk5FTF0uY29sbGVjdF9xdWV1ZSk7Ci0gICAgICAgICAgICAgICAgcmMgPSBjY3dfZGV2aWNlX2hhbHQgKHByaXZwdHItPmNoYW5uZWxbaV0uY2RldiwgcGFybSk7Ci0JICAgICAgICBpZiAocHJpdnB0ci0+c3lzdGVtX3ZhbGlkYXRlX2NvbXA9PTB4MDApICAvKiBuZXZlciBvcGVuZWQ/ICovCi0gICAgICAgICAgICAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmcHJpdnB0ci0+Y2hhbm5lbFtpXS53YWl0KTsKLSAgICAgICAgICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcHJpdnB0ci0+Y2hhbm5lbFtpXS53YWl0LCAmd2FpdCk7Ci0gICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQkgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoCi0JCQlnZXRfY2N3ZGV2X2xvY2socHJpdnB0ci0+Y2hhbm5lbFtpXS5jZGV2KSwgc2F2ZWZsYWdzKTsKLQkgICAgICAgIHNjaGVkdWxlKCk7Ci0JICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcHJpdnB0ci0+Y2hhbm5lbFtpXS53YWl0LCAmd2FpdCk7Ci0JICAgICAgICBpZiAocmMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2N3X2NoZWNrX3JldHVybl9jb2RlKHByaXZwdHItPmNoYW5uZWxbaV0uY2RldiwgcmMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCWlmIChwcml2cHRyLT5wa19za2IgIT0gTlVMTCkgewotCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2cHRyLT5wa19za2IpOwotCQlwcml2cHRyLT5wa19za2IgPSBOVUxMOwotCX0KLQlpZihwcml2cHRyLT5idWZmc19hbGxvYyAhPSAxKSB7Ci0JCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJub25lMmZyZSIpOwotCQlyZXR1cm4gMDsKLQl9Ci0JQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgImZyZWVidWZzIik7Ci0JaWYgKHByaXZwdHItPnBfYnVmZl9jY3cgIT0gTlVMTCkgewotICAgICAgICAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylwcml2cHRyLT5wX2J1ZmZfY2N3LAotCSAgICAgICAgCShpbnQpcGFnZXNfdG9fb3JkZXJfb2ZfbWFnKHByaXZwdHItPnBfYnVmZl9jY3dfbnVtKSk7Ci0JfQotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJmcmVlcmVhZCIpOwotICAgICAgICBpZiAocHJpdnB0ci0+cF9lbnYtPnJlYWRfc2l6ZSA8IFBBR0VfU0laRSkgewotCSAgICBpZiAocHJpdnB0ci0+cF9idWZmX3JlYWQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcHJpdnB0ci0+cF9idWZmX3JlYWQsCi0JCSAgICAgIChpbnQpcGFnZXNfdG9fb3JkZXJfb2ZfbWFnKHByaXZwdHItPnBfYnVmZl9yZWFkX251bSkpOwotCQl9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcF9idWY9cHJpdnB0ci0+cF9yZWFkX2FjdGl2ZV9maXJzdDsKLSAgICAgICAgICAgICAgICB3aGlsZSAocF9idWYhPU5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcF9idWYtPnBfYnVmZmVyLAotCQkJICAgICAoaW50KXBhZ2VzX3RvX29yZGVyX29mX21hZygKLQkJCSAgICAgCXByaXZwdHItPnBfYnVmZl9wYWdlc19wZXJyZWFkICkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWY9cF9idWYtPm5leHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0JIENMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJmcmVld3JpdCIpOwotICAgICAgICBpZiAocHJpdnB0ci0+cF9lbnYtPndyaXRlX3NpemUgPCBQQUdFX1NJWkUgKSB7Ci0gICAgICAgICAgICAgICAgZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylwcml2cHRyLT5wX2J1ZmZfd3JpdGUsCi0JCSAgICAgIChpbnQpcGFnZXNfdG9fb3JkZXJfb2ZfbWFnKHByaXZwdHItPnBfYnVmZl93cml0ZV9udW0pKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBwX2J1Zj1wcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9maXJzdDsKLSAgICAgICAgICAgICAgICB3aGlsZSAocF9idWYhPU5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcF9idWYtPnBfYnVmZmVyLAotCQkJICAgICAgKGludClwYWdlc190b19vcmRlcl9vZl9tYWcoCi0JCQkgICAgICBwcml2cHRyLT5wX2J1ZmZfcGFnZXNfcGVyd3JpdGUgKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zj1wX2J1Zi0+bmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQkgQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgImNsZWFycHRyIik7Ci0JcHJpdnB0ci0+YnVmZnNfYWxsb2MgPSAwOwotICAgICAgICBwcml2cHRyLT5wX2J1ZmZfY2N3PU5VTEw7Ci0gICAgICAgIHByaXZwdHItPnBfYnVmZl9yZWFkPU5VTEw7Ci0gICAgICAgIHByaXZwdHItPnBfYnVmZl93cml0ZT1OVUxMOwotICAgICAgICBwcml2cHRyLT5zeXN0ZW1fdmFsaWRhdGVfY29tcD0wOwotICAgICAgICBwcml2cHRyLT5yZWxlYXNlX3BlbmQ9MDsKLSAgICAgICAgLyogICAgICBSZW1vdmUgYW55IHdyaXRlcyB0aGF0IHdlcmUgcGVuZGluZyBhbmQgcmVzZXQgYWxsIHJlYWRzICAgKi8KLSAgICAgICAgcF90aGlzX2Njdz1wcml2cHRyLT5wX3JlYWRfYWN0aXZlX2ZpcnN0OwotICAgICAgICB3aGlsZSAocF90aGlzX2NjdyE9TlVMTCkgewotICAgICAgICAgICAgICAgIHBfdGhpc19jY3ctPmhlYWRlci5sZW5ndGg9MHhmZmZmOwotICAgICAgICAgICAgICAgIHBfdGhpc19jY3ctPmhlYWRlci5vcGNvZGU9MHhmZjsKLSAgICAgICAgICAgICAgICBwX3RoaXNfY2N3LT5oZWFkZXIuZmxhZz0weDAwOwotICAgICAgICAgICAgICAgIHBfdGhpc19jY3c9cF90aGlzX2Njdy0+bmV4dDsKLSAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChwcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9maXJzdCE9TlVMTCkgewotICAgICAgICAgICAgICAgIHBfdGhpc19jY3c9cHJpdnB0ci0+cF93cml0ZV9hY3RpdmVfZmlyc3Q7Ci0gICAgICAgICAgICAgICAgcF90aGlzX2Njdy0+aGVhZGVyLmZsYWc9Q0xBV19QRU5ESU5HOwotICAgICAgICAgICAgICAgIHByaXZwdHItPnBfd3JpdGVfYWN0aXZlX2ZpcnN0PXBfdGhpc19jY3ctPm5leHQ7Ci0gICAgICAgICAgICAgICAgcF90aGlzX2Njdy0+bmV4dD1wcml2cHRyLT5wX3dyaXRlX2ZyZWVfY2hhaW47Ci0gICAgICAgICAgICAgICAgcHJpdnB0ci0+cF93cml0ZV9mcmVlX2NoYWluPXBfdGhpc19jY3c7Ci0gICAgICAgICAgICAgICAgKytwcml2cHRyLT53cml0ZV9mcmVlX2NvdW50OwotICAgICAgICB9Ci0gICAgICAgIHByaXZwdHItPnBfd3JpdGVfYWN0aXZlX2xhc3Q9TlVMTDsKLSAgICAgICAgcHJpdnB0ci0+bXRjX2xvZ2ljYWxfbGluayA9IC0xOwotICAgICAgICBwcml2cHRyLT5tdGNfc2tpcHBpbmcgPSAxOwotICAgICAgICBwcml2cHRyLT5tdGNfb2Zmc2V0PTA7Ci0KLQlpZiAoKChwcml2cHRyLT5jaGFubmVsW1JFQURfQ0hBTk5FTF0ubGFzdF9kc3RhdCB8Ci0JCXByaXZwdHItPmNoYW5uZWxbV1JJVEVfQ0hBTk5FTF0ubGFzdF9kc3RhdCkgJgotCQl+KERFVl9TVEFUX0NITl9FTkQgfCBERVZfU1RBVF9ERVZfRU5EKSkgIT0gMHgwMCkgewotCQlkZXZfd2FybigmcHJpdnB0ci0+Y2hhbm5lbFtSRUFEX0NIQU5ORUxdLmNkZXYtPmRldiwKLQkJCSJEZWFjdGl2YXRpbmcgJXMgY29tcGxldGVkIHdpdGggaW5jb3JyZWN0IgotCQkJIiBzdWJjaGFubmVsIHN0YXR1cyAiCi0JCQkiKHJlYWQgJTAyeCwgd3JpdGUgJTAyeClcbiIsCi0gICAgICAgICAgICAgICAgZGV2LT5uYW1lLAotCQlwcml2cHRyLT5jaGFubmVsW1JFQURfQ0hBTk5FTF0ubGFzdF9kc3RhdCwKLQkJcHJpdnB0ci0+Y2hhbm5lbFtXUklURV9DSEFOTkVMXS5sYXN0X2RzdGF0KTsKLQkJIENMQVdfREJGX1RFWFQoMiwgdHJhY2UsICJiYWRjbG9zZSIpOwotICAgICAgICB9Ci0JQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgInJsc2V4aXQiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19ICAgICAgLyogZW5kIG9mIGNsYXdfcmVsZWFzZSAgICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgICBjbGF3X3dyaXRlX3JldHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQKLWNsYXdfd3JpdGVfcmV0cnkgKCBzdHJ1Y3QgY2hiayAqcF9jaCApCi17Ci0KLSAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgICpkZXY9cF9jaC0+bmRldjsKLQotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJ3X3JldHJ5Iik7Ci0gICAgICAgIGlmIChwX2NoLT5jbGF3X3N0YXRlID09IENMQVdfU1RPUCkgewotICAgICAgICAJcmV0dXJuOwotICAgICAgICB9Ci0JY2xhd19zdHJ0X291dF9JTyggZGV2ICk7Ci0JQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgInJ0cnlfeGl0Iik7Ci0gICAgICAgIHJldHVybjsKLX0gICAgICAvKiBlbmQgb2YgY2xhd193cml0ZV9yZXRyeSAgICAgICovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgICBjbGF3X3dyaXRlX25leHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQKLWNsYXdfd3JpdGVfbmV4dCAoIHN0cnVjdCBjaGJrICogcF9jaCApCi17Ci0KLSAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgICpkZXY7Ci0gICAgICAgIHN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdnB0cj1OVUxMOwotCXN0cnVjdCBza19idWZmICpwa19za2I7Ci0KLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiY2xhd193cnQiKTsKLSAgICAgICAgaWYgKHBfY2gtPmNsYXdfc3RhdGUgPT0gQ0xBV19TVE9QKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIHBfY2gtPm5kZXY7Ci0JcHJpdnB0ciA9IChzdHJ1Y3QgY2xhd19wcml2YmsgKikgZGV2LT5tbF9wcml2OwotICAgICAgICBjbGF3X2ZyZWVfd3J0X2J1ZiggZGV2ICk7Ci0JaWYgKChwcml2cHRyLT53cml0ZV9mcmVlX2NvdW50ID4gMCkgJiYKLQkgICAgIXNrYl9xdWV1ZV9lbXB0eSgmcF9jaC0+Y29sbGVjdF9xdWV1ZSkpIHsKLQkgIAlwa19za2IgPSBjbGF3X3BhY2tfc2tiKHByaXZwdHIpOwotCQl3aGlsZSAocGtfc2tiICE9IE5VTEwpIHsKLQkJCWNsYXdfaHdfdHgocGtfc2tiLCBkZXYsIDEpOwotCQkJaWYgKHByaXZwdHItPndyaXRlX2ZyZWVfY291bnQgPiAwKSB7Ci0JICAgCQkJcGtfc2tiID0gY2xhd19wYWNrX3NrYihwcml2cHRyKTsKLQkJCX0gZWxzZQotCQkJCXBrX3NrYiA9IE5VTEw7Ci0JCX0KLQl9Ci0gICAgICAgIGlmIChwcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9maXJzdCE9TlVMTCkgewotICAgICAgICAgICAgICAgIGNsYXdfc3RydF9vdXRfSU8oZGV2KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci19ICAgICAgLyogZW5kIG9mIGNsYXdfd3JpdGVfbmV4dCAgICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgY2xhd190aW1lciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkCi1jbGF3X3RpbWVyICggc3RydWN0IGNoYmsgKiBwX2NoICkKLXsKLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAidGltZXIiKTsKLSAgICAgICAgcF9jaC0+ZmxhZyB8PSBDTEFXX1RJTUVSOwotICAgICAgICB3YWtlX3VwKCZwX2NoLT53YWl0KTsKLSAgICAgICAgcmV0dXJuOwotfSAgICAgIC8qIGVuZCBvZiBjbGF3X3RpbWVyICAqLwotCi0vKgotKgotKiAgICAgICBmdW5jdGlvbnMKLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgcGFnZXNfdG9fb3JkZXJfb2ZfbWFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICB0YWtlcyBhIG51bWJlciBvZiBwYWdlcyBmcm9tIDEgdG8gNTEyIGFuZCByZXR1cm5zIHRoZSAgICAgICAgICAgKgotKiAgICBsb2cobnVtX3BhZ2VzKS9sb2coMikgZ2V0X2ZyZWVfcGFnZXMoKSBuZWVkcyBhIGJhc2UgMiBvcmRlciAgICAgKgotKiAgICBvZiBtYWduaXR1ZGUgZ2V0X2ZyZWVfcGFnZXMoKSBoYXMgYW4gdXBwZXIgb3JkZXIgb2YgOSAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludAotcGFnZXNfdG9fb3JkZXJfb2ZfbWFnKGludCBudW1fb2ZfcGFnZXMpCi17Ci0JaW50CW9yZGVyX29mX21hZz0xOwkJLyogYXNzdW1lIDIgcGFnZXMgKi8KLQlpbnQJbnVtcDsKLQotCUNMQVdfREJGX1RFWFRfKDUsIHRyYWNlLCAicGFnZXMlZCIsIG51bV9vZl9wYWdlcyk7Ci0JaWYgKG51bV9vZl9wYWdlcyA9PSAxKSAgIHtyZXR1cm4gMDsgfSAgLyogbWFnbml0dWRlIG9mIDAgPSAxIHBhZ2UgKi8KLQkvKiA1MTIgcGFnZXMgPSAyTWVnIG9uIDRrIHBhZ2Ugc3lzdGVtcyAqLwotCWlmIChudW1fb2ZfcGFnZXMgPj0gNTEyKSB7cmV0dXJuIDk7IH0KLQkvKiB3ZSBoYXZlIHR3byBvciBtb3JlIHBhZ2VzIG9yZGVyIGlzIGF0IGxlYXN0IDEgKi8KLQlmb3IgKG51bXA9MiA7bnVtcCA8PSA1MTI7bnVtcCo9MikgewotCSAgaWYgKG51bV9vZl9wYWdlcyA8PSBudW1wKQotCQkgIGJyZWFrOwotCSAgb3JkZXJfb2ZfbWFnICs9MTsKLQl9Ci0JaWYgKG9yZGVyX29mX21hZyA+IDkpIHsgb3JkZXJfb2ZfbWFnID0gOTsgfSAgLyogSSBrbm93IGl0J3MgcGFyYW5vaWQgKi8KLQlDTEFXX0RCRl9URVhUXyg1LCB0cmFjZSwgIm1hZyVkIiwgb3JkZXJfb2ZfbWFnKTsKLQlyZXR1cm4gb3JkZXJfb2ZfbWFnOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICBhZGRfY2xhd19yZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludAotYWRkX2NsYXdfcmVhZHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNjd2JrKiBwX2ZpcnN0LAotCXN0cnVjdCBjY3diayogcF9sYXN0KQotewotICAgICAgICBzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXZwdHI7Ci0gICAgICAgIHN0cnVjdCBjY3cxICB0ZW1wX2NjdzsKLSAgICAgICAgc3RydWN0IGVuZGNjdyAqIHBfZW5kOwotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJhZGRyZWFkcyIpOwotCXByaXZwdHIgPSBkZXYtPm1sX3ByaXY7Ci0gICAgICAgIHBfZW5kID0gcHJpdnB0ci0+cF9lbmRfY2N3OwotCi0gICAgICAgIC8qIGZpcnN0IENDVyBhbmQgbGFzdCBDQ1cgY29udGFpbnMgYSBuZXcgc2V0IG9mIHJlYWQgY2hhbm5lbCBwcm9ncmFtcwotICAgICAgICAqICAgICAgIHRvIGFwZW5kIHRoZSBydW5uaW5nIGNoYW5uZWwgcHJvZ3JhbXMKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKCBwX2ZpcnN0PT1OVUxMKSB7Ci0JCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJhZGRleGl0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzZXQgdXAgZW5kaW5nIENDVyBzZXF1ZW5jZSBmb3IgdGhpcyBzZWdtZW50ICovCi0gICAgICAgIGlmIChwX2VuZC0+cmVhZDEpIHsKLSAgICAgICAgICAgICAgICBwX2VuZC0+cmVhZDE9MHgwMDsgICAgLyogIHNlY29uZCBlbmRpbmcgQ0NXIGlzIG5vdyBhY3RpdmUgKi8KLSAgICAgICAgICAgICAgICAvKiAgICAgIHJlc2V0IGVuZGluZyBDQ1dzIGFuZCBzZXR1cCBUSUMgQ0NXcyAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwX2VuZC0+cmVhZDJfbm9wMi5jbWRfY29kZSA9IENDV19DTEFXX0NNRF9SRUFERkY7Ci0gICAgICAgICAgICAgICAgcF9lbmQtPnJlYWQyX25vcDIuZmxhZ3MgID0gQ0NXX0ZMQUdfU0xJIHwgQ0NXX0ZMQUdfU0tJUDsKLSAgICAgICAgICAgICAgICBwX2xhc3QtPnJfVElDXzEuY2RhID0oX191MzIpX19wYSgmcF9lbmQtPnJlYWQyX25vcDEpOwotICAgICAgICAgICAgICAgIHBfbGFzdC0+cl9USUNfMi5jZGEgPShfX3UzMilfX3BhKCZwX2VuZC0+cmVhZDJfbm9wMSk7Ci0gICAgICAgICAgICAgICAgcF9lbmQtPnJlYWQyX25vcDIuY2RhPTA7Ci0gICAgICAgICAgICAgICAgcF9lbmQtPnJlYWQyX25vcDIuY291bnQ9MTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBwX2VuZC0+cmVhZDE9MHgwMTsgIC8qIGZpcnN0IGVuZGluZyBDQ1cgaXMgbm93IGFjdGl2ZSAqLwotICAgICAgICAgICAgICAgIC8qICAgICAgcmVzZXQgZW5kaW5nIENDV3MgYW5kIHNldHVwIFRJQyBDQ1dzICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcF9lbmQtPnJlYWQxX25vcDIuY21kX2NvZGUgPSBDQ1dfQ0xBV19DTURfUkVBREZGOwotICAgICAgICAgICAgICAgIHBfZW5kLT5yZWFkMV9ub3AyLmZsYWdzICA9IENDV19GTEFHX1NMSSB8IENDV19GTEFHX1NLSVA7Ci0gICAgICAgICAgICAgICAgcF9sYXN0LT5yX1RJQ18xLmNkYSA9IChfX3UzMilfX3BhKCZwX2VuZC0+cmVhZDFfbm9wMSk7Ci0gICAgICAgICAgICAgICAgcF9sYXN0LT5yX1RJQ18yLmNkYSA9IChfX3UzMilfX3BhKCZwX2VuZC0+cmVhZDFfbm9wMSk7Ci0gICAgICAgICAgICAgICAgcF9lbmQtPnJlYWQxX25vcDIuY2RhPTA7Ci0gICAgICAgICAgICAgICAgcF9lbmQtPnJlYWQxX25vcDIuY291bnQ9MTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcHJpdnB0ci0+IHBfcmVhZF9hY3RpdmVfZmlyc3QgPT1OVUxMICkgewotCQlwcml2cHRyLT5wX3JlYWRfYWN0aXZlX2ZpcnN0ID0gcF9maXJzdDsgIC8qICBzZXQgbmV3IGZpcnN0ICovCi0JCXByaXZwdHItPnBfcmVhZF9hY3RpdmVfbGFzdCAgPSBwX2xhc3Q7ICAgLyogIHNldCBuZXcgbGFzdCAgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgICAgIC8qIHNldCB1cCBUSUMgY2N3ICAqLwotICAgICAgICAgICAgICAgIHRlbXBfY2N3LmNkYT0gKF9fdTMyKV9fcGEoJnBfZmlyc3QtPnJlYWQpOwotICAgICAgICAgICAgICAgIHRlbXBfY2N3LmNvdW50PTA7Ci0gICAgICAgICAgICAgICAgdGVtcF9jY3cuZmxhZ3M9MDsKLSAgICAgICAgICAgICAgICB0ZW1wX2Njdy5jbWRfY29kZSA9IENDV19DTEFXX0NNRF9USUM7Ci0KLQotICAgICAgICAgICAgICAgIGlmIChwX2VuZC0+cmVhZDEpIHsKLQotICAgICAgICAgICAgICAgLyogZmlyc3Qgc2V0IG9mIENDVydzIGlzIGNoYWluZWQgdG8gdGhlIG5ldyByZWFkICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgLyogY2hhaW4sIHNvIHRoZSBzZWNvbmQgc2V0IGlzIGNoYWluZWQgdG8gdGhlIGFjdGl2ZSBjaGFpbi4gICAqLwotICAgICAgICAgICAgICAgLyogVGhlcmVmb3JlIG1vZGlmeSB0aGUgc2Vjb25kIHNldCB0byBwb2ludCB0byB0aGUgbmV3ICAgICAgICAqLwotICAgICAgICAgICAgICAgLyogcmVhZCBjaGFpbiBzZXQgdXAgVElDIENDV3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgQ0NXIHNvIGNoYW5uZWwgZG9lc24ndCBmZXRjaCBpdCAgICAqLwotICAgICAgICAgICAgICAgLyogd2hlbiBpdCdzIG9ubHkgaGFsZiBkb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCAmcF9lbmQtPnJlYWQyX25vcDIsICZ0ZW1wX2NjdyAsCi0JCQkJc2l6ZW9mKHN0cnVjdCBjY3cxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2cHRyLT5wX3JlYWRfYWN0aXZlX2xhc3QtPnJfVElDXzEuY2RhPQotCQkJCShfX3UzMilfX3BhKCZwX2ZpcnN0LT5yZWFkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnBfcmVhZF9hY3RpdmVfbGFzdC0+cl9USUNfMi5jZGE9Ci0JCQkJKF9fdTMyKV9fcGEoJnBfZmlyc3QtPnJlYWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSB3ZSB1cGRhdGUgdGhlIENDVyBzbyBjaGFubmVsIGRvZXNuJ3QgICAqLwotCQkJLyogZmV0Y2ggaXQgd2hlbiBpdCBpcyBvbmx5IGhhbGYgZG9uZSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoICZwX2VuZC0+cmVhZDFfbm9wMiwgJnRlbXBfY2N3ICwKLQkJCQlzaXplb2Yoc3RydWN0IGNjdzEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnBfcmVhZF9hY3RpdmVfbGFzdC0+cl9USUNfMS5jZGE9Ci0JCQkJKF9fdTMyKV9fcGEoJnBfZmlyc3QtPnJlYWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpdnB0ci0+cF9yZWFkX2FjdGl2ZV9sYXN0LT5yX1RJQ18yLmNkYT0KLQkJCQkoX191MzIpX19wYSgmcF9maXJzdC0+cmVhZCk7Ci0gICAgICAgICAgICAgICAgfQotCQkvKiAgICAgIGNoYWluIGluIG5ldyBzZXQgb2YgYmxvY2tzICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcHJpdnB0ci0+cF9yZWFkX2FjdGl2ZV9sYXN0LT5uZXh0ID0gcF9maXJzdDsKLSAgICAgICAgICAgICAgICBwcml2cHRyLT5wX3JlYWRfYWN0aXZlX2xhc3Q9cF9sYXN0OwotICAgICAgICB9IC8qIGVuZCBvZiBpZiAoIHByaXZwdHItPiBwX3JlYWRfYWN0aXZlX2ZpcnN0ID09TlVMTCkgICovCi0JQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgImFkZGV4aXQiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci19ICAgIC8qICAgICBlbmQgb2YgYWRkX2NsYXdfcmVhZHMgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiAgIGNjd19jaGVja19yZXR1cm5fY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZAotY2N3X2NoZWNrX3JldHVybl9jb2RlKHN0cnVjdCBjY3dfZGV2aWNlICpjZGV2LCBpbnQgcmV0dXJuX2NvZGUpCi17Ci0JQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgImNjd3JldCIpOwotICAgICAgICBpZiAocmV0dXJuX2NvZGUgIT0gMCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAocmV0dXJuX2NvZGUpIHsKLQkJY2FzZSAtRUJVU1k6IC8qIEJVU1kgaXMgYSB0cmFuc2llbnQgc3RhdGUgbm8gYWN0aW9uIG5lZWRlZCAqLwotCQkJYnJlYWs7Ci0JCWNhc2UgLUVOT0RFVjoKLQkJCWRldl9lcnIoJmNkZXYtPmRldiwgIlRoZSByZW1vdGUgY2hhbm5lbCBhZGFwdGVyIGlzIG5vdCIKLQkJCQkiIGF2YWlsYWJsZVxuIik7Ci0JCQlicmVhazsKLQkJY2FzZSAtRUlOVkFMOgotCQkJZGV2X2VycigmY2Rldi0+ZGV2LAotCQkJCSJUaGUgc3RhdHVzIG9mIHRoZSByZW1vdGUgY2hhbm5lbCBhZGFwdGVyIgotCQkJCSIgaXMgbm90IHZhbGlkXG4iKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJZGV2X2VycigmY2Rldi0+ZGV2LCAiVGhlIGNvbW1vbiBkZXZpY2UgbGF5ZXIiCi0JCQkJIiByZXR1cm5lZCBlcnJvciBjb2RlICVkXG4iLAotCQkJCSAgcmV0dXJuX2NvZGUpOwotCQl9Ci0JfQotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJjY3dyZXQiKTsKLX0gICAgLyogICAgZW5kIG9mIGNjd19jaGVja19yZXR1cm5fY29kZSAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSogICAgICAgY2N3X2NoZWNrX3VuaXRfY2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkCi1jY3dfY2hlY2tfdW5pdF9jaGVjayhzdHJ1Y3QgY2hiayAqIHBfY2gsIHVuc2lnbmVkIGNoYXIgc2Vuc2UgKQotewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcF9jaC0+bmRldjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcF9jaC0+Y2Rldi0+ZGV2OwotCi0JQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgInVuaXRjaGVrIik7Ci0JZGV2X3dhcm4oZGV2LCAiVGhlIGNvbW11bmljYXRpb24gcGVlciBvZiAlcyBkaXNjb25uZWN0ZWRcbiIsCi0JCW5kZXYtPm5hbWUpOwotCi0JaWYgKHNlbnNlICYgMHg0MCkgewotCQlpZiAoc2Vuc2UgJiAweDAxKSB7Ci0JCQlkZXZfd2FybihkZXYsICJUaGUgcmVtb3RlIGNoYW5uZWwgYWRhcHRlciBmb3IiCi0JCQkJIiAlcyBoYXMgYmVlbiByZXNldFxuIiwKLQkJCQluZGV2LT5uYW1lKTsKLQkJfQotCX0gZWxzZSBpZiAoc2Vuc2UgJiAweDIwKSB7Ci0JCWlmIChzZW5zZSAmIDB4MDQpIHsKLQkJCWRldl93YXJuKGRldiwgIkEgZGF0YSBzdHJlYW1pbmcgdGltZW91dCBvY2N1cnJlZCIKLQkJCQkiIGZvciAlc1xuIiwKLQkJCQluZGV2LT5uYW1lKTsKLQkJfSBlbHNlIGlmIChzZW5zZSAmIDB4MTApIHsKLQkJCWRldl93YXJuKGRldiwgIlRoZSByZW1vdGUgY2hhbm5lbCBhZGFwdGVyIGZvciAlcyIKLQkJCQkiIGlzIGZhdWx0eVxuIiwKLQkJCQluZGV2LT5uYW1lKTsKLQkJfSBlbHNlIHsKLQkJCWRldl93YXJuKGRldiwgIkEgZGF0YSB0cmFuc2ZlciBwYXJpdHkgZXJyb3Igb2NjdXJyZWQiCi0JCQkJIiBmb3IgJXNcbiIsCi0JCQkJbmRldi0+bmFtZSk7Ci0JCX0KLQl9IGVsc2UgaWYgKHNlbnNlICYgMHgxMCkgewotCQlkZXZfd2FybihkZXYsICJBIHJlYWQgZGF0YSBwYXJpdHkgZXJyb3Igb2NjdXJyZWQiCi0JCQkiIGZvciAlc1xuIiwKLQkJCW5kZXYtPm5hbWUpOwotCX0KLQotfSAgIC8qICAgIGVuZCBvZiBjY3dfY2hlY2tfdW5pdF9jaGVjayAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0qICAgICAgICAgICAgICAgZmluZF9saW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludAotZmluZF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKmhvc3RfbmFtZSwgY2hhciAqd3NfbmFtZSApCi17Ci0Jc3RydWN0IGNsYXdfcHJpdmJrICpwcml2cHRyOwotCXN0cnVjdCBjbGF3X2VudiAqcF9lbnY7Ci0JaW50ICAgIHJjPTA7Ci0KLQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAiZmluZGxpbmsiKTsKLQlwcml2cHRyID0gZGV2LT5tbF9wcml2OwotICAgICAgICBwX2Vudj1wcml2cHRyLT5wX2VudjsKLQlzd2l0Y2ggKHBfZW52LT5wYWNraW5nKQotCXsKLQkJY2FzZSAgUEFDS0lOR19BU0s6Ci0JCQlpZiAoKG1lbWNtcChXU19BUFBMX05BTUVfUEFDS0VELCBob3N0X25hbWUsIDgpIT0wKSB8fAotCQkJICAgIChtZW1jbXAoV1NfQVBQTF9OQU1FX1BBQ0tFRCwgd3NfbmFtZSwgOCkhPTAgKSkKLSAgICAgICAgCSAgICAgICAgICAgICByYyA9IEVJTlZBTDsKLQkJCWJyZWFrOwotCQljYXNlICBET19QQUNLRUQ6Ci0JCWNhc2UgIFBBQ0tfU0VORDoKLQkJCWlmICgobWVtY21wKFdTX0FQUExfTkFNRV9JUF9OQU1FLCBob3N0X25hbWUsIDgpIT0wKSB8fAotCQkJICAgIChtZW1jbXAoV1NfQVBQTF9OQU1FX0lQX05BTUUsIHdzX25hbWUsIDgpIT0wICkpCi0gICAgICAgIAkgICAgICAgIAlyYyA9IEVJTlZBTDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCSAgICAgICAJCWlmICgobWVtY21wKEhPU1RfQVBQTF9OQU1FLCBob3N0X25hbWUsIDgpIT0wKSB8fAotCQkgICAgCSAgICAobWVtY21wKHBfZW52LT5hcGlfdHlwZSAsIHdzX25hbWUsIDgpIT0wKSkKLSAgICAgICAgCSAgICAgICAgCXJjID0gRUlOVkFMOwotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJjOwotfSAgICAvKiAgICBlbmQgb2YgZmluZF9saW5rICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqICAgY2xhd19od190eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQKLWNsYXdfaHdfdHgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbG9uZyBsaW5raWQpCi17Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmM9MDsKLSAgICAgICAgc3RydWN0IGNsYXdfcHJpdmJrIAkJKnByaXZwdHI7Ci0gICAgICAgIHN0cnVjdCBjY3diayAgICAgICAgICAgKnBfdGhpc19jY3c7Ci0gICAgICAgIHN0cnVjdCBjY3diayAgICAgICAgICAgKnBfZmlyc3RfY2N3OwotICAgICAgICBzdHJ1Y3QgY2N3YmsgICAgICAgICAgICpwX2xhc3RfY2N3OwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnM7Ci0gICAgICAgIHNpZ25lZCBsb25nICAgICAgICAgICAgICAgICAgICAgbGVuX29mX2RhdGE7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgICAgICAgICAgYnl0ZXNJblRoaXNCdWZmZXI7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgICAgICAgICAgICAgICAgICAgKnBEYXRhQWRkcmVzczsKLSAgICAgICAgc3RydWN0IGVuZGNjdyAgICAgICAgICAgICAgICAgICAqcEVuZDsKLSAgICAgICAgc3RydWN0IGNjdzEgICAgICAgICAgICAgICAgICAgICB0ZW1wQ0NXOwotCXN0cnVjdCBjbGF3X2VudgkJCSpwX2VudjsKLQlzdHJ1Y3QgY2xhd3BoCQkJKnBrX2hlYWQ7Ci0Jc3RydWN0IGNoYmsJCQkqY2g7Ci0KLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiaHdfdHgiKTsKLQlwcml2cHRyID0gKHN0cnVjdCBjbGF3X3ByaXZiayAqKShkZXYtPm1sX3ByaXYpOwotCXBfZW52ID1wcml2cHRyLT5wX2VudjsKLQljbGF3X2ZyZWVfd3J0X2J1ZihkZXYpOwkvKiBDbGVhbiB1cCBmcmVlIGNoYWluIGlmIHBvc2libGUgKi8KLSAgICAgICAgLyogIHNjYW4gdGhlIHdyaXRlIHF1ZXVlIHRvIGZyZWUgYW55IGNvbXBsZXRlZCB3cml0ZSBwYWNrZXRzICAgKi8KLSAgICAgICAgcF9maXJzdF9jY3c9TlVMTDsKLSAgICAgICAgcF9sYXN0X2Njdz1OVUxMOwotCWlmICgocF9lbnYtPnBhY2tpbmcgPj0gUEFDS19TRU5EKSAmJgotICAgICAgIAkgICAgKHNrYi0+Y2JbMV0gIT0gJ1AnKSkgewotCQlza2JfcHVzaChza2Isc2l6ZW9mKHN0cnVjdCBjbGF3cGgpKTsKLQkJcGtfaGVhZD0oc3RydWN0IGNsYXdwaCAqKXNrYi0+ZGF0YTsKLQkJcGtfaGVhZC0+bGVuPXNrYi0+bGVuLXNpemVvZihzdHJ1Y3QgY2xhd3BoKTsKLQkJaWYgKHBrX2hlYWQtPmxlbiU0KSAgewotCQkJcGtfaGVhZC0+bGVuKz0gNC0ocGtfaGVhZC0+bGVuJTQpOwotCQkJc2tiX3BhZChza2IsNC0ocGtfaGVhZC0+bGVuJTQpKTsKLQkJCXNrYl9wdXQoc2tiLDQtKHBrX2hlYWQtPmxlbiU0KSk7Ci0JCX0KLQkJaWYgKHBfZW52LT5wYWNraW5nID09IERPX1BBQ0tFRCkKLQkJCXBrX2hlYWQtPmxpbmtfbnVtID0gbGlua2lkOwotCQllbHNlCi0JCQlwa19oZWFkLT5saW5rX251bSA9IDA7Ci0JCXBrX2hlYWQtPmZsYWcgPSAweDAwOwotCQlza2JfcGFkKHNrYiw0KTsKLQkJc2tiLT5jYlsxXSA9ICdQJzsKLQl9Ci0gICAgICAgIGlmIChsaW5raWQgPT0gMCkgewotICAgICAgICAJaWYgKGNsYXdfY2hlY2tfYnVzeShkZXYpKSB7Ci0gICAgICAgICAgICAgICAgCWlmIChwcml2cHRyLT53cml0ZV9mcmVlX2NvdW50IT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXdfY2xlYXJfYnVzeShkZXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXdfc3RydF9vdXRfSU8oZGV2ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXdfZnJlZV93cnRfYnVmKCBkZXYgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByaXZwdHItPndyaXRlX2ZyZWVfY291bnQ9PTApIHsKLQkJCQkJY2ggPSAmcHJpdnB0ci0+Y2hhbm5lbFtXUklURV9DSEFOTkVMXTsKLQkJCQkJYXRvbWljX2luYygmc2tiLT51c2Vycyk7Ci0JCQkJCXNrYl9xdWV1ZV90YWlsKCZjaC0+Y29sbGVjdF9xdWV1ZSwgc2tiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWdvdG8gRG9uZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNsYXdfY2xlYXJfYnVzeShkZXYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qICB0eCBsb2NrICAqLwotICAgICAgICAgICAgICAgIGlmIChjbGF3X3Rlc3RfYW5kX3NldGJpdF9idXN5KFRCX1RYLGRldikpIHsgLyogc2V0IHRvIGJ1c3kgKi8KLQkJCWNoID0gJnByaXZwdHItPmNoYW5uZWxbV1JJVEVfQ0hBTk5FTF07Ci0JCQlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKLQkJCXNrYl9xdWV1ZV90YWlsKCZjaC0+Y29sbGVjdF9xdWV1ZSwgc2tiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsYXdfc3RydF9vdXRfSU8oZGV2ICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYz0tRUJVU1k7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIERvbmUyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiAgICAgIFNlZSBob3cgbWFueSB3cml0ZSBidWZmZXJzIGFyZSByZXF1aXJlZCB0byBob2xkIHRoaXMgZGF0YSAqLwotCW51bUJ1ZmZlcnMgPSBESVZfUk9VTkRfVVAoc2tiLT5sZW4sIHByaXZwdHItPnBfZW52LT53cml0ZV9zaXplKTsKLQotICAgICAgICAvKiAgICAgIElmIHRoYXQgbnVtYmVyIG9mIGJ1ZmZlcnMgaXNuJ3QgYXZhaWxhYmxlLCBnaXZlIHVwIGZvciBub3cgKi8KLSAgICAgICAgaWYgKHByaXZwdHItPndyaXRlX2ZyZWVfY291bnQgPCBudW1CdWZmZXJzIHx8Ci0gICAgICAgICAgICBwcml2cHRyLT5wX3dyaXRlX2ZyZWVfY2hhaW4gPT0gTlVMTCApIHsKLQotICAgICAgICAgICAgICAgIGNsYXdfc2V0Yml0X2J1c3koVEJfTk9CVUZGRVIsZGV2KTsKLQkJY2ggPSAmcHJpdnB0ci0+Y2hhbm5lbFtXUklURV9DSEFOTkVMXTsKLQkJYXRvbWljX2luYygmc2tiLT51c2Vycyk7Ci0JCXNrYl9xdWV1ZV90YWlsKCZjaC0+Y29sbGVjdF9xdWV1ZSwgc2tiKTsKLQkJQ0xBV19EQkZfVEVYVCgyLCB0cmFjZSwgImNsYXdidXN5Iik7Ci0gICAgICAgICAgICAgICAgZ290byBEb25lMjsKLSAgICAgICAgfQotICAgICAgICBwRGF0YUFkZHJlc3M9c2tiLT5kYXRhOwotICAgICAgICBsZW5fb2ZfZGF0YT1za2ItPmxlbjsKLQotICAgICAgICB3aGlsZSAobGVuX29mX2RhdGEgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcF90aGlzX2Njdz1wcml2cHRyLT5wX3dyaXRlX2ZyZWVfY2hhaW47ICAvKiBnZXQgYSBibG9jayAqLwotCQlpZiAocF90aGlzX2NjdyA9PSBOVUxMKSB7IC8qIGxvc3QgdGhlIHJhY2UgKi8KLQkJCWNoID0gJnByaXZwdHItPmNoYW5uZWxbV1JJVEVfQ0hBTk5FTF07Ci0JCQlhdG9taWNfaW5jKCZza2ItPnVzZXJzKTsKLQkJCXNrYl9xdWV1ZV90YWlsKCZjaC0+Y29sbGVjdF9xdWV1ZSwgc2tiKTsKLQkJCWdvdG8gRG9uZTI7Ci0JCX0KLSAgICAgICAgICAgICAgICBwcml2cHRyLT5wX3dyaXRlX2ZyZWVfY2hhaW49cF90aGlzX2Njdy0+bmV4dDsKLSAgICAgICAgICAgICAgICBwX3RoaXNfY2N3LT5uZXh0PU5VTEw7Ci0gICAgICAgICAgICAgICAgLS1wcml2cHRyLT53cml0ZV9mcmVlX2NvdW50OyAvKiAtMSAqLwotCQlpZiAobGVuX29mX2RhdGEgPj0gcHJpdnB0ci0+cF9lbnYtPndyaXRlX3NpemUpCi0JCQlieXRlc0luVGhpc0J1ZmZlciA9IHByaXZwdHItPnBfZW52LT53cml0ZV9zaXplOwotCQllbHNlCi0JCQlieXRlc0luVGhpc0J1ZmZlciA9IGxlbl9vZl9kYXRhOwotICAgICAgICAgICAgICAgIG1lbWNweSggcF90aGlzX2Njdy0+cF9idWZmZXIscERhdGFBZGRyZXNzLCBieXRlc0luVGhpc0J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgbGVuX29mX2RhdGEtPWJ5dGVzSW5UaGlzQnVmZmVyOwotICAgICAgICAgICAgICAgIHBEYXRhQWRkcmVzcys9KHVuc2lnbmVkIGxvbmcpYnl0ZXNJblRoaXNCdWZmZXI7Ci0gICAgICAgICAgICAgICAgLyogICAgICBzZXR1cCB3cml0ZSBDQ1cgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBfdGhpc19jY3ctPndyaXRlLmNtZF9jb2RlID0gKGxpbmtpZCAqIDgpICsxOwotICAgICAgICAgICAgICAgIGlmIChsZW5fb2ZfZGF0YT4wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RoaXNfY2N3LT53cml0ZS5jbWRfY29kZSs9TU9SRV90b19DT01FX0ZMQUc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfdGhpc19jY3ctPndyaXRlLmNvdW50PWJ5dGVzSW5UaGlzQnVmZmVyOwotICAgICAgICAgICAgICAgIC8qICAgICAgbm93IGFkZCB0byBlbmQgb2YgdGhpcyBjaGFpbiAgICAqLwotICAgICAgICAgICAgICAgIGlmIChwX2ZpcnN0X2Njdz09TlVMTCkgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcF9maXJzdF9jY3c9cF90aGlzX2NjdzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBfbGFzdF9jY3chPU5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfbGFzdF9jY3ctPm5leHQ9cF90aGlzX2NjdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgc2V0IHVwIFRJQyBjY3dzICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfbGFzdF9jY3ctPndfVElDXzEuY2RhPQotCQkJCShfX3UzMilfX3BhKCZwX3RoaXNfY2N3LT53cml0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfbGFzdF9jY3c9cF90aGlzX2NjdzsgICAgICAvKiBzYXZlIG5ldyBsYXN0IGJsb2NrICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiAgICAgIEZpcnN0Q0NXIGFuZCBMYXN0Q0NXIG5vdyBjb250YWluIGEgbmV3IHNldCBvZiB3cml0ZSBjaGFubmVsCi0gICAgICAgICogICAgICAgcHJvZ3JhbXMgdG8gYXBwZW5kIHRvIHRoZSBydW5uaW5nIGNoYW5uZWwgcHJvZ3JhbQotICAgICAgICAqLwotCi0gICAgICAgIGlmIChwX2ZpcnN0X2NjdyE9TlVMTCkgewotCQkvKiAgICAgIHNldHVwIGVuZGluZyBjY3cgc2VxdWVuY2UgZm9yIHRoaXMgc2VnbWVudCAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwRW5kPXByaXZwdHItPnBfZW5kX2NjdzsKLSAgICAgICAgICAgICAgICBpZiAocEVuZC0+d3JpdGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRW5kLT53cml0ZTE9MHgwMDsgICAvKiBzZWNvbmQgZW5kIGNjdyBpcyBub3cgYWN0aXZlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIHNldCB1cCBUaWMgQ0NXcyAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2xhc3RfY2N3LT53X1RJQ18xLmNkYT0KLQkJCQkoX191MzIpX19wYSgmcEVuZC0+d3JpdGUyX25vcDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcEVuZC0+d3JpdGUyX25vcDIuY21kX2NvZGUgPSBDQ1dfQ0xBV19DTURfUkVBREZGOwotICAgICAgICAgICAgICAgICAgICAgICAgcEVuZC0+d3JpdGUyX25vcDIuZmxhZ3MgICAgPQotCQkJCUNDV19GTEFHX1NMSSB8IENDV19GTEFHX1NLSVA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRW5kLT53cml0ZTJfbm9wMi5jZGE9MDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFbmQtPndyaXRlMl9ub3AyLmNvdW50PTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgeyAgLyogIGVuZCBvZiBpZiAocEVuZC0+d3JpdGUxKSovCi0gICAgICAgICAgICAgICAgICAgICAgICBwRW5kLT53cml0ZTE9MHgwMTsgICAvKiBmaXJzdCBlbmQgY2N3IGlzIG5vdyBhY3RpdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgc2V0IHVwIFRpYyBDQ1dzICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfbGFzdF9jY3ctPndfVElDXzEuY2RhPQotCQkJCShfX3UzMilfX3BhKCZwRW5kLT53cml0ZTFfbm9wMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRW5kLT53cml0ZTFfbm9wMi5jbWRfY29kZSA9IENDV19DTEFXX0NNRF9SRUFERkY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwRW5kLT53cml0ZTFfbm9wMi5mbGFncyAgICA9Ci0JCQkJQ0NXX0ZMQUdfU0xJIHwgQ0NXX0ZMQUdfU0tJUDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBFbmQtPndyaXRlMV9ub3AyLmNkYT0wOwotICAgICAgICAgICAgICAgICAgICAgICAgcEVuZC0+d3JpdGUxX25vcDIuY291bnQ9MTsKLSAgICAgICAgICAgICAgICB9ICAvKiBlbmQgaWYgaWYgKHBFbmQtPndyaXRlMSkgKi8KLQotICAgICAgICAgICAgICAgIGlmIChwcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9maXJzdD09TlVMTCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnBfd3JpdGVfYWN0aXZlX2ZpcnN0PXBfZmlyc3RfY2N3OwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpdnB0ci0+cF93cml0ZV9hY3RpdmVfbGFzdD1wX2xhc3RfY2N3OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgc2V0IHVwIFRpYyBDQ1dzICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcENDVy5jZGE9KF9fdTMyKV9fcGEoJnBfZmlyc3RfY2N3LT53cml0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ0NXLmNvdW50PTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ0NXLmZsYWdzPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wQ0NXLmNtZF9jb2RlPUNDV19DTEFXX0NNRF9USUM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwRW5kLT53cml0ZTEpIHsKLQotICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIGZpcnN0IHNldCBvZiBlbmRpbmcgQ0NXJ3MgaXMgY2hhaW5lZCB0byB0aGUgbmV3IHdyaXRlCi0gICAgICAgICAgICAgICAgICogY2hhaW4sIHNvIHRoZSBzZWNvbmQgc2V0IGlzIGNoYWluZWQgdG8gdGhlIGFjdGl2ZSBjaGFpbgotICAgICAgICAgICAgICAgICAqIFRoZXJlZm9yZSBtb2RpZnkgdGhlIHNlY29uZCBzZXQgdG8gcG9pbnQgdGhlIG5ldyB3cml0ZSBjaGFpbi4KLSAgICAgICAgICAgICAgICAgKiBtYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSBDQ1cgYXRvbWljYWxseQotICAgICAgICAgICAgICAgICAqIHNvIGNoYW5uZWwgZG9lcyBub3QgZmV0Y2ggaXQgd2hlbiBpdCdzIG9ubHkgaGFsZiBkb25lCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggJnBFbmQtPndyaXRlMl9ub3AyLCAmdGVtcENDVyAsCi0JCQkJCXNpemVvZihzdHJ1Y3QgY2N3MSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9sYXN0LT53X1RJQ18xLmNkYT0KLQkJCQkJKF9fdTMyKV9fcGEoJnBfZmlyc3RfY2N3LT53cml0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyptYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSBDQ1cgYXRvbWljYWxseQotICAgICAgICAgICAgICAgICAgICAgICAgICpzbyBjaGFubmVsIGRvZXMgbm90IGZldGNoIGl0IHdoZW4gaXQncyBvbmx5IGhhbGYgZG9uZQotICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmcEVuZC0+d3JpdGUxX25vcDIsICZ0ZW1wQ0NXICwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBjY3cxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnBfd3JpdGVfYWN0aXZlX2xhc3QtPndfVElDXzEuY2RhPQotCQkJCSAgICAgICAgKF9fdTMyKV9fcGEoJnBfZmlyc3RfY2N3LT53cml0ZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogZW5kIGlmIGlmIChwRW5kLT53cml0ZTEpICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnBfd3JpdGVfYWN0aXZlX2xhc3QtPm5leHQ9cF9maXJzdF9jY3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9sYXN0PXBfbGFzdF9jY3c7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgIH0gLyogZW5kaWYgKHBfZmlyc3RfY2N3IT1OVUxMKSAgKi8KLSAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLSAgICAgICAgY2xhd19zdHJ0X291dF9JTyhkZXYgKTsKLSAgICAgICAgLyogICAgICBpZiB3cml0ZSBmcmVlIGNvdW50IGlzIHplcm8gLCBzZXQgTk9CVUZGRVIgICAgICAgKi8KLQlpZiAocHJpdnB0ci0+d3JpdGVfZnJlZV9jb3VudD09MCkgewotCQljbGF3X3NldGJpdF9idXN5KFRCX05PQlVGRkVSLGRldik7Ci0gICAgICAgIH0KLURvbmUyOgotCWNsYXdfY2xlYXJiaXRfYnVzeShUQl9UWCxkZXYpOwotRG9uZToKLQlyZXR1cm4ocmMpOwotfSAgICAvKiAgICBlbmQgb2YgY2xhd19od190eCAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICBpbml0X2Njd19iayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50Ci1pbml0X2Njd19iayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCi0gICAgICAgIF9fdTMyICAgY2N3X2Jsb2Nrc19yZXF1aXJlZDsKLSAgICAgICAgX191MzIgICBjY3dfYmxvY2tzX3BlcnBhZ2U7Ci0gICAgICAgIF9fdTMyICAgY2N3X3BhZ2VzX3JlcXVpcmVkOwotICAgICAgICBfX3UzMiAgIGNsYXdfcmVhZHNfcGVycGFnZT0xOwotICAgICAgICBfX3UzMiAgIGNsYXdfcmVhZF9wYWdlczsKLSAgICAgICAgX191MzIgICBjbGF3X3dyaXRlc19wZXJwYWdlPTE7Ci0gICAgICAgIF9fdTMyICAgY2xhd193cml0ZV9wYWdlczsKLSAgICAgICAgdm9pZCAgICAqcF9idWZmPU5VTEw7Ci0gICAgICAgIHN0cnVjdCBjY3diaypwX2ZyZWVfY2hhaW47Ci0Jc3RydWN0IGNjd2JrKnBfYnVmOwotCXN0cnVjdCBjY3diaypwX2xhc3RfQ0NXQjsKLQlzdHJ1Y3QgY2N3YmsqcF9maXJzdF9DQ1dCOwotICAgICAgICBzdHJ1Y3QgZW5kY2N3ICpwX2VuZGNjdz1OVUxMOwotCWFkZHJfdCAgcmVhbF9hZGRyZXNzOwotCXN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdnB0ciA9IGRldi0+bWxfcHJpdjsKLSAgICAgICAgc3RydWN0IGNsYXdoICpwQ2xhd0g9TlVMTDsKLSAgICAgICAgYWRkcl90ICAgcmVhbF9USUNfYWRkcmVzczsKLSAgICAgICAgaW50IGksajsKLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiaW5pdF9jY3ciKTsKLQotICAgICAgICAvKiAgaW5pdGlhbGl6ZSAgc3RhdGlzdGljcyBmaWVsZCAqLwotICAgICAgICBwcml2cHRyLT5hY3RpdmVfbGlua19JRD0wOwotICAgICAgICAvKiAgaW5pdGlhbGl6ZSAgY2N3YmsgcG9pbnRlcnMgICovCi0gICAgICAgIHByaXZwdHItPnBfd3JpdGVfZnJlZV9jaGFpbj1OVUxMOyAgIC8qIHBvaW50ZXIgdG8gZnJlZSBjY3cgY2hhaW4qLwotICAgICAgICBwcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9maXJzdD1OVUxMOyAvKiBwb2ludGVyIHRvIHRoZSBmaXJzdCB3cml0ZSBjY3cqLwotICAgICAgICBwcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9sYXN0PU5VTEw7ICAvKiBwb2ludGVyIHRvIHRoZSBsYXN0IHdyaXRlIGNjdyovCi0gICAgICAgIHByaXZwdHItPnBfcmVhZF9hY3RpdmVfZmlyc3Q9TlVMTDsgIC8qIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHJlYWQgY2N3Ki8KLSAgICAgICAgcHJpdnB0ci0+cF9yZWFkX2FjdGl2ZV9sYXN0PU5VTEw7ICAgLyogcG9pbnRlciB0byB0aGUgbGFzdCByZWFkIGNjdyAqLwotICAgICAgICBwcml2cHRyLT5wX2VuZF9jY3c9TlVMTDsgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGVuZGluZyBjY3cgICAgICAgICovCi0gICAgICAgIHByaXZwdHItPnBfY2xhd19zaWduYWxfYmxrPU5VTEw7ICAgIC8qIHBvaW50ZXIgdG8gc2lnbmFsIGJsb2NrICAgICAgKi8KLQlwcml2cHRyLT5idWZmc19hbGxvYyA9IDA7Ci0gICAgICAgIG1lbXNldCgmcHJpdnB0ci0+ZW5kX2NjdywgMHgwMCwgc2l6ZW9mKHN0cnVjdCBlbmRjY3cpKTsKLSAgICAgICAgbWVtc2V0KCZwcml2cHRyLT5jdGxfYmssIDB4MDAsIHNpemVvZihzdHJ1Y3QgY2xhd2N0bCkpOwotICAgICAgICAvKiAgaW5pdGlhbGl6ZSAgZnJlZSB3cml0ZSBjY3diayBjb3VudGVyICAqLwotICAgICAgICBwcml2cHRyLT53cml0ZV9mcmVlX2NvdW50PTA7ICAvKiBudW1iZXIgb2YgZnJlZSBidWZzIG9uIHdyaXRlIGNoYWluICovCi0gICAgICAgIHBfbGFzdF9DQ1dCID0gTlVMTDsKLSAgICAgICAgcF9maXJzdF9DQ1dCPSBOVUxMOwotICAgICAgICAvKgotICAgICAgICAqICBXZSBuZWVkIDEgQ0NXIGJsb2NrIGZvciBlYWNoIHJlYWQgYnVmZmVyLCAxIGZvciBlYWNoCi0gICAgICAgICogIHdyaXRlIGJ1ZmZlciwgcGx1cyAxIGZvciBDbGF3U2lnbmFsQmxvY2sKLSAgICAgICAgKi8KLSAgICAgICAgY2N3X2Jsb2Nrc19yZXF1aXJlZCA9Ci0JCXByaXZwdHItPnBfZW52LT5yZWFkX2J1ZmZlcnMrcHJpdnB0ci0+cF9lbnYtPndyaXRlX2J1ZmZlcnMrMTsKLSAgICAgICAgLyoKLSAgICAgICAgKiBjb21wdXRlIG51bWJlciBvZiBDQ1cgYmxvY2tzIHRoYXQgd2lsbCBmaXQgaW4gYSBwYWdlCi0gICAgICAgICovCi0gICAgICAgIGNjd19ibG9ja3NfcGVycGFnZT0gUEFHRV9TSVpFIC8gIENDV0JLX1NJWkU7Ci0gICAgICAgIGNjd19wYWdlc19yZXF1aXJlZD0KLQkJRElWX1JPVU5EX1VQKGNjd19ibG9ja3NfcmVxdWlyZWQsIGNjd19ibG9ja3NfcGVycGFnZSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIHJlYWQgYW5kIHdyaXRlIHNpemVzIGFyZSBzZXQgYnkgMiBjb25zdGFudHMgaW4gY2xhdy5oCi0JICogIDRrIGFuZCAzMmsuICBVbnBhY2tlZCB2YWx1ZXMgb3RoZXIgdGhhbiA0ayBhcmUgbm90IGdvaW5nIHRvCi0JICogcHJvdmlkZSBnb29kIHBlcmZvcm1hbmNlLiBXaXRoIHBhY2tpbmcgYnVmZmVycyBzdXBwb3J0IDMyawotCSAqIGJ1ZmZlcnMgYXJlIHVzZWQuCi0gICAgICAgICAqLwotCWlmIChwcml2cHRyLT5wX2Vudi0+cmVhZF9zaXplIDwgUEFHRV9TSVpFKSB7Ci0JCWNsYXdfcmVhZHNfcGVycGFnZSA9IFBBR0VfU0laRSAvIHByaXZwdHItPnBfZW52LT5yZWFkX3NpemU7Ci0JCWNsYXdfcmVhZF9wYWdlcyA9IERJVl9ST1VORF9VUChwcml2cHRyLT5wX2Vudi0+cmVhZF9idWZmZXJzLAotCQkJCQkJY2xhd19yZWFkc19wZXJwYWdlKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgeyAgICAgICAvKiA+IG9yIGVxdWFsICAqLwotCQlwcml2cHRyLT5wX2J1ZmZfcGFnZXNfcGVycmVhZCA9Ci0JCQlESVZfUk9VTkRfVVAocHJpdnB0ci0+cF9lbnYtPnJlYWRfc2l6ZSwgUEFHRV9TSVpFKTsKLQkJY2xhd19yZWFkX3BhZ2VzID0gcHJpdnB0ci0+cF9lbnYtPnJlYWRfYnVmZmVycyAqCi0JCQkJCXByaXZwdHItPnBfYnVmZl9wYWdlc19wZXJyZWFkOwotICAgICAgICAgfQotICAgICAgICBpZiAocHJpdnB0ci0+cF9lbnYtPndyaXRlX3NpemUgPCBQQUdFX1NJWkUpIHsKLQkJY2xhd193cml0ZXNfcGVycGFnZSA9Ci0JCQlQQUdFX1NJWkUgLyBwcml2cHRyLT5wX2Vudi0+d3JpdGVfc2l6ZTsKLQkJY2xhd193cml0ZV9wYWdlcyA9IERJVl9ST1VORF9VUChwcml2cHRyLT5wX2Vudi0+d3JpdGVfYnVmZmVycywKLQkJCQkJCWNsYXdfd3JpdGVzX3BlcnBhZ2UpOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7ICAgICAgLyogPiAgb3IgZXF1YWwgICovCi0JCXByaXZwdHItPnBfYnVmZl9wYWdlc19wZXJ3cml0ZSA9Ci0JCQlESVZfUk9VTkRfVVAocHJpdnB0ci0+cF9lbnYtPnJlYWRfc2l6ZSwgUEFHRV9TSVpFKTsKLQkJY2xhd193cml0ZV9wYWdlcyA9IHByaXZwdHItPnBfZW52LT53cml0ZV9idWZmZXJzICoKLQkJCQkJcHJpdnB0ci0+cF9idWZmX3BhZ2VzX3BlcndyaXRlOwotICAgICAgICB9Ci0gICAgICAgIC8qCi0gICAgICAgICogICAgICAgICAgICAgICBhbGxvY2F0ZSBjY3dfcGFnZXNfcmVxdWlyZWQKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHByaXZwdHItPnBfYnVmZl9jY3c9PU5VTEwpIHsKLSAgICAgICAgICAgICAgICBwcml2cHRyLT5wX2J1ZmZfY2N3PQotCQkJKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKF9fR0ZQX0RNQSwKLQkJICAgICAgICAoaW50KXBhZ2VzX3RvX29yZGVyX29mX21hZyhjY3dfcGFnZXNfcmVxdWlyZWQgKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHByaXZwdHItPnBfYnVmZl9jY3c9PU5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwcml2cHRyLT5wX2J1ZmZfY2N3X251bT1jY3dfcGFnZXNfcmVxdWlyZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtc2V0KHByaXZwdHItPnBfYnVmZl9jY3csIDB4MDAsCi0JCXByaXZwdHItPnBfYnVmZl9jY3dfbnVtICogUEFHRV9TSVpFKTsKLQotICAgICAgICAvKgotICAgICAgICAqICAgICAgICAgICAgICAgb2J0YWluIGVuZGluZyBjY3cgYmxvY2sgYWRkcmVzcwotICAgICAgICAqCi0gICAgICAgICovCi0gICAgICAgIHByaXZwdHItPnBfZW5kX2NjdyA9IChzdHJ1Y3QgZW5kY2N3ICopJnByaXZwdHItPmVuZF9jY3c7Ci0gICAgICAgIHJlYWxfYWRkcmVzcyAgPSAoX191MzIpX19wYShwcml2cHRyLT5wX2VuZF9jY3cpOwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemUgZW5kaW5nIENDVyBibG9jayAgICAgICAqLwotICAgICAgICBwX2VuZGNjdz1wcml2cHRyLT5wX2VuZF9jY3c7Ci0gICAgICAgIHBfZW5kY2N3LT5yZWFsPXJlYWxfYWRkcmVzczsKLSAgICAgICAgcF9lbmRjY3ctPndyaXRlMT0weDAwOwotICAgICAgICBwX2VuZGNjdy0+cmVhZDE9MHgwMDsKLQotICAgICAgICAvKiAgICAgIHdyaXRlMV9ub3AxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHBfZW5kY2N3LT53cml0ZTFfbm9wMS5jbWRfY29kZSA9IENDV19DTEFXX0NNRF9OT1A7Ci0gICAgICAgIHBfZW5kY2N3LT53cml0ZTFfbm9wMS5mbGFncyAgICAgICA9IENDV19GTEFHX1NMSSB8IENDV19GTEFHX0NDOwotICAgICAgICBwX2VuZGNjdy0+d3JpdGUxX25vcDEuY291bnQgICAgICAgPSAxOwotICAgICAgICBwX2VuZGNjdy0+d3JpdGUxX25vcDEuY2RhICAgICAgICAgPSAwOwotCi0gICAgICAgIC8qICAgICAgd3JpdGUxX25vcDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcF9lbmRjY3ctPndyaXRlMV9ub3AyLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX1JFQURGRjsKLSAgICAgICAgcF9lbmRjY3ctPndyaXRlMV9ub3AyLmZsYWdzICAgICAgICA9IENDV19GTEFHX1NMSSB8IENDV19GTEFHX1NLSVA7Ci0gICAgICAgIHBfZW5kY2N3LT53cml0ZTFfbm9wMi5jb3VudCAgICAgID0gMTsKLSAgICAgICAgcF9lbmRjY3ctPndyaXRlMV9ub3AyLmNkYSAgICAgICAgPSAwOwotCi0gICAgICAgIC8qICAgICAgd3JpdGUyX25vcDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcF9lbmRjY3ctPndyaXRlMl9ub3AxLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX05PUDsKLSAgICAgICAgcF9lbmRjY3ctPndyaXRlMl9ub3AxLmZsYWdzICAgICAgICA9IENDV19GTEFHX1NMSSB8IENDV19GTEFHX0NDOwotICAgICAgICBwX2VuZGNjdy0+d3JpdGUyX25vcDEuY291bnQgICAgICAgID0gMTsKLSAgICAgICAgcF9lbmRjY3ctPndyaXRlMl9ub3AxLmNkYSAgICAgICAgICA9IDA7Ci0KLSAgICAgICAgLyogICAgICB3cml0ZTJfbm9wMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBwX2VuZGNjdy0+d3JpdGUyX25vcDIuY21kX2NvZGUgPSBDQ1dfQ0xBV19DTURfUkVBREZGOwotICAgICAgICBwX2VuZGNjdy0+d3JpdGUyX25vcDIuZmxhZ3MgICAgICAgID0gQ0NXX0ZMQUdfU0xJIHwgQ0NXX0ZMQUdfU0tJUDsKLSAgICAgICAgcF9lbmRjY3ctPndyaXRlMl9ub3AyLmNvdW50ICAgICAgICA9IDE7Ci0gICAgICAgIHBfZW5kY2N3LT53cml0ZTJfbm9wMi5jZGEgICAgICAgICAgPSAwOwotCi0gICAgICAgIC8qICAgICAgcmVhZDFfbm9wMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcF9lbmRjY3ctPnJlYWQxX25vcDEuY21kX2NvZGUgPSBDQ1dfQ0xBV19DTURfTk9QOwotICAgICAgICBwX2VuZGNjdy0+cmVhZDFfbm9wMS5mbGFncyAgICAgICAgPSBDQ1dfRkxBR19TTEkgfCBDQ1dfRkxBR19DQzsKLSAgICAgICAgcF9lbmRjY3ctPnJlYWQxX25vcDEuY291bnQgICAgICAgID0gMTsKLSAgICAgICAgcF9lbmRjY3ctPnJlYWQxX25vcDEuY2RhICAgICAgICAgID0gMDsKLQotICAgICAgICAvKiAgICAgIHJlYWQxX25vcDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHBfZW5kY2N3LT5yZWFkMV9ub3AyLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX1JFQURGRjsKLSAgICAgICAgcF9lbmRjY3ctPnJlYWQxX25vcDIuZmxhZ3MgICAgICAgID0gQ0NXX0ZMQUdfU0xJIHwgQ0NXX0ZMQUdfU0tJUDsKLSAgICAgICAgcF9lbmRjY3ctPnJlYWQxX25vcDIuY291bnQgICAgICAgID0gMTsKLSAgICAgICAgcF9lbmRjY3ctPnJlYWQxX25vcDIuY2RhICAgICAgICAgID0gMDsKLQotICAgICAgICAvKiAgICAgIHJlYWQyX25vcDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHBfZW5kY2N3LT5yZWFkMl9ub3AxLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX05PUDsKLSAgICAgICAgcF9lbmRjY3ctPnJlYWQyX25vcDEuZmxhZ3MgICAgICAgID0gQ0NXX0ZMQUdfU0xJIHwgQ0NXX0ZMQUdfQ0M7Ci0gICAgICAgIHBfZW5kY2N3LT5yZWFkMl9ub3AxLmNvdW50ICAgICAgICA9IDE7Ci0gICAgICAgIHBfZW5kY2N3LT5yZWFkMl9ub3AxLmNkYSAgICAgICAgICA9IDA7Ci0KLSAgICAgICAgLyogICAgICByZWFkMl9ub3AyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBwX2VuZGNjdy0+cmVhZDJfbm9wMi5jbWRfY29kZSA9IENDV19DTEFXX0NNRF9SRUFERkY7Ci0gICAgICAgIHBfZW5kY2N3LT5yZWFkMl9ub3AyLmZsYWdzICAgICAgICA9IENDV19GTEFHX1NMSSB8IENDV19GTEFHX1NLSVA7Ci0gICAgICAgIHBfZW5kY2N3LT5yZWFkMl9ub3AyLmNvdW50ICAgICAgICA9IDE7Ci0gICAgICAgIHBfZW5kY2N3LT5yZWFkMl9ub3AyLmNkYSAgICAgICAgICA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZCBhIGNoYWluIG9mIENDV3MKLSAgICAgICAgKgotICAgICAgICAqLwotICAgICAgICBwX2J1ZmY9cHJpdnB0ci0+cF9idWZmX2NjdzsKLQotICAgICAgICBwX2ZyZWVfY2hhaW49TlVMTDsKLSAgICAgICAgZm9yIChpPTAgOyBpIDwgY2N3X3BhZ2VzX3JlcXVpcmVkOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgcmVhbF9hZGRyZXNzICA9IChfX3UzMilfX3BhKHBfYnVmZik7Ci0gICAgICAgICAgICAgICAgcF9idWY9cF9idWZmOwotICAgICAgICAgICAgICAgIGZvciAoaj0wIDsgaiA8IGNjd19ibG9ja3NfcGVycGFnZSA7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPm5leHQgID0gcF9mcmVlX2NoYWluOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9mcmVlX2NoYWluID0gcF9idWY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+cmVhbD0oX191MzIpX19wYShwX2J1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK3BfYnVmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2J1ZmYrPVBBR0VfU0laRTsKLSAgICAgICAgfQotICAgICAgICAvKgotICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluaXRpYWxpemUgQ2xhd1NpZ25hbEJsb2NrCi0gICAgICAgICoKLSAgICAgICAgKi8KLSAgICAgICAgaWYgKHByaXZwdHItPnBfY2xhd19zaWduYWxfYmxrPT1OVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHJpdnB0ci0+cF9jbGF3X3NpZ25hbF9ibGs9cF9mcmVlX2NoYWluOwotICAgICAgICAgICAgICAgIHBfZnJlZV9jaGFpbj1wX2ZyZWVfY2hhaW4tPm5leHQ7Ci0gICAgICAgICAgICAgICAgcENsYXdIPShzdHJ1Y3QgY2xhd2ggKilwcml2cHRyLT5wX2NsYXdfc2lnbmFsX2JsazsKLSAgICAgICAgICAgICAgICBwQ2xhd0gtPmxlbmd0aD0weGZmZmY7Ci0gICAgICAgICAgICAgICAgcENsYXdILT5vcGNvZGU9MHhmZjsKLSAgICAgICAgICAgICAgICBwQ2xhd0gtPmZsYWc9Q0xBV19CVVNZOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgKiAgICAgICAgICAgICAgIGFsbG9jYXRlIHdyaXRlX3BhZ2VzX3JlcXVpcmVkIGFuZCBhZGQgdG8gZnJlZSBjaGFpbgotICAgICAgICAqLwotICAgICAgICBpZiAocHJpdnB0ci0+cF9idWZmX3dyaXRlPT1OVUxMKSB7Ci0gICAgICAgICAgICBpZiAocHJpdnB0ci0+cF9lbnYtPndyaXRlX3NpemUgPCBQQUdFX1NJWkUpIHsKLSAgICAgICAgICAgICAgICBwcml2cHRyLT5wX2J1ZmZfd3JpdGU9Ci0JCQkodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoX19HRlBfRE1BLAotCQkJKGludClwYWdlc190b19vcmRlcl9vZl9tYWcoY2xhd193cml0ZV9wYWdlcyApKTsKLSAgICAgICAgICAgICAgICBpZiAocHJpdnB0ci0+cF9idWZmX3dyaXRlPT1OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2cHRyLT5wX2J1ZmZfY2N3PU5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkIENMQVcgd3JpdGUgZnJlZSBjaGFpbgotICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgbWVtc2V0KHByaXZwdHItPnBfYnVmZl93cml0ZSwgMHgwMCwKLQkJCWNjd19wYWdlc19yZXF1aXJlZCAqIFBBR0VfU0laRSk7Ci0gICAgICAgICAgICAgICAgcHJpdnB0ci0+cF93cml0ZV9mcmVlX2NoYWluPU5VTEw7Ci0KLSAgICAgICAgICAgICAgICBwX2J1ZmY9cHJpdnB0ci0+cF9idWZmX3dyaXRlOwotCi0gICAgICAgICAgICAgICAgZm9yIChpPTAgOyBpPCBwcml2cHRyLT5wX2Vudi0+d3JpdGVfYnVmZmVycyA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYgICAgICAgID0gcF9mcmVlX2NoYWluOyAgICAgIC8qICBnZXQgYSBDQ1cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZnJlZV9jaGFpbiA9IHBfYnVmLT5uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPm5leHQgID1wcml2cHRyLT5wX3dyaXRlX2ZyZWVfY2hhaW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2cHRyLT5wX3dyaXRlX2ZyZWVfY2hhaW4gPSBwX2J1ZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gcF9idWZmZXIJPSAoc3RydWN0IGNsYXdidWYgKilwX2J1ZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHdyaXRlLmNkYSAgICAgICA9IChfX3UzMilfX3BhKHBfYnVmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHdyaXRlLmZsYWdzICAgICA9IENDV19GTEFHX1NMSSB8IENDV19GTEFHX0NDOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiB3X3JlYWRfRkYuY21kX2NvZGUgPSBDQ1dfQ0xBV19DTURfUkVBREZGOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiB3X3JlYWRfRkYuZmxhZ3MgICA9IENDV19GTEFHX1NMSSB8IENDV19GTEFHX0NDOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiB3X3JlYWRfRkYuY291bnQgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHdfcmVhZF9GRi5jZGEgICAgID0KLQkJCQkoX191MzIpX19wYSgmcF9idWYtPiBoZWFkZXIuZmxhZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHdfVElDXzEuY21kX2NvZGUgPSBDQ1dfQ0xBV19DTURfVElDOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiB3X1RJQ18xLmZsYWdzICAgICAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiB3X1RJQ18xLmNvdW50ICAgICAgPSAwOwotCi0JCQlpZiAoKCh1bnNpZ25lZCBsb25nKXBfYnVmZiArCi0JCQkJCSAgICBwcml2cHRyLT5wX2Vudi0+d3JpdGVfc2l6ZSkgPj0KLQkJCSAgICgodW5zaWduZWQgbG9uZykocF9idWZmKzIqCi0JCQkgICAgKHByaXZwdHItPnBfZW52LT53cml0ZV9zaXplKSAtIDEpICYgUEFHRV9NQVNLKSkgewotCQkJCXBfYnVmZiA9IHBfYnVmZitwcml2cHRyLT5wX2Vudi0+d3JpdGVfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgZWxzZSAgICAgIC8qICBCdWZmZXJzIGFyZSA9PiBQQUdFX1NJWkUuIDEgYnVmZiBwZXIgZ2V0X2ZyZWVfcGFnZXMgKi8KLSAgICAgICAgICAgewotICAgICAgICAgICAgICAgcHJpdnB0ci0+cF93cml0ZV9mcmVlX2NoYWluPU5VTEw7Ci0gICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpPCBwcml2cHRyLT5wX2Vudi0+d3JpdGVfYnVmZmVycyA7IGkrKykgewotICAgICAgICAgICAgICAgICAgIHBfYnVmZj0odm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoX19HRlBfRE1BLAotCQkgICAgICAgIChpbnQpcGFnZXNfdG9fb3JkZXJfb2ZfbWFnKAotCQkJcHJpdnB0ci0+cF9idWZmX3BhZ2VzX3BlcndyaXRlKSApOwotICAgICAgICAgICAgICAgICAgIGlmIChwX2J1ZmY9PU5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcHJpdnB0ci0+cF9idWZmX2NjdywKLQkJCSAgICAgIChpbnQpcGFnZXNfdG9fb3JkZXJfb2ZfbWFnKAotCQkJICAgICAgCQlwcml2cHRyLT5wX2J1ZmZfY2N3X251bSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpdnB0ci0+cF9idWZmX2Njdz1OVUxMOwotCQkJcF9idWY9cHJpdnB0ci0+cF9idWZmX3dyaXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBfYnVmIT1OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpCi0JCQkJCXBfYnVmLT5wX2J1ZmZlciwKLQkJCQkJKGludClwYWdlc190b19vcmRlcl9vZl9tYWcoCi0JCQkJCXByaXZwdHItPnBfYnVmZl9wYWdlc19wZXJ3cml0ZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zj1wX2J1Zi0+bmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICAgICAgICAgICAgIH0gIC8qIEVycm9yIG9uIGdldF9wYWdlcyAgICovCi0gICAgICAgICAgICAgICAgICAgbWVtc2V0KHBfYnVmZiwgMHgwMCwgcHJpdnB0ci0+cF9lbnYtPndyaXRlX3NpemUgKTsKLSAgICAgICAgICAgICAgICAgICBwX2J1ZiAgICAgICAgID0gcF9mcmVlX2NoYWluOwotICAgICAgICAgICAgICAgICAgIHBfZnJlZV9jaGFpbiAgPSBwX2J1Zi0+bmV4dDsKLSAgICAgICAgICAgICAgICAgICBwX2J1Zi0+bmV4dCAgID0gcHJpdnB0ci0+cF93cml0ZV9mcmVlX2NoYWluOwotICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnBfd3JpdGVfZnJlZV9jaGFpbiA9IHBfYnVmOwotICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnBfYnVmZl93cml0ZSA9IHBfYnVmOwotICAgICAgICAgICAgICAgICAgIHBfYnVmLT5wX2J1ZmZlcj0oc3RydWN0IGNsYXdidWYgKilwX2J1ZmY7Ci0gICAgICAgICAgICAgICAgICAgcF9idWYtPiB3cml0ZS5jZGEgICAgID0gKF9fdTMyKV9fcGEocF9idWZmKTsKLSAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHdyaXRlLmZsYWdzICAgPSBDQ1dfRkxBR19TTEkgfCBDQ1dfRkxBR19DQzsKLSAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHdfcmVhZF9GRi5jbWRfY29kZSA9IENDV19DTEFXX0NNRF9SRUFERkY7Ci0gICAgICAgICAgICAgICAgICAgcF9idWYtPiB3X3JlYWRfRkYuZmxhZ3MgICAgPSBDQ1dfRkxBR19TTEkgfCBDQ1dfRkxBR19DQzsKLSAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHdfcmVhZF9GRi5jb3VudCAgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgcF9idWYtPiB3X3JlYWRfRkYuY2RhICAgICAgPQotCQkJKF9fdTMyKV9fcGEoJnBfYnVmLT4gaGVhZGVyLmZsYWcpOwotICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gd19USUNfMS5jbWRfY29kZSA9IENDV19DTEFXX0NNRF9USUM7Ci0gICAgICAgICAgICAgICAgICAgcF9idWYtPiB3X1RJQ18xLmZsYWdzICAgPSAwOwotICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gd19USUNfMS5jb3VudCAgID0gMDsKLSAgICAgICAgICAgICAgIH0gIC8qIGZvciBhbGwgd3JpdGVfYnVmZmVycyAgICovCi0KLSAgICAgICAgICAgfSAgICAvKiBlbHNlIGJ1ZmZlcnMgYXJlIFBBR0VfU0laRSBvciBiaWdnZXIgKi8KLQotICAgICAgICB9Ci0gICAgICAgIHByaXZwdHItPnBfYnVmZl93cml0ZV9udW09Y2xhd193cml0ZV9wYWdlczsKLSAgICAgICAgcHJpdnB0ci0+d3JpdGVfZnJlZV9jb3VudD1wcml2cHRyLT5wX2Vudi0+d3JpdGVfYnVmZmVyczsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICogICAgICAgICAgICAgICBhbGxvY2F0ZSByZWFkX3BhZ2VzX3JlcXVpcmVkIGFuZCBjaGFpbiB0byBmcmVlIGNoYWluCi0gICAgICAgICovCi0gICAgICAgIGlmIChwcml2cHRyLT5wX2J1ZmZfcmVhZD09TlVMTCkgewotICAgICAgICAgICAgaWYgKHByaXZwdHItPnBfZW52LT5yZWFkX3NpemUgPCBQQUdFX1NJWkUpICB7Ci0gICAgICAgICAgICAgICAgcHJpdnB0ci0+cF9idWZmX3JlYWQ9Ci0JCQkodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoX19HRlBfRE1BLAotCQkJKGludClwYWdlc190b19vcmRlcl9vZl9tYWcoY2xhd19yZWFkX3BhZ2VzKSApOwotICAgICAgICAgICAgICAgIGlmIChwcml2cHRyLT5wX2J1ZmZfcmVhZD09TlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylwcml2cHRyLT5wX2J1ZmZfY2N3LAotCQkJCShpbnQpcGFnZXNfdG9fb3JkZXJfb2ZfbWFnKAotCQkJCQlwcml2cHRyLT5wX2J1ZmZfY2N3X251bSkpOwotCQkJLyogZnJlZSB0aGUgd3JpdGUgcGFnZXMgc2l6ZSBpcyA8IHBhZ2Ugc2l6ZSAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcHJpdnB0ci0+cF9idWZmX3dyaXRlLAotCQkJCShpbnQpcGFnZXNfdG9fb3JkZXJfb2ZfbWFnKAotCQkJCXByaXZwdHItPnBfYnVmZl93cml0ZV9udW0pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnBfYnVmZl9jY3c9TlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnBfYnVmZl93cml0ZT1OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbXNldChwcml2cHRyLT5wX2J1ZmZfcmVhZCwgMHgwMCwgY2xhd19yZWFkX3BhZ2VzICogUEFHRV9TSVpFKTsKLSAgICAgICAgICAgICAgICBwcml2cHRyLT5wX2J1ZmZfcmVhZF9udW09Y2xhd19yZWFkX3BhZ2VzOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZCBDTEFXIHJlYWQgZnJlZSBjaGFpbgotICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBfYnVmZj1wcml2cHRyLT5wX2J1ZmZfcmVhZDsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MCA7IGk8IHByaXZwdHItPnBfZW52LT5yZWFkX2J1ZmZlcnMgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmICAgICAgICA9IHBfZnJlZV9jaGFpbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZnJlZV9jaGFpbiA9IHBfYnVmLT5uZXh0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9sYXN0X0NDV0I9PU5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPm5leHQ9TlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbF9USUNfYWRkcmVzcz0wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2xhc3RfQ0NXQj1wX2J1ZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+bmV4dD1wX2ZpcnN0X0NDV0I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxfVElDX2FkZHJlc3M9Ci0JCQkJKF9fdTMyKV9fcGEoJnBfZmlyc3RfQ0NXQiAtPiByZWFkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZmlyc3RfQ0NXQj1wX2J1ZjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPnBfYnVmZmVyPShzdHJ1Y3QgY2xhd2J1ZiAqKXBfYnVmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICBpbml0aWFsaXplIHJlYWQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiByZWFkLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX1JFQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJlYWQuY2RhID0gKF9fdTMyKV9fcGEocF9idWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gcmVhZC5mbGFncyA9IENDV19GTEFHX1NMSSB8IENDV19GTEFHX0NDOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiByZWFkLmNvdW50ICAgICAgID0gcHJpdnB0ci0+cF9lbnYtPnJlYWRfc2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogIGluaXRpYWxpemUgcmVhZF9oIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gcmVhZF9oLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX1JFQURIRUFERVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJlYWRfaC5jZGEgPQotCQkJCShfX3UzMilfX3BhKCYocF9idWYtPmhlYWRlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiByZWFkX2guZmxhZ3MgPSBDQ1dfRkxBR19TTEkgfCBDQ1dfRkxBR19DQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gcmVhZF9oLmNvdW50ICAgICAgPSBzaXplb2Yoc3RydWN0IGNsYXdoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogIGluaXRpYWxpemUgU2lnbmFsIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gc2lnbmFsLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX1NJR05BTF9TTU9EOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiBzaWduYWwuY2RhID0KLQkJCQkoX191MzIpX19wYSgmKHBDbGF3SC0+ZmxhZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiBzaWduYWwuZmxhZ3MgPSBDQ1dfRkxBR19TTEkgfCBDQ1dfRkxBR19DQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gc2lnbmFsLmNvdW50ICAgICA9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICBpbml0aWFsaXplIHJfVElDXzEgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiByX1RJQ18xLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX1RJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gcl9USUNfMS5jZGEgPSAoX191MzIpcmVhbF9USUNfYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gcl9USUNfMS5mbGFncyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJfVElDXzEuY291bnQgICAgICA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICBpbml0aWFsaXplIHJfcmVhZF9GRiBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJfcmVhZF9GRi5jbWRfY29kZSA9IENDV19DTEFXX0NNRF9SRUFERkY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJfcmVhZF9GRi5jZGEgPQotCQkJCShfX3UzMilfX3BhKCYocENsYXdILT5mbGFnKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJfcmVhZF9GRi5mbGFncyA9Ci0JCQkJQ0NXX0ZMQUdfU0xJIHwgQ0NXX0ZMQUdfQ0MgfCBDQ1dfRkxBR19QQ0k7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJfcmVhZF9GRi5jb3VudCAgICA9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGluaXRpYWxpemUgcl9USUNfMiAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZwX2J1Zi0+cl9USUNfMiwKLQkJCQkmcF9idWYtPnJfVElDXzEsIHNpemVvZihzdHJ1Y3QgY2N3MSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgaW5pdGlhbGl6ZSBIZWFkZXIgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+aGVhZGVyLmxlbmd0aD0weGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+aGVhZGVyLm9wY29kZT0weGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPmhlYWRlci5mbGFnPUNMQVdfUEVORElORzsKLQotCQkJaWYgKCgodW5zaWduZWQgbG9uZylwX2J1ZmYrcHJpdnB0ci0+cF9lbnYtPnJlYWRfc2l6ZSkgPj0KLQkJCSAgKCh1bnNpZ25lZCBsb25nKShwX2J1ZmYrMioocHJpdnB0ci0+cF9lbnYtPnJlYWRfc2l6ZSkKLQkJCQkgLTEpCi0JCQkgICAmIFBBR0VfTUFTSykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmPSBwX2J1ZmYrcHJpdnB0ci0+cF9lbnYtPnJlYWRfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZmY9Ci0JCQkJKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpCi0JCQkJCShwX2J1ZmYrMioocHJpdnB0ci0+cF9lbnYtPnJlYWRfc2l6ZSktMSkKLQkJCQkJICYgUEFHRV9NQVNLKSA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSAgIC8qIGZvciByZWFkX2J1ZmZlcnMgICAqLwotICAgICAgICAgIH0gICAgICAgICAvKiByZWFkX3NpemUgPCBQQUdFX1NJWkUgICovCi0gICAgICAgICAgZWxzZSB7ICAvKiByZWFkIFNpemUgPj0gUEFHRV9TSVpFICAqLwotICAgICAgICAgICAgICAgIGZvciAoaT0wIDsgaTwgcHJpdnB0ci0+cF9lbnYtPnJlYWRfYnVmZmVycyA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWZmID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKF9fR0ZQX0RNQSwKLQkJCQkoaW50KXBhZ2VzX3RvX29yZGVyX29mX21hZygKLQkJCQkJcHJpdnB0ci0+cF9idWZmX3BhZ2VzX3BlcnJlYWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2J1ZmY9PU5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylwcml2cHRyLT5wX2J1ZmZfY2N3LAotCQkJCQkoaW50KXBhZ2VzX3RvX29yZGVyX29mX21hZyhwcml2cHRyLT4KLQkJCQkJcF9idWZmX2Njd19udW0pKTsKLQkJCQkvKiBmcmVlIHRoZSB3cml0ZSBwYWdlcyAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zj1wcml2cHRyLT5wX2J1ZmZfd3JpdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwX2J1ZiE9TlVMTCkgewotCQkJCQlmcmVlX3BhZ2VzKAotCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpcF9idWYtPnBfYnVmZmVyLAotCQkJCQkgICAgKGludClwYWdlc190b19vcmRlcl9vZl9tYWcoCi0JCQkJCSAgICBwcml2cHRyLT5wX2J1ZmZfcGFnZXNfcGVyd3JpdGUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zj1wX2J1Zi0+bmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCQkJCS8qIGZyZWUgYW55IHJlYWQgcGFnZXMgYWxyZWFkeSBhbGxvYyAgKi8KLQkgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zj1wcml2cHRyLT5wX2J1ZmZfcmVhZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBfYnVmIT1OVUxMKSB7Ci0JCQkJCWZyZWVfcGFnZXMoCi0JCQkJCSAgICAodW5zaWduZWQgbG9uZylwX2J1Zi0+cF9idWZmZXIsCi0JCQkJCSAgICAoaW50KXBhZ2VzX3RvX29yZGVyX29mX21hZygKLQkJCQkJICAgICBwcml2cHRyLT5wX2J1ZmZfcGFnZXNfcGVycmVhZCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmPXBfYnVmLT5uZXh0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnBfYnVmZl9jY3c9TlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdnB0ci0+cF9idWZmX3dyaXRlPU5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHBfYnVmZiwgMHgwMCwgcHJpdnB0ci0+cF9lbnYtPnJlYWRfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1ZiAgICAgICAgPSBwX2ZyZWVfY2hhaW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2cHRyLT5wX2J1ZmZfcmVhZCA9IHBfYnVmOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9mcmVlX2NoYWluID0gcF9idWYtPm5leHQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2xhc3RfQ0NXQj09TlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+bmV4dD1OVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsX1RJQ19hZGRyZXNzPTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbGFzdF9DQ1dCPXBfYnVmOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT5uZXh0PXBfZmlyc3RfQ0NXQjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbF9USUNfYWRkcmVzcz0KLQkJCQkJKGFkZHJfdClfX3BhKAotCQkJCQkJJnBfZmlyc3RfQ0NXQiAtPiByZWFkICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZmlyc3RfQ0NXQj1wX2J1ZjsKLQkJCQkvKiBzYXZlIGJ1ZmYgYWRkcmVzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPnBfYnVmZmVyPShzdHJ1Y3QgY2xhd2J1ZiAqKXBfYnVmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICBpbml0aWFsaXplIHJlYWQgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiByZWFkLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX1JFQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJlYWQuY2RhID0gKF9fdTMyKV9fcGEocF9idWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gcmVhZC5mbGFncyA9IENDV19GTEFHX1NMSSB8IENDV19GTEFHX0NDOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiByZWFkLmNvdW50ICAgICAgID0gcHJpdnB0ci0+cF9lbnYtPnJlYWRfc2l6ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogIGluaXRpYWxpemUgcmVhZF9oIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gcmVhZF9oLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX1JFQURIRUFERVI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJlYWRfaC5jZGEgPQotCQkJCShfX3UzMilfX3BhKCYocF9idWYtPmhlYWRlcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiByZWFkX2guZmxhZ3MgPSBDQ1dfRkxBR19TTEkgfCBDQ1dfRkxBR19DQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gcmVhZF9oLmNvdW50ICAgICAgPSBzaXplb2Yoc3RydWN0IGNsYXdoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogIGluaXRpYWxpemUgU2lnbmFsIGNvbW1hbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gc2lnbmFsLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX1NJR05BTF9TTU9EOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiBzaWduYWwuY2RhID0KLQkJCQkoX191MzIpX19wYSgmKHBDbGF3SC0+ZmxhZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiBzaWduYWwuZmxhZ3MgPSBDQ1dfRkxBR19TTEkgfCBDQ1dfRkxBR19DQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gc2lnbmFsLmNvdW50ICAgICA9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICBpbml0aWFsaXplIHJfVElDXzEgY29tbWFuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPiByX1RJQ18xLmNtZF9jb2RlID0gQ0NXX0NMQVdfQ01EX1RJQzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gcl9USUNfMS5jZGEgPSAoX191MzIpcmVhbF9USUNfYWRkcmVzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfYnVmLT4gcl9USUNfMS5mbGFncyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJfVElDXzEuY291bnQgICAgICA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICBpbml0aWFsaXplIHJfcmVhZF9GRiBjb21tYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJfcmVhZF9GRi5jbWRfY29kZSA9IENDV19DTEFXX0NNRF9SRUFERkY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJfcmVhZF9GRi5jZGEgPQotCQkJCShfX3UzMilfX3BhKCYocENsYXdILT5mbGFnKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJfcmVhZF9GRi5mbGFncyA9Ci0JCQkJQ0NXX0ZMQUdfU0xJIHwgQ0NXX0ZMQUdfQ0MgfCBDQ1dfRkxBR19QQ0k7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+IHJfcmVhZF9GRi5jb3VudCAgICA9IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgIGluaXRpYWxpemUgcl9USUNfMiAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZwX2J1Zi0+cl9USUNfMiwgJnBfYnVmLT5yX1RJQ18xLAotCQkJCXNpemVvZihzdHJ1Y3QgY2N3MSkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgaW5pdGlhbGl6ZSBIZWFkZXIgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+aGVhZGVyLmxlbmd0aD0weGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2J1Zi0+aGVhZGVyLm9wY29kZT0weGZmOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9idWYtPmhlYWRlci5mbGFnPUNMQVdfUEVORElORzsKLQotICAgICAgICAgICAgICAgIH0gICAgLyogRm9yIHJlYWRfYnVmZmVycyAgICovCi0gICAgICAgICAgfSAgICAgLyogIHJlYWRfc2l6ZSA+PSBQQUdFX1NJWkUgICAqLwotICAgICAgICB9ICAgICAgIC8qICBwQnVmZnJlYWQgPSBOVUxMICovCi0gICAgICAgIGFkZF9jbGF3X3JlYWRzKCBkZXYgICxwX2ZpcnN0X0NDV0IgLCBwX2xhc3RfQ0NXQik7Ci0JcHJpdnB0ci0+YnVmZnNfYWxsb2MgPSAxOwotCi0gICAgICAgIHJldHVybiAwOwotfSAgICAvKiAgICBlbmQgb2YgaW5pdF9jY3dfYmsgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICBwcm9iZV9lcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQKLXByb2JlX2Vycm9yKCBzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpjZ2RldikKLXsKLQlzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXZwdHI7Ci0KLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAicHJvYmVyciIpOwotCXByaXZwdHIgPSBkZXZfZ2V0X2RydmRhdGEoJmNnZGV2LT5kZXYpOwotCWlmIChwcml2cHRyICE9IE5VTEwpIHsKLQkJZGV2X3NldF9kcnZkYXRhKCZjZ2Rldi0+ZGV2LCBOVUxMKTsKLQkJa2ZyZWUocHJpdnB0ci0+cF9lbnYpOwotCQlrZnJlZShwcml2cHRyLT5wX210Y19lbnZlbG9wZSk7Ci0JCWtmcmVlKHByaXZwdHIpOwotCX0KLX0gICAgLyogICAgcHJvYmVfZXJyb3IgICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICBjbGF3X3Byb2Nlc3NfY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludAotY2xhd19wcm9jZXNzX2NvbnRyb2woIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBjY3diayAqIHBfY2N3KQotewotCi0gICAgICAgIHN0cnVjdCBjbGF3YnVmICpwX2J1ZjsKLSAgICAgICAgc3RydWN0IGNsYXdjdGwgIGN0bGJrOwotICAgICAgICBzdHJ1Y3QgY2xhd2N0bCAqcF9jdGxiazsKLSAgICAgICAgY2hhciAgICB0ZW1wX2hvc3RfbmFtZVs4XTsKLSAgICAgICAgY2hhciAgICB0ZW1wX3dzX25hbWVbOF07Ci0gICAgICAgIHN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdnB0cjsKLSAgICAgICAgc3RydWN0IGNsYXdfZW52ICpwX2VudjsKLSAgICAgICAgc3RydWN0IHN5c3ZhbCAqcF9zeXN2YWw7Ci0gICAgICAgIHN0cnVjdCBjb25uY21kICpwX2Nvbm5lY3Q9TlVMTDsKLSAgICAgICAgaW50IHJjOwotICAgICAgICBzdHJ1Y3QgY2hiayAqcF9jaCA9IE5VTEw7Ci0Jc3RydWN0IGRldmljZSAqdGRldjsKLQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAiY2x3X2NudGwiKTsKLSAgICAgICAgdWRlbGF5KDEwMDApOyAgLyogV2FpdCBhIG1zIGZvciB0aGUgY29udHJvbCBwYWNrZXRzIHRvCi0JCQkqY2F0Y2ggdXAgdG8gZWFjaCBvdGhlciAqLwotCXByaXZwdHIgPSBkZXYtPm1sX3ByaXY7Ci0gICAgICAgIHBfZW52PXByaXZwdHItPnBfZW52OwotCXRkZXYgPSAmcHJpdnB0ci0+Y2hhbm5lbFtSRUFEX0NIQU5ORUxdLmNkZXYtPmRldjsKLQltZW1jcHkoICZ0ZW1wX2hvc3RfbmFtZSwgcF9lbnYtPmhvc3RfbmFtZSwgOCk7Ci0gICAgICAgIG1lbWNweSggJnRlbXBfd3NfbmFtZSwgcF9lbnYtPmFkYXB0ZXJfbmFtZSAsIDgpOwotCWRldl9pbmZvKHRkZXYsICIlczogQ0xBVyBkZXZpY2UgJS44czogIgotCQkiUmVjZWl2ZWQgQ29udHJvbCBQYWNrZXRcbiIsCi0JCWRldi0+bmFtZSwgdGVtcF93c19uYW1lKTsKLSAgICAgICAgaWYgKHByaXZwdHItPnJlbGVhc2VfcGVuZD09MSkgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHBfYnVmPXBfY2N3LT5wX2J1ZmZlcjsKLSAgICAgICAgcF9jdGxiaz0mY3RsYms7Ci0JaWYgKHBfZW52LT5wYWNraW5nID09IERPX1BBQ0tFRCkgeyAvKiBwYWNraW5nIGluIHByb2dyZXNzPyovCi0JCW1lbWNweShwX2N0bGJrLCAmcF9idWYtPmJ1ZmZlcls0XSwgc2l6ZW9mKHN0cnVjdCBjbGF3Y3RsKSk7Ci0JfSBlbHNlIHsKLQkJbWVtY3B5KHBfY3RsYmssIHBfYnVmLCBzaXplb2Yoc3RydWN0IGNsYXdjdGwpKTsKLQl9Ci0gICAgICAgIHN3aXRjaCAocF9jdGxiay0+Y29tbWFuZCkKLSAgICAgICAgewotCWNhc2UgU1lTVEVNX1ZBTElEQVRFX1JFUVVFU1Q6Ci0JCWlmIChwX2N0bGJrLT52ZXJzaW9uICE9IENMQVdfVkVSU0lPTl9JRCkgewotCQkJY2xhd19zbmRfc3lzX3ZhbGlkYXRlX3JzcChkZXYsIHBfY3RsYmssCi0JCQkJQ0xBV19SQ19XUk9OR19WRVJTSU9OKTsKLQkJCWRldl93YXJuKHRkZXYsICJUaGUgY29tbXVuaWNhdGlvbiBwZWVyIG9mICVzIgotCQkJCSIgdXNlcyBhbiBpbmNvcnJlY3QgQVBJIHZlcnNpb24gJWRcbiIsCi0JCQkJZGV2LT5uYW1lLCBwX2N0bGJrLT52ZXJzaW9uKTsKLQkJfQotCQlwX3N5c3ZhbCA9IChzdHJ1Y3Qgc3lzdmFsICopJihwX2N0bGJrLT5kYXRhKTsKLQkJZGV2X2luZm8odGRldiwgIiVzOiBSZWN2IFN5cyBWYWxpZGF0ZSBSZXF1ZXN0OiAiCi0JCQkiVmVycz0lZCxsaW5rX2lkPSVkLENvcnI9JWQsV1MgbmFtZT0lLjhzLCIKLQkJCSJIb3N0IG5hbWU9JS44c1xuIiwKLQkJCWRldi0+bmFtZSwgcF9jdGxiay0+dmVyc2lvbiwKLQkJCXBfY3RsYmstPmxpbmtpZCwKLQkJCXBfY3RsYmstPmNvcnJlbGF0b3IsCi0JCQlwX3N5c3ZhbC0+V1NfbmFtZSwKLQkJCXBfc3lzdmFsLT5ob3N0X25hbWUpOwotCQlpZiAobWVtY21wKHRlbXBfaG9zdF9uYW1lLCBwX3N5c3ZhbC0+aG9zdF9uYW1lLCA4KSkgewotCQkJY2xhd19zbmRfc3lzX3ZhbGlkYXRlX3JzcChkZXYsIHBfY3RsYmssCi0JCQkJQ0xBV19SQ19OQU1FX01JU01BVENIKTsKLQkJCUNMQVdfREJGX1RFWFQoMiwgc2V0dXAsICJIU1RCQUQiKTsKLQkJCUNMQVdfREJGX1RFWFRfKDIsIHNldHVwLCAiJXMiLCBwX3N5c3ZhbC0+aG9zdF9uYW1lKTsKLQkJCUNMQVdfREJGX1RFWFRfKDIsIHNldHVwLCAiJXMiLCB0ZW1wX2hvc3RfbmFtZSk7Ci0JCQlkZXZfd2Fybih0ZGV2LAotCQkJCSJIb3N0IG5hbWUgJXMgZm9yICVzIGRvZXMgbm90IG1hdGNoIHRoZSIKLQkJCQkiIHJlbW90ZSBhZGFwdGVyIG5hbWUgJXNcbiIsCi0JCQkJcF9zeXN2YWwtPmhvc3RfbmFtZSwKLQkJCQlkZXYtPm5hbWUsCi0JCQkJdGVtcF9ob3N0X25hbWUpOwotCQl9Ci0JCWlmIChtZW1jbXAodGVtcF93c19uYW1lLCBwX3N5c3ZhbC0+V1NfbmFtZSwgOCkpIHsKLQkJCWNsYXdfc25kX3N5c192YWxpZGF0ZV9yc3AoZGV2LCBwX2N0bGJrLAotCQkJCUNMQVdfUkNfTkFNRV9NSVNNQVRDSCk7Ci0JCQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAiV1NOQkFEIik7Ci0JCQlDTEFXX0RCRl9URVhUXygyLCBzZXR1cCwgIiVzIiwgcF9zeXN2YWwtPldTX25hbWUpOwotCQkJQ0xBV19EQkZfVEVYVF8oMiwgc2V0dXAsICIlcyIsIHRlbXBfd3NfbmFtZSk7Ci0JCQlkZXZfd2Fybih0ZGV2LCAiQWRhcHRlciBuYW1lICVzIGZvciAlcyBkb2VzIG5vdCBtYXRjaCIKLQkJCQkiIHRoZSByZW1vdGUgaG9zdCBuYW1lICVzXG4iLAotCQkJCXBfc3lzdmFsLT5XU19uYW1lLAotCQkJCWRldi0+bmFtZSwKLQkJCQl0ZW1wX3dzX25hbWUpOwotCQl9Ci0JCWlmICgocF9zeXN2YWwtPndyaXRlX2ZyYW1lX3NpemUgPCBwX2Vudi0+d3JpdGVfc2l6ZSkgJiYKLQkJICAgIChwX2Vudi0+cGFja2luZyA9PSAwKSkgewotCQkJY2xhd19zbmRfc3lzX3ZhbGlkYXRlX3JzcChkZXYsIHBfY3RsYmssCi0JCQkJQ0xBV19SQ19IT1NUX1JDVl9UT09fU01BTEwpOwotCQkJZGV2X3dhcm4odGRldiwKLQkJCQkiVGhlIGxvY2FsIHdyaXRlIGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gdGhlIgotCQkJCSIgcmVtb3RlIHJlYWQgYnVmZmVyXG4iKTsKLQkJCUNMQVdfREJGX1RFWFQoMiwgc2V0dXAsICJ3cnRzemJhZCIpOwotCQl9Ci0JCWlmICgocF9zeXN2YWwtPnJlYWRfZnJhbWVfc2l6ZSA8IHBfZW52LT5yZWFkX3NpemUpICYmCi0JCSAgICAocF9lbnYtPnBhY2tpbmcgPT0gMCkpIHsKLQkJCWNsYXdfc25kX3N5c192YWxpZGF0ZV9yc3AoZGV2LCBwX2N0bGJrLAotCQkJCUNMQVdfUkNfSE9TVF9SQ1ZfVE9PX1NNQUxMKTsKLQkJCWRldl93YXJuKHRkZXYsCi0JCQkJIlRoZSBsb2NhbCByZWFkIGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gdGhlIgotCQkJCSIgcmVtb3RlIHdyaXRlIGJ1ZmZlclxuIik7Ci0JCQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAicmRzaXpiYWQiKTsKLQkJfQotCQljbGF3X3NuZF9zeXNfdmFsaWRhdGVfcnNwKGRldiwgcF9jdGxiaywgMCk7Ci0JCWRldl9pbmZvKHRkZXYsCi0JCQkiQ0xBVyBkZXZpY2UgJS44czogU3lzdGVtIHZhbGlkYXRlIgotCQkJIiBjb21wbGV0ZWQuXG4iLCB0ZW1wX3dzX25hbWUpOwotCQlkZXZfaW5mbyh0ZGV2LAotCQkJIiVzOiBzeXMgVmFsaWRhdGUgUnNpemU6JWQgV3NpemU6JWRcbiIsCi0JCQlkZXYtPm5hbWUsIHBfc3lzdmFsLT5yZWFkX2ZyYW1lX3NpemUsCi0JCQlwX3N5c3ZhbC0+d3JpdGVfZnJhbWVfc2l6ZSk7Ci0JCXByaXZwdHItPnN5c3RlbV92YWxpZGF0ZV9jb21wID0gMTsKLQkJaWYgKHN0cm5jbXAocF9lbnYtPmFwaV90eXBlLCBXU19BUFBMX05BTUVfUEFDS0VELCA2KSA9PSAwKQotCQkJcF9lbnYtPnBhY2tpbmcgPSBQQUNLSU5HX0FTSzsKLQkJY2xhd19zdHJ0X2Nvbm5fcmVxKGRldik7Ci0JCWJyZWFrOwotCWNhc2UgU1lTVEVNX1ZBTElEQVRFX1JFU1BPTlNFOgotCQlwX3N5c3ZhbCA9IChzdHJ1Y3Qgc3lzdmFsICopJihwX2N0bGJrLT5kYXRhKTsKLQkJZGV2X2luZm8odGRldiwKLQkJCSJTZXR0aW5ncyBmb3IgJXMgdmFsaWRhdGVkICh2ZXJzaW9uPSVkLCAiCi0JCQkicmVtb3RlIGRldmljZT0lZCwgcmM9JWQsIGFkYXB0ZXIgbmFtZT0lLjhzLCAiCi0JCQkiaG9zdCBuYW1lPSUuOHMpXG4iLAotCQkJZGV2LT5uYW1lLAotCQkJcF9jdGxiay0+dmVyc2lvbiwKLQkJCXBfY3RsYmstPmNvcnJlbGF0b3IsCi0JCQlwX2N0bGJrLT5yYywKLQkJCXBfc3lzdmFsLT5XU19uYW1lLAotCQkJcF9zeXN2YWwtPmhvc3RfbmFtZSk7Ci0JCXN3aXRjaCAocF9jdGxiay0+cmMpIHsKLQkJY2FzZSAwOgotCQkJZGV2X2luZm8odGRldiwgIiVzOiBDTEFXIGRldmljZSAiCi0JCQkJIiUuOHM6IFN5c3RlbSB2YWxpZGF0ZSBjb21wbGV0ZWQuXG4iLAotCQkJCWRldi0+bmFtZSwgdGVtcF93c19uYW1lKTsKLQkJCWlmIChwcml2cHRyLT5zeXN0ZW1fdmFsaWRhdGVfY29tcCA9PSAwKQotCQkJCWNsYXdfc3RydF9jb25uX3JlcShkZXYpOwotCQkJcHJpdnB0ci0+c3lzdGVtX3ZhbGlkYXRlX2NvbXAgPSAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0xBV19SQ19OQU1FX01JU01BVENIOgotCQkJZGV2X3dhcm4odGRldiwgIlZhbGlkYXRpbmcgJXMgZmFpbGVkIGJlY2F1c2Ugb2YiCi0JCQkJIiBhIGhvc3Qgb3IgYWRhcHRlciBuYW1lIG1pc21hdGNoXG4iLAotCQkJCWRldi0+bmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSBDTEFXX1JDX1dST05HX1ZFUlNJT046Ci0JCQlkZXZfd2Fybih0ZGV2LCAiVmFsaWRhdGluZyAlcyBmYWlsZWQgYmVjYXVzZSBvZiBhIgotCQkJCSIgdmVyc2lvbiBjb25mbGljdFxuIiwKLQkJCQlkZXYtPm5hbWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQ0xBV19SQ19IT1NUX1JDVl9UT09fU01BTEw6Ci0JCQlkZXZfd2Fybih0ZGV2LCAiVmFsaWRhdGluZyAlcyBmYWlsZWQgYmVjYXVzZSBvZiBhIgotCQkJCSIgZnJhbWUgc2l6ZSBjb25mbGljdFxuIiwKLQkJCQlkZXYtPm5hbWUpOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfd2Fybih0ZGV2LCAiVGhlIGNvbW11bmljYXRpb24gcGVlciBvZiAlcyByZWplY3RlZCIKLQkJCQkiIHRoZSBjb25uZWN0aW9uXG4iLAotCQkJCSBkZXYtPm5hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIENPTk5FQ1RJT05fUkVRVUVTVDoKLQkJcF9jb25uZWN0ID0gKHN0cnVjdCBjb25uY21kICopJihwX2N0bGJrLT5kYXRhKTsKLQkJZGV2X2luZm8odGRldiwgIiVzOiBSZWN2IENvbm4gUmVxOiBWZXJzPSVkLGxpbmtfaWQ9JWQsIgotCQkJIkNvcnI9JWQsSE9TVCBhcHBsPSUuOHMsV1MgYXBwbD0lLjhzXG4iLAotCQkJZGV2LT5uYW1lLAotCQkJcF9jdGxiay0+dmVyc2lvbiwKLQkJCXBfY3RsYmstPmxpbmtpZCwKLQkJCXBfY3RsYmstPmNvcnJlbGF0b3IsCi0JCQlwX2Nvbm5lY3QtPmhvc3RfbmFtZSwKLQkJCXBfY29ubmVjdC0+V1NfbmFtZSk7Ci0JCWlmIChwcml2cHRyLT5hY3RpdmVfbGlua19JRCAhPSAwKSB7Ci0JCQljbGF3X3NuZF9kaXNjKGRldiwgcF9jdGxiayk7Ci0JCQlkZXZfaW5mbyh0ZGV2LCAiJXMgcmVqZWN0ZWQgYSBjb25uZWN0aW9uIHJlcXVlc3QiCi0JCQkJIiBiZWNhdXNlIGl0IGlzIGFscmVhZHkgYWN0aXZlXG4iLAotCQkJCWRldi0+bmFtZSk7Ci0JCX0KLQkJaWYgKHBfY3RsYmstPmxpbmtpZCAhPSAxKSB7Ci0JCQljbGF3X3NuZF9kaXNjKGRldiwgcF9jdGxiayk7Ci0JCQlkZXZfaW5mbyh0ZGV2LCAiJXMgcmVqZWN0ZWQgYSByZXF1ZXN0IHRvIG9wZW4gbXVsdGlwbGUiCi0JCQkJIiBjb25uZWN0aW9uc1xuIiwKLQkJCQlkZXYtPm5hbWUpOwotCQl9Ci0JCXJjID0gZmluZF9saW5rKGRldiwgcF9jb25uZWN0LT5ob3N0X25hbWUsIHBfY29ubmVjdC0+V1NfbmFtZSk7Ci0JCWlmIChyYyAhPSAwKSB7Ci0JCQljbGF3X3NuZF9kaXNjKGRldiwgcF9jdGxiayk7Ci0JCQlkZXZfaW5mbyh0ZGV2LCAiJXMgcmVqZWN0ZWQgYSBjb25uZWN0aW9uIHJlcXVlc3QiCi0JCQkJIiBiZWNhdXNlIG9mIGEgdHlwZSBtaXNtYXRjaFxuIiwKLQkJCQlkZXYtPm5hbWUpOwotCQl9Ci0JCWNsYXdfc2VuZF9jb250cm9sKGRldiwKLQkJCUNPTk5FQ1RJT05fQ09ORklSTSwgcF9jdGxiay0+bGlua2lkLAotCQkJcF9jdGxiay0+Y29ycmVsYXRvciwKLQkJCTAsIHBfY29ubmVjdC0+aG9zdF9uYW1lLAotCQkJcF9jb25uZWN0LT5XU19uYW1lKTsKLQkJaWYgKHBfZW52LT5wYWNraW5nID09IFBBQ0tJTkdfQVNLKSB7Ci0JCQlwX2Vudi0+cGFja2luZyA9IFBBQ0tfU0VORDsKLQkJCWNsYXdfc25kX2Nvbm5fcmVxKGRldiwgMCk7Ci0JCX0KLQkJZGV2X2luZm8odGRldiwgIiVzOiBDTEFXIGRldmljZSAlLjhzOiBDb25uZWN0aW9uICIKLQkJCSJjb21wbGV0ZWQgbGlua19pZD0lZC5cbiIsCi0JCQlkZXYtPm5hbWUsIHRlbXBfd3NfbmFtZSwKLQkJCXBfY3RsYmstPmxpbmtpZCk7Ci0JCQlwcml2cHRyLT5hY3RpdmVfbGlua19JRCA9IHBfY3RsYmstPmxpbmtpZDsKLQkJCXBfY2ggPSAmcHJpdnB0ci0+Y2hhbm5lbFtXUklURV9DSEFOTkVMXTsKLQkJCXdha2VfdXAoJnBfY2gtPndhaXQpOyAgLyogd2FrZSB1cCBjbGF3X29wZW4gKCBXUklURSkgKi8KLQkJYnJlYWs7Ci0JY2FzZSBDT05ORUNUSU9OX1JFU1BPTlNFOgotCQlwX2Nvbm5lY3QgPSAoc3RydWN0IGNvbm5jbWQgKikmKHBfY3RsYmstPmRhdGEpOwotCQlkZXZfaW5mbyh0ZGV2LCAiJXM6IFJlY3YgQ29ubiBSZXNwOiBWZXJzPSVkLGxpbmtfaWQ9JWQsIgotCQkJIkNvcnI9JWQsUkM9JWQsSG9zdCBhcHBsPSUuOHMsIFdTIGFwcGw9JS44c1xuIiwKLQkJCWRldi0+bmFtZSwKLQkJCXBfY3RsYmstPnZlcnNpb24sCi0JCQlwX2N0bGJrLT5saW5raWQsCi0JCQlwX2N0bGJrLT5jb3JyZWxhdG9yLAotCQkJcF9jdGxiay0+cmMsCi0JCQlwX2Nvbm5lY3QtPmhvc3RfbmFtZSwKLQkJCXBfY29ubmVjdC0+V1NfbmFtZSk7Ci0KLQkJaWYgKHBfY3RsYmstPnJjICE9IDApIHsKLQkJCWRldl93YXJuKHRkZXYsICJUaGUgY29tbXVuaWNhdGlvbiBwZWVyIG9mICVzIHJlamVjdGVkIgotCQkJCSIgYSBjb25uZWN0aW9uIHJlcXVlc3RcbiIsCi0JCQkJZGV2LT5uYW1lKTsKLQkJCXJldHVybiAxOwotCQl9Ci0JCXJjID0gZmluZF9saW5rKGRldiwKLQkJCXBfY29ubmVjdC0+aG9zdF9uYW1lLCBwX2Nvbm5lY3QtPldTX25hbWUpOwotCQlpZiAocmMgIT0gMCkgewotCQkJY2xhd19zbmRfZGlzYyhkZXYsIHBfY3RsYmspOwotCQkJZGV2X3dhcm4odGRldiwgIlRoZSBjb21tdW5pY2F0aW9uIHBlZXIgb2YgJXMiCi0JCQkJIiByZWplY3RlZCBhIGNvbm5lY3Rpb24gIgotCQkJCSJyZXF1ZXN0IGJlY2F1c2Ugb2YgYSB0eXBlIG1pc21hdGNoXG4iLAotCQkJCSBkZXYtPm5hbWUpOwotCQl9Ci0JCS8qIHNob3VsZCBiZSB1bnRpbCBDT05ORUNUSU9OX0NPTkZJUk0gKi8KLQkJcHJpdnB0ci0+YWN0aXZlX2xpbmtfSUQgPSAtKHBfY3RsYmstPmxpbmtpZCk7Ci0JCWJyZWFrOwotCWNhc2UgQ09OTkVDVElPTl9DT05GSVJNOgotCQlwX2Nvbm5lY3QgPSAoc3RydWN0IGNvbm5jbWQgKikmKHBfY3RsYmstPmRhdGEpOwotCQlkZXZfaW5mbyh0ZGV2LAotCQkJIiVzOiBSZWN2IENvbm4gQ29uZmlybTpWZXJzPSVkLGxpbmtfaWQ9JWQsIgotCQkJIkNvcnI9JWQsSG9zdCBhcHBsPSUuOHMsV1MgYXBwbD0lLjhzXG4iLAotCQkJZGV2LT5uYW1lLAotCQkJcF9jdGxiay0+dmVyc2lvbiwKLQkJCXBfY3RsYmstPmxpbmtpZCwKLQkJCXBfY3RsYmstPmNvcnJlbGF0b3IsCi0JCQlwX2Nvbm5lY3QtPmhvc3RfbmFtZSwKLQkJCXBfY29ubmVjdC0+V1NfbmFtZSk7Ci0JCWlmIChwX2N0bGJrLT5saW5raWQgPT0gLShwcml2cHRyLT5hY3RpdmVfbGlua19JRCkpIHsKLQkJCXByaXZwdHItPmFjdGl2ZV9saW5rX0lEID0gcF9jdGxiay0+bGlua2lkOwotCQkJaWYgKHBfZW52LT5wYWNraW5nID4gUEFDS0lOR19BU0spIHsKLQkJCQlkZXZfaW5mbyh0ZGV2LAotCQkJCSIlczogQ29uZmlybWVkIE5vdyBwYWNraW5nXG4iLCBkZXYtPm5hbWUpOwotCQkJCXBfZW52LT5wYWNraW5nID0gRE9fUEFDS0VEOwotCQkJfQotCQkJcF9jaCA9ICZwcml2cHRyLT5jaGFubmVsW1dSSVRFX0NIQU5ORUxdOwotCQkJd2FrZV91cCgmcF9jaC0+d2FpdCk7Ci0JCX0gZWxzZSB7Ci0JCQlkZXZfd2Fybih0ZGV2LCAiQWN0aXZhdGluZyAlcyBmYWlsZWQgYmVjYXVzZSBvZiIKLQkJCQkiIGFuIGluY29ycmVjdCBsaW5rIElEPSVkXG4iLAotCQkJCWRldi0+bmFtZSwgcF9jdGxiay0+bGlua2lkKTsKLQkJCWNsYXdfc25kX2Rpc2MoZGV2LCBwX2N0bGJrKTsKLQkJfQotCQlicmVhazsKLQljYXNlIERJU0NPTk5FQ1Q6Ci0JCWRldl9pbmZvKHRkZXYsICIlczogRGlzY29ubmVjdDogIgotCQkJIlZlcnM9JWQsbGlua19pZD0lZCxDb3JyPSVkXG4iLAotCQkJZGV2LT5uYW1lLCBwX2N0bGJrLT52ZXJzaW9uLAotCQkJcF9jdGxiay0+bGlua2lkLCBwX2N0bGJrLT5jb3JyZWxhdG9yKTsKLQkJaWYgKChwX2N0bGJrLT5saW5raWQgPT0gMikgJiYKLQkJICAgIChwX2Vudi0+cGFja2luZyA9PSBQQUNLX1NFTkQpKSB7Ci0JCQlwcml2cHRyLT5hY3RpdmVfbGlua19JRCA9IDE7Ci0JCQlwX2Vudi0+cGFja2luZyA9IERPX1BBQ0tFRDsKLQkJfSBlbHNlCi0JCQlwcml2cHRyLT5hY3RpdmVfbGlua19JRCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQ0xBV19FUlJPUjoKLQkJZGV2X3dhcm4odGRldiwgIlRoZSBjb21tdW5pY2F0aW9uIHBlZXIgb2YgJXMgZmFpbGVkXG4iLAotCQkJZGV2LT5uYW1lKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X3dhcm4odGRldiwgIlRoZSBjb21tdW5pY2F0aW9uIHBlZXIgb2YgJXMgc2VudCIKLQkJCSIgYW4gdW5rbm93biBjb21tYW5kIGNvZGVcbiIsCi0JCQlkZXYtPm5hbWUpOwotCQlicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAwOwotfSAgIC8qICAgIGVuZCBvZiBjbGF3X3Byb2Nlc3NfY29udHJvbCAgICAqLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSogICAgICAgICAgICAgICBjbGF3X3NlbmRfY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQKLWNsYXdfc2VuZF9jb250cm9sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTggdHlwZSwgX191OCBsaW5rLAotCSBfX3U4IGNvcnJlbGF0b3IsIF9fdTggcmMsIGNoYXIgKmxvY2FsX25hbWUsIGNoYXIgKnJlbW90ZV9uYW1lKQotewotICAgICAgICBzdHJ1Y3QgY2xhd19wcml2YmsgCQkqcHJpdnB0cjsKLSAgICAgICAgc3RydWN0IGNsYXdjdGwgICAgICAgICAgICAgICAgICAqcF9jdGw7Ci0gICAgICAgIHN0cnVjdCBzeXN2YWwgICAgICAgICAgICAgICAgICAgKnBfc3lzdmFsOwotICAgICAgICBzdHJ1Y3QgY29ubmNtZCAgICAgICAgICAgICAgICAgICpwX2Nvbm5lY3Q7Ci0gICAgICAgIHN0cnVjdCBza19idWZmIAkJCSpza2I7Ci0KLQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAic25kY250bCIpOwotCXByaXZwdHIgPSBkZXYtPm1sX3ByaXY7Ci0gICAgICAgIHBfY3RsPShzdHJ1Y3QgY2xhd2N0bCAqKSZwcml2cHRyLT5jdGxfYms7Ci0KLSAgICAgICAgcF9jdGwtPmNvbW1hbmQ9dHlwZTsKLSAgICAgICAgcF9jdGwtPnZlcnNpb249Q0xBV19WRVJTSU9OX0lEOwotICAgICAgICBwX2N0bC0+bGlua2lkPWxpbms7Ci0gICAgICAgIHBfY3RsLT5jb3JyZWxhdG9yPWNvcnJlbGF0b3I7Ci0gICAgICAgIHBfY3RsLT5yYz1yYzsKLQotICAgICAgICBwX3N5c3ZhbD0oc3RydWN0IHN5c3ZhbCAqKSZwX2N0bC0+ZGF0YTsKLSAgICAgICAgcF9jb25uZWN0PShzdHJ1Y3QgY29ubmNtZCAqKSZwX2N0bC0+ZGF0YTsKLQotICAgICAgICBzd2l0Y2ggKHBfY3RsLT5jb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTWVNURU1fVkFMSURBVEVfUkVRVUVTVDoKLSAgICAgICAgICAgICAgICBjYXNlIFNZU1RFTV9WQUxJREFURV9SRVNQT05TRToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmcF9zeXN2YWwtPmhvc3RfbmFtZSwgbG9jYWxfbmFtZSwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnBfc3lzdmFsLT5XU19uYW1lLCByZW1vdGVfbmFtZSwgOCk7Ci0JCQlpZiAocHJpdnB0ci0+cF9lbnYtPnBhY2tpbmcgPiAwKSB7Ci0JCQkJcF9zeXN2YWwtPnJlYWRfZnJhbWVfc2l6ZSA9IERFRl9QQUNLX0JVRlNJWkU7Ci0JCQkJcF9zeXN2YWwtPndyaXRlX2ZyYW1lX3NpemUgPSBERUZfUEFDS19CVUZTSVpFOwotCQkJfSBlbHNlIHsKLQkJCQkvKiBob3cgYmlnIGlzIHRoZSBiaWdnZXN0IGdyb3VwIG9mIHBhY2tldHMgKi8KLQkJCSAgIHBfc3lzdmFsLT5yZWFkX2ZyYW1lX3NpemUgPQotCQkJCXByaXZwdHItPnBfZW52LT5yZWFkX3NpemU7Ci0JCQkgICBwX3N5c3ZhbC0+d3JpdGVfZnJhbWVfc2l6ZSA9Ci0JCQkJcHJpdnB0ci0+cF9lbnYtPndyaXRlX3NpemU7Ci0JCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJnBfc3lzdmFsLT5yZXNlcnZlZCwgMHgwMCwgNCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RJT05fUkVRVUVTVDoKLSAgICAgICAgICAgICAgICBjYXNlIENPTk5FQ1RJT05fUkVTUE9OU0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU9OX0NPTkZJUk06Ci0gICAgICAgICAgICAgICAgY2FzZSBESVNDT05ORUNUOgotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZwX3N5c3ZhbC0+aG9zdF9uYW1lLCBsb2NhbF9uYW1lLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmcF9zeXN2YWwtPldTX25hbWUsIHJlbW90ZV9uYW1lLCA4KTsKLQkJCWlmIChwcml2cHRyLT5wX2Vudi0+cGFja2luZyA+IDApIHsKLQkJCS8qIEhvdyBiaWcgaXMgdGhlIGJpZ2dlc3QgcGFja2V0ICovCi0JCQkJcF9jb25uZWN0LT5yZXNlcnZlZDFbMF09Q0xBV19GUkFNRV9TSVpFOwotICAgICAgICAgICAgICAgICAgICAgICAgCXBfY29ubmVjdC0+cmVzZXJ2ZWQxWzFdPUNMQVdfRlJBTUVfU0laRTsKLQkJCX0gZWxzZSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZwX2Nvbm5lY3QtPnJlc2VydmVkMSwgMHgwMCwgNCk7Ci0gICAgICAgIAkgICAgICAgICAgICAgICAgbWVtc2V0KCZwX2Nvbm5lY3QtPnJlc2VydmVkMiwgMHgwMCwgNCk7Ci0JCQl9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiAgICAgIHdyaXRlIENvbnRyb2wgUmVjb3JkIHRvIHRoZSBkZXZpY2UgICAgICAgICAgICAgICAgICAgKi8KLQotCi0gICAgICAgIHNrYiA9IGRldl9hbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBjbGF3Y3RsKSk7Ci0gICAgICAgIGlmICghc2tiKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Ci0gICAgICAgIH0KLQltZW1jcHkoc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgY2xhd2N0bCkpLAotCQlwX2N0bCwgc2l6ZW9mKHN0cnVjdCBjbGF3Y3RsKSk7Ci0JaWYgKHByaXZwdHItPnBfZW52LT5wYWNraW5nID49IFBBQ0tfU0VORCkKLQkJY2xhd19od190eChza2IsIGRldiwgMSk7Ci0JZWxzZQotICAgICAgICAJY2xhd19od190eChza2IsIGRldiwgMCk7Ci0gICAgICAgIHJldHVybiAwOwotfSAgLyogICBlbmQgb2YgY2xhd19zZW5kX2NvbnRyb2wgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSogICAgICAgICAgICAgICBjbGF3X3NuZF9jb25uX3JlcSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgaW50Ci1jbGF3X3NuZF9jb25uX3JlcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBfX3U4IGxpbmspCi17Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICByYzsKLQlzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXZwdHIgPSBkZXYtPm1sX3ByaXY7Ci0gICAgICAgIHN0cnVjdCBjbGF3Y3RsIAkgICAqcF9jdGw7Ci0KLQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAic25kX2Nvbm4iKTsKLQlyYyA9IDE7Ci0gICAgICAgIHBfY3RsPShzdHJ1Y3QgY2xhd2N0bCAqKSZwcml2cHRyLT5jdGxfYms7Ci0JcF9jdGwtPmxpbmtpZCA9IGxpbms7Ci0gICAgICAgIGlmICggcHJpdnB0ci0+c3lzdGVtX3ZhbGlkYXRlX2NvbXA9PTB4MDAgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJjOwotICAgICAgICB9Ci0JaWYgKHByaXZwdHItPnBfZW52LT5wYWNraW5nID09IFBBQ0tJTkdfQVNLICkKLQkJcmM9Y2xhd19zZW5kX2NvbnRyb2woZGV2LCBDT05ORUNUSU9OX1JFUVVFU1QsMCwwLDAsCi0gICAgICAgIAkJV1NfQVBQTF9OQU1FX1BBQ0tFRCwgV1NfQVBQTF9OQU1FX1BBQ0tFRCk7Ci0JaWYgKHByaXZwdHItPnBfZW52LT5wYWNraW5nID09IFBBQ0tfU0VORCkgIHsKLQkJcmM9Y2xhd19zZW5kX2NvbnRyb2woZGV2LCBDT05ORUNUSU9OX1JFUVVFU1QsMCwwLDAsCi0gICAgICAgIAkJV1NfQVBQTF9OQU1FX0lQX05BTUUsIFdTX0FQUExfTkFNRV9JUF9OQU1FKTsKLQl9Ci0JaWYgKHByaXZwdHItPnBfZW52LT5wYWNraW5nID09IDApCi0gICAgICAgIAlyYz1jbGF3X3NlbmRfY29udHJvbChkZXYsIENPTk5FQ1RJT05fUkVRVUVTVCwwLDAsMCwKLSAgICAgICAJCQlIT1NUX0FQUExfTkFNRSwgcHJpdnB0ci0+cF9lbnYtPmFwaV90eXBlKTsKLSAgICAgICAgcmV0dXJuIHJjOwotCi19ICAvKiAgZW5kIG9mIGNsYXdfc25kX2Nvbm5fcmVxICovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgICAgICAgICAgIGNsYXdfc25kX2Rpc2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludAotY2xhd19zbmRfZGlzYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgY2xhd2N0bCAqIHBfY3RsKQotewotICAgICAgICBpbnQgcmM7Ci0gICAgICAgIHN0cnVjdCBjb25uY21kICogIHBfY29ubmVjdDsKLQotCUNMQVdfREJGX1RFWFQoMiwgc2V0dXAsICJzbmRfZHNjIik7Ci0gICAgICAgIHBfY29ubmVjdD0oc3RydWN0IGNvbm5jbWQgKikmcF9jdGwtPmRhdGE7Ci0KLSAgICAgICAgcmM9Y2xhd19zZW5kX2NvbnRyb2woZGV2LCBESVNDT05ORUNULCBwX2N0bC0+bGlua2lkLAotCQlwX2N0bC0+Y29ycmVsYXRvciwgMCwKLSAgICAgICAgICAgICAgICBwX2Nvbm5lY3QtPmhvc3RfbmFtZSwgcF9jb25uZWN0LT5XU19uYW1lKTsKLSAgICAgICAgcmV0dXJuIHJjOwotfSAgICAgLyogICBlbmQgb2YgY2xhd19zbmRfZGlzYyAgICAqLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSogICAgICAgICAgICAgICBjbGF3X3NuZF9zeXNfdmFsaWRhdGVfcnNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyBpbnQKLWNsYXdfc25kX3N5c192YWxpZGF0ZV9yc3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQlzdHJ1Y3QgY2xhd2N0bCAqcF9jdGwsIF9fdTMyIHJldHVybl9jb2RlKQotewotICAgICAgICBzdHJ1Y3QgY2xhd19lbnYgKiAgcF9lbnY7Ci0gICAgICAgIHN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdnB0cjsKLSAgICAgICAgaW50ICAgIHJjOwotCi0JQ0xBV19EQkZfVEVYVCgyLCBzZXR1cCwgImNoa3Jlc3AiKTsKLQlwcml2cHRyID0gZGV2LT5tbF9wcml2OwotICAgICAgICBwX2Vudj1wcml2cHRyLT5wX2VudjsKLSAgICAgICAgcmM9Y2xhd19zZW5kX2NvbnRyb2woZGV2LCBTWVNURU1fVkFMSURBVEVfUkVTUE9OU0UsCi0JCXBfY3RsLT5saW5raWQsCi0JCXBfY3RsLT5jb3JyZWxhdG9yLAotICAgICAgICAgICAgICAgIHJldHVybl9jb2RlLAotCQlwX2Vudi0+aG9zdF9uYW1lLAotCQlwX2Vudi0+YWRhcHRlcl9uYW1lICApOwotICAgICAgICByZXR1cm4gcmM7Ci19ICAgICAvKiAgICBlbmQgb2YgY2xhd19zbmRfc3lzX3ZhbGlkYXRlX3JzcCAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0qICAgICAgICAgICAgICAgY2xhd19zdHJ0X2Nvbm5fcmVxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50Ci1jbGF3X3N0cnRfY29ubl9yZXEoc3RydWN0IG5ldF9kZXZpY2UgKmRldiApCi17Ci0gICAgICAgIGludCByYzsKLQotCUNMQVdfREJGX1RFWFQoMiwgc2V0dXAsICJjb25uX3JlcSIpOwotICAgICAgICByYz1jbGF3X3NuZF9jb25uX3JlcShkZXYsIDEpOwotICAgICAgICByZXR1cm4gcmM7Ci19ICAgIC8qICAgZW5kIG9mIGNsYXdfc3RydF9jb25uX3JlcSAgICovCi0KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gKiAgIGNsYXdfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgc3RydWN0Ci1uZXRfZGV2aWNlX3N0YXRzICpjbGF3X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0gICAgICAgIHN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdnB0cjsKLQotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJzdGF0cyIpOwotCXByaXZwdHIgPSBkZXYtPm1sX3ByaXY7Ci0gICAgICAgIHJldHVybiAmcHJpdnB0ci0+c3RhdHM7Ci19ICAgICAvKiAgIGVuZCBvZiBjbGF3X3N0YXRzICAgKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0qICAgICAgIHVucGFja19yZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQKLXVucGFja19yZWFkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQotewotICAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotICAgICAgICBzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXZwdHI7Ci0Jc3RydWN0IGNsYXdfZW52ICAgICpwX2VudjsKLSAgICAgICAgc3RydWN0IGNjd2JrIAkqcF90aGlzX2NjdzsKLSAgICAgICAgc3RydWN0IGNjd2JrIAkqcF9maXJzdF9jY3c7Ci0gICAgICAgIHN0cnVjdCBjY3diayAJKnBfbGFzdF9jY3c7Ci0Jc3RydWN0IGNsYXdwaCAJKnBfcGFja2g7Ci0Jdm9pZAkJKnBfcGFja2Q7Ci0Jc3RydWN0IGNsYXdjdGwgCSpwX2N0bHJlYz1OVUxMOwotCXN0cnVjdCBkZXZpY2UJKnBfZGV2OwotCi0gICAgICAgIF9fdTMyCWxlbl9vZl9kYXRhOwotCV9fdTMyCXBhY2tfb2ZmOwotICAgICAgICBfX3U4CWxpbmtfbnVtOwotICAgICAgICBfX3U4IAltdGNfdGhpc19mcm09MDsKLSAgICAgICAgX191MzIJYnl0ZXNfdG9fbW92OwotICAgICAgICBpbnQJaT0wOwotCWludCAgICAgcD0wOwotCi0JQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgInVucGtyZWFkIik7Ci0gICAgICAgIHBfZmlyc3RfY2N3PU5VTEw7Ci0gICAgICAgIHBfbGFzdF9jY3c9TlVMTDsKLQlwX3BhY2toPU5VTEw7Ci0JcF9wYWNrZD1OVUxMOwotCXByaXZwdHIgPSBkZXYtPm1sX3ByaXY7Ci0KLQlwX2RldiA9ICZwcml2cHRyLT5jaGFubmVsW1JFQURfQ0hBTk5FTF0uY2Rldi0+ZGV2OwotCXBfZW52ID0gcHJpdnB0ci0+cF9lbnY7Ci0gICAgICAgIHBfdGhpc19jY3c9cHJpdnB0ci0+cF9yZWFkX2FjdGl2ZV9maXJzdDsKLQl3aGlsZSAocF90aGlzX2NjdyE9TlVMTCAmJiBwX3RoaXNfY2N3LT5oZWFkZXIuZmxhZyE9Q0xBV19QRU5ESU5HKSB7Ci0JCXBhY2tfb2ZmID0gMDsKLQkJcCA9IDA7Ci0JCXBfdGhpc19jY3ctPmhlYWRlci5mbGFnPUNMQVdfUEVORElORzsKLQkJcHJpdnB0ci0+cF9yZWFkX2FjdGl2ZV9maXJzdD1wX3RoaXNfY2N3LT5uZXh0OwotICAgICAgICAgICAgICAgIHBfdGhpc19jY3ctPm5leHQ9TlVMTDsKLQkJcF9wYWNraCA9IChzdHJ1Y3QgY2xhd3BoICopcF90aGlzX2Njdy0+cF9idWZmZXI7Ci0JCWlmICgocF9lbnYtPnBhY2tpbmcgPT0gUEFDS19TRU5EKSAmJgotCQkgICAgKHBfcGFja2gtPmxlbiA9PSAzMikgICAgICAgICAgICYmCi0JCSAgICAocF9wYWNraC0+bGlua19udW0gPT0gMCkpIHsgICAvKiBpcyBpdCBhIHBhY2tlZCBjdGwgcmVjPyAqLwotCQkJcF9wYWNraCsrOyAgLyogcGVlayBwYXN0IHBhY2sgaGVhZGVyICovCi0JCQlwX2N0bHJlYyA9IChzdHJ1Y3QgY2xhd2N0bCAqKXBfcGFja2g7Ci0JCQlwX3BhY2toLS07ICAvKiB1biBwZWVrICovCi0JCQlpZiAoKHBfY3RscmVjLT5jb21tYW5kID09IENPTk5FQ1RJT05fUkVTUE9OU0UpIHx8Ci0JCSAgICAgICAgICAgIChwX2N0bHJlYy0+Y29tbWFuZCA9PSBDT05ORUNUSU9OX0NPTkZJUk0pKQotCQkJCXBfZW52LT5wYWNraW5nID0gRE9fUEFDS0VEOwotCQl9Ci0JCWlmIChwX2Vudi0+cGFja2luZyA9PSBET19QQUNLRUQpCi0JCQlsaW5rX251bT1wX3BhY2toLT5saW5rX251bTsKLQkJZWxzZQotCSAgICAgICAgICAgICAgICBsaW5rX251bT1wX3RoaXNfY2N3LT5oZWFkZXIub3Bjb2RlIC8gODsKLSAgICAgICAgICAgICAgICBpZiAoKHBfdGhpc19jY3ctPmhlYWRlci5vcGNvZGUgJiBNT1JFX3RvX0NPTUVfRkxBRykhPTApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG10Y190aGlzX2ZybT0xOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfdGhpc19jY3ctPmhlYWRlci5sZW5ndGghPQotCQkJCXByaXZwdHItPnBfZW52LT5yZWFkX3NpemUgKSB7Ci0JCQkJZGV2X3dhcm4ocF9kZXYsCi0JCQkJCSJUaGUgY29tbXVuaWNhdGlvbiBwZWVyIG9mICVzIgotCQkJCQkiIHNlbnQgYSBmYXVsdHkiCi0JCQkJCSIgZnJhbWUgb2YgbGVuZ3RoICUwMnhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBwX3RoaXNfY2N3LT5oZWFkZXIubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocHJpdnB0ci0+bXRjX3NraXBwaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFdlJ3JlIGluIHRoZSBtb2RlIG9mIHNraXBwaW5nIHBhc3QgYQotCQkJKiAgIG11bHRpLWZyYW1lIG1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICogICB0aGF0IHdlIGNhbid0IHByb2Nlc3MgZm9yIHNvbWUgcmVhc29uIG9yIG90aGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgKiAgIFRoZSBmaXJzdCBmcmFtZSB3aXRob3V0IHRoZSBNb3JlLVRvLUNvbWUgZmxhZyBpcwotCQkJKiAgIHRoZSBsYXN0IGZyYW1lIG9mIHRoZSBza2lwcGVkIG1lc3NhZ2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogIGluIGNhc2Ugb2YgTW9yZS1Uby1Db21lIG5vdCBzZXQgaW4gdGhpcyBmcmFtZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG10Y190aGlzX2ZybT09MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2cHRyLT5tdGNfc2tpcHBpbmc9MDsgLyogT2ssIHRoZSBlbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdnB0ci0+bXRjX2xvZ2ljYWxfbGluaz0tMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gTmV4dEZyYW1lOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChsaW5rX251bT09MCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2xhd19wcm9jZXNzX2NvbnRyb2woZGV2LCBwX3RoaXNfY2N3KTsKLQkJCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJVbnBrQ250bCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBOZXh0RnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotdW5wYWNrX25leHQ6Ci0JCWlmIChwX2Vudi0+cGFja2luZyA9PSBET19QQUNLRUQpIHsKLQkJCWlmIChwYWNrX29mZiA+IHBfZW52LT5yZWFkX3NpemUpCi0JCQkJZ290byBOZXh0RnJhbWU7Ci0JCQlwX3BhY2tkID0gcF90aGlzX2Njdy0+cF9idWZmZXIrcGFja19vZmY7Ci0JCQlwX3BhY2toID0gKHN0cnVjdCBjbGF3cGggKikgcF9wYWNrZDsKLQkJCWlmICgocF9wYWNraC0+bGVuID09IDApIHx8IC8qIGRvbmUgd2l0aCB0aGlzIGZyYW1lPyAqLwotCQkJICAgIChwX3BhY2toLT5mbGFnICE9IDApKQotCQkJCWdvdG8gTmV4dEZyYW1lOwotCQkJYnl0ZXNfdG9fbW92ID0gcF9wYWNraC0+bGVuOwotCQkJcGFja19vZmYgKz0gYnl0ZXNfdG9fbW92K3NpemVvZihzdHJ1Y3QgY2xhd3BoKTsKLQkJCXArKzsKLQkJfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAJYnl0ZXNfdG9fbW92PXBfdGhpc19jY3ctPmhlYWRlci5sZW5ndGg7Ci0JCX0KLSAgICAgICAgICAgICAgICBpZiAocHJpdnB0ci0+bXRjX2xvZ2ljYWxfbGluazwwKSB7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICogIGlmIE1vcmUtVG8tQ29tZSBpcyBzZXQgaW4gdGhpcyBmcmFtZSB0aGVuIHdlIGRvbid0IGtub3cKLSAgICAgICAgICAgICAgICAqICBsZW5ndGggb2YgZW50aXJlIG1lc3NhZ2UsIGFuZCBoZW5jZSBoYXZlIHRvIGFsbG9jYXRlCi0JCSogIGxhcmdlIGJ1ZmZlciAgICovCi0KLSAgICAgICAgICAgICAgICAvKiAgICAgIFdlIGFyZSBzdGFydGluZyBhIG5ldyBlbnZlbG9wZSAgKi8KLSAgICAgICAgICAgICAgICBwcml2cHRyLT5tdGNfb2Zmc2V0PTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2cHRyLT5tdGNfbG9naWNhbF9saW5rPWxpbmtfbnVtOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChieXRlc190b19tb3YgPiAoTUFYX0VOVkVMT1BFX1NJWkUtIHByaXZwdHItPm10Y19vZmZzZXQpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBlcnJvciAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnN0YXRzLnJ4X2ZyYW1lX2Vycm9ycysrOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBOZXh0RnJhbWU7Ci0gICAgICAgICAgICAgICAgfQotCQlpZiAocF9lbnYtPnBhY2tpbmcgPT0gRE9fUEFDS0VEKSB7Ci0JCQltZW1jcHkoIHByaXZwdHItPnBfbXRjX2VudmVsb3BlKyBwcml2cHRyLT5tdGNfb2Zmc2V0LAotCQkJCXBfcGFja2Qrc2l6ZW9mKHN0cnVjdCBjbGF3cGgpLCBieXRlc190b19tb3YpOwotCi0JCX0gZWxzZQl7Ci0gICAgICAgICAgICAgICAgCW1lbWNweSggcHJpdnB0ci0+cF9tdGNfZW52ZWxvcGUrIHByaXZwdHItPm10Y19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAJcF90aGlzX2Njdy0+cF9idWZmZXIsIGJ5dGVzX3RvX21vdik7Ci0JCX0KLSAgICAgICAgICAgICAgICBpZiAobXRjX3RoaXNfZnJtPT0wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW5fb2ZfZGF0YT1wcml2cHRyLT5tdGNfb2Zmc2V0K2J5dGVzX3RvX21vdjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNrYj1kZXZfYWxsb2Nfc2tiKGxlbl9vZl9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHNrYl9wdXQoc2tiLGxlbl9vZl9kYXRhKSwKLQkJCQkJcHJpdnB0ci0+cF9tdGNfZW52ZWxvcGUsCi0JCQkJCWxlbl9vZl9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiLT5kZXY9ZGV2OwotCQkJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNrYi0+cHJvdG9jb2w9aHRvbnMoRVRIX1BfSVApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2ItPmlwX3N1bW1lZD1DSEVDS1NVTV9VTk5FQ0VTU0FSWTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdnB0ci0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJCXByaXZwdHItPnN0YXRzLnJ4X2J5dGVzKz1sZW5fb2ZfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0aWZfcngoc2tiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotCQkJCWRldl9pbmZvKHBfZGV2LCAiQWxsb2NhdGluZyBhIGJ1ZmZlciBmb3IiCi0JCQkJCSIgaW5jb21pbmcgZGF0YSBmYWlsZWRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2cHRyLT5zdGF0cy5yeF9kcm9wcGVkKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2cHRyLT5tdGNfb2Zmc2V0PTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcml2cHRyLT5tdGNfbG9naWNhbF9saW5rPS0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPm10Y19vZmZzZXQrPWJ5dGVzX3RvX21vdjsKLSAgICAgICAgICAgICAgICB9Ci0JCWlmIChwX2Vudi0+cGFja2luZyA9PSBET19QQUNLRUQpCi0JCQlnb3RvIHVucGFja19uZXh0OwotTmV4dEZyYW1lOgotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgKiAgIFJlbW92ZSBUaGlzQ0NXYmxvY2sgZnJvbSBhY3RpdmUgcmVhZCBxdWV1ZSwgYW5kIGFkZCBpdAotICAgICAgICAgICAgICAgICogICB0byBxdWV1ZSBvZiBmcmVlIGJsb2NrcyB0byBiZSByZXVzZWQuCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgcF90aGlzX2Njdy0+aGVhZGVyLmxlbmd0aD0weGZmZmY7Ci0gICAgICAgICAgICAgICAgcF90aGlzX2Njdy0+aGVhZGVyLm9wY29kZT0weGZmOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgKiAgICAgICBhZGQgdGhpcyBvbmUgdG8gdGhlIGZyZWUgcXVldWUgZm9yIGxhdGVyIHJldXNlCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAocF9maXJzdF9jY3c9PU5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZmlyc3RfY2N3ID0gcF90aGlzX2NjdzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2xhc3RfY2N3LT5uZXh0ID0gcF90aGlzX2NjdzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcF9sYXN0X2NjdyA9IHBfdGhpc19jY3c7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAqICAgICAgIGNoYWluIHRvIG5leHQgYmxvY2sgb24gYWN0aXZlIHJlYWQgcXVldWUKLSAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBfdGhpc19jY3cgPSBwcml2cHRyLT5wX3JlYWRfYWN0aXZlX2ZpcnN0OwotCQlDTEFXX0RCRl9URVhUXyg0LCB0cmFjZSwgInJ4cGt0ICVkIiwgcCk7Ci0gICAgICAgIH0gLyogZW5kIG9mIHdoaWxlICovCi0KLSAgICAgICAgLyogICAgICBjaGVjayB2YWxpZGl0eSAgICAgICAgICAgICAgICAgICovCi0KLQlDTEFXX0RCRl9URVhUXyg0LCB0cmFjZSwgInJ4ZnJtICVkIiwgaSk7Ci0gICAgICAgIGFkZF9jbGF3X3JlYWRzKGRldiwgcF9maXJzdF9jY3csIHBfbGFzdF9jY3cpOwotICAgICAgICBjbGF3X3N0cnRfcmVhZChkZXYsIExPQ0tfWUVTKTsKLSAgICAgICAgcmV0dXJuOwotfSAgICAgLyogIGVuZCBvZiB1bnBhY2tfcmVhZCAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSogICAgICAgY2xhd19zdHJ0X3JlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZAotY2xhd19zdHJ0X3JlYWQgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBsb2NrICkKLXsKLSAgICAgICAgaW50ICAgICAgICByYyA9IDA7Ci0gICAgICAgIF9fdTMyICAgICAgcGFybTsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgc2F2ZWZsYWdzID0gMDsKLQlzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXZwdHIgPSBkZXYtPm1sX3ByaXY7Ci0gICAgICAgIHN0cnVjdCBjY3diaypwX2Njd2JrOwotICAgICAgICBzdHJ1Y3QgY2hiayAqcF9jaDsKLSAgICAgICAgc3RydWN0IGNsYXdoICpwX2NsYXdoOwotCXBfY2ggPSAmcHJpdnB0ci0+Y2hhbm5lbFtSRUFEX0NIQU5ORUxdOwotCi0JQ0xBV19EQkZfVEVYVCg0LCB0cmFjZSwgIlN0UmROdGVyIik7Ci0gICAgICAgIHBfY2xhd2g9KHN0cnVjdCBjbGF3aCAqKXByaXZwdHItPnBfY2xhd19zaWduYWxfYmxrOwotICAgICAgICBwX2NsYXdoLT5mbGFnPUNMQVdfSURMRTsgICAgLyogMHgwMCAqLwotCi0gICAgICAgIGlmICgocHJpdnB0ci0+cF93cml0ZV9hY3RpdmVfZmlyc3QhPU5VTEwgJiYKLSAgICAgICAgICAgICBwcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9maXJzdC0+aGVhZGVyLmZsYWchPUNMQVdfUEVORElORykgfHwKLSAgICAgICAgICAgIChwcml2cHRyLT5wX3JlYWRfYWN0aXZlX2ZpcnN0IT1OVUxMICYmCi0gICAgICAgICAgICAgcHJpdnB0ci0+cF9yZWFkX2FjdGl2ZV9maXJzdC0+aGVhZGVyLmZsYWchPUNMQVdfUEVORElORyApKSB7Ci0gICAgICAgICAgICAgICAgcF9jbGF3aC0+ZmxhZz1DTEFXX0JVU1k7ICAgIC8qIDB4ZmYgKi8KLSAgICAgICAgfQotICAgICAgICBpZiAobG9jaz09TE9DS19ZRVMpIHsKLSAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZShnZXRfY2N3ZGV2X2xvY2socF9jaC0+Y2RldiksIHNhdmVmbGFncyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgKHZvaWQgKikmcF9jaC0+SU9fYWN0aXZlKSA9PSAwKSB7Ci0JCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJIb3RSZWFkIik7Ci0gICAgICAgICAgICAgICAgcF9jY3diaz1wcml2cHRyLT5wX3JlYWRfYWN0aXZlX2ZpcnN0OwotICAgICAgICAgICAgICAgIHBhcm0gPSAodW5zaWduZWQgbG9uZykgcF9jaDsKLSAgICAgICAgICAgICAgICByYyA9IGNjd19kZXZpY2Vfc3RhcnQgKHBfY2gtPmNkZXYsICZwX2Njd2JrLT5yZWFkLCBwYXJtLAotCQkJCSAgICAgICAweGZmLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAocmMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2N3X2NoZWNrX3JldHVybl9jb2RlKHBfY2gtPmNkZXYsIHJjKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQllbHNlIHsKLQkJQ0xBV19EQkZfVEVYVCgyLCB0cmFjZSwgIlJlYWRBY3QiKTsKLQl9Ci0KLSAgICAgICAgaWYgKGxvY2s9PUxPQ0tfWUVTKSB7Ci0gICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShnZXRfY2N3ZGV2X2xvY2socF9jaC0+Y2RldiksIHNhdmVmbGFncyk7Ci0gICAgICAgIH0KLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAiU3RSZEV4aXQiKTsKLSAgICAgICAgcmV0dXJuOwotfSAgICAgICAvKiAgICBlbmQgb2YgY2xhd19zdHJ0X3JlYWQgICAgKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgICBjbGF3X3N0cnRfb3V0X0lPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQKLWNsYXdfc3RydF9vdXRfSU8oIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQotewotICAgICAgICBpbnQgICAgICAgICAgICAgCXJjID0gMDsKLSAgICAgICAgdW5zaWduZWQgbG9uZyAgIAlwYXJtOwotICAgICAgICBzdHJ1Y3QgY2xhd19wcml2YmsgCSpwcml2cHRyOwotICAgICAgICBzdHJ1Y3QgY2hiayAgICAgCSpwX2NoOwotICAgICAgICBzdHJ1Y3QgY2N3YmsgICAJKnBfZmlyc3RfY2N3OwotCi0JaWYgKCFkZXYpIHsKLQkJcmV0dXJuOwotCX0KLQlwcml2cHRyID0gKHN0cnVjdCBjbGF3X3ByaXZiayAqKWRldi0+bWxfcHJpdjsKLQlwX2NoID0gJnByaXZwdHItPmNoYW5uZWxbV1JJVEVfQ0hBTk5FTF07Ci0KLQlDTEFXX0RCRl9URVhUKDQsIHRyYWNlLCAic3RydF9pbyIpOwotICAgICAgICBwX2ZpcnN0X2Njdz1wcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9maXJzdDsKLQotICAgICAgICBpZiAocF9jaC0+Y2xhd19zdGF0ZSA9PSBDTEFXX1NUT1ApCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAocF9maXJzdF9jY3cgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSZwX2NoLT5JT19hY3RpdmUpID09IDApIHsKLSAgICAgICAgICAgICAgICBwYXJtID0gKHVuc2lnbmVkIGxvbmcpIHBfY2g7Ci0JCUNMQVdfREJGX1RFWFQoMiwgdHJhY2UsICJTdFdydElPIik7Ci0JCXJjID0gY2N3X2RldmljZV9zdGFydChwX2NoLT5jZGV2LCAmcF9maXJzdF9jY3ctPndyaXRlLCBwYXJtLAotCQkJCSAgICAgIDB4ZmYsIDApOwotICAgICAgICAgICAgICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjY3dfY2hlY2tfcmV0dXJuX2NvZGUocF9jaC0+Y2RldiwgcmMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXYtPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKLSAgICAgICAgcmV0dXJuOwotfSAgICAgICAvKiAgICBlbmQgb2YgY2xhd19zdHJ0X291dF9JTyAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0qICAgICAgIEZyZWUgd3JpdGUgYnVmZmVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZAotY2xhd19mcmVlX3dydF9idWYoIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgKQotewotCi0Jc3RydWN0IGNsYXdfcHJpdmJrICpwcml2cHRyID0gKHN0cnVjdCBjbGF3X3ByaXZiayAqKWRldi0+bWxfcHJpdjsKLQlzdHJ1Y3QgY2N3YmsqcF90aGlzX2NjdzsKLQlzdHJ1Y3QgY2N3YmsqcF9uZXh0X2NjdzsKLQotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJmcmVld3J0YiIpOwotICAgICAgICAvKiAgc2NhbiB0aGUgd3JpdGUgcXVldWUgdG8gZnJlZSBhbnkgY29tcGxldGVkIHdyaXRlIHBhY2tldHMgICAqLwotICAgICAgICBwX3RoaXNfY2N3PXByaXZwdHItPnBfd3JpdGVfYWN0aXZlX2ZpcnN0OwotICAgICAgICB3aGlsZSAoIChwX3RoaXNfY2N3IT1OVUxMKSAmJiAocF90aGlzX2Njdy0+aGVhZGVyLmZsYWchPUNMQVdfUEVORElORykpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBwX25leHRfY2N3ID0gcF90aGlzX2Njdy0+bmV4dDsKLSAgICAgICAgICAgICAgICBpZiAoKChwX25leHRfY2N3IT1OVUxMKSAmJgotCQkgICAgIChwX25leHRfY2N3LT5oZWFkZXIuZmxhZyE9Q0xBV19QRU5ESU5HKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKChwX3RoaXNfY2N3ID09IHByaXZwdHItPnBfd3JpdGVfYWN0aXZlX2xhc3QpICYmCi0gICAgICAgICAgICAgICAgICAgICAocF90aGlzX2Njdy0+aGVhZGVyLmZsYWchPUNMQVdfUEVORElORykpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgbmV4dCBDQ1cgaXMgT0sgb3IgdGhpcyBpcyAgKi8KLQkJCS8qIHRoZSBsYXN0IENDVy4uLmZyZWUgaXQgICBAQTFBICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHJpdnB0ci0+cF93cml0ZV9hY3RpdmVfZmlyc3Q9cF90aGlzX2Njdy0+bmV4dDsKLQkJCXBfdGhpc19jY3ctPmhlYWRlci5mbGFnPUNMQVdfUEVORElORzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdGhpc19jY3ctPm5leHQ9cHJpdnB0ci0+cF93cml0ZV9mcmVlX2NoYWluOwotCQkJcHJpdnB0ci0+cF93cml0ZV9mcmVlX2NoYWluPXBfdGhpc19jY3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK3ByaXZwdHItPndyaXRlX2ZyZWVfY291bnQ7Ci0JCQlwcml2cHRyLT5zdGF0cy50eF9ieXRlcys9IHBfdGhpc19jY3ctPndyaXRlLmNvdW50OwotCQkJcF90aGlzX2Njdz1wcml2cHRyLT5wX3dyaXRlX2FjdGl2ZV9maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaXZwdHItPnN0YXRzLnR4X3BhY2tldHMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0JCQlicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByaXZwdHItPndyaXRlX2ZyZWVfY291bnQhPTApIHsKLSAgICAgICAgICAgICAgICBjbGF3X2NsZWFyYml0X2J1c3koVEJfTk9CVUZGRVIsZGV2KTsKLSAgICAgICAgfQotICAgICAgICAvKiAgIHdob2xlIGNoYWluIHJlbW92ZWQ/ICAgKi8KLSAgICAgICAgaWYgKHByaXZwdHItPnBfd3JpdGVfYWN0aXZlX2ZpcnN0PT1OVUxMKSB7Ci0gICAgICAgICAgICAgICAgcHJpdnB0ci0+cF93cml0ZV9hY3RpdmVfbGFzdD1OVUxMOwotICAgICAgICB9Ci0JQ0xBV19EQkZfVEVYVF8oNCwgdHJhY2UsICJGV0M9JWQiLCBwcml2cHRyLT53cml0ZV9mcmVlX2NvdW50KTsKLSAgICAgICAgcmV0dXJuOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0qICAgICAgIGNsYXcgZnJlZSBuZXRkZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQKLWNsYXdfZnJlZV9uZXRkZXZpY2Uoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYsIGludCBmcmVlX2RldikKLXsKLQlzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXZwdHI7Ci0KLQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAiZnJlZV9kZXYiKTsKLQlpZiAoIWRldikKLQkJcmV0dXJuOwotCUNMQVdfREJGX1RFWFRfKDIsIHNldHVwLCAiJXMiLCBkZXYtPm5hbWUpOwotCXByaXZwdHIgPSBkZXYtPm1sX3ByaXY7Ci0JaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUlVOTklORykKLQkJY2xhd19yZWxlYXNlKGRldik7Ci0JaWYgKHByaXZwdHIpIHsKLQkJcHJpdnB0ci0+Y2hhbm5lbFtSRUFEX0NIQU5ORUxdLm5kZXYgPSBOVUxMOyAgLyogc2F5IGl0J3MgZnJlZSAqLwotCX0KLQlkZXYtPm1sX3ByaXYgPSBOVUxMOwotI2lmZGVmIE1PRFVMRQotCWlmIChmcmVlX2RldikgewotCQlmcmVlX25ldGRldihkZXYpOwotCX0KLSNlbmRpZgotCUNMQVdfREJGX1RFWFQoMiwgc2V0dXAsICJmcmVlX29rIik7Ci19Ci0KLS8qKgotICogQ2xhdyBpbml0IG5ldGRldmljZQotICogSW5pdGlhbGl6ZSBldmVyeXRoaW5nIG9mIHRoZSBuZXQgZGV2aWNlIGV4Y2VwdCB0aGUgbmFtZSBhbmQgdGhlCi0gKiBjaGFubmVsIHN0cnVjdHMuCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgY2xhd19uZXRkZXZfb3BzID0gewotCS5uZG9fb3BlbgkJPSBjbGF3X29wZW4sCi0JLm5kb19zdG9wCQk9IGNsYXdfcmVsZWFzZSwKLQkubmRvX2dldF9zdGF0cwkJPSBjbGF3X3N0YXRzLAotCS5uZG9fc3RhcnRfeG1pdAkJPSBjbGF3X3R4LAotCS5uZG9fY2hhbmdlX210dQkJPSBjbGF3X2NoYW5nZV9tdHUsCi19OwotCi1zdGF0aWMgdm9pZAotY2xhd19pbml0X25ldGRldmljZShzdHJ1Y3QgbmV0X2RldmljZSAqIGRldikKLXsKLQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAiaW5pdF9kZXYiKTsKLQlDTEFXX0RCRl9URVhUXygyLCBzZXR1cCwgIiVzIiwgZGV2LT5uYW1lKTsKLQlkZXYtPm10dSA9IENMQVdfREVGQVVMVF9NVFVfU0laRTsKLQlkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IDA7Ci0JZGV2LT5hZGRyX2xlbiA9IDA7Ci0JZGV2LT50eXBlID0gQVJQSFJEX1NMSVA7Ci0JZGV2LT50eF9xdWV1ZV9sZW4gPSAxMzAwOwotCWRldi0+ZmxhZ3MgPSBJRkZfUE9JTlRPUE9JTlQgfCBJRkZfTk9BUlA7Ci0JZGV2LT5uZXRkZXZfb3BzID0gJmNsYXdfbmV0ZGV2X29wczsKLQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAiaW5pdG9rIik7Ci0JcmV0dXJuOwotfQotCi0vKioKLSAqIEluaXQgYSBuZXcgY2hhbm5lbCBpbiB0aGUgcHJpdnB0ci0+Y2hhbm5lbFtpXS4KLSAqCi0gKiBAcGFyYW0gY2RldiAgVGhlIGNjd19kZXZpY2UgdG8gYmUgYWRkZWQuCi0gKgotICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsICEwIG9uIGVycm9yLgotICovCi1zdGF0aWMgaW50Ci1hZGRfY2hhbm5lbChzdHJ1Y3QgY2N3X2RldmljZSAqY2RldixpbnQgaSxzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXZwdHIpCi17Ci0Jc3RydWN0IGNoYmsgKnBfY2g7Ci0Jc3RydWN0IGNjd19kZXZfaWQgZGV2X2lkOwotCi0JQ0xBV19EQkZfVEVYVF8oMiwgc2V0dXAsICIlcyIsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKLQlwcml2cHRyLT5jaGFubmVsW2ldLmZsYWcgID0gaSsxOyAgIC8qIFJlYWQgaXMgMSBXcml0ZSBpcyAyICovCi0JcF9jaCA9ICZwcml2cHRyLT5jaGFubmVsW2ldOwotCXBfY2gtPmNkZXYgPSBjZGV2OwotCXNucHJpbnRmKHBfY2gtPmlkLCBDTEFXX0lEX1NJWkUsICJjbC0lcyIsIGRldl9uYW1lKCZjZGV2LT5kZXYpKTsKLQljY3dfZGV2aWNlX2dldF9pZChjZGV2LCAmZGV2X2lkKTsKLQlwX2NoLT5kZXZubyA9IGRldl9pZC5kZXZubzsKLQlpZiAoKHBfY2gtPmlyYiA9IGt6YWxsb2Moc2l6ZW9mIChzdHJ1Y3QgaXJiKSxHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqCi0gKgotICogU2V0dXAgYW4gaW50ZXJmYWNlLgotICoKLSAqIEBwYXJhbSBjZ2RldiAgRGV2aWNlIHRvIGJlIHNldHVwLgotICoKLSAqIEByZXR1cm5zIDAgb24gc3VjY2VzcywgITAgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludAotY2xhd19uZXdfZGV2aWNlKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmNnZGV2KQotewotCXN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdnB0cjsKLQlzdHJ1Y3QgY2xhd19lbnYgKnBfZW52OwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0JaW50IHJldDsKLQlzdHJ1Y3QgY2N3X2Rldl9pZCBkZXZfaWQ7Ci0KLQlkZXZfaW5mbygmY2dkZXYtPmRldiwgImFkZCBmb3IgJXNcbiIsCi0JCSBkZXZfbmFtZSgmY2dkZXYtPmNkZXZbUkVBRF9DSEFOTkVMXS0+ZGV2KSk7Ci0JQ0xBV19EQkZfVEVYVCgyLCBzZXR1cCwgIm5ld19kZXYiKTsKLQlwcml2cHRyID0gZGV2X2dldF9kcnZkYXRhKCZjZ2Rldi0+ZGV2KTsKLQlkZXZfc2V0X2RydmRhdGEoJmNnZGV2LT5jZGV2W1JFQURfQ0hBTk5FTF0tPmRldiwgcHJpdnB0cik7Ci0JZGV2X3NldF9kcnZkYXRhKCZjZ2Rldi0+Y2RldltXUklURV9DSEFOTkVMXS0+ZGV2LCBwcml2cHRyKTsKLQlpZiAoIXByaXZwdHIpCi0JCXJldHVybiAtRU5PREVWOwotCXBfZW52ID0gcHJpdnB0ci0+cF9lbnY7Ci0JY2N3X2RldmljZV9nZXRfaWQoY2dkZXYtPmNkZXZbUkVBRF9DSEFOTkVMXSwgJmRldl9pZCk7Ci0JcF9lbnYtPmRldm5vW1JFQURfQ0hBTk5FTF0gPSBkZXZfaWQuZGV2bm87Ci0JY2N3X2RldmljZV9nZXRfaWQoY2dkZXYtPmNkZXZbV1JJVEVfQ0hBTk5FTF0sICZkZXZfaWQpOwotCXBfZW52LT5kZXZub1tXUklURV9DSEFOTkVMXSA9IGRldl9pZC5kZXZubzsKLQlyZXQgPSBhZGRfY2hhbm5lbChjZ2Rldi0+Y2RldlswXSwwLHByaXZwdHIpOwotCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gYWRkX2NoYW5uZWwoY2dkZXYtPmNkZXZbMV0sMSxwcml2cHRyKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X3dhcm4oJmNnZGV2LT5kZXYsICJDcmVhdGluZyBhIENMQVcgZ3JvdXAgZGV2aWNlIgotCQkJIiBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iLCByZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0JcmV0ID0gY2N3X2RldmljZV9zZXRfb25saW5lKGNnZGV2LT5jZGV2W1JFQURfQ0hBTk5FTF0pOwotCWlmIChyZXQgIT0gMCkgewotCQlkZXZfd2FybigmY2dkZXYtPmRldiwKLQkJCSJTZXR0aW5nIHRoZSByZWFkIHN1YmNoYW5uZWwgb25saW5lIgotCQkJIiBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iLCByZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0JcmV0ID0gY2N3X2RldmljZV9zZXRfb25saW5lKGNnZGV2LT5jZGV2W1dSSVRFX0NIQU5ORUxdKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZGV2X3dhcm4oJmNnZGV2LT5kZXYsCi0JCQkiU2V0dGluZyB0aGUgd3JpdGUgc3ViY2hhbm5lbCBvbmxpbmUgIgotCQkJImZhaWxlZCB3aXRoIGVycm9yIGNvZGUgJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQlkZXYgPSBhbGxvY19uZXRkZXYoMCwgImNsYXclZCIsIE5FVF9OQU1FX1VOS05PV04sIGNsYXdfaW5pdF9uZXRkZXZpY2UpOwotCWlmICghZGV2KSB7Ci0JCWRldl93YXJuKCZjZ2Rldi0+ZGV2LAotCQkJIkFjdGl2YXRpbmcgdGhlIENMQVcgZGV2aWNlIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQlkZXYtPm1sX3ByaXYgPSBwcml2cHRyOwotCWRldl9zZXRfZHJ2ZGF0YSgmY2dkZXYtPmRldiwgcHJpdnB0cik7Ci0JZGV2X3NldF9kcnZkYXRhKCZjZ2Rldi0+Y2RldltSRUFEX0NIQU5ORUxdLT5kZXYsIHByaXZwdHIpOwotCWRldl9zZXRfZHJ2ZGF0YSgmY2dkZXYtPmNkZXZbV1JJVEVfQ0hBTk5FTF0tPmRldiwgcHJpdnB0cik7Ci0JLyogc3lzZnMgbWFnaWMgKi8KLSAgICAgICAgU0VUX05FVERFVl9ERVYoZGV2LCAmY2dkZXYtPmRldik7Ci0JaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpICE9IDApIHsKLQkJY2xhd19mcmVlX25ldGRldmljZShkZXYsIDEpOwotCQlDTEFXX0RCRl9URVhUKDIsIHRyYWNlLCAicmVnZmFpbCIpOwotCQlnb3RvIG91dDsKLQl9Ci0JZGV2LT5mbGFncyAmPX5JRkZfUlVOTklORzsKLQlpZiAocHJpdnB0ci0+YnVmZnNfYWxsb2MgPT0gMCkgewotCSAgICAgICAgcmV0PWluaXRfY2N3X2JrKGRldik7Ci0JCWlmIChyZXQgIT0wKSB7Ci0JCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCQkJY2xhd19mcmVlX25ldGRldmljZShkZXYsMSk7Ci0JCQlDTEFXX0RCRl9URVhUKDIsIHRyYWNlLCAiY2N3bWVtIik7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQlwcml2cHRyLT5jaGFubmVsW1JFQURfQ0hBTk5FTF0ubmRldiA9IGRldjsKLQlwcml2cHRyLT5jaGFubmVsW1dSSVRFX0NIQU5ORUxdLm5kZXYgPSBkZXY7Ci0JcHJpdnB0ci0+cF9lbnYtPm5kZXYgPSBkZXY7Ci0KLQlkZXZfaW5mbygmY2dkZXYtPmRldiwgIiVzOnJlYWRzaXplPSVkICB3cml0ZXNpemU9JWQgIgotCQkicmVhZGJ1ZmZlcj0lZCB3cml0ZWJ1ZmZlcj0lZCByZWFkPTB4JTA0eCB3cml0ZT0weCUwNHhcbiIsCi0gICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBwX2Vudi0+cmVhZF9zaXplLAotCQlwX2Vudi0+d3JpdGVfc2l6ZSwgcF9lbnYtPnJlYWRfYnVmZmVycywKLQkJcF9lbnYtPndyaXRlX2J1ZmZlcnMsIHBfZW52LT5kZXZub1tSRUFEX0NIQU5ORUxdLAotCQlwX2Vudi0+ZGV2bm9bV1JJVEVfQ0hBTk5FTF0pOwotCWRldl9pbmZvKCZjZ2Rldi0+ZGV2LCAiJXM6aG9zdF9uYW1lOiUuOHMsIGFkYXB0ZXJfbmFtZSAiCi0JCSI6JS44cyBhcGlfdHlwZTogJS44c1xuIiwKLSAgICAgICAgICAgICAgICBkZXYtPm5hbWUsIHBfZW52LT5ob3N0X25hbWUsCi0JCXBfZW52LT5hZGFwdGVyX25hbWUgLCBwX2Vudi0+YXBpX3R5cGUpOwotCXJldHVybiAwOwotb3V0OgotCWNjd19kZXZpY2Vfc2V0X29mZmxpbmUoY2dkZXYtPmNkZXZbMV0pOwotCWNjd19kZXZpY2Vfc2V0X29mZmxpbmUoY2dkZXYtPmNkZXZbMF0pOwotCXJldHVybiAtRU5PREVWOwotfQotCi1zdGF0aWMgdm9pZAotY2xhd19wdXJnZV9za2JfcXVldWUoc3RydWN0IHNrX2J1ZmZfaGVhZCAqcSkKLXsKLSAgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCUNMQVdfREJGX1RFWFQoNCwgdHJhY2UsICJwdXJncXVlIik7Ci0gICAgICAgIHdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUocSkpKSB7Ci0gICAgICAgICAgICAgICAgYXRvbWljX2RlYygmc2tiLT51c2Vycyk7Ci0gICAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLSAgICAgICAgfQotfQotCi0vKioKLSAqIFNodXRkb3duIGFuIGludGVyZmFjZS4KLSAqCi0gKiBAcGFyYW0gY2dkZXYgIERldmljZSB0byBiZSBzaHV0IGRvd24uCi0gKgotICogQHJldHVybnMgMCBvbiBzdWNjZXNzLCAhMCBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50Ci1jbGF3X3NodXRkb3duX2RldmljZShzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpjZ2RldikKLXsKLQlzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7Ci0JaW50IHJldCA9IDA7Ci0KLQlDTEFXX0RCRl9URVhUXygyLCBzZXR1cCwgIiVzIiwgZGV2X25hbWUoJmNnZGV2LT5kZXYpKTsKLQlwcml2ID0gZGV2X2dldF9kcnZkYXRhKCZjZ2Rldi0+ZGV2KTsKLQlpZiAoIXByaXYpCi0JCXJldHVybiAtRU5PREVWOwotCW5kZXYgPSBwcml2LT5jaGFubmVsW1JFQURfQ0hBTk5FTF0ubmRldjsKLQlpZiAobmRldikgewotCQkvKiBDbG9zZSB0aGUgZGV2aWNlICovCi0JCWRldl9pbmZvKCZjZ2Rldi0+ZGV2LCAiJXM6IHNodXR0aW5nIGRvd25cbiIsCi0JCQluZGV2LT5uYW1lKTsKLQkJaWYgKG5kZXYtPmZsYWdzICYgSUZGX1JVTk5JTkcpCi0JCQlyZXQgPSBjbGF3X3JlbGVhc2UobmRldik7Ci0JCW5kZXYtPmZsYWdzICY9fklGRl9SVU5OSU5HOwotCQl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKLQkJbmRldi0+bWxfcHJpdiA9IE5VTEw7ICAvKiBjZ2RldiBkYXRhLCBub3QgbmRldidzIHRvIGZyZWUgKi8KLQkJY2xhd19mcmVlX25ldGRldmljZShuZGV2LCAxKTsKLQkJcHJpdi0+Y2hhbm5lbFtSRUFEX0NIQU5ORUxdLm5kZXYgPSBOVUxMOwotCQlwcml2LT5jaGFubmVsW1dSSVRFX0NIQU5ORUxdLm5kZXYgPSBOVUxMOwotCQlwcml2LT5wX2Vudi0+bmRldiA9IE5VTEw7Ci0JfQotCWNjd19kZXZpY2Vfc2V0X29mZmxpbmUoY2dkZXYtPmNkZXZbMV0pOwotCWNjd19kZXZpY2Vfc2V0X29mZmxpbmUoY2dkZXYtPmNkZXZbMF0pOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkCi1jbGF3X3JlbW92ZV9kZXZpY2Uoc3RydWN0IGNjd2dyb3VwX2RldmljZSAqY2dkZXYpCi17Ci0Jc3RydWN0IGNsYXdfcHJpdmJrICpwcml2OwotCi0JQ0xBV19EQkZfVEVYVF8oMiwgc2V0dXAsICIlcyIsIGRldl9uYW1lKCZjZ2Rldi0+ZGV2KSk7Ci0JcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YSgmY2dkZXYtPmRldik7Ci0JZGV2X2luZm8oJmNnZGV2LT5kZXYsICIgd2lsbCBiZSByZW1vdmVkLlxuIik7Ci0JaWYgKGNnZGV2LT5zdGF0ZSA9PSBDQ1dHUk9VUF9PTkxJTkUpCi0JCWNsYXdfc2h1dGRvd25fZGV2aWNlKGNnZGV2KTsKLQlrZnJlZShwcml2LT5wX210Y19lbnZlbG9wZSk7Ci0JcHJpdi0+cF9tdGNfZW52ZWxvcGU9TlVMTDsKLQlrZnJlZShwcml2LT5wX2Vudik7Ci0JcHJpdi0+cF9lbnY9TlVMTDsKLQlrZnJlZShwcml2LT5jaGFubmVsWzBdLmlyYik7Ci0JcHJpdi0+Y2hhbm5lbFswXS5pcmI9TlVMTDsKLQlrZnJlZShwcml2LT5jaGFubmVsWzFdLmlyYik7Ci0JcHJpdi0+Y2hhbm5lbFsxXS5pcmI9TlVMTDsKLQlrZnJlZShwcml2KTsKLQlkZXZfc2V0X2RydmRhdGEoJmNnZGV2LT5kZXYsIE5VTEwpOwotCWRldl9zZXRfZHJ2ZGF0YSgmY2dkZXYtPmNkZXZbUkVBRF9DSEFOTkVMXS0+ZGV2LCBOVUxMKTsKLQlkZXZfc2V0X2RydmRhdGEoJmNnZGV2LT5jZGV2W1dSSVRFX0NIQU5ORUxdLT5kZXYsIE5VTEwpOwotCXB1dF9kZXZpY2UoJmNnZGV2LT5kZXYpOwotCi0JcmV0dXJuOwotfQotCi0KLS8qCi0gKiBzeXNmcyBhdHRyaWJ1dGVzCi0gKi8KLXN0YXRpYyBzc2l6ZV90Ci1jbGF3X2huYW1lX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdjsKLQlzdHJ1Y3QgY2xhd19lbnYgKiAgcF9lbnY7Ci0KLQlwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQlwX2VudiA9IHByaXYtPnBfZW52OwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLHBfZW52LT5ob3N0X25hbWUpOwotfQotCi1zdGF0aWMgc3NpemVfdAotY2xhd19obmFtZV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXY7Ci0Jc3RydWN0IGNsYXdfZW52ICogIHBfZW52OwotCi0JcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWlmICghcHJpdikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcF9lbnYgPSBwcml2LT5wX2VudjsKLQlpZiAoY291bnQgPiBNQVhfTkFNRV9MRU4rMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbWVtc2V0KHBfZW52LT5ob3N0X25hbWUsIDB4MjAsIE1BWF9OQU1FX0xFTik7Ci0Jc3RybmNweShwX2Vudi0+aG9zdF9uYW1lLGJ1ZiwgY291bnQpOwotCXBfZW52LT5ob3N0X25hbWVbY291bnQtMV0gPSAweDIwOyAgLyogY2xlYXIgZXh0cmEgMHgwYSAqLwotCXBfZW52LT5ob3N0X25hbWVbTUFYX05BTUVfTEVOXSA9IDB4MDA7Ci0JQ0xBV19EQkZfVEVYVCgyLCBzZXR1cCwgIkhzdG5TZXQiKTsKLQlDTEFXX0RCRl9URVhUXygyLCBzZXR1cCwgIiVzIiwgcF9lbnYtPmhvc3RfbmFtZSk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihob3N0X25hbWUsIDA2NDQsIGNsYXdfaG5hbWVfc2hvdywgY2xhd19obmFtZV93cml0ZSk7Ci0KLXN0YXRpYyBzc2l6ZV90Ci1jbGF3X2FkbmFtZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXY7Ci0Jc3RydWN0IGNsYXdfZW52ICogIHBfZW52OwotCi0JcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWlmICghcHJpdikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcF9lbnYgPSBwcml2LT5wX2VudjsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgcF9lbnYtPmFkYXB0ZXJfbmFtZSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1jbGF3X2FkbmFtZV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXY7Ci0Jc3RydWN0IGNsYXdfZW52ICogIHBfZW52OwotCi0JcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWlmICghcHJpdikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcF9lbnYgPSBwcml2LT5wX2VudjsKLQlpZiAoY291bnQgPiBNQVhfTkFNRV9MRU4rMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbWVtc2V0KHBfZW52LT5hZGFwdGVyX25hbWUsIDB4MjAsIE1BWF9OQU1FX0xFTik7Ci0Jc3RybmNweShwX2Vudi0+YWRhcHRlcl9uYW1lLGJ1ZiwgY291bnQpOwotCXBfZW52LT5hZGFwdGVyX25hbWVbY291bnQtMV0gPSAweDIwOyAvKiBjbGVhciBleHRyYSAweDBhICovCi0JcF9lbnYtPmFkYXB0ZXJfbmFtZVtNQVhfTkFNRV9MRU5dID0gMHgwMDsKLQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAiQWRuU2V0Iik7Ci0JQ0xBV19EQkZfVEVYVF8oMiwgc2V0dXAsICIlcyIsIHBfZW52LT5hZGFwdGVyX25hbWUpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoYWRhcHRlcl9uYW1lLCAwNjQ0LCBjbGF3X2FkbmFtZV9zaG93LCBjbGF3X2FkbmFtZV93cml0ZSk7Ci0KLXN0YXRpYyBzc2l6ZV90Ci1jbGF3X2FwbmFtZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXY7Ci0Jc3RydWN0IGNsYXdfZW52ICogIHBfZW52OwotCi0JcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWlmICghcHJpdikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcF9lbnYgPSBwcml2LT5wX2VudjsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwKLQkJICAgICAgIHBfZW52LT5hcGlfdHlwZSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1jbGF3X2FwbmFtZV93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdjsKLQlzdHJ1Y3QgY2xhd19lbnYgKiAgcF9lbnY7Ci0KLQlwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQlwX2VudiA9IHByaXYtPnBfZW52OwotCWlmIChjb3VudCA+IE1BWF9OQU1FX0xFTisxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQltZW1zZXQocF9lbnYtPmFwaV90eXBlLCAweDIwLCBNQVhfTkFNRV9MRU4pOwotCXN0cm5jcHkocF9lbnYtPmFwaV90eXBlLGJ1ZiwgY291bnQpOwotCXBfZW52LT5hcGlfdHlwZVtjb3VudC0xXSA9IDB4MjA7ICAvKiB3ZSBnZXQgYSBsb29zZSAweDBhICovCi0JcF9lbnYtPmFwaV90eXBlW01BWF9OQU1FX0xFTl0gPSAweDAwOwotCWlmKHN0cm5jbXAocF9lbnYtPmFwaV90eXBlLFdTX0FQUExfTkFNRV9QQUNLRUQsNikgPT0gMCkgewotCQlwX2Vudi0+cmVhZF9zaXplPURFRl9QQUNLX0JVRlNJWkU7Ci0JCXBfZW52LT53cml0ZV9zaXplPURFRl9QQUNLX0JVRlNJWkU7Ci0JCXBfZW52LT5wYWNraW5nPVBBQ0tJTkdfQVNLOwotCQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAiUEFDS0lORyIpOwotCX0KLQllbHNlIHsKLQkJcF9lbnYtPnBhY2tpbmc9MDsKLQkJcF9lbnYtPnJlYWRfc2l6ZT1DTEFXX0ZSQU1FX1NJWkU7Ci0JCXBfZW52LT53cml0ZV9zaXplPUNMQVdfRlJBTUVfU0laRTsKLQkJQ0xBV19EQkZfVEVYVCgyLCBzZXR1cCwgIkFwaVNldCIpOwotCX0KLQlDTEFXX0RCRl9URVhUXygyLCBzZXR1cCwgIiVzIiwgcF9lbnYtPmFwaV90eXBlKTsKLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUihhcGlfdHlwZSwgMDY0NCwgY2xhd19hcG5hbWVfc2hvdywgY2xhd19hcG5hbWVfd3JpdGUpOwotCi1zdGF0aWMgc3NpemVfdAotY2xhd193YnVmZl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2xhd19wcml2YmsgKnByaXY7Ci0Jc3RydWN0IGNsYXdfZW52ICogcF9lbnY7Ci0KLQlwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0JaWYgKCFwcml2KQotCQlyZXR1cm4gLUVOT0RFVjsKLQlwX2VudiA9IHByaXYtPnBfZW52OwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwX2Vudi0+d3JpdGVfYnVmZmVycyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1jbGF3X3didWZmX3dyaXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGNsYXdfcHJpdmJrICpwcml2OwotCXN0cnVjdCBjbGF3X2VudiAqICBwX2VudjsKLQlpbnQgbm5uLG1heDsKLQotCXByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpZiAoIXByaXYpCi0JCXJldHVybiAtRU5PREVWOwotCXBfZW52ID0gcHJpdi0+cF9lbnY7Ci0Jc3NjYW5mKGJ1ZiwgIiVpIiwgJm5ubik7Ci0JaWYgKHBfZW52LT5wYWNraW5nKSB7Ci0JCW1heCA9IDY0OwotCX0KLQllbHNlIHsKLQkJbWF4ID0gNTEyOwotCX0KLQlpZiAoKG5ubiA+IG1heCApIHx8IChubm4gPCAyKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcF9lbnYtPndyaXRlX2J1ZmZlcnMgPSBubm47Ci0JQ0xBV19EQkZfVEVYVCgyLCBzZXR1cCwgIldidWZzZXQiKTsKLQlDTEFXX0RCRl9URVhUXygyLCBzZXR1cCwgIldCPSVkIiwgcF9lbnYtPndyaXRlX2J1ZmZlcnMpOwotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHdyaXRlX2J1ZmZlciwgMDY0NCwgY2xhd193YnVmZl9zaG93LCBjbGF3X3didWZmX3dyaXRlKTsKLQotc3RhdGljIHNzaXplX3QKLWNsYXdfcmJ1ZmZfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGNsYXdfcHJpdmJrICpwcml2OwotCXN0cnVjdCBjbGF3X2VudiAqICBwX2VudjsKLQotCXByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpZiAoIXByaXYpCi0JCXJldHVybiAtRU5PREVWOwotCXBfZW52ID0gcHJpdi0+cF9lbnY7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHBfZW52LT5yZWFkX2J1ZmZlcnMpOwotfQotCi1zdGF0aWMgc3NpemVfdAotY2xhd19yYnVmZl93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdjsKLQlzdHJ1Y3QgY2xhd19lbnYgKnBfZW52OwotCWludCBubm4sbWF4OwotCi0JcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWlmICghcHJpdikKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JcF9lbnYgPSBwcml2LT5wX2VudjsKLQlzc2NhbmYoYnVmLCAiJWkiLCAmbm5uKTsKLQlpZiAocF9lbnYtPnBhY2tpbmcpIHsKLQkJbWF4ID0gNjQ7Ci0JfQotCWVsc2UgewotCQltYXggPSA1MTI7Ci0JfQotCWlmICgobm5uID4gbWF4ICkgfHwgKG5ubiA8IDIpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlwX2Vudi0+cmVhZF9idWZmZXJzID0gbm5uOwotCUNMQVdfREJGX1RFWFQoMiwgc2V0dXAsICJSYnVmc2V0Iik7Ci0JQ0xBV19EQkZfVEVYVF8oMiwgc2V0dXAsICJSQj0lZCIsIHBfZW52LT5yZWFkX2J1ZmZlcnMpOwotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUihyZWFkX2J1ZmZlciwgMDY0NCwgY2xhd19yYnVmZl9zaG93LCBjbGF3X3JidWZmX3dyaXRlKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmNsYXdfYXR0cltdID0gewotCSZkZXZfYXR0cl9yZWFkX2J1ZmZlci5hdHRyLAotCSZkZXZfYXR0cl93cml0ZV9idWZmZXIuYXR0ciwKLQkmZGV2X2F0dHJfYWRhcHRlcl9uYW1lLmF0dHIsCi0JJmRldl9hdHRyX2FwaV90eXBlLmF0dHIsCi0JJmRldl9hdHRyX2hvc3RfbmFtZS5hdHRyLAotCU5VTEwsCi19Owotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgY2xhd19hdHRyX2dyb3VwID0gewotCS5hdHRycyA9IGNsYXdfYXR0ciwKLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqY2xhd19hdHRyX2dyb3Vwc1tdID0gewotCSZjbGF3X2F0dHJfZ3JvdXAsCi0JTlVMTCwKLX07Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGRldmljZV90eXBlIGNsYXdfZGV2dHlwZSA9IHsKLQkubmFtZSA9ICJjbGF3IiwKLQkuZ3JvdXBzID0gY2xhd19hdHRyX2dyb3VwcywKLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSAqICAgY2xhd19wcm9iZSAJCQkJCQkgICoKLSAqCXRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBlYWNoIENMQVcgZGV2aWNlLgkJICAqCi0gKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGludCBjbGF3X3Byb2JlKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmNnZGV2KQotewotCXN0cnVjdCBjbGF3X3ByaXZiayAqcHJpdnB0ciA9IE5VTEw7Ci0KLQlDTEFXX0RCRl9URVhUKDIsIHNldHVwLCAicHJvYmUiKTsKLQlpZiAoIWdldF9kZXZpY2UoJmNnZGV2LT5kZXYpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlwcml2cHRyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNsYXdfcHJpdmJrKSwgR0ZQX0tFUk5FTCk7Ci0JZGV2X3NldF9kcnZkYXRhKCZjZ2Rldi0+ZGV2LCBwcml2cHRyKTsKLQlpZiAocHJpdnB0ciA9PSBOVUxMKSB7Ci0JCXByb2JlX2Vycm9yKGNnZGV2KTsKLQkJcHV0X2RldmljZSgmY2dkZXYtPmRldik7Ci0JCUNMQVdfREJGX1RFWFRfKDIsIHNldHVwLCAicHJvYmV4JWQiLCAtRU5PTUVNKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCXByaXZwdHItPnBfbXRjX2VudmVsb3BlID0ga3phbGxvYyhNQVhfRU5WRUxPUEVfU0laRSwgR0ZQX0tFUk5FTCk7Ci0JcHJpdnB0ci0+cF9lbnYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2xhd19lbnYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoKHByaXZwdHItPnBfbXRjX2VudmVsb3BlID09IE5VTEwpIHx8IChwcml2cHRyLT5wX2VudiA9PSBOVUxMKSkgewotCQlwcm9iZV9lcnJvcihjZ2Rldik7Ci0JCXB1dF9kZXZpY2UoJmNnZGV2LT5kZXYpOwotCQlDTEFXX0RCRl9URVhUXygyLCBzZXR1cCwgInByb2JleCVkIiwgLUVOT01FTSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQltZW1jcHkocHJpdnB0ci0+cF9lbnYtPmFkYXB0ZXJfbmFtZSwgV1NfTkFNRV9OT1RfREVGLCA4KTsKLQltZW1jcHkocHJpdnB0ci0+cF9lbnYtPmhvc3RfbmFtZSwgV1NfTkFNRV9OT1RfREVGLCA4KTsKLQltZW1jcHkocHJpdnB0ci0+cF9lbnYtPmFwaV90eXBlLCBXU19OQU1FX05PVF9ERUYsIDgpOwotCXByaXZwdHItPnBfZW52LT5wYWNraW5nID0gMDsKLQlwcml2cHRyLT5wX2Vudi0+d3JpdGVfYnVmZmVycyA9IDU7Ci0JcHJpdnB0ci0+cF9lbnYtPnJlYWRfYnVmZmVycyA9IDU7Ci0JcHJpdnB0ci0+cF9lbnYtPnJlYWRfc2l6ZSA9IENMQVdfRlJBTUVfU0laRTsKLQlwcml2cHRyLT5wX2Vudi0+d3JpdGVfc2l6ZSA9IENMQVdfRlJBTUVfU0laRTsKLQlwcml2cHRyLT5wX2Vudi0+cF9wcml2ID0gcHJpdnB0cjsKLQljZ2Rldi0+Y2RldlswXS0+aGFuZGxlciA9IGNsYXdfaXJxX2hhbmRsZXI7Ci0JY2dkZXYtPmNkZXZbMV0tPmhhbmRsZXIgPSBjbGF3X2lycV9oYW5kbGVyOwotCWNnZGV2LT5kZXYudHlwZSA9ICZjbGF3X2RldnR5cGU7Ci0JQ0xBV19EQkZfVEVYVCgyLCBzZXR1cCwgInByYmV4dCAwIik7Ci0KLQlyZXR1cm4gMDsKLX0gIC8qICBlbmQgb2YgY2xhd19wcm9iZSAgICAgICAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICBjbGF3X2luaXQgIGFuZCBjbGVhbnVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2xhd19jbGVhbnVwKHZvaWQpCi17Ci0JY2N3Z3JvdXBfZHJpdmVyX3VucmVnaXN0ZXIoJmNsYXdfZ3JvdXBfZHJpdmVyKTsKLQljY3dfZHJpdmVyX3VucmVnaXN0ZXIoJmNsYXdfY2N3X2RyaXZlcik7Ci0Jcm9vdF9kZXZpY2VfdW5yZWdpc3RlcihjbGF3X3Jvb3RfZGV2KTsKLQljbGF3X3VucmVnaXN0ZXJfZGVidWdfZmFjaWxpdHkoKTsKLQlwcl9pbmZvKCJEcml2ZXIgdW5sb2FkZWRcbiIpOwotfQotCi0vKioKLSAqIEluaXRpYWxpemUgbW9kdWxlLgotICogVGhpcyBpcyBjYWxsZWQganVzdCBhZnRlciB0aGUgbW9kdWxlIGlzIGxvYWRlZC4KLSAqCi0gKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgITAgb24gZXJyb3IuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IGNsYXdfaW5pdCh2b2lkKQotewotCWludCByZXQgPSAwOwotCi0JcHJfaW5mbygiTG9hZGluZyAlc1xuIiwgdmVyc2lvbik7Ci0JcmV0ID0gY2xhd19yZWdpc3Rlcl9kZWJ1Z19mYWNpbGl0eSgpOwotCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJSZWdpc3RlcmluZyB3aXRoIHRoZSBTLzM5MCBkZWJ1ZyBmZWF0dXJlIgotCQkJIiBmYWlsZWQgd2l0aCBlcnJvciBjb2RlICVkXG4iLCByZXQpOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCUNMQVdfREJGX1RFWFQoMiwgc2V0dXAsICJpbml0X21vZCIpOwotCWNsYXdfcm9vdF9kZXYgPSByb290X2RldmljZV9yZWdpc3RlcigiY2xhdyIpOwotCXJldCA9IFBUUl9FUlJfT1JfWkVSTyhjbGF3X3Jvb3RfZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIHJlZ2lzdGVyX2VycjsKLQlyZXQgPSBjY3dfZHJpdmVyX3JlZ2lzdGVyKCZjbGF3X2Njd19kcml2ZXIpOwotCWlmIChyZXQpCi0JCWdvdG8gY2N3X2VycjsKLQljbGF3X2dyb3VwX2RyaXZlci5kcml2ZXIuZ3JvdXBzID0gY2xhd19kcnZfYXR0cl9ncm91cHM7Ci0JcmV0ID0gY2N3Z3JvdXBfZHJpdmVyX3JlZ2lzdGVyKCZjbGF3X2dyb3VwX2RyaXZlcik7Ci0JaWYgKHJldCkKLQkJZ290byBjY3dncm91cF9lcnI7Ci0JcmV0dXJuIDA7Ci0KLWNjd2dyb3VwX2VycjoKLQljY3dfZHJpdmVyX3VucmVnaXN0ZXIoJmNsYXdfY2N3X2RyaXZlcik7Ci1jY3dfZXJyOgotCXJvb3RfZGV2aWNlX3VucmVnaXN0ZXIoY2xhd19yb290X2Rldik7Ci1yZWdpc3Rlcl9lcnI6Ci0JQ0xBV19EQkZfVEVYVCgyLCBzZXR1cCwgImluaXRfYmFkIik7Ci0JY2xhd191bnJlZ2lzdGVyX2RlYnVnX2ZhY2lsaXR5KCk7Ci1vdXRfZXJyOgotCXByX2VycigiSW5pdGlhbGl6aW5nIHRoZSBjbGF3IGRldmljZSBkcml2ZXIgZmFpbGVkXG4iKTsKLQlyZXR1cm4gcmV0OwotfQotCi1tb2R1bGVfaW5pdChjbGF3X2luaXQpOwotbW9kdWxlX2V4aXQoY2xhd19jbGVhbnVwKTsKLQotTU9EVUxFX0FVVEhPUigiQW5keSBSaWNodGVyIDxyaWNodGVyYUB1cy5pYm0uY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJMaW51eCBmb3IgU3lzdGVtIHogQ0xBVyBEcml2ZXJcbiIgXAotCQkJIkNvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwOFxuIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvbmV0L2NsYXcuaCBiL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzM5YjliLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY2xhdy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBEZWZpbmUgY29uc3RhbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgQ0NXIGNvbW1hbmQgY29kZXMgZm9yIENMQVcgcHJvdG9jb2wgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIENDV19DTEFXX0NNRF9XUklURSAgICAgICAgICAgMHgwMSAgICAgIC8qIHdyaXRlIC0gbm90IGluY2x1ZGluZyBsaW5rICovCi0jZGVmaW5lIENDV19DTEFXX0NNRF9SRUFEICAgICAgICAgICAgMHgwMiAgICAgIC8qIHJlYWQgKi8KLSNkZWZpbmUgQ0NXX0NMQVdfQ01EX05PUCAgICAgICAgICAgICAweDAzICAgICAgLyogTk9QICovCi0jZGVmaW5lIENDV19DTEFXX0NNRF9TRU5TRSAgICAgICAgICAgMHgwNCAgICAgIC8qIFNlbnNlICovCi0jZGVmaW5lIENDV19DTEFXX0NNRF9TSUdOQUxfU01PRCAgICAgMHgwNSAgICAgIC8qIFNpZ25hbCBTdGF0dXMgTW9kaWZpZXIgKi8KLSNkZWZpbmUgQ0NXX0NMQVdfQ01EX1RJQyAgICAgICAgICAgICAweDA4ICAgICAgLyogVElDICovCi0jZGVmaW5lIENDV19DTEFXX0NNRF9SRUFESEVBREVSICAgICAgMHgxMiAgICAgIC8qIHJlYWQgaGVhZGVyIGRhdGEgKi8KLSNkZWZpbmUgQ0NXX0NMQVdfQ01EX1JFQURGRiAgICAgICAgICAweDIyICAgICAgLyogcmVhZCBhbiBGRiAqLwotI2RlZmluZSBDQ1dfQ0xBV19DTURfU0VOU0VJRCAgICAgICAgIDB4ZTQgICAgICAvKiBTZW5zZSBJRCAqLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0qICAgIENMQVcgVW5pcXVlIGNvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgTU9SRV90b19DT01FX0ZMQUcgICAgICAgMHgwNCAgIC8qIE9SIHdpdGggd3JpdGUgQ0NXIGluIGNhc2Ugb2YgbS10LWMgKi8KLSNkZWZpbmUgQ0xBV19JRExFICAgICAgICAgICAgICAgMHgwMCAgIC8qIGZsYWcgdG8gaW5kaWNhdGUgQ0xBVyBpcyBpZGxlICovCi0jZGVmaW5lIENMQVdfQlVTWSAgICAgICAgICAgICAgIDB4ZmYgICAvKiBmbGFnIHRvIGluZGljYXRlIENMQVcgaXMgYnVzeSAqLwotI2RlZmluZSBDTEFXX1BFTkRJTkcgICAgICAgICAgICAweDAwICAgLyogZmxhZyB0byBpbmRpY2F0ZSBpL28gaXMgcGVuZGluZyAqLwotI2RlZmluZSBDTEFXX0NPTVBMRVRFICAgICAgICAgICAweGZmICAgLyogZmxhZyB0byBpbmRpY2F0ZSBpL28gY29tcGxldGVkICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0qICAgICBDTEFXIGNvbnRyb2wgY29tbWFuZCBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgU1lTVEVNX1ZBTElEQVRFX1JFUVVFU1QgICAweDAxICAvKiBTeXN0ZW0gVmFsaWRhdGUgcmVxdWVzdCAqLwotI2RlZmluZSBTWVNURU1fVkFMSURBVEVfUkVTUE9OU0UgIDB4MDIgIC8qIFN5c3RlbSBWYWxpZGF0ZSByZXNwb25zZSAqLwotI2RlZmluZSBDT05ORUNUSU9OX1JFUVVFU1QgICAgICAgIDB4MjEgIC8qIENvbm5lY3Rpb24gcmVxdWVzdCAqLwotI2RlZmluZSBDT05ORUNUSU9OX1JFU1BPTlNFICAgICAgIDB4MjIgIC8qIENvbm5lY3Rpb24gcmVzcG9uc2UgKi8KLSNkZWZpbmUgQ09OTkVDVElPTl9DT05GSVJNICAgICAgICAweDIzICAvKiBDb25uZWN0aW9uIGNvbmZpcm0gKi8KLSNkZWZpbmUgRElTQ09OTkVDVCAgICAgICAgICAgICAgICAweDI0ICAvKiBEaXNjb25uZWN0ICovCi0jZGVmaW5lIENMQVdfRVJST1IgICAgICAgICAgICAgICAgMHg0MSAgLyogQ0xBVyBlcnJvciBtZXNzYWdlICovCi0jZGVmaW5lIENMQVdfVkVSU0lPTl9JRCAgICAgICAgICAgMiAgICAgLyogQ0xBVyB2ZXJzaW9uIElEICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0qICBDTEFXIGFkYXRlciBzZW5zZSBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgQ0xBV19BREFQVEVSX1NFTlNFX0JZVEUgMHg0MSAgIC8qIFN0b3AgY29tbWFuZCBpc3N1ZWQgdG8gYWRhcHRlciAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgIENMQVcgY29udHJvbCBjb21tYW5kIHJldHVybiBjb2RlcyAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jZGVmaW5lIENMQVdfUkNfTkFNRV9NSVNNQVRDSCAgICAgICAxNjYgIC8qICBuYW1lcyBkbyBub3QgbWF0Y2ggKi8KLSNkZWZpbmUgQ0xBV19SQ19XUk9OR19WRVJTSU9OICAgICAgIDE2NyAgLyogIHdyb25nIENMQVcgdmVyc2lvbiBudW1iZXIgKi8KLSNkZWZpbmUgQ0xBV19SQ19IT1NUX1JDVl9UT09fU01BTEwgIDE4MCAgLyogIEhvc3QgbWF4aW11bSByZWNlaXZlIGlzICAgKi8KLQkJCQkJIC8qICBsZXNzIHRoYW4gTGludXggb24gelNlcmllcyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICB0cmFuc21pdCBzaXplICAgICAgICAgICAgICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0qICAgICAgQ0xBVyBDb25zdGFudHMgYXBwbGljYXRpb24gbmFtZSAgICAgICAgICAgICAgICAgKgotKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNkZWZpbmUgSE9TVF9BUFBMX05BTUUgICAgICAgICAgIlRDUElQICAgIgotI2RlZmluZSBXU19BUFBMX05BTUVfSVBfTElOSyAgICAiVENQSVAgICAiCi0jZGVmaW5lIFdTX0FQUExfTkFNRV9JUF9OQU1FCSJJUCAgICAgICIKLSNkZWZpbmUgV1NfQVBQTF9OQU1FX0FQSV9MSU5LICAgIkFQSSAgICAgIgotI2RlZmluZSBXU19BUFBMX05BTUVfUEFDS0VEICAgICAiUEFDS0VEICAiCi0jZGVmaW5lIFdTX05BTUVfTk9UX0RFRiAgICAgICAgICJOT1RfREVGICIKLSNkZWZpbmUgUEFDS0lOR19BU0sJCTEKLSNkZWZpbmUgUEFDS19TRU5ECQkyCi0jZGVmaW5lIERPX1BBQ0tFRAkJMwotCi0jZGVmaW5lIE1BWF9FTlZFTE9QRV9TSVpFICAgICAgIDY1NTM2Ci0jZGVmaW5lIENMQVdfREVGQVVMVF9NVFVfU0laRSAgIDQwOTYKLSNkZWZpbmUgREVGX1BBQ0tfQlVGU0laRQkzMjc2OAotI2RlZmluZSBSRUFEX0NIQU5ORUwJCTAKLSNkZWZpbmUgV1JJVEVfQ0hBTk5FTAkJMQotCi0jZGVmaW5lIFRCX1RYICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgLyogc2sgYnVmZmVyIGhhbmRsaW5nIGluIHByb2Nlc3MgICovCi0jZGVmaW5lIFRCX1NUT1AgICAgICAgICAgICAgICAgIDEgICAgICAgICAgLyogbmV0d29yayBkZXZpY2Ugc3RvcCBpbiBwcm9jZXNzICovCi0jZGVmaW5lIFRCX1JFVFJZICAgICAgICAgICAgICAgIDIgICAgICAgICAgLyogcmV0cnkgaW4gcHJvY2VzcyAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRCX05PQlVGRkVSICAgICAgICAgICAgIDMgICAgICAgICAgLyogbm8gYnVmZmVyIG9uIGZyZWUgcXVldWUgICAgICAgICovCi0jZGVmaW5lIENMQVdfTUFYX0xJTktfSUQgICAgICAgIDEKLSNkZWZpbmUgQ0xBV19NQVhfREVWICAgICAgICAgICAgMjU2ICAgICAgICAvKiAgICAgIG1heCBjbGF3IGRldmljZXMgICAgICAgICAgKi8KLSNkZWZpbmUgTUFYX05BTUVfTEVOICAgICAgICAgICAgOCAgICAgICAgICAvKiBob3N0IG5hbWUsIGFkYXB0ZXIgbmFtZSBsZW5ndGggKi8KLSNkZWZpbmUgQ0xBV19GUkFNRV9TSVpFICAgICAgICAgNDA5NgotI2RlZmluZSBDTEFXX0lEX1NJWkUJCTIwKzMKLQotLyogc3RhdGUgbWFjaGluZSBjb2RlcyB1c2VkIGluIGNsYXdfaXJxX2hhbmRsZXIgKi8KLQotI2RlZmluZSBDTEFXX1NUT1AgICAgICAgICAgICAgICAgMAotI2RlZmluZSBDTEFXX1NUQVJUX0hBTFRfSU8gICAgICAgMQotI2RlZmluZSBDTEFXX1NUQVJUX1NFTlNFSUQgICAgICAgMgotI2RlZmluZSBDTEFXX1NUQVJUX1JFQUQgICAgICAgICAgMwotI2RlZmluZSBDTEFXX1NUQVJUX1dSSVRFICAgICAgICAgNAotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICBMb2NrIGZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBMT0NLX1lFUyAgICAgICAgICAgICAwCi0jZGVmaW5lIExPQ0tfTk8gICAgICAgICAgICAgIDEKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKLSogICAgREJGIERlYnVnIG1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgQ0xBV19EQkZfVEVYVChsZXZlbCwgbmFtZSwgdGV4dCkgXAotCWRvIHsgXAotCQlkZWJ1Z190ZXh0X2V2ZW50KGNsYXdfZGJmXyMjbmFtZSwgbGV2ZWwsIHRleHQpOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDTEFXX0RCRl9IRVgobGV2ZWwsbmFtZSxhZGRyLGxlbikgXAotZG8geyBcCi0JZGVidWdfZXZlbnQoY2xhd19kYmZfIyNuYW1lLGxldmVsLCh2b2lkKikoYWRkciksbGVuKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDTEFXX0RCRl9URVhUXyhsZXZlbCxuYW1lLHRleHQuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGRlYnVnX2xldmVsX2VuYWJsZWQoY2xhd19kYmZfIyNuYW1lLCBsZXZlbCkpIHsgXAotCQkJc3ByaW50ZihkZWJ1Z19idWZmZXIsIHRleHQpOyBcCi0JCQlkZWJ1Z190ZXh0X2V2ZW50KGNsYXdfZGJmXyMjbmFtZSwgbGV2ZWwsIFwKLQkJCQkJCWRlYnVnX2J1ZmZlcik7IFwKLQkJfSBcCi0JfSB3aGlsZSAoMCkKLQotLyoqCi0gKiBFbnVtIGZvciBjbGFzc2lmeWluZyBkZXRlY3RlZCBkZXZpY2VzLgotICovCi1lbnVtIGNsYXdfY2hhbm5lbF90eXBlcyB7Ci0JLyogRGV2aWNlIGlzIG5vdCBhIGNoYW5uZWwgICovCi0JY2xhd19jaGFubmVsX3R5cGVfbm9uZSwKLQotCS8qIERldmljZSBpcyBhIENMQVcgY2hhbm5lbCBkZXZpY2UgKi8KLQljbGF3X2NoYW5uZWxfdHlwZV9jbGF3Ci19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBEZWZpbmUgQ29udHJvbCBCbG9ja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgICAgQ0xBVyBoZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0cnVjdCBjbGF3aCB7Ci0gICAgICAgIF9fdTE2ICBsZW5ndGg7ICAgICAvKiBsZW5ndGggb2YgZGF0YSByZWFkIGJ5IHByZWNlZGluZyByZWFkIENDVyAqLwotICAgICAgICBfX3U4ICAgb3Bjb2RlOyAgICAgLyogZXF1aXZhbGVudCByZWFkIENDVyAqLwotICAgICAgICBfX3U4ICAgZmxhZzsgICAgICAgLyogZmxhZyBvZiBGRiB0byBpbmRpY2F0ZSByZWFkIHdhcyBjb21wbGV0ZWQgKi8KLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICBDTEFXIFBhY2tpbmcgaGVhZGVyICAgNCBieXRlcyAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0cnVjdCBjbGF3cGggewotICAgICAgIF9fdTE2IGxlbjsgIAkvKiBMZW5ndGggb2YgUGFja2VkIERhdGEgQXJlYSAgICovCi0gICAgICAgX191OCAgZmxhZzsgIAkvKiBSZXNlcnZlZCBub3QgdXNlZCAgICAgICAgICAgICovCi0gICAgICAgX191OCAgbGlua19udW07CS8qIExpbmsgSUQgICAgICAgICAgICAgICAgICAgICAgKi8KLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICBDTEFXIEVuZGluZyBzdHJ1Y3QgY2N3YmsgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0cnVjdCBlbmRjY3cgewotCV9fdTMyICAgICByZWFsOyAgICAgICAgICAgIC8qIHJlYWwgYWRkcmVzcyBvZiB0aGlzIGJsb2NrICovCi0gICAgICAgX191OCAgICAgIHdyaXRlMTsgICAgICAgICAgLyogd3JpdGUgMSBpcyBhY3RpdmUgKi8KLSAgICAgICAgX191OCAgICAgIHJlYWQxOyAgICAgICAgICAgLyogcmVhZCAxIGlzIGFjdGl2ZSAgKi8KLSAgICAgICAgX191MTYgICAgIHJlc2VydmVkOyAgICAgICAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLSAgICAgICAgc3RydWN0IGNjdzEgICAgd3JpdGUxX25vcDE7Ci0gICAgICAgIHN0cnVjdCBjY3cxICAgIHdyaXRlMV9ub3AyOwotICAgICAgICBzdHJ1Y3QgY2N3MSAgICB3cml0ZTJfbm9wMTsKLSAgICAgICAgc3RydWN0IGNjdzEgICAgd3JpdGUyX25vcDI7Ci0gICAgICAgIHN0cnVjdCBjY3cxICAgIHJlYWQxX25vcDE7Ci0gICAgICAgIHN0cnVjdCBjY3cxICAgIHJlYWQxX25vcDI7Ci0gICAgICAgIHN0cnVjdCBjY3cxICAgIHJlYWQyX25vcDE7Ci0gICAgICAgIHN0cnVjdCBjY3cxICAgIHJlYWQyX25vcDI7Ci19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiAgICAgQ0xBVyBzdHJ1Y3QgY2N3YmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RydWN0IGNjd2JrIHsKLSAgICAgICAgdm9pZCAgICpuZXh0OyAgICAgICAgLyogcG9pbnRlciB0byBuZXh0IGNjdyBibG9jayAqLwotICAgICAgICBfX3UzMiAgICAgcmVhbDsgICAgICAgICAvKiByZWFsIGFkZHJlc3Mgb2YgdGhpcyBjY3cgKi8KLSAgICAgICAgdm9pZCAgICAgICpwX2J1ZmZlcjsgICAgLyogdmlydHVhbCBhZGRyZXNzIG9mIGRhdGEgKi8KLSAgICAgICAgc3RydWN0IGNsYXdoICAgICBoZWFkZXI7ICAgICAgIC8qIGNsYXcgaGVhZGVyICovCi0gICAgICAgIHN0cnVjdCBjY3cxICAgIHdyaXRlOyAgIC8qIHdyaXRlIENDVyAgICAqLwotICAgICAgICBzdHJ1Y3QgY2N3MSAgICB3X3JlYWRfRkY7IC8qIHJlYWQgRkYgKi8KLSAgICAgICAgc3RydWN0IGNjdzEgICAgd19USUNfMTsgICAgICAgIC8qIFRJQyAqLwotICAgICAgICBzdHJ1Y3QgY2N3MSAgICByZWFkOyAgICAgICAgIC8qIHJlYWQgQ0NXICAqLwotICAgICAgICBzdHJ1Y3QgY2N3MSAgICByZWFkX2g7ICAgICAgICAvKiByZWFkIGhlYWRlciAqLwotICAgICAgICBzdHJ1Y3QgY2N3MSAgICBzaWduYWw7ICAgICAgIC8qIHNpZ25hbCBTTU9EICAqLwotICAgICAgICBzdHJ1Y3QgY2N3MSAgICByX1RJQ18xOyAgICAgICAgLyogVElDMSAqLwotICAgICAgICBzdHJ1Y3QgY2N3MSAgICByX3JlYWRfRkY7ICAgICAgLyogcmVhZCBGRiAgKi8KLSAgICAgICAgc3RydWN0IGNjdzEgICAgcl9USUNfMjsgICAgICAgIC8qIFRJQzIgKi8KLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICBDTEFXIGNvbnRyb2wgYmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0cnVjdCBjbGF3Y3RsIHsKLSAgICAgICAgX191OCAgICBjb21tYW5kOyAgICAgIC8qIGNvbnRyb2wgY29tbWFuZCAqLwotICAgICAgICBfX3U4ICAgIHZlcnNpb247ICAgICAgLyogQ0xBVyBwcm90b2NvbCB2ZXJzaW9uICovCi0gICAgICAgIF9fdTggICAgbGlua2lkOyAgICAgICAvKiBsaW5rIElEICAgKi8KLSAgICAgICAgX191OCAgICBjb3JyZWxhdG9yOyAgIC8qIGNvcnJlbGF0b3IgKi8KLSAgICAgICAgX191OCAgICByYzsgICAgICAgICAgIC8qIHJldHVybiBjb2RlICovCi0gICAgICAgIF9fdTggICAgcmVzZXJ2ZWQxOyAgICAvKiByZXNlcnZlZCAqLwotICAgICAgICBfX3U4ICAgIHJlc2VydmVkMjsgICAgLyogcmVzZXJ2ZWQgKi8KLSAgICAgICAgX191OCAgICByZXNlcnZlZDM7ICAgIC8qIHJlc2VydmVkICovCi0gICAgICAgIF9fdTggICAgZGF0YVsyNF07ICAgICAvKiBjb21tYW5kIHNwZWNpZmljIGZpZWxkcyAqLwotfTsKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogICAgIERhdGEgZm9yIFNZU1RFTVZBTElEQVRFIGNvbW1hbmQgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RydWN0IHN5c3ZhbCAgewotICAgICAgICBjaGFyICAgIFdTX25hbWVbOF07ICAgICAgICAvKiBXb3Jrc3RhdGlvbiBTeXN0ZW0gbmFtZSAgKi8KLSAgICAgICAgY2hhciAgICBob3N0X25hbWVbOF07ICAgICAgLyogSG9zdCBzeXN0ZW0gbmFtZSAgICAgKi8KLSAgICAgICAgX191MTYgICByZWFkX2ZyYW1lX3NpemU7ICAgLyogcmVhZCBmcmFtZSBzaXplICovCi0gICAgICAgIF9fdTE2ICAgd3JpdGVfZnJhbWVfc2l6ZTsgIC8qIHdyaXRlIGZyYW1lIHNpemUgKi8KLSAgICAgICAgX191OCAgICByZXNlcnZlZFs0XTsgICAgICAgLyogcmVzZXJ2ZWQgKi8KLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICBEYXRhIGZvciBDb25uZWN0IGNvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0cnVjdCBjb25uY21kICB7Ci0gICAgICAgIGNoYXIgICAgIFdTX25hbWVbOF07ICAgICAgIC8qIFdvcmtzdGF0aW9uIGFwcGxpY2F0aW9uIG5hbWUgICovCi0gICAgICAgIGNoYXIgICAgIGhvc3RfbmFtZVs4XTsgICAgIC8qIEhvc3QgYXBwbGljYXRpb24gbmFtZSAgICAgICovCi0gICAgICAgIF9fdTE2ICAgIHJlc2VydmVkMVsyXTsgICAgIC8qIHJlYWQgZnJhbWUgc2l6ZSAqLwotICAgICAgICBfX3U4ICAgICByZXNlcnZlZDJbNF07ICAgICAvKiByZXNlcnZlZCAgKi8KLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICBEYXRhIGZvciBDTEFXIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0cnVjdCBjbGF3d2Vycm9yICB7Ci0gICAgICAgIGNoYXIgICAgICByZXNlcnZlZDFbOF07ICAgLyogcmVzZXJ2ZWQgKi8KLSAgICAgICAgY2hhciAgICAgIHJlc2VydmVkMls4XTsgICAvKiByZXNlcnZlZCAgKi8KLSAgICAgICAgY2hhciAgICAgIHJlc2VydmVkM1s4XTsgICAvKiByZXNlcnZlZCAgKi8KLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICBEYXRhIGJ1ZmZlciBmb3IgQ0xBVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXN0cnVjdCBjbGF3YnVmICB7Ci0gICAgICAgY2hhciAgICAgIGJ1ZmZlcltNQVhfRU5WRUxPUEVfU0laRV07ICAgLyogZGF0YSBidWZmZXIgKi8KLX07Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qICAgICBDaGFubmVsIGNvbnRyb2wgYmxvY2sgZm9yIHJlYWQgYW5kIHdyaXRlIGNoYW5uZWwgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RydWN0IGNoYmsgewotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgIGRldm5vOwotICAgICAgICBpbnQgICAgICAgICAgICAgICAgIGlycTsKLQljaGFyIAkJICAgIGlkW0NMQVdfSURfU0laRV07Ci0gICAgICAgX191MzIgICAgICAgICAgICAgICBJT19hY3RpdmU7Ci0gICAgICAgIF9fdTggICAgICAgICAgICAgICAgY2xhd19zdGF0ZTsKLSAgICAgICAgc3RydWN0IGlyYiAgICAgICAgICAqaXJiOwotICAgICAgIAlzdHJ1Y3QgY2N3X2RldmljZSAgICpjZGV2OyAgLyogcG9pbnRlciB0byB0aGUgY2hhbm5lbCBkZXZpY2UgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZSAgICpuZGV2OwotICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCAgIHdhaXQ7Ci0gICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgICB0YXNrbGV0OwotICAgICAgICBzdHJ1Y3QgdGltZXJfbGlzdCAgIHRpbWVyOwotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgIGZsYWdfYTsgICAgLyogYXRvbWljIGZsYWdzICovCi0jZGVmaW5lIENMQVdfQkhfQUNUSVZFICAgICAgMAotICAgICAgICB1bnNpZ25lZCBsb25nICAgICAgIGZsYWdfYjsgICAgLyogYXRvbWljIGZsYWdzICovCi0jZGVmaW5lIENMQVdfV1JJVEVfQUNUSVZFICAgMAotICAgICAgICBfX3U4ICAgICAgICAgICAgICAgIGxhc3RfZHN0YXQ7Ci0gICAgICAgIF9fdTggICAgICAgICAgICAgICAgZmxhZzsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGNvbGxlY3RfcXVldWU7Ci0Jc3BpbmxvY2tfdCBjb2xsZWN0X2xvY2s7Ci0jZGVmaW5lIENMQVdfV1JJVEUgICAgICAweDAyICAgICAgLyogLSBTZXQgaWYgdGhpcyBpcyBhIHdyaXRlIGNoYW5uZWwgKi8KLSNkZWZpbmUgQ0xBV19SRUFECTB4MDEgICAgICAvKiAtIFNldCBpZiB0aGlzIGlzIGEgcmVhZCBjaGFubmVsICAqLwotI2RlZmluZSBDTEFXX1RJTUVSICAgICAgMHg4MCAgICAgIC8qIC0gU2V0IGlmIHRpbWVyIG1hZGUgdGhlIHdha2VfdXAgICovCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgICAgICAgQ0xBVyAgZW52aXJvbm1lbnQgYmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdHJ1Y3QgY2xhd19lbnYgewotICAgICAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICBkZXZub1syXTsgICAgICAgLyogZGV2aWNlIG51bWJlciAqLwotICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICBob3N0X25hbWVbOV07ICAgLyogSG9zdCBuYW1lICovCi0gICAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgIGFkYXB0ZXJfbmFtZSBbOV07IC8qIGFkYXB0ZXIgbmFtZSAqLwotICAgICAgICBjaGFyICAgICAgICAgICAgICAgICAgICBhcGlfdHlwZVs5XTsgICAgLyogVENQSVAsIEFQSSBvciBQQUNLRUQgKi8KLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBfcHJpdjsgICAgICAgIC8qIHByaXZwdHIgKi8KLSAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgcmVhZF9idWZmZXJzOyAgIC8qIHJlYWQgYnVmZmVyIG51bWJlciAqLwotICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICB3cml0ZV9idWZmZXJzOyAgLyogd3JpdGUgYnVmZmVyIG51bWJlciAqLwotICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICByZWFkX3NpemU7ICAgICAgLyogcmVhZCBidWZmZXIgc2l6ZSAqLwotICAgICAgICBfX3UxNiAgICAgICAgICAgICAgICAgICB3cml0ZV9zaXplOyAgICAgLyogd3JpdGUgYnVmZmVyIHNpemUgKi8KLSAgICAgICAgX191MTYgICAgICAgICAgICAgICAgICAgZGV2X2lkOyAgICAgICAgIC8qIGRldmljZSBpZGVudCAqLwotCV9fdTgJCQlwYWNraW5nOwkvKiBhcmUgd2UgcGFja2luZz8gKi8KLSAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgaW5fdXNlOyAgICAgICAgIC8qIGRldmljZSBhY3RpdmUgZmxhZyAqLwotICAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAgICAgICAqbmRldjsgICAgCS8qIGJhY2t3YXJkIHB0ciB0byB0aGUgbmV0IGRldiovCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotKiAgICAgICAgICAgQ0xBVyAgbWFpbiBjb250cm9sIGJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdHJ1Y3QgY2xhd19wcml2YmsgewotICAgICAgICB2b2lkICpwX2J1ZmZfY2N3OwotICAgICAgICBfX3UzMiAgICAgIHBfYnVmZl9jY3dfbnVtOwotICAgICAgICB2b2lkICAqcF9idWZmX3JlYWQ7Ci0gICAgICAgIF9fdTMyICAgICAgcF9idWZmX3JlYWRfbnVtOwotICAgICAgICBfX3UzMiAgICAgIHBfYnVmZl9wYWdlc19wZXJyZWFkOwotICAgICAgICB2b2lkICAqcF9idWZmX3dyaXRlOwotICAgICAgICBfX3UzMiAgICAgIHBfYnVmZl93cml0ZV9udW07Ci0gICAgICAgIF9fdTMyICAgICAgcF9idWZmX3BhZ2VzX3BlcndyaXRlOwotICAgICAgICBsb25nICAgICAgIGFjdGl2ZV9saW5rX0lEOyAgICAgICAgICAgLyogQWN0aXZlIGxvZ2ljYWwgbGluayBJRCAqLwotICAgICAgICBzdHJ1Y3QgY2N3YmsgKnBfd3JpdGVfZnJlZV9jaGFpbjsgICAgIC8qIHBvaW50ZXIgdG8gZnJlZSBjY3cgY2hhaW4gKi8KLSAgICAgICAgc3RydWN0IGNjd2JrICpwX3dyaXRlX2FjdGl2ZV9maXJzdDsgICAvKiBwdHIgdG8gdGhlIGZpcnN0IHdyaXRlIGNjdyAqLwotICAgICAgICBzdHJ1Y3QgY2N3YmsgKnBfd3JpdGVfYWN0aXZlX2xhc3Q7ICAgIC8qIHB0ciB0byB0aGUgbGFzdCB3cml0ZSBjY3cgKi8KLSAgICAgICAgc3RydWN0IGNjd2JrICpwX3JlYWRfYWN0aXZlX2ZpcnN0OyAgICAvKiBwdHIgdG8gdGhlIGZpcnN0IHJlYWQgY2N3ICovCi0gICAgICAgIHN0cnVjdCBjY3diayAqcF9yZWFkX2FjdGl2ZV9sYXN0OyAgICAgLyogcHRyIHRvIHRoZSBsYXN0IHJlYWQgY2N3ICovCi0gICAgICAgIHN0cnVjdCBlbmRjY3cgKnBfZW5kX2NjdzsgICAgICAgICAgICAgIC8qcHRyIHRvIGVuZGluZyBjY3cgKi8KLSAgICAgICAgc3RydWN0IGNjd2JrICpwX2NsYXdfc2lnbmFsX2JsazsgICAgICAvKiBwdHIgdG8gc2lnbmFsIGJsb2NrICovCi0gICAgICAgIF9fdTMyICAgICAgd3JpdGVfZnJlZV9jb3VudDsgICAgICAgLyogbnVtYmVyIG9mIGZyZWUgYnVmcyBmb3Igd3JpdGUgKi8KLQlzdHJ1Y3QgICAgIG5ldF9kZXZpY2Vfc3RhdHMgIHN0YXRzOyAvKiAJIGRldmljZSBzdGF0dXMgICAgKi8KLSAgICAgICAgc3RydWN0IGNoYmsgY2hhbm5lbFsyXTsgICAgICAgICAgICAvKiBDaGFubmVsIGNvbnRyb2wgYmxvY2tzICovCi0gICAgICAgIF9fdTggICAgICAgbXRjX3NraXBwaW5nOwotICAgICAgICBpbnQgICAgICAgIG10Y19vZmZzZXQ7Ci0gICAgICAgIGludCAgICAgICAgbXRjX2xvZ2ljYWxfbGluazsKLSAgICAgICAgdm9pZCAgICAgICAqcF9tdGNfZW52ZWxvcGU7Ci0Jc3RydWN0CSAgIHNrX2J1ZmYJKnBrX3NrYjsJLyogcGFja2luZyBidWZmZXIgICAgKi8KLQlpbnQJICAgcGtfY250OwotICAgICAgICBzdHJ1Y3QgY2xhd2N0bCBjdGxfYms7Ci0gICAgICAgIHN0cnVjdCBjbGF3X2VudiAqcF9lbnY7Ci0gICAgICAgIF9fdTggICAgICAgc3lzdGVtX3ZhbGlkYXRlX2NvbXA7Ci0gICAgICAgIF9fdTggICAgICAgcmVsZWFzZV9wZW5kOwotICAgICAgICBfX3U4ICAgICAgY2hlY2tzdW1fcmVjZWl2ZWRfaXBfcGt0czsKLQlfX3U4ICAgICAgYnVmZnNfYWxsb2M7Ci0gICAgICAgIHN0cnVjdCBlbmRjY3cgIGVuZF9jY3c7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgIHRidXN5OwotCi19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBkZWZpbmUgZ2xvYmFsIGNvbnN0YW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBDQ1dCS19TSVpFIHNpemVvZihzdHJ1Y3QgY2N3YmspCi0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9jdGNtX21wYy5jIGIvZHJpdmVycy9zMzkwL25ldC9jdGNtX21wYy5jCmluZGV4IDJkYmM3N2IuLmVkZjE2YmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvY3RjbV9tcGMuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L2N0Y21fbXBjLmMKQEAgLTEzMCwxMSArMTMwLDcgQEAKIAlfX3UzMgljdCwgc3csIHJtLCBkdXA7CiAJY2hhcgkqcHRyLCAqcnB0cjsKIAljaGFyCXRidWZbODJdLCB0ZHVwWzgyXTsKLQkjaWZkZWYgQ09ORklHXzY0QklUCiAJY2hhcglhZGRyWzIyXTsKLQkjZWxzZQotCWNoYXIJYWRkclsxMl07Ci0JI2VuZGlmCiAJY2hhcglib2ZmWzEyXTsKIAljaGFyCWJoZXhbODJdLCBkdXBoZXhbODJdOwogCWNoYXIJYmFzY1s0MF07CkBAIC0xNDcsMTEgKzE0Myw3IEBACiAKIAlmb3IgKGN0ID0gMDsgY3QgPCBsZW47IGN0KyssIHB0cisrLCBycHRyKyspIHsKIAkJaWYgKHN3ID09IDApIHsKLQkJCSNpZmRlZiBDT05GSUdfNjRCSVQKIAkJCXNwcmludGYoYWRkciwgIiUxNi4xNmxseCIsIChfX3U2NClycHRyKTsKLQkJCSNlbHNlCi0JCQlzcHJpbnRmKGFkZHIsICIlOC44WCIsIChfX3UzMilycHRyKTsKLQkJCSNlbmRpZgogCiAJCQlzcHJpbnRmKGJvZmYsICIlNC40WCIsIChfX3UzMiljdCk7CiAJCQliaGV4WzBdID0gJ1wwJzsKQEAgLTE2MiwxMSArMTU0LDcgQEAKIAkJaWYgKHN3ID09IDgpCiAJCQlzdHJjYXQoYmhleCwgIgkiKTsKIAotCQkjaWYgQ09ORklHXzY0QklUCiAJCXNwcmludGYodGJ1ZiwgIiUyLjJsbFgiLCAoX191NjQpKnB0cik7Ci0JCSNlbHNlCi0JCXNwcmludGYodGJ1ZiwgIiUyLjJYIiwgKF9fdTMyKSpwdHIpOwotCQkjZW5kaWYKIAogCQl0YnVmWzJdID0gJ1wwJzsKIAkJc3RyY2F0KGJoZXgsIHRidWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCmluZGV4IDY0MmM3N2MuLjM0NjZkM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKQEAgLTQyMTgsNyArNDIxOCw3IEBACiAJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICJtb2RlOiV4IiwgbW9kZSk7CiAKIAlpb2IgPSBxZXRoX2dldF9hZGFwdGVyX2NtZChjYXJkLCBJUEFfU0VUQURQX1NFVF9QUk9NSVNDX01PREUsCi0JCQlzaXplb2Yoc3RydWN0IHFldGhfaXBhY21kX3NldGFkcHBhcm1zKSk7CisJCQlzaXplb2Yoc3RydWN0IHFldGhfaXBhY21kX3NldGFkcHBhcm1zX2hkcikgKyA4KTsKIAlpZiAoIWlvYikKIAkJcmV0dXJuOwogCWNtZCA9IChzdHJ1Y3QgcWV0aF9pcGFfY21kICopKGlvYi0+ZGF0YSArIElQQV9QRFVfSEVBREVSX1NJWkUpOwpAQCAtNDI5MCw3ICs0MjkwLDggQEAKIAlRRVRIX0NBUkRfVEVYVChjYXJkLCA0LCAiY2hnbWFjIik7CiAKIAlpb2IgPSBxZXRoX2dldF9hZGFwdGVyX2NtZChjYXJkLCBJUEFfU0VUQURQX0FMVEVSX01BQ19BRERSRVNTLAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgcWV0aF9pcGFjbWRfc2V0YWRwcGFybXMpKTsKKwkJCQkgICBzaXplb2Yoc3RydWN0IHFldGhfaXBhY21kX3NldGFkcHBhcm1zX2hkcikgKworCQkJCSAgIHNpemVvZihzdHJ1Y3QgcWV0aF9jaGFuZ2VfYWRkcikpOwogCWlmICghaW9iKQogCQlyZXR1cm4gLUVOT01FTTsKIAljbWQgPSAoc3RydWN0IHFldGhfaXBhX2NtZCAqKShpb2ItPmRhdGErSVBBX1BEVV9IRUFERVJfU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jIGIvZHJpdmVycy9zMzkwL3Njc2kvemZjcF9lcnAuYwppbmRleCAyYzVkNDU2Li5hY2RlM2Y1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX2VycC5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3BfZXJwLmMKQEAgLTczOCwxMSArNzM4LDExIEBACiAJCXJldHVybiBaRkNQX0VSUF9GQUlMRUQ7CiAKIAlpZiAobWVtcG9vbF9yZXNpemUoYWN0LT5hZGFwdGVyLT5wb29sLnNyX2RhdGEsCi0JCQkgICBhY3QtPmFkYXB0ZXItPnN0YXRfcmVhZF9idWZfbnVtLCBHRlBfS0VSTkVMKSkKKwkJCSAgIGFjdC0+YWRhcHRlci0+c3RhdF9yZWFkX2J1Zl9udW0pKQogCQlyZXR1cm4gWkZDUF9FUlBfRkFJTEVEOwogCiAJaWYgKG1lbXBvb2xfcmVzaXplKGFjdC0+YWRhcHRlci0+cG9vbC5zdGF0dXNfcmVhZF9yZXEsCi0JCQkgICBhY3QtPmFkYXB0ZXItPnN0YXRfcmVhZF9idWZfbnVtLCBHRlBfS0VSTkVMKSkKKwkJCSAgIGFjdC0+YWRhcHRlci0+c3RhdF9yZWFkX2J1Zl9udW0pKQogCQlyZXR1cm4gWkZDUF9FUlBfRkFJTEVEOwogCiAJYXRvbWljX3NldCgmYWN0LT5hZGFwdGVyLT5zdGF0X21pc3MsIGFjdC0+YWRhcHRlci0+c3RhdF9yZWFkX2J1Zl9udW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19lbnZjdHJsLmMKaW5kZXggMDc4N2I5Ny4uMjI4Yzc4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9iYmNfZW52Y3RybC5jCkBAIC0xNjAsOCArMTYwLDcgQEAKIAlwcmludGsoS0VSTl9DUklUICJrZW52Y3RybGQ6IFNodXR0aW5nIGRvd24gdGhlIHN5c3RlbSBub3cuXG4iKTsKIAogCXNodXR0aW5nX2Rvd24gPSAxOwotCWlmIChvcmRlcmx5X3Bvd2Vyb2ZmKHRydWUpIDwgMCkKLQkJcHJpbnRrKEtFUk5fQ1JJVCAiZW52Y3RybDogc2h1dGRvd24gZXhlY3V0aW9uIGZhaWxlZFxuIik7CisJb3JkZXJseV9wb3dlcm9mZih0cnVlKTsKIH0KIAogI2RlZmluZSBXQVJOX0lOVEVSVkFMCSgzMCAqIEhaKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCmluZGV4IGUyNDRjZjMuLjU2MDliNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKQEAgLTk3MCwxOCArOTcwLDEzIEBACiBzdGF0aWMgdm9pZCBlbnZjdHJsX2RvX3NodXRkb3duKHZvaWQpCiB7CiAJc3RhdGljIGludCBpbnByb2cgPSAwOwotCWludCByZXQ7CiAKIAlpZiAoaW5wcm9nICE9IDApCiAJCXJldHVybjsKIAogCWlucHJvZyA9IDE7CiAJcHJpbnRrKEtFUk5fQ1JJVCAia2VudmN0cmxkOiBXQVJOSU5HOiBTaHV0dGluZyBkb3duIHRoZSBzeXN0ZW0gbm93LlxuIik7Ci0JcmV0ID0gb3JkZXJseV9wb3dlcm9mZih0cnVlKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9DUklUICJrZW52Y3RybGQ6IFdBUk5JTkc6IHN5c3RlbSBzaHV0ZG93biBmYWlsZWQhXG4iKTsgCi0JCWlucHJvZyA9IDA7ICAvKiB1bmxpa2VseSB0byBzdWNjZWVkLCBidXQgd2UgY291bGQgdHJ5IGFnYWluICovCi0JfQorCW9yZGVybHlfcG93ZXJvZmYodHJ1ZSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmtlbnZjdHJsZF90YXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9jbWRzLmMKaW5kZXggODBkOTdmMy4uMTAyODc2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX2NtZHMuYworKysgYi9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfY21kcy5jCkBAIC0yMzcsNyArMjM3LDcgQEAKIAkJCWJlaXNjc2lfbG9nKHBoYmEsIEtFUk5fV0FSTklORywKIAkJCQkgICAgQkVJU0NTSV9MT0dfSU5JVCB8IEJFSVNDU0lfTE9HX0VIIHwKIAkJCQkgICAgQkVJU0NTSV9MT0dfQ09ORklHLAotCQkJCSAgICAiQkNfJWQgOiBJbnN1ZmZpY2VudCBCdWZmZXIgRXJyb3IgIgorCQkJCSAgICAiQkNfJWQgOiBJbnN1ZmZpY2llbnQgQnVmZmVyIEVycm9yICIKIAkJCQkgICAgIlJlc3BfTGVuIDogJWQgQWN0dWFsX1Jlc3BfTGVuIDogJWRcbiIsCiAJCQkJICAgIG1ieF9yZXNwX2hkci0+cmVzcG9uc2VfbGVuZ3RoLAogCQkJCSAgICBtYnhfcmVzcF9oZHItPmFjdHVhbF9yZXNwX2xlbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jIGIvZHJpdmVycy9zY3NpL2JlMmlzY3NpL2JlX21haW4uYwppbmRleCBhN2NjNjE4Li45MjNhMmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmUyaXNjc2kvYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZTJpc2NzaS9iZV9tYWluLmMKQEAgLTU3MzQsOSArNTczNCw5IEBACiBoYmFfZnJlZToKIAlpZiAocGhiYS0+bXNpeF9lbmFibGVkKQogCQlwY2lfZGlzYWJsZV9tc2l4KHBoYmEtPnBjaWRldik7Ci0JaXNjc2lfaG9zdF9yZW1vdmUocGhiYS0+c2hvc3QpOwogCXBjaV9kZXZfcHV0KHBoYmEtPnBjaWRldik7CiAJaXNjc2lfaG9zdF9mcmVlKHBoYmEtPnNob3N0KTsKKwlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBOVUxMKTsKIGRpc2FibGVfcGNpOgogCXBjaV9kaXNhYmxlX2RldmljZShwY2lkZXYpOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY2guYyBiL2RyaXZlcnMvc2NzaS9jaC5jCmluZGV4IDAwNDU3NDIuLmRhZDk1OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jaC5jCisrKyBiL2RyaXZlcnMvc2NzaS9jaC5jCkBAIC0zMzksNyArMzM5LDcgQEAKIAkJCWNoLT5maXJzdHNbQ0hFVF9EVF0sCiAJCQljaC0+Y291bnRzW0NIRVRfRFRdKTsKIAl9IGVsc2UgewotCQlWUFJJTlRLKEtFUk5fSU5GTywgInJlYWRpbmcgZWxlbWVudCBhZGRyZXNzIGFzc2lnbWVudCBwYWdlIGZhaWxlZCFcbiIpOworCQlWUFJJTlRLKEtFUk5fSU5GTywgInJlYWRpbmcgZWxlbWVudCBhZGRyZXNzIGFzc2lnbm1lbnQgcGFnZSBmYWlsZWQhXG4iKTsKIAl9CiAKIAkvKiB2ZW5kb3Igc3BlY2lmaWMgZWxlbWVudCB0eXBlcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2NzaW9zdG9yL2NzaW9faW5pdC5jIGIvZHJpdmVycy9zY3NpL2NzaW9zdG9yL2NzaW9faW5pdC5jCmluZGV4IGQ5NjMxZTEuLmRiZTQxNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jc2lvc3Rvci9jc2lvX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvY3Npb3N0b3IvY3Npb19pbml0LmMKQEAgLTExNzIsNyArMTE3Miw3IEBACiAgKiAgTWFjcm9zIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBQQ0kgRGV2aWNlIElEIFRhYmxlIC4uLgogICovCiAjZGVmaW5lIENIX1BDSV9ERVZJQ0VfSURfVEFCTEVfREVGSU5FX0JFR0lOIFwKLQlzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY3Npb19wY2lfdGJsW10gPSB7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGNzaW9fcGNpX3RibFtdID0gewogLyogRGVmaW5lIGZvciBGQ29FIHVzZXMgUEY2ICovCiAjZGVmaW5lIENIX1BDSV9ERVZJQ0VfSURfRlVOQ1RJT04JMHg2CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9pcHIuYyBiL2RyaXZlcnMvc2NzaS9pcHIuYwppbmRleCA5MjE5OTUzLi5kOWFmYzUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaXByLmMKKysrIGIvZHJpdmVycy9zY3NpL2lwci5jCkBAIC02ODE1LDcgKzY4MTUsOCBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFfcG9ydF9pbmZvIHNhdGFfcG9ydF9pbmZvID0gewotCS5mbGFncwkJPSBBVEFfRkxBR19TQVRBIHwgQVRBX0ZMQUdfUElPX0RNQSwKKwkuZmxhZ3MJCT0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX1BJT19ETUEgfAorCQkJICBBVEFfRkxBR19TQVNfSE9TVCwKIAkucGlvX21hc2sJPSBBVEFfUElPNF9PTkxZLAogCS5td2RtYV9tYXNrCT0gQVRBX01XRE1BMiwKIAkudWRtYV9tYXNrCT0gQVRBX1VETUE2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfYXRhLmMgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19hdGEuYwppbmRleCA5MzJkOWNjLi45YzcwNmQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19hdGEuYworKysgYi9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19hdGEuYwpAQCAtNTQ3LDcgKzU0Nyw4IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGF0YV9wb3J0X2luZm8gc2F0YV9wb3J0X2luZm8gPSB7Ci0JLmZsYWdzID0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX1BJT19ETUEgfCBBVEFfRkxBR19OQ1EsCisJLmZsYWdzID0gQVRBX0ZMQUdfU0FUQSB8IEFUQV9GTEFHX1BJT19ETUEgfCBBVEFfRkxBR19OQ1EgfAorCQkgQVRBX0ZMQUdfU0FTX0hPU1QsCiAJLnBpb19tYXNrID0gQVRBX1BJTzQsCiAJLm13ZG1hX21hc2sgPSBBVEFfTVdETUEyLAogCS51ZG1hX21hc2sgPSBBVEFfVURNQTYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvb3NkL29zZF9pbml0aWF0b3IuYyBiL2RyaXZlcnMvc2NzaS9vc2Qvb3NkX2luaXRpYXRvci5jCmluZGV4IDQ4OGMzOTIuLjBjY2NkNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9vc2Qvb3NkX2luaXRpYXRvci5jCisrKyBiL2RyaXZlcnMvc2NzaS9vc2Qvb3NkX2luaXRpYXRvci5jCkBAIC0xODYsNyArMTg2LDcgQEAKIAogCQlpZiAodW5saWtlbHkobGVuID4gc2l6ZW9mKG9kaS0+c3lzdGVtaWQpKSkgewogCQkJT1NEX0VSUigiT1NEIFRhcmdldCBlcnJvcjogT1NEX1NZU1RFTV9JRCB0b28gbG9uZyglZCkuICIKLQkJCQkiZGV2aWNlIGlkZXRpZmljYXRpb24gbWlnaHQgbm90IHdvcmtcbiIsIGxlbik7CisJCQkJImRldmljZSBpZGVudGlmaWNhdGlvbiBtaWdodCBub3Qgd29ya1xuIiwgbGVuKTsKIAkJCWxlbiA9IHNpemVvZihvZGktPnN5c3RlbWlkKTsKIAkJfQogCQlvZGktPnN5c3RlbWlkX2xlbiA9IGxlbjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCmluZGV4IGU1OWYyNWIuLjViYjU3YzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwpAQCAtNTM2NCw3ICs1MzY0LDcgQEAKIAlibG9iID0gcWxhMngwMF9yZXF1ZXN0X2Zpcm13YXJlKHZoYSk7CiAJaWYgKCFibG9iKSB7CiAJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwODMsCi0JCSAgICAiRmltd2FyZSBpbWFnZSB1bmF2YWlsYWJsZS5cbiIpOworCQkgICAgIkZpcm13YXJlIGltYWdlIHVuYXZhaWxhYmxlLlxuIik7CiAJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwODQsCiAJCSAgICAiRmlybXdhcmUgaW1hZ2VzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbTogIlFMQV9GV19VUkwgIi5cbiIpOwogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKQEAgLTU0NjcsNyArNTQ2Nyw3IEBACiAJYmxvYiA9IHFsYTJ4MDBfcmVxdWVzdF9maXJtd2FyZSh2aGEpOwogCWlmICghYmxvYikgewogCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDkwLAotCQkgICAgIkZpbXdhcmUgaW1hZ2UgdW5hdmFpbGFibGUuXG4iKTsKKwkJICAgICJGaXJtd2FyZSBpbWFnZSB1bmF2YWlsYWJsZS5cbiIpOwogCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDkxLAogCQkgICAgIkZpcm13YXJlIGltYWdlcyBjYW4gYmUgcmV0cmlldmVkIGZyb206ICIKIAkJICAgIFFMQV9GV19VUkwgIi5cbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCmluZGV4IDVjMmUwMzEuLmNhMzgwNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKQEAgLTc4OCw3ICs3ODgsNyBAQAogCQlyc3AtPm1zaXggPSAmaGEtPm1zaXhfZW50cmllc1txdWVfaWQgKyAxXTsKIAllbHNlCiAJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4MDBlMywKLQkJICAgICJNU0lYIG5vdCBlbmFsYmxlZC5cbiIpOworCQkgICAgIk1TSVggbm90IGVuYWJsZWQuXG4iKTsKIAogCWhhLT5yc3BfcV9tYXBbcXVlX2lkXSA9IHJzcDsKIAlyc3AtPnJpZCA9IHJpZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKaW5kZXggNTRjYjJhYy4uN2QyYjE4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKQEAgLTEyNzQsNyArMTI3NCw3IEBACiAKIAkJaWYgKG9mZiA9PSBBRERSX0VSUk9SKSB7CiAJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDExNiwKLQkJCSAgICAiVW5rbm93IGFkZHI6IDB4JTA4bHguXG4iLCBidWZbaV0uYWRkcik7CisJCQkgICAgIlVua25vd24gYWRkcjogMHglMDhseC5cbiIsIGJ1ZltpXS5hZGRyKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKaW5kZXggY2NlMWNiYy4uNTMxOWIzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMKQEAgLTQ0NiwxMSArNDQ2LDExIEBACiAJCX0KIAkJaGEtPmZsYWdzLmNwdV9hZmZpbml0eV9lbmFibGVkID0gMTsKIAkJcWxfZGJnKHFsX2RiZ19tdWx0aXEsIHZoYSwgMHhjMDA3LAotCQkgICAgIkNQVSBhZmZpbml0eSBtb2RlIGVuYWxiZWQsICIKKwkJICAgICJDUFUgYWZmaW5pdHkgbW9kZSBlbmFibGVkLCAiCiAJCSAgICAibm8uIG9mIHJlc3BvbnNlIHF1ZXVlczolZCBuby4gb2YgcmVxdWVzdCBxdWV1ZXM6JWQuXG4iLAogCQkgICAgaGEtPm1heF9yc3BfcXVldWVzLCBoYS0+bWF4X3JlcV9xdWV1ZXMpOwogCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMGU5LAotCQkgICAgIkNQVSBhZmZpbml0eSBtb2RlIGVuYWxiZWQsICIKKwkJICAgICJDUFUgYWZmaW5pdHkgbW9kZSBlbmFibGVkLCAiCiAJCSAgICAibm8uIG9mIHJlc3BvbnNlIHF1ZXVlczolZCBuby4gb2YgcmVxdWVzdCBxdWV1ZXM6JWQuXG4iLAogCQkgICAgaGEtPm1heF9yc3BfcXVldWVzLCBoYS0+bWF4X3JlcV9xdWV1ZXMpOwogCX0KQEAgLTQxMDIsNyArNDEwMiw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4YjA1ZiwKLQkJICAgICJVbmtub3cgd29yay1jb2RlPTB4JXguXG4iLCB3b3JrX2NvZGUpOworCQkgICAgIlVua25vd24gd29yay1jb2RlPTB4JXguXG4iLCB3b3JrX2NvZGUpOwogCX0KIAogCXJldHVybjsKQEAgLTQ3MDIsNyArNDcwMiw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4YjA3MSwKLQkJCSAgICAiVW5rbm93IERldmljZSBTdGF0ZTogJXguXG4iLCBkZXZfc3RhdGUpOworCQkJICAgICJVbmtub3duIERldmljZSBTdGF0ZTogJXguXG4iLCBkZXZfc3RhdGUpOwogCQkJcWxhODN4eF9pZGNfdW5sb2NrKGJhc2VfdmhhLCAwKTsKIAkJCXFsYTh4eHhfZGV2X2ZhaWxlZF9oYW5kbGVyKGJhc2VfdmhhKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvdGNtX3FsYTJ4eHguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3RjbV9xbGEyeHh4LmMKaW5kZXggOTlmNDNiNy4uYWI0ODc5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvdGNtX3FsYTJ4eHguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC90Y21fcWxhMnh4eC5jCkBAIC0xNTk2LDcgKzE1OTYsNyBAQAogCS8qCiAJICogRmluYWxseSByZWdpc3RlciB0aGUgbmV3IEZDIE5leHVzIHdpdGggVENNCiAJICovCi0JX190cmFuc3BvcnRfcmVnaXN0ZXJfc2Vzc2lvbihzZV9uYWNsLT5zZV90cGcsIHNlX25hY2wsIHNlX3Nlc3MsIHNlc3MpOworCXRyYW5zcG9ydF9yZWdpc3Rlcl9zZXNzaW9uKHNlX25hY2wtPnNlX3RwZywgc2VfbmFjbCwgc2Vfc2Vzcywgc2Vzcyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9lcnJvci5jCmluZGV4IDRjZGFmZmMuLmM5NWE0ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2Vycm9yLmMKKysrIGIvZHJpdmVycy9zY3NpL3Njc2lfZXJyb3IuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaS5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9jbW5kLmg+CkBAIC0yNTg2LDMgKzI1ODcsMzMgQEAKIAl9CiB9CiBFWFBPUlRfU1lNQk9MKHNjc2lfYnVpbGRfc2Vuc2VfYnVmZmVyKTsKKworLyoqCisgKiBzY3NpX3NldF9zZW5zZV9pbmZvcm1hdGlvbiAtIHNldCB0aGUgaW5mb3JtYXRpb24gZmllbGQgaW4gYQorICoJCWZvcm1hdHRlZCBzZW5zZSBkYXRhIGJ1ZmZlcgorICogQGJ1ZjoJV2hlcmUgdG8gYnVpbGQgc2Vuc2UgZGF0YQorICogQGluZm86CTY0LWJpdCBpbmZvcm1hdGlvbiB2YWx1ZSB0byBiZSBzZXQKKyAqCisgKiovCit2b2lkIHNjc2lfc2V0X3NlbnNlX2luZm9ybWF0aW9uKHU4ICpidWYsIHU2NCBpbmZvKQoreworCWlmICgoYnVmWzBdICYgMHg3ZikgPT0gMHg3MikgeworCQl1OCAqdWNwLCBsZW47CisKKwkJbGVuID0gYnVmWzddOworCQl1Y3AgPSAoY2hhciAqKXNjc2lfc2Vuc2VfZGVzY19maW5kKGJ1ZiwgbGVuICsgOCwgMCk7CisJCWlmICghdWNwKSB7CisJCQlidWZbN10gPSBsZW4gKyAweGE7CisJCQl1Y3AgPSBidWYgKyA4ICsgbGVuOworCQl9CisJCXVjcFswXSA9IDA7CisJCXVjcFsxXSA9IDB4YTsKKwkJdWNwWzJdID0gMHg4MDsgLyogVmFsaWQgYml0ICovCisJCXVjcFszXSA9IDA7CisJCXB1dF91bmFsaWduZWRfYmU2NChpbmZvLCAmdWNwWzRdKTsKKwl9IGVsc2UgaWYgKChidWZbMF0gJiAweDdmKSA9PSAweDcwKSB7CisJCWJ1ZlswXSB8PSAweDgwOworCQlwdXRfdW5hbGlnbmVkX2JlNjQoaW5mbywgJmJ1ZlszXSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChzY3NpX3NldF9zZW5zZV9pbmZvcm1hdGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCmluZGV4IDU0ZDdhNmMuLmIxYTI2MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9zY3NpX2xpYi5jCkBAIC0xMzExLDkgKzEzMTEsMTEgQEAKIAkJCQkgICAgInJlamVjdGluZyBJL08gdG8gZGVhZCBkZXZpY2VcbiIpOwogCQkJcmV0ID0gQkxLUFJFUF9LSUxMOwogCQkJYnJlYWs7Ci0JCWNhc2UgU0RFVl9RVUlFU0NFOgogCQljYXNlIFNERVZfQkxPQ0s6CiAJCWNhc2UgU0RFVl9DUkVBVEVEX0JMT0NLOgorCQkJcmV0ID0gQkxLUFJFUF9ERUZFUjsKKwkJCWJyZWFrOworCQljYXNlIFNERVZfUVVJRVNDRToKIAkJCS8qCiAJCQkgKiBJZiB0aGUgZGV2aWNlcyBpcyBibG9ja2VkIHdlIGRlZmVyIG5vcm1hbCBjb21tYW5kcy4KIAkJCSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnLmMgYi9kcml2ZXJzL3Njc2kvc2cuYwppbmRleCAyMjcwYmQ1Li45ZDdiN2RiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2cuYworKysgYi9kcml2ZXJzL3Njc2kvc2cuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L210aW8uaD4KICNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgpAQCAtNTEsNiArNTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAKICNpbmNsdWRlICJzY3NpLmgiCiAjaW5jbHVkZSA8c2NzaS9zY3NpX2RiZy5oPgpAQCAtMTc0NSwxNyArMTc0NSwxNCBAQAogCX0KIAogCWlmIChpb3ZfY291bnQpIHsKLQkJaW50IHNpemUgPSBzaXplb2Yoc3RydWN0IGlvdmVjKSAqIGlvdl9jb3VudDsKLQkJc3RydWN0IGlvdmVjICppb3Y7CisJCXN0cnVjdCBpb3ZlYyAqaW92ID0gTlVMTDsKIAkJc3RydWN0IGlvdl9pdGVyIGk7CiAKLQkJaW92ID0gbWVtZHVwX3VzZXIoaHAtPmR4ZmVycCwgc2l6ZSk7Ci0JCWlmIChJU19FUlIoaW92KSkKLQkJCXJldHVybiBQVFJfRVJSKGlvdik7CisJCXJlcyA9IGltcG9ydF9pb3ZlYyhydywgaHAtPmR4ZmVycCwgaW92X2NvdW50LCAwLCAmaW92LCAmaSk7CisJCWlmIChyZXMgPCAwKQorCQkJcmV0dXJuIHJlczsKIAotCQlpb3ZfaXRlcl9pbml0KCZpLCBydywgaW92LCBpb3ZfY291bnQsCi0JCQkgICAgICBtaW5fdChzaXplX3QsIGhwLT5keGZlcl9sZW4sCi0JCQkJICAgIGlvdl9sZW5ndGgoaW92LCBpb3ZfY291bnQpKSk7CisJCWlvdl9pdGVyX3RydW5jYXRlKCZpLCBocC0+ZHhmZXJfbGVuKTsKIAogCQlyZXMgPSBibGtfcnFfbWFwX3VzZXJfaW92KHEsIHJxLCBtZCwgJmksIEdGUF9BVE9NSUMpOwogCQlrZnJlZShpb3YpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Vmcy91ZnNoY2QuYyBiL2RyaXZlcnMvc2NzaS91ZnMvdWZzaGNkLmMKaW5kZXggNWQ2MGE4Ni4uMmFhODVlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3Vmcy91ZnNoY2QuYworKysgYi9kcml2ZXJzL3Njc2kvdWZzL3Vmc2hjZC5jCkBAIC00MjI1LDIyICs0MjI1LDE1IEBACiBzdGF0aWMgaW50IHVmc2hjZF9jb25maWdfdnJlZ19sb2FkKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHVmc192cmVnICp2cmVnLAogCQkJCSAgIGludCB1YSkKIHsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgcmVndWxhdG9yICpyZWcgPSB2cmVnLT5yZWc7Ci0JY29uc3QgY2hhciAqbmFtZSA9IHZyZWctPm5hbWU7CisJaW50IHJldDsKIAotCUJVR19PTighdnJlZyk7CisJaWYgKCF2cmVnKQorCQlyZXR1cm4gMDsKIAotCXJldCA9IHJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2RlKHJlZywgdWEpOwotCWlmIChyZXQgPj0gMCkgewotCQkvKgotCQkgKiByZWd1bGF0b3Jfc2V0X29wdGltdW1fbW9kZSgpIHJldHVybnMgbmV3IHJlZ3VsYXRvcgotCQkgKiBtb2RlIHVwb24gc3VjY2Vzcy4KLQkJICovCi0JCXJldCA9IDA7Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihkZXYsICIlczogJXMgc2V0IG9wdGltdW0gbW9kZSh1YT0lZCkgZmFpbGVkLCBlcnI9JWRcbiIsCi0JCQkJX19mdW5jX18sIG5hbWUsIHVhLCByZXQpOworCXJldCA9IHJlZ3VsYXRvcl9zZXRfbG9hZCh2cmVnLT5yZWcsIHVhKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIiVzOiAlcyBzZXQgbG9hZCAodWE9JWQpIGZhaWxlZCwgZXJyPSVkXG4iLAorCQkJCV9fZnVuY19fLCB2cmVnLT5uYW1lLCB1YSwgcmV0KTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNDI0OSwxOCArNDI0MiwxMiBAQAogc3RhdGljIGlubGluZSBpbnQgdWZzaGNkX2NvbmZpZ192cmVnX2xwbShzdHJ1Y3QgdWZzX2hiYSAqaGJhLAogCQkJCQkgc3RydWN0IHVmc192cmVnICp2cmVnKQogewotCWlmICghdnJlZykKLQkJcmV0dXJuIDA7Ci0KIAlyZXR1cm4gdWZzaGNkX2NvbmZpZ192cmVnX2xvYWQoaGJhLT5kZXYsIHZyZWcsIFVGU19WUkVHX0xQTV9MT0FEX1VBKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgdWZzaGNkX2NvbmZpZ192cmVnX2hwbShzdHJ1Y3QgdWZzX2hiYSAqaGJhLAogCQkJCQkgc3RydWN0IHVmc192cmVnICp2cmVnKQogewotCWlmICghdnJlZykKLQkJcmV0dXJuIDA7Ci0KIAlyZXR1cm4gdWZzaGNkX2NvbmZpZ192cmVnX2xvYWQoaGJhLT5kZXYsIHZyZWcsIHZyZWctPm1heF91QSk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmluZGV4IGFiOGRmYmUuLjE5OGY5NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9zcGkvS2NvbmZpZwpAQCAtMTU5LDEwICsxNTksOSBAQAogCiBjb25maWcgU1BJX0NBREVOQ0UKIAl0cmlzdGF0ZSAiQ2FkZW5jZSBTUEkgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEFSTQogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyB0aGUgQ2FkZW5jZSBTUEkgY29udHJvbGxlciBtYXN0ZXIgZHJpdmVyCi0JICB1c2VkIGJ5IFhpbGlueCBaeW5xLgorCSAgdXNlZCBieSBYaWxpbnggWnlucSBhbmQgWnlucU1QLgogCiBjb25maWcgU1BJX0NMUFM3MTFYCiAJdHJpc3RhdGUgIkNMUFM3MTFYIGhvc3QgU1BJIGNvbnRyb2xsZXIiCkBAIC02MzIsNyArNjMxLDcgQEAKIAogY29uZmlnIFNQSV9EV19NSURfRE1BCiAJYm9vbCAiRE1BIHN1cHBvcnQgZm9yIERXIFNQSSBjb250cm9sbGVyIG9uIEludGVsIE1JRCBwbGF0Zm9ybSIKLQlkZXBlbmRzIG9uIFNQSV9EV19QQ0kgJiYgSU5URUxfTUlEX0RNQUMKKwlkZXBlbmRzIG9uIFNQSV9EV19QQ0kgJiYgRFdfRE1BQ19QQ0kKIAogY29uZmlnIFNQSV9EV19NTUlPCiAJdHJpc3RhdGUgIk1lbW9yeS1tYXBwZWQgaW8gaW50ZXJmYWNlIGRyaXZlciBmb3IgRFcgU1BJIGNvcmUiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYXRtZWwuYyBiL2RyaXZlcnMvc3BpL3NwaS1hdG1lbC5jCmluZGV4IDA2ZGUzNDAuLmEyZjQwYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1hdG1lbC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1hdG1lbC5jCkBAIC0xODAsMTEgKzE4MCwxNyBAQAogCSAgfCBTUElfQkYobmFtZSwgdmFsdWUpKQogCiAvKiBSZWdpc3RlciBhY2Nlc3MgbWFjcm9zICovCisjaWZkZWYgQ09ORklHX0FWUjMyCiAjZGVmaW5lIHNwaV9yZWFkbChwb3J0LCByZWcpIFwKIAlfX3Jhd19yZWFkbCgocG9ydCktPnJlZ3MgKyBTUElfIyNyZWcpCiAjZGVmaW5lIHNwaV93cml0ZWwocG9ydCwgcmVnLCB2YWx1ZSkgXAogCV9fcmF3X3dyaXRlbCgodmFsdWUpLCAocG9ydCktPnJlZ3MgKyBTUElfIyNyZWcpCi0KKyNlbHNlCisjZGVmaW5lIHNwaV9yZWFkbChwb3J0LCByZWcpIFwKKwlyZWFkbF9yZWxheGVkKChwb3J0KS0+cmVncyArIFNQSV8jI3JlZykKKyNkZWZpbmUgc3BpX3dyaXRlbChwb3J0LCByZWcsIHZhbHVlKSBcCisJd3JpdGVsX3JlbGF4ZWQoKHZhbHVlKSwgKHBvcnQpLT5yZWdzICsgU1BJXyMjcmVnKQorI2VuZGlmCiAvKiB1c2UgUElPIGZvciBzbWFsbCB0cmFuc2ZlcnMsIGF2b2lkaW5nIERNQSBzZXR1cC90ZWFyZG93biBvdmVyaGVhZCBhbmQKICAqIGNhY2hlIG9wZXJhdGlvbnM7IGJldHRlciBoZXVyaXN0aWNzIGNvbnNpZGVyIHdvcmRzaXplIGFuZCBiaXRyYXRlLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYmNtMjgzNS5jIGIvZHJpdmVycy9zcGkvc3BpLWJjbTI4MzUuYwppbmRleCA0MTlhNzgyLi5mNjM4NjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYmNtMjgzNS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1iY20yODM1LmMKQEAgLTMsNiArMyw3IEBACiAgKgogICogQ29weXJpZ2h0IChDKSAyMDEyIENocmlzIEJvb3QKICAqIENvcHlyaWdodCAoQykgMjAxMyBTdGVwaGVuIFdhcnJlbgorICogQ29weXJpZ2h0IChDKSAyMDE1IE1hcnRpbiBTcGVybAogICoKICAqIFRoaXMgZHJpdmVyIGlzIGluc3BpcmVkIGJ5OgogICogc3BpLWF0aDc5LmMsIENvcHlyaWdodCAoQykgMjAwOS0yMDExIEdhYm9yIEp1aG9zIDxqdWhvc2dAb3BlbndydC5vcmc+CkBAIC0yOSw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCkBAIC02Niw4ICs2OCwxMCBAQAogI2RlZmluZSBCQ00yODM1X1NQSV9DU19DU18xMAkJMHgwMDAwMDAwMgogI2RlZmluZSBCQ00yODM1X1NQSV9DU19DU18wMQkJMHgwMDAwMDAwMQogCi0jZGVmaW5lIEJDTTI4MzVfU1BJX1RJTUVPVVRfTVMJMzAwMDAKLSNkZWZpbmUgQkNNMjgzNV9TUElfTU9ERV9CSVRTCShTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0ggfCBTUElfTk9fQ1MpCisjZGVmaW5lIEJDTTI4MzVfU1BJX1BPTExJTkdfTElNSVRfVVMJMzAKKyNkZWZpbmUgQkNNMjgzNV9TUElfVElNRU9VVF9NUwkJMzAwMDAKKyNkZWZpbmUgQkNNMjgzNV9TUElfTU9ERV9CSVRTCShTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0ggXAorCQkJCXwgU1BJX05PX0NTIHwgU1BJXzNXSVJFKQogCiAjZGVmaW5lIERSVl9OQU1FCSJzcGktYmNtMjgzNSIKIApAQCAtNzUsMTAgKzc5LDEwIEBACiAJdm9pZCBfX2lvbWVtICpyZWdzOwogCXN0cnVjdCBjbGsgKmNsazsKIAlpbnQgaXJxOwotCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CiAJY29uc3QgdTggKnR4X2J1ZjsKIAl1OCAqcnhfYnVmOwotCWludCBsZW47CisJaW50IHR4X2xlbjsKKwlpbnQgcnhfbGVuOwogfTsKIAogc3RhdGljIGlubGluZSB1MzIgYmNtMjgzNV9yZChzdHJ1Y3QgYmNtMjgzNV9zcGkgKmJzLCB1bnNpZ25lZCByZWcpCkBAIC05MSwyMDUgKzk1LDMxNSBAQAogCXdyaXRlbCh2YWwsIGJzLT5yZWdzICsgcmVnKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGJjbTI4MzVfcmRfZmlmbyhzdHJ1Y3QgYmNtMjgzNV9zcGkgKmJzLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSB2b2lkIGJjbTI4MzVfcmRfZmlmbyhzdHJ1Y3QgYmNtMjgzNV9zcGkgKmJzKQogewogCXU4IGJ5dGU7CiAKLQl3aGlsZSAobGVuLS0pIHsKKwl3aGlsZSAoKGJzLT5yeF9sZW4pICYmCisJICAgICAgIChiY20yODM1X3JkKGJzLCBCQ00yODM1X1NQSV9DUykgJiBCQ00yODM1X1NQSV9DU19SWEQpKSB7CiAJCWJ5dGUgPSBiY20yODM1X3JkKGJzLCBCQ00yODM1X1NQSV9GSUZPKTsKIAkJaWYgKGJzLT5yeF9idWYpCiAJCQkqYnMtPnJ4X2J1ZisrID0gYnl0ZTsKKwkJYnMtPnJ4X2xlbi0tOwogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGJjbTI4MzVfd3JfZmlmbyhzdHJ1Y3QgYmNtMjgzNV9zcGkgKmJzLCBpbnQgbGVuKQorc3RhdGljIGlubGluZSB2b2lkIGJjbTI4MzVfd3JfZmlmbyhzdHJ1Y3QgYmNtMjgzNV9zcGkgKmJzKQogewogCXU4IGJ5dGU7CiAKLQlpZiAobGVuID4gYnMtPmxlbikKLQkJbGVuID0gYnMtPmxlbjsKLQotCXdoaWxlIChsZW4tLSkgeworCXdoaWxlICgoYnMtPnR4X2xlbikgJiYKKwkgICAgICAgKGJjbTI4MzVfcmQoYnMsIEJDTTI4MzVfU1BJX0NTKSAmIEJDTTI4MzVfU1BJX0NTX1RYRCkpIHsKIAkJYnl0ZSA9IGJzLT50eF9idWYgPyAqYnMtPnR4X2J1ZisrIDogMDsKIAkJYmNtMjgzNV93cihicywgQkNNMjgzNV9TUElfRklGTywgYnl0ZSk7Ci0JCWJzLT5sZW4tLTsKKwkJYnMtPnR4X2xlbi0tOwogCX0KIH0KIAorc3RhdGljIHZvaWQgYmNtMjgzNV9zcGlfcmVzZXRfaHcoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9zcGkgKmJzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXUzMiBjcyA9IGJjbTI4MzVfcmQoYnMsIEJDTTI4MzVfU1BJX0NTKTsKKworCS8qIERpc2FibGUgU1BJIGludGVycnVwdHMgYW5kIHRyYW5zZmVyICovCisJY3MgJj0gfihCQ00yODM1X1NQSV9DU19JTlRSIHwKKwkJQkNNMjgzNV9TUElfQ1NfSU5URCB8CisJCUJDTTI4MzVfU1BJX0NTX1RBKTsKKwkvKiBhbmQgcmVzZXQgUlgvVFggRklGT1MgKi8KKwljcyB8PSBCQ00yODM1X1NQSV9DU19DTEVBUl9SWCB8IEJDTTI4MzVfU1BJX0NTX0NMRUFSX1RYOworCisJLyogYW5kIHJlc2V0IHRoZSBTUElfSFcgKi8KKwliY20yODM1X3dyKGJzLCBCQ00yODM1X1NQSV9DUywgY3MpOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgYmNtMjgzNV9zcGlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyID0gZGV2X2lkOwogCXN0cnVjdCBiY20yODM1X3NwaSAqYnMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0JdTMyIGNzID0gYmNtMjgzNV9yZChicywgQkNNMjgzNV9TUElfQ1MpOwogCi0JLyoKLQkgKiBSWFIgLSBSWCBuZWVkcyBSZWFkaW5nLiBUaGlzIG1lYW5zIDEyIChvciBtb3JlKSBieXRlcyBoYXZlIGJlZW4KLQkgKiB0cmFuc21pdHRlZCBhbmQgaGVuY2UgMTIgKG9yIG1vcmUpIGJ5dGVzIGhhdmUgYmVlbiByZWNlaXZlZC4KLQkgKgotCSAqIFRoZSBGSUZPIGlzIDE2LWJ5dGVzIGRlZXAuIFdlIGNoZWNrIGZvciB0aGlzIGludGVycnVwdCB0byBrZWVwIHRoZQotCSAqIEZJRk8gZnVsbDsgd2UgaGF2ZSBhIDQtYnl0ZS10aW1lIGJ1ZmZlciBmb3IgSVJRIGxhdGVuY3kuIFdlIGNoZWNrCi0JICogdGhpcyBiZWZvcmUgRE9ORSAoVFggZW1wdHkpIGp1c3QgaW4gY2FzZSB3ZSBkZWxheWVkIHByb2Nlc3NpbmcgdGhpcwotCSAqIGludGVycnVwdCBmb3Igc29tZSByZWFzb24uCi0JICoKLQkgKiBXZSBvbmx5IGNoZWNrIGZvciB0aGlzIGNhc2UgaWYgd2UgaGF2ZSBtb3JlIGJ5dGVzIHRvIFRYOyBhdCB0aGUgZW5kCi0JICogb2YgdGhlIHRyYW5zZmVyLCB3ZSBpZ25vcmUgdGhpcyBwaXBlbGluaW5nIG9wdGltaXphdGlvbiwgYW5kIGxldAotCSAqIGJjbTI4MzVfc3BpX2ZpbmlzaF90cmFuc2ZlcigpIGRyYWluIHRoZSBSWCBGSUZPLgotCSAqLwotCWlmIChicy0+bGVuICYmIChjcyAmIEJDTTI4MzVfU1BJX0NTX1JYUikpIHsKLQkJLyogUmVhZCAxMiBieXRlcyBvZiBkYXRhICovCi0JCWJjbTI4MzVfcmRfZmlmbyhicywgMTIpOworCS8qIFJlYWQgYXMgbWFueSBieXRlcyBhcyBwb3NzaWJsZSBmcm9tIEZJRk8gKi8KKwliY20yODM1X3JkX2ZpZm8oYnMpOworCS8qIFdyaXRlIGFzIG1hbnkgYnl0ZXMgYXMgcG9zc2libGUgdG8gRklGTyAqLworCWJjbTI4MzVfd3JfZmlmbyhicyk7CiAKLQkJLyogV3JpdGUgdXAgdG8gMTIgYnl0ZXMgKi8KLQkJYmNtMjgzNV93cl9maWZvKGJzLCAxMik7Ci0KLQkJLyoKLQkJICogV2UgbXVzdCBoYXZlIHdyaXR0ZW4gc29tZXRoaW5nIHRvIHRoZSBUWCBGSUZPIGR1ZSB0byB0aGUKLQkJICogYnMtPmxlbiBjaGVjayBhYm92ZSwgc28gY2Fubm90IGJlIERPTkUuIEhlbmNlLCByZXR1cm4KLQkJICogZWFybHkuIE5vdGUgdGhhdCBET05FIGNvdWxkIGFsc28gYmUgc2V0IGlmIHdlIHNlcnZpY2VkIGFuCi0JCSAqIFJYUiBpbnRlcnJ1cHQgcmVhbGx5IGxhdGUuCi0JCSAqLwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJLyogYmFzZWQgb24gZmxhZ3MgZGVjaWRlIGlmIHdlIGNhbiBmaW5pc2ggdGhlIHRyYW5zZmVyICovCisJaWYgKGJjbTI4MzVfcmQoYnMsIEJDTTI4MzVfU1BJX0NTKSAmIEJDTTI4MzVfU1BJX0NTX0RPTkUpIHsKKwkJLyogVHJhbnNmZXIgY29tcGxldGUgLSByZXNldCBTUEkgSFcgKi8KKwkJYmNtMjgzNV9zcGlfcmVzZXRfaHcobWFzdGVyKTsKKwkJLyogd2FrZSB1cCB0aGUgZnJhbWV3b3JrICovCisJCWNvbXBsZXRlKCZtYXN0ZXItPnhmZXJfY29tcGxldGlvbik7CiAJfQogCi0JLyoKLQkgKiBET05FIC0gVFggZW1wdHkuIFRoaXMgb2NjdXJzIHdoZW4gd2UgZmlyc3QgZW5hYmxlIHRoZSB0cmFuc2ZlcgotCSAqIHNpbmNlIHdlIGRvIG5vdCBwcmUtZmlsbCB0aGUgVFggRklGTy4gQXQgYW55IG90aGVyIHRpbWUsIGdpdmVuIHRoYXQKLQkgKiB3ZSByZWZpbGwgdGhlIFRYIEZJRk8gYWJvdmUgYmFzZWQgb24gUlhSLCBhbmQgaGVuY2UgaWdub3JlIERPTkUgaWYKLQkgKiBSWFIgaXMgc2V0LCBET05FIHJlYWxseSBkb2VzIG1lYW4gZW5kLW9mLXRyYW5zZmVyLgotCSAqLwotCWlmIChjcyAmIEJDTTI4MzVfU1BJX0NTX0RPTkUpIHsKLQkJaWYgKGJzLT5sZW4pIHsgLyogRmlyc3QgaW50ZXJydXB0IGluIGEgdHJhbnNmZXIgKi8KLQkJCWJjbTI4MzVfd3JfZmlmbyhicywgMTYpOwotCQl9IGVsc2UgeyAvKiBUcmFuc2ZlciBjb21wbGV0ZSAqLwotCQkJLyogRGlzYWJsZSBTUEkgaW50ZXJydXB0cyAqLwotCQkJY3MgJj0gfihCQ00yODM1X1NQSV9DU19JTlRSIHwgQkNNMjgzNV9TUElfQ1NfSU5URCk7Ci0JCQliY20yODM1X3dyKGJzLCBCQ00yODM1X1NQSV9DUywgY3MpOwotCi0JCQkvKgotCQkJICogV2FrZSB1cCBiY20yODM1X3NwaV90cmFuc2Zlcl9vbmUoKSwgd2hpY2ggd2lsbCBjYWxsCi0JCQkgKiBiY20yODM1X3NwaV9maW5pc2hfdHJhbnNmZXIoKSwgdG8gZHJhaW4gdGhlIFJYIEZJRk8uCi0JCQkgKi8KLQkJCWNvbXBsZXRlKCZicy0+ZG9uZSk7Ci0JCX0KLQotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JcmV0dXJuIElSUV9OT05FOworCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBiY20yODM1X3NwaV9zdGFydF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ZnIpCitzdGF0aWMgaW50IGJjbTI4MzVfc3BpX3RyYW5zZmVyX29uZV9wb2xsKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJCSBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQkgc3RydWN0IHNwaV90cmFuc2ZlciAqdGZyLAorCQkJCQkgdTMyIGNzLAorCQkJCQkgdW5zaWduZWQgbG9uZyB4ZmVyX3RpbWVfdXMpCiB7Ci0Jc3RydWN0IGJjbTI4MzVfc3BpICpicyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCXVuc2lnbmVkIGxvbmcgc3BpX2h6LCBjbGtfaHosIGNkaXY7Ci0JdTMyIGNzID0gQkNNMjgzNV9TUElfQ1NfSU5UUiB8IEJDTTI4MzVfU1BJX0NTX0lOVEQgfCBCQ00yODM1X1NQSV9DU19UQTsKKwlzdHJ1Y3QgYmNtMjgzNV9zcGkgKmJzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKworCQltYXgoNCAqIHhmZXJfdGltZV91cyAqIEhaIC8gMTAwMDAwMCwgMnVMKTsKIAotCXNwaV9oeiA9IHRmci0+c3BlZWRfaHo7Ci0JY2xrX2h6ID0gY2xrX2dldF9yYXRlKGJzLT5jbGspOworCS8qIGVuYWJsZSBIVyBibG9jayB3aXRob3V0IGludGVycnVwdHMgKi8KKwliY20yODM1X3dyKGJzLCBCQ00yODM1X1NQSV9DUywgY3MgfCBCQ00yODM1X1NQSV9DU19UQSk7CiAKLQlpZiAoc3BpX2h6ID49IGNsa19oeiAvIDIpIHsKLQkJY2RpdiA9IDI7IC8qIGNsa19oei8yIGlzIHRoZSBmYXN0ZXN0IHdlIGNhbiBnbyAqLwotCX0gZWxzZSBpZiAoc3BpX2h6KSB7Ci0JCS8qIENESVYgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byAqLwotCQljZGl2ID0gcm91bmR1cF9wb3dfb2ZfdHdvKERJVl9ST1VORF9VUChjbGtfaHosIHNwaV9oeikpOwotCi0JCWlmIChjZGl2ID49IDY1NTM2KQotCQkJY2RpdiA9IDA7IC8qIDAgaXMgdGhlIHNsb3dlc3Qgd2UgY2FuIGdvICovCi0JfSBlbHNlCi0JCWNkaXYgPSAwOyAvKiAwIGlzIHRoZSBzbG93ZXN0IHdlIGNhbiBnbyAqLwotCi0JaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQotCQljcyB8PSBCQ00yODM1X1NQSV9DU19DUE9MOwotCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKLQkJY3MgfD0gQkNNMjgzNV9TUElfQ1NfQ1BIQTsKLQotCWlmICghKHNwaS0+bW9kZSAmIFNQSV9OT19DUykpIHsKLQkJaWYgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSB7Ci0JCQljcyB8PSBCQ00yODM1X1NQSV9DU19DU1BPTDsKLQkJCWNzIHw9IEJDTTI4MzVfU1BJX0NTX0NTUE9MMCA8PCBzcGktPmNoaXBfc2VsZWN0OworCS8qIHNldCB0aW1lb3V0IHRvIDR4IHRoZSBleHBlY3RlZCB0aW1lLCBvciAyIGppZmZpZXMgKi8KKwkvKiBsb29wIHVudGlsIGZpbmlzaGVkIHRoZSB0cmFuc2ZlciAqLworCXdoaWxlIChicy0+cnhfbGVuKSB7CisJCS8qIHJlYWQgZnJvbSBmaWZvIGFzIG11Y2ggYXMgcG9zc2libGUgKi8KKwkJYmNtMjgzNV9yZF9maWZvKGJzKTsKKwkJLyogZmlsbCBpbiB0eCBmaWZvIGFzIG11Y2ggYXMgcG9zc2libGUgKi8KKwkJYmNtMjgzNV93cl9maWZvKGJzKTsKKwkJLyogaWYgd2Ugc3RpbGwgZXhwZWN0IHNvbWUgZGF0YSBhZnRlciB0aGUgcmVhZCwKKwkJICogY2hlY2sgZm9yIGEgcG9zc2libGUgdGltZW91dAorCQkgKi8KKwkJaWYgKGJzLT5yeF9sZW4gJiYgdGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQkJLyogVHJhbnNmZXIgY29tcGxldGUgLSByZXNldCBTUEkgSFcgKi8KKwkJCWJjbTI4MzVfc3BpX3Jlc2V0X2h3KG1hc3Rlcik7CisJCQkvKiBhbmQgcmV0dXJuIHRpbWVvdXQgKi8KKwkJCXJldHVybiAtRVRJTUVET1VUOwogCQl9Ci0KLQkJY3MgfD0gc3BpLT5jaGlwX3NlbGVjdDsKIAl9CiAKLQlyZWluaXRfY29tcGxldGlvbigmYnMtPmRvbmUpOwotCWJzLT50eF9idWYgPSB0ZnItPnR4X2J1ZjsKLQlicy0+cnhfYnVmID0gdGZyLT5yeF9idWY7Ci0JYnMtPmxlbiA9IHRmci0+bGVuOworCS8qIFRyYW5zZmVyIGNvbXBsZXRlIC0gcmVzZXQgU1BJIEhXICovCisJYmNtMjgzNV9zcGlfcmVzZXRfaHcobWFzdGVyKTsKKwkvKiBhbmQgcmV0dXJuIHdpdGhvdXQgd2FpdGluZyBmb3IgY29tcGxldGlvbiAqLworCXJldHVybiAwOworfQogCi0JYmNtMjgzNV93cihicywgQkNNMjgzNV9TUElfQ0xLLCBjZGl2KTsKK3N0YXRpYyBpbnQgYmNtMjgzNV9zcGlfdHJhbnNmZXJfb25lX2lycShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCQlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ZnIsCisJCQkJCXUzMiBjcykKK3sKKwlzdHJ1Y3QgYmNtMjgzNV9zcGkgKmJzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJLyogZmlsbCBpbiBmaWZvIGlmIHdlIGhhdmUgZ3Bpby1jcworCSAqIG5vdGUgdGhhdCB0aGVyZSBoYXZlIGJlZW4gcmFyZSBldmVudHMgd2hlcmUgdGhlIG5hdGl2ZS1DUworCSAqIGZsYXBwZWQgZm9yIDwxdXMgd2hpY2ggbWF5IGNoYW5nZSB0aGUgYmVoYXZpb3VyCisJICogd2l0aCBncGlvLWNzIHRoaXMgZG9lcyBub3QgaGFwcGVuLCBzbyBpdCBpcyBpbXBsZW1lbnRlZAorCSAqIG9ubHkgZm9yIHRoaXMgY2FzZQorCSAqLworCWlmIChncGlvX2lzX3ZhbGlkKHNwaS0+Y3NfZ3BpbykpIHsKKwkJLyogZW5hYmxlIEhXIGJsb2NrLCBidXQgd2l0aG91dCBpbnRlcnJ1cHRzIGVuYWJsZWQKKwkJICogdGhpcyB3b3VsZCB0cmlnZ2VybiBhbiBpbW1lZGlhdGUgaW50ZXJydXB0CisJCSAqLworCQliY20yODM1X3dyKGJzLCBCQ00yODM1X1NQSV9DUywKKwkJCSAgIGNzIHwgQkNNMjgzNV9TUElfQ1NfVEEpOworCQkvKiBmaWxsIGluIHR4IGZpZm8gYXMgbXVjaCBhcyBwb3NzaWJsZSAqLworCQliY20yODM1X3dyX2ZpZm8oYnMpOworCX0KKwogCS8qCiAJICogRW5hYmxlIHRoZSBIVyBibG9jay4gVGhpcyB3aWxsIGltbWVkaWF0ZWx5IHRyaWdnZXIgYSBET05FIChUWAogCSAqIGVtcHR5KSBpbnRlcnJ1cHQsIHVwb24gd2hpY2ggd2Ugd2lsbCBmaWxsIHRoZSBUWCBGSUZPIHdpdGggdGhlCiAJICogZmlyc3QgVFggYnl0ZXMuIFByZS1maWxsaW5nIHRoZSBUWCBGSUZPIGhlcmUgdG8gYXZvaWQgdGhlCiAJICogaW50ZXJydXB0IGRvZXNuJ3Qgd29yazotKAogCSAqLworCWNzIHw9IEJDTTI4MzVfU1BJX0NTX0lOVFIgfCBCQ00yODM1X1NQSV9DU19JTlREIHwgQkNNMjgzNV9TUElfQ1NfVEE7CiAJYmNtMjgzNV93cihicywgQkNNMjgzNV9TUElfQ1MsIGNzKTsKIAotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJjbTI4MzVfc3BpX2ZpbmlzaF90cmFuc2ZlcihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAotCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ZnIsIGJvb2wgY3NfY2hhbmdlKQotewotCXN0cnVjdCBiY20yODM1X3NwaSAqYnMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQl1MzIgY3MgPSBiY20yODM1X3JkKGJzLCBCQ00yODM1X1NQSV9DUyk7Ci0KLQkvKiBEcmFpbiBSWCBGSUZPICovCi0Jd2hpbGUgKGNzICYgQkNNMjgzNV9TUElfQ1NfUlhEKSB7Ci0JCWJjbTI4MzVfcmRfZmlmbyhicywgMSk7Ci0JCWNzID0gYmNtMjgzNV9yZChicywgQkNNMjgzNV9TUElfQ1MpOwotCX0KLQotCWlmICh0ZnItPmRlbGF5X3VzZWNzKQotCQl1ZGVsYXkodGZyLT5kZWxheV91c2Vjcyk7Ci0KLQlpZiAoY3NfY2hhbmdlKQotCQkvKiBDbGVhciBUQSBmbGFnICovCi0JCWJjbTI4MzVfd3IoYnMsIEJDTTI4MzVfU1BJX0NTLCBjcyAmIH5CQ00yODM1X1NQSV9DU19UQSk7Ci0KLQlyZXR1cm4gMDsKKwkvKiBzaWduYWwgdGhhdCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCBiY20yODM1X3NwaV90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKLQkJc3RydWN0IHNwaV9tZXNzYWdlICptZXNnKQorCQkJCSAgICBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ZnIpCiB7CiAJc3RydWN0IGJjbTI4MzVfc3BpICpicyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0ZnI7Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG1lc2ctPnNwaTsKLQlpbnQgZXJyID0gMDsKLQl1bnNpZ25lZCBpbnQgdGltZW91dDsKLQlib29sIGNzX2NoYW5nZTsKKwl1bnNpZ25lZCBsb25nIHNwaV9oeiwgY2xrX2h6LCBjZGl2OworCXVuc2lnbmVkIGxvbmcgc3BpX3VzZWRfaHosIHhmZXJfdGltZV91czsKKwl1MzIgY3MgPSBiY20yODM1X3JkKGJzLCBCQ00yODM1X1NQSV9DUyk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRmciwgJm1lc2ctPnRyYW5zZmVycywgdHJhbnNmZXJfbGlzdCkgewotCQllcnIgPSBiY20yODM1X3NwaV9zdGFydF90cmFuc2ZlcihzcGksIHRmcik7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKKwkvKiBzZXQgY2xvY2sgKi8KKwlzcGlfaHogPSB0ZnItPnNwZWVkX2h6OworCWNsa19oeiA9IGNsa19nZXRfcmF0ZShicy0+Y2xrKTsKIAotCQl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZicy0+ZG9uZSwKLQkJCQltc2Vjc190b19qaWZmaWVzKEJDTTI4MzVfU1BJX1RJTUVPVVRfTVMpKTsKLQkJaWYgKCF0aW1lb3V0KSB7Ci0JCQllcnIgPSAtRVRJTUVET1VUOwotCQkJZ290byBvdXQ7Ci0JCX0KKwlpZiAoc3BpX2h6ID49IGNsa19oeiAvIDIpIHsKKwkJY2RpdiA9IDI7IC8qIGNsa19oei8yIGlzIHRoZSBmYXN0ZXN0IHdlIGNhbiBnbyAqLworCX0gZWxzZSBpZiAoc3BpX2h6KSB7CisJCS8qIENESVYgbXVzdCBiZSBhIG11bHRpcGxlIG9mIHR3byAqLworCQljZGl2ID0gRElWX1JPVU5EX1VQKGNsa19oeiwgc3BpX2h6KTsKKwkJY2RpdiArPSAoY2RpdiAlIDIpOwogCi0JCWNzX2NoYW5nZSA9IHRmci0+Y3NfY2hhbmdlIHx8Ci0JCQlsaXN0X2lzX2xhc3QoJnRmci0+dHJhbnNmZXJfbGlzdCwgJm1lc2ctPnRyYW5zZmVycyk7CisJCWlmIChjZGl2ID49IDY1NTM2KQorCQkJY2RpdiA9IDA7IC8qIDAgaXMgdGhlIHNsb3dlc3Qgd2UgY2FuIGdvICovCisJfSBlbHNlIHsKKwkJY2RpdiA9IDA7IC8qIDAgaXMgdGhlIHNsb3dlc3Qgd2UgY2FuIGdvICovCisJfQorCXNwaV91c2VkX2h6ID0gY2RpdiA/IChjbGtfaHogLyBjZGl2KSA6IChjbGtfaHogLyA2NTUzNik7CisJYmNtMjgzNV93cihicywgQkNNMjgzNV9TUElfQ0xLLCBjZGl2KTsKIAotCQllcnIgPSBiY20yODM1X3NwaV9maW5pc2hfdHJhbnNmZXIoc3BpLCB0ZnIsIGNzX2NoYW5nZSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dDsKKwkvKiBoYW5kbGUgYWxsIHRoZSBtb2RlcyAqLworCWlmICgoc3BpLT5tb2RlICYgU1BJXzNXSVJFKSAmJiAodGZyLT5yeF9idWYpKQorCQljcyB8PSBCQ00yODM1X1NQSV9DU19SRU47CisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DUE9MKQorCQljcyB8PSBCQ00yODM1X1NQSV9DU19DUE9MOworCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJY3MgfD0gQkNNMjgzNV9TUElfQ1NfQ1BIQTsKIAotCQltZXNnLT5hY3R1YWxfbGVuZ3RoICs9ICh0ZnItPmxlbiAtIGJzLT5sZW4pOworCS8qIGZvciBncGlvX2NzIHNldCBkdW1teSBDUyBzbyB0aGF0IG5vIEhXLUNTIGdldCBjaGFuZ2VkCisJICogd2UgY2FuIG5vdCBydW4gdGhpcyBpbiBiY20yODM1X3NwaV9zZXRfY3MsIGFzIGl0IGRvZXMKKwkgKiBub3QgZ2V0IGNhbGxlZCBmb3IgY3NfZ3BpbyBjYXNlcywgc28gd2UgbmVlZCB0byBkbyBpdCBoZXJlCisJICovCisJaWYgKGdwaW9faXNfdmFsaWQoc3BpLT5jc19ncGlvKSB8fCAoc3BpLT5tb2RlICYgU1BJX05PX0NTKSkKKwkJY3MgfD0gQkNNMjgzNV9TUElfQ1NfQ1NfMTAgfCBCQ00yODM1X1NQSV9DU19DU18wMTsKKworCS8qIHNldCB0cmFuc21pdCBidWZmZXJzIGFuZCBsZW5ndGggKi8KKwlicy0+dHhfYnVmID0gdGZyLT50eF9idWY7CisJYnMtPnJ4X2J1ZiA9IHRmci0+cnhfYnVmOworCWJzLT50eF9sZW4gPSB0ZnItPmxlbjsKKwlicy0+cnhfbGVuID0gdGZyLT5sZW47CisKKwkvKiBjYWxjdWxhdGUgdGhlIGVzdGltYXRlZCB0aW1lIGluIHVzIHRoZSB0cmFuc2ZlciBydW5zICovCisJeGZlcl90aW1lX3VzID0gdGZyLT5sZW4KKwkJKiA5IC8qIGNsb2Nrcy9ieXRlIC0gU1BJLUhXIHdhaXRzIDEgY2xvY2sgYWZ0ZXIgZWFjaCBieXRlICovCisJCSogMTAwMDAwMCAvIHNwaV91c2VkX2h6OworCisJLyogZm9yIHNob3J0IHJlcXVlc3RzIHJ1biBwb2xsaW5nKi8KKwlpZiAoeGZlcl90aW1lX3VzIDw9IEJDTTI4MzVfU1BJX1BPTExJTkdfTElNSVRfVVMpCisJCXJldHVybiBiY20yODM1X3NwaV90cmFuc2Zlcl9vbmVfcG9sbChtYXN0ZXIsIHNwaSwgdGZyLAorCQkJCQkJICAgICBjcywgeGZlcl90aW1lX3VzKTsKKworCXJldHVybiBiY20yODM1X3NwaV90cmFuc2Zlcl9vbmVfaXJxKG1hc3Rlciwgc3BpLCB0ZnIsIGNzKTsKK30KKworc3RhdGljIHZvaWQgYmNtMjgzNV9zcGlfaGFuZGxlX2VycihzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSAgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQoreworCWJjbTI4MzVfc3BpX3Jlc2V0X2h3KG1hc3Rlcik7Cit9CisKK3N0YXRpYyB2b2lkIGJjbTI4MzVfc3BpX3NldF9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBib29sIGdwaW9fbGV2ZWwpCit7CisJLyoKKwkgKiB3ZSBjYW4gYXNzdW1lIHRoYXQgd2UgYXJlICJuYXRpdmUiIGFzIHBlciBzcGlfc2V0X2NzCisJICogICBjYWxsaW5nIHVzIE9OTFkgd2hlbiBjc19ncGlvIGlzIG5vdCBzZXQKKwkgKiB3ZSBjYW4gYWxzbyBhc3N1bWUgdGhhdCB3ZSBhcmUgQ1MgPCAzIGFzIHBlciBiY20yODM1X3NwaV9zZXR1cAorCSAqICAgd2Ugd291bGQgbm90IGdldCBjYWxsZWQgYmVjYXVzZSBvZiBlcnJvciBoYW5kbGluZyB0aGVyZS4KKwkgKiB0aGUgbGV2ZWwgcGFzc2VkIGlzIHRoZSBlbGVjdHJpY2FsIGxldmVsIG5vdCBlbmFibGVkL2Rpc2FibGVkCisJICogICBzbyBpdCBoYXMgdG8gZ2V0IHRyYW5zbGF0ZWQgYmFjayB0byBlbmFibGUvZGlzYWJsZQorCSAqICAgc2VlIHNwaV9zZXRfY3MgaW4gc3BpLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbgorCSAqLworCisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHNwaS0+bWFzdGVyOworCXN0cnVjdCBiY20yODM1X3NwaSAqYnMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdTMyIGNzID0gYmNtMjgzNV9yZChicywgQkNNMjgzNV9TUElfQ1MpOworCWJvb2wgZW5hYmxlOworCisJLyogY2FsY3VsYXRlIHRoZSBlbmFibGUgZmxhZyBmcm9tIHRoZSBwYXNzZWQgZ3Bpb19sZXZlbCAqLworCWVuYWJsZSA9IChzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkgPyBncGlvX2xldmVsIDogIWdwaW9fbGV2ZWw7CisKKwkvKiBzZXQgZmxhZ3MgZm9yICJyZXZlcnNlIiBwb2xhcml0eSBpbiB0aGUgcmVnaXN0ZXJzICovCisJaWYgKHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKSB7CisJCS8qIHNldCB0aGUgY29ycmVjdCBDUy1iaXRzICovCisJCWNzIHw9IEJDTTI4MzVfU1BJX0NTX0NTUE9MOworCQljcyB8PSBCQ00yODM1X1NQSV9DU19DU1BPTDAgPDwgc3BpLT5jaGlwX3NlbGVjdDsKKwl9IGVsc2UgeworCQkvKiBjbGVhbiB0aGUgQ1MtYml0cyAqLworCQljcyAmPSB+QkNNMjgzNV9TUElfQ1NfQ1NQT0w7CisJCWNzICY9IH4oQkNNMjgzNV9TUElfQ1NfQ1NQT0wwIDw8IHNwaS0+Y2hpcF9zZWxlY3QpOwogCX0KIAotb3V0OgotCS8qIENsZWFyIEZJRk9zLCBhbmQgZGlzYWJsZSB0aGUgSFcgYmxvY2sgKi8KLQliY20yODM1X3dyKGJzLCBCQ00yODM1X1NQSV9DUywKLQkJICAgQkNNMjgzNV9TUElfQ1NfQ0xFQVJfUlggfCBCQ00yODM1X1NQSV9DU19DTEVBUl9UWCk7Ci0JbWVzZy0+c3RhdHVzID0gZXJyOwotCXNwaV9maW5hbGl6ZV9jdXJyZW50X21lc3NhZ2UobWFzdGVyKTsKKwkvKiBzZWxlY3QgdGhlIGNvcnJlY3QgY2hpcF9zZWxlY3QgZGVwZW5kaW5nIG9uIGRpc2FibGVkL2VuYWJsZWQgKi8KKwlpZiAoZW5hYmxlKSB7CisJCS8qIHNldCBjcyBjb3JyZWN0bHkgKi8KKwkJaWYgKHNwaS0+bW9kZSAmIFNQSV9OT19DUykgeworCQkJLyogdXNlIHRoZSAidW5kZWZpbmVkIiBjaGlwLXNlbGVjdCAqLworCQkJY3MgfD0gQkNNMjgzNV9TUElfQ1NfQ1NfMTAgfCBCQ00yODM1X1NQSV9DU19DU18wMTsKKwkJfSBlbHNlIHsKKwkJCS8qIHNldCB0aGUgY2hpcCBzZWxlY3QgKi8KKwkJCWNzICY9IH4oQkNNMjgzNV9TUElfQ1NfQ1NfMTAgfCBCQ00yODM1X1NQSV9DU19DU18wMSk7CisJCQljcyB8PSBzcGktPmNoaXBfc2VsZWN0OworCQl9CisJfSBlbHNlIHsKKwkJLyogZGlzYWJsZSBDU1BPTCB3aGljaCBwdXRzIEhXLUNTIGludG8gZGVzZWxlY3RlZCBzdGF0ZSAqLworCQljcyAmPSB+QkNNMjgzNV9TUElfQ1NfQ1NQT0w7CisJCS8qIHVzZSB0aGUgInVuZGVmaW5lZCIgY2hpcC1zZWxlY3QgYXMgcHJlY2F1dGlvbiAqLworCQljcyB8PSBCQ00yODM1X1NQSV9DU19DU18xMCB8IEJDTTI4MzVfU1BJX0NTX0NTXzAxOworCX0KKworCS8qIGZpbmFsbHkgc2V0IHRoZSBjYWxjdWxhdGVkIGZsYWdzIGluIFNQSV9DUyAqLworCWJjbTI4MzVfd3IoYnMsIEJDTTI4MzVfU1BJX0NTLCBjcyk7Cit9CisKK3N0YXRpYyBpbnQgY2hpcF9tYXRjaF9uYW1lKHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuICFzdHJjbXAoY2hpcC0+bGFiZWwsIGRhdGEpOworfQorCitzdGF0aWMgaW50IGJjbTI4MzVfc3BpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwOworCS8qCisJICogc2FuaXR5IGNoZWNraW5nIHRoZSBuYXRpdmUtY2hpcHNlbGVjdHMKKwkgKi8KKwlpZiAoc3BpLT5tb2RlICYgU1BJX05PX0NTKQorCQlyZXR1cm4gMDsKKwlpZiAoZ3Bpb19pc192YWxpZChzcGktPmNzX2dwaW8pKQorCQlyZXR1cm4gMDsKKwlpZiAoc3BpLT5jaGlwX3NlbGVjdCA+IDEpIHsKKwkJLyogZXJyb3IgaW4gdGhlIGNhc2Ugb2YgbmF0aXZlIENTIHJlcXVlc3RlZCB3aXRoIENTID4gMQorCQkgKiBvZmZpY2lhbGx5IHRoZXJlIGlzIGEgQ1MyLCBidXQgaXQgaXMgbm90IGRvY3VtZW50ZWQKKwkJICogd2hpY2ggR1BJTyBpcyBjb25uZWN0ZWQgd2l0aCB0aGF0Li4uCisJCSAqLworCQlkZXZfZXJyKCZzcGktPmRldiwKKwkJCSJzZXR1cDogb25seSB0d28gbmF0aXZlIGNoaXAtc2VsZWN0cyBhcmUgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIG5vdyB0cmFuc2xhdGUgbmF0aXZlIGNzIHRvIEdQSU8gKi8KKworCS8qIGdldCB0aGUgZ3BpbyBjaGlwIGZvciB0aGUgYmFzZSAqLworCWNoaXAgPSBncGlvY2hpcF9maW5kKCJwaW5jdHJsLWJjbTI4MzUiLCBjaGlwX21hdGNoX25hbWUpOworCWlmICghY2hpcCkKKwkJcmV0dXJuIDA7CisKKwkvKiBhbmQgY2FsY3VsYXRlIHRoZSByZWFsIENTICovCisJc3BpLT5jc19ncGlvID0gY2hpcC0+YmFzZSArIDggLSBzcGktPmNoaXBfc2VsZWN0OworCisJLyogYW5kIHNldCB1cCB0aGUgIm1vZGUiIGFuZCBsZXZlbCAqLworCWRldl9pbmZvKCZzcGktPmRldiwgInNldHRpbmcgdXAgbmF0aXZlLUNTJWkgYXMgR1BJTyAlaVxuIiwKKwkJIHNwaS0+Y2hpcF9zZWxlY3QsIHNwaS0+Y3NfZ3Bpbyk7CisKKwkvKiBzZXQgdXAgR1BJTyBhcyBvdXRwdXQgYW5kIHB1bGwgdG8gdGhlIGNvcnJlY3QgbGV2ZWwgKi8KKwllcnIgPSBncGlvX2RpcmVjdGlvbl9vdXRwdXQoc3BpLT5jc19ncGlvLAorCQkJCSAgICAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpID8gMCA6IDEpOworCWlmIChlcnIpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsCisJCQkiY291bGQgbm90IHNldCBDUyVpIGdwaW8gJWkgYXMgb3V0cHV0OiAlaSIsCisJCQlzcGktPmNoaXBfc2VsZWN0LCBzcGktPmNzX2dwaW8sIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCS8qIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBwaW5jdHJsLWJjbTI4MzUgY3VycmVudGx5IGRvZXMgbm90CisJICogc2V0IHRoZSBHUElPIHZhbHVlIHdoZW4gdXNpbmcgZ3Bpb19kaXJlY3Rpb25fb3V0cHV0CisJICogc28gd2UgYXJlIHNldHRpbmcgaXQgaGVyZSBleHBsaWNpdGx5CisJICovCisJZ3Bpb19zZXRfdmFsdWUoc3BpLT5jc19ncGlvLCAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpID8gMCA6IDEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zMTIsMTMgKzQyNiwxNCBAQAogCW1hc3Rlci0+bW9kZV9iaXRzID0gQkNNMjgzNV9TUElfTU9ERV9CSVRTOwogCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOwogCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSAzOwotCW1hc3Rlci0+dHJhbnNmZXJfb25lX21lc3NhZ2UgPSBiY20yODM1X3NwaV90cmFuc2Zlcl9vbmU7CisJbWFzdGVyLT5zZXR1cCA9IGJjbTI4MzVfc3BpX3NldHVwOworCW1hc3Rlci0+c2V0X2NzID0gYmNtMjgzNV9zcGlfc2V0X2NzOworCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gYmNtMjgzNV9zcGlfdHJhbnNmZXJfb25lOworCW1hc3Rlci0+aGFuZGxlX2VyciA9IGJjbTI4MzVfc3BpX2hhbmRsZV9lcnI7CiAJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCiAJYnMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAKLQlpbml0X2NvbXBsZXRpb24oJmJzLT5kb25lKTsKLQogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CiAJYnMtPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKIAlpZiAoSVNfRVJSKGJzLT5yZWdzKSkgewpAQCAtMzQzLDEzICs0NTgsMTMgQEAKIAljbGtfcHJlcGFyZV9lbmFibGUoYnMtPmNsayk7CiAKIAllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGJzLT5pcnEsIGJjbTI4MzVfc3BpX2ludGVycnVwdCwgMCwKLQkJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwgbWFzdGVyKTsKKwkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgbWFzdGVyKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCByZXF1ZXN0IElSUTogJWRcbiIsIGVycik7CiAJCWdvdG8gb3V0X2Nsa19kaXNhYmxlOwogCX0KIAotCS8qIGluaXRpYWxpc2UgdGhlIGhhcmR3YXJlICovCisJLyogaW5pdGlhbGlzZSB0aGUgaGFyZHdhcmUgd2l0aCB0aGUgZGVmYXVsdCBwb2xhcml0aWVzICovCiAJYmNtMjgzNV93cihicywgQkNNMjgzNV9TUElfQ1MsCiAJCSAgIEJDTTI4MzVfU1BJX0NTX0NMRUFSX1JYIHwgQkNNMjgzNV9TUElfQ1NfQ0xFQVJfVFgpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYmNtNTN4eC5jIGIvZHJpdmVycy9zcGkvc3BpLWJjbTUzeHguYwppbmRleCAzZmI5MWM4Li4xNTIwNTU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYmNtNTN4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1iY201M3h4LmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAl1MzIgdG1wOwogCiAJLyogU1BFIGJpdCBoYXMgdG8gYmUgMCBiZWZvcmUgd2UgcmVhZCBNU1BJIFNUQVRVUyAqLwotCWRlYWRsaW5lID0gamlmZmllcyArIEJDTTUzWFhTUElfU1BFX1RJTUVPVVRfTVMgKiBIWiAvIDEwMDA7CisJZGVhZGxpbmUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhCQ001M1hYU1BJX1NQRV9USU1FT1VUX01TKTsKIAlkbyB7CiAJCXRtcCA9IGJjbTUzeHhzcGlfcmVhZChiNTNzcGksIEI1M1NQSV9NU1BJX1NQQ1IyKTsKIAkJaWYgKCEodG1wICYgQjUzU1BJX01TUElfU1BDUjJfU1BFKSkKQEAgLTU2LDcgKzU2LDcgQEAKIAkJZ290byBzcGlfdGltZW91dDsKIAogCS8qIENoZWNrIHN0YXR1cyAqLwotCWRlYWRsaW5lID0gamlmZmllcyArIHRpbWVvdXRfbXMgKiBIWiAvIDEwMDA7CisJZGVhZGxpbmUgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0X21zKTsKIAlkbyB7CiAJCXRtcCA9IGJjbTUzeHhzcGlfcmVhZChiNTNzcGksIEI1M1NQSV9NU1BJX01TUElfU1RBVFVTKTsKIAkJaWYgKHRtcCAmIEI1M1NQSV9NU1BJX01TUElfU1RBVFVTX1NQSUYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1iZmluNXh4LmMgYi9kcml2ZXJzL3NwaS9zcGktYmZpbjV4eC5jCmluZGV4IDM3MDc5OTMuLmEzZDY1YjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1iZmluNXh4LmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLWJmaW41eHguYwpAQCAtNTU5LDcgKzU1OSw3IEBACiAJc3RydWN0IHNwaV90cmFuc2ZlciAqcHJldmlvdXMgPSBOVUxMOwogCXN0cnVjdCBiZmluX3NwaV9zbGF2ZV9kYXRhICpjaGlwID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgYml0c19wZXJfd29yZDsKLQl1MTYgY3IsIGNyX3dpZHRoLCBkbWFfd2lkdGgsIGRtYV9jb25maWc7CisJdTE2IGNyLCBjcl93aWR0aCA9IDAsIGRtYV93aWR0aCwgZG1hX2NvbmZpZzsKIAl1MzIgdHJhbmZfc3VjY2VzcyA9IDE7CiAJdTggZnVsbF9kdXBsZXggPSAwOwogCkBAIC02NDgsNyArNjQ4LDYgQEAKIAl9IGVsc2UgaWYgKGJpdHNfcGVyX3dvcmQgPT0gOCkgewogCQlkcnZfZGF0YS0+bl9ieXRlcyA9IGJpdHNfcGVyX3dvcmQvODsKIAkJZHJ2X2RhdGEtPmxlbiA9IHRyYW5zZmVyLT5sZW47Ci0JCWNyX3dpZHRoID0gMDsKIAkJZHJ2X2RhdGEtPm9wcyA9ICZiZmluX2JmaW5fc3BpX3RyYW5zZmVyX29wc191ODsKIAl9CiAJY3IgPSBiZmluX3JlYWQoJmRydl9kYXRhLT5yZWdzLT5jdGwpICYgfihCSVRfQ1RMX1RJTU9EIHwgQklUX0NUTF9XT1JEU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktYml0YmFuZy10eHJ4LmggYi9kcml2ZXJzL3NwaS9zcGktYml0YmFuZy10eHJ4LmgKaW5kZXggYzYxNmU0MS4uMDZiMzRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWJpdGJhbmctdHhyeC5oCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1iaXRiYW5nLXR4cnguaApAQCAtNDksMTIgKzQ5LDE3IEBACiB7CiAJLyogaWYgKGNwb2wgPT0gMCkgdGhpcyBpcyBTUElfTU9ERV8wOyBlbHNlIHRoaXMgaXMgU1BJX01PREVfMiAqLwogCisJYm9vbCBvbGRiaXQgPSAhKHdvcmQgJiAxKTsKIAkvKiBjbG9jayBzdGFydHMgYXQgaW5hY3RpdmUgcG9sYXJpdHkgKi8KIAlmb3IgKHdvcmQgPDw9ICgzMiAtIGJpdHMpOyBsaWtlbHkoYml0cyk7IGJpdHMtLSkgewogCiAJCS8qIHNldHVwIE1TQiAodG8gc2xhdmUpIG9uIHRyYWlsaW5nIGVkZ2UgKi8KLQkJaWYgKChmbGFncyAmIFNQSV9NQVNURVJfTk9fVFgpID09IDApCi0JCQlzZXRtb3NpKHNwaSwgd29yZCAmICgxIDw8IDMxKSk7CisJCWlmICgoZmxhZ3MgJiBTUElfTUFTVEVSX05PX1RYKSA9PSAwKSB7CisJCQlpZiAoKHdvcmQgJiAoMSA8PCAzMSkpICE9IG9sZGJpdCkgeworCQkJCXNldG1vc2koc3BpLCB3b3JkICYgKDEgPDwgMzEpKTsKKwkJCQlvbGRiaXQgPSB3b3JkICYgKDEgPDwgMzEpOworCQkJfQorCQl9CiAJCXNwaWRlbGF5KG5zZWNzKTsJLyogVChzZXR1cCkgKi8KIAogCQlzZXRzY2soc3BpLCAhY3BvbCk7CkBAIC03NiwxMyArODEsMTggQEAKIHsKIAkvKiBpZiAoY3BvbCA9PSAwKSB0aGlzIGlzIFNQSV9NT0RFXzE7IGVsc2UgdGhpcyBpcyBTUElfTU9ERV8zICovCiAKKwlib29sIG9sZGJpdCA9ICEod29yZCAmICgxIDw8IDMxKSk7CiAJLyogY2xvY2sgc3RhcnRzIGF0IGluYWN0aXZlIHBvbGFyaXR5ICovCiAJZm9yICh3b3JkIDw8PSAoMzIgLSBiaXRzKTsgbGlrZWx5KGJpdHMpOyBiaXRzLS0pIHsKIAogCQkvKiBzZXR1cCBNU0IgKHRvIHNsYXZlKSBvbiBsZWFkaW5nIGVkZ2UgKi8KIAkJc2V0c2NrKHNwaSwgIWNwb2wpOwotCQlpZiAoKGZsYWdzICYgU1BJX01BU1RFUl9OT19UWCkgPT0gMCkKLQkJCXNldG1vc2koc3BpLCB3b3JkICYgKDEgPDwgMzEpKTsKKwkJaWYgKChmbGFncyAmIFNQSV9NQVNURVJfTk9fVFgpID09IDApIHsKKwkJCWlmICgod29yZCAmICgxIDw8IDMxKSkgIT0gb2xkYml0KSB7CisJCQkJc2V0bW9zaShzcGksIHdvcmQgJiAoMSA8PCAzMSkpOworCQkJCW9sZGJpdCA9IHdvcmQgJiAoMSA8PCAzMSk7CisJCQl9CisJCX0KIAkJc3BpZGVsYXkobnNlY3MpOyAvKiBUKHNldHVwKSAqLwogCiAJCXNldHNjayhzcGksIGNwb2wpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWR3LW1pZC5jIGIvZHJpdmVycy9zcGkvc3BpLWR3LW1pZC5jCmluZGV4IDNjZTM5ZDEuLmJiMTA1MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kdy1taWQuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZHctbWlkLmMKQEAgLTIzLDI5ICsyMywzMSBAQAogI2luY2x1ZGUgInNwaS1kdy5oIgogCiAjaWZkZWYgQ09ORklHX1NQSV9EV19NSURfRE1BCi0jaW5jbHVkZSA8bGludXgvaW50ZWxfbWlkX2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLWR3Lmg+CiAKICNkZWZpbmUgUlhfQlVTWQkJMAogI2RlZmluZSBUWF9CVVNZCQkxCiAKLXN0cnVjdCBtaWRfZG1hIHsKLQlzdHJ1Y3QgaW50ZWxfbWlkX2RtYV9zbGF2ZQlkbWFzX3R4OwotCXN0cnVjdCBpbnRlbF9taWRfZG1hX3NsYXZlCWRtYXNfcng7Ci19Oworc3RhdGljIHN0cnVjdCBkd19kbWFfc2xhdmUgbWlkX2RtYV90eCA9IHsgLmRzdF9pZCA9IDEgfTsKK3N0YXRpYyBzdHJ1Y3QgZHdfZG1hX3NsYXZlIG1pZF9kbWFfcnggPSB7IC5zcmNfaWQgPSAwIH07CiAKIHN0YXRpYyBib29sIG1pZF9zcGlfZG1hX2NoYW5fZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCiB7Ci0Jc3RydWN0IGR3X3NwaSAqZHdzID0gcGFyYW07CisJc3RydWN0IGR3X2RtYV9zbGF2ZSAqcyA9IHBhcmFtOwogCi0JcmV0dXJuIGR3cy0+ZG1hX2RldiA9PSBjaGFuLT5kZXZpY2UtPmRldjsKKwlpZiAocy0+ZG1hX2RldiAhPSBjaGFuLT5kZXZpY2UtPmRldikKKwkJcmV0dXJuIGZhbHNlOworCisJY2hhbi0+cHJpdmF0ZSA9IHM7CisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBpbnQgbWlkX3NwaV9kbWFfaW5pdChzdHJ1Y3QgZHdfc3BpICpkd3MpCiB7Ci0Jc3RydWN0IG1pZF9kbWEgKmR3X2RtYSA9IGR3cy0+ZG1hX3ByaXY7CiAJc3RydWN0IHBjaV9kZXYgKmRtYV9kZXY7Ci0Jc3RydWN0IGludGVsX21pZF9kbWFfc2xhdmUgKnJ4cywgKnR4czsKKwlzdHJ1Y3QgZHdfZG1hX3NsYXZlICp0eCA9IGR3cy0+ZG1hX3R4OworCXN0cnVjdCBkd19kbWFfc2xhdmUgKnJ4ID0gZHdzLT5kbWFfcng7CiAJZG1hX2NhcF9tYXNrX3QgbWFzazsKIAogCS8qCkBAIC01NiwyOCArNTgsMjIgQEAKIAlpZiAoIWRtYV9kZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JZHdzLT5kbWFfZGV2ID0gJmRtYV9kZXYtPmRldjsKLQogCWRtYV9jYXBfemVybyhtYXNrKTsKIAlkbWFfY2FwX3NldChETUFfU0xBVkUsIG1hc2spOwogCiAJLyogMS4gSW5pdCByeCBjaGFubmVsICovCi0JZHdzLT5yeGNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIG1pZF9zcGlfZG1hX2NoYW5fZmlsdGVyLCBkd3MpOworCXJ4LT5kbWFfZGV2ID0gJmRtYV9kZXYtPmRldjsKKwlkd3MtPnJ4Y2hhbiA9IGRtYV9yZXF1ZXN0X2NoYW5uZWwobWFzaywgbWlkX3NwaV9kbWFfY2hhbl9maWx0ZXIsIHJ4KTsKIAlpZiAoIWR3cy0+cnhjaGFuKQogCQlnb3RvIGVycl9leGl0OwotCXJ4cyA9ICZkd19kbWEtPmRtYXNfcng7Ci0JcnhzLT5oc19tb2RlID0gTE5XX0RNQV9IV19IUzsKLQlyeHMtPmNmZ19tb2RlID0gTE5XX0RNQV9QRVJfVE9fTUVNOwotCWR3cy0+cnhjaGFuLT5wcml2YXRlID0gcnhzOworCWR3cy0+bWFzdGVyLT5kbWFfcnggPSBkd3MtPnJ4Y2hhbjsKIAogCS8qIDIuIEluaXQgdHggY2hhbm5lbCAqLwotCWR3cy0+dHhjaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBtaWRfc3BpX2RtYV9jaGFuX2ZpbHRlciwgZHdzKTsKKwl0eC0+ZG1hX2RldiA9ICZkbWFfZGV2LT5kZXY7CisJZHdzLT50eGNoYW4gPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIG1pZF9zcGlfZG1hX2NoYW5fZmlsdGVyLCB0eCk7CiAJaWYgKCFkd3MtPnR4Y2hhbikKIAkJZ290byBmcmVlX3J4Y2hhbjsKLQl0eHMgPSAmZHdfZG1hLT5kbWFzX3R4OwotCXR4cy0+aHNfbW9kZSA9IExOV19ETUFfSFdfSFM7Ci0JdHhzLT5jZmdfbW9kZSA9IExOV19ETUFfTUVNX1RPX1BFUjsKLQlkd3MtPnR4Y2hhbi0+cHJpdmF0ZSA9IHR4czsKKwlkd3MtPm1hc3Rlci0+ZG1hX3R4ID0gZHdzLT50eGNoYW47CiAKIAlkd3MtPmRtYV9pbml0ZWQgPSAxOwogCXJldHVybiAwOwpAQCAtMTAwLDYgKzk2LDQyIEBACiAJZG1hX3JlbGVhc2VfY2hhbm5lbChkd3MtPnJ4Y2hhbik7CiB9CiAKK3N0YXRpYyBpcnFyZXR1cm5fdCBkbWFfdHJhbnNmZXIoc3RydWN0IGR3X3NwaSAqZHdzKQoreworCXUxNiBpcnFfc3RhdHVzID0gZHdfcmVhZGwoZHdzLCBEV19TUElfSVNSKTsKKworCWlmICghaXJxX3N0YXR1cykKKwkJcmV0dXJuIElSUV9OT05FOworCisJZHdfcmVhZGwoZHdzLCBEV19TUElfSUNSKTsKKwlzcGlfcmVzZXRfY2hpcChkd3MpOworCisJZGV2X2VycigmZHdzLT5tYXN0ZXItPmRldiwgIiVzOiBGSUZPIG92ZXJydW4vdW5kZXJydW5cbiIsIF9fZnVuY19fKTsKKwlkd3MtPm1hc3Rlci0+Y3VyX21zZy0+c3RhdHVzID0gLUVJTzsKKwlzcGlfZmluYWxpemVfY3VycmVudF90cmFuc2Zlcihkd3MtPm1hc3Rlcik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgYm9vbCBtaWRfc3BpX2Nhbl9kbWEoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3QgZHdfc3BpICpkd3MgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwlpZiAoIWR3cy0+ZG1hX2luaXRlZCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHhmZXItPmxlbiA+IGR3cy0+Zmlmb19sZW47Cit9CisKK3N0YXRpYyBlbnVtIGRtYV9zbGF2ZV9idXN3aWR0aCBjb252ZXJ0X2RtYV93aWR0aCh1MzIgZG1hX3dpZHRoKSB7CisJaWYgKGRtYV93aWR0aCA9PSAxKQorCQlyZXR1cm4gRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURTsKKwllbHNlIGlmIChkbWFfd2lkdGggPT0gMikKKwkJcmV0dXJuIERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOworCisJcmV0dXJuIERNQV9TTEFWRV9CVVNXSURUSF9VTkRFRklORUQ7Cit9CisKIC8qCiAgKiBkd3MtPmRtYV9jaGFuX2J1c3kgaXMgc2V0IGJlZm9yZSB0aGUgZG1hIHRyYW5zZmVyIHN0YXJ0cywgY2FsbGJhY2sgZm9yIHR4CiAgKiBjaGFubmVsIHdpbGwgY2xlYXIgYSBjb3JyZXNwb25kaW5nIGJpdC4KQEAgLTEwOCwzNSArMTQwLDMzIEBACiB7CiAJc3RydWN0IGR3X3NwaSAqZHdzID0gYXJnOwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChUWF9CVVNZLCAmZHdzLT5kbWFfY2hhbl9idXN5KSAmIEJJVChSWF9CVVNZKSkKKwljbGVhcl9iaXQoVFhfQlVTWSwgJmR3cy0+ZG1hX2NoYW5fYnVzeSk7CisJaWYgKHRlc3RfYml0KFJYX0JVU1ksICZkd3MtPmRtYV9jaGFuX2J1c3kpKQogCQlyZXR1cm47Ci0JZHdfc3BpX3hmZXJfZG9uZShkd3MpOworCXNwaV9maW5hbGl6ZV9jdXJyZW50X3RyYW5zZmVyKGR3cy0+bWFzdGVyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZHdfc3BpX2RtYV9wcmVwYXJlX3R4KHN0cnVjdCBkd19zcGkgKmR3cykKK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmR3X3NwaV9kbWFfcHJlcGFyZV90eChzdHJ1Y3QgZHdfc3BpICpkd3MsCisJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7CiAJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgdHhjb25mOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkZXNjOwogCi0JaWYgKCFkd3MtPnR4X2RtYSkKKwlpZiAoIXhmZXItPnR4X2J1ZikKIAkJcmV0dXJuIE5VTEw7CiAKIAl0eGNvbmYuZGlyZWN0aW9uID0gRE1BX01FTV9UT19ERVY7CiAJdHhjb25mLmRzdF9hZGRyID0gZHdzLT5kbWFfYWRkcjsKLQl0eGNvbmYuZHN0X21heGJ1cnN0ID0gTE5XX0RNQV9NU0laRV8xNjsKKwl0eGNvbmYuZHN0X21heGJ1cnN0ID0gMTY7CiAJdHhjb25mLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7Ci0JdHhjb25mLmRzdF9hZGRyX3dpZHRoID0gZHdzLT5kbWFfd2lkdGg7CisJdHhjb25mLmRzdF9hZGRyX3dpZHRoID0gY29udmVydF9kbWFfd2lkdGgoZHdzLT5kbWFfd2lkdGgpOwogCXR4Y29uZi5kZXZpY2VfZmMgPSBmYWxzZTsKIAogCWRtYWVuZ2luZV9zbGF2ZV9jb25maWcoZHdzLT50eGNoYW4sICZ0eGNvbmYpOwogCi0JbWVtc2V0KCZkd3MtPnR4X3NnbCwgMCwgc2l6ZW9mKGR3cy0+dHhfc2dsKSk7Ci0JZHdzLT50eF9zZ2wuZG1hX2FkZHJlc3MgPSBkd3MtPnR4X2RtYTsKLQlkd3MtPnR4X3NnbC5sZW5ndGggPSBkd3MtPmxlbjsKLQogCXR4ZGVzYyA9IGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NnKGR3cy0+dHhjaGFuLAotCQkJCSZkd3MtPnR4X3NnbCwKLQkJCQkxLAorCQkJCXhmZXItPnR4X3NnLnNnbCwKKwkJCQl4ZmVyLT50eF9zZy5uZW50cywKIAkJCQlETUFfTUVNX1RPX0RFViwKIAkJCQlETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ1RSTF9BQ0spOwogCWlmICghdHhkZXNjKQpAQCAtMTU2LDM1ICsxODYsMzMgQEAKIHsKIAlzdHJ1Y3QgZHdfc3BpICpkd3MgPSBhcmc7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJYX0JVU1ksICZkd3MtPmRtYV9jaGFuX2J1c3kpICYgQklUKFRYX0JVU1kpKQorCWNsZWFyX2JpdChSWF9CVVNZLCAmZHdzLT5kbWFfY2hhbl9idXN5KTsKKwlpZiAodGVzdF9iaXQoVFhfQlVTWSwgJmR3cy0+ZG1hX2NoYW5fYnVzeSkpCiAJCXJldHVybjsKLQlkd19zcGlfeGZlcl9kb25lKGR3cyk7CisJc3BpX2ZpbmFsaXplX2N1cnJlbnRfdHJhbnNmZXIoZHdzLT5tYXN0ZXIpOwogfQogCi1zdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkd19zcGlfZG1hX3ByZXBhcmVfcngoc3RydWN0IGR3X3NwaSAqZHdzKQorc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZHdfc3BpX2RtYV9wcmVwYXJlX3J4KHN0cnVjdCBkd19zcGkgKmR3cywKKwkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKIAlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyByeGNvbmY7CiAJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpyeGRlc2M7CiAKLQlpZiAoIWR3cy0+cnhfZG1hKQorCWlmICgheGZlci0+cnhfYnVmKQogCQlyZXR1cm4gTlVMTDsKIAogCXJ4Y29uZi5kaXJlY3Rpb24gPSBETUFfREVWX1RPX01FTTsKIAlyeGNvbmYuc3JjX2FkZHIgPSBkd3MtPmRtYV9hZGRyOwotCXJ4Y29uZi5zcmNfbWF4YnVyc3QgPSBMTldfRE1BX01TSVpFXzE2OworCXJ4Y29uZi5zcmNfbWF4YnVyc3QgPSAxNjsKIAlyeGNvbmYuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzsKLQlyeGNvbmYuc3JjX2FkZHJfd2lkdGggPSBkd3MtPmRtYV93aWR0aDsKKwlyeGNvbmYuc3JjX2FkZHJfd2lkdGggPSBjb252ZXJ0X2RtYV93aWR0aChkd3MtPmRtYV93aWR0aCk7CiAJcnhjb25mLmRldmljZV9mYyA9IGZhbHNlOwogCiAJZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhkd3MtPnJ4Y2hhbiwgJnJ4Y29uZik7CiAKLQltZW1zZXQoJmR3cy0+cnhfc2dsLCAwLCBzaXplb2YoZHdzLT5yeF9zZ2wpKTsKLQlkd3MtPnJ4X3NnbC5kbWFfYWRkcmVzcyA9IGR3cy0+cnhfZG1hOwotCWR3cy0+cnhfc2dsLmxlbmd0aCA9IGR3cy0+bGVuOwotCiAJcnhkZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2coZHdzLT5yeGNoYW4sCi0JCQkJJmR3cy0+cnhfc2dsLAotCQkJCTEsCisJCQkJeGZlci0+cnhfc2cuc2dsLAorCQkJCXhmZXItPnJ4X3NnLm5lbnRzLAogCQkJCURNQV9ERVZfVE9fTUVNLAogCQkJCURNQV9QUkVQX0lOVEVSUlVQVCB8IERNQV9DVFJMX0FDSyk7CiAJaWYgKCFyeGRlc2MpCkBAIC0xOTYsMzcgKzIyNCwzNiBAQAogCXJldHVybiByeGRlc2M7CiB9CiAKLXN0YXRpYyB2b2lkIGR3X3NwaV9kbWFfc2V0dXAoc3RydWN0IGR3X3NwaSAqZHdzKQorc3RhdGljIGludCBtaWRfc3BpX2RtYV9zZXR1cChzdHJ1Y3QgZHdfc3BpICpkd3MsIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7CiAJdTE2IGRtYV9jdHJsID0gMDsKIAotCXNwaV9lbmFibGVfY2hpcChkd3MsIDApOworCWR3X3dyaXRlbChkd3MsIERXX1NQSV9ETUFSRExSLCAweGYpOworCWR3X3dyaXRlbChkd3MsIERXX1NQSV9ETUFURExSLCAweDEwKTsKIAotCWR3X3dyaXRldyhkd3MsIERXX1NQSV9ETUFSRExSLCAweGYpOwotCWR3X3dyaXRldyhkd3MsIERXX1NQSV9ETUFURExSLCAweDEwKTsKLQotCWlmIChkd3MtPnR4X2RtYSkKKwlpZiAoeGZlci0+dHhfYnVmKQogCQlkbWFfY3RybCB8PSBTUElfRE1BX1RETUFFOwotCWlmIChkd3MtPnJ4X2RtYSkKKwlpZiAoeGZlci0+cnhfYnVmKQogCQlkbWFfY3RybCB8PSBTUElfRE1BX1JETUFFOwotCWR3X3dyaXRldyhkd3MsIERXX1NQSV9ETUFDUiwgZG1hX2N0cmwpOworCWR3X3dyaXRlbChkd3MsIERXX1NQSV9ETUFDUiwgZG1hX2N0cmwpOwogCi0Jc3BpX2VuYWJsZV9jaGlwKGR3cywgMSk7CisJLyogU2V0IHRoZSBpbnRlcnJ1cHQgbWFzayAqLworCXNwaV91bWFza19pbnRyKGR3cywgU1BJX0lOVF9UWE9JIHwgU1BJX0lOVF9SWFVJIHwgU1BJX0lOVF9SWE9JKTsKKworCWR3cy0+dHJhbnNmZXJfaGFuZGxlciA9IGRtYV90cmFuc2ZlcjsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1pZF9zcGlfZG1hX3RyYW5zZmVyKHN0cnVjdCBkd19zcGkgKmR3cywgaW50IGNzX2NoYW5nZSkKK3N0YXRpYyBpbnQgbWlkX3NwaV9kbWFfdHJhbnNmZXIoc3RydWN0IGR3X3NwaSAqZHdzLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkZXNjLCAqcnhkZXNjOwogCi0JLyogMS4gc2V0dXAgRE1BIHJlbGF0ZWQgcmVnaXN0ZXJzICovCi0JaWYgKGNzX2NoYW5nZSkKLQkJZHdfc3BpX2RtYV9zZXR1cChkd3MpOworCS8qIFByZXBhcmUgdGhlIFRYIGRtYSB0cmFuc2ZlciAqLworCXR4ZGVzYyA9IGR3X3NwaV9kbWFfcHJlcGFyZV90eChkd3MsIHhmZXIpOwogCi0JLyogMi4gUHJlcGFyZSB0aGUgVFggZG1hIHRyYW5zZmVyICovCi0JdHhkZXNjID0gZHdfc3BpX2RtYV9wcmVwYXJlX3R4KGR3cyk7Ci0KLQkvKiAzLiBQcmVwYXJlIHRoZSBSWCBkbWEgdHJhbnNmZXIgKi8KLQlyeGRlc2MgPSBkd19zcGlfZG1hX3ByZXBhcmVfcngoZHdzKTsKKwkvKiBQcmVwYXJlIHRoZSBSWCBkbWEgdHJhbnNmZXIgKi8KKwlyeGRlc2MgPSBkd19zcGlfZG1hX3ByZXBhcmVfcngoZHdzLCB4ZmVyKTsKIAogCS8qIHJ4IG11c3QgYmUgc3RhcnRlZCBiZWZvcmUgdHggZHVlIHRvIHNwaSBpbnN0aW5jdCAqLwogCWlmIChyeGRlc2MpIHsKQEAgLTI0NCwxMCArMjcxLDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIG1pZF9zcGlfZG1hX3N0b3Aoc3RydWN0IGR3X3NwaSAqZHdzKQoreworCWlmICh0ZXN0X2JpdChUWF9CVVNZLCAmZHdzLT5kbWFfY2hhbl9idXN5KSkgeworCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChkd3MtPnR4Y2hhbik7CisJCWNsZWFyX2JpdChUWF9CVVNZLCAmZHdzLT5kbWFfY2hhbl9idXN5KTsKKwl9CisJaWYgKHRlc3RfYml0KFJYX0JVU1ksICZkd3MtPmRtYV9jaGFuX2J1c3kpKSB7CisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKGR3cy0+cnhjaGFuKTsKKwkJY2xlYXJfYml0KFJYX0JVU1ksICZkd3MtPmRtYV9jaGFuX2J1c3kpOworCX0KK30KKwogc3RhdGljIHN0cnVjdCBkd19zcGlfZG1hX29wcyBtaWRfZG1hX29wcyA9IHsKIAkuZG1hX2luaXQJPSBtaWRfc3BpX2RtYV9pbml0LAogCS5kbWFfZXhpdAk9IG1pZF9zcGlfZG1hX2V4aXQsCisJLmRtYV9zZXR1cAk9IG1pZF9zcGlfZG1hX3NldHVwLAorCS5jYW5fZG1hCT0gbWlkX3NwaV9jYW5fZG1hLAogCS5kbWFfdHJhbnNmZXIJPSBtaWRfc3BpX2RtYV90cmFuc2ZlciwKKwkuZG1hX3N0b3AJPSBtaWRfc3BpX2RtYV9zdG9wLAogfTsKICNlbmRpZgogCkBAIC0yODAsOSArMzIyLDggQEAKIAlpb3VubWFwKGNsa19yZWcpOwogCiAjaWZkZWYgQ09ORklHX1NQSV9EV19NSURfRE1BCi0JZHdzLT5kbWFfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRfZG1hKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkd3MtPmRtYV9wcml2KQotCQlyZXR1cm4gLUVOT01FTTsKKwlkd3MtPmRtYV90eCA9ICZtaWRfZG1hX3R4OworCWR3cy0+ZG1hX3J4ID0gJm1pZF9kbWFfcng7CiAJZHdzLT5kbWFfb3BzID0gJm1pZF9kbWFfb3BzOwogI2VuZGlmCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktZHcuYyBiL2RyaXZlcnMvc3BpL3NwaS1kdy5jCmluZGV4IDQ4NDdhZmIuLjhkNjdkMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1kdy5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1kdy5jCkBAIC0yOCwxMSArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNlbmRpZgogCi0jZGVmaW5lIFNUQVJUX1NUQVRFCSgodm9pZCAqKTApCi0jZGVmaW5lIFJVTk5JTkdfU1RBVEUJKCh2b2lkICopMSkKLSNkZWZpbmUgRE9ORV9TVEFURQkoKHZvaWQgKikyKQotI2RlZmluZSBFUlJPUl9TVEFURQkoKHZvaWQgKiktMSkKLQogLyogU2xhdmUgc3BpX2RldiByZWxhdGVkICovCiBzdHJ1Y3QgY2hpcF9kYXRhIHsKIAl1MTYgY3IwOwpAQCAtMTQzLDEzICsxMzgsMjYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KIAorc3RhdGljIHZvaWQgZHdfc3BpX3NldF9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZHdfc3BpICpkd3MgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKKwlzdHJ1Y3QgY2hpcF9kYXRhICpjaGlwID0gc3BpX2dldF9jdGxkYXRhKHNwaSk7CisKKwkvKiBDaGlwIHNlbGVjdCBsb2dpYyBpcyBpbnZlcnRlZCBmcm9tIHNwaV9zZXRfY3MoKSAqLworCWlmIChjaGlwICYmIGNoaXAtPmNzX2NvbnRyb2wpCisJCWNoaXAtPmNzX2NvbnRyb2woIWVuYWJsZSk7CisKKwlpZiAoIWVuYWJsZSkKKwkJZHdfd3JpdGVsKGR3cywgRFdfU1BJX1NFUiwgQklUKHNwaS0+Y2hpcF9zZWxlY3QpKTsKK30KKwogLyogUmV0dXJuIHRoZSBtYXggZW50cmllcyB3ZSBjYW4gZmlsbCBpbnRvIHR4IGZpZm8gKi8KIHN0YXRpYyBpbmxpbmUgdTMyIHR4X21heChzdHJ1Y3QgZHdfc3BpICpkd3MpCiB7CiAJdTMyIHR4X2xlZnQsIHR4X3Jvb20sIHJ4dHhfZ2FwOwogCiAJdHhfbGVmdCA9IChkd3MtPnR4X2VuZCAtIGR3cy0+dHgpIC8gZHdzLT5uX2J5dGVzOwotCXR4X3Jvb20gPSBkd3MtPmZpZm9fbGVuIC0gZHdfcmVhZHcoZHdzLCBEV19TUElfVFhGTFIpOworCXR4X3Jvb20gPSBkd3MtPmZpZm9fbGVuIC0gZHdfcmVhZGwoZHdzLCBEV19TUElfVFhGTFIpOwogCiAJLyoKIAkgKiBBbm90aGVyIGNvbmNlcm4gaXMgYWJvdXQgdGhlIHR4L3J4IG1pc21hdGNoLCB3ZQpAQCAtMTcwLDcgKzE3OCw3IEBACiB7CiAJdTMyIHJ4X2xlZnQgPSAoZHdzLT5yeF9lbmQgLSBkd3MtPnJ4KSAvIGR3cy0+bl9ieXRlczsKIAotCXJldHVybiBtaW5fdCh1MzIsIHJ4X2xlZnQsIGR3X3JlYWR3KGR3cywgRFdfU1BJX1JYRkxSKSk7CisJcmV0dXJuIG1pbl90KHUzMiwgcnhfbGVmdCwgZHdfcmVhZGwoZHdzLCBEV19TUElfUlhGTFIpKTsKIH0KIAogc3RhdGljIHZvaWQgZHdfd3JpdGVyKHN0cnVjdCBkd19zcGkgKmR3cykKQEAgLTE4Niw3ICsxOTQsNyBAQAogCQkJZWxzZQogCQkJCXR4dyA9ICoodTE2ICopKGR3cy0+dHgpOwogCQl9Ci0JCWR3X3dyaXRldyhkd3MsIERXX1NQSV9EUiwgdHh3KTsKKwkJZHdfd3JpdGVsKGR3cywgRFdfU1BJX0RSLCB0eHcpOwogCQlkd3MtPnR4ICs9IGR3cy0+bl9ieXRlczsKIAl9CiB9CkBAIC0xOTcsNyArMjA1LDcgQEAKIAl1MTYgcnh3OwogCiAJd2hpbGUgKG1heC0tKSB7Ci0JCXJ4dyA9IGR3X3JlYWR3KGR3cywgRFdfU1BJX0RSKTsKKwkJcnh3ID0gZHdfcmVhZGwoZHdzLCBEV19TUElfRFIpOwogCQkvKiBDYXJlIHJ4IG9ubHkgaWYgdGhlIHRyYW5zZmVyJ3Mgb3JpZ2luYWwgInJ4IiBpcyBub3QgbnVsbCAqLwogCQlpZiAoZHdzLT5yeF9lbmQgLSBkd3MtPmxlbikgewogCQkJaWYgKGR3cy0+bl9ieXRlcyA9PSAxKQpAQCAtMjA5LDEwMyArMjE3LDIyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCAqbmV4dF90cmFuc2ZlcihzdHJ1Y3QgZHdfc3BpICpkd3MpCi17Ci0Jc3RydWN0IHNwaV9tZXNzYWdlICptc2cgPSBkd3MtPmN1cl9tc2c7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlciAqdHJhbnMgPSBkd3MtPmN1cl90cmFuc2ZlcjsKLQotCS8qIE1vdmUgdG8gbmV4dCB0cmFuc2ZlciAqLwotCWlmICh0cmFucy0+dHJhbnNmZXJfbGlzdC5uZXh0ICE9ICZtc2ctPnRyYW5zZmVycykgewotCQlkd3MtPmN1cl90cmFuc2ZlciA9Ci0JCQlsaXN0X2VudHJ5KHRyYW5zLT50cmFuc2Zlcl9saXN0Lm5leHQsCi0JCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIsCi0JCQkJCXRyYW5zZmVyX2xpc3QpOwotCQlyZXR1cm4gUlVOTklOR19TVEFURTsKLQl9Ci0KLQlyZXR1cm4gRE9ORV9TVEFURTsKLX0KLQotLyoKLSAqIE5vdGU6IGZpcnN0IHN0ZXAgaXMgdGhlIHByb3RvY29sIGRyaXZlciBwcmVwYXJlcwotICogYSBkbWEtY2FwYWJsZSBtZW1vcnksIGFuZCB0aGlzIGZ1bmMganVzdCBuZWVkIHRyYW5zbGF0ZQotICogdGhlIHZpcnQgYWRkciB0byBwaHlzaWNhbAotICovCi1zdGF0aWMgaW50IG1hcF9kbWFfYnVmZmVycyhzdHJ1Y3QgZHdfc3BpICpkd3MpCi17Ci0JaWYgKCFkd3MtPmN1cl9tc2ctPmlzX2RtYV9tYXBwZWQKLQkJfHwgIWR3cy0+ZG1hX2luaXRlZAotCQl8fCAhZHdzLT5jdXJfY2hpcC0+ZW5hYmxlX2RtYQotCQl8fCAhZHdzLT5kbWFfb3BzKQotCQlyZXR1cm4gMDsKLQotCWlmIChkd3MtPmN1cl90cmFuc2Zlci0+dHhfZG1hKQotCQlkd3MtPnR4X2RtYSA9IGR3cy0+Y3VyX3RyYW5zZmVyLT50eF9kbWE7Ci0KLQlpZiAoZHdzLT5jdXJfdHJhbnNmZXItPnJ4X2RtYSkKLQkJZHdzLT5yeF9kbWEgPSBkd3MtPmN1cl90cmFuc2Zlci0+cnhfZG1hOwotCi0JcmV0dXJuIDE7Ci19Ci0KLS8qIENhbGxlciBhbHJlYWR5IHNldCBtZXNzYWdlLT5zdGF0dXM7IGRtYSBhbmQgcGlvIGlycXMgYXJlIGJsb2NrZWQgKi8KLXN0YXRpYyB2b2lkIGdpdmViYWNrKHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpsYXN0X3RyYW5zZmVyOwotCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnOwotCi0JbXNnID0gZHdzLT5jdXJfbXNnOwotCWR3cy0+Y3VyX21zZyA9IE5VTEw7Ci0JZHdzLT5jdXJfdHJhbnNmZXIgPSBOVUxMOwotCWR3cy0+cHJldl9jaGlwID0gZHdzLT5jdXJfY2hpcDsKLQlkd3MtPmN1cl9jaGlwID0gTlVMTDsKLQlkd3MtPmRtYV9tYXBwZWQgPSAwOwotCi0JbGFzdF90cmFuc2ZlciA9IGxpc3RfbGFzdF9lbnRyeSgmbXNnLT50cmFuc2ZlcnMsIHN0cnVjdCBzcGlfdHJhbnNmZXIsCi0JCQkJCXRyYW5zZmVyX2xpc3QpOwotCi0JaWYgKCFsYXN0X3RyYW5zZmVyLT5jc19jaGFuZ2UpCi0JCXNwaV9jaGlwX3NlbChkd3MsIG1zZy0+c3BpLCAwKTsKLQotCXNwaV9maW5hbGl6ZV9jdXJyZW50X21lc3NhZ2UoZHdzLT5tYXN0ZXIpOwotfQotCiBzdGF0aWMgdm9pZCBpbnRfZXJyb3Jfc3RvcChzdHJ1Y3QgZHdfc3BpICpkd3MsIGNvbnN0IGNoYXIgKm1zZykKIHsKLQkvKiBTdG9wIHRoZSBodyAqLwotCXNwaV9lbmFibGVfY2hpcChkd3MsIDApOworCXNwaV9yZXNldF9jaGlwKGR3cyk7CiAKIAlkZXZfZXJyKCZkd3MtPm1hc3Rlci0+ZGV2LCAiJXNcbiIsIG1zZyk7Ci0JZHdzLT5jdXJfbXNnLT5zdGF0ZSA9IEVSUk9SX1NUQVRFOwotCXRhc2tsZXRfc2NoZWR1bGUoJmR3cy0+cHVtcF90cmFuc2ZlcnMpOworCWR3cy0+bWFzdGVyLT5jdXJfbXNnLT5zdGF0dXMgPSAtRUlPOworCXNwaV9maW5hbGl6ZV9jdXJyZW50X3RyYW5zZmVyKGR3cy0+bWFzdGVyKTsKIH0KIAotdm9pZCBkd19zcGlfeGZlcl9kb25lKHN0cnVjdCBkd19zcGkgKmR3cykKLXsKLQkvKiBVcGRhdGUgdG90YWwgYnl0ZSB0cmFuc2ZlcnJlZCByZXR1cm4gY291bnQgYWN0dWFsIGJ5dGVzIHJlYWQgKi8KLQlkd3MtPmN1cl9tc2ctPmFjdHVhbF9sZW5ndGggKz0gZHdzLT5sZW47Ci0KLQkvKiBNb3ZlIHRvIG5leHQgdHJhbnNmZXIgKi8KLQlkd3MtPmN1cl9tc2ctPnN0YXRlID0gbmV4dF90cmFuc2Zlcihkd3MpOwotCi0JLyogSGFuZGxlIGVuZCBvZiBtZXNzYWdlICovCi0JaWYgKGR3cy0+Y3VyX21zZy0+c3RhdGUgPT0gRE9ORV9TVEFURSkgewotCQlkd3MtPmN1cl9tc2ctPnN0YXR1cyA9IDA7Ci0JCWdpdmViYWNrKGR3cyk7Ci0JfSBlbHNlCi0JCXRhc2tsZXRfc2NoZWR1bGUoJmR3cy0+cHVtcF90cmFuc2ZlcnMpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoZHdfc3BpX3hmZXJfZG9uZSk7Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlcnJ1cHRfdHJhbnNmZXIoc3RydWN0IGR3X3NwaSAqZHdzKQogewotCXUxNiBpcnFfc3RhdHVzID0gZHdfcmVhZHcoZHdzLCBEV19TUElfSVNSKTsKKwl1MTYgaXJxX3N0YXR1cyA9IGR3X3JlYWRsKGR3cywgRFdfU1BJX0lTUik7CiAKIAkvKiBFcnJvciBoYW5kbGluZyAqLwogCWlmIChpcnFfc3RhdHVzICYgKFNQSV9JTlRfVFhPSSB8IFNQSV9JTlRfUlhPSSB8IFNQSV9JTlRfUlhVSSkpIHsKLQkJZHdfcmVhZHcoZHdzLCBEV19TUElfVFhPSUNSKTsKLQkJZHdfcmVhZHcoZHdzLCBEV19TUElfUlhPSUNSKTsKLQkJZHdfcmVhZHcoZHdzLCBEV19TUElfUlhVSUNSKTsKKwkJZHdfcmVhZGwoZHdzLCBEV19TUElfSUNSKTsKIAkJaW50X2Vycm9yX3N0b3AoZHdzLCAiaW50ZXJydXB0X3RyYW5zZmVyOiBmaWZvIG92ZXJydW4vdW5kZXJydW4iKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KQEAgLTMxMyw3ICsyNDAsNyBAQAogCWR3X3JlYWRlcihkd3MpOwogCWlmIChkd3MtPnJ4X2VuZCA9PSBkd3MtPnJ4KSB7CiAJCXNwaV9tYXNrX2ludHIoZHdzLCBTUElfSU5UX1RYRUkpOwotCQlkd19zcGlfeGZlcl9kb25lKGR3cyk7CisJCXNwaV9maW5hbGl6ZV9jdXJyZW50X3RyYW5zZmVyKGR3cy0+bWFzdGVyKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIAlpZiAoaXJxX3N0YXR1cyAmIFNQSV9JTlRfVFhFSSkgewpAQCAtMzI4LDEzICsyNTUsMTQgQEAKIAogc3RhdGljIGlycXJldHVybl90IGR3X3NwaV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogewotCXN0cnVjdCBkd19zcGkgKmR3cyA9IGRldl9pZDsKLQl1MTYgaXJxX3N0YXR1cyA9IGR3X3JlYWR3KGR3cywgRFdfU1BJX0lTUikgJiAweDNmOworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBkZXZfaWQ7CisJc3RydWN0IGR3X3NwaSAqZHdzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXUxNiBpcnFfc3RhdHVzID0gZHdfcmVhZGwoZHdzLCBEV19TUElfSVNSKSAmIDB4M2Y7CiAKIAlpZiAoIWlycV9zdGF0dXMpCiAJCXJldHVybiBJUlFfTk9ORTsKIAotCWlmICghZHdzLT5jdXJfbXNnKSB7CisJaWYgKCFtYXN0ZXItPmN1cl9tc2cpIHsKIAkJc3BpX21hc2tfaW50cihkd3MsIFNQSV9JTlRfVFhFSSk7CiAJCXJldHVybiBJUlFfSEFORExFRDsKIAl9CkBAIC0zNDMsNyArMjcxLDcgQEAKIH0KIAogLyogTXVzdCBiZSBjYWxsZWQgaW5zaWRlIHB1bXBfdHJhbnNmZXJzKCkgKi8KLXN0YXRpYyB2b2lkIHBvbGxfdHJhbnNmZXIoc3RydWN0IGR3X3NwaSAqZHdzKQorc3RhdGljIGludCBwb2xsX3RyYW5zZmVyKHN0cnVjdCBkd19zcGkgKmR3cykKIHsKIAlkbyB7CiAJCWR3X3dyaXRlcihkd3MpOwpAQCAtMzUxLDY0ICsyNzksMzIgQEAKIAkJY3B1X3JlbGF4KCk7CiAJfSB3aGlsZSAoZHdzLT5yeF9lbmQgPiBkd3MtPnJ4KTsKIAotCWR3X3NwaV94ZmVyX2RvbmUoZHdzKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHVtcF90cmFuc2ZlcnModW5zaWduZWQgbG9uZyBkYXRhKQorc3RhdGljIGludCBkd19zcGlfdHJhbnNmZXJfb25lKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCXN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zZmVyKQogewotCXN0cnVjdCBkd19zcGkgKmR3cyA9IChzdHJ1Y3QgZHdfc3BpICopZGF0YTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UgPSBOVUxMOwotCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyYW5zZmVyID0gTlVMTDsKLQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyICpwcmV2aW91cyA9IE5VTEw7Ci0Jc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IE5VTEw7Ci0Jc3RydWN0IGNoaXBfZGF0YSAqY2hpcCA9IE5VTEw7Ci0JdTggYml0cyA9IDA7CisJc3RydWN0IGR3X3NwaSAqZHdzID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXAgPSBzcGlfZ2V0X2N0bGRhdGEoc3BpKTsKIAl1OCBpbWFzayA9IDA7Ci0JdTggY3NfY2hhbmdlID0gMDsKLQl1MTYgdHhpbnRfbGV2ZWwgPSAwOworCXUxNiB0eGxldmVsID0gMDsKIAl1MTYgY2xrX2RpdiA9IDA7CiAJdTMyIHNwZWVkID0gMDsKIAl1MzIgY3IwID0gMDsKKwlpbnQgcmV0OwogCi0JLyogR2V0IGN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24gKi8KLQltZXNzYWdlID0gZHdzLT5jdXJfbXNnOwotCXRyYW5zZmVyID0gZHdzLT5jdXJfdHJhbnNmZXI7Ci0JY2hpcCA9IGR3cy0+Y3VyX2NoaXA7Ci0Jc3BpID0gbWVzc2FnZS0+c3BpOwotCi0JaWYgKG1lc3NhZ2UtPnN0YXRlID09IEVSUk9SX1NUQVRFKSB7Ci0JCW1lc3NhZ2UtPnN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gZWFybHlfZXhpdDsKLQl9Ci0KLQkvKiBIYW5kbGUgZW5kIG9mIG1lc3NhZ2UgKi8KLQlpZiAobWVzc2FnZS0+c3RhdGUgPT0gRE9ORV9TVEFURSkgewotCQltZXNzYWdlLT5zdGF0dXMgPSAwOwotCQlnb3RvIGVhcmx5X2V4aXQ7Ci0JfQotCi0JLyogRGVsYXkgaWYgcmVxdWVzdGVkIGF0IGVuZCBvZiB0cmFuc2ZlciAqLwotCWlmIChtZXNzYWdlLT5zdGF0ZSA9PSBSVU5OSU5HX1NUQVRFKSB7Ci0JCXByZXZpb3VzID0gbGlzdF9lbnRyeSh0cmFuc2Zlci0+dHJhbnNmZXJfbGlzdC5wcmV2LAotCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAotCQkJCQl0cmFuc2Zlcl9saXN0KTsKLQkJaWYgKHByZXZpb3VzLT5kZWxheV91c2VjcykKLQkJCXVkZWxheShwcmV2aW91cy0+ZGVsYXlfdXNlY3MpOwotCX0KLQorCWR3cy0+ZG1hX21hcHBlZCA9IDA7CiAJZHdzLT5uX2J5dGVzID0gY2hpcC0+bl9ieXRlczsKIAlkd3MtPmRtYV93aWR0aCA9IGNoaXAtPmRtYV93aWR0aDsKLQlkd3MtPmNzX2NvbnRyb2wgPSBjaGlwLT5jc19jb250cm9sOwogCi0JZHdzLT5yeF9kbWEgPSB0cmFuc2Zlci0+cnhfZG1hOwotCWR3cy0+dHhfZG1hID0gdHJhbnNmZXItPnR4X2RtYTsKIAlkd3MtPnR4ID0gKHZvaWQgKil0cmFuc2Zlci0+dHhfYnVmOwogCWR3cy0+dHhfZW5kID0gZHdzLT50eCArIHRyYW5zZmVyLT5sZW47CiAJZHdzLT5yeCA9IHRyYW5zZmVyLT5yeF9idWY7CiAJZHdzLT5yeF9lbmQgPSBkd3MtPnJ4ICsgdHJhbnNmZXItPmxlbjsKLQlkd3MtPmxlbiA9IGR3cy0+Y3VyX3RyYW5zZmVyLT5sZW47Ci0JaWYgKGNoaXAgIT0gZHdzLT5wcmV2X2NoaXApCi0JCWNzX2NoYW5nZSA9IDE7CisJZHdzLT5sZW4gPSB0cmFuc2Zlci0+bGVuOworCisJc3BpX2VuYWJsZV9jaGlwKGR3cywgMCk7CiAKIAljcjAgPSBjaGlwLT5jcjA7CiAKQEAgLTQxNiwzMiArMzEyLDM3IEBACiAJaWYgKHRyYW5zZmVyLT5zcGVlZF9oeikgewogCQlzcGVlZCA9IGNoaXAtPnNwZWVkX2h6OwogCi0JCWlmICgodHJhbnNmZXItPnNwZWVkX2h6ICE9IHNwZWVkKSB8fCAoIWNoaXAtPmNsa19kaXYpKSB7CisJCWlmICgodHJhbnNmZXItPnNwZWVkX2h6ICE9IHNwZWVkKSB8fCAhY2hpcC0+Y2xrX2RpdikgewogCQkJc3BlZWQgPSB0cmFuc2Zlci0+c3BlZWRfaHo7CiAKIAkJCS8qIGNsa19kaXYgZG9lc24ndCBzdXBwb3J0IG9kZCBudW1iZXIgKi8KLQkJCWNsa19kaXYgPSBkd3MtPm1heF9mcmVxIC8gc3BlZWQ7Ci0JCQljbGtfZGl2ID0gKGNsa19kaXYgKyAxKSAmIDB4ZmZmZTsKKwkJCWNsa19kaXYgPSAoZHdzLT5tYXhfZnJlcSAvIHNwZWVkICsgMSkgJiAweGZmZmU7CiAKIAkJCWNoaXAtPnNwZWVkX2h6ID0gc3BlZWQ7CiAJCQljaGlwLT5jbGtfZGl2ID0gY2xrX2RpdjsKKworCQkJc3BpX3NldF9jbGsoZHdzLCBjaGlwLT5jbGtfZGl2KTsKIAkJfQogCX0KIAlpZiAodHJhbnNmZXItPmJpdHNfcGVyX3dvcmQpIHsKLQkJYml0cyA9IHRyYW5zZmVyLT5iaXRzX3Blcl93b3JkOwotCQlkd3MtPm5fYnl0ZXMgPSBkd3MtPmRtYV93aWR0aCA9IGJpdHMgPj4gMzsKLQkJY3IwID0gKGJpdHMgLSAxKQorCQlpZiAodHJhbnNmZXItPmJpdHNfcGVyX3dvcmQgPT0gOCkgeworCQkJZHdzLT5uX2J5dGVzID0gMTsKKwkJCWR3cy0+ZG1hX3dpZHRoID0gMTsKKwkJfSBlbHNlIGlmICh0cmFuc2Zlci0+Yml0c19wZXJfd29yZCA9PSAxNikgeworCQkJZHdzLT5uX2J5dGVzID0gMjsKKwkJCWR3cy0+ZG1hX3dpZHRoID0gMjsKKwkJfQorCQljcjAgPSAodHJhbnNmZXItPmJpdHNfcGVyX3dvcmQgLSAxKQogCQkJfCAoY2hpcC0+dHlwZSA8PCBTUElfRlJGX09GRlNFVCkKIAkJCXwgKHNwaS0+bW9kZSA8PCBTUElfTU9ERV9PRkZTRVQpCiAJCQl8IChjaGlwLT50bW9kZSA8PCBTUElfVE1PRF9PRkZTRVQpOwogCX0KLQltZXNzYWdlLT5zdGF0ZSA9IFJVTk5JTkdfU1RBVEU7CiAKIAkvKgogCSAqIEFkanVzdCB0cmFuc2ZlciBtb2RlIGlmIG5lY2Vzc2FyeS4gUmVxdWlyZXMgcGxhdGZvcm0gZGVwZW5kZW50CiAJICogY2hpcHNlbGVjdCBtZWNoYW5pc20uCiAJICovCi0JaWYgKGR3cy0+Y3NfY29udHJvbCkgeworCWlmIChjaGlwLT5jc19jb250cm9sKSB7CiAJCWlmIChkd3MtPnJ4ICYmIGR3cy0+dHgpCiAJCQljaGlwLT50bW9kZSA9IFNQSV9UTU9EX1RSOwogCQllbHNlIGlmIChkd3MtPnJ4KQpAQCAtNDUzLDgwICszNTQsNjAgQEAKIAkJY3IwIHw9IChjaGlwLT50bW9kZSA8PCBTUElfVE1PRF9PRkZTRVQpOwogCX0KIAorCWR3X3dyaXRlbChkd3MsIERXX1NQSV9DVFJMMCwgY3IwKTsKKwogCS8qIENoZWNrIGlmIGN1cnJlbnQgdHJhbnNmZXIgaXMgYSBETUEgdHJhbnNhY3Rpb24gKi8KLQlkd3MtPmRtYV9tYXBwZWQgPSBtYXBfZG1hX2J1ZmZlcnMoZHdzKTsKKwlpZiAobWFzdGVyLT5jYW5fZG1hICYmIG1hc3Rlci0+Y2FuX2RtYShtYXN0ZXIsIHNwaSwgdHJhbnNmZXIpKQorCQlkd3MtPmRtYV9tYXBwZWQgPSBtYXN0ZXItPmN1cl9tc2dfbWFwcGVkOworCisJLyogRm9yIHBvbGwgbW9kZSBqdXN0IGRpc2FibGUgYWxsIGludGVycnVwdHMgKi8KKwlzcGlfbWFza19pbnRyKGR3cywgMHhmZik7CiAKIAkvKgogCSAqIEludGVycnVwdCBtb2RlCiAJICogd2Ugb25seSBuZWVkIHNldCB0aGUgVFhFSSBJUlEsIGFzIFRYL1JYIGFsd2F5cyBoYXBwZW4gc3luY3Jvbml6ZWx5CiAJICovCi0JaWYgKCFkd3MtPmRtYV9tYXBwZWQgJiYgIWNoaXAtPnBvbGxfbW9kZSkgewotCQlpbnQgdGVtcGxlbiA9IGR3cy0+bGVuIC8gZHdzLT5uX2J5dGVzOworCWlmIChkd3MtPmRtYV9tYXBwZWQpIHsKKwkJcmV0ID0gZHdzLT5kbWFfb3BzLT5kbWFfc2V0dXAoZHdzLCB0cmFuc2Zlcik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlzcGlfZW5hYmxlX2NoaXAoZHdzLCAxKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgaWYgKCFjaGlwLT5wb2xsX21vZGUpIHsKKwkJdHhsZXZlbCA9IG1pbl90KHUxNiwgZHdzLT5maWZvX2xlbiAvIDIsIGR3cy0+bGVuIC8gZHdzLT5uX2J5dGVzKTsKKwkJZHdfd3JpdGVsKGR3cywgRFdfU1BJX1RYRkxUUiwgdHhsZXZlbCk7CiAKLQkJdHhpbnRfbGV2ZWwgPSBkd3MtPmZpZm9fbGVuIC8gMjsKLQkJdHhpbnRfbGV2ZWwgPSAodGVtcGxlbiA+IHR4aW50X2xldmVsKSA/IHR4aW50X2xldmVsIDogdGVtcGxlbjsKLQorCQkvKiBTZXQgdGhlIGludGVycnVwdCBtYXNrICovCiAJCWltYXNrIHw9IFNQSV9JTlRfVFhFSSB8IFNQSV9JTlRfVFhPSSB8CiAJCQkgU1BJX0lOVF9SWFVJIHwgU1BJX0lOVF9SWE9JOworCQlzcGlfdW1hc2tfaW50cihkd3MsIGltYXNrKTsKKwogCQlkd3MtPnRyYW5zZmVyX2hhbmRsZXIgPSBpbnRlcnJ1cHRfdHJhbnNmZXI7CiAJfQogCi0JLyoKLQkgKiBSZXByb2dyYW0gcmVnaXN0ZXJzIG9ubHkgaWYKLQkgKgkxLiBjaGlwIHNlbGVjdCBjaGFuZ2VzCi0JICoJMi4gY2xrX2RpdiBpcyBjaGFuZ2VkCi0JICoJMy4gY29udHJvbCB2YWx1ZSBjaGFuZ2VzCi0JICovCi0JaWYgKGR3X3JlYWR3KGR3cywgRFdfU1BJX0NUUkwwKSAhPSBjcjAgfHwgY3NfY2hhbmdlIHx8IGNsa19kaXYgfHwgaW1hc2spIHsKLQkJc3BpX2VuYWJsZV9jaGlwKGR3cywgMCk7CisJc3BpX2VuYWJsZV9jaGlwKGR3cywgMSk7CiAKLQkJaWYgKGR3X3JlYWR3KGR3cywgRFdfU1BJX0NUUkwwKSAhPSBjcjApCi0JCQlkd193cml0ZXcoZHdzLCBEV19TUElfQ1RSTDAsIGNyMCk7Ci0KLQkJc3BpX3NldF9jbGsoZHdzLCBjbGtfZGl2ID8gY2xrX2RpdiA6IGNoaXAtPmNsa19kaXYpOwotCQlzcGlfY2hpcF9zZWwoZHdzLCBzcGksIDEpOwotCi0JCS8qIFNldCB0aGUgaW50ZXJydXB0IG1hc2ssIGZvciBwb2xsIG1vZGUganVzdCBkaXNhYmxlIGFsbCBpbnQgKi8KLQkJc3BpX21hc2tfaW50cihkd3MsIDB4ZmYpOwotCQlpZiAoaW1hc2spCi0JCQlzcGlfdW1hc2tfaW50cihkd3MsIGltYXNrKTsKLQkJaWYgKHR4aW50X2xldmVsKQotCQkJZHdfd3JpdGV3KGR3cywgRFdfU1BJX1RYRkxUUiwgdHhpbnRfbGV2ZWwpOwotCi0JCXNwaV9lbmFibGVfY2hpcChkd3MsIDEpOwotCQlpZiAoY3NfY2hhbmdlKQotCQkJZHdzLT5wcmV2X2NoaXAgPSBjaGlwOworCWlmIChkd3MtPmRtYV9tYXBwZWQpIHsKKwkJcmV0ID0gZHdzLT5kbWFfb3BzLT5kbWFfdHJhbnNmZXIoZHdzLCB0cmFuc2Zlcik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlpZiAoZHdzLT5kbWFfbWFwcGVkKQotCQlkd3MtPmRtYV9vcHMtPmRtYV90cmFuc2Zlcihkd3MsIGNzX2NoYW5nZSk7Ci0KIAlpZiAoY2hpcC0+cG9sbF9tb2RlKQotCQlwb2xsX3RyYW5zZmVyKGR3cyk7CisJCXJldHVybiBwb2xsX3RyYW5zZmVyKGR3cyk7CiAKLQlyZXR1cm47Ci0KLWVhcmx5X2V4aXQ6Ci0JZ2l2ZWJhY2soZHdzKTsKKwlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBkd19zcGlfdHJhbnNmZXJfb25lX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKK3N0YXRpYyB2b2lkIGR3X3NwaV9oYW5kbGVfZXJyKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCiAJCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQogewogCXN0cnVjdCBkd19zcGkgKmR3cyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIAotCWR3cy0+Y3VyX21zZyA9IG1zZzsKLQkvKiBJbml0aWFsIG1lc3NhZ2Ugc3RhdGUgKi8KLQlkd3MtPmN1cl9tc2ctPnN0YXRlID0gU1RBUlRfU1RBVEU7Ci0JZHdzLT5jdXJfdHJhbnNmZXIgPSBsaXN0X2VudHJ5KGR3cy0+Y3VyX21zZy0+dHJhbnNmZXJzLm5leHQsCi0JCQkJCQlzdHJ1Y3Qgc3BpX3RyYW5zZmVyLAotCQkJCQkJdHJhbnNmZXJfbGlzdCk7Ci0JZHdzLT5jdXJfY2hpcCA9IHNwaV9nZXRfY3RsZGF0YShkd3MtPmN1cl9tc2ctPnNwaSk7CisJaWYgKGR3cy0+ZG1hX21hcHBlZCkKKwkJZHdzLT5kbWFfb3BzLT5kbWFfc3RvcChkd3MpOwogCi0JLyogTGF1bmNoIHRyYW5zZmVycyAqLwotCXRhc2tsZXRfc2NoZWR1bGUoJmR3cy0+cHVtcF90cmFuc2ZlcnMpOwotCi0JcmV0dXJuIDA7CisJc3BpX3Jlc2V0X2NoaXAoZHdzKTsKIH0KIAogLyogVGhpcyBtYXkgYmUgY2FsbGVkIHR3aWNlIGZvciBlYWNoIHNwaSBkZXYgKi8KQEAgLTU2MSw4ICs0NDIsNiBAQAogCiAJCWNoaXAtPnJ4X3RocmVzaG9sZCA9IDA7CiAJCWNoaXAtPnR4X3RocmVzaG9sZCA9IDA7Ci0KLQkJY2hpcC0+ZW5hYmxlX2RtYSA9IGNoaXBfaW5mby0+ZW5hYmxlX2RtYTsKIAl9CiAKIAlpZiAoc3BpLT5iaXRzX3Blcl93b3JkID09IDgpIHsKQEAgLTYxMCw5ICs0ODksNyBAQAogLyogUmVzdGFydCB0aGUgY29udHJvbGxlciwgZGlzYWJsZSBhbGwgaW50ZXJydXB0cywgY2xlYW4gcnggZmlmbyAqLwogc3RhdGljIHZvaWQgc3BpX2h3X2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZHdfc3BpICpkd3MpCiB7Ci0Jc3BpX2VuYWJsZV9jaGlwKGR3cywgMCk7Ci0Jc3BpX21hc2tfaW50cihkd3MsIDB4ZmYpOwotCXNwaV9lbmFibGVfY2hpcChkd3MsIDEpOworCXNwaV9yZXNldF9jaGlwKGR3cyk7CiAKIAkvKgogCSAqIFRyeSB0byBkZXRlY3QgdGhlIEZJRk8gZGVwdGggaWYgbm90IHNldCBieSBpbnRlcmZhY2UgZHJpdmVyLApAQCAtNjIyLDExICs0OTksMTEgQEAKIAkJdTMyIGZpZm87CiAKIAkJZm9yIChmaWZvID0gMTsgZmlmbyA8IDI1NjsgZmlmbysrKSB7Ci0JCQlkd193cml0ZXcoZHdzLCBEV19TUElfVFhGTFRSLCBmaWZvKTsKLQkJCWlmIChmaWZvICE9IGR3X3JlYWR3KGR3cywgRFdfU1BJX1RYRkxUUikpCisJCQlkd193cml0ZWwoZHdzLCBEV19TUElfVFhGTFRSLCBmaWZvKTsKKwkJCWlmIChmaWZvICE9IGR3X3JlYWRsKGR3cywgRFdfU1BJX1RYRkxUUikpCiAJCQkJYnJlYWs7CiAJCX0KLQkJZHdfd3JpdGV3KGR3cywgRFdfU1BJX1RYRkxUUiwgMCk7CisJCWR3X3dyaXRlbChkd3MsIERXX1NQSV9UWEZMVFIsIDApOwogCiAJCWR3cy0+Zmlmb19sZW4gPSAoZmlmbyA9PSAxKSA/IDAgOiBmaWZvOwogCQlkZXZfZGJnKGRldiwgIkRldGVjdGVkIEZJRk8gc2l6ZTogJXUgYnl0ZXNcbiIsIGR3cy0+Zmlmb19sZW4pOwpAQCAtNjQ2LDEzICs1MjMsMTIgQEAKIAogCWR3cy0+bWFzdGVyID0gbWFzdGVyOwogCWR3cy0+dHlwZSA9IFNTSV9NT1RPX1NQSTsKLQlkd3MtPnByZXZfY2hpcCA9IE5VTEw7CiAJZHdzLT5kbWFfaW5pdGVkID0gMDsKIAlkd3MtPmRtYV9hZGRyID0gKGRtYV9hZGRyX3QpKGR3cy0+cGFkZHIgKyAweDYwKTsKIAlzbnByaW50Zihkd3MtPm5hbWUsIHNpemVvZihkd3MtPm5hbWUpLCAiZHdfc3BpJWQiLCBkd3MtPmJ1c19udW0pOwogCiAJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGR3cy0+aXJxLCBkd19zcGlfaXJxLCBJUlFGX1NIQVJFRCwKLQkJCWR3cy0+bmFtZSwgZHdzKTsKKwkJCWR3cy0+bmFtZSwgbWFzdGVyKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZtYXN0ZXItPmRldiwgImNhbiBub3QgZ2V0IElSUVxuIik7CiAJCWdvdG8gZXJyX2ZyZWVfbWFzdGVyOwpAQCAtNjY0LDcgKzU0MCw5IEBACiAJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IGR3cy0+bnVtX2NzOwogCW1hc3Rlci0+c2V0dXAgPSBkd19zcGlfc2V0dXA7CiAJbWFzdGVyLT5jbGVhbnVwID0gZHdfc3BpX2NsZWFudXA7Ci0JbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IGR3X3NwaV90cmFuc2Zlcl9vbmVfbWVzc2FnZTsKKwltYXN0ZXItPnNldF9jcyA9IGR3X3NwaV9zZXRfY3M7CisJbWFzdGVyLT50cmFuc2Zlcl9vbmUgPSBkd19zcGlfdHJhbnNmZXJfb25lOworCW1hc3Rlci0+aGFuZGxlX2VyciA9IGR3X3NwaV9oYW5kbGVfZXJyOwogCW1hc3Rlci0+bWF4X3NwZWVkX2h6ID0gZHdzLT5tYXhfZnJlcTsKIAltYXN0ZXItPmRldi5vZl9ub2RlID0gZGV2LT5vZl9ub2RlOwogCkBAIC02NzYsMTEgKzU1NCwxMSBAQAogCQlpZiAocmV0KSB7CiAJCQlkZXZfd2FybihkZXYsICJETUEgaW5pdCBmYWlsZWRcbiIpOwogCQkJZHdzLT5kbWFfaW5pdGVkID0gMDsKKwkJfSBlbHNlIHsKKwkJCW1hc3Rlci0+Y2FuX2RtYSA9IGR3cy0+ZG1hX29wcy0+Y2FuX2RtYTsKIAkJfQogCX0KIAotCXRhc2tsZXRfaW5pdCgmZHdzLT5wdW1wX3RyYW5zZmVycywgcHVtcF90cmFuc2ZlcnMsICh1bnNpZ25lZCBsb25nKWR3cyk7Ci0KIAlzcGlfbWFzdGVyX3NldF9kZXZkYXRhKG1hc3RlciwgZHdzKTsKIAlyZXQgPSBkZXZtX3NwaV9yZWdpc3Rlcl9tYXN0ZXIoZGV2LCBtYXN0ZXIpOwogCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1kdy5oIGIvZHJpdmVycy9zcGkvc3BpLWR3LmgKaW5kZXggM2QzMmJlNi4uNmM5MTM5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWR3LmgKKysrIGIvZHJpdmVycy9zcGkvc3BpLWR3LmgKQEAgLTkxLDEyICs5MSwxNSBAQAogc3RydWN0IGR3X3NwaV9kbWFfb3BzIHsKIAlpbnQgKCpkbWFfaW5pdCkoc3RydWN0IGR3X3NwaSAqZHdzKTsKIAl2b2lkICgqZG1hX2V4aXQpKHN0cnVjdCBkd19zcGkgKmR3cyk7Ci0JaW50ICgqZG1hX3RyYW5zZmVyKShzdHJ1Y3QgZHdfc3BpICpkd3MsIGludCBjc19jaGFuZ2UpOworCWludCAoKmRtYV9zZXR1cCkoc3RydWN0IGR3X3NwaSAqZHdzLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKTsKKwlib29sICgqY2FuX2RtYSkoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKKwkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpOworCWludCAoKmRtYV90cmFuc2Zlcikoc3RydWN0IGR3X3NwaSAqZHdzLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKTsKKwl2b2lkICgqZG1hX3N0b3ApKHN0cnVjdCBkd19zcGkgKmR3cyk7CiB9OwogCiBzdHJ1Y3QgZHdfc3BpIHsKIAlzdHJ1Y3Qgc3BpX21hc3RlcgkqbWFzdGVyOwotCXN0cnVjdCBzcGlfZGV2aWNlCSpjdXJfZGV2OwogCWVudW0gZHdfc3NpX3R5cGUJdHlwZTsKIAljaGFyCQkJbmFtZVsxNl07CiAKQEAgLTEwOSw0MSArMTEyLDI2IEBACiAJdTE2CQkJYnVzX251bTsKIAl1MTYJCQludW1fY3M7CQkvKiBzdXBwb3J0ZWQgc2xhdmUgbnVtYmVycyAqLwogCi0JLyogTWVzc2FnZSBUcmFuc2ZlciBwdW1wICovCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CXB1bXBfdHJhbnNmZXJzOwotCiAJLyogQ3VycmVudCBtZXNzYWdlIHRyYW5zZmVyIHN0YXRlIGluZm8gKi8KLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UJKmN1cl9tc2c7Ci0Jc3RydWN0IHNwaV90cmFuc2ZlcgkqY3VyX3RyYW5zZmVyOwotCXN0cnVjdCBjaGlwX2RhdGEJKmN1cl9jaGlwOwotCXN0cnVjdCBjaGlwX2RhdGEJKnByZXZfY2hpcDsKIAlzaXplX3QJCQlsZW47CiAJdm9pZAkJCSp0eDsKIAl2b2lkCQkJKnR4X2VuZDsKIAl2b2lkCQkJKnJ4OwogCXZvaWQJCQkqcnhfZW5kOwogCWludAkJCWRtYV9tYXBwZWQ7Ci0JZG1hX2FkZHJfdAkJcnhfZG1hOwotCWRtYV9hZGRyX3QJCXR4X2RtYTsKLQlzaXplX3QJCQlyeF9tYXBfbGVuOwotCXNpemVfdAkJCXR4X21hcF9sZW47CiAJdTgJCQluX2J5dGVzOwkvKiBjdXJyZW50IGlzIGEgMS8yIGJ5dGVzIG9wICovCi0JdTgJCQltYXhfYml0c19wZXJfd29yZDsJLyogbWF4aW0gaXMgMTZiICovCiAJdTMyCQkJZG1hX3dpZHRoOwogCWlycXJldHVybl90CQkoKnRyYW5zZmVyX2hhbmRsZXIpKHN0cnVjdCBkd19zcGkgKmR3cyk7Ci0Jdm9pZAkJCSgqY3NfY29udHJvbCkodTMyIGNvbW1hbmQpOwogCi0JLyogRG1hIGluZm8gKi8KKwkvKiBETUEgaW5mbyAqLwogCWludAkJCWRtYV9pbml0ZWQ7CiAJc3RydWN0IGRtYV9jaGFuCQkqdHhjaGFuOwotCXN0cnVjdCBzY2F0dGVybGlzdAl0eF9zZ2w7CiAJc3RydWN0IGRtYV9jaGFuCQkqcnhjaGFuOwotCXN0cnVjdCBzY2F0dGVybGlzdAlyeF9zZ2w7CiAJdW5zaWduZWQgbG9uZwkJZG1hX2NoYW5fYnVzeTsKLQlzdHJ1Y3QgZGV2aWNlCQkqZG1hX2RldjsKIAlkbWFfYWRkcl90CQlkbWFfYWRkcjsgLyogcGh5IGFkZHJlc3Mgb2YgdGhlIERhdGEgcmVnaXN0ZXIgKi8KIAlzdHJ1Y3QgZHdfc3BpX2RtYV9vcHMJKmRtYV9vcHM7Ci0Jdm9pZAkJCSpkbWFfcHJpdjsgLyogcGxhdGZvcm0gcmVsYXRlIGluZm8gKi8KKwl2b2lkCQkJKmRtYV90eDsKKwl2b2lkCQkJKmRtYV9yeDsKIAogCS8qIEJ1cyBpbnRlcmZhY2UgaW5mbyAqLwogCXZvaWQJCQkqcHJpdjsKQEAgLTE2MiwxNiArMTUwLDYgQEAKIAlfX3Jhd193cml0ZWwodmFsLCBkd3MtPnJlZ3MgKyBvZmZzZXQpOwogfQogCi1zdGF0aWMgaW5saW5lIHUxNiBkd19yZWFkdyhzdHJ1Y3QgZHdfc3BpICpkd3MsIHUzMiBvZmZzZXQpCi17Ci0JcmV0dXJuIF9fcmF3X3JlYWR3KGR3cy0+cmVncyArIG9mZnNldCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBkd193cml0ZXcoc3RydWN0IGR3X3NwaSAqZHdzLCB1MzIgb2Zmc2V0LCB1MTYgdmFsKQotewotCV9fcmF3X3dyaXRldyh2YWwsIGR3cy0+cmVncyArIG9mZnNldCk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBzcGlfZW5hYmxlX2NoaXAoc3RydWN0IGR3X3NwaSAqZHdzLCBpbnQgZW5hYmxlKQogewogCWR3X3dyaXRlbChkd3MsIERXX1NQSV9TU0lFTlIsIChlbmFibGUgPyAxIDogMCkpOwpAQCAtMTgyLDIyICsxNjAsNiBAQAogCWR3X3dyaXRlbChkd3MsIERXX1NQSV9CQVVEUiwgZGl2KTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNwaV9jaGlwX3NlbChzdHJ1Y3QgZHdfc3BpICpkd3MsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCi0JCWludCBhY3RpdmUpCi17Ci0JdTE2IGNzID0gc3BpLT5jaGlwX3NlbGVjdDsKLQlpbnQgZ3Bpb192YWwgPSBhY3RpdmUgPyAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpIDoKLQkJIShzcGktPm1vZGUgJiBTUElfQ1NfSElHSCk7Ci0KLQlpZiAoZHdzLT5jc19jb250cm9sKQotCQlkd3MtPmNzX2NvbnRyb2woYWN0aXZlKTsKLQlpZiAoZ3Bpb19pc192YWxpZChzcGktPmNzX2dwaW8pKQotCQlncGlvX3NldF92YWx1ZShzcGktPmNzX2dwaW8sIGdwaW9fdmFsKTsKLQotCWlmIChhY3RpdmUpCi0JCWR3X3dyaXRlbChkd3MsIERXX1NQSV9TRVIsIDEgPDwgY3MpOwotfQotCiAvKiBEaXNhYmxlIElSUSBiaXRzICovCiBzdGF0aWMgaW5saW5lIHZvaWQgc3BpX21hc2tfaW50cihzdHJ1Y3QgZHdfc3BpICpkd3MsIHUzMiBtYXNrKQogewpAQCAtMjE3LDE1ICsxNzksMjYgQEAKIH0KIAogLyoKKyAqIFRoaXMgZG9lcyBkaXNhYmxlIHRoZSBTUEkgY29udHJvbGxlciwgaW50ZXJydXB0cywgYW5kIHJlLWVuYWJsZSB0aGUKKyAqIGNvbnRyb2xsZXIgYmFjay4gVHJhbnNtaXQgYW5kIHJlY2VpdmUgRklGTyBidWZmZXJzIGFyZSBjbGVhcmVkIHdoZW4gdGhlCisgKiBkZXZpY2UgaXMgZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzcGlfcmVzZXRfY2hpcChzdHJ1Y3QgZHdfc3BpICpkd3MpCit7CisJc3BpX2VuYWJsZV9jaGlwKGR3cywgMCk7CisJc3BpX21hc2tfaW50cihkd3MsIDB4ZmYpOworCXNwaV9lbmFibGVfY2hpcChkd3MsIDEpOworfQorCisvKgogICogRWFjaCBTUEkgc2xhdmUgZGV2aWNlIHRvIHdvcmsgd2l0aCBkd19hcGkgY29udHJvbGxlciBzaG91bGQKLSAqIGhhcyBzdWNoIGEgc3RydWN0dXJlIGNsYWltaW5nIGl0cyB3b3JraW5nIG1vZGUgKFBJTy9ETUEgZXRjKSwKKyAqIGhhcyBzdWNoIGEgc3RydWN0dXJlIGNsYWltaW5nIGl0cyB3b3JraW5nIG1vZGUgKHBvbGwgb3IgUElPL0RNQSksCiAgKiB3aGljaCBjYW4gYmUgc2F2ZSBpbiB0aGUgImNvbnRyb2xsZXJfZGF0YSIgbWVtYmVyIG9mIHRoZQogICogc3RydWN0IHNwaV9kZXZpY2UuCiAgKi8KIHN0cnVjdCBkd19zcGlfY2hpcCB7CiAJdTggcG9sbF9tb2RlOwkvKiAxIGZvciBjb250cm9sbGVyIHBvbGxpbmcgbW9kZSAqLwogCXU4IHR5cGU7CS8qIFNQSS9TU1AvTWljcm9XaXJlICovCi0JdTggZW5hYmxlX2RtYTsKIAl2b2lkICgqY3NfY29udHJvbCkodTMyIGNvbW1hbmQpOwogfTsKIApAQCAtMjMzLDcgKzIwNiw2IEBACiBleHRlcm4gdm9pZCBkd19zcGlfcmVtb3ZlX2hvc3Qoc3RydWN0IGR3X3NwaSAqZHdzKTsKIGV4dGVybiBpbnQgZHdfc3BpX3N1c3BlbmRfaG9zdChzdHJ1Y3QgZHdfc3BpICpkd3MpOwogZXh0ZXJuIGludCBkd19zcGlfcmVzdW1lX2hvc3Qoc3RydWN0IGR3X3NwaSAqZHdzKTsKLWV4dGVybiB2b2lkIGR3X3NwaV94ZmVyX2RvbmUoc3RydWN0IGR3X3NwaSAqZHdzKTsKIAogLyogcGxhdGZvcm0gcmVsYXRlZCBzZXR1cCAqLwogZXh0ZXJuIGludCBkd19zcGlfbWlkX2luaXQoc3RydWN0IGR3X3NwaSAqZHdzKTsgLyogSW50ZWwgTUlEIHBsYXRmb3JtcyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZzbC1kc3BpLmMgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWRzcGkuYwppbmRleCBkMWEzOTI0Li41ZmU1NGNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktZnNsLWRzcGkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktZnNsLWRzcGkuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KQEAgLTI5LDYgKzMwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpX2JpdGJhbmcuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAKICNkZWZpbmUgRFJJVkVSX05BTUUgImZzbC1kc3BpIgogCkBAIC01MSw3ICs1Myw3IEBACiAjZGVmaW5lIFNQSV9DVEFSX0NQT0woeCkJKCh4KSA8PCAyNikKICNkZWZpbmUgU1BJX0NUQVJfQ1BIQSh4KQkoKHgpIDw8IDI1KQogI2RlZmluZSBTUElfQ1RBUl9MU0JGRSh4KQkoKHgpIDw8IDI0KQotI2RlZmluZSBTUElfQ1RBUl9QQ1NTQ1IoeCkJKCgoeCkgJiAweDAwMDAwMDAzKSA8PCAyMikKKyNkZWZpbmUgU1BJX0NUQVJfUENTU0NLKHgpCSgoKHgpICYgMHgwMDAwMDAwMykgPDwgMjIpCiAjZGVmaW5lIFNQSV9DVEFSX1BBU0MoeCkJKCgoeCkgJiAweDAwMDAwMDAzKSA8PCAyMCkKICNkZWZpbmUgU1BJX0NUQVJfUERUKHgpCSgoKHgpICYgMHgwMDAwMDAwMykgPDwgMTgpCiAjZGVmaW5lIFNQSV9DVEFSX1BCUih4KQkoKCh4KSAmIDB4MDAwMDAwMDMpIDw8IDE2KQpAQCAtNTksNiArNjEsNyBAQAogI2RlZmluZSBTUElfQ1RBUl9BU0MoeCkJKCgoeCkgJiAweDAwMDAwMDBmKSA8PCA4KQogI2RlZmluZSBTUElfQ1RBUl9EVCh4KQkJKCgoeCkgJiAweDAwMDAwMDBmKSA8PCA0KQogI2RlZmluZSBTUElfQ1RBUl9CUih4KQkJKCh4KSAmIDB4MDAwMDAwMGYpCisjZGVmaW5lIFNQSV9DVEFSX1NDQUxFX0JJVFMJMHhmCiAKICNkZWZpbmUgU1BJX0NUQVIwX1NMQVZFCTB4MGMKIApAQCAtMTQ4LDIzICsxNTEsNjYgQEAKIAkJMTYsCTMyLAk2NCwJMTI4LAogCQkyNTYsCTUxMiwJMTAyNCwJMjA0OCwKIAkJNDA5NiwJODE5MiwJMTYzODQsCTMyNzY4IH07Ci0JaW50IHRlbXAsIGkgPSAwLCBqID0gMDsKKwlpbnQgc2NhbGVfbmVlZGVkLCBzY2FsZSwgbWluc2NhbGUgPSBJTlRfTUFYOworCWludCBpLCBqOwogCi0JdGVtcCA9IGNsa3JhdGUgLyAyIC8gc3BlZWRfaHo7CisJc2NhbGVfbmVlZGVkID0gY2xrcmF0ZSAvIHNwZWVkX2h6OworCWlmIChjbGtyYXRlICUgc3BlZWRfaHopCisJCXNjYWxlX25lZWRlZCsrOwogCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGJyX3RibCk7IGkrKykKLQkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoYnJzKTsgaisrKSB7Ci0JCQlpZiAocGJyX3RibFtpXSAqIGJyc1tqXSA+PSB0ZW1wKSB7Ci0JCQkJKnBiciA9IGk7Ci0JCQkJKmJyID0gajsKLQkJCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnJzKTsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShwYnJfdGJsKTsgaisrKSB7CisJCQlzY2FsZSA9IGJyc1tpXSAqIHBicl90Ymxbal07CisJCQlpZiAoc2NhbGUgPj0gc2NhbGVfbmVlZGVkKSB7CisJCQkJaWYgKHNjYWxlIDwgbWluc2NhbGUpIHsKKwkJCQkJbWluc2NhbGUgPSBzY2FsZTsKKwkJCQkJKmJyID0gaTsKKwkJCQkJKnBiciA9IGo7CisJCQkJfQorCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKLQlwcl93YXJuKCJDYW4gbm90IGZpbmQgdmFsaWQgYmF1ZCByYXRlLHNwZWVkX2h6IGlzICVkLGNsa3JhdGUgaXMgJWxkXAotCQksd2UgdXNlIHRoZSBtYXggcHJlc2NhbGVyIHZhbHVlLlxuIiwgc3BlZWRfaHosIGNsa3JhdGUpOwotCSpwYnIgPSBBUlJBWV9TSVpFKHBicl90YmwpIC0gMTsKLQkqYnIgPSAgQVJSQVlfU0laRShicnMpIC0gMTsKKwlpZiAobWluc2NhbGUgPT0gSU5UX01BWCkgeworCQlwcl93YXJuKCJDYW4gbm90IGZpbmQgdmFsaWQgYmF1ZCByYXRlLHNwZWVkX2h6IGlzICVkLGNsa3JhdGUgaXMgJWxkLCB3ZSB1c2UgdGhlIG1heCBwcmVzY2FsZXIgdmFsdWUuXG4iLAorCQkJc3BlZWRfaHosIGNsa3JhdGUpOworCQkqcGJyID0gQVJSQVlfU0laRShwYnJfdGJsKSAtIDE7CisJCSpiciA9ICBBUlJBWV9TSVpFKGJycykgLSAxOworCX0KK30KKworc3RhdGljIHZvaWQgbnNfZGVsYXlfc2NhbGUoY2hhciAqcHNjLCBjaGFyICpzYywgaW50IGRlbGF5X25zLAorCQl1bnNpZ25lZCBsb25nIGNsa3JhdGUpCit7CisJaW50IHBzY2FsZV90YmxbNF0gPSB7MSwgMywgNSwgN307CisJaW50IHNjYWxlX25lZWRlZCwgc2NhbGUsIG1pbnNjYWxlID0gSU5UX01BWDsKKwlpbnQgaSwgajsKKwl1MzIgcmVtYWluZGVyOworCisJc2NhbGVfbmVlZGVkID0gZGl2X3U2NF9yZW0oKHU2NClkZWxheV9ucyAqIGNsa3JhdGUsIE5TRUNfUEVSX1NFQywKKwkJCSZyZW1haW5kZXIpOworCWlmIChyZW1haW5kZXIpCisJCXNjYWxlX25lZWRlZCsrOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocHNjYWxlX3RibCk7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8PSBTUElfQ1RBUl9TQ0FMRV9CSVRTOyBqKyspIHsKKwkJCXNjYWxlID0gcHNjYWxlX3RibFtpXSAqICgyIDw8IGopOworCQkJaWYgKHNjYWxlID49IHNjYWxlX25lZWRlZCkgeworCQkJCWlmIChzY2FsZSA8IG1pbnNjYWxlKSB7CisJCQkJCW1pbnNjYWxlID0gc2NhbGU7CisJCQkJCSpwc2MgPSBpOworCQkJCQkqc2MgPSBqOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJaWYgKG1pbnNjYWxlID09IElOVF9NQVgpIHsKKwkJcHJfd2FybigiQ2Fubm90IGZpbmQgY29ycmVjdCBzY2FsZSB2YWx1ZXMgZm9yICVkbnMgZGVsYXkgYXQgY2xrcmF0ZSAlbGQsIHVzaW5nIG1heCBwcmVzY2FsZXIgdmFsdWUiLAorCQkJZGVsYXlfbnMsIGNsa3JhdGUpOworCQkqcHNjID0gQVJSQVlfU0laRShwc2NhbGVfdGJsKSAtIDE7CisJCSpzYyA9IFNQSV9DVEFSX1NDQUxFX0JJVFM7CisJfQogfQogCiBzdGF0aWMgaW50IGRzcGlfdHJhbnNmZXJfd3JpdGUoc3RydWN0IGZzbF9kc3BpICpkc3BpKQpAQCAtMzQ1LDcgKzM5MSwxMCBAQAogewogCXN0cnVjdCBjaGlwX2RhdGEgKmNoaXA7CiAJc3RydWN0IGZzbF9kc3BpICpkc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShzcGktPm1hc3Rlcik7Ci0JdW5zaWduZWQgY2hhciBiciA9IDAsIHBiciA9IDAsIGZtc3ogPSAwOworCXUzMiBjc19zY2tfZGVsYXkgPSAwLCBzY2tfY3NfZGVsYXkgPSAwOworCXVuc2lnbmVkIGNoYXIgYnIgPSAwLCBwYnIgPSAwLCBwY3NzY2sgPSAwLCBjc3NjayA9IDA7CisJdW5zaWduZWQgY2hhciBwYXNjID0gMCwgYXNjID0gMCwgZm1zeiA9IDA7CisJdW5zaWduZWQgbG9uZyBjbGtyYXRlOwogCiAJaWYgKChzcGktPmJpdHNfcGVyX3dvcmQgPj0gNCkgJiYgKHNwaS0+Yml0c19wZXJfd29yZCA8PSAxNikpIHsKIAkJZm1zeiA9IHNwaS0+Yml0c19wZXJfd29yZCAtIDE7CkBAIC0zNjIsMTggKzQxMSwzNCBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJb2ZfcHJvcGVydHlfcmVhZF91MzIoc3BpLT5kZXYub2Zfbm9kZSwgImZzbCxzcGktY3Mtc2NrLWRlbGF5IiwKKwkJCSZjc19zY2tfZGVsYXkpOworCisJb2ZfcHJvcGVydHlfcmVhZF91MzIoc3BpLT5kZXYub2Zfbm9kZSwgImZzbCxzcGktc2NrLWNzLWRlbGF5IiwKKwkJCSZzY2tfY3NfZGVsYXkpOworCiAJY2hpcC0+bWNyX3ZhbCA9IFNQSV9NQ1JfTUFTVEVSIHwgU1BJX01DUl9QQ1NJUyB8CiAJCVNQSV9NQ1JfQ0xSX1RYRiB8IFNQSV9NQ1JfQ0xSX1JYRjsKIAogCWNoaXAtPnZvaWRfd3JpdGVfZGF0YSA9IDA7CiAKLQloel90b19zcGlfYmF1ZCgmcGJyLCAmYnIsCi0JCQlzcGktPm1heF9zcGVlZF9oeiwgY2xrX2dldF9yYXRlKGRzcGktPmNsaykpOworCWNsa3JhdGUgPSBjbGtfZ2V0X3JhdGUoZHNwaS0+Y2xrKTsKKwloel90b19zcGlfYmF1ZCgmcGJyLCAmYnIsIHNwaS0+bWF4X3NwZWVkX2h6LCBjbGtyYXRlKTsKKworCS8qIFNldCBQQ1MgdG8gU0NLIGRlbGF5IHNjYWxlIHZhbHVlcyAqLworCW5zX2RlbGF5X3NjYWxlKCZwY3NzY2ssICZjc3NjaywgY3Nfc2NrX2RlbGF5LCBjbGtyYXRlKTsKKworCS8qIFNldCBBZnRlciBTQ0sgZGVsYXkgc2NhbGUgdmFsdWVzICovCisJbnNfZGVsYXlfc2NhbGUoJnBhc2MsICZhc2MsIHNja19jc19kZWxheSwgY2xrcmF0ZSk7CiAKIAljaGlwLT5jdGFyX3ZhbCA9ICBTUElfQ1RBUl9GTVNaKGZtc3opCiAJCXwgU1BJX0NUQVJfQ1BPTChzcGktPm1vZGUgJiBTUElfQ1BPTCA/IDEgOiAwKQogCQl8IFNQSV9DVEFSX0NQSEEoc3BpLT5tb2RlICYgU1BJX0NQSEEgPyAxIDogMCkKIAkJfCBTUElfQ1RBUl9MU0JGRShzcGktPm1vZGUgJiBTUElfTFNCX0ZJUlNUID8gMSA6IDApCisJCXwgU1BJX0NUQVJfUENTU0NLKHBjc3NjaykKKwkJfCBTUElfQ1RBUl9DU1NDSyhjc3NjaykKKwkJfCBTUElfQ1RBUl9QQVNDKHBhc2MpCisJCXwgU1BJX0NUQVJfQVNDKGFzYykKIAkJfCBTUElfQ1RBUl9QQlIocGJyKQogCQl8IFNQSV9DVEFSX0JSKGJyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWltZy1zcGZpLmMgYi9kcml2ZXJzL3NwaS9zcGktaW1nLXNwZmkuYwppbmRleCBlNjQ5YmM3Li43ODhlMmIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktaW1nLXNwZmkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktaW1nLXNwZmkuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CkBAIC0xMjIsMzYgKzEyMywzMSBAQAogCXNwZmlfd3JpdGVsKHNwZmksIHZhbCwgU1BGSV9DT05UUk9MKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNwZmlfc3RvcChzdHJ1Y3QgaW1nX3NwZmkgKnNwZmkpCi17Ci0JdTMyIHZhbDsKLQotCXZhbCA9IHNwZmlfcmVhZGwoc3BmaSwgU1BGSV9DT05UUk9MKTsKLQl2YWwgJj0gflNQRklfQ09OVFJPTF9TUEZJX0VOOwotCXNwZmlfd3JpdGVsKHNwZmksIHZhbCwgU1BGSV9DT05UUk9MKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIHNwZmlfcmVzZXQoc3RydWN0IGltZ19zcGZpICpzcGZpKQogewogCXNwZmlfd3JpdGVsKHNwZmksIFNQRklfQ09OVFJPTF9TT0ZUX1JFU0VULCBTUEZJX0NPTlRST0wpOwotCXVkZWxheSgxKTsKIAlzcGZpX3dyaXRlbChzcGZpLCAwLCBTUEZJX0NPTlRST0wpOwogfQogCi1zdGF0aWMgdm9pZCBzcGZpX2ZsdXNoX3R4X2ZpZm8oc3RydWN0IGltZ19zcGZpICpzcGZpKQorc3RhdGljIGludCBzcGZpX3dhaXRfYWxsX2RvbmUoc3RydWN0IGltZ19zcGZpICpzcGZpKQogewotCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwKTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MCk7CiAKLQlzcGZpX3dyaXRlbChzcGZpLCBTUEZJX0lOVEVSUlVQVF9TREUsIFNQRklfSU5URVJSVVBUX0NMRUFSKTsKIAl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpIHsKLQkJaWYgKHNwZmlfcmVhZGwoc3BmaSwgU1BGSV9JTlRFUlJVUFRfU1RBVFVTKSAmCi0JCSAgICBTUEZJX0lOVEVSUlVQVF9TREUpCi0JCQlyZXR1cm47CisJCXUzMiBzdGF0dXMgPSBzcGZpX3JlYWRsKHNwZmksIFNQRklfSU5URVJSVVBUX1NUQVRVUyk7CisKKwkJaWYgKHN0YXR1cyAmIFNQRklfSU5URVJSVVBUX0FMTERPTkVUUklHKSB7CisJCQlzcGZpX3dyaXRlbChzcGZpLCBTUEZJX0lOVEVSUlVQVF9BTExET05FVFJJRywKKwkJCQkgICAgU1BGSV9JTlRFUlJVUFRfQ0xFQVIpOworCQkJcmV0dXJuIDA7CisJCX0KIAkJY3B1X3JlbGF4KCk7CiAJfQogCi0JZGV2X2VycihzcGZpLT5kZXYsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgRklGTyB0byBkcmFpblxuIik7CisJZGV2X2VycihzcGZpLT5kZXYsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgdHJhbnNhY3Rpb24gdG8gY29tcGxldGVcbiIpOwogCXNwZmlfcmVzZXQoc3BmaSk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBzcGZpX3Bpb193cml0ZTMyKHN0cnVjdCBpbWdfc3BmaSAqc3BmaSwgY29uc3QgdTMyICpidWYsCkBAIC0yMzcsNiArMjMzLDcgQEAKIAljb25zdCB2b2lkICp0eF9idWYgPSB4ZmVyLT50eF9idWY7CiAJdm9pZCAqcnhfYnVmID0geGZlci0+cnhfYnVmOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgcmV0OwogCiAJaWYgKHR4X2J1ZikKIAkJdHhfYnl0ZXMgPSB4ZmVyLT5sZW47CkBAIC0yNjksMTYgKzI2NiwxNSBAQAogCQljcHVfcmVsYXgoKTsKIAl9CiAKKwlyZXQgPSBzcGZpX3dhaXRfYWxsX2RvbmUoc3BmaSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAlpZiAocnhfYnl0ZXMgPiAwIHx8IHR4X2J5dGVzID4gMCkgewogCQlkZXZfZXJyKHNwZmktPmRldiwgIlBJTyB0cmFuc2ZlciB0aW1lZCBvdXRcbiIpOwotCQlzcGZpX3Jlc2V0KHNwZmkpOwogCQlyZXR1cm4gLUVUSU1FRE9VVDsKIAl9CiAKLQlpZiAodHhfYnVmKQotCQlzcGZpX2ZsdXNoX3R4X2ZpZm8oc3BmaSk7Ci0Jc3BmaV9zdG9wKHNwZmkpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI4NywxNCArMjgzLDEyIEBACiAJc3RydWN0IGltZ19zcGZpICpzcGZpID0gZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3BmaV93YWl0X2FsbF9kb25lKHNwZmkpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNwZmktPmxvY2ssIGZsYWdzKTsKLQogCXNwZmktPnJ4X2RtYV9idXN5ID0gZmFsc2U7Ci0JaWYgKCFzcGZpLT50eF9kbWFfYnVzeSkgewotCQlzcGZpX3N0b3Aoc3BmaSk7CisJaWYgKCFzcGZpLT50eF9kbWFfYnVzeSkKIAkJc3BpX2ZpbmFsaXplX2N1cnJlbnRfdHJhbnNmZXIoc3BmaS0+bWFzdGVyKTsKLQl9Ci0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGZpLT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTMwMywxNiArMjk3LDEyIEBACiAJc3RydWN0IGltZ19zcGZpICpzcGZpID0gZGF0YTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3BmaV9mbHVzaF90eF9maWZvKHNwZmkpOworCXNwZmlfd2FpdF9hbGxfZG9uZShzcGZpKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzcGZpLT5sb2NrLCBmbGFncyk7Ci0KIAlzcGZpLT50eF9kbWFfYnVzeSA9IGZhbHNlOwotCWlmICghc3BmaS0+cnhfZG1hX2J1c3kpIHsKLQkJc3BmaV9zdG9wKHNwZmkpOworCWlmICghc3BmaS0+cnhfZG1hX2J1c3kpCiAJCXNwaV9maW5hbGl6ZV9jdXJyZW50X3RyYW5zZmVyKHNwZmktPm1hc3Rlcik7Ci0JfQotCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BmaS0+bG9jaywgZmxhZ3MpOwogfQogCkBAIC0zOTcsNiArMzg3LDc1IEBACiAJcmV0dXJuIC1FSU87CiB9CiAKK3N0YXRpYyB2b2lkIGltZ19zcGZpX2hhbmRsZV9lcnIoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgaW1nX3NwZmkgKnNwZmkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogU3RvcCBhbGwgRE1BIGFuZCByZXNldCB0aGUgY29udHJvbGxlciBpZiB0aGUgcHJldmlvdXMgdHJhbnNhY3Rpb24KKwkgKiB0aW1lZC1vdXQgYW5kIG5ldmVyIGNvbXBsZXRlZCBpdCdzIERNQS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3BmaS0+bG9jaywgZmxhZ3MpOworCWlmIChzcGZpLT50eF9kbWFfYnVzeSB8fCBzcGZpLT5yeF9kbWFfYnVzeSkgeworCQlzcGZpLT50eF9kbWFfYnVzeSA9IGZhbHNlOworCQlzcGZpLT5yeF9kbWFfYnVzeSA9IGZhbHNlOworCisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNwZmktPnR4X2NoKTsKKwkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc3BmaS0+cnhfY2gpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGZpLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgaW1nX3NwZmlfcHJlcGFyZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3QgaW1nX3NwZmkgKnNwZmkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJdTMyIHZhbDsKKworCXZhbCA9IHNwZmlfcmVhZGwoc3BmaSwgU1BGSV9QT1JUX1NUQVRFKTsKKwlpZiAobXNnLT5zcGktPm1vZGUgJiBTUElfQ1BIQSkKKwkJdmFsIHw9IFNQRklfUE9SVF9TVEFURV9DS19QSEFTRShtc2ctPnNwaS0+Y2hpcF9zZWxlY3QpOworCWVsc2UKKwkJdmFsICY9IH5TUEZJX1BPUlRfU1RBVEVfQ0tfUEhBU0UobXNnLT5zcGktPmNoaXBfc2VsZWN0KTsKKwlpZiAobXNnLT5zcGktPm1vZGUgJiBTUElfQ1BPTCkKKwkJdmFsIHw9IFNQRklfUE9SVF9TVEFURV9DS19QT0wobXNnLT5zcGktPmNoaXBfc2VsZWN0KTsKKwllbHNlCisJCXZhbCAmPSB+U1BGSV9QT1JUX1NUQVRFX0NLX1BPTChtc2ctPnNwaS0+Y2hpcF9zZWxlY3QpOworCXNwZmlfd3JpdGVsKHNwZmksIHZhbCwgU1BGSV9QT1JUX1NUQVRFKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGltZ19zcGZpX3VucHJlcGFyZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJICAgICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IGltZ19zcGZpICpzcGZpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCisJc3BmaV9yZXNldChzcGZpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGltZ19zcGZpX3NldHVwKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCit7CisJaW50IHJldDsKKworCXJldCA9IGdwaW9fcmVxdWVzdF9vbmUoc3BpLT5jc19ncGlvLCAoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpID8KKwkJCSAgICAgICBHUElPRl9PVVRfSU5JVF9MT1cgOiBHUElPRl9PVVRfSU5JVF9ISUdILAorCQkJICAgICAgIGRldl9uYW1lKCZzcGktPmRldikpOworCWlmIChyZXQpCisJCWRldl9lcnIoJnNwaS0+ZGV2LCAiY2FuJ3QgcmVxdWVzdCBjaGlwc2VsZWN0IGdwaW8gJWRcbiIsCisJCQkJc3BpLT5jc19ncGlvKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGltZ19zcGZpX2NsZWFudXAoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlncGlvX2ZyZWUoc3BpLT5jc19ncGlvKTsKK30KKwogc3RhdGljIHZvaWQgaW1nX3NwZmlfY29uZmlnKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBzcGlfZGV2aWNlICpzcGksCiAJCQkgICAgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKQEAgLTQwNSwxMCArNDY0LDEwIEBACiAKIAkvKgogCSAqIG91dHB1dCA9IHNwZmlfY2xrICogKEJJVENMSyAvIDUxMiksIHdoZXJlIEJJVENMSyBtdXN0IGJlIGEKLQkgKiBwb3dlciBvZiAyIHVwIHRvIDI1NiAod2hlcmUgMjU1ID09IDI1NiBzaW5jZSBCSVRDTEsgaXMgOCBiaXRzKQorCSAqIHBvd2VyIG9mIDIgdXAgdG8gMTI4CiAJICovCi0JZGl2ID0gRElWX1JPVU5EX1VQKG1hc3Rlci0+bWF4X3NwZWVkX2h6LCB4ZmVyLT5zcGVlZF9oeik7Ci0JZGl2ID0gY2xhbXAoNTEyIC8gKDEgPDwgZ2V0X2NvdW50X29yZGVyKGRpdikpLCAxLCAyNTUpOworCWRpdiA9IERJVl9ST1VORF9VUChjbGtfZ2V0X3JhdGUoc3BmaS0+c3BmaV9jbGspLCB4ZmVyLT5zcGVlZF9oeik7CisJZGl2ID0gY2xhbXAoNTEyIC8gKDEgPDwgZ2V0X2NvdW50X29yZGVyKGRpdikpLCAxLCAxMjgpOwogCiAJdmFsID0gc3BmaV9yZWFkbChzcGZpLCBTUEZJX0RFVklDRV9QQVJBTUVURVIoc3BpLT5jaGlwX3NlbGVjdCkpOwogCXZhbCAmPSB+KFNQRklfREVWSUNFX1BBUkFNRVRFUl9CSVRDTEtfTUFTSyA8PApAQCAtNDE2LDYgKzQ3NSw5IEBACiAJdmFsIHw9IGRpdiA8PCBTUEZJX0RFVklDRV9QQVJBTUVURVJfQklUQ0xLX1NISUZUOwogCXNwZmlfd3JpdGVsKHNwZmksIHZhbCwgU1BGSV9ERVZJQ0VfUEFSQU1FVEVSKHNwaS0+Y2hpcF9zZWxlY3QpKTsKIAorCXNwZmlfd3JpdGVsKHNwZmksIHhmZXItPmxlbiA8PCBTUEZJX1RSQU5TQUNUSU9OX1RTSVpFX1NISUZULAorCQkgICAgU1BGSV9UUkFOU0FDVElPTik7CisKIAl2YWwgPSBzcGZpX3JlYWRsKHNwZmksIFNQRklfQ09OVFJPTCk7CiAJdmFsICY9IH4oU1BGSV9DT05UUk9MX1NFTkRfRE1BIHwgU1BGSV9DT05UUk9MX0dFVF9ETUEpOwogCWlmICh4ZmVyLT50eF9idWYpCkBAIC00MjksMjUgKzQ5MSw3IEBACiAJZWxzZSBpZiAoeGZlci0+dHhfbmJpdHMgPT0gU1BJX05CSVRTX1FVQUQgJiYKIAkJIHhmZXItPnJ4X25iaXRzID09IFNQSV9OQklUU19RVUFEKQogCQl2YWwgfD0gU1BGSV9DT05UUk9MX1RNT0RFX1FVQUQgPDwgU1BGSV9DT05UUk9MX1RNT0RFX1NISUZUOwotCXZhbCAmPSB+U1BGSV9DT05UUk9MX0NPTlRJTlVFOwotCWlmICgheGZlci0+Y3NfY2hhbmdlICYmICFsaXN0X2lzX2xhc3QoJnhmZXItPnRyYW5zZmVyX2xpc3QsCi0JCQkJCSAgICAgICZtYXN0ZXItPmN1cl9tc2ctPnRyYW5zZmVycykpCi0JCXZhbCB8PSBTUEZJX0NPTlRST0xfQ09OVElOVUU7CiAJc3BmaV93cml0ZWwoc3BmaSwgdmFsLCBTUEZJX0NPTlRST0wpOwotCi0JdmFsID0gc3BmaV9yZWFkbChzcGZpLCBTUEZJX1BPUlRfU1RBVEUpOwotCWlmIChzcGktPm1vZGUgJiBTUElfQ1BIQSkKLQkJdmFsIHw9IFNQRklfUE9SVF9TVEFURV9DS19QSEFTRShzcGktPmNoaXBfc2VsZWN0KTsKLQllbHNlCi0JCXZhbCAmPSB+U1BGSV9QT1JUX1NUQVRFX0NLX1BIQVNFKHNwaS0+Y2hpcF9zZWxlY3QpOwotCWlmIChzcGktPm1vZGUgJiBTUElfQ1BPTCkKLQkJdmFsIHw9IFNQRklfUE9SVF9TVEFURV9DS19QT0woc3BpLT5jaGlwX3NlbGVjdCk7Ci0JZWxzZQotCQl2YWwgJj0gflNQRklfUE9SVF9TVEFURV9DS19QT0woc3BpLT5jaGlwX3NlbGVjdCk7Ci0Jc3BmaV93cml0ZWwoc3BmaSwgdmFsLCBTUEZJX1BPUlRfU1RBVEUpOwotCi0Jc3BmaV93cml0ZWwoc3BmaSwgeGZlci0+bGVuIDw8IFNQRklfVFJBTlNBQ1RJT05fVFNJWkVfU0hJRlQsCi0JCSAgICBTUEZJX1RSQU5TQUNUSU9OKTsKIH0KIAogc3RhdGljIGludCBpbWdfc3BmaV90cmFuc2Zlcl9vbmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKQEAgLTQ1NSw4ICs0OTksNiBAQAogCQkJCSBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewogCXN0cnVjdCBpbWdfc3BmaSAqc3BmaSA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwotCWJvb2wgZG1hX3Jlc2V0ID0gZmFsc2U7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCiAJaWYgKHhmZXItPmxlbiA+IFNQRklfVFJBTlNBQ1RJT05fVFNJWkVfTUFTSykgewpAQCAtNDY2LDIzICs1MDgsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKgotCSAqIFN0b3AgYWxsIERNQSBhbmQgcmVzZXQgdGhlIGNvbnRyb2xsZXIgaWYgdGhlIHByZXZpb3VzIHRyYW5zYWN0aW9uCi0JICogdGltZWQtb3V0IGFuZCBuZXZlciBjb21wbGV0ZWQgaXQncyBETUEuCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwZmktPmxvY2ssIGZsYWdzKTsKLQlpZiAoc3BmaS0+dHhfZG1hX2J1c3kgfHwgc3BmaS0+cnhfZG1hX2J1c3kpIHsKLQkJZGV2X2VycihzcGZpLT5kZXYsICJTUEkgRE1BIHN0aWxsIGJ1c3lcbiIpOwotCQlkbWFfcmVzZXQgPSB0cnVlOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGZpLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoZG1hX3Jlc2V0KSB7Ci0JCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKHNwZmktPnR4X2NoKTsKLQkJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc3BmaS0+cnhfY2gpOwotCQlzcGZpX3Jlc2V0KHNwZmkpOwotCX0KLQogCWltZ19zcGZpX2NvbmZpZyhtYXN0ZXIsIHNwaSwgeGZlcik7CiAJaWYgKG1hc3Rlci0+Y2FuX2RtYSAmJiBtYXN0ZXItPmNhbl9kbWEobWFzdGVyLCBzcGksIHhmZXIpKQogCQlyZXQgPSBpbWdfc3BmaV9zdGFydF9kbWEobWFzdGVyLCBzcGksIHhmZXIpOwpAQCAtNDkyLDE3ICs1MTcsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGltZ19zcGZpX3NldF9jcyhzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3QgaW1nX3NwZmkgKnNwZmkgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKHNwaS0+bWFzdGVyKTsKLQl1MzIgdmFsOwotCi0JdmFsID0gc3BmaV9yZWFkbChzcGZpLCBTUEZJX1BPUlRfU1RBVEUpOwotCXZhbCAmPSB+KFNQRklfUE9SVF9TVEFURV9ERVZfU0VMX01BU0sgPDwgU1BGSV9QT1JUX1NUQVRFX0RFVl9TRUxfU0hJRlQpOwotCXZhbCB8PSBzcGktPmNoaXBfc2VsZWN0IDw8IFNQRklfUE9SVF9TVEFURV9ERVZfU0VMX1NISUZUOwotCXNwZmlfd3JpdGVsKHNwZmksIHZhbCwgU1BGSV9QT1JUX1NUQVRFKTsKLX0KLQogc3RhdGljIGJvb2wgaW1nX3NwZmlfY2FuX2RtYShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAogCQkJICAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewpAQCAtNTkxLDE0ICs2MDUsMTcgQEAKIAltYXN0ZXItPm1vZGVfYml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfVFhfRFVBTCB8IFNQSV9SWF9EVUFMOwogCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2woc3BmaS0+ZGV2LT5vZl9ub2RlLCAiaW1nLHN1cHBvcnRzLXF1YWQtbW9kZSIpKQogCQltYXN0ZXItPm1vZGVfYml0cyB8PSBTUElfVFhfUVVBRCB8IFNQSV9SWF9RVUFEOwotCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSA1OwogCW1hc3Rlci0+ZGV2Lm9mX25vZGUgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSygzMikgfCBTUElfQlBXX01BU0soOCk7Ci0JbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBjbGtfZ2V0X3JhdGUoc3BmaS0+c3BmaV9jbGspOwotCW1hc3Rlci0+bWluX3NwZWVkX2h6ID0gbWFzdGVyLT5tYXhfc3BlZWRfaHogLyA1MTI7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSBjbGtfZ2V0X3JhdGUoc3BmaS0+c3BmaV9jbGspIC8gNDsKKwltYXN0ZXItPm1pbl9zcGVlZF9oeiA9IGNsa19nZXRfcmF0ZShzcGZpLT5zcGZpX2NsaykgLyA1MTI7CiAKLQltYXN0ZXItPnNldF9jcyA9IGltZ19zcGZpX3NldF9jczsKKwltYXN0ZXItPnNldHVwID0gaW1nX3NwZmlfc2V0dXA7CisJbWFzdGVyLT5jbGVhbnVwID0gaW1nX3NwZmlfY2xlYW51cDsKIAltYXN0ZXItPnRyYW5zZmVyX29uZSA9IGltZ19zcGZpX3RyYW5zZmVyX29uZTsKKwltYXN0ZXItPnByZXBhcmVfbWVzc2FnZSA9IGltZ19zcGZpX3ByZXBhcmU7CisJbWFzdGVyLT51bnByZXBhcmVfbWVzc2FnZSA9IGltZ19zcGZpX3VucHJlcGFyZTsKKwltYXN0ZXItPmhhbmRsZV9lcnIgPSBpbWdfc3BmaV9oYW5kbGVfZXJyOwogCiAJc3BmaS0+dHhfY2ggPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKHNwZmktPmRldiwgInR4Iik7CiAJc3BmaS0+cnhfY2ggPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsKHNwZmktPmRldiwgInJ4Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktaW14LmMgYi9kcml2ZXJzL3NwaS9zcGktaW14LmMKaW5kZXggNmZlYTRhZi4uZjA4ZTgxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWlteC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1pbXguYwpAQCAtMzcwLDggKzM3MCw2IEBACiAJaWYgKHNwaV9pbXgtPmRtYV9pc19pbml0ZWQpIHsKIAkJZG1hID0gcmVhZGwoc3BpX2lteC0+YmFzZSArIE1YNTFfRUNTUElfRE1BKTsKIAotCQlzcGlfaW14LT50eF93bWwgPSBzcGlfaW14X2dldF9maWZvc2l6ZShzcGlfaW14KSAvIDI7Ci0JCXNwaV9pbXgtPnJ4X3dtbCA9IHNwaV9pbXhfZ2V0X2ZpZm9zaXplKHNwaV9pbXgpIC8gMjsKIAkJc3BpX2lteC0+cnh0X3dtbCA9IHNwaV9pbXhfZ2V0X2ZpZm9zaXplKHNwaV9pbXgpIC8gMjsKIAkJcnhfd21sX2NmZyA9IHNwaV9pbXgtPnJ4X3dtbCA8PCBNWDUxX0VDU1BJX0RNQV9SWF9XTUxfT0ZGU0VUOwogCQl0eF93bWxfY2ZnID0gc3BpX2lteC0+dHhfd21sIDw8IE1YNTFfRUNTUElfRE1BX1RYX1dNTF9PRkZTRVQ7CkBAIC04NjgsNiArODY2LDggQEAKIAltYXN0ZXItPm1heF9kbWFfbGVuID0gTUFYX1NETUFfQkRfQllURVM7CiAJc3BpX2lteC0+Yml0YmFuZy5tYXN0ZXItPmZsYWdzID0gU1BJX01BU1RFUl9NVVNUX1JYIHwKIAkJCQkJIFNQSV9NQVNURVJfTVVTVF9UWDsKKwlzcGlfaW14LT50eF93bWwgPSBzcGlfaW14X2dldF9maWZvc2l6ZShzcGlfaW14KSAvIDI7CisJc3BpX2lteC0+cnhfd21sID0gc3BpX2lteF9nZXRfZmlmb3NpemUoc3BpX2lteCkgLyAyOwogCXNwaV9pbXgtPmRtYV9pc19pbml0ZWQgPSAxOwogCiAJcmV0dXJuIDA7CkBAIC05MDMsNyArOTAzLDcgQEAKIAogCWlmICh0eCkgewogCQlkZXNjX3R4ID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2cobWFzdGVyLT5kbWFfdHgsCi0JCQkJCXR4LT5zZ2wsIHR4LT5uZW50cywgRE1BX1RPX0RFVklDRSwKKwkJCQkJdHgtPnNnbCwgdHgtPm5lbnRzLCBETUFfTUVNX1RPX0RFViwKIAkJCQkJRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLKTsKIAkJaWYgKCFkZXNjX3R4KQogCQkJZ290byBub19kbWE7CkBAIC05MTUsNyArOTE1LDcgQEAKIAogCWlmIChyeCkgewogCQlkZXNjX3J4ID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2cobWFzdGVyLT5kbWFfcngsCi0JCQkJCXJ4LT5zZ2wsIHJ4LT5uZW50cywgRE1BX0ZST01fREVWSUNFLAorCQkJCQlyeC0+c2dsLCByeC0+bmVudHMsIERNQV9ERVZfVE9fTUVNLAogCQkJCQlETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ1RSTF9BQ0spOwogCQlpZiAoIWRlc2NfcngpCiAJCQlnb3RvIG5vX2RtYTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1tcGM1MTJ4LXBzYy5jIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMKaW5kZXggZWNhZTBkNC4uOTY1ZDJiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW1wYzUxMngtcHNjLmMKQEAgLTU4OCw3ICs1ODgsNyBAQAogCXJldHVybiBtcGM1MTJ4X3BzY19zcGlfZG9fcmVtb3ZlKCZvcC0+ZGV2KTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjNTEyeF9wc2Nfc3BpX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtcGM1MTJ4X3BzY19zcGlfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM1MTIxLXBzYy1zcGkiLCB9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1vY3Rlb24uYyBiL2RyaXZlcnMvc3BpL3NwaS1vY3Rlb24uYwppbmRleCBiMjgzZDUzLi5lOTlkNmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktb2N0ZW9uLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9jdGVvbi5jCkBAIC0yMzgsNyArMjM4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgb2N0ZW9uX3NwaV9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2N0ZW9uX3NwaV9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiY2F2aXVtLG9jdGVvbi0zMDEwLXNwaSIsIH0sCiAJe30sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLW9tYXAtMTAway5jIGIvZHJpdmVycy9zcGkvc3BpLW9tYXAtMTAway5jCmluZGV4IGQ4OTBkMzAuLjM1YjMzMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vbWFwLTEwMGsuYworKysgYi9kcml2ZXJzL3NwaS9zcGktb21hcC0xMDBrLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtMjk0LDE2ICsyOTUsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgb21hcDFfc3BpMTAwa19wcmVwYXJlX2hhcmR3YXJlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIpCi17Ci0Jc3RydWN0IG9tYXAxX3NwaTEwMGsgKnNwaTEwMGsgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7Ci0KLQljbGtfcHJlcGFyZV9lbmFibGUoc3BpMTAway0+aWNrKTsKLQljbGtfcHJlcGFyZV9lbmFibGUoc3BpMTAway0+ZmNrKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG9tYXAxX3NwaTEwMGtfdHJhbnNmZXJfb25lX21lc3NhZ2Uoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKIAkJCQkJICAgICAgc3RydWN0IHNwaV9tZXNzYWdlICptKQogewpAQCAtMzcyLDE2ICszNjMsNiBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgb21hcDFfc3BpMTAwa191bnByZXBhcmVfaGFyZHdhcmUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcikKLXsKLQlzdHJ1Y3Qgb21hcDFfc3BpMTAwayAqc3BpMTAwayA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKLQotCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcGkxMDBrLT5pY2spOwotCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcGkxMDBrLT5mY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgb21hcDFfc3BpMTAwa19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzcGlfbWFzdGVyICAgICAgICptYXN0ZXI7CkBAIC00MDIsMTQgKzM4MywxMiBAQAogCiAJbWFzdGVyLT5zZXR1cCA9IG9tYXAxX3NwaTEwMGtfc2V0dXA7CiAJbWFzdGVyLT50cmFuc2Zlcl9vbmVfbWVzc2FnZSA9IG9tYXAxX3NwaTEwMGtfdHJhbnNmZXJfb25lX21lc3NhZ2U7Ci0JbWFzdGVyLT5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlID0gb21hcDFfc3BpMTAwa19wcmVwYXJlX2hhcmR3YXJlOwotCW1hc3Rlci0+dW5wcmVwYXJlX3RyYW5zZmVyX2hhcmR3YXJlID0gb21hcDFfc3BpMTAwa191bnByZXBhcmVfaGFyZHdhcmU7Ci0JbWFzdGVyLT5jbGVhbnVwID0gTlVMTDsKIAltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gMjsKIAltYXN0ZXItPm1vZGVfYml0cyA9IE1PREVCSVRTOwogCW1hc3Rlci0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19SQU5HRV9NQVNLKDQsIDMyKTsKIAltYXN0ZXItPm1pbl9zcGVlZF9oeiA9IE9NQVAxX1NQSTEwMEtfTUFYX0ZSRVEvKDE8PDE2KTsKIAltYXN0ZXItPm1heF9zcGVlZF9oeiA9IE9NQVAxX1NQSTEwMEtfTUFYX0ZSRVE7CisJbWFzdGVyLT5hdXRvX3J1bnRpbWVfcG0gPSB0cnVlOwogCiAJc3BpMTAwayA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKIApAQCAtNDM0LDIyICs0MTMsOTYgQEAKIAkJZ290byBlcnI7CiAJfQogCisJc3RhdHVzID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNwaTEwMGstPmljayk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgaWNrOiAlZFxuIiwgc3RhdHVzKTsKKwkJZ290byBlcnI7CisJfQorCisJc3RhdHVzID0gY2xrX3ByZXBhcmVfZW5hYmxlKHNwaTEwMGstPmZjayk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBlbmFibGUgZmNrOiAlZFxuIiwgc3RhdHVzKTsKKwkJZ290byBlcnJfaWNrOworCX0KKworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmcGRldi0+ZGV2KTsKKwogCXN0YXR1cyA9IGRldm1fc3BpX3JlZ2lzdGVyX21hc3RlcigmcGRldi0+ZGV2LCBtYXN0ZXIpOwogCWlmIChzdGF0dXMgPCAwKQotCQlnb3RvIGVycjsKKwkJZ290byBlcnJfZmNrOwogCiAJcmV0dXJuIHN0YXR1czsKIAorZXJyX2ZjazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc3BpMTAway0+ZmNrKTsKK2Vycl9pY2s6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHNwaTEwMGstPmljayk7CiBlcnI6CiAJc3BpX21hc3Rlcl9wdXQobWFzdGVyKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgaW50IG9tYXAxX3NwaTEwMGtfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHNwaV9tYXN0ZXJfZ2V0KHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpKTsKKwlzdHJ1Y3Qgb21hcDFfc3BpMTAwayAqc3BpMTAwayA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcGkxMDBrLT5mY2spOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcGkxMDBrLT5pY2spOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgb21hcDFfc3BpMTAwa19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IG9tYXAxX3NwaTEwMGsgKnNwaTEwMGsgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc3BpMTAway0+aWNrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc3BpMTAway0+ZmNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYXAxX3NwaTEwMGtfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIgPSBzcGlfbWFzdGVyX2dldChkZXZfZ2V0X2RydmRhdGEoZGV2KSk7CisJc3RydWN0IG9tYXAxX3NwaTEwMGsgKnNwaTEwMGsgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShzcGkxMDBrLT5pY2spOworCWlmIChyZXQgIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgaWNrOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc3BpMTAway0+ZmNrKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIGZjazogJWRcbiIsIHJldCk7CisJCWNsa19kaXNhYmxlX3VucHJlcGFyZShzcGkxMDBrLT5pY2spOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBvbWFwMV9zcGkxMDBrX3BtID0geworCVNFVF9SVU5USU1FX1BNX09QUyhvbWFwMV9zcGkxMDBrX3J1bnRpbWVfc3VzcGVuZCwKKwkJCSAgIG9tYXAxX3NwaTEwMGtfcnVudGltZV9yZXN1bWUsIE5VTEwpCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwMV9zcGkxMDBrX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQkJPSAib21hcDFfc3BpMTAwayIsCisJCS5wbQkJPSAmb21hcDFfc3BpMTAwa19wbSwKIAl9LAogCS5wcm9iZQkJPSBvbWFwMV9zcGkxMDBrX3Byb2JlLAorCS5yZW1vdmUJCT0gb21hcDFfc3BpMTAwa19yZW1vdmUsCiB9OwogCiBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG9tYXAxX3NwaTEwMGtfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1vbWFwLXV3aXJlLmMgYi9kcml2ZXJzL3NwaS9zcGktb21hcC11d2lyZS5jCmluZGV4IDNjMDg0NDQuLjU1NTc2ZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1vbWFwLXV3aXJlLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW9tYXAtdXdpcmUuYwpAQCAtNDQsNyArNDQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jIGIvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKaW5kZXggZWU1MTNhOC4uOTRhZjgwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLXBsMDIyLmMKQEAgLTI4NSw3ICsyODUsMTIgQEAKICAqLwogI2RlZmluZSBERUZBVUxUX1NTUF9SRUdfSU1TQyAgMHgwVUwKICNkZWZpbmUgRElTQUJMRV9BTExfSU5URVJSVVBUUyBERUZBVUxUX1NTUF9SRUdfSU1TQwotI2RlZmluZSBFTkFCTEVfQUxMX0lOVEVSUlVQVFMgKH5ERUZBVUxUX1NTUF9SRUdfSU1TQykKKyNkZWZpbmUgRU5BQkxFX0FMTF9JTlRFUlJVUFRTICggXAorCVNTUF9JTVNDX01BU0tfUk9SSU0gfCBcCisJU1NQX0lNU0NfTUFTS19SVElNIHwgXAorCVNTUF9JTVNDX01BU0tfUlhJTSB8IFwKKwlTU1BfSU1TQ19NQVNLX1RYSU0gXAorKQogCiAjZGVmaW5lIENMRUFSX0FMTF9JTlRFUlJVUFRTICAweDMKIApAQCAtMTI1MSw3ICsxMjU2LDYgQEAKIAlzdHJ1Y3QgcGwwMjIgKnBsMDIyID0gZGV2X2lkOwogCXN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnID0gcGwwMjItPmN1cl9tc2c7CiAJdTE2IGlycV9zdGF0dXMgPSAwOwotCXUxNiBmbGFnID0gMDsKIAogCWlmICh1bmxpa2VseSghbXNnKSkgewogCQlkZXZfZXJyKCZwbDAyMi0+YWRldi0+ZGV2LApAQCAtMTI4MCw5ICsxMjg0LDYgQEAKIAkJaWYgKHJlYWR3KFNTUF9TUihwbDAyMi0+dmlydGJhc2UpKSAmIFNTUF9TUl9NQVNLX1JGRikKIAkJCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCiAJCQkJIlJYRklGTyBpcyBmdWxsXG4iKTsKLQkJaWYgKHJlYWR3KFNTUF9TUihwbDAyMi0+dmlydGJhc2UpKSAmIFNTUF9TUl9NQVNLX1RORikKLQkJCWRldl9lcnIoJnBsMDIyLT5hZGV2LT5kZXYsCi0JCQkJIlRYRklGTyBpcyBmdWxsXG4iKTsKIAogCQkvKgogCQkgKiBEaXNhYmxlIGFuZCBjbGVhciBpbnRlcnJ1cHRzLCBkaXNhYmxlIFNTUCwKQEAgLTEzMDMsOCArMTMwNCw3IEBACiAKIAlyZWFkd3JpdGVyKHBsMDIyKTsKIAotCWlmICgocGwwMjItPnR4ID09IHBsMDIyLT50eF9lbmQpICYmIChmbGFnID09IDApKSB7Ci0JCWZsYWcgPSAxOworCWlmIChwbDAyMi0+dHggPT0gcGwwMjItPnR4X2VuZCkgewogCQkvKiBEaXNhYmxlIFRyYW5zbWl0IGludGVycnVwdCwgZW5hYmxlIHJlY2VpdmUgaW50ZXJydXB0ICovCiAJCXdyaXRldygocmVhZHcoU1NQX0lNU0MocGwwMjItPnZpcnRiYXNlKSkgJgogCQkgICAgICAgflNTUF9JTVNDX01BU0tfVFhJTSkgfCBTU1BfSU1TQ19NQVNLX1JYSU0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LmMgYi9kcml2ZXJzL3NwaS9zcGktcHhhMnh4LmMKaW5kZXggNmY3MmFkMC4uZTMyMjNhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXB4YTJ4eC5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1weGEyeHguYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3B4YTJ4eF9zcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CkBAIC0zMCwxMCArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAKLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2RlbGF5Lmg+Ci0KICNpbmNsdWRlICJzcGktcHhhMnh4LmgiCiAKIE1PRFVMRV9BVVRIT1IoIlN0ZXBoZW4gU3RyZWV0Iik7CkBAIC02Nyw1NCArNjQsNiBAQAogI2RlZmluZSBMUFNTX1RYX0xPVEhSRVNIX0RGTFQJMTYwCiAjZGVmaW5lIExQU1NfVFhfSElUSFJFU0hfREZMVAkyMjQKIAotc3RydWN0IHF1YXJrX3NwaV9yYXRlIHsKLQl1MzIgYml0cmF0ZTsKLQl1MzIgZGRzX2Nsa19yYXRlOwotCXUzMiBjbGtfZGl2OwotfTsKLQotLyoKLSAqICdyYXRlJywgJ2RkcycsICdjbGtfZGl2JyBsb29rdXAgdGFibGUsIHdoaWNoIGlzIGRlZmluZWQgaW4KLSAqIHRoZSBRdWFyayBTUEkgZGF0YXNoZWV0LgotICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHF1YXJrX3NwaV9yYXRlIHF1YXJrX3NwaV9yYXRlX3RhYmxlW10gPSB7Ci0vKgliaXRyYXRlLAlkZHNfY2xrX3JhdGUsCWNsa19kaXYgKi8KLQl7NTAwMDAwMDAsCTB4ODAwMDAwLAkwfSwKLQl7NDAwMDAwMDAsCTB4NjY2NjY2LAkwfSwKLQl7MjUwMDAwMDAsCTB4NDAwMDAwLAkwfSwKLQl7MjAwMDAwMDAsCTB4NjY2NjY2LAkxfSwKLQl7MTY2NjcwMDAsCTB4ODAwMDAwLAkyfSwKLQl7MTMzMzMwMDAsCTB4NjY2NjY2LAkyfSwKLQl7MTI1MDAwMDAsCTB4MjAwMDAwLAkwfSwKLQl7MTAwMDAwMDAsCTB4ODAwMDAwLAk0fSwKLQl7ODAwMDAwMCwJMHg2NjY2NjYsCTR9LAotCXs2MjUwMDAwLAkweDQwMDAwMCwJM30sCi0JezUwMDAwMDAsCTB4NDAwMDAwLAk0fSwKLQl7NDAwMDAwMCwJMHg2NjY2NjYsCTl9LAotCXszMTI1MDAwLAkweDgwMDAwLAkwfSwKLQl7MjUwMDAwMCwJMHg0MDAwMDAsCTl9LAotCXsyMDAwMDAwLAkweDY2NjY2NiwJMTl9LAotCXsxNTYzMDAwLAkweDQwMDAwLAkwfSwKLQl7MTI1MDAwMCwJMHgyMDAwMDAsCTl9LAotCXsxMDAwMDAwLAkweDQwMDAwMCwJMjR9LAotCXs4MDAwMDAsCTB4NjY2NjY2LAk0OX0sCi0Jezc4MTI1MCwJMHgyMDAwMCwJMH0sCi0JezYyNTAwMCwJMHgyMDAwMDAsCTE5fSwKLQl7NTAwMDAwLAkweDQwMDAwMCwJNDl9LAotCXs0MDAwMDAsCTB4NjY2NjY2LAk5OX0sCi0JezM5MDYyNSwJMHgxMDAwMCwJMH0sCi0JezI1MDAwMCwJMHg0MDAwMDAsCTk5fSwKLQl7MjAwMDAwLAkweDY2NjY2NiwJMTk5fSwKLQl7MTk1MzEzLAkweDgwMDAsCQkwfSwKLQl7MTI1MDAwLAkweDEwMDAwMCwJNDl9LAotCXsxMDAwMDAsCTB4MjAwMDAwLAkxMjR9LAotCXs1MDAwMCwJCTB4MTAwMDAwLAkxMjR9LAotCXsyNTAwMCwJCTB4ODAwMDAsCTEyNH0sCi0JezEwMDE2LAkJMHgyMDAwMCwJNzd9LAotCXs1MDQwLAkJMHgyMDAwMCwJMTU0fSwKLQl7MTAwMiwJCTB4ODAwMCwJCTE5NH0sCi19OwotCiAvKiBPZmZzZXQgZnJvbSBkcnZfZGF0YS0+bHBzc19iYXNlICovCiAjZGVmaW5lIEdFTkVSQUxfUkVHCQkweDA4CiAjZGVmaW5lIEdFTkVSQUxfUkVHX1JYVE9fSE9MRE9GRl9ESVNBQkxFIEJJVCgyNCkKQEAgLTcwMSwyNSArNjUwLDEyNCBAQAogfQogCiAvKgotICogVGhlIFF1YXJrIFNQSSBkYXRhIHNoZWV0IGdpdmVzIGEgdGFibGUsIGFuZCBmb3IgdGhlIGdpdmVuICdyYXRlJywKLSAqIHRoZSAnZGRzJyBhbmQgJ2Nsa19kaXYnIGNhbiBiZSBmb3VuZCBpbiB0aGUgdGFibGUuCisgKiBUaGUgUXVhcmsgU1BJIGhhcyBhbiBhZGRpdGlvbmFsIDI0IGJpdCByZWdpc3RlciAoRERTX0NMS19SQVRFKSB0byBtdWx0aXBseQorICogaW5wdXQgZnJlcXVlbmN5IGJ5IGZyYWN0aW9ucyBvZiAyXjI0LiBJdCBhbHNvIGhhcyBhIGRpdmlkZXIgYnkgNS4KKyAqCisgKiBUaGVyZSBhcmUgZm9ybXVsYXMgdG8gZ2V0IGJhdWQgcmF0ZSB2YWx1ZSBmb3IgZ2l2ZW4gaW5wdXQgZnJlcXVlbmN5IGFuZAorICogZGl2aWRlciBwYXJhbWV0ZXJzLCBzdWNoIGFzIEREU19DTEtfUkFURSBhbmQgU0NSOgorICoKKyAqIEZzeXMgPSAyMDBNSHoKKyAqCisgKiBGc3NwID0gRnN5cyAqIEREU19DTEtfUkFURSAvIDJeMjQJCQkoMSkKKyAqIEJhdWQgcmF0ZSA9IEZzY2xrID0gRnNzcCAvICgyICogKFNDUiArIDEpKQkJKDIpCisgKgorICogRERTX0NMS19SQVRFIGVpdGhlciAyXm4gb3IgMl5uIC8gNS4KKyAqIFNDUiBpcyBpbiByYW5nZSAwIC4uIDI1NQorICoKKyAqIERpdmlzb3IgPSA1XmkgKiAyXmogKiAyICogaworICogICAgICAgaSA9IFswLCAxXSAgICAgIGkgPSAxIGlmZiBqID0gMCBvciBqID4gMworICogICAgICAgaiA9IFswLCAyM10gICAgIGogPSAwIGlmZiBpID0gMQorICogICAgICAgayA9IFsxLCAyNTZdCisgKiBTcGVjaWFsIGNhc2U6IGogPSAwLCBpID0gMTogRGl2aXNvciA9IDIgLyA1CisgKgorICogQWNjb3JkaW5nbHkgdG8gdGhlIHNwZWNpZmljYXRpb24gdGhlIHJlY29tbWVuZGVkIHZhbHVlcyBmb3IgRERTX0NMS19SQVRFCisgKiBhcmU6CisgKglDYXNlIDE6CQkyXm4sIG4gPSBbMCwgMjNdCisgKglDYXNlIDI6CQkyXjI0ICogMiAvIDUgKDB4NjY2NjY2KQorICoJQ2FzZSAzOgkJbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDJeMjQgLyA1IC8gMTYgKDB4MzMzMzMpCisgKgorICogSW4gYWxsIGNhc2VzIHRoZSBsb3dlc3QgcG9zc2libGUgdmFsdWUgaXMgYmV0dGVyLgorICoKKyAqIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHBhcmFtZXRlcnMgZm9yIGFsbCBjYXNlcyBhbmQgY2hvb3NlcyB0aGUgb25lIGNsb3Nlc3QKKyAqIHRvIHRoZSBhc2tlZCBiYXVkIHJhdGUuCiAgKi8KLXN0YXRpYyB1MzIgcXVhcmtfeDEwMDBfc2V0X2Nsa19yZWd2YWxzKHUzMiByYXRlLCB1MzIgKmRkcywgdTMyICpjbGtfZGl2KQorc3RhdGljIHVuc2lnbmVkIGludCBxdWFya194MTAwMF9nZXRfY2xrX2RpdihpbnQgcmF0ZSwgdTMyICpkZHMpCiB7Ci0JdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgbG9uZyB4dGFsID0gMjAwMDAwMDAwOworCXVuc2lnbmVkIGxvbmcgZnJlZiA9IHh0YWwgLyAyOwkJLyogbWFuZGF0b3J5IGRpdmlzaW9uIGJ5IDIsCisJCQkJCQkgICBzZWUgKDIpICovCisJCQkJCQkvKiBjYXNlIDMgKi8KKwl1bnNpZ25lZCBsb25nIGZyZWYxID0gZnJlZiAvIDI7CQkvKiBjYXNlIDEgKi8KKwl1bnNpZ25lZCBsb25nIGZyZWYyID0gZnJlZiAqIDIgLyA1OwkvKiBjYXNlIDIgKi8KKwl1bnNpZ25lZCBsb25nIHNjYWxlOworCXVuc2lnbmVkIGxvbmcgcSwgcTEsIHEyOworCWxvbmcgciwgcjEsIHIyOworCXUzMiBtdWw7CiAKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShxdWFya19zcGlfcmF0ZV90YWJsZSk7IGkrKykgewotCQlpZiAocmF0ZSA+PSBxdWFya19zcGlfcmF0ZV90YWJsZVtpXS5iaXRyYXRlKSB7Ci0JCQkqZGRzID0gcXVhcmtfc3BpX3JhdGVfdGFibGVbaV0uZGRzX2Nsa19yYXRlOwotCQkJKmNsa19kaXYgPSBxdWFya19zcGlfcmF0ZV90YWJsZVtpXS5jbGtfZGl2OwotCQkJcmV0dXJuIHF1YXJrX3NwaV9yYXRlX3RhYmxlW2ldLmJpdHJhdGU7CisJLyogQ2FzZSAxICovCisKKwkvKiBTZXQgaW5pdGlhbCB2YWx1ZSBmb3IgRERTX0NMS19SQVRFICovCisJbXVsID0gKDEgPDwgMjQpID4+IDE7CisKKwkvKiBDYWxjdWxhdGUgaW5pdGlhbCBxdW90ICovCisJcTEgPSBESVZfUk9VTkRfQ0xPU0VTVChmcmVmMSwgcmF0ZSk7CisKKwkvKiBTY2FsZSBxMSBpZiBpdCdzIHRvbyBiaWcgKi8KKwlpZiAocTEgPiAyNTYpIHsKKwkJLyogU2NhbGUgcTEgdG8gcmFuZ2UgWzEsIDUxMl0gKi8KKwkJc2NhbGUgPSBmbHNfbG9uZyhxMSAtIDEpOworCQlpZiAoc2NhbGUgPiA5KSB7CisJCQlxMSA+Pj0gc2NhbGUgLSA5OworCQkJbXVsID4+PSBzY2FsZSAtIDk7CisJCX0KKworCQkvKiBSb3VuZCB0aGUgcmVzdWx0IGlmIHdlIGhhdmUgYSByZW1haW5kZXIgKi8KKwkJcTEgKz0gcTEgJiAxOworCX0KKworCS8qIERlY3JlYXNlIEREU19DTEtfUkFURSBhcyBtdWNoIGFzIHdlIGNhbiB3aXRob3V0IGxvc3MgaW4gcHJlY2lzaW9uICovCisJc2NhbGUgPSBfX2ZmcyhxMSk7CisJcTEgPj49IHNjYWxlOworCW11bCA+Pj0gc2NhbGU7CisKKwkvKiBHZXQgdGhlIHJlbWFpbmRlciAqLworCXIxID0gYWJzKGZyZWYxIC8gKDEgPDwgKDI0IC0gZmxzX2xvbmcobXVsKSkpIC8gcTEgLSByYXRlKTsKKworCS8qIENhc2UgMiAqLworCisJcTIgPSBESVZfUk9VTkRfQ0xPU0VTVChmcmVmMiwgcmF0ZSk7CisJcjIgPSBhYnMoZnJlZjIgLyBxMiAtIHJhdGUpOworCisJLyoKKwkgKiBDaG9vc2UgdGhlIGJlc3QgYmV0d2VlbiB0d286IGxlc3MgcmVtYWluZGVyIHdlIGhhdmUgdGhlIGJldHRlci4gV2UKKwkgKiBjYW4ndCBnbyBjYXNlIDIgaWYgcTIgaXMgZ3JlYXRlciB0aGFuIDI1NiBzaW5jZSBTQ1IgcmVnaXN0ZXIgY2FuCisJICogaG9sZCBvbmx5IHZhbHVlcyAwIC4uIDI1NS4KKwkgKi8KKwlpZiAocjIgPj0gcjEgfHwgcTIgPiAyNTYpIHsKKwkJLyogY2FzZSAxIGlzIGJldHRlciAqLworCQlyID0gcjE7CisJCXEgPSBxMTsKKwl9IGVsc2UgeworCQkvKiBjYXNlIDIgaXMgYmV0dGVyICovCisJCXIgPSByMjsKKwkJcSA9IHEyOworCQltdWwgPSAoMSA8PCAyNCkgKiAyIC8gNTsKKwl9CisKKwkvKiBDaGVjayBjYXNlIDMgb25seSBJZiB0aGUgZGl2aXNvciBpcyBiaWcgZW5vdWdoICovCisJaWYgKGZyZWYgLyByYXRlID49IDgwKSB7CisJCXU2NCBmc3NwOworCQl1MzIgbTsKKworCQkvKiBDYWxjdWxhdGUgaW5pdGlhbCBxdW90ICovCisJCXExID0gRElWX1JPVU5EX0NMT1NFU1QoZnJlZiwgcmF0ZSk7CisJCW0gPSAoMSA8PCAyNCkgLyBxMTsKKworCQkvKiBHZXQgdGhlIHJlbWFpbmRlciAqLworCQlmc3NwID0gKHU2NClmcmVmICogbTsKKwkJZG9fZGl2KGZzc3AsIDEgPDwgMjQpOworCQlyMSA9IGFicyhmc3NwIC0gcmF0ZSk7CisKKwkJLyogQ2hvb3NlIHRoaXMgb25lIGlmIGl0IHN1aXRzIGJldHRlciAqLworCQlpZiAocjEgPCByKSB7CisJCQkvKiBjYXNlIDMgaXMgYmV0dGVyICovCisJCQlxID0gMTsKKwkJCW11bCA9IG07CiAJCX0KIAl9CiAKLQkqZGRzID0gcXVhcmtfc3BpX3JhdGVfdGFibGVbaS0xXS5kZHNfY2xrX3JhdGU7Ci0JKmNsa19kaXYgPSBxdWFya19zcGlfcmF0ZV90YWJsZVtpLTFdLmNsa19kaXY7Ci0KLQlyZXR1cm4gcXVhcmtfc3BpX3JhdGVfdGFibGVbaS0xXS5iaXRyYXRlOworCSpkZHMgPSBtdWw7CisJcmV0dXJuIHEgLSAxOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHNzcF9nZXRfY2xrX2RpdihzdHJ1Y3QgZHJpdmVyX2RhdGEgKmRydl9kYXRhLCBpbnQgcmF0ZSkKQEAgLTczMCwyMyArNzc4LDI1IEBACiAJcmF0ZSA9IG1pbl90KGludCwgc3NwX2NsaywgcmF0ZSk7CiAKIAlpZiAoc3NwLT50eXBlID09IFBYQTI1eF9TU1AgfHwgc3NwLT50eXBlID09IENFNDEwMF9TU1ApCi0JCXJldHVybiAoKHNzcF9jbGsgLyAoMiAqIHJhdGUpIC0gMSkgJiAweGZmKSA8PCA4OworCQlyZXR1cm4gKHNzcF9jbGsgLyAoMiAqIHJhdGUpIC0gMSkgJiAweGZmOwogCWVsc2UKLQkJcmV0dXJuICgoc3NwX2NsayAvIHJhdGUgLSAxKSAmIDB4ZmZmKSA8PCA4OworCQlyZXR1cm4gKHNzcF9jbGsgLyByYXRlIC0gMSkgJiAweGZmZjsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBweGEyeHhfc3NwX2dldF9jbGtfZGl2KHN0cnVjdCBkcml2ZXJfZGF0YSAqZHJ2X2RhdGEsCiAJCQkJCSAgIHN0cnVjdCBjaGlwX2RhdGEgKmNoaXAsIGludCByYXRlKQogewotCXUzMiBjbGtfZGl2OworCXVuc2lnbmVkIGludCBjbGtfZGl2OwogCiAJc3dpdGNoIChkcnZfZGF0YS0+c3NwX3R5cGUpIHsKIAljYXNlIFFVQVJLX1gxMDAwX1NTUDoKLQkJcXVhcmtfeDEwMDBfc2V0X2Nsa19yZWd2YWxzKHJhdGUsICZjaGlwLT5kZHNfcmF0ZSwgJmNsa19kaXYpOwotCQlyZXR1cm4gY2xrX2RpdiA8PCA4OworCQljbGtfZGl2ID0gcXVhcmtfeDEwMDBfZ2V0X2Nsa19kaXYocmF0ZSwgJmNoaXAtPmRkc19yYXRlKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIHNzcF9nZXRfY2xrX2RpdihkcnZfZGF0YSwgcmF0ZSk7CisJCWNsa19kaXYgPSBzc3BfZ2V0X2Nsa19kaXYoZHJ2X2RhdGEsIHJhdGUpOworCQlicmVhazsKIAl9CisJcmV0dXJuIGNsa19kaXYgPDwgODsKIH0KIAogc3RhdGljIHZvaWQgcHVtcF90cmFuc2ZlcnModW5zaWduZWQgbG9uZyBkYXRhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXF1cC5jIGIvZHJpdmVycy9zcGkvc3BpLXF1cC5jCmluZGV4IGZmOWNkYmQuLjgxMGE3ZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1xdXAuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcXVwLmMKQEAgLTIyLDYgKzIyLDggQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNkZWZpbmUgUVVQX0NPTkZJRwkJCTB4MDAwMAogI2RlZmluZSBRVVBfU1RBVEUJCQkweDAwMDQKQEAgLTExNiw2ICsxMTgsOCBAQAogCiAjZGVmaW5lIFNQSV9OVU1fQ0hJUFNFTEVDVFMJCTQKIAorI2RlZmluZSBTUElfTUFYX0RNQV9YRkVSCQkoU1pfNjRLIC0gNjQpCisKIC8qIGhpZ2ggc3BlZWQgbW9kZSBpcyB3aGVuIGJ1cyByYXRlIGlzIGdyZWF0ZXIgdGhlbiAyNk1IeiAqLwogI2RlZmluZSBTUElfSFNfTUlOX1JBVEUJCQkyNjAwMDAwMAogI2RlZmluZSBTUElfTUFYX1JBVEUJCQk1MDAwMDAwMApAQCAtMTQwLDkgKzE0NCwxNCBAQAogCXN0cnVjdCBjb21wbGV0aW9uCWRvbmU7CiAJaW50CQkJZXJyb3I7CiAJaW50CQkJd19zaXplOwkvKiBieXRlcyBwZXIgU1BJIHdvcmQgKi8KKwlpbnQJCQluX3dvcmRzOwogCWludAkJCXR4X2J5dGVzOwogCWludAkJCXJ4X2J5dGVzOwogCWludAkJCXF1cF92MTsKKworCWludAkJCXVzZV9kbWE7CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcJcnhfY29uZjsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZwl0eF9jb25mOwogfTsKIAogCkBAIC0xOTgsNyArMjA3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgdm9pZCBzcGlfcXVwX2ZpZm9fcmVhZChzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciwKIAkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQogewpAQCAtMjY2LDYgKzI3NCwxMDcgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHNwaV9xdXBfZG1hX2RvbmUodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX3F1cCAqcXVwID0gZGF0YTsKKworCWNvbXBsZXRlKCZxdXAtPmRvbmUpOworfQorCitzdGF0aWMgaW50IHNwaV9xdXBfcHJlcF9zZyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyLAorCQkJICAgZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpciwKKwkJCSAgIGRtYV9hc3luY190eF9jYWxsYmFjayBjYWxsYmFjaykKK3sKKwlzdHJ1Y3Qgc3BpX3F1cCAqcXVwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfUFJFUF9GRU5DRTsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2w7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCWRtYV9jb29raWVfdCBjb29raWU7CisJdW5zaWduZWQgaW50IG5lbnRzOworCisJaWYgKGRpciA9PSBETUFfTUVNX1RPX0RFVikgeworCQljaGFuID0gbWFzdGVyLT5kbWFfdHg7CisJCW5lbnRzID0geGZlci0+dHhfc2cubmVudHM7CisJCXNnbCA9IHhmZXItPnR4X3NnLnNnbDsKKwl9IGVsc2UgeworCQljaGFuID0gbWFzdGVyLT5kbWFfcng7CisJCW5lbnRzID0geGZlci0+cnhfc2cubmVudHM7CisJCXNnbCA9IHhmZXItPnJ4X3NnLnNnbDsKKwl9CisKKwlkZXNjID0gZG1hZW5naW5lX3ByZXBfc2xhdmVfc2coY2hhbiwgc2dsLCBuZW50cywgZGlyLCBmbGFncyk7CisJaWYgKCFkZXNjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRlc2MtPmNhbGxiYWNrID0gY2FsbGJhY2s7CisJZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBxdXA7CisKKwljb29raWUgPSBkbWFlbmdpbmVfc3VibWl0KGRlc2MpOworCisJcmV0dXJuIGRtYV9zdWJtaXRfZXJyb3IoY29va2llKTsKK30KKworc3RhdGljIHZvaWQgc3BpX3F1cF9kbWFfdGVybWluYXRlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCWlmICh4ZmVyLT50eF9idWYpCisJCWRtYWVuZ2luZV90ZXJtaW5hdGVfYWxsKG1hc3Rlci0+ZG1hX3R4KTsKKwlpZiAoeGZlci0+cnhfYnVmKQorCQlkbWFlbmdpbmVfdGVybWluYXRlX2FsbChtYXN0ZXItPmRtYV9yeCk7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3F1cF9kb19kbWEoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlkbWFfYXN5bmNfdHhfY2FsbGJhY2sgcnhfZG9uZSA9IE5VTEwsIHR4X2RvbmUgPSBOVUxMOworCWludCByZXQ7CisKKwlpZiAoeGZlci0+cnhfYnVmKQorCQlyeF9kb25lID0gc3BpX3F1cF9kbWFfZG9uZTsKKwllbHNlIGlmICh4ZmVyLT50eF9idWYpCisJCXR4X2RvbmUgPSBzcGlfcXVwX2RtYV9kb25lOworCisJaWYgKHhmZXItPnJ4X2J1ZikgeworCQlyZXQgPSBzcGlfcXVwX3ByZXBfc2cobWFzdGVyLCB4ZmVyLCBETUFfREVWX1RPX01FTSwgcnhfZG9uZSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKG1hc3Rlci0+ZG1hX3J4KTsKKwl9CisKKwlpZiAoeGZlci0+dHhfYnVmKSB7CisJCXJldCA9IHNwaV9xdXBfcHJlcF9zZyhtYXN0ZXIsIHhmZXIsIERNQV9NRU1fVE9fREVWLCB0eF9kb25lKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcobWFzdGVyLT5kbWFfdHgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNwaV9xdXBfZG9fcGlvKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0IHNwaV9xdXAgKnF1cCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gc3BpX3F1cF9zZXRfc3RhdGUocXVwLCBRVVBfU1RBVEVfUlVOKTsKKwlpZiAocmV0KSB7CisJCWRldl93YXJuKHF1cC0+ZGV2LCAiY2Fubm90IHNldCBSVU4gc3RhdGVcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNwaV9xdXBfc2V0X3N0YXRlKHF1cCwgUVVQX1NUQVRFX1BBVVNFKTsKKwlpZiAocmV0KSB7CisJCWRldl93YXJuKHF1cC0+ZGV2LCAiY2Fubm90IHNldCBQQVVTRSBzdGF0ZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJc3BpX3F1cF9maWZvX3dyaXRlKHF1cCwgeGZlcik7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlycXJldHVybl90IHNwaV9xdXBfcXVwX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IHNwaV9xdXAgKmNvbnRyb2xsZXIgPSBkZXZfaWQ7CkBAIC0zMTUsMTEgKzQyNCwxMyBAQAogCQllcnJvciA9IC1FSU87CiAJfQogCi0JaWYgKG9wZmxhZ3MgJiBRVVBfT1BfSU5fU0VSVklDRV9GTEFHKQotCQlzcGlfcXVwX2ZpZm9fcmVhZChjb250cm9sbGVyLCB4ZmVyKTsKKwlpZiAoIWNvbnRyb2xsZXItPnVzZV9kbWEpIHsKKwkJaWYgKG9wZmxhZ3MgJiBRVVBfT1BfSU5fU0VSVklDRV9GTEFHKQorCQkJc3BpX3F1cF9maWZvX3JlYWQoY29udHJvbGxlciwgeGZlcik7CiAKLQlpZiAob3BmbGFncyAmIFFVUF9PUF9PVVRfU0VSVklDRV9GTEFHKQotCQlzcGlfcXVwX2ZpZm9fd3JpdGUoY29udHJvbGxlciwgeGZlcik7CisJCWlmIChvcGZsYWdzICYgUVVQX09QX09VVF9TRVJWSUNFX0ZMQUcpCisJCQlzcGlfcXVwX2ZpZm9fd3JpdGUoY29udHJvbGxlciwgeGZlcik7CisJfQogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKIAljb250cm9sbGVyLT5lcnJvciA9IGVycm9yOwpAQCAtMzMyLDEzICs0NDMsMzUgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyB1MzIKK3NwaV9xdXBfZ2V0X21vZGUoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKK3sKKwlzdHJ1Y3Qgc3BpX3F1cCAqcXVwID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXUzMiBtb2RlOworCisJcXVwLT53X3NpemUgPSA0OworCisJaWYgKHhmZXItPmJpdHNfcGVyX3dvcmQgPD0gOCkKKwkJcXVwLT53X3NpemUgPSAxOworCWVsc2UgaWYgKHhmZXItPmJpdHNfcGVyX3dvcmQgPD0gMTYpCisJCXF1cC0+d19zaXplID0gMjsKKworCXF1cC0+bl93b3JkcyA9IHhmZXItPmxlbiAvIHF1cC0+d19zaXplOworCisJaWYgKHF1cC0+bl93b3JkcyA8PSAocXVwLT5pbl9maWZvX3N6IC8gc2l6ZW9mKHUzMikpKQorCQltb2RlID0gUVVQX0lPX01fTU9ERV9GSUZPOworCWVsc2UKKwkJbW9kZSA9IFFVUF9JT19NX01PREVfQkxPQ0s7CisKKwlyZXR1cm4gbW9kZTsKK30KIAogLyogc2V0IGNsb2NrIGZyZXEgLi4uIGJpdHMgcGVyIHdvcmQgKi8KIHN0YXRpYyBpbnQgc3BpX3F1cF9pb19jb25maWcoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKIAlzdHJ1Y3Qgc3BpX3F1cCAqY29udHJvbGxlciA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEoc3BpLT5tYXN0ZXIpOwogCXUzMiBjb25maWcsIGlvbW9kZSwgbW9kZSwgY29udHJvbDsKLQlpbnQgcmV0LCBuX3dvcmRzLCB3X3NpemU7CisJaW50IHJldCwgbl93b3JkczsKIAogCWlmIChzcGktPm1vZGUgJiBTUElfTE9PUCAmJiB4ZmVyLT5sZW4gPiBjb250cm9sbGVyLT5pbl9maWZvX3N6KSB7CiAJCWRldl9lcnIoY29udHJvbGxlci0+ZGV2LCAidG9vIGJpZyBzaXplIGZvciBsb29wYmFjayAlZCA+ICVkXG4iLApAQCAtMzU4LDM1ICs0OTEsNTQgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0Jd19zaXplID0gNDsKLQlpZiAoeGZlci0+Yml0c19wZXJfd29yZCA8PSA4KQotCQl3X3NpemUgPSAxOwotCWVsc2UgaWYgKHhmZXItPmJpdHNfcGVyX3dvcmQgPD0gMTYpCi0JCXdfc2l6ZSA9IDI7CisJbW9kZSA9IHNwaV9xdXBfZ2V0X21vZGUoc3BpLT5tYXN0ZXIsIHhmZXIpOworCW5fd29yZHMgPSBjb250cm9sbGVyLT5uX3dvcmRzOwogCi0Jbl93b3JkcyA9IHhmZXItPmxlbiAvIHdfc2l6ZTsKLQljb250cm9sbGVyLT53X3NpemUgPSB3X3NpemU7Ci0KLQlpZiAobl93b3JkcyA8PSAoY29udHJvbGxlci0+aW5fZmlmb19zeiAvIHNpemVvZih1MzIpKSkgewotCQltb2RlID0gUVVQX0lPX01fTU9ERV9GSUZPOworCWlmIChtb2RlID09IFFVUF9JT19NX01PREVfRklGTykgewogCQl3cml0ZWxfcmVsYXhlZChuX3dvcmRzLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX1JFQURfQ05UKTsKIAkJd3JpdGVsX3JlbGF4ZWQobl93b3JkcywgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9XUklURV9DTlQpOwogCQkvKiBtdXN0IGJlIHplcm8gZm9yIEZJRk8gKi8KIAkJd3JpdGVsX3JlbGF4ZWQoMCwgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9JTlBVVF9DTlQpOwogCQl3cml0ZWxfcmVsYXhlZCgwLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX09VVFBVVF9DTlQpOwotCX0gZWxzZSB7Ci0JCW1vZGUgPSBRVVBfSU9fTV9NT0RFX0JMT0NLOworCX0gZWxzZSBpZiAoIWNvbnRyb2xsZXItPnVzZV9kbWEpIHsKIAkJd3JpdGVsX3JlbGF4ZWQobl93b3JkcywgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9JTlBVVF9DTlQpOwogCQl3cml0ZWxfcmVsYXhlZChuX3dvcmRzLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX09VVFBVVF9DTlQpOwogCQkvKiBtdXN0IGJlIHplcm8gZm9yIEJMT0NLIGFuZCBCQU0gKi8KIAkJd3JpdGVsX3JlbGF4ZWQoMCwgY29udHJvbGxlci0+YmFzZSArIFFVUF9NWF9SRUFEX0NOVCk7CiAJCXdyaXRlbF9yZWxheGVkKDAsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfTVhfV1JJVEVfQ05UKTsKKwl9IGVsc2UgeworCQltb2RlID0gUVVQX0lPX01fTU9ERV9CQU07CisJCXdyaXRlbF9yZWxheGVkKDAsIGNvbnRyb2xsZXItPmJhc2UgKyBRVVBfTVhfUkVBRF9DTlQpOworCQl3cml0ZWxfcmVsYXhlZCgwLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX1dSSVRFX0NOVCk7CisKKwkJaWYgKCFjb250cm9sbGVyLT5xdXBfdjEpIHsKKwkJCXZvaWQgX19pb21lbSAqaW5wdXRfY250OworCisJCQlpbnB1dF9jbnQgPSBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX0lOUFVUX0NOVDsKKwkJCS8qCisJCQkgKiBmb3IgRE1BIHRyYW5zZmVycywgYm90aCBRVVBfTVhfSU5QVVRfQ05UIGFuZAorCQkJICogUVVQX01YX09VVFBVVF9DTlQgbXVzdCBiZSB6ZXJvIHRvIGFsbCBjYXNlcyBidXQgb25lLgorCQkJICogVGhhdCBjYXNlIGlzIGEgbm9uLWJhbGFuY2VkIHRyYW5zZmVyIHdoZW4gdGhlcmUgaXMKKwkJCSAqIG9ubHkgYSByeF9idWYuCisJCQkgKi8KKwkJCWlmICh4ZmVyLT50eF9idWYpCisJCQkJd3JpdGVsX3JlbGF4ZWQoMCwgaW5wdXRfY250KTsKKwkJCWVsc2UKKwkJCQl3cml0ZWxfcmVsYXhlZChuX3dvcmRzLCBpbnB1dF9jbnQpOworCisJCQl3cml0ZWxfcmVsYXhlZCgwLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX01YX09VVFBVVF9DTlQpOworCQl9CiAJfQogCiAJaW9tb2RlID0gcmVhZGxfcmVsYXhlZChjb250cm9sbGVyLT5iYXNlICsgUVVQX0lPX01fTU9ERVMpOwogCS8qIFNldCBpbnB1dCBhbmQgb3V0cHV0IHRyYW5zZmVyIG1vZGUgKi8KIAlpb21vZGUgJj0gfihRVVBfSU9fTV9JTlBVVF9NT0RFX01BU0sgfCBRVVBfSU9fTV9PVVRQVVRfTU9ERV9NQVNLKTsKLQlpb21vZGUgJj0gfihRVVBfSU9fTV9QQUNLX0VOIHwgUVVQX0lPX01fVU5QQUNLX0VOKTsKKworCWlmICghY29udHJvbGxlci0+dXNlX2RtYSkKKwkJaW9tb2RlICY9IH4oUVVQX0lPX01fUEFDS19FTiB8IFFVUF9JT19NX1VOUEFDS19FTik7CisJZWxzZQorCQlpb21vZGUgfD0gUVVQX0lPX01fUEFDS19FTiB8IFFVUF9JT19NX1VOUEFDS19FTjsKKwogCWlvbW9kZSB8PSAobW9kZSA8PCBRVVBfSU9fTV9PVVRQVVRfTU9ERV9NQVNLX1NISUZUKTsKIAlpb21vZGUgfD0gKG1vZGUgPDwgUVVQX0lPX01fSU5QVVRfTU9ERV9NQVNLX1NISUZUKTsKIApAQCAtNDI4LDExICs1ODAsMzEgQEAKIAljb25maWcgJj0gfihRVVBfQ09ORklHX05PX0lOUFVUIHwgUVVQX0NPTkZJR19OT19PVVRQVVQgfCBRVVBfQ09ORklHX04pOwogCWNvbmZpZyB8PSB4ZmVyLT5iaXRzX3Blcl93b3JkIC0gMTsKIAljb25maWcgfD0gUVVQX0NPTkZJR19TUElfTU9ERTsKKworCWlmIChjb250cm9sbGVyLT51c2VfZG1hKSB7CisJCWlmICgheGZlci0+dHhfYnVmKQorCQkJY29uZmlnIHw9IFFVUF9DT05GSUdfTk9fT1VUUFVUOworCQlpZiAoIXhmZXItPnJ4X2J1ZikKKwkJCWNvbmZpZyB8PSBRVVBfQ09ORklHX05PX0lOUFVUOworCX0KKwogCXdyaXRlbF9yZWxheGVkKGNvbmZpZywgY29udHJvbGxlci0+YmFzZSArIFFVUF9DT05GSUcpOwogCiAJLyogb25seSB3cml0ZSB0byBPUEVSQVRJT05BTF9NQVNLIHdoZW4gcmVnaXN0ZXIgaXMgcHJlc2VudCAqLwotCWlmICghY29udHJvbGxlci0+cXVwX3YxKQotCQl3cml0ZWxfcmVsYXhlZCgwLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX09QRVJBVElPTkFMX01BU0spOworCWlmICghY29udHJvbGxlci0+cXVwX3YxKSB7CisJCXUzMiBtYXNrID0gMDsKKworCQkvKgorCQkgKiBtYXNrIElOUFVUIGFuZCBPVVRQVVQgc2VydmljZSBmbGFncyB0byBwcmV2ZW50IElSUXMgb24gRklGTworCQkgKiBzdGF0dXMgY2hhbmdlIGluIEJBTSBtb2RlCisJCSAqLworCisJCWlmIChtb2RlID09IFFVUF9JT19NX01PREVfQkFNKQorCQkJbWFzayA9IFFVUF9PUF9JTl9TRVJWSUNFX0ZMQUcgfCBRVVBfT1BfT1VUX1NFUlZJQ0VfRkxBRzsKKworCQl3cml0ZWxfcmVsYXhlZChtYXNrLCBjb250cm9sbGVyLT5iYXNlICsgUVVQX09QRVJBVElPTkFMX01BU0spOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC00NjEsMTcgKzYzMywxMyBAQAogCWNvbnRyb2xsZXItPnR4X2J5dGVzID0gMDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CiAKLQlpZiAoc3BpX3F1cF9zZXRfc3RhdGUoY29udHJvbGxlciwgUVVQX1NUQVRFX1JVTikpIHsKLQkJZGV2X3dhcm4oY29udHJvbGxlci0+ZGV2LCAiY2Fubm90IHNldCBSVU4gc3RhdGVcbiIpOwotCQlnb3RvIGV4aXQ7Ci0JfQorCWlmIChjb250cm9sbGVyLT51c2VfZG1hKQorCQlyZXQgPSBzcGlfcXVwX2RvX2RtYShtYXN0ZXIsIHhmZXIpOworCWVsc2UKKwkJcmV0ID0gc3BpX3F1cF9kb19waW8obWFzdGVyLCB4ZmVyKTsKIAotCWlmIChzcGlfcXVwX3NldF9zdGF0ZShjb250cm9sbGVyLCBRVVBfU1RBVEVfUEFVU0UpKSB7Ci0JCWRldl93YXJuKGNvbnRyb2xsZXItPmRldiwgImNhbm5vdCBzZXQgUEFVU0Ugc3RhdGVcbiIpOworCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKLQl9Ci0KLQlzcGlfcXVwX2ZpZm9fd3JpdGUoY29udHJvbGxlciwgeGZlcik7CiAKIAlpZiAoc3BpX3F1cF9zZXRfc3RhdGUoY29udHJvbGxlciwgUVVQX1NUQVRFX1JVTikpIHsKIAkJZGV2X3dhcm4oY29udHJvbGxlci0+ZGV2LCAiY2Fubm90IHNldCBFWEVDVVRFIHN0YXRlXG4iKTsKQEAgLTQ4MCw2ICs2NDgsNyBAQAogCiAJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmNvbnRyb2xsZXItPmRvbmUsIHRpbWVvdXQpKQogCQlyZXQgPSAtRVRJTUVET1VUOworCiBleGl0OgogCXNwaV9xdXBfc2V0X3N0YXRlKGNvbnRyb2xsZXIsIFFVUF9TVEFURV9SRVNFVCk7CiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKQEAgLTQ4Nyw2ICs2NTYsOTcgQEAKIAlpZiAoIXJldCkKIAkJcmV0ID0gY29udHJvbGxlci0+ZXJyb3I7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOworCisJaWYgKHJldCAmJiBjb250cm9sbGVyLT51c2VfZG1hKQorCQlzcGlfcXVwX2RtYV90ZXJtaW5hdGUobWFzdGVyLCB4ZmVyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIHNwaV9xdXBfY2FuX2RtYShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJICAgIHN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCit7CisJc3RydWN0IHNwaV9xdXAgKnF1cCA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKKwlzaXplX3QgZG1hX2FsaWduID0gZG1hX2dldF9jYWNoZV9hbGlnbm1lbnQoKTsKKwl1MzIgbW9kZTsKKworCXF1cC0+dXNlX2RtYSA9IDA7CisKKwlpZiAoeGZlci0+cnhfYnVmICYmICh4ZmVyLT5sZW4gJSBxdXAtPmluX2Jsa19zeiB8fAorCSAgICBJU19FUlJfT1JfTlVMTChtYXN0ZXItPmRtYV9yeCkgfHwKKwkgICAgIUlTX0FMSUdORUQoKHNpemVfdCl4ZmVyLT5yeF9idWYsIGRtYV9hbGlnbikpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoeGZlci0+dHhfYnVmICYmICh4ZmVyLT5sZW4gJSBxdXAtPm91dF9ibGtfc3ogfHwKKwkgICAgSVNfRVJSX09SX05VTEwobWFzdGVyLT5kbWFfdHgpIHx8CisJICAgICFJU19BTElHTkVEKChzaXplX3QpeGZlci0+dHhfYnVmLCBkbWFfYWxpZ24pKSkKKwkJcmV0dXJuIGZhbHNlOworCisJbW9kZSA9IHNwaV9xdXBfZ2V0X21vZGUobWFzdGVyLCB4ZmVyKTsKKwlpZiAobW9kZSA9PSBRVVBfSU9fTV9NT0RFX0ZJRk8pCisJCXJldHVybiBmYWxzZTsKKworCXF1cC0+dXNlX2RtYSA9IDE7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgc3BpX3F1cF9yZWxlYXNlX2RtYShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyKQoreworCWlmICghSVNfRVJSX09SX05VTEwobWFzdGVyLT5kbWFfcngpKQorCQlkbWFfcmVsZWFzZV9jaGFubmVsKG1hc3Rlci0+ZG1hX3J4KTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKG1hc3Rlci0+ZG1hX3R4KSkKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChtYXN0ZXItPmRtYV90eCk7Cit9CisKK3N0YXRpYyBpbnQgc3BpX3F1cF9pbml0X2RtYShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCByZXNvdXJjZV9zaXplX3QgYmFzZSkKK3sKKwlzdHJ1Y3Qgc3BpX3F1cCAqc3BpID0gc3BpX21hc3Rlcl9nZXRfZGV2ZGF0YShtYXN0ZXIpOworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICpyeF9jb25mID0gJnNwaS0+cnhfY29uZiwKKwkJCQkqdHhfY29uZiA9ICZzcGktPnR4X2NvbmY7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc3BpLT5kZXY7CisJaW50IHJldDsKKworCS8qIGFsbG9jYXRlIGRtYSByZXNvdXJjZXMsIGlmIGF2YWlsYWJsZSAqLworCW1hc3Rlci0+ZG1hX3J4ID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbF9yZWFzb24oZGV2LCAicngiKTsKKwlpZiAoSVNfRVJSKG1hc3Rlci0+ZG1hX3J4KSkKKwkJcmV0dXJuIFBUUl9FUlIobWFzdGVyLT5kbWFfcngpOworCisJbWFzdGVyLT5kbWFfdHggPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsX3JlYXNvbihkZXYsICJ0eCIpOworCWlmIChJU19FUlIobWFzdGVyLT5kbWFfdHgpKSB7CisJCXJldCA9IFBUUl9FUlIobWFzdGVyLT5kbWFfdHgpOworCQlnb3RvIGVycl90eDsKKwl9CisKKwkvKiBzZXQgRE1BIHBhcmFtZXRlcnMgKi8KKwlyeF9jb25mLT5kaXJlY3Rpb24gPSBETUFfREVWX1RPX01FTTsKKwlyeF9jb25mLT5kZXZpY2VfZmMgPSAxOworCXJ4X2NvbmYtPnNyY19hZGRyID0gYmFzZSArIFFVUF9JTlBVVF9GSUZPOworCXJ4X2NvbmYtPnNyY19tYXhidXJzdCA9IHNwaS0+aW5fYmxrX3N6OworCisJdHhfY29uZi0+ZGlyZWN0aW9uID0gRE1BX01FTV9UT19ERVY7CisJdHhfY29uZi0+ZGV2aWNlX2ZjID0gMTsKKwl0eF9jb25mLT5kc3RfYWRkciA9IGJhc2UgKyBRVVBfT1VUUFVUX0ZJRk87CisJdHhfY29uZi0+ZHN0X21heGJ1cnN0ID0gc3BpLT5vdXRfYmxrX3N6OworCisJcmV0ID0gZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhtYXN0ZXItPmRtYV9yeCwgcnhfY29uZik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjb25maWd1cmUgUlggY2hhbm5lbFxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcobWFzdGVyLT5kbWFfdHgsIHR4X2NvbmYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY29uZmlndXJlIFRYIGNoYW5uZWxcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWRtYV9yZWxlYXNlX2NoYW5uZWwobWFzdGVyLT5kbWFfdHgpOworZXJyX3R4OgorCWRtYV9yZWxlYXNlX2NoYW5uZWwobWFzdGVyLT5kbWFfcngpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ5OCw3ICs3NTgsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAl2b2lkIF9faW9tZW0gKmJhc2U7Ci0JdTMyIG1heF9mcmVxLCBpb21vZGU7CisJdTMyIG1heF9mcmVxLCBpb21vZGUsIG51bV9jczsKIAlpbnQgcmV0LCBpcnEsIHNpemU7CiAKIAlkZXYgPSAmcGRldi0+ZGV2OwpAQCAtNTUwLDEwICs4MTAsMTEgQEAKIAl9CiAKIAkvKiB1c2UgbnVtLWNzIHVubGVzcyBub3QgcHJlc2VudCBvciBvdXQgb2YgcmFuZ2UgKi8KLQlpZiAob2ZfcHJvcGVydHlfcmVhZF91MTYoZGV2LT5vZl9ub2RlLCAibnVtLWNzIiwKLQkJCSZtYXN0ZXItPm51bV9jaGlwc2VsZWN0KSB8fAotCQkJKG1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPiBTUElfTlVNX0NISVBTRUxFQ1RTKSkKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIoZGV2LT5vZl9ub2RlLCAibnVtLWNzIiwgJm51bV9jcykgfHwKKwkgICAgbnVtX2NzID4gU1BJX05VTV9DSElQU0VMRUNUUykKIAkJbWFzdGVyLT5udW1fY2hpcHNlbGVjdCA9IFNQSV9OVU1fQ0hJUFNFTEVDVFM7CisJZWxzZQorCQltYXN0ZXItPm51bV9jaGlwc2VsZWN0ID0gbnVtX2NzOwogCiAJbWFzdGVyLT5idXNfbnVtID0gcGRldi0+aWQ7CiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BPTCB8IFNQSV9DUEhBIHwgU1BJX0NTX0hJR0ggfCBTUElfTE9PUDsKQEAgLTU2Miw2ICs4MjMsOCBAQAogCW1hc3Rlci0+dHJhbnNmZXJfb25lID0gc3BpX3F1cF90cmFuc2Zlcl9vbmU7CiAJbWFzdGVyLT5kZXYub2Zfbm9kZSA9IHBkZXYtPmRldi5vZl9ub2RlOwogCW1hc3Rlci0+YXV0b19ydW50aW1lX3BtID0gdHJ1ZTsKKwltYXN0ZXItPmRtYV9hbGlnbm1lbnQgPSBkbWFfZ2V0X2NhY2hlX2FsaWdubWVudCgpOworCW1hc3Rlci0+bWF4X2RtYV9sZW4gPSBTUElfTUFYX0RNQV9YRkVSOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWFzdGVyKTsKIApAQCAtNTczLDYgKzgzNiwxMiBAQAogCWNvbnRyb2xsZXItPmNjbGsgPSBjY2xrOwogCWNvbnRyb2xsZXItPmlycSA9IGlycTsKIAorCXJldCA9IHNwaV9xdXBfaW5pdF9kbWEobWFzdGVyLCByZXMtPnN0YXJ0KTsKKwlpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpCisJCWdvdG8gZXJyb3I7CisJZWxzZSBpZiAoIXJldCkKKwkJbWFzdGVyLT5jYW5fZG1hID0gc3BpX3F1cF9jYW5fZG1hOworCiAJLyogc2V0IHYxIGZsYWcgaWYgZGV2aWNlIGlzIHZlcnNpb24gMSAqLwogCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkZXYtPm9mX25vZGUsICJxY29tLHNwaS1xdXAtdjEuMS4xIikpCiAJCWNvbnRyb2xsZXItPnF1cF92MSA9IDE7CkBAIC02MDksNyArODc4LDcgQEAKIAlyZXQgPSBzcGlfcXVwX3NldF9zdGF0ZShjb250cm9sbGVyLCBRVVBfU1RBVEVfUkVTRVQpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycihkZXYsICJjYW5ub3Qgc2V0IFJFU0VUIHN0YXRlXG4iKTsKLQkJZ290byBlcnJvcjsKKwkJZ290byBlcnJvcl9kbWE7CiAJfQogCiAJd3JpdGVsX3JlbGF4ZWQoMCwgYmFzZSArIFFVUF9PUEVSQVRJT05BTCk7CkBAIC02MzMsNyArOTAyLDcgQEAKIAlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKGRldiwgaXJxLCBzcGlfcXVwX3F1cF9pcnEsCiAJCQkgICAgICAgSVJRRl9UUklHR0VSX0hJR0gsIHBkZXYtPm5hbWUsIGNvbnRyb2xsZXIpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7CisJCWdvdG8gZXJyb3JfZG1hOwogCiAJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZGV2LCBNU0VDX1BFUl9TRUMpOwogCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGRldik7CkBAIC02NDgsNiArOTE3LDggQEAKIAogZGlzYWJsZV9wbToKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CitlcnJvcl9kbWE6CisJc3BpX3F1cF9yZWxlYXNlX2RtYShtYXN0ZXIpOwogZXJyb3I6CiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNjbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShpY2xrKTsKQEAgLTczOSw2ICsxMDEwLDggQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJc3BpX3F1cF9yZWxlYXNlX2RtYShtYXN0ZXIpOworCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNvbnRyb2xsZXItPmNjbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShjb250cm9sbGVyLT5pY2xrKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXJvY2tjaGlwLmMgYi9kcml2ZXJzL3NwaS9zcGktcm9ja2NoaXAuYwppbmRleCAxYTc3N2RjLi42OGU3ZWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcm9ja2NoaXAuYworKysgYi9kcml2ZXJzL3NwaS9zcGktcm9ja2NoaXAuYwpAQCAtMTc5LDYgKzE3OSw3IEBACiAJdTggdG1vZGU7CiAJdTggYnB3OwogCXU4IG5fYnl0ZXM7CisJdTggcnNkX25zZWNzOwogCXVuc2lnbmVkIGxlbjsKIAl1MzIgc3BlZWQ7CiAKQEAgLTMwMiw4ICszMDMsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJvY2tjaGlwX3NwaV91bnByZXBhcmVfbWVzc2FnZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAotCQkJCQkgIHN0cnVjdCBzcGlfbWVzc2FnZSAqbXNnKQorc3RhdGljIHZvaWQgcm9ja2NoaXBfc3BpX2hhbmRsZV9lcnIoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciwKKwkJCQkgICAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgcm9ja2NoaXBfc3BpICpycyA9IHNwaV9tYXN0ZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsKQEAgLTMxMyw4ICszMTQsOCBAQAogCS8qCiAJICogRm9yIERNQSBtb2RlLCB3ZSBuZWVkIHRlcm1pbmF0ZSBETUEgY2hhbm5lbCBhbmQgZmx1c2gKIAkgKiBmaWZvIGZvciB0aGUgbmV4dCB0cmFuc2ZlciBpZiBETUEgdGhhbnNmZXIgdGltZW91dC4KLQkgKiB1bnByZXBhcmVfbWVzc2FnZSgpIHdhcyBjYWxsZWQgYnkgY29yZSBpZiB0cmFuc2ZlciBjb21wbGV0ZQotCSAqIG9yIHRpbWVvdXQuIE1heWJlIGl0IGlzIHJlYXNvbmFibGUgZm9yIGVycm9yIGhhbmRsaW5nIGhlcmUuCisJICogaGFuZGxlX2VycigpIHdhcyBjYWxsZWQgYnkgY29yZSBpZiB0cmFuc2ZlciBmYWlsZWQuCisJICogTWF5YmUgaXQgaXMgcmVhc29uYWJsZSBmb3IgZXJyb3IgaGFuZGxpbmcgaGVyZS4KIAkgKi8KIAlpZiAocnMtPnVzZV9kbWEpIHsKIAkJaWYgKHJzLT5zdGF0ZSAmIFJYQlVTWSkgewpAQCAtMzI3LDYgKzMyOCwxMiBAQAogCX0KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcm9ja2NoaXBfc3BpX3VucHJlcGFyZV9tZXNzYWdlKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkJCSAgc3RydWN0IHNwaV9tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHJvY2tjaGlwX3NwaSAqcnMgPSBzcGlfbWFzdGVyX2dldF9kZXZkYXRhKG1hc3Rlcik7CiAKIAlzcGlfZW5hYmxlX2NoaXAocnMsIDApOwogCkBAIC00OTMsNiArNTAwLDcgQEAKIHsKIAl1MzIgZGl2ID0gMDsKIAl1MzIgZG1hY3IgPSAwOworCWludCByc2QgPSAwOwogCiAJdTMyIGNyMCA9IChDUjBfQkhUXzhCSVQgPDwgQ1IwX0JIVF9PRkZTRVQpCiAJCXwgKENSMF9TU0RfT05FIDw8IENSMF9TU0RfT0ZGU0VUKTsKQEAgLTUxOSw5ICs1MjcsMjMgQEAKIAl9CiAKIAkvKiBkaXYgZG9lc24ndCBzdXBwb3J0IG9kZCBudW1iZXIgKi8KLQlkaXYgPSBtYXhfdCh1MzIsIHJzLT5tYXhfZnJlcSAvIHJzLT5zcGVlZCwgMSk7CisJZGl2ID0gRElWX1JPVU5EX1VQKHJzLT5tYXhfZnJlcSwgcnMtPnNwZWVkKTsKIAlkaXYgPSAoZGl2ICsgMSkgJiAweGZmZmU7CiAKKwkvKiBSeCBzYW1wbGUgZGVsYXkgaXMgZXhwcmVzc2VkIGluIHBhcmVudCBjbG9jayBjeWNsZXMgKG1heCAzKSAqLworCXJzZCA9IERJVl9ST1VORF9DTE9TRVNUKHJzLT5yc2RfbnNlY3MgKiAocnMtPm1heF9mcmVxID4+IDgpLAorCQkJCTEwMDAwMDAwMDAgPj4gOCk7CisJaWYgKCFyc2QgJiYgcnMtPnJzZF9uc2VjcykgeworCQlwcl93YXJuX29uY2UoInJvY2tjaGlwLXNwaTogJXUgSHogYXJlIHRvbyBzbG93IHRvIGV4cHJlc3MgJXUgbnMgZGVsYXlcbiIsCisJCQkgICAgIHJzLT5tYXhfZnJlcSwgcnMtPnJzZF9uc2Vjcyk7CisJfSBlbHNlIGlmIChyc2QgPiAzKSB7CisJCXJzZCA9IDM7CisJCXByX3dhcm5fb25jZSgicm9ja2NoaXAtc3BpOiAldSBIeiBhcmUgdG9vIGZhc3QgdG8gZXhwcmVzcyAldSBucyBkZWxheSwgY2xhbXBpbmcgYXQgJXUgbnNcbiIsCisJCQkgICAgIHJzLT5tYXhfZnJlcSwgcnMtPnJzZF9uc2VjcywKKwkJCSAgICAgcnNkICogMTAwMDAwMDAwMFUgLyBycy0+bWF4X2ZyZXEpOworCX0KKwljcjAgfD0gcnNkIDw8IENSMF9SU0RfT0ZGU0VUOworCiAJd3JpdGVsX3JlbGF4ZWQoY3IwLCBycy0+cmVncyArIFJPQ0tDSElQX1NQSV9DVFJMUjApOwogCiAJd3JpdGVsX3JlbGF4ZWQocnMtPmxlbiAtIDEsIHJzLT5yZWdzICsgUk9DS0NISVBfU1BJX0NUUkxSMSk7CkBAIC02MTQsNiArNjM2LDcgQEAKIAlzdHJ1Y3Qgcm9ja2NoaXBfc3BpICpyczsKIAlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOwogCXN0cnVjdCByZXNvdXJjZSAqbWVtOworCXUzMiByc2RfbnNlY3M7CiAKIAltYXN0ZXIgPSBzcGlfYWxsb2NfbWFzdGVyKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3Qgcm9ja2NoaXBfc3BpKSk7CiAJaWYgKCFtYXN0ZXIpCkBAIC02NjUsNiArNjg4LDEwIEBACiAJcnMtPmRldiA9ICZwZGV2LT5kZXY7CiAJcnMtPm1heF9mcmVxID0gY2xrX2dldF9yYXRlKHJzLT5zcGljbGspOwogCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgInJ4LXNhbXBsZS1kZWxheS1ucyIsCisJCQkJICAmcnNkX25zZWNzKSkKKwkJcnMtPnJzZF9uc2VjcyA9IHJzZF9uc2VjczsKKwogCXJzLT5maWZvX2xlbiA9IGdldF9maWZvX2xlbihycyk7CiAJaWYgKCFycy0+Zmlmb19sZW4pIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBmaWZvIGxlbmd0aFxuIik7CkBAIC02ODgsNiArNzE1LDcgQEAKIAltYXN0ZXItPnByZXBhcmVfbWVzc2FnZSA9IHJvY2tjaGlwX3NwaV9wcmVwYXJlX21lc3NhZ2U7CiAJbWFzdGVyLT51bnByZXBhcmVfbWVzc2FnZSA9IHJvY2tjaGlwX3NwaV91bnByZXBhcmVfbWVzc2FnZTsKIAltYXN0ZXItPnRyYW5zZmVyX29uZSA9IHJvY2tjaGlwX3NwaV90cmFuc2Zlcl9vbmU7CisJbWFzdGVyLT5oYW5kbGVfZXJyID0gcm9ja2NoaXBfc3BpX2hhbmRsZV9lcnI7CiAKIAlycy0+ZG1hX3R4LmNoID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbChycy0+ZGV2LCAidHgiKTsKIAlpZiAoIXJzLT5kbWFfdHguY2gpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcnNwaS5jIGIvZHJpdmVycy9zcGkvc3BpLXJzcGkuYwppbmRleCA0NmNlNDcwLi4xODY5MjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktcnNwaS5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1yc3BpLmMKQEAgLTE3Nyw2ICsxNzcsMTMgQEAKICNkZWZpbmUgU1BCRkNSX1JYUlNUCQkweDQwCS8qIFJlY2VpdmUgQnVmZmVyIERhdGEgUmVzZXQgKi8KICNkZWZpbmUgU1BCRkNSX1RYVFJHX01BU0sJMHgzMAkvKiBUcmFuc21pdCBCdWZmZXIgRGF0YSBUcmlnZ2VyaW5nIE51bWJlciAqLwogI2RlZmluZSBTUEJGQ1JfUlhUUkdfTUFTSwkweDA3CS8qIFJlY2VpdmUgQnVmZmVyIERhdGEgVHJpZ2dlcmluZyBOdW1iZXIgKi8KKy8qIFFTUEkgb24gUi1DYXIgR2VuMiAqLworI2RlZmluZSBTUEJGQ1JfVFhUUkdfMUIJCTB4MDAJLyogMzEgYnl0ZXMgKDEgYnl0ZSBhdmFpbGFibGUpICovCisjZGVmaW5lIFNQQkZDUl9UWFRSR18zMkIJMHgzMAkvKiAwIGJ5dGUgKDMyIGJ5dGVzIGF2YWlsYWJsZSkgKi8KKyNkZWZpbmUgU1BCRkNSX1JYVFJHXzFCCQkweDAwCS8qIDEgYnl0ZSAoMzEgYnl0ZXMgYXZhaWxhYmxlKSAqLworI2RlZmluZSBTUEJGQ1JfUlhUUkdfMzJCCTB4MDcJLyogMzIgYnl0ZXMgKDAgYnl0ZSBhdmFpbGFibGUpICovCisKKyNkZWZpbmUgUVNQSV9CVUZGRVJfU0laRSAgICAgICAgMzJ1CiAKIHN0cnVjdCByc3BpX2RhdGEgewogCXZvaWQgX19pb21lbSAqYWRkcjsKQEAgLTM2Niw2ICszNzMsNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcXNwaV91cGRhdGUoY29uc3Qgc3RydWN0IHJzcGlfZGF0YSAqcnNwaSwgdTggbWFzaywgdTggdmFsLCB1OCByZWcpCit7CisJdTggZGF0YTsKKworCWRhdGEgPSByc3BpX3JlYWQ4KHJzcGksIHJlZyk7CisJZGF0YSAmPSB+bWFzazsKKwlkYXRhIHw9ICh2YWwgJiBtYXNrKTsKKwlyc3BpX3dyaXRlOChyc3BpLCBkYXRhLCByZWcpOworfQorCitzdGF0aWMgaW50IHFzcGlfc2V0X3NlbmRfdHJpZ2dlcihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBuOworCisJbiA9IG1pbihsZW4sIFFTUElfQlVGRkVSX1NJWkUpOworCisJaWYgKGxlbiA+PSBRU1BJX0JVRkZFUl9TSVpFKSB7CisJCS8qIHNldHMgdHJpZ2dlcmluZyBudW1iZXIgdG8gMzIgYnl0ZXMgKi8KKwkJcXNwaV91cGRhdGUocnNwaSwgU1BCRkNSX1RYVFJHX01BU0ssCisJCQkgICAgIFNQQkZDUl9UWFRSR18zMkIsIFFTUElfU1BCRkNSKTsKKwl9IGVsc2UgeworCQkvKiBzZXRzIHRyaWdnZXJpbmcgbnVtYmVyIHRvIDEgYnl0ZSAqLworCQlxc3BpX3VwZGF0ZShyc3BpLCBTUEJGQ1JfVFhUUkdfTUFTSywKKwkJCSAgICAgU1BCRkNSX1RYVFJHXzFCLCBRU1BJX1NQQkZDUik7CisJfQorCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyB2b2lkIHFzcGlfc2V0X3JlY2VpdmVfdHJpZ2dlcihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBuOworCisJbiA9IG1pbihsZW4sIFFTUElfQlVGRkVSX1NJWkUpOworCisJaWYgKGxlbiA+PSBRU1BJX0JVRkZFUl9TSVpFKSB7CisJCS8qIHNldHMgdHJpZ2dlcmluZyBudW1iZXIgdG8gMzIgYnl0ZXMgKi8KKwkJcXNwaV91cGRhdGUocnNwaSwgU1BCRkNSX1JYVFJHX01BU0ssCisJCQkgICAgIFNQQkZDUl9SWFRSR18zMkIsIFFTUElfU1BCRkNSKTsKKwl9IGVsc2UgeworCQkvKiBzZXRzIHRyaWdnZXJpbmcgbnVtYmVyIHRvIDEgYnl0ZSAqLworCQlxc3BpX3VwZGF0ZShyc3BpLCBTUEJGQ1JfUlhUUkdfTUFTSywKKwkJCSAgICAgU1BCRkNSX1JYVFJHXzFCLCBRU1BJX1NQQkZDUik7CisJfQorfQorCiAjZGVmaW5lIHNldF9jb25maWdfcmVnaXN0ZXIoc3BpLCBuKSBzcGktPm9wcy0+c2V0X2NvbmZpZ19yZWdpc3RlcihzcGksIG4pCiAKIHN0YXRpYyB2b2lkIHJzcGlfZW5hYmxlX2lycShjb25zdCBzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCB1OCBlbmFibGUpCkBAIC02MDksMTggKzY2MiwyOCBAQAogCXJldHVybiBfX3JzcGlfY2FuX2RtYShyc3BpLCB4ZmVyKTsKIH0KIAorc3RhdGljIGludCByc3BpX2RtYV9jaGVja190aGVuX3RyYW5zZmVyKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksCisJCQkJCSBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQoreworCWlmIChyc3BpLT5tYXN0ZXItPmNhbl9kbWEgJiYgX19yc3BpX2Nhbl9kbWEocnNwaSwgeGZlcikpIHsKKwkJLyogcnhfYnVmIGNhbiBiZSBOVUxMIG9uIFJTUEkgb24gU0ggaW4gVFgtb25seSBNb2RlICovCisJCWludCByZXQgPSByc3BpX2RtYV90cmFuc2Zlcihyc3BpLCAmeGZlci0+dHhfc2csCisJCQkJCXhmZXItPnJ4X2J1ZiA/ICZ4ZmVyLT5yeF9zZyA6IE5VTEwpOworCQlpZiAocmV0ICE9IC1FQUdBSU4pCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVBR0FJTjsKK30KKwogc3RhdGljIGludCByc3BpX2NvbW1vbl90cmFuc2ZlcihzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLAogCQkJCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnhmZXIpCiB7CiAJaW50IHJldDsKIAotCWlmIChyc3BpLT5tYXN0ZXItPmNhbl9kbWEgJiYgX19yc3BpX2Nhbl9kbWEocnNwaSwgeGZlcikpIHsKLQkJLyogcnhfYnVmIGNhbiBiZSBOVUxMIG9uIFJTUEkgb24gU0ggaW4gVFgtb25seSBNb2RlICovCi0JCXJldCA9IHJzcGlfZG1hX3RyYW5zZmVyKHJzcGksICZ4ZmVyLT50eF9zZywKLQkJCQkJeGZlci0+cnhfYnVmID8gJnhmZXItPnJ4X3NnIDogTlVMTCk7Ci0JCWlmIChyZXQgIT0gLUVBR0FJTikKLQkJCXJldHVybiByZXQ7Ci0JfQorCXJldCA9IHJzcGlfZG1hX2NoZWNrX3RoZW5fdHJhbnNmZXIocnNwaSwgeGZlcik7CisJaWYgKHJldCAhPSAtRUFHQUlOKQorCQlyZXR1cm4gcmV0OwogCiAJcmV0ID0gcnNwaV9waW9fdHJhbnNmZXIocnNwaSwgeGZlci0+dHhfYnVmLCB4ZmVyLT5yeF9idWYsIHhmZXItPmxlbik7CiAJaWYgKHJldCA8IDApCkBAIC02NjEsMTIgKzcyNCw1OSBAQAogCXJldHVybiByc3BpX2NvbW1vbl90cmFuc2Zlcihyc3BpLCB4ZmVyKTsKIH0KIAorc3RhdGljIGludCBxc3BpX3RyaWdnZXJfdHJhbnNmZXJfb3V0X2ludChzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBjb25zdCB1OCAqdHgsCisJCQkJCXU4ICpyeCwgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgaSwgbiwgcmV0OworCWludCBlcnJvcjsKKworCXdoaWxlIChsZW4gPiAwKSB7CisJCW4gPSBxc3BpX3NldF9zZW5kX3RyaWdnZXIocnNwaSwgbGVuKTsKKwkJcXNwaV9zZXRfcmVjZWl2ZV90cmlnZ2VyKHJzcGksIGxlbik7CisJCWlmIChuID09IFFTUElfQlVGRkVSX1NJWkUpIHsKKwkJCWVycm9yID0gcnNwaV93YWl0X2Zvcl90eF9lbXB0eShyc3BpKTsKKwkJCWlmIChlcnJvciA8IDApIHsKKwkJCQlkZXZfZXJyKCZyc3BpLT5tYXN0ZXItPmRldiwgInRyYW5zbWl0IHRpbWVvdXRcbiIpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQkJcnNwaV93cml0ZV9kYXRhKHJzcGksICp0eCsrKTsKKworCQkJZXJyb3IgPSByc3BpX3dhaXRfZm9yX3J4X2Z1bGwocnNwaSk7CisJCQlpZiAoZXJyb3IgPCAwKSB7CisJCQkJZGV2X2VycigmcnNwaS0+bWFzdGVyLT5kZXYsICJyZWNlaXZlIHRpbWVvdXRcbiIpOworCQkJCXJldHVybiBlcnJvcjsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCQkJKnJ4KysgPSByc3BpX3JlYWRfZGF0YShyc3BpKTsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IHJzcGlfcGlvX3RyYW5zZmVyKHJzcGksIHR4LCByeCwgbik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCWxlbiAtPSBuOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHFzcGlfdHJhbnNmZXJfb3V0X2luKHN0cnVjdCByc3BpX2RhdGEgKnJzcGksCiAJCQkJc3RydWN0IHNwaV90cmFuc2ZlciAqeGZlcikKIHsKKwlpbnQgcmV0OworCiAJcXNwaV9yZWNlaXZlX2luaXQocnNwaSk7CiAKLQlyZXR1cm4gcnNwaV9jb21tb25fdHJhbnNmZXIocnNwaSwgeGZlcik7CisJcmV0ID0gcnNwaV9kbWFfY2hlY2tfdGhlbl90cmFuc2Zlcihyc3BpLCB4ZmVyKTsKKwlpZiAocmV0ICE9IC1FQUdBSU4pCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBxc3BpX3RyaWdnZXJfdHJhbnNmZXJfb3V0X2ludChyc3BpLCB4ZmVyLT50eF9idWYsCisJCQkJCSAgICB4ZmVyLT5yeF9idWYsIHhmZXItPmxlbik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBxc3BpX3RyYW5zZmVyX291dChzdHJ1Y3QgcnNwaV9kYXRhICpyc3BpLCBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp4ZmVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXMzYzY0eHguYyBiL2RyaXZlcnMvc3BpL3NwaS1zM2M2NHh4LmMKaW5kZXggOTIzMWMzNC4uYjFjNjczMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXMzYzY0eHguYworKysgYi9kcml2ZXJzL3NwaS9zcGktczNjNjR4eC5jCkBAIC0zMjQsNyArMzI0LDcgQEAKIAogCQkvKiBBY3F1aXJlIERNQSBjaGFubmVscyAqLwogCQlzZGQtPnJ4X2RtYS5jaCA9IGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWxfY29tcGF0KG1hc2ssIGZpbHRlciwKLQkJCQkgICAodm9pZCAqKXNkZC0+cnhfZG1hLmRtYWNoLCBkZXYsICJyeCIpOworCQkJCSAgICh2b2lkICopKGxvbmcpc2RkLT5yeF9kbWEuZG1hY2gsIGRldiwgInJ4Iik7CiAJCWlmICghc2RkLT5yeF9kbWEuY2gpIHsKIAkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBSWCBETUEgY2hhbm5lbFxuIik7CiAJCQlyZXQgPSAtRUJVU1k7CkBAIC0zMzMsNyArMzMzLDcgQEAKIAkJc3BpLT5kbWFfcnggPSBzZGQtPnJ4X2RtYS5jaDsKIAogCQlzZGQtPnR4X2RtYS5jaCA9IGRtYV9yZXF1ZXN0X3NsYXZlX2NoYW5uZWxfY29tcGF0KG1hc2ssIGZpbHRlciwKLQkJCQkgICAodm9pZCAqKXNkZC0+dHhfZG1hLmRtYWNoLCBkZXYsICJ0eCIpOworCQkJCSAgICh2b2lkICopKGxvbmcpc2RkLT50eF9kbWEuZG1hY2gsIGRldiwgInR4Iik7CiAJCWlmICghc2RkLT50eF9kbWEuY2gpIHsKIAkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBUWCBETUEgY2hhbm5lbFxuIik7CiAJCQlyZXQgPSAtRUJVU1k7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktc2MxOGlzNjAyLmMgYi9kcml2ZXJzL3NwaS9zcGktc2MxOGlzNjAyLmMKaW5kZXggNWE1NmFjZi4uMzZhZjRkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXNjMThpczYwMi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1zYzE4aXM2MDIuYwpAQCAtMjg2LDcgKzI4Niw3IEBACiAJCQlody0+ZnJlcSA9IFNDMThJUzYwMl9DTE9DSzsKIAkJYnJlYWs7CiAJfQotCW1hc3Rlci0+YnVzX251bSA9IGNsaWVudC0+YWRhcHRlci0+bnI7CisJbWFzdGVyLT5idXNfbnVtID0gbnAgPyAtMSA6IGNsaWVudC0+YWRhcHRlci0+bnI7CiAJbWFzdGVyLT5tb2RlX2JpdHMgPSBTUElfQ1BIQSB8IFNQSV9DUE9MIHwgU1BJX0xTQl9GSVJTVDsKIAltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KTsKIAltYXN0ZXItPnNldHVwID0gc2MxOGlzNjAyX3NldHVwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLXN0LXNzYzQuYyBiL2RyaXZlcnMvc3BpL3NwaS1zdC1zc2M0LmMKaW5kZXggMmZhZWFhNy4uZjE3YzBhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLXN0LXNzYzQuYworKysgYi9kcml2ZXJzL3NwaS9zcGktc3Qtc3NjNC5jCkBAIC00ODIsNyArNDgyLDcgQEAKIAlTRVRfUlVOVElNRV9QTV9PUFMoc3BpX3N0X3J1bnRpbWVfc3VzcGVuZCwgc3BpX3N0X3J1bnRpbWVfcmVzdW1lLCBOVUxMKQogfTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgc3RtX3NwaV9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3RtX3NwaV9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAic3QsY29tbXMtc3NjNC1zcGkiLCB9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS5jIGIvZHJpdmVycy9zcGkvc3BpLmMKaW5kZXggYzY0YTNlNS4uZDVkN2QyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLmMKQEAgLTE2LDcgKzE2LDYgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgva21vZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgpAQCAtMTI5LDEyNSArMTI4LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyBpbnQgc3BpX2xlZ2FjeV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCi17Ci0JaW50CQkJdmFsdWUgPSAwOwotCXN0cnVjdCBzcGlfZHJpdmVyCSpkcnYgPSB0b19zcGlfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQotCS8qIHN1c3BlbmQgd2lsbCBzdG9wIGlycXMgYW5kIGRtYTsgbm8gbW9yZSBpL28gKi8KLQlpZiAoZHJ2KSB7Ci0JCWlmIChkcnYtPnN1c3BlbmQpCi0JCQl2YWx1ZSA9IGRydi0+c3VzcGVuZCh0b19zcGlfZGV2aWNlKGRldiksIG1lc3NhZ2UpOwotCQllbHNlCi0JCQlkZXZfZGJnKGRldiwgIi4uLiBjYW4ndCBzdXNwZW5kXG4iKTsKLQl9Ci0JcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgaW50IHNwaV9sZWdhY3lfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQJCQl2YWx1ZSA9IDA7Ci0Jc3RydWN0IHNwaV9kcml2ZXIJKmRydiA9IHRvX3NwaV9kcml2ZXIoZGV2LT5kcml2ZXIpOwotCi0JLyogcmVzdW1lIG1heSByZXN0YXJ0IHRoZSBpL28gcXVldWUgKi8KLQlpZiAoZHJ2KSB7Ci0JCWlmIChkcnYtPnJlc3VtZSkKLQkJCXZhbHVlID0gZHJ2LT5yZXN1bWUodG9fc3BpX2RldmljZShkZXYpKTsKLQkJZWxzZQotCQkJZGV2X2RiZyhkZXYsICIuLi4gY2FuJ3QgcmVzdW1lXG4iKTsKLQl9Ci0JcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgaW50IHNwaV9wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5wbSA6IE5VTEw7Ci0KLQlpZiAocG0pCi0JCXJldHVybiBwbV9nZW5lcmljX3N1c3BlbmQoZGV2KTsKLQllbHNlCi0JCXJldHVybiBzcGlfbGVnYWN5X3N1c3BlbmQoZGV2LCBQTVNHX1NVU1BFTkQpOwotfQotCi1zdGF0aWMgaW50IHNwaV9wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbSA9IGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPnBtIDogTlVMTDsKLQotCWlmIChwbSkKLQkJcmV0dXJuIHBtX2dlbmVyaWNfcmVzdW1lKGRldik7Ci0JZWxzZQotCQlyZXR1cm4gc3BpX2xlZ2FjeV9yZXN1bWUoZGV2KTsKLX0KLQotc3RhdGljIGludCBzcGlfcG1fZnJlZXplKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQljb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyAqcG0gPSBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5wbSA6IE5VTEw7Ci0KLQlpZiAocG0pCi0JCXJldHVybiBwbV9nZW5lcmljX2ZyZWV6ZShkZXYpOwotCWVsc2UKLQkJcmV0dXJuIHNwaV9sZWdhY3lfc3VzcGVuZChkZXYsIFBNU0dfRlJFRVpFKTsKLX0KLQotc3RhdGljIGludCBzcGlfcG1fdGhhdyhzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgKnBtID0gZGV2LT5kcml2ZXIgPyBkZXYtPmRyaXZlci0+cG0gOiBOVUxMOwotCi0JaWYgKHBtKQotCQlyZXR1cm4gcG1fZ2VuZXJpY190aGF3KGRldik7Ci0JZWxzZQotCQlyZXR1cm4gc3BpX2xlZ2FjeV9yZXN1bWUoZGV2KTsKLX0KLQotc3RhdGljIGludCBzcGlfcG1fcG93ZXJvZmYoc3RydWN0IGRldmljZSAqZGV2KQotewotCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbSA9IGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPnBtIDogTlVMTDsKLQotCWlmIChwbSkKLQkJcmV0dXJuIHBtX2dlbmVyaWNfcG93ZXJvZmYoZGV2KTsKLQllbHNlCi0JCXJldHVybiBzcGlfbGVnYWN5X3N1c3BlbmQoZGV2LCBQTVNHX0hJQkVSTkFURSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3BpX3BtX3Jlc3RvcmUoc3RydWN0IGRldmljZSAqZGV2KQotewotCWNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzICpwbSA9IGRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPnBtIDogTlVMTDsKLQotCWlmIChwbSkKLQkJcmV0dXJuIHBtX2dlbmVyaWNfcmVzdG9yZShkZXYpOwotCWVsc2UKLQkJcmV0dXJuIHNwaV9sZWdhY3lfcmVzdW1lKGRldik7Ci19Ci0jZWxzZQotI2RlZmluZSBzcGlfcG1fc3VzcGVuZAlOVUxMCi0jZGVmaW5lIHNwaV9wbV9yZXN1bWUJTlVMTAotI2RlZmluZSBzcGlfcG1fZnJlZXplCU5VTEwKLSNkZWZpbmUgc3BpX3BtX3RoYXcJTlVMTAotI2RlZmluZSBzcGlfcG1fcG93ZXJvZmYJTlVMTAotI2RlZmluZSBzcGlfcG1fcmVzdG9yZQlOVUxMCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNwaV9wbSA9IHsKLQkuc3VzcGVuZCA9IHNwaV9wbV9zdXNwZW5kLAotCS5yZXN1bWUgPSBzcGlfcG1fcmVzdW1lLAotCS5mcmVlemUgPSBzcGlfcG1fZnJlZXplLAotCS50aGF3ID0gc3BpX3BtX3RoYXcsCi0JLnBvd2Vyb2ZmID0gc3BpX3BtX3Bvd2Vyb2ZmLAotCS5yZXN0b3JlID0gc3BpX3BtX3Jlc3RvcmUsCi0JU0VUX1JVTlRJTUVfUE1fT1BTKAotCQlwbV9nZW5lcmljX3J1bnRpbWVfc3VzcGVuZCwKLQkJcG1fZ2VuZXJpY19ydW50aW1lX3Jlc3VtZSwKLQkJTlVMTAotCSkKLX07Ci0KIHN0cnVjdCBidXNfdHlwZSBzcGlfYnVzX3R5cGUgPSB7CiAJLm5hbWUJCT0gInNwaSIsCiAJLmRldl9ncm91cHMJPSBzcGlfZGV2X2dyb3VwcywKIAkubWF0Y2gJCT0gc3BpX21hdGNoX2RldmljZSwKIAkudWV2ZW50CQk9IHNwaV91ZXZlbnQsCi0JLnBtCQk9ICZzcGlfcG0sCiB9OwogRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2J1c190eXBlKTsKIApAQCAtODUxLDYgKzczNiw5IEBACiAJaWYgKG1zZy0+c3RhdHVzID09IC1FSU5QUk9HUkVTUykKIAkJbXNnLT5zdGF0dXMgPSByZXQ7CiAKKwlpZiAobXNnLT5zdGF0dXMgJiYgbWFzdGVyLT5oYW5kbGVfZXJyKQorCQltYXN0ZXItPmhhbmRsZV9lcnIobWFzdGVyLCBtc2cpOworCiAJc3BpX2ZpbmFsaXplX2N1cnJlbnRfbWVzc2FnZShtYXN0ZXIpOwogCiAJcmV0dXJuIHJldDsKQEAgLTExMDUsMTMgKzk5MywxNCBAQAogCQkJCSJmYWlsZWQgdG8gdW5wcmVwYXJlIG1lc3NhZ2U6ICVkXG4iLCByZXQpOwogCQl9CiAJfQorCisJdHJhY2Vfc3BpX21lc3NhZ2VfZG9uZShtZXNnKTsKKwogCW1hc3Rlci0+Y3VyX21zZ19wcmVwYXJlZCA9IGZhbHNlOwogCiAJbWVzZy0+c3RhdGUgPSBOVUxMOwogCWlmIChtZXNnLT5jb21wbGV0ZSkKIAkJbWVzZy0+Y29tcGxldGUobWVzZy0+Y29udGV4dCk7Ci0KLQl0cmFjZV9zcGlfbWVzc2FnZV9kb25lKG1lc2cpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc3BpX2ZpbmFsaXplX2N1cnJlbnRfbWVzc2FnZSk7CiAKQEAgLTEzNTksNyArMTI0OCw2IEBACiAJc3BpLT5kZXYub2Zfbm9kZSA9IG5jOwogCiAJLyogUmVnaXN0ZXIgdGhlIG5ldyBkZXZpY2UgKi8KLQlyZXF1ZXN0X21vZHVsZSgiJXMlcyIsIFNQSV9NT0RVTEVfUFJFRklYLCBzcGktPm1vZGFsaWFzKTsKIAlyYyA9IHNwaV9hZGRfZGV2aWNlKHNwaSk7CiAJaWYgKHJjKSB7CiAJCWRldl9lcnIoJm1hc3Rlci0+ZGV2LCAic3BpX2RldmljZSByZWdpc3RlciBlcnJvciAlc1xuIiwKQEAgLTE4OTMsNiArMTc4MSw4IEBACiAJaWYgKCFzcGktPm1heF9zcGVlZF9oeikKIAkJc3BpLT5tYXhfc3BlZWRfaHogPSBzcGktPm1hc3Rlci0+bWF4X3NwZWVkX2h6OwogCisJc3BpX3NldF9jcyhzcGksIGZhbHNlKTsKKwogCWlmIChzcGktPm1hc3Rlci0+c2V0dXApCiAJCXN0YXR1cyA9IHNwaS0+bWFzdGVyLT5zZXR1cChzcGkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGlkZXYuYyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCmluZGV4IDRlYjdhOTguLjkyYzkwOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaWRldi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaWRldi5jCkBAIC0yMjMsNyArMjIzLDcgQEAKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCSprX3hmZXJzOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIJKmtfdG1wOwogCXN0cnVjdCBzcGlfaW9jX3RyYW5zZmVyICp1X3RtcDsKLQl1bnNpZ25lZAkJbiwgdG90YWw7CisJdW5zaWduZWQJCW4sIHRvdGFsLCB0eF90b3RhbCwgcnhfdG90YWw7CiAJdTgJCQkqdHhfYnVmLCAqcnhfYnVmOwogCWludAkJCXN0YXR1cyA9IC1FRkFVTFQ7CiAKQEAgLTIzOSwzMyArMjM5LDUyIEBACiAJdHhfYnVmID0gc3BpZGV2LT50eF9idWZmZXI7CiAJcnhfYnVmID0gc3BpZGV2LT5yeF9idWZmZXI7CiAJdG90YWwgPSAwOworCXR4X3RvdGFsID0gMDsKKwlyeF90b3RhbCA9IDA7CiAJZm9yIChuID0gbl94ZmVycywga190bXAgPSBrX3hmZXJzLCB1X3RtcCA9IHVfeGZlcnM7CiAJCQluOwogCQkJbi0tLCBrX3RtcCsrLCB1X3RtcCsrKSB7CiAJCWtfdG1wLT5sZW4gPSB1X3RtcC0+bGVuOwogCiAJCXRvdGFsICs9IGtfdG1wLT5sZW47Ci0JCWlmICh0b3RhbCA+IGJ1ZnNpeikgeworCQkvKiBTaW5jZSB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRyYW5zZmVycworCQkgKiBvbiBzdWNjZXNzLCByZXN0cmljdCB0aGUgdG90YWwgdG8gcG9zaXRpdmUgaW50IHZhbHVlcyB0bworCQkgKiBhdm9pZCB0aGUgcmV0dXJuIHZhbHVlIGxvb2tpbmcgbGlrZSBhbiBlcnJvci4gIEFsc28gY2hlY2sKKwkJICogZWFjaCB0cmFuc2ZlciBsZW5ndGggdG8gYXZvaWQgYXJpdGhtZXRpYyBvdmVyZmxvdy4KKwkJICovCisJCWlmICh0b3RhbCA+IElOVF9NQVggfHwga190bXAtPmxlbiA+IElOVF9NQVgpIHsKIAkJCXN0YXR1cyA9IC1FTVNHU0laRTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCiAJCWlmICh1X3RtcC0+cnhfYnVmKSB7CisJCQkvKiB0aGlzIHRyYW5zZmVyIG5lZWRzIHNwYWNlIGluIFJYIGJvdW5jZSBidWZmZXIgKi8KKwkJCXJ4X3RvdGFsICs9IGtfdG1wLT5sZW47CisJCQlpZiAocnhfdG90YWwgPiBidWZzaXopIHsKKwkJCQlzdGF0dXMgPSAtRU1TR1NJWkU7CisJCQkJZ290byBkb25lOworCQkJfQogCQkJa190bXAtPnJ4X2J1ZiA9IHJ4X2J1ZjsKIAkJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgKHU4IF9fdXNlciAqKQogCQkJCQkJKHVpbnRwdHJfdCkgdV90bXAtPnJ4X2J1ZiwKIAkJCQkJCXVfdG1wLT5sZW4pKQogCQkJCWdvdG8gZG9uZTsKKwkJCXJ4X2J1ZiArPSBrX3RtcC0+bGVuOwogCQl9CiAJCWlmICh1X3RtcC0+dHhfYnVmKSB7CisJCQkvKiB0aGlzIHRyYW5zZmVyIG5lZWRzIHNwYWNlIGluIFRYIGJvdW5jZSBidWZmZXIgKi8KKwkJCXR4X3RvdGFsICs9IGtfdG1wLT5sZW47CisJCQlpZiAodHhfdG90YWwgPiBidWZzaXopIHsKKwkJCQlzdGF0dXMgPSAtRU1TR1NJWkU7CisJCQkJZ290byBkb25lOworCQkJfQogCQkJa190bXAtPnR4X2J1ZiA9IHR4X2J1ZjsKIAkJCWlmIChjb3B5X2Zyb21fdXNlcih0eF9idWYsIChjb25zdCB1OCBfX3VzZXIgKikKIAkJCQkJCSh1aW50cHRyX3QpIHVfdG1wLT50eF9idWYsCiAJCQkJCXVfdG1wLT5sZW4pKQogCQkJCWdvdG8gZG9uZTsKKwkJCXR4X2J1ZiArPSBrX3RtcC0+bGVuOwogCQl9Ci0JCXR4X2J1ZiArPSBrX3RtcC0+bGVuOwotCQlyeF9idWYgKz0ga190bXAtPmxlbjsKIAogCQlrX3RtcC0+Y3NfY2hhbmdlID0gISF1X3RtcC0+Y3NfY2hhbmdlOwogCQlrX3RtcC0+dHhfbmJpdHMgPSB1X3RtcC0+dHhfbmJpdHM7CkBAIC0zMDMsOCArMzIyLDggQEAKIAkJCQlzdGF0dXMgPSAtRUZBVUxUOwogCQkJCWdvdG8gZG9uZTsKIAkJCX0KKwkJCXJ4X2J1ZiArPSB1X3RtcC0+bGVuOwogCQl9Ci0JCXJ4X2J1ZiArPSB1X3RtcC0+bGVuOwogCX0KIAlzdGF0dXMgPSB0b3RhbDsKIApAQCAtNjg0LDYgKzcwMywxNCBAQAogCiBzdGF0aWMgc3RydWN0IGNsYXNzICpzcGlkZXZfY2xhc3M7CiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNwaWRldl9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJvaG0sZGgyMjI4ZnYiIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3BpZGV2X2R0X2lkcyk7CisjZW5kaWYKKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogc3RhdGljIGludCBzcGlkZXZfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKQEAgLTY5Miw2ICs3MTksMTcgQEAKIAlpbnQJCQlzdGF0dXM7CiAJdW5zaWduZWQgbG9uZwkJbWlub3I7CiAKKwkvKgorCSAqIHNwaWRldiBzaG91bGQgbmV2ZXIgYmUgcmVmZXJlbmNlZCBpbiBEVCB3aXRob3V0IGEgc3BlY2lmaWMKKwkgKiBjb21wYXRiaWxlIHN0cmluZywgaXQgaXMgYSBMaW51eCBpbXBsZW1lbnRhdGlvbiB0aGluZworCSAqIHJhdGhlciB0aGFuIGEgZGVzY3JpcHRpb24gb2YgdGhlIGhhcmR3YXJlLgorCSAqLworCWlmIChzcGktPmRldi5vZl9ub2RlICYmICFvZl9tYXRjaF9kZXZpY2Uoc3BpZGV2X2R0X2lkcywgJnNwaS0+ZGV2KSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImJ1Z2d5IERUOiBzcGlkZXYgbGlzdGVkIGRpcmVjdGx5IGluIERUXG4iKTsKKwkJV0FSTl9PTihzcGktPmRldi5vZl9ub2RlICYmCisJCQkhb2ZfbWF0Y2hfZGV2aWNlKHNwaWRldl9kdF9pZHMsICZzcGktPmRldikpOworCX0KKwogCS8qIEFsbG9jYXRlIGRyaXZlciBkYXRhICovCiAJc3BpZGV2ID0ga3phbGxvYyhzaXplb2YoKnNwaWRldiksIEdGUF9LRVJORUwpOwogCWlmICghc3BpZGV2KQpAQCAtNzU4LDEzICs3OTYsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzcGlkZXZfZHRfaWRzW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJyb2htLGRoMjIyOGZ2IiB9LAotCXt9LAotfTsKLQotTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3BpZGV2X2R0X2lkcyk7Ci0KIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBzcGlkZXZfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZSA9CQkic3BpZGV2IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3NiL2RyaXZlcl9wY2ljb3JlLmMgYi9kcml2ZXJzL3NzYi9kcml2ZXJfcGNpY29yZS5jCmluZGV4IGQ3NWI3MmIuLjE1YTdlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL2RyaXZlcl9wY2ljb3JlLmMKKysrIGIvZHJpdmVycy9zc2IvZHJpdmVyX3BjaWNvcmUuYwpAQCAtMzU3LDYgKzM1NywxNSBAQAogCXBjaWNvcmVfd3JpdGUzMihwYywgU1NCX1BDSUNPUkVfU0JUT1BDSTIsCiAJCQlTU0JfUENJQ09SRV9TQlRPUENJX01FTSB8IFNTQl9QQ0lfRE1BKTsKIAorCS8qCisJICogQWNjZXNzaW5nIFBDSSBjb25maWcgd2l0aG91dCBhIHByb3BlciBkZWxheSBhZnRlciBkZXZpY2VzIHJlc2V0IChub3QKKwkgKiBHUElPIHJlc2V0KSB3YXMgY2F1c2luZyByZWJvb3RzIG9uIFdSVDMwME4gdjEuMC4KKwkgKiBUZXN0ZWQgZGVsYXkgODUwIHVzIGxvd2VyZWQgcmVib290IGNoYW5jZSB0byA1MC04MCUsIDEwMDAgdXMgZml4ZWQgaXQKKwkgKiBjb21wbGV0ZWx5LiBGbHVzaGluZyBhbGwgd3JpdGVzIHdhcyBhbHNvIHRlc3RlZCBidXQgd2l0aCBubyBsdWNrLgorCSAqLworCWlmIChwYy0+ZGV2LT5idXMtPmNoaXBfaWQgPT0gMHg0NzA0KQorCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisKIAkvKiBFbmFibGUgUENJIGJyaWRnZSBCQVIwIHByZWZldGNoIGFuZCBidXJzdCAqLwogCXZhbCA9IFBDSV9DT01NQU5EX01BU1RFUiB8IFBDSV9DT01NQU5EX01FTU9SWTsKIAlzc2JfZXh0cGNpX3dyaXRlX2NvbmZpZyhwYywgMCwgMCwgMCwgUENJX0NPTU1BTkQsICZ2YWwsIDIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zc2IvbWFpbi5jIGIvZHJpdmVycy9zc2IvbWFpbi5jCmluZGV4IDFlMTgwYzQuLmE0OGE3NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL21haW4uYworKysgYi9kcml2ZXJzL3NzYi9tYWluLmMKQEAgLTExMzUsNiArMTEzNSw4IEBACiAJY2FzZSBTU0JfSURMT1dfU1NCUkVWXzI1OiAgICAgLyogVE9ETyAtIGZpbmQgdGhlIHByb3BlciBSRUpFQ1QgYml0ICovCiAJY2FzZSBTU0JfSURMT1dfU1NCUkVWXzI3OiAgICAgLyogc2FtZSBoZXJlICovCiAJCXJldHVybiBTU0JfVE1TTE9XX1JFSkVDVDsJLyogdGhpcyBpcyBhIGd1ZXNzICovCisJY2FzZSBTU0JfSURMT1dfU1NCUkVWOgorCQlicmVhazsKIAlkZWZhdWx0OgogCQlXQVJOKDEsIEtFUk5fSU5GTyAic3NiOiBCYWNrcGxhbmUgUmV2aXNpb24gMHglLjhYXG4iLCByZXYpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKaW5kZXggNDViYWE4My4uYmZhY2Y2OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL0tjb25maWcKQEAgLTU4LDYgKzU4LDggQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvc203eHhmYi9LY29uZmlnIgogCitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL3hnaWZiL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2VteHhfdWRjL0tjb25maWciCkBAIC0xMDgsNCArMTEwLDYgQEAKIAogc291cmNlICJkcml2ZXJzL3N0YWdpbmcvaTJvL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9LY29uZmlnIgorCiBlbmRpZiAjIFNUQUdJTkcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9NYWtlZmlsZQppbmRleCAyOTE2MDc5Li4yYmJkMWJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL01ha2VmaWxlCkBAIC0yMyw2ICsyMyw3IEBACiBvYmotJChDT05GSUdfVk1FX0JVUykJCSs9IHZtZS8KIG9iai0kKENPTkZJR19JSU8pCQkrPSBpaW8vCiBvYmotJChDT05GSUdfRkJfU003WFgpCQkrPSBzbTd4eGZiLworb2JqLSQoQ09ORklHX0ZCX1NNN1hYKQkJKz0gc203NTBmYi8KIG9iai0kKENPTkZJR19GQl9YR0kpCQkrPSB4Z2lmYi8KIG9iai0kKENPTkZJR19VU0JfRU1YWCkJCSs9IGVteHhfdWRjLwogb2JqLSQoQ09ORklHX0ZUMTAwMCkJCSs9IGZ0MTAwMC8KQEAgLTQ2LDMgKzQ3LDQgQEAKIG9iai0kKENPTkZJR19DT01NT05fQ0xLX1hMTlhfQ0xLV1pSRCkJKz0gY2xvY2tpbmctd2l6YXJkLwogb2JqLSQoQ09ORklHX0ZCX1RGVCkJCSs9IGZidGZ0Lwogb2JqLSQoQ09ORklHX0kyTykJCSs9IGkyby8KK29iai0kKENPTkZJR19GU0xfTUNfQlVTKQkrPSBmc2wtbWMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9hc2htZW0uYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2FzaG1lbS5jCmluZGV4IGQxNDBiNzMzLi5jNWMwMzdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9hc2htZW0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9hc2htZW0uYwpAQCAtMzEwLDcgKzMxMCw3IEBACiAJICogYmUgZGVzdHJveWVkIHVudGlsIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBmaWxlIGFyZSBkcm9wcGVkIGFuZAogCSAqIGFzaG1lbV9yZWxlYXNlIGlzIGNhbGxlZC4KIAkgKi8KLQlyZXQgPSBhc21hLT5maWxlLT5mX29wLT5yZWFkKGFzbWEtPmZpbGUsIGJ1ZiwgbGVuLCBwb3MpOworCXJldCA9IF9fdmZzX3JlYWQoYXNtYS0+ZmlsZSwgYnVmLCBsZW4sIHBvcyk7CiAJaWYgKHJldCA+PSAwKSB7CiAJCS8qKiBVcGRhdGUgYmFja2luZyBmaWxlIHBvcywgc2luY2UgZl9vcHMtPnJlYWQoKSBkb2Vzbid0ICovCiAJCWFzbWEtPmZpbGUtPmZfcG9zID0gKnBvczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb24uYwppbmRleCBiOGYxYzQ5Li4wZTNkOGM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvaW9uL2lvbi5jCkBAIC01NjYsOCArNTY2LDggQEAKIAlidWZmZXIgPSBoYW5kbGUtPmJ1ZmZlcjsKIAogCWlmICghYnVmZmVyLT5oZWFwLT5vcHMtPnBoeXMpIHsKLQkJcHJfZXJyKCIlczogaW9uX3BoeXMgaXMgbm90IGltcGxlbWVudGVkIGJ5IHRoaXMgaGVhcC5cbiIsCi0JCSAgICAgICBfX2Z1bmNfXyk7CisJCXByX2VycigiJXM6IGlvbl9waHlzIGlzIG5vdCBpbXBsZW1lbnRlZCBieSB0aGlzIGhlYXAgKG5hbWU9JXMsIHR5cGU9JWQpLlxuIiwKKwkJCV9fZnVuY19fLCBidWZmZXItPmhlYXAtPm5hbWUsIGJ1ZmZlci0+aGVhcC0+dHlwZSk7CiAJCW11dGV4X3VubG9jaygmY2xpZW50LT5sb2NrKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTM5NSw3ICsxMzk1LDcgQEAKIAlzaXplX3QgdG90YWxfc2l6ZSA9IDA7CiAJc2l6ZV90IHRvdGFsX29ycGhhbmVkX3NpemUgPSAwOwogCi0Jc2VxX3ByaW50ZihzLCAiJTE2LnMgJTE2LnMgJTE2LnNcbiIsICJjbGllbnQiLCAicGlkIiwgInNpemUiKTsKKwlzZXFfcHJpbnRmKHMsICIlMTZzICUxNnMgJTE2c1xuIiwgImNsaWVudCIsICJwaWQiLCAic2l6ZSIpOwogCXNlcV9wdXRzKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAogCWZvciAobiA9IHJiX2ZpcnN0KCZkZXYtPmNsaWVudHMpOyBuOyBuID0gcmJfbmV4dChuKSkgewpAQCAtMTQwOSwxMCArMTQwOSwxMCBAQAogCQkJY2hhciB0YXNrX2NvbW1bVEFTS19DT01NX0xFTl07CiAKIAkJCWdldF90YXNrX2NvbW0odGFza19jb21tLCBjbGllbnQtPnRhc2spOwotCQkJc2VxX3ByaW50ZihzLCAiJTE2LnMgJTE2dSAlMTZ6dVxuIiwgdGFza19jb21tLAorCQkJc2VxX3ByaW50ZihzLCAiJTE2cyAlMTZ1ICUxNnp1XG4iLCB0YXNrX2NvbW0sCiAJCQkJICAgY2xpZW50LT5waWQsIHNpemUpOwogCQl9IGVsc2UgewotCQkJc2VxX3ByaW50ZihzLCAiJTE2LnMgJTE2dSAlMTZ6dVxuIiwgY2xpZW50LT5uYW1lLAorCQkJc2VxX3ByaW50ZihzLCAiJTE2cyAlMTZ1ICUxNnp1XG4iLCBjbGllbnQtPm5hbWUsCiAJCQkJICAgY2xpZW50LT5waWQsIHNpemUpOwogCQl9CiAJfQpAQCAtMTQyNiw3ICsxNDI2LDcgQEAKIAkJCWNvbnRpbnVlOwogCQl0b3RhbF9zaXplICs9IGJ1ZmZlci0+c2l6ZTsKIAkJaWYgKCFidWZmZXItPmhhbmRsZV9jb3VudCkgewotCQkJc2VxX3ByaW50ZihzLCAiJTE2LnMgJTE2dSAlMTZ6dSAlZCAlZFxuIiwKKwkJCXNlcV9wcmludGYocywgIiUxNnMgJTE2dSAlMTZ6dSAlZCAlZFxuIiwKIAkJCQkgICBidWZmZXItPnRhc2tfY29tbSwgYnVmZmVyLT5waWQsCiAJCQkJICAgYnVmZmVyLT5zaXplLCBidWZmZXItPmttYXBfY250LAogCQkJCSAgIGF0b21pY19yZWFkKCZidWZmZXItPnJlZi5yZWZjb3VudCkpOwpAQCAtMTQzNSwxMSArMTQzNSwxMSBAQAogCX0KIAltdXRleF91bmxvY2soJmRldi0+YnVmZmVyX2xvY2spOwogCXNlcV9wdXRzKHMsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQlzZXFfcHJpbnRmKHMsICIlMTYucyAlMTZ6dVxuIiwgInRvdGFsIG9ycGhhbmVkIiwKKwlzZXFfcHJpbnRmKHMsICIlMTZzICUxNnp1XG4iLCAidG90YWwgb3JwaGFuZWQiLAogCQkgICB0b3RhbF9vcnBoYW5lZF9zaXplKTsKLQlzZXFfcHJpbnRmKHMsICIlMTYucyAlMTZ6dVxuIiwgInRvdGFsICIsIHRvdGFsX3NpemUpOworCXNlcV9wcmludGYocywgIiUxNnMgJTE2enVcbiIsICJ0b3RhbCAiLCB0b3RhbF9zaXplKTsKIAlpZiAoaGVhcC0+ZmxhZ3MgJiBJT05fSEVBUF9GTEFHX0RFRkVSX0ZSRUUpCi0JCXNlcV9wcmludGYocywgIiUxNi5zICUxNnp1XG4iLCAiZGVmZXJyZWQgZnJlZSIsCisJCXNlcV9wcmludGYocywgIiUxNnMgJTE2enVcbiIsICJkZWZlcnJlZCBmcmVlIiwKIAkJCQloZWFwLT5mcmVlX2xpc3Rfc2l6ZSk7CiAJc2VxX3B1dHMocywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9pb24vaW9uX3Rlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fdGVzdC5jCmluZGV4IDY1NGFjYjUuLjNiYzQ2MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fdGVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL2lvbi9pb25fdGVzdC5jCkBAIC0yODAsMyArMjgwLDQgQEAKIAogbW9kdWxlX2luaXQoaW9uX3Rlc3RfaW5pdCk7CiBtb2R1bGVfZXhpdChpb25fdGVzdF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N5bmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9hbmRyb2lkL3N5bmMuYwppbmRleCA3YmRiNjJiLi5mODNlMDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvYW5kcm9pZC9zeW5jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2FuZHJvaWQvc3luYy5jCkBAIC0xMTQsNyArMTE0LDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocHQsIG5leHQsICZvYmotPmFjdGl2ZV9saXN0X2hlYWQsCiAJCQkJIGFjdGl2ZV9saXN0KSB7CiAJCWlmIChmZW5jZV9pc19zaWduYWxlZF9sb2NrZWQoJnB0LT5iYXNlKSkKLQkJCWxpc3RfZGVsKCZwdC0+YWN0aXZlX2xpc3QpOworCQkJbGlzdF9kZWxfaW5pdCgmcHQtPmFjdGl2ZV9saXN0KTsKIAl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvYmotPmNoaWxkX2xpc3RfbG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9LY29uZmlnCmluZGV4IDU5M2ZjYjEuLjYxYzYzNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL0tjb25maWcKQEAgLTEwOCw2ICsxMDgsNyBAQAogCiBjb25maWcgQ09NRURJX1BDTDcxMQogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENMLTcxMS83MTFiIGFuZCBBRGxpbmsgQUNMLTgxMTIgSVNBIGNhcmQgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJXzgyNTQKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQWR2YW50ZWNoIFBDTC03MTEgYW5kIDcxMWIsIEFEbGluayBBQ0wtODExMgogCkBAIC0xNjksNiArMTcwLDcgQEAKIGNvbmZpZyBDT01FRElfUENMODEyCiAJdHJpc3RhdGUgIkFkdmFudGVjaCBQQ0wtODEyLzgxMyBhbmQgQURsaW5rIEFDTC04MTEyLzgxMTMvODExMy84MjE2IgogCXNlbGVjdCBDT01FRElfSVNBRE1BIGlmIElTQV9ETUFfQVBJCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0wtODEyL1BHLCBQQ0wtODEzL0IsIEFETGluawogCSAgQUNMLTgxMTJERy9IRy9QRywgQUNMLTgxMTMsIEFDTC04MjE2LCBJQ1AgREFTIEEtODIxUEdIL1BHTC9QR0wtTkRBLApAQCAtMTgwLDYgKzE4Miw3IEBACiBjb25maWcgQ09NRURJX1BDTDgxNgogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENMLTgxNCBhbmQgUENMLTgxNiBJU0EgY2FyZCBzdXBwb3J0IgogCXNlbGVjdCBDT01FRElfSVNBRE1BIGlmIElTQV9ETUFfQVBJCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0wtODE0IGFuZCBQQ0wtODE2IElTQSBjYXJkcwogCkBAIC0xODksNiArMTkyLDcgQEAKIGNvbmZpZyBDT01FRElfUENMODE4CiAJdHJpc3RhdGUgIkFkdmFudGVjaCBQQ0wtNzE4IGFuZCBQQ0wtODE4IElTQSBjYXJkIHN1cHBvcnQiCiAJc2VsZWN0IENPTUVESV9JU0FETUEgaWYgSVNBX0RNQV9BUEkKKwlzZWxlY3QgQ09NRURJXzgyNTQKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQWR2YW50ZWNoIFBDTC04MTggSVNBIGNhcmRzCiAJICBQQ0wtODE4TCwgUENMLTgxOEgsIFBDTC04MThIRCwgUENMLTgxOEhHLCBQQ0wtODE4IGFuZCBQQ0wtNzE4CkBAIC0yNTksNiArMjYzLDcgQEAKIAogY29uZmlnIENPTUVESV9EQVMxNk0xCiAJdHJpc3RhdGUgIk1lYXN1cmVtZW50Q29tcHV0aW5nIENJTy1EQVMxNi9NMURBUy0xNiBJU0EgY2FyZCBzdXBwb3J0IgorCXNlbGVjdCBDT01FRElfODI1NAogCXNlbGVjdCBDT01FRElfODI1NQogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBNZWFzdXJlbWVudCBDb21wdXRpbmcgQ0lPLURBUzE2L00xIElTQSBjYXJkcy4KQEAgLTI4Miw2ICsyODcsNyBAQAogY29uZmlnIENPTUVESV9EQVMxNgogCXRyaXN0YXRlICJEQVMtMTYgY29tcGF0aWJsZSBJU0EgYW5kIFBDLzEwNCBjYXJkIHN1cHBvcnQiCiAJc2VsZWN0IENPTUVESV9JU0FETUEgaWYgSVNBX0RNQV9BUEkKKwlzZWxlY3QgQ09NRURJXzgyNTQKIAlzZWxlY3QgQ09NRURJXzgyNTUKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgS2VpdGhsZXkgTWV0cmFieXRlL0NvbXB1dGVyQm9hcmRzIERBUzE2CkBAIC0yOTgsNiArMzA0LDcgQEAKIAogY29uZmlnIENPTUVESV9EQVM4MDAKIAl0cmlzdGF0ZSAiREFTODAwIGFuZCBjb21wYXRpYmxlIElTQSBjYXJkIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEtlaXRobGV5IE1ldHJhYnl0ZSBEQVM4MDAgYW5kIGNvbXBhdGlibGUgSVNBIGNhcmRzCiAJICBLZWl0aGxleSBNZXRyYWJ5dGUgREFTLTgwMCwgREFTLTgwMSwgREFTLTgwMgpAQCAtMzEwLDYgKzMxNyw3IEBACiBjb25maWcgQ09NRURJX0RBUzE4MDAKIAl0cmlzdGF0ZSAiREFTMTgwMCBhbmQgY29tcGF0aWJsZSBJU0EgY2FyZCBzdXBwb3J0IgogCXNlbGVjdCBDT01FRElfSVNBRE1BIGlmIElTQV9ETUFfQVBJCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIERBUzE4MDAgYW5kIGNvbXBhdGlibGUgSVNBIGNhcmRzCiAJICBLZWl0aGxleSBNZXRyYWJ5dGUgREFTLTE3MDFTVCwgREFTLTE3MDFTVC1EQSwgREFTLTE3MDEvQU8sCkBAIC0zMjMsNiArMzMxLDcgQEAKIAogY29uZmlnIENPTUVESV9EQVM2NDAyCiAJdHJpc3RhdGUgIkRBUzY0MDIgYW5kIGNvbXBhdGlibGUgSVNBIGNhcmQgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJXzgyNTQKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgREFTNjQwMiBhbmQgY29tcGF0aWJsZSBJU0EgY2FyZHMKIAkgIENvbXB1dGVyYm9hcmRzLCBLZWl0aGxleSBNZXRyYWJ5dGUgREFTNjQwMiBhbmQgY29tcGF0aWJsZXMKQEAgLTQ2Myw2ICs0NzIsNyBAQAogY29uZmlnIENPTUVESV9OSV9BVF9BMjE1MAogCXRyaXN0YXRlICJOSSBBVC1BMjE1MCBJU0EgY2FyZCBzdXBwb3J0IgogCXNlbGVjdCBDT01FRElfSVNBRE1BIGlmIElTQV9ETUFfQVBJCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIE5hdGlvbmFsIEluc3RydW1lbnRzIEFULUEyMTUwIGNhcmRzCiAKQEAgLTQ3MSw2ICs0ODEsNyBAQAogCiBjb25maWcgQ09NRURJX05JX0FUX0FPCiAJdHJpc3RhdGUgIk5JIEFULUFPLTYvMTAgRUlTQSBjYXJkIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIE5hdGlvbmFsIEluc3RydW1lbnRzIEFULUFPLTYvMTAgY2FyZHMKIApAQCAtNzE1LDYgKzcyNiw3IEBACiAKIGNvbmZpZyBDT01FRElfQURMX1BDSTkxMTEKIAl0cmlzdGF0ZSAiQURMaW5rIFBDSS05MTExSFIgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJXzgyNTQKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQURsaW5rIFBDSTkxMTEgY2FyZHMKIApAQCAtNzI0LDYgKzczNiw3IEBACiBjb25maWcgQ09NRURJX0FETF9QQ0k5MTE4CiAJdHJpc3RhdGUgIkFETGluayBQQ0ktOTExOERHLCBQQ0ktOTExOEhHLCBQQ0ktOTExOEhSIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBIQVNfRE1BCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFEbGluayBQQ0ktOTExOERHLCBQQ0ktOTExOEhHLCBQQ0ktOTExOEhSIGNhcmRzCiAKQEAgLTczMiw2ICs3NDUsNyBAQAogCiBjb25maWcgQ09NRURJX0FEVl9QQ0kxNzEwCiAJdHJpc3RhdGUgIkFkdmFudGVjaCBQQ0ktMTcxeCwgUENJLTE3MjAgYW5kIFBDSS0xNzMxIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0ktMTcxMCwgUENJLTE3MTBIRywgUENJLTE3MTEsCiAJICBQQ0ktMTcxMywgUENJLTE3MjAgYW5kIFBDSS0xNzMxCkBAIC03NTksNiArNzczLDcgQEAKIAogY29uZmlnIENPTUVESV9BRFZfUENJX0RJTwogCXRyaXN0YXRlICJBZHZhbnRlY2ggUENJIERJTyBjYXJkIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJc2VsZWN0IENPTUVESV84MjU1CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIEFkdmFudGVjaCBQQ0kgRElPIGNhcmRzCkBAIC03OTksNiArODE0LDcgQEAKIAogY29uZmlnIENPTUVESV9BTVBMQ19QQ0kyMjQKIAl0cmlzdGF0ZSAiQW1wbGljb24gUENJMjI0IGFuZCBQQ0kyMzQgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJXzgyNTQKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQW1wbGljb24gUENJMjI0IGFuZCBQQ0kyMzQgQU8gYm9hcmRzCiAKQEAgLTgwNyw2ICs4MjMsNyBAQAogCiBjb25maWcgQ09NRURJX0FNUExDX1BDSTIzMAogCXRyaXN0YXRlICJBbXBsaWNvbiBQQ0kyMzAgYW5kIFBDSTI2MCBzdXBwb3J0IgorCXNlbGVjdCBDT01FRElfODI1NAogCXNlbGVjdCBDT01FRElfODI1NQogCS0tLWhlbHAtLS0KIAkgIEVuYWJsZSBzdXBwb3J0IGZvciBBbXBsaWNvbiBQQ0kyMzAgYW5kIFBDSTI2MCBNdWx0aWZ1bmN0aW9uIEkvTwpAQCAtOTEyLDYgKzkyOSw3IEBACiAKIGNvbmZpZyBDT01FRElfQ0JfUENJREFTCiAJdHJpc3RhdGUgIk1lYXN1cmVtZW50Q29tcHV0aW5nIFBDSS1EQVMgc3VwcG9ydCIKKwlzZWxlY3QgQ09NRURJXzgyNTQKIAlzZWxlY3QgQ09NRURJXzgyNTUKIAktLS1oZWxwLS0tCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgQ29tcHV0ZXJCb2FyZHMvTWVhc3VyZW1lbnRDb21wdXRpbmcgUENJLURBUyB3aXRoCkBAIC05MzUsNiArOTUzLDcgQEAKIAogY29uZmlnIENPTUVESV9DQl9QQ0lNREFTCiAJdHJpc3RhdGUgIk1lYXN1cmVtZW50Q29tcHV0aW5nIFBDSU0tREFTMTYwMi8xNiwgUENJZS1EQVMxNjAyLzE2IHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJc2VsZWN0IENPTUVESV84MjU1CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIENvbXB1dGVyQm9hcmRzL01lYXN1cmVtZW50Q29tcHV0aW5nIFBDSSBNaWdyYXRpb24KQEAgLTk1NCw2ICs5NzMsNyBAQAogCiBjb25maWcgQ09NRURJX01FNDAwMAogCXRyaXN0YXRlICJNZWlsaGF1cyBNRS00MDAwIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIE1laWxoYXVzIFBDSSBkYXRhIGFjcXVpc2l0aW9uIGNhcmRzCiAJICBNRS00NjUwLCBNRS00NjcwaSwgTUUtNDY4MCwgTUUtNDY4MGkgYW5kIE1FLTQ2ODBpcwpAQCAtMTA5MSw2ICsxMTExLDcgQEAKIAogY29uZmlnIENPTUVESV9DQl9EQVMxNl9DUwogCXRyaXN0YXRlICJDQiBEQVMxNiBzZXJpZXMgUENNQ0lBIHN1cHBvcnQiCisJc2VsZWN0IENPTUVESV84MjU0CiAJLS0taGVscC0tLQogCSAgRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBDb21wdXRlckJvYXJkcy9NZWFzdXJlbWVudENvbXB1dGluZyBQQ01DSUEKIAkgIGNhcmRzIERBUzE2LzE2LCBQQ00tREFTMTZELzEyIGFuZCBQQ00tREFTMTZzLzE2CkBAIC0xMjIyLDYgKzEyNDMsOSBAQAogCiBlbmRpZiAjIENPTUVESV9VU0JfRFJJVkVSUwogCitjb25maWcgQ09NRURJXzgyNTQKKwl0cmlzdGF0ZQorCiBjb25maWcgQ09NRURJXzgyNTUKIAl0cmlzdGF0ZSAiR2VuZXJpYyA4MjU1IHN1cHBvcnQiCiAJLS0taGVscC0tLQpAQCAtMTI1Miw2ICsxMjc2LDcgQEAKIAkgIGNhbGxlZCBrY29tZWRpbGliLgogCiBjb25maWcgQ09NRURJX0FNUExDX0RJTzIwMAorCXNlbGVjdCBDT01FRElfODI1NAogCXRyaXN0YXRlCiAKIGNvbmZpZyBDT01FRElfQU1QTENfUEMyMzYKQEAgLTEyNjAsNiArMTI4NSw3IEBACiAKIGNvbmZpZyBDT01FRElfREFTMDgKIAl0cmlzdGF0ZQorCXNlbGVjdCBDT01FRElfODI1NAogCXNlbGVjdCBDT01FRElfODI1NQogCiBjb25maWcgQ09NRURJX0lTQURNQQpAQCAtMTI2Nyw2ICsxMjkzLDcgQEAKIAogY29uZmlnIENPTUVESV9OSV9MQUJQQwogCXRyaXN0YXRlCisJc2VsZWN0IENPTUVESV84MjU0CiAJc2VsZWN0IENPTUVESV84MjU1CiAKIGNvbmZpZyBDT01FRElfTklfTEFCUENfSVNBRE1BCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKaW5kZXggNzI3NjQwZS4uZTc4ZGRiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiB7CiAJc3RydWN0IG1vZHVsZSAqZHJpdmVyX21vZHVsZSA9IE5VTEw7CiAKLQlpZiAoZGV2ID09IE5VTEwpCisJaWYgKCFkZXYpCiAJCXJldHVybjsKIAltdXRleF9sb2NrKCZkZXYtPm11dGV4KTsKIAlpZiAoZGV2LT5hdHRhY2hlZCkKQEAgLTI2MCw3ICsyNjAsNyBAQAogCiAJaWYgKG1pbm9yID49IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTKSB7CiAJCXMgPSBjb21lZGlfc3ViZGV2aWNlX2Zyb21fbWlub3IoZGV2LCBtaW5vcik7Ci0JCWlmIChzID09IE5VTEwgfHwgKHMtPnN1YmRldl9mbGFncyAmIFNERl9DTURfUkVBRCkpCisJCWlmICghcyB8fCAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NNRF9SRUFEKSkKIAkJCXJldHVybiBzOwogCX0KIAlyZXR1cm4gZGV2LT5yZWFkX3N1YmRldjsKQEAgLTI3Myw3ICsyNzMsNyBAQAogCiAJaWYgKG1pbm9yID49IENPTUVESV9OVU1fQk9BUkRfTUlOT1JTKSB7CiAJCXMgPSBjb21lZGlfc3ViZGV2aWNlX2Zyb21fbWlub3IoZGV2LCBtaW5vcik7Ci0JCWlmIChzID09IE5VTEwgfHwgKHMtPnN1YmRldl9mbGFncyAmIFNERl9DTURfV1JJVEUpKQorCQlpZiAoIXMgfHwgKHMtPnN1YmRldl9mbGFncyAmIFNERl9DTURfV1JJVEUpKQogCQkJcmV0dXJuIHM7CiAJfQogCXJldHVybiBkZXYtPndyaXRlX3N1YmRldjsKQEAgLTI5MCw5ICsyOTAsOSBAQAogCXdyaXRlX3MgPSBkZXYtPndyaXRlX3N1YmRldjsKIAlpZiAobWlub3IgPj0gQ09NRURJX05VTV9CT0FSRF9NSU5PUlMpIHsKIAkJcyA9IGNvbWVkaV9zdWJkZXZpY2VfZnJvbV9taW5vcihkZXYsIG1pbm9yKTsKLQkJaWYgKHMgPT0gTlVMTCB8fCBzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1JFQUQpCisJCWlmICghcyB8fCBzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1JFQUQpCiAJCQlyZWFkX3MgPSBzOwotCQlpZiAocyA9PSBOVUxMIHx8IHMtPnN1YmRldl9mbGFncyAmIFNERl9DTURfV1JJVEUpCisJCWlmICghcyB8fCBzLT5zdWJkZXZfZmxhZ3MgJiBTREZfQ01EX1dSSVRFKQogCQkJd3JpdGVfcyA9IHM7CiAJfQogCWNmcC0+bGFzdF9hdHRhY2hlZCA9IGRldi0+YXR0YWNoZWQ7CkBAIC02MDEsMjggKzYwMSw1NSBAQAogfTsKIEFUVFJJQlVURV9HUk9VUFMoY29tZWRpX2Rldik7CiAKLXN0YXRpYyB2b2lkIGNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgIHVuc2lnbmVkIG1hc2ssIHVuc2lnbmVkIGJpdHMpCitzdGF0aWMgdm9pZCBfX2NvbWVkaV9jbGVhcl9zdWJkZXZpY2VfcnVuZmxhZ3Moc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJCSAgICAgIHVuc2lnbmVkIGJpdHMpCit7CisJcy0+cnVuZmxhZ3MgJj0gfmJpdHM7Cit9CisKK3N0YXRpYyB2b2lkIF9fY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3Moc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJCSAgICB1bnNpZ25lZCBiaXRzKQoreworCXMtPnJ1bmZsYWdzIHw9IGJpdHM7Cit9CisKK3N0YXRpYyB2b2lkIGNvbWVkaV91cGRhdGVfc3ViZGV2aWNlX3J1bmZsYWdzKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkgICAgIHVuc2lnbmVkIG1hc2ssIHVuc2lnbmVkIGJpdHMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKLQlzLT5ydW5mbGFncyAmPSB+bWFzazsKLQlzLT5ydW5mbGFncyB8PSAoYml0cyAmIG1hc2spOworCV9fY29tZWRpX2NsZWFyX3N1YmRldmljZV9ydW5mbGFncyhzLCBtYXNrKTsKKwlfX2NvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIGJpdHMgJiBtYXNrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIF9fY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3Moc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCit7CisJcmV0dXJuIHMtPnJ1bmZsYWdzOworfQorCiBzdGF0aWMgdW5zaWduZWQgY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3Moc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBydW5mbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKLQlydW5mbGFncyA9IHMtPnJ1bmZsYWdzOworCXJ1bmZsYWdzID0gX19jb21lZGlfZ2V0X3N1YmRldmljZV9ydW5mbGFncyhzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKIAlyZXR1cm4gcnVuZmxhZ3M7CiB9CiAKK3N0YXRpYyBib29sIGNvbWVkaV9pc19ydW5mbGFnc19ydW5uaW5nKHVuc2lnbmVkIHJ1bmZsYWdzKQoreworCXJldHVybiBydW5mbGFncyAmIENPTUVESV9TUkZfUlVOTklORzsKK30KKworc3RhdGljIGJvb2wgY29tZWRpX2lzX3J1bmZsYWdzX2luX2Vycm9yKHVuc2lnbmVkIHJ1bmZsYWdzKQoreworCXJldHVybiBydW5mbGFncyAmIENPTUVESV9TUkZfRVJST1I7Cit9CisKIC8qKgogICogY29tZWRpX2lzX3N1YmRldmljZV9ydW5uaW5nIC0gY2hlY2sgaWYgYXN5bmMgY29tbWFuZCBydW5uaW5nIG9uIHN1YmRldmljZQogICogQHM6IGNvbWVkaV9zdWJkZXZpY2Ugc3RydWN0CkBAIC02MzQsMjIgKzY2MSwyMiBAQAogewogCXVuc2lnbmVkIHJ1bmZsYWdzID0gY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3Mocyk7CiAKLQlyZXR1cm4gKHJ1bmZsYWdzICYgQ09NRURJX1NSRl9SVU5OSU5HKSA/IHRydWUgOiBmYWxzZTsKKwlyZXR1cm4gY29tZWRpX2lzX3J1bmZsYWdzX3J1bm5pbmcocnVuZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpX2lzX3N1YmRldmljZV9ydW5uaW5nKTsKIAotc3RhdGljIGJvb2wgY29tZWRpX2lzX3N1YmRldmljZV9pbl9lcnJvcihzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3N0YXRpYyBib29sIF9fY29tZWRpX2lzX3N1YmRldmljZV9ydW5uaW5nKHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewotCXVuc2lnbmVkIHJ1bmZsYWdzID0gY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3Mocyk7CisJdW5zaWduZWQgcnVuZmxhZ3MgPSBfX2NvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpOwogCi0JcmV0dXJuIChydW5mbGFncyAmIENPTUVESV9TUkZfRVJST1IpID8gdHJ1ZSA6IGZhbHNlOworCXJldHVybiBjb21lZGlfaXNfcnVuZmxhZ3NfcnVubmluZyhydW5mbGFncyk7CiB9CiAKIHN0YXRpYyBib29sIGNvbWVkaV9pc19zdWJkZXZpY2VfaWRsZShzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAl1bnNpZ25lZCBydW5mbGFncyA9IGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpOwogCi0JcmV0dXJuIChydW5mbGFncyAmIENPTUVESV9TUkZfQlVTWV9NQVNLKSA/IGZhbHNlIDogdHJ1ZTsKKwlyZXR1cm4gIShydW5mbGFncyAmIENPTUVESV9TUkZfQlVTWV9NQVNLKTsKIH0KIAogLyoqCkBAIC02NzcsMTQgKzcwNCwxNCBAQAogewogCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gcy0+YXN5bmM7CiAKLQljb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhzLCBDT01FRElfU1JGX1JVTk5JTkcsIDApOworCWNvbWVkaV91cGRhdGVfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIENPTUVESV9TUkZfUlVOTklORywgMCk7CiAJaWYgKGFzeW5jKSB7CiAJCWNvbWVkaV9idWZfcmVzZXQocyk7CiAJCWFzeW5jLT5pbnR0cmlnID0gTlVMTDsKIAkJa2ZyZWUoYXN5bmMtPmNtZC5jaGFubGlzdCk7CiAJCWFzeW5jLT5jbWQuY2hhbmxpc3QgPSBOVUxMOwogCQlzLT5idXN5ID0gTlVMTDsKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX2FsbCgmcy0+YXN5bmMtPndhaXRfaGVhZCk7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZV9hbGwoJmFzeW5jLT53YWl0X2hlYWQpOwogCX0gZWxzZSB7CiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCiAJCQkiQlVHOiAoPykgZG9fYmVjb21lX25vbmJ1c3kgY2FsbGVkIHdpdGggYXN5bmM9TlVMTFxuIik7CkBAIC03NTksNyArNzg2LDcgQEAKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlpZiAoYXJnID09IE5VTEwpIHsKKwlpZiAoIWFyZykgewogCQlpZiAoaXNfZGV2aWNlX2J1c3koZGV2KSkKIAkJCXJldHVybiAtRUJVU1k7CiAJCWlmIChkZXYtPmF0dGFjaGVkKSB7CkBAIC0xNjc4LDggKzE3MDUsOCBAQAogCWlmIChhc3luYy0+Y21kLmZsYWdzICYgQ01ERl9XQUtFX0VPUykKIAkJYXN5bmMtPmNiX21hc2sgfD0gQ09NRURJX0NCX0VPUzsKIAotCWNvbWVkaV9zZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMsIENPTUVESV9TUkZfQlVTWV9NQVNLLAotCQkJCSAgICAgIENPTUVESV9TUkZfUlVOTklORyk7CisJY29tZWRpX3VwZGF0ZV9zdWJkZXZpY2VfcnVuZmxhZ3MocywgQ09NRURJX1NSRl9CVVNZX01BU0ssCisJCQkJCSBDT01FRElfU1JGX1JVTk5JTkcpOwogCiAJLyoKIAkgKiBTZXQgcy0+YnVzeSBfYWZ0ZXJfIHNldHRpbmcgQ09NRURJX1NSRl9SVU5OSU5HIGZsYWcgdG8gYXZvaWQKQEAgLTE4NDAsNyArMTg2Nyw3IEBACiAJaWYgKGFyZyA+PSBkZXYtPm5fc3ViZGV2aWNlcykKIAkJcmV0dXJuIC1FSU5WQUw7CiAJcyA9ICZkZXYtPnN1YmRldmljZXNbYXJnXTsKLQlpZiAocy0+YXN5bmMgPT0gTlVMTCkKKwlpZiAoIXMtPmFzeW5jKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICghcy0+YnVzeSkKQEAgLTIyODIsMTMgKzIzMDksMTYgQEAKIAlhZGRfd2FpdF9xdWV1ZSgmYXN5bmMtPndhaXRfaGVhZCwgJndhaXQpOwogCW9uX3dhaXRfcXVldWUgPSB0cnVlOwogCXdoaWxlIChuYnl0ZXMgPiAwICYmICFyZXR2YWwpIHsKKwkJdW5zaWduZWQgcnVuZmxhZ3M7CisKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAotCQlpZiAoIWNvbWVkaV9pc19zdWJkZXZpY2VfcnVubmluZyhzKSkgeworCQlydW5mbGFncyA9IGNvbWVkaV9nZXRfc3ViZGV2aWNlX3J1bmZsYWdzKHMpOworCQlpZiAoIWNvbWVkaV9pc19ydW5mbGFnc19ydW5uaW5nKHJ1bmZsYWdzKSkgewogCQkJaWYgKGNvdW50ID09IDApIHsKIAkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqbmV3X3M7CiAKLQkJCQlpZiAoY29tZWRpX2lzX3N1YmRldmljZV9pbl9lcnJvcihzKSkKKwkJCQlpZiAoY29tZWRpX2lzX3J1bmZsYWdzX2luX2Vycm9yKHJ1bmZsYWdzKSkKIAkJCQkJcmV0dmFsID0gLUVQSVBFOwogCQkJCWVsc2UKIAkJCQkJcmV0dmFsID0gMDsKQEAgLTI0MzUsOCArMjQ2NSwxMCBAQAogCQkJbiA9IG07CiAKIAkJaWYgKG4gPT0gMCkgewotCQkJaWYgKCFjb21lZGlfaXNfc3ViZGV2aWNlX3J1bm5pbmcocykpIHsKLQkJCQlpZiAoY29tZWRpX2lzX3N1YmRldmljZV9pbl9lcnJvcihzKSkKKwkJCXVuc2lnbmVkIHJ1bmZsYWdzID0gY29tZWRpX2dldF9zdWJkZXZpY2VfcnVuZmxhZ3Mocyk7CisKKwkJCWlmICghY29tZWRpX2lzX3J1bmZsYWdzX3J1bm5pbmcocnVuZmxhZ3MpKSB7CisJCQkJaWYgKGNvbWVkaV9pc19ydW5mbGFnc19pbl9lcnJvcihydW5mbGFncykpCiAJCQkJCXJldHZhbCA9IC1FUElQRTsKIAkJCQllbHNlCiAJCQkJCXJldHZhbCA9IDA7CkBAIC0yNjM4LDM5ICsyNjcwLDM4IEBACiB2b2lkIGNvbWVkaV9ldmVudChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOwotCXVuc2lnbmVkIHJ1bmZsYWdzID0gMDsKLQl1bnNpZ25lZCBydW5mbGFnc19tYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgZXZlbnRzOworCWludCBzaV9jb2RlID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKCFjb21lZGlfaXNfc3ViZGV2aWNlX3J1bm5pbmcocykpCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOworCisJZXZlbnRzID0gYXN5bmMtPmV2ZW50czsKKwlhc3luYy0+ZXZlbnRzID0gMDsKKwlpZiAoIV9fY29tZWRpX2lzX3N1YmRldmljZV9ydW5uaW5nKHMpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CisJfQogCi0JaWYgKHMtPmFzeW5jLT5ldmVudHMgJiBDT01FRElfQ0JfQ0FOQ0VMX01BU0spCi0JCXJ1bmZsYWdzX21hc2sgfD0gQ09NRURJX1NSRl9SVU5OSU5HOworCWlmIChldmVudHMgJiBDT01FRElfQ0JfQ0FOQ0VMX01BU0spCisJCV9fY29tZWRpX2NsZWFyX3N1YmRldmljZV9ydW5mbGFncyhzLCBDT01FRElfU1JGX1JVTk5JTkcpOwogCiAJLyoKLQkgKiBSZW1lbWJlciBpZiBhbiBlcnJvciBldmVudCBoYXMgb2NjdXJyZWQsIHNvIGFuIGVycm9yCi0JICogY2FuIGJlIHJldHVybmVkIHRoZSBuZXh0IHRpbWUgdGhlIHVzZXIgZG9lcyBhIHJlYWQoKS4KKwkgKiBSZW1lbWJlciBpZiBhbiBlcnJvciBldmVudCBoYXMgb2NjdXJyZWQsIHNvIGFuIGVycm9yIGNhbiBiZQorCSAqIHJldHVybmVkIHRoZSBuZXh0IHRpbWUgdGhlIHVzZXIgZG9lcyBhIHJlYWQoKSBvciB3cml0ZSgpLgogCSAqLwotCWlmIChzLT5hc3luYy0+ZXZlbnRzICYgQ09NRURJX0NCX0VSUk9SX01BU0spIHsKLQkJcnVuZmxhZ3NfbWFzayB8PSBDT01FRElfU1JGX0VSUk9SOwotCQlydW5mbGFncyB8PSBDT01FRElfU1JGX0VSUk9SOwotCX0KLQlpZiAocnVuZmxhZ3NfbWFzaykgewotCQkvKgotCQkgKiBTZXRzIENPTUVESV9TUkZfRVJST1IgYW5kIENPTUVESV9TUkZfUlVOTklORyB0b2dldGhlcgotCQkgKiBhdG9taWNhbGx5LgotCQkgKi8KLQkJY29tZWRpX3NldF9zdWJkZXZpY2VfcnVuZmxhZ3MocywgcnVuZmxhZ3NfbWFzaywgcnVuZmxhZ3MpOworCWlmIChldmVudHMgJiBDT01FRElfQ0JfRVJST1JfTUFTSykKKwkJX19jb21lZGlfc2V0X3N1YmRldmljZV9ydW5mbGFncyhzLCBDT01FRElfU1JGX0VSUk9SKTsKKworCWlmIChhc3luYy0+Y2JfbWFzayAmIGV2ZW50cykgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFzeW5jLT53YWl0X2hlYWQpOworCQlzaV9jb2RlID0gYXN5bmMtPmNtZC5mbGFncyAmIENNREZfV1JJVEUgPyBQT0xMX09VVCA6IFBPTExfSU47CiAJfQogCi0JaWYgKGFzeW5jLT5jYl9tYXNrICYgcy0+YXN5bmMtPmV2ZW50cykgewotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFzeW5jLT53YWl0X2hlYWQpOwotCQlpZiAocy0+c3ViZGV2X2ZsYWdzICYgU0RGX0NNRF9SRUFEKQotCQkJa2lsbF9mYXN5bmMoJmRldi0+YXN5bmNfcXVldWUsIFNJR0lPLCBQT0xMX0lOKTsKLQkJaWYgKHMtPnN1YmRldl9mbGFncyAmIFNERl9DTURfV1JJVEUpCi0JCQlraWxsX2Zhc3luYygmZGV2LT5hc3luY19xdWV1ZSwgU0lHSU8sIFBPTExfT1VUKTsKLQl9Ci0Jcy0+YXN5bmMtPmV2ZW50cyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7CisKKwlpZiAoc2lfY29kZSkKKwkJa2lsbF9mYXN5bmMoJmRldi0+YXN5bmNfcXVldWUsIFNJR0lPLCBzaV9jb2RlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV9ldmVudCk7CiAKQEAgLTI2ODIsNyArMjcxMyw3IEBACiAJdW5zaWduZWQgaTsKIAogCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGV2ID09IE5VTEwpCisJaWYgKCFkZXYpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCWNvbWVkaV9kZXZpY2VfaW5pdChkZXYpOwogCWNvbWVkaV9zZXRfaHdfZGV2KGRldiwgaGFyZHdhcmVfZGV2aWNlKTsKQEAgLTI2OTAsNyArMjcyMSw3IEBACiAJbXV0ZXhfbG9jaygmY29tZWRpX2JvYXJkX21pbm9yX3RhYmxlX2xvY2spOwogCWZvciAoaSA9IGhhcmR3YXJlX2RldmljZSA/IGNvbWVkaV9udW1fbGVnYWN5X21pbm9ycyA6IDA7CiAJICAgICBpIDwgQ09NRURJX05VTV9CT0FSRF9NSU5PUlM7ICsraSkgewotCQlpZiAoY29tZWRpX2JvYXJkX21pbm9yX3RhYmxlW2ldID09IE5VTEwpIHsKKwkJaWYgKCFjb21lZGlfYm9hcmRfbWlub3JfdGFibGVbaV0pIHsKIAkJCWNvbWVkaV9ib2FyZF9taW5vcl90YWJsZVtpXSA9IGRldjsKIAkJCWJyZWFrOwogCQl9CkBAIC0yNzAwLDcgKzI3MzEsOCBAQAogCQltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOwogCQljb21lZGlfZGV2aWNlX2NsZWFudXAoZGV2KTsKIAkJY29tZWRpX2Rldl9wdXQoZGV2KTsKLQkJcHJfZXJyKCJyYW4gb3V0IG9mIG1pbm9yIG51bWJlcnMgZm9yIGJvYXJkIGRldmljZSBmaWxlc1xuIik7CisJCWRldl9lcnIoaGFyZHdhcmVfZGV2aWNlLAorCQkJInJhbiBvdXQgb2YgbWlub3IgbnVtYmVycyBmb3IgYm9hcmQgZGV2aWNlIGZpbGVzXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVCVVNZKTsKIAl9CiAJZGV2LT5taW5vciA9IGk7CkBAIC0yNzQ2LDE0ICsyNzc4LDE1IEBACiAKIAltdXRleF9sb2NrKCZjb21lZGlfc3ViZGV2aWNlX21pbm9yX3RhYmxlX2xvY2spOwogCWZvciAoaSA9IDA7IGkgPCBDT01FRElfTlVNX1NVQkRFVklDRV9NSU5PUlM7ICsraSkgewotCQlpZiAoY29tZWRpX3N1YmRldmljZV9taW5vcl90YWJsZVtpXSA9PSBOVUxMKSB7CisJCWlmICghY29tZWRpX3N1YmRldmljZV9taW5vcl90YWJsZVtpXSkgewogCQkJY29tZWRpX3N1YmRldmljZV9taW5vcl90YWJsZVtpXSA9IHM7CiAJCQlicmVhazsKIAkJfQogCX0KIAltdXRleF91bmxvY2soJmNvbWVkaV9zdWJkZXZpY2VfbWlub3JfdGFibGVfbG9jayk7CiAJaWYgKGkgPT0gQ09NRURJX05VTV9TVUJERVZJQ0VfTUlOT1JTKSB7Ci0JCXByX2VycigicmFuIG91dCBvZiBtaW5vciBudW1iZXJzIGZvciBzdWJkZXZpY2UgZmlsZXNcbiIpOworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAorCQkJInJhbiBvdXQgb2YgbWlub3IgbnVtYmVycyBmb3Igc3ViZGV2aWNlIGZpbGVzXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJaSArPSBDT01FRElfTlVNX0JPQVJEX01JTk9SUzsKQEAgLTI3NzEsNyArMjgwNCw3IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlpZiAocyA9PSBOVUxMKQorCWlmICghcykKIAkJcmV0dXJuOwogCWlmIChzLT5taW5vciA8IDApCiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9pbnRlcm5hbC5oCmluZGV4IGQ1NzgxN2MuLjNiOTE4NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfaW50ZXJuYWwuaApAQCAtMSwxMSArMSwyMSBAQAogI2lmbmRlZiBfQ09NRURJX0lOVEVSTkFMX0gKICNkZWZpbmUgX0NPTUVESV9JTlRFUk5BTF9ICiAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qCiAgKiB2YXJpb3VzIGludGVybmFsIGNvbWVkaSBzdHVmZgogICovCisKK3N0cnVjdCBjb21lZGlfYnVmX21hcDsKK3N0cnVjdCBjb21lZGlfZGV2Y29uZmlnOworc3RydWN0IGNvbWVkaV9kZXZpY2U7CitzdHJ1Y3QgY29tZWRpX2luc247CitzdHJ1Y3QgY29tZWRpX3JhbmdlaW5mbzsKK3N0cnVjdCBjb21lZGlfc3ViZGV2aWNlOworc3RydWN0IGRldmljZTsKKwogaW50IGRvX3JhbmdlaW5mb19pb2N0bChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkgICAgICAgc3RydWN0IGNvbWVkaV9yYW5nZWluZm8gX191c2VyICphcmcpOwogc3RydWN0IGNvbWVkaV9kZXZpY2UgKmNvbWVkaV9hbGxvY19ib2FyZF9taW5vcihzdHJ1Y3QgZGV2aWNlICpoYXJkd2FyZV9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9wY2kuYwppbmRleCA2YmE1OWM5Li4wMjdmMGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9wY2kuYwpAQCAtMTcsMTAgKzE3LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICJjb21lZGlkZXYuaCIKKyNpbmNsdWRlICJjb21lZGlfcGNpLmgiCiAKIC8qKgogICogY29tZWRpX3RvX3BjaV9kZXYoKSAtIGNvbWVkaV9kZXZpY2UgcG9pbnRlciB0byBwY2lfZGV2IHBvaW50ZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9wY2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX3BjaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMDVjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9wY2kuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogY29tZWRpX3BjaS5oCisgKiBoZWFkZXIgZmlsZSBmb3IgQ29tZWRpIFBDSSBkcml2ZXJzCisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAxOTk3LTIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0NPTUVESV9QQ0lfSAorI2RlZmluZSBfQ09NRURJX1BDSV9ICisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgImNvbWVkaWRldi5oIgorCisvKgorICogUENJIFZlbmRvciBJRHMgbm90IGluIDxsaW51eC9wY2lfaWRzLmg+CisgKi8KKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9LT0xURVIJCTB4MTAwMQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lDUAkJMHgxMDRjCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRFQJCTB4MTExNgorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0lPVEVDSAkJMHgxNjE2CisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ09OVEVDCQkweDEyMjEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9SVEQJCTB4MTQzNQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0hVTVVTT0ZUCQkweDE4NmMKKworc3RydWN0IHBjaV9kZXYgKmNvbWVkaV90b19wY2lfZGV2KHN0cnVjdCBjb21lZGlfZGV2aWNlICopOworCitpbnQgY29tZWRpX3BjaV9lbmFibGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKik7Cit2b2lkIGNvbWVkaV9wY2lfZGlzYWJsZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqKTsKK3ZvaWQgY29tZWRpX3BjaV9kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKik7CisKK2ludCBjb21lZGlfcGNpX2F1dG9fY29uZmlnKHN0cnVjdCBwY2lfZGV2ICosIHN0cnVjdCBjb21lZGlfZHJpdmVyICosCisJCQkgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpOwordm9pZCBjb21lZGlfcGNpX2F1dG9fdW5jb25maWcoc3RydWN0IHBjaV9kZXYgKik7CisKK2ludCBjb21lZGlfcGNpX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgY29tZWRpX2RyaXZlciAqLCBzdHJ1Y3QgcGNpX2RyaXZlciAqKTsKK3ZvaWQgY29tZWRpX3BjaV9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgY29tZWRpX2RyaXZlciAqLCBzdHJ1Y3QgcGNpX2RyaXZlciAqKTsKKworLyoqCisgKiBtb2R1bGVfY29tZWRpX3BjaV9kcml2ZXIoKSAtIEhlbHBlciBtYWNybyBmb3IgcmVnaXN0ZXJpbmcgYSBjb21lZGkgUENJIGRyaXZlcgorICogQF9fY29tZWRpX2RyaXZlcjogY29tZWRpX2RyaXZlciBzdHJ1Y3QKKyAqIEBfX3BjaV9kcml2ZXI6IHBjaV9kcml2ZXIgc3RydWN0CisgKgorICogSGVscGVyIG1hY3JvIGZvciBjb21lZGkgUENJIGRyaXZlcnMgd2hpY2ggZG8gbm90IGRvIGFueXRoaW5nIHNwZWNpYWwKKyAqIGluIG1vZHVsZSBpbml0L2V4aXQuIFRoaXMgZWxpbWluYXRlcyBhIGxvdCBvZiBib2lsZXJwbGF0ZS4gRWFjaAorICogbW9kdWxlIG1heSBvbmx5IHVzZSB0aGlzIG1hY3JvIG9uY2UsIGFuZCBjYWxsaW5nIGl0IHJlcGxhY2VzCisgKiBtb2R1bGVfaW5pdCgpIGFuZCBtb2R1bGVfZXhpdCgpCisgKi8KKyNkZWZpbmUgbW9kdWxlX2NvbWVkaV9wY2lfZHJpdmVyKF9fY29tZWRpX2RyaXZlciwgX19wY2lfZHJpdmVyKSBcCisJbW9kdWxlX2RyaXZlcihfX2NvbWVkaV9kcml2ZXIsIGNvbWVkaV9wY2lfZHJpdmVyX3JlZ2lzdGVyLCBcCisJCQljb21lZGlfcGNpX2RyaXZlcl91bnJlZ2lzdGVyLCAmKF9fcGNpX2RyaXZlcikpCisKKyNlbmRpZiAvKiBfQ09NRURJX1BDSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlkZXYuaAppbmRleCBlMTM4ZWIwLi5kZmFiNWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaWRldi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpZGV2LmgKQEAgLTI1Niw2ICsyNTYsNyBAQAogc3RydWN0IGNvbWVkaV9kZXZpY2UgewogCWludCB1c2VfY291bnQ7CiAJc3RydWN0IGNvbWVkaV9kcml2ZXIgKmRyaXZlcjsKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKnBhY2VyOwogCXZvaWQgKnByaXZhdGU7CiAKIAlzdHJ1Y3QgZGV2aWNlICpjbGFzc19kZXY7CkBAIC00NjMsNiArNDY0LDg0IEBACiAJcmV0dXJuIG5zYW1wbGVzIDw8IGNvbWVkaV9zYW1wbGVfc2hpZnQocyk7CiB9CiAKKy8qKgorICogY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCkgLSB0cml2aWFsbHkgdmFsaWRhdGUgYSBjb21lZGlfY21kIHRyaWdnZXIgc291cmNlCisgKiBAc3JjOiBwb2ludGVyIHRvIHRoZSB0cmlnZ2VyIHNvdXJjZSB0byB2YWxpZGF0ZQorICogQGZsYWdzOiBiaXRtYXNrIG9mIHZhbGlkIFRSSUdfKiBmb3IgdGhlIHRyaWdnZXIKKyAqCisgKiBUaGlzIGlzIHVzZWQgaW4gInN0ZXAgMSIgb2YgdGhlIGRvX2NtZHRlc3QgZnVuY3Rpb25zIG9mIGNvbWVkaSBkcml2ZXJzCisgKiB0byB2YWlsZGF0ZSB0aGUgY29tZWRpX2NtZCB0cmlnZ2Vycy4gVGhlIG1hc2sgb2YgdGhlIEBzcmMgYWdhaW5zdCB0aGUKKyAqIEBmbGFncyBhbGxvd3MgdGhlIHVzZXJzcGFjZSBjb21lZGlsaWIgdG8gcGFzcyBhbGwgdGhlIGNvbWVkaV9jbWQKKyAqIHRyaWdnZXJzIGFzIFRSSUdfQU5ZIGFuZCBnZXQgYmFjayBhIGJpdG1hc2sgb2YgdGhlIHZhbGlkIHRyaWdnZXIgc291cmNlcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKHVuc2lnbmVkIGludCAqc3JjLAorCQkJCQkgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgaW50IG9yaWdfc3JjID0gKnNyYzsKKworCSpzcmMgPSBvcmlnX3NyYyAmIGZsYWdzOworCWlmICgqc3JjID09IFRSSUdfSU5WQUxJRCB8fCAqc3JjICE9IG9yaWdfc3JjKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoKSAtIG1ha2Ugc3VyZSBhIHRyaWdnZXIgc291cmNlIGlzIHVuaXF1ZQorICogQHNyYzogdGhlIHRyaWdnZXIgc291cmNlIHRvIGNoZWNrCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZSh1bnNpZ25lZCBpbnQgc3JjKQoreworCS8qIHRoaXMgdGVzdCBpcyB0cnVlIGlmIG1vcmUgdGhhbiBvbmUgX3NyYyBiaXQgaXMgc2V0ICovCisJaWYgKChzcmMgJiAoc3JjIC0gMSkpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisvKioKKyAqIGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygpIC0gdHJpdmlhbGx5IHZhbGlkYXRlIGEgdHJpZ2dlciBhcmd1bWVudAorICogQGFyZzogcG9pbnRlciB0byB0aGUgdHJpZ2dlciBhcmcgdG8gdmFsaWRhdGUKKyAqIEB2YWw6IHRoZSB2YWx1ZSB0aGUgYXJndW1lbnQgc2hvdWxkIGJlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcyh1bnNpZ25lZCBpbnQgKmFyZywKKwkJCQkJICAgICAgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpZiAoKmFyZyAhPSB2YWwpIHsKKwkJKmFyZyA9IHZhbDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCisvKioKKyAqIGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oKSAtIHRyaXZpYWxseSB2YWxpZGF0ZSBhIHRyaWdnZXIgYXJndW1lbnQKKyAqIEBhcmc6IHBvaW50ZXIgdG8gdGhlIHRyaWdnZXIgYXJnIHRvIHZhbGlkYXRlCisgKiBAdmFsOiB0aGUgbWluaW11bSB2YWx1ZSB0aGUgYXJndW1lbnQgc2hvdWxkIGJlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4odW5zaWduZWQgaW50ICphcmcsCisJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmFsKQoreworCWlmICgqYXJnIDwgdmFsKSB7CisJCSphcmcgPSB2YWw7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCkgLSB0cml2aWFsbHkgdmFsaWRhdGUgYSB0cmlnZ2VyIGFyZ3VtZW50CisgKiBAYXJnOiBwb2ludGVyIHRvIHRoZSB0cmlnZ2VyIGFyZyB0byB2YWxpZGF0ZQorICogQHZhbDogdGhlIG1heGltdW0gdmFsdWUgdGhlIGFyZ3VtZW50IHNob3VsZCBiZQorICovCitzdGF0aWMgaW5saW5lIGludCBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KHVuc2lnbmVkIGludCAqYXJnLAorCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpZiAoKmFyZyA+IHZhbCkgeworCQkqYXJnID0gdmFsOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKIC8qCiAgKiBNdXN0IHNldCBkZXYtPmh3X2RldiBpZiB5b3Ugd2lzaCB0byBkbWEgZGlyZWN0bHkgaW50byBjb21lZGkncyBidWZmZXIuCiAgKiBBbHNvIHVzZWZ1bCBmb3IgcmV0cmlldmluZyBhIHByZXZpb3VzbHkgY29uZmlndXJlZCBoYXJkd2FyZSBkZXZpY2Ugb2YKQEAgLTU1Myw0NyArNjMyLDQgQEAKIAltb2R1bGVfZHJpdmVyKF9fY29tZWRpX2RyaXZlciwgY29tZWRpX2RyaXZlcl9yZWdpc3RlciwgXAogCQkJY29tZWRpX2RyaXZlcl91bnJlZ2lzdGVyKQogCi0vKiBjb21lZGlfcGNpLmMgLSBjb21lZGkgUENJIGRyaXZlciBzcGVjaWZpYyBmdW5jdGlvbnMgKi8KLQotLyoKLSAqIFBDSSBWZW5kb3IgSURzIG5vdCBpbiA8bGludXgvcGNpX2lkcy5oPgotICovCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfS09MVEVSCQkweDEwMDEKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JQ1AJCTB4MTA0YwotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0RUCQkweDExMTYKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9JT1RFQ0gJCTB4MTYxNgotI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NPTlRFQwkJMHgxMjIxCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfUlRECQkweDE0MzUKLSNkZWZpbmUgUENJX1ZFTkRPUl9JRF9IVU1VU09GVAkJMHgxODZjCi0KLXN0cnVjdCBwY2lfZGV2Owotc3RydWN0IHBjaV9kcml2ZXI7Ci0KLXN0cnVjdCBwY2lfZGV2ICpjb21lZGlfdG9fcGNpX2RldihzdHJ1Y3QgY29tZWRpX2RldmljZSAqKTsKLQotaW50IGNvbWVkaV9wY2lfZW5hYmxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICopOwotdm9pZCBjb21lZGlfcGNpX2Rpc2FibGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKik7Ci12b2lkIGNvbWVkaV9wY2lfZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICopOwotCi1pbnQgY29tZWRpX3BjaV9hdXRvX2NvbmZpZyhzdHJ1Y3QgcGNpX2RldiAqLCBzdHJ1Y3QgY29tZWRpX2RyaXZlciAqLAotCQkJICAgdW5zaWduZWQgbG9uZyBjb250ZXh0KTsKLXZvaWQgY29tZWRpX3BjaV9hdXRvX3VuY29uZmlnKHN0cnVjdCBwY2lfZGV2ICopOwotCi1pbnQgY29tZWRpX3BjaV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGNvbWVkaV9kcml2ZXIgKiwgc3RydWN0IHBjaV9kcml2ZXIgKik7Ci12b2lkIGNvbWVkaV9wY2lfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGNvbWVkaV9kcml2ZXIgKiwgc3RydWN0IHBjaV9kcml2ZXIgKik7Ci0KLS8qKgotICogbW9kdWxlX2NvbWVkaV9wY2lfZHJpdmVyKCkgLSBIZWxwZXIgbWFjcm8gZm9yIHJlZ2lzdGVyaW5nIGEgY29tZWRpIFBDSSBkcml2ZXIKLSAqIEBfX2NvbWVkaV9kcml2ZXI6IGNvbWVkaV9kcml2ZXIgc3RydWN0Ci0gKiBAX19wY2lfZHJpdmVyOiBwY2lfZHJpdmVyIHN0cnVjdAotICoKLSAqIEhlbHBlciBtYWNybyBmb3IgY29tZWRpIFBDSSBkcml2ZXJzIHdoaWNoIGRvIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsCi0gKiBpbiBtb2R1bGUgaW5pdC9leGl0LiBUaGlzIGVsaW1pbmF0ZXMgYSBsb3Qgb2YgYm9pbGVycGxhdGUuIEVhY2gKLSAqIG1vZHVsZSBtYXkgb25seSB1c2UgdGhpcyBtYWNybyBvbmNlLCBhbmQgY2FsbGluZyBpdCByZXBsYWNlcwotICogbW9kdWxlX2luaXQoKSBhbmQgbW9kdWxlX2V4aXQoKQotICovCi0jZGVmaW5lIG1vZHVsZV9jb21lZGlfcGNpX2RyaXZlcihfX2NvbWVkaV9kcml2ZXIsIF9fcGNpX2RyaXZlcikgXAotCW1vZHVsZV9kcml2ZXIoX19jb21lZGlfZHJpdmVyLCBjb21lZGlfcGNpX2RyaXZlcl9yZWdpc3RlciwgXAotCQkJY29tZWRpX3BjaV9kcml2ZXJfdW5yZWdpc3RlciwgJihfX3BjaV9kcml2ZXIpKQotCiAjZW5kaWYgLyogX0NPTUVESURFVl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCmluZGV4IGYzMmU3MTQuLjU3ZGNmZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy5jCkBAIC00Niw3ICs0Niw3IEBACiB7CiAJaWYgKGh3X2RldiA9PSBkZXYtPmh3X2RldikKIAkJcmV0dXJuIDA7Ci0JaWYgKGRldi0+aHdfZGV2ICE9IE5VTEwpCisJaWYgKGRldi0+aHdfZGV2KQogCQlyZXR1cm4gLUVFWElTVDsKIAlkZXYtPmh3X2RldiA9IGdldF9kZXZpY2UoaHdfZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTEzOSw3ICsxMzksOSBAQAogCQlkZXYtPm5fc3ViZGV2aWNlcyA9IDA7CiAJfQogCWtmcmVlKGRldi0+cHJpdmF0ZSk7CisJa2ZyZWUoZGV2LT5wYWNlcik7CiAJZGV2LT5wcml2YXRlID0gTlVMTDsKKwlkZXYtPnBhY2VyID0gTlVMTDsKIAlkZXYtPmRyaXZlciA9IE5VTEw7CiAJZGV2LT5ib2FyZF9uYW1lID0gTlVMTDsKIAlkZXYtPmJvYXJkX3B0ciA9IE5VTEw7CkBAIC04MDAsNyArODAyLDcgQEAKIAkJfQogCQltb2R1bGVfcHV0KGRyaXYtPm1vZHVsZSk7CiAJfQotCWlmIChkcml2ID09IE5VTEwpIHsKKwlpZiAoIWRyaXYpIHsKIAkJLyogIHJlY29nbml6ZSBoYXMgZmFpbGVkIGlmIHdlIGdldCBoZXJlICovCiAJCS8qICByZXBvcnQgdmFsaWQgYm9hcmQgbmFtZXMgYmVmb3JlIHJldHVybmluZyBlcnJvciAqLwogCQlmb3IgKGRyaXYgPSBjb21lZGlfZHJpdmVyczsgZHJpdjsgZHJpdiA9IGRyaXYtPm5leHQpIHsKQEAgLTgxMiw3ICs4MTQsNyBAQAogCQlyZXQgPSAtRUlPOwogCQlnb3RvIG91dDsKIAl9Ci0JaWYgKGRyaXYtPmF0dGFjaCA9PSBOVUxMKSB7CisJaWYgKCFkcml2LT5hdHRhY2gpIHsKIAkJLyogZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgbWFudWFsIGNvbmZpZ3VyYXRpb24gKi8KIAkJZGV2X3dhcm4oZGV2LT5jbGFzc19kZXYsCiAJCQkgImRyaXZlciAnJXMnIGRvZXMgbm90IHN1cHBvcnQgYXR0YWNoIHVzaW5nIGNvbWVkaV9jb25maWdcbiIsCkBAIC04OTYsNyArODk4LDcgQEAKIAogdm9pZCBjb21lZGlfYXV0b191bmNvbmZpZyhzdHJ1Y3QgZGV2aWNlICpoYXJkd2FyZV9kZXZpY2UpCiB7Ci0JaWYgKGhhcmR3YXJlX2RldmljZSA9PSBOVUxMKQorCWlmICghaGFyZHdhcmVfZGV2aWNlKQogCQlyZXR1cm47CiAJY29tZWRpX3JlbGVhc2VfaGFyZHdhcmVfZGV2aWNlKGhhcmR3YXJlX2RldmljZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1My5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFiOWM4ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1My5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qCi0gKiBjb21lZGkvZHJpdmVycy84MjUzLmgKLSAqIEhlYWRlciBmaWxlIGZvciA4MjUzCi0gKgotICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQotICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaWZuZGVmIF84MjUzX0gKLSNkZWZpbmUgXzgyNTNfSAotCi0jaW5jbHVkZSAiLi4vY29tZWRpLmgiCi0KLS8qCi0gKiBDb21tb24gb3NjaWxsYXRvciBiYXNlIHZhbHVlcyBpbiBuYW5vc2Vjb25kcwotICovCi0jZGVmaW5lIEk4MjU0X09TQ19CQVNFXzEwTUhaCQkxMDAKLSNkZWZpbmUgSTgyNTRfT1NDX0JBU0VfNU1IWgkJMjAwCi0jZGVmaW5lIEk4MjU0X09TQ19CQVNFXzRNSFoJCTI1MAotI2RlZmluZSBJODI1NF9PU0NfQkFTRV8yTUhaCQk1MDAKLSNkZWZpbmUgSTgyNTRfT1NDX0JBU0VfMU1IWgkJMTAwMAotCi1zdGF0aWMgaW5saW5lIHZvaWQgaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihpbnQgaTgyNTNfb3NjX2Jhc2UsCi0JCQkJCSAgICAgdW5zaWduZWQgaW50ICpkMSwKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgKmQyLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCAqbmFub3NlYywKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0JdW5zaWduZWQgaW50IGRpdmlkZXI7Ci0JdW5zaWduZWQgaW50IGRpdjEsIGRpdjI7Ci0JdW5zaWduZWQgaW50IGRpdjFfZ2xiLCBkaXYyX2dsYiwgbnNfZ2xiOwotCXVuc2lnbmVkIGludCBkaXYxX2x1YiwgZGl2Ml9sdWIsIG5zX2x1YjsKLQl1bnNpZ25lZCBpbnQgbnM7Ci0JdW5zaWduZWQgaW50IHN0YXJ0OwotCXVuc2lnbmVkIGludCBuc19sb3csIG5zX2hpZ2g7Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtYXhfY291bnQgPSAweDEwMDAwOwotCS8qCi0JICogZXhpdCBlYXJseSBpZiBldmVyeXRoaW5nIGlzIGFscmVhZHkgY29ycmVjdCAodGhpcyBjYW4gc2F2ZSB0aW1lCi0JICogc2luY2UgdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIHJlcGVhdGVkbHkgZHVyaW5nIGNvbW1hbmQgdGVzdHMKLQkgKiBhbmQgZXhlY3V0aW9uKQotCSAqLwotCWRpdjEgPSAqZDEgPyAqZDEgOiBtYXhfY291bnQ7Ci0JZGl2MiA9ICpkMiA/ICpkMiA6IG1heF9jb3VudDsKLQlkaXZpZGVyID0gZGl2MSAqIGRpdjI7Ci0JaWYgKGRpdjEgKiBkaXYyICogaTgyNTNfb3NjX2Jhc2UgPT0gKm5hbm9zZWMgJiYKLQkgICAgZGl2MSA+IDEgJiYgZGl2MSA8PSBtYXhfY291bnQgJiYgZGl2MiA+IDEgJiYgZGl2MiA8PSBtYXhfY291bnQgJiYKLQkgICAgLyogY2hlY2sgZm9yIG92ZXJmbG93ICovCi0JICAgIGRpdmlkZXIgPiBkaXYxICYmIGRpdmlkZXIgPiBkaXYyICYmCi0JICAgIGRpdmlkZXIgKiBpODI1M19vc2NfYmFzZSA+IGRpdmlkZXIgJiYKLQkgICAgZGl2aWRlciAqIGk4MjUzX29zY19iYXNlID4gaTgyNTNfb3NjX2Jhc2UpIHsKLQkJcmV0dXJuOwotCX0KLQotCWRpdmlkZXIgPSAqbmFub3NlYyAvIGk4MjUzX29zY19iYXNlOwotCi0JZGl2MV9sdWIgPSBkaXYyX2x1YiA9IDA7Ci0JZGl2MV9nbGIgPSBkaXYyX2dsYiA9IDA7Ci0KLQluc19nbGIgPSAwOwotCW5zX2x1YiA9IDB4ZmZmZmZmZmY7Ci0KLQlkaXYyID0gbWF4X2NvdW50OwotCXN0YXJ0ID0gZGl2aWRlciAvIGRpdjI7Ci0JaWYgKHN0YXJ0IDwgMikKLQkJc3RhcnQgPSAyOwotCWZvciAoZGl2MSA9IHN0YXJ0OyBkaXYxIDw9IGRpdmlkZXIgLyBkaXYxICsgMSAmJiBkaXYxIDw9IG1heF9jb3VudDsKLQkgICAgIGRpdjErKykgewotCQlmb3IgKGRpdjIgPSBkaXZpZGVyIC8gZGl2MTsKLQkJICAgICBkaXYxICogZGl2MiA8PSBkaXZpZGVyICsgZGl2MSArIDEgJiYgZGl2MiA8PSBtYXhfY291bnQ7Ci0JCSAgICAgZGl2MisrKSB7Ci0JCQlucyA9IGk4MjUzX29zY19iYXNlICogZGl2MSAqIGRpdjI7Ci0JCQlpZiAobnMgPD0gKm5hbm9zZWMgJiYgbnMgPiBuc19nbGIpIHsKLQkJCQluc19nbGIgPSBuczsKLQkJCQlkaXYxX2dsYiA9IGRpdjE7Ci0JCQkJZGl2Ml9nbGIgPSBkaXYyOwotCQkJfQotCQkJaWYgKG5zID49ICpuYW5vc2VjICYmIG5zIDwgbnNfbHViKSB7Ci0JCQkJbnNfbHViID0gbnM7Ci0JCQkJZGl2MV9sdWIgPSBkaXYxOwotCQkJCWRpdjJfbHViID0gZGl2MjsKLQkJCX0KLQkJfQotCX0KLQotCXN3aXRjaCAoZmxhZ3MgJiBDTURGX1JPVU5EX01BU0spIHsKLQljYXNlIENNREZfUk9VTkRfTkVBUkVTVDoKLQlkZWZhdWx0OgotCQluc19oaWdoID0gZGl2MV9sdWIgKiBkaXYyX2x1YiAqIGk4MjUzX29zY19iYXNlOwotCQluc19sb3cgPSBkaXYxX2dsYiAqIGRpdjJfZ2xiICogaTgyNTNfb3NjX2Jhc2U7Ci0JCWlmIChuc19oaWdoIC0gKm5hbm9zZWMgPCAqbmFub3NlYyAtIG5zX2xvdykgewotCQkJZGl2MSA9IGRpdjFfbHViOwotCQkJZGl2MiA9IGRpdjJfbHViOwotCQl9IGVsc2UgewotCQkJZGl2MSA9IGRpdjFfZ2xiOwotCQkJZGl2MiA9IGRpdjJfZ2xiOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgQ01ERl9ST1VORF9VUDoKLQkJZGl2MSA9IGRpdjFfbHViOwotCQlkaXYyID0gZGl2Ml9sdWI7Ci0JCWJyZWFrOwotCWNhc2UgQ01ERl9ST1VORF9ET1dOOgotCQlkaXYxID0gZGl2MV9nbGI7Ci0JCWRpdjIgPSBkaXYyX2dsYjsKLQkJYnJlYWs7Ci0JfQotCi0JKm5hbm9zZWMgPSBkaXYxICogZGl2MiAqIGk4MjUzX29zY19iYXNlOwotCS8qIG1hc2tpbmcgaXMgZG9uZSBzaW5jZSBjb3VudGVyIG1hcHMgemVybyB0byAweDEwMDAwICovCi0JKmQxID0gZGl2MSAmIDB4ZmZmZjsKLQkqZDIgPSBkaXYyICYgMHhmZmZmOwotfQotCi0jaWZuZGVmIENNRFRFU1QKLS8qCi0gKiBpODI1NF9sb2FkIHByb2dyYW1zIDgyNTQgY291bnRlciBjaGlwLiAgSXQgc2hvdWxkIGFsc28gd29yayBmb3IgdGhlIDgyNTMuCi0gKiBiYXNlX2FkZHJlc3MgaXMgdGhlIGxvd2VzdCBpbyBhZGRyZXNzCi0gKiBmb3IgdGhlIGNoaXAgKHRoZSBhZGRyZXNzIG9mIGNvdW50ZXIgMCkuCi0gKiBjb3VudGVyX251bWJlciBpcyB0aGUgY291bnRlciB5b3Ugd2FudCB0byBsb2FkICgwLDEgb3IgMikKLSAqIGNvdW50IGlzIHRoZSBudW1iZXIgdG8gbG9hZCBpbnRvIHRoZSBjb3VudGVyLgotICoKLSAqIFlvdSBwcm9iYWJseSB3YW50IHRvIHVzZSBtb2RlIDIuCi0gKgotICogVXNlIGk4MjU0X21tX2xvYWQoKSBpZiB5b3UgYm9hcmQgdXNlcyBtZW1vcnktbWFwcGVkIGlvLCBpdCBpcwotICogdGhlIHNhbWUgYXMgaTgyNTRfbG9hZCgpIGV4Y2VwdCBpdCB1c2VzIHdyaXRlYigpIGluc3RlYWQgb2Ygb3V0YigpLgotICoKLSAqIE5laXRoZXIgaTgyNTRfbG9hZCgpIG9yIGk4MjU0X3JlYWQoKSBkbyB0aGVpciBsb2FkaW5nL3JlYWRpbmcKLSAqIGF0b21pY2FsbHkuICBUaGUgMTYgYml0IHJlYWQvd3JpdGVzIGFyZSBwZXJmb3JtZWQgd2l0aCB0d28gc3VjY2Vzc2l2ZQotICogOCBiaXQgcmVhZC93cml0ZXMuICBTbyBpZiB0d28gcGFydHMgb2YgeW91ciBkcml2ZXIgZG8gYSBsb2FkL3JlYWQgb24KLSAqIHRoZSBzYW1lIGNvdW50ZXIsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gcHJvdGVjdCB0aGVzZSBmdW5jdGlvbnMKLSAqIHdpdGggYSBzcGlubG9jay4KLSAqCi0gKiBGTUgKLSAqLwotCi0jZGVmaW5lIGk4MjU0X2NvbnRyb2xfcmVnCTMKLQotc3RhdGljIGlubGluZSBpbnQgaTgyNTRfbG9hZCh1bnNpZ25lZCBsb25nIGJhc2VfYWRkcmVzcywgdW5zaWduZWQgaW50IHJlZ3NoaWZ0LAotCQkJICAgICB1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIsIHVuc2lnbmVkIGludCBjb3VudCwKLQkJCSAgICAgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JdW5zaWduZWQgaW50IGJ5dGU7Ci0KLQlpZiAoY291bnRlcl9udW1iZXIgPiAyKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGNvdW50ID4gMHhmZmZmKQotCQlyZXR1cm4gLTE7Ci0JaWYgKG1vZGUgPiA1KQotCQlyZXR1cm4gLTE7Ci0JaWYgKChtb2RlID09IDIgfHwgbW9kZSA9PSAzKSAmJiBjb3VudCA9PSAxKQotCQlyZXR1cm4gLTE7Ci0KLQlieXRlID0gY291bnRlcl9udW1iZXIgPDwgNjsKLQlieXRlIHw9IDB4MzA7CQkvKiBsb2FkIGxvdyB0aGVuIGhpZ2ggYnl0ZSAqLwotCWJ5dGUgfD0gKG1vZGUgPDwgMSk7CS8qIHNldCBjb3VudGVyIG1vZGUgKi8KLQlvdXRiKGJ5dGUsIGJhc2VfYWRkcmVzcyArIChpODI1NF9jb250cm9sX3JlZyA8PCByZWdzaGlmdCkpOwotCWJ5dGUgPSBjb3VudCAmIDB4ZmY7CS8qIGxzYiBvZiBjb3VudGVyIHZhbHVlICovCi0Jb3V0YihieXRlLCBiYXNlX2FkZHJlc3MgKyAoY291bnRlcl9udW1iZXIgPDwgcmVnc2hpZnQpKTsKLQlieXRlID0gKGNvdW50ID4+IDgpICYgMHhmZjsJLyogbXNiIG9mIGNvdW50ZXIgdmFsdWUgKi8KLQlvdXRiKGJ5dGUsIGJhc2VfYWRkcmVzcyArIChjb3VudGVyX251bWJlciA8PCByZWdzaGlmdCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGk4MjU0X21tX2xvYWQodm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsCi0JCQkJdW5zaWduZWQgaW50IHJlZ3NoaWZ0LAotCQkJCXVuc2lnbmVkIGludCBjb3VudGVyX251bWJlciwKLQkJCQl1bnNpZ25lZCBpbnQgY291bnQsCi0JCQkJdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JdW5zaWduZWQgaW50IGJ5dGU7Ci0KLQlpZiAoY291bnRlcl9udW1iZXIgPiAyKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGNvdW50ID4gMHhmZmZmKQotCQlyZXR1cm4gLTE7Ci0JaWYgKG1vZGUgPiA1KQotCQlyZXR1cm4gLTE7Ci0JaWYgKChtb2RlID09IDIgfHwgbW9kZSA9PSAzKSAmJiBjb3VudCA9PSAxKQotCQlyZXR1cm4gLTE7Ci0KLQlieXRlID0gY291bnRlcl9udW1iZXIgPDwgNjsKLQlieXRlIHw9IDB4MzA7CQkvKiBsb2FkIGxvdyB0aGVuIGhpZ2ggYnl0ZSAqLwotCWJ5dGUgfD0gKG1vZGUgPDwgMSk7CS8qIHNldCBjb3VudGVyIG1vZGUgKi8KLQl3cml0ZWIoYnl0ZSwgYmFzZV9hZGRyZXNzICsgKGk4MjU0X2NvbnRyb2xfcmVnIDw8IHJlZ3NoaWZ0KSk7Ci0JYnl0ZSA9IGNvdW50ICYgMHhmZjsJLyogbHNiIG9mIGNvdW50ZXIgdmFsdWUgKi8KLQl3cml0ZWIoYnl0ZSwgYmFzZV9hZGRyZXNzICsgKGNvdW50ZXJfbnVtYmVyIDw8IHJlZ3NoaWZ0KSk7Ci0JYnl0ZSA9IChjb3VudCA+PiA4KSAmIDB4ZmY7CS8qIG1zYiBvZiBjb3VudGVyIHZhbHVlICovCi0Jd3JpdGViKGJ5dGUsIGJhc2VfYWRkcmVzcyArIChjb3VudGVyX251bWJlciA8PCByZWdzaGlmdCkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFJldHVybnMgMTYgYml0IGNvdW50ZXIgdmFsdWUsIHNob3VsZCB3b3JrIGZvciA4MjUzIGFsc28uICovCi1zdGF0aWMgaW5saW5lIGludCBpODI1NF9yZWFkKHVuc2lnbmVkIGxvbmcgYmFzZV9hZGRyZXNzLCB1bnNpZ25lZCBpbnQgcmVnc2hpZnQsCi0JCQkgICAgIHVuc2lnbmVkIGludCBjb3VudGVyX251bWJlcikKLXsKLQl1bnNpZ25lZCBpbnQgYnl0ZTsKLQlpbnQgcmV0OwotCi0JaWYgKGNvdW50ZXJfbnVtYmVyID4gMikKLQkJcmV0dXJuIC0xOwotCi0JLyogbGF0Y2ggY291bnRlciAqLwotCWJ5dGUgPSBjb3VudGVyX251bWJlciA8PCA2OwotCW91dGIoYnl0ZSwgYmFzZV9hZGRyZXNzICsgKGk4MjU0X2NvbnRyb2xfcmVnIDw8IHJlZ3NoaWZ0KSk7Ci0KLQkvKiByZWFkIGxzYiAqLwotCXJldCA9IGluYihiYXNlX2FkZHJlc3MgKyAoY291bnRlcl9udW1iZXIgPDwgcmVnc2hpZnQpKTsKLQkvKiByZWFkIG1zYiAqLwotCXJldCArPSBpbmIoYmFzZV9hZGRyZXNzICsgKGNvdW50ZXJfbnVtYmVyIDw8IHJlZ3NoaWZ0KSkgPDwgODsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGk4MjU0X21tX3JlYWQodm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsCi0JCQkJdW5zaWduZWQgaW50IHJlZ3NoaWZ0LAotCQkJCXVuc2lnbmVkIGludCBjb3VudGVyX251bWJlcikKLXsKLQl1bnNpZ25lZCBpbnQgYnl0ZTsKLQlpbnQgcmV0OwotCi0JaWYgKGNvdW50ZXJfbnVtYmVyID4gMikKLQkJcmV0dXJuIC0xOwotCi0JLyogbGF0Y2ggY291bnRlciAqLwotCWJ5dGUgPSBjb3VudGVyX251bWJlciA8PCA2OwotCXdyaXRlYihieXRlLCBiYXNlX2FkZHJlc3MgKyAoaTgyNTRfY29udHJvbF9yZWcgPDwgcmVnc2hpZnQpKTsKLQotCS8qIHJlYWQgbHNiICovCi0JcmV0ID0gcmVhZGIoYmFzZV9hZGRyZXNzICsgKGNvdW50ZXJfbnVtYmVyIDw8IHJlZ3NoaWZ0KSk7Ci0JLyogcmVhZCBtc2IgKi8KLQlyZXQgKz0gcmVhZGIoYmFzZV9hZGRyZXNzICsgKGNvdW50ZXJfbnVtYmVyIDw8IHJlZ3NoaWZ0KSkgPDwgODsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIExvYWRzIDE2IGJpdCBpbml0aWFsIGNvdW50ZXIgdmFsdWUsIHNob3VsZCB3b3JrIGZvciA4MjUzIGFsc28uICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaTgyNTRfd3JpdGUodW5zaWduZWQgbG9uZyBiYXNlX2FkZHJlc3MsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHJlZ3NoaWZ0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBjb3VudGVyX251bWJlciwgdW5zaWduZWQgaW50IGNvdW50KQotewotCXVuc2lnbmVkIGludCBieXRlOwotCi0JaWYgKGNvdW50ZXJfbnVtYmVyID4gMikKLQkJcmV0dXJuOwotCi0JYnl0ZSA9IGNvdW50ICYgMHhmZjsJLyogbHNiIG9mIGNvdW50ZXIgdmFsdWUgKi8KLQlvdXRiKGJ5dGUsIGJhc2VfYWRkcmVzcyArIChjb3VudGVyX251bWJlciA8PCByZWdzaGlmdCkpOwotCWJ5dGUgPSAoY291bnQgPj4gOCkgJiAweGZmOwkvKiBtc2Igb2YgY291bnRlciB2YWx1ZSAqLwotCW91dGIoYnl0ZSwgYmFzZV9hZGRyZXNzICsgKGNvdW50ZXJfbnVtYmVyIDw8IHJlZ3NoaWZ0KSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpODI1NF9tbV93cml0ZSh2b2lkIF9faW9tZW0gKmJhc2VfYWRkcmVzcywKLQkJCQkgIHVuc2lnbmVkIGludCByZWdzaGlmdCwKLQkJCQkgIHVuc2lnbmVkIGludCBjb3VudGVyX251bWJlciwKLQkJCQkgIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQl1bnNpZ25lZCBpbnQgYnl0ZTsKLQotCWlmIChjb3VudGVyX251bWJlciA+IDIpCi0JCXJldHVybjsKLQotCWJ5dGUgPSBjb3VudCAmIDB4ZmY7CS8qIGxzYiBvZiBjb3VudGVyIHZhbHVlICovCi0Jd3JpdGViKGJ5dGUsIGJhc2VfYWRkcmVzcyArIChjb3VudGVyX251bWJlciA8PCByZWdzaGlmdCkpOwotCWJ5dGUgPSAoY291bnQgPj4gOCkgJiAweGZmOwkvKiBtc2Igb2YgY291bnRlciB2YWx1ZSAqLwotCXdyaXRlYihieXRlLCBiYXNlX2FkZHJlc3MgKyAoY291bnRlcl9udW1iZXIgPDwgcmVnc2hpZnQpKTsKLX0KLQotLyoKLSAqIFNldCBjb3VudGVyIG1vZGUsIHNob3VsZCB3b3JrIGZvciA4MjUzIGFsc28uCi0gKiBOb3RlOiB0aGUgJ21vZGUnIHZhbHVlIGlzIGRpZmZlcmVudCB0byB0aGF0IGZvciBpODI1NF9sb2FkKCkgYW5kIGNvbWVzCi0gKiBmcm9tIHRoZSBJTlNOX0NPTkZJR184MjU0X1NFVF9NT0RFIGNvbW1hbmQ6Ci0gKiAgIEk4MjU0X01PREUwLCBJODI1NF9NT0RFMSwgLi4uLCBJODI1NF9NT0RFNQotICogT1InZWQgd2l0aDoKLSAqICAgSTgyNTRfQkNELCBJODI1NF9CSU5BUlkKLSAqLwotc3RhdGljIGlubGluZSBpbnQgaTgyNTRfc2V0X21vZGUodW5zaWduZWQgbG9uZyBiYXNlX2FkZHJlc3MsCi0JCQkJIHVuc2lnbmVkIGludCByZWdzaGlmdCwKLQkJCQkgdW5zaWduZWQgaW50IGNvdW50ZXJfbnVtYmVyLCB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1bnNpZ25lZCBpbnQgYnl0ZTsKLQotCWlmIChjb3VudGVyX251bWJlciA+IDIpCi0JCXJldHVybiAtMTsKLQlpZiAobW9kZSA+IChJODI1NF9NT0RFNSB8IEk4MjU0X0JDRCkpCi0JCXJldHVybiAtMTsKLQotCWJ5dGUgPSBjb3VudGVyX251bWJlciA8PCA2OwotCWJ5dGUgfD0gMHgzMDsJCS8qIGxvYWQgbG93IHRoZW4gaGlnaCBieXRlICovCi0JYnl0ZSB8PSBtb2RlOwkJLyogc2V0IGNvdW50ZXIgbW9kZSBhbmQgQkNEfGJpbmFyeSAqLwotCW91dGIoYnl0ZSwgYmFzZV9hZGRyZXNzICsgKGk4MjU0X2NvbnRyb2xfcmVnIDw8IHJlZ3NoaWZ0KSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaTgyNTRfbW1fc2V0X21vZGUodm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsCi0JCQkJICAgIHVuc2lnbmVkIGludCByZWdzaGlmdCwKLQkJCQkgICAgdW5zaWduZWQgaW50IGNvdW50ZXJfbnVtYmVyLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQl1bnNpZ25lZCBpbnQgYnl0ZTsKLQotCWlmIChjb3VudGVyX251bWJlciA+IDIpCi0JCXJldHVybiAtMTsKLQlpZiAobW9kZSA+IChJODI1NF9NT0RFNSB8IEk4MjU0X0JDRCkpCi0JCXJldHVybiAtMTsKLQotCWJ5dGUgPSBjb3VudGVyX251bWJlciA8PCA2OwotCWJ5dGUgfD0gMHgzMDsJCS8qIGxvYWQgbG93IHRoZW4gaGlnaCBieXRlICovCi0JYnl0ZSB8PSBtb2RlOwkJLyogc2V0IGNvdW50ZXIgbW9kZSBhbmQgQkNEfGJpbmFyeSAqLwotCXdyaXRlYihieXRlLCBiYXNlX2FkZHJlc3MgKyAoaTgyNTRfY29udHJvbF9yZWcgPDwgcmVnc2hpZnQpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpODI1NF9zdGF0dXModW5zaWduZWQgbG9uZyBiYXNlX2FkZHJlc3MsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHJlZ3NoaWZ0LAotCQkJICAgICAgIHVuc2lnbmVkIGludCBjb3VudGVyX251bWJlcikKLXsKLQlvdXRiKDB4RTAgfCAoMiA8PCBjb3VudGVyX251bWJlciksCi0JICAgICBiYXNlX2FkZHJlc3MgKyAoaTgyNTRfY29udHJvbF9yZWcgPDwgcmVnc2hpZnQpKTsKLQlyZXR1cm4gaW5iKGJhc2VfYWRkcmVzcyArIChjb3VudGVyX251bWJlciA8PCByZWdzaGlmdCkpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpODI1NF9tbV9zdGF0dXModm9pZCBfX2lvbWVtICpiYXNlX2FkZHJlc3MsCi0JCQkJICB1bnNpZ25lZCBpbnQgcmVnc2hpZnQsCi0JCQkJICB1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIpCi17Ci0Jd3JpdGViKDB4RTAgfCAoMiA8PCBjb3VudGVyX251bWJlciksCi0JICAgICAgIGJhc2VfYWRkcmVzcyArIChpODI1NF9jb250cm9sX3JlZyA8PCByZWdzaGlmdCkpOwotCXJldHVybiByZWFkYihiYXNlX2FkZHJlc3MgKyAoY291bnRlcl9udW1iZXIgPDwgcmVnc2hpZnQpKTsKLX0KLQotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1LmMKaW5kZXggYzJmMTVkZS4uYmE4OTMyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvODI1NS5jCkBAIC01MSw3ICs1MSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICI4MjU1LmgiCiAKIHN0cnVjdCBzdWJkZXZfODI1NV9wcml2YXRlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy84MjU1X3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTVfcGNpLmMKaW5kZXggOTg0NzY0Mi4uYmI5ODU0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTVfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzLzgyNTVfcGNpLmMKQEAgLTYyLDkgKzYyLDggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNpbmNsdWRlICI4MjU1LmgiCiAKQEAgLTE3OCw3ICsxNzcsNyBAQAogCX0sCiB9OwogCi0vKiByaXBwZWQgZnJvbSBtaXRlLmggYW5kIG1pdGVfc2V0dXAyKCkgdG8gYXZvaWQgbWl0ZSBkZXBlbmRhbmN5ICovCisvKiByaXBwZWQgZnJvbSBtaXRlLmggYW5kIG1pdGVfc2V0dXAyKCkgdG8gYXZvaWQgbWl0ZSBkZXBlbmRlbmN5ICovCiAjZGVmaW5lIE1JVEVfSU9EV0JTUgkweGMwCSAvKiBJTyBEZXZpY2UgV2luZG93IEJhc2UgU2l6ZSBSZWdpc3RlciAqLwogI2RlZmluZSBXRU5BQgkJKDEgPDwgNykgLyogd2luZG93IGVuYWJsZSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggN2QxZmJkNS4uZDZkODM0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9NYWtlZmlsZQpAQCAtMyw2ICszLDcgQEAKIGNjZmxhZ3MtJChDT05GSUdfQ09NRURJX0RFQlVHKQkJOj0gLURERUJVRwogCiAjIENvbWVkaSAiaGVscGVyIiBtb2R1bGVzCitvYmotJChDT05GSUdfQ09NRURJXzgyNTQpCQkrPSBjb21lZGlfODI1NC5vCiBvYmotJChDT05GSUdfQ09NRURJX0lTQURNQSkJCSs9IGNvbWVkaV9pc2FkbWEubwogCiAjIENvbWVkaSBtaXNjIGRyaXZlcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTAzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xMDMyLmMKaW5kZXggNDkxMWI2Mi4uYjM3MTY2ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xMDMyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xMDMyLmMKQEAgLTcxLDExICs3MSw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogI2luY2x1ZGUgImFtY2NfczU5MzMuaCIKIAogLyoKQEAgLTE5NiwxMSArMTk0LDExIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CkBAIC0yMTAsMTEgKzIwOCwxMiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTIzOCw3ICsyMzcsNyBAQAogCiAJaWYgKCFkZXZwcml2LT5jdHJsKSB7CiAJCWRldl93YXJuKGRldi0+Y2xhc3NfZGV2LAotCQkJIkludGVycnVwdHMgZGlzYWJsZWQgZHVlIHRvIG1vZGUgY29uZmlndXJhdGlvbiFcbiIpOworCQkJICJJbnRlcnJ1cHRzIGRpc2FibGVkIGR1ZSB0byBtb2RlIGNvbmZpZ3VyYXRpb24hXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yOTYsNyArMjk1LDcgQEAKIH0KIAogc3RhdGljIGludCBhcGNpMTAzMl9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCisJCQkJdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29tZWRpX3RvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgYXBjaTEwMzJfcHJpdmF0ZSAqZGV2cHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNTAwLmMKaW5kZXggZjE1YWExZi4uNjM5OTFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNTAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNTAwLmMKQEAgLTIyLDExICsyMiw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogI2luY2x1ZGUgImFtY2NfczU5MzMuaCIKICNpbmNsdWRlICJ6ODUzNi5oIgogCkBAIC0yNDksOCArMjQ3LDggQEAKIAkgKgogCSAqICAgIE1hc2sgICAgIE1lYW5pbmcKIAkgKiAtLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKiAweDAwMDAwMDAxICBFdmVudCAxIGhhcyBvY2N1cmVkCi0JICogMHgwMDAwMDAxMCAgRXZlbnQgMiBoYXMgb2NjdXJlZAorCSAqIDB4MDAwMDAwMDEgIEV2ZW50IDEgaGFzIG9jY3VycmVkCisJICogMHgwMDAwMDAxMCAgRXZlbnQgMiBoYXMgb2NjdXJyZWQKIAkgKiAweDAwMDAwMTAwICBDb3VudGVyL3RpbWVyIDEgaGFzIHJ1biBkb3duIChub3QgaW1wbGVtZW50ZWQpCiAJICogMHgwMDAwMTAwMCAgQ291bnRlci90aW1lciAyIGhhcyBydW4gZG93biAobm90IGltcGxlbWVudGVkKQogCSAqIDB4MDAwMTAwMDAgIENvdW50ZXIgMyBoYXMgcnVuIGRvd24gKG5vdCBpbXBsZW1lbnRlZCkKQEAgLTM4NiwxMSArMzg0LDExIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19JTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfSU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CkBAIC00MTUsMTIgKzQxMywxMyBAQAogCSAqICAgMwlPUiBtb2RlIGZvciBQb3J0IEEgKGRpZ2l0YWwgaW5wdXRzIDAtNykKIAkgKglPUiBtb2RlIGZvciBQb3J0IEIgKGRpZ2l0YWwgaW5wdXRzIDgtMTMgYW5kIGludGVybmFsIHNpZ25hbHMpCiAJICovCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c3RhcnRfYXJnLCAzKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdGFydF9hcmcsIDMpOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC01MTQsMTEgKzUxMywxMSBAQAogCiAJCXNyYyA9IHB0ICYgMHhmZjsKIAkJaWYgKHNyYykKLQkJCXJldCB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoc3JjKTsKKwkJCXJldCB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoc3JjKTsKIAogCQlzcmMgPSAocHQgPj4gOCkgJiAweGZmOwogCQlpZiAoc3JjKQotCQkJcmV0IHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShzcmMpOworCQkJcmV0IHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShzcmMpOwogCiAJCWlmIChyZXQpIHsKIAkJCWRldl9kYmcoZGV2LT5jbGFzc19kZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1MTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUxNi5jCmluZGV4IGQ4NDEwNDEuLjljNTE2ZDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUxNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTUxNi5jCkBAIC0yMywxMSArMjMsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKICNpbmNsdWRlICJhZGRpX3dhdGNoZG9nLmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAKIC8qCiAgKiBQQ0kgYmFyIDEgSS9PIFJlZ2lzdGVyIG1hcCAtIERpZ2l0YWwgaW5wdXQvb3V0cHV0CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE1NjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCmluZGV4IDY4NzJiNjkuLjMzZTU4YjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMTU2NC5jCkBAIC0yMiwxMiArMjIsMTAgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKICNpbmNsdWRlICJhZGRpX3Rjdy5oIgogI2luY2x1ZGUgImFkZGlfd2F0Y2hkb2cuaCIKIApAQCAtMTA3LDEyICsxMDUsMTIgQEAKICNkZWZpbmUgQVBDSTE1NjRfQ09VTlRFUih4KQkJCSgoeCkgKiAweDIwKQogCiBzdHJ1Y3QgYXBjaTE1NjRfcHJpdmF0ZSB7Ci0JdW5zaWduZWQgbG9uZyBlZXByb207CQkvKiBiYXNlIGFkZHJlc3Mgb2YgRUVQUk9NIHJlZ2lzdGVyICovCi0JdW5zaWduZWQgbG9uZyB0aW1lcjsJCS8qIGJhc2UgYWRkcmVzcyBvZiAxMi1iaXQgdGltZXIgKi8KLQl1bnNpZ25lZCBsb25nIGNvdW50ZXJzOwkJLyogYmFzZSBhZGRyZXNzIG9mIDMyLWJpdCBjb3VudGVycyAqLwotCXVuc2lnbmVkIGludCBtb2RlMTsJCS8qIHJpZGluZy1lZGdlL2hpZ2ggbGV2ZWwgY2hhbm5lbHMgKi8KLQl1bnNpZ25lZCBpbnQgbW9kZTI7CQkvKiBmYWxsaW5nLWVkZ2UvbG93IGxldmVsIGNoYW5uZWxzICovCi0JdW5zaWduZWQgaW50IGN0cmw7CQkvKiBpbnRlcnJ1cHQgbW9kZSBPUiAoZWRnZSkgLiBBTkQgKGxldmVsKSAqLworCXVuc2lnbmVkIGxvbmcgZWVwcm9tOwkvKiBiYXNlIGFkZHJlc3Mgb2YgRUVQUk9NIHJlZ2lzdGVyICovCisJdW5zaWduZWQgbG9uZyB0aW1lcjsJLyogYmFzZSBhZGRyZXNzIG9mIDEyLWJpdCB0aW1lciAqLworCXVuc2lnbmVkIGxvbmcgY291bnRlcnM7CS8qIGJhc2UgYWRkcmVzcyBvZiAzMi1iaXQgY291bnRlcnMgKi8KKwl1bnNpZ25lZCBpbnQgbW9kZTE7CS8qIHJpZGluZy1lZGdlL2hpZ2ggbGV2ZWwgY2hhbm5lbHMgKi8KKwl1bnNpZ25lZCBpbnQgbW9kZTI7CS8qIGZhbGxpbmctZWRnZS9sb3cgbGV2ZWwgY2hhbm5lbHMgKi8KKwl1bnNpZ25lZCBpbnQgY3RybDsJLyogaW50ZXJydXB0IG1vZGUgT1IgKGVkZ2UpIC4gQU5EIChsZXZlbCkgKi8KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRza19jdXJyZW50OwogfTsKIApAQCAtMzY1LDExICszNjMsMTEgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKQEAgLTM3OSwxMSArMzc3LDEyIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtNDA3LDcgKzQwNiw3IEBACiAKIAlpZiAoIWRldnByaXYtPmN0cmwpIHsKIAkJZGV2X3dhcm4oZGV2LT5jbGFzc19kZXYsCi0JCQkiSW50ZXJydXB0cyBkaXNhYmxlZCBkdWUgdG8gbW9kZSBjb25maWd1cmF0aW9uIVxuIik7CisJCQkgIkludGVycnVwdHMgZGlzYWJsZWQgZHVlIHRvIG1vZGUgY29uZmlndXJhdGlvbiFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQzMCw3ICs0MjksNyBAQAogfQogCiBzdGF0aWMgaW50IGFwY2kxNTY0X2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKKwkJCQl1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBhcGNpMTU2NF9wcml2YXRlICpkZXZwcml2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8xNnh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE2eHguYwppbmRleCBhMTI0OGRhLi5jNjMxMzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE2eHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzE2eHguYwpAQCAtMjMsOSArMjMsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogLyoKICAqIFJlZ2lzdGVyIEkvTyBtYXAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjAzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8yMDMyLmMKaW5kZXggZWViZjRmMS4uYWQ3MTUyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8yMDMyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8yMDMyLmMKQEAgLTIzLDEzICsyMywxMSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAjaW5jbHVkZSAiYWRkaV93YXRjaGRvZy5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCiAvKgogICogUENJIGJhciAxIEkvTyBSZWdpc3RlciBtYXAKQEAgLTkzLDE3ICs5MSwxNyBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTExMiwxNCArMTEwLDE1IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMjIwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8yMjAwLmMKaW5kZXggMWY5ZDEzNi4uMmIzODJhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8yMjAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8yMjAwLmMKQEAgLTIzLDkgKzIzLDggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAjaW5jbHVkZSAiYWRkaV93YXRjaGRvZy5oIgogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zMTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMxMjAuYwppbmRleCBjNjVmOTQwLi45NWRjNjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMxMjAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzMxMjAuYwpAQCAtMjIsMTEgKzIyLDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAjaW5jbHVkZSAiYW1jY19zNTkzMy5oIgogCiAvKgpAQCAtNjEyLDIxICs2MTAsMjEgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAogCQkJCQlUUklHX1RJTUVSIHwgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNjM1LDIxICs2MzMsMjQgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKQkvKiBUZXN0IERlbGF5IHRpbWluZyAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywgMTAwMDAwKTsKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CS8qIFRlc3QgRGVsYXkgdGltaW5nICovCisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIDEwMDAwMCk7CisJfQogCiAJLyogbWluaW11bSBjb252ZXJzaW9uIHRpbWUgcGVyIHNhbXBsZSBpcyAxMHVzICovCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDEwMDAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgMTAwMDApOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTY1OSw3ICs2NjAsNyBAQAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKIAkJLyogc2NhbiBiZWdpbiBtdXN0IGJlIGxhcmdlciB0aGFuIHRoZSBzY2FuIHRpbWUgKi8KIAkJYXJnID0gY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+c2Nhbl9lbmRfYXJnOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGVycikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX2FwY2lfMzUwMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zNTAxLmMKaW5kZXggNTk2MWYxOS4uNzM3ODZhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zNTAxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zNTAxLmMKQEAgLTIzLDEyICsyMywxMCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogI2luY2x1ZGUgImFtY2NfczU5MzMuaCIKIAogLyoKQEAgLTIwMyw3ICsyMDEsNyBAQAogCQlvdXRiKE5WQ01EX0xPQURfSElHSCwgaW9iYXNlICsgQU1DQ19PUF9SRUdfTUNTUl9OVkNNRCk7CiAJCWFwY2kzNTAxX2VlcHJvbV93YWl0KGlvYmFzZSk7CiAJCW91dGIoKChhZGRyICsgaSkgPj4gOCkgJiAweGZmLAotCQkJaW9iYXNlICsgQU1DQ19PUF9SRUdfTUNTUl9OVkRBVEEpOworCQkgICAgIGlvYmFzZSArIEFNQ0NfT1BfUkVHX01DU1JfTlZEQVRBKTsKIAkJYXBjaTM1MDFfZWVwcm9tX3dhaXQoaW9iYXNlKTsKIAogCQkvKiBSZWFkIHRoZSBlZXByb20gZGF0YSBieXRlICovCkBAIC0yNzAsNyArMjY4LDcgQEAKIAogCS8qICBEaXNhYmxlIEludGVycnVwdCAqLwogCXVsX0NvbW1hbmQxID0gaW5sKGRldi0+aW9iYXNlICsgQVBDSTM1MDFfVElNRVJfQ1RSTF9SRUcpOwotCXVsX0NvbW1hbmQxID0gKHVsX0NvbW1hbmQxICYgMHhGRkZGRjlGRHVsKTsKKwl1bF9Db21tYW5kMSA9IHVsX0NvbW1hbmQxICYgMHhGRkZGRjlGRHVsOwogCW91dGwodWxfQ29tbWFuZDEsIGRldi0+aW9iYXNlICsgQVBDSTM1MDFfVElNRVJfQ1RSTF9SRUcpOwogCiAJdWlfVGltZXJfQU9XYXRjaGRvZyA9IGlubChkZXYtPmlvYmFzZSArIEFQQ0kzNTAxX1RJTUVSX0lSUV9SRUcpICYgMHgxOwpAQCAtMjgyLDcgKzI4MCw3IEBACiAJLyogRW5hYmxlIEludGVycnVwdCBTZW5kIGEgc2lnbmFsIHRvIGZyb20ga2VybmVsIHRvIHVzZXIgc3BhY2UgKi8KIAlzZW5kX3NpZyhTSUdJTywgZGV2cHJpdi0+dHNrX0N1cnJlbnQsIDApOwogCXVsX0NvbW1hbmQxID0gaW5sKGRldi0+aW9iYXNlICsgQVBDSTM1MDFfVElNRVJfQ1RSTF9SRUcpOwotCXVsX0NvbW1hbmQxID0gKCh1bF9Db21tYW5kMSAmIDB4RkZGRkY5RkR1bCkgfCAxIDw8IDEpOworCXVsX0NvbW1hbmQxID0gKHVsX0NvbW1hbmQxICYgMHhGRkZGRjlGRHVsKSB8IDEgPDwgMTsKIAlvdXRsKHVsX0NvbW1hbmQxLCBkZXYtPmlvYmFzZSArIEFQQ0kzNTAxX1RJTUVSX0NUUkxfUkVHKTsKIAlpbmwoZGV2LT5pb2Jhc2UgKyBBUENJMzUwMV9USU1FUl9TVEFUVVNfUkVHKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfYXBjaV8zeHh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzN4eHguYwppbmRleCBjMTczODEwLi5iZWY2ZWZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzN4eHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV9hcGNpXzN4eHguYwpAQCAtMjMsMTIgKzIzLDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKLQotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2RlZmluZSBDT05WX1VOSVRfTlMJCSgxIDw8IDApCiAjZGVmaW5lIENPTlZfVU5JVF9VUwkJKDEgPDwgMSkKQEAgLTUyOSwxOCArNTI2LDE4IEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0ZPTExPVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNTQ5LDE2ICs1NDYsMTcgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJIGJvYXJkLT5haV9taW5fYWNxX25zKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJICAgIGJvYXJkLT5haV9taW5fYWNxX25zKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC01NjcsNyArNTY1LDcgQEAKIAogCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7CiAJZXJyIHw9IGFwY2kzeHh4X2FpX25zX3RvX3RpbWVyKGRldiwgJmFyZywgY21kLT5mbGFncyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV93YXRjaGRvZy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkZGlfd2F0Y2hkb2cuYwppbmRleCBjNWIwODJkLi45ZDk4NTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRkaV93YXRjaGRvZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGRpX3dhdGNoZG9nLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAogCQkvKiBUaW1lIGJhc2UgaXMgMjBtcywgbGV0IHRoZSB1c2VyIGtub3cgdGhlIHRpbWVvdXQgKi8KIAkJZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsICJ3YXRjaGRvZyBlbmFibGVkLCB0aW1lb3V0OiVkbXNcbiIsCi0JCQkyMCAqIHJlbG9hZCArIDIwKTsKKwkJCSAyMCAqIHJlbG9hZCArIDIwKTsKIAkJYnJlYWs7CiAJY2FzZSBJTlNOX0NPTkZJR19ESVNBUk06CiAJCXNwcml2LT53ZG9nX2N0cmwgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k2MjA4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYwppbmRleCBhM2VhNGI3Li43ZWQzZmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTYyMDguYwpAQCAtMTksMTkgKzE5LDIyIEBACiAvKgogICogRHJpdmVyOiBhZGxfcGNpNjIwOAogICogRGVzY3JpcHRpb246IEFETGluayBQQ0ktNjIwOC82MjE2IFNlcmllcyBNdWx0aS1jaGFubmVsIEFuYWxvZyBPdXRwdXQgQ2FyZHMKLSAqIERldmljZXM6IFtBRExpbmtdIFBDSS02MjA4IChhZGxfcGNpNjIwOCksIFBDSS02MjE2IChhZGxfcGNpNjIxNikKKyAqIERldmljZXM6IFtBRExpbmtdIFBDSS02MjA4IChhZGxfcGNpNjIwOCksIFBDSS02MjE2CiAgKiBBdXRob3I6IG5zeWVvdyA8bnN5ZW93QHBkLmphcmluZy5teT4KLSAqIFVwZGF0ZWQ6IEZyaSwgMzAgSmFuIDIwMDQgMTQ6NDQ6MjcgKzA4MDAKKyAqIFVwZGF0ZWQ6IFdlZCwgMTEgRmViIDIwMTUgMTE6Mzc6MTggKzAwMDAKICAqIFN0YXR1czogdW50ZXN0ZWQKICAqCiAgKiBDb25maWd1cmF0aW9uIE9wdGlvbnM6IG5vdCBhcHBsaWNhYmxlLCB1c2VzIFBDSSBhdXRvIGNvbmZpZworICoKKyAqIEFsbCBzdXBwb3J0ZWQgZGV2aWNlcyBzaGFyZSB0aGUgc2FtZSBQQ0kgZGV2aWNlIElEIGFuZCBhcmUgdHJlYXRlZCBhcyBhCisgKiBQQ0ktNjIxNiB3aXRoIDE2IGFuYWxvZyBvdXRwdXQgY2hhbm5lbHMuICBPbiBhIFBDSS02MjA4LCB0aGUgdXBwZXIgOAorICogY2hhbm5lbHMgZXhpc3QgaW4gcmVnaXN0ZXJzLCBidXQgZG9uJ3QgZ28gdG8gREFDIGNoaXBzLgogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAvKgogICogUENJLTYyMDgvNjIxNi1HTCByZWdpc3RlciBtYXAKQEAgLTQ1LDI3ICs0OCw2IEBACiAjZGVmaW5lIFBDSTYyMDhfRElPX0RJX01BU0sJCSgweGYwKQogI2RlZmluZSBQQ0k2MjA4X0RJT19ESV9TSElGVAkJKDQpCiAKLWVudW0gcGNpNjIwOF9ib2FyZGlkIHsKLQlCT0FSRF9QQ0k2MjA4LAotCUJPQVJEX1BDSTYyMTYsCi19OwotCi1zdHJ1Y3QgcGNpNjIwOF9ib2FyZCB7Ci0JY29uc3QgY2hhciAqbmFtZTsKLQlpbnQgYW9fY2hhbnM7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHBjaTYyMDhfYm9hcmQgcGNpNjIwOF9ib2FyZHNbXSA9IHsKLQlbQk9BUkRfUENJNjIwOF0gPSB7Ci0JCS5uYW1lCQk9ICJhZGxfcGNpNjIwOCIsCi0JCS5hb19jaGFucwk9IDgsCi0JfSwKLQlbQk9BUkRfUENJNjIxNl0gPSB7Ci0JCS5uYW1lCQk9ICJhZGxfcGNpNjIxNiIsCi0JCS5hb19jaGFucwk9IDE2LAotCX0sCi19OwotCiBzdGF0aWMgaW50IHBjaTYyMDhfYW9fZW9jKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCkBAIC0xMzYsMjEgKzExOCwxMyBAQAogfQogCiBzdGF0aWMgaW50IHBjaTYyMDhfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHQpCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29tZWRpX3RvX3BjaV9kZXYoZGV2KTsKLQljb25zdCBzdHJ1Y3QgcGNpNjIwOF9ib2FyZCAqYm9hcmRpbmZvID0gTlVMTDsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKIAl1bnNpZ25lZCBpbnQgdmFsOwogCWludCByZXQ7CiAKLQlpZiAoY29udGV4dCA8IEFSUkFZX1NJWkUocGNpNjIwOF9ib2FyZHMpKQotCQlib2FyZGluZm8gPSAmcGNpNjIwOF9ib2FyZHNbY29udGV4dF07Ci0JaWYgKCFib2FyZGluZm8pCi0JCXJldHVybiAtRU5PREVWOwotCWRldi0+Ym9hcmRfcHRyID0gYm9hcmRpbmZvOwotCWRldi0+Ym9hcmRfbmFtZSA9IGJvYXJkaW5mby0+bmFtZTsKLQogCXJldCA9IGNvbWVkaV9wY2lfZW5hYmxlKGRldik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTE2NCw3ICsxMzgsNyBAQAogCS8qIGFuYWxvZyBvdXRwdXQgc3ViZGV2aWNlICovCiAJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BTzsKIAlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfV1JJVEFCTEU7Ci0Jcy0+bl9jaGFuCT0gYm9hcmRpbmZvLT5hb19jaGFuczsKKwlzLT5uX2NoYW4JPSAxNjsJLyogT25seSA4IHVzYWJsZSBvbiBQQ0ktNjIwOCAqLwogCXMtPm1heGRhdGEJPSAweGZmZmY7CiAJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfYmlwb2xhcjEwOwogCXMtPmluc25fd3JpdGUJPSBwY2k2MjA4X2FvX2luc25fd3JpdGU7CkBAIC0yMTcsOCArMTkxLDkgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFkbF9wY2k2MjA4X3BjaV90YWJsZVtdID0gewotCXsgUENJX1ZERVZJQ0UoQURMSU5LLCAweDYyMDgpLCBCT0FSRF9QQ0k2MjA4IH0sCi0JeyBQQ0lfVkRFVklDRShBRExJTkssIDB4NjIxNiksIEJPQVJEX1BDSTYyMTYgfSwKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9BRExJTkssIDB4NjIwOCkgfSwKKwl7IFBDSV9ERVZJQ0VfU1VCKFBDSV9WRU5ET1JfSURfUExYLCBQQ0lfREVWSUNFX0lEX1BMWF85MDUwLAorCQkJIDB4OTk5OSwgMHg2MjA4KSB9LAogCXsgMCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGFkbF9wY2k2MjA4X3BjaV90YWJsZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTd4M3guYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpN3gzeC5jCmluZGV4IDYxOGU2NDEuLjkzNGFmM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpN3gzeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpN3gzeC5jCkBAIC01Myw5ICs1Myw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAvKgogICogUmVnaXN0ZXIgSS9PIG1hcCAoMzItYml0IGFjY2VzcyBvbmx5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k4MTY0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRsX3BjaTgxNjQuYwppbmRleCBjYzZjNTNiLi5kYTkwMWM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k4MTY0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k4MTY0LmMKQEAgLTI4LDkgKzI4LDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAjZGVmaW5lIFBDSTgxNjRfQVhJUyh4KQkJKCh4KSAqIDB4MDgpCiAjZGVmaW5lIFBDSTgxNjRfQ01EX01TVFNfUkVHCTB4MDAKQEAgLTY5LDcgKzY4LDcgQEAKIH0KIAogc3RhdGljIGludCBhZGxfcGNpODE2NF9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCisJCQkJICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29tZWRpX3RvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTExLmMKaW5kZXggZjY4ZGM5OS4uYzlkZjNhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTExLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTExLmMKQEAgLTY1LDE1ICs2NSwxMyBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICI4MjUzLmgiCiAjaW5jbHVkZSAicGx4OTA1Mi5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKICNkZWZpbmUgUENJOTExMV9GSUZPX0hBTEZfU0laRQk1MTIKIApAQCAtMTM3LDkgKzEzNSw2IEBACiAJdW5zaWduZWQgaW50IGNodW5rX2NvdW50ZXI7CiAJdW5zaWduZWQgaW50IGNodW5rX251bV9zYW1wbGVzOwogCi0JdW5zaWduZWQgaW50IGRpdjE7Ci0JdW5zaWduZWQgaW50IGRpdjI7Ci0KIAl1bnNpZ25lZCBzaG9ydCBhaV9ib3VuY2VfYnVmZmVyWzIgKiBQQ0k5MTExX0ZJRk9fSEFMRl9TSVpFXTsKIH07CiAKQEAgLTE2NywyMSArMTYyLDYgQEAKIAlvdXRiKGZsYWdzLCBpb19iYXNlICsgUExYOTA1Ml9JTlRDU1IpOwogfQogCi1zdGF0aWMgdm9pZCBwY2k5MTExX3RpbWVyX3NldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBwY2k5MTExX3ByaXZhdGVfZGF0YSAqZGV2X3ByaXZhdGUgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBQQ0k5MTExXzgyNTRfQkFTRV9SRUc7Ci0KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAxLCAwLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMSwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDEsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQotCXVkZWxheSgxKTsKLQotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDEsIDIsIGRldl9wcml2YXRlLT5kaXYyKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAxLCAxLCBkZXZfcHJpdmF0ZS0+ZGl2MSk7Ci19Ci0KIGVudW0gcGNpOTExMV9JU0MwX3NvdXJjZXMgewogCWlycV9vbl9lb2MsCiAJaXJxX29uX2ZpZm9faGFsZl9mdWxsCkBAIC0yODEsMTkgKzI2MSwxOCBAQAogCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewotCXN0cnVjdCBwY2k5MTExX3ByaXZhdGVfZGF0YSAqZGV2X3ByaXZhdGUgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7CiAJdW5zaWduZWQgaW50IGFyZzsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCiAJCQkJCVRSSUdfVElNRVIgfCBUUklHX0ZPTExPVyB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCiAJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsCiAJCQkJCVRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKQEAgLTMwMSw5ICsyODAsOSBAQAogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMzE3LDI2ICsyOTYsMjkgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAogCQkJCQlQQ0k5MTExX0FJX0FDUVVJU0lUSU9OX1BFUklPRF9NSU5fTlMpOwotCWVsc2UJLyogVFJJR19FWFQgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJfSBlbHNlIHsJLyogVFJJR19FWFQgKi8KKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJfQogCi0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKIAkJCQkJUENJOTExMV9BSV9BQ1FVSVNJVElPTl9QRVJJT0RfTUlOX05TKTsKLQllbHNlCS8qIFRSSUdfRk9MTE9XIHx8IFRSSUdfRVhUICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCX0gZWxzZSB7CS8qIFRSSUdfRk9MTE9XIHx8IFRSSUdfRVhUICovCisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtMzQ1LDExICszMjcsOCBAQAogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzJNSFosCi0JCQkJCSAgJmRldl9wcml2YXRlLT5kaXYxLAotCQkJCQkgICZkZXZfcHJpdmF0ZS0+ZGl2MiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAl9CiAKIAkvKgpAQCAtMzYyLDcgKzM0MSw3IEBACiAJCWlmIChhcmcgPCBjbWQtPnNjYW5fYmVnaW5fYXJnKQogCQkJYXJnICo9IChjbWQtPnNjYW5fYmVnaW5fYXJnIC8gYXJnKTsKIAotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCkBAIC0zNzYsNyArMzU1LDYgQEAKIAkJcmV0dXJuIDU7CiAKIAlyZXR1cm4gMDsKLQogfQogCiBzdGF0aWMgaW50IHBjaTkxMTFfYWlfZG9fY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC00MDAsMTMgKzM3OCwxNCBAQAogCS8qICBUaGlzIGlzIHRoZSBzYW1lIGdhaW4gb24gZXZlcnkgY2hhbm5lbCAqLwogCiAJb3V0YihDUl9SQU5HRShjbWQtPmNoYW5saXN0WzBdKSAmIFBDSTkxMTFfQUlfUkFOR0VfTUFTSywKLQkJZGV2LT5pb2Jhc2UgKyBQQ0k5MTExX0FJX1JBTkdFX1NUQVRfUkVHKTsKKwkgICAgIGRldi0+aW9iYXNlICsgUENJOTExMV9BSV9SQU5HRV9TVEFUX1JFRyk7CiAKIAkvKiAgU2V0IHRpbWVyIHBhY2VyICovCiAJZGV2X3ByaXZhdGUtPnNjYW5fZGVsYXkgPSAwOwogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJdHJpZyB8PSBQQ0k5MTExX0FJX1RSSUdfQ1RSTF9UUFNUOwotCQlwY2k5MTExX3RpbWVyX3NldChkZXYpOworCQljb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMoZGV2LT5wYWNlcik7CisJCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCB0cnVlKTsKIAkJcGNpOTExMV9maWZvX3Jlc2V0KGRldik7CiAJCXBjaTkxMTFfaW50ZXJydXB0X3NvdXJjZV9zZXQoZGV2LCBpcnFfb25fZmlmb19oYWxmX2Z1bGwsCiAJCQkJCSAgICAgaXJxX29uX3RpbWVyX3RpY2spOwpAQCAtNTkzLDcgKzU3Miw3IEBACiAJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgUENJOTExMV9BSV9SQU5HRV9TVEFUX1JFRyk7CiAJaWYgKChzdGF0dXMgJiBQQ0k5MTExX0FJX1JBTkdFX01BU0spICE9IHJhbmdlKSB7CiAJCW91dGIocmFuZ2UgJiBQQ0k5MTExX0FJX1JBTkdFX01BU0ssCi0JCQlkZXYtPmlvYmFzZSArIFBDSTkxMTFfQUlfUkFOR0VfU1RBVF9SRUcpOworCQkgICAgIGRldi0+aW9iYXNlICsgUENJOTExMV9BSV9SQU5HRV9TVEFUX1JFRyk7CiAJfQogCiAJcGNpOTExMV9maWZvX3Jlc2V0KGRldik7CkBAIC02NjcsMTYgKzY0NiwxMSBAQAogCS8qIGRpc2FibGUgQS9EIHRyaWdnZXJzIChzb2Z0d2FyZSB0cmlnZ2VyIG1vZGUpIGFuZCBhdXRvIHNjYW4gb2ZmICovCiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTkxMTFfQUlfVFJJR19DVFJMX1JFRyk7CiAKLQkvKiBSZXNldCA4MjU0IGNoaXAgKi8KLQlkZXZfcHJpdmF0ZS0+ZGl2MSA9IDA7Ci0JZGV2X3ByaXZhdGUtPmRpdjIgPSAwOwotCXBjaTkxMTFfdGltZXJfc2V0KGRldik7Ci0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwY2k5MTExX2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7CiAJc3RydWN0IHBjaTkxMTFfcHJpdmF0ZV9kYXRhICpkZXZfcHJpdmF0ZTsKQEAgLTcwMiw2ICs2NzYsMTEgQEAKIAkJCWRldi0+aXJxID0gcGNpZGV2LT5pcnE7CiAJfQogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBQQ0k5MTExXzgyNTRfQkFTRV9SRUcsCisJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfMk1IWiwgSTgyNTRfSU8xNiwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZGxfcGNpOTExOC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKaW5kZXggZjYxZTM5Mi4uZmIzMDQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkbF9wY2k5MTE4LmMKQEAgLTczLDE3ICs3MywxNSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNpbmNsdWRlICJhbWNjX3M1OTMzLmgiCi0jaW5jbHVkZSAiODI1My5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKICNkZWZpbmUgSU9SQU5HRV85MTE4CTY0CS8qIEkgaG9wZSAqLwogI2RlZmluZSBQQ0k5MTE4X0NIQU5MRU4JMjU1CS8qCkBAIC05NCw4ICs5Miw3IEBACiAvKgogICogUENJIEJBUjIgUmVnaXN0ZXIgbWFwIChkZXYtPmlvYmFzZSkKICAqLwotI2RlZmluZSBQQ0k5MTE4X1RJTUVSX1JFRyh4KQkJKDB4MDAgKyAoKHgpICogNCkpCi0jZGVmaW5lIFBDSTkxMThfVElNRVJfQ1RSTF9SRUcJCTB4MGMKKyNkZWZpbmUgUENJOTExOF9USU1FUl9CQVNFCQkweDAwCiAjZGVmaW5lIFBDSTkxMThfQUlfRklGT19SRUcJCTB4MTAKICNkZWZpbmUgUENJOTExOF9BT19SRUcoeCkJCSgweDEwICsgKCh4KSAqIDQpKQogI2RlZmluZSBQQ0k5MTE4X0FJX1NUQVRVU19SRUcJCTB4MTgKQEAgLTIzOSwxMCArMjM2LDYgQEAKIAkJCQkJICogbWVhc3VyZSBjYW4gc3RhcnQvc3RvcAogCQkJCQkgKiBvbiBleHRlcm5hbCB0cmlnZ2VyCiAJCQkJCSAqLwotCXVuc2lnbmVkIGludCBhaV9kaXZpc29yMSwgYWlfZGl2aXNvcjI7CS8qCi0JCQkJCQkgKiBkaXZpc29ycyBmb3Igc3RhcnQgb2YgbWVhc3VyZQotCQkJCQkJICogb24gZXh0ZXJuYWwgc3RhcnQKLQkJCQkJCSAqLwogCXVuc2lnbmVkIGludCBkbWFfYWN0YnVmOwkJLyogd2hpY2ggYnVmZmVyIGlzIHVzZWQgbm93ICovCiAJc3RydWN0IHBjaTkxMThfZG1hYnVmIGRtYWJ1ZlsyXTsKIAlpbnQgc29mdHNzaGRlbGF5OwkJLyoKQEAgLTI5NywyNCArMjkwLDYgQEAKIAlvdXRsKGludGNzciwgZGV2cHJpdi0+aW9iYXNlX2EgKyBBTUNDX09QX1JFR19JTlRDU1IpOwogfQogCi1zdGF0aWMgdm9pZCBwY2k5MTE4X3RpbWVyX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJdW5zaWduZWQgaW50IHRpbWVyLCB1bnNpZ25lZCBpbnQgdmFsKQotewotCW91dGwodmFsICYgMHhmZiwgZGV2LT5pb2Jhc2UgKyBQQ0k5MTE4X1RJTUVSX1JFRyh0aW1lcikpOwotCW91dGwoKHZhbCA+PiA4KSAmIDB4ZmYsIGRldi0+aW9iYXNlICsgUENJOTExOF9USU1FUl9SRUcodGltZXIpKTsKLX0KLQotc3RhdGljIHZvaWQgcGNpOTExOF90aW1lcl9zZXRfbW9kZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgIHVuc2lnbmVkIGludCB0aW1lciwgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JdW5zaWduZWQgaW50IHZhbDsKLQotCXZhbCA9IHRpbWVyIDw8IDY7CS8qIHNlbGVjdCB0aW1lciAqLwotCXZhbCB8PSAweDMwOwkJLyogbG9hZCBsb3cgdGhlbiBoaWdoIGJ5dGUgKi8KLQl2YWwgfD0gbW9kZTsJCS8qIHNldCB0aW1lciBtb2RlIGFuZCBCQ0R8YmluYXJ5ICovCi0Jb3V0bCh2YWwsIGRldi0+aW9iYXNlICsgUENJOTExOF9USU1FUl9DVFJMX1JFRyk7Ci19Ci0KIHN0YXRpYyB2b2lkIHBjaTkxMThfYWlfcmVzZXRfZmlmbyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCS8qIHdyaXRpbmcgYW55IHZhbHVlIHJlc2V0cyB0aGUgQS9EIEZJRk8gKi8KQEAgLTQ0MCw4ICs0MTUsOCBAQAogCWRldnByaXYtPmFpX2NmZyA9IFBDSTkxMThfQUlfQ0ZHX1BEVFJHIHwgUENJOTExOF9BSV9DRkdfUEVUUkcgfAogCQkJICBQQ0k5MTE4X0FJX0NGR19BTTsKIAlvdXRsKGRldnByaXYtPmFpX2NmZywgZGV2LT5pb2Jhc2UgKyBQQ0k5MTE4X0FJX0NGR19SRUcpOwotCXBjaTkxMThfdGltZXJfc2V0X21vZGUoZGV2LCAwLCBJODI1NF9NT0RFMCk7Ci0JcGNpOTExOF90aW1lcl93cml0ZShkZXYsIDAsIGRtYWJ1Zi0+aHcgPj4gMSk7CisJY29tZWRpXzgyNTRfbG9hZChkZXYtPnBhY2VyLCAwLCBkbWFidWYtPmh3ID4+IDEsCisJCQkgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwogCWRldnByaXYtPmFpX2NmZyB8PSBQQ0k5MTE4X0FJX0NGR19TVEFSVDsKIAlvdXRsKGRldnByaXYtPmFpX2NmZywgZGV2LT5pb2Jhc2UgKyBQQ0k5MTE4X0FJX0NGR19SRUcpOwogfQpAQCAtNTc3LDE1ICs1NTIsMTYgQEAKIAkJCQkgIHVuc2lnbmVkIGludCAqZGl2MSwgdW5zaWduZWQgaW50ICpkaXYyLAogCQkJCSAgdW5zaWduZWQgaW50IGNobnNzaGZyb250KQogeworCXN0cnVjdCBjb21lZGlfODI1NCAqcGFjZXIgPSBkZXYtPnBhY2VyOwogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKIAotCSpkaXYxID0gKnRpbTIgLyBJODI1NF9PU0NfQkFTRV80TUhaOwkvKiBjb252ZXJ0IHRpbWVyIChidXJzdCkgKi8KLQkqZGl2MiA9ICp0aW0xIC8gSTgyNTRfT1NDX0JBU0VfNE1IWjsJLyogc2NhbiB0aW1lciAqLworCSpkaXYxID0gKnRpbTIgLyBwYWNlci0+b3NjX2Jhc2U7CS8qIGNvbnZlcnQgdGltZXIgKGJ1cnN0KSAqLworCSpkaXYyID0gKnRpbTEgLyBwYWNlci0+b3NjX2Jhc2U7CS8qIHNjYW4gdGltZXIgKi8KIAkqZGl2MiA9ICpkaXYyIC8gKmRpdjE7CQkJLyogbWFqb3IgdGltZXIgaXMgYzEqYzIgKi8KIAlpZiAoKmRpdjIgPCBjaGFucykKIAkJKmRpdjIgPSBjaGFuczsKIAotCSp0aW0yID0gKmRpdjEgKiBJODI1NF9PU0NfQkFTRV80TUhaOwkvKiByZWFsIGNvbnZlcnQgdGltZXIgKi8KKwkqdGltMiA9ICpkaXYxICogcGFjZXItPm9zY19iYXNlOwkvKiByZWFsIGNvbnZlcnQgdGltZXIgKi8KIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfTk9XICYmICFjaG5zc2hmcm9udCkgewogCQkvKiB1c2UgQlNTSCBzaWduYWwgKi8KQEAgLTU5MywyMSArNTY5LDEzIEBACiAJCQkqZGl2MiA9IGNoYW5zICsgMjsKIAl9CiAKLQkqdGltMSA9ICpkaXYxICogKmRpdjIgKiBJODI1NF9PU0NfQkFTRV80TUhaOworCSp0aW0xID0gKmRpdjEgKiAqZGl2MiAqIHBhY2VyLT5vc2NfYmFzZTsKIH0KIAogc3RhdGljIHZvaWQgcGNpOTExOF9zdGFydF9wYWNlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBpbnQgbW9kZSkKIHsKLQlzdHJ1Y3QgcGNpOTExOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCi0JcGNpOTExOF90aW1lcl9zZXRfbW9kZShkZXYsIDEsIEk4MjU0X01PREUyKTsKLQlwY2k5MTE4X3RpbWVyX3NldF9tb2RlKGRldiwgMiwgSTgyNTRfTU9ERTIpOwotCXVkZWxheSgxKTsKLQotCWlmICgobW9kZSA9PSAxKSB8fCAobW9kZSA9PSAyKSB8fCAobW9kZSA9PSA0KSkgewotCQlwY2k5MTE4X3RpbWVyX3dyaXRlKGRldiwgMiwgZGV2cHJpdi0+YWlfZGl2aXNvcjIpOwotCQlwY2k5MTE4X3RpbWVyX3dyaXRlKGRldiwgMSwgZGV2cHJpdi0+YWlfZGl2aXNvcjEpOwotCX0KKwlpZiAobW9kZSA9PSAxIHx8IG1vZGUgPT0gMiB8fCBtb2RlID09IDQpCisJCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCB0cnVlKTsKIH0KIAogc3RhdGljIGludCBwY2k5MTE4X2FpX2NhbmNlbChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtNjE4LDcgKzU4Niw3IEBACiAJaWYgKGRldnByaXYtPnVzZWRtYSkKIAkJcGNpOTExOF9hbWNjX2RtYV9lbmEoZGV2LCBmYWxzZSk7CiAJcGNpOTExOF9leHR0cmdfZW5hYmxlKGRldiwgZmFsc2UpOwotCXBjaTkxMThfc3RhcnRfcGFjZXIoZGV2LCAwKTsJLyogc3RvcCA4MjU0IGNvdW50ZXJzICovCisJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIGZhbHNlKTsKIAkvKiBzZXQgZGVmYXVsdCBjb25maWcgKGRpc2FibGUgYnVyc3QgYW5kIHRyaWdnZXJzKSAqLwogCWRldnByaXYtPmFpX2NmZyA9IFBDSTkxMThfQUlfQ0ZHX1BEVFJHIHwgUENJOTExOF9BSV9DRkdfUEVUUkc7CiAJb3V0bChkZXZwcml2LT5haV9jZmcsIGRldi0+aW9iYXNlICsgUENJOTExOF9BSV9DRkdfUkVHKTsKQEAgLTY2Myw3ICs2MzEsNiBAQAogCQkJYXJyYXlbaV0gXj0gMHg4MDAwOwogCQllbHNlCiAJCQlhcnJheVtpXSA9IChhcnJheVtpXSA+PiA0KSAmIDB4MGZmZjsKLQogCX0KIH0KIApAQCAtOTY2LDcgKzkzMyw3IEBACiAvKiBvdXRsKDB4MDIwMDAwMDB8QUlOVF9XUklURV9DT01QTCwgZGV2cHJpdi0+aW9iYXNlX2ErQU1DQ19PUF9SRUdfSU5UQ1NSKTsgKi8KIAlwY2k5MTE4X2FtY2NfZG1hX2VuYShkZXYsIHRydWUpOwogCW91dGwoaW5sKGRldnByaXYtPmlvYmFzZV9hICsgQU1DQ19PUF9SRUdfSU5UQ1NSKSB8IEVOX0EyUF9UUkFOU0ZFUlMsCi0JCQlkZXZwcml2LT5pb2Jhc2VfYSArIEFNQ0NfT1BfUkVHX0lOVENTUik7CisJICAgICBkZXZwcml2LT5pb2Jhc2VfYSArIEFNQ0NfT1BfUkVHX0lOVENTUik7CiAJCQkJCQkvKiBhbGxvdyBidXMgbWFzdGVyaW5nICovCiAKIAlyZXR1cm4gMDsKQEAgLTk3NSw2ICs5NDIsNyBAQAogc3RhdGljIGludCBwY2k5MTE4X2FpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgcGNpOTExOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfODI1NCAqcGFjZXIgPSBkZXYtPnBhY2VyOwogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmcy0+YXN5bmMtPmNtZDsKIAl1bnNpZ25lZCBpbnQgYWRkY2hhbnMgPSAwOwogCkBAIC0xMDkzLDEyICsxMDYxLDEwIEBACiAJCWVsc2UKIAkJCWRldnByaXYtPmFpX2RvID0gMTsKIAotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzRNSFosCi0JCQkJCSAgJmRldnByaXYtPmFpX2Rpdmlzb3IxLAotCQkJCQkgICZkZXZwcml2LT5haV9kaXZpc29yMiwKLQkJCQkJICAmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJICBkZXZwcml2LT5haV9mbGFncyAmCi0JCQkJCSAgQ01ERl9ST1VORF9ORUFSRVNUKTsKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihwYWNlciwgJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQlkZXZwcml2LT5haV9mbGFncyAmCisJCQkJCQlDTURGX1JPVU5EX05FQVJFU1QpOworCQljb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMocGFjZXIpOwogCiAJCWRldnByaXYtPmFpX2N0cmwgfD0gUENJOTExOF9BSV9DVFJMX1RNUlRSOwogCkBAIC0xMTEyLDggKzEwNzgsOCBAQAogCiAJCQlkZXZwcml2LT5haV9jZmcgfD0gUENJOTExOF9BSV9DRkdfQU07CiAJCQlvdXRsKGRldnByaXYtPmFpX2NmZywgZGV2LT5pb2Jhc2UgKyBQQ0k5MTE4X0FJX0NGR19SRUcpOwotCQkJcGNpOTExOF90aW1lcl9zZXRfbW9kZShkZXYsIDAsIEk4MjU0X01PREUwKTsKLQkJCXBjaTkxMThfdGltZXJfd3JpdGUoZGV2LCAwLCBkbWFidWYtPmh3ID4+IDEpOworCQkJY29tZWRpXzgyNTRfbG9hZChwYWNlciwgMCwgZG1hYnVmLT5odyA+PiAxLAorCQkJCQkgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwogCQkJZGV2cHJpdi0+YWlfY2ZnIHw9IFBDSTkxMThfQUlfQ0ZHX1NUQVJUOwogCQl9CiAJfQpAQCAtMTEzMyw4ICsxMDk5LDggQEAKIAkJCQkgICAgICAmY21kLT5zY2FuX2JlZ2luX2FyZywgJmNtZC0+Y29udmVydF9hcmcsCiAJCQkJICAgICAgZGV2cHJpdi0+YWlfZmxhZ3MsCiAJCQkJICAgICAgZGV2cHJpdi0+YWlfbl9yZWFsc2NhbmxlbiwKLQkJCQkgICAgICAmZGV2cHJpdi0+YWlfZGl2aXNvcjEsCi0JCQkJICAgICAgJmRldnByaXYtPmFpX2Rpdmlzb3IyLAorCQkJCSAgICAgICZwYWNlci0+ZGl2aXNvcjEsCisJCQkJICAgICAgJnBhY2VyLT5kaXZpc29yMiwKIAkJCQkgICAgICBkZXZwcml2LT5haV9hZGRfZnJvbnQpOwogCiAJCWRldnByaXYtPmFpX2N0cmwgfD0gUENJOTExOF9BSV9DVFJMX1RNUlRSOwpAQCAtMTE2Miw4ICsxMTI4LDYgQEAKIAlpZiAoZGV2cHJpdi0+dXNlZG1hKQogCQlkZXZwcml2LT5haV9jdHJsIHw9IFBDSTkxMThfQUlfQ1RSTF9ETUE7CiAKLQlwY2k5MTE4X3N0YXJ0X3BhY2VyKGRldiwgLTEpOwkvKiBzdG9wIHBhY2VyICovCi0KIAkvKiBzZXQgZGVmYXVsdCBjb25maWcgKGRpc2FibGUgYnVyc3QgYW5kIHRyaWdnZXJzKSAqLwogCWRldnByaXYtPmFpX2NmZyA9IFBDSTkxMThfQUlfQ0ZHX1BEVFJHIHwgUENJOTExOF9BSV9DRkdfUEVUUkc7CiAJb3V0bChkZXZwcml2LT5haV9jZmcsIGRldi0+aW9iYXNlICsgUENJOTExOF9BSV9DRkdfUkVHKTsKQEAgLTEyMDYsMjUgKzExNzAsMjQgQEAKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJdW5zaWduZWQgaW50IGFyZzsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjEgPSAwLCBkaXZpc29yMiA9IDA7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywKIAkJCQkJVFJJR19OT1cgfCBUUklHX0VYVCB8IFRSSUdfSU5UKTsKIAogCWZsYWdzID0gVFJJR19GT0xMT1c7CiAJaWYgKGRldnByaXYtPm1hc3RlcikKIAkJZmxhZ3MgfD0gVFJJR19USU1FUiB8IFRSSUdfRVhUOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIGZsYWdzKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBmbGFncyk7CiAKIAlmbGFncyA9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKIAlpZiAoZGV2cHJpdi0+bWFzdGVyKQogCQlmbGFncyB8PSBUUklHX05PVzsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBmbGFncyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgZmxhZ3MpOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsCiAJCQkJCVRSSUdfQ09VTlQgfCBUUklHX05PTkUgfCBUUklHX0VYVCk7CiAKIAlpZiAoZXJyKQpAQCAtMTIzMiwxMCArMTE5NSwxMCBAQAogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMTI2NCw3ICsxMjI3LDcgQEAKIAlzd2l0Y2ggKGNtZC0+c3RhcnRfc3JjKSB7CiAJY2FzZSBUUklHX05PVzoKIAljYXNlIFRSSUdfRVhUOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklHX0lOVDoKIAkJLyogc3RhcnRfYXJnIGlzIHRoZSBpbnRlcm5hbCB0cmlnZ2VyIChhbnkgdmFsdWUpICovCkBAIC0xMjcyLDcgKzEyMzUsNyBAQAogCX0KIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjICYgKFRSSUdfRk9MTE9XIHwgVFJJR19FWFQpKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKIAlpZiAoKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgJiYKIAkgICAgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgJiYgKGNtZC0+c2Nhbl9lbmRfYXJnID09IDEpKSB7CkBAIC0xMjgxLDM0ICsxMjQ0LDM3IEBACiAJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSAwOwogCX0KIAotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIGRldnByaXYtPmFpX25zX21pbik7CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICBkZXZwcml2LT5haV9uc19taW4pOworCX0KIAotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUKQorCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRVhUKSB7CiAJCWlmIChjbWQtPnNjYW5fYmVnaW5fYXJnKSB7CiAJCQljbWQtPnNjYW5fYmVnaW5fYXJnID0gMDsKIAkJCWVyciB8PSAtRUlOVkFMOwotCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9lbmRfYXJnLAotCQkJCQkJCSA2NTUzNSk7CisJCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCQkJICAgIDY1NTM1KTsKIAkJfQorCX0KIAotCWlmIChjbWQtPmNvbnZlcnRfc3JjICYgKFRSSUdfVElNRVIgfCBUUklHX05PVykpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJIGRldnByaXYtPmFpX25zX21pbik7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgJiAoVFJJR19USU1FUiB8IFRSSUdfTk9XKSkgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICBkZXZwcml2LT5haV9uc19taW4pOworCX0KIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2VuZF9hcmcsCi0JCQkJCSBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKChjbWQtPnNjYW5fZW5kX2FyZyAlIGNtZC0+Y2hhbmxpc3RfbGVuKSkgewogCQljbWQtPnNjYW5fZW5kX2FyZyA9CkBAIC0xMzIzLDE4ICsxMjg5LDE0IEBACiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfNE1IWiwKLQkJCQkJICAmZGl2aXNvcjEsICZkaXZpc29yMiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyAmIChUUklHX1RJTUVSIHwgVFJJR19OT1cpKSB7CiAJCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfNE1IWiwKLQkJCQkJICAmZGl2aXNvcjEsICZkaXZpc29yMiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAogCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSICYmCiAJCSAgICBjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfTk9XKSB7CkBAIC0xMzQ0LDggKzEzMDYsOSBAQAogCQkJfSBlbHNlIHsKIAkJCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnICogY21kLT5jaGFubGlzdF9sZW47CiAJCQl9Ci0JCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCQkgYXJnKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPgorCQkJCQkJCSAgICBzY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICAgYXJnKTsKIAkJfQogCX0KIApAQCAtMTQ4MiwxMCArMTQ0NSw2IEBACiAJaW5sKGRldi0+aW9iYXNlICsgUENJOTExOF9JTlRfQ1RSTF9SRUcpOwogCWlubChkZXYtPmlvYmFzZSArIFBDSTkxMThfQUlfU1RBVFVTX1JFRyk7CiAKLQkvKiByZXNldCBhbmQgc3RvcCBjb3VudGVycyAqLwotCXBjaTkxMThfdGltZXJfc2V0X21vZGUoZGV2LCAwLCBJODI1NF9NT0RFMCk7Ci0JcGNpOTExOF9zdGFydF9wYWNlcihkZXYsIDApOwotCiAJLyogcmVzZXQgRE1BIGFuZCBzY2FuIHF1ZXVlICovCiAJb3V0bCgwLCBkZXYtPmlvYmFzZSArIFBDSTkxMThfQUlfQlVSU1RfTlVNX1JFRyk7CiAJb3V0bCgxLCBkZXYtPmlvYmFzZSArIFBDSTkxMThfQUlfQVVUT1NDQU5fTU9ERV9SRUcpOwpAQCAtMTU5MCw2ICsxNTQ5LDExIEBACiAJZGV2cHJpdi0+aW9iYXNlX2EgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKIAlkZXYtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDIpOwogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBQQ0k5MTE4X1RJTUVSX0JBU0UsCisJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfNE1IWiwgSTgyNTRfSU8zMiwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXBjaTkxMThfcmVzZXQoZGV2KTsKIAogCWlmIChwY2lkZXYtPmlycSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkcTEyYi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FkcTEyYi5jCmluZGV4IDhiMTVjYmUuLmJjNWY5N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHExMmIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWRxMTJiLmMKQEAgLTY5LDggKzY5LDYgQEAKIAogICAgMTMtb2N0LTIwMDcKICAgICAgKyBmaXJzdCB0cnkKLQotCiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0xNzAsNyArMTY4LDYgQEAKIAkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQogCS8qIG9ubHkgYml0cyAwLTQgaGF2ZSBpbmZvcm1hdGlvbiBhYm91dCBkaWdpdGFsIGlucHV0cyAqLwogCWRhdGFbMV0gPSAoaW5iKGRldi0+aW9iYXNlICsgQURRMTJCX1NUSU5SKSAmIEFEUTEyQl9TVElOUl9JTl9NQVNLKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzEwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYwppbmRleCAzZjcyNDUxLi4wYzZhYTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MTAuYwpAQCAtNCw3ICs0LDcgQEAKICAqIEF1dGhvcjogTWljaGFsIERvYmVzIDxkb2Jlc0B0ZXNuZXQuY3o+CiAgKgogICogVGhhbmtzIHRvIFpoZW5HYW5nIFNoYW5nIDxaaGVuR2FuZy5TaGFuZ0BBZHZhbnRlY2guY29tLmNuPgotICogZm9yIHRlc3RpbmcgYW5kIGluZm9ybWF0aW9ucy4KKyAqIGZvciB0ZXN0aW5nIGFuZCBpbmZvcm1hdGlvbi4KICAqCiAgKiAgaGFyZHdhcmUgZHJpdmVyIGZvciBBZHZhbnRlY2ggY2FyZHM6CiAgKiAgIGNhcmQ6ICAgUENJLTE3MTAsIFBDSS0xNzEwSEcsIFBDSS0xNzExLCBQQ0ktMTcxMywgUENJLTE3MjAsIFBDSS0xNzMxCkBAIC00MiwxMyArNDIsMTEgQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotI2luY2x1ZGUgIjgyNTMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogI2luY2x1ZGUgImFtY2NfczU5MzMuaCIKIAogI2RlZmluZSBQQ0kxNzF4X0FEX0RBVEEJIDAJLyogUjogICBBL0QgZGF0YSAqLwpAQCAtNjcsMTEgKzY1LDYgQEAKIAogI2RlZmluZSBQQ0kxNzFYX1RJTUVSX0JBU0UJMHgxOAogCi0jZGVmaW5lIFBDSTE3MXhfQ05UMAkyNAkvKiBSL1c6IDgyNTQgY291bnRlciAwICovCi0jZGVmaW5lIFBDSTE3MXhfQ05UMQkyNgkvKiBSL1c6IDgyNTQgY291bnRlciAxICovCi0jZGVmaW5lIFBDSTE3MXhfQ05UMgkyOAkvKiBSL1c6IDgyNTQgY291bnRlciAyICovCi0jZGVmaW5lIFBDSTE3MXhfQ05UQ1RSTAkzMAkvKiBXOiAgIDgyNTQgY291bnRlciBjb250cm9sICovCi0KIC8qIHVwcGVyIGJpdHMgZnJvbSBzdGF0dXMgcmVnaXN0ZXIgKFBDSTE3MXhfU1RBVFVTKSAobG93ZXIgaXMgc2FtZSB3aXRoIGNvbnRyb2wKICAqIHJlZykgKi8KICNkZWZpbmUJU3RhdHVzX0ZFCTB4MDEwMAkvKiAxPUZJRk8gaXMgZW1wdHkgKi8KQEAgLTg3LDE2ICs4MCw2IEBACiAjZGVmaW5lIENvbnRyb2xfRVhUCTB4MDAwNAkvKiAxPWV4dGVybmFsIHRyaWdnZXIgc291cmNlICovCiAjZGVmaW5lIENvbnRyb2xfUEFDRVIJMHgwMDAyCS8qIDE9ZW5hYmxlIGludGVybmFsIDgyNTQgdHJpZ2dlciBzb3VyY2UgKi8KICNkZWZpbmUgQ29udHJvbF9TVwkweDAwMDEJLyogMT1lbmFibGUgc29mdHdhcmUgdHJpZ2dlciBzb3VyY2UgKi8KLS8qIGJpdHMgZnJvbSBjb3VudGVyIGNvbnRyb2wgcmVnaXN0ZXIgKFBDSTE3MXhfQ05UQ1RSTCkgKi8KLSNkZWZpbmUgQ291bnRlcl9CQ0QgICAgIDB4MDAwMQkvKiAwID0gYmluYXJ5IGNvdW50ZXIsIDEgPSBCQ0QgY291bnRlciAqLwotI2RlZmluZSBDb3VudGVyX00wICAgICAgMHgwMDAyCS8qIE0wLU0yIHNlbGVjdCBtb2RlcyAwLTUgKi8KLSNkZWZpbmUgQ291bnRlcl9NMSAgICAgIDB4MDAwNAkvKiAwMDAgPSBtb2RlIDAsIDAxMCA9IG1vZGUgMiAuLi4gKi8KLSNkZWZpbmUgQ291bnRlcl9NMiAgICAgIDB4MDAwOAotI2RlZmluZSBDb3VudGVyX1JXMCAgICAgMHgwMDEwCS8qIFJXMC9SVzEgc2VsZWN0IHJlYWQvd3JpdGUgbW9kZSAqLwotI2RlZmluZSBDb3VudGVyX1JXMSAgICAgMHgwMDIwCi0jZGVmaW5lIENvdW50ZXJfU0MwICAgICAweDAwNDAJLyogU2VsZWN0IENvdW50ZXIuIE9ubHkgMDAgb3IgMTEgbWF5ICovCi0jZGVmaW5lIENvdW50ZXJfU0MxICAgICAweDAwODAJLyogYmUgdXNlZCwgMDAgZm9yIENOVDAsCi0JCQkJICogMTEgZm9yIHJlYWQtYmFjayBjb21tYW5kICovCiAKICNkZWZpbmUgUENJMTcyMF9EQTAJIDAJLyogVzogICBEL0EgcmVnaXN0ZXIgMCAqLwogI2RlZmluZSBQQ0kxNzIwX0RBMQkgMgkvKiBXOiAgIEQvQSByZWdpc3RlciAxICovCkBAIC0yNjUsMTUgKzI0OCw5IEBACiAJdW5zaWduZWQgY2hhciBhaV9ldDsKIAl1bnNpZ25lZCBpbnQgYWlfZXRfQ250cmxSZWc7CiAJdW5zaWduZWQgaW50IGFpX2V0X011eFZhbDsKLQl1bnNpZ25lZCBpbnQgbmV4dF9kaXZpc29yMTsKLQl1bnNpZ25lZCBpbnQgbmV4dF9kaXZpc29yMjsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjE7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IyOwogCXVuc2lnbmVkIGludCBhY3RfY2hhbmxpc3RbMzJdOwkvKiAgbGlzdCBvZiBzY2FubmVkIGNoYW5uZWwgKi8KIAl1bnNpZ25lZCBjaGFyIHNhdmVkX3NlZ2xlbjsJLyogbGVuIG9mIHRoZSBub24tcmVwZWF0aW5nIGNoYW5saXN0ICovCiAJdW5zaWduZWQgY2hhciBkYV9yYW5nZXM7CS8qICBjb3B5IG9mIEQvQSBvdXRwaXQgcmFuZ2UgcmVnaXN0ZXIgKi8KLQl1bnNpZ25lZCBpbnQgY250MF93cml0ZV93YWl0OwkvKiBhZnRlciBhIHdyaXRlLCB3YWl0IGZvciB1cGRhdGUgb2YgdGhlCi0JCQkJCSAqIGludGVybmFsIHN0YXRlICovCiB9OwogCiBzdGF0aWMgaW50IHBjaTE3MXhfYWlfY2hlY2tfY2hhbmxpc3Qoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKQEAgLTUwOCwxMDUgKzQ4NSw2IEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKLXN0YXRpYyB2b2lkIHBjaTE3MXhfc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQlib29sIGxvYWRfY291bnRlcnMpCi17Ci0Jc3RydWN0IHBjaTE3MTBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDSTE3MVhfVElNRVJfQkFTRTsKLQotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDEsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAxLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0KLQlpZiAobG9hZF9jb3VudGVycykgewotCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAxLCAyLCBkZXZwcml2LT5kaXZpc29yMik7Ci0JCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDEsIDEsIGRldnByaXYtPmRpdmlzb3IxKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgcGNpMTcxeF9jb3VudGVyX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JdW5zaWduZWQgaW50IG1zYiwgbHNiLCBjY250cmw7Ci0JaW50IGk7Ci0KLQljY250cmwgPSAweEQyOwkJLyogY291bnQgb25seSAqLwotCWZvciAoaSA9IDA7IGkgPCBpbnNuLT5uOyBpKyspIHsKLQkJb3V0dyhjY250cmwsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DTlRDVFJMKTsKLQotCQlsc2IgPSBpbncoZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NOVDApICYgMHhGRjsKLQkJbXNiID0gaW53KGRldi0+aW9iYXNlICsgUENJMTcxeF9DTlQwKSAmIDB4RkY7Ci0KLQkJZGF0YVswXSA9IGxzYiB8IChtc2IgPDwgOCk7Ci0JfQotCi0JcmV0dXJuIGluc24tPm47Ci19Ci0KLXN0YXRpYyBpbnQgcGNpMTcxeF9jb3VudGVyX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQotewotCXN0cnVjdCBwY2kxNzEwX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdWludCBtc2IsIGxzYiwgY2NudHJsLCBzdGF0dXM7Ci0KLQlsc2IgPSBkYXRhWzBdICYgMHgwMEZGOwotCW1zYiA9IChkYXRhWzBdICYgMHhGRjAwKSA+PiA4OwotCi0JLyogd3JpdGUgbHNiLCB0aGVuIG1zYiAqLwotCW91dHcobHNiLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ05UMCk7Ci0Jb3V0dyhtc2IsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DTlQwKTsKLQotCWlmIChkZXZwcml2LT5jbnQwX3dyaXRlX3dhaXQpIHsKLQkJLyogd2FpdCBmb3IgdGhlIG5ldyBjb3VudCB0byBiZSBsb2FkZWQgKi8KLQkJY2NudHJsID0gMHhFMjsKLQkJZG8gewotCQkJb3V0dyhjY250cmwsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DTlRDVFJMKTsKLQkJCXN0YXR1cyA9IGludyhkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ05UMCkgJiAweEZGOwotCQl9IHdoaWxlIChzdGF0dXMgJiAweDQwKTsKLQl9Ci0KLQlyZXR1cm4gaW5zbi0+bjsKLX0KLQotc3RhdGljIGludCBwY2kxNzF4X2NvdW50ZXJfaW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgICAgdW5zaWduZWQgaW50ICpkYXRhKQotewotI2lmZGVmIHVudXNlZAotCS8qIFRoaXMgZG9lc24ndCB3b3JrIGxpa2UgYSBub3JtYWwgQ29tZWRpIGNvdW50ZXIgY29uZmlnICovCi0Jc3RydWN0IHBjaTE3MTBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1aW50IGNjbnRybCA9IDA7Ci0KLQlkZXZwcml2LT5jbnQwX3dyaXRlX3dhaXQgPSBkYXRhWzBdICYgMHgyMDsKLQotCS8qIGludGVybmFsIG9yIGV4dGVybmFsIGNsb2NrPyAqLwotCWlmICghKGRhdGFbMF0gJiAweDEwKSkgewkvKiBpbnRlcm5hbCAqLwotCQlkZXZwcml2LT5DbnRybFJlZyAmPSB+Q29udHJvbF9DTlQwOwotCX0gZWxzZSB7Ci0JCWRldnByaXYtPkNudHJsUmVnIHw9IENvbnRyb2xfQ05UMDsKLQl9Ci0Jb3V0dyhkZXZwcml2LT5DbnRybFJlZywgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NPTlRST0wpOwotCi0JaWYgKGRhdGFbMF0gJiAweDAxKQotCQljY250cmwgfD0gQ291bnRlcl9NMDsKLQlpZiAoZGF0YVswXSAmIDB4MDIpCi0JCWNjbnRybCB8PSBDb3VudGVyX00xOwotCWlmIChkYXRhWzBdICYgMHgwNCkKLQkJY2NudHJsIHw9IENvdW50ZXJfTTI7Ci0JaWYgKGRhdGFbMF0gJiAweDA4KQotCQljY250cmwgfD0gQ291bnRlcl9CQ0Q7Ci0JY2NudHJsIHw9IENvdW50ZXJfUlcwOwkvKiBzZXQgcmVhZC93cml0ZSBtb2RlICovCi0JY2NudHJsIHw9IENvdW50ZXJfUlcxOwotCW91dHcoY2NudHJsLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ05UQ1RSTCk7Ci0jZW5kaWYKLQotCXJldHVybiAxOwotfQotCiBzdGF0aWMgaW50IHBjaTE3MjBfYW9faW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLApAQCAtNjQ2LDcgKzUyNCw3IEBACiAJZGV2cHJpdi0+Q250cmxSZWcgfD0gQ29udHJvbF9TVzsKIAkvKiByZXNldCBhbnkgb3BlcmF0aW9ucyAqLwogCW91dHcoZGV2cHJpdi0+Q250cmxSZWcsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DT05UUk9MKTsKLQlwY2kxNzF4X3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOworCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCBmYWxzZSk7CiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSRklGTyk7CiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ0xSSU5UKTsKIApAQCAtNzY3LDcgKzY0NSw3IEBACiAJCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NMUklOVCk7CiAJCW91dHcoZGV2cHJpdi0+YWlfZXRfTXV4VmFsLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfTVVYKTsKIAkJb3V0dyhkZXZwcml2LT5DbnRybFJlZywgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NPTlRST0wpOwotCQlwY2kxNzF4X3N0YXJ0X3BhY2VyKGRldiwgdHJ1ZSk7CisJCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCB0cnVlKTsKIAkJcmV0dXJuIElSUV9IQU5ETEVEOwogCX0KIApAQCAtNzg2LDggKzY2NCw2IEBACiAJc3RydWN0IHBjaTE3MTBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CiAKLQlwY2kxNzF4X3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOwotCiAJcGNpMTcxeF9haV9zZXR1cF9jaGFubGlzdChkZXYsIHMsIGNtZC0+Y2hhbmxpc3QsIGNtZC0+Y2hhbmxpc3RfbGVuLAogCQkJCSAgZGV2cHJpdi0+c2F2ZWRfc2VnbGVuKTsKIApAQCAtNzk4LDEwICs2NzQsOSBAQAogCWlmICgoY21kLT5mbGFncyAmIENNREZfV0FLRV9FT1MpID09IDApCiAJCWRldnByaXYtPkNudHJsUmVnIHw9IENvbnRyb2xfT05FRkg7CiAKLQlkZXZwcml2LT5kaXZpc29yMSA9IGRldnByaXYtPm5leHRfZGl2aXNvcjE7Ci0JZGV2cHJpdi0+ZGl2aXNvcjIgPSBkZXZwcml2LT5uZXh0X2Rpdmlzb3IyOwotCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQljb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMoZGV2LT5wYWNlcik7CisKIAkJZGV2cHJpdi0+Q250cmxSZWcgfD0gQ29udHJvbF9QQUNFUiB8IENvbnRyb2xfSVJRRU47CiAJCWlmIChjbWQtPnN0YXJ0X3NyYyA9PSBUUklHX0VYVCkgewogCQkJZGV2cHJpdi0+YWlfZXRfQ250cmxSZWcgPSBkZXZwcml2LT5DbnRybFJlZzsKQEAgLTgxNSw3ICs2OTAsNyBAQAogCQlvdXR3KGRldnByaXYtPkNudHJsUmVnLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ09OVFJPTCk7CiAKIAkJaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XKQotCQkJcGNpMTcxeF9zdGFydF9wYWNlcihkZXYsIHRydWUpOworCQkJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIHRydWUpOwogCX0gZWxzZSB7CS8qIFRSSUdfRVhUICovCiAJCWRldnByaXYtPkNudHJsUmVnIHw9IENvbnRyb2xfRVhUIHwgQ29udHJvbF9JUlFFTjsKIAkJb3V0dyhkZXZwcml2LT5DbnRybFJlZywgZGV2LT5pb2Jhc2UgKyBQQ0kxNzF4X0NPTlRST0wpOwpAQCAtODI4LDI2ICs3MDMsMjUgQEAKIAkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgICAgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3QgcGNpMTcxMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwotCXVuc2lnbmVkIGludCBhcmc7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0ZPTExPVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIHN0ZXAgMmE6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIHN0ZXAgMmI6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTg1NiwyMCArNzMwLDIxIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDEwMDAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDEwMDAwKTsKIAllbHNlCS8qIFRSSUdfRk9MTE9XICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtODc3LDEyICs3NTIsMTAgQEAKIAkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfMTBNSFosCi0JCQkJCSAgJmRldnByaXYtPm5leHRfZGl2aXNvcjEsCi0JCQkJCSAgJmRldnByaXYtPm5leHRfZGl2aXNvcjIsCi0JCQkJCSAgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CisJCXVuc2lnbmVkIGludCBhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOworCisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGVycikKQEAgLTg5OCwxOSArNzcxLDU0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcGNpMTcxeF9pbnNuX2NvdW50ZXJfY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGNpMTcxMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19TRVRfQ0xPQ0tfU1JDOgorCQlzd2l0Y2ggKGRhdGFbMV0pIHsKKwkJY2FzZSAwOgkvKiBpbnRlcm5hbCAqLworCQkJZGV2cHJpdi0+YWlfZXRfQ250cmxSZWcgJj0gfkNvbnRyb2xfQ05UMDsKKwkJCWJyZWFrOworCQljYXNlIDE6CS8qIGV4dGVybmFsICovCisJCQlkZXZwcml2LT5haV9ldF9DbnRybFJlZyB8PSBDb250cm9sX0NOVDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW91dHcoZGV2cHJpdi0+YWlfZXRfQ250cmxSZWcsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DT05UUk9MKTsKKwkJYnJlYWs7CisJY2FzZSBJTlNOX0NPTkZJR19HRVRfQ0xPQ0tfU1JDOgorCQlpZiAoZGV2cHJpdi0+YWlfZXRfQ250cmxSZWcgJiBDb250cm9sX0NOVDApIHsKKwkJCWRhdGFbMV0gPSAxOworCQkJZGF0YVsyXSA9IDA7CisJCX0gZWxzZSB7CisJCQlkYXRhWzFdID0gMDsKKwkJCWRhdGFbMl0gPSBJODI1NF9PU0NfQkFTRV8xME1IWjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKwogc3RhdGljIGludCBwY2kxNzF4X3Jlc2V0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJY29uc3Qgc3RydWN0IGJvYXJkdHlwZSAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKIAlzdHJ1Y3QgcGNpMTcxMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCi0Jb3V0dygweDMwLCBkZXYtPmlvYmFzZSArIFBDSTE3MXhfQ05UQ1RSTCk7CiAJLyogU29mdHdhcmUgdHJpZ2dlciwgQ05UMD1leHRlcm5hbCAqLwogCWRldnByaXYtPkNudHJsUmVnID0gQ29udHJvbF9TVyB8IENvbnRyb2xfQ05UMDsKIAkvKiByZXNldCBhbnkgb3BlcmF0aW9ucyAqLwogCW91dHcoZGV2cHJpdi0+Q250cmxSZWcsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DT05UUk9MKTsKIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DTFJGSUZPKTsJLyogIGNsZWFyIEZJRk8gKi8KIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgUENJMTcxeF9DTFJJTlQpOwkvKiAgY2xlYXIgSU5UIHJlcXVlc3QgKi8KLQlwY2kxNzF4X3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOwogCWRldnByaXYtPmRhX3JhbmdlcyA9IDA7CiAJaWYgKGJvYXJkLT5oYXNfYW8pIHsKIAkJLyogc2V0IERBQ3MgdG8gMC4uNVYgKi8KQEAgLTk3Nyw2ICs4ODUsMTEgQEAKIAkJcmV0dXJuIHJldDsKIAlkZXYtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDIpOwogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBQQ0kxNzFYX1RJTUVSX0JBU0UsCisJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfMTBNSFosIEk4MjU0X0lPMTYsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAluX3N1YmRldmljZXMgPSAwOwogCWlmIChib2FyZC0+bl9haWNoYW4pCiAJCW5fc3ViZGV2aWNlcysrOwpAQCAtMTA3MywxNiArOTg2LDE3IEBACiAJCXN1YmRldisrOwogCX0KIAorCS8qIENvdW50ZXIgc3ViZGV2aWNlICg4MjU0KSAqLwogCWlmIChib2FyZC0+aGFzX2NvdW50ZXIpIHsKIAkJcyA9ICZkZXYtPnN1YmRldmljZXNbc3ViZGV2XTsKLQkJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9DT1VOVEVSOwotCQlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7Ci0JCXMtPm5fY2hhbgk9IDE7Ci0JCXMtPm1heGRhdGEJPSAweGZmZmY7Ci0JCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX3Vua25vd247Ci0JCXMtPmluc25fcmVhZAk9IHBjaTE3MXhfY291bnRlcl9pbnNuX3JlYWQ7Ci0JCXMtPmluc25fd3JpdGUJPSBwY2kxNzF4X2NvdW50ZXJfaW5zbl93cml0ZTsKLQkJcy0+aW5zbl9jb25maWcJPSBwY2kxNzF4X2NvdW50ZXJfaW5zbl9jb25maWc7CisJCWNvbWVkaV84MjU0X3N1YmRldmljZV9pbml0KHMsIGRldi0+cGFjZXIpOworCisJCWRldi0+cGFjZXItPmluc25fY29uZmlnID0gcGNpMTcxeF9pbnNuX2NvdW50ZXJfY29uZmlnOworCisJCS8qIGNvdW50ZXJzIDEgYW5kIDIgYXJlIHVzZWQgaW50ZXJuYWxseSBmb3IgdGhlIHBhY2VyICovCisJCWNvbWVkaV84MjU0X3NldF9idXN5KGRldi0+cGFjZXIsIDEsIHRydWUpOworCQljb21lZGlfODI1NF9zZXRfYnVzeShkZXYtPnBhY2VyLCAyLCB0cnVlKTsKKwogCQlzdWJkZXYrKzsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcyMy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzIzLmMKaW5kZXggZjE5NDViZS4uMTkyMWE5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzIzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2kxNzIzLmMKQEAgLTQxLDkgKzQxLDggQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKIC8qCiAgKiBQQ0kgQmFyIDIgSS9PIFJlZ2lzdGVyIG1hcCAoZGV2LT5pb2Jhc2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaTE3MjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcyNC5jCmluZGV4IGEzNTczZWEuLmY3YTdkYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcyNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hZHZfcGNpMTcyNC5jCkBAIC00Nyw5ICs0Nyw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAvKgogICogUENJIGJhciAyIFJlZ2lzdGVyIEkvTyBtYXAgKGRldi0+aW9iYXNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2Fkdl9wY2lfZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaV9kaW8uYwppbmRleCAwOTYwOWQ2Li40NTZlODcwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaV9kaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWR2X3BjaV9kaW8uYwpAQCAtMzAsMTMgKzMwLDEyIEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2luY2x1ZGUgIjgyNTUuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKIAogLyogaGFyZHdhcmUgdHlwZXMgb2YgdGhlIGNhcmRzICovCiBlbnVtIGh3X2NhcmRzX2lkIHsKQEAgLTYwLDEyICs1OSw2IEBACiAjZGVmaW5lIE1BWF9ET19TVUJERVZTCTIJLyogbWF4IG51bWJlciBvZiBETyBzdWJkZXZpY2VzIHBlciBjYXJkICovCiAjZGVmaW5lIE1BWF9ESU9fU1VCREVWRwkyCS8qIG1heCBudW1iZXIgb2YgRElPIHN1YmRldmljZXMgZ3JvdXAgcGVyCiAJCQkJICogY2FyZCAqLwotI2RlZmluZSBNQVhfODI1NF9TVUJERVZTICAgMQkvKiBtYXggbnVtYmVyIG9mIDgyNTQgY291bnRlciBzdWJkZXZzIHBlcgotCQkJCSAqIGNhcmQgKi8KLQkJCQkvKiAoY291bGQgYmUgbW9yZSB0aGFuIG9uZSA4MjU0IHBlcgotCQkJCSAqIHN1YmRldmljZSkgKi8KLQotI2RlZmluZSBTSVpFXzgyNTQJICAgNAkvKiA4MjU0IElPIHNwYWNlIGxlbmd0aCAqLwogCiAjZGVmaW5lIFBDSURJT19NQUlOUkVHCSAgIDIJLyogbWFpbiBJL08gcmVnaW9uIGZvciBhbGwgQWR2YW50ZWNoIGNhcmRzPyAqLwogCkBAIC0yMzAsNyArMjIzLDcgQEAKIAlpbnQgY2hhbnM7CQkvKiAgbnVtIG9mIGNoYW5zICovCiAJaW50IGFkZHI7CQkvKiAgUENJIGFkZHJlc3Mgb2ZzZXQgKi8KIAlpbnQgcmVnczsJCS8qICBudW1iZXIgb2YgcmVnaXN0ZXJzIHRvIHJlYWQgb3IgODI1NQotCQkJCSAgICBzdWJkZXZpY2VzIG9yIDgyNTQgY2hpcHMgKi8KKwkJCQkgICAgc3ViZGV2aWNlcyAqLwogCXVuc2lnbmVkIGludCBzcGVjZmxhZ3M7CS8qICBhZGRvbiBzdWJkZXZpY2UgZmxhZ3MgKi8KIH07CiAKQEAgLTI0Myw3ICsyMzYsNyBAQAogCXN0cnVjdCBkaW9zdWJkX2RhdGEgc2RvW01BWF9ET19TVUJERVZTXTsJLyogIERPIGNoYW5zICovCiAJc3RydWN0IGRpb3N1YmRfZGF0YSBzZGlvW01BWF9ESU9fU1VCREVWR107CS8qICBESU8gODI1NSBjaGFucyAqLwogCXN0cnVjdCBkaW9zdWJkX2RhdGEgYm9hcmRpZDsJLyogIGNhcmQgc3VwcG9ydHMgYm9hcmQgSUQgc3dpdGNoICovCi0Jc3RydWN0IGRpb3N1YmRfZGF0YSBzODI1NFtNQVhfODI1NF9TVUJERVZTXTsJLyogODI1NCBzdWJkZXZpY2VzICovCisJdW5zaWduZWQgbG9uZyB0aW1lcl9yZWdiYXNlOwogCWVudW0gaHdfaW9fYWNjZXNzIGlvX2FjY2VzczsKIH07CiAKQEAgLTI4Niw3ICsyNzksNyBAQAogCQkuc2RpWzBdCQk9IHsgMzIsIFBDSTE3MzVfREksIDQsIDAsIH0sCiAJCS5zZG9bMF0JCT0geyAzMiwgUENJMTczNV9ETywgNCwgMCwgfSwKIAkJLmJvYXJkaWQJPSB7IDQsIFBDSTE3MzVfQk9BUkRJRCwgMSwgU0RGX0lOVEVSTkFMLCB9LAotCQkuczgyNTRbMF0JPSB7IDMsIFBDSTE3MzVfQzgyNTQsIDEsIDAsIH0sCisJCS50aW1lcl9yZWdiYXNlCT0gUENJMTczNV9DODI1NCwKIAkJLmlvX2FjY2Vzcwk9IElPXzhiLAogCX0sCiAJW1RZUEVfUENJMTczNl0gPSB7CkBAIC0zMjIsNyArMzE1LDcgQEAKIAkJLmNhcmR0eXBlCT0gVFlQRV9QQ0kxNzUxLAogCQkubnN1YmRldnMJPSAzLAogCQkuc2Rpb1swXQk9IHsgNDgsIFBDSTE3NTFfRElPLCAyLCAwLCB9LAotCQkuczgyNTRbMF0JPSB7IDMsIFBDSTE3NTFfQ05ULCAxLCAwLCB9LAorCQkudGltZXJfcmVnYmFzZQk9IFBDSTE3NTFfQ05ULAogCQkuaW9fYWNjZXNzCT0gSU9fOGIsCiAJfSwKIAlbVFlQRV9QQ0kxNzUyXSA9IHsKQEAgLTQyNSw3ICs0MTgsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBkLT5yZWdzOyBpKyspCiAJCWRhdGFbMV0gfD0gaW5iKGRldi0+aW9iYXNlICsgZC0+YWRkciArIGkpIDw8ICg4ICogaSk7CiAKLQogCXJldHVybiBpbnNuLT5uOwogfQogCkBAIC00ODcsODMgKzQ3OSw2IEBACiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotc3RhdGljIGludCBwY2lfODI1NF9pbnNuX3JlYWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JY29uc3Qgc3RydWN0IGRpb3N1YmRfZGF0YSAqZCA9IChjb25zdCBzdHJ1Y3QgZGlvc3ViZF9kYXRhICopcy0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgY2hhbiwgY2hpcCwgY2hpcGNoYW47Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsJLyogY2hhbm5lbCBvbiBzdWJkZXZpY2UgKi8KLQljaGlwID0gY2hhbiAvIDM7CQkvKiBjaGlwIG9uIHN1YmRldmljZSAqLwotCWNoaXBjaGFuID0gY2hhbiAtICgzICogY2hpcCk7CS8qIGNoYW5uZWwgb24gY2hpcCBvbiBzdWJkZXZpY2UgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7Ci0JZGF0YVswXSA9IGk4MjU0X3JlYWQoZGV2LT5pb2Jhc2UgKyBkLT5hZGRyICsgKFNJWkVfODI1NCAqIGNoaXApLAotCQkJMCwgY2hpcGNoYW4pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOwotCXJldHVybiAxOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBwY2lfODI1NF9pbnNuX3dyaXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0JY29uc3Qgc3RydWN0IGRpb3N1YmRfZGF0YSAqZCA9IChjb25zdCBzdHJ1Y3QgZGlvc3ViZF9kYXRhICopcy0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgY2hhbiwgY2hpcCwgY2hpcGNoYW47Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsJLyogY2hhbm5lbCBvbiBzdWJkZXZpY2UgKi8KLQljaGlwID0gY2hhbiAvIDM7CQkvKiBjaGlwIG9uIHN1YmRldmljZSAqLwotCWNoaXBjaGFuID0gY2hhbiAtICgzICogY2hpcCk7CS8qIGNoYW5uZWwgb24gY2hpcCBvbiBzdWJkZXZpY2UgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+c3Bpbl9sb2NrLCBmbGFncyk7Ci0JaTgyNTRfd3JpdGUoZGV2LT5pb2Jhc2UgKyBkLT5hZGRyICsgKFNJWkVfODI1NCAqIGNoaXApLAotCQkJMCwgY2hpcGNoYW4sIGRhdGFbMF0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOwotCXJldHVybiAxOwotfQotCi0vKgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotc3RhdGljIGludCBwY2lfODI1NF9pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQotewotCWNvbnN0IHN0cnVjdCBkaW9zdWJkX2RhdGEgKmQgPSAoY29uc3Qgc3RydWN0IGRpb3N1YmRfZGF0YSAqKXMtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IGNoYW4sIGNoaXAsIGNoaXBjaGFuOwotCXVuc2lnbmVkIGxvbmcgaW9iYXNlOwotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQljaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CS8qIGNoYW5uZWwgb24gc3ViZGV2aWNlICovCi0JY2hpcCA9IGNoYW4gLyAzOwkJLyogY2hpcCBvbiBzdWJkZXZpY2UgKi8KLQljaGlwY2hhbiA9IGNoYW4gLSAoMyAqIGNoaXApOwkvKiBjaGFubmVsIG9uIGNoaXAgb24gc3ViZGV2aWNlICovCi0JaW9iYXNlID0gZGV2LT5pb2Jhc2UgKyBkLT5hZGRyICsgKFNJWkVfODI1NCAqIGNoaXApOwotCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5zcGluX2xvY2ssIGZsYWdzKTsKLQlzd2l0Y2ggKGRhdGFbMF0pIHsKLQljYXNlIElOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREU6Ci0JCXJldCA9IGk4MjU0X3NldF9tb2RlKGlvYmFzZSwgMCwgY2hpcGNoYW4sIGRhdGFbMV0pOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgSU5TTl9DT05GSUdfODI1NF9SRUFEX1NUQVRVUzoKLQkJZGF0YVsxXSA9IGk4MjU0X3N0YXR1cyhpb2Jhc2UsIDAsIGNoaXBjaGFuKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPnNwaW5fbG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQgPCAwID8gcmV0IDogaW5zbi0+bjsKLX0KLQotLyoKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotKi8KIHN0YXRpYyBpbnQgcGNpMTc2MF91bmNoZWNrZWRfbWJ4cmVxdWVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCQl1bnNpZ25lZCBjaGFyICpvbWIsIHVuc2lnbmVkIGNoYXIgKmltYiwKIAkJCQkJaW50IHJlcGVhdHMpCkBAIC04NDUsOSArNzYwLDYgQEAKIAkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MzVfRE8gKyAxKTsKIAkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MzVfRE8gKyAyKTsKIAkJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDSTE3MzVfRE8gKyAzKTsKLQkJaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0kxNzM1X0M4MjU0LCAwLCAwLCBJODI1NF9NT0RFMCk7Ci0JCWk4MjU0X3NldF9tb2RlKGRldi0+aW9iYXNlICsgUENJMTczNV9DODI1NCwgMCwgMSwgSTgyNTRfTU9ERTApOwotCQlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIFBDSTE3MzVfQzgyNTQsIDAsIDIsIEk4MjU0X01PREUwKTsKIAkJYnJlYWs7CiAKIAljYXNlIFRZUEVfUENJMTczNjoKQEAgLTEwMjksMjYgKzk0MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi1zdGF0aWMgaW50IHBjaV9kaW9fYWRkXzgyNTQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCSAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICBjb25zdCBzdHJ1Y3QgZGlvc3ViZF9kYXRhICpkKQotewotCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOwotCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRTsKLQlzLT5uX2NoYW4gPSBkLT5jaGFuczsKLQlzLT5tYXhkYXRhID0gNjU1MzU7Ci0Jcy0+bGVuX2NoYW5saXN0ID0gZC0+Y2hhbnM7Ci0Jcy0+aW5zbl9yZWFkID0gcGNpXzgyNTRfaW5zbl9yZWFkOwotCXMtPmluc25fd3JpdGUgPSBwY2lfODI1NF9pbnNuX3dyaXRlOwotCXMtPmluc25fY29uZmlnID0gcGNpXzgyNTRfaW5zbl9jb25maWc7Ci0Jcy0+cHJpdmF0ZSA9ICh2b2lkICopZDsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBwY2lfZGlvX292ZXJyaWRlX2NhcmR0eXBlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsCiAJCQkJCSAgICAgICB1bnNpZ25lZCBsb25nIGNhcmR0eXBlKQogewpAQCAtMTE0NCwxMiArMTAzNiwxOSBAQAogCQlzdWJkZXYrKzsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYXzgyNTRfU1VCREVWUzsgaSsrKQotCQlpZiAodGhpc19ib2FyZC0+czgyNTRbaV0uY2hhbnMpIHsKLQkJCXMgPSAmZGV2LT5zdWJkZXZpY2VzW3N1YmRldl07Ci0JCQlwY2lfZGlvX2FkZF84MjU0KGRldiwgcywgJnRoaXNfYm9hcmQtPnM4MjU0W2ldKTsKLQkJCXN1YmRldisrOwotCQl9CisJaWYgKHRoaXNfYm9hcmQtPnRpbWVyX3JlZ2Jhc2UpIHsKKwkJcyA9ICZkZXYtPnN1YmRldmljZXNbc3ViZGV2XTsKKworCQlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArCisJCQkJCSAgICAgIHRoaXNfYm9hcmQtPnRpbWVyX3JlZ2Jhc2UsCisJCQkJCSAgICAgIDAsIEk4MjU0X0lPOCwgMCk7CisJCWlmICghZGV2LT5wYWNlcikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWNvbWVkaV84MjU0X3N1YmRldmljZV9pbml0KHMsIGRldi0+cGFjZXIpOworCisJCXN1YmRldisrOworCX0KIAogCWlmICh0aGlzX2JvYXJkLT5jYXJkdHlwZSA9PSBUWVBFX1BDSTE3NjApCiAJCXBjaTE3NjBfYXR0YWNoKGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYWlvX2lpcm9fMTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCmluZGV4IDFjN2IzMjUuLjM1YjJmOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9haW9faWlyb18xNi5jCkBAIC00Miw4ICs0Miw2IEBACiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotCiAjZGVmaW5lIEFJT19JSVJPXzE2X1JFTEFZXzBfNwkJMHgwMAogI2RlZmluZSBBSU9fSUlST18xNl9JTlBVVF8wXzcJCTB4MDEKICNkZWZpbmUgQUlPX0lJUk9fMTZfSVJRCQkJMHgwMgpAQCAtMTE2LDExICsxMTQsMTEgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKQEAgLTEzMCwxMSArMTI4LDEyIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX2RpbzIwMF9jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDBfY29tbW9uLmMKaW5kZXggMjZhYWQ3MC4uZDE1YTNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX2RpbzIwMF9jb21tb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfZGlvMjAwX2NvbW1vbi5jCkBAIC0yNSwxOSArMjUsMTQgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgImFtcGxjX2RpbzIwMC5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotI2luY2x1ZGUgIjgyNTMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogI2luY2x1ZGUgIjgyNTUuaCIJCS8qIG9ubHkgZm9yIHJlZ2lzdGVyIGRlZmluZXMgKi8KIAogLyogMjAwIHNlcmllcyByZWdpc3RlcnMgKi8KICNkZWZpbmUgRElPMjAwX0lPX1NJWkUJCTB4MjAKICNkZWZpbmUgRElPMjAwX1BDSUVfSU9fU0laRQkweDQwMDAKLSNkZWZpbmUgRElPMjAwX1hDTEtfU0NFCQkweDE4CS8qIEdyb3VwIFggY2xvY2sgc2VsZWN0aW9uIHJlZ2lzdGVyICovCi0jZGVmaW5lIERJTzIwMF9ZQ0xLX1NDRQkJMHgxOQkvKiBHcm91cCBZIGNsb2NrIHNlbGVjdGlvbiByZWdpc3RlciAqLwotI2RlZmluZSBESU8yMDBfWkNMS19TQ0UJCTB4MWEJLyogR3JvdXAgWiBjbG9jayBzZWxlY3Rpb24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRElPMjAwX1hHQVRfU0NFCQkweDFiCS8qIEdyb3VwIFggZ2F0ZSBzZWxlY3Rpb24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRElPMjAwX1lHQVRfU0NFCQkweDFjCS8qIEdyb3VwIFkgZ2F0ZSBzZWxlY3Rpb24gcmVnaXN0ZXIgKi8KLSNkZWZpbmUgRElPMjAwX1pHQVRfU0NFCQkweDFkCS8qIEdyb3VwIFogZ2F0ZSBzZWxlY3Rpb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgRElPMjAwX0NMS19TQ0UoeCkJKDB4MTggKyAoeCkpCS8qIEdyb3VwIFgvWS9aIGNsb2NrIHNlbCByZWcgKi8KKyNkZWZpbmUgRElPMjAwX0dBVF9TQ0UoeCkJKDB4MWIgKyAoeCkpCS8qIEdyb3VwIFgvWS9aIGdhdGUgc2VsIHJlZyAqLwogI2RlZmluZSBESU8yMDBfSU5UX1NDRQkJMHgxZQkvKiBJbnRlcnJ1cHQgZW5hYmxlL3N0YXR1cyByZWdpc3RlciAqLwogLyogRXh0cmEgcmVnaXN0ZXJzIGZvciBuZXcgUENJZSBib2FyZHMgKi8KICNkZWZpbmUgRElPMjAwX0VOSEFOQ0UJCTB4MjAJLyogMSB0byBlbmFibGUgZW5oYW5jZWQgZmVhdHVyZXMgKi8KQEAgLTEwMSwxNiArOTYsNiBAQAogCTEwMDAwMDAsCQkvKiAxIG1pbGxpc2Vjb25kLiAqLwogfTsKIAotc3RydWN0IGRpbzIwMF9zdWJkZXZfODI1NCB7Ci0JdW5zaWduZWQgaW50IG9mczsJCS8qIENvdW50ZXIgYmFzZSBvZmZzZXQgKi8KLQl1bnNpZ25lZCBpbnQgY2xrX3NjZV9vZnM7CS8qIENMS19TQ0UgYmFzZSBhZGRyZXNzICovCi0JdW5zaWduZWQgaW50IGdhdF9zY2Vfb2ZzOwkvKiBHQVRfU0NFIGJhc2UgYWRkcmVzcyAqLwotCWludCB3aGljaDsJCQkvKiBCaXQgNSBvZiBDTEtfU0NFIG9yIEdBVF9TQ0UgKi8KLQl1bnNpZ25lZCBpbnQgY2xvY2tfc3JjWzNdOwkvKiBDdXJyZW50IGNsb2NrIHNvdXJjZXMgKi8KLQl1bnNpZ25lZCBpbnQgZ2F0ZV9zcmNbM107CS8qIEN1cnJlbnQgZ2F0ZSBzb3VyY2VzICovCi0Jc3BpbmxvY2tfdCBzcGlubG9jazsKLX07Ci0KIHN0cnVjdCBkaW8yMDBfc3ViZGV2XzgyNTUgewogCXVuc2lnbmVkIGludCBvZnM7CQkvKiBESU8gYmFzZSBvZmZzZXQgKi8KIH07CkBAIC0xNzcsNiArMTYyLDI3IEBACiAJCW91dGwodmFsLCBkZXYtPmlvYmFzZSArIG9mZnNldCk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGlvMjAwX3N1YmRldl84MjU0X29mZnNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKK3sKKwljb25zdCBzdHJ1Y3QgZGlvMjAwX2JvYXJkICpib2FyZCA9IGRldi0+Ym9hcmRfcHRyOworCXN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQgPSBzLT5wcml2YXRlOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisKKwkvKiBnZXQgdGhlIG9mZnNldCB0aGF0IHdhcyBwYXNzZWQgdG8gY29tZWRpXzgyNTRfKl9pbml0KCkgKi8KKwlpZiAoZGV2LT5tbWlvKQorCQlvZmZzZXQgPSBpODI1NC0+bW1pbyAtIGRldi0+bW1pbzsKKwllbHNlCisJCW9mZnNldCA9IGk4MjU0LT5pb2Jhc2UgLSBkZXYtPmlvYmFzZTsKKworCS8qIHJlbW92ZSB0aGUgc2hpZnQgdGhhdCB3YXMgYWRkZWQgZm9yIFBDSWUgYm9hcmRzICovCisJaWYgKGJvYXJkLT5pc19wY2llKQorCQlvZmZzZXQgPj49IDM7CisKKwkvKiB0aGlzIG9mZnNldCBub3cgd29ya3MgZm9yIHRoZSBkaW8yMDBfe3JlYWQsd3JpdGV9IGhlbHBlcnMgKi8KKwlyZXR1cm4gb2Zmc2V0OworfQorCiBzdGF0aWMgaW50IGRpbzIwMF9zdWJkZXZfaW50cl9pbnNuX2JpdHMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKQEAgLTM2NiwxOSArMzcyLDE5IEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0lOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19JTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMzg3LDE1ICszOTMsMTYgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC00ODIsMTc1ICs0ODksMjYgQEAKIAlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBkaW8yMDBfc3ViZGV2XzgyNTRfcmVhZF9jaGFuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCQkgdW5zaWduZWQgaW50IGNoYW4pCi17Ci0Jc3RydWN0IGRpbzIwMF9zdWJkZXZfODI1NCAqc3VicHJpdiA9IHMtPnByaXZhdGU7Ci0JdW5zaWduZWQgaW50IHZhbDsKLQotCS8qIGxhdGNoIGNvdW50ZXIgKi8KLQl2YWwgPSBjaGFuIDw8IDY7Ci0JZGlvMjAwX3dyaXRlOChkZXYsIHN1YnByaXYtPm9mcyArIGk4MjU0X2NvbnRyb2xfcmVnLCB2YWwpOwotCS8qIHJlYWQgbHNiLCBtc2IgKi8KLQl2YWwgPSBkaW8yMDBfcmVhZDgoZGV2LCBzdWJwcml2LT5vZnMgKyBjaGFuKTsKLQl2YWwgKz0gZGlvMjAwX3JlYWQ4KGRldiwgc3VicHJpdi0+b2ZzICsgY2hhbikgPDwgODsKLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgdm9pZCBkaW8yMDBfc3ViZGV2XzgyNTRfd3JpdGVfY2hhbihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgIHVuc2lnbmVkIGludCBjaGFuLAotCQkJCQkgIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLQlzdHJ1Y3QgZGlvMjAwX3N1YmRldl84MjU0ICpzdWJwcml2ID0gcy0+cHJpdmF0ZTsKLQotCS8qIHdyaXRlIGxzYiwgbXNiICovCi0JZGlvMjAwX3dyaXRlOChkZXYsIHN1YnByaXYtPm9mcyArIGNoYW4sIGNvdW50ICYgMHhmZik7Ci0JZGlvMjAwX3dyaXRlOChkZXYsIHN1YnByaXYtPm9mcyArIGNoYW4sIChjb3VudCA+PiA4KSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgdm9pZCBkaW8yMDBfc3ViZGV2XzgyNTRfc2V0X21vZGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCXVuc2lnbmVkIGludCBjaGFuLAotCQkJCQl1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQlzdHJ1Y3QgZGlvMjAwX3N1YmRldl84MjU0ICpzdWJwcml2ID0gcy0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBpbnQgYnl0ZTsKLQotCWJ5dGUgPSBjaGFuIDw8IDY7Ci0JYnl0ZSB8PSAweDMwOwkJLyogYWNjZXNzIG9yZGVyOiBsc2IsIG1zYiAqLwotCWJ5dGUgfD0gKG1vZGUgJiAweGYpOwkvKiBjb3VudGVyIG1vZGUgYW5kIEJDRHxiaW5hcnkgKi8KLQlkaW8yMDBfd3JpdGU4KGRldiwgc3VicHJpdi0+b2ZzICsgaTgyNTRfY29udHJvbF9yZWcsIGJ5dGUpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IGRpbzIwMF9zdWJkZXZfODI1NF9zdGF0dXMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGludCBjaGFuKQotewotCXN0cnVjdCBkaW8yMDBfc3ViZGV2XzgyNTQgKnN1YnByaXYgPSBzLT5wcml2YXRlOwotCi0JLyogbGF0Y2ggc3RhdHVzICovCi0JZGlvMjAwX3dyaXRlOChkZXYsIHN1YnByaXYtPm9mcyArIGk4MjU0X2NvbnRyb2xfcmVnLAotCQkgICAgICAweGUwIHwgKDIgPDwgY2hhbikpOwotCS8qIHJlYWQgc3RhdHVzICovCi0JcmV0dXJuIGRpbzIwMF9yZWFkOChkZXYsIHN1YnByaXYtPm9mcyArIGNoYW4pOwotfQotCi1zdGF0aWMgaW50IGRpbzIwMF9zdWJkZXZfODI1NF9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSAgIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQlzdHJ1Y3QgZGlvMjAwX3N1YmRldl84MjU0ICpzdWJwcml2ID0gcy0+cHJpdmF0ZTsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCXVuc2lnbmVkIGludCBuOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlmb3IgKG4gPSAwOyBuIDwgaW5zbi0+bjsgbisrKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzdWJwcml2LT5zcGlubG9jaywgZmxhZ3MpOwotCQlkYXRhW25dID0gZGlvMjAwX3N1YmRldl84MjU0X3JlYWRfY2hhbihkZXYsIHMsIGNoYW4pOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJwcml2LT5zcGlubG9jaywgZmxhZ3MpOwotCX0KLQlyZXR1cm4gaW5zbi0+bjsKLX0KLQotc3RhdGljIGludCBkaW8yMDBfc3ViZGV2XzgyNTRfd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKLQkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQotewotCXN0cnVjdCBkaW8yMDBfc3ViZGV2XzgyNTQgKnN1YnByaXYgPSBzLT5wcml2YXRlOwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JdW5zaWduZWQgaW50IG47Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN1YnByaXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0JCWRpbzIwMF9zdWJkZXZfODI1NF93cml0ZV9jaGFuKGRldiwgcywgY2hhbiwgZGF0YVtuXSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN1YnByaXYtPnNwaW5sb2NrLCBmbGFncyk7Ci0JfQotCXJldHVybiBpbnNuLT5uOwotfQotCi1zdGF0aWMgaW50IGRpbzIwMF9zdWJkZXZfODI1NF9zZXRfZ2F0ZV9zcmMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBjb3VudGVyX251bWJlciwKLQkJCQkJICAgdW5zaWduZWQgaW50IGdhdGVfc3JjKQotewotCWNvbnN0IHN0cnVjdCBkaW8yMDBfYm9hcmQgKmJvYXJkID0gZGV2LT5ib2FyZF9wdHI7Ci0Jc3RydWN0IGRpbzIwMF9zdWJkZXZfODI1NCAqc3VicHJpdiA9IHMtPnByaXZhdGU7Ci0JdW5zaWduZWQgY2hhciBieXRlOwotCi0JaWYgKCFib2FyZC0+aGFzX2Nsa19nYXRfc2NlKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGNvdW50ZXJfbnVtYmVyID4gMikKLQkJcmV0dXJuIC0xOwotCWlmIChnYXRlX3NyYyA+IChib2FyZC0+aXNfcGNpZSA/IDMxIDogNykpCi0JCXJldHVybiAtMTsKLQotCXN1YnByaXYtPmdhdGVfc3JjW2NvdW50ZXJfbnVtYmVyXSA9IGdhdGVfc3JjOwotCWJ5dGUgPSBnYXRfc2NlKHN1YnByaXYtPndoaWNoLCBjb3VudGVyX251bWJlciwgZ2F0ZV9zcmMpOwotCWRpbzIwMF93cml0ZTgoZGV2LCBzdWJwcml2LT5nYXRfc2NlX29mcywgYnl0ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkaW8yMDBfc3ViZGV2XzgyNTRfZ2V0X2dhdGVfc3JjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgICB1bnNpZ25lZCBpbnQgY291bnRlcl9udW1iZXIpCi17Ci0JY29uc3Qgc3RydWN0IGRpbzIwMF9ib2FyZCAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQlzdHJ1Y3QgZGlvMjAwX3N1YmRldl84MjU0ICpzdWJwcml2ID0gcy0+cHJpdmF0ZTsKLQotCWlmICghYm9hcmQtPmhhc19jbGtfZ2F0X3NjZSkKLQkJcmV0dXJuIC0xOwotCWlmIChjb3VudGVyX251bWJlciA+IDIpCi0JCXJldHVybiAtMTsKLQotCXJldHVybiBzdWJwcml2LT5nYXRlX3NyY1tjb3VudGVyX251bWJlcl07Ci19Ci0KLXN0YXRpYyBpbnQgZGlvMjAwX3N1YmRldl84MjU0X3NldF9jbG9ja19zcmMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKK3N0YXRpYyB2b2lkIGRpbzIwMF9zdWJkZXZfODI1NF9zZXRfZ2F0ZV9zcmMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgICAgdW5zaWduZWQgaW50IGNvdW50ZXJfbnVtYmVyLAotCQkJCQkgICAgdW5zaWduZWQgaW50IGNsb2NrX3NyYykKKwkJCQkJICAgIHVuc2lnbmVkIGludCBjaGFuLAorCQkJCQkgICAgdW5zaWduZWQgaW50IHNyYykKIHsKLQljb25zdCBzdHJ1Y3QgZGlvMjAwX2JvYXJkICpib2FyZCA9IGRldi0+Ym9hcmRfcHRyOwotCXN0cnVjdCBkaW8yMDBfc3ViZGV2XzgyNTQgKnN1YnByaXYgPSBzLT5wcml2YXRlOwotCXVuc2lnbmVkIGNoYXIgYnl0ZTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gZGlvMjAwX3N1YmRldl84MjU0X29mZnNldChkZXYsIHMpOwogCi0JaWYgKCFib2FyZC0+aGFzX2Nsa19nYXRfc2NlKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGNvdW50ZXJfbnVtYmVyID4gMikKLQkJcmV0dXJuIC0xOwotCWlmIChjbG9ja19zcmMgPiAoYm9hcmQtPmlzX3BjaWUgPyAzMSA6IDcpKQotCQlyZXR1cm4gLTE7Ci0KLQlzdWJwcml2LT5jbG9ja19zcmNbY291bnRlcl9udW1iZXJdID0gY2xvY2tfc3JjOwotCWJ5dGUgPSBjbGtfc2NlKHN1YnByaXYtPndoaWNoLCBjb3VudGVyX251bWJlciwgY2xvY2tfc3JjKTsKLQlkaW8yMDBfd3JpdGU4KGRldiwgc3VicHJpdi0+Y2xrX3NjZV9vZnMsIGJ5dGUpOwotCi0JcmV0dXJuIDA7CisJZGlvMjAwX3dyaXRlOChkZXYsIERJTzIwMF9HQVRfU0NFKG9mZnNldCA+PiAzKSwKKwkJICAgICAgZ2F0X3NjZSgob2Zmc2V0ID4+IDIpICYgMSwgY2hhbiwgc3JjKSk7CiB9CiAKLXN0YXRpYyBpbnQgZGlvMjAwX3N1YmRldl84MjU0X2dldF9jbG9ja19zcmMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCQkgICAgdW5zaWduZWQgaW50IGNvdW50ZXJfbnVtYmVyLAotCQkJCQkgICAgdW5zaWduZWQgaW50ICpwZXJpb2RfbnMpCitzdGF0aWMgdm9pZCBkaW8yMDBfc3ViZGV2XzgyNTRfc2V0X2Nsb2NrX3NyYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBjaGFuLAorCQkJCQkgICAgIHVuc2lnbmVkIGludCBzcmMpCiB7Ci0JY29uc3Qgc3RydWN0IGRpbzIwMF9ib2FyZCAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQlzdHJ1Y3QgZGlvMjAwX3N1YmRldl84MjU0ICpzdWJwcml2ID0gcy0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBjbG9ja19zcmM7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IGRpbzIwMF9zdWJkZXZfODI1NF9vZmZzZXQoZGV2LCBzKTsKIAotCWlmICghYm9hcmQtPmhhc19jbGtfZ2F0X3NjZSkKLQkJcmV0dXJuIC0xOwotCWlmIChjb3VudGVyX251bWJlciA+IDIpCi0JCXJldHVybiAtMTsKLQotCWNsb2NrX3NyYyA9IHN1YnByaXYtPmNsb2NrX3NyY1tjb3VudGVyX251bWJlcl07Ci0JKnBlcmlvZF9ucyA9IGNsb2NrX3BlcmlvZFtjbG9ja19zcmNdOwotCXJldHVybiBjbG9ja19zcmM7CisJZGlvMjAwX3dyaXRlOChkZXYsIERJTzIwMF9DTEtfU0NFKG9mZnNldCA+PiAzKSwKKwkJICAgICAgY2xrX3NjZSgob2Zmc2V0ID4+IDIpICYgMSwgY2hhbiwgc3JjKSk7CiB9CiAKIHN0YXRpYyBpbnQgZGlvMjAwX3N1YmRldl84MjU0X2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtNjU4LDU0ICs1MTYsNDQgQEAKIAkJCQkgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCQkgICAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKLQlzdHJ1Y3QgZGlvMjAwX3N1YmRldl84MjU0ICpzdWJwcml2ID0gcy0+cHJpdmF0ZTsKLQlpbnQgcmV0ID0gMDsKLQlpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY29uc3Qgc3RydWN0IGRpbzIwMF9ib2FyZCAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0ID0gcy0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCXVuc2lnbmVkIGludCBtYXhfc3JjID0gYm9hcmQtPmlzX3BjaWUgPyAzMSA6IDc7CisJdW5zaWduZWQgaW50IHNyYzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZzdWJwcml2LT5zcGlubG9jaywgZmxhZ3MpOworCWlmICghYm9hcmQtPmhhc19jbGtfZ2F0X3NjZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzd2l0Y2ggKGRhdGFbMF0pIHsKLQljYXNlIElOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREU6Ci0JCWlmIChkYXRhWzFdID4gKEk4MjU0X01PREU1IHwgSTgyNTRfQkNEKSkKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCWRpbzIwMF9zdWJkZXZfODI1NF9zZXRfbW9kZShkZXYsIHMsIGNoYW4sIGRhdGFbMV0pOwotCQlicmVhazsKLQljYXNlIElOU05fQ09ORklHXzgyNTRfUkVBRF9TVEFUVVM6Ci0JCWRhdGFbMV0gPSBkaW8yMDBfc3ViZGV2XzgyNTRfc3RhdHVzKGRldiwgcywgY2hhbik7Ci0JCWJyZWFrOwogCWNhc2UgSU5TTl9DT05GSUdfU0VUX0dBVEVfU1JDOgotCQlyZXQgPSBkaW8yMDBfc3ViZGV2XzgyNTRfc2V0X2dhdGVfc3JjKGRldiwgcywgY2hhbiwgZGF0YVsyXSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0ID0gLUVJTlZBTDsKKwkJc3JjID0gZGF0YVsyXTsKKwkJaWYgKHNyYyA+IG1heF9zcmMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlkaW8yMDBfc3ViZGV2XzgyNTRfc2V0X2dhdGVfc3JjKGRldiwgcywgY2hhbiwgc3JjKTsKKwkJaTgyNTQtPmdhdGVfc3JjW2NoYW5dID0gc3JjOwogCQlicmVhazsKIAljYXNlIElOU05fQ09ORklHX0dFVF9HQVRFX1NSQzoKLQkJcmV0ID0gZGlvMjAwX3N1YmRldl84MjU0X2dldF9nYXRlX3NyYyhkZXYsIHMsIGNoYW4pOwotCQlpZiAocmV0IDwgMCkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWJyZWFrOwotCQl9Ci0JCWRhdGFbMl0gPSByZXQ7CisJCWRhdGFbMl0gPSBpODI1NC0+Z2F0ZV9zcmNbY2hhbl07CiAJCWJyZWFrOwogCWNhc2UgSU5TTl9DT05GSUdfU0VUX0NMT0NLX1NSQzoKLQkJcmV0ID0gZGlvMjAwX3N1YmRldl84MjU0X3NldF9jbG9ja19zcmMoZGV2LCBzLCBjaGFuLCBkYXRhWzFdKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXQgPSAtRUlOVkFMOworCQlzcmMgPSBkYXRhWzFdOworCQlpZiAoc3JjID4gbWF4X3NyYykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWRpbzIwMF9zdWJkZXZfODI1NF9zZXRfY2xvY2tfc3JjKGRldiwgcywgY2hhbiwgc3JjKTsKKwkJaTgyNTQtPmNsb2NrX3NyY1tjaGFuXSA9IHNyYzsKIAkJYnJlYWs7CiAJY2FzZSBJTlNOX0NPTkZJR19HRVRfQ0xPQ0tfU1JDOgotCQlyZXQgPSBkaW8yMDBfc3ViZGV2XzgyNTRfZ2V0X2Nsb2NrX3NyYyhkZXYsIHMsIGNoYW4sICZkYXRhWzJdKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQotCQlkYXRhWzFdID0gcmV0OworCQlkYXRhWzFdID0gaTgyNTQtPmNsb2NrX3NyY1tjaGFuXTsKKwkJZGF0YVsyXSA9IGNsb2NrX3BlcmlvZFtpODI1NC0+Y2xvY2tfc3JjW2NoYW5dXTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7CisJCXJldHVybiAtRUlOVkFMOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdWJwcml2LT5zcGlubG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQgPCAwID8gcmV0IDogaW5zbi0+bjsKKworCXJldHVybiBpbnNuLT5uOwogfQogCiBzdGF0aWMgaW50IGRpbzIwMF9zdWJkZXZfODI1NF9pbml0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCkBAIC03MTMsMzYgKzU2MSw0NiBAQAogCQkJCSAgIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7CiAJY29uc3Qgc3RydWN0IGRpbzIwMF9ib2FyZCAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQlzdHJ1Y3QgZGlvMjAwX3N1YmRldl84MjU0ICpzdWJwcml2OwotCXVuc2lnbmVkIGludCBjaGFuOworCXN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQ7CisJdW5zaWduZWQgaW50IHJlZ3NoaWZ0OworCWludCBjaGFuOwogCi0Jc3VicHJpdiA9IGNvbWVkaV9hbGxvY19zcHJpdihzLCBzaXplb2YoKnN1YnByaXYpKTsKLQlpZiAoIXN1YnByaXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jcy0+dHlwZSA9IENPTUVESV9TVUJEX0NPVU5URVI7Ci0Jcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFIHwgU0RGX1JFQURBQkxFOwotCXMtPm5fY2hhbiA9IDM7Ci0Jcy0+bWF4ZGF0YSA9IDB4RkZGRjsKLQlzLT5pbnNuX3JlYWQgPSBkaW8yMDBfc3ViZGV2XzgyNTRfcmVhZDsKLQlzLT5pbnNuX3dyaXRlID0gZGlvMjAwX3N1YmRldl84MjU0X3dyaXRlOwotCXMtPmluc25fY29uZmlnID0gZGlvMjAwX3N1YmRldl84MjU0X2NvbmZpZzsKLQotCXNwaW5fbG9ja19pbml0KCZzdWJwcml2LT5zcGlubG9jayk7Ci0Jc3VicHJpdi0+b2ZzID0gb2Zmc2V0OwotCWlmIChib2FyZC0+aGFzX2Nsa19nYXRfc2NlKSB7Ci0JCS8qIERlcml2ZSBDTEtfU0NFIGFuZCBHQVRfU0NFIHJlZ2lzdGVyIG9mZnNldHMgZnJvbQotCQkgKiA4MjU0IG9mZnNldC4gKi8KLQkJc3VicHJpdi0+Y2xrX3NjZV9vZnMgPSBESU8yMDBfWENMS19TQ0UgKyAob2Zmc2V0ID4+IDMpOwotCQlzdWJwcml2LT5nYXRfc2NlX29mcyA9IERJTzIwMF9YR0FUX1NDRSArIChvZmZzZXQgPj4gMyk7Ci0JCXN1YnByaXYtPndoaWNoID0gKG9mZnNldCA+PiAyKSAmIDE7CisJLyoKKwkgKiBQQ0llIGJvYXJkcyBuZWVkIHRoZSBvZmZzZXQgc2hpZnRlZCBpbiBvcmRlciB0byBnZXQgdGhlCisJICogY29ycmVjdCBiYXNlIGFkZHJlc3Mgb2YgdGhlIHRpbWVyLgorCSAqLworCWlmIChib2FyZC0+aXNfcGNpZSkgeworCQlvZmZzZXQgPDw9IDM7CisJCXJlZ3NoaWZ0ID0gMzsKKwl9IGVsc2UgeworCQlyZWdzaGlmdCA9IDA7CiAJfQogCisJaWYgKGRldi0+bW1pbykKKwkJaTgyNTQgPSBjb21lZGlfODI1NF9tbV9pbml0KGRldi0+bW1pbyArIG9mZnNldCwKKwkJCQkJICAgIDAsIEk4MjU0X0lPOCwgcmVnc2hpZnQpOworCWVsc2UKKwkJaTgyNTQgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgb2Zmc2V0LAorCQkJCQkgMCwgSTgyNTRfSU84LCByZWdzaGlmdCk7CisJaWYgKCFpODI1NCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljb21lZGlfODI1NF9zdWJkZXZpY2VfaW5pdChzLCBpODI1NCk7CisKKwlpODI1NC0+aW5zbl9jb25maWcgPSBkaW8yMDBfc3ViZGV2XzgyNTRfY29uZmlnOworCisJLyoKKwkgKiBUaGVyZSBjb3VsZCBiZSBtdWx0aXBsZSB0aW1lcnMgc28gdGhpcyBkcml2ZXIgZG9lcyBub3QKKwkgKiB1c2UgZGV2LT5wYWNlciB0byBzYXZlIHRoZSBpODI1NCBwb2ludGVyLiBJbnN0ZWFkLAorCSAqIGNvbWVkaV84MjU0X3N1YmRldmljZV9pbml0KCkgc2F2ZWQgdGhlIGk4MjU0IHBvaW50ZXIgaW4KKwkgKiBzLT5wcml2YXRlLiBTZXQgdGhlIHJ1bmZsYWcgYml0IHNvIHRoYXQgdGhlIGNvcmUgd2lsbAorCSAqIGF1dG9tYXRpY2FsbHkgZnJlZSBpdCB3aGVuIHRoZSBkcml2ZXIgaXMgZGV0YWNoZWQuCisJICovCisJcy0+cnVuZmxhZ3MgfD0gQ09NRURJX1NSRl9GUkVFX1NQUklWOworCiAJLyogSW5pdGlhbGl6ZSBjaGFubmVscy4gKi8KLQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgMzsgY2hhbisrKSB7Ci0JCWRpbzIwMF9zdWJkZXZfODI1NF9zZXRfbW9kZShkZXYsIHMsIGNoYW4sCi0JCQkJCSAgICBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7Ci0JCWlmIChib2FyZC0+aGFzX2Nsa19nYXRfc2NlKSB7CisJaWYgKGJvYXJkLT5oYXNfY2xrX2dhdF9zY2UpIHsKKwkJZm9yIChjaGFuID0gMDsgY2hhbiA8IDM7IGNoYW4rKykgewogCQkJLyogR2F0ZSBzb3VyY2UgMCBpcyBWQ0MgKGxvZ2ljIDEpLiAqLwogCQkJZGlvMjAwX3N1YmRldl84MjU0X3NldF9nYXRlX3NyYyhkZXYsIHMsIGNoYW4sIDApOwogCQkJLyogQ2xvY2sgc291cmNlIDAgaXMgdGhlIGRlZGljYXRlZCBjbG9jayBpbnB1dC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDBfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfZGlvMjAwX3BjaS5jCmluZGV4IGI4M2QxZjUuLmQ5ODUwYzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19kaW8yMDBfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX2RpbzIwMF9wY2kuYwpAQCAtMjIxLDEwICsyMjEsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2luY2x1ZGUgImFtcGxjX2RpbzIwMC5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyMzZfY29tbW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGMyMzZfY29tbW9uLmMKaW5kZXggYmU4NzE3Mi4uMjQ1ZjkzMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjMjM2X2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wYzIzNl9jb21tb24uYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCiAjaW5jbHVkZSAiYW1wbGNfcGMyMzYuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICI4MjU1LmgiCiAKIHN0YXRpYyB2b2lkIHBjMjM2X2ludHJfdXBkYXRlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGJvb2wgZW5hYmxlKQpAQCAtODIsMTEgKzgxLDExIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CkBAIC05NiwxMSArOTUsMTIgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaXQgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0xOTUsNyArMTk1LDYgQEAKIH0KIG1vZHVsZV9leGl0KGFtcGxjX3BjMjM2X2NvbW1vbl9leGl0KTsKIAotCiBNT0RVTEVfQVVUSE9SKCJDb21lZGkgaHR0cDovL3d3dy5jb21lZGkub3JnIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaSBoZWxwZXIgZm9yIGFtcGxjX3BjMjM2IGFuZCBhbXBsY19wY2kyMzYiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMjQuYwppbmRleCA5MjRjODI5Li4wOGE5MTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjI0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIyNC5jCkBAIC0xMDMsMjIgKzEwMywxNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKIAogLyoKICAqIFBDSTIyNC8yMzQgaS9vIHNwYWNlIDEgKFBDSUJBUjIpIHJlZ2lzdGVycy4KICAqLwotI2RlZmluZSBQQ0kyMjRfWjJfQ1QwCTB4MTQJLyogODJDNTQgY291bnRlci90aW1lciAwICovCi0jZGVmaW5lIFBDSTIyNF9aMl9DVDEJMHgxNQkvKiA4MkM1NCBjb3VudGVyL3RpbWVyIDEgKi8KLSNkZWZpbmUgUENJMjI0X1oyX0NUMgkweDE2CS8qIDgyQzU0IGNvdW50ZXIvdGltZXIgMiAqLwotI2RlZmluZSBQQ0kyMjRfWjJfQ1RDCTB4MTcJLyogODJDNTQgY291bnRlci90aW1lciBjb250cm9sIHdvcmQgKi8KKyNkZWZpbmUgUENJMjI0X1oyX0JBU0UJMHgxNAkvKiA4MkM1NCBjb3VudGVyL3RpbWVyICovCiAjZGVmaW5lIFBDSTIyNF9aQ0xLX1NDRQkweDFBCS8qIEdyb3VwIFogQ2xvY2sgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwogI2RlZmluZSBQQ0kyMjRfWkdBVF9TQ0UJMHgxRAkvKiBHcm91cCBaIEdhdGUgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLwogI2RlZmluZSBQQ0kyMjRfSU5UX1NDRQkweDFFCS8qIElTUiBJbnRlcnJ1cHQgc291cmNlIG1hc2sgcmVnaXN0ZXIgKi8KQEAgLTM3OSw4ICszNzQsNiBAQAogCWludCBpbnRyX2NwdWlkOwogCXNob3J0IGludHJfcnVubmluZzsKIAl1bnNpZ25lZCBzaG9ydCBkYWNjb247Ci0JdW5zaWduZWQgaW50IGNhY2hlZF9kaXYxOwotCXVuc2lnbmVkIGludCBjYWNoZWRfZGl2MjsKIAl1bnNpZ25lZCBzaG9ydCBhb19lbmFiOwkvKiBtYXggMTYgY2hhbm5lbHMgc28gJ3Nob3J0JyB3aWxsIGRvICovCiAJdW5zaWduZWQgY2hhciBpbnRzY2U7CiB9OwpAQCAtNDUxLDcgKzQ0NCw2IEBACiAJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoQU9fQ01EX1NUQVJURUQsICZkZXZwcml2LT5zdGF0ZSkpCiAJCXJldHVybjsKIAotCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldnByaXYtPmFvX3NwaW5sb2NrLCBmbGFncyk7CiAJLyogS2lsbCB0aGUgaW50ZXJydXB0cy4gKi8KIAlkZXZwcml2LT5pbnRzY2UgPSAwOwpAQCAtNjY4LDI4ICs2NjAsMjcgQEAKIHBjaTIyNF9hb19jbWR0ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7Ci0Jc3RydWN0IHBjaTIyNF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGludCBhcmc7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19JTlQgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKLQkJCQkgICAgIFRSSUdfRVhUIHwgVFJJR19USU1FUik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLAotCQkJCSAgICAgVFJJR19DT1VOVCB8IFRSSUdfRVhUIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19JTlQgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwkJCQkJVFJJR19FWFQgfCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsCisJCQkJCVRSSUdfQ09VTlQgfCBUUklHX0VYVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNzE0LDcgKzcwNSw3IEBACiAKIAlzd2l0Y2ggKGNtZC0+c3RhcnRfc3JjKSB7CiAJY2FzZSBUUklHX0lOVDoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAJCWJyZWFrOwogCWNhc2UgVFJJR19FWFQ6CiAJCS8qIEZvcmNlIHRvIGV4dGVybmFsIHRyaWdnZXIgMC4gKi8KQEAgLTczNCwxMyArNzI1LDEzIEBACiAKIAlzd2l0Y2ggKGNtZC0+c2Nhbl9iZWdpbl9zcmMpIHsKIAljYXNlIFRSSUdfVElNRVI6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIE1BWF9TQ0FOX1BFUklPRCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIE1BWF9TQ0FOX1BFUklPRCk7CiAKIAkJYXJnID0gY21kLT5jaGFubGlzdF9sZW4gKiBDT05WRVJUX1BFUklPRDsKIAkJaWYgKGFyZyA8IE1JTl9TQ0FOX1BFUklPRCkKIAkJCWFyZyA9IE1JTl9TQ0FOX1BFUklPRDsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCQlicmVhazsKIAljYXNlIFRSSUdfRVhUOgogCQkvKiBGb3JjZSB0byBleHRlcm5hbCB0cmlnZ2VyIDAuICovCkBAIC03NjAsMTIgKzc1MSwxMyBAQAogCQlicmVhazsKIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlzd2l0Y2ggKGNtZC0+c3RvcF9zcmMpIHsKIAljYXNlIFRSSUdfQ09VTlQ6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCQlicmVhazsKIAljYXNlIFRSSUdfRVhUOgogCQkvKiBGb3JjZSB0byBleHRlcm5hbCB0cmlnZ2VyIDAuICovCkBAIC03ODEsNyArNzczLDcgQEAKIAkJfQogCQlicmVhazsKIAljYXNlIFRSSUdfTk9ORToKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCQlicmVhazsKIAl9CiAKQEAgLTc5MywxMSArNzg1LDggQEAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CiAJCS8qIFVzZSB0d28gdGltZXJzLiAqLwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzEwTUhaLAotCQkJCQkgICZkZXZwcml2LT5jYWNoZWRfZGl2MSwKLQkJCQkJICAmZGV2cHJpdi0+Y2FjaGVkX2RpdjIsCi0JCQkJCSAgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGVycikKQEAgLTgxNyw3ICs4MDYsNiBAQAogCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJc3RydWN0IHBjaTIyNF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldnByaXYtPmlvYmFzZTEgKyBQQ0kyMjRfWjJfQ1QwOwogCiAJLyoKIAkgKiBUaGUgb3V0cHV0IG9mIHRpbWVyIFoyLTAgd2lsbCBiZSB1c2VkIGFzIHRoZSBzY2FuIHRyaWdnZXIKQEAgLTgzMCwxNCArODE4LDEwIEBACiAJb3V0YihHQVRfQ09ORklHKDIsIEdBVF9WQ0MpLCBkZXZwcml2LT5pb2Jhc2UxICsgUENJMjI0X1pHQVRfU0NFKTsKIAkvKiBaMi0yIG5lZWRzIDEwIE1IeiBjbG9jay4gKi8KIAlvdXRiKENMS19DT05GSUcoMiwgQ0xLXzEwTUhaKSwgZGV2cHJpdi0+aW9iYXNlMSArIFBDSTIyNF9aQ0xLX1NDRSk7Ci0JLyogTG9hZCBaMi0yIG1vZGUgKDIpIGFuZCBjb3VudGVyIChkaXYxKS4gKi8KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAyLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+Y2FjaGVkX2RpdjEpOwogCS8qIFoyLTAgaXMgY2xvY2tlZCBmcm9tIFoyLTIncyBvdXRwdXQuICovCiAJb3V0YihDTEtfQ09ORklHKDAsIENMS19PVVROTTEpLCBkZXZwcml2LT5pb2Jhc2UxICsgUENJMjI0X1pDTEtfU0NFKTsKLQkvKiBMb2FkIFoyLTAgbW9kZSAoMikgYW5kIGNvdW50ZXIgKGRpdjIpLiAqLwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDAsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAwLCBkZXZwcml2LT5jYWNoZWRfZGl2Mik7CisKKwljb21lZGlfODI1NF9wYWNlcl9lbmFibGUoZGV2LT5wYWNlciwgMiwgMCwgZmFsc2UpOwogfQogCiBzdGF0aWMgaW50IHBjaTIyNF9hb19jbWQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCkBAIC04NTIsMTAgKzgzNiw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIENhbm5vdCBoYW5kbGUgbnVsbC9lbXB0eSBjaGFubGlzdC4gKi8KLQlpZiAoY21kLT5jaGFubGlzdCA9PSBOVUxMIHx8IGNtZC0+Y2hhbmxpc3RfbGVuID09IDApCisJaWYgKCFjbWQtPmNoYW5saXN0IHx8IGNtZC0+Y2hhbmxpc3RfbGVuID09IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0KIAkvKiBEZXRlcm1pbmUgd2hpY2ggY2hhbm5lbHMgYXJlIGVuYWJsZWQgYW5kIHRoZWlyIGxvYWQgb3JkZXIuICAqLwogCWRldnByaXYtPmFvX2VuYWIgPSAwOwogCkBAIC04OTMsOCArODc2LDEwIEBACiAJb3V0dyhkZXZwcml2LT5kYWNjb24gfCBQQ0kyMjRfREFDQ09OX0ZJRk9SRVNFVCwKIAkgICAgIGRldi0+aW9iYXNlICsgUENJMjI0X0RBQ0NPTik7CiAKLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKQorCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKGRldi0+cGFjZXIpOwogCQlwY2kyMjRfYW9fc3RhcnRfcGFjZXIoZGV2LCBzKTsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2cHJpdi0+YW9fc3BpbmxvY2ssIGZsYWdzKTsKIAlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19JTlQpIHsKQEAgLTEwNDIsMTQgKzEwMjcsMTIgQEAKIAlpZiAoIWRldnByaXYtPmFvX3NjYW5fdmFscykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQogCS8qIEFsbG9jYXRlIGJ1ZmZlciB0byBob2xkIEFPIGNoYW5uZWwgc2NhbiBvcmRlci4gKi8KIAlkZXZwcml2LT5hb19zY2FuX29yZGVyID0ga21hbGxvYyhzaXplb2YoZGV2cHJpdi0+YW9fc2Nhbl9vcmRlclswXSkgKgogCQkJCQkgdGhpc2JvYXJkLT5hb19jaGFucywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkZXZwcml2LT5hb19zY2FuX29yZGVyKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCiAJLyogRGlzYWJsZSBpbnRlcnJ1cHQgc291cmNlcy4gKi8KIAlkZXZwcml2LT5pbnRzY2UgPSAwOwogCW91dGIoMCwgZGV2cHJpdi0+aW9iYXNlMSArIFBDSTIyNF9JTlRfU0NFKTsKQEAgLTEwNjMsNiArMTA0NiwxMSBAQAogCW91dHcoZGV2cHJpdi0+ZGFjY29uIHwgUENJMjI0X0RBQ0NPTl9GSUZPUkVTRVQsCiAJICAgICBkZXYtPmlvYmFzZSArIFBDSTIyNF9EQUNDT04pOwogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2cHJpdi0+aW9iYXNlMSArIFBDSTIyNF9aMl9CQVNFLAorCQkJCSAgICAgIEk4MjU0X09TQ19CQVNFXzEwTUhaLCBJODI1NF9JTzgsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDEpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjMwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjMwLmMKaW5kZXggNDk4MDZhNS4uMjBkNTkyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzAuYwpAQCAtMTgxLDE0ICsxODEsMTIgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotI2luY2x1ZGUgIjgyNTMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogI2luY2x1ZGUgIjgyNTUuaCIKIAogLyoKQEAgLTIwNiwxMCArMjA0LDYgQEAKICNkZWZpbmUgUENJMjMwX1BQSV9YX0MJCTB4MDIJLyogVXNlciBQUEkgKDgyQzU1KSBwb3J0IEMgKi8KICNkZWZpbmUgUENJMjMwX1BQSV9YX0NNRAkweDAzCS8qIFVzZXIgUFBJICg4MkM1NSkgY29udHJvbCB3b3JkICovCiAjZGVmaW5lIFBDSTIzMF9aMl9DVF9CQVNFCTB4MTQJLyogODJDNTQgY291bnRlci90aW1lciBiYXNlICovCi0jZGVmaW5lIFBDSTIzMF9aMl9DVDAJCTB4MTQJLyogODJDNTQgY291bnRlci90aW1lciAwICovCi0jZGVmaW5lIFBDSTIzMF9aMl9DVDEJCTB4MTUJLyogODJDNTQgY291bnRlci90aW1lciAxICovCi0jZGVmaW5lIFBDSTIzMF9aMl9DVDIJCTB4MTYJLyogODJDNTQgY291bnRlci90aW1lciAyICovCi0jZGVmaW5lIFBDSTIzMF9aMl9DVEMJCTB4MTcJLyogODJDNTQgY291bnRlci90aW1lciBjb250cm9sIHdvcmQgKi8KICNkZWZpbmUgUENJMjMwX1pDTEtfU0NFCQkweDFBCS8qIEdyb3VwIFogQ2xvY2sgQ29uZmlndXJhdGlvbiAqLwogI2RlZmluZSBQQ0kyMzBfWkdBVF9TQ0UJCTB4MUQJLyogR3JvdXAgWiBHYXRlIENvbmZpZ3VyYXRpb24gKi8KICNkZWZpbmUgUENJMjMwX0lOVF9TQ0UJCTB4MUUJLyogSW50ZXJydXB0IHNvdXJjZSBtYXNrICh3KSAqLwpAQCAtMzc3LDEyICszNzEsNiBAQAogI2RlZmluZSBDTEtfRVhUCQk3CS8qIGV4dGVybmFsIGNsb2NrICovCiAvKiBNYWNybyB0byBjb25zdHJ1Y3QgY2xvY2sgaW5wdXQgY29uZmlndXJhdGlvbiByZWdpc3RlciB2YWx1ZS4gKi8KICNkZWZpbmUgQ0xLX0NPTkZJRyhjaGFuLCBzcmMpCSgoKChjaGFuKSAmIDMpIDw8IDMpIHwgKChzcmMpICYgNykpCi0vKiBUaW1lYmFzZXMgaW4gbnMuICovCi0jZGVmaW5lIFRJTUVCQVNFXzEwTUhaCQkxMDAKLSNkZWZpbmUgVElNRUJBU0VfMU1IWgkJMTAwMAotI2RlZmluZSBUSU1FQkFTRV8xMDBLSFoJCTEwMDAwCi0jZGVmaW5lIFRJTUVCQVNFXzEwS0haCQkxMDAwMDAKLSNkZWZpbmUgVElNRUJBU0VfMUtIWgkJMTAwMDAwMAogCiAvKgogICogQ291bnRlci90aW1lciBnYXRlIGlucHV0IGNvbmZpZ3VyYXRpb24gc291cmNlcy4KQEAgLTUwNywxMSArNDk1LDExIEBACiAKIC8qIFBDSTIzMCBjbG9jayBzb3VyY2UgcGVyaW9kcyBpbiBucyAqLwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwY2kyMzBfdGltZWJhc2VbOF0gPSB7Ci0JW0NMS18xME1IWl0gPSBUSU1FQkFTRV8xME1IWiwKLQlbQ0xLXzFNSFpdID0gVElNRUJBU0VfMU1IWiwKLQlbQ0xLXzEwMEtIWl0gPSBUSU1FQkFTRV8xMDBLSFosCi0JW0NMS18xMEtIWl0gPSBUSU1FQkFTRV8xMEtIWiwKLQlbQ0xLXzFLSFpdID0gVElNRUJBU0VfMUtIWiwKKwlbQ0xLXzEwTUhaXQk9IEk4MjU0X09TQ19CQVNFXzEwTUhaLAorCVtDTEtfMU1IWl0JPSBJODI1NF9PU0NfQkFTRV8xTUhaLAorCVtDTEtfMTAwS0haXQk9IEk4MjU0X09TQ19CQVNFXzEwMEtIWiwKKwlbQ0xLXzEwS0haXQk9IEk4MjU0X09TQ19CQVNFXzEwS0haLAorCVtDTEtfMUtIWl0JPSBJODI1NF9PU0NfQkFTRV8xS0haLAogfTsKIAogLyogUENJMjMwIGFuYWxvZ3VlIGlucHV0IHJhbmdlIHRhYmxlICovCkBAIC02OTUsNyArNjgzLDcgQEAKIAl1bnNpZ25lZCBpbnQgY291bnQ7CiAKIAkvKiBTZXQgbW9kZS4gKi8KLQlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIFBDSTIzMF9aMl9DVF9CQVNFLCAwLCBjdCwgbW9kZSk7CisJY29tZWRpXzgyNTRfc2V0X21vZGUoZGV2LT5wYWNlciwgY3QsIG1vZGUpOwogCS8qIERldGVybWluZSBjbG9jayBzb3VyY2UgYW5kIGNvdW50LiAqLwogCWNsa19zcmMgPSBwY2kyMzBfY2hvb3NlX2Nsa19jb3VudChucywgJmNvdW50LCBmbGFncyk7CiAJLyogUHJvZ3JhbSBjbG9jayBzb3VyY2UuICovCkBAIC03MDQsMTMgKzY5MiwxMyBAQAogCWlmIChjb3VudCA+PSA2NTUzNikKIAkJY291bnQgPSAwOwogCi0JaTgyNTRfd3JpdGUoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfWjJfQ1RfQkFTRSwgMCwgY3QsIGNvdW50KTsKKwljb21lZGlfODI1NF93cml0ZShkZXYtPnBhY2VyLCBjdCwgY291bnQpOwogfQogCiBzdGF0aWMgdm9pZCBwY2kyMzBfY2FuY2VsX2N0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBjdCkKIHsKLQlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIFBDSTIzMF9aMl9DVF9CQVNFLCAwLCBjdCwgSTgyNTRfTU9ERTEpOwogCS8qIENvdW50ZXIgY3QsIDgyNTQgbW9kZSAxLCBpbml0aWFsIGNvdW50IG5vdCB3cml0dGVuLiAqLworCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldi0+cGFjZXIsIGN0LCBJODI1NF9NT0RFMSk7CiB9CiAKIHN0YXRpYyBpbnQgcGNpMjMwX2FpX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LApAQCAtNzYwLDcgKzc0OCw3IEBACiAJICovCiAJYWRjY29uID0gUENJMjMwX0FEQ19UUklHX1oyQ1QyIHwgUENJMjMwX0FEQ19GSUZPX0VOOwogCS8qIFNldCBaMi1DVDIgb3V0cHV0IGxvdyB0byBhdm9pZCBhbnkgZmFsc2UgdHJpZ2dlcnMuICovCi0JaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfWjJfQ1RfQkFTRSwgMCwgMiwgSTgyNTRfTU9ERTApOworCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldi0+cGFjZXIsIDIsIEk4MjU0X01PREUwKTsKIAlkZXZwcml2LT5haV9iaXBvbGFyID0gY29tZWRpX3JhbmdlX2lzX2JpcG9sYXIocywgcmFuZ2UpOwogCWlmIChhcmVmID09IEFSRUZfRElGRikgewogCQkvKiBEaWZmZXJlbnRpYWwuICovCkBAIC04MTEsMTAgKzc5OSw4IEBACiAJCSAqIFRyaWdnZXIgY29udmVyc2lvbiBieSB0b2dnbGluZyBaMi1DVDIgb3V0cHV0CiAJCSAqIChmaW5pc2ggd2l0aCBvdXRwdXQgaGlnaCkuCiAJCSAqLwotCQlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIFBDSTIzMF9aMl9DVF9CQVNFLCAwLAotCQkJICAgICAgIDIsIEk4MjU0X01PREUwKTsKLQkJaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0kyMzBfWjJfQ1RfQkFTRSwgMCwKLQkJCSAgICAgICAyLCBJODI1NF9NT0RFMSk7CisJCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldi0+cGFjZXIsIDIsIEk4MjU0X01PREUwKTsKKwkJY29tZWRpXzgyNTRfc2V0X21vZGUoZGV2LT5wYWNlciwgMiwgSTgyNTRfTU9ERTEpOwogCiAJCS8qIHdhaXQgZm9yIGNvbnZlcnNpb24gdG8gZW5kICovCiAJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgcGNpMjMwX2FpX2VvYywgMCk7CkBAIC04OTgsNyArODg0LDcgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX0lOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfSU5UKTsKIAogCXRtcCA9IFRSSUdfVElNRVIgfCBUUklHX0lOVDsKIAlpZiAodGhpc2JvYXJkLT5taW5faHd2ZXIgPiAwICYmIGRldnByaXYtPmh3dmVyID49IDIpIHsKQEAgLTkxOCwxOSArOTA0LDE5IEBACiAJCSAqLwogCQl0bXAgfD0gVFJJR19FWFQ7CiAJfQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIHRtcCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgdG1wKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC05MzksNyArOTI1LDcgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKICNkZWZpbmUgTUFYX1NQRUVEX0FPCTgwMDAJLyogODAwMCBucyA9PiAxMjUga0h6ICovCiAvKgpAQCAtOTUwLDEwICs5MzYsMTAgQEAKIAogCXN3aXRjaCAoY21kLT5zY2FuX2JlZ2luX3NyYykgewogCWNhc2UgVFJJR19USU1FUjoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgTUFYX1NQRUVEX0FPKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgTUlOX1NQRUVEX0FPKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgTUFYX1NQRUVEX0FPKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgTUlOX1NQRUVEX0FPKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklHX0VYVDoKIAkJLyoKQEAgLTk3OCwxNiArOTY0LDE3IEBACiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCQlicmVhazsKIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTE1MjAsNyArMTUwNyw3IEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0lOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19JTlQpOwogCiAJdG1wID0gVFJJR19GT0xMT1cgfCBUUklHX1RJTUVSIHwgVFJJR19JTlQ7CiAJaWYgKHRoaXNib2FyZC0+aGF2ZV9kaW8gfHwgdGhpc2JvYXJkLT5taW5faHd2ZXIgPiAwKSB7CkBAIC0xNTMyLDIxICsxNTE5LDIxIEBACiAJCSAqLwogCQl0bXAgfD0gVFJJR19FWFQ7CiAJfQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIHRtcCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCB0bXApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCiAJCQkJCVRSSUdfVElNRVIgfCBUUklHX0lOVCB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0xNTYzLDcgKzE1NTAsNyBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAogI2RlZmluZSBNQVhfU1BFRURfQUlfU0UJCTMyMDAJLyogUENJMjMwIFNFOiAgIDMyMDAgbnMgPT4gMzEyLjUga0h6ICovCiAjZGVmaW5lIE1BWF9TUEVFRF9BSV9ESUZGCTgwMDAJLyogUENJMjMwIERJRkY6IDgwMDAgbnMgPT4gMTI1IGtIeiAqLwpAQCAtMTU5OCwxMCArMTU4NSwxMCBAQAogCQkJbWF4X3NwZWVkX2FpID0gTUFYX1NQRUVEX0FJX1BMVVM7CiAJCX0KIAotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSBtYXhfc3BlZWRfYWkpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSBNSU5fU1BFRURfQUkpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICBtYXhfc3BlZWRfYWkpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICBNSU5fU1BFRURfQUkpOwogCX0gZWxzZSBpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX0VYVCkgewogCQkvKgogCQkgKiBleHRlcm5hbCB0cmlnZ2VyCkBAIC0xNjM2LDE4ICsxNjIzLDIwIEBACiAJCQkgKiBjb252ZXJ0X2FyZyA9PSAwID0+IHRyaWdnZXIgb24gLXZlIGVkZ2UuCiAJCQkgKiBjb252ZXJ0X2FyZyA9PSAxID0+IHRyaWdnZXIgb24gK3ZlIGVkZ2UuCiAJCQkgKi8KLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLCAxKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJCSAgICAxKTsKIAkJfQogCX0gZWxzZSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCkgewogCQkvKgpAQCAtMTY3Miw3ICsxNjYxLDcgQEAKIAkJCWVyciB8PSAtRUlOVkFMOwogCiAJfSBlbHNlIHsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCX0KIAogCWlmIChlcnIpCkBAIC0xNzY3LDggKzE3NTYsOCBAQAogCSAqIFRyaWdnZXIgY29udmVyc2lvbiBieSB0b2dnbGluZyBaMi1DVDIgb3V0cHV0LgogCSAqIEZpbmlzaCB3aXRoIG91dHB1dCBoaWdoLgogCSAqLwotCWk4MjU0X3NldF9tb2RlKGRldi0+aW9iYXNlICsgUENJMjMwX1oyX0NUX0JBU0UsIDAsIDIsIEk4MjU0X01PREUwKTsKLQlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIFBDSTIzMF9aMl9DVF9CQVNFLCAwLCAyLCBJODI1NF9NT0RFMSk7CisJY29tZWRpXzgyNTRfc2V0X21vZGUoZGV2LT5wYWNlciwgMiwgSTgyNTRfTU9ERTApOworCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldi0+cGFjZXIsIDIsIEk4MjU0X01PREUxKTsKIAkvKgogCSAqIERlbGF5LiAgU2hvdWxkIGRyaXZlciBiZSByZXNwb25zaWJsZSBmb3IgdGhpcz8gIEFuCiAJICogYWx0ZXJuYXRpdmUgd291bGQgYmUgdG8gd2FpdCB1bnRpbCBjb252ZXJzaW9uIGlzIGNvbXBsZXRlLApAQCAtMjE4OSw3ICsyMTc4LDcgQEAKIAkgKiBTZXQgY291bnRlci90aW1lciAyIG91dHB1dCBoaWdoIGZvciB1c2UgYXMgdGhlIGluaXRpYWwgc3RhcnQKIAkgKiBjb252ZXJzaW9uIHNvdXJjZS4KIAkgKi8KLQlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIFBDSTIzMF9aMl9DVF9CQVNFLCAwLCAyLCBJODI1NF9NT0RFMSk7CisJY29tZWRpXzgyNTRfc2V0X21vZGUoZGV2LT5wYWNlciwgMiwgSTgyNTRfTU9ERTEpOwogCiAJLyoKIAkgKiBUZW1wb3JhcmlseSB1c2UgQ1QyIG91dHB1dCBhcyBjb252ZXJzaW9uIHRyaWdnZXIgc291cmNlIGFuZApAQCAtMjM5Myw3ICsyMzgyLDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmZGV2cHJpdi0+YW9fc3RvcF9zcGlubG9jayk7CiAKIAlkZXYtPmJvYXJkX3B0ciA9IHBjaTIzMF9maW5kX3BjaV9ib2FyZChwY2lfZGV2KTsKLQlpZiAoZGV2LT5ib2FyZF9wdHIgPT0gTlVMTCkgeworCWlmICghZGV2LT5ib2FyZF9wdHIpIHsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKIAkJCSJhbXBsY19wY2kyMzA6IEJVRyEgY2Fubm90IGRldGVybWluZSBib2FyZCB0eXBlIVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjQ4MSw2ICsyNDcwLDExIEBACiAJCQlkZXYtPmlycSA9IHBjaV9kZXYtPmlycTsKIAl9CiAKKwlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIFBDSTIzMF9aMl9DVF9CQVNFLAorCQkJCSAgICAgIDAsIEk4MjU0X0lPOCwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJjID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAzKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyMzYuYwppbmRleCBhZDFlOTNkLi4zMWNjMzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjM2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTIzNi5jCkBAIC00MiwxMCArNDIsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2luY2x1ZGUgImFtcGxjX3BjMjM2LmgiCiAjaW5jbHVkZSAicGx4OTA1Mi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTI2My5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2FtcGxjX3BjaTI2My5jCmluZGV4IDBkMjIyNGIuLmI2NzY4YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9hbXBsY19wY2kyNjMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvYW1wbGNfcGNpMjYzLmMKQEAgLTMzLDkgKzMzLDggQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogc3RhdGljIGludCBwY2kyNjNfZG9faW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfZGFzMTZfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCmluZGV4IDEwNzliNmMuLmFlODRmMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9kYXMxNl9jcy5jCkBAIC0zMCw4ICszMCw2IEBACiBBdXRob3I6IGRzCiBVcGRhdGVkOiBNb24sIDA0IE5vdiAyMDAyIDIwOjA0OjIxIC0wODAwCiBTdGF0dXM6IGV4cGVyaW1lbnRhbAotCi0KICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTQwLDE3ICszOCwxMyBAQAogCiAjaW5jbHVkZSAiLi4vY29tZWRpX3BjbWNpYS5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKICNkZWZpbmUgREFTMTZDU19BRENfREFUQQkJMAogI2RlZmluZSBEQVMxNkNTX0RJT19NVVgJCQkyCiAjZGVmaW5lIERBUzE2Q1NfTUlTQzEJCQk0CiAjZGVmaW5lIERBUzE2Q1NfTUlTQzIJCQk2Ci0jZGVmaW5lIERBUzE2Q1NfQ1RSMAkJCTgKLSNkZWZpbmUgREFTMTZDU19DVFIxCQkJMTAKLSNkZWZpbmUgREFTMTZDU19DVFIyCQkJMTIKLSNkZWZpbmUgREFTMTZDU19DVFJfQ09OVFJPTAkJMTQKKyNkZWZpbmUgREFTMTZDU19USU1FUl9CQVNFCQk4CiAjZGVmaW5lIERBUzE2Q1NfRElPCQkJMTYKIAogc3RydWN0IGRhczE2Y3NfYm9hcmQgewpAQCAtMjc5LDYgKzI3MywxMSBAQAogCWlmICghZGV2cHJpdikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIERBUzE2Q1NfVElNRVJfQkFTRSwKKwkJCQkgICAgICBJODI1NF9PU0NfQkFTRV8xME1IWiwgSTgyNTRfSU8xNiwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXMuYwppbmRleCBkZDBjNjVhLi5lMzU5MWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGFzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhcy5jCkBAIC02MiwxNiArNjIsMTQgQEAKICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAjaW5jbHVkZSAiODI1NS5oIgogI2luY2x1ZGUgImFtY2NfczU5MzMuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKIAogI2RlZmluZSBBSV9CVUZGRVJfU0laRQkJMTAyNAkvKiBtYXggYWkgZmlmbyBzaXplICovCiAjZGVmaW5lIEFPX0JVRkZFUl9TSVpFCQkxMDI0CS8qIG1heCBhbyBmaWZvIHNpemUgKi8KQEAgLTMzOCwxNCArMzM2LDEyIEBACiB9OwogCiBzdHJ1Y3QgY2JfcGNpZGFzX3ByaXZhdGUgeworCXN0cnVjdCBjb21lZGlfODI1NCAqYW9fcGFjZXI7CiAJLyogYmFzZSBhZGRyZXNzZXMgKi8KIAl1bnNpZ25lZCBsb25nIHM1OTMzX2NvbmZpZzsKIAl1bnNpZ25lZCBsb25nIGNvbnRyb2xfc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgYWRjX2ZpZm87CiAJdW5zaWduZWQgbG9uZyBhb19yZWdpc3RlcnM7Ci0JLyogZGl2aXNvcnMgb2YgbWFzdGVyIGNsb2NrIGZvciBhbmFsb2cgaW5wdXQgcGFjaW5nICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3IxOwotCXVuc2lnbmVkIGludCBkaXZpc29yMjsKIAkvKiBiaXRzIHRvIHdyaXRlIHRvIHJlZ2lzdGVycyAqLwogCXVuc2lnbmVkIGludCBhZGNfZmlmb19iaXRzOwogCXVuc2lnbmVkIGludCBzNTkzM19pbnRjc3JfYml0czsKQEAgLTM1Myw5ICszNDksNiBAQAogCS8qIGZpZm8gYnVmZmVycyAqLwogCXVuc2lnbmVkIHNob3J0IGFpX2J1ZmZlcltBSV9CVUZGRVJfU0laRV07CiAJdW5zaWduZWQgc2hvcnQgYW9fYnVmZmVyW0FPX0JVRkZFUl9TSVpFXTsKLQkvKiBkaXZpc29ycyBvZiBtYXN0ZXIgY2xvY2sgZm9yIGFuYWxvZyBvdXRwdXQgcGFjaW5nICovCi0JdW5zaWduZWQgaW50IGFvX2Rpdmlzb3IxOwotCXVuc2lnbmVkIGludCBhb19kaXZpc29yMjsKIAl1bnNpZ25lZCBpbnQgY2FsaWJyYXRpb25fc291cmNlOwogfTsKIApAQCAtNTMwLDcgKzUyMyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgbnZyYW1fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgYWRkcmVzcywKLQkJCXVpbnQ4X3QgKmRhdGEpCisJCSAgICAgIHVpbnQ4X3QgKmRhdGEpCiB7CiAJc3RydWN0IGNiX3BjaWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGxvbmcgaW9iYXNlID0gZGV2cHJpdi0+czU5MzNfY29uZmlnOwpAQCAtNzc4LDI5ICs3NzEsMjggQEAKIAkJCQlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewogCWNvbnN0IHN0cnVjdCBjYl9wY2lkYXNfYm9hcmQgKnRoaXNib2FyZCA9IGRldi0+Ym9hcmRfcHRyOwotCXN0cnVjdCBjYl9wY2lkYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBpbnQgYXJnOwogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCiAJCQkJCVRSSUdfRk9MTE9XIHwgVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCiAJCQkJCVRSSUdfVElNRVIgfCBUUklHX05PVyB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC04MTksNyArODExLDcgQEAKIAogCXN3aXRjaCAoY21kLT5zdGFydF9zcmMpIHsKIAljYXNlIFRSSUdfTk9XOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklHX0VYVDoKIAkJLyogRXh0ZXJuYWwgdHJpZ2dlciwgb25seSBDUl9FREdFIGFuZCBDUl9JTlZFUlQgZmxhZ3MgYWxsb3dlZCAqLwpAQCAtODM2LDIwICs4MjgsMjQgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJdGhpc2JvYXJkLT5haV9zcGVlZCAqIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIHRoaXNib2FyZC0+YWlfc3BlZWQgKgorCQkJCQkJICAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwl9CiAKLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSB0aGlzYm9hcmQtPmFpX3NwZWVkKTsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJICAgIHRoaXNib2FyZC0+YWlfc3BlZWQpOworCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtODU4LDE5ICs4NTQsMTMgQEAKIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8xME1IWiwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjEsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IyLAotCQkJCQkgICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKGRldi0+cGFjZXIsICZhcmcsIGNtZC0+ZmxhZ3MpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfMTBNSFosCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtODg2LDE4ICs4NzYsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjYl9wY2lkYXNfYWlfbG9hZF9jb3VudGVycyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBjYl9wY2lkYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIEFEQzgyNTQ7Ci0KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCi0JaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMSwgZGV2cHJpdi0+ZGl2aXNvcjEpOwotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDIsIGRldnByaXYtPmRpdmlzb3IyKTsKLX0KLQogc3RhdGljIGludCBjYl9wY2lkYXNfYWlfY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CkBAIC05MzMsOCArOTExLDExIEBACiAJb3V0dyhiaXRzLCBkZXZwcml2LT5jb250cm9sX3N0YXR1cyArIEFEQ01VWF9DT05UKTsKIAogCS8qICBsb2FkIGNvdW50ZXJzICovCi0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiB8fCBjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCi0JCWNiX3BjaWRhc19haV9sb2FkX2NvdW50ZXJzKGRldik7CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUiB8fAorCSAgICBjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKGRldi0+cGFjZXIpOworCQljb21lZGlfODI1NF9wYWNlcl9lbmFibGUoZGV2LT5wYWNlciwgMSwgMiwgdHJ1ZSk7CisJfQogCiAJLyogIGVuYWJsZSBpbnRlcnJ1cHRzICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKQEAgLTEwMDQsMjQgKzk4NSwyMyBAQAogCWNvbnN0IHN0cnVjdCBjYl9wY2lkYXNfYm9hcmQgKnRoaXNib2FyZCA9IGRldi0+Ym9hcmRfcHRyOwogCXN0cnVjdCBjYl9wY2lkYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgZXJyID0gMDsKLQl1bnNpZ25lZCBpbnQgYXJnOwogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfSU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX0lOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMTAzMCwxOCArMTAxMCwyMCBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIHRoaXNib2FyZC0+YW9fc2Nhbl9zcGVlZCk7CisJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICB0aGlzYm9hcmQtPmFvX3NjYW5fc3BlZWQpOworCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtMTA0OSwxMiArMTAzMSwxMSBAQAogCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJYXJnID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8xME1IWiwKLQkJCQkJICAmZGV2cHJpdi0+YW9fZGl2aXNvcjEsCi0JCQkJCSAgJmRldnByaXYtPmFvX2Rpdmlzb3IyLAotCQkJCQkgICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQl1bnNpZ25lZCBpbnQgYXJnID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKKworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKGRldnByaXYtPmFvX3BhY2VyLAorCQkJCQkJJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGVycikKQEAgLTExMzksMTggKzExMjAsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjYl9wY2lkYXNfYW9fbG9hZF9jb3VudGVycyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBjYl9wY2lkYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIERBQzgyNTQ7Ci0KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCi0JaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMSwgZGV2cHJpdi0+YW9fZGl2aXNvcjEpOwotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDIsIGRldnByaXYtPmFvX2Rpdmlzb3IyKTsKLX0KLQogc3RhdGljIGludCBjYl9wY2lkYXNfYW9fY21kKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CkBAIC0xMTgwLDggKzExNDksMTAgQEAKIAlvdXR3KDAsIGRldnByaXYtPmFvX3JlZ2lzdGVycyArIERBQ0ZJRk9DTFIpOwogCiAJLyogIGxvYWQgY291bnRlcnMgKi8KLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKQotCQljYl9wY2lkYXNfYW9fbG9hZF9jb3VudGVycyhkZXYpOworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKGRldnByaXYtPmFvX3BhY2VyKTsKKwkJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldnByaXYtPmFvX3BhY2VyLCAxLCAyLCB0cnVlKTsKKwl9CiAKIAkvKiAgc2V0IHBhY2VyIHNvdXJjZSAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CkBAIC0xNDA4LDYgKzEzNzksMTcgQEAKIAl9CiAJZGV2LT5pcnEgPSBwY2lkZXYtPmlycTsKIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgQURDODI1NCwKKwkJCQkgICAgICBJODI1NF9PU0NfQkFTRV8xME1IWiwgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldi0+cGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2cHJpdi0+YW9fcGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgREFDODI1NCwKKwkJCQkJICAgICBJODI1NF9PU0NfQkFTRV8xME1IWiwKKwkJCQkJICAgICBJODI1NF9JTzgsIDApOworCWlmICghZGV2cHJpdi0+YW9fcGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA3KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMTUzMCw4ICsxNTEyLDkgQEAKIAkJCWRhYzA4X3dyaXRlKGRldiwgcy0+bWF4ZGF0YSAvIDIpOwogCQkJcy0+cmVhZGJhY2tbaV0gPSBzLT5tYXhkYXRhIC8gMjsKIAkJfQotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQogCiAJLyogIG1ha2Ugc3VyZSBtYWlsYm94IDQgaXMgZW1wdHkgKi8KIAlpbmwoZGV2cHJpdi0+czU5MzNfY29uZmlnICsgQU1DQ19PUF9SRUdfSU1CNCk7CkBAIC0xNTUwLDkgKzE1MzMsMTEgQEAKIHsKIAlzdHJ1Y3QgY2JfcGNpZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAKLQlpZiAoZGV2cHJpdiAmJiBkZXZwcml2LT5zNTkzM19jb25maWcpIHsKLQkJb3V0bChJTlRDU1JfSU5CT1hfSU5UUl9TVEFUVVMsCi0JCSAgICAgZGV2cHJpdi0+czU5MzNfY29uZmlnICsgQU1DQ19PUF9SRUdfSU5UQ1NSKTsKKwlpZiAoZGV2cHJpdikgeworCQlpZiAoZGV2cHJpdi0+czU5MzNfY29uZmlnKQorCQkJb3V0bChJTlRDU1JfSU5CT1hfSU5UUl9TVEFUVVMsCisJCQkgICAgIGRldnByaXYtPnM1OTMzX2NvbmZpZyArIEFNQ0NfT1BfUkVHX0lOVENTUik7CisJCWtmcmVlKGRldnByaXYtPmFvX3BhY2VyKTsKIAl9CiAJY29tZWRpX3BjaV9kZXRhY2goZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkYXM2NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKaW5kZXggNWI0M2U0ZS4uYTk0YzMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRhczY0LmMKQEAgLTgxLDE2ICs4MSwxMyBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICI4MjUzLmgiCiAjaW5jbHVkZSAiODI1NS5oIgogI2luY2x1ZGUgInBseDkwODAuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKIAogI2RlZmluZSBUSU1FUl9CQVNFIDI1CQkvKiAgNDBNSHogbWFzdGVyIGNsb2NrICovCiAvKiAxMDBrSHogJ3ByZXNjYWxlZCcgY2xvY2sgZm9yIHNsb3cgYWNxdWlzaXRpb24sCkBAIC0xNDc0LDkgKzE0NzEsOCBAQAogCQlkZXZwcml2LT5haV9idWZmZXJbaV0gPQogCQkJcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpZGV2LCBETUFfQlVGRkVSX1NJWkUsCiAJCQkJCSAgICAgJmRldnByaXYtPmFpX2J1ZmZlcl9idXNfYWRkcltpXSk7Ci0JCWlmIChkZXZwcml2LT5haV9idWZmZXJbaV0gPT0gTlVMTCkKKwkJaWYgKCFkZXZwcml2LT5haV9idWZmZXJbaV0pCiAJCQlyZXR1cm4gLUVOT01FTTsKLQogCX0KIAlmb3IgKGkgPSAwOyBpIDwgQU9fRE1BX1JJTkdfQ09VTlQ7IGkrKykgewogCQlpZiAoYW9fY21kX2lzX3N1cHBvcnRlZCh0aGlzYm9hcmQpKSB7CkBAIC0xNDg0LDkgKzE0ODAsOCBAQAogCQkJCXBjaV9hbGxvY19jb25zaXN0ZW50KHBjaWRldiwgRE1BX0JVRkZFUl9TSVpFLAogCQkJCQkJICAgICAmZGV2cHJpdi0+CiAJCQkJCQkgICAgICBhb19idWZmZXJfYnVzX2FkZHJbaV0pOwotCQkJaWYgKGRldnByaXYtPmFvX2J1ZmZlcltpXSA9PSBOVUxMKQorCQkJaWYgKCFkZXZwcml2LT5hb19idWZmZXJbaV0pCiAJCQkJcmV0dXJuIC1FTk9NRU07Ci0KIAkJfQogCX0KIAkvKiAgYWxsb2NhdGUgZG1hIGRlc2NyaXB0b3JzICovCkBAIC0xNDk0LDcgKzE0ODksNyBAQAogCQlwY2lfYWxsb2NfY29uc2lzdGVudChwY2lkZXYsIHNpemVvZihzdHJ1Y3QgcGx4X2RtYV9kZXNjKSAqCiAJCQkJICAgICBhaV9kbWFfcmluZ19jb3VudCh0aGlzYm9hcmQpLAogCQkJCSAgICAgJmRldnByaXYtPmFpX2RtYV9kZXNjX2J1c19hZGRyKTsKLQlpZiAoZGV2cHJpdi0+YWlfZG1hX2Rlc2MgPT0gTlVMTCkKKwlpZiAoIWRldnByaXYtPmFpX2RtYV9kZXNjKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChhb19jbWRfaXNfc3VwcG9ydGVkKHRoaXNib2FyZCkpIHsKQEAgLTE1MDMsNyArMTQ5OCw3IEBACiAJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBwbHhfZG1hX2Rlc2MpICoKIAkJCQkJICAgICBBT19ETUFfUklOR19DT1VOVCwKIAkJCQkJICAgICAmZGV2cHJpdi0+YW9fZG1hX2Rlc2NfYnVzX2FkZHIpOwotCQlpZiAoZGV2cHJpdi0+YW9fZG1hX2Rlc2MgPT0gTlVMTCkKKwkJaWYgKCFkZXZwcml2LT5hb19kbWFfZGVzYykKIAkJCXJldHVybiAtRU5PTUVNOwogCX0KIAkvKiAgaW5pdGlhbGl6ZSBkbWEgZGVzY3JpcHRvcnMgKi8KQEAgLTE3MDQsOCArMTY5OSw3IEBACiAKIAkvKiAgZ2V0IGFja25vd2xlZGdlICovCiAJaWYgKGkyY19yZWFkX2FjayhkZXYpICE9IDApIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzIGZhaWxlZDogbm8gYWNrbm93bGVkZ2VcbiIsCi0JCQlfX2Z1bmNfXyk7CisJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJmYWlsZWQ6IG5vIGFja25vd2xlZGdlXG4iKTsKIAkJaTJjX3N0b3AoZGV2KTsKIAkJcmV0dXJuOwogCX0KQEAgLTE3MTMsOCArMTcwNyw3IEBACiAJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAJCWkyY193cml0ZV9ieXRlKGRldiwgZGF0YVtpXSk7CiAJCWlmIChpMmNfcmVhZF9hY2soZGV2KSAhPSAwKSB7Ci0JCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiJXMgZmFpbGVkOiBubyBhY2tub3dsZWRnZVxuIiwKLQkJCQlfX2Z1bmNfXyk7CisJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiZmFpbGVkOiBubyBhY2tub3dsZWRnZVxuIik7CiAJCQlpMmNfc3RvcChkZXYpOwogCQkJcmV0dXJuOwogCQl9CkBAIC0xODQxLDcgKzE4MzQsNiBAQAogCX0KIAogCWZvciAobiA9IDA7IG4gPCBpbnNuLT5uOyBuKyspIHsKLQogCQkvKiAgY2xlYXIgYWRjIGJ1ZmZlciAoaW5zaWRlIGxvb3AgZm9yIDQwMjAgc2FrZSkgKi8KIAkJd3JpdGV3KDAsIGRldnByaXYtPm1haW5faW9iYXNlICsgQURDX0JVRkZFUl9DTEVBUl9SRUcpOwogCkBAIC0xOTAzLDcgKzE4OTUsNiBAQAogCQlyZXR2YWwgPSBzZXRfYWlfZmlmb19zaXplKGRldiwgZmlmb19zaXplKTsKIAkJaWYgKHJldHZhbCA8IDApCiAJCQlyZXR1cm4gcmV0dmFsOwotCiAJfQogCiAJYmxvY2tfc2l6ZSA9IGFpX2ZpZm9fc2l6ZShkZXYpIC8gZmlmby0+bnVtX3NlZ21lbnRzICogYnl0ZXNfaW5fc2FtcGxlOwpAQCAtMjAwMSw3ICsxOTkyLDggQEAKIHN0YXRpYyB2b2lkIGNoZWNrX2FkY190aW1pbmcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAljb25zdCBzdHJ1Y3QgcGNpZGFzNjRfYm9hcmQgKnRoaXNib2FyZCA9IGRldi0+Ym9hcmRfcHRyOwotCXVuc2lnbmVkIGludCBjb252ZXJ0X2Rpdmlzb3IgPSAwLCBzY2FuX2Rpdmlzb3I7CisJdW5zaWduZWQgbG9uZyBsb25nIGNvbnZlcnRfZGl2aXNvciA9IDA7CisJdW5zaWduZWQgaW50IHNjYW5fZGl2aXNvcjsKIAlzdGF0aWMgY29uc3QgaW50IG1pbl9jb252ZXJ0X2Rpdmlzb3IgPSAzOwogCXN0YXRpYyBjb25zdCBpbnQgbWF4X2NvbnZlcnRfZGl2aXNvciA9CiAJCW1heF9jb3VudGVyX3ZhbHVlICsgbWluX2NvbnZlcnRfZGl2aXNvcjsKQEAgLTIwMjcsNyArMjAxOSw2IEBACiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewogCQlzY2FuX2Rpdmlzb3IgPSBnZXRfZGl2aXNvcihjbWQtPnNjYW5fYmVnaW5fYXJnLCBjbWQtPmZsYWdzKTsKIAkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQkJLyogIFhYWCBjaGVjayBmb3IgaW50ZWdlciBvdmVyZmxvd3MgKi8KIAkJCW1pbl9zY2FuX2Rpdmlzb3IgPSBjb252ZXJ0X2Rpdmlzb3IgKiBjbWQtPmNoYW5saXN0X2xlbjsKIAkJCW1heF9zY2FuX2Rpdmlzb3IgPQogCQkJCShjb252ZXJ0X2Rpdmlzb3IgKiBjbWQtPmNoYW5saXN0X2xlbiAtIDEpICsKQEAgLTIwOTQsMzQgKzIwODUsMzQgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7CiAKIAl0cmlnZ2VycyA9IFRSSUdfVElNRVI7CiAJaWYgKHRoaXNib2FyZC0+bGF5b3V0ID09IExBWU9VVF80MDIwKQogCQl0cmlnZ2VycyB8PSBUUklHX09USEVSOwogCWVsc2UKIAkJdHJpZ2dlcnMgfD0gVFJJR19GT0xMT1c7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgdHJpZ2dlcnMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIHRyaWdnZXJzKTsKIAogCXRyaWdnZXJzID0gVFJJR19USU1FUjsKIAlpZiAodGhpc2JvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzQwMjApCiAJCXRyaWdnZXJzIHw9IFRSSUdfTk9XOwogCWVsc2UKIAkJdHJpZ2dlcnMgfD0gVFJJR19FWFQ7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgdHJpZ2dlcnMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLAotCQkJCSAgICAgVFJJR19DT1VOVCB8IFRSSUdfRVhUIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCB0cmlnZ2Vycyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsCisJCQkJCVRSSUdfQ09VTlQgfCBUUklHX0VYVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTIxMzUsNyArMjEyNiw3IEBACiAKIAlzd2l0Y2ggKGNtZC0+c3RhcnRfc3JjKSB7CiAJY2FzZSBUUklHX05PVzoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAJCWJyZWFrOwogCWNhc2UgVFJJR19FWFQ6CiAJCS8qCkBAIC0yMTQ3LDMwICsyMTM4LDM3IEBACiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWlmICh0aGlzYm9hcmQtPmxheW91dCA9PSBMQVlPVVRfNDAyMCkgewotCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJCSAgIDApOwogCQl9IGVsc2UgewotCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkJIHRoaXNib2FyZC0+YWlfc3BlZWQpOwotCQkJLyogaWYgc2NhbnMgYXJlIHRpbWVkIGZhc3RlciB0aGFuIGNvbnZlcnNpb24gcmF0ZSBhbGxvd3MgKi8KLQkJCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpCi0JCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oCisJCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCQkgICAgdGhpc2JvYXJkLT4KKwkJCQkJCQkgICAgYWlfc3BlZWQpOworCQkJLyoKKwkJCSAqIGlmIHNjYW5zIGFyZSB0aW1lZCBmYXN0ZXIgdGhhbiBjb252ZXJzaW9uIHJhdGUKKwkJCSAqIGFsbG93cworCQkJICovCisJCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oCiAJCQkJCQkmY21kLT5zY2FuX2JlZ2luX2FyZywKIAkJCQkJCWNtZC0+Y29udmVydF9hcmcgKgogCQkJCQkJY21kLT5jaGFubGlzdF9sZW4pOworCQkJfQogCQl9CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCXN3aXRjaCAoY21kLT5zdG9wX3NyYykgewogCWNhc2UgVFJJR19FWFQ6CiAJCWJyZWFrOwogCWNhc2UgVFJJR19DT1VOVDoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJCWJyZWFrOwogCWNhc2UgVFJJR19OT05FOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMjYzNyw4ICsyNjM1LDkgQEAKIAkJYml0cyB8PSBBRENfU1RBUlRfVFJJR19FWFRfQklUUzsKIAkJaWYgKGNtZC0+c3RhcnRfYXJnICYgQ1JfSU5WRVJUKQogCQkJYml0cyB8PSBBRENfU1RBUlRfVFJJR19GQUxMSU5HX0JJVDsKLQl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XKQorCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cpIHsKIAkJYml0cyB8PSBBRENfU1RBUlRfVFJJR19TT0ZUX0JJVFM7CisJfQogCWlmICh1c2VfaHdfc2FtcGxlX2NvdW50ZXIoY21kKSkKIAkJYml0cyB8PSBBRENfU0FNUExFX0NPVU5URVJfRU5fQklUOwogCXdyaXRldyhiaXRzLCBkZXZwcml2LT5tYWluX2lvYmFzZSArIEFEQ19DT05UUk9MMF9SRUcpOwpAQCAtMjgyNyw4ICsyODI2LDkgQEAKIAkJaWYgKGRldnByaXYtPmFpX2NtZF9ydW5uaW5nKSB7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBmbGFncyk7CiAJCQlwaW9fZHJhaW5fYWlfZmlmbyhkZXYpOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c3BpbmxvY2ssIGZsYWdzKTsKKwkJfQogCX0KIAkvKiAgaWYgd2UgYXJlIGhhdmUgYWxsIHRoZSBkYXRhLCB0aGVuIHF1aXQgKi8KIAlpZiAoKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCAmJgpAQCAtMjk3OCw3ICsyOTc4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJLyogYm9hcmQgbWlnaHQgbm90IHN1cHBvcnQgYW8sIGluIHdoaWNoIGNhc2Ugd3JpdGVfc3ViZGV2IGlzIE5VTEwgKi8KLQlpZiAocyA9PSBOVUxMKQorCWlmICghcykKIAkJcmV0dXJuOwogCWFzeW5jID0gcy0+YXN5bmM7CiAJY21kID0gJmFzeW5jLT5jbWQ7CkBAIC0zMzEyLDIwICszMzEyLDIwIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19JTlQgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKLQkJCQkgICAgIFRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX0lOVCB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAorCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTMzNDAsMTEgKzMzNDAsMTEgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIHRoaXNib2FyZC0+YW9fc2Nhbl9zcGVlZCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIHRoaXNib2FyZC0+YW9fc2Nhbl9zcGVlZCk7CiAJCWlmIChnZXRfYW9fZGl2aXNvcihjbWQtPnNjYW5fYmVnaW5fYXJnLCBjbWQtPmZsYWdzKSA+CiAJCSAgICBtYXhfY291bnRlcl92YWx1ZSkgewogCQkJY21kLT5zY2FuX2JlZ2luX2FyZyA9IChtYXhfY291bnRlcl92YWx1ZSArIDIpICoKQEAgLTMzNTMsOCArMzM1Myw5IEBACiAJCX0KIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0zODE3LDggKzM4MTgsOSBAQAogCQlzLT5tYXhkYXRhID0gMTsKIAkJcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfZGlnaXRhbDsKIAkJcy0+aW5zbl9iaXRzID0gZGlfcmJpdHM7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKKwl9CiAKIAkvKiAgZGlnaXRhbCBvdXRwdXQgKi8KIAlpZiAodGhpc2JvYXJkLT5sYXlvdXQgPT0gTEFZT1VUXzY0WFgpIHsKQEAgLTM4MjksOCArMzgzMSw5IEBACiAJCXMtPm1heGRhdGEgPSAxOwogCQlzLT5yYW5nZV90YWJsZSA9ICZyYW5nZV9kaWdpdGFsOwogCQlzLT5pbnNuX2JpdHMgPSBkb193Yml0czsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KIAogCS8qIDgyNTUgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1s0XTsKQEAgLTM4NTgsOCArMzg2MSw5IEBACiAJCXMtPnJhbmdlX3RhYmxlID0gJnJhbmdlX2RpZ2l0YWw7CiAJCXMtPmluc25fY29uZmlnID0gZGlvXzYweHhfY29uZmlnX2luc247CiAJCXMtPmluc25fYml0cyA9IGRpb182MHh4X3diaXRzOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXMtPnR5cGUgPSBDT01FRElfU1VCRF9VTlVTRUQ7CisJfQogCiAJLyogIGNhbGRhYyAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzZdOwpAQCAtMzg5OCw4ICszOTAyLDkgQEAKIAkJCWFkODQwMl93cml0ZShkZXYsIGksIHMtPm1heGRhdGEgLyAyKTsKIAkJCXMtPnJlYWRiYWNrW2ldID0gcy0+bWF4ZGF0YSAvIDI7CiAJCX0KLQl9IGVsc2UKKwl9IGVsc2UgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KIAogCS8qIHNlcmlhbCBFRVBST00sIGlmIHByZXNlbnQgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1s4XTsKQEAgLTM5MDksOCArMzkxNCw5IEBACiAJCXMtPm5fY2hhbiA9IDEyODsKIAkJcy0+bWF4ZGF0YSA9IDB4ZmZmZjsKIAkJcy0+aW5zbl9yZWFkID0gZWVwcm9tX3JlYWRfaW5zbjsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOworCX0KIAogCS8qICB1c2VyIGNvdW50ZXIgc3ViZCBYWFggKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1s5XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2lkZGEuYwppbmRleCAyYjJjZmNkLi4zMGM5ZTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpZGRhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaWRkYS5jCkBAIC0zNiwxMSArMzYsOSBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogI2luY2x1ZGUgIjgyNTUuaCIKIAogI2RlZmluZSBFRVBST01fU0laRQkxMjgJLyogIG51bWJlciBvZiBlbnRyaWVzIGluIGVlcHJvbSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kYXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGFzLmMKaW5kZXggNzBkZDJjOS4uYzQ1OGU1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kYXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRhcy5jCkBAIC00MiwzNyArNDIsMTEyIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKICNpbmNsdWRlICJwbHg5MDUyLmgiCiAjaW5jbHVkZSAiODI1NS5oIgogCi0vKiBSZWdpc3RlcnMgZm9yIHRoZSBQQ0lNLURBUzE2MDIvMTYgYW5kIFBDSWUtREFTMTYwMi8xNiAqLworLyoKKyAqIFBDSSBCYXIgMSBSZWdpc3RlciBtYXAKKyAqIHNlZSBwbHg5MDUyLmggZm9yIHJlZ2lzdGVyIGFuZCBiaXQgZGVmaW5lcworICovCiAKLS8qIERBQyBPZmZzZXRzICovCi0jZGVmaW5lIEFEQ19UUklHIDAKLSNkZWZpbmUgREFDMF9PRkZTRVQgMgotI2RlZmluZSBEQUMxX09GRlNFVCA0CisvKgorICogUENJIEJhciAyIFJlZ2lzdGVyIG1hcCAoZGV2cHJpdi0+ZGFxaW8pCisgKi8KKyNkZWZpbmUgUENJTURBU19BSV9SRUcJCQkweDAwCisjZGVmaW5lIFBDSU1EQVNfQUlfU09GVFRSSUdfUkVHCQkweDAwCisjZGVmaW5lIFBDSU1EQVNfQU9fUkVHKHgpCQkoMHgwMiArICgoeCkgKiAyKSkKIAotLyogQUkgYW5kIENvdW50ZXIgQ29uc3RhbnRzICovCi0jZGVmaW5lIE1VWF9MSU1JVFMgMAotI2RlZmluZSBNQUlOX0NPTk5fRElPIDEKLSNkZWZpbmUgQURDX1NUQVQgMgotI2RlZmluZSBBRENfQ09OVl9TVEFUIDMKLSNkZWZpbmUgQURDX0lOVCA0Ci0jZGVmaW5lIEFEQ19QQUNFUiA1Ci0jZGVmaW5lIEJVUlNUX01PREUgNgotI2RlZmluZSBQUk9HX0dBSU4gNwotI2RlZmluZSBDTEs4MjU0XzFfREFUQSA4Ci0jZGVmaW5lIENMSzgyNTRfMl9EQVRBIDkKLSNkZWZpbmUgQ0xLODI1NF8zX0RBVEEgMTAKLSNkZWZpbmUgQ0xLODI1NF9DT05UUk9MIDExCi0jZGVmaW5lIFVTRVJfQ09VTlRFUiAxMgotI2RlZmluZSBSRVNJRF9DT1VOVF9IIDEzCi0jZGVmaW5lIFJFU0lEX0NPVU5UX0wgMTQKKy8qCisgKiBQQ0kgQmFyIDMgUmVnaXN0ZXIgbWFwIChkZXZwcml2LT5CQURSMykKKyAqLworI2RlZmluZSBQQ0lNREFTX01VWF9SRUcJCQkweDAwCisjZGVmaW5lIFBDSU1EQVNfTVVYKF9sbywgX2hpKQkJKChfbG8pIHwgKChfaGkpIDw8IDQpKQorI2RlZmluZSBQQ0lNREFTX0RJX0RPX1JFRwkJMHgwMQorI2RlZmluZSBQQ0lNREFTX1NUQVRVU19SRUcJCTB4MDIKKyNkZWZpbmUgUENJTURBU19TVEFUVVNfRU9DCQlCSVQoNykKKyNkZWZpbmUgUENJTURBU19TVEFUVVNfVUIJCUJJVCg2KQorI2RlZmluZSBQQ0lNREFTX1NUQVRVU19NVVgJCUJJVCg1KQorI2RlZmluZSBQQ0lNREFTX1NUQVRVU19DTEsJCUJJVCg0KQorI2RlZmluZSBQQ0lNREFTX1NUQVRVU19UT19DVVJSX01VWCh4KQkoKHgpICYgMHhmKQorI2RlZmluZSBQQ0lNREFTX0NPTlZfU1RBVFVTX1JFRwkJMHgwMworI2RlZmluZSBQQ0lNREFTX0NPTlZfU1RBVFVTX0VPQwkJQklUKDcpCisjZGVmaW5lIFBDSU1EQVNfQ09OVl9TVEFUVVNfRU9CCQlCSVQoNikKKyNkZWZpbmUgUENJTURBU19DT05WX1NUQVRVU19FT0EJCUJJVCg1KQorI2RlZmluZSBQQ0lNREFTX0NPTlZfU1RBVFVTX0ZORQkJQklUKDQpCisjZGVmaW5lIFBDSU1EQVNfQ09OVl9TVEFUVVNfRkhGCQlCSVQoMykKKyNkZWZpbmUgUENJTURBU19DT05WX1NUQVRVU19PVkVSUlVOCUJJVCgyKQorI2RlZmluZSBQQ0lNREFTX0lSUV9SRUcJCQkweDA0CisjZGVmaW5lIFBDSU1EQVNfSVJRX0lOVEUJCUJJVCg3KQorI2RlZmluZSBQQ0lNREFTX0lSUV9JTlQJCQlCSVQoNikKKyNkZWZpbmUgUENJTURBU19JUlFfT1ZFUlJVTgkJQklUKDQpCisjZGVmaW5lIFBDSU1EQVNfSVJRX0VPQQkJCUJJVCgzKQorI2RlZmluZSBQQ0lNREFTX0lSUV9FT0FfSU5UX1NFTAkJQklUKDIpCisjZGVmaW5lIFBDSU1EQVNfSVJRX0lOVFNFTCh4KQkJKCh4KSA8PCAwKQorI2RlZmluZSBQQ0lNREFTX0lSUV9JTlRTRUxfRU9DCQlQQ0lNREFTX0lSUV9JTlRTRUwoMCkKKyNkZWZpbmUgUENJTURBU19JUlFfSU5UU0VMX0ZORQkJUENJTURBU19JUlFfSU5UU0VMKDEpCisjZGVmaW5lIFBDSU1EQVNfSVJRX0lOVFNFTF9FT0IJCVBDSU1EQVNfSVJRX0lOVFNFTCgyKQorI2RlZmluZSBQQ0lNREFTX0lSUV9JTlRTRUxfRkhGX0VPQQlQQ0lNREFTX0lSUV9JTlRTRUwoMykKKyNkZWZpbmUgUENJTURBU19QQUNFUl9SRUcJCTB4MDUKKyNkZWZpbmUgUENJTURBU19QQUNFUl9HQVRFX1NUQVRVUwlCSVQoNikKKyNkZWZpbmUgUENJTURBU19QQUNFUl9HQVRFX1BPTAkJQklUKDUpCisjZGVmaW5lIFBDSU1EQVNfUEFDRVJfR0FURV9MQVRDSAlCSVQoNCkKKyNkZWZpbmUgUENJTURBU19QQUNFUl9HQVRFX0VOCQlCSVQoMykKKyNkZWZpbmUgUENJTURBU19QQUNFUl9FWFRfUEFDRVJfUE9MCUJJVCgyKQorI2RlZmluZSBQQ0lNREFTX1BBQ0VSX1NSQyh4KQkJKCh4KSA8PCAwKQorI2RlZmluZSBQQ0lNREFTX1BBQ0VSX1NSQ19QT0xMRUQJUENJTURBU19QQUNFUl9TUkMoMCkKKyNkZWZpbmUgUENJTURBU19QQUNFUl9TUkNfRVhUCQlQQ0lNREFTX1BBQ0VSX1NSQygyKQorI2RlZmluZSBQQ0lNREFTX1BBQ0VSX1NSQ19JTlQJCVBDSU1EQVNfUEFDRVJfU1JDKDMpCisjZGVmaW5lIFBDSU1EQVNfUEFDRVJfU1JDX01BU0sJCSgzIDw8IDApCisjZGVmaW5lIFBDSU1EQVNfQlVSU1RfUkVHCQkweDA2CisjZGVmaW5lIFBDSU1EQVNfQlVSU1RfQk1FCQlCSVQoMSkKKyNkZWZpbmUgUENJTURBU19CVVJTVF9DT05WX0VOCQlCSVQoMCkKKyNkZWZpbmUgUENJTURBU19HQUlOX1JFRwkJMHgwNworI2RlZmluZSBQQ0lNREFTXzgyNTRfQkFTRQkJMHgwOAorI2RlZmluZSBQQ0lNREFTX1VTRVJfQ05UUl9SRUcJCTB4MGMKKyNkZWZpbmUgUENJTURBU19VU0VSX0NOVFJfQ1RSMV9DTEtfU0VMCUJJVCgwKQorI2RlZmluZSBQQ0lNREFTX1JFU0lEVUVfTVNCX1JFRwkJMHgwZAorI2RlZmluZSBQQ0lNREFTX1JFU0lEVUVfTFNCX1JFRwkJMHgwZQorCisvKgorICogUENJIEJhciA0IFJlZ2lzdGVyIG1hcCAoZGV2LT5pb2Jhc2UpCisgKi8KKyNkZWZpbmUgUENJTURBU184MjU1X0JBU0UJCTB4MDAKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIGNiX3BjaW1kYXNfYWlfYmlwX3JhbmdlID0geworCTQsIHsKKwkJQklQX1JBTkdFKDEwKSwKKwkJQklQX1JBTkdFKDUpLAorCQlCSVBfUkFOR0UoMi41KSwKKwkJQklQX1JBTkdFKDEuMjUpCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlIGNiX3BjaW1kYXNfYWlfdW5pX3JhbmdlID0geworCTQsIHsKKwkJVU5JX1JBTkdFKDEwKSwKKwkJVU5JX1JBTkdFKDUpLAorCQlVTklfUkFOR0UoMi41KSwKKwkJVU5JX1JBTkdFKDEuMjUpCisJfQorfTsKKworLyoKKyAqIFRoZSBBbmFsb2cgT3V0cHV0IHJhbmdlIGlzIG5vdCBwcm9ncmFtbWFibGUuIFRoZSBEQUMgcmFuZ2VzIGFyZQorICoganVtcGVyLXNldHRhYmxlIG9uIHRoZSBib2FyZC4gVGhlIHNldHRpbmdzIGFyZSBub3Qgc29mdHdhcmUtcmVhZGFibGUuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSBjYl9wY2ltZGFzX2FvX3JhbmdlID0geworCTQsIHsKKwkJQklQX1JBTkdFKDEwKSwKKwkJQklQX1JBTkdFKDUpLAorCQlVTklfUkFOR0UoMTApLAorCQlVTklfUkFOR0UoNSkKKwl9Cit9OwogCiAvKgogICogdGhpcyBzdHJ1Y3R1cmUgaXMgZm9yIGRhdGEgdW5pcXVlIHRvIHRoaXMgaGFyZHdhcmUgZHJpdmVyLiAgSWYKQEAgLTk0LDU5ICsxNjksNDcgQEAKIAlzdHJ1Y3QgY2JfcGNpbWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXVuc2lnbmVkIGludCBzdGF0dXM7CiAKLQlzdGF0dXMgPSBpbmIoZGV2cHJpdi0+QkFEUjMgKyAyKTsKLQlpZiAoKHN0YXR1cyAmIDB4ODApID09IDApCisJc3RhdHVzID0gaW5iKGRldnByaXYtPkJBRFIzICsgUENJTURBU19TVEFUVVNfUkVHKTsKKwlpZiAoKHN0YXR1cyAmIFBDSU1EQVNfU1RBVFVTX0VPQykgPT0gMCkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIC1FQlVTWTsKIH0KIAotc3RhdGljIGludCBjYl9wY2ltZGFzX2FpX3JpbnNuKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCitzdGF0aWMgaW50IGNiX3BjaW1kYXNfYWlfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCSAgIHVuc2lnbmVkIGludCAqZGF0YSkKIHsKIAlzdHJ1Y3QgY2JfcGNpbWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJdW5zaWduZWQgaW50IHJhbmdlID0gQ1JfUkFOR0UoaW5zbi0+Y2hhbnNwZWMpOwogCWludCBuOwogCXVuc2lnbmVkIGludCBkOwotCWludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JdW5zaWduZWQgc2hvcnQgY2hhbmxpbXM7Ci0JaW50IG1heGNoYW5zOwogCWludCByZXQ7CiAKIAkvKiAgb25seSBzdXBwb3J0IHN3IGluaXRpYXRlZCByZWFkcyBmcm9tIGEgc2luZ2xlIGNoYW5uZWwgKi8KIAotCS8qIGNoZWNrIGNoYW5uZWwgbnVtYmVyICovCi0JaWYgKChpbmIoZGV2cHJpdi0+QkFEUjMgKyAyKSAmIDB4MjApID09IDApCS8qIGRpZmZlcmVudGlhbCBtb2RlICovCi0JCW1heGNoYW5zID0gcy0+bl9jaGFuIC8gMjsKLQllbHNlCi0JCW1heGNoYW5zID0gcy0+bl9jaGFuOwotCi0JaWYgKGNoYW4gPiAobWF4Y2hhbnMgLSAxKSkKLQkJcmV0dXJuIC1FVElNRURPVVQ7CS8qICoqKiBXcm9uZyBlcnJvciBjb2RlLiBGaXhtZS4gKi8KLQogCS8qIGNvbmZpZ3VyZSBmb3Igc3cgaW5pdGlhdGVkIHJlYWQgKi8KLQlkID0gaW5iKGRldnByaXYtPkJBRFIzICsgNSk7Ci0JaWYgKChkICYgMHgwMykgPiAwKSB7CS8qIG9ubHkgcmVzZXQgaWYgbmVlZGVkLiAqLwotCQlkID0gZCAmIDB4ZmQ7Ci0JCW91dGIoZCwgZGV2cHJpdi0+QkFEUjMgKyA1KTsKKwlkID0gaW5iKGRldnByaXYtPkJBRFIzICsgUENJTURBU19QQUNFUl9SRUcpOworCWlmICgoZCAmIFBDSU1EQVNfUEFDRVJfU1JDX01BU0spICE9IFBDSU1EQVNfUEFDRVJfU1JDX1BPTExFRCkgeworCQlkICY9IH5QQ0lNREFTX1BBQ0VSX1NSQ19NQVNLOworCQlkIHw9IFBDSU1EQVNfUEFDRVJfU1JDX1BPTExFRDsKKwkJb3V0YihkLCBkZXZwcml2LT5CQURSMyArIFBDSU1EQVNfUEFDRVJfUkVHKTsKIAl9CiAKIAkvKiBzZXQgYnVyc3Rpbmcgb2ZmLCBjb252ZXJzaW9ucyBvbiAqLwotCW91dGIoMHgwMSwgZGV2cHJpdi0+QkFEUjMgKyA2KTsKKwlvdXRiKFBDSU1EQVNfQlVSU1RfQ09OVl9FTiwgZGV2cHJpdi0+QkFEUjMgKyBQQ0lNREFTX0JVUlNUX1JFRyk7CiAKLQkvKiBzZXQgcmFuZ2UgdG8gMTBWLiBVUC9CUCBpcyBjb250cm9sbGVkIGJ5IGEgc3dpdGNoIG9uIHRoZSBib2FyZCAqLwotCW91dGIoMHgwMCwgZGV2cHJpdi0+QkFEUjMgKyA3KTsKKwkvKiBzZXQgcmFuZ2UgKi8KKwlvdXRiKHJhbmdlLCBkZXZwcml2LT5CQURSMyArIFBDSU1EQVNfR0FJTl9SRUcpOwogCi0JLyoKLQkgKiB3cml0ZSBjaGFubmVsIGxpbWl0cyB0byBtdWx0aXBsZXhlciwgc2V0IExvdyAoYml0cyAwLTMpIGFuZAotCSAqIEhpZ2ggKGJpdHMgNC03KSBjaGFubmVscyB0byBjaGFuLgotCSAqLwotCWNoYW5saW1zID0gY2hhbiB8IChjaGFuIDw8IDQpOwotCW91dGIoY2hhbmxpbXMsIGRldnByaXYtPkJBRFIzICsgMCk7CisJLyogc2V0IG11eCBmb3Igc2luZ2xlIGNoYW5uZWwgc2NhbiAqLworCW91dGIoUENJTURBU19NVVgoY2hhbiwgY2hhbiksIGRldnByaXYtPkJBRFIzICsgUENJTURBU19NVVhfUkVHKTsKIAogCS8qIGNvbnZlcnQgbiBzYW1wbGVzICovCiAJZm9yIChuID0gMDsgbiA8IGluc24tPm47IG4rKykgewogCQkvKiB0cmlnZ2VyIGNvbnZlcnNpb24gKi8KLQkJb3V0dygwLCBkZXZwcml2LT5kYXFpbyArIDApOworCQlvdXR3KDAsIGRldnByaXYtPmRhcWlvICsgUENJTURBU19BSV9TT0ZUVFJJR19SRUcpOwogCiAJCS8qIHdhaXQgZm9yIGNvbnZlcnNpb24gdG8gZW5kICovCiAJCXJldCA9IGNvbWVkaV90aW1lb3V0KGRldiwgcywgaW5zbiwgY2JfcGNpbWRhc19haV9lb2MsIDApOwpAQCAtMTU0LDcgKzIxNyw3IEBACiAJCQlyZXR1cm4gcmV0OwogCiAJCS8qIHJlYWQgZGF0YSAqLwotCQlkYXRhW25dID0gaW53KGRldnByaXYtPmRhcWlvICsgMCk7CisJCWRhdGFbbl0gPSBpbncoZGV2cHJpdi0+ZGFxaW8gKyBQQ0lNREFTX0FJX1JFRyk7CiAJfQogCiAJLyogcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyByZWFkL3dyaXR0ZW4gKi8KQEAgLTE2OSwyMCArMjMyLDEyOCBAQAogCXN0cnVjdCBjYl9wY2ltZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKIAl1bnNpZ25lZCBpbnQgdmFsID0gcy0+cmVhZGJhY2tbY2hhbl07Ci0JdW5zaWduZWQgaW50IHJlZyA9IChjaGFuKSA/IERBQzFfT0ZGU0VUIDogREFDMF9PRkZTRVQ7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7CiAJCXZhbCA9IGRhdGFbaV07Ci0JCW91dHcodmFsLCBkZXZwcml2LT5kYXFpbyArIHJlZyk7CisJCW91dHcodmFsLCBkZXZwcml2LT5kYXFpbyArIFBDSU1EQVNfQU9fUkVHKGNoYW4pKTsKIAl9CiAJcy0+cmVhZGJhY2tbY2hhbl0gPSB2YWw7CiAKIAlyZXR1cm4gaW5zbi0+bjsKIH0KIAorc3RhdGljIGludCBjYl9wY2ltZGFzX2RpX2luc25fcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IGNiX3BjaW1kYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJdmFsID0gaW5iKGRldnByaXYtPkJBRFIzICsgUENJTURBU19ESV9ET19SRUcpOworCisJZGF0YVsxXSA9IHZhbCAmIDB4MGY7CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIGludCBjYl9wY2ltZGFzX2RvX2luc25fd3JpdGUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCXN0cnVjdCBjYl9wY2ltZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisKKwlpZiAoY29tZWRpX2Rpb191cGRhdGVfc3RhdGUocywgZGF0YSkpCisJCW91dGIocy0+c3RhdGUsIGRldnByaXYtPkJBRFIzICsgUENJTURBU19ESV9ET19SRUcpOworCisJZGF0YVsxXSA9IHMtPnN0YXRlOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgY2JfcGNpbWRhc19jb3VudGVyX2luc25fY29uZmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJCSAgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAorCQkJCQkgIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY2JfcGNpbWRhc19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjdHJsOworCisJc3dpdGNoIChkYXRhWzBdKSB7CisJY2FzZSBJTlNOX0NPTkZJR19TRVRfQ0xPQ0tfU1JDOgorCQlzd2l0Y2ggKGRhdGFbMV0pIHsKKwkJY2FzZSAwOgkvKiBpbnRlcm5hbCAxMDAga0h6IGNsb2NrICovCisJCQljdHJsID0gUENJTURBU19VU0VSX0NOVFJfQ1RSMV9DTEtfU0VMOworCQkJYnJlYWs7CisJCWNhc2UgMToJLyogZXh0ZXJuYWwgY2xrIG9uIHBpbiAyMSAqLworCQkJY3RybCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW91dGIoY3RybCwgZGV2cHJpdi0+QkFEUjMgKyBQQ0lNREFTX1VTRVJfQ05UUl9SRUcpOworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX0dFVF9DTE9DS19TUkM6CisJCWN0cmwgPSBpbmIoZGV2cHJpdi0+QkFEUjMgKyBQQ0lNREFTX1VTRVJfQ05UUl9SRUcpOworCQlpZiAoY3RybCAmIFBDSU1EQVNfVVNFUl9DTlRSX0NUUjFfQ0xLX1NFTCkgeworCQkJZGF0YVsxXSA9IDA7CisJCQlkYXRhWzJdID0gSTgyNTRfT1NDX0JBU0VfMTAwS0haOworCQl9IGVsc2UgeworCQkJZGF0YVsxXSA9IDE7CisJCQlkYXRhWzJdID0gMDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gaW5zbi0+bjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBjYl9wY2ltZGFzX3BhY2VyX2NsayhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjYl9wY2ltZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCS8qIFRoZSBQYWNlciBDbG9jayBqdW1wZXIgc2VsZWN0cyBhIDEwIE1IeiBvciAxIE1IeiBjbG9jayAqLworCXN0YXR1cyA9IGluYihkZXZwcml2LT5CQURSMyArIFBDSU1EQVNfU1RBVFVTX1JFRyk7CisJaWYgKHN0YXR1cyAmIFBDSU1EQVNfU1RBVFVTX0NMSykKKwkJcmV0dXJuIEk4MjU0X09TQ19CQVNFXzEwTUhaOworCXJldHVybiBJODI1NF9PU0NfQkFTRV8xTUhaOworfQorCitzdGF0aWMgYm9vbCBjYl9wY2ltZGFzX2lzX2FpX3NlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNiX3BjaW1kYXNfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgc3RhdHVzOworCisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIEFuYWxvZyBJbnB1dCBjaGFubmVscyBpcyBzZXQgd2l0aCB0aGUKKwkgKiBBbmFsb2cgSW5wdXQgTW9kZSBTd2l0Y2ggb24gdGhlIGJvYXJkLiBUaGUgYm9hcmQgY2FuCisJICogaGF2ZSAxNiBzaW5nbGUtZW5kZWQgb3IgOCBkaWZmZXJlbnRpYWwgY2hhbm5lbHMuCisJICovCisJc3RhdHVzID0gaW5iKGRldnByaXYtPkJBRFIzICsgUENJTURBU19TVEFUVVNfUkVHKTsKKwlyZXR1cm4gc3RhdHVzICYgUENJTURBU19TVEFUVVNfTVVYOworfQorCitzdGF0aWMgYm9vbCBjYl9wY2ltZGFzX2lzX2FpX3VuaShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjYl9wY2ltZGFzX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCS8qCisJICogVGhlIEFuYWxvZyBJbnB1dCByYW5nZSBwb2xhcml0eSBpcyBzZXQgd2l0aCB0aGUKKwkgKiBBbmFsb2cgSW5wdXQgUG9sYXJpdHkgU3dpdGNoIG9uIHRoZSBib2FyZC4gVGhlCisJICogaW5wdXRzIGNhbiBiZSBzZXQgdG8gVW5pcG9sYXIgb3IgQmlwb2xhciByYW5nZXMuCisJICovCisJc3RhdHVzID0gaW5iKGRldnByaXYtPkJBRFIzICsgUENJTURBU19TVEFUVVNfUkVHKTsKKwlyZXR1cm4gc3RhdHVzICYgUENJTURBU19TVEFUVVNfVUI7Cit9CisKIHN0YXRpYyBpbnQgY2JfcGNpbWRhc19hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKKwkJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGNiX3BjaW1kYXNfcHJpdmF0ZSAqZGV2cHJpdjsKQEAgLTIwMSw0MiArMzcyLDc5IEBACiAJZGV2cHJpdi0+QkFEUjMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAzKTsKIAlkZXYtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDQpOwogCi0JcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCAzKTsKKwlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXZwcml2LT5CQURSMyArIFBDSU1EQVNfODI1NF9CQVNFLAorCQkJCSAgICAgIGNiX3BjaW1kYXNfcGFjZXJfY2xrKGRldiksCisJCQkJICAgICAgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldi0+cGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJLyogQW5hbG9nIElucHV0IHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzBdOwotCS8qIGRldi0+cmVhZF9zdWJkZXY9czsgKi8KLQkvKiAgYW5hbG9nIGlucHV0IHN1YmRldmljZSAqLwotCXMtPnR5cGUgPSBDT01FRElfU1VCRF9BSTsKLQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfR1JPVU5EOwotCXMtPm5fY2hhbiA9IDE2OwotCXMtPm1heGRhdGEgPSAweGZmZmY7Ci0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsKLQlzLT5sZW5fY2hhbmxpc3QgPSAxOwkvKiAgVGhpcyBpcyB0aGUgbWF4aW11bSBjaGFubGlzdCBsZW5ndGggdGhhdCAqLwotCS8qICB0aGUgYm9hcmQgY2FuIGhhbmRsZSAqLwotCXMtPmluc25fcmVhZCA9IGNiX3BjaW1kYXNfYWlfcmluc247CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9BSTsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfUkVBREFCTEU7CisJaWYgKGNiX3BjaW1kYXNfaXNfYWlfc2UoZGV2KSkgeworCQlzLT5zdWJkZXZfZmxhZ3MJfD0gU0RGX0dST1VORDsKKwkJcy0+bl9jaGFuCT0gMTY7CisJfSBlbHNlIHsKKwkJcy0+c3ViZGV2X2ZsYWdzCXw9IFNERl9ESUZGOworCQlzLT5uX2NoYW4JPSA4OworCX0KKwlzLT5tYXhkYXRhCT0gMHhmZmZmOworCXMtPnJhbmdlX3RhYmxlCT0gY2JfcGNpbWRhc19pc19haV91bmkoZGV2KSA/ICZjYl9wY2ltZGFzX2FpX3VuaV9yYW5nZQorCQkJCQkJICAgIDogJmNiX3BjaW1kYXNfYWlfYmlwX3JhbmdlOworCXMtPmluc25fcmVhZAk9IGNiX3BjaW1kYXNfYWlfaW5zbl9yZWFkOwogCisJLyogQW5hbG9nIE91dHB1dCBzdWJkZXZpY2UgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1sxXTsKLQkvKiAgYW5hbG9nIG91dHB1dCBzdWJkZXZpY2UgKi8KLQlzLT50eXBlID0gQ09NRURJX1NVQkRfQU87Ci0Jcy0+c3ViZGV2X2ZsYWdzID0gU0RGX1dSSVRBQkxFOwotCXMtPm5fY2hhbiA9IDI7Ci0Jcy0+bWF4ZGF0YSA9IDB4ZmZmOwotCS8qIHJhbmdlcyBhcmUgaGFyZHdhcmUgc2V0dGFibGUsIGJ1dCBub3Qgc29mdHdhcmUgcmVhZGFibGUuICovCi0Jcy0+cmFuZ2VfdGFibGUgPSAmcmFuZ2VfdW5rbm93bjsKLQlzLT5pbnNuX3dyaXRlID0gY2JfcGNpbWRhc19hb19pbnNuX3dyaXRlOworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQU87CisJcy0+c3ViZGV2X2ZsYWdzCT0gU0RGX1dSSVRBQkxFOworCXMtPm5fY2hhbgk9IDI7CisJcy0+bWF4ZGF0YQk9IDB4ZmZmOworCXMtPnJhbmdlX3RhYmxlCT0gJmNiX3BjaW1kYXNfYW9fcmFuZ2U7CisJcy0+aW5zbl93cml0ZQk9IGNiX3BjaW1kYXNfYW9faW5zbl93cml0ZTsKIAogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZfcmVhZGJhY2socyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCS8qIERpZ2l0YWwgSS9PIHN1YmRldmljZSAqLwogCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzJdOwotCS8qIGRpZ2l0YWwgaS9vIHN1YmRldmljZSAqLwotCXJldCA9IHN1YmRldl84MjU1X2luaXQoZGV2LCBzLCBOVUxMLCAweDAwKTsKKwlyZXQgPSBzdWJkZXZfODI1NV9pbml0KGRldiwgcywgTlVMTCwgUENJTURBU184MjU1X0JBU0UpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKKwkvKiBEaWdpdGFsIElucHV0IHN1YmRldmljZSAobWFpbiBjb25uZWN0b3IpICovCisJcyA9ICZkZXYtPnN1YmRldmljZXNbM107CisJcy0+dHlwZQkJPSBDT01FRElfU1VCRF9ESTsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfUkVBREFCTEU7CisJcy0+bl9jaGFuCT0gNDsKKwlzLT5tYXhkYXRhCT0gMTsKKwlzLT5yYW5nZV90YWJsZQk9ICZyYW5nZV9kaWdpdGFsOworCXMtPmluc25fcmVhZAk9IGNiX3BjaW1kYXNfZGlfaW5zbl9yZWFkOworCisJLyogRGlnaXRhbCBPdXRwdXQgc3ViZGV2aWNlIChtYWluIGNvbm5lY3RvcikgKi8KKwlzID0gJmRldi0+c3ViZGV2aWNlc1s0XTsKKwlzLT50eXBlCQk9IENPTUVESV9TVUJEX0RPOworCXMtPnN1YmRldl9mbGFncwk9IFNERl9XUklUQUJMRTsKKwlzLT5uX2NoYW4JPSA0OworCXMtPm1heGRhdGEJPSAxOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX2RpZ2l0YWw7CisJcy0+aW5zbl93cml0ZQk9IGNiX3BjaW1kYXNfZG9faW5zbl93cml0ZTsKKworCS8qIENvdW50ZXIgc3ViZGV2aWNlICg4MjU0KSAqLworCXMgPSAmZGV2LT5zdWJkZXZpY2VzWzVdOworCWNvbWVkaV84MjU0X3N1YmRldmljZV9pbml0KHMsIGRldi0+cGFjZXIpOworCisJZGV2LT5wYWNlci0+aW5zbl9jb25maWcgPSBjYl9wY2ltZGFzX2NvdW50ZXJfaW5zbl9jb25maWc7CisKKwkvKiBjb3VudGVycyAxIGFuZCAyIGFyZSB1c2VkIGludGVybmFsbHkgZm9yIHRoZSBwYWNlciAqLworCWNvbWVkaV84MjU0X3NldF9idXN5KGRldi0+cGFjZXIsIDEsIHRydWUpOworCWNvbWVkaV84MjU0X3NldF9idXN5KGRldi0+cGFjZXIsIDIsIHRydWUpOworCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGRhLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY2JfcGNpbWRkYS5jCmluZGV4IDAzMDQzZTcuLmE0NzgxZGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jYl9wY2ltZGRhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NiX3BjaW1kZGEuYwpAQCAtNzUsOSArNzUsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2luY2x1ZGUgIjgyNTUuaCIKIApAQCAtMTM0LDcgKzEzMyw3IEBACiB9CiAKIHN0YXRpYyBpbnQgY2JfcGNpbWRkYV9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgdW5zaWduZWQgbG9uZyBjb250ZXh0X3VudXNlZCkKKwkJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpXzgyNTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfODI1NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNWQ1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpXzgyNTQuYwpAQCAtMCwwICsxLDY2NCBAQAorLyoKKyAqIGNvbWVkaV84MjU0LmMKKyAqIEdlbmVyaWMgODI1NCB0aW1lci9jb3VudGVyIHN1cHBvcnQKKyAqIENvcHlyaWdodCAoQykgMjAxNCBIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4KKyAqCisgKiBCYXNlZCBvbiA4MjUzLmggYW5kIHZhcmlvdXMgc3ViZGV2aWNlIGltcGxlbWVudGF0aW9ucyBpbiBjb21lZGkgZHJpdmVycy4KKyAqCisgKiBDT01FREkgLSBMaW51eCBDb250cm9sIGFuZCBNZWFzdXJlbWVudCBEZXZpY2UgSW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGF2aWQgQS4gU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBNb2R1bGU6IGNvbWVkaV84MjU0CisgKiBEZXNjcmlwdGlvbjogR2VuZXJpYyA4MjU0IHRpbWVyL2NvdW50ZXIgc3VwcG9ydAorICogQXV0aG9yOiBIIEhhcnRsZXkgU3dlZXRlbiA8aHN3ZWV0ZW5AdmlzaW9uZW5ncmF2ZXJzLmNvbT4KKyAqIFVwZGF0ZWQ6IFRodSBKYW4gOCAxNjo0NTo0NSBNU1QgMjAxNQorICogU3RhdHVzOiB3b3JrcworICoKKyAqIFRoaXMgbW9kdWxlIGlzIG5vdCB1c2VkIGRpcmVjdGx5IGJ5IGVuZC11c2Vycy4gUmF0aGVyLCBpdCBpcyB1c2VkIGJ5IG90aGVyCisgKiBkcml2ZXJzIHRvIHByb3ZpZGUgc3VwcG9ydCBmb3IgYW4gODI1NCBQcm9ncmFtbWFibGUgSW50ZXJ2YWwgVGltZXIuIFRoZXNlCisgKiBjb3VudGVycyBhcmUgdHlwaWNhbGx5IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHBhY2VyIGNsb2NrIHVzZWQgZm9yIGRhdGEKKyAqIGFjcXVpc2l0aW9uLiBTb21lIGRyaXZlcnMgYWxzbyBleHBvc2UgdGhlIGNvdW50ZXJzIGZvciBnZW5lcmFsIHB1cnBvc2UgdXNlLgorICoKKyAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgYmFzaWMgZnVuY3Rpb25zOgorICoKKyAqIGNvbWVkaV84MjU0X2luaXQoKSAvIGNvbWVkaV84MjU0X21tX2luaXQoKQorICoJSW5pdGlhbGl6ZXMgdGhpcyBtb2R1bGUgdG8gYWNjZXNzIHRoZSA4MjU0IHJlZ2lzdGVycy4gVGhlIF9tbSB2ZXJzaW9uCisgKglzZXRzIHVwIHRoZSBtb2R1bGUgZm9yIE1NSU8gcmVnaXN0ZXIgYWNjZXNzIHRoZSBvdGhlciBmb3IgUElPIGFjY2Vzcy4KKyAqCVRoZSBwb2ludGVyIHJldHVybmVkIGZyb20gdGhlc2UgZnVuY3Rpb25zIGlzIG5vcm1hbGx5IHN0b3JlZCBpbiB0aGUKKyAqCWNvbWVkaV9kZXZpY2UgZGV2LT5wYWNlciBhbmQgd2lsbCBiZSBmcmVlZCBieSB0aGUgY29tZWRpIGNvcmUgZHVyaW5nCisgKgl0aGUgZHJpdmVyICgqZGV0YWNoKS4gSWYgYSBkcml2ZXIgaGFzIG11bHRpcGxlIDgyNTQgZGV2aWNlcywgdGhleSBuZWVkCisgKgl0byBiZSBzdG9yZWQgaW4gdGhlIGRyaXZlcnMgcHJpdmF0ZSBkYXRhIGFuZCBmcmVlZCB3aGVuIHRoZSBkcml2ZXIgaXMKKyAqCWRldGFjaGVkLgorICoKKyAqCU5PVEU6IFRoZSBjb3VudGVycyBhcmUgcmVzZXQgYnkgc2V0dGluZyB0aGVtIHRvIEk4MjU0X01PREUwIGFzIHBhcnQgb2YKKyAqCXRoaXMgaW5pdGlhbGl6YXRpb24uCisgKgorICogY29tZWRpXzgyNTRfc2V0X21vZGUoKQorICoJU2V0cyBhIGNvdW50ZXJzIG9wZXJhdGlvbiBtb2RlOgorICoJCUk4MjU0X01PREUwCUludGVycnVwdCBvbiB0ZXJtaW5hbCBjb3VudAorICoJCUk4MjU0X01PREUxCUhhcmR3YXJlIHJldHJpZ2dlcmFibGUgb25lLXNob3QKKyAqCQlJODI1NF9NT0RFMglSYXRlIGdlbmVyYXRvcgorICoJCUk4MjU0X01PREUzCVNxdWFyZSB3YXZlIG1vZGUKKyAqCQlJODI1NF9NT0RFNAlTb2Z0d2FyZSB0cmlnZ2VyZWQgc3Ryb2JlCisgKgkJSTgyNTRfTU9ERTUJSGFyZHdhcmUgdHJpZ2dlcmVkIHN0cm9iZSAocmV0cmlnZ2VyYWJsZSkKKyAqCisgKglJbiBhZGRpdGlvbiBJODI1NF9CQ0QgYW5kIEk4MjU0X0JJTkFSWSBzcGVjaWZ5IHRoZSBjb3VudGluZyBtb2RlOgorICoJCUk4MjU0X0JDRAlCQ0QgY291bnRpbmcKKyAqCQlJODI1NF9CSU5BUlkJQmluYXJ5IGNvdW50aW5nCisgKgorICogY29tZWRpXzgyNTRfd3JpdGUoKQorICoJV3JpdGVzIGFuIGluaXRpYWwgdmFsdWUgdG8gYSBjb3VudGVyLgorICoKKyAqCVRoZSBsYXJnZXN0IHBvc3NpYmxlIGluaXRpYWwgY291bnQgaXMgMDsgdGhpcyBpcyBlcXVpdmFsZW50IHRvIDJeMTYKKyAqCWZvciBiaW5hcnkgY291bnRpbmcgYW5kIDEwXjQgZm9yIEJDRCBjb3VudGluZy4KKyAqCisgKglOT1RFOiBUaGUgY291bnRlciBkb2VzIG5vdCBzdG9wIHdoZW4gaXQgcmVhY2hlcyB6ZXJvLiBJbiBNb2RlIDAsIDEsIDQsCisgKglhbmQgNSB0aGUgY291bnRlciAid3JhcHMgYXJvdW5kIiB0byB0aGUgaGlnaGVzdCBjb3VudCwgZWl0aGVyIDB4ZmZmZgorICoJZm9yIGJpbmFyeSBjb3VudGluZyBvciA5OTk5IGZvciBCQ0QgY291bnRpbmcsIGFuZCBjb250aW51ZXMgY291bnRpbmcuCisgKglNb2RlcyAyIGFuZCAzIGFyZSBwZXJpb2RpYzsgdGhlIGNvdW50ZXIgcmVsb2FkcyBpdHNlbGYgd2l0aCB0aGUgaW5pdGlhbAorICoJY291bnQgYW5kIGNvbnRpbnVlcyBjb3VudGluZyBmcm9tIHRoZXJlLgorICoKKyAqIGNvbWVkaV84MjU0X3JlYWQoKQorICoJUmVhZHMgdGhlIGN1cnJlbnQgdmFsdWUgZnJvbSBhIGNvdW50ZXIuCisgKgorICogY29tZWRpXzgyNTRfc3RhdHVzKCkKKyAqCVJlYWRzIHRoZSBzdGF0dXMgb2YgYSBjb3VudGVyLgorICoKKyAqIGNvbWVkaV84MjU0X2xvYWQoKQorICoJU2V0cyBhIGNvdW50ZXJzIG9wZXJhdGlvbiBtb2RlIGFuZCB3cml0ZXMgdGhlIGluaXRpYWwgdmFsdWUuCisgKgorICogVHlwaWNhbGx5IHRoZSBwYWNlciBjbG9jayBpcyBjcmVhdGVkIGJ5IGNhc2NhZGluZyB0d28gb2YgdGhlIDE2LWJpdCBjb3VudGVycworICogdG8gY3JlYXRlIGEgMzItYml0IHJhdGUgZ2VuZXJhdG9yIChJODI1NF9NT0RFMikuIFRoZXNlIGZ1bmN0aW9ucyBhcmUKKyAqIHByb3ZpZGVkIHRvIGhhbmRsZSB0aGUgY2FzY2FkZWQgY291bnRlcnM6CisgKgorICogY29tZWRpXzgyNTRfbnNfdG9fdGltZXIoKQorICoJQ2FsY3VsYXRlcyB0aGUgZGl2aXNvciB2YWx1ZSBuZWVkZWQgZm9yIGEgc2luZ2xlIGNvdW50ZXIgdG8gZ2VuZXJhdGUKKyAqCW5zIHRpbWluZy4KKyAqCisgKiBjb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKCkKKyAqCUNhbGN1bGF0ZXMgdGhlIHR3byBkaXZpc29yIHZhbHVlcyBuZWVkZWQgdG8gdGhlIGdlbmVyYXRlIHRoZSBwYWNlcgorICoJY2xvY2sgKGluIG5zKS4KKyAqCisgKiBjb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMoKQorICoJVHJhbnNmZXJzIHRoZSBpbnRlcm1lZGlhdGUgZGl2aXNvciB2YWx1ZXMgdG8gdGhlIGN1cnJlbnQgZGl2aXNvcnMuCisgKgorICogY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKCkKKyAqCVByb2dyYW1zIHRoZSBtb2RlIG9mIHRoZSBjYXNjYWRlZCBjb3VudGVycyBhbmQgd3JpdGVzIHRoZSBjdXJyZW50CisgKglkaXZpc29yIHZhbHVlcy4KKyAqCisgKiBUbyBleHBvc2UgdGhlIGNvdW50ZXJzIGFzIGEgc3ViZGV2aWNlIGZvciBnZW5lcmFsIHB1cnBvc2UgdXNlIHRoZSBmb2xsb3dpbmcKKyAqIGZ1bmN0aW9ucyBhIHByb3ZpZGVkOgorICoKKyAqIGNvbWVkaV84MjU0X3N1YmRldmljZV9pbml0KCkKKyAqCUluaXRpYWxpemVzIGEgY29tZWRpX3N1YmRldmljZSB0byB1c2UgdGhlIDgyNTQgdGltZXIuCisgKgorICogY29tZWRpXzgyNTRfc2V0X2J1c3koKQorICoJSW50ZXJuYWxseSBmbGFncyBhIGNvdW50ZXIgYXMgImJ1c3kiLiBUaGlzIGlzIGRvbmUgdG8gcHJvdGVjdCB0aGUKKyAqCWNvdW50ZXJzIHRoYXQgYXJlIHVzZWQgZm9yIHRoZSBjYXNjYWRlZCAzMi1iaXQgcGFjZXIuCisgKgorICogVGhlIHN1YmRldmljZSBwcm92aWRlcyAoKmluc25fcmVhZCkgYW5kICgqaW5zbl93cml0ZSkgb3BlcmF0aW9ucyB0byByZWFkCisgKiB0aGUgY3VycmVudCB2YWx1ZSBhbmQgd3JpdGUgYW4gaW5pdGlhbCB2YWx1ZSB0byBhIGNvdW50ZXIuIEEgKCppbnNuX2NvbmZpZykKKyAqIG9wZXJhdGlvbiBpcyBhbHNvIHByb3ZpZGVkIHRvIGhhbmRsZSB0aGUgZm9sbG93aW5nIGNvbWVkaSBpbnN0cnVjdGlvbnM6CisgKgorICoJSU5TTl9DT05GSUdfU0VUX0NPVU5URVJfTU9ERQljYWxscyBjb21lZGlfODI1NF9zZXRfbW9kZSgpCisgKglJTlNOX0NPTkZJR184MjU0X1JFQURfU1RBVFVTCWNhbGxzIGNvbWVkaV84MjU0X3N0YXR1cygpCisgKgorICogVGhlICgqaW5zbl9jb25maWcpIG1lbWJlciBvZiBjb21lZGlfODI1NCBjYW4gYmUgaW5pdGlhbGl6ZWQgYnkgdGhlIGV4dGVybmFsCisgKiBkcml2ZXIgdG8gaGFuZGxlIGFueSBhZGRpdGlvbmFsIGluc3RydWN0aW9ucy4KKyAqCisgKiBOT1RFOiBHYXRlIGNvbnRyb2wsIGNsb2NrIHJvdXRpbmcsIGFuZCBhbnkgaW50ZXJydXB0IGhhbmRsaW5nIGZvciB0aGUKKyAqIGNvdW50ZXJzIGlzIG5vdCBoYW5kbGVkIGJ5IHRoaXMgbW9kdWxlLiBUaGVzZSBmZWF0dXJlcyBhcmUgZHJpdmVyIGRlcGVuZGVudC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19pODI1NF9yZWFkKHN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQsIHVuc2lnbmVkIGludCByZWcpCit7CisJdW5zaWduZWQgaW50IHJlZ19vZmZzZXQgPSAocmVnICogaTgyNTQtPmlvc2l6ZSkgPDwgaTgyNTQtPnJlZ3NoaWZ0OworCXVuc2lnbmVkIGludCB2YWw7CisKKwlzd2l0Y2ggKGk4MjU0LT5pb3NpemUpIHsKKwlkZWZhdWx0OgorCWNhc2UgSTgyNTRfSU84OgorCQlpZiAoaTgyNTQtPm1taW8pCisJCQl2YWwgPSByZWFkYihpODI1NC0+bW1pbyArIHJlZ19vZmZzZXQpOworCQllbHNlCisJCQl2YWwgPSBpbmIoaTgyNTQtPmlvYmFzZSArIHJlZ19vZmZzZXQpOworCQlicmVhazsKKwljYXNlIEk4MjU0X0lPMTY6CisJCWlmIChpODI1NC0+bW1pbykKKwkJCXZhbCA9IHJlYWR3KGk4MjU0LT5tbWlvICsgcmVnX29mZnNldCk7CisJCWVsc2UKKwkJCXZhbCA9IGludyhpODI1NC0+aW9iYXNlICsgcmVnX29mZnNldCk7CisJCWJyZWFrOworCWNhc2UgSTgyNTRfSU8zMjoKKwkJaWYgKGk4MjU0LT5tbWlvKQorCQkJdmFsID0gcmVhZGwoaTgyNTQtPm1taW8gKyByZWdfb2Zmc2V0KTsKKwkJZWxzZQorCQkJdmFsID0gaW5sKGk4MjU0LT5pb2Jhc2UgKyByZWdfb2Zmc2V0KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiB2YWwgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBfX2k4MjU0X3dyaXRlKHN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQsCisJCQkgIHVuc2lnbmVkIGludCB2YWwsIHVuc2lnbmVkIGludCByZWcpCit7CisJdW5zaWduZWQgaW50IHJlZ19vZmZzZXQgPSAocmVnICogaTgyNTQtPmlvc2l6ZSkgPDwgaTgyNTQtPnJlZ3NoaWZ0OworCisJc3dpdGNoIChpODI1NC0+aW9zaXplKSB7CisJZGVmYXVsdDoKKwljYXNlIEk4MjU0X0lPODoKKwkJaWYgKGk4MjU0LT5tbWlvKQorCQkJd3JpdGViKHZhbCwgaTgyNTQtPm1taW8gKyByZWdfb2Zmc2V0KTsKKwkJZWxzZQorCQkJb3V0Yih2YWwsIGk4MjU0LT5pb2Jhc2UgKyByZWdfb2Zmc2V0KTsKKwkJYnJlYWs7CisJY2FzZSBJODI1NF9JTzE2OgorCQlpZiAoaTgyNTQtPm1taW8pCisJCQl3cml0ZXcodmFsLCBpODI1NC0+bW1pbyArIHJlZ19vZmZzZXQpOworCQllbHNlCisJCQlvdXR3KHZhbCwgaTgyNTQtPmlvYmFzZSArIHJlZ19vZmZzZXQpOworCQlicmVhazsKKwljYXNlIEk4MjU0X0lPMzI6CisJCWlmIChpODI1NC0+bW1pbykKKwkJCXdyaXRlbCh2YWwsIGk4MjU0LT5tbWlvICsgcmVnX29mZnNldCk7CisJCWVsc2UKKwkJCW91dGwodmFsLCBpODI1NC0+aW9iYXNlICsgcmVnX29mZnNldCk7CisJCWJyZWFrOworCX0KK30KKworLyoqCisgKiBjb21lZGlfODI1NF9zdGF0dXMgLSByZXR1cm4gdGhlIHN0YXR1cyBvZiBhIGNvdW50ZXIKKyAqIEBpODI1NDoJY29tZWRpXzgyNTQgc3RydWN0IGZvciB0aGUgdGltZXIKKyAqIEBjb3VudGVyOgl0aGUgY291bnRlciBudW1iZXIKKyAqLwordW5zaWduZWQgaW50IGNvbWVkaV84MjU0X3N0YXR1cyhzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0LCB1bnNpZ25lZCBpbnQgY291bnRlcikKK3sKKwl1bnNpZ25lZCBpbnQgY21kOworCisJaWYgKGNvdW50ZXIgPiAyKQorCQlyZXR1cm4gMDsKKworCWNtZCA9IEk4MjU0X0NUUkxfUkVBREJBQ0tfU1RBVFVTIHwgSTgyNTRfQ1RSTF9SRUFEQkFDS19TRUxfQ1RSKGNvdW50ZXIpOworCV9faTgyNTRfd3JpdGUoaTgyNTQsIGNtZCwgSTgyNTRfQ1RSTF9SRUcpOworCisJcmV0dXJuIF9faTgyNTRfcmVhZChpODI1NCwgY291bnRlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfODI1NF9zdGF0dXMpOworCisvKioKKyAqIGNvbWVkaV84MjU0X3JlYWQgLSByZWFkIHRoZSBjdXJyZW50IGNvdW50ZXIgdmFsdWUKKyAqIEBpODI1NDoJY29tZWRpXzgyNTQgc3RydWN0IGZvciB0aGUgdGltZXIKKyAqIEBjb3VudGVyOgl0aGUgY291bnRlciBudW1iZXIKKyAqLwordW5zaWduZWQgaW50IGNvbWVkaV84MjU0X3JlYWQoc3RydWN0IGNvbWVkaV84MjU0ICppODI1NCwgdW5zaWduZWQgaW50IGNvdW50ZXIpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChjb3VudGVyID4gMikKKwkJcmV0dXJuIDA7CisKKwkvKiBsYXRjaCBjb3VudGVyICovCisJX19pODI1NF93cml0ZShpODI1NCwgSTgyNTRfQ1RSTF9TRUxfQ1RSKGNvdW50ZXIpIHwgSTgyNTRfQ1RSTF9MQVRDSCwKKwkJICAgICAgSTgyNTRfQ1RSTF9SRUcpOworCisJLyogcmVhZCBMU0IgdGhlbiBNU0IgKi8KKwl2YWwgPSBfX2k4MjU0X3JlYWQoaTgyNTQsIGNvdW50ZXIpOworCXZhbCB8PSAoX19pODI1NF9yZWFkKGk4MjU0LCBjb3VudGVyKSA8PCA4KTsKKworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfODI1NF9yZWFkKTsKKworLyoqCisgKiBjb21lZGlfODI1NF93cml0ZSAtIGxvYWQgYSAxNi1iaXQgaW5pdGlhbCBjb3VudGVyIHZhbHVlCisgKiBAaTgyNTQ6CWNvbWVkaV84MjU0IHN0cnVjdCBmb3IgdGhlIHRpbWVyCisgKiBAY291bnRlcjoJdGhlIGNvdW50ZXIgbnVtYmVyCisgKiBAdmFsOgl0aGUgaW5pdGlhbCB2YWx1ZQorICovCit2b2lkIGNvbWVkaV84MjU0X3dyaXRlKHN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnRlciwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZTsKKworCWlmIChjb3VudGVyID4gMikKKwkJcmV0dXJuOworCWlmICh2YWwgPiAweGZmZmYpCisJCXJldHVybjsKKworCS8qIGxvYWQgTFNCIHRoZW4gTVNCICovCisJYnl0ZSA9IHZhbCAmIDB4ZmY7CisJX19pODI1NF93cml0ZShpODI1NCwgYnl0ZSwgY291bnRlcik7CisJYnl0ZSA9ICh2YWwgPj4gOCkgJiAweGZmOworCV9faTgyNTRfd3JpdGUoaTgyNTQsIGJ5dGUsIGNvdW50ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpXzgyNTRfd3JpdGUpOworCisvKioKKyAqIGNvbWVkaV84MjU0X3NldF9tb2RlIC0gc2V0IHRoZSBtb2RlIG9mIGEgY291bnRlcgorICogQGk4MjU0Ogljb21lZGlfODI1NCBzdHJ1Y3QgZm9yIHRoZSB0aW1lcgorICogQGNvdW50ZXI6CXRoZSBjb3VudGVyIG51bWJlcgorICogQG1vZGU6CXRoZSBJODI1NF9NT0RFeCBhbmQgSTgyNTRfQkNEfEk4MjU0X0JJTkFSWQorICovCitpbnQgY29tZWRpXzgyNTRfc2V0X21vZGUoc3RydWN0IGNvbWVkaV84MjU0ICppODI1NCwgdW5zaWduZWQgaW50IGNvdW50ZXIsCisJCQkgdW5zaWduZWQgaW50IG1vZGUpCit7CisJdW5zaWduZWQgaW50IGJ5dGU7CisKKwlpZiAoY291bnRlciA+IDIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChtb2RlID4gKEk4MjU0X01PREU1IHwgSTgyNTRfQkNEKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlieXRlID0gSTgyNTRfQ1RSTF9TRUxfQ1RSKGNvdW50ZXIpIHwJLyogc2VsZWN0IGNvdW50ZXIgKi8KKwkgICAgICAgSTgyNTRfQ1RSTF9MU0JfTVNCIHwJCS8qIGxvYWQgTFNCIHRoZW4gTVNCICovCisJICAgICAgIG1vZGU7CQkJCS8qIG1vZGUgYW5kIEJDRHxiaW5hcnkgKi8KKwlfX2k4MjU0X3dyaXRlKGk4MjU0LCBieXRlLCBJODI1NF9DVFJMX1JFRyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV84MjU0X3NldF9tb2RlKTsKKworLyoqCisgKiBjb21lZGlfODI1NF9sb2FkIC0gcHJvZ3JhbSB0aGUgbW9kZSBhbmQgaW5pdGlhbCBjb3VudCBvZiBhIGNvdW50ZXIKKyAqIEBpODI1NDoJY29tZWRpXzgyNTQgc3RydWN0IGZvciB0aGUgdGltZXIKKyAqIEBjb3VudGVyOgl0aGUgY291bnRlciBudW1iZXIKKyAqIEBtb2RlOgl0aGUgSTgyNTRfTU9ERXggYW5kIEk4MjU0X0JDRHxJODI1NF9CSU5BUlkKKyAqIEB2YWw6CXRoZSBpbml0aWFsIHZhbHVlCisgKi8KK2ludCBjb21lZGlfODI1NF9sb2FkKHN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQsIHVuc2lnbmVkIGludCBjb3VudGVyLAorCQkgICAgIHVuc2lnbmVkIGludCB2YWwsIHVuc2lnbmVkIGludCBtb2RlKQoreworCWlmIChjb3VudGVyID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbCA+IDB4ZmZmZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG1vZGUgPiAoSTgyNTRfTU9ERTUgfCBJODI1NF9CQ0QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvbWVkaV84MjU0X3NldF9tb2RlKGk4MjU0LCBjb3VudGVyLCBtb2RlKTsKKwljb21lZGlfODI1NF93cml0ZShpODI1NCwgY291bnRlciwgdmFsKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpXzgyNTRfbG9hZCk7CisKKy8qKgorICogY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlIC0gc2V0IHRoZSBtb2RlIGFuZCBsb2FkIHRoZSBjYXNjYWRlZCBjb3VudGVycworICogQGk4MjU0Ogljb21lZGlfODI1NCBzdHJ1Y3QgZm9yIHRoZSB0aW1lcgorICogQGNvdW50ZXIxOgl0aGUgY291bnRlciBudW1iZXIgZm9yIHRoZSBmaXJzdCBkaXZpc29yCisgKiBAY291bnRlcjI6CXRoZSBjb3VudGVyIG51bWJlciBmb3IgdGhlIHNlY29uZCBkaXZpc29yCisgKiBAZW5hYmxlOglmbGFnIHRvIGVuYWJsZSAobG9hZCkgdGhlIGNvdW50ZXJzCisgKi8KK3ZvaWQgY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKHN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnRlcjEsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnRlcjIsCisJCQkgICAgICBib29sIGVuYWJsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbW9kZTsKKworCWlmIChjb3VudGVyMSA+IDIgfHwgY291bnRlcjIgPiAyIHx8IGNvdW50ZXIxID09IGNvdW50ZXIyKQorCQlyZXR1cm47CisKKwlpZiAoZW5hYmxlKQorCQltb2RlID0gSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlk7CisJZWxzZQorCQltb2RlID0gSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlk7CisKKwljb21lZGlfODI1NF9zZXRfbW9kZShpODI1NCwgY291bnRlcjEsIG1vZGUpOworCWNvbWVkaV84MjU0X3NldF9tb2RlKGk4MjU0LCBjb3VudGVyMiwgbW9kZSk7CisKKwlpZiAoZW5hYmxlKSB7CisJCS8qCisJCSAqIERpdmlzb3JzIGFyZSBsb2FkZWQgc2Vjb25kIGNvdW50ZXIgdGhlbiBmaXJzdCBjb3VudGVyIHRvCisJCSAqIGF2b2lkIHBvc3NpYmxlIGlzc3VlcyB3aXRoIHRoZSBmaXJzdCBjb3VudGVyIGV4cGlyaW5nCisJCSAqIGJlZm9yZSB0aGUgc2Vjb25kIGNvdW50ZXIgaXMgbG9hZGVkLgorCQkgKi8KKwkJY29tZWRpXzgyNTRfd3JpdGUoaTgyNTQsIGNvdW50ZXIyLCBpODI1NC0+ZGl2aXNvcjIpOworCQljb21lZGlfODI1NF93cml0ZShpODI1NCwgY291bnRlcjEsIGk4MjU0LT5kaXZpc29yMSk7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKTsKKworLyoqCisgKiBjb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMgLSB1cGRhdGUgdGhlIGRpdmlzb3JzIGZvciB0aGUgY2FzY2FkZWQgY291bnRlcnMKKyAqIEBpODI1NDoJY29tZWRpXzgyNTQgc3RydWN0IGZvciB0aGUgdGltZXIKKyAqLwordm9pZCBjb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMoc3RydWN0IGNvbWVkaV84MjU0ICppODI1NCkKK3sKKwkvKiBtYXNraW5nIGlzIGRvbmUgc2luY2UgY291bnRlciBtYXBzIHplcm8gdG8gMHgxMDAwMCAqLworCWk4MjU0LT5kaXZpc29yID0gaTgyNTQtPm5leHRfZGl2ICYgMHhmZmZmOworCWk4MjU0LT5kaXZpc29yMSA9IGk4MjU0LT5uZXh0X2RpdjEgJiAweGZmZmY7CisJaTgyNTQtPmRpdmlzb3IyID0gaTgyNTQtPm5leHRfZGl2MiAmIDB4ZmZmZjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyk7CisKKy8qKgorICogY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lciAtIGNhbGN1bGF0ZSB0aGUgY2FzY2FkZWQgZGl2aXNvciB2YWx1ZXMKKyAqIEBpODI1NDoJY29tZWRpXzgyNTQgc3RydWN0IGZvciB0aGUgdGltZXIKKyAqIEBuYW5vc2VjOgl0aGUgZGVzaXJlZCBucyB0aW1lCisgKiBAZmxhZ3M6CWNvbWVkaV9jbWQgZmxhZ3MKKyAqLwordm9pZCBjb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKHN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKm5hbm9zZWMsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgaW50IGQxID0gaTgyNTQtPm5leHRfZGl2MSA/IGk4MjU0LT5uZXh0X2RpdjEgOiBJODI1NF9NQVhfQ09VTlQ7CisJdW5zaWduZWQgaW50IGQyID0gaTgyNTQtPm5leHRfZGl2MiA/IGk4MjU0LT5uZXh0X2RpdjIgOiBJODI1NF9NQVhfQ09VTlQ7CisJdW5zaWduZWQgaW50IGRpdiA9IGQxICogZDI7CisJdW5zaWduZWQgaW50IG5zX2x1YiA9IDB4ZmZmZmZmZmY7CisJdW5zaWduZWQgaW50IG5zX2dsYiA9IDA7CisJdW5zaWduZWQgaW50IGQxX2x1YiA9IDA7CisJdW5zaWduZWQgaW50IGQxX2dsYiA9IDA7CisJdW5zaWduZWQgaW50IGQyX2x1YiA9IDA7CisJdW5zaWduZWQgaW50IGQyX2dsYiA9IDA7CisJdW5zaWduZWQgaW50IHN0YXJ0OworCXVuc2lnbmVkIGludCBuczsKKwl1bnNpZ25lZCBpbnQgbnNfbG93OworCXVuc2lnbmVkIGludCBuc19oaWdoOworCisJLyogZXhpdCBlYXJseSBpZiBldmVyeXRoaW5nIGlzIGFscmVhZHkgY29ycmVjdCAqLworCWlmIChkaXYgKiBpODI1NC0+b3NjX2Jhc2UgPT0gKm5hbm9zZWMgJiYKKwkgICAgZDEgPiAxICYmIGQxIDw9IEk4MjU0X01BWF9DT1VOVCAmJgorCSAgICBkMiA+IDEgJiYgZDIgPD0gSTgyNTRfTUFYX0NPVU5UICYmCisJICAgIC8qIGNoZWNrIGZvciBvdmVyZmxvdyAqLworCSAgICBkaXYgPiBkMSAmJiBkaXYgPiBkMiAmJgorCSAgICBkaXYgKiBpODI1NC0+b3NjX2Jhc2UgPiBkaXYgJiYKKwkgICAgZGl2ICogaTgyNTQtPm9zY19iYXNlID4gaTgyNTQtPm9zY19iYXNlKQorCQlyZXR1cm47CisKKwlkaXYgPSAqbmFub3NlYyAvIGk4MjU0LT5vc2NfYmFzZTsKKwlkMiA9IEk4MjU0X01BWF9DT1VOVDsKKwlzdGFydCA9IGRpdiAvIGQyOworCWlmIChzdGFydCA8IDIpCisJCXN0YXJ0ID0gMjsKKwlmb3IgKGQxID0gc3RhcnQ7IGQxIDw9IGRpdiAvIGQxICsgMSAmJiBkMSA8PSBJODI1NF9NQVhfQ09VTlQ7IGQxKyspIHsKKwkJZm9yIChkMiA9IGRpdiAvIGQxOworCQkgICAgIGQxICogZDIgPD0gZGl2ICsgZDEgKyAxICYmIGQyIDw9IEk4MjU0X01BWF9DT1VOVDsgZDIrKykgeworCQkJbnMgPSBpODI1NC0+b3NjX2Jhc2UgKiBkMSAqIGQyOworCQkJaWYgKG5zIDw9ICpuYW5vc2VjICYmIG5zID4gbnNfZ2xiKSB7CisJCQkJbnNfZ2xiID0gbnM7CisJCQkJZDFfZ2xiID0gZDE7CisJCQkJZDJfZ2xiID0gZDI7CisJCQl9CisJCQlpZiAobnMgPj0gKm5hbm9zZWMgJiYgbnMgPCBuc19sdWIpIHsKKwkJCQluc19sdWIgPSBuczsKKwkJCQlkMV9sdWIgPSBkMTsKKwkJCQlkMl9sdWIgPSBkMjsKKwkJCX0KKwkJfQorCX0KKworCXN3aXRjaCAoZmxhZ3MgJiBDTURGX1JPVU5EX01BU0spIHsKKwljYXNlIENNREZfUk9VTkRfTkVBUkVTVDoKKwlkZWZhdWx0OgorCQluc19oaWdoID0gZDFfbHViICogZDJfbHViICogaTgyNTQtPm9zY19iYXNlOworCQluc19sb3cgPSBkMV9nbGIgKiBkMl9nbGIgKiBpODI1NC0+b3NjX2Jhc2U7CisJCWlmIChuc19oaWdoIC0gKm5hbm9zZWMgPCAqbmFub3NlYyAtIG5zX2xvdykgeworCQkJZDEgPSBkMV9sdWI7CisJCQlkMiA9IGQyX2x1YjsKKwkJfSBlbHNlIHsKKwkJCWQxID0gZDFfZ2xiOworCQkJZDIgPSBkMl9nbGI7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBDTURGX1JPVU5EX1VQOgorCQlkMSA9IGQxX2x1YjsKKwkJZDIgPSBkMl9sdWI7CisJCWJyZWFrOworCWNhc2UgQ01ERl9ST1VORF9ET1dOOgorCQlkMSA9IGQxX2dsYjsKKwkJZDIgPSBkMl9nbGI7CisJCWJyZWFrOworCX0KKworCSpuYW5vc2VjID0gZDEgKiBkMiAqIGk4MjU0LT5vc2NfYmFzZTsKKwlpODI1NC0+bmV4dF9kaXYxID0gZDE7CisJaTgyNTQtPm5leHRfZGl2MiA9IGQyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcik7CisKKy8qKgorICogY29tZWRpXzgyNTRfbnNfdG9fdGltZXIgLSBjYWxjdWxhdGUgdGhlIGRpdmlzb3IgdmFsdWUgZm9yIG5hbm9zZWMgdGltaW5nCisgKiBAaTgyNTQ6CWNvbWVkaV84MjU0IHN0cnVjdCBmb3IgdGhlIHRpbWVyCisgKiBAbmFub3NlYzoJdGhlIGRlc2lyZWQgbnMgdGltZQorICogQGZsYWdzOgljb21lZGlfY21kIGZsYWdzCisgKi8KK3ZvaWQgY29tZWRpXzgyNTRfbnNfdG9fdGltZXIoc3RydWN0IGNvbWVkaV84MjU0ICppODI1NCwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpuYW5vc2VjLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgaW50IGRpdmlzb3I7CisKKwlzd2l0Y2ggKGZsYWdzICYgQ01ERl9ST1VORF9NQVNLKSB7CisJZGVmYXVsdDoKKwljYXNlIENNREZfUk9VTkRfTkVBUkVTVDoKKwkJZGl2aXNvciA9IERJVl9ST1VORF9DTE9TRVNUKCpuYW5vc2VjLCBpODI1NC0+b3NjX2Jhc2UpOworCQlicmVhazsKKwljYXNlIENNREZfUk9VTkRfVVA6CisJCWRpdmlzb3IgPSBESVZfUk9VTkRfVVAoKm5hbm9zZWMsIGk4MjU0LT5vc2NfYmFzZSk7CisJCWJyZWFrOworCWNhc2UgQ01ERl9ST1VORF9ET1dOOgorCQlkaXZpc29yID0gKm5hbm9zZWMgLyBpODI1NC0+b3NjX2Jhc2U7CisJCWJyZWFrOworCX0KKwlpZiAoZGl2aXNvciA8IDIpCisJCWRpdmlzb3IgPSAyOworCWlmIChkaXZpc29yID4gSTgyNTRfTUFYX0NPVU5UKQorCQlkaXZpc29yID0gSTgyNTRfTUFYX0NPVU5UOworCisJKm5hbm9zZWMgPSBkaXZpc29yICogaTgyNTQtPm9zY19iYXNlOworCWk4MjU0LT5uZXh0X2RpdiA9IGRpdmlzb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfODI1NF9uc190b190aW1lcik7CisKKy8qKgorICogY29tZWRpXzgyNTRfc2V0X2J1c3kgLSBzZXQvY2xlYXIgdGhlICJidXN5IiBmbGFnIGZvciBhIGdpdmVuIGNvdW50ZXIKKyAqIEBpODI1NDoJY29tZWRpXzgyNTQgc3RydWN0IGZvciB0aGUgdGltZXIKKyAqIEBjb3VudGVyOgl0aGUgY291bnRlciBudW1iZXIKKyAqIEBidXN5OglzZXQvY2xlYXIgZmxhZworICovCit2b2lkIGNvbWVkaV84MjU0X3NldF9idXN5KHN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQsCisJCQkgIHVuc2lnbmVkIGludCBjb3VudGVyLCBib29sIGJ1c3kpCit7CisJaWYgKGNvdW50ZXIgPCAzKQorCQlpODI1NC0+YnVzeVtjb3VudGVyXSA9IGJ1c3k7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfODI1NF9zZXRfYnVzeSk7CisKK3N0YXRpYyBpbnQgY29tZWRpXzgyNTRfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJIHVuc2lnbmVkIGludCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0ID0gcy0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oaW5zbi0+Y2hhbnNwZWMpOworCWludCBpOworCisJaWYgKGk4MjU0LT5idXN5W2NoYW5dKQorCQlyZXR1cm4gLUVCVVNZOworCisJZm9yIChpID0gMDsgaSA8IGluc24tPm47IGkrKykKKwkJZGF0YVtpXSA9IGNvbWVkaV84MjU0X3JlYWQoaTgyNTQsIGNoYW4pOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpXzgyNTRfaW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCit7CisJc3RydWN0IGNvbWVkaV84MjU0ICppODI1NCA9IHMtPnByaXZhdGU7CisJdW5zaWduZWQgaW50IGNoYW4gPSBDUl9DSEFOKGluc24tPmNoYW5zcGVjKTsKKworCWlmIChpODI1NC0+YnVzeVtjaGFuXSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChpbnNuLT5uKQorCQljb21lZGlfODI1NF93cml0ZShpODI1NCwgY2hhbiwgZGF0YVtpbnNuLT5uIC0gMV0pOworCisJcmV0dXJuIGluc24tPm47Cit9CisKK3N0YXRpYyBpbnQgY29tZWRpXzgyNTRfaW5zbl9jb25maWcoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgdW5zaWduZWQgaW50ICpkYXRhKQoreworCXN0cnVjdCBjb21lZGlfODI1NCAqaTgyNTQgPSBzLT5wcml2YXRlOworCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7CisJaW50IHJldDsKKworCWlmIChpODI1NC0+YnVzeVtjaGFuXSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgSU5TTl9DT05GSUdfUkVTRVQ6CisJCXJldCA9IGNvbWVkaV84MjU0X3NldF9tb2RlKGk4MjU0LCBjaGFuLAorCQkJCQkgICBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlicmVhazsKKwljYXNlIElOU05fQ09ORklHX1NFVF9DT1VOVEVSX01PREU6CisJCXJldCA9IGNvbWVkaV84MjU0X3NldF9tb2RlKGk4MjU0LCBjaGFuLCBkYXRhWzFdKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWJyZWFrOworCWNhc2UgSU5TTl9DT05GSUdfODI1NF9SRUFEX1NUQVRVUzoKKwkJZGF0YVsxXSA9IGNvbWVkaV84MjU0X3N0YXR1cyhpODI1NCwgY2hhbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qCisJCSAqIElmIGF2YWlsYWJsZSwgY2FsbCB0aGUgZHJpdmVyIHByb3ZpZGVkICgqaW5zbl9jb25maWcpCisJCSAqIHRvIGhhbmRsZSBhbnkgZHJpdmVyIGltcGxlbWVudGVkIGluc3RydWN0aW9ucy4KKwkJICovCisJCWlmIChpODI1NC0+aW5zbl9jb25maWcpCisJCQlyZXR1cm4gaTgyNTQtPmluc25fY29uZmlnKGRldiwgcywgaW5zbiwgZGF0YSk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGluc24tPm47Cit9CisKKy8qKgorICogY29tZWRpXzgyNTRfc3ViZGV2aWNlX2luaXQgLSBpbml0aWFsaXplIGEgY29tZWRpX3N1YmRldmljZSBmb3IgdGhlIDgyNTQgdGltZXIKKyAqIEBzOgkJY29tZWRpX3N1YmRldmljZSBzdHJ1Y3QKKyAqLwordm9pZCBjb21lZGlfODI1NF9zdWJkZXZpY2VfaW5pdChzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQlzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0KQoreworCXMtPnR5cGUJCT0gQ09NRURJX1NVQkRfQ09VTlRFUjsKKwlzLT5zdWJkZXZfZmxhZ3MJPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7CisJcy0+bl9jaGFuCT0gMzsKKwlzLT5tYXhkYXRhCT0gMHhmZmZmOworCXMtPnJhbmdlX3RhYmxlCT0gJnJhbmdlX3Vua25vd247CisJcy0+aW5zbl9yZWFkCT0gY29tZWRpXzgyNTRfaW5zbl9yZWFkOworCXMtPmluc25fd3JpdGUJPSBjb21lZGlfODI1NF9pbnNuX3dyaXRlOworCXMtPmluc25fY29uZmlnCT0gY29tZWRpXzgyNTRfaW5zbl9jb25maWc7CisKKwlzLT5wcml2YXRlCT0gaTgyNTQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfODI1NF9zdWJkZXZpY2VfaW5pdCk7CisKK3N0YXRpYyBzdHJ1Y3QgY29tZWRpXzgyNTQgKl9faTgyNTRfaW5pdCh1bnNpZ25lZCBsb25nIGlvYmFzZSwKKwkJCQkJdm9pZCBfX2lvbWVtICptbWlvLAorCQkJCQl1bnNpZ25lZCBpbnQgb3NjX2Jhc2UsCisJCQkJCXVuc2lnbmVkIGludCBpb3NpemUsCisJCQkJCXVuc2lnbmVkIGludCByZWdzaGlmdCkKK3sKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKmk4MjU0OworCWludCBpOworCisJLyogc2FuaXR5IGNoZWNrIHRoYXQgdGhlIGlvc2l6ZSBpcyB2YWxpZCAqLworCWlmICghKGlvc2l6ZSA9PSBJODI1NF9JTzggfHwgaW9zaXplID09IEk4MjU0X0lPMTYgfHwKKwkgICAgICBpb3NpemUgPT0gSTgyNTRfSU8zMikpCisJCXJldHVybiBOVUxMOworCisJaTgyNTQgPSBremFsbG9jKHNpemVvZigqaTgyNTQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWk4MjU0KQorCQlyZXR1cm4gTlVMTDsKKworCWk4MjU0LT5pb2Jhc2UJPSBpb2Jhc2U7CisJaTgyNTQtPm1taW8JPSBtbWlvOworCWk4MjU0LT5pb3NpemUJPSBpb3NpemU7CisJaTgyNTQtPnJlZ3NoaWZ0CT0gcmVnc2hpZnQ7CisKKwkvKiBkZWZhdWx0IG9zY19iYXNlIHRvIHRoZSBtYXggc3BlZWQgb2YgYSBnZW5lcmljIDgyNTQgdGltZXIgKi8KKwlpODI1NC0+b3NjX2Jhc2UJPSBvc2NfYmFzZSA/IG9zY19iYXNlIDogSTgyNTRfT1NDX0JBU0VfMTBNSFo7CisKKwkvKiByZXNldCBhbGwgdGhlIGNvdW50ZXJzIGJ5IHNldHRpbmcgdGhlbSB0byBJODI1NF9NT0RFMCAqLworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCWNvbWVkaV84MjU0X3NldF9tb2RlKGk4MjU0LCBpLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisKKwlyZXR1cm4gaTgyNTQ7Cit9CisKKy8qKgorICogY29tZWRpXzgyNTRfaW5pdCAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHRoZSA4MjU0IGRldmljZSBmb3IgcGlvIGFjY2VzcworICogQG1taW86CXBvcnQgSS9PIGJhc2UgYWRkcmVzcworICogQG9zY19iYXNlOgliYXNlIHRpbWUgb2YgdGhlIGNvdW50ZXIgaW4gbnMKKyAqCQlPUFRJT05BTCAtIG9ubHkgdXNlZCBieSBjb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKCkKKyAqIEBpb3NpemU6CUkvTyByZWdpc3RlciBzaXplCisgKiBAcmVnc2hpZnQ6CXJlZ2lzdGVyIGdhcCBzaGlmdAorICovCitzdHJ1Y3QgY29tZWRpXzgyNTQgKmNvbWVkaV84MjU0X2luaXQodW5zaWduZWQgbG9uZyBpb2Jhc2UsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgb3NjX2Jhc2UsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgaW9zaXplLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHJlZ3NoaWZ0KQoreworCXJldHVybiBfX2k4MjU0X2luaXQoaW9iYXNlLCBOVUxMLCBvc2NfYmFzZSwgaW9zaXplLCByZWdzaGlmdCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChjb21lZGlfODI1NF9pbml0KTsKKworLyoqCisgKiBjb21lZGlfODI1NF9tbV9pbml0IC0gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIDgyNTQgZGV2aWNlIGZvciBtbWlvIGFjY2VzcworICogQG1taW86CW1lbW9yeSBtYXBwZWQgSS9PIGJhc2UgYWRkcmVzcworICogQG9zY19iYXNlOgliYXNlIHRpbWUgb2YgdGhlIGNvdW50ZXIgaW4gbnMKKyAqCQlPUFRJT05BTCAtIG9ubHkgdXNlZCBieSBjb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKCkKKyAqIEBpb3NpemU6CUkvTyByZWdpc3RlciBzaXplCisgKiBAcmVnc2hpZnQ6CXJlZ2lzdGVyIGdhcCBzaGlmdAorICovCitzdHJ1Y3QgY29tZWRpXzgyNTQgKmNvbWVkaV84MjU0X21tX2luaXQodm9pZCBfX2lvbWVtICptbWlvLAorCQkJCQl1bnNpZ25lZCBpbnQgb3NjX2Jhc2UsCisJCQkJCXVuc2lnbmVkIGludCBpb3NpemUsCisJCQkJCXVuc2lnbmVkIGludCByZWdzaGlmdCkKK3sKKwlyZXR1cm4gX19pODI1NF9pbml0KDAsIG1taW8sIG9zY19iYXNlLCBpb3NpemUsIHJlZ3NoaWZ0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNvbWVkaV84MjU0X21tX2luaXQpOworCitzdGF0aWMgaW50IF9faW5pdCBjb21lZGlfODI1NF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoY29tZWRpXzgyNTRfbW9kdWxlX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgY29tZWRpXzgyNTRfbW9kdWxlX2V4aXQodm9pZCkKK3sKK30KK21vZHVsZV9leGl0KGNvbWVkaV84MjU0X21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNvbWVkaTogR2VuZXJpYyA4MjU0IHRpbWVyL2NvdW50ZXIgc3VwcG9ydCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV84MjU0LmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpXzgyNTQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODlmNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV84MjU0LmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBjb21lZGlfODI1NC5oCisgKiBHZW5lcmljIDgyNTQgdGltZXIvY291bnRlciBzdXBwb3J0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSCBIYXJ0bGV5IFN3ZWV0ZW4gPGhzd2VldGVuQHZpc2lvbmVuZ3JhdmVycy5jb20+CisgKgorICogQ09NRURJIC0gTGludXggQ29udHJvbCBhbmQgTWVhc3VyZW1lbnQgRGV2aWNlIEludGVyZmFjZQorICogQ29weXJpZ2h0IChDKSAyMDAwIERhdmlkIEEuIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9DT01FRElfODI1NF9ICisjZGVmaW5lIF9DT01FRElfODI1NF9ICisKKy8qCisgKiBDb21tb24gb3NjaWxsYXRvciBiYXNlIHZhbHVlcyBpbiBuYW5vc2Vjb25kcworICovCisjZGVmaW5lIEk4MjU0X09TQ19CQVNFXzEwTUhaCTEwMAorI2RlZmluZSBJODI1NF9PU0NfQkFTRV81TUhaCTIwMAorI2RlZmluZSBJODI1NF9PU0NfQkFTRV80TUhaCTI1MAorI2RlZmluZSBJODI1NF9PU0NfQkFTRV8yTUhaCTUwMAorI2RlZmluZSBJODI1NF9PU0NfQkFTRV8xTUhaCTEwMDAKKyNkZWZpbmUgSTgyNTRfT1NDX0JBU0VfMTAwS0haCTEwMDAwCisjZGVmaW5lIEk4MjU0X09TQ19CQVNFXzEwS0haCTEwMDAwMAorI2RlZmluZSBJODI1NF9PU0NfQkFTRV8xS0haCTEwMDAwMDAKKworLyoKKyAqIEkvTyBhY2Nlc3Mgc2l6ZSB1c2VkIHRvIHJlYWQvd3JpdGUgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgSTgyNTRfSU84CQkxCisjZGVmaW5lIEk4MjU0X0lPMTYJCTIKKyNkZWZpbmUgSTgyNTRfSU8zMgkJNAorCisvKgorICogUmVnaXN0ZXIgbWFwIGZvciBnZW5lcmljIDgyNTQgdGltZXIgKEk4MjU0X0lPOCB3aXRoIDAgcmVnc2hpZnQpCisgKi8KKyNkZWZpbmUgSTgyNTRfQ09VTlRFUjBfUkVHCQkweDAwCisjZGVmaW5lIEk4MjU0X0NPVU5URVIxX1JFRwkJMHgwMQorI2RlZmluZSBJODI1NF9DT1VOVEVSMl9SRUcJCTB4MDIKKyNkZWZpbmUgSTgyNTRfQ1RSTF9SRUcJCQkweDAzCisjZGVmaW5lIEk4MjU0X0NUUkxfU0VMX0NUUih4KQkJKCh4KSA8PCA2KQorI2RlZmluZSBJODI1NF9DVFJMX1JFQURCQUNLX0NPVU5UCSgoMyA8PCA2KSB8ICgxIDw8IDQpKQorI2RlZmluZSBJODI1NF9DVFJMX1JFQURCQUNLX1NUQVRVUwkoKDMgPDwgNikgfCAoMSA8PCA1KSkKKyNkZWZpbmUgSTgyNTRfQ1RSTF9SRUFEQkFDS19TRUxfQ1RSKHgpCSgyIDw8ICh4KSkKKyNkZWZpbmUgSTgyNTRfQ1RSTF9MQVRDSAkJKDAgPDwgNCkKKyNkZWZpbmUgSTgyNTRfQ1RSTF9MU0JfT05MWQkJKDEgPDwgNCkKKyNkZWZpbmUgSTgyNTRfQ1RSTF9NU0JfT05MWQkJKDIgPDwgNCkKKyNkZWZpbmUgSTgyNTRfQ1RSTF9MU0JfTVNCCQkoMyA8PCA0KQorCisvKiBjb3VudGVyIG1hcHMgemVybyB0byAweDEwMDAwICovCisjZGVmaW5lIEk4MjU0X01BWF9DT1VOVAkJCTB4MTAwMDAKKworLyoqCisgKiBzdHJ1Y3QgY29tZWRpXzgyNTQgLSBwcml2YXRlIGRhdGEgdXNlZCBieSB0aGlzIG1vZHVsZQorICogQGlvYmFzZToJCVBJTyBiYXNlIGFkZHJlc3Mgb2YgdGhlIHJlZ2lzdGVycyAoaW4vb3V0KQorICogQG1taW86CQlNTUlPIGJhc2UgYWRkcmVzcyBvZiB0aGUgcmVnaXN0ZXJzIChyZWFkL3dyaXRlKQorICogQGlvc2l6ZToJCUkvTyBzaXplIHVzZWQgdG8gYWNjZXNzIHRoZSByZWdpc3RlcnMgKGIvdy9sKQorICogQHJlZ3NoaWZ0OgkJcmVnaXN0ZXIgZ2FwIHNoaWZ0CisgKiBAb3NjX2Jhc2U6CQljYXNjYWRlZCBvc2NpbGxhdG9yIHNwZWVkIGluIG5zCisgKiBAZGl2aXNvcjoJCWRpdmlzb3IgZm9yIHNpbmdsZSBjb3VudGVyCisgKiBAZGl2aXNvcjE6CQlkaXZpc29yIGxvYWRlZCBpbnRvIGZpcnN0IGNhc2NhZGVkIGNvdW50ZXIKKyAqIEBkaXZpc29yMjoJCWRpdmlzb3IgbG9hZGVkIGludG8gc2Vjb25kIGNhc2NhZGVkIGNvdW50ZXIKKyAqICNuZXh0X2RpdjoJCW5leHQgZGl2aXNvciBmb3Igc2luZ2xlIGNvdW50ZXIKKyAqIEBuZXh0X2RpdjE6CQluZXh0IGRpdmlzb3IgdG8gdXNlIGZvciBmaXJzdCBjYXNjYWRlZCBjb3VudGVyCisgKiBAbmV4dF9kaXYyOgkJbmV4dCBkaXZpc29yIHRvIHVzZSBmb3Igc2Vjb25kIGNhc2NhZGVkIGNvdW50ZXIKKyAqIEBjbG9ja19zcmM7CQljdXJyZW50IGNsb2NrIHNvdXJjZSBmb3IgZWFjaCBjb3VudGVyIChkcml2ZXIgc3BlY2lmaWMpCisgKiBAZ2F0ZV9zcmM7CQljdXJyZW50IGdhdGUgc291cmNlICBmb3IgZWFjaCBjb3VudGVyIChkcml2ZXIgc3BlY2lmaWMpCisgKiBAYnVzeToJCWZsYWdzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGNvdW50ZXIgaXMgImJ1c3kiCisgKiBAaW5zbl9jb25maWc6CWRyaXZlciBzcGVjaWZpYyAoKmluc25fY29uZmlnKSBjYWxsYmFjaworICovCitzdHJ1Y3QgY29tZWRpXzgyNTQgeworCXVuc2lnbmVkIGxvbmcgaW9iYXNlOworCXZvaWQgX19pb21lbSAqbW1pbzsKKwl1bnNpZ25lZCBpbnQgaW9zaXplOworCXVuc2lnbmVkIGludCByZWdzaGlmdDsKKwl1bnNpZ25lZCBpbnQgb3NjX2Jhc2U7CisJdW5zaWduZWQgaW50IGRpdmlzb3I7CisJdW5zaWduZWQgaW50IGRpdmlzb3IxOworCXVuc2lnbmVkIGludCBkaXZpc29yMjsKKwl1bnNpZ25lZCBpbnQgbmV4dF9kaXY7CisJdW5zaWduZWQgaW50IG5leHRfZGl2MTsKKwl1bnNpZ25lZCBpbnQgbmV4dF9kaXYyOworCXVuc2lnbmVkIGludCBjbG9ja19zcmNbM107CisJdW5zaWduZWQgaW50IGdhdGVfc3JjWzNdOworCWJvb2wgYnVzeVszXTsKKworCWludCAoKmluc25fY29uZmlnKShzdHJ1Y3QgY29tZWRpX2RldmljZSAqLCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCSAgIHN0cnVjdCBjb21lZGlfaW5zbiAqLCB1bnNpZ25lZCBpbnQgKmRhdGEpOworfTsKKwordW5zaWduZWQgaW50IGNvbWVkaV84MjU0X3N0YXR1cyhzdHJ1Y3QgY29tZWRpXzgyNTQgKiwgdW5zaWduZWQgaW50IGNvdW50ZXIpOwordW5zaWduZWQgaW50IGNvbWVkaV84MjU0X3JlYWQoc3RydWN0IGNvbWVkaV84MjU0ICosIHVuc2lnbmVkIGludCBjb3VudGVyKTsKK3ZvaWQgY29tZWRpXzgyNTRfd3JpdGUoc3RydWN0IGNvbWVkaV84MjU0ICosCisJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnRlciwgdW5zaWduZWQgaW50IHZhbCk7CisKK2ludCBjb21lZGlfODI1NF9zZXRfbW9kZShzdHJ1Y3QgY29tZWRpXzgyNTQgKiwKKwkJCSB1bnNpZ25lZCBpbnQgY291bnRlciwgdW5zaWduZWQgaW50IG1vZGUpOworaW50IGNvbWVkaV84MjU0X2xvYWQoc3RydWN0IGNvbWVkaV84MjU0ICosCisJCSAgICAgdW5zaWduZWQgaW50IGNvdW50ZXIsIHVuc2lnbmVkIGludCB2YWwsIHVuc2lnbmVkIGludCBtb2RlKTsKKwordm9pZCBjb21lZGlfODI1NF9wYWNlcl9lbmFibGUoc3RydWN0IGNvbWVkaV84MjU0ICosCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnRlcjEsIHVuc2lnbmVkIGludCBjb3VudGVyMiwKKwkJCSAgICAgIGJvb2wgZW5hYmxlKTsKK3ZvaWQgY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKHN0cnVjdCBjb21lZGlfODI1NCAqKTsKK3ZvaWQgY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihzdHJ1Y3QgY29tZWRpXzgyNTQgKiwKKwkJCQkgICAgIHVuc2lnbmVkIGludCAqbmFub3NlYywgdW5zaWduZWQgaW50IGZsYWdzKTsKK3ZvaWQgY29tZWRpXzgyNTRfbnNfdG9fdGltZXIoc3RydWN0IGNvbWVkaV84MjU0ICosCisJCQkgICAgIHVuc2lnbmVkIGludCAqbmFub3NlYywgdW5zaWduZWQgaW50IGZsYWdzKTsKKwordm9pZCBjb21lZGlfODI1NF9zZXRfYnVzeShzdHJ1Y3QgY29tZWRpXzgyNTQgKiwKKwkJCSAgdW5zaWduZWQgaW50IGNvdW50ZXIsIGJvb2wgYnVzeSk7CisKK3ZvaWQgY29tZWRpXzgyNTRfc3ViZGV2aWNlX2luaXQoc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKiwKKwkJCQlzdHJ1Y3QgY29tZWRpXzgyNTQgKik7CisKK3N0cnVjdCBjb21lZGlfODI1NCAqY29tZWRpXzgyNTRfaW5pdCh1bnNpZ25lZCBsb25nIGlvYmFzZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBvc2NfYmFzZSwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBpb3NpemUsCisJCQkJICAgICB1bnNpZ25lZCBpbnQgcmVnc2hpZnQpOworc3RydWN0IGNvbWVkaV84MjU0ICpjb21lZGlfODI1NF9tbV9pbml0KHZvaWQgX19pb21lbSAqbW1pbywKKwkJCQkJdW5zaWduZWQgaW50IG9zY19iYXNlLAorCQkJCQl1bnNpZ25lZCBpbnQgaW9zaXplLAorCQkJCQl1bnNpZ25lZCBpbnQgcmVnc2hpZnQpOworCisjZW5kaWYJLyogX0NPTUVESV84MjU0X0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfYm9uZC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMKaW5kZXggMjIxZDM4MS4uOTZkYjBjMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9ib25kLmMKQEAgLTI2Nyw3ICsyNjcsNiBAQAogCQkJCXN0cmxjYXQoZGV2cHJpdi0+bmFtZSwgYnVmLAogCQkJCQlzaXplb2YoZGV2cHJpdi0+bmFtZSkpOwogCQkJfQotCiAJCX0KIAl9CiAKQEAgLTMxMyw5ICszMTIsOSBAQAogCXMtPmluc25fY29uZmlnID0gYm9uZGluZ19kaW9faW5zbl9jb25maWc7CiAKIAlkZXZfaW5mbyhkZXYtPmNsYXNzX2RldiwKLQkJIiVzOiAlcyBhdHRhY2hlZCwgJXUgY2hhbm5lbHMgZnJvbSAldSBkZXZpY2VzXG4iLAotCQlkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWUsIGRldi0+Ym9hcmRfbmFtZSwKLQkJZGV2cHJpdi0+bmNoYW5zLCBkZXZwcml2LT5uZGV2cyk7CisJCSAiJXM6ICVzIGF0dGFjaGVkLCAldSBjaGFubmVscyBmcm9tICV1IGRldmljZXNcbiIsCisJCSBkZXYtPmRyaXZlci0+ZHJpdmVyX25hbWUsIGRldi0+Ym9hcmRfbmFtZSwKKwkJIGRldnByaXYtPm5jaGFucywgZGV2cHJpdi0+bmRldnMpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2ZjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NmJlOTMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9mYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBjb21lZGlfZmMuaAotICogVGhpcyBpcyBhIHBsYWNlIGZvciBjb2RlIGRyaXZlciB3cml0ZXJzIHdpc2ggdG8gc2hhcmUgYmV0d2VlbgotICogdHdvIG9yIG1vcmUgZHJpdmVycy4gVGhlc2UgZnVuY3Rpb25zIGFyZSBtZWFudCB0byBiZSB1c2VkIG9ubHkKLSAqIGJ5IGRyaXZlcnMsIHRoZXkgYXJlIE5PVCBwYXJ0IG9mIHRoZSBrY29tZWRpbGliIEFQSSEKLSAqCi0gKiBBdXRob3I6IEZyYW5rIE1vcmkgSGVzcyA8Zm1oZXNzQHVzZXJzLnNvdXJjZWZvcmdlLm5ldD4KLSAqIENvcHlyaWdodCAoQykgMjAwMiBGcmFuayBNb3JpIEhlc3MKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfQ09NRURJX0ZDX0gKLSNkZWZpbmUgX0NPTUVESV9GQ19ICi0KLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKLQotLyoqCi0gKiBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoKSAtIHRyaXZpYWxseSB2YWxpZGF0ZSBhIGNvbWVkaV9jbWQgdHJpZ2dlciBzb3VyY2UKLSAqIEBzcmM6IHBvaW50ZXIgdG8gdGhlIHRyaWdnZXIgc291cmNlIHRvIHZhbGlkYXRlCi0gKiBAZmxhZ3M6IGJpdG1hc2sgb2YgdmFsaWQgVFJJR18qIGZvciB0aGUgdHJpZ2dlcgotICoKLSAqIFRoaXMgaXMgdXNlZCBpbiAic3RlcCAxIiBvZiB0aGUgZG9fY21kdGVzdCBmdW5jdGlvbnMgb2YgY29tZWRpIGRyaXZlcnMKLSAqIHRvIHZhaWxkYXRlIHRoZSBjb21lZGlfY21kIHRyaWdnZXJzLiBUaGUgbWFzayBvZiB0aGUgQHNyYyBhZ2FpbnN0IHRoZQotICogQGZsYWdzIGFsbG93cyB0aGUgdXNlcnNwYWNlIGNvbWVkaWxpYiB0byBwYXNzIGFsbCB0aGUgY29tZWRpX2NtZAotICogdHJpZ2dlcnMgYXMgVFJJR19BTlkgYW5kIGdldCBiYWNrIGEgYml0bWFzayBvZiB0aGUgdmFsaWQgdHJpZ2dlciBzb3VyY2VzLgotICovCi1zdGF0aWMgaW5saW5lIGludCBjZmNfY2hlY2tfdHJpZ2dlcl9zcmModW5zaWduZWQgaW50ICpzcmMsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQl1bnNpZ25lZCBpbnQgb3JpZ19zcmMgPSAqc3JjOwotCi0JKnNyYyA9IG9yaWdfc3JjICYgZmxhZ3M7Ci0JaWYgKCpzcmMgPT0gVFJJR19JTlZBTElEIHx8ICpzcmMgIT0gb3JpZ19zcmMpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZSgpIC0gbWFrZSBzdXJlIGEgdHJpZ2dlciBzb3VyY2UgaXMgdW5pcXVlCi0gKiBAc3JjOiB0aGUgdHJpZ2dlciBzb3VyY2UgdG8gY2hlY2sKLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKHVuc2lnbmVkIGludCBzcmMpCi17Ci0JLyogdGhpcyB0ZXN0IGlzIHRydWUgaWYgbW9yZSB0aGFuIG9uZSBfc3JjIGJpdCBpcyBzZXQgKi8KLQlpZiAoKHNyYyAmIChzcmMgLSAxKSkgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCkgLSB0cml2aWFsbHkgdmFsaWRhdGUgYSB0cmlnZ2VyIGFyZ3VtZW50Ci0gKiBAYXJnOiBwb2ludGVyIHRvIHRoZSB0cmlnZ2VyIGFyZyB0byB2YWxpZGF0ZQotICogQHZhbDogdGhlIHZhbHVlIHRoZSBhcmd1bWVudCBzaG91bGQgYmUKLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKHVuc2lnbmVkIGludCAqYXJnLCB1bnNpZ25lZCBpbnQgdmFsKQotewotCWlmICgqYXJnICE9IHZhbCkgewotCQkqYXJnID0gdmFsOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigpIC0gdHJpdmlhbGx5IHZhbGlkYXRlIGEgdHJpZ2dlciBhcmd1bWVudAotICogQGFyZzogcG9pbnRlciB0byB0aGUgdHJpZ2dlciBhcmcgdG8gdmFsaWRhdGUKLSAqIEB2YWw6IHRoZSBtaW5pbXVtIHZhbHVlIHRoZSBhcmd1bWVudCBzaG91bGQgYmUKLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbih1bnNpZ25lZCBpbnQgKmFyZywKLQkJCQkJICAgIHVuc2lnbmVkIGludCB2YWwpCi17Ci0JaWYgKCphcmcgPCB2YWwpIHsKLQkJKmFyZyA9IHZhbDsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoKSAtIHRyaXZpYWxseSB2YWxpZGF0ZSBhIHRyaWdnZXIgYXJndW1lbnQKLSAqIEBhcmc6IHBvaW50ZXIgdG8gdGhlIHRyaWdnZXIgYXJnIHRvIHZhbGlkYXRlCi0gKiBAdmFsOiB0aGUgbWF4aW11bSB2YWx1ZSB0aGUgYXJndW1lbnQgc2hvdWxkIGJlCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgodW5zaWduZWQgaW50ICphcmcsCi0JCQkJCSAgICB1bnNpZ25lZCBpbnQgdmFsKQotewotCWlmICgqYXJnID4gdmFsKSB7Ci0JCSphcmcgPSB2YWw7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIF9DT01FRElfRkNfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9pc2FkbWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfaXNhZG1hLmMKaW5kZXggZTg1NmYwMS4uNmJhNzFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9pc2FkbWEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX2lzYWRtYS5jCkBAIC0yMzUsNyArMjM1LDggQEAKIAkJCWRlc2MgPSAmZG1hLT5kZXNjW2ldOwogCQkJaWYgKGRlc2MtPnZpcnRfYWRkcikKIAkJCQlkbWFfZnJlZV9jb2hlcmVudChOVUxMLCBkZXNjLT5tYXhzaXplLAotCQkJCQkJZGVzYy0+dmlydF9hZGRyLCBkZXNjLT5od19hZGRyKTsKKwkJCQkJCSAgZGVzYy0+dmlydF9hZGRyLAorCQkJCQkJICBkZXNjLT5od19hZGRyKTsKIAkJfQogCQlrZnJlZShkbWEtPmRlc2MpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9jb21lZGlfcGFycG9ydC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9wYXJwb3J0LmMKaW5kZXggY2VlZjY5My4uMTVhNDA5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9wYXJwb3J0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV9wYXJwb3J0LmMKQEAgLTY5LDggKzY5LDYgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0KIC8qCiAgKiBSZWdpc3RlciBtYXAKICAqLwpAQCAtMTYxLDExICsxNTksMTEgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKQEAgLTE3NSwxMSArMTczLDEyIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbWVkaV90ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYwppbmRleCBlNTY1MjVhLi44MGQ2MTNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29tZWRpX3Rlc3QuYwpAQCAtNTAsNyArNTAsNiBAQAogCiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAKQEAgLTIyNSwxOSArMjI0LDIwIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19USU1FUik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwkJCQkJVFJJR19OT1cgfCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMjQ2LDI2ICsyNDYsMzAgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX05PVykKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSBuYW5vX3Blcl9taWNybyk7Ci0JCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCi0JCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJY21kLT5jb252ZXJ0X2FyZyAqIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgbmFub19wZXJfbWljcm8pOworCQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT4KKwkJCQkJCQkgICAgc2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkJICAgIGNtZC0+Y29udmVydF9hcmcgKgorCQkJCQkJCSAgICBjbWQtPmNoYW5saXN0X2xlbik7CisJCX0KIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0yNzcsMTQgKzI4MSwxNCBAQAogCQkvKiByb3VuZCB0byBuZWFyZXN0IG1pY3Jvc2VjICovCiAJCWFyZyA9IG5hbm9fcGVyX21pY3JvICoKIAkJICAgICAgKChhcmcgKyAobmFub19wZXJfbWljcm8gLyAyKSkgLyBuYW5vX3Blcl9taWNybyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CiAJfQogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKIAkJLyogcm91bmQgdG8gbmVhcmVzdCBtaWNyb3NlYyAqLwogCQlhcmcgPSBuYW5vX3Blcl9taWNybyAqCiAJCSAgICAgICgoYXJnICsgKG5hbm9fcGVyX21pY3JvIC8gMikpIC8gbmFub19wZXJfbWljcm8pOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCkBAIC00MjAsOSArNDI0LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgcy0+bl9jaGFuOyBpKyspCiAJCWRldnByaXYtPmFvX2xvb3BiYWNrc1tpXSA9IHMtPm1heGRhdGEgLyAyOwogCi0JaW5pdF90aW1lcigmZGV2cHJpdi0+dGltZXIpOwotCWRldnByaXYtPnRpbWVyLmZ1bmN0aW9uID0gd2F2ZWZvcm1fYWlfaW50ZXJydXB0OwotCWRldnByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJc2V0dXBfdGltZXIoJmRldnByaXYtPnRpbWVyLCB3YXZlZm9ybV9haV9pbnRlcnJ1cHQsCisJCSAgICAodW5zaWduZWQgbG9uZylkZXYpOwogCiAJZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsCiAJCSAiJXM6ICVpIG1pY3Jvdm9sdCwgJWxpIG1pY3Jvc2Vjb25kIHdhdmVmb3JtIGF0dGFjaGVkXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2NvbnRlY19wY2lfZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYwppbmRleCAyMDVmOWRmLi40OTU2YTQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvY29udGVjX3BjaV9kaW8uYwpAQCAtMjYsOSArMjYsOCBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAvKgogICogUmVnaXN0ZXIgbWFwCkBAIC01OSw3ICs1OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgY29udGVjX2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJCXVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhcWJvYXJkMjAwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhcWJvYXJkMjAwMC5jCmluZGV4IDk2Njk3ZmIuLmY5N2QxOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXFib2FyZDIwMDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFxYm9hcmQyMDAwLmMKQEAgLTEwMywxMSArMTAzLDEwIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNpbmNsdWRlICI4MjU1LmgiCiAKQEAgLTY0OSw3ICs2NDgsNyBAQAogfQogCiBzdGF0aWMgaW50IGRhcWJvYXJkMjAwMF9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorCQkJCSAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwogCWNvbnN0IHN0cnVjdCBkYXEyMDBfYm9hcmR0eXBlICpib2FyZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4LmMKaW5kZXggYzc4YzBkZi4uNzNmNGM4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4LmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgIjgyNTUuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKICNpbmNsdWRlICJkYXMwOC5oIgogCiAvKgpAQCAtMzU5LDYyICszNTksNiBAQAogCXJldHVybiBpbnNuLT5uOwogfQogCi1zdGF0aWMgdm9pZCBpODI1NF9pbml0aWFsaXplKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCi17Ci0JY29uc3Qgc3RydWN0IGRhczA4X2JvYXJkX3N0cnVjdCAqdGhpc2JvYXJkID0gZGV2LT5ib2FyZF9wdHI7Ci0JdW5zaWduZWQgbG9uZyBpODI1NF9pb2Jhc2UgPSBkZXYtPmlvYmFzZSArIHRoaXNib2FyZC0+aTgyNTRfb2Zmc2V0OwotCXVuc2lnbmVkIGludCBtb2RlID0gSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlk7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgKytpKQotCQlpODI1NF9zZXRfbW9kZShpODI1NF9pb2Jhc2UsIDAsIGksIG1vZGUpOwotfQotCi1zdGF0aWMgaW50IGRhczA4X2NvdW50ZXJfcmVhZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkgICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sIHVuc2lnbmVkIGludCAqZGF0YSkKLXsKLQljb25zdCBzdHJ1Y3QgZGFzMDhfYm9hcmRfc3RydWN0ICp0aGlzYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQl1bnNpZ25lZCBsb25nIGk4MjU0X2lvYmFzZSA9IGRldi0+aW9iYXNlICsgdGhpc2JvYXJkLT5pODI1NF9vZmZzZXQ7Ci0JaW50IGNoYW4gPSBpbnNuLT5jaGFuc3BlYzsKLQotCWRhdGFbMF0gPSBpODI1NF9yZWFkKGk4MjU0X2lvYmFzZSwgMCwgY2hhbik7Ci0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgZGFzMDhfY291bnRlcl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJICAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQotewotCWNvbnN0IHN0cnVjdCBkYXMwOF9ib2FyZF9zdHJ1Y3QgKnRoaXNib2FyZCA9IGRldi0+Ym9hcmRfcHRyOwotCXVuc2lnbmVkIGxvbmcgaTgyNTRfaW9iYXNlID0gZGV2LT5pb2Jhc2UgKyB0aGlzYm9hcmQtPmk4MjU0X29mZnNldDsKLQlpbnQgY2hhbiA9IGluc24tPmNoYW5zcGVjOwotCi0JaTgyNTRfd3JpdGUoaTgyNTRfaW9iYXNlLCAwLCBjaGFuLCBkYXRhWzBdKTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBkYXMwOF9jb3VudGVyX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAotCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQotewotCWNvbnN0IHN0cnVjdCBkYXMwOF9ib2FyZF9zdHJ1Y3QgKnRoaXNib2FyZCA9IGRldi0+Ym9hcmRfcHRyOwotCXVuc2lnbmVkIGxvbmcgaTgyNTRfaW9iYXNlID0gZGV2LT5pb2Jhc2UgKyB0aGlzYm9hcmQtPmk4MjU0X29mZnNldDsKLQlpbnQgY2hhbiA9IGluc24tPmNoYW5zcGVjOwotCi0Jc3dpdGNoIChkYXRhWzBdKSB7Ci0JY2FzZSBJTlNOX0NPTkZJR19TRVRfQ09VTlRFUl9NT0RFOgotCQlpODI1NF9zZXRfbW9kZShpODI1NF9pb2Jhc2UsIDAsIGNoYW4sIGRhdGFbMV0pOwotCQlicmVhazsKLQljYXNlIElOU05fQ09ORklHXzgyNTRfUkVBRF9TVEFUVVM6Ci0JCWRhdGFbMV0gPSBpODI1NF9zdGF0dXMoaTgyNTRfaW9iYXNlLCAwLCBjaGFuKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXJldHVybiAyOwotfQotCiBpbnQgZGFzMDhfY29tbW9uX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGlvYmFzZSkKIHsKIAljb25zdCBzdHJ1Y3QgZGFzMDhfYm9hcmRfc3RydWN0ICp0aGlzYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKQEAgLTQ2NCw3ICs0MDgsNyBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQkvKiBpbnRpYWxpemUgYWxsIGNoYW5uZWxzIHRvIDBWICovCisJCS8qIGluaXRpYWxpemUgYWxsIGNoYW5uZWxzIHRvIDBWICovCiAJCWZvciAoaSA9IDA7IGkgPCBzLT5uX2NoYW47IGkrKykgewogCQkJcy0+cmVhZGJhY2tbaV0gPSBzLT5tYXhkYXRhIC8gMjsKIAkJCWRhczA4X2FvX3NldF9kYXRhKGRldiwgaSwgcy0+cmVhZGJhY2tbaV0pOwpAQCAtNTExLDE3ICs0NTUsMTYgQEAKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKIAl9CiAKKwkvKiBDb3VudGVyIHN1YmRldmljZSAoODI1NCkgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1s1XTsKLQkvKiA4MjU0ICovCi0JaWYgKHRoaXNib2FyZC0+aTgyNTRfb2Zmc2V0ICE9IDApIHsKLQkJcy0+dHlwZSA9IENPTUVESV9TVUJEX0NPVU5URVI7Ci0JCXMtPnN1YmRldl9mbGFncyA9IFNERl9XUklUQUJMRSB8IFNERl9SRUFEQUJMRTsKLQkJcy0+bl9jaGFuID0gMzsKLQkJcy0+bWF4ZGF0YSA9IDB4RkZGRjsKLQkJcy0+aW5zbl9yZWFkID0gZGFzMDhfY291bnRlcl9yZWFkOwotCQlzLT5pbnNuX3dyaXRlID0gZGFzMDhfY291bnRlcl93cml0ZTsKLQkJcy0+aW5zbl9jb25maWcgPSBkYXMwOF9jb3VudGVyX2NvbmZpZzsKLQkJaTgyNTRfaW5pdGlhbGl6ZShkZXYpOworCWlmICh0aGlzYm9hcmQtPmk4MjU0X29mZnNldCkgeworCQlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArCisJCQkJCSAgICAgIHRoaXNib2FyZC0+aTgyNTRfb2Zmc2V0LAorCQkJCQkgICAgICAwLCBJODI1NF9JTzgsIDApOworCQlpZiAoIWRldi0+cGFjZXIpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQljb21lZGlfODI1NF9zdWJkZXZpY2VfaW5pdChzLCBkZXYtPnBhY2VyKTsKIAl9IGVsc2UgewogCQlzLT50eXBlID0gQ09NRURJX1NVQkRfVU5VU0VEOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOF9wY2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMwOF9wY2kuYwppbmRleCBiMmVhMTBiLi5kOGQyN2ZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMDhfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczA4X3BjaS5jCkBAIC0zMiw5ICszMiw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAjaW5jbHVkZSAiZGFzMDguaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTYuYwppbmRleCAyYzIwMzExLi5kN2NmNGIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTYuYwpAQCAtNzYsOCArNzYsNyBAQAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCiAjaW5jbHVkZSAiY29tZWRpX2lzYWRtYS5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotI2luY2x1ZGUgIjgyNTMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogI2luY2x1ZGUgIjgyNTUuaCIKIAogI2RlZmluZSBEQVMxNl9ETUFfU0laRSAweGZmMDAJLyogIHNpemUgaW4gYnl0ZXMgb2YgYWxsb2NhdGVkIGRtYSBidWZmZXIgKi8KQEAgLTU5OSwyOSArNTk4LDI5IEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CiAKIAl0cmlnX21hc2sgPSBUUklHX0ZPTExPVzsKIAlpZiAoZGV2cHJpdi0+Y2FuX2J1cnN0KQogCQl0cmlnX21hc2sgfD0gVFJJR19USU1FUiB8IFRSSUdfRVhUOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIHRyaWdfbWFzayk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgdHJpZ19tYXNrKTsKIAogCXRyaWdfbWFzayA9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKIAlpZiAoZGV2cHJpdi0+Y2FuX2J1cnN0KQogCQl0cmlnX21hc2sgfD0gVFJJR19OT1c7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgdHJpZ19tYXNrKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCB0cmlnX21hc2spOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNjM2LDI2ICs2MzUsMzAgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykJLyogaW50ZXJuYWwgdHJpZ2dlciAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAkvKiBjaGVjayBhZ2FpbnN0IG1heGltdW0gZnJlcXVlbmN5ICovCi0JaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCWJvYXJkLT5haV9zcGVlZCAqIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIGJvYXJkLT5haV9zcGVlZCAqCisJCQkJCQkgICAgY21kLT5jaGFubGlzdF9sZW4pOworCX0KIAotCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJIGJvYXJkLT5haV9zcGVlZCk7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICBib2FyZC0+YWlfc3BlZWQpOworCX0KIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtNjYzLDE5ICs2NjYsMTMgQEAKIAkvKiAgc3RlcCA0OiBmaXggdXAgYXJndW1lbnRzICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKGRldnByaXYtPmNsb2NrYmFzZSwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjEsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IyLAotCQkJCQkgICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKGRldi0+cGFjZXIsICZhcmcsIGNtZC0+ZmxhZ3MpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2cHJpdi0+Y2xvY2tiYXNlLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjIsCi0JCQkJCSAgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CiAJfQogCWlmIChlcnIpCiAJCXJldHVybiA0OwpAQCAtNjkzLDE3ICs2OTAsOSBAQAogc3RhdGljIHVuc2lnbmVkIGludCBkYXMxNl9zZXRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG5zLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IGRhczE2X3ByaXZhdGVfc3RydWN0ICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgREFTMTZfVElNRVJfQkFTRV9SRUc7Ci0KLQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKGRldnByaXYtPmNsb2NrYmFzZSwKLQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwgJmRldnByaXYtPmRpdmlzb3IyLAotCQkJCSAgJm5zLCBmbGFncyk7Ci0KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlzb3IxKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpc29yMik7CisJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmbnMsIGZsYWdzKTsKKwljb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMoZGV2LT5wYWNlcik7CisJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIHRydWUpOwogCiAJcmV0dXJuIG5zOwogfQpAQCAtNzIyLDcgKzcxMSw3IEBACiAKIAlpZiAoY21kLT5mbGFncyAmIENNREZfUFJJT1JJVFkpIHsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCSAiaXNhIGRtYSB0cmFuc2ZlcnMgY2Fubm90IGJlIHBlcmZvcm1lZCB3aXRoIENNREZfUFJJT1JJVFksIGFib3J0aW5nXG4iKTsKKwkJCSJpc2EgZG1hIHRyYW5zZmVycyBjYW5ub3QgYmUgcGVyZm9ybWVkIHdpdGggQ01ERl9QUklPUklUWSwgYWJvcnRpbmdcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC05MzUsNyArOTI0LDYgQEAKIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgREFTMTZfU1RBVFVTX1JFRyk7CiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIERBUzE2X0NUUkxfUkVHKTsKIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgREFTMTZfUEFDRVJfUkVHKTsKLQlvdXRiKDAsIGRldi0+aW9iYXNlICsgREFTMTZfVElNRVJfQkFTRV9SRUcgKyBpODI1NF9jb250cm9sX3JlZyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRhczE2X2FsbG9jX2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZG1hX2NoYW4pCkBAIC05NTAsOSArOTM4LDggQEAKIAlkZXZwcml2LT5kbWEgPSBjb21lZGlfaXNhZG1hX2FsbG9jKGRldiwgMiwgZG1hX2NoYW4sIGRtYV9jaGFuLAogCQkJCQkgICBEQVMxNl9ETUFfU0laRSwgQ09NRURJX0lTQURNQV9SRUFEKTsKIAlpZiAoZGV2cHJpdi0+ZG1hKSB7Ci0JCWluaXRfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKLQkJZGV2cHJpdi0+dGltZXIuZnVuY3Rpb24gPSBkYXMxNl90aW1lcl9pbnRlcnJ1cHQ7Ci0JCWRldnByaXYtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7CisJCXNldHVwX3RpbWVyKCZkZXZwcml2LT50aW1lciwgZGFzMTZfdGltZXJfaW50ZXJydXB0LAorCQkJICAgICh1bnNpZ25lZCBsb25nKWRldik7CiAJfQogfQogCkBAIC0xMDM5LDYgKzEwMjYsNyBAQAogCWNvbnN0IHN0cnVjdCBkYXMxNl9ib2FyZCAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKIAlzdHJ1Y3QgZGFzMTZfcHJpdmF0ZV9zdHJ1Y3QgKmRldnByaXY7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CisJdW5zaWduZWQgaW50IG9zY19iYXNlOwogCXVuc2lnbmVkIGludCBzdGF0dXM7CiAJaW50IHJldDsKIApAQCAtMTA3OCwyMSArMTA2NiwyMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qICBnZXQgbWFzdGVyIGNsb2NrIHNwZWVkICovCisJb3NjX2Jhc2UgPSBJODI1NF9PU0NfQkFTRV8xTUhaOwogCWlmIChkZXZwcml2LT5jYW5fYnVyc3QpIHsKIAkJc3RhdHVzID0gaW5iKGRldi0+aW9iYXNlICsgREFTMTYwMF9TVEFUVVNfUkVHKTsKLQogCQlpZiAoc3RhdHVzICYgREFTMTYwMF9TVEFUVVNfQ0xLXzEwTUhaKQotCQkJZGV2cHJpdi0+Y2xvY2tiYXNlID0gSTgyNTRfT1NDX0JBU0VfMTBNSFo7Ci0JCWVsc2UKLQkJCWRldnByaXYtPmNsb2NrYmFzZSA9IEk4MjU0X09TQ19CQVNFXzFNSFo7CisJCQlvc2NfYmFzZSA9IEk4MjU0X09TQ19CQVNFXzEwTUhaOwogCX0gZWxzZSB7CiAJCWlmIChpdC0+b3B0aW9uc1szXSkKLQkJCWRldnByaXYtPmNsb2NrYmFzZSA9IEk4MjU0X09TQ19CQVNFXzFNSFogLwotCQkJCQkgICAgIGl0LT5vcHRpb25zWzNdOwotCQllbHNlCi0JCQlkZXZwcml2LT5jbG9ja2Jhc2UgPSBJODI1NF9PU0NfQkFTRV8xTUhaOworCQkJb3NjX2Jhc2UgPSBJODI1NF9PU0NfQkFTRV8xTUhaIC8gaXQtPm9wdGlvbnNbM107CiAJfQogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBEQVMxNl9USU1FUl9CQVNFX1JFRywKKwkJCQkgICAgICBvc2NfYmFzZSwgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldi0+cGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJZGFzMTZfYWxsb2NfZG1hKGRldiwgaXQtPm9wdGlvbnNbMl0pOwogCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0ICsgYm9hcmQtPmhhc184MjU1KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNm0xLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTZtMS5jCmluZGV4IDM2NjZhNjguLjFhZGY2YTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxNm0xLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE2bTEuYwpAQCAtNTMsMTIgKzUzLDEyIEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCiAjaW5jbHVkZSAiODI1NS5oIgotI2luY2x1ZGUgIjgyNTMuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogCiAjZGVmaW5lIERBUzE2TTFfU0laRTIgOAogCkBAIC0xMDMsOCArMTAzLDYgQEAKICNkZWZpbmUgICBRX1JBTkdFKHgpICAgICAgICAgICAgICgoKHgpICYgMHhmKSA8PCA0KQogI2RlZmluZSAgIFVOSVBPTEFSICAgICAgICAgICAgICAgMHg0MAogI2RlZmluZSBEQVMxNk0xXzgyNTRfRklSU1QgICAgICAgICAgICAgMHg4Ci0jZGVmaW5lIERBUzE2TTFfODI1NF9GSVJTVF9DTlRSTCAgICAgICAweGIKLSNkZWZpbmUgICBUT1RBTF9DTEVBUiAgICAgICAgICAgICAgICAgICAgMHgzMAogI2RlZmluZSBEQVMxNk0xXzgyNTRfU0VDT05EICAgICAgICAgICAgMHhjCiAjZGVmaW5lIERBUzE2TTFfODJDNTUgICAgICAgICAgICAgICAgICAweDQwMAogI2RlZmluZSBEQVMxNk0xXzgyNTRfVEhJUkQgICAgICAgICAgICAgMHg0MDQKQEAgLTEyNCw2ICsxMjIsNyBAQAogfTsKIAogc3RydWN0IGRhczE2bTFfcHJpdmF0ZV9zdHJ1Y3QgeworCXN0cnVjdCBjb21lZGlfODI1NCAqY291bnRlcjsKIAl1bnNpZ25lZCBpbnQgY29udHJvbF9zdGF0ZTsKIAl1bnNpZ25lZCBpbnQgYWRjX2NvdW50OwkvKiAgbnVtYmVyIG9mIHNhbXBsZXMgY29tcGxldGVkICovCiAJLyogaW5pdGlhbCB2YWx1ZSBpbiBsb3dlciBoYWxmIG9mIGhhcmR3YXJlIGNvbnZlcnNpb24gY291bnRlciwKQEAgLTEzMSw4ICsxMzAsNiBAQAogCSAqIGNvdW50ZXIgeWV0IChsb2FkZWQgYnkgZmlyc3Qgc2FtcGxlIGNvbnZlcnNpb24pICovCiAJdTE2IGluaXRpYWxfaHdfY291bnQ7CiAJdW5zaWduZWQgc2hvcnQgYWlfYnVmZmVyW0ZJRk9fU0laRV07Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IxOwkvKiAgZGl2aWRlcyBtYXN0ZXIgY2xvY2sgdG8gb2J0YWluIGNvbnZlcnNpb24gc3BlZWQgKi8KLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjI7CS8qICBkaXZpZGVzIG1hc3RlciBjbG9jayB0byBvYnRhaW4gY29udmVyc2lvbiBzcGVlZCAqLwogCXVuc2lnbmVkIGxvbmcgZXh0cmFfaW9iYXNlOwogfTsKIApAQCAtMTY5LDcgKzE2Niw3IEBACiAKIAkJaWYgKChpICUgMikgIT0gKGNoYW4gJSAyKSkgewogCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCQkgImV2ZW4vb2RkIGNoYW5uZWxzIG11c3QgZ28gaGF2ZSBldmVuL29kZCBjaGFubGlzdCBpbmRpY2VzXG4iKTsKKwkJCQkiZXZlbi9vZGQgY2hhbm5lbHMgbXVzdCBnbyBoYXZlIGV2ZW4vb2RkIGNoYW5saXN0IGluZGljZXNcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0xODAsMjYgKzE3NywyNSBAQAogc3RhdGljIGludCBkYXMxNm0xX2NtZF90ZXN0KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7Ci0Jc3RydWN0IGRhczE2bTFfcHJpdmF0ZV9zdHJ1Y3QgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgaW50IGFyZzsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0ZPTExPVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAorCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0yMDgsMjAgKzIwNCwyMSBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XKQkvKiBpbnRlcm5hbCB0cmlnZ2VyICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMDAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDEwMDApOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0yMjksMTIgKzIyNiwxMCBAQAogCS8qIHN0ZXAgNDogZml4IHVwIGFyZ3VtZW50cyAqLwogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzEwTUhaLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjIsCi0JCQkJCSAgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CisJCXVuc2lnbmVkIGludCBhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOworCisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2LT5wYWNlciwgJmFyZywgY21kLT5mbGFncyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGVycikKQEAgLTI1MCwyNSArMjQ1LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRhczE2bTFfc2V0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGRhczE2bTFfcHJpdmF0ZV9zdHJ1Y3QgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBEQVMxNk0xXzgyNTRfU0VDT05EOwotCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlzb3IxKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpc29yMik7Ci19Ci0KIHN0YXRpYyBpbnQgZGFzMTZtMV9jbWRfZXhlYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBkYXMxNm0xX3ByaXZhdGVfc3RydWN0ICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gcy0+YXN5bmM7CiAJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCA9ICZhc3luYy0+Y21kOwotCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgREFTMTZNMV84MjU0X0ZJUlNUOwogCXVuc2lnbmVkIGludCBieXRlLCBpOwogCiAJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZCBpbnRlcm5hbCBwYWNlciAqLwpAQCAtMjc3LDE0ICsyNTksMjEgQEAKIAogCS8qICBzZXQgc29mdHdhcmUgY291bnQgKi8KIAlkZXZwcml2LT5hZGNfY291bnQgPSAwOwotCS8qIEluaXRpYWxpemUgbG93ZXIgaGFsZiBvZiBoYXJkd2FyZSBjb3VudGVyLCB1c2VkIHRvIGRldGVybWluZSBob3cKKworCS8qCisJICogSW5pdGlhbGl6ZSBsb3dlciBoYWxmIG9mIGhhcmR3YXJlIGNvdW50ZXIsIHVzZWQgdG8gZGV0ZXJtaW5lIGhvdwogCSAqIG1hbnkgc2FtcGxlcyBhcmUgaW4gZmlmby4gIFZhbHVlIGRvZXNuJ3QgYWN0dWFsbHkgbG9hZCBpbnRvIGNvdW50ZXIKLQkgKiB1bnRpbCBjb3VudGVyJ3MgbmV4dCBjbG9jayAodGhlIG5leHQgYS9kIGNvbnZlcnNpb24pICovCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIDApOwotCS8qIHJlbWVtYmVyIGN1cnJlbnQgcmVhZGluZyBvZiBjb3VudGVyIHNvIHdlIGtub3cgd2hlbiBjb3VudGVyIGhhcwotCSAqIGFjdHVhbGx5IGJlZW4gbG9hZGVkICovCi0JZGV2cHJpdi0+aW5pdGlhbF9od19jb3VudCA9IGk4MjU0X3JlYWQodGltZXJfYmFzZSwgMCwgMSk7CisJICogdW50aWwgY291bnRlcidzIG5leHQgY2xvY2sgKHRoZSBuZXh0IGEvZCBjb252ZXJzaW9uKS4KKwkgKi8KKwljb21lZGlfODI1NF9zZXRfbW9kZShkZXZwcml2LT5jb3VudGVyLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7CisJY29tZWRpXzgyNTRfd3JpdGUoZGV2cHJpdi0+Y291bnRlciwgMSwgMCk7CisKKwkvKgorCSAqIFJlbWVtYmVyIGN1cnJlbnQgcmVhZGluZyBvZiBjb3VudGVyIHNvIHdlIGtub3cgd2hlbiBjb3VudGVyIGhhcworCSAqIGFjdHVhbGx5IGJlZW4gbG9hZGVkLgorCSAqLworCWRldnByaXYtPmluaXRpYWxfaHdfY291bnQgPSBjb21lZGlfODI1NF9yZWFkKGRldnByaXYtPmNvdW50ZXIsIDEpOworCiAJLyogc2V0dXAgY2hhbm5lbC9nYWluIHF1ZXVlICovCiAJZm9yIChpID0gMDsgaSA8IGNtZC0+Y2hhbmxpc3RfbGVuOyBpKyspIHsKIAkJb3V0YihpLCBkZXYtPmlvYmFzZSArIERBUzE2TTFfUVVFVUVfQUREUik7CkBAIC0yOTcsNyArMjg2LDggQEAKIAkvKiBlbmFibGUgaW50ZXJydXB0cyBhbmQgc2V0IGludGVybmFsIHBhY2VyIGNvdW50ZXIgbW9kZSBhbmQgY291bnRzICovCiAJZGV2cHJpdi0+Y29udHJvbF9zdGF0ZSAmPSB+UEFDRVJfTUFTSzsKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWRhczE2bTFfc2V0X3BhY2VyKGRldik7CisJCWNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhkZXYtPnBhY2VyKTsKKwkJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIHRydWUpOwogCQlkZXZwcml2LT5jb250cm9sX3N0YXRlIHw9IElOVF9QQUNFUjsKIAl9IGVsc2UgewkvKiBUUklHX0VYVCAqLwogCQlkZXZwcml2LT5jb250cm9sX3N0YXRlIHw9IEVYVF9QQUNFUjsKQEAgLTQxNyw4ICs0MDcsOCBAQAogCWFzeW5jID0gcy0+YXN5bmM7CiAJY21kID0gJmFzeW5jLT5jbWQ7CiAKLQkvKiAgZmlndXJlIG91dCBob3cgbWFueSBzYW1wbGVzIGFyZSBpbiBmaWZvICovCi0JaHdfY291bnRlciA9IGk4MjU0X3JlYWQoZGV2LT5pb2Jhc2UgKyBEQVMxNk0xXzgyNTRfRklSU1QsIDAsIDEpOworCS8qIGZpZ3VyZSBvdXQgaG93IG1hbnkgc2FtcGxlcyBhcmUgaW4gZmlmbyAqLworCWh3X2NvdW50ZXIgPSBjb21lZGlfODI1NF9yZWFkKGRldnByaXYtPmNvdW50ZXIsIDEpOwogCS8qIG1ha2Ugc3VyZSBoYXJkd2FyZSBjb3VudGVyIHJlYWRpbmcgaXMgbm90IGJvZ3VzIGR1ZSB0byBpbml0aWFsIHZhbHVlCiAJICogbm90IGhhdmluZyBiZWVuIGxvYWRlZCB5ZXQgKi8KIAlpZiAoZGV2cHJpdi0+YWRjX2NvdW50ID09IDAgJiYgaHdfY291bnRlciA9PSBkZXZwcml2LT5pbml0aWFsX2h3X2NvdW50KSB7CkBAIC01NjMsNiArNTUzLDE2IEBACiAJCQlkZXYtPmlycSA9IGl0LT5vcHRpb25zWzFdOwogCX0KIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgREFTMTZNMV84MjU0X1NFQ09ORCwKKwkJCQkgICAgICBJODI1NF9PU0NfQkFTRV8xME1IWiwgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldi0+cGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2cHJpdi0+Y291bnRlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBEQVMxNk0xXzgyNTRfRklSU1QsCisJCQkJCSAgICAwLCBJODI1NF9JTzgsIDApOworCWlmICghZGV2cHJpdi0+Y291bnRlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC02MDksOSArNjA5LDYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCi0JLyogIGRpc2FibGUgdXBwZXIgaGFsZiBvZiBoYXJkd2FyZSBjb252ZXJzaW9uIGNvdW50ZXIgc28gaXQgZG9lc24ndCBtZXNzIHdpdGggdXMgKi8KLQlvdXRiKFRPVEFMX0NMRUFSLCBkZXYtPmlvYmFzZSArIERBUzE2TTFfODI1NF9GSVJTVF9DTlRSTCk7Ci0KIAkvKiAgaW5pdGlhbGl6ZSBkaWdpdGFsIG91dHB1dCBsaW5lcyAqLwogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBEQVMxNk0xX0RJTyk7CiAKQEAgLTYyNiw4ICs2MjMsMTEgQEAKIHsKIAlzdHJ1Y3QgZGFzMTZtMV9wcml2YXRlX3N0cnVjdCAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAotCWlmIChkZXZwcml2ICYmIGRldnByaXYtPmV4dHJhX2lvYmFzZSkKLQkJcmVsZWFzZV9yZWdpb24oZGV2cHJpdi0+ZXh0cmFfaW9iYXNlLCBEQVMxNk0xX1NJWkUyKTsKKwlpZiAoZGV2cHJpdikgeworCQlpZiAoZGV2cHJpdi0+ZXh0cmFfaW9iYXNlKQorCQkJcmVsZWFzZV9yZWdpb24oZGV2cHJpdi0+ZXh0cmFfaW9iYXNlLCBEQVMxNk0xX1NJWkUyKTsKKwkJa2ZyZWUoZGV2cHJpdi0+Y291bnRlcik7CisJfQogCWNvbWVkaV9sZWdhY3lfZGV0YWNoKGRldik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxODAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzMTgwMC5jCmluZGV4IDA3OTBhMjguLjUzYmFmMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXMxODAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczE4MDAuYwpAQCAtMTAyLDggKzEwMiw3IEBACiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlICJjb21lZGlfaXNhZG1hLmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKIC8qIG1pc2MuIGRlZmluZXMgKi8KICNkZWZpbmUgREFTMTgwMF9TSVpFICAgICAgICAgICAxNgkvKiB1c2VzIDE2IGlvIGFkZHJlc3NlcyAqLwpAQCAtNDIyLDggKzQyMSw2IEBACiAKIHN0cnVjdCBkYXMxODAwX3ByaXZhdGUgewogCXN0cnVjdCBjb21lZGlfaXNhZG1hICpkbWE7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IxOwkvKiB2YWx1ZSB0byBsb2FkIGludG8gYm9hcmQncyBjb3VudGVyIDEgZm9yIHRpbWVkIGNvbnZlcnNpb25zICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3IyOwkvKiB2YWx1ZSB0byBsb2FkIGludG8gYm9hcmQncyBjb3VudGVyIDIgZm9yIHRpbWVkIGNvbnZlcnNpb25zICovCiAJaW50IGlycV9kbWFfYml0czsJLyogYml0cyBmb3IgY29udHJvbCByZWdpc3RlciBiICovCiAJLyogZG1hIGJpdHMgZm9yIGNvbnRyb2wgcmVnaXN0ZXIgYiwgc3RvcmVkIHNvIHRoYXQgZG1hIGNhbiBiZQogCSAqIHR1cm5lZCBvbiBhbmQgb2ZmICovCkBAIC00OTEsOSArNDg4LDcgQEAKIAogCXdoaWxlIChpbmIoZGV2LT5pb2Jhc2UgKyBEQVMxODAwX1NUQVRVUykgJiBGTkUpIHsKIAkJZHBudCA9IGludyhkZXYtPmlvYmFzZSArIERBUzE4MDBfRklGTyk7Ci0JCS8qIGNvbnZlcnQgdG8gdW5zaWduZWQgdHlwZSBpZiB3ZSBhcmUgaW4gYSBiaXBvbGFyIG1vZGUgKi8KLQkJaWYgKCF1bmlwb2xhcikKLQkJCTsKKwkJLyogY29udmVydCB0byB1bnNpZ25lZCB0eXBlICovCiAJCWRwbnQgPSBtdW5nZV9iaXBvbGFyX3NhbXBsZShkZXYsIGRwbnQpOwogCQljb21lZGlfYnVmX3dyaXRlX3NhbXBsZXMocywgJmRwbnQsIDEpOwogCkBAIC03MzEsMTggKzcyNiwxOCBAQAogCQkJCSBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewogCWNvbnN0IHN0cnVjdCBkYXMxODAwX2JvYXJkICp0aGlzYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQlzdHJ1Y3QgZGFzMTgwMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBlcnIgPSAwOwogCXVuc2lnbmVkIGludCBhcmc7CiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19GT0xMT1cgfCBUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywKIAkJCQkJVFJJR19DT1VOVCB8IFRSSUdfRVhUIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCkBAIC03NTAsMTAgKzc0NSwxMCBAQAogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNzY2LDIxICs3NjEsMjMgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSB0aGlzYm9hcmQtPmFpX3NwZWVkKTsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJICAgIHRoaXNib2FyZC0+YWlfc3BlZWQpOworCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlzd2l0Y2ggKGNtZC0+c3RvcF9zcmMpIHsKIAljYXNlIFRSSUdfQ09VTlQ6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCQlicmVhazsKIAljYXNlIFRSSUdfTk9ORToKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTc5NSwzNSArNzkyLDI0IEBACiAJICAgIGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQkvKiB3ZSBhcmUgbm90IGluIGJ1cnN0IG1vZGUgKi8KIAkJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV81TUhaLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjIsCi0JCQkJCSAgJmNtZC0+Y29udmVydF9hcmcsIGNtZC0+ZmxhZ3MpOwotCQlpZiAoYXJnICE9IGNtZC0+Y29udmVydF9hcmcpCi0JCQllcnIrKzsKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAl9IGVsc2UgaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQkvKiB3ZSBhcmUgaW4gYnVyc3QgbW9kZSAqLwotCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQljbWQtPmNvbnZlcnRfYXJnID0gYnVyc3RfY29udmVydF9hcmcoY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSAgICAgY21kLT5mbGFncyk7Ci0JCWlmIChhcmcgIT0gY21kLT5jb252ZXJ0X2FyZykKLQkJCWVycisrOworCQlhcmcgPSBidXJzdF9jb252ZXJ0X2FyZyhjbWQtPmNvbnZlcnRfYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAogCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnICogY21kLT5jaGFubGlzdF9sZW47Ci0JCQlpZiAoYXJnID4gY21kLT5zY2FuX2JlZ2luX2FyZykgewotCQkJCWNtZC0+c2Nhbl9iZWdpbl9hcmcgPSBhcmc7Ci0JCQkJZXJyKys7Ci0JCQl9CisJCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT4KKwkJCQkJCQkgICAgc2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkJICAgIGFyZyk7CiAKIAkJCWFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7Ci0JCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzVNSFosCi0JCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMSwKLQkJCQkJCSAgJmRldnByaXYtPmRpdmlzb3IyLAotCQkJCQkJICAmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSAgY21kLT5mbGFncyk7Ci0JCQlpZiAoYXJnICE9IGNtZC0+c2Nhbl9iZWdpbl9hcmcpCi0JCQkJZXJyKys7CisJCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKGRldi0+cGFjZXIsICZhcmcsCisJCQkJCQkJY21kLT5mbGFncyk7CisJCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSAgIGFyZyk7CiAJCX0KIAl9CiAKQEAgLTkxMCwzMSArODk2LDYgQEAKIAlyZXR1cm4gY29udHJvbF9jOwogfQogCi1zdGF0aWMgdm9pZCBkYXMxODAwX3NldHVwX2NvdW50ZXJzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJICAgY29uc3Qgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgZGFzMTgwMF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgREFTMTgwMF9DT1VOVEVSOwotCi0JLyogc2V0dXAgY2FzY2FkZWQgY291bnRlcnMgZm9yIGNvbnZlcnNpb24vc2NhbiBmcmVxdWVuY3kgKi8KLQlpZiAoKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cgfHwKLQkgICAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgJiYKLQkgICAgY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQkJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCi0JCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlzb3IxKTsKLQkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOwotCX0KLQotCS8qIHNldHVwIGNvdW50ZXIgMCBmb3IgJ2Fib3V0IHRyaWdnZXJpbmcnICovCi0JaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19FWFQpIHsKLQkJaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMCwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwotCi0JCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDAsIDEpOwotCX0KLX0KLQogc3RhdGljIHVuc2lnbmVkIGludCBkYXMxODAwX2FpX3RyYW5zZmVyX3NpemUoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQkJICAgICB1bnNpZ25lZCBpbnQgbWF4Ynl0ZXMsCkBAIC0xMDUzLDcgKzEwMTQsMTkgQEAKIAogCS8qIHNldHVwIGNhcmQgYW5kIHN0YXJ0ICovCiAJcHJvZ3JhbV9jaGFubGlzdChkZXYsIGNtZCk7Ci0JZGFzMTgwMF9zZXR1cF9jb3VudGVycyhkZXYsIGNtZCk7CisKKwkvKiBzZXR1cCBjYXNjYWRlZCBjb3VudGVycyBmb3IgY29udmVyc2lvbi9zY2FuIGZyZXF1ZW5jeSAqLworCWlmICgoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVyB8fAorCSAgICAgY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSAmJgorCSAgICBjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKGRldi0+cGFjZXIpOworCQljb21lZGlfODI1NF9wYWNlcl9lbmFibGUoZGV2LT5wYWNlciwgMSwgMiwgdHJ1ZSk7CisJfQorCisJLyogc2V0dXAgY291bnRlciAwIGZvciAnYWJvdXQgdHJpZ2dlcmluZycgKi8KKwlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0VYVCkKKwkJY29tZWRpXzgyNTRfbG9hZChkZXYtPnBhY2VyLCAwLCAxLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CisKIAlkYXMxODAwX2FpX3NldHVwX2RtYShkZXYsIHMpOwogCW91dGIoY29udHJvbF9jLCBkZXYtPmlvYmFzZSArIERBUzE4MDBfQ09OVFJPTF9DKTsKIAkvKiAgc2V0IGNvbnZlcnNpb24gcmF0ZSBhbmQgbGVuZ3RoIGZvciBidXJzdCBtb2RlICovCkBAIC0xMTcxLDcgKzExNDQsNiBAQAogCQkJICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQogewotCiAJZGF0YVsxXSA9IGluYihkZXYtPmlvYmFzZSArIERBUzE4MDBfRElHSVRBTCkgJiAweGY7CiAJZGF0YVswXSA9IDA7CiAKQEAgLTEzNzgsNiArMTM1MCwxMSBAQAogCWlmICghZGV2cHJpdi0+Zmlmb19idWYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBEQVMxODAwX0NPVU5URVIsCisJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfNU1IWiwgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldi0+cGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczY0MDIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM2NDAyLmMKaW5kZXggYjg3NTViNS4uMTcwMTI5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczY0MDIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzNjQwMi5jCkBAIC0zNSw4ICszNSw4IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogCiAvKgogICogUmVnaXN0ZXIgSS9PIG1hcApAQCAtMTM4LDExICsxMzgsNiBAQAogCiBzdHJ1Y3QgZGFzNjQwMl9wcml2YXRlIHsKIAl1bnNpZ25lZCBpbnQgaXJxOwotCi0JdW5zaWduZWQgaW50IGNvdW50OwotCXVuc2lnbmVkIGludCBkaXZpZGVyMTsKLQl1bnNpZ25lZCBpbnQgZGl2aWRlcjI7Ci0KIAl1bnNpZ25lZCBpbnQgYW9fcmFuZ2U7CiB9OwogCkBAIC0xNzIsMjcgKzE2Nyw2IEBACiAJb3V0YihEQVM2NDAyX1NUQVRVU19XX0NMUklOVCwgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1NUQVRVU19SRUcpOwogfQogCi1zdGF0aWMgdm9pZCBkYXM2NDAyX2VuYWJsZV9jb3VudGVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGJvb2wgbG9hZCkKLXsKLQlzdHJ1Y3QgZGFzNjQwMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZXJfaW9iYXNlID0gZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX1RJTUVSX0JBU0U7Ci0KLQlpZiAobG9hZCkgewotCQlpODI1NF9zZXRfbW9kZSh0aW1lcl9pb2Jhc2UsIDAsIDAsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKLQkJaTgyNTRfc2V0X21vZGUodGltZXJfaW9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JCWk4MjU0X3NldF9tb2RlKHRpbWVyX2lvYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCi0JCWk4MjU0X3dyaXRlKHRpbWVyX2lvYmFzZSwgMCwgMCwgZGV2cHJpdi0+Y291bnQpOwotCQlpODI1NF93cml0ZSh0aW1lcl9pb2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlkZXIxKTsKLQkJaTgyNTRfd3JpdGUodGltZXJfaW9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpZGVyMik7Ci0KLQl9IGVsc2UgewotCQlpODI1NF9zZXRfbW9kZSh0aW1lcl9pb2Jhc2UsIDAsIDAsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKLQkJaTgyNTRfc2V0X21vZGUodGltZXJfaW9iYXNlLCAwLCAxLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7Ci0JCWk4MjU0X3NldF9tb2RlKHRpbWVyX2lvYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwotCX0KLX0KLQogc3RhdGljIHVuc2lnbmVkIGludCBkYXM2NDAyX2FpX3JlYWRfc2FtcGxlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCiAJCQkJCSAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewpAQCAtMjY3LDcgKzI0MSw4IEBACiAJb3V0dyhEQVM2NDAyX0FJX01VWF9ISShjaGFuX2hpKSB8IERBUzY0MDJfQUlfTVVYX0xPKGNoYW5fbG8pLAogCSAgICAgZGV2LT5pb2Jhc2UgKyBEQVM2NDAyX0FJX01VWF9SRUcpOwogCi0JZGFzNjQwMl9lbmFibGVfY291bnRlcihkZXYsIHRydWUpOworCWNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhkZXYtPnBhY2VyKTsKKwljb21lZGlfODI1NF9wYWNlcl9lbmFibGUoZGV2LT5wYWNlciwgMSwgMiwgdHJ1ZSk7CiAKIAkvKiBlbmFibGUgaW50ZXJydXB0IGFuZCBwYWNlciB0cmlnZ2VyICovCiAJb3V0YihEQVM2NDAyX0NUUkxfSU5URSB8CkBAIC0zMjIsMjQgKzI5NywyMyBAQAogCQkJICAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkgICAgICBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kKQogewotCXN0cnVjdCBkYXM2NDAyX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7CiAJdW5zaWduZWQgaW50IGFyZzsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0zNDgsMzAgKzMyMiwyNiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMDAwMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgMTAwMDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwogCiAJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLwogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzEwTUhaLAotCQkJCQkgICZkZXZwcml2LT5kaXZpZGVyMSwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aWRlcjIsCi0JCQkJCSAgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIGFyZyk7Ci0JfQorCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7CisJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDQ7CkBAIC01ODEsOCArNTUxLDYgQEAKIAlvdXR3KDAsIGRldi0+aW9iYXNlICsgREFTNjQwMl9BT19EQVRBX1JFRygwKSk7CiAJaW53KGRldi0+aW9iYXNlICsgREFTNjQwMl9BT19MU0JfUkVHKDApKTsKIAotCWRhczY0MDJfZW5hYmxlX2NvdW50ZXIoZGV2LCBmYWxzZSk7Ci0KIAkvKiBzZXQgYWxsIGRpZ2l0YWwgb3V0cHV0cyBsb3cgKi8KIAlvdXRiKDAsIGRldi0+aW9iYXNlICsgREFTNjQwMl9ESV9ET19SRUcpOwogCkBAIC02MzEsNiArNTk5LDExIEBACiAJCX0KIAl9CiAKKwlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIERBUzY0MDJfVElNRVJfQkFTRSwKKwkJCQkgICAgICBJODI1NF9PU0NfQkFTRV8xME1IWiwgSTgyNTRfSU84LCAwKTsKKwlpZiAoIWRldi0+cGFjZXIpCisJCXJldHVybiAtRU5PTUVNOworCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczgwMC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RhczgwMC5jCmluZGV4IGZmN2Y0YmUuLjM5ZDMwNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kYXM4MDAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZGFzODAwLmMKQEAgLTQzLDggKzQzLDYgQEAKIAogCVRoZSBjaW8tZGFzODAyLzE2IGRvZXMgbm90IGhhdmUgYSBmaWZvLWVtcHR5IHN0YXR1cyBiaXQhICBUaGVyZWZvcmUKIAlvbmx5IGZpZm8taGFsZi1mdWxsIHRyYW5zZmVycyBhcmUgcG9zc2libGUgd2l0aCB0aGlzIGNhcmQuCi0qLwotLyoKIAogY21kIHRyaWdnZXJzIHN1cHBvcnRlZDoKIAlzdGFydF9zcmM6ICAgICAgVFJJR19OT1cgfCBUUklHX0VYVApAQCAtNTIsMTggKzUwLDE1IEBACiAJc2Nhbl9lbmRfc3JjOiAgIFRSSUdfQ09VTlQKIAljb252ZXJ0X3NyYzogICAgVFJJR19USU1FUiB8IFRSSUdfRVhUCiAJc3RvcF9zcmM6ICAgICAgIFRSSUdfTk9ORSB8IFRSSUdfQ09VTlQKLQotCiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCi0KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogCi0jaW5jbHVkZSAiODI1My5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKIAogI2RlZmluZSBOX0NIQU5fQUkgICAgICAgICAgICAgOAkvKiAgbnVtYmVyIG9mIGFuYWxvZyBpbnB1dCBjaGFubmVscyAqLwogCkBAIC0yMTksOCArMjE0LDYgQEAKIH07CiAKIHN0cnVjdCBkYXM4MDBfcHJpdmF0ZSB7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IxOwkvKiBjb3VudGVyIDEgdmFsdWUgZm9yIHRpbWVkIGNvbnZlcnNpb25zICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3IyOwkvKiBjb3VudGVyIDIgdmFsdWUgZm9yIHRpbWVkIGNvbnZlcnNpb25zICovCiAJdW5zaWduZWQgaW50IGRvX2JpdHM7CS8qIGRpZ2l0YWwgb3V0cHV0IGJpdHMgKi8KIH07CiAKQEAgLTI3MiwxNyArMjY1LDYgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnNwaW5sb2NrLCBpcnFfZmxhZ3MpOwogfQogCi1zdGF0aWMgdm9pZCBkYXM4MDBfc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBkYXM4MDBfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIERBUzgwMF84MjU0OwotCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAxLCBkZXZwcml2LT5kaXZpc29yMSk7Ci0JaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMiwgZGV2cHJpdi0+ZGl2aXNvcjIpOwotfQotCiBzdGF0aWMgaW50IGRhczgwMF9jYW5jZWwoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMpCiB7CiAJZGFzODAwX2Rpc2FibGUoZGV2KTsKQEAgLTMyMiwyNiArMzA0LDI1IEBACiAJCQkJc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKIAljb25zdCBzdHJ1Y3QgZGFzODAwX2JvYXJkICp0aGlzYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQlzdHJ1Y3QgZGFzODAwX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgaW50IGFyZzsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0ZPTExPVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAorCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0zNTAsMTkgKzMzMSwyMSBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAotCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJIHRoaXNib2FyZC0+YWlfc3BlZWQpOworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkgICAgdGhpc2JvYXJkLT5haV9zcGVlZCk7CisJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtMzcwLDEyICszNTMsMTAgQEAKIAkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfMU1IWiwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjEsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IyLAotCQkJCQkgICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOworCQl1bnNpZ25lZCBpbnQgYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKKworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKGRldi0+cGFjZXIsICZhcmcsIGNtZC0+ZmxhZ3MpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCkBAIC00MjYsOCArNDA3LDggQEAKIAkJY29udl9iaXRzIHw9IERURU47CiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQljb252X2JpdHMgfD0gQ0FTQyB8IElURTsKLQkJLyogc2V0IGNvbnZlcnNpb24gZnJlcXVlbmN5ICovCi0JCWRhczgwMF9zZXRfZnJlcXVlbmN5KGRldik7CisJCWNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhkZXYtPnBhY2VyKTsKKwkJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIHRydWUpOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnNwaW5sb2NrLCBpcnFfZmxhZ3MpOwpAQCAtNjk3LDYgKzY3OCwxMSBAQAogCQkJZGV2LT5pcnEgPSBpcnE7CiAJfQogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBEQVM4MDBfODI1NCwKKwkJCQkgICAgICBJODI1NF9PU0NfQkFTRV8xTUhaLCBJODI1NF9JTzgsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZG1tMzJhdC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2RtbTMyYXQuYwppbmRleCAxYWYwMDY2Li5iYjI4ODNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZG1tMzJhdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kbW0zMmF0LmMKQEAgLTMwLDcgKzMwLDcgQEAKICAqIFRoaXMgZHJpdmVyIGlzIGZvciB0aGUgRGlhbW9uZCBTeXN0ZW1zIE1NLTMyLUFUIGJvYXJkCiAgKglodHRwOi8vd3d3LmRpYW1vbmRzeXN0ZW1zLmNvbS9wcm9kdWN0cy9kaWFtb25kbW0zMmF0CiAgKgotICogSXQgaXMgYmVpbmcgdXNlZCBvbiBzZXJ2ZXJhbCBwcm9qZWN0cyBpbnNpZGUgTkFTQSwgd2l0aG91dAorICogSXQgaXMgYmVpbmcgdXNlZCBvbiBzZXZlcmFsIHByb2plY3RzIGluc2lkZSBOQVNBLCB3aXRob3V0CiAgKiBwcm9ibGVtcyBzbyBmYXIuIEZvciBhbmFsb2cgaW5wdXQgY29tbWFuZHMsIFRSSUdfRVhUIGlzIG5vdAogICogeWV0IHN1cHBvcnRlZC4KICAqLwpAQCAtNDEsNyArNDEsNiBAQAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCiAjaW5jbHVkZSAiODI1NS5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCiAvKiBCb2FyZCByZWdpc3RlciBhZGRyZXNzZXMgKi8KICNkZWZpbmUgRE1NMzJBVF9BSV9TVEFSVF9DT05WX1JFRwkweDAwCkBAIC0yNzQsMTggKzI3MywxOCBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0yOTQsMTAgKzI5MywxMCBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAxMDAwMDAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywgMTAwMDAwMDAwMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDEwMDAwMDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAxMDAwMDAwMDAwKTsKIAogCWlmIChjbWQtPmNvbnZlcnRfYXJnID49IDE3NTAwKQogCQljbWQtPmNvbnZlcnRfYXJnID0gMjAwMDA7CkBAIC0zMDgsMTIgKzMwNywxMyBAQAogCWVsc2UKIAkJY21kLT5jb252ZXJ0X2FyZyA9IDUwMDA7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlIC8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTMyMSw3ICszMjEsNyBAQAogCS8qIFN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KIAogCWFyZyA9IGNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZzsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiA0OwpAQCAtMzkxLDEzICszOTEsMTIgQEAKIAkJLyogc3RhcnQgdGhlIGNsb2NrIGFuZCBlbmFibGUgdGhlIGludGVycnVwdHMgKi8KIAkJZG1tMzJhdF9zZXRhaXRpbWVyKGRldiwgY21kLT5zY2FuX2JlZ2luX2FyZyk7CiAJfSBlbHNlIHsKLQkJLyogc3RhcnQgdGhlIGludGVycnVwcyBhbmQgaW5pdGlhdGUgYSBzaW5nbGUgc2NhbiAqLworCQkvKiBzdGFydCB0aGUgaW50ZXJydXB0cyBhbmQgaW5pdGlhdGUgYSBzaW5nbGUgc2NhbiAqLwogCQlvdXRiKERNTTMyQVRfSU5UQ0xLX0FESU5ULCBkZXYtPmlvYmFzZSArIERNTTMyQVRfSU5UQ0xLX1JFRyk7CiAJCW91dGIoMHhmZiwgZGV2LT5pb2Jhc2UgKyBETU0zMkFUX0FJX1NUQVJUX0NPTlZfUkVHKTsKIAl9CiAKIAlyZXR1cm4gMDsKLQogfQogCiBzdGF0aWMgaW50IGRtbTMyYXRfYWlfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODAxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODAxLmMKaW5kZXggYjk2ZTYwZi4uODBlMzhkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgwMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MDEuYwpAQCAtMTI2LDcgKzEyNiw2IEBACiB9OwogCiBzdHJ1Y3QgZHQyODAxX2JvYXJkIHsKLQogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGJvYXJkY29kZTsKIAlpbnQgYWRfZGlmZjsKQEAgLTI4MCw3ICsyNzksNyBAQAogCXJldCA9IGR0MjgwMV93cml0ZWRhdGEoZGV2LCBkYXRhICYgMHhmZik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gZHQyODAxX3dyaXRlZGF0YShkZXYsIChkYXRhID4+IDgpKTsKKwlyZXQgPSBkdDI4MDFfd3JpdGVkYXRhKGRldiwgZGF0YSA+PiA4KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxMS5jCmluZGV4IGQ2NjBmMjcuLmE4MDc3MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODExLmMKQEAgLTE5NCw3ICsxOTQsNiBAQAogI2RlZmluZSBEVDI4MTFfQURNT0RFICAgMHgwMwogCiBzdHJ1Y3QgZHQyODExX2JvYXJkIHsKLQogCWNvbnN0IGNoYXIgKm5hbWU7CiAJY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgKmJpcF81OwogCWNvbnN0IHN0cnVjdCBjb21lZGlfbHJhbmdlICpiaXBfMl81OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNC5jCmluZGV4IDk4MDViZTEuLjY2NzA1ZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE0LmMKQEAgLTQwLDggKzQwLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLQogI2RlZmluZSBEVDI4MTRfQ1NSIDAKICNkZWZpbmUgRFQyODE0X0RBVEEgMQogCkBAIC01Niw3ICs1NCw2IEBACiAjZGVmaW5lIERUMjgxNF9DSEFOTUFTSyAweDBmCiAKIHN0cnVjdCBkdDI4MTRfcHJpdmF0ZSB7Ci0KIAlpbnQgbnRyaWc7CiAJaW50IGN1cmFkY2hhbjsKIH07CkBAIC0xMzAsMTggKzEyNywxOCBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTE1MCwxOCArMTQ3LDE5IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDEwMDAwMDAwMDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkgRFQyODE0X01BWF9TUEVFRCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDEwMDAwMDAwMDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkgICAgRFQyODE0X01BWF9TUEVFRCk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMik7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAyKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTE3MCw3ICsxNjgsNyBAQAogCiAJYXJnID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKIAlkdDI4MTRfbnNfdG9fdGltZXIoJmFyZywgY21kLT5mbGFncyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDQ7CkBAIC0xOTMsNyArMTkxLDYgQEAKIAlvdXRiKGNoYW4gfCBEVDI4MTRfRU5CIHwgKHRyaWd2YXIgPDwgNSksIGRldi0+aW9iYXNlICsgRFQyODE0X0NTUik7CiAKIAlyZXR1cm4gMDsKLQogfQogCiBzdGF0aWMgaXJxcmV0dXJuX3QgZHQyODE0X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgxNS5jCmluZGV4IGE5OGZiNjYuLmZiMDg1NjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MTUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODE1LmMKQEAgLTYwLDcgKzYwLDYgQEAKICNkZWZpbmUgRFQyODE1X1NUQVRVUyAxCiAKIHN0cnVjdCBkdDI4MTVfcHJpdmF0ZSB7Ci0KIAljb25zdCBzdHJ1Y3QgY29tZWRpX2xyYW5nZSAqcmFuZ2VfdHlwZV9saXN0WzhdOwogCXVuc2lnbmVkIGludCBhb19yZWFkYmFja1s4XTsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODJ4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQyODJ4LmMKaW5kZXggZGIyMWQyMS4uNWE1MzZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MjgyeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDI4MnguYwpAQCAtNjQsNyArNjQsNiBAQAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCiAjaW5jbHVkZSAiY29tZWRpX2lzYWRtYS5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCiAvKgogICogUmVnaXN0ZXIgbWFwCkBAIC02NjEsMjAgKzY2MCwyMCBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19GT0xMT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC02ODMsMjEgKzY4MiwyMiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDQwMDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCA0MDAwKTsKIAogI2RlZmluZSBTTE9XRVNUX1RJTUVSCSgyNTAqKDE8PDE1KSoyNTUpCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsIFNMT1dFU1RfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCBib2FyZC0+YWlfc3BlZWQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsIFNMT1dFU1RfVElNRVIpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCBib2FyZC0+YWlfc3BlZWQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfRVhUIHwgVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtNzA2LDcgKzcwNiw3IEBACiAKIAlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwogCWRldnByaXYtPmRpdmlzb3IgPSBkdDI4MnhfbnNfdG9fdGltZXIoJmFyZywgY21kLT5mbGFncyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDQ7CkBAIC03NjQsNyArNzY0LDcgQEAKIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XKSB7CiAJCW91dHcoZGV2cHJpdi0+c3VwY3NyIHwgRFQyODIxX1NVUENTUl9TVFJJRywKLQkJCWRldi0+aW9iYXNlICsgRFQyODIxX1NVUENTUl9SRUcpOworCQkgICAgIGRldi0+aW9iYXNlICsgRFQyODIxX1NVUENTUl9SRUcpOwogCX0gZWxzZSB7CiAJCWRldnByaXYtPnN1cGNzciB8PSBEVDI4MjFfU1VQQ1NSX1hUUklHOwogCQlvdXR3KGRldnByaXYtPnN1cGNzciwgZGV2LT5pb2Jhc2UgKyBEVDI4MjFfU1VQQ1NSX1JFRyk7CkBAIC04MzEsMTggKzgzMSwxOCBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfSU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX0lOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTg1MSwxNSArODUxLDE2IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDUwMDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCA1MDAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX0VYVCB8IFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTg2OCwxMyArODY5LDEyIEBACiAKIAlhcmcgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwogCWRldnByaXYtPmRpdmlzb3IgPSBkdDI4MnhfbnNfdG9fdGltZXIoJmFyZywgY21kLT5mbGFncyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDQ7CiAKIAlyZXR1cm4gMDsKLQogfQogCiBzdGF0aWMgaW50IGR0MjgyeF9hb19pbnR0cmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQzMDAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHQzMDAwLmMKaW5kZXggMGFhNTE5OC4uMDMxMjgyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R0MzAwMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9kdDMwMDAuYwpAQCAtNDksMTMgKzQ5LDEwIEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgotCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfZHQzMDAwX2FpID0gewogCTQsIHsKQEAgLTQwOSwxMSArNDA2LDExIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfVElNRVIpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwpAQCAtNDIzLDI4ICs0MjAsMjkgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIHRoaXNfYm9hcmQtPmFpX3NwZWVkKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgMTAwICogMTYgKiA2NTUzNSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIHRoaXNfYm9hcmQtPmFpX3NwZWVkKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgMTAwICogMTYgKiA2NTUzNSk7CiAJfQogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSB0aGlzX2JvYXJkLT5haV9zcGVlZCk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJIDUwICogMTYgKiA2NTUzNSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJICAgIHRoaXNfYm9hcmQtPmFpX3NwZWVkKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkgICAgNTAgKiAxNiAqIDY1NTM1KTsKIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdG9wX2FyZywgMHgwMGZmZmZmZik7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnN0b3BfYXJnLCAweDAwZmZmZmZmKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTQ1NCwxOCArNDUyLDE5IEBACiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwogCQlkdDNrX25zX3RvX3RpbWVyKDEwMCwgJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwogCQlkdDNrX25zX3RvX3RpbWVyKDUwLCAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAogCQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnICogY21kLT5zY2FuX2VuZF9hcmc7Ci0JCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCQkgYXJnKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPgorCQkJCQkJCSAgICBzY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICAgYXJnKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R5bmFfcGNpMTB4eC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2R5bmFfcGNpMTB4eC5jCmluZGV4IDZjMWU0NDIuLmM5ZWIyNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9keW5hX3BjaTEweHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvZHluYV9wY2kxMHh4LmMKQEAgLTM0LDEwICszNCw5IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNkZWZpbmUgUkVBRF9USU1FT1VUIDUwCiAKQEAgLTcwLDggKzY5LDkgQEAKIH0KIAogc3RhdGljIGludCBkeW5hX3BjaTEweHhfaW5zbl9yZWFkX2FpKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGR5bmFfcGNpMTB4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBuOwpAQCAtMTA5LDggKzEwOSw5IEBACiAKIC8qIGFuYWxvZyBvdXRwdXQgY2FsbGJhY2sgKi8KIHN0YXRpYyBpbnQgZHluYV9wY2kxMHh4X2luc25fd3JpdGVfYW8oc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAorCQkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGR5bmFfcGNpMTB4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCWludCBuOwpAQCAtMTMyLDggKzEzMyw5IEBACiAKIC8qIGRpZ2l0YWwgaW5wdXQgYml0IGludGVyZmFjZSAqLwogc3RhdGljIGludCBkeW5hX3BjaTEweHhfZGlfaW5zbl9iaXRzKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCSAgICAgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwgdW5zaWduZWQgaW50ICpkYXRhKQorCQkJCSAgICAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCisJCQkJICAgICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgKmRhdGEpCiB7CiAJc3RydWN0IGR5bmFfcGNpMTB4eF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwogCXUxNiBkID0gMDsKQEAgLTE3MSw3ICsxNzMsNyBAQAogfQogCiBzdGF0aWMgaW50IGR5bmFfcGNpMTB4eF9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorCQkJCSAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBkeW5hX3BjaTEweHhfcHJpdmF0ZSAqZGV2cHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9nc2NfaHBkaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKaW5kZXggZGVhZGE5Ny4uM2NiNjQwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2dzY19ocGRpLmMKQEAgLTQxLDE0ICs0MSwxMiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAjaW5jbHVkZSAicGx4OTA4MC5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCiAvKgogICogUENJIEJBUjIgUmVnaXN0ZXIgbWFwIChkZXYtPm1taW8pCkBAIC0zODYsMTggKzM4NCwxOCBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNDA2LDE4ICs0MDQsMTkgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoIWNtZC0+Y2hhbmxpc3RfbGVuIHx8ICFjbWQtPmNoYW5saXN0KSB7CiAJCWNtZC0+Y2hhbmxpc3RfbGVuID0gMzI7CiAJCWVyciB8PSAtRUlOVkFMOwogCX0KLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTQzMyw3ICs0MzIsNiBAQAogCQlyZXR1cm4gNTsKIAogCXJldHVybiAwOwotCiB9CiAKIC8qIHNldHVwIGRtYSBkZXNjcmlwdG9ycyBzbyBhIGxpbmsgY29tcGxldGVzIGV2ZXJ5ICdsZW4nIGJ5dGVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvaWNwX211bHRpLmMKaW5kZXggMWVhMTY4Ni4uMWUxMDRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2ljcF9tdWx0aS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9pY3BfbXVsdGkuYwpAQCAtNDMsMTEgKzQzLDEwIEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2RlZmluZSBJQ1BfTVVMVElfQURDX0NTUgkwCS8qIFIvVzogQURDIGNvbW1hbmQvc3RhdHVzIHJlZ2lzdGVyICovCiAjZGVmaW5lIElDUF9NVUxUSV9BSQkJMgkvKiBSOiAgIEFuYWxvZ3VlIGlucHV0IGRhdGEgKi8KQEAgLTM3MCw3ICszNjksNiBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKLQogCX0KIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTQ0NSw3ICs0NDMsNyBAQAogfQogCiBzdGF0aWMgaW50IGljcF9tdWx0aV9hdXRvX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCQkgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorCQkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQogewogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjb21lZGlfdG9fcGNpX2RldihkZXYpOwogCXN0cnVjdCBpY3BfbXVsdGlfcHJpdmF0ZSAqZGV2cHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvanIzX3BjaS5jCmluZGV4IDgxZmFiMmQuLmI4NzE5MmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9qcjNfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2pyM19wY2kuYwpAQCAtMzksMTQgKzM5LDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAjaW5jbHVkZSAianIzX3BjaS5oIgogCkBAIC03MDYsOCArNzA1LDYgQEAKIAlpZiAoIWRldnByaXYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW5pdF90aW1lcigmZGV2cHJpdi0+dGltZXIpOwotCiAJcmV0ID0gY29tZWRpX3BjaV9lbmFibGUoZGV2KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNzc1LDggKzc3Miw3IEBACiAJCXNwcml2LT5uZXh0X3RpbWVfbWF4ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCk7CiAJfQogCi0JZGV2cHJpdi0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKLQlkZXZwcml2LT50aW1lci5mdW5jdGlvbiA9IGpyM19wY2lfcG9sbF9kZXY7CisJc2V0dXBfdGltZXIoJmRldnByaXYtPnRpbWVyLCBqcjNfcGNpX3BvbGxfZGV2LCAodW5zaWduZWQgbG9uZylkZXYpOwogCWRldnByaXYtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsKIAlhZGRfdGltZXIoJmRldnByaXYtPnRpbWVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9rZV9jb3VudGVyLmMKaW5kZXggM2MxOWUwZi4uZGM2NDJlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL2tlX2NvdW50ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMva2VfY291bnRlci5jCkBAIC0yOCw5ICsyOCw4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAvKgogICogUENJIEJBUiAwIFJlZ2lzdGVyIEkvTyBtYXAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZTQwMDAuYwppbmRleCBkMTIwYWEyLi43YThjMjdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWU0MDAwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lNDAwMC5jCkBAIC00MSwxNCArNDEsMTIgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgotI2luY2x1ZGUgIjgyNTMuaCIKKyNpbmNsdWRlICJjb21lZGlfODI1NC5oIgogI2luY2x1ZGUgInBseDkwNTIuaCIKIAogI2RlZmluZSBNRTQwMDBfRklSTVdBUkUJCSJtZTQwMDBfZmlybXdhcmUuYmluIgpAQCAtMTcwLDcgKzE2OCw2IEBACiAKIHN0cnVjdCBtZTQwMDBfaW5mbyB7CiAJdW5zaWduZWQgbG9uZyBwbHhfcmVnYmFzZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX3JlZ2Jhc2U7CiB9OwogCiBlbnVtIG1lNDAwMF9ib2FyZGlkIHsKQEAgLTQyNCw3ICs0MjEsNyBAQAogCiAJLyogU2V0IGJvdGggc3RvcCBiaXRzIGluIHRoZSBhbmFsb2cgaW5wdXQgY29udHJvbCByZWdpc3RlciAqLwogCW91dGwoTUU0MDAwX0FJX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0MDAwX0FJX0NUUkxfQklUX1NUT1AsCi0JCWRldi0+aW9iYXNlICsgTUU0MDAwX0FJX0NUUkxfUkVHKTsKKwkgICAgIGRldi0+aW9iYXNlICsgTUU0MDAwX0FJX0NUUkxfUkVHKTsKIAogCS8qIFNldCBib3RoIHN0b3AgYml0cyBpbiB0aGUgYW5hbG9nIG91dHB1dCBjb250cm9sIHJlZ2lzdGVyICovCiAJdmFsID0gTUU0MDAwX0FPX0NUUkxfQklUX0lNTUVESUFURV9TVE9QIHwgTUU0MDAwX0FPX0NUUkxfQklUX1NUT1A7CkBAIC00MzgsNyArNDM1LDcgQEAKIAogCS8qIFNldCB0aGUgYWR1c3RtZW50IHJlZ2lzdGVyIGZvciBBTyBkZW11eCAqLwogCW91dGwoTUU0MDAwX0FPX0RFTVVYX0FESlVTVF9WQUxVRSwKLQkJICAgIGRldi0+aW9iYXNlICsgTUU0MDAwX0FPX0RFTVVYX0FESlVTVF9SRUcpOworCSAgICAgZGV2LT5pb2Jhc2UgKyBNRTQwMDBfQU9fREVNVVhfQURKVVNUX1JFRyk7CiAKIAkvKgogCSAqIFNldCBkaWdpdGFsIEkvTyBkaXJlY3Rpb24gZm9yIHBvcnQgMApAQCAtNjA5LDcgKzYwNiw3IEBACiAKIAkJCWlmICghY29tZWRpX3JhbmdlX2lzX2JpcG9sYXIocywgcmFuZ2UpKSB7CiAJCQkJZGV2X2RiZyhkZXYtPmNsYXNzX2RldiwKLQkJCQkgICAgICAgIkJpcG9sYXIgaXMgbm90IHNlbGVjdGVkIGluIGRpZmZlcmVudGlhbCBtb2RlXG4iKTsKKwkJCQkJIkJpcG9sYXIgaXMgbm90IHNlbGVjdGVkIGluIGRpZmZlcmVudGlhbCBtb2RlXG4iKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfQpAQCAtNjI0LDcgKzYyMSw2IEBACiAJCQkgICAgIHVuc2lnbmVkIGludCAqaW5pdF90aWNrcywKIAkJCSAgICAgdW5zaWduZWQgaW50ICpzY2FuX3RpY2tzLCB1bnNpZ25lZCBpbnQgKmNoYW5fdGlja3MpCiB7Ci0KIAlpbnQgcmVzdDsKIAogCSppbml0X3RpY2tzID0gMDsKQEAgLTczMSw3ICs3MjcsNiBAQAogCQkgICAgICB1bnNpZ25lZCBpbnQgaW5pdF90aWNrcywKIAkJICAgICAgdW5zaWduZWQgaW50IHNjYW5fdGlja3MsIHVuc2lnbmVkIGludCBjaGFuX3RpY2tzKQogewotCiAJdW5zaWduZWQgaW50IHRtcCA9IDA7CiAKIAkvKiBXcml0ZSB0aW1lciBhcmd1bWVudHMgKi8KQEAgLTc3MiwxMiArNzY3LDEyIEBACiAJLyogU3RvcCB0cmlnZ2VycyAqLwogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpIHsKIAkJb3V0bChjbWQtPmNoYW5saXN0X2xlbiAqIGNtZC0+c3RvcF9hcmcsCi0JCQkgICAgZGV2LT5pb2Jhc2UgKyBNRTQwMDBfQUlfU0FNUExFX0NPVU5URVJfUkVHKTsKKwkJICAgICBkZXYtPmlvYmFzZSArIE1FNDAwMF9BSV9TQU1QTEVfQ09VTlRFUl9SRUcpOwogCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUSB8IE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlE7CiAJfSBlbHNlIGlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfTk9ORSAmJgogCQkgICBjbWQtPnNjYW5fZW5kX3NyYyA9PSBUUklHX0NPVU5UKSB7CiAJCW91dGwoY21kLT5zY2FuX2VuZF9hcmcsCi0JCQkgICAgZGV2LT5pb2Jhc2UgKyBNRTQwMDBfQUlfU0FNUExFX0NPVU5URVJfUkVHKTsKKwkJICAgICBkZXYtPmlvYmFzZSArIE1FNDAwMF9BSV9TQU1QTEVfQ09VTlRFUl9SRUcpOwogCQl0bXAgfD0gTUU0MDAwX0FJX0NUUkxfQklUX0hGX0lSUSB8IE1FNDAwMF9BSV9DVFJMX0JJVF9TQ19JUlE7CiAJfSBlbHNlIHsKIAkJdG1wIHw9IE1FNDAwMF9BSV9DVFJMX0JJVF9IRl9JUlE7CkBAIC04MjcsNyArODIyLDYgQEAKIAkJCQkgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCiAJCQkJIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7Ci0KIAl1bnNpZ25lZCBpbnQgaW5pdF90aWNrczsKIAl1bnNpZ25lZCBpbnQgY2hhbl90aWNrczsKIAl1bnNpZ25lZCBpbnQgc2Nhbl90aWNrczsKQEAgLTgzOCwyNCArODMyLDI1IEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19GT0xMT1cgfCBUUklHX1RJTUVSIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywKIAkJCQkJVFJJR19OT05FIHwgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FIHwgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FIHwgVFJJR19DT1VOVCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9lbmRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9lbmRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTg4Niw3ICs4ODEsNyBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAogCWlmIChjbWQtPmNoYW5saXN0X2xlbiA8IDEpIHsKIAkJY21kLT5jaGFubGlzdF9sZW4gPSAxOwpAQCAtOTA2LDkgKzkwMSw5IEBACiAJfQogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC05MTksNyArOTE0LDYgQEAKIAlpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19OT1cgJiYKIAkgICAgY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSICYmCiAJICAgIGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCiAJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLwogCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJbnZhbGlkIHN0YXJ0IGFyZ1xuIik7CkBAIC05NDEsNyArOTM1LDYgQEAKIAl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfTk9XICYmCiAJCSAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cgJiYKIAkJICAgY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0KIAkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCiAJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgewogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkludmFsaWQgc3RhcnQgYXJnXG4iKTsKQEAgLTk1Niw3ICs5NDksNiBAQAogCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKIAkJICAgY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSICYmCiAJCSAgIGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewotCiAJCS8qIENoZWNrIHRpbWVyIGFyZ3VtZW50cyAqLwogCQlpZiAoaW5pdF90aWNrcyA8IE1FNDAwMF9BSV9NSU5fVElDS1MpIHsKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJbnZhbGlkIHN0YXJ0IGFyZ1xuIik7CkBAIC05NzgsNyArOTcwLDYgQEAKIAl9IGVsc2UgaWYgKGNtZC0+c3RhcnRfc3JjID09IFRSSUdfRVhUICYmCiAJCSAgIGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19GT0xMT1cgJiYKIAkJICAgY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0KIAkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCiAJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgewogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkludmFsaWQgc3RhcnQgYXJnXG4iKTsKQEAgLTk5Myw3ICs5ODQsNiBAQAogCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKIAkJICAgY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJgogCQkgICBjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQogCQkvKiBDaGVjayB0aW1lciBhcmd1bWVudHMgKi8KIAkJaWYgKGluaXRfdGlja3MgPCBNRTQwMDBfQUlfTUlOX1RJQ0tTKSB7CiAJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiSW52YWxpZCBzdGFydCBhcmdcbiIpOwpAQCAtMTAwOCw3ICs5OTgsNiBAQAogCX0gZWxzZSBpZiAoY21kLT5zdGFydF9zcmMgPT0gVFJJR19FWFQgJiYKIAkJICAgY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCAmJgogCQkgICBjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKSB7Ci0KIAkJLyogQ2hlY2sgdGltZXIgYXJndW1lbnRzICovCiAJCWlmIChpbml0X3RpY2tzIDwgTUU0MDAwX0FJX01JTl9USUNLUykgewogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkludmFsaWQgc3RhcnQgYXJnXG4iKTsKQEAgLTExODcsMTMgKzExNzYsMTMgQEAKIHsKIAlpZiAoY29tZWRpX2Rpb191cGRhdGVfc3RhdGUocywgZGF0YSkpIHsKIAkJb3V0bCgocy0+c3RhdGUgPj4gMCkgJiAweEZGLAotCQkJICAgIGRldi0+aW9iYXNlICsgTUU0MDAwX0RJT19QT1JUXzBfUkVHKTsKKwkJICAgICBkZXYtPmlvYmFzZSArIE1FNDAwMF9ESU9fUE9SVF8wX1JFRyk7CiAJCW91dGwoKHMtPnN0YXRlID4+IDgpICYgMHhGRiwKLQkJCSAgICBkZXYtPmlvYmFzZSArIE1FNDAwMF9ESU9fUE9SVF8xX1JFRyk7CisJCSAgICAgZGV2LT5pb2Jhc2UgKyBNRTQwMDBfRElPX1BPUlRfMV9SRUcpOwogCQlvdXRsKChzLT5zdGF0ZSA+PiAxNikgJiAweEZGLAotCQkJICAgIGRldi0+aW9iYXNlICsgTUU0MDAwX0RJT19QT1JUXzJfUkVHKTsKKwkJICAgICBkZXYtPmlvYmFzZSArIE1FNDAwMF9ESU9fUE9SVF8yX1JFRyk7CiAJCW91dGwoKHMtPnN0YXRlID4+IDI0KSAmIDB4RkYsCi0JCQkgICAgZGV2LT5pb2Jhc2UgKyBNRTQwMDBfRElPX1BPUlRfM19SRUcpOworCQkgICAgIGRldi0+aW9iYXNlICsgTUU0MDAwX0RJT19QT1JUXzNfUkVHKTsKIAl9CiAKIAlkYXRhWzFdID0gKChpbmwoZGV2LT5pb2Jhc2UgKyBNRTQwMDBfRElPX1BPUlRfMF9SRUcpICYgMHhGRikgPDwgMCkgfApAQCAtMTI1OSw4NSArMTI0OCw2IEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgQ291bnRlciBzZWN0aW9uCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLXN0YXRpYyBpbnQgbWU0MDAwX2NudF9pbnNuX2NvbmZpZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJICBzdHJ1Y3QgY29tZWRpX2luc24gKmluc24sCi0JCQkJICB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0Jc3RydWN0IG1lNDAwMF9pbmZvICppbmZvID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGludCBjaGFuID0gQ1JfQ0hBTihpbnNuLT5jaGFuc3BlYyk7Ci0JaW50IGVycjsKLQotCXN3aXRjaCAoZGF0YVswXSkgewotCWNhc2UgR1BDVF9SRVNFVDoKLQkJaWYgKGluc24tPm4gIT0gMSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCWVyciA9IGk4MjU0X3NldF9tb2RlKGluZm8tPnRpbWVyX3JlZ2Jhc2UsIDAsIGNoYW4sCi0JCQkJICAgICBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQlpODI1NF93cml0ZShpbmZvLT50aW1lcl9yZWdiYXNlLCAwLCBjaGFuLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBHUENUX1NFVF9PUEVSQVRJT046Ci0JCWlmIChpbnNuLT5uICE9IDIpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQllcnIgPSBpODI1NF9zZXRfbW9kZShpbmZvLT50aW1lcl9yZWdiYXNlLCAwLCBjaGFuLAotCQkJCShkYXRhWzFdIDw8IDEpIHwgSTgyNTRfQklOQVJZKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiBpbnNuLT5uOwotfQotCi1zdGF0aWMgaW50IG1lNDAwMF9jbnRfaW5zbl9yZWFkKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMsCi0JCQkJc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0Jc3RydWN0IG1lNDAwMF9pbmZvICppbmZvID0gZGV2LT5wcml2YXRlOwotCi0JaWYgKGluc24tPm4gPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoaW5zbi0+biA+IDEpIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIkludmFsaWQgaW5zdHJ1Y3Rpb24gbGVuZ3RoICVkXG4iLAotCQkJaW5zbi0+bik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRhdGFbMF0gPSBpODI1NF9yZWFkKGluZm8tPnRpbWVyX3JlZ2Jhc2UsIDAsIGluc24tPmNoYW5zcGVjKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IG1lNDAwMF9jbnRfaW5zbl93cml0ZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLCB1bnNpZ25lZCBpbnQgKmRhdGEpCi17Ci0Jc3RydWN0IG1lNDAwMF9pbmZvICppbmZvID0gZGV2LT5wcml2YXRlOwotCi0JaWYgKGluc24tPm4gPT0gMCkgewotCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKGluc24tPm4gPiAxKSB7Ci0JCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJJbnZhbGlkIGluc3RydWN0aW9uIGxlbmd0aCAlZFxuIiwKLQkJCWluc24tPm4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpODI1NF93cml0ZShpbmZvLT50aW1lcl9yZWdiYXNlLCAwLCBpbnNuLT5jaGFuc3BlYywgZGF0YVswXSk7Ci0KLQlyZXR1cm4gMTsKLX0KLQogc3RhdGljIGludCBtZTQwMDBfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKQEAgLTEzNjQsOCArMTI3NCw3IEBACiAKIAlpbmZvLT5wbHhfcmVnYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDEpOwogCWRldi0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMik7Ci0JaW5mby0+dGltZXJfcmVnYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDMpOwotCWlmICghaW5mby0+cGx4X3JlZ2Jhc2UgfHwgIWRldi0+aW9iYXNlIHx8ICFpbmZvLT50aW1lcl9yZWdiYXNlKQorCWlmICghaW5mby0+cGx4X3JlZ2Jhc2UgfHwgIWRldi0+aW9iYXNlKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXJlc3VsdCA9IGNvbWVkaV9sb2FkX2Zpcm13YXJlKGRldiwgJnBjaWRldi0+ZGV2LCBNRTQwMDBfRklSTVdBUkUsCkBAIC0xMzc3LDcgKzEyODYsNyBAQAogCiAJaWYgKHBjaWRldi0+aXJxID4gMCkgewogCQlyZXN1bHQgPSByZXF1ZXN0X2lycShwY2lkZXYtPmlycSwgbWU0MDAwX2FpX2lzciwgSVJRRl9TSEFSRUQsCi0JCQkJICBkZXYtPmJvYXJkX25hbWUsIGRldik7CisJCQkJICAgICBkZXYtPmJvYXJkX25hbWUsIGRldik7CiAJCWlmIChyZXN1bHQgPT0gMCkKIAkJCWRldi0+aXJxID0gcGNpZGV2LT5pcnE7CiAJfQpAQCAtMTQ1OSwyMyArMTM2OCwyMiBAQAogCWlmICghaW5sKGRldi0+aW9iYXNlICsgTUU0MDAwX0RJT19ESVJfUkVHKSkgewogCQlzLT5pb19iaXRzIHw9IDB4RkY7CiAJCW91dGwoTUU0MDAwX0RJT19DVFJMX0JJVF9NT0RFXzAsCi0JCQlkZXYtPmlvYmFzZSArIE1FNDAwMF9ESU9fRElSX1JFRyk7CisJCSAgICAgZGV2LT5pb2Jhc2UgKyBNRTQwMDBfRElPX0RJUl9SRUcpOwogCX0KIAotICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgQ291bnRlciBzdWJkZXZpY2UKLSAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KKwkvKiBDb3VudGVyIHN1YmRldmljZSAoODI1NCkgKi8KIAlzID0gJmRldi0+c3ViZGV2aWNlc1szXTsKLQogCWlmICh0aGlzYm9hcmQtPmhhc19jb3VudGVyKSB7Ci0JCXMtPnR5cGUgPSBDT01FRElfU1VCRF9DT1VOVEVSOwotCQlzLT5zdWJkZXZfZmxhZ3MgPSBTREZfUkVBREFCTEUgfCBTREZfV1JJVEFCTEU7Ci0JCXMtPm5fY2hhbiA9IDM7Ci0JCXMtPm1heGRhdGEgPSAweEZGRkY7CS8qICAxNiBiaXQgY291bnRlcnMgKi8KLQkJcy0+aW5zbl9yZWFkID0gbWU0MDAwX2NudF9pbnNuX3JlYWQ7Ci0JCXMtPmluc25fd3JpdGUgPSBtZTQwMDBfY250X2luc25fd3JpdGU7Ci0JCXMtPmluc25fY29uZmlnID0gbWU0MDAwX2NudF9pbnNuX2NvbmZpZzsKKwkJdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMyk7CisKKwkJaWYgKCF0aW1lcl9iYXNlKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQodGltZXJfYmFzZSwgMCwgSTgyNTRfSU84LCAwKTsKKwkJaWYgKCFkZXYtPnBhY2VyKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJY29tZWRpXzgyNTRfc3ViZGV2aWNlX2luaXQocywgZGV2LT5wYWNlcik7CiAJfSBlbHNlIHsKIAkJcy0+dHlwZSA9IENPTUVESV9TVUJEX1VOVVNFRDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWVfZGFxLmMKaW5kZXggOTJlMjM1Mi4uZDc4ZTkxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21lX2RhcS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZV9kYXEuYwpAQCAtMzAsMTEgKzMwLDEwIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNpbmNsdWRlICJwbHg5MDUyLmgiCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tZjZ4NC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21mNng0LmMKaW5kZXggZGI5NzJiYy4uYTY3NWUyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21mNng0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21mNng0LmMKQEAgLTI2LDkgKzI2LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKworI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogLyogUmVnaXN0ZXJzIHByZXNlbnQgaW4gQkFSMCBtZW1vcnkgcmVnaW9uICovCiAjZGVmaW5lIE1GNjI0X0dQSU9DX1IJCQkJCTB4NTQKQEAgLTIzNyw3ICsyMzcsNiBAQAogCWVsc2UKIAkJZGV2cHJpdi0+Z3Bpb2NfUiA9IGRldnByaXYtPmJhcjBfbWVtICsgTUY2MjRfR1BJT0NfUjsKIAotCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmMKaW5kZXggMWU1MzdhNS4uZTQzYTBjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5jCkBAIC00NywxMSArNDcsOSBAQAogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICJtaXRlLmgiCiAKICNkZWZpbmUgVE9QX09GX1BBR0UoeCkgKCh4KXwofihQQUdFX01BU0spKSkKQEAgLTE4NiwxMCArMTg0LDEwIEBACiAJc3RydWN0IG1pdGVfZG1hX2Rlc2NyaXB0b3JfcmluZyAqcmluZyA9CiAJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaXRlX2RtYV9kZXNjcmlwdG9yX3JpbmcpLCBHRlBfS0VSTkVMKTsKIAotCWlmIChyaW5nID09IE5VTEwpCi0JCXJldHVybiByaW5nOworCWlmICghcmluZykKKwkJcmV0dXJuIE5VTEw7CiAJcmluZy0+aHdfZGV2ID0gZ2V0X2RldmljZSgmbWl0ZS0+cGNpZGV2LT5kZXYpOwotCWlmIChyaW5nLT5od19kZXYgPT0gTlVMTCkgeworCWlmICghcmluZy0+aHdfZGV2KSB7CiAJCWtmcmVlKHJpbmcpOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21pdGUuaAppbmRleCBiMmIxMjA0Li5iM2NhN2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbWl0ZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9taXRlLmgKQEAgLTE5LDEwICsxOSw5IEBACiAjaWZuZGVmIF9NSVRFX0hfCiAjZGVmaW5lIF9NSVRFX0hfCiAKLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2RlZmluZSBQQ0lNSU9fQ09NUEFUCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tcGM2MjQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9tcGM2MjQuYwppbmRleCAxMjQxZjk5Li4wMjA3YjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbXBjNjI0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL21wYzYyNC5jCkBAIC0xMTUsNyArMTE1LDYgQEAKIAkoTVBDNjI0X09TUjQgfCBNUEM2MjRfT1NSMyB8IE1QQzYyNF9PU1IyIHwgTVBDNjI0X09TUjEgfCBNUEM2MjRfT1NSMCkKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdHJ1Y3QgbXBjNjI0X3ByaXZhdGUgewotCiAJLyogIHNldCBieSBtcGM2MjRfYXR0YWNoKCkgZnJvbSBkcml2ZXIncyBwYXJhbWV0ZXJzICovCiAJdW5zaWduZWQgbG9uZyBpbnQgdWxDb252ZXJ0aW9uUmF0ZTsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjUyNy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1MjcuYwppbmRleCA1MzBmNzE2Li42MmE4MTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjUyNy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NTI3LmMKQEAgLTI4LDEyICsyOCw5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCi0KLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKIC8qCiAgKiBQQ0kgQkFSMSAtIFJlZ2lzdGVyIG1lbW9yeSBtYXAKQEAgLTIyNCwxMSArMjIxLDExIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfT1RIRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfRk9MTE9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX09USEVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CkBAIC0yMzgsMTEgKzIzNSwxMiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NXh4LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjV4eC5jCmluZGV4IDY3Y2I3NTguLjgwMGQ1NzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NXh4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY1eHguYwpAQCAtNTcsMTIgKzU3LDkgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKLQotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogLyoKICAqIFBDSSBCQVIxIFJlZ2lzdGVyIE1hcApAQCAtNTA4LDExICs1MDUsMTEgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19PVEhFUik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfT1RIRVIpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKQEAgLTUyMiwxMSArNTE5LDEyIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtNjEzLDcgKzYxMSw3IEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKLS8qIHJpcHBlZCBmcm9tIG1pdGUuaCBhbmQgbWl0ZV9zZXR1cDIoKSB0byBhdm9pZCBtaXRlIGRlcGVuZGFuY3kgKi8KKy8qIHJpcHBlZCBmcm9tIG1pdGUuaCBhbmQgbWl0ZV9zZXR1cDIoKSB0byBhdm9pZCBtaXRlIGRlcGVuZGVuY3kgKi8KICNkZWZpbmUgTUlURV9JT0RXQlNSCTB4YzAJIC8qIElPIERldmljZSBXaW5kb3cgQmFzZSBTaXplIFJlZ2lzdGVyICovCiAjZGVmaW5lIFdFTkFCCQkoMSA8PCA3KSAvKiB3aW5kb3cgZW5hYmxlICovCiAKQEAgLTY3Niw3ICs2NzQsNyBAQAogCX0KIAogCWRldl9pbmZvKGRldi0+Y2xhc3NfZGV2LCAiYm9hcmQ6ICVzLCBJRD0weCUwMngiLCBkZXYtPmJvYXJkX25hbWUsCi0JICAgICAgIHJlYWRiKGRldi0+bW1pbyArIE5JXzY1WFhfSURfUkVHKSk7CisJCSByZWFkYihkZXYtPm1taW8gKyBOSV82NVhYX0lEX1JFRykpOwogCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY2MHguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NjB4LmMKaW5kZXggMWU0ZGQ4Mi4uNDY2NDdjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY2MHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjYweC5jCkBAIC0zNSwxMiArMzUsMTAgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICJtaXRlLmgiCiAjaW5jbHVkZSAibmlfdGlvLmgiCiAKQEAgLTE5NSw3ICsxOTMsNiBAQAogfQogCiBzdHJ1Y3QgTklfNjYweFJlZ2lzdGVyRGF0YSB7Ci0KIAljb25zdCBjaGFyICpuYW1lOwkvKiAgUmVnaXN0ZXIgTmFtZSAqLwogCWludCBvZmZzZXQ7CQkvKiAgT2Zmc2V0IGZyb20gYmFzZSBhZGRyZXNzIGZyb20gR1BDVCBjaGlwICovCiAJZW51bSBuaV82NjB4X3JlZ2lzdGVyX2RpcmVjdGlvbiBkaXJlY3Rpb247CkBAIC03MDIsNyArNjk5LDcgQEAKIAlCVUdfT04oY291bnRlci0+bWl0ZV9jaGFuKTsKIAltaXRlX2NoYW4gPSBtaXRlX3JlcXVlc3RfY2hhbm5lbChkZXZwcml2LT5taXRlLAogCQkJCQkgbWl0ZV9yaW5nKGRldnByaXYsIGNvdW50ZXIpKTsKLQlpZiAobWl0ZV9jaGFuID09IE5VTEwpIHsKKwlpZiAoIW1pdGVfY2hhbikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZwcml2LT5taXRlX2NoYW5uZWxfbG9jaywgZmxhZ3MpOwogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAogCQkJImZhaWxlZCB0byByZXNlcnZlIG1pdGUgZG1hIGNoYW5uZWwgZm9yIGNvdW50ZXJcbiIpOwpAQCAtODYxLDcgKzg1OCw3IEBACiAJCWZvciAoaiA9IDA7IGogPCBjb3VudGVyc19wZXJfY2hpcDsgKytqKSB7CiAJCQlkZXZwcml2LT5taXRlX3JpbmdzW2ldW2pdID0KIAkJCSAgICBtaXRlX2FsbG9jX3JpbmcoZGV2cHJpdi0+bWl0ZSk7Ci0JCQlpZiAoZGV2cHJpdi0+bWl0ZV9yaW5nc1tpXVtqXSA9PSBOVUxMKQorCQkJaWYgKCFkZXZwcml2LT5taXRlX3JpbmdzW2ldW2pdKQogCQkJCXJldHVybiAtRU5PTUVNOwogCQl9CiAJfQpAQCAtMTEwNyw3ICsxMTA0LDcgQEAKIAkJCQkJCSAgICAgbmlfZ3BjdF92YXJpYW50XzY2MHgsCiAJCQkJCQkgICAgIG5pXzY2MHhfbnVtX2NvdW50ZXJzCiAJCQkJCQkgICAgIChkZXYpKTsKLQlpZiAoZGV2cHJpdi0+Y291bnRlcl9kZXYgPT0gTlVMTCkKKwlpZiAoIWRldnByaXYtPmNvdW50ZXJfZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAlmb3IgKGkgPSAwOyBpIDwgTklfNjYwWF9NQVhfTlVNX0NPVU5URVJTOyArK2kpIHsKIAkJcyA9ICZkZXYtPnN1YmRldmljZXNbTklfNjYwWF9HUENUX1NVQkRFVihpKV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pXzY3MHguYwppbmRleCBjNDJhODFjLi4xM2M2Y2NiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfNjcweC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV82NzB4LmMKQEAgLTM3LDExICszNywxMCBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgorI2luY2x1ZGUgIi4uL2NvbWVkaV9wY2kuaCIKIAogI2RlZmluZSBBT19WQUxVRV9PRkZTRVQJCQkweDAwCiAjZGVmaW5lCUFPX0NIQU5fT0ZGU0VUCQkJMHgwYwpAQCAtMTQ2LDcgKzE0NSw3IEBACiAJcmV0dXJuIGluc24tPm47CiB9CiAKLS8qIHJpcHBlZCBmcm9tIG1pdGUuaCBhbmQgbWl0ZV9zZXR1cDIoKSB0byBhdm9pZCBtaXRlIGRlcGVuZGFuY3kgKi8KKy8qIHJpcHBlZCBmcm9tIG1pdGUuaCBhbmQgbWl0ZV9zZXR1cDIoKSB0byBhdm9pZCBtaXRlIGRlcGVuZGVuY3kgKi8KICNkZWZpbmUgTUlURV9JT0RXQlNSCTB4YzAJIC8qIElPIERldmljZSBXaW5kb3cgQmFzZSBTaXplIFJlZ2lzdGVyICovCiAjZGVmaW5lIFdFTkFCCQkoMSA8PCA3KSAvKiB3aW5kb3cgZW5hYmxlICovCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hMjE1MC5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKaW5kZXggYTFjZTBiMC4uM2E5NzJkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2EyMTUwLmMKQEAgLTY3LDggKzY3LDcgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgImNvbWVkaV9pc2FkbWEuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKIAogI2RlZmluZSBBMjE1MF9ETUFfQlVGRkVSX1NJWkUJMHhmZjAwCS8qICBzaXplIGluIGJ5dGVzIG9mIGRtYSBidWZmZXIgKi8KIApAQCAtMTEwLDggKzEwOSw2IEBACiAjZGVmaW5lICAgRE1BX0lOVFJfRU5fQklUIAkJMHg4MDAJLyogIGVuYWJsZSBpbnRlcnJ1cHQgb24gZG1hIHRlcm1pbmFsIGNvdW50ICovCiAjZGVmaW5lICAgRE1BX0RFTV9FTl9CSVQJMHgxMDAwCS8qICBlbmFibGVzIGRlbWFuZCBtb2RlIGRtYSAqLwogI2RlZmluZSBJODI1M19CQVNFX1JFRwkJMHgxNAotI2RlZmluZSBJODI1M19NT0RFX1JFRwkJMHgxNwotI2RlZmluZSAgIEhXX0NPVU5UX0RJU0FCTEUJCTB4MzAJLyogIGRpc2FibGUgaGFyZHdhcmUgY291bnRpbmcgb2YgY29udmVyc2lvbnMgKi8KIAogc3RydWN0IGEyMTUwX2JvYXJkIHsKIAljb25zdCBjaGFyICpuYW1lOwpAQCAtNDIyLDE5ICs0MTksMTkgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNDQzLDE5ICs0NDAsMjEgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSB0aGlzYm9hcmQtPmFpX3NwZWVkKTsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJICAgIHRoaXNib2FyZC0+YWlfc3BlZWQpOworCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jaGFubGlzdF9sZW4sIDEpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTQ2NSw3ICs0NjQsNyBAQAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKIAkJYTIxNTBfZ2V0X3RpbWluZyhkZXYsICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCkBAIC00ODgsNyArNDg3LDYgQEAKIAlzdHJ1Y3QgY29tZWRpX2lzYWRtYV9kZXNjICpkZXNjID0gJmRtYS0+ZGVzY1swXTsKIAlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYyA9IHMtPmFzeW5jOwogCXN0cnVjdCBjb21lZGlfY21kICpjbWQgPSAmYXN5bmMtPmNtZDsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIEk4MjUzX0JBU0VfUkVHOwogCXVuc2lnbmVkIGludCBvbGRfY29uZmlnX2JpdHMgPSBkZXZwcml2LT5jb25maWdfYml0czsKIAl1bnNpZ25lZCBpbnQgdHJpZ2dlcl9iaXRzOwogCkBAIC01NDcsOCArNTQ1LDcgQEAKIAlvdXR3KGRldnByaXYtPmlycV9kbWFfYml0cywgZGV2LT5pb2Jhc2UgKyBJUlFfRE1BX0NOVFJMX1JFRyk7CiAKIAkvKiAgbWF5IG5lZWQgdG8gd2FpdCA3MiBzYW1wbGluZyBwZXJpb2RzIGlmIHRpbWluZyB3YXMgY2hhbmdlZCAqLwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAyLCA3Mik7CisJY29tZWRpXzgyNTRfbG9hZChkZXYtPnBhY2VyLCAyLCA3MiwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwogCiAJLyogIHNldHVwIHN0YXJ0IHRyaWdnZXJpbmcgKi8KIAl0cmlnZ2VyX2JpdHMgPSAwOwpAQCAtNzI2LDYgKzcyMywxMSBAQAogCS8qIGFuIElSUSBhbmQgRE1BIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0IGFzeW5jIGNvbW1hbmRzICovCiAJYTIxNTBfYWxsb2NfaXJxX2FuZF9kbWEoZGV2LCBpdCk7CiAKKwlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIEk4MjUzX0JBU0VfUkVHLAorCQkJCSAgICAgIDAsIEk4MjU0X0lPOCwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgMSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTc0NywxMCArNzQ5LDYgQEAKIAkJcy0+Y2FuY2VsID0gYTIxNTBfY2FuY2VsOwogCX0KIAotCS8qIG5lZWQgdG8gZG8gdGhpcyBmb3Igc29mdHdhcmUgY291bnRpbmcgb2YgY29tcGxldGVkIGNvbnZlcnNpb25zLCB0bwotCSAqIHByZXZlbnQgaGFyZHdhcmUgY291bnQgZnJvbSBzdG9wcGluZyBhY3F1aXNpdGlvbiAqLwotCW91dHcoSFdfQ09VTlRfRElTQUJMRSwgZGV2LT5pb2Jhc2UgKyBJODI1M19NT0RFX1JFRyk7Ci0KIAkvKiAgc2V0IGNhcmQncyBpcnEgYW5kIGRtYSBsZXZlbHMgKi8KIAlvdXR3KGRldnByaXYtPmlycV9kbWFfYml0cywgZGV2LT5pb2Jhc2UgKyBJUlFfRE1BX0NOVFJMX1JFRyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdF9hby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2FvLmMKaW5kZXggOWVlYWYzYy4uZjI3YWEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2FvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0X2FvLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKIC8qCiAgKiBSZWdpc3RlciBtYXAKQEAgLTI3NCw3ICsyNzQsNiBAQAogc3RhdGljIHZvaWQgYXRhb19yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCXN0cnVjdCBhdGFvX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7Ci0JdW5zaWduZWQgbG9uZyB0aW1lcl9iYXNlID0gZGV2LT5pb2Jhc2UgKyBBVEFPXzgyQzUzX0JBU0U7CiAKIAkvKiBUaGlzIGlzIHRoZSByZXNldCBzZXF1ZW5jZSBkZXNjcmliZWQgaW4gdGhlIG1hbnVhbCAqLwogCkBAIC0yODIsOSArMjgxLDkgQEAKIAlvdXR3KGRldnByaXYtPmNmZzEsIGRldi0+aW9iYXNlICsgQVRBT19DRkcxX1JFRyk7CiAKIAkvKiBQdXQgb3V0cHV0cyBvZiBjb3VudGVyIDEgYW5kIGNvdW50ZXIgMiBpbiBhIGhpZ2ggc3RhdGUgKi8KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAwLCBJODI1NF9NT0RFNCB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTQgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDAsIDB4MDAwMyk7CisJY29tZWRpXzgyNTRfc2V0X21vZGUoZGV2LT5wYWNlciwgMCwgSTgyNTRfTU9ERTQgfCBJODI1NF9CSU5BUlkpOworCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldi0+cGFjZXIsIDEsIEk4MjU0X01PREU0IHwgSTgyNTRfQklOQVJZKTsKKwljb21lZGlfODI1NF93cml0ZShkZXYtPnBhY2VyLCAwLCAweDAwMDMpOwogCiAJb3V0dyhBVEFPX0NGRzJfQ0FMTERfTk9QLCBkZXYtPmlvYmFzZSArIEFUQU9fQ0ZHMl9SRUcpOwogCkBAIC0zMTUsNiArMzE0LDExIEBACiAJaWYgKCFkZXZwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgQVRBT184MkM1M19CQVNFLAorCQkJCSAgICAgIDAsIEk4MjU0X0lPOCwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvLmMKaW5kZXggMzAxZjE1NC4uMTMwNGIwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2F0bWlvLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogCQkJCQkgIElTQVBOUF9GVU5DVElPTihuaV9ib2FyZHNbaV0uCiAJCQkJCQkJICBpc2FwbnBfaWQpLCBOVUxMKTsKIAotCQlpZiAoaXNhcG5wX2RldiA9PSBOVUxMIHx8IGlzYXBucF9kZXYtPmNhcmQgPT0gTlVMTCkKKwkJaWYgKCFpc2FwbnBfZGV2IHx8ICFpc2FwbnBfZGV2LT5jYXJkKQogCQkJY29udGludWU7CiAKIAkJaWYgKHBucF9kZXZpY2VfYXR0YWNoKGlzYXBucF9kZXYpIDwgMCkKQEAgLTI4Miw3ICsyODIsNiBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG5pX2JvYXJkcyk7IGkrKykgewogCQlpZiAobmlfYm9hcmRzW2ldLmRldmljZV9pZCA9PSBkZXZpY2VfaWQpCiAJCQlyZXR1cm4gaTsKLQogCX0KIAlpZiAoZGV2aWNlX2lkID09IDI1NSkKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImNhbid0IGZpbmQgYm9hcmRcbiIpOwpAQCAtMzU1LDcgKzM1NCw2IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfYXRtaW8xNmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jCmluZGV4IGM0ODRjODkuLmMzZWI1NDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9hdG1pbzE2ZC5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICI4MjU1LmgiCiAKIC8qIENvbmZpZ3VyYXRpb24gYW5kIFN0YXR1cyBSZWdpc3RlcnMgKi8KQEAgLTk2LDcgKzk1LDYgQEAKICNkZWZpbmUgQ0xPQ0tfMTAwX0haCTB4OEYyNQogCiBzdHJ1Y3QgYXRtaW8xNl9ib2FyZF90IHsKLQogCWNvbnN0IGNoYXIgKm5hbWU7CiAJaW50IGhhc184MjU1OwogfTsKQEAgLTIzNCwyMCArMjMyLDIwIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAogCQkJCQlUUklHX0ZPTExPVyB8IFRSSUdfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMjU2LDMwICsyNTQsMzEgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykgewogCQkvKiBpbnRlcm5hbCB0cmlnZ2VyICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAl9IGVsc2UgewogI2lmIDAKIAkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLwogCQkvKiBzaG91bGQgYmUgbGV2ZWwvZWRnZSwgaGkvbG8gc3BlY2lmaWNhdGlvbiBoZXJlICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKICNlbmRpZgogCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMDAwMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDEwMDAwKTsKICNpZiAwCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsIFNMT1dFU1RfVElNRVIpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLCBTTE9XRVNUX1RJTUVSKTsKICNlbmRpZgogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5jCmluZGV4IGE5MTYwNDcuLjUxZTVlOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwYy5jCkBAIC0xMDUsNiArMTA1LDcgQEAKIHN0YXRpYyB2b2lkIGxhYnBjX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewogCWxhYnBjX2ZyZWVfZG1hX2NoYW4oZGV2KTsKKwlsYWJwY19jb21tb25fZGV0YWNoKGRldik7CiAJY29tZWRpX2xlZ2FjeV9kZXRhY2goZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjLmggYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuaAppbmRleCBiZTg5YWU0Li44M2Y4NzhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGMuaApAQCAtMzYsNiArMzYsNyBAQAogCiBzdHJ1Y3QgbGFicGNfcHJpdmF0ZSB7CiAJc3RydWN0IGNvbWVkaV9pc2FkbWEgKmRtYTsKKwlzdHJ1Y3QgY29tZWRpXzgyNTQgKmNvdW50ZXI7CiAKIAkvKiAgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGxlZnQgdG8gYmUgdGFrZW4gKi8KIAl1bnNpZ25lZCBsb25nIGxvbmcgY291bnQ7CkBAIC00OSwyMCArNTAsNiBAQAogCS8qICBzdG9yZSBsYXN0IHJlYWQgb2YgYm9hcmQgc3RhdHVzIHJlZ2lzdGVycyAqLwogCXVuc2lnbmVkIGludCBzdGF0MTsKIAl1bnNpZ25lZCBpbnQgc3RhdDI7Ci0JLyoKLQkgKiB2YWx1ZSB0byBsb2FkIGludG8gYm9hcmQncyBjb3VudGVyIGEwIChjb252ZXJzaW9uIHBhY2luZykgZm9yIHRpbWVkCi0JICogY29udmVyc2lvbnMKLQkgKi8KLQl1bnNpZ25lZCBpbnQgZGl2aXNvcl9hMDsKLQkvKgotCSAqIHZhbHVlIHRvIGxvYWQgaW50byBib2FyZCdzIGNvdW50ZXIgYjAgKG1hc3RlcikgZm9yIHRpbWVkIGNvbnZlcnNpb25zCi0JICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3JfYjA7Ci0JLyoKLQkgKiB2YWx1ZSB0byBsb2FkIGludG8gYm9hcmQncyBjb3VudGVyIGIxIChzY2FuIHBhY2luZykgZm9yIHRpbWVkCi0JICogY29udmVyc2lvbnMKLQkgKi8KLQl1bnNpZ25lZCBpbnQgZGl2aXNvcl9iMTsKIAogCS8qIHdlIGFyZSB1c2luZyBkbWEvZmlmby1oYWxmLWZ1bGwvZXRjLiAqLwogCWVudW0gdHJhbnNmZXJfdHlwZSBjdXJyZW50X3RyYW5zZmVyOwpAQCAtNzcsNSArNjQsNiBAQAogCiBpbnQgbGFicGNfY29tbW9uX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJdW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgbG9uZyBpc3JfZmxhZ3MpOwordm9pZCBsYWJwY19jb21tb25fZGV0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpOwogCiAjZW5kaWYgLyogX05JX0xBQlBDX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19jb21tb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19jb21tb24uYwppbmRleCBiODhlZTI2Li44NjNhZmIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY29tbW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2NvbW1vbi5jCkBAIC0yMCwxMiArMjAsMTIgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKICNpbmNsdWRlICI4MjU1LmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAibmlfbGFicGMuaCIKICNpbmNsdWRlICJuaV9sYWJwY19yZWdzLmgiCiAjaW5jbHVkZSAibmlfbGFicGNfaXNhZG1hLmgiCkBAIC0xMDgsMzIgKzEwOCw2IEBACiAJd3JpdGViKGJ5dGUsIGRldi0+bW1pbyArIHJlZyk7CiB9CiAKLXN0YXRpYyB2b2lkIGxhYnBjX2NvdW50ZXJfbG9hZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgcmVnLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBjb3VudGVyX251bWJlciwKLQkJCSAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IG1vZGUpCi17Ci0JaWYgKGRldi0+bW1pbykgewotCQlpODI1NF9tbV9zZXRfbW9kZShkZXYtPm1taW8gKyByZWcsIDAsIGNvdW50ZXJfbnVtYmVyLCBtb2RlKTsKLQkJaTgyNTRfbW1fd3JpdGUoZGV2LT5tbWlvICsgcmVnLCAwLCBjb3VudGVyX251bWJlciwgY291bnQpOwotCX0gZWxzZSB7Ci0JCWk4MjU0X3NldF9tb2RlKGRldi0+aW9iYXNlICsgcmVnLCAwLCBjb3VudGVyX251bWJlciwgbW9kZSk7Ci0JCWk4MjU0X3dyaXRlKGRldi0+aW9iYXNlICsgcmVnLCAwLCBjb3VudGVyX251bWJlciwgY291bnQpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbGFicGNfY291bnRlcl9zZXRfbW9kZShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgcmVnLAotCQkJCSAgIHVuc2lnbmVkIGludCBjb3VudGVyX251bWJlciwKLQkJCQkgICB1bnNpZ25lZCBpbnQgbW9kZSkKLXsKLQlpZiAoZGV2LT5tbWlvKQotCQlpODI1NF9tbV9zZXRfbW9kZShkZXYtPm1taW8gKyByZWcsIDAsIGNvdW50ZXJfbnVtYmVyLCBtb2RlKTsKLQllbHNlCi0JCWk4MjU0X3NldF9tb2RlKGRldi0+aW9iYXNlICsgcmVnLCAwLCBjb3VudGVyX251bWJlciwgbW9kZSk7Ci19Ci0KIHN0YXRpYyBpbnQgbGFicGNfY2FuY2VsKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQogewogCXN0cnVjdCBsYWJwY19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwpAQCAtMjg0LDcgKzI1OCw3IEBACiAJZGV2cHJpdi0+d3JpdGVfYnl0ZShkZXYsIGRldnByaXYtPmNtZDQsIENNRDRfUkVHKTsKIAogCS8qIGluaXRpYWxpemUgcGFjZXIgY291bnRlciB0byBwcmV2ZW50IGFueSBwcm9ibGVtcyAqLwotCWxhYnBjX2NvdW50ZXJfc2V0X21vZGUoZGV2LCBDT1VOVEVSX0FfQkFTRV9SRUcsIDAsIEk4MjU0X01PREUyKTsKKwljb21lZGlfODI1NF9zZXRfbW9kZShkZXZwcml2LT5jb3VudGVyLCAwLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7CiAKIAlsYWJwY19jbGVhcl9hZGNfZmlmbyhkZXYpOwogCkBAIC0zNjcsODMgKzM0MSw4MSBAQAogc3RhdGljIHZvaWQgbGFicGNfYWRjX3RpbWluZyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2NtZCAqY21kLAogCQkJICAgICBlbnVtIHNjYW5fbW9kZSBtb2RlKQogewotCXN0cnVjdCBsYWJwY19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCXN0cnVjdCBjb21lZGlfODI1NCAqcGFjZXIgPSBkZXYtPnBhY2VyOworCXVuc2lnbmVkIGludCBjb252ZXJ0X3BlcmlvZCA9IGxhYnBjX2FpX2NvbnZlcnRfcGVyaW9kKGNtZCwgbW9kZSk7CisJdW5zaWduZWQgaW50IHNjYW5fcGVyaW9kID0gbGFicGNfYWlfc2Nhbl9wZXJpb2QoY21kLCBtb2RlKTsKIAl1bnNpZ25lZCBpbnQgYmFzZV9wZXJpb2Q7Ci0JdW5zaWduZWQgaW50IHNjYW5fcGVyaW9kOwotCXVuc2lnbmVkIGludCBjb252ZXJ0X3BlcmlvZDsKIAogCS8qCi0JICogaWYgYm90aCBjb252ZXJ0IGFuZCBzY2FuIHRyaWdnZXJzIGFyZSBUUklHX1RJTUVSLCB0aGVuIHRoZXkKLQkgKiBib3RoIHJlbHkgb24gY291bnRlciBiMAorCSAqIElmIGJvdGggY29udmVydCBhbmQgc2NhbiB0cmlnZ2VycyBhcmUgVFJJR19USU1FUiwgdGhlbiB0aGV5CisJICogYm90aCByZWx5IG9uIGNvdW50ZXIgYjAuIElmIG9ubHkgb25lIFRSSUdfVElNRVIgaXMgdXNlZCwgd2UKKwkgKiBjYW4gdXNlIHRoZSBnZW5lcmljIGNhc2NhZGVkIHRpbWluZyBmdW5jdGlvbnMuCiAJICovCi0JY29udmVydF9wZXJpb2QgPSBsYWJwY19haV9jb252ZXJ0X3BlcmlvZChjbWQsIG1vZGUpOwotCXNjYW5fcGVyaW9kID0gbGFicGNfYWlfc2Nhbl9wZXJpb2QoY21kLCBtb2RlKTsKIAlpZiAoY29udmVydF9wZXJpb2QgJiYgc2Nhbl9wZXJpb2QpIHsKIAkJLyoKLQkJICogcGljayB0aGUgbG93ZXN0IGIwIGRpdmlzb3IgdmFsdWUgd2UgY2FuIChmb3IgbWF4aW11bSBpbnB1dAorCQkgKiBwaWNrIHRoZSBsb3dlc3QgZGl2aXNvciB2YWx1ZSB3ZSBjYW4gKGZvciBtYXhpbXVtIGlucHV0CiAJCSAqIGNsb2NrIHNwZWVkIG9uIGNvbnZlcnQgYW5kIHNjYW4gY291bnRlcnMpCiAJCSAqLwotCQlkZXZwcml2LT5kaXZpc29yX2IwID0gKHNjYW5fcGVyaW9kIC0gMSkgLwotCQkgICAgKEk4MjU0X09TQ19CQVNFXzJNSFogKiAweDEwMDAwKSArIDE7CisJCXBhY2VyLT5uZXh0X2RpdjEgPSAoc2Nhbl9wZXJpb2QgLSAxKSAvCisJCQkJICAgKHBhY2VyLT5vc2NfYmFzZSAqIEk4MjU0X01BWF9DT1VOVCkgKyAxOwogCi0JCWNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmRldnByaXYtPmRpdmlzb3JfYjAsIDIpOwotCQljZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZkZXZwcml2LT5kaXZpc29yX2IwLCAweDEwMDAwKTsKKwkJY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmcGFjZXItPm5leHRfZGl2MSwgMik7CisJCWNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJnBhY2VyLT5uZXh0X2RpdjEsCisJCQkJCSAgICAgSTgyNTRfTUFYX0NPVU5UKTsKIAotCQliYXNlX3BlcmlvZCA9IEk4MjU0X09TQ19CQVNFXzJNSFogKiBkZXZwcml2LT5kaXZpc29yX2IwOworCQliYXNlX3BlcmlvZCA9IHBhY2VyLT5vc2NfYmFzZSAqIHBhY2VyLT5uZXh0X2RpdjE7CiAKIAkJLyogIHNldCBhMCBmb3IgY29udmVyc2lvbiBmcmVxdWVuY3kgYW5kIGIxIGZvciBzY2FuIGZyZXF1ZW5jeSAqLwogCQlzd2l0Y2ggKGNtZC0+ZmxhZ3MgJiBDTURGX1JPVU5EX01BU0spIHsKIAkJZGVmYXVsdDoKIAkJY2FzZSBDTURGX1JPVU5EX05FQVJFU1Q6Ci0JCQlkZXZwcml2LT5kaXZpc29yX2EwID0gRElWX1JPVU5EX0NMT1NFU1QoY29udmVydF9wZXJpb2QsCi0JCQkJCQkJCWJhc2VfcGVyaW9kKTsKLQkJCWRldnByaXYtPmRpdmlzb3JfYjEgPSBESVZfUk9VTkRfQ0xPU0VTVChzY2FuX3BlcmlvZCwKLQkJCQkJCQkJYmFzZV9wZXJpb2QpOworCQkJcGFjZXItPm5leHRfZGl2ID0gRElWX1JPVU5EX0NMT1NFU1QoY29udmVydF9wZXJpb2QsCisJCQkJCQkJICAgIGJhc2VfcGVyaW9kKTsKKwkJCXBhY2VyLT5uZXh0X2RpdjIgPSBESVZfUk9VTkRfQ0xPU0VTVChzY2FuX3BlcmlvZCwKKwkJCQkJCQkgICAgIGJhc2VfcGVyaW9kKTsKIAkJCWJyZWFrOwogCQljYXNlIENNREZfUk9VTkRfVVA6Ci0JCQlkZXZwcml2LT5kaXZpc29yX2EwID0gRElWX1JPVU5EX1VQKGNvbnZlcnRfcGVyaW9kLAotCQkJCQkJCSAgIGJhc2VfcGVyaW9kKTsKLQkJCWRldnByaXYtPmRpdmlzb3JfYjEgPSBESVZfUk9VTkRfVVAoc2Nhbl9wZXJpb2QsCi0JCQkJCQkJICAgYmFzZV9wZXJpb2QpOworCQkJcGFjZXItPm5leHRfZGl2ID0gRElWX1JPVU5EX1VQKGNvbnZlcnRfcGVyaW9kLAorCQkJCQkJICAgICAgIGJhc2VfcGVyaW9kKTsKKwkJCXBhY2VyLT5uZXh0X2RpdjIgPSBESVZfUk9VTkRfVVAoc2Nhbl9wZXJpb2QsCisJCQkJCQkJYmFzZV9wZXJpb2QpOwogCQkJYnJlYWs7CiAJCWNhc2UgQ01ERl9ST1VORF9ET1dOOgotCQkJZGV2cHJpdi0+ZGl2aXNvcl9hMCA9IGNvbnZlcnRfcGVyaW9kIC8gYmFzZV9wZXJpb2Q7Ci0JCQlkZXZwcml2LT5kaXZpc29yX2IxID0gc2Nhbl9wZXJpb2QgLyBiYXNlX3BlcmlvZDsKKwkJCXBhY2VyLT5uZXh0X2RpdiA9IGNvbnZlcnRfcGVyaW9kIC8gYmFzZV9wZXJpb2Q7CisJCQlwYWNlci0+bmV4dF9kaXYyID0gc2Nhbl9wZXJpb2QgLyBiYXNlX3BlcmlvZDsKIAkJCWJyZWFrOwogCQl9CiAJCS8qICBtYWtlIHN1cmUgYTAgYW5kIGIxIHZhbHVlcyBhcmUgYWNjZXB0YWJsZSAqLwotCQljZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZkZXZwcml2LT5kaXZpc29yX2EwLCAyKTsKLQkJY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmZGV2cHJpdi0+ZGl2aXNvcl9hMCwgMHgxMDAwMCk7Ci0JCWNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmRldnByaXYtPmRpdmlzb3JfYjEsIDIpOwotCQljZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZkZXZwcml2LT5kaXZpc29yX2IxLCAweDEwMDAwKTsKKwkJY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmcGFjZXItPm5leHRfZGl2LCAyKTsKKwkJY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmcGFjZXItPm5leHRfZGl2LCBJODI1NF9NQVhfQ09VTlQpOworCQljb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZwYWNlci0+bmV4dF9kaXYyLCAyKTsKKwkJY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmcGFjZXItPm5leHRfZGl2MiwKKwkJCQkJICAgICBJODI1NF9NQVhfQ09VTlQpOworCiAJCS8qICB3cml0ZSBjb3JyZWN0ZWQgdGltaW5ncyB0byBjb21tYW5kICovCiAJCWxhYnBjX3NldF9haV9jb252ZXJ0X3BlcmlvZChjbWQsIG1vZGUsCi0JCQkJCSAgICBiYXNlX3BlcmlvZCAqIGRldnByaXYtPmRpdmlzb3JfYTApOworCQkJCQkgICAgYmFzZV9wZXJpb2QgKiBwYWNlci0+bmV4dF9kaXYpOwogCQlsYWJwY19zZXRfYWlfc2Nhbl9wZXJpb2QoY21kLCBtb2RlLAotCQkJCQkgYmFzZV9wZXJpb2QgKiBkZXZwcml2LT5kaXZpc29yX2IxKTsKLQkJLyoKLQkJICogaWYgb25seSBvbmUgVFJJR19USU1FUiBpcyB1c2VkLCB3ZSBjYW4gZW1wbG95IHRoZSBnZW5lcmljCi0JCSAqIGNhc2NhZGVkIHRpbWluZyBmdW5jdGlvbnMKLQkJICovCisJCQkJCSBiYXNlX3BlcmlvZCAqIHBhY2VyLT5uZXh0X2RpdjIpOwogCX0gZWxzZSBpZiAoc2Nhbl9wZXJpb2QpIHsKIAkJLyoKIAkJICogY2FsY3VsYXRlIGNhc2NhZGVkIGNvdW50ZXIgdmFsdWVzCiAJCSAqIHRoYXQgZ2l2ZSBkZXNpcmVkIHNjYW4gdGltaW5nCisJCSAqIChwYWNlci0+bmV4dF9kaXYyIC8gcGFjZXItPm5leHRfZGl2MSkKIAkJICovCi0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfMk1IWiwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcl9iMSwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcl9iMCwKLQkJCQkJICAmc2Nhbl9wZXJpb2QsIGNtZC0+ZmxhZ3MpOworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKHBhY2VyLCAmc2Nhbl9wZXJpb2QsCisJCQkJCQljbWQtPmZsYWdzKTsKIAkJbGFicGNfc2V0X2FpX3NjYW5fcGVyaW9kKGNtZCwgbW9kZSwgc2Nhbl9wZXJpb2QpOwogCX0gZWxzZSBpZiAoY29udmVydF9wZXJpb2QpIHsKIAkJLyoKIAkJICogY2FsY3VsYXRlIGNhc2NhZGVkIGNvdW50ZXIgdmFsdWVzCiAJCSAqIHRoYXQgZ2l2ZSBkZXNpcmVkIGNvbnZlcnNpb24gdGltaW5nCisJCSAqIChwYWNlci0+bmV4dF9kaXYgLyBwYWNlci0+bmV4dF9kaXYxKQogCQkgKi8KLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8yTUhaLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yX2EwLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yX2IwLAotCQkJCQkgICZjb252ZXJ0X3BlcmlvZCwgY21kLT5mbGFncyk7CisJCWNvbWVkaV84MjU0X2Nhc2NhZGVfbnNfdG9fdGltZXIocGFjZXIsICZjb252ZXJ0X3BlcmlvZCwKKwkJCQkJCWNtZC0+ZmxhZ3MpOworCQkvKiB0cmFuc2ZlciBkaXYyIHZhbHVlIHNvIGNvcnJlY3QgdGltZXIgZ2V0cyB1cGRhdGVkICovCisJCXBhY2VyLT5uZXh0X2RpdiA9IHBhY2VyLT5uZXh0X2RpdjI7CiAJCWxhYnBjX3NldF9haV9jb252ZXJ0X3BlcmlvZChjbWQsIG1vZGUsIGNvbnZlcnRfcGVyaW9kKTsKIAl9CiB9CkBAIC00NTcsNyArNDI5LDcgQEAKIAkJcmV0dXJuIE1PREVfU0lOR0xFX0NIQU47CiAKIAkvKiBjaGFubGlzdCBtYXkgYmUgTlVMTCBkdXJpbmcgY21kdGVzdCAqLwotCWlmIChjbWQtPmNoYW5saXN0ID09IE5VTEwpCisJaWYgKCFjbWQtPmNoYW5saXN0KQogCQlyZXR1cm4gTU9ERV9NVUxUX0NIQU5fVVA7CiAKIAljaGFuMCA9IENSX0NIQU4oY21kLT5jaGFubGlzdFswXSk7CkBAIC00ODIsOSArNDU0LDYgQEAKIAl1bnNpZ25lZCBpbnQgYXJlZjAgPSBDUl9BUkVGKGNtZC0+Y2hhbmxpc3RbMF0pOwogCWludCBpOwogCi0JaWYgKG1vZGUgPT0gTU9ERV9TSU5HTEVfQ0hBTikKLQkJcmV0dXJuIDA7Ci0KIAlmb3IgKGkgPSAwOyBpIDwgY21kLT5jaGFubGlzdF9sZW47IGkrKykgewogCQl1bnNpZ25lZCBpbnQgY2hhbiA9IENSX0NIQU4oY21kLT5jaGFubGlzdFtpXSk7CiAJCXVuc2lnbmVkIGludCByYW5nZSA9IENSX1JBTkdFKGNtZC0+Y2hhbmxpc3RbaV0pOwpAQCAtNTQzLDI2ICs1MTIsMjcgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAogCQkJCQlUUklHX1RJTUVSIHwgVFJJR19GT0xMT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CiAKIAlzdG9wX21hc2sgPSBUUklHX0NPVU5UIHwgVFJJR19OT05FOwogCWlmIChib2FyZC0+aXNfbGFicGMxMjAwKQogCQlzdG9wX21hc2sgfD0gVFJJR19FWFQ7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgc3RvcF9tYXNrKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBzdG9wX21hc2spOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC01NzcsNyArNTQ3LDcgQEAKIAogCXN3aXRjaCAoY21kLT5zdGFydF9zcmMpIHsKIAljYXNlIFRSSUdfTk9XOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklHX0VYVDoKIAkJLyogc3RhcnRfYXJnIHZhbHVlIGlzIGlnbm9yZWQgKi8KQEAgLTU4NiwyNyArNTU2LDMzIEBACiAKIAlpZiAoIWNtZC0+Y2hhbmxpc3RfbGVuKQogCQllcnIgfD0gLUVJTlZBTDsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSBib2FyZC0+YWlfc3BlZWQpOworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkgICAgYm9hcmQtPmFpX3NwZWVkKTsKKwl9CiAKIAkvKiBtYWtlIHN1cmUgc2NhbiB0aW1pbmcgaXMgbm90IHRvbyBmYXN0ICovCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewotCQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCWNtZC0+Y29udmVydF9hcmcgKiBjbWQtPmNoYW5saXN0X2xlbik7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCWJvYXJkLT5haV9zcGVlZCAqIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwkJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+CisJCQkJCQkJICAgIHNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSAgICBjbWQtPmNvbnZlcnRfYXJnICoKKwkJCQkJCQkgICAgY21kLT5jaGFubGlzdF9sZW4pOworCQl9CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIGJvYXJkLT5haV9zcGVlZCAqCisJCQkJCQkgICAgY21kLT5jaGFubGlzdF9sZW4pOwogCX0KIAogCXN3aXRjaCAoY21kLT5zdG9wX3NyYykgewogCWNhc2UgVFJJR19DT1VOVDoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJCWJyZWFrOwogCWNhc2UgVFJJR19OT05FOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAJCWJyZWFrOwogCQkvKgogCQkgKiBUUklHX0VYVCBkb2Vzbid0IGNhcmUgc2luY2UgaXQgZG9lc24ndApAQCAtNjcwLDExICs2NDYsMTIgQEAKIAkJICogbG9hZCBjb3VudGVyIGExIHdpdGggY291bnQgb2YgMwogCQkgKiAocGMrIG1hbnVhbCBzYXlzIHRoaXMgaXMgbWluaW11bSBhbGxvd2VkKSB1c2luZyBtb2RlIDAKIAkJICovCi0JCWxhYnBjX2NvdW50ZXJfbG9hZChkZXYsIENPVU5URVJfQV9CQVNFX1JFRywKLQkJCQkgICAxLCAzLCBJODI1NF9NT0RFMCk7CisJCWNvbWVkaV84MjU0X2xvYWQoZGV2cHJpdi0+Y291bnRlciwgMSwKKwkJCQkgMywgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwogCX0gZWxzZQl7CiAJCS8qIGp1c3QgcHV0IGNvdW50ZXIgYTEgaW4gbW9kZSAwIHRvIHNldCBpdHMgb3V0cHV0IGxvdyAqLwotCQlsYWJwY19jb3VudGVyX3NldF9tb2RlKGRldiwgQ09VTlRFUl9BX0JBU0VfUkVHLCAxLCBJODI1NF9NT0RFMCk7CisJCWNvbWVkaV84MjU0X3NldF9tb2RlKGRldnByaXYtPmNvdW50ZXIsIDEsCisJCQkJICAgICBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CiAJfQogCiAJLyogZmlndXJlIG91dCB3aGF0IG1ldGhvZCB3ZSB3aWxsIHVzZSB0byB0cmFuc2ZlciBkYXRhICovCkBAIC03MTUsMjcgKzY5MiwyNCBAQAogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUiB8fAogCSAgICBjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJLyogIHNldCB1cCBwYWNpbmcgKi8KLQkJbGFicGNfYWRjX3RpbWluZyhkZXYsIGNtZCwgbW9kZSk7Ci0JCS8qICBsb2FkIGNvdW50ZXIgYjAgaW4gbW9kZSAzICovCi0JCWxhYnBjX2NvdW50ZXJfbG9hZChkZXYsIENPVU5URVJfQl9CQVNFX1JFRywKLQkJCQkgICAwLCBkZXZwcml2LT5kaXZpc29yX2IwLCBJODI1NF9NT0RFMyk7Ci0JfQotCS8qICBzZXQgdXAgY29udmVyc2lvbiBwYWNpbmcgKi8KLQlpZiAobGFicGNfYWlfY29udmVydF9wZXJpb2QoY21kLCBtb2RlKSkgewotCQkvKiAgbG9hZCBjb3VudGVyIGEwIGluIG1vZGUgMiAqLwotCQlsYWJwY19jb3VudGVyX2xvYWQoZGV2LCBDT1VOVEVSX0FfQkFTRV9SRUcsCi0JCQkJICAgMCwgZGV2cHJpdi0+ZGl2aXNvcl9hMCwgSTgyNTRfTU9ERTIpOwotCX0gZWxzZSB7Ci0JCS8qIGluaXRpYWxpemUgcGFjZXIgY291bnRlciB0byBwcmV2ZW50IGFueSBwcm9ibGVtcyAqLwotCQlsYWJwY19jb3VudGVyX3NldF9tb2RlKGRldiwgQ09VTlRFUl9BX0JBU0VfUkVHLCAwLCBJODI1NF9NT0RFMik7Ci0JfQorCQlzdHJ1Y3QgY29tZWRpXzgyNTQgKnBhY2VyID0gZGV2LT5wYWNlcjsKKwkJc3RydWN0IGNvbWVkaV84MjU0ICpjb3VudGVyID0gZGV2cHJpdi0+Y291bnRlcjsKIAotCS8qICBzZXQgdXAgc2NhbiBwYWNpbmcgKi8KLQlpZiAobGFicGNfYWlfc2Nhbl9wZXJpb2QoY21kLCBtb2RlKSkgewotCQkvKiAgbG9hZCBjb3VudGVyIGIxIGluIG1vZGUgMiAqLwotCQlsYWJwY19jb3VudGVyX2xvYWQoZGV2LCBDT1VOVEVSX0JfQkFTRV9SRUcsCi0JCQkJICAgMSwgZGV2cHJpdi0+ZGl2aXNvcl9iMSwgSTgyNTRfTU9ERTIpOworCQljb21lZGlfODI1NF91cGRhdGVfZGl2aXNvcnMocGFjZXIpOworCisJCS8qIHNldCB1cCBwYWNpbmcgKi8KKwkJY29tZWRpXzgyNTRfbG9hZChwYWNlciwgMCwgcGFjZXItPmRpdmlzb3IxLAorCQkJCSBJODI1NF9NT0RFMyB8IEk4MjU0X0JJTkFSWSk7CisKKwkJLyogc2V0IHVwIGNvbnZlcnNpb24gcGFjaW5nICovCisJCWNvbWVkaV84MjU0X3NldF9tb2RlKGNvdW50ZXIsIDAsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKKwkJaWYgKGxhYnBjX2FpX2NvbnZlcnRfcGVyaW9kKGNtZCwgbW9kZSkpCisJCQljb21lZGlfODI1NF93cml0ZShjb3VudGVyLCAwLCBwYWNlci0+ZGl2aXNvcik7CisKKwkJLyogc2V0IHVwIHNjYW4gcGFjaW5nICovCisJCWlmIChsYWJwY19haV9zY2FuX3BlcmlvZChjbWQsIG1vZGUpKQorCQkJY29tZWRpXzgyNTRfbG9hZChwYWNlciwgMSwgcGFjZXItPmRpdmlzb3IyLAorCQkJCQkgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwogCX0KIAogCWxhYnBjX2NsZWFyX2FkY19maWZvKGRldik7CkBAIC0xMjQwLDYgKzEyMTQsMjYgQEAKIAkJCWRldi0+aXJxID0gaXJxOwogCX0KIAorCWlmIChkZXYtPm1taW8pIHsKKwkJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X21tX2luaXQoZGV2LT5tbWlvICsgQ09VTlRFUl9CX0JBU0VfUkVHLAorCQkJCQkJIEk4MjU0X09TQ19CQVNFXzJNSFosCisJCQkJCQkgSTgyNTRfSU84LCAwKTsKKwkJZGV2cHJpdi0+Y291bnRlciA9IGNvbWVkaV84MjU0X21tX2luaXQoZGV2LT5tbWlvICsKKwkJCQkJCSAgICAgICBDT1VOVEVSX0FfQkFTRV9SRUcsCisJCQkJCQkgICAgICAgSTgyNTRfT1NDX0JBU0VfMk1IWiwKKwkJCQkJCSAgICAgICBJODI1NF9JTzgsIDApOworCX0gZWxzZSB7CisJCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgQ09VTlRFUl9CX0JBU0VfUkVHLAorCQkJCQkgICAgICBJODI1NF9PU0NfQkFTRV8yTUhaLAorCQkJCQkgICAgICBJODI1NF9JTzgsIDApOworCQlkZXZwcml2LT5jb3VudGVyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArCisJCQkJCQkgICAgQ09VTlRFUl9BX0JBU0VfUkVHLAorCQkJCQkJICAgIEk4MjU0X09TQ19CQVNFXzJNSFosCisJCQkJCQkgICAgSTgyNTRfSU84LCAwKTsKKwl9CisJaWYgKCFkZXYtPnBhY2VyIHx8ICFkZXZwcml2LT5jb3VudGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTEzMzYsNiArMTMzMCwxNSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobGFicGNfY29tbW9uX2F0dGFjaCk7CiAKK3ZvaWQgbGFicGNfY29tbW9uX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBsYWJwY19wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOworCisJaWYgKGRldnByaXYpCisJCWtmcmVlKGRldnByaXYtPmNvdW50ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobGFicGNfY29tbW9uX2RldGFjaCk7CisKIHN0YXRpYyBpbnQgX19pbml0IGxhYnBjX2NvbW1vbl9pbml0KHZvaWQpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19jcy5jCmluZGV4IDc0NmM0Y2Q5Li5hMWM2OWFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfY3MuYwpAQCAtNjgsOCArNjgsOCBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IGxhYnBjX2F1dG9fYXR0YWNoKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKK3N0YXRpYyBpbnQgbGFicGNfY3NfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKKwkJCQl1bnNpZ25lZCBsb25nIGNvbnRleHQpCiB7CiAJc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmsgPSBjb21lZGlfdG9fcGNtY2lhX2RldihkZXYpOwogCWludCByZXQ7CkBAIC05MCwxMSArOTAsMTcgQEAKIAlyZXR1cm4gbGFicGNfY29tbW9uX2F0dGFjaChkZXYsIGxpbmstPmlycSwgSVJRRl9TSEFSRUQpOwogfQogCitzdGF0aWMgdm9pZCBsYWJwY19jc19kZXRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKK3sKKwlsYWJwY19jb21tb25fZGV0YWNoKGRldik7CisJY29tZWRpX3BjbWNpYV9kaXNhYmxlKGRldik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgY29tZWRpX2RyaXZlciBkcml2ZXJfbGFicGNfY3MgPSB7CiAJLmRyaXZlcl9uYW1lCT0gIm5pX2xhYnBjX2NzIiwKIAkubW9kdWxlCQk9IFRISVNfTU9EVUxFLAotCS5hdXRvX2F0dGFjaAk9IGxhYnBjX2F1dG9fYXR0YWNoLAotCS5kZXRhY2gJCT0gY29tZWRpX3BjbWNpYV9kaXNhYmxlLAorCS5hdXRvX2F0dGFjaAk9IGxhYnBjX2NzX2F1dG9fYXR0YWNoLAorCS5kZXRhY2gJCT0gbGFicGNfY3NfZGV0YWNoLAogfTsKIAogc3RhdGljIGludCBsYWJwY19jc19hdHRhY2goc3RydWN0IHBjbWNpYV9kZXZpY2UgKmxpbmspCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfaXNhZG1hLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfaXNhZG1hLmMKaW5kZXggNmI0Y2NkOC4uMjlkYmRmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX2lzYWRtYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19pc2FkbWEuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCiAjaW5jbHVkZSAiY29tZWRpX2lzYWRtYS5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogI2luY2x1ZGUgIm5pX2xhYnBjLmgiCiAjaW5jbHVkZSAibmlfbGFicGNfcmVncy5oIgogI2luY2x1ZGUgIm5pX2xhYnBjX2lzYWRtYS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX2xhYnBjX3BjaS5jCmluZGV4IDA0MDdmZjYuLjc3ZDQwMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9sYWJwY19wY2kuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbGFicGNfcGNpLmMKQEAgLTMxLDkgKzMxLDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCi0jaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCisjaW5jbHVkZSAiLi4vY29tZWRpX3BjaS5oIgogCiAjaW5jbHVkZSAibmlfbGFicGMuaCIKIApAQCAtNTEsNyArNTAsNyBAQAogCX0sCiB9OwogCi0vKiByaXBwZWQgZnJvbSBtaXRlLmggYW5kIG1pdGVfc2V0dXAyKCkgdG8gYXZvaWQgbWl0ZSBkZXBlbmRhbmN5ICovCisvKiByaXBwZWQgZnJvbSBtaXRlLmggYW5kIG1pdGVfc2V0dXAyKCkgdG8gYXZvaWQgbWl0ZSBkZXBlbmRlbmN5ICovCiAjZGVmaW5lIE1JVEVfSU9EV0JTUgkweGMwCSAvKiBJTyBEZXZpY2UgV2luZG93IEJhc2UgU2l6ZSBSZWdpc3RlciAqLwogI2RlZmluZSBXRU5BQgkJKDEgPDwgNykgLyogd2luZG93IGVuYWJsZSAqLwogCkBAIC0xMDMsMTEgKzEwMiwxNyBAQAogCXJldHVybiBsYWJwY19jb21tb25fYXR0YWNoKGRldiwgcGNpZGV2LT5pcnEsIElSUUZfU0hBUkVEKTsKIH0KIAorc3RhdGljIHZvaWQgbGFicGNfcGNpX2RldGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQoreworCWxhYnBjX2NvbW1vbl9kZXRhY2goZGV2KTsKKwljb21lZGlfcGNpX2RldGFjaChkZXYpOworfQorCiBzdGF0aWMgc3RydWN0IGNvbWVkaV9kcml2ZXIgbGFicGNfcGNpX2NvbWVkaV9kcml2ZXIgPSB7CiAJLmRyaXZlcl9uYW1lCT0gImxhYnBjX3BjaSIsCiAJLm1vZHVsZQkJPSBUSElTX01PRFVMRSwKIAkuYXV0b19hdHRhY2gJPSBsYWJwY19wY2lfYXV0b19hdHRhY2gsCi0JLmRldGFjaAkJPSBjb21lZGlfcGNpX2RldGFjaCwKKwkuZGV0YWNoCQk9IGxhYnBjX3BjaV9kZXRhY2gsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgbGFicGNfcGNpX3RhYmxlW10gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYwppbmRleCBiNmRkYzAxLi5jNjZhZmZkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX21pb19jb21tb24uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfbWlvX2NvbW1vbi5jCkBAIC01Nyw3ICs1Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlICI4MjU1LmgiCiAjaW5jbHVkZSAibWl0ZS5oIgotI2luY2x1ZGUgImNvbWVkaV9mYy5oIgogCiAvKiBBIHRpbWVvdXQgY291bnQgKi8KICNkZWZpbmUgTklfVElNRU9VVCAxMDAwCkBAIC02NzAsOCArNjY5LDggQEAKIAkJbmlfd3JpdGViKGRldiwgZGV2cHJpdi0+ZzBfZzFfc2VsZWN0X3JlZywgRzBfRzFfU2VsZWN0KTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCSIlcyBjYWxsZWQgd2l0aCBpbnZhbGlkIHJlZ2lzdGVyICVkXG4iLCBfX2Z1bmNfXywgcmVnKTsKKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgImNhbGxlZCB3aXRoIGludmFsaWQgcmVnaXN0ZXIgJWRcbiIsCisJCQlyZWcpOwogCQlicmVhazsKIAl9CiAJbW1pb3diKCk7CkBAIC03NTUsNyArNzU0LDcgQEAKIAlCVUdfT04oZGV2cHJpdi0+YWlfbWl0ZV9jaGFuKTsKIAlkZXZwcml2LT5haV9taXRlX2NoYW4gPQogCSAgICBtaXRlX3JlcXVlc3RfY2hhbm5lbChkZXZwcml2LT5taXRlLCBkZXZwcml2LT5haV9taXRlX3JpbmcpOwotCWlmIChkZXZwcml2LT5haV9taXRlX2NoYW4gPT0gTlVMTCkgeworCWlmICghZGV2cHJpdi0+YWlfbWl0ZV9jaGFuKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldnByaXYtPm1pdGVfY2hhbm5lbF9sb2NrLCBmbGFncyk7CiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCiAJCQkiZmFpbGVkIHRvIHJlc2VydmUgbWl0ZSBkbWEgY2hhbm5lbCBmb3IgYW5hbG9nIGlucHV0XG4iKTsKQEAgLTc3Niw3ICs3NzUsNyBAQAogCUJVR19PTihkZXZwcml2LT5hb19taXRlX2NoYW4pOwogCWRldnByaXYtPmFvX21pdGVfY2hhbiA9CiAJICAgIG1pdGVfcmVxdWVzdF9jaGFubmVsKGRldnByaXYtPm1pdGUsIGRldnByaXYtPmFvX21pdGVfcmluZyk7Ci0JaWYgKGRldnByaXYtPmFvX21pdGVfY2hhbiA9PSBOVUxMKSB7CisJaWYgKCFkZXZwcml2LT5hb19taXRlX2NoYW4pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2cHJpdi0+bWl0ZV9jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKIAkJCSJmYWlsZWQgdG8gcmVzZXJ2ZSBtaXRlIGRtYSBjaGFubmVsIGZvciBhbmFsb2cgb3V0dXRcbiIpOwpAQCAtODAyLDcgKzgwMSw3IEBACiAJbWl0ZV9jaGFuID0KIAkgICAgbWl0ZV9yZXF1ZXN0X2NoYW5uZWwoZGV2cHJpdi0+bWl0ZSwKIAkJCQkgZGV2cHJpdi0+Z3BjdF9taXRlX3JpbmdbZ3BjdF9pbmRleF0pOwotCWlmIChtaXRlX2NoYW4gPT0gTlVMTCkgeworCWlmICghbWl0ZV9jaGFuKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldnByaXYtPm1pdGVfY2hhbm5lbF9sb2NrLCBmbGFncyk7CiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCiAJCQkiZmFpbGVkIHRvIHJlc2VydmUgbWl0ZSBkbWEgY2hhbm5lbCBmb3IgY291bnRlclxuIik7CkBAIC04MjgsNyArODI3LDcgQEAKIAlCVUdfT04oZGV2cHJpdi0+Y2RvX21pdGVfY2hhbik7CiAJZGV2cHJpdi0+Y2RvX21pdGVfY2hhbiA9CiAJICAgIG1pdGVfcmVxdWVzdF9jaGFubmVsKGRldnByaXYtPm1pdGUsIGRldnByaXYtPmNkb19taXRlX3JpbmcpOwotCWlmIChkZXZwcml2LT5jZG9fbWl0ZV9jaGFuID09IE5VTEwpIHsKKwlpZiAoIWRldnByaXYtPmNkb19taXRlX2NoYW4pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2cHJpdi0+bWl0ZV9jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKIAkJCSJmYWlsZWQgdG8gcmVzZXJ2ZSBtaXRlIGRtYSBjaGFubmVsIGZvciBjb3JyZWxhdGVkIGRpZ2l0YWwgb3V0cHV0XG4iKTsKQEAgLTEwNjgsNyArMTA2Nyw3IEBACiAJCQl1ZGVsYXkoNSk7CiAJCX0KIAkJaWYgKGkgPT0gdGltZW91dCkgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzIHRpbWVkIG91dFxuIiwgX19mdW5jX18pOworCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInRpbWVkIG91dFxuIik7CiAJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAogCQkJCSJtaXRlX2J5dGVzX2luX3RyYW5zaXQ9JWksIEFJX1N0YXR1czFfUmVnaXN0ZXI9MHgleFxuIiwKIAkJCQltaXRlX2J5dGVzX2luX3RyYW5zaXQoZGV2cHJpdi0+YWlfbWl0ZV9jaGFuKSwKQEAgLTEzNjAsNyArMTM1OSw3IEBACiAJLyogQ2hlY2sgaWYgdGhlcmUncyBhIHNpbmdsZSBzYW1wbGUgc3R1Y2sgaW4gdGhlIEZJRk8gKi8KIAlpZiAobmlfcmVhZGIoZGV2LCBYWFhfU3RhdHVzKSAmIDB4ODApIHsKIAkJZGwgPSBuaV9yZWFkbChkZXYsIEFEQ19GSUZPX0RhdGFfNjExeCk7Ci0JCWRhdGEgPSAoZGwgJiAweGZmZmYpOworCQlkYXRhID0gZGwgJiAweGZmZmY7CiAJCWNvbWVkaV9idWZfd3JpdGVfc2FtcGxlcyhzLCAmZGF0YSwgMSk7CiAJfQogfQpAQCAtMTY1Nyw3ICsxNjU2LDcgQEAKIAljb21lZGlfYnVmX3dyaXRlX2FsbG9jKHMsIHMtPmFzeW5jLT5wcmVhbGxvY19idWZzeik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2cHJpdi0+bWl0ZV9jaGFubmVsX2xvY2ssIGZsYWdzKTsKLQlpZiAoZGV2cHJpdi0+YWlfbWl0ZV9jaGFuID09IE5VTEwpIHsKKwlpZiAoIWRldnByaXYtPmFpX21pdGVfY2hhbikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZwcml2LT5taXRlX2NoYW5uZWxfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVJTzsKIAl9CkBAIC0xNzAwLDggKzE2OTksOSBAQAogCQkJbWl0ZV9wcmVwX2RtYShkZXZwcml2LT5hb19taXRlX2NoYW4sIDE2LCAzMik7CiAJCX0KIAkJbWl0ZV9kbWFfYXJtKGRldnByaXYtPmFvX21pdGVfY2hhbik7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJcmV0dmFsID0gLUVJTzsKKwl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2cHJpdi0+bWl0ZV9jaGFubmVsX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXR2YWw7CkBAIC0xODcwLDcgKzE4NzAsNyBAQAogCQljaGFuID0gQ1JfQ0hBTihsaXN0WzBdKTsKIAkJcmFuZ2UgPSBDUl9SQU5HRShsaXN0WzBdKTsKIAkJcmFuZ2VfY29kZSA9IG5pX2dhaW5sa3VwW2JvYXJkLT5nYWlubGt1cF1bcmFuZ2VdOwotCQlkaXRoZXIgPSAoKGxpc3RbMF0gJiBDUl9BTFRfRklMVEVSKSAhPSAwKTsKKwkJZGl0aGVyID0gKGxpc3RbMF0gJiBDUl9BTFRfRklMVEVSKSAhPSAwOwogCQlieXBhc3NfYml0cyA9IE1TZXJpZXNfQUlfQnlwYXNzX0NvbmZpZ19GSUZPX0JpdDsKIAkJYnlwYXNzX2JpdHMgfD0gY2hhbjsKIAkJYnlwYXNzX2JpdHMgfD0KQEAgLTE4OTQsNyArMTg5NCw3IEBACiAJCWNoYW4gPSBDUl9DSEFOKGxpc3RbaV0pOwogCQlhcmVmID0gQ1JfQVJFRihsaXN0W2ldKTsKIAkJcmFuZ2UgPSBDUl9SQU5HRShsaXN0W2ldKTsKLQkJZGl0aGVyID0gKChsaXN0W2ldICYgQ1JfQUxUX0ZJTFRFUikgIT0gMCk7CisJCWRpdGhlciA9IChsaXN0W2ldICYgQ1JfQUxUX0ZJTFRFUikgIT0gMDsKIAogCQlyYW5nZV9jb2RlID0gbmlfZ2FpbmxrdXBbYm9hcmQtPmdhaW5sa3VwXVtyYW5nZV07CiAJCWRldnByaXYtPmFpX29mZnNldFtpXSA9IDA7CkBAIC0yMDIwLDcgKzIwMjAsNyBAQAogCQkJY2hhbiA9IENSX0NIQU4obGlzdFtpXSk7CiAJCWFyZWYgPSBDUl9BUkVGKGxpc3RbaV0pOwogCQlyYW5nZSA9IENSX1JBTkdFKGxpc3RbaV0pOwotCQlkaXRoZXIgPSAoKGxpc3RbaV0gJiBDUl9BTFRfRklMVEVSKSAhPSAwKTsKKwkJZGl0aGVyID0gKGxpc3RbaV0gJiBDUl9BTFRfRklMVEVSKSAhPSAwOwogCiAJCS8qIGZpeCB0aGUgZXh0ZXJuYWwvaW50ZXJuYWwgcmFuZ2UgZGlmZmVyZW5jZXMgKi8KIAkJcmFuZ2UgPSBuaV9nYWlubGt1cFtib2FyZC0+Z2FpbmxrdXBdW3JhbmdlXTsKQEAgLTIxMTYsOCArMjExNiw3IEBACiAJCQkJfQogCQkJfQogCQkJaWYgKGkgPT0gTklfVElNRU9VVCkgewotCQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICIlcyB0aW1lb3V0XG4iLAotCQkJCQlfX2Z1bmNfXyk7CisJCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInRpbWVvdXRcbiIpOwogCQkJCXJldHVybiAtRVRJTUU7CiAJCQl9CiAJCQlkICs9IHNpZ25iaXRzOwpAQCAtMjE0MCw4ICsyMTM5LDcgQEAKIAkJCQl9CiAJCQl9CiAJCQlpZiAoaSA9PSBOSV9USU1FT1VUKSB7Ci0JCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzIHRpbWVvdXRcbiIsCi0JCQkJCV9fZnVuY19fKTsKKwkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAidGltZW91dFxuIik7CiAJCQkJcmV0dXJuIC1FVElNRTsKIAkJCX0KIAkJCWRhdGFbbl0gPSAoKChkbCA+PiAxNikgJiAweEZGRkYpICsgc2lnbmJpdHMpICYgMHhGRkZGOwpAQCAtMjE1Niw4ICsyMTU0LDcgQEAKIAkJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoaSA9PSBOSV9USU1FT1VUKSB7Ci0JCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzIHRpbWVvdXRcbiIsCi0JCQkJCV9fZnVuY19fKTsKKwkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAidGltZW91dFxuIik7CiAJCQkJcmV0dXJuIC1FVElNRTsKIAkJCX0KIAkJCWlmIChkZXZwcml2LT5pc19tX3NlcmllcykgewpAQCAtMjIyNywyOCArMjIyNCwyOCBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsCiAJCQkJCVRSSUdfTk9XIHwgVFJJR19JTlQgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAogCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQpOwogCiAJc291cmNlcyA9IFRSSUdfVElNRVIgfCBUUklHX0VYVDsKIAlpZiAoZGV2cHJpdi0+aXNfNjExeCB8fCBkZXZwcml2LT5pc182MTQzKQogCQlzb3VyY2VzIHw9IFRSSUdfTk9XOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIHNvdXJjZXMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIHNvdXJjZXMpOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtMjI2MCw3ICsyMjU3LDcgQEAKIAlzd2l0Y2ggKGNtZC0+c3RhcnRfc3JjKSB7CiAJY2FzZSBUUklHX05PVzoKIAljYXNlIFRSSUdfSU5UOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklHX0VYVDoKIAkJdG1wID0gQ1JfQ0hBTihjbWQtPnN0YXJ0X2FyZyk7CkBAIC0yMjY4LDE1ICsyMjY1LDE2IEBACiAJCWlmICh0bXAgPiAxNikKIAkJCXRtcCA9IDE2OwogCQl0bXAgfD0gKGNtZC0+c3RhcnRfYXJnICYgKENSX0lOVkVSVCB8IENSX0VER0UpKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIHRtcCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCB0bXApOwogCQlicmVhazsKIAl9CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKIAkJCW5pX21pbl9haV9zY2FuX3BlcmlvZF9ucyhkZXYsIGNtZC0+Y2hhbmxpc3RfbGVuKSk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIGRldnByaXYtPmNsb2NrX25zICogMHhmZmZmZmYpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICBkZXZwcml2LT5jbG9ja19ucyAqCisJCQkJCQkgICAgMHhmZmZmZmYpOwogCX0gZWxzZSBpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0VYVCkgewogCQkvKiBleHRlcm5hbCB0cmlnZ2VyICovCiAJCXVuc2lnbmVkIGludCB0bXAgPSBDUl9DSEFOKGNtZC0+c2Nhbl9iZWdpbl9hcmcpOwpAQCAtMjI4NCwxOSArMjI4MiwyMSBAQAogCQlpZiAodG1wID4gMTYpCiAJCQl0bXAgPSAxNjsKIAkJdG1wIHw9IChjbWQtPnNjYW5fYmVnaW5fYXJnICYgKENSX0lOVkVSVCB8IENSX0VER0UpKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgdG1wKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgdG1wKTsKIAl9IGVsc2UgewkJLyogVFJJR19PVEhFUiAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAJfQogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQlpZiAoZGV2cHJpdi0+aXNfNjExeCB8fCBkZXZwcml2LT5pc182MTQzKSB7Ci0JCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkJICAgMCk7CiAJCX0gZWxzZSB7Ci0JCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCQkgYm9hcmQtPmFpX3NwZWVkKTsKLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJZGV2cHJpdi0+Y2xvY2tfbnMgKiAweGZmZmYpOworCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkJICAgIGJvYXJkLT5haV9zcGVlZCk7CisJCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCQkgICAgZGV2cHJpdi0+Y2xvY2tfbnMgKgorCQkJCQkJCSAgICAweGZmZmYpOwogCQl9CiAJfSBlbHNlIGlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfRVhUKSB7CiAJCS8qIGV4dGVybmFsIHRyaWdnZXIgKi8KQEAgLTIzMDUsMjMgKzIzMDUsMjQgQEAKIAkJaWYgKHRtcCA+IDE2KQogCQkJdG1wID0gMTY7CiAJCXRtcCB8PSAoY21kLT5jb252ZXJ0X2FyZyAmIChDUl9BTFRfRklMVEVSIHwgQ1JfSU5WRVJUKSk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIHRtcCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIHRtcCk7CiAJfSBlbHNlIGlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfTk9XKSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKSB7CiAJCXVuc2lnbmVkIGludCBtYXhfY291bnQgPSAweDAxMDAwMDAwOwogCiAJCWlmIChkZXZwcml2LT5pc182MTF4KQogCQkJbWF4X2NvdW50IC09IG51bV9hZGNfc3RhZ2VzXzYxMXg7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnN0b3BfYXJnLCBtYXhfY291bnQpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnN0b3BfYXJnLCBtYXhfY291bnQpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJfSBlbHNlIHsKIAkJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtMjUyOSw3ICsyNTMwLDcgQEAKIAkJc3RhcnRfc3RvcF9zZWxlY3QgfD0KIAkJICAgIEFJX1NUQVJUX1NlbGVjdCgxICsgQ1JfQ0hBTihjbWQtPnNjYW5fYmVnaW5fYXJnKSk7CiAJCW5pX3N0Y193cml0ZXcoZGV2LCBzdGFydF9zdG9wX3NlbGVjdCwKLQkJCQkgICAgQUlfU1RBUlRfU1RPUF9TZWxlY3RfUmVnaXN0ZXIpOworCQkJICAgICAgQUlfU1RBUlRfU1RPUF9TZWxlY3RfUmVnaXN0ZXIpOwogCQlicmVhazsKIAl9CiAKQEAgLTI1NzIsNyArMjU3Myw2IEBACiAJfQogCiAJaWYgKGRldi0+aXJxKSB7Ci0KIAkJLyogaW50ZXJydXB0IG9uIEZJRk8sIGVycm9ycywgU0NfVEMgKi8KIAkJaW50ZXJydXB0X2FfZW5hYmxlIHw9IEFJX0Vycm9yX0ludGVycnVwdF9FbmFibGUgfAogCQkgICAgQUlfU0NfVENfSW50ZXJydXB0X0VuYWJsZTsKQEAgLTI4MDgsOCArMjgwOCw3IEBACiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJIiVzOiBidWchIHVuaGFuZGxlZCBhbyByZWZlcmVuY2Ugdm9sdGFnZVxuIiwKLQkJCQlfX2Z1bmNfXyk7CisJCQkJImJ1ZyEgdW5oYW5kbGVkIGFvIHJlZmVyZW5jZSB2b2x0YWdlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJCXN3aXRjaCAoa3JhbmdlLT5tYXggKyBrcmFuZ2UtPm1pbikgewpAQCAtMjgyMSw4ICsyODIwLDcgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkiJXM6IGJ1ZyEgdW5oYW5kbGVkIGFvIG9mZnNldCB2b2x0YWdlXG4iLAotCQkJCV9fZnVuY19fKTsKKwkJCQkiYnVnISB1bmhhbmRsZWQgYW8gb2Zmc2V0IHZvbHRhZ2VcbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHRpbWVkKQpAQCAtMzI2MiwyMSArMzI2MCwyMSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfSU5UIHwgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfSU5UIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCiAJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTMyODcsNyArMzI4NSw3IEBACiAKIAlzd2l0Y2ggKGNtZC0+c3RhcnRfc3JjKSB7CiAJY2FzZSBUUklHX0lOVDoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAJCWJyZWFrOwogCWNhc2UgVFJJR19FWFQ6CiAJCXRtcCA9IENSX0NIQU4oY21kLT5zdGFydF9hcmcpOwpAQCAtMzI5NSwyNCArMzI5MywyNiBAQAogCQlpZiAodG1wID4gMTgpCiAJCQl0bXAgPSAxODsKIAkJdG1wIHw9IChjbWQtPnN0YXJ0X2FyZyAmIChDUl9JTlZFUlQgfCBDUl9FREdFKSk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCB0bXApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgdG1wKTsKIAkJYnJlYWs7CiAJfQogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSBib2FyZC0+YW9fc3BlZWQpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSBkZXZwcml2LT5jbG9ja19ucyAqIDB4ZmZmZmZmKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgYm9hcmQtPmFvX3NwZWVkKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgZGV2cHJpdi0+Y2xvY2tfbnMgKgorCQkJCQkJICAgIDB4ZmZmZmZmKTsKIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdG9wX2FyZywgMHgwMGZmZmZmZik7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnN0b3BfYXJnLCAweDAwZmZmZmZmKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTM0NzQsMTEgKzM0NzQsMTEgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX0lOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19JTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKQEAgLTM0ODgsMTYgKzM0ODgsMTcgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAl0bXAgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwogCXRtcCAmPSBDUl9QQUNLX0ZMQUdTKENET19TYW1wbGVfU291cmNlX1NlbGVjdF9NYXNrLCAwLCAwLCBDUl9JTlZFUlQpOwogCWlmICh0bXAgIT0gY21kLT5zY2FuX2JlZ2luX2FyZykKIAkJZXJyIHw9IC1FSU5WQUw7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTM2OTQsOCArMzY5NSw3IEBACiAJCXVkZWxheSgoZGV2cHJpdi0+c2VyaWFsX2ludGVydmFsX25zICsgOTk5KSAvIDEwMDApOwogCQlpZiAoLS1jb3VudCA8IDApIHsKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJIiVzOiBTUEkgc2VyaWFsIEkvTyBkaWRuJ3QgZmluaXNoIGluIHRpbWUhXG4iLAotCQkJCV9fZnVuY19fKTsKKwkJCQkiU1BJIHNlcmlhbCBJL08gZGlkbid0IGZpbmlzaCBpbiB0aW1lIVxuIik7CiAJCQllcnIgPSAtRVRJTUU7CiAJCQlnb3RvIEVycm9yOwogCQl9CkBAIC0zNzA1LDcgKzM3MDUsNyBAQAogCSAgIERJT19TZXJpYWxfSU9fSW5fUHJvZ3Jlc3NfU3QgZ29lcyBoaWdoIG9uZSBiaXQgdG9vIGVhcmx5LiAqLwogCXVkZWxheSgoZGV2cHJpdi0+c2VyaWFsX2ludGVydmFsX25zICsgOTk5KSAvIDEwMDApOwogCi0JaWYgKGRhdGFfaW4gIT0gTlVMTCkKKwlpZiAoZGF0YV9pbikKIAkJKmRhdGFfaW4gPSBuaV9zdGNfcmVhZHcoZGV2LCBESU9fU2VyaWFsX0lucHV0X1JlZ2lzdGVyKTsKIAogRXJyb3I6CkBAIC0zODE3LDggKzM4MTcsNiBAQAogCQkJICAgICAgQ2xvY2tfYW5kX0ZPVVRfUmVnaXN0ZXIpOwogCQlyZXR1cm4gMTsKIAotCQlicmVhazsKLQogCWNhc2UgSU5TTl9DT05GSUdfQklESVJFQ1RJT05BTF9EQVRBOgogCiAJCWlmIChkZXZwcml2LT5zZXJpYWxfaW50ZXJ2YWxfbnMgPT0gMCkKQEAgLTM4MzMsOCArMzgzMSw3IEBACiAJCQllcnIgPSBuaV9zZXJpYWxfc3dfcmVhZHdyaXRlOChkZXYsIHMsIGJ5dGVfb3V0LAogCQkJCQkJICAgICAgJmJ5dGVfaW4pOwogCQl9IGVsc2UgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzOiBzZXJpYWwgZGlzYWJsZWQhXG4iLAotCQkJCV9fZnVuY19fKTsKKwkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJzZXJpYWwgZGlzYWJsZWQhXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChlcnIgPCAwKQpAQCAtMzg0Niw3ICszODQzLDYgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0KIH0KIAogc3RhdGljIHZvaWQgaW5pdF9hb182N3h4KHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzKQpAQCAtNDUyMCw4ICs0NTE2LDcgQEAKIAljYXNlIDk6CiAJCXJldHVybiBOSV9QRklfT1VUUFVUX0dfR0FURTA7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCSIlczogYnVnLCB1bmhhbmRsZWQgY2FzZSBpbiBzd2l0Y2guXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJidWcsIHVuaGFuZGxlZCBjYXNlIGluIHN3aXRjaC5cbiIpOwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CkBAIC00NjczLDcgKzQ2NjgsNyBAQAogCQkJcmV0dXJuIC1FSU87CiAJfQogCWlmIChpID09IHRpbWVvdXQpIHsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzIHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgInRpbWVvdXRcbiIpOwogCQlyZXR1cm4gLUVUSU1FOwogCX0KIAlyZXR1cm4gMDsKQEAgLTQ5MDgsNyArNDkwMyw3IEBACiAJCQkJCSAgICAgICAmZGV2cHJpdi0+Y2xvY2tfbnMpOwogCWlmIChyZXR2YWwgPCAwKSB7CiAJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkiJXM6IGJ1ZywgZmFpbGVkIHRvIGZpbmQgcGxsIHBhcmFtZXRlcnNcbiIsIF9fZnVuY19fKTsKKwkJCSJidWcsIGZhaWxlZCB0byBmaW5kIHBsbCBwYXJhbWV0ZXJzXG4iKTsKIAkJcmV0dXJuIHJldHZhbDsKIAl9CiAKQEAgLTQ5NjYsMTQgKzQ5NjEsMTQgQEAKIAkJCQkJICAgICAgUlRTSV9UcmlnX0RpcmVjdGlvbl9SZWdpc3Rlcik7CiAJCQkJaWYgKHBlcmlvZF9ucyA9PSAwKSB7CiAJCQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJCQkiJXM6IHdlIGRvbid0IGhhbmRsZSBhbiB1bnNwZWNpZmllZCBjbG9jayBwZXJpb2QgY29ycmVjdGx5IHlldCwgcmV0dXJuaW5nIGVycm9yXG4iLAotCQkJCQkJX19mdW5jX18pOworCQkJCQkJIndlIGRvbid0IGhhbmRsZSBhbiB1bnNwZWNpZmllZCBjbG9jayBwZXJpb2QgY29ycmVjdGx5IHlldCwgcmV0dXJuaW5nIGVycm9yXG4iKTsKIAkJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQkJfQogCQkJCWRldnByaXYtPmNsb2NrX25zID0gcGVyaW9kX25zOwogCQkJCWRldnByaXYtPmNsb2NrX3NvdXJjZSA9IHNvdXJjZTsKLQkJCX0gZWxzZQorCQkJfSBlbHNlIHsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KIAkJfQogCX0KIAlyZXR1cm4gMzsKQEAgLTUwNTcsOCArNTA1Miw3IEBACiAJfSBlbHNlIHsKIAkJaWYgKGNoYW4gPT0gb2xkX1JUU0lfY2xvY2tfY2hhbm5lbCkKIAkJCXJldHVybiBOSV9SVFNJX09VVFBVVF9SVFNJX09TQzsKLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzOiBidWchIHNob3VsZCBuZXZlciBnZXQgaGVyZT9cbiIsCi0JCQlfX2Z1bmNfXyk7CisJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsICJidWchIHNob3VsZCBuZXZlciBnZXQgaGVyZT9cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpZGlvLmMKaW5kZXggZGIzOTlmZS4uYWM3OTA5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3BjaWRpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2lkaW8uYwpAQCAtNTMsOSArNTMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICJtaXRlLmgiCiAKIC8qIGRlZmluZXMgZm9yIHRoZSBQQ0ktRElPLTMySFMgKi8KQEAgLTMwNCw3ICszMDMsNyBAQAogCWRldnByaXYtPmRpX21pdGVfY2hhbiA9CiAJICAgIG1pdGVfcmVxdWVzdF9jaGFubmVsX2luX3JhbmdlKGRldnByaXYtPm1pdGUsCiAJCQkJCSAgZGV2cHJpdi0+ZGlfbWl0ZV9yaW5nLCAxLCAyKTsKLQlpZiAoZGV2cHJpdi0+ZGlfbWl0ZV9jaGFuID09IE5VTEwpIHsKKwlpZiAoIWRldnByaXYtPmRpX21pdGVfY2hhbikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZwcml2LT5taXRlX2NoYW5uZWxfbG9jaywgZmxhZ3MpOwogCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiZmFpbGVkIHRvIHJlc2VydmUgbWl0ZSBkbWEgY2hhbm5lbFxuIik7CiAJCXJldHVybiAtRUJVU1k7CkBAIC0zNTQsOCArMzUzLDkgQEAKIAlpZiAoZGV2cHJpdi0+ZGlfbWl0ZV9jaGFuKSB7CiAJCW1pdGVfcHJlcF9kbWEoZGV2cHJpdi0+ZGlfbWl0ZV9jaGFuLCAzMiwgMzIpOwogCQltaXRlX2RtYV9hcm0oZGV2cHJpdi0+ZGlfbWl0ZV9jaGFuKTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQlyZXR2YWwgPSAtRUlPOworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZwcml2LT5taXRlX2NoYW5uZWxfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTU0NywyMSArNTQ3LDIxIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0lOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0lOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNTcwLDEzICs1NzAsMTMgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKICNkZWZpbmUgTUFYX1NQRUVECShUSU1FUl9CQVNFKQkvKiBpbiBuYW5vc2Vjb25kcyAqLwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSBNQVhfU1BFRUQpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKKwkJCQkJCSAgICBNQVhfU1BFRUQpOwogCQkvKiBubyBtaW5pbXVtIHNwZWVkICovCiAJfSBlbHNlIHsKIAkJLyogVFJJR19FWFQgKi8KQEAgLTU4NywxMyArNTg3LDE0IEBACiAJCX0KIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTYwMyw3ICs2MDQsNyBAQAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKIAkJbmlfcGNpZGlvX25zX3RvX3RpbWVyKCZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCkBAIC05MjQsNyArOTI1LDcgQEAKIAkJcmV0dXJuIHJldDsKIAogCWRldnByaXYtPmRpX21pdGVfcmluZyA9IG1pdGVfYWxsb2NfcmluZyhkZXZwcml2LT5taXRlKTsKLQlpZiAoZGV2cHJpdi0+ZGlfbWl0ZV9yaW5nID09IE5VTEwpCisJaWYgKCFkZXZwcml2LT5kaV9taXRlX3JpbmcpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWYgKGJvYXJkLT51c2VzX2Zpcm13YXJlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMKaW5kZXggM2IyYmRlYi4uMTQ4MWY3MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV9wY2ltaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfcGNpbWlvLmMKQEAgLTEwOSw3ICsxMDksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKQEAgLTEwNDEsNyArMTA0MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIHZvaWQgbV9zZXJpZXNfaW5pdF9lZXByb21fYnVmZmVyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5pX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CkBAIC0xMTgzLDE5ICsxMTgyLDE5IEBACiAJCXJldHVybiByZXQ7CiAKIAlkZXZwcml2LT5haV9taXRlX3JpbmcgPSBtaXRlX2FsbG9jX3JpbmcoZGV2cHJpdi0+bWl0ZSk7Ci0JaWYgKGRldnByaXYtPmFpX21pdGVfcmluZyA9PSBOVUxMKQorCWlmICghZGV2cHJpdi0+YWlfbWl0ZV9yaW5nKQogCQlyZXR1cm4gLUVOT01FTTsKIAlkZXZwcml2LT5hb19taXRlX3JpbmcgPSBtaXRlX2FsbG9jX3JpbmcoZGV2cHJpdi0+bWl0ZSk7Ci0JaWYgKGRldnByaXYtPmFvX21pdGVfcmluZyA9PSBOVUxMKQorCWlmICghZGV2cHJpdi0+YW9fbWl0ZV9yaW5nKQogCQlyZXR1cm4gLUVOT01FTTsKIAlkZXZwcml2LT5jZG9fbWl0ZV9yaW5nID0gbWl0ZV9hbGxvY19yaW5nKGRldnByaXYtPm1pdGUpOwotCWlmIChkZXZwcml2LT5jZG9fbWl0ZV9yaW5nID09IE5VTEwpCisJaWYgKCFkZXZwcml2LT5jZG9fbWl0ZV9yaW5nKQogCQlyZXR1cm4gLUVOT01FTTsKIAlkZXZwcml2LT5ncGN0X21pdGVfcmluZ1swXSA9IG1pdGVfYWxsb2NfcmluZyhkZXZwcml2LT5taXRlKTsKLQlpZiAoZGV2cHJpdi0+Z3BjdF9taXRlX3JpbmdbMF0gPT0gTlVMTCkKKwlpZiAoIWRldnByaXYtPmdwY3RfbWl0ZV9yaW5nWzBdKQogCQlyZXR1cm4gLUVOT01FTTsKIAlkZXZwcml2LT5ncGN0X21pdGVfcmluZ1sxXSA9IG1pdGVfYWxsb2NfcmluZyhkZXZwcml2LT5taXRlKTsKLQlpZiAoZGV2cHJpdi0+Z3BjdF9taXRlX3JpbmdbMV0gPT0gTlVMTCkKKwlpZiAoIWRldnByaXYtPmdwY3RfbWl0ZV9yaW5nWzFdKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChkZXZwcml2LT5pc19tX3NlcmllcykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9uaV90aW9jbWQuYwppbmRleCBkMzZjM2FiLi45YjEyNGIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvbmlfdGlvY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL25pX3Rpb2NtZC5jCkBAIC00NCw3ICs0NCw2IEBACiAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAibmlfdGlvX2ludGVybmFsLmgiCiAjaW5jbHVkZSAibWl0ZS5oIgogCkBAIC0yMDEsNyArMjAwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNvdW50ZXItPmxvY2ssIGZsYWdzKTsKLQlpZiAoY291bnRlci0+bWl0ZV9jaGFuID09IE5VTEwpIHsKKwlpZiAoIWNvdW50ZXItPm1pdGVfY2hhbikgewogCQlkZXZfZXJyKGNvdW50ZXItPmNvdW50ZXJfZGV2LT5kZXYtPmNsYXNzX2RldiwKIAkJCSJjb21tYW5kcyBvbmx5IHN1cHBvcnRlZCB3aXRoIERNQS4gICIpOwogCQlkZXZfZXJyKGNvdW50ZXItPmNvdW50ZXJfZGV2LT5kZXYtPmNsYXNzX2RldiwKQEAgLTIzNCwyMyArMjMzLDIzIEBACiAJc291cmNlcyA9IFRSSUdfTk9XIHwgVFJJR19JTlQgfCBUUklHX09USEVSOwogCWlmIChuaV90aW9fY291bnRpbmdfbW9kZV9yZWdpc3RlcnNfcHJlc2VudChjb3VudGVyLT5jb3VudGVyX2RldikpCiAJCXNvdXJjZXMgfD0gVFJJR19FWFQ7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIHNvdXJjZXMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBzb3VyY2VzKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19GT0xMT1cgfCBUUklHX0VYVCB8IFRSSUdfT1RIRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKIAkJCQkJVFJJR19OT1cgfCBUUklHX0VYVCB8IFRSSUdfT1RIRVIpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTI2Niw3ICsyNjUsNyBAQAogCWNhc2UgVFJJR19OT1c6CiAJY2FzZSBUUklHX0lOVDoKIAljYXNlIFRSSUdfT1RIRVI6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCQlicmVhazsKIAljYXNlIFRSSUdfRVhUOgogCQkvKiBzdGFydF9hcmcgaXMgdGhlIHN0YXJ0X3RyaWdnZXIgcGFzc2VkIHRvIG5pX3Rpb19hcm0oKSAqLwpAQCAtMjc0LDEzICsyNzMsMTQgQEAKIAl9CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0VYVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19FWFQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtMzI5LDcgKzMyOSw3IEBACiAJY2FzZSBuaV9ncGN0X3ZhcmlhbnRfZV9zZXJpZXM6CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7CiAJCXsKLQkJCWlmIChjb3VudGVyLT5taXRlX2NoYW4gPT0gTlVMTCB8fAorCQkJaWYgKCFjb3VudGVyLT5taXRlX2NoYW4gfHwKIAkJCSAgICBjb3VudGVyLT5taXRlX2NoYW4tPmRpciAhPSBDT01FRElfSU5QVVQgfHwKIAkJCSAgICAobWl0ZV9kb25lKGNvdW50ZXItPm1pdGVfY2hhbikpKSB7CiAJCQkJcmV0dmFsID0gMTsKQEAgLTM2Niw3ICszNjYsNyBAQAogCWlmIChneHhfc3RhdHVzICYgR0lfR0FURV9FUlJPUihjaWR4KSkgewogCQlhY2sgfD0gR0lfR0FURV9FUlJPUl9DT05GSVJNKGNpZHgpOwogCQlpZiAoZ2F0ZV9lcnJvcikgewotCQkJLyo2NjB4IGRvbid0IHN1cHBvcnQgYXV0b21hdGljIGFja25vd2xlZGdlbWVudAorCQkJLyo2NjB4IGRvbid0IHN1cHBvcnQgYXV0b21hdGljIGFja25vd2xlZGdtZW50CiAJCQkgIG9mIGdhdGUgaW50ZXJydXB0IHZpYSBkbWEgcmVhZC93cml0ZQogCQkJICAgYW5kIHJlcG9ydCBib2d1cyBnYXRlIGVycm9ycyAqLwogCQkJaWYgKGNvdW50ZXItPmNvdW50ZXJfZGV2LT52YXJpYW50ICE9CkBAIC00NDMsNyArNDQzLDcgQEAKIAkJYnJlYWs7CiAJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZjb3VudGVyLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGNvdW50ZXItPm1pdGVfY2hhbiA9PSBOVUxMKSB7CisJaWYgKCFjb3VudGVyLT5taXRlX2NoYW4pIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY291bnRlci0+bG9jaywgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcxMS5jCmluZGV4IGNiN2U0YzMuLmNmYzNhNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzExLmMKQEAgLTQxLDggKzQxLDcgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKIC8qCiAgKiBJL08gcG9ydCByZWdpc3RlciBtYXAKQEAgLTE1MywxMSArMTUyLDYgQEAKIAl9LAogfTsKIAotc3RydWN0IHBjbDcxMV9wcml2YXRlIHsKLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjE7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IyOwotfTsKLQogc3RhdGljIHZvaWQgcGNsNzExX2FpX3NldF9tb2RlKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBtb2RlKQogewogCS8qCkBAIC0yODcsMjYgKzI4MSwyNCBAQAogc3RhdGljIGludCBwY2w3MTFfYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3QgcGNsNzExX3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgaW50IGFyZzsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCiAJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnNjYW5fYmVnaW5fc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTMxNSwyMyArMzA3LDI0IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQpIHsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCX0gZWxzZSB7CiAjZGVmaW5lIE1BWF9TUEVFRCAxMDAwCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIE1BWF9TUEVFRCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIE1BWF9TUEVFRCk7CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0zMzksMTIgKzMzMiwxMCBAQAogCS8qIHN0ZXAgNCAqLwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewotCQlhcmcgPSBjbWQtPnNjYW5fYmVnaW5fYXJnOwotCQlpODI1M19jYXNjYWRlX25zX3RvX3RpbWVyKEk4MjU0X09TQ19CQVNFXzJNSFosCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKKwkJdW5zaWduZWQgaW50IGFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CisKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtMzUzLDE4ICszNDQsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBwY2w3MTFfYWlfbG9hZF9jb3VudGVycyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQotewotCXN0cnVjdCBwY2w3MTFfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDcxMV9USU1FUl9CQVNFOwotCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDIsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlzb3IxKTsKLQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpc29yMik7Ci19Ci0KIHN0YXRpYyBpbnQgcGNsNzExX2FpX2NtZChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcykKIHsKIAlzdHJ1Y3QgY29tZWRpX2NtZCAqY21kID0gJnMtPmFzeW5jLT5jbWQ7CkBAIC0zNzIsNyArMzUxLDggQEAKIAlwY2w3MTFfc2V0X2NoYW5nYWluKGRldiwgcywgY21kLT5jaGFubGlzdFswXSk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCXBjbDcxMV9haV9sb2FkX2NvdW50ZXJzKGRldik7CisJCWNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhkZXYtPnBhY2VyKTsKKwkJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIHRydWUpOwogCQlvdXRiKFBDTDcxMV9JTlRfU1RBVF9DTFIsIGRldi0+aW9iYXNlICsgUENMNzExX0lOVF9TVEFUX1JFRyk7CiAJCXBjbDcxMV9haV9zZXRfbW9kZShkZXYsIFBDTDcxMV9NT0RFX1BBQ0VSX0lSUSk7CiAJfSBlbHNlIHsKQEAgLTQ0NSwxNCArNDI1LDkgQEAKIHN0YXRpYyBpbnQgcGNsNzExX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCiB7CiAJY29uc3Qgc3RydWN0IHBjbDcxMV9ib2FyZCAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQlzdHJ1Y3QgcGNsNzExX3ByaXZhdGUgKmRldnByaXY7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnM7CiAJaW50IHJldDsKIAotCWRldnByaXYgPSBjb21lZGlfYWxsb2NfZGV2cHJpdihkZXYsIHNpemVvZigqZGV2cHJpdikpOwotCWlmICghZGV2cHJpdikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlyZXQgPSBjb21lZGlfcmVxdWVzdF9yZWdpb24oZGV2LCBpdC0+b3B0aW9uc1swXSwgMHgxMCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKQEAgLTQ2NCw2ICs0MzksMTEgQEAKIAkJCWRldi0+aXJxID0gaXQtPm9wdGlvbnNbMV07CiAJfQogCisJZGV2LT5wYWNlciA9IGNvbWVkaV84MjU0X2luaXQoZGV2LT5pb2Jhc2UgKyBQQ0w3MTFfVElNRVJfQkFTRSwKKwkJCQkgICAgICBJODI1NF9PU0NfQkFTRV8yTUhaLCBJODI1NF9JTzgsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXQgPSBjb21lZGlfYWxsb2Nfc3ViZGV2aWNlcyhkZXYsIDQpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsNzI2LmMKaW5kZXggNDA3OTgxNS4uMjU2ODUwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDcyNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w3MjYuYwpAQCAtNjIsOCArNjIsNiBAQAogCiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLQogI2RlZmluZSBQQ0w3MjZfQU9fTVNCX1JFRyh4KQkoMHgwMCArICgoeCkgKiAyKSkKICNkZWZpbmUgUENMNzI2X0FPX0xTQl9SRUcoeCkJKDB4MDEgKyAoKHgpICogMikpCiAjZGVmaW5lIFBDTDcyNl9ET19NU0JfUkVHCTB4MGMKQEAgLTE3MywxMSArMTcxLDExIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX0ZPTExPVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CkBAIC0xODcsMTEgKzE4NSwxMiBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTIuYwppbmRleCAzZmZiMWVhLi4wM2EzZmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODEyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxMi5jCkBAIC0xMTcsOCArMTE3LDcgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgImNvbWVkaV9pc2FkbWEuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKIAogLyogaGFyZHdhcmUgdHlwZXMgb2YgdGhlIGNhcmRzICovCiAjZGVmaW5lIGJvYXJkUENMODEyUEcJICAgICAgMAkvKiBhbmQgQUNMLTgxMTJQRyAqLwpAQCAtNTEzLDggKzUxMiw2IEBACiAJdW5zaWduZWQgY2hhciBtb2RlX3JlZ19pbnQ7CS8qICB0aGVyZSBpcyBzdG9yZWQgSU5UIG51bWJlciBmb3Igc29tZSBjYXJkICovCiAJdW5zaWduZWQgaW50IGFpX3BvbGxfcHRyOwkvKiAgaG93IG1hbnkgc2FtcGVzIHRyYW5zZmVyIHBvbGwgKi8KIAl1bnNpZ25lZCBpbnQgbWF4XzgxMl9haV9tb2RlMF9yYW5nZXdhaXQ7CS8qICBzZXRsaW5nIHRpbWUgZm9yIGdhaW4gKi8KLQl1bnNpZ25lZCBpbnQgZGl2aXNvcjE7Ci0JdW5zaWduZWQgaW50IGRpdmlzb3IyOwogCXVuc2lnbmVkIGludCB1c2VfZGlmZjoxOwogCXVuc2lnbmVkIGludCB1c2VfbXBjNTA4OjE7CiAJdW5zaWduZWQgaW50IHVzZV9leHRfdHJnOjE7CkBAIC01MjIsMjEgKzUxOSw2IEBACiAJdW5zaWduZWQgaW50IGFpX2VvczoxOwogfTsKIAotc3RhdGljIHZvaWQgcGNsODEyX3N0YXJ0X3BhY2VyKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsIGJvb2wgbG9hZF90aW1lcnMpCi17Ci0Jc3RydWN0IHBjbDgxMl9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgUENMODEyX1RJTUVSX0JBU0U7Ci0KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAyLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCXVkZWxheSgxKTsKLQotCWlmIChsb2FkX3RpbWVycykgewotCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpc29yMik7Ci0JCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlzb3IxKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIHBjbDgxMl9haV9zZXR1cF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQl1bnNpZ25lZCBpbnQgdW5yZWFkX3NhbXBsZXMpCkBAIC02NTAsMjggKzYzMiwyNyBAQAogCXN0cnVjdCBwY2w4MTJfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0JdW5zaWduZWQgaW50IGFyZzsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOwogCiAJaWYgKGRldnByaXYtPnVzZV9leHRfdHJnKQogCQlmbGFncyA9IFRSSUdfRVhUOwogCWVsc2UKIAkJZmxhZ3MgPSBUUklHX1RJTUVSOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIGZsYWdzKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBmbGFncyk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNjgwLDIyICs2NjEsMjQgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSBib2FyZC0+YWlfbnNfbWluKTsKLQllbHNlCS8qIFRSSUdfRVhUICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkgICAgYm9hcmQtPmFpX25zX21pbik7CisJfSBlbHNlIHsJLyogVFJJR19FWFQgKi8KKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y2hhbmxpc3RfbGVuLCAxKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNoYW5saXN0X2xlbiwgMSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtNzAzLDEyICs2ODYsMTAgQEAKIAkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoSTgyNTRfT1NDX0JBU0VfMk1IWiwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjEsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IyLAotCQkJCQkgICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOworCQl1bnNpZ25lZCBpbnQgYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKKworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKGRldi0+cGFjZXIsICZhcmcsIGNtZC0+ZmxhZ3MpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCkBAIC03MjUsOCArNzA2LDYgQEAKIAl1bnNpZ25lZCBpbnQgY3RybCA9IDA7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlwY2w4MTJfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7Ci0KIAlwY2w4MTJfYWlfc2V0X2NoYW5fcmFuZ2UoZGV2LCBjbWQtPmNoYW5saXN0WzBdLCAxKTsKIAogCWlmIChkbWEpIHsJLyogIGNoZWNrIGlmIHdlIGNhbiB1c2UgRE1BIHRyYW5zZmVyICovCkBAIC03NjAsNyArNzM5LDggQEAKIAogCXN3aXRjaCAoY21kLT5jb252ZXJ0X3NyYykgewogCWNhc2UgVFJJR19USU1FUjoKLQkJcGNsODEyX3N0YXJ0X3BhY2VyKGRldiwgdHJ1ZSk7CisJCWNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhkZXYtPnBhY2VyKTsKKwkJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIHRydWUpOwogCQlicmVhazsKIAl9CiAKQEAgLTkxOCw3ICs4OTgsNyBAQAogCiAJb3V0YihkZXZwcml2LT5tb2RlX3JlZ19pbnQgfCBQQ0w4MTJfQ1RSTF9ESVNBQkxFX1RSSUcsCiAJICAgICBkZXYtPmlvYmFzZSArIFBDTDgxMl9DVFJMX1JFRyk7Ci0JcGNsODEyX3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOworCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCBmYWxzZSk7CiAJcGNsODEyX2FpX2NsZWFyX2VvYyhkZXYpOwogCXJldHVybiAwOwogfQpAQCAtMTAxMCwxMCArOTkwLDYgQEAKIAkgICAgIGRldi0+aW9iYXNlICsgUENMODEyX0NUUkxfUkVHKTsKIAlwY2w4MTJfYWlfY2xlYXJfZW9jKGRldik7CiAKLQkvKiBzdG9wIHBhY2VyICovCi0JaWYgKGJvYXJkLT5JUlFiaXRzKQotCQlwY2w4MTJfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7Ci0KIAkvKgogCSAqIEludmFsaWRhdGUgbGFzdF9haV9jaGFuc3BlYyB0aGVuIHNldCBhbmFsb2cgaW5wdXQgdG8KIAkgKiBrbm93biBjaGFubmVsL3JhbmdlLgpAQCAtMTE2MiwxMSArMTEzOCwxOSBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlpZiAoKDEgPDwgaXQtPm9wdGlvbnNbMV0pICYgYm9hcmQtPklSUWJpdHMpIHsKLQkJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPm9wdGlvbnNbMV0sIHBjbDgxMl9pbnRlcnJ1cHQsIDAsCi0JCQkJICBkZXYtPmJvYXJkX25hbWUsIGRldik7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCWRldi0+aXJxID0gaXQtPm9wdGlvbnNbMV07CisJaWYgKGJvYXJkLT5JUlFiaXRzKSB7CisJCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgUENMODEyX1RJTUVSX0JBU0UsCisJCQkJCSAgICAgIEk4MjU0X09TQ19CQVNFXzJNSFosCisJCQkJCSAgICAgIEk4MjU0X0lPOCwgMCk7CisJCWlmICghZGV2LT5wYWNlcikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCWlmICgoMSA8PCBpdC0+b3B0aW9uc1sxXSkgJiBib2FyZC0+SVJRYml0cykgeworCQkJcmV0ID0gcmVxdWVzdF9pcnEoaXQtPm9wdGlvbnNbMV0sIHBjbDgxMl9pbnRlcnJ1cHQsIDAsCisJCQkJCSAgZGV2LT5ib2FyZF9uYW1lLCBkZXYpOworCQkJaWYgKHJldCA9PSAwKQorCQkJCWRldi0+aXJxID0gaXQtPm9wdGlvbnNbMV07CisJCX0KIAl9CiAKIAkvKiB3ZSBuZWVkIGFuIElSUSB0byBkbyBETUEgb24gY2hhbm5lbCAzIG9yIDEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTYuYwppbmRleCBkYTM1ZWRmLi4xY2NiMmYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxNi5jCkBAIC00MSw4ICs0MSw3IEBACiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKICNpbmNsdWRlICJjb21lZGlfaXNhZG1hLmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0jaW5jbHVkZSAiODI1My5oIgorI2luY2x1ZGUgImNvbWVkaV84MjU0LmgiCiAKIC8qCiAgKiBSZWdpc3RlciBJL08gbWFwCkBAIC0xMTYsMzEgKzExNSwxMCBAQAogc3RydWN0IHBjbDgxNl9wcml2YXRlIHsKIAlzdHJ1Y3QgY29tZWRpX2lzYWRtYSAqZG1hOwogCXVuc2lnbmVkIGludCBhaV9wb2xsX3B0cjsJLyogIGhvdyBtYW55IHNhbXBlcyB0cmFuc2ZlciBwb2xsICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3IxOwotCXVuc2lnbmVkIGludCBkaXZpc29yMjsKIAl1bnNpZ25lZCBpbnQgYWlfY21kX3J1bm5pbmc6MTsKIAl1bnNpZ25lZCBpbnQgYWlfY21kX2NhbmNlbGVkOjE7CiB9OwogCi1zdGF0aWMgdm9pZCBwY2w4MTZfc3RhcnRfcGFjZXIoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgYm9vbCBsb2FkX2NvdW50ZXJzKQotewotCXN0cnVjdCBwY2w4MTZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKLQl1bnNpZ25lZCBsb25nIHRpbWVyX2Jhc2UgPSBkZXYtPmlvYmFzZSArIFBDTDgxNl9USU1FUl9CQVNFOwotCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMCwgSTgyNTRfTU9ERTEgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDAsIDB4MDBmZik7Ci0JdWRlbGF5KDEpOwotCi0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUyIHwgSTgyNTRfQklOQVJZKTsKLQl1ZGVsYXkoMSk7Ci0KLQlpZiAobG9hZF9jb3VudGVycykgewotCQlpODI1NF93cml0ZSh0aW1lcl9iYXNlLCAwLCAyLCBkZXZwcml2LT5kaXZpc29yMik7Ci0JCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDEsIGRldnByaXYtPmRpdmlzb3IxKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIHBjbDgxNl9haV9zZXR1cF9kbWEoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKIAkJCQl1bnNpZ25lZCBpbnQgdW5yZWFkX3NhbXBsZXMpCkBAIC0zNjcsNjcgKzM0NSw2MiBAQAogc3RhdGljIGludCBwY2w4MTZfYWlfY21kdGVzdChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywgc3RydWN0IGNvbWVkaV9jbWQgKmNtZCkKIHsKLQlzdHJ1Y3QgcGNsODE2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgaW50IGFyZzsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfRVhUIHwgVFJJR19USU1FUik7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCisJCQkJCVRSSUdfRVhUIHwgVFJJR19USU1FUik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMjsKIAotCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMDAwMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMDAwMCk7CiAJZWxzZQkvKiBUUklHX0VYVCAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKIAotCiAJLyogc3RlcCA0OiBmaXggdXAgYW55IGFyZ3VtZW50cyAqLwogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKLQkJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKLQkJaTgyNTNfY2FzY2FkZV9uc190b190aW1lcihJODI1NF9PU0NfQkFTRV8xME1IWiwKLQkJCQkJICAmZGV2cHJpdi0+ZGl2aXNvcjEsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IyLAotCQkJCQkgICZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOworCQl1bnNpZ25lZCBpbnQgYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKKworCQljb21lZGlfODI1NF9jYXNjYWRlX25zX3RvX3RpbWVyKGRldi0+cGFjZXIsICZhcmcsIGNtZC0+ZmxhZ3MpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCiAJCXJldHVybiA0OwogCi0KIAkvKiBzdGVwIDU6IGNvbXBsYWluIGFib3V0IHNwZWNpYWwgY2hhbmxpc3QgY29uc2lkZXJhdGlvbnMgKi8KIAogCWlmIChjbWQtPmNoYW5saXN0KSB7CkBAIC00NTAsOCArNDIzLDYgQEAKIAlpZiAoZGV2cHJpdi0+YWlfY21kX3J1bm5pbmcpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlwY2w4MTZfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7Ci0KIAlzZWdsZW4gPSBjaGVja19jaGFubmVsX2xpc3QoZGV2LCBzLCBjbWQtPmNoYW5saXN0LCBjbWQtPmNoYW5saXN0X2xlbik7CiAJaWYgKHNlZ2xlbiA8IDEpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDY2LDcgKzQzNywxMSBAQAogCWRtYS0+Y3VyX2RtYSA9IDA7CiAJcGNsODE2X2FpX3NldHVwX2RtYShkZXYsIHMsIDApOwogCi0JcGNsODE2X3N0YXJ0X3BhY2VyKGRldiwgdHJ1ZSk7CisJY29tZWRpXzgyNTRfc2V0X21vZGUoZGV2LT5wYWNlciwgMCwgSTgyNTRfTU9ERTEgfCBJODI1NF9CSU5BUlkpOworCWNvbWVkaV84MjU0X3dyaXRlKGRldi0+cGFjZXIsIDAsIDB4MGZmKTsKKwl1ZGVsYXkoMSk7CisJY29tZWRpXzgyNTRfdXBkYXRlX2Rpdmlzb3JzKGRldi0+cGFjZXIpOworCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCB0cnVlKTsKIAogCWN0cmwgPSBQQ0w4MTZfQ1RSTF9JTlRFTiB8IFBDTDgxNl9DVFJMX0RNQUVOIHwgUENMODE2X0NUUkxfRE1BU1JDX1NMT1QwOwogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCkBAIC01MjUsMTEgKzUwMCw3IEBACiAJb3V0YihQQ0w4MTZfQ1RSTF9ESVNBQkxFX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE2X0NUUkxfUkVHKTsKIAlwY2w4MTZfYWlfY2xlYXJfZW9jKGRldik7CiAKLQkvKiBTdG9wIHBhY2VyICovCi0JaTgyNTRfc2V0X21vZGUoZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfVElNRVJfQkFTRSwgMCwKLQkJCTIsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF9zZXRfbW9kZShkZXYtPmlvYmFzZSArIFBDTDgxNl9USU1FUl9CQVNFLCAwLAotCQkJMSwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOworCWNvbWVkaV84MjU0X3BhY2VyX2VuYWJsZShkZXYtPnBhY2VyLCAxLCAyLCBmYWxzZSk7CiAKIAlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDA7CiAJZGV2cHJpdi0+YWlfY21kX2NhbmNlbGVkID0gMTsKQEAgLTU5NiwxNyArNTY3LDEwIEBACiAKIHN0YXRpYyB2b2lkIHBjbDgxNl9yZXNldChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2KQogewotCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgUENMODE2X1RJTUVSX0JBU0U7Ci0KIAlvdXRiKFBDTDgxNl9DVFJMX0RJU0FCTEVfVFJJRywgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfQ1RSTF9SRUcpOwogCXBjbDgxNl9haV9zZXRfY2hhbl9yYW5nZShkZXYsIDAsIDApOwogCXBjbDgxNl9haV9jbGVhcl9lb2MoZGV2KTsKIAotCS8qIFN0b3AgcGFjZXIgKi8KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAyLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDAsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKLQogCS8qIHNldCBhbGwgZGlnaXRhbCBvdXRwdXRzIGxvdyAqLwogCW91dGIoMCwgZGV2LT5pb2Jhc2UgKyBQQ0w4MTZfRE9fRElfTFNCX1JFRyk7CiAJb3V0YigwLCBkZXYtPmlvYmFzZSArIFBDTDgxNl9ET19ESV9NU0JfUkVHKTsKQEAgLTY2Miw2ICs2MjYsMTEgQEAKIAkvKiBhbiBJUlEgYW5kIERNQSBhcmUgcmVxdWlyZWQgdG8gc3VwcG9ydCBhc3luYyBjb21tYW5kcyAqLwogCXBjbDgxNl9hbGxvY19pcnFfYW5kX2RtYShkZXYsIGl0KTsKIAorCWRldi0+cGFjZXIgPSBjb21lZGlfODI1NF9pbml0KGRldi0+aW9iYXNlICsgUENMODE2X1RJTUVSX0JBU0UsCisJCQkJICAgICAgSTgyNTRfT1NDX0JBU0VfMTBNSFosIEk4MjU0X0lPOCwgMCk7CisJaWYgKCFkZXYtPnBhY2VyKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCXJldCA9IGNvbWVkaV9hbGxvY19zdWJkZXZpY2VzKGRldiwgNCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY2w4MTguYwppbmRleCA3ZTRjZGVhLi5lMWJkZGU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNsODE4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbDgxOC5jCkBAIC0xMDAsOCArMTAwLDcgQEAKICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKIAogI2luY2x1ZGUgImNvbWVkaV9pc2FkbWEuaCIKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLSNpbmNsdWRlICI4MjUzLmgiCisjaW5jbHVkZSAiY29tZWRpXzgyNTQuaCIKIAogLyogYm9hcmRzIGNvbnN0YW50cyAqLwogCkBAIC0yOTksMzMgKzI5OCwxNSBAQAogCXN0cnVjdCBjb21lZGlfaXNhZG1hICpkbWE7CiAJLyogIG1hbmltYWwgYWxsb3dlZCBkZWxheSBiZXR3ZWVuIHNhbXBsZXMgKGluIHVzKSBmb3IgYWN0dWFsIGNhcmQgKi8KIAl1bnNpZ25lZCBpbnQgbnNfbWluOwotCWludCBpODI1M19vc2NfYmFzZTsJLyogIDEvZnJlcXVlbmN5IG9mIG9uIGJvYXJkIG9zY2lsYXRvciBpbiBucyAqLwogCS8qICBNVVggc2V0dGluZyBmb3IgYWN0dWFsIEFJIG9wZXJhdGlvbnMgKi8KIAl1bnNpZ25lZCBpbnQgYWN0X2NoYW5saXN0WzE2XTsKIAl1bnNpZ25lZCBpbnQgYWN0X2NoYW5saXN0X2xlbjsJLyogIGhvdyBsb25nIGlzIGFjdHVhbCBNVVggbGlzdCAqLwogCXVuc2lnbmVkIGludCBhY3RfY2hhbmxpc3RfcG9zOwkvKiAgYWN0dWFsIHBvc2l0aW9uIGluIE1VWCBsaXN0ICovCi0JdW5zaWduZWQgaW50IGRpdmlzb3IxOwotCXVuc2lnbmVkIGludCBkaXZpc29yMjsKIAl1bnNpZ25lZCBpbnQgdXNlZmlmbzoxOwogCXVuc2lnbmVkIGludCBhaV9jbWRfcnVubmluZzoxOwogCXVuc2lnbmVkIGludCBhaV9jbWRfY2FuY2VsZWQ6MTsKIH07CiAKLXN0YXRpYyB2b2lkIHBjbDgxOF9zdGFydF9wYWNlcihzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBib29sIGxvYWRfY291bnRlcnMpCi17Ci0Jc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2ID0gZGV2LT5wcml2YXRlOwotCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgUENMODE4X1RJTUVSX0JBU0U7Ci0KLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAyLCBJODI1NF9NT0RFMiB8IEk4MjU0X0JJTkFSWSk7Ci0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMSwgSTgyNTRfTU9ERTIgfCBJODI1NF9CSU5BUlkpOwotCXVkZWxheSgxKTsKLQotCWlmIChsb2FkX2NvdW50ZXJzKSB7Ci0JCWk4MjU0X3dyaXRlKHRpbWVyX2Jhc2UsIDAsIDIsIGRldnByaXYtPmRpdmlzb3IyKTsKLQkJaTgyNTRfd3JpdGUodGltZXJfYmFzZSwgMCwgMSwgZGV2cHJpdi0+ZGl2aXNvcjEpOwotCX0KLX0KLQogc3RhdGljIHZvaWQgcGNsODE4X2FpX3NldHVwX2RtYShzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAogCQkJCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzLAogCQkJCXVuc2lnbmVkIGludCB1bnJlYWRfc2FtcGxlcykKQEAgLTY2MywyNSArNjQ0LDI0IEBACiAJCSAgICAgIHN0cnVjdCBjb21lZGlfY21kICpjbWQpCiB7CiAJY29uc3Qgc3RydWN0IHBjbDgxOF9ib2FyZCAqYm9hcmQgPSBkZXYtPmJvYXJkX3B0cjsKLQlzdHJ1Y3QgcGNsODE4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IGVyciA9IDA7Ci0JdW5zaWduZWQgaW50IGFyZzsKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19GT0xMT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCisJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+Y29udmVydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTY5MCwyMSArNjcwLDIzIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOwogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgYm9hcmQtPm5zX21pbik7Ci0JZWxzZQkvKiBUUklHX0VYVCAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJICAgIGJvYXJkLT5uc19taW4pOworCX0gZWxzZSB7CS8qIFRSSUdfRVhUICovCisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+Y29udmVydF9hcmcsIDApOworCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtNzEyLDEyICs2OTQsMTAgQEAKIAkvKiBzdGVwIDQ6IGZpeCB1cCBhbnkgYXJndW1lbnRzICovCiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWFyZyA9IGNtZC0+Y29udmVydF9hcmc7Ci0JCWk4MjUzX2Nhc2NhZGVfbnNfdG9fdGltZXIoZGV2cHJpdi0+aTgyNTNfb3NjX2Jhc2UsCi0JCQkJCSAgJmRldnByaXYtPmRpdmlzb3IxLAotCQkJCQkgICZkZXZwcml2LT5kaXZpc29yMiwKLQkJCQkJICAmYXJnLCBjbWQtPmZsYWdzKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKKwkJdW5zaWduZWQgaW50IGFyZyA9IGNtZC0+Y29udmVydF9hcmc7CisKKwkJY29tZWRpXzgyNTRfY2FzY2FkZV9uc190b190aW1lcihkZXYtPnBhY2VyLCAmYXJnLCBjbWQtPmZsYWdzKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgYXJnKTsKIAl9CiAKIAlpZiAoZXJyKQpAQCAtNzQ2LDggKzcyNiw2IEBACiAJaWYgKGRldnByaXYtPmFpX2NtZF9ydW5uaW5nKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JcGNsODE4X3N0YXJ0X3BhY2VyKGRldiwgZmFsc2UpOwotCiAJc2VnbGVuID0gY2hlY2tfY2hhbm5lbF9saXN0KGRldiwgcywgY21kLT5jaGFubGlzdCwgY21kLT5jaGFubGlzdF9sZW4pOwogCWlmIChzZWdsZW4gPCAxKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTc3OSw4ICs3NTcsMTAgQEAKIAl9CiAJb3V0YihjdHJsLCBkZXYtPmlvYmFzZSArIFBDTDgxOF9DVFJMX1JFRyk7CiAKLQlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKQotCQlwY2w4MThfc3RhcnRfcGFjZXIoZGV2LCB0cnVlKTsKKwlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWNvbWVkaV84MjU0X3VwZGF0ZV9kaXZpc29ycyhkZXYtPnBhY2VyKTsKKwkJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIHRydWUpOworCX0KIAogCXJldHVybiAwOwogfQpAQCAtODEyLDcgKzc5Miw3IEBACiAJfQogCiAJb3V0YihQQ0w4MThfQ1RSTF9ESVNBQkxFX1RSSUcsIGRldi0+aW9iYXNlICsgUENMODE4X0NUUkxfUkVHKTsKLQlwY2w4MThfc3RhcnRfcGFjZXIoZGV2LCBmYWxzZSk7CisJY29tZWRpXzgyNTRfcGFjZXJfZW5hYmxlKGRldi0+cGFjZXIsIDEsIDIsIGZhbHNlKTsKIAlwY2w4MThfYWlfY2xlYXJfZW9jKGRldik7CiAKIAlpZiAoZGV2cHJpdi0+dXNlZmlmbykgewkvKiAgRklGTyBzaHV0ZG93biAqLwpAQCAtOTA2LDcgKzg4Niw2IEBACiBzdGF0aWMgdm9pZCBwY2w4MThfcmVzZXQoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldikKIHsKIAljb25zdCBzdHJ1Y3QgcGNsODE4X2JvYXJkICpib2FyZCA9IGRldi0+Ym9hcmRfcHRyOwotCXVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZSA9IGRldi0+aW9iYXNlICsgUENMODE4X1RJTUVSX0JBU0U7CiAJdW5zaWduZWQgaW50IGNoYW47CiAKIAkvKiBmbHVzaCBhbmQgZGlzYWJsZSB0aGUgRklGTyAqLwpAQCAtOTI0LDkgKzkwMyw2IEBACiAKIAkvKiBzdG9wIHBhY2VyICovCiAJb3V0YihQQ0w4MThfQ05URU5BQkxFX1BBQ0VSX0VOQSwgZGV2LT5pb2Jhc2UgKyBQQ0w4MThfQ05URU5BQkxFX1JFRyk7Ci0JaTgyNTRfc2V0X21vZGUodGltZXJfYmFzZSwgMCwgMiwgSTgyNTRfTU9ERTAgfCBJODI1NF9CSU5BUlkpOwotCWk4MjU0X3NldF9tb2RlKHRpbWVyX2Jhc2UsIDAsIDEsIEk4MjU0X01PREUwIHwgSTgyNTRfQklOQVJZKTsKLQlpODI1NF9zZXRfbW9kZSh0aW1lcl9iYXNlLCAwLCAwLCBJODI1NF9NT0RFMCB8IEk4MjU0X0JJTkFSWSk7CiAKIAkvKiBzZXQgYW5hbG9nIG91dHB1dCBjaGFubmVscyB0byAwViAqLwogCWZvciAoY2hhbiA9IDA7IGNoYW4gPCBib2FyZC0+bl9hb2NoYW47IGNoYW4rKykgewpAQCAtMTAxNiw2ICs5OTIsNyBAQAogCWNvbnN0IHN0cnVjdCBwY2w4MThfYm9hcmQgKmJvYXJkID0gZGV2LT5ib2FyZF9wdHI7CiAJc3RydWN0IHBjbDgxOF9wcml2YXRlICpkZXZwcml2OwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOworCXVuc2lnbmVkIGludCBvc2NfYmFzZTsKIAlpbnQgcmV0OwogCiAJZGV2cHJpdiA9IGNvbWVkaV9hbGxvY19kZXZwcml2KGRldiwgc2l6ZW9mKCpkZXZwcml2KSk7CkBAIC0xMDQzLDYgKzEwMjAsMjUgQEAKIAlpZiAoZGV2LT5pcnEgJiYgYm9hcmQtPmhhc19kbWEpCiAJCXBjbDgxOF9hbGxvY19kbWEoZGV2LCBpdC0+b3B0aW9uc1syXSk7CiAKKwkvKiB1c2UgMU1IeiBvciAxME1IeiBvc2NpbGF0b3IgKi8KKwlpZiAoKGl0LT5vcHRpb25zWzNdID09IDApIHx8IChpdC0+b3B0aW9uc1szXSA9PSAxMCkpCisJCW9zY19iYXNlID0gSTgyNTRfT1NDX0JBU0VfMTBNSFo7CisJZWxzZQorCQlvc2NfYmFzZSA9IEk4MjU0X09TQ19CQVNFXzFNSFo7CisKKwlkZXYtPnBhY2VyID0gY29tZWRpXzgyNTRfaW5pdChkZXYtPmlvYmFzZSArIFBDTDgxOF9USU1FUl9CQVNFLAorCQkJCSAgICAgIG9zY19iYXNlLCBJODI1NF9JTzgsIDApOworCWlmICghZGV2LT5wYWNlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBtYXggc2FtcGxpbmcgc3BlZWQgKi8KKwlkZXZwcml2LT5uc19taW4gPSBib2FyZC0+bnNfbWluOworCWlmICghYm9hcmQtPmlzXzgxOCkgeworCQkvKiBleHRlbmRlZCBQQ0w3MTggdG8gMTAwa0h6IERBQyAqLworCQlpZiAoKGl0LT5vcHRpb25zWzZdID09IDEpIHx8IChpdC0+b3B0aW9uc1s2XSA9PSAxMDApKQorCQkJZGV2cHJpdi0+bnNfbWluID0gMTAwMDA7CisJfQorCiAJcmV0ID0gY29tZWRpX2FsbG9jX3N1YmRldmljZXMoZGV2LCA0KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMTExNywyMiArMTExMyw2IEBACiAJcy0+cmFuZ2VfdGFibGUJPSAmcmFuZ2VfZGlnaXRhbDsKIAlzLT5pbnNuX2JpdHMJPSBwY2w4MThfZG9faW5zbl9iaXRzOwogCi0JLyogc2VsZWN0IDEvMTBNSHogb3NjaWxhdG9yICovCi0JaWYgKChpdC0+b3B0aW9uc1szXSA9PSAwKSB8fCAoaXQtPm9wdGlvbnNbM10gPT0gMTApKQotCQlkZXZwcml2LT5pODI1M19vc2NfYmFzZSA9IEk4MjU0X09TQ19CQVNFXzEwTUhaOwotCWVsc2UKLQkJZGV2cHJpdi0+aTgyNTNfb3NjX2Jhc2UgPSBJODI1NF9PU0NfQkFTRV8xTUhaOwotCi0JLyogbWF4IHNhbXBsaW5nIHNwZWVkICovCi0JZGV2cHJpdi0+bnNfbWluID0gYm9hcmQtPm5zX21pbjsKLQotCWlmICghYm9hcmQtPmlzXzgxOCkgewotCQlpZiAoKGl0LT5vcHRpb25zWzZdID09IDEpIHx8IChpdC0+b3B0aW9uc1s2XSA9PSAxMDApKSB7Ci0JCQkvKiBleHRlbmRlZCBQQ0w3MTggdG8gMTAwa0h6IERBQyAqLwotCQkJZGV2cHJpdi0+bnNfbWluID0gMTAwMDA7Ci0JCX0KLQl9Ci0KIAlwY2w4MThfcmVzZXQoZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbW1pby5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbW1pby5jCmluZGV4IDJjMGU3ZWMuLjEwNDcyZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY21taW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtbWlvLmMKQEAgLTc4LDggKzc4LDYgQEAKIAogI2luY2x1ZGUgIi4uL2NvbWVkaWRldi5oIgogCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCi0KIC8qCiAgKiBSZWdpc3RlciBJL08gbWFwCiAgKi8KQEAgLTQ4MywxOSArNDgxLDE5IEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0lOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgVFJJR19FWFQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19JTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNTA0LDE1ICs1MDIsMTYgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtdWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcGNtdWlvLmMKaW5kZXggYTE2NDFkOS4uN2VhODEzMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3BjbXVpby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9wY211aW8uYwpAQCAtNzcsOCArNzcsNiBAQAogCiAjaW5jbHVkZSAiLi4vY29tZWRpZGV2LmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLQogLyoKICAqIFJlZ2lzdGVyIEkvTyBtYXAKICAqCkBAIC00ODYsMTkgKzQ4NCwxOSBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19JTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX0VYVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAxOwogCiAJLyogU3RlcCAyYSA6IG1ha2Ugc3VyZSB0cmlnZ2VyIHNvdXJjZXMgYXJlIHVuaXF1ZSAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTUwNywxNSArNTA1LDE2IEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5jb252ZXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtNTY4LDcgKzU2Nyw3IEBACiAJCX0gZWxzZSBpZiAoaXQtPm9wdGlvbnNbMl0pIHsKIAkJCS8qIHJlcXVlc3QgdGhlIGlycSBmb3IgdGhlIDJuZCBhc2ljICovCiAJCQlyZXQgPSByZXF1ZXN0X2lycShpdC0+b3B0aW9uc1syXSwgcGNtdWlvX2ludGVycnVwdCwgMCwKLQkJCQkJZGV2LT5ib2FyZF9uYW1lLCBkZXYpOworCQkJCQkgIGRldi0+Ym9hcmRfbmFtZSwgZGV2KTsKIAkJCWlmIChyZXQgPT0gMCkKIAkJCQlkZXZwcml2LT5pcnEyID0gaXQtPm9wdGlvbnNbMl07CiAJCX0KQEAgLTU4OCw3ICs1ODcsNyBAQAogCQlzLT5pbnNuX2JpdHMJPSBwY211aW9fZGlvX2luc25fYml0czsKIAkJcy0+aW5zbl9jb25maWcJPSBwY211aW9fZGlvX2luc25fY29uZmlnOwogCi0JCS8qIHN1YmRldmljZXMgMCBhbmQgMiBjYW4gc3VwcHBvcnQgaW50ZXJydXB0cyAqLworCQkvKiBzdWJkZXZpY2VzIDAgYW5kIDIgY2FuIHN1cHBvcnQgaW50ZXJydXB0cyAqLwogCQlpZiAoKGkgPT0gMCAmJiBkZXYtPmlycSkgfHwgKGkgPT0gMiAmJiBkZXZwcml2LT5pcnEyKSkgewogCQkJLyogc2V0dXAgdGhlIGludGVycnVwdCBzdWJkZXZpY2UgKi8KIAkJCWRldi0+cmVhZF9zdWJkZXYgPSBzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3F1YXRlY2hfZGFxcF9jcy5jCmluZGV4IDgzODdmZDAuLjE1MmNiMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9xdWF0ZWNoX2RhcXBfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcXVhdGVjaF9kYXFwX2NzLmMKQEAgLTUyLDcgKzUyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAKICNpbmNsdWRlICIuLi9jb21lZGlfcGNtY2lhLmgiCi0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAKIHN0cnVjdCBkYXFwX3ByaXZhdGUgewogCWludCBzdG9wOwpAQCAtMzE1LDcgKzMxNCw2IEBACiAJZGV2cHJpdi0+aW50ZXJydXB0X21vZGUgPSBzZW1hcGhvcmU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbi0+bjsgaSsrKSB7Ci0KIAkJLyogU3RhcnQgY29udmVyc2lvbiAqLwogCQlvdXRiKERBUVBfQ09NTUFORF9BUk0gfCBEQVFQX0NPTU1BTkRfRklGT19EQVRBLAogCQkgICAgIGRldi0+aW9iYXNlICsgREFRUF9DT01NQU5EKTsKQEAgLTM2NiwyMiArMzY0LDIyIEBACiAKIAkvKiBTdGVwIDEgOiBjaGVjayBpZiB0cmlnZ2VycyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAogCQkJCQlUUklHX1RJTUVSIHwgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKIAkJCQkJVFJJR19USU1FUiB8IFRSSUdfTk9XKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0zOTAsMTMgKzM4OCwxNCBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAogI2RlZmluZSBNQVhfU1BFRUQJMTAwMDAJLyogMTAwIGtIeiAtIGluIG5hbm9zZWNvbmRzICovCiAKLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSBNQVhfU1BFRUQpOworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgTUFYX1NQRUVEKTsKKwl9CiAKIAkvKiBJZiBib3RoIHNjYW5fYmVnaW4gYW5kIGNvbnZlcnQgYXJlIGJvdGggdGltZXIgdmFsdWVzLCB0aGUgb25seQogCSAqIHdheSB0aGF0IGNhbiBtYWtlIHNlbnNlIGlzIGlmIHRoZSBzY2FuIHRpbWUgaXMgdGhlIG51bWJlciBvZgpAQCAtNDA4LDE1ICs0MDcsMTggQEAKIAkJZXJyIHw9IC1FSU5WQUw7CiAJfQogCi0JaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIE1BWF9TUEVFRCk7CisJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgeworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICBNQVhfU1BFRUQpOworCX0KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnN0b3BfYXJnLCAweDAwZmZmZmZmKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c3RvcF9hcmcsIDB4MDBmZmZmZmYpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtNDI2LDEzICs0MjgsMTMgQEAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CiAJCWRhcXBfbnNfdG9fdGltZXIoJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwogCQlkYXFwX25zX3RvX3RpbWVyKCZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCX0KIAogCWlmIChlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvcnRkNTIwLmMKaW5kZXggYzk0YWQxMi4uNGMxM2Y1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3J0ZDUyMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9ydGQ1MjAuYwpAQCAtOTQsMTMgKzk0LDExIEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICJwbHg5MDgwLmgiCiAKIC8qCkBAIC01NzksNyArNTc3LDcgQEAKIAogCQkvKiByZWFkIGRhdGEgKi8KIAkJZCA9IHJlYWR3KGRldnByaXYtPmxhczEgKyBMQVMxX0FEQ19GSUZPKTsKLQkJZCA9IGQgPj4gMzsJLyogbG93IDMgYml0cyBhcmUgbWFya2VyIGxpbmVzICovCisJCWQgPj49IDM7CS8qIGxvdyAzIGJpdHMgYXJlIG1hcmtlciBsaW5lcyAqLwogCiAJCS8qIGNvbnZlcnQgYmlwb2xhciBkYXRhIHRvIGNvbWVkaSB1bnNpZ25lZCBkYXRhICovCiAJCWlmIChjb21lZGlfcmFuZ2VfaXNfYmlwb2xhcihzLCByYW5nZSkpCkBAIC02MTYsNyArNjE0LDcgQEAKIAkJfQogCiAJCWQgPSByZWFkdyhkZXZwcml2LT5sYXMxICsgTEFTMV9BRENfRklGTyk7Ci0JCWQgPSBkID4+IDM7CS8qIGxvdyAzIGJpdHMgYXJlIG1hcmtlciBsaW5lcyAqLworCQlkID4+PSAzOwkvKiBsb3cgMyBiaXRzIGFyZSBtYXJrZXIgbGluZXMgKi8KIAogCQkvKiBjb252ZXJ0IGJpcG9sYXIgZGF0YSB0byBjb21lZGkgdW5zaWduZWQgZGF0YSAqLwogCQlpZiAoY29tZWRpX3JhbmdlX2lzX2JpcG9sYXIocywgcmFuZ2UpKQpAQCAtNzM0LDIxICs3MzIsMjIgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCiAJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTc1NywzMiArNzU2LDMyIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19USU1FUikgewogCQkvKiBOb3RlOiB0aGVzZSBhcmUgdGltZSBwZXJpb2RzLCBub3QgYWN0dWFsIHJhdGVzICovCiAJCWlmICgxID09IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CS8qIG5vIHNjYW5uaW5nICovCi0JCQlpZiAoY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSAgICAgIFJURF9NQVhfU1BFRURfMSkpIHsKKwkJCWlmIChjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSBSVERfTUFYX1NQRUVEXzEpKSB7CiAJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAogCQkJCQkJQ01ERl9ST1VORF9VUCk7CiAJCQkJZXJyIHw9IC1FSU5WQUw7CiAJCQl9Ci0JCQlpZiAoY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSAgICAgIFJURF9NSU5fU1BFRURfMSkpIHsKKwkJCWlmIChjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSBSVERfTUlOX1NQRUVEXzEpKSB7CiAJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAogCQkJCQkJQ01ERl9ST1VORF9ET1dOKTsKIAkJCQllcnIgfD0gLUVJTlZBTDsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJICAgICAgUlREX01BWF9TUEVFRCkpIHsKKwkJCWlmIChjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSBSVERfTUFYX1NQRUVEKSkgewogCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5zY2FuX2JlZ2luX2FyZywKIAkJCQkJCUNNREZfUk9VTkRfVVApOwogCQkJCWVyciB8PSAtRUlOVkFMOwogCQkJfQotCQkJaWYgKGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgICAgICBSVERfTUlOX1NQRUVEKSkgeworCQkJaWYgKGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkJIFJURF9NSU5fU1BFRUQpKSB7CiAJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAogCQkJCQkJQ01ERl9ST1VORF9ET1dOKTsKIAkJCQllcnIgfD0gLUVJTlZBTDsKQEAgLTc5MiwzMiArNzkxLDMyIEBACiAJCS8qIGV4dGVybmFsIHRyaWdnZXIgKi8KIAkJLyogc2hvdWxkIGJlIGxldmVsL2VkZ2UsIGhpL2xvIHNwZWNpZmljYXRpb24gaGVyZSAqLwogCQkvKiBzaG91bGQgc3BlY2lmeSBtdWx0aXBsZSBleHRlcm5hbCB0cmlnZ2VycyAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywgOSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLCA5KTsKIAl9CiAKIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWlmICgxID09IGNtZC0+Y2hhbmxpc3RfbGVuKSB7CS8qIG5vIHNjYW5uaW5nICovCi0JCQlpZiAoY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSAgICAgIFJURF9NQVhfU1BFRURfMSkpIHsKKwkJCWlmIChjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJCSBSVERfTUFYX1NQRUVEXzEpKSB7CiAJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPmNvbnZlcnRfYXJnLAogCQkJCQkJQ01ERl9ST1VORF9VUCk7CiAJCQkJZXJyIHw9IC1FSU5WQUw7CiAJCQl9Ci0JCQlpZiAoY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywKLQkJCQkJCSAgICAgIFJURF9NSU5fU1BFRURfMSkpIHsKKwkJCWlmIChjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJCSBSVERfTUlOX1NQRUVEXzEpKSB7CiAJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPmNvbnZlcnRfYXJnLAogCQkJCQkJQ01ERl9ST1VORF9ET1dOKTsKIAkJCQllcnIgfD0gLUVJTlZBTDsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmIChjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJICAgICAgUlREX01BWF9TUEVFRCkpIHsKKwkJCWlmIChjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJCSBSVERfTUFYX1NQRUVEKSkgewogCQkJCXJ0ZF9uc190b190aW1lcigmY21kLT5jb252ZXJ0X2FyZywKIAkJCQkJCUNNREZfUk9VTkRfVVApOwogCQkJCWVyciB8PSAtRUlOVkFMOwogCQkJfQotCQkJaWYgKGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgICAgICBSVERfTUlOX1NQRUVEKSkgeworCQkJaWYgKGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsCisJCQkJCQkJIFJURF9NSU5fU1BFRUQpKSB7CiAJCQkJcnRkX25zX3RvX3RpbWVyKCZjbWQtPmNvbnZlcnRfYXJnLAogCQkJCQkJQ01ERl9ST1VORF9ET1dOKTsKIAkJCQllcnIgfD0gLUVJTlZBTDsKQEAgLTgyNiwzNyArODI1LDM4IEBACiAJfSBlbHNlIHsKIAkJLyogZXh0ZXJuYWwgdHJpZ2dlciAqLwogCQkvKiBzZWUgYWJvdmUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsIDkpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5jb252ZXJ0X2FyZywgOSk7CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CiAKLQogCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5zY2FuX2JlZ2luX2FyZzsKIAkJcnRkX25zX3RvX3RpbWVyKCZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCBhcmcpOwogCX0KIAogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpIHsKIAkJYXJnID0gY21kLT5jb252ZXJ0X2FyZzsKIAkJcnRkX25zX3RvX3RpbWVyKCZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCiAJCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKIAkJCWFyZyA9IGNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZzsKLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJCSBhcmcpOworCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+CisJCQkJCQkJICAgIHNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSAgICBhcmcpOwogCQl9CiAJfQogCkBAIC0xMTgxLDggKzExODEsOCBAQAogCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaWRldiwgUENJX0xBVEVOQ1lfVElNRVIsICZwY2lfbGF0ZW5jeSk7CiAJaWYgKHBjaV9sYXRlbmN5IDwgMzIpIHsKIAkJZGV2X2luZm8oZGV2LT5jbGFzc19kZXYsCi0JCQkiUENJIGxhdGVuY3kgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAotCQkJcGNpX2xhdGVuY3ksIDMyKTsKKwkJCSAiUENJIGxhdGVuY3kgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLAorCQkJIHBjaV9sYXRlbmN5LCAzMik7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLCAzMik7CiAJfQogfQpAQCAtMTI5OSwxMiArMTI5OSw4IEBACiAJCS8qIFNodXQgZG93biBhbnkgYm9hcmQgb3BzIGJ5IHJlc2V0dGluZyBpdCAqLwogCQlpZiAoZGV2LT5tbWlvICYmIGRldnByaXYtPmxjZmcpCiAJCQlydGRfcmVzZXQoZGV2KTsKLQkJaWYgKGRldi0+aXJxKSB7Ci0JCQl3cml0ZWwocmVhZGwoZGV2cHJpdi0+bGNmZyArIFBMWF9JTlRSQ1NfUkVHKSAmCi0JCQkJfihJQ1NfUExJRSB8IElDU19ETUEwX0UgfCBJQ1NfRE1BMV9FKSwKLQkJCQlkZXZwcml2LT5sY2ZnICsgUExYX0lOVFJDU19SRUcpOworCQlpZiAoZGV2LT5pcnEpCiAJCQlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLQkJfQogCQlpZiAoZGV2LT5tbWlvKQogCQkJaW91bm1hcChkZXYtPm1taW8pOwogCQlpZiAoZGV2cHJpdi0+bGFzMSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvczYyNi5jCmluZGV4IGZjNDk3ZGQuLjc4MTkxOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zNjI2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3M2MjYuYwpAQCAtNjEsMTQgKzYxLDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLSNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKKyNpbmNsdWRlICIuLi9jb21lZGlfcGNpLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICJzNjI2LmgiCiAKIHN0cnVjdCBzNjI2X2J1ZmZlcl9kbWEgewpAQCAtMjMxLDkgKzIyOSw5IEBACiAvKiAqKioqKioqKioqKioqKiAgRUVQUk9NIEFDQ0VTUyBGVU5DVElPTlMgICoqKioqKioqKioqKioqICovCiAKIHN0YXRpYyBpbnQgczYyNl9pMmNfaGFuZHNoYWtlX2VvYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKLQkJCQkgc3RydWN0IGNvbWVkaV9pbnNuICppbnNuLAotCQkJCSB1bnNpZ25lZCBsb25nIGNvbnRleHQpCisJCQkJICBzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqcywKKwkJCQkgIHN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgY29udGV4dCkKIHsKIAlib29sIHN0YXR1czsKIApAQCAtMjk0LDcgKzI5Miw3IEBACiAJICogIEJ5dGUwID0gTm90IHNlbnQuCiAJICovCiAJaWYgKHM2MjZfaTJjX2hhbmRzaGFrZShkZXYsIFM2MjZfSTJDX0IyKFM2MjZfSTJDX0FUVFJTVEFSVCwKLQkJCQkJICAgKGRldnByaXYtPmkyY19hZHJzIHwgMSkpIHwKKwkJCQkJCShkZXZwcml2LT5pMmNfYWRycyB8IDEpKSB8CiAJCQkJICAgIFM2MjZfSTJDX0IxKFM2MjZfSTJDX0FUVFJTVE9QLCAwKSB8CiAJCQkJICAgIFM2MjZfSTJDX0IwKFM2MjZfSTJDX0FUVFJOT1AsIDApKSkKIAkJLyogQWJvcnQgZnVuY3Rpb24gYW5kIGRlY2xhcmUgZXJyb3IgaWYgaGFuZHNoYWtlIGZhaWxlZC4gKi8KQEAgLTUxNyw4ICs1MTUsOCBAQAogLyoKICAqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uOiBXcml0ZSBzZXRwb2ludCB0byBhbiBhcHBsaWNhdGlvbiBEQUMgY2hhbm5lbC4KICAqLwotc3RhdGljIGludCBzNjI2X3NldF9kYWMoc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwgdWludDE2X3QgY2hhbiwKLQkJCSBpbnQxNl90IGRhY2RhdGEpCitzdGF0aWMgaW50IHM2MjZfc2V0X2RhYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LAorCQkJdWludDE2X3QgY2hhbiwgaW50MTZfdCBkYWNkYXRhKQogewogCXN0cnVjdCBzNjI2X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJdWludDE2X3Qgc2lnbm1hc2s7CkBAIC01ODMsOCArNTgxLDggQEAKIAlyZXR1cm4gczYyNl9zZW5kX2RhYyhkZXYsIHZhbCk7CiB9CiAKLXN0YXRpYyBpbnQgczYyNl93cml0ZV90cmltX2RhYyhzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCB1aW50OF90IGxvZ2ljYWxfY2hhbiwKLQkJCQl1aW50OF90IGRhY19kYXRhKQorc3RhdGljIGludCBzNjI2X3dyaXRlX3RyaW1fZGFjKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCisJCQkgICAgICAgdWludDhfdCBsb2dpY2FsX2NoYW4sIHVpbnQ4X3QgZGFjX2RhdGEpCiB7CiAJc3RydWN0IHM2MjZfcHJpdmF0ZSAqZGV2cHJpdiA9IGRldi0+cHJpdmF0ZTsKIAl1aW50MzJfdCBjaGFuOwpAQCAtNjQxLDcgKzYzOSw3IEBACiAJLyogQ29weSBUcmltRGFjIHNldHBvaW50IHZhbHVlcyBmcm9tIEVFUFJPTSB0byBUcmltRGFjcy4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzNjI2X3RyaW1jaGFuKTsgaSsrKSB7CiAJCXJldCA9IHM2MjZfd3JpdGVfdHJpbV9kYWMoZGV2LCBpLAotCQkJCSAgICBzNjI2X2kyY19yZWFkKGRldiwgczYyNl90cmltYWRyc1tpXSkpOworCQkJCQkgIHM2MjZfaTJjX3JlYWQoZGV2LCBzNjI2X3RyaW1hZHJzW2ldKSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTE1NzYsNyArMTU3NCw3IEBACiAJICAgICAgIGRldi0+bW1pbyArIFM2MjZfUF9SUFNBRERSMSk7CiAKIAkvKiBDb25zdHJ1Y3QgUlBTIHByb2dyYW0gaW4gcnBzX2J1ZiBETUEgYnVmZmVyICovCi0JaWYgKGNtZCAhPSBOVUxMICYmIGNtZC0+c2Nhbl9iZWdpbl9zcmMgIT0gVFJJR19GT0xMT1cpIHsKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyAhPSBUUklHX0ZPTExPVykgewogCQkvKiBXYWl0IGZvciBTdGFydCB0cmlnZ2VyLiAqLwogCQkqcnBzKysgPSBTNjI2X1JQU19QQVVTRSB8IFM2MjZfUlBTX1NJR0FEQzsKIAkJKnJwcysrID0gUzYyNl9SUFNfQ0xSU0lHTkFMIHwgUzYyNl9SUFNfU0lHQURDOwpAQCAtMTY2NSw3ICsxNjYzLDcgQEAKIAkJCSpycHMrKyA9IGptcF9hZHJzOwogCQl9CiAKLQkJaWYgKGNtZCAhPSBOVUxMICYmIGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19OT1cpIHsKKwkJaWYgKGNtZC0+Y29udmVydF9zcmMgIT0gVFJJR19OT1cpIHsKIAkJCS8qIFdhaXQgZm9yIFN0YXJ0IHRyaWdnZXIuICovCiAJCQkqcnBzKysgPSBTNjI2X1JQU19QQVVTRSB8IFM2MjZfUlBTX1NJR0FEQzsKIAkJCSpycHMrKyA9IFM2MjZfUlBTX0NMUlNJR05BTCB8IFM2MjZfUlBTX1NJR0FEQzsKQEAgLTIwMzQsMTAgKzIwMzIsNiBAQAogCS8qIHJlc2V0IGFpX2NtZF9ydW5uaW5nIGZsYWcgKi8KIAlkZXZwcml2LT5haV9jbWRfcnVubmluZyA9IDA7CiAKLQkvKiB0ZXN0IGlmIGNtZCBpcyB2YWxpZCAqLwotCWlmIChjbWQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlzNjI2X2FpX2xvYWRfcG9sbGxpc3QocHBsLCBjbWQpOwogCWRldnByaXYtPmFpX2NtZF9ydW5uaW5nID0gMTsKIAlkZXZwcml2LT5haV9jb252ZXJ0X2NvdW50ID0gMDsKQEAgLTIxMjAsMjQgKzIxMTQsMjQgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLAotCQkJCSAgICAgVFJJR19OT1cgfCBUUklHX0lOVCB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLAotCQkJCSAgICAgVFJJR19USU1FUiB8IFRSSUdfRVhUIHwgVFJJR19GT0xMT1cpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsCi0JCQkJICAgICBUUklHX1RJTUVSIHwgVFJJR19FWFQgfCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLAorCQkJCQlUUklHX05PVyB8IFRSSUdfSU5UIHwgVFJJR19FWFQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJCQkJCVRSSUdfVElNRVIgfCBUUklHX0VYVCB8IFRSSUdfRk9MTE9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLAorCQkJCQlUUklHX1RJTUVSIHwgVFJJR19FWFQgfCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c2Nhbl9iZWdpbl9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5jb252ZXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC0yMTQ5LDQ5ICsyMTQzLDUzIEBACiAJc3dpdGNoIChjbWQtPnN0YXJ0X3NyYykgewogCWNhc2UgVFJJR19OT1c6CiAJY2FzZSBUUklHX0lOVDoKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAJCWJyZWFrOwogCWNhc2UgVFJJR19FWFQ6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnN0YXJ0X2FyZywgMzkpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zdGFydF9hcmcsIDM5KTsKIAkJYnJlYWs7CiAJfQogCiAJaWYgKGNtZC0+c2Nhbl9iZWdpbl9zcmMgPT0gVFJJR19FWFQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAzOSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAzOSk7CiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19FWFQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLCAzOSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLCAzOSk7CiAKICNkZWZpbmUgUzYyNl9NQVhfU1BFRUQJMjAwMDAwCS8qIGluIG5hbm9zZWNvbmRzICovCiAjZGVmaW5lIFM2MjZfTUlOX1NQRUVECTIwMDAwMDAwMDAJLyogaW4gbmFub3NlY29uZHMgKi8KIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkgUzYyNl9NQVhfU1BFRUQpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSBTNjI2X01JTl9TUEVFRCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIFM2MjZfTUFYX1NQRUVEKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgUzYyNl9NSU5fU1BFRUQpOwogCX0gZWxzZSB7Ci0JCS8qIGV4dGVybmFsIHRyaWdnZXIgKi8KLQkJLyogc2hvdWxkIGJlIGxldmVsL2VkZ2UsIGhpL2xvIHNwZWNpZmljYXRpb24gaGVyZSAqLwotCQkvKiBzaG91bGQgc3BlY2lmeSBtdWx0aXBsZSBleHRlcm5hbCB0cmlnZ2VycyAqLwotCQkvKiBlcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywgOSk7ICovCisJCS8qCisJCSAqIGV4dGVybmFsIHRyaWdnZXIKKwkJICogc2hvdWxkIGJlIGxldmVsL2VkZ2UsIGhpL2xvIHNwZWNpZmljYXRpb24gaGVyZQorCQkgKiBzaG91bGQgc3BlY2lmeSBtdWx0aXBsZSBleHRlcm5hbCB0cmlnZ2VycworCQkgKiBlcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywgOSk7CisJCSAqLwogCX0KIAlpZiAoY21kLT5jb252ZXJ0X3NyYyA9PSBUUklHX1RJTUVSKSB7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLAotCQkJCQkJIFM2MjZfTUFYX1NQRUVEKTsKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+Y29udmVydF9hcmcsCi0JCQkJCQkgUzYyNl9NSU5fU1BFRUQpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywKKwkJCQkJCSAgICBTNjI2X01BWF9TUEVFRCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWF4KCZjbWQtPmNvbnZlcnRfYXJnLAorCQkJCQkJICAgIFM2MjZfTUlOX1NQRUVEKTsKIAl9IGVsc2UgewotCQkvKiBleHRlcm5hbCB0cmlnZ2VyICovCi0JCS8qIHNlZSBhYm92ZSAqLwotCQkvKiBlcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21heCgmY21kLT5zY2FuX2JlZ2luX2FyZywgOSk7ICovCisJCS8qCisJCSAqIGV4dGVybmFsIHRyaWdnZXIgLSBzZWUgYWJvdmUKKwkJICogZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19tYXgoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDkpOworCQkgKi8KIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTIyMDEsMTggKzIxOTksMTkgQEAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWFyZyA9IGNtZC0+c2Nhbl9iZWdpbl9hcmc7CiAJCXM2MjZfbnNfdG9fdGltZXIoJmFyZywgY21kLT5mbGFncyk7Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIGFyZyk7CiAJfQogCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikgewogCQlhcmcgPSBjbWQtPmNvbnZlcnRfYXJnOwogCQlzNjI2X25zX3RvX3RpbWVyKCZhcmcsIGNtZC0+ZmxhZ3MpOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCBhcmcpOwogCiAJCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKIAkJCWFyZyA9IGNtZC0+Y29udmVydF9hcmcgKiBjbWQtPnNjYW5fZW5kX2FyZzsKLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJCSBhcmcpOworCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+CisJCQkJCQkJICAgIHNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSAgICBhcmcpOwogCQl9CiAJfQogCkBAIC0yNzMzLDcgKzI3MzIsNyBAQAogfQogCiBzdGF0aWMgaW50IHM2MjZfYXV0b19hdHRhY2goc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiwKLQkJCQkgICAgICB1bnNpZ25lZCBsb25nIGNvbnRleHRfdW51c2VkKQorCQkJICAgIHVuc2lnbmVkIGxvbmcgY29udGV4dF91bnVzZWQpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNvbWVkaV90b19wY2lfZGV2KGRldik7CiAJc3RydWN0IHM2MjZfcHJpdmF0ZSAqZGV2cHJpdjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zZXJpYWwyMDAyLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc2VyaWFsMjAwMi5jCmluZGV4IDcxMjI2ZWUuLjMwNGViZmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zZXJpYWwyMDAyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3NlcmlhbDIwMDIuYwpAQCAtMzksMTQgKzM5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogCiBzdHJ1Y3Qgc2VyaWFsMjAwMl9yYW5nZV90YWJsZV90IHsKLQogCS8qICBIQUNLLi4uICovCiAJaW50IGxlbmd0aDsKIAlzdHJ1Y3QgY29tZWRpX2tyYW5nZSByYW5nZTsKIH07CiAKIHN0cnVjdCBzZXJpYWwyMDAyX3ByaXZhdGUgewotCiAJaW50IHBvcnQ7CQkvKiAgL2Rldi90dHlTPHBvcnQ+ICovCiAJaW50IHNwZWVkOwkJLyogIGJhdWRyYXRlICovCiAJc3RydWN0IGZpbGUgKnR0eTsKQEAgLTExMCwyNCArMTA4LDE2IEBACiB7CiAJY29uc3QgY2hhciBfX3VzZXIgKnAgPSAoX19mb3JjZSBjb25zdCBjaGFyIF9fdXNlciAqKWJ1ZjsKIAlpbnQgcmVzdWx0OworCWxvZmZfdCBvZmZzZXQgPSAwOwogCW1tX3NlZ21lbnRfdCBvbGRmczsKIAogCW9sZGZzID0gZ2V0X2ZzKCk7CiAJc2V0X2ZzKEtFUk5FTF9EUyk7Ci0JZi0+Zl9wb3MgPSAwOwotCXJlc3VsdCA9IGYtPmZfb3AtPndyaXRlKGYsIHAsIGNvdW50LCAmZi0+Zl9wb3MpOworCXJlc3VsdCA9IF9fdmZzX3dyaXRlKGYsIHAsIGNvdW50LCAmb2Zmc2V0KTsKIAlzZXRfZnMob2xkZnMpOwogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBpbnQgc2VyaWFsMjAwMl90dHlfcmVhZGIoc3RydWN0IGZpbGUgKmYsIHVuc2lnbmVkIGNoYXIgKmJ1ZikKLXsKLQljaGFyIF9fdXNlciAqcCA9IChfX2ZvcmNlIGNoYXIgX191c2VyICopYnVmOwotCi0JZi0+Zl9wb3MgPSAwOwotCXJldHVybiBmLT5mX29wLT5yZWFkKGYsIHAsIDEsICZmLT5mX3Bvcyk7Ci19Ci0KIHN0YXRpYyB2b2lkIHNlcmlhbDIwMDJfdHR5X3JlYWRfcG9sbF93YWl0KHN0cnVjdCBmaWxlICpmLCBpbnQgdGltZW91dCkKIHsKIAlzdHJ1Y3QgcG9sbF93cXVldWVzIHRhYmxlOwpAQCAtMTQ1LDggKzEzNSw4IEBACiAJCQlicmVhazsKIAkJfQogCQlkb19nZXR0aW1lb2ZkYXkoJm5vdyk7Ci0JCWVsYXBzZWQgPSAoMTAwMDAwMCAqIChub3cudHZfc2VjIC0gc3RhcnQudHZfc2VjKSArCi0JCQkgIG5vdy50dl91c2VjIC0gc3RhcnQudHZfdXNlYyk7CisJCWVsYXBzZWQgPSAxMDAwMDAwICogKG5vdy50dl9zZWMgLSBzdGFydC50dl9zZWMpICsKKwkJCSAgbm93LnR2X3VzZWMgLSBzdGFydC50dl91c2VjOwogCQlpZiAoZWxhcHNlZCA+IHRpbWVvdXQpCiAJCQlicmVhazsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKQEAgLTE2MywxMyArMTUzLDE1IEBACiAJcmVzdWx0ID0gLTE7CiAJaWYgKCFJU19FUlIoZikpIHsKIAkJbW1fc2VnbWVudF90IG9sZGZzOworCQljaGFyIF9fdXNlciAqcCA9IChfX2ZvcmNlIGNoYXIgX191c2VyICopJmNoOworCQlsb2ZmX3Qgb2Zmc2V0ID0gMDsKIAogCQlvbGRmcyA9IGdldF9mcygpOwogCQlzZXRfZnMoS0VSTkVMX0RTKTsKIAkJaWYgKGYtPmZfb3AtPnBvbGwpIHsKIAkJCXNlcmlhbDIwMDJfdHR5X3JlYWRfcG9sbF93YWl0KGYsIHRpbWVvdXQpOwogCi0JCQlpZiAoc2VyaWFsMjAwMl90dHlfcmVhZGIoZiwgJmNoKSA9PSAxKQorCQkJaWYgKF9fdmZzX3JlYWQoZiwgcCwgMSwgJm9mZnNldCkgPT0gMSkKIAkJCQlyZXN1bHQgPSBjaDsKIAkJfSBlbHNlIHsKIAkJCS8qIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHBvbGwsIGJ1c3kgd2FpdCAqLwpAQCAtMTgwLDcgKzE3Miw3IEBACiAJCQkJaWYgKHJldHJpZXMgPj0gdGltZW91dCkKIAkJCQkJYnJlYWs7CiAKLQkJCQlpZiAoc2VyaWFsMjAwMl90dHlfcmVhZGIoZiwgJmNoKSA9PSAxKSB7CisJCQkJaWYgKF9fdmZzX3JlYWQoZiwgcCwgMSwgJm9mZnNldCkgPT0gMSkgewogCQkJCQlyZXN1bHQgPSBjaDsKIAkJCQkJYnJlYWs7CiAJCQkJfQpAQCAtMzAwLDcgKzI5Miw2IEBACiAJCX0KIAl9CiAJcmV0dXJuIHJlc3VsdDsKLQogfQogCiBzdGF0aWMgdm9pZCBzZXJpYWwyMDAyX3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3Qgc2VyaWFsX2RhdGEgZGF0YSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zc3ZfZG5wLmMgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvc3N2X2RucC5jCmluZGV4IDg0OGMzMDguLmFjYzdmMzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy9zc3ZfZG5wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3Nzdl9kbnAuYwpAQCAtMTI3LDcgKzEyNyw2IEBACiAJb3V0Yih2YWwsIENTQ0RSKTsKIAogCXJldHVybiBpbnNuLT5uOwotCiB9CiAKIHN0YXRpYyBpbnQgZG5wX2F0dGFjaChzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2LCBzdHJ1Y3QgY29tZWRpX2RldmNvbmZpZyAqaXQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdW5pb3h4NS5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VuaW94eDUuYwppbmRleCA3YzIyNzZhLi41MTQ5OGI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdW5pb3h4NS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91bmlveHg1LmMKQEAgLTM4LDcgKzM4LDYgQEAKIAogKi8KIAotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlICIuLi9jb21lZGlkZXYuaCIKQEAgLTgxLDcgKzgwLDYgQEAKIAogc3RhdGljIGludCBfX3VuaW94eDVfZGVmaW5lX2NoYW5fb2Zmc2V0KGludCBjaGFuX251bSkKIHsKLQogCWlmIChjaGFuX251bSA8IDAgfHwgY2hhbl9udW0gPiAyMykKIAkJcmV0dXJuIC0xOwogCkBAIC0yNjYsNyArMjY0LDcgQEAKIAkvKiBzZW5kaW5nIGZvciBieXRlcyB0byBtb2R1bGUob25lIGJ5dGUgcGVyIGN5Y2xlIGl0ZXJhdGlvbikgKi8KIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCXdoaWxlICghKChpbmIodXNwLT51c3BfaW9iYXNlICsgMCkpICYgVHhCRSkpCi0JCQk7CS8qIHdhaXRzIHdoaWxlIHdyaXR0aW5nIHdpbGwgYmUgYWxsb3dlZCAqLworCQkJOwkvKiB3YWl0cyB3aGlsZSB3cml0aW5nIHdpbGwgYmUgYWxsb3dlZCAqLwogCQlvdXRiKHVzcC0+dXNwX2V4dHJhX2RhdGFbbW9kdWxlXVtpXSwgdXNwLT51c3BfaW9iYXNlICsgNik7CiAJfQogCkBAIC0zOTksNyArMzk3LDcgQEAKIAkJb3V0YihpICsgMSwgaW9iYXNlICsgNSk7CiAJCW91dGIoJ0gnLCBpb2Jhc2UgKyA2KTsJLyogcmVxdWVzdHMgRUVQUk9NIHdvcmxkICovCiAJCXdoaWxlICghKGluYihpb2Jhc2UgKyAwKSAmIFR4QkUpKQotCQkJOwkvKiB3YWl0cyB3aGlsZSB3cml0dGluZyB3aWxsIGJlIGFsbG93ZWQgKi8KKwkJCTsJLyogd2FpdHMgd2hpbGUgd3JpdGluZyB3aWxsIGJlIGFsbG93ZWQgKi8KIAkJb3V0YigwLCBpb2Jhc2UgKyA2KTsKIAogCQkvKiB3YWl0cyB3aGlsZSByZWFkaW5nIG9mIHR3byBieXRlcyB3aWxsIGJlIGFsbG93ZWQgKi8KQEAgLTQxMyw4ICs0MTEsOSBAQAogCQlpZiAobmRlZl9mbGFnKSB7CiAJCQl1c3AtPnVzcF9tb2R1bGVfdHlwZVtpXSA9IDA7CiAJCQluZGVmX2ZsYWcgPSAwOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCXVzcC0+dXNwX21vZHVsZV90eXBlW2ldID0gaW5iKGlvYmFzZSArIDYpOworCQl9CiAKIAkJdWRlbGF5KDEpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXguYwppbmRleCAxY2Q3NDAzLi5jZWQwNWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eC5jCkBAIC04NSw4ICs4NSw2IEBACiAKICNpbmNsdWRlICIuLi9jb21lZGlfdXNiLmgiCiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKLQogLyogY29uc3RhbnRzIGZvciBmaXJtd2FyZSB1cGxvYWQgYW5kIGRvd25sb2FkICovCiAjZGVmaW5lIFVTQkRVWF9GSVJNV0FSRQkJInVzYmR1eF9maXJtd2FyZS5iaW4iCiAjZGVmaW5lIFVTQkRVWF9GSVJNV0FSRV9NQVhfTEVOCTB4MjAwMApAQCAtNTI0LDE5ICs1MjIsMTkgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNTQ1LDEwICs1NDMsMTAgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykJLyogaW50ZXJuYWwgdHJpZ2dlciAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCWlmICh0aGlzX3VzYmR1eHN1Yi0+aGlnaF9zcGVlZCkgewpAQCAtNTYzLDggKzU2MSw5IEBACiAJCQl3aGlsZSAoaSA8IChjbWQtPmNoYW5saXN0X2xlbikpCiAJCQkJaSA9IGkgKiAyOwogCi0JCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCQkgMTAwMDAwMCAvIDggKiBpKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPgorCQkJCQkJCSAgICBzY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICAgMTAwMDAwMCAvIDggKiBpKTsKIAkJCS8qIG5vdyBjYWxjIHRoZSByZWFsIHNhbXBsaW5nIHJhdGUgd2l0aCBhbGwgdGhlCiAJCQkgKiByb3VuZGluZyBlcnJvcnMgKi8KIAkJCXRtcF90aW1lciA9CkBAIC01NzMsMjQgKzU3MiwyNiBAQAogCQl9IGVsc2UgewogCQkJLyogZnVsbCBzcGVlZCAqLwogCQkJLyogMWtIeiBzY2FucyBldmVyeSBVU0IgZnJhbWUgKi8KLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJCSAxMDAwMDAwKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPgorCQkJCQkJCSAgICBzY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICAgMTAwMDAwMCk7CiAJCQkvKgogCQkJICogY2FsYyB0aGUgcmVhbCBzYW1wbGluZyByYXRlIHdpdGggdGhlIHJvdW5kaW5nIGVycm9ycwogCQkJICovCiAJCQl0bXBfdGltZXIgPSAoKHVuc2lnbmVkIGludCkoY21kLT5zY2FuX2JlZ2luX2FyZyAvCiAJCQkJCQkgICAxMDAwMDAwKSkgKiAxMDAwMDAwOwogCQl9Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQl0bXBfdGltZXIpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgdG1wX3RpbWVyKTsKIAl9CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5zdG9wX3NyYyA9PSBUUklHX0NPVU5UKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAllbHNlCS8qIFRSSUdfTk9ORSAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMzsKQEAgLTYzMyw4ICs2MzQsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IFJFVFJJRVM7IGkrKykgewogCQlyZXQgPSB1c2JfYnVsa19tc2codXNiLCB1c2JfcmN2YnVsa3BpcGUodXNiLCA4KSwKLQkJCQkgICAgICBkZXZwcml2LT5pbnNuX2J1ZiwgU0laRUlOU05CVUYsCi0JCQkJICAgICAgJm5yZWMsIEJVTEtfVElNRU9VVCk7CisJCQkJICAgZGV2cHJpdi0+aW5zbl9idWYsIFNJWkVJTlNOQlVGLAorCQkJCSAgICZucmVjLCBCVUxLX1RJTUVPVVQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCWlmIChsZTE2X3RvX2NwdShkZXZwcml2LT5pbnNuX2J1ZlswXSkgPT0gY29tbWFuZCkKQEAgLTg5NSw3ICs4OTYsNyBAQAogCiAJLyogU3RlcCAxIDogY2hlY2sgaWYgdHJpZ2dlcnMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdGFydF9zcmMsIFRSSUdfTk9XIHwgVFJJR19JTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKIAogCWlmICgwKSB7CQkvKiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpICovCiAJCS8qIHRoZSBzYW1wbGluZyByYXRlIGlzIHNldCBieSB0aGUgY292ZXJzaW9uIHJhdGUgKi8KQEAgLTkwNCw3ICs5MDUsNyBAQAogCQkvKiBzdGFydCBhIG5ldyBzY2FuIChvdXRwdXQgYXQgb25jZSkgd2l0aCBhIHRpbWVyICovCiAJCWZsYWdzID0gVFJJR19USU1FUjsKIAl9Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywgZmxhZ3MpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIGZsYWdzKTsKIAogCWlmICgwKSB7CQkvKiAodGhpc191c2JkdXhzdWItPmhpZ2hfc3BlZWQpICovCiAJCS8qCkBAIC05MTksMTggKzkyMCwxOCBAQAogCQkgKi8KIAkJZmxhZ3MgPSBUUklHX05PVzsKIAl9Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgZmxhZ3MpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIGZsYWdzKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9lbmRfc3JjLCBUUklHX0NPVU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0b3Bfc3JjLCBUUklHX0NPVU5UIHwgVFJJR19OT05FKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0YXJ0X3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPnN0b3Bfc3JjKTsKIAogCS8qIFN0ZXAgMmIgOiBhbmQgbXV0dWFsbHkgY29tcGF0aWJsZSAqLwogCkBAIC05MzksMjUgKzk0MCwyNyBAQAogCiAJLyogU3RlcCAzOiBjaGVjayBpZiBhcmd1bWVudHMgYXJlIHRyaXZpYWxseSB2YWxpZCAqLwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKIAogCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfRk9MTE9XKQkvKiBpbnRlcm5hbCB0cmlnZ2VyICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKIAotCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJIDEwMDAwMDApOworCWlmIChjbWQtPnNjYW5fYmVnaW5fc3JjID09IFRSSUdfVElNRVIpIHsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCisJCQkJCQkgICAgMTAwMDAwMCk7CisJfQogCiAJLyogbm90IHVzZWQgbm93LCBpcyBmb3IgbGF0ZXIgdXNlICovCiAJaWYgKGNtZC0+Y29udmVydF9zcmMgPT0gVFJJR19USU1FUikKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+Y29udmVydF9hcmcsIDEyNTAwMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMjUwMDApOwogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC0xMDQxLDcgKzEwNDQsNiBAQAogCQkJCXN0cnVjdCBjb21lZGlfaW5zbiAqaW5zbiwKIAkJCQl1bnNpZ25lZCBpbnQgKmRhdGEpCiB7Ci0KIAlzdHJ1Y3QgdXNiZHV4X3ByaXZhdGUgKmRldnByaXYgPSBkZXYtPnByaXZhdGU7CiAJaW50IHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhmYXN0LmMKaW5kZXggN2NlMjdjMS4uZDkwZGM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9kcml2ZXJzL3VzYmR1eGZhc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4ZmFzdC5jCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSAiY29tZWRpX2ZjLmgiCiAjaW5jbHVkZSAiLi4vY29tZWRpX3VzYi5oIgogCiAvKgpAQCAtMzQzLDIzICszNDIsMjQgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLAorCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLAogCQkJCQlUUklHX05PVyB8IFRSSUdfRVhUIHwgVFJJR19JTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsCisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2JlZ2luX3NyYywKIAkJCQkJVFJJR19GT0xMT1cgfCBUUklHX0VYVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywgVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5jb252ZXJ0X3NyYywKKwkJCQkJVFJJR19USU1FUiB8IFRSSUdfRVhUKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKQogCQlyZXR1cm4gMTsKIAogCS8qIFN0ZXAgMmEgOiBtYWtlIHN1cmUgdHJpZ2dlciBzb3VyY2VzIGFyZSB1bmlxdWUgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zY2FuX2JlZ2luX3NyYyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2lzX3VuaXF1ZShjbWQtPmNvbnZlcnRfc3JjKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOwogCiAJLyogU3RlcCAyYiA6IGFuZCBtdXR1YWxseSBjb21wYXRpYmxlICovCiAKQEAgLTM3MiwxMiArMzcyLDEzIEBACiAKIAkvKiBTdGVwIDM6IGNoZWNrIGlmIGFyZ3VtZW50cyBhcmUgdHJpdmlhbGx5IHZhbGlkICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdGFydF9hcmcsIDApOwogCiAJaWYgKCFjbWQtPmNoYW5saXN0X2xlbikKIAkJZXJyIHw9IC1FSU5WQUw7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywgY21kLT5jaGFubGlzdF9sZW4pOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLAorCQkJCQkgICBjbWQtPmNoYW5saXN0X2xlbik7CiAKIAlpZiAoY21kLT5jaGFubGlzdF9sZW4gPT0gMSkKIAkJbWluX3NhbXBsZV9wZXJpb2QgPSAxOwpAQCAtMzk0LDE2ICszOTUsMTYgQEAKIAogCQkvKiBjYWxjIGFyZyBhZ2FpbiAqLwogCQl0bXAgPSBzdGVwcyAvIDMwOwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCB0bXApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPmNvbnZlcnRfYXJnLCB0bXApOwogCX0KIAogCS8qIHN0b3Agc291cmNlICovCiAJc3dpdGNoIChjbWQtPnN0b3Bfc3JjKSB7CiAJY2FzZSBUUklHX0NPVU5UOgotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBUUklHX05PTkU6Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAkJYnJlYWs7CiAJCS8qCiAJCSAqIFRSSUdfRVhUIGRvZXNuJ3QgY2FyZSBzaW5jZSBpdCBkb2Vzbid0IHRyaWdnZXIKQEAgLTQxOSw3ICs0MjAsNiBAQAogCS8qIHN0ZXAgNDogZml4IHVwIGFueSBhcmd1bWVudHMgKi8KIAogCXJldHVybiAwOwotCiB9CiAKIHN0YXRpYyBpbnQgdXNiZHV4ZmFzdF9haV9pbnR0cmlnKHN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4c2lnbWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhzaWdtYS5jCmluZGV4IDM5NDk2OWIuLmVhYTlhZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhzaWdtYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhzaWdtYS5jCkBAIC00OSw3ICs0OSw2IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKLSNpbmNsdWRlICJjb21lZGlfZmMuaCIKICNpbmNsdWRlICIuLi9jb21lZGlfdXNiLmgiCiAKIC8qIHRpbWVvdXQgZm9yIHRoZSBVU0ItdHJhbnNmZXIgaW4gbXMqLwpAQCAtMjQzLDkgKzI0Miw4IEBACiAJCXVyYi0+ZGV2ID0gY29tZWRpX3RvX3VzYl9kZXYoZGV2KTsKIAkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJIiVzOiB1cmIgcmVzdWJtaXQgZmFpbGVkICglZClcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7CisJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAidXJiIHJlc3VibWl0IGZhaWxlZCAoJWQpXG4iLAorCQkJCXJldCk7CiAJCQlpZiAocmV0ID09IC1FTDJOU1lOQykKIAkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAogCQkJCQkiYnVnZ3kgVVNCIGhvc3QgY29udHJvbGxlciBvciBidWcgaW4gSVJRIGhhbmRsZXJcbiIpOwpAQCAtMjkyLDggKzI5MCw4IEBACiAKIAlkZWZhdWx0OgogCQkvKiBhIHJlYWwgZXJyb3IgKi8KLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzOiBub24temVybyB1cmIgc3RhdHVzICglZClcbiIsCi0JCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAibm9uLXplcm8gdXJiIHN0YXR1cyAoJWQpXG4iLAorCQkJdXJiLT5zdGF0dXMpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKIAkJYnJlYWs7CiAJfQpAQCAtMzg2LDkgKzM4NCw4IEBACiAJCXVyYi0+aXNvX2ZyYW1lX2Rlc2NbMF0uc3RhdHVzID0gMDsKIAkJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCi0JCQkJIiVzOiB1cmIgcmVzdWJtaXQgZmFpbGVkICglZClcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7CisJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAidXJiIHJlc3VibWl0IGZhaWxlZCAoJWQpXG4iLAorCQkJCXJldCk7CiAJCQlpZiAocmV0ID09IC1FTDJOU1lOQykKIAkJCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LAogCQkJCQkiYnVnZ3kgVVNCIGhvc3QgY29udHJvbGxlciBvciBidWcgaW4gSVJRIGhhbmRsZXJcbiIpOwpAQCAtNDIzLDggKzQyMCw4IEBACiAKIAlkZWZhdWx0OgogCQkvKiBhIHJlYWwgZXJyb3IgKi8KLQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIiVzOiBub24temVybyB1cmIgc3RhdHVzICglZClcbiIsCi0JCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAibm9uLXplcm8gdXJiIHN0YXR1cyAoJWQpXG4iLAorCQkJdXJiLT5zdGF0dXMpOwogCQlhc3luYy0+ZXZlbnRzIHw9IENPTUVESV9DQl9FUlJPUjsKIAkJYnJlYWs7CiAJfQpAQCAtNDg4LDE5ICs0ODUsMTkgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBUUklHX1RJTUVSKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDE7CiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtNTA5LDEwICs1MDYsMTAgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykJLyogaW50ZXJuYWwgdHJpZ2dlciAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CiAJCXVuc2lnbmVkIGludCB0bXA7CkBAIC01MjQsMjcgKzUyMSwzMSBAQAogCQkJICogc2FtcGxlIHR3byBjaGFubmVscy4gVGh1cywgdGhlIG1vcmUgY2hhbm5lbHMKIAkJCSAqIGFyZSBpbiB0aGUgY2hhbm5lbCBsaXN0IHRoZSBtb3JlIHRpbWUgd2UgbmVlZC4KIAkJCSAqLwotCQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c2Nhbl9iZWdpbl9hcmcsCi0JCQkJCQkoMTAwMDAwMCAvIDggKiBpbnRlcnZhbCkpOworCQkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+CisJCQkJCQkJICAgIHNjYW5fYmVnaW5fYXJnLAorCQkJCQkJCSAgICAoMTAwMDAwMCAvIDggKgorCQkJCQkJCSAgICAgaW50ZXJ2YWwpKTsKIAogCQkJdG1wID0gKGNtZC0+c2Nhbl9iZWdpbl9hcmcgLyAxMjUwMDApICogMTI1MDAwOwogCQl9IGVsc2UgewogCQkJLyogZnVsbCBzcGVlZCAqLwogCQkJLyogMWtIeiBzY2FucyBldmVyeSBVU0IgZnJhbWUgKi8KLQkJCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAotCQkJCQkJCSAxMDAwMDAwKTsKKwkJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPgorCQkJCQkJCSAgICBzY2FuX2JlZ2luX2FyZywKKwkJCQkJCQkgICAgMTAwMDAwMCk7CiAKIAkJCXRtcCA9IChjbWQtPnNjYW5fYmVnaW5fYXJnIC8gMTAwMDAwMCkgKiAxMDAwMDAwOwogCQl9Ci0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIHRtcCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9iZWdpbl9hcmcsIHRtcCk7CiAJfQogCi0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsIGNtZC0+Y2hhbmxpc3RfbGVuKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fZW5kX2FyZywKKwkJCQkJICAgY21kLT5jaGFubGlzdF9sZW4pOwogCiAJaWYgKGNtZC0+c3RvcF9zcmMgPT0gVFJJR19DT1VOVCkKLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zdG9wX2FyZywgMSk7CiAJZWxzZQkvKiBUUklHX05PTkUgKi8KLQkJZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zdG9wX2FyZywgMCk7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOwogCiAJaWYgKGVycikKIAkJcmV0dXJuIDM7CkBAIC04NTYsNyArODU3LDcgQEAKIAogCS8qIFN0ZXAgMSA6IGNoZWNrIGlmIHRyaWdnZXJzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RhcnRfc3JjLCBUUklHX05PVyB8IFRSSUdfSU5UKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnN0YXJ0X3NyYywgVFJJR19OT1cgfCBUUklHX0lOVCk7CiAKIAlpZiAoaGlnaF9zcGVlZCkgewogCQkvKgpAQCAtODY4LDExICs4NjksMTEgQEAKIAkJLyogc3RhcnQgYSBuZXcgc2NhbiAob3V0cHV0IGF0IG9uY2UpIHdpdGggYSB0aW1lciAqLwogCQlmbGFncyA9IFRSSUdfVElNRVI7CiAJfQotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c2Nhbl9iZWdpbl9zcmMsIGZsYWdzKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fYmVnaW5fc3JjLCBmbGFncyk7CiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPmNvbnZlcnRfc3JjLCBUUklHX05PVyk7Ci0JZXJyIHw9IGNmY19jaGVja190cmlnZ2VyX3NyYygmY21kLT5zY2FuX2VuZF9zcmMsIFRSSUdfQ09VTlQpOwotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+c3RvcF9zcmMsIFRSSUdfQ09VTlQgfCBUUklHX05PTkUpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9zcmMoJmNtZC0+Y29udmVydF9zcmMsIFRSSUdfTk9XKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfc3JjKCZjbWQtPnNjYW5fZW5kX3NyYywgVFJJR19DT1VOVCk7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX3NyYygmY21kLT5zdG9wX3NyYywgVFJJR19DT1VOVCB8IFRSSUdfTk9ORSk7CiAKIAlpZiAoZXJyKSB7CiAJCXVwKCZkZXZwcml2LT5zZW0pOwpAQCAtODgxLDggKzg4Miw4IEBACiAKIAkvKiBTdGVwIDJhIDogbWFrZSBzdXJlIHRyaWdnZXIgc291cmNlcyBhcmUgdW5pcXVlICovCiAKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RhcnRfc3JjKTsKLQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfaXNfdW5pcXVlKGNtZC0+c3RvcF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdGFydF9zcmMpOworCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9pc191bmlxdWUoY21kLT5zdG9wX3NyYyk7CiAKIAkvKiBTdGVwIDJiIDogYW5kIG11dHVhbGx5IGNvbXBhdGlibGUgKi8KIApAQCAtODkxLDI1ICs4OTIsMjcgQEAKIAogCS8qIFN0ZXAgMzogY2hlY2sgaWYgYXJndW1lbnRzIGFyZSB0cml2aWFsbHkgdmFsaWQgKi8KIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RhcnRfYXJnLCAwKTsKKwllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0YXJ0X2FyZywgMCk7CiAKIAlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX0ZPTExPVykJLyogaW50ZXJuYWwgdHJpZ2dlciAqLwotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnNjYW5fYmVnaW5fYXJnLCAwKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2JlZ2luX2FyZywgMCk7CiAKLQlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKQotCQllcnIgfD0gY2ZjX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5zY2FuX2JlZ2luX2FyZywKLQkJCQkJCSAxMDAwMDAwKTsKKwlpZiAoY21kLT5zY2FuX2JlZ2luX3NyYyA9PSBUUklHX1RJTUVSKSB7CisJCWVyciB8PSBjb21lZGlfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnNjYW5fYmVnaW5fYXJnLAorCQkJCQkJICAgIDEwMDAwMDApOworCX0KIAogCS8qIG5vdCB1c2VkIG5vdywgaXMgZm9yIGxhdGVyIHVzZSAqLwogCWlmIChjbWQtPmNvbnZlcnRfc3JjID09IFRSSUdfVElNRVIpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPmNvbnZlcnRfYXJnLCAxMjUwMDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX21pbigmY21kLT5jb252ZXJ0X2FyZywgMTI1MDAwKTsKIAotCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c2Nhbl9lbmRfYXJnLCBjbWQtPmNoYW5saXN0X2xlbik7CisJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19pcygmY21kLT5zY2FuX2VuZF9hcmcsCisJCQkJCSAgIGNtZC0+Y2hhbmxpc3RfbGVuKTsKIAogCWlmIChjbWQtPnN0b3Bfc3JjID09IFRSSUdfQ09VTlQpCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfbWluKCZjbWQtPnN0b3BfYXJnLCAxKTsKKwkJZXJyIHw9IGNvbWVkaV9jaGVja190cmlnZ2VyX2FyZ19taW4oJmNtZC0+c3RvcF9hcmcsIDEpOwogCWVsc2UJLyogVFJJR19OT05FICovCi0JCWVyciB8PSBjZmNfY2hlY2tfdHJpZ2dlcl9hcmdfaXMoJmNtZC0+c3RvcF9hcmcsIDApOworCQllcnIgfD0gY29tZWRpX2NoZWNrX3RyaWdnZXJfYXJnX2lzKCZjbWQtPnN0b3BfYXJnLCAwKTsKIAogCWlmIChlcnIpCiAJCXJldHVybiAzOwpAQCAtMTA3MSw5ICsxMDc0LDggQEAKIAlkZWZhdWx0OgogCQkvKiBhIHJlYWwgZXJyb3IgKi8KIAkJaWYgKGRldnByaXYtPnB3bV9jbWRfcnVubmluZykgewotCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwKLQkJCQkiJXM6IG5vbi16ZXJvIHVyYiBzdGF0dXMgKCVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOworCQkJZGV2X2VycihkZXYtPmNsYXNzX2RldiwgIm5vbi16ZXJvIHVyYiBzdGF0dXMgKCVkKVxuIiwKKwkJCQl1cmItPnN0YXR1cyk7CiAJCQl1c2JkdXhzaWdtYV9wd21fc3RvcChkZXYsIDApOwkvKiB3L28gdW5saW5rICovCiAJCX0KIAkJcmV0dXJuOwpAQCAtMTA4Nyw4ICsxMDg5LDcgQEAKIAl1cmItPnN0YXR1cyA9IDA7CiAJcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAiJXM6IHVyYiByZXN1Ym1pdCBmYWlsZWQgKCVkKVxuIiwKLQkJCV9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKGRldi0+Y2xhc3NfZGV2LCAidXJiIHJlc3VibWl0IGZhaWxlZCAoJWQpXG4iLCByZXQpOwogCQlpZiAocmV0ID09IC1FTDJOU1lOQykKIAkJCWRldl9lcnIoZGV2LT5jbGFzc19kZXYsCiAJCQkJImJ1Z2d5IFVTQiBob3N0IGNvbnRyb2xsZXIgb3IgYnVnIGluIElSUSBoYW5kbGVyXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkva2NvbWVkaWxpYi9rY29tZWRpbGliX21haW4uYwppbmRleCA5NzNmNTQ0Li43NmJmNTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2tjb21lZGlsaWIva2NvbWVkaWxpYl9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9rY29tZWRpbGliL2tjb21lZGlsaWJfbWFpbi5jCkBAIC01OCw3ICs1OCw3IEBACiAJCXJldHZhbCA9IE5VTEw7CiAJdXBfcmVhZCgmZGV2LT5hdHRhY2hfbG9jayk7CiAKLQlpZiAocmV0dmFsID09IE5VTEwpCisJaWYgKCFyZXR2YWwpCiAJCWNvbWVkaV9kZXZfcHV0KGRldik7CiAKIAlyZXR1cm4gcmV0dmFsOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5jIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5jCmluZGV4IDcxODQ3NDcuLjY3NjZkNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwLmMKQEAgLTEzNjEsNyArMTM2MSw2IEBACiB7CiAJdTggX19pb21lbSAqdmFkZHI7CiAJdWxvbmcgb2Zmc2V0OwotCXVpbnQgdmFsdWU7CiAKIAlpZiAoIWNoIHx8IGNoLT5tYWdpYyAhPSBER0FQX0NIQU5ORUxfTUFHSUMpCiAJCXJldHVybiAwOwpAQCAtMTM4NCw4ICsxMzgzLDcgQEAKIAlvZmZzZXQgPSAoaW9yZWFkMTYodmFkZHIgKyBFQ1NfU0VHKSA8PCA0KSArIChjaC0+Y2hfcG9ydG51bSAqIDB4MjgpCiAJICAgICAgICsgTElORV9TUEVFRDsKIAotCXZhbHVlID0gcmVhZHcodmFkZHIgKyBvZmZzZXQpOwotCXJldHVybiB2YWx1ZTsKKwlyZXR1cm4gcmVhZHcodmFkZHIgKyBvZmZzZXQpOwogfQogCiAvKgpAQCAtMjE5Niw3ICsyMTk0LDcgQEAKIAkgKiB3aWxsIGJlIG1hcHBlZCBpbnRvIHRoZSBsb3cgMk1CIG9mIHRoZSA0TUIgbWVtb3J5IHNwYWNlCiAJICovCiAJYnJkLT5wb3J0ID0gYnJkLT5tZW1iYXNlICsgUENJX0lPX09GRlNFVDsKLQlicmQtPnBvcnRfZW5kID0gYnJkLT5wb3J0ICsgUENJX0lPX1NJWkU7CisJYnJkLT5wb3J0X2VuZCA9IGJyZC0+cG9ydCArIFBDSV9JT19TSVpFX0RHQVA7CiAKIAkvKgogCSAqIFNwZWNpYWwgaW5pdGlhbGl6YXRpb24gZm9yIG5vbi1QTFggYm9hcmRzCkBAIC0zOTc5LDcgKzM5NzcsNiBAQAogCWludCByZXN1bHQ7CiAJdTggbXN0YXQ7CiAJdWxvbmcgbG9ja19mbGFnczsKLQlpbnQgcmM7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGxvY2tfZmxhZ3MpOwogCkBAIC00MDA0LDkgKzQwMDEsNyBAQAogCWlmIChtc3RhdCAmIERfQ0QoY2gpKQogCQlyZXN1bHQgfD0gVElPQ01fQ0Q7CiAKLQlyYyA9IHB1dF91c2VyKHJlc3VsdCwgdmFsdWUpOwotCi0JcmV0dXJuIHJjOworCXJldHVybiBwdXRfdXNlcihyZXN1bHQsIHZhbHVlKTsKIH0KIAogLyoKQEAgLTcwNDQsOCArNzAzOSw3IEBACiAKIAkvKiBTdGFydCB0aGUgcG9sbGVyICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRnYXBfcG9sbF9sb2NrLCBmbGFncyk7Ci0JaW5pdF90aW1lcigmZGdhcF9wb2xsX3RpbWVyKTsKLQlkZ2FwX3BvbGxfdGltZXIuZnVuY3Rpb24gPSBkZ2FwX3BvbGxfaGFuZGxlcjsKKwlzZXR1cF90aW1lcigmZGdhcF9wb2xsX3RpbWVyLCBkZ2FwX3BvbGxfaGFuZGxlciwgMCk7CiAJZGdhcF9wb2xsX3RpbWVyLmRhdGEgPSAwOwogCWRnYXBfcG9sbF90aW1lID0gamlmZmllcyArIGRnYXBfamlmZmllc19mcm9tX21zKGRnYXBfcG9sbF90aWNrKTsKIAlkZ2FwX3BvbGxfdGltZXIuZXhwaXJlcyA9IGRnYXBfcG9sbF90aW1lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5oIGIvZHJpdmVycy9zdGFnaW5nL2RnYXAvZGdhcC5oCmluZGV4IDY4NDAzMzEuLmEyZTViMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ2FwL2RnYXAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZGdhcC9kZ2FwLmgKQEAgLTEyMSw3ICsxMjEsNyBAQAogI2RlZmluZSBQQ0lfSU9fT0ZGU0VUCQkweDAwMjAwMDAwCiAKIC8qIFNpemUgb2YgSU8gKDJNQikgKi8KLSNkZWZpbmUgUENJX0lPX1NJWkUJCTB4MDAyMDAwMDAKKyNkZWZpbmUgUENJX0lPX1NJWkVfREdBUAkweDAwMjAwMDAwCiAKIC8qIE51bWJlciBvZiBib2FyZHMgd2Ugc3VwcG9ydCBhdCBvbmNlLiAqLwogI2RlZmluZQlNQVhCT0FSRFMJMzIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvTWFrZWZpbGUKaW5kZXggYjY5ZjdiNi4uOTk1Yzg3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvTWFrZWZpbGUKQEAgLTEsNSArMSwzIEBACi1FWFRSQV9DRkxBR1MgKz0gLURER19OQU1FPVwiZGduYy0xLjMtMTZcIiAtRERHX1BBUlQ9XCI0MDAwMjM2OV9GXCIKLQogb2JqLSQoQ09ORklHX0RHTkMpICs9IGRnbmMubwogCiBkZ25jLW9ianMgOj0gICBkZ25jX2Nscy5vIGRnbmNfZHJpdmVyLm9cCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvVE9ETwppbmRleCAyMmFkZmYxLi4yYjJjNmVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9UT0RPCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL1RPRE8KQEAgLTEsMTAgKzEsMTAgQEAKICogY2hlY2twYXRjaCBmaXhlcwogKiByZW1vdmUgdW5lY2Vzc2FyeSBjb21tZW50cwotKiByZW1vdmUgdW5lY2Vzc2FyeSBlcnJvciBtZXNzYWdlcy4gRXhhbXBsZSBremFsbG9jKCkgaGFzIGl0cyAKKyogcmVtb3ZlIHVuZWNlc3NhcnkgZXJyb3IgbWVzc2FnZXMuIEV4YW1wbGUga3phbGxvYygpIGhhcyBpdHMKICAgb3duIGVycm9yIG1lc3NhZ2UuIEFkZGluZyBhbiBleHRyYSBvbmUgaXMgdXNlbGVzcy4KICogdXNlIGdvdG8gc3RhdGVtZW50cyBmb3IgZXJyb3IgaGFuZGxpbmcgd2hlbiBhcHByb3ByaWF0ZQotKiB0aGVyZSBpcyBhIGxvdCBvZiB1bmVjZXNzYXJ5IGNvZGUgaW4gdGhlIGRyaXZlci4gSXQgd2FzIAorKiB0aGVyZSBpcyBhIGxvdCBvZiB1bmVjZXNzYXJ5IGNvZGUgaW4gdGhlIGRyaXZlci4gSXQgd2FzCiAgIG9yaWdpbmFsbHkgYSBzdGFuZGFsb25lIGRyaXZlci4gUmVtb3ZlIHVuZWVkZWQgY29kZS4KIAotUGxlYXNlIHNlbmQgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiBhbmQgCitQbGVhc2Ugc2VuZCBwYXRjaGVzIHRvIEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+IGFuZAogQ2M6IExpZHphIExvdWluYSA8bGlkemEubG91aW5hQGdtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5jCmluZGV4IGJlZGM1MjIuLmUzNTY0ZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19jbHMuYwpAQCAtMTEsMjIgKzExLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCiAgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKgotICoJTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhCi0gKgotICoJVGhpcyBpcyBzaGFyZWQgY29kZSBiZXR3ZWVuIERpZ2kncyBDVlMgYXJjaGl2ZSBhbmQgdGhlCi0gKglMaW51eCBLZXJuZWwgc291cmNlcy4KLSAqCUNoYW5naW5nIHRoZSBzb3VyY2UganVzdCBmb3IgcmVmb3JtYXR0aW5nIG5lZWRsZXNzbHkgYnJlYWtzCi0gKglvdXIgQ1ZTIGRpZmYgaGlzdG9yeS4KLSAqCi0gKglTZW5kIGFueSBidWcgZml4ZXMvY2hhbmdlcyB0bzogIEVuZy5MaW51eCBhdCBkaWdpIGRvdCBjb20uCi0gKglUaGFuayB5b3UuCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTkyLDE0ICs3NiwxMiBAQAogCS5zZW5kX2ltbWVkaWF0ZV9jaGFyID0JCWNsc19zZW5kX2ltbWVkaWF0ZV9jaGFyCiB9OwogCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X2N0c19mbG93X2NvbnRyb2woc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJdW5zaWduZWQgY2hhciBsY3JiID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+bGNyKTsKIAl1bnNpZ25lZCBjaGFyIGllciA9IHJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPmllcik7CiAJdW5zaWduZWQgY2hhciBpc3JfZmNyID0gMDsKIAotCiAJLyoKIAkgKiBUaGUgRW5oYW5jZWQgUmVnaXN0ZXIgU2V0IG1heSBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4KIAkgKiB0aGUgTGluZSBDb250cm9sIFJlZ2lzdGVyIGlzIHNldCB0byAweEJGaC4KQEAgLTEzNiwxNCArMTE4LDEyIEBACiAKIH0KIAotCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xzX3NldF9peG9uX2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAl1bnNpZ25lZCBjaGFyIGxjcmIgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5sY3IpOwogCXVuc2lnbmVkIGNoYXIgaWVyID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+aWVyKTsKIAl1bnNpZ25lZCBjaGFyIGlzcl9mY3IgPSAwOwogCi0KIAkvKgogCSAqIFRoZSBFbmhhbmNlZCBSZWdpc3RlciBTZXQgbWF5IG9ubHkgYmUgYWNjZXNzZWQgd2hlbgogCSAqIHRoZSBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgaXMgc2V0IHRvIDB4QkZoLgpAQCAtMTg0LDE0ICsxNjQsMTIgQEAKIAogfQogCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X25vX291dHB1dF9mbG93X2NvbnRyb2woc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJdW5zaWduZWQgY2hhciBsY3JiID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+bGNyKTsKIAl1bnNpZ25lZCBjaGFyIGllciA9IHJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPmllcik7CiAJdW5zaWduZWQgY2hhciBpc3JfZmNyID0gMDsKIAotCiAJLyoKIAkgKiBUaGUgRW5oYW5jZWQgUmVnaXN0ZXIgU2V0IG1heSBvbmx5IGJlIGFjY2Vzc2VkIHdoZW4KIAkgKiB0aGUgTGluZSBDb250cm9sIFJlZ2lzdGVyIGlzIHNldCB0byAweEJGaC4KQEAgLTIzMCwxNCArMjA4LDEyIEBACiAKIH0KIAotCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xzX3NldF9ydHNfZmxvd19jb250cm9sKHN0cnVjdCBjaGFubmVsX3QgKmNoKQogewogCXVuc2lnbmVkIGNoYXIgbGNyYiA9IHJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPmxjcik7CiAJdW5zaWduZWQgY2hhciBpZXIgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5pZXIpOwogCXVuc2lnbmVkIGNoYXIgaXNyX2ZjciA9IDA7CiAKLQogCS8qCiAJICogVGhlIEVuaGFuY2VkIFJlZ2lzdGVyIFNldCBtYXkgb25seSBiZSBhY2Nlc3NlZCB3aGVuCiAJICogdGhlIExpbmUgQ29udHJvbCBSZWdpc3RlciBpcyBzZXQgdG8gMHhCRmguCkBAIC0yNjYsMjAgKzI0MiwxNyBAQAogCQlVQVJUXzE2NjU0X0ZDUl9UWFRSSUdHRVJfMTYgfCBVQVJUX0ZDUl9DTEVBUl9SQ1ZSKSwKIAkJJmNoLT5jaF9jbHNfdWFydC0+aXNyX2Zjcik7CiAKLQogCWNoLT5jaF9yX3dhdGVybWFyayA9IDQ7CiAJY2gtPmNoX3JfdGxldmVsID0gODsKIAogfQogCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X2l4b2ZmX2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAl1bnNpZ25lZCBjaGFyIGxjcmIgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5sY3IpOwogCXVuc2lnbmVkIGNoYXIgaWVyID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+aWVyKTsKIAl1bnNpZ25lZCBjaGFyIGlzcl9mY3IgPSAwOwogCi0KIAkvKgogCSAqIFRoZSBFbmhhbmNlZCBSZWdpc3RlciBTZXQgbWF5IG9ubHkgYmUgYWNjZXNzZWQgd2hlbgogCSAqIHRoZSBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgaXMgc2V0IHRvIDB4QkZoLgpAQCAtMzE2LDE0ICsyODksMTIgQEAKIAogfQogCi0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfc2V0X25vX2lucHV0X2Zsb3dfY29udHJvbChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAl1bnNpZ25lZCBjaGFyIGxjcmIgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5sY3IpOwogCXVuc2lnbmVkIGNoYXIgaWVyID0gcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+aWVyKTsKIAl1bnNpZ25lZCBjaGFyIGlzcl9mY3IgPSAwOwogCi0KIAkvKgogCSAqIFRoZSBFbmhhbmNlZCBSZWdpc3RlciBTZXQgbWF5IG9ubHkgYmUgYWNjZXNzZWQgd2hlbgogCSAqIHRoZSBMaW5lIENvbnRyb2wgUmVnaXN0ZXIgaXMgc2V0IHRvIDB4QkZoLgpAQCAtMzU3LDcgKzMyOCw2IEBACiAKIH0KIAotCiAvKgogICogY2xzX2NsZWFyX2JyZWFrLgogICogRGV0ZXJtaW5lcyB3aGV0aGVyIGl0cyB0aW1lIHRvIHNodXQgb2ZmIGJyZWFrIGNvbmRpdGlvbi4KQEAgLTM5Myw3ICszNjMsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiB9CiAKLQogLyogUGFyc2UgdGhlIElTUiByZWdpc3RlciBmb3IgdGhlIHNwZWNpZmljIHBvcnQgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBjbHNfcGFyc2VfaXNyKHN0cnVjdCBkZ25jX2JvYXJkICpicmQsIHVpbnQgcG9ydCkKIHsKQEAgLTQwNiw3ICszNzUsNyBAQAogCSAqIHZlcmlmaWVkIGluIHRoZSBpbnRlcnJ1cHQgcm91dGluZS4KIAkgKi8KIAotCWlmIChwb3J0ID4gYnJkLT5uYXN5bmMpCisJaWYgKHBvcnQgPj0gYnJkLT5uYXN5bmMpCiAJCXJldHVybjsKIAogCWNoID0gYnJkLT5jaGFubmVsc1twb3J0XTsKQEAgLTQ1Nyw3ICs0MjYsNiBAQAogCX0KIH0KIAotCiAvKgogICogY2xzX3BhcmFtKCkKICAqIFNlbmQgYW55L2FsbCBjaGFuZ2VzIHRvIHRoZSBsaW5lIHRvIHRoZSBVQVJULgpAQCAtNzExLDcgKzY3OSw2IEBACiAJY2xzX3BhcnNlX21vZGVtKGNoLCByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5tc3IpKTsKIH0KIAotCiAvKgogICogT3VyIGJvYXJkIHBvbGxlciBmdW5jdGlvbi4KICAqLwpAQCAtNzg0LDcgKzc1MSw2IEBACiAKIH0KIAotCiAvKgogICogY2xzX2ludHIoKQogICoKQEAgLTgzNCw3ICs4MDAsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotCiBzdGF0aWMgdm9pZCBjbHNfZGlzYWJsZV9yZWNlaXZlcihzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAl1bnNpZ25lZCBjaGFyIHRtcCA9IHJlYWRiKCZjaC0+Y2hfY2xzX3VhcnQtPmllcik7CkBAIC04NDMsNyArODA4LDYgQEAKIAl3cml0ZWIodG1wLCAmY2gtPmNoX2Nsc191YXJ0LT5pZXIpOwogfQogCi0KIHN0YXRpYyB2b2lkIGNsc19lbmFibGVfcmVjZWl2ZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJdW5zaWduZWQgY2hhciB0bXAgPSByZWFkYigmY2gtPmNoX2Nsc191YXJ0LT5pZXIpOwpAQCAtODUyLDcgKzgxNiw2IEBACiAJd3JpdGViKHRtcCwgJmNoLT5jaF9jbHNfdWFydC0+aWVyKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBjbHNfY29weV9kYXRhX2Zyb21fdWFydF90b19xdWV1ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKIAlpbnQgcWxlZnQgPSAwOwpAQCAtOTQyLDcgKzkwNSw2IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIH0KIAotCiAvKgogICogVGhpcyBmdW5jdGlvbiBiYXNpY2FsbHkgZ29lcyB0byBzbGVlcCBmb3Igc2Vjcywgb3IgdW50aWwKICAqIGl0IGdldHMgc2lnbmFsbGVkIHRoYXQgdGhlIHBvcnQgaGFzIGZ1bGx5IGRyYWluZWQuCkBAIC05NzgsNyArOTQwLDYgQEAKIAkJCQkJICgodW4tPnVuX2ZsYWdzICYgVU5fRU1QVFkpID09IDApKTsKIH0KIAotCiAvKiBDaGFubmVsIGxvY2sgTVVTVCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24hICovCiBzdGF0aWMgdm9pZCBjbHNfZmx1c2hfdWFydF93cml0ZShzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKQEAgLTk5Miw3ICs5NTMsNiBAQAogCWNoLT5jaF9mbGFncyB8PSAoQ0hfVFhfRklGT19FTVBUWSB8IENIX1RYX0ZJRk9fTFdNKTsKIH0KIAotCiAvKiBDaGFubmVsIGxvY2sgTVVTVCBiZSBoZWxkIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24hICovCiBzdGF0aWMgdm9pZCBjbHNfZmx1c2hfdWFydF9yZWFkKHN0cnVjdCBjaGFubmVsX3QgKmNoKQogewpAQCAtMTAxMyw3ICs5NzMsNiBAQAogCXVkZWxheSgxMCk7CiB9CiAKLQogc3RhdGljIHZvaWQgY2xzX2NvcHlfZGF0YV9mcm9tX3F1ZXVlX3RvX3VhcnQoc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJdXNob3J0IGhlYWQ7CkBAIC0xMDI5LDIyICs5ODgsMTYgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKIAogCS8qIE5vIGRhdGEgdG8gd3JpdGUgdG8gdGhlIFVBUlQgKi8KLQlpZiAoY2gtPmNoX3dfdGFpbCA9PSBjaC0+Y2hfd19oZWFkKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9CisJaWYgKGNoLT5jaF93X3RhaWwgPT0gY2gtPmNoX3dfaGVhZCkKKwkJZ290byBleGl0X3VubG9jazsKIAogCS8qIElmIHBvcnQgaXMgInN0b3BwZWQiLCBkb24ndCBzZW5kIGFueSBkYXRhIHRvIHRoZSBVQVJUICovCiAJaWYgKChjaC0+Y2hfZmxhZ3MgJiBDSF9GT1JDRURfU1RPUCkgfHwKLQkJCQkgKGNoLT5jaF9mbGFncyAmIENIX0JSRUFLX1NFTkRJTkcpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9CisJCQkJIChjaC0+Y2hfZmxhZ3MgJiBDSF9CUkVBS19TRU5ESU5HKSkKKwkJZ290byBleGl0X3VubG9jazsKIAotCWlmICghKGNoLT5jaF9mbGFncyAmIChDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQorCWlmICghKGNoLT5jaF9mbGFncyAmIChDSF9UWF9GSUZPX0VNUFRZIHwgQ0hfVFhfRklGT19MV00pKSkKKwkJZ290byBleGl0X3VubG9jazsKIAogCW4gPSAzMjsKIApAQCAtMTA5NCwxMCArMTA0NywxMCBAQAogCWlmIChsZW5fd3JpdHRlbiA+IDApCiAJCWNoLT5jaF9mbGFncyAmPSB+KENIX1RYX0ZJRk9fRU1QVFkgfCBDSF9UWF9GSUZPX0xXTSk7CiAKK2V4aXRfdW5sb2NrOgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiB9CiAKLQogc3RhdGljIHZvaWQgY2xzX3BhcnNlX21vZGVtKHN0cnVjdCBjaGFubmVsX3QgKmNoLCB1bnNpZ25lZCBjaGFyIHNpZ25hbHMpCiB7CiAJdW5zaWduZWQgY2hhciBtc2lnbmFscyA9IHNpZ25hbHM7CkBAIC0xMTYyLDcgKzExMTUsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiB9CiAKLQogLyogTWFrZSB0aGUgVUFSVCByYWlzZSBhbnkgb2YgdGhlIG91dHB1dCBzaWduYWxzIHdlIHdhbnQgdXAgKi8KIHN0YXRpYyB2b2lkIGNsc19hc3NlcnRfbW9kZW1fc2lnbmFscyhzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKQEAgLTExODIsNyArMTEzNCw2IEBACiAJdWRlbGF5KDEwKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBjbHNfc2VuZF9zdGFydF9jaGFyYWN0ZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQpAQCAtMTE5NCw3ICsxMTQ1LDYgQEAKIAl9CiB9CiAKLQogc3RhdGljIHZvaWQgY2xzX3NlbmRfc3RvcF9jaGFyYWN0ZXIoc3RydWN0IGNoYW5uZWxfdCAqY2gpCiB7CiAJaWYgKCFjaCB8fCBjaC0+bWFnaWMgIT0gREdOQ19DSEFOTkVMX01BR0lDKQpAQCAtMTIwNiw3ICsxMTU2LDYgQEAKIAl9CiB9CiAKLQogLyogSW5pdHMgVUFSVCAqLwogc3RhdGljIHZvaWQgY2xzX3VhcnRfaW5pdChzdHJ1Y3QgY2hhbm5lbF90ICpjaCkKIHsKQEAgLTEyNDQsNyArMTE5Myw2IEBACiAJcmVhZGIoJmNoLT5jaF9jbHNfdWFydC0+bXNyKTsKIH0KIAotCiAvKgogICogVHVybnMgb2ZmIFVBUlQuCiAgKi8KQEAgLTEyNTMsNyArMTIwMSw2IEBACiAJd3JpdGViKDAsICZjaC0+Y2hfY2xzX3VhcnQtPmllcik7CiB9CiAKLQogLyoKICAqIGNsc19nZXRfdWFydHNfYnl0ZXNfbGVmdC4KICAqIFJldHVybnMgMCBpcyBub3RoaW5nIGxlZnQgaW4gdGhlIEZJRk8sIHJldHVybnMgMSBvdGhlcndpc2UuCkBAIC0xMjgzLDcgKzEyMzAsNiBAQAogCXJldHVybiBsZWZ0OwogfQogCi0KIC8qCiAgKiBjbHNfc2VuZF9icmVhay4KICAqIFN0YXJ0cyBzZW5kaW5nIGEgYnJlYWsgdGhydSB0aGUgVUFSVC4KQEAgLTEzMjYsNyArMTI3Miw2IEBACiAJfQogfQogCi0KIC8qCiAgKiBjbHNfc2VuZF9pbW1lZGlhdGVfY2hhci4KICAqIFNlbmRzIGEgc3BlY2lmaWMgY2hhcmFjdGVyIGFzIHNvb24gYXMgcG9zc2libGUgdG8gdGhlIFVBUlQsCkBAIC0xMzQ4LDcgKzEyOTMsNiBAQAogCXU4IF9faW9tZW0gICAgICAgICAgICpyZV9tYXBfdnBkYmFzZTsvKiBSZW1hcHBlZCBtZW1vcnkgb2YgdGhlIGNhcmQgKi8KIAlpbnQgaSA9IDA7CiAKLQogCXZwZGJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoYnJkLT5wZGV2LCAzKTsKIAogCS8qIE5vIFZQRCAqLwpAQCAtMTM3MCw0ICsxMzE0LDMgQEAKIAlpZiAocmVfbWFwX3ZwZGJhc2UpCiAJCWlvdW5tYXAocmVfbWFwX3ZwZGJhc2UpOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5oIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19jbHMuaAppbmRleCA0NjVkNzlhLi4yNTk3ZTM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2Nscy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfY2xzLmgKQEAgLTExLDIxICsxMSwxMSBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICoKICAqLwogCiAjaWZuZGVmIF9fREdOQ19DTFNfSAogI2RlZmluZSBfX0RHTkNfQ0xTX0gKIAotI2luY2x1ZGUgImRnbmNfdHlwZXMuaCIKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBQZXIgY2hhbm5lbC9wb3J0IENsYXNzaWMgVUFSVCBzdHJ1Y3R1cmUJCQkJKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzUsMTUgKzI1LDI1IEBACiAgKgkJCVUgPSBVbnVzZWQuCQkJCQkqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKgorICogdHhyeCAgICA6IFdSIFJIUi9USFIgLSBIb2xkaW5nIHJlZworICogaWVyICAgICA6IFdSIElFUiAtIEludGVycnVwdCBFbmFibGUgUmVnCisgKiBpc3JfZmNyIDogV1IgSVNSL0ZDUiAtIEludGVycnVwdCBTdGF0dXMgUmVnL0ZpZm8gQ29udHJvbCBSZWcKKyAqIGxjciAgICAgOiBXUiBMQ1IgLSBMaW5lIENvbnRyb2wgUmVnCisgKiBtY3IgICAgIDogV1IgTUNSIC0gTW9kZW0gQ29udHJvbCBSZWcKKyAqIGxzciAgICAgOiBXUiBMU1IgLSBMaW5lIFN0YXR1cyBSZWcKKyAqIG1zciAgICAgOiBXUiBNU0cgLSBNb2RlbSBTdGF0dXMgUmVnCisgKiBzcHIgICAgIDogV1IgU1BSIC0gU2NyYXRjaCBwYWQgUmVnCisgKi8KIHN0cnVjdCBjbHNfdWFydF9zdHJ1Y3QgewotCXU4IHR4cng7CQkvKiBXUiAgUkhSL1RIUiAtIEhvbGRpbmcgUmVnICovCi0JdTggaWVyOwkJLyogV1IgIElFUiAtIEludGVycnVwdCBFbmFibGUgUmVnICovCi0JdTggaXNyX2ZjcjsJCS8qIFdSICBJU1IvRkNSIC0gSW50ZXJydXB0IFN0YXR1cyBSZWcvRmlmbyBDb250cm9sIFJlZyAqLwotCXU4IGxjcjsJCS8qIFdSICBMQ1IgLSBMaW5lIENvbnRyb2wgUmVnICovCi0JdTggbWNyOwkJLyogV1IgIE1DUiAtIE1vZGVtIENvbnRyb2wgUmVnICovCi0JdTggbHNyOwkJLyogV1IgIExTUiAtIExpbmUgU3RhdHVzIFJlZyAqLwotCXU4IG1zcjsJCS8qIFdSICBNU1IgLSBNb2RlbSBTdGF0dXMgUmVnICovCi0JdTggc3ByOwkJLyogV1IgIFNQUiAtIFNjcmF0Y2ggUGFkIFJlZyAqLworCXU4IHR4cng7CisJdTggaWVyOworCXU4IGlzcl9mY3I7CisJdTggbGNyOworCXU4IG1jcjsKKwl1OCBsc3I7CisJdTggbXNyOworCXU4IHNwcjsKIH07CiAKIC8qIFdoZXJlIHRvIHJlYWQgdGhlIGludGVycnVwdCByZWdpc3RlciAoOGJpdHMpICovCkBAIC01MSwxOCArNTEsMTUgQEAKIAogI2RlZmluZSBVQVJUX0VYQVI2NTRfRU5IQU5DRURfUkVHSVNURVJfU0VUIDB4QkYKIAotI2RlZmluZSBVQVJUXzE2NjU0X0ZDUl9UWFRSSUdHRVJfOAkweDAKICNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfVFhUUklHR0VSXzE2CTB4MTAKLSNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfVFhUUklHR0VSXzMyCTB4MjAKLSNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfVFhUUklHR0VSXzU2CTB4MzAKLQotI2RlZmluZSBVQVJUXzE2NjU0X0ZDUl9SWFRSSUdHRVJfOAkweDAKICNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfUlhUUklHR0VSXzE2CTB4NDAKICNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfUlhUUklHR0VSXzU2CTB4ODAKLSNkZWZpbmUgVUFSVF8xNjY1NF9GQ1JfUlhUUklHR0VSXzYwICAgICAweEMwCiAKLSNkZWZpbmUgVUFSVF9JSVJfQ1RTUlRTCQkJMHgyMAkvKiBSZWNlaXZlZCBDVFMvUlRTIGNoYW5nZSBvZiBzdGF0ZSAqLwotI2RlZmluZSBVQVJUX0lJUl9SRElfVElNRU9VVAkJMHgwQyAgICAvKiBSZWNlaXZlciBkYXRhIFRJTUVPVVQgKi8KKy8qIFJlY2VpdmVkIENUUy9SVFMgY2hhbmdlIG9mIHN0YXRlICovCisjZGVmaW5lIFVBUlRfSUlSX0NUU1JUUwkJCTB4MjAKKworLyogUmVjZWl2ZXIgZGF0YSBUSU1FT1VUICovCisjZGVmaW5lIFVBUlRfSUlSX1JESV9USU1FT1VUCQkweDBDCiAKIC8qCiAgKiBUaGVzZSBhcmUgdGhlIEVYVEVOREVEIGRlZmluaXRpb25zIGZvciB0aGUgRXhhciA2NTQncyBJbnRlcnJ1cHQKQEAgLTczLDEwICs3MCw2IEBACiAjZGVmaW5lIFVBUlRfRVhBUjY1NF9FRlJfSVhPRkYgICAgMHg4ICAgICAvKiBUcmFuc21pdCBYb24xL1hvZmYxICovCiAjZGVmaW5lIFVBUlRfRVhBUjY1NF9FRlJfUlRTRFRSICAgMHg0MCAgICAvKiBBdXRvIFJUUy9EVFIgRmxvdyBDb250cm9sIEVuYWJsZSAqLwogI2RlZmluZSBVQVJUX0VYQVI2NTRfRUZSX0NUU0RTUiAgIDB4ODAgICAgLyogQXV0byBDVFMvRFNSIEZsb3cgQ09udHJvbCBFbmFibGUgKi8KLQotI2RlZmluZSBVQVJUX0VYQVI2NTRfWE9GRl9ERVRFQ1QgIDB4MSAgICAgLyogSW5kaWNhdGVzIHdoZXRoZXIgY2hpcCBzYXcgYW4gaW5jb21pbmcgWE9GRiBjaGFyICAqLwotI2RlZmluZSBVQVJUX0VYQVI2NTRfWE9OX0RFVEVDVCAgIDB4MiAgICAgLyogSW5kaWNhdGVzIHdoZXRoZXIgY2hpcCBzYXcgYW4gaW5jb21pbmcgWE9OIGNoYXIgKi8KLQogI2RlZmluZSBVQVJUX0VYQVI2NTRfSUVSX1hPRkYgICAgIDB4MjAgICAgLyogWG9mZiBJbnRlcnJ1cHQgRW5hYmxlICovCiAjZGVmaW5lIFVBUlRfRVhBUjY1NF9JRVJfUlRTRFRSICAgMHg0MCAgICAvKiBPdXRwdXQgSW50ZXJydXB0IEVuYWJsZSAqLwogI2RlZmluZSBVQVJUX0VYQVI2NTRfSUVSX0NUU0RTUiAgIDB4ODAgICAgLyogSW5wdXQgSW50ZXJydXB0IEVuYWJsZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmMKaW5kZXggZjE3N2QzYS4uODA1ZGM2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5jCkBAIC0xMSwyMiArMTEsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCi0gKglOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEKLSAqCi0gKglUaGlzIGlzIHNoYXJlZCBjb2RlIGJldHdlZW4gRGlnaSdzIENWUyBhcmNoaXZlIGFuZCB0aGUKLSAqCUxpbnV4IEtlcm5lbCBzb3VyY2VzLgotICoJQ2hhbmdpbmcgdGhlIHNvdXJjZSBqdXN0IGZvciByZWZvcm1hdHRpbmcgbmVlZGxlc3NseSBicmVha3MKLSAqCW91ciBDVlMgZGlmZiBoaXN0b3J5LgotICoKLSAqCVNlbmQgYW55IGJ1ZyBmaXhlcy9jaGFuZ2VzIHRvOiAgRW5nLkxpbnV4IGF0IGRpZ2kgZG90IGNvbS4KLSAqCVRoYW5rIHlvdS4KLSAqCiAgKi8KIAogCkBAIC0zNyw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlICJkZ25jX2RyaXZlci5oIgogI2luY2x1ZGUgImRnbmNfcGNpLmgiCi0jaW5jbHVkZSAiZHBhY29tcGF0LmgiCiAjaW5jbHVkZSAiZGduY19tZ210LmgiCiAjaW5jbHVkZSAiZGduY190dHkuaCIKICNpbmNsdWRlICJkZ25jX2Nscy5oIgpAQCAtNjAsNyArNDMsOCBAQAogc3RhdGljIGludAkJZGduY19mb3VuZF9ib2FyZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGlkKTsKIHN0YXRpYyB2b2lkCQlkZ25jX2NsZWFudXBfYm9hcmQoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCk7CiBzdGF0aWMgdm9pZAkJZGduY19wb2xsX2hhbmRsZXIodWxvbmcgZHVtbXkpOwotc3RhdGljIGludAkJZGduY19pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CitzdGF0aWMgaW50CQlkZ25jX2luaXRfb25lKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpOwogc3RhdGljIHZvaWQJCWRnbmNfZG9fcmVtYXAoc3RydWN0IGRnbmNfYm9hcmQgKmJyZCk7CiAKIC8qCkBAIC05Miw4ICs3Niw4IEBACiAgKiBQb2xsZXIgc3R1ZmYKICAqLwogc3RhdGljIERFRklORV9TUElOTE9DSyhkZ25jX3BvbGxfbG9jayk7IC8qIFBvbGwgc2NoZWR1bGluZyBsb2NrICovCi1zdGF0aWMgdWxvbmcJCWRnbmNfcG9sbF90aW1lOwkJCQkvKiBUaW1lIG9mIG5leHQgcG9sbCAqLwotc3RhdGljIHVpbnQJCWRnbmNfcG9sbF9zdG9wOwkJCQkvKiBVc2VkIHRvIHRlbGwgcG9sbGVyIHRvIHN0b3AgKi8KK3N0YXRpYyB1bG9uZwkJZGduY19wb2xsX3RpbWU7IC8qIFRpbWUgb2YgbmV4dCBwb2xsICovCitzdGF0aWMgdWludAkJZGduY19wb2xsX3N0b3A7IC8qIFVzZWQgdG8gdGVsbCBwb2xsZXIgdG8gc3RvcCAqLwogc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRnbmNfcG9sbF90aW1lcjsKIAogCkBAIC0xMzksMTQgKzEyMyw2IEBACiAJLmlkX3RhYmxlICAgICAgID0gZGduY19wY2lfdGJsLAogfTsKIAotCi1jaGFyICpkZ25jX3N0YXRlX3RleHRbXSA9IHsKLQkiQm9hcmQgRmFpbGVkIiwKLQkiQm9hcmQgRm91bmQiLAotCSJCb2FyZCBSRUFEWSIsCi19OwotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBEcml2ZXIgbG9hZC91bmxvYWQgZnVuY3Rpb25zCkBAIC0yMTQsNyArMTkwLDcgQEAKIAkgKiBJZiBzb21ldGhpbmcgd2VudCB3cm9uZyBpbiB0aGUgc2NhbiwgYmFpbCBvdXQgb2YgZHJpdmVyLgogCSAqLwogCWlmIChyYyA8IDApIHsKLQkJLyogT25seSB1bnJlZ2lzdGVyIHRoZSBwY2kgZHJpdmVyIGlmIGl0IHdhcyBhY3R1YWxseSByZWdpc3RlcmVkLiAqLworCQkvKiBPbmx5IHVucmVnaXN0ZXIgaWYgaXQgd2FzIGFjdHVhbGx5IHJlZ2lzdGVyZWQuICovCiAJCWlmIChkZ25jX051bUJvYXJkcykKIAkJCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmZGduY19kcml2ZXIpOwogCQllbHNlCkBAIC0yNTEsOSArMjI3LDkgQEAKIAkgKiBSZWdpc3RlciBtYW5hZ2VtZW50L2RwYSBkZXZpY2VzCiAJICovCiAJcmMgPSByZWdpc3Rlcl9jaHJkZXYoMCwgImRnbmMiLCAmZGduY19Cb2FyZEZvcHMpOwotCWlmIChyYyA8PSAwKSB7CisJaWYgKHJjIDwgMCkgewogCQlwcl9lcnIoRFJWU1RSICI6IENhbid0IHJlZ2lzdGVyIGRnbmMgZHJpdmVyIGRldmljZSAoJWQpXG4iLCByYyk7Ci0JCXJldHVybiAtRU5YSU87CisJCXJldHVybiByYzsKIAl9CiAJZGduY19NYWpvciA9IHJjOwogCkBAIC0yODUsOSArMjYxLDcgQEAKIAogCS8qIFN0YXJ0IHRoZSBwb2xsZXIgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGduY19wb2xsX2xvY2ssIGZsYWdzKTsKLQlpbml0X3RpbWVyKCZkZ25jX3BvbGxfdGltZXIpOwotCWRnbmNfcG9sbF90aW1lci5mdW5jdGlvbiA9IGRnbmNfcG9sbF9oYW5kbGVyOwotCWRnbmNfcG9sbF90aW1lci5kYXRhID0gMDsKKwlzZXR1cF90aW1lcigmZGduY19wb2xsX3RpbWVyLCBkZ25jX3BvbGxfaGFuZGxlciwgMCk7CiAJZGduY19wb2xsX3RpbWUgPSBqaWZmaWVzICsgZGduY19qaWZmaWVzX2Zyb21fbXMoZGduY19wb2xsX3RpY2spOwogCWRnbmNfcG9sbF90aW1lci5leHBpcmVzID0gZGduY19wb2xsX3RpbWU7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGduY19wb2xsX2xvY2ssIGZsYWdzKTsKQEAgLTM2NCw3ICszMzgsNyBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZkZ25jX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAJCWJyZC0+bXNnYnVmID0gTlVMTDsKLQkJcHJpbnRrKCIlcyIsIGJyZC0+bXNnYnVmX2hlYWQpOworCQlkZXZfZGJnKCZicmQtPnBkZXYtPmRldiwgIiVzXG4iLCBicmQtPm1zZ2J1Zl9oZWFkKTsKIAkJa2ZyZWUoYnJkLT5tc2didWZfaGVhZCk7CiAJCWJyZC0+bXNnYnVmX2hlYWQgPSBOVUxMOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZ25jX2dsb2JhbF9sb2NrLCBmbGFncyk7CkBAIC00MTAsNyArMzg0LDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAkvKiBtYWtlIGEgdGVtcG9yYXJ5IG1lc3NhZ2UgYnVmZmVyIGZvciB0aGUgYm9vdCBtZXNzYWdlcyAqLwotCWJyZC0+bXNnYnVmX2hlYWQgPSBremFsbG9jKHNpemVvZih1OCkgKiA4MTkyLCBHRlBfS0VSTkVMKTsKKwlicmQtPm1zZ2J1Zl9oZWFkID0ga2NhbGxvYyg4MTkyLCBzaXplb2YodTgpLCBHRlBfS0VSTkVMKTsKIAlicmQtPm1zZ2J1ZiA9IGJyZC0+bXNnYnVmX2hlYWQ7CiAKIAlpZiAoIWJyZC0+bXNnYnVmKSB7CkBAIC01NTMsNyArNTI3LDcgQEAKIAogCQlpZiAoYnJkLT5yZV9tYXBfbWVtYmFzZSkgewogCi0JCQkvKiBBZnRlciByZW1hcCBpcyBjb21wbGV0ZSwgd2UgbmVlZCB0byByZWFkIGFuZCBzdG9yZSB0aGUgZHZpZCAqLworCQkJLyogUmVhZCBhbmQgc3RvcmUgdGhlIGR2aWQgYWZ0ZXIgcmVtYXBwaW5nICovCiAJCQlicmQtPmR2aWQgPSByZWFkYihicmQtPnJlX21hcF9tZW1iYXNlICsgMHg4RCk7CiAKIAkJCS8qIEdldCBhbmQgc3RvcmUgdGhlIGJvYXJkIFZQRCwgaWYgaXQgZXhpc3RzICovCkBAIC01NzQsMjkgKzU0OCwxOSBAQAogCiAJcmMgPSBkZ25jX3R0eV9yZWdpc3RlcihicmQpOwogCWlmIChyYyA8IDApIHsKLQkJZGduY190dHlfdW5pbml0KGJyZCk7CiAJCXByX2VycihEUlZTVFIgIjogQ2FuJ3QgcmVnaXN0ZXIgdHR5IGRldmljZXMgKCVkKVxuIiwgcmMpOwotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAlyYyA9IGRnbmNfZmluYWxpemVfYm9hcmRfaW5pdChicmQpOwogCWlmIChyYyA8IDApIHsKIAkJcHJfZXJyKERSVlNUUiAiOiBDYW4ndCBmaW5hbGl6ZSBib2FyZCBpbml0ICglZClcbiIsIHJjKTsKLQkJYnJkLT5zdGF0ZSA9IEJPQVJEX0ZBSUxFRDsKLQkJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKLQogCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAlyYyA9IGRnbmNfdHR5X2luaXQoYnJkKTsKIAlpZiAocmMgPCAwKSB7Ci0JCWRnbmNfdHR5X3VuaW5pdChicmQpOwogCQlwcl9lcnIoRFJWU1RSICI6IENhbid0IGluaXQgdHR5IGRldmljZXMgKCVkKVxuIiwgcmMpOwotCQlicmQtPnN0YXRlID0gQk9BUkRfRkFJTEVEOwotCQlicmQtPmRwYXN0YXR1cyA9IEJEX05PRkVQOwotCiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNjA2LDExICs1NzAsMTMgQEAKIAlkZ25jX2NyZWF0ZV9wb3J0c19zeXNmaWxlcyhicmQpOwogCiAJLyogaW5pdCBvdXIgcG9sbCBoZWxwZXIgdGFza2xldCAqLwotCXRhc2tsZXRfaW5pdCgmYnJkLT5oZWxwZXJfdGFza2xldCwgYnJkLT5iZF9vcHMtPnRhc2tsZXQsICh1bnNpZ25lZCBsb25nKSBicmQpOworCXRhc2tsZXRfaW5pdCgmYnJkLT5oZWxwZXJfdGFza2xldCwKKwkJICAgICBicmQtPmJkX29wcy0+dGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZykgYnJkKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZ25jX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAJYnJkLT5tc2didWYgPSBOVUxMOwotCXByaW50aygiJXMiLCBicmQtPm1zZ2J1Zl9oZWFkKTsKKwlkZXZfZGJnKCZicmQtPnBkZXYtPmRldiwgIiVzXG4iLCBicmQtPm1zZ2J1Zl9oZWFkKTsKIAlrZnJlZShicmQtPm1zZ2J1Zl9oZWFkKTsKIAlicmQtPm1zZ2J1Zl9oZWFkID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZ25jX2dsb2JhbF9sb2NrLCBmbGFncyk7CkBAIC02MjgsNiArNTk0LDkgQEAKIAlyZXR1cm4gMDsKIAogZmFpbGVkOgorCWRnbmNfdHR5X3VuaW5pdChicmQpOworCWJyZC0+c3RhdGUgPSBCT0FSRF9GQUlMRUQ7CisJYnJkLT5kcGFzdGF0dXMgPSBCRF9OT0ZFUDsKIAogCXJldHVybiAtRU5YSU87CiAKQEAgLTcwOCw3ICs2NzcsNyBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZicmQtPmJkX2xvY2ssIGZsYWdzKTsKIAotCQkvKiBJZiBib2FyZCBpcyBpbiBhIGZhaWxlZCBzdGF0ZSwgZG9uJ3QgYm90aGVyIHNjaGVkdWxpbmcgYSB0YXNrbGV0ICovCisJCS8qIElmIGJvYXJkIGlzIGluIGEgZmFpbGVkIHN0YXRlIGRvbid0IHNjaGVkdWxlIGEgdGFza2xldCAqLwogCQlpZiAoYnJkLT5zdGF0ZSA9PSBCT0FSRF9GQUlMRUQpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZC0+YmRfbG9jaywgZmxhZ3MpOwogCQkJY29udGludWU7CkBAIC03MjksMTEgKzY5OCw5IEBACiAJbmV3X3RpbWUgPSBkZ25jX3BvbGxfdGltZSAtIGppZmZpZXM7CiAKIAlpZiAoKHVsb25nKSBuZXdfdGltZSA+PSAyICogZGduY19wb2xsX3RpY2spCi0JCWRnbmNfcG9sbF90aW1lID0gamlmZmllcyArICBkZ25jX2ppZmZpZXNfZnJvbV9tcyhkZ25jX3BvbGxfdGljayk7CisJCWRnbmNfcG9sbF90aW1lID0gamlmZmllcyArIGRnbmNfamlmZmllc19mcm9tX21zKGRnbmNfcG9sbF90aWNrKTsKIAotCWluaXRfdGltZXIoJmRnbmNfcG9sbF90aW1lcik7Ci0JZGduY19wb2xsX3RpbWVyLmZ1bmN0aW9uID0gZGduY19wb2xsX2hhbmRsZXI7Ci0JZGduY19wb2xsX3RpbWVyLmRhdGEgPSAwOworCXNldHVwX3RpbWVyKCZkZ25jX3BvbGxfdGltZXIsIGRnbmNfcG9sbF9oYW5kbGVyLCAwKTsKIAlkZ25jX3BvbGxfdGltZXIuZXhwaXJlcyA9IGRnbmNfcG9sbF90aW1lOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRnbmNfcG9sbF9sb2NrLCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmggYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2RyaXZlci5oCmluZGV4IGE4MTU3ZWIuLmY3N2ZlZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfZHJpdmVyLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19kcml2ZXIuaApAQCAtMTIsMTIgKzEyLDYgQEAKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogRHJpdmVyIGluY2x1ZGVzCkBAIC0zMSw5ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CSAgLyogVG8gcGljayB1cCB0aGUgdmFyaW91cyB0dHkgc3RydWN0cy9kZWZpbmVzICovCiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CS8qIEZvciBpcnFyZXR1cm5fdCB0eXBlICovCiAKLSNpbmNsdWRlICJkZ25jX3R5cGVzLmgiCQkvKiBBZGRpdGlvbmFsIHR5cGVzIG5lZWRlZCBieSB0aGUgRGlnaSBoZWFkZXIgZmlsZXMgKi8KICNpbmNsdWRlICJkaWdpLmgiCQkvKiBEaWdpIHNwZWNpZmljIGlvY3RsIGhlYWRlciAqLwotI2luY2x1ZGUgImRnbmNfa2NvbXBhdC5oIgkvKiBLZXJuZWwgMi40LzIuNiBjb21wYXQgaW5jbHVkZXMgKi8KICNpbmNsdWRlICJkZ25jX3N5c2ZzLmgiCQkvKiBTdXBwb3J0IGZvciBTWVNGUyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDYsNiArMzgsNyBAQAogI2RlZmluZQlQUk9DU1RSCQkiZGduYyIJCQkvKiAvcHJvYyBlbnRyaWVzCSAqLwogI2RlZmluZQlERVZTVFIJCSIvZGV2L2RnL2RnbmMiCQkvKiAvZGV2IGVudHJpZXMJCSAqLwogI2RlZmluZQlEUlZTVFIJCSJkZ25jIgkJCS8qIERyaXZlciBuYW1lIHN0cmluZwkgKi8KKyNkZWZpbmUJREdfUEFSVAkJIjQwMDAyMzY5X0YiCQkvKiBSUE0gcGFydCBudW1iZXIJICovCiAKICNkZWZpbmUgVFJDX1RPX0NPTlNPTEUgMQogCkBAIC0yMTEsOCArMjA0LDggQEAKIAlzdHJ1Y3QgdHR5X2RyaXZlcglQcmludERyaXZlcjsKIAljaGFyCQlQcmludE5hbWVbMjAwXTsKIAotCXVpbnQJCWRnbmNfTWFqb3JfU2VyaWFsX1JlZ2lzdGVyZWQ7Ci0JdWludAkJZGduY19NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQ7CisJYm9vbAkJZGduY19NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZDsKKwlib29sCQlkZ25jX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZDsKIAogCXVpbnQJCWRnbmNfU2VyaWFsX01ham9yOwogCXVpbnQJCWRnbmNfVHJhbnNwYXJlbnRQcmludF9NYWpvcjsKQEAgLTM5OCwxMSArMzkxLDEwIEBACiAvKgogICogT3VyIEdsb2JhbCBWYXJpYWJsZXMuCiAgKi8KLWV4dGVybiB1aW50CQlkZ25jX01ham9yOwkJLyogT3VyIGRyaXZlci9tZ210IG1ham9yCSovCi1leHRlcm4gaW50CQlkZ25jX3BvbGxfdGljazsJCS8qIFBvbGwgaW50ZXJ2YWwgLSAyMCBtcwkqLwotZXh0ZXJuIHNwaW5sb2NrX3QJZGduY19nbG9iYWxfbG9jazsJLyogRHJpdmVyIGdsb2JhbCBzcGlubG9jawkqLwotZXh0ZXJuIHVpbnQJCWRnbmNfTnVtQm9hcmRzOwkJLyogVG90YWwgbnVtYmVyIG9mIGJvYXJkcwkqLwotZXh0ZXJuIHN0cnVjdCBkZ25jX2JvYXJkCSpkZ25jX0JvYXJkW01BWEJPQVJEU107CS8qIEFycmF5IG9mIGJvYXJkIHN0cnVjdHMJKi8KLWV4dGVybiBjaGFyCQkqZGduY19zdGF0ZV90ZXh0W107CS8qIEFycmF5IG9mIHN0YXRlIHRleHQJCSovCitleHRlcm4gdWludAkJZGduY19NYWpvcjsJCS8qIE91ciBkcml2ZXIvbWdtdCBtYWpvciAqLworZXh0ZXJuIGludAkJZGduY19wb2xsX3RpY2s7CQkvKiBQb2xsIGludGVydmFsIC0gMjAgbXMgKi8KK2V4dGVybiBzcGlubG9ja190CWRnbmNfZ2xvYmFsX2xvY2s7CS8qIERyaXZlciBnbG9iYWwgc3BpbmxvY2sgKi8KK2V4dGVybiB1aW50CQlkZ25jX051bUJvYXJkczsJCS8qIFRvdGFsIG51bWJlciBvZiBib2FyZHMgKi8KK2V4dGVybiBzdHJ1Y3QgZGduY19ib2FyZAkqZGduY19Cb2FyZFtNQVhCT0FSRFNdOwkvKiBBcnJheSBvZiBib2FyZCBzdHJ1Y3RzICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19rY29tcGF0LmggYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2tjb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2Y2FkMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX2tjb21wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNCBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqICAgICAgU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gY29udGFpbiBhbGwgdGhlIGtlcm5lbCAiZGlmZmVyZW5jZXMiIGJldHdlZW4gdGhlCi0gKiB2YXJpb3VzIGtlcm5lbHMgdGhhdCB3ZSBzdXBwb3J0LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fREdOQ19LQ09NUEFUX0gKLSNkZWZpbmUgX19ER05DX0tDT01QQVRfSAotCi0jaWYgIWRlZmluZWQoVFRZX0ZMSVBCVUZfU0laRSkKLSMgZGVmaW5lIFRUWV9GTElQQlVGX1NJWkUgNTEyCi0jZW5kaWYKLQotCi0vKiBTcGFyc2Ugc3R1ZmYgKi8KLSMgaWZuZGVmIF9fdXNlcgotIyAgZGVmaW5lIF9fdXNlcgotIyAgZGVmaW5lIF9fa2VybmVsCi0jICBkZWZpbmUgX19zYWZlCi0jICBkZWZpbmUgX19mb3JjZQotIyAgZGVmaW5lIF9fY2hrX3VzZXJfcHRyKHgpICh2b2lkKTAKLSMgZW5kaWYKLQotCi0jZW5kaWYgLyogISBfX0RHTkNfS0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX21nbXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5jCmluZGV4IDU1NDRhOGUuLmIxMzMxOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5jCkBAIC0xMSwyMiArMTEsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCi0gKglOT1RFIFRPIExJTlVYIEtFUk5FTCBIQUNLRVJTOiAgRE8gTk9UIFJFRk9STUFUIFRISVMgQ09ERSEKLSAqCi0gKglUaGlzIGlzIHNoYXJlZCBjb2RlIGJldHdlZW4gRGlnaSdzIENWUyBhcmNoaXZlIGFuZCB0aGUKLSAqCUxpbnV4IEtlcm5lbCBzb3VyY2VzLgotICoJQ2hhbmdpbmcgdGhlIHNvdXJjZSBqdXN0IGZvciByZWZvcm1hdHRpbmcgbmVlZGxlc3NseSBicmVha3MKLSAqCW91ciBDVlMgZGlmZiBoaXN0b3J5LgotICoKLSAqCVNlbmQgYW55IGJ1ZyBmaXhlcy9jaGFuZ2VzIHRvOiAgRW5nLkxpbnV4IGF0IGRpZ2kgZG90IGNvbS4KLSAqCVRoYW5rIHlvdS4KLSAqCiAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDYsOSArMzAsNyBAQAogCiAjaW5jbHVkZSAiZGduY19kcml2ZXIuaCIKICNpbmNsdWRlICJkZ25jX3BjaS5oIgotI2luY2x1ZGUgImRnbmNfa2NvbXBhdC5oIgkvKiBLZXJuZWwgMi40LzIuNiBjb21wYXQgaW5jbHVkZXMgKi8KICNpbmNsdWRlICJkZ25jX21nbXQuaCIKLSNpbmNsdWRlICJkcGFjb21wYXQuaCIKIAogCiAvKiBPdXIgImluIHVzZSIgdmFyaWFibGVzLCB0byBlbmZvcmNlIDEgb3BlbiBvbmx5ICovCkBAIC0xNTMsOCArMTM1LDcgQEAKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZicmQsIHVhcmcsIHNpemVvZihpbnQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwogCi0JCWlmICgoYnJkIDwgMCkgfHwgKGJyZCA+IGRnbmNfTnVtQm9hcmRzKSB8fAotCQkgICAgKGRnbmNfTnVtQm9hcmRzID09IDApKQorCQlpZiAoYnJkIDwgMCB8fCBicmQgPj0gZGduY19OdW1Cb2FyZHMpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAogCQltZW1zZXQoJmRpLCAwLCBzaXplb2YoZGkpKTsKQEAgLTE5NiwxMSArMTc3LDExIEBACiAJCWNoYW5uZWwgPSBuaS5jaGFubmVsOwogCiAJCS8qIFZlcmlmeSBib3VuZGFyaWVzIG9uIGJvYXJkICovCi0JCWlmICgoYm9hcmQgPiBkZ25jX051bUJvYXJkcykgfHwgKGRnbmNfTnVtQm9hcmRzID09IDApKQorCQlpZiAoYm9hcmQgPj0gZGduY19OdW1Cb2FyZHMpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAogCQkvKiBWZXJpZnkgYm91bmRhcmllcyBvbiBjaGFubmVsICovCi0JCWlmICgoY2hhbm5lbCA8IDApIHx8IChjaGFubmVsID4gZGduY19Cb2FyZFtib2FyZF0tPm5hc3luYykpCisJCWlmIChjaGFubmVsID49IGRnbmNfQm9hcmRbYm9hcmRdLT5uYXN5bmMpCiAJCQlyZXR1cm4gLUVOT0RFVjsKIAogCQljaCA9IGRnbmNfQm9hcmRbYm9hcmRdLT5jaGFubmVsc1tjaGFubmVsXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbWdtdC5oIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19tZ210LmgKaW5kZXggNTY3ZjY4Ny4uNzA4YWJlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19tZ210LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19tZ210LmgKQEAgLTExLDEyICsxMSw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQogICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCiAgKi8KIAogI2lmbmRlZiBfX0RHTkNfTUdNVF9ICmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uYwppbmRleCBjOWE4YTk4Li5mNWE0ZDM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbmVvLmMKQEAgLTExLDIyICsxMSw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQogICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoKLSAqCU5PVEUgVE8gTElOVVggS0VSTkVMIEhBQ0tFUlM6ICBETyBOT1QgUkVGT1JNQVQgVEhJUyBDT0RFIQotICoKLSAqCVRoaXMgaXMgc2hhcmVkIGNvZGUgYmV0d2VlbiBEaWdpJ3MgQ1ZTIGFyY2hpdmUgYW5kIHRoZQotICoJTGludXggS2VybmVsIHNvdXJjZXMuCi0gKglDaGFuZ2luZyB0aGUgc291cmNlIGp1c3QgZm9yIHJlZm9ybWF0dGluZyBuZWVkbGVzc2x5IGJyZWFrcwotICoJb3VyIENWUyBkaWZmIGhpc3RvcnkuCi0gKgotICoJU2VuZCBhbnkgYnVnIGZpeGVzL2NoYW5nZXMgdG86ICBFbmcuTGludXggYXQgZGlnaSBkb3QgY29tLgotICoJVGhhbmsgeW91LgotICoKICAqLwogCiAKQEAgLTExOSw3ICsxMDMsNyBAQAogCiAJLyogVHVybiBvbiBhdXRvIENUUyBmbG93IGNvbnRyb2wgKi8KICNpZiAxCi0JaWVyIHw9IChVQVJUXzE3MTU4X0lFUl9DVFNEU1IpOworCWllciB8PSBVQVJUXzE3MTU4X0lFUl9DVFNEU1I7CiAjZWxzZQogCWllciAmPSB+KFVBUlRfMTcxNThfSUVSX0NUU0RTUik7CiAjZW5kaWYKQEAgLTEyNyw3ICsxMTEsNyBAQAogCWVmciB8PSAoVUFSVF8xNzE1OF9FRlJfRUNCIHwgVUFSVF8xNzE1OF9FRlJfQ1RTRFNSKTsKIAogCS8qIFR1cm4gb2ZmIGF1dG8gWG9uIGZsb3cgY29udHJvbCAqLwotCWVmciAmPSB+KFVBUlRfMTcxNThfRUZSX0lYT04pOworCWVmciAmPSB+VUFSVF8xNzE1OF9FRlJfSVhPTjsKIAogCS8qIFdoeT8gQmVjdXogRXhhcidzIHNwZWMgc2F5cyB3ZSBoYXZlIHRvIHplcm8gaXQgb3V0IGJlZm9yZSBzZXR0aW5nIGl0ICovCiAJd3JpdGViKDAsICZjaC0+Y2hfbmVvX3VhcnQtPmVmcik7CkBAIC0xNTUsMTUgKzEzOSwxNSBAQAogCiAJLyogVHVybiBvbiBhdXRvIFJUUyBmbG93IGNvbnRyb2wgKi8KICNpZiAxCi0JaWVyIHw9IChVQVJUXzE3MTU4X0lFUl9SVFNEVFIpOworCWllciB8PSBVQVJUXzE3MTU4X0lFUl9SVFNEVFI7CiAjZWxzZQogCWllciAmPSB+KFVBUlRfMTcxNThfSUVSX1JUU0RUUik7CiAjZW5kaWYKIAllZnIgfD0gKFVBUlRfMTcxNThfRUZSX0VDQiB8IFVBUlRfMTcxNThfRUZSX1JUU0RUUik7CiAKIAkvKiBUdXJuIG9mZiBhdXRvIFhvZmYgZmxvdyBjb250cm9sICovCi0JaWVyICY9IH4oVUFSVF8xNzE1OF9JRVJfWE9GRik7Ci0JZWZyICY9IH4oVUFSVF8xNzE1OF9FRlJfSVhPRkYpOworCWllciAmPSB+VUFSVF8xNzE1OF9JRVJfWE9GRjsKKwllZnIgJj0gflVBUlRfMTcxNThfRUZSX0lYT0ZGOwogCiAJLyogV2h5PyBCZWN1eiBFeGFyJ3Mgc3BlYyBzYXlzIHdlIGhhdmUgdG8gemVybyBpdCBvdXQgYmVmb3JlIHNldHRpbmcgaXQgKi8KIAl3cml0ZWIoMCwgJmNoLT5jaF9uZW9fdWFydC0+ZWZyKTsKQEAgLTE4NSw3ICsxNjksNyBAQAogCSAqIFJUUy9EVFIjIG91dHB1dCBwaW4gKE1DUiBiaXQtMCBvciAxIHRvIGxvZ2ljIDEgYWZ0ZXIKIAkgKiBpdCBpcyBlbmFibGVkLgogCSAqLwotCWNoLT5jaF9tb3N0YXQgfD0gKFVBUlRfTUNSX1JUUyk7CisJY2gtPmNoX21vc3RhdCB8PSBVQVJUX01DUl9SVFM7CiAKIAluZW9fcGNpX3Bvc3RpbmdfZmx1c2goY2gtPmNoX2JkKTsKIH0KQEAgLTE5Nyw4ICsxODEsOCBAQAogCXVuc2lnbmVkIGNoYXIgZWZyID0gcmVhZGIoJmNoLT5jaF9uZW9fdWFydC0+ZWZyKTsKIAogCS8qIFR1cm4gb2ZmIGF1dG8gQ1RTIGZsb3cgY29udHJvbCAqLwotCWllciAmPSB+KFVBUlRfMTcxNThfSUVSX0NUU0RTUik7Ci0JZWZyICY9IH4oVUFSVF8xNzE1OF9FRlJfQ1RTRFNSKTsKKwlpZXIgJj0gflVBUlRfMTcxNThfSUVSX0NUU0RTUjsKKwllZnIgJj0gflVBUlRfMTcxNThfRUZSX0NUU0RTUjsKIAogCS8qIFR1cm4gb24gYXV0byBYb24gZmxvdyBjb250cm9sICovCiAJZWZyIHw9IChVQVJUXzE3MTU4X0VGUl9FQ0IgfCBVQVJUXzE3MTU4X0VGUl9JWE9OKTsKQEAgLTIzNCwxMSArMjE4LDExIEBACiAJdW5zaWduZWQgY2hhciBlZnIgPSByZWFkYigmY2gtPmNoX25lb191YXJ0LT5lZnIpOwogCiAJLyogVHVybiBvZmYgYXV0byBSVFMgZmxvdyBjb250cm9sICovCi0JaWVyICY9IH4oVUFSVF8xNzE1OF9JRVJfUlRTRFRSKTsKLQllZnIgJj0gfihVQVJUXzE3MTU4X0VGUl9SVFNEVFIpOworCWllciAmPSB+VUFSVF8xNzE1OF9JRVJfUlRTRFRSOworCWVmciAmPSB+VUFSVF8xNzE1OF9FRlJfUlRTRFRSOwogCiAJLyogVHVybiBvbiBhdXRvIFhvZmYgZmxvdyBjb250cm9sICovCi0JaWVyIHw9IChVQVJUXzE3MTU4X0lFUl9YT0ZGKTsKKwlpZXIgfD0gVUFSVF8xNzE1OF9JRVJfWE9GRjsKIAllZnIgfD0gKFVBUlRfMTcxNThfRUZSX0VDQiB8IFVBUlRfMTcxNThfRUZSX0lYT0ZGKTsKIAogCS8qIFdoeT8gQmVjdXogRXhhcidzIHNwZWMgc2F5cyB3ZSBoYXZlIHRvIHplcm8gaXQgb3V0IGJlZm9yZSBzZXR0aW5nIGl0ICovCkBAIC0yNzIsMTEgKzI1NiwxMSBAQAogCXVuc2lnbmVkIGNoYXIgZWZyID0gcmVhZGIoJmNoLT5jaF9uZW9fdWFydC0+ZWZyKTsKIAogCS8qIFR1cm4gb2ZmIGF1dG8gUlRTIGZsb3cgY29udHJvbCAqLwotCWllciAmPSB+KFVBUlRfMTcxNThfSUVSX1JUU0RUUik7Ci0JZWZyICY9IH4oVUFSVF8xNzE1OF9FRlJfUlRTRFRSKTsKKwlpZXIgJj0gflVBUlRfMTcxNThfSUVSX1JUU0RUUjsKKwllZnIgJj0gflVBUlRfMTcxNThfRUZSX1JUU0RUUjsKIAogCS8qIFR1cm4gb2ZmIGF1dG8gWG9mZiBmbG93IGNvbnRyb2wgKi8KLQlpZXIgJj0gfihVQVJUXzE3MTU4X0lFUl9YT0ZGKTsKKwlpZXIgJj0gflVBUlRfMTcxNThfSUVSX1hPRkY7CiAJaWYgKGNoLT5jaF9jX2lmbGFnICYgSVhPTikKIAkJZWZyICY9IH4oVUFSVF8xNzE1OF9FRlJfSVhPRkYpOwogCWVsc2UKQEAgLTMxMiwxMiArMjk2LDEyIEBACiAJdW5zaWduZWQgY2hhciBlZnIgPSByZWFkYigmY2gtPmNoX25lb191YXJ0LT5lZnIpOwogCiAJLyogVHVybiBvZmYgYXV0byBDVFMgZmxvdyBjb250cm9sICovCi0JaWVyICY9IH4oVUFSVF8xNzE1OF9JRVJfQ1RTRFNSKTsKLQllZnIgJj0gfihVQVJUXzE3MTU4X0VGUl9DVFNEU1IpOworCWllciAmPSB+VUFSVF8xNzE1OF9JRVJfQ1RTRFNSOworCWVmciAmPSB+VUFSVF8xNzE1OF9FRlJfQ1RTRFNSOwogCiAJLyogVHVybiBvZmYgYXV0byBYb24gZmxvdyBjb250cm9sICovCiAJaWYgKGNoLT5jaF9jX2lmbGFnICYgSVhPRkYpCi0JCWVmciAmPSB+KFVBUlRfMTcxNThfRUZSX0lYT04pOworCQllZnIgJj0gflVBUlRfMTcxNThfRUZSX0lYT047CiAJZWxzZQogCQllZnIgJj0gfihVQVJUXzE3MTU4X0VGUl9FQ0IgfCBVQVJUXzE3MTU4X0VGUl9JWE9OKTsKIApAQCAtNDA3LDcgKzM5MSw3IEBACiAJaWYgKCFicmQgfHwgYnJkLT5tYWdpYyAhPSBER05DX0JPQVJEX01BR0lDKQogCQlyZXR1cm47CiAKLQlpZiAocG9ydCA+IGJyZC0+bWF4cG9ydHMpCisJaWYgKHBvcnQgPj0gYnJkLT5tYXhwb3J0cykKIAkJcmV0dXJuOwogCiAJY2ggPSBicmQtPmNoYW5uZWxzW3BvcnRdOwpAQCAtNTM3LDcgKzUyMSw3IEBACiAJaWYgKCFicmQgfHwgYnJkLT5tYWdpYyAhPSBER05DX0JPQVJEX01BR0lDKQogCQlyZXR1cm47CiAKLQlpZiAocG9ydCA+IGJyZC0+bWF4cG9ydHMpCisJaWYgKHBvcnQgPj0gYnJkLT5tYXhwb3J0cykKIAkJcmV0dXJuOwogCiAJY2ggPSBicmQtPmNoYW5uZWxzW3BvcnRdOwpAQCAtMTAxOSw3ICsxMDAzLDcgQEAKIAkJCSAqLwogCiAJCQkvKiBWZXJpZnkgdGhlIHBvcnQgaXMgaW4gcmFuZ2UuICovCi0JCQlpZiAocG9ydCA+IGJyZC0+bmFzeW5jKQorCQkJaWYgKHBvcnQgPj0gYnJkLT5uYXN5bmMpCiAJCQkJY29udGludWU7CiAKIAkJCWNoID0gYnJkLT5jaGFubmVsc1twb3J0XTsKQEAgLTEyMDMsNyArMTE4Nyw3IEBACiAJCSAqIElCTSBwU2VyaWVzIHBsYXRmb3JtLgogCQkgKiAxNSBieXRlcyBtYXggYXBwZWFycyB0byBiZSB0aGUgbWFnaWMgbnVtYmVyLgogCQkgKi8KLQkJbiA9IG1pbigodWludCkgbiwgKHVpbnQpIDEyKTsKKwkJbiA9IG1pbl90KHVpbnQsIG4sIDEyKTsKIAogCQkvKgogCQkgKiBTaW5jZSB3ZSBhcmUgZ3JhYmJpbmcgdGhlIGxpbmVzdGF0dXMgcmVnaXN0ZXIsIHdoaWNoCkBAIC0xNDM2LDE2ICsxNDIwLDEzIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7CiAKIAkvKiBObyBkYXRhIHRvIHdyaXRlIHRvIHRoZSBVQVJUICovCi0JaWYgKGNoLT5jaF93X3RhaWwgPT0gY2gtPmNoX3dfaGVhZCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQorCWlmIChjaC0+Y2hfd190YWlsID09IGNoLT5jaF93X2hlYWQpCisJCWdvdG8gZXhpdF91bmxvY2s7CiAKIAkvKiBJZiBwb3J0IGlzICJzdG9wcGVkIiwgZG9uJ3Qgc2VuZCBhbnkgZGF0YSB0byB0aGUgVUFSVCAqLwotCWlmICgoY2gtPmNoX2ZsYWdzICYgQ0hfRk9SQ0VEX1NUT1ApIHx8IChjaC0+Y2hfZmxhZ3MgJiBDSF9CUkVBS19TRU5ESU5HKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQorCWlmICgoY2gtPmNoX2ZsYWdzICYgQ0hfRk9SQ0VEX1NUT1ApIHx8CisJCSAoY2gtPmNoX2ZsYWdzICYgQ0hfQlJFQUtfU0VORElORykpCisJCWdvdG8gZXhpdF91bmxvY2s7CiAKIAkvKgogCSAqIElmIEZJRk9zIGFyZSBkaXNhYmxlZC4gU2VuZCBkYXRhIGRpcmVjdGx5IHRvIHR4cnggcmVnaXN0ZXIKQEAgLTE0ODYsMjcgKzE0NjcsMjMgQEAKIAkJCWNoLT5jaF93X3RhaWwgJj0gV1FVRVVFTUFTSzsKIAkJCWNoLT5jaF90eGNvdW50Kys7CiAJCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOworCisJCWdvdG8gZXhpdF91bmxvY2s7CiAJfQogCiAJLyoKIAkgKiBXZSBoYXZlIHRvIGRvIGl0IHRoaXMgd2F5LCBiZWNhdXNlIG9mIHRoZSBFWEFSIFRYRklGTyBjb3VudCBidWcuCiAJICovCiAJaWYgKChjaC0+Y2hfYmQtPmR2aWQgJiAweGYwKSA8IFVBUlRfWFIxN0UxNThfRFZJRCkgewotCQlpZiAoIShjaC0+Y2hfZmxhZ3MgJiAoQ0hfVFhfRklGT19FTVBUWSB8IENIX1RYX0ZJRk9fTFdNKSkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KKwkJaWYgKCEoY2gtPmNoX2ZsYWdzICYgKENIX1RYX0ZJRk9fRU1QVFkgfCBDSF9UWF9GSUZPX0xXTSkpKQorCQkJZ290byBleGl0X3VubG9jazsKIAogCQlsZW5fd3JpdHRlbiA9IDA7CiAKIAkJbiA9IHJlYWRiKCZjaC0+Y2hfbmVvX3VhcnQtPnRmaWZvKTsKIAotCQlpZiAoKHVuc2lnbmVkIGludCkgbiA+IGNoLT5jaF90X3RsZXZlbCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQorCQlpZiAoKHVuc2lnbmVkIGludCkgbiA+IGNoLT5jaF90X3RsZXZlbCkKKwkJCWdvdG8gZXhpdF91bmxvY2s7CiAKIAkJbiA9IFVBUlRfMTcxNThfVFhfRklGT1NJWkUgLSBjaC0+Y2hfdF90bGV2ZWw7CiAJfSBlbHNlIHsKQEAgLTE1NzAsNiArMTU0Nyw3IEBACiAJCWNoLT5jaF9mbGFncyAmPSB+KENIX1RYX0ZJRk9fRU1QVFkgfCBDSF9UWF9GSUZPX0xXTSk7CiAJfQogCitleGl0X3VubG9jazoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5oIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19uZW8uaAppbmRleCAxYTRhYmIxLi5jNTI4ZGY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX25lby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfbmVvLmgKQEAgLTExLDE5ICsxMSwxMSBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCU5PVEU6IFRISVMgSVMgQSBTSEFSRUQgSEVBREVSLiBETyBOT1QgQ0hBTkdFIENPRElORyBTVFlMRSEhIQotICoKICAqLwogCiAjaWZuZGVmIF9fREdOQ19ORU9fSAogI2RlZmluZSBfX0RHTkNfTkVPX0gKIAotI2luY2x1ZGUgImRnbmNfdHlwZXMuaCIKICNpbmNsdWRlICJkZ25jX2RyaXZlci5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3BjaS5oIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19wY2kuaAppbmRleCA1YjZmNzZkLi42MTdkNDBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3BjaS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfcGNpLmgKQEAgLTExLDEyICsxMSw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQogICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCiAgKi8KIAogI2lmbmRlZiBfX0RHTkNfUENJX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfc3lzZnMuYwppbmRleCAyZmQzNGNhLi42NTU1MWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3N5c2ZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19zeXNmcy5jCkBAIC0xMSwyMiArMTEsNiBAQAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZLCBFWFBSRVNTIE9SIElNUExJRUQ7IHdpdGhvdXQgZXZlbiB0aGUKICAqIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICogUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgotICoKLSAqCi0gKiAgICAgIE5PVEUgVE8gTElOVVggS0VSTkVMIEhBQ0tFUlM6ICBETyBOT1QgUkVGT1JNQVQgVEhJUyBDT0RFIQotICoKLSAqICAgICAgVGhpcyBpcyBzaGFyZWQgY29kZSBiZXR3ZWVuIERpZ2kncyBDVlMgYXJjaGl2ZSBhbmQgdGhlCi0gKiAgICAgIExpbnV4IEtlcm5lbCBzb3VyY2VzLgotICogICAgICBDaGFuZ2luZyB0aGUgc291cmNlIGp1c3QgZm9yIHJlZm9ybWF0dGluZyBuZWVkbGVzc2x5IGJyZWFrcwotICogICAgICBvdXIgQ1ZTIGRpZmYgaGlzdG9yeS4KLSAqCi0gKiAgICAgIFNlbmQgYW55IGJ1ZyBmaXhlcy9jaGFuZ2VzIHRvOiAgRW5nLkxpbnV4IGF0IGRpZ2kgZG90IGNvbS4KLSAqICAgICAgVGhhbmsgeW91LgotICoKICAqLwogCiAKQEAgLTkxLDcgKzc1LDcgQEAKIAlyYyB8PSBkcml2ZXJfY3JlYXRlX2ZpbGUoZHJpdmVyZnMsICZkcml2ZXJfYXR0cl9tYXhib2FyZHMpOwogCXJjIHw9IGRyaXZlcl9jcmVhdGVfZmlsZShkcml2ZXJmcywgJmRyaXZlcl9hdHRyX3BvbGxyYXRlKTsKIAlpZiAocmMpCi0JCXByaW50ayhLRVJOX0VSUiAiREdOQzogc3lzZnMgZHJpdmVyX2NyZWF0ZV9maWxlIGZhaWxlZCFcbiIpOworCQlwcl9lcnIoIkRHTkM6IHN5c2ZzIGRyaXZlcl9jcmVhdGVfZmlsZSBmYWlsZWQhXG4iKTsKIH0KIAogCkBAIC0zNjAsNyArMzQ0LDcgQEAKIAlyYyB8PSBkZXZpY2VfY3JlYXRlX2ZpbGUoJihiZC0+cGRldi0+ZGV2KSwgJmRldl9hdHRyX3ZwZCk7CiAJcmMgfD0gZGV2aWNlX2NyZWF0ZV9maWxlKCYoYmQtPnBkZXYtPmRldiksICZkZXZfYXR0cl9zZXJpYWxfbnVtYmVyKTsKIAlpZiAocmMpCi0JCXByaW50ayhLRVJOX0VSUiAiREdOQzogc3lzZnMgZGV2aWNlX2NyZWF0ZV9maWxlIGZhaWxlZCFcbiIpOworCQlkZXZfZXJyKCZiZC0+cGRldi0+ZGV2LCAiZGduYzogc3lzZnMgZGV2aWNlX2NyZWF0ZV9maWxlIGZhaWxlZCFcbiIpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfc3lzZnMuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfc3lzZnMuaAppbmRleCA2OGMwZGU1Li5iZTBmOTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3N5c2ZzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY19zeXNmcy5oCkBAIC0xMSwyMCArMTEsMTMgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCiAgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKICAqLwogCiAjaWZuZGVmIF9fREdOQ19TWVNGU19ICiAjZGVmaW5lIF9fREdOQ19TWVNGU19ICiAKLSNpbmNsdWRlICJkZ25jX2RyaXZlci5oIgotCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSAiZGduY19kcml2ZXIuaCIKIAogc3RydWN0IGRnbmNfYm9hcmQ7CiBzdHJ1Y3QgY2hhbm5lbF90OwpAQCAtNDQsNiArMzcsNCBAQAogZXh0ZXJuIHZvaWQgZGduY19jcmVhdGVfdHR5X3N5c2ZzKHN0cnVjdCB1bl90ICp1biwgc3RydWN0IGRldmljZSAqYyk7CiBleHRlcm4gdm9pZCBkZ25jX3JlbW92ZV90dHlfc3lzZnMoc3RydWN0IGRldmljZSAqYyk7CiAKLQotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5jCmluZGV4IGY4MWEzNzUuLmNlNDE4N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuYwpAQCAtMTEsMjEgKzExLDYgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCiAgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKgotICoJTk9URSBUTyBMSU5VWCBLRVJORUwgSEFDS0VSUzogIERPIE5PVCBSRUZPUk1BVCBUSElTIENPREUhCi0gKgotICoJVGhpcyBpcyBzaGFyZWQgY29kZSBiZXR3ZWVuIERpZ2kncyBDVlMgYXJjaGl2ZSBhbmQgdGhlCi0gKglMaW51eCBLZXJuZWwgc291cmNlcy4KLSAqCUNoYW5naW5nIHRoZSBzb3VyY2UganVzdCBmb3IgcmVmb3JtYXR0aW5nIG5lZWRsZXNzbHkgYnJlYWtzCi0gKglvdXIgQ1ZTIGRpZmYgaGlzdG9yeS4KLSAqCi0gKglTZW5kIGFueSBidWcgZml4ZXMvY2hhbmdlcyB0bzogIEVuZy5MaW51eCBhdCBkaWdpIGRvdCBjb20uCi0gKglUaGFuayB5b3UuCiAgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDQsNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bGludXgvdHR5X2ZsaXAuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9yZWcuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4JLyogRm9yIHVkZWxheSAqLwpAQCAtNTEsMTAgKzM3LDggQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlICJkZ25jX2RyaXZlci5oIgogI2luY2x1ZGUgImRnbmNfdHR5LmgiCi0jaW5jbHVkZSAiZGduY190eXBlcy5oIgogI2luY2x1ZGUgImRnbmNfbmVvLmgiCiAjaW5jbHVkZSAiZGduY19jbHMuaCIKLSNpbmNsdWRlICJkcGFjb21wYXQuaCIKICNpbmNsdWRlICJkZ25jX3N5c2ZzLmgiCiAjaW5jbHVkZSAiZGduY191dGlscy5oIgogCkBAIC0yMzYsNyArMjIwLDcgQEAKIAkJCQkiQ2FuJ3QgcmVnaXN0ZXIgdHR5IGRldmljZSAoJWQpXG4iLCByYyk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KLQkJYnJkLT5kZ25jX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkID0gVFJVRTsKKwkJYnJkLT5kZ25jX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkID0gdHJ1ZTsKIAl9CiAKIAkvKgpAQCAtMjg2LDcgKzI3MCw3IEBACiAJCQkJcmMpOwogCQkJcmV0dXJuIHJjOwogCQl9Ci0JCWJyZC0+ZGduY19NYWpvcl9UcmFuc3BhcmVudFByaW50X1JlZ2lzdGVyZWQgPSBUUlVFOworCQlicmQtPmRnbmNfTWFqb3JfVHJhbnNwYXJlbnRQcmludF9SZWdpc3RlcmVkID0gdHJ1ZTsKIAl9CiAKIAlkZ25jX0JvYXJkc0J5TWFqb3JbYnJkLT5TZXJpYWxEcml2ZXIubWFqb3JdID0gYnJkOwpAQCAtNDI0LDcgKzQwOCw3IEBACiAJCQl0dHlfdW5yZWdpc3Rlcl9kZXZpY2UoJmJyZC0+U2VyaWFsRHJpdmVyLCBpKTsKIAkJfQogCQl0dHlfdW5yZWdpc3Rlcl9kcml2ZXIoJmJyZC0+U2VyaWFsRHJpdmVyKTsKLQkJYnJkLT5kZ25jX01ham9yX1NlcmlhbF9SZWdpc3RlcmVkID0gRkFMU0U7CisJCWJyZC0+ZGduY19NYWpvcl9TZXJpYWxfUmVnaXN0ZXJlZCA9IGZhbHNlOwogCX0KIAogCWlmIChicmQtPmRnbmNfTWFqb3JfVHJhbnNwYXJlbnRQcmludF9SZWdpc3RlcmVkKSB7CkBAIC00MzUsNyArNDE5LDcgQEAKIAkJCXR0eV91bnJlZ2lzdGVyX2RldmljZSgmYnJkLT5QcmludERyaXZlciwgaSk7CiAJCX0KIAkJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKCZicmQtPlByaW50RHJpdmVyKTsKLQkJYnJkLT5kZ25jX01ham9yX1RyYW5zcGFyZW50UHJpbnRfUmVnaXN0ZXJlZCA9IEZBTFNFOworCQlicmQtPmRnbmNfTWFqb3JfVHJhbnNwYXJlbnRQcmludF9SZWdpc3RlcmVkID0gZmFsc2U7CiAJfQogCiAJa2ZyZWUoYnJkLT5TZXJpYWxEcml2ZXIudHR5cyk7CkBAIC01MDcsNyArNDkxLDcgQEAKIHsKIAlzdHJ1Y3QgZGduY19ib2FyZCAqYmQ7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnRwOwotCXN0cnVjdCB0dHlfbGRpc2MgKmxkOworCXN0cnVjdCB0dHlfbGRpc2MgKmxkID0gTlVMTDsKIAl1aW50CXJtYXNrOwogCXVzaG9ydAloZWFkOwogCXVzaG9ydAl0YWlsOwpAQCAtNTM5LDEwICs1MjMsOCBAQAogCXRhaWwgPSBjaC0+Y2hfcl90YWlsICYgcm1hc2s7CiAJZGF0YV9sZW4gPSAoaGVhZCAtIHRhaWwpICYgcm1hc2s7CiAKLQlpZiAoZGF0YV9sZW4gPT0gMCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQorCWlmIChkYXRhX2xlbiA9PSAwKQorCQlnb3RvIGV4aXRfdW5sb2NrOwogCiAJLyoKIAkgKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCBvcGVuLCBvciBDUkVBRCBpcyBvZmYsCkBAIC01NTYsMTcgKzUzOCwxNCBAQAogCQkvKiBGb3JjZSBxdWV1ZSBmbG93IGNvbnRyb2wgdG8gYmUgcmVsZWFzZWQsIGlmIG5lZWRlZCAqLwogCQlkZ25jX2NoZWNrX3F1ZXVlX2Zsb3dfY29udHJvbChjaCk7CiAKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOworCQlnb3RvIGV4aXRfdW5sb2NrOwogCX0KIAogCS8qCiAJICogSWYgd2UgYXJlIHRocm90dGxlZCwgc2ltcGx5IGRvbid0IHJlYWQgYW55IGRhdGEuCiAJICovCi0JaWYgKGNoLT5jaF9mbGFncyAmIENIX0ZPUkNFRF9TVE9QSSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm47Ci0JfQorCWlmIChjaC0+Y2hfZmxhZ3MgJiBDSF9GT1JDRURfU1RPUEkpCisJCWdvdG8gZXhpdF91bmxvY2s7CiAKIAlmbGlwX2xlbiA9IFRUWV9GTElQQlVGX1NJWkU7CiAKQEAgLTYwNCwxMiArNTgzLDggQEAKIAkJfQogCX0KIAotCWlmIChsZW4gPD0gMCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlpZiAobGQpCi0JCQl0dHlfbGRpc2NfZGVyZWYobGQpOwotCQlyZXR1cm47Ci0JfQorCWlmIChsZW4gPD0gMCkKKwkJZ290byBleGl0X3VubG9jazsKIAogCS8qCiAJICogVGhlIHR0eSBsYXllciBpbiB0aGUga2VybmVsIGhhcyBjaGFuZ2VkIGluIDIuNi4xNisuCkBAIC02NzcsNiArNjUyLDEyIEBACiAKIAlpZiAobGQpCiAJCXR0eV9sZGlzY19kZXJlZihsZCk7CisJcmV0dXJuOworCitleGl0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOworCWlmIChsZCkKKwkJdHR5X2xkaXNjX2RlcmVmKGxkKTsKIH0KIAogCkBAIC04ODYsMTAgKzg2Nyw2IEBACiAJCQkJY2gtPmNoX3N0b3BzX3NlbnQrKzsKIAkJCX0KIAkJfQotCQkvKiBObyBGTE9XICovCi0JCWVsc2UgewotCQkJLyogRW1wdHkuLi4gQ2FuJ3QgZG8gYW55dGhpbmcgYWJvdXQgdGhlIGltcGVuZGluZyBvdmVyZmxvdy4uLiAqLwotCQl9CiAJfQogCiAJLyoKQEAgLTEwNjQsNyArMTA0MSw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJyZC0+YmRfbG9jaywgZmxhZ3MpOwogCiAJLyogSWYgb3BlbmVkIGRldmljZSBpcyBncmVhdGVyIHRoYW4gb3VyIG51bWJlciBvZiBwb3J0cywgYmFpbC4gKi8KLQlpZiAoUE9SVF9OVU0obWlub3IpID4gYnJkLT5uYXN5bmMpIHsKKwlpZiAoUE9SVF9OVU0obWlub3IpID49IGJyZC0+bmFzeW5jKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJyZC0+YmRfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVOWElPOwogCX0KQEAgLTE3NzcsMTAgKzE3NTQsOCBAQAogCS8qCiAJICogQmFpbCBpZiBubyBzcGFjZSBsZWZ0LgogCSAqLwotCWlmIChjb3VudCA8PSAwKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoLT5jaF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KKwlpZiAoY291bnQgPD0gMCkKKwkJZ290byBleGl0X3JldHJ5OwogCiAJLyoKIAkgKiBPdXRwdXQgdGhlIHByaW50ZXIgT04gc3RyaW5nLCBpZiB3ZSBhcmUgaW4gdGVybWluYWwgbW9kZSwgYnV0CkBAIC0xODA3LDEwICsxNzgyLDggQEAKIAkvKgogCSAqIElmIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byBjb3B5LCBvciBJIGNhbid0IGhhbmRsZSBhbnkgbW9yZSBkYXRhLCBsZWF2ZS4KIAkgKi8KLQlpZiAoY291bnQgPD0gMCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaC0+Y2hfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKGNvdW50IDw9IDApCisJCWdvdG8gZXhpdF9yZXRyeTsKIAogCWlmIChmcm9tX3VzZXIpIHsKIApAQCAtMTg5Niw2ICsxODY5LDExIEBACiAJfQogCiAJcmV0dXJuIGNvdW50OworCitleGl0X3JldHJ5OgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2gtPmNoX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKIH0KIAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5oIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY190dHkuaAppbmRleCAzOTc1ZjA0Li4yMWQzMzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R0eS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHR5LmgKQEAgLTExLDEyICsxMSw2IEBACiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQogICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCiAgKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICoJTk9URTogVEhJUyBJUyBBIFNIQVJFRCBIRUFERVIuIERPIE5PVCBDSEFOR0UgQ09ESU5HIFNUWUxFISEhCiAgKi8KIAogI2lmbmRlZiBfX0RHTkNfVFRZX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHlwZXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhZmNlZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3R5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMDMgRGlnaSBJbnRlcm5hdGlvbmFsICh3d3cuZGlnaS5jb20pCi0gKglTY290dCBIIEtpbGF1IDxTY290dF9LaWxhdSBhdCBkaWdpIGRvdCBjb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCi0gKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqLwotCi0jaWZuZGVmIF9fREdOQ19UWVBFU19ICi0jZGVmaW5lIF9fREdOQ19UWVBFU19ICi0KLSNpZm5kZWYgVFJVRQotIyBkZWZpbmUgVFJVRSAxCi0jZW5kaWYKLQotI2lmbmRlZiBGQUxTRQotIyBkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY191dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY191dGlscy5jCmluZGV4IDgwYjUxMzMuLmY3NmRlODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdXRpbHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3V0aWxzLmMKQEAgLTE2LDU1ICsxNiwzIEBACiAJc2NoZWR1bGVfdGltZW91dCgobXMgKiBIWikgLyAxMDAwKTsKIAlyZXR1cm4gc2lnbmFsX3BlbmRpbmcoY3VycmVudCk7CiB9Ci0KLS8qCi0gKiAgICAgIGRnbmNfaW9jdGxfbmFtZSgpIDogUmV0dXJucyBhIHRleHQgdmVyc2lvbiBvZiBlYWNoIGlvY3RsIHZhbHVlLgotICovCi1jaGFyICpkZ25jX2lvY3RsX25hbWUoaW50IGNtZCkKLXsKLQlzd2l0Y2ggKGNtZCkgewotCi0JY2FzZSBUQ0dFVEE6CQlyZXR1cm4gIlRDR0VUQSI7Ci0JY2FzZSBUQ0dFVFM6CQlyZXR1cm4gIlRDR0VUUyI7Ci0JY2FzZSBUQ1NFVEE6CQlyZXR1cm4gIlRDU0VUQSI7Ci0JY2FzZSBUQ1NFVFM6CQlyZXR1cm4gIlRDU0VUUyI7Ci0JY2FzZSBUQ1NFVEFXOgkJcmV0dXJuICJUQ1NFVEFXIjsKLQljYXNlIFRDU0VUU1c6CQlyZXR1cm4gIlRDU0VUU1ciOwotCWNhc2UgVENTRVRBRjoJCXJldHVybiAiVENTRVRBRiI7Ci0JY2FzZSBUQ1NFVFNGOgkJcmV0dXJuICJUQ1NFVFNGIjsKLQljYXNlIFRDU0JSSzoJCXJldHVybiAiVENTQlJLIjsKLQljYXNlIFRDWE9OQzoJCXJldHVybiAiVENYT05DIjsKLQljYXNlIFRDRkxTSDoJCXJldHVybiAiVENGTFNIIjsKLQljYXNlIFRJT0NHU0lEOgkJcmV0dXJuICJUSU9DR1NJRCI7Ci0KLQljYXNlIFRJT0NHRVREOgkJcmV0dXJuICJUSU9DR0VURCI7Ci0JY2FzZSBUSU9DU0VURDoJCXJldHVybiAiVElPQ1NFVEQiOwotCWNhc2UgVElPQ0dXSU5TWjoJcmV0dXJuICJUSU9DR1dJTlNaIjsKLQljYXNlIFRJT0NTV0lOU1o6CXJldHVybiAiVElPQ1NXSU5TWiI7Ci0KLQljYXNlIFRJT0NNR0VUOgkJcmV0dXJuICJUSU9DTUdFVCI7Ci0JY2FzZSBUSU9DTVNFVDoJCXJldHVybiAiVElPQ01TRVQiOwotCWNhc2UgVElPQ01CSVM6CQlyZXR1cm4gIlRJT0NNQklTIjsKLQljYXNlIFRJT0NNQklDOgkJcmV0dXJuICJUSU9DTUJJQyI7Ci0KLQkvKiBmcm9tIGRpZ2kuaCAqLwotCWNhc2UgRElHSV9TRVRBOgkJcmV0dXJuICJESUdJX1NFVEEiOwotCWNhc2UgRElHSV9TRVRBVzoJcmV0dXJuICJESUdJX1NFVEFXIjsKLQljYXNlIERJR0lfU0VUQUY6CXJldHVybiAiRElHSV9TRVRBRiI7Ci0JY2FzZSBESUdJX1NFVEZMT1c6CXJldHVybiAiRElHSV9TRVRGTE9XIjsKLQljYXNlIERJR0lfU0VUQUZMT1c6CXJldHVybiAiRElHSV9TRVRBRkxPVyI7Ci0JY2FzZSBESUdJX0dFVEZMT1c6CXJldHVybiAiRElHSV9HRVRGTE9XIjsKLQljYXNlIERJR0lfR0VUQUZMT1c6CXJldHVybiAiRElHSV9HRVRBRkxPVyI7Ci0JY2FzZSBESUdJX0dFVEE6CQlyZXR1cm4gIkRJR0lfR0VUQSI7Ci0JY2FzZSBESUdJX0dFREVMQVk6CXJldHVybiAiRElHSV9HRURFTEFZIjsKLQljYXNlIERJR0lfU0VERUxBWToJcmV0dXJuICJESUdJX1NFREVMQVkiOwotCWNhc2UgRElHSV9HRVRDVVNUT01CQVVEOiByZXR1cm4gIkRJR0lfR0VUQ1VTVE9NQkFVRCI7Ci0JY2FzZSBESUdJX1NFVENVU1RPTUJBVUQ6IHJldHVybiAiRElHSV9TRVRDVVNUT01CQVVEIjsKLQljYXNlIFRJT0NNT0RHOgkJcmV0dXJuICJUSU9DTU9ERyI7Ci0JY2FzZSBUSU9DTU9EUzoJCXJldHVybiAiVElPQ01PRFMiOwotCWNhc2UgVElPQ1NEVFI6CQlyZXR1cm4gIlRJT0NTRFRSIjsKLQljYXNlIFRJT0NDRFRSOgkJcmV0dXJuICJUSU9DQ0RUUiI7Ci0KLQlkZWZhdWx0OgkJcmV0dXJuICJ1bmtub3duIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3V0aWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvZGduYy9kZ25jX3V0aWxzLmgKaW5kZXggY2ViZjYwMS4uMTE2NGMzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGduY191dGlscy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RnbmNfdXRpbHMuaApAQCAtMiw2ICsyLDUgQEAKICNkZWZpbmUgX19ER05DX1VUSUxTX0gKIAogaW50IGRnbmNfbXNfc2xlZXAodWxvbmcgbXMpOwotY2hhciAqZGduY19pb2N0bF9uYW1lKGludCBjbWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RpZ2kuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RpZ2kuaAppbmRleCBkNmUwYjlmLi5kNjM3YTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kaWdpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2RnbmMvZGlnaS5oCkBAIC0xMSwzNiArMTEsMTEgQEAKICAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWSwgRVhQUkVTUyBPUiBJTVBMSUVEOyB3aXRob3V0IGV2ZW4gdGhlCiAgKiBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKICAqIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KLSAqCi0gKglOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKICAqLwogCiAjaWZuZGVmIF9fRElHSV9ICiAjZGVmaW5lIF9fRElHSV9ICiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqKioJRGVmaW5pdGlvbnMgZm9yIERpZ2kgZGl0dHkoMSkgY29tbWFuZC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoKLSAqIENvcHlyaWdodCAoYykgMTk4OC05NiBEaWdpIEludGVybmF0aW9uYWwgSW5jLiwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhcHBsaWNhdGlvbiBhY2Nlc3MgdG8gc3BlY2lhbCBEaWdpCi0gKiBzZXJpYWwgbGluZSBlbmhhbmNlbWVudHMgd2hpY2ggYXJlIG5vdCBzdGFuZGFyZCBVTklYKHRtKSBmZWF0dXJlcy4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiAhZGVmaW5lZChUSU9DTU9ERykKLQotI2RlZmluZQlUSU9DTU9ERwkoKCdkJzw8OCkgfCAyNTApCS8qIGdldCBtb2RlbSBjdHJsIHN0YXRlCSovCi0jZGVmaW5lCVRJT0NNT0RTCSgoJ2QnPDw4KSB8IDI1MSkJLyogc2V0IG1vZGVtIGN0cmwgc3RhdGUJKi8KLQogI2lmbmRlZiBUSU9DTV9MRQogI2RlZmluZQkJVElPQ01fTEUJMHgwMQkJLyogbGluZSBlbmFibGUJCSovCiAjZGVmaW5lCQlUSU9DTV9EVFIJMHgwMgkJLyogZGF0YSB0ZXJtaW5hbCByZWFkeQkqLwpAQCAtNTUsOCArMzAsNiBAQAogI2RlZmluZQkJVElPQ01fQ0QJVElPQ01fQ0FSCS8qIGNhcnJpZXIgZGV0ZWN0IChhbHQpCSovCiAjZW5kaWYKIAotI2VuZGlmCi0KICNpZiAhZGVmaW5lZChUSU9DTVNFVCkKICNkZWZpbmUJVElPQ01TRVQJKCgnZCc8PDgpIHwgMjUyKQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZQkqLwogI2RlZmluZQlUSU9DTUdFVAkoKCdkJzw8OCkgfCAyNTMpCS8qIHNldCBtb2RlbSBjdHJsIHN0YXRlCSovCkBAIC02Nyw4MyArNDAsMjQgQEAKICNkZWZpbmUJVElPQ01CSVMJKCgnZCc8PDgpIHwgMjU1KQkvKiBzZXQgbW9kZW0gY3RybCBzdGF0ZSAqLwogI2VuZGlmCiAKLQotI2lmICFkZWZpbmVkKFRJT0NTRFRSKQotI2RlZmluZQlUSU9DU0RUUgkoKCdlJzw8OCkgfCAwKQkJLyogc2V0IERUUgkJKi8KLSNkZWZpbmUJVElPQ0NEVFIJKCgnZSc8PDgpIHwgMSkJCS8qIGNsZWFyIERUUgkJKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBJb2N0bCBjb21tYW5kIGFyZ3VtZW50cyBmb3IgRElHSSBwYXJhbWV0ZXJzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgRElHSV9HRVRBCSgoJ2UnPDw4KSB8IDk0KQkJLyogUmVhZCBwYXJhbXMJCSovCi0KICNkZWZpbmUgRElHSV9TRVRBCSgoJ2UnPDw4KSB8IDk1KQkJLyogU2V0IHBhcmFtcwkJKi8KICNkZWZpbmUgRElHSV9TRVRBVwkoKCdlJzw8OCkgfCA5NikJCS8qIERyYWluICYgc2V0IHBhcmFtcwkqLwogI2RlZmluZSBESUdJX1NFVEFGCSgoJ2UnPDw4KSB8IDk3KQkJLyogRHJhaW4sIGZsdXNoICYgc2V0IHBhcmFtcyAqLwotCi0jZGVmaW5lIERJR0lfS01FCSgoJ2UnPDw4KSB8IDk4KQkJLyogUmVhZC9Xcml0ZSBIb3N0CSovCi0JCQkJCQkvKiBBZGFwdGVyIE1lbW9yeQkqLwotCi0jZGVmaW5lCURJR0lfR0VURkxPVwkoKCdlJzw8OCkgfCA5OSkJCS8qIEdldCBzdGFydGMvc3RvcGMgZmxvdyAqLwotCQkJCQkJLyogY29udHJvbCBjaGFyYWN0ZXJzCSAqLwotI2RlZmluZQlESUdJX1NFVEZMT1cJKCgnZSc8PDgpIHwgMTAwKQkvKiBTZXQgc3RhcnRjL3N0b3BjIGZsb3cgKi8KLQkJCQkJCS8qIGNvbnRyb2wgY2hhcmFjdGVycwkgKi8KLSNkZWZpbmUJRElHSV9HRVRBRkxPVwkoKCdlJzw8OCkgfCAxMDEpCS8qIEdldCBBdXguIHN0YXJ0Yy9zdG9wYyAqLwotCQkJCQkJLyogZmxvdyBjb250cm9sIGNoYXJzCSAqLwotI2RlZmluZQlESUdJX1NFVEFGTE9XCSgoJ2UnPDw4KSB8IDEwMikJLyogU2V0IEF1eC4gc3RhcnRjL3N0b3BjICovCi0JCQkJCQkvKiBmbG93IGNvbnRyb2wgY2hhcnMJICovCi0KLSNkZWZpbmUgRElHSV9HRURFTEFZCSgoJ2QnPDw4KSB8IDI0NikJLyogR2V0IGVkZWxheSAqLwotI2RlZmluZSBESUdJX1NFREVMQVkJKCgnZCc8PDgpIHwgMjQ3KQkvKiBTZXQgZWRlbGF5ICovCi0KLXN0cnVjdAlkaWdpZmxvd190IHsKLQl1bnNpZ25lZCBjaGFyCXN0YXJ0YzsJCQkJLyogZmxvdyBjbnRsIHN0YXJ0IGNoYXIJKi8KLQl1bnNpZ25lZCBjaGFyCXN0b3BjOwkJCQkvKiBmbG93IGNudGwgc3RvcCBjaGFyCSovCi19OwotCi0KLSNpZmRlZglGTE9XXzIyMDAKLSNkZWZpbmUJRjIyMDBfR0VUQQkoKCdlJzw8OCkgfCAxMDQpCS8qIEdldCAyeDM2IGZsb3cgY250bCBmbGFncyAqLwotI2RlZmluZQlGMjIwMF9TRVRBVwkoKCdlJzw8OCkgfCAxMDUpCS8qIFNldCAyeDM2IGZsb3cgY250bCBmbGFncyAqLwotI2RlZmluZQkJRjIyMDBfTUFTSwkweDAzCQkvKiAyMjAwIGZsb3cgY250bCBiaXQgbWFzayAgKi8KLSNkZWZpbmUJCUZDTlRMXzIyMDAJMHgwMQkJLyogMngzNiB0ZXJtaW5hbCBmbG93IGNudGwgICovCi0jZGVmaW5lCQlQQ05UTF8yMjAwCTB4MDIJCS8qIDJ4MzYgcHJpbnRlciBmbG93IGNudGwgICAqLwotI2RlZmluZQlGMjIwMF9YT04JMHhmOAotI2RlZmluZQlQMjIwMF9YT04JMHhmOQotI2RlZmluZQlGMjIwMF9YT0ZGCTB4ZmEKLSNkZWZpbmUJUDIyMDBfWE9GRgkweGZiCi0KLSNkZWZpbmUJRlhPRkZfTUFTSwkweDAzCQkJLyogMjIwMCBmbG93IHN0YXR1cyBtYXNrICAgICovCi0jZGVmaW5lCVJDVkRfRlhPRkYJMHgwMQkJCS8qIDJ4MzYgVGVybWluYWwgWE9GRiByY3ZkICAqLwotI2RlZmluZQlSQ1ZEX1BYT0ZGCTB4MDIJCQkvKiAyeDM2IFByaW50ZXIgWE9GRiByY3ZkICAgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBWYWx1ZXMgZm9yIGRpZ2lfZmxhZ3MKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIERJR0lfSVhPTgkweDAwMDEJCS8qIEhhbmRsZSBJWE9OIGluIHRoZSBGRVAJKi8KKyNkZWZpbmUgRElHSV9HRVRfTklfSU5GTyAoKCdkJzw8OCkgfCAyNTApIC8qIE5vbi1pbnRlbGxpZ2VudCBzdGF0ZSBpbmZvICovCisjZGVmaW5lIERJR0lfTE9PUEJBQ0sgKCgnZCc8PDgpIHwgMjUyKSAvKgorCQkJCQkqIEVuYWJsZS9kaXNhYmxlIFVBUlQKKwkJCQkJKiBpbnRlcm5hbCBsb29wYmFjaworCQkJCQkqLwogI2RlZmluZSBESUdJX0ZBU1QJMHgwMDAyCQkvKiBGYXN0IGJhdWQgcmF0ZXMJCSovCiAjZGVmaW5lIFJUU1BBQ0UJCTB4MDAwNAkJLyogUlRTIGlucHV0IGZsb3cgY29udHJvbAkqLwogI2RlZmluZSBDVFNQQUNFCQkweDAwMDgJCS8qIENUUyBvdXRwdXQgZmxvdyBjb250cm9sCSovCi0jZGVmaW5lIERTUlBBQ0UJCTB4MDAxMAkJLyogRFNSIG91dHB1dCBmbG93IGNvbnRyb2wJKi8KLSNkZWZpbmUgRENEUEFDRQkJMHgwMDIwCQkvKiBEQ0Qgb3V0cHV0IGZsb3cgY29udHJvbAkqLwotI2RlZmluZSBEVFJQQUNFCQkweDAwNDAJCS8qIERUUiBpbnB1dCBmbG93IGNvbnRyb2wJKi8KICNkZWZpbmUgRElHSV9DT09LCTB4MDA4MAkJLyogQ29va2VkIHByb2Nlc3NpbmcgZG9uZSBpbiBGRVAgKi8KICNkZWZpbmUgRElHSV9GT1JDRURDRAkweDAxMDAJCS8qIEZvcmNlIGNhcnJpZXIJCSovCiAjZGVmaW5lCURJR0lfQUxUUElOCTB4MDIwMAkJLyogQWx0ZXJuYXRlIFJKLTQ1IHBpbiBjb25maWcJKi8KLSNkZWZpbmUJRElHSV9BSVhPTgkweDA0MDAJCS8qIEF1eCBmbG93IGNvbnRyb2wgaW4gZmVwCSovCiAjZGVmaW5lCURJR0lfUFJJTlRFUgkweDA4MDAJCS8qIEhvbGQgcG9ydCBvcGVuIGZvciBmbG93IGNudHJsKi8KLSNkZWZpbmUgRElHSV9QUF9JTlBVVAkweDEwMDAJCS8qIENoYW5nZSBwYXJhbGxlbCBwb3J0IHRvIGlucHV0Ki8KICNkZWZpbmUgRElHSV9EVFJfVE9HR0xFCTB4MjAwMAkJLyogU3VwcG9ydCBEVFIgVG9nZ2xlICAgICAgICAgICAqLwotI2RlZmluZSBESUdJXzQyMgkweDQwMDAJCS8qIGZvciA0MjIvMjMyIHNlbGVjdGFibGUgcGFuZWwgKi8KICNkZWZpbmUgRElHSV9SVFNfVE9HR0xFCTB4ODAwMAkJLyogU3VwcG9ydCBSVFMgVG9nZ2xlCQkqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBUaGVzZSBvcHRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBjb214aS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lCURJR0lfQ09NWEkJKERJR0lfRkFTVHxESUdJX0NPT0t8RFNSUEFDRXxEQ0RQQUNFfERUUlBBQ0UpCi0KICNkZWZpbmUgRElHSV9QTEVOCTI4CQkvKiBTdHJpbmcgbGVuZ3RoCQkqLwogI2RlZmluZQlESUdJX1RTSVoJMTAJCS8qIFRlcm1pbmFsIHN0cmluZyBsZW4JCSovCiAKQEAgLTE2Myw3NiArNzcsNiBAQAogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogS01FIGRlZmluaXRpb25zIGFuZCBzdHJ1Y3R1cmVzLgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUJUldfSURMRQkJMAkvKiBPcGVyYXRpb24gY29tcGxldGUJCQkqLwotI2RlZmluZQlSV19SRUFECQkxCS8qIFJlYWQgQ29uY2VudHJhdG9yIE1lbW9yeQkJKi8KLSNkZWZpbmUJUldfV1JJVEUJMgkvKiBXcml0ZSBDb25jZW50cmF0b3IgTWVtb3J5CQkqLwotCi1zdHJ1Y3QgcndfdCB7Ci0JdW5zaWduZWQgY2hhcglyd19yZXE7CQkvKiBSZXF1ZXN0IHR5cGUJCQkqLwotCXVuc2lnbmVkIGNoYXIJcndfYm9hcmQ7CS8qIEhvc3QgQWRhcHRlciBib2FyZCBudW1iZXIJKi8KLQl1bnNpZ25lZCBjaGFyCXJ3X2NvbmM7CS8qIENvbmNlbnRyYXRvciBudW1iZXIJCSovCi0JdW5zaWduZWQgY2hhcglyd19yZXNlcnZlZDsJLyogUmVzZXJ2ZWQgZm9yIGV4cGFuc2lvbgkqLwotCXVuc2lnbmVkIGludAlyd19hZGRyOwkvKiBBZGRyZXNzIGluIGNvbmNlbnRyYXRvcgkqLwotCXVuc2lnbmVkIHNob3J0CXJ3X3NpemU7CS8qIFJlYWQvd3JpdGUgcmVxdWVzdCBsZW5ndGgJKi8KLQl1bnNpZ25lZCBjaGFyCXJ3X2RhdGFbMTI4XTsJLyogRGF0YSB0byByZWFkL3dyaXRlCQkqLwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTaHJpbmsgQnVmZmVyIGFuZCBCb2FyZCBJbmZvcm1hdGlvbiBkZWZpbml0aW9ucyBhbmQgc3RydWN0dXJlcy4KLQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkJCS8qIEJvYXJkIHR5cGUgcmV0dXJuIGNvZGVzICovCi0jZGVmaW5lCVBDWElfVFlQRSAxICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBQQy9YaSAqLwotI2RlZmluZSBQQ1hNX1RZUEUgMiAgICAgLyogQm9hcmQgdHlwZSBhdCB0aGUgZGVzaWduYXRlZCBwb3J0IGlzIGEgUEMvWG0gKi8KLSNkZWZpbmUJUENYRV9UWVBFIDMgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIFBDL1hlICovCi0jZGVmaW5lCU1DWElfVFlQRSA0ICAgICAvKiBCb2FyZCB0eXBlIGF0IHRoZSBkZXNpZ25hdGVkIHBvcnQgaXMgYSBNQy9YaSAqLwotI2RlZmluZSBDT01YSV9UWVBFIDUgICAgIC8qIEJvYXJkIHR5cGUgYXQgdGhlIGRlc2lnbmF0ZWQgcG9ydCBpcyBhIENPTS9YaSAqLwotCi0JCQkgLyogTm9uLVplcm8gUmVzdWx0IGNvZGVzLiAqLwotI2RlZmluZSBSRVNVTFRfTk9CREZORCAxIC8qIEEgRGlnaSBwcm9kdWN0IGF0IHRoYXQgcG9ydCBpcyBub3QgY29uZmlnIGluc3RhbGxlZCAqLwotI2RlZmluZSBSRVNVTFRfTk9ERVNDVCAyIC8qIEEgbWVtb3J5IGRlc2NyaXB0b3Igd2FzIG5vdCBvYnRhaW5hYmxlICovCi0jZGVmaW5lIFJFU1VMVF9OT09TU0lHIDMgLyogRkVQL09TIHNpZ25hdHVyZSB3YXMgbm90IGRldGVjdGVkIG9uIHRoZSBib2FyZCAqLwotI2RlZmluZSBSRVNVTFRfVE9PU01MICA0IC8qIFRvbyBzbWFsbCBhbiBhcmVhIHRvIHNocmluay4gICovCi0jZGVmaW5lIFJFU1VMVF9OT0NIQU4gIDUgLyogQ2hhbm5lbCBzdHJ1Y3R1cmUgZm9yIHRoZSBib2FyZCB3YXMgbm90IGZvdW5kICovCi0KLXN0cnVjdCBzaHJpbmtfYnVmX3N0cnVjdCB7Ci0JdW5zaWduZWQgaW50CXNocmlua19idWZfdmFkZHI7CS8qIFZpcnR1YWwgYWRkcmVzcyBvZiBib2FyZCAqLwotCXVuc2lnbmVkIGludAlzaHJpbmtfYnVmX3BoeXM7CS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgYm9hcmQgKi8KLQl1bnNpZ25lZCBpbnQJc2hyaW5rX2J1Zl9ic2VnOwkvKiBBbW91bnQgb2YgYm9hcmQgbWVtb3J5ICovCi0JdW5zaWduZWQgaW50CXNocmlua19idWZfaHNlZzsJLyogJzE4NiBCZWdpbm5pbmcgb2YgRHVhbC1Qb3J0ICovCi0KLQl1bnNpZ25lZCBpbnQJc2hyaW5rX2J1Zl9sc2VnOwkvKiAnMTg2IEJlZ2lubmluZyBvZiBmcmVlZCBtZW1vcnkgKi8KLQl1bnNpZ25lZCBpbnQJc2hyaW5rX2J1Zl9tc2VnOwkvKiBMaW5lYXIgYWRkcmVzcyBmcm9tIHN0YXJ0IG9mCi0JCQkJCQkgICBkdWFsLXBvcnQgd2VyZSBmcmVlZCBtZW1vcnkKLQkJCQkJCSAgIGJlZ2lucywgaG9zdCB2aWV3cG9pbnQuICovCi0KLQl1bnNpZ25lZCBpbnQJc2hyaW5rX2J1Zl9iZHBhcmFtOwkvKiBQYXJhbWV0ZXIgZm9yIHh4bWVtb24gYW5kCi0JCQkJCQkgICB4eG1lbW9mZiAqLwotCi0JdW5zaWduZWQgaW50CXNocmlua19idWZfcmVzZXJ2YTsJLyogUmVzZXJ2ZWQgKi8KLQl1bnNpZ25lZCBpbnQJc2hyaW5rX2J1Zl9yZXNlcnZiOwkvKiBSZXNlcnZlZCAqLwotCXVuc2lnbmVkIGludAlzaHJpbmtfYnVmX3Jlc2VydmM7CS8qIFJlc2VydmVkICovCi0JdW5zaWduZWQgaW50CXNocmlua19idWZfcmVzZXJ2ZDsJLyogUmVzZXJ2ZWQgKi8KLQotCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9yZXN1bHQ7CS8qIFJlYXNvbiBmb3IgY2FsbCBmYWlsaW5nCi0JCQkJCQkgICBaZXJvIGlzIEdvb2QgcmV0dXJuICovCi0JdW5zaWduZWQgY2hhcglzaHJpbmtfYnVmX2luaXQ7CS8qIE5vbi1aZXJvIGlmIGl0IGNhdXNlZCBhbgotCQkJCQkJICAgeHhpbml0IGNhbGwuICovCi0KLQl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfYW5wb3J0czsJLyogTnVtYmVyIG9mIGFzeW5jIHBvcnRzICAqLwotCXVuc2lnbmVkIGNoYXIJc2hyaW5rX2J1Zl9zbnBvcnRzOwkvKiBOdW1iZXIgb2Ygc3luYyAgcG9ydHMgKi8KLQl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfdHlwZTsJLyogQm9hcmQgdHlwZSAxID0gUEMvWGksCi0JCQkJCQkJICAgICAgMiA9IFBDL1htLAotCQkJCQkJCSAgICAgIDMgPSBQQy9YZQotCQkJCQkJCSAgICAgIDQgPSBNQy9YaQotCQkJCQkJCSAgICAgIDUgPSBDT01YL2kgKi8KLQl1bnNpZ25lZCBjaGFyCXNocmlua19idWZfY2FyZDsJLyogQ2FyZCBudW1iZXIgKi8KLQotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogU3RydWN0dXJlIHRvIGdldCBkcml2ZXIgc3RhdHVzIGluZm9ybWF0aW9uCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RydWN0IGRpZ2lfZGluZm8gewpAQCAtMjYzLDUyICsxMDcsNiBAQAogCiAjZGVmaW5lCURJR0lfR0VUQkQJKCgnZCc8PDgpIHwgMjQ5KQkvKiBnZXQgYm9hcmQgaW5mbyAgICAgICAgICAqLwogCi1zdHJ1Y3QgZGlnaV9zdGF0IHsKLQl1bnNpZ25lZCBpbnQJaW5mb19jaGFuOwkJLyogQ2hhbm5lbCBudW1iZXIgKDAgYmFzZWQpICAqLwotCXVuc2lnbmVkIGludAlpbmZvX2JyZDsJCS8qIEJvYXJkIG51bWJlciAoMCBiYXNlZCkgICovCi0JdW5zaWduZWQgaW50CWluZm9fY2ZsYWc7CQkvKiBjZmxhZyBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGludAlpbmZvX2lmbGFnOwkJLyogaWZsYWcgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJaW5mb19vZmxhZzsJCS8qIG9mbGFnIGZvciBjaGFubmVsICAgICAgICovCi0JdW5zaWduZWQgaW50CWluZm9fbXN0YXQ7CQkvKiBtc3RhdCBmb3IgY2hhbm5lbCAgICAgICAqLwotCXVuc2lnbmVkIGludAlpbmZvX3R4X2RhdGE7CQkvKiB0eF9kYXRhIGZvciBjaGFubmVsICAgICAgICovCi0JdW5zaWduZWQgaW50CWluZm9fcnhfZGF0YTsJCS8qIHJ4X2RhdGEgZm9yIGNoYW5uZWwgICAgICAgKi8KLQl1bnNpZ25lZCBpbnQJaW5mb19oZmxvdzsJCS8qIGhmbG93IGZvciBjaGFubmVsICAgICAgICovCi0JdW5zaWduZWQgaW50CWluZm9fcmVzZXJ2ZWRbOF07CS8qIGZvciBmdXR1cmUgZXhwYW5zaW9uICAgICovCi19OwotCi0jZGVmaW5lCURJR0lfR0VUU1RBVAkoKCdkJzw8OCkgfCAyNDQpCS8qIGdldCBib2FyZCBpbmZvICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogU3RydWN0dXJlIHVzZWQgd2l0aCBpb2N0bCBjb21tYW5kcyBmb3IgcGVyLWNoYW5uZWwgaW5mb3JtYXRpb24KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGRpZ2lfY2ggewotCXVuc2lnbmVkIGludAlpbmZvX2JkbnVtOwkJLyogQm9hcmQgbnVtYmVyICgwIGJhc2VkKSAgKi8KLQl1bnNpZ25lZCBpbnQJaW5mb19jaGFubmVsOwkJLyogQ2hhbm5lbCBpbmRleCBudW1iZXIgICAgKi8KLQl1bnNpZ25lZCBpbnQJaW5mb19jaF9jZmxhZzsJCS8qIENoYW5uZWwgY2ZsYWcJICAgKi8KLQl1bnNpZ25lZCBpbnQJaW5mb19jaF9pZmxhZzsJCS8qIENoYW5uZWwgaWZsYWcJICAgKi8KLQl1bnNpZ25lZCBpbnQJaW5mb19jaF9vZmxhZzsJCS8qIENoYW5uZWwgb2ZsYWcJICAgKi8KLQl1bnNpZ25lZCBpbnQJaW5mb19jaHNpemU7CQkvKiBDaGFubmVsIHN0cnVjdHVyZSBzaXplICAqLwotCXVuc2lnbmVkIGludAlpbmZvX3NsZWVwX3N0YXQ7CS8qIHNsZWVwIHN0YXR1cwkJICAgKi8KLQlkZXZfdAkJaW5mb19kZXY7CQkvKiBkZXZpY2UgbnVtYmVyCSAgICovCi0JdW5zaWduZWQgY2hhcglpbmZvX2luaXRzdGF0ZTsJCS8qIENoYW5uZWwgaW5pdCBzdGF0ZQkgICAqLwotCXVuc2lnbmVkIGNoYXIJaW5mb19ydW5uaW5nOwkJLyogQ2hhbm5lbCBydW5uaW5nIHN0YXRlICAgKi8KLQlpbnQJCXJlc2VydmVkWzhdOwkJLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLX07Ci0KLS8qCi0qIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2l0aCB0aGUgRElHSV9GRVBDTUQgaW9jdGwgdG8KLSogdGVsbCB0aGUgZHJpdmVyIHdoaWNoIHBvcnQgdG8gc2VuZCB0aGUgY29tbWFuZCBmb3IuCi0qLwotc3RydWN0IGRpZ2lfY21kIHsKLQlpbnQJY21kOwotCWludAl3b3JkOwotCWludAluY21kczsKLQlpbnQJY2hhbjsgLyogY2hhbm5lbCBpbmRleCAoemVybyBiYXNlZCkgKi8KLQlpbnQJYmRpZDsgLyogYm9hcmQgaW5kZXggKHplcm8gYmFzZWQpICovCi19OwotCi0KIHN0cnVjdCBkaWdpX2dldGJ1ZmZlciAvKiBTdHJ1Y3QgZm9yIGhvbGRpbmcgYnVmZmVyIHVzZSBjb3VudHMgKi8KIHsKIAl1bnNpZ25lZCBsb25nIHRJbjsKQEAgLTMyOCw2MyArMTI2LDkgQEAKIAl1bnNpZ25lZCBsb25nIHRieXRlczsJCS8qIG51bWJlciBvZiBieXRlcyB0cmFuc21pdHRlZCBmdWxseSAqLwogfTsKIAotLyoKLSogIGluZm9fc2xlZXBfc3RhdCBkZWZpbmVzCi0qLwotI2RlZmluZSBJTkZPX1JVTldBSVQJMHgwMDAxCi0jZGVmaW5lIElORk9fV09QRU4JMHgwMDAyCi0jZGVmaW5lIElORk9fVFRJT1cJMHgwMDA0Ci0jZGVmaW5lIElORk9fQ0hfUldBSVQJMHgwMDA4Ci0jZGVmaW5lIElORk9fQ0hfV0VNUFRZCTB4MDAxMAotI2RlZmluZSBJTkZPX0NIX1dMT1cJMHgwMDIwCi0jZGVmaW5lIElORk9fWFhCVUZfQlVTWSAweDAwNDAKLQotI2RlZmluZQlESUdJX0dFVENICSgoJ2QnPDw4KSB8IDI0NSkJLyogZ2V0IGJvYXJkIGluZm8gICAgICAgICAgKi8KLQotLyogQm9hcmQgdHlwZSBkZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lCVNVQlRZUEUJCTAwMDcKLSNkZWZpbmUJVF9QQ1hJCQkwMDAwCi0jZGVmaW5lIFRfUENYTQkJMDAwMQotI2RlZmluZSBUX1BDWEUJCTAwMDIKLSNkZWZpbmUgVF9QQ1hSCQkwMDAzCi0jZGVmaW5lIFRfU1AJCTAwMDQKLSNkZWZpbmUgVF9TUF9QTFVTCTAwMDUKLSMJZGVmaW5lIFRfSEVSQwkwMDAwCi0jCWRlZmluZSBUX0hPVQkwMDAxCi0jCWRlZmluZSBUX0xPTgkwMDAyCi0jCWRlZmluZSBUX0NIQQkwMDAzCi0jZGVmaW5lIEZBTUlMWQkJMDA3MAotI2RlZmluZSBUX0NPTVhJCQkwMDAwCi0jZGVmaW5lIFRfUENYWAkJMDAxMAotI2RlZmluZSBUX0NYCQkwMDIwCi0jZGVmaW5lIFRfRVBDCQkwMDMwCi0jZGVmaW5lCVRfUENMSVRFCTAwNDAKLSNkZWZpbmUJVF9TUFhYCQkwMDUwCi0jZGVmaW5lCVRfQVZYWAkJMDA2MAotI2RlZmluZSBUX0RYQgkJMDA3MAotI2RlZmluZSBUX0EyS180XzgJMDA3MAotI2RlZmluZSBCVVNUWVBFCQkwNzAwCi0jZGVmaW5lIFRfSVNBQlVTCTAwMDAKLSNkZWZpbmUgVF9NQ0JVUwkJMDEwMAotI2RlZmluZQlUX0VJU0FCVVMJMDIwMAotI2RlZmluZQlUX1BDSUJVUwkwNDAwCi0KIC8qIEJvYXJkIFN0YXRlIERlZmluaXRpb25zICovCi0KICNkZWZpbmUJQkRfUlVOTklORwkweDAKLSNkZWZpbmUJQkRfUkVBU09OCTB4N2YKLSNkZWZpbmUJQkRfTk9URk9VTkQJMHgxCi0jZGVmaW5lCUJEX05PSU9QT1JUCTB4MgotI2RlZmluZQlCRF9OT01FTQkweDMKLSNkZWZpbmUJQkRfTk9CSU9TCTB4NAogI2RlZmluZQlCRF9OT0ZFUAkweDUKLSNkZWZpbmUJQkRfRkFJTEVECTB4NgotI2RlZmluZSBCRF9BTExPQ0FURUQJMHg3Ci0jZGVmaW5lIEJEX1RSSUJPT1QJMHg4Ci0jZGVmaW5lCUJEX0JBREtNRQkweDgwCi0KLSNkZWZpbmUgRElHSV9TUE9MTCAgICAgICAgICAgICgoJ2QnPDw4KSB8IDI1NCkgIC8qIGNoYW5nZSBwb2xsZXIgcmF0ZSAgICovCiAKICNkZWZpbmUgRElHSV9TRVRDVVNUT01CQVVECV9JT1coJ2UnLCAxMDYsIGludCkJLyogU2V0IGludGVnZXIgYmF1ZCByYXRlICovCiAjZGVmaW5lIERJR0lfR0VUQ1VTVE9NQkFVRAlfSU9SKCdlJywgMTA3LCBpbnQpCS8qIEdldCBpbnRlZ2VyIGJhdWQgcmF0ZSAqLwpAQCAtMzk2LDIwICsxNDAsNDAgQEAKIAogI2RlZmluZSBFVl9PUFUJCTB4MDAwMQkJLyogITxPdXRwdXQgcGF1c2VkIGJ5IGNsaWVudCAqLwogI2RlZmluZSBFVl9PUFMJCTB4MDAwMgkJLyogITxPdXRwdXQgcGF1c2VkIGJ5IHJlcXVsYXIgc3cgZmxvd2N0cmwgKi8KLSNkZWZpbmUgRVZfT1BYCQkweDAwMDQJCS8qICE8T3V0cHV0IHBhdXNlZCBieSBleHRyYSBzdyBmbG93Y3RybCAqLwotI2RlZmluZSBFVl9PUEgJCTB4MDAwOAkJLyogITxPdXRwdXQgcGF1c2VkIGJ5IGh3IGZsb3djdHJsICovCi0jZGVmaW5lIEVWX09QVAkJMHgwODAwCQkvKiAhPE91dHB1dCBwYXVzZWQgZm9yIFJUUyBUb2dnbGUgcHJlZGVsYXkgKi8KLQogI2RlZmluZSBFVl9JUFUJCTB4MDAxMAkJLyogITxJbnB1dCBwYXVzZWQgdW5jb25kaXRpb25hbGx5IGJ5IHVzZXIgKi8KICNkZWZpbmUgRVZfSVBTCQkweDAwMjAJCS8qICE8SW5wdXQgcGF1c2VkIGJ5IGhpZ2gvbG93IHdhdGVyIG1hcmtzICovCi0jZGVmaW5lIEVWX0lQQQkJMHgwNDAwCQkvKiAhPElucHV0IHBhdXNlZCBieSBwYXR0ZXJuIGFsYXJtIG1vZHVsZSAqLwotCiAjZGVmaW5lIEVWX1RYQgkJMHgwMDQwCQkvKiAhPFRyYW5zbWl0IGJyZWFrIHBlbmRpbmcgKi8KLSNkZWZpbmUgRVZfVFhJCQkweDAwODAJCS8qICE8VHJhbnNtaXQgaW1tZWRpYXRlIHBlbmRpbmcgKi8KLSNkZWZpbmUgRVZfVFhGCQkweDAxMDAJCS8qICE8VHJhbnNtaXQgZmxvd2N0cmwgY2hhciBwZW5kaW5nICovCi0jZGVmaW5lIEVWX1JYQgkJMHgwMjAwCQkvKiAhPEJyZWFrIHJlY2VpdmVkICovCiAKLSNkZWZpbmUgRVZfT1BBTEwJMHgwODBmCQkvKiAhPE91dHB1dCBwYXVzZSBmbGFncyAqLwotI2RlZmluZSBFVl9JUEFMTAkweDA0MzAJCS8qICE8SW5wdXQgcGF1c2UgZmxhZ3MgKi8KKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBkYXRhIG5lZWRlZCBmb3IgdGhlIGludGVsbGlnZW50IDwtLT4gbm9uaW50ZWxsaWdlbnQKKyAqIERQQSB0cmFuc2xhdGlvbgorICovCitzdHJ1Y3QgbmlfaW5mbyB7CisJaW50IGJvYXJkOworCWludCBjaGFubmVsOworCWludCBkdHI7CisJaW50IHJ0czsKKwlpbnQgY3RzOworCWludCBkc3I7CisJaW50IHJpOworCWludCBkY2Q7CisJaW50IGN1cnR4OworCWludCBjdXJyeDsKKwl1bnNpZ25lZCBzaG9ydCBpZmxhZzsKKwl1bnNpZ25lZCBzaG9ydCBvZmxhZzsKKwl1bnNpZ25lZCBzaG9ydCBjZmxhZzsKKwl1bnNpZ25lZCBzaG9ydCBsZmxhZzsKKwl1bnNpZ25lZCBpbnQgbXN0YXQ7CisJdW5zaWduZWQgY2hhciBoZmxvdzsKKwl1bnNpZ25lZCBjaGFyIHhtaXRfc3RvcHBlZDsKKwl1bnNpZ25lZCBjaGFyIHJlY3Zfc3RvcHBlZDsKKwl1bnNpZ25lZCBpbnQgYmF1ZDsKK307CiAKKyNkZWZpbmUgVF9DTEFTU0lDIDAwMDIKKyNkZWZpbmUgVF9QQ0lCVVMgMDQwMAorI2RlZmluZSBUX05FT19FWFBSRVNTIDAwMDEKKyNkZWZpbmUgVF9ORU8gMDAwMAorCisjZGVmaW5lIFRUWV9GTElQQlVGX1NJWkUgNTEyCiAjZW5kaWYgLyogRElHSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZGduYy9kcGFjb21wYXQuaCBiL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RwYWNvbXBhdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2NiMzk0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9kZ25jL2RwYWNvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAwMyBEaWdpIEludGVybmF0aW9uYWwgKHd3dy5kaWdpLmNvbSkKLSAqICAgICAgU2NvdHQgSCBLaWxhdSA8U2NvdHRfS2lsYXUgYXQgZGlnaSBkb3QgY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQotICogYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFksIEVYUFJFU1MgT1IgSU1QTElFRDsgd2l0aG91dCBldmVuIHRoZQotICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCi0gKiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0gKgotICogICAgICBOT1RFOiBUSElTIElTIEEgU0hBUkVEIEhFQURFUi4gRE8gTk9UIENIQU5HRSBDT0RJTkcgU1RZTEUhISEKLSAqLwotCi0KLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBkYXRhIG5lZWRlZCBmb3IgdGhlIGludGVsbGlnZW50IDwtLT4gbm9uaW50ZWxsaWdlbnQKLSAqIERQQSB0cmFuc2xhdGlvbgotICovCi1zdHJ1Y3QgbmlfaW5mbyB7Ci0JaW50IGJvYXJkOwotCWludCBjaGFubmVsOwotCWludCBkdHI7Ci0JaW50IHJ0czsKLQlpbnQgY3RzOwotCWludCBkc3I7Ci0JaW50IHJpOwotCWludCBkY2Q7Ci0JaW50IGN1cnR4OwotCWludCBjdXJyeDsKLQl1bnNpZ25lZCBzaG9ydCBpZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCBvZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCBjZmxhZzsKLQl1bnNpZ25lZCBzaG9ydCBsZmxhZzsKLQotCXVuc2lnbmVkIGludCBtc3RhdDsKLQl1bnNpZ25lZCBjaGFyIGhmbG93OwotCi0JdW5zaWduZWQgY2hhciB4bWl0X3N0b3BwZWQ7Ci0JdW5zaWduZWQgY2hhciByZWN2X3N0b3BwZWQ7Ci0KLQl1bnNpZ25lZCBpbnQgYmF1ZDsKLX07Ci0KLSNkZWZpbmUgUldfUkVBRAkJMQotI2RlZmluZSBSV19XUklURSAgICAgICAgMgotI2RlZmluZSBESUdJX0tNRSAgICAgICAgKCgnZSc8PDgpIHwgOTgpICAgICAgICAgLyogUmVhZC9Xcml0ZSBIb3N0ICovCi0KLSNkZWZpbmUgU1VCVFlQRSAgICAgICAgIDAwMDcKLSNkZWZpbmUgVF9QQ1hJICAgICAgICAgIDAwMDAKLSNkZWZpbmUgVF9QQ1hFTSAgICAgICAgIDAwMDEKLSNkZWZpbmUgVF9QQ1hFICAgICAgICAgIDAwMDIKLSNkZWZpbmUgVF9QQ1hSICAgICAgICAgIDAwMDMKLSNkZWZpbmUgVF9TUCAgICAgICAgICAgIDAwMDQKLSNkZWZpbmUgVF9TUF9QTFVTICAgICAgIDAwMDUKLQotI2RlZmluZSBUX0hFUkMgICAwMDAwCi0jZGVmaW5lIFRfSE9VICAgIDAwMDEKLSNkZWZpbmUgVF9MT04gICAgMDAwMgotI2RlZmluZSBUX0NIQSAgICAwMDAzCi0KLSNkZWZpbmUgVF9ORU8JIDAwMDAKLSNkZWZpbmUgVF9ORU9fRVhQUkVTUyAgMDAwMQotI2RlZmluZSBUX0NMQVNTSUMgMDAwMgotCi0jZGVmaW5lIEZBTUlMWSAgICAgICAgICAwMDcwCi0jZGVmaW5lIFRfQ09NWEkgICAgICAgICAwMDAwCi0jZGVmaW5lCVRfTkkJCTAwMDAKLSNkZWZpbmUgVF9QQ1hYICAgICAgICAgIDAwMTAKLSNkZWZpbmUgVF9DWCAgICAgICAgICAgIDAwMjAKLSNkZWZpbmUgVF9FUEMgICAgICAgICAgIDAwMzAKLSNkZWZpbmUgVF9QQ0xJVEUgICAgICAgIDAwNDAKLSNkZWZpbmUgVF9TUFhYICAgICAgICAgIDAwNTAKLSNkZWZpbmUgVF9BVlhYICAgICAgICAgIDAwNjAKLSNkZWZpbmUgVF9EWEIgICAgICAgICAgIDAwNzAKLSNkZWZpbmUgVF9BMktfNF84ICAgICAgIDAwNzAKLQotI2RlZmluZSBCVVNUWVBFICAgICAgICAgMDcwMAotI2RlZmluZSBUX0lTQUJVUyAgICAgICAgMDAwMAotI2RlZmluZSBUX01DQlVTICAgICAgICAgMDEwMAotI2RlZmluZSBUX0VJU0FCVVMgICAgICAgMDIwMAotI2RlZmluZSBUX1BDSUJVUyAgICAgICAgMDQwMAotCi0vKiBCb2FyZCBTdGF0ZSBEZWZpbml0aW9ucyAqLwotCi0jZGVmaW5lIEJEX1JVTk5JTkcgICAgICAweDAKLSNkZWZpbmUgQkRfUkVBU09OICAgICAgIDB4N2YKLSNkZWZpbmUgQkRfTk9URk9VTkQgICAgIDB4MQotI2RlZmluZSBCRF9OT0lPUE9SVCAgICAgMHgyCi0jZGVmaW5lIEJEX05PTUVNICAgICAgICAweDMKLSNkZWZpbmUgQkRfTk9CSU9TICAgICAgIDB4NAotI2RlZmluZSBCRF9OT0ZFUCAgICAgICAgMHg1Ci0jZGVmaW5lIEJEX0ZBSUxFRCAgICAgICAweDYKLSNkZWZpbmUgQkRfQUxMT0NBVEVEICAgIDB4NwotI2RlZmluZSBCRF9UUklCT09UICAgICAgMHg4Ci0jZGVmaW5lIEJEX0JBREtNRSAgICAgICAweDgwCi0KLSNkZWZpbmUgRElHSV9BSVhPTiAgICAgIDB4MDQwMCAgICAgICAgICAvKiBBdXggZmxvdyBjb250cm9sIGluIGZlcCAqLwotCi0vKiBJb2N0bHMgbmVlZGVkIGZvciBkcGEgb3BlcmF0aW9uICovCi0KLSNkZWZpbmUgRElHSV9HRVRERCAgICAgICgoJ2QnPDw4KSB8IDI0OCkgICAgICAgLyogZ2V0IGRyaXZlciBpbmZvICAgICAgKi8KLSNkZWZpbmUgRElHSV9HRVRCRCAgICAgICgoJ2QnPDw4KSB8IDI0OSkgICAgICAgLyogZ2V0IGJvYXJkIGluZm8gICAgICAgKi8KLSNkZWZpbmUgRElHSV9HRVRfTklfSU5GTyAoKCdkJzw8OCkgfCAyNTApCS8qIG5vbmludGVsbGlnZW50IHN0YXRlIHNuZm8gKi8KLQotLyogT3RoZXIgc3BlY2lhbCBpb2N0bHMgKi8KLSNkZWZpbmUgRElHSV9USU1FUklSUSAoKCdkJzw8OCkgfCAyNTEpCQkvKiBFbmFibGUvZGlzYWJsZSBSU19USU1FUiB1c2UgKi8KLSNkZWZpbmUgRElHSV9MT09QQkFDSyAoKCdkJzw8OCkgfCAyNTIpCQkvKiBFbmFibGUvZGlzYWJsZSBVQVJUIGludGVybmFsIGxvb3BiYWNrICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZW14eF91ZGMvZW14eF91ZGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5jCmluZGV4IDRiZTY0NmMuLmZiZjgyYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5jCkBAIC0xMTUsNyArMTE1LDcgQEAKIAlwcl9pbmZvKCI9PT0gJXMoKVxuIiwgX19mdW5jX18pOwogCiAJaWYgKHVkYyA9PSBOVUxMKSB7Ci0JCUVSUigiJXMgdWRjID09IE5VTExcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlcyB1ZGMgPT0gTlVMTFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMDEsNyArMjAxLDcgQEAKIAl1MzIJCW51bSwgYnVmX3R5cGU7CiAJdTMyCQlkYXRhLCBsYXN0X3JhbV9hZHIsIHVzZV9yYW1fc2l6ZTsKIAotCVBUX0VQX1JFR1MJcF9lcF9yZWdzOworCXN0cnVjdCBlcF9yZWdzICpwX2VwX3JlZ3M7CiAKIAlsYXN0X3JhbV9hZHIgPSAoRF9SQU1fU0laRV9DVFJMIC8gc2l6ZW9mKHUzMikpICogMjsKIAl1c2VfcmFtX3NpemUgPSAwOwpAQCAtMzk0LDcgKzM5NCw3IEBACiB7CiAJdTMyCQludW07CiAJdTMyCQlkYXRhOwotCVBUX0ZDX1JFR1MJcHJlZyA9IHVkYy0+cF9yZWdzOworCXN0cnVjdCBmY19yZWdzCSpwcmVnID0gdWRjLT5wX3JlZ3M7CiAKIAlpZiAodWRjLT52YnVzX2FjdGl2ZSA9PSAwKQogCQlyZXR1cm47CQkvKiBWQlVTIE9GRiAqLwpAQCAtNDI1LDcgKzQyNSw3IEBACiAvKiBBYm9ydCBETUEgKi8KIHN0YXRpYyB2b2lkIF9uYnUyc3NfZXBfZG1hX2Fib3J0KHN0cnVjdCBuYnUyc3NfdWRjICp1ZGMsIHN0cnVjdCBuYnUyc3NfZXAgKmVwKQogewotCVBUX0ZDX1JFR1MJcHJlZyA9IHVkYy0+cF9yZWdzOworCXN0cnVjdCBmY19yZWdzCSpwcmVnID0gdWRjLT5wX3JlZ3M7CiAKIAlfbmJ1MnNzX2JpdGNscigmcHJlZy0+RVBfRENSW2VwLT5lcG51bS0xXS5FUF9EQ1IxLCBEQ1IxX0VQbl9SRVFFTik7CiAJbWRlbGF5KERNQV9ESVNBQkxFX1RJTUUpOwkvKiBEQ1IxX0VQbl9SRVFFTiBDbGVhciAqLwpAQCAtNDQzLDcgKzQ0Myw3IEBACiB7CiAJdTMyCQlkYXRhOwogCXUzMgkJbnVtOwotCVBUX0ZDX1JFR1MJcHJlZyA9IHVkYy0+cF9yZWdzOworCXN0cnVjdCBmY19yZWdzCSpwcmVnID0gdWRjLT5wX3JlZ3M7CiAKIAlpZiAobGVuZ3RoID49IHNpemVvZih1MzIpKQogCQlyZXR1cm47CkBAIC01NjcsNyArNTY3LDcgQEAKIAl1MzIJCWk7CiAJaW50CQlucmV0ICAgPSAwOwogCXUzMgkJaVdvcmRMZW5ndGggPSAwOwotCVVTQl9SRUdfQUNDRVNTICpwQnVmMzIgPSAoVVNCX1JFR19BQ0NFU1MgKilwQnVmOworCXVuaW9uIHVzYl9yZWdfYWNjZXNzICpwQnVmMzIgPSAodW5pb24gdXNiX3JlZ19hY2Nlc3MgKilwQnVmOwogCiAJLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCS8qIFJlYWQgTGVuZ3RoICovCkBAIC01OTIsOCArNTkyLDggQEAKIHsKIAl1MzIJCWk7CiAJdTMyCQlpUmVhZFNpemUgPSAwOwotCVVTQl9SRUdfQUNDRVNTICBUZW1wMzI7Ci0JVVNCX1JFR19BQ0NFU1MgKnBCdWYzMiA9IChVU0JfUkVHX0FDQ0VTUyAqKXBCdWY7CisJdW5pb24gdXNiX3JlZ19hY2Nlc3MgIFRlbXAzMjsKKwl1bmlvbiB1c2JfcmVnX2FjY2VzcyAgKnBCdWYzMiA9ICh1bmlvbiB1c2JfcmVnX2FjY2VzcyAqKXBCdWY7CiAKIAlpZiAoKDAgPCBsZW5ndGgpICYmIChsZW5ndGggPCBzaXplb2YodTMyKSkpIHsKIAkJVGVtcDMyLmR3ID0gX25idTJzc19yZWFkbCgmdWRjLT5wX3JlZ3MtPkVQMF9SRUFEKTsKQEAgLTYxMyw3ICs2MTMsNyBAQAogCXUzMgkJaU1heExlbmd0aCAgID0gRVAwX1BBQ0tFVFNJWkU7CiAJdTMyCQlpV29yZExlbmd0aCAgPSAwOwogCXUzMgkJaVdyaXRlTGVuZ3RoID0gMDsKLQlVU0JfUkVHX0FDQ0VTUyAqcEJ1ZjMyID0gKFVTQl9SRUdfQUNDRVNTICopcEJ1ZjsKKwl1bmlvbiB1c2JfcmVnX2FjY2VzcyAgKnBCdWYzMiA9ICh1bmlvbiB1c2JfcmVnX2FjY2VzcyAqKXBCdWY7CiAKIAkvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAJLyogVHJhbnNmZXIgTGVuZ3RoICovCkBAIC02MzgsOCArNjM4LDggQEAKIHN0YXRpYyBpbnQgRVAwX2luX092ZXJCeXRlcyhzdHJ1Y3QgbmJ1MnNzX3VkYyAqdWRjLCB1OCAqcEJ1ZiwgdTMyIGlSZW1haW5TaXplKQogewogCXUzMgkJaTsKLQlVU0JfUkVHX0FDQ0VTUyBUZW1wMzI7Ci0JVVNCX1JFR19BQ0NFU1MgKnBCdWYzMiA9IChVU0JfUkVHX0FDQ0VTUyAqKXBCdWY7CisJdW5pb24gdXNiX3JlZ19hY2Nlc3MgIFRlbXAzMjsKKwl1bmlvbiB1c2JfcmVnX2FjY2VzcyAgKnBCdWYzMiA9ICh1bmlvbiB1c2JfcmVnX2FjY2VzcyAqKXBCdWY7CiAKIAlpZiAoKDAgPCBpUmVtYWluU2l6ZSkgJiYgKGlSZW1haW5TaXplIDwgc2l6ZW9mKHUzMikpKSB7CiAJCWZvciAoaSA9IDAgOyBpIDwgaVJlbWFpblNpemUgOyBpKyspCkBAIC04MDgsNyArODA4LDcgQEAKIAkJcmV0dXJuIDA7CQkvKiBTaG9ydCBQYWNrZXQgVHJhbnNmZXIgRW5kICovCiAKIAlpZiAocmVxLT5yZXEuYWN0dWFsID4gcmVxLT5yZXEubGVuZ3RoKSB7Ci0JCUVSUigiICoqKiBPdmVycnVuIEVycm9yXG4iKTsKKwkJZGV2X2Vycih1ZGMtPmRldiwgIiAqKiogT3ZlcnJ1biBFcnJvclxuIik7CiAJCXJldHVybiAtRU9WRVJGTE9XOwogCX0KIApAQCAtODQwLDcgKzg0MCw3IEBACiAJdTMyCQlidXJzdCA9IDE7CiAJdTMyCQlkYXRhOwogCWludAkJcmVzdWx0ID0gLUVJTlZBTDsKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJaWYgKHJlcS0+ZG1hX2ZsYWcpCiAJCXJldHVybiAxOwkJLyogRE1BIGlzIGZvcndhcmRlZCAqLwpAQCAtOTAwLDEwICs5MDAsMTAgQEAKIAl1MzIJCWk7CiAJdTMyCQlkYXRhOwogCXUzMgkJaVdvcmRMZW5ndGg7Ci0JVVNCX1JFR19BQ0NFU1MJVGVtcDMyOwotCVVTQl9SRUdfQUNDRVNTCSpwQnVmMzI7CisJdW5pb24gdXNiX3JlZ19hY2Nlc3MJVGVtcDMyOworCXVuaW9uIHVzYl9yZWdfYWNjZXNzCSpwQnVmMzI7CiAJaW50CQlyZXN1bHQgPSAwOwotCVBUX0ZDX1JFR1MJcHJlZyA9IHVkYy0+cF9yZWdzOworCXN0cnVjdCBmY19yZWdzCSpwcmVnID0gdWRjLT5wX3JlZ3M7CiAKIAlpZiAocmVxLT5kbWFfZmxhZykKIAkJcmV0dXJuIDE7CQkvKiBETUEgaXMgZm9yd2FyZGVkICovCkBAIC05MTIsNyArOTEyLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlwQnVmZmVyID0gKHU4ICopcmVxLT5yZXEuYnVmOwotCXBCdWYzMiA9IChVU0JfUkVHX0FDQ0VTUyAqKShwQnVmZmVyICsgcmVxLT5yZXEuYWN0dWFsKTsKKwlwQnVmMzIgPSAodW5pb24gdXNiX3JlZ19hY2Nlc3MgKikocEJ1ZmZlciArIHJlcS0+cmVxLmFjdHVhbCk7CiAKIAlpV29yZExlbmd0aCA9IGxlbmd0aCAvIHNpemVvZih1MzIpOwogCWlmIChpV29yZExlbmd0aCA+IDApIHsKQEAgLTk4OCw3ICs5ODgsNyBAQAogCXUzMgkJbnVtOwogCXUzMgkJaVJlY3ZMZW5ndGg7CiAJaW50CQlyZXN1bHQgPSAxOwotCVBUX0ZDX1JFR1MJcHJlZyA9IHVkYy0+cF9yZWdzOworCXN0cnVjdCBmY19yZWdzCSpwcmVnID0gdWRjLT5wX3JlZ3M7CiAKIAlpZiAoZXAtPmVwbnVtID09IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTAyNiw4ICsxMDI2LDggQEAKIAl9CiAKIAlpZiAocmVxLT5yZXEuYWN0dWFsID4gcmVxLT5yZXEubGVuZ3RoKSB7Ci0JCUVSUigiICoqKiBPdmVycnVuIEVycm9yXG4iKTsKLQkJRVJSKCIgKioqIGFjdHVhbCA9ICVkLCBsZW5ndGggPSAlZFxuIiwKKwkJZGV2X2Vycih1ZGMtPmRldiwgIiBPdmVycnVuIEVycm9yXG4iKTsKKwkJZGV2X2Vycih1ZGMtPmRldiwgIiBhY3R1YWwgPSAlZCwgbGVuZ3RoID0gJWRcbiIsCiAJCQlyZXEtPnJlcS5hY3R1YWwsIHJlcS0+cmVxLmxlbmd0aCk7CiAJCXJlc3VsdCA9IC1FT1ZFUkZMT1c7CiAJfQpAQCAtMTA1MSw3ICsxMDUxLDcgQEAKIAl1MzIJCWlXcml0ZUxlbmd0aDsKIAl1MzIJCWRhdGE7CiAJaW50CQlyZXN1bHQgPSAtRUlOVkFMOwotCVBUX0ZDX1JFR1MJcHJlZyA9IHVkYy0+cF9yZWdzOworCXN0cnVjdCBmY19yZWdzCSpwcmVnID0gdWRjLT5wX3JlZ3M7CiAKIAlpZiAocmVxLT5kbWFfZmxhZykKIAkJcmV0dXJuIDE7CQkvKiBETUEgaXMgZm9yd2FyZGVkICovCkBAIC0xMTIzLDE3ICsxMTIzLDE3IEBACiAJdTMyCQlpOwogCXUzMgkJZGF0YTsKIAl1MzIJCWlXb3JkTGVuZ3RoOwotCVVTQl9SRUdfQUNDRVNTCVRlbXAzMjsKLQlVU0JfUkVHX0FDQ0VTUwkqcEJ1ZjMyID0gTlVMTDsKKwl1bmlvbiB1c2JfcmVnX2FjY2VzcwlUZW1wMzI7CisJdW5pb24gdXNiX3JlZ19hY2Nlc3MJKnBCdWYzMiA9IE5VTEw7CiAJaW50CQlyZXN1bHQgPSAwOwotCVBUX0ZDX1JFR1MJcHJlZyA9IHVkYy0+cF9yZWdzOworCXN0cnVjdCBmY19yZWdzCSpwcmVnID0gdWRjLT5wX3JlZ3M7CiAKIAlpZiAocmVxLT5kbWFfZmxhZykKIAkJcmV0dXJuIDE7CQkvKiBETUEgaXMgZm9yd2FyZGVkICovCiAKIAlpZiAobGVuZ3RoID4gMCkgewogCQlwQnVmZmVyID0gKHU4ICopcmVxLT5yZXEuYnVmOwotCQlwQnVmMzIgPSAoVVNCX1JFR19BQ0NFU1MgKikocEJ1ZmZlciArIHJlcS0+cmVxLmFjdHVhbCk7CisJCXBCdWYzMiA9ICh1bmlvbiB1c2JfcmVnX2FjY2VzcyAqKShwQnVmZmVyICsgcmVxLT5yZXEuYWN0dWFsKTsKIAogCQlpV29yZExlbmd0aCA9IGxlbmd0aCAvIHNpemVvZih1MzIpOwogCQlpZiAoaVdvcmRMZW5ndGggPiAwKSB7CkBAIC0xMzQ3LDcgKzEzNDcsNyBAQAogCXU4CQludW0sIGVwbnVtOwogCXUzMgkJZGF0YTsKIAlzdHJ1Y3QgbmJ1MnNzX2VwICplcDsKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJaWYgKChlcF9hZHJzID09IDApIHx8IChlcF9hZHJzID09IDB4ODApKSB7CiAJCWlmIChic3RhbGwpIHsKQEAgLTE0MjYsNyArMTQyNiw3IEBACiAJaWYgKG1vZGUgPiBNQVhfVEVTVF9NT0RFX05VTSkKIAkJcmV0dXJuOwogCi0JcHJfaW5mbygiU0VUIEZFQVRVUkUgOiB0ZXN0IG1vZGUgPSAlZFxuIiwgbW9kZSk7CisJZGV2X2luZm8odWRjLT5kZXYsICJTRVQgRkVBVFVSRSA6IHRlc3QgbW9kZSA9ICVkXG4iLCBtb2RlKTsKIAogCWRhdGEgPSBfbmJ1MnNzX3JlYWRsKCZ1ZGMtPnBfcmVncy0+VVNCX0NPTlRST0wpOwogCWRhdGEgJj0gflRFU1RfRk9SQ0VfRU5BQkxFOwpAQCAtMTQ1NCw3ICsxNDU0LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIFVTQl9ERVZJQ0VfVEVTVF9NT0RFOgotCQl3SW5kZXggPSB3SW5kZXggPj4gODsKKwkJd0luZGV4ID4+PSA4OwogCQlpZiAod0luZGV4IDw9IE1BWF9URVNUX01PREVfTlVNKQogCQkJcmVzdWx0ID0gMDsKIAkJYnJlYWs7CkBAIC0xNDcxLDcgKzE0NzEsNyBAQAogewogCXU4CQllcG51bTsKIAl1MzIJCWRhdGEgPSAwLCBiaXRfZGF0YTsKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJZXBudW0gPSBlcF9hZHJzICYgflVTQl9FTkRQT0lOVF9ESVJfTUFTSzsKIAlpZiAoZXBudW0gPT0gMCkgewpAQCAtMTU2Niw3ICsxNTY2LDcgQEAKIAl1MzIJcmVnZGF0YTsKIAlpbnQJbGltaXRfY250ID0gMDsKIAotCVBUX0ZDX1JFR1MJcHJlZyA9IHVkYy0+cF9yZWdzOworCXN0cnVjdCBmY19yZWdzCSpwcmVnID0gdWRjLT5wX3JlZ3M7CiAKIAlpZiAoZXAtPmRpcmVjdCA9PSBVU0JfRElSX0lOKSB7CiAJCWZvciAobGltaXRfY250ID0gMApAQCAtMTYzOCw3ICsxNjM4LDcgQEAKIAkJX25idTJzc19lcDBfaW5fdHJhbnNmZXIodWRjLCAmdWRjLT5lcFswXSwgJnVkYy0+ZXAwX3JlcSk7CiAKIAl9IGVsc2UgewotCQlFUlIoIioqKiBFcnJvciBHRVRfU1RBVFVTXG4iKTsKKwkJZGV2X2Vycih1ZGMtPmRldiwgIiBFcnJvciBHRVRfU1RBVFVTXG4iKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTY3MSw3ICsxNjcxLDcgQEAKIAlpZiAod1ZhbHVlICE9ICh3VmFsdWUgJiAweDAwN0YpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXdWYWx1ZSA9IHdWYWx1ZSA8PCBVU0JfQURSU19TSElGVDsKKwl3VmFsdWUgPDw9IFVTQl9BRFJTX1NISUZUOwogCiAJX25idTJzc193cml0ZWwoJnVkYy0+cF9yZWdzLT5VU0JfQUREUkVTUywgd1ZhbHVlKTsKIAlfbmJ1MnNzX2NyZWF0ZV9lcDBfcGFja2V0KHVkYywgdWRjLT5lcDBfYnVmLCAwKTsKQEAgLTE4ODUsOCArMTg4NSw4IEBACiAJCQl8IFNUR19FTkRfSU5UIHwgRVAwX09VVF9OVUxMX0lOVCk7CiAKIAlpZiAoc3RhdHVzID09IDApIHsKLQkJcHJfaW5mbygiLS0tICVzIE5vdCBEZWNvZGUgSW50ZXJydXB0XG4iLCBfX2Z1bmNfXyk7Ci0JCXByX2luZm8oIi0tLSBFUDBfU1RBVFVTID0gMHglMDh4XG4iLCBpbnRyKTsKKwkJZGV2X2luZm8odWRjLT5kZXYsICIlcyBOb3QgRGVjb2RlIEludGVycnVwdFxuIiwgX19mdW5jX18pOworCQlkZXZfaW5mbyh1ZGMtPmRldiwgIkVQMF9TVEFUVVMgPSAweCUwOHhcbiIsIGludHIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xOTk0LDcgKzE5OTQsNyBAQAogCWludAlyZXN1bHQgPSAwOwogCXUzMglzdGF0dXM7CiAKLQlQVF9GQ19SRUdTCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJaWYgKHJlcS0+ZG1hX2ZsYWcpCiAJCXJldHVybjsJCS8qIERNQSBpcyBmb3J3YXJkZWQgKi8KQEAgLTIwOTAsNyArMjA5MCw3IEBACiAJdTMyCQludW07CiAJdTMyCQlkbWFjbnQsIGVwX2RtYWNudDsKIAl1MzIJCW1wa3Q7Ci0JUFRfRkNfUkVHUwlwcmVnID0gdWRjLT5wX3JlZ3M7CisJc3RydWN0IGZjX3JlZ3MJKnByZWcgPSB1ZGMtPnBfcmVnczsKIAogCW51bSA9IGVwLT5lcG51bSAtIDE7CiAKQEAgLTIyMjksOCArMjIyOSw3IEBACiAJCXJldHVybiAwOwogCiAJLyogY2FsbGVkIHdpdGggaXJxcyBibG9ja2VkICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7Ci0JCXJlcSA9IGxpc3RfZW50cnkoZXAtPnF1ZXVlLm5leHQsIHN0cnVjdCBuYnUyc3NfcmVxLCBxdWV1ZSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZlcC0+cXVldWUsIHF1ZXVlKSB7CiAJCV9uYnUyc3NfZXBfZG9uZShlcCwgcmVxLCBzdGF0dXMpOwogCX0KIApAQCAtMjI1NywxMSArMjI1Niw2IEBACiB7CiAJdTMyCXJlZ19kdDsKIAotCWlmICghdWRjKSB7Ci0JCUVSUigiJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlpZiAodWRjLT52YnVzX2FjdGl2ZSA9PSAwKQogCQlyZXR1cm4gLUVTSFVURE9XTjsKIApAQCAtMjI5Myw3ICsyMjg3LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiBzdGF0aWMgdm9pZCBfbmJ1MnNzX2ZpZm9fZmx1c2goc3RydWN0IG5idTJzc191ZGMgKnVkYywgc3RydWN0IG5idTJzc19lcCAqZXApCiB7Ci0JUFRfRkNfUkVHUwlwID0gdWRjLT5wX3JlZ3M7CisJc3RydWN0IGZjX3JlZ3MJKnAgPSB1ZGMtPnBfcmVnczsKIAogCWlmICh1ZGMtPnZidXNfYWN0aXZlID09IDApCiAJCXJldHVybjsKQEAgLTIzNTAsNyArMjM0NCw3IEBACiAJCXdhaXRjbnQrKzsKIAkJdWRlbGF5KDEpOwkvKiAxdXMgd2FpdCAqLwogCQlpZiAod2FpdGNudCA9PSBFUENfUExMX0xPQ0tfQ09VTlQpIHsKLQkJCUVSUigiKioqIFJlc2V0IENhbmNlbCBmYWlsZWRcbiIpOworCQkJZGV2X2Vycih1ZGMtPmRldiwgIioqKiBSZXNldCBDYW5jZWwgZmFpbGVkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJfTsKQEAgLTI0MTIsNyArMjQwNiw3IEBACiAJCXVkYy0+bGludXhfc3VzcGVuZGVkID0gMDsKIAogCQlfbmJ1MnNzX3Jlc2V0X2NvbnRyb2xsZXIodWRjKTsKLQkJcHJfaW5mbygiIC0tLS0tIFZCVVMgT0ZGXG4iKTsKKwkJZGV2X2luZm8odWRjLT5kZXYsICIgLS0tLS0gVkJVUyBPRkZcbiIpOwogCiAJCWlmICh1ZGMtPnZidXNfYWN0aXZlID09IDEpIHsKIAkJCS8qIFZCVVMgT0ZGICovCkBAIC0yNDM4LDcgKzI0MzIsNyBAQAogCQlpZiAocmVnX2R0ID09IDApCiAJCQlyZXR1cm47CiAKLQkJcHJfaW5mbygiIC0tLS0tIFZCVVMgT05cbiIpOworCQlkZXZfaW5mbyh1ZGMtPmRldiwgIiAtLS0tLSBWQlVTIE9OXG4iKTsKIAogCQlpZiAodWRjLT5saW51eF9zdXNwZW5kZWQpCiAJCQlyZXR1cm47CkBAIC0yNTM2LDcgKzI1MzAsNyBAQAogCXUzMgllcG51bSwgaW50X2JpdDsKIAogCXN0cnVjdCBuYnUyc3NfdWRjCSp1ZGMgPSAoc3RydWN0IG5idTJzc191ZGMgKilfdWRjOwotCVBUX0ZDX1JFR1MJCXByZWcgPSB1ZGMtPnBfcmVnczsKKwlzdHJ1Y3QgZmNfcmVncwkqcHJlZyA9IHVkYy0+cF9yZWdzOwogCiAJaWYgKGdwaW9fZ2V0X3ZhbHVlKFZCVVNfVkFMVUUpID09IDApIHsKIAkJX25idTJzc193cml0ZWwoJnByZWctPlVTQl9JTlRfU1RBLCB+VVNCX0lOVF9TVEFfUlcpOwpAQCAtMjYxMiwxMyArMjYwNiwxMyBAQAogCXN0cnVjdCBuYnUyc3NfdWRjCSp1ZGM7CiAKIAlpZiAoKF9lcCA9PSBOVUxMKSB8fCAoZGVzYyA9PSBOVUxMKSkgewotCQlFUlIoIiAqKiogJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiAqKiogJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuYnUyc3NfZXAsIGVwKTsKIAlpZiAoKGVwID09IE5VTEwpIHx8IChlcC0+dWRjID09IE5VTEwpKSB7Ci0JCUVSUigiICoqKiAlcywgZXAgPT0gTlVMTCAhIVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiAqKiogJXMsIGVwID09IE5VTEwgISFcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNjI2LDcgKzI2MjAsNyBAQAogCWlmICgoZXBfdHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MKQogCQl8fCAoZXBfdHlwZSA9PSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DKSkgewogCi0JCUVSUigiICoqKiAlcywgYmF0IGJtQXR0cmlidXRlc1xuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiAqKiogJXMsIGJhdCBibUF0dHJpYnV0ZXNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNjM3LDcgKzI2MzEsNyBAQAogCWlmICgodWRjLT5kcml2ZXIgPT0gTlVMTCkKIAkJfHwgKHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSkgewogCi0JCUVSUigiICoqKiAlcywgdWRjICEhXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoZXAtPnVkYy0+ZGV2LCAiICoqKiAlcywgdWRjICEhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRVNIVVRET1dOOwogCX0KIApAQCAtMjY3MiwxMyArMjY2NiwxMyBAQAogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCiAJaWYgKF9lcCA9PSBOVUxMKSB7Ci0JCUVSUigiICoqKiAlcywgYmFkIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiICoqKiAlcywgYmFkIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IG5idTJzc19lcCwgZXApOwogCWlmICgoZXAgPT0gTlVMTCkgfHwgKGVwLT51ZGMgPT0gTlVMTCkpIHsKLQkJRVJSKCIgKioqICVzLCBlcCA9PSBOVUxMICEhXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigidWRjOiAqKiogJXMsIGVwID09IE5VTEwgISFcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNzQyLDEwICsyNzM2LDEwIEBACiAJLyogY2F0Y2ggdmFyaW91cyBib2d1cyBwYXJhbWV0ZXJzICovCiAJaWYgKChfZXAgPT0gTlVMTCkgfHwgKF9yZXEgPT0gTlVMTCkpIHsKIAkJaWYgKF9lcCA9PSBOVUxMKQotCQkJRVJSKCIqKiogJXMgLS0tIF9lcCA9PSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCQlwcl9lcnIoInVkYzogJXMgLS0tIF9lcCA9PSBOVUxMXG4iLCBfX2Z1bmNfXyk7CiAKIAkJaWYgKF9yZXEgPT0gTlVMTCkKLQkJCUVSUigiKioqICVzIC0tLSBfcmVxID09IE5VTExcbiIsIF9fZnVuY19fKTsKKwkJCXByX2VycigidWRjOiAlcyAtLS0gX3JlcSA9PSBOVUxMXG4iLCBfX2Z1bmNfXyk7CiAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjc1NiwxMyArMjc1MCwxMyBAQAogCSAgICAgfHwgIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKSkgewogCiAJCWlmICghX3JlcS0+Y29tcGxldGUpCi0JCQlFUlIoIioqKiAlcyAtLS0gIV9yZXEtPmNvbXBsZXRlXG4iLCBfX2Z1bmNfXyk7CisJCQlwcl9lcnIoInVkYzogJXMgLS0tICFfcmVxLT5jb21wbGV0ZVxuIiwgX19mdW5jX18pOwogCiAJCWlmICghX3JlcS0+YnVmKQotCQkJRVJSKCIqKiogJXMgLS0tICFfcmVxLT5idWZcbiIsIF9fZnVuY19fKTsKKwkJCXByX2VycigidWRjOiVzIC0tLSAhX3JlcS0+YnVmXG4iLCBfX2Z1bmNfXyk7CiAKIAkJaWYgKCFsaXN0X2VtcHR5KCZyZXEtPnF1ZXVlKSkKLQkJCUVSUigiKioqICVzIC0tLSAhbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSlcbiIsIF9fZnVuY19fKTsKKwkJCXByX2VycigiJXMgLS0tICFsaXN0X2VtcHR5KCZyZXEtPnF1ZXVlKVxuIiwgX19mdW5jX18pOwogCiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTI3NzMsMTIgKzI3NjcsMTMgQEAKIC8qCUlORk8oIj09PSAlcyhlcCVkKSwgemVybz0lZFxuIiwgX19mdW5jX18sIGVwLT5lcG51bSwgX3JlcS0+emVybyk7ICovCiAKIAlpZiAodWRjLT52YnVzX2FjdGl2ZSA9PSAwKSB7Ci0JCXByX2luZm8oIkNhbid0IGVwX3F1ZXVlIChWQlVTIE9GRilcbiIpOworCQlkZXZfaW5mbyh1ZGMtPmRldiwgIkNhbid0IGVwX3F1ZXVlIChWQlVTIE9GRilcbiIpOwogCQlyZXR1cm4gLUVTSFVURE9XTjsKIAl9CiAKIAlpZiAodW5saWtlbHkoIXVkYy0+ZHJpdmVyKSkgewotCQlFUlIoIiVzLCBib2d1cyBkZXZpY2Ugc3RhdGUgJXBcbiIsIF9fZnVuY19fLCB1ZGMtPmRyaXZlcik7CisJCWRldl9lcnIodWRjLT5kZXYsICIlcywgYm9ndXMgZGV2aWNlIHN0YXRlICVwXG4iLCBfX2Z1bmNfXywKKwkJCQl1ZGMtPmRyaXZlcik7CiAJCXJldHVybiAtRVNIVVRET1dOOwogCX0KIApAQCAtMjc5NCw3ICsyNzg5LDcgQEAKIAkJaWYgKGVwLT52aXJ0X2J1ZiA9PSBOVUxMKQogCQkJZXAtPnZpcnRfYnVmID0gKHU4ICopZG1hX2FsbG9jX2NvaGVyZW50KAogCQkJCU5VTEwsIFBBR0VfU0laRSwKLQkJCQkmZXAtPnBoeXNfYnVmLCBHRlBfS0VSTkVMIHwgR0ZQX0RNQSk7CisJCQkJJmVwLT5waHlzX2J1ZiwgR0ZQX0FUT01JQyB8IEdGUF9ETUEpOwogCQlpZiAoZXAtPmVwbnVtID4gMCkgIHsKIAkJCWlmIChlcC0+ZGlyZWN0ID09IFVTQl9ESVJfSU4pCiAJCQkJbWVtY3B5KGVwLT52aXJ0X2J1ZiwgcmVxLT5yZXEuYnVmLApAQCAtMjgxNyw3ICsyODEyLDggQEAKIAogCQlyZXN1bHQgPSBfbmJ1MnNzX3N0YXJ0X3RyYW5zZmVyKHVkYywgZXAsIHJlcSwgRkFMU0UpOwogCQlpZiAocmVzdWx0IDwgMCkgewotCQkJRVJSKCIgKioqICVzLCByZXN1bHQgPSAlZFxuIiwgX19mdW5jX18sIHJlc3VsdCk7CisJCQlkZXZfZXJyKHVkYy0+ZGV2LCAiICoqKiAlcywgcmVzdWx0ID0gJWRcbiIsIF9fZnVuY19fLAorCQkJCQlyZXN1bHQpOwogCQkJbGlzdF9kZWwoJnJlcS0+cXVldWUpOwogCQl9IGVsc2UgaWYgKChlcC0+ZXBudW0gPiAwKSAmJiAoZXAtPmRpcmVjdCA9PSBVU0JfRElSX09VVCkpIHsKICNpZmRlZiBVU0VfRE1BCkBAIC0yODQ5LDEzICsyODQ1LDEzIEBACiAKIAkvKiBjYXRjaCB2YXJpb3VzIGJvZ3VzIHBhcmFtZXRlcnMgKi8KIAlpZiAoKF9lcCA9PSBOVUxMKSB8fCAoX3JlcSA9PSBOVUxMKSkgewotCQkvKiBFUlIoIiVzLCBiYWQgcGFyYW0oMSlcbiIsIF9fZnVuY19fKTsgKi8KKwkJLyogcHJfZXJyKCIlcywgYmFkIHBhcmFtKDEpXG4iLCBfX2Z1bmNfXyk7ICovCiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IG5idTJzc19lcCwgZXApOwogCWlmICghZXApIHsKLQkJRVJSKCIlcywgZXAgPT0gTlVMTCAhIVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzLCBlcCA9PSBOVUxMICEhXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjg5NSwxOSArMjg5MSwxOSBAQAogLyoJSU5GTygiPT09ICVzKClcbiIsIF9fZnVuY19fKTsgKi8KIAogCWlmICghX2VwKSB7Ci0JCUVSUigiJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbmJ1MnNzX2VwLCBlcCk7CiAJaWYgKCFlcCkgewotCQlFUlIoIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlcywgYmFkIGVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXVkYyA9IGVwLT51ZGM7CiAJaWYgKCF1ZGMpIHsKLQkJRVJSKCIgKioqICVzLCBiYWQgdWRjXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoZXAtPnVkYy0+ZGV2LCAiICoqKiAlcywgYmFkIHVkY1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI5NDQsMjQgKzI5NDAsMjQgQEAKIAlzdHJ1Y3QgbmJ1MnNzX2VwCSplcDsKIAlzdHJ1Y3QgbmJ1MnNzX3VkYwkqdWRjOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCVBUX0ZDX1JFR1MJCXByZWc7CisJc3RydWN0IGZjX3JlZ3MJCSpwcmVnOwogCiAvKglJTkZPKCI9PT0gJXMoKVxuIiwgX19mdW5jX18pOyAqLwogCiAJaWYgKCFfZXApIHsKLQkJRVJSKCIlcywgYmFkIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuYnUyc3NfZXAsIGVwKTsKIAlpZiAoIWVwKSB7Ci0JCUVSUigiJXMsIGJhZCBlcFxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJdWRjID0gZXAtPnVkYzsKIAlpZiAoIXVkYykgewotCQlFUlIoIiVzLCBiYWQgdWRjXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoZXAtPnVkYy0+ZGV2LCAiJXMsIGJhZCB1ZGNcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yOTk3LDE5ICsyOTkzLDE5IEBACiAvKglJTkZPKCI9PT0gJXMoKVxuIiwgX19mdW5jX18pOyAqLwogCiAJaWYgKCFfZXApIHsKLQkJRVJSKCIlcywgYmFkIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigidWRjOiAlcywgYmFkIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuYnUyc3NfZXAsIGVwKTsKIAlpZiAoIV9lcCkgewotCQlFUlIoIiVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCJ1ZGM6ICVzLCBiYWQgZXBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAogCXVkYyA9IGVwLT51ZGM7CiAJaWYgKCF1ZGMpIHsKLQkJRVJSKCIlcywgYmFkIHVkY1xuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKGVwLT51ZGMtPmRldiwgIiVzLCBiYWQgdWRjXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTMwNTMsMTMgKzMwNDksMTMgQEAKIC8qCUlORk8oIj09PSAlcygpXG4iLCBfX2Z1bmNfXyk7ICovCiAKIAlpZiAocGdhZGdldCA9PSBOVUxMKSB7Ci0JCUVSUigiJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoInVkYzogJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAl1ZGMgPSBjb250YWluZXJfb2YocGdhZGdldCwgc3RydWN0IG5idTJzc191ZGMsIGdhZGdldCk7CiAJaWYgKHVkYyA9PSBOVUxMKSB7Ci0JCUVSUigiJXMsIHVkYyA9PSBOVUxMXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9lcnIoJnBnYWRnZXQtPmRldiwgIiVzLCB1ZGMgPT0gTlVMTFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMwODMsMTkgKzMwNzksMTkgQEAKIC8qCUlORk8oIj09PSAlcygpXG4iLCBfX2Z1bmNfXyk7ICovCiAKIAlpZiAocGdhZGdldCA9PSBOVUxMKSB7Ci0JCUVSUigiJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJdWRjID0gY29udGFpbmVyX29mKHBnYWRnZXQsIHN0cnVjdCBuYnUyc3NfdWRjLCBnYWRnZXQpOwogCWlmICh1ZGMgPT0gTlVMTCkgewotCQlFUlIoIiVzLCB1ZGMgPT0gTlVMTFxuIiwgX19mdW5jX18pOworCQlkZXZfZXJyKCZwZ2FkZ2V0LT5kZXYsICIlcywgdWRjID09IE5VTExcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJZGF0YSA9IGdwaW9fZ2V0X3ZhbHVlKFZCVVNfVkFMVUUpOwogCWlmIChkYXRhID09IDApIHsKLQkJcHJfd2FybigiVkJVUyBMRVZFTCA9ICVkXG4iLCBkYXRhKTsKKwkJZGV2X3dhcm4oJnBnYWRnZXQtPmRldiwgIlZCVVMgTEVWRUwgPSAlZFxuIiwgZGF0YSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzEyMyw3ICszMTE5LDcgQEAKIC8qCUlORk8oIj09PSAlcygpXG4iLCBfX2Z1bmNfXyk7ICovCiAKIAlpZiAocGdhZGdldCA9PSBOVUxMKSB7Ci0JCUVSUigiJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOworCQlwcl9lcnIoIiVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zMTUyLDcgKzMxNDgsNyBAQAogLyoJSU5GTygiPT09ICVzKClcbiIsIF9fZnVuY19fKTsgKi8KIAogCWlmIChwZ2FkZ2V0ID09IE5VTEwpIHsKLQkJRVJSKCIlcywgYmFkIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CisJCXByX2VycigiJXMsIGJhZCBwYXJhbVxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTMxNzQsNyArMzE3MCw3IEBACiAvKglJTkZPKCI9PT0gJXMoKVxuIiwgX19mdW5jX18pOyAqLwogCiAJaWYgKHBnYWRnZXQgPT0gTlVMTCkgewotCQlFUlIoIiVzLCBiYWQgcGFyYW1cbiIsIF9fZnVuY19fKTsKKwkJcHJfZXJyKCIlcywgYmFkIHBhcmFtXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMzM0MSwxMSArMzMzNywxMSBAQAogCQkJCSAgMCwgZHJpdmVyX25hbWUsIHVkYyk7CiAKIAkvKiBJTyBNZW1vcnkgKi8KLQl1ZGMtPnBfcmVncyA9IChQVF9GQ19SRUdTKW1taW9fYmFzZTsKKwl1ZGMtPnBfcmVncyA9IChzdHJ1Y3QgZmNfcmVncyAqKW1taW9fYmFzZTsKIAogCS8qIFVTQiBGdW5jdGlvbiBDb250cm9sbGVyIEludGVycnVwdCAqLwogCWlmIChzdGF0dXMgIT0gMCkgewotCQlFUlIoInJlcXVlc3RfaXJxKFVTQl9VRENfSVJRXzEpIGZhaWxlZFxuIik7CisJCWRldl9lcnIodWRjLT5kZXYsICJyZXF1ZXN0X2lycShVU0JfVURDX0lSUV8xKSBmYWlsZWRcbiIpOwogCQlnb3RvIGNsZWFudXAxOwogCX0KIApAQCAtMzM2NSw3ICszMzYxLDcgQEAKIAkJCQl1ZGMpOwogCiAJaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCUVSUigicmVxdWVzdF9pcnEoSU5UX1ZCVVMpIGZhaWxlZFxuIik7CisJCWRldl9lcnIodWRjLT5kZXYsICJyZXF1ZXN0X2lycShJTlRfVkJVUykgZmFpbGVkXG4iKTsKIAkJZ290byBjbGVhbnVwMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9lbXh4X3VkYy9lbXh4X3VkYy5oIGIvZHJpdmVycy9zdGFnaW5nL2VteHhfdWRjL2VteHhfdWRjLmgKaW5kZXggMjAyZTJkYy4uYzE5MTY4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2VteHhfdWRjL2VteHhfdWRjLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2VteHhfdWRjL2VteHhfdWRjLmgKQEAgLTQ3NCw4ICs0NzQsOCBAQAogCiAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAvKiBTdHJ1Y3QgKi8KLS8qLS0tLS0tLSBUX0VQX1JFR1MgKi8KLXR5cGVkZWYgc3RydWN0IF9UX0VQX1JFR1MgeworLyotLS0tLS0tIGVwX3JlZ3MgKi8KK3N0cnVjdCBlcF9yZWdzIHsKIAl1MzIgRVBfQ09OVFJPTDsJCQkvKiBFUCBDb250cm9sICovCiAJdTMyIEVQX1NUQVRVUzsJCQkvKiBFUCBTdGF0dXMgKi8KIAl1MzIgRVBfSU5UX0VOQTsJCQkvKiBFUCBJbnRlcnJ1cHQgRW5hYmxlICovCkBAIC00ODQsMTggKzQ4NCwxOCBAQAogCXUzMiBFUF9MRU5fRENOVDsJCS8qIEVQIExlbmd0aCAmIERNQSBjb3VudCAqLwogCXUzMiBFUF9SRUFEOwkJCS8qIEVQIFJlYWQgKi8KIAl1MzIgRVBfV1JJVEU7CQkJLyogRVAgV3JpdGUgKi8KLX0gVF9FUF9SRUdTLCAqUFRfRVBfUkVHUzsKK307CiAKLS8qLS0tLS0tLSBUX0VQX0RDUiAqLwotdHlwZWRlZiBzdHJ1Y3QgX1RfRVBfRENSIHsKKy8qLS0tLS0tLSBlcF9kY3IgKi8KK3N0cnVjdCBlcF9kY3IgewogCXUzMiBFUF9EQ1IxOwkJCS8qIEVQX0RDUjEgKi8KIAl1MzIgRVBfRENSMjsJCQkvKiBFUF9EQ1IyICovCiAJdTMyIEVQX1RBRFI7CQkJLyogRVBfVEFEUiAqLwogCXUzMiBSZXNlcnZlZDsJCQkvKiBSZXNlcnZlZCAqLwotfSBUX0VQX0RDUiwgKlBUX0VQX0RDUjsKK307CiAKIC8qLS0tLS0tLSBGdW5jdGlvbiBSZWdpc3RlcnMgKi8KLXR5cGVkZWYgc3RydWN0IF9UX0ZDX1JFR1Mgeworc3RydWN0IGZjX3JlZ3MgewogCXUzMiBVU0JfQ09OVFJPTDsJCS8qICgweDAwMDApIFVTQiBDb250cm9sICovCiAJdTMyIFVTQl9TVEFUVVM7CQkJLyogKDB4MDAwNCkgVVNCIFN0YXR1cyAqLwogCXUzMiBVU0JfQUREUkVTUzsJCS8qICgweDAwMDgpIFVTQiBBZGRyZXNzICovCkBAIC01MTMsNyArNTEzLDcgQEAKIAl1MzIgRVAwX1JFQUQ7CQkJLyogKDB4MDAzOCkgRVAwIFJlYWQgKi8KIAl1MzIgRVAwX1dSSVRFOwkJCS8qICgweDAwM0MpIEVQMCBXcml0ZSAqLwogCi0JVF9FUF9SRUdTIEVQX1JFR1NbUkVHX0VQX05VTV07CS8qIEVuZHBvaW50IFJlZ2lzdGVyICovCisJc3RydWN0IGVwX3JlZ3MgRVBfUkVHU1tSRUdfRVBfTlVNXTsJLyogRW5kcG9pbnQgUmVnaXN0ZXIgKi8KIAogCXU4IFJlc2VydmVkMjIwWzB4MTAwMC0weDIyMF07CS8qICgweDAyMjA6MHgwRkZGKSBSZXNlcnZlZCAqLwogCkBAIC01MzEsMTEgKzUzMSwxMCBAQAogCiAJdTggUmVzZXJ2ZWQxMDI4WzB4MTEwLTB4MjhdOwkvKiAoMHgxMDI4OjB4MTEwRikgUmVzZXJ2ZWQgKi8KIAotCVRfRVBfRENSIEVQX0RDUltSRUdfRVBfTlVNXTsJLyogKi8KKwlzdHJ1Y3QgZXBfZGNyIEVQX0RDUltSRUdfRVBfTlVNXTsJLyogKi8KIAogCXU4IFJlc2VydmVkMTIwMFsweDEwMDAtMHgyMDBdOwkvKiBSZXNlcnZlZCAqLwotCi19IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDMyKSkpIFRfRkNfUkVHUywgKlBUX0ZDX1JFR1M7Cit9IF9fYWxpZ25lZCgzMik7CiAKIAogCkBAIC02MzEsMTggKzYzMCwxNyBAQAogCiAJdTMyCQljdXJyX2NvbmZpZzsJLyogQ3VycmVudCBDb25maWd1cmF0aW9uIE51bWJlciAqLwogCi0JUFRfRkNfUkVHUwkJcF9yZWdzOworCXN0cnVjdCBmY19yZWdzCQkqcF9yZWdzOwogfTsKIAogLyogVVNCIHJlZ2lzdGVyIGFjY2VzcyBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgdm9sYXRpbGUgdW5pb24gewordW5pb24gdXNiX3JlZ19hY2Nlc3MgewogCXN0cnVjdCB7CiAJCXVuc2lnbmVkIGNoYXIJREFUQVs0XTsKIAl9IGJ5dGU7CiAJdW5zaWduZWQgaW50CQlkdzsKLX0gVVNCX1JFR19BQ0NFU1M7Cit9OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBFUlIoc3R1ZmYuLi4pCQlwcmludGsoS0VSTl9FUlIgInVkYzogIiBzdHVmZikKIAogI2VuZGlmICAvKiBfTElOVVhfRU1YWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9LY29uZmlnCmluZGV4IDk5NWE5MTAuLjZjZjBjNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9LY29uZmlnCkBAIC0zOCw2ICszOCwxMiBAQAogCWhlbHAKIAkgIEdlbmVyaWMgRnJhbWVidWZmZXIgc3VwcG9ydCBmb3IgSFg4MzUzRAogCitjb25maWcgRkJfVEZUX0lMSTkxNjMKKwl0cmlzdGF0ZSAiRkIgZHJpdmVyIGZvciB0aGUgSUxJOTE2MyBMQ0QgQ29udHJvbGxlciIKKwlkZXBlbmRzIG9uIEZCX1RGVAorCWhlbHAKKwkgIEdlbmVyaWMgRnJhbWVidWZmZXIgc3VwcG9ydCBmb3IgSUxJOTE2MworCiBjb25maWcgRkJfVEZUX0lMSTkzMjAKIAl0cmlzdGF0ZSAiRkIgZHJpdmVyIGZvciB0aGUgSUxJOTMyMCBMQ0QgQ29udHJvbGxlciIKIAlkZXBlbmRzIG9uIEZCX1RGVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L01ha2VmaWxlCmluZGV4IGU3NzNmMGYuLjllNzNiZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvTWFrZWZpbGUKQEAgLTgsNiArOCw3IEBACiBvYmotJChDT05GSUdfRkJfVEZUX0hYODM0MEJOKSAgICArPSBmYl9oeDgzNDBibi5vCiBvYmotJChDT05GSUdfRkJfVEZUX0hYODM0N0QpICAgICArPSBmYl9oeDgzNDdkLm8KIG9iai0kKENPTkZJR19GQl9URlRfSFg4MzUzRCkgICAgICs9IGZiX2h4ODM1M2Qubworb2JqLSQoQ09ORklHX0ZCX1RGVF9JTEk5MTYzKSAgICAgKz0gZmJfaWxpOTE2My5vCiBvYmotJChDT05GSUdfRkJfVEZUX0lMSTkzMjApICAgICArPSBmYl9pbGk5MzIwLm8KIG9iai0kKENPTkZJR19GQl9URlRfSUxJOTMyNSkgICAgICs9IGZiX2lsaTkzMjUubwogb2JqLSQoQ09ORklHX0ZCX1RGVF9JTEk5MzQwKSAgICAgKz0gZmJfaWxpOTM0MC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvUkVBRE1FIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L1JFQURNRQppbmRleCBiYzg5YjU4Li5iYTRjNzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvUkVBRE1FCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9SRUFETUUKQEAgLTksMjAgKzksMjAgQEAKIElOU1RBTExBVElPTgogICBEb3dubG9hZCBrZXJuZWwgc291cmNlcwogCi0gIEZyb20gTGludXggMy4xNSAgCisgIEZyb20gTGludXggMy4xNQogICAgIGNkIGRyaXZlcnMvdmlkZW8vZmJkZXYvZmJ0ZnQKICAgICBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL25vdHJvL2ZidGZ0LmdpdAotICAgIAorCiAgICAgQWRkIHRvIGRyaXZlcnMvdmlkZW8vZmJkZXYvS2NvbmZpZzogICBzb3VyY2UgImRyaXZlcnMvdmlkZW8vZmJkZXYvZmJ0ZnQvS2NvbmZpZyIKICAgICBBZGQgdG8gZHJpdmVycy92aWRlby9mYmRldi9NYWtlZmlsZTogIG9iai15ICs9IGZidGZ0LwotICAKLSAgQmVmb3JlIExpbnV4IDMuMTUgIAorCisgIEJlZm9yZSBMaW51eCAzLjE1CiAgICAgY2QgZHJpdmVycy92aWRlbwogICAgIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vbm90cm8vZmJ0ZnQuZ2l0Ci0gICAgCisKICAgICBBZGQgdG8gZHJpdmVycy92aWRlby9LY29uZmlnOiAgIHNvdXJjZSAiZHJpdmVycy92aWRlby9mYnRmdC9LY29uZmlnIgogICAgIEFkZCB0byBkcml2ZXJzL3ZpZGVvL01ha2VmaWxlOiAgb2JqLXkgKz0gZmJ0ZnQvCi0gIAorCiAgIEVuYWJsZSBkcml2ZXIocykgaW4gbWVudWNvbmZpZyBhbmQgYnVpbGQgdGhlIGtlcm5lbAogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9hZ20xMjY0ay1mbC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2FnbTEyNjRrLWZsLmMKaW5kZXggOWNjN2QyNS4uOGY1YWYxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2FnbTEyNjRrLWZsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2FnbTEyNjRrLWZsLmMKQEAgLTE3NCw3ICsxNzQsNyBAQAogCiAvKiBUaGlzIGZ1bmN0aW9uIG9zZXMgdG8gZW50ZXIgY29tbWFuZHMKICAqIGZpcnN0IGJ5dGUgLSBkZXN0aW5hdGlvbiBjb250cm9sbGVyIDAgb3IgMQotICogZm9sb3dpbmcgLSBjb21tYW5kcworICogZm9sbG93aW5nIC0gY29tbWFuZHMKICAqLwogc3RhdGljIHZvaWQgd3JpdGVfcmVnOF9idXM4KHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgaW50IGxlbiwgLi4uKQogewpAQCAtMTk4LDggKzE5OCw4IEBACiAKIAlpZiAoKmJ1ZiA+IDEpIHsKIAkJdmFfZW5kKGFyZ3MpOwotCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLCAiJXM6IEluY29ycmVjdCBjaGlwIHNlbGxlY3QgcmVxdWVzdCAoJWQpXG4iLAotCQkJX19mdW5jX18sICpidWYpOworCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAorCQkJIkluY29ycmVjdCBjaGlwIHNlbGVjdCByZXF1ZXN0ICglZClcbiIsICpidWYpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMjQsOCArMjI0LDggQEAKIAkJcmV0ID0gcGFyLT5mYnRmdG9wcy53cml0ZShwYXIsIHBhci0+YnVmLCBsZW4gKiAoc2l6ZW9mKHU4KSkpOwogCQlpZiAocmV0IDwgMCkgewogCQkJdmFfZW5kKGFyZ3MpOwotCQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgIiVzOiB3cml0ZSgpIGZhaWxlZCBhbmQgcmV0dXJuZWQgJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7CisJCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAorCQkJCSJ3cml0ZSgpIGZhaWxlZCBhbmQgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC0yNzgsMTAgKzI3OCwxMyBAQAogCWludCB4LCB5OwogCWludCByZXQgPSAwOwogCi0JLyogYnVmZmVyIHRvIGNvbnZlcnQgUkdCNTY1IC0+IGdyYXlzY2FsZTE2IC0+IERpdGhlcmQgaW1hZ2UgMWJwcCAqLworCS8qIGJ1ZmZlciB0byBjb252ZXJ0IFJHQjU2NSAtPiBncmF5c2NhbGUxNiAtPiBEaXRoZXJlZCBpbWFnZSAxYnBwICovCiAJc2lnbmVkIHNob3J0ICpjb252ZXJ0X2J1ZiA9IGttYWxsb2MocGFyLT5pbmZvLT52YXIueHJlcyAqCiAJCXBhci0+aW5mby0+dmFyLnlyZXMgKiBzaXplb2Yoc2lnbmVkIHNob3J0KSwgR0ZQX05PSU8pOwogCisJaWYgKCFjb252ZXJ0X2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlmYnRmdF9wYXJfZGJnKERFQlVHX1dSSVRFX1ZNRU0sIHBhciwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAogCS8qIGNvbnZlcnRpbmcgdG8gZ3JheXNjYWxlMTYgKi8KQEAgLTM3Niw4ICszNzksOCBAQAogCQkJcmV0ID0gcGFyLT5mYnRmdG9wcy53cml0ZShwYXIsIGJ1ZiwgbGVuKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCi0JCQkJCSIlczogd3JpdGUgZmFpbGVkIGFuZCByZXR1cm5lZDogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXQpOworCQkJCQkid3JpdGUgZmFpbGVkIGFuZCByZXR1cm5lZDogJWRcbiIsCisJCQkJCXJldCk7CiAJCX0KIAkJLyogcmlnaHQgaGFsZiBvZiBkaXNwbGF5ICovCiAJCWlmIChhZGRyX3dpbi54ZSA+PSBwYXItPmluZm8tPnZhci54cmVzIC8gMikgewpAQCAtMzkwLDcgKzM5Myw3IEBACiAJCQkvKiBzZWxlY3QgcmlnaHQgc2lkZSAoc2MxKQogCQkJICogc2V0IGFkZHIKIAkJCSAqLwotCQkJd3JpdGVfcmVnKHBhciwgMHgwMSwgKDEgPDwgNikpOworCQkJd3JpdGVfcmVnKHBhciwgMHgwMSwgMSA8PCA2KTsKIAkJCXdyaXRlX3JlZyhwYXIsIDB4MDEsICgweDE3IDw8IDMpIHwgKHU4KXkpOwogCiAJCQkvKiB3cml0ZSBiaXRtYXAgKi8KQEAgLTM5OCw4ICs0MDEsOCBAQAogCQkJcGFyLT5mYnRmdG9wcy53cml0ZShwYXIsIGJ1ZiwgbGVuKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCi0JCQkJCSIlczogd3JpdGUgZmFpbGVkIGFuZCByZXR1cm5lZDogJWRcbiIsCi0JCQkJCV9fZnVuY19fLCByZXQpOworCQkJCQkid3JpdGUgZmFpbGVkIGFuZCByZXR1cm5lZDogJWRcbiIsCisJCQkJCXJldCk7CiAJCX0KIAl9CiAJa2ZyZWUoY29udmVydF9idWYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2JkNjYzNDc0LmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfYmQ2NjM0NzQuYwppbmRleCA3ZTAwYzYwLi4xN2EyMTYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfYmQ2NjM0NzQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfYmQ2NjM0NzQuYwpAQCAtNDcsNDkgKzQ3LDQ5IEBACiAJLyogSW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgZnJvbSBMaWJfVVRGVCAqLwogCiAJLyogb3NjaWxsYXRvciBzdGFydCAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAwLDB4MDAwMSk7CS8qb3NjaWxsYXRvciAwOiBzdG9wLCAxOiBvcGVyYXRpb24gKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMCwgMHgwMDAxKTsJLypvc2NpbGxhdG9yIDA6IHN0b3AsIDE6IG9wZXJhdGlvbiAqLwogCW1kZWxheSgxMCk7CiAKIAkvKiBQb3dlciBzZXR0aW5ncyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MTAwLCAweDAwMDAgKTsgLyogcG93ZXIgc3VwcGx5IHNldHVwICovCi0Jd3JpdGVfcmVnKHBhciwgMHgxMDEsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MTAyLCAweDMxMTAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDEwMywgMHhlMjAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgxMTAsIDB4MDA5ZCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MTExLCAweDAwMjIgKTsKLQl3cml0ZV9yZWcocGFyLCAweDEwMCwgMHgwMTIwICk7Ci0JbWRlbGF5KCAyMCApOworCXdyaXRlX3JlZyhwYXIsIDB4MTAwLCAweDAwMDApOyAvKiBwb3dlciBzdXBwbHkgc2V0dXAgKi8KKwl3cml0ZV9yZWcocGFyLCAweDEwMSwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDEwMiwgMHgzMTEwKTsKKwl3cml0ZV9yZWcocGFyLCAweDEwMywgMHhlMjAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDExMCwgMHgwMDlkKTsKKwl3cml0ZV9yZWcocGFyLCAweDExMSwgMHgwMDIyKTsKKwl3cml0ZV9yZWcocGFyLCAweDEwMCwgMHgwMTIwKTsKKwltZGVsYXkoMjApOwogCi0Jd3JpdGVfcmVnKHBhciwgMHgxMDAsIDB4MzEyMCApOwotCW1kZWxheSggODAgKTsKKwl3cml0ZV9yZWcocGFyLCAweDEwMCwgMHgzMTIwKTsKKwltZGVsYXkoODApOwogCS8qIERpc3BsYXkgY29udHJvbCAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAxLCAweDAxMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDAwMiwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMDMsIDB4MTIzMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDA2LCAweDAwMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDAwNywgMHgwMTAxICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMDgsIDB4MDgwOCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDA5LCAweDAwMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDAwYiwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMGMsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDBkLCAweDAwMTggKTsKKwl3cml0ZV9yZWcocGFyLCAweDAwMSwgMHgwMTAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDAwMiwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDAwMywgMHgxMjMwKTsKKwl3cml0ZV9yZWcocGFyLCAweDAwNiwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDAwNywgMHgwMTAxKTsKKwl3cml0ZV9yZWcocGFyLCAweDAwOCwgMHgwODA4KTsKKwl3cml0ZV9yZWcocGFyLCAweDAwOSwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDAwYiwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDAwYywgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDAwZCwgMHgwMDE4KTsKIAkvKiBMVFBTIGNvbnRyb2wgc2V0dGluZ3MgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAxMiwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMTMsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDE4LCAweDAwMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDAxOSwgMHgwMDAwICk7CisJd3JpdGVfcmVnKHBhciwgMHgwMTIsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMTMsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMTgsIDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMTksIDB4MDAwMCk7CiAKLQl3cml0ZV9yZWcocGFyLCAweDIwMywgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgyMDQsIDB4MDAwMCApOworCXdyaXRlX3JlZyhwYXIsIDB4MjAzLCAweDAwMDApOworCXdyaXRlX3JlZyhwYXIsIDB4MjA0LCAweDAwMDApOwogCi0Jd3JpdGVfcmVnKHBhciwgMHgyMTAsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MjExLCAweDAwZWYgKTsKLQl3cml0ZV9yZWcocGFyLCAweDIxMiwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgyMTMsIDB4MDEzZiApOwotCXdyaXRlX3JlZyhwYXIsIDB4MjE0LCAweDAwMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDIxNSwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgyMTYsIDB4MDAwMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MjE3LCAweDAwMDAgKTsKKwl3cml0ZV9yZWcocGFyLCAweDIxMCwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDIxMSwgMHgwMGVmKTsKKwl3cml0ZV9yZWcocGFyLCAweDIxMiwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDIxMywgMHgwMTNmKTsKKwl3cml0ZV9yZWcocGFyLCAweDIxNCwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDIxNSwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDIxNiwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDIxNywgMHgwMDAwKTsKIAogCS8qIEdyYXkgc2NhbGUgc2V0dGluZ3MgKi8KIAl3cml0ZV9yZWcocGFyLCAweDMwMCwgMHg1MzQzKTsKQEAgLTEwNCwxOCArMTA0LDE4IEBACiAJd3JpdGVfcmVnKHBhciwgMHgzMDksIDB4MDUwYSk7CiAKIAkvKiBSQU0gYWNjZXNzIHNldHRpbmdzICovCi0Jd3JpdGVfcmVnKHBhciwgMHg0MDAsIDB4NDAyNyApOwotCXdyaXRlX3JlZyhwYXIsIDB4NDAxLCAweDAwMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDQwMiwgMHgwMDAwICk7ICAvKiBGaXJzdCBzY3JlZW4gZHJpdmUgcG9zaXRpb24gKDEpICovCi0Jd3JpdGVfcmVnKHBhciwgMHg0MDMsIDB4MDEzZiApOyAgLyogRmlyc3Qgc2NyZWVuIGRyaXZlIHBvc2l0aW9uICgyKSAqLwotCXdyaXRlX3JlZyhwYXIsIDB4NDA0LCAweDAwMDAgKTsKKwl3cml0ZV9yZWcocGFyLCAweDQwMCwgMHg0MDI3KTsKKwl3cml0ZV9yZWcocGFyLCAweDQwMSwgMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDQwMiwgMHgwMDAwKTsgIC8qIEZpcnN0IHNjcmVlbiBkcml2ZSBwb3NpdGlvbiAoMSkgKi8KKwl3cml0ZV9yZWcocGFyLCAweDQwMywgMHgwMTNmKTsgIC8qIEZpcnN0IHNjcmVlbiBkcml2ZSBwb3NpdGlvbiAoMikgKi8KKwl3cml0ZV9yZWcocGFyLCAweDQwNCwgMHgwMDAwKTsKIAotCXdyaXRlX3JlZyhwYXIsIDB4MjAwLCAweDAwMDAgKTsKLQl3cml0ZV9yZWcocGFyLCAweDIwMSwgMHgwMDAwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgxMDAsIDB4NzEyMCApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDA3LCAweDAxMDMgKTsKLQltZGVsYXkoIDEwICk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMDcsIDB4MDExMyApOworCXdyaXRlX3JlZyhwYXIsIDB4MjAwLCAweDAwMDApOworCXdyaXRlX3JlZyhwYXIsIDB4MjAxLCAweDAwMDApOworCXdyaXRlX3JlZyhwYXIsIDB4MTAwLCAweDcxMjApOworCXdyaXRlX3JlZyhwYXIsIDB4MDA3LCAweDAxMDMpOworCW1kZWxheSgxMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMDcsIDB4MDExMyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9oeDgzNDBibi5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2h4ODM0MGJuLmMKaW5kZXggMzkzOTUwMi4uNTQ1MjhhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2h4ODM0MGJuLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2h4ODM0MGJuLmMKQEAgLTQsNyArNCw3IEBACiAgKiBUaGlzIGRpc3BsYXkgdXNlcyA5LWJpdCBTUEk6IERhdGEvQ29tbWFuZCBiaXQgKyA4IGRhdGEgYml0cwogICogRm9yIHBsYXRmb3JtcyB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCA5LWJpdCwgdGhlIGRyaXZlciBpcyBjYXBhYmxlCiAgKiBvZiBlbXVsYXRpbmcgdGhpcyB1c2luZyA4LWJpdCB0cmFuc2Zlci4KLSAqIFRoaXMgaXMgZG9uZSBieSB0cmFuc2ZlcmluZyBlaWdodCA5LWJpdCB3b3JkcyBpbiA5IGJ5dGVzLgorICogVGhpcyBpcyBkb25lIGJ5IHRyYW5zZmVycmluZyBlaWdodCA5LWJpdCB3b3JkcyBpbiA5IGJ5dGVzLgogICoKICAqIENvcHlyaWdodCAoQykgMjAxMyBOb3JhbGYgVHJvbm5lcwogICoKQEAgLTQ3LDggKzQ3LDYgQEAKIAogc3RhdGljIGludCBpbml0X2Rpc3BsYXkoc3RydWN0IGZidGZ0X3BhciAqcGFyKQogewotCWZidGZ0X3Bhcl9kYmcoREVCVUdfSU5JVF9ESVNQTEFZLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7Ci0KIAlwYXItPmZidGZ0b3BzLnJlc2V0KHBhcik7CiAKIAkvKiBCVEwyMjE3MjItMjc2TCBzdGFydHVwIHNlcXVlbmNlLCBmcm9tIGRhdGFzaGVldCAqLwpAQCAtMTA4LDExICsxMDYsOCBAQAogCXJldHVybiAwOwogfQogCi12b2lkIHNldF9hZGRyX3dpbihzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIGludCB4cywgaW50IHlzLCBpbnQgeGUsIGludCB5ZSkKK3N0YXRpYyB2b2lkIHNldF9hZGRyX3dpbihzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIGludCB4cywgaW50IHlzLCBpbnQgeGUsIGludCB5ZSkKIHsKLQlmYnRmdF9wYXJfZGJnKERFQlVHX1NFVF9BRERSX1dJTiwgcGFyLAotCQkiJXMoeHM9JWQsIHlzPSVkLCB4ZT0lZCwgeWU9JWQpXG4iLCBfX2Z1bmNfXywgeHMsIHlzLCB4ZSwgeWUpOwotCiAJd3JpdGVfcmVnKHBhciwgRkJURlRfQ0FTRVQsIDB4MDAsIHhzLCAweDAwLCB4ZSk7CiAJd3JpdGVfcmVnKHBhciwgRkJURlRfUkFTRVQsIDB4MDAsIHlzLCAweDAwLCB5ZSk7CiAJd3JpdGVfcmVnKHBhciwgRkJURlRfUkFNV1IpOwpAQCAtMTIwLDggKzExNSw2IEBACiAKIHN0YXRpYyBpbnQgc2V0X3ZhcihzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCiB7Ci0JZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQogCS8qIE1BRENUTCAtIE1lbW9yeSBkYXRhIGFjY2VzcyBjb250cm9sICovCiAJLyogUkdCL0JHUiBjYW4gYmUgc2V0IHdpdGggSC9XIHBpbiBTUkdCIGFuZCBNQURDVEwgQkdSIGJpdCAqLwogI2RlZmluZSBNWSAoMSA8PCA3KQpAQCAtMTI5LDcgKzEyMiw3IEBACiAjZGVmaW5lIE1WICgxIDw8IDUpCiAJc3dpdGNoIChwYXItPmluZm8tPnZhci5yb3RhdGUpIHsKIAljYXNlIDA6Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MzYsIChwYXItPmJnciA8PCAzKSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MzYsIHBhci0+YmdyIDw8IDMpOwogCQlicmVhazsKIAljYXNlIDI3MDoKIAkJd3JpdGVfcmVnKHBhciwgMHgzNiwgTVggfCBNViB8IChwYXItPmJnciA8PCAzKSk7CkBAIC0xNTYsMTQgKzE0OSwxMiBAQAogc3RhdGljIGludCBzZXRfZ2FtbWEoc3RydWN0IGZidGZ0X3BhciAqcGFyLCB1bnNpZ25lZCBsb25nICpjdXJ2ZXMpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXNrW10gPSB7Ci0JCTBiMTExMSwgMGIxMTExLCAwYjExMTExLCAwYjExMTEsIDBiMTExMSwgMGIxMTExLCAwYjExMTExLAotCQkwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExLCAwYjExLAotCQkwYjExMTEsIDBiMTExMSwgMGIxMTExMSwgMGIxMTExLCAwYjExMTEsIDBiMTExMSwgMGIxMTExMSwKLQkJMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwgMGIwLCAwYjAgfTsKKwkJMHgwZiwgMHgwZiwgMHgxZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgxZiwgMHgwNywgMHgwNywgMHgwNywKKwkJMHgwNywgMHgwNywgMHgwNywgMHgwMywgMHgwMywgMHgwZiwgMHgwZiwgMHgxZiwgMHgwZiwgMHgwZiwKKwkJMHgwZiwgMHgxZiwgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwMCwgMHgwMCwKKwl9OwogCWludCBpLCBqOwogCi0JZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwgIiVzKClcbiIsIF9fZnVuY19fKTsKLQogCS8qIGFwcGx5IG1hc2sgKi8KIAlmb3IgKGkgPSAwOyBpIDwgcGFyLT5nYW1tYS5udW1fY3VydmVzOyBpKyspCiAJCWZvciAoaiA9IDA7IGogPCBwYXItPmdhbW1hLm51bV92YWx1ZXM7IGorKykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9oeDgzNDdkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaHg4MzQ3ZC5jCmluZGV4IDgxMzlhOGYuLjAzYWU5NWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9oeDgzNDdkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2h4ODM0N2QuYwpAQCAtMTE1LDEwICsxMTUsOSBAQAogc3RhdGljIGludCBzZXRfZ2FtbWEoc3RydWN0IGZidGZ0X3BhciAqcGFyLCB1bnNpZ25lZCBsb25nICpjdXJ2ZXMpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXNrW10gPSB7Ci0JCTBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsCi0JCTBiMTExMTExMSwgMGIxMTExMTExLAotCQkwYjExMTExLCAwYjExMTExLCAwYjExMTExLCAwYjExMTExLCAwYjExMTExLAotCQkwYjExMTF9OworCQkweDNmLCAweDNmLCAweDNmLCAweDNmLCAweDNmLCAweDNmLCAweDdmLCAweDdmLCAweDFmLCAweDFmLAorCQkweDFmLCAweDFmLCAweDFmLCAweDBmLAorCX07CiAJaW50IGksIGo7CiAJaW50IGFjYyA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9oeDgzNTNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaHg4MzUzZC5jCmluZGV4IGM5NTEyZGMuLmQ3ZjQzMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9oeDgzNTNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2h4ODM1M2QuYwpAQCAtODQsNyArODQsNyBAQAogCS8qIGNvbHVtbiBhZGRyZXNzICovCiAJd3JpdGVfcmVnKHBhciwgMHgyYSwgeHMgPj4gOCwgeHMgJiAweGZmLCB4ZSA+PiA4LCB4ZSAmIDB4ZmYpOwogCi0JLyogcm93IGFkcmVzcyAqLworCS8qIFJvdyBhZGRyZXNzICovCiAJd3JpdGVfcmVnKHBhciwgMHgyYiwgeXMgPj4gOCwgeXMgJiAweGZmLCB5ZSA+PiA4LCB5ZSAmIDB4ZmYpOwogCiAJLyogbWVtb3J5IHdyaXRlICovCkBAIC0xMTIsNyArMTEyLDcgQEAKIAkJd3JpdGVfcmVnKHBhciwgMHgzNiwgbXkgfCBtdiB8IChwYXItPmJnciA8PCAzKSk7CiAJCWJyZWFrOwogCWNhc2UgMTgwOgotCQl3cml0ZV9yZWcocGFyLCAweDM2LCAocGFyLT5iZ3IgPDwgMykpOworCQl3cml0ZV9yZWcocGFyLCAweDM2LCBwYXItPmJnciA8PCAzKTsKIAkJYnJlYWs7CiAJY2FzZSA5MDoKIAkJd3JpdGVfcmVnKHBhciwgMHgzNiwgbXggfCBtdiB8IChwYXItPmJnciA8PCAzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTE2My5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkxNjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDkyYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkxNjMuYwpAQCAtMCwwICsxLDMwMyBAQAorLyoKKyAqIEZCIGRyaXZlciBmb3IgdGhlIElMSTkxNjMgTENEIENvbnRyb2xsZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgS296aGV2bmlrb3YgQW5hdG9seQorICoKKyAqIEJhc2VkIG9uIGlsaTkzMjUuYyBieSBOb3JhbGYgVHJvbm5lcyBhbmQKKyAqIC5TLlUuTS5PLlQuTy5ZLiBieSBNYXggTUMgQ29zdGEgKGh0dHBzOi8vZ2l0aHViLmNvbS9zdW1vdG95L1RGVF9JTEk5MTYzQykuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlICJmYnRmdC5oIgorCisjZGVmaW5lIERSVk5BTUUJCSJmYl9pbGk5MTYzIgorI2RlZmluZSBXSURUSAkJMTI4CisjZGVmaW5lIEhFSUdIVAkJMTI4CisjZGVmaW5lIEJQUAkJMTYKKyNkZWZpbmUgRlBTCQkzMAorCisjaWZkZWYgR0FNTUFfQURKCisjZGVmaW5lIEdBTU1BX0xFTgkxNQorI2RlZmluZSBHQU1NQV9OVU0JMQorI2RlZmluZSBERUZBVUxUX0dBTU1BCSIzNiAyOSAxMiAyMiAxQyAxNSA0MiBCNyAyRiAxMyAxMiAwQSAxMSAwQiAwNlxuIgorI2VuZGlmCisKKy8qIElMSTkxNjNDIGNvbW1hbmRzICovCisjZGVmaW5lIENNRF9OT1AJCTB4MDAgLyogTm9uIG9wZXJhdGlvbiovCisjZGVmaW5lIENNRF9TV1JFU0VUCTB4MDEgLyogU29mdCBSZXNldCAqLworI2RlZmluZSBDTURfU0xQSU4JMHgxMCAvKiBTbGVlcCBPTiAqLworI2RlZmluZSBDTURfU0xQT1VUCTB4MTEgLyogU2xlZXAgT0ZGICovCisjZGVmaW5lIENNRF9QVExPTgkweDEyIC8qIFBhcnRpYWwgTW9kZSBPTiAqLworI2RlZmluZSBDTURfTk9STUwJMHgxMyAvKiBOb3JtYWwgRGlzcGxheSBPTiAqLworI2RlZmluZSBDTURfRElOVk9GCTB4MjAgLyogRGlzcGxheSBJbnZlcnNpb24gT0ZGICovCisjZGVmaW5lIENNRF9ESU5WT04JMHgyMSAvKiBEaXNwbGF5IEludmVyc2lvbiBPTiAqLworI2RlZmluZSBDTURfR0FNTUFTRVQJMHgyNiAvKiBHYW1tYSBTZXQgKDB4MDFbMV0sMHgwMlsyXSwweDA0WzNdLDB4MDhbNF0pICovCisjZGVmaW5lIENNRF9ESVNQT0ZGCTB4MjggLyogRGlzcGxheSBPRkYgKi8KKyNkZWZpbmUgQ01EX0RJU1BPTgkweDI5IC8qIERpc3BsYXkgT04gKi8KKyNkZWZpbmUgQ01EX0lETEVPTgkweDM5IC8qIElkbGUgTW9kZSBPTiAqLworI2RlZmluZSBDTURfSURMRU9GCTB4MzggLyogSWRsZSBNb2RlIE9GRiAqLworI2RlZmluZSBDTURfQ0xNQURSUwkweDJBIC8qIENvbHVtbiBBZGRyZXNzIFNldCAqLworI2RlZmluZSBDTURfUEdFQURSUwkweDJCIC8qIFBhZ2UgQWRkcmVzcyBTZXQgKi8KKworI2RlZmluZSBDTURfUkFNV1IJMHgyQyAvKiBNZW1vcnkgV3JpdGUgKi8KKyNkZWZpbmUgQ01EX1JBTVJECTB4MkUgLyogTWVtb3J5IFJlYWQgKi8KKyNkZWZpbmUgQ01EX0NMUlNQQUNFCTB4MkQgLyogQ29sb3IgU3BhY2UgOiA0Sy82NUsvMjYySyAqLworI2RlZmluZSBDTURfUEFSVEFSRUEJMHgzMCAvKiBQYXJ0aWFsIEFyZWEgKi8KKyNkZWZpbmUgQ01EX1ZTQ0xMREVGCTB4MzMgLyogVmVydGljYWwgU2Nyb2xsIERlZmluaXRpb24gKi8KKyNkZWZpbmUgQ01EX1RFRlhMT04JMHgzNCAvKiBUZWFyaW5nIEVmZmVjdCBMaW5lIE9OICovCisjZGVmaW5lIENNRF9URUZYTE9GCTB4MzUgLyogVGVhcmluZyBFZmZlY3QgTGluZSBPRkYgKi8KKyNkZWZpbmUgQ01EX01BRENUTAkweDM2IC8qIE1lbW9yeSBBY2Nlc3MgQ29udHJvbCAqLworCisjZGVmaW5lIENNRF9QSVhGTVQJMHgzQSAvKiBJbnRlcmZhY2UgUGl4ZWwgRm9ybWF0ICovCisjZGVmaW5lIENNRF9GUk1DVFIxCTB4QjEgLyogRnJhbWUgUmF0ZSBDb250cm9sCisJCQkJKEluIG5vcm1hbCBtb2RlL0Z1bGwgY29sb3JzKSAqLworI2RlZmluZSBDTURfRlJNQ1RSMgkweEIyIC8qIEZyYW1lIFJhdGUgQ29udHJvbCAoSW4gSWRsZSBtb2RlLzgtY29sb3JzKSAqLworI2RlZmluZSBDTURfRlJNQ1RSMwkweEIzIC8qIEZyYW1lIFJhdGUgQ29udHJvbAorCQkJCShJbiBQYXJ0aWFsIG1vZGUvZnVsbCBjb2xvcnMpICovCisjZGVmaW5lIENNRF9ESU5WQ1RSCTB4QjQgLyogRGlzcGxheSBJbnZlcnNpb24gQ29udHJvbCAqLworI2RlZmluZSBDTURfUkdCQkxLCTB4QjUgLyogUkdCIEludGVyZmFjZSBCbGFua2luZyBQb3JjaCBzZXR0aW5nICovCisjZGVmaW5lIENNRF9ERlVOQ1RSCTB4QjYgLyogRGlzcGxheSBGdW5jdGlvbiBzZXQgNSAqLworI2RlZmluZSBDTURfU0RSVkRJUgkweEI3IC8qIFNvdXJjZSBEcml2ZXIgRGlyZWN0aW9uIENvbnRyb2wgKi8KKyNkZWZpbmUgQ01EX0dEUlZESVIJMHhCOCAvKiBHYXRlIERyaXZlciBEaXJlY3Rpb24gQ29udHJvbCAgKi8KKworI2RlZmluZSBDTURfUFdDVFIxCTB4QzAgLyogUG93ZXJfQ29udHJvbDEgKi8KKyNkZWZpbmUgQ01EX1BXQ1RSMgkweEMxIC8qIFBvd2VyX0NvbnRyb2wyICovCisjZGVmaW5lIENNRF9QV0NUUjMJMHhDMiAvKiBQb3dlcl9Db250cm9sMyAqLworI2RlZmluZSBDTURfUFdDVFI0CTB4QzMgLyogUG93ZXJfQ29udHJvbDQgKi8KKyNkZWZpbmUgQ01EX1BXQ1RSNQkweEM0IC8qIFBvd2VyX0NvbnRyb2w1ICovCisjZGVmaW5lIENNRF9WQ09NQ1RSMQkweEM1IC8qIFZDT01fQ29udHJvbCAxICovCisjZGVmaW5lIENNRF9WQ09NQ1RSMgkweEM2IC8qIFZDT01fQ29udHJvbCAyICovCisjZGVmaW5lIENNRF9WQ09NT0ZGUwkweEM3IC8qIFZDT00gT2Zmc2V0IENvbnRyb2wgKi8KKyNkZWZpbmUgQ01EX1BHQU1NQUMJMHhFMCAvKiBQb3NpdGl2ZSBHYW1tYSBDb3JyZWN0aW9uIFNldHRpbmcgKi8KKyNkZWZpbmUgQ01EX05HQU1NQUMJMHhFMSAvKiBOZWdhdGl2ZSBHYW1tYSBDb3JyZWN0aW9uIFNldHRpbmcgKi8KKyNkZWZpbmUgQ01EX0dBTVJTRUwJMHhGMiAvKiBHQU1fUl9TRUwgKi8KKworLyoKK1RoaXMgZGlzcGxheToKK2h0dHA6Ly93d3cuZWJheS5jb20vaXRtL1JlcGxhY2UtTm9raWEtNTExMC1MQ0QtMS00NC1SZWQtU2VyaWFsLTEyOFgxMjgtU1BJLUNvbG9yLVRGVC1MQ0QtRGlzcGxheS1Nb2R1bGUtLzI3MTQyMjEyMjI3MQorVGhpcyBwYXJ0aWN1bGFyIGRpc3BsYXkgaGFzIGEgZGVzaWduIGVycm9yISBUaGUgY29udHJvbGxlciBoYXMgMyBwaW5zIHRvCitjb25maWd1cmUgdG8gY29uc3RyYWluIHRoZSBtZW1vcnkgYW5kIHJlc29sdXRpb24gdG8gYSBmaXhlZCBkaW1lbnNpb24gKGluCit0aGF0IGNhc2UgMTI4eDEyOCkgYnV0IHRoZXkgbGVhdmVkIHRob3NlIHBpbnMgY29uZmlndXJlZCBmb3IgMTI4eDE2MCBzbwordGhlcmUgd2FzIHNldmVyYWwgcGl4ZWwgbWVtb3J5IGFkZHJlc3NpbmcgcHJvYmxlbXMuCitJIHNvbHZlZCBieSBzZXR1cCBzZXZlcmFsIHBhcmFtZXRlcnMgdGhhdCBkaW5hbWljYWxseSBmaXggdGhlIHJlc29sdXRpb24gYXMKK25lZWRpdCBzbyBiZWxvdyB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBkaXNwbGF5LiBJZiB5b3UgaGF2ZSBhIHN0cmFpbiBvciBhCitjb3JyZWN0IGRpc3BsYXkgKGNhbiBoYXBwZW4gd2l0aCBjaGluZXNlKSB5b3UgY2FuIGNvcHkgdGhvc2UgcGFyYW1ldGVycyBhbmQKK2NyZWF0ZSBzZXR1cCBmb3IgZGlmZmVyZW50IGRpc3BsYXlzLgorKi8KKworI2lmZGVmIFJFRAorI2RlZmluZSBfX09GRlNFVAkJMzIgLypzZWUgbm90ZSAyIC0gdGhpcyBpcyB0aGUgcmVkIHZlcnNpb24gKi8KKyNlbHNlCisjZGVmaW5lIF9fT0ZGU0VUCQkwICAvKnNlZSBub3RlIDIgLSB0aGlzIGlzIHRoZSBibGFjayB2ZXJzaW9uICovCisjZW5kaWYKKworc3RhdGljIGludCBpbml0X2Rpc3BsYXkoc3RydWN0IGZidGZ0X3BhciAqcGFyKQoreworCWZidGZ0X3Bhcl9kYmcoREVCVUdfSU5JVF9ESVNQTEFZLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlwYXItPmZidGZ0b3BzLnJlc2V0KHBhcik7CisKKwlpZiAocGFyLT5ncGlvLmNzICE9IC0xKQorCQlncGlvX3NldF92YWx1ZShwYXItPmdwaW8uY3MsIDApOyAgLyogQWN0aXZhdGUgY2hpcCAqLworCisJd3JpdGVfcmVnKHBhciwgQ01EX1NXUkVTRVQpOyAvKiBzb2Z0d2FyZSByZXNldCAqLworCW1kZWxheSg1MDApOworCXdyaXRlX3JlZyhwYXIsIENNRF9TTFBPVVQpOyAvKiBleGl0IHNsZWVwICovCisJbWRlbGF5KDUpOworCXdyaXRlX3JlZyhwYXIsIENNRF9QSVhGTVQsIDB4MDUpOyAvKiBTZXQgQ29sb3IgRm9ybWF0IDE2Yml0ICovCisJd3JpdGVfcmVnKHBhciwgQ01EX0dBTU1BU0VULCAweDAyKTsgLyogZGVmYXVsdCBnYW1tYSBjdXJ2ZSAzICovCisjaWZkZWYgR0FNTUFfQURKCisJd3JpdGVfcmVnKHBhciwgQ01EX0dBTVJTRUwsIDB4MDEpOyAvKiBFbmFibGUgR2FtbWEgYWRqICovCisjZW5kaWYKKwl3cml0ZV9yZWcocGFyLCBDTURfTk9STUwpOworCXdyaXRlX3JlZyhwYXIsIENNRF9ERlVOQ1RSLCAweGZmLCAweDA2KTsKKwkvKiBGcmFtZSBSYXRlIENvbnRyb2wgKEluIG5vcm1hbCBtb2RlL0Z1bGwgY29sb3JzKSAqLworCXdyaXRlX3JlZyhwYXIsIENNRF9GUk1DVFIxLCAweDA4LCAweDAyKTsKKwl3cml0ZV9yZWcocGFyLCBDTURfRElOVkNUUiwgMHgwNyk7IC8qIGRpc3BsYXkgaW52ZXJzaW9uICAqLworCS8qIFNldCBWUkgxWzQ6MF0gJiBWQ1syOjBdIGZvciBWQ0kxICYgR1ZERCAqLworCXdyaXRlX3JlZyhwYXIsIENNRF9QV0NUUjEsIDB4MEEsIDB4MDIpOworCS8qIFNldCBCVFsyOjBdIGZvciBBVkREICYgVkNMICYgVkdIICYgVkdMICAqLworCXdyaXRlX3JlZyhwYXIsIENNRF9QV0NUUjIsIDB4MDIpOworCS8qIFNldCBWTUhbNjowXSAmIFZNTFs2OjBdIGZvciBWT01IICYgVkNPTUwgKi8KKwl3cml0ZV9yZWcocGFyLCBDTURfVkNPTUNUUjEsIDB4NTAsIDB4NjMpOworCXdyaXRlX3JlZyhwYXIsIENNRF9WQ09NT0ZGUywgMCk7CisKKwl3cml0ZV9yZWcocGFyLCBDTURfQ0xNQURSUywgMCwgMCwgMCwgV0lEVEgpOyAvKiBTZXQgQ29sdW1uIEFkZHJlc3MgKi8KKwl3cml0ZV9yZWcocGFyLCBDTURfUEdFQURSUywgMCwgMCwgMCwgSEVJR0hUKTsgLyogU2V0IFBhZ2UgQWRkcmVzcyAqLworCisJd3JpdGVfcmVnKHBhciwgQ01EX0RJU1BPTik7IC8qIGRpc3BsYXkgT04gKi8KKwl3cml0ZV9yZWcocGFyLCBDTURfUkFNV1IpOyAvKiBNZW1vcnkgV3JpdGUgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfYWRkcl93aW4oc3RydWN0IGZidGZ0X3BhciAqcGFyLCBpbnQgeHMsIGludCB5cywKKwkJCQlpbnQgeGUsIGludCB5ZSkKK3sKKwlmYnRmdF9wYXJfZGJnKERFQlVHX1NFVF9BRERSX1dJTiwgcGFyLAorCQkiJXMoeHM9JWQsIHlzPSVkLCB4ZT0lZCwgeWU9JWQpXG4iLCBfX2Z1bmNfXywgeHMsIHlzLCB4ZSwgeWUpOworCisJc3dpdGNoIChwYXItPmluZm8tPnZhci5yb3RhdGUpIHsKKwljYXNlIDA6CisJCXdyaXRlX3JlZyhwYXIsIENNRF9DTE1BRFJTLCB4cyA+PiA4LCB4cyAmIDB4ZmYsIHhlID4+IDgsCisJCQkJeGUgJiAweGZmKTsKKwkJd3JpdGVfcmVnKHBhciwgQ01EX1BHRUFEUlMsCisJCQkJKHlzICsgX19PRkZTRVQpID4+IDgsICh5cyArIF9fT0ZGU0VUKSAmIDB4ZmYsCisJCQkJKHllICsgX19PRkZTRVQpID4+IDgsICh5ZSArIF9fT0ZGU0VUKSAmIDB4ZmYpOworCQlicmVhazsKKwljYXNlIDkwOgorCQl3cml0ZV9yZWcocGFyLCBDTURfQ0xNQURSUywKKwkJCQkoeHMgKyBfX09GRlNFVCkgPj4gOCwgKHhzICsgX19PRkZTRVQpICYgMHhmZiwKKwkJCQkoeGUgKyBfX09GRlNFVCkgPj4gOCwgKHhlICsgX19PRkZTRVQpICYgMHhmZik7CisJCXdyaXRlX3JlZyhwYXIsIENNRF9QR0VBRFJTLCB5cyA+PiA4LCB5cyAmIDB4ZmYsIHllID4+IDgsCisJCQkJeWUgJiAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSAxODA6CisJY2FzZSAyNzA6CisJCXdyaXRlX3JlZyhwYXIsIENNRF9DTE1BRFJTLCB4cyA+PiA4LCB4cyAmIDB4ZmYsIHhlID4+IDgsCisJCQkJeGUgJiAweGZmKTsKKwkJd3JpdGVfcmVnKHBhciwgQ01EX1BHRUFEUlMsIHlzID4+IDgsIHlzICYgMHhmZiwgeWUgPj4gOCwKKwkJCQl5ZSAmIDB4ZmYpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwYXItPmluZm8tPnZhci5yb3RhdGUgPSAwOyAvKiBGaXggaW5jb3JyZWN0IHNldHRpbmcgKi8KKwl9CisJd3JpdGVfcmVnKHBhciwgQ01EX1JBTVdSKTsgLyogV3JpdGUgRGF0YSB0byBHUkFNIG1vZGUgKi8KK30KKworLyoKKzcpIE1ZOiAgMShib3R0b20gdG8gdG9wKSwJMCh0b3AgdG8gYm90dG9tKSAgICBSb3cgQWRkcmVzcyBPcmRlcgorNikgTVg6ICAxKFIgdG8gTCksCQkwKEwgdG8gUikJICAgIENvbHVtbiBBZGRyZXNzIE9yZGVyCis1KSBNVjogIDEoRXhjaGFuZ2VkKSwJCTAobm9ybWFsKQkgICAgUm93L0NvbHVtbiBleGNoYW5nZQorNCkgTUw6ICAxKGJvdHRvbSB0byB0b3ApLAkwKHRvcCB0byBib3R0b20pICAgIFZlcnRpY2FsIFJlZnJlc2ggT3JkZXIKKzMpIFJHQjogMShCR1IpLAkJCTAoUkdCKQkJICAgIENvbG9yIFNwYWNlCisyKSBNSDogIDEoUiB0byBMKSwJCTAoTCB0byBSKQkgICAgSG9yaXpvbnRhbCBSZWZyZXNoIE9yZGVyCisxKQorMCkKKworCU1ZLCBNWCwgTVYsIE1MLFJHQiwgTUgsIEQxLCBEMAorCTAgfCAwIHwgMCB8IDAgfCAxIHwgMCB8IDAgfCAwCS8vbm9ybWFsCisJMSB8IDAgfCAwIHwgMCB8IDEgfCAwIHwgMCB8IDAJLy9ZLU1pcnJvcgorCTAgfCAxIHwgMCB8IDAgfCAxIHwgMCB8IDAgfCAwCS8vWC1NaXJyb3IKKwkxIHwgMSB8IDAgfCAwIHwgMSB8IDAgfCAwIHwgMAkvL1gtWS1NaXJyb3IKKwkwIHwgMCB8IDEgfCAwIHwgMSB8IDAgfCAwIHwgMAkvL1gtWSBFeGNoYW5nZQorCTEgfCAwIHwgMSB8IDAgfCAxIHwgMCB8IDAgfCAwCS8vWC1ZIEV4Y2hhbmdlLCBZLU1pcnJvcgorCTAgfCAxIHwgMSB8IDAgfCAxIHwgMCB8IDAgfCAwCS8vWFkgZXhjaGFuZ2UKKwkxIHwgMSB8IDEgfCAwIHwgMSB8IDAgfCAwIHwgMAorKi8KK3N0YXRpYyBpbnQgc2V0X3ZhcihzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpCit7CisJdTggbWFjdHJsX2RhdGEgPSAwOyAvKiBBdm9pZCBjb21waWxlciB3YXJuaW5nICovCisKKwlmYnRmdF9wYXJfZGJnKERFQlVHX0lOSVRfRElTUExBWSwgcGFyLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJc3dpdGNoIChwYXItPmluZm8tPnZhci5yb3RhdGUpIHsKKwljYXNlIDA6CisJCW1hY3RybF9kYXRhID0gMHgwODsKKwkJYnJlYWs7CisJY2FzZSAxODA6CisJCW1hY3RybF9kYXRhID0gMHhDODsKKwkJYnJlYWs7CisJY2FzZSAyNzA6CisJCW1hY3RybF9kYXRhID0gMHhBODsKKwkJYnJlYWs7CisJY2FzZSA5MDoKKwkJbWFjdHJsX2RhdGEgPSAweDY4OworCQlicmVhazsKKwl9CisKKwkvKiBDb2xvcnNwY2FlICovCisJaWYgKHBhci0+YmdyKQorCQltYWN0cmxfZGF0YSB8PSAoMSA8PCAyKTsKKwl3cml0ZV9yZWcocGFyLCBDTURfTUFEQ1RMLCBtYWN0cmxfZGF0YSk7CisJd3JpdGVfcmVnKHBhciwgQ01EX1JBTVdSKTsgLyogV3JpdGUgRGF0YSB0byBHUkFNIG1vZGUgKi8KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIEdBTU1BX0FESgorI2RlZmluZSBDVVJWRShudW0sIGlkeCkgIGN1cnZlc1tudW0qcGFyLT5nYW1tYS5udW1fdmFsdWVzICsgaWR4XQorc3RhdGljIGludCBnYW1tYV9hZGooc3RydWN0IGZidGZ0X3BhciAqcGFyLCB1bnNpZ25lZCBsb25nICpjdXJ2ZXMpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrW10gPSB7CisJCTB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsCisJCTB4MWYsIDB4M2YsIDB4MGYsIDB4MGYsIDB4N2YsIDB4MWYsCisJCTB4M0YsIDB4M0YsIDB4M0YsIDB4M0YsIDB4M0Z9OworCWludCBpLCBqOworCisJZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCWZvciAoaSA9IDA7IGkgPCBHQU1NQV9OVU07IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IEdBTU1BX0xFTjsgaisrKQorCQkJQ1VSVkUoaSwgaikgJj0gbWFza1tpKnBhci0+Z2FtbWEubnVtX3ZhbHVlcyArIGpdOworCisJd3JpdGVfcmVnKHBhciwgQ01EX1BHQU1NQUMsCisJCQkJQ1VSVkUoMCwgMCksCisJCQkJQ1VSVkUoMCwgMSksCisJCQkJQ1VSVkUoMCwgMiksCisJCQkJQ1VSVkUoMCwgMyksCisJCQkJQ1VSVkUoMCwgNCksCisJCQkJQ1VSVkUoMCwgNSksCisJCQkJQ1VSVkUoMCwgNiksCisJCQkJKENVUlZFKDAsIDcpIDw8IDQpIHwgQ1VSVkUoMCwgOCksCisJCQkJQ1VSVkUoMCwgOSksCisJCQkJQ1VSVkUoMCwgMTApLAorCQkJCUNVUlZFKDAsIDExKSwKKwkJCQlDVVJWRSgwLCAxMiksCisJCQkJQ1VSVkUoMCwgMTMpLAorCQkJCUNVUlZFKDAsIDE0KSwKKwkJCQlDVVJWRSgwLCAxNSkKKwkJCQkpOworCisJd3JpdGVfcmVnKHBhciwgQ01EX1JBTVdSKTsgLyogV3JpdGUgRGF0YSB0byBHUkFNIG1vZGUgKi8KKworCXJldHVybiAwOworfQorI3VuZGVmIENVUlZFCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBmYnRmdF9kaXNwbGF5IGRpc3BsYXkgPSB7CisJLnJlZ3dpZHRoID0gOCwKKwkud2lkdGggPSBXSURUSCwKKwkuaGVpZ2h0ID0gSEVJR0hULAorCS5icHAgPSBCUFAsCisJLmZwcyA9IEZQUywKKyNpZmRlZiBHQU1NQV9BREoKKwkuZ2FtbWFfbnVtID0gR0FNTUFfTlVNLAorCS5nYW1tYV9sZW4gPSBHQU1NQV9MRU4sCisJLmdhbW1hID0gREVGQVVMVF9HQU1NQSwKKyNlbmRpZgorCS5mYnRmdG9wcyA9IHsKKwkJLmluaXRfZGlzcGxheSA9IGluaXRfZGlzcGxheSwKKwkJLnNldF9hZGRyX3dpbiA9IHNldF9hZGRyX3dpbiwKKwkJLnNldF92YXIgPSBzZXRfdmFyLAorI2lmZGVmIEdBTU1BX0FESgorCQkuc2V0X2dhbW1hID0gZ2FtbWFfYWRqLAorI2VuZGlmCisJfSwKK307CisKK0ZCVEZUX1JFR0lTVEVSX0RSSVZFUihEUlZOQU1FLCAiaWxpdGVrLGlsaTkxNjMiLCAmZGlzcGxheSk7CisKK01PRFVMRV9BTElBUygic3BpOiIgRFJWTkFNRSk7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWTkFNRSk7CitNT0RVTEVfQUxJQVMoInNwaTppbGk5MTYzIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmlsaTkxNjMiKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJGQiBkcml2ZXIgZm9yIHRoZSBJTEk5MTYzIExDRCBDb250cm9sbGVyIik7CitNT0RVTEVfQVVUSE9SKCJLb3poZXZuaWtvdiBBbmF0b2x5Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTMyMC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjAuYwppbmRleCBiMjZkODkzLi4zYTAyZWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTMyMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzIwLmMKQEAgLTQ3LDYgKzQ3LDcgQEAKIHN0YXRpYyBpbnQgaW5pdF9kaXNwbGF5KHN0cnVjdCBmYnRmdF9wYXIgKnBhcikKIHsKIAl1bnNpZ25lZCBkZXZjb2RlOworCiAJZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAogCXBhci0+ZmJ0ZnRvcHMucmVzZXQocGFyKTsKQEAgLTE3OCwxMCArMTc5LDkgQEAKIHN0YXRpYyBpbnQgc2V0X2dhbW1hKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzKQogewogCXVuc2lnbmVkIGxvbmcgbWFza1tdID0gewotCQkwYjExMTExLCAwYjExMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLAotCQkwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsCi0JCTBiMTExMTEsIDBiMTExMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsCi0JCTBiMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSB9OworCQkweDFmLCAweDFmLCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LAorCQkweDFmLCAweDFmLCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LAorCX07CiAJaW50IGksIGo7CiAKIAlmYnRmdF9wYXJfZGJnKERFQlVHX0lOSVRfRElTUExBWSwgcGFyLCAiJXMoKVxuIiwgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjUuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzI1LmMKaW5kZXggNWY4ODE0NS4uMTlkMjU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzMjUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTMyNS5jCkBAIC00MSwyMiArNDEsMjIgQEAKIG1vZHVsZV9wYXJhbShidCwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGJ0LCAiU2V0cyB0aGUgZmFjdG9yIHVzZWQgaW4gdGhlIHN0ZXAtdXAgY2lyY3VpdHMiKTsKIAotc3RhdGljIHVuc2lnbmVkIHZjID0gMGIwMTE7IC8qIFZjaTE9VmNpKjAuODAgKi8KK3N0YXRpYyB1bnNpZ25lZCB2YyA9IDB4MDM7IC8qIFZjaTE9VmNpKjAuODAgKi8KIG1vZHVsZV9wYXJhbSh2YywgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHZjLAogIlNldHMgdGhlIHJhdGlvIGZhY3RvciBvZiBWY2kgdG8gZ2VuZXJhdGUgdGhlIHJlZmVyZW5jZSB2b2x0YWdlcyBWY2kxIik7CiAKLXN0YXRpYyB1bnNpZ25lZCB2cmggPSAwYjExMDE7IC8qIFZSRUcxT1VUPVZjaSoxLjg1ICovCitzdGF0aWMgdW5zaWduZWQgdnJoID0gMHgwZDsgLyogVlJFRzFPVVQ9VmNpKjEuODUgKi8KIG1vZHVsZV9wYXJhbSh2cmgsIHVpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2cmgsCiAiU2V0IHRoZSBhbXBsaWZ5aW5nIHJhdGUgKDEuNiB+IDEuOSkgb2YgVmNpIGFwcGxpZWQgdG8gb3V0cHV0IHRoZSBWUkVHMU9VVCIpOwogCi1zdGF0aWMgdW5zaWduZWQgdmR2ID0gMGIxMDAxMDsgLyogVkNPTUggYW1wbGl0dWRlPVZSRUcxT1VUKjAuOTggKi8KK3N0YXRpYyB1bnNpZ25lZCB2ZHYgPSAweDEyOyAvKiBWQ09NSCBhbXBsaXR1ZGU9VlJFRzFPVVQqMC45OCAqLwogbW9kdWxlX3BhcmFtKHZkdiwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHZkdiwKICJTZWxlY3QgdGhlIGZhY3RvciBvZiBWUkVHMU9VVCB0byBzZXQgdGhlIGFtcGxpdHVkZSBvZiBWY29tIik7CiAKLXN0YXRpYyB1bnNpZ25lZCB2Y20gPSAwYjAwMTAxMDsgLyogVkNPTUg9VlJFRzFPVVQqMC43MzUgKi8KK3N0YXRpYyB1bnNpZ25lZCB2Y20gPSAweDBhOyAvKiBWQ09NSD1WUkVHMU9VVCowLjczNSAqLwogbW9kdWxlX3BhcmFtKHZjbSwgdWludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHZjbSwgIlNldCB0aGUgaW50ZXJuYWwgVmNvbUggdm9sdGFnZSIpOwogCkBAIC0xMDgsMTEgKzEwOCwxMSBAQAogCWlmIChwYXItPmdwaW8uY3MgIT0gLTEpCiAJCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5jcywgMCk7ICAvKiBBY3RpdmF0ZSBjaGlwICovCiAKLQlidCAmPSAwYjExMTsKLQl2YyAmPSAwYjExMTsKLQl2cmggJj0gMGIxMTExOwotCXZkdiAmPSAwYjExMTExOwotCXZjbSAmPSAwYjExMTExMTsKKwlidCAmPSAweDA3OworCXZjICY9IDB4MDc7CisJdnJoICY9IDB4MGY7CisJdmR2ICY9IDB4MWY7CisJdmNtICY9IDB4M2Y7CiAKIAkvKiBJbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBmcm9tIElMSTkzMjUgQXBwbGljYXRpb24gTm90ZXMgKi8KIApAQCAtMTM3LDcgKzEzNyw3IEBACiAJd3JpdGVfcmVnKHBhciwgMHgwMDEzLCAweDAwMDApOyAvKiBWRFZbNDowXSBmb3IgVkNPTSBhbXBsaXR1ZGUgKi8KIAltZGVsYXkoMjAwKTsgLyogRGlzLWNoYXJnZSBjYXBhY2l0b3IgcG93ZXIgdm9sdGFnZSAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MDAxMCwgLyogU0FQLCBCVFszOjBdLCBBUCwgRFNUQiwgU0xQLCBTVEIgKi8KLQkJKDEgPDwgMTIpIHwgKGJ0IDw8IDgpIHwgKDEgPDwgNykgfCAoMGIwMDEgPDwgNCkpOworCQkoMSA8PCAxMikgfCAoYnQgPDwgOCkgfCAoMSA8PCA3KSB8ICgweDAxIDw8IDQpKTsKIAl3cml0ZV9yZWcocGFyLCAweDAwMTEsIDB4MjIwIHwgdmMpOyAvKiBEQzFbMjowXSwgREMwWzI6MF0sIFZDWzI6MF0gKi8KIAltZGVsYXkoNTApOyAvKiBEZWxheSA1MG1zICovCiAJd3JpdGVfcmVnKHBhciwgMHgwMDEyLCB2cmgpOyAvKiBJbnRlcm5hbCByZWZlcmVuY2Ugdm9sdGFnZT0gVmNpOyAqLwpAQCAtMjMzLDEwICsyMzMsOSBAQAogc3RhdGljIGludCBzZXRfZ2FtbWEoc3RydWN0IGZidGZ0X3BhciAqcGFyLCB1bnNpZ25lZCBsb25nICpjdXJ2ZXMpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXNrW10gPSB7Ci0JCTBiMTExMTEsIDBiMTExMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsCi0JCTBiMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwKLQkJMGIxMTExMSwgMGIxMTExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwKLQkJMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsIDBiMTExIH07CisJCTB4MWYsIDB4MWYsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsCisJCTB4MWYsIDB4MWYsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsCisJfTsKIAlpbnQgaSwgajsKIAogCWZidGZ0X3Bhcl9kYmcoREVCVUdfSU5JVF9ESVNQTEFZLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTM0MC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzNDAuYwppbmRleCA5ODU2ODdkLi4wZjRhNDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTM0MC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzQwLmMKQEAgLTM5LDEyICszOSwxMiBAQAogCXBhci0+ZmJ0ZnRvcHMucmVzZXQocGFyKTsKIAogCXdyaXRlX3JlZyhwYXIsIDB4RUYsIDB4MDMsIDB4ODAsIDB4MDIpOwotCXdyaXRlX3JlZyhwYXIsIDB4Q0YsIDB4MDAgLCAwWEMxICwgMFgzMCk7Ci0Jd3JpdGVfcmVnKHBhciwgMHhFRCwgMHg2NCAsIDB4MDMgLCAwWDEyICwgMFg4MSk7Ci0Jd3JpdGVfcmVnKHBhciwgMHhFOCwgMHg4NSAsIDB4MDAgLCAweDc4KTsKLQl3cml0ZV9yZWcocGFyLCAweENCLCAweDM5ICwgMHgyQyAsIDB4MDAgLCAweDM0ICwgMHgwMik7CisJd3JpdGVfcmVnKHBhciwgMHhDRiwgMHgwMCwgMFhDMSwgMFgzMCk7CisJd3JpdGVfcmVnKHBhciwgMHhFRCwgMHg2NCwgMHgwMywgMFgxMiwgMFg4MSk7CisJd3JpdGVfcmVnKHBhciwgMHhFOCwgMHg4NSwgMHgwMCwgMHg3OCk7CisJd3JpdGVfcmVnKHBhciwgMHhDQiwgMHgzOSwgMHgyQywgMHgwMCwgMHgzNCwgMHgwMik7CiAJd3JpdGVfcmVnKHBhciwgMHhGNywgMHgyMCk7Ci0Jd3JpdGVfcmVnKHBhciwgMHhFQSwgMHgwMCAsIDB4MDApOworCXdyaXRlX3JlZyhwYXIsIDB4RUEsIDB4MDAsIDB4MDApOwogCiAJLyogUG93ZXIgQ29udHJvbCAxICovCiAJd3JpdGVfcmVnKHBhciwgMHhDMCwgMHgyMyk7CkBAIC0xMDQsNyArMTA0LDcgQEAKIAkvKiBDb2x1bW4gYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MkEsIHhzID4+IDgsIHhzICYgMHhGRiwgeGUgPj4gOCwgeGUgJiAweEZGKTsKIAotCS8qIFJvdyBhZHJlc3MgKi8KKwkvKiBSb3cgYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MkIsIHlzID4+IDgsIHlzICYgMHhGRiwgeWUgPj4gOCwgeWUgJiAweEZGKTsKIAogCS8qIE1lbW9yeSB3cml0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzNDEuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5MzQxLmMKaW5kZXggMjI1YjJkOC4uNzA5NDkyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTkzNDEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTM0MS5jCkBAIC00LDcgKzQsNyBAQAogICogVGhpcyBkaXNwbGF5IHVzZXMgOS1iaXQgU1BJOiBEYXRhL0NvbW1hbmQgYml0ICsgOCBkYXRhIGJpdHMKICAqIEZvciBwbGF0Zm9ybXMgdGhhdCBkb2Vzbid0IHN1cHBvcnQgOS1iaXQsIHRoZSBkcml2ZXIgaXMgY2FwYWJsZQogICogb2YgZW11bGF0aW5nIHRoaXMgdXNpbmcgOC1iaXQgdHJhbnNmZXIuCi0gKiBUaGlzIGlzIGRvbmUgYnkgdHJhbnNmZXJpbmcgZWlnaHQgOS1iaXQgd29yZHMgaW4gOSBieXRlcy4KKyAqIFRoaXMgaXMgZG9uZSBieSB0cmFuc2ZlcnJpbmcgZWlnaHQgOS1iaXQgd29yZHMgaW4gOSBieXRlcy4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2hyaXN0aWFuIFZvZ2VsZ3NhbmcKICAqIEJhc2VkIG9uIGFkYWZydWl0MjJmYi5jIGJ5IE5vcmFsZiBUcm9ubmVzCkBAIC04OSw3ICs4OSw3IEBACiAJd3JpdGVfcmVnKHBhciwgMHgyQSwKIAkJKHhzID4+IDgpICYgMHhGRiwgeHMgJiAweEZGLCAoeGUgPj4gOCkgJiAweEZGLCB4ZSAmIDB4RkYpOwogCi0JLyogUm93IGFkcmVzcyBzZXQgKi8KKwkvKiBSb3cgYWRkcmVzcyBzZXQgKi8KIAl3cml0ZV9yZWcocGFyLCAweDJCLAogCQkoeXMgPj4gOCkgJiAweEZGLCB5cyAmIDB4RkYsICh5ZSA+PiA4KSAmIDB4RkYsIHllICYgMHhGRik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5NDgxLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTQ4MS5jCmluZGV4IDcyNTE1N2EuLjhiYWUwOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5NDgxLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTk0ODEuYwpAQCAtNjMsNyArNjMsNyBAQAogCS8qIGNvbHVtbiBhZGRyZXNzICovCiAJd3JpdGVfcmVnKHBhciwgMHgyYSwgeHMgPj4gOCwgeHMgJiAweGZmLCB4ZSA+PiA4LCB4ZSAmIDB4ZmYpOwogCi0JLyogcm93IGFkcmVzcyAqLworCS8qIFJvdyBhZGRyZXNzICovCiAJd3JpdGVfcmVnKHBhciwgMHgyYiwgeXMgPj4gOCwgeXMgJiAweGZmLCB5ZSA+PiA4LCB5ZSAmIDB4ZmYpOwogCiAJLyogbWVtb3J5IHdyaXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTQ4Ni5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX2lsaTk0ODYuYwppbmRleCA5NWI4OTk5Li5kZDRkZGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfaWxpOTQ4Ni5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9pbGk5NDg2LmMKQEAgLTQ0LDEzICs0NCwxMyBAQAogCS0xLCAweEM1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAogCS8qIFBHQU1DVFJMKFBvc2l0aXZlIEdhbW1hIENvbnRyb2wpICovCiAJLTEsIDB4RTAsIDB4MEYsIDB4MUYsIDB4MUMsIDB4MEMsIDB4MEYsIDB4MDgsIDB4NDgsIDB4OTgsCi0JICAgICAgICAgIDB4MzcsIDB4MEEsIDB4MTMsIDB4MDQsIDB4MTEsIDB4MEQsIDB4MDAsCisJCSAgMHgzNywgMHgwQSwgMHgxMywgMHgwNCwgMHgxMSwgMHgwRCwgMHgwMCwKIAkvKiBOR0FNQ1RSTChOZWdhdGl2ZSBHYW1tYSBDb250cm9sKSAqLwogCS0xLCAweEUxLCAweDBGLCAweDMyLCAweDJFLCAweDBCLCAweDBELCAweDA1LCAweDQ3LCAweDc1LAotCSAgICAgICAgICAweDM3LCAweDA2LCAweDEwLCAweDAzLCAweDI0LCAweDIwLCAweDAwLAorCQkgIDB4MzcsIDB4MDYsIDB4MTAsIDB4MDMsIDB4MjQsIDB4MjAsIDB4MDAsCiAJLyogRGlnaXRhbCBHYW1tYSBDb250cm9sIDEgKi8KIAktMSwgMHhFMiwgMHgwRiwgMHgzMiwgMHgyRSwgMHgwQiwgMHgwRCwgMHgwNSwgMHg0NywgMHg3NSwKLQkgICAgICAgICAgMHgzNywgMHgwNiwgMHgxMCwgMHgwMywgMHgyNCwgMHgyMCwgMHgwMCwKKwkJICAweDM3LCAweDA2LCAweDEwLCAweDAzLCAweDI0LCAweDIwLCAweDAwLAogCS8qIFNsZWVwIE9VVCAqLwogCS0xLCAweDExLAogCS8qIERpc3BsYXkgT04gKi8KQEAgLTY3LDcgKzY3LDcgQEAKIAkvKiBDb2x1bW4gYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MkEsIHhzID4+IDgsIHhzICYgMHhGRiwgeGUgPj4gOCwgeGUgJiAweEZGKTsKIAotCS8qIFJvdyBhZHJlc3MgKi8KKwkvKiBSb3cgYWRkcmVzcyAqLwogCXdyaXRlX3JlZyhwYXIsIDB4MkIsIHlzID4+IDgsIHlzICYgMHhGRiwgeWUgPj4gOCwgeWUgJiAweEZGKTsKIAogCS8qIE1lbW9yeSB3cml0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3BjZDg1NDQuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9wY2Q4NTQ0LmMKaW5kZXggOGI5ZWJmYi4uMTVkYTBlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3BjZDg1NDQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfcGNkODU0NC5jCkBAIC0zNCw3ICszNCw3IEBACiAjZGVmaW5lIFdJRFRIICAgICAgICAgIDg0CiAjZGVmaW5lIEhFSUdIVCAgICAgICAgIDQ4CiAjZGVmaW5lIFRYQlVGTEVOICAgICAgICg4NCo2KQotI2RlZmluZSBERUZBVUxUX0dBTU1BICAiNDAiIC8qIGdhbW1hIGlzIHVzZWQgdG8gY29udHJvbCBjb250cmFzdCBpbiB0aGlzIGRyaXZlciAqLworI2RlZmluZSBERUZBVUxUX0dBTU1BICAiNDAiIC8qIGdhbW1hIGNvbnRyb2xzIHRoZSBjb250cmFzdCBpbiB0aGlzIGRyaXZlciAqLwogCiBzdGF0aWMgdW5zaWduZWQgdGM7CiBtb2R1bGVfcGFyYW0odGMsIHVpbnQsIDApOwpAQCAtNTEsNjEgKzUxLDczIEBACiAKIAlwYXItPmZidGZ0b3BzLnJlc2V0KHBhcik7CiAKLQkvKiBGdW5jdGlvbiBzZXQgKi8KLQl3cml0ZV9yZWcocGFyLCAweDIxKTsgLyogNToxICAxCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDI6MCAgUEQgLSBQb3dlcmRvd24gY29udHJvbDogY2hpcCBpcyBhY3RpdmUKLQkJCQkJCQkgMTowICBWICAtIEVudHJ5IG1vZGU6IGhvcml6b250YWwgYWRkcmVzc2luZwotCQkJCQkJCSAwOjEgIEggIC0gRXh0ZW5kZWQgaW5zdHJ1Y3Rpb24gc2V0IGNvbnRyb2w6IGV4dGVuZGVkCi0JCQkJCQkgICovCisJLyogRnVuY3Rpb24gc2V0CisJICoKKwkgKiA1OjEgIDEKKwkgKiAyOjAgIFBEIC0gUG93ZXJkb3duIGNvbnRyb2w6IGNoaXAgaXMgYWN0aXZlCisJICogMTowICBWICAtIEVudHJ5IG1vZGU6IGhvcml6b250YWwgYWRkcmVzc2luZworCSAqIDA6MSAgSCAgLSBFeHRlbmRlZCBpbnN0cnVjdGlvbiBzZXQgY29udHJvbDogZXh0ZW5kZWQKKwkgKi8KKwl3cml0ZV9yZWcocGFyLCAweDIxKTsKIAotCS8qIEg9MSBUZW1wZXJhdHVyZSBjb250cm9sICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwNCB8ICh0YyAmIDB4MykpOyAvKgotCSAgICAgICAgICAgICAgICAgICAgICAgICAyOjEgIDEKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMTp4ICBUQzEgLSBUZW1wZXJhdHVyZSBDb2VmZmljaWVudDogMHgxMAotCQkJCQkJCSAwOnggIFRDMAotCQkJCQkJICAqLworCS8qIEg9MSBUZW1wZXJhdHVyZSBjb250cm9sCisJICoKKwkgKiAyOjEgIDEKKwkgKiAxOnggIFRDMSAtIFRlbXBlcmF0dXJlIENvZWZmaWNpZW50OiAweDEwCisJICogMDp4ICBUQzAKKwkgKi8KKwl3cml0ZV9yZWcocGFyLCAweDA0IHwgKHRjICYgMHgzKSk7CiAKLQkvKiBIPTEgQmlhcyBzeXN0ZW0gKi8KLQl3cml0ZV9yZWcocGFyLCAweDEwIHwgKGJzICYgMHg3KSk7IC8qCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDQ6MSAgMQotCSAgICAgICAgICAgICAgICAgICAgICAgICAzOjAgIDAKLQkJCQkJCQkgMjp4ICBCUzIgLSBCaWFzIFN5c3RlbQotCQkJCQkJCSAxOnggIEJTMQotCQkJCQkJCSAwOnggIEJTMAotCSAgICAgICAgICAgICAgICAgICAgICAqLworCS8qIEg9MSBCaWFzIHN5c3RlbQorCSAqCisJICogNDoxICAxCisJICogMzowICAwCisJICogMjp4ICBCUzIgLSBCaWFzIFN5c3RlbQorCSAqIDE6eCAgQlMxCisJICogMDp4ICBCUzAKKwkgKi8KKwl3cml0ZV9yZWcocGFyLCAweDEwIHwgKGJzICYgMHg3KSk7CiAKLQkvKiBGdW5jdGlvbiBzZXQgKi8KLQl3cml0ZV9yZWcocGFyLCAweDIyKTsgLyogNToxICAxCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDI6MCAgUEQgLSBQb3dlcmRvd24gY29udHJvbDogY2hpcCBpcyBhY3RpdmUKLQkJCQkJCQkgMToxICBWICAtIEVudHJ5IG1vZGU6IHZlcnRpY2FsIGFkZHJlc3NpbmcKLQkJCQkJCQkgMDowICBIICAtIEV4dGVuZGVkIGluc3RydWN0aW9uIHNldCBjb250cm9sOiBiYXNpYwotCQkJCQkJICAqLworCS8qIEZ1bmN0aW9uIHNldAorCSAqCisJICogNToxICAxCisJICogMjowICBQRCAtIFBvd2VyZG93biBjb250cm9sOiBjaGlwIGlzIGFjdGl2ZQorCSAqIDE6MSAgViAgLSBFbnRyeSBtb2RlOiB2ZXJ0aWNhbCBhZGRyZXNzaW5nCisJICogMDowICBIICAtIEV4dGVuZGVkIGluc3RydWN0aW9uIHNldCBjb250cm9sOiBiYXNpYworCSAqLworCXdyaXRlX3JlZyhwYXIsIDB4MjIpOwogCi0JLyogSD0wIERpc3BsYXkgY29udHJvbCAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDggfCA0KTsgLyoKLQkgICAgICAgICAgICAgICAgICAgICAgICAgMzoxICAxCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDI6MSAgRCAgLSBERTogMTA9bm9ybWFsIG1vZGUKLQkJCQkJCQkgMTowICAwCi0JCQkJCQkJIDA6MCAgRQotCQkJCQkJICAqLworCS8qIEg9MCBEaXNwbGF5IGNvbnRyb2wKKwkgKgorCSAqIDM6MSAgMQorCSAqIDI6MSAgRCAgLSBERTogMTA9bm9ybWFsIG1vZGUKKwkgKiAxOjAgIDAKKwkgKiAwOjAgIEUKKwkgKi8KKwl3cml0ZV9yZWcocGFyLCAweDA4IHwgNCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2V0X2FkZHJfd2luKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgaW50IHhzLCBpbnQgeXMsIGludCB4ZSwgaW50IHllKQogewotCWZidGZ0X3Bhcl9kYmcoREVCVUdfU0VUX0FERFJfV0lOLCBwYXIsICIlcyh4cz0lZCwgeXM9JWQsIHhlPSVkLCB5ZT0lZClcbiIsIF9fZnVuY19fLCB4cywgeXMsIHhlLCB5ZSk7CisJZmJ0ZnRfcGFyX2RiZyhERUJVR19TRVRfQUREUl9XSU4sIHBhciwgIiVzKHhzPSVkLCB5cz0lZCwgeGU9JWQsIHllPSVkKVxuIiwKKwkJICAgICAgX19mdW5jX18sIHhzLCB5cywgeGUsIHllKTsKIAotCS8qIEg9MCBTZXQgWCBhZGRyZXNzIG9mIFJBTSAqLwotCXdyaXRlX3JlZyhwYXIsIDB4ODApOyAvKiA3OjEgIDEKLQkgICAgICAgICAgICAgICAgICAgICAgICAgNi0wOiBYWzY6MF0gLSAweDAwCi0JICAgICAgICAgICAgICAgICAgICAgICovCisJLyogSD0wIFNldCBYIGFkZHJlc3Mgb2YgUkFNCisJICoKKwkgKiA3OjEgIDEKKwkgKiA2LTA6IFhbNjowXSAtIDB4MDAKKwkgKi8KKwl3cml0ZV9yZWcocGFyLCAweDgwKTsKIAotCS8qIEg9MCBTZXQgWSBhZGRyZXNzIG9mIFJBTSAqLwotCXdyaXRlX3JlZyhwYXIsIDB4NDApOyAvKiA3OjAgIDAKLQkgICAgICAgICAgICAgICAgICAgICAgICAgNjoxICAxCi0JICAgICAgICAgICAgICAgICAgICAgICAgIDItMDogWVsyOjBdIC0gMHgwCi0JICAgICAgICAgICAgICAgICAgICAgICovCisJLyogSD0wIFNldCBZIGFkZHJlc3Mgb2YgUkFNCisJICoKKwkgKiA3OjAgIDAKKwkgKiA2OjEgIDEKKwkgKiAyLTA6IFlbMjowXSAtIDB4MAorCSAqLworCXdyaXRlX3JlZyhwYXIsIDB4NDApOwogfQogCiBzdGF0aWMgaW50IHdyaXRlX3ZtZW0oc3RydWN0IGZidGZ0X3BhciAqcGFyLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuKQpAQCAtMTIwLDkgKzEzMiw4IEBACiAJZm9yICh4ID0gMDsgeCA8IDg0OyB4KyspIHsKIAkJZm9yICh5ID0gMDsgeSA8IDY7IHkrKykgewogCQkJKmJ1ZiA9IDB4MDA7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQogCQkJCSpidWYgfD0gKHZtZW0xNlsoeSo4K2kpKjg0K3hdID8gMSA6IDApIDw8IGk7Ci0JCQl9CiAJCQlidWYrKzsKIAkJfQogCX0KQEAgLTEzMSw3ICsxNDIsOCBAQAogCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5kYywgMSk7CiAJcmV0ID0gcGFyLT5mYnRmdG9wcy53cml0ZShwYXIsIHBhci0+dHhidWYuYnVmLCA2Kjg0KTsKIAlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgIiVzOiB3cml0ZSBmYWlsZWQgYW5kIHJldHVybmVkOiAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsICJ3cml0ZSBmYWlsZWQgYW5kIHJldHVybmVkOiAlZFxuIiwKKwkJCXJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3JhODg3NS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3JhODg3NS5jCmluZGV4IGMzMjNjMDYuLjJjNGQ0ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9yYTg4NzUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfcmE4ODc1LmMKQEAgLTExLDcgKzExLDcgQEAKIAkJCQkJCSAgKioqKiogICAgICAqICAgKgogICBEYXRlICAgIDogMTAuMDYuMjAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgICoKICAgVmVyc2lvbiA6IFYxLjEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioKLSAgUmV2aXNvbiA6IDUKKyAgUmV2aXNpb24gOiA1CiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CkBAIC03OSwxMTIgKzc5LDExMiBAQAogCiAJaWYgKChwYXItPmluZm8tPnZhci54cmVzID09IDMyMCkgJiYgKHBhci0+aW5mby0+dmFyLnlyZXMgPT0gMjQwKSkgewogCQkvKiBQTEwgY2xvY2sgZnJlcXVlbmN5ICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4ODggLCAweDBBKTsKLQkJd3JpdGVfcmVnKHBhciwgMHg4OSAsIDB4MDIpOworCQl3cml0ZV9yZWcocGFyLCAweDg4LCAweDBBKTsKKwkJd3JpdGVfcmVnKHBhciwgMHg4OSwgMHgwMik7CiAJCW1kZWxheSgxMCk7CiAJCS8qIGNvbG9yIGRlZXAgLyBNQ1UgSW50ZXJmYWNlICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTAgLCAweDBDKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxMCwgMHgwQyk7CiAJCS8qIHBpeGVsIGNsb2NrIHBlcmlvZCAgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHgwNCAsIDB4MDMpOworCQl3cml0ZV9yZWcocGFyLCAweDA0LCAweDAzKTsKIAkJbWRlbGF5KDEpOwogCQkvKiBob3Jpem9udGFsIHNldHRpbmdzICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTQgLCAweDI3KTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxNSAsIDB4MDApOwotCQl3cml0ZV9yZWcocGFyLCAweDE2ICwgMHgwNSk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTcgLCAweDA0KTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxOCAsIDB4MDMpOworCQl3cml0ZV9yZWcocGFyLCAweDE0LCAweDI3KTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxNSwgMHgwMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTYsIDB4MDUpOworCQl3cml0ZV9yZWcocGFyLCAweDE3LCAweDA0KTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxOCwgMHgwMyk7CiAJCS8qIHZlcnRpY2FsIHNldHRpbmdzICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTkgLCAweEVGKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxQSAsIDB4MDApOwotCQl3cml0ZV9yZWcocGFyLCAweDFCICwgMHgwNSk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUMgLCAweDAwKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxRCAsIDB4MEUpOwotCQl3cml0ZV9yZWcocGFyLCAweDFFICwgMHgwMCk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUYgLCAweDAyKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxOSwgMHhFRik7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUEsIDB4MDApOworCQl3cml0ZV9yZWcocGFyLCAweDFCLCAweDA1KTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxQywgMHgwMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUQsIDB4MEUpOworCQl3cml0ZV9yZWcocGFyLCAweDFFLCAweDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxRiwgMHgwMik7CiAJfSBlbHNlIGlmICgocGFyLT5pbmZvLT52YXIueHJlcyA9PSA0ODApICYmIChwYXItPmluZm8tPnZhci55cmVzID09IDI3MikpIHsKIAkJLyogUExMIGNsb2NrIGZyZXF1ZW5jeSAgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHg4OCAsIDB4MEEpOwotCQl3cml0ZV9yZWcocGFyLCAweDg5ICwgMHgwMik7CisJCXdyaXRlX3JlZyhwYXIsIDB4ODgsIDB4MEEpOworCQl3cml0ZV9yZWcocGFyLCAweDg5LCAweDAyKTsKIAkJbWRlbGF5KDEwKTsKIAkJLyogY29sb3IgZGVlcCAvIE1DVSBJbnRlcmZhY2UgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHgxMCAsIDB4MEMpOworCQl3cml0ZV9yZWcocGFyLCAweDEwLCAweDBDKTsKIAkJLyogcGl4ZWwgY2xvY2sgcGVyaW9kICAqLwotCQl3cml0ZV9yZWcocGFyLCAweDA0ICwgMHg4Mik7CisJCXdyaXRlX3JlZyhwYXIsIDB4MDQsIDB4ODIpOwogCQltZGVsYXkoMSk7CiAJCS8qIGhvcml6b250YWwgc2V0dGluZ3MgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHgxNCAsIDB4M0IpOwotCQl3cml0ZV9yZWcocGFyLCAweDE1ICwgMHgwMCk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTYgLCAweDAxKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxNyAsIDB4MDApOwotCQl3cml0ZV9yZWcocGFyLCAweDE4ICwgMHgwNSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTQsIDB4M0IpOworCQl3cml0ZV9yZWcocGFyLCAweDE1LCAweDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxNiwgMHgwMSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTcsIDB4MDApOworCQl3cml0ZV9yZWcocGFyLCAweDE4LCAweDA1KTsKIAkJLyogdmVydGljYWwgc2V0dGluZ3MgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHgxOSAsIDB4MEYpOwotCQl3cml0ZV9yZWcocGFyLCAweDFBICwgMHgwMSk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUIgLCAweDAyKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxQyAsIDB4MDApOwotCQl3cml0ZV9yZWcocGFyLCAweDFEICwgMHgwNyk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUUgLCAweDAwKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxRiAsIDB4MDkpOworCQl3cml0ZV9yZWcocGFyLCAweDE5LCAweDBGKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxQSwgMHgwMSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUIsIDB4MDIpOworCQl3cml0ZV9yZWcocGFyLCAweDFDLCAweDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxRCwgMHgwNyk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUUsIDB4MDApOworCQl3cml0ZV9yZWcocGFyLCAweDFGLCAweDA5KTsKIAl9IGVsc2UgaWYgKChwYXItPmluZm8tPnZhci54cmVzID09IDY0MCkgJiYgKHBhci0+aW5mby0+dmFyLnlyZXMgPT0gNDgwKSkgewogCQkvKiBQTEwgY2xvY2sgZnJlcXVlbmN5ICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4ODggLCAweDBCKTsKLQkJd3JpdGVfcmVnKHBhciwgMHg4OSAsIDB4MDIpOworCQl3cml0ZV9yZWcocGFyLCAweDg4LCAweDBCKTsKKwkJd3JpdGVfcmVnKHBhciwgMHg4OSwgMHgwMik7CiAJCW1kZWxheSgxMCk7CiAJCS8qIGNvbG9yIGRlZXAgLyBNQ1UgSW50ZXJmYWNlICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTAgLCAweDBDKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxMCwgMHgwQyk7CiAJCS8qIHBpeGVsIGNsb2NrIHBlcmlvZCAqLwotCQl3cml0ZV9yZWcocGFyLCAweDA0ICwgMHgwMSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MDQsIDB4MDEpOwogCQltZGVsYXkoMSk7CiAJCS8qIGhvcml6b250YWwgc2V0dGluZ3MgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHgxNCAsIDB4NEYpOwotCQl3cml0ZV9yZWcocGFyLCAweDE1ICwgMHgwNSk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTYgLCAweDBGKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxNyAsIDB4MDEpOwotCQl3cml0ZV9yZWcocGFyLCAweDE4ICwgMHgwMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTQsIDB4NEYpOworCQl3cml0ZV9yZWcocGFyLCAweDE1LCAweDA1KTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxNiwgMHgwRik7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTcsIDB4MDEpOworCQl3cml0ZV9yZWcocGFyLCAweDE4LCAweDAwKTsKIAkJLyogdmVydGljYWwgc2V0dGluZ3MgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHgxOSAsIDB4REYpOwotCQl3cml0ZV9yZWcocGFyLCAweDFBICwgMHgwMSk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUIgLCAweDBBKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxQyAsIDB4MDApOwotCQl3cml0ZV9yZWcocGFyLCAweDFEICwgMHgwRSk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUUgLCAweDAwKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxRiAsIDB4MDEpOworCQl3cml0ZV9yZWcocGFyLCAweDE5LCAweERGKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxQSwgMHgwMSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUIsIDB4MEEpOworCQl3cml0ZV9yZWcocGFyLCAweDFDLCAweDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxRCwgMHgwRSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUUsIDB4MDApOworCQl3cml0ZV9yZWcocGFyLCAweDFGLCAweDAxKTsKIAl9IGVsc2UgaWYgKChwYXItPmluZm8tPnZhci54cmVzID09IDgwMCkgJiYgKHBhci0+aW5mby0+dmFyLnlyZXMgPT0gNDgwKSkgewogCQkvKiBQTEwgY2xvY2sgZnJlcXVlbmN5ICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4ODggLCAweDBCKTsKLQkJd3JpdGVfcmVnKHBhciwgMHg4OSAsIDB4MDIpOworCQl3cml0ZV9yZWcocGFyLCAweDg4LCAweDBCKTsKKwkJd3JpdGVfcmVnKHBhciwgMHg4OSwgMHgwMik7CiAJCW1kZWxheSgxMCk7CiAJCS8qIGNvbG9yIGRlZXAgLyBNQ1UgSW50ZXJmYWNlICovCi0JCXdyaXRlX3JlZyhwYXIsIDB4MTAgLCAweDBDKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxMCwgMHgwQyk7CiAJCS8qIHBpeGVsIGNsb2NrIHBlcmlvZCAqLwotCQl3cml0ZV9yZWcocGFyLCAweDA0ICwgMHg4MSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MDQsIDB4ODEpOwogCQltZGVsYXkoMSk7CiAJCS8qIGhvcml6b250YWwgc2V0dGluZ3MgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHgxNCAsIDB4NjMpOwotCQl3cml0ZV9yZWcocGFyLCAweDE1ICwgMHgwMyk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTYgLCAweDAzKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxNyAsIDB4MDIpOwotCQl3cml0ZV9yZWcocGFyLCAweDE4ICwgMHgwMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTQsIDB4NjMpOworCQl3cml0ZV9yZWcocGFyLCAweDE1LCAweDAzKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxNiwgMHgwMyk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTcsIDB4MDIpOworCQl3cml0ZV9yZWcocGFyLCAweDE4LCAweDAwKTsKIAkJLyogdmVydGljYWwgc2V0dGluZ3MgKi8KLQkJd3JpdGVfcmVnKHBhciwgMHgxOSAsIDB4REYpOwotCQl3cml0ZV9yZWcocGFyLCAweDFBICwgMHgwMSk7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUIgLCAweDE0KTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxQyAsIDB4MDApOwotCQl3cml0ZV9yZWcocGFyLCAweDFEICwgMHgwNik7Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MUUgLCAweDAwKTsKLQkJd3JpdGVfcmVnKHBhciwgMHgxRiAsIDB4MDEpOworCQl3cml0ZV9yZWcocGFyLCAweDE5LCAweERGKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxQSwgMHgwMSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUIsIDB4MTQpOworCQl3cml0ZV9yZWcocGFyLCAweDFDLCAweDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxRCwgMHgwNik7CisJCXdyaXRlX3JlZyhwYXIsIDB4MUUsIDB4MDApOworCQl3cml0ZV9yZWcocGFyLCAweDFGLCAweDAxKTsKIAl9IGVsc2UgewogCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLCAiZGlzcGxheSBzaXplIGlzIG5vdCBzdXBwb3J0ZWQhISIpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJLyogUFdNIGNsb2NrICovCi0Jd3JpdGVfcmVnKHBhciwgMHg4YSAsIDB4ODEpOwotCXdyaXRlX3JlZyhwYXIsIDB4OGIgLCAweEZGKTsKKwl3cml0ZV9yZWcocGFyLCAweDhhLCAweDgxKTsKKwl3cml0ZV9yZWcocGFyLCAweDhiLCAweEZGKTsKIAltZGVsYXkoMTApOwogCiAJLyogRGlzcGxheSBPTiAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDEgLCAweDgwKTsKKwl3cml0ZV9yZWcocGFyLCAweDAxLCAweDgwKTsKIAltZGVsYXkoMTApOwogCiAJcmV0dXJuIDA7CkBAIC0xOTYsMTQgKzE5NiwxNCBAQAogCQkiJXMoeHM9JWQsIHlzPSVkLCB4ZT0lZCwgeWU9JWQpXG4iLCBfX2Z1bmNfXywgeHMsIHlzLCB4ZSwgeWUpOwogCiAJLyogU2V0X0FjdGl2ZV9XaW5kb3cgKi8KLQl3cml0ZV9yZWcocGFyLCAweDMwICwgeHMgJiAweDAwRkYpOwotCXdyaXRlX3JlZyhwYXIsIDB4MzEgLCAoeHMgJiAweEZGMDApID4+IDgpOwotCXdyaXRlX3JlZyhwYXIsIDB4MzIgLCB5cyAmIDB4MDBGRik7Ci0Jd3JpdGVfcmVnKHBhciwgMHgzMyAsICh5cyAmIDB4RkYwMCkgPj4gOCk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgzNCAsICh4cyt4ZSkgJiAweDAwRkYpOwotCXdyaXRlX3JlZyhwYXIsIDB4MzUgLCAoKHhzK3hlKSAmIDB4RkYwMCkgPj4gOCk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgzNiAsICh5cyt5ZSkgJiAweDAwRkYpOwotCXdyaXRlX3JlZyhwYXIsIDB4MzcgLCAoKHlzK3llKSAmIDB4RkYwMCkgPj4gOCk7CisJd3JpdGVfcmVnKHBhciwgMHgzMCwgeHMgJiAweDAwRkYpOworCXdyaXRlX3JlZyhwYXIsIDB4MzEsICh4cyAmIDB4RkYwMCkgPj4gOCk7CisJd3JpdGVfcmVnKHBhciwgMHgzMiwgeXMgJiAweDAwRkYpOworCXdyaXRlX3JlZyhwYXIsIDB4MzMsICh5cyAmIDB4RkYwMCkgPj4gOCk7CisJd3JpdGVfcmVnKHBhciwgMHgzNCwgKHhzK3hlKSAmIDB4MDBGRik7CisJd3JpdGVfcmVnKHBhciwgMHgzNSwgKCh4cyt4ZSkgJiAweEZGMDApID4+IDgpOworCXdyaXRlX3JlZyhwYXIsIDB4MzYsICh5cyt5ZSkgJiAweDAwRkYpOworCXdyaXRlX3JlZyhwYXIsIDB4MzcsICgoeXMreWUpICYgMHhGRjAwKSA+PiA4KTsKIAogCS8qIFNldF9NZW1vcnlfV3JpdGVfQ3Vyc29yICovCiAJd3JpdGVfcmVnKHBhciwgMHg0NiwgIHhzICYgMHhmZik7CkBAIC0yMzgsOCArMjM4LDggQEAKIAlyZXQgPSBwYXItPmZidGZ0b3BzLndyaXRlKHBhciwgcGFyLT5idWYsIDIpOwogCWlmIChyZXQgPCAwKSB7CiAJCXZhX2VuZChhcmdzKTsKLQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgIiVzOiB3cml0ZSgpIGZhaWxlZCBhbmQgcmV0dXJuZWQgJWRuIiwKLQkJCV9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLCAid3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkbiIsCisJCQlyZXQpOwogCQlyZXR1cm47CiAJfQogCWxlbi0tOwpAQCAtMjU2LDggKzI1Niw4IEBACiAJCXJldCA9IHBhci0+ZmJ0ZnRvcHMud3JpdGUocGFyLCBwYXItPmJ1ZiwgbGVuICsgMSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQl2YV9lbmQoYXJncyk7Ci0JCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLCAiJXM6IHdyaXRlKCkgZmFpbGVkIGFuZCByZXR1cm5lZCAlZG4iLAotCQkJCV9fZnVuY19fLCByZXQpOworCQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwKKwkJCQkid3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkbiIsIHJldCk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMDJhMS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3M2ZDAyYTEuYwppbmRleCBlNDEyYTQyLi5mMzMwMjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMDJhMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zNmQwMmExLmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogCS8qIENvbHVtbiBhZGRyZXNzICovCiAJd3JpdGVfcmVnKHBhciwgMHgyQSwgeHMgPj4gOCwgeHMgJiAweEZGLCB4ZSA+PiA4LCB4ZSAmIDB4RkYpOwogCi0JLyogUm93IGFkcmVzcyAqLworCS8qIFJvdyBhZGRyZXNzICovCiAJd3JpdGVfcmVnKHBhciwgMHgyQiwgeXMgPj4gOCwgeXMgJiAweEZGLCB5ZSA+PiA4LCB5ZSAmIDB4RkYpOwogCiAJLyogTWVtb3J5IHdyaXRlICovCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJd3JpdGVfcmVnKHBhciwgMHgzNiwgTVkgfCBNViB8IChwYXItPmJnciA8PCAzKSk7CiAJCWJyZWFrOwogCWNhc2UgMTgwOgotCQl3cml0ZV9yZWcocGFyLCAweDM2LCAocGFyLT5iZ3IgPDwgMykpOworCQl3cml0ZV9yZWcocGFyLCAweDM2LCBwYXItPmJnciA8PCAzKTsKIAkJYnJlYWs7CiAJY2FzZSA5MDoKIAkJd3JpdGVfcmVnKHBhciwgMHgzNiwgTVggfCBNViB8IChwYXItPmJnciA8PCAzKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMTEyMS5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3M2ZDExMjEuYwppbmRleCAxZWY4YzFhLi4yZTFiNzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfczZkMTEyMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zNmQxMTIxLmMKQEAgLTE0MywxMiArMTQzLDEwIEBACiBzdGF0aWMgaW50IHNldF9nYW1tYShzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIHVuc2lnbmVkIGxvbmcgKmN1cnZlcykKIHsKIAl1bnNpZ25lZCBsb25nIG1hc2tbXSA9IHsKLQkJMGIxMTExMTEsIDBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLCAwYjExMTExMSwgCi0JCTBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsCi0JCTBiMTExMTEsIDBiMTExMTEsCi0JCTBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsCi0JCTBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsIDBiMTExMTExLCAwYjExMTExMSwgMGIxMTExMTEsCi0JCTBiMTExMTEsIDBiMTExMTEgfTsKKwkJMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwKKwkJMHgzZiwgMHgzZiwgMHgxZiwgMHgxZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwKKwkJMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgzZiwgMHgxZiwgMHgxZiwKKwl9OwogCWludCBpLCBqOwogCiAJZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwgIiVzKClcbiIsIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMjg5LmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTI4OS5jCmluZGV4IGVmNDZmYmMuLjE3YTc3ZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMjg5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEyODkuYwpAQCAtMTI2LDE2ICsxMjYsMTYgQEAKIAogCXN3aXRjaCAocGFyLT5pbmZvLT52YXIucm90YXRlKSB7CiAJY2FzZSAwOgotCQl3cml0ZV9yZWcocGFyLCAweDExLCByZWcxMSB8IDBiMTEwMDAwKTsKKwkJd3JpdGVfcmVnKHBhciwgMHgxMSwgcmVnMTEgfCAweDMwKTsKIAkJYnJlYWs7CiAJY2FzZSAyNzA6Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTEsIHJlZzExIHwgMGIxMDEwMDApOworCQl3cml0ZV9yZWcocGFyLCAweDExLCByZWcxMSB8IDB4MjgpOwogCQlicmVhazsKIAljYXNlIDE4MDoKLQkJd3JpdGVfcmVnKHBhciwgMHgxMSwgcmVnMTEgfCAwYjAwMDAwMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4MTEsIHJlZzExIHwgMHgwMCk7CiAJCWJyZWFrOwogCWNhc2UgOTA6Ci0JCXdyaXRlX3JlZyhwYXIsIDB4MTEsIHJlZzExIHwgMGIwMTEwMDApOworCQl3cml0ZV9yZWcocGFyLCAweDExLCByZWcxMSB8IDB4MTgpOwogCQlicmVhazsKIAl9CiAKQEAgLTE1MSwxMCArMTUxLDkgQEAKIHN0YXRpYyBpbnQgc2V0X2dhbW1hKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzKQogewogCXVuc2lnbmVkIGxvbmcgbWFza1tdID0gewotCQkwYjExMTExLCAwYjExMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLAotCQkwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsCi0JCTBiMTExMTEsIDBiMTExMTEsIDBiMTExLCAwYjExMSwgMGIxMTEsCi0JCTBiMTExLCAwYjExMSwgMGIxMTEsIDBiMTExLCAwYjExMSB9OworCQkweDFmLCAweDFmLCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LAorCQkweDFmLCAweDFmLCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA3LAorCX07CiAJaW50IGksIGo7CiAKIAlmYnRmdF9wYXJfZGJnKERFQlVHX0lOSVRfRElTUExBWSwgcGFyLCAiJXMoKVxuIiwgX19mdW5jX18pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMDYuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzA2LmMKaW5kZXggNWVhMTk1Yi4uMTVlZTQ0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMDYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTMwNi5jCkBAIC0xOTMsOCArMTkzLDggQEAKIAlyZXQgPSBwYXItPmZidGZ0b3BzLndyaXRlKHBhciwgcGFyLT50eGJ1Zi5idWYsCiAJCQkJcGFyLT5pbmZvLT52YXIueHJlcypwYXItPmluZm8tPnZhci55cmVzLzgpOwogCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAotCQkJIiVzOiB3cml0ZSBmYWlsZWQgYW5kIHJldHVybmVkOiAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsICJ3cml0ZSBmYWlsZWQgYW5kIHJldHVybmVkOiAlZFxuIiwKKwkJCXJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMzEuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzMxLmMKaW5kZXggZGE3NDY0Zi4uNWJiNzQxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzMzEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTMzMS5jCkBAIC0yOSwyNCArMjksMjQgQEAKIAogCXdyaXRlX3JlZyhwYXIsIDB4YWUpOyAvKiBEaXNwbGF5IE9mZiAqLwogCXdyaXRlX3JlZyhwYXIsIDB4YTAsIDB4NzAgfCAocGFyLT5iZ3IgPDwgMikpOyAvKiBTZXQgQ29sb3VyIERlcHRoICovCi0Jd3JpdGVfcmVnKHBhciwgMHg3Mik7IC8vIFJHQiBjb2xvdXIKKwl3cml0ZV9yZWcocGFyLCAweDcyKTsgLyogUkdCIGNvbG91ciAqLwogCXdyaXRlX3JlZyhwYXIsIDB4YTEsIDB4MDApOyAvKiBTZXQgRGlzcGxheSBTdGFydCBMaW5lICovCiAJd3JpdGVfcmVnKHBhciwgMHhhMiwgMHgwMCk7IC8qIFNldCBEaXNwbGF5IE9mZnNldCAqLwogCXdyaXRlX3JlZyhwYXIsIDB4YTQpOyAvKiBOT1JNQUxESVNQTEFZICovCi0Jd3JpdGVfcmVnKHBhciwgMHhhOCwgMHgzZik7IC8vIFNldCBtdWx0aXBsZXgKLQl3cml0ZV9yZWcocGFyLCAweGFkLCAweDhlKTsgLy8gU2V0IG1hc3RlcgotCS8vIHdyaXRlX3JlZyhwYXIsIDB4YjAsIDB4MGIpOyAvLyBTZXQgcG93ZXIgbW9kZQotCXdyaXRlX3JlZyhwYXIsIDB4YjEsIDB4MzEpOyAvLyBQcmVjaGFyZ2UKLQl3cml0ZV9yZWcocGFyLCAweGIzLCAweGYwKTsgLy8gQ2xvY2sgZGl2Ci0Jd3JpdGVfcmVnKHBhciwgMHg4YSwgMHg2NCk7IC8vIFByZWNoYXJnZSBBCi0Jd3JpdGVfcmVnKHBhciwgMHg4YiwgMHg3OCk7IC8vIFByZWNoYXJnZSBCCi0Jd3JpdGVfcmVnKHBhciwgMHg4YywgMHg2NCk7IC8vIFByZWNoYXJnZSBDCi0Jd3JpdGVfcmVnKHBhciwgMHhiYiwgMHgzYSk7IC8vIFByZWNoYXJnZSBsZXZlbAotCXdyaXRlX3JlZyhwYXIsIDB4YmUsIDB4M2UpOyAvLyB2Y29taAotCXdyaXRlX3JlZyhwYXIsIDB4ODcsIDB4MDYpOyAvLyBNYXN0ZXIgY3VycmVudAotCXdyaXRlX3JlZyhwYXIsIDB4ODEsIDB4OTEpOyAvLyBDb250cmFzdCBBCi0Jd3JpdGVfcmVnKHBhciwgMHg4MiwgMHg1MCk7IC8vIENvbnRyYXN0IEIKLQl3cml0ZV9yZWcocGFyLCAweDgzLCAweDdkKTsgLy8gQ29udHJhc3QgQworCXdyaXRlX3JlZyhwYXIsIDB4YTgsIDB4M2YpOyAvKiBTZXQgbXVsdGlwbGV4ICovCisJd3JpdGVfcmVnKHBhciwgMHhhZCwgMHg4ZSk7IC8qIFNldCBtYXN0ZXIgKi8KKwkvKiB3cml0ZV9yZWcocGFyLCAweGIwLCAweDBiKTsgIFNldCBwb3dlciBtb2RlICovCisJd3JpdGVfcmVnKHBhciwgMHhiMSwgMHgzMSk7IC8qIFByZWNoYXJnZSAqLworCXdyaXRlX3JlZyhwYXIsIDB4YjMsIDB4ZjApOyAvKiBDbG9jayBkaXYgKi8KKwl3cml0ZV9yZWcocGFyLCAweDhhLCAweDY0KTsgLyogUHJlY2hhcmdlIEEgKi8KKwl3cml0ZV9yZWcocGFyLCAweDhiLCAweDc4KTsgLyogUHJlY2hhcmdlIEIgKi8KKwl3cml0ZV9yZWcocGFyLCAweDhjLCAweDY0KTsgLyogUHJlY2hhcmdlIEMgKi8KKwl3cml0ZV9yZWcocGFyLCAweGJiLCAweDNhKTsgLyogUHJlY2hhcmdlIGxldmVsICovCisJd3JpdGVfcmVnKHBhciwgMHhiZSwgMHgzZSk7IC8qIHZjb21oICovCisJd3JpdGVfcmVnKHBhciwgMHg4NywgMHgwNik7IC8qIE1hc3RlciBjdXJyZW50ICovCisJd3JpdGVfcmVnKHBhciwgMHg4MSwgMHg5MSk7IC8qIENvbnRyYXN0IEEgKi8KKwl3cml0ZV9yZWcocGFyLCAweDgyLCAweDUwKTsgLyogQ29udHJhc3QgQiAqLworCXdyaXRlX3JlZyhwYXIsIDB4ODMsIDB4N2QpOyAvKiBDb250cmFzdCBDICovCiAJd3JpdGVfcmVnKHBhciwgMHhhZik7IC8qIFNldCBTbGVlcCBNb2RlIERpc3BsYXkgT24gKi8KIAogCXJldHVybiAwOwpAQCAtNjksOSArNjksOCBAQAogCiAJaWYgKHVubGlrZWx5KHBhci0+ZGVidWcgJiBERUJVR19XUklURV9SRUdJU1RFUikpIHsKIAkJdmFfc3RhcnQoYXJncywgbGVuKTsKLQkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKIAkJCWJ1ZltpXSA9ICh1OCl2YV9hcmcoYXJncywgdW5zaWduZWQgaW50KTsKLQkJfQogCQl2YV9lbmQoYXJncyk7CiAJCWZidGZ0X3Bhcl9kYmdfaGV4KERFQlVHX1dSSVRFX1JFR0lTVEVSLCBwYXIsIHBhci0+aW5mby0+ZGV2aWNlLCB1OCwgYnVmLCBsZW4sICIlczogIiwgX19mdW5jX18pOwogCX0KQEAgLTg0LDIwICs4MywyMSBAQAogCXJldCA9IHBhci0+ZmJ0ZnRvcHMud3JpdGUocGFyLCBwYXItPmJ1Ziwgc2l6ZW9mKHU4KSk7CiAJaWYgKHJldCA8IDApIHsKIAkJdmFfZW5kKGFyZ3MpOwotCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLCAiJXM6IHdyaXRlKCkgZmFpbGVkIGFuZCByZXR1cm5lZCAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCisJCQkid3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkXG4iLCByZXQpOwogCQlyZXR1cm47CiAJfQogCWxlbi0tOwogCiAJaWYgKGxlbikgewogCQlpID0gbGVuOwotCQl3aGlsZSAoaS0tKSB7CisJCXdoaWxlIChpLS0pCiAJCQkqYnVmKysgPSAodTgpdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7Ci0JCX0KIAkJcmV0ID0gcGFyLT5mYnRmdG9wcy53cml0ZShwYXIsIHBhci0+YnVmLCBsZW4gKiAoc2l6ZW9mKHU4KSkpOwogCQlpZiAocmV0IDwgMCkgewogCQkJdmFfZW5kKGFyZ3MpOwotCQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwgIiVzOiB3cml0ZSgpIGZhaWxlZCBhbmQgcmV0dXJuZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwKKwkJCQkid3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkXG4iLCByZXQpOwogCQkJcmV0dXJuOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzNTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zc2QxMzUxLmMKaW5kZXggMDYyZDk4Ni4uOWJjZDdhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3NzZDEzNTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3NkMTM1MS5jCkBAIC03Miw2ICs3Miw3IEBACiBzdGF0aWMgaW50IHNldF92YXIoc3RydWN0IGZidGZ0X3BhciAqcGFyKQogewogCXVuc2lnbmVkIHJlbWFwOworCiAJZmJ0ZnRfcGFyX2RiZyhERUJVR19JTklUX0RJU1BMQVksIHBhciwgIiVzKClcbiIsIF9fZnVuY19fKTsKIAogCWlmIChwYXItPmZidGZ0b3BzLmluaXRfZGlzcGxheSAhPSBpbml0X2Rpc3BsYXkpIHsKQEAgLTg2LDE2ICs4NywxNiBAQAogCiAJc3dpdGNoIChwYXItPmluZm8tPnZhci5yb3RhdGUpIHsKIAljYXNlIDA6Ci0JCXdyaXRlX3JlZyhwYXIsIDB4QTAsIHJlbWFwIHwgMGIwMCB8IDE8PDQpOworCQl3cml0ZV9yZWcocGFyLCAweEEwLCByZW1hcCB8IDB4MDAgfCAxPDw0KTsKIAkJYnJlYWs7CiAJY2FzZSAyNzA6Ci0JCXdyaXRlX3JlZyhwYXIsIDB4QTAsIHJlbWFwIHwgMGIxMSB8IDE8PDQpOworCQl3cml0ZV9yZWcocGFyLCAweEEwLCByZW1hcCB8IDB4MDMgfCAxPDw0KTsKIAkJYnJlYWs7CiAJY2FzZSAxODA6Ci0JCXdyaXRlX3JlZyhwYXIsIDB4QTAsIHJlbWFwIHwgMGIxMCk7CisJCXdyaXRlX3JlZyhwYXIsIDB4QTAsIHJlbWFwIHwgMHgwMik7CiAJCWJyZWFrOwogCWNhc2UgOTA6Ci0JCXdyaXRlX3JlZyhwYXIsIDB4QTAsIHJlbWFwIHwgMGIwMSk7CisJCXdyaXRlX3JlZyhwYXIsIDB4QTAsIHJlbWFwIHwgMHgwMSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMjE3LDEyICsyMTgsOCBAQAogCiAJYmxfb3BzID0gZGV2bV9remFsbG9jKHBhci0+aW5mby0+ZGV2aWNlLCBzaXplb2Yoc3RydWN0IGJhY2tsaWdodF9vcHMpLAogCQkJCUdGUF9LRVJORUwpOwotCWlmICghYmxfb3BzKSB7Ci0JCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCi0JCQkiJXM6IGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJhY2tsaWdodCBvcGVyYXRpb25zLlxuIiwKLQkJCV9fZnVuY19fKTsKKwlpZiAoIWJsX29wcykKIAkJcmV0dXJuOwotCX0KIAogCWJsX29wcy0+dXBkYXRlX3N0YXR1cyA9IHVwZGF0ZV9vbmJvYXJkX2JhY2tsaWdodDsKIAlibF9wcm9wcy50eXBlID0gQkFDS0xJR0hUX1JBVzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zdDc3MzVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfc3Q3NzM1ci5jCmluZGV4IGI2M2FhMzguLjlkODc0MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl9zdDc3MzVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3N0NzczNXIuYwpAQCAtMzEsMjAgKzMxLDIwIEBACiAKIHN0YXRpYyBpbnQgZGVmYXVsdF9pbml0X3NlcXVlbmNlW10gPSB7CiAJLyogU1dSRVNFVCAtIFNvZnR3YXJlIHJlc2V0ICovCi0JLTEsIDB4MDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwktMSwgMHgwMSwKIAktMiwgMTUwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWxheSAqLwogCiAJLyogU0xQT1VUIC0gU2xlZXAgb3V0ICYgYm9vc3RlciBvbiAqLwotCS0xLCAweDExLCAgICAgICAgICAgICAgICAgICAgICAgICAgCisJLTEsIDB4MTEsCiAJLTIsIDUwMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVsYXkgKi8KIAogCS8qIEZSTUNUUjEgLSBmcmFtZSByYXRlIGNvbnRyb2w6IG5vcm1hbCBtb2RlCiAJICAgICBmcmFtZSByYXRlID0gZm9zYyAvICgxIHggMiArIDQwKSAqIChMSU5FICsgMkMgKyAyRCkgKi8KLQktMSwgMHhCMSwgMHgwMSwgMHgyQywgMHgyRCwgCisJLTEsIDB4QjEsIDB4MDEsIDB4MkMsIDB4MkQsCiAKIAkvKiBGUk1DVFIyIC0gZnJhbWUgcmF0ZSBjb250cm9sOiBpZGxlIG1vZGUKIAkgICAgIGZyYW1lIHJhdGUgPSBmb3NjIC8gKDEgeCAyICsgNDApICogKExJTkUgKyAyQyArIDJEKSAqLwotCS0xLCAweEIyLCAweDAxLCAweDJDLCAweDJELCAKKwktMSwgMHhCMiwgMHgwMSwgMHgyQywgMHgyRCwKIAogCS8qIEZSTUNUUjMgLSBmcmFtZSByYXRlIGNvbnRyb2wgLSBwYXJ0aWFsIG1vZGUKIAkgICAgIGRvdCBpbnZlcnNpb24gbW9kZSwgbGluZSBpbnZlcnNpb24gbW9kZSAqLwpAQCAtNjgsNyArNjgsNyBAQAogCiAJLyogUFdDVFI0IC0gUG93ZXIgQ29udHJvbAogCSAgICAgQkNMSy8yLCBPcGFtcCBjdXJyZW50IHNtYWxsICYgTWVkaXVtIGxvdyAqLwotCS0xLCAweEMzLDB4OEEsMHgyQSwKKwktMSwgMHhDMywgMHg4QSwgMHgyQSwKIAogCS8qIFBXQ1RSNSAtIFBvd2VyIENvbnRyb2wgKi8KIAktMSwgMHhDNCwgMHg4QSwgMHhFRSwKQEAgLTkxLDcgKzkxLDcgQEAKIAktMiwgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlbGF5ICovCiAKIAkvKiBlbmQgbWFya2VyICovCi0JLTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJLTMKIH07CiAKIHN0YXRpYyB2b2lkIHNldF9hZGRyX3dpbihzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIsIGludCB4cywgaW50IHlzLCBpbnQgeGUsIGludCB5ZSkKQEAgLTEwMiw3ICsxMDIsNyBAQAogCS8qIENvbHVtbiBhZGRyZXNzICovCiAJd3JpdGVfcmVnKHBhciwgMHgyQSwgeHMgPj4gOCwgeHMgJiAweEZGLCB4ZSA+PiA4LCB4ZSAmIDB4RkYpOwogCi0JLyogUm93IGFkcmVzcyAqLworCS8qIFJvdyBhZGRyZXNzICovCiAJd3JpdGVfcmVnKHBhciwgMHgyQiwgeXMgPj4gOCwgeXMgJiAweEZGLCB5ZSA+PiA4LCB5ZSAmIDB4RkYpOwogCiAJLyogTWVtb3J5IHdyaXRlICovCkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJd3JpdGVfcmVnKHBhciwgMHgzNiwgTVkgfCBNViB8IChwYXItPmJnciA8PCAzKSk7CiAJCWJyZWFrOwogCWNhc2UgMTgwOgotCQl3cml0ZV9yZWcocGFyLCAweDM2LCAocGFyLT5iZ3IgPDwgMykpOworCQl3cml0ZV9yZWcocGFyLCAweDM2LCBwYXItPmJnciA8PCAzKTsKIAkJYnJlYWs7CiAJY2FzZSA5MDoKIAkJd3JpdGVfcmVnKHBhciwgMHgzNiwgTVggfCBNViB8IChwYXItPmJnciA8PCAzKSk7CkBAIC0xNDgsMjEgKzE0OCwyMSBAQAogI2RlZmluZSBDVVJWRShudW0sIGlkeCkgIGN1cnZlc1tudW0qcGFyLT5nYW1tYS5udW1fdmFsdWVzICsgaWR4XQogc3RhdGljIGludCBzZXRfZ2FtbWEoc3RydWN0IGZidGZ0X3BhciAqcGFyLCB1bnNpZ25lZCBsb25nICpjdXJ2ZXMpCiB7Ci0JaW50IGksajsKKwlpbnQgaSwgajsKIAogCWZidGZ0X3Bhcl9kYmcoREVCVUdfSU5JVF9ESVNQTEFZLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAkvKiBhcHBseSBtYXNrICovCiAJZm9yIChpID0gMDsgaSA8IHBhci0+Z2FtbWEubnVtX2N1cnZlczsgaSsrKQogCQlmb3IgKGogPSAwOyBqIDwgcGFyLT5nYW1tYS5udW1fdmFsdWVzOyBqKyspCi0JCQlDVVJWRShpLGopICY9IDBiMTExMTExOworCQkJQ1VSVkUoaSwgaikgJj0gMHgzZjsKIAogCWZvciAoaSA9IDA7IGkgPCBwYXItPmdhbW1hLm51bV9jdXJ2ZXM7IGkrKykKIAkJd3JpdGVfcmVnKHBhciwgMHhFMCArIGksCiAJCQlDVVJWRShpLCAwKSwgQ1VSVkUoaSwgMSksIENVUlZFKGksIDIpLCBDVVJWRShpLCAzKSwKIAkJCUNVUlZFKGksIDQpLCBDVVJWRShpLCA1KSwgQ1VSVkUoaSwgNiksIENVUlZFKGksIDcpLAogCQkJQ1VSVkUoaSwgOCksIENVUlZFKGksIDkpLCBDVVJWRShpLCAxMCksIENVUlZFKGksIDExKSwKLQkJCUNVUlZFKGksIDEyKSwgQ1VSVkUoaSwgMTMpLCBDVVJWRShpLCAxNCksIENVUlZFKGksMTUpKTsKKwkJCUNVUlZFKGksIDEyKSwgQ1VSVkUoaSwgMTMpLCBDVVJWRShpLCAxNCksIENVUlZFKGksIDE1KSk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl90aW55bGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdGlueWxjZC5jCmluZGV4IGNhOThiZmIuLmMwYjFhMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl90aW55bGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3RpbnlsY2QuYwpAQCAtNzAsNyArNzAsNyBAQAogCS8qIENvbHVtbiBhZGRyZXNzICovCiAJd3JpdGVfcmVnKHBhciwgMHgyQSwgeHMgPj4gOCwgeHMgJiAweEZGLCB4ZSA+PiA4LCB4ZSAmIDB4RkYpOwogCi0JLyogUm93IGFkcmVzcyAqLworCS8qIFJvdyBhZGRyZXNzICovCiAJd3JpdGVfcmVnKHBhciwgMHgyQiwgeXMgPj4gOCwgeXMgJiAweEZGLCB5ZSA+PiA4LCB5ZSAmIDB4RkYpOwogCiAJLyogTWVtb3J5IHdyaXRlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdGxzODIwNC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3RsczgyMDQuYwppbmRleCA4NzM4YzdhLi5mY2QzOGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdGxzODIwNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl90bHM4MjA0LmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCQlyZXQgPSBwYXItPmZidGZ0b3BzLndyaXRlKHBhciwgcGFyLT50eGJ1Zi5idWYsIFdJRFRIKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCi0JCQkJIiVzOiB3cml0ZSBmYWlsZWQgYW5kIHJldHVybmVkOiAlZFxuIiwgX19mdW5jX18sIHJldCk7CisJCQkJIndyaXRlIGZhaWxlZCBhbmQgcmV0dXJuZWQ6ICVkXG4iLCByZXQpOwogCQkJYnJlYWs7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdWMxNzAxLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdWMxNzAxLmMKaW5kZXggZDcwYWM1Mi4uMjZkNjY5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3VjMTcwMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl91YzE3MDEuYwpAQCAtMTgzLDcgKzE4Myw4IEBACiAJfQogCiAJaWYgKHJldCA8IDApCi0JCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsICIlczogd3JpdGUgZmFpbGVkIGFuZCByZXR1cm5lZDogJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLCAid3JpdGUgZmFpbGVkIGFuZCByZXR1cm5lZDogJWRcbiIsCisJCQlyZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl91cGQxNjE3MDQuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl91cGQxNjE3MDQuYwppbmRleCBmZmY1N2IzLi4xNzZjMjEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfdXBkMTYxNzA0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3VwZDE2MTcwNC5jCkBAIC00Nyw4NCArNDcsODQgQEAKIAkvKiBJbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBmcm9tIExpYl9VVEZUICovCiAKIAkvKiByZWdpc3RlciByZXNldCAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAwMywweDAwMDEpOwkvKiBTb2Z0IHJlc2V0ICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDAzLCAweDAwMDEpOwkvKiBTb2Z0IHJlc2V0ICovCiAKIAkvKiBvc2NpbGxhdG9yIHN0YXJ0ICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDNBLDB4MDAwMSk7CS8qT3NjaWxsYXRvciAwOiBzdG9wLCAxOiBvcGVyYXRpb24gKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwM0EsIDB4MDAwMSk7CS8qT3NjaWxsYXRvciAwOiBzdG9wLCAxOiBvcGVyYXRpb24gKi8KIAl1ZGVsYXkoMTAwKTsKIAogCS8qIHktc2V0dGluZyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAyNCwweDAwN0IpOwkvKiBhbXBsaXR1ZGUgc2V0dGluZyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAyNCwgMHgwMDdCKTsJLyogYW1wbGl0dWRlIHNldHRpbmcgKi8KIAl1ZGVsYXkoMTApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDAyNSwweDAwM0IpOwkvKiBhbXBsaXR1ZGUgc2V0dGluZyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAyNiwweDAwMzQpOwkvKiBhbXBsaXR1ZGUgc2V0dGluZyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAyNSwgMHgwMDNCKTsJLyogYW1wbGl0dWRlIHNldHRpbmcgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMjYsIDB4MDAzNCk7CS8qIGFtcGxpdHVkZSBzZXR0aW5nICovCiAJdWRlbGF5KDEwKTsKLQl3cml0ZV9yZWcocGFyLCAweDAwMjcsMHgwMDA0KTsJLyogYW1wbGl0dWRlIHNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwNTIsMHgwMDI1KTsJLyogY2lyY3VpdCBzZXR0aW5nIDEgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMjcsIDB4MDAwNCk7CS8qIGFtcGxpdHVkZSBzZXR0aW5nICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDUyLCAweDAwMjUpOwkvKiBjaXJjdWl0IHNldHRpbmcgMSAqLwogCXVkZWxheSgxMCk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMDUzLDB4MDAzMyk7CS8qIGNpcmN1aXQgc2V0dGluZyAyICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDYxLDB4MDAxQyk7CS8qIGFkanVzdG1lbnQgVjEwIHBvc2l0aXZlIHBvbGFyaXR5ICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDUzLCAweDAwMzMpOwkvKiBjaXJjdWl0IHNldHRpbmcgMiAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDA2MSwgMHgwMDFDKTsJLyogYWRqdXN0bWVudCBWMTAgcG9zaXRpdmUgcG9sYXJpdHkgKi8KIAl1ZGVsYXkoMTApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDA2MiwweDAwMkMpOwkvKiBhZGp1c3RtZW50IFY5IG5lZ2F0aXZlIHBvbGFyaXR5ICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDYzLDB4MDAyMik7CS8qIGFkanVzdG1lbnQgVjM0IHBvc2l0aXZlIHBvbGFyaXR5ICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDYyLCAweDAwMkMpOwkvKiBhZGp1c3RtZW50IFY5IG5lZ2F0aXZlIHBvbGFyaXR5ICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDYzLCAweDAwMjIpOwkvKiBhZGp1c3RtZW50IFYzNCBwb3NpdGl2ZSBwb2xhcml0eSAqLwogCXVkZWxheSgxMCk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMDY0LDB4MDAyNyk7CS8qIGFkanVzdG1lbnQgVjMxIG5lZ2F0aXZlIHBvbGFyaXR5ICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDY0LCAweDAwMjcpOwkvKiBhZGp1c3RtZW50IFYzMSBuZWdhdGl2ZSBwb2xhcml0eSAqLwogCXVkZWxheSgxMCk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMDY1LDB4MDAxNCk7CS8qIGFkanVzdG1lbnQgVjYxIG5lZ2F0aXZlIHBvbGFyaXR5ICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDY1LCAweDAwMTQpOwkvKiBhZGp1c3RtZW50IFY2MSBuZWdhdGl2ZSBwb2xhcml0eSAqLwogCXVkZWxheSgxMCk7Ci0Jd3JpdGVfcmVnKHBhciwgMHgwMDY2LDB4MDAxMCk7CS8qIGFkanVzdG1lbnQgVjYxIG5lZ2F0aXZlIHBvbGFyaXR5ICovCi0JCisJd3JpdGVfcmVnKHBhciwgMHgwMDY2LCAweDAwMTApOwkvKiBhZGp1c3RtZW50IFY2MSBuZWdhdGl2ZSBwb2xhcml0eSAqLworCiAJLyogQmFzaWNhbCBjbG9jayBmb3IgMSBsaW5lIChCQVNFQ09VTlRbNzowXSkgbnVtYmVyIHNwZWNpZmllZCAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAyRSwweDAwMkQpOwotCQorCXdyaXRlX3JlZyhwYXIsIDB4MDAyRSwgMHgwMDJEKTsKKwogCS8qIFBvd2VyIHN1cHBseSBzZXR0aW5nICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDE5LDB4MDAwMCk7CS8qIERDL0RDIG91dHB1dCBzZXR0aW5nICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDE5LCAweDAwMDApOwkvKiBEQy9EQyBvdXRwdXQgc2V0dGluZyAqLwogCXVkZWxheSgyMDApOwotCXdyaXRlX3JlZyhwYXIsIDB4MDAxQSwweDEwMDApOwkvKiBEQy9EQyBmcmVxdWVuY3kgc2V0dGluZyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAxQiwweDAwMjMpOwkvKiBEQy9EQyByaXNpbmcgc2V0dGluZyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAxQywweDBDMDEpOwkvKiBSZWd1bGF0b3Igdm9sdGFnZSBzZXR0aW5nICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDFELDB4MDAwMCk7CS8qIFJlZ3VsYXRvciBjdXJyZW50IHNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMUUsMHgwMDA5KTsJLyogVkNPTSBvdXRwdXQgc2V0dGluZyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAxRiwweDAwMzUpOwkvKiBWQ09NIGFtcGxpdHVkZSBzZXR0aW5nICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDIwLDB4MDAxNSk7CS8qIFZDT01NIGNlbmN0ZXIgc2V0dGluZyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAxOCwweDFFN0IpOwkvKiBEQy9EQyBvcGVyYXRpb24gc2V0dGluZyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAxQSwgMHgxMDAwKTsJLyogREMvREMgZnJlcXVlbmN5IHNldHRpbmcgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMUIsIDB4MDAyMyk7CS8qIERDL0RDIHJpc2luZyBzZXR0aW5nICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDFDLCAweDBDMDEpOwkvKiBSZWd1bGF0b3Igdm9sdGFnZSBzZXR0aW5nICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDFELCAweDAwMDApOwkvKiBSZWd1bGF0b3IgY3VycmVudCBzZXR0aW5nICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDFFLCAweDAwMDkpOwkvKiBWQ09NIG91dHB1dCBzZXR0aW5nICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDFGLCAweDAwMzUpOwkvKiBWQ09NIGFtcGxpdHVkZSBzZXR0aW5nICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDIwLCAweDAwMTUpOwkvKiBWQ09NTSBjZW5jdGVyIHNldHRpbmcgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMTgsIDB4MUU3Qik7CS8qIERDL0RDIG9wZXJhdGlvbiBzZXR0aW5nICovCiAKIAkvKiB3aW5kb3dzIHNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMDgsMHgwMDAwKTsJLyogTWluaW11bSBYIGFkZHJlc3MgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMDksMHgwMEVGKTsJLyogTWF4aW11bSBYIGFkZHJlc3MgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMGEsMHgwMDAwKTsJLyogTWluaW11bSBZIGFkZHJlc3MgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMGIsMHgwMTNGKTsJLyogTWF4aW11bSBZIGFkZHJlc3MgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMDgsIDB4MDAwMCk7CS8qIE1pbmltdW0gWCBhZGRyZXNzICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDA5LCAweDAwRUYpOwkvKiBNYXhpbXVtIFggYWRkcmVzcyAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAwYSwgMHgwMDAwKTsJLyogTWluaW11bSBZIGFkZHJlc3MgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMGIsIDB4MDEzRik7CS8qIE1heGltdW0gWSBhZGRyZXNzICovCiAKIAkvKiBMQ0QgZGlzcGxheSBhcmVhIHNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMjksMHgwMDAwKTsJLyogW0xDRFNJWkVdICBYIE1JTi4gc2l6ZSBzZXQgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMkEsMHgwMDAwKTsJLyogW0xDRFNJWkVdICBZIE1JTi4gc2l6ZSBzZXQgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMkIsMHgwMEVGKTsJLyogW0xDRFNJWkVdICBYIE1BWC4gc2l6ZSBzZXQgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMkMsMHgwMTNGKTsJLyogW0xDRFNJWkVdICBZIE1BWC4gc2l6ZSBzZXQgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMjksIDB4MDAwMCk7CS8qIFtMQ0RTSVpFXSAgWCBNSU4uIHNpemUgc2V0ICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDJBLCAweDAwMDApOwkvKiBbTENEU0laRV0gIFkgTUlOLiBzaXplIHNldCAqLworCXdyaXRlX3JlZyhwYXIsIDB4MDAyQiwgMHgwMEVGKTsJLyogW0xDRFNJWkVdICBYIE1BWC4gc2l6ZSBzZXQgKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMkMsIDB4MDEzRik7CS8qIFtMQ0RTSVpFXSAgWSBNQVguIHNpemUgc2V0ICovCiAKIAkvKiBHYXRlIHNjYW4gc2V0dGluZyAqLwotCXdyaXRlX3JlZyhwYXIsIDB4MDAzMiwweDAwMDIpOwotCQorCXdyaXRlX3JlZyhwYXIsIDB4MDAzMiwgMHgwMDAyKTsKKwogCS8qIG4gbGluZSBpbnZlcnNpb24gbGluZSBudW1iZXIgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMzMsMHgwMDAwKTsKKwl3cml0ZV9yZWcocGFyLCAweDAwMzMsIDB4MDAwMCk7CiAKIAkvKiBMaW5lIGludmVyc2lvbi9mcmFtZSBpbnZlcnNpb24vaW50ZXJsYWNlIHNldHRpbmcgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMzcsMHgwMDAwKTsKLQkKKwl3cml0ZV9yZWcocGFyLCAweDAwMzcsIDB4MDAwMCk7CisKIAkvKiBHYXRlIHNjYW4gb3BlcmF0aW9uIHNldHRpbmcgcmVnaXN0ZXIgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwM0IsMHgwMDAxKTsKLQkKKwl3cml0ZV9yZWcocGFyLCAweDAwM0IsIDB4MDAwMSk7CisKIAkvKiBDb2xvciBtb2RlICovCiAJLypHUyA9IDA6IDI2MC1rIGNvbG9yICg2NCBncmF5IHNjYWxlKSwgR1MgPSAxOiA4IGNvbG9yICgyIGdyYXkgc2NhbGUpICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDA0LDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMDA0LCAweDAwMDApOwogCiAJLyogUkFNIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLQl3cml0ZV9yZWcocGFyLCAweDAwMDUsMHgwMDAwKTsJLypXaW5kb3cgYWNjZXNzIDAwOk5vcm1hbCwgMTA6V2luZG93ICovCisJd3JpdGVfcmVnKHBhciwgMHgwMDA1LCAweDAwMDApOwkvKldpbmRvdyBhY2Nlc3MgMDA6Tm9ybWFsLCAxMDpXaW5kb3cgKi8KIAogCS8qIERpc3BsYXkgc2V0dGluZyByZWdpc3RlciAyICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDAxLDB4MDAwMCk7CisJd3JpdGVfcmVnKHBhciwgMHgwMDAxLCAweDAwMDApOwogCiAJLyogZGlzcGxheSBzZXR0aW5nICovCi0Jd3JpdGVfcmVnKHBhciwgMHgwMDAwLDB4MDAwMCk7CS8qIGRpc3BsYXkgb24gKi8KKwl3cml0ZV9yZWcocGFyLCAweDAwMDAsIDB4MDAwMCk7CS8qIGRpc3BsYXkgb24gKi8KIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3dhdHRlcm90dC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZiX3dhdHRlcm90dC5jCmluZGV4IDk3NWI1NzkuLjg4ZmIyYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYl93YXR0ZXJvdHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJfd2F0dGVyb3R0LmMKQEAgLTY1LDcgKzY1LDcgQEAKIAlyZXQgPSBwYXItPmZidGZ0b3BzLndyaXRlKHBhciwgcGFyLT5idWYsIGxlbik7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwKLQkJCSIlczogd3JpdGUoKSBmYWlsZWQgYW5kIHJldHVybmVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCSJ3cml0ZSgpIGZhaWxlZCBhbmQgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAJCXJldHVybjsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtYnVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtYnVzLmMKaW5kZXggYjNjZGRiMC4uNTJhZjljYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWJ1cy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1idXMuYwpAQCAtMTExLDcgKzExMSw3IEBACiAJcmV0ID0gcGFyLT5mYnRmdG9wcy53cml0ZShwYXIsIHBhci0+YnVmLCAobGVuICsgcGFkKSAqIHNpemVvZih1MTYpKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAotCQkJIiVzOiB3cml0ZSgpIGZhaWxlZCBhbmQgcmV0dXJuZWQgJWRcbiIsIF9fZnVuY19fLCByZXQpOworCQkJIndyaXRlKCkgZmFpbGVkIGFuZCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtY29yZS5jCmluZGV4IDM3ZGNmN2UuLjUzYjc0OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWNvcmUuYwpAQCAtNDEsMTUgKzQxLDEwIEBACiAjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgogCiAjaW5jbHVkZSAiZmJ0ZnQuaCIKLQotZXh0ZXJuIHZvaWQgZmJ0ZnRfc3lzZnNfaW5pdChzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpOwotZXh0ZXJuIHZvaWQgZmJ0ZnRfc3lzZnNfZXhpdChzdHJ1Y3QgZmJ0ZnRfcGFyICpwYXIpOwotZXh0ZXJuIHZvaWQgZmJ0ZnRfZXhwYW5kX2RlYnVnX3ZhbHVlKHVuc2lnbmVkIGxvbmcgKmRlYnVnKTsKLWV4dGVybiBpbnQgZmJ0ZnRfZ2FtbWFfcGFyc2Vfc3RyKHN0cnVjdCBmYnRmdF9wYXIgKnBhciwgdW5zaWduZWQgbG9uZyAqY3VydmVzLAotCQkJCQkJY29uc3QgY2hhciAqc3RyLCBpbnQgc2l6ZSk7CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZGVidWc7Ci1tb2R1bGVfcGFyYW0oZGVidWcsIHVsb25nICwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWcsIHVsb25nLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJvdmVycmlkZSBkZXZpY2UgZGVidWcgbGV2ZWwiKTsKIAogc3RhdGljIGJvb2wgZG1hID0gdHJ1ZTsKQEAgLTMwMiwxMiArMjk3LDggQEAKIAogCWJsX29wcyA9IGRldm1fa3phbGxvYyhwYXItPmluZm8tPmRldmljZSwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfb3BzKSwKIAkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIWJsX29wcykgewotCQlkZXZfZXJyKHBhci0+aW5mby0+ZGV2aWNlLAotCQkJIiVzOiBjb3VsZCBub3QgYWxsb2NhdGUgbWVtZW9yeSBmb3IgYmFja2xpZ2h0IG9wZXJhdGlvbnMuXG4iLAotCQkJX19mdW5jX18pOworCWlmICghYmxfb3BzKQogCQlyZXR1cm47Ci0JfQogCiAJYmxfb3BzLT5nZXRfYnJpZ2h0bmVzcyA9IGZidGZ0X2JhY2tsaWdodF9nZXRfYnJpZ2h0bmVzczsKIAlibF9vcHMtPnVwZGF0ZV9zdGF0dXMgPSBmYnRmdF9iYWNrbGlnaHRfdXBkYXRlX3N0YXR1czsKQEAgLTM0Nyw3ICszMzgsNyBAQAogCXdyaXRlX3JlZyhwYXIsIDB4MkEsCiAJCSh4cyA+PiA4KSAmIDB4RkYsIHhzICYgMHhGRiwgKHhlID4+IDgpICYgMHhGRiwgeGUgJiAweEZGKTsKIAotCS8qIFJvdyBhZHJlc3Mgc2V0ICovCisJLyogUm93IGFkZHJlc3Mgc2V0ICovCiAJd3JpdGVfcmVnKHBhciwgMHgyQiwKIAkJKHlzID4+IDgpICYgMHhGRiwgeXMgJiAweEZGLCAoeWUgPj4gOCkgJiAweEZGLCB5ZSAmIDB4RkYpOwogCkBAIC0zNzksNyArMzcwLDcgQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmICh1bmxpa2VseShwYXItPmRlYnVnICYgKERFQlVHX1RJTUVfRklSU1RfVVBEQVRFIHwgREVCVUdfVElNRV9FQUNIX1VQREFURSkpKSB7Ci0JCWlmICgocGFyLT5kZWJ1ZyAmIERFQlVHX1RJTUVfRUFDSF9VUERBVEUpIHx8IFwKKwkJaWYgKChwYXItPmRlYnVnICYgREVCVUdfVElNRV9FQUNIX1VQREFURSkgfHwKIAkJCQkoKHBhci0+ZGVidWcgJiBERUJVR19USU1FX0ZJUlNUX1VQREFURSkgJiYgIXBhci0+Zmlyc3RfdXBkYXRlX2RvbmUpKSB7CiAJCQlnZXRuc3RpbWVvZmRheSgmdHNfc3RhcnQpOwogCQkJdGltZWl0ID0gdHJ1ZTsKQEAgLTcwNyw5ICs2OTgsOCBAQAogCiAJLyogc2FuaXR5IGNoZWNrICovCiAJaWYgKGRpc3BsYXktPmdhbW1hX251bSAqIGRpc3BsYXktPmdhbW1hX2xlbiA+IEZCVEZUX0dBTU1BX01BWF9WQUxVRVNfVE9UQUwpIHsKLQkJZGV2X2VycihkZXYsCi0JCQkiJXM6IEZCVEZUX0dBTU1BX01BWF9WQUxVRVNfVE9UQUw9JWQgaXMgZXhjZWVkZWRcbiIsCi0JCQlfX2Z1bmNfXywgRkJURlRfR0FNTUFfTUFYX1ZBTFVFU19UT1RBTCk7CisJCWRldl9lcnIoZGV2LCAiRkJURlRfR0FNTUFfTUFYX1ZBTFVFU19UT1RBTD0lZCBpcyBleGNlZWRlZFxuIiwKKwkJCUZCVEZUX0dBTU1BX01BWF9WQUxVRVNfVE9UQUwpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTEwMDAsNyArOTkwLDcgQEAKIAlmYnRmdF9zeXNmc19pbml0KHBhcik7CiAKIAlpZiAocGFyLT50eGJ1Zi5idWYpCi0JCXNwcmludGYodGV4dDEsICIsICVkIEtpQiAlc2J1ZmZlciBtZW1vcnkiLAorCQlzcHJpbnRmKHRleHQxLCAiLCAlenUgS2lCICVzYnVmZmVyIG1lbW9yeSIsCiAJCQlwYXItPnR4YnVmLmxlbiA+PiAxMCwgcGFyLT50eGJ1Zi5kbWEgPyAiRE1BICIgOiAiIik7CiAJaWYgKHNwaSkKIAkJc3ByaW50Zih0ZXh0MiwgIiwgc3BpJWQuJWQgYXQgJWQgTUh6Iiwgc3BpLT5tYXN0ZXItPmJ1c19udW0sCkBAIC0xMDQ2LDcgKzEwMzYsNiBAQAogewogCXN0cnVjdCBmYnRmdF9wYXIgKnBhciA9IGZiX2luZm8tPnBhcjsKIAlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gcGFyLT5zcGk7Ci0JaW50IHJldDsKIAogCWlmIChzcGkpCiAJCXNwaV9zZXRfZHJ2ZGF0YShzcGksIE5VTEwpOwpAQCAtMTA1NSw4ICsxMDQ0LDcgQEAKIAlpZiAocGFyLT5mYnRmdG9wcy51bnJlZ2lzdGVyX2JhY2tsaWdodCkKIAkJcGFyLT5mYnRmdG9wcy51bnJlZ2lzdGVyX2JhY2tsaWdodChwYXIpOwogCWZidGZ0X3N5c2ZzX2V4aXQocGFyKTsKLQlyZXQgPSB1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGZiX2luZm8pOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHVucmVnaXN0ZXJfZnJhbWVidWZmZXIoZmJfaW5mbyk7CiB9CiBFWFBPUlRfU1lNQk9MKGZidGZ0X3VucmVnaXN0ZXJfZnJhbWVidWZmZXIpOwogCkBAIC0xMjc4LDcgKzEyNjYsNyBAQAogCWZidGZ0X3Bhcl9kYmcoREVCVUdfVkVSSUZZX0dQSU9TLCBwYXIsICIlcygpXG4iLCBfX2Z1bmNfXyk7CiAKIAlwZGF0YSA9IHBhci0+aW5mby0+ZGV2aWNlLT5wbGF0Zm9ybV9kYXRhOwotCWlmIChwZGF0YS0+ZGlzcGxheS5idXN3aWR0aCAhPSA5ICYmIHBhci0+c3RhcnRieXRlID09IDAgJiYgXAorCWlmIChwZGF0YS0+ZGlzcGxheS5idXN3aWR0aCAhPSA5ICYmIHBhci0+c3RhcnRieXRlID09IDAgJiYKIAkJCQkJCQlwYXItPmdwaW8uZGMgPCAwKSB7CiAJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCiAJCQkiTWlzc2luZyBpbmZvIGFib3V0ICdkYycgZ3Bpby4gQWJvcnRpbmcuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1pby5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWlvLmMKaW5kZXggMzIxNTVhNy4uYTZmMDkxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LWlvLmMKQEAgLTU5LDggKzU5LDcgQEAKIAl9CiAJaWYgKChsZW4gJSA4KSAhPSAwKSB7CiAJCWRldl9lcnIocGFyLT5pbmZvLT5kZXZpY2UsCi0JCQkiJXM6IGVycm9yOiBsZW49JWQgbXVzdCBiZSBkaXZpc2libGUgYnkgOFxuIiwKLQkJCV9fZnVuY19fLCBsZW4pOworCQkJImVycm9yOiBsZW49JXp1IG11c3QgYmUgZGl2aXNpYmxlIGJ5IDhcbiIsIGxlbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTA2LDggKzEwNSw4IEBACiAJaWYgKHBhci0+c3RhcnRieXRlKSB7CiAJCWlmIChsZW4gPiAzMikgewogCQkJZGV2X2VycihwYXItPmluZm8tPmRldmljZSwKLQkJCQkiJXM6IGxlbj0lZCBjYW4ndCBiZSBsYXJnZXIgdGhhbiAzMiB3aGVuIHVzaW5nICdzdGFydGJ5dGUnXG4iLAotCQkJCV9fZnVuY19fLCBsZW4pOworCQkJCSJsZW49JXp1IGNhbid0IGJlIGxhcmdlciB0aGFuIDMyIHdoZW4gdXNpbmcgJ3N0YXJ0Ynl0ZSdcbiIsCisJCQkJbGVuKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCXR4YnVmWzBdID0gcGFyLT5zdGFydGJ5dGUgfCAweDM7CkBAIC0xNTUsMTQgKzE1NCwxNCBAQAogCQkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewogCQkJCWlmICgoZGF0YSAmIDEpICE9IChwcmV2X2RhdGEgJiAxKSkKIAkJCQkJZ3Bpb19zZXRfdmFsdWUocGFyLT5ncGlvLmRiW2ldLAotCQkJCQkJCQkoZGF0YSAmIDEpKTsKKwkJCQkJCQkJZGF0YSAmIDEpOwogCQkJCWRhdGEgPj49IDE7CiAJCQkJcHJldl9kYXRhID4+PSAxOwogCQkJfQogCQl9CiAjZWxzZQogCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCQlncGlvX3NldF92YWx1ZShwYXItPmdwaW8uZGJbaV0sIChkYXRhICYgMSkpOworCQkJZ3Bpb19zZXRfdmFsdWUocGFyLT5ncGlvLmRiW2ldLCBkYXRhICYgMSk7CiAJCQlkYXRhID4+PSAxOwogCQl9CiAjZW5kaWYKQEAgLTIwNSwxNCArMjA0LDE0IEBACiAJCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogCQkJCWlmICgoZGF0YSAmIDEpICE9IChwcmV2X2RhdGEgJiAxKSkKIAkJCQkJZ3Bpb19zZXRfdmFsdWUocGFyLT5ncGlvLmRiW2ldLAotCQkJCQkJCQkoZGF0YSAmIDEpKTsKKwkJCQkJCQkJZGF0YSAmIDEpOwogCQkJCWRhdGEgPj49IDE7CiAJCQkJcHJldl9kYXRhID4+PSAxOwogCQkJfQogCQl9CiAjZWxzZQogCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQkJZ3Bpb19zZXRfdmFsdWUocGFyLT5ncGlvLmRiW2ldLCAoZGF0YSAmIDEpKTsKKwkJCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5kYltpXSwgZGF0YSAmIDEpOwogCQkJZGF0YSA+Pj0gMTsKIAkJfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQtc3lzZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1zeXNmcy5jCmluZGV4IDQ1ZjhkZTMuLmM0Y2M0NTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1zeXNmcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdC1zeXNmcy5jCkBAIC0xLDUgKzEsNSBAQAogI2luY2x1ZGUgImZidGZ0LmgiCi0KKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBzdGF0aWMgaW50IGdldF9uZXh0X3Vsb25nKGNoYXIgKipzdHJfcCwgdW5zaWduZWQgbG9uZyAqdmFsLCBjaGFyICpzZXAsIGludCBiYXNlKQogewpAQCAtMzcsMTAgKzM3LDkgQEAKIAogCWZidGZ0X3Bhcl9kYmcoREVCVUdfU1lTRlMsIHBhciwgIiVzXG4iLCBzdHIpOwogCi0JdG1wID0ga21hbGxvYyhzaXplKzEsIEdGUF9LRVJORUwpOworCXRtcCA9IGttZW1kdXAoc3RyLCBzaXplICsgMSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0bXApCiAJCXJldHVybiAtRU5PTUVNOwotCW1lbWNweSh0bXAsIHN0ciwgc2l6ZSsxKTsKIAogCS8qIHJlcGxhY2Ugb3B0aW9uYWwgc2VwYXJhdG9ycyAqLwogCXN0cl9wID0gdG1wOwpAQCAtMTUzLDcgKzE1Miw3IEBACiAKIHZvaWQgZmJ0ZnRfZXhwYW5kX2RlYnVnX3ZhbHVlKHVuc2lnbmVkIGxvbmcgKmRlYnVnKQogewotCXN3aXRjaCAoKmRlYnVnICYgMGIxMTEpIHsKKwlzd2l0Y2ggKCpkZWJ1ZyAmIDB4NykgewogCWNhc2UgMToKIAkJKmRlYnVnIHw9IERFQlVHX0xFVkVMXzE7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0LmggYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQuaAppbmRleCAwZGJmM2Y5Li45ZmQ5OGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnQuaApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAvKioKICAqIHN0cnVjdCBmYnRmdF9wbGF0Zm9ybV9kYXRhIC0gUGFzc2VzIGRpc3BsYXkgc3BlY2lmaWMgZGF0YSB0byB0aGUgZHJpdmVyCiAgKiBAZGlzcGxheTogRGlzcGxheSBwcm9wZXJ0aWVzCi0gKiBAZ3Bpb3M6IFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgcGluYW1lIHRvIGdwaW8gbWFwcGluZ3MKKyAqIEBncGlvczogUG9pbnRlciB0byBhbiBhcnJheSBvZiBwaW5uYW1lIHRvIGdwaW8gbWFwcGluZ3MKICAqIEByb3RhdGU6IERpc3BsYXkgcm90YXRpb24gYW5nbGUKICAqIEBiZ3I6IExDRCBDb250cm9sbGVyIEJHUiBiaXQKICAqIEBmcHM6IEZyYW1lcyBwZXIgc2Vjb25kICh0aGlzIHdpbGwgZ28gYXdheSwgdXNlIEBmcHMgaW4gQGZidGZ0X2Rpc3BsYXkpCkBAIC0yMDAsNyArMjAwLDcgQEAKICAqIEBncGlvLmNzOiBMQ0QgQ2hpcCBTZWxlY3Qgd2l0aCBwYXJhbGxlbCBpbnRlcmZhY2UgYnVzCiAgKiBAZ3Bpby5kYlsxNl06IFBhcmFsbGVsIGRhdGFidXMKICAqIEBncGlvLmxlZFsxNl06IExlZCBjb250cm9sIHNpZ25hbHMKLSAqIEBncGlvLmF1eFsxNl06IEF1eGlsbGFyeSBzaWduYWxzLCBub3QgdXNlZCBieSBjb3JlCisgKiBAZ3Bpby5hdXhbMTZdOiBBdXhpbGlhcnkgc2lnbmFscywgbm90IHVzZWQgYnkgY29yZQogICogQGluaXRfc2VxdWVuY2U6IFBvaW50ZXIgdG8gTENEIGluaXRpYWxpemF0aW9uIGFycmF5CiAgKiBAZ2FtbWEubG9jazogTXV0ZXggZm9yIEdhbW1hIGN1cnZlIGxvY2tpbmcKICAqIEBnYW1tYS5jdXJ2ZXM6IFBvaW50ZXIgdG8gR2FtbWEgY3VydmUgYXJyYXkKQEAgLTI1OSw5ICsyNTksNyBAQAogI2RlZmluZSBOVU1BUkdTKC4uLikgIChzaXplb2YoKGludFtdKXtfX1ZBX0FSR1NfX30pL3NpemVvZihpbnQpKQogCiAjZGVmaW5lIHdyaXRlX3JlZyhwYXIsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlwYXItPmZidGZ0b3BzLndyaXRlX3JlZ2lzdGVyKHBhciwgTlVNQVJHUyhfX1ZBX0FSR1NfXyksIF9fVkFfQVJHU19fKTsgXAotfSB3aGlsZSAoMCkKKwlwYXItPmZidGZ0b3BzLndyaXRlX3JlZ2lzdGVyKHBhciwgTlVNQVJHUyhfX1ZBX0FSR1NfXyksIF9fVkFfQVJHU19fKQogCiAvKiBmYnRmdC1jb3JlLmMgKi8KIGV4dGVybiB2b2lkIGZidGZ0X2RiZ19oZXgoY29uc3Qgc3RydWN0IGRldmljZSAqZGV2LApAQCAtMzI2LDggKzMyNCw4IEBACiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCQkJCQkJCQkgICBcCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBkdF9pZHNbXSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHsgLmNvbXBhdGlibGUgPSBfY29tcGF0aWJsZSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHt9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAuY29tcGF0aWJsZSA9IF9jb21wYXRpYmxlIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7fSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkJCQkJCQkJICAgXAogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgZHRfaWRzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzM3LDcgKzMzNSw3IEBACiAJLmRyaXZlciA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJLm5hbWUgICA9IF9uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCS5vd25lciAgPSBUSElTX01PRFVMRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIC5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNoX3B0cihkdF9pZHMpLCAgICAgICAgICAgICAgICAgICAgXAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoZHRfaWRzKSwgICAgICAgICAgICAgICAgICAgIFwKIAl9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCS5wcm9iZSAgPSBmYnRmdF9kcml2ZXJfcHJvYmVfc3BpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJLnJlbW92ZSA9IGZidGZ0X2RyaXZlcl9yZW1vdmVfc3BpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM0Nyw3ICszNDUsNyBAQAogCS5kcml2ZXIgPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCS5uYW1lICAgPSBfbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQkub3duZXIgID0gVEhJU19NT0RVTEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIoZHRfaWRzKSwgICAgICAgICAgICAgICAgICAgIFwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKGR0X2lkcyksICAgICAgICAgICAgICAgICAgICBcCiAJfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkucHJvYmUgID0gZmJ0ZnRfZHJpdmVyX3Byb2JlX3BkZXYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCS5yZW1vdmUgPSBmYnRmdF9kcml2ZXJfcmVtb3ZlX3BkZXYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnRfZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmJ0ZnRfZGV2aWNlLmMKaW5kZXggYjlmNGMzMC4uZGY2Y2Q3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZidGZ0X2RldmljZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mYnRmdF9kZXZpY2UuYwpAQCAtMjksOCArMjksOCBAQAogCiAjZGVmaW5lIE1BWF9HUElPUyAzMgogCi1zdHJ1Y3Qgc3BpX2RldmljZSAqc3BpX2RldmljZTsKLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBfZGV2aWNlOworc3RhdGljIHN0cnVjdCBzcGlfZGV2aWNlICpzcGlfZGV2aWNlOworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBfZGV2aWNlOwogCiBzdGF0aWMgY2hhciAqbmFtZTsKIG1vZHVsZV9wYXJhbShuYW1lLCBjaGFycCwgMCk7CkBAIC0xMDksNyArMTA5LDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaW5pdCwgIkluaXQgc2VxdWVuY2UsIHVzZWQgd2l0aCB0aGUgY3VzdG9tIGFyZ3VtZW50Iik7CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRlYnVnOwotbW9kdWxlX3BhcmFtKGRlYnVnLCB1bG9uZyAsIDApOworbW9kdWxlX3BhcmFtKGRlYnVnLCB1bG9uZywgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLAogImxldmVsOiAwLTcgKHRoZSByZW1haW5pbmcgMjkgYml0cyBpcyBmb3IgYWR2YW5jZWQgdXNhZ2UpIik7CiAKQEAgLTEzNiw0MyArMTM2LDY5IEBACiAJCSIwMyAxZCAwNyAwNiAyRSAyQyAyOSAyRCAyRSAyRSAzNyAzRiAwMCAwMCAwMiAxMCIKIAogc3RhdGljIGludCBoeTI4Yl9pbml0X3NlcXVlbmNlW10gPSB7Ci0JLTEsMHgwMGU3LDB4MDAxMCwtMSwweDAwMDAsMHgwMDAxLC0xLDB4MDAwMSwweDAxMDAsLTEsMHgwMDAyLDB4MDcwMCwKLQktMSwweDAwMDMsMHgxMDMwLC0xLDB4MDAwNCwweDAwMDAsLTEsMHgwMDA4LDB4MDIwNywtMSwweDAwMDksMHgwMDAwLAotCS0xLDB4MDAwYSwweDAwMDAsLTEsMHgwMDBjLDB4MDAwMSwtMSwweDAwMGQsMHgwMDAwLC0xLDB4MDAwZiwweDAwMDAsCi0JLTEsMHgwMDEwLDB4MDAwMCwtMSwweDAwMTEsMHgwMDA3LC0xLDB4MDAxMiwweDAwMDAsLTEsMHgwMDEzLDB4MDAwMCwKLQktMiw1MCwtMSwweDAwMTAsMHgxNTkwLC0xLDB4MDAxMSwweDAyMjcsLTIsNTAsLTEsMHgwMDEyLDB4MDA5YywtMiw1MCwKLQktMSwweDAwMTMsMHgxOTAwLC0xLDB4MDAyOSwweDAwMjMsLTEsMHgwMDJiLDB4MDAwZSwtMiw1MCwKLQktMSwweDAwMjAsMHgwMDAwLC0xLDB4MDAyMSwweDAwMDAsLTIsNTAsLTEsMHgwMDUwLDB4MDAwMCwKLQktMSwweDAwNTEsMHgwMGVmLC0xLDB4MDA1MiwweDAwMDAsLTEsMHgwMDUzLDB4MDEzZiwtMSwweDAwNjAsMHhhNzAwLAotCS0xLDB4MDA2MSwweDAwMDEsLTEsMHgwMDZhLDB4MDAwMCwtMSwweDAwODAsMHgwMDAwLC0xLDB4MDA4MSwweDAwMDAsCi0JLTEsMHgwMDgyLDB4MDAwMCwtMSwweDAwODMsMHgwMDAwLC0xLDB4MDA4NCwweDAwMDAsLTEsMHgwMDg1LDB4MDAwMCwKLQktMSwweDAwOTAsMHgwMDEwLC0xLDB4MDA5MiwweDAwMDAsLTEsMHgwMDkzLDB4MDAwMywtMSwweDAwOTUsMHgwMTEwLAotCS0xLDB4MDA5NywweDAwMDAsLTEsMHgwMDk4LDB4MDAwMCwtMSwweDAwMDcsMHgwMTMzLC0xLDB4MDAyMCwweDAwMDAsCi0JLTEsMHgwMDIxLDB4MDAwMCwtMiwxMDAsLTMgfTsKKwktMSwgMHgwMGU3LCAweDAwMTAsIC0xLCAweDAwMDAsIDB4MDAwMSwKKwktMSwgMHgwMDAxLCAweDAxMDAsIC0xLCAweDAwMDIsIDB4MDcwMCwKKwktMSwgMHgwMDAzLCAweDEwMzAsIC0xLCAweDAwMDQsIDB4MDAwMCwKKwktMSwgMHgwMDA4LCAweDAyMDcsIC0xLCAweDAwMDksIDB4MDAwMCwKKwktMSwgMHgwMDBhLCAweDAwMDAsIC0xLCAweDAwMGMsIDB4MDAwMSwKKwktMSwgMHgwMDBkLCAweDAwMDAsIC0xLCAweDAwMGYsIDB4MDAwMCwKKwktMSwgMHgwMDEwLCAweDAwMDAsIC0xLCAweDAwMTEsIDB4MDAwNywKKwktMSwgMHgwMDEyLCAweDAwMDAsIC0xLCAweDAwMTMsIDB4MDAwMCwKKwktMiwgNTAsIC0xLCAweDAwMTAsIDB4MTU5MCwgLTEsIDB4MDAxMSwKKwkweDAyMjcsIC0yLCA1MCwgLTEsIDB4MDAxMiwgMHgwMDljLCAtMiwgNTAsCisJLTEsIDB4MDAxMywgMHgxOTAwLCAtMSwgMHgwMDI5LCAweDAwMjMsCisJLTEsIDB4MDAyYiwgMHgwMDBlLCAtMiwgNTAsCisJLTEsIDB4MDAyMCwgMHgwMDAwLCAtMSwgMHgwMDIxLCAweDAwMDAsCisJLTIsIDUwLCAtMSwgMHgwMDUwLCAweDAwMDAsCisJLTEsIDB4MDA1MSwgMHgwMGVmLCAtMSwgMHgwMDUyLCAweDAwMDAsCisJLTEsIDB4MDA1MywgMHgwMTNmLCAtMSwgMHgwMDYwLCAweGE3MDAsCisJLTEsIDB4MDA2MSwgMHgwMDAxLCAtMSwgMHgwMDZhLCAweDAwMDAsCisJLTEsIDB4MDA4MCwgMHgwMDAwLCAtMSwgMHgwMDgxLCAweDAwMDAsCisJLTEsIDB4MDA4MiwgMHgwMDAwLCAtMSwgMHgwMDgzLCAweDAwMDAsCisJLTEsIDB4MDA4NCwgMHgwMDAwLCAtMSwgMHgwMDg1LCAweDAwMDAsCisJLTEsIDB4MDA5MCwgMHgwMDEwLCAtMSwgMHgwMDkyLCAweDAwMDAsCisJLTEsIDB4MDA5MywgMHgwMDAzLCAtMSwgMHgwMDk1LCAweDAxMTAsCisJLTEsIDB4MDA5NywgMHgwMDAwLCAtMSwgMHgwMDk4LCAweDAwMDAsCisJLTEsIDB4MDAwNywgMHgwMTMzLCAtMSwgMHgwMDIwLCAweDAwMDAsCisJLTEsIDB4MDAyMSwgMHgwMDAwLCAtMiwgMTAwLCAtMyB9OwogCiAjZGVmaW5lIEhZMjhCX0dBTU1BIFwKIAkiMDQgMUYgNCA3IDcgMCA3IDcgNiAwXG4iIFwKIAkiMEYgMDAgMSA3IDQgMCAwIDAgNiA3IgogCiBzdGF0aWMgaW50IHBpdGZ0X2luaXRfc2VxdWVuY2VbXSA9IHsKLQktMSwweDAxLC0yLDUsLTEsMHgyOCwtMSwweEVGLDB4MDMsMHg4MCwweDAyLC0xLDB4Q0YsMHgwMCwweEMxLDB4MzAsCi0JLTEsMHhFRCwweDY0LDB4MDMsMHgxMiwweDgxLC0xLDB4RTgsMHg4NSwweDAwLDB4NzgsCi0JLTEsMHhDQiwweDM5LDB4MkMsMHgwMCwweDM0LDB4MDIsLTEsMHhGNywweDIwLC0xLDB4RUEsMHgwMCwweDAwLAotCS0xLDB4QzAsMHgyMywtMSwweEMxLDB4MTAsLTEsMHhDNSwweDNlLDB4MjgsLTEsMHhDNywweDg2LC0xLDB4M0EsMHg1NSwKLQktMSwweEIxLDB4MDAsMHgxOCwtMSwweEI2LDB4MDgsMHg4MiwweDI3LC0xLDB4RjIsMHgwMCwtMSwweDI2LDB4MDEsCi0JLTEsMHhFMCwweDBGLDB4MzEsMHgyQiwweDBDLDB4MEUsMHgwOCwweDRFLDB4RjEsMHgzNywweDA3LDB4MTAsMHgwMywKLQkweDBFLDB4MDksMHgwMCwtMSwweEUxLDB4MDAsMHgwRSwweDE0LDB4MDMsMHgxMSwweDA3LDB4MzEsMHhDMSwweDQ4LAotCTB4MDgsMHgwRiwweDBDLDB4MzEsMHgzNiwweDBGLC0xLDB4MTEsLTIsMTAwLC0xLDB4MjksLTIsMjAsLTMgfTsKKwktMSwgMHgwMSwgLTIsIDUsIC0xLCAweDI4LCAtMSwgMHhFRiwKKwkweDAzLCAweDgwLCAweDAyLCAtMSwgMHhDRiwgMHgwMCwgMHhDMSwgMHgzMCwKKwktMSwgMHhFRCwgMHg2NCwgMHgwMywgMHgxMiwgMHg4MSwKKwktMSwgMHhFOCwgMHg4NSwgMHgwMCwgMHg3OCwKKwktMSwgMHhDQiwgMHgzOSwgMHgyQywgMHgwMCwgMHgzNCwgMHgwMiwKKwktMSwgMHhGNywgMHgyMCwgLTEsIDB4RUEsIDB4MDAsIDB4MDAsCisJLTEsIDB4QzAsIDB4MjMsIC0xLCAweEMxLCAweDEwLCAtMSwgMHhDNSwKKwkweDNlLCAweDI4LCAtMSwgMHhDNywgMHg4NiwgLTEsIDB4M0EsIDB4NTUsCisJLTEsIDB4QjEsIDB4MDAsIDB4MTgsIC0xLCAweEI2LCAweDA4LCAweDgyLAorCTB4MjcsIC0xLCAweEYyLCAweDAwLCAtMSwgMHgyNiwgMHgwMSwKKwktMSwgMHhFMCwgMHgwRiwgMHgzMSwgMHgyQiwgMHgwQywgMHgwRSwgMHgwOCwKKwkweDRFLCAweEYxLCAweDM3LCAweDA3LCAweDEwLCAweDAzLAorCTB4MEUsIDB4MDksIDB4MDAsIC0xLCAweEUxLCAweDAwLCAweDBFLCAweDE0LAorCTB4MDMsIDB4MTEsIDB4MDcsIDB4MzEsIDB4QzEsIDB4NDgsCisJMHgwOCwgMHgwRiwgMHgwQywgMHgzMSwgMHgzNiwgMHgwRiwgLTEsCisJMHgxMSwgLTIsIDEwMCwgLTEsIDB4MjksIC0yLCAyMCwgLTMgfTsKIAogc3RhdGljIGludCB3YXZlc2hhcmUzMmJfaW5pdF9zZXF1ZW5jZVtdID0gewotCS0xLDB4Q0IsMHgzOSwweDJDLDB4MDAsMHgzNCwweDAyLC0xLDB4Q0YsMHgwMCwweEMxLDB4MzAsCi0JLTEsMHhFOCwweDg1LDB4MDAsMHg3OCwtMSwweEVBLDB4MDAsMHgwMCwtMSwweEVELDB4NjQsMHgwMywweDEyLDB4ODEsCi0JLTEsMHhGNywweDIwLC0xLDB4QzAsMHgyMywtMSwweEMxLDB4MTAsLTEsMHhDNSwweDNlLDB4MjgsLTEsMHhDNywweDg2LAotCS0xLDB4MzYsMHgyOCwtMSwweDNBLDB4NTUsLTEsMHhCMSwweDAwLDB4MTgsLTEsMHhCNiwweDA4LDB4ODIsMHgyNywKLQktMSwweEYyLDB4MDAsLTEsMHgyNiwweDAxLAotCS0xLDB4RTAsMHgwRiwweDMxLDB4MkIsMHgwQywweDBFLDB4MDgsMHg0RSwweEYxLDB4MzcsMHgwNywweDEwLDB4MDMsMHgwRSwweDA5LDB4MDAsCi0JLTEsMHhFMSwweDAwLDB4MEUsMHgxNCwweDAzLDB4MTEsMHgwNywweDMxLDB4QzEsMHg0OCwweDA4LDB4MEYsMHgwQywweDMxLDB4MzYsMHgwRiwKLQktMSwweDExLC0yLDEyMCwtMSwweDI5LC0xLDB4MmMsLTMgfTsKKwktMSwgMHhDQiwgMHgzOSwgMHgyQywgMHgwMCwgMHgzNCwgMHgwMiwKKwktMSwgMHhDRiwgMHgwMCwgMHhDMSwgMHgzMCwKKwktMSwgMHhFOCwgMHg4NSwgMHgwMCwgMHg3OCwgLTEsIDB4RUEsIDB4MDAsCisJMHgwMCwgLTEsIDB4RUQsIDB4NjQsIDB4MDMsIDB4MTIsIDB4ODEsCisJLTEsIDB4RjcsIDB4MjAsIC0xLCAweEMwLCAweDIzLCAtMSwgMHhDMSwKKwkweDEwLCAtMSwgMHhDNSwgMHgzZSwgMHgyOCwgLTEsIDB4QzcsIDB4ODYsCisJLTEsIDB4MzYsIDB4MjgsIC0xLCAweDNBLCAweDU1LCAtMSwgMHhCMSwgMHgwMCwKKwkweDE4LCAtMSwgMHhCNiwgMHgwOCwgMHg4MiwgMHgyNywKKwktMSwgMHhGMiwgMHgwMCwgLTEsIDB4MjYsIDB4MDEsCisJLTEsIDB4RTAsIDB4MEYsIDB4MzEsIDB4MkIsIDB4MEMsIDB4MEUsIDB4MDgsIDB4NEUsCisJMHhGMSwgMHgzNywgMHgwNywgMHgxMCwgMHgwMywgMHgwRSwgMHgwOSwgMHgwMCwKKwktMSwgMHhFMSwgMHgwMCwgMHgwRSwgMHgxNCwgMHgwMywgMHgxMSwgMHgwNywgMHgzMSwKKwkweEMxLCAweDQ4LCAweDA4LCAweDBGLCAweDBDLCAweDMxLCAweDM2LCAweDBGLAorCS0xLCAweDExLCAtMiwgMTIwLCAtMSwgMHgyOSwgLTEsIDB4MmMsIC0zIH07CiAKIC8qIFN1cHBvcnRlZCBkaXNwbGF5cyBpbiBhbHBoYWJldGljYWwgb3JkZXIgKi8KIHN0YXRpYyBzdHJ1Y3QgZmJ0ZnRfZGV2aWNlX2Rpc3BsYXkgZGlzcGxheXNbXSA9IHsKQEAgLTQ2Myw3ICs0ODksNyBAQAogCQkJCQkuYnVzd2lkdGggPSA4LAogCQkJCQkuYmFja2xpZ2h0ID0gMSwKIAkJCQl9LAotCQkJCS5zdGFydGJ5dGUgPSAwYjAxMTEwMDAwLAorCQkJCS5zdGFydGJ5dGUgPSAweDcwLAogCQkJCS5iZ3IgPSB0cnVlLAogCQkJCS5ncGlvcyA9IChjb25zdCBzdHJ1Y3QgZmJ0ZnRfZ3BpbyBbXSkgewogCQkJCQl7ICJyZXNldCIsIDI1IH0sCkBAIC00ODQsOSArNTEwLDkgQEAKIAkJCQkJLmJhY2tsaWdodCA9IDEsCiAJCQkJCS5pbml0X3NlcXVlbmNlID0gaHkyOGJfaW5pdF9zZXF1ZW5jZSwKIAkJCQl9LAotCQkJCS5zdGFydGJ5dGUgPSAwYjAxMTEwMDAwLAorCQkJCS5zdGFydGJ5dGUgPSAweDcwLAogCQkJCS5iZ3IgPSB0cnVlLAotCQkJCS5mcHM9IDUwLAorCQkJCS5mcHMgPSA1MCwKIAkJCQkuZ3Bpb3MgPSAoY29uc3Qgc3RydWN0IGZidGZ0X2dwaW8gW10pIHsKIAkJCQkJeyAicmVzZXQiLCAyNSB9LAogCQkJCQl7ICJsZWQiLCAxOCB9LApAQCAtNTk3LDcgKzYyMyw3IEBACiAJCQkJCS5idXN3aWR0aCA9IDgsCiAJCQkJCS5iYWNrbGlnaHQgPSAxLAogCQkJCX0sCi0JCQkJLnN0YXJ0Ynl0ZSA9IDBiMDExMTAwMDAsCisJCQkJLnN0YXJ0Ynl0ZSA9IDB4NzAsCiAJCQkJLmJnciA9IHRydWUsCiAJCQkJLmdwaW9zID0gKGNvbnN0IHN0cnVjdCBmYnRmdF9ncGlvIFtdKSB7CiAJCQkJCXsgInJlc2V0IiwgMjUgfSwKQEAgLTY3Niw2ICs3MDIsMjQgQEAKIAkJCX0KIAkJfQogCX0sIHsKKwkJLm5hbWUgPSAibm9raWE1MTEwIiwKKwkJLnNwaSA9ICYoc3RydWN0IHNwaV9ib2FyZF9pbmZvKSB7CisJCQkubW9kYWxpYXMgPSAiZmJfaWxpOTE2MyIsCisJCQkubWF4X3NwZWVkX2h6ID0gMTIwMDAwMDAsCisJCQkubW9kZSA9IFNQSV9NT0RFXzAsCisJCQkucGxhdGZvcm1fZGF0YSA9ICYoc3RydWN0IGZidGZ0X3BsYXRmb3JtX2RhdGEpIHsKKwkJCQkuZGlzcGxheSA9IHsKKwkJCQkJLmJ1c3dpZHRoID0gOCwKKwkJCQkJLmJhY2tsaWdodCA9IDEsCisJCQkJfSwKKwkJCQkuYmdyID0gdHJ1ZSwKKwkJCQkuZ3Bpb3MgPSAoY29uc3Qgc3RydWN0IGZidGZ0X2dwaW8gW10pIHsKKwkJCQkJe30sCisJCQkJfSwKKwkJCX0KKwkJfQorCX0sIHsKKwogCQkubmFtZSA9ICJwaXNjcmVlbiIsCiAJCS5zcGkgPSAmKHN0cnVjdCBzcGlfYm9hcmRfaW5mbykgewogCQkJLm1vZGFsaWFzID0gImZiX2lsaTk0ODYiLApAQCAtMTEwMCwxNCArMTE0NCwxNCBAQAogCQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJCQlpZiAoKGRhdGEgJiAxKSAhPSAocHJldl9kYXRhICYgMSkpCiAJCQkJCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5kYltpXSwKLQkJCQkJCQkJKGRhdGEgJiAxKSk7CisJCQkJCQkJCWRhdGEgJiAxKTsKIAkJCQlkYXRhID4+PSAxOwogCQkJCXByZXZfZGF0YSA+Pj0gMTsKIAkJCX0KIAkJfQogI2Vsc2UKIAkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJCWdwaW9fc2V0X3ZhbHVlKHBhci0+Z3Bpby5kYltpXSwgKGRhdGEgJiAxKSk7CisJCQlncGlvX3NldF92YWx1ZShwYXItPmdwaW8uZGJbaV0sIGRhdGEgJiAxKTsKIAkJCWRhdGEgPj49IDE7CiAJCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZsZXhmYi5jIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ZsZXhmYi5jCmluZGV4IDkwODMyYzMuLmNhMzlmZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9mbGV4ZmIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZmJ0ZnQvZmxleGZiLmMKQEAgLTQyMyw3ICs0MjMsNyBAQAogCQkJfQogCQkJcGFyLT5mYnRmdG9wcy53cml0ZV9yZWdpc3RlciA9IGZidGZ0X3dyaXRlX3JlZzhfYnVzOTsKIAkJCXBhci0+ZmJ0ZnRvcHMud3JpdGVfdm1lbSA9IGZidGZ0X3dyaXRlX3ZtZW0xNl9idXM5OwotCQkJc2Rldi0+Yml0c19wZXJfd29yZD05OworCQkJc2Rldi0+Yml0c19wZXJfd29yZCA9IDk7CiAJCQlyZXQgPSBzZGV2LT5tYXN0ZXItPnNldHVwKHNkZXYpOwogCQkJaWYgKHJldCkgewogCQkJCWRldl93YXJuKGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZidGZ0L2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5ZGI4MgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mYnRmdC9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgTm9yYWxmIFRyb25uZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX19MSU5VWF9GQlRGVF9fSU5URVJOQUxfSAorI2RlZmluZSBfX0xJTlVYX0ZCVEZUX0lOVEVSTkFMX0gKKwordm9pZCBmYnRmdF9zeXNmc19pbml0KHN0cnVjdCBmYnRmdF9wYXIgKnBhcik7Cit2b2lkIGZidGZ0X3N5c2ZzX2V4aXQoc3RydWN0IGZidGZ0X3BhciAqcGFyKTsKK3ZvaWQgZmJ0ZnRfZXhwYW5kX2RlYnVnX3ZhbHVlKHVuc2lnbmVkIGxvbmcgKmRlYnVnKTsKK2ludCBmYnRmdF9nYW1tYV9wYXJzZV9zdHIoc3RydWN0IGZidGZ0X3BhciAqcGFyLCB1bnNpZ25lZCBsb25nICpjdXJ2ZXMsCisJCQkgIGNvbnN0IGNoYXIgKnN0ciwgaW50IHNpemUpOworCisjZW5kaWYgLyogX19MSU5VWF9GQlRGVF9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJkZjA3YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvS2NvbmZpZwpAQCAtMCwwICsxIEBACitzb3VyY2UgImRyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzZhMDAxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKKyMgRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBkcml2ZXJzCitvYmotJChDT05GSUdfRlNMX01DX0JVUykJKz0gYnVzLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ODI4OGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL1RPRE8KQEAgLTAsMCArMSwxMyBAQAorKiBBZGQgUkVBRE1FIGZpbGUgKHdpdGggQVNDSUkgYXJ0KSBkZXNjcmliaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbgorICBEUEFBMiBvYmplY3RzIGFuZCBob3cgY29tYmluZSB0aGVtIHRvIG1ha2UgYSBOSUMsIGFuIExTMiBzd2l0Y2gsIGV0Yy4KKyAgQWxzbywgZGVmaW5lIGFsbCBhY3JvbnltcyB1c2VkLgorCisqIERlY2lkZSBpZiBtdWx0aXBsZSByb290IGZzbC1tYyBidXNlcyB3aWxsIGJlIHN1cHBvcnRlZCBwZXIgTGludXggaW5zdGFuY2UsCisgIGFuZCBpZiBzbyBhZGQgc3VwcG9ydCBmb3IgdGhpcy4KKworKiBBZGQgYXQgbGVhc3Qgb25lIGRldmljZSBkcml2ZXIgZm9yIGEgRFBBQTIgb2JqZWN0IChjaGlsZCBkZXZpY2Ugb2YgdGhlCisgIGZzbC1tYyBidXMpLgorCitQbGVhc2Ugc2VuZCBhbnkgcGF0Y2hlcyB0byBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnPiwKK2dlcm1hbi5yaXZlcmFAZnJlZXNjYWxlLmNvbSwgZGV2ZWxAZHJpdmVyZGV2Lm9zdW9zbC5vcmcsCitsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDc3OWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvS2NvbmZpZwpAQCAtMCwwICsxLDI0IEBACisjCisjIEZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgZHJpdmVycworIworIyBDb3B5cmlnaHQgKEMpIDIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyMKKyMgVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2MgorIworCitjb25maWcgRlNMX01DX0JVUworCXRyaXN0YXRlICJGcmVlc2NhbGUgTWFuYWdlbWVudCBDb21wbGV4IChNQykgYnVzIGRyaXZlciIKKwlkZXBlbmRzIG9uIE9GICYmIEFSTTY0CisJaGVscAorCSAgRHJpdmVyIHRvIGVuYWJsZSB0aGUgYnVzIGluZnJhc3RydWN0dXJlIGZvciB0aGUgRnJlZXNjYWxlCisgICAgICAgICAgUW9ySVEgTWFuYWdlbWVudCBDb21wbGV4IChmc2wtbWMpLiBUaGUgZnNsLW1jIGlzIGEgaGFyZHdhcmUKKwkgIG1vZHVsZSBvZiB0aGUgUW9ySVEgTFMyIFNvQ3MsIHRoYXQgZG9lcyByZXNvdXJjZSBtYW5hZ2VtZW50CisJICBmb3IgaGFyZHdhcmUgYnVpbGRpbmctYmxvY2tzIGluIHRoZSBTb0MgdGhhdCBjYW4gYmUgdXNlZAorCSAgdG8gZHluYW1pY2FsbHkgY3JlYXRlIG5ldHdvcmtpbmcgaGFyZHdhcmUgb2JqZWN0cyBzdWNoIGFzCisJICBuZXR3b3JrIGludGVyZmFjZXMgKE5JQ3MpLCBjcnlwdG8gYWNjZWxlcmF0b3IgaW5zdGFuY2VzLAorCSAgb3IgTDIgc3dpdGNoZXMuCisKKwkgIE9ubHkgZW5hYmxlIHRoaXMgb3B0aW9uIHdoZW4gYnVpbGRpbmcgdGhlIGtlcm5lbCBmb3IKKwkgIEZyZWVzY2FsZSBRb3JRSVEgTFMyeHh4eCBTb0NzLgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU0MzNhOQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTcgQEAKKyMKKyMgRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBkcml2ZXJzCisjCisjIENvcHlyaWdodCAoQykgMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorIworIyBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyCisjCitvYmotJChDT05GSUdfRlNMX01DX0JVUykgKz0gbWMtYnVzLWRyaXZlci5vCisKK21jLWJ1cy1kcml2ZXItb2JqcyA6PSBtYy1idXMubyBcCisJCSAgICAgIG1jLXN5cy5vIFwKKwkJICAgICAgZHByYy5vIFwKKwkJICAgICAgZHBtbmcubyBcCisJCSAgICAgIGRwcmMtZHJpdmVyLm8gXAorCQkgICAgICBtYy1hbGxvY2F0b3IubyBcCisJCSAgICAgIGRwbWNwLm8gXAorCQkgICAgICBkcGJwLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwYnAuYyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwYnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTlhYjZkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBicC5jCkBAIC0wLDAgKzEsMzU4IEBACisvKiBDb3B5cmlnaHQgMjAxMy0yMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyogbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqCisqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyogbGF0ZXIgdmVyc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1jbWQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2RwYnAuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2RwYnAtY21kLmgiCisKK2ludCBkcGJwX29wZW4oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIGludCBkcGJwX2lkLCB1aW50MTZfdCAqdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUEJQX0NNRElEX09QRU4sCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIDApOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBkcGJwX2lkKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSp0b2tlbiA9IE1DX0NNRF9IRFJfUkVBRF9UT0tFTihjbWQuaGVhZGVyKTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGRwYnBfb3Blbik7CisKK2ludCBkcGJwX2Nsb3NlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUEJQX0NNRElEX0NMT1NFLCBNQ19DTURfUFJJX0hJR0gsCisJCQkJCSAgdG9rZW4pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KK0VYUE9SVF9TWU1CT0woZHBicF9jbG9zZSk7CisKK2ludCBkcGJwX2NyZWF0ZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJY29uc3Qgc3RydWN0IGRwYnBfY2ZnICpjZmcsCisJCXVpbnQxNl90ICp0b2tlbikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJKHZvaWQpKGNmZyk7IC8qIHVudXNlZCAqLworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQQlBfQ01ESURfQ1JFQVRFLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCAwKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSp0b2tlbiA9IE1DX0NNRF9IRFJfUkVBRF9UT0tFTihjbWQuaGVhZGVyKTsKKworCXJldHVybiAwOworfQorCitpbnQgZHBicF9kZXN0cm95KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUEJQX0NNRElEX0RFU1RST1ksCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcGJwX2VuYWJsZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9FTkFCTEUsIE1DX0NNRF9QUklfTE9XLAorCQkJCQkgIHRva2VuKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CitFWFBPUlRfU1lNQk9MKGRwYnBfZW5hYmxlKTsKKworaW50IGRwYnBfZGlzYWJsZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9ESVNBQkxFLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorRVhQT1JUX1NZTUJPTChkcGJwX2Rpc2FibGUpOworCitpbnQgZHBicF9pc19lbmFibGVkKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbiwgaW50ICplbikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUEJQX0NNRElEX0lTX0VOQUJMRUQsIE1DX0NNRF9QUklfTE9XLAorCQkJCQkgIHRva2VuKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSplbiA9IChpbnQpbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcGJwX3Jlc2V0KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUEJQX0NNRElEX1JFU0VULAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBicF9zZXRfaXJxKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgdWludDE2X3QgdG9rZW4sCisJCSB1aW50OF90IGlycV9pbmRleCwKKwkJIHVpbnQ2NF90IGlycV9wYWRkciwKKwkJIHVpbnQzMl90IGlycV92YWwsCisJCSBpbnQgdXNlcl9pcnFfaWQpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9TRVRfSVJRLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgOCwgaXJxX2luZGV4KTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgMzIsIGlycV92YWwpOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDAsIDY0LCBpcnFfcGFkZHIpOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDAsIDMyLCB1c2VyX2lycV9pZCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBicF9nZXRfaXJxKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgdWludDE2X3QgdG9rZW4sCisJCSB1aW50OF90IGlycV9pbmRleCwKKwkJIGludCAqdHlwZSwKKwkJIHVpbnQ2NF90ICppcnFfcGFkZHIsCisJCSB1aW50MzJfdCAqaXJxX3ZhbCwKKwkJIGludCAqdXNlcl9pcnFfaWQpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUEJQX0NNRElEX0dFVF9JUlEsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSppcnFfdmFsID0gKHVpbnQzMl90KW1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCAzMik7CisJKmlycV9wYWRkciA9ICh1aW50NjRfdCltY19kZWMoY21kLnBhcmFtc1sxXSwgMCwgNjQpOworCSp1c2VyX2lycV9pZCA9IChpbnQpbWNfZGVjKGNtZC5wYXJhbXNbMl0sIDAsIDMyKTsKKwkqdHlwZSA9IChpbnQpbWNfZGVjKGNtZC5wYXJhbXNbMl0sIDMyLCAzMik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcGJwX3NldF9pcnFfZW5hYmxlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJdWludDE2X3QgdG9rZW4sCisJCQl1aW50OF90IGlycV9pbmRleCwKKwkJCXVpbnQ4X3QgZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9TRVRfSVJRX0VOQUJMRSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDgsIGVuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcGJwX2dldF9pcnFfZW5hYmxlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJdWludDE2X3QgdG9rZW4sCisJCQl1aW50OF90IGlycV9pbmRleCwKKwkJCXVpbnQ4X3QgKmVuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9HRVRfSVJRX0VOQUJMRSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKmVuID0gKHVpbnQ4X3QpbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDgpOworCXJldHVybiAwOworfQorCitpbnQgZHBicF9zZXRfaXJxX21hc2soc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgICAgIHVpbnQxNl90IHRva2VuLAorCQkgICAgICB1aW50OF90IGlycV9pbmRleCwKKwkJICAgICAgdWludDMyX3QgbWFzaykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUEJQX0NNRElEX1NFVF9JUlFfTUFTSywKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBtYXNrKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcGJwX2dldF9pcnFfbWFzayhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICAgICAgdWludDE2X3QgdG9rZW4sCisJCSAgICAgIHVpbnQ4X3QgaXJxX2luZGV4LAorCQkgICAgICB1aW50MzJfdCAqbWFzaykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQQlBfQ01ESURfR0VUX0lSUV9NQVNLLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqbWFzayA9ICh1aW50MzJfdCltY19kZWMoY21kLnBhcmFtc1swXSwgMCwgMzIpOworCXJldHVybiAwOworfQorCitpbnQgZHBicF9nZXRfaXJxX3N0YXR1cyhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCXVpbnQxNl90IHRva2VuLAorCQkJdWludDhfdCBpcnFfaW5kZXgsCisJCQl1aW50MzJfdCAqc3RhdHVzKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9HRVRfSVJRX1NUQVRVUywKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKnN0YXR1cyA9ICh1aW50MzJfdCltY19kZWMoY21kLnBhcmFtc1swXSwgMCwgMzIpOworCXJldHVybiAwOworfQorCitpbnQgZHBicF9jbGVhcl9pcnFfc3RhdHVzKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJICB1aW50MTZfdCB0b2tlbiwKKwkJCSAgdWludDhfdCBpcnFfaW5kZXgsCisJCQkgIHVpbnQzMl90IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUEJQX0NNRElEX0NMRUFSX0lSUV9TVEFUVVMsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgc3RhdHVzKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcGJwX2dldF9hdHRyaWJ1dGVzKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJdWludDE2X3QgdG9rZW4sCisJCQlzdHJ1Y3QgZHBicF9hdHRyICphdHRyKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBCUF9DTURJRF9HRVRfQVRUUiwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJYXR0ci0+YnBpZCA9ICh1aW50MTZfdCltY19kZWMoY21kLnBhcmFtc1swXSwgMTYsIDE2KTsKKwlhdHRyLT5pZCA9IChpbnQpbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDMyLCAzMik7CisJYXR0ci0+dmVyc2lvbi5tYWpvciA9ICh1aW50MTZfdCltY19kZWMoY21kLnBhcmFtc1sxXSwgMCwgMTYpOworCWF0dHItPnZlcnNpb24ubWlub3IgPSAodWludDE2X3QpbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDE2LCAxNik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRwYnBfZ2V0X2F0dHJpYnV0ZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AtY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1jcC1jbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2YzMjZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AtY21kLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTUgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQorICogbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIF9GU0xfRFBNQ1BfQ01EX0gKKyNkZWZpbmUgX0ZTTF9EUE1DUF9DTURfSAorCisvKiBEUE1DUCBWZXJzaW9uICovCisjZGVmaW5lIERQTUNQX1ZFUl9NQUpPUgkJCQkyCisjZGVmaW5lIERQTUNQX1ZFUl9NSU5PUgkJCQkwCisKKy8qIENvbW1hbmQgSURzICovCisjZGVmaW5lIERQTUNQX0NNRElEX0NMT1NFCQkJCTB4ODAwCisjZGVmaW5lIERQTUNQX0NNRElEX09QRU4JCQkJMHg4MGIKKyNkZWZpbmUgRFBNQ1BfQ01ESURfQ1JFQVRFCQkJCTB4OTBiCisjZGVmaW5lIERQTUNQX0NNRElEX0RFU1RST1kJCQkJMHg5MDAKKworI2RlZmluZSBEUE1DUF9DTURJRF9HRVRfQVRUUgkJCQkweDAwNAorI2RlZmluZSBEUE1DUF9DTURJRF9SRVNFVAkJCQkweDAwNQorCisjZGVmaW5lIERQTUNQX0NNRElEX1NFVF9JUlEJCQkJMHgwMTAKKyNkZWZpbmUgRFBNQ1BfQ01ESURfR0VUX0lSUQkJCQkweDAxMQorI2RlZmluZSBEUE1DUF9DTURJRF9TRVRfSVJRX0VOQUJMRQkJCTB4MDEyCisjZGVmaW5lIERQTUNQX0NNRElEX0dFVF9JUlFfRU5BQkxFCQkJMHgwMTMKKyNkZWZpbmUgRFBNQ1BfQ01ESURfU0VUX0lSUV9NQVNLCQkJMHgwMTQKKyNkZWZpbmUgRFBNQ1BfQ01ESURfR0VUX0lSUV9NQVNLCQkJMHgwMTUKKyNkZWZpbmUgRFBNQ1BfQ01ESURfR0VUX0lSUV9TVEFUVVMJCQkweDAxNgorI2RlZmluZSBEUE1DUF9DTURJRF9DTEVBUl9JUlFfU1RBVFVTCQkJMHgwMTcKKworLyogICAgICAgICAgICAgICAgY21kLCBwYXJhbSwgb2Zmc2V0LCB3aWR0aCwgdHlwZSwgYXJnX25hbWUgKi8KKyNkZWZpbmUgRFBNQ1BfQ01EX0NSRUFURShjbWQsIGNmZykgXAorCU1DX0NNRF9PUChjbWQsIDAsIDAsICAzMiwgaW50LCAgICAgIGNmZy0+cG9ydGFsX2lkKQorCisvKiAgICAgICAgICAgICAgICBjbWQsIHBhcmFtLCBvZmZzZXQsIHdpZHRoLCB0eXBlLCBhcmdfbmFtZSAqLworI2RlZmluZSBEUE1DUF9DTURfU0VUX0lSUShjbWQsIGlycV9pbmRleCwgaXJxX2FkZHIsIGlycV92YWwsIHVzZXJfaXJxX2lkKSBcCitkbyB7IFwKKwlNQ19DTURfT1AoY21kLCAwLCAwLCAgOCwgIHVpbnQ4X3QsICBpcnFfaW5kZXgpO1wKKwlNQ19DTURfT1AoY21kLCAwLCAzMiwgMzIsIHVpbnQzMl90LCBpcnFfdmFsKTtcCisJTUNfQ01EX09QKGNtZCwgMSwgMCwgIDY0LCB1aW50NjRfdCwgaXJxX2FkZHIpOyBcCisJTUNfQ01EX09QKGNtZCwgMiwgMCwgIDMyLCBpbnQsCSAgICB1c2VyX2lycV9pZCk7IFwKK30gd2hpbGUgKDApCisKKy8qICAgICAgICAgICAgICAgIGNtZCwgcGFyYW0sIG9mZnNldCwgd2lkdGgsIHR5cGUsIGFyZ19uYW1lICovCisjZGVmaW5lIERQTUNQX0NNRF9HRVRfSVJRKGNtZCwgaXJxX2luZGV4KSBcCisJTUNfQ01EX09QKGNtZCwgMCwgMzIsIDgsICB1aW50OF90LCAgaXJxX2luZGV4KQorCisvKiAgICAgICAgICAgICAgICBjbWQsIHBhcmFtLCBvZmZzZXQsIHdpZHRoLCB0eXBlLCBhcmdfbmFtZSAqLworI2RlZmluZSBEUE1DUF9SU1BfR0VUX0lSUShjbWQsIHR5cGUsIGlycV9hZGRyLCBpcnFfdmFsLCB1c2VyX2lycV9pZCkgXAorZG8geyBcCisJTUNfUlNQX09QKGNtZCwgMCwgMCwgIDMyLCB1aW50MzJfdCwgaXJxX3ZhbCk7IFwKKwlNQ19SU1BfT1AoY21kLCAxLCAwLCAgNjQsIHVpbnQ2NF90LCBpcnFfYWRkcik7IFwKKwlNQ19SU1BfT1AoY21kLCAyLCAwLCAgMzIsIGludCwJICAgIHVzZXJfaXJxX2lkKTsgXAorCU1DX1JTUF9PUChjbWQsIDIsIDMyLCAzMiwgaW50LAkgICAgdHlwZSk7IFwKK30gd2hpbGUgKDApCisKKy8qICAgICAgICAgICAgICAgIGNtZCwgcGFyYW0sIG9mZnNldCwgd2lkdGgsIHR5cGUsIGFyZ19uYW1lICovCisjZGVmaW5lIERQTUNQX0NNRF9TRVRfSVJRX0VOQUJMRShjbWQsIGlycV9pbmRleCwgZW4pIFwKK2RvIHsgXAorCU1DX0NNRF9PUChjbWQsIDAsIDAsICA4LCAgdWludDhfdCwgIGVuKTsgXAorCU1DX0NNRF9PUChjbWQsIDAsIDMyLCA4LCAgdWludDhfdCwgIGlycV9pbmRleCk7XAorfSB3aGlsZSAoMCkKKworLyogICAgICAgICAgICAgICAgY21kLCBwYXJhbSwgb2Zmc2V0LCB3aWR0aCwgdHlwZSwgYXJnX25hbWUgKi8KKyNkZWZpbmUgRFBNQ1BfQ01EX0dFVF9JUlFfRU5BQkxFKGNtZCwgaXJxX2luZGV4KSBcCisJTUNfQ01EX09QKGNtZCwgMCwgMzIsIDgsICB1aW50OF90LCAgaXJxX2luZGV4KQorCisvKiAgICAgICAgICAgICAgICBjbWQsIHBhcmFtLCBvZmZzZXQsIHdpZHRoLCB0eXBlLCBhcmdfbmFtZSAqLworI2RlZmluZSBEUE1DUF9SU1BfR0VUX0lSUV9FTkFCTEUoY21kLCBlbikgXAorCU1DX1JTUF9PUChjbWQsIDAsIDAsICA4LCAgdWludDhfdCwgIGVuKQorCisvKiAgICAgICAgICAgICAgICBjbWQsIHBhcmFtLCBvZmZzZXQsIHdpZHRoLCB0eXBlLCBhcmdfbmFtZSAqLworI2RlZmluZSBEUE1DUF9DTURfU0VUX0lSUV9NQVNLKGNtZCwgaXJxX2luZGV4LCBtYXNrKSBcCitkbyB7IFwKKwlNQ19DTURfT1AoY21kLCAwLCAwLCAgMzIsIHVpbnQzMl90LCBtYXNrKTtcCisJTUNfQ01EX09QKGNtZCwgMCwgMzIsIDgsICB1aW50OF90LCAgaXJxX2luZGV4KTtcCit9IHdoaWxlICgwKQorCisvKiAgICAgICAgICAgICAgICBjbWQsIHBhcmFtLCBvZmZzZXQsIHdpZHRoLCB0eXBlLCBhcmdfbmFtZSAqLworI2RlZmluZSBEUE1DUF9DTURfR0VUX0lSUV9NQVNLKGNtZCwgaXJxX2luZGV4KSBcCisJTUNfQ01EX09QKGNtZCwgMCwgMzIsIDgsICB1aW50OF90LCAgaXJxX2luZGV4KQorCisvKiAgICAgICAgICAgICAgICBjbWQsIHBhcmFtLCBvZmZzZXQsIHdpZHRoLCB0eXBlLCBhcmdfbmFtZSAqLworI2RlZmluZSBEUE1DUF9SU1BfR0VUX0lSUV9NQVNLKGNtZCwgbWFzaykgXAorCU1DX1JTUF9PUChjbWQsIDAsIDAsICAzMiwgdWludDMyX3QsIG1hc2spCisKKy8qICAgICAgICAgICAgICAgIGNtZCwgcGFyYW0sIG9mZnNldCwgd2lkdGgsIHR5cGUsIGFyZ19uYW1lICovCisjZGVmaW5lIERQTUNQX0NNRF9HRVRfSVJRX1NUQVRVUyhjbWQsIGlycV9pbmRleCkgXAorCU1DX0NNRF9PUChjbWQsIDAsIDMyLCA4LCAgdWludDhfdCwgIGlycV9pbmRleCkKKworLyogICAgICAgICAgICAgICAgY21kLCBwYXJhbSwgb2Zmc2V0LCB3aWR0aCwgdHlwZSwgYXJnX25hbWUgKi8KKyNkZWZpbmUgRFBNQ1BfUlNQX0dFVF9JUlFfU1RBVFVTKGNtZCwgc3RhdHVzKSBcCisJTUNfUlNQX09QKGNtZCwgMCwgMCwgIDMyLCB1aW50MzJfdCwgc3RhdHVzKQorCisvKiAgICAgICAgICAgICAgICBjbWQsIHBhcmFtLCBvZmZzZXQsIHdpZHRoLCB0eXBlLCBhcmdfbmFtZSAqLworI2RlZmluZSBEUE1DUF9DTURfQ0xFQVJfSVJRX1NUQVRVUyhjbWQsIGlycV9pbmRleCwgc3RhdHVzKSBcCitkbyB7IFwKKwlNQ19DTURfT1AoY21kLCAwLCAwLCAgMzIsIHVpbnQzMl90LCBzdGF0dXMpOyBcCisJTUNfQ01EX09QKGNtZCwgMCwgMzIsIDgsICB1aW50OF90LCAgaXJxX2luZGV4KTtcCit9IHdoaWxlICgwKQorCisvKiAgICAgICAgICAgICAgICBjbWQsIHBhcmFtLCBvZmZzZXQsIHdpZHRoLCB0eXBlLAlhcmdfbmFtZSAqLworI2RlZmluZSBEUE1DUF9SU1BfR0VUX0FUVFJJQlVURVMoY21kLCBhdHRyKSBcCitkbyB7IFwKKwlNQ19SU1BfT1AoY21kLCAwLCAzMiwgMzIsIGludCwJICAgIGF0dHItPmlkKTtcCisJTUNfUlNQX09QKGNtZCwgMSwgMCwgIDE2LCB1aW50MTZfdCwgYXR0ci0+dmVyc2lvbi5tYWpvcik7XAorCU1DX1JTUF9PUChjbWQsIDEsIDE2LCAxNiwgdWludDE2X3QsIGF0dHItPnZlcnNpb24ubWlub3IpO1wKK30gd2hpbGUgKDApCisKKyNlbmRpZiAvKiBfRlNMX0RQTUNQX0NNRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1jcC5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjlkYTViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AuYwpAQCAtMCwwICsxLDMwOCBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLXN5cy5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtY21kLmgiCisjaW5jbHVkZSAiZHBtY3AuaCIKKyNpbmNsdWRlICJkcG1jcC1jbWQuaCIKKworaW50IGRwbWNwX29wZW4oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIGludCBkcG1jcF9pZCwgdWludDE2X3QgKnRva2VuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfT1BFTiwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgMCk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIGRwbWNwX2lkKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSp0b2tlbiA9IE1DX0NNRF9IRFJfUkVBRF9UT0tFTihjbWQuaGVhZGVyKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBkcG1jcF9jbG9zZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfQ0xPU0UsIE1DX0NNRF9QUklfSElHSCwKKwkJCQkJICB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBtY3BfY3JlYXRlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgY29uc3Qgc3RydWN0IGRwbWNwX2NmZyAqY2ZnLAorCQl1aW50MTZfdCAqdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUE1DUF9DTURJRF9DUkVBVEUsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIDApOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBjZmctPnBvcnRhbF9pZCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqdG9rZW4gPSBNQ19DTURfSERSX1JFQURfVE9LRU4oY21kLmhlYWRlcik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRwbWNwX2Rlc3Ryb3koc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX0RFU1RST1ksCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcG1jcF9yZXNldChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfUkVTRVQsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcG1jcF9zZXRfaXJxKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgIHVpbnQxNl90IHRva2VuLAorCQkgdWludDhfdCBpcnFfaW5kZXgsCisJCSB1aW50NjRfdCBpcnFfYWRkciwKKwkJIHVpbnQzMl90IGlycV92YWwsCisJCSBpbnQgdXNlcl9pcnFfaWQpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfU0VUX0lSUSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDgsIGlycV9pbmRleCk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDMyLCBpcnFfdmFsKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygwLCA2NCwgaXJxX2FkZHIpOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDAsIDMyLCB1c2VyX2lycV9pZCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBtY3BfZ2V0X2lycShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICB1aW50MTZfdCB0b2tlbiwKKwkJIHVpbnQ4X3QgaXJxX2luZGV4LAorCQkgaW50ICp0eXBlLAorCQkgdWludDY0X3QgKmlycV9hZGRyLAorCQkgdWludDMyX3QgKmlycV92YWwsCisJCSBpbnQgKnVzZXJfaXJxX2lkKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfR0VUX0lSUSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKmlycV92YWwgPSAodWludDMyX3QpbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDMyKTsKKwkqaXJxX2FkZHIgPSAodWludDY0X3QpbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDAsIDY0KTsKKwkqdXNlcl9pcnFfaWQgPSAoaW50KW1jX2RlYyhjbWQucGFyYW1zWzJdLCAwLCAzMik7CisJKnR5cGUgPSAoaW50KW1jX2RlYyhjbWQucGFyYW1zWzJdLCAzMiwgMzIpOworCXJldHVybiAwOworfQorCitpbnQgZHBtY3Bfc2V0X2lycV9lbmFibGUoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgdWludDE2X3QgdG9rZW4sCisJCQl1aW50OF90IGlycV9pbmRleCwKKwkJCXVpbnQ4X3QgZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfU0VUX0lSUV9FTkFCTEUsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCA4LCBlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBtY3BfZ2V0X2lycV9lbmFibGUoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgdWludDE2X3QgdG9rZW4sCisJCQl1aW50OF90IGlycV9pbmRleCwKKwkJCXVpbnQ4X3QgKmVuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfR0VUX0lSUV9FTkFCTEUsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSplbiA9ICh1aW50OF90KW1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCA4KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRwbWNwX3NldF9pcnFfbWFzayhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICAgICAgIHVpbnQxNl90IHRva2VuLAorCQkgICAgICB1aW50OF90IGlycV9pbmRleCwKKwkJICAgICAgdWludDMyX3QgbWFzaykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUE1DUF9DTURJRF9TRVRfSVJRX01BU0ssCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgbWFzayk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBtY3BfZ2V0X2lycV9tYXNrKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgICAgICAgdWludDE2X3QgdG9rZW4sCisJCSAgICAgIHVpbnQ4X3QgaXJxX2luZGV4LAorCQkgICAgICB1aW50MzJfdCAqbWFzaykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX0dFVF9JUlFfTUFTSywKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKm1hc2sgPSAodWludDMyX3QpbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDMyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRwbWNwX2dldF9pcnFfc3RhdHVzKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJIHVpbnQxNl90IHRva2VuLAorCQkJdWludDhfdCBpcnFfaW5kZXgsCisJCQl1aW50MzJfdCAqc3RhdHVzKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNQ1BfQ01ESURfR0VUX0lSUV9TVEFUVVMsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSpzdGF0dXMgPSAodWludDMyX3QpbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDMyKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRwbWNwX2NsZWFyX2lycV9zdGF0dXMoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgICB1aW50MTZfdCB0b2tlbiwKKwkJCSAgdWludDhfdCBpcnFfaW5kZXgsCisJCQkgIHVpbnQzMl90IHN0YXR1cykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUE1DUF9DTURJRF9DTEVBUl9JUlFfU1RBVFVTLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIHN0YXR1cyk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHBtY3BfZ2V0X2F0dHJpYnV0ZXMoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgdWludDE2X3QgdG9rZW4sCisJCQlzdHJ1Y3QgZHBtY3BfYXR0ciAqYXR0cikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQTUNQX0NNRElEX0dFVF9BVFRSLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwlhdHRyLT5pZCA9IChpbnQpbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDMyLCAzMik7CisJYXR0ci0+dmVyc2lvbi5tYWpvciA9ICh1aW50MTZfdCltY19kZWMoY21kLnBhcmFtc1sxXSwgMCwgMTYpOworCWF0dHItPnZlcnNpb24ubWlub3IgPSAodWludDE2X3QpbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDE2LCAxNik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1jcC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTdjMjE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtY3AuaApAQCAtMCwwICsxLDMxMSBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX19GU0xfRFBNQ1BfSAorI2RlZmluZSBfX0ZTTF9EUE1DUF9ICisKKy8qIERhdGEgUGF0aCBNYW5hZ2VtZW50IENvbW1hbmQgUG9ydGFsIEFQSQorICogQ29udGFpbnMgaW5pdGlhbGl6YXRpb24gQVBJcyBhbmQgcnVudGltZSBjb250cm9sIEFQSXMgZm9yIERQTUNQCisgKi8KKworc3RydWN0IGZzbF9tY19pbzsKKworLyoqCisgKiBkcG1jcF9vcGVuKCkgLSBPcGVuIGEgY29udHJvbCBzZXNzaW9uIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAZHBtY3BfaWQ6CURQTUNQIHVuaXF1ZSBJRAorICogQHRva2VuOglSZXR1cm5lZCB0b2tlbjsgdXNlIGluIHN1YnNlcXVlbnQgQVBJIGNhbGxzCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBvcGVuIGEgY29udHJvbCBzZXNzaW9uIGZvciBhbgorICogYWxyZWFkeSBjcmVhdGVkIG9iamVjdDsgYW4gb2JqZWN0IG1heSBoYXZlIGJlZW4gZGVjbGFyZWQgaW4KKyAqIHRoZSBEUEwgb3IgYnkgY2FsbGluZyB0aGUgZHBtY3BfY3JlYXRlIGZ1bmN0aW9uLgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdW5pcXVlIGF1dGhlbnRpY2F0aW9uIHRva2VuLAorICogYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpYyBvYmplY3QgSUQgYW5kIHRoZSBzcGVjaWZpYyBNQworICogcG9ydGFsOyB0aGlzIHRva2VuIG11c3QgYmUgdXNlZCBpbiBhbGwgc3Vic2VxdWVudCBjb21tYW5kcyBmb3IKKyAqIHRoaXMgc3BlY2lmaWMgb2JqZWN0CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9vcGVuKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCBpbnQgZHBtY3BfaWQsIHVpbnQxNl90ICp0b2tlbik7CisKKy8qIEdldCBwb3J0YWwgSUQgZnJvbSBwb29sICovCisjZGVmaW5lIERQTUNQX0dFVF9QT1JUQUxfSURfRlJPTV9QT09MICgtMSkKKworLyoqCisgKiBkcG1jcF9jbG9zZSgpIC0gQ2xvc2UgdGhlIGNvbnRyb2wgc2Vzc2lvbiBvZiB0aGUgb2JqZWN0CisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUE1DUCBvYmplY3QKKyAqCisgKiBBZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgbm8gZnVydGhlciBvcGVyYXRpb25zIGFyZQorICogYWxsb3dlZCBvbiB0aGUgb2JqZWN0IHdpdGhvdXQgb3BlbmluZyBhIG5ldyBjb250cm9sIHNlc3Npb24uCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9jbG9zZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pOworCisvKioKKyAqIHN0cnVjdCBkcG1jcF9jZmcoKSAtIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgRFBNQ1AgY29uZmlndXJhdGlvbgorICogQHBvcnRhbF9pZDoJUG9ydGFsIElEOyAnRFBNQ1BfR0VUX1BPUlRBTF9JRF9GUk9NX1BPT0wnIHRvIGdldCB0aGUgcG9ydGFsIElECisgKgkJZnJvbSBwb29sCisgKi8KK3N0cnVjdCBkcG1jcF9jZmcgeworCWludCBwb3J0YWxfaWQ7Cit9OworCisvKioKKyAqIGRwbWNwX2NyZWF0ZSgpIC0gQ3JlYXRlIHRoZSBEUE1DUCBvYmplY3QuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQGNmZzoJQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIEB0b2tlbjoJUmV0dXJuZWQgdG9rZW47IHVzZSBpbiBzdWJzZXF1ZW50IEFQSSBjYWxscworICoKKyAqIENyZWF0ZSB0aGUgRFBNQ1Agb2JqZWN0LCBhbGxvY2F0ZSByZXF1aXJlZCByZXNvdXJjZXMgYW5kCisgKiBwZXJmb3JtIHJlcXVpcmVkIGluaXRpYWxpemF0aW9uLgorICoKKyAqIFRoZSBvYmplY3QgY2FuIGJlIGNyZWF0ZWQgZWl0aGVyIGJ5IGRlY2xhcmluZyBpdCBpbiB0aGUKKyAqIERQTCBmaWxlLCBvciBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB1bmlxdWUgYXV0aGVudGljYXRpb24gdG9rZW4sCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmljIG9iamVjdCBJRCBhbmQgdGhlIHNwZWNpZmljIE1DCisgKiBwb3J0YWw7IHRoaXMgdG9rZW4gbXVzdCBiZSB1c2VkIGluIGFsbCBzdWJzZXF1ZW50IGNhbGxzIHRvCisgKiB0aGlzIHNwZWNpZmljIG9iamVjdC4gRm9yIG9iamVjdHMgdGhhdCBhcmUgY3JlYXRlZCB1c2luZyB0aGUKKyAqIERQTCBmaWxlLCBjYWxsIGRwbWNwX29wZW4gZnVuY3Rpb24gdG8gZ2V0IGFuIGF1dGhlbnRpY2F0aW9uCisgKiB0b2tlbiBmaXJzdC4KKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwbWNwX2NyZWF0ZShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJIGNvbnN0IHN0cnVjdCBkcG1jcF9jZmcJKmNmZywKKwkJdWludDE2X3QJCSp0b2tlbik7CisKKy8qKgorICogZHBtY3BfZGVzdHJveSgpIC0gRGVzdHJveSB0aGUgRFBNQ1Agb2JqZWN0IGFuZCByZWxlYXNlIGFsbCBpdHMgcmVzb3VyY2VzLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBNQ1Agb2JqZWN0CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9kZXN0cm95KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbik7CisKKy8qKgorICogZHBtY3BfcmVzZXQoKSAtIFJlc2V0IHRoZSBEUE1DUCwgcmV0dXJucyB0aGUgb2JqZWN0IHRvIGluaXRpYWwgc3RhdGUuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUE1DUCBvYmplY3QKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwbWNwX3Jlc2V0KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbik7CisKKy8qIElSUSAqLworLyohCisgKiBAbmFtZSBkcG1jcCBJUlEgSW5kZXggYW5kIEV2ZW50cworICovCisjZGVmaW5lIERQTUNQX0lSUV9JTkRFWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorLyohPCBJcnEgaW5kZXggKi8KKyNkZWZpbmUgRFBNQ1BfSVJRX0VWRU5UX0NNRF9ET05FICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisvKiE8IGlycSBldmVudCAtIEluZGljYXRlcyB0aGF0IHRoZSBsaW5rIHN0YXRlIGNoYW5nZWQgKi8KKy8qIEB9ICovCisKKy8qKgorICogZHBtY3Bfc2V0X2lycSgpIC0gU2V0IElSUSBpbmZvcm1hdGlvbiBmb3IgdGhlIERQTUNQIHRvIHRyaWdnZXIgYW4gaW50ZXJydXB0LgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBNQ1Agb2JqZWN0CisgKiBAaXJxX2luZGV4OglJZGVudGlmaWVzIHRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAaXJxX2FkZHI6CUFkZHJlc3MgdGhhdCBtdXN0IGJlIHdyaXR0ZW4gdG8KKyAqCQkJCXNpZ25hbCBhIG1lc3NhZ2UtYmFzZWQgaW50ZXJydXB0CisgKiBAaXJxX3ZhbDoJVmFsdWUgdG8gd3JpdGUgaW50byBpcnFfYWRkciBhZGRyZXNzCisgKiBAdXNlcl9pcnFfaWQ6IEEgdXNlciBkZWZpbmVkIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBJUlEKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwbWNwX3NldF9pcnEoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSAgdWludDE2X3QJCXRva2VuLAorCQkgdWludDhfdAkJaXJxX2luZGV4LAorCQkgdWludDY0X3QJCWlycV9hZGRyLAorCQkgdWludDMyX3QJCWlycV92YWwsCisJCSBpbnQJCQl1c2VyX2lycV9pZCk7CisKKy8qKgorICogZHBtY3BfZ2V0X2lycSgpIC0gR2V0IElSUSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBEUE1DUC4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQTUNQIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEB0eXBlOglJbnRlcnJ1cHQgdHlwZTogMCByZXByZXNlbnRzIG1lc3NhZ2UgaW50ZXJydXB0CisgKgkJCQl0eXBlIChib3RoIGlycV9hZGRyIGFuZCBpcnFfdmFsIGFyZSB2YWxpZCkKKyAqIEBpcnFfYWRkcjoJUmV0dXJuZWQgYWRkcmVzcyB0aGF0IG11c3QgYmUgd3JpdHRlbiB0bworICoJCQkJc2lnbmFsIHRoZSBtZXNzYWdlLWJhc2VkIGludGVycnVwdAorICogQGlycV92YWw6CVZhbHVlIHRvIHdyaXRlIGludG8gaXJxX2FkZHIgYWRkcmVzcworICogQHVzZXJfaXJxX2lkOiBBIHVzZXIgZGVmaW5lZCBudW1iZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSVJRCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9nZXRfaXJxKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkgIHVpbnQxNl90CQl0b2tlbiwKKwkJIHVpbnQ4X3QJCWlycV9pbmRleCwKKwkJIGludAkJCSp0eXBlLAorCQkgdWludDY0X3QJCSppcnFfYWRkciwKKwkJIHVpbnQzMl90CQkqaXJxX3ZhbCwKKwkJIGludAkJCSp1c2VyX2lycV9pZCk7CisKKy8qKgorICogZHBtY3Bfc2V0X2lycV9lbmFibGUoKSAtIFNldCBvdmVyYWxsIGludGVycnVwdCBzdGF0ZS4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQTUNQIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBlbjoJSW50ZXJydXB0IHN0YXRlIC0gZW5hYmxlID0gMSwgZGlzYWJsZSA9IDAKKyAqCisgKiBBbGxvd3MgR1BQIHNvZnR3YXJlIHRvIGNvbnRyb2wgd2hlbiBpbnRlcnJ1cHRzIGFyZSBnZW5lcmF0ZWQuCisgKiBFYWNoIGludGVycnVwdCBjYW4gaGF2ZSB1cCB0byAzMiBjYXVzZXMuICBUaGUgZW5hYmxlL2Rpc2FibGUgY29udHJvbCdzIHRoZQorICogb3ZlcmFsbCBpbnRlcnJ1cHQgc3RhdGUuIGlmIHRoZSBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQgbm8gY2F1c2VzIHdpbGwgY2F1c2UKKyAqIGFuIGludGVycnVwdC4KKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwbWNwX3NldF9pcnFfZW5hYmxlKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJIHVpbnQxNl90CQl0b2tlbiwKKwkJCXVpbnQ4X3QJCQlpcnFfaW5kZXgsCisJCQl1aW50OF90CQkJZW4pOworCisvKioKKyAqIGRwbWNwX2dldF9pcnFfZW5hYmxlKCkgLSBHZXQgb3ZlcmFsbCBpbnRlcnJ1cHQgc3RhdGUKKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQTUNQIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBlbjoJCVJldHVybmVkIGludGVycnVwdCBzdGF0ZSAtIGVuYWJsZSA9IDEsIGRpc2FibGUgPSAwCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9nZXRfaXJxX2VuYWJsZShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCSB1aW50MTZfdAkJdG9rZW4sCisJCQl1aW50OF90CQkJaXJxX2luZGV4LAorCQkJdWludDhfdAkJCSplbik7CisKKy8qKgorICogZHBtY3Bfc2V0X2lycV9tYXNrKCkgLSBTZXQgaW50ZXJydXB0IG1hc2suCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUE1DUCBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAbWFzazoJRXZlbnQgbWFzayB0byB0cmlnZ2VyIGludGVycnVwdDsKKyAqCQkJZWFjaCBiaXQ6CisgKgkJCQkwID0gaWdub3JlIGV2ZW50CisgKgkJCQkxID0gY29uc2lkZXIgZXZlbnQgZm9yIGFzc2VydGluZyBJUlEKKyAqCisgKiBFdmVyeSBpbnRlcnJ1cHQgY2FuIGhhdmUgdXAgdG8gMzIgY2F1c2VzIGFuZCB0aGUgaW50ZXJydXB0IG1vZGVsIHN1cHBvcnRzCisgKiBtYXNraW5nL3VubWFza2luZyBlYWNoIGNhdXNlIGluZGVwZW5kZW50bHkKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwbWNwX3NldF9pcnFfbWFzayhzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJICAgICAgIHVpbnQxNl90CQl0b2tlbiwKKwkJICAgICAgdWludDhfdAkJaXJxX2luZGV4LAorCQkgICAgICB1aW50MzJfdAkJbWFzayk7CisKKy8qKgorICogZHBtY3BfZ2V0X2lycV9tYXNrKCkgLSBHZXQgaW50ZXJydXB0IG1hc2suCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUE1DUCBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAbWFzazoJUmV0dXJuZWQgZXZlbnQgbWFzayB0byB0cmlnZ2VyIGludGVycnVwdAorICoKKyAqIEV2ZXJ5IGludGVycnVwdCBjYW4gaGF2ZSB1cCB0byAzMiBjYXVzZXMgYW5kIHRoZSBpbnRlcnJ1cHQgbW9kZWwgc3VwcG9ydHMKKyAqIG1hc2tpbmcvdW5tYXNraW5nIGVhY2ggY2F1c2UgaW5kZXBlbmRlbnRseQorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBtY3BfZ2V0X2lycV9tYXNrKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkgICAgICAgdWludDE2X3QJCXRva2VuLAorCQkgICAgICB1aW50OF90CQlpcnFfaW5kZXgsCisJCSAgICAgIHVpbnQzMl90CQkqbWFzayk7CisKKy8qKgorICogZHBtY3BfZ2V0X2lycV9zdGF0dXMoKSAtIEdldCB0aGUgY3VycmVudCBzdGF0dXMgb2YgYW55IHBlbmRpbmcgaW50ZXJydXB0cy4KKyAqCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUE1DUCBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAc3RhdHVzOglSZXR1cm5lZCBpbnRlcnJ1cHRzIHN0YXR1cyAtIG9uZSBiaXQgcGVyIGNhdXNlOgorICoJCQkwID0gbm8gaW50ZXJydXB0IHBlbmRpbmcKKyAqCQkJMSA9IGludGVycnVwdCBwZW5kaW5nCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9nZXRfaXJxX3N0YXR1cyhzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCSB1aW50MTZfdAkJdG9rZW4sCisJCQl1aW50OF90CQkJaXJxX2luZGV4LAorCQkJdWludDMyX3QJCSpzdGF0dXMpOworCisvKioKKyAqIGRwbWNwX2NsZWFyX2lycV9zdGF0dXMoKSAtIENsZWFyIGEgcGVuZGluZyBpbnRlcnJ1cHQncyBzdGF0dXMKKyAqCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUE1DUCBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAc3RhdHVzOglCaXRzIHRvIGNsZWFyIChXMUMpIC0gb25lIGJpdCBwZXIgY2F1c2U6CisgKgkJCQkJMCA9IGRvbid0IGNoYW5nZQorICoJCQkJCTEgPSBjbGVhciBzdGF0dXMgYml0CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcG1jcF9jbGVhcl9pcnFfc3RhdHVzKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJICAgdWludDE2X3QJCXRva2VuLAorCQkJICB1aW50OF90CQlpcnFfaW5kZXgsCisJCQkgIHVpbnQzMl90CQlzdGF0dXMpOworCisvKioKKyAqIHN0cnVjdCBkcG1jcF9hdHRyIC0gU3RydWN0dXJlIHJlcHJlc2VudGluZyBEUE1DUCBhdHRyaWJ1dGVzCisgKiBAaWQ6CQlEUE1DUCBvYmplY3QgSUQKKyAqIEB2ZXJzaW9uOglEUE1DUCB2ZXJzaW9uCisgKi8KK3N0cnVjdCBkcG1jcF9hdHRyIHsKKwlpbnQgaWQ7CisJLyoqCisJICogc3RydWN0IHZlcnNpb24gLSBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIERQTUNQIHZlcnNpb24KKwkgKiBAbWFqb3I6CURQTUNQIG1ham9yIHZlcnNpb24KKwkgKiBAbWlub3I6CURQTUNQIG1pbm9yIHZlcnNpb24KKwkgKi8KKwlzdHJ1Y3QgeworCQl1aW50MTZfdCBtYWpvcjsKKwkJdWludDE2X3QgbWlub3I7CisJfSB2ZXJzaW9uOworfTsKKworLyoqCisgKiBkcG1jcF9nZXRfYXR0cmlidXRlcyAtIFJldHJpZXZlIERQTUNQIGF0dHJpYnV0ZXMuCisgKgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBNQ1Agb2JqZWN0CisgKiBAYXR0cjoJUmV0dXJuZWQgb2JqZWN0J3MgYXR0cmlidXRlcworICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBtY3BfZ2V0X2F0dHJpYnV0ZXMoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQkgdWludDE2X3QJCXRva2VuLAorCQkJc3RydWN0IGRwbWNwX2F0dHIJKmF0dHIpOworCisjZW5kaWYgLyogX19GU0xfRFBNQ1BfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtbmctY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1uZy1jbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYThjZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHBtbmctY21kLmgKQEAgLTAsMCArMSw0NyBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoKKyBkcG1uZy1jbWQuaAorCisgZGVmaW5lcyBwb3J0YWwgY29tbWFuZHMKKworICovLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9fRlNMX0RQTU5HX0NNRF9ICisjZGVmaW5lIF9fRlNMX0RQTU5HX0NNRF9ICisKKy8qIENvbW1hbmQgSURzICovCisjZGVmaW5lIERQTU5HX0NNRElEX0dFVF9DT05UX0lECQkJMHg4MzAKKyNkZWZpbmUgRFBNTkdfQ01ESURfR0VUX1ZFUlNJT04JCQkweDgzMQorCisjZW5kaWYgLyogX19GU0xfRFBNTkdfQ01EX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwbW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1uZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MzI4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcG1uZy5jCkBAIC0wLDAgKzEsNzggQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQorKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyoKKyogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorKiBsYXRlciB2ZXJzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWNtZC5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZHBtbmcuaCIKKyNpbmNsdWRlICJkcG1uZy1jbWQuaCIKKworaW50IG1jX2dldF92ZXJzaW9uKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCBzdHJ1Y3QgbWNfdmVyc2lvbiAqbWNfdmVyX2luZm8pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUE1OR19DTURJRF9HRVRfVkVSU0lPTiwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgMCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwltY192ZXJfaW5mby0+cmV2aXNpb24gPSBtY19kZWMoY21kLnBhcmFtc1swXSwgMCwgMzIpOworCW1jX3Zlcl9pbmZvLT5tYWpvciA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCAzMiwgMzIpOworCW1jX3Zlcl9pbmZvLT5taW5vciA9IG1jX2RlYyhjbWQucGFyYW1zWzFdLCAwLCAzMik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRwbW5nX2dldF9jb250YWluZXJfaWQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIGludCAqY29udGFpbmVyX2lkKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBNTkdfQ01ESURfR0VUX0NPTlRfSUQsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIDApOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKmNvbnRhaW5lcl9pZCA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCAzMik7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy1jbWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMtY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyMDI0OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMtY21kLmgKQEAgLTAsMCArMSw4NCBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoKKyBkcHJjLWNtZC5oCisKKyBkZWZpbmVzIGRwcmMgcG9ydGFsIGNvbW1hbmRzCisKKyAqLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfRlNMX0RQUkNfQ01EX0gKKyNkZWZpbmUgX0ZTTF9EUFJDX0NNRF9ICisKKy8qIERQUkMgVmVyc2lvbiAqLworI2RlZmluZSBEUFJDX1ZFUl9NQUpPUgkJCQkzCisjZGVmaW5lIERQUkNfVkVSX01JTk9SCQkJCTAKKworLyogQ29tbWFuZCBJRHMgKi8KKyNkZWZpbmUgRFBSQ19DTURJRF9DTE9TRQkJCTB4ODAwCisjZGVmaW5lIERQUkNfQ01ESURfT1BFTgkJCQkweDgwNQorI2RlZmluZSBEUFJDX0NNRElEX0NSRUFURQkJCTB4OTA1CisKKyNkZWZpbmUgRFBSQ19DTURJRF9HRVRfQVRUUgkJCTB4MDA0CisjZGVmaW5lIERQUkNfQ01ESURfUkVTRVRfQ09OVAkJCTB4MDA1CisKKyNkZWZpbmUgRFBSQ19DTURJRF9TRVRfSVJRCQkJMHgwMTAKKyNkZWZpbmUgRFBSQ19DTURJRF9HRVRfSVJRCQkJMHgwMTEKKyNkZWZpbmUgRFBSQ19DTURJRF9TRVRfSVJRX0VOQUJMRQkJMHgwMTIKKyNkZWZpbmUgRFBSQ19DTURJRF9HRVRfSVJRX0VOQUJMRQkJMHgwMTMKKyNkZWZpbmUgRFBSQ19DTURJRF9TRVRfSVJRX01BU0sJCQkweDAxNAorI2RlZmluZSBEUFJDX0NNRElEX0dFVF9JUlFfTUFTSwkJCTB4MDE1CisjZGVmaW5lIERQUkNfQ01ESURfR0VUX0lSUV9TVEFUVVMJCTB4MDE2CisjZGVmaW5lIERQUkNfQ01ESURfQ0xFQVJfSVJRX1NUQVRVUwkJMHgwMTcKKworI2RlZmluZSBEUFJDX0NNRElEX0NSRUFURV9DT05UCQkJMHgxNTEKKyNkZWZpbmUgRFBSQ19DTURJRF9ERVNUUk9ZX0NPTlQJCQkweDE1MgorI2RlZmluZSBEUFJDX0NNRElEX1NFVF9SRVNfUVVPVEEJCTB4MTU1CisjZGVmaW5lIERQUkNfQ01ESURfR0VUX1JFU19RVU9UQQkJMHgxNTYKKyNkZWZpbmUgRFBSQ19DTURJRF9BU1NJR04JCQkweDE1NworI2RlZmluZSBEUFJDX0NNRElEX1VOQVNTSUdOCQkJMHgxNTgKKyNkZWZpbmUgRFBSQ19DTURJRF9HRVRfT0JKX0NPVU5UCQkweDE1OQorI2RlZmluZSBEUFJDX0NNRElEX0dFVF9PQkoJCQkweDE1QQorI2RlZmluZSBEUFJDX0NNRElEX0dFVF9SRVNfQ09VTlQJCTB4MTVCCisjZGVmaW5lIERQUkNfQ01ESURfR0VUX1JFU19JRFMJCQkweDE1QworI2RlZmluZSBEUFJDX0NNRElEX0dFVF9PQkpfUkVHCQkJMHgxNUUKKworI2RlZmluZSBEUFJDX0NNRElEX0NPTk5FQ1QJCQkweDE2NworI2RlZmluZSBEUFJDX0NNRElEX0RJU0NPTk5FQ1QJCQkweDE2OAorI2RlZmluZSBEUFJDX0NNRElEX0dFVF9QT09MCQkJMHgxNjkKKyNkZWZpbmUgRFBSQ19DTURJRF9HRVRfUE9PTF9DT1VOVAkJMHgxNkEKKyNkZWZpbmUgRFBSQ19DTURJRF9HRVRfUE9SVEFMX1BBRERSCQkweDE2QgorCisjZGVmaW5lIERQUkNfQ01ESURfR0VUX0NPTk5FQ1RJT04JCTB4MTZDCisKKyNlbmRpZiAvKiBfRlNMX0RQUkNfQ01EX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMtZHJpdmVyLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLWRyaXZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YzA2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9kcHJjLWRyaXZlci5jCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogRnJlZXNjYWxlIGRhdGEgcGF0aCByZXNvdXJjZSBjb250YWluZXIgKERQUkMpIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQXV0aG9yOiBHZXJtYW4gUml2ZXJhIDxHZXJtYW4uUml2ZXJhQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1wcml2YXRlLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSAiZHByYy1jbWQuaCIKKworc3RydWN0IGRwcmNfY2hpbGRfb2JqcyB7CisJaW50IGNoaWxkX2NvdW50OworCXN0cnVjdCBkcHJjX29ial9kZXNjICpjaGlsZF9hcnJheTsKK307CisKK3N0YXRpYyBpbnQgX19mc2xfbWNfZGV2aWNlX3JlbW92ZV9pZl9ub3RfaW5fbWMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCWludCBpOworCXN0cnVjdCBkcHJjX2NoaWxkX29ianMgKm9ianM7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldjsKKworCVdBUk5fT04oIWRldik7CisJV0FSTl9PTighZGF0YSk7CisJbWNfZGV2ID0gdG9fZnNsX21jX2RldmljZShkZXYpOworCW9ianMgPSBkYXRhOworCisJZm9yIChpID0gMDsgaSA8IG9ianMtPmNoaWxkX2NvdW50OyBpKyspIHsKKwkJc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjID0gJm9ianMtPmNoaWxkX2FycmF5W2ldOworCisJCWlmIChzdHJsZW4ob2JqX2Rlc2MtPnR5cGUpICE9IDAgJiYKKwkJICAgIEZTTF9NQ19ERVZJQ0VfTUFUQ0gobWNfZGV2LCBvYmpfZGVzYykpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBvYmpzLT5jaGlsZF9jb3VudCkKKwkJZnNsX21jX2RldmljZV9yZW1vdmUobWNfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZnNsX21jX2RldmljZV9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCVdBUk5fT04oIWRldik7CisJV0FSTl9PTihkYXRhKTsKKwlmc2xfbWNfZGV2aWNlX3JlbW92ZSh0b19mc2xfbWNfZGV2aWNlKGRldikpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGRwcmNfcmVtb3ZlX2RldmljZXMgLSBSZW1vdmVzIGRldmljZXMgZm9yIG9iamVjdHMgcmVtb3ZlZCBmcm9tIGEgRFBSQworICoKKyAqIEBtY19idXNfZGV2OiBwb2ludGVyIHRvIHRoZSBmc2wtbWMgZGV2aWNlIHRoYXQgcmVwcmVzZW50cyBhIERQUkMgb2JqZWN0CisgKiBAb2JqX2Rlc2NfYXJyYXk6IGFycmF5IG9mIG9iamVjdCBkZXNjcmlwdG9ycyBmb3IgY2hpbGQgb2JqZWN0cyBjdXJyZW50bHkKKyAqIHByZXNlbnQgaW4gdGhlIERQUkMgaW4gdGhlIE1DLgorICogQG51bV9jaGlsZF9vYmplY3RzX2luX21jOiBudW1iZXIgb2YgZW50cmllcyBpbiBvYmpfZGVzY19hcnJheQorICoKKyAqIFN5bmNocm9uaXplcyB0aGUgc3RhdGUgb2YgdGhlIExpbnV4IGJ1cyBkcml2ZXIgd2l0aCB0aGUgYWN0dWFsIHN0YXRlIG9mCisgKiB0aGUgTUMgYnkgcmVtb3ZpbmcgZGV2aWNlcyB0aGF0IHJlcHJlc2VudCBNQyBvYmplY3RzIHRoYXQgaGF2ZQorICogYmVlbiBkeW5hbWljYWxseSByZW1vdmVkIGluIHRoZSBwaHlzaWNhbCBEUFJDLgorICovCitzdGF0aWMgdm9pZCBkcHJjX3JlbW92ZV9kZXZpY2VzKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2LAorCQkJCXN0cnVjdCBkcHJjX29ial9kZXNjICpvYmpfZGVzY19hcnJheSwKKwkJCQlpbnQgbnVtX2NoaWxkX29iamVjdHNfaW5fbWMpCit7CisJaWYgKG51bV9jaGlsZF9vYmplY3RzX2luX21jICE9IDApIHsKKwkJLyoKKwkJICogUmVtb3ZlIGNoaWxkIG9iamVjdHMgdGhhdCBhcmUgaW4gdGhlIERQUkMgaW4gTGludXgsCisJCSAqIGJ1dCBub3QgaW4gdGhlIE1DOgorCQkgKi8KKwkJc3RydWN0IGRwcmNfY2hpbGRfb2JqcyBvYmpzOworCisJCW9ianMuY2hpbGRfY291bnQgPSBudW1fY2hpbGRfb2JqZWN0c19pbl9tYzsKKwkJb2Jqcy5jaGlsZF9hcnJheSA9IG9ial9kZXNjX2FycmF5OworCQlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJm1jX2J1c19kZXYtPmRldiwgJm9ianMsCisJCQkJICAgICAgX19mc2xfbWNfZGV2aWNlX3JlbW92ZV9pZl9ub3RfaW5fbWMpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRoZXJlIGFyZSBubyBjaGlsZCBvYmplY3RzIGZvciB0aGlzIERQUkMgaW4gdGhlIE1DLgorCQkgKiBTbywgcmVtb3ZlIGFsbCB0aGUgY2hpbGQgZGV2aWNlcyBmcm9tIExpbnV4OgorCQkgKi8KKwkJZGV2aWNlX2Zvcl9lYWNoX2NoaWxkKCZtY19idXNfZGV2LT5kZXYsIE5VTEwsCisJCQkJICAgICAgX19mc2xfbWNfZGV2aWNlX3JlbW92ZSk7CisJfQorfQorCitzdGF0aWMgaW50IF9fZnNsX21jX2RldmljZV9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjID0gZGF0YTsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gdG9fZnNsX21jX2RldmljZShkZXYpOworCisJcmV0dXJuIEZTTF9NQ19ERVZJQ0VfTUFUQ0gobWNfZGV2LCBvYmpfZGVzYyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX21jX2RldmljZSAqZnNsX21jX2RldmljZV9sb29rdXAoc3RydWN0IGRwcmNfb2JqX2Rlc2MKKwkJCQkJCQkJKm9ial9kZXNjLAorCQkJCQkJICBzdHJ1Y3QgZnNsX21jX2RldmljZQorCQkJCQkJCQkqbWNfYnVzX2RldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlkZXYgPSBkZXZpY2VfZmluZF9jaGlsZCgmbWNfYnVzX2Rldi0+ZGV2LCBvYmpfZGVzYywKKwkJCQlfX2ZzbF9tY19kZXZpY2VfbWF0Y2gpOworCisJcmV0dXJuIGRldiA/IHRvX2ZzbF9tY19kZXZpY2UoZGV2KSA6IE5VTEw7Cit9CisKKy8qKgorICogY2hlY2tfcGx1Z2dlZF9zdGF0ZV9jaGFuZ2UgLSBDaGVjayBjaGFuZ2UgaW4gYW4gTUMgb2JqZWN0J3MgcGx1Z2dlZCBzdGF0ZQorICoKKyAqIEBtY19kZXY6IHBvaW50ZXIgdG8gdGhlIGZzbC1tYyBkZXZpY2UgZm9yIGEgZ2l2ZW4gTUMgb2JqZWN0CisgKiBAb2JqX2Rlc2M6IHBvaW50ZXIgdG8gdGhlIE1DIG9iamVjdCdzIGRlc2NyaXB0b3IgaW4gdGhlIE1DCisgKgorICogSWYgdGhlIHBsdWdnZWQgc3RhdGUgaGFzIGNoYW5nZWQgZnJvbSB1bnBsdWdnZWQgdG8gcGx1Z2dlZCwgdGhlIGZzbC1tYworICogZGV2aWNlIGlzIGJvdW5kIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBkcml2ZXIuCisgKiBJZiB0aGUgcGx1Z2dlZCBzdGF0ZSBoYXMgY2hhbmdlZCBmcm9tIHBsdWdnZWQgdG8gdW5wbHVnZ2VkLCB0aGUgZnNsLW1jCisgKiBkZXZpY2UgaXMgdW5ib3VuZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBkcml2ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX3BsdWdnZWRfc3RhdGVfY2hhbmdlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCisJCQkJICAgICAgIHN0cnVjdCBkcHJjX29ial9kZXNjICpvYmpfZGVzYykKK3sKKwlpbnQgZXJyb3I7CisJdWludDMyX3QgcGx1Z2dlZF9mbGFnX2F0X21jID0KKwkJCShvYmpfZGVzYy0+c3RhdGUgJiBEUFJDX09CSl9TVEFURV9QTFVHR0VEKTsKKworCWlmIChwbHVnZ2VkX2ZsYWdfYXRfbWMgIT0KKwkgICAgKG1jX2Rldi0+b2JqX2Rlc2Muc3RhdGUgJiBEUFJDX09CSl9TVEFURV9QTFVHR0VEKSkgeworCQlpZiAocGx1Z2dlZF9mbGFnX2F0X21jKSB7CisJCQltY19kZXYtPm9ial9kZXNjLnN0YXRlIHw9IERQUkNfT0JKX1NUQVRFX1BMVUdHRUQ7CisJCQllcnJvciA9IGRldmljZV9hdHRhY2goJm1jX2Rldi0+ZGV2KTsKKwkJCWlmIChlcnJvciA8IDApIHsKKwkJCQlkZXZfZXJyKCZtY19kZXYtPmRldiwKKwkJCQkJImRldmljZV9hdHRhY2goKSBmYWlsZWQ6ICVkXG4iLAorCQkJCQllcnJvcik7CisJCQl9CisJCX0gZWxzZSB7CisJCQltY19kZXYtPm9ial9kZXNjLnN0YXRlICY9IH5EUFJDX09CSl9TVEFURV9QTFVHR0VEOworCQkJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKCZtY19kZXYtPmRldik7CisJCX0KKwl9Cit9CisKKy8qKgorICogZHByY19hZGRfbmV3X2RldmljZXMgLSBBZGRzIGRldmljZXMgdG8gdGhlIGxvZ2ljYWwgYnVzIGZvciBhIERQUkMKKyAqCisgKiBAbWNfYnVzX2RldjogcG9pbnRlciB0byB0aGUgZnNsLW1jIGRldmljZSB0aGF0IHJlcHJlc2VudHMgYSBEUFJDIG9iamVjdAorICogQG9ial9kZXNjX2FycmF5OiBhcnJheSBvZiBkZXZpY2UgZGVzY3JpcHRvcnMgZm9yIGNoaWxkIGRldmljZXMgY3VycmVudGx5CisgKiBwcmVzZW50IGluIHRoZSBwaHlzaWNhbCBEUFJDLgorICogQG51bV9jaGlsZF9vYmplY3RzX2luX21jOiBudW1iZXIgb2YgZW50cmllcyBpbiBvYmpfZGVzY19hcnJheQorICoKKyAqIFN5bmNocm9uaXplcyB0aGUgc3RhdGUgb2YgdGhlIExpbnV4IGJ1cyBkcml2ZXIgd2l0aCB0aGUgYWN0dWFsCisgKiBzdGF0ZSBvZiB0aGUgTUMgYnkgYWRkaW5nIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gbmV3bHkgZGlzY292ZXJlZAorICogaW4gdGhlIHBoeXNpY2FsIERQUkMuCisgKi8KK3N0YXRpYyB2b2lkIGRwcmNfYWRkX25ld19kZXZpY2VzKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2LAorCQkJCSBzdHJ1Y3QgZHByY19vYmpfZGVzYyAqb2JqX2Rlc2NfYXJyYXksCisJCQkJIGludCBudW1fY2hpbGRfb2JqZWN0c19pbl9tYykKK3sKKwlpbnQgZXJyb3I7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoaWxkX29iamVjdHNfaW5fbWM7IGkrKykgeworCQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqY2hpbGRfZGV2OworCQlzdHJ1Y3QgZHByY19vYmpfZGVzYyAqb2JqX2Rlc2MgPSAmb2JqX2Rlc2NfYXJyYXlbaV07CisKKwkJaWYgKHN0cmxlbihvYmpfZGVzYy0+dHlwZSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIENoZWNrIGlmIGRldmljZSBpcyBhbHJlYWR5IGtub3duIHRvIExpbnV4OgorCQkgKi8KKwkJY2hpbGRfZGV2ID0gZnNsX21jX2RldmljZV9sb29rdXAob2JqX2Rlc2MsIG1jX2J1c19kZXYpOworCQlpZiAoY2hpbGRfZGV2KSB7CisJCQljaGVja19wbHVnZ2VkX3N0YXRlX2NoYW5nZShjaGlsZF9kZXYsIG9ial9kZXNjKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZXJyb3IgPSBmc2xfbWNfZGV2aWNlX2FkZChvYmpfZGVzYywgTlVMTCwgJm1jX2J1c19kZXYtPmRldiwKKwkJCQkJICAmY2hpbGRfZGV2KTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCWNvbnRpbnVlOworCX0KK30KKworc3RhdGljIHZvaWQgZHByY19pbml0X2FsbF9yZXNvdXJjZV9wb29scyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldikKK3sKKwlpbnQgcG9vbF90eXBlOworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2J1c19kZXYpOworCisJZm9yIChwb29sX3R5cGUgPSAwOyBwb29sX3R5cGUgPCBGU0xfTUNfTlVNX1BPT0xfVFlQRVM7IHBvb2xfdHlwZSsrKSB7CisJCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2wgPQorCQkgICAgJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbcG9vbF90eXBlXTsKKworCQlyZXNfcG9vbC0+dHlwZSA9IHBvb2xfdHlwZTsKKwkJcmVzX3Bvb2wtPm1heF9jb3VudCA9IDA7CisJCXJlc19wb29sLT5mcmVlX2NvdW50ID0gMDsKKwkJcmVzX3Bvb2wtPm1jX2J1cyA9IG1jX2J1czsKKwkJSU5JVF9MSVNUX0hFQUQoJnJlc19wb29sLT5mcmVlX2xpc3QpOworCQltdXRleF9pbml0KCZyZXNfcG9vbC0+bXV0ZXgpOworCX0KK30KKworc3RhdGljIHZvaWQgZHByY19jbGVhbnVwX3Jlc291cmNlX3Bvb2woc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYsCisJCQkJICAgICAgIGVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGUpCit7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqbmV4dDsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnJlc19wb29sID0KKwkJCQkJJm1jX2J1cy0+cmVzb3VyY2VfcG9vbHNbcG9vbF90eXBlXTsKKwlpbnQgZnJlZV9jb3VudCA9IDA7CisKKwlXQVJOX09OKHJlc19wb29sLT50eXBlICE9IHBvb2xfdHlwZSk7CisJV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCAhPSByZXNfcG9vbC0+bWF4X2NvdW50KTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyZXNvdXJjZSwgbmV4dCwgJnJlc19wb29sLT5mcmVlX2xpc3QsIG5vZGUpIHsKKwkJZnJlZV9jb3VudCsrOworCQlXQVJOX09OKHJlc291cmNlLT50eXBlICE9IHJlc19wb29sLT50eXBlKTsKKwkJV0FSTl9PTihyZXNvdXJjZS0+cGFyZW50X3Bvb2wgIT0gcmVzX3Bvb2wpOworCQlkZXZtX2tmcmVlKCZtY19idXNfZGV2LT5kZXYsIHJlc291cmNlKTsKKwl9CisKKwlXQVJOX09OKGZyZWVfY291bnQgIT0gcmVzX3Bvb2wtPmZyZWVfY291bnQpOworfQorCitzdGF0aWMgdm9pZCBkcHJjX2NsZWFudXBfYWxsX3Jlc291cmNlX3Bvb2xzKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2KQoreworCWludCBwb29sX3R5cGU7CisKKwlmb3IgKHBvb2xfdHlwZSA9IDA7IHBvb2xfdHlwZSA8IEZTTF9NQ19OVU1fUE9PTF9UWVBFUzsgcG9vbF90eXBlKyspCisJCWRwcmNfY2xlYW51cF9yZXNvdXJjZV9wb29sKG1jX2J1c19kZXYsIHBvb2xfdHlwZSk7Cit9CisKKy8qKgorICogZHByY19zY2FuX29iamVjdHMgLSBEaXNjb3ZlciBvYmplY3RzIGluIGEgRFBSQworICoKKyAqIEBtY19idXNfZGV2OiBwb2ludGVyIHRvIHRoZSBmc2wtbWMgZGV2aWNlIHRoYXQgcmVwcmVzZW50cyBhIERQUkMgb2JqZWN0CisgKgorICogRGV0ZWN0cyBvYmplY3RzIGFkZGVkIGFuZCByZW1vdmVkIGZyb20gYSBEUFJDIGFuZCBzeW5jaHJvbml6ZXMgdGhlCisgKiBzdGF0ZSBvZiB0aGUgTGludXggYnVzIGRyaXZlciwgTUMgYnkgYWRkaW5nIGFuZCByZW1vdmluZworICogZGV2aWNlcyBhY2NvcmRpbmdseS4KKyAqIFR3byB0eXBlcyBvZiBkZXZpY2VzIGNhbiBiZSBmb3VuZCBpbiBhIERQUkM6IGFsbG9jYXRhYmxlIG9iamVjdHMgKGUuZy4sCisgKiBkcGJwLCBkcG1jcCkgYW5kIG5vbi1hbGxvY2F0YWJsZSBkZXZpY2VzIChlLmcuLCBkcHJjLCBkcG5pKS4KKyAqIEFsbCBhbGxvY2F0YWJsZSBkZXZpY2VzIG5lZWRlZCB0byBiZSBwcm9iZWQgYmVmb3JlIGFsbCBub24tYWxsb2NhdGFibGUKKyAqIGRldmljZXMsIHRvIGVuc3VyZSB0aGF0IGRldmljZSBkcml2ZXJzIGZvciBub24tYWxsb2NhdGFibGUKKyAqIGRldmljZXMgY2FuIGFsbG9jYXRlIGFueSB0eXBlIG9mIGFsbG9jYXRhYmxlIGRldmljZXMuCisgKiBUaGF0IGlzLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIHBvb2xzIGFyZQorICogcG9wdWxhdGVkIGJlZm9yZSB0aGV5IGNhbiBnZXQgYWxsb2NhdGlvbiByZXF1ZXN0cyBmcm9tIHByb2JlIGNhbGxiYWNrcworICogb2YgdGhlIGRldmljZSBkcml2ZXJzIGZvciB0aGUgbm9uLWFsbG9jYXRhYmxlIGRldmljZXMuCisgKi8KK2ludCBkcHJjX3NjYW5fb2JqZWN0cyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldikKK3sKKwlpbnQgbnVtX2NoaWxkX29iamVjdHM7CisJaW50IGRwcmNfZ2V0X29ial9mYWlsdXJlczsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGRwcmNfb2JqX2Rlc2MgKmNoaWxkX29ial9kZXNjX2FycmF5ID0gTlVMTDsKKworCWVycm9yID0gZHByY19nZXRfb2JqX2NvdW50KG1jX2J1c19kZXYtPm1jX2lvLAorCQkJCSAgIG1jX2J1c19kZXYtPm1jX2hhbmRsZSwKKwkJCQkgICAmbnVtX2NoaWxkX29iamVjdHMpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmbWNfYnVzX2Rldi0+ZGV2LCAiZHByY19nZXRfb2JqX2NvdW50KCkgZmFpbGVkOiAlZFxuIiwKKwkJCWVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWlmIChudW1fY2hpbGRfb2JqZWN0cyAhPSAwKSB7CisJCWludCBpOworCisJCWNoaWxkX29ial9kZXNjX2FycmF5ID0KKwkJICAgIGRldm1fa21hbGxvY19hcnJheSgmbWNfYnVzX2Rldi0+ZGV2LCBudW1fY2hpbGRfb2JqZWN0cywKKwkJCQkgICAgICAgc2l6ZW9mKCpjaGlsZF9vYmpfZGVzY19hcnJheSksCisJCQkJICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWNoaWxkX29ial9kZXNjX2FycmF5KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyoKKwkJICogRGlzY292ZXIgb2JqZWN0cyBjdXJyZW50bHkgcHJlc2VudCBpbiB0aGUgcGh5c2ljYWwgRFBSQzoKKwkJICovCisJCWRwcmNfZ2V0X29ial9mYWlsdXJlcyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fY2hpbGRfb2JqZWN0czsgaSsrKSB7CisJCQlzdHJ1Y3QgZHByY19vYmpfZGVzYyAqb2JqX2Rlc2MgPQorCQkJICAgICZjaGlsZF9vYmpfZGVzY19hcnJheVtpXTsKKworCQkJZXJyb3IgPSBkcHJjX2dldF9vYmoobWNfYnVzX2Rldi0+bWNfaW8sCisJCQkJCSAgICAgbWNfYnVzX2Rldi0+bWNfaGFuZGxlLAorCQkJCQkgICAgIGksIG9ial9kZXNjKTsKKwkJCWlmIChlcnJvciA8IDApIHsKKwkJCQlkZXZfZXJyKCZtY19idXNfZGV2LT5kZXYsCisJCQkJCSJkcHJjX2dldF9vYmooaT0lZCkgZmFpbGVkOiAlZFxuIiwKKwkJCQkJaSwgZXJyb3IpOworCQkJCS8qCisJCQkJICogTWFyayB0aGUgb2JqIGVudHJ5IGFzICJpbnZhbGlkIiwgYnkgdXNpbmcgdGhlCisJCQkJICogZW1wdHkgc3RyaW5nIGFzIG9iaiB0eXBlOgorCQkJCSAqLworCQkJCW9ial9kZXNjLT50eXBlWzBdID0gJ1wwJzsKKwkJCQlvYmpfZGVzYy0+aWQgPSBlcnJvcjsKKwkJCQlkcHJjX2dldF9vYmpfZmFpbHVyZXMrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJZGV2X2RiZygmbWNfYnVzX2Rldi0+ZGV2LAorCQkJCSJEaXNjb3ZlcmVkIG9iamVjdDogdHlwZSAlcywgaWQgJWRcbiIsCisJCQkJb2JqX2Rlc2MtPnR5cGUsIG9ial9kZXNjLT5pZCk7CisJCX0KKworCQlpZiAoZHByY19nZXRfb2JqX2ZhaWx1cmVzICE9IDApIHsKKwkJCWRldl9lcnIoJm1jX2J1c19kZXYtPmRldiwKKwkJCQkiJWQgb3V0IG9mICVkIGRldmljZXMgY291bGQgbm90IGJlIHJldHJpZXZlZFxuIiwKKwkJCQlkcHJjX2dldF9vYmpfZmFpbHVyZXMsIG51bV9jaGlsZF9vYmplY3RzKTsKKwkJfQorCX0KKworCWRwcmNfcmVtb3ZlX2RldmljZXMobWNfYnVzX2RldiwgY2hpbGRfb2JqX2Rlc2NfYXJyYXksCisJCQkgICAgbnVtX2NoaWxkX29iamVjdHMpOworCisJZHByY19hZGRfbmV3X2RldmljZXMobWNfYnVzX2RldiwgY2hpbGRfb2JqX2Rlc2NfYXJyYXksCisJCQkgICAgIG51bV9jaGlsZF9vYmplY3RzKTsKKworCWlmIChjaGlsZF9vYmpfZGVzY19hcnJheSkKKwkJZGV2bV9rZnJlZSgmbWNfYnVzX2Rldi0+ZGV2LCBjaGlsZF9vYmpfZGVzY19hcnJheSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRwcmNfc2Nhbl9vYmplY3RzKTsKKworLyoqCisgKiBkcHJjX3NjYW5fY29udGFpbmVyIC0gU2NhbnMgYSBwaHlzaWNhbCBEUFJDIGFuZCBzeW5jaHJvbml6ZXMgTGludXggYnVzIHN0YXRlCisgKgorICogQG1jX2J1c19kZXY6IHBvaW50ZXIgdG8gdGhlIGZzbC1tYyBkZXZpY2UgdGhhdCByZXByZXNlbnRzIGEgRFBSQyBvYmplY3QKKyAqCisgKiBTY2FucyB0aGUgcGh5c2ljYWwgRFBSQyBhbmQgc3luY2hyb25pemVzIHRoZSBzdGF0ZSBvZiB0aGUgTGludXgKKyAqIGJ1cyBkcml2ZXIgd2l0aCB0aGUgYWN0dWFsIHN0YXRlIG9mIHRoZSBNQyBieSBhZGRpbmcgYW5kIHJlbW92aW5nCisgKiBkZXZpY2VzIGFzIGFwcHJvcHJpYXRlLgorICovCitpbnQgZHByY19zY2FuX2NvbnRhaW5lcihzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldikKK3sKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7CisKKwlkcHJjX2luaXRfYWxsX3Jlc291cmNlX3Bvb2xzKG1jX2J1c19kZXYpOworCisJLyoKKwkgKiBEaXNjb3ZlciBvYmplY3RzIGluIHRoZSBEUFJDOgorCSAqLworCW11dGV4X2xvY2soJm1jX2J1cy0+c2Nhbl9tdXRleCk7CisJZXJyb3IgPSBkcHJjX3NjYW5fb2JqZWN0cyhtY19idXNfZGV2KTsKKwltdXRleF91bmxvY2soJm1jX2J1cy0+c2Nhbl9tdXRleCk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworZXJyb3I6CisJZHByY19jbGVhbnVwX2FsbF9yZXNvdXJjZV9wb29scyhtY19idXNfZGV2KTsKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkcHJjX3NjYW5fY29udGFpbmVyKTsKKworLyoqCisgKiBkcHJjX3Byb2JlIC0gY2FsbGJhY2sgaW52b2tlZCB3aGVuIGEgRFBSQyBpcyBiZWluZyBib3VuZCB0byB0aGlzIGRyaXZlcgorICoKKyAqIEBtY19kZXY6IFBvaW50ZXIgdG8gZnNsLW1jIGRldmljZSByZXByZXNlbnRpbmcgYSBEUFJDCisgKgorICogSXQgb3BlbnMgdGhlIHBoeXNpY2FsIERQUkMgaW4gdGhlIE1DLgorICogSXQgc2NhbnMgdGhlIERQUkMgdG8gZGlzY292ZXIgdGhlIE1DIG9iamVjdHMgY29udGFpbmVkIGluIGl0LgorICogSXQgY3JlYXRlcyB0aGUgaW50ZXJydXB0IHBvb2wgZm9yIHRoZSBNQyBidXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBEUFJDLgorICogSXQgY29uZmlndXJlcyB0aGUgaW50ZXJydXB0cyBmb3IgdGhlIERQUkMgZGV2aWNlIGl0c2VsZi4KKyAqLworc3RhdGljIGludCBkcHJjX3Byb2JlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpCit7CisJaW50IGVycm9yOworCXNpemVfdCByZWdpb25fc2l6ZTsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19kZXYpOworCisJaWYgKFdBUk5fT04oc3RyY21wKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSwgImRwcmMiKSAhPSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIW1jX2Rldi0+bWNfaW8pIHsKKwkJLyoKKwkJICogVGhpcyBpcyBhIGNoaWxkIERQUkM6CisJCSAqLworCQlpZiAoV0FSTl9PTihtY19kZXYtPm9ial9kZXNjLnJlZ2lvbl9jb3VudCA9PSAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJlZ2lvbl9zaXplID0gbWNfZGV2LT5yZWdpb25zWzBdLmVuZCAtCisJCQkgICAgICBtY19kZXYtPnJlZ2lvbnNbMF0uc3RhcnQgKyAxOworCisJCWVycm9yID0gZnNsX2NyZWF0ZV9tY19pbygmbWNfZGV2LT5kZXYsCisJCQkJCSBtY19kZXYtPnJlZ2lvbnNbMF0uc3RhcnQsCisJCQkJCSByZWdpb25fc2l6ZSwKKwkJCQkJIE5VTEwsIDAsICZtY19kZXYtPm1jX2lvKTsKKwkJaWYgKGVycm9yIDwgMCkKKwkJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IGRwcmNfb3BlbihtY19kZXYtPm1jX2lvLCBtY19kZXYtPm9ial9kZXNjLmlkLAorCQkJICAmbWNfZGV2LT5tY19oYW5kbGUpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycigmbWNfZGV2LT5kZXYsICJkcHJjX29wZW4oKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CisJCWdvdG8gZXJyb3JfY2xlYW51cF9tY19pbzsKKwl9CisKKwltdXRleF9pbml0KCZtY19idXMtPnNjYW5fbXV0ZXgpOworCisJLyoKKwkgKiBEaXNjb3ZlciBNQyBvYmplY3RzIGluIERQUkMgb2JqZWN0OgorCSAqLworCWVycm9yID0gZHByY19zY2FuX2NvbnRhaW5lcihtY19kZXYpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyb3JfY2xlYW51cF9vcGVuOworCisJZGV2X2luZm8oJm1jX2Rldi0+ZGV2LCAiRFBSQyBkZXZpY2UgYm91bmQgdG8gZHJpdmVyIik7CisJcmV0dXJuIDA7CisKK2Vycm9yX2NsZWFudXBfb3BlbjoKKwkodm9pZClkcHJjX2Nsb3NlKG1jX2Rldi0+bWNfaW8sIG1jX2Rldi0+bWNfaGFuZGxlKTsKKworZXJyb3JfY2xlYW51cF9tY19pbzoKKwlmc2xfZGVzdHJveV9tY19pbyhtY19kZXYtPm1jX2lvKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogZHByY19yZW1vdmUgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYSBEUFJDIGlzIGJlaW5nIHVuYm91bmQgZnJvbSB0aGlzIGRyaXZlcgorICoKKyAqIEBtY19kZXY6IFBvaW50ZXIgdG8gZnNsLW1jIGRldmljZSByZXByZXNlbnRpbmcgdGhlIERQUkMKKyAqCisgKiBJdCByZW1vdmVzIHRoZSBEUFJDJ3MgY2hpbGQgb2JqZWN0cyBmcm9tIExpbnV4IChub3QgZnJvbSB0aGUgTUMpIGFuZAorICogY2xvc2VzIHRoZSBEUFJDIGRldmljZSBpbiB0aGUgTUMuCisgKiBJdCB0ZWFycyBkb3duIHRoZSBpbnRlcnJ1cHRzIHRoYXQgd2VyZSBjb25maWd1cmVkIGZvciB0aGUgRFBSQyBkZXZpY2UuCisgKiBJdCBkZXN0cm95cyB0aGUgaW50ZXJydXB0IHBvb2wgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTUMgYnVzLgorICovCitzdGF0aWMgaW50IGRwcmNfcmVtb3ZlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpCit7CisJaW50IGVycm9yOworCisJaWYgKFdBUk5fT04oc3RyY21wKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSwgImRwcmMiKSAhPSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKFdBUk5fT04oIW1jX2Rldi0+bWNfaW8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldmljZV9mb3JfZWFjaF9jaGlsZCgmbWNfZGV2LT5kZXYsIE5VTEwsIF9fZnNsX21jX2RldmljZV9yZW1vdmUpOworCWRwcmNfY2xlYW51cF9hbGxfcmVzb3VyY2VfcG9vbHMobWNfZGV2KTsKKwllcnJvciA9IGRwcmNfY2xvc2UobWNfZGV2LT5tY19pbywgbWNfZGV2LT5tY19oYW5kbGUpOworCWlmIChlcnJvciA8IDApCisJCWRldl9lcnIoJm1jX2Rldi0+ZGV2LCAiZHByY19jbG9zZSgpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKworCWRldl9pbmZvKCZtY19kZXYtPmRldiwgIkRQUkMgZGV2aWNlIHVuYm91bmQgZnJvbSBkcml2ZXIiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmc2xfbWNfZGV2aWNlX21hdGNoX2lkIG1hdGNoX2lkX3RhYmxlW10gPSB7CisJeworCSAudmVuZG9yID0gRlNMX01DX1ZFTkRPUl9GUkVFU0NBTEUsCisJIC5vYmpfdHlwZSA9ICJkcHJjIiwKKwkgLnZlcl9tYWpvciA9IERQUkNfVkVSX01BSk9SLAorCSAudmVyX21pbm9yID0gRFBSQ19WRVJfTUlOT1J9LAorCXsudmVuZG9yID0gMHgwfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX21jX2RyaXZlciBkcHJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9IEZTTF9NQ19EUFJDX0RSSVZFUl9OQU1FLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgLnBtID0gTlVMTCwKKwkJICAgfSwKKwkubWF0Y2hfaWRfdGFibGUgPSBtYXRjaF9pZF90YWJsZSwKKwkucHJvYmUgPSBkcHJjX3Byb2JlLAorCS5yZW1vdmUgPSBkcHJjX3JlbW92ZSwKK307CisKK2ludCBfX2luaXQgZHByY19kcml2ZXJfaW5pdCh2b2lkKQoreworCXJldHVybiBmc2xfbWNfZHJpdmVyX3JlZ2lzdGVyKCZkcHJjX2RyaXZlcik7Cit9CisKK3ZvaWQgX19leGl0IGRwcmNfZHJpdmVyX2V4aXQodm9pZCkKK3sKKwlmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIoJmRwcmNfZHJpdmVyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL2RwcmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWIyNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvZHByYy5jCkBAIC0wLDAgKzEsOTEzIEBACisvKiBDb3B5cmlnaHQgMjAxMy0yMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyoKKyogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyogbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisqCisqCisqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyogbGF0ZXIgdmVyc2lvbi4KKyoKKyogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworI2luY2x1ZGUgIi4uL2luY2x1ZGUvbWMtc3lzLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1jbWQuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2RwcmMuaCIKKyNpbmNsdWRlICJkcHJjLWNtZC5oIgorCitpbnQgZHByY19vcGVuKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCBpbnQgY29udGFpbmVyX2lkLCB1aW50MTZfdCAqdG9rZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX09QRU4sIE1DX0NNRF9QUklfTE9XLAorCQkJCQkgIDApOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBjb250YWluZXJfaWQpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKnRva2VuID0gTUNfQ01EX0hEUl9SRUFEX1RPS0VOKGNtZC5oZWFkZXIpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRwcmNfb3Blbik7CisKK2ludCBkcHJjX2Nsb3NlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0NMT1NFLCBNQ19DTURfUFJJX0hJR0gsCisJCQkJCSAgdG9rZW4pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KK0VYUE9SVF9TWU1CT0woZHByY19jbG9zZSk7CisKK2ludCBkcHJjX2NyZWF0ZV9jb250YWluZXIoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgIHVpbnQxNl90IHRva2VuLAorCQkJICBzdHJ1Y3QgZHByY19jZmcgKmNmZywKKwkJCSAgaW50ICpjaGlsZF9jb250YWluZXJfaWQsCisJCQkgIHVpbnQ2NF90ICpjaGlsZF9wb3J0YWxfcGFkZHIpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCAxNiwgY2ZnLT5pY2lkKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgY2ZnLT5vcHRpb25zKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygzMiwgMzIsIGNmZy0+cG9ydGFsX2lkKTsKKworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0NSRUFURV9DT05ULAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqY2hpbGRfY29udGFpbmVyX2lkID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDAsIDMyKTsKKwkqY2hpbGRfcG9ydGFsX3BhZGRyID0gbWNfZGVjKGNtZC5wYXJhbXNbMl0sIDAsIDY0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZHByY19kZXN0cm95X2NvbnRhaW5lcihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCSAgIHVpbnQxNl90IHRva2VuLAorCQkJICAgaW50IGNoaWxkX2NvbnRhaW5lcl9pZCkKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0RFU1RST1lfQ09OVCwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBjaGlsZF9jb250YWluZXJfaWQpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwcmNfcmVzZXRfY29udGFpbmVyKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJIHVpbnQxNl90IHRva2VuLAorCQkJIGludCBjaGlsZF9jb250YWluZXJfaWQpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9SRVNFVF9DT05ULAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIGNoaWxkX2NvbnRhaW5lcl9pZCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHByY19nZXRfaXJxKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgdWludDE2X3QgdG9rZW4sCisJCSB1aW50OF90IGlycV9pbmRleCwKKwkJIGludCAqdHlwZSwKKwkJIHVpbnQ2NF90ICppcnFfcGFkZHIsCisJCSB1aW50MzJfdCAqaXJxX3ZhbCwKKwkJIGludCAqdXNlcl9pcnFfaWQpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0dFVF9JUlEsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csCisJCQkJCSAgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKmlycV92YWwgPSBtY19kZWMoY21kLnBhcmFtc1swXSwgMCwgMzIpOworCSppcnFfcGFkZHIgPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMCwgNjQpOworCSp1c2VyX2lycV9pZCA9IG1jX2RlYyhjbWQucGFyYW1zWzJdLCAwLCAzMik7CisJKnR5cGUgPSBtY19kZWMoY21kLnBhcmFtc1syXSwgMzIsIDMyKTsKKworCXJldHVybiAwOworfQorCitpbnQgZHByY19zZXRfaXJxKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgdWludDE2X3QgdG9rZW4sCisJCSB1aW50OF90IGlycV9pbmRleCwKKwkJIHVpbnQ2NF90IGlycV9wYWRkciwKKwkJIHVpbnQzMl90IGlycV92YWwsCisJCSBpbnQgdXNlcl9pcnFfaWQpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9TRVRfSVJRLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLAorCQkJCQkgIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgaXJxX3ZhbCk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMCwgNjQsIGlycV9wYWRkcik7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMCwgMzIsIHVzZXJfaXJxX2lkKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcHJjX2dldF9pcnFfZW5hYmxlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJdWludDE2X3QgdG9rZW4sCisJCQl1aW50OF90IGlycV9pbmRleCwKKwkJCXVpbnQ4X3QgKmVuKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9HRVRfSVJRX0VOQUJMRSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKmVuID0gbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDgpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcHJjX3NldF9pcnFfZW5hYmxlKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJdWludDE2X3QgdG9rZW4sCisJCQl1aW50OF90IGlycV9pbmRleCwKKwkJCXVpbnQ4X3QgZW4pCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9TRVRfSVJRX0VOQUJMRSwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDgsIGVuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgOCwgaXJxX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcHJjX2dldF9pcnFfbWFzayhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICAgICAgdWludDE2X3QgdG9rZW4sCisJCSAgICAgIHVpbnQ4X3QgaXJxX2luZGV4LAorCQkgICAgICB1aW50MzJfdCAqbWFzaykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX0lSUV9NQVNLLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqbWFzayA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCAzMik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRwcmNfc2V0X2lycV9tYXNrKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgICAgICB1aW50MTZfdCB0b2tlbiwKKwkJICAgICAgdWludDhfdCBpcnFfaW5kZXgsCisJCSAgICAgIHVpbnQzMl90IG1hc2spCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9TRVRfSVJRX01BU0ssCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgbWFzayk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHByY19nZXRfaXJxX3N0YXR1cyhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCXVpbnQxNl90IHRva2VuLAorCQkJdWludDhfdCBpcnFfaW5kZXgsCisJCQl1aW50MzJfdCAqc3RhdHVzKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9HRVRfSVJRX1NUQVRVUywKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCA4LCBpcnFfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJKnN0YXR1cyA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCAwLCAzMik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRwcmNfY2xlYXJfaXJxX3N0YXR1cyhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCSAgdWludDE2X3QgdG9rZW4sCisJCQkgIHVpbnQ4X3QgaXJxX2luZGV4LAorCQkJICB1aW50MzJfdCBzdGF0dXMpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9DTEVBUl9JUlFfU1RBVFVTLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIHN0YXR1cyk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDgsIGlycV9pbmRleCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHByY19nZXRfYXR0cmlidXRlcyhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJCXVpbnQxNl90IHRva2VuLAorCQkJc3RydWN0IGRwcmNfYXR0cmlidXRlcyAqYXR0cikKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX0FUVFIsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csCisJCQkJCSAgdG9rZW4pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJYXR0ci0+Y29udGFpbmVyX2lkID0gbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDMyKTsKKwlhdHRyLT5pY2lkID0gbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDMyLCAxNik7CisJYXR0ci0+b3B0aW9ucyA9IG1jX2RlYyhjbWQucGFyYW1zWzFdLCAwLCAzMik7CisJYXR0ci0+cG9ydGFsX2lkID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDMyLCAzMik7CisJYXR0ci0+dmVyc2lvbi5tYWpvciA9IG1jX2RlYyhjbWQucGFyYW1zWzJdLCAwLCAxNik7CisJYXR0ci0+dmVyc2lvbi5taW5vciA9IG1jX2RlYyhjbWQucGFyYW1zWzJdLCAxNiwgMTYpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcHJjX3NldF9yZXNfcXVvdGEoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgICAgICB1aW50MTZfdCB0b2tlbiwKKwkJICAgICAgIGludCBjaGlsZF9jb250YWluZXJfaWQsCisJCSAgICAgICBjaGFyICp0eXBlLAorCQkgICAgICAgdWludDE2X3QgcXVvdGEpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9TRVRfUkVTX1FVT1RBLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIGNoaWxkX2NvbnRhaW5lcl9pZCk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDE2LCBxdW90YSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMCwgOCwgdHlwZVswXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoOCwgOCwgdHlwZVsxXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMTYsIDgsIHR5cGVbMl0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDI0LCA4LCB0eXBlWzNdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygzMiwgOCwgdHlwZVs0XSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoNDAsIDgsIHR5cGVbNV0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDQ4LCA4LCB0eXBlWzZdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYyg1NiwgOCwgdHlwZVs3XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMCwgOCwgdHlwZVs4XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoOCwgOCwgdHlwZVs5XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMTYsIDgsIHR5cGVbMTBdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygyNCwgOCwgdHlwZVsxMV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDMyLCA4LCB0eXBlWzEyXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNDAsIDgsIHR5cGVbMTNdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0OCwgOCwgdHlwZVsxNF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDU2LCA4LCAnXDAnKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcHJjX2dldF9yZXNfcXVvdGEoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgICAgICB1aW50MTZfdCB0b2tlbiwKKwkJICAgICAgIGludCBjaGlsZF9jb250YWluZXJfaWQsCisJCSAgICAgICBjaGFyICp0eXBlLAorCQkgICAgICAgdWludDE2X3QgKnF1b3RhKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9HRVRfUkVTX1FVT1RBLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIGNoaWxkX2NvbnRhaW5lcl9pZCk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMCwgOCwgdHlwZVswXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoOCwgOCwgdHlwZVsxXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMTYsIDgsIHR5cGVbMl0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDI0LCA4LCB0eXBlWzNdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygzMiwgOCwgdHlwZVs0XSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoNDAsIDgsIHR5cGVbNV0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDQ4LCA4LCB0eXBlWzZdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYyg1NiwgOCwgdHlwZVs3XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMCwgOCwgdHlwZVs4XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoOCwgOCwgdHlwZVs5XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMTYsIDgsIHR5cGVbMTBdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygyNCwgOCwgdHlwZVsxMV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDMyLCA4LCB0eXBlWzEyXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNDAsIDgsIHR5cGVbMTNdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0OCwgOCwgdHlwZVsxNF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDU2LCA4LCAnXDAnKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSpxdW90YSA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCAzMiwgMTYpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkcHJjX2Fzc2lnbihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJdWludDE2X3QgdG9rZW4sCisJCWludCBjb250YWluZXJfaWQsCisJCXN0cnVjdCBkcHJjX3Jlc19yZXEgKnJlc19yZXEpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9BU1NJR04sCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgY29udGFpbmVyX2lkKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgMzIsIHJlc19yZXEtPm9wdGlvbnMpOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDAsIDMyLCByZXNfcmVxLT5udW0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDMyLCAzMiwgcmVzX3JlcS0+aWRfYmFzZV9hbGlnbik7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMCwgOCwgcmVzX3JlcS0+dHlwZVswXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoOCwgOCwgcmVzX3JlcS0+dHlwZVsxXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMTYsIDgsIHJlc19yZXEtPnR5cGVbMl0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDI0LCA4LCByZXNfcmVxLT50eXBlWzNdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygzMiwgOCwgcmVzX3JlcS0+dHlwZVs0XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNDAsIDgsIHJlc19yZXEtPnR5cGVbNV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDQ4LCA4LCByZXNfcmVxLT50eXBlWzZdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg1NiwgOCwgcmVzX3JlcS0+dHlwZVs3XSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMCwgOCwgcmVzX3JlcS0+dHlwZVs4XSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoOCwgOCwgcmVzX3JlcS0+dHlwZVs5XSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMTYsIDgsIHJlc19yZXEtPnR5cGVbMTBdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygyNCwgOCwgcmVzX3JlcS0+dHlwZVsxMV0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDMyLCA4LCByZXNfcmVxLT50eXBlWzEyXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoNDAsIDgsIHJlc19yZXEtPnR5cGVbMTNdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg0OCwgOCwgcmVzX3JlcS0+dHlwZVsxNF0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDU2LCA4LCByZXNfcmVxLT50eXBlWzE1XSk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCXJldHVybiBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworfQorCitpbnQgZHByY191bmFzc2lnbihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICB1aW50MTZfdCB0b2tlbiwKKwkJICBpbnQgY2hpbGRfY29udGFpbmVyX2lkLAorCQkgIHN0cnVjdCBkcHJjX3Jlc19yZXEgKnJlc19yZXEpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9VTkFTU0lHTiwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywKKwkJCQkJICB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIGNoaWxkX2NvbnRhaW5lcl9pZCk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDMyLCByZXNfcmVxLT5vcHRpb25zKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygwLCAzMiwgcmVzX3JlcS0+bnVtKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygzMiwgMzIsIHJlc19yZXEtPmlkX2Jhc2VfYWxpZ24pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDAsIDgsIHJlc19yZXEtPnR5cGVbMF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDgsIDgsIHJlc19yZXEtPnR5cGVbMV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDE2LCA4LCByZXNfcmVxLT50eXBlWzJdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygyNCwgOCwgcmVzX3JlcS0+dHlwZVszXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMzIsIDgsIHJlc19yZXEtPnR5cGVbNF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDQwLCA4LCByZXNfcmVxLT50eXBlWzVdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0OCwgOCwgcmVzX3JlcS0+dHlwZVs2XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNTYsIDgsIHJlc19yZXEtPnR5cGVbN10pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDAsIDgsIHJlc19yZXEtPnR5cGVbOF0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDgsIDgsIHJlc19yZXEtPnR5cGVbOV0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDE2LCA4LCByZXNfcmVxLT50eXBlWzEwXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMjQsIDgsIHJlc19yZXEtPnR5cGVbMTFdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygzMiwgOCwgcmVzX3JlcS0+dHlwZVsxMl0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDQwLCA4LCByZXNfcmVxLT50eXBlWzEzXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoNDgsIDgsIHJlc19yZXEtPnR5cGVbMTRdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg1NiwgOCwgcmVzX3JlcS0+dHlwZVsxNV0pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwcmNfZ2V0X3Bvb2xfY291bnQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQl1aW50MTZfdCB0b2tlbiwKKwkJCWludCAqcG9vbF9jb3VudCkKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX1BPT0xfQ09VTlQsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSpwb29sX2NvdW50ID0gbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDMyKTsKKworCXJldHVybiAwOworfQorCitpbnQgZHByY19nZXRfcG9vbChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICB1aW50MTZfdCB0b2tlbiwKKwkJICBpbnQgcG9vbF9pbmRleCwKKwkJICBjaGFyICp0eXBlKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9HRVRfUE9PTCwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywKKwkJCQkJICB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIHBvb2xfaW5kZXgpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJdHlwZVswXSA9IG1jX2RlYyhjbWQucGFyYW1zWzFdLCAwLCA4KTsKKwl0eXBlWzFdID0gbWNfZGVjKGNtZC5wYXJhbXNbMV0sIDgsIDgpOworCXR5cGVbMl0gPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMTYsIDgpOworCXR5cGVbM10gPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMjQsIDgpOworCXR5cGVbNF0gPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMzIsIDgpOworCXR5cGVbNV0gPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgNDAsIDgpOworCXR5cGVbNl0gPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgNDgsIDgpOworCXR5cGVbN10gPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgNTYsIDgpOworCXR5cGVbOF0gPSBtY19kZWMoY21kLnBhcmFtc1syXSwgMCwgOCk7CisJdHlwZVs5XSA9IG1jX2RlYyhjbWQucGFyYW1zWzJdLCA4LCA4KTsKKwl0eXBlWzEwXSA9IG1jX2RlYyhjbWQucGFyYW1zWzJdLCAxNiwgOCk7CisJdHlwZVsxMV0gPSBtY19kZWMoY21kLnBhcmFtc1syXSwgMjQsIDgpOworCXR5cGVbMTJdID0gbWNfZGVjKGNtZC5wYXJhbXNbMl0sIDMyLCA4KTsKKwl0eXBlWzEzXSA9IG1jX2RlYyhjbWQucGFyYW1zWzJdLCA0MCwgOCk7CisJdHlwZVsxNF0gPSBtY19kZWMoY21kLnBhcmFtc1syXSwgNDgsIDgpOworCXR5cGVbMTVdID0gJ1wwJzsKKworCXJldHVybiAwOworfQorCitpbnQgZHByY19nZXRfb2JqX2NvdW50KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbiwgaW50ICpvYmpfY291bnQpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0dFVF9PQkpfQ09VTlQsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCSpvYmpfY291bnQgPSBtY19kZWMoY21kLnBhcmFtc1swXSwgMzIsIDMyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcHJjX2dldF9vYmpfY291bnQpOworCitpbnQgZHByY19nZXRfb2JqKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgdWludDE2X3QgdG9rZW4sCisJCSBpbnQgb2JqX2luZGV4LAorCQkgc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9HRVRfT0JKLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLAorCQkJCQkgIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgb2JqX2luZGV4KTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJZXJyID0gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogcmV0cmlldmUgcmVzcG9uc2UgcGFyYW1ldGVycyAqLworCW9ial9kZXNjLT5pZCA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCAzMiwgMzIpOworCW9ial9kZXNjLT52ZW5kb3IgPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMCwgMTYpOworCW9ial9kZXNjLT5pcnFfY291bnQgPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMTYsIDgpOworCW9ial9kZXNjLT5yZWdpb25fY291bnQgPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMjQsIDgpOworCW9ial9kZXNjLT5zdGF0ZSA9IG1jX2RlYyhjbWQucGFyYW1zWzFdLCAzMiwgMzIpOworCW9ial9kZXNjLT52ZXJfbWFqb3IgPSBtY19kZWMoY21kLnBhcmFtc1syXSwgMCwgMTYpOworCW9ial9kZXNjLT52ZXJfbWlub3IgPSBtY19kZWMoY21kLnBhcmFtc1syXSwgMTYsIDE2KTsKKwlvYmpfZGVzYy0+dHlwZVswXSA9IG1jX2RlYyhjbWQucGFyYW1zWzNdLCAwLCA4KTsKKwlvYmpfZGVzYy0+dHlwZVsxXSA9IG1jX2RlYyhjbWQucGFyYW1zWzNdLCA4LCA4KTsKKwlvYmpfZGVzYy0+dHlwZVsyXSA9IG1jX2RlYyhjbWQucGFyYW1zWzNdLCAxNiwgOCk7CisJb2JqX2Rlc2MtPnR5cGVbM10gPSBtY19kZWMoY21kLnBhcmFtc1szXSwgMjQsIDgpOworCW9ial9kZXNjLT50eXBlWzRdID0gbWNfZGVjKGNtZC5wYXJhbXNbM10sIDMyLCA4KTsKKwlvYmpfZGVzYy0+dHlwZVs1XSA9IG1jX2RlYyhjbWQucGFyYW1zWzNdLCA0MCwgOCk7CisJb2JqX2Rlc2MtPnR5cGVbNl0gPSBtY19kZWMoY21kLnBhcmFtc1szXSwgNDgsIDgpOworCW9ial9kZXNjLT50eXBlWzddID0gbWNfZGVjKGNtZC5wYXJhbXNbM10sIDU2LCA4KTsKKwlvYmpfZGVzYy0+dHlwZVs4XSA9IG1jX2RlYyhjbWQucGFyYW1zWzRdLCAwLCA4KTsKKwlvYmpfZGVzYy0+dHlwZVs5XSA9IG1jX2RlYyhjbWQucGFyYW1zWzRdLCA4LCA4KTsKKwlvYmpfZGVzYy0+dHlwZVsxMF0gPSBtY19kZWMoY21kLnBhcmFtc1s0XSwgMTYsIDgpOworCW9ial9kZXNjLT50eXBlWzExXSA9IG1jX2RlYyhjbWQucGFyYW1zWzRdLCAyNCwgOCk7CisJb2JqX2Rlc2MtPnR5cGVbMTJdID0gbWNfZGVjKGNtZC5wYXJhbXNbNF0sIDMyLCA4KTsKKwlvYmpfZGVzYy0+dHlwZVsxM10gPSBtY19kZWMoY21kLnBhcmFtc1s0XSwgNDAsIDgpOworCW9ial9kZXNjLT50eXBlWzE0XSA9IG1jX2RlYyhjbWQucGFyYW1zWzRdLCA0OCwgOCk7CisJb2JqX2Rlc2MtPnR5cGVbMTVdID0gJ1wwJzsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcHJjX2dldF9vYmopOworCitpbnQgZHByY19nZXRfcmVzX2NvdW50KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkgICAgICAgdWludDE2X3QgdG9rZW4sCisJCSAgICAgICBjaGFyICp0eXBlLAorCQkgICAgICAgaW50ICpyZXNfY291bnQpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisJaW50IGVycjsKKworCSpyZXNfY291bnQgPSAwOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX1JFU19DT1VOVCwKKwkJCQkJICBNQ19DTURfUFJJX0xPVywgdG9rZW4pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDAsIDgsIHR5cGVbMF0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDgsIDgsIHR5cGVbMV0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDE2LCA4LCB0eXBlWzJdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygyNCwgOCwgdHlwZVszXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMzIsIDgsIHR5cGVbNF0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDQwLCA4LCB0eXBlWzVdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYyg0OCwgOCwgdHlwZVs2XSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoNTYsIDgsIHR5cGVbN10pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDAsIDgsIHR5cGVbOF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDgsIDgsIHR5cGVbOV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDE2LCA4LCB0eXBlWzEwXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMjQsIDgsIHR5cGVbMTFdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygzMiwgOCwgdHlwZVsxMl0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDQwLCA4LCB0eXBlWzEzXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNDgsIDgsIHR5cGVbMTRdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg1NiwgOCwgJ1wwJyk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqcmVzX2NvdW50ID0gbWNfZGVjKGNtZC5wYXJhbXNbMF0sIDAsIDMyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcHJjX2dldF9yZXNfY291bnQpOworCitpbnQgZHByY19nZXRfcmVzX2lkcyhzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICAgICB1aW50MTZfdCB0b2tlbiwKKwkJICAgICBjaGFyICp0eXBlLAorCQkgICAgIHN0cnVjdCBkcHJjX3Jlc19pZHNfcmFuZ2VfZGVzYyAqcmFuZ2VfZGVzYykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX1JFU19JRFMsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYyg0MiwgNywgcmFuZ2VfZGVzYy0+aXRlcl9zdGF0dXMpOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDAsIDMyLCByYW5nZV9kZXNjLT5iYXNlX2lkKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygzMiwgMzIsIHJhbmdlX2Rlc2MtPmxhc3RfaWQpOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDAsIDgsIHR5cGVbMF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDgsIDgsIHR5cGVbMV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDE2LCA4LCB0eXBlWzJdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygyNCwgOCwgdHlwZVszXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMzIsIDgsIHR5cGVbNF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDQwLCA4LCB0eXBlWzVdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0OCwgOCwgdHlwZVs2XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNTYsIDgsIHR5cGVbN10pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDAsIDgsIHR5cGVbOF0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDgsIDgsIHR5cGVbOV0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDE2LCA4LCB0eXBlWzEwXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMjQsIDgsIHR5cGVbMTFdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygzMiwgOCwgdHlwZVsxMl0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDQwLCA4LCB0eXBlWzEzXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoNDgsIDgsIHR5cGVbMTRdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg1NiwgOCwgJ1wwJyk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwlyYW5nZV9kZXNjLT5pdGVyX3N0YXR1cyA9IG1jX2RlYyhjbWQucGFyYW1zWzBdLCA0MiwgNyk7CisJcmFuZ2VfZGVzYy0+YmFzZV9pZCA9IG1jX2RlYyhjbWQucGFyYW1zWzFdLCAwLCAzMik7CisJcmFuZ2VfZGVzYy0+bGFzdF9pZCA9IG1jX2RlYyhjbWQucGFyYW1zWzFdLCAzMiwgMzIpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRwcmNfZ2V0X3Jlc19pZHMpOworCitpbnQgZHByY19nZXRfcG9ydGFsX3BhZGRyKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJICB1aW50MTZfdCB0b2tlbiwKKwkJCSAgaW50IHBvcnRhbF9pZCwKKwkJCSAgdWludDY0X3QgKnBvcnRhbF9hZGRyKQoreworCXN0cnVjdCBtY19jb21tYW5kIGNtZCA9IHsgMCB9OworCWludCBlcnI7CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9HRVRfUE9SVEFMX1BBRERSLAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLCB0b2tlbik7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMCwgMzIsIHBvcnRhbF9pZCk7CisKKwkvKiBzZW5kIGNvbW1hbmQgdG8gbWMqLworCWVyciA9IG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIHJldHJpZXZlIHJlc3BvbnNlIHBhcmFtZXRlcnMgKi8KKwkqcG9ydGFsX2FkZHIgPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMCwgNjQpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRwcmNfZ2V0X3BvcnRhbF9wYWRkcik7CisKK2ludCBkcHJjX2dldF9vYmpfcmVnaW9uKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLAorCQkJdWludDE2X3QgdG9rZW4sCisJCQljaGFyICpvYmpfdHlwZSwKKwkJCWludCBvYmpfaWQsCisJCQl1aW50OF90IHJlZ2lvbl9pbmRleCwKKwkJCXN0cnVjdCBkcHJjX3JlZ2lvbl9kZXNjICpyZWdpb25fZGVzYykKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX09CSl9SRUcsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgb2JqX2lkKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYyg0OCwgOCwgcmVnaW9uX2luZGV4KTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygwLCA4LCBvYmpfdHlwZVswXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoOCwgOCwgb2JqX3R5cGVbMV0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDE2LCA4LCBvYmpfdHlwZVsyXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMjQsIDgsIG9ial90eXBlWzNdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygzMiwgOCwgb2JqX3R5cGVbNF0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDQwLCA4LCBvYmpfdHlwZVs1XSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoNDgsIDgsIG9ial90eXBlWzZdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg1NiwgOCwgb2JqX3R5cGVbN10pOworCWNtZC5wYXJhbXNbNF0gfD0gbWNfZW5jKDAsIDgsIG9ial90eXBlWzhdKTsKKwljbWQucGFyYW1zWzRdIHw9IG1jX2VuYyg4LCA4LCBvYmpfdHlwZVs5XSk7CisJY21kLnBhcmFtc1s0XSB8PSBtY19lbmMoMTYsIDgsIG9ial90eXBlWzEwXSk7CisJY21kLnBhcmFtc1s0XSB8PSBtY19lbmMoMjQsIDgsIG9ial90eXBlWzExXSk7CisJY21kLnBhcmFtc1s0XSB8PSBtY19lbmMoMzIsIDgsIG9ial90eXBlWzEyXSk7CisJY21kLnBhcmFtc1s0XSB8PSBtY19lbmMoNDAsIDgsIG9ial90eXBlWzEzXSk7CisJY21kLnBhcmFtc1s0XSB8PSBtY19lbmMoNDgsIDgsIG9ial90eXBlWzE0XSk7CisJY21kLnBhcmFtc1s0XSB8PSBtY19lbmMoNTYsIDgsICdcMCcpOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJcmVnaW9uX2Rlc2MtPmJhc2VfcGFkZHIgPSBtY19kZWMoY21kLnBhcmFtc1sxXSwgMCwgNjQpOworCXJlZ2lvbl9kZXNjLT5zaXplID0gbWNfZGVjKGNtZC5wYXJhbXNbMl0sIDAsIDMyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcHJjX2dldF9vYmpfcmVnaW9uKTsKKworaW50IGRwcmNfY29ubmVjdChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJIHVpbnQxNl90IHRva2VuLAorCQkgY29uc3Qgc3RydWN0IGRwcmNfZW5kcG9pbnQgKmVuZHBvaW50MSwKKwkJIGNvbnN0IHN0cnVjdCBkcHJjX2VuZHBvaW50ICplbmRwb2ludDIpCit7CisJc3RydWN0IG1jX2NvbW1hbmQgY21kID0geyAwIH07CisKKwkvKiBwcmVwYXJlIGNvbW1hbmQgKi8KKwljbWQuaGVhZGVyID0gbWNfZW5jb2RlX2NtZF9oZWFkZXIoRFBSQ19DTURJRF9DT05ORUNULAorCQkJCQkgIE1DX0NNRF9QUklfTE9XLAorCQkJCQkgIHRva2VuKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygwLCAzMiwgZW5kcG9pbnQxLT5pZCk7CisJY21kLnBhcmFtc1swXSB8PSBtY19lbmMoMzIsIDMyLCBlbmRwb2ludDEtPmludGVyZmFjZV9pZCk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMCwgMzIsIGVuZHBvaW50Mi0+aWQpOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDMyLCAzMiwgZW5kcG9pbnQyLT5pbnRlcmZhY2VfaWQpOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDAsIDgsIGVuZHBvaW50MS0+dHlwZVswXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoOCwgOCwgZW5kcG9pbnQxLT50eXBlWzFdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygxNiwgOCwgZW5kcG9pbnQxLT50eXBlWzJdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygyNCwgOCwgZW5kcG9pbnQxLT50eXBlWzNdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygzMiwgOCwgZW5kcG9pbnQxLT50eXBlWzRdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0MCwgOCwgZW5kcG9pbnQxLT50eXBlWzVdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0OCwgOCwgZW5kcG9pbnQxLT50eXBlWzZdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg1NiwgOCwgZW5kcG9pbnQxLT50eXBlWzddKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygwLCA4LCBlbmRwb2ludDEtPnR5cGVbOF0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDgsIDgsIGVuZHBvaW50MS0+dHlwZVs5XSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoMTYsIDgsIGVuZHBvaW50MS0+dHlwZVsxMF0pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDI0LCA4LCBlbmRwb2ludDEtPnR5cGVbMTFdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYygzMiwgOCwgZW5kcG9pbnQxLT50eXBlWzEyXSk7CisJY21kLnBhcmFtc1szXSB8PSBtY19lbmMoNDAsIDgsIGVuZHBvaW50MS0+dHlwZVsxM10pOworCWNtZC5wYXJhbXNbM10gfD0gbWNfZW5jKDQ4LCA4LCBlbmRwb2ludDEtPnR5cGVbMTRdKTsKKwljbWQucGFyYW1zWzNdIHw9IG1jX2VuYyg1NiwgOCwgZW5kcG9pbnQxLT50eXBlWzE1XSk7CisJY21kLnBhcmFtc1s1XSB8PSBtY19lbmMoMCwgOCwgZW5kcG9pbnQyLT50eXBlWzBdKTsKKwljbWQucGFyYW1zWzVdIHw9IG1jX2VuYyg4LCA4LCBlbmRwb2ludDItPnR5cGVbMV0pOworCWNtZC5wYXJhbXNbNV0gfD0gbWNfZW5jKDE2LCA4LCBlbmRwb2ludDItPnR5cGVbMl0pOworCWNtZC5wYXJhbXNbNV0gfD0gbWNfZW5jKDI0LCA4LCBlbmRwb2ludDItPnR5cGVbM10pOworCWNtZC5wYXJhbXNbNV0gfD0gbWNfZW5jKDMyLCA4LCBlbmRwb2ludDItPnR5cGVbNF0pOworCWNtZC5wYXJhbXNbNV0gfD0gbWNfZW5jKDQwLCA4LCBlbmRwb2ludDItPnR5cGVbNV0pOworCWNtZC5wYXJhbXNbNV0gfD0gbWNfZW5jKDQ4LCA4LCBlbmRwb2ludDItPnR5cGVbNl0pOworCWNtZC5wYXJhbXNbNV0gfD0gbWNfZW5jKDU2LCA4LCBlbmRwb2ludDItPnR5cGVbN10pOworCWNtZC5wYXJhbXNbNl0gfD0gbWNfZW5jKDAsIDgsIGVuZHBvaW50Mi0+dHlwZVs4XSk7CisJY21kLnBhcmFtc1s2XSB8PSBtY19lbmMoOCwgOCwgZW5kcG9pbnQyLT50eXBlWzldKTsKKwljbWQucGFyYW1zWzZdIHw9IG1jX2VuYygxNiwgOCwgZW5kcG9pbnQyLT50eXBlWzEwXSk7CisJY21kLnBhcmFtc1s2XSB8PSBtY19lbmMoMjQsIDgsIGVuZHBvaW50Mi0+dHlwZVsxMV0pOworCWNtZC5wYXJhbXNbNl0gfD0gbWNfZW5jKDMyLCA4LCBlbmRwb2ludDItPnR5cGVbMTJdKTsKKwljbWQucGFyYW1zWzZdIHw9IG1jX2VuYyg0MCwgOCwgZW5kcG9pbnQyLT50eXBlWzEzXSk7CisJY21kLnBhcmFtc1s2XSB8PSBtY19lbmMoNDgsIDgsIGVuZHBvaW50Mi0+dHlwZVsxNF0pOworCWNtZC5wYXJhbXNbNl0gfD0gbWNfZW5jKDU2LCA4LCBlbmRwb2ludDItPnR5cGVbMTVdKTsKKworCS8qIHNlbmQgY29tbWFuZCB0byBtYyovCisJcmV0dXJuIG1jX3NlbmRfY29tbWFuZChtY19pbywgJmNtZCk7Cit9CisKK2ludCBkcHJjX2Rpc2Nvbm5lY3Qoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCSAgICB1aW50MTZfdCB0b2tlbiwKKwkJICAgIGNvbnN0IHN0cnVjdCBkcHJjX2VuZHBvaW50ICplbmRwb2ludCkKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKworCS8qIHByZXBhcmUgY29tbWFuZCAqLworCWNtZC5oZWFkZXIgPSBtY19lbmNvZGVfY21kX2hlYWRlcihEUFJDX0NNRElEX0RJU0NPTk5FQ1QsCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csCisJCQkJCSAgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBlbmRwb2ludC0+aWQpOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDMyLCAzMiwgZW5kcG9pbnQtPmludGVyZmFjZV9pZCk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMCwgOCwgZW5kcG9pbnQtPnR5cGVbMF0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDgsIDgsIGVuZHBvaW50LT50eXBlWzFdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygxNiwgOCwgZW5kcG9pbnQtPnR5cGVbMl0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDI0LCA4LCBlbmRwb2ludC0+dHlwZVszXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMzIsIDgsIGVuZHBvaW50LT50eXBlWzRdKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYyg0MCwgOCwgZW5kcG9pbnQtPnR5cGVbNV0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDQ4LCA4LCBlbmRwb2ludC0+dHlwZVs2XSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoNTYsIDgsIGVuZHBvaW50LT50eXBlWzddKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygwLCA4LCBlbmRwb2ludC0+dHlwZVs4XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoOCwgOCwgZW5kcG9pbnQtPnR5cGVbOV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDE2LCA4LCBlbmRwb2ludC0+dHlwZVsxMF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDI0LCA4LCBlbmRwb2ludC0+dHlwZVsxMV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDMyLCA4LCBlbmRwb2ludC0+dHlwZVsxMl0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDQwLCA4LCBlbmRwb2ludC0+dHlwZVsxM10pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDQ4LCA4LCBlbmRwb2ludC0+dHlwZVsxNF0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDU2LCA4LCBlbmRwb2ludC0+dHlwZVsxNV0pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwlyZXR1cm4gbWNfc2VuZF9jb21tYW5kKG1jX2lvLCAmY21kKTsKK30KKworaW50IGRwcmNfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQl1aW50MTZfdCB0b2tlbiwKKwkJCQkJY29uc3Qgc3RydWN0IGRwcmNfZW5kcG9pbnQgKmVuZHBvaW50MSwKKwkJCQkJc3RydWN0IGRwcmNfZW5kcG9pbnQgKmVuZHBvaW50MiwKKwkJCQkJaW50ICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgbWNfY29tbWFuZCBjbWQgPSB7IDAgfTsKKwlpbnQgZXJyOworCisJLyogcHJlcGFyZSBjb21tYW5kICovCisJY21kLmhlYWRlciA9IG1jX2VuY29kZV9jbWRfaGVhZGVyKERQUkNfQ01ESURfR0VUX0NPTk5FQ1RJT04sCisJCQkJCSAgTUNfQ01EX1BSSV9MT1csCisJCQkJCSAgdG9rZW4pOworCWNtZC5wYXJhbXNbMF0gfD0gbWNfZW5jKDAsIDMyLCBlbmRwb2ludDEtPmlkKTsKKwljbWQucGFyYW1zWzBdIHw9IG1jX2VuYygzMiwgMzIsIGVuZHBvaW50MS0+aW50ZXJmYWNlX2lkKTsKKwljbWQucGFyYW1zWzFdIHw9IG1jX2VuYygwLCA4LCBlbmRwb2ludDEtPnR5cGVbMF0pOworCWNtZC5wYXJhbXNbMV0gfD0gbWNfZW5jKDgsIDgsIGVuZHBvaW50MS0+dHlwZVsxXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMTYsIDgsIGVuZHBvaW50MS0+dHlwZVsyXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMjQsIDgsIGVuZHBvaW50MS0+dHlwZVszXSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoMzIsIDgsIGVuZHBvaW50MS0+dHlwZVs0XSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoNDAsIDgsIGVuZHBvaW50MS0+dHlwZVs1XSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoNDgsIDgsIGVuZHBvaW50MS0+dHlwZVs2XSk7CisJY21kLnBhcmFtc1sxXSB8PSBtY19lbmMoNTYsIDgsIGVuZHBvaW50MS0+dHlwZVs3XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMCwgOCwgZW5kcG9pbnQxLT50eXBlWzhdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg4LCA4LCBlbmRwb2ludDEtPnR5cGVbOV0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDE2LCA4LCBlbmRwb2ludDEtPnR5cGVbMTBdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYygyNCwgOCwgZW5kcG9pbnQxLT50eXBlWzExXSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoMzIsIDgsIGVuZHBvaW50MS0+dHlwZVsxMl0pOworCWNtZC5wYXJhbXNbMl0gfD0gbWNfZW5jKDQwLCA4LCBlbmRwb2ludDEtPnR5cGVbMTNdKTsKKwljbWQucGFyYW1zWzJdIHw9IG1jX2VuYyg0OCwgOCwgZW5kcG9pbnQxLT50eXBlWzE0XSk7CisJY21kLnBhcmFtc1syXSB8PSBtY19lbmMoNTYsIDgsIGVuZHBvaW50MS0+dHlwZVsxNV0pOworCisJLyogc2VuZCBjb21tYW5kIHRvIG1jKi8KKwllcnIgPSBtY19zZW5kX2NvbW1hbmQobWNfaW8sICZjbWQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwkvKiByZXRyaWV2ZSByZXNwb25zZSBwYXJhbWV0ZXJzICovCisJZW5kcG9pbnQyLT5pZCA9IG1jX2RlYyhjbWQucGFyYW1zWzNdLCAwLCAzMik7CisJZW5kcG9pbnQyLT5pbnRlcmZhY2VfaWQgPSBtY19kZWMoY21kLnBhcmFtc1szXSwgMzIsIDMyKTsKKwllbmRwb2ludDItPnR5cGVbMF0gPSBtY19kZWMoY21kLnBhcmFtc1s0XSwgMCwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzFdID0gbWNfZGVjKGNtZC5wYXJhbXNbNF0sIDgsIDgpOworCWVuZHBvaW50Mi0+dHlwZVsyXSA9IG1jX2RlYyhjbWQucGFyYW1zWzRdLCAxNiwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzNdID0gbWNfZGVjKGNtZC5wYXJhbXNbNF0sIDI0LCA4KTsKKwllbmRwb2ludDItPnR5cGVbNF0gPSBtY19kZWMoY21kLnBhcmFtc1s0XSwgMzIsIDgpOworCWVuZHBvaW50Mi0+dHlwZVs1XSA9IG1jX2RlYyhjbWQucGFyYW1zWzRdLCA0MCwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzZdID0gbWNfZGVjKGNtZC5wYXJhbXNbNF0sIDQ4LCA4KTsKKwllbmRwb2ludDItPnR5cGVbN10gPSBtY19kZWMoY21kLnBhcmFtc1s0XSwgNTYsIDgpOworCWVuZHBvaW50Mi0+dHlwZVs4XSA9IG1jX2RlYyhjbWQucGFyYW1zWzVdLCAwLCA4KTsKKwllbmRwb2ludDItPnR5cGVbOV0gPSBtY19kZWMoY21kLnBhcmFtc1s1XSwgOCwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzEwXSA9IG1jX2RlYyhjbWQucGFyYW1zWzVdLCAxNiwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzExXSA9IG1jX2RlYyhjbWQucGFyYW1zWzVdLCAyNCwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzEyXSA9IG1jX2RlYyhjbWQucGFyYW1zWzVdLCAzMiwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzEzXSA9IG1jX2RlYyhjbWQucGFyYW1zWzVdLCA0MCwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzE0XSA9IG1jX2RlYyhjbWQucGFyYW1zWzVdLCA0OCwgOCk7CisJZW5kcG9pbnQyLT50eXBlWzE1XSA9IG1jX2RlYyhjbWQucGFyYW1zWzVdLCA1NiwgOCk7CisJKnN0YXRlID0gbWNfZGVjKGNtZC5wYXJhbXNbNl0sIDAsIDMyKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYWxsb2NhdG9yLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1hbGxvY2F0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzYyMzVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYWxsb2NhdG9yLmMKQEAgLTAsMCArMSw1NzMgQEAKKy8qCisgKiBGcmVlc2NhbGUgTUMgb2JqZWN0IGRldmljZSBhbGxvY2F0b3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1wcml2YXRlLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2RwYnAtY21kLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9kcGNvbi1jbWQuaCIKKyNpbmNsdWRlICJkcG1jcC1jbWQuaCIKKyNpbmNsdWRlICJkcG1jcC5oIgorCisvKioKKyAqIGZzbF9tY19yZXNvdXJjZV9wb29sX2FkZF9kZXZpY2UgLSBhZGQgYWxsb2NhdGFibGUgZGV2aWNlIHRvIGEgcmVzb3VyY2UKKyAqIHBvb2wgb2YgYSBnaXZlbiBNQyBidXMKKyAqCisgKiBAbWNfYnVzOiBwb2ludGVyIHRvIHRoZSBNQyBidXMKKyAqIEBwb29sX3R5cGU6IE1DIGJ1cyBwb29sIHR5cGUKKyAqIEBtY19kZXY6IFBvaW50ZXIgdG8gYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZQorICoKKyAqIEl0IGFkZHMgYW4gYWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZSB0byBhIGNvbnRhaW5lcidzIHJlc291cmNlIHBvb2wgb2YKKyAqIHRoZSBnaXZlbiByZXNvdXJjZSB0eXBlCisgKi8KK3N0YXRpYyBpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19yZXNvdXJjZV9wb29sX2FkZF9kZXZpY2Uoc3RydWN0IGZzbF9tY19idXMKKwkJCQkJCQkJKm1jX2J1cywKKwkJCQkJCQllbnVtIGZzbF9tY19wb29sX3R5cGUKKwkJCQkJCQkJcG9vbF90eXBlLAorCQkJCQkJCXN0cnVjdCBmc2xfbWNfZGV2aWNlCisJCQkJCQkJCSptY19kZXYpCit7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbDsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2RldiA9ICZtY19idXMtPm1jX2RldjsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCWJvb2wgbXV0ZXhfbG9ja2VkID0gZmFsc2U7CisKKwlpZiAoV0FSTl9PTihwb29sX3R5cGUgPCAwIHx8IHBvb2xfdHlwZSA+PSBGU0xfTUNfTlVNX1BPT0xfVFlQRVMpKQorCQlnb3RvIG91dDsKKwlpZiAoV0FSTl9PTighRlNMX01DX0lTX0FMTE9DQVRBQkxFKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkpKQorCQlnb3RvIG91dDsKKwlpZiAoV0FSTl9PTihtY19kZXYtPnJlc291cmNlKSkKKwkJZ290byBvdXQ7CisKKwlyZXNfcG9vbCA9ICZtY19idXMtPnJlc291cmNlX3Bvb2xzW3Bvb2xfdHlwZV07CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPnR5cGUgIT0gcG9vbF90eXBlKSkKKwkJZ290byBvdXQ7CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPm1jX2J1cyAhPSBtY19idXMpKQorCQlnb3RvIG91dDsKKworCW11dGV4X2xvY2soJnJlc19wb29sLT5tdXRleCk7CisJbXV0ZXhfbG9ja2VkID0gdHJ1ZTsKKworCWlmIChXQVJOX09OKHJlc19wb29sLT5tYXhfY291bnQgPCAwKSkKKwkJZ290byBvdXQ7CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgPCAwIHx8CisJCSAgICByZXNfcG9vbC0+ZnJlZV9jb3VudCA+IHJlc19wb29sLT5tYXhfY291bnQpKQorCQlnb3RvIG91dDsKKworCXJlc291cmNlID0gZGV2bV9remFsbG9jKCZtY19idXNfZGV2LT5kZXYsIHNpemVvZigqcmVzb3VyY2UpLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghcmVzb3VyY2UpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlkZXZfZXJyKCZtY19idXNfZGV2LT5kZXYsCisJCQkiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZnNsX21jX3Jlc291cmNlXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmVzb3VyY2UtPnR5cGUgPSBwb29sX3R5cGU7CisJcmVzb3VyY2UtPmlkID0gbWNfZGV2LT5vYmpfZGVzYy5pZDsKKwlyZXNvdXJjZS0+ZGF0YSA9IG1jX2RldjsKKwlyZXNvdXJjZS0+cGFyZW50X3Bvb2wgPSByZXNfcG9vbDsKKwlJTklUX0xJU1RfSEVBRCgmcmVzb3VyY2UtPm5vZGUpOworCWxpc3RfYWRkX3RhaWwoJnJlc291cmNlLT5ub2RlLCAmcmVzX3Bvb2wtPmZyZWVfbGlzdCk7CisJbWNfZGV2LT5yZXNvdXJjZSA9IHJlc291cmNlOworCXJlc19wb29sLT5mcmVlX2NvdW50Kys7CisJcmVzX3Bvb2wtPm1heF9jb3VudCsrOworCWVycm9yID0gMDsKK291dDoKKwlpZiAobXV0ZXhfbG9ja2VkKQorCQltdXRleF91bmxvY2soJnJlc19wb29sLT5tdXRleCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogZnNsX21jX3Jlc291cmNlX3Bvb2xfcmVtb3ZlX2RldmljZSAtIHJlbW92ZSBhbiBhbGxvY2F0YWJsZSBkZXZpY2UgZnJvbSBhCisgKiByZXNvdXJjZSBwb29sCisgKgorICogQG1jX2RldjogUG9pbnRlciB0byBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlCisgKgorICogSXQgcGVybWFuZW50bHkgcmVtb3ZlcyBhbiBhbGxvY2F0YWJsZSBNQyBvYmplY3QgZGV2aWNlIGZyb20gdGhlIHJlc291cmNlCisgKiBwb29sLCB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBpbiwgYXMgbG9uZyBhcyBpdCBpcyBpbiB0aGUgcG9vbCdzIGZyZWUgbGlzdC4KKyAqLworc3RhdGljIGludCBfX211c3RfY2hlY2sgZnNsX21jX3Jlc291cmNlX3Bvb2xfcmVtb3ZlX2RldmljZShzdHJ1Y3QgZnNsX21jX2RldmljZQorCQkJCQkJCQkgICAqbWNfZGV2KQoreworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2OworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbDsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZTsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCWJvb2wgbXV0ZXhfbG9ja2VkID0gZmFsc2U7CisKKwlpZiAoV0FSTl9PTighRlNMX01DX0lTX0FMTE9DQVRBQkxFKG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkpKQorCQlnb3RvIG91dDsKKworCXJlc291cmNlID0gbWNfZGV2LT5yZXNvdXJjZTsKKwlpZiAoV0FSTl9PTihyZXNvdXJjZS0+ZGF0YSAhPSBtY19kZXYpKQorCQlnb3RvIG91dDsKKworCW1jX2J1c19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCk7CisJbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKKwlyZXNfcG9vbCA9IHJlc291cmNlLT5wYXJlbnRfcG9vbDsKKwlpZiAoV0FSTl9PTihyZXNfcG9vbCAhPSAmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1tyZXNvdXJjZS0+dHlwZV0pKQorCQlnb3RvIG91dDsKKworCW11dGV4X2xvY2soJnJlc19wb29sLT5tdXRleCk7CisJbXV0ZXhfbG9ja2VkID0gdHJ1ZTsKKworCWlmIChXQVJOX09OKHJlc19wb29sLT5tYXhfY291bnQgPD0gMCkpCisJCWdvdG8gb3V0OworCWlmIChXQVJOX09OKHJlc19wb29sLT5mcmVlX2NvdW50IDw9IDAgfHwKKwkJICAgIHJlc19wb29sLT5mcmVlX2NvdW50ID4gcmVzX3Bvb2wtPm1heF9jb3VudCkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBhbGxvY2F0ZWQsIGl0cyByZXNvdXJjZSBpcyBub3QKKwkgKiBpbiB0aGUgZnJlZSBsaXN0IGFuZCB0aHVzLCB0aGUgZGV2aWNlIGNhbm5vdCBiZSByZW1vdmVkLgorCSAqLworCWlmIChsaXN0X2VtcHR5KCZyZXNvdXJjZS0+bm9kZSkpIHsKKwkJZXJyb3IgPSAtRUJVU1k7CisJCWRldl9lcnIoJm1jX2J1c19kZXYtPmRldiwKKwkJCSJEZXZpY2UgJXMgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSByZXNvdXJjZSBwb29sXG4iLAorCQkJZGV2X25hbWUoJm1jX2Rldi0+ZGV2KSk7CisJCWdvdG8gb3V0OworCX0KKworCWxpc3RfZGVsKCZyZXNvdXJjZS0+bm9kZSk7CisJSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlLT5ub2RlKTsKKwlyZXNfcG9vbC0+ZnJlZV9jb3VudC0tOworCXJlc19wb29sLT5tYXhfY291bnQtLTsKKworCWRldm1fa2ZyZWUoJm1jX2J1c19kZXYtPmRldiwgcmVzb3VyY2UpOworCW1jX2Rldi0+cmVzb3VyY2UgPSBOVUxMOworCWVycm9yID0gMDsKK291dDoKKwlpZiAobXV0ZXhfbG9ja2VkKQorCQltdXRleF91bmxvY2soJnJlc19wb29sLT5tdXRleCk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmc2xfbWNfcG9vbF90eXBlX3N0cmluZ3NbXSA9IHsKKwlbRlNMX01DX1BPT0xfRFBNQ1BdID0gImRwbWNwIiwKKwlbRlNMX01DX1BPT0xfRFBCUF0gPSAiZHBicCIsCisJW0ZTTF9NQ19QT09MX0RQQ09OXSA9ICJkcGNvbiIsCit9OworCitzdGF0aWMgaW50IF9fbXVzdF9jaGVjayBvYmplY3RfdHlwZV90b19wb29sX3R5cGUoY29uc3QgY2hhciAqb2JqZWN0X3R5cGUsCisJCQkJCQkgZW51bSBmc2xfbWNfcG9vbF90eXBlCisJCQkJCQkJCSpwb29sX3R5cGUpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmc2xfbWNfcG9vbF90eXBlX3N0cmluZ3MpOyBpKyspIHsKKwkJaWYgKHN0cmNtcChvYmplY3RfdHlwZSwgZnNsX21jX3Bvb2xfdHlwZV9zdHJpbmdzW2ldKSA9PSAwKSB7CisJCQkqcG9vbF90eXBlID0gaTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBfX211c3RfY2hlY2sgZnNsX21jX3Jlc291cmNlX2FsbG9jYXRlKHN0cnVjdCBmc2xfbWNfYnVzICptY19idXMsCisJCQkJCSAgZW51bSBmc2xfbWNfcG9vbF90eXBlIHBvb2xfdHlwZSwKKwkJCQkJICBzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICoqbmV3X3Jlc291cmNlKQoreworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCAqcmVzX3Bvb2w7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYgPSAmbWNfYnVzLT5tY19kZXY7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKwlib29sIG11dGV4X2xvY2tlZCA9IGZhbHNlOworCisJQlVJTERfQlVHX09OKEFSUkFZX1NJWkUoZnNsX21jX3Bvb2xfdHlwZV9zdHJpbmdzKSAhPQorCQkgICAgIEZTTF9NQ19OVU1fUE9PTF9UWVBFUyk7CisKKwkqbmV3X3Jlc291cmNlID0gTlVMTDsKKwlpZiAoV0FSTl9PTihwb29sX3R5cGUgPCAwIHx8IHBvb2xfdHlwZSA+PSBGU0xfTUNfTlVNX1BPT0xfVFlQRVMpKQorCQlnb3RvIGVycm9yOworCisJcmVzX3Bvb2wgPSAmbWNfYnVzLT5yZXNvdXJjZV9wb29sc1twb29sX3R5cGVdOworCWlmIChXQVJOX09OKHJlc19wb29sLT5tY19idXMgIT0gbWNfYnVzKSkKKwkJZ290byBlcnJvcjsKKworCW11dGV4X2xvY2soJnJlc19wb29sLT5tdXRleCk7CisJbXV0ZXhfbG9ja2VkID0gdHJ1ZTsKKwlyZXNvdXJjZSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmcmVzX3Bvb2wtPmZyZWVfbGlzdCwKKwkJCQkJICAgIHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UsIG5vZGUpOworCisJaWYgKCFyZXNvdXJjZSkgeworCQlXQVJOX09OKHJlc19wb29sLT5mcmVlX2NvdW50ICE9IDApOworCQllcnJvciA9IC1FTlhJTzsKKwkJZGV2X2VycigmbWNfYnVzX2Rldi0+ZGV2LAorCQkJIk5vIG1vcmUgcmVzb3VyY2VzIG9mIHR5cGUgJXMgbGVmdFxuIiwKKwkJCWZzbF9tY19wb29sX3R5cGVfc3RyaW5nc1twb29sX3R5cGVdKTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoV0FSTl9PTihyZXNvdXJjZS0+dHlwZSAhPSBwb29sX3R5cGUpKQorCQlnb3RvIGVycm9yOworCWlmIChXQVJOX09OKHJlc291cmNlLT5wYXJlbnRfcG9vbCAhPSByZXNfcG9vbCkpCisJCWdvdG8gZXJyb3I7CisJaWYgKFdBUk5fT04ocmVzX3Bvb2wtPmZyZWVfY291bnQgPD0gMCB8fAorCQkgICAgcmVzX3Bvb2wtPmZyZWVfY291bnQgPiByZXNfcG9vbC0+bWF4X2NvdW50KSkKKwkJZ290byBlcnJvcjsKKworCWxpc3RfZGVsKCZyZXNvdXJjZS0+bm9kZSk7CisJSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlLT5ub2RlKTsKKworCXJlc19wb29sLT5mcmVlX2NvdW50LS07CisJbXV0ZXhfdW5sb2NrKCZyZXNfcG9vbC0+bXV0ZXgpOworCSpuZXdfcmVzb3VyY2UgPSByZXNvdXJjZTsKKwlyZXR1cm4gMDsKK2Vycm9yOgorCWlmIChtdXRleF9sb2NrZWQpCisJCW11dGV4X3VubG9jaygmcmVzX3Bvb2wtPm11dGV4KTsKKworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZSk7CisKK3ZvaWQgZnNsX21jX3Jlc291cmNlX2ZyZWUoc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2UpCit7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sICpyZXNfcG9vbDsKKwlib29sIG11dGV4X2xvY2tlZCA9IGZhbHNlOworCisJcmVzX3Bvb2wgPSByZXNvdXJjZS0+cGFyZW50X3Bvb2w7CisJaWYgKFdBUk5fT04ocmVzb3VyY2UtPnR5cGUgIT0gcmVzX3Bvb2wtPnR5cGUpKQorCQlnb3RvIG91dDsKKworCW11dGV4X2xvY2soJnJlc19wb29sLT5tdXRleCk7CisJbXV0ZXhfbG9ja2VkID0gdHJ1ZTsKKwlpZiAoV0FSTl9PTihyZXNfcG9vbC0+ZnJlZV9jb3VudCA8IDAgfHwKKwkJICAgIHJlc19wb29sLT5mcmVlX2NvdW50ID49IHJlc19wb29sLT5tYXhfY291bnQpKQorCQlnb3RvIG91dDsKKworCWlmIChXQVJOX09OKCFsaXN0X2VtcHR5KCZyZXNvdXJjZS0+bm9kZSkpKQorCQlnb3RvIG91dDsKKworCWxpc3RfYWRkX3RhaWwoJnJlc291cmNlLT5ub2RlLCAmcmVzX3Bvb2wtPmZyZWVfbGlzdCk7CisJcmVzX3Bvb2wtPmZyZWVfY291bnQrKzsKK291dDoKKwlpZiAobXV0ZXhfbG9ja2VkKQorCQltdXRleF91bmxvY2soJnJlc19wb29sLT5tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcmVzb3VyY2VfZnJlZSk7CisKKy8qKgorICogZnNsX21jX3BvcnRhbF9hbGxvY2F0ZSAtIEFsbG9jYXRlcyBhbiBNQyBwb3J0YWwKKyAqCisgKiBAbWNfZGV2OiBNQyBkZXZpY2UgZm9yIHdoaWNoIHRoZSBNQyBwb3J0YWwgaXMgdG8gYmUgYWxsb2NhdGVkCisgKiBAbWNfaW9fZmxhZ3M6IEZsYWdzIGZvciB0aGUgZnNsX21jX2lvIG9iamVjdCB0aGF0IHdyYXBzIHRoZSBhbGxvY2F0ZWQKKyAqIE1DIHBvcnRhbC4KKyAqIEBuZXdfbWNfaW86IFBvaW50ZXIgdG8gYXJlYSB3aGVyZSB0aGUgcG9pbnRlciB0byB0aGUgZnNsX21jX2lvIG9iamVjdAorICogdGhhdCB3cmFwcyB0aGUgYWxsb2NhdGVkIE1DIHBvcnRhbCBpcyB0byBiZSByZXR1cm5lZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuIE1DIHBvcnRhbCBmcm9tIHRoZSBkZXZpY2UncyBwYXJlbnQgRFBSQywKKyAqIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgTUMgYnVzJyBwb29sIG9mIE1DIHBvcnRhbHMgYW5kIHdyYXBzCisgKiBpdCBpbiBhIG5ldyBmc2xfbWNfaW8gb2JqZWN0LiBJZiAnbWNfZGV2JyBpcyBhIERQUkMgaXRzZWxmLCB0aGUKKyAqIHBvcnRhbCBpcyBhbGxvY2F0ZWQgZnJvbSBpdHMgb3duIE1DIGJ1cy4KKyAqLworaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfcG9ydGFsX2FsbG9jYXRlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCisJCQkJCXVpbnQxNl90IG1jX2lvX2ZsYWdzLAorCQkJCQlzdHJ1Y3QgZnNsX21jX2lvICoqbmV3X21jX2lvKQoreworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2OworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7CisJcGh5c19hZGRyX3QgbWNfcG9ydGFsX3BoeXNfYWRkcjsKKwlzaXplX3QgbWNfcG9ydGFsX3NpemU7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2FkZXY7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7CisJc3RydWN0IGZzbF9tY19pbyAqbWNfaW8gPSBOVUxMOworCisJaWYgKG1jX2Rldi0+ZmxhZ3MgJiBGU0xfTUNfSVNfRFBSQykgeworCQltY19idXNfZGV2ID0gbWNfZGV2OworCX0gZWxzZSB7CisJCWlmIChXQVJOX09OKG1jX2Rldi0+ZGV2LnBhcmVudC0+YnVzICE9ICZmc2xfbWNfYnVzX3R5cGUpKQorCQkJcmV0dXJuIGVycm9yOworCisJCW1jX2J1c19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCk7CisJfQorCisJbWNfYnVzID0gdG9fZnNsX21jX2J1cyhtY19idXNfZGV2KTsKKwkqbmV3X21jX2lvID0gTlVMTDsKKwllcnJvciA9IGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShtY19idXMsIEZTTF9NQ19QT09MX0RQTUNQLCAmcmVzb3VyY2UpOworCWlmIChlcnJvciA8IDApCisJCXJldHVybiBlcnJvcjsKKworCW1jX2FkZXYgPSByZXNvdXJjZS0+ZGF0YTsKKwlpZiAoV0FSTl9PTighbWNfYWRldikpCisJCWdvdG8gZXJyb3JfY2xlYW51cF9yZXNvdXJjZTsKKworCWlmIChXQVJOX09OKG1jX2FkZXYtPm9ial9kZXNjLnJlZ2lvbl9jb3VudCA9PSAwKSkKKwkJZ290byBlcnJvcl9jbGVhbnVwX3Jlc291cmNlOworCisJbWNfcG9ydGFsX3BoeXNfYWRkciA9IG1jX2FkZXYtPnJlZ2lvbnNbMF0uc3RhcnQ7CisJbWNfcG9ydGFsX3NpemUgPSBtY19hZGV2LT5yZWdpb25zWzBdLmVuZCAtCisJCQkgbWNfYWRldi0+cmVnaW9uc1swXS5zdGFydCArIDE7CisKKwlpZiAoV0FSTl9PTihtY19wb3J0YWxfc2l6ZSAhPSBtY19idXNfZGV2LT5tY19pby0+cG9ydGFsX3NpemUpKQorCQlnb3RvIGVycm9yX2NsZWFudXBfcmVzb3VyY2U7CisKKwllcnJvciA9IGZzbF9jcmVhdGVfbWNfaW8oJm1jX2J1c19kZXYtPmRldiwKKwkJCQkgbWNfcG9ydGFsX3BoeXNfYWRkciwKKwkJCQkgbWNfcG9ydGFsX3NpemUsIHJlc291cmNlLAorCQkJCSBtY19pb19mbGFncywgJm1jX2lvKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfcmVzb3VyY2U7CisKKwkqbmV3X21jX2lvID0gbWNfaW87CisJcmV0dXJuIDA7CisKK2Vycm9yX2NsZWFudXBfcmVzb3VyY2U6CisJZnNsX21jX3Jlc291cmNlX2ZyZWUocmVzb3VyY2UpOworCXJldHVybiBlcnJvcjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19wb3J0YWxfYWxsb2NhdGUpOworCisvKioKKyAqIGZzbF9tY19wb3J0YWxfZnJlZSAtIFJldHVybnMgYW4gTUMgcG9ydGFsIHRvIHRoZSBwb29sIG9mIGZyZWUgTUMgcG9ydGFscworICogb2YgYSBnaXZlbiBNQyBidXMKKyAqCisgKiBAbWNfaW86IFBvaW50ZXIgdG8gdGhlIGZzbF9tY19pbyBvYmplY3QgdGhhdCB3cmFwcyB0aGUgTUMgcG9ydGFsIHRvIGZyZWUKKyAqLwordm9pZCBmc2xfbWNfcG9ydGFsX2ZyZWUoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pCit7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7CisKKwlyZXNvdXJjZSA9IG1jX2lvLT5yZXNvdXJjZTsKKwlpZiAoV0FSTl9PTihyZXNvdXJjZS0+dHlwZSAhPSBGU0xfTUNfUE9PTF9EUE1DUCkpCisJCXJldHVybjsKKwlpZiAoV0FSTl9PTighcmVzb3VyY2UtPmRhdGEpKQorCQlyZXR1cm47CisKKwlmc2xfZGVzdHJveV9tY19pbyhtY19pbyk7CisJZnNsX21jX3Jlc291cmNlX2ZyZWUocmVzb3VyY2UpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX21jX3BvcnRhbF9mcmVlKTsKKworLyoqCisgKiBmc2xfbWNfcG9ydGFsX3Jlc2V0IC0gUmVzZXRzIHRoZSBkcG1jcCBvYmplY3QgZm9yIGEgZ2l2ZW4gZnNsX21jX2lvIG9iamVjdAorICoKKyAqIEBtY19pbzogUG9pbnRlciB0byB0aGUgZnNsX21jX2lvIG9iamVjdCB0aGF0IHdyYXBzIHRoZSBNQyBwb3J0YWwgdG8gZnJlZQorICovCitpbnQgZnNsX21jX3BvcnRhbF9yZXNldChzdHJ1Y3QgZnNsX21jX2lvICptY19pbykKK3sKKwlpbnQgZXJyb3I7CisJdWludDE2X3QgdG9rZW47CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2UgPSBtY19pby0+cmVzb3VyY2U7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHJlc291cmNlLT5kYXRhOworCisJaWYgKFdBUk5fT04ocmVzb3VyY2UtPnR5cGUgIT0gRlNMX01DX1BPT0xfRFBNQ1ApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChXQVJOX09OKCFtY19kZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVycm9yID0gZHBtY3Bfb3BlbihtY19pbywgbWNfZGV2LT5vYmpfZGVzYy5pZCwgJnRva2VuKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoJm1jX2Rldi0+ZGV2LCAiZHBtY3Bfb3BlbigpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCWVycm9yID0gZHBtY3BfcmVzZXQobWNfaW8sIHRva2VuKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoJm1jX2Rldi0+ZGV2LCAiZHBtY3BfcmVzZXQoKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwllcnJvciA9IGRwbWNwX2Nsb3NlKG1jX2lvLCB0b2tlbik7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKCZtY19kZXYtPmRldiwgImRwbWNwX2Nsb3NlKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfcG9ydGFsX3Jlc2V0KTsKKworLyoqCisgKiBmc2xfbWNfb2JqZWN0X2FsbG9jYXRlIC0gQWxsb2NhdGVzIGEgTUMgb2JqZWN0IGRldmljZSBvZiB0aGUgZ2l2ZW4KKyAqIHBvb2wgdHlwZSBmcm9tIGEgZ2l2ZW4gTUMgYnVzCisgKgorICogQG1jX2RldjogTUMgZGV2aWNlIGZvciB3aGljaCB0aGUgTUMgb2JqZWN0IGRldmljZSBpcyB0byBiZSBhbGxvY2F0ZWQKKyAqIEBwb29sX3R5cGU6IE1DIGJ1cyByZXNvdXJjZSBwb29sIHR5cGUKKyAqIEBuZXdfbWNfZGV2OiBQb2ludGVyIHRvIGFyZWEgd2hlcmUgdGhlIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZAorICogTUMgb2JqZWN0IGRldmljZSBpcyB0byBiZSByZXR1cm5lZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgTUMgb2JqZWN0IGRldmljZSBmcm9tIHRoZSBkZXZpY2UncyBwYXJlbnQgRFBSQywKKyAqIGZyb20gdGhlIGNvcnJlc3BvbmRpbmcgTUMgYnVzJyBwb29sIG9mIGFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2VzIG9mCisgKiB0aGUgZ2l2ZW4gcmVzb3VyY2UgdHlwZS4gbWNfZGV2IGNhbm5vdCBiZSBhIERQUkMgaXRzZWxmLgorICoKKyAqIE5PVEU6IHBvb2xfdHlwZSBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIEZTTF9NQ19QT09MX01DUCwgc2luY2UgTUMKKyAqIHBvcnRhbHMgYXJlIGFsbG9jYXRlZCB1c2luZyBmc2xfbWNfcG9ydGFsX2FsbG9jYXRlKCksIGluc3RlYWQgb2YKKyAqIHRoaXMgZnVuY3Rpb24uCisgKi8KK2ludCBfX211c3RfY2hlY2sgZnNsX21jX29iamVjdF9hbGxvY2F0ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2LAorCQkJCQllbnVtIGZzbF9tY19wb29sX3R5cGUgcG9vbF90eXBlLAorCQkJCQlzdHJ1Y3QgZnNsX21jX2RldmljZSAqKm5ld19tY19hZGV2KQoreworCXN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19idXNfZGV2OworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXM7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2FkZXY7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7CisKKwkqbmV3X21jX2FkZXYgPSBOVUxMOworCWlmIChXQVJOX09OKG1jX2Rldi0+ZmxhZ3MgJiBGU0xfTUNfSVNfRFBSQykpCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoV0FSTl9PTihtY19kZXYtPmRldi5wYXJlbnQtPmJ1cyAhPSAmZnNsX21jX2J1c190eXBlKSkKKwkJZ290byBlcnJvcjsKKworCWlmIChXQVJOX09OKHBvb2xfdHlwZSA9PSBGU0xfTUNfUE9PTF9EUE1DUCkpCisJCWdvdG8gZXJyb3I7CisKKwltY19idXNfZGV2ID0gdG9fZnNsX21jX2RldmljZShtY19kZXYtPmRldi5wYXJlbnQpOworCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7CisJZXJyb3IgPSBmc2xfbWNfcmVzb3VyY2VfYWxsb2NhdGUobWNfYnVzLCBwb29sX3R5cGUsICZyZXNvdXJjZSk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJvcjsKKworCW1jX2FkZXYgPSByZXNvdXJjZS0+ZGF0YTsKKwlpZiAoV0FSTl9PTighbWNfYWRldikpCisJCWdvdG8gZXJyb3I7CisKKwkqbmV3X21jX2FkZXYgPSBtY19hZGV2OworCXJldHVybiAwOworZXJyb3I6CisJaWYgKHJlc291cmNlKQorCQlmc2xfbWNfcmVzb3VyY2VfZnJlZShyZXNvdXJjZSk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfb2JqZWN0X2FsbG9jYXRlKTsKKworLyoqCisgKiBmc2xfbWNfb2JqZWN0X2ZyZWUgLSBSZXR1cm5zIGFuIGFsbG9jYXRhYmxlIE1DIG9iamVjdCBkZXZpY2UgdG8gdGhlCisgKiBjb3JyZXNwb25kaW5nIHJlc291cmNlIHBvb2wgb2YgYSBnaXZlbiBNQyBidXMuCisgKgorICogQG1jX2FkZXY6IFBvaW50ZXIgdG8gdGhlIE1DIG9iamVjdCBkZXZpY2UKKyAqLwordm9pZCBmc2xfbWNfb2JqZWN0X2ZyZWUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2FkZXYpCit7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7CisKKwlyZXNvdXJjZSA9IG1jX2FkZXYtPnJlc291cmNlOworCWlmIChXQVJOX09OKHJlc291cmNlLT50eXBlID09IEZTTF9NQ19QT09MX0RQTUNQKSkKKwkJcmV0dXJuOworCWlmIChXQVJOX09OKHJlc291cmNlLT5kYXRhICE9IG1jX2FkZXYpKQorCQlyZXR1cm47CisKKwlmc2xfbWNfcmVzb3VyY2VfZnJlZShyZXNvdXJjZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfb2JqZWN0X2ZyZWUpOworCisvKioKKyAqIGZzbF9tY19hbGxvY2F0b3JfcHJvYmUgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYW4gYWxsb2NhdGFibGUgZGV2aWNlIGlzCisgKiBiZWluZyBhZGRlZCB0byB0aGUgc3lzdGVtCisgKi8KK3N0YXRpYyBpbnQgZnNsX21jX2FsbG9jYXRvcl9wcm9iZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQoreworCWVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGU7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXY7CisJc3RydWN0IGZzbF9tY19idXMgKm1jX2J1czsKKwlpbnQgZXJyb3IgPSAtRUlOVkFMOworCisJaWYgKFdBUk5fT04oIUZTTF9NQ19JU19BTExPQ0FUQUJMRShtY19kZXYtPm9ial9kZXNjLnR5cGUpKSkKKwkJZ290byBlcnJvcjsKKworCW1jX2J1c19kZXYgPSB0b19mc2xfbWNfZGV2aWNlKG1jX2Rldi0+ZGV2LnBhcmVudCk7CisJaWYgKFdBUk5fT04obWNfYnVzX2Rldi0+ZGV2LmJ1cyAhPSAmZnNsX21jX2J1c190eXBlKSkKKwkJZ290byBlcnJvcjsKKworCW1jX2J1cyA9IHRvX2ZzbF9tY19idXMobWNfYnVzX2Rldik7CisJZXJyb3IgPSBvYmplY3RfdHlwZV90b19wb29sX3R5cGUobWNfZGV2LT5vYmpfZGVzYy50eXBlLCAmcG9vbF90eXBlKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yOworCisJZXJyb3IgPSBmc2xfbWNfcmVzb3VyY2VfcG9vbF9hZGRfZGV2aWNlKG1jX2J1cywgcG9vbF90eXBlLCBtY19kZXYpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlkZXZfaW5mbygmbWNfZGV2LT5kZXYsCisJCSAiQWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZSBib3VuZCB0byBmc2xfbWNfYWxsb2NhdG9yIGRyaXZlciIpOworCXJldHVybiAwOworZXJyb3I6CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogZnNsX21jX2FsbG9jYXRvcl9yZW1vdmUgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYW4gYWxsb2NhdGFibGUgZGV2aWNlIGlzCisgKiBiZWluZyByZW1vdmVkIGZyb20gdGhlIHN5c3RlbQorICovCitzdGF0aWMgaW50IGZzbF9tY19hbGxvY2F0b3JfcmVtb3ZlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpCit7CisJaW50IGVycm9yID0gLUVJTlZBTDsKKworCWlmIChXQVJOX09OKCFGU0xfTUNfSVNfQUxMT0NBVEFCTEUobWNfZGV2LT5vYmpfZGVzYy50eXBlKSkpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSBmc2xfbWNfcmVzb3VyY2VfcG9vbF9yZW1vdmVfZGV2aWNlKG1jX2Rldik7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKKwlkZXZfaW5mbygmbWNfZGV2LT5kZXYsCisJCSAiQWxsb2NhdGFibGUgTUMgb2JqZWN0IGRldmljZSB1bmJvdW5kIGZyb20gZnNsX21jX2FsbG9jYXRvciBkcml2ZXIiKTsKKwllcnJvciA9IDA7CitvdXQ6CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZzbF9tY19kZXZpY2VfbWF0Y2hfaWQgbWF0Y2hfaWRfdGFibGVbXSA9IHsKKwl7CisJIC52ZW5kb3IgPSBGU0xfTUNfVkVORE9SX0ZSRUVTQ0FMRSwKKwkgLm9ial90eXBlID0gImRwYnAiLAorCSAudmVyX21ham9yID0gRFBCUF9WRVJfTUFKT1IsCisJIC52ZXJfbWlub3IgPSBEUEJQX1ZFUl9NSU5PUgorCX0sCisJeworCSAudmVuZG9yID0gRlNMX01DX1ZFTkRPUl9GUkVFU0NBTEUsCisJIC5vYmpfdHlwZSA9ICJkcG1jcCIsCisJIC52ZXJfbWFqb3IgPSBEUE1DUF9WRVJfTUFKT1IsCisJIC52ZXJfbWlub3IgPSBEUE1DUF9WRVJfTUlOT1IKKwl9LAorCXsKKwkgLnZlbmRvciA9IEZTTF9NQ19WRU5ET1JfRlJFRVNDQUxFLAorCSAub2JqX3R5cGUgPSAiZHBjb24iLAorCSAudmVyX21ham9yID0gRFBDT05fVkVSX01BSk9SLAorCSAudmVyX21pbm9yID0gRFBDT05fVkVSX01JTk9SCisJfSwKKwl7LnZlbmRvciA9IDB4MH0sCit9OworCitzdGF0aWMgc3RydWN0IGZzbF9tY19kcml2ZXIgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAiZnNsX21jX2FsbG9jYXRvciIsCisJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICAucG0gPSBOVUxMLAorCQkgICB9LAorCS5tYXRjaF9pZF90YWJsZSA9IG1hdGNoX2lkX3RhYmxlLAorCS5wcm9iZSA9IGZzbF9tY19hbGxvY2F0b3JfcHJvYmUsCisJLnJlbW92ZSA9IGZzbF9tY19hbGxvY2F0b3JfcmVtb3ZlLAorfTsKKworaW50IF9faW5pdCBmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9pbml0KHZvaWQpCit7CisJcmV0dXJuIGZzbF9tY19kcml2ZXJfcmVnaXN0ZXIoJmZzbF9tY19hbGxvY2F0b3JfZHJpdmVyKTsKK30KKwordm9pZCBfX2V4aXQgZnNsX21jX2FsbG9jYXRvcl9kcml2ZXJfZXhpdCh2b2lkKQoreworCWZzbF9tY19kcml2ZXJfdW5yZWdpc3RlcigmZnNsX21jX2FsbG9jYXRvcl9kcml2ZXIpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYnVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2J1cy9tYy1idXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzUxMmQwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtYnVzLmMKQEAgLTAsMCArMSw3OTMgQEAKKy8qCisgKiBGcmVlc2NhbGUgTWFuYWdlbWVudCBDb21wbGV4IChNQykgYnVzIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgorICogQXV0aG9yOiBHZXJtYW4gUml2ZXJhIDxHZXJtYW4uUml2ZXJhQGZyZWVzY2FsZS5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMi4gVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dCBhbnkKKyAqIHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1wcml2YXRlLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2RwbW5nLmgiCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKKyNpbmNsdWRlICJkcHJjLWNtZC5oIgorCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKm1jX2Rldl9jYWNoZTsKKworLyoqCisgKiBmc2xfbWNfYnVzX21hdGNoIC0gZGV2aWNlIHRvIGRyaXZlciBtYXRjaGluZyBjYWxsYmFjaworICogQGRldjogdGhlIE1DIG9iamVjdCBkZXZpY2Ugc3RydWN0dXJlIHRvIG1hdGNoIGFnYWluc3QKKyAqIEBkcnY6IHRoZSBkZXZpY2UgZHJpdmVyIHRvIHNlYXJjaCBmb3IgbWF0Y2hpbmcgTUMgb2JqZWN0IGRldmljZSBpZAorICogc3RydWN0dXJlcworICoKKyAqIFJldHVybnMgMSBvbiBzdWNjZXNzLCAwIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBmc2xfbWNfYnVzX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9kcml2ZXIgKmRydikKK3sKKwljb25zdCBzdHJ1Y3QgZnNsX21jX2RldmljZV9tYXRjaF9pZCAqaWQ7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKKwlzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJ2ID0gdG9fZnNsX21jX2RyaXZlcihkcnYpOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKwlib29sIG1ham9yX3ZlcnNpb25fbWlzbWF0Y2ggPSBmYWxzZTsKKwlib29sIG1pbm9yX3ZlcnNpb25fbWlzbWF0Y2ggPSBmYWxzZTsKKworCWlmIChXQVJOX09OKCFmc2xfbWNfYnVzX3R5cGUuZGV2X3Jvb3QpKQorCQlnb3RvIG91dDsKKworCWlmICghbWNfZHJ2LT5tYXRjaF9pZF90YWJsZSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIHRoZSBvYmplY3QgaXMgbm90ICdwbHVnZ2VkJyBkb24ndCBtYXRjaC4KKwkgKiBPbmx5IGV4Y2VwdGlvbiBpcyB0aGUgcm9vdCBEUFJDLCB3aGljaCBpcyBhIHNwZWNpYWwgY2FzZS4KKwkgKi8KKwlpZiAoKG1jX2Rldi0+b2JqX2Rlc2Muc3RhdGUgJiBEUFJDX09CSl9TVEFURV9QTFVHR0VEKSA9PSAwICYmCisJICAgICZtY19kZXYtPmRldiAhPSBmc2xfbWNfYnVzX3R5cGUuZGV2X3Jvb3QpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBUcmF2ZXJzZSB0aGUgbWF0Y2hfaWQgdGFibGUgb2YgdGhlIGdpdmVuIGRyaXZlciwgdHJ5aW5nIHRvIGZpbmQKKwkgKiBhIG1hdGNoaW5nIGZvciB0aGUgZ2l2ZW4gTUMgb2JqZWN0IGRldmljZS4KKwkgKi8KKwlmb3IgKGlkID0gbWNfZHJ2LT5tYXRjaF9pZF90YWJsZTsgaWQtPnZlbmRvciAhPSAweDA7IGlkKyspIHsKKwkJaWYgKGlkLT52ZW5kb3IgPT0gbWNfZGV2LT5vYmpfZGVzYy52ZW5kb3IgJiYKKwkJICAgIHN0cmNtcChpZC0+b2JqX3R5cGUsIG1jX2Rldi0+b2JqX2Rlc2MudHlwZSkgPT0gMCkgeworCQkJaWYgKGlkLT52ZXJfbWFqb3IgPT0gbWNfZGV2LT5vYmpfZGVzYy52ZXJfbWFqb3IpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJaWYgKGlkLT52ZXJfbWlub3IgIT0gbWNfZGV2LT5vYmpfZGVzYy52ZXJfbWlub3IpCisJCQkJCW1pbm9yX3ZlcnNpb25fbWlzbWF0Y2ggPSB0cnVlOworCQkJfSBlbHNlIHsKKwkJCQltYWpvcl92ZXJzaW9uX21pc21hdGNoID0gdHJ1ZTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAobWFqb3JfdmVyc2lvbl9taXNtYXRjaCkgeworCQlkZXZfd2FybihkZXYsCisJCQkgIk1ham9yIHZlcnNpb24gbWlzbWF0Y2g6IGRyaXZlciB2ZXJzaW9uICV1LiV1LCBNQyBvYmplY3QgdmVyc2lvbiAldS4ldVxuIiwKKwkJCSBpZC0+dmVyX21ham9yLCBpZC0+dmVyX21pbm9yLAorCQkJIG1jX2Rldi0+b2JqX2Rlc2MudmVyX21ham9yLAorCQkJIG1jX2Rldi0+b2JqX2Rlc2MudmVyX21pbm9yKTsKKwl9IGVsc2UgaWYgKG1pbm9yX3ZlcnNpb25fbWlzbWF0Y2gpIHsKKwkJZGV2X3dhcm4oZGV2LAorCQkJICJNaW5vciB2ZXJzaW9uIG1pc21hdGNoOiBkcml2ZXIgdmVyc2lvbiAldS4ldSwgTUMgb2JqZWN0IHZlcnNpb24gJXUuJXVcbiIsCisJCQkgaWQtPnZlcl9tYWpvciwgaWQtPnZlcl9taW5vciwKKwkJCSBtY19kZXYtPm9ial9kZXNjLnZlcl9tYWpvciwKKwkJCSBtY19kZXYtPm9ial9kZXNjLnZlcl9taW5vcik7CisJfQorCitvdXQ6CisJZGV2X2RiZyhkZXYsICIlc21hdGNoZWRcbiIsIGZvdW5kID8gIiIgOiAibm90ICIpOworCXJldHVybiBmb3VuZDsKK30KKworLyoqCisgKiBmc2xfbWNfYnVzX3VldmVudCAtIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhIGRldmljZSBpcyBhZGRlZAorICovCitzdGF0aWMgaW50IGZzbF9tY19idXNfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCXByX2RlYnVnKCIlcyBpbnZva2VkXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBidXNfdHlwZSBmc2xfbWNfYnVzX3R5cGUgPSB7CisJLm5hbWUgPSAiZnNsLW1jIiwKKwkubWF0Y2ggPSBmc2xfbWNfYnVzX21hdGNoLAorCS51ZXZlbnQgPSBmc2xfbWNfYnVzX3VldmVudCwKK307CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfYnVzX3R5cGUpOworCitzdGF0aWMgaW50IGZzbF9tY19kcml2ZXJfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmc2xfbWNfZHJpdmVyICptY19kcnY7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKKwlpbnQgZXJyb3I7CisKKwlpZiAoV0FSTl9PTighZGV2LT5kcml2ZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1jX2RydiA9IHRvX2ZzbF9tY19kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmIChXQVJOX09OKCFtY19kcnYtPnByb2JlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnJvciA9IG1jX2Rydi0+cHJvYmUobWNfZGV2KTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiTUMgb2JqZWN0IGRldmljZSBwcm9iZSBjYWxsYmFjayBmYWlsZWQ6ICVkXG4iLAorCQkJZXJyb3IpOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNsX21jX2RyaXZlcl9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBmc2xfbWNfZHJpdmVyICptY19kcnYgPSB0b19mc2xfbWNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gdG9fZnNsX21jX2RldmljZShkZXYpOworCWludCBlcnJvcjsKKworCWlmIChXQVJOX09OKCFkZXYtPmRyaXZlcikpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyb3IgPSBtY19kcnYtPnJlbW92ZShtY19kZXYpOworCWlmIChlcnJvciA8IDApIHsKKwkJZGV2X2VycihkZXYsCisJCQkiTUMgb2JqZWN0IGRldmljZSByZW1vdmUgY2FsbGJhY2sgZmFpbGVkOiAlZFxuIiwKKwkJCWVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmc2xfbWNfZHJpdmVyX3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJ2ID0gdG9fZnNsX21jX2RyaXZlcihkZXYtPmRyaXZlcik7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UoZGV2KTsKKworCW1jX2Rydi0+c2h1dGRvd24obWNfZGV2KTsKK30KKworLyoqCisgKiBfX2ZzbF9tY19kcml2ZXJfcmVnaXN0ZXIgLSByZWdpc3RlcnMgYSBjaGlsZCBkZXZpY2UgZHJpdmVyIHdpdGggdGhlCisgKiBNQyBidXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGltcGxpY2l0bHkgaW52b2tlZCBmcm9tIHRoZSByZWdpc3RyYXRpb24gZnVuY3Rpb24gb2YKKyAqIGZzbF9tYyBkZXZpY2UgZHJpdmVycywgd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IHRoZQorICogbW9kdWxlX2ZzbF9tY19kcml2ZXIoKSBtYWNyby4KKyAqLworaW50IF9fZnNsX21jX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJpdmVyLAorCQkJICAgICBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwlpbnQgZXJyb3I7CisKKwltY19kcml2ZXItPmRyaXZlci5vd25lciA9IG93bmVyOworCW1jX2RyaXZlci0+ZHJpdmVyLmJ1cyA9ICZmc2xfbWNfYnVzX3R5cGU7CisKKwlpZiAobWNfZHJpdmVyLT5wcm9iZSkKKwkJbWNfZHJpdmVyLT5kcml2ZXIucHJvYmUgPSBmc2xfbWNfZHJpdmVyX3Byb2JlOworCisJaWYgKG1jX2RyaXZlci0+cmVtb3ZlKQorCQltY19kcml2ZXItPmRyaXZlci5yZW1vdmUgPSBmc2xfbWNfZHJpdmVyX3JlbW92ZTsKKworCWlmIChtY19kcml2ZXItPnNodXRkb3duKQorCQltY19kcml2ZXItPmRyaXZlci5zaHV0ZG93biA9IGZzbF9tY19kcml2ZXJfc2h1dGRvd247CisKKwllcnJvciA9IGRyaXZlcl9yZWdpc3RlcigmbWNfZHJpdmVyLT5kcml2ZXIpOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJfZXJyKCJkcml2ZXJfcmVnaXN0ZXIoKSBmYWlsZWQgZm9yICVzOiAlZFxuIiwKKwkJICAgICAgIG1jX2RyaXZlci0+ZHJpdmVyLm5hbWUsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCXByX2luZm8oIk1DIG9iamVjdCBkZXZpY2UgZHJpdmVyICVzIHJlZ2lzdGVyZWRcbiIsCisJCW1jX2RyaXZlci0+ZHJpdmVyLm5hbWUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19mc2xfbWNfZHJpdmVyX3JlZ2lzdGVyKTsKKworLyoqCisgKiBmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVycyBhIGRldmljZSBkcml2ZXIgZnJvbSB0aGUKKyAqIE1DIGJ1cworICovCit2b2lkIGZzbF9tY19kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3QgZnNsX21jX2RyaXZlciAqbWNfZHJpdmVyKQoreworCWRyaXZlcl91bnJlZ2lzdGVyKCZtY19kcml2ZXItPmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfZHJpdmVyX3VucmVnaXN0ZXIpOworCitzdGF0aWMgaW50IGdldF9kcHJjX2ljaWQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgaW50IGNvbnRhaW5lcl9pZCwgdWludDE2X3QgKmljaWQpCit7CisJdWludDE2X3QgZHByY19oYW5kbGU7CisJc3RydWN0IGRwcmNfYXR0cmlidXRlcyBhdHRyOworCWludCBlcnJvcjsKKworCWVycm9yID0gZHByY19vcGVuKG1jX2lvLCBjb250YWluZXJfaWQsICZkcHJjX2hhbmRsZSk7CisJaWYgKGVycm9yIDwgMCkgeworCQlwcl9lcnIoImRwcmNfb3BlbigpIGZhaWxlZDogJWRcbiIsIGVycm9yKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCW1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKKwllcnJvciA9IGRwcmNfZ2V0X2F0dHJpYnV0ZXMobWNfaW8sIGRwcmNfaGFuZGxlLCAmYXR0cik7CisJaWYgKGVycm9yIDwgMCkgeworCQlwcl9lcnIoImRwcmNfZ2V0X2F0dHJpYnV0ZXMoKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CisJCWdvdG8gY29tbW9uX2NsZWFudXA7CisJfQorCisJKmljaWQgPSBhdHRyLmljaWQ7CisJZXJyb3IgPSAwOworCitjb21tb25fY2xlYW51cDoKKwkodm9pZClkcHJjX2Nsb3NlKG1jX2lvLCBkcHJjX2hhbmRsZSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgaW50IHRyYW5zbGF0ZV9tY19hZGRyKHVpbnQ2NF90IG1jX2FkZHIsIHBoeXNfYWRkcl90ICpwaHlzX2FkZHIpCit7CisJaW50IGk7CisJc3RydWN0IGZzbF9tYyAqbWMgPSBkZXZfZ2V0X2RydmRhdGEoZnNsX21jX2J1c190eXBlLmRldl9yb290LT5wYXJlbnQpOworCisJaWYgKG1jLT5udW1fdHJhbnNsYXRpb25fcmFuZ2VzID09IDApIHsKKwkJLyoKKwkJICogRG8gaWRlbnRpdHkgbWFwcGluZzoKKwkJICovCisJCSpwaHlzX2FkZHIgPSBtY19hZGRyOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbWMtPm51bV90cmFuc2xhdGlvbl9yYW5nZXM7IGkrKykgeworCQlzdHJ1Y3QgZnNsX21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2UgKnJhbmdlID0KKwkJCSZtYy0+dHJhbnNsYXRpb25fcmFuZ2VzW2ldOworCisJCWlmIChtY19hZGRyID49IHJhbmdlLT5zdGFydF9tY19hZGRyICYmCisJCSAgICBtY19hZGRyIDwgcmFuZ2UtPmVuZF9tY19hZGRyKSB7CisJCQkqcGh5c19hZGRyID0gcmFuZ2UtPnN0YXJ0X3BoeXNfYWRkciArCisJCQkJICAgICAobWNfYWRkciAtIHJhbmdlLT5zdGFydF9tY19hZGRyKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBpbnQgZnNsX21jX2RldmljZV9nZXRfbW1pb19yZWdpb25zKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCisJCQkJCSAgc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYpCit7CisJaW50IGk7CisJaW50IGVycm9yOworCXN0cnVjdCByZXNvdXJjZSAqcmVnaW9uczsKKwlzdHJ1Y3QgZHByY19vYmpfZGVzYyAqb2JqX2Rlc2MgPSAmbWNfZGV2LT5vYmpfZGVzYzsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnRfZGV2ID0gbWNfZGV2LT5kZXYucGFyZW50OworCisJcmVnaW9ucyA9IGttYWxsb2NfYXJyYXkob2JqX2Rlc2MtPnJlZ2lvbl9jb3VudCwKKwkJCQlzaXplb2YocmVnaW9uc1swXSksIEdGUF9LRVJORUwpOworCWlmICghcmVnaW9ucykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgb2JqX2Rlc2MtPnJlZ2lvbl9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBkcHJjX3JlZ2lvbl9kZXNjIHJlZ2lvbl9kZXNjOworCisJCWVycm9yID0gZHByY19nZXRfb2JqX3JlZ2lvbihtY19idXNfZGV2LT5tY19pbywKKwkJCQkJICAgIG1jX2J1c19kZXYtPm1jX2hhbmRsZSwKKwkJCQkJICAgIG9ial9kZXNjLT50eXBlLAorCQkJCQkgICAgb2JqX2Rlc2MtPmlkLCBpLCAmcmVnaW9uX2Rlc2MpOworCQlpZiAoZXJyb3IgPCAwKSB7CisJCQlkZXZfZXJyKHBhcmVudF9kZXYsCisJCQkJImRwcmNfZ2V0X29ial9yZWdpb24oKSBmYWlsZWQ6ICVkXG4iLCBlcnJvcik7CisJCQlnb3RvIGVycm9yX2NsZWFudXBfcmVnaW9uczsKKwkJfQorCisJCVdBUk5fT04ocmVnaW9uX2Rlc2MuYmFzZV9wYWRkciA9PSAweDApOworCQlXQVJOX09OKHJlZ2lvbl9kZXNjLnNpemUgPT0gMCk7CisJCWVycm9yID0gdHJhbnNsYXRlX21jX2FkZHIocmVnaW9uX2Rlc2MuYmFzZV9wYWRkciwKKwkJCQkJICAmcmVnaW9uc1tpXS5zdGFydCk7CisJCWlmIChlcnJvciA8IDApIHsKKwkJCWRldl9lcnIocGFyZW50X2RldiwKKwkJCQkiSW52YWxpZCBNQyBhZGRyZXNzOiAlI2xseFxuIiwKKwkJCQlyZWdpb25fZGVzYy5iYXNlX3BhZGRyKTsKKwkJCWdvdG8gZXJyb3JfY2xlYW51cF9yZWdpb25zOworCQl9CisKKwkJcmVnaW9uc1tpXS5lbmQgPSByZWdpb25zW2ldLnN0YXJ0ICsgcmVnaW9uX2Rlc2Muc2l6ZSAtIDE7CisJCXJlZ2lvbnNbaV0ubmFtZSA9ICJmc2wtbWMgb2JqZWN0IE1NSU8gcmVnaW9uIjsKKwkJcmVnaW9uc1tpXS5mbGFncyA9IElPUkVTT1VSQ0VfSU87CisJfQorCisJbWNfZGV2LT5yZWdpb25zID0gcmVnaW9uczsKKwlyZXR1cm4gMDsKKworZXJyb3JfY2xlYW51cF9yZWdpb25zOgorCWtmcmVlKHJlZ2lvbnMpOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBBZGQgYSBuZXdseSBkaXNjb3ZlcmVkIE1DIG9iamVjdCBkZXZpY2UgdG8gYmUgdmlzaWJsZSBpbiBMaW51eAorICovCitpbnQgZnNsX21jX2RldmljZV9hZGQoc3RydWN0IGRwcmNfb2JqX2Rlc2MgKm9ial9kZXNjLAorCQkgICAgICBzdHJ1Y3QgZnNsX21jX2lvICptY19pbywKKwkJICAgICAgc3RydWN0IGRldmljZSAqcGFyZW50X2RldiwKKwkJICAgICAgc3RydWN0IGZzbF9tY19kZXZpY2UgKipuZXdfbWNfZGV2KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzID0gTlVMTDsKKwlzdHJ1Y3QgZnNsX21jX2RldmljZSAqcGFyZW50X21jX2RldjsKKworCWlmIChwYXJlbnRfZGV2LT5idXMgPT0gJmZzbF9tY19idXNfdHlwZSkKKwkJcGFyZW50X21jX2RldiA9IHRvX2ZzbF9tY19kZXZpY2UocGFyZW50X2Rldik7CisJZWxzZQorCQlwYXJlbnRfbWNfZGV2ID0gTlVMTDsKKworCWlmIChzdHJjbXAob2JqX2Rlc2MtPnR5cGUsICJkcHJjIikgPT0gMCkgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBhbiBNQyBidXMgZGV2aWNlIG9iamVjdDoKKwkJICovCisJCW1jX2J1cyA9IGRldm1fa3phbGxvYyhwYXJlbnRfZGV2LCBzaXplb2YoKm1jX2J1cyksIEdGUF9LRVJORUwpOworCQlpZiAoIW1jX2J1cykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW1jX2RldiA9ICZtY19idXMtPm1jX2RldjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBBbGxvY2F0ZSBhIHJlZ3VsYXIgZnNsX21jX2RldmljZSBvYmplY3Q6CisJCSAqLworCQltY19kZXYgPSBrbWVtX2NhY2hlX3phbGxvYyhtY19kZXZfY2FjaGUsIEdGUF9LRVJORUwpOworCQlpZiAoIW1jX2RldikKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1jX2Rldi0+b2JqX2Rlc2MgPSAqb2JqX2Rlc2M7CisJbWNfZGV2LT5tY19pbyA9IG1jX2lvOworCWRldmljZV9pbml0aWFsaXplKCZtY19kZXYtPmRldik7CisJbWNfZGV2LT5kZXYucGFyZW50ID0gcGFyZW50X2RldjsKKwltY19kZXYtPmRldi5idXMgPSAmZnNsX21jX2J1c190eXBlOworCWRldl9zZXRfbmFtZSgmbWNfZGV2LT5kZXYsICIlcy4lZCIsIG9ial9kZXNjLT50eXBlLCBvYmpfZGVzYy0+aWQpOworCisJaWYgKHN0cmNtcChvYmpfZGVzYy0+dHlwZSwgImRwcmMiKSA9PSAwKSB7CisJCXN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvMjsKKworCQltY19kZXYtPmZsYWdzIHw9IEZTTF9NQ19JU19EUFJDOworCisJCS8qCisJCSAqIFRvIGdldCB0aGUgRFBSQydzIElDSUQsIHdlIG5lZWQgdG8gb3BlbiB0aGUgRFBSQworCQkgKiBpbiBnZXRfZHByY19pY2lkKCkuIEZvciBjaGlsZCBEUFJDcywgd2UgZG8gc28gdXNpbmcgdGhlCisJCSAqIHBhcmVudCBEUFJDJ3MgTUMgcG9ydGFsIGluc3RlYWQgb2YgdGhlIGNoaWxkIERQUkMncyBNQworCQkgKiBwb3J0YWwsIGluIGNhc2UgdGhlIGNoaWxkIERQUkMgaXMgYWxyZWFkeSBvcGVuZWQgd2l0aAorCQkgKiBpdHMgb3duIHBvcnRhbCAoZS5nLiwgdGhlIERQUkMgdXNlZCBieSBBSU9QKS4KKwkJICoKKwkJICogTk9URTogVGhlcmUgY2Fubm90IGJlIG1vcmUgdGhhbiBvbmUgYWN0aXZlIG9wZW4gZm9yIGEKKwkJICogZ2l2ZW4gTUMgb2JqZWN0LCB1c2luZyB0aGUgc2FtZSBNQyBwb3J0YWwuCisJCSAqLworCQlpZiAocGFyZW50X21jX2RldikgeworCQkJLyoKKwkJCSAqIGRldmljZSBiZWluZyBhZGRlZCBpcyBhIGNoaWxkIERQUkMgZGV2aWNlCisJCQkgKi8KKwkJCW1jX2lvMiA9IHBhcmVudF9tY19kZXYtPm1jX2lvOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGRldmljZSBiZWluZyBhZGRlZCBpcyB0aGUgcm9vdCBEUFJDIGRldmljZQorCQkJICovCisJCQlpZiAoV0FSTl9PTighbWNfaW8pKSB7CisJCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyb3JfY2xlYW51cF9kZXY7CisJCQl9CisKKwkJCW1jX2lvMiA9IG1jX2lvOworCisJCQlpZiAoIWZzbF9tY19idXNfdHlwZS5kZXZfcm9vdCkKKwkJCQlmc2xfbWNfYnVzX3R5cGUuZGV2X3Jvb3QgPSAmbWNfZGV2LT5kZXY7CisJCX0KKworCQllcnJvciA9IGdldF9kcHJjX2ljaWQobWNfaW8yLCBvYmpfZGVzYy0+aWQsICZtY19kZXYtPmljaWQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBlcnJvcl9jbGVhbnVwX2RldjsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBBIG5vbi1EUFJDIE1DIG9iamVjdCBkZXZpY2UgaGFzIHRvIGJlIGEgY2hpbGQgb2YgYW5vdGhlcgorCQkgKiBNQyBvYmplY3QgKHNwZWNpZmljYWxseSBhIERQUkMgb2JqZWN0KQorCQkgKi8KKwkJbWNfZGV2LT5pY2lkID0gcGFyZW50X21jX2Rldi0+aWNpZDsKKwkJbWNfZGV2LT5kbWFfbWFzayA9IEZTTF9NQ19ERUZBVUxUX0RNQV9NQVNLOworCQltY19kZXYtPmRldi5kbWFfbWFzayA9ICZtY19kZXYtPmRtYV9tYXNrOworCX0KKworCS8qCisJICogR2V0IE1NSU8gcmVnaW9ucyBmb3IgdGhlIGRldmljZSBmcm9tIHRoZSBNQzoKKwkgKgorCSAqIE5PVEU6IHRoZSByb290IERQUkMgaXMgYSBzcGVjaWFsIGNhc2UgYXMgaXRzIE1NSU8gcmVnaW9uIGlzCisJICogb2J0YWluZWQgZnJvbSB0aGUgZGV2aWNlIHRyZWUKKwkgKi8KKwlpZiAocGFyZW50X21jX2RldiAmJiBvYmpfZGVzYy0+cmVnaW9uX2NvdW50ICE9IDApIHsKKwkJZXJyb3IgPSBmc2xfbWNfZGV2aWNlX2dldF9tbWlvX3JlZ2lvbnMobWNfZGV2LAorCQkJCQkJICAgICAgIHBhcmVudF9tY19kZXYpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJZ290byBlcnJvcl9jbGVhbnVwX2RldjsKKwl9CisKKwkvKgorCSAqIFRoZSBkZXZpY2Utc3BlY2lmaWMgcHJvYmUgY2FsbGJhY2sgd2lsbCBnZXQgaW52b2tlZCBieSBkZXZpY2VfYWRkKCkKKwkgKi8KKwllcnJvciA9IGRldmljZV9hZGQoJm1jX2Rldi0+ZGV2KTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIocGFyZW50X2RldiwKKwkJCSJkZXZpY2VfYWRkKCkgZmFpbGVkIGZvciBkZXZpY2UgJXM6ICVkXG4iLAorCQkJZGV2X25hbWUoJm1jX2Rldi0+ZGV2KSwgZXJyb3IpOworCQlnb3RvIGVycm9yX2NsZWFudXBfZGV2OworCX0KKworCSh2b2lkKWdldF9kZXZpY2UoJm1jX2Rldi0+ZGV2KTsKKwlkZXZfZGJnKHBhcmVudF9kZXYsICJBZGRlZCBNQyBvYmplY3QgZGV2aWNlICVzXG4iLAorCQlkZXZfbmFtZSgmbWNfZGV2LT5kZXYpKTsKKworCSpuZXdfbWNfZGV2ID0gbWNfZGV2OworCXJldHVybiAwOworCitlcnJvcl9jbGVhbnVwX2RldjoKKwlrZnJlZShtY19kZXYtPnJlZ2lvbnMpOworCWlmIChtY19idXMpCisJCWRldm1fa2ZyZWUocGFyZW50X2RldiwgbWNfYnVzKTsKKwllbHNlCisJCWttZW1fY2FjaGVfZnJlZShtY19kZXZfY2FjaGUsIG1jX2Rldik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmc2xfbWNfZGV2aWNlX2FkZCk7CisKKy8qKgorICogZnNsX21jX2RldmljZV9yZW1vdmUgLSBSZW1vdmUgYSBNQyBvYmplY3QgZGV2aWNlIGZyb20gYmVpbmcgdmlzaWJsZSB0bworICogTGludXgKKyAqCisgKiBAbWNfZGV2OiBQb2ludGVyIHRvIGEgTUMgb2JqZWN0IGRldmljZSBvYmplY3QKKyAqLwordm9pZCBmc2xfbWNfZGV2aWNlX3JlbW92ZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfZGV2KQoreworCXN0cnVjdCBmc2xfbWNfYnVzICptY19idXMgPSBOVUxMOworCisJa2ZyZWUobWNfZGV2LT5yZWdpb25zKTsKKworCS8qCisJICogVGhlIGRldmljZS1zcGVjaWZpYyByZW1vdmUgY2FsbGJhY2sgd2lsbCBnZXQgaW52b2tlZCBieSBkZXZpY2VfZGVsKCkKKwkgKi8KKwlkZXZpY2VfZGVsKCZtY19kZXYtPmRldik7CisJcHV0X2RldmljZSgmbWNfZGV2LT5kZXYpOworCisJaWYgKHN0cmNtcChtY19kZXYtPm9ial9kZXNjLnR5cGUsICJkcHJjIikgPT0gMCkgeworCQltY19idXMgPSB0b19mc2xfbWNfYnVzKG1jX2Rldik7CisJCWlmIChtY19kZXYtPm1jX2lvKSB7CisJCQlmc2xfZGVzdHJveV9tY19pbyhtY19kZXYtPm1jX2lvKTsKKwkJCW1jX2Rldi0+bWNfaW8gPSBOVUxMOworCQl9CisKKwkJaWYgKCZtY19kZXYtPmRldiA9PSBmc2xfbWNfYnVzX3R5cGUuZGV2X3Jvb3QpCisJCQlmc2xfbWNfYnVzX3R5cGUuZGV2X3Jvb3QgPSBOVUxMOworCX0KKworCWlmIChtY19idXMpCisJCWRldm1fa2ZyZWUobWNfZGV2LT5kZXYucGFyZW50LCBtY19idXMpOworCWVsc2UKKwkJa21lbV9jYWNoZV9mcmVlKG1jX2Rldl9jYWNoZSwgbWNfZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9tY19kZXZpY2VfcmVtb3ZlKTsKKworc3RhdGljIGludCBwYXJzZV9tY19yYW5nZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgaW50ICpwYWRkcl9jZWxscywKKwkJCSAgIGludCAqbWNfYWRkcl9jZWxscywKKwkJCSAgIGludCAqbWNfc2l6ZV9jZWxscywKKwkJCSAgIGNvbnN0IF9fYmUzMiAqKnJhbmdlc19zdGFydCwKKwkJCSAgIHVpbnQ4X3QgKm51bV9yYW5nZXMpCit7CisJY29uc3QgX19iZTMyICpwcm9wOworCWludCByYW5nZV90dXBsZV9jZWxsX2NvdW50OworCWludCByYW5nZXNfbGVuOworCWludCB0dXBsZV9sZW47CisJc3RydWN0IGRldmljZV9ub2RlICptY19ub2RlID0gZGV2LT5vZl9ub2RlOworCisJKnJhbmdlc19zdGFydCA9IG9mX2dldF9wcm9wZXJ0eShtY19ub2RlLCAicmFuZ2VzIiwgJnJhbmdlc19sZW4pOworCWlmICghKCpyYW5nZXNfc3RhcnQpIHx8ICFyYW5nZXNfbGVuKSB7CisJCWRldl93YXJuKGRldiwKKwkJCSAibWlzc2luZyBvciBlbXB0eSByYW5nZXMgcHJvcGVydHkgZm9yIGRldmljZSB0cmVlIG5vZGUgJyVzJ1xuIiwKKwkJCSBtY19ub2RlLT5uYW1lKTsKKworCQkqbnVtX3JhbmdlcyA9IDA7CisJCXJldHVybiAwOworCX0KKworCSpwYWRkcl9jZWxscyA9IG9mX25fYWRkcl9jZWxscyhtY19ub2RlKTsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobWNfbm9kZSwgIiNhZGRyZXNzLWNlbGxzIiwgTlVMTCk7CisJaWYgKHByb3ApCisJCSptY19hZGRyX2NlbGxzID0gYmUzMl90b19jcHVwKHByb3ApOworCWVsc2UKKwkJKm1jX2FkZHJfY2VsbHMgPSAqcGFkZHJfY2VsbHM7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG1jX25vZGUsICIjc2l6ZS1jZWxscyIsIE5VTEwpOworCWlmIChwcm9wKQorCQkqbWNfc2l6ZV9jZWxscyA9IGJlMzJfdG9fY3B1cChwcm9wKTsKKwllbHNlCisJCSptY19zaXplX2NlbGxzID0gb2Zfbl9zaXplX2NlbGxzKG1jX25vZGUpOworCisJcmFuZ2VfdHVwbGVfY2VsbF9jb3VudCA9ICpwYWRkcl9jZWxscyArICptY19hZGRyX2NlbGxzICsKKwkJCQkgKm1jX3NpemVfY2VsbHM7CisKKwl0dXBsZV9sZW4gPSByYW5nZV90dXBsZV9jZWxsX2NvdW50ICogc2l6ZW9mKF9fYmUzMik7CisJaWYgKHJhbmdlc19sZW4gJSB0dXBsZV9sZW4gIT0gMCkgeworCQlkZXZfZXJyKGRldiwgIm1hbGZvcm1lZCByYW5nZXMgcHJvcGVydHkgJyVzJ1xuIiwgbWNfbm9kZS0+bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCSpudW1fcmFuZ2VzID0gcmFuZ2VzX2xlbiAvIHR1cGxlX2xlbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgIHN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZQorCQkJCQkJKipyYW5nZXMsCisJCQkJCSAgdWludDhfdCAqbnVtX3JhbmdlcykKK3sKKwlpbnQgZXJyb3I7CisJaW50IHBhZGRyX2NlbGxzOworCWludCBtY19hZGRyX2NlbGxzOworCWludCBtY19zaXplX2NlbGxzOworCWludCBpOworCWNvbnN0IF9fYmUzMiAqcmFuZ2VzX3N0YXJ0OworCWNvbnN0IF9fYmUzMiAqY2VsbDsKKworCWVycm9yID0gcGFyc2VfbWNfcmFuZ2VzKGRldiwKKwkJCQkmcGFkZHJfY2VsbHMsCisJCQkJJm1jX2FkZHJfY2VsbHMsCisJCQkJJm1jX3NpemVfY2VsbHMsCisJCQkJJnJhbmdlc19zdGFydCwKKwkJCQludW1fcmFuZ2VzKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoISgqbnVtX3JhbmdlcykpIHsKKwkJLyoKKwkJICogTWlzc2luZyBvciBlbXB0eSByYW5nZXMgcHJvcGVydHkgKCJyYW5nZXM7IikgZm9yIHRoZQorCQkgKiAnZnNsLHFvcmlxLW1jJyBub2RlLiBJbiB0aGlzIGNhc2UsIGlkZW50aXR5IG1hcHBpbmcKKwkJICogd2lsbCBiZSB1c2VkLgorCQkgKi8KKwkJKnJhbmdlcyA9IE5VTEw7CisJCXJldHVybiAwOworCX0KKworCSpyYW5nZXMgPSBkZXZtX2tjYWxsb2MoZGV2LCAqbnVtX3JhbmdlcywKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlKSwKKwkJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoISgqcmFuZ2VzKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljZWxsID0gcmFuZ2VzX3N0YXJ0OworCWZvciAoaSA9IDA7IGkgPCAqbnVtX3JhbmdlczsgKytpKSB7CisJCXN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSAqcmFuZ2UgPSAmKCpyYW5nZXMpW2ldOworCisJCXJhbmdlLT5zdGFydF9tY19hZGRyID0gb2ZfcmVhZF9udW1iZXIoY2VsbCwgbWNfYWRkcl9jZWxscyk7CisJCWNlbGwgKz0gbWNfYWRkcl9jZWxsczsKKwkJcmFuZ2UtPnN0YXJ0X3BoeXNfYWRkciA9IG9mX3JlYWRfbnVtYmVyKGNlbGwsIHBhZGRyX2NlbGxzKTsKKwkJY2VsbCArPSBwYWRkcl9jZWxsczsKKwkJcmFuZ2UtPmVuZF9tY19hZGRyID0gcmFuZ2UtPnN0YXJ0X21jX2FkZHIgKworCQkJCSAgICAgb2ZfcmVhZF9udW1iZXIoY2VsbCwgbWNfc2l6ZV9jZWxscyk7CisKKwkJY2VsbCArPSBtY19zaXplX2NlbGxzOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIGZzbF9tY19idXNfcHJvYmUgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHJvb3QgTUMgYnVzIGlzIGJlaW5nCisgKiBhZGRlZAorICovCitzdGF0aWMgaW50IGZzbF9tY19idXNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZHByY19vYmpfZGVzYyBvYmpfZGVzYzsKKwlpbnQgZXJyb3I7CisJc3RydWN0IGZzbF9tYyAqbWM7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2J1c19kZXYgPSBOVUxMOworCXN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvID0gTlVMTDsKKwlpbnQgY29udGFpbmVyX2lkOworCXBoeXNfYWRkcl90IG1jX3BvcnRhbF9waHlzX2FkZHI7CisJdWludDMyX3QgbWNfcG9ydGFsX3NpemU7CisJc3RydWN0IG1jX3ZlcnNpb24gbWNfdmVyc2lvbjsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIlJvb3QgTUMgYnVzIGRldmljZSBwcm9iZWQiKTsKKworCW1jID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1jKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1jKTsKKworCS8qCisJICogR2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgTUMgcG9ydGFsIGZvciB0aGUgcm9vdCBEUFJDOgorCSAqLworCWVycm9yID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShwZGV2LT5kZXYub2Zfbm9kZSwgMCwgJnJlcyk7CisJaWYgKGVycm9yIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkib2ZfYWRkcmVzc190b19yZXNvdXJjZSgpIGZhaWxlZCBmb3IgJXNcbiIsCisJCQlwZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIGVycm9yOworCX0KKworCW1jX3BvcnRhbF9waHlzX2FkZHIgPSByZXMuc3RhcnQ7CisJbWNfcG9ydGFsX3NpemUgPSByZXNvdXJjZV9zaXplKCZyZXMpOworCWVycm9yID0gZnNsX2NyZWF0ZV9tY19pbygmcGRldi0+ZGV2LCBtY19wb3J0YWxfcGh5c19hZGRyLAorCQkJCSBtY19wb3J0YWxfc2l6ZSwgTlVMTCwgMCwgJm1jX2lvKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IG1jX2dldF92ZXJzaW9uKG1jX2lvLCAmbWNfdmVyc2lvbik7CisJaWYgKGVycm9yICE9IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIm1jX2dldF92ZXJzaW9uKCkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIGVycm9yKTsKKwkJZ290byBlcnJvcl9jbGVhbnVwX21jX2lvOworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCSAiRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCBGaXJtd2FyZSB2ZXJzaW9uOiAldS4ldS4ldVxuIiwKKwkJIG1jX3ZlcnNpb24ubWFqb3IsIG1jX3ZlcnNpb24ubWlub3IsIG1jX3ZlcnNpb24ucmV2aXNpb24pOworCisJaWYgKG1jX3ZlcnNpb24ubWFqb3IgPCBNQ19WRVJfTUFKT1IpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkVSUk9SOiBNQyBmaXJtd2FyZSB2ZXJzaW9uIG5vdCBzdXBwb3J0ZWQgYnkgZHJpdmVyIChkcml2ZXIgdmVyc2lvbjogJXUuJXUpXG4iLAorCQkJTUNfVkVSX01BSk9SLCBNQ19WRVJfTUlOT1IpOworCQllcnJvciA9IC1FTk9UU1VQUDsKKwkJZ290byBlcnJvcl9jbGVhbnVwX21jX2lvOworCX0KKworCWlmIChtY192ZXJzaW9uLm1ham9yID4gTUNfVkVSX01BSk9SKSB7CisJCWRldl93YXJuKCZwZGV2LT5kZXYsCisJCQkgIldBUk5JTkc6IGRyaXZlciBtYXkgbm90IHN1cHBvcnQgbmV3ZXIgTUMgZmlybXdhcmUgZmVhdHVyZXMgKGRyaXZlciB2ZXJzaW9uOiAldS4ldSlcbiIsCisJCQkgTUNfVkVSX01BSk9SLCBNQ19WRVJfTUlOT1IpOworCX0KKworCWVycm9yID0gZ2V0X21jX2FkZHJfdHJhbnNsYXRpb25fcmFuZ2VzKCZwZGV2LT5kZXYsCisJCQkJCSAgICAgICAmbWMtPnRyYW5zbGF0aW9uX3JhbmdlcywKKwkJCQkJICAgICAgICZtYy0+bnVtX3RyYW5zbGF0aW9uX3Jhbmdlcyk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBlcnJvcl9jbGVhbnVwX21jX2lvOworCisJZXJyb3IgPSBkcG1uZ19nZXRfY29udGFpbmVyX2lkKG1jX2lvLCAmY29udGFpbmVyX2lkKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJkcG1uZ19nZXRfY29udGFpbmVyX2lkKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGVycm9yX2NsZWFudXBfbWNfaW87CisJfQorCisJb2JqX2Rlc2MudmVuZG9yID0gRlNMX01DX1ZFTkRPUl9GUkVFU0NBTEU7CisJc3RyY3B5KG9ial9kZXNjLnR5cGUsICJkcHJjIik7CisJb2JqX2Rlc2MuaWQgPSBjb250YWluZXJfaWQ7CisJb2JqX2Rlc2MudmVyX21ham9yID0gRFBSQ19WRVJfTUFKT1I7CisJb2JqX2Rlc2MudmVyX21pbm9yID0gRFBSQ19WRVJfTUlOT1I7CisJb2JqX2Rlc2MucmVnaW9uX2NvdW50ID0gMDsKKworCWVycm9yID0gZnNsX21jX2RldmljZV9hZGQoJm9ial9kZXNjLCBtY19pbywgJnBkZXYtPmRldiwgJm1jX2J1c19kZXYpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyb3JfY2xlYW51cF9tY19pbzsKKworCW1jLT5yb290X21jX2J1c19kZXYgPSBtY19idXNfZGV2OworCXJldHVybiAwOworCitlcnJvcl9jbGVhbnVwX21jX2lvOgorCWZzbF9kZXN0cm95X21jX2lvKG1jX2lvKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogZnNsX21jX2J1c19yZW1vdmUgLSBjYWxsYmFjayBpbnZva2VkIHdoZW4gdGhlIHJvb3QgTUMgYnVzIGlzIGJlaW5nCisgKiByZW1vdmVkCisgKi8KK3N0YXRpYyBpbnQgZnNsX21jX2J1c19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZnNsX21jICptYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKFdBUk5fT04oJm1jLT5yb290X21jX2J1c19kZXYtPmRldiAhPSBmc2xfbWNfYnVzX3R5cGUuZGV2X3Jvb3QpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZzbF9tY19kZXZpY2VfcmVtb3ZlKG1jLT5yb290X21jX2J1c19kZXYpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJSb290IE1DIGJ1cyBkZXZpY2UgcmVtb3ZlZCIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmc2xfbWNfYnVzX21hdGNoX3RhYmxlW10gPSB7CisJey5jb21wYXRpYmxlID0gImZzbCxxb3JpcS1tYyIsfSwKKwl7fSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGZzbF9tY19idXNfbWF0Y2hfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmc2xfbWNfYnVzX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkgICAubmFtZSA9ICJmc2xfbWNfYnVzIiwKKwkJICAgLm93bmVyID0gVEhJU19NT0RVTEUsCisJCSAgIC5wbSA9IE5VTEwsCisJCSAgIC5vZl9tYXRjaF90YWJsZSA9IGZzbF9tY19idXNfbWF0Y2hfdGFibGUsCisJCSAgIH0sCisJLnByb2JlID0gZnNsX21jX2J1c19wcm9iZSwKKwkucmVtb3ZlID0gZnNsX21jX2J1c19yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBmc2xfbWNfYnVzX2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IGVycm9yOworCisJbWNfZGV2X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoImZzbF9tY19kZXZpY2UiLAorCQkJCQkgc2l6ZW9mKHN0cnVjdCBmc2xfbWNfZGV2aWNlKSwgMCwgMCwKKwkJCQkJIE5VTEwpOworCWlmICghbWNfZGV2X2NhY2hlKSB7CisJCXByX2VycigiQ291bGQgbm90IGNyZWF0ZSBmc2xfbWNfZGV2aWNlIGNhY2hlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZXJyb3IgPSBidXNfcmVnaXN0ZXIoJmZzbF9tY19idXNfdHlwZSk7CisJaWYgKGVycm9yIDwgMCkgeworCQlwcl9lcnIoImZzbC1tYyBidXMgdHlwZSByZWdpc3RyYXRpb24gZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGVycm9yX2NsZWFudXBfY2FjaGU7CisJfQorCisJcHJfaW5mbygiZnNsLW1jIGJ1cyB0eXBlIHJlZ2lzdGVyZWRcbiIpOworCisJZXJyb3IgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZzbF9tY19idXNfZHJpdmVyKTsKKwlpZiAoZXJyb3IgPCAwKSB7CisJCXByX2VycigicGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCkgZmFpbGVkOiAlZFxuIiwgZXJyb3IpOworCQlnb3RvIGVycm9yX2NsZWFudXBfYnVzOworCX0KKworCWVycm9yID0gZHByY19kcml2ZXJfaW5pdCgpOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gZXJyb3JfY2xlYW51cF9kcml2ZXI7CisKKwllcnJvciA9IGZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2luaXQoKTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycm9yX2NsZWFudXBfZHByY19kcml2ZXI7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfY2xlYW51cF9kcHJjX2RyaXZlcjoKKwlkcHJjX2RyaXZlcl9leGl0KCk7CisKK2Vycm9yX2NsZWFudXBfZHJpdmVyOgorCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmc2xfbWNfYnVzX2RyaXZlcik7CisKK2Vycm9yX2NsZWFudXBfYnVzOgorCWJ1c191bnJlZ2lzdGVyKCZmc2xfbWNfYnVzX3R5cGUpOworCitlcnJvcl9jbGVhbnVwX2NhY2hlOgorCWttZW1fY2FjaGVfZGVzdHJveShtY19kZXZfY2FjaGUpOworCXJldHVybiBlcnJvcjsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwoZnNsX21jX2J1c19kcml2ZXJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBmc2xfbWNfYnVzX2RyaXZlcl9leGl0KHZvaWQpCit7CisJaWYgKFdBUk5fT04oIW1jX2Rldl9jYWNoZSkpCisJCXJldHVybjsKKworCWZzbF9tY19hbGxvY2F0b3JfZHJpdmVyX2V4aXQoKTsKKwlkcHJjX2RyaXZlcl9leGl0KCk7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZzbF9tY19idXNfZHJpdmVyKTsKKwlidXNfdW5yZWdpc3RlcigmZnNsX21jX2J1c190eXBlKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobWNfZGV2X2NhY2hlKTsKKwlwcl9pbmZvKCJNQyBidXMgdW5yZWdpc3RlcmVkXG4iKTsKK30KKworbW9kdWxlX2V4aXQoZnNsX21jX2J1c19kcml2ZXJfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLXN5cy5jIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9idXMvbWMtc3lzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczN2Y1OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvYnVzL21jLXN5cy5jCkBAIC0wLDAgKzEsMjg3IEBACisvKiBDb3B5cmlnaHQgMjAxMy0yMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBJL08gc2VydmljZXMgdG8gc2VuZCBNQyBjb21tYW5kcyB0byB0aGUgTUMgaGFyZHdhcmUKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy1zeXMuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL21jLWNtZC5oIgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorCisvKioKKyAqIFRpbWVvdXQgaW4gamlmZmllcyB0byB3YWl0IGZvciB0aGUgY29tcGxldGlvbiBvZiBhbiBNQyBjb21tYW5kCisgKi8KKyNkZWZpbmUgTUNfQ01EX0NPTVBMRVRJT05fVElNRU9VVF9KSUZGSUVTICAgKEhaIC8gMikJLyogNTAwIG1zICovCisKKy8qCisgKiB1c2xlZXBfcmFuZ2UoKSBtaW4gYW5kIG1heCB2YWx1ZXMgdXNlZCB0byB0aHJvdHRsZSBkb3duIHBvbGxpbmcKKyAqIGl0ZXJhdGlvbnMgd2hpbGUgd2FpdGluZyBmb3IgTUMgY29tbWFuZCBjb21wbGV0aW9uCisgKi8KKyNkZWZpbmUgTUNfQ01EX0NPTVBMRVRJT05fUE9MTElOR19NSU5fU0xFRVBfVVNFQ1MgICAgMTAKKyNkZWZpbmUgTUNfQ01EX0NPTVBMRVRJT05fUE9MTElOR19NQVhfU0xFRVBfVVNFQ1MgICAgNTAwCisKKyNkZWZpbmUgTUNfQ01EX0hEUl9SRUFEX0NNRElEKF9oZHIpIFwKKwkoKHVpbnQxNl90KW1jX2RlYygoX2hkciksIE1DX0NNRF9IRFJfQ01ESURfTywgTUNfQ01EX0hEUl9DTURJRF9TKSkKKworLyoqCisgKiBDcmVhdGVzIGFuIE1DIEkvTyBvYmplY3QKKyAqCisgKiBAZGV2OiBkZXZpY2UgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBNQyBJL08gb2JqZWN0CisgKiBAbWNfcG9ydGFsX3BoeXNfYWRkcjogcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgTUMgcG9ydGFsIHRvIHVzZQorICogQG1jX3BvcnRhbF9zaXplOiBzaXplIGluIGJ5dGVzIG9mIHRoZSBNQyBwb3J0YWwKKyAqIEByZXNvdXJjZTogUG9pbnRlciB0byBNQyBidXMgb2JqZWN0IGFsbG9jYXRvciByZXNvdXJjZSBhc3NvY2lhdGVkCisgKiB3aXRoIHRoaXMgTUMgSS9PIG9iamVjdCBvciBOVUxMIGlmIG5vbmUuCisgKiBAZmxhZ3M6IGZsYWdzIGZvciB0aGUgbmV3IE1DIEkvTyBvYmplY3QKKyAqIEBuZXdfbWNfaW86IEFyZWEgdG8gcmV0dXJuIHBvaW50ZXIgdG8gbmV3bHkgY3JlYXRlZCBNQyBJL08gb2JqZWN0CisgKgorICogUmV0dXJucyAnMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBfX211c3RfY2hlY2sgZnNsX2NyZWF0ZV9tY19pbyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBwaHlzX2FkZHJfdCBtY19wb3J0YWxfcGh5c19hZGRyLAorCQkJCSAgdWludDMyX3QgbWNfcG9ydGFsX3NpemUsCisJCQkJICBzdHJ1Y3QgZnNsX21jX3Jlc291cmNlICpyZXNvdXJjZSwKKwkJCQkgIHVpbnQzMl90IGZsYWdzLCBzdHJ1Y3QgZnNsX21jX2lvICoqbmV3X21jX2lvKQoreworCXN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvOworCXZvaWQgX19pb21lbSAqbWNfcG9ydGFsX3ZpcnRfYWRkcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKworCW1jX2lvID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCptY19pbyksIEdGUF9LRVJORUwpOworCWlmICghbWNfaW8pCisJCXJldHVybiAtRU5PTUVNOworCisJbWNfaW8tPmRldiA9IGRldjsKKwltY19pby0+ZmxhZ3MgPSBmbGFnczsKKwltY19pby0+cG9ydGFsX3BoeXNfYWRkciA9IG1jX3BvcnRhbF9waHlzX2FkZHI7CisJbWNfaW8tPnBvcnRhbF9zaXplID0gbWNfcG9ydGFsX3NpemU7CisJbWNfaW8tPnJlc291cmNlID0gcmVzb3VyY2U7CisJcmVzID0gZGV2bV9yZXF1ZXN0X21lbV9yZWdpb24oZGV2LAorCQkJCSAgICAgIG1jX3BvcnRhbF9waHlzX2FkZHIsCisJCQkJICAgICAgbWNfcG9ydGFsX3NpemUsCisJCQkJICAgICAgIm1jX3BvcnRhbCIpOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoZGV2LAorCQkJImRldm1fcmVxdWVzdF9tZW1fcmVnaW9uIGZhaWxlZCBmb3IgTUMgcG9ydGFsICUjbGx4XG4iLAorCQkJbWNfcG9ydGFsX3BoeXNfYWRkcik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJbWNfcG9ydGFsX3ZpcnRfYWRkciA9IGRldm1faW9yZW1hcF9ub2NhY2hlKGRldiwKKwkJCQkJCSAgIG1jX3BvcnRhbF9waHlzX2FkZHIsCisJCQkJCQkgICBtY19wb3J0YWxfc2l6ZSk7CisJaWYgKCFtY19wb3J0YWxfdmlydF9hZGRyKSB7CisJCWRldl9lcnIoZGV2LAorCQkJImRldm1faW9yZW1hcF9ub2NhY2hlIGZhaWxlZCBmb3IgTUMgcG9ydGFsICUjbGx4XG4iLAorCQkJbWNfcG9ydGFsX3BoeXNfYWRkcik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJbWNfaW8tPnBvcnRhbF92aXJ0X2FkZHIgPSBtY19wb3J0YWxfdmlydF9hZGRyOworCSpuZXdfbWNfaW8gPSBtY19pbzsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZzbF9jcmVhdGVfbWNfaW8pOworCisvKioKKyAqIERlc3Ryb3lzIGFuIE1DIEkvTyBvYmplY3QKKyAqCisgKiBAbWNfaW86IE1DIEkvTyBvYmplY3QgdG8gZGVzdHJveQorICovCit2b2lkIGZzbF9kZXN0cm95X21jX2lvKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvKQoreworCWRldm1faW91bm1hcChtY19pby0+ZGV2LCBtY19pby0+cG9ydGFsX3ZpcnRfYWRkcik7CisJZGV2bV9yZWxlYXNlX21lbV9yZWdpb24obWNfaW8tPmRldiwKKwkJCQltY19pby0+cG9ydGFsX3BoeXNfYWRkciwKKwkJCQltY19pby0+cG9ydGFsX3NpemUpOworCisJbWNfaW8tPnBvcnRhbF92aXJ0X2FkZHIgPSBOVUxMOworCWRldm1fa2ZyZWUobWNfaW8tPmRldiwgbWNfaW8pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZnNsX2Rlc3Ryb3lfbWNfaW8pOworCitzdGF0aWMgaW50IG1jX3N0YXR1c190b19lcnJvcihlbnVtIG1jX2NtZF9zdGF0dXMgc3RhdHVzKQoreworCXN0YXRpYyBjb25zdCBpbnQgbWNfc3RhdHVzX3RvX2Vycm9yX21hcFtdID0geworCQlbTUNfQ01EX1NUQVRVU19PS10gPSAwLAorCQlbTUNfQ01EX1NUQVRVU19BVVRIX0VSUl0gPSAtRUFDQ0VTLAorCQlbTUNfQ01EX1NUQVRVU19OT19QUklWSUxFR0VdID0gLUVQRVJNLAorCQlbTUNfQ01EX1NUQVRVU19ETUFfRVJSXSA9IC1FSU8sCisJCVtNQ19DTURfU1RBVFVTX0NPTkZJR19FUlJdID0gLUVOWElPLAorCQlbTUNfQ01EX1NUQVRVU19USU1FT1VUXSA9IC1FVElNRURPVVQsCisJCVtNQ19DTURfU1RBVFVTX05PX1JFU09VUkNFXSA9IC1FTkFWQUlMLAorCQlbTUNfQ01EX1NUQVRVU19OT19NRU1PUlldID0gLUVOT01FTSwKKwkJW01DX0NNRF9TVEFUVVNfQlVTWV0gPSAtRUJVU1ksCisJCVtNQ19DTURfU1RBVFVTX1VOU1VQUE9SVEVEX09QXSA9IC1FTk9UU1VQUCwKKwkJW01DX0NNRF9TVEFUVVNfSU5WQUxJRF9TVEFURV0gPSAtRU5PREVWLAorCX07CisKKwlpZiAoV0FSTl9PTigodTMyKXN0YXR1cyA+PSBBUlJBWV9TSVpFKG1jX3N0YXR1c190b19lcnJvcl9tYXApKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gbWNfc3RhdHVzX3RvX2Vycm9yX21hcFtzdGF0dXNdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbWNfc3RhdHVzX3RvX3N0cmluZyhlbnVtIG1jX2NtZF9zdGF0dXMgc3RhdHVzKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzdGF0dXNfc3RyaW5nc1tdID0geworCQlbTUNfQ01EX1NUQVRVU19PS10gPSAiQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IiwKKwkJW01DX0NNRF9TVEFUVVNfUkVBRFldID0gIkNvbW1hbmQgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkIiwKKwkJW01DX0NNRF9TVEFUVVNfQVVUSF9FUlJdID0gIkF1dGhlbnRpY2F0aW9uIGVycm9yIiwKKwkJW01DX0NNRF9TVEFUVVNfTk9fUFJJVklMRUdFXSA9ICJObyBwcml2aWxlZ2UiLAorCQlbTUNfQ01EX1NUQVRVU19ETUFfRVJSXSA9ICJETUEgb3IgSS9PIGVycm9yIiwKKwkJW01DX0NNRF9TVEFUVVNfQ09ORklHX0VSUl0gPSAiQ29uZmlndXJhdGlvbiBlcnJvciIsCisJCVtNQ19DTURfU1RBVFVTX1RJTUVPVVRdID0gIk9wZXJhdGlvbiB0aW1lZCBvdXQiLAorCQlbTUNfQ01EX1NUQVRVU19OT19SRVNPVVJDRV0gPSAiTm8gcmVzb3VyY2VzIiwKKwkJW01DX0NNRF9TVEFUVVNfTk9fTUVNT1JZXSA9ICJObyBtZW1vcnkgYXZhaWxhYmxlIiwKKwkJW01DX0NNRF9TVEFUVVNfQlVTWV0gPSAiRGV2aWNlIGlzIGJ1c3kiLAorCQlbTUNfQ01EX1NUQVRVU19VTlNVUFBPUlRFRF9PUF0gPSAiVW5zdXBwb3J0ZWQgb3BlcmF0aW9uIiwKKwkJW01DX0NNRF9TVEFUVVNfSU5WQUxJRF9TVEFURV0gPSAiSW52YWxpZCBzdGF0ZSIKKwl9OworCisJaWYgKCh1bnNpZ25lZCBpbnQpc3RhdHVzID49IEFSUkFZX1NJWkUoc3RhdHVzX3N0cmluZ3MpKQorCQlyZXR1cm4gIlVua25vd24gTUMgZXJyb3IiOworCisJcmV0dXJuIHN0YXR1c19zdHJpbmdzW3N0YXR1c107Cit9CisKKy8qKgorICogbWNfd3JpdGVfY29tbWFuZCAtIHdyaXRlcyBhIGNvbW1hbmQgdG8gYSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBwb3J0YWwKKyAqCisgKiBAcG9ydGFsOiBwb2ludGVyIHRvIGFuIE1DIHBvcnRhbAorICogQGNtZDogcG9pbnRlciB0byBhIGZpbGxlZCBjb21tYW5kCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBtY193cml0ZV9jb21tYW5kKHN0cnVjdCBtY19jb21tYW5kIF9faW9tZW0gKnBvcnRhbCwKKwkJCQkgICAgc3RydWN0IG1jX2NvbW1hbmQgKmNtZCkKK3sKKwlpbnQgaTsKKworCS8qIGNvcHkgY29tbWFuZCBwYXJhbWV0ZXJzIGludG8gdGhlIHBvcnRhbCAqLworCWZvciAoaSA9IDA7IGkgPCBNQ19DTURfTlVNX09GX1BBUkFNUzsgaSsrKQorCQl3cml0ZXEoY21kLT5wYXJhbXNbaV0sICZwb3J0YWwtPnBhcmFtc1tpXSk7CisKKwkvKiBzdWJtaXQgdGhlIGNvbW1hbmQgYnkgd3JpdGluZyB0aGUgaGVhZGVyICovCisJd3JpdGVxKGNtZC0+aGVhZGVyLCAmcG9ydGFsLT5oZWFkZXIpOworfQorCisvKioKKyAqIG1jX3JlYWRfcmVzcG9uc2UgLSByZWFkcyB0aGUgcmVzcG9uc2UgZm9yIHRoZSBsYXN0IE1DIGNvbW1hbmQgZnJvbSBhCisgKiBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBwb3J0YWwKKyAqCisgKiBAcG9ydGFsOiBwb2ludGVyIHRvIGFuIE1DIHBvcnRhbAorICogQHJlc3A6IHBvaW50ZXIgdG8gY29tbWFuZCByZXNwb25zZSBidWZmZXIKKyAqCisgKiBSZXR1cm5zIE1DX0NNRF9TVEFUVVNfT0sgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgZW51bSBtY19jbWRfc3RhdHVzIG1jX3JlYWRfcmVzcG9uc2Uoc3RydWN0IG1jX2NvbW1hbmQgX19pb21lbSAqCisJCQkJCQkgIHBvcnRhbCwKKwkJCQkJCSAgc3RydWN0IG1jX2NvbW1hbmQgKnJlc3ApCit7CisJaW50IGk7CisJZW51bSBtY19jbWRfc3RhdHVzIHN0YXR1czsKKworCS8qIENvcHkgY29tbWFuZCByZXNwb25zZSBoZWFkZXIgZnJvbSBNQyBwb3J0YWw6ICovCisJcmVzcC0+aGVhZGVyID0gcmVhZHEoJnBvcnRhbC0+aGVhZGVyKTsKKwlzdGF0dXMgPSBNQ19DTURfSERSX1JFQURfU1RBVFVTKHJlc3AtPmhlYWRlcik7CisJaWYgKHN0YXR1cyAhPSBNQ19DTURfU1RBVFVTX09LKQorCQlyZXR1cm4gc3RhdHVzOworCisJLyogQ29weSBjb21tYW5kIHJlc3BvbnNlIGRhdGEgZnJvbSBNQyBwb3J0YWw6ICovCisJZm9yIChpID0gMDsgaSA8IE1DX0NNRF9OVU1fT0ZfUEFSQU1TOyBpKyspCisJCXJlc3AtPnBhcmFtc1tpXSA9IHJlYWRxKCZwb3J0YWwtPnBhcmFtc1tpXSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFNlbmRzIGFuIGNvbW1hbmQgdG8gdGhlIE1DIGRldmljZSB1c2luZyB0aGUgZ2l2ZW4gTUMgSS9PIG9iamVjdAorICoKKyAqIEBtY19pbzogTUMgSS9PIG9iamVjdCB0byBiZSB1c2VkCisgKiBAY21kOiBjb21tYW5kIHRvIGJlIHNlbnQKKyAqCisgKiBSZXR1cm5zICcwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBpbnZva2VkIGZyb20gZnJvbSBhdG9taWMgY29udGV4dHMuCisgKi8KK2ludCBtY19zZW5kX2NvbW1hbmQoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHN0cnVjdCBtY19jb21tYW5kICpjbWQpCit7CisJZW51bSBtY19jbWRfc3RhdHVzIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfdW50aWxfdGltZW91dCA9CisJICAgIGppZmZpZXMgKyBNQ19DTURfQ09NUExFVElPTl9USU1FT1VUX0pJRkZJRVM7CisKKwkvKgorCSAqIFNlbmQgY29tbWFuZCB0byB0aGUgTUMgaGFyZHdhcmU6CisJICovCisJbWNfd3JpdGVfY29tbWFuZChtY19pby0+cG9ydGFsX3ZpcnRfYWRkciwgY21kKTsKKworCS8qCisJICogV2FpdCBmb3IgcmVzcG9uc2UgZnJvbSB0aGUgTUMgaGFyZHdhcmU6CisJICovCisJZm9yICg7OykgeworCQlzdGF0dXMgPSBtY19yZWFkX3Jlc3BvbnNlKG1jX2lvLT5wb3J0YWxfdmlydF9hZGRyLCBjbWQpOworCQlpZiAoc3RhdHVzICE9IE1DX0NNRF9TVEFUVVNfUkVBRFkpCisJCQlicmVhazsKKworCQkvKgorCQkgKiBUT0RPOiBXaGVuIE1DIGNvbW1hbmQgY29tcGxldGlvbiBpbnRlcnJ1cHRzIGFyZSBzdXBwb3J0ZWQKKwkJICogY2FsbCB3YWl0IGZ1bmN0aW9uIGhlcmUgaW5zdGVhZCBvZiB1c2xlZXBfcmFuZ2UoKQorCQkgKi8KKwkJdXNsZWVwX3JhbmdlKE1DX0NNRF9DT01QTEVUSU9OX1BPTExJTkdfTUlOX1NMRUVQX1VTRUNTLAorCQkJICAgICBNQ19DTURfQ09NUExFVElPTl9QT0xMSU5HX01BWF9TTEVFUF9VU0VDUyk7CisKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgamlmZmllc191bnRpbF90aW1lb3V0KSkgeworCQkJcHJfZGVidWcoIk1DIGNvbW1hbmQgdGltZWQgb3V0IChwb3J0YWw6ICUjbGx4LCBvYmogaGFuZGxlOiAlI3gsIGNvbW1hbmQ6ICUjeClcbiIsCisJCQkJIG1jX2lvLT5wb3J0YWxfcGh5c19hZGRyLAorCQkJCSAodW5zaWduZWQgaW50KQorCQkJCQlNQ19DTURfSERSX1JFQURfVE9LRU4oY21kLT5oZWFkZXIpLAorCQkJCSAodW5zaWduZWQgaW50KQorCQkJCQlNQ19DTURfSERSX1JFQURfQ01ESUQoY21kLT5oZWFkZXIpKTsKKworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwl9CisKKwlpZiAoc3RhdHVzICE9IE1DX0NNRF9TVEFUVVNfT0spIHsKKwkJcHJfZGVidWcoIk1DIGNvbW1hbmQgZmFpbGVkOiBwb3J0YWw6ICUjbGx4LCBvYmogaGFuZGxlOiAlI3gsIGNvbW1hbmQ6ICUjeCwgc3RhdHVzOiAlcyAoJSN4KVxuIiwKKwkJCSBtY19pby0+cG9ydGFsX3BoeXNfYWRkciwKKwkJCSAodW5zaWduZWQgaW50KU1DX0NNRF9IRFJfUkVBRF9UT0tFTihjbWQtPmhlYWRlciksCisJCQkgKHVuc2lnbmVkIGludClNQ19DTURfSERSX1JFQURfQ01ESUQoY21kLT5oZWFkZXIpLAorCQkJIG1jX3N0YXR1c190b19zdHJpbmcoc3RhdHVzKSwKKwkJCSAodW5zaWduZWQgaW50KXN0YXR1cyk7CisKKwkJcmV0dXJuIG1jX3N0YXR1c190b19lcnJvcihzdGF0dXMpOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChtY19zZW5kX2NvbW1hbmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwYnAtY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBicC1jbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmQ3MGEyMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9kcGJwLWNtZC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorKgorKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQorKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyoKKyoKKyogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorKiBsYXRlciB2ZXJzaW9uLgorKgorKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisjaWZuZGVmIF9GU0xfRFBCUF9DTURfSAorI2RlZmluZSBfRlNMX0RQQlBfQ01EX0gKKworLyogRFBCUCBWZXJzaW9uICovCisjZGVmaW5lIERQQlBfVkVSX01BSk9SCQkJCTIKKyNkZWZpbmUgRFBCUF9WRVJfTUlOT1IJCQkJMAorCisvKiBDb21tYW5kIElEcyAqLworI2RlZmluZSBEUEJQX0NNRElEX0NMT1NFCQkJCTB4ODAwCisjZGVmaW5lIERQQlBfQ01ESURfT1BFTgkJCQkJMHg4MDQKKyNkZWZpbmUgRFBCUF9DTURJRF9DUkVBVEUJCQkJMHg5MDQKKyNkZWZpbmUgRFBCUF9DTURJRF9ERVNUUk9ZCQkJCTB4OTAwCisKKyNkZWZpbmUgRFBCUF9DTURJRF9FTkFCTEUJCQkJMHgwMDIKKyNkZWZpbmUgRFBCUF9DTURJRF9ESVNBQkxFCQkJCTB4MDAzCisjZGVmaW5lIERQQlBfQ01ESURfR0VUX0FUVFIJCQkJMHgwMDQKKyNkZWZpbmUgRFBCUF9DTURJRF9SRVNFVAkJCQkweDAwNQorI2RlZmluZSBEUEJQX0NNRElEX0lTX0VOQUJMRUQJCQkJMHgwMDYKKworI2RlZmluZSBEUEJQX0NNRElEX1NFVF9JUlEJCQkJMHgwMTAKKyNkZWZpbmUgRFBCUF9DTURJRF9HRVRfSVJRCQkJCTB4MDExCisjZGVmaW5lIERQQlBfQ01ESURfU0VUX0lSUV9FTkFCTEUJCQkweDAxMgorI2RlZmluZSBEUEJQX0NNRElEX0dFVF9JUlFfRU5BQkxFCQkJMHgwMTMKKyNkZWZpbmUgRFBCUF9DTURJRF9TRVRfSVJRX01BU0sJCQkJMHgwMTQKKyNkZWZpbmUgRFBCUF9DTURJRF9HRVRfSVJRX01BU0sJCQkJMHgwMTUKKyNkZWZpbmUgRFBCUF9DTURJRF9HRVRfSVJRX1NUQVRVUwkJCTB4MDE2CisjZGVmaW5lIERQQlBfQ01ESURfQ0xFQVJfSVJRX1NUQVRVUwkJCTB4MDE3CisKKyNlbmRpZiAvKiBfRlNMX0RQQlBfQ01EX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9kcGJwLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBicC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmM2M4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBicC5oCkBAIC0wLDAgKzEsMzMwIEBACisvKiBDb3B5cmlnaHQgMjAxMy0yMDE1IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyAqIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX0ZTTF9EUEJQX0gKKyNkZWZpbmUgX19GU0xfRFBCUF9ICisKKy8qIERhdGEgUGF0aCBCdWZmZXIgUG9vbCBBUEkKKyAqIENvbnRhaW5zIGluaXRpYWxpemF0aW9uIEFQSXMgYW5kIHJ1bnRpbWUgY29udHJvbCBBUElzIGZvciBEUEJQCisgKi8KKworc3RydWN0IGZzbF9tY19pbzsKKworLyoqCisgKiBkcGJwX29wZW4oKSAtIE9wZW4gYSBjb250cm9sIHNlc3Npb24gZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEBkcGJwX2lkOglEUEJQIHVuaXF1ZSBJRAorICogQHRva2VuOglSZXR1cm5lZCB0b2tlbjsgdXNlIGluIHN1YnNlcXVlbnQgQVBJIGNhbGxzCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBvcGVuIGEgY29udHJvbCBzZXNzaW9uIGZvciBhbgorICogYWxyZWFkeSBjcmVhdGVkIG9iamVjdDsgYW4gb2JqZWN0IG1heSBoYXZlIGJlZW4gZGVjbGFyZWQgaW4KKyAqIHRoZSBEUEwgb3IgYnkgY2FsbGluZyB0aGUgZHBicF9jcmVhdGUgZnVuY3Rpb24uCisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSB1bmlxdWUgYXV0aGVudGljYXRpb24gdG9rZW4sCisgKiBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmljIG9iamVjdCBJRCBhbmQgdGhlIHNwZWNpZmljIE1DCisgKiBwb3J0YWw7IHRoaXMgdG9rZW4gbXVzdCBiZSB1c2VkIGluIGFsbCBzdWJzZXF1ZW50IGNvbW1hbmRzIGZvcgorICogdGhpcyBzcGVjaWZpYyBvYmplY3QKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfb3BlbihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgaW50IGRwYnBfaWQsIHVpbnQxNl90ICp0b2tlbik7CisKKy8qKgorICogZHBicF9jbG9zZSgpIC0gQ2xvc2UgdGhlIGNvbnRyb2wgc2Vzc2lvbiBvZiB0aGUgb2JqZWN0CisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICoKKyAqIEFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCBubyBmdXJ0aGVyIG9wZXJhdGlvbnMgYXJlCisgKiBhbGxvd2VkIG9uIHRoZSBvYmplY3Qgd2l0aG91dCBvcGVuaW5nIGEgbmV3IGNvbnRyb2wgc2Vzc2lvbi4KKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfY2xvc2Uoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuKTsKKworLyoqCisgKiBzdHJ1Y3QgZHBicF9jZmcoKSAtIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgRFBCUCBjb25maWd1cmF0aW9uCisgKiBAb3B0aW9uczoJcGxhY2UgaG9sZGVyCisgKi8KK3N0cnVjdCBkcGJwX2NmZyB7CisJdWludDMyX3Qgb3B0aW9uczsKK307CisKKy8qKgorICogZHBicF9jcmVhdGUoKSAtIENyZWF0ZSB0aGUgRFBCUCBvYmplY3QuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQGNmZzoJQ29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUKKyAqIEB0b2tlbjoJUmV0dXJuZWQgdG9rZW47IHVzZSBpbiBzdWJzZXF1ZW50IEFQSSBjYWxscworICoKKyAqIENyZWF0ZSB0aGUgRFBCUCBvYmplY3QsIGFsbG9jYXRlIHJlcXVpcmVkIHJlc291cmNlcyBhbmQKKyAqIHBlcmZvcm0gcmVxdWlyZWQgaW5pdGlhbGl6YXRpb24uCisgKgorICogVGhlIG9iamVjdCBjYW4gYmUgY3JlYXRlZCBlaXRoZXIgYnkgZGVjbGFyaW5nIGl0IGluIHRoZQorICogRFBMIGZpbGUsIG9yIGJ5IGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHVuaXF1ZSBhdXRoZW50aWNhdGlvbiB0b2tlbiwKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWMgb2JqZWN0IElEIGFuZCB0aGUgc3BlY2lmaWMgTUMKKyAqIHBvcnRhbDsgdGhpcyB0b2tlbiBtdXN0IGJlIHVzZWQgaW4gYWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8KKyAqIHRoaXMgc3BlY2lmaWMgb2JqZWN0LiBGb3Igb2JqZWN0cyB0aGF0IGFyZSBjcmVhdGVkIHVzaW5nIHRoZQorICogRFBMIGZpbGUsIGNhbGwgZHBicF9vcGVuIGZ1bmN0aW9uIHRvIGdldCBhbiBhdXRoZW50aWNhdGlvbgorICogdG9rZW4gZmlyc3QuCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX2NyZWF0ZShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJY29uc3Qgc3RydWN0IGRwYnBfY2ZnCSpjZmcsCisJCXVpbnQxNl90CQkqdG9rZW4pOworCisvKioKKyAqIGRwYnBfZGVzdHJveSgpIC0gRGVzdHJveSB0aGUgRFBCUCBvYmplY3QgYW5kIHJlbGVhc2UgYWxsIGl0cyByZXNvdXJjZXMuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBicF9kZXN0cm95KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbik7CisKKy8qKgorICogZHBicF9lbmFibGUoKSAtIEVuYWJsZSB0aGUgRFBCUC4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQQlAgb2JqZWN0CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX2VuYWJsZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pOworCisvKioKKyAqIGRwYnBfZGlzYWJsZSgpIC0gRGlzYWJsZSB0aGUgRFBCUC4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQQlAgb2JqZWN0CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX2Rpc2FibGUoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sIHVpbnQxNl90IHRva2VuKTsKKworLyoqCisgKiBkcGJwX2lzX2VuYWJsZWQoKSAtIENoZWNrIGlmIHRoZSBEUEJQIGlzIGVuYWJsZWQuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICogQGVuOgkJUmV0dXJucyAnMScgaWYgb2JqZWN0IGlzIGVuYWJsZWQ7ICcwJyBvdGhlcndpc2UKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfaXNfZW5hYmxlZChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4sIGludCAqZW4pOworCisvKioKKyAqIGRwYnBfcmVzZXQoKSAtIFJlc2V0IHRoZSBEUEJQLCByZXR1cm5zIHRoZSBvYmplY3QgdG8gaW5pdGlhbCBzdGF0ZS4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQQlAgb2JqZWN0CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX3Jlc2V0KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCB1aW50MTZfdCB0b2tlbik7CisKKy8qKgorICogZHBicF9zZXRfaXJxKCkgLSBTZXQgSVJRIGluZm9ybWF0aW9uIGZvciB0aGUgRFBCUCB0byB0cmlnZ2VyIGFuIGludGVycnVwdC4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQQlAgb2JqZWN0CisgKiBAaXJxX2luZGV4OglJZGVudGlmaWVzIHRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAaXJxX2FkZHI6CUFkZHJlc3MgdGhhdCBtdXN0IGJlIHdyaXR0ZW4gdG8KKyAqCQkJCXNpZ25hbCBhIG1lc3NhZ2UtYmFzZWQgaW50ZXJydXB0CisgKiBAaXJxX3ZhbDoJVmFsdWUgdG8gd3JpdGUgaW50byBpcnFfYWRkciBhZGRyZXNzCisgKiBAdXNlcl9pcnFfaWQ6IEEgdXNlciBkZWZpbmVkIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBJUlEKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfc2V0X2lycShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJIHVpbnQxNl90CQl0b2tlbiwKKwkJIHVpbnQ4X3QJCWlycV9pbmRleCwKKwkJIHVpbnQ2NF90CQlpcnFfYWRkciwKKwkJIHVpbnQzMl90CQlpcnFfdmFsLAorCQkgaW50CQkJdXNlcl9pcnFfaWQpOworCisvKioKKyAqIGRwYnBfZ2V0X2lycSgpIC0gR2V0IElSUSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBEUEJQLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBCUCBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAdHlwZToJSW50ZXJydXB0IHR5cGU6IDAgcmVwcmVzZW50cyBtZXNzYWdlIGludGVycnVwdAorICoJCQkJdHlwZSAoYm90aCBpcnFfYWRkciBhbmQgaXJxX3ZhbCBhcmUgdmFsaWQpCisgKiBAaXJxX2FkZHI6CVJldHVybmVkIGFkZHJlc3MgdGhhdCBtdXN0IGJlIHdyaXR0ZW4gdG8KKyAqCQkJCXNpZ25hbCB0aGUgbWVzc2FnZS1iYXNlZCBpbnRlcnJ1cHQKKyAqIEBpcnFfdmFsOglWYWx1ZSB0byB3cml0ZSBpbnRvIGlycV9hZGRyIGFkZHJlc3MKKyAqIEB1c2VyX2lycV9pZDogQSB1c2VyIGRlZmluZWQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIElSUQorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBicF9nZXRfaXJxKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkgdWludDE2X3QJCXRva2VuLAorCQkgdWludDhfdAkJaXJxX2luZGV4LAorCQkgaW50CQkJKnR5cGUsCisJCSB1aW50NjRfdAkJKmlycV9hZGRyLAorCQkgdWludDMyX3QJCSppcnFfdmFsLAorCQkgaW50CQkJKnVzZXJfaXJxX2lkKTsKKworLyoqCisgKiBkcGJwX3NldF9pcnFfZW5hYmxlKCkgLSBTZXQgb3ZlcmFsbCBpbnRlcnJ1cHQgc3RhdGUuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBlbjoJSW50ZXJydXB0IHN0YXRlIC0gZW5hYmxlID0gMSwgZGlzYWJsZSA9IDAKKyAqCisgKiBBbGxvd3MgR1BQIHNvZnR3YXJlIHRvIGNvbnRyb2wgd2hlbiBpbnRlcnJ1cHRzIGFyZSBnZW5lcmF0ZWQuCisgKiBFYWNoIGludGVycnVwdCBjYW4gaGF2ZSB1cCB0byAzMiBjYXVzZXMuICBUaGUgZW5hYmxlL2Rpc2FibGUgY29udHJvbCdzIHRoZQorICogb3ZlcmFsbCBpbnRlcnJ1cHQgc3RhdGUuIGlmIHRoZSBpbnRlcnJ1cHQgaXMgZGlzYWJsZWQgbm8gY2F1c2VzIHdpbGwgY2F1c2UKKyAqIGFuIGludGVycnVwdC4KKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfc2V0X2lycV9lbmFibGUoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQl1aW50MTZfdAkJdG9rZW4sCisJCQl1aW50OF90CQkJaXJxX2luZGV4LAorCQkJdWludDhfdAkJCWVuKTsKKworLyoqCisgKiBkcGJwX2dldF9pcnFfZW5hYmxlKCkgLSBHZXQgb3ZlcmFsbCBpbnRlcnJ1cHQgc3RhdGUKKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQQlAgb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQGVuOgkJUmV0dXJuZWQgaW50ZXJydXB0IHN0YXRlIC0gZW5hYmxlID0gMSwgZGlzYWJsZSA9IDAKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfZ2V0X2lycV9lbmFibGUoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQl1aW50MTZfdAkJdG9rZW4sCisJCQl1aW50OF90CQkJaXJxX2luZGV4LAorCQkJdWludDhfdAkJCSplbik7CisKKy8qKgorICogZHBicF9zZXRfaXJxX21hc2soKSAtIFNldCBpbnRlcnJ1cHQgbWFzay4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQQlAgb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQG1hc2s6CUV2ZW50IG1hc2sgdG8gdHJpZ2dlciBpbnRlcnJ1cHQ7CisgKgkJCWVhY2ggYml0OgorICoJCQkJMCA9IGlnbm9yZSBldmVudAorICoJCQkJMSA9IGNvbnNpZGVyIGV2ZW50IGZvciBhc3NlcnRpbmcgSVJRCisgKgorICogRXZlcnkgaW50ZXJydXB0IGNhbiBoYXZlIHVwIHRvIDMyIGNhdXNlcyBhbmQgdGhlIGludGVycnVwdCBtb2RlbCBzdXBwb3J0cworICogbWFza2luZy91bm1hc2tpbmcgZWFjaCBjYXVzZSBpbmRlcGVuZGVudGx5CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcGJwX3NldF9pcnFfbWFzayhzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJICAgICAgdWludDE2X3QJCXRva2VuLAorCQkgICAgICB1aW50OF90CQlpcnFfaW5kZXgsCisJCSAgICAgIHVpbnQzMl90CQltYXNrKTsKKworLyoqCisgKiBkcGJwX2dldF9pcnFfbWFzaygpIC0gR2V0IGludGVycnVwdCBtYXNrLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBCUCBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAbWFzazoJUmV0dXJuZWQgZXZlbnQgbWFzayB0byB0cmlnZ2VyIGludGVycnVwdAorICoKKyAqIEV2ZXJ5IGludGVycnVwdCBjYW4gaGF2ZSB1cCB0byAzMiBjYXVzZXMgYW5kIHRoZSBpbnRlcnJ1cHQgbW9kZWwgc3VwcG9ydHMKKyAqIG1hc2tpbmcvdW5tYXNraW5nIGVhY2ggY2F1c2UgaW5kZXBlbmRlbnRseQorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBicF9nZXRfaXJxX21hc2soc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSAgICAgIHVpbnQxNl90CQl0b2tlbiwKKwkJICAgICAgdWludDhfdAkJaXJxX2luZGV4LAorCQkgICAgICB1aW50MzJfdAkJKm1hc2spOworCisvKioKKyAqIGRwYnBfZ2V0X2lycV9zdGF0dXMoKSAtIEdldCB0aGUgY3VycmVudCBzdGF0dXMgb2YgYW55IHBlbmRpbmcgaW50ZXJydXB0cy4KKyAqCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUEJQIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBzdGF0dXM6CVJldHVybmVkIGludGVycnVwdHMgc3RhdHVzIC0gb25lIGJpdCBwZXIgY2F1c2U6CisgKgkJCTAgPSBubyBpbnRlcnJ1cHQgcGVuZGluZworICoJCQkxID0gaW50ZXJydXB0IHBlbmRpbmcKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwYnBfZ2V0X2lycV9zdGF0dXMoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQl1aW50MTZfdAkJdG9rZW4sCisJCQl1aW50OF90CQkJaXJxX2luZGV4LAorCQkJdWludDMyX3QJCSpzdGF0dXMpOworCisvKioKKyAqIGRwYnBfY2xlYXJfaXJxX3N0YXR1cygpIC0gQ2xlYXIgYSBwZW5kaW5nIGludGVycnVwdCdzIHN0YXR1cworICoKKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQQlAgb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQHN0YXR1czoJQml0cyB0byBjbGVhciAoVzFDKSAtIG9uZSBiaXQgcGVyIGNhdXNlOgorICoJCQkJCTAgPSBkb24ndCBjaGFuZ2UKKyAqCQkJCQkxID0gY2xlYXIgc3RhdHVzIGJpdAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBicF9jbGVhcl9pcnFfc3RhdHVzKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJICB1aW50MTZfdAkJdG9rZW4sCisJCQkgIHVpbnQ4X3QJCWlycV9pbmRleCwKKwkJCSAgdWludDMyX3QJCXN0YXR1cyk7CisKKy8qKgorICogc3RydWN0IGRwYnBfYXR0ciAtIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgRFBCUCBhdHRyaWJ1dGVzCisgKiBAaWQ6CQlEUEJQIG9iamVjdCBJRAorICogQHZlcnNpb246CURQQlAgdmVyc2lvbgorICogQGJwaWQ6CUhhcmR3YXJlIGJ1ZmZlciBwb29sIElEOyBzaG91bGQgYmUgdXNlZCBhcyBhbiBhcmd1bWVudCBpbgorICoJCWFjcXVpcmUvcmVsZWFzZSBvcGVyYXRpb25zIG9uIGJ1ZmZlcnMKKyAqLworc3RydWN0IGRwYnBfYXR0ciB7CisJaW50IGlkOworCS8qKgorCSAqIHN0cnVjdCB2ZXJzaW9uIC0gU3RydWN0dXJlIHJlcHJlc2VudGluZyBEUEJQIHZlcnNpb24KKwkgKiBAbWFqb3I6CURQQlAgbWFqb3IgdmVyc2lvbgorCSAqIEBtaW5vcjoJRFBCUCBtaW5vciB2ZXJzaW9uCisJICovCisJc3RydWN0IHsKKwkJdWludDE2X3QgbWFqb3I7CisJCXVpbnQxNl90IG1pbm9yOworCX0gdmVyc2lvbjsKKwl1aW50MTZfdCBicGlkOworfTsKKworLyoqCisgKiBkcGJwX2dldF9hdHRyaWJ1dGVzIC0gUmV0cmlldmUgRFBCUCBhdHRyaWJ1dGVzLgorICoKKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQQlAgb2JqZWN0CisgKiBAYXR0cjoJUmV0dXJuZWQgb2JqZWN0J3MgYXR0cmlidXRlcworICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBicF9nZXRfYXR0cmlidXRlcyhzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCXVpbnQxNl90CQl0b2tlbiwKKwkJCXN0cnVjdCBkcGJwX2F0dHIJKmF0dHIpOworCisvKiogQH0gKi8KKworI2VuZGlmIC8qIF9fRlNMX0RQQlBfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwY29uLWNtZC5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwY29uLWNtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NzhkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBjb24tY21kLmgKQEAgLTAsMCArMSw2MiBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisqIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisqIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorKgorKgorKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisqIGxhdGVyIHZlcnNpb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKyNpZm5kZWYgX0ZTTF9EUENPTl9DTURfSAorI2RlZmluZSBfRlNMX0RQQ09OX0NNRF9ICisKKy8qIERQQ09OIFZlcnNpb24gKi8KKyNkZWZpbmUgRFBDT05fVkVSX01BSk9SCQkJCTIKKyNkZWZpbmUgRFBDT05fVkVSX01JTk9SCQkJCTAKKworLyogQ29tbWFuZCBJRHMgKi8KKyNkZWZpbmUgRFBDT05fQ01ESURfQ0xPU0UJCQkJMHg4MDAKKyNkZWZpbmUgRFBDT05fQ01ESURfT1BFTgkJCQkweDgwOAorI2RlZmluZSBEUENPTl9DTURJRF9DUkVBVEUJCQkJMHg5MDgKKyNkZWZpbmUgRFBDT05fQ01ESURfREVTVFJPWQkJCQkweDkwMAorCisjZGVmaW5lIERQQ09OX0NNRElEX0VOQUJMRQkJCQkweDAwMgorI2RlZmluZSBEUENPTl9DTURJRF9ESVNBQkxFCQkJCTB4MDAzCisjZGVmaW5lIERQQ09OX0NNRElEX0dFVF9BVFRSCQkJCTB4MDA0CisjZGVmaW5lIERQQ09OX0NNRElEX1JFU0VUCQkJCTB4MDA1CisjZGVmaW5lIERQQ09OX0NNRElEX0lTX0VOQUJMRUQJCQkJMHgwMDYKKworI2RlZmluZSBEUENPTl9DTURJRF9TRVRfSVJRCQkJCTB4MDEwCisjZGVmaW5lIERQQ09OX0NNRElEX0dFVF9JUlEJCQkJMHgwMTEKKyNkZWZpbmUgRFBDT05fQ01ESURfU0VUX0lSUV9FTkFCTEUJCQkweDAxMgorI2RlZmluZSBEUENPTl9DTURJRF9HRVRfSVJRX0VOQUJMRQkJCTB4MDEzCisjZGVmaW5lIERQQ09OX0NNRElEX1NFVF9JUlFfTUFTSwkJCTB4MDE0CisjZGVmaW5lIERQQ09OX0NNRElEX0dFVF9JUlFfTUFTSwkJCTB4MDE1CisjZGVmaW5lIERQQ09OX0NNRElEX0dFVF9JUlFfU1RBVFVTCQkJMHgwMTYKKyNkZWZpbmUgRFBDT05fQ01ESURfQ0xFQVJfSVJRX1NUQVRVUwkJCTB4MDE3CisKKyNkZWZpbmUgRFBDT05fQ01ESURfU0VUX05PVElGSUNBVElPTgkJCTB4MTAwCisKKyNlbmRpZiAvKiBfRlNMX0RQQ09OX0NNRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBtbmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9kcG1uZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMDUyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvZHBtbmcuaApAQCAtMCwwICsxLDgwIEBACisvKiBDb3B5cmlnaHQgMjAxMy0yMDE1IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyAqIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBfX0ZTTF9EUE1OR19ICisjZGVmaW5lIF9fRlNMX0RQTU5HX0gKKworLyogTWFuYWdlbWVudCBDb21wbGV4IEdlbmVyYWwgQVBJCisgKiBDb250YWlucyBnZW5lcmFsIEFQSSBmb3IgdGhlIE1hbmFnZW1lbnQgQ29tcGxleCBmaXJtd2FyZQorICovCisKK3N0cnVjdCBmc2xfbWNfaW87CisKKy8qKgorICogTWFuYWdlbWVudCBDb21wbGV4IGZpcm13YXJlIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqLworI2RlZmluZSBNQ19WRVJfTUFKT1IgNgorI2RlZmluZSBNQ19WRVJfTUlOT1IgMAorCisvKioKKyAqIHN0cnVjdCBtY192ZXJzb2luCisgKiBAbWFqb3I6IE1ham9yIHZlcnNpb24gbnVtYmVyOiBpbmNyZW1lbnRlZCBvbiBBUEkgY29tcGF0aWJpbGl0eSBjaGFuZ2VzCisgKiBAbWlub3I6IE1pbm9yIHZlcnNpb24gbnVtYmVyOiBpbmNyZW1lbnRlZCBvbiBBUEkgYWRkaXRpb25zICh0aGF0IGFyZQorICoJCWJhY2t3YXJkIGNvbXBhdGlibGUpOyByZXNldCB3aGVuIG1ham9yIHZlcnNpb24gaXMgaW5jcmVtZW50ZWQKKyAqIEByZXZpc2lvbjogSW50ZXJuYWwgcmV2aXNpb24gbnVtYmVyOiBpbmNyZW1lbnRlZCBvbiBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzCisgKgkJYW5kL29yIGJ1ZyBmaXhlcyB0aGF0IGhhdmUgbm8gaW1wYWN0IG9uIEFQSQorICovCitzdHJ1Y3QgbWNfdmVyc2lvbiB7CisJdWludDMyX3QgbWFqb3I7CisJdWludDMyX3QgbWlub3I7CisJdWludDMyX3QgcmV2aXNpb247Cit9OworCisvKioKKyAqIG1jX2dldF92ZXJzaW9uKCkgLSBSZXRyaWV2ZXMgdGhlIE1hbmFnZW1lbnQgQ29tcGxleCBmaXJtd2FyZQorICoJCQl2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiBAbWNfaW86CQlQb2ludGVyIHRvIG9wYXF1ZSBJL08gb2JqZWN0CisgKiBAbWNfdmVyX2luZm86CVJldHVybmVkIHZlcnNpb24gaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBtY19nZXRfdmVyc2lvbihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgc3RydWN0IG1jX3ZlcnNpb24gKm1jX3Zlcl9pbmZvKTsKKworLyoqCisgKiBkcG1uZ19nZXRfY29udGFpbmVyX2lkKCkgLSBHZXQgY29udGFpbmVyIElEIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHBvcnRhbC4KKyAqIEBtY19pbzoJCVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQGNvbnRhaW5lcl9pZDoJUmVxdWVzdGVkIGNvbnRhaW5lciBJRAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHBtbmdfZ2V0X2NvbnRhaW5lcl9pZChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgaW50ICpjb250YWluZXJfaWQpOworCisjZW5kaWYgLyogX19GU0xfRFBNTkdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL2RwcmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9kcHJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4NjJhNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9kcHJjLmgKQEAgLTAsMCArMSw4MDEgQEAKKy8qIENvcHlyaWdodCAyMDEzLTIwMTUgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhYm92ZS1saXN0ZWQgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZQorICogbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSUyBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisjaWZuZGVmIF9GU0xfRFBSQ19ICisjZGVmaW5lIF9GU0xfRFBSQ19ICisKKy8qIERhdGEgUGF0aCBSZXNvdXJjZSBDb250YWluZXIgQVBJCisgKiBDb250YWlucyBEUFJDIEFQSSBmb3IgbWFuYWdpbmcgYW5kIHF1ZXJ5aW5nIERQQUEgcmVzb3VyY2VzCisgKi8KKworc3RydWN0IGZzbF9tY19pbzsKKworLyoqCisgKiBTZXQgdGhpcyB2YWx1ZSBhcyB0aGUgaWNpZCB2YWx1ZSBpbiBkcHJjX2NmZyBzdHJ1Y3R1cmUgd2hlbiBjcmVhdGluZyBhCisgKiBjb250YWluZXIsIGluIGNhc2UgdGhlIElDSUQgaXMgbm90IHNlbGVjdGVkIGJ5IHRoZSB1c2VyIGFuZCBzaG91bGQgYmUKKyAqIGFsbG9jYXRlZCBieSB0aGUgRFBSQyBmcm9tIHRoZSBwb29sIG9mIElDSURzLgorICovCisjZGVmaW5lIERQUkNfR0VUX0lDSURfRlJPTV9QT09MCQkJKHVpbnQxNl90KSh+KDApKQorCisvKioKKyAqIFNldCB0aGlzIHZhbHVlIGFzIHRoZSBwb3J0YWxfaWQgdmFsdWUgaW4gZHByY19jZmcgc3RydWN0dXJlIHdoZW4gY3JlYXRpbmcgYQorICogY29udGFpbmVyLCBpbiBjYXNlIHRoZSBwb3J0YWwgSUQgaXMgbm90IHNwZWNpZmljYWxseSBzZWxlY3RlZCBieSB0aGUKKyAqIHVzZXIgYW5kIHNob3VsZCBiZSBhbGxvY2F0ZWQgYnkgdGhlIERQUkMgZnJvbSB0aGUgcG9vbCBvZiBwb3J0YWwgaWRzLgorICovCisjZGVmaW5lIERQUkNfR0VUX1BPUlRBTF9JRF9GUk9NX1BPT0wJKGludCkofigwKSkKKworLyoqCisgKiBkcHJjX29wZW4oKSAtIE9wZW4gRFBSQyBvYmplY3QgZm9yIHVzZQorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEBjb250YWluZXJfaWQ6IENvbnRhaW5lciBJRCB0byBvcGVuCisgKiBAdG9rZW46CVJldHVybmVkIHRva2VuIG9mIERQUkMgb2JqZWN0CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKgorICogQHdhcm5pbmcJUmVxdWlyZWQgYmVmb3JlIGFueSBvcGVyYXRpb24gb24gdGhlIG9iamVjdC4KKyAqLworaW50IGRwcmNfb3BlbihzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgaW50IGNvbnRhaW5lcl9pZCwgdWludDE2X3QgKnRva2VuKTsKKworLyoqCisgKiBkcHJjX2Nsb3NlKCkgLSBDbG9zZSB0aGUgY29udHJvbCBzZXNzaW9uIG9mIHRoZSBvYmplY3QKKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKgorICogQWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIG5vIGZ1cnRoZXIgb3BlcmF0aW9ucyBhcmUKKyAqIGFsbG93ZWQgb24gdGhlIG9iamVjdCB3aXRob3V0IG9wZW5pbmcgYSBuZXcgY29udHJvbCBzZXNzaW9uLgorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19jbG9zZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4pOworCisvKioKKyAqIENvbnRhaW5lciBnZW5lcmFsIG9wdGlvbnMKKyAqCisgKiBUaGVzZSBvcHRpb25zIG1heSBiZSBzZWxlY3RlZCBhdCBjb250YWluZXIgY3JlYXRpb24gYnkgdGhlIGNvbnRhaW5lciBjcmVhdG9yCisgKiBhbmQgY2FuIGJlIHJldHJpZXZlZCB1c2luZyBkcHJjX2dldF9hdHRyaWJ1dGVzKCkKKyAqLworCisvKiBTcGF3biBQb2xpY3kgT3B0aW9uIGFsbG93ZWQgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgbmV3IGNvbnRhaW5lciBpcyBhbGxvd2VkCisgKiB0byBzcGF3biBhbmQgaGF2ZSBpdHMgb3duIGNoaWxkIGNvbnRhaW5lcnMuCisgKi8KKyNkZWZpbmUgRFBSQ19DRkdfT1BUX1NQQVdOX0FMTE9XRUQJCTB4MDAwMDAwMDEKKworLyogR2VuZXJhbCBDb250YWluZXIgYWxsb2NhdGlvbiBwb2xpY3kgLSBJbmRpY2F0ZXMgdGhhdCB0aGUgbmV3IGNvbnRhaW5lciBpcworICogYWxsb3dlZCB0byBhbGxvY2F0ZSByZXF1ZXN0ZWQgcmVzb3VyY2VzIGZyb20gaXRzIHBhcmVudCBjb250YWluZXI7IGlmIG5vdAorICogc2V0LCB0aGUgY29udGFpbmVyIGlzIG9ubHkgYWxsb3dlZCB0byB1c2UgcmVzb3VyY2VzIGluIGl0cyBvd24gcG9vbHM7IE5vdGUKKyAqIHRoYXQgdGhpcyBpcyBhIGNvbnRhaW5lcidzIGdsb2JhbCBwb2xpY3ksIGJ1dCB0aGUgcGFyZW50IGNvbnRhaW5lciBtYXkKKyAqIG92ZXJyaWRlIGl0IGFuZCBzZXQgc3BlY2lmaWMgcXVvdGEgcGVyIHJlc291cmNlIHR5cGUuCisgKi8KKyNkZWZpbmUgRFBSQ19DRkdfT1BUX0FMTE9DX0FMTE9XRUQJCTB4MDAwMDAwMDIKKworLyogT2JqZWN0IGluaXRpYWxpemF0aW9uIGFsbG93ZWQgLSBzb2Z0d2FyZSBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgKiBjb250YWluZXIgaXMgYWxsb3dlZCB0byBpbnZva2Ugb2JqZWN0IGluaXRpYWxpemF0aW9uIG9wZXJhdGlvbnMuCisgKi8KKyNkZWZpbmUgRFBSQ19DRkdfT1BUX09CSl9DUkVBVEVfQUxMT1dFRAkweDAwMDAwMDA0CisKKy8qIFRvcG9sb2d5IGNoYW5nZSBhbGxvd2VkIC0gc29mdHdhcmUgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcworICogY29udGFpbmVyIGlzIGFsbG93ZWQgdG8gaW52b2tlIHRvcG9sb2d5IG9wZXJhdGlvbnMsIHN1Y2ggYXMgYXR0YWNoL2RldGFjaAorICogb2YgbmV0d29yayBvYmplY3RzLgorICovCisjZGVmaW5lIERQUkNfQ0ZHX09QVF9UT1BPTE9HWV9DSEFOR0VTX0FMTE9XRUQJMHgwMDAwMDAwOAorCisvKiBJT01NVSBieXBhc3MgLSBpbmRpY2F0ZXMgd2hldGhlciBvYmplY3RzIG9mIHRoaXMgY29udGFpbmVyIGFyZSBwZXJtaXR0ZWQKKyAqIHRvIGJ5cGFzcyB0aGUgSU9NTVUuCisgKi8KKyNkZWZpbmUgRFBSQ19DRkdfT1BUX0lPTU1VX0JZUEFTUwkJMHgwMDAwMDAxMAorCisvKiBBSU9QIC0gSW5kaWNhdGVzIHRoYXQgY29udGFpbmVyIGJlbG9uZ3MgdG8gQUlPUC4gICovCisjZGVmaW5lIERQUkNfQ0ZHX09QVF9BSU9QCQkJMHgwMDAwMDAyMAorCisvKioKKyAqIHN0cnVjdCBkcHJjX2NmZyAtIENvbnRhaW5lciBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAqIEBpY2lkOiBDb250YWluZXIncyBJQ0lEOyBpZiBzZXQgdG8gJ0RQUkNfR0VUX0lDSURfRlJPTV9QT09MJywgYSBmcmVlCisgKgkJSUNJRCB2YWx1ZSBpcyBhbGxvY2F0ZWQgYnkgdGhlIERQUkMKKyAqIEBwb3J0YWxfaWQ6IFBvcnRhbCBJRDsgaWYgc2V0IHRvICdEUFJDX0dFVF9QT1JUQUxfSURfRlJPTV9QT09MJywgYSBmcmVlCisgKgkJcG9ydGFsIElEIGlzIGFsbG9jYXRlZCBieSB0aGUgRFBSQworICogQG9wdGlvbnM6IENvbWJpbmF0aW9uIG9mICdEUFJDX0NGR19PUFRfPFg+JyBvcHRpb25zCisgKi8KK3N0cnVjdCBkcHJjX2NmZyB7CisJdWludDE2X3QgaWNpZDsKKwlpbnQgcG9ydGFsX2lkOworCXVpbnQ2NF90IG9wdGlvbnM7Cit9OworCisvKioKKyAqIGRwcmNfY3JlYXRlX2NvbnRhaW5lcigpIC0gQ3JlYXRlIGNoaWxkIGNvbnRhaW5lcgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBjZmc6CUNoaWxkIGNvbnRhaW5lciBjb25maWd1cmF0aW9uCisgKiBAY2hpbGRfY29udGFpbmVyX2lkOglSZXR1cm5lZCBjaGlsZCBjb250YWluZXIgSUQKKyAqIEBjaGlsZF9wb3J0YWxfcGFkZHI6CVJldHVybmVkIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUKKyAqCQkJCQljaGlsZCBwb3J0YWwKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfY3JlYXRlX2NvbnRhaW5lcihzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCSAgdWludDE2X3QJCXRva2VuLAorCQkJICBzdHJ1Y3QgZHByY19jZmcJKmNmZywKKwkJCSAgaW50CQkJKmNoaWxkX2NvbnRhaW5lcl9pZCwKKwkJCSAgdWludDY0X3QJCSpjaGlsZF9wb3J0YWxfcGFkZHIpOworCisvKioKKyAqIGRwcmNfZGVzdHJveV9jb250YWluZXIoKSAtIERlc3Ryb3kgY2hpbGQgY29udGFpbmVyLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBjaGlsZF9jb250YWluZXJfaWQ6CUlEIG9mIHRoZSBjb250YWluZXIgdG8gZGVzdHJveQorICoKKyAqIFRoaXMgZnVuY3Rpb24gdGVybWluYXRlcyB0aGUgY2hpbGQgY29udGFpbmVyLCBzbyBmb2xsb3dpbmcgdGhpcyBjYWxsIHRoZQorICogY2hpbGQgY29udGFpbmVyIElEIGJlY29tZXMgaW52YWxpZC4KKyAqCisgKiBOb3RlczoKKyAqIC0gQWxsIHJlc291cmNlcyBhbmQgb2JqZWN0cyBvZiB0aGUgZGVzdHJveWVkIGNvbnRhaW5lciBhcmUgcmV0dXJuZWQgdG8gdGhlCisgKiBwYXJlbnQgY29udGFpbmVyIG9yIGRlc3Ryb3llZCBpZiB3ZXJlIGNyZWF0ZWQgYmUgdGhlIGRlc3Ryb3llZCBjb250YWluZXIuCisgKiAtIFRoaXMgZnVuY3Rpb24gZGVzdHJveSBhbGwgdGhlIGNoaWxkIGNvbnRhaW5lcnMgb2YgdGhlIHNwZWNpZmllZAorICogICBjb250YWluZXIgcHJpb3IgdG8gZGVzdHJveWluZyB0aGUgY29udGFpbmVyIGl0c2VsZi4KKyAqCisgKiB3YXJuaW5nOiBPbmx5IHRoZSBwYXJlbnQgY29udGFpbmVyIGlzIGFsbG93ZWQgdG8gZGVzdHJveSBhIGNoaWxkIHBvbGljeQorICoJCUNvbnRhaW5lciAwIGNhbid0IGJlIGRlc3Ryb3llZAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICoKKyAqLworaW50IGRwcmNfZGVzdHJveV9jb250YWluZXIoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQkgICB1aW50MTZfdAkJdG9rZW4sCisJCQkgICBpbnQJCQljaGlsZF9jb250YWluZXJfaWQpOworCisvKioKKyAqIGRwcmNfcmVzZXRfY29udGFpbmVyIC0gUmVzZXQgY2hpbGQgY29udGFpbmVyLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBjaGlsZF9jb250YWluZXJfaWQ6CUlEIG9mIHRoZSBjb250YWluZXIgdG8gcmVzZXQKKyAqCisgKiBJbiBjYXNlIGEgc29mdHdhcmUgY29udGV4dCBjcmFzaGVzIG9yIGJlY29tZXMgbm9uLXJlc3BvbnNpdmUsIHRoZSBwYXJlbnQKKyAqIG1heSB3aXNoIHRvIHJlc2V0IGl0cyByZXNvdXJjZXMgY29udGFpbmVyIGJlZm9yZSB0aGUgc29mdHdhcmUgY29udGV4dCBpcworICogcmVzdGFydGVkLgorICoKKyAqIFRoaXMgcm91dGluZSBpbmZvcm1zIGFsbCBvYmplY3RzIGFzc2lnbmVkIHRvIHRoZSBjaGlsZCBjb250YWluZXIgdGhhdCB0aGUKKyAqIGNvbnRhaW5lciBpcyBiZWluZyByZXNldCwgc28gdGhleSBtYXkgcGVyZm9ybSBhbnkgY2xlYW51cCBvcGVyYXRpb25zIHRoYXQgYXJlCisgKiBuZWVkZWQuIEFsbCBvYmplY3RzIGhhbmRsZXMgdGhhdCB3ZXJlIG93bmVkIGJ5IHRoZSBjaGlsZCBjb250YWluZXIgc2hhbGwgYmUKKyAqIGNsb3NlZC4KKyAqCisgKiBOb3RlIHRoYXQgc3VjaCByZXF1ZXN0IG1heSBiZSBzdWJtaXR0ZWQgZXZlbiBpZiB0aGUgY2hpbGQgc29mdHdhcmUgY29udGV4dAorICogaGFzIG5vdCBjcmFzaGVkLCBidXQgdGhlIHJlc3VsdGluZyBvYmplY3QgY2xlYW51cCBvcGVyYXRpb25zIHdpbGwgbm90IGJlCisgKiBhd2FyZSBvZiB0aGF0LgorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19yZXNldF9jb250YWluZXIoc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkgdWludDE2X3QgdG9rZW4sCisJCQkgaW50IGNoaWxkX2NvbnRhaW5lcl9pZCk7CisKKy8qIElSUSAqLworCisvKiBOdW1iZXIgb2YgZHByYydzIElSUXMgKi8KKyNkZWZpbmUgRFBSQ19OVU1fT0ZfSVJRUwkJMQorCisvKiBPYmplY3QgaXJxIGV2ZW50cyAqLworCisvKiBJUlEgZXZlbnQgLSBJbmRpY2F0ZXMgdGhhdCBhIG5ldyBvYmplY3QgYXNzaWduZWQgdG8gdGhlIGNvbnRhaW5lciAqLworI2RlZmluZSBEUFJDX0lSUV9FVkVOVF9PQkpfQURERUQJCTB4MDAwMDAwMDEKKy8qIElSUSBldmVudCAtIEluZGljYXRlcyB0aGF0IGFuIG9iamVjdCB3YXMgdW5hc3NpZ25lZCBmcm9tIHRoZSBjb250YWluZXIgKi8KKyNkZWZpbmUgRFBSQ19JUlFfRVZFTlRfT0JKX1JFTU9WRUQJCTB4MDAwMDAwMDIKKy8qIElSUSBldmVudCAtIEluZGljYXRlcyB0aGF0IHJlc291cmNlcyBhc3NpZ25lZCB0byB0aGUgY29udGFpbmVyICovCisjZGVmaW5lIERQUkNfSVJRX0VWRU5UX1JFU19BRERFRAkJMHgwMDAwMDAwNAorLyogSVJRIGV2ZW50IC0gSW5kaWNhdGVzIHRoYXQgcmVzb3VyY2VzIHVuYXNzaWduZWQgZnJvbSB0aGUgY29udGFpbmVyICovCisjZGVmaW5lIERQUkNfSVJRX0VWRU5UX1JFU19SRU1PVkVECQkweDAwMDAwMDA4CisvKiBJUlEgZXZlbnQgLSBJbmRpY2F0ZXMgdGhhdCBvbmUgb2YgdGhlIGRlc2NlbmRhbnQgY29udGFpbmVycyB0aGF0IG9wZW5lZCBieQorICogdGhpcyBjb250YWluZXIgaXMgZGVzdHJveWVkCisgKi8KKyNkZWZpbmUgRFBSQ19JUlFfRVZFTlRfQ09OVEFJTkVSX0RFU1RST1lFRAkweDAwMDAwMDEwCisKKy8qIElSUSBldmVudCAtIEluZGljYXRlcyB0aGF0IG9uIG9uZSBvZiB0aGUgY29udGFpbmVyJ3Mgb3BlbmVkIG9iamVjdCBpcworICogZGVzdHJveWVkCisgKi8KKyNkZWZpbmUgRFBSQ19JUlFfRVZFTlRfT0JKX0RFU1RST1lFRAkJMHgwMDAwMDAyMAorCisvKiBJcnEgZXZlbnQgLSBJbmRpY2F0ZXMgdGhhdCBvYmplY3QgaXMgY3JlYXRlZCBhdCB0aGUgY29udGFpbmVyICovCisjZGVmaW5lIERQUkNfSVJRX0VWRU5UX09CSl9DUkVBVEVECQkweDAwMDAwMDQwCisKKy8qKgorICogZHByY19zZXRfaXJxKCkgLSBTZXQgSVJRIGluZm9ybWF0aW9uIGZvciB0aGUgRFBSQyB0byB0cmlnZ2VyIGFuIGludGVycnVwdC4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAaXJxX2luZGV4OglJZGVudGlmaWVzIHRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAaXJxX2FkZHI6CUFkZHJlc3MgdGhhdCBtdXN0IGJlIHdyaXR0ZW4gdG8KKyAqCQkJc2lnbmFsIGEgbWVzc2FnZS1iYXNlZCBpbnRlcnJ1cHQKKyAqIEBpcnFfdmFsOglWYWx1ZSB0byB3cml0ZSBpbnRvIGlycV9hZGRyIGFkZHJlc3MKKyAqIEB1c2VyX2lycV9pZDogUmV0dXJuZWQgYSB1c2VyIGRlZmluZWQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIElSUQorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19zZXRfaXJxKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkgdWludDE2X3QJCXRva2VuLAorCQkgdWludDhfdAkJaXJxX2luZGV4LAorCQkgdWludDY0X3QJCWlycV9hZGRyLAorCQkgdWludDMyX3QJCWlycV92YWwsCisJCSBpbnQJCQl1c2VyX2lycV9pZCk7CisKKy8qKgorICogZHByY19nZXRfaXJxKCkgLSBHZXQgSVJRIGluZm9ybWF0aW9uIGZyb20gdGhlIERQUkMuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEB0eXBlOglSZXR1cm5lZCBpbnRlcnJ1cHQgdHlwZTogMCByZXByZXNlbnRzIG1lc3NhZ2UgaW50ZXJydXB0CisgKgkJCXR5cGUgKGJvdGggaXJxX2FkZHIgYW5kIGlycV92YWwgYXJlIHZhbGlkKQorICogQGlycV9hZGRyOglSZXR1cm5lZCBhZGRyZXNzIHRoYXQgbXVzdCBiZSB3cml0dGVuIHRvCisgKgkJCXNpZ25hbCB0aGUgbWVzc2FnZS1iYXNlZCBpbnRlcnJ1cHQKKyAqIEBpcnFfdmFsOglWYWx1ZSB0byB3cml0ZSBpbnRvIGlycV9hZGRyIGFkZHJlc3MKKyAqIEB1c2VyX2lycV9pZDogQSB1c2VyIGRlZmluZWQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIElSUQorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19nZXRfaXJxKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkgdWludDE2X3QJCXRva2VuLAorCQkgdWludDhfdAkJaXJxX2luZGV4LAorCQkgaW50CQkJKnR5cGUsCisJCSB1aW50NjRfdAkJKmlycV9hZGRyLAorCQkgdWludDMyX3QJCSppcnFfdmFsLAorCQkgaW50CQkJKnVzZXJfaXJxX2lkKTsKKworLyoqCisgKiBkcHJjX3NldF9pcnFfZW5hYmxlKCkgLSBTZXQgb3ZlcmFsbCBpbnRlcnJ1cHQgc3RhdGUuCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBlbjoJCUludGVycnVwdCBzdGF0ZSAtIGVuYWJsZSA9IDEsIGRpc2FibGUgPSAwCisgKgorICogQWxsb3dzIEdQUCBzb2Z0d2FyZSB0byBjb250cm9sIHdoZW4gaW50ZXJydXB0cyBhcmUgZ2VuZXJhdGVkLgorICogRWFjaCBpbnRlcnJ1cHQgY2FuIGhhdmUgdXAgdG8gMzIgY2F1c2VzLiAgVGhlIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2wncyB0aGUKKyAqIG92ZXJhbGwgaW50ZXJydXB0IHN0YXRlLiBpZiB0aGUgaW50ZXJydXB0IGlzIGRpc2FibGVkIG5vIGNhdXNlcyB3aWxsIGNhdXNlCisgKiBhbiBpbnRlcnJ1cHQuCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX3NldF9pcnFfZW5hYmxlKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJdWludDE2X3QJCXRva2VuLAorCQkJdWludDhfdAkJCWlycV9pbmRleCwKKwkJCXVpbnQ4X3QJCQllbik7CisKKy8qKgorICogZHByY19nZXRfaXJxX2VuYWJsZSgpIC0gR2V0IG92ZXJhbGwgaW50ZXJydXB0IHN0YXRlLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBpcnFfaW5kZXg6ICBUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQGVuOgkJUmV0dXJuZWQgaW50ZXJydXB0IHN0YXRlIC0gZW5hYmxlID0gMSwgZGlzYWJsZSA9IDAKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X2lycV9lbmFibGUoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQl1aW50MTZfdAkJdG9rZW4sCisJCQl1aW50OF90CQkJaXJxX2luZGV4LAorCQkJdWludDhfdAkJCSplbik7CisKKy8qKgorICogZHByY19zZXRfaXJxX21hc2soKSAtIFNldCBpbnRlcnJ1cHQgbWFzay4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQG1hc2s6CWV2ZW50IG1hc2sgdG8gdHJpZ2dlciBpbnRlcnJ1cHQ7CisgKgkJCWVhY2ggYml0OgorICoJCQkJMCA9IGlnbm9yZSBldmVudAorICoJCQkJMSA9IGNvbnNpZGVyIGV2ZW50IGZvciBhc3NlcnRpbmcgaXJxCisgKgorICogRXZlcnkgaW50ZXJydXB0IGNhbiBoYXZlIHVwIHRvIDMyIGNhdXNlcyBhbmQgdGhlIGludGVycnVwdCBtb2RlbCBzdXBwb3J0cworICogbWFza2luZy91bm1hc2tpbmcgZWFjaCBjYXVzZSBpbmRlcGVuZGVudGx5CisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX3NldF9pcnFfbWFzayhzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJICAgICAgdWludDE2X3QJCXRva2VuLAorCQkgICAgICB1aW50OF90CQlpcnFfaW5kZXgsCisJCSAgICAgIHVpbnQzMl90CQltYXNrKTsKKworLyoqCisgKiBkcHJjX2dldF9pcnFfbWFzaygpIC0gR2V0IGludGVycnVwdCBtYXNrLgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEBpcnFfaW5kZXg6CVRoZSBpbnRlcnJ1cHQgaW5kZXggdG8gY29uZmlndXJlCisgKiBAbWFzazoJUmV0dXJuZWQgZXZlbnQgbWFzayB0byB0cmlnZ2VyIGludGVycnVwdAorICoKKyAqIEV2ZXJ5IGludGVycnVwdCBjYW4gaGF2ZSB1cCB0byAzMiBjYXVzZXMgYW5kIHRoZSBpbnRlcnJ1cHQgbW9kZWwgc3VwcG9ydHMKKyAqIG1hc2tpbmcvdW5tYXNraW5nIGVhY2ggY2F1c2UgaW5kZXBlbmRlbnRseQorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19nZXRfaXJxX21hc2soc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSAgICAgIHVpbnQxNl90CQl0b2tlbiwKKwkJICAgICAgdWludDhfdAkJaXJxX2luZGV4LAorCQkgICAgICB1aW50MzJfdAkJKm1hc2spOworCisvKioKKyAqIGRwcmNfZ2V0X2lycV9zdGF0dXMoKSAtIEdldCB0aGUgY3VycmVudCBzdGF0dXMgb2YgYW55IHBlbmRpbmcgaW50ZXJydXB0cy4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAaXJxX2luZGV4OglUaGUgaW50ZXJydXB0IGluZGV4IHRvIGNvbmZpZ3VyZQorICogQHN0YXR1czoJUmV0dXJuZWQgaW50ZXJydXB0cyBzdGF0dXMgLSBvbmUgYml0IHBlciBjYXVzZToKKyAqCQkJMCA9IG5vIGludGVycnVwdCBwZW5kaW5nCisgKgkJCTEgPSBpbnRlcnJ1cHQgcGVuZGluZworICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19nZXRfaXJxX3N0YXR1cyhzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCXVpbnQxNl90CQl0b2tlbiwKKwkJCXVpbnQ4X3QJCQlpcnFfaW5kZXgsCisJCQl1aW50MzJfdAkJKnN0YXR1cyk7CisKKy8qKgorICogZHByY19jbGVhcl9pcnFfc3RhdHVzKCkgLSBDbGVhciBhIHBlbmRpbmcgaW50ZXJydXB0J3Mgc3RhdHVzCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGlycV9pbmRleDoJVGhlIGludGVycnVwdCBpbmRleCB0byBjb25maWd1cmUKKyAqIEBzdGF0dXM6CWJpdHMgdG8gY2xlYXIgKFcxQykgLSBvbmUgYml0IHBlciBjYXVzZToKKyAqCQkJCQkwID0gZG9uJ3QgY2hhbmdlCisgKgkJCQkJMSA9IGNsZWFyIHN0YXR1cyBiaXQKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfY2xlYXJfaXJxX3N0YXR1cyhzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCSAgdWludDE2X3QJCXRva2VuLAorCQkJICB1aW50OF90CQlpcnFfaW5kZXgsCisJCQkgIHVpbnQzMl90CQlzdGF0dXMpOworCisvKioKKyAqIHN0cnVjdCBkcHJjX2F0dHJpYnV0ZXMgLSBDb250YWluZXIgYXR0cmlidXRlcworICogQGNvbnRhaW5lcl9pZDogQ29udGFpbmVyJ3MgSUQKKyAqIEBpY2lkOiBDb250YWluZXIncyBJQ0lECisgKiBAcG9ydGFsX2lkOiBDb250YWluZXIncyBwb3J0YWwgSUQKKyAqIEBvcHRpb25zOiBDb250YWluZXIncyBvcHRpb25zIGFzIHNldCBhdCBjb250YWluZXIncyBjcmVhdGlvbgorICogQHZlcnNpb246IERQUkMgdmVyc2lvbgorICovCitzdHJ1Y3QgZHByY19hdHRyaWJ1dGVzIHsKKwlpbnQgY29udGFpbmVyX2lkOworCXVpbnQxNl90IGljaWQ7CisJaW50IHBvcnRhbF9pZDsKKwl1aW50NjRfdCBvcHRpb25zOworCS8qKgorCSAqIHN0cnVjdCB2ZXJzaW9uIC0gRFBSQyB2ZXJzaW9uCisJICogQG1ham9yOiBEUFJDIG1ham9yIHZlcnNpb24KKwkgKiBAbWlub3I6IERQUkMgbWlub3IgdmVyc2lvbgorCSAqLworCXN0cnVjdCB7CisJCXVpbnQxNl90IG1ham9yOworCQl1aW50MTZfdCBtaW5vcjsKKwl9IHZlcnNpb247Cit9OworCisvKioKKyAqIGRwcmNfZ2V0X2F0dHJpYnV0ZXMoKSAtIE9idGFpbnMgY29udGFpbmVyIGF0dHJpYnV0ZXMKKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAYXR0cmlidXRlcwlSZXR1cm5lZCBjb250YWluZXIgYXR0cmlidXRlcworICoKKyAqIFJldHVybjogICAgICcwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X2F0dHJpYnV0ZXMoc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQl1aW50MTZfdAkJdG9rZW4sCisJCQlzdHJ1Y3QgZHByY19hdHRyaWJ1dGVzCSphdHRyaWJ1dGVzKTsKKworLyoqCisgKiBkcHJjX3NldF9yZXNfcXVvdGEoKSAtIFNldCBhbGxvY2F0aW9uIHBvbGljeSBmb3IgYSBzcGVjaWZpYyByZXNvdXJjZS9vYmplY3QKKyAqCQl0eXBlIGluIGEgY2hpbGQgY29udGFpbmVyCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGNoaWxkX2NvbnRhaW5lcl9pZDoJSUQgb2YgdGhlIGNoaWxkIGNvbnRhaW5lcgorICogQHR5cGU6CVJlc291cmNlL29iamVjdCB0eXBlCisgKiBAcXVvdGE6CVNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlc291cmNlcyBvZgl0aGUgc2VsZWN0ZWQgdHlwZQorICoJCXRoYXQgdGhlIGNoaWxkIGNvbnRhaW5lciBpcyBhbGxvd2VkIHRvIGFsbG9jYXRlIGZyb20gaXRzIHBhcmVudDsKKyAqCQl3aGVuIHF1b3RhIGlzIHNldCB0byAtMSwgdGhlIHBvbGljeSBpcyB0aGUgc2FtZSBhcyBjb250YWluZXIncworICoJCWdlbmVyYWwgcG9saWN5LgorICoKKyAqIEFsbG9jYXRpb24gcG9saWN5IGRldGVybWluZXMgd2hldGhlciBvciBub3QgYSBjb250YWluZXIgbWF5IGFsbG9jYXRlCisgKiByZXNvdXJjZXMgZnJvbSBpdHMgcGFyZW50LiBFYWNoIGNvbnRhaW5lciBoYXMgYSAnZ2xvYmFsJyBhbGxvY2F0aW9uIHBvbGljeQorICogdGhhdCBpcyBzZXQgd2hlbiB0aGUgY29udGFpbmVyIGlzIGNyZWF0ZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIGFsbG9jYXRpb24gcG9saWN5IGZvciBhIHNwZWNpZmljIHJlc291cmNlIHR5cGUuCisgKiBUaGUgZGVmYXVsdCBwb2xpY3kgZm9yIGFsbCByZXNvdXJjZSB0eXBlcyBtYXRjaGVzIHRoZSBjb250YWluZXIncyAnZ2xvYmFsJworICogYWxsb2NhdGlvbiBwb2xpY3kuCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKgorICogQHdhcm5pbmcJT25seSB0aGUgcGFyZW50IGNvbnRhaW5lciBpcyBhbGxvd2VkIHRvIGNoYW5nZSBhIGNoaWxkIHBvbGljeS4KKyAqLworaW50IGRwcmNfc2V0X3Jlc19xdW90YShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJICAgICAgIHVpbnQxNl90CQl0b2tlbiwKKwkJICAgICAgIGludAkJY2hpbGRfY29udGFpbmVyX2lkLAorCQkgICAgICAgY2hhcgkJKnR5cGUsCisJCSAgICAgICB1aW50MTZfdAkJcXVvdGEpOworCisvKioKKyAqIGRwcmNfZ2V0X3Jlc19xdW90YSgpIC0gR2V0cyB0aGUgYWxsb2NhdGlvbiBwb2xpY3kgb2YgYSBzcGVjaWZpYworICoJCXJlc291cmNlL29iamVjdCB0eXBlIGluIGEgY2hpbGQgY29udGFpbmVyCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQGNoaWxkX2NvbnRhaW5lcl9pZDsJSUQgb2YgdGhlIGNoaWxkIGNvbnRhaW5lcgorICogQHR5cGU6CXJlc291cmNlL29iamVjdCB0eXBlCisgKiBAcXVvdGE6CVJldHVybmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvdXJjZXMgb2YgdGhlIHNlbGVjdGVkIHR5cGUKKyAqCQl0aGF0IHRoZSBjaGlsZCBjb250YWluZXIgaXMgYWxsb3dlZCB0byBhbGxvY2F0ZSBmcm9tIHRoZSBwYXJlbnQ7CisgKgkJd2hlbiBxdW90YSBpcyBzZXQgdG8gLTEsIHRoZSBwb2xpY3kgaXMgdGhlIHNhbWUgYXMgY29udGFpbmVyJ3MKKyAqCQlnZW5lcmFsIHBvbGljeS4KKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X3Jlc19xdW90YShzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJICAgICAgIHVpbnQxNl90CQl0b2tlbiwKKwkJICAgICAgIGludAkJY2hpbGRfY29udGFpbmVyX2lkLAorCQkgICAgICAgY2hhcgkJKnR5cGUsCisJCSAgICAgICB1aW50MTZfdAkJKnF1b3RhKTsKKworLyogUmVzb3VyY2UgcmVxdWVzdCBvcHRpb25zICovCisKKy8qIEV4cGxpY2l0IHJlc291cmNlIElEIHJlcXVlc3QgLSBUaGUgcmVxdWVzdGVkIG9iamVjdHMvcmVzb3VyY2VzCisgKiBhcmUgZXhwbGljaXQgYW5kIHNlcXVlbnRpYWwgKGluIGNhc2Ugb2YgcmVzb3VyY2VzKS4KKyAqIFRoZSBiYXNlIElEIGlzIGdpdmVuIGF0IHJlc19yZXEgYXQgYmFzZV9hbGlnbiBmaWVsZAorICovCisjZGVmaW5lIERQUkNfUkVTX1JFUV9PUFRfRVhQTElDSVQJCTB4MDAwMDAwMDEKKworLyogQWxpZ25lZCByZXNvdXJjZXMgcmVxdWVzdCAtIFJlbGV2YW50IG9ubHkgZm9yIHJlc291cmNlcworICogcmVxdWVzdCAoYW5kIG5vdCBvYmplY3RzKS4gSW5kaWNhdGVzIHRoYXQgcmVzb3VyY2VzIGJhc2UgSUQgc2hvdWxkIGJlCisgKiBzZXF1ZW50aWFsIGFuZCBhbGlnbmVkIHRvIHRoZSB2YWx1ZSBnaXZlbiBhdCBkcHJjX3Jlc19yZXEgYmFzZV9hbGlnbiBmaWVsZAorICovCisjZGVmaW5lIERQUkNfUkVTX1JFUV9PUFRfQUxJR05FRAkJMHgwMDAwMDAwMgorCisvKiBQbHVnZ2VkIEZsYWcgLSBSZWxldmFudCBvbmx5IGZvciBvYmplY3QgYXNzaWdubWVudCByZXF1ZXN0LgorICogSW5kaWNhdGVzIHRoYXQgYWZ0ZXIgYWxsIG9iamVjdHMgYXNzaWduZWQuIEFuIGludGVycnVwdCB3aWxsIGJlIGludm9rZWQgYXQKKyAqIHRoZSByZWxldmFudCBHUFAuIFRoZSBhc3NpZ25lZCBvYmplY3Qgd2lsbCBiZSBtYXJrZWQgYXMgcGx1Z2dlZC4KKyAqIHBsdWdnZWQgb2JqZWN0cyBjYW4ndCBiZSBhc3NpZ25lZCBmcm9tIHRoZWlyIGNvbnRhaW5lcgorICovCisjZGVmaW5lIERQUkNfUkVTX1JFUV9PUFRfUExVR0dFRAkJMHgwMDAwMDAwNAorCisvKioKKyAqIHN0cnVjdCBkcHJjX3Jlc19yZXEgLSBSZXNvdXJjZSByZXF1ZXN0IGRlc2NyaXB0b3IsIHRvIGJlIHVzZWQgaW4gYXNzaWdubWVudAorICoJCQlvciB1bi1hc3NpZ25tZW50IG9mIHJlc291cmNlcyBhbmQgb2JqZWN0cy4KKyAqIEB0eXBlOiBSZXNvdXJjZS9vYmplY3QgdHlwZTogUmVwcmVzZW50IGFzIGEgTlVMTCB0ZXJtaW5hdGVkIHN0cmluZy4KKyAqCVRoaXMgc3RyaW5nIG1heSByZWNlaXZlZCBieSB1c2luZyBkcHJjX2dldF9wb29sKCkgdG8gZ2V0IHJlc291cmNlCisgKgl0eXBlIGFuZCBkcHJjX2dldF9vYmooKSB0byBnZXQgb2JqZWN0IHR5cGU7CisgKglOb3RlOiBpdCBpcyBub3QgcG9zc2libGUgdG8gYXNzaWduL3VuLWFzc2lnbiBEUFJDIG9iamVjdHMKKyAqIEBudW06IE51bWJlciBvZiByZXNvdXJjZXMKKyAqIEBvcHRpb25zOiBSZXF1ZXN0IG9wdGlvbnM6IGNvbWJpbmF0aW9uIG9mIERQUkNfUkVTX1JFUV9PUFRfIG9wdGlvbnMKKyAqIEBpZF9iYXNlX2FsaWduOiBJbiBjYXNlIG9mIGV4cGxpY2l0IGFzc2lnbm1lbnQgKERQUkNfUkVTX1JFUV9PUFRfRVhQTElDSVQKKyAqCQlpcyBzZXQgYXQgb3B0aW9uKSwgdGhpcyBmaWVsZCByZXByZXNlbnRzIHRoZSByZXF1aXJlZCBiYXNlIElECisgKgkJZm9yIHJlc291cmNlIGFsbG9jYXRpb247IEluIGNhc2Ugb2YgYWxpZ25lZCBhc3NpZ25tZW50CisgKgkJKERQUkNfUkVTX1JFUV9PUFRfQUxJR05FRCBpcyBzZXQgYXQgb3B0aW9uKSwgdGhpcyBmaWVsZAorICoJCWluZGljYXRlcyB0aGUgcmVxdWlyZWQgYWxpZ25tZW50IGZvciB0aGUgcmVzb3VyY2UgSUQocykgLQorICoJCXVzZSAwIGlmIHRoZXJlIGlzIG5vIGFsaWdubWVudCBvciBleHBsaWNpdCBJRCByZXF1aXJlbWVudHMKKyAqLworc3RydWN0IGRwcmNfcmVzX3JlcSB7CisJY2hhciB0eXBlWzE2XTsKKwl1aW50MzJfdCBudW07CisJdWludDMyX3Qgb3B0aW9uczsKKwlpbnQgaWRfYmFzZV9hbGlnbjsKK307CisKKy8qKgorICogZHByY19hc3NpZ24oKSAtIEFzc2lnbnMgb2JqZWN0cyBvciByZXNvdXJjZSB0byBhIGNoaWxkIGNvbnRhaW5lci4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAY29udGFpbmVyX2lkOiBJRCBvZiB0aGUgY2hpbGQgY29udGFpbmVyCisgKiBAcmVzX3JlcToJRGVzY3JpYmVzIHRoZSB0eXBlIGFuZCBhbW91bnQgb2YgcmVzb3VyY2VzIHRvCisgKgkJCWFzc2lnbiB0byB0aGUgZ2l2ZW4gY29udGFpbmVyCisgKgorICogQXNzaWdubWVudCBpcyB1c3VhbGx5IGRvbmUgYnkgYSBwYXJlbnQgKHRoaXMgRFBSQykgdG8gb25lIG9mIGl0cyBjaGlsZAorICogY29udGFpbmVycy4KKyAqCisgKiBBY2NvcmRpbmcgdG8gdGhlIERQUkMgYWxsb2NhdGlvbiBwb2xpY3ksIHRoZSBhc3NpZ25lZCByZXNvdXJjZXMgbWF5IGJlIHRha2VuCisgKiAoYWxsb2NhdGVkKSBmcm9tIHRoZSBjb250YWluZXIncyBhbmNlc3RvcnMsIGlmIG5vdCBlbm91Z2ggcmVzb3VyY2VzIGFyZQorICogYXZhaWxhYmxlIGluIHRoZSBjb250YWluZXIgaXRzZWxmLgorICoKKyAqIFRoZSB0eXBlIG9mIGFzc2lnbm1lbnQgZGVwZW5kcyBvbiB0aGUgZHByY19yZXNfcmVxIG9wdGlvbnMsIGFzIGZvbGxvd3M6CisgKiAtIERQUkNfUkVTX1JFUV9PUFRfRVhQTElDSVQ6IGluZGljYXRlcyB0aGF0IGFzc2lnbmVkIHJlc291cmNlcyBzaG91bGQgaGF2ZQorICogICB0aGUgZXhwbGljaXQgYmFzZSBJRCBzcGVjaWZpZWQgYXQgdGhlIGlkX2Jhc2VfYWxpZ24gZmllbGQgb2YgcmVzX3JlcS4KKyAqIC0gRFBSQ19SRVNfUkVRX09QVF9BTElHTkVEOiBpbmRpY2F0ZXMgdGhhdCB0aGUgYXNzaWduZWQgcmVzb3VyY2VzIHNob3VsZCBiZQorICogICBhbGlnbmVkIHRvIHRoZSB2YWx1ZSBnaXZlbiBhdCBpZF9iYXNlX2FsaWduIGZpZWxkIG9mIHJlc19yZXEuCisgKiAtIERQUkNfUkVTX1JFUV9PUFRfUExVR0dFRDogUmVsZXZhbnQgb25seSBmb3Igb2JqZWN0IGFzc2lnbm1lbnQsCisgKiAgIGFuZCBpbmRpY2F0ZXMgdGhhdCB0aGUgb2JqZWN0IG11c3QgYmUgc2V0IHRvIHRoZSBwbHVnZ2VkIHN0YXRlLgorICoKKyAqIEEgY29udGFpbmVyIG1heSB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoIGl0cyBvd24gSUQgaW4gb3JkZXIgdG8gY2hhbmdlIGEKKyAqIG9iamVjdCBzdGF0ZSB0byBwbHVnZ2VkIG9yIHVucGx1Z2dlZC4KKyAqCisgKiBJZiBJUlEgaW5mb3JtYXRpb24gaGFzIGJlZW4gc2V0IGluIHRoZSBjaGlsZCBEUFJDLCBpdCB3aWxsIHNpZ25hbCBhbgorICogaW50ZXJydXB0IGZvbGxvd2luZyBldmVyeSBjaGFuZ2UgaW4gaXRzIG9iamVjdCBhc3NpZ25tZW50LgorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19hc3NpZ24oc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCXVpbnQxNl90CQl0b2tlbiwKKwkJaW50CQkJY29udGFpbmVyX2lkLAorCQlzdHJ1Y3QgZHByY19yZXNfcmVxCSpyZXNfcmVxKTsKKworLyoqCisgKiBkcHJjX3VuYXNzaWduKCkgLSBVbi1hc3NpZ25zIG9iamVjdHMgb3IgcmVzb3VyY2VzIGZyb20gYSBjaGlsZCBjb250YWluZXIKKyAqCQlhbmQgbW92ZXMgdGhlbSBpbnRvIHRoaXMgKHBhcmVudCkgRFBSQy4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAY2hpbGRfY29udGFpbmVyX2lkOglJRCBvZiB0aGUgY2hpbGQgY29udGFpbmVyCisgKiBAcmVzX3JlcToJRGVzY3JpYmVzIHRoZSB0eXBlIGFuZCBhbW91bnQgb2YgcmVzb3VyY2VzIHRvIHVuLWFzc2lnbiBmcm9tCisgKgkJdGhlIGNoaWxkIGNvbnRhaW5lcgorICoKKyAqIFVuLWFzc2lnbm1lbnQgb2Ygb2JqZWN0cyBjYW4gc3VjY2VlZCBvbmx5IGlmIHRoZSBvYmplY3QgaXMgbm90IGluIHRoZQorICogcGx1Z2dlZCBvciBvcGVuZWQgc3RhdGUuCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX3VuYXNzaWduKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkgIHVpbnQxNl90CQl0b2tlbiwKKwkJICBpbnQJCQljaGlsZF9jb250YWluZXJfaWQsCisJCSAgc3RydWN0IGRwcmNfcmVzX3JlcQkqcmVzX3JlcSk7CisKKy8qKgorICogZHByY19nZXRfcG9vbF9jb3VudCgpIC0gR2V0IHRoZSBudW1iZXIgb2YgZHByYydzIHBvb2xzCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQHBvb2xfY291bnQ6CVJldHVybmVkIG51bWJlciBvZiByZXNvdXJjZSBwb29scyBpbiB0aGUgZHByYworICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19nZXRfcG9vbF9jb3VudChzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJCXVpbnQxNl90CQl0b2tlbiwKKwkJCWludAkJCSpwb29sX2NvdW50KTsKKworLyoqCisgKiBkcHJjX2dldF9wb29sKCkgLSBHZXQgdGhlIHR5cGUgKHN0cmluZykgb2YgYSBjZXJ0YWluIGRwcmMncyBwb29sCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQHBvb2xfaW5kZXg7CUluZGV4IG9mIHRoZSBwb29sIHRvIGJlIHF1ZXJpZWQgKDwgcG9vbF9jb3VudCkKKyAqIEB0eXBlOglUaGUgdHlwZSBvZiB0aGUgcG9vbAorICoKKyAqIFRoZSBwb29sIHR5cGVzIHJldHJpZXZlZCBvbmUgYnkgb25lIGJ5IGluY3JlbWVudGluZworICogcG9vbF9pbmRleCB1cCB0byAobm90IGluY2x1ZGluZykgdGhlIHZhbHVlIG9mIHBvb2xfY291bnQgcmV0dXJuZWQKKyAqIGZyb20gZHByY19nZXRfcG9vbF9jb3VudCgpLiBkcHJjX2dldF9wb29sX2NvdW50KCkgbXVzdAorICogYmUgY2FsbGVkIHByaW9yIHRvIGRwcmNfZ2V0X3Bvb2woKS4KKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X3Bvb2woc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCSAgdWludDE2X3QJCXRva2VuLAorCQkgIGludAkJCXBvb2xfaW5kZXgsCisJCSAgY2hhcgkJCSp0eXBlKTsKKworLyoqCisgKiBkcHJjX2dldF9vYmpfY291bnQoKSAtIE9idGFpbnMgdGhlIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBEUFJDCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQG9ial9jb3VudDoJTnVtYmVyIG9mIG9iamVjdHMgYXNzaWduZWQgdG8gdGhlIERQUkMKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X29ial9jb3VudChzdHJ1Y3QgZnNsX21jX2lvICptY19pbywgdWludDE2X3QgdG9rZW4sIGludCAqb2JqX2NvdW50KTsKKworLyogT2JqZWN0cyBBdHRyaWJ1dGVzIEZsYWdzICovCisKKy8qIE9wZW5lZCBzdGF0ZSAtIEluZGljYXRlcyB0aGF0IGFuIG9iamVjdCBpcyBvcGVuIGJ5IGF0IGxlYXN0IG9uZSBvd25lciAqLworI2RlZmluZSBEUFJDX09CSl9TVEFURV9PUEVOCQkweDAwMDAwMDAxCisvKiBQbHVnZ2VkIHN0YXRlIC0gSW5kaWNhdGVzIHRoYXQgdGhlIG9iamVjdCBpcyBwbHVnZ2VkICovCisjZGVmaW5lIERQUkNfT0JKX1NUQVRFX1BMVUdHRUQJCTB4MDAwMDAwMDIKKworLyoqCisgKiBzdHJ1Y3QgZHByY19vYmpfZGVzYyAtIE9iamVjdCBkZXNjcmlwdG9yLCByZXR1cm5lZCBmcm9tIGRwcmNfZ2V0X29iaigpCisgKiBAdHlwZTogVHlwZSBvZiBvYmplY3Q6IE5VTEwgdGVybWluYXRlZCBzdHJpbmcKKyAqIEBpZDogSUQgb2YgbG9naWNhbCBvYmplY3QgcmVzb3VyY2UKKyAqIEB2ZW5kb3I6IE9iamVjdCB2ZW5kb3IgaWRlbnRpZmllcgorICogQHZlcl9tYWpvcjogTWFqb3IgdmVyc2lvbiBudW1iZXIKKyAqIEB2ZXJfbWlub3I6ICBNaW5vciB2ZXJzaW9uIG51bWJlcgorICogQGlycV9jb3VudDogTnVtYmVyIG9mIGludGVycnVwdHMgc3VwcG9ydGVkIGJ5IHRoZSBvYmplY3QKKyAqIEByZWdpb25fY291bnQ6IE51bWJlciBvZiBtYXBwYWJsZSByZWdpb25zIHN1cHBvcnRlZCBieSB0aGUgb2JqZWN0CisgKiBAc3RhdGU6IE9iamVjdCBzdGF0ZTogY29tYmluYXRpb24gb2YgRFBSQ19PQkpfU1RBVEVfIHN0YXRlcworICovCitzdHJ1Y3QgZHByY19vYmpfZGVzYyB7CisJY2hhciB0eXBlWzE2XTsKKwlpbnQgaWQ7CisJdWludDE2X3QgdmVuZG9yOworCXVpbnQxNl90IHZlcl9tYWpvcjsKKwl1aW50MTZfdCB2ZXJfbWlub3I7CisJdWludDhfdCBpcnFfY291bnQ7CisJdWludDhfdCByZWdpb25fY291bnQ7CisJdWludDMyX3Qgc3RhdGU7Cit9OworCisvKioKKyAqIGRwcmNfZ2V0X29iaigpIC0gR2V0IGdlbmVyYWwgaW5mb3JtYXRpb24gb24gYW4gb2JqZWN0CisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQG9ial9pbmRleDoJSW5kZXggb2YgdGhlIG9iamVjdCB0byBiZSBxdWVyaWVkICg8IG9ial9jb3VudCkKKyAqIEBvYmpfZGVzYzoJUmV0dXJucyB0aGUgcmVxdWVzdGVkIG9iamVjdCBkZXNjcmlwdG9yCisgKgorICogVGhlIG9iamVjdCBkZXNjcmlwdG9ycyBhcmUgcmV0cmlldmVkIG9uZSBieSBvbmUgYnkgaW5jcmVtZW50aW5nCisgKiBvYmpfaW5kZXggdXAgdG8gKG5vdCBpbmNsdWRpbmcpIHRoZSB2YWx1ZSBvZiBvYmpfY291bnQgcmV0dXJuZWQKKyAqIGZyb20gZHByY19nZXRfb2JqX2NvdW50KCkuIGRwcmNfZ2V0X29ial9jb3VudCgpIG11c3QKKyAqIGJlIGNhbGxlZCBwcmlvciB0byBkcHJjX2dldF9vYmooKS4KKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X29iaihzdHJ1Y3QgZnNsX21jX2lvCSptY19pbywKKwkJIHVpbnQxNl90CQl0b2tlbiwKKwkJIGludAkJCW9ial9pbmRleCwKKwkJIHN0cnVjdCBkcHJjX29ial9kZXNjCSpvYmpfZGVzYyk7CisKKy8qKgorICogZHByY19nZXRfcmVzX2NvdW50KCkgLSBPYnRhaW5zIHRoZSBudW1iZXIgb2YgZnJlZSByZXNvdXJjZXMgdGhhdCBhcmUgYXNzaWduZWQKKyAqCQl0byB0aGlzIGNvbnRhaW5lciwgYnkgcG9vbCB0eXBlCisgKiBAbWNfaW86CVBvaW50ZXIgdG8gTUMgcG9ydGFsJ3MgSS9PIG9iamVjdAorICogQHRva2VuOglUb2tlbiBvZiBEUFJDIG9iamVjdAorICogQHR5cGU6CXBvb2wgdHlwZQorICogQHJlc19jb3VudDoJUmV0dXJuZWQgbnVtYmVyIG9mIGZyZWUgcmVzb3VyY2VzIG9mIHRoZSBnaXZlbgorICoJCQlyZXNvdXJjZSB0eXBlIHRoYXQgYXJlIGFzc2lnbmVkIHRvIHRoaXMgRFBSQworICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19nZXRfcmVzX2NvdW50KHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkgICAgICAgdWludDE2X3QJCXRva2VuLAorCQkgICAgICAgY2hhcgkJKnR5cGUsCisJCSAgICAgICBpbnQJCSpyZXNfY291bnQpOworCisvKioKKyAqIGVudW0gZHByY19pdGVyX3N0YXR1cyAtIEl0ZXJhdGlvbiBzdGF0dXMKKyAqIEBEUFJDX0lURVJfU1RBVFVTX0ZJUlNUOiBQZXJmb3JtIGZpcnN0IGl0ZXJhdGlvbgorICogQERQUkNfSVRFUl9TVEFUVVNfTU9SRTogSW5kaWNhdGVzIG1vcmUvbmV4dCBpdGVyYXRpb24gaXMgbmVlZGVkCisgKiBARFBSQ19JVEVSX1NUQVRVU19MQVNUOiBJbmRpY2F0ZXMgbGFzdCBpdGVyYXRpb24KKyAqLworZW51bSBkcHJjX2l0ZXJfc3RhdHVzIHsKKwlEUFJDX0lURVJfU1RBVFVTX0ZJUlNUID0gMCwKKwlEUFJDX0lURVJfU1RBVFVTX01PUkUgPSAxLAorCURQUkNfSVRFUl9TVEFUVVNfTEFTVCA9IDIKK307CisKKy8qKgorICogc3RydWN0IGRwcmNfcmVzX2lkc19yYW5nZV9kZXNjIC0gUmVzb3VyY2UgSUQgcmFuZ2UgZGVzY3JpcHRvcgorICogQGJhc2VfaWQ6IEJhc2UgcmVzb3VyY2UgSUQgb2YgdGhpcyByYW5nZQorICogQGxhc3RfaWQ6IExhc3QgcmVzb3VyY2UgSUQgb2YgdGhpcyByYW5nZQorICogQGl0ZXJfc3RhdHVzOiBJdGVyYXRpb24gc3RhdHVzIC0gc2hvdWxkIGJlIHNldCB0byBEUFJDX0lURVJfU1RBVFVTX0ZJUlNUIGF0CisgKglmaXJzdCBpdGVyYXRpb247IHdoaWxlIHRoZSByZXR1cm5lZCBtYXJrZXIgaXMgRFBSQ19JVEVSX1NUQVRVU19NT1JFLAorICoJYWRkaXRpb25hbCBpdGVyYXRpb25zIGFyZSBuZWVkZWQsIHVudGlsIHRoZSByZXR1cm5lZCBtYXJrZXIgaXMKKyAqCURQUkNfSVRFUl9TVEFUVVNfTEFTVAorICovCitzdHJ1Y3QgZHByY19yZXNfaWRzX3JhbmdlX2Rlc2MgeworCWludCBiYXNlX2lkOworCWludCBsYXN0X2lkOworCWVudW0gZHByY19pdGVyX3N0YXR1cyBpdGVyX3N0YXR1czsKK307CisKKy8qKgorICogZHByY19nZXRfcmVzX2lkcygpIC0gT2J0YWlucyBJRHMgb2YgZnJlZSByZXNvdXJjZXMgaW4gdGhlIGNvbnRhaW5lcgorICogQG1jX2lvOglQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyAqIEB0b2tlbjoJVG9rZW4gb2YgRFBSQyBvYmplY3QKKyAqIEB0eXBlOglwb29sIHR5cGUKKyAqIEByYW5nZV9kZXNjOglyYW5nZSBkZXNjcmlwdG9yCisgKgorICogUmV0dXJuOgknMCcgb24gU3VjY2VzczsgRXJyb3IgY29kZSBvdGhlcndpc2UuCisgKi8KK2ludCBkcHJjX2dldF9yZXNfaWRzKHN0cnVjdCBmc2xfbWNfaW8JCQkqbWNfaW8sCisJCSAgICAgdWludDE2X3QJCQkJdG9rZW4sCisJCSAgICAgY2hhcgkJCQkqdHlwZSwKKwkJICAgICBzdHJ1Y3QgZHByY19yZXNfaWRzX3JhbmdlX2Rlc2MJKnJhbmdlX2Rlc2MpOworCisvKioKKyAqIGRwcmNfZ2V0X3BvcnRhbF9wYWRkcigpIC0gR2V0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIE1DIHBvcnRhbHMKKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAcG9ydGFsX2lkOglNQyBwb3J0YWwgSUQKKyAqIEBwb3J0YWxfYWRkcjogVGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIE1DIHBvcnRhbCBJRAorICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19nZXRfcG9ydGFsX3BhZGRyKHN0cnVjdCBmc2xfbWNfaW8JKm1jX2lvLAorCQkJICB1aW50MTZfdAkJdG9rZW4sCisJCQkgIGludAkJCXBvcnRhbF9pZCwKKwkJCSAgdWludDY0X3QJCSpwb3J0YWxfYWRkcik7CisKKy8qKgorICogc3RydWN0IGRwcmNfcmVnaW9uX2Rlc2MgLSBNYXBwYWJsZSByZWdpb24gZGVzY3JpcHRvcgorICogQGJhc2VfcGFkZHI6IFJlZ2lvbiBiYXNlIHBoeXNpY2FsIGFkZHJlc3MKKyAqIEBzaXplOiBSZWdpb24gc2l6ZSAoaW4gYnl0ZXMpCisgKi8KK3N0cnVjdCBkcHJjX3JlZ2lvbl9kZXNjIHsKKwl1aW50NjRfdCBiYXNlX3BhZGRyOworCXVpbnQzMl90IHNpemU7Cit9OworCisvKioKKyAqIGRwcmNfZ2V0X29ial9yZWdpb24oKSAtIEdldCByZWdpb24gaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWVkIG9iamVjdC4KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAb2JqX3R5cGU7CU9iamVjdCB0eXBlIGFzIHJldHVybmVkIGluIGRwcmNfZ2V0X29iaigpCisgKiBAb2JqX2lkOglVbmlxdWUgb2JqZWN0IGluc3RhbmNlIGFzIHJldHVybmVkIGluIGRwcmNfZ2V0X29iaigpCisgKiBAcmVnaW9uX2luZGV4OiBUaGUgc3BlY2lmaWMgcmVnaW9uIHRvIHF1ZXJ5CisgKiBAcmVnaW9uX2Rlc2M6ICBSZXR1cm5zIHRoZSByZXF1ZXN0ZWQgcmVnaW9uIGRlc2NyaXB0b3IKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfZ2V0X29ial9yZWdpb24oc3RydWN0IGZzbF9tY19pbwkqbWNfaW8sCisJCQl1aW50MTZfdAkJdG9rZW4sCisJCQljaGFyCQkJKm9ial90eXBlLAorCQkJaW50CQkJb2JqX2lkLAorCQkJdWludDhfdAkJCXJlZ2lvbl9pbmRleCwKKwkJCXN0cnVjdCBkcHJjX3JlZ2lvbl9kZXNjCSpyZWdpb25fZGVzYyk7CisKKy8qKgorICogc3RydWN0IGRwcmNfZW5kcG9pbnQgLSBFbmRwb2ludCBkZXNjcmlwdGlvbiBmb3IgbGluayBjb25uZWN0L2Rpc2Nvbm5lY3QKKyAqCQkJb3BlcmF0aW9ucworICogQHR5cGU6IEVuZHBvaW50IG9iamVjdCB0eXBlOiBOVUxMIHRlcm1pbmF0ZWQgc3RyaW5nCisgKiBAaWQ6IEVuZHBvaW50IG9iamVjdCBJRAorICogQGludGVyZmFjZV9pZDogSW50ZXJmYWNlIElEOyBzaG91bGQgYmUgc2V0IGZvciBlbmRwb2ludHMgd2l0aCBtdWx0aXBsZQorICoJCWludGVyZmFjZXMgKCJkcHN3IiwgImRwZG11eCIpOyBmb3Igb3RoZXJzLCBhbHdheXMgc2V0IHRvIDAKKyAqLworc3RydWN0IGRwcmNfZW5kcG9pbnQgeworCWNoYXIgdHlwZVsxNl07CisJaW50IGlkOworCWludCBpbnRlcmZhY2VfaWQ7Cit9OworCisvKioKKyAqIGRwcmNfY29ubmVjdCgpIC0gQ29ubmVjdCB0d28gZW5kcG9pbnRzIHRvIGNyZWF0ZSBhIG5ldHdvcmsgbGluayBiZXR3ZWVuIHRoZW0KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAZW5kcG9pbnQxOglFbmRwb2ludCAxIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICogQGVuZHBvaW50MjoJRW5kcG9pbnQgMiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyAqCisgKiBSZXR1cm46CScwJyBvbiBTdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGRwcmNfY29ubmVjdChzdHJ1Y3QgZnNsX21jX2lvCQkqbWNfaW8sCisJCSB1aW50MTZfdAkJCXRva2VuLAorCQkgY29uc3Qgc3RydWN0IGRwcmNfZW5kcG9pbnQJKmVuZHBvaW50MSwKKwkJIGNvbnN0IHN0cnVjdCBkcHJjX2VuZHBvaW50CSplbmRwb2ludDIpOworCisvKioKKyAqIGRwcmNfZGlzY29ubmVjdCgpIC0gRGlzY29ubmVjdCBvbmUgZW5kcG9pbnQgdG8gcmVtb3ZlIGl0cyBuZXR3b3JrIGNvbm5lY3Rpb24KKyAqIEBtY19pbzoJUG9pbnRlciB0byBNQyBwb3J0YWwncyBJL08gb2JqZWN0CisgKiBAdG9rZW46CVRva2VuIG9mIERQUkMgb2JqZWN0CisgKiBAZW5kcG9pbnQ6CUVuZHBvaW50IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICoKKyAqIFJldHVybjoJJzAnIG9uIFN1Y2Nlc3M7IEVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZHByY19kaXNjb25uZWN0KHN0cnVjdCBmc2xfbWNfaW8JCSptY19pbywKKwkJICAgIHVpbnQxNl90CQkJdG9rZW4sCisJCSAgICBjb25zdCBzdHJ1Y3QgZHByY19lbmRwb2ludAkqZW5kcG9pbnQpOworCisvKioKKyogZHByY19nZXRfY29ubmVjdGlvbigpIC0gR2V0IGNvbm5lY3RlZCBlbmRwb2ludCBhbmQgbGluayBzdGF0dXMgaWYgY29ubmVjdGlvbgorKgkJCWV4aXN0cy4KKyogQG1jX2lvCQlQb2ludGVyIHRvIE1DIHBvcnRhbCdzIEkvTyBvYmplY3QKKyogQHRva2VuCQlUb2tlbiBvZiBEUFJDIG9iamVjdAorKiBAZW5kcG9pbnQxCUVuZHBvaW50IDEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisqIEBlbmRwb2ludDIJUmV0dXJuZWQgZW5kcG9pbnQgMiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMKKyogQHN0YXRlOglSZXR1cm5lZCBsaW5rIHN0YXRlOiAxIC0gbGluayBpcyB1cCwgMCAtIGxpbmsgaXMgZG93bgorKgorKiBSZXR1cm46ICAgICAnMCcgb24gU3VjY2VzczsgLUVOQVZBSUwgaWYgY29ubmVjdGlvbiBkb2VzIG5vdCBleGlzdC4KKyovCitpbnQgZHByY19nZXRfY29ubmVjdGlvbihzdHJ1Y3QgZnNsX21jX2lvCQkqbWNfaW8sCisJCQl1aW50MTZfdAkJCXRva2VuLAorCQkJY29uc3Qgc3RydWN0IGRwcmNfZW5kcG9pbnQJKmVuZHBvaW50MSwKKwkJCXN0cnVjdCBkcHJjX2VuZHBvaW50CQkqZW5kcG9pbnQyLAorCQkJaW50CQkJCSpzdGF0ZSk7CisKKyNlbmRpZiAvKiBfRlNMX0RQUkNfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMtY21kLmggYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMtY21kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1MDFlMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy1jbWQuaApAQCAtMCwwICsxLDExMyBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGFib3ZlLWxpc3RlZCBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlCisgKiBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgX19GU0xfTUNfQ01EX0gKKyNkZWZpbmUgX19GU0xfTUNfQ01EX0gKKworI2RlZmluZSBNQ19DTURfTlVNX09GX1BBUkFNUwk3CisKKyNkZWZpbmUgTUFLRV9VTUFTSzY0KF93aWR0aCkgXAorCSgodWludDY0X3QpKChfd2lkdGgpIDwgNjQgPyAoKHVpbnQ2NF90KTEgPDwgKF93aWR0aCkpIC0gMSA6IC0xKSkKKworc3RhdGljIGlubGluZSB1aW50NjRfdCBtY19lbmMoaW50IGxzb2Zmc2V0LCBpbnQgd2lkdGgsIHVpbnQ2NF90IHZhbCkKK3sKKwlyZXR1cm4gKHVpbnQ2NF90KSgoKHVpbnQ2NF90KXZhbCAmIE1BS0VfVU1BU0s2NCh3aWR0aCkpIDw8IGxzb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCBtY19kZWModWludDY0X3QgdmFsLCBpbnQgbHNvZmZzZXQsIGludCB3aWR0aCkKK3sKKwlyZXR1cm4gKHVpbnQ2NF90KSgodmFsID4+IGxzb2Zmc2V0KSAmIE1BS0VfVU1BU0s2NCh3aWR0aCkpOworfQorCitzdHJ1Y3QgbWNfY29tbWFuZCB7CisJdWludDY0X3QgaGVhZGVyOworCXVpbnQ2NF90IHBhcmFtc1tNQ19DTURfTlVNX09GX1BBUkFNU107Cit9OworCitlbnVtIG1jX2NtZF9zdGF0dXMgeworCU1DX0NNRF9TVEFUVVNfT0sgPSAweDAsIC8qIENvbXBsZXRlZCBzdWNjZXNzZnVsbHkgKi8KKwlNQ19DTURfU1RBVFVTX1JFQURZID0gMHgxLCAvKiBSZWFkeSB0byBiZSBwcm9jZXNzZWQgKi8KKwlNQ19DTURfU1RBVFVTX0FVVEhfRVJSID0gMHgzLCAvKiBBdXRoZW50aWNhdGlvbiBlcnJvciAqLworCU1DX0NNRF9TVEFUVVNfTk9fUFJJVklMRUdFID0gMHg0LCAvKiBObyBwcml2aWxlZ2UgKi8KKwlNQ19DTURfU1RBVFVTX0RNQV9FUlIgPSAweDUsIC8qIERNQSBvciBJL08gZXJyb3IgKi8KKwlNQ19DTURfU1RBVFVTX0NPTkZJR19FUlIgPSAweDYsIC8qIENvbmZpZ3VyYXRpb24gZXJyb3IgKi8KKwlNQ19DTURfU1RBVFVTX1RJTUVPVVQgPSAweDcsIC8qIE9wZXJhdGlvbiB0aW1lZCBvdXQgKi8KKwlNQ19DTURfU1RBVFVTX05PX1JFU09VUkNFID0gMHg4LCAvKiBObyByZXNvdXJjZXMgKi8KKwlNQ19DTURfU1RBVFVTX05PX01FTU9SWSA9IDB4OSwgLyogTm8gbWVtb3J5IGF2YWlsYWJsZSAqLworCU1DX0NNRF9TVEFUVVNfQlVTWSA9IDB4QSwgLyogRGV2aWNlIGlzIGJ1c3kgKi8KKwlNQ19DTURfU1RBVFVTX1VOU1VQUE9SVEVEX09QID0gMHhCLCAvKiBVbnN1cHBvcnRlZCBvcGVyYXRpb24gKi8KKwlNQ19DTURfU1RBVFVTX0lOVkFMSURfU1RBVEUgPSAweEMgLyogSW52YWxpZCBzdGF0ZSAqLworfTsKKworI2RlZmluZSBNQ19DTURfSERSX0NNRElEX08JNTIJLyogQ29tbWFuZCBJRCBmaWVsZCBvZmZzZXQgKi8KKyNkZWZpbmUgTUNfQ01EX0hEUl9DTURJRF9TCTEyCS8qIENvbW1hbmQgSUQgZmllbGQgc2l6ZSAqLworI2RlZmluZSBNQ19DTURfSERSX1RPS0VOX08JMzgJLyogVG9rZW4gZmllbGQgb2Zmc2V0ICovCisjZGVmaW5lIE1DX0NNRF9IRFJfVE9LRU5fUwkxMAkvKiBUb2tlbiBmaWVsZCBzaXplICovCisjZGVmaW5lIE1DX0NNRF9IRFJfU1RBVFVTX08JMTYJLyogU3RhdHVzIGZpZWxkIG9mZnNldCAqLworI2RlZmluZSBNQ19DTURfSERSX1NUQVRVU19TCTgJLyogU3RhdHVzIGZpZWxkIHNpemUqLworI2RlZmluZSBNQ19DTURfSERSX1BSSV9PCTE1CS8qIFByaW9yaXR5IGZpZWxkIG9mZnNldCAqLworI2RlZmluZSBNQ19DTURfSERSX1BSSV9TCTEJLyogUHJpb3JpdHkgZmllbGQgc2l6ZSAqLworCisjZGVmaW5lIE1DX0NNRF9IRFJfUkVBRF9TVEFUVVMoX2hkcikgXAorCSgoZW51bSBtY19jbWRfc3RhdHVzKW1jX2RlYygoX2hkciksIFwKKwkJTUNfQ01EX0hEUl9TVEFUVVNfTywgTUNfQ01EX0hEUl9TVEFUVVNfUykpCisKKyNkZWZpbmUgTUNfQ01EX0hEUl9SRUFEX1RPS0VOKF9oZHIpIFwKKwkoKHVpbnQxNl90KW1jX2RlYygoX2hkciksIE1DX0NNRF9IRFJfVE9LRU5fTywgTUNfQ01EX0hEUl9UT0tFTl9TKSkKKworI2RlZmluZSBNQ19DTURfUFJJX0xPVwkJMCAvKiBMb3cgUHJpb3JpdHkgY29tbWFuZCBpbmRpY2F0aW9uICovCisjZGVmaW5lIE1DX0NNRF9QUklfSElHSAkJMSAvKiBIaWdoIFByaW9yaXR5IGNvbW1hbmQgaW5kaWNhdGlvbiAqLworCisjZGVmaW5lIE1DX0VYVF9PUChfZXh0LCBfcGFyYW0sIF9vZmZzZXQsIF93aWR0aCwgX3R5cGUsIF9hcmcpIFwKKwkoKF9leHQpW19wYXJhbV0gfD0gbWNfZW5jKChfb2Zmc2V0KSwgKF93aWR0aCksIF9hcmcpKQorCisjZGVmaW5lIE1DX0NNRF9PUChfY21kLCBfcGFyYW0sIF9vZmZzZXQsIF93aWR0aCwgX3R5cGUsIF9hcmcpIFwKKwkoKF9jbWQpLnBhcmFtc1tfcGFyYW1dIHw9IG1jX2VuYygoX29mZnNldCksIChfd2lkdGgpLCBfYXJnKSkKKworI2RlZmluZSBNQ19SU1BfT1AoX2NtZCwgX3BhcmFtLCBfb2Zmc2V0LCBfd2lkdGgsIF90eXBlLCBfYXJnKSBcCisJKF9hcmcgPSAoX3R5cGUpbWNfZGVjKF9jbWQucGFyYW1zW19wYXJhbV0sIChfb2Zmc2V0KSwgKF93aWR0aCkpKQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IG1jX2VuY29kZV9jbWRfaGVhZGVyKHVpbnQxNl90IGNtZF9pZCwKKwkJCQkJICAgIHVpbnQ4X3QgcHJpb3JpdHksCisJCQkJCSAgICB1aW50MTZfdCB0b2tlbikKK3sKKwl1aW50NjRfdCBoZHI7CisKKwloZHIgPSBtY19lbmMoTUNfQ01EX0hEUl9DTURJRF9PLCBNQ19DTURfSERSX0NNRElEX1MsIGNtZF9pZCk7CisJaGRyIHw9IG1jX2VuYyhNQ19DTURfSERSX1RPS0VOX08sIE1DX0NNRF9IRFJfVE9LRU5fUywgdG9rZW4pOworCWhkciB8PSBtY19lbmMoTUNfQ01EX0hEUl9QUklfTywgTUNfQ01EX0hEUl9QUklfUywgcHJpb3JpdHkpOworCWhkciB8PSBtY19lbmMoTUNfQ01EX0hEUl9TVEFUVVNfTywgTUNfQ01EX0hEUl9TVEFUVVNfUywKKwkJICAgICAgIE1DX0NNRF9TVEFUVVNfUkVBRFkpOworCisJcmV0dXJuIGhkcjsKK30KKworI2VuZGlmIC8qIF9fRlNMX01DX0NNRF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMtcHJpdmF0ZS5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLXByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ1ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLXByaXZhdGUuaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIEZyZWVzY2FsZSBNYW5hZ2VtZW50IENvbXBsZXggKE1DKSBidXMgcHJpdmF0ZSBkZWNsYXJhdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIEF1dGhvcjogR2VybWFuIFJpdmVyYSA8R2VybWFuLlJpdmVyYUBmcmVlc2NhbGUuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55CisgKiB3YXJyYW50eSBvZiBhbnkga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKi8KKyNpZm5kZWYgX0ZTTF9NQ19QUklWQVRFX0hfCisjZGVmaW5lIF9GU0xfTUNfUFJJVkFURV9IXworCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9tYy5oIgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+CisKKyNkZWZpbmUgRlNMX01DX0RQUkNfRFJJVkVSX05BTUUgICAgImZzbF9tY19kcHJjIgorCisjZGVmaW5lIEZTTF9NQ19ERVZJQ0VfTUFUQ0goX21jX2RldiwgX29ial9kZXNjKSBcCisJKHN0cmNtcCgoX21jX2RldiktPm9ial9kZXNjLnR5cGUsIChfb2JqX2Rlc2MpLT50eXBlKSA9PSAwICYmIFwKKwkgKF9tY19kZXYpLT5vYmpfZGVzYy5pZCA9PSAoX29ial9kZXNjKS0+aWQpCisKKyNkZWZpbmUgRlNMX01DX0lTX0FMTE9DQVRBQkxFKF9vYmpfdHlwZSkgXAorCShzdHJjbXAoX29ial90eXBlLCAiZHBicCIpID09IDAgfHwgXAorCSBzdHJjbXAoX29ial90eXBlLCAiZHBtY3AiKSA9PSAwIHx8IFwKKwkgc3RyY21wKF9vYmpfdHlwZSwgImRwY29uIikgPT0gMCkKKworLyoqCisgKiBzdHJ1Y3QgZnNsX21jIC0gUHJpdmF0ZSBkYXRhIG9mIGEgImZzbCxxb3JpcS1tYyIgcGxhdGZvcm0gZGV2aWNlCisgKiBAcm9vdF9tY19idXNfZGV2OiBNQyBvYmplY3QgZGV2aWNlIHJlcHJlc2VudGluZyB0aGUgcm9vdCBEUFJDCisgKiBAYWRkcl90cmFuc2xhdGlvbl9yYW5nZXM6IGFycmF5IG9mIGJ1cyB0byBzeXN0ZW0gYWRkcmVzcyB0cmFuc2xhdGlvbiByYW5nZXMKKyAqLworc3RydWN0IGZzbF9tYyB7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgKnJvb3RfbWNfYnVzX2RldjsKKwl1aW50OF90IG51bV90cmFuc2xhdGlvbl9yYW5nZXM7CisJc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlICp0cmFuc2xhdGlvbl9yYW5nZXM7Cit9OworCisvKioKKyAqIHN0cnVjdCBmc2xfbWNfYWRkcl90cmFuc2xhdGlvbl9yYW5nZSAtIGJ1cyB0byBzeXN0ZW0gYWRkcmVzcyB0cmFuc2xhdGlvbgorICogcmFuZ2UKKyAqIEBzdGFydF9tY19hZGRyOiBTdGFydCBNQyBhZGRyZXNzIG9mIHRoZSByYW5nZSBiZWluZyB0cmFuc2xhdGVkCisgKiBAZW5kX21jX2FkZHI6IE1DIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIHJhbmdlIChsYXN0IE1DCisgKiBhZGRyZXNzIG9mIHRoZSByYW5nZSBpcyBlbmRfbWNfYWRkciAtIDEpCisgKiBAc3RhcnRfcGh5c19hZGRyOiBzeXN0ZW0gcGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHN0YXJ0X21jX2FkZHIKKyAqLworc3RydWN0IGZzbF9tY19hZGRyX3RyYW5zbGF0aW9uX3JhbmdlIHsKKwl1aW50NjRfdCBzdGFydF9tY19hZGRyOworCXVpbnQ2NF90IGVuZF9tY19hZGRyOworCXBoeXNfYWRkcl90IHN0YXJ0X3BoeXNfYWRkcjsKK307CisKKy8qKgorICogc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sIC0gUG9vbCBvZiBNQyByZXNvdXJjZXMgb2YgYSBnaXZlbgorICogdHlwZQorICogQHR5cGU6IHR5cGUgb2YgcmVzb3VyY2VzIGluIHRoZSBwb29sCisgKiBAbWF4X2NvdW50OiBtYXhpbXVtIG51bWJlciBvZiByZXNvdXJjZXMgaW4gdGhlIHBvb2wKKyAqIEBmcmVlX2NvdW50OiBudW1iZXIgb2YgZnJlZSByZXNvdXJjZXMgaW4gdGhlIHBvb2wKKyAqIEBtdXRleDogbXV0ZXggdG8gc2VyaWFsaXplIGFjY2VzcyB0byB0aGUgcG9vbCdzIGZyZWUgbGlzdAorICogQGZyZWVfbGlzdDogYW5jaG9yIG5vZGUgb2YgbGlzdCBvZiBmcmVlIHJlc291cmNlcyBpbiB0aGUgcG9vbAorICogQG1jX2J1czogcG9pbnRlciB0byB0aGUgTUMgYnVzIHRoYXQgb3ducyB0aGlzIHJlc291cmNlIHBvb2wKKyAqLworc3RydWN0IGZzbF9tY19yZXNvdXJjZV9wb29sIHsKKwllbnVtIGZzbF9tY19wb29sX3R5cGUgdHlwZTsKKwlpbnQxNl90IG1heF9jb3VudDsKKwlpbnQxNl90IGZyZWVfY291bnQ7CisJc3RydWN0IG11dGV4IG11dGV4OwkvKiBzZXJpYWxpemVzIGFjY2VzcyB0byBmcmVlX2xpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfbGlzdDsKKwlzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX21jX2J1cyAtIGxvZ2ljYWwgYnVzIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwaHlzaWNhbCBEUFJDCisgKiBAbWNfZGV2OiBmc2wtbWMgZGV2aWNlIGZvciB0aGUgYnVzIGRldmljZSBpdHNlbGYuCisgKiBAcmVzb3VyY2VfcG9vbHM6IGFycmF5IG9mIHJlc291cmNlIHBvb2xzIChvbmUgcG9vbCBwZXIgcmVzb3VyY2UgdHlwZSkKKyAqIGZvciB0aGlzIE1DIGJ1cy4gVGhlc2UgcmVzb3VyY2VzIHJlcHJlc2VudCBhbGxvY2F0YWJsZSBlbnRpdGllcworICogZnJvbSB0aGUgcGh5c2ljYWwgRFBSQy4KKyAqIEBzY2FuX211dGV4OiBTZXJpYWxpemVzIGJ1cyBzY2FubmluZworICovCitzdHJ1Y3QgZnNsX21jX2J1cyB7CisJc3RydWN0IGZzbF9tY19kZXZpY2UgbWNfZGV2OworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2VfcG9vbCByZXNvdXJjZV9wb29sc1tGU0xfTUNfTlVNX1BPT0xfVFlQRVNdOworCXN0cnVjdCBtdXRleCBzY2FuX211dGV4OyAgICAvKiBzZXJpYWxpemVzIGJ1cyBzY2FubmluZyAqLworfTsKKworI2RlZmluZSB0b19mc2xfbWNfYnVzKF9tY19kZXYpIFwKKwljb250YWluZXJfb2YoX21jX2Rldiwgc3RydWN0IGZzbF9tY19idXMsIG1jX2RldikKKworaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfZGV2aWNlX2FkZChzdHJ1Y3QgZHByY19vYmpfZGVzYyAqb2JqX2Rlc2MsCisJCQkJICAgc3RydWN0IGZzbF9tY19pbyAqbWNfaW8sCisJCQkJICAgc3RydWN0IGRldmljZSAqcGFyZW50X2RldiwKKwkJCQkgICBzdHJ1Y3QgZnNsX21jX2RldmljZSAqKm5ld19tY19kZXYpOworCit2b2lkIGZzbF9tY19kZXZpY2VfcmVtb3ZlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYpOworCitpbnQgZHByY19zY2FuX2NvbnRhaW5lcihzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2Rldik7CisKK2ludCBkcHJjX3NjYW5fb2JqZWN0cyhzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYnVzX2Rldik7CisKK2ludCBfX2luaXQgZHByY19kcml2ZXJfaW5pdCh2b2lkKTsKKwordm9pZCBfX2V4aXQgZHByY19kcml2ZXJfZXhpdCh2b2lkKTsKKworaW50IF9faW5pdCBmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9pbml0KHZvaWQpOworCit2b2lkIF9fZXhpdCBmc2xfbWNfYWxsb2NhdG9yX2RyaXZlcl9leGl0KHZvaWQpOworCitpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19yZXNvdXJjZV9hbGxvY2F0ZShzdHJ1Y3QgZnNsX21jX2J1cyAqbWNfYnVzLAorCQkJCQkgIGVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGUsCisJCQkJCSAgc3RydWN0IGZzbF9tY19yZXNvdXJjZQorCQkJCQkJCSAgKipuZXdfcmVzb3VyY2UpOworCit2b2lkIGZzbF9tY19yZXNvdXJjZV9mcmVlKHN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlKTsKKworI2VuZGlmIC8qIF9GU0xfTUNfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLXN5cy5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLXN5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2I1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvZnNsLW1jL2luY2x1ZGUvbWMtc3lzLmgKQEAgLTAsMCArMSw3NiBAQAorLyogQ29weXJpZ2h0IDIwMTMtMjAxNCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogSW50ZXJmYWNlIG9mIHRoZSBJL08gc2VydmljZXMgdG8gc2VuZCBNQyBjb21tYW5kcyB0byB0aGUgTUMgaGFyZHdhcmUKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgYWJvdmUtbGlzdGVkIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIF9GU0xfTUNfU1lTX0gKKyNkZWZpbmUgX0ZTTF9NQ19TWVNfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworc3RydWN0IGZzbF9tY19yZXNvdXJjZTsKK3N0cnVjdCBtY19jb21tYW5kOworCisvKioKKyAqIHN0cnVjdCBmc2xfbWNfaW8gLSBNQyBJL08gb2JqZWN0IHRvIGJlIHBhc3NlZC1pbiB0byBtY19zZW5kX2NvbW1hbmQoKQorICogQGRldjogZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE1jIEkvTyBvYmplY3QKKyAqIEBmbGFnczogZmxhZ3MgZm9yIG1jX3NlbmRfY29tbWFuZCgpCisgKiBAcG9ydGFsX3NpemU6IE1DIGNvbW1hbmQgcG9ydGFsIHNpemUgaW4gYnl0ZXMKKyAqIEBwb3J0YWxfcGh5c19hZGRyOiBNQyBjb21tYW5kIHBvcnRhbCBwaHlzaWNhbCBhZGRyZXNzCisgKiBAcG9ydGFsX3ZpcnRfYWRkcjogTUMgY29tbWFuZCBwb3J0YWwgdmlydHVhbCBhZGRyZXNzCisgKiBAcmVzb3VyY2U6IGdlbmVyaWMgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBNQyBwb3J0YWwgaWYKKyAqIHRoZSBNQyBwb3J0YWwgY2FtZSBmcm9tIGEgcmVzb3VyY2UgcG9vbCwgb3IgTlVMTCBpZiB0aGUgTUMgcG9ydGFsCisgKiBpcyBwZXJtYW5lbnRseSBib3VuZCB0byBhIGRldmljZSAoZS5nLiwgYSBEUFJDKQorICovCitzdHJ1Y3QgZnNsX21jX2lvIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJdWludDMyX3QgZmxhZ3M7CisJdWludDMyX3QgcG9ydGFsX3NpemU7CisJcGh5c19hZGRyX3QgcG9ydGFsX3BoeXNfYWRkcjsKKwl2b2lkIF9faW9tZW0gKnBvcnRhbF92aXJ0X2FkZHI7CisJc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2U7Cit9OworCitpbnQgX19tdXN0X2NoZWNrIGZzbF9jcmVhdGVfbWNfaW8oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgcGh5c19hZGRyX3QgbWNfcG9ydGFsX3BoeXNfYWRkciwKKwkJCQkgIHVpbnQzMl90IG1jX3BvcnRhbF9zaXplLAorCQkJCSAgc3RydWN0IGZzbF9tY19yZXNvdXJjZSAqcmVzb3VyY2UsCisJCQkJICB1aW50MzJfdCBmbGFncywgc3RydWN0IGZzbF9tY19pbyAqKm5ld19tY19pbyk7CisKK3ZvaWQgZnNsX2Rlc3Ryb3lfbWNfaW8oc3RydWN0IGZzbF9tY19pbyAqbWNfaW8pOworCitpbnQgbWNfc2VuZF9jb21tYW5kKHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvLCBzdHJ1Y3QgbWNfY29tbWFuZCAqY21kKTsKKworI2VuZGlmIC8qIF9GU0xfTUNfU1lTX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy5oIGIvZHJpdmVycy9zdGFnaW5nL2ZzbC1tYy9pbmNsdWRlL21jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwMmVmMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mc2wtbWMvaW5jbHVkZS9tYy5oCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogRnJlZXNjYWxlIE1hbmFnZW1lbnQgQ29tcGxleCAoTUMpIGJ1cyBwdWJsaWMgaW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBBdXRob3I6IEdlcm1hbiBSaXZlcmEgPEdlcm1hbi5SaXZlcmFAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQorICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICovCisjaWZuZGVmIF9GU0xfTUNfSF8KKyNkZWZpbmUgX0ZTTF9NQ19IXworCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvZHByYy5oIgorCisjZGVmaW5lIEZTTF9NQ19WRU5ET1JfRlJFRVNDQUxFCTB4MTk1NworCitzdHJ1Y3QgZnNsX21jX2RldmljZTsKK3N0cnVjdCBmc2xfbWNfaW87CisKKy8qKgorICogc3RydWN0IGZzbF9tY19kcml2ZXIgLSBNQyBvYmplY3QgZGV2aWNlIGRyaXZlciBvYmplY3QKKyAqIEBkcml2ZXI6IEdlbmVyaWMgZGV2aWNlIGRyaXZlcgorICogQG1hdGNoX2lkX3RhYmxlOiB0YWJsZSBvZiBzdXBwb3J0ZWQgZGV2aWNlIG1hdGNoaW5nIElkcworICogQHByb2JlOiBGdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGRldmljZSBpcyBhZGRlZAorICogQHJlbW92ZTogRnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBkZXZpY2UgaXMgcmVtb3ZlZAorICogQHNodXRkb3duOiBGdW5jdGlvbiBjYWxsZWQgYXQgc2h1dGRvd24gdGltZSB0byBxdWllc2NlIHRoZSBkZXZpY2UKKyAqIEBzdXNwZW5kOiBGdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGRldmljZSBpcyBzdG9wcGVkCisgKiBAcmVzdW1lOiBGdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGRldmljZSBpcyByZXN1bWVkCisgKgorICogR2VuZXJpYyBEUEFBIGRldmljZSBkcml2ZXIgb2JqZWN0IGZvciBkZXZpY2UgZHJpdmVycyB0aGF0IGFyZSByZWdpc3RlcmVkCisgKiB3aXRoIGEgRFBSQyBidXMuIFRoaXMgc3RydWN0dXJlIGlzIHRvIGJlIGVtYmVkZGVkIGluIGVhY2ggZGV2aWNlLXNwZWNpZmljCisgKiBkcml2ZXIgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgZnNsX21jX2RyaXZlciB7CisJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOworCWNvbnN0IHN0cnVjdCBmc2xfbWNfZGV2aWNlX21hdGNoX2lkICptYXRjaF9pZF90YWJsZTsKKwlpbnQgKCpwcm9iZSkoc3RydWN0IGZzbF9tY19kZXZpY2UgKmRldik7CisJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgZnNsX21jX2RldmljZSAqZGV2KTsKKwl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBmc2xfbWNfZGV2aWNlICpkZXYpOworCWludCAoKnN1c3BlbmQpKHN0cnVjdCBmc2xfbWNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CisJaW50ICgqcmVzdW1lKShzdHJ1Y3QgZnNsX21jX2RldmljZSAqZGV2KTsKK307CisKKyNkZWZpbmUgdG9fZnNsX21jX2RyaXZlcihfZHJ2KSBcCisJY29udGFpbmVyX29mKF9kcnYsIHN0cnVjdCBmc2xfbWNfZHJpdmVyLCBkcml2ZXIpCisKKy8qKgorICogc3RydWN0IGZzbF9tY19kZXZpY2VfbWF0Y2hfaWQgLSBNQyBvYmplY3QgZGV2aWNlIElkIGVudHJ5IGZvciBkcml2ZXIgbWF0Y2hpbmcKKyAqIEB2ZW5kb3I6IHZlbmRvciBJRAorICogQG9ial90eXBlOiBNQyBvYmplY3QgdHlwZQorICogQHZlcl9tYWpvcjogTUMgb2JqZWN0IHZlcnNpb24gbWFqb3IgbnVtYmVyCisgKiBAdmVyX21pbm9yOiBNQyBvYmplY3QgdmVyc2lvbiBtaW5vciBudW1iZXIKKyAqCisgKiBUeXBlIG9mIGVudHJpZXMgaW4gdGhlICJkZXZpY2UgSWQiIHRhYmxlIGZvciBNQyBvYmplY3QgZGV2aWNlcyBzdXBwb3J0ZWQgYnkKKyAqIGEgTUMgb2JqZWN0IGRldmljZSBkcml2ZXIuIFRoZSBsYXN0IGVudHJ5IG9mIHRoZSB0YWJsZSBoYXMgdmVuZG9yIHNldCB0byAweDAKKyAqLworc3RydWN0IGZzbF9tY19kZXZpY2VfbWF0Y2hfaWQgeworCXVpbnQxNl90IHZlbmRvcjsKKwljb25zdCBjaGFyIG9ial90eXBlWzE2XTsKKwl1aW50MzJfdCB2ZXJfbWFqb3I7CisJdWludDMyX3QgdmVyX21pbm9yOworfTsKKworLyoqCisgKiBlbnVtIGZzbF9tY19wb29sX3R5cGUgLSBUeXBlcyBvZiBhbGxvY2F0YWJsZSBNQyBidXMgcmVzb3VyY2VzCisgKgorICogRW50cmllcyBpbiB0aGVzZSBlbnVtIGFyZSB1c2VkIGFzIGluZGljZXMgaW4gdGhlIGFycmF5IG9mIHJlc291cmNlCisgKiBwb29scyBvZiBhbiBmc2xfbWNfYnVzIG9iamVjdC4KKyAqLworZW51bSBmc2xfbWNfcG9vbF90eXBlIHsKKwlGU0xfTUNfUE9PTF9EUE1DUCA9IDB4MCwgICAgLyogY29ycmVzcG9uZHMgdG8gImRwbWNwIiBpbiB0aGUgTUMgKi8KKwlGU0xfTUNfUE9PTF9EUEJQLAkgICAgLyogY29ycmVzcG9uZHMgdG8gImRwYnAiIGluIHRoZSBNQyAqLworCUZTTF9NQ19QT09MX0RQQ09OLAkgICAgLyogY29ycmVzcG9uZHMgdG8gImRwY29uIiBpbiB0aGUgTUMgKi8KKworCS8qCisJICogTk9URTogTmV3IHJlc291cmNlIHBvb2wgdHlwZXMgbXVzdCBiZSBhZGRlZCBiZWZvcmUgdGhpcyBlbnRyeQorCSAqLworCUZTTF9NQ19OVU1fUE9PTF9UWVBFUworfTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX21jX3Jlc291cmNlIC0gTUMgZ2VuZXJpYyByZXNvdXJjZQorICogQHR5cGU6IHR5cGUgb2YgcmVzb3VyY2UKKyAqIEBpZDogdW5pcXVlIE1DIHJlc291cmNlIElkIHdpdGhpbiB0aGUgcmVzb3VyY2VzIG9mIHRoZSBzYW1lIHR5cGUKKyAqIEBkYXRhOiBwb2ludGVyIHRvIHJlc291cmNlLXNwZWNpZmljIGRhdGEgaWYgdGhlIHJlc291cmNlIGlzIGN1cnJlbnRseQorICogYWxsb2NhdGVkLCBvciBOVUxMIGlmIHRoZSByZXNvdXJjZSBpcyBub3QgY3VycmVudGx5IGFsbG9jYXRlZC4KKyAqIEBwYXJlbnRfcG9vbDogcG9pbnRlciB0byB0aGUgcGFyZW50IHJlc291cmNlIHBvb2wgZnJvbSB3aGljaCB0aGlzCisgKiByZXNvdXJjZSBpcyBhbGxvY2F0ZWQgZnJvbS4KKyAqIEBub2RlOiBOb2RlIGluIHRoZSBmcmVlIGxpc3Qgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgcG9vbAorICoKKyAqIE5PVEU6IFRoaXMgc3RydWN0dXJlIGlzIHRvIGJlIGVtYmVkZGVkIGFzIGEgZmllbGQgb2Ygc3BlY2lmaWMKKyAqIE1DIHJlc291cmNlIHN0cnVjdHVyZXMuCisgKi8KK3N0cnVjdCBmc2xfbWNfcmVzb3VyY2UgeworCWVudW0gZnNsX21jX3Bvb2xfdHlwZSB0eXBlOworCWludDMyX3QgaWQ7CisJdm9pZCAqZGF0YTsKKwlzdHJ1Y3QgZnNsX21jX3Jlc291cmNlX3Bvb2wgKnBhcmVudF9wb29sOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKKy8qKgorICogQml0IG1hc2tzIGZvciBhIE1DIG9iamVjdCBkZXZpY2UgKHN0cnVjdCBmc2xfbWNfZGV2aWNlKSBmbGFncworICovCisjZGVmaW5lIEZTTF9NQ19JU19EUFJDCTB4MDAwMQorCisvKioKKyAqIERlZmF1bHQgRE1BIG1hc2sgZm9yIGRldmljZXMgb24gYSBmc2wtbWMgYnVzCisgKi8KKyNkZWZpbmUgRlNMX01DX0RFRkFVTFRfRE1BX01BU0sJKH4wVUxMKQorCisvKioKKyAqIHN0cnVjdCBmc2xfbWNfZGV2aWNlIC0gTUMgb2JqZWN0IGRldmljZSBvYmplY3QKKyAqIEBkZXY6IExpbnV4IGRyaXZlciBtb2RlbCBkZXZpY2Ugb2JqZWN0CisgKiBAZG1hX21hc2s6IERlZmF1bHQgRE1BIG1hc2sKKyAqIEBmbGFnczogTUMgb2JqZWN0IGRldmljZSBmbGFncworICogQGljaWQ6IElzb2xhdGlvbiBjb250ZXh0IElEIGZvciB0aGUgZGV2aWNlCisgKiBAbWNfaGFuZGxlOiBNQyBoYW5kbGUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIE1DIG9iamVjdCBvcGVuZWQKKyAqIEBtY19pbzogUG9pbnRlciB0byBNQyBJTyBvYmplY3QgYXNzaWduZWQgdG8gdGhpcyBkZXZpY2Ugb3IKKyAqIE5VTEwgaWYgbm9uZS4KKyAqIEBvYmpfZGVzYzogTUMgZGVzY3JpcHRpb24gb2YgdGhlIERQQUEgZGV2aWNlCisgKiBAcmVnaW9uczogcG9pbnRlciB0byBhcnJheSBvZiBNTUlPIHJlZ2lvbiBlbnRyaWVzCisgKiBAcmVzb3VyY2U6IGdlbmVyaWMgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTUMgb2JqZWN0IGRldmljZSwgaWYgYW55LgorICoKKyAqIEdlbmVyaWMgZGV2aWNlIG9iamVjdCBmb3IgTUMgb2JqZWN0IGRldmljZXMgdGhhdCBhcmUgImF0dGFjaGVkIiB0byBhCisgKiBNQyBidXMuCisgKgorICogTk9URVM6CisgKiAtIEZvciBhIG5vbi1EUFJDIG9iamVjdCBpdHMgaWNpZCBpcyB0aGUgc2FtZSBhcyBpdHMgcGFyZW50IERQUkMncyBpY2lkLgorICogLSBUaGUgU01NVSBub3RpZmllciBjYWxsYmFjayBnZXRzIGludm9rZWQgYWZ0ZXIgZGV2aWNlX2FkZCgpIGhhcyBiZWVuCisgKiAgIGNhbGxlZCBmb3IgYW4gTUMgb2JqZWN0IGRldmljZSwgYnV0IGJlZm9yZSB0aGUgZGV2aWNlLXNwZWNpZmljIHByb2JlCisgKiAgIGNhbGxiYWNrIGdldHMgY2FsbGVkLgorICogLSBEUF9PQkpfRFBSQyBvYmplY3RzIGFyZSB0aGUgb25seSBNQyBvYmplY3RzIHRoYXQgaGF2ZSBidWlsdC1pbiBNQworICogICBwb3J0YWxzLiBGb3IgYWxsIG90aGVyIE1DIG9iamVjdHMsIHRoZWlyIGRldmljZSBkcml2ZXJzIGFyZSByZXNwb25zaWJsZSBmb3IKKyAqICAgYWxsb2NhdGluZyBNQyBwb3J0YWxzIGZvciB0aGVtIGJ5IGNhbGxpbmcgZnNsX21jX3BvcnRhbF9hbGxvY2F0ZSgpLgorICogLSBTb21lIHR5cGVzIG9mIE1DIG9iamVjdHMgKGUuZy4sIERQX09CSl9EUEJQLCBEUF9PQkpfRFBDT04pIGFyZQorICogICB0cmVhdGVkIGFzIHJlc291cmNlcyB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQvZGVhbGxvY2F0ZWQgZnJvbSB0aGUKKyAqICAgY29ycmVzcG9uZGluZyByZXNvdXJjZSBwb29sIGluIHRoZSBvYmplY3QncyBwYXJlbnQgRFBSQywgdXNpbmcgdGhlCisgKiAgIGZzbF9tY19vYmplY3RfYWxsb2NhdGUoKS9mc2xfbWNfb2JqZWN0X2ZyZWUoKSBmdW5jdGlvbnMuIFRoZXNlIE1DIG9iamVjdHMKKyAqICAgYXJlIGtub3duIGFzICJhbGxvY2F0YWJsZSIgb2JqZWN0cy4gRm9yIHRoZW0sIHRoZSBjb3JyZXNwb25kaW5nCisgKiAgIGZzbF9tY19kZXZpY2UncyAncmVzb3VyY2UnIHBvaW50cyB0byB0aGUgYXNzb2NpYXRlZCByZXNvdXJjZSBvYmplY3QuCisgKiAgIEZvciBNQyBvYmplY3RzIHRoYXQgYXJlIG5vdCBhbGxvY2F0YWJsZSAoZS5nLiwgRFBfT0JKX0RQUkMsIERQX09CSl9EUE5JKSwKKyAqICAgJ3Jlc291cmNlJyBpcyBOVUxMLgorICovCitzdHJ1Y3QgZnNsX21jX2RldmljZSB7CisJc3RydWN0IGRldmljZSBkZXY7CisJdWludDY0X3QgZG1hX21hc2s7CisJdWludDE2X3QgZmxhZ3M7CisJdWludDE2X3QgaWNpZDsKKwl1aW50MTZfdCBtY19oYW5kbGU7CisJc3RydWN0IGZzbF9tY19pbyAqbWNfaW87CisJc3RydWN0IGRwcmNfb2JqX2Rlc2Mgb2JqX2Rlc2M7CisJc3RydWN0IHJlc291cmNlICpyZWdpb25zOworCXN0cnVjdCBmc2xfbWNfcmVzb3VyY2UgKnJlc291cmNlOworfTsKKworI2RlZmluZSB0b19mc2xfbWNfZGV2aWNlKF9kZXYpIFwKKwljb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGZzbF9tY19kZXZpY2UsIGRldikKKworLyoKKyAqIG1vZHVsZV9mc2xfbWNfZHJpdmVyKCkgLSBIZWxwZXIgbWFjcm8gZm9yIGRyaXZlcnMgdGhhdCBkb24ndCBkbworICogYW55dGhpbmcgc3BlY2lhbCBpbiBtb2R1bGUgaW5pdC9leGl0LiAgVGhpcyBlbGltaW5hdGVzIGEgbG90IG9mCisgKiBib2lsZXJwbGF0ZS4gIEVhY2ggbW9kdWxlIG1heSBvbmx5IHVzZSB0aGlzIG1hY3JvIG9uY2UsIGFuZAorICogY2FsbGluZyBpdCByZXBsYWNlcyBtb2R1bGVfaW5pdCgpIGFuZCBtb2R1bGVfZXhpdCgpCisgKi8KKyNkZWZpbmUgbW9kdWxlX2ZzbF9tY19kcml2ZXIoX19mc2xfbWNfZHJpdmVyKSBcCisJbW9kdWxlX2RyaXZlcihfX2ZzbF9tY19kcml2ZXIsIGZzbF9tY19kcml2ZXJfcmVnaXN0ZXIsIFwKKwkJICAgICAgZnNsX21jX2RyaXZlcl91bnJlZ2lzdGVyKQorCisvKgorICogTWFjcm8gdG8gYXZvaWQgaW5jbHVkZSBjaGFpbmluZyB0byBnZXQgVEhJU19NT0RVTEUKKyAqLworI2RlZmluZSBmc2xfbWNfZHJpdmVyX3JlZ2lzdGVyKGRydikgXAorCV9fZnNsX21jX2RyaXZlcl9yZWdpc3RlcihkcnYsIFRISVNfTU9EVUxFKQorCitpbnQgX19tdXN0X2NoZWNrIF9fZnNsX21jX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZnNsX21jX2RyaXZlciAqZnNsX21jX2RyaXZlciwKKwkJCQkJICBzdHJ1Y3QgbW9kdWxlICpvd25lcik7CisKK3ZvaWQgZnNsX21jX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBmc2xfbWNfZHJpdmVyICpkcml2ZXIpOworCitpbnQgX19tdXN0X2NoZWNrIGZzbF9tY19wb3J0YWxfYWxsb2NhdGUoc3RydWN0IGZzbF9tY19kZXZpY2UgKm1jX2RldiwKKwkJCQkJdWludDE2X3QgbWNfaW9fZmxhZ3MsCisJCQkJCXN0cnVjdCBmc2xfbWNfaW8gKipuZXdfbWNfaW8pOworCit2b2lkIGZzbF9tY19wb3J0YWxfZnJlZShzdHJ1Y3QgZnNsX21jX2lvICptY19pbyk7CisKK2ludCBmc2xfbWNfcG9ydGFsX3Jlc2V0KHN0cnVjdCBmc2xfbWNfaW8gKm1jX2lvKTsKKworaW50IF9fbXVzdF9jaGVjayBmc2xfbWNfb2JqZWN0X2FsbG9jYXRlKHN0cnVjdCBmc2xfbWNfZGV2aWNlICptY19kZXYsCisJCQkJCWVudW0gZnNsX21jX3Bvb2xfdHlwZSBwb29sX3R5cGUsCisJCQkJCXN0cnVjdCBmc2xfbWNfZGV2aWNlICoqbmV3X21jX2FkZXYpOworCit2b2lkIGZzbF9tY19vYmplY3RfZnJlZShzdHJ1Y3QgZnNsX21jX2RldmljZSAqbWNfYWRldik7CisKK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgZnNsX21jX2J1c190eXBlOworCisjZW5kaWYgLyogX0ZTTF9NQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9jcy5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9jcy5jCmluZGV4IDkyMjQ3OGUuLmU1Y2M1YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2NzLmMKQEAgLTE1NSwxNSArMTU1LDQgQEAKIAkucmVzdW1lCQk9IGZ0MTAwMF9yZXN1bWUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2Z0MTAwMF9jcyh2b2lkKQotewotCXJldHVybiBwY21jaWFfcmVnaXN0ZXJfZHJpdmVyKCZmdDEwMDBfY3NfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGV4aXRfZnQxMDAwX2NzKHZvaWQpCi17Ci0JcGNtY2lhX3VucmVnaXN0ZXJfZHJpdmVyKCZmdDEwMDBfY3NfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoaW5pdF9mdDEwMDBfY3MpOwotbW9kdWxlX2V4aXQoZXhpdF9mdDEwMDBfY3MpOworbW9kdWxlX3BjbWNpYV9kcml2ZXIoZnQxMDAwX2NzX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2RubGQuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfZG5sZC5jCmluZGV4IDA2YjBlOWMuLjgzNjgzZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfZG5sZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfZG5sZC5jCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogdm9pZCBjYXJkX2Jvb3Rsb2FkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiAqcGRhdGE7CiAJdTMyIHNpemU7CkBAIC0xNDgsNyArMTQ4LDcgQEAKIAogdTE2IGdldF9oYW5kc2hha2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IGV4cGVjdGVkX3ZhbHVlKQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IGhhbmRzaGFrZTsKIAl1MzIgdGVtcHg7CiAJaW50IGxvb3BjbnQ7CkBAIC0xODIsNyArMTgyLDcgQEAKIAogdm9pZCBwdXRfaGFuZHNoYWtlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiBoYW5kc2hha2VfdmFsdWUpCiB7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgdGVtcHg7CiAKIAlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7CkBAIC0xOTgsNyArMTk4LDcgQEAKIAogdTE2IGdldF9yZXF1ZXN0X3R5cGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSAoc3RydWN0IGZ0MTAwMF9pbmZvICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZnQxMDAwX2luZm8gKmluZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCXUxNiByZXF1ZXN0X3R5cGU7CiAJdTMyIHRlbXB4OwogCkBAIC0yMTcsNyArMjE3LDcgQEAKIAogbG9uZyBnZXRfcmVxdWVzdF92YWx1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJbG9uZyB2YWx1ZTsKIAl1MTYgd192YWw7CiAKQEAgLTI0Niw3ICsyNDYsNyBAQAogCiB2b2lkIHB1dF9yZXF1ZXN0X3ZhbHVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGxvbmcgbHZhbHVlKQogewotCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IChzdHJ1Y3QgZnQxMDAwX2luZm8gKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJdTE2IHNpemU7CiAJdTMyIHRlbXB4OwogCkBAIC0yNzYsOCArMjc2LDggQEAKIAl1MTYgKnVzUHRyID0gKHUxNiAqKXBIZHI7CiAJdTE2IGNoa3N1bTsKIAotCWNoa3N1bSA9ICgoKCgoKHVzUHRyWzBdIF4gdXNQdHJbMV0pIF4gdXNQdHJbMl0pIF4gdXNQdHJbM10pIF4KLQkJICAgIHVzUHRyWzRdKSBeIHVzUHRyWzVdKSBeIHVzUHRyWzZdKTsKKwljaGtzdW0gPSAoKCgoKHVzUHRyWzBdIF4gdXNQdHJbMV0pIF4gdXNQdHJbMl0pIF4gdXNQdHJbM10pIF4KKwkJICAgIHVzUHRyWzRdKSBeIHVzUHRyWzVdKSBeIHVzUHRyWzZdOwogCiAJcmV0dXJuIGNoa3N1bTsKIH0KQEAgLTI4NSw3ICsyODUsNyBAQAogaW50IGNhcmRfZG93bmxvYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKnBGaWxlU3RhcnQsCiAJCSAgc2l6ZV90IEZpbGVMZW5ndGgpCiB7Ci0Jc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gKHN0cnVjdCBmdDEwMDBfaW5mbyAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgU3RhdHVzID0gU1VDQ0VTUzsKIAl1MzIgdWlTdGF0ZTsKIAl1MTYgaGFuZHNoYWtlOwpAQCAtNzEzLDEwICs3MTMsMTAgQEAKIAogCQkJCS8qIEdldCBidWZmZXIgZm9yIHByb3Zpc2lvbmluZyBkYXRhICovCiAJCQkJcGJ1ZmZlciA9Ci0JCQkJCWttYWxsb2MoKHVzSGRyTGVuZ3RoICsgc2l6ZW9mKHN0cnVjdCBwc2V1ZG9faGRyKSksCisJCQkJCWttYWxsb2ModXNIZHJMZW5ndGggKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpLAogCQkJCQkJR0ZQX0FUT01JQyk7CiAJCQkJaWYgKHBidWZmZXIpIHsKLQkJCQkJbWVtY3B5KHBidWZmZXIsICh2b2lkICopcFVjRmlsZSwKKwkJCQkJbWVtY3B5KHBidWZmZXIsIHBVY0ZpbGUsCiAJCQkJCSAgICAgICAodTMyKSAodXNIZHJMZW5ndGggKwogCQkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBwc2V1ZG9faGRyKSkpOwogCQkJCQkvKiBsaW5rIHByb3Zpc2lvbmluZyBkYXRhICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2h3LmMgYi9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC1wY21jaWEvZnQxMDAwX2h3LmMKaW5kZXggMDE3YzNiOS4uZWVjZmEzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtcGNtY2lhL2Z0MTAwMF9ody5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXBjbWNpYS9mdDEwMDBfaHcuYwpAQCAtMjgsOCArMjgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CkBAIC02Nyw4ICs2Nyw3IEBACiAKIC8qIG5ldyBrZXJuZWwgKi8KIE1PRFVMRV9BVVRIT1IoIiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OCi0oIlN1cHBvcnQgZm9yIEZsYXJpb24gRmxhc2ggT0ZETSBOSUMgRGV2aWNlLiBTdXBwb3J0IGZvciBQQ01DSUEgd2hlbiB1c2VkIHdpdGggZnQxMDAwX2NzLiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBwb3J0IGZvciBGbGFyaW9uIEZsYXNoIE9GRE0gTklDIERldmljZS4gU3VwcG9ydCBmb3IgUENNQ0lBIHdoZW4gdXNlZCB3aXRoIGZ0MTAwMF9jcy4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9TVVBQT1JURURfREVWSUNFKCJGVDEwMDAiKTsKIApAQCAtMjY3LDcgKzI2Niw4IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgIEZ1bmN0aW9uOiAgIGZ0MTAwMF9lbmFibGVfaW50ZXJydXB0cwotICBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiB3aWxsIGVuYWJsZSBpbnRlcnJ1cHRzIGJhc2Ugb24gdGhlIGN1cnJlbnQgaW50ZXJydXB0IG1hc2suCisgIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIHdpbGwgZW5hYmxlIGludGVycnVwdHMgYmFzZSBvbiB0aGUgY3VycmVudAorCSAgICAgICBpbnRlcnJ1cHQgbWFzay4KICAgSW5wdXQ6CiAgIGRldiAgICAtIGRldmljZSBzdHJ1Y3R1cmUKICAgT3V0cHV0OgpAQCAtMzAzLDYgKzMwMyw0MSBAQAogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBGdW5jdGlvbjoJZnQxMDAwX3JlYWRfZHNwX3RpbWVyCisgIERlc2NyaXB0aW9uOglUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBEU1AgdGltZXIgYW5kIHN0b3JlcyBpdHMgdmFsdWUgaW4gdGhlCisJCURTUF9USU1FIGZpZWxkIG9mIHRoZSBmdDEwMDBfaW5mbyBzdHJ1Y3QgcGFzc2VkIGFzIGFyZ3VtZW50CisgIElucHV0OgorICBkZXYgICAgLSBkZXZpY2Ugc3RydWN0dXJlCisgIGluZm8gICAtIGZ0MTAwMF9pbmZvIHN0cnVjdHVyZQorICBPdXRwdXQ6CisgIE5vbmUuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBmdDEwMDBfcmVhZF9kc3BfdGltZXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbykKK3sKKwlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7CisJCWluZm8tPkRTUF9USU1FWzBdID0gZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMCk7CisJCWluZm8tPkRTUF9USU1FWzFdID0gZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMSk7CisJCWluZm8tPkRTUF9USU1FWzJdID0gZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMik7CisJCWluZm8tPkRTUF9USU1FWzNdID0gZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMyk7CisJfSBlbHNlIHsKKwkJaW5mby0+RFNQX1RJTUVbMF0gPQorCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIwLAorCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMF9JTkRYKTsKKwkJaW5mby0+RFNQX1RJTUVbMV0gPQorCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIxLAorCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMV9JTkRYKTsKKwkJaW5mby0+RFNQX1RJTUVbMl0gPQorCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIyLAorCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMl9JTkRYKTsKKwkJaW5mby0+RFNQX1RJTUVbM10gPQorCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19EU1BfVElNRVIzLAorCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSM19JTkRYKTsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgRnVuY3Rpb246ICAgZnQxMDAwX3Jlc2V0X2FzaWMKICAgRGVzY3JpcHRpb246IFRoaXMgZnVuY3Rpb24gd2lsbCBjYWxsIHRoZSBDYXJkIFNlcnZpY2UgZnVuY3Rpb24gdG8gcmVzZXQgdGhlCkBAIC0zMjcsNyArMzYyLDcgQEAKIAkgKi8KIAlpZiAoaW5mby0+QXNpY0lEID09IE1BR05FTUlURV9JRCkgewogCQlmdDEwMDBfd3JpdGVfcmVnKGRldiwgRlQxMDAwX1JFR19SRVNFVCwKLQkJCQkgKERTUF9SRVNFVF9CSVQgfCBBU0lDX1JFU0VUX0JJVCkpOworCQkJCSBEU1BfUkVTRVRfQklUIHwgQVNJQ19SRVNFVF9CSVQpOwogCX0KIAltZGVsYXkoMSk7CiAJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgewpAQCAtMzY0LDYgKzM5OSw3IEBACiAJaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgcHJvdl9yZWNvcmQgKnB0cjsKKwlzdHJ1Y3QgcHJvdl9yZWNvcmQgKnRtcDsKIAogCWluZm8tPkNhcmRSZWFkeSA9IDA7CiAJaW5mby0+UHJvZ0NvblN0YXQgPSAwOwpAQCAtMzczLDkgKzQwOSw4IEBACiAJLyogZGVsX3RpbWVyKCZwb2xsX3RpbWVyKTsgKi8KIAogCS8qIE1ha2Ugc3VyZSB3ZSBmcmVlIGFueSBtZW1vcnkgcmVzZXJ2ZSBmb3IgcHJvdmlzaW9uaW5nICovCi0Jd2hpbGUgKGxpc3RfZW1wdHkoJmluZm8tPnByb3ZfbGlzdCkgPT0gMCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdHIsIHRtcCwgJmluZm8tPnByb3ZfbGlzdCwgbGlzdCkgewogCQlwcl9kZWJ1ZygiZGVsZXRpbmcgcHJvdmlzaW9uaW5nIHJlY29yZFxuIik7Ci0JCXB0ciA9IGxpc3RfZW50cnkoaW5mby0+cHJvdl9saXN0Lm5leHQsIHN0cnVjdCBwcm92X3JlY29yZCwgbGlzdCk7CiAJCWxpc3RfZGVsKCZwdHItPmxpc3QpOwogCQlrZnJlZShwdHItPnBwcm92X2RhdGEpOwogCQlrZnJlZShwdHIpOwpAQCAtMzg3LDcgKzQyMiw3IEBACiAJfSBlbHNlIHsKIAkJcHJfZGVidWcoInJlc2V0dGluZyBBU0lDIGFuZCBEU1BcbiIpOwogCQlmdDEwMDBfd3JpdGVfcmVnKGRldiwgRlQxMDAwX1JFR19SRVNFVCwKLQkJCQkgKERTUF9SRVNFVF9CSVQgfCBBU0lDX1JFU0VUX0JJVCkpOworCQkJCSBEU1BfUkVTRVRfQklUIHwgQVNJQ19SRVNFVF9CSVQpOwogCX0KIAogCS8qIENvcHkgRFNQIHNlc3Npb24gcmVjb3JkIGludG8gaW5mbyBibG9jayBpZiB0aGlzIGlzIG5vdCBhIGNvbGRzdGFydCAqLwpAQCAtNDA2LDcgKzQ0MSw4IEBACiAJCQkJCSBGVDEwMDBfRFBSQU1fTUFHX1JYX0JBU0UpOwogCQkJZm9yIChpID0gMDsgaSA8IE1BWF9EU1BfU0VTU19SRUMgLyAyOyBpKyspIHsKIAkJCQlpbmZvLT5EU1BTZXNzLk1hZ1JlY1tpXSA9Ci0JCQkJCWlubChkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RQREFUQSk7CisJCQkJCWlubChkZXYtPmJhc2VfYWRkcgorCQkJCQkJKyBGVDEwMDBfUkVHX01BR19EUERBVEEpOwogCQkJfQogCQl9CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmRwcmFtX2xvY2ssIGZsYWdzKTsKQEAgLTQzNSwxMSArNDcxLDE0IEBACiAJCW1kZWxheSgxMCk7CiAJCXByX2RlYnVnKCJUYWtlIERTUCBvdXQgb2YgcmVzZXRcbiIpOwogCi0JCS8qIFdhaXQgZm9yIDB4ZmVmZSBpbmRpY2F0aW5nIGRzcCByZWFkeSBiZWZvcmUgc3RhcnRpbmcgZG93bmxvYWQgKi8KKwkJLyoKKwkJICogV2FpdCBmb3IgMHhmZWZlIGluZGljYXRpbmcgZHNwIHJlYWR5IGJlZm9yZSBzdGFydGluZworCQkgKiBkb3dubG9hZAorCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IDUwOyBpKyspIHsKLQkJCXRlbXB3b3JkID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LCBGVDEwMDBfTUFHX0RQUkFNX0ZFRkUsCi0JCQkJCQkJIEZUMTAwMF9NQUdfRFBSQU1fRkVGRV9JTkRYKTsKKwkJCXRlbXB3b3JkID0gZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKKwkJCQkJCUZUMTAwMF9NQUdfRFBSQU1fRkVGRSwKKwkJCQkJCUZUMTAwMF9NQUdfRFBSQU1fRkVGRV9JTkRYKTsKIAkJCWlmICh0ZW1wd29yZCA9PSAweGZlZmUpCiAJCQkJYnJlYWs7CiAJCQltZGVsYXkoMjApOwpAQCAtNDU5LDE2ICs0OTgsMTUgQEAKIAlpZiAoY2FyZF9kb3dubG9hZChkZXYsIGZ3X2VudHJ5LT5kYXRhLCBmd19lbnRyeS0+c2l6ZSkpIHsKIAkJcHJfZGVidWcoImNhcmQgZG93bmxvYWQgdW5zdWNjZXNzZnVsXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJjYXJkIGRvd25sb2FkIHN1Y2Nlc3NmdWxcbiIpOwogCX0KKwlwcl9kZWJ1ZygiY2FyZCBkb3dubG9hZCBzdWNjZXNzZnVsXG4iKTsKIAogCW1kZWxheSgxMCk7CiAKIAlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7CiAJCS8qCi0JCSAqIE5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgRklGTyBsZW5ndGggY291bnRlciB0byB6ZXJvIGluIG9yZGVyIHRvIHN5bmMgdXAKLQkJICogd2l0aCB0aGUgRFNQCisJCSAqIE5lZWQgdG8gaW5pdGlhbGl6ZSB0aGUgRklGTyBsZW5ndGggY291bnRlciB0byB6ZXJvIGluIG9yZGVyCisJCSAqIHRvIHN5bmMgdXAgd2l0aCB0aGUgRFNQCiAJCSAqLwogCQlpbmZvLT5maWZvX2NudCA9IDA7CiAJCWZ0MTAwMF93cml0ZV9kcHJhbShkZXYsIEZUMTAwMF9GSUZPX0xFTiwgaW5mby0+Zmlmb19jbnQpOwpAQCAtNTc4LDMzICs2MTYsNyBAQAogCQl9CiAJCWlmICh0ZW1wd29yZCAhPSBobykgewogCQkJcHJfaW5mbygiaGVhcnRiZWF0IGZhaWxlZCAtIG5vIGhvIGRldGVjdGVkXG4iKTsKLQkJCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKLQkJCQlpbmZvLT5EU1BfVElNRVswXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjApOwotCQkJCWluZm8tPkRTUF9USU1FWzFdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMSk7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMl0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIyKTsKLQkJCQlpbmZvLT5EU1BfVElNRVszXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjMpOwotCQkJfSBlbHNlIHsKLQkJCQlpbmZvLT5EU1BfVElNRVswXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjAsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjBfSU5EWCk7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMV0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIxLAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIxX0lORFgpOwotCQkJCWluZm8tPkRTUF9USU1FWzJdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMiwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMl9JTkRYKTsKLQkJCQlpbmZvLT5EU1BfVElNRVszXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjMsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjNfSU5EWCk7Ci0JCQl9CisJCQlmdDEwMDBfcmVhZF9kc3BfdGltZXIoZGV2LCBpbmZvKTsKIAkJCWluZm8tPkRydkVyck51bSA9IERTUF9IQl9JTkZPOwogCQkJaWYgKGZ0MTAwMF9yZXNldF9jYXJkKGRldikgPT0gMCkgewogCQkJCXByX2luZm8oIkhhcmR3YXJlIEZhaWx1cmUgRGV0ZWN0ZWQgLSBQQyBDYXJkIGRpc2FibGVkXG4iKTsKQEAgLTYyNSwzMyArNjM3LDcgQEAKIAogCQlpZiAodGVtcHdvcmQgJiBGVDEwMDBfREJfSEIpIHsKIAkJCXByX2luZm8oImhlYXJ0YmVhdCBkb29yYmVsbCBub3QgY2xlYXIgYnkgZmlybXdhcmVcbiIpOwotCQkJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgewotCQkJCWluZm8tPkRTUF9USU1FWzBdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMCk7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMV0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIxKTsKLQkJCQlpbmZvLT5EU1BfVElNRVsyXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjIpOwotCQkJCWluZm8tPkRTUF9USU1FWzNdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMyk7Ci0JCQl9IGVsc2UgewotCQkJCWluZm8tPkRTUF9USU1FWzBdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMCwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMF9JTkRYKTsKLQkJCQlpbmZvLT5EU1BfVElNRVsxXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjEsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWCk7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMl0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIyLAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIyX0lORFgpOwotCQkJCWluZm8tPkRTUF9USU1FWzNdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMywKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSM19JTkRYKTsKLQkJCX0KKwkJCWZ0MTAwMF9yZWFkX2RzcF90aW1lcihkZXYsIGluZm8pOwogCQkJaW5mby0+RHJ2RXJyTnVtID0gRFNQX0hCX0lORk87CiAJCQlpZiAoZnQxMDAwX3Jlc2V0X2NhcmQoZGV2KSA9PSAwKSB7CiAJCQkJcHJfaW5mbygiSGFyZHdhcmUgRmFpbHVyZSBEZXRlY3RlZCAtIFBDIENhcmQgZGlzYWJsZWRcbiIpOwpAQCAtNjY1LDggKzY1MSw4IEBACiAJCQlyZXR1cm47CiAJCX0KIAkJLyoKLQkJICogU2V0IGRlZGljYXRlZCBhcmVhIHRvIGhpIGFuZCByaW5nIGFwcHJvcHJpYXRlIGRvb3JiZWxsIGFjY29yZGluZwotCQkgKiB0byBoaS9obyBoZWFydGJlYXQgcHJvdG9jb2wKKwkJICogU2V0IGRlZGljYXRlZCBhcmVhIHRvIGhpIGFuZCByaW5nIGFwcHJvcHJpYXRlIGRvb3JiZWxsCisJCSAqIGFjY29yZGluZyB0byBoaS9obyBoZWFydGJlYXQgcHJvdG9jb2wKIAkJICovCiAJCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKIAkJCWZ0MTAwMF93cml0ZV9kcHJhbShkZXYsIEZUMTAwMF9ISV9ITywgaGkpOwpAQCAtNjg4LDQ0ICs2NzQsMjAgQEAKIAkJCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpCiAJCQkJZnQxMDAwX3dyaXRlX2RwcmFtKGRldiwgRlQxMDAwX0hJX0hPLCBoaSk7CiAJCQllbHNlCi0JCQkJZnQxMDAwX3dyaXRlX2RwcmFtX21hZ18xNihkZXYsIEZUMTAwMF9NQUdfSElfSE8sIGhpX21hZywgRlQxMDAwX01BR19ISV9IT19JTkRYKTsKKwkJCQlmdDEwMDBfd3JpdGVfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19ISV9ITywKKwkJCQkJCWhpX21hZywgRlQxMDAwX01BR19ISV9IT19JTkRYKTsKIAogCQkJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkKIAkJCQl0ZW1wd29yZCA9IGZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0hJX0hPKTsKIAkJCWVsc2UKLQkJCQl0ZW1wd29yZCA9IG50b2hzKGZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsIEZUMTAwMF9NQUdfSElfSE8sIEZUMTAwMF9NQUdfSElfSE9fSU5EWCkpOwotCisJCQkJdGVtcHdvcmQgPSBudG9ocyhmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LAorCQkJCQkJCUZUMTAwMF9NQUdfSElfSE8sCisJCQkJCQkJRlQxMDAwX01BR19ISV9IT19JTkRYKSk7CiAJCX0KIAogCQlpZiAodGVtcHdvcmQgIT0gaGkpIHsKIAkJCXByX2luZm8oImhlYXJ0YmVhdCBmYWlsZWQgLSBjYW5ub3Qgd3JpdGUgaGkgaW50byBEUFJBTVxuIik7Ci0JCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMF0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIwKTsKLQkJCQlpbmZvLT5EU1BfVElNRVsxXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwgRlQxMDAwX0RTUF9USU1FUjEpOwotCQkJCWluZm8tPkRTUF9USU1FWzJdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBGVDEwMDBfRFNQX1RJTUVSMik7Ci0JCQkJaW5mby0+RFNQX1RJTUVbM10gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5mby0+RFNQX1RJTUVbMF0gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIwLAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIwX0lORFgpOwotCQkJCWluZm8tPkRTUF9USU1FWzFdID0KLQkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMSwKLQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMV9JTkRYKTsKLQkJCQlpbmZvLT5EU1BfVElNRVsyXSA9Ci0JCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjIsCi0JCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjJfSU5EWCk7Ci0JCQkJaW5mby0+RFNQX1RJTUVbM10gPQotCQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIzLAotCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIzX0lORFgpOwotCQkJfQorCQkJZnQxMDAwX3JlYWRfZHNwX3RpbWVyKGRldiwgaW5mbyk7CiAJCQlpbmZvLT5EcnZFcnJOdW0gPSBEU1BfSEJfSU5GTzsKIAkJCWlmIChmdDEwMDBfcmVzZXRfY2FyZChkZXYpID09IDApIHsKIAkJCQlwcl9pbmZvKCJIYXJkd2FyZSBGYWlsdXJlIERldGVjdGVkIC0gUEMgQ2FyZCBkaXNhYmxlZFxuIik7CkBAIC03NTYsNyArNzE4LDggQEAKICAgT3V0cHV0OgogCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIHZvaWQgZnQxMDAwX3NlbmRfY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiAqcHRlbXBidWZmZXIsIGludCBzaXplLCB1MTYgcXR5cGUpCitzdGF0aWMgdm9pZCBmdDEwMDBfc2VuZF9jbWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2ICpwdGVtcGJ1ZmZlciwgaW50IHNpemUsCisJCQkgICAgdTE2IHF0eXBlKQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqaW5mbyA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IGk7CkBAIC04NTAsNzQgKzgxMyw3MyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7Ci0JCXNpemUgPSAoZnQxMDAwX3JlYWRfZHByYW0oZGV2LCAqcG54dHBoKSkgKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpOworCQlzaXplID0gZnQxMDAwX3JlYWRfZHByYW0oZGV2LCAqcG54dHBoKQorCQkJKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpOwogCX0gZWxzZSB7Ci0JCXNpemUgPQotCQkJbnRvaHMoZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2Ci0JCQkgICAgICAoZGV2LCBGVDEwMDBfTUFHX1BIX0xFTiwKLQkJCSAgICAgICBGVDEwMDBfTUFHX1BIX0xFTl9JTkRYKSkgKyBzaXplb2Yoc3RydWN0IHBzZXVkb19oZHIpOworCQlzaXplID0gbnRvaHMoZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwgRlQxMDAwX01BR19QSF9MRU4sCisJCQkJCQkgICAgICBGVDEwMDBfTUFHX1BIX0xFTl9JTkRYKSkKKwkJCQkrIHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcik7CiAJfQogCWlmIChzaXplID4gbWF4c3opIHsKIAkJcHJfZGVidWcoIkludmFsaWQgY29tbWFuZCBsZW5ndGggPSAlZFxuIiwgc2l6ZSk7CiAJCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgewotCQlwcHNldWRvaGRyID0gKHUxNiAqKXBidWZmZXI7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZvLT5kcHJhbV9sb2NrLCBmbGFncyk7Ci0JCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKLQkJCWZ0MTAwMF93cml0ZV9yZWcoZGV2LCBGVDEwMDBfUkVHX0RQUkFNX0FERFIsCi0JCQkJCSBGVDEwMDBfRFBSQU1fUlhfQkFTRSArIDIpOwotCQkJZm9yIChpID0gMDsgaSA8PSAoc2l6ZSA+PiAxKTsgaSsrKSB7Ci0JCQkJdGVtcHdvcmQgPQotCQkJCQlmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RQUkFNX0RBVEEpOwotCQkJCSpwYnVmZmVyKysgPSBudG9ocyh0ZW1wd29yZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlmdDEwMDBfd3JpdGVfcmVnKGRldiwgRlQxMDAwX1JFR19EUFJBTV9BRERSLAotCQkJCQkgRlQxMDAwX0RQUkFNX01BR19SWF9CQVNFKTsKLQkJCSpwYnVmZmVyID0gaW53KGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19NQUdfRFBEQVRBSCk7Ci0JCQlwcl9kZWJ1ZygicmVjZWl2ZWQgZGF0YSA9IDB4JXhcbiIsICpwYnVmZmVyKTsKLQkJCXBidWZmZXIrKzsKLQkJCWZ0MTAwMF93cml0ZV9yZWcoZGV2LCBGVDEwMDBfUkVHX0RQUkFNX0FERFIsCi0JCQkJCSBGVDEwMDBfRFBSQU1fTUFHX1JYX0JBU0UgKyAxKTsKLQkJCWZvciAoaSA9IDA7IGkgPD0gKHNpemUgPj4gMik7IGkrKykgewotCQkJCSpwYnVmZmVyID0KLQkJCQkJaW53KGRldi0+YmFzZV9hZGRyICsKLQkJCQkJICAgIEZUMTAwMF9SRUdfTUFHX0RQREFUQUwpOwotCQkJCXBidWZmZXIrKzsKLQkJCQkqcGJ1ZmZlciA9Ci0JCQkJCWludyhkZXYtPmJhc2VfYWRkciArCi0JCQkJCSAgICBGVDEwMDBfUkVHX01BR19EUERBVEFIKTsKLQkJCQlwYnVmZmVyKys7Ci0JCQl9Ci0JCQkvKiBjb3B5IG9kZCBhbGlnbmVkIHdvcmQgKi8KLQkJCSpwYnVmZmVyID0gaW53KGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19NQUdfRFBEQVRBTCk7Ci0JCQlwcl9kZWJ1ZygicmVjZWl2ZWQgZGF0YSA9IDB4JXhcbiIsICpwYnVmZmVyKTsKLQkJCXBidWZmZXIrKzsKLQkJCSpwYnVmZmVyID0gaW53KGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19NQUdfRFBEQVRBSCk7Ci0JCQlwcl9kZWJ1ZygicmVjZWl2ZWQgZGF0YSA9IDB4JXhcbiIsICpwYnVmZmVyKTsKLQkJCXBidWZmZXIrKzsKLQkJfQotCQlpZiAoc2l6ZSAmIDB4MDAwMSkgewotCQkJLyogY29weSBvZGQgYnl0ZSBmcm9tIGZpZm8gKi8KLQkJCXRlbXB3b3JkID0gZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19EUFJBTV9EQVRBKTsKLQkJCSpwYnVmZmVyID0gbnRvaHModGVtcHdvcmQpOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmRwcmFtX2xvY2ssIGZsYWdzKTsKLQotCQkvKgotCQkgKiBDaGVjayBpZiBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtIGlzIGdvb2QKLQkJICogQ2FsY3VsYXRlIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0KLQkJICovCi0JCXRlbXB3b3JkID0gKnBwc2V1ZG9oZHIrKzsKLQkJZm9yIChpID0gMTsgaSA8IDc7IGkrKykKLQkJCXRlbXB3b3JkIF49ICpwcHNldWRvaGRyKys7Ci0JCWlmICgodGVtcHdvcmQgIT0gKnBwc2V1ZG9oZHIpKSB7Ci0JCQlwcl9kZWJ1ZygiUHNldWRvIGhlYWRlciBjaGVja3N1bSBtaXNtYXRjaFxuIik7Ci0JCQkvKiBEcm9wIHRoaXMgbWVzc2FnZSAqLwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwogCX0KKwlwcHNldWRvaGRyID0gKHUxNiAqKXBidWZmZXI7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmRwcmFtX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7CisJCWZ0MTAwMF93cml0ZV9yZWcoZGV2LCBGVDEwMDBfUkVHX0RQUkFNX0FERFIsCisJCQkJIEZUMTAwMF9EUFJBTV9SWF9CQVNFICsgMik7CisJCWZvciAoaSA9IDA7IGkgPD0gKHNpemUgPj4gMSk7IGkrKykgeworCQkJdGVtcHdvcmQgPQorCQkJCWZ0MTAwMF9yZWFkX3JlZyhkZXYsIEZUMTAwMF9SRUdfRFBSQU1fREFUQSk7CisJCQkqcGJ1ZmZlcisrID0gbnRvaHModGVtcHdvcmQpOworCQl9CisJfSBlbHNlIHsKKwkJZnQxMDAwX3dyaXRlX3JlZyhkZXYsIEZUMTAwMF9SRUdfRFBSQU1fQUREUiwKKwkJCQkgRlQxMDAwX0RQUkFNX01BR19SWF9CQVNFKTsKKwkJKnBidWZmZXIgPSBpbncoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX01BR19EUERBVEFIKTsKKwkJcHJfZGVidWcoInJlY2VpdmVkIGRhdGEgPSAweCV4XG4iLCAqcGJ1ZmZlcik7CisJCXBidWZmZXIrKzsKKwkJZnQxMDAwX3dyaXRlX3JlZyhkZXYsIEZUMTAwMF9SRUdfRFBSQU1fQUREUiwKKwkJCQkgRlQxMDAwX0RQUkFNX01BR19SWF9CQVNFICsgMSk7CisJCWZvciAoaSA9IDA7IGkgPD0gKHNpemUgPj4gMik7IGkrKykgeworCQkJKnBidWZmZXIgPQorCQkJCWludyhkZXYtPmJhc2VfYWRkciArCisJCQkJICAgIEZUMTAwMF9SRUdfTUFHX0RQREFUQUwpOworCQkJcGJ1ZmZlcisrOworCQkJKnBidWZmZXIgPQorCQkJCWludyhkZXYtPmJhc2VfYWRkciArCisJCQkJICAgIEZUMTAwMF9SRUdfTUFHX0RQREFUQUgpOworCQkJcGJ1ZmZlcisrOworCQl9CisJCS8qIGNvcHkgb2RkIGFsaWduZWQgd29yZCAqLworCQkqcGJ1ZmZlciA9IGludyhkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RQREFUQUwpOworCQlwcl9kZWJ1ZygicmVjZWl2ZWQgZGF0YSA9IDB4JXhcbiIsICpwYnVmZmVyKTsKKwkJcGJ1ZmZlcisrOworCQkqcGJ1ZmZlciA9IGludyhkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RQREFUQUgpOworCQlwcl9kZWJ1ZygicmVjZWl2ZWQgZGF0YSA9IDB4JXhcbiIsICpwYnVmZmVyKTsKKwkJcGJ1ZmZlcisrOworCX0KKwlpZiAoc2l6ZSAmIDB4MDAwMSkgeworCQkvKiBjb3B5IG9kZCBieXRlIGZyb20gZmlmbyAqLworCQl0ZW1wd29yZCA9IGZ0MTAwMF9yZWFkX3JlZyhkZXYsIEZUMTAwMF9SRUdfRFBSQU1fREFUQSk7CisJCSpwYnVmZmVyID0gbnRvaHModGVtcHdvcmQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5kcHJhbV9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIENoZWNrIGlmIHBzZXVkbyBoZWFkZXIgY2hlY2tzdW0gaXMgZ29vZAorCSAqIENhbGN1bGF0ZSBwc2V1ZG8gaGVhZGVyIGNoZWNrc3VtCisJICovCisJdGVtcHdvcmQgPSAqcHBzZXVkb2hkcisrOworCWZvciAoaSA9IDE7IGkgPCA3OyBpKyspCisJCXRlbXB3b3JkIF49ICpwcHNldWRvaGRyKys7CisJaWYgKHRlbXB3b3JkICE9ICpwcHNldWRvaGRyKSB7CisJCXByX2RlYnVnKCJQc2V1ZG8gaGVhZGVyIGNoZWNrc3VtIG1pc21hdGNoXG4iKTsKKwkJLyogRHJvcCB0aGlzIG1lc3NhZ2UgKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTk1Nyw3ICs5MTksMTAgQEAKIAogCWlmIChmdDEwMDBfcmVjZWl2ZV9jbWQoZGV2LCAmY21kYnVmZmVyWzBdLCBNQVhfQ01EX1NRU0laRSwgJnRlbXB3b3JkKSkgewogCi0JCS8qIEdldCB0aGUgbWVzc2FnZSB0eXBlIHdoaWNoIGlzIHRvdGFsX2xlbiArIFBTRVVETyBoZWFkZXIgKyBtc2d0eXBlICsgbWVzc2FnZSBib2R5ICovCisJCS8qCisJCSAqIEdldCB0aGUgbWVzc2FnZSB0eXBlIHdoaWNoIGlzIHRvdGFsX2xlbiArIFBTRVVETyBoZWFkZXIKKwkJICogKyBtc2d0eXBlICsgbWVzc2FnZSBib2R5CisJCSAqLwogCQlwZHJ2bXNnID0gKHN0cnVjdCBkcnZfbXNnICopJmNtZGJ1ZmZlclswXTsKIAkJbXNndHlwZSA9IG50b2hzKHBkcnZtc2ctPnR5cGUpOwogCQlwcl9kZWJ1ZygiQ29tbWFuZCBtZXNzYWdlIHR5cGUgPSAweCV4XG4iLCBtc2d0eXBlKTsKQEAgLTk2OCw4ICs5MzMsOCBAQAogCQkJd2hpbGUgKGxpc3RfZW1wdHkoJmluZm8tPnByb3ZfbGlzdCkgPT0gMCkgewogCQkJCXByX2RlYnVnKCJTZW5kaW5nIGEgcHJvdmlzaW9uaW5nIG1lc3NhZ2VcbiIpOwogCQkJCS8qIE1ha2Ugc3VyZSBTTE9XUSBkb29yYmVsbCBpcyBjbGVhciAqLwotCQkJCXRlbXB3b3JkID0KLQkJCQkJZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19ET09SQkVMTCk7CisJCQkJdGVtcHdvcmQgPSBmdDEwMDBfcmVhZF9yZWcoZGV2LAorCQkJCQkJCSAgIEZUMTAwMF9SRUdfRE9PUkJFTEwpOwogCQkJCWkgPSAwOwogCQkJCXdoaWxlICh0ZW1wd29yZCAmIEZUMTAwMF9EQl9EUFJBTV9UWCkgewogCQkJCQltZGVsYXkoNSk7CkBAIC05NzcsOSArOTQyLDggQEAKIAkJCQkJaWYgKGkgPT0gMTApCiAJCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJcHRyID0KLQkJCQkJbGlzdF9lbnRyeShpbmZvLT5wcm92X2xpc3QubmV4dCwKLQkJCQkJCSAgIHN0cnVjdCBwcm92X3JlY29yZCwgbGlzdCk7CisJCQkJcHRyID0gbGlzdF9lbnRyeShpbmZvLT5wcm92X2xpc3QubmV4dCwKKwkJCQkJCSBzdHJ1Y3QgcHJvdl9yZWNvcmQsIGxpc3QpOwogCQkJCWxlbiA9ICoodTE2ICopcHRyLT5wcHJvdl9kYXRhOwogCQkJCWxlbiA9IGh0b25zKGxlbik7CiAKQEAgLTk5OCwxNCArOTYyLDE1IEBACiAJCQkJCQkgcHBzZXVkb19oZHItPmNoZWNrc3VtKTsKIAkJCQl9CiAKLQkJCQlmdDEwMDBfc2VuZF9jbWQoZGV2LCAodTE2ICopcHRyLT5wcHJvdl9kYXRhLCBsZW4sIFNMT1dRX1RZUEUpOworCQkJCWZ0MTAwMF9zZW5kX2NtZChkZXYsICh1MTYgKilwdHItPnBwcm92X2RhdGEsCisJCQkJCQlsZW4sIFNMT1dRX1RZUEUpOwogCQkJCWxpc3RfZGVsKCZwdHItPmxpc3QpOwogCQkJCWtmcmVlKHB0ci0+cHByb3ZfZGF0YSk7CiAJCQkJa2ZyZWUocHRyKTsKIAkJCX0KIAkJCS8qCi0JCQkgKiBJbmRpY2F0ZSBhZGFwdGVyIGlzIHJlYWR5IHRvIHRha2UgYXBwbGljYXRpb24gbWVzc2FnZXMgYWZ0ZXIgYWxsCi0JCQkgKiBwcm92aXNpb25pbmcgbWVzc2FnZXMgYXJlIHNlbnQKKwkJCSAqIEluZGljYXRlIGFkYXB0ZXIgaXMgcmVhZHkgdG8gdGFrZSBhcHBsaWNhdGlvbgorCQkJICogbWVzc2FnZXMgYWZ0ZXIgYWxsIHByb3Zpc2lvbmluZyBtZXNzYWdlcyBhcmUgc2VudAogCQkJICovCiAJCQlpbmZvLT5DYXJkUmVhZHkgPSAxOwogCQkJYnJlYWs7CkBAIC0xMDkzLDggKzEwNTgsOCBAQAogCQkJdGVtcHdvcmQgPSBmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKIAkJCWlmICh0ZW1wd29yZCAmIEZUMTAwMF9EQl9EUFJBTV9UWCkgewogCQkJCW1kZWxheSgxMCk7Ci0JCQkJdGVtcHdvcmQgPQotCQkJCQlmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKKwkJCQl0ZW1wd29yZCA9IGZ0MTAwMF9yZWFkX3JlZyhkZXYsCisJCQkJCQkJICAgRlQxMDAwX1JFR19ET09SQkVMTCk7CiAJCQkJaWYgKHRlbXB3b3JkICYgRlQxMDAwX0RCX0RQUkFNX1RYKQogCQkJCQltZGVsYXkoMTApOwogCQkJfQpAQCAtMTEyOSw3ICsxMDk0LDkgQEAKIAkJCQlpbmZvLT5EU1BJbmZvQmxrWzhdID0gMHg3MjAwOwogCQkJCWluZm8tPkRTUEluZm9CbGtbOV0gPQogCQkJCQlodG9ucyhpbmZvLT5EU1BJbmZvQmxrbGVuKTsKLQkJCQlmdDEwMDBfc2VuZF9jbWQoZGV2LCAodTE2ICopaW5mby0+RFNQSW5mb0JsaywgKHUxNikoaW5mby0+RFNQSW5mb0Jsa2xlbis0KSwgMCk7CisJCQkJZnQxMDAwX3NlbmRfY21kKGRldiwgaW5mby0+RFNQSW5mb0JsaywKKwkJCQkJCSh1MTYpKGluZm8tPkRTUEluZm9CbGtsZW4rNCksCisJCQkJCQkwKTsKIAkJCX0KIAogCQkJYnJlYWs7CkBAIC0xMTQzLDggKzExMTAsOCBAQAogCQkJdGVtcHdvcmQgPSBmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKIAkJCWlmICh0ZW1wd29yZCAmIEZUMTAwMF9EQl9EUFJBTV9UWCkgewogCQkJCW1kZWxheSgxMCk7Ci0JCQkJdGVtcHdvcmQgPQotCQkJCQlmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RPT1JCRUxMKTsKKwkJCQl0ZW1wd29yZCA9IGZ0MTAwMF9yZWFkX3JlZyhkZXYsCisJCQkJCQkJICAgRlQxMDAwX1JFR19ET09SQkVMTCk7CiAJCQkJaWYgKHRlbXB3b3JkICYgRlQxMDAwX0RCX0RQUkFNX1RYKQogCQkJCQltZGVsYXkoMTApOwogCQkJfQpAQCAtMTE5MCw3ICsxMTU3LDggQEAKIAkJCQkqcG1zZysrID0gY29udmVydC53cmQ7CiAJCQkJKnBtc2crKyA9IGh0b25zKGluZm8tPkRydkVyck51bSk7CiAKLQkJCQlmdDEwMDBfc2VuZF9jbWQoZGV2LCAodTE2ICopJnRlbXBidWZmZXJbMF0sICh1MTYpKDB4MDAxMiksIDApOworCQkJCWZ0MTAwMF9zZW5kX2NtZChkZXYsICh1MTYgKikmdGVtcGJ1ZmZlclswXSwKKwkJCQkJCSh1MTYpKDB4MDAxMiksIDApOwogCQkJCWluZm8tPkRydkVyck51bSA9IDA7CiAJCQl9CiAKQEAgLTEyODEsMjggKzEyNDksMzAgQEAKIAkJCQkgICAgICAgRlQxMDAwX01BR19UT1RBTF9MRU5fSU5EWCkpOwogCQl9CiAJCXByX2RlYnVnKCJ0b3RhbCBsZW5ndGggPSAlZFxuIiwgdG90YWxfbGVuKTsKLQkJaWYgKCh0b3RhbF9sZW4gPCBNQVhfQ01EX1NRU0laRSkgJiYgKHRvdGFsX2xlbiA+IHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcikpKSB7CisJCWlmICgodG90YWxfbGVuIDwgTUFYX0NNRF9TUVNJWkUpCisJCQkJJiYgKHRvdGFsX2xlbiA+IHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkcikpKSB7CiAJCQl0b3RhbF9sZW4gKz0gbnh0cGg7CiAJCQkvKgotCQkJICogZnQxMDAwX3JlYWRfcmVnIHdpbGwgcmV0dXJuIGEgdmFsdWUgdGhhdCBuZWVkcyB0byBiZSBieXRlc3dhcAotCQkJICogaW4gb3JkZXIgdG8gZ2V0IERTUF9RSURfT0ZGU0VULgorCQkJICogZnQxMDAwX3JlYWRfcmVnIHdpbGwgcmV0dXJuIGEgdmFsdWUgdGhhdCBuZWVkcyB0byBiZQorCQkJICogYnl0ZXN3YXAgaW4gb3JkZXIgdG8gZ2V0IERTUF9RSURfT0ZGU0VULgogCQkJICovCiAJCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7Ci0JCQkJcG9ydGlkID0KLQkJCQkJKGZ0MTAwMF9yZWFkX2RwcmFtCi0JCQkJCSAoZGV2LAotCQkJCQkgIERTUF9RSURfT0ZGU0VUICsgRlQxMDAwX0RQUkFNX1JYX0JBU0UgKwotCQkJCQkgIDIpID4+IDgpICYgMHhmZjsKKwkJCQlwb3J0aWQgPSAoZnQxMDAwX3JlYWRfZHByYW0oZGV2LCBEU1BfUUlEX09GRlNFVAorCQkJCQkJKyBGVDEwMDBfRFBSQU1fUlhfQkFTRSArIDIpCisJCQkJCQk+PiA4KSAmIDB4ZmY7CiAJCQl9IGVsc2UgewogCQkJCXBvcnRpZCA9Ci0JCQkJCShmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYKKwkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2CiAJCQkJCSAoZGV2LCBGVDEwMDBfTUFHX1BPUlRfSUQsCi0JCQkJCSAgRlQxMDAwX01BR19QT1JUX0lEX0lORFgpICYgMHhmZik7CisJCQkJCSAgRlQxMDAwX01BR19QT1JUX0lEX0lORFgpICYgMHhmZjsKIAkJCX0KIAkJCXByX2RlYnVnKCJEU1BfUUlEID0gMHgleFxuIiwgcG9ydGlkKTsKIAogCQkJaWYgKHBvcnRpZCA9PSBEUklWRVJJRCkgewotCQkJCS8qIFdlIGFyZSBhc3N1bW1pbmcgb25lIGRyaXZlciBtZXNzYWdlIGZyb20gdGhlIERTUCBhdCBhIHRpbWUuICovCisJCQkJLyoKKwkJCQkgKiBXZSBhcmUgYXNzdW1taW5nIG9uZSBkcml2ZXIgbWVzc2FnZSBmcm9tIHRoZQorCQkJCSAqIERTUCBhdCBhIHRpbWUuCisJCQkJICovCiAJCQkJZnQxMDAwX3Byb2NfZHJ2bXNnKGRldik7CiAJCQl9CiAJCX0KQEAgLTEzMTEsMjkgKzEyODEsNyBAQAogCiAJaWYgKGRvb3JiZWxsICYgRlQxMDAwX0RCX0NPTkRfUkVTRVQpIHsKIAkJLyogUmVzZXQgQVNJQyBhbmQgRFNQICovCi0JCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKLQkJCWluZm8tPkRTUF9USU1FWzBdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIwKTsKLQkJCWluZm8tPkRTUF9USU1FWzFdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIxKTsKLQkJCWluZm8tPkRTUF9USU1FWzJdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIyKTsKLQkJCWluZm8tPkRTUF9USU1FWzNdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIzKTsKLQkJfSBlbHNlIHsKLQkJCWluZm8tPkRTUF9USU1FWzBdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjAsCi0JCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMF9JTkRYKTsKLQkJCWluZm8tPkRTUF9USU1FWzFdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjEsCi0JCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMV9JTkRYKTsKLQkJCWluZm8tPkRTUF9USU1FWzJdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjIsCi0JCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMl9JTkRYKTsKLQkJCWluZm8tPkRTUF9USU1FWzNdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjMsCi0JCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSM19JTkRYKTsKLQkJfQorCQlmdDEwMDBfcmVhZF9kc3BfdGltZXIoZGV2LCBpbmZvKTsKIAkJaW5mby0+RHJ2RXJyTnVtID0gRFNQX0NPTkRSRVNFVF9JTkZPOwogCQlwcl9kZWJ1ZygiRFNQIGNvbmRpdGlvbmFsIHJlc2V0IHJlcXVlc3RlZFxuIik7CiAJCWZ0MTAwMF9yZXNldF9jYXJkKGRldik7CkBAIC0xMzc0LDEzMSArMTMyMiw4NCBAQAogCXUxNiB0ZW1wd29yZDsKIAogCWlmIChwY21jaWEtPlBrdEludGZFcnIgPiBNQVhfUEhfRVJSKSB7Ci0JCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKLQkJCWluZm8tPkRTUF9USU1FWzBdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIwKTsKLQkJCWluZm8tPkRTUF9USU1FWzFdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIxKTsKLQkJCWluZm8tPkRTUF9USU1FWzJdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIyKTsKLQkJCWluZm8tPkRTUF9USU1FWzNdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbShkZXYsIEZUMTAwMF9EU1BfVElNRVIzKTsKLQkJfSBlbHNlIHsKLQkJCWluZm8tPkRTUF9USU1FWzBdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjAsCi0JCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMF9JTkRYKTsKLQkJCWluZm8tPkRTUF9USU1FWzFdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjEsCi0JCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMV9JTkRYKTsKLQkJCWluZm8tPkRTUF9USU1FWzJdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjIsCi0JCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMl9JTkRYKTsKLQkJCWluZm8tPkRTUF9USU1FWzNdID0KLQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LCBGVDEwMDBfTUFHX0RTUF9USU1FUjMsCi0JCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSM19JTkRYKTsKLQkJfQorCQlmdDEwMDBfcmVhZF9kc3BfdGltZXIoZGV2LCBpbmZvKTsKIAkJaW5mby0+RHJ2RXJyTnVtID0gRHJ2RXJyTnVtOwogCQlmdDEwMDBfcmVzZXRfY2FyZChkZXYpOwogCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJLyogRmx1c2ggY29ycnVwdGVkIHBrdCBmcm9tIEZJRk8gKi8KLQkJaSA9IDA7Ci0JCWRvIHsKLQkJCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKKwl9CisJLyogRmx1c2ggY29ycnVwdGVkIHBrdCBmcm9tIEZJRk8gKi8KKwlpID0gMDsKKwlkbyB7CisJCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKKwkJCXRlbXB3b3JkID0KKwkJCQlmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RGSUZPKTsKKwkJCXRlbXB3b3JkID0KKwkJCQlmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RGSUZPX1NUQVQpOworCQl9IGVsc2UgeworCQkJdGVtcGxvbmcgPQorCQkJCWlubChkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RGUik7CisJCQl0ZW1wd29yZCA9CisJCQkJaW53KGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19NQUdfREZTUik7CisJCX0KKwkJaSsrOworCQkvKgorCQkgKiBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gdW5sZXNzIHRoZSBBU0lDIGlzIGJyb2tlbi4KKwkJICogV2UgbXVzdCByZXNldCB0byByZWNvdmVyLgorCQkgKi8KKwkJaWYgKChpID4gMjA0OCkgfHwgKHRlbXB3b3JkID09IDApKSB7CisJCQlmdDEwMDBfcmVhZF9kc3BfdGltZXIoZGV2LCBpbmZvKTsKKwkJCWlmICh0ZW1wd29yZCA9PSAwKSB7CisJCQkJLyoKKwkJCQkgKiBMZXQncyBjaGVjayBpZiBBU0lDIHJlYWRzIGFyZSBzdGlsbCBvayBieQorCQkJCSAqIHJlYWRpbmcgdGhlIE1hc2sgcmVnaXN0ZXIgd2hpY2ggaXMgbmV2ZXIgemVybworCQkJCSAqIGF0IHRoaXMgcG9pbnQgb2YgdGhlIGNvZGUuCisJCQkJICovCiAJCQkJdGVtcHdvcmQgPQotCQkJCQlmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RGSUZPKTsKLQkJCQl0ZW1wd29yZCA9Ci0JCQkJCWZ0MTAwMF9yZWFkX3JlZyhkZXYsIEZUMTAwMF9SRUdfREZJRk9fU1RBVCk7Ci0JCQl9IGVsc2UgewotCQkJCXRlbXBsb25nID0KLQkJCQkJaW5sKGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19NQUdfREZSKTsKLQkJCQl0ZW1wd29yZCA9Ci0JCQkJCWludyhkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RGU1IpOwotCQkJfQotCQkJaSsrOwotCQkJLyoKLQkJCSAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB1bmxlc3MgdGhlIEFTSUMgaXMgYnJva2VuLgotCQkJICogV2UgbXVzdCByZXNldCB0byByZWNvdmVyLgotCQkJICovCi0JCQlpZiAoKGkgPiAyMDQ4KSB8fCAodGVtcHdvcmQgPT0gMCkpIHsKLQkJCQlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7Ci0JCQkJCWluZm8tPkRTUF9USU1FWzBdID0KLQkJCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwKLQkJCQkJCQkJICBGVDEwMDBfRFNQX1RJTUVSMCk7Ci0JCQkJCWluZm8tPkRTUF9USU1FWzFdID0KLQkJCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwKLQkJCQkJCQkJICBGVDEwMDBfRFNQX1RJTUVSMSk7Ci0JCQkJCWluZm8tPkRTUF9USU1FWzJdID0KLQkJCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwKLQkJCQkJCQkJICBGVDEwMDBfRFNQX1RJTUVSMik7Ci0JCQkJCWluZm8tPkRTUF9USU1FWzNdID0KLQkJCQkJCWZ0MTAwMF9yZWFkX2RwcmFtKGRldiwKLQkJCQkJCQkJICBGVDEwMDBfRFNQX1RJTUVSMyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW5mby0+RFNQX1RJTUVbMF0gPQotCQkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKLQkJCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjAsCi0JCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIwX0lORFgpOwotCQkJCQlpbmZvLT5EU1BfVElNRVsxXSA9Ci0JCQkJCQlmdDEwMDBfcmVhZF9kcHJhbV9tYWdfMTYoZGV2LAotCQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMSwKLQkJCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjFfSU5EWCk7Ci0JCQkJCWluZm8tPkRTUF9USU1FWzJdID0KLQkJCQkJCWZ0MTAwMF9yZWFkX2RwcmFtX21hZ18xNihkZXYsCi0JCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIyLAotCQkJCQkJCQkJIEZUMTAwMF9NQUdfRFNQX1RJTUVSMl9JTkRYKTsKLQkJCQkJaW5mby0+RFNQX1RJTUVbM10gPQotCQkJCQkJZnQxMDAwX3JlYWRfZHByYW1fbWFnXzE2KGRldiwKLQkJCQkJCQkJCSBGVDEwMDBfTUFHX0RTUF9USU1FUjMsCi0JCQkJCQkJCQkgRlQxMDAwX01BR19EU1BfVElNRVIzX0lORFgpOwotCQkJCX0KKwkJCQkJaW53KGRldi0+YmFzZV9hZGRyICsKKwkJCQkJICAgIEZUMTAwMF9SRUdfU1VQX0lNQVNLKTsKIAkJCQlpZiAodGVtcHdvcmQgPT0gMCkgewogCQkJCQkvKgotCQkJCQkgKiBMZXQncyBjaGVjayBpZiBBU0lDIHJlYWRzIGFyZSBzdGlsbCBvayBieSByZWFkaW5nIHRoZSBNYXNrIHJlZ2lzdGVyCi0JCQkJCSAqIHdoaWNoIGlzIG5ldmVyIHplcm8gYXQgdGhpcyBwb2ludCBvZiB0aGUgY29kZS4KKwkJCQkJICogVGhpcyBpbmRpY2F0ZXMgdGhhdCB3ZSBjYW4gbm90CisJCQkJCSAqIGNvbW11bmljYXRlIHdpdGggdGhlIEFTSUMKIAkJCQkJICovCi0JCQkJCXRlbXB3b3JkID0KLQkJCQkJCWludyhkZXYtPmJhc2VfYWRkciArCi0JCQkJCQkgICAgRlQxMDAwX1JFR19TVVBfSU1BU0spOwotCQkJCQlpZiAodGVtcHdvcmQgPT0gMCkgewotCQkJCQkJLyogVGhpcyBpbmRpY2F0ZXMgdGhhdCB3ZSBjYW4gbm90IGNvbW11bmljYXRlIHdpdGggdGhlIEFTSUMgKi8KLQkJCQkJCWluZm8tPkRydkVyck51bSA9Ci0JCQkJCQkJRklGT19GTFVTSF9CQURDTlQ7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKiBMZXQncyBhc3N1bWUgdGhhdCB3ZSByZWFsbHkgZmx1c2ggdGhlIEZJRk8gKi8KLQkJCQkJCXBjbWNpYS0+UGt0SW50ZkVycisrOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9CisJCQkJCWluZm8tPkRydkVyck51bSA9IEZJRk9fRkxVU0hfQkFEQ05UOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWluZm8tPkRydkVyck51bSA9IEZJRk9fRkxVU0hfTUFYTElNSVQ7CisJCQkJCS8qCisJCQkJCSAqIExldCdzIGFzc3VtZSB0aGF0IHdlIHJlYWxseSBmbHVzaAorCQkJCQkgKiB0aGUgRklGTworCQkJCQkgKi8KKwkJCQkJcGNtY2lhLT5Qa3RJbnRmRXJyKys7CisJCQkJCXJldHVybjsKIAkJCQl9Ci0JCQkJcmV0dXJuOworCQkJfSBlbHNlIHsKKwkJCQlpbmZvLT5EcnZFcnJOdW0gPSBGSUZPX0ZMVVNIX01BWExJTUlUOwogCQkJfQotCQkJdGVtcHdvcmQgPSBpbncoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX1NVUF9TVEFUKTsKLQkJfSB3aGlsZSAoKHRlbXB3b3JkICYgMHgwMykgIT0gMHgwMyk7Ci0JCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKLQkJCWkrKzsKLQkJCXByX2RlYnVnKCJGbHVzaGluZyBGSUZPIGNvbXBsZXRlID0gJXhcbiIsIHRlbXB3b3JkKTsKLQkJCS8qIEZsdXNoIGxhc3Qgd29yZCBpbiBGSUZPLiAqLwotCQkJdGVtcHdvcmQgPSBmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RGSUZPKTsKLQkJCS8qIFVwZGF0ZSBGSUZPIGNvdW50ZXIgZm9yIERTUCAqLwotCQkJaSA9IGkgKiAyOwotCQkJcHJfZGVidWcoIkZsdXNoIERhdGEgYnl0ZSBjb3VudCB0byBkc3AgPSAlZFxuIiwgaSk7Ci0JCQlpbmZvLT5maWZvX2NudCArPSBpOwotCQkJZnQxMDAwX3dyaXRlX2RwcmFtKGRldiwgRlQxMDAwX0ZJRk9fTEVOLAotCQkJCQkgICBpbmZvLT5maWZvX2NudCk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZygiRmx1c2hpbmcgRklGTyBjb21wbGV0ZSA9ICV4XG4iLCB0ZW1wd29yZCk7Ci0JCQkvKiBGbHVzaCBsYXN0IHdvcmQgaW4gRklGTyAqLwotCQkJdGVtcGxvbmcgPSBpbmwoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX01BR19ERlIpOwotCQkJdGVtcHdvcmQgPSBpbncoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX1NVUF9TVEFUKTsKLQkJCXByX2RlYnVnKCJGVDEwMDBfUkVHX1NVUF9TVEFUID0gMHgleFxuIiwgdGVtcHdvcmQpOwotCQkJdGVtcHdvcmQgPSBpbncoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX01BR19ERlNSKTsKLQkJCXByX2RlYnVnKCJGVDEwMDBfUkVHX01BR19ERlNSID0gMHgleFxuIiwgdGVtcHdvcmQpOworCQkJcmV0dXJuOwogCQl9Ci0JCWlmIChEcnZFcnJOdW0pCi0JCQlwY21jaWEtPlBrdEludGZFcnIrKzsKKwkJdGVtcHdvcmQgPSBpbncoZGV2LT5iYXNlX2FkZHIgKyBGVDEwMDBfUkVHX1NVUF9TVEFUKTsKKwl9IHdoaWxlICgodGVtcHdvcmQgJiAweDAzKSAhPSAweDAzKTsKKwlpZiAoaW5mby0+QXNpY0lEID09IEVMRUNUUkFCVVpaX0lEKSB7CisJCWkrKzsKKwkJcHJfZGVidWcoIkZsdXNoaW5nIEZJRk8gY29tcGxldGUgPSAleFxuIiwgdGVtcHdvcmQpOworCQkvKiBGbHVzaCBsYXN0IHdvcmQgaW4gRklGTy4gKi8KKwkJdGVtcHdvcmQgPSBmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0RGSUZPKTsKKwkJLyogVXBkYXRlIEZJRk8gY291bnRlciBmb3IgRFNQICovCisJCWkgPSBpICogMjsKKwkJcHJfZGVidWcoIkZsdXNoIERhdGEgYnl0ZSBjb3VudCB0byBkc3AgPSAlZFxuIiwgaSk7CisJCWluZm8tPmZpZm9fY250ICs9IGk7CisJCWZ0MTAwMF93cml0ZV9kcHJhbShkZXYsIEZUMTAwMF9GSUZPX0xFTiwKKwkJCQkgICBpbmZvLT5maWZvX2NudCk7CisJfSBlbHNlIHsKKwkJcHJfZGVidWcoIkZsdXNoaW5nIEZJRk8gY29tcGxldGUgPSAleFxuIiwgdGVtcHdvcmQpOworCQkvKiBGbHVzaCBsYXN0IHdvcmQgaW4gRklGTyAqLworCQl0ZW1wbG9uZyA9IGlubChkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RGUik7CisJCXRlbXB3b3JkID0gaW53KGRldi0+YmFzZV9hZGRyICsgRlQxMDAwX1JFR19TVVBfU1RBVCk7CisJCXByX2RlYnVnKCJGVDEwMDBfUkVHX1NVUF9TVEFUID0gMHgleFxuIiwgdGVtcHdvcmQpOworCQl0ZW1wd29yZCA9IGludyhkZXYtPmJhc2VfYWRkciArIEZUMTAwMF9SRUdfTUFHX0RGU1IpOworCQlwcl9kZWJ1ZygiRlQxMDAwX1JFR19NQUdfREZTUiA9IDB4JXhcbiIsIHRlbXB3b3JkKTsKIAl9CisJaWYgKERydkVyck51bSkKKwkJcGNtY2lhLT5Qa3RJbnRmRXJyKys7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNTUyLDcgKzE0NTMsNiBAQAogCXNrYiA9IGRldl9hbGxvY19za2IobGVuICsgMTIgKyAyKTsKIAogCWlmIChza2IgPT0gTlVMTCkgewotCQlwcl9kZWJ1ZygiTm8gTmV0d29yayBidWZmZXJzIGF2YWlsYWJsZVxuIik7CiAJCS8qIFJlYWQgSGlnaCB3b3JkIHRvIGNvbXBsZXRlIDMyIGJpdCBhY2Nlc3MgKi8KIAkJaWYgKGluZm8tPkFzaWNJRCA9PSBNQUdORU1JVEVfSUQpCiAJCQl0ZW1wd29yZCA9IGZ0MTAwMF9yZWFkX3JlZyhkZXYsIEZUMTAwMF9SRUdfTUFHX0RGUkgpOwpAQCAtMTY3Myw3ICsxNTczLDggQEAKIAlpbmZvLT5zdGF0cy5yeF9ieXRlcyArPSAobGVuICsgMTIpOwogCiAJaWYgKGluZm8tPkFzaWNJRCA9PSBFTEVDVFJBQlVaWl9JRCkgewotCQkvKiB0cmFjayBob3cgbWFueSBieXRlcyBoYXZlIGJlZW4gcmVhZCBmcm9tIEZJRk8gLSByb3VuZCB1cCB0byAxNiBiaXQgd29yZCAqLworCQkvKiB0cmFjayBob3cgbWFueSBieXRlcyBoYXZlIGJlZW4gcmVhZCBmcm9tIEZJRk8gLSByb3VuZCB1cCB0bworCQkgKiAxNiBiaXQgd29yZCAqLwogCQl0ZW1wd29yZCA9IGxlbiArIDE2OwogCQlpZiAodGVtcHdvcmQgJiAweDAxKQogCQkJdGVtcHdvcmQrKzsKQEAgLTE3MzcsOSArMTYzOCwxMSBAQAogCWVsc2UKIAkJcHNldWRvLmJsay5sZW5ndGggPSBudG9ocyhsZW4pOwogCi0JcHNldWRvLmJsay5zb3VyY2UgPSBEU1BJRDsJLyogTmVlZCB0byBzd2FwIHRvIGdldCBpbiBjb3JyZWN0IG9yZGVyICovCisJcHNldWRvLmJsay5zb3VyY2UgPSBEU1BJRDsJLyogTmVlZCB0byBzd2FwIHRvIGdldCBpbiBjb3JyZWN0CisJCQkJCSAgIG9yZGVyICovCiAJcHNldWRvLmJsay5kZXN0aW5hdGlvbiA9IEhPU1RJRDsKLQlwc2V1ZG8uYmxrLnBvcnRkZXN0ID0gTkVUV09SS0lEOwkvKiBOZWVkIHRvIHN3YXAgdG8gZ2V0IGluIGNvcnJlY3Qgb3JkZXIgKi8KKwlwc2V1ZG8uYmxrLnBvcnRkZXN0ID0gTkVUV09SS0lEOwkvKiBOZWVkIHRvIHN3YXAgdG8gZ2V0IGluCisJCQkJCQkgICBjb3JyZWN0IG9yZGVyICovCiAJcHNldWRvLmJsay5wb3J0c3JjID0gRFNQQUlSSUQ7CiAJcHNldWRvLmJsay5zaF9zdHJfaWQgPSAwOwogCXBzZXVkby5ibGsuY29udHJvbCA9IDA7CkBAIC0xODQzLDcgKzE3NDYsOCBAQAogewogCWZ0MTAwMF9yZXNldF9jYXJkKGRldik7CiAKLQkvKiBzY2hlZHVsZSBmdDEwMDBfaGJjaGsgdG8gcGVyZm9ybSBwZXJpb2RpYyBoZWFydGJlYXQgY2hlY2tzIG9uIERTUCBhbmQgQVNJQyAqLworCS8qIHNjaGVkdWxlIGZ0MTAwMF9oYmNoayB0byBwZXJmb3JtIHBlcmlvZGljIGhlYXJ0YmVhdCBjaGVja3Mgb24gRFNQCisJICogYW5kIEFTSUMgKi8KIAlpbml0X3RpbWVyKCZwb2xsX3RpbWVyKTsKIAlwb2xsX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgKDIgKiBIWik7CiAJcG9sbF90aW1lci5kYXRhID0gKHVfbG9uZylkZXY7CkBAIC0xOTI4LDcgKzE4MzIsOCBAQAogCS8qIFJlYWQgaW50ZXJydXB0IHR5cGUgKi8KIAlpbnR0eXBlID0gZnQxMDAwX3JlYWRfcmVnKGRldiwgRlQxMDAwX1JFR19TVVBfSVNSKTsKIAotCS8qIE1ha2Ugc3VyZSB3ZSBwcm9jZXNzIGFsbCBpbnRlcnJ1cHQgYmVmb3JlIGxlYXZpbmcgdGhlIElTUiBkdWUgdG8gdGhlIGVkZ2UgdHJpZ2dlciBpbnRlcnJ1cHQgdHlwZSAqLworCS8qIE1ha2Ugc3VyZSB3ZSBwcm9jZXNzIGFsbCBpbnRlcnJ1cHQgYmVmb3JlIGxlYXZpbmcgdGhlIElTUiBkdWUgdG8gdGhlCisJICogZWRnZSB0cmlnZ2VyIGludGVycnVwdCB0eXBlICovCiAJd2hpbGUgKGludHR5cGUpIHsKIAkJaWYgKGludHR5cGUgJiBJU1JfRE9PUkJFTExfUEVORCkKIAkJCWZ0MTAwMF9wYXJzZV9kcHJhbV9tc2coZGV2KTsKQEAgLTE5MzgsMjEgKzE4NDMsMTggQEAKIAogCQkJY250ID0gMDsKIAkJCWRvIHsKLQkJCQkvKiBDaGVjayBpZiB3ZSBoYXZlIHBhY2tldHMgaW4gdGhlIERvd25saW5rIEZJRk8gKi8KKwkJCQkvKiBDaGVjayBpZiB3ZSBoYXZlIHBhY2tldHMgaW4gdGhlIERvd25saW5rCisJCQkJICogRklGTyAqLwogCQkJCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKLQkJCQkJdGVtcHdvcmQgPQotCQkJCQkJZnQxMDAwX3JlYWRfcmVnKGRldiwKLQkJCQkJCQkJRlQxMDAwX1JFR19ERklGT19TVEFUKTsKKwkJCQkJdGVtcHdvcmQgPSBmdDEwMDBfcmVhZF9yZWcoZGV2LAorCQkJCQkJCUZUMTAwMF9SRUdfREZJRk9fU1RBVCk7CiAJCQkJfSBlbHNlIHsKLQkJCQkJdGVtcHdvcmQgPQotCQkJCQkJZnQxMDAwX3JlYWRfcmVnKGRldiwKLQkJCQkJCQkJRlQxMDAwX1JFR19NQUdfREZTUik7CisJCQkJCXRlbXB3b3JkID0gZnQxMDAwX3JlYWRfcmVnKGRldiwKKwkJCQkJCQlGVDEwMDBfUkVHX01BR19ERlNSKTsKIAkJCQl9Ci0JCQkJaWYgKHRlbXB3b3JkICYgMHgxZikgewotCQkJCQlmdDEwMDBfY29weV91cF9wa3QoZGV2KTsKLQkJCQl9IGVsc2UgeworCQkJCWlmICghKHRlbXB3b3JkICYgMHgxZikpCiAJCQkJCWJyZWFrOwotCQkJCX0KKwkJCQlmdDEwMDBfY29weV91cF9wa3QoZGV2KTsKIAkJCQljbnQrKzsKIAkJCX0gd2hpbGUgKGNudCA8IE1BWF9SQ1ZfTE9PUCk7CiAKQEAgLTE5NzUsNiArMTg3Nyw3IEBACiB7CiAJc3RydWN0IGZ0MTAwMF9pbmZvICppbmZvID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcHJvdl9yZWNvcmQgKnB0cjsKKwlzdHJ1Y3QgcHJvdl9yZWNvcmQgKnRtcDsKIAkvKiBpbnQgY250OyAqLwogCiAJaW5mby0+Q2FyZFJlYWR5ID0gMDsKQEAgLTE5ODMsOCArMTg4Niw3IEBACiAJZnQxMDAwX2Rpc2FibGVfaW50ZXJydXB0cyhkZXYpOwogCiAJLyogTWFrZSBzdXJlIHdlIGZyZWUgYW55IG1lbW9yeSByZXNlcnZlIGZvciBwcm92aXNpb25pbmcgKi8KLQl3aGlsZSAobGlzdF9lbXB0eSgmaW5mby0+cHJvdl9saXN0KSA9PSAwKSB7Ci0JCXB0ciA9IGxpc3RfZW50cnkoaW5mby0+cHJvdl9saXN0Lm5leHQsIHN0cnVjdCBwcm92X3JlY29yZCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB0ciwgdG1wLCAmaW5mby0+cHJvdl9saXN0LCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZwdHItPmxpc3QpOwogCQlrZnJlZShwdHItPnBwcm92X2RhdGEpOwogCQlrZnJlZShwdHIpOwpAQCAtMjAwOCw2ICsxOTEwLDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewogCXN0cnVjdCBmdDEwMDBfaW5mbyAqZnRfaW5mbzsKKwogCWZ0X2luZm8gPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJc3RybGNweShpbmZvLT5kcml2ZXIsICJmdDEwMDAiLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CkBAIC0yMDM4LDggKzE5NDEsNyBAQAogCXN0cnVjdCBmdDEwMDBfcGNtY2lhICpwY21jaWE7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZnQxMDAwb3BzID0JCS8qIFNsYXZpdXMgMjEuMTAuMjAwOSBkdWUgdG8ga2VybmVsIGNoYW5nZXMgKi8KLQkJeworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgZnQxMDAwb3BzID0gewogCQkJLm5kb19vcGVuID0gJmZ0MTAwMF9vcGVuLAogCQkJLm5kb19zdG9wID0gJmZ0MTAwMF9jbG9zZSwKIAkJCS5uZG9fc3RhcnRfeG1pdCA9ICZmdDEwMDBfc3RhcnRfeG1pdCwKQEAgLTIxMDIsNyArMjAwNCw3IEBACiAJLyogZGV2LT5vcGVuID0gJmZ0MTAwMF9vcGVuOyAqLwogCS8qIGRldi0+c3RvcCA9ICZmdDEwMDBfY2xvc2U7ICovCiAKLQlkZXYtPm5ldGRldl9vcHMgPSAmZnQxMDAwb3BzOwkJLyogU2xhdml1cyAyMS4xMC4yMDA5IGR1ZSB0byBrZXJuZWwgY2hhbmdlcyAqLworCWRldi0+bmV0ZGV2X29wcyA9ICZmdDEwMDBvcHM7CiAKIAlwcl9kZWJ1ZygiZGV2aWNlIG5hbWUgPSAlc1xuIiwgZGV2LT5uYW1lKTsKIApAQCAtMjExMyw3ICsyMDE1LDggQEAKIAkJZ290byBlcnJfZGV2OwogCX0KIAotCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZnQxMDAwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwgZGV2KSkgeworCWlmIChyZXF1ZXN0X2lycShkZXYtPmlycSwgZnQxMDAwX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIGRldi0+bmFtZSwKKwkJCWRldikpIHsKIAkJbmV0ZGV2X2VycihkZXYsICJDb3VsZCBub3QgcmVxdWVzdF9pcnFcbiIpOwogCQlnb3RvIGVycl9kZXY7CiAJfQpAQCAtMjEyMyw3ICsyMDI2LDcgQEAKIAkJZ290byBlcnJfaXJxOwogCX0KIAotCWlmIChyZWdpc3Rlcl9uZXRkZXYoZGV2KSAhPSAwKSB7CisJaWYgKHJlZ2lzdGVyX25ldGRldihkZXYpKSB7CiAJCXByX2RlYnVnKCJDb3VsZCBub3QgcmVnaXN0ZXIgbmV0ZGV2XG4iKTsKIAkJZ290byBlcnJfcmVnOwogCX0KQEAgLTIxMzEsMTMgKzIwMzQsMTUgQEAKIAlpbmZvLT5Bc2ljSUQgPSBmdDEwMDBfcmVhZF9yZWcoZGV2LCBGVDEwMDBfUkVHX0FTSUNfSUQpOwogCWlmIChpbmZvLT5Bc2ljSUQgPT0gRUxFQ1RSQUJVWlpfSUQpIHsKIAkJcHJfZGVidWcoIkVMRUNUUkFCVVpaIEFTSUNcbiIpOwotCQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksICJmdDEwMDAuaW1nIiwgJmxpbmstPmRldikgIT0gMCkgeworCQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksICJmdDEwMDAuaW1nIiwKKwkJCQkgICAgICZsaW5rLT5kZXYpICE9IDApIHsKIAkJCXByX2luZm8oIkNvdWxkIG5vdCBvcGVuIGZ0MTAwMC5pbWdcbiIpOwogCQkJZ290byBlcnJfdW5yZWc7CiAJCX0KIAl9IGVsc2UgewogCQlwcl9kZWJ1ZygiTUFHTkVNSVRFIEFTSUNcbiIpOwotCQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksICJmdDIwMDAuaW1nIiwgJmxpbmstPmRldikgIT0gMCkgeworCQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksICJmdDIwMDAuaW1nIiwKKwkJCQkgICAgICZsaW5rLT5kZXYpICE9IDApIHsKIAkJCXByX2luZm8oIkNvdWxkIG5vdCBvcGVuIGZ0MjAwMC5pbWdcbiIpOwogCQkJZ290byBlcnJfdW5yZWc7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZGVidWcuYwppbmRleCBjOGQyNzgyLi4yZDc1OGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2RlYnVnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kZWJ1Zy5jCkBAIC0xOTAsNyArMTkwLDcgQEAKIAl0bXAtPmRlbnQgPSBkaXI7CiAJdG1wLT5maWxlID0gZmlsZTsKIAl0bXAtPmludF9udW1iZXIgPSBkZXYtPkNhcmROdW1iZXI7Ci0JbGlzdF9hZGQoJih0bXAtPmxpc3QpLCAmKGRldi0+bm9kZXMubGlzdCkpOworCWxpc3RfYWRkKCZ0bXAtPmxpc3QsICZkZXYtPm5vZGVzLmxpc3QpOwogCiAJcHJfZGVidWcoInJlZ2lzdGVyZWQgZGVidWdmcyBkaXJlY3RvcnkgXCIlc1wiXG4iLCBkZXYtPkRldmljZU5hbWUpOwogCkBAIC0zMDEsNyArMzAxLDcgQEAKIAlzdHJ1Y3QgZnQxMDAwX3VzYiAqZGV2ID0gKHN0cnVjdCBmdDEwMDBfdXNiICopaW5vZGUtPmlfcHJpdmF0ZTsKIAlpbnQgaSwgbnVtOwogCi0JbnVtID0gKE1JTk9SKGlub2RlLT5pX3JkZXYpICYgMHhmKTsKKwludW0gPSBNSU5PUihpbm9kZS0+aV9yZGV2KSAmIDB4ZjsKIAlwcl9kZWJ1ZygibWlub3IgbnVtYmVyPSVkXG4iLCBudW0pOwogCiAJaW5mbyA9IGZpbGUtPnByaXZhdGVfZGF0YSA9IG5ldGRldl9wcml2KGRldi0+bmV0KTsKQEAgLTMxNyw5ICszMTcsOCBAQAogCiAJLyogU2VhcmNoIGZvciBhdmFpbGFibGUgYXBwbGljYXRpb24gaW5mbyBibG9jayAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0FQUDsgaSsrKSB7Ci0JCWlmICgoZGV2LT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09IE5VTEwpKSB7CisJCWlmICgoZGV2LT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09IE5VTEwpKQogCQkJYnJlYWs7Ci0JCX0KIAl9CiAKIAkvKiBGYWlsIGR1ZSB0byBsYWNrIG9mIGFwcGxpY2F0aW9uIGluZm8gYmxvY2sgKi8KQEAgLTQ3OCwxNCArNDc3LDE0IEBACiAJCS8qIENvbm5lY3QgTWVzc2FnZSAqLwogCQlwcl9kZWJ1ZygiSU9DVExfRlQxMDAwX0NPTk5FQ1RcbiIpOwogCQlDb25uZWN0aW9uTXNnWzc5XSA9IDB4ZmM7Ci0JCXJlc3VsdCA9IGNhcmRfc2VuZF9jb21tYW5kKGZ0MTAwMGRldiwgKHVuc2lnbmVkIHNob3J0ICopQ29ubmVjdGlvbk1zZywgMHg0Yyk7CisJCXJlc3VsdCA9IGNhcmRfc2VuZF9jb21tYW5kKGZ0MTAwMGRldiwgQ29ubmVjdGlvbk1zZywgMHg0Yyk7CiAKIAkJYnJlYWs7CiAJY2FzZSBJT0NUTF9ESVNDT05ORUNUOgogCQkvKiBEaXNjb25uZWN0IE1lc3NhZ2UgKi8KIAkJcHJfZGVidWcoIklPQ1RMX0ZUMTAwMF9ESVNDT05ORUNUXG4iKTsKIAkJQ29ubmVjdGlvbk1zZ1s3OV0gPSAweGZkOwotCQlyZXN1bHQgPSBjYXJkX3NlbmRfY29tbWFuZChmdDEwMDBkZXYsICh1bnNpZ25lZCBzaG9ydCAqKUNvbm5lY3Rpb25Nc2csIDB4NGMpOworCQlyZXN1bHQgPSBjYXJkX3NlbmRfY29tbWFuZChmdDEwMDBkZXYsIENvbm5lY3Rpb25Nc2csIDB4NGMpOwogCQlicmVhazsKIAljYXNlIElPQ1RMX0dFVF9EU1BfU1RBVF9DTUQ6CiAJCS8qIHByX2RlYnVnKCJJT0NUTF9GVDEwMDBfR0VUX0RTUF9TVEFUXG4iKTsgKi8KQEAgLTU0NSw3ICs1NDQsNyBAQAogCQlpZiAoZnQxMDAwZGV2LT5mUHJvdkNvbXBsZXRlID09IDApCiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAotCQlmdDEwMDBkZXYtPmZBcHBNc2dQZW5kID0gMTsKKwkJZnQxMDAwZGV2LT5mQXBwTXNnUGVuZCA9IHRydWU7CiAKIAkJaWYgKGluZm8tPkNhcmRSZWFkeSkgewogCkBAIC01NzUsOSArNTc0LDggQEAKIAkJCX0gZWxzZSB7CiAJCQkJLyogQ2hlY2sgaWYgdGhpcyBtZXNzYWdlIGNhbWUgZnJvbSBhIHJlZ2lzdGVyZWQgYXBwbGljYXRpb24gKi8KIAkJCQlmb3IgKGkgPSAwOyBpIDwgTUFYX05VTV9BUFA7IGkrKykgewotCQkJCQlpZiAoZnQxMDAwZGV2LT5hcHBfaW5mb1tpXS5maWxlb2JqZWN0ID09ICZmaWxlLT5mX293bmVyKSB7CisJCQkJCWlmIChmdDEwMDBkZXYtPmFwcF9pbmZvW2ldLmZpbGVvYmplY3QgPT0gJmZpbGUtPmZfb3duZXIpCiAJCQkJCQlicmVhazsKLQkJCQkJfQogCQkJCX0KIAkJCQlpZiAoaSA9PSBNQVhfTlVNX0FQUCkgewogCQkJCQlwcl9kZWJ1ZygiTm8gbWF0Y2hpbmcgYXBwbGljYXRpb24gZmlsZW9iamVjdFxuIik7CkBAIC02MjksOSArNjI3LDggQEAKIAkJCQkJCXBtc2cgPSAodTE2ICopJmRwcmFtX2RhdGEtPnBzZXVkb2hkcjsKIAkJCQkJCXBwc2V1ZG9faGRyID0gKHN0cnVjdCBwc2V1ZG9faGRyICopcG1zZzsKIAkJCQkJCXRvdGFsX2xlbiA9IG1zZ3N6KzI7Ci0JCQkJCQlpZiAodG90YWxfbGVuICYgMHgxKSB7CisJCQkJCQlpZiAodG90YWxfbGVuICYgMHgxKQogCQkJCQkJCXRvdGFsX2xlbisrOwotCQkJCQkJfQogCiAJCQkJCQkvKiBJbnNlcnQgc2xvdyBxdWV1ZSBzZXF1ZW5jZSBudW1iZXIgKi8KIAkJCQkJCXBwc2V1ZG9faGRyLT5zZXFfbnVtID0gaW5mby0+c3F1ZXNlcW51bSsrOwpAQCAtNjQ1LDcgKzY0Miw3IEBACiAJCQkJCQl9CiAJCQkJCQlwbXNnKys7CiAJCQkJCQlwcHNldWRvX2hkciA9IChzdHJ1Y3QgcHNldWRvX2hkciAqKXBtc2c7Ci0JCQkJCQlyZXN1bHQgPSBjYXJkX3NlbmRfY29tbWFuZChmdDEwMDBkZXYsICh1bnNpZ25lZCBzaG9ydCAqKWRwcmFtX2RhdGEsIHRvdGFsX2xlbisyKTsKKwkJCQkJCXJlc3VsdCA9IGNhcmRfc2VuZF9jb21tYW5kKGZ0MTAwMGRldiwgZHByYW1fZGF0YSwgdG90YWxfbGVuKzIpOwogCiAKIAkJCQkJCWZ0MTAwMGRldi0+YXBwX2luZm9bYXBwX2luZGV4XS5uVHhNc2crKzsKQEAgLTcyMiw3ICs3MTksNyBAQAogCQlyZXN1bHQgPSAtRU5PVFRZOwogCQlicmVhazsKIAl9Ci0JZnQxMDAwZGV2LT5mQXBwTXNnUGVuZCA9IDA7CisJZnQxMDAwZGV2LT5mQXBwTXNnUGVuZCA9IGZhbHNlOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTc0NSw2ICs3NDIsNyBAQAogCXN0cnVjdCBmdDEwMDBfdXNiICpmdDEwMDBkZXY7CiAJaW50IGk7CiAJc3RydWN0IGRwcmFtX2JsayAqcGRwcmFtX2JsazsKKwlzdHJ1Y3QgZHByYW1fYmxrICp0bXA7CiAKIAlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW5mbyA9IG5ldGRldl9wcml2KGRldik7CkBAIC03NjYsOSArNzY0LDggQEAKIAlpZiAoaSA9PSBNQVhfTlVNX0FQUCkKIAkJcmV0dXJuIDA7CiAKLQl3aGlsZSAobGlzdF9lbXB0eSgmZnQxMDAwZGV2LT5hcHBfaW5mb1tpXS5hcHBfc3FsaXN0KSA9PSAwKSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBkcHJhbV9ibGssIHRtcCwgJmZ0MTAwMGRldi0+YXBwX2luZm9baV0uYXBwX3NxbGlzdCwgbGlzdCkgewogCQlwcl9kZWJ1ZygiUmVtb3ZlIGFuZCBmcmVlIG1lbW9yeSBxdWV1ZSB1cCBvbiBzbG93IHF1ZXVlXG4iKTsKLQkJcGRwcmFtX2JsayA9IGxpc3RfZW50cnkoZnQxMDAwZGV2LT5hcHBfaW5mb1tpXS5hcHBfc3FsaXN0Lm5leHQsIHN0cnVjdCBkcHJhbV9ibGssIGxpc3QpOwogCQlsaXN0X2RlbCgmcGRwcmFtX2Jsay0+bGlzdCk7CiAJCWZ0MTAwMF9mcmVlX2J1ZmZlcihwZHByYW1fYmxrLCAmZnJlZXJjdnBvb2wpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZG93bmxvYWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZG93bmxvYWQuYwppbmRleCBlODEyNjMyNS4uNWRlZjM0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9kb3dubG9hZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfZG93bmxvYWQuYwpAQCAtMjMwLDcgKzIzMCw3IEBACiAJd2hpbGUgKGxvb3BjbnQgPCAxMDApIHsKIAkJaWYgKGZ0MTAwMGRldi0+dXNiYm9vdCA9PSAyKSB7CiAJCQlzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTMyKGZ0MTAwMGRldiwgMCwKLQkJCQkJCSAgICAgKHU4ICopJihmdDEwMDBkZXYtPnRlbXBidWZbMF0pLCA2NCk7CisJCQkJCQkgICAgICh1OCAqKSZmdDEwMDBkZXYtPnRlbXBidWZbMF0sIDY0KTsKIAkJCWZvciAodGVtcCA9IDA7IHRlbXAgPCAxNjsgdGVtcCsrKSB7CiAJCQkJcHJfZGVidWcoInRlbXBidWYgJWQgPSAweCV4XG4iLAogCQkJCQkgdGVtcCwgZnQxMDAwZGV2LT50ZW1wYnVmW3RlbXBdKTsKQEAgLTM2OCw4ICszNjgsOCBAQAogCXUxNiAgIGNoa3N1bTsKIAogCi0JY2hrc3VtID0gKCgoKCgodXNQdHJbMF0gXiB1c1B0clsxXSkgXiB1c1B0clsyXSkgXiB1c1B0clszXSkgXgotCQkgICAgdXNQdHJbNF0pIF4gdXNQdHJbNV0pIF4gdXNQdHJbNl0pOworCWNoa3N1bSA9ICgoKCgodXNQdHJbMF0gXiB1c1B0clsxXSkgXiB1c1B0clsyXSkgXiB1c1B0clszXSkgXgorCQkgICAgdXNQdHJbNF0pIF4gdXNQdHJbNV0pIF4gdXNQdHJbNl07CiAKIAlyZXR1cm4gY2hrc3VtOwogfQpAQCAtNTM4LDcgKzUzOCw3IEBACiAJCQkgIHVzYl9zbmRidWxrcGlwZShmdDEwMDBkZXYtPmRldiwKIAkJCQkJICBmdDEwMDBkZXYtPmJ1bGtfb3V0X2VuZHBvaW50QWRkciksCiAJCQkgIGZ0MTAwMGRldi0+dHhfYnVmLCBieXRlX2xlbmd0aCwgdXNiX2RubGRfY29tcGxldGUsCi0JCQkgICh2b2lkICopZnQxMDAwZGV2KTsKKwkJCSAgZnQxMDAwZGV2KTsKIAogCXVzYl9zdWJtaXRfdXJiKGZ0MTAwMGRldi0+dHhfdXJiLCBHRlBfQVRPTUlDKTsKIApAQCAtNzA0LDcgKzcwNCw3IEBACiAJCQkJY2FzZSBSRVFVRVNUX0NPREVfU0VHTUVOVDoKIAkJCQkJc3RhdHVzID0gcmVxdWVzdF9jb2RlX3NlZ21lbnQoZnQxMDAwZGV2LAogCQkJCQkJCQkgICAgICAmc19maWxlLCAmY19maWxlLAotCQkJCQkJCQkgICAgICAoY29uc3QgdTggKilib290X2VuZCwKKwkJCQkJCQkJICAgICAgYm9vdF9lbmQsCiAJCQkJCQkJCSAgICAgIHRydWUpOwogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgpAQCAtNzk5LDcgKzc5OSw3IEBACiAKIAkJCQkJc3RhdHVzID0gcmVxdWVzdF9jb2RlX3NlZ21lbnQoZnQxMDAwZGV2LAogCQkJCQkJCQkgICAgICAmc19maWxlLCAmY19maWxlLAotCQkJCQkJCQkgICAgICAoY29uc3QgdTggKiljb2RlX2VuZCwKKwkJCQkJCQkJICAgICAgY29kZV9lbmQsCiAJCQkJCQkJCSAgICAgIGZhbHNlKTsKIAogCQkJCQlicmVhazsKQEAgLTk3MSwxMSArOTcxLDExIEBACiAKIAkJCQkvKiBHZXQgYnVmZmVyIGZvciBwcm92aXNpb25pbmcgZGF0YSAqLwogCQkJCXBidWZmZXIgPQotCQkJCQlrbWFsbG9jKChwc2V1ZG9faGVhZGVyX2xlbiArCi0JCQkJCQkgc2l6ZW9mKHN0cnVjdCBwc2V1ZG9faGRyKSksCisJCQkJCWttYWxsb2MocHNldWRvX2hlYWRlcl9sZW4gKworCQkJCQkJIHNpemVvZihzdHJ1Y3QgcHNldWRvX2hkciksCiAJCQkJCQlHRlBfQVRPTUlDKTsKIAkJCQlpZiAocGJ1ZmZlcikgewotCQkJCQltZW1jcHkocGJ1ZmZlciwgKHZvaWQgKiljX2ZpbGUsCisJCQkJCW1lbWNweShwYnVmZmVyLCBjX2ZpbGUsCiAJCQkJCSAgICAgICAodTMyKSAocHNldWRvX2hlYWRlcl9sZW4gKwogCQkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdAogCQkJCQkJCSAgICAgcHNldWRvX2hkcikpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfaHcuYwppbmRleCBmMGFjNDM4Li5lNmZiMDY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX2h3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF9ody5jCkBAIC0zMzksNyArMzM5LDcgQEAKIAljb21tYW5kYnVmID0ga21hbGxvYyhzaXplICsgMiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb21tYW5kYnVmKQogCQlyZXR1cm4gLUVOT01FTTsKLQltZW1jcHkoKHZvaWQgKiljb21tYW5kYnVmICsgMiwgKHZvaWQgKilwdGVtcGJ1ZmZlciwgc2l6ZSk7CisJbWVtY3B5KCh2b2lkICopY29tbWFuZGJ1ZiArIDIsIHB0ZW1wYnVmZmVyLCBzaXplKTsKIAogCWlmICh0ZW1wICYgMHgwMTAwKQogCQl1c2xlZXBfcmFuZ2UoOTAwLCAxMTAwKTsKQEAgLTQyOSw3ICs0MjksNyBAQAogCS8qIExldCdzIHVzZSB0aGUgcmVnaXN0ZXIgcHJvdmlkZWQgYnkgdGhlIE1hZ25lbWl0ZSBBU0lDIHRvIHJlc2V0IHRoZQogCSAqIEFTSUMgYW5kIERTUC4KIAkgKi8KLQlmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoZnQxMDAwZGV2LCAoRFNQX1JFU0VUX0JJVCB8IEFTSUNfUkVTRVRfQklUKSwKKwlmdDEwMDBfd3JpdGVfcmVnaXN0ZXIoZnQxMDAwZGV2LCBEU1BfUkVTRVRfQklUIHwgQVNJQ19SRVNFVF9CSVQsCiAJCQkgICAgICBGVDEwMDBfUkVHX1JFU0VUKTsKIAogCW1kZWxheSgxKTsKQEAgLTQ1MSwxNiArNDUxLDE1IEBACiAJc3RydWN0IGZ0MTAwMF91c2IgKmZ0MTAwMGRldiA9IGluZm8tPnByaXY7CiAJdTE2IHRlbXB3b3JkOwogCXN0cnVjdCBwcm92X3JlY29yZCAqcHRyOworCXN0cnVjdCBwcm92X3JlY29yZCAqdG1wOwogCiAJZnQxMDAwZGV2LT5mQ29uZFJlc2V0UGVuZCA9IHRydWU7CiAJaW5mby0+Q2FyZFJlYWR5ID0gMDsKIAlmdDEwMDBkZXYtPmZQcm92Q29tcGxldGUgPSBmYWxzZTsKIAogCS8qIE1ha2Ugc3VyZSB3ZSBmcmVlIGFueSBtZW1vcnkgcmVzZXJ2ZSBmb3IgcHJvdmlzaW9uaW5nICovCi0Jd2hpbGUgKGxpc3RfZW1wdHkoJmluZm8tPnByb3ZfbGlzdCkgPT0gMCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwdHIsIHRtcCwgJmluZm8tPnByb3ZfbGlzdCwgbGlzdCkgewogCQlwcl9kZWJ1ZygiZGVsZXRpbmcgcHJvdmlzaW9uaW5nIHJlY29yZFxuIik7Ci0JCXB0ciA9Ci0JCQlsaXN0X2VudHJ5KGluZm8tPnByb3ZfbGlzdC5uZXh0LCBzdHJ1Y3QgcHJvdl9yZWNvcmQsIGxpc3QpOwogCQlsaXN0X2RlbCgmcHRyLT5saXN0KTsKIAkJa2ZyZWUocHRyLT5wcHJvdl9kYXRhKTsKIAkJa2ZyZWUocHRyKTsKQEAgLTU0Miw3ICs1NDEsNyBAQAogCQloZHIucG9ydGRlc3QgXiBoZHIucG9ydHNyYyBeIGhkci5zaF9zdHJfaWQgXiBoZHIuY29udHJvbDsKIAogCW1lbWNweSgmcEZ0MTAwMERldi0+dHhfYnVmWzBdLCAmaGRyLCBzaXplb2YoaGRyKSk7Ci0JbWVtY3B5KCYocEZ0MTAwMERldi0+dHhfYnVmW3NpemVvZihzdHJ1Y3QgcHNldWRvX2hkcildKSwgcGFja2V0LCBsZW4pOworCW1lbWNweSgmcEZ0MTAwMERldi0+dHhfYnVmW3NpemVvZihzdHJ1Y3QgcHNldWRvX2hkcildLCBwYWNrZXQsIGxlbik7CiAKIAluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CiAKQEAgLTU1MSw3ICs1NTAsNyBAQAogCQkJICB1c2Jfc25kYnVsa3BpcGUocEZ0MTAwMERldi0+ZGV2LAogCQkJCQkgIHBGdDEwMDBEZXYtPmJ1bGtfb3V0X2VuZHBvaW50QWRkciksCiAJCQkgIHBGdDEwMDBEZXYtPnR4X2J1ZiwgY291bnQsCi0JCQkgIGZ0MTAwMF91c2JfdHJhbnNtaXRfY29tcGxldGUsICh2b2lkICopcEZ0MTAwMERldik7CisJCQkgIGZ0MTAwMF91c2JfdHJhbnNtaXRfY29tcGxldGUsIHBGdDEwMDBEZXYpOwogCiAJdCA9ICh1OCAqKXBGdDEwMDBEZXYtPnR4X3VyYi0+dHJhbnNmZXJfYnVmZmVyOwogCkBAIC02MDYsNyArNjA1LDcgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JZnQxMDAwX2NvcHlfZG93bl9wa3QoZGV2LCAocGRhdGEgKyBFTkVUX0hFQURFUl9TSVpFIC0gMiksCisJZnQxMDAwX2NvcHlfZG93bl9wa3QoZGV2LCBwZGF0YSArIEVORVRfSEVBREVSX1NJWkUgLSAyLAogCQkJICAgICBza2ItPmxlbiAtIEVORVRfSEVBREVSX1NJWkUgKyAyKTsKIAogZXJyOgpAQCAtMTU1OCwxOSArMTU1NywxOSBAQAogCQkJCS8qIFJlc2V0IEFTSUMgYW5kIERTUCAqLwogCQkJCXN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LAogCQkJCQkJCSAgICAgRlQxMDAwX01BR19EU1BfVElNRVIwLAotCQkJCQkJCSAgICAgKHU4ICopJihpbmZvLT5EU1BfVElNRVswXSksCisJCQkJCQkJICAgICAodTggKikmaW5mby0+RFNQX1RJTUVbMF0sCiAJCQkJCQkJICAgICBGVDEwMDBfTUFHX0RTUF9USU1FUjBfSU5EWCk7CiAJCQkJc3RhdHVzID0gZnQxMDAwX3JlYWRfZHByYW0xNihkZXYsCiAJCQkJCQkJICAgICBGVDEwMDBfTUFHX0RTUF9USU1FUjEsCi0JCQkJCQkJICAgICAodTggKikmKGluZm8tPkRTUF9USU1FWzFdKSwKKwkJCQkJCQkgICAgICh1OCAqKSZpbmZvLT5EU1BfVElNRVsxXSwKIAkJCQkJCQkgICAgIEZUMTAwMF9NQUdfRFNQX1RJTUVSMV9JTkRYKTsKIAkJCQlzdGF0dXMgPSBmdDEwMDBfcmVhZF9kcHJhbTE2KGRldiwKIAkJCQkJCQkgICAgIEZUMTAwMF9NQUdfRFNQX1RJTUVSMiwKLQkJCQkJCQkgICAgICh1OCAqKSYoaW5mby0+RFNQX1RJTUVbMl0pLAorCQkJCQkJCSAgICAgKHU4ICopJmluZm8tPkRTUF9USU1FWzJdLAogCQkJCQkJCSAgICAgRlQxMDAwX01BR19EU1BfVElNRVIyX0lORFgpOwogCQkJCXN0YXR1cyA9IGZ0MTAwMF9yZWFkX2RwcmFtMTYoZGV2LAogCQkJCQkJCSAgICAgRlQxMDAwX01BR19EU1BfVElNRVIzLAotCQkJCQkJCSAgICAgKHU4ICopJihpbmZvLT5EU1BfVElNRVszXSksCisJCQkJCQkJICAgICAodTggKikmaW5mby0+RFNQX1RJTUVbM10sCiAJCQkJCQkJICAgICBGVDEwMDBfTUFHX0RTUF9USU1FUjNfSU5EWCk7CiAJCQkJaW5mby0+Q2FyZFJlYWR5ID0gMDsKIAkJCQlpbmZvLT5EcnZFcnJOdW0gPSBEU1BfQ09ORFJFU0VUX0lORk87CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL2Z0MTAwMC9mdDEwMDAtdXNiL2Z0MTAwMF91c2IuYwppbmRleCBhNmI1NWY0Li4zYjMwM2I2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZnQxMDAwL2Z0MTAwMC11c2IvZnQxMDAwX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9mdDEwMDAvZnQxMDAwLXVzYi9mdDEwMDBfdXNiLmMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiAJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZHNwX2Z3LCAiZnQzMDAwLmltZyIsICZkZXYtPmRldik7CiAJaWYgKHJldCA8IDApIHsKLQkJcHJfZXJyKCJFcnJvciByZXF1ZXN0X2Zpcm13YXJlKClcbiIpOworCQlkZXZfZXJyKGludGVyZmFjZS0+dXNiX2RldiwgIkVycm9yIHJlcXVlc3RfZmlybXdhcmUoKVxuIik7CiAJCWdvdG8gZXJyX2Z3OwogCX0KIApAQCAtMTY0LDcgKzE2NCw4IEBACiAJcHJfZGVidWcoInBmdDEwMDBpbmZvPSVwXG4iLCBwZnQxMDAwaW5mbyk7CiAJcmV0ID0gZHNwX3JlbG9hZChmdDEwMDBkZXYpOwogCWlmIChyZXQpIHsKLQkJcHJfZXJyKCJQcm9ibGVtIHdpdGggRFNQIGltYWdlIGxvYWRpbmdcbiIpOworCQlkZXZfZXJyKGludGVyZmFjZS0+dXNiX2RldiwKKwkJCSJQcm9ibGVtIHdpdGggRFNQIGltYWdlIGxvYWRpbmdcbiIpOwogCQlnb3RvIGVycl9sb2FkOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2Z3c2VyaWFsL2Z3c2VyaWFsLmMgYi9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuYwppbmRleCA3M2RlYWUzLi5mZGIyNDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZndzZXJpYWwvZndzZXJpYWwuYwpAQCAtMTE4Niw3ICsxMTg2LDcgQEAKIHsKIAlzdHJ1Y3QgZnd0dHlfcG9ydCAqcG9ydCA9IHR0eS0+ZHJpdmVyX2RhdGE7CiAKLQlmd3R0eV9kYmcocG9ydCwgIkNSVFNDVFM6ICVkXG4iLCAoQ19DUlRTQ1RTKHR0eSkgIT0gMCkpOworCWZ3dHR5X2RiZyhwb3J0LCAiQ1JUU0NUUzogJWRcbiIsIENfQ1JUU0NUUyh0dHkpICE9IDApOwogCiAJZnd0dHlfcHJvZmlsZV9maWZvKHBvcnQsIHBvcnQtPnN0YXRzLnVudGhyb3R0bGUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbHRlLmMKaW5kZXggN2M0YTc3Yi4uYThkMmNmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX2x0ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9sdGUuYwpAQCAtODg5LDcgKzg4OSw3IEBACiAJCS8qIEFsbG9jYXRlIG5ldGRldiAqLwogCQluZXQgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBuaWMpLCBwZG5fZGV2X25hbWUsCiAJCQkJICAgTkVUX05BTUVfVU5LTk9XTiwgZXRoZXJfc2V0dXApOwotCQlpZiAobmV0ID09IE5VTEwpIHsKKwkJaWYgKCFuZXQpIHsKIAkJCXByX2VycigiYWxsb2NfbmV0ZGV2IGZhaWxlZFxuIik7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBlcnI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbXV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fbXV4LmMKaW5kZXggZDFhYjk5Ni4uODE5OWIwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX211eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV9tdXguYwpAQCAtMjcwLDcgKzI3MCw3IEBACiAKIAlpZiAodXJiLT5zdGF0dXMpIHsKIAkJaWYgKG11eF9kZXYtPnVzYl9zdGF0ZSA9PSBQTV9OT1JNQUwpCi0JCQlwcl9lcnIoIiVzOiB1cmIgc3RhdHVzIGVycm9yICVkXG4iLAorCQkJZGV2X2VycigmdXJiLT5kZXYtPmRldiwgIiVzOiB1cmIgc3RhdHVzIGVycm9yICVkXG4iLAogCQkJICAgICAgIF9fZnVuY19fLCB1cmItPnN0YXR1cyk7CiAJCXB1dF9yeF9zdHJ1Y3QocngsIHIpOwogCX0gZWxzZSB7CkBAIC0zNDIsNyArMzQyLDcgQEAKIAlzdHJ1Y3QgbXV4X3R4ICp0ID0gdXJiLT5jb250ZXh0OwogCiAJaWYgKHVyYi0+c3RhdHVzID09IC1FQ09OTlJFU0VUKSB7Ci0JCXByX2luZm8oIkNPTk5SRVNFVFxuIik7CisJCWRldl9pbmZvKCZ1cmItPmRldi0+ZGV2LCAiQ09OTlJFU0VUXG4iKTsKIAkJZnJlZV9tdXhfdHgodCk7CiAJCXJldHVybjsKIAl9CkBAIC02MDgsNyArNjA4LDcgQEAKIAlyeCA9ICZtdXhfZGV2LT5yeDsKIAogCWlmIChtdXhfZGV2LT51c2Jfc3RhdGUgIT0gUE1fTk9STUFMKSB7Ci0JCXByX2VycigidXNiIHN1c3BlbmQgLSBpbnZhbGlkIHN0YXRlXG4iKTsKKwkJZGV2X2VycihpbnRmLT51c2JfZGV2LCAidXNiIHN1c3BlbmQgLSBpbnZhbGlkIHN0YXRlXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNjM3LDcgKzYzNyw3IEBACiAJbXV4X2RldiA9IHR0eV9kZXYtPnByaXZfZGV2OwogCiAJaWYgKG11eF9kZXYtPnVzYl9zdGF0ZSAhPSBQTV9TVVNQRU5EKSB7Ci0JCXByX2VycigidXNiIHJlc3VtZSAtIGludmFsaWQgc3RhdGVcbiIpOworCQlkZXZfZXJyKGludGYtPnVzYl9kZXYsICJ1c2IgcmVzdW1lIC0gaW52YWxpZCBzdGF0ZVxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03MjR4L2dkbV91c2IuYwppbmRleCBkMmEzYjM1Li5lZDFhMTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzI0eC9nZG1fdXNiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyNHgvZ2RtX3VzYi5jCkBAIC00ODAsNyArNDgwLDcgQEAKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcngtPnRvX2hvc3RfbG9jaywgZmxhZ3MpOwogCX0gZWxzZSB7CiAJCWlmICh1cmItPnN0YXR1cyAmJiB1ZGV2LT51c2Jfc3RhdGUgPT0gUE1fTk9STUFMKQotCQkJcHJfZXJyKCIlczogdXJiIHN0YXR1cyBlcnJvciAlZFxuIiwKKwkJCWRldl9lcnIoJnVyYi0+ZGV2LT5kZXYsICIlczogdXJiIHN0YXR1cyBlcnJvciAlZFxuIiwKIAkJCSAgICAgICBfX2Z1bmNfXywgdXJiLT5zdGF0dXMpOwogCiAJCXB1dF9yeF9zdHJ1Y3QocngsIHIpOwpAQCAtNTU3LDcgKzU1Nyw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICh1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCkgewotCQlwcl9pbmZvKCJDT05OUkVTRVRcbiIpOworCQlkZXZfaW5mbygmdXJiLT5kZXYtPmRldiwgIkNPTk5SRVNFVFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTU5MCw3ICs1OTAsOCBAQAogCXJldCA9IHVzYl9zdWJtaXRfdXJiKHQtPnVyYiwgR0ZQX0FUT01JQyk7CiAKIAlpZiAocmV0KQotCQlwcl9lcnIoInVzYl9zdWJtaXRfdXJiIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWRldl9lcnIoJnVzYmRldi0+ZGV2LCAidXNiX3N1Ym1pdF91cmIgZmFpbGVkOiAlZFxuIiwKKwkJCXJldCk7CiAKIAl1c2JfbWFya19sYXN0X2J1c3kodXNiZGV2KTsKIApAQCAtODQ4LDcgKzg0OSw3IEBACiAJdWRldi0+dXNiZGV2ID0gdXNiZGV2OwogCXJldCA9IGluaXRfdXNiKHVkZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiaW5pdF91c2IgZnVuYyBmYWlsZWRcbiIpOworCQlkZXZfZXJyKGludGYtPnVzYl9kZXYsICJpbml0X3VzYiBmdW5jIGZhaWxlZFxuIik7CiAJCWdvdG8gZXJyX2luaXRfdXNiOwogCX0KIAl1ZGV2LT5pbnRmID0gaW50ZjsKQEAgLTg2Nyw3ICs4NjgsNyBAQAogCiAJcmV0ID0gcmVxdWVzdF9tYWNfYWRkcmVzcyh1ZGV2KTsKIAlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoInJlcXVlc3QgTWFjIGFkZHJlc3MgZmFpbGVkXG4iKTsKKwkJZGV2X2VycihpbnRmLT51c2JfZGV2LCAicmVxdWVzdCBNYWMgYWRkcmVzcyBmYWlsZWRcbiIpOwogCQlnb3RvIGVycl9tYWNfYWRkcmVzczsKIAl9CiAKQEAgLTkyOCw3ICs5MjksNyBAQAogCXVkZXYgPSBwaHlfZGV2LT5wcml2X2RldjsKIAlyeCA9ICZ1ZGV2LT5yeDsKIAlpZiAodWRldi0+dXNiX3N0YXRlICE9IFBNX05PUk1BTCkgewotCQlwcl9lcnIoInVzYiBzdXNwZW5kIC0gaW52YWxpZCBzdGF0ZVxuIik7CisJCWRldl9lcnIoaW50Zi0+dXNiX2RldiwgInVzYiBzdXNwZW5kIC0gaW52YWxpZCBzdGF0ZVxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTk2MSw3ICs5NjIsNyBAQAogCXJ4ID0gJnVkZXYtPnJ4OwogCiAJaWYgKHVkZXYtPnVzYl9zdGF0ZSAhPSBQTV9TVVNQRU5EKSB7Ci0JCXByX2VycigidXNiIHJlc3VtZSAtIGludmFsaWQgc3RhdGVcbiIpOworCQlkZXZfZXJyKGludGYtPnVzYl9kZXYsICJ1c2IgcmVzdW1lIC0gaW52YWxpZCBzdGF0ZVxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJdWRldi0+dXNiX3N0YXRlID0gUE1fTk9STUFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3Fvcy5jIGIvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3Fvcy5jCmluZGV4IGFmMjRjNTcuLjk2YmYyYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV9xb3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fcW9zLmMKQEAgLTU0LDggKzU0LDcgQEAKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcW9zX2ZyZWVfbGlzdC5sb2NrLCBmbGFncyk7CiAKLQllbnRyeSA9IGttYWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwotCXJldHVybiBlbnRyeTsKKwlyZXR1cm4ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiB9CiAKIHN0YXRpYyB2b2lkIGZyZWVfcW9zX2VudHJ5KHZvaWQgKmVudHJ5KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3NkaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9nZG03Mnh4L2dkbV9zZGlvLmMKaW5kZXggN2EwYTBmMi4uYTVmZDA3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3NkaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fc2Rpby5jCkBAIC0yMjMsOCArMjIzLDcgQEAKIAkJaWYgKHJldCA8IDApIHsKIAkJCWlmIChyZXQgIT0gLUVOT01FRElVTSkKIAkJCQlkZXZfZXJyKCZmdW5jLT5kZXYsCi0JCQkJCSJnZG13bXM6ICVzIGVycm9yOiByZXQgPSAlZFxuIiwKLQkJCQkJX19mdW5jX18sIHJldCk7CisJCQkJCSJnZG13bXM6ICBlcnJvcjogcmV0ID0gJWRcbiIsIHJldCk7CiAJCQlnb3RvIGVuZF9pbzsKIAkJfQogCX0KQEAgLTIzNyw4ICsyMzYsNyBAQAogCQlpZiAocmV0IDwgMCkgewogCQkJaWYgKHJldCAhPSAtRU5PTUVESVVNKQogCQkJCWRldl9lcnIoJmZ1bmMtPmRldiwKLQkJCQkJImdkbXdtczogJXMgZXJyb3I6IHJldCA9ICVkXG4iLAotCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQkJImdkbXdtczogIGVycm9yOiByZXQgPSAlZFxuIiwgcmV0KTsKIAkJCWdvdG8gZW5kX2lvOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2dkbTcyeHgvZ2RtX3dpbWF4LmMgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fd2ltYXguYwppbmRleCA5Y2FiNTRiLi42MWQxNjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fd2ltYXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvZ2RtNzJ4eC9nZG1fd2ltYXguYwpAQCAtMTI5LDExICsxMjksMTEgQEAKIAlpbnQgaWR4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGV2dF9lbnRyeSAqZTsKKwlzdHJ1Y3QgZXZ0X2VudHJ5ICp0bXA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd21fZXZlbnQuZXZ0X2xvY2ssIGZsYWdzKTsKIAotCXdoaWxlICghbGlzdF9lbXB0eSgmd21fZXZlbnQuZXZ0cSkpIHsKLQkJZSA9IGxpc3RfZW50cnkod21fZXZlbnQuZXZ0cS5uZXh0LCBzdHJ1Y3QgZXZ0X2VudHJ5LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgdG1wLCAmd21fZXZlbnQuZXZ0cSwgbGlzdCkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3bV9ldmVudC5ldnRfbG9jaywgZmxhZ3MpOwogCiAJCWlmIChzc2NhbmYoZS0+ZGV2LT5uYW1lLCAid20lZCIsICZpZHgpID09IDEpCkBAIC03NDksNyArNzQ5LDcgQEAKIAlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKCpuaWMpLCAid20lZCIsIE5FVF9OQU1FX1VOS05PV04sCiAJCQkgICBldGhlcl9zZXR1cCk7CiAKLQlpZiAoZGV2ID09IE5VTEwpIHsKKwlpZiAoIWRldikgewogCQlwcl9lcnIoImFsbG9jX2V0aGVyZGV2IGZhaWxlZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9nb2xkZmlzaC9nb2xkZmlzaF9hdWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL2dvbGRmaXNoL2dvbGRmaXNoX2F1ZGlvLmMKaW5kZXggZjIwMDM1OS4uNzAyYWUwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2dvbGRmaXNoL2dvbGRmaXNoX2F1ZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2dvbGRmaXNoL2dvbGRmaXNoX2F1ZGlvLmMKQEAgLTQwLDEyICs0MCwxMiBAQAogCXNwaW5sb2NrX3QgbG9jazsKIAl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwogCi0JY2hhciBfX2lvbWVtICpidWZmZXJfdmlydDsgICAgICAvKiBjb21iaW5lZCBidWZmZXIgdmlydHVhbCBhZGRyZXNzICovCisJY2hhciAqYnVmZmVyX3ZpcnQ7CQkvKiBjb21iaW5lZCBidWZmZXIgdmlydHVhbCBhZGRyZXNzICovCiAJdW5zaWduZWQgbG9uZyBidWZmZXJfcGh5czsgICAgICAvKiBjb21iaW5lZCBidWZmZXIgcGh5c2ljYWwgYWRkcmVzcyAqLwogCi0JY2hhciBfX2lvbWVtICp3cml0ZV9idWZmZXIxOyAgICAvKiB3cml0ZSBidWZmZXIgMSB2aXJ0dWFsIGFkZHJlc3MgKi8KLQljaGFyIF9faW9tZW0gKndyaXRlX2J1ZmZlcjI7ICAgIC8qIHdyaXRlIGJ1ZmZlciAyIHZpcnR1YWwgYWRkcmVzcyAqLwotCWNoYXIgX19pb21lbSAqcmVhZF9idWZmZXI7ICAgICAgLyogcmVhZCBidWZmZXIgdmlydHVhbCBhZGRyZXNzICovCisJY2hhciAqd3JpdGVfYnVmZmVyMTsJCS8qIHdyaXRlIGJ1ZmZlciAxIHZpcnR1YWwgYWRkcmVzcyAqLworCWNoYXIgKndyaXRlX2J1ZmZlcjI7CQkvKiB3cml0ZSBidWZmZXIgMiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwljaGFyICpyZWFkX2J1ZmZlcjsJCS8qIHJlYWQgYnVmZmVyIHZpcnR1YWwgYWRkcmVzcyAqLwogCWludCBidWZmZXJfc3RhdHVzOwogCWludCByZWFkX3N1cHBvcnRlZDsgICAgICAgICAvKiB0cnVlIGlmIHdlIGhhdmUgYXVkaW8gaW5wdXQgc3VwcG9ydCAqLwogfTsKQEAgLTEyNSw4ICsxMjUsOCBAQAogCQlsZW5ndGggPSAoY291bnQgPiBSRUFEX0JVRkZFUl9TSVpFID8gUkVBRF9CVUZGRVJfU0laRSA6IGNvdW50KTsKIAkJQVVESU9fV1JJVEUoZGF0YSwgQVVESU9fU1RBUlRfUkVBRCwgbGVuZ3RoKTsKIAotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGF0YS0+d2FpdCwgKGRhdGEtPmJ1ZmZlcl9zdGF0dXMgJgotCQkJCQkgQVVESU9fSU5UX1JFQURfQlVGRkVSX0ZVTEwpKTsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRhdGEtPndhaXQsIGRhdGEtPmJ1ZmZlcl9zdGF0dXMgJgorCQkJCQkgQVVESU9fSU5UX1JFQURfQlVGRkVSX0ZVTEwpOwogCiAJCWxlbmd0aCA9IEFVRElPX1JFQUQoZGF0YSwgQVVESU9fUkVBRF9CVUZGRVJfQVZBSUxBQkxFKTsKIApAQCAtMTQ3LDE2ICsxNDcsMTYgQEAKIAlzdHJ1Y3QgZ29sZGZpc2hfYXVkaW8gKmRhdGEgPSBmcC0+cHJpdmF0ZV9kYXRhOwogCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwogCXNzaXplX3QgcmVzdWx0ID0gMDsKLQljaGFyIF9faW9tZW0gKmtidWY7CisJY2hhciAqa2J1ZjsKIAogCXdoaWxlIChjb3VudCA+IDApIHsKIAkJc3NpemVfdCBjb3B5ID0gY291bnQ7CiAKIAkJaWYgKGNvcHkgPiBXUklURV9CVUZGRVJfU0laRSkKIAkJCWNvcHkgPSBXUklURV9CVUZGRVJfU0laRTsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRhdGEtPndhaXQsIChkYXRhLT5idWZmZXJfc3RhdHVzICYKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRhdGEtPndhaXQsIGRhdGEtPmJ1ZmZlcl9zdGF0dXMgJgogCQkJCQkoQVVESU9fSU5UX1dSSVRFX0JVRkZFUl8xX0VNUFRZIHwKLQkJCQkJQVVESU9fSU5UX1dSSVRFX0JVRkZFUl8yX0VNUFRZKSkpOworCQkJCQlBVURJT19JTlRfV1JJVEVfQlVGRkVSXzJfRU1QVFkpKTsKIAogCQlpZiAoKGRhdGEtPmJ1ZmZlcl9zdGF0dXMgJiBBVURJT19JTlRfV1JJVEVfQlVGRkVSXzFfRU1QVFkpICE9IDApCiAJCQlrYnVmID0gZGF0YS0+d3JpdGVfYnVmZmVyMTsKQEAgLTI3Myw3ICsyNzMsNyBAQAogCWRtYV9hZGRyX3QgYnVmX2FkZHI7CiAKIAlkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZGF0YSksIEdGUF9LRVJORUwpOwotCWlmIChkYXRhID09IE5VTEwpCisJaWYgKCFkYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKIAlzcGluX2xvY2tfaW5pdCgmZGF0YS0+bG9jayk7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZGF0YS0+d2FpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ29sZGZpc2gvZ29sZGZpc2hfbmFuZC5jIGIvZHJpdmVycy9zdGFnaW5nL2dvbGRmaXNoL2dvbGRmaXNoX25hbmQuYwppbmRleCBkNjhmMjE2Li4yMTM4NzdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvZ29sZGZpc2gvZ29sZGZpc2hfbmFuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nb2xkZmlzaC9nb2xkZmlzaF9uYW5kLmMKQEAgLTMzMCw3ICszMzAsNyBAQAogCW10ZC0+cHJpdiA9IG5hbmQ7CiAKIAluYW1lID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIG5hbWVfbGVuICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5hbWUgPT0gTlVMTCkKKwlpZiAoIW5hbWUpCiAJCXJldHVybiAtRU5PTUVNOwogCW10ZC0+bmFtZSA9IG5hbWU7CiAKQEAgLTM4Myw3ICszODMsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgci0+c3RhcnQsIFBBR0VfU0laRSk7Ci0JaWYgKGJhc2UgPT0gTlVMTCkKKwlpZiAoIWJhc2UpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJdmVyc2lvbiA9IHJlYWRsKGJhc2UgKyBOQU5EX1ZFUlNJT04pOwpAQCAtMzk5LDcgKzM5OSw3IEBACiAKIAluYW5kID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbmFuZCkgKwogCQkJCXNpemVvZihzdHJ1Y3QgbXRkX2luZm8pICogbnVtX2RldiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5hbmQgPT0gTlVMTCkKKwlpZiAoIW5hbmQpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJbXV0ZXhfaW5pdCgmbmFuZC0+bG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvZ3NfZnBnYWJvb3QvZ3NfZnBnYWJvb3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5jCmluZGV4IDZkYTcyODUuLmEzYTEwZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9nc19mcGdhYm9vdC9nc19mcGdhYm9vdC5jCkBAIC0xNyw3ICsxNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vYnVzLW9zbS5jIGIvZHJpdmVycy9zdGFnaW5nL2kyby9idXMtb3NtLmMKaW5kZXggN2FhMDMzOS4uNDNlMzU3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2kyby9idXMtb3NtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2kyby9idXMtb3NtLmMKQEAgLTY5LDcgKzY5LDggQEAKIAlzdHJ1Y3QgaTJvX2RldmljZSAqaTJvX2RldiA9IHRvX2kyb19kZXZpY2UoZCk7CiAJaW50IHJjOwogCi0JaWYgKChyYyA9IGkyb19idXNfc2NhbihpMm9fZGV2KSkpCisJcmMgPSBpMm9fYnVzX3NjYW4oaTJvX2Rldik7CisJaWYgKHJjKQogCQlvc21fd2FybigiYnVzIHNjYW4gZmFpbGVkICVkXG4iLCByYyk7CiAKIAlyZXR1cm4gY291bnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2NvbmZpZy1vc20uYyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vY29uZmlnLW9zbS5jCmluZGV4IDUxOWY1MmYuLjQ1MDkxYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vY29uZmlnLW9zbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vY29uZmlnLW9zbS5jCkBAIC0xOSw3ICsxOSw3IEBACiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNkZWZpbmUgT1NNX05BTUUJImNvbmZpZy1vc20iCiAjZGVmaW5lIE9TTV9WRVJTSU9OCSIxLjMyMyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vZGVidWcuYwppbmRleCA3YTE2MTE0Li4xMmI3ODNiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2kyby9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vZGVidWcuYwpAQCAtNSw3ICs1LDcgQEAKIAogc3RhdGljIHZvaWQgaTJvX3JlcG9ydF91dGlsX2NtZCh1OCBjbWQpOwogc3RhdGljIHZvaWQgaTJvX3JlcG9ydF9leGVjX2NtZCh1OCBjbWQpOwotc3RhdGljIHZvaWQgaTJvX3JlcG9ydF9mYWlsX3N0YXR1cyh1OCByZXFfc3RhdHVzLCB1MzIgKiBtc2cpOworc3RhdGljIHZvaWQgaTJvX3JlcG9ydF9mYWlsX3N0YXR1cyh1OCByZXFfc3RhdHVzLCB1MzIgKm1zZyk7CiBzdGF0aWMgdm9pZCBpMm9fcmVwb3J0X2NvbW1vbl9zdGF0dXModTggcmVxX3N0YXR1cyk7CiBzdGF0aWMgdm9pZCBpMm9fcmVwb3J0X2NvbW1vbl9kc2ModTE2IGRldGFpbGVkX3N0YXR1cyk7CiAKQEAgLTIyLDcgKzIyLDcgQEAKIAl1MTYgZGV0YWlsZWRfc3RhdHVzID0gbXNnWzRdICYgMHhGRkZGOwogCiAJaWYgKGNtZCA9PSBJMk9fQ01EX1VUSUxfRVZUX1JFR0lTVEVSKQotCQlyZXR1cm47CQkvLyBObyBzdGF0dXMgaW4gdGhpcyByZXBseQorCQlyZXR1cm47CQkvKiBObyBzdGF0dXMgaW4gdGhpcyByZXBseSAqLwogCiAJcHJpbnRrKCIlcyVzOiAiLCBzZXZlcml0eSwgc3RyKTsKIApAQCAtNTQsNiArNTQsNyBAQAogI2lmZGVmIERFQlVHCiAJdTMyICptc2cgPSAodTMyICopIG07CiAJaW50IGk7CisKIAlwcmludGsoS0VSTl9JTkZPICJEdW1waW5nIEkyTyBtZXNzYWdlIHNpemUgJWQgQCAlcFxuIiwKIAkgICAgICAgbXNnWzBdID4+IDE2ICYgMHhmZmZmLCBtc2cpOwogCWZvciAoaSA9IDA7IGkgPCAoKG1zZ1swXSA+PiAxNikgJiAweGZmZmYpOyBpKyspCkBAIC02Niw3ICs2Nyw3IEBACiAgKiBGb2xsb3dpbmcgZmFpbCBzdGF0dXMgYXJlIGNvbW1vbiB0byBhbGwgY2xhc3Nlcy4KICAqIFRoZSBwcmVzZXJ2ZWQgbWVzc2FnZSBtdXN0IGJlIGhhbmRsZWQgaW4gdGhlIHJlcGx5IGhhbmRsZXIuCiAgKi8KLXN0YXRpYyB2b2lkIGkyb19yZXBvcnRfZmFpbF9zdGF0dXModTggcmVxX3N0YXR1cywgdTMyICogbXNnKQorc3RhdGljIHZvaWQgaTJvX3JlcG9ydF9mYWlsX3N0YXR1cyh1OCByZXFfc3RhdHVzLCB1MzIgKm1zZykKIHsKIAlzdGF0aWMgY2hhciAqRkFJTF9TVEFUVVNbXSA9IHsKIAkJIjB4ODAiLAkJLyogbm90IHVzZWQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vZGV2aWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2RldmljZS5jCmluZGV4IDJhZjIyNTUuLmU0NzQ5NmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vZGV2aWNlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2kyby9kZXZpY2UuYwpAQCAtNTY1LDEwICs1NjUsOCBAQAogCQlzaXplICs9IDQgLSBzaXplICUgNDsKIAogCW9wYmxrID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAob3BibGsgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgImkybzogbm8gbWVtb3J5IGZvciBxdWVyeSBidWZmZXIuXG4iKTsKKwlpZiAob3BibGsgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJb3BibGtbMF0gPSAxOwkJLyogb3BlcmF0aW9uIGNvdW50ICovCiAJb3BibGtbMV0gPSAwOwkJLyogcGFkICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2RyaXZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2kyby9kcml2ZXIuYwppbmRleCAxMTFjM2VkLi4wNjExOWJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vZHJpdmVyLmMKQEAgLTEwMiw4ICsxMDIsNyBAQAogCiAJZm9yIChpID0gMDsgaTJvX2RyaXZlcnNbaV07IGkrKykKIAkJaWYgKGkgPj0gaTJvX21heF9kcml2ZXJzKSB7Ci0JCQlvc21fZXJyKCJ0b28gbWFueSBkcml2ZXJzIHJlZ2lzdGVyZWQsIGluY3JlYXNlICIKLQkJCQkibWF4X2RyaXZlcnNcbiIpOworCQkJb3NtX2VycigidG9vIG1hbnkgZHJpdmVycyByZWdpc3RlcmVkLCBpbmNyZWFzZSBtYXhfZHJpdmVyc1xuIik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMm9fZHJpdmVyc19sb2NrLCBmbGFncyk7CiAJCQlyYyA9IC1FRkFVTFQ7CiAJCQlnb3RvIG91dDsKQEAgLTI0NCw4ICsyNDMsOCBAQAogCX0KIAogCWlmICh1bmxpa2VseSghZHJ2LT5yZXBseSkpIHsKLQkJb3NtX2RlYnVnKCIlczogUmVwbHkgdG8gZHJpdmVyICVzLCBidXQgbm8gcmVwbHkgZnVuY3Rpb24iCi0JCQkgICIgZGVmaW5lZCFcbiIsIGMtPm5hbWUsIGRydi0+bmFtZSk7CisJCW9zbV9kZWJ1ZygiJXM6IFJlcGx5IHRvIGRyaXZlciAlcywgYnV0IG5vIHJlcGx5IGZ1bmN0aW9uIGRlZmluZWQhXG4iLAorCQkJYy0+bmFtZSwgZHJ2LT5uYW1lKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2V4ZWMtb3NtLmMgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2V4ZWMtb3NtLmMKaW5kZXggMTZkODU3ZC4uZGNlMTZlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2kyby9leGVjLW9zbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vZXhlYy1vc20uYwpAQCAtNTA3LDggKzUwNyw4IEBACiAJICogdG8gYWlkIGluIGRlYnVnZ2luZy4KIAkgKgogCSAqLwotCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnNvbGljaXRlZCBtZXNzYWdlIHJlcGx5IHNlbnQgdG8gY29yZSEiCi0JICAgICAgICJNZXNzYWdlIGR1bXBlZCB0byBzeXNsb2dcbiIsIGMtPm5hbWUpOworCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBVbnNvbGljaXRlZCBtZXNzYWdlIHJlcGx5IHNlbnQgdG8gY29yZSEgTWVzc2FnZSBkdW1wZWQgdG8gc3lzbG9nXG4iLAorCQkJYy0+bmFtZSk7CiAJaTJvX2R1bXBfbWVzc2FnZShtc2cpOwogCiAJcmV0dXJuIC1FRkFVTFQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2kyb19ibG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2kyby9pMm9fYmxvY2suYwppbmRleCAwYTEzYzY0Li40MDY3NThmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTJvL2kyb19ibG9jay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vaTJvX2Jsb2NrLmMKQEAgLTg3MSwxMyArODcxLDEzIEBACiAKIAlyZXR1cm4gMDsKIAotICAgICAgY29udGV4dF9yZW1vdmU6Citjb250ZXh0X3JlbW92ZToKIAlpMm9fY250eHRfbGlzdF9yZW1vdmUoYywgcmVxKTsKIAotICAgICAgbm9wX21zZzoKK25vcF9tc2c6CiAJaTJvX21zZ19ub3AoYywgbXNnKTsKIAotICAgICAgZXhpdDoKK2V4aXQ6CiAJcmV0dXJuIHJjOwogfTsKIApAQCAtMTAwMiwxMyArMTAwMiwxMyBAQAogCiAJcmV0dXJuIGRldjsKIAotICAgICAgY2xlYW51cF9xdWV1ZToKK2NsZWFudXBfcXVldWU6CiAJcHV0X2Rpc2soZ2QpOwogCi0gICAgICBjbGVhbnVwX2RldjoKK2NsZWFudXBfZGV2OgogCWtmcmVlKGRldik7CiAKLSAgICAgIGV4aXQ6CitleGl0OgogCXJldHVybiBFUlJfUFRSKHJjKTsKIH07CiAKQEAgLTEwMjgsNyArMTAyOCw3IEBACiAJc3RydWN0IGkyb19ibG9ja19kZXZpY2UgKmkyb19ibGtfZGV2OwogCXN0cnVjdCBnZW5kaXNrICpnZDsKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcXVldWU7Ci0Jc3RhdGljIGludCB1bml0ID0gMDsKKwlzdGF0aWMgaW50IHVuaXQ7CiAJaW50IHJjOwogCXU2NCBzaXplOwogCXUzMiBibG9ja3NpemU7CkBAIC0xMTE1LDEwICsxMTE1LDEwIEBACiAKIAlyZXR1cm4gMDsKIAotICAgICAgY2xhaW1fcmVsZWFzZToKK2NsYWltX3JlbGVhc2U6CiAJaTJvX2RldmljZV9jbGFpbV9yZWxlYXNlKGkyb19kZXYpOwogCi0gICAgICBleGl0OgorZXhpdDoKIAlyZXR1cm4gcmM7CiB9OwogCkBAIC0xMTg3LDE2ICsxMTg3LDE2IEBACiAKIAlyZXR1cm4gMDsKIAotICAgICAgdW5yZWdpc3Rlcl9ibGtkZXY6Cit1bnJlZ2lzdGVyX2Jsa2RldjoKIAl1bnJlZ2lzdGVyX2Jsa2RldihJMk9fTUFKT1IsICJpMm9fYmxvY2siKTsKIAotICAgICAgZnJlZV9tZW1wb29sOgorZnJlZV9tZW1wb29sOgogCW1lbXBvb2xfZGVzdHJveShpMm9fYmxrX3JlcV9wb29sLnBvb2wpOwogCi0gICAgICBmcmVlX3NsYWI6CitmcmVlX3NsYWI6CiAJa21lbV9jYWNoZV9kZXN0cm95KGkyb19ibGtfcmVxX3Bvb2wuc2xhYik7CiAKLSAgICAgIGV4aXQ6CitleGl0OgogCXJldHVybiByYzsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vaTJvX2NvbmZpZy5jIGIvZHJpdmVycy9zdGFnaW5nL2kyby9pMm9fY29uZmlnLmMKaW5kZXggMDRiZDNiNi4uY2Q3Y2E1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2kyby9pMm9fY29uZmlnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2kyby9pMm9fY29uZmlnLmMKQEAgLTM0LDggKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSAiY29yZS5oIgogCkBAIC02NSw3ICs2NCw3IEBACiAJc3RydWN0IGkyb19jZmdfaW5mbyAqbmV4dDsKIH07CiBzdGF0aWMgc3RydWN0IGkyb19jZmdfaW5mbyAqb3Blbl9maWxlcyA9IE5VTEw7Ci1zdGF0aWMgdWxvbmcgaTJvX2NmZ19pbmZvX2lkID0gMDsKK3N0YXRpYyB1bG9uZyBpMm9fY2ZnX2luZm9faWQ7CiAKIHN0YXRpYyBpbnQgaTJvX2NmZ19nZXRpb3BzKHVuc2lnbmVkIGxvbmcgYXJnKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2kyby9pMm9fcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2kyby9pMm9fcHJvYy5jCmluZGV4IGFkODRmMzMuLjc4MGZlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vaTJvX3Byb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2kyb19wcm9jLmMKQEAgLTQ4LDkgKzQ4LDkgQEAKICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKIC8qIFN0cnVjdHVyZSB1c2VkIHRvIGRlZmluZSAvcHJvYyBlbnRyaWVzICovCkBAIC04NSw5ICs4NSw4IEBACiAJc3dpdGNoIChzZXJpYWxub1swXSkgewogCWNhc2UgSTJPX1NORk9STUFUX0JJTkFSWToJLyogQmluYXJ5ICovCiAJCXNlcV9wcmludGYoc2VxLCAiMHgiKTsKLQkJZm9yIChpID0gMDsgaSA8IHNlcmlhbG5vWzFdOyBpKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IHNlcmlhbG5vWzFdOyBpKyspCiAJCQlzZXFfcHJpbnRmKHNlcSwgIiUwMlgiLCBzZXJpYWxub1syICsgaV0pOwotCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBJMk9fU05GT1JNQVRfQVNDSUk6CS8qIEFTQ0lJICovCkBAIC0xMDEsOSArMTAwLDggQEAKIAkJCXNlcV9wcmludGYoc2VxLCAiJXMiLCAmc2VyaWFsbm9bMl0pOwogCQl9IGVsc2UgewogCQkJLyogcHJpbnQgY2hhcnMgZm9yIHNwZWNpZmllZCBsZW5ndGggKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBzZXJpYWxub1sxXTsgaSsrKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsbm9bMV07IGkrKykKIAkJCQlzZXFfcHJpbnRmKHNlcSwgIiVjIiwgc2VyaWFsbm9bMiArIGldKTsKLQkJCX0KIAkJfQogCQlicmVhazsKIApAQCAtMjY2LDE2ICsyNjQsMjIgQEAKIHsKIAlzd2l0Y2ggKGJsb2NrX3N0YXR1cykgewogCWNhc2UgLUVUSU1FRE9VVDoKLQkJcmV0dXJuIHNlcV9wcmludGYoc2VxLCAiVGltZW91dCByZWFkaW5nIGdyb3VwICVzLlxuIiwgZ3JvdXApOworCQlzZXFfcHJpbnRmKHNlcSwgIlRpbWVvdXQgcmVhZGluZyBncm91cCAlcy5cbiIsIGdyb3VwKTsKKwkJYnJlYWs7CiAJY2FzZSAtRU5PTUVNOgotCQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsICJObyBmcmVlIG1lbW9yeSB0byByZWFkIHRoZSB0YWJsZS5cbiIpOworCQlzZXFfcHV0cyhzZXEsICJObyBmcmVlIG1lbW9yeSB0byByZWFkIHRoZSB0YWJsZS5cbiIpOworCQlicmVhazsKIAljYXNlIC1JMk9fUEFSQU1TX1NUQVRVU19JTlZBTElEX0dST1VQX0lEOgotCQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsICJHcm91cCAlcyBub3Qgc3VwcG9ydGVkLlxuIiwgZ3JvdXApOworCQlzZXFfcHJpbnRmKHNlcSwgIkdyb3VwICVzIG5vdCBzdXBwb3J0ZWQuXG4iLCBncm91cCk7CisJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldHVybiBzZXFfcHJpbnRmKHNlcSwKLQkJCQkgICJFcnJvciByZWFkaW5nIGdyb3VwICVzLiBCbG9ja1N0YXR1cyAweCUwMlhcbiIsCi0JCQkJICBncm91cCwgLWJsb2NrX3N0YXR1cyk7CisJCXNlcV9wcmludGYoc2VxLAorCQkJICAgIkVycm9yIHJlYWRpbmcgZ3JvdXAgJXMuIEJsb2NrU3RhdHVzIDB4JTAyWFxuIiwKKwkJCSAgIGdyb3VwLCAtYmxvY2tfc3RhdHVzKTsKKwkJYnJlYWs7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjaGFyICpidXNfc3RyaW5nc1tdID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2kyby9pb3AuYyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vaW9wLmMKaW5kZXggNTIzMzRmYy4uMjNiZGJlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2kyby9pb3AuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL2lvcC5jCkBAIC0xMDQyLDcgKzEwNDIsNyBAQAogICovCiBzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmkyb19pb3BfYWxsb2Modm9pZCkKIHsKLQlzdGF0aWMgaW50IHVuaXQgPSAwOwkvKiAwIGFuZCAxIGFyZSBOVUxMIElPUCBhbmQgTG9jYWwgSG9zdCAqLworCXN0YXRpYyBpbnQgdW5pdDsJLyogMCBhbmQgMSBhcmUgTlVMTCBJT1AgYW5kIExvY2FsIEhvc3QgKi8KIAlzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CiAJY2hhciBwb29sbmFtZVszMl07CiAKQEAgLTEwOTYsNyArMTA5Niw4IEBACiB7CiAJaW50IHJjOwogCi0JaWYgKChyYyA9IGRldmljZV9hZGQoJmMtPmRldmljZSkpKSB7CisJcmMgPSBkZXZpY2VfYWRkKCZjLT5kZXZpY2UpOworCWlmIChyYykgewogCQlvc21fZXJyKCIlczogY291bGQgbm90IGFkZCBjb250cm9sbGVyXG4iLCBjLT5uYW1lKTsKIAkJZ290byBpb3BfcmVzZXQ7CiAJfQpAQCAtMTEwNSwyNCArMTEwNiwyOCBAQAogCW9zbV9pbmZvKCIlczogVGhpcyBtYXkgdGFrZSBhIGZldyBtaW51dGVzIGlmIHRoZXJlIGFyZSBtYW55IGRldmljZXNcbiIsCiAJCSBjLT5uYW1lKTsKIAotCWlmICgocmMgPSBpMm9faW9wX2FjdGl2YXRlKGMpKSkgeworCXJjID0gaTJvX2lvcF9hY3RpdmF0ZShjKTsKKwlpZiAocmMpIHsKIAkJb3NtX2VycigiJXM6IGNvdWxkIG5vdCBhY3RpdmF0ZSBjb250cm9sbGVyXG4iLCBjLT5uYW1lKTsKIAkJZ290byBkZXZpY2VfZGVsOwogCX0KIAogCW9zbV9kZWJ1ZygiJXM6IGJ1aWxkaW5nIHN5cyB0YWJsZS4uLlxuIiwgYy0+bmFtZSk7CiAKLQlpZiAoKHJjID0gaTJvX3N5c3RhYl9idWlsZCgpKSkKKwlyYyA9IGkyb19zeXN0YWJfYnVpbGQoKTsKKwlpZiAocmMpCiAJCWdvdG8gZGV2aWNlX2RlbDsKIAogCW9zbV9kZWJ1ZygiJXM6IG9ubGluZSBjb250cm9sbGVyLi4uXG4iLCBjLT5uYW1lKTsKIAotCWlmICgocmMgPSBpMm9faW9wX29ubGluZShjKSkpCisJcmMgPSBpMm9faW9wX29ubGluZShjKTsKKwlpZiAocmMpCiAJCWdvdG8gZGV2aWNlX2RlbDsKIAogCW9zbV9kZWJ1ZygiJXM6IGdldHRpbmcgTENULi4uXG4iLCBjLT5uYW1lKTsKIAotCWlmICgocmMgPSBpMm9fZXhlY19sY3RfZ2V0KGMpKSkKKwlyYyA9IGkyb19leGVjX2xjdF9nZXQoYyk7CisJaWYgKHJjKQogCQlnb3RvIGRldmljZV9kZWw7CiAKIAlsaXN0X2FkZCgmYy0+bGlzdCwgJmkyb19jb250cm9sbGVycyk7CkBAIC0xMTkyLDEzICsxMTk3LDE2IEBACiAKIAlwcmludGsoS0VSTl9JTkZPIE9TTV9ERVNDUklQVElPTiAiIHYiIE9TTV9WRVJTSU9OICJcbiIpOwogCi0JaWYgKChyYyA9IGkyb19kcml2ZXJfaW5pdCgpKSkKKwlyYyA9IGkyb19kcml2ZXJfaW5pdCgpOworCWlmIChyYykKIAkJZ290byBleGl0OwogCi0JaWYgKChyYyA9IGkyb19leGVjX2luaXQoKSkpCisJcmMgPSBpMm9fZXhlY19pbml0KCk7CisJaWYgKHJjKQogCQlnb3RvIGRyaXZlcl9leGl0OwogCi0JaWYgKChyYyA9IGkyb19wY2lfaW5pdCgpKSkKKwlyYyA9IGkyb19wY2lfaW5pdCgpOworCWlmIChyYykKIAkJZ290byBleGVjX2V4aXQ7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vbWVtb3J5LmMgYi9kcml2ZXJzL3N0YWdpbmcvaTJvL21lbW9yeS5jCmluZGV4IDhmOTUwOWQuLjc4YjcwMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9pMm8vbWVtb3J5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2kyby9tZW1vcnkuYwpAQCAtMjcwLDEwICsyNzAsOSBAQAogaW50IGkyb19wb29sX2FsbG9jKHN0cnVjdCBpMm9fcG9vbCAqcG9vbCwgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgc2l6ZV90IHNpemUsIGludCBtaW5fbnIpCiB7Ci0JcG9vbC0+bmFtZSA9IGttYWxsb2Moc3RybGVuKG5hbWUpICsgMSwgR0ZQX0tFUk5FTCk7CisJcG9vbC0+bmFtZSA9IGtzdHJkdXAobmFtZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFwb29sLT5uYW1lKQogCQlnb3RvIGV4aXQ7Ci0Jc3RyY3B5KHBvb2wtPm5hbWUsIG5hbWUpOwogCiAJcG9vbC0+c2xhYiA9CiAJICAgIGttZW1fY2FjaGVfY3JlYXRlKHBvb2wtPm5hbWUsIHNpemUsIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaTJvL3BjaS5jIGIvZHJpdmVycy9zdGFnaW5nL2kyby9wY2kuYwppbmRleCBiM2I4YTYxLi40OTgwNGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaTJvL3BjaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9pMm8vcGNpLmMKQEAgLTMyOSw3ICszMjksOCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlpZiAoKHJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldikpKSB7CisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTJvOiBjb3VsZG4ndCBlbmFibGUgZGV2aWNlICVzXG4iLAogCQkgICAgICAgcGNpX25hbWUocGRldikpOwogCQlyZXR1cm4gcmM7CkBAIC00MTAsNyArNDExLDggQEAKICNlbmRpZgogCX0KIAotCWlmICgocmMgPSBpMm9fcGNpX2FsbG9jKGMpKSkgeworCXJjID0gaTJvX3BjaV9hbGxvYyhjKTsKKwlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogRE1BIC8gSU8gYWxsb2NhdGlvbiBmb3IgSTJPIGNvbnRyb2xsZXIgIgogCQkgICAgICAgImZhaWxlZFxuIiwgYy0+bmFtZSk7CiAJCWdvdG8gZnJlZV9jb250cm9sbGVyOwpAQCAtNDIyLDcgKzQyNCw4IEBACiAJCWdvdG8gZnJlZV9wY2k7CiAJfQogCi0JaWYgKChyYyA9IGkyb19pb3BfYWRkKGMpKSkKKwlyYyA9IGkyb19pb3BfYWRkKGMpOworCWlmIChyYykKIAkJZ290byB1bmluc3RhbGw7CiAKIAlpZiAoaTk2MCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9nZW5lcmljX2J1ZmZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2dlbmVyaWNfYnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNDY0N2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2dlbmVyaWNfYnVmZmVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyogSW5kdXN0cmlhbGlvIGJ1ZmZlciB0ZXN0IGNvZGUuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEpvbmF0aGFuIENhbWVyb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBwcmltYXJpbHkgaW50ZW5kZWQgYXMgYW4gZXhhbXBsZSBhcHBsaWNhdGlvbi4KLSAqIFJlYWRzIHRoZSBjdXJyZW50IGJ1ZmZlciBzZXR1cCBmcm9tIHN5c2ZzIGFuZCBzdGFydHMgYSBzaG9ydCBjYXB0dXJlCi0gKiBmcm9tIHRoZSBzcGVjaWZpZWQgZGV2aWNlLCBwcmV0dHkgcHJpbnRpbmcgdGhlIHJlc3VsdCBhZnRlciBhcHByb3ByaWF0ZQotICogY29udmVyc2lvbi4KLSAqCi0gKiBDb21tYW5kIGxpbmUgcGFyYW1ldGVycwotICogZ2VuZXJpY19idWZmZXIgLW4gPGRldmljZV9uYW1lPiAtdCA8dHJpZ2dlcl9uYW1lPgotICogSWYgdHJpZ2dlciBuYW1lIGlzIG5vdCBzcGVjaWZpZWQgdGhlIHByb2dyYW0gYXNzdW1lcyB5b3Ugd2FudCBhIGRhdGFyZWFkeQotICogdHJpZ2dlciBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSBhbmQgZ29lcyBsb29raW5nIGZvciBpdC4KLSAqCi0gKi8KLQotI2RlZmluZSBfR05VX1NPVVJDRQotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxwb2xsLmg+Ci0jaW5jbHVkZSA8ZW5kaWFuLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlICJpaW9fdXRpbHMuaCIKLQotLyoqCi0gKiBzaXplX2Zyb21fY2hhbm5lbGFycmF5KCkgLSBjYWxjdWxhdGUgdGhlIHN0b3JhZ2Ugc2l6ZSBvZiBhIHNjYW4KLSAqIEBjaGFubmVsczoJCXRoZSBjaGFubmVsIGluZm8gYXJyYXkKLSAqIEBudW1fY2hhbm5lbHM6CW51bWJlciBvZiBjaGFubmVscwotICoKLSAqIEhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgZmlsbGluZyB0aGUgY2hhbm5lbHNbaV0ubG9jYXRpb24gdmFsdWVzIHVzZWQKLSAqIGluIHByb2Nlc3NpbmcgdGhlIGJ1ZmZlciBvdXRwdXQuCi0gKiovCi1pbnQgc2l6ZV9mcm9tX2NoYW5uZWxhcnJheShzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyAqY2hhbm5lbHMsIGludCBudW1fY2hhbm5lbHMpCi17Ci0JaW50IGJ5dGVzID0gMDsKLQlpbnQgaSA9IDA7Ci0KLQl3aGlsZSAoaSA8IG51bV9jaGFubmVscykgewotCQlpZiAoYnl0ZXMgJSBjaGFubmVsc1tpXS5ieXRlcyA9PSAwKQotCQkJY2hhbm5lbHNbaV0ubG9jYXRpb24gPSBieXRlczsKLQkJZWxzZQotCQkJY2hhbm5lbHNbaV0ubG9jYXRpb24gPSBieXRlcyAtIGJ5dGVzJWNoYW5uZWxzW2ldLmJ5dGVzCi0JCQkJKyBjaGFubmVsc1tpXS5ieXRlczsKLQkJYnl0ZXMgPSBjaGFubmVsc1tpXS5sb2NhdGlvbiArIGNoYW5uZWxzW2ldLmJ5dGVzOwotCQlpKys7Ci0JfQotCXJldHVybiBieXRlczsKLX0KLQotdm9pZCBwcmludDJieXRlKGludCBpbnB1dCwgc3RydWN0IGlpb19jaGFubmVsX2luZm8gKmluZm8pCi17Ci0JLyogRmlyc3Qgc3dhcCBpZiBpbmNvcnJlY3QgZW5kaWFuICovCi0JaWYgKGluZm8tPmJlKQotCQlpbnB1dCA9IGJlMTZ0b2goKHVpbnQxNl90KWlucHV0KTsKLQllbHNlCi0JCWlucHV0ID0gbGUxNnRvaCgodWludDE2X3QpaW5wdXQpOwotCi0JLyoKLQkgKiBTaGlmdCBiZWZvcmUgY29udmVyc2lvbiB0byBhdm9pZCBzaWduIGV4dGVuc2lvbgotCSAqIG9mIGxlZnQgYWxpZ25lZCBkYXRhCi0JICovCi0JaW5wdXQgPSBpbnB1dCA+PiBpbmZvLT5zaGlmdDsKLQlpZiAoaW5mby0+aXNfc2lnbmVkKSB7Ci0JCWludDE2X3QgdmFsID0gaW5wdXQ7Ci0KLQkJdmFsICY9ICgxIDw8IGluZm8tPmJpdHNfdXNlZCkgLSAxOwotCQl2YWwgPSAoaW50MTZfdCkodmFsIDw8ICgxNiAtIGluZm8tPmJpdHNfdXNlZCkpID4+Ci0JCQkoMTYgLSBpbmZvLT5iaXRzX3VzZWQpOwotCQlwcmludGYoIiUwNWYgIiwgKChmbG9hdCl2YWwgKyBpbmZvLT5vZmZzZXQpKmluZm8tPnNjYWxlKTsKLQl9IGVsc2UgewotCQl1aW50MTZfdCB2YWwgPSBpbnB1dDsKLQotCQl2YWwgJj0gKDEgPDwgaW5mby0+Yml0c191c2VkKSAtIDE7Ci0JCXByaW50ZigiJTA1ZiAiLCAoKGZsb2F0KXZhbCArIGluZm8tPm9mZnNldCkqaW5mby0+c2NhbGUpOwotCX0KLX0KLS8qKgotICogcHJvY2Vzc19zY2FuKCkgLSBwcmludCBvdXQgdGhlIHZhbHVlcyBpbiBTSSB1bml0cwotICogQGRhdGE6CQlwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgc2NhbgotICogQGNoYW5uZWxzOgkJaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYW5uZWxzLiBOb3RlCi0gKiAgc2l6ZV9mcm9tX2NoYW5uZWxhcnJheSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgZmlyc3QgdG8gZmlsbCB0aGUKLSAqICBsb2NhdGlvbiBvZmZzZXRzLgotICogQG51bV9jaGFubmVsczoJbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiovCi12b2lkIHByb2Nlc3Nfc2NhbihjaGFyICpkYXRhLAotCQkgIHN0cnVjdCBpaW9fY2hhbm5lbF9pbmZvICpjaGFubmVscywKLQkJICBpbnQgbnVtX2NoYW5uZWxzKQotewotCWludCBrOwotCi0JZm9yIChrID0gMDsgayA8IG51bV9jaGFubmVsczsgaysrKQotCQlzd2l0Y2ggKGNoYW5uZWxzW2tdLmJ5dGVzKSB7Ci0JCQkvKiBvbmx5IGEgZmV3IGNhc2VzIGltcGxlbWVudGVkIHNvIGZhciAqLwotCQljYXNlIDI6Ci0JCQlwcmludDJieXRlKCoodWludDE2X3QgKikoZGF0YSArIGNoYW5uZWxzW2tdLmxvY2F0aW9uKSwKLQkJCQkgICAmY2hhbm5lbHNba10pOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoKLQkJCWlmICghY2hhbm5lbHNba10uaXNfc2lnbmVkKSB7Ci0JCQkJdWludDMyX3QgdmFsID0gKih1aW50MzJfdCAqKQotCQkJCQkoZGF0YSArIGNoYW5uZWxzW2tdLmxvY2F0aW9uKTsKLQkJCQlwcmludGYoIiUwNWYgIiwgKChmbG9hdCl2YWwgKwotCQkJCQkJIGNoYW5uZWxzW2tdLm9mZnNldCkqCi0JCQkJICAgICAgIGNoYW5uZWxzW2tdLnNjYWxlKTsKLQotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgODoKLQkJCWlmIChjaGFubmVsc1trXS5pc19zaWduZWQpIHsKLQkJCQlpbnQ2NF90IHZhbCA9ICooaW50NjRfdCAqKQotCQkJCQkoZGF0YSArCi0JCQkJCSBjaGFubmVsc1trXS5sb2NhdGlvbik7Ci0JCQkJaWYgKCh2YWwgPj4gY2hhbm5lbHNba10uYml0c191c2VkKSAmIDEpCi0JCQkJCXZhbCA9ICh2YWwgJiBjaGFubmVsc1trXS5tYXNrKSB8Ci0JCQkJCQl+Y2hhbm5lbHNba10ubWFzazsKLQkJCQkvKiBzcGVjaWFsIGNhc2UgZm9yIHRpbWVzdGFtcCAqLwotCQkJCWlmIChjaGFubmVsc1trXS5zY2FsZSA9PSAxLjBmICYmCi0JCQkJICAgIGNoYW5uZWxzW2tdLm9mZnNldCA9PSAwLjBmKQotCQkJCQlwcmludGYoIiUiIFBSSWQ2NCAiICIsIHZhbCk7Ci0JCQkJZWxzZQotCQkJCQlwcmludGYoIiUwNWYgIiwgKChmbG9hdCl2YWwgKwotCQkJCQkJCSBjaGFubmVsc1trXS5vZmZzZXQpKgotCQkJCQkgICAgICAgY2hhbm5lbHNba10uc2NhbGUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCXByaW50ZigiXG4iKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCXVuc2lnbmVkIGxvbmcgbnVtX2xvb3BzID0gMjsKLQl1bnNpZ25lZCBsb25nIHRpbWVkZWxheSA9IDEwMDAwMDA7Ci0JdW5zaWduZWQgbG9uZyBidWZfbGVuID0gMTI4OwotCi0JaW50IHJldCwgYywgaSwgaiwgdG9yZWFkOwotCWludCBmcDsKLQotCWludCBudW1fY2hhbm5lbHM7Ci0JY2hhciAqdHJpZ2dlcl9uYW1lID0gTlVMTCwgKmRldmljZV9uYW1lID0gTlVMTDsKLQljaGFyICpkZXZfZGlyX25hbWUsICpidWZfZGlyX25hbWU7Ci0KLQlpbnQgZGF0YXJkeXRyaWdnZXIgPSAxOwotCWNoYXIgKmRhdGE7Ci0Jc3NpemVfdCByZWFkX3NpemU7Ci0JaW50IGRldl9udW0sIHRyaWdfbnVtOwotCWNoYXIgKmJ1ZmZlcl9hY2Nlc3M7Ci0JaW50IHNjYW5fc2l6ZTsKLQlpbnQgbm9ldmVudHMgPSAwOwotCWludCBub3RyaWdnZXIgPSAwOwotCWNoYXIgKmR1bW15OwotCi0Jc3RydWN0IGlpb19jaGFubmVsX2luZm8gKmNoYW5uZWxzOwotCi0Jd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJsOnc6YzpldDpuOmciKSkgIT0gLTEpIHsKLQkJc3dpdGNoIChjKSB7Ci0JCWNhc2UgJ24nOgotCQkJZGV2aWNlX25hbWUgPSBvcHRhcmc7Ci0JCQlicmVhazsKLQkJY2FzZSAndCc6Ci0JCQl0cmlnZ2VyX25hbWUgPSBvcHRhcmc7Ci0JCQlkYXRhcmR5dHJpZ2dlciA9IDA7Ci0JCQlicmVhazsKLQkJY2FzZSAnZSc6Ci0JCQlub2V2ZW50cyA9IDE7Ci0JCQlicmVhazsKLQkJY2FzZSAnYyc6Ci0JCQludW1fbG9vcHMgPSBzdHJ0b3VsKG9wdGFyZywgJmR1bW15LCAxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAndyc6Ci0JCQl0aW1lZGVsYXkgPSBzdHJ0b3VsKG9wdGFyZywgJmR1bW15LCAxMCk7Ci0JCQlicmVhazsKLQkJY2FzZSAnbCc6Ci0JCQlidWZfbGVuID0gc3RydG91bChvcHRhcmcsICZkdW1teSwgMTApOwotCQkJYnJlYWs7Ci0JCWNhc2UgJ2cnOgotCQkJbm90cmlnZ2VyID0gMTsKLQkJCWJyZWFrOwotCQljYXNlICc/JzoKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCWlmIChkZXZpY2VfbmFtZSA9PSBOVUxMKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBGaW5kIHRoZSBkZXZpY2UgcmVxdWVzdGVkICovCi0JZGV2X251bSA9IGZpbmRfdHlwZV9ieV9uYW1lKGRldmljZV9uYW1lLCAiaWlvOmRldmljZSIpOwotCWlmIChkZXZfbnVtIDwgMCkgewotCQlwcmludGYoIkZhaWxlZCB0byBmaW5kIHRoZSAlc1xuIiwgZGV2aWNlX25hbWUpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycm9yX3JldDsKLQl9Ci0JcHJpbnRmKCJpaW8gZGV2aWNlIG51bWJlciBiZWluZyB1c2VkIGlzICVkXG4iLCBkZXZfbnVtKTsKLQotCWFzcHJpbnRmKCZkZXZfZGlyX25hbWUsICIlc2lpbzpkZXZpY2UlZCIsIGlpb19kaXIsIGRldl9udW0pOwotCi0JaWYgKCFub3RyaWdnZXIpIHsKLQkJaWYgKHRyaWdnZXJfbmFtZSA9PSBOVUxMKSB7Ci0JCQkvKgotCQkJICogQnVpbGQgdGhlIHRyaWdnZXIgbmFtZS4gSWYgaXQgaXMgZGV2aWNlIGFzc29jaWF0ZWQKLQkJCSAqIGl0cyBuYW1lIGlzIDxkZXZpY2VfbmFtZT5fZGV2W25dIHdoZXJlIG4gbWF0Y2hlcwotCQkJICogdGhlIGRldmljZSBudW1iZXIgZm91bmQgYWJvdmUuCi0JCQkgKi8KLQkJCXJldCA9IGFzcHJpbnRmKCZ0cmlnZ2VyX25hbWUsCi0JCQkJICAgICAgICIlcy1kZXYlZCIsIGRldmljZV9uYW1lLCBkZXZfbnVtKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcmV0ID0gLUVOT01FTTsKLQkJCQlnb3RvIGVycm9yX3JldDsKLQkJCX0KLQkJfQotCi0JCS8qIFZlcmlmeSB0aGUgdHJpZ2dlciBleGlzdHMgKi8KLQkJdHJpZ19udW0gPSBmaW5kX3R5cGVfYnlfbmFtZSh0cmlnZ2VyX25hbWUsICJ0cmlnZ2VyIik7Ci0JCWlmICh0cmlnX251bSA8IDApIHsKLQkJCXByaW50ZigiRmFpbGVkIHRvIGZpbmQgdGhlIHRyaWdnZXIgJXNcbiIsIHRyaWdnZXJfbmFtZSk7Ci0JCQlyZXQgPSAtRU5PREVWOwotCQkJZ290byBlcnJvcl9mcmVlX3RyaWdnZXJuYW1lOwotCQl9Ci0JCXByaW50ZigiaWlvIHRyaWdnZXIgbnVtYmVyIGJlaW5nIHVzZWQgaXMgJWRcbiIsIHRyaWdfbnVtKTsKLQl9IGVsc2UKLQkJcHJpbnRmKCJ0cmlnZ2VyLWxlc3MgbW9kZSBzZWxlY3RlZFxuIik7Ci0KLQkvKgotCSAqIFBhcnNlIHRoZSBmaWxlcyBpbiBzY2FuX2VsZW1lbnRzIHRvIGlkZW50aWZ5IHdoYXQgY2hhbm5lbHMgYXJlCi0JICogcHJlc2VudAotCSAqLwotCXJldCA9IGJ1aWxkX2NoYW5uZWxfYXJyYXkoZGV2X2Rpcl9uYW1lLCAmY2hhbm5lbHMsICZudW1fY2hhbm5lbHMpOwotCWlmIChyZXQpIHsKLQkJcHJpbnRmKCJQcm9ibGVtIHJlYWRpbmcgc2NhbiBlbGVtZW50IGluZm9ybWF0aW9uXG4iKTsKLQkJcHJpbnRmKCJkaWFnICVzXG4iLCBkZXZfZGlyX25hbWUpOwotCQlnb3RvIGVycm9yX2ZyZWVfdHJpZ2dlcm5hbWU7Ci0JfQotCi0JLyoKLQkgKiBDb25zdHJ1Y3QgdGhlIGRpcmVjdG9yeSBuYW1lIGZvciB0aGUgYXNzb2NpYXRlZCBidWZmZXIuCi0JICogQXMgd2Uga25vdyB0aGF0IHRoZSBsaXMzbDAyZHEgaGFzIG9ubHkgb25lIGJ1ZmZlciB0aGlzIG1heQotCSAqIGJlIGJ1aWx0IHJhdGhlciB0aGFuIGZvdW5kLgotCSAqLwotCXJldCA9IGFzcHJpbnRmKCZidWZfZGlyX25hbWUsCi0JCSAgICAgICAiJXNpaW86ZGV2aWNlJWQvYnVmZmVyIiwgaWlvX2RpciwgZGV2X251bSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9mcmVlX3RyaWdnZXJuYW1lOwotCX0KLQotCWlmICghbm90cmlnZ2VyKSB7Ci0JCXByaW50ZigiJXMgJXNcbiIsIGRldl9kaXJfbmFtZSwgdHJpZ2dlcl9uYW1lKTsKLQkJLyogU2V0IHRoZSBkZXZpY2UgdHJpZ2dlciB0byBiZSB0aGUgZGF0YSByZWFkeSB0cmlnZ2VyIGZvdW5kCi0JCSAqIGFib3ZlICovCi0JCXJldCA9IHdyaXRlX3N5c2ZzX3N0cmluZ19hbmRfdmVyaWZ5KCJ0cmlnZ2VyL2N1cnJlbnRfdHJpZ2dlciIsCi0JCQkJCQkgICAgZGV2X2Rpcl9uYW1lLAotCQkJCQkJICAgIHRyaWdnZXJfbmFtZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlwcmludGYoIkZhaWxlZCB0byB3cml0ZSBjdXJyZW50X3RyaWdnZXIgZmlsZVxuIik7Ci0JCQlnb3RvIGVycm9yX2ZyZWVfYnVmX2Rpcl9uYW1lOwotCQl9Ci0JfQotCi0JLyogU2V0dXAgcmluZyBidWZmZXIgcGFyYW1ldGVycyAqLwotCXJldCA9IHdyaXRlX3N5c2ZzX2ludCgibGVuZ3RoIiwgYnVmX2Rpcl9uYW1lLCBidWZfbGVuKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9mcmVlX2J1Zl9kaXJfbmFtZTsKLQotCS8qIEVuYWJsZSB0aGUgYnVmZmVyICovCi0JcmV0ID0gd3JpdGVfc3lzZnNfaW50KCJlbmFibGUiLCBidWZfZGlyX25hbWUsIDEpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yX2ZyZWVfYnVmX2Rpcl9uYW1lOwotCXNjYW5fc2l6ZSA9IHNpemVfZnJvbV9jaGFubmVsYXJyYXkoY2hhbm5lbHMsIG51bV9jaGFubmVscyk7Ci0JZGF0YSA9IG1hbGxvYyhzY2FuX3NpemUqYnVmX2xlbik7Ci0JaWYgKCFkYXRhKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZnJlZV9idWZfZGlyX25hbWU7Ci0JfQotCi0JcmV0ID0gYXNwcmludGYoJmJ1ZmZlcl9hY2Nlc3MsICIvZGV2L2lpbzpkZXZpY2UlZCIsIGRldl9udW0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfZnJlZV9kYXRhOwotCX0KLQotCS8qIEF0dGVtcHQgdG8gb3BlbiBub24gYmxvY2tpbmcgdGhlIGFjY2VzcyBkZXYgKi8KLQlmcCA9IG9wZW4oYnVmZmVyX2FjY2VzcywgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsKLQlpZiAoZnAgPT0gLTEpIHsgLyogSWYgaXQgaXNuJ3QgdGhlcmUgbWFrZSB0aGUgbm9kZSAqLwotCQlwcmludGYoIkZhaWxlZCB0byBvcGVuICVzXG4iLCBidWZmZXJfYWNjZXNzKTsKLQkJcmV0ID0gLWVycm5vOwotCQlnb3RvIGVycm9yX2ZyZWVfYnVmZmVyX2FjY2VzczsKLQl9Ci0KLQkvKiBXYWl0IGZvciBldmVudHMgMTAgdGltZXMgKi8KLQlmb3IgKGogPSAwOyBqIDwgbnVtX2xvb3BzOyBqKyspIHsKLQkJaWYgKCFub2V2ZW50cykgewotCQkJc3RydWN0IHBvbGxmZCBwZmQgPSB7Ci0JCQkJLmZkID0gZnAsCi0JCQkJLmV2ZW50cyA9IFBPTExJTiwKLQkJCX07Ci0KLQkJCXBvbGwoJnBmZCwgMSwgLTEpOwotCQkJdG9yZWFkID0gYnVmX2xlbjsKLQotCQl9IGVsc2UgewotCQkJdXNsZWVwKHRpbWVkZWxheSk7Ci0JCQl0b3JlYWQgPSA2NDsKLQkJfQotCi0JCXJlYWRfc2l6ZSA9IHJlYWQoZnAsCi0JCQkJIGRhdGEsCi0JCQkJIHRvcmVhZCpzY2FuX3NpemUpOwotCQlpZiAocmVhZF9zaXplIDwgMCkgewotCQkJaWYgKGVycm5vID09IC1FQUdBSU4pIHsKLQkJCQlwcmludGYoIm5vdGhpbmcgYXZhaWxhYmxlXG4iKTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZQotCQkJCWJyZWFrOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCByZWFkX3NpemUvc2Nhbl9zaXplOyBpKyspCi0JCQlwcm9jZXNzX3NjYW4oZGF0YSArIHNjYW5fc2l6ZSppLAotCQkJCSAgICAgY2hhbm5lbHMsCi0JCQkJICAgICBudW1fY2hhbm5lbHMpOwotCX0KLQotCS8qIFN0b3AgdGhlIGJ1ZmZlciAqLwotCXJldCA9IHdyaXRlX3N5c2ZzX2ludCgiZW5hYmxlIiwgYnVmX2Rpcl9uYW1lLCAwKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcl9jbG9zZV9idWZmZXJfYWNjZXNzOwotCi0JaWYgKCFub3RyaWdnZXIpCi0JCS8qIERpc2Nvbm5lY3QgdGhlIHRyaWdnZXIgLSBqdXN0IHdyaXRlIGEgZHVtbXkgbmFtZS4gKi8KLQkJd3JpdGVfc3lzZnNfc3RyaW5nKCJ0cmlnZ2VyL2N1cnJlbnRfdHJpZ2dlciIsCi0JCQkJICAgZGV2X2Rpcl9uYW1lLCAiTlVMTCIpOwotCi1lcnJvcl9jbG9zZV9idWZmZXJfYWNjZXNzOgotCWNsb3NlKGZwKTsKLWVycm9yX2ZyZWVfZGF0YToKLQlmcmVlKGRhdGEpOwotZXJyb3JfZnJlZV9idWZmZXJfYWNjZXNzOgotCWZyZWUoYnVmZmVyX2FjY2Vzcyk7Ci1lcnJvcl9mcmVlX2J1Zl9kaXJfbmFtZToKLQlmcmVlKGJ1Zl9kaXJfbmFtZSk7Ci1lcnJvcl9mcmVlX3RyaWdnZXJuYW1lOgotCWlmIChkYXRhcmR5dHJpZ2dlcikKLQkJZnJlZSh0cmlnZ2VyX25hbWUpOwotZXJyb3JfcmV0OgotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vaWlvX2V2ZW50X21vbml0b3IuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9paW9fZXZlbnRfbW9uaXRvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmM5NmFhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vRG9jdW1lbnRhdGlvbi9paW9fZXZlbnRfbW9uaXRvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qIEluZHVzdHJpYWxpbyBldmVudCB0ZXN0IGNvZGUuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIgTGFycy1QZXRlciBDbGF1c2VuIDxsYXJzQG1ldGFmb28uZGU+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgcHJpbWFyaWx5IGludGVuZGVkIGFzIGFuIGV4YW1wbGUgYXBwbGljYXRpb24uCi0gKiBSZWFkcyB0aGUgY3VycmVudCBidWZmZXIgc2V0dXAgZnJvbSBzeXNmcyBhbmQgc3RhcnRzIGEgc2hvcnQgY2FwdHVyZQotICogZnJvbSB0aGUgc3BlY2lmaWVkIGRldmljZSwgcHJldHR5IHByaW50aW5nIHRoZSByZXN1bHQgYWZ0ZXIgYXBwcm9wcmlhdGUKLSAqIGNvbnZlcnNpb24uCi0gKgotICogVXNhZ2U6Ci0gKglpaW9fZXZlbnRfbW9uaXRvciA8ZGV2aWNlX25hbWU+Ci0gKgotICovCi0KLSNkZWZpbmUgX0dOVV9TT1VSQ0UKLQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8cG9sbC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSAiaWlvX3V0aWxzLmgiCi0jaW5jbHVkZSA8bGludXgvaWlvL2V2ZW50cy5oPgotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjW10gPSB7Ci0JW0lJT19WT0xUQUdFXSA9ICJ2b2x0YWdlIiwKLQlbSUlPX0NVUlJFTlRdID0gImN1cnJlbnQiLAotCVtJSU9fUE9XRVJdID0gInBvd2VyIiwKLQlbSUlPX0FDQ0VMXSA9ICJhY2NlbCIsCi0JW0lJT19BTkdMX1ZFTF0gPSAiYW5nbHZlbCIsCi0JW0lJT19NQUdOXSA9ICJtYWduIiwKLQlbSUlPX0xJR0hUXSA9ICJpbGx1bWluYW5jZSIsCi0JW0lJT19JTlRFTlNJVFldID0gImludGVuc2l0eSIsCi0JW0lJT19QUk9YSU1JVFldID0gInByb3hpbWl0eSIsCi0JW0lJT19URU1QXSA9ICJ0ZW1wIiwKLQlbSUlPX0lOQ0xJXSA9ICJpbmNsaSIsCi0JW0lJT19ST1RdID0gInJvdCIsCi0JW0lJT19BTkdMXSA9ICJhbmdsIiwKLQlbSUlPX1RJTUVTVEFNUF0gPSAidGltZXN0YW1wIiwKLQlbSUlPX0NBUEFDSVRBTkNFXSA9ICJjYXBhY2l0YW5jZSIsCi0JW0lJT19BTFRWT0xUQUdFXSA9ICJhbHR2b2x0YWdlIiwKLQlbSUlPX0NDVF0gPSAiY2N0IiwKLQlbSUlPX1BSRVNTVVJFXSA9ICJwcmVzc3VyZSIsCi0JW0lJT19IVU1JRElUWVJFTEFUSVZFXSA9ICJodW1pZGl0eXJlbGF0aXZlIiwKLQlbSUlPX0FDVElWSVRZXSA9ICJhY3Rpdml0eSIsCi0JW0lJT19TVEVQU10gPSAic3RlcHMiLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpaW9fZXZfdHlwZV90ZXh0W10gPSB7Ci0JW0lJT19FVl9UWVBFX1RIUkVTSF0gPSAidGhyZXNoIiwKLQlbSUlPX0VWX1RZUEVfTUFHXSA9ICJtYWciLAotCVtJSU9fRVZfVFlQRV9ST0NdID0gInJvYyIsCi0JW0lJT19FVl9UWVBFX1RIUkVTSF9BREFQVElWRV0gPSAidGhyZXNoX2FkYXB0aXZlIiwKLQlbSUlPX0VWX1RZUEVfTUFHX0FEQVBUSVZFXSA9ICJtYWdfYWRhcHRpdmUiLAotCVtJSU9fRVZfVFlQRV9DSEFOR0VdID0gImNoYW5nZSIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpb19ldl9kaXJfdGV4dFtdID0gewotCVtJSU9fRVZfRElSX0VJVEhFUl0gPSAiZWl0aGVyIiwKLQlbSUlPX0VWX0RJUl9SSVNJTkddID0gInJpc2luZyIsCi0JW0lJT19FVl9ESVJfRkFMTElOR10gPSAiZmFsbGluZyIKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaWlvX21vZGlmaWVyX25hbWVzW10gPSB7Ci0JW0lJT19NT0RfWF0gPSAieCIsCi0JW0lJT19NT0RfWV0gPSAieSIsCi0JW0lJT19NT0RfWl0gPSAieiIsCi0JW0lJT19NT0RfWF9BTkRfWV0gPSAieCZ5IiwKLQlbSUlPX01PRF9YX0FORF9aXSA9ICJ4JnoiLAotCVtJSU9fTU9EX1lfQU5EX1pdID0gInkmeiIsCi0JW0lJT19NT0RfWF9BTkRfWV9BTkRfWl0gPSAieCZ5JnoiLAotCVtJSU9fTU9EX1hfT1JfWV0gPSAieHx5IiwKLQlbSUlPX01PRF9YX09SX1pdID0gInh8eiIsCi0JW0lJT19NT0RfWV9PUl9aXSA9ICJ5fHoiLAotCVtJSU9fTU9EX1hfT1JfWV9PUl9aXSA9ICJ4fHl8eiIsCi0JW0lJT19NT0RfTElHSFRfQk9USF0gPSAiYm90aCIsCi0JW0lJT19NT0RfTElHSFRfSVJdID0gImlyIiwKLQlbSUlPX01PRF9ST09UX1NVTV9TUVVBUkVEX1hfWV0gPSAic3FydCh4XjIreV4yKSIsCi0JW0lJT19NT0RfU1VNX1NRVUFSRURfWF9ZX1pdID0gInheMit5XjIrel4yIiwKLQlbSUlPX01PRF9MSUdIVF9DTEVBUl0gPSAiY2xlYXIiLAotCVtJSU9fTU9EX0xJR0hUX1JFRF0gPSAicmVkIiwKLQlbSUlPX01PRF9MSUdIVF9HUkVFTl0gPSAiZ3JlZW4iLAotCVtJSU9fTU9EX0xJR0hUX0JMVUVdID0gImJsdWUiLAotCVtJSU9fTU9EX1FVQVRFUk5JT05dID0gInF1YXRlcm5pb24iLAotCVtJSU9fTU9EX1RFTVBfQU1CSUVOVF0gPSAiYW1iaWVudCIsCi0JW0lJT19NT0RfVEVNUF9PQkpFQ1RdID0gIm9iamVjdCIsCi0JW0lJT19NT0RfTk9SVEhfTUFHTl0gPSAiZnJvbV9ub3J0aF9tYWduZXRpYyIsCi0JW0lJT19NT0RfTk9SVEhfVFJVRV0gPSAiZnJvbV9ub3J0aF90cnVlIiwKLQlbSUlPX01PRF9OT1JUSF9NQUdOX1RJTFRfQ09NUF0gPSAiZnJvbV9ub3J0aF9tYWduZXRpY190aWx0X2NvbXAiLAotCVtJSU9fTU9EX05PUlRIX1RSVUVfVElMVF9DT01QXSA9ICJmcm9tX25vcnRoX3RydWVfdGlsdF9jb21wIiwKLQlbSUlPX01PRF9SVU5OSU5HXSA9ICJydW5uaW5nIiwKLQlbSUlPX01PRF9KT0dHSU5HXSA9ICJqb2dnaW5nIiwKLQlbSUlPX01PRF9XQUxLSU5HXSA9ICJ3YWxraW5nIiwKLQlbSUlPX01PRF9TVElMTF0gPSAic3RpbGwiLAotfTsKLQotc3RhdGljIGJvb2wgZXZlbnRfaXNfa25vd24oc3RydWN0IGlpb19ldmVudF9kYXRhICpldmVudCkKLXsKLQllbnVtIGlpb19jaGFuX3R5cGUgdHlwZSA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfQ0hBTl9UWVBFKGV2ZW50LT5pZCk7Ci0JZW51bSBpaW9fbW9kaWZpZXIgbW9kID0gSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9NT0RJRklFUihldmVudC0+aWQpOwotCWVudW0gaWlvX2V2ZW50X3R5cGUgZXZfdHlwZSA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfVFlQRShldmVudC0+aWQpOwotCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIgPSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0RJUihldmVudC0+aWQpOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBJSU9fVk9MVEFHRToKLQljYXNlIElJT19DVVJSRU5UOgotCWNhc2UgSUlPX1BPV0VSOgotCWNhc2UgSUlPX0FDQ0VMOgotCWNhc2UgSUlPX0FOR0xfVkVMOgotCWNhc2UgSUlPX01BR046Ci0JY2FzZSBJSU9fTElHSFQ6Ci0JY2FzZSBJSU9fSU5URU5TSVRZOgotCWNhc2UgSUlPX1BST1hJTUlUWToKLQljYXNlIElJT19URU1QOgotCWNhc2UgSUlPX0lOQ0xJOgotCWNhc2UgSUlPX1JPVDoKLQljYXNlIElJT19BTkdMOgotCWNhc2UgSUlPX1RJTUVTVEFNUDoKLQljYXNlIElJT19DQVBBQ0lUQU5DRToKLQljYXNlIElJT19BTFRWT0xUQUdFOgotCWNhc2UgSUlPX0NDVDoKLQljYXNlIElJT19QUkVTU1VSRToKLQljYXNlIElJT19IVU1JRElUWVJFTEFUSVZFOgotCWNhc2UgSUlPX0FDVElWSVRZOgotCWNhc2UgSUlPX1NURVBTOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3dpdGNoIChtb2QpIHsKLQljYXNlIElJT19OT19NT0Q6Ci0JY2FzZSBJSU9fTU9EX1g6Ci0JY2FzZSBJSU9fTU9EX1k6Ci0JY2FzZSBJSU9fTU9EX1o6Ci0JY2FzZSBJSU9fTU9EX1hfQU5EX1k6Ci0JY2FzZSBJSU9fTU9EX1hfQU5EX1o6Ci0JY2FzZSBJSU9fTU9EX1lfQU5EX1o6Ci0JY2FzZSBJSU9fTU9EX1hfQU5EX1lfQU5EX1o6Ci0JY2FzZSBJSU9fTU9EX1hfT1JfWToKLQljYXNlIElJT19NT0RfWF9PUl9aOgotCWNhc2UgSUlPX01PRF9ZX09SX1o6Ci0JY2FzZSBJSU9fTU9EX1hfT1JfWV9PUl9aOgotCWNhc2UgSUlPX01PRF9MSUdIVF9CT1RIOgotCWNhc2UgSUlPX01PRF9MSUdIVF9JUjoKLQljYXNlIElJT19NT0RfUk9PVF9TVU1fU1FVQVJFRF9YX1k6Ci0JY2FzZSBJSU9fTU9EX1NVTV9TUVVBUkVEX1hfWV9aOgotCWNhc2UgSUlPX01PRF9MSUdIVF9DTEVBUjoKLQljYXNlIElJT19NT0RfTElHSFRfUkVEOgotCWNhc2UgSUlPX01PRF9MSUdIVF9HUkVFTjoKLQljYXNlIElJT19NT0RfTElHSFRfQkxVRToKLQljYXNlIElJT19NT0RfUVVBVEVSTklPTjoKLQljYXNlIElJT19NT0RfVEVNUF9BTUJJRU5UOgotCWNhc2UgSUlPX01PRF9URU1QX09CSkVDVDoKLQljYXNlIElJT19NT0RfTk9SVEhfTUFHTjoKLQljYXNlIElJT19NT0RfTk9SVEhfVFJVRToKLQljYXNlIElJT19NT0RfTk9SVEhfTUFHTl9USUxUX0NPTVA6Ci0JY2FzZSBJSU9fTU9EX05PUlRIX1RSVUVfVElMVF9DT01QOgotCWNhc2UgSUlPX01PRF9SVU5OSU5HOgotCWNhc2UgSUlPX01PRF9KT0dHSU5HOgotCWNhc2UgSUlPX01PRF9XQUxLSU5HOgotCWNhc2UgSUlPX01PRF9TVElMTDoKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXN3aXRjaCAoZXZfdHlwZSkgewotCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIOgotCWNhc2UgSUlPX0VWX1RZUEVfTUFHOgotCWNhc2UgSUlPX0VWX1RZUEVfUk9DOgotCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIX0FEQVBUSVZFOgotCWNhc2UgSUlPX0VWX1RZUEVfTUFHX0FEQVBUSVZFOgotCWNhc2UgSUlPX0VWX1RZUEVfQ0hBTkdFOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3dpdGNoIChkaXIpIHsKLQljYXNlIElJT19FVl9ESVJfRUlUSEVSOgotCWNhc2UgSUlPX0VWX0RJUl9SSVNJTkc6Ci0JY2FzZSBJSU9fRVZfRElSX0ZBTExJTkc6Ci0JY2FzZSBJSU9fRVZfRElSX05PTkU6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfZXZlbnQoc3RydWN0IGlpb19ldmVudF9kYXRhICpldmVudCkKLXsKLQllbnVtIGlpb19jaGFuX3R5cGUgdHlwZSA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfQ0hBTl9UWVBFKGV2ZW50LT5pZCk7Ci0JZW51bSBpaW9fbW9kaWZpZXIgbW9kID0gSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9NT0RJRklFUihldmVudC0+aWQpOwotCWVudW0gaWlvX2V2ZW50X3R5cGUgZXZfdHlwZSA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfVFlQRShldmVudC0+aWQpOwotCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIgPSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0RJUihldmVudC0+aWQpOwotCWludCBjaGFuID0gSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9DSEFOKGV2ZW50LT5pZCk7Ci0JaW50IGNoYW4yID0gSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9DSEFOMihldmVudC0+aWQpOwotCWJvb2wgZGlmZiA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfRElGRihldmVudC0+aWQpOwotCi0JaWYgKCFldmVudF9pc19rbm93bihldmVudCkpIHsKLQkJcHJpbnRmKCJVbmtub3duIGV2ZW50OiB0aW1lOiAlbGxkLCBpZDogJWxseFxuIiwKLQkJCQlldmVudC0+dGltZXN0YW1wLCBldmVudC0+aWQpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpbnRmKCJFdmVudDogdGltZTogJWxsZCwgIiwgZXZlbnQtPnRpbWVzdGFtcCk7Ci0KLQlpZiAobW9kICE9IElJT19OT19NT0QpIHsKLQkJcHJpbnRmKCJ0eXBlOiAlcyglcyksICIsCi0JCQlpaW9fY2hhbl90eXBlX25hbWVfc3BlY1t0eXBlXSwKLQkJCWlpb19tb2RpZmllcl9uYW1lc1ttb2RdKTsKLQl9IGVsc2UgewotCQlwcmludGYoInR5cGU6ICVzLCAiLAotCQkJaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbdHlwZV0pOwotCX0KLQotCWlmIChkaWZmICYmIGNoYW4gPj0gMCAmJiBjaGFuMiA+PSAwKQotCQlwcmludGYoImNoYW5uZWw6ICVkLSVkLCAiLCBjaGFuLCBjaGFuMik7Ci0JZWxzZSBpZiAoY2hhbiA+PSAwKQotCQlwcmludGYoImNoYW5uZWw6ICVkLCAiLCBjaGFuKTsKLQotCXByaW50ZigiZXZ0eXBlOiAlcyIsIGlpb19ldl90eXBlX3RleHRbZXZfdHlwZV0pOwotCi0JaWYgKGRpciAhPSBJSU9fRVZfRElSX05PTkUpCi0JCXByaW50ZigiLCBkaXJlY3Rpb246ICVzIiwgaWlvX2V2X2Rpcl90ZXh0W2Rpcl0pOwotCXByaW50ZigiXG4iKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotCXN0cnVjdCBpaW9fZXZlbnRfZGF0YSBldmVudDsKLQljb25zdCBjaGFyICpkZXZpY2VfbmFtZTsKLQljaGFyICpjaHJkZXZfbmFtZTsKLQlpbnQgcmV0OwotCWludCBkZXZfbnVtOwotCWludCBmZCwgZXZlbnRfZmQ7Ci0KLQlpZiAoYXJnYyA8PSAxKSB7Ci0JCXByaW50ZigiVXNhZ2U6ICVzIDxkZXZpY2VfbmFtZT5cbiIsIGFyZ3ZbMF0pOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZGV2aWNlX25hbWUgPSBhcmd2WzFdOwotCi0JZGV2X251bSA9IGZpbmRfdHlwZV9ieV9uYW1lKGRldmljZV9uYW1lLCAiaWlvOmRldmljZSIpOwotCWlmIChkZXZfbnVtID49IDApIHsKLQkJcHJpbnRmKCJGb3VuZCBJSU8gZGV2aWNlIHdpdGggbmFtZSAlcyB3aXRoIGRldmljZSBudW1iZXIgJWRcbiIsCi0JCQlkZXZpY2VfbmFtZSwgZGV2X251bSk7Ci0JCXJldCA9IGFzcHJpbnRmKCZjaHJkZXZfbmFtZSwgIi9kZXYvaWlvOmRldmljZSVkIiwgZGV2X251bSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBlcnJvcl9yZXQ7Ci0JCX0KLQl9IGVsc2UgewotCQkvKiBJZiB3ZSBjYW4ndCBmaW5kIGEgSUlPIGRldmljZSBieSBuYW1lIGFzc3VtZSBkZXZpY2VfbmFtZSBpcyBhCi0JCSAgIElJTyBjaHJkZXYgKi8KLQkJY2hyZGV2X25hbWUgPSBzdHJkdXAoZGV2aWNlX25hbWUpOwotCX0KLQotCWZkID0gb3BlbihjaHJkZXZfbmFtZSwgMCk7Ci0JaWYgKGZkID09IC0xKSB7Ci0JCWZwcmludGYoc3Rkb3V0LCAiRmFpbGVkIHRvIG9wZW4gJXNcbiIsIGNocmRldl9uYW1lKTsKLQkJcmV0ID0gLWVycm5vOwotCQlnb3RvIGVycm9yX2ZyZWVfY2hyZGV2X25hbWU7Ci0JfQotCi0JcmV0ID0gaW9jdGwoZmQsIElJT19HRVRfRVZFTlRfRkRfSU9DVEwsICZldmVudF9mZCk7Ci0KLQljbG9zZShmZCk7Ci0KLQlpZiAocmV0ID09IC0xIHx8IGV2ZW50X2ZkID09IC0xKSB7Ci0JCWZwcmludGYoc3Rkb3V0LCAiRmFpbGVkIHRvIHJldHJpZXZlIGV2ZW50IGZkXG4iKTsKLQkJcmV0ID0gLWVycm5vOwotCQlnb3RvIGVycm9yX2ZyZWVfY2hyZGV2X25hbWU7Ci0JfQotCi0Jd2hpbGUgKHRydWUpIHsKLQkJcmV0ID0gcmVhZChldmVudF9mZCwgJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKLQkJaWYgKHJldCA9PSAtMSkgewotCQkJaWYgKGVycm5vID09IEVBR0FJTikgewotCQkJCXByaW50Zigibm90aGluZyBhdmFpbGFibGVcbiIpOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIHsKLQkJCQlwZXJyb3IoIkZhaWxlZCB0byByZWFkIGV2ZW50IGZyb20gZGV2aWNlIik7Ci0JCQkJcmV0ID0gLWVycm5vOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcHJpbnRfZXZlbnQoJmV2ZW50KTsKLQl9Ci0KLQljbG9zZShldmVudF9mZCk7Ci1lcnJvcl9mcmVlX2NocmRldl9uYW1lOgotCWZyZWUoY2hyZGV2X25hbWUpOwotZXJyb3JfcmV0OgotCXJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vaWlvX3V0aWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vaWlvX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGVmZjAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2lpb191dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjgzICswLDAgQEAKLS8qIElJTyAtIHVzZWZ1bCBzZXQgb2YgdXRpbCBmdW5jdGlvbmFsaXR5Ci0gKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEpvbmF0aGFuIENhbWVyb24KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotLyogTWFkZSB1cCB2YWx1ZSB0byBsaW1pdCBhbGxvY2F0aW9uIHNpemVzICovCi0jZGVmaW5lIElJT19NQVhfTkFNRV9MRU5HVEggMzAKLQotI2RlZmluZSBGT1JNQVRfU0NBTl9FTEVNRU5UU19ESVIgIiVzL3NjYW5fZWxlbWVudHMiCi0jZGVmaW5lIEZPUk1BVF9UWVBFX0ZJTEUgIiVzX3R5cGUiCi0KLWNvbnN0IGNoYXIgKmlpb19kaXIgPSAiL3N5cy9idXMvaWlvL2RldmljZXMvIjsKLQotLyoqCi0gKiBpaW91dGlsc19icmVha191cF9uYW1lKCkgLSBleHRyYWN0IGdlbmVyaWMgbmFtZSBmcm9tIGZ1bGwgY2hhbm5lbCBuYW1lCi0gKiBAZnVsbF9uYW1lOiB0aGUgZnVsbCBjaGFubmVsIG5hbWUKLSAqIEBnZW5lcmljX25hbWU6IHRoZSBvdXRwdXQgZ2VuZXJpYyBjaGFubmVsIG5hbWUKLSAqKi8KLWlubGluZSBpbnQgaWlvdXRpbHNfYnJlYWtfdXBfbmFtZShjb25zdCBjaGFyICpmdWxsX25hbWUsCi0JCQkJICBjaGFyICoqZ2VuZXJpY19uYW1lKQotewotCWNoYXIgKmN1cnJlbnQ7Ci0JY2hhciAqdywgKnI7Ci0JY2hhciAqd29ya2luZzsKLQotCWN1cnJlbnQgPSBzdHJkdXAoZnVsbF9uYW1lKTsKLQl3b3JraW5nID0gc3RydG9rKGN1cnJlbnQsICJfXDAiKTsKLQl3ID0gd29ya2luZzsKLQlyID0gd29ya2luZzsKLQotCXdoaWxlICgqciAhPSAnXDAnKSB7Ci0JCWlmICghaXNkaWdpdCgqcikpIHsKLQkJCSp3ID0gKnI7Ci0JCQl3Kys7Ci0JCX0KLQkJcisrOwotCX0KLQkqdyA9ICdcMCc7Ci0JKmdlbmVyaWNfbmFtZSA9IHN0cmR1cCh3b3JraW5nKTsKLQlmcmVlKGN1cnJlbnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogc3RydWN0IGlpb19jaGFubmVsX2luZm8gLSBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIGNoYW5uZWwKLSAqIEBuYW1lOiBjaGFubmVsIG5hbWUKLSAqIEBnZW5lcmljX25hbWU6IGdlbmVyYWwgbmFtZSBmb3IgY2hhbm5lbCB0eXBlCi0gKiBAc2NhbGU6IHNjYWxlIGZhY3RvciB0byBiZSBhcHBsaWVkIGZvciBjb252ZXJzaW9uIHRvIHNpIHVuaXRzCi0gKiBAb2Zmc2V0OiBvZmZzZXQgdG8gYmUgYXBwbGllZCBmb3IgY29udmVyc2lvbiB0byBzaSB1bml0cwotICogQGluZGV4OiB0aGUgY2hhbm5lbCBpbmRleCBpbiB0aGUgYnVmZmVyIG91dHB1dAotICogQGJ5dGVzOiBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgaW4gYnVmZmVyIG91dHB1dAotICogQG1hc2s6IGEgYml0IG1hc2sgZm9yIHRoZSByYXcgb3V0cHV0Ci0gKiBAaXNfc2lnbmVkOiBpcyB0aGUgcmF3IHZhbHVlIHN0b3JlZCBzaWduZWQKLSAqIEBlbmFibGVkOiBpcyB0aGlzIGNoYW5uZWwgZW5hYmxlZAotICoqLwotc3RydWN0IGlpb19jaGFubmVsX2luZm8gewotCWNoYXIgKm5hbWU7Ci0JY2hhciAqZ2VuZXJpY19uYW1lOwotCWZsb2F0IHNjYWxlOwotCWZsb2F0IG9mZnNldDsKLQl1bnNpZ25lZCBpbmRleDsKLQl1bnNpZ25lZCBieXRlczsKLQl1bnNpZ25lZCBiaXRzX3VzZWQ7Ci0JdW5zaWduZWQgc2hpZnQ7Ci0JdWludDY0X3QgbWFzazsKLQl1bnNpZ25lZCBiZTsKLQl1bnNpZ25lZCBpc19zaWduZWQ7Ci0JdW5zaWduZWQgbG9jYXRpb247Ci19OwotCi0vKioKLSAqIGlpb3V0aWxzX2dldF90eXBlKCkgLSBmaW5kIGFuZCBwcm9jZXNzIF90eXBlIGF0dHJpYnV0ZSBkYXRhCi0gKiBAaXNfc2lnbmVkOiBvdXRwdXQgd2hldGhlciBjaGFubmVsIGlzIHNpZ25lZAotICogQGJ5dGVzOiBvdXRwdXQgaG93IG1hbnkgYnl0ZXMgdGhlIGNoYW5uZWwgc3RvcmFnZSBvY2N1cGllcwotICogQG1hc2s6IG91dHB1dCBhIGJpdCBtYXNrIGZvciB0aGUgcmF3IGRhdGEKLSAqIEBiZTogYmlnIGVuZGlhbgotICogQGRldmljZV9kaXI6IHRoZSBpaW8gZGV2aWNlIGRpcmVjdG9yeQotICogQG5hbWU6IHRoZSBjaGFubmVsIG5hbWUKLSAqIEBnZW5lcmljX25hbWU6IHRoZSBjaGFubmVsIHR5cGUgbmFtZQotICoqLwotaW5saW5lIGludCBpaW91dGlsc19nZXRfdHlwZSh1bnNpZ25lZCAqaXNfc2lnbmVkLAotCQkJICAgICB1bnNpZ25lZCAqYnl0ZXMsCi0JCQkgICAgIHVuc2lnbmVkICpiaXRzX3VzZWQsCi0JCQkgICAgIHVuc2lnbmVkICpzaGlmdCwKLQkJCSAgICAgdWludDY0X3QgKm1hc2ssCi0JCQkgICAgIHVuc2lnbmVkICpiZSwKLQkJCSAgICAgY29uc3QgY2hhciAqZGV2aWNlX2RpciwKLQkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCSAgICAgY29uc3QgY2hhciAqZ2VuZXJpY19uYW1lKQotewotCUZJTEUgKnN5c2ZzZnA7Ci0JaW50IHJldDsKLQlESVIgKmRwOwotCWNoYXIgKnNjYW5fZWxfZGlyLCAqYnVpbHRuYW1lLCAqYnVpbHRuYW1lX2dlbmVyaWMsICpmaWxlbmFtZSA9IDA7Ci0JY2hhciBzaWduY2hhciwgZW5kaWFuY2hhcjsKLQl1bnNpZ25lZCBwYWRpbnQ7Ci0JY29uc3Qgc3RydWN0IGRpcmVudCAqZW50OwotCi0JcmV0ID0gYXNwcmludGYoJnNjYW5fZWxfZGlyLCBGT1JNQVRfU0NBTl9FTEVNRU5UU19ESVIsIGRldmljZV9kaXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfcmV0OwotCX0KLQlyZXQgPSBhc3ByaW50ZigmYnVpbHRuYW1lLCBGT1JNQVRfVFlQRV9GSUxFLCBuYW1lKTsKLQlpZiAocmV0IDwgMCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX2ZyZWVfc2Nhbl9lbF9kaXI7Ci0JfQotCXJldCA9IGFzcHJpbnRmKCZidWlsdG5hbWVfZ2VuZXJpYywgRk9STUFUX1RZUEVfRklMRSwgZ2VuZXJpY19uYW1lKTsKLQlpZiAocmV0IDwgMCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX2ZyZWVfYnVpbHRuYW1lOwotCX0KLQotCWRwID0gb3BlbmRpcihzY2FuX2VsX2Rpcik7Ci0JaWYgKGRwID09IE5VTEwpIHsKLQkJcmV0ID0gLWVycm5vOwotCQlnb3RvIGVycm9yX2ZyZWVfYnVpbHRuYW1lX2dlbmVyaWM7Ci0JfQotCXdoaWxlIChlbnQgPSByZWFkZGlyKGRwKSwgZW50ICE9IE5VTEwpCi0JCS8qCi0JCSAqIERvIHdlIGFsbG93IGRldmljZXMgdG8gb3ZlcnJpZGUgYSBnZW5lcmljIG5hbWUgd2l0aAotCQkgKiBhIHNwZWNpZmljIG9uZT8KLQkJICovCi0JCWlmICgoc3RyY21wKGJ1aWx0bmFtZSwgZW50LT5kX25hbWUpID09IDApIHx8Ci0JCSAgICAoc3RyY21wKGJ1aWx0bmFtZV9nZW5lcmljLCBlbnQtPmRfbmFtZSkgPT0gMCkpIHsKLQkJCXJldCA9IGFzcHJpbnRmKCZmaWxlbmFtZSwKLQkJCQkgICAgICAgIiVzLyVzIiwgc2Nhbl9lbF9kaXIsIGVudC0+ZF9uYW1lKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcmV0ID0gLUVOT01FTTsKLQkJCQlnb3RvIGVycm9yX2Nsb3NlZGlyOwotCQkJfQotCQkJc3lzZnNmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotCQkJaWYgKHN5c2ZzZnAgPT0gTlVMTCkgewotCQkJCXByaW50ZigiZmFpbGVkIHRvIG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKLQkJCQlyZXQgPSAtZXJybm87Ci0JCQkJZ290byBlcnJvcl9mcmVlX2ZpbGVuYW1lOwotCQkJfQotCi0JCQlyZXQgPSBmc2NhbmYoc3lzZnNmcCwKLQkJCQkgICAgICIlY2U6JWMldS8ldT4+JXUiLAotCQkJCSAgICAgJmVuZGlhbmNoYXIsCi0JCQkJICAgICAmc2lnbmNoYXIsCi0JCQkJICAgICBiaXRzX3VzZWQsCi0JCQkJICAgICAmcGFkaW50LCBzaGlmdCk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXByaW50ZigiZmFpbGVkIHRvIHBhc3Mgc2NhbiB0eXBlIGRlc2NyaXB0aW9uXG4iKTsKLQkJCQlyZXQgPSAtZXJybm87Ci0JCQkJZ290byBlcnJvcl9jbG9zZV9zeXNmc2ZwOwotCQkJfQotCQkJKmJlID0gKGVuZGlhbmNoYXIgPT0gJ2InKTsKLQkJCSpieXRlcyA9IHBhZGludCAvIDg7Ci0JCQlpZiAoKmJpdHNfdXNlZCA9PSA2NCkKLQkJCQkqbWFzayA9IH4wOwotCQkJZWxzZQotCQkJCSptYXNrID0gKDEgPDwgKmJpdHNfdXNlZCkgLSAxOwotCQkJaWYgKHNpZ25jaGFyID09ICdzJykKLQkJCQkqaXNfc2lnbmVkID0gMTsKLQkJCWVsc2UKLQkJCQkqaXNfc2lnbmVkID0gMDsKLQkJCWZjbG9zZShzeXNmc2ZwKTsKLQkJCWZyZWUoZmlsZW5hbWUpOwotCi0JCQlmaWxlbmFtZSA9IDA7Ci0JCQlzeXNmc2ZwID0gMDsKLQkJfQotZXJyb3JfY2xvc2Vfc3lzZnNmcDoKLQlpZiAoc3lzZnNmcCkKLQkJZmNsb3NlKHN5c2ZzZnApOwotZXJyb3JfZnJlZV9maWxlbmFtZToKLQlpZiAoZmlsZW5hbWUpCi0JCWZyZWUoZmlsZW5hbWUpOwotZXJyb3JfY2xvc2VkaXI6Ci0JY2xvc2VkaXIoZHApOwotZXJyb3JfZnJlZV9idWlsdG5hbWVfZ2VuZXJpYzoKLQlmcmVlKGJ1aWx0bmFtZV9nZW5lcmljKTsKLWVycm9yX2ZyZWVfYnVpbHRuYW1lOgotCWZyZWUoYnVpbHRuYW1lKTsKLWVycm9yX2ZyZWVfc2Nhbl9lbF9kaXI6Ci0JZnJlZShzY2FuX2VsX2Rpcik7Ci1lcnJvcl9yZXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotaW5saW5lIGludCBpaW91dGlsc19nZXRfcGFyYW1fZmxvYXQoZmxvYXQgKm91dHB1dCwKLQkJCQkgICAgY29uc3QgY2hhciAqcGFyYW1fbmFtZSwKLQkJCQkgICAgY29uc3QgY2hhciAqZGV2aWNlX2RpciwKLQkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKLQkJCQkgICAgY29uc3QgY2hhciAqZ2VuZXJpY19uYW1lKQotewotCUZJTEUgKnN5c2ZzZnA7Ci0JaW50IHJldDsKLQlESVIgKmRwOwotCWNoYXIgKmJ1aWx0bmFtZSwgKmJ1aWx0bmFtZV9nZW5lcmljOwotCWNoYXIgKmZpbGVuYW1lID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgZGlyZW50ICplbnQ7Ci0KLQlyZXQgPSBhc3ByaW50ZigmYnVpbHRuYW1lLCAiJXNfJXMiLCBuYW1lLCBwYXJhbV9uYW1lKTsKLQlpZiAocmV0IDwgMCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX3JldDsKLQl9Ci0JcmV0ID0gYXNwcmludGYoJmJ1aWx0bmFtZV9nZW5lcmljLAotCQkgICAgICAgIiVzXyVzIiwgZ2VuZXJpY19uYW1lLCBwYXJhbV9uYW1lKTsKLQlpZiAocmV0IDwgMCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycm9yX2ZyZWVfYnVpbHRuYW1lOwotCX0KLQlkcCA9IG9wZW5kaXIoZGV2aWNlX2Rpcik7Ci0JaWYgKGRwID09IE5VTEwpIHsKLQkJcmV0ID0gLWVycm5vOwotCQlnb3RvIGVycm9yX2ZyZWVfYnVpbHRuYW1lX2dlbmVyaWM7Ci0JfQotCXdoaWxlIChlbnQgPSByZWFkZGlyKGRwKSwgZW50ICE9IE5VTEwpCi0JCWlmICgoc3RyY21wKGJ1aWx0bmFtZSwgZW50LT5kX25hbWUpID09IDApIHx8Ci0JCSAgICAoc3RyY21wKGJ1aWx0bmFtZV9nZW5lcmljLCBlbnQtPmRfbmFtZSkgPT0gMCkpIHsKLQkJCXJldCA9IGFzcHJpbnRmKCZmaWxlbmFtZSwKLQkJCQkgICAgICAgIiVzLyVzIiwgZGV2aWNlX2RpciwgZW50LT5kX25hbWUpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlyZXQgPSAtRU5PTUVNOwotCQkJCWdvdG8gZXJyb3JfY2xvc2VkaXI7Ci0JCQl9Ci0JCQlzeXNmc2ZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0JCQlpZiAoIXN5c2ZzZnApIHsKLQkJCQlyZXQgPSAtZXJybm87Ci0JCQkJZ290byBlcnJvcl9mcmVlX2ZpbGVuYW1lOwotCQkJfQotCQkJZnNjYW5mKHN5c2ZzZnAsICIlZiIsIG91dHB1dCk7Ci0JCQlicmVhazsKLQkJfQotZXJyb3JfZnJlZV9maWxlbmFtZToKLQlpZiAoZmlsZW5hbWUpCi0JCWZyZWUoZmlsZW5hbWUpOwotZXJyb3JfY2xvc2VkaXI6Ci0JY2xvc2VkaXIoZHApOwotZXJyb3JfZnJlZV9idWlsdG5hbWVfZ2VuZXJpYzoKLQlmcmVlKGJ1aWx0bmFtZV9nZW5lcmljKTsKLWVycm9yX2ZyZWVfYnVpbHRuYW1lOgotCWZyZWUoYnVpbHRuYW1lKTsKLWVycm9yX3JldDoKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIGJzb3J0X2NoYW5uZWxfYXJyYXlfYnlfaW5kZXgoKSAtIHJlb3JkZXIgc28gdGhhdCB0aGUgYXJyYXkgaXMgaW4gaW5kZXggb3JkZXIKLSAqCi0gKiovCi0KLWlubGluZSB2b2lkIGJzb3J0X2NoYW5uZWxfYXJyYXlfYnlfaW5kZXgoc3RydWN0IGlpb19jaGFubmVsX2luZm8gKipjaV9hcnJheSwKLQkJCQkJIGludCBjbnQpCi17Ci0KLQlzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyB0ZW1wOwotCWludCB4LCB5OwotCi0JZm9yICh4ID0gMDsgeCA8IGNudDsgeCsrKQotCQlmb3IgKHkgPSAwOyB5IDwgKGNudCAtIDEpOyB5KyspCi0JCQlpZiAoKCpjaV9hcnJheSlbeV0uaW5kZXggPiAoKmNpX2FycmF5KVt5KzFdLmluZGV4KSB7Ci0JCQkJdGVtcCA9ICgqY2lfYXJyYXkpW3kgKyAxXTsKLQkJCQkoKmNpX2FycmF5KVt5ICsgMV0gPSAoKmNpX2FycmF5KVt5XTsKLQkJCQkoKmNpX2FycmF5KVt5XSA9IHRlbXA7Ci0JCQl9Ci19Ci0KLS8qKgotICogYnVpbGRfY2hhbm5lbF9hcnJheSgpIC0gZnVuY3Rpb24gdG8gZmlndXJlIG91dCB3aGF0IGNoYW5uZWxzIGFyZSBwcmVzZW50Ci0gKiBAZGV2aWNlX2RpcjogdGhlIElJTyBkZXZpY2UgZGlyZWN0b3J5IGluIHN5c2ZzCi0gKiBACi0gKiovCi1pbmxpbmUgaW50IGJ1aWxkX2NoYW5uZWxfYXJyYXkoY29uc3QgY2hhciAqZGV2aWNlX2RpciwKLQkJCSAgICAgIHN0cnVjdCBpaW9fY2hhbm5lbF9pbmZvICoqY2lfYXJyYXksCi0JCQkgICAgICBpbnQgKmNvdW50ZXIpCi17Ci0JRElSICpkcDsKLQlGSUxFICpzeXNmc2ZwOwotCWludCBjb3VudCwgaTsKLQlzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyAqY3VycmVudDsKLQlpbnQgcmV0OwotCWNvbnN0IHN0cnVjdCBkaXJlbnQgKmVudDsKLQljaGFyICpzY2FuX2VsX2RpcjsKLQljaGFyICpmaWxlbmFtZTsKLQotCSpjb3VudGVyID0gMDsKLQlyZXQgPSBhc3ByaW50Zigmc2Nhbl9lbF9kaXIsIEZPUk1BVF9TQ0FOX0VMRU1FTlRTX0RJUiwgZGV2aWNlX2Rpcik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJvcl9yZXQ7Ci0JfQotCWRwID0gb3BlbmRpcihzY2FuX2VsX2Rpcik7Ci0JaWYgKGRwID09IE5VTEwpIHsKLQkJcmV0ID0gLWVycm5vOwotCQlnb3RvIGVycm9yX2ZyZWVfbmFtZTsKLQl9Ci0Jd2hpbGUgKGVudCA9IHJlYWRkaXIoZHApLCBlbnQgIT0gTlVMTCkKLQkJaWYgKHN0cmNtcChlbnQtPmRfbmFtZSArIHN0cmxlbihlbnQtPmRfbmFtZSkgLSBzdHJsZW4oIl9lbiIpLAotCQkJICAgIl9lbiIpID09IDApIHsKLQkJCXJldCA9IGFzcHJpbnRmKCZmaWxlbmFtZSwKLQkJCQkgICAgICAgIiVzLyVzIiwgc2Nhbl9lbF9kaXIsIGVudC0+ZF9uYW1lKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJcmV0ID0gLUVOT01FTTsKLQkJCQlnb3RvIGVycm9yX2Nsb3NlX2RpcjsKLQkJCX0KLQkJCXN5c2ZzZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLQkJCWlmIChzeXNmc2ZwID09IE5VTEwpIHsKLQkJCQlyZXQgPSAtZXJybm87Ci0JCQkJZnJlZShmaWxlbmFtZSk7Ci0JCQkJZ290byBlcnJvcl9jbG9zZV9kaXI7Ci0JCQl9Ci0JCQlmc2NhbmYoc3lzZnNmcCwgIiVpIiwgJnJldCk7Ci0JCQlpZiAocmV0ID09IDEpCi0JCQkJKCpjb3VudGVyKSsrOwotCQkJZmNsb3NlKHN5c2ZzZnApOwotCQkJZnJlZShmaWxlbmFtZSk7Ci0JCX0KLQkqY2lfYXJyYXkgPSBtYWxsb2Moc2l6ZW9mKCoqY2lfYXJyYXkpICogKCpjb3VudGVyKSk7Ci0JaWYgKCpjaV9hcnJheSA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3JfY2xvc2VfZGlyOwotCX0KLQlzZWVrZGlyKGRwLCAwKTsKLQljb3VudCA9IDA7Ci0Jd2hpbGUgKGVudCA9IHJlYWRkaXIoZHApLCBlbnQgIT0gTlVMTCkgewotCQlpZiAoc3RyY21wKGVudC0+ZF9uYW1lICsgc3RybGVuKGVudC0+ZF9uYW1lKSAtIHN0cmxlbigiX2VuIiksCi0JCQkgICAiX2VuIikgPT0gMCkgewotCQkJaW50IGN1cnJlbnRfZW5hYmxlZCA9IDA7Ci0KLQkJCWN1cnJlbnQgPSAmKCpjaV9hcnJheSlbY291bnQrK107Ci0JCQlyZXQgPSBhc3ByaW50ZigmZmlsZW5hbWUsCi0JCQkJICAgICAgICIlcy8lcyIsIHNjYW5fZWxfZGlyLCBlbnQtPmRfbmFtZSk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCXJldCA9IC1FTk9NRU07Ci0JCQkJLyogZGVjcmVtZW50IGNvdW50IHRvIGF2b2lkIGZyZWVpbmcgbmFtZSAqLwotCQkJCWNvdW50LS07Ci0JCQkJZ290byBlcnJvcl9jbGVhbnVwX2FycmF5OwotCQkJfQotCQkJc3lzZnNmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotCQkJaWYgKHN5c2ZzZnAgPT0gTlVMTCkgewotCQkJCWZyZWUoZmlsZW5hbWUpOwotCQkJCXJldCA9IC1lcnJubzsKLQkJCQlnb3RvIGVycm9yX2NsZWFudXBfYXJyYXk7Ci0JCQl9Ci0JCQlmc2NhbmYoc3lzZnNmcCwgIiVpIiwgJmN1cnJlbnRfZW5hYmxlZCk7Ci0JCQlmY2xvc2Uoc3lzZnNmcCk7Ci0KLQkJCWlmICghY3VycmVudF9lbmFibGVkKSB7Ci0JCQkJZnJlZShmaWxlbmFtZSk7Ci0JCQkJY291bnQtLTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJY3VycmVudC0+c2NhbGUgPSAxLjA7Ci0JCQljdXJyZW50LT5vZmZzZXQgPSAwOwotCQkJY3VycmVudC0+bmFtZSA9IHN0cm5kdXAoZW50LT5kX25hbWUsCi0JCQkJCQlzdHJsZW4oZW50LT5kX25hbWUpIC0KLQkJCQkJCXN0cmxlbigiX2VuIikpOwotCQkJaWYgKGN1cnJlbnQtPm5hbWUgPT0gTlVMTCkgewotCQkJCWZyZWUoZmlsZW5hbWUpOwotCQkJCXJldCA9IC1FTk9NRU07Ci0JCQkJZ290byBlcnJvcl9jbGVhbnVwX2FycmF5OwotCQkJfQotCQkJLyogR2V0IHRoZSBnZW5lcmljIGFuZCBzcGVjaWZpYyBuYW1lIGVsZW1lbnRzICovCi0JCQlyZXQgPSBpaW91dGlsc19icmVha191cF9uYW1lKGN1cnJlbnQtPm5hbWUsCi0JCQkJCQkgICAgICZjdXJyZW50LT5nZW5lcmljX25hbWUpOwotCQkJaWYgKHJldCkgewotCQkJCWZyZWUoZmlsZW5hbWUpOwotCQkJCWdvdG8gZXJyb3JfY2xlYW51cF9hcnJheTsKLQkJCX0KLQkJCXJldCA9IGFzcHJpbnRmKCZmaWxlbmFtZSwKLQkJCQkgICAgICAgIiVzLyVzX2luZGV4IiwKLQkJCQkgICAgICAgc2Nhbl9lbF9kaXIsCi0JCQkJICAgICAgIGN1cnJlbnQtPm5hbWUpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlmcmVlKGZpbGVuYW1lKTsKLQkJCQlyZXQgPSAtRU5PTUVNOwotCQkJCWdvdG8gZXJyb3JfY2xlYW51cF9hcnJheTsKLQkJCX0KLQkJCXN5c2ZzZnAgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLQkJCWZzY2FuZihzeXNmc2ZwLCAiJXUiLCAmY3VycmVudC0+aW5kZXgpOwotCQkJZmNsb3NlKHN5c2ZzZnApOwotCQkJZnJlZShmaWxlbmFtZSk7Ci0JCQkvKiBGaW5kIHRoZSBzY2FsZSAqLwotCQkJcmV0ID0gaWlvdXRpbHNfZ2V0X3BhcmFtX2Zsb2F0KCZjdXJyZW50LT5zY2FsZSwKLQkJCQkJCSAgICAgICAic2NhbGUiLAotCQkJCQkJICAgICAgIGRldmljZV9kaXIsCi0JCQkJCQkgICAgICAgY3VycmVudC0+bmFtZSwKLQkJCQkJCSAgICAgICBjdXJyZW50LT5nZW5lcmljX25hbWUpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBlcnJvcl9jbGVhbnVwX2FycmF5OwotCQkJcmV0ID0gaWlvdXRpbHNfZ2V0X3BhcmFtX2Zsb2F0KCZjdXJyZW50LT5vZmZzZXQsCi0JCQkJCQkgICAgICAgIm9mZnNldCIsCi0JCQkJCQkgICAgICAgZGV2aWNlX2RpciwKLQkJCQkJCSAgICAgICBjdXJyZW50LT5uYW1lLAotCQkJCQkJICAgICAgIGN1cnJlbnQtPmdlbmVyaWNfbmFtZSk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIGVycm9yX2NsZWFudXBfYXJyYXk7Ci0JCQlyZXQgPSBpaW91dGlsc19nZXRfdHlwZSgmY3VycmVudC0+aXNfc2lnbmVkLAotCQkJCQkJJmN1cnJlbnQtPmJ5dGVzLAotCQkJCQkJJmN1cnJlbnQtPmJpdHNfdXNlZCwKLQkJCQkJCSZjdXJyZW50LT5zaGlmdCwKLQkJCQkJCSZjdXJyZW50LT5tYXNrLAotCQkJCQkJJmN1cnJlbnQtPmJlLAotCQkJCQkJZGV2aWNlX2RpciwKLQkJCQkJCWN1cnJlbnQtPm5hbWUsCi0JCQkJCQljdXJyZW50LT5nZW5lcmljX25hbWUpOwotCQl9Ci0JfQotCi0JY2xvc2VkaXIoZHApOwotCS8qIHJlb3JkZXIgc28gdGhhdCB0aGUgYXJyYXkgaXMgaW4gaW5kZXggb3JkZXIgKi8KLQlic29ydF9jaGFubmVsX2FycmF5X2J5X2luZGV4KGNpX2FycmF5LCAqY291bnRlcik7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3JfY2xlYW51cF9hcnJheToKLQlmb3IgKGkgPSBjb3VudCAtIDE7ICBpID49IDA7IGktLSkKLQkJZnJlZSgoKmNpX2FycmF5KVtpXS5uYW1lKTsKLQlmcmVlKCpjaV9hcnJheSk7Ci1lcnJvcl9jbG9zZV9kaXI6Ci0JY2xvc2VkaXIoZHApOwotZXJyb3JfZnJlZV9uYW1lOgotCWZyZWUoc2Nhbl9lbF9kaXIpOwotZXJyb3JfcmV0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogZmluZF90eXBlX2J5X25hbWUoKSAtIGZ1bmN0aW9uIHRvIG1hdGNoIHRvcCBsZXZlbCB0eXBlcyBieSBuYW1lCi0gKiBAbmFtZTogdG9wIGxldmVsIHR5cGUgaW5zdGFuY2UgbmFtZQotICogQHR5cGU6IHRoZSB0eXBlIG9mIHRvcCBsZXZlbCBpbnN0YW5jZSBiZWluZyBzb3J0Ci0gKgotICogVHlwaWNhbCB0eXBlcyB0aGlzIGlzIHVzZWQgZm9yIGFyZSBkZXZpY2UgYW5kIHRyaWdnZXIuCi0gKiovCi1pbmxpbmUgaW50IGZpbmRfdHlwZV9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUpCi17Ci0JY29uc3Qgc3RydWN0IGRpcmVudCAqZW50OwotCWludCBudW1iZXIsIG51bXN0cmxlbjsKLQotCUZJTEUgKm5hbWVGaWxlOwotCURJUiAqZHA7Ci0JY2hhciB0aGlzbmFtZVtJSU9fTUFYX05BTUVfTEVOR1RIXTsKLQljaGFyICpmaWxlbmFtZTsKLQotCWRwID0gb3BlbmRpcihpaW9fZGlyKTsKLQlpZiAoZHAgPT0gTlVMTCkgewotCQlwcmludGYoIk5vIGluZHVzdHJpYWxpbyBkZXZpY2VzIGF2YWlsYWJsZVxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXdoaWxlIChlbnQgPSByZWFkZGlyKGRwKSwgZW50ICE9IE5VTEwpIHsKLQkJaWYgKHN0cmNtcChlbnQtPmRfbmFtZSwgIi4iKSAhPSAwICYmCi0JCQlzdHJjbXAoZW50LT5kX25hbWUsICIuLiIpICE9IDAgJiYKLQkJCXN0cmxlbihlbnQtPmRfbmFtZSkgPiBzdHJsZW4odHlwZSkgJiYKLQkJCXN0cm5jbXAoZW50LT5kX25hbWUsIHR5cGUsIHN0cmxlbih0eXBlKSkgPT0gMCkgewotCQkJbnVtc3RybGVuID0gc3NjYW5mKGVudC0+ZF9uYW1lICsgc3RybGVuKHR5cGUpLAotCQkJCQkgICAiJWQiLAotCQkJCQkgICAmbnVtYmVyKTsKLQkJCS8qIHZlcmlmeSB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgbm90IGEgY29sb24gKi8KLQkJCWlmIChzdHJuY21wKGVudC0+ZF9uYW1lICsgc3RybGVuKHR5cGUpICsgbnVtc3RybGVuLAotCQkJCQkiOiIsCi0JCQkJCTEpICE9IDApIHsKLQkJCQlmaWxlbmFtZSA9IG1hbGxvYyhzdHJsZW4oaWlvX2RpcikKLQkJCQkJCSsgc3RybGVuKHR5cGUpCi0JCQkJCQkrIG51bXN0cmxlbgotCQkJCQkJKyA2KTsKLQkJCQlpZiAoZmlsZW5hbWUgPT0gTlVMTCkgewotCQkJCQljbG9zZWRpcihkcCk7Ci0JCQkJCXJldHVybiAtRU5PTUVNOwotCQkJCX0KLQkJCQlzcHJpbnRmKGZpbGVuYW1lLCAiJXMlcyVkL25hbWUiLAotCQkJCQlpaW9fZGlyLAotCQkJCQl0eXBlLAotCQkJCQludW1iZXIpOwotCQkJCW5hbWVGaWxlID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0JCQkJaWYgKCFuYW1lRmlsZSkgewotCQkJCQlmcmVlKGZpbGVuYW1lKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWZyZWUoZmlsZW5hbWUpOwotCQkJCWZzY2FuZihuYW1lRmlsZSwgIiVzIiwgdGhpc25hbWUpOwotCQkJCWZjbG9zZShuYW1lRmlsZSk7Ci0JCQkJaWYgKHN0cmNtcChuYW1lLCB0aGlzbmFtZSkgPT0gMCkgewotCQkJCQljbG9zZWRpcihkcCk7Ci0JCQkJCXJldHVybiBudW1iZXI7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCWNsb3NlZGlyKGRwKTsKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotaW5saW5lIGludCBfd3JpdGVfc3lzZnNfaW50KGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlZGlyLCBpbnQgdmFsLCBpbnQgdmVyaWZ5KQotewotCWludCByZXQgPSAwOwotCUZJTEUgKnN5c2ZzZnA7Ci0JaW50IHRlc3Q7Ci0JY2hhciAqdGVtcCA9IG1hbGxvYyhzdHJsZW4oYmFzZWRpcikgKyBzdHJsZW4oZmlsZW5hbWUpICsgMik7Ci0KLQlpZiAodGVtcCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzcHJpbnRmKHRlbXAsICIlcy8lcyIsIGJhc2VkaXIsIGZpbGVuYW1lKTsKLQlzeXNmc2ZwID0gZm9wZW4odGVtcCwgInciKTsKLQlpZiAoc3lzZnNmcCA9PSBOVUxMKSB7Ci0JCXByaW50ZigiZmFpbGVkIHRvIG9wZW4gJXNcbiIsIHRlbXApOwotCQlyZXQgPSAtZXJybm87Ci0JCWdvdG8gZXJyb3JfZnJlZTsKLQl9Ci0JZnByaW50ZihzeXNmc2ZwLCAiJWQiLCB2YWwpOwotCWZjbG9zZShzeXNmc2ZwKTsKLQlpZiAodmVyaWZ5KSB7Ci0JCXN5c2ZzZnAgPSBmb3Blbih0ZW1wLCAiciIpOwotCQlpZiAoc3lzZnNmcCA9PSBOVUxMKSB7Ci0JCQlwcmludGYoImZhaWxlZCB0byBvcGVuICVzXG4iLCB0ZW1wKTsKLQkJCXJldCA9IC1lcnJubzsKLQkJCWdvdG8gZXJyb3JfZnJlZTsKLQkJfQotCQlmc2NhbmYoc3lzZnNmcCwgIiVkIiwgJnRlc3QpOwotCQlmY2xvc2Uoc3lzZnNmcCk7Ci0JCWlmICh0ZXN0ICE9IHZhbCkgewotCQkJcHJpbnRmKCJQb3NzaWJsZSBmYWlsdXJlIGluIGludCB3cml0ZSAlZCB0byAlcyVzXG4iLAotCQkJCXZhbCwKLQkJCQliYXNlZGlyLAotCQkJCWZpbGVuYW1lKTsKLQkJCXJldCA9IC0xOwotCQl9Ci0JfQotZXJyb3JfZnJlZToKLQlmcmVlKHRlbXApOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCB3cml0ZV9zeXNmc19pbnQoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJhc2VkaXIsIGludCB2YWwpCi17Ci0JcmV0dXJuIF93cml0ZV9zeXNmc19pbnQoZmlsZW5hbWUsIGJhc2VkaXIsIHZhbCwgMCk7Ci19Ci0KLWludCB3cml0ZV9zeXNmc19pbnRfYW5kX3ZlcmlmeShjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpciwgaW50IHZhbCkKLXsKLQlyZXR1cm4gX3dyaXRlX3N5c2ZzX2ludChmaWxlbmFtZSwgYmFzZWRpciwgdmFsLCAxKTsKLX0KLQotaW50IF93cml0ZV9zeXNmc19zdHJpbmcoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJhc2VkaXIsIGNoYXIgKnZhbCwgaW50IHZlcmlmeSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlGSUxFICAqc3lzZnNmcDsKLQljaGFyICp0ZW1wID0gbWFsbG9jKHN0cmxlbihiYXNlZGlyKSArIHN0cmxlbihmaWxlbmFtZSkgKyAyKTsKLQotCWlmICh0ZW1wID09IE5VTEwpIHsKLQkJcHJpbnRmKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0Jc3ByaW50Zih0ZW1wLCAiJXMvJXMiLCBiYXNlZGlyLCBmaWxlbmFtZSk7Ci0Jc3lzZnNmcCA9IGZvcGVuKHRlbXAsICJ3Iik7Ci0JaWYgKHN5c2ZzZnAgPT0gTlVMTCkgewotCQlwcmludGYoIkNvdWxkIG5vdCBvcGVuICVzXG4iLCB0ZW1wKTsKLQkJcmV0ID0gLWVycm5vOwotCQlnb3RvIGVycm9yX2ZyZWU7Ci0JfQotCWZwcmludGYoc3lzZnNmcCwgIiVzIiwgdmFsKTsKLQlmY2xvc2Uoc3lzZnNmcCk7Ci0JaWYgKHZlcmlmeSkgewotCQlzeXNmc2ZwID0gZm9wZW4odGVtcCwgInIiKTsKLQkJaWYgKHN5c2ZzZnAgPT0gTlVMTCkgewotCQkJcHJpbnRmKCJjb3VsZCBub3Qgb3BlbiBmaWxlIHRvIHZlcmlmeVxuIik7Ci0JCQlyZXQgPSAtZXJybm87Ci0JCQlnb3RvIGVycm9yX2ZyZWU7Ci0JCX0KLQkJZnNjYW5mKHN5c2ZzZnAsICIlcyIsIHRlbXApOwotCQlmY2xvc2Uoc3lzZnNmcCk7Ci0JCWlmIChzdHJjbXAodGVtcCwgdmFsKSAhPSAwKSB7Ci0JCQlwcmludGYoIlBvc3NpYmxlIGZhaWx1cmUgaW4gc3RyaW5nIHdyaXRlIG9mICVzICIKLQkJCQkiU2hvdWxkIGJlICVzICIKLQkJCQkid3JpdHRlbiB0byAlc1wlc1xuIiwKLQkJCQl0ZW1wLAotCQkJCXZhbCwKLQkJCQliYXNlZGlyLAotCQkJCWZpbGVuYW1lKTsKLQkJCXJldCA9IC0xOwotCQl9Ci0JfQotZXJyb3JfZnJlZToKLQlmcmVlKHRlbXApOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiB3cml0ZV9zeXNmc19zdHJpbmdfYW5kX3ZlcmlmeSgpIC0gc3RyaW5nIHdyaXRlLCByZWFkYmFjayBhbmQgdmVyaWZ5Ci0gKiBAZmlsZW5hbWU6IG5hbWUgb2YgZmlsZSB0byB3cml0ZSB0bwotICogQGJhc2VkaXI6IHRoZSBzeXNmcyBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGZpbGUgaXMgdG8gYmUgZm91bmQKLSAqIEB2YWw6IHRoZSBzdHJpbmcgdG8gd3JpdGUKLSAqKi8KLWludCB3cml0ZV9zeXNmc19zdHJpbmdfYW5kX3ZlcmlmeShjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpciwgY2hhciAqdmFsKQotewotCXJldHVybiBfd3JpdGVfc3lzZnNfc3RyaW5nKGZpbGVuYW1lLCBiYXNlZGlyLCB2YWwsIDEpOwotfQotCi1pbnQgd3JpdGVfc3lzZnNfc3RyaW5nKGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlZGlyLCBjaGFyICp2YWwpCi17Ci0JcmV0dXJuIF93cml0ZV9zeXNmc19zdHJpbmcoZmlsZW5hbWUsIGJhc2VkaXIsIHZhbCwgMCk7Ci19Ci0KLWludCByZWFkX3N5c2ZzX3Bvc2ludChjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpcikKLXsKLQlpbnQgcmV0OwotCUZJTEUgICpzeXNmc2ZwOwotCWNoYXIgKnRlbXAgPSBtYWxsb2Moc3RybGVuKGJhc2VkaXIpICsgc3RybGVuKGZpbGVuYW1lKSArIDIpOwotCi0JaWYgKHRlbXAgPT0gTlVMTCkgewotCQlwcmludGYoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0Jc3ByaW50Zih0ZW1wLCAiJXMvJXMiLCBiYXNlZGlyLCBmaWxlbmFtZSk7Ci0Jc3lzZnNmcCA9IGZvcGVuKHRlbXAsICJyIik7Ci0JaWYgKHN5c2ZzZnAgPT0gTlVMTCkgewotCQlyZXQgPSAtZXJybm87Ci0JCWdvdG8gZXJyb3JfZnJlZTsKLQl9Ci0JZnNjYW5mKHN5c2ZzZnAsICIlZFxuIiwgJnJldCk7Ci0JZmNsb3NlKHN5c2ZzZnApOwotZXJyb3JfZnJlZToKLQlmcmVlKHRlbXApOwotCXJldHVybiByZXQ7Ci19Ci0KLWludCByZWFkX3N5c2ZzX2Zsb2F0KGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlZGlyLCBmbG9hdCAqdmFsKQotewotCWludCByZXQgPSAwOwotCUZJTEUgICpzeXNmc2ZwOwotCWNoYXIgKnRlbXAgPSBtYWxsb2Moc3RybGVuKGJhc2VkaXIpICsgc3RybGVuKGZpbGVuYW1lKSArIDIpOwotCi0JaWYgKHRlbXAgPT0gTlVMTCkgewotCQlwcmludGYoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0Jc3ByaW50Zih0ZW1wLCAiJXMvJXMiLCBiYXNlZGlyLCBmaWxlbmFtZSk7Ci0Jc3lzZnNmcCA9IGZvcGVuKHRlbXAsICJyIik7Ci0JaWYgKHN5c2ZzZnAgPT0gTlVMTCkgewotCQlyZXQgPSAtZXJybm87Ci0JCWdvdG8gZXJyb3JfZnJlZTsKLQl9Ci0JZnNjYW5mKHN5c2ZzZnAsICIlZlxuIiwgdmFsKTsKLQlmY2xvc2Uoc3lzZnNmcCk7Ci1lcnJvcl9mcmVlOgotCWZyZWUodGVtcCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHJlYWRfc3lzZnNfc3RyaW5nKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpiYXNlZGlyLCBjaGFyICpzdHIpCi17Ci0JaW50IHJldCA9IDA7Ci0JRklMRSAgKnN5c2ZzZnA7Ci0JY2hhciAqdGVtcCA9IG1hbGxvYyhzdHJsZW4oYmFzZWRpcikgKyBzdHJsZW4oZmlsZW5hbWUpICsgMik7Ci0KLQlpZiAodGVtcCA9PSBOVUxMKSB7Ci0JCXByaW50ZigiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlzcHJpbnRmKHRlbXAsICIlcy8lcyIsIGJhc2VkaXIsIGZpbGVuYW1lKTsKLQlzeXNmc2ZwID0gZm9wZW4odGVtcCwgInIiKTsKLQlpZiAoc3lzZnNmcCA9PSBOVUxMKSB7Ci0JCXJldCA9IC1lcnJubzsKLQkJZ290byBlcnJvcl9mcmVlOwotCX0KLQlmc2NhbmYoc3lzZnNmcCwgIiVzXG4iLCBzdHIpOwotCWZjbG9zZShzeXNmc2ZwKTsKLWVycm9yX2ZyZWU6Ci0JZnJlZSh0ZW1wKTsKLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9Eb2N1bWVudGF0aW9uL2xzaWlvLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vbHNpaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThhMGRlMC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0RvY3VtZW50YXRpb24vbHNpaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKgotICogSW5kdXN0cmlhbCBJL08gdXRpbGl0aWVzIC0gbHNpaW8uYwotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBNYW51ZWwgU3RhaGwgPG1hbnVlbC5zdGFobEBpaXMuZnJhdW5ob2Zlci5kZT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvZGlyLmg+Ci0jaW5jbHVkZSAiaWlvX3V0aWxzLmgiCi0KLQotc3RhdGljIGVudW0gdmVyYm9zaXR5IHsKLQlWRVJCTEVWRUxfREVGQVVMVCwJLyogMCBnaXZlcyBsc3BjaSBiZWhhdmlvdXIgKi8KLQlWRVJCTEVWRUxfU0VOU09SUywJLyogMSBsaXN0cyBzZW5zb3JzICovCi19IHZlcmJsZXZlbCA9IFZFUkJMRVZFTF9ERUZBVUxUOwotCi1jb25zdCBjaGFyICp0eXBlX2RldmljZSA9ICJpaW86ZGV2aWNlIjsKLWNvbnN0IGNoYXIgKnR5cGVfdHJpZ2dlciA9ICJ0cmlnZ2VyIjsKLQotCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19wcmVmaXgoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwcmVmaXgpCi17Ci0JcmV0dXJuIHN0cmxlbihzdHIpID4gc3RybGVuKHByZWZpeCkgJiYKLQkJc3RybmNtcChzdHIsIHByZWZpeCwgc3RybGVuKHByZWZpeCkpID09IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3Bvc3RmaXgoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwb3N0Zml4KQotewotCXJldHVybiBzdHJsZW4oc3RyKSA+IHN0cmxlbihwb3N0Zml4KSAmJgotCQlzdHJjbXAoc3RyICsgc3RybGVuKHN0cikgLSBzdHJsZW4ocG9zdGZpeCksIHBvc3RmaXgpID09IDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHVtcF9jaGFubmVscyhjb25zdCBjaGFyICpkZXZfZGlyX25hbWUpCi17Ci0JRElSICpkcDsKLQljb25zdCBzdHJ1Y3QgZGlyZW50ICplbnQ7Ci0KLQlkcCA9IG9wZW5kaXIoZGV2X2Rpcl9uYW1lKTsKLQlpZiAoZHAgPT0gTlVMTCkKLQkJcmV0dXJuIC1lcnJubzsKLQl3aGlsZSAoZW50ID0gcmVhZGRpcihkcCksIGVudCAhPSBOVUxMKQotCQlpZiAoY2hlY2tfcHJlZml4KGVudC0+ZF9uYW1lLCAiaW5fIikgJiYKLQkJICAgIGNoZWNrX3Bvc3RmaXgoZW50LT5kX25hbWUsICJfcmF3IikpIHsKLQkJCXByaW50ZigiICAgJS0xMHNcbiIsIGVudC0+ZF9uYW1lKTsKLQkJfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHVtcF9vbmVfZGV2aWNlKGNvbnN0IGNoYXIgKmRldl9kaXJfbmFtZSkKLXsKLQljaGFyIG5hbWVbSUlPX01BWF9OQU1FX0xFTkdUSF07Ci0JaW50IGRldl9pZHg7Ci0JaW50IHJldHZhbDsKLQotCXJldHZhbCA9IHNzY2FuZihkZXZfZGlyX25hbWUgKyBzdHJsZW4oaWlvX2RpcikgKyBzdHJsZW4odHlwZV9kZXZpY2UpLAotCQkJIiVpIiwgJmRldl9pZHgpOwotCWlmIChyZXR2YWwgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmVhZF9zeXNmc19zdHJpbmcoIm5hbWUiLCBkZXZfZGlyX25hbWUsIG5hbWUpOwotCXByaW50ZigiRGV2aWNlICUwM2Q6ICVzXG4iLCBkZXZfaWR4LCBuYW1lKTsKLQotCWlmICh2ZXJibGV2ZWwgPj0gVkVSQkxFVkVMX1NFTlNPUlMpCi0JCXJldHVybiBkdW1wX2NoYW5uZWxzKGRldl9kaXJfbmFtZSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHVtcF9vbmVfdHJpZ2dlcihjb25zdCBjaGFyICpkZXZfZGlyX25hbWUpCi17Ci0JY2hhciBuYW1lW0lJT19NQVhfTkFNRV9MRU5HVEhdOwotCWludCBkZXZfaWR4OwotCWludCByZXR2YWw7Ci0KLQlyZXR2YWwgPSBzc2NhbmYoZGV2X2Rpcl9uYW1lICsgc3RybGVuKGlpb19kaXIpICsgc3RybGVuKHR5cGVfdHJpZ2dlciksCi0JCQkiJWkiLCAmZGV2X2lkeCk7Ci0JaWYgKHJldHZhbCAhPSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZWFkX3N5c2ZzX3N0cmluZygibmFtZSIsIGRldl9kaXJfbmFtZSwgbmFtZSk7Ci0JcHJpbnRmKCJUcmlnZ2VyICUwM2Q6ICVzXG4iLCBkZXZfaWR4LCBuYW1lKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZHVtcF9kZXZpY2VzKHZvaWQpCi17Ci0JY29uc3Qgc3RydWN0IGRpcmVudCAqZW50OwotCWludCBudW1iZXIsIG51bXN0cmxlbjsKLQotCUZJTEUgKm5hbWVGaWxlOwotCURJUiAqZHA7Ci0JY2hhciB0aGlzbmFtZVtJSU9fTUFYX05BTUVfTEVOR1RIXTsKLQljaGFyICpmaWxlbmFtZTsKLQotCWRwID0gb3BlbmRpcihpaW9fZGlyKTsKLQlpZiAoZHAgPT0gTlVMTCkgewotCQlwcmludGYoIk5vIGluZHVzdHJpYWwgSS9PIGRldmljZXMgYXZhaWxhYmxlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXdoaWxlIChlbnQgPSByZWFkZGlyKGRwKSwgZW50ICE9IE5VTEwpIHsKLQkJaWYgKGNoZWNrX3ByZWZpeChlbnQtPmRfbmFtZSwgdHlwZV9kZXZpY2UpKSB7Ci0JCQljaGFyICpkZXZfZGlyX25hbWU7Ci0KLQkJCWFzcHJpbnRmKCZkZXZfZGlyX25hbWUsICIlcyVzIiwgaWlvX2RpciwgZW50LT5kX25hbWUpOwotCQkJZHVtcF9vbmVfZGV2aWNlKGRldl9kaXJfbmFtZSk7Ci0JCQlmcmVlKGRldl9kaXJfbmFtZSk7Ci0JCQlpZiAodmVyYmxldmVsID49IFZFUkJMRVZFTF9TRU5TT1JTKQotCQkJCXByaW50ZigiXG4iKTsKLQkJfQotCX0KLQlyZXdpbmRkaXIoZHApOwotCXdoaWxlIChlbnQgPSByZWFkZGlyKGRwKSwgZW50ICE9IE5VTEwpIHsKLQkJaWYgKGNoZWNrX3ByZWZpeChlbnQtPmRfbmFtZSwgdHlwZV90cmlnZ2VyKSkgewotCQkJY2hhciAqZGV2X2Rpcl9uYW1lOwotCi0JCQlhc3ByaW50ZigmZGV2X2Rpcl9uYW1lLCAiJXMlcyIsIGlpb19kaXIsIGVudC0+ZF9uYW1lKTsKLQkJCWR1bXBfb25lX3RyaWdnZXIoZGV2X2Rpcl9uYW1lKTsKLQkJCWZyZWUoZGV2X2Rpcl9uYW1lKTsKLQkJfQotCX0KLQljbG9zZWRpcihkcCk7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQlpbnQgYywgZXJyID0gMDsKLQotCXdoaWxlICgoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZDpEOnYiKSkgIT0gRU9GKSB7Ci0JCXN3aXRjaCAoYykgewotCQljYXNlICd2JzoKLQkJCXZlcmJsZXZlbCsrOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAnPyc6Ci0JCWRlZmF1bHQ6Ci0JCQllcnIrKzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChlcnIgfHwgYXJnYyA+IG9wdGluZCkgewotCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBsc2lpbyBbb3B0aW9uc10uLi5cbiIKLQkJCSJMaXN0IGluZHVzdHJpYWwgSS9PIGRldmljZXNcbiIKLQkJCSIgIC12LCAtLXZlcmJvc2VcbiIKLQkJCSIgICAgICBJbmNyZWFzZSB2ZXJib3NpdHkgKG1heSBiZSBnaXZlbiBtdWx0aXBsZSB0aW1lcylcbiIKLQkJCSk7Ci0JCWV4aXQoMSk7Ci0JfQotCi0JZHVtcF9kZXZpY2VzKCk7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vS2NvbmZpZwppbmRleCAyNDE4MzAyLi42ZDViMzhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9LY29uZmlnCkBAIC0zOCw2ICszOCw3IEBACiBjb25maWcgSUlPX1NJTVBMRV9EVU1NWV9CVUZGRVIKIAlib29sICJCdWZmZXJlZCBjYXB0dXJlIHN1cHBvcnQiCiAJc2VsZWN0IElJT19CVUZGRVIKKwlzZWxlY3QgSUlPX1RSSUdHRVIKIAlzZWxlY3QgSUlPX0tGSUZPX0JVRgogCWhlbHAKIAkgIEFkZCBidWZmZXJlZCBkYXRhIGNhcHR1cmUgdG8gdGhlIHNpbXBsZSBkdW1teSBkcml2ZXIuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDEuaAppbmRleCA4NzQ3ZGU1Li5lNmI4YzlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxLmgKQEAgLTM0LDI0ICszNCwyNCBAQAogI2RlZmluZSBBRElTMTYyMDFfR0xPQl9DTUQgICAgICAgMHgzRSAvKiBPcGVyYXRpb24sIHN5c3RlbSBjb21tYW5kIHJlZ2lzdGVyICovCiAKIC8qIE1TQ19DVFJMICovCi0jZGVmaW5lIEFESVMxNjIwMV9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICAoMSA8PCA4KSAgLyogU2VsZi10ZXN0IGVuYWJsZSAqLwotI2RlZmluZSBBRElTMTYyMDFfTVNDX0NUUkxfREFUQV9SRFlfRU4JICAgICAgICAoMSA8PCAyKSAgLyogRGF0YS1yZWFkeSBlbmFibGU6IDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KLSNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMX0FDVElWRV9ISUdICSAgICAgICAgKDEgPDwgMSkgIC8qIERhdGEtcmVhZHkgcG9sYXJpdHk6IDEgPSBhY3RpdmUgaGlnaCwgMCA9IGFjdGl2ZSBsb3cgKi8KLSNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMX0RBVEFfUkRZX0RJTzEJKDEgPDwgMCkgIC8qIERhdGEtcmVhZHkgbGluZSBzZWxlY3Rpb246IDEgPSBESU8xLCAwID0gRElPMCAqLworI2RlZmluZSBBRElTMTYyMDFfTVNDX0NUUkxfU0VMRl9URVNUX0VOCSAgICAgICAgQklUKDgpICAvKiBTZWxmLXRlc3QgZW5hYmxlICovCisjZGVmaW5lIEFESVMxNjIwMV9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgIEJJVCgyKSAgLyogRGF0YS1yZWFkeSBlbmFibGU6IDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KKyNkZWZpbmUgQURJUzE2MjAxX01TQ19DVFJMX0FDVElWRV9ISUdICSAgICAgICAgQklUKDEpICAvKiBEYXRhLXJlYWR5IHBvbGFyaXR5OiAxID0gYWN0aXZlIGhpZ2gsIDAgPSBhY3RpdmUgbG93ICovCisjZGVmaW5lIEFESVMxNjIwMV9NU0NfQ1RSTF9EQVRBX1JEWV9ESU8xCUJJVCgwKSAgLyogRGF0YS1yZWFkeSBsaW5lIHNlbGVjdGlvbjogMSA9IERJTzEsIDAgPSBESU8wICovCiAKIC8qIERJQUdfU1RBVCAqLwotI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUX0FMQVJNMiAgICAgICAgKDE8PDkpIC8qIEFsYXJtIDIgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KLSNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9BTEFSTTEgICAgICAgICgxPDw4KSAvKiBBbGFybSAxIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwMV9ESUFHX1NUQVRfQUxBUk0yICAgICAgICBCSVQoOSkgLyogQWxhcm0gMiBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLworI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUX0FMQVJNMSAgICAgICAgQklUKDgpIC8qIEFsYXJtIDEgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KICNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9TUElfRkFJTF9CSVQgICAzIC8qIFNQSSBjb21tdW5pY2F0aW9ucyBmYWlsdXJlICovCiAjZGVmaW5lIEFESVMxNjIwMV9ESUFHX1NUQVRfRkxBU0hfVVBUX0JJVCAgMiAvKiBGbGFzaCB1cGRhdGUgZmFpbHVyZSAqLwogI2RlZmluZSBBRElTMTYyMDFfRElBR19TVEFUX1BPV0VSX0hJR0hfQklUIDEgLyogUG93ZXIgc3VwcGx5IGFib3ZlIDMuNjI1IFYgKi8KICNkZWZpbmUgQURJUzE2MjAxX0RJQUdfU1RBVF9QT1dFUl9MT1dfQklUICAwIC8qIFBvd2VyIHN1cHBseSBiZWxvdyAzLjE1IFYgKi8KIAogLyogR0xPQl9DTUQgKi8KLSNkZWZpbmUgQURJUzE2MjAxX0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQotI2RlZmluZSBBRElTMTYyMDFfR0xPQl9DTURfRkFDVE9SWV9DQUwJKDE8PDEpCisjZGVmaW5lIEFESVMxNjIwMV9HTE9CX0NNRF9TV19SRVNFVAlCSVQoNykKKyNkZWZpbmUgQURJUzE2MjAxX0dMT0JfQ01EX0ZBQ1RPUllfQ0FMCUJJVCgxKQogCi0jZGVmaW5lIEFESVMxNjIwMV9FUlJPUl9BQ1RJVkUgICAgICAgICAgKDE8PDE0KQorI2RlZmluZSBBRElTMTYyMDFfRVJST1JfQUNUSVZFICAgICAgICAgIEJJVCgxNCkKIAogZW51bSBhZGlzMTYyMDFfc2NhbiB7CiAJQURJUzE2MjAxX1NDQU5fQUNDX1gsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMV9jb3JlLmMKaW5kZXggN2VhZTVmZC4uMTBkYjY4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDFfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAxX2NvcmUuYwpAQCAtMTM1LDE0ICsxMzUsMTQgQEAKIAlBRElTX1NVUFBMWV9DSEFOKEFESVMxNjIwMV9TVVBQTFlfT1VULCBBRElTMTYyMDFfU0NBTl9TVVBQTFksIDAsIDEyKSwKIAlBRElTX1RFTVBfQ0hBTihBRElTMTYyMDFfVEVNUF9PVVQsIEFESVMxNjIwMV9TQ0FOX1RFTVAsIDAsIDEyKSwKIAlBRElTX0FDQ0VMX0NIQU4oWCwgQURJUzE2MjAxX1hBQ0NMX09VVCwgQURJUzE2MjAxX1NDQU5fQUNDX1gsCi0JCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKIAlBRElTX0FDQ0VMX0NIQU4oWSwgQURJUzE2MjAxX1lBQ0NMX09VVCwgQURJUzE2MjAxX1NDQU5fQUNDX1ksCi0JCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKIAlBRElTX0FVWF9BRENfQ0hBTihBRElTMTYyMDFfQVVYX0FEQywgQURJUzE2MjAxX1NDQU5fQVVYX0FEQywgMCwgMTIpLAogCUFESVNfSU5DTElfQ0hBTihYLCBBRElTMTYyMDFfWElOQ0xfT1VULCBBRElTMTYyMDFfU0NBTl9JTkNMSV9YLAotCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCisJCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCiAJQURJU19JTkNMSV9DSEFOKFgsIEFESVMxNjIwMV9ZSU5DTF9PVVQsIEFESVMxNjIwMV9TQ0FOX0lOQ0xJX1ksCi0JCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUyksIDAsIDE0KSwKIAlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCg3KQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzLmgKaW5kZXggYWNjNjg4ZC4uNjQyNmUzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwMy5oCkBAIC0yNSwxNiArMjUsMTYgQEAKICNkZWZpbmUgQURJUzE2MjAzX0dMT0JfQ01EICAgICAgIDB4M0UgLyogT3BlcmF0aW9uLCBzeXN0ZW0gY29tbWFuZCByZWdpc3RlciAqLwogCiAvKiBNU0NfQ1RSTCAqLwotI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfUFdSVVBfU0VMRl9URVNUCSgxIDw8IDEwKSAvKiBTZWxmLXRlc3QgYXQgcG93ZXItb246IDEgPSBkaXNhYmxlZCwgMCA9IGVuYWJsZWQgKi8KLSNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX1JFVkVSU0VfUk9UX0VOCSgxIDw8IDkpICAvKiBSZXZlcnNlcyByb3RhdGlvbiBvZiBib3RoIGluY2xpbmF0aW9uIG91dHB1dHMgKi8KLSNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX1NFTEZfVEVTVF9FTgkgICAgICAgICgxIDw8IDgpICAvKiBTZWxmLXRlc3QgZW5hYmxlICovCi0jZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgICgxIDw8IDIpICAvKiBEYXRhLXJlYWR5IGVuYWJsZTogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLwotI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICAoMSA8PCAxKSAgLyogRGF0YS1yZWFkeSBwb2xhcml0eTogMSA9IGFjdGl2ZSBoaWdoLCAwID0gYWN0aXZlIGxvdyAqLwotI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfREFUQV9SRFlfRElPMQkoMSA8PCAwKSAgLyogRGF0YS1yZWFkeSBsaW5lIHNlbGVjdGlvbjogMSA9IERJTzEsIDAgPSBESU8wICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9QV1JVUF9TRUxGX1RFU1QJQklUKDEwKSAvKiBTZWxmLXRlc3QgYXQgcG93ZXItb246IDEgPSBkaXNhYmxlZCwgMCA9IGVuYWJsZWQgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX1JFVkVSU0VfUk9UX0VOCUJJVCg5KSAgLyogUmV2ZXJzZXMgcm90YXRpb24gb2YgYm90aCBpbmNsaW5hdGlvbiBvdXRwdXRzICovCisjZGVmaW5lIEFESVMxNjIwM19NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICBCSVQoOCkgIC8qIFNlbGYtdGVzdCBlbmFibGUgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX0RBVEFfUkRZX0VOCSAgICAgICAgQklUKDIpICAvKiBEYXRhLXJlYWR5IGVuYWJsZTogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworI2RlZmluZSBBRElTMTYyMDNfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICBCSVQoMSkgIC8qIERhdGEtcmVhZHkgcG9sYXJpdHk6IDEgPSBhY3RpdmUgaGlnaCwgMCA9IGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgQURJUzE2MjAzX01TQ19DVFJMX0RBVEFfUkRZX0RJTzEJQklUKDApICAvKiBEYXRhLXJlYWR5IGxpbmUgc2VsZWN0aW9uOiAxID0gRElPMSwgMCA9IERJTzAgKi8KIAogLyogRElBR19TVEFUICovCi0jZGVmaW5lIEFESVMxNjIwM19ESUFHX1NUQVRfQUxBUk0yICAgICAgICAoMTw8OSkgLyogQWxhcm0gMiBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLwotI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX0FMQVJNMSAgICAgICAgKDE8PDgpIC8qIEFsYXJtIDEgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KKyNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9BTEFSTTIgICAgICAgIEJJVCg5KSAvKiBBbGFybSAyIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwM19ESUFHX1NUQVRfQUxBUk0xICAgICAgICBCSVQoOCkgLyogQWxhcm0gMSBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLwogI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX1NFTEZURVNUX0ZBSUxfQklUIDUgLyogU2VsZi10ZXN0IGRpYWdub3N0aWMgZXJyb3IgZmxhZyAqLwogI2RlZmluZSBBRElTMTYyMDNfRElBR19TVEFUX1NQSV9GQUlMX0JJVCAgICAgIDMgLyogU1BJIGNvbW11bmljYXRpb25zIGZhaWx1cmUgKi8KICNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9GTEFTSF9VUFRfQklUICAgICAyIC8qIEZsYXNoIHVwZGF0ZSBmYWlsdXJlICovCkBAIC00MiwxMSArNDIsMTEgQEAKICNkZWZpbmUgQURJUzE2MjAzX0RJQUdfU1RBVF9QT1dFUl9MT1dfQklUICAgICAwIC8qIFBvd2VyIHN1cHBseSBiZWxvdyAzLjE1IFYgKi8KIAogLyogR0xPQl9DTUQgKi8KLSNkZWZpbmUgQURJUzE2MjAzX0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQotI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTURfQ0xFQVJfU1RBVAkoMTw8NCkKLSNkZWZpbmUgQURJUzE2MjAzX0dMT0JfQ01EX0ZBQ1RPUllfQ0FMCSgxPDwxKQorI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTURfU1dfUkVTRVQJQklUKDcpCisjZGVmaW5lIEFESVMxNjIwM19HTE9CX0NNRF9DTEVBUl9TVEFUCUJJVCg0KQorI2RlZmluZSBBRElTMTYyMDNfR0xPQl9DTURfRkFDVE9SWV9DQUwJQklUKDEpCiAKLSNkZWZpbmUgQURJUzE2MjAzX0VSUk9SX0FDVElWRSAgICAgICAgICAoMTw8MTQpCisjZGVmaW5lIEFESVMxNjIwM19FUlJPUl9BQ1RJVkUgICAgICAgICAgQklUKDE0KQogCiBlbnVtIGFkaXMxNjIwM19zY2FuIHsKIAlBRElTMTYyMDNfU0NBTl9JTkNMSV9YLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDNfY29yZS5jCmluZGV4IGZiYmU5M2YuLmZiNTkzZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjAzX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwM19jb3JlLmMKQEAgLTEwNCwxMCArMTA0LDEwIEBACiAJQURJU19TVVBQTFlfQ0hBTihBRElTMTYyMDNfU1VQUExZX09VVCwgQURJUzE2MjAzX1NDQU5fU1VQUExZLCAwLCAxMiksCiAJQURJU19BVVhfQURDX0NIQU4oQURJUzE2MjAzX0FVWF9BREMsIEFESVMxNjIwM19TQ0FOX0FVWF9BREMsIDAsIDEyKSwKIAlBRElTX0lOQ0xJX0NIQU4oWCwgQURJUzE2MjAzX1hJTkNMX09VVCwgQURJUzE2MjAzX1NDQU5fSU5DTElfWCwKLQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSwgMCwgMTQpLAorCQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSwgMCwgMTQpLAogCS8qIEZpeG1lOiBOb3Qgd2hhdCBpdCBhcHBlYXJzIHRvIGJlIC0gc2VlIGRhdGEgc2hlZXQgKi8KIAlBRElTX0lOQ0xJX0NIQU4oWSwgQURJUzE2MjAzX1lJTkNMX09VVCwgQURJUzE2MjAzX1NDQU5fSU5DTElfWSwKLQkJMCwgMCwgMTQpLAorCQkJMCwgMCwgMTQpLAogCUFESVNfVEVNUF9DSEFOKEFESVMxNjIwM19URU1QX09VVCwgQURJUzE2MjAzX1NDQU5fVEVNUCwgMCwgMTIpLAogCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDUpLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNC5oCmluZGV4IDlmZjk1MGMuLjBiMjNmMGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDQuaApAQCAtMzMsMTUgKzMzLDE1IEBACiAjZGVmaW5lIEFESVMxNjIwNF9HTE9CX0NNRCAgICAgICAweDNFIC8qIE9wZXJhdGlvbiwgc3lzdGVtIGNvbW1hbmQgcmVnaXN0ZXIgKi8KIAogLyogTVNDX0NUUkwgKi8KLSNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX1BXUlVQX1NFTEZfVEVTVAkoMSA8PCAxMCkgLyogU2VsZi10ZXN0IGF0IHBvd2VyLW9uOiAxID0gZGlzYWJsZWQsIDAgPSBlbmFibGVkICovCi0jZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICAoMSA8PCA4KSAgLyogU2VsZi10ZXN0IGVuYWJsZSAqLwotI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkxfREFUQV9SRFlfRU4JICAgICAgICAoMSA8PCAyKSAgLyogRGF0YS1yZWFkeSBlbmFibGU6IDEgPSBlbmFibGVkLCAwID0gZGlzYWJsZWQgKi8KLSNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX0FDVElWRV9ISUdICSAgICAgICAgKDEgPDwgMSkgIC8qIERhdGEtcmVhZHkgcG9sYXJpdHk6IDEgPSBhY3RpdmUgaGlnaCwgMCA9IGFjdGl2ZSBsb3cgKi8KLSNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0RJTzIJKDEgPDwgMCkgIC8qIERhdGEtcmVhZHkgbGluZSBzZWxlY3Rpb246IDEgPSBESU8yLCAwID0gRElPMSAqLworI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkxfUFdSVVBfU0VMRl9URVNUCUJJVCgxMCkgLyogU2VsZi10ZXN0IGF0IHBvd2VyLW9uOiAxID0gZGlzYWJsZWQsIDAgPSBlbmFibGVkICovCisjZGVmaW5lIEFESVMxNjIwNF9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICBCSVQoOCkgIC8qIFNlbGYtdGVzdCBlbmFibGUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0VOCSAgICAgICAgQklUKDIpICAvKiBEYXRhLXJlYWR5IGVuYWJsZTogMSA9IGVuYWJsZWQsIDAgPSBkaXNhYmxlZCAqLworI2RlZmluZSBBRElTMTYyMDRfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICBCSVQoMSkgIC8qIERhdGEtcmVhZHkgcG9sYXJpdHk6IDEgPSBhY3RpdmUgaGlnaCwgMCA9IGFjdGl2ZSBsb3cgKi8KKyNkZWZpbmUgQURJUzE2MjA0X01TQ19DVFJMX0RBVEFfUkRZX0RJTzIJQklUKDApICAvKiBEYXRhLXJlYWR5IGxpbmUgc2VsZWN0aW9uOiAxID0gRElPMiwgMCA9IERJTzEgKi8KIAogLyogRElBR19TVEFUICovCi0jZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfQUxBUk0yICAgICAgICAoMTw8OSkgLyogQWxhcm0gMiBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLwotI2RlZmluZSBBRElTMTYyMDRfRElBR19TVEFUX0FMQVJNMSAgICAgICAgKDE8PDgpIC8qIEFsYXJtIDEgc3RhdHVzOiAxID0gYWxhcm0gYWN0aXZlLCAwID0gYWxhcm0gaW5hY3RpdmUgKi8KKyNkZWZpbmUgQURJUzE2MjA0X0RJQUdfU1RBVF9BTEFSTTIgICAgICAgIEJJVCg5KSAvKiBBbGFybSAyIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCisjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfQUxBUk0xICAgICAgICBCSVQoOCkgLyogQWxhcm0gMSBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLwogI2RlZmluZSBBRElTMTYyMDRfRElBR19TVEFUX1NFTEZURVNUX0ZBSUxfQklUIDUgLyogU2VsZi10ZXN0IGRpYWdub3N0aWMgZXJyb3IgZmxhZzogMSA9IGVycm9yIGNvbmRpdGlvbiwKIAkJCQkJCTAgPSBub3JtYWwgb3BlcmF0aW9uICovCiAjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfU1BJX0ZBSUxfQklUICAgICAgMyAvKiBTUEkgY29tbXVuaWNhdGlvbnMgZmFpbHVyZSAqLwpAQCAtNTAsMTEgKzUwLDExIEBACiAjZGVmaW5lIEFESVMxNjIwNF9ESUFHX1NUQVRfUE9XRVJfTE9XX0JJVCAgICAgMCAvKiBQb3dlciBzdXBwbHkgYmVsb3cgMi45NzUgViAqLwogCiAvKiBHTE9CX0NNRCAqLwotI2RlZmluZSBBRElTMTYyMDRfR0xPQl9DTURfU1dfUkVTRVQJKDE8PDcpCi0jZGVmaW5lIEFESVMxNjIwNF9HTE9CX0NNRF9DTEVBUl9TVEFUCSgxPDw0KQotI2RlZmluZSBBRElTMTYyMDRfR0xPQl9DTURfRkFDVE9SWV9DQUwJKDE8PDEpCisjZGVmaW5lIEFESVMxNjIwNF9HTE9CX0NNRF9TV19SRVNFVAlCSVQoNykKKyNkZWZpbmUgQURJUzE2MjA0X0dMT0JfQ01EX0NMRUFSX1NUQVQJQklUKDQpCisjZGVmaW5lIEFESVMxNjIwNF9HTE9CX0NNRF9GQUNUT1JZX0NBTAlCSVQoMSkKIAotI2RlZmluZSBBRElTMTYyMDRfRVJST1JfQUNUSVZFICAgICAgICAgICgxPDwxNCkKKyNkZWZpbmUgQURJUzE2MjA0X0VSUk9SX0FDVElWRSAgICAgICAgICBCSVQoMTQpCiAKIGVudW0gYWRpczE2MjA0X3NjYW4gewogCUFESVMxNjIwNF9TQ0FOX0FDQ19YLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDRfY29yZS5jCmluZGV4IDRjOGFjYmMuLmVhMGFjMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA0X2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwNF9jb3JlLmMKQEAgLTE0MSwxMSArMTQxLDEzIEBACiAJQURJU19BVVhfQURDX0NIQU4oQURJUzE2MjA0X0FVWF9BREMsIEFESVMxNjIwNF9TQ0FOX0FVWF9BREMsIDAsIDEyKSwKIAlBRElTX1RFTVBfQ0hBTihBRElTMTYyMDRfVEVNUF9PVVQsIEFESVMxNjIwNF9TQ0FOX1RFTVAsIDAsIDEyKSwKIAlBRElTX0FDQ0VMX0NIQU4oWCwgQURJUzE2MjA0X1hBQ0NMX09VVCwgQURJUzE2MjA0X1NDQU5fQUNDX1gsCi0JCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUykgfCBCSVQoSUlPX0NIQU5fSU5GT19QRUFLKSwgMCwgMTQpLAorCQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1BFQUspLAorCQkJMCwgMTQpLAogCUFESVNfQUNDRUxfQ0hBTihZLCBBRElTMTYyMDRfWUFDQ0xfT1VULCBBRElTMTYyMDRfU0NBTl9BQ0NfWSwKLQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1BFQUspLCAwLCAxNCksCisJCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpIHwgQklUKElJT19DSEFOX0lORk9fUEVBSyksCisJCQkwLCAxNCksCiAJQURJU19BQ0NFTF9DSEFOKFJPT1RfU1VNX1NRVUFSRURfWF9ZLCBBRElTMTYyMDRfWFlfUlNTX09VVCwKLQkJQURJUzE2MjA0X1NDQU5fQUNDX1hZLCBCSVQoSUlPX0NIQU5fSU5GT19QRUFLKSwgMCwgMTQpLAorCQkJQURJUzE2MjA0X1NDQU5fQUNDX1hZLCBCSVQoSUlPX0NIQU5fSU5GT19QRUFLKSwgMCwgMTQpLAogCUlJT19DSEFOX1NPRlRfVElNRVNUQU1QKDUpLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDkuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5LmgKaW5kZXggYWQzOTQ1YS4uODEzNjk4ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOS5oCkBAIC02MCwyMSArNjAsMjEgQEAKIAogLyogTVNDX0NUUkwgKi8KIC8qIFNlbGYtdGVzdCBhdCBwb3dlci1vbjogMSA9IGRpc2FibGVkLCAwID0gZW5hYmxlZCAqLwotI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfUFdSVVBfU0VMRl9URVNUCSgxIDw8IDEwKQorI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfUFdSVVBfU0VMRl9URVNUCUJJVCgxMCkKIC8qIFNlbGYtdGVzdCBlbmFibGUgKi8KLSNkZWZpbmUgQURJUzE2MjA5X01TQ19DVFJMX1NFTEZfVEVTVF9FTgkgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIEFESVMxNjIwOV9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICBCSVQoOCkKIC8qIERhdGEtcmVhZHkgZW5hYmxlOiAxID0gZW5hYmxlZCwgMCA9IGRpc2FibGVkICovCi0jZGVmaW5lIEFESVMxNjIwOV9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEFESVMxNjIwOV9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgIEJJVCgyKQogLyogRGF0YS1yZWFkeSBwb2xhcml0eTogMSA9IGFjdGl2ZSBoaWdoLCAwID0gYWN0aXZlIGxvdyAqLwotI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICBCSVQoMSkKIC8qIERhdGEtcmVhZHkgbGluZSBzZWxlY3Rpb246IDEgPSBESU8yLCAwID0gRElPMSAqLwotI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfREFUQV9SRFlfRElPMgkoMSA8PCAwKQorI2RlZmluZSBBRElTMTYyMDlfTVNDX0NUUkxfREFUQV9SRFlfRElPMglCSVQoMCkKIAogLyogRElBR19TVEFUICovCiAvKiBBbGFybSAyIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCi0jZGVmaW5lIEFESVMxNjIwOV9ESUFHX1NUQVRfQUxBUk0yICAgICAgICAoMTw8OSkKKyNkZWZpbmUgQURJUzE2MjA5X0RJQUdfU1RBVF9BTEFSTTIgICAgICAgIEJJVCg5KQogLyogQWxhcm0gMSBzdGF0dXM6IDEgPSBhbGFybSBhY3RpdmUsIDAgPSBhbGFybSBpbmFjdGl2ZSAqLwotI2RlZmluZSBBRElTMTYyMDlfRElBR19TVEFUX0FMQVJNMSAgICAgICAgKDE8PDgpCisjZGVmaW5lIEFESVMxNjIwOV9ESUFHX1NUQVRfQUxBUk0xICAgICAgICBCSVQoOCkKIC8qIFNlbGYtdGVzdCBkaWFnbm9zdGljIGVycm9yIGZsYWc6IDEgPSBlcnJvciBjb25kaXRpb24sIDAgPSBub3JtYWwgb3BlcmF0aW9uICovCiAjZGVmaW5lIEFESVMxNjIwOV9ESUFHX1NUQVRfU0VMRlRFU1RfRkFJTF9CSVQJNQogLyogU1BJIGNvbW11bmljYXRpb25zIGZhaWx1cmUgKi8KQEAgLTg3LDExICs4NywxMSBAQAogI2RlZmluZSBBRElTMTYyMDlfRElBR19TVEFUX1BPV0VSX0xPV19CSVQJMAogCiAvKiBHTE9CX0NNRCAqLwotI2RlZmluZSBBRElTMTYyMDlfR0xPQl9DTURfU1dfUkVTRVQJKDE8PDcpCi0jZGVmaW5lIEFESVMxNjIwOV9HTE9CX0NNRF9DTEVBUl9TVEFUCSgxPDw0KQotI2RlZmluZSBBRElTMTYyMDlfR0xPQl9DTURfRkFDVE9SWV9DQUwJKDE8PDEpCisjZGVmaW5lIEFESVMxNjIwOV9HTE9CX0NNRF9TV19SRVNFVAlCSVQoNykKKyNkZWZpbmUgQURJUzE2MjA5X0dMT0JfQ01EX0NMRUFSX1NUQVQJQklUKDQpCisjZGVmaW5lIEFESVMxNjIwOV9HTE9CX0NNRF9GQUNUT1JZX0NBTAlCSVQoMSkKIAotI2RlZmluZSBBRElTMTYyMDlfRVJST1JfQUNUSVZFICAgICAgICAgICgxPDwxNCkKKyNkZWZpbmUgQURJUzE2MjA5X0VSUk9SX0FDVElWRSAgICAgICAgICBCSVQoMTQpCiAKICNkZWZpbmUgQURJUzE2MjA5X1NDQU5fU1VQUExZCTAKICNkZWZpbmUgQURJUzE2MjA5X1NDQU5fQUNDX1gJMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMDlfY29yZS5jCmluZGV4IGIyYzdhZWQuLmQxZGMxYTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjA5X2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIwOV9jb3JlLmMKQEAgLTEzNCwxNCArMTM0LDE0IEBACiAJQURJU19TVVBQTFlfQ0hBTihBRElTMTYyMDlfU1VQUExZX09VVCwgQURJUzE2MjA5X1NDQU5fU1VQUExZLCAwLCAxNCksCiAJQURJU19URU1QX0NIQU4oQURJUzE2MjA5X1RFTVBfT1VULCBBRElTMTYyMDlfU0NBTl9URU1QLCAwLCAxMiksCiAJQURJU19BQ0NFTF9DSEFOKFgsIEFESVMxNjIwOV9YQUNDTF9PVVQsIEFESVMxNjIwOV9TQ0FOX0FDQ19YLAotCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCisJCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCiAJQURJU19BQ0NFTF9DSEFOKFksIEFESVMxNjIwOV9ZQUNDTF9PVVQsIEFESVMxNjIwOV9TQ0FOX0FDQ19ZLAotCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCisJCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpLCAwLCAxNCksCiAJQURJU19BVVhfQURDX0NIQU4oQURJUzE2MjA5X0FVWF9BREMsIEFESVMxNjIwOV9TQ0FOX0FVWF9BREMsIDAsIDEyKSwKIAlBRElTX0lOQ0xJX0NIQU4oWCwgQURJUzE2MjA5X1hJTkNMX09VVCwgQURJUzE2MjA5X1NDQU5fSU5DTElfWCwKLQkJMCwgMCwgMTQpLAorCQkJMCwgMCwgMTQpLAogCUFESVNfSU5DTElfQ0hBTihZLCBBRElTMTYyMDlfWUlOQ0xfT1VULCBBRElTMTYyMDlfU0NBTl9JTkNMSV9ZLAotCQkwLCAwLCAxNCksCisJCQkwLCAwLCAxNCksCiAJQURJU19ST1RfQ0hBTihYLCBBRElTMTYyMDlfUk9UX09VVCwgQURJUzE2MjA5X1NDQU5fUk9ULCAwLCAwLCAxNCksCiAJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoOCkKIH07CkBAIC0xNzgsNyArMTc4LDYgQEAKIAkJQklUKEFESVMxNjIwOV9ESUFHX1NUQVRfUE9XRVJfTE9XX0JJVCksCiB9OwogCi0KIHN0YXRpYyBpbnQgYWRpczE2MjA5X3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIyMC5oCmluZGV4IGE4OTRhZDcuLmVhYjg2MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMjAuaApAQCAtNzEsMzUgKzcxLDM1IEBACiAjZGVmaW5lIEFESVMxNjIyMF9DQVBUVVJFX1NJWkUgIDIwNDgKIAogLyogTVNDX0NUUkwgKi8KLSNkZWZpbmUgQURJUzE2MjIwX01TQ19DVFJMX1NFTEZfVEVTVF9FTgkgICAgICAgICgxIDw8IDgpCi0jZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9QT1dFUl9TVVBfQ09NX0FJTjEJKDEgPDwgMSkKLSNkZWZpbmUgQURJUzE2MjIwX01TQ19DVFJMX1BPV0VSX1NVUF9DT01fQUlOMgkoMSA8PCAwKQorI2RlZmluZSBBRElTMTYyMjBfTVNDX0NUUkxfU0VMRl9URVNUX0VOCSAgICAgICAgQklUKDgpCisjZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9QT1dFUl9TVVBfQ09NX0FJTjEJQklUKDEpCisjZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9QT1dFUl9TVVBfQ09NX0FJTjIJQklUKDApCiAKIC8qIERJT19DVFJMICovCi0jZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9ESU8yX0JVU1lfSU5EICAgICAoMzw8NCkKLSNkZWZpbmUgQURJUzE2MjIwX01TQ19DVFJMX0RJTzFfQlVTWV9JTkQgICAgICgzPDwyKQotI2RlZmluZSBBRElTMTYyMjBfTVNDX0NUUkxfRElPMl9BQ1RfSElHSCAgICAgKDE8PDEpCi0jZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9ESU8xX0FDVF9ISUdIICAgICAoMTw8MCkKKyNkZWZpbmUgQURJUzE2MjIwX01TQ19DVFJMX0RJTzJfQlVTWV9JTkQgICAgIChCSVQoNSkgfCBCSVQoNCkpCisjZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9ESU8xX0JVU1lfSU5EICAgICAoQklUKDMpIHwgQklUKDIpKQorI2RlZmluZSBBRElTMTYyMjBfTVNDX0NUUkxfRElPMl9BQ1RfSElHSCAgICAgQklUKDEpCisjZGVmaW5lIEFESVMxNjIyMF9NU0NfQ1RSTF9ESU8xX0FDVF9ISUdIICAgICBCSVQoMCkKIAogLyogRElBR19TVEFUICovCiAvKiBBSU4yIHNhbXBsZSA+IEFMTV9NQUcyICovCi0jZGVmaW5lIEFESVMxNjIyMF9ESUFHX1NUQVRfQUxNX01BRzIgICAgKDE8PDE0KQorI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX0FMTV9NQUcyICAgIEJJVCgxNCkKIC8qIEFJTjEgc2FtcGxlID4gQUxNX01BRzEgKi8KLSNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9BTE1fTUFHMSAgICAoMTw8MTMpCisjZGVmaW5lIEFESVMxNjIyMF9ESUFHX1NUQVRfQUxNX01BRzEgICAgQklUKDEzKQogLyogQWNjZWxlcmF0aW9uIHNhbXBsZSA+IEFMTV9NQUdBICovCi0jZGVmaW5lIEFESVMxNjIyMF9ESUFHX1NUQVRfQUxNX01BR0EgICAgKDE8PDEyKQorI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX0FMTV9NQUdBICAgIEJJVCgxMikKIC8qIEVycm9yIGNvbmRpdGlvbiBwcm9ncmFtbWVkIGludG8gQUxNX01BR1NbMTE6MF0gYW5kIEFMTV9DVFJMWzU6NF0gaXMgdHJ1ZSAqLwotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX0FMTV9NQUdTICAgICgxPDwxMSkKKyNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9BTE1fTUFHUyAgICBCSVQoMTEpCiAvKiB8UGVhayB2YWx1ZSBpbiBBSU4yIGRhdGEgY2FwdHVyZXwgPiBBTE1fTUFHMiAqLwotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1BFQUtfQUlOMiAgICgxPDwxMCkKKyNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9QRUFLX0FJTjIgICBCSVQoMTApCiAvKiB8UGVhayB2YWx1ZSBpbiBBSU4xIGRhdGEgY2FwdHVyZXwgPiBBTE1fTUFHMSAqLwotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1BFQUtfQUlOMSAgICgxPDw5KQorI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1BFQUtfQUlOMSAgIEJJVCg5KQogLyogfFBlYWsgdmFsdWUgaW4gYWNjZWxlcmF0aW9uIGRhdGEgY2FwdHVyZXwgPiBBTE1fTUFHQSAqLwotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1BFQUtfQUNDRUwgICgxPDw4KQorI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1BFQUtfQUNDRUwgIEJJVCg4KQogLyogRGF0YSByZWFkeSwgY2FwdHVyZSBjb21wbGV0ZSAqLwotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX0RBVEFfUkRZICAgICgxPDw3KQotI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX0ZMQVNIX0NISwkoMTw8NikKLSNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9TRUxGX1RFU1QJKDE8PDUpCisjZGVmaW5lIEFESVMxNjIyMF9ESUFHX1NUQVRfREFUQV9SRFkgICAgQklUKDcpCisjZGVmaW5lIEFESVMxNjIyMF9ESUFHX1NUQVRfRkxBU0hfQ0hLCUJJVCg2KQorI2RlZmluZSBBRElTMTYyMjBfRElBR19TVEFUX1NFTEZfVEVTVAlCSVQoNSkKIC8qIENhcHR1cmUgcGVyaW9kIHZpb2xhdGlvbi9pbnRlcnJ1cHRpb24gKi8KICNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9WSU9MQVRJT05fQklUCTQKIC8qIFNQSSBjb21tdW5pY2F0aW9ucyBmYWlsdXJlICovCkBAIC0xMTIsOSArMTEyLDkgQEAKICNkZWZpbmUgQURJUzE2MjIwX0RJQUdfU1RBVF9QT1dFUl9MT1dfQklUCTAKIAogLyogR0xPQl9DTUQgKi8KLSNkZWZpbmUgQURJUzE2MjIwX0dMT0JfQ01EX1NXX1JFU0VUCSgxPDw3KQotI2RlZmluZSBBRElTMTYyMjBfR0xPQl9DTURfU0VMRl9URVNUCSgxPDwyKQotI2RlZmluZSBBRElTMTYyMjBfR0xPQl9DTURfUFdSX0RPV04JKDE8PDEpCisjZGVmaW5lIEFESVMxNjIyMF9HTE9CX0NNRF9TV19SRVNFVAlCSVQoNykKKyNkZWZpbmUgQURJUzE2MjIwX0dMT0JfQ01EX1NFTEZfVEVTVAlCSVQoMikKKyNkZWZpbmUgQURJUzE2MjIwX0dMT0JfQ01EX1BXUl9ET1dOCUJJVCgxKQogCiAjZGVmaW5lIEFESVMxNjIyMF9NQVhfVFggMjA0OAogI2RlZmluZSBBRElTMTYyMjBfTUFYX1JYIDIwNDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjIwX2NvcmUuYwppbmRleCBkNDc4ZjUxLi5lNDZhOTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjIyMF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyMjBfY29yZS5jCkBAIC0yMSwyOSArMjEsMjggQEAKICNpbmNsdWRlICJhZGlzMTYyMjAuaCIKIAogc3RhdGljIHNzaXplX3QgYWRpczE2MjIwX3JlYWRfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRpczE2MjIwX3N0YXRlICpzdCA9IGlpb19wcml2KGluZGlvX2Rldik7CiAJc3NpemVfdCByZXQ7Ci0JczE2IHZhbCA9IDA7CisJdTE2IHZhbDsKIAogCS8qIFRha2UgdGhlIGlpb19kZXYgc3RhdHVzIGxvY2sgKi8KIAltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKLQlyZXQgPSBhZGlzX3JlYWRfcmVnXzE2KCZzdC0+YWRpcywgdGhpc19hdHRyLT5hZGRyZXNzLAotCQkJCQkodTE2ICopJnZhbCk7CisJcmV0ID0gYWRpc19yZWFkX3JlZ18xNigmc3QtPmFkaXMsIHRoaXNfYXR0ci0+YWRkcmVzcywgJnZhbCk7CiAJbXV0ZXhfdW5sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB2YWwpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCB2YWwpOwogfQogCiBzdGF0aWMgc3NpemVfdCBhZGlzMTYyMjBfd3JpdGVfMTZiaXQoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLAotCQlzaXplX3QgbGVuKQorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsCisJCQkJICAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKQEAgLTc2LDggKzc1LDggQEAKIH0KIAogc3RhdGljIHNzaXplX3QgYWRpczE2MjIwX3dyaXRlX2NhcHR1cmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCWJvb2wgdmFsOwpAQCAtOTYsMTAgKzk1LDEwIEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkaXMxNjIyMF9jYXB0dXJlX2J1ZmZlcl9yZWFkKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCi0JCQkJCWNoYXIgKmJ1ZiwKLQkJCQkJbG9mZl90IG9mZiwKLQkJCQkJc2l6ZV90IGNvdW50LAotCQkJCQlpbnQgYWRkcikKKwkJCQkJICAgICBjaGFyICpidWYsCisJCQkJCSAgICAgbG9mZl90IG9mZiwKKwkJCQkJICAgICBzaXplX3QgY291bnQsCisJCQkJCSAgICAgaW50IGFkZHIpCiB7CiAJc3RydWN0IGFkaXMxNjIyMF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcnNbXSA9IHsKQEAgLTEzMSwxNSArMTMwLDE0IEBACiAKIAkvKiB3cml0ZSB0aGUgYmVnaW4gcG9zaXRpb24gb2YgY2FwdHVyZSBidWZmZXIgKi8KIAlyZXQgPSBhZGlzX3dyaXRlX3JlZ18xNigmc3QtPmFkaXMsCi0JCQkJCUFESVMxNjIyMF9DQVBUX1BOVFIsCi0JCQkJCW9mZiA+IDEpOworCQkJCUFESVMxNjIyMF9DQVBUX1BOVFIsCisJCQkJb2ZmID4gMSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FSU87CiAKIAkvKiByZWFkIGNvdW50LzIgdmFsdWVzIGZyb20gY2FwdHVyZSBidWZmZXIgKi8KIAltdXRleF9sb2NrKCZzdC0+YnVmX2xvY2spOwogCi0KIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMikgewogCQlzdC0+dHhbaV0gPSBBRElTX1JFQURfUkVHKGFkZHIpOwogCQlzdC0+dHhbaSArIDFdID0gMDsKQEAgLTE0OCw3ICsxNDYsNiBAQAogCiAJcmV0ID0gc3BpX3N5bmNfdHJhbnNmZXIoc3QtPmFkaXMuc3BpLCB4ZmVycywgQVJSQVlfU0laRSh4ZmVycykpOwogCWlmIChyZXQpIHsKLQogCQltdXRleF91bmxvY2soJnN0LT5idWZfbG9jayk7CiAJCXJldHVybiAtRUlPOwogCX0KQEAgLTE4Miw5ICsxNzksOSBAQAogfTsKIAogc3RhdGljIHNzaXplX3QgYWRpczE2MjIwX2FkYzFfYmluX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQkJCXN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAotCQkJCWNoYXIgKmJ1ZiwgbG9mZl90IG9mZiwKLQkJCQlzaXplX3QgY291bnQpCisJCQkJICAgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjaGFyICpidWYsIGxvZmZfdCBvZmYsCisJCQkJICAgICAgIHNpemVfdCBjb3VudCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoa29ial90b19kZXYoa29iaikpOwogCkBAIC0yMDMsOSArMjAwLDkgQEAKIH07CiAKIHN0YXRpYyBzc2l6ZV90IGFkaXMxNjIyMF9hZGMyX2Jpbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qga29iamVjdCAqa29iaiwKLQkJCQlzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljaGFyICpidWYsIGxvZmZfdCBvZmYsCi0JCQkJc2l6ZV90IGNvdW50KQorCQkJCSAgICAgICBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLAorCQkJCSAgICAgICBzaXplX3QgY291bnQpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGtvYmpfdG9fZGV2KGtvYmopKTsKIApAQCAtMjE0LDcgKzIxMSw2IEBACiAJCQkJCUFESVMxNjIyMF9DQVBUX0JVRjIpOwogfQogCi0KIHN0YXRpYyBzdHJ1Y3QgYmluX2F0dHJpYnV0ZSBhZGMyX2JpbiA9IHsKIAkuYXR0ciA9IHsKIAkJLm5hbWUgPSAiaW4xX2JpbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MC5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDAuaAppbmRleCBkNDQyZDQ5Li42NmI1YWQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwLmgKQEAgLTc0LDMxICs3NCwzMSBAQAogCiAvKiBNU0NfQ1RSTCAqLwogLyogRW5hYmxlcyBzdW0tb2Ytc3F1YXJlcyBvdXRwdXQgKFhZWlBFQUtfT1VUKSAqLwotI2RlZmluZSBBRElTMTYyNDBfTVNDX0NUUkxfWFlaUEVBS19PVVRfRU4JKDEgPDwgMTUpCisjZGVmaW5lIEFESVMxNjI0MF9NU0NfQ1RSTF9YWVpQRUFLX09VVF9FTglCSVQoMTUpCiAvKiBFbmFibGVzIHBlYWsgdHJhY2tpbmcgb3V0cHV0IChYUEVBS19PVVQsIFlQRUFLX09VVCwgYW5kIFpQRUFLX09VVCkgKi8KLSNkZWZpbmUgQURJUzE2MjQwX01TQ19DVFJMX1hfWV9aUEVBS19PVVRfRU4JKDEgPDwgMTQpCisjZGVmaW5lIEFESVMxNjI0MF9NU0NfQ1RSTF9YX1lfWlBFQUtfT1VUX0VOCUJJVCgxNCkKIC8qIFNlbGYtdGVzdCBlbmFibGU6IDEgPSBhcHBseSBlbGVjdHJvc3RhdGljIGZvcmNlLCAwID0gZGlzYWJsZWQgKi8KLSNkZWZpbmUgQURJUzE2MjQwX01TQ19DVFJMX1NFTEZfVEVTVF9FTgkgICAgICAgICgxIDw8IDgpCisjZGVmaW5lIEFESVMxNjI0MF9NU0NfQ1RSTF9TRUxGX1RFU1RfRU4JICAgICAgICBCSVQoOCkKIC8qIERhdGEtcmVhZHkgZW5hYmxlOiAxID0gZW5hYmxlZCwgMCA9IGRpc2FibGVkICovCi0jZGVmaW5lIEFESVMxNjI0MF9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIEFESVMxNjI0MF9NU0NfQ1RSTF9EQVRBX1JEWV9FTgkgICAgICAgIEJJVCgyKQogLyogRGF0YS1yZWFkeSBwb2xhcml0eTogMSA9IGFjdGl2ZSBoaWdoLCAwID0gYWN0aXZlIGxvdyAqLwotI2RlZmluZSBBRElTMTYyNDBfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBBRElTMTYyNDBfTVNDX0NUUkxfQUNUSVZFX0hJR0gJICAgICAgICBCSVQoMSkKIC8qIERhdGEtcmVhZHkgbGluZSBzZWxlY3Rpb246IDEgPSBESU8yLCAwID0gRElPMSAqLwotI2RlZmluZSBBRElTMTYyNDBfTVNDX0NUUkxfREFUQV9SRFlfRElPMgkoMSA8PCAwKQorI2RlZmluZSBBRElTMTYyNDBfTVNDX0NUUkxfREFUQV9SRFlfRElPMglCSVQoMCkKIAogLyogRElBR19TVEFUICovCiAvKiBBbGFybSAyIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCi0jZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfQUxBUk0yICAgICAgKDE8PDkpCisjZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfQUxBUk0yICAgICAgQklUKDkpCiAvKiBBbGFybSAxIHN0YXR1czogMSA9IGFsYXJtIGFjdGl2ZSwgMCA9IGFsYXJtIGluYWN0aXZlICovCi0jZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfQUxBUk0xICAgICAgKDE8PDgpCisjZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfQUxBUk0xICAgICAgQklUKDgpCiAvKiBDYXB0dXJlIGJ1ZmZlciBmdWxsOiAxID0gY2FwdHVyZSBidWZmZXIgaXMgZnVsbCAqLwotI2RlZmluZSBBRElTMTYyNDBfRElBR19TVEFUX0NQVF9CVUZfRlVMICgxPDw3KQorI2RlZmluZSBBRElTMTYyNDBfRElBR19TVEFUX0NQVF9CVUZfRlVMIEJJVCg3KQogLyogRmxhc2ggdGVzdCwgY2hlY2tzdW0gZmxhZzogMSA9IG1pc21hdGNoLCAwID0gbWF0Y2ggKi8KLSNkZWZpbmUgQURJUzE2MjQwX0RJQUdfU1RBVF9DSEtTVU0gICAgICAoMTw8NikKKyNkZWZpbmUgQURJUzE2MjQwX0RJQUdfU1RBVF9DSEtTVU0gICAgICBCSVQoNikKIC8qIFBvd2VyLW9uLCBzZWxmLXRlc3QgZmxhZzogMSA9IGZhaWx1cmUsIDAgPSBwYXNzICovCiAjZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfUFdST05fRkFJTF9CSVQgIDUKIC8qIFBvd2VyLW9uIHNlbGYtdGVzdDogMSA9IGluLXByb2dyZXNzLCAwID0gY29tcGxldGUgKi8KLSNkZWZpbmUgQURJUzE2MjQwX0RJQUdfU1RBVF9QV1JPTl9CVVNZICAoMTw8NCkKKyNkZWZpbmUgQURJUzE2MjQwX0RJQUdfU1RBVF9QV1JPTl9CVVNZICBCSVQoNCkKIC8qIFNQSSBjb21tdW5pY2F0aW9ucyBmYWlsdXJlICovCiAjZGVmaW5lIEFESVMxNjI0MF9ESUFHX1NUQVRfU1BJX0ZBSUxfQklUCTMKIC8qIEZsYXNoIHVwZGF0ZSBmYWlsdXJlICovCkBAIC0xMDksMTEgKzEwOSwxMSBAQAogI2RlZmluZSBBRElTMTYyNDBfRElBR19TVEFUX1BPV0VSX0xPV19CSVQJMAogCiAvKiBHTE9CX0NNRCAqLwotI2RlZmluZSBBRElTMTYyNDBfR0xPQl9DTURfUkVTVU1FCSgxPDw4KQotI2RlZmluZSBBRElTMTYyNDBfR0xPQl9DTURfU1dfUkVTRVQJKDE8PDcpCi0jZGVmaW5lIEFESVMxNjI0MF9HTE9CX0NNRF9TVEFOREJZCSgxPDwyKQorI2RlZmluZSBBRElTMTYyNDBfR0xPQl9DTURfUkVTVU1FCUJJVCg4KQorI2RlZmluZSBBRElTMTYyNDBfR0xPQl9DTURfU1dfUkVTRVQJQklUKDcpCisjZGVmaW5lIEFESVMxNjI0MF9HTE9CX0NNRF9TVEFOREJZCUJJVCgyKQogCi0jZGVmaW5lIEFESVMxNjI0MF9FUlJPUl9BQ1RJVkUgICAgICAgICAgKDE8PDE0KQorI2RlZmluZSBBRElTMTYyNDBfRVJST1JfQUNUSVZFICAgICAgICAgIEJJVCgxNCkKIAogLyogQXQgdGhlIG1vbWVudCB0cmlnZ2VycyBhcmUgb25seSB1c2VkIGZvciByaW5nIGJ1ZmZlcgogICogZmlsbGluZy4gVGhpcyBtYXkgY2hhbmdlIQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9hZGlzMTYyNDBfY29yZS5jCmluZGV4IDNmNDYwODYuLmNiMDc0ZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvYWRpczE2MjQwX2NvcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2FkaXMxNjI0MF9jb3JlLmMKQEAgLTI3LDkgKzI3LDkgQEAKICNpbmNsdWRlICJhZGlzMTYyNDAuaCIKIAogc3RhdGljIHNzaXplX3QgYWRpczE2MjQwX3NwaV9yZWFkX3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYsCi0JCXVuc2lnbmVkIGJpdHMpCisJCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJIGNoYXIgKmJ1ZiwKKwkJCQkJIHVuc2lnbmVkIGJpdHMpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkaXMgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKQEAgLTM5LDIwICszOSwyMCBAQAogCXN0cnVjdCBpaW9fZGV2X2F0dHIgKnRoaXNfYXR0ciA9IHRvX2lpb19kZXZfYXR0cihhdHRyKTsKIAogCXJldCA9IGFkaXNfcmVhZF9yZWdfMTYoc3QsCi0JCQkJCXRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOworCQkJICAgICAgIHRoaXNfYXR0ci0+YWRkcmVzcywgKHUxNiAqKSZ2YWwpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAodmFsICYgQURJUzE2MjQwX0VSUk9SX0FDVElWRSkKIAkJYWRpc19jaGVja19zdGF0dXMoc3QpOwogCi0JdmFsID0gKChzMTYpKHZhbCA8PCBzaGlmdCkgPj4gc2hpZnQpOworCXZhbCA9IChzMTYpKHZhbCA8PCBzaGlmdCkgPj4gc2hpZnQ7CiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHZhbCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkaXMxNjI0MF9yZWFkXzEyYml0X3NpZ25lZChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICBjaGFyICpidWYpCiB7CiAJc3NpemVfdCByZXQ7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CkBAIC0xNzYsMTEgKzE3NiwxNCBAQAogCUFESVNfU1VQUExZX0NIQU4oQURJUzE2MjQwX1NVUFBMWV9PVVQsIEFESVMxNjI0MF9TQ0FOX1NVUFBMWSwgMCwgMTApLAogCUFESVNfQVVYX0FEQ19DSEFOKEFESVMxNjI0MF9BVVhfQURDLCBBRElTMTYyNDBfU0NBTl9BVVhfQURDLCAwLCAxMCksCiAJQURJU19BQ0NFTF9DSEFOKFgsIEFESVMxNjI0MF9YQUNDTF9PVVQsIEFESVMxNjI0MF9TQ0FOX0FDQ19YLAotCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpIHwgQklUKElJT19DSEFOX0lORk9fUEVBSyksIDAsIDEwKSwKKwkJCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUykgfCBCSVQoSUlPX0NIQU5fSU5GT19QRUFLKSwKKwkJCTAsIDEwKSwKIAlBRElTX0FDQ0VMX0NIQU4oWSwgQURJUzE2MjQwX1lBQ0NMX09VVCwgQURJUzE2MjQwX1NDQU5fQUNDX1ksCi0JCUJJVChJSU9fQ0hBTl9JTkZPX0NBTElCQklBUykgfCBCSVQoSUlPX0NIQU5fSU5GT19QRUFLKSwgMCwgMTApLAorCQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1BFQUspLAorCQkJMCwgMTApLAogCUFESVNfQUNDRUxfQ0hBTihaLCBBRElTMTYyNDBfWkFDQ0xfT1VULCBBRElTMTYyNDBfU0NBTl9BQ0NfWiwKLQkJQklUKElJT19DSEFOX0lORk9fQ0FMSUJCSUFTKSB8IEJJVChJSU9fQ0hBTl9JTkZPX1BFQUspLCAwLCAxMCksCisJCQlCSVQoSUlPX0NIQU5fSU5GT19DQUxJQkJJQVMpIHwgQklUKElJT19DSEFOX0lORk9fUEVBSyksCisJCQkwLCAxMCksCiAJQURJU19URU1QX0NIQU4oQURJUzE2MjQwX1RFTVBfT1VULCBBRElTMTYyNDBfU0NBTl9URU1QLCAwLCAxMCksCiAJSUlPX0NIQU5fU09GVF9USU1FU1RBTVAoNikKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHEuaAppbmRleCAwYThlYTgyLi4zZjI0YzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxLmgKQEAgLTE5NCw2ICsxOTQsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGxpczNsMDJkcV9yZW1vdmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogfQorCiBzdGF0aWMgaW5saW5lIGludCBsaXMzbDAyZHFfcHJvYmVfdHJpZ2dlcihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCXJldHVybiAwOwpAQCAtMjAzLDYgKzIwNCw3IEBACiB7CiAJcmV0dXJuIDA7CiB9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBsaXMzbDAyZHFfdW5jb25maWd1cmVfYnVmZmVyKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYpCiB7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9jb3JlLmMKaW5kZXggYjc4YzljNS4uZWJjYWI1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX2NvcmUuYwpAQCAtNTU4LDEzICs1NTgsMTEgQEAKIAlJSU9fQ0hBTl9TT0ZUX1RJTUVTVEFNUCgzKQogfTsKIAotCiBzdGF0aWMgaW50IGxpczNsMDJkcV9yZWFkX2V2ZW50X2NvbmZpZyhzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAogCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWlvX2NoYW5fc3BlYyAqY2hhbiwKIAkJCQkgICAgICAgZW51bSBpaW9fZXZlbnRfdHlwZSB0eXBlLAogCQkJCSAgICAgICBlbnVtIGlpb19ldmVudF9kaXJlY3Rpb24gZGlyKQogewotCiAJdTggdmFsOwogCWludCByZXQ7CiAJdTggbWFzayA9ICgxIDw8IChjaGFuLT5jaGFubmVsMioyICsgKGRpciA9PSBJSU9fRVZfRElSX1JJU0lORykpKTsKQEAgLTY1Niw4ICs2NTQsOCBAQAogCQkJKGNvbnRyb2wgfCBMSVMzTDAyRFFfUkVHX0NUUkxfMl9FTkFCTEVfSU5URVJSVVBUKSA6CiAJCQkoY29udHJvbCAmIH5MSVMzTDAyRFFfUkVHX0NUUkxfMl9FTkFCTEVfSU5URVJSVVBUKTsKIAkJcmV0ID0gbGlzM2wwMmRxX3NwaV93cml0ZV9yZWdfOChpbmRpb19kZXYsCi0JCQkJCSAgICAgICBMSVMzTDAyRFFfUkVHX0NUUkxfMl9BRERSLAotCQkJCQkgICAgICAgY29udHJvbCk7CisJCQkJCQlMSVMzTDAyRFFfUkVHX0NUUkxfMl9BRERSLAorCQkJCQkJY29udHJvbCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIGVycm9yX3JldDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL2xpczNsMDJkcV9yaW5nLmMKaW5kZXggMWZkOTAwOS4uYjg5MmYyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9saXMzbDAyZHFfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvbGlzM2wwMmRxX3JpbmcuYwpAQCAtMTEwLDcgKzExMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgbGlzM2wwMmRxX2dldF9idWZmZXJfZWxlbWVudChzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LAotCQkJCXU4ICpidWYpCisJCQkJCXU4ICpidWYpCiB7CiAJaW50IHJldCwgaTsKIAl1OCAqcnhfYXJyYXk7CkBAIC0xMTgsOCArMTE4LDggQEAKIAlpbnQgc2Nhbl9jb3VudCA9IGJpdG1hcF93ZWlnaHQoaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrLAogCQkJCSAgICAgICBpbmRpb19kZXYtPm1hc2tsZW5ndGgpOwogCi0JcnhfYXJyYXkgPSBremFsbG9jKDQgKiBzY2FuX2NvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAocnhfYXJyYXkgPT0gTlVMTCkKKwlyeF9hcnJheSA9IGtjYWxsb2MoNCwgc2Nhbl9jb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyeF9hcnJheSkKIAkJcmV0dXJuIC1FTk9NRU07CiAJcmV0ID0gbGlzM2wwMmRxX3JlYWRfYWxsKGluZGlvX2RldiwgcnhfYXJyYXkpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0xNDIsNyArMTQyLDcgQEAKIAljaGFyICpkYXRhOwogCiAJZGF0YSA9IGttYWxsb2MoaW5kaW9fZGV2LT5zY2FuX2J5dGVzLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGF0YSA9PSBOVUxMKQorCWlmICghZGF0YSkKIAkJZ290byBkb25lOwogCiAJaWYgKCFiaXRtYXBfZW1wdHkoaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrLCBpbmRpb19kZXYtPm1hc2tsZW5ndGgpKQpAQCAtMzMwLDE5ICszMzAsMjEgQEAKIAlpZiAodGVzdF9iaXQoMCwgaW5kaW9fZGV2LT5hY3RpdmVfc2Nhbl9tYXNrKSkgewogCQl0IHw9IExJUzNMMDJEUV9SRUdfQ1RSTF8xX0FYRVNfWF9FTkFCTEU7CiAJCW9uZWVuYWJsZWQgPSB0cnVlOwotCX0gZWxzZQorCX0gZWxzZSB7CiAJCXQgJj0gfkxJUzNMMDJEUV9SRUdfQ1RSTF8xX0FYRVNfWF9FTkFCTEU7CisJfQogCWlmICh0ZXN0X2JpdCgxLCBpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2spKSB7CiAJCXQgfD0gTElTM0wwMkRRX1JFR19DVFJMXzFfQVhFU19ZX0VOQUJMRTsKIAkJb25lZW5hYmxlZCA9IHRydWU7Ci0JfSBlbHNlCisJfSBlbHNlIHsKIAkJdCAmPSB+TElTM0wwMkRRX1JFR19DVFJMXzFfQVhFU19ZX0VOQUJMRTsKKwl9CiAJaWYgKHRlc3RfYml0KDIsIGluZGlvX2Rldi0+YWN0aXZlX3NjYW5fbWFzaykpIHsKIAkJdCB8PSBMSVMzTDAyRFFfUkVHX0NUUkxfMV9BWEVTX1pfRU5BQkxFOwogCQlvbmVlbmFibGVkID0gdHJ1ZTsKLQl9IGVsc2UKKwl9IGVsc2UgewogCQl0ICY9IH5MSVMzTDAyRFFfUkVHX0NUUkxfMV9BWEVTX1pfRU5BQkxFOwotCisJfQogCWlmICghb25lZW5hYmxlZCkgLyogd2hhdCBoYXBwZW5zIGluIHRoaXMgY2FzZSBpcyB1bmtub3duICovCiAJCXJldHVybiAtRUlOVkFMOwogCXJldCA9IGxpczNsMDJkcV9zcGlfd3JpdGVfcmVnXzgoaW5kaW9fZGV2LApAQCAtNDEwLDcgKzQxMiw3IEBACiAJCQkJCQkgImxpczNsMDJkcV9jb25zdW1lciVkIiwKIAkJCQkJCSBpbmRpb19kZXYtPmlkKTsKIAotCWlmIChpbmRpb19kZXYtPnBvbGxmdW5jID09IE5VTEwpIHsKKwlpZiAoIWluZGlvX2Rldi0+cG9sbGZ1bmMpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9paW9fc3dfcmJfZnJlZTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDAuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCmluZGV4IGIyODRlNWEuLjljOGE5NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMC5oCkBAIC0zOCw2ICszOCw5IEBACiAgKiBDYW4gcHJvYmFibHkgYWxsZXZpYXRlIHRoaXMgYnkgcmVhZGluZyB0aGUgaW50ZXJydXB0IHJlZ2lzdGVyIG9uIHN0YXJ0LCBidXQKICAqIHRoYXQgaXMgcmVhbGx5IGp1c3QgYnJ1c2hpbmcgdGhlIHByb2JsZW0gdW5kZXIgdGhlIGNhcnBldC4KICAqLworI2lmbmRlZiBfU0NBMzAwMAorI2RlZmluZSBfU0NBMzAwMAorCiAjZGVmaW5lIFNDQTMwMDBfV1JJVEVfUkVHKGEpICgoKGEpIDw8IDIpIHwgMHgwMikKICNkZWZpbmUgU0NBMzAwMF9SRUFEX1JFRyhhKSAoKGEpIDw8IDIpCiAKQEAgLTI3Miw0ICsyNzUsNCBAQAogfQogCiAjZW5kaWYKLQorI2VuZGlmIC8qIF9TQ0EzMDAwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX2NvcmUuYwppbmRleCAzMWZiMjE4Li5iNjE0ZjI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9jb3JlLmMKQEAgLTg3MCw3ICs4NzAsNyBAQAogCQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJCSAgICBjaGFyICpidWYpCiB7Ci0JaW50IHJldCwgbGVuOworCWludCByZXQ7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IHNjYTMwMDBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpbnQgdmFsOwpAQCAtODgxLDkgKzg4MSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZzdC0+bG9jayk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JbGVuID0gc3ByaW50ZihidWYsICIlZFxuIiwKLQkJICAgICAgISEodmFsICYgU0NBMzAwMF9GUkVFX0ZBTExfREVURUNUKSk7Ci0JcmV0dXJuIGxlbjsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgISEodmFsICYgU0NBMzAwMF9GUkVFX0ZBTExfREVURUNUKSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX3JpbmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWNjZWwvc2NhMzAwMF9yaW5nLmMKaW5kZXggZjc2YTI2OC4uODU4OWVhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9hY2NlbC9zY2EzMDAwX3JpbmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FjY2VsL3NjYTMwMDBfcmluZy5jCkBAIC0xMjksOSArMTI5LDkgQEAKIAlyZXR1cm4gcmV0ID8gcmV0IDogbnVtX3JlYWQ7CiB9CiAKLXN0YXRpYyBib29sIHNjYTMwMDBfcmluZ19idWZfZGF0YV9hdmFpbGFibGUoc3RydWN0IGlpb19idWZmZXIgKnIpCitzdGF0aWMgc2l6ZV90IHNjYTMwMDBfcmluZ19idWZfZGF0YV9hdmFpbGFibGUoc3RydWN0IGlpb19idWZmZXIgKnIpCiB7Ci0JcmV0dXJuIHItPnN0dWZmdG9yZWFkOworCXJldHVybiByLT5zdHVmZnRvcmVhZCA/IHItPndhdGVybWFyayA6IDA7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MTkyLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxOTIuYwppbmRleCA2ZjhjZTZjLi5mZTU2ZmI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxOTIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcxOTIuYwpAQCAtNDEsMzIgKzQxLDMyIEBACiAJCQkJICAgKiAoUlcsIDE2LWJpdCAoQUQ3NzkyKS8yNC1iaXQgKEFENzE5MikpICovCiAKIC8qIENvbW11bmljYXRpb25zIFJlZ2lzdGVyIEJpdCBEZXNpZ25hdGlvbnMgKEFENzE5Ml9SRUdfQ09NTSkgKi8KLSNkZWZpbmUgQUQ3MTkyX0NPTU1fV0VOCQkoMSA8PCA3KSAvKiBXcml0ZSBFbmFibGUgKi8KLSNkZWZpbmUgQUQ3MTkyX0NPTU1fV1JJVEUJKDAgPDwgNikgLyogV3JpdGUgT3BlcmF0aW9uICovCi0jZGVmaW5lIEFENzE5Ml9DT01NX1JFQUQJKDEgPDwgNikgLyogUmVhZCBPcGVyYXRpb24gKi8KKyNkZWZpbmUgQUQ3MTkyX0NPTU1fV0VOCQlCSVQoNykgLyogV3JpdGUgRW5hYmxlICovCisjZGVmaW5lIEFENzE5Ml9DT01NX1dSSVRFCTAgLyogV3JpdGUgT3BlcmF0aW9uICovCisjZGVmaW5lIEFENzE5Ml9DT01NX1JFQUQJQklUKDYpIC8qIFJlYWQgT3BlcmF0aW9uICovCiAjZGVmaW5lIEFENzE5Ml9DT01NX0FERFIoeCkJKCgoeCkgJiAweDcpIDw8IDMpIC8qIFJlZ2lzdGVyIEFkZHJlc3MgKi8KLSNkZWZpbmUgQUQ3MTkyX0NPTU1fQ1JFQUQJKDEgPDwgMikgLyogQ29udGludW91cyBSZWFkIG9mIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQUQ3MTkyX0NPTU1fQ1JFQUQJQklUKDIpIC8qIENvbnRpbnVvdXMgUmVhZCBvZiBEYXRhIFJlZ2lzdGVyICovCiAKIC8qIFN0YXR1cyBSZWdpc3RlciBCaXQgRGVzaWduYXRpb25zIChBRDcxOTJfUkVHX1NUQVQpICovCi0jZGVmaW5lIEFENzE5Ml9TVEFUX1JEWQkJKDEgPDwgNykgLyogUmVhZHkgKi8KLSNkZWZpbmUgQUQ3MTkyX1NUQVRfRVJSCQkoMSA8PCA2KSAvKiBFcnJvciAoT3ZlcnJhbmdlLCBVbmRlcnJhbmdlKSAqLwotI2RlZmluZSBBRDcxOTJfU1RBVF9OT1JFRgkoMSA8PCA1KSAvKiBFcnJvciBubyBleHRlcm5hbCByZWZlcmVuY2UgKi8KLSNkZWZpbmUgQUQ3MTkyX1NUQVRfUEFSSVRZCSgxIDw8IDQpIC8qIFBhcml0eSAqLwotI2RlZmluZSBBRDcxOTJfU1RBVF9DSDMJCSgxIDw8IDIpIC8qIENoYW5uZWwgMyAqLwotI2RlZmluZSBBRDcxOTJfU1RBVF9DSDIJCSgxIDw8IDEpIC8qIENoYW5uZWwgMiAqLwotI2RlZmluZSBBRDcxOTJfU1RBVF9DSDEJCSgxIDw8IDApIC8qIENoYW5uZWwgMSAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9SRFkJCUJJVCg3KSAvKiBSZWFkeSAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9FUlIJCUJJVCg2KSAvKiBFcnJvciAoT3ZlcnJhbmdlLCBVbmRlcnJhbmdlKSAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9OT1JFRglCSVQoNSkgLyogRXJyb3Igbm8gZXh0ZXJuYWwgcmVmZXJlbmNlICovCisjZGVmaW5lIEFENzE5Ml9TVEFUX1BBUklUWQlCSVQoNCkgLyogUGFyaXR5ICovCisjZGVmaW5lIEFENzE5Ml9TVEFUX0NIMwkJQklUKDIpIC8qIENoYW5uZWwgMyAqLworI2RlZmluZSBBRDcxOTJfU1RBVF9DSDIJCUJJVCgxKSAvKiBDaGFubmVsIDIgKi8KKyNkZWZpbmUgQUQ3MTkyX1NUQVRfQ0gxCQlCSVQoMCkgLyogQ2hhbm5lbCAxICovCiAKIC8qIE1vZGUgUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3MTkyX1JFR19NT0RFKSAqLwogI2RlZmluZSBBRDcxOTJfTU9ERV9TRUwoeCkJKCgoeCkgJiAweDcpIDw8IDIxKSAvKiBPcGVyYXRpb24gTW9kZSBTZWxlY3QgKi8KICNkZWZpbmUgQUQ3MTkyX01PREVfU0VMX01BU0sJKDB4NyA8PCAyMSkgLyogT3BlcmF0aW9uIE1vZGUgU2VsZWN0IE1hc2sgKi8KLSNkZWZpbmUgQUQ3MTkyX01PREVfREFUX1NUQQkoMSA8PCAyMCkgLyogU3RhdHVzIFJlZ2lzdGVyIHRyYW5zbWlzc2lvbiAqLworI2RlZmluZSBBRDcxOTJfTU9ERV9EQVRfU1RBCUJJVCgyMCkgLyogU3RhdHVzIFJlZ2lzdGVyIHRyYW5zbWlzc2lvbiAqLwogI2RlZmluZSBBRDcxOTJfTU9ERV9DTEtTUkMoeCkJKCgoeCkgJiAweDMpIDw8IDE4KSAvKiBDbG9jayBTb3VyY2UgU2VsZWN0ICovCi0jZGVmaW5lIEFENzE5Ml9NT0RFX1NJTkMzCSgxIDw8IDE1KSAvKiBTSU5DMyBGaWx0ZXIgU2VsZWN0ICovCi0jZGVmaW5lIEFENzE5Ml9NT0RFX0FDWAkJKDEgPDwgMTQpIC8qIEFDIGV4Y2l0YXRpb24gZW5hYmxlKEFENzE5NSBvbmx5KSovCi0jZGVmaW5lIEFENzE5Ml9NT0RFX0VOUEFSCSgxIDw8IDEzKSAvKiBQYXJpdHkgRW5hYmxlICovCi0jZGVmaW5lIEFENzE5Ml9NT0RFX0NMS0RJVgkoMSA8PCAxMikgLyogQ2xvY2sgZGl2aWRlIGJ5IDIgKEFENzE5MC8yIG9ubHkpKi8KLSNkZWZpbmUgQUQ3MTkyX01PREVfU0NZQ0xFCSgxIDw8IDExKSAvKiBTaW5nbGUgY3ljbGUgY29udmVyc2lvbiAqLwotI2RlZmluZSBBRDcxOTJfTU9ERV9SRUo2MAkoMSA8PCAxMCkgLyogNTAvNjBIeiBub3RjaCBmaWx0ZXIgKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfU0lOQzMJQklUKDE1KSAvKiBTSU5DMyBGaWx0ZXIgU2VsZWN0ICovCisjZGVmaW5lIEFENzE5Ml9NT0RFX0FDWAkJQklUKDE0KSAvKiBBQyBleGNpdGF0aW9uIGVuYWJsZShBRDcxOTUgb25seSkqLworI2RlZmluZSBBRDcxOTJfTU9ERV9FTlBBUglCSVQoMTMpIC8qIFBhcml0eSBFbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfQ0xLRElWCUJJVCgxMikgLyogQ2xvY2sgZGl2aWRlIGJ5IDIgKEFENzE5MC8yIG9ubHkpKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfU0NZQ0xFCUJJVCgxMSkgLyogU2luZ2xlIGN5Y2xlIGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgQUQ3MTkyX01PREVfUkVKNjAJQklUKDEwKSAvKiA1MC82MEh6IG5vdGNoIGZpbHRlciAqLwogI2RlZmluZSBBRDcxOTJfTU9ERV9SQVRFKHgpCSgoeCkgJiAweDNGRikgLyogRmlsdGVyIFVwZGF0ZSBSYXRlIFNlbGVjdCAqLwogCiAvKiBNb2RlIFJlZ2lzdGVyOiBBRDcxOTJfTU9ERV9TRUwgb3B0aW9ucyAqLwpAQCAtOTEsMTQgKzkxLDE0IEBACiAKIC8qIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgQml0IERlc2lnbmF0aW9ucyAoQUQ3MTkyX1JFR19DT05GKSAqLwogCi0jZGVmaW5lIEFENzE5Ml9DT05GX0NIT1AJKDEgPDwgMjMpIC8qIENIT1AgZW5hYmxlICovCi0jZGVmaW5lIEFENzE5Ml9DT05GX1JFRlNFTAkoMSA8PCAyMCkgLyogUkVGSU4xL1JFRklOMiBSZWZlcmVuY2UgU2VsZWN0ICovCisjZGVmaW5lIEFENzE5Ml9DT05GX0NIT1AJQklUKDIzKSAvKiBDSE9QIGVuYWJsZSAqLworI2RlZmluZSBBRDcxOTJfQ09ORl9SRUZTRUwJQklUKDIwKSAvKiBSRUZJTjEvUkVGSU4yIFJlZmVyZW5jZSBTZWxlY3QgKi8KICNkZWZpbmUgQUQ3MTkyX0NPTkZfQ0hBTih4KQkoKCgxIDw8ICh4KSkgJiAweEZGKSA8PCA4KSAvKiBDaGFubmVsIHNlbGVjdCAqLwogI2RlZmluZSBBRDcxOTJfQ09ORl9DSEFOX01BU0sJKDB4RkYgPDwgOCkgLyogQ2hhbm5lbCBzZWxlY3QgbWFzayAqLwotI2RlZmluZSBBRDcxOTJfQ09ORl9CVVJOCSgxIDw8IDcpIC8qIEJ1cm5vdXQgY3VycmVudCBlbmFibGUgKi8KLSNkZWZpbmUgQUQ3MTkyX0NPTkZfUkVGREVUCSgxIDw8IDYpIC8qIFJlZmVyZW5jZSBkZXRlY3QgZW5hYmxlICovCi0jZGVmaW5lIEFENzE5Ml9DT05GX0JVRgkJKDEgPDwgNCkgLyogQnVmZmVyZWQgTW9kZSBFbmFibGUgKi8KLSNkZWZpbmUgQUQ3MTkyX0NPTkZfVU5JUE9MQVIJKDEgPDwgMykgLyogVW5pcG9sYXIvQmlwb2xhciBFbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0NPTkZfQlVSTglCSVQoNykgLyogQnVybm91dCBjdXJyZW50IGVuYWJsZSAqLworI2RlZmluZSBBRDcxOTJfQ09ORl9SRUZERVQJQklUKDYpIC8qIFJlZmVyZW5jZSBkZXRlY3QgZW5hYmxlICovCisjZGVmaW5lIEFENzE5Ml9DT05GX0JVRgkJQklUKDQpIC8qIEJ1ZmZlcmVkIE1vZGUgRW5hYmxlICovCisjZGVmaW5lIEFENzE5Ml9DT05GX1VOSVBPTEFSCUJJVCgzKSAvKiBVbmlwb2xhci9CaXBvbGFyIEVuYWJsZSAqLwogI2RlZmluZSBBRDcxOTJfQ09ORl9HQUlOKHgpCSgoeCkgJiAweDcpIC8qIEdhaW4gU2VsZWN0ICovCiAKICNkZWZpbmUgQUQ3MTkyX0NIX0FJTjFQX0FJTjJNCTAgLyogQUlOMSgrKSAtIEFJTjIoLSkgKi8KQEAgLTExNywxMyArMTE3LDEzIEBACiAjZGVmaW5lIEFENzE5Ml9JRF9NQVNLCQkweDBGCiAKIC8qIEdQT0NPTiBSZWdpc3RlciBCaXQgRGVzaWduYXRpb25zIChBRDcxOTJfUkVHX0dQT0NPTikgKi8KLSNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9CUERTVwkoMSA8PCA2KSAvKiBCcmlkZ2UgcG93ZXItZG93biBzd2l0Y2ggZW5hYmxlICovCi0jZGVmaW5lIEFENzE5Ml9HUE9DT05fR1AzMkVOCSgxIDw8IDUpIC8qIERpZ2l0YWwgT3V0cHV0IFAzIGFuZCBQMiBlbmFibGUgKi8KLSNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9HUDEwRU4JKDEgPDwgNCkgLyogRGlnaXRhbCBPdXRwdXQgUDEgYW5kIFAwIGVuYWJsZSAqLwotI2RlZmluZSBBRDcxOTJfR1BPQ09OX1AzREFUCSgxIDw8IDMpIC8qIFAzIHN0YXRlICovCi0jZGVmaW5lIEFENzE5Ml9HUE9DT05fUDJEQVQJKDEgPDwgMikgLyogUDIgc3RhdGUgKi8KLSNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9QMURBVAkoMSA8PCAxKSAvKiBQMSBzdGF0ZSAqLwotI2RlZmluZSBBRDcxOTJfR1BPQ09OX1AwREFUCSgxIDw8IDApIC8qIFAwIHN0YXRlICovCisjZGVmaW5lIEFENzE5Ml9HUE9DT05fQlBEU1cJQklUKDYpIC8qIEJyaWRnZSBwb3dlci1kb3duIHN3aXRjaCBlbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9HUDMyRU4JQklUKDUpIC8qIERpZ2l0YWwgT3V0cHV0IFAzIGFuZCBQMiBlbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9HUDEwRU4JQklUKDQpIC8qIERpZ2l0YWwgT3V0cHV0IFAxIGFuZCBQMCBlbmFibGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9QM0RBVAlCSVQoMykgLyogUDMgc3RhdGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9QMkRBVAlCSVQoMikgLyogUDIgc3RhdGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9QMURBVAlCSVQoMSkgLyogUDEgc3RhdGUgKi8KKyNkZWZpbmUgQUQ3MTkyX0dQT0NPTl9QMERBVAlCSVQoMCkgLyogUDAgc3RhdGUgKi8KIAogI2RlZmluZSBBRDcxOTJfSU5UX0ZSRVFfTUh6CTQ5MTUyMDAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5jCmluZGV4IDRkNDg3MDcuLmQ5OGUyMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI4MGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyODBhLmMKQEAgLTU1LDM3ICs1NSwzNyBAQAogI2RlZmluZSBBRDcyODBBX0NOVlNUX0NPTlRST0wJCTB4MUQgLyogRDcgdG8gRDAsIFJlYWQvd3JpdGUgKi8KIAogLyogQml0cyBhbmQgTWFza3MgKi8KLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfSU5QVVRfQUxMCQkJKDAgPDwgNikKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfSU5QVVRfNkNFTExfQVVYMV8zXzQJKDEgPDwgNikKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfSU5QVVRfNkNFTEwJCSgyIDw8IDYpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0lOUFVUX1NFTEZfVEVTVAkJKDMgPDwgNikKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfQUxMCQkoMCA8PCA0KQotI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9SRVNfUkVBRF82Q0VMTF9BVVgxXzNfNAkoMSA8PCA0KQotI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9SRVNfUkVBRF82Q0VMTAkJKDIgPDwgNCkKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfTk8JCSgzIDw8IDQpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX1NUQVJUX0NOVlNUCQkoMCA8PCAzKQotI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9TVEFSVF9DUwkJCSgxIDw8IDMpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0FWR19ESVMJCQkoMCA8PCAxKQotI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfMgkJCSgxIDw8IDEpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0FWR180CQkJKDIgPDwgMSkKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfQVZHXzgJCQkoMyA8PCAxKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9JTlBVVF9BTEwJCQkwCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0lOUFVUXzZDRUxMX0FVWDFfM180CUJJVCg2KQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9JTlBVVF82Q0VMTAkJQklUKDcpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0lOUFVUX1NFTEZfVEVTVAkJKEJJVCg3KSB8IEJJVCg2KSkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX0NPTlZfUkVTX1JFQURfQUxMCQkwCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX1JFU19SRUFEXzZDRUxMX0FVWDFfM180CUJJVCg0KQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9SRVNfUkVBRF82Q0VMTAkJQklUKDUpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX1JFU19SRUFEX05PCQkoQklUKDUpIHwgQklUKDQpKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9TVEFSVF9DTlZTVAkJMAorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9TVEFSVF9DUwkJCUJJVCgzKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfRElTCQkJMAorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfMgkJCUJJVCgxKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfNAkJCUJJVCgyKQorI2RlZmluZSBBRDcyODBBX0NUUkxfSEJfQ09OVl9BVkdfOAkJCShCSVQoMikgfCBCSVQoMSkpCiAjZGVmaW5lIEFENzI4MEFfQ1RSTF9IQl9DT05WX0FWRyh4KQkJCSgoeCkgPDwgMSkKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX1BXUkROX1NXCQkJKDEgPDwgMCkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0hCX1BXUkROX1NXCQkJQklUKDApCiAKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX1NXUlNUCQkJCSgxIDw8IDcpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRV80MDBucwkJCSgwIDw8IDUpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRV84MDBucwkJCSgxIDw8IDUpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRV8xMjAwbnMJCQkoMiA8PCA1KQotI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfQUNRX1RJTUVfMTYwMG5zCQkJKDMgPDwgNSkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX1NXUlNUCQkJCUJJVCg3KQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfQUNRX1RJTUVfNDAwbnMJCQkwCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRV84MDBucwkJCUJJVCg1KQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfQUNRX1RJTUVfMTIwMG5zCQkJQklUKDYpCisjZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9BQ1FfVElNRV8xNjAwbnMJCQkoQklUKDYpIHwgQklUKDUpKQogI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfQUNRX1RJTUUoeCkJCQkoKHgpIDw8IDUpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9NVVNUX1NFVAkJCSgxIDw8IDQpCi0jZGVmaW5lIEFENzI4MEFfQ1RSTF9MQl9USEVSTUlTVE9SX0VOCQkJKDEgPDwgMykKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX0xPQ0tfREVWX0FERFIJCQkoMSA8PCAyKQotI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfSU5DX0RFVl9BRERSCQkJKDEgPDwgMSkKLSNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX0RBSVNZX0NIQUlOX1JCX0VOCQkoMSA8PCAwKQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfTVVTVF9TRVQJCQlCSVQoNCkKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX1RIRVJNSVNUT1JfRU4JCQlCSVQoMykKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX0xPQ0tfREVWX0FERFIJCQlCSVQoMikKKyNkZWZpbmUgQUQ3MjgwQV9DVFJMX0xCX0lOQ19ERVZfQUREUgkJCUJJVCgxKQorI2RlZmluZSBBRDcyODBBX0NUUkxfTEJfREFJU1lfQ0hBSU5fUkJfRU4JCUJJVCgwKQogCi0jZGVmaW5lIEFENzI4MEFfQUxFUlRfR0VOX1NUQVRJQ19ISUdICQkJKDEgPDwgNikKLSNkZWZpbmUgQUQ3MjgwQV9BTEVSVF9SRUxBWV9TSUdfQ0hBSU5fRE9XTgkJKDMgPDwgNikKKyNkZWZpbmUgQUQ3MjgwQV9BTEVSVF9HRU5fU1RBVElDX0hJR0gJCQlCSVQoNikKKyNkZWZpbmUgQUQ3MjgwQV9BTEVSVF9SRUxBWV9TSUdfQ0hBSU5fRE9XTgkJKEJJVCg3KSB8IEJJVCg2KSkKIAogI2RlZmluZSBBRDcyODBBX0FMTF9DRUxMUwkJCQkoMHhBRCA8PCAxNikKIApAQCAtNTQ3LDggKzU0Nyw5IEBACiB7CiAJaW50IGRldiwgY2gsIGNudDsKIAotCXN0LT5paW9fYXR0ciA9IGt6YWxsb2Moc2l6ZW9mKCpzdC0+aWlvX2F0dHIpICogKHN0LT5zbGF2ZV9udW0gKyAxKSAqCi0JCQkJQUQ3MjgwQV9DRUxMU19QRVJfREVWICogMiwgR0ZQX0tFUk5FTCk7CisJc3QtPmlpb19hdHRyID0ga2NhbGxvYygyLCBzaXplb2YoKnN0LT5paW9fYXR0cikgKgorCQkJICAgICAgIChzdC0+c2xhdmVfbnVtICsgMSkgKiBBRDcyODBBX0NFTExTX1BFUl9ERVYsCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CiAJaWYgKHN0LT5paW9fYXR0ciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3MjgwYS5oCmluZGV4IDIwNDAwYjAuLjczMjM0N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzI4MGEuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDcyODBhLmgKQEAgLTIzLDEwICsyMywxMCBAQAogI2RlZmluZSBBRDcyODBBX0NPTlZfQVZHXzQJCQkyCiAjZGVmaW5lIEFENzI4MEFfQ09OVl9BVkdfOAkJCTMKIAotI2RlZmluZSBBRDcyODBBX0FMRVJUX1JFTU9WRV9WSU41CQkoMSA8PCAyKQotI2RlZmluZSBBRDcyODBBX0FMRVJUX1JFTU9WRV9WSU40X1ZJTjUJCSgyIDw8IDIpCi0jZGVmaW5lIEFENzI4MEFfQUxFUlRfUkVNT1ZFX0FVWDUJCSgxIDw8IDApCi0jZGVmaW5lIEFENzI4MEFfQUxFUlRfUkVNT1ZFX0FVWDRfQVVYNQkJKDIgPDwgMCkKKyNkZWZpbmUgQUQ3MjgwQV9BTEVSVF9SRU1PVkVfVklONQkJQklUKDIpCisjZGVmaW5lIEFENzI4MEFfQUxFUlRfUkVNT1ZFX1ZJTjRfVklONQkJQklUKDMpCisjZGVmaW5lIEFENzI4MEFfQUxFUlRfUkVNT1ZFX0FVWDUJCUJJVCgwKQorI2RlZmluZSBBRDcyODBBX0FMRVJUX1JFTU9WRV9BVVg0X0FVWDUJCUJJVCgxKQogCiBzdHJ1Y3QgYWQ3MjgwX3BsYXRmb3JtX2RhdGEgewogCXVuc2lnbmVkIGFjcXVpc2l0aW9uX3RpbWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDZfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NjA2X3JpbmcuYwppbmRleCAzYmYxNzRjLi5hNmY4ZWIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc2MDZfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vYWRjL2FkNzYwNl9yaW5nLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAlpbnQgcmV0OwogCiAJYnVmID0ga3phbGxvYyhpbmRpb19kZXYtPnNjYW5fYnl0ZXMsIEdGUF9LRVJORUwpOwotCWlmIChidWYgPT0gTlVMTCkKKwlpZiAoIWJ1ZikKIAkJcmV0dXJuOwogCiAJaWYgKGdwaW9faXNfdmFsaWQoc3QtPnBkYXRhLT5ncGlvX2Zyc3RkYXRhKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvYWQ3NzgwLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYwppbmRleCAyNzNhZGQzLi45ZjAzZmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9hZDc3ODAuYwpAQCAtMjQsMTQgKzI0LDE0IEBACiAKICNpbmNsdWRlICJhZDc3ODAuaCIKIAotI2RlZmluZSBBRDc3ODBfUkRZCSgxIDw8IDcpCi0jZGVmaW5lIEFENzc4MF9GSUxURVIJKDEgPDwgNikKLSNkZWZpbmUgQUQ3NzgwX0VSUgkoMSA8PCA1KQotI2RlZmluZSBBRDc3ODBfSUQxCSgxIDw8IDQpCi0jZGVmaW5lIEFENzc4MF9JRDAJKDEgPDwgMykKLSNkZWZpbmUgQUQ3NzgwX0dBSU4JKDEgPDwgMikKLSNkZWZpbmUgQUQ3NzgwX1BBVDEJKDEgPDwgMSkKLSNkZWZpbmUgQUQ3NzgwX1BBVDAJKDEgPDwgMCkKKyNkZWZpbmUgQUQ3NzgwX1JEWQlCSVQoNykKKyNkZWZpbmUgQUQ3NzgwX0ZJTFRFUglCSVQoNikKKyNkZWZpbmUgQUQ3NzgwX0VSUglCSVQoNSkKKyNkZWZpbmUgQUQ3NzgwX0lEMQlCSVQoNCkKKyNkZWZpbmUgQUQ3NzgwX0lEMAlCSVQoMykKKyNkZWZpbmUgQUQ3NzgwX0dBSU4JQklUKDIpCisjZGVmaW5lIEFENzc4MF9QQVQxCUJJVCgxKQorI2RlZmluZSBBRDc3ODBfUEFUMAlCSVQoMCkKIAogc3RydWN0IGFkNzc4MF9jaGlwX2luZm8gewogCXN0cnVjdCBpaW9fY2hhbl9zcGVjCWNoYW5uZWw7CkBAIC0xNjksNyArMTY5LDcgQEAKIAlpbnQgcmV0LCB2b2x0YWdlX3V2ID0gMDsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmc3BpLT5kZXYsIHNpemVvZigqc3QpKTsKLQlpZiAoaW5kaW9fZGV2ID09IE5VTEwpCisJaWYgKCFpbmRpb19kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvbXhzLWxyYWRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9teHMtbHJhZGMuYwppbmRleCA4MTYxNzQzLi5kN2M1MjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9teHMtbHJhZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9teHMtbHJhZGMuYwpAQCAtMjQzLDcgKzI0Myw3IEBACiAJICogYmUgc2FtcGxlZCBhcyByZWd1bGFyIExSQURDIGNoYW5uZWxzLiBUaGUgZHJpdmVyIHdpbGwgcmVmdXNlIGFueQogCSAqIGF0dGVtcHQgdG8gc2FtcGxlIHRoZXNlIGNoYW5uZWxzLgogCSAqLwotI2RlZmluZSBDSEFOX01BU0tfVE9VQ0hCVVRUT04JCSgweDMgPDwgMCkKKyNkZWZpbmUgQ0hBTl9NQVNLX1RPVUNIQlVUVE9OCQkoQklUKDEpIHwgQklUKDApKQogI2RlZmluZSBDSEFOX01BU0tfVE9VQ0hTQ1JFRU5fNFdJUkUJKDB4ZiA8PCAyKQogI2RlZmluZSBDSEFOX01BU0tfVE9VQ0hTQ1JFRU5fNVdJUkUJKDB4MWYgPDwgMikKIAllbnVtIG14c19scmFkY190cwl1c2VfdG91Y2hzY3JlZW47CkBAIC0yNjgsMjAgKzI2OCwyMCBAQAogfTsKIAogI2RlZmluZQlMUkFEQ19DVFJMMAkJCQkweDAwCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1RPVUNIX0RFVEVDVF9FTkFCTEUJKDEgPDwgMjMpCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1RPVUNIX1NDUkVFTl9UWVBFCSgxIDw8IDIyKQotIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9ZTk5TVwkvKiBZTSAqLwkoMSA8PCAyMSkKLSMgZGVmaW5lIExSQURDX0NUUkwwX01YMjhfWVBOU1cJLyogWVAgKi8JKDEgPDwgMjApCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1lQUFNXCS8qIFlQICovCSgxIDw8IDE5KQotIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9YTk5TVwkvKiBYTSAqLwkoMSA8PCAxOCkKLSMgZGVmaW5lIExSQURDX0NUUkwwX01YMjhfWE5QU1cJLyogWE0gKi8JKDEgPDwgMTcpCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1hQUFNXCS8qIFhQICovCSgxIDw8IDE2KQorIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9UT1VDSF9ERVRFQ1RfRU5BQkxFCUJJVCgyMykKKyMgZGVmaW5lIExSQURDX0NUUkwwX01YMjhfVE9VQ0hfU0NSRUVOX1RZUEUJQklUKDIyKQorIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9ZTk5TVwkvKiBZTSAqLwlCSVQoMjEpCisjIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1lQTlNXCS8qIFlQICovCUJJVCgyMCkKKyMgZGVmaW5lIExSQURDX0NUUkwwX01YMjhfWVBQU1cJLyogWVAgKi8JQklUKDE5KQorIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9YTk5TVwkvKiBYTSAqLwlCSVQoMTgpCisjIGRlZmluZSBMUkFEQ19DVFJMMF9NWDI4X1hOUFNXCS8qIFhNICovCUJJVCgxNykKKyMgZGVmaW5lIExSQURDX0NUUkwwX01YMjhfWFBQU1cJLyogWFAgKi8JQklUKDE2KQogCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1RPVUNIX0RFVEVDVF9FTkFCTEUJKDEgPDwgMjApCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1lNCQkJKDEgPDwgMTkpCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1hNCQkJKDEgPDwgMTgpCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1lQCQkJKDEgPDwgMTcpCi0jIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1hQCQkJKDEgPDwgMTYpCisjIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1RPVUNIX0RFVEVDVF9FTkFCTEUJQklUKDIwKQorIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyM19ZTQkJCUJJVCgxOSkKKyMgZGVmaW5lIExSQURDX0NUUkwwX01YMjNfWE0JCQlCSVQoMTgpCisjIGRlZmluZSBMUkFEQ19DVFJMMF9NWDIzX1lQCQkJQklUKDE3KQorIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyM19YUAkJCUJJVCgxNikKIAogIyBkZWZpbmUgTFJBRENfQ1RSTDBfTVgyOF9QTEFURV9NQVNLIFwKIAkJKExSQURDX0NUUkwwX01YMjhfVE9VQ0hfREVURUNUX0VOQUJMRSB8IFwKQEAgLTI5NSwxMiArMjk1LDEyIEBACiAJCUxSQURDX0NUUkwwX01YMjNfWVAgfCBMUkFEQ19DVFJMMF9NWDIzX1hQKQogCiAjZGVmaW5lCUxSQURDX0NUUkwxCQkJCTB4MTAKLSNkZWZpbmUJTFJBRENfQ1RSTDFfVE9VQ0hfREVURUNUX0lSUV9FTgkJKDEgPDwgMjQpCisjZGVmaW5lCUxSQURDX0NUUkwxX1RPVUNIX0RFVEVDVF9JUlFfRU4JCUJJVCgyNCkKICNkZWZpbmUJTFJBRENfQ1RSTDFfTFJBRENfSVJRX0VOKG4pCQkoMSA8PCAoKG4pICsgMTYpKQogI2RlZmluZQlMUkFEQ19DVFJMMV9NWDI4X0xSQURDX0lSUV9FTl9NQVNLCSgweDFmZmYgPDwgMTYpCiAjZGVmaW5lCUxSQURDX0NUUkwxX01YMjNfTFJBRENfSVJRX0VOX01BU0sJKDB4MDFmZiA8PCAxNikKICNkZWZpbmUJTFJBRENfQ1RSTDFfTFJBRENfSVJRX0VOX09GRlNFVAkJMTYKLSNkZWZpbmUJTFJBRENfQ1RSTDFfVE9VQ0hfREVURUNUX0lSUQkJKDEgPDwgOCkKKyNkZWZpbmUJTFJBRENfQ1RSTDFfVE9VQ0hfREVURUNUX0lSUQkJQklUKDgpCiAjZGVmaW5lCUxSQURDX0NUUkwxX0xSQURDX0lSUShuKQkJKDEgPDwgKG4pKQogI2RlZmluZQlMUkFEQ19DVFJMMV9NWDI4X0xSQURDX0lSUV9NQVNLCQkweDFmZmYKICNkZWZpbmUJTFJBRENfQ1RSTDFfTVgyM19MUkFEQ19JUlFfTUFTSwkJMHgwMWZmCkBAIC0zMDgsMTMgKzMwOCwxMyBAQAogCiAjZGVmaW5lCUxSQURDX0NUUkwyCQkJCTB4MjAKICNkZWZpbmUJTFJBRENfQ1RSTDJfRElWSURFX0JZX1RXT19PRkZTRVQJMjQKLSNkZWZpbmUJTFJBRENfQ1RSTDJfVEVNUFNFTlNFX1BXRAkJKDEgPDwgMTUpCisjZGVmaW5lCUxSQURDX0NUUkwyX1RFTVBTRU5TRV9QV0QJCUJJVCgxNSkKIAogI2RlZmluZQlMUkFEQ19TVEFUVVMJCQkJMHg0MAotI2RlZmluZQlMUkFEQ19TVEFUVVNfVE9VQ0hfREVURUNUX1JBVwkJKDEgPDwgMCkKKyNkZWZpbmUJTFJBRENfU1RBVFVTX1RPVUNIX0RFVEVDVF9SQVcJCUJJVCgwKQogCiAjZGVmaW5lCUxSQURDX0NIKG4pCQkJCSgweDUwICsgKDB4MTAgKiAobikpKQotI2RlZmluZQlMUkFEQ19DSF9BQ0NVTVVMQVRFCQkJKDEgPDwgMjkpCisjZGVmaW5lCUxSQURDX0NIX0FDQ1VNVUxBVEUJCQlCSVQoMjkpCiAjZGVmaW5lCUxSQURDX0NIX05VTV9TQU1QTEVTX01BU0sJCSgweDFmIDw8IDI0KQogI2RlZmluZQlMUkFEQ19DSF9OVU1fU0FNUExFU19PRkZTRVQJCTI0CiAjZGVmaW5lCUxSQURDX0NIX05VTV9TQU1QTEVTKHgpIFwKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCSAqLwogCW14c19scmFkY19yZWdfd3J0KGxyYWRjLAogCQlMUkFEQ19ERUxBWV9UUklHR0VSKDApIHwgLyogZG9uJ3QgdHJpZ2dlciBBREMgKi8KLQkJTFJBRENfREVMQVlfVFJJR0dFUl9ERUxBWVMoMSA8PCAzKSB8IC8qIHRyaWdnZXIgREVMQVkgdW5pdCMzICovCisJCUxSQURDX0RFTEFZX1RSSUdHRVJfREVMQVlTKEJJVCgzKSkgfCAvKiB0cmlnZ2VyIERFTEFZIHVuaXQjMyAqLwogCQlMUkFEQ19ERUxBWV9LSUNLIHwKIAkJTFJBRENfREVMQVlfREVMQVkobHJhZGMtPnNldHRsaW5nX2RlbGF5KSwKIAkJCUxSQURDX0RFTEFZKDIpKTsKQEAgLTUzMiw3ICs1MzIsNyBAQAogCSAqLwogCW14c19scmFkY19yZWdfd3J0KGxyYWRjLAogCQlMUkFEQ19ERUxBWV9UUklHR0VSKDApIHwgLyogZG9uJ3QgdHJpZ2dlciBBREMgKi8KLQkJTFJBRENfREVMQVlfVFJJR0dFUl9ERUxBWVMoMSA8PCAzKSB8IC8qIHRyaWdnZXIgREVMQVkgdW5pdCMzICovCisJCUxSQURDX0RFTEFZX1RSSUdHRVJfREVMQVlTKEJJVCgzKSkgfCAvKiB0cmlnZ2VyIERFTEFZIHVuaXQjMyAqLwogCQlMUkFEQ19ERUxBWV9LSUNLIHwKIAkJTFJBRENfREVMQVlfREVMQVkobHJhZGMtPnNldHRsaW5nX2RlbGF5KSwgTFJBRENfREVMQVkoMikpOwogfQpAQCAtODUwLDcgKzg1MCw3IEBACiAKIAkvKiBFbmFibGUgdGhlIElSUSBhbmQgc3RhcnQgc2FtcGxpbmcgdGhlIGNoYW5uZWwuICovCiAJbXhzX2xyYWRjX3JlZ19zZXQobHJhZGMsIExSQURDX0NUUkwxX0xSQURDX0lSUV9FTigwKSwgTFJBRENfQ1RSTDEpOwotCW14c19scmFkY19yZWdfc2V0KGxyYWRjLCAxIDw8IDAsIExSQURDX0NUUkwwKTsKKwlteHNfbHJhZGNfcmVnX3NldChscmFkYywgQklUKDApLCBMUkFEQ19DVFJMMCk7CiAKIAkvKiBXYWl0IGZvciBjb21wbGV0aW9uIG9uIHRoZSBjaGFubmVsLCAxIHNlY29uZCBtYXguICovCiAJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl9raWxsYWJsZV90aW1lb3V0KCZscmFkYy0+Y29tcGxldGlvbiwgSFopOwpAQCAtOTkzLDcgKzk5Myw3IEBACiAJaW50IGksIGxlbiA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShscmFkYy0+c2NhbGVfYXZhaWxbY2hdKTsgaSsrKQotCQlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICIlZC4lMDl1ICIsCisJCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIiV1LiUwOXUgIiwKIAkJCSAgICAgICBscmFkYy0+c2NhbGVfYXZhaWxbY2hdW2ldLmludGVnZXIsCiAJCQkgICAgICAgbHJhZGMtPnNjYWxlX2F2YWlsW2NoXVtpXS5uYW5vKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9hZGMvc3BlYXJfYWRjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9zcGVhcl9hZGMuYwppbmRleCA4YWQ3MTY5Li5jNTM4MjM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9zcGVhcl9hZGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2FkYy9zcGVhcl9hZGMuYwpAQCAtMjksMTEgKzI5LDExIEBACiAjZGVmaW5lIFNQRUFSX0FEQ19DTEtfSElHSCh4KQkJKCgoeCkgJiAweGYpIDw8IDQpCiAKIC8qIEJpdCBkZWZpbml0aW9ucyBmb3IgU1BFQVJfQURDX1NUQVRVUyAqLwotI2RlZmluZSBTUEVBUl9BRENfU1RBVFVTX1NUQVJUX0NPTlZFUlNJT04JKDEgPDwgMCkKKyNkZWZpbmUgU1BFQVJfQURDX1NUQVRVU19TVEFSVF9DT05WRVJTSU9OCUJJVCgwKQogI2RlZmluZSBTUEVBUl9BRENfU1RBVFVTX0NIQU5ORUxfTlVNKHgpCQkoKHgpIDw8IDEpCi0jZGVmaW5lIFNQRUFSX0FEQ19TVEFUVVNfQURDX0VOQUJMRQkJKDEgPDwgNCkKKyNkZWZpbmUgU1BFQVJfQURDX1NUQVRVU19BRENfRU5BQkxFCQlCSVQoNCkKICNkZWZpbmUgU1BFQVJfQURDX1NUQVRVU19BVkdfU0FNUExFKHgpCQkoKHgpIDw8IDUpCi0jZGVmaW5lIFNQRUFSX0FEQ19TVEFUVVNfVlJFRl9JTlRFUk5BTAkJKDEgPDwgOSkKKyNkZWZpbmUgU1BFQVJfQURDX1NUQVRVU19WUkVGX0lOVEVSTkFMCQlCSVQoOSkKIAogI2RlZmluZSBTUEVBUl9BRENfREFUQV9NQVNLCQkweDAzZmYKICNkZWZpbmUgU1BFQVJfQURDX0RBVEFfQklUUwkJMTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzMi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvYWQ5ODMyLmMKaW5kZXggY2Y2ODE1OS4uYTg2MWZlMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvYWQ5ODMyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvYWQ5ODMyLmMKQEAgLTI0LDggKzI0LDggQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgYWQ5ODMyX2NhbGNfZnJlcXJlZyh1bnNpZ25lZCBsb25nIG1jbGssIHVuc2lnbmVkIGxvbmcgZm91dCkKIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZnJlcXJlZyA9ICh1NjQpIGZvdXQgKgotCQkJCSAgICAgKHU2NCkgKCh1NjQpIDFMIDw8IEFEOTgzMl9GUkVRX0JJVFMpOworCXVuc2lnbmVkIGxvbmcgbG9uZyBmcmVxcmVnID0gKHU2NClmb3V0ICoKKwkJCQkgICAgICh1NjQpKCh1NjQpMUwgPDwgQUQ5ODMyX0ZSRVFfQklUUyk7CiAJZG9fZGl2KGZyZXFyZWcsIG1jbGspOwogCXJldHVybiBmcmVxcmVnOwogfQpAQCAtNTksNyArNTksNyBAQAogc3RhdGljIGludCBhZDk4MzJfd3JpdGVfcGhhc2Uoc3RydWN0IGFkOTgzMl9zdGF0ZSAqc3QsCiAJCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGhhc2UpCiB7Ci0JaWYgKHBoYXNlID4gKDEgPDwgQUQ5ODMyX1BIQVNFX0JJVFMpKQorCWlmIChwaGFzZSA+IEJJVChBRDk4MzJfUEhBU0VfQklUUykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3QtPnBoYXNlX2RhdGFbMF0gPSBjcHVfdG9fYmUxNigoQUQ5ODMyX0NNRF9QSEE4QklUU1cgPDwgQ01EX1NISUZUKSB8CkBAIC04Niw3ICs4Niw3IEBACiAJCWdvdG8gZXJyb3JfcmV0OwogCiAJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7Ci0Jc3dpdGNoICgodTMyKSB0aGlzX2F0dHItPmFkZHJlc3MpIHsKKwlzd2l0Y2ggKCh1MzIpdGhpc19hdHRyLT5hZGRyZXNzKSB7CiAJY2FzZSBBRDk4MzJfRlJFUTBITToKIAljYXNlIEFEOTgzMl9GUkVRMUhNOgogCQlyZXQgPSBhZDk4MzJfd3JpdGVfZnJlcXVlbmN5KHN0LCB0aGlzX2F0dHItPmFkZHJlc3MsIHZhbCk7CkBAIC0yMjAsNyArMjIwLDcgQEAKIAl9CiAKIAlpbmRpb19kZXYgPSBkZXZtX2lpb19kZXZpY2VfYWxsb2MoJnNwaS0+ZGV2LCBzaXplb2YoKnN0KSk7Ci0JaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7CisJaWYgKCFpbmRpb19kZXYpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9kaXNhYmxlX3JlZzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9hZDk4MzIuaCBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzMi5oCmluZGV4IDM4NmY0ZGMuLmQzMjMyM2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzMi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzMi5oCkBAIC00MiwxMyArNDIsMTMgQEAKICNkZWZpbmUgQUQ5ODMyX0NNRF9TWU5DU0VMU1JDCTB4OAogI2RlZmluZSBBRDk4MzJfQ01EX1NMRUVQUkVTQ0xSCTB4QwogCi0jZGVmaW5lIEFEOTgzMl9GUkVRCQkoMSA8PCAxMSkKKyNkZWZpbmUgQUQ5ODMyX0ZSRVEJCUJJVCgxMSkKICNkZWZpbmUgQUQ5ODMyX1BIQVNFKHgpCQkoKCh4KSAmIDMpIDw8IDkpCi0jZGVmaW5lIEFEOTgzMl9TWU5DCQkoMSA8PCAxMykKLSNkZWZpbmUgQUQ5ODMyX1NFTFNSQwkJKDEgPDwgMTIpCi0jZGVmaW5lIEFEOTgzMl9TTEVFUAkJKDEgPDwgMTMpCi0jZGVmaW5lIEFEOTgzMl9SRVNFVAkJKDEgPDwgMTIpCi0jZGVmaW5lIEFEOTgzMl9DTFIJCSgxIDw8IDExKQorI2RlZmluZSBBRDk4MzJfU1lOQwkJQklUKDEzKQorI2RlZmluZSBBRDk4MzJfU0VMU1JDCQlCSVQoMTIpCisjZGVmaW5lIEFEOTgzMl9TTEVFUAkJQklUKDEzKQorI2RlZmluZSBBRDk4MzJfUkVTRVQJCUJJVCgxMikKKyNkZWZpbmUgQUQ5ODMyX0NMUgkJQklUKDExKQogI2RlZmluZSBDTURfU0hJRlQJCTEyCiAjZGVmaW5lIEFERF9TSElGVAkJOAogI2RlZmluZSBBRDk4MzJfRlJFUV9CSVRTCTMyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9hZDk4MzQuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzNC5jCmluZGV4IDVjODAzMTkuLmQwMmJiNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzNC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vZnJlcXVlbmN5L2FkOTgzNC5jCkBAIC0yNyw3ICsyNyw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWQ5ODM0X2NhbGNfZnJlcXJlZyh1bnNpZ25lZCBsb25nIG1jbGssIHVuc2lnbmVkIGxvbmcgZm91dCkKIHsKLQl1bnNpZ25lZCBsb25nIGxvbmcgZnJlcXJlZyA9ICh1NjQpIGZvdXQgKiAodTY0KSAoMSA8PCBBRDk4MzRfRlJFUV9CSVRTKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZnJlcXJlZyA9ICh1NjQpZm91dCAqICh1NjQpQklUKEFEOTgzNF9GUkVRX0JJVFMpOwogCiAJZG9fZGl2KGZyZXFyZWcsIG1jbGspOwogCXJldHVybiBmcmVxcmVnOwpAQCAtNTMsOSArNTMsOSBAQAogfQogCiBzdGF0aWMgaW50IGFkOTgzNF93cml0ZV9waGFzZShzdHJ1Y3QgYWQ5ODM0X3N0YXRlICpzdCwKLQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwaGFzZSkKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBwaGFzZSkKIHsKLQlpZiAocGhhc2UgPiAoMSA8PCBBRDk4MzRfUEhBU0VfQklUUykpCisJaWYgKHBoYXNlID4gQklUKEFEOTgzNF9QSEFTRV9CSVRTKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJc3QtPmRhdGEgPSBjcHVfdG9fYmUxNihhZGRyIHwgcGhhc2UpOwogCkBAIC02Myw5ICs2Myw5IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkOTgzNF93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljb25zdCBjaGFyICpidWYsCi0JCXNpemVfdCBsZW4pCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLAorCQkJICAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtNzgsNyArNzgsNyBAQAogCQlnb3RvIGVycm9yX3JldDsKIAogCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwotCXN3aXRjaCAoKHUzMikgdGhpc19hdHRyLT5hZGRyZXNzKSB7CisJc3dpdGNoICgodTMyKXRoaXNfYXR0ci0+YWRkcmVzcykgewogCWNhc2UgQUQ5ODM0X1JFR19GUkVRMDoKIAljYXNlIEFEOTgzNF9SRUdfRlJFUTE6CiAJCXJldCA9IGFkOTgzNF93cml0ZV9mcmVxdWVuY3koc3QsIHRoaXNfYXR0ci0+YWRkcmVzcywgdmFsKTsKQEAgLTExMSw5ICsxMTEsOSBAQAogCQlicmVhazsKIAljYXNlIEFEOTgzNF9GU0VMOgogCWNhc2UgQUQ5ODM0X1BTRUw6Ci0JCWlmICh2YWwgPT0gMCkKKwkJaWYgKHZhbCA9PSAwKSB7CiAJCQlzdC0+Y29udHJvbCAmPSB+KHRoaXNfYXR0ci0+YWRkcmVzcyB8IEFEOTgzNF9QSU5fU1cpOwotCQllbHNlIGlmICh2YWwgPT0gMSkgeworCQl9IGVsc2UgaWYgKHZhbCA9PSAxKSB7CiAJCQlzdC0+Y29udHJvbCB8PSB0aGlzX2F0dHItPmFkZHJlc3M7CiAJCQlzdC0+Y29udHJvbCAmPSB+QUQ5ODM0X1BJTl9TVzsKIAkJfSBlbHNlIHsKQEAgLTE0Miw5ICsxNDIsOSBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBhZDk4MzRfc3RvcmVfd2F2ZXR5cGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY29uc3QgY2hhciAqYnVmLAotCQkJCSBzaXplX3QgbGVuKQorCQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgICBjb25zdCBjaGFyICpidWYsCisJCQkJICAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYgPSBkZXZfdG9faWlvX2RldihkZXYpOwogCXN0cnVjdCBhZDk4MzRfc3RhdGUgKnN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKQEAgLTE1NCw3ICsxNTQsNyBAQAogCiAJbXV0ZXhfbG9jaygmaW5kaW9fZGV2LT5tbG9jayk7CiAKLQlzd2l0Y2ggKCh1MzIpIHRoaXNfYXR0ci0+YWRkcmVzcykgeworCXN3aXRjaCAoKHUzMil0aGlzX2F0dHItPmFkZHJlc3MpIHsKIAljYXNlIDA6CiAJCWlmIChzeXNmc19zdHJlcShidWYsICJzaW5lIikpIHsKIAkJCXN0LT5jb250cm9sICY9IH5BRDk4MzRfTU9ERTsKQEAgLTE3OSw3ICsxNzksNyBAQAogCQlicmVhazsKIAljYXNlIDE6CiAJCWlmIChzeXNmc19zdHJlcShidWYsICJzcXVhcmUiKSAmJgotCQkJIShzdC0+Y29udHJvbCAmIEFEOTgzNF9NT0RFKSkgeworCQkgICAgIShzdC0+Y29udHJvbCAmIEFEOTgzNF9NT0RFKSkgewogCQkJc3QtPmNvbnRyb2wgJj0gfkFEOTgzNF9NT0RFOwogCQkJc3QtPmNvbnRyb2wgfD0gQUQ5ODM0X09QQklURU47CiAJCX0gZWxzZSB7CkBAIC0yMDAsOSArMjAwLDEwIEBACiAJcmV0dXJuIHJldCA/IHJldCA6IGxlbjsKIH0KIAotc3RhdGljIHNzaXplX3QgYWQ5ODM0X3Nob3dfb3V0MF93YXZldHlwZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCQljaGFyICpidWYpCitzdGF0aWMKK3NzaXplX3QgYWQ5ODM0X3Nob3dfb3V0MF93YXZldHlwZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMjE4LDEzICsyMTksMTMgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwgc3RyKTsKIH0KIAotCiBzdGF0aWMgSUlPX0RFVklDRV9BVFRSKG91dF9hbHR2b2x0YWdlMF9vdXQwX3dhdmV0eXBlX2F2YWlsYWJsZSwgU19JUlVHTywKIAkJICAgICAgIGFkOTgzNF9zaG93X291dDBfd2F2ZXR5cGVfYXZhaWxhYmxlLCBOVUxMLCAwKTsKIAotc3RhdGljIHNzaXplX3QgYWQ5ODM0X3Nob3dfb3V0MV93YXZldHlwZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJCQljaGFyICpidWYpCitzdGF0aWMKK3NzaXplX3QgYWQ5ODM0X3Nob3dfb3V0MV93YXZldHlwZV9hdmFpbGFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiA9IGRldl90b19paW9fZGV2KGRldik7CiAJc3RydWN0IGFkOTgzNF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMzM2LDcgKzMzNyw3IEBACiAJfQogCiAJaW5kaW9fZGV2ID0gZGV2bV9paW9fZGV2aWNlX2FsbG9jKCZzcGktPmRldiwgc2l6ZW9mKCpzdCkpOwotCWlmIChpbmRpb19kZXYgPT0gTlVMTCkgeworCWlmICghaW5kaW9fZGV2KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZGlzYWJsZV9yZWc7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvYWQ5ODM0LmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9hZDk4MzQuaAppbmRleCA4Y2E2ZTUyLi40MGZkZDVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9hZDk4MzQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9hZDk4MzQuaApAQCAtMTAsMzEgKzEwLDMxIEBACiAKIC8qIFJlZ2lzdGVycyAqLwogCi0jZGVmaW5lIEFEOTgzNF9SRUdfQ01ECQkoMCA8PCAxNCkKLSNkZWZpbmUgQUQ5ODM0X1JFR19GUkVRMAkoMSA8PCAxNCkKLSNkZWZpbmUgQUQ5ODM0X1JFR19GUkVRMQkoMiA8PCAxNCkKLSNkZWZpbmUgQUQ5ODM0X1JFR19QSEFTRTAJKDYgPDwgMTMpCi0jZGVmaW5lIEFEOTgzNF9SRUdfUEhBU0UxCSg3IDw8IDEzKQorI2RlZmluZSBBRDk4MzRfUkVHX0NNRAkJMAorI2RlZmluZSBBRDk4MzRfUkVHX0ZSRVEwCUJJVCgxNCkKKyNkZWZpbmUgQUQ5ODM0X1JFR19GUkVRMQlCSVQoMTUpCisjZGVmaW5lIEFEOTgzNF9SRUdfUEhBU0UwCShCSVQoMTUpIHwgQklUKDE0KSkKKyNkZWZpbmUgQUQ5ODM0X1JFR19QSEFTRTEJKEJJVCgxNSkgfCBCSVQoMTQpIHwgQklUKDEzKSkKIAogLyogQ29tbWFuZCBDb250cm9sIEJpdHMgKi8KIAotI2RlZmluZSBBRDk4MzRfQjI4CQkoMSA8PCAxMykKLSNkZWZpbmUgQUQ5ODM0X0hMQgkJKDEgPDwgMTIpCi0jZGVmaW5lIEFEOTgzNF9GU0VMCQkoMSA8PCAxMSkKLSNkZWZpbmUgQUQ5ODM0X1BTRUwJCSgxIDw8IDEwKQotI2RlZmluZSBBRDk4MzRfUElOX1NXCQkoMSA8PCA5KQotI2RlZmluZSBBRDk4MzRfUkVTRVQJCSgxIDw8IDgpCi0jZGVmaW5lIEFEOTgzNF9TTEVFUDEJCSgxIDw8IDcpCi0jZGVmaW5lIEFEOTgzNF9TTEVFUDEyCQkoMSA8PCA2KQotI2RlZmluZSBBRDk4MzRfT1BCSVRFTgkJKDEgPDwgNSkKLSNkZWZpbmUgQUQ5ODM0X1NJR05fUElCCQkoMSA8PCA0KQotI2RlZmluZSBBRDk4MzRfRElWMgkJKDEgPDwgMykKLSNkZWZpbmUgQUQ5ODM0X01PREUJCSgxIDw8IDEpCisjZGVmaW5lIEFEOTgzNF9CMjgJCUJJVCgxMykKKyNkZWZpbmUgQUQ5ODM0X0hMQgkJQklUKDEyKQorI2RlZmluZSBBRDk4MzRfRlNFTAkJQklUKDExKQorI2RlZmluZSBBRDk4MzRfUFNFTAkJQklUKDEwKQorI2RlZmluZSBBRDk4MzRfUElOX1NXCQlCSVQoOSkKKyNkZWZpbmUgQUQ5ODM0X1JFU0VUCQlCSVQoOCkKKyNkZWZpbmUgQUQ5ODM0X1NMRUVQMQkJQklUKDcpCisjZGVmaW5lIEFEOTgzNF9TTEVFUDEyCQlCSVQoNikKKyNkZWZpbmUgQUQ5ODM0X09QQklURU4JCUJJVCg1KQorI2RlZmluZSBBRDk4MzRfU0lHTl9QSUIJCUJJVCg0KQorI2RlZmluZSBBRDk4MzRfRElWMgkJQklUKDMpCisjZGVmaW5lIEFEOTgzNF9NT0RFCQlCSVQoMSkKIAogI2RlZmluZSBBRDk4MzRfRlJFUV9CSVRTCTI4CiAjZGVmaW5lIEFEOTgzNF9QSEFTRV9CSVRTCTEyCiAKLSNkZWZpbmUgUkVTX01BU0soYml0cykJKCgxIDw8IChiaXRzKSkgLSAxKQorI2RlZmluZSBSRVNfTUFTSyhiaXRzKQkoQklUKGJpdHMpIC0gMSkKIAogLyoqCiAgKiBzdHJ1Y3QgYWQ5ODM0X3N0YXRlIC0gZHJpdmVyIGluc3RhbmNlIHNwZWNpZmljIGRhdGEKQEAgLTY5LDcgKzY5LDYgQEAKIAlfX2JlMTYJCQkJZnJlcV9kYXRhWzJdOwogfTsKIAotCiAvKgogICogVE9ETzogc3RydWN0IGFkNzg4N19wbGF0Zm9ybV9kYXRhIG5lZWRzIHRvIGdvIGludG8gaW5jbHVkZS9saW51eC9paW8KICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvZGRzLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ZyZXF1ZW5jeS9kZHMuaAppbmRleCA2MTFlMmIwLi5mZTUzZTczMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvZGRzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9mcmVxdWVuY3kvZGRzLmgKQEAgLTUsNiArNSw4IEBACiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEdQTC0yIG9yIGxhdGVyLgogICovCisjaWZuZGVmIElJT19ERFNfSF8KKyNkZWZpbmUgSUlPX0REU19IXwogCiAvKioKICAqIC9zeXMvYnVzL2lpby9kZXZpY2VzLy4uLi9vdXRfYWx0dm9sdGFnZVhfZnJlcXVlbmN5WQpAQCAtMTA4LDMgKzExMCw1IEBACiAjZGVmaW5lIElJT19DT05TVF9BVFRSX09VVF9XQVZFVFlQRVNfQVZBSUxBQkxFKF9jaGFubmVsLCBfb3V0cHV0LCBfbW9kZXMpXAogCUlJT19DT05TVF9BVFRSKAkJCQkJCQlcCiAJb3V0X2FsdHZvbHRhZ2UjI19jaGFubmVsIyNfb3V0IyNfb3V0cHV0IyNfd2F2ZXR5cGVfYXZhaWxhYmxlLCBfbW9kZXMpCisKKyNlbmRpZiAvKiBJSU9fRERTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19kdW1teV9ldmdlbi5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fZHVtbXlfZXZnZW4uYwppbmRleCA1OWFkNWEzLi4wYzljODZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19kdW1teV9ldmdlbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX2R1bW15X2V2Z2VuLmMKQEAgLTcyLDcgKzcyLDcgQEAKIAlpbnQgcmV0LCBpOwogCiAJaWlvX2V2Z2VuID0ga3phbGxvYyhzaXplb2YoKmlpb19ldmdlbiksIEdGUF9LRVJORUwpOwotCWlmIChpaW9fZXZnZW4gPT0gTlVMTCkKKwlpZiAoIWlpb19ldmdlbikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlpaW9fZXZnZW4tPmJhc2UgPSBpcnFfYWxsb2NfZGVzY3MoLTEsIDAsIElJT19FVkVOVEdFTl9OTywgMCk7CkBAIC0xMDUsNyArMTA1LDcgQEAKIHsKIAlpbnQgaSwgcmV0ID0gMDsKIAotCWlmIChpaW9fZXZnZW4gPT0gTlVMTCkKKwlpZiAoIWlpb19ldmdlbikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAltdXRleF9sb2NrKCZpaW9fZXZnZW4tPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fc2ltcGxlX2R1bW15LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXkuYwppbmRleCBlNDUyMDIxLi5iNDdiZjlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXkuYwpAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiAjaW5jbHVkZSA8bGludXgvaWlvL2lpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lpby9zeXNmcy5oPgpAQCAtNTg5LDcgKzU4OCw3IEBACiAJICogZm9yIGNoaXAgc3BlY2lmaWMgc3RhdGUgaW5mb3JtYXRpb24uCiAJICovCiAJaW5kaW9fZGV2ID0gaWlvX2RldmljZV9hbGxvYyhzaXplb2YoKnN0KSk7Ci0JaWYgKGluZGlvX2RldiA9PSBOVUxMKSB7CisJaWYgKCFpbmRpb19kZXYpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fc2ltcGxlX2R1bW15X2J1ZmZlci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9paW9fc2ltcGxlX2R1bW15X2J1ZmZlci5jCmluZGV4IDM2MGE0YzkuLmE2NTFiODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vaWlvX3NpbXBsZV9kdW1teV9idWZmZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2lpb19zaW1wbGVfZHVtbXlfYnVmZmVyLmMKQEAgLTUwLDcgKzUwLDcgQEAKIAl1MTYgKmRhdGE7CiAKIAlkYXRhID0ga21hbGxvYyhpbmRpb19kZXYtPnNjYW5fYnl0ZXMsIEdGUF9LRVJORUwpOwotCWlmIChkYXRhID09IE5VTEwpCisJaWYgKCFkYXRhKQogCQlnb3RvIGRvbmU7CiAKIAlpZiAoIWJpdG1hcF9lbXB0eShpbmRpb19kZXYtPmFjdGl2ZV9zY2FuX21hc2ssIGluZGlvX2Rldi0+bWFza2xlbmd0aCkpIHsKQEAgLTEyMiw3ICsxMjIsNyBAQAogCiAJLyogQWxsb2NhdGUgYSBidWZmZXIgdG8gdXNlIC0gaGVyZSBhIGtmaWZvICovCiAJYnVmZmVyID0gaWlvX2tmaWZvX2FsbG9jYXRlKCk7Ci0JaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisJaWYgKCFidWZmZXIpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQpAQCAtMTYxLDcgKzE2MSw3IEBACiAJCQkJCQkgImlpb19zaW1wbGVfZHVtbXlfY29uc3VtZXIlZCIsCiAJCQkJCQkgaW5kaW9fZGV2LT5pZCk7CiAKLQlpZiAoaW5kaW9fZGV2LT5wb2xsZnVuYyA9PSBOVUxMKSB7CisJaWYgKCFpbmRpb19kZXYtPnBvbGxmdW5jKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV9idWZmZXI7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9pbXBlZGFuY2UtYW5hbHl6ZXIvYWQ1OTMzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltcGVkYW5jZS1hbmFseXplci9hZDU5MzMuYwppbmRleCA3OTE5NDM5Li5jMTgxMDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltcGVkYW5jZS1hbmFseXplci9hZDU5MzMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2ltcGVkYW5jZS1hbmFseXplci9hZDU5MzMuYwpAQCAtNzAzLDcgKzcwMyw3IEBACiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqc3QpKTsKLQlpZiAoaW5kaW9fZGV2ID09IE5VTEwpCisJaWYgKCFpbmRpb19kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAyOC5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC9pc2wyOTAyOC5jCmluZGV4IDY0NDBlM2IuLmU1YjJmZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvaXNsMjkwMjguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L2lzbDI5MDI4LmMKQEAgLTQ0MSwxNSArNDQxLDE1IEBACiAKIAlyZXQgPSBpc2wyOTAyOF9zZXRfcHJveGltX3NhbXBsaW5nKGNoaXAsIGNoaXAtPnByb3hfc2FtcGxpbmcpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY2hpcC0+ZGV2LCAiJXMoKTogc2V0dGluZyB0aGUgcHJveGltaXR5LCBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKGNoaXAtPmRldiwgInNldHRpbmcgdGhlIHByb3hpbWl0eSwgZXJyID0gJWRcbiIsCisJCQlyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IGlzbDI5MDI4X3NldF9hbHNfc2NhbGUoY2hpcCwgY2hpcC0+bHV4X3NjYWxlKTsKIAlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihjaGlwLT5kZXYsICIlcygpOiBzZXR0aW5nIGFscyBzY2FsZSBmYWlsZWQsIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7CisJCWRldl9lcnIoY2hpcC0+ZGV2LAorCQkJInNldHRpbmcgYWxzIHNjYWxlIGZhaWxlZCwgZXJyID0gJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyNTgzLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYwppbmRleCA4YWZhZThlLi5iNWUxYjhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDI1ODMuYwpAQCAtNDcxLDE0ICs0NzEsMTIgQEAKIHN0YXRpYyBpbnQgdGFvc19jaGlwX29mZihzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2KQogewogCXN0cnVjdCB0c2wyNTgzX2NoaXAgKmNoaXAgPSBpaW9fcHJpdihpbmRpb19kZXYpOwotCWludCByZXQ7CiAKIAkvKiB0dXJuIGRldmljZSBvZmYgKi8KIAljaGlwLT50YW9zX2NoaXBfc3RhdHVzID0gVFNMMjU4WF9DSElQX1NVU1BFTkRFRDsKLQlyZXQgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNoaXAtPmNsaWVudCwKKwlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjaGlwLT5jbGllbnQsCiAJCQkJCVRTTDI1OFhfQ01EX1JFRyB8IFRTTDI1OFhfQ05UUkwsCiAJCQkJCTB4MDApOwotCXJldHVybiByZXQ7CiB9CiAKIC8qIFN5c2ZzIEludGVyZmFjZSBGdW5jdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMng3eF9jb3JlLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL2xpZ2h0L3RzbDJ4N3hfY29yZS5jCmluZGV4IDRhNWRjMjYuLjAxMGU2MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbGlnaHQvdHNsMng3eF9jb3JlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9saWdodC90c2wyeDd4X2NvcmUuYwpAQCAtMzAxLDggKzMwMSw3IEBACiAJLyogc2VsZWN0IHJlZ2lzdGVyIHRvIHdyaXRlICovCiAJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCAoVFNMMlg3WF9DTURfUkVHIHwgcmVnKSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogZmFpbGVkIHRvIHdyaXRlIHJlZ2lzdGVyICV4XG4iCi0JCQkJLCBfX2Z1bmNfXywgcmVnKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJmYWlsZWQgdG8gd3JpdGUgcmVnaXN0ZXIgJXhcbiIsIHJlZyk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zMTEsOCArMzEwLDcgQEAKIAlpZiAocmV0ID49IDApCiAJCSp2YWwgPSAodTgpcmV0OwogCWVsc2UKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogZmFpbGVkIHRvIHJlYWQgcmVnaXN0ZXIgJXhcbiIKLQkJCQkJCSwgX19mdW5jX18sIHJlZyk7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmFpbGVkIHRvIHJlYWQgcmVnaXN0ZXIgJXhcbiIsIHJlZyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzc3LDcgKzM3NSw3IEBACiAJCQkmYnVmW2ldKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LAotCQkJCSIlczogZmFpbGVkIHRvIHJlYWQuIGVycj0leFxuIiwgX19mdW5jX18sIHJldCk7CisJCQkJImZhaWxlZCB0byByZWFkLiBlcnI9JXhcbiIsIHJldCk7CiAJCQlnb3RvIG91dF91bmxvY2s7CiAJCX0KIAl9CkBAIC0zODksOCArMzg3LDcgQEAKIAkJCQlUU0wyWDdYX0NNRF9BTFNfSU5UX0NMUikpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LAotCQkiJXM6IGkyY193cml0ZV9jb21tYW5kIGZhaWxlZCAtIGVyciA9ICVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7CisJCQkiaTJjX3dyaXRlX2NvbW1hbmQgZmFpbGVkIC0gZXJyID0gJWRcbiIsIHJldCk7CiAJCWdvdG8gb3V0X3VubG9jazsgLyogaGF2ZSBubyBkYXRhLCBzbyByZXR1cm4gZmFpbHVyZSAqLwogCX0KIApAQCAtNDkzLDggKzQ5MCw3IEBACiAJcmV0ID0gdHNsMng3eF9pMmNfcmVhZChjaGlwLT5jbGllbnQsCiAJCShUU0wyWDdYX0NNRF9SRUcgfCBUU0wyWDdYX1NUQVRVUyksICZzdGF0dXMpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LAotCQkiJXM6IGkyYyBlcnI9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwgImkyYyBlcnI9JWRcbiIsIHJldCk7CiAJCWdvdG8gcHJveF9wb2xsX2VycjsKIAl9CiAKQEAgLTU4Myw4ICs1NzksNyBAQAogCQkJKFRTTDJYN1hfQ01EX1JFRyB8IFRTTDJYN1hfQ05UUkwpKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKCZjaGlwLT5jbGllbnQtPmRldiwKLQkJIiVzOiBmYWlsZWQgdG8gd3JpdGUgQ05UUkwgcmVnaXN0ZXIsIHJldD0lZFxuIiwKLQkJX19mdW5jX18sIHJldCk7CisJCQkiZmFpbGVkIHRvIHdyaXRlIENOVFJMIHJlZ2lzdGVyLCByZXQ9JWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC02MDAsOCArNTk1LDcgQEAKIAkJCShUU0wyWDdYX0NNRF9SRUcgfCBUU0wyWDdYX0NOVFJMKSk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCi0JCQkiJXM6IGZhaWxlZCB0byB3cml0ZSBjdHJsIHJlZzogcmV0PSVkXG4iLAotCQkJX19mdW5jX18sIHJldCk7CisJCQkiZmFpbGVkIHRvIHdyaXRlIGN0cmwgcmVnOiByZXQ9JWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC02MTksOCArNjEzLDggQEAKIAkJcmV0dXJuIGx1eF92YWw7CiAJfQogCi0JZ2Fpbl90cmltX3ZhbCA9ICAoKChjaGlwLT50c2wyeDd4X3NldHRpbmdzLmFsc19jYWxfdGFyZ2V0KQotCQkJKiBjaGlwLT50c2wyeDd4X3NldHRpbmdzLmFsc19nYWluX3RyaW0pIC8gbHV4X3ZhbCk7CisJZ2Fpbl90cmltX3ZhbCA9ICAoKGNoaXAtPnRzbDJ4N3hfc2V0dGluZ3MuYWxzX2NhbF90YXJnZXQpCisJCQkqIGNoaXAtPnRzbDJ4N3hfc2V0dGluZ3MuYWxzX2dhaW5fdHJpbSkgLyBsdXhfdmFsOwogCWlmICgoZ2Fpbl90cmltX3ZhbCA8IDI1MCkgfHwgKGdhaW5fdHJpbV92YWwgPiA0MDAwKSkKIAkJcmV0dXJuIC1FUkFOR0U7CiAKQEAgLTcyMCw3ICs3MTQsNyBAQAogCQkJCVRTTDJYN1hfQ01EX1JFRyArIGksICpkZXZfcmVnKyspOwogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCi0JCQkiJXM6IGZhaWxlZCBvbiB3cml0ZSB0byByZWcgJWQuXG4iLCBfX2Z1bmNfXywgaSk7CisJCQkJImZhaWxlZCBvbiB3cml0ZSB0byByZWcgJWQuXG4iLCBpKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC04NzEsOCArODY1LDggQEAKIAogCWlmIChjaGlwLT50c2wyeDd4X3NldHRpbmdzLnByb3hfbWF4X3NhbXBsZXNfY2FsID4gTUFYX1NBTVBMRVNfQ0FMKSB7CiAJCWRldl9lcnIoJmNoaXAtPmNsaWVudC0+ZGV2LAotCQkJIiVzOiBtYXggcHJveCBzYW1wbGVzIGNhbCBpcyB0b28gYmlnOiAlZFxuIiwKLQkJCV9fZnVuY19fLCBjaGlwLT50c2wyeDd4X3NldHRpbmdzLnByb3hfbWF4X3NhbXBsZXNfY2FsKTsKKwkJCSJtYXggcHJveCBzYW1wbGVzIGNhbCBpcyB0b28gYmlnOiAlZFxuIiwKKwkJCWNoaXAtPnRzbDJ4N3hfc2V0dGluZ3MucHJveF9tYXhfc2FtcGxlc19jYWwpOwogCQljaGlwLT50c2wyeDd4X3NldHRpbmdzLnByb3hfbWF4X3NhbXBsZXNfY2FsID0gTUFYX1NBTVBMRVNfQ0FMOwogCX0KIApAQCAtMTU2Myw4ICsxNTU3LDggQEAKIAkJVFNMMlg3WF9DTURfUFJPWEFMU19JTlRfQ0xSKTsKIAlpZiAocmV0IDwgMCkKIAkJZGV2X2VycigmY2hpcC0+Y2xpZW50LT5kZXYsCi0JCQkiJXM6IEZhaWxlZCB0byBjbGVhciBpcnEgZnJvbSBldmVudCBoYW5kbGVyLiBlcnIgPSAlZFxuIiwKLQkJCV9fZnVuY19fLCByZXQpOworCQkJIkZhaWxlZCB0byBjbGVhciBpcnEgZnJvbSBldmVudCBoYW5kbGVyLiBlcnIgPSAlZFxuIiwKKwkJCXJldCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0xODkzLDggKzE4ODcsOCBAQAogCiAJcmV0ID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50cCwgKFRTTDJYN1hfQ01EX1JFRyB8IFRTTDJYN1hfQ05UUkwpKTsKIAlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKCZjbGllbnRwLT5kZXYsICIlczogd3JpdGUgdG8gY21kIHJlZyBmYWlsZWQuIGVyciA9ICVkXG4iLAotCQkJCV9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKCZjbGllbnRwLT5kZXYsICJ3cml0ZSB0byBjbWQgcmVnIGZhaWxlZC4gZXJyID0gJWRcbiIsCisJCQlyZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvaG1jNTg0My5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvaG1jNTg0My5oCmluZGV4IGI3ODRlM2UuLmYzZDBkYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzLmgKQEAgLTEwLDcgKzEwLDYgQEAKICAqCiAgKiAqLwogCi0KICNpZm5kZWYgSE1DNTg0M19DT1JFX0gKICNkZWZpbmUgSE1DNTg0M19DT1JFX0gKIApAQCAtMzIsMTYgKzMxLDI0IEBACiAJSE1DNTk4M19JRCwKIH07CiAKKy8qKgorICogc3RydWN0IGhjbTU4NDNfZGF0YQktIGRldmljZSBzcGVjaWZpYyBkYXRhCisgKiBAZGV2OgkJYWN0dWFsIGRldmljZQorICogQGxvY2s6CQl1cGRhdGUgYW5kIHJlYWQgcmVnbWFwIGRhdGEKKyAqIEByZWdtYXA6CQloYXJkd2FyZSBhY2Nlc3MgcmVnaXN0ZXIgbWFwcworICogQHZhcmlhbnQ6CQlkZXNjcmliZSBjaGlwIHZhcmlhbnRzCisgKiBAYnVmZmVyOgkJM3ggMTYtYml0IGNoYW5uZWxzICsgcGFkZGluZyArIDY0LWJpdCB0aW1lc3RhbXAKKyAqKi8KIHN0cnVjdCBobWM1ODQzX2RhdGEgewogCXN0cnVjdCBkZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbXV0ZXggbG9jazsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAJY29uc3Qgc3RydWN0IGhtYzU4NDNfY2hpcF9pbmZvICp2YXJpYW50OwotCV9fYmUxNiBidWZmZXJbOF07IC8qIDN4IDE2LWJpdCBjaGFubmVscyArIHBhZGRpbmcgKyA2NC1iaXQgdGltZXN0YW1wICovCisJX19iZTE2IGJ1ZmZlcls4XTsKIH07CiAKIGludCBobWM1ODQzX2NvbW1vbl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKLQkJZW51bSBobWM1ODQzX2lkcyBpZCk7CisJCQkgZW51bSBobWM1ODQzX2lkcyBpZCk7CiBpbnQgaG1jNTg0M19jb21tb25fcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldik7CiAKIGludCBobWM1ODQzX2NvbW1vbl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfY29yZS5jCmluZGV4IGZkMTcxZDguLmZmZmNhM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfY29yZS5jCkBAIC0xLDI1ICsxLDI1IEBACi0vKiAgQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzCi0gICAgQXV0aG9yOiBTaHViaHJhanlvdGkgRGF0dGEgPHNodWJocmFqeW90aUB0aS5jb20+Ci0gICAgQWNrbm93bGVkZ2VtZW50OiBKb25hdGhhbiBDYW1lcm9uIDxqaWMyM0BrZXJuZWwub3JnPiBmb3IgdmFsdWFibGUgaW5wdXRzLgotCi0gICAgU3VwcG9ydCBmb3IgSE1DNTg4MyBhbmQgSE1DNTg4M0wgYnkgUGV0ZXIgTWVlcndhbGQgPHBtZWVyd0BwbWVlcncubmV0Pi4KLQotICAgIFNwbGl0IHRvIG11bHRpcGxlIGZpbGVzIGJ5IEpvc2VmIEdhamR1c2VrIDxhdHhAYXR4Lm5hbWU+IC0gMjAxNAotCi0gICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0KLSAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCi0qLworLyoKKyAqIERldmljZSBkcml2ZXIgZm9yIHRoZSB0aGUgSE1DNTg0MyBtdWx0aS1jaGlwIG1vZHVsZSBkZXNpZ25lZAorICogZm9yIGxvdyBmaWVsZCBtYWduZXRpYyBzZW5zaW5nLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cworICoKKyAqIEF1dGhvcjogU2h1YmhyYWp5b3RpIERhdHRhIDxzaHViaHJhanlvdGlAdGkuY29tPgorICogQWNrbm93bGVkZ21lbnQ6IEpvbmF0aGFuIENhbWVyb24gPGppYzIzQGtlcm5lbC5vcmc+IGZvciB2YWx1YWJsZSBpbnB1dHMuCisgKiBTdXBwb3J0IGZvciBITUM1ODgzIGFuZCBITUM1ODgzTCBieSBQZXRlciBNZWVyd2FsZCA8cG1lZXJ3QHBtZWVydy5uZXQ+LgorICogU3BsaXQgdG8gbXVsdGlwbGUgZmlsZXMgYnkgSm9zZWYgR2FqZHVzZWsgPGF0eEBhdHgubmFtZT4gLSAyMDE0CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CkBAIC0xMjIsNyArMTIyLDcgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkYXRhLT5yZWdtYXAsIEhNQzU4NDNfTU9ERV9SRUcsCi0JCQlITUM1ODQzX01PREVfTUFTSywgb3BlcmF0aW5nX21vZGUpOworCQkJCSBITUM1ODQzX01PREVfTUFTSywgb3BlcmF0aW5nX21vZGUpOwogCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTY1LDcgKzE2NSw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCXJldCA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLCBITUM1ODQzX0RBVEFfT1VUX01TQl9SRUdTLAotCQkJdmFsdWVzLCBzaXplb2YodmFsdWVzKSk7CisJCQkgICAgICAgdmFsdWVzLCBzaXplb2YodmFsdWVzKSk7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTE5OCwxNSArMTk4LDE2IEBACiAKIAltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKIAlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZGF0YS0+cmVnbWFwLCBITUM1ODQzX0NPTkZJR19SRUdfQSwKLQkJCUhNQzU4NDNfTUVBU19DT05GX01BU0ssIG1lYXNfY29uZik7CisJCQkJIEhNQzU4NDNfTUVBU19DT05GX01BU0ssIG1lYXNfY29uZik7CiAJbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGhtYzU4NDNfc2hvd19tZWFzdXJlbWVudF9jb25maWd1cmF0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCQkJY2hhciAqYnVmKQorc3RhdGljCitzc2l6ZV90IGhtYzU4NDNfc2hvd19tZWFzdXJlbWVudF9jb25maWd1cmF0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgICAgY2hhciAqYnVmKQogewogCXN0cnVjdCBobWM1ODQzX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihkZXZfdG9faWlvX2RldihkZXYpKTsKIAl1bnNpZ25lZCBpbnQgdmFsOwpAQCAtMjIwLDEwICsyMjEsMTEgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgdmFsKTsKIH0KIAotc3RhdGljIHNzaXplX3QgaG1jNTg0M19zZXRfbWVhc3VyZW1lbnRfY29uZmlndXJhdGlvbihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkJCWNvbnN0IGNoYXIgKmJ1ZiwKLQkJCQkJCXNpemVfdCBjb3VudCkKK3N0YXRpYworc3NpemVfdCBobWM1ODQzX3NldF9tZWFzdXJlbWVudF9jb25maWd1cmF0aW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCQkJICAgICAgc2l6ZV90IGNvdW50KQogewogCXN0cnVjdCBobWM1ODQzX2RhdGEgKmRhdGEgPSBpaW9fcHJpdihkZXZfdG9faWlvX2RldihkZXYpKTsKIAl1bnNpZ25lZCBsb25nIG1lYXNfY29uZiA9IDA7CkBAIC0yNDYsOCArMjQ4LDkgQEAKIAkJCWhtYzU4NDNfc2V0X21lYXN1cmVtZW50X2NvbmZpZ3VyYXRpb24sCiAJCQkwKTsKIAotc3RhdGljIHNzaXplX3QgaG1jNTg0M19zaG93X3NhbXBfZnJlcV9hdmFpbChzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3N0YXRpYworc3NpemVfdCBobWM1ODQzX3Nob3dfc2FtcF9mcmVxX2F2YWlsKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CiAJc3RydWN0IGhtYzU4NDNfZGF0YSAqZGF0YSA9IGlpb19wcml2KGRldl90b19paW9fZGV2KGRldikpOwogCXNpemVfdCBsZW4gPSAwOwpAQCAtMjcyLDIwICsyNzUsMjEgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkYXRhLT5yZWdtYXAsIEhNQzU4NDNfQ09ORklHX1JFR19BLAotCQkJSE1DNTg0M19SQVRFX01BU0ssIHJhdGUgPDwgSE1DNTg0M19SQVRFX09GRlNFVCk7CisJCQkJIEhNQzU4NDNfUkFURV9NQVNLLAorCQkJCSByYXRlIDw8IEhNQzU4NDNfUkFURV9PRkZTRVQpOwogCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGhtYzU4NDNfZ2V0X3NhbXBfZnJlcV9pbmRleChzdHJ1Y3QgaG1jNTg0M19kYXRhICpkYXRhLAotCQkJCSAgIGludCB2YWwsIGludCB2YWwyKQorCQkJCSAgICAgICBpbnQgdmFsLCBpbnQgdmFsMikKIHsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBkYXRhLT52YXJpYW50LT5uX3JlZ3ZhbF90b19zYW1wX2ZyZXE7IGkrKykKIAkJaWYgKHZhbCA9PSBkYXRhLT52YXJpYW50LT5yZWd2YWxfdG9fc2FtcF9mcmVxW2ldWzBdICYmCi0JCQl2YWwyID09IGRhdGEtPnZhcmlhbnQtPnJlZ3ZhbF90b19zYW1wX2ZyZXFbaV1bMV0pCisJCSAgICB2YWwyID09IGRhdGEtPnZhcmlhbnQtPnJlZ3ZhbF90b19zYW1wX2ZyZXFbaV1bMV0pCiAJCQlyZXR1cm4gaTsKIAogCXJldHVybiAtRUlOVkFMOwpAQCAtMjk3LDE1ICszMDEsMTYgQEAKIAogCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkYXRhLT5yZWdtYXAsIEhNQzU4NDNfQ09ORklHX1JFR19CLAotCQkJSE1DNTg0M19SQU5HRV9HQUlOX01BU0ssCi0JCQlyYW5nZSA8PCBITUM1ODQzX1JBTkdFX0dBSU5fT0ZGU0VUKTsKKwkJCQkgSE1DNTg0M19SQU5HRV9HQUlOX01BU0ssCisJCQkJIHJhbmdlIDw8IEhNQzU4NDNfUkFOR0VfR0FJTl9PRkZTRVQpOwogCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3NpemVfdCBobWM1ODQzX3Nob3dfc2NhbGVfYXZhaWwoc3RydWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpCiB7CiAJc3RydWN0IGhtYzU4NDNfZGF0YSAqZGF0YSA9IGlpb19wcml2KGRldl90b19paW9fZGV2KGRldikpOwogCkBAIC0zOTYsNyArNDAxLDggQEAKIH0KIAogc3RhdGljIGludCBobWM1ODQzX3dyaXRlX3Jhd19nZXRfZm10KHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCi0JCQkgICAgICAgc3RydWN0IGlpb19jaGFuX3NwZWMgY29uc3QgKmNoYW4sIGxvbmcgbWFzaykKKwkJCQkgICAgIHN0cnVjdCBpaW9fY2hhbl9zcGVjIGNvbnN0ICpjaGFuLAorCQkJCSAgICAgbG9uZyBtYXNrKQogewogCXN3aXRjaCAobWFzaykgewogCWNhc2UgSUlPX0NIQU5fSU5GT19TQU1QX0ZSRVE6CkBAIC00MjMsMTQgKzQyOSwxNCBAQAogCX0KIAogCXJldCA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLCBITUM1ODQzX0RBVEFfT1VUX01TQl9SRUdTLAotCQkJZGF0YS0+YnVmZmVyLCAzICogc2l6ZW9mKF9fYmUxNikpOworCQkJICAgICAgIGRhdGEtPmJ1ZmZlciwgMyAqIHNpemVvZihfX2JlMTYpKTsKIAogCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZG9uZTsKIAogCWlpb19wdXNoX3RvX2J1ZmZlcnNfd2l0aF90aW1lc3RhbXAoaW5kaW9fZGV2LCBkYXRhLT5idWZmZXIsCi0JCWlpb19nZXRfdGltZV9ucygpKTsKKwkJCQkJICAgaWlvX2dldF90aW1lX25zKCkpOwogCiBkb25lOgogCWlpb190cmlnZ2VyX25vdGlmeV9kb25lKGluZGlvX2Rldi0+dHJpZyk7CkBAIC01MjYsNyArNTMyLDcgQEAKIAl1OCBpZFszXTsKIAogCXJldCA9IHJlZ21hcF9idWxrX3JlYWQoZGF0YS0+cmVnbWFwLCBITUM1ODQzX0lEX1JFRywKLQkJCWlkLCBBUlJBWV9TSVpFKGlkKSk7CisJCQkgICAgICAgaWQsIEFSUkFZX1NJWkUoaWQpKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAlpZiAoaWRbMF0gIT0gJ0gnIHx8IGlkWzFdICE9ICc0JyB8fCBpZFsyXSAhPSAnMycpIHsKQEAgLTU1Niw3ICs1NjIsNiBAQAogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBobWM1ODQzX3NjYW5fbWFza3NbXSA9IHsweDcsIDB9OwogCi0KIGludCBobWM1ODQzX2NvbW1vbl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gaG1jNTg0M19zZXRfbW9kZShpaW9fcHJpdihkZXZfZ2V0X2RydmRhdGEoZGV2KSksCkBAIC01NjcsMTkgKzU3MiwxOSBAQAogaW50IGhtYzU4NDNfY29tbW9uX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIGhtYzU4NDNfc2V0X21vZGUoaWlvX3ByaXYoZGV2X2dldF9kcnZkYXRhKGRldikpLAotCQkJSE1DNTg0M19NT0RFX1NMRUVQKTsKKwkJCQlITUM1ODQzX01PREVfU0xFRVApOwogfQogRVhQT1JUX1NZTUJPTChobWM1ODQzX2NvbW1vbl9yZXN1bWUpOwogCiBpbnQgaG1jNTg0M19jb21tb25fcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVnbWFwICpyZWdtYXAsCi0JCWVudW0gaG1jNTg0M19pZHMgaWQpCisJCQkgZW51bSBobWM1ODQzX2lkcyBpZCkKIHsKIAlzdHJ1Y3QgaG1jNTg0M19kYXRhICpkYXRhOwogCXN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXY7CiAJaW50IHJldDsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYyhkZXYsIHNpemVvZigqZGF0YSkpOwotCWlmIChpbmRpb19kZXYgPT0gTlVMTCkKKwlpZiAoIWluZGlvX2RldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBpbmRpb19kZXYpOwpAQCAtNTkyLDYgKzU5Nyw3IEBACiAJbXV0ZXhfaW5pdCgmZGF0YS0+bG9jayk7CiAKIAlpbmRpb19kZXYtPmRldi5wYXJlbnQgPSBkZXY7CisJaW5kaW9fZGV2LT5uYW1lID0gZGV2LT5kcml2ZXItPm5hbWU7CiAJaW5kaW9fZGV2LT5pbmZvID0gJmhtYzU4NDNfaW5mbzsKIAlpbmRpb19kZXYtPm1vZGVzID0gSU5ESU9fRElSRUNUX01PREU7CiAJaW5kaW9fZGV2LT5jaGFubmVscyA9IGRhdGEtPnZhcmlhbnQtPmNoYW5uZWxzOwpAQCAtNjAzLDkgKzYwOSw5IEBACiAJCXJldHVybiByZXQ7CiAKIAlyZXQgPSBpaW9fdHJpZ2dlcmVkX2J1ZmZlcl9zZXR1cChpbmRpb19kZXYsIE5VTEwsCi0JCWhtYzU4NDNfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKKwkJCQkJIGhtYzU4NDNfdHJpZ2dlcl9oYW5kbGVyLCBOVUxMKTsKIAlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBidWZmZXJfc2V0dXBfZXJyOwogCiAJcmV0ID0gaWlvX2RldmljZV9yZWdpc3RlcihpbmRpb19kZXYpOwogCWlmIChyZXQgPCAwKQpAQCAtNjE1LDYgKzYyMSw4IEBACiAKIGJ1ZmZlcl9jbGVhbnVwOgogCWlpb190cmlnZ2VyZWRfYnVmZmVyX2NsZWFudXAoaW5kaW9fZGV2KTsKK2J1ZmZlcl9zZXR1cF9lcnI6CisJaG1jNTg0M19zZXRfbW9kZShpaW9fcHJpdihpbmRpb19kZXYpLCBITUM1ODQzX01PREVfU0xFRVApOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGhtYzU4NDNfY29tbW9uX3Byb2JlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfaTJjLmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzX2kyYy5jCmluZGV4IDZhY2Q2MTQuLmZmMDg2NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfaTJjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvaG1jNTg0M19pMmMuYwpAQCAtMTksNDggKzE5LDQ4IEBACiAjaW5jbHVkZSAiaG1jNTg0My5oIgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9yYW5nZSBobWM1ODQzX3JlYWRhYmxlX3Jhbmdlc1tdID0gewotCQlyZWdtYXBfcmVnX3JhbmdlKDAsIEhNQzU4NDNfSURfRU5EKSwKKwlyZWdtYXBfcmVnX3JhbmdlKDAsIEhNQzU4NDNfSURfRU5EKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVnbWFwX2FjY2Vzc190YWJsZSBobWM1ODQzX3JlYWRhYmxlX3RhYmxlID0gewotCQkueWVzX3JhbmdlcyA9IGhtYzU4NDNfcmVhZGFibGVfcmFuZ2VzLAotCQkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShobWM1ODQzX3JlYWRhYmxlX3JhbmdlcyksCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M19yZWFkYWJsZV90YWJsZSA9IHsKKwkueWVzX3JhbmdlcyA9IGhtYzU4NDNfcmVhZGFibGVfcmFuZ2VzLAorCS5uX3llc19yYW5nZXMgPSBBUlJBWV9TSVpFKGhtYzU4NDNfcmVhZGFibGVfcmFuZ2VzKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlIGhtYzU4NDNfd3JpdGFibGVfcmFuZ2VzW10gPSB7Ci0JCXJlZ21hcF9yZWdfcmFuZ2UoMCwgSE1DNTg0M19NT0RFX1JFRyksCisJcmVnbWFwX3JlZ19yYW5nZSgwLCBITUM1ODQzX01PREVfUkVHKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVnbWFwX2FjY2Vzc190YWJsZSBobWM1ODQzX3dyaXRhYmxlX3RhYmxlID0gewotCQkueWVzX3JhbmdlcyA9IGhtYzU4NDNfd3JpdGFibGVfcmFuZ2VzLAotCQkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShobWM1ODQzX3dyaXRhYmxlX3JhbmdlcyksCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M193cml0YWJsZV90YWJsZSA9IHsKKwkueWVzX3JhbmdlcyA9IGhtYzU4NDNfd3JpdGFibGVfcmFuZ2VzLAorCS5uX3llc19yYW5nZXMgPSBBUlJBWV9TSVpFKGhtYzU4NDNfd3JpdGFibGVfcmFuZ2VzKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX3JhbmdlIGhtYzU4NDNfdm9sYXRpbGVfcmFuZ2VzW10gPSB7Ci0JCXJlZ21hcF9yZWdfcmFuZ2UoSE1DNTg0M19EQVRBX09VVF9NU0JfUkVHUywgSE1DNTg0M19TVEFUVVNfUkVHKSwKKwlyZWdtYXBfcmVnX3JhbmdlKEhNQzU4NDNfREFUQV9PVVRfTVNCX1JFR1MsIEhNQzU4NDNfU1RBVFVTX1JFRyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M192b2xhdGlsZV90YWJsZSA9IHsKLQkJLnllc19yYW5nZXMgPSBobWM1ODQzX3ZvbGF0aWxlX3JhbmdlcywKLQkJLm5feWVzX3JhbmdlcyA9IEFSUkFZX1NJWkUoaG1jNTg0M192b2xhdGlsZV9yYW5nZXMpLAorc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfYWNjZXNzX3RhYmxlIGhtYzU4NDNfdm9sYXRpbGVfdGFibGUgPSB7CisJLnllc19yYW5nZXMgPSBobWM1ODQzX3ZvbGF0aWxlX3JhbmdlcywKKwkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShobWM1ODQzX3ZvbGF0aWxlX3JhbmdlcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgaG1jNTg0M19pMmNfcmVnbWFwX2NvbmZpZyA9IHsKLQkJLnJlZ19iaXRzID0gOCwKLQkJLnZhbF9iaXRzID0gOCwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBobWM1ODQzX2kyY19yZWdtYXBfY29uZmlnID0geworCS5yZWdfYml0cyA9IDgsCisJLnZhbF9iaXRzID0gOCwKIAotCQkucmRfdGFibGUgPSAmaG1jNTg0M19yZWFkYWJsZV90YWJsZSwKLQkJLndyX3RhYmxlID0gJmhtYzU4NDNfd3JpdGFibGVfdGFibGUsCi0JCS52b2xhdGlsZV90YWJsZSA9ICZobWM1ODQzX3ZvbGF0aWxlX3RhYmxlLAorCS5yZF90YWJsZSA9ICZobWM1ODQzX3JlYWRhYmxlX3RhYmxlLAorCS53cl90YWJsZSA9ICZobWM1ODQzX3dyaXRhYmxlX3RhYmxlLAorCS52b2xhdGlsZV90YWJsZSA9ICZobWM1ODQzX3ZvbGF0aWxlX3RhYmxlLAogCi0JCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfUkJUUkVFLAogfTsKIAotc3RhdGljIGludCBobWM1ODQzX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAotCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgaG1jNTg0M19pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQogewotCXJldHVybiBobWM1ODQzX2NvbW1vbl9wcm9iZSgmY2xpZW50LT5kZXYsCi0JCQlkZXZtX3JlZ21hcF9pbml0X2kyYyhjbGllbnQsICZobWM1ODQzX2kyY19yZWdtYXBfY29uZmlnKSwKKwlyZXR1cm4gaG1jNTg0M19jb21tb25fcHJvYmUoJmNsaS0+ZGV2LAorCQkJZGV2bV9yZWdtYXBfaW5pdF9pMmMoY2xpLCAmaG1jNTg0M19pMmNfcmVnbWFwX2NvbmZpZyksCiAJCQlpZC0+ZHJpdmVyX2RhdGEpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzX3NwaS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tYWduZXRvbWV0ZXIvaG1jNTg0M19zcGkuYwppbmRleCA5OGM0YjU3Li44ZTY1OGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21hZ25ldG9tZXRlci9obWM1ODQzX3NwaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWFnbmV0b21ldGVyL2htYzU4NDNfc3BpLmMKQEAgLTE5LDcgKzE5LDcgQEAKIAkJcmVnbWFwX3JlZ19yYW5nZSgwLCBITUM1ODQzX0lEX0VORCksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M19yZWFkYWJsZV90YWJsZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2FjY2Vzc190YWJsZSBobWM1ODQzX3JlYWRhYmxlX3RhYmxlID0gewogCQkueWVzX3JhbmdlcyA9IGhtYzU4NDNfcmVhZGFibGVfcmFuZ2VzLAogCQkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShobWM1ODQzX3JlYWRhYmxlX3JhbmdlcyksCiB9OwpAQCAtMjgsNyArMjgsNyBAQAogCQlyZWdtYXBfcmVnX3JhbmdlKDAsIEhNQzU4NDNfTU9ERV9SRUcpLAogfTsKIAotc3RhdGljIHN0cnVjdCByZWdtYXBfYWNjZXNzX3RhYmxlIGhtYzU4NDNfd3JpdGFibGVfdGFibGUgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M193cml0YWJsZV90YWJsZSA9IHsKIAkJLnllc19yYW5nZXMgPSBobWM1ODQzX3dyaXRhYmxlX3JhbmdlcywKIAkJLm5feWVzX3JhbmdlcyA9IEFSUkFZX1NJWkUoaG1jNTg0M193cml0YWJsZV9yYW5nZXMpLAogfTsKQEAgLTM3LDEyICszNywxMiBAQAogCQlyZWdtYXBfcmVnX3JhbmdlKEhNQzU4NDNfREFUQV9PVVRfTVNCX1JFR1MsIEhNQzU4NDNfU1RBVFVTX1JFRyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9hY2Nlc3NfdGFibGUgaG1jNTg0M192b2xhdGlsZV90YWJsZSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2FjY2Vzc190YWJsZSBobWM1ODQzX3ZvbGF0aWxlX3RhYmxlID0gewogCQkueWVzX3JhbmdlcyA9IGhtYzU4NDNfdm9sYXRpbGVfcmFuZ2VzLAogCQkubl95ZXNfcmFuZ2VzID0gQVJSQVlfU0laRShobWM1ODQzX3ZvbGF0aWxlX3JhbmdlcyksCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlZ21hcF9jb25maWcgaG1jNTg0M19zcGlfcmVnbWFwX2NvbmZpZyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBobWM1ODQzX3NwaV9yZWdtYXBfY29uZmlnID0gewogCQkucmVnX2JpdHMgPSA4LAogCQkudmFsX2JpdHMgPSA4LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1My5jCmluZGV4IDc4ZThmNTYuLmZmYzdmMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1My5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1My5jCkBAIC00MTEsNyArNDExLDcgQEAKIAogCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCi0JdCA9ICgyNzkwMCAvIHZhbCk7CisJdCA9IDI3OTAwIC8gdmFsOwogCWlmICh0ID4gMCkKIAkJdC0tOwogCkBAIC01MTcsMTEgKzUxNyw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGlpb19kZXZpY2VfcmVnaXN0ZXIoaW5kaW9fZGV2KTsKIH0KIAogLyogZml4bWUsIGNvbmZpcm0gb3JkZXJpbmcgaW4gdGhpcyBmdW5jdGlvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU0LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYwppbmRleCA4MWY2NzMxLi5mMTJiMmU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTQuYwpAQCAtMjE2LDkgKzIxNiwxMyBAQAogCiBzdGF0aWMgaW50IGFkZTc3NTRfcmVzZXQoc3RydWN0IGRldmljZSAqZGV2KQogeworCWludCByZXQ7CiAJdTggdmFsOwogCi0JYWRlNzc1NF9zcGlfcmVhZF9yZWdfOChkZXYsIEFERTc3NTRfT1BNT0RFLCAmdmFsKTsKKwlyZXQgPSBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KGRldiwgQURFNzc1NF9PUE1PREUsICZ2YWwpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJdmFsIHw9IDEgPDwgNjsgLyogU29mdHdhcmUgQ2hpcCBSZXNldCAqLwogCXJldHVybiBhZGU3NzU0X3NwaV93cml0ZV9yZWdfOChkZXYsIEFERTc3NTRfT1BNT0RFLCB2YWwpOwogfQpAQCAtMzYyLDkgKzM2NiwxNiBAQAogLyogUG93ZXIgZG93biB0aGUgZGV2aWNlICovCiBzdGF0aWMgaW50IGFkZTc3NTRfc3RvcF9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQogeworCWludCByZXQ7CiAJdTggdmFsOwogCi0JYWRlNzc1NF9zcGlfcmVhZF9yZWdfOChkZXYsIEFERTc3NTRfT1BNT0RFLCAmdmFsKTsKKwlyZXQgPSBhZGU3NzU0X3NwaV9yZWFkX3JlZ184KGRldiwgQURFNzc1NF9PUE1PREUsICZ2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHBvd2VyIGRvd24gdGhlIGRldmljZSwgZXJyb3I6ICVkIiwKKwkJCXJldCk7CisJCXJldHVybiByZXQ7CisJfQorCiAJdmFsIHw9IDcgPDwgMzsgIC8qIEFERTc3NTQgcG93ZXJlZCBkb3duICovCiAJcmV0dXJuIGFkZTc3NTRfc3BpX3dyaXRlX3JlZ184KGRldiwgQURFNzc1NF9PUE1PREUsIHZhbCk7CiB9CkBAIC00MzIsNyArNDQzLDcgQEAKIAogCW11dGV4X2xvY2soJmluZGlvX2Rldi0+bWxvY2spOwogCi0JdCA9ICgyNjAwMCAvIHZhbCk7CisJdCA9IDI2MDAwIC8gdmFsOwogCWlmICh0ID4gMCkKIAkJdC0tOwogCkBAIC01MzksMTIgKzU1MCwxNSBAQAogCS8qIEdldCB0aGUgZGV2aWNlIGludG8gYSBzYW5lIGluaXRpYWwgc3RhdGUgKi8KIAlyZXQgPSBhZGU3NzU0X2luaXRpYWxfc2V0dXAoaW5kaW9fZGV2KTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIHBvd2VyZG93bl9vbl9lcnJvcjsKIAlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CiAJaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwkJZ290byBwb3dlcmRvd25fb25fZXJyb3I7CisJcmV0dXJuIHJldDsKIAotCXJldHVybiAwOworcG93ZXJkb3duX29uX2Vycm9yOgorCWFkZTc3NTRfc3RvcF9kZXZpY2UoJmluZGlvX2Rldi0+ZGV2KTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBmaXhtZSwgY29uZmlybSBvcmRlcmluZyBpbiB0aGlzIGZ1bmN0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X2NvcmUuYwppbmRleCA3MGU5NmIyLi43NzE0MWFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9jb3JlLmMKQEAgLTMwMywxNCArMzAzLDE1IEBACiAJaW50IHJldDsKIAl1OCB2YWw7CiAKLQlhZGU3NzU4X3NwaV9yZWFkX3JlZ184KGRldiwKLQkJCUFERTc3NThfT1BNT0RFLAotCQkJJnZhbCk7CisJcmV0ID0gYWRlNzc1OF9zcGlfcmVhZF9yZWdfOChkZXYsIEFERTc3NThfT1BNT0RFLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIG9wbW9kZSByZWdcbiIpOworCQlyZXR1cm4gcmV0OworCX0KIAl2YWwgfD0gMSA8PCA2OyAvKiBTb2Z0d2FyZSBDaGlwIFJlc2V0ICovCi0JcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoZGV2LAotCQkJQURFNzc1OF9PUE1PREUsCi0JCQl2YWwpOwotCisJcmV0ID0gYWRlNzc1OF9zcGlfd3JpdGVfcmVnXzgoZGV2LCBBREU3NzU4X09QTU9ERSwgdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gd3JpdGUgb3Btb2RlIHJlZ1xuIik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDQ0LDE0ICs0NDUsMTUgQEAKIAlpbnQgcmV0OwogCXU4IHZhbDsKIAotCWFkZTc3NThfc3BpX3JlYWRfcmVnXzgoZGV2LAotCQkJQURFNzc1OF9PUE1PREUsCi0JCQkmdmFsKTsKKwlyZXQgPSBhZGU3NzU4X3NwaV9yZWFkX3JlZ184KGRldiwgQURFNzc1OF9PUE1PREUsICZ2YWwpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgb3Btb2RlIHJlZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQogCXZhbCB8PSA3IDw8IDM7ICAvKiBBREU3NzU4IHBvd2VyZWQgZG93biAqLwotCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwKLQkJCUFERTc3NThfT1BNT0RFLAotCQkJdmFsKTsKLQorCXJldCA9IGFkZTc3NThfc3BpX3dyaXRlX3JlZ184KGRldiwgQURFNzc1OF9PUE1PREUsIHZhbCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHdyaXRlIG9wbW9kZSByZWdcbiIpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTQ4Myw3ICs0ODUsNyBAQAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJY2hhciAqYnVmKQogewotCWludCByZXQsIGxlbiA9IDA7CisJaW50IHJldDsKIAl1OCB0OwogCWludCBzcHM7CiAKQEAgLTQ5Niw4ICs0OTgsNyBAQAogCXQgPSAodCA+PiA1KSAmIDB4MzsKIAlzcHMgPSAyNjA0MCAvICgxIDw8IHQpOwogCi0JbGVuID0gc3ByaW50ZihidWYsICIlZCBTUFNcbiIsIHNwcyk7Ci0JcmV0dXJuIGxlbjsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZCBTUFNcbiIsIHNwcyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGFkZTc3NThfd3JpdGVfZnJlcXVlbmN5KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTgzMiw3ICs4MzMsNyBAQAogCWlmICghc3QtPnJ4KQogCQlyZXR1cm4gLUVOT01FTTsKIAlzdC0+dHggPSBrY2FsbG9jKEFERTc3NThfTUFYX1RYLCBzaXplb2YoKnN0LT50eCksIEdGUF9LRVJORUwpOwotCWlmIChzdC0+dHggPT0gTlVMTCkgeworCWlmICghc3QtPnR4KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfZnJlZV9yeDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3JpbmcuYwppbmRleCAzNzkyYjU3Li45YTI0ZTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfcmluZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF9yaW5nLmMKQEAgLTExOSwxMCArMTE5LDggQEAKIAlpbnQgcmV0ID0gMDsKIAogCWJ1ZmZlciA9IGlpb19rZmlmb19hbGxvY2F0ZSgpOwotCWlmICghYnVmZmVyKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCXJldHVybiByZXQ7Ci0JfQorCWlmICghYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWlpb19kZXZpY2VfYXR0YWNoX2J1ZmZlcihpbmRpb19kZXYsIGJ1ZmZlcik7CiAKQEAgLTEzNCw3ICsxMzIsNyBAQAogCQkJCQkJIGluZGlvX2RldiwKIAkJCQkJCSAiYWRlNzc1OV9jb25zdW1lciVkIiwKIAkJCQkJCSBpbmRpb19kZXYtPmlkKTsKLQlpZiAoaW5kaW9fZGV2LT5wb2xsZnVuYyA9PSBOVUxMKSB7CisJaWYgKCFpbmRpb19kZXYtPnBvbGxmdW5jKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3JfaWlvX2tmaWZvX2ZyZWU7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzc1OF90cmlnZ2VyLmMKaW5kZXggNmY0NWNlMC4uNWIzNWE3ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU4X3RyaWdnZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NThfdHJpZ2dlci5jCkBAIC02Niw3ICs2Niw3IEBACiAJc3QtPnRyaWcgPSBpaW9fdHJpZ2dlcl9hbGxvYygiJXMtZGV2JWQiLAogCQkJCQlzcGlfZ2V0X2RldmljZV9pZChzdC0+dXMpLT5uYW1lLAogCQkJCQlpbmRpb19kZXYtPmlkKTsKLQlpZiAoc3QtPnRyaWcgPT0gTlVMTCkgeworCWlmICghc3QtPnRyaWcpIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3NzU5LmMgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYwppbmRleCBiMGM3ZGJjLi5kYmNlZGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc3NTkuYwpAQCAtMjE4LDE1ICsyMTgsMTYgQEAKIAlpbnQgcmV0OwogCXUxNiB2YWw7CiAKLQlhZGU3NzU5X3NwaV9yZWFkX3JlZ18xNihkZXYsCisJcmV0ID0gYWRlNzc1OV9zcGlfcmVhZF9yZWdfMTYoZGV2LAogCQkJQURFNzc1OV9NT0RFLAogCQkJJnZhbCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAl2YWwgfD0gMSA8PCA2OyAvKiBTb2Z0d2FyZSBDaGlwIFJlc2V0ICovCi0JcmV0ID0gYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzE2KGRldiwKKwlyZXR1cm4gYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzE2KGRldiwKIAkJCUFERTc3NTlfTU9ERSwKIAkJCXZhbCk7Ci0KLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgSUlPX0RFVl9BVFRSX0FFTkVSR1koYWRlNzc1OV9yZWFkXzQwYml0LCBBREU3NzU5X0FFTkVSR1kpOwpAQCAtMzAxLDExICszMDIsMTggQEAKIC8qIFBvd2VyIGRvd24gdGhlIGRldmljZSAqLwogc3RhdGljIGludCBhZGU3NzU5X3N0b3BfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlpbnQgcmV0OwogCXUxNiB2YWw7CiAKLQlhZGU3NzU5X3NwaV9yZWFkX3JlZ18xNihkZXYsCisJcmV0ID0gYWRlNzc1OV9zcGlfcmVhZF9yZWdfMTYoZGV2LAogCQkJQURFNzc1OV9NT0RFLAogCQkJJnZhbCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJ1bmFibGUgdG8gcG93ZXIgZG93biB0aGUgZGV2aWNlLCBlcnJvcjogJWRcbiIsCisJCQlyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwogCXZhbCB8PSAxIDw8IDQ7ICAvKiBBRCBjb252ZXJ0ZXJzIGNhbiBiZSB0dXJuZWQgb2ZmICovCiAKIAlyZXR1cm4gYWRlNzc1OV9zcGlfd3JpdGVfcmVnXzE2KGRldiwgQURFNzc1OV9NT0RFLCB2YWwpOwpAQCAtMzc0LDcgKzM4Miw3IEBACiAKIAltdXRleF9sb2NrKCZpbmRpb19kZXYtPm1sb2NrKTsKIAotCXQgPSAoMjc5MDAgLyB2YWwpOworCXQgPSAyNzkwMCAvIHZhbDsKIAlpZiAodCA+IDApCiAJCXQtLTsKIApAQCAtNDY1LDExICs0NzMsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOworCXJldHVybiBpaW9fZGV2aWNlX3JlZ2lzdGVyKGluZGlvX2Rldik7CiB9CiAKIC8qIGZpeG1lLCBjb25maXJtIG9yZGVyaW5nIGluIHRoaXMgZnVuY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1pMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1pMmMuYwppbmRleCA1YjMzYzdmLi4wN2NmZTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQtaTJjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LWkyYy5jCkBAIC0xNiw4ICsxNiw4IEBACiAjaW5jbHVkZSAiYWRlNzg1NC5oIgogCiBzdGF0aWMgaW50IGFkZTc4NTRfaTJjX3dyaXRlX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdTE2IHJlZ19hZGRyZXNzLAotCQl1OCB2YWx1ZSkKKwkJCQkgICB1MTYgcmVnX2FkZHJlc3MsCisJCQkJICAgdTggdmFsdWUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTM1LDggKzM1LDggQEAKIH0KIAogc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUxNiB2YWx1ZSkKKwkJCQkgICAgdTE2IHJlZ19hZGRyZXNzLAorCQkJCSAgICB1MTYgdmFsdWUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTU1LDggKzU1LDggQEAKIH0KIAogc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUzMiB2YWx1ZSkKKwkJCQkgICAgdTE2IHJlZ19hZGRyZXNzLAorCQkJCSAgICB1MzIgdmFsdWUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTc2LDggKzc2LDggQEAKIH0KIAogc3RhdGljIGludCBhZGU3ODU0X2kyY193cml0ZV9yZWdfMzIoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUzMiB2YWx1ZSkKKwkJCQkgICAgdTE2IHJlZ19hZGRyZXNzLAorCQkJCSAgICB1MzIgdmFsdWUpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKQEAgLTk4LDggKzk4LDggQEAKIH0KIAogc3RhdGljIGludCBhZGU3ODU0X2kyY19yZWFkX3JlZ184KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdTE2IHJlZ19hZGRyZXNzLAotCQl1OCAqdmFsKQorCQkJCSAgdTE2IHJlZ19hZGRyZXNzLAorCQkJCSAgdTggKnZhbCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMTI0LDggKzEyNCw4IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRlNzg1NF9pMmNfcmVhZF9yZWdfMTYoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUxNiAqdmFsKQorCQkJCSAgIHUxNiByZWdfYWRkcmVzcywKKwkJCQkgICB1MTYgKnZhbCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMTUwLDggKzE1MCw4IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRlNzg1NF9pMmNfcmVhZF9yZWdfMjQoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUzMiAqdmFsKQorCQkJCSAgIHUxNiByZWdfYWRkcmVzcywKKwkJCQkgICB1MzIgKnZhbCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMTc2LDggKzE3Niw4IEBACiB9CiAKIHN0YXRpYyBpbnQgYWRlNzg1NF9pMmNfcmVhZF9yZWdfMzIoc3RydWN0IGRldmljZSAqZGV2LAotCQl1MTYgcmVnX2FkZHJlc3MsCi0JCXUzMiAqdmFsKQorCQkJCSAgIHUxNiByZWdfYWRkcmVzcywKKwkJCQkgICB1MzIgKnZhbCkKIHsKIAlzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2ID0gZGV2X3RvX2lpb19kZXYoZGV2KTsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwpAQCAtMTk1LDIxICsxOTUsMjEgQEAKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCSp2YWwgPSAoc3QtPnJ4WzBdIDw8IDI0KSB8IChzdC0+cnhbMV0gPDwgMTYpIHwgKHN0LT5yeFsyXSA8PCA4KSB8IHN0LT5yeFszXTsKKwkqdmFsID0gKHN0LT5yeFswXSA8PCAyNCkgfCAoc3QtPnJ4WzFdIDw8IDE2KSB8CisJCShzdC0+cnhbMl0gPDwgOCkgfCBzdC0+cnhbM107CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZzdC0+YnVmX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYWRlNzg1NF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKLQkJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3Q7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIAogCWluZGlvX2RldiA9IGRldm1faWlvX2RldmljZV9hbGxvYygmY2xpZW50LT5kZXYsIHNpemVvZigqc3QpKTsKLQlpZiAoaW5kaW9fZGV2ID09IE5VTEwpCisJaWYgKCFpbmRpb19kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCXN0ID0gaWlvX3ByaXYoaW5kaW9fZGV2KTsKIAlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBpbmRpb19kZXYpOwpAQCAtMjI0LDkgKzIyNCw3IEBACiAJc3QtPmkyYyA9IGNsaWVudDsKIAlzdC0+aXJxID0gY2xpZW50LT5pcnE7CiAKLQlyZXQgPSBhZGU3ODU0X3Byb2JlKGluZGlvX2RldiwgJmNsaWVudC0+ZGV2KTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGFkZTc4NTRfcHJvYmUoaW5kaW9fZGV2LCAmY2xpZW50LT5kZXYpOwogfQogCiBzdGF0aWMgaW50IGFkZTc4NTRfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LXNwaS5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9hZGU3ODU0LXNwaS5jCmluZGV4IDk0ZjczYmIuLjliMjU1YTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvYWRlNzg1NC1zcGkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL2FkZTc4NTQtc3BpLmMKQEAgLTI3NCw3ICsyNzQsNiBAQAogCiBzdGF0aWMgaW50IGFkZTc4NTRfc3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0JaW50IHJldDsKIAlzdHJ1Y3QgYWRlNzg1NF9zdGF0ZSAqc3Q7CiAJc3RydWN0IGlpb19kZXYgKmluZGlvX2RldjsKIApAQCAtMjk0LDEwICsyOTMsNyBAQAogCXN0LT5pcnEgPSBzcGktPmlycTsKIAlzdC0+c3BpID0gc3BpOwogCi0KLQlyZXQgPSBhZGU3ODU0X3Byb2JlKGluZGlvX2RldiwgJnNwaS0+ZGV2KTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGFkZTc4NTRfcHJvYmUoaW5kaW9fZGV2LCAmc3BpLT5kZXYpOwogfQogCiBzdGF0aWMgaW50IGFkZTc4NTRfc3BpX3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9tZXRlci5oIGIvZHJpdmVycy9zdGFnaW5nL2lpby9tZXRlci9tZXRlci5oCmluZGV4IDhmMGRlMDIuLmRmYmE1MTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vbWV0ZXIvbWV0ZXIuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL21ldGVyL21ldGVyLmgKQEAgLTEsMyArMSw2IEBACisjaWZuZGVmIF9NRVRFUl9ICisjZGVmaW5lIF9NRVRFUl9ICisKICNpbmNsdWRlIDxsaW51eC9paW8vc3lzZnMuaD4KIAogLyogbWV0ZXJpbmcgaWMgdHlwZXMgb2YgYXR0cmlidXRlICovCkBAIC0zOTQsMyArMzk3LDQgQEAKICNkZWZpbmUgSUlPX0VWRU5UX0FUVFJfVlBLTFZMX0VYQyhfZXZsaXN0LCBfc2hvdywgX3N0b3JlLCBfbWFzaykgXAogCUlJT19FVkVOVF9BVFRSX1NIKHZwa2x2bF9leGMsIF9ldmxpc3QsIF9zaG93LCBfc3RvcmUsIF9tYXNrKQogCisjZW5kaWYgLyogX01FVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuYwppbmRleCBiNGMxNGJhLi43YmMzZTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby9yZXNvbHZlci9hZDJzMTIxMC5jCkBAIC0xNTEsNyArMTUxLDcgQEAKIAogCWZjdyA9ICh1bnNpZ25lZCBjaGFyKShzdC0+ZmV4Y2l0ICogKDEgPDwgMTUpIC8gc3QtPmZjbGtpbik7CiAJaWYgKGZjdyA8IEFEMlMxMjEwX01JTl9GQ1cgfHwgZmN3ID4gQUQyUzEyMTBfTUFYX0ZDVykgewotCQlwcl9lcnIoImFkMnMxMjEwOiBGQ1cgb3V0IG9mIHJhbmdlXG4iKTsKKwkJZGV2X2Vycigmc3QtPnNkZXYtPmRldiwgImFkMnMxMjEwOiBGQ1cgb3V0IG9mIHJhbmdlXG4iKTsKIAkJcmV0dXJuIC1FUkFOR0U7CiAJfQogCkBAIC0xOTgsNyArMTk4LDcgQEAKIHsKIAlzdHJ1Y3QgYWQyczEyMTBfc3RhdGUgKnN0ID0gaWlvX3ByaXYoZGV2X3RvX2lpb19kZXYoZGV2KSk7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgc3QtPmZjbGtpbik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHN0LT5mY2xraW4pOwogfQogCiBzdGF0aWMgc3NpemVfdCBhZDJzMTIxMF9zdG9yZV9mY2xraW4oc3RydWN0IGRldmljZSAqZGV2LApAQCAtMjE0LDcgKzIxNCw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAlpZiAoZmNsa2luIDwgQUQyUzEyMTBfTUlOX0NMS0lOIHx8IGZjbGtpbiA+IEFEMlMxMjEwX01BWF9DTEtJTikgewotCQlwcl9lcnIoImFkMnMxMjEwOiBmY2xraW4gb3V0IG9mIHJhbmdlXG4iKTsKKwkJZGV2X2VycihkZXYsICJhZDJzMTIxMDogZmNsa2luIG91dCBvZiByYW5nZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMjM3LDcgKzIzNyw3IEBACiB7CiAJc3RydWN0IGFkMnMxMjEwX3N0YXRlICpzdCA9IGlpb19wcml2KGRldl90b19paW9fZGV2KGRldikpOwogCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHN0LT5mZXhjaXQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBzdC0+ZmV4Y2l0KTsKIH0KIAogc3RhdGljIHNzaXplX3QgYWQyczEyMTBfc3RvcmVfZmV4Y2l0KHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTI1Miw3ICsyNTIsOCBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCWlmIChmZXhjaXQgPCBBRDJTMTIxMF9NSU5fRVhDSVQgfHwgZmV4Y2l0ID4gQUQyUzEyMTBfTUFYX0VYQ0lUKSB7Ci0JCXByX2VycigiYWQyczEyMTA6IGV4Y2l0YXRpb24gZnJlcXVlbmN5IG91dCBvZiByYW5nZVxuIik7CisJCWRldl9lcnIoZGV2LAorCQkJImFkMnMxMjEwOiBleGNpdGF0aW9uIGZyZXF1ZW5jeSBvdXQgb2YgcmFuZ2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJbXV0ZXhfbG9jaygmc3QtPmxvY2spOwpAQCAtMzA3LDcgKzMwOCw4IEBACiAJCWdvdG8gZXJyb3JfcmV0OwogCWlmIChyZXQgJiBBRDJTMTIxMF9NU0JfSVNfSElHSCkgewogCQlyZXQgPSAtRUlPOwotCQlwcl9lcnIoImFkMnMxMjEwOiB3cml0ZSBjb250cm9sIHJlZ2lzdGVyIGZhaWxcbiIpOworCQlkZXZfZXJyKGRldiwKKwkJCSJhZDJzMTIxMDogd3JpdGUgY29udHJvbCByZWdpc3RlciBmYWlsXG4iKTsKIAkJZ290byBlcnJvcl9yZXQ7CiAJfQogCXN0LT5yZXNvbHV0aW9uCkBAIC0zMTUsNyArMzE3LDcgQEAKIAlpZiAoc3QtPnBkYXRhLT5ncGlvaW4pIHsKIAkJZGF0YSA9IGFkMnMxMjEwX3JlYWRfcmVzb2x1dGlvbl9waW4oc3QpOwogCQlpZiAoZGF0YSAhPSBzdC0+cmVzb2x1dGlvbikKLQkJCXByX3dhcm4oImFkMnMxMjEwOiByZXNvbHV0aW9uIHNldHRpbmdzIG5vdCBtYXRjaFxuIik7CisJCQlkZXZfd2FybihkZXYsICJhZDJzMTIxMDogcmVzb2x1dGlvbiBzZXR0aW5ncyBub3QgbWF0Y2hcbiIpOwogCX0gZWxzZQogCQlhZDJzMTIxMF9zZXRfcmVzb2x1dGlvbl9waW4oc3QpOwogCkBAIC0zNDYsNyArMzQ4LDcgQEAKIAogCXJldCA9IGtzdHJ0b3U4KGJ1ZiwgMTAsICZ1ZGF0YSk7CiAJaWYgKHJldCB8fCB1ZGF0YSA8IDEwIHx8IHVkYXRhID4gMTYpIHsKLQkJcHJfZXJyKCJhZDJzMTIxMDogcmVzb2x1dGlvbiBvdXQgb2YgcmFuZ2VcbiIpOworCQlkZXZfZXJyKGRldiwgImFkMnMxMjEwOiByZXNvbHV0aW9uIG91dCBvZiByYW5nZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAltdXRleF9sb2NrKCZzdC0+bG9jayk7CkBAIC0zNjgsNyArMzcwLDcgQEAKIAlkYXRhID0gcmV0OwogCWlmIChkYXRhICYgQUQyUzEyMTBfTVNCX0lTX0hJR0gpIHsKIAkJcmV0ID0gLUVJTzsKLQkJcHJfZXJyKCJhZDJzMTIxMDogc2V0dGluZyByZXNvbHV0aW9uIGZhaWxcbiIpOworCQlkZXZfZXJyKGRldiwgImFkMnMxMjEwOiBzZXR0aW5nIHJlc29sdXRpb24gZmFpbFxuIik7CiAJCWdvdG8gZXJyb3JfcmV0OwogCX0KIAlzdC0+cmVzb2x1dGlvbgpAQCAtMzc2LDcgKzM3OCw3IEBACiAJaWYgKHN0LT5wZGF0YS0+Z3Bpb2luKSB7CiAJCWRhdGEgPSBhZDJzMTIxMF9yZWFkX3Jlc29sdXRpb25fcGluKHN0KTsKIAkJaWYgKGRhdGEgIT0gc3QtPnJlc29sdXRpb24pCi0JCQlwcl93YXJuKCJhZDJzMTIxMDogcmVzb2x1dGlvbiBzZXR0aW5ncyBub3QgbWF0Y2hcbiIpOworCQkJZGV2X3dhcm4oZGV2LCAiYWQyczEyMTA6IHJlc29sdXRpb24gc2V0dGluZ3Mgbm90IG1hdGNoXG4iKTsKIAl9IGVsc2UKIAkJYWQyczEyMTBfc2V0X3Jlc29sdXRpb25fcGluKHN0KTsKIAlyZXQgPSBsZW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmggYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmgKaW5kZXggYWVjMGJkY2EuLmM3MTU4ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9paW8vcmVzb2x2ZXIvYWQyczEyMTAuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvaWlvL3Jlc29sdmVyL2FkMnMxMjEwLmgKQEAgLTgsNiArOCw4IEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKyNpZm5kZWYgX0FEMlMxMjEwX0gKKyNkZWZpbmUgX0FEMlMxMjEwX0gKIAogc3RydWN0IGFkMnMxMjEwX3BsYXRmb3JtX2RhdGEgewogCXVuc2lnbmVkIHNhbXBsZTsKQEAgLTE1LDMgKzE3LDQgQEAKIAl1bnNpZ25lZCByZXNbMl07CiAJYm9vbCBncGlvaW47CiB9OworI2VuZGlmIC8qIF9BRDJTMTIxMF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctYmZpbi10aW1lci5jIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLWJmaW4tdGltZXIuYwppbmRleCAyYWY4ZDY3Li4zYzFjOGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctYmZpbi10aW1lci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1iZmluLXRpbWVyLmMKQEAgLTE4Myw3ICsxODMsNyBAQAogCWludCByZXQ7CiAKIAlzdCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHN0ID09IE5VTEwpCisJaWYgKCFzdCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzdC0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1wZXJpb2RpYy1ydGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9paW8vdHJpZ2dlci9paW8tdHJpZy1wZXJpb2RpYy1ydGMuYwppbmRleCBhMjRjYWY3Li4wYzE5NzZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvaWlvL3RyaWdnZXIvaWlvLXRyaWctcGVyaW9kaWMtcnRjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2lpby90cmlnZ2VyL2lpby10cmlnLXBlcmlvZGljLXJ0Yy5jCkBAIC0yNCw3ICsyNCw3IEBACiAKIHN0cnVjdCBpaW9fcHJ0Y190cmlnZ2VyX2luZm8gewogCXN0cnVjdCBydGNfZGV2aWNlICpydGM7Ci0JaW50IGZyZXF1ZW5jeTsKKwl1bnNpZ25lZCBpbnQgZnJlcXVlbmN5OwogCXN0cnVjdCBydGNfdGFzayB0YXNrOwogCWJvb2wgc3RhdGU7CiB9OwpAQCAtMzYsNyArMzYsNyBAQAogCiAJaWYgKHRyaWdfaW5mby0+ZnJlcXVlbmN5ID09IDAgJiYgc3RhdGUpCiAJCXJldHVybiAtRUlOVkFMOwotCWRldl9kYmcoJnRyaWdfaW5mby0+cnRjLT5kZXYsICJ0cmlnZ2VyIGZyZXF1ZW5jeSBpcyAlZFxuIiwKKwlkZXZfZGJnKCZ0cmlnX2luZm8tPnJ0Yy0+ZGV2LCAidHJpZ2dlciBmcmVxdWVuY3kgaXMgJXVcbiIsCiAJCQl0cmlnX2luZm8tPmZyZXF1ZW5jeSk7CiAJcmV0ID0gcnRjX2lycV9zZXRfc3RhdGUodHJpZ19pbmZvLT5ydGMsICZ0cmlnX2luZm8tPnRhc2ssIHN0YXRlKTsKIAlpZiAocmV0ID09IDApCkBAIC02MiwxMCArNjIsMTAgQEAKIHsKIAlzdHJ1Y3QgaWlvX3RyaWdnZXIgKnRyaWcgPSB0b19paW9fdHJpZ2dlcihkZXYpOwogCXN0cnVjdCBpaW9fcHJ0Y190cmlnZ2VyX2luZm8gKnRyaWdfaW5mbyA9IGlpb190cmlnZ2VyX2dldF9kcnZkYXRhKHRyaWcpOwotCWludCB2YWw7CisJdW5zaWduZWQgaW50IHZhbDsKIAlpbnQgcmV0OwogCi0JcmV0ID0ga3N0cnRvaW50KGJ1ZiwgMTAsICZ2YWwpOworCXJldCA9IGtzdHJ0b3VpbnQoYnVmLCAxMCwgJnZhbCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CiAKQEAgLTc0LDEwICs3NCw4IEBACiAJCWlmIChyZXQgPT0gMCAmJiB0cmlnX2luZm8tPnN0YXRlICYmIHRyaWdfaW5mby0+ZnJlcXVlbmN5ID09IDApCiAJCQlyZXQgPSBydGNfaXJxX3NldF9zdGF0ZSh0cmlnX2luZm8tPnJ0YywKIAkJCQkJCSZ0cmlnX2luZm8tPnRhc2ssIDEpOwotCX0gZWxzZSBpZiAodmFsID09IDApIHsKLQkJcmV0ID0gcnRjX2lycV9zZXRfc3RhdGUodHJpZ19pbmZvLT5ydGMsICZ0cmlnX2luZm8tPnRhc2ssIDApOwogCX0gZWxzZQotCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSBydGNfaXJxX3NldF9zdGF0ZSh0cmlnX2luZm8tPnJ0YywgJnRyaWdfaW5mby0+dGFzaywgMCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnJvcl9yZXQ7CiAKQEAgLTEyNiw3ICsxMjQsNyBAQAogCWludCBpLCByZXQ7CiAKIAlmb3IgKGkgPSAwOzsgaSsrKSB7Ci0JCWlmIChwZGF0YVtpXSA9PSBOVUxMKQorCQlpZiAoIXBkYXRhW2ldKQogCQkJYnJlYWs7CiAJCXRyaWcgPSBpaW9fdHJpZ2dlcl9hbGxvYygicGVyaW9kaWMlcyIsIHBkYXRhW2ldKTsKIAkJaWYgKCF0cmlnKSB7CkBAIC0xNDQsNyArMTQyLDcgQEAKIAkJdHJpZy0+b3BzID0gJmlpb19wcnRjX3RyaWdnZXJfb3BzOwogCQkvKiBSVEMgYWNjZXNzICovCiAJCXRyaWdfaW5mby0+cnRjID0gcnRjX2NsYXNzX29wZW4ocGRhdGFbaV0pOwotCQlpZiAodHJpZ19pbmZvLT5ydGMgPT0gTlVMTCkgeworCQlpZiAoIXRyaWdfaW5mby0+cnRjKSB7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvcl9mcmVlX3RyaWdfaW5mbzsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2RlYnVnLmgKaW5kZXggMmU1YTllNS4uODI1MWFjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfZGVidWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19kZWJ1Zy5oCkBAIC0xOTYsNyArMTk2LDcgQEAKIAkgICAgICAgLm1zZ19mbiAgICAgPSBfX2Z1bmNfXywJCQkJXAogCSAgICAgICAubXNnX2xpbmUgICA9IF9fTElORV9fLAkJCQlcCiAJICAgICAgIC5tc2dfY2RscyAgID0gKGNkbHMpCSB9OwkJCVwKLQlkYXRhbmFtZS5tc2dfbWFzayAgID0gKG1hc2spOworCWRhdGFuYW1lLm1zZ19tYXNrICAgPSAobWFzaykKIAogLyoqCiAgKiBGaWx0ZXJzIG91dCBsb2dnaW5nIG1lc3NhZ2VzIGJhc2VkIG9uIG1hc2sgYW5kIHN1YnN5c3RlbS4KQEAgLTI0NCwxMiArMjQ0LDEyIEBACiAKIGludCBsaWJjZnNfZGVidWdfbXNnKHN0cnVjdCBsaWJjZnNfZGVidWdfbXNnX2RhdGEgKm1zZ2RhdGEsCiAJCQkgICAgY29uc3QgY2hhciAqZm9ybWF0MSwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKwlfX3ByaW50ZigyLCAzKTsKIAogaW50IGxpYmNmc19kZWJ1Z192bXNnMihzdHJ1Y3QgbGliY2ZzX2RlYnVnX21zZ19kYXRhICptc2dkYXRhLAogCQkJICAgICAgY29uc3QgY2hhciAqZm9ybWF0MSwKIAkJCSAgICAgIHZhX2xpc3QgYXJncywgY29uc3QgY2hhciAqZm9ybWF0MiwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgNCwgNSkpKTsKKwlfX3ByaW50Zig0LCA1KTsKIAogLyogb3RoZXIgZXh0ZXJuYWwgc3ltYm9scyB0aGF0IHRyYWNlZmlsZSBwcm92aWRlczogKi8KIGludCBjZnNfdHJhY2VfY29weWluX3N0cmluZyhjaGFyICprbmxfYnVmZmVyLCBpbnQga25sX2J1ZmZlcl9ub2IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19oYXNoLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19oYXNoLmgKaW5kZXggODA4ZTQ5NC4uYzQwODE0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfaGFzaC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2hhc2guaApAQCAtNDY5LDcgKzQ2OSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQKIGNmc19oYXNoX2tleWNweShzdHJ1Y3QgY2ZzX2hhc2ggKmhzLCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqaG5vZGUsIHZvaWQgKmtleSkKIHsKLSAgICAgICAgaWYgKGhzLT5oc19vcHMtPmhzX2tleWNweSkKKwlpZiAoaHMtPmhzX29wcy0+aHNfa2V5Y3B5KQogCQlocy0+aHNfb3BzLT5oc19rZXljcHkoaG5vZGUsIGtleSk7CiB9CiAKQEAgLTc4NSw4ICs3ODUsOCBAQAogCiAvKiBHZW5lcmljIGRlYnVnIGZvcm1hdHRpbmcgcm91dGluZXMgbWFpbmx5IGZvciBwcm9jIGhhbmRsZXIgKi8KIHN0cnVjdCBzZXFfZmlsZTsKLWludCBjZnNfaGFzaF9kZWJ1Z19oZWFkZXIoc3RydWN0IHNlcV9maWxlICptKTsKLWludCBjZnNfaGFzaF9kZWJ1Z19zdHIoc3RydWN0IGNmc19oYXNoICpocywgc3RydWN0IHNlcV9maWxlICptKTsKK3ZvaWQgY2ZzX2hhc2hfZGVidWdfaGVhZGVyKHN0cnVjdCBzZXFfZmlsZSAqbSk7Cit2b2lkIGNmc19oYXNoX2RlYnVnX3N0cihzdHJ1Y3QgY2ZzX2hhc2ggKmhzLCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOwogCiAvKgogICogR2VuZXJpYyBkamIyIGhhc2ggYWxnb3JpdGhtIGZvciBjaGFyYWN0ZXIgYXJyYXlzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfa2VybmVsY29tbS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfa2VybmVsY29tbS5oCmluZGV4IGYxOWExMjEuLmE5ODlkMjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX2tlcm5lbGNvbW0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19rZXJuZWxjb21tLmgKQEAgLTU4LDcgKzU4LDcgQEAKIAlfX3U4ICBrdWNfZmxhZ3M7CiAJX191MTYga3VjX21zZ3R5cGU7ICAgIC8qIE1lc3NhZ2UgdHlwZSBvciBvcGNvZGUsIHRyYW5zcG9ydC1zcGVjaWZpYyAqLwogCV9fdTE2IGt1Y19tc2dsZW47ICAgICAvKiBJbmNsdWRpbmcgaGVhZGVyICovCi19IF9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKF9fdTY0KSkpKTsKK30gX19hbGlnbmVkKHNpemVvZihfX3U2NCkpOwogCiAjZGVmaW5lIEtVQ19DSEFOR0VMT0dfTVNHX01BWFNJWkUgKHNpemVvZihzdHJ1Y3Qga3VjX2hkcikrQ1JfTUFYU0laRSkKIApAQCAtMTA3LDcgKzEwNyw3IEBACiAJX191MzIgbGtfZ3JvdXA7CiAJX191MzIgbGtfZGF0YTsKIAlfX3UzMiBsa19mbGFnczsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgbHVzdHJlX2tlcm5lbGNvbW07Cit9IF9fcGFja2VkIGx1c3RyZV9rZXJuZWxjb21tOwogCiAvKiBVc2Vyc3BhY2UgbWV0aG9kcyAqLwogaW50IGxpYmNmc191a3VjX3N0YXJ0KGx1c3RyZV9rZXJuZWxjb21tICpsLCBpbnQgZ3JvdXBzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3ByaXZhdGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvaW5jbHVkZS9saW51eC9saWJjZnMvbGliY2ZzX3ByaXZhdGUuaAppbmRleCAzZDg2ZmI1Li5mZWY4ODI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19wcml2YXRlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnNfcHJpdmF0ZS5oCkBAIC0zMzUsOCArMzM1LDggQEAKICNkZWZpbmUgTEFTU0VSVF9BVE9NSUNfWkVSTyhhKQkJICBMQVNTRVJUX0FUT01JQ19FUShhLCAwKQogI2RlZmluZSBMQVNTRVJUX0FUT01JQ19QT1MoYSkJCSAgIExBU1NFUlRfQVRPTUlDX0dUKGEsIDApCiAKLSNkZWZpbmUgQ0ZTX0FMTE9DX1BUUihwdHIpICAgICAgTElCQ0ZTX0FMTE9DKHB0ciwgc2l6ZW9mKCoocHRyKSkpOwotI2RlZmluZSBDRlNfRlJFRV9QVFIocHRyKSAgICAgICBMSUJDRlNfRlJFRShwdHIsIHNpemVvZigqKHB0cikpKTsKKyNkZWZpbmUgQ0ZTX0FMTE9DX1BUUihwdHIpICAgICAgTElCQ0ZTX0FMTE9DKHB0ciwgc2l6ZW9mKCoocHRyKSkpCisjZGVmaW5lIENGU19GUkVFX1BUUihwdHIpICAgICAgIExJQkNGU19GUkVFKHB0ciwgc2l6ZW9mKCoocHRyKSkpCiAKIC8qCiAgKiBwZXJjcHUgcGFydGl0aW9uIGxvY2sKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuYwppbmRleCA2NTEwMTY5Li4zYmFkNDQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5jCkBAIC01Myw4ICs1Myw3IEBACiAKIGtpYl9kYXRhX3QJICAgICAga2libG5kX2RhdGE7CiAKLXN0YXRpYyBfX3UzMgota2libG5kX2Nrc3VtKHZvaWQgKnB0ciwgaW50IG5vYikKK3N0YXRpYyBfX3UzMiBraWJsbmRfY2tzdW0odm9pZCAqcHRyLCBpbnQgbm9iKQogewogCWNoYXIgICpjICA9IHB0cjsKIAlfX3UzMiAgc3VtID0gMDsKQEAgLTY2LDggKzY1LDcgQEAKIAlyZXR1cm4gKHN1bSA9PSAwKSA/IDEgOiBzdW07CiB9CiAKLXN0YXRpYyBjaGFyICoKLWtpYmxuZF9tc2d0eXBlMnN0cihpbnQgdHlwZSkKK3N0YXRpYyBjaGFyICpraWJsbmRfbXNndHlwZTJzdHIoaW50IHR5cGUpCiB7CiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBJQkxORF9NU0dfQ09OTlJFUToKQEAgLTEwNSw4ICsxMDMsNyBAQAogCX0KIH0KIAotc3RhdGljIGludAota2libG5kX21zZ3R5cGUyc2l6ZShpbnQgdHlwZSkKK3N0YXRpYyBpbnQga2libG5kX21zZ3R5cGUyc2l6ZShpbnQgdHlwZSkKIHsKIAljb25zdCBpbnQgaGRyX3NpemUgPSBvZmZzZXRvZihraWJfbXNnX3QsIGlibV91KTsKIApAQCAtMTM5LDE1ICsxMzYsMTQgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQKLWtpYmxuZF91bnBhY2tfcmQoa2liX21zZ190ICptc2csIGludCBmbGlwKQorc3RhdGljIGludCBraWJsbmRfdW5wYWNrX3JkKGtpYl9tc2dfdCAqbXNnLCBpbnQgZmxpcCkKIHsKIAlraWJfcmRtYV9kZXNjX3QgICAqcmQ7CiAJaW50CQlub2I7CiAJaW50CQluOwogCWludAkJaTsKIAotCUxBU1NFUlQgKG1zZy0+aWJtX3R5cGUgPT0gSUJMTkRfTVNHX0dFVF9SRVEgfHwKKwlMQVNTRVJUKG1zZy0+aWJtX3R5cGUgPT0gSUJMTkRfTVNHX0dFVF9SRVEgfHwKIAkJIG1zZy0+aWJtX3R5cGUgPT0gSUJMTkRfTVNHX1BVVF9BQ0spOwogCiAJcmQgPSBtc2ctPmlibV90eXBlID09IElCTE5EX01TR19HRVRfUkVRID8KQEAgLTE2Nyw3ICsxNjMsNyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlub2IgPSBvZmZzZXRvZiAoa2liX21zZ190LCBpYm1fdSkgKworCW5vYiA9IG9mZnNldG9mKGtpYl9tc2dfdCwgaWJtX3UpICsKIAkgICAgICBraWJsbmRfcmRfbXNnX3NpemUocmQsIG1zZy0+aWJtX3R5cGUsIG4pOwogCiAJaWYgKG1zZy0+aWJtX25vYiA8IG5vYikgewpAQCAtMTg3LDkgKzE4Myw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQKLWtpYmxuZF9wYWNrX21zZyAobG5ldF9uaV90ICpuaSwga2liX21zZ190ICptc2csIGludCB2ZXJzaW9uLAotCQkgaW50IGNyZWRpdHMsIGxuZXRfbmlkX3QgZHN0bmlkLCBfX3U2NCBkc3RzdGFtcCkKK3ZvaWQga2libG5kX3BhY2tfbXNnKGxuZXRfbmlfdCAqbmksIGtpYl9tc2dfdCAqbXNnLCBpbnQgdmVyc2lvbiwKKwkJICAgICBpbnQgY3JlZGl0cywgbG5ldF9uaWRfdCBkc3RuaWQsIF9fdTY0IGRzdHN0YW1wKQogewogCWtpYl9uZXRfdCAqbmV0ID0gbmktPm5pX2RhdGE7CiAKQEAgLTIxMiw4ICsyMDcsNyBAQAogCX0KIH0KIAotaW50Ci1raWJsbmRfdW5wYWNrX21zZyhraWJfbXNnX3QgKm1zZywgaW50IG5vYikKK2ludCBraWJsbmRfdW5wYWNrX21zZyhraWJfbXNnX3QgKm1zZywgaW50IG5vYikKIHsKIAljb25zdCBpbnQgaGRyX3NpemUgPSBvZmZzZXRvZihraWJfbXNnX3QsIGlibV91KTsKIAlfX3UzMiAgICAgbXNnX2Nrc3VtOwpAQCAtMjY5LDggKzI2Myw4IEBACiAJaWYgKGZsaXApIHsKIAkJLyogbGVhdmUgbWFnaWMgdW5mbGlwcGVkIGFzIGEgY2x1ZSB0byBwZWVyIGVuZGlhbm5lc3MgKi8KIAkJbXNnLT5pYm1fdmVyc2lvbiA9IHZlcnNpb247Ci0JCUNMQVNTRVJUIChzaXplb2YobXNnLT5pYm1fdHlwZSkgPT0gMSk7Ci0JCUNMQVNTRVJUIChzaXplb2YobXNnLT5pYm1fY3JlZGl0cykgPT0gMSk7CisJCUNMQVNTRVJUKHNpemVvZihtc2ctPmlibV90eXBlKSA9PSAxKTsKKwkJQ0xBU1NFUlQoc2l6ZW9mKG1zZy0+aWJtX2NyZWRpdHMpID09IDEpOwogCQltc2ctPmlibV9ub2IgICAgID0gbXNnX25vYjsKIAkJX19zd2FiNjRzKCZtc2ctPmlibV9zcmNuaWQpOwogCQlfX3N3YWI2NHMoJm1zZy0+aWJtX3NyY3N0YW1wKTsKQEAgLTMyNCw4ICszMTgsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQKLWtpYmxuZF9jcmVhdGVfcGVlcihsbmV0X25pX3QgKm5pLCBraWJfcGVlcl90ICoqcGVlcnAsIGxuZXRfbmlkX3QgbmlkKQoraW50IGtpYmxuZF9jcmVhdGVfcGVlcihsbmV0X25pX3QgKm5pLCBraWJfcGVlcl90ICoqcGVlcnAsIGxuZXRfbmlkX3QgbmlkKQogewogCWtpYl9wZWVyX3QJKnBlZXI7CiAJa2liX25ldF90CSpuZXQgPSBuaS0+bmlfZGF0YTsKQEAgLTM1Niw3ICszNDksNyBAQAogCXdyaXRlX2xvY2tfaXJxc2F2ZSgma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAKIAkvKiBhbHdheXMgY2FsbGVkIHdpdGggYSByZWYgb24gbmksIHdoaWNoIHByZXZlbnRzIG5pIGJlaW5nIHNodXRkb3duICovCi0JTEFTU0VSVCAobmV0LT5pYm5fc2h1dGRvd24gPT0gMCk7CisJTEFTU0VSVChuZXQtPmlibl9zaHV0ZG93biA9PSAwKTsKIAogCS8qIG5wZWVycyBvbmx5IGdyb3dzIHdpdGggdGhlIGdsb2JhbCBsb2NrIGhlbGQgKi8KIAlhdG9taWNfaW5jKCZuZXQtPmlibl9ucGVlcnMpOwpAQCAtMzY3LDE4ICszNjAsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAota2libG5kX2Rlc3Ryb3lfcGVlciAoa2liX3BlZXJfdCAqcGVlcikKK3ZvaWQga2libG5kX2Rlc3Ryb3lfcGVlcihraWJfcGVlcl90ICpwZWVyKQogewogCWtpYl9uZXRfdCAqbmV0ID0gcGVlci0+aWJwX25pLT5uaV9kYXRhOwogCi0JTEFTU0VSVCAobmV0ICE9IE5VTEwpOwotCUxBU1NFUlQgKGF0b21pY19yZWFkKCZwZWVyLT5pYnBfcmVmY291bnQpID09IDApOwotCUxBU1NFUlQgKCFraWJsbmRfcGVlcl9hY3RpdmUocGVlcikpOwotCUxBU1NFUlQgKHBlZXItPmlicF9jb25uZWN0aW5nID09IDApOwotCUxBU1NFUlQgKHBlZXItPmlicF9hY2NlcHRpbmcgPT0gMCk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmcGVlci0+aWJwX2Nvbm5zKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmcGVlci0+aWJwX3R4X3F1ZXVlKSk7CisJTEFTU0VSVChuZXQgIT0gTlVMTCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmcGVlci0+aWJwX3JlZmNvdW50KSA9PSAwKTsKKwlMQVNTRVJUKCFraWJsbmRfcGVlcl9hY3RpdmUocGVlcikpOworCUxBU1NFUlQocGVlci0+aWJwX2Nvbm5lY3RpbmcgPT0gMCk7CisJTEFTU0VSVChwZWVyLT5pYnBfYWNjZXB0aW5nID09IDApOworCUxBU1NFUlQobGlzdF9lbXB0eSgmcGVlci0+aWJwX2Nvbm5zKSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfdHhfcXVldWUpKTsKIAogCUxJQkNGU19GUkVFKHBlZXIsIHNpemVvZigqcGVlcikpOwogCkBAIC0zODksOCArMzgxLDcgQEAKIAlhdG9taWNfZGVjKCZuZXQtPmlibl9ucGVlcnMpOwogfQogCi1raWJfcGVlcl90ICoKLWtpYmxuZF9maW5kX3BlZXJfbG9ja2VkIChsbmV0X25pZF90IG5pZCkKK2tpYl9wZWVyX3QgKmtpYmxuZF9maW5kX3BlZXJfbG9ja2VkKGxuZXRfbmlkX3QgbmlkKQogewogCS8qIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGFjY291bnRpbmcgdGhlIGFkZGl0aW9uYWwgcmVmZXJlbmNlCiAJICogdGhhdCB0aGlzIGNyZWF0ZXMgKi8KQEAgLTM5OCwxMSArMzg5LDExIEBACiAJc3RydWN0IGxpc3RfaGVhZCAgICAgICAqdG1wOwogCWtpYl9wZWVyX3QgICAgICAgKnBlZXI7CiAKLQlsaXN0X2Zvcl9lYWNoICh0bXAsIHBlZXJfbGlzdCkgeworCWxpc3RfZm9yX2VhY2godG1wLCBwZWVyX2xpc3QpIHsKIAogCQlwZWVyID0gbGlzdF9lbnRyeSh0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKIAotCQlMQVNTRVJUIChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwgLyogY3JlYXRpbmcgY29ubnMgKi8KKwkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwgLyogY3JlYXRpbmcgY29ubnMgKi8KIAkJCSBwZWVyLT5pYnBfYWNjZXB0aW5nID4gMCB8fAogCQkJICFsaXN0X2VtcHR5KCZwZWVyLT5pYnBfY29ubnMpKTsgIC8qIGFjdGl2ZSBjb25uICovCiAKQEAgLTQxOCwyMCArNDA5LDE4IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQKLWtpYmxuZF91bmxpbmtfcGVlcl9sb2NrZWQgKGtpYl9wZWVyX3QgKnBlZXIpCit2b2lkIGtpYmxuZF91bmxpbmtfcGVlcl9sb2NrZWQoa2liX3BlZXJfdCAqcGVlcikKIHsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfY29ubnMpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykpOwogCi0JTEFTU0VSVCAoa2libG5kX3BlZXJfYWN0aXZlKHBlZXIpKTsKKwlMQVNTRVJUKGtpYmxuZF9wZWVyX2FjdGl2ZShwZWVyKSk7CiAJbGlzdF9kZWxfaW5pdCgmcGVlci0+aWJwX2xpc3QpOwogCS8qIGxvc2UgcGVlcmxpc3QncyByZWYgKi8KIAlraWJsbmRfcGVlcl9kZWNyZWYocGVlcik7CiB9CiAKLXN0YXRpYyBpbnQKLWtpYmxuZF9nZXRfcGVlcl9pbmZvKGxuZXRfbmlfdCAqbmksIGludCBpbmRleCwKLQkJICAgICAgbG5ldF9uaWRfdCAqbmlkcCwgaW50ICpjb3VudCkKK3N0YXRpYyBpbnQga2libG5kX2dldF9wZWVyX2luZm8obG5ldF9uaV90ICpuaSwgaW50IGluZGV4LAorCQkJCWxuZXRfbmlkX3QgKm5pZHAsIGludCAqY291bnQpCiB7CiAJa2liX3BlZXJfdAkgICAgKnBlZXI7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgKnB0bXA7CkBAIC00NDIsMTAgKzQzMSwxMCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGtpYmxuZF9kYXRhLmtpYl9wZWVyX2hhc2hfc2l6ZTsgaSsrKSB7CiAKLQkJbGlzdF9mb3JfZWFjaCAocHRtcCwgJmtpYmxuZF9kYXRhLmtpYl9wZWVyc1tpXSkgeworCQlsaXN0X2Zvcl9lYWNoKHB0bXAsICZraWJsbmRfZGF0YS5raWJfcGVlcnNbaV0pIHsKIAogCQkJcGVlciA9IGxpc3RfZW50cnkocHRtcCwga2liX3BlZXJfdCwgaWJwX2xpc3QpOwotCQkJTEFTU0VSVCAocGVlci0+aWJwX2Nvbm5lY3RpbmcgPiAwIHx8CisJCQlMQVNTRVJUKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCB8fAogCQkJCSBwZWVyLT5pYnBfYWNjZXB0aW5nID4gMCB8fAogCQkJCSAhbGlzdF9lbXB0eSgmcGVlci0+aWJwX2Nvbm5zKSk7CiAKQEAgLTQ2OCw4ICs0NTcsNyBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2RlbF9wZWVyX2xvY2tlZChraWJfcGVlcl90ICpwZWVyKQorc3RhdGljIHZvaWQga2libG5kX2RlbF9wZWVyX2xvY2tlZChraWJfcGVlcl90ICpwZWVyKQogewogCXN0cnVjdCBsaXN0X2hlYWQJICAgKmN0bXA7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAqY254dDsKQEAgLTQ3OCw3ICs0NjYsNyBAQAogCWlmIChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfY29ubnMpKSB7CiAJCWtpYmxuZF91bmxpbmtfcGVlcl9sb2NrZWQocGVlcik7CiAJfSBlbHNlIHsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlIChjdG1wLCBjbnh0LCAmcGVlci0+aWJwX2Nvbm5zKSB7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShjdG1wLCBjbnh0LCAmcGVlci0+aWJwX2Nvbm5zKSB7CiAJCQljb25uID0gbGlzdF9lbnRyeShjdG1wLCBraWJfY29ubl90LCBpYmNfbGlzdCk7CiAKIAkJCWtpYmxuZF9jbG9zZV9jb25uX2xvY2tlZChjb25uLCAwKTsKQEAgLTQ4OSwxMCArNDc3LDkgQEAKIAkgKiBsYXN0IHJlZiBvbiBpdC4gKi8KIH0KIAotc3RhdGljIGludAota2libG5kX2RlbF9wZWVyKGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkKQorc3RhdGljIGludCBraWJsbmRfZGVsX3BlZXIobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBuaWQpCiB7Ci0JTElTVF9IRUFECSAoem9tYmllcyk7CisJTElTVF9IRUFEKHpvbWJpZXMpOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICpwdG1wOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICpwbnh0OwogCWtpYl9wZWVyX3QJICAgICpwZWVyOwpAQCAtNTEyLDkgKzQ5OSw5IEBACiAJfQogCiAJZm9yIChpID0gbG87IGkgPD0gaGk7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHB0bXAsIHBueHQsICZraWJsbmRfZGF0YS5raWJfcGVlcnNbaV0pIHsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHB0bXAsIHBueHQsICZraWJsbmRfZGF0YS5raWJfcGVlcnNbaV0pIHsKIAkJCXBlZXIgPSBsaXN0X2VudHJ5KHB0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKLQkJCUxBU1NFUlQgKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCB8fAorCQkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwKIAkJCQkgcGVlci0+aWJwX2FjY2VwdGluZyA+IDAgfHwKIAkJCQkgIWxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykpOwogCkBAIC01MjUsNyArNTEyLDcgQEAKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKCFsaXN0X2VtcHR5KCZwZWVyLT5pYnBfdHhfcXVldWUpKSB7Ci0JCQkJTEFTU0VSVCAobGlzdF9lbXB0eSgmcGVlci0+aWJwX2Nvbm5zKSk7CisJCQkJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfY29ubnMpKTsKIAogCQkJCWxpc3Rfc3BsaWNlX2luaXQoJnBlZXItPmlicF90eF9xdWV1ZSwKIAkJCQkJCSAgICAgJnpvbWJpZXMpOwpAQCAtNTQzLDggKzUzMCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMga2liX2Nvbm5fdCAqCi1raWJsbmRfZ2V0X2Nvbm5fYnlfaWR4KGxuZXRfbmlfdCAqbmksIGludCBpbmRleCkKK3N0YXRpYyBraWJfY29ubl90ICpraWJsbmRfZ2V0X2Nvbm5fYnlfaWR4KGxuZXRfbmlfdCAqbmksIGludCBpbmRleCkKIHsKIAlraWJfcGVlcl90CSAgICAqcGVlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAqcHRtcDsKQEAgLTU1NiwyNSArNTQyLDI2IEBACiAJcmVhZF9sb2NrX2lycXNhdmUoJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jaywgZmxhZ3MpOwogCiAJZm9yIChpID0gMDsgaSA8IGtpYmxuZF9kYXRhLmtpYl9wZWVyX2hhc2hfc2l6ZTsgaSsrKSB7Ci0JCWxpc3RfZm9yX2VhY2ggKHB0bXAsICZraWJsbmRfZGF0YS5raWJfcGVlcnNbaV0pIHsKKwkJbGlzdF9mb3JfZWFjaChwdG1wLCAma2libG5kX2RhdGEua2liX3BlZXJzW2ldKSB7CiAKIAkJCXBlZXIgPSBsaXN0X2VudHJ5KHB0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKLQkJCUxBU1NFUlQgKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCB8fAorCQkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwKIAkJCQkgcGVlci0+aWJwX2FjY2VwdGluZyA+IDAgfHwKIAkJCQkgIWxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykpOwogCiAJCQlpZiAocGVlci0+aWJwX25pICE9IG5pKQogCQkJCWNvbnRpbnVlOwogCi0JCQlsaXN0X2Zvcl9lYWNoIChjdG1wLCAmcGVlci0+aWJwX2Nvbm5zKSB7CisJCQlsaXN0X2Zvcl9lYWNoKGN0bXAsICZwZWVyLT5pYnBfY29ubnMpIHsKIAkJCQlpZiAoaW5kZXgtLSA+IDApCiAJCQkJCWNvbnRpbnVlOwogCiAJCQkJY29ubiA9IGxpc3RfZW50cnkoY3RtcCwga2liX2Nvbm5fdCwKIAkJCQkJCSAgICAgIGliY19saXN0KTsKIAkJCQlraWJsbmRfY29ubl9hZGRyZWYoY29ubik7Ci0JCQkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLAotCQkJCQkJICAgICAgIGZsYWdzKTsKKwkJCQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKAorCQkJCQkma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLAorCQkJCQlmbGFncyk7CiAJCQkJcmV0dXJuIGNvbm47CiAJCQl9CiAJCX0KQEAgLTU4NCw4ICs1NzEsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1pbnQKLWtpYmxuZF90cmFuc2xhdGVfbXR1KGludCB2YWx1ZSkKK2ludCBraWJsbmRfdHJhbnNsYXRlX210dShpbnQgdmFsdWUpCiB7CiAJc3dpdGNoICh2YWx1ZSkgewogCWRlZmF1bHQ6CkBAIC02MDUsOCArNTkxLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1raWJsbmRfc2V0dXBfbXR1X2xvY2tlZChzdHJ1Y3QgcmRtYV9jbV9pZCAqY21pZCkKK3N0YXRpYyB2b2lkIGtpYmxuZF9zZXR1cF9tdHVfbG9ja2VkKHN0cnVjdCByZG1hX2NtX2lkICpjbWlkKQogewogCWludAkgICBtdHU7CiAKQEAgLTYxNSwxMyArNjAwLDEyIEBACiAJCXJldHVybjsKIAogCW10dSA9IGtpYmxuZF90cmFuc2xhdGVfbXR1KCpraWJsbmRfdHVuYWJsZXMua2liX2liX210dSk7Ci0JTEFTU0VSVCAobXR1ID49IDApOworCUxBU1NFUlQobXR1ID49IDApOwogCWlmIChtdHUgIT0gMCkKIAkJY21pZC0+cm91dGUucGF0aF9yZWMtPm10dSA9IG10dTsKIH0KIAotc3RhdGljIGludAota2libG5kX2dldF9jb21wbGV0aW9uX3ZlY3RvcihraWJfY29ubl90ICpjb25uLCBpbnQgY3B0KQorc3RhdGljIGludCBraWJsbmRfZ2V0X2NvbXBsZXRpb25fdmVjdG9yKGtpYl9jb25uX3QgKmNvbm4sIGludCBjcHQpCiB7CiAJY3B1bWFza190CSptYXNrOwogCWludAkJdmVjdG9yczsKQEAgLTYzOCw4ICs2MjIsOCBAQAogCQlyZXR1cm4gMDsKIAogCS8qIGhhc2ggTklEIHRvIENQVSBpZCBpbiB0aGlzIHBhcnRpdGlvbi4uLiAqLwotCW9mZiA9IGRvX2RpdihuaWQsIGNwdXNfd2VpZ2h0KCptYXNrKSk7Ci0JZm9yX2VhY2hfY3B1X21hc2soaSwgKm1hc2spIHsKKwlvZmYgPSBkb19kaXYobmlkLCBjcHVtYXNrX3dlaWdodChtYXNrKSk7CisJZm9yX2VhY2hfY3B1KGksIG1hc2spIHsKIAkJaWYgKG9mZi0tID09IDApCiAJCQlyZXR1cm4gaSAlIHZlY3RvcnM7CiAJfQpAQCAtNjQ4LDkgKzYzMiw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLWtpYl9jb25uX3QgKgota2libG5kX2NyZWF0ZV9jb25uKGtpYl9wZWVyX3QgKnBlZXIsIHN0cnVjdCByZG1hX2NtX2lkICpjbWlkLAotCQkgICBpbnQgc3RhdGUsIGludCB2ZXJzaW9uKQora2liX2Nvbm5fdCAqa2libG5kX2NyZWF0ZV9jb25uKGtpYl9wZWVyX3QgKnBlZXIsIHN0cnVjdCByZG1hX2NtX2lkICpjbWlkLAorCQkJCWludCBzdGF0ZSwgaW50IHZlcnNpb24pCiB7CiAJLyogQ0FWRUFUIEVNUFRPUjoKIAkgKiBJZiB0aGUgbmV3IGNvbm4gaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkgaXQgdGFrZXMgb3ZlciB0aGUgY2FsbGVyJ3MKQEAgLTgzNSw3ICs4MTgsNyBAQAogCX0KIAogCS8qIEluaXQgc3VjY2Vzc2Z1bCEgKi8KLQlMQVNTRVJUIChzdGF0ZSA9PSBJQkxORF9DT05OX0FDVElWRV9DT05ORUNUIHx8CisJTEFTU0VSVChzdGF0ZSA9PSBJQkxORF9DT05OX0FDVElWRV9DT05ORUNUIHx8CiAJCSBzdGF0ZSA9PSBJQkxORF9DT05OX1BBU1NJVkVfV0FJVCk7CiAJY29ubi0+aWJjX3N0YXRlID0gc3RhdGU7CiAKQEAgLTg1MSwyMyArODM0LDIyIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQKLWtpYmxuZF9kZXN0cm95X2Nvbm4gKGtpYl9jb25uX3QgKmNvbm4pCit2b2lkIGtpYmxuZF9kZXN0cm95X2Nvbm4oa2liX2Nvbm5fdCAqY29ubikKIHsKIAlzdHJ1Y3QgcmRtYV9jbV9pZCAqY21pZCA9IGNvbm4tPmliY19jbWlkOwogCWtpYl9wZWVyX3QJKnBlZXIgPSBjb25uLT5pYmNfcGVlcjsKIAlpbnQJCXJjOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKLQlMQVNTRVJUIChhdG9taWNfcmVhZCgmY29ubi0+aWJjX3JlZmNvdW50KSA9PSAwKTsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZjb25uLT5pYmNfZWFybHlfcnhzKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmY29ubi0+aWJjX3R4X25vb3BzKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmY29ubi0+aWJjX3R4X3F1ZXVlKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmY29ubi0+aWJjX3R4X3F1ZXVlX3JzcnZkKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmY29ubi0+aWJjX3R4X3F1ZXVlX25vY3JlZCkpOwotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmNvbm4tPmliY19hY3RpdmVfdHhzKSk7Ci0JTEFTU0VSVCAoY29ubi0+aWJjX25vb3BzX3Bvc3RlZCA9PSAwKTsKLQlMQVNTRVJUIChjb25uLT5pYmNfbnNlbmRzX3Bvc3RlZCA9PSAwKTsKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmY29ubi0+aWJjX3JlZmNvdW50KSA9PSAwKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbm4tPmliY19lYXJseV9yeHMpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbm4tPmliY190eF9ub29wcykpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmY29ubi0+aWJjX3R4X3F1ZXVlKSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZjb25uLT5pYmNfdHhfcXVldWVfcnNydmQpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbm4tPmliY190eF9xdWV1ZV9ub2NyZWQpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbm4tPmliY19hY3RpdmVfdHhzKSk7CisJTEFTU0VSVChjb25uLT5pYmNfbm9vcHNfcG9zdGVkID09IDApOworCUxBU1NFUlQoY29ubi0+aWJjX25zZW5kc19wb3N0ZWQgPT0gMCk7CiAKIAlzd2l0Y2ggKGNvbm4tPmliY19zdGF0ZSkgewogCWRlZmF1bHQ6CkBAIC04NzYsNyArODU4LDcgQEAKIAogCWNhc2UgSUJMTkRfQ09OTl9ESVNDT05ORUNURUQ6CiAJCS8qIGNvbm52YXJzIHNob3VsZCBoYXZlIGJlZW4gZnJlZWQgYWxyZWFkeSAqLwotCQlMQVNTRVJUIChjb25uLT5pYmNfY29ubnZhcnMgPT0gTlVMTCk7CisJCUxBU1NFUlQoY29ubi0+aWJjX2Nvbm52YXJzID09IE5VTEwpOwogCQlicmVhazsKIAogCWNhc2UgSUJMTkRfQ09OTl9JTklUOgpAQCAtODk4LDcgKzg4MCw4IEBACiAKIAlpZiAoY29ubi0+aWJjX3J4cyAhPSBOVUxMKSB7CiAJCUxJQkNGU19GUkVFKGNvbm4tPmliY19yeHMsCi0JCQkgICAgSUJMTkRfUlhfTVNHUyhjb25uLT5pYmNfdmVyc2lvbikgKiBzaXplb2Yoa2liX3J4X3QpKTsKKwkJCSAgICBJQkxORF9SWF9NU0dTKGNvbm4tPmliY192ZXJzaW9uKQorCQkJICAgICAgKiBzaXplb2Yoa2liX3J4X3QpKTsKIAl9CiAKIAlpZiAoY29ubi0+aWJjX2Nvbm52YXJzICE9IE5VTEwpCkBAIC05MTksMTUgKzkwMiwxNCBAQAogCUxJQkNGU19GUkVFKGNvbm4sIHNpemVvZigqY29ubikpOwogfQogCi1pbnQKLWtpYmxuZF9jbG9zZV9wZWVyX2Nvbm5zX2xvY2tlZCAoa2liX3BlZXJfdCAqcGVlciwgaW50IHdoeSkKK2ludCBraWJsbmRfY2xvc2VfcGVlcl9jb25uc19sb2NrZWQoa2liX3BlZXJfdCAqcGVlciwgaW50IHdoeSkKIHsKIAlraWJfY29ubl90CSAgICAgKmNvbm47CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICpjdG1wOwogCXN0cnVjdCBsaXN0X2hlYWQJICAgICAqY254dDsKIAlpbnQJCSAgICAgY291bnQgPSAwOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlIChjdG1wLCBjbnh0LCAmcGVlci0+aWJwX2Nvbm5zKSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGN0bXAsIGNueHQsICZwZWVyLT5pYnBfY29ubnMpIHsKIAkJY29ubiA9IGxpc3RfZW50cnkoY3RtcCwga2liX2Nvbm5fdCwgaWJjX2xpc3QpOwogCiAJCUNERUJVRyhEX05FVCwgIkNsb3NpbmcgY29ubiAtPiAlcywgdmVyc2lvbjogJXgsIHJlYXNvbjogJWRcbiIsCkBAIC05NDEsMjMgKzkyMywyMyBAQAogCXJldHVybiBjb3VudDsKIH0KIAotaW50Ci1raWJsbmRfY2xvc2Vfc3RhbGVfY29ubnNfbG9ja2VkIChraWJfcGVlcl90ICpwZWVyLAotCQkJCSBpbnQgdmVyc2lvbiwgX191NjQgaW5jYXJuYXRpb24pCitpbnQga2libG5kX2Nsb3NlX3N0YWxlX2Nvbm5zX2xvY2tlZChraWJfcGVlcl90ICpwZWVyLAorCQkJCSAgICAgaW50IHZlcnNpb24sIF9fdTY0IGluY2FybmF0aW9uKQogewogCWtpYl9jb25uX3QJICAgICAqY29ubjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgKmN0bXA7CiAJc3RydWN0IGxpc3RfaGVhZAkgICAgICpjbnh0OwogCWludAkJICAgICBjb3VudCA9IDA7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUgKGN0bXAsIGNueHQsICZwZWVyLT5pYnBfY29ubnMpIHsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoY3RtcCwgY254dCwgJnBlZXItPmlicF9jb25ucykgewogCQljb25uID0gbGlzdF9lbnRyeShjdG1wLCBraWJfY29ubl90LCBpYmNfbGlzdCk7CiAKIAkJaWYgKGNvbm4tPmliY192ZXJzaW9uICAgICA9PSB2ZXJzaW9uICYmCiAJCSAgICBjb25uLT5pYmNfaW5jYXJuYXRpb24gPT0gaW5jYXJuYXRpb24pCiAJCQljb250aW51ZTsKIAotCQlDREVCVUcoRF9ORVQsICJDbG9zaW5nIHN0YWxlIGNvbm4gLT4gJXMgdmVyc2lvbjogJXgsIGluY2FybmF0aW9uOiUjbGx4KCV4LCAlI2xseClcbiIsCisJCUNERUJVRyhEX05FVCwKKwkJICAgICAgICJDbG9zaW5nIHN0YWxlIGNvbm4gLT4gJXMgdmVyc2lvbjogJXgsIGluY2FybmF0aW9uOiUjbGx4KCV4LCAlI2xseClcbiIsCiAJCSAgICAgICBsaWJjZnNfbmlkMnN0cihwZWVyLT5pYnBfbmlkKSwKIAkJICAgICAgIGNvbm4tPmliY192ZXJzaW9uLCBjb25uLT5pYmNfaW5jYXJuYXRpb24sCiAJCSAgICAgICB2ZXJzaW9uLCBpbmNhcm5hdGlvbik7CkBAIC05NjksOCArOTUxLDcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBpbnQKLWtpYmxuZF9jbG9zZV9tYXRjaGluZ19jb25ucyhsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCkKK3N0YXRpYyBpbnQga2libG5kX2Nsb3NlX21hdGNoaW5nX2Nvbm5zKGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkKQogewogCWtpYl9wZWVyX3QJICAgICAqcGVlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgICAgKnB0bXA7CkBAIC05OTEsMTAgKzk3MiwxMCBAQAogCX0KIAogCWZvciAoaSA9IGxvOyBpIDw9IGhpOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlIChwdG1wLCBwbnh0LCAma2libG5kX2RhdGEua2liX3BlZXJzW2ldKSB7CisJCWxpc3RfZm9yX2VhY2hfc2FmZShwdG1wLCBwbnh0LCAma2libG5kX2RhdGEua2liX3BlZXJzW2ldKSB7CiAKIAkJCXBlZXIgPSBsaXN0X2VudHJ5KHB0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKLQkJCUxBU1NFUlQgKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCB8fAorCQkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwKIAkJCQkgcGVlci0+aWJwX2FjY2VwdGluZyA+IDAgfHwKIAkJCQkgIWxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykpOwogCkBAIC0xMDE3LDggKzk5OCw3IEBACiAJcmV0dXJuIChjb3VudCA9PSAwKSA/IC1FTk9FTlQgOiAwOwogfQogCi1pbnQKLWtpYmxuZF9jdGwobG5ldF9uaV90ICpuaSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQoraW50IGtpYmxuZF9jdGwobG5ldF9uaV90ICpuaSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKQogewogCXN0cnVjdCBsaWJjZnNfaW9jdGxfZGF0YSAqZGF0YSA9IGFyZzsKIAlpbnQJCSAgICAgICByYyA9IC1FSU5WQUw7CkBAIC0xMDQ5LDcgKzEwMjksNyBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlMQVNTRVJUIChjb25uLT5pYmNfY21pZCAhPSBOVUxMKTsKKwkJTEFTU0VSVChjb25uLT5pYmNfY21pZCAhPSBOVUxMKTsKIAkJZGF0YS0+aW9jX25pZCA9IGNvbm4tPmliY19wZWVyLT5pYnBfbmlkOwogCQlpZiAoY29ubi0+aWJjX2NtaWQtPnJvdXRlLnBhdGhfcmVjID09IE5VTEwpCiAJCQlkYXRhLT5pb2NfdTMyWzBdID0gMDsgLyogaVdhcnAgaGFzIG5vIHBhdGggTVRVICovCkBAIC0xMDcxLDggKzEwNTEsNyBAQAogCXJldHVybiByYzsKIH0KIAotdm9pZAota2libG5kX3F1ZXJ5IChsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCwgdW5zaWduZWQgbG9uZyAqd2hlbikKK3ZvaWQga2libG5kX3F1ZXJ5KGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkLCB1bnNpZ25lZCBsb25nICp3aGVuKQogewogCXVuc2lnbmVkIGxvbmcJbGFzdF9hbGl2ZSA9IDA7CiAJdW5zaWduZWQgbG9uZwlub3cgPSBjZnNfdGltZV9jdXJyZW50KCk7CkBAIC0xMDg0LDcgKzEwNjMsNyBAQAogCiAJcGVlciA9IGtpYmxuZF9maW5kX3BlZXJfbG9ja2VkKG5pZCk7CiAJaWYgKHBlZXIgIT0gTlVMTCkgewotCQlMQVNTRVJUIChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwgLyogY3JlYXRpbmcgY29ubnMgKi8KKwkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDAgfHwgLyogY3JlYXRpbmcgY29ubnMgKi8KIAkJCSBwZWVyLT5pYnBfYWNjZXB0aW5nID4gMCB8fAogCQkJICFsaXN0X2VtcHR5KCZwZWVyLT5pYnBfY29ubnMpKTsgIC8qIGFjdGl2ZSBjb25uICovCiAJCWxhc3RfYWxpdmUgPSBwZWVyLT5pYnBfbGFzdF9hbGl2ZTsKQEAgLTExMDMsMTEgKzEwODIsOSBAQAogCUNERUJVRyhEX05FVCwgIlBlZXIgJXMgJXAsIGFsaXZlICVsZCBzZWNzIGFnb1xuIiwKIAkgICAgICAgbGliY2ZzX25pZDJzdHIobmlkKSwgcGVlciwKIAkgICAgICAgbGFzdF9hbGl2ZSA/IGNmc19kdXJhdGlvbl9zZWMobm93IC0gbGFzdF9hbGl2ZSkgOiAtMSk7Ci0JcmV0dXJuOwogfQogCi12b2lkCi1raWJsbmRfZnJlZV9wYWdlcyhraWJfcGFnZXNfdCAqcCkKK3ZvaWQga2libG5kX2ZyZWVfcGFnZXMoa2liX3BhZ2VzX3QgKnApCiB7CiAJaW50CW5wYWdlcyA9IHAtPmlicF9ucGFnZXM7CiAJaW50CWk7CkBAIC0xMTIwLDggKzEwOTcsNyBAQAogCUxJQkNGU19GUkVFKHAsIG9mZnNldG9mKGtpYl9wYWdlc190LCBpYnBfcGFnZXNbbnBhZ2VzXSkpOwogfQogCi1pbnQKLWtpYmxuZF9hbGxvY19wYWdlcyhraWJfcGFnZXNfdCAqKnBwLCBpbnQgY3B0LCBpbnQgbnBhZ2VzKQoraW50IGtpYmxuZF9hbGxvY19wYWdlcyhraWJfcGFnZXNfdCAqKnBwLCBpbnQgY3B0LCBpbnQgbnBhZ2VzKQogewogCWtpYl9wYWdlc190CSpwOwogCWludAkJaTsKQEAgLTExNTEsMTkgKzExMjcsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZAota2libG5kX3VubWFwX3J4X2Rlc2NzKGtpYl9jb25uX3QgKmNvbm4pCit2b2lkIGtpYmxuZF91bm1hcF9yeF9kZXNjcyhraWJfY29ubl90ICpjb25uKQogewogCWtpYl9yeF90ICpyeDsKIAlpbnQgICAgICAgaTsKIAotCUxBU1NFUlQgKGNvbm4tPmliY19yeHMgIT0gTlVMTCk7Ci0JTEFTU0VSVCAoY29ubi0+aWJjX2hkZXYgIT0gTlVMTCk7CisJTEFTU0VSVChjb25uLT5pYmNfcnhzICE9IE5VTEwpOworCUxBU1NFUlQoY29ubi0+aWJjX2hkZXYgIT0gTlVMTCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSUJMTkRfUlhfTVNHUyhjb25uLT5pYmNfdmVyc2lvbik7IGkrKykgewogCQlyeCA9ICZjb25uLT5pYmNfcnhzW2ldOwogCi0JCUxBU1NFUlQgKHJ4LT5yeF9ub2IgPj0gMCk7IC8qIG5vdCBwb3N0ZWQgKi8KKwkJTEFTU0VSVChyeC0+cnhfbm9iID49IDApOyAvKiBub3QgcG9zdGVkICovCiAKIAkJa2libG5kX2RtYV91bm1hcF9zaW5nbGUoY29ubi0+aWJjX2hkZXYtPmliaF9pYmRldiwKIAkJCQkJS0lCTE5EX1VOTUFQX0FERFIocngsIHJ4X21zZ3VubWFwLApAQCAtMTE3Niw4ICsxMTUxLDcgQEAKIAljb25uLT5pYmNfcnhfcGFnZXMgPSBOVUxMOwogfQogCi12b2lkCi1raWJsbmRfbWFwX3J4X2Rlc2NzKGtpYl9jb25uX3QgKmNvbm4pCit2b2lkIGtpYmxuZF9tYXBfcnhfZGVzY3Moa2liX2Nvbm5fdCAqY29ubikKIHsKIAlraWJfcnhfdCAgICAgICAqcng7CiAJc3RydWN0IHBhZ2UgICAgKnBnOwpAQCAtMTE5NCw5ICsxMTY4LDEwIEBACiAJCXJ4LT5yeF9tc2cgPSAoa2liX21zZ190ICopKCgoY2hhciAqKXBhZ2VfYWRkcmVzcyhwZykpICsgcGdfb2ZmKTsKIAogCQlyeC0+cnhfbXNnYWRkciA9IGtpYmxuZF9kbWFfbWFwX3NpbmdsZShjb25uLT5pYmNfaGRldi0+aWJoX2liZGV2LAotCQkJCQkJICAgICAgIHJ4LT5yeF9tc2csIElCTE5EX01TR19TSVpFLAorCQkJCQkJICAgICAgIHJ4LT5yeF9tc2csCisJCQkJCQkgICAgICAgSUJMTkRfTVNHX1NJWkUsCiAJCQkJCQkgICAgICAgRE1BX0ZST01fREVWSUNFKTsKLQkJTEFTU0VSVCAoIWtpYmxuZF9kbWFfbWFwcGluZ19lcnJvcihjb25uLT5pYmNfaGRldi0+aWJoX2liZGV2LAorCQlMQVNTRVJUKCFraWJsbmRfZG1hX21hcHBpbmdfZXJyb3IoY29ubi0+aWJjX2hkZXYtPmliaF9pYmRldiwKIAkJCQkJCSAgIHJ4LT5yeF9tc2dhZGRyKSk7CiAJCUtJQkxORF9VTk1BUF9BRERSX1NFVChyeCwgcnhfbXNndW5tYXAsIHJ4LT5yeF9tc2dhZGRyKTsKIApAQCAtMTIwNSwyNCArMTE4MCwyMyBAQAogCQkgICAgICAgbG5ldF9wYWdlMnBoeXMocGcpICsgcGdfb2ZmKTsKIAogCQlwZ19vZmYgKz0gSUJMTkRfTVNHX1NJWkU7Ci0JCUxBU1NFUlQgKHBnX29mZiA8PSBQQUdFX1NJWkUpOworCQlMQVNTRVJUKHBnX29mZiA8PSBQQUdFX1NJWkUpOwogCiAJCWlmIChwZ19vZmYgPT0gUEFHRV9TSVpFKSB7CiAJCQlwZ19vZmYgPSAwOwogCQkJaXBnKys7Ci0JCQlMQVNTRVJUIChpcGcgPD0gSUJMTkRfUlhfTVNHX1BBR0VTKGNvbm4tPmliY192ZXJzaW9uKSk7CisJCQlMQVNTRVJUKGlwZyA8PSBJQkxORF9SWF9NU0dfUEFHRVMoY29ubi0+aWJjX3ZlcnNpb24pKTsKIAkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF91bm1hcF90eF9wb29sKGtpYl90eF9wb29sX3QgKnRwbykKK3N0YXRpYyB2b2lkIGtpYmxuZF91bm1hcF90eF9wb29sKGtpYl90eF9wb29sX3QgKnRwbykKIHsKIAlraWJfaGNhX2Rldl90ICAqaGRldiA9IHRwby0+dHBvX2hkZXY7CiAJa2liX3R4X3QgICAgICAgKnR4OwogCWludAkgICAgIGk7CiAKLQlMQVNTRVJUICh0cG8tPnRwb19wb29sLnBvX2FsbG9jYXRlZCA9PSAwKTsKKwlMQVNTRVJUKHRwby0+dHBvX3Bvb2wucG9fYWxsb2NhdGVkID09IDApOwogCiAJaWYgKGhkZXYgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtMTIzOSw4ICsxMjEzLDcgQEAKIAl0cG8tPnRwb19oZGV2ID0gTlVMTDsKIH0KIAotc3RhdGljIGtpYl9oY2FfZGV2X3QgKgota2libG5kX2N1cnJlbnRfaGRldihraWJfZGV2X3QgKmRldikKK3N0YXRpYyBraWJfaGNhX2Rldl90ICpraWJsbmRfY3VycmVudF9oZGV2KGtpYl9kZXZfdCAqZGV2KQogewogCWtpYl9oY2FfZGV2X3QgKmhkZXY7CiAJdW5zaWduZWQgbG9uZyAgZmxhZ3M7CkBAIC0xMjY1LDggKzEyMzgsNyBAQAogCXJldHVybiBoZGV2OwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX21hcF90eF9wb29sKGtpYl90eF9wb29sX3QgKnRwbykKK3N0YXRpYyB2b2lkIGtpYmxuZF9tYXBfdHhfcG9vbChraWJfdHhfcG9vbF90ICp0cG8pCiB7CiAJa2liX3BhZ2VzX3QgICAgKnR4cGdzID0gdHBvLT50cG9fdHhfcGFnZXM7CiAJa2liX3Bvb2xfdCAgICAgKnBvb2wgID0gJnRwby0+dHBvX3Bvb2w7CkBAIC0xMjc4LDE1ICsxMjUwLDE1IEBACiAJaW50CSAgICAgaXBhZ2U7CiAJaW50CSAgICAgaTsKIAotCUxBU1NFUlQgKG5ldCAhPSBOVUxMKTsKKwlMQVNTRVJUKG5ldCAhPSBOVUxMKTsKIAogCWRldiA9IG5ldC0+aWJuX2RldjsKIAogCS8qIHByZS1tYXBwZWQgbWVzc2FnZXMgYXJlIG5vdCBiaWdnZXIgdGhhbiAxIHBhZ2UgKi8KLQlDTEFTU0VSVCAoSUJMTkRfTVNHX1NJWkUgPD0gUEFHRV9TSVpFKTsKKwlDTEFTU0VSVChJQkxORF9NU0dfU0laRSA8PSBQQUdFX1NJWkUpOwogCiAJLyogTm8gZmFuY3kgYXJpdGhtZXRpYyB3aGVuIHdlIGRvIHRoZSBidWZmZXIgY2FsY3VsYXRpb25zICovCi0JQ0xBU1NFUlQgKFBBR0VfU0laRSAlIElCTE5EX01TR19TSVpFID09IDApOworCUNMQVNTRVJUKFBBR0VfU0laRSAlIElCTE5EX01TR19TSVpFID09IDApOwogCiAJdHBvLT50cG9faGRldiA9IGtpYmxuZF9jdXJyZW50X2hkZXYoZGV2KTsKIApAQCAtMTMwMCwyOSArMTI3MiwyOCBAQAogCQl0eC0+dHhfbXNnYWRkciA9IGtpYmxuZF9kbWFfbWFwX3NpbmdsZSgKIAkJCXRwby0+dHBvX2hkZXYtPmliaF9pYmRldiwgdHgtPnR4X21zZywKIAkJCUlCTE5EX01TR19TSVpFLCBETUFfVE9fREVWSUNFKTsKLQkJTEFTU0VSVCAoIWtpYmxuZF9kbWFfbWFwcGluZ19lcnJvcih0cG8tPnRwb19oZGV2LT5pYmhfaWJkZXYsCisJCUxBU1NFUlQoIWtpYmxuZF9kbWFfbWFwcGluZ19lcnJvcih0cG8tPnRwb19oZGV2LT5pYmhfaWJkZXYsCiAJCQkJCQkgICB0eC0+dHhfbXNnYWRkcikpOwogCQlLSUJMTkRfVU5NQVBfQUREUl9TRVQodHgsIHR4X21zZ3VubWFwLCB0eC0+dHhfbXNnYWRkcik7CiAKIAkJbGlzdF9hZGQoJnR4LT50eF9saXN0LCAmcG9vbC0+cG9fZnJlZV9saXN0KTsKIAogCQlwYWdlX29mZnNldCArPSBJQkxORF9NU0dfU0laRTsKLQkJTEFTU0VSVCAocGFnZV9vZmZzZXQgPD0gUEFHRV9TSVpFKTsKKwkJTEFTU0VSVChwYWdlX29mZnNldCA8PSBQQUdFX1NJWkUpOwogCiAJCWlmIChwYWdlX29mZnNldCA9PSBQQUdFX1NJWkUpIHsKIAkJCXBhZ2Vfb2Zmc2V0ID0gMDsKIAkJCWlwYWdlKys7Ci0JCQlMQVNTRVJUIChpcGFnZSA8PSB0eHBncy0+aWJwX25wYWdlcyk7CisJCQlMQVNTRVJUKGlwYWdlIDw9IHR4cGdzLT5pYnBfbnBhZ2VzKTsKIAkJfQogCX0KIH0KIAotc3RydWN0IGliX21yICoKLWtpYmxuZF9maW5kX2RtYV9tcihraWJfaGNhX2Rldl90ICpoZGV2LCBfX3U2NCBhZGRyLCBfX3U2NCBzaXplKQorc3RydWN0IGliX21yICpraWJsbmRfZmluZF9kbWFfbXIoa2liX2hjYV9kZXZfdCAqaGRldiwgX191NjQgYWRkciwgX191NjQgc2l6ZSkKIHsKIAlfX3U2NCAgIGluZGV4OwogCi0JTEFTU0VSVCAoaGRldi0+aWJoX21yc1swXSAhPSBOVUxMKTsKKwlMQVNTRVJUKGhkZXYtPmliaF9tcnNbMF0gIT0gTlVMTCk7CiAKIAlpZiAoaGRldi0+aWJoX25tcnMgPT0gMSkKIAkJcmV0dXJuIGhkZXYtPmliaF9tcnNbMF07CkBAIC0xMzM2LDE0ICsxMzA3LDEzIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBpYl9tciAqCi1raWJsbmRfZmluZF9yZF9kbWFfbXIoa2liX2hjYV9kZXZfdCAqaGRldiwga2liX3JkbWFfZGVzY190ICpyZCkKK3N0cnVjdCBpYl9tciAqa2libG5kX2ZpbmRfcmRfZG1hX21yKGtpYl9oY2FfZGV2X3QgKmhkZXYsIGtpYl9yZG1hX2Rlc2NfdCAqcmQpCiB7CiAJc3RydWN0IGliX21yICpwcmV2X21yOwogCXN0cnVjdCBpYl9tciAqbXI7CiAJaW50CSAgIGk7CiAKLQlMQVNTRVJUIChoZGV2LT5pYmhfbXJzWzBdICE9IE5VTEwpOworCUxBU1NFUlQoaGRldi0+aWJoX21yc1swXSAhPSBOVUxMKTsKIAogCWlmICgqa2libG5kX3R1bmFibGVzLmtpYl9tYXBfb25fZGVtYW5kID4gMCAmJgogCSAgICAqa2libG5kX3R1bmFibGVzLmtpYl9tYXBfb25fZGVtYW5kIDw9IHJkLT5yZF9uZnJhZ3MpCkBAIC0xMzcwLDEwICsxMzQwLDkgQEAKIAlyZXR1cm4gbXI7CiB9CiAKLXN0YXRpYyB2b2lkCi1raWJsbmRfZGVzdHJveV9mbXJfcG9vbChraWJfZm1yX3Bvb2xfdCAqcG9vbCkKK3N0YXRpYyB2b2lkIGtpYmxuZF9kZXN0cm95X2Ztcl9wb29sKGtpYl9mbXJfcG9vbF90ICpwb29sKQogewotCUxBU1NFUlQgKHBvb2wtPmZwb19tYXBfY291bnQgPT0gMCk7CisJTEFTU0VSVChwb29sLT5mcG9fbWFwX2NvdW50ID09IDApOwogCiAJaWYgKHBvb2wtPmZwb19mbXJfcG9vbCAhPSBOVUxMKQogCQlpYl9kZXN0cm95X2Ztcl9wb29sKHBvb2wtPmZwb19mbXJfcG9vbCk7CkBAIC0xMzg0LDggKzEzNTMsNyBAQAogCUxJQkNGU19GUkVFKHBvb2wsIHNpemVvZihraWJfZm1yX3Bvb2xfdCkpOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2Rlc3Ryb3lfZm1yX3Bvb2xfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQorc3RhdGljIHZvaWQga2libG5kX2Rlc3Ryb3lfZm1yX3Bvb2xfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewogCWtpYl9mbXJfcG9vbF90ICpwb29sOwogCkBAIC0xNDEwLDggKzEzNzgsOCBAQAogCXJldHVybiBtYXgoSUJMTkRfRk1SX1BPT0xfRkxVU0gsIHNpemUpOwogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfY3JlYXRlX2Ztcl9wb29sKGtpYl9mbXJfcG9vbHNldF90ICpmcHMsIGtpYl9mbXJfcG9vbF90ICoqcHBfZnBvKQorc3RhdGljIGludCBraWJsbmRfY3JlYXRlX2Ztcl9wb29sKGtpYl9mbXJfcG9vbHNldF90ICpmcHMsCisJCQkJICBraWJfZm1yX3Bvb2xfdCAqKnBwX2ZwbykKIHsKIAkvKiBGTVIgcG9vbCBmb3IgUkRNQSAqLwogCWtpYl9kZXZfdAkgICAgICAgKmRldiA9IGZwcy0+ZnBzX25ldC0+aWJuX2RldjsKQEAgLTE0NTEsOCArMTQxOSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1raWJsbmRfZmFpbF9mbXJfcG9vbHNldChraWJfZm1yX3Bvb2xzZXRfdCAqZnBzLCBzdHJ1Y3QgbGlzdF9oZWFkICp6b21iaWVzKQorc3RhdGljIHZvaWQga2libG5kX2ZhaWxfZm1yX3Bvb2xzZXQoa2liX2Ztcl9wb29sc2V0X3QgKmZwcywKKwkJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqem9tYmllcykKIHsKIAlpZiAoZnBzLT5mcHNfbmV0ID09IE5VTEwpIC8qIGludGlhbGl6ZWQ/ICovCiAJCXJldHVybjsKQEAgLTE0NzMsOCArMTQ0MSw3IEBACiAJc3Bpbl91bmxvY2soJmZwcy0+ZnBzX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2ZpbmlfZm1yX3Bvb2xzZXQoa2liX2Ztcl9wb29sc2V0X3QgKmZwcykKK3N0YXRpYyB2b2lkIGtpYmxuZF9maW5pX2Ztcl9wb29sc2V0KGtpYl9mbXJfcG9vbHNldF90ICpmcHMpCiB7CiAJaWYgKGZwcy0+ZnBzX25ldCAhPSBOVUxMKSB7IC8qIGluaXRpYWxpemVkPyAqLwogCQlraWJsbmRfZGVzdHJveV9mbXJfcG9vbF9saXN0KCZmcHMtPmZwc19mYWlsZWRfcG9vbF9saXN0KTsKQEAgLTE0ODIsOSArMTQ0OSw5IEBACiAJfQogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfaW5pdF9mbXJfcG9vbHNldChraWJfZm1yX3Bvb2xzZXRfdCAqZnBzLCBpbnQgY3B0LCBraWJfbmV0X3QgKm5ldCwKLQkJCWludCBwb29sX3NpemUsIGludCBmbHVzaF90cmlnZ2VyKQorc3RhdGljIGludCBraWJsbmRfaW5pdF9mbXJfcG9vbHNldChraWJfZm1yX3Bvb2xzZXRfdCAqZnBzLCBpbnQgY3B0LAorCQkJCSAgIGtpYl9uZXRfdCAqbmV0LCBpbnQgcG9vbF9zaXplLAorCQkJCSAgIGludCBmbHVzaF90cmlnZ2VyKQogewogCWtpYl9mbXJfcG9vbF90ICpmcG87CiAJaW50CSAgICAgcmM7CkBAIC0xNTA2LDggKzE0NzMsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludAota2libG5kX2Ztcl9wb29sX2lzX2lkbGUoa2liX2Ztcl9wb29sX3QgKmZwbywgdW5zaWduZWQgbG9uZyBub3cpCitzdGF0aWMgaW50IGtpYmxuZF9mbXJfcG9vbF9pc19pZGxlKGtpYl9mbXJfcG9vbF90ICpmcG8sIHVuc2lnbmVkIGxvbmcgbm93KQogewogCWlmIChmcG8tPmZwb19tYXBfY291bnQgIT0gMCkgLyogc3RpbGwgaW4gdXNlICovCiAJCXJldHVybiAwOwpAQCAtMTUxNiwxMCArMTQ4Miw5IEBACiAJcmV0dXJuIGNmc190aW1lX2FmdGVyZXEobm93LCBmcG8tPmZwb19kZWFkbGluZSk7CiB9CiAKLXZvaWQKLWtpYmxuZF9mbXJfcG9vbF91bm1hcChraWJfZm1yX3QgKmZtciwgaW50IHN0YXR1cykKK3ZvaWQga2libG5kX2Ztcl9wb29sX3VubWFwKGtpYl9mbXJfdCAqZm1yLCBpbnQgc3RhdHVzKQogewotCUxJU1RfSEVBRCAgICAgKHpvbWJpZXMpOworCUxJU1RfSEVBRCh6b21iaWVzKTsKIAlraWJfZm1yX3Bvb2xfdCAgICAqZnBvID0gZm1yLT5mbXJfcG9vbDsKIAlraWJfZm1yX3Bvb2xzZXRfdCAqZnBzID0gZnBvLT5mcG9fb3duZXI7CiAJdW5zaWduZWQgbG9uZwkgbm93ID0gY2ZzX3RpbWVfY3VycmVudCgpOwpAQCAtMTUyNywxMSArMTQ5MiwxMSBAQAogCWludAkJcmM7CiAKIAlyYyA9IGliX2Ztcl9wb29sX3VubWFwKGZtci0+Zm1yX3BmbXIpOwotCUxBU1NFUlQgKHJjID09IDApOworCUxBU1NFUlQocmMgPT0gMCk7CiAKIAlpZiAoc3RhdHVzICE9IDApIHsKIAkJcmMgPSBpYl9mbHVzaF9mbXJfcG9vbChmcG8tPmZwb19mbXJfcG9vbCk7Ci0JCUxBU1NFUlQgKHJjID09IDApOworCQlMQVNTRVJUKHJjID09IDApOwogCX0KIAogCWZtci0+Zm1yX3Bvb2wgPSBOVUxMOwpAQCAtMTU1Niw5ICsxNTIxLDggQEAKIAkJa2libG5kX2Rlc3Ryb3lfZm1yX3Bvb2xfbGlzdCgmem9tYmllcyk7CiB9CiAKLWludAota2libG5kX2Ztcl9wb29sX21hcChraWJfZm1yX3Bvb2xzZXRfdCAqZnBzLCBfX3U2NCAqcGFnZXMsIGludCBucGFnZXMsCi0JCSAgICBfX3U2NCBpb3YsIGtpYl9mbXJfdCAqZm1yKQoraW50IGtpYmxuZF9mbXJfcG9vbF9tYXAoa2liX2Ztcl9wb29sc2V0X3QgKmZwcywgX191NjQgKnBhZ2VzLCBpbnQgbnBhZ2VzLAorCQkJX191NjQgaW92LCBraWJfZm1yX3QgKmZtcikKIHsKIAlzdHJ1Y3QgaWJfcG9vbF9mbXIgKnBmbXI7CiAJa2liX2Ztcl9wb29sX3QgICAgICpmcG87CkBAIC0xNTk3LDcgKzE1NjEsOCBAQAogCiAJaWYgKGZwcy0+ZnBzX2luY3JlYXNpbmcpIHsKIAkJc3Bpbl91bmxvY2soJmZwcy0+ZnBzX2xvY2spOwotCQlDREVCVUcoRF9ORVQsICJBbm90aGVyIHRocmVhZCBpcyBhbGxvY2F0aW5nIG5ldyBGTVIgcG9vbCwgd2FpdGluZyBmb3IgaGVyIHRvIGNvbXBsZXRlXG4iKTsKKwkJQ0RFQlVHKERfTkVULAorCQkJIkFub3RoZXIgdGhyZWFkIGlzIGFsbG9jYXRpbmcgbmV3IEZNUiBwb29sLCB3YWl0aW5nIGZvciBoZXIgdG8gY29tcGxldGVcbiIpOwogCQlzY2hlZHVsZSgpOwogCQlnb3RvIGFnYWluOwogCkBAIC0xNjI3LDE3ICsxNTkyLDE1IEBACiAJZ290byBhZ2FpbjsKIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF9maW5pX3Bvb2woa2liX3Bvb2xfdCAqcG9vbCkKK3N0YXRpYyB2b2lkIGtpYmxuZF9maW5pX3Bvb2woa2liX3Bvb2xfdCAqcG9vbCkKIHsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZwb29sLT5wb19mcmVlX2xpc3QpKTsKLQlMQVNTRVJUIChwb29sLT5wb19hbGxvY2F0ZWQgPT0gMCk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZwb29sLT5wb19mcmVlX2xpc3QpKTsKKwlMQVNTRVJUKHBvb2wtPnBvX2FsbG9jYXRlZCA9PSAwKTsKIAogCUNERUJVRyhEX05FVCwgIkZpbmFsaXplICVzIHBvb2xcbiIsIHBvb2wtPnBvX293bmVyLT5wc19uYW1lKTsKIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF9pbml0X3Bvb2woa2liX3Bvb2xzZXRfdCAqcHMsIGtpYl9wb29sX3QgKnBvb2wsIGludCBzaXplKQorc3RhdGljIHZvaWQga2libG5kX2luaXRfcG9vbChraWJfcG9vbHNldF90ICpwcywga2liX3Bvb2xfdCAqcG9vbCwgaW50IHNpemUpCiB7CiAJQ0RFQlVHKERfTkVULCAiSW5pdGlhbGl6ZSAlcyBwb29sXG4iLCBwcy0+cHNfbmFtZSk7CiAKQEAgLTE2NDgsOCArMTYxMSw3IEBACiAJcG9vbC0+cG9fc2l6ZSAgICAgPSBzaXplOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2Rlc3Ryb3lfcG9vbF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCitzdGF0aWMgdm9pZCBraWJsbmRfZGVzdHJveV9wb29sX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKIHsKIAlraWJfcG9vbF90ICpwb29sOwogCkBAIC0xNjU3LDEzICsxNjE5LDEyIEBACiAJCXBvb2wgPSBsaXN0X2VudHJ5KGhlYWQtPm5leHQsIGtpYl9wb29sX3QsIHBvX2xpc3QpOwogCQlsaXN0X2RlbCgmcG9vbC0+cG9fbGlzdCk7CiAKLQkJTEFTU0VSVCAocG9vbC0+cG9fb3duZXIgIT0gTlVMTCk7CisJCUxBU1NFUlQocG9vbC0+cG9fb3duZXIgIT0gTlVMTCk7CiAJCXBvb2wtPnBvX293bmVyLT5wc19wb29sX2Rlc3Ryb3kocG9vbCk7CiAJfQogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2ZhaWxfcG9vbHNldChraWJfcG9vbHNldF90ICpwcywgc3RydWN0IGxpc3RfaGVhZCAqem9tYmllcykKK3N0YXRpYyB2b2lkIGtpYmxuZF9mYWlsX3Bvb2xzZXQoa2liX3Bvb2xzZXRfdCAqcHMsIHN0cnVjdCBsaXN0X2hlYWQgKnpvbWJpZXMpCiB7CiAJaWYgKHBzLT5wc19uZXQgPT0gTlVMTCkgLyogaW50aWFsaXplZD8gKi8KIAkJcmV0dXJuOwpAQCAtMTY4Miw4ICsxNjQzLDcgQEAKIAlzcGluX3VubG9jaygmcHMtPnBzX2xvY2spOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX2ZpbmlfcG9vbHNldChraWJfcG9vbHNldF90ICpwcykKK3N0YXRpYyB2b2lkIGtpYmxuZF9maW5pX3Bvb2xzZXQoa2liX3Bvb2xzZXRfdCAqcHMpCiB7CiAJaWYgKHBzLT5wc19uZXQgIT0gTlVMTCkgeyAvKiBpbml0aWFsaXplZD8gKi8KIAkJa2libG5kX2Rlc3Ryb3lfcG9vbF9saXN0KCZwcy0+cHNfZmFpbGVkX3Bvb2xfbGlzdCk7CkBAIC0xNjkxLDEzICsxNjUxLDEyIEBACiAJfQogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfaW5pdF9wb29sc2V0KGtpYl9wb29sc2V0X3QgKnBzLCBpbnQgY3B0LAotCQkgICAga2liX25ldF90ICpuZXQsIGNoYXIgKm5hbWUsIGludCBzaXplLAotCQkgICAga2liX3BzX3Bvb2xfY3JlYXRlX3QgcG9fY3JlYXRlLAotCQkgICAga2liX3BzX3Bvb2xfZGVzdHJveV90IHBvX2Rlc3Ryb3ksCi0JCSAgICBraWJfcHNfbm9kZV9pbml0X3QgbmRfaW5pdCwKLQkJICAgIGtpYl9wc19ub2RlX2ZpbmlfdCBuZF9maW5pKQorc3RhdGljIGludCBraWJsbmRfaW5pdF9wb29sc2V0KGtpYl9wb29sc2V0X3QgKnBzLCBpbnQgY3B0LAorCQkJICAgICAgIGtpYl9uZXRfdCAqbmV0LCBjaGFyICpuYW1lLCBpbnQgc2l6ZSwKKwkJCSAgICAgICBraWJfcHNfcG9vbF9jcmVhdGVfdCBwb19jcmVhdGUsCisJCQkgICAgICAga2liX3BzX3Bvb2xfZGVzdHJveV90IHBvX2Rlc3Ryb3ksCisJCQkgICAgICAga2liX3BzX25vZGVfaW5pdF90IG5kX2luaXQsCisJCQkgICAgICAga2liX3BzX25vZGVfZmluaV90IG5kX2ZpbmkpCiB7CiAJa2liX3Bvb2xfdAkqcG9vbDsKIAlpbnQJCXJjOwpAQCAtMTcyNyw4ICsxNjg2LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBpbnQKLWtpYmxuZF9wb29sX2lzX2lkbGUoa2liX3Bvb2xfdCAqcG9vbCwgdW5zaWduZWQgbG9uZyBub3cpCitzdGF0aWMgaW50IGtpYmxuZF9wb29sX2lzX2lkbGUoa2liX3Bvb2xfdCAqcG9vbCwgdW5zaWduZWQgbG9uZyBub3cpCiB7CiAJaWYgKHBvb2wtPnBvX2FsbG9jYXRlZCAhPSAwKSAvKiBzdGlsbCBpbiB1c2UgKi8KIAkJcmV0dXJuIDA7CkBAIC0xNzM3LDEwICsxNjk1LDkgQEAKIAlyZXR1cm4gY2ZzX3RpbWVfYWZ0ZXJlcShub3csIHBvb2wtPnBvX2RlYWRsaW5lKTsKIH0KIAotdm9pZAota2libG5kX3Bvb2xfZnJlZV9ub2RlKGtpYl9wb29sX3QgKnBvb2wsIHN0cnVjdCBsaXN0X2hlYWQgKm5vZGUpCit2b2lkIGtpYmxuZF9wb29sX2ZyZWVfbm9kZShraWJfcG9vbF90ICpwb29sLCBzdHJ1Y3QgbGlzdF9oZWFkICpub2RlKQogewotCUxJU1RfSEVBRCAgKHpvbWJpZXMpOworCUxJU1RfSEVBRCh6b21iaWVzKTsKIAlraWJfcG9vbHNldF90ICAqcHMgPSBwb29sLT5wb19vd25lcjsKIAlraWJfcG9vbF90ICAgICAqdG1wOwogCXVuc2lnbmVkIGxvbmcgICAgICBub3cgPSBjZnNfdGltZV9jdXJyZW50KCk7CkBAIC0xNzUwLDcgKzE3MDcsNyBAQAogCWlmIChwcy0+cHNfbm9kZV9maW5pICE9IE5VTEwpCiAJCXBzLT5wc19ub2RlX2ZpbmkocG9vbCwgbm9kZSk7CiAKLQlMQVNTRVJUIChwb29sLT5wb19hbGxvY2F0ZWQgPiAwKTsKKwlMQVNTRVJUKHBvb2wtPnBvX2FsbG9jYXRlZCA+IDApOwogCWxpc3RfYWRkKG5vZGUsICZwb29sLT5wb19mcmVlX2xpc3QpOwogCXBvb2wtPnBvX2FsbG9jYXRlZC0tOwogCkBAIC0xNzY4LDggKzE3MjUsNyBAQAogCQlraWJsbmRfZGVzdHJveV9wb29sX2xpc3QoJnpvbWJpZXMpOwogfQogCi1zdHJ1Y3QgbGlzdF9oZWFkICoKLWtpYmxuZF9wb29sX2FsbG9jX25vZGUoa2liX3Bvb2xzZXRfdCAqcHMpCitzdHJ1Y3QgbGlzdF9oZWFkICpraWJsbmRfcG9vbF9hbGxvY19ub2RlKGtpYl9wb29sc2V0X3QgKnBzKQogewogCXN0cnVjdCBsaXN0X2hlYWQJICAgICpub2RlOwogCWtpYl9wb29sX3QJICAgICpwb29sOwpAQCAtMTgzMSw4ICsxNzg3LDcgQEAKIAlnb3RvIGFnYWluOwogfQogCi12b2lkCi1raWJsbmRfcG1yX3Bvb2xfdW5tYXAoa2liX3BoeXNfbXJfdCAqcG1yKQordm9pZCBraWJsbmRfcG1yX3Bvb2xfdW5tYXAoa2liX3BoeXNfbXJfdCAqcG1yKQogewogCWtpYl9wbXJfcG9vbF90ICAgICAgKnBwbyA9IHBtci0+cG1yX3Bvb2w7CiAJc3RydWN0IGliX21yCSptciAgPSBwbXItPnBtcl9tcjsKQEAgLTE4NDMsOCArMTc5OCw3IEBACiAJCWliX2RlcmVnX21yKG1yKTsKIH0KIAotaW50Ci1raWJsbmRfcG1yX3Bvb2xfbWFwKGtpYl9wbXJfcG9vbHNldF90ICpwcHMsIGtpYl9oY2FfZGV2X3QgKmhkZXYsCitpbnQga2libG5kX3Btcl9wb29sX21hcChraWJfcG1yX3Bvb2xzZXRfdCAqcHBzLCBraWJfaGNhX2Rldl90ICpoZGV2LAogCQkgICAga2liX3JkbWFfZGVzY190ICpyZCwgX191NjQgKmlvdmEsIGtpYl9waHlzX21yX3QgKipwcF9wbXIpCiB7CiAJa2liX3BoeXNfbXJfdCAqcG1yOwpAQCAtMTg4OSwxOSArMTg0MywxNiBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF9kZXN0cm95X3Btcl9wb29sKGtpYl9wb29sX3QgKnBvb2wpCitzdGF0aWMgdm9pZCBraWJsbmRfZGVzdHJveV9wbXJfcG9vbChraWJfcG9vbF90ICpwb29sKQogewogCWtpYl9wbXJfcG9vbF90ICpwcG8gPSBjb250YWluZXJfb2YocG9vbCwga2liX3Btcl9wb29sX3QsIHBwb19wb29sKTsKIAlraWJfcGh5c19tcl90ICAqcG1yOworCWtpYl9waHlzX21yX3QgKnRtcDsKIAotCUxBU1NFUlQgKHBvb2wtPnBvX2FsbG9jYXRlZCA9PSAwKTsKKwlMQVNTRVJUKHBvb2wtPnBvX2FsbG9jYXRlZCA9PSAwKTsKIAotCXdoaWxlICghbGlzdF9lbXB0eSgmcG9vbC0+cG9fZnJlZV9saXN0KSkgewotCQlwbXIgPSBsaXN0X2VudHJ5KHBvb2wtPnBvX2ZyZWVfbGlzdC5uZXh0LAotCQkJCSAgICAga2liX3BoeXNfbXJfdCwgcG1yX2xpc3QpOwotCi0JCUxBU1NFUlQgKHBtci0+cG1yX21yID09IE5VTEwpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwbXIsIHRtcCwgJnBvb2wtPnBvX2ZyZWVfbGlzdCwgcG1yX2xpc3QpIHsKKwkJTEFTU0VSVChwbXItPnBtcl9tciA9PSBOVUxMKTsKIAkJbGlzdF9kZWwoJnBtci0+cG1yX2xpc3QpOwogCiAJCWlmIChwbXItPnBtcl9pcGIgIT0gTlVMTCkgewpAQCAtMTkyNyw4ICsxODc4LDggQEAKIAlyZXR1cm4gbWF4KElCTE5EX1BNUl9QT09MLCBzaXplKTsKIH0KIAotc3RhdGljIGludAota2libG5kX2NyZWF0ZV9wbXJfcG9vbChraWJfcG9vbHNldF90ICpwcywgaW50IHNpemUsIGtpYl9wb29sX3QgKipwcF9wbykKK3N0YXRpYyBpbnQga2libG5kX2NyZWF0ZV9wbXJfcG9vbChraWJfcG9vbHNldF90ICpwcywgaW50IHNpemUsCisJCQkJICBraWJfcG9vbF90ICoqcHBfcG8pCiB7CiAJc3RydWN0IGtpYl9wbXJfcG9vbAkqcHBvOwogCXN0cnVjdCBraWJfcG9vbAkJKnBvb2w7CkBAIC0xOTcwLDEzICsxOTIxLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1raWJsbmRfZGVzdHJveV90eF9wb29sKGtpYl9wb29sX3QgKnBvb2wpCitzdGF0aWMgdm9pZCBraWJsbmRfZGVzdHJveV90eF9wb29sKGtpYl9wb29sX3QgKnBvb2wpCiB7CiAJa2liX3R4X3Bvb2xfdCAgKnRwbyA9IGNvbnRhaW5lcl9vZihwb29sLCBraWJfdHhfcG9vbF90LCB0cG9fcG9vbCk7CiAJaW50CSAgICAgaTsKIAotCUxBU1NFUlQgKHBvb2wtPnBvX2FsbG9jYXRlZCA9PSAwKTsKKwlMQVNTRVJUKHBvb2wtPnBvX2FsbG9jYXRlZCA9PSAwKTsKIAogCWlmICh0cG8tPnRwb190eF9wYWdlcyAhPSBOVUxMKSB7CiAJCWtpYmxuZF91bm1hcF90eF9wb29sKHRwbyk7CkBAIC0yMDI2LDggKzE5NzYsOCBAQAogCXJldHVybiBtYXgoSUJMTkRfVFhfUE9PTCwgbnR4KTsKIH0KIAotc3RhdGljIGludAota2libG5kX2NyZWF0ZV90eF9wb29sKGtpYl9wb29sc2V0X3QgKnBzLCBpbnQgc2l6ZSwga2liX3Bvb2xfdCAqKnBwX3BvKQorc3RhdGljIGludCBraWJsbmRfY3JlYXRlX3R4X3Bvb2woa2liX3Bvb2xzZXRfdCAqcHMsIGludCBzaXplLAorCQkJCSBraWJfcG9vbF90ICoqcHBfcG8pCiB7CiAJaW50CSAgICBpOwogCWludAkgICAgbnBnOwpAQCAtMjExMCw4ICsyMDYwLDcgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF90eF9pbml0KGtpYl9wb29sX3QgKnBvb2wsIHN0cnVjdCBsaXN0X2hlYWQgKm5vZGUpCitzdGF0aWMgdm9pZCBraWJsbmRfdHhfaW5pdChraWJfcG9vbF90ICpwb29sLCBzdHJ1Y3QgbGlzdF9oZWFkICpub2RlKQogewogCWtpYl90eF9wb29sc2V0X3QgKnRwcyA9IGNvbnRhaW5lcl9vZihwb29sLT5wb19vd25lciwga2liX3R4X3Bvb2xzZXRfdCwKIAkJCQkJICAgICB0cHNfcG9vbHNldCk7CkBAIC0yMTIwLDggKzIwNjksNyBAQAogCXR4LT50eF9jb29raWUgPSB0cHMtPnRwc19uZXh0X3R4X2Nvb2tpZSsrOwogfQogCi1zdGF0aWMgdm9pZAota2libG5kX25ldF9maW5pX3Bvb2xzKGtpYl9uZXRfdCAqbmV0KQorc3RhdGljIHZvaWQga2libG5kX25ldF9maW5pX3Bvb2xzKGtpYl9uZXRfdCAqbmV0KQogewogCWludAlpOwogCkBAIC0yMTYyLDggKzIxMTAsNyBAQAogCX0KIH0KIAotc3RhdGljIGludAota2libG5kX25ldF9pbml0X3Bvb2xzKGtpYl9uZXRfdCAqbmV0LCBfX3UzMiAqY3B0cywgaW50IG5jcHRzKQorc3RhdGljIGludCBraWJsbmRfbmV0X2luaXRfcG9vbHMoa2liX25ldF90ICpuZXQsIF9fdTMyICpjcHRzLCBpbnQgbmNwdHMpCiB7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAlpbnQJCWNwdDsKQEAgLTIyOTEsOCArMjIzOCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfaGRldl9nZXRfYXR0cihraWJfaGNhX2Rldl90ICpoZGV2KQorc3RhdGljIGludCBraWJsbmRfaGRldl9nZXRfYXR0cihraWJfaGNhX2Rldl90ICpoZGV2KQogewogCXN0cnVjdCBpYl9kZXZpY2VfYXR0ciAqYXR0cjsKIAlpbnQJCSAgICByYzsKQEAgLTIzMzYsOCArMjI4Miw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyB2b2lkCi1raWJsbmRfaGRldl9jbGVhbnVwX21ycyhraWJfaGNhX2Rldl90ICpoZGV2KQorc3RhdGljIHZvaWQga2libG5kX2hkZXZfY2xlYW51cF9tcnMoa2liX2hjYV9kZXZfdCAqaGRldikKIHsKIAlpbnQgICAgIGk7CiAKQEAgLTIzNTYsOCArMjMwMSw3IEBACiAJaGRldi0+aWJoX25tcnMgPSAwOwogfQogCi12b2lkCi1raWJsbmRfaGRldl9kZXN0cm95KGtpYl9oY2FfZGV2X3QgKmhkZXYpCit2b2lkIGtpYmxuZF9oZGV2X2Rlc3Ryb3koa2liX2hjYV9kZXZfdCAqaGRldikKIHsKIAlraWJsbmRfaGRldl9jbGVhbnVwX21ycyhoZGV2KTsKIApAQCAtMjM3MCw4ICsyMzE0LDcgQEAKIAlMSUJDRlNfRlJFRShoZGV2LCBzaXplb2YoKmhkZXYpKTsKIH0KIAotc3RhdGljIGludAota2libG5kX2hkZXZfc2V0dXBfbXJzKGtpYl9oY2FfZGV2X3QgKmhkZXYpCitzdGF0aWMgaW50IGtpYmxuZF9oZGV2X3NldHVwX21ycyhraWJfaGNhX2Rldl90ICpoZGV2KQogewogCXN0cnVjdCBpYl9tciAqbXI7CiAJaW50CSAgIGk7CkBAIC0yNDQyLDcgKzIzODUsNyBAQAogCQkJcmV0dXJuIFBUUl9FUlIobXIpOwogCQl9CiAKLQkJTEFTU0VSVCAoaW92YSA9PSBpcGIuYWRkcik7CisJCUxBU1NFUlQoaW92YSA9PSBpcGIuYWRkcik7CiAKIAkJaGRldi0+aWJoX21yc1tpXSA9IG1yOwogCX0KQEAgLTI0NTQsMTQgKzIzOTcsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAota2libG5kX2R1bW15X2NhbGxiYWNrKHN0cnVjdCByZG1hX2NtX2lkICpjbWlkLCBzdHJ1Y3QgcmRtYV9jbV9ldmVudCAqZXZlbnQpCi17ICAgICAgIC8qIERVTU1ZICovCisvKiBEVU1NWSAqLworc3RhdGljIGludCBraWJsbmRfZHVtbXlfY2FsbGJhY2soc3RydWN0IHJkbWFfY21faWQgKmNtaWQsCisJCQkJIHN0cnVjdCByZG1hX2NtX2V2ZW50ICpldmVudCkKK3sKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludAota2libG5kX2Rldl9uZWVkX2ZhaWxvdmVyKGtpYl9kZXZfdCAqZGV2KQorc3RhdGljIGludCBraWJsbmRfZGV2X25lZWRfZmFpbG92ZXIoa2liX2Rldl90ICpkZXYpCiB7CiAJc3RydWN0IHJkbWFfY21faWQgICpjbWlkOwogCXN0cnVjdCBzb2NrYWRkcl9pbiAgc3JjYWRkcjsKQEAgLTI1MTYsMTIgKzI0NTksMTEgQEAKIAlyZXR1cm4gMTsKIH0KIAotaW50Ci1raWJsbmRfZGV2X2ZhaWxvdmVyKGtpYl9kZXZfdCAqZGV2KQoraW50IGtpYmxuZF9kZXZfZmFpbG92ZXIoa2liX2Rldl90ICpkZXYpCiB7Ci0JTElTVF9IRUFEICAgICAgKHpvbWJpZV90cG8pOwotCUxJU1RfSEVBRCAgICAgICh6b21iaWVfcHBvKTsKLQlMSVNUX0hFQUQgICAgICAoem9tYmllX2Zwbyk7CisJTElTVF9IRUFEKHpvbWJpZV90cG8pOworCUxJU1RfSEVBRCh6b21iaWVfcHBvKTsKKwlMSVNUX0hFQUQoem9tYmllX2Zwbyk7CiAJc3RydWN0IHJkbWFfY21faWQgICpjbWlkICA9IE5VTEw7CiAJa2liX2hjYV9kZXZfdCAgICAgICpoZGV2ICA9IE5VTEw7CiAJa2liX2hjYV9kZXZfdCAgICAgICpvbGQ7CkBAIC0yNTMyLDcgKzI0NzQsNyBAQAogCWludAkJIHJjID0gMDsKIAlpbnQJCSAgICBpOwogCi0JTEFTU0VSVCAoKmtpYmxuZF90dW5hYmxlcy5raWJfZGV2X2ZhaWxvdmVyID4gMSB8fAorCUxBU1NFUlQoKmtpYmxuZF90dW5hYmxlcy5raWJfZGV2X2ZhaWxvdmVyID4gMSB8fAogCQkgZGV2LT5pYmRfY2FuX2ZhaWxvdmVyIHx8CiAJCSBkZXYtPmliZF9oZGV2ID09IE5VTEwpOwogCkBAIC0yNjU1LDExICsyNTk3LDEwIEBACiAJcmV0dXJuIHJjOwogfQogCi12b2lkCi1raWJsbmRfZGVzdHJveV9kZXYgKGtpYl9kZXZfdCAqZGV2KQordm9pZCBraWJsbmRfZGVzdHJveV9kZXYoa2liX2Rldl90ICpkZXYpCiB7Ci0JTEFTU0VSVCAoZGV2LT5pYmRfbm5ldHMgPT0gMCk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmZGV2LT5pYmRfbmV0cykpOworCUxBU1NFUlQoZGV2LT5pYmRfbm5ldHMgPT0gMCk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZkZXYtPmliZF9uZXRzKSk7CiAKIAlsaXN0X2RlbCgmZGV2LT5pYmRfZmFpbF9saXN0KTsKIAlsaXN0X2RlbCgmZGV2LT5pYmRfbGlzdCk7CkBAIC0yNjcwLDggKzI2MTEsNyBAQAogCUxJQkNGU19GUkVFKGRldiwgc2l6ZW9mKCpkZXYpKTsKIH0KIAotc3RhdGljIGtpYl9kZXZfdCAqCi1raWJsbmRfY3JlYXRlX2RldihjaGFyICppZm5hbWUpCitzdGF0aWMga2liX2Rldl90ICpraWJsbmRfY3JlYXRlX2RldihjaGFyICppZm5hbWUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlraWJfZGV2X3QJICpkZXY7CkBAIC0yNzIzLDEzICsyNjYzLDEyIEBACiAJcmV0dXJuIGRldjsKIH0KIAotc3RhdGljIHZvaWQKLWtpYmxuZF9iYXNlX3NodXRkb3duKHZvaWQpCitzdGF0aWMgdm9pZCBraWJsbmRfYmFzZV9zaHV0ZG93bih2b2lkKQogewogCXN0cnVjdCBraWJfc2NoZWRfaW5mbwkqc2NoZWQ7CiAJaW50CQkJaTsKIAotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmtpYmxuZF9kYXRhLmtpYl9kZXZzKSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZraWJsbmRfZGF0YS5raWJfZGV2cykpOwogCiAJQ0RFQlVHKERfTUFMTE9DLCAiYmVmb3JlIExORCBiYXNlIGNsZWFudXA6IGttZW0gJWRcbiIsCiAJICAgICAgIGF0b21pY19yZWFkKCZsaWJjZnNfa21lbW9yeSkpOwpAQCAtMjc0MCwxMiArMjY3OSwxMSBAQAogCiAJY2FzZSBJQkxORF9JTklUX0FMTDoKIAljYXNlIElCTE5EX0lOSVRfREFUQToKLQkJTEFTU0VSVCAoa2libG5kX2RhdGEua2liX3BlZXJzICE9IE5VTEwpOwotCQlmb3IgKGkgPSAwOyBpIDwga2libG5kX2RhdGEua2liX3BlZXJfaGFzaF9zaXplOyBpKyspIHsKLQkJCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmtpYmxuZF9kYXRhLmtpYl9wZWVyc1tpXSkpOwotCQl9Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmtpYmxuZF9kYXRhLmtpYl9jb25uZF96b21iaWVzKSk7Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmtpYmxuZF9kYXRhLmtpYl9jb25uZF9jb25ucykpOworCQlMQVNTRVJUKGtpYmxuZF9kYXRhLmtpYl9wZWVycyAhPSBOVUxMKTsKKwkJZm9yIChpID0gMDsgaSA8IGtpYmxuZF9kYXRhLmtpYl9wZWVyX2hhc2hfc2l6ZTsgaSsrKQorCQkJTEFTU0VSVChsaXN0X2VtcHR5KCZraWJsbmRfZGF0YS5raWJfcGVlcnNbaV0pKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZraWJsbmRfZGF0YS5raWJfY29ubmRfem9tYmllcykpOworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmtpYmxuZF9kYXRhLmtpYl9jb25uZF9jb25ucykpOwogCiAJCS8qIGZsYWcgdGhyZWFkcyB0byB0ZXJtaW5hdGU7IHdha2UgYW5kIHdhaXQgZm9yIHRoZW0gdG8gZGllICovCiAJCWtpYmxuZF9kYXRhLmtpYl9zaHV0ZG93biA9IDE7CkBAIC0yNzYyLDcgKzI3MDAsOCBAQAogCQlpID0gMjsKIAkJd2hpbGUgKGF0b21pY19yZWFkKCZraWJsbmRfZGF0YS5raWJfbnRocmVhZHMpICE9IDApIHsKIAkJCWkrKzsKLQkJCUNERUJVRygoKGkgJiAoLWkpKSA9PSBpKSA/IERfV0FSTklORyA6IERfTkVULCAvKiBwb3dlciBvZiAyPyAqLworCQkJLyogcG93ZXIgb2YgMiA/ICovCisJCQlDREVCVUcoKChpICYgKC1pKSkgPT0gaSkgPyBEX1dBUk5JTkcgOiBEX05FVCwKIAkJCSAgICAgICAiV2FpdGluZyBmb3IgJWQgdGhyZWFkcyB0byB0ZXJtaW5hdGVcbiIsCiAJCQkgICAgICAgYXRvbWljX3JlYWQoJmtpYmxuZF9kYXRhLmtpYl9udGhyZWFkcykpOwogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwpAQCAtMjc5MSw4ICsyNzMwLDcgQEAKIAltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKIH0KIAotdm9pZAota2libG5kX3NodXRkb3duIChsbmV0X25pX3QgKm5pKQordm9pZCBraWJsbmRfc2h1dGRvd24obG5ldF9uaV90ICpuaSkKIHsKIAlraWJfbmV0X3QJKm5ldCA9IG5pLT5uaV9kYXRhOwogCXJ3bG9ja190ICAgICAqZ19sb2NrID0gJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jazsKQEAgLTI4NDIsNyArMjc4MCw3IEBACiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCiAJY2FzZSBJQkxORF9JTklUX05PVEhJTkc6Ci0JCUxBU1NFUlQgKGF0b21pY19yZWFkKCZuZXQtPmlibl9uY29ubnMpID09IDApOworCQlMQVNTRVJUKGF0b21pY19yZWFkKCZuZXQtPmlibl9uY29ubnMpID09IDApOwogCiAJCWlmIChuZXQtPmlibl9kZXYgIT0gTlVMTCAmJgogCQkgICAgbmV0LT5pYm5fZGV2LT5pYmRfbm5ldHMgPT0gMCkKQEAgLTI4NjIsMjAgKzI4MDAsMTkgQEAKIG91dDoKIAlpZiAobGlzdF9lbXB0eSgma2libG5kX2RhdGEua2liX2RldnMpKQogCQlraWJsbmRfYmFzZV9zaHV0ZG93bigpOwotCXJldHVybjsKIH0KIAotc3RhdGljIGludAota2libG5kX2Jhc2Vfc3RhcnR1cCh2b2lkKQorc3RhdGljIGludCBraWJsbmRfYmFzZV9zdGFydHVwKHZvaWQpCiB7CiAJc3RydWN0IGtpYl9zY2hlZF9pbmZvCSpzY2hlZDsKIAlpbnQJCQlyYzsKIAlpbnQJCQlpOwogCi0JTEFTU0VSVCAoa2libG5kX2RhdGEua2liX2luaXQgPT0gSUJMTkRfSU5JVF9OT1RISU5HKTsKKwlMQVNTRVJUKGtpYmxuZF9kYXRhLmtpYl9pbml0ID09IElCTE5EX0lOSVRfTk9USElORyk7CiAKIAl0cnlfbW9kdWxlX2dldChUSElTX01PRFVMRSk7Ci0JbWVtc2V0KCZraWJsbmRfZGF0YSwgMCwgc2l6ZW9mKGtpYmxuZF9kYXRhKSk7IC8qIHplcm8gcG9pbnRlcnMsIGZsYWdzIGV0YyAqLworCS8qIHplcm8gcG9pbnRlcnMsIGZsYWdzIGV0YyAqLworCW1lbXNldCgma2libG5kX2RhdGEsIDAsIHNpemVvZihraWJsbmRfZGF0YSkpOwogCiAJcndsb2NrX2luaXQoJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jayk7CiAKQEAgLTI4ODYsOSArMjgyMyw4IEBACiAJTElCQ0ZTX0FMTE9DKGtpYmxuZF9kYXRhLmtpYl9wZWVycywKIAkJICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKgogCQkJICAgIGtpYmxuZF9kYXRhLmtpYl9wZWVyX2hhc2hfc2l6ZSk7Ci0JaWYgKGtpYmxuZF9kYXRhLmtpYl9wZWVycyA9PSBOVUxMKSB7CisJaWYgKGtpYmxuZF9kYXRhLmtpYl9wZWVycyA9PSBOVUxMKQogCQlnb3RvIGZhaWxlZDsKLQl9CiAJZm9yIChpID0gMDsgaSA8IGtpYmxuZF9kYXRhLmtpYl9wZWVyX2hhc2hfc2l6ZTsgaSsrKQogCQlJTklUX0xJU1RfSEVBRCgma2libG5kX2RhdGEua2liX3BlZXJzW2ldKTsKIApAQCAtMjk1NSw4ICsyODkxLDcgQEAKIAlyZXR1cm4gLUVORVRET1dOOwogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfc3RhcnRfc2NoZWR1bGVycyhzdHJ1Y3Qga2liX3NjaGVkX2luZm8gKnNjaGVkKQorc3RhdGljIGludCBraWJsbmRfc3RhcnRfc2NoZWR1bGVycyhzdHJ1Y3Qga2liX3NjaGVkX2luZm8gKnNjaGVkKQogewogCWludAlyYyA9IDA7CiAJaW50CW50aHJzOwpAQCAtMjk3NCwxMiArMjkwOSwxMyBAQAogCX0gZWxzZSB7CiAJCUxBU1NFUlQoc2NoZWQtPmlic19udGhyZWFkcyA8PSBzY2hlZC0+aWJzX250aHJlYWRzX21heCk7CiAJCS8qIGluY3JlYXNlIG9uZSB0aHJlYWQgaWYgdGhlcmUgaXMgbmV3IGludGVyZmFjZSAqLwotCQludGhycyA9IChzY2hlZC0+aWJzX250aHJlYWRzIDwgc2NoZWQtPmlic19udGhyZWFkc19tYXgpOworCQludGhycyA9IHNjaGVkLT5pYnNfbnRocmVhZHMgPCBzY2hlZC0+aWJzX250aHJlYWRzX21heDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnRocnM7IGkrKykgewogCQlsb25nCWlkOwogCQljaGFyCW5hbWVbMjBdOworCiAJCWlkID0gS0lCX1RIUkVBRF9JRChzY2hlZC0+aWJzX2NwdCwgc2NoZWQtPmlic19udGhyZWFkcyArIGkpOwogCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJraWJsbmRfc2RfJTAybGRfJTAybGQiLAogCQkJIEtJQl9USFJFQURfQ1BUKGlkKSwgS0lCX1RIUkVBRF9USUQoaWQpKTsKQEAgLTI5OTYsOCArMjkzMiw4IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50Ci1raWJsbmRfZGV2X3N0YXJ0X3RocmVhZHMoa2liX2Rldl90ICpkZXYsIGludCBuZXdkZXYsIF9fdTMyICpjcHRzLCBpbnQgbmNwdHMpCitzdGF0aWMgaW50IGtpYmxuZF9kZXZfc3RhcnRfdGhyZWFkcyhraWJfZGV2X3QgKmRldiwgaW50IG5ld2RldiwgX191MzIgKmNwdHMsCisJCQkJICAgIGludCBuY3B0cykKIHsKIAlpbnQJY3B0OwogCWludAlyYzsKQEAgLTMwMjIsOCArMjk1OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBraWJfZGV2X3QgKgota2libG5kX2Rldl9zZWFyY2goY2hhciAqaWZuYW1lKQorc3RhdGljIGtpYl9kZXZfdCAqa2libG5kX2Rldl9zZWFyY2goY2hhciAqaWZuYW1lKQogewogCWtpYl9kZXZfdAkqYWxpYXMgPSBOVUxMOwogCWtpYl9kZXZfdAkqZGV2OwpAQCAtMzA1NSw4ICsyOTkwLDcgQEAKIAlyZXR1cm4gYWxpYXM7CiB9CiAKLWludAota2libG5kX3N0YXJ0dXAgKGxuZXRfbmlfdCAqbmkpCitpbnQga2libG5kX3N0YXJ0dXAobG5ldF9uaV90ICpuaSkKIHsKIAljaGFyCQkgICAgICppZm5hbWU7CiAJa2liX2Rldl90CQkqaWJkZXYgPSBOVUxMOwpAQCAtMzA2Niw3ICszMDAwLDcgQEAKIAlpbnQJCSAgICAgICByYzsKIAlpbnQJCQkgIG5ld2RldjsKIAotCUxBU1NFUlQgKG5pLT5uaV9sbmQgPT0gJnRoZV9vMmlibG5kKTsKKwlMQVNTRVJUKG5pLT5uaV9sbmQgPT0gJnRoZV9vMmlibG5kKTsKIAogCWlmIChraWJsbmRfZGF0YS5raWJfaW5pdCA9PSBJQkxORF9JTklUX05PVEhJTkcpIHsKIAkJcmMgPSBraWJsbmRfYmFzZV9zdGFydHVwKCk7CkBAIC0zMDkwLDcgKzMwMjQsNyBAQAogCWlmIChuaS0+bmlfaW50ZXJmYWNlc1swXSAhPSBOVUxMKSB7CiAJCS8qIFVzZSB0aGUgSVBvSUIgaW50ZXJmYWNlIHNwZWNpZmllZCBpbiAnbmV0d29ya3M9JyAqLwogCi0JCUNMQVNTRVJUIChMTkVUX01BWF9JTlRFUkZBQ0VTID4gMSk7CisJCUNMQVNTRVJUKExORVRfTUFYX0lOVEVSRkFDRVMgPiAxKTsKIAkJaWYgKG5pLT5uaV9pbnRlcmZhY2VzWzFdICE9IE5VTEwpIHsKIAkJCUNFUlJPUigiTXVsdGlwbGUgaW50ZXJmYWNlcyBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJCWdvdG8gZmFpbGVkOwpAQCAtMzE1MCwyMiArMzA4NCwyMiBAQAogCXJldHVybiAtRU5FVERPV047CiB9CiAKLXN0YXRpYyB2b2lkIF9fZXhpdAota2libG5kX21vZHVsZV9maW5pICh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IGtpYmxuZF9tb2R1bGVfZmluaSh2b2lkKQogewogCWxuZXRfdW5yZWdpc3Rlcl9sbmQoJnRoZV9vMmlibG5kKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQKLWtpYmxuZF9tb2R1bGVfaW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGtpYmxuZF9tb2R1bGVfaW5pdCh2b2lkKQogewogCWludCAgICByYzsKIAotCUNMQVNTRVJUIChzaXplb2Yoa2liX21zZ190KSA8PSBJQkxORF9NU0dfU0laRSk7Ci0JQ0xBU1NFUlQgKG9mZnNldG9mKGtpYl9tc2dfdCwgaWJtX3UuZ2V0LmliZ21fcmQucmRfZnJhZ3NbSUJMTkRfTUFYX1JETUFfRlJBR1NdKQotCQkgIDw9IElCTE5EX01TR19TSVpFKTsKLQlDTEFTU0VSVCAob2Zmc2V0b2Yoa2liX21zZ190LCBpYm1fdS5wdXRhY2suaWJwYW1fcmQucmRfZnJhZ3NbSUJMTkRfTUFYX1JETUFfRlJBR1NdKQotCQkgIDw9IElCTE5EX01TR19TSVpFKTsKKwlDTEFTU0VSVChzaXplb2Yoa2liX21zZ190KSA8PSBJQkxORF9NU0dfU0laRSk7CisJQ0xBU1NFUlQob2Zmc2V0b2Yoa2liX21zZ190LAorCQlpYm1fdS5nZXQuaWJnbV9yZC5yZF9mcmFnc1tJQkxORF9NQVhfUkRNQV9GUkFHU10pCisJCTw9IElCTE5EX01TR19TSVpFKTsKKwlDTEFTU0VSVChvZmZzZXRvZihraWJfbXNnX3QsCisJCWlibV91LnB1dGFjay5pYnBhbV9yZC5yZF9mcmFnc1tJQkxORF9NQVhfUkRNQV9GUkFHU10pCisJCTw9IElCTE5EX01TR19TSVpFKTsKIAogCXJjID0ga2libG5kX3R1bmFibGVzX2luaXQoKTsKIAlpZiAocmMgIT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmQuaAppbmRleCBhYjEyOGRlLi5jZDY2NGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZC5oCkBAIC00Niw4ICs0Niw4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfY2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfY2IuYwppbmRleCA0OGQ4ODVkLi5kYmYzNzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kX2NiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9jYi5jCkBAIC00MSwxOSArNDEsMTkgQEAKICNpbmNsdWRlICJvMmlibG5kLmgiCiAKIHN0YXRpYyB2b2lkCi1raWJsbmRfdHhfZG9uZSAobG5ldF9uaV90ICpuaSwga2liX3R4X3QgKnR4KQora2libG5kX3R4X2RvbmUobG5ldF9uaV90ICpuaSwga2liX3R4X3QgKnR4KQogewogCWxuZXRfbXNnX3QgKmxudG1zZ1syXTsKIAlraWJfbmV0X3QgICpuZXQgPSBuaS0+bmlfZGF0YTsKIAlpbnQJIHJjOwogCWludAkgaTsKIAotCUxBU1NFUlQgKG5ldCAhPSBOVUxMKTsKLQlMQVNTRVJUICghaW5faW50ZXJydXB0KCkpOwotCUxBU1NFUlQgKCF0eC0+dHhfcXVldWVkKTsJICAgICAgIC8qIG11c3RuJ3QgYmUgcXVldWVkIGZvciBzZW5kaW5nICovCi0JTEFTU0VSVCAodHgtPnR4X3NlbmRpbmcgPT0gMCk7CSAgLyogbXVzdG4ndCBiZSBhd2FpdGluZyBzZW50IGNhbGxiYWNrICovCi0JTEFTU0VSVCAoIXR4LT50eF93YWl0aW5nKTsJICAgICAgLyogbXVzdG4ndCBiZSBhd2FpdGluZyBwZWVyIHJlc3BvbnNlICovCi0JTEFTU0VSVCAodHgtPnR4X3Bvb2wgIT0gTlVMTCk7CisJTEFTU0VSVChuZXQgIT0gTlVMTCk7CisJTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOworCUxBU1NFUlQoIXR4LT50eF9xdWV1ZWQpOwkgICAgICAgLyogbXVzdG4ndCBiZSBxdWV1ZWQgZm9yIHNlbmRpbmcgKi8KKwlMQVNTRVJUKHR4LT50eF9zZW5kaW5nID09IDApOwkgIC8qIG11c3RuJ3QgYmUgYXdhaXRpbmcgc2VudCBjYWxsYmFjayAqLworCUxBU1NFUlQoIXR4LT50eF93YWl0aW5nKTsJICAgICAgLyogbXVzdG4ndCBiZSBhd2FpdGluZyBwZWVyIHJlc3BvbnNlICovCisJTEFTU0VSVCh0eC0+dHhfcG9vbCAhPSBOVUxMKTsKIAogCWtpYmxuZF91bm1hcF90eChuaSwgdHgpOwogCkBAIC02Myw3ICs2Myw3IEBACiAJcmMgPSB0eC0+dHhfc3RhdHVzOwogCiAJaWYgKHR4LT50eF9jb25uICE9IE5VTEwpIHsKLQkJTEFTU0VSVCAobmkgPT0gdHgtPnR4X2Nvbm4tPmliY19wZWVyLT5pYnBfbmkpOworCQlMQVNTRVJUKG5pID09IHR4LT50eF9jb25uLT5pYmNfcGVlci0+aWJwX25pKTsKIAogCQlraWJsbmRfY29ubl9kZWNyZWYodHgtPnR4X2Nvbm4pOwogCQl0eC0+dHhfY29ubiA9IE5VTEw7CkBAIC04NCwxMiArODQsMTIgQEAKIH0KIAogdm9pZAota2libG5kX3R4bGlzdF9kb25lIChsbmV0X25pX3QgKm5pLCBzdHJ1Y3QgbGlzdF9oZWFkICp0eGxpc3QsIGludCBzdGF0dXMpCitraWJsbmRfdHhsaXN0X2RvbmUobG5ldF9uaV90ICpuaSwgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0LCBpbnQgc3RhdHVzKQogewogCWtpYl90eF90ICp0eDsKIAotCXdoaWxlICghbGlzdF9lbXB0eSAodHhsaXN0KSkgewotCQl0eCA9IGxpc3RfZW50cnkgKHR4bGlzdC0+bmV4dCwga2liX3R4X3QsIHR4X2xpc3QpOworCXdoaWxlICghbGlzdF9lbXB0eSh0eGxpc3QpKSB7CisJCXR4ID0gbGlzdF9lbnRyeSh0eGxpc3QtPm5leHQsIGtpYl90eF90LCB0eF9saXN0KTsKIAogCQlsaXN0X2RlbCgmdHgtPnR4X2xpc3QpOwogCQkvKiBjb21wbGV0ZSBub3cgKi8KQEAgLTExMywxNiArMTEzLDE2IEBACiAJCXJldHVybiBOVUxMOwogCXR4ID0gY29udGFpbmVyX29mKG5vZGUsIGtpYl90eF90LCB0eF9saXN0KTsKIAotCUxBU1NFUlQgKHR4LT50eF9ud3JxID09IDApOwotCUxBU1NFUlQgKCF0eC0+dHhfcXVldWVkKTsKLQlMQVNTRVJUICh0eC0+dHhfc2VuZGluZyA9PSAwKTsKLQlMQVNTRVJUICghdHgtPnR4X3dhaXRpbmcpOwotCUxBU1NFUlQgKHR4LT50eF9zdGF0dXMgPT0gMCk7Ci0JTEFTU0VSVCAodHgtPnR4X2Nvbm4gPT0gTlVMTCk7Ci0JTEFTU0VSVCAodHgtPnR4X2xudG1zZ1swXSA9PSBOVUxMKTsKLQlMQVNTRVJUICh0eC0+dHhfbG50bXNnWzFdID09IE5VTEwpOwotCUxBU1NFUlQgKHR4LT50eF91LnBtciA9PSBOVUxMKTsKLQlMQVNTRVJUICh0eC0+dHhfbmZyYWdzID09IDApOworCUxBU1NFUlQodHgtPnR4X253cnEgPT0gMCk7CisJTEFTU0VSVCghdHgtPnR4X3F1ZXVlZCk7CisJTEFTU0VSVCh0eC0+dHhfc2VuZGluZyA9PSAwKTsKKwlMQVNTRVJUKCF0eC0+dHhfd2FpdGluZyk7CisJTEFTU0VSVCh0eC0+dHhfc3RhdHVzID09IDApOworCUxBU1NFUlQodHgtPnR4X2Nvbm4gPT0gTlVMTCk7CisJTEFTU0VSVCh0eC0+dHhfbG50bXNnWzBdID09IE5VTEwpOworCUxBU1NFUlQodHgtPnR4X2xudG1zZ1sxXSA9PSBOVUxMKTsKKwlMQVNTRVJUKHR4LT50eF91LnBtciA9PSBOVUxMKTsKKwlMQVNTRVJUKHR4LT50eF9uZnJhZ3MgPT0gMCk7CiAKIAlyZXR1cm4gdHg7CiB9CkBAIC0xNDMsNyArMTQzLDcgQEAKIH0KIAogaW50Ci1raWJsbmRfcG9zdF9yeCAoa2liX3J4X3QgKnJ4LCBpbnQgY3JlZGl0KQora2libG5kX3Bvc3Rfcngoa2liX3J4X3QgKnJ4LCBpbnQgY3JlZGl0KQogewogCWtpYl9jb25uX3QJICpjb25uID0gcngtPnJ4X2Nvbm47CiAJa2liX25ldF90CSAgKm5ldCA9IGNvbm4tPmliY19wZWVyLT5pYnBfbmktPm5pX2RhdGE7CkBAIC0xNTEsMTQgKzE1MSwxNCBAQAogCXN0cnVjdCBpYl9tciAgICAgICAqbXI7CiAJaW50CQkgcmM7CiAKLQlMQVNTRVJUIChuZXQgIT0gTlVMTCk7Ci0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKLQlMQVNTRVJUIChjcmVkaXQgPT0gSUJMTkRfUE9TVFJYX05PX0NSRURJVCB8fAotCQkgY3JlZGl0ID09IElCTE5EX1BPU1RSWF9QRUVSX0NSRURJVCB8fAotCQkgY3JlZGl0ID09IElCTE5EX1BPU1RSWF9SU1JWRF9DUkVESVQpOworCUxBU1NFUlQobmV0ICE9IE5VTEwpOworCUxBU1NFUlQoIWluX2ludGVycnVwdCgpKTsKKwlMQVNTRVJUKGNyZWRpdCA9PSBJQkxORF9QT1NUUlhfTk9fQ1JFRElUIHx8CisJCWNyZWRpdCA9PSBJQkxORF9QT1NUUlhfUEVFUl9DUkVESVQgfHwKKwkJY3JlZGl0ID09IElCTE5EX1BPU1RSWF9SU1JWRF9DUkVESVQpOwogCiAJbXIgPSBraWJsbmRfZmluZF9kbWFfbXIoY29ubi0+aWJjX2hkZXYsIHJ4LT5yeF9tc2dhZGRyLCBJQkxORF9NU0dfU0laRSk7Ci0JTEFTU0VSVCAobXIgIT0gTlVMTCk7CisJTEFTU0VSVChtciAhPSBOVUxMKTsKIAogCXJ4LT5yeF9zZ2UubGtleSAgID0gbXItPmxrZXk7CiAJcngtPnJ4X3NnZS5hZGRyICAgPSByeC0+cnhfbXNnYWRkcjsKQEAgLTE2OSw4ICsxNjksOCBAQAogCXJ4LT5yeF93cnEubnVtX3NnZSA9IDE7CiAJcngtPnJ4X3dycS53cl9pZCA9IGtpYmxuZF9wdHIyd3JlcWlkKHJ4LCBJQkxORF9XSURfUlgpOwogCi0JTEFTU0VSVCAoY29ubi0+aWJjX3N0YXRlID49IElCTE5EX0NPTk5fSU5JVCk7Ci0JTEFTU0VSVCAocngtPnJ4X25vYiA+PSAwKTsJICAgICAgLyogbm90IHBvc3RlZCAqLworCUxBU1NFUlQoY29ubi0+aWJjX3N0YXRlID49IElCTE5EX0NPTk5fSU5JVCk7CisJTEFTU0VSVChyeC0+cnhfbm9iID49IDApOwkgICAgICAvKiBub3QgcG9zdGVkICovCiAKIAlpZiAoY29ubi0+aWJjX3N0YXRlID4gSUJMTkRfQ09OTl9FU1RBQkxJU0hFRCkgewogCQlraWJsbmRfZHJvcF9yeChyeCk7CSAgICAgLyogTm8gbW9yZSBwb3N0cyBmb3IgdGhpcyByeCAqLwpAQCAtMjE3LDggKzIxNyw4IEBACiAJbGlzdF9mb3JfZWFjaCh0bXAsICZjb25uLT5pYmNfYWN0aXZlX3R4cykgewogCQlraWJfdHhfdCAqdHggPSBsaXN0X2VudHJ5KHRtcCwga2liX3R4X3QsIHR4X2xpc3QpOwogCi0JCUxBU1NFUlQgKCF0eC0+dHhfcXVldWVkKTsKLQkJTEFTU0VSVCAodHgtPnR4X3NlbmRpbmcgIT0gMCB8fCB0eC0+dHhfd2FpdGluZyk7CisJCUxBU1NFUlQoIXR4LT50eF9xdWV1ZWQpOworCQlMQVNTRVJUKHR4LT50eF9zZW5kaW5nICE9IDAgfHwgdHgtPnR4X3dhaXRpbmcpOwogCiAJCWlmICh0eC0+dHhfY29va2llICE9IGNvb2tpZSkKIAkJCWNvbnRpbnVlOwpAQCAtMjkzLDcgKzI5Myw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1raWJsbmRfaGFuZGxlX3J4IChraWJfcnhfdCAqcngpCitraWJsbmRfaGFuZGxlX3J4KGtpYl9yeF90ICpyeCkKIHsKIAlraWJfbXNnX3QgICAgKm1zZyA9IHJ4LT5yeF9tc2c7CiAJa2liX2Nvbm5fdCAgICpjb25uID0gcngtPnJ4X2Nvbm47CkBAIC0zMDQsMTEgKzMwNCwxMSBAQAogCWludAkgICByYzI7CiAJaW50CSAgIHBvc3RfY3JlZGl0OwogCi0JTEFTU0VSVCAoY29ubi0+aWJjX3N0YXRlID49IElCTE5EX0NPTk5fRVNUQUJMSVNIRUQpOworCUxBU1NFUlQoY29ubi0+aWJjX3N0YXRlID49IElCTE5EX0NPTk5fRVNUQUJMSVNIRUQpOwogCi0JQ0RFQlVHIChEX05FVCwgIlJlY2VpdmVkICV4WyVkXSBmcm9tICVzXG4iLAotCQltc2ctPmlibV90eXBlLCBjcmVkaXRzLAotCQlsaWJjZnNfbmlkMnN0cihjb25uLT5pYmNfcGVlci0+aWJwX25pZCkpOworCUNERUJVRyhEX05FVCwgIlJlY2VpdmVkICV4WyVkXSBmcm9tICVzXG4iLAorCSAgICAgICBtc2ctPmlibV90eXBlLCBjcmVkaXRzLAorCSAgICAgICBsaWJjZnNfbmlkMnN0cihjb25uLT5pYmNfcGVlci0+aWJwX25pZCkpOwogCiAJaWYgKGNyZWRpdHMgIT0gMCkgewogCQkvKiBIYXZlIEkgcmVjZWl2ZWQgY3JlZGl0cyB0aGF0IHdpbGwgbGV0IG1lIHNlbmQ/ICovCkBAIC0zNzcsOCArMzc3LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIElCTE5EX01TR19QVVRfTkFLOgotCQlDV0FSTiAoIlBVVF9OQUNLIGZyb20gJXNcbiIsCi0JCSAgICAgICBsaWJjZnNfbmlkMnN0cihjb25uLT5pYmNfcGVlci0+aWJwX25pZCkpOworCQlDV0FSTigiUFVUX05BQ0sgZnJvbSAlc1xuIiwKKwkJICAgICAgbGliY2ZzX25pZDJzdHIoY29ubi0+aWJjX3BlZXItPmlicF9uaWQpKTsKIAkJcG9zdF9jcmVkaXQgPSBJQkxORF9QT1NUUlhfUlNSVkRfQ1JFRElUOwogCQlraWJsbmRfaGFuZGxlX2NvbXBsZXRpb24oY29ubiwgSUJMTkRfTVNHX1BVVF9SRVEsCiAJCQkJCSBtc2ctPmlibV91LmNvbXBsZXRpb24uaWJjbV9zdGF0dXMsCkBAIC00MDIsNyArNDAyLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJTEFTU0VSVCAodHgtPnR4X3dhaXRpbmcpOworCQlMQVNTRVJUKHR4LT50eF93YWl0aW5nKTsKIAkJLyogQ0FWRUFUIEVNUFRPUjogSSBjb3VsZCBiZSByYWNpbmcgd2l0aCB0eF9jb21wbGV0ZSwgYnV0Li4uCiAJCSAqIChhKSBJIGNhbiBvdmVyd3JpdGUgdHhfbXNnIHNpbmNlIG15IHBlZXIgaGFzIHJlY2VpdmVkIGl0IQogCQkgKiAoYikgdHhfd2FpdGluZyBzZXQgdGVsbHMgdHhfY29tcGxldGUoKSBpdCdzIG5vdCBkb25lLiAqLwpAQCAtNDU0LDcgKzQ1NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1raWJsbmRfcnhfY29tcGxldGUgKGtpYl9yeF90ICpyeCwgaW50IHN0YXR1cywgaW50IG5vYikKK2tpYmxuZF9yeF9jb21wbGV0ZShraWJfcnhfdCAqcngsIGludCBzdGF0dXMsIGludCBub2IpCiB7CiAJa2liX21zZ190ICAgICptc2cgPSByeC0+cnhfbXNnOwogCWtpYl9jb25uX3QgICAqY29ubiA9IHJ4LT5yeF9jb25uOwpAQCAtNDYzLDggKzQ2Myw4IEBACiAJaW50CSAgIHJjOwogCWludAkgICBlcnIgPSAtRUlPOwogCi0JTEFTU0VSVCAobmV0ICE9IE5VTEwpOwotCUxBU1NFUlQgKHJ4LT5yeF9ub2IgPCAwKTsJICAgICAgIC8qIHdhcyBwb3N0ZWQgKi8KKwlMQVNTRVJUKG5ldCAhPSBOVUxMKTsKKwlMQVNTRVJUKHJ4LT5yeF9ub2IgPCAwKTsJICAgICAgIC8qIHdhcyBwb3N0ZWQgKi8KIAlyeC0+cnhfbm9iID0gMDsJCQkgLyogaXNuJ3Qgbm93ICovCiAKIAlpZiAoY29ubi0+aWJjX3N0YXRlID4gSUJMTkRfQ09OTl9FU1RBQkxJU0hFRCkKQEAgLTQ3NiwxMiArNDc2LDEyIEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCUxBU1NFUlQgKG5vYiA+PSAwKTsKKwlMQVNTRVJUKG5vYiA+PSAwKTsKIAlyeC0+cnhfbm9iID0gbm9iOwogCiAJcmMgPSBraWJsbmRfdW5wYWNrX21zZyhtc2csIHJ4LT5yeF9ub2IpOwogCWlmIChyYyAhPSAwKSB7Ci0JCUNFUlJPUiAoIkVycm9yICVkIHVucGFja2luZyByeCBmcm9tICVzXG4iLAorCQlDRVJST1IoIkVycm9yICVkIHVucGFja2luZyByeCBmcm9tICVzXG4iLAogCQkJcmMsIGxpYmNmc19uaWQyc3RyKGNvbm4tPmliY19wZWVyLT5pYnBfbmlkKSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KQEAgLTQ5MCw3ICs0OTAsNyBAQAogCSAgICBtc2ctPmlibV9kc3RuaWQgIT0gbmktPm5pX25pZCB8fAogCSAgICBtc2ctPmlibV9zcmNzdGFtcCAhPSBjb25uLT5pYmNfaW5jYXJuYXRpb24gfHwKIAkgICAgbXNnLT5pYm1fZHN0c3RhbXAgIT0gbmV0LT5pYm5faW5jYXJuYXRpb24pIHsKLQkJQ0VSUk9SICgiU3RhbGUgcnggZnJvbSAlc1xuIiwKKwkJQ0VSUk9SKCJTdGFsZSByeCBmcm9tICVzXG4iLAogCQkJbGliY2ZzX25pZDJzdHIoY29ubi0+aWJjX3BlZXItPmlicF9uaWQpKTsKIAkJZXJyID0gLUVTVEFMRTsKIAkJZ290byBmYWlsZWQ7CkBAIC01MjUsMTMgKzUyNSwxMyBAQAogfQogCiBzdGF0aWMgc3RydWN0IHBhZ2UgKgota2libG5kX2t2YWRkcl90b19wYWdlICh1bnNpZ25lZCBsb25nIHZhZGRyKQora2libG5kX2t2YWRkcl90b19wYWdlKHVuc2lnbmVkIGxvbmcgdmFkZHIpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKIAlpZiAoaXNfdm1hbGxvY19hZGRyKCh2b2lkICopdmFkZHIpKSB7Ci0JCXBhZ2UgPSB2bWFsbG9jX3RvX3BhZ2UgKCh2b2lkICopdmFkZHIpOwotCQlMQVNTRVJUIChwYWdlICE9IE5VTEwpOworCQlwYWdlID0gdm1hbGxvY190b19wYWdlKCh2b2lkICopdmFkZHIpOworCQlMQVNTRVJUKHBhZ2UgIT0gTlVMTCk7CiAJCXJldHVybiBwYWdlOwogCX0KICNpZmRlZiBDT05GSUdfSElHSE1FTQpAQCAtNTQyLDggKzU0Miw4IEBACiAJCUxCVUcoKTsKIAl9CiAjZW5kaWYKLQlwYWdlID0gdmlydF90b19wYWdlICh2YWRkcik7Ci0JTEFTU0VSVCAocGFnZSAhPSBOVUxMKTsKKwlwYWdlID0gdmlydF90b19wYWdlKHZhZGRyKTsKKwlMQVNTRVJUKHBhZ2UgIT0gTlVMTCk7CiAJcmV0dXJuIHBhZ2U7CiB9CiAKQEAgLTU2Nyw3ICs1NjcsNyBAQAogCWZvciAoaSA9IDAsIG5wYWdlcyA9IDA7IGkgPCByZC0+cmRfbmZyYWdzOyBpKyspIHsKIAkJZm9yIChzaXplID0gMDsgc2l6ZSA8ICByZC0+cmRfZnJhZ3NbaV0ucmZfbm9iOwogCQkJICAgICAgIHNpemUgKz0gaGRldi0+aWJoX3BhZ2Vfc2l6ZSkgewotCQkJcGFnZXNbbnBhZ2VzICsrXSA9IChyZC0+cmRfZnJhZ3NbaV0ucmZfYWRkciAmCisJCQlwYWdlc1tucGFnZXMrK10gPSAocmQtPnJkX2ZyYWdzW2ldLnJmX2FkZHIgJgogCQkJCQkgICAgaGRldi0+aWJoX3BhZ2VfbWFzaykgKyBzaXplOwogCQl9CiAJfQpAQCAtNTc3LDcgKzU3Nyw3IEBACiAJZnBzID0gbmV0LT5pYm5fZm1yX3BzW2NwdF07CiAJcmMgPSBraWJsbmRfZm1yX3Bvb2xfbWFwKGZwcywgcGFnZXMsIG5wYWdlcywgMCwgJnR4LT50eF91LmZtcik7CiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiQ2FuJ3QgbWFwICVkIHBhZ2VzOiAlZFxuIiwgbnBhZ2VzLCByYyk7CisJCUNFUlJPUigiQ2FuJ3QgbWFwICVkIHBhZ2VzOiAlZFxuIiwgbnBhZ2VzLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTcwNiwyNiArNzA2LDI2IEBACiAJaW50CQkgZnJhZ25vYjsKIAlpbnQJCSBwYWdlX29mZnNldDsKIAotCUxBU1NFUlQgKG5vYiA+IDApOwotCUxBU1NFUlQgKG5pb3YgPiAwKTsKLQlMQVNTRVJUIChuZXQgIT0gTlVMTCk7CisJTEFTU0VSVChub2IgPiAwKTsKKwlMQVNTRVJUKG5pb3YgPiAwKTsKKwlMQVNTRVJUKG5ldCAhPSBOVUxMKTsKIAogCXdoaWxlIChvZmZzZXQgPj0gaW92LT5pb3ZfbGVuKSB7CiAJCW9mZnNldCAtPSBpb3YtPmlvdl9sZW47CiAJCW5pb3YtLTsKIAkJaW92Kys7Ci0JCUxBU1NFUlQgKG5pb3YgPiAwKTsKKwkJTEFTU0VSVChuaW92ID4gMCk7CiAJfQogCiAJc2cgPSB0eC0+dHhfZnJhZ3M7CiAJZG8gewotCQlMQVNTRVJUIChuaW92ID4gMCk7CisJCUxBU1NFUlQobmlvdiA+IDApOwogCiAJCXZhZGRyID0gKCh1bnNpZ25lZCBsb25nKWlvdi0+aW92X2Jhc2UpICsgb2Zmc2V0OwogCQlwYWdlX29mZnNldCA9IHZhZGRyICYgKFBBR0VfU0laRSAtIDEpOwogCQlwYWdlID0ga2libG5kX2t2YWRkcl90b19wYWdlKHZhZGRyKTsKIAkJaWYgKHBhZ2UgPT0gTlVMTCkgewotCQkJQ0VSUk9SICgiQ2FuJ3QgZmluZCBwYWdlXG4iKTsKKwkJCUNFUlJPUigiQ2FuJ3QgZmluZCBwYWdlXG4iKTsKIAkJCXJldHVybiAtRUZBVUxUOwogCQl9CiAKQEAgLTc0OSw3ICs3NDksNyBAQAogfQogCiBzdGF0aWMgaW50Ci1raWJsbmRfc2V0dXBfcmRfa2lvdiAobG5ldF9uaV90ICpuaSwga2liX3R4X3QgKnR4LCBraWJfcmRtYV9kZXNjX3QgKnJkLAora2libG5kX3NldHVwX3JkX2tpb3YobG5ldF9uaV90ICpuaSwga2liX3R4X3QgKnR4LCBraWJfcmRtYV9kZXNjX3QgKnJkLAogCQkgICAgICBpbnQgbmtpb3YsIGxuZXRfa2lvdl90ICpraW92LCBpbnQgb2Zmc2V0LCBpbnQgbm9iKQogewogCWtpYl9uZXRfdAkgICpuZXQgPSBuaS0+bmlfZGF0YTsKQEAgLTc1OCwyMCArNzU4LDIwIEBACiAKIAlDREVCVUcoRF9ORVQsICJuaW92ICVkIG9mZnNldCAlZCBub2IgJWRcbiIsIG5raW92LCBvZmZzZXQsIG5vYik7CiAKLQlMQVNTRVJUIChub2IgPiAwKTsKLQlMQVNTRVJUIChua2lvdiA+IDApOwotCUxBU1NFUlQgKG5ldCAhPSBOVUxMKTsKKwlMQVNTRVJUKG5vYiA+IDApOworCUxBU1NFUlQobmtpb3YgPiAwKTsKKwlMQVNTRVJUKG5ldCAhPSBOVUxMKTsKIAogCXdoaWxlIChvZmZzZXQgPj0ga2lvdi0+a2lvdl9sZW4pIHsKIAkJb2Zmc2V0IC09IGtpb3YtPmtpb3ZfbGVuOwogCQlua2lvdi0tOwogCQlraW92Kys7Ci0JCUxBU1NFUlQgKG5raW92ID4gMCk7CisJCUxBU1NFUlQobmtpb3YgPiAwKTsKIAl9CiAKIAlzZyA9IHR4LT50eF9mcmFnczsKIAlkbyB7Ci0JCUxBU1NFUlQgKG5raW92ID4gMCk7CisJCUxBU1NFUlQobmtpb3YgPiAwKTsKIAogCQlmcmFnbm9iID0gbWluKChpbnQpKGtpb3YtPmtpb3ZfbGVuIC0gb2Zmc2V0KSwgbm9iKTsKIApAQCAtNzg5LDcgKzc4OSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWtpYmxuZF9wb3N0X3R4X2xvY2tlZCAoa2liX2Nvbm5fdCAqY29ubiwga2liX3R4X3QgKnR4LCBpbnQgY3JlZGl0KQora2libG5kX3Bvc3RfdHhfbG9ja2VkKGtpYl9jb25uX3QgKmNvbm4sIGtpYl90eF90ICp0eCwgaW50IGNyZWRpdCkKIAlfX3JlbGVhc2VzKGNvbm4tPmliY19sb2NrKQogCV9fYWNxdWlyZXMoY29ubi0+aWJjX2xvY2spCiB7CkBAIC04MDAsMTYgKzgwMCwxNiBAQAogCWludAkJZG9uZTsKIAlzdHJ1Y3QgaWJfc2VuZF93ciAqYmFkX3dycTsKIAotCUxBU1NFUlQgKHR4LT50eF9xdWV1ZWQpOworCUxBU1NFUlQodHgtPnR4X3F1ZXVlZCk7CiAJLyogV2UgcmVseSBvbiB0aGlzIGZvciBRUCBzaXppbmcgKi8KLQlMQVNTRVJUICh0eC0+dHhfbndycSA+IDApOwotCUxBU1NFUlQgKHR4LT50eF9ud3JxIDw9IDEgKyBJQkxORF9SRE1BX0ZSQUdTKHZlcikpOworCUxBU1NFUlQodHgtPnR4X253cnEgPiAwKTsKKwlMQVNTRVJUKHR4LT50eF9ud3JxIDw9IDEgKyBJQkxORF9SRE1BX0ZSQUdTKHZlcikpOwogCi0JTEFTU0VSVCAoY3JlZGl0ID09IDAgfHwgY3JlZGl0ID09IDEpOwotCUxBU1NFUlQgKGNvbm4tPmliY19vdXRzdGFuZGluZ19jcmVkaXRzID49IDApOwotCUxBU1NFUlQgKGNvbm4tPmliY19vdXRzdGFuZGluZ19jcmVkaXRzIDw9IElCTE5EX01TR19RVUVVRV9TSVpFKHZlcikpOwotCUxBU1NFUlQgKGNvbm4tPmliY19jcmVkaXRzID49IDApOwotCUxBU1NFUlQgKGNvbm4tPmliY19jcmVkaXRzIDw9IElCTE5EX01TR19RVUVVRV9TSVpFKHZlcikpOworCUxBU1NFUlQoY3JlZGl0ID09IDAgfHwgY3JlZGl0ID09IDEpOworCUxBU1NFUlQoY29ubi0+aWJjX291dHN0YW5kaW5nX2NyZWRpdHMgPj0gMCk7CisJTEFTU0VSVChjb25uLT5pYmNfb3V0c3RhbmRpbmdfY3JlZGl0cyA8PSBJQkxORF9NU0dfUVVFVUVfU0laRSh2ZXIpKTsKKwlMQVNTRVJUKGNvbm4tPmliY19jcmVkaXRzID49IDApOworCUxBU1NFUlQoY29ubi0+aWJjX2NyZWRpdHMgPD0gSUJMTkRfTVNHX1FVRVVFX1NJWkUodmVyKSk7CiAKIAlpZiAoY29ubi0+aWJjX25zZW5kc19wb3N0ZWQgPT0gSUJMTkRfQ09OQ1VSUkVOVF9TRU5EUyh2ZXIpKSB7CiAJCS8qIHR4IGNvbXBsZXRpb25zIG91dHN0YW5kaW5nLi4uICovCkBAIC05MjMsNyArOTIzLDcgQEAKIH0KIAogdm9pZAota2libG5kX2NoZWNrX3NlbmRzIChraWJfY29ubl90ICpjb25uKQora2libG5kX2NoZWNrX3NlbmRzKGtpYl9jb25uX3QgKmNvbm4pCiB7CiAJaW50CXZlciA9IGNvbm4tPmliY192ZXJzaW9uOwogCWxuZXRfbmlfdCAqbmkgPSBjb25uLT5pYmNfcGVlci0+aWJwX25pOwpAQCAtOTM4LDEwICs5MzgsMTAgQEAKIAogCXNwaW5fbG9jaygmY29ubi0+aWJjX2xvY2spOwogCi0JTEFTU0VSVCAoY29ubi0+aWJjX25zZW5kc19wb3N0ZWQgPD0gSUJMTkRfQ09OQ1VSUkVOVF9TRU5EUyh2ZXIpKTsKLQlMQVNTRVJUICghSUJMTkRfT09CX0NBUEFCTEUodmVyKSB8fAorCUxBU1NFUlQoY29ubi0+aWJjX25zZW5kc19wb3N0ZWQgPD0gSUJMTkRfQ09OQ1VSUkVOVF9TRU5EUyh2ZXIpKTsKKwlMQVNTRVJUKCFJQkxORF9PT0JfQ0FQQUJMRSh2ZXIpIHx8CiAJCSBjb25uLT5pYmNfbm9vcHNfcG9zdGVkIDw9IElCTE5EX09PQl9NU0dTKHZlcikpOwotCUxBU1NFUlQgKGNvbm4tPmliY19yZXNlcnZlZF9jcmVkaXRzID49IDApOworCUxBU1NFUlQoY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgPj0gMCk7CiAKIAl3aGlsZSAoY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgPiAwICYmCiAJICAgICAgICFsaXN0X2VtcHR5KCZjb25uLT5pYmNfdHhfcXVldWVfcnNydmQpKSB7CkBAIC05NzQsNyArOTc0LDcgQEAKIAkJCXR4ID0gbGlzdF9lbnRyeShjb25uLT5pYmNfdHhfcXVldWVfbm9jcmVkLm5leHQsCiAJCQkJCSAgICBraWJfdHhfdCwgdHhfbGlzdCk7CiAJCX0gZWxzZSBpZiAoIWxpc3RfZW1wdHkoJmNvbm4tPmliY190eF9ub29wcykpIHsKLQkJCUxBU1NFUlQgKCFJQkxORF9PT0JfQ0FQQUJMRSh2ZXIpKTsKKwkJCUxBU1NFUlQoIUlCTE5EX09PQl9DQVBBQkxFKHZlcikpOwogCQkJY3JlZGl0ID0gMTsKIAkJCXR4ID0gbGlzdF9lbnRyeShjb25uLT5pYmNfdHhfbm9vcHMubmV4dCwKIAkJCQkJa2liX3R4X3QsIHR4X2xpc3QpOwpAQCAtOTk1LDEzICs5OTUsMTMgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF90eF9jb21wbGV0ZSAoa2liX3R4X3QgKnR4LCBpbnQgc3RhdHVzKQora2libG5kX3R4X2NvbXBsZXRlKGtpYl90eF90ICp0eCwgaW50IHN0YXR1cykKIHsKIAlpbnQJICAgZmFpbGVkID0gKHN0YXR1cyAhPSBJQl9XQ19TVUNDRVNTKTsKIAlraWJfY29ubl90ICAgKmNvbm4gPSB0eC0+dHhfY29ubjsKIAlpbnQJICAgaWRsZTsKIAotCUxBU1NFUlQgKHR4LT50eF9zZW5kaW5nID4gMCk7CisJTEFTU0VSVCh0eC0+dHhfc2VuZGluZyA+IDApOwogCiAJaWYgKGZhaWxlZCkgewogCQlpZiAoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fRVNUQUJMSVNIRUQpCkBAIC0xMDQ5LDIyICsxMDQ5LDIyIEBACiB9CiAKIHZvaWQKLWtpYmxuZF9pbml0X3R4X21zZyAobG5ldF9uaV90ICpuaSwga2liX3R4X3QgKnR4LCBpbnQgdHlwZSwgaW50IGJvZHlfbm9iKQora2libG5kX2luaXRfdHhfbXNnKGxuZXRfbmlfdCAqbmksIGtpYl90eF90ICp0eCwgaW50IHR5cGUsIGludCBib2R5X25vYikKIHsKIAlraWJfaGNhX2Rldl90ICAgICAqaGRldiA9IHR4LT50eF9wb29sLT50cG9faGRldjsKIAlzdHJ1Y3QgaWJfc2dlICAgICAqc2dlID0gJnR4LT50eF9zZ2VbdHgtPnR4X253cnFdOwogCXN0cnVjdCBpYl9zZW5kX3dyICp3cnEgPSAmdHgtPnR4X3dycVt0eC0+dHhfbndycV07Ci0JaW50CQlub2IgPSBvZmZzZXRvZiAoa2liX21zZ190LCBpYm1fdSkgKyBib2R5X25vYjsKKwlpbnQJCW5vYiA9IG9mZnNldG9mKGtpYl9tc2dfdCwgaWJtX3UpICsgYm9keV9ub2I7CiAJc3RydWN0IGliX21yICAgICAgKm1yOwogCi0JTEFTU0VSVCAodHgtPnR4X253cnEgPj0gMCk7Ci0JTEFTU0VSVCAodHgtPnR4X253cnEgPCBJQkxORF9NQVhfUkRNQV9GUkFHUyArIDEpOwotCUxBU1NFUlQgKG5vYiA8PSBJQkxORF9NU0dfU0laRSk7CisJTEFTU0VSVCh0eC0+dHhfbndycSA+PSAwKTsKKwlMQVNTRVJUKHR4LT50eF9ud3JxIDwgSUJMTkRfTUFYX1JETUFfRlJBR1MgKyAxKTsKKwlMQVNTRVJUKG5vYiA8PSBJQkxORF9NU0dfU0laRSk7CiAKIAlraWJsbmRfaW5pdF9tc2codHgtPnR4X21zZywgdHlwZSwgYm9keV9ub2IpOwogCiAJbXIgPSBraWJsbmRfZmluZF9kbWFfbXIoaGRldiwgdHgtPnR4X21zZ2FkZHIsIG5vYik7Ci0JTEFTU0VSVCAobXIgIT0gTlVMTCk7CisJTEFTU0VSVChtciAhPSBOVUxMKTsKIAogCXNnZS0+bGtleSAgID0gbXItPmxrZXk7CiAJc2dlLT5hZGRyICAgPSB0eC0+dHhfbXNnYWRkcjsKQEAgLTEwODMsNyArMTA4Myw3IEBACiB9CiAKIGludAota2libG5kX2luaXRfcmRtYSAoa2liX2Nvbm5fdCAqY29ubiwga2liX3R4X3QgKnR4LCBpbnQgdHlwZSwKK2tpYmxuZF9pbml0X3JkbWEoa2liX2Nvbm5fdCAqY29ubiwga2liX3R4X3QgKnR4LCBpbnQgdHlwZSwKIAkJICBpbnQgcmVzaWQsIGtpYl9yZG1hX2Rlc2NfdCAqZHN0cmQsIF9fdTY0IGRzdGNvb2tpZSkKIHsKIAlraWJfbXNnX3QJICppYm1zZyA9IHR4LT50eF9tc2c7CkBAIC0xMDk1LDkgKzEwOTUsOSBAQAogCWludAkJZHN0aWR4OwogCWludAkJd3Jrbm9iOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKLQlMQVNTRVJUICh0eC0+dHhfbndycSA9PSAwKTsKLQlMQVNTRVJUICh0eXBlID09IElCTE5EX01TR19HRVRfRE9ORSB8fAorCUxBU1NFUlQoIWluX2ludGVycnVwdCgpKTsKKwlMQVNTRVJUKHR4LT50eF9ud3JxID09IDApOworCUxBU1NFUlQodHlwZSA9PSBJQkxORF9NU0dfR0VUX0RPTkUgfHwKIAkJIHR5cGUgPT0gSUJMTkRfTVNHX1BVVF9ET05FKTsKIAogCXNyY2lkeCA9IGRzdGlkeCA9IDA7CkBAIC0xMTYyLDE5ICsxMTYyLDE5IEBACiAJaWJtc2ctPmlibV91LmNvbXBsZXRpb24uaWJjbV9zdGF0dXMgPSByYzsKIAlpYm1zZy0+aWJtX3UuY29tcGxldGlvbi5pYmNtX2Nvb2tpZSA9IGRzdGNvb2tpZTsKIAlraWJsbmRfaW5pdF90eF9tc2coY29ubi0+aWJjX3BlZXItPmlicF9uaSwgdHgsCi0JCQkgICB0eXBlLCBzaXplb2YgKGtpYl9jb21wbGV0aW9uX21zZ190KSk7CisJCQkgICB0eXBlLCBzaXplb2Yoa2liX2NvbXBsZXRpb25fbXNnX3QpKTsKIAogCXJldHVybiByYzsKIH0KIAogdm9pZAota2libG5kX3F1ZXVlX3R4X2xvY2tlZCAoa2liX3R4X3QgKnR4LCBraWJfY29ubl90ICpjb25uKQora2libG5kX3F1ZXVlX3R4X2xvY2tlZChraWJfdHhfdCAqdHgsIGtpYl9jb25uX3QgKmNvbm4pCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAgICpxOwogCi0JTEFTU0VSVCAodHgtPnR4X253cnEgPiAwKTsJICAgICAgLyogd29yayBpdGVtcyBzZXQgdXAgKi8KLQlMQVNTRVJUICghdHgtPnR4X3F1ZXVlZCk7CSAgICAgICAvKiBub3QgcXVldWVkIGZvciBzZW5kaW5nIGFscmVhZHkgKi8KLQlMQVNTRVJUIChjb25uLT5pYmNfc3RhdGUgPj0gSUJMTkRfQ09OTl9FU1RBQkxJU0hFRCk7CisJTEFTU0VSVCh0eC0+dHhfbndycSA+IDApOwkgICAgICAvKiB3b3JrIGl0ZW1zIHNldCB1cCAqLworCUxBU1NFUlQoIXR4LT50eF9xdWV1ZWQpOwkgICAgICAgLyogbm90IHF1ZXVlZCBmb3Igc2VuZGluZyBhbHJlYWR5ICovCisJTEFTU0VSVChjb25uLT5pYmNfc3RhdGUgPj0gSUJMTkRfQ09OTl9FU1RBQkxJU0hFRCk7CiAKIAl0eC0+dHhfcXVldWVkID0gMTsKIAl0eC0+dHhfZGVhZGxpbmUgPSBqaWZmaWVzICsgKCpraWJsbmRfdHVuYWJsZXMua2liX3RpbWVvdXQgKiBIWik7CkBAIC0xMTgyLDExICsxMTgyLDExIEBACiAJaWYgKHR4LT50eF9jb25uID09IE5VTEwpIHsKIAkJa2libG5kX2Nvbm5fYWRkcmVmKGNvbm4pOwogCQl0eC0+dHhfY29ubiA9IGNvbm47Ci0JCUxBU1NFUlQgKHR4LT50eF9tc2ctPmlibV90eXBlICE9IElCTE5EX01TR19QVVRfRE9ORSk7CisJCUxBU1NFUlQodHgtPnR4X21zZy0+aWJtX3R5cGUgIT0gSUJMTkRfTVNHX1BVVF9ET05FKTsKIAl9IGVsc2UgewogCQkvKiBQVVRfRE9ORSBmaXJzdCBhdHRhY2hlZCB0byBjb25uIGFzIGEgUFVUX1JFUSAqLwotCQlMQVNTRVJUICh0eC0+dHhfY29ubiA9PSBjb25uKTsKLQkJTEFTU0VSVCAodHgtPnR4X21zZy0+aWJtX3R5cGUgPT0gSUJMTkRfTVNHX1BVVF9ET05FKTsKKwkJTEFTU0VSVCh0eC0+dHhfY29ubiA9PSBjb25uKTsKKwkJTEFTU0VSVCh0eC0+dHhfbXNnLT5pYm1fdHlwZSA9PSBJQkxORF9NU0dfUFVUX0RPTkUpOwogCX0KIAogCXN3aXRjaCAodHgtPnR4X21zZy0+aWJtX3R5cGUpIHsKQEAgLTEyMjEsNyArMTIyMSw3IEBACiB9CiAKIHZvaWQKLWtpYmxuZF9xdWV1ZV90eCAoa2liX3R4X3QgKnR4LCBraWJfY29ubl90ICpjb25uKQora2libG5kX3F1ZXVlX3R4KGtpYl90eF90ICp0eCwga2liX2Nvbm5fdCAqY29ubikKIHsKIAlzcGluX2xvY2soJmNvbm4tPmliY19sb2NrKTsKIAlraWJsbmRfcXVldWVfdHhfbG9ja2VkKHR4LCBjb25uKTsKQEAgLTEyNjgsNyArMTI2OCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1raWJsbmRfY29ubmVjdF9wZWVyIChraWJfcGVlcl90ICpwZWVyKQora2libG5kX2Nvbm5lY3RfcGVlcihraWJfcGVlcl90ICpwZWVyKQogewogCXN0cnVjdCByZG1hX2NtX2lkICpjbWlkOwogCWtpYl9kZXZfdAkgKmRldjsKQEAgLTEyNzcsOCArMTI3Nyw4IEBACiAJc3RydWN0IHNvY2thZGRyX2luIGRzdGFkZHI7CiAJaW50CQlyYzsKIAotCUxBU1NFUlQgKG5ldCAhPSBOVUxMKTsKLQlMQVNTRVJUIChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDApOworCUxBU1NFUlQobmV0ICE9IE5VTEwpOworCUxBU1NFUlQocGVlci0+aWJwX2Nvbm5lY3RpbmcgPiAwKTsKIAogCWNtaWQgPSBraWJsbmRfcmRtYV9jcmVhdGVfaWQoa2libG5kX2NtX2NhbGxiYWNrLCBwZWVyLCBSRE1BX1BTX1RDUCwKIAkJCQkgICAgIElCX1FQVF9SQyk7CkBAIC0xMzE4LDcgKzEzMTgsNyBAQAogCQlnb3RvIGZhaWxlZDI7CiAJfQogCi0JTEFTU0VSVCAoY21pZC0+ZGV2aWNlICE9IE5VTEwpOworCUxBU1NFUlQoY21pZC0+ZGV2aWNlICE9IE5VTEwpOwogCUNERUJVRyhEX05FVCwgIiVzOiBjb25uZWN0aW9uIGJvdW5kIHRvICVzOiVwSTRoOiVzXG4iLAogCSAgICAgICBsaWJjZnNfbmlkMnN0cihwZWVyLT5pYnBfbmlkKSwgZGV2LT5pYmRfaWZuYW1lLAogCSAgICAgICAmZGV2LT5pYmRfaWZpcCwgY21pZC0+ZGV2aWNlLT5uYW1lKTsKQEAgLTEzMzMsNyArMTMzMyw3IEBACiB9CiAKIHZvaWQKLWtpYmxuZF9sYXVuY2hfdHggKGxuZXRfbmlfdCAqbmksIGtpYl90eF90ICp0eCwgbG5ldF9uaWRfdCBuaWQpCitraWJsbmRfbGF1bmNoX3R4KGxuZXRfbmlfdCAqbmksIGtpYl90eF90ICp0eCwgbG5ldF9uaWRfdCBuaWQpCiB7CiAJa2liX3BlZXJfdAkqcGVlcjsKIAlraWJfcGVlcl90CSpwZWVyMjsKQEAgLTEzNDUsOCArMTM0NSw4IEBACiAJLyogSWYgSSBnZXQgaGVyZSwgSSd2ZSBjb21taXR0ZWQgdG8gc2VuZCwgc28gSSBjb21wbGV0ZSB0aGUgdHggd2l0aAogCSAqIGZhaWx1cmUgb24gYW55IHByb2JsZW1zICovCiAKLQlMQVNTRVJUICh0eCA9PSBOVUxMIHx8IHR4LT50eF9jb25uID09IE5VTEwpOyAvKiBvbmx5IHNldCB3aGVuIGFzc2lnbmVkIGEgY29ubiAqLwotCUxBU1NFUlQgKHR4ID09IE5VTEwgfHwgdHgtPnR4X253cnEgPiAwKTsgICAgIC8qIHdvcmsgaXRlbXMgaGF2ZSBiZWVuIHNldCB1cCAqLworCUxBU1NFUlQodHggPT0gTlVMTCB8fCB0eC0+dHhfY29ubiA9PSBOVUxMKTsgLyogb25seSBzZXQgd2hlbiBhc3NpZ25lZCBhIGNvbm4gKi8KKwlMQVNTRVJUKHR4ID09IE5VTEwgfHwgdHgtPnR4X253cnEgPiAwKTsgICAgIC8qIHdvcmsgaXRlbXMgaGF2ZSBiZWVuIHNldCB1cCAqLwogCiAJLyogRmlyc3QgdGltZSwganVzdCB1c2UgYSByZWFkIGxvY2sgc2luY2UgSSBleHBlY3QgdG8gZmluZCBteSBwZWVyCiAJICogY29ubmVjdGVkICovCkBAIC0xMzc0LDcgKzEzNzQsNyBAQAogCWlmIChwZWVyICE9IE5VTEwpIHsKIAkJaWYgKGxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykpIHsKIAkJCS8qIGZvdW5kIGEgcGVlciwgYnV0IGl0J3Mgc3RpbGwgY29ubmVjdGluZy4uLiAqLwotCQkJTEFTU0VSVCAocGVlci0+aWJwX2Nvbm5lY3RpbmcgIT0gMCB8fAorCQkJTEFTU0VSVChwZWVyLT5pYnBfY29ubmVjdGluZyAhPSAwIHx8CiAJCQkJIHBlZXItPmlicF9hY2NlcHRpbmcgIT0gMCk7CiAJCQlpZiAodHggIT0gTlVMTCkKIAkJCQlsaXN0X2FkZF90YWlsKCZ0eC0+dHhfbGlzdCwKQEAgLTE0MTMsNyArMTQxMyw3IEBACiAJaWYgKHBlZXIyICE9IE5VTEwpIHsKIAkJaWYgKGxpc3RfZW1wdHkoJnBlZXIyLT5pYnBfY29ubnMpKSB7CiAJCQkvKiBmb3VuZCBhIHBlZXIsIGJ1dCBpdCdzIHN0aWxsIGNvbm5lY3RpbmcuLi4gKi8KLQkJCUxBU1NFUlQgKHBlZXIyLT5pYnBfY29ubmVjdGluZyAhPSAwIHx8CisJCQlMQVNTRVJUKHBlZXIyLT5pYnBfY29ubmVjdGluZyAhPSAwIHx8CiAJCQkJIHBlZXIyLT5pYnBfYWNjZXB0aW5nICE9IDApOwogCQkJaWYgKHR4ICE9IE5VTEwpCiAJCQkJbGlzdF9hZGRfdGFpbCgmdHgtPnR4X2xpc3QsCkBAIC0xNDM1LDExICsxNDM1LDExIEBACiAJfQogCiAJLyogQnJhbmQgbmV3IHBlZXIgKi8KLQlMQVNTRVJUIChwZWVyLT5pYnBfY29ubmVjdGluZyA9PSAwKTsKKwlMQVNTRVJUKHBlZXItPmlicF9jb25uZWN0aW5nID09IDApOwogCXBlZXItPmlicF9jb25uZWN0aW5nID0gMTsKIAogCS8qIGFsd2F5cyBjYWxsZWQgd2l0aCBhIHJlZiBvbiBuaSwgd2hpY2ggcHJldmVudHMgbmkgYmVpbmcgc2h1dGRvd24gKi8KLQlMQVNTRVJUICgoKGtpYl9uZXRfdCAqKW5pLT5uaV9kYXRhKS0+aWJuX3NodXRkb3duID09IDApOworCUxBU1NFUlQoKChraWJfbmV0X3QgKiluaS0+bmlfZGF0YSktPmlibl9zaHV0ZG93biA9PSAwKTsKIAogCWlmICh0eCAhPSBOVUxMKQogCQlsaXN0X2FkZF90YWlsKCZ0eC0+dHhfbGlzdCwgJnBlZXItPmlicF90eF9xdWV1ZSk7CkBAIC0xNDU0LDcgKzE0NTQsNyBAQAogfQogCiBpbnQKLWtpYmxuZF9zZW5kIChsbmV0X25pX3QgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICpsbnRtc2cpCitraWJsbmRfc2VuZChsbmV0X25pX3QgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICpsbnRtc2cpCiB7CiAJbG5ldF9oZHJfdCAgICAgICAqaGRyID0gJmxudG1zZy0+bXNnX2hkcjsKIAlpbnQJICAgICAgIHR5cGUgPSBsbnRtc2ctPm1zZ190eXBlOwpAQCAtMTQ3NiwxMyArMTQ3NiwxMyBAQAogCUNERUJVRyhEX05FVCwgInNlbmRpbmcgJWQgYnl0ZXMgaW4gJWQgZnJhZ3MgdG8gJXNcbiIsCiAJICAgICAgIHBheWxvYWRfbm9iLCBwYXlsb2FkX25pb3YsIGxpYmNmc19pZDJzdHIodGFyZ2V0KSk7CiAKLQlMQVNTRVJUIChwYXlsb2FkX25vYiA9PSAwIHx8IHBheWxvYWRfbmlvdiA+IDApOwotCUxBU1NFUlQgKHBheWxvYWRfbmlvdiA8PSBMTkVUX01BWF9JT1YpOworCUxBU1NFUlQocGF5bG9hZF9ub2IgPT0gMCB8fCBwYXlsb2FkX25pb3YgPiAwKTsKKwlMQVNTRVJUKHBheWxvYWRfbmlvdiA8PSBMTkVUX01BWF9JT1YpOwogCiAJLyogVGhyZWFkIGNvbnRleHQgKi8KLQlMQVNTRVJUICghaW5faW50ZXJydXB0KCkpOworCUxBU1NFUlQoIWluX2ludGVycnVwdCgpKTsKIAkvKiBwYXlsb2FkIGlzIGVpdGhlciBhbGwgdmFkZHJzIG9yIGFsbCBwYWdlcyAqLwotCUxBU1NFUlQgKCEocGF5bG9hZF9raW92ICE9IE5VTEwgJiYgcGF5bG9hZF9pb3YgIT0gTlVMTCkpOworCUxBU1NFUlQoIShwYXlsb2FkX2tpb3YgIT0gTlVMTCAmJiBwYXlsb2FkX2lvdiAhPSBOVUxMKSk7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAlkZWZhdWx0OgpAQCAtMTQ5MCw3ICsxNDkwLDcgQEAKIAkJcmV0dXJuIC1FSU87CiAKIAljYXNlIExORVRfTVNHX0FDSzoKLQkJTEFTU0VSVCAocGF5bG9hZF9ub2IgPT0gMCk7CisJCUxBU1NFUlQocGF5bG9hZF9ub2IgPT0gMCk7CiAJCWJyZWFrOwogCiAJY2FzZSBMTkVUX01TR19HRVQ6CkBAIC0xNTkyLDEyICsxNTkyLDEyIEBACiAKIAkvKiBzZW5kIElNTUVESUFURSAqLwogCi0JTEFTU0VSVCAob2Zmc2V0b2Yoa2liX21zZ190LCBpYm1fdS5pbW1lZGlhdGUuaWJpbV9wYXlsb2FkW3BheWxvYWRfbm9iXSkKKwlMQVNTRVJUKG9mZnNldG9mKGtpYl9tc2dfdCwgaWJtX3UuaW1tZWRpYXRlLmliaW1fcGF5bG9hZFtwYXlsb2FkX25vYl0pCiAJCSA8PSBJQkxORF9NU0dfU0laRSk7CiAKIAl0eCA9IGtpYmxuZF9nZXRfaWRsZV90eChuaSwgdGFyZ2V0Lm5pZCk7CiAJaWYgKHR4ID09IE5VTEwpIHsKLQkJQ0VSUk9SICgiQ2FuJ3Qgc2VuZCAlZCB0byAlczogdHggZGVzY3MgZXhoYXVzdGVkXG4iLAorCQlDRVJST1IoIkNhbid0IHNlbmQgJWQgdG8gJXM6IHR4IGRlc2NzIGV4aGF1c3RlZFxuIiwKIAkJCXR5cGUsIGxpYmNmc19uaWQyc3RyKHRhcmdldC5uaWQpKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTYyNSw3ICsxNjI1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF9yZXBseSAobG5ldF9uaV90ICpuaSwga2liX3J4X3QgKnJ4LCBsbmV0X21zZ190ICpsbnRtc2cpCitraWJsbmRfcmVwbHkobG5ldF9uaV90ICpuaSwga2liX3J4X3QgKnJ4LCBsbmV0X21zZ190ICpsbnRtc2cpCiB7CiAJbG5ldF9wcm9jZXNzX2lkX3QgdGFyZ2V0ID0gbG50bXNnLT5tc2dfdGFyZ2V0OwogCXVuc2lnbmVkIGludCAgICAgIG5pb3YgPSBsbnRtc2ctPm1zZ19uaW92OwpAQCAtMTY4Nyw3ICsxNjg3LDcgQEAKIH0KIAogaW50Ci1raWJsbmRfcmVjdiAobG5ldF9uaV90ICpuaSwgdm9pZCAqcHJpdmF0ZSwgbG5ldF9tc2dfdCAqbG50bXNnLCBpbnQgZGVsYXllZCwKK2tpYmxuZF9yZWN2KGxuZXRfbmlfdCAqbmksIHZvaWQgKnByaXZhdGUsIGxuZXRfbXNnX3QgKmxudG1zZywgaW50IGRlbGF5ZWQsCiAJICAgICB1bnNpZ25lZCBpbnQgbmlvdiwgc3RydWN0IGt2ZWMgKmlvdiwgbG5ldF9raW92X3QgKmtpb3YsCiAJICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgbWxlbiwgdW5zaWduZWQgaW50IHJsZW4pCiB7CkBAIC0xNzAwLDEwICsxNzAwLDEwIEBACiAJaW50CSAgcG9zdF9jcmVkaXQgPSBJQkxORF9QT1NUUlhfUEVFUl9DUkVESVQ7CiAJaW50CSAgcmMgPSAwOwogCi0JTEFTU0VSVCAobWxlbiA8PSBybGVuKTsKLQlMQVNTRVJUICghaW5faW50ZXJydXB0KCkpOworCUxBU1NFUlQobWxlbiA8PSBybGVuKTsKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CiAJLyogRWl0aGVyIGFsbCBwYWdlcyBvciBhbGwgdmFkZHJzICovCi0JTEFTU0VSVCAoIShraW92ICE9IE5VTEwgJiYgaW92ICE9IE5VTEwpKTsKKwlMQVNTRVJUKCEoa2lvdiAhPSBOVUxMICYmIGlvdiAhPSBOVUxMKSk7CiAKIAlzd2l0Y2ggKHJ4bXNnLT5pYm1fdHlwZSkgewogCWRlZmF1bHQ6CkBAIC0xNzEyLDcgKzE3MTIsNyBAQAogCWNhc2UgSUJMTkRfTVNHX0lNTUVESUFURToKIAkJbm9iID0gb2Zmc2V0b2Yoa2liX21zZ190LCBpYm1fdS5pbW1lZGlhdGUuaWJpbV9wYXlsb2FkW3JsZW5dKTsKIAkJaWYgKG5vYiA+IHJ4LT5yeF9ub2IpIHsKLQkJCUNFUlJPUiAoIkltbWVkaWF0ZSBtZXNzYWdlIGZyb20gJXMgdG9vIGJpZzogJWQoJWQpXG4iLAorCQkJQ0VSUk9SKCJJbW1lZGlhdGUgbWVzc2FnZSBmcm9tICVzIHRvbyBiaWc6ICVkKCVkKVxuIiwKIAkJCQlsaWJjZnNfbmlkMnN0cihyeG1zZy0+aWJtX3UuaW1tZWRpYXRlLmliaW1faGRyLnNyY19uaWQpLAogCQkJCW5vYiwgcngtPnJ4X25vYik7CiAJCQlyYyA9IC1FUFJPVE87CkBAIC0xNzI5LDcgKzE3MjksNyBAQAogCQkJCQkgICBJQkxORF9NU0dfU0laRSwgcnhtc2csCiAJCQkJCSAgIG9mZnNldG9mKGtpYl9tc2dfdCwgaWJtX3UuaW1tZWRpYXRlLmliaW1fcGF5bG9hZCksCiAJCQkJCSAgIG1sZW4pOwotCQlsbmV0X2ZpbmFsaXplIChuaSwgbG50bXNnLCAwKTsKKwkJbG5ldF9maW5hbGl6ZShuaSwgbG50bXNnLCAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIElCTE5EX01TR19QVVRfUkVROgpAQCAtMTgxMiwxMyArMTgxMiwxMyBAQAogfQogCiBzdGF0aWMgdm9pZAota2libG5kX3RocmVhZF9maW5pICh2b2lkKQora2libG5kX3RocmVhZF9maW5pKHZvaWQpCiB7Ci0JYXRvbWljX2RlYyAoJmtpYmxuZF9kYXRhLmtpYl9udGhyZWFkcyk7CisJYXRvbWljX2RlYygma2libG5kX2RhdGEua2liX250aHJlYWRzKTsKIH0KIAogdm9pZAota2libG5kX3BlZXJfYWxpdmUgKGtpYl9wZWVyX3QgKnBlZXIpCitraWJsbmRfcGVlcl9hbGl2ZShraWJfcGVlcl90ICpwZWVyKQogewogCS8qIFRoaXMgaXMgcmFjeSwgYnV0IGV2ZXJ5b25lJ3Mgb25seSB3cml0aW5nIGNmc190aW1lX2N1cnJlbnQoKSAqLwogCXBlZXItPmlicF9sYXN0X2FsaXZlID0gY2ZzX3RpbWVfY3VycmVudCgpOwpAQCAtMTgyNiw3ICsxODI2LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF9wZWVyX25vdGlmeSAoa2liX3BlZXJfdCAqcGVlcikKK2tpYmxuZF9wZWVyX25vdGlmeShraWJfcGVlcl90ICpwZWVyKQogewogCWludAkgICBlcnJvciA9IDA7CiAJdW5zaWduZWQgbG9uZyAgICBsYXN0X2FsaXZlID0gMDsKQEAgLTE4NTIsNyArMTg1Miw3IEBACiB9CiAKIHZvaWQKLWtpYmxuZF9jbG9zZV9jb25uX2xvY2tlZCAoa2liX2Nvbm5fdCAqY29ubiwgaW50IGVycm9yKQora2libG5kX2Nsb3NlX2Nvbm5fbG9ja2VkKGtpYl9jb25uX3QgKmNvbm4sIGludCBlcnJvcikKIHsKIAkvKiBUaGlzIGp1c3QgZG9lcyB0aGUgaW1tZWRpYXRlIGhvdXNla2VlcGluZy4gICdlcnJvcicgaXMgemVybyBmb3IgYQogCSAqIG5vcm1hbCBzaHV0ZG93biB3aGljaCBjYW4gaGFwcGVuIG9ubHkgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gaGFzIGJlZW4KQEAgLTE4NjQsNyArMTg2NCw3IEBACiAJa2liX2Rldl90CSpkZXY7CiAJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CiAKLQlMQVNTRVJUIChlcnJvciAhPSAwIHx8IGNvbm4tPmliY19zdGF0ZSA+PSBJQkxORF9DT05OX0VTVEFCTElTSEVEKTsKKwlMQVNTRVJUKGVycm9yICE9IDAgfHwgY29ubi0+aWJjX3N0YXRlID49IElCTE5EX0NPTk5fRVNUQUJMSVNIRUQpOwogCiAJaWYgKGVycm9yICE9IDAgJiYgY29ubi0+aWJjX2NvbW1zX2Vycm9yID09IDApCiAJCWNvbm4tPmliY19jb21tc19lcnJvciA9IGVycm9yOwpAQCAtMTg5NCw3ICsxODk0LDcgQEAKIAlsaXN0X2RlbCgmY29ubi0+aWJjX2xpc3QpOwogCS8qIGNvbm5kIChzZWUgYmVsb3cpIHRha2VzIG92ZXIgaWJjX2xpc3QncyByZWYgKi8KIAotCWlmIChsaXN0X2VtcHR5ICgmcGVlci0+aWJwX2Nvbm5zKSAmJiAgICAvKiBubyBtb3JlIGNvbm5zICovCisJaWYgKGxpc3RfZW1wdHkoJnBlZXItPmlicF9jb25ucykgJiYgICAgLyogbm8gbW9yZSBjb25ucyAqLwogCSAgICBraWJsbmRfcGVlcl9hY3RpdmUocGVlcikpIHsJIC8qIHN0aWxsIGluIHBlZXIgdGFibGUgKi8KIAkJa2libG5kX3VubGlua19wZWVyX2xvY2tlZChwZWVyKTsKIApAQCAtMTkzNiwxNCArMTkzNiwxMyBAQAogewogCXVuc2lnbmVkIGxvbmcgICAgZmxhZ3M7CiAJa2liX3J4X3QJKnJ4OworCWtpYl9yeF90ICp0bXA7CiAKIAlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CiAJTEFTU0VSVChjb25uLT5pYmNfc3RhdGUgPj0gSUJMTkRfQ09OTl9FU1RBQkxJU0hFRCk7CiAKIAl3cml0ZV9sb2NrX2lycXNhdmUoJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jaywgZmxhZ3MpOwotCXdoaWxlICghbGlzdF9lbXB0eSgmY29ubi0+aWJjX2Vhcmx5X3J4cykpIHsKLQkJcnggPSBsaXN0X2VudHJ5KGNvbm4tPmliY19lYXJseV9yeHMubmV4dCwKLQkJCQkgICAga2liX3J4X3QsIHJ4X2xpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShyeCwgdG1wLCAmY29ubi0+aWJjX2Vhcmx5X3J4cywgcnhfbGlzdCkgewogCQlsaXN0X2RlbCgmcngtPnJ4X2xpc3QpOwogCQl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAKQEAgLTE5NTcsMjIgKzE5NTYsMjIgQEAKIHN0YXRpYyB2b2lkCiBraWJsbmRfYWJvcnRfdHhzKGtpYl9jb25uX3QgKmNvbm4sIHN0cnVjdCBsaXN0X2hlYWQgKnR4cykKIHsKLQlMSVNUX0hFQUQgICAgICAgKHpvbWJpZXMpOworCUxJU1RfSEVBRCh6b21iaWVzKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgKnRtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgKm54dDsKIAlraWJfdHhfdAkgICAgKnR4OwogCiAJc3Bpbl9sb2NrKCZjb25uLT5pYmNfbG9jayk7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHRtcCwgbnh0LCB0eHMpIHsKLQkJdHggPSBsaXN0X2VudHJ5ICh0bXAsIGtpYl90eF90LCB0eF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBueHQsIHR4cykgeworCQl0eCA9IGxpc3RfZW50cnkodG1wLCBraWJfdHhfdCwgdHhfbGlzdCk7CiAKIAkJaWYgKHR4cyA9PSAmY29ubi0+aWJjX2FjdGl2ZV90eHMpIHsKLQkJCUxBU1NFUlQgKCF0eC0+dHhfcXVldWVkKTsKLQkJCUxBU1NFUlQgKHR4LT50eF93YWl0aW5nIHx8CisJCQlMQVNTRVJUKCF0eC0+dHhfcXVldWVkKTsKKwkJCUxBU1NFUlQodHgtPnR4X3dhaXRpbmcgfHwKIAkJCQkgdHgtPnR4X3NlbmRpbmcgIT0gMCk7CiAJCX0gZWxzZSB7Ci0JCQlMQVNTRVJUICh0eC0+dHhfcXVldWVkKTsKKwkJCUxBU1NFUlQodHgtPnR4X3F1ZXVlZCk7CiAJCX0KIAogCQl0eC0+dHhfc3RhdHVzID0gLUVDT05OQUJPUlRFRDsKQEAgLTE5ODAsOCArMTk3OSw4IEBACiAKIAkJaWYgKHR4LT50eF9zZW5kaW5nID09IDApIHsKIAkJCXR4LT50eF9xdWV1ZWQgPSAwOwotCQkJbGlzdF9kZWwgKCZ0eC0+dHhfbGlzdCk7Ci0JCQlsaXN0X2FkZCAoJnR4LT50eF9saXN0LCAmem9tYmllcyk7CisJCQlsaXN0X2RlbCgmdHgtPnR4X2xpc3QpOworCQkJbGlzdF9hZGQoJnR4LT50eF9saXN0LCAmem9tYmllcyk7CiAJCX0KIAl9CiAKQEAgLTE5OTEsMTAgKzE5OTAsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF9maW5hbGlzZV9jb25uIChraWJfY29ubl90ICpjb25uKQora2libG5kX2ZpbmFsaXNlX2Nvbm4oa2liX2Nvbm5fdCAqY29ubikKIHsKLQlMQVNTRVJUICghaW5faW50ZXJydXB0KCkpOwotCUxBU1NFUlQgKGNvbm4tPmliY19zdGF0ZSA+IElCTE5EX0NPTk5fSU5JVCk7CisJTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOworCUxBU1NFUlQoY29ubi0+aWJjX3N0YXRlID4gSUJMTkRfQ09OTl9JTklUKTsKIAogCWtpYmxuZF9zZXRfY29ubl9zdGF0ZShjb25uLCBJQkxORF9DT05OX0RJU0NPTk5FQ1RFRCk7CiAKQEAgLTIwMTYsMjEgKzIwMTUsMjEgQEAKIH0KIAogdm9pZAota2libG5kX3BlZXJfY29ubmVjdF9mYWlsZWQgKGtpYl9wZWVyX3QgKnBlZXIsIGludCBhY3RpdmUsIGludCBlcnJvcikKK2tpYmxuZF9wZWVyX2Nvbm5lY3RfZmFpbGVkKGtpYl9wZWVyX3QgKnBlZXIsIGludCBhY3RpdmUsIGludCBlcnJvcikKIHsKLQlMSVNUX0hFQUQgICAgKHpvbWJpZXMpOworCUxJU1RfSEVBRCh6b21iaWVzKTsKIAl1bnNpZ25lZCBsb25nICAgICBmbGFnczsKIAotCUxBU1NFUlQgKGVycm9yICE9IDApOwotCUxBU1NFUlQgKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVChlcnJvciAhPSAwKTsKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CiAKIAl3cml0ZV9sb2NrX2lycXNhdmUoJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGFjdGl2ZSkgewotCQlMQVNTRVJUIChwZWVyLT5pYnBfY29ubmVjdGluZyA+IDApOworCQlMQVNTRVJUKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCk7CiAJCXBlZXItPmlicF9jb25uZWN0aW5nLS07CiAJfSBlbHNlIHsKLQkJTEFTU0VSVCAocGVlci0+aWJwX2FjY2VwdGluZyA+IDApOworCQlMQVNTRVJUKHBlZXItPmlicF9hY2NlcHRpbmcgPiAwKTsKIAkJcGVlci0+aWJwX2FjY2VwdGluZy0tOwogCX0KIApAQCAtMjA1MywxNCArMjA1MiwxNCBAQAogCQlwZWVyLT5pYnBfZXJyb3IgPSBlcnJvcjsKIAl9IGVsc2UgewogCQkvKiBDYW4ndCBoYXZlIGJsb2NrZWQgdHJhbnNtaXRzIGlmIHRoZXJlIGFyZSBjb25uZWN0aW9ucyAqLwotCQlMQVNTRVJUIChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfdHhfcXVldWUpKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5pYnBfdHhfcXVldWUpKTsKIAl9CiAKIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAKIAlraWJsbmRfcGVlcl9ub3RpZnkocGVlcik7CiAKLQlpZiAobGlzdF9lbXB0eSAoJnpvbWJpZXMpKQorCWlmIChsaXN0X2VtcHR5KCZ6b21iaWVzKSkKIAkJcmV0dXJuOwogCiAJQ05FVEVSUigiRGVsZXRpbmcgbWVzc2FnZXMgZm9yICVzOiBjb25uZWN0aW9uIGZhaWxlZFxuIiwKQEAgLTIwNzQsNiArMjA3Myw3IEBACiB7CiAJa2liX3BlZXJfdAkqcGVlciA9IGNvbm4tPmliY19wZWVyOwogCWtpYl90eF90CSAgKnR4OworCWtpYl90eF90ICp0bXA7CiAJc3RydWN0IGxpc3RfaGVhZAkgdHhzOwogCXVuc2lnbmVkIGxvbmcgICAgICBmbGFnczsKIAlpbnQJCWFjdGl2ZTsKQEAgLTIwODQsOCArMjA4NCw4IEBACiAJICAgICAgIGxpYmNmc19uaWQyc3RyKHBlZXItPmlicF9uaWQpLCBhY3RpdmUsCiAJICAgICAgIGNvbm4tPmliY192ZXJzaW9uLCBzdGF0dXMpOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKLQlMQVNTRVJUICgoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fQUNUSVZFX0NPTk5FQ1QgJiYKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVCgoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fQUNUSVZFX0NPTk5FQ1QgJiYKIAkJICBwZWVyLT5pYnBfY29ubmVjdGluZyA+IDApIHx8CiAJCSAoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fUEFTU0lWRV9XQUlUICYmCiAJCSAgcGVlci0+aWJwX2FjY2VwdGluZyA+IDApKTsKQEAgLTIxNTAsOCArMjE1MCw3IEBACiAKIAkvKiBTY2hlZHVsZSBibG9ja2VkIHR4cyAqLwogCXNwaW5fbG9jaygmY29ubi0+aWJjX2xvY2spOwotCXdoaWxlICghbGlzdF9lbXB0eSgmdHhzKSkgewotCQl0eCA9IGxpc3RfZW50cnkodHhzLm5leHQsIGtpYl90eF90LCB0eF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHgsIHRtcCwgJnR4cywgdHhfbGlzdCkgewogCQlsaXN0X2RlbCgmdHgtPnR4X2xpc3QpOwogCiAJCWtpYmxuZF9xdWV1ZV90eF9sb2NrZWQodHgsIGNvbm4pOwpAQCAtMjE3Niw3ICsyMTc1LDcgQEAKIH0KIAogc3RhdGljIGludAota2libG5kX3Bhc3NpdmVfY29ubmVjdCAoc3RydWN0IHJkbWFfY21faWQgKmNtaWQsIHZvaWQgKnByaXYsIGludCBwcml2X25vYikKK2tpYmxuZF9wYXNzaXZlX2Nvbm5lY3Qoc3RydWN0IHJkbWFfY21faWQgKmNtaWQsIHZvaWQgKnByaXYsIGludCBwcml2X25vYikKIHsKIAlyd2xvY2tfdAkJKmdfbG9jayA9ICZraWJsbmRfZGF0YS5raWJfZ2xvYmFsX2xvY2s7CiAJa2liX21zZ190CSAgICAgKnJlcW1zZyA9IHByaXY7CkBAIC0yMTk0LDExICsyMTkzLDExIEBACiAJdW5zaWduZWQgbG9uZwkgIGZsYWdzOwogCWludAkJICAgIHJjOwogCXN0cnVjdCBzb2NrYWRkcl9pbiAgICAqcGVlcl9hZGRyOwotCUxBU1NFUlQgKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOwogCiAJLyogY21pZCBpbmhlcml0cyAnY29udGV4dCcgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBsaXN0ZW5lciBpZCAqLwogCWliZGV2ID0gKGtpYl9kZXZfdCAqKWNtaWQtPmNvbnRleHQ7Ci0JTEFTU0VSVCAoaWJkZXYgIT0gTlVMTCk7CisJTEFTU0VSVChpYmRldiAhPSBOVUxMKTsKIAogCW1lbXNldCgmcmVqLCAwLCBzaXplb2YocmVqKSk7CiAJcmVqLmlicl9tYWdpYwkJPSBJQkxORF9NU0dfTUFHSUM7CkBAIC0yMzY2LDggKzIzNjUsOCBAQAogCQlwZWVyID0gcGVlcjI7CiAJfSBlbHNlIHsKIAkJLyogQnJhbmQgbmV3IHBlZXIgKi8KLQkJTEFTU0VSVCAocGVlci0+aWJwX2FjY2VwdGluZyA9PSAwKTsKLQkJTEFTU0VSVCAocGVlci0+aWJwX3ZlcnNpb24gPT0gMCAmJgorCQlMQVNTRVJUKHBlZXItPmlicF9hY2NlcHRpbmcgPT0gMCk7CisJCUxBU1NFUlQocGVlci0+aWJwX3ZlcnNpb24gPT0gMCAmJgogCQkJIHBlZXItPmlicF9pbmNhcm5hdGlvbiA9PSAwKTsKIAogCQlwZWVyLT5pYnBfYWNjZXB0aW5nICAgPSAxOwpAQCAtMjM3NSw3ICsyMzc0LDcgQEAKIAkJcGVlci0+aWJwX2luY2FybmF0aW9uID0gcmVxbXNnLT5pYm1fc3Jjc3RhbXA7CiAKIAkJLyogSSBoYXZlIGEgcmVmIG9uIG5pIHRoYXQgcHJldmVudHMgaXQgYmVpbmcgc2h1dGRvd24gKi8KLQkJTEFTU0VSVCAobmV0LT5pYm5fc2h1dGRvd24gPT0gMCk7CisJCUxBU1NFUlQobmV0LT5pYm5fc2h1dGRvd24gPT0gMCk7CiAKIAkJa2libG5kX3BlZXJfYWRkcmVmKHBlZXIpOwogCQlsaXN0X2FkZF90YWlsKCZwZWVyLT5pYnBfbGlzdCwga2libG5kX25pZDJwZWVybGlzdChuaWQpKTsKQEAgLTIzOTcsNyArMjM5Niw3IEBACiAJY29ubi0+aWJjX2luY2FybmF0aW9uICAgICAgPSByZXFtc2ctPmlibV9zcmNzdGFtcDsKIAljb25uLT5pYmNfY3JlZGl0cwkgID0gSUJMTkRfTVNHX1FVRVVFX1NJWkUodmVyc2lvbik7CiAJY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgPSBJQkxORF9NU0dfUVVFVUVfU0laRSh2ZXJzaW9uKTsKLQlMQVNTRVJUIChjb25uLT5pYmNfY3JlZGl0cyArIGNvbm4tPmliY19yZXNlcnZlZF9jcmVkaXRzICsgSUJMTkRfT09CX01TR1ModmVyc2lvbikKKwlMQVNTRVJUKGNvbm4tPmliY19jcmVkaXRzICsgY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgKyBJQkxORF9PT0JfTVNHUyh2ZXJzaW9uKQogCQkgPD0gSUJMTkRfUlhfTVNHUyh2ZXJzaW9uKSk7CiAKIAlhY2ttc2cgPSAmY29ubi0+aWJjX2Nvbm52YXJzLT5jdl9tc2c7CkBAIC0yNDQ5LDcgKzI0NDgsNyBAQAogfQogCiBzdGF0aWMgdm9pZAota2libG5kX3JlY29ubmVjdCAoa2liX2Nvbm5fdCAqY29ubiwgaW50IHZlcnNpb24sCitraWJsbmRfcmVjb25uZWN0KGtpYl9jb25uX3QgKmNvbm4sIGludCB2ZXJzaW9uLAogCQkgIF9fdTY0IGluY2FybmF0aW9uLCBpbnQgd2h5LCBraWJfY29ubnBhcmFtc190ICpjcCkKIHsKIAlraWJfcGVlcl90ICAgICpwZWVyID0gY29ubi0+aWJjX3BlZXI7CkBAIC0yNDU3LDggKzI0NTYsOCBAQAogCWludAkgICAgcmV0cnkgPSAwOwogCXVuc2lnbmVkIGxvbmcgIGZsYWdzOwogCi0JTEFTU0VSVCAoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fQUNUSVZFX0NPTk5FQ1QpOwotCUxBU1NFUlQgKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCk7ICAgICAvKiAnY29ubicgYXQgbGVhc3QgKi8KKwlMQVNTRVJUKGNvbm4tPmliY19zdGF0ZSA9PSBJQkxORF9DT05OX0FDVElWRV9DT05ORUNUKTsKKwlMQVNTRVJUKHBlZXItPmlicF9jb25uZWN0aW5nID4gMCk7ICAgICAvKiAnY29ubicgYXQgbGVhc3QgKi8KIAogCXdyaXRlX2xvY2tfaXJxc2F2ZSgma2libG5kX2RhdGEua2liX2dsb2JhbF9sb2NrLCBmbGFncyk7CiAKQEAgLTI1MDQsMjAgKzI1MDMsMjAgQEAKIAlDTkVURVJSKCIlczogcmV0cnlpbmcgKCVzKSwgJXgsICV4LCBxdWV1ZV9kZXA6ICVkLCBtYXhfZnJhZzogJWQsIG1zZ19zaXplOiAlZFxuIiwKIAkJbGliY2ZzX25pZDJzdHIocGVlci0+aWJwX25pZCksCiAJCXJlYXNvbiwgSUJMTkRfTVNHX1ZFUlNJT04sIHZlcnNpb24sCi0JCWNwICE9IE5VTEw/IGNwLT5pYmNwX3F1ZXVlX2RlcHRoIDpJQkxORF9NU0dfUVVFVUVfU0laRSh2ZXJzaW9uKSwKLQkJY3AgIT0gTlVMTD8gY3AtPmliY3BfbWF4X2ZyYWdzICAgOiBJQkxORF9SRE1BX0ZSQUdTKHZlcnNpb24pLAotCQljcCAhPSBOVUxMPyBjcC0+aWJjcF9tYXhfbXNnX3NpemU6IElCTE5EX01TR19TSVpFKTsKKwkJY3AgIT0gTlVMTCA/IGNwLT5pYmNwX3F1ZXVlX2RlcHRoICA6IElCTE5EX01TR19RVUVVRV9TSVpFKHZlcnNpb24pLAorCQljcCAhPSBOVUxMID8gY3AtPmliY3BfbWF4X2ZyYWdzICAgIDogSUJMTkRfUkRNQV9GUkFHUyh2ZXJzaW9uKSwKKwkJY3AgIT0gTlVMTCA/IGNwLT5pYmNwX21heF9tc2dfc2l6ZSA6IElCTE5EX01TR19TSVpFKTsKIAogCWtpYmxuZF9jb25uZWN0X3BlZXIocGVlcik7CiB9CiAKIHN0YXRpYyB2b2lkCi1raWJsbmRfcmVqZWN0ZWQgKGtpYl9jb25uX3QgKmNvbm4sIGludCByZWFzb24sIHZvaWQgKnByaXYsIGludCBwcml2X25vYikKK2tpYmxuZF9yZWplY3RlZChraWJfY29ubl90ICpjb25uLCBpbnQgcmVhc29uLCB2b2lkICpwcml2LCBpbnQgcHJpdl9ub2IpCiB7CiAJa2liX3BlZXJfdCAgICAqcGVlciA9IGNvbm4tPmliY19wZWVyOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKLQlMQVNTRVJUIChjb25uLT5pYmNfc3RhdGUgPT0gSUJMTkRfQ09OTl9BQ1RJVkVfQ09OTkVDVCk7CisJTEFTU0VSVCghaW5faW50ZXJydXB0KCkpOworCUxBU1NFUlQoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fQUNUSVZFX0NPTk5FQ1QpOwogCiAJc3dpdGNoIChyZWFzb24pIHsKIAljYXNlIElCX0NNX1JFSl9TVEFMRV9DT05OOgpAQCAtMjY1MSw3ICsyNjUwLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF9jaGVja19jb25ucmVwbHkgKGtpYl9jb25uX3QgKmNvbm4sIHZvaWQgKnByaXYsIGludCBwcml2X25vYikKK2tpYmxuZF9jaGVja19jb25ucmVwbHkoa2liX2Nvbm5fdCAqY29ubiwgdm9pZCAqcHJpdiwgaW50IHByaXZfbm9iKQogewogCWtpYl9wZWVyX3QgICAgKnBlZXIgPSBjb25uLT5pYmNfcGVlcjsKIAlsbmV0X25pX3QgICAgICpuaSAgID0gcGVlci0+aWJwX25pOwpAQCAtMjY2MSw3ICsyNjYwLDcgQEAKIAlpbnQJICAgIHJjICAgPSBraWJsbmRfdW5wYWNrX21zZyhtc2csIHByaXZfbm9iKTsKIAl1bnNpZ25lZCBsb25nICBmbGFnczsKIAotCUxBU1NFUlQgKG5ldCAhPSBOVUxMKTsKKwlMQVNTRVJUKG5ldCAhPSBOVUxMKTsKIAogCWlmIChyYyAhPSAwKSB7CiAJCUNFUlJPUigiQ2FuJ3QgdW5wYWNrIGNvbm5hY2sgZnJvbSAlczogJWRcbiIsCkBAIC0yNzMwLDcgKzI3MjksNyBAQAogCWNvbm4tPmliY19pbmNhcm5hdGlvbiAgICAgID0gbXNnLT5pYm1fc3Jjc3RhbXA7CiAJY29ubi0+aWJjX2NyZWRpdHMJICA9CiAJY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgPSBJQkxORF9NU0dfUVVFVUVfU0laRSh2ZXIpOwotCUxBU1NFUlQgKGNvbm4tPmliY19jcmVkaXRzICsgY29ubi0+aWJjX3Jlc2VydmVkX2NyZWRpdHMgKyBJQkxORF9PT0JfTVNHUyh2ZXIpCisJTEFTU0VSVChjb25uLT5pYmNfY3JlZGl0cyArIGNvbm4tPmliY19yZXNlcnZlZF9jcmVkaXRzICsgSUJMTkRfT09CX01TR1ModmVyKQogCQkgPD0gSUJMTkRfUlhfTVNHUyh2ZXIpKTsKIAogCWtpYmxuZF9jb25ucmVxX2RvbmUoY29ubiwgMCk7CkBAIC0yNzQyLDEzICsyNzQxLDEzIEBACiAJICoga2libG5kX2Nvbm5yZXFfZG9uZSgwKSBtb3ZlcyB0aGUgY29ubiBzdGF0ZSB0byBFU1RBQkxJU0hFRCwgYnV0IHRoZW4KIAkgKiBpbW1lZGlhdGVseSB0ZWFycyBpdCBkb3duLiAqLwogCi0JTEFTU0VSVCAocmMgIT0gMCk7CisJTEFTU0VSVChyYyAhPSAwKTsKIAljb25uLT5pYmNfY29tbXNfZXJyb3IgPSByYzsKIAlraWJsbmRfY29ubnJlcV9kb25lKGNvbm4sIDApOwogfQogCiBzdGF0aWMgaW50Ci1raWJsbmRfYWN0aXZlX2Nvbm5lY3QgKHN0cnVjdCByZG1hX2NtX2lkICpjbWlkKQora2libG5kX2FjdGl2ZV9jb25uZWN0KHN0cnVjdCByZG1hX2NtX2lkICpjbWlkKQogewogCWtpYl9wZWVyX3QJICAgICAgKnBlZXIgPSAoa2liX3BlZXJfdCAqKWNtaWQtPmNvbnRleHQ7CiAJa2liX2Nvbm5fdAkgICAgICAqY29ubjsKQEAgLTI5MTMsNyArMjkxMiw3IEBACiAJCQlMQlVHKCk7CiAKIAkJY2FzZSBJQkxORF9DT05OX1BBU1NJVkVfV0FJVDoKLQkJCUNFUlJPUiAoIiVzOiBSRUpFQ1RFRCAlZFxuIiwKKwkJCUNFUlJPUigiJXM6IFJFSkVDVEVEICVkXG4iLAogCQkJCWxpYmNmc19uaWQyc3RyKGNvbm4tPmliY19wZWVyLT5pYnBfbmlkKSwKIAkJCQlldmVudC0+c3RhdHVzKTsKIAkJCWtpYmxuZF9jb25ucmVxX2RvbmUoY29ubiwgLUVDT05OUkVTRVQpOwpAQCAtMjk4NywxNyArMjk4NiwxNyBAQAogCWtpYl90eF90CSAgKnR4OwogCXN0cnVjdCBsaXN0X2hlYWQJKnR0bXA7CiAKLQlsaXN0X2Zvcl9lYWNoICh0dG1wLCB0eHMpIHsKLQkJdHggPSBsaXN0X2VudHJ5ICh0dG1wLCBraWJfdHhfdCwgdHhfbGlzdCk7CisJbGlzdF9mb3JfZWFjaCh0dG1wLCB0eHMpIHsKKwkJdHggPSBsaXN0X2VudHJ5KHR0bXAsIGtpYl90eF90LCB0eF9saXN0KTsKIAogCQlpZiAodHhzICE9ICZjb25uLT5pYmNfYWN0aXZlX3R4cykgewotCQkJTEFTU0VSVCAodHgtPnR4X3F1ZXVlZCk7CisJCQlMQVNTRVJUKHR4LT50eF9xdWV1ZWQpOwogCQl9IGVsc2UgewotCQkJTEFTU0VSVCAoIXR4LT50eF9xdWV1ZWQpOwotCQkJTEFTU0VSVCAodHgtPnR4X3dhaXRpbmcgfHwgdHgtPnR4X3NlbmRpbmcgIT0gMCk7CisJCQlMQVNTRVJUKCF0eC0+dHhfcXVldWVkKTsKKwkJCUxBU1NFUlQodHgtPnR4X3dhaXRpbmcgfHwgdHgtPnR4X3NlbmRpbmcgIT0gMCk7CiAJCX0KIAotCQlpZiAoY2ZzX3RpbWVfYWZ0ZXJlcSAoamlmZmllcywgdHgtPnR4X2RlYWRsaW5lKSkgeworCQlpZiAoY2ZzX3RpbWVfYWZ0ZXJlcShqaWZmaWVzLCB0eC0+dHhfZGVhZGxpbmUpKSB7CiAJCQlDRVJST1IoIlRpbWVkIG91dCB0eDogJXMsICVsdSBzZWNvbmRzXG4iLAogCQkJICAgICAgIGtpYmxuZF9xdWV1ZTJzdHIoY29ubiwgdHhzKSwKIAkJCSAgICAgICBjZnNfZHVyYXRpb25fc2VjKGppZmZpZXMgLSB0eC0+dHhfZGVhZGxpbmUpKTsKQEAgLTMwMTksMTQgKzMwMTgsMTUgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtpYmxuZF9jaGVja19jb25ucyAoaW50IGlkeCkKK2tpYmxuZF9jaGVja19jb25ucyhpbnQgaWR4KQogewotCUxJU1RfSEVBRCAoY2xvc2VzKTsKLQlMSVNUX0hFQUQgKGNoZWNrc2VuZHMpOworCUxJU1RfSEVBRChjbG9zZXMpOworCUxJU1RfSEVBRChjaGVja3NlbmRzKTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICpwZWVycyA9ICZraWJsbmRfZGF0YS5raWJfcGVlcnNbaWR4XTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICpwdG1wOwogCWtpYl9wZWVyX3QgICAgKnBlZXI7CiAJa2liX2Nvbm5fdCAgICAqY29ubjsKKwlraWJfY29ubl90ICp0bXA7CiAJc3RydWN0IGxpc3RfaGVhZCAgICAqY3RtcDsKIAl1bnNpZ25lZCBsb25nICBmbGFnczsKIApAQCAtMzAzNSwxNiArMzAzNSwxNiBAQAogCSAqIHRha2UgYSBsb29rLi4uICovCiAJcmVhZF9sb2NrX2lycXNhdmUoJmtpYmxuZF9kYXRhLmtpYl9nbG9iYWxfbG9jaywgZmxhZ3MpOwogCi0JbGlzdF9mb3JfZWFjaCAocHRtcCwgcGVlcnMpIHsKLQkJcGVlciA9IGxpc3RfZW50cnkgKHB0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoKHB0bXAsIHBlZXJzKSB7CisJCXBlZXIgPSBsaXN0X2VudHJ5KHB0bXAsIGtpYl9wZWVyX3QsIGlicF9saXN0KTsKIAotCQlsaXN0X2Zvcl9lYWNoIChjdG1wLCAmcGVlci0+aWJwX2Nvbm5zKSB7CisJCWxpc3RfZm9yX2VhY2goY3RtcCwgJnBlZXItPmlicF9jb25ucykgewogCQkJaW50IHRpbWVkb3V0OwogCQkJaW50IHNlbmRub29wOwogCiAJCQljb25uID0gbGlzdF9lbnRyeShjdG1wLCBraWJfY29ubl90LCBpYmNfbGlzdCk7CiAKLQkJCUxBU1NFUlQgKGNvbm4tPmliY19zdGF0ZSA9PSBJQkxORF9DT05OX0VTVEFCTElTSEVEKTsKKwkJCUxBU1NFUlQoY29ubi0+aWJjX3N0YXRlID09IElCTE5EX0NPTk5fRVNUQUJMSVNIRUQpOwogCiAJCQlzcGluX2xvY2soJmNvbm4tPmliY19sb2NrKTsKIApAQCAtMzA4MCw5ICszMDgwLDcgQEAKIAkvKiBIYW5kbGUgdGltZW91dCBieSBjbG9zaW5nIHRoZSB3aG9sZQogCSAqIGNvbm5lY3Rpb24uIFdlIGNhbiBvbmx5IGJlIHN1cmUgUkRNQSBhY3Rpdml0eQogCSAqIGhhcyBjZWFzZWQgb25jZSB0aGUgUVAgaGFzIGJlZW4gbW9kaWZpZWQuICovCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZjbG9zZXMpKSB7Ci0JCWNvbm4gPSBsaXN0X2VudHJ5KGNsb3Nlcy5uZXh0LAotCQkJCSAgICAgIGtpYl9jb25uX3QsIGliY19jb25uZF9saXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29ubiwgdG1wLCAmY2xvc2VzLCBpYmNfY29ubmRfbGlzdCkgewogCQlsaXN0X2RlbCgmY29ubi0+aWJjX2Nvbm5kX2xpc3QpOwogCQlraWJsbmRfY2xvc2VfY29ubihjb25uLCAtRVRJTUVET1VUKTsKIAkJa2libG5kX2Nvbm5fZGVjcmVmKGNvbm4pOwpAQCAtMzEwMSwxMSArMzA5OSwxMSBAQAogfQogCiBzdGF0aWMgdm9pZAota2libG5kX2Rpc2Nvbm5lY3RfY29ubiAoa2liX2Nvbm5fdCAqY29ubikKK2tpYmxuZF9kaXNjb25uZWN0X2Nvbm4oa2liX2Nvbm5fdCAqY29ubikKIHsKLQlMQVNTRVJUICghaW5faW50ZXJydXB0KCkpOwotCUxBU1NFUlQgKGN1cnJlbnQgPT0ga2libG5kX2RhdGEua2liX2Nvbm5kKTsKLQlMQVNTRVJUIChjb25uLT5pYmNfc3RhdGUgPT0gSUJMTkRfQ09OTl9DTE9TSU5HKTsKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVChjdXJyZW50ID09IGtpYmxuZF9kYXRhLmtpYl9jb25uZCk7CisJTEFTU0VSVChjb25uLT5pYmNfc3RhdGUgPT0gSUJMTkRfQ09OTl9DTE9TSU5HKTsKIAogCXJkbWFfZGlzY29ubmVjdChjb25uLT5pYmNfY21pZCk7CiAJa2libG5kX2ZpbmFsaXNlX2Nvbm4oY29ubik7CkBAIC0zMTE0LDcgKzMxMTIsNyBAQAogfQogCiBpbnQKLWtpYmxuZF9jb25uZCAodm9pZCAqYXJnKQora2libG5kX2Nvbm5kKHZvaWQgKmFyZykKIHsKIAl3YWl0X3F1ZXVlX3QgICAgIHdhaXQ7CiAJdW5zaWduZWQgbG9uZyAgICAgIGZsYWdzOwpAQCAtMzEyNSw3ICszMTIzLDcgQEAKIAlpbnQJCXBlZXJfaW5kZXggPSAwOwogCXVuc2lnbmVkIGxvbmcgICAgICBkZWFkbGluZSA9IGppZmZpZXM7CiAKLQljZnNfYmxvY2tfYWxsc2lncyAoKTsKKwljZnNfYmxvY2tfYWxsc2lncygpOwogCiAJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOwogCWtpYmxuZF9kYXRhLmtpYl9jb25uZCA9IGN1cnJlbnQ7CkBAIC0zMTM2LDcgKzMxMzQsNyBAQAogCiAJCWRyb3BwZWRfbG9jayA9IDA7CiAKLQkJaWYgKCFsaXN0X2VtcHR5ICgma2libG5kX2RhdGEua2liX2Nvbm5kX3pvbWJpZXMpKSB7CisJCWlmICghbGlzdF9lbXB0eSgma2libG5kX2RhdGEua2liX2Nvbm5kX3pvbWJpZXMpKSB7CiAJCQljb25uID0gbGlzdF9lbnRyeShraWJsbmRfZGF0YS4gXAogCQkJCQkgICAgICBraWJfY29ubmRfem9tYmllcy5uZXh0LAogCQkJCQkgICAgICBraWJfY29ubl90LCBpYmNfbGlzdCk7CkBAIC0zMjM5LDcgKzMyMzcsNyBAQAogfQogCiBzdGF0aWMgdm9pZAota2libG5kX2NvbXBsZXRlIChzdHJ1Y3QgaWJfd2MgKndjKQora2libG5kX2NvbXBsZXRlKHN0cnVjdCBpYl93YyAqd2MpCiB7CiAJc3dpdGNoIChraWJsbmRfd3JlcWlkMnR5cGUod2MtPndyX2lkKSkgewogCWRlZmF1bHQ6CkBAIC0zNDQwLDkgKzM0MzgsOSBAQAogCXVuc2lnbmVkIGxvbmcgICAgICBmbGFnczsKIAlpbnQJCXJjOwogCi0JTEFTU0VSVCAoKmtpYmxuZF90dW5hYmxlcy5raWJfZGV2X2ZhaWxvdmVyICE9IDApOworCUxBU1NFUlQoKmtpYmxuZF90dW5hYmxlcy5raWJfZGV2X2ZhaWxvdmVyICE9IDApOwogCi0JY2ZzX2Jsb2NrX2FsbHNpZ3MgKCk7CisJY2ZzX2Jsb2NrX2FsbHNpZ3MoKTsKIAogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKIAl3cml0ZV9sb2NrX2lycXNhdmUoZ2xvY2ssIGZsYWdzKTsKQEAgLTM0NjksNyArMzQ2Nyw3IEBACiAKIAkJCXdyaXRlX2xvY2tfaXJxc2F2ZShnbG9jaywgZmxhZ3MpOwogCi0JCQlMQVNTRVJUIChkZXYtPmliZF9mYWlsb3Zlcik7CisJCQlMQVNTRVJUKGRldi0+aWJkX2ZhaWxvdmVyKTsKIAkJCWRldi0+aWJkX2ZhaWxvdmVyID0gMDsKIAkJCWlmIChyYyA+PSAwKSB7IC8qIERldmljZSBpcyBPSyBvciBmYWlsb3ZlciBzdWNjZWVkICovCiAJCQkJZGV2LT5pYmRfbmV4dF9mYWlsb3ZlciA9IGNmc190aW1lX3NoaWZ0KDMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9tb2RwYXJhbXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9vMmlibG5kL28yaWJsbmRfbW9kcGFyYW1zLmMKaW5kZXggOGI0YThlOS4uZWVkZjAxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL28yaWJsbmQvbzJpYmxuZF9tb2RwYXJhbXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvbzJpYmxuZC9vMmlibG5kX21vZHBhcmFtcy5jCkBAIC00NCw3ICs0NCw3IEBACiBtb2R1bGVfcGFyYW0oc2VydmljZSwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moc2VydmljZSwgInNlcnZpY2UgbnVtYmVyICh3aXRoaW4gUkRNQV9QU19UQ1ApIik7CiAKLXN0YXRpYyBpbnQgY2tzdW0gPSAwOworc3RhdGljIGludCBja3N1bTsKIG1vZHVsZV9wYXJhbShja3N1bSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoY2tzdW0sICJzZXQgbm9uLXplcm8gdG8gZW5hYmxlIG1lc3NhZ2UgKG5vdCBSRE1BKSBjaGVja3N1bXMiKTsKIApAQCAtNzIsMTEgKzcyLDExIEBACiBtb2R1bGVfcGFyYW0ocGVlcl9jcmVkaXRzLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhwZWVyX2NyZWRpdHMsICIjIGNvbmN1cnJlbnQgc2VuZHMgdG8gMSBwZWVyIik7CiAKLXN0YXRpYyBpbnQgcGVlcl9jcmVkaXRzX2hpdyA9IDA7CitzdGF0aWMgaW50IHBlZXJfY3JlZGl0c19oaXc7CiBtb2R1bGVfcGFyYW0ocGVlcl9jcmVkaXRzX2hpdywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocGVlcl9jcmVkaXRzX2hpdywgIndoZW4gZWFnZXJseSB0byByZXR1cm4gY3JlZGl0cyIpOwogCi1zdGF0aWMgaW50IHBlZXJfYnVmZmVyX2NyZWRpdHMgPSAwOworc3RhdGljIGludCBwZWVyX2J1ZmZlcl9jcmVkaXRzOwogbW9kdWxlX3BhcmFtKHBlZXJfYnVmZmVyX2NyZWRpdHMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBlZXJfYnVmZmVyX2NyZWRpdHMsICIjIHBlci1wZWVyIHJvdXRlciBidWZmZXIgY3JlZGl0cyIpOwogCkBAIC0xMDAsMTUgKzEwMCwxNSBAQAogbW9kdWxlX3BhcmFtKGtlZXBhbGl2ZSwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Moa2VlcGFsaXZlLCAiSWRsZSB0aW1lIGluIHNlY29uZHMgYmVmb3JlIHNlbmRpbmcgYSBrZWVwYWxpdmUiKTsKIAotc3RhdGljIGludCBpYl9tdHUgPSAwOworc3RhdGljIGludCBpYl9tdHU7CiBtb2R1bGVfcGFyYW0oaWJfbXR1LCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpYl9tdHUsICJJQiBNVFUgMjU2LzUxMi8xMDI0LzIwNDgvNDA5NiIpOwogCi1zdGF0aWMgaW50IGNvbmN1cnJlbnRfc2VuZHMgPSAwOworc3RhdGljIGludCBjb25jdXJyZW50X3NlbmRzOwogbW9kdWxlX3BhcmFtKGNvbmN1cnJlbnRfc2VuZHMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNvbmN1cnJlbnRfc2VuZHMsICJzZW5kIHdvcmstcXVldWUgc2l6aW5nIik7CiAKLXN0YXRpYyBpbnQgbWFwX29uX2RlbWFuZCA9IDA7CitzdGF0aWMgaW50IG1hcF9vbl9kZW1hbmQ7CiBtb2R1bGVfcGFyYW0obWFwX29uX2RlbWFuZCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MobWFwX29uX2RlbWFuZCwgIm1hcCBvbiBkZW1hbmQiKTsKIApAQCAtMTM2LDEyICsxMzYsMTIgQEAKICAqIDE6IGVuYWJsZSBmYWlsb3ZlciBpZiBuZWNlc3NhcnkKICAqIDI6IGZvcmNlIHRvIGZhaWxvdmVyIChmb3IgZGVidWcpCiAgKi8KLXN0YXRpYyBpbnQgZGV2X2ZhaWxvdmVyID0gMDsKK3N0YXRpYyBpbnQgZGV2X2ZhaWxvdmVyOwogbW9kdWxlX3BhcmFtKGRldl9mYWlsb3ZlciwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGV2X2ZhaWxvdmVyLCAiSENBIGZhaWxvdmVyIGZvciBib25kaW5nICgwIG9mZiwgMSBvbiwgb3RoZXIgdmFsdWVzIHJlc2VydmVkKSIpOwogCiAKLXN0YXRpYyBpbnQgcmVxdWlyZV9wcml2aWxlZ2VkX3BvcnQgPSAwOworc3RhdGljIGludCByZXF1aXJlX3ByaXZpbGVnZWRfcG9ydDsKIG1vZHVsZV9wYXJhbShyZXF1aXJlX3ByaXZpbGVnZWRfcG9ydCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MocmVxdWlyZV9wcml2aWxlZ2VkX3BvcnQsICJyZXF1aXJlIHByaXZpbGVnZWQgcG9ydCB3aGVuIGFjY2VwdGluZyBjb25uZWN0aW9uIik7CiAKQEAgLTE3Nyw3ICsxNzcsNyBAQAogfTsKIAogaW50Ci1raWJsbmRfdHVuYWJsZXNfaW5pdCAodm9pZCkKK2tpYmxuZF90dW5hYmxlc19pbml0KHZvaWQpCiB7CiAJaWYgKGtpYmxuZF90cmFuc2xhdGVfbXR1KCpraWJsbmRfdHVuYWJsZXMua2liX2liX210dSkgPCAwKSB7CiAJCUNFUlJPUigiSW52YWxpZCBpYl9tdHUgJWQsIGV4cGVjdGVkIDI1Ni81MTIvMTAyNC8yMDQ4LzQwOTZcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmMKaW5kZXggNTk1NmRiYS4uNzU4NmI3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuYwpAQCAtNjUsMTUgKzY1LDE1IEBACiB9CiAKIHN0YXRpYyBrc29ja19yb3V0ZV90ICoKLWtzb2NrbmFsX2NyZWF0ZV9yb3V0ZSAoX191MzIgaXBhZGRyLCBpbnQgcG9ydCkKK2tzb2NrbmFsX2NyZWF0ZV9yb3V0ZShfX3UzMiBpcGFkZHIsIGludCBwb3J0KQogewogCWtzb2NrX3JvdXRlX3QgKnJvdXRlOwogCi0JTElCQ0ZTX0FMTE9DIChyb3V0ZSwgc2l6ZW9mICgqcm91dGUpKTsKKwlMSUJDRlNfQUxMT0Mocm91dGUsIHNpemVvZigqcm91dGUpKTsKIAlpZiAocm91dGUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlhdG9taWNfc2V0ICgmcm91dGUtPmtzbnJfcmVmY291bnQsIDEpOworCWF0b21pY19zZXQoJnJvdXRlLT5rc25yX3JlZmNvdW50LCAxKTsKIAlyb3V0ZS0+a3Nucl9wZWVyID0gTlVMTDsKIAlyb3V0ZS0+a3Nucl9yZXRyeV9pbnRlcnZhbCA9IDA7CSAvKiBPSyB0byBjb25uZWN0IGF0IGFueSB0aW1lICovCiAJcm91dGUtPmtzbnJfaXBhZGRyID0gaXBhZGRyOwpAQCAtODksNDMgKzg5LDQzIEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX2Rlc3Ryb3lfcm91dGUgKGtzb2NrX3JvdXRlX3QgKnJvdXRlKQora3NvY2tuYWxfZGVzdHJveV9yb3V0ZShrc29ja19yb3V0ZV90ICpyb3V0ZSkKIHsKLQlMQVNTRVJUIChhdG9taWNfcmVhZCgmcm91dGUtPmtzbnJfcmVmY291bnQpID09IDApOworCUxBU1NFUlQoYXRvbWljX3JlYWQoJnJvdXRlLT5rc25yX3JlZmNvdW50KSA9PSAwKTsKIAogCWlmIChyb3V0ZS0+a3Nucl9wZWVyICE9IE5VTEwpCiAJCWtzb2NrbmFsX3BlZXJfZGVjcmVmKHJvdXRlLT5rc25yX3BlZXIpOwogCi0JTElCQ0ZTX0ZSRUUgKHJvdXRlLCBzaXplb2YgKCpyb3V0ZSkpOworCUxJQkNGU19GUkVFKHJvdXRlLCBzaXplb2YoKnJvdXRlKSk7CiB9CiAKIHN0YXRpYyBpbnQKLWtzb2NrbmFsX2NyZWF0ZV9wZWVyIChrc29ja19wZWVyX3QgKipwZWVycCwgbG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpCitrc29ja25hbF9jcmVhdGVfcGVlcihrc29ja19wZWVyX3QgKipwZWVycCwgbG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpCiB7CiAJa3NvY2tfbmV0X3QgICAqbmV0ID0gbmktPm5pX2RhdGE7CiAJa3NvY2tfcGVlcl90ICAqcGVlcjsKIAotCUxBU1NFUlQgKGlkLm5pZCAhPSBMTkVUX05JRF9BTlkpOwotCUxBU1NFUlQgKGlkLnBpZCAhPSBMTkVUX1BJRF9BTlkpOwotCUxBU1NFUlQgKCFpbl9pbnRlcnJ1cHQoKSk7CisJTEFTU0VSVChpZC5uaWQgIT0gTE5FVF9OSURfQU5ZKTsKKwlMQVNTRVJUKGlkLnBpZCAhPSBMTkVUX1BJRF9BTlkpOworCUxBU1NFUlQoIWluX2ludGVycnVwdCgpKTsKIAotCUxJQkNGU19BTExPQyAocGVlciwgc2l6ZW9mICgqcGVlcikpOworCUxJQkNGU19BTExPQyhwZWVyLCBzaXplb2YoKnBlZXIpKTsKIAlpZiAocGVlciA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXBlZXItPmtzbnBfbmkgPSBuaTsKIAlwZWVyLT5rc25wX2lkID0gaWQ7Ci0JYXRvbWljX3NldCAoJnBlZXItPmtzbnBfcmVmY291bnQsIDEpOyAgIC8qIDEgcmVmIGZvciBjYWxsZXIgKi8KKwlhdG9taWNfc2V0KCZwZWVyLT5rc25wX3JlZmNvdW50LCAxKTsgICAvKiAxIHJlZiBmb3IgY2FsbGVyICovCiAJcGVlci0+a3NucF9jbG9zaW5nID0gMDsKIAlwZWVyLT5rc25wX2FjY2VwdGluZyA9IDA7CiAJcGVlci0+a3NucF9wcm90byA9IE5VTEw7CiAJcGVlci0+a3NucF9sYXN0X2FsaXZlID0gMDsKIAlwZWVyLT5rc25wX3pjX25leHRfY29va2llID0gU09DS05BTF9LRUVQQUxJVkVfUElORyArIDE7CiAKLQlJTklUX0xJU1RfSEVBRCAoJnBlZXItPmtzbnBfY29ubnMpOwotCUlOSVRfTElTVF9IRUFEICgmcGVlci0+a3NucF9yb3V0ZXMpOwotCUlOSVRfTElTVF9IRUFEICgmcGVlci0+a3NucF90eF9xdWV1ZSk7Ci0JSU5JVF9MSVNUX0hFQUQgKCZwZWVyLT5rc25wX3pjX3JlcV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmcGVlci0+a3NucF9jb25ucyk7CisJSU5JVF9MSVNUX0hFQUQoJnBlZXItPmtzbnBfcm91dGVzKTsKKwlJTklUX0xJU1RfSEVBRCgmcGVlci0+a3NucF90eF9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJnBlZXItPmtzbnBfemNfcmVxX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZwZWVyLT5rc25wX2xvY2spOwogCiAJc3Bpbl9sb2NrX2JoKCZuZXQtPmtzbm5fbG9jayk7CkBAIC0xNDcsMjEgKzE0NywyMSBAQAogfQogCiB2b2lkCi1rc29ja25hbF9kZXN0cm95X3BlZXIgKGtzb2NrX3BlZXJfdCAqcGVlcikKK2tzb2NrbmFsX2Rlc3Ryb3lfcGVlcihrc29ja19wZWVyX3QgKnBlZXIpCiB7CiAJa3NvY2tfbmV0X3QgICAgKm5ldCA9IHBlZXItPmtzbnBfbmktPm5pX2RhdGE7CiAKLQlDREVCVUcgKERfTkVULCAicGVlciAlcyAlcCBkZWxldGVkXG4iLAorCUNERUJVRyhEX05FVCwgInBlZXIgJXMgJXAgZGVsZXRlZFxuIiwKIAkJbGliY2ZzX2lkMnN0cihwZWVyLT5rc25wX2lkKSwgcGVlcik7CiAKLQlMQVNTRVJUIChhdG9taWNfcmVhZCAoJnBlZXItPmtzbnBfcmVmY291bnQpID09IDApOwotCUxBU1NFUlQgKHBlZXItPmtzbnBfYWNjZXB0aW5nID09IDApOwotCUxBU1NFUlQgKGxpc3RfZW1wdHkgKCZwZWVyLT5rc25wX2Nvbm5zKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSAoJnBlZXItPmtzbnBfcm91dGVzKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSAoJnBlZXItPmtzbnBfdHhfcXVldWUpKTsKLQlMQVNTRVJUIChsaXN0X2VtcHR5ICgmcGVlci0+a3NucF96Y19yZXFfbGlzdCkpOworCUxBU1NFUlQoYXRvbWljX3JlYWQoJnBlZXItPmtzbnBfcmVmY291bnQpID09IDApOworCUxBU1NFUlQocGVlci0+a3NucF9hY2NlcHRpbmcgPT0gMCk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX2Nvbm5zKSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX3JvdXRlcykpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmcGVlci0+a3NucF90eF9xdWV1ZSkpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmcGVlci0+a3NucF96Y19yZXFfbGlzdCkpOwogCi0JTElCQ0ZTX0ZSRUUgKHBlZXIsIHNpemVvZiAoKnBlZXIpKTsKKwlMSUJDRlNfRlJFRShwZWVyLCBzaXplb2YoKnBlZXIpKTsKIAogCS8qIE5CIGEgcGVlcidzIGNvbm5lY3Rpb25zIGFuZCByb3V0ZXMga2VlcCBhIHJlZmVyZW5jZSBvbiB0aGVpciBwZWVyCiAJICogdW50aWwgdGhleSBhcmUgZGVzdHJveWVkLCBzbyB3ZSBjYW4gYmUgYXNzdXJlZCB0aGF0IF9hbGxfIHN0YXRlIHRvCkBAIC0xNzMsMTcgKzE3MywxNyBAQAogfQogCiBrc29ja19wZWVyX3QgKgota3NvY2tuYWxfZmluZF9wZWVyX2xvY2tlZCAobG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpCitrc29ja25hbF9maW5kX3BlZXJfbG9ja2VkKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgKnBlZXJfbGlzdCA9IGtzb2NrbmFsX25pZDJwZWVybGlzdChpZC5uaWQpOwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgKnRtcDsKIAlrc29ja19wZWVyX3QgICAgICpwZWVyOwogCi0JbGlzdF9mb3JfZWFjaCAodG1wLCBwZWVyX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgcGVlcl9saXN0KSB7CiAKLQkJcGVlciA9IGxpc3RfZW50cnkgKHRtcCwga3NvY2tfcGVlcl90LCBrc25wX2xpc3QpOworCQlwZWVyID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX3BlZXJfdCwga3NucF9saXN0KTsKIAotCQlMQVNTRVJUICghcGVlci0+a3NucF9jbG9zaW5nKTsKKwkJTEFTU0VSVCghcGVlci0+a3NucF9jbG9zaW5nKTsKIAogCQlpZiAocGVlci0+a3NucF9uaSAhPSBuaSkKIAkJCWNvbnRpbnVlOwpAQCAtMjAxLDcgKzIwMSw3IEBACiB9CiAKIGtzb2NrX3BlZXJfdCAqCi1rc29ja25hbF9maW5kX3BlZXIgKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKQora3NvY2tuYWxfZmluZF9wZWVyKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKQogewogCWtzb2NrX3BlZXJfdCAgICAgKnBlZXI7CiAKQEAgLTIxNSwzNyArMjE1LDM3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1rc29ja25hbF91bmxpbmtfcGVlcl9sb2NrZWQgKGtzb2NrX3BlZXJfdCAqcGVlcikKK2tzb2NrbmFsX3VubGlua19wZWVyX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIpCiB7CiAJaW50CQlpOwogCV9fdTMyCSAgICAgIGlwOwogCWtzb2NrX2ludGVyZmFjZV90ICppZmFjZTsKIAogCWZvciAoaSA9IDA7IGkgPCBwZWVyLT5rc25wX25fcGFzc2l2ZV9pcHM7IGkrKykgewotCQlMQVNTRVJUIChpIDwgTE5FVF9NQVhfSU5URVJGQUNFUyk7CisJCUxBU1NFUlQoaSA8IExORVRfTUFYX0lOVEVSRkFDRVMpOwogCQlpcCA9IHBlZXItPmtzbnBfcGFzc2l2ZV9pcHNbaV07CiAKIAkJaWZhY2UgPSBrc29ja25hbF9pcDJpZmFjZShwZWVyLT5rc25wX25pLCBpcCk7CiAJCS8qIEFsbCBJUHMgaW4gcGVlci0+a3NucF9wYXNzaXZlX2lwc1tdIGNvbWUgZnJvbSB0aGUKIAkJICogaW50ZXJmYWNlIGxpc3QsIHRoZXJlZm9yZSB0aGUgY2FsbCBtdXN0IHN1Y2NlZWQuICovCi0JCUxBU1NFUlQgKGlmYWNlICE9IE5VTEwpOworCQlMQVNTRVJUKGlmYWNlICE9IE5VTEwpOwogCiAJCUNERUJVRyhEX05FVCwgInBlZXI9JXAgaWZhY2U9JXAga3NuaV9ucm91dGVzPSVkXG4iLAogCQkgICAgICAgcGVlciwgaWZhY2UsIGlmYWNlLT5rc25pX25yb3V0ZXMpOwogCQlpZmFjZS0+a3NuaV9ucGVlcnMtLTsKIAl9CiAKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX2Nvbm5zKSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmcGVlci0+a3NucF9yb3V0ZXMpKTsKLQlMQVNTRVJUICghcGVlci0+a3NucF9jbG9zaW5nKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfY29ubnMpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfcm91dGVzKSk7CisJTEFTU0VSVCghcGVlci0+a3NucF9jbG9zaW5nKTsKIAlwZWVyLT5rc25wX2Nsb3NpbmcgPSAxOwotCWxpc3RfZGVsICgmcGVlci0+a3NucF9saXN0KTsKKwlsaXN0X2RlbCgmcGVlci0+a3NucF9saXN0KTsKIAkvKiBsb3NlIHBlZXJsaXN0J3MgcmVmICovCiAJa3NvY2tuYWxfcGVlcl9kZWNyZWYocGVlcik7CiB9CiAKIHN0YXRpYyBpbnQKLWtzb2NrbmFsX2dldF9wZWVyX2luZm8gKGxuZXRfbmlfdCAqbmksIGludCBpbmRleCwKK2tzb2NrbmFsX2dldF9wZWVyX2luZm8obG5ldF9uaV90ICpuaSwgaW50IGluZGV4LAogCQkJbG5ldF9wcm9jZXNzX2lkX3QgKmlkLCBfX3UzMiAqbXlpcCwgX191MzIgKnBlZXJfaXAsCiAJCQlpbnQgKnBvcnQsIGludCAqY29ubl9jb3VudCwgaW50ICpzaGFyZV9jb3VudCkKIHsKQEAgLTI2MSw4ICsyNjEsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGtzb2NrbmFsX2RhdGEua3NuZF9wZWVyX2hhc2hfc2l6ZTsgaSsrKSB7CiAKLQkJbGlzdF9mb3JfZWFjaCAocHRtcCwgJmtzb2NrbmFsX2RhdGEua3NuZF9wZWVyc1tpXSkgewotCQkJcGVlciA9IGxpc3RfZW50cnkgKHB0bXAsIGtzb2NrX3BlZXJfdCwga3NucF9saXN0KTsKKwkJbGlzdF9mb3JfZWFjaChwdG1wLCAma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7CisJCQlwZWVyID0gbGlzdF9lbnRyeShwdG1wLCBrc29ja19wZWVyX3QsIGtzbnBfbGlzdCk7CiAKIAkJCWlmIChwZWVyLT5rc25wX25pICE9IG5pKQogCQkJCWNvbnRpbnVlOwpAQCAtMjk2LDcgKzI5Niw3IEBACiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKLQkJCWxpc3RfZm9yX2VhY2ggKHJ0bXAsICZwZWVyLT5rc25wX3JvdXRlcykgeworCQkJbGlzdF9mb3JfZWFjaChydG1wLCAmcGVlci0+a3NucF9yb3V0ZXMpIHsKIAkJCQlpZiAoaW5kZXgtLSA+IDApCiAJCQkJCWNvbnRpbnVlOwogCkBAIC0zNjQsMTcgKzM2NCwxNyBAQAogfQogCiBzdGF0aWMgdm9pZAota3NvY2tuYWxfYWRkX3JvdXRlX2xvY2tlZCAoa3NvY2tfcGVlcl90ICpwZWVyLCBrc29ja19yb3V0ZV90ICpyb3V0ZSkKK2tzb2NrbmFsX2FkZF9yb3V0ZV9sb2NrZWQoa3NvY2tfcGVlcl90ICpwZWVyLCBrc29ja19yb3V0ZV90ICpyb3V0ZSkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSp0bXA7CiAJa3NvY2tfY29ubl90ICAgICAgKmNvbm47CiAJa3NvY2tfcm91dGVfdCAgICAgKnJvdXRlMjsKIAotCUxBU1NFUlQgKCFwZWVyLT5rc25wX2Nsb3NpbmcpOwotCUxBU1NFUlQgKHJvdXRlLT5rc25yX3BlZXIgPT0gTlVMTCk7Ci0JTEFTU0VSVCAoIXJvdXRlLT5rc25yX3NjaGVkdWxlZCk7Ci0JTEFTU0VSVCAoIXJvdXRlLT5rc25yX2Nvbm5lY3RpbmcpOwotCUxBU1NFUlQgKHJvdXRlLT5rc25yX2Nvbm5lY3RlZCA9PSAwKTsKKwlMQVNTRVJUKCFwZWVyLT5rc25wX2Nsb3NpbmcpOworCUxBU1NFUlQocm91dGUtPmtzbnJfcGVlciA9PSBOVUxMKTsKKwlMQVNTRVJUKCFyb3V0ZS0+a3Nucl9zY2hlZHVsZWQpOworCUxBU1NFUlQoIXJvdXRlLT5rc25yX2Nvbm5lY3RpbmcpOworCUxBU1NFUlQocm91dGUtPmtzbnJfY29ubmVjdGVkID09IDApOwogCiAJLyogTEFTU0VSVCh1bmlxdWUpICovCiAJbGlzdF9mb3JfZWFjaCh0bXAsICZwZWVyLT5rc25wX3JvdXRlcykgewpAQCAtNDA1LDcgKzQwNSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1rc29ja25hbF9kZWxfcm91dGVfbG9ja2VkIChrc29ja19yb3V0ZV90ICpyb3V0ZSkKK2tzb2NrbmFsX2RlbF9yb3V0ZV9sb2NrZWQoa3NvY2tfcm91dGVfdCAqcm91dGUpCiB7CiAJa3NvY2tfcGVlcl90ICAgICAgKnBlZXIgPSByb3V0ZS0+a3Nucl9wZWVyOwogCWtzb2NrX2ludGVyZmFjZV90ICppZmFjZTsKQEAgLTQxMywxNiArNDEzLDE2IEBACiAJc3RydWN0IGxpc3RfaGVhZAkqY3RtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpjbnh0OwogCi0JTEFTU0VSVCAoIXJvdXRlLT5rc25yX2RlbGV0ZWQpOworCUxBU1NFUlQoIXJvdXRlLT5rc25yX2RlbGV0ZWQpOwogCiAJLyogQ2xvc2UgYXNzb2NpYXRlZCBjb25ucyAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZSAoY3RtcCwgY254dCwgJnBlZXItPmtzbnBfY29ubnMpIHsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUoY3RtcCwgY254dCwgJnBlZXItPmtzbnBfY29ubnMpIHsKIAkJY29ubiA9IGxpc3RfZW50cnkoY3RtcCwga3NvY2tfY29ubl90LCBrc25jX2xpc3QpOwogCiAJCWlmIChjb25uLT5rc25jX3JvdXRlICE9IHJvdXRlKQogCQkJY29udGludWU7CiAKLQkJa3NvY2tuYWxfY2xvc2VfY29ubl9sb2NrZWQgKGNvbm4sIDApOworCQlrc29ja25hbF9jbG9zZV9jb25uX2xvY2tlZChjb25uLCAwKTsKIAl9CiAKIAlpZiAocm91dGUtPmtzbnJfbXlpcGFkZHIgIT0gMCkgewpAQCAtNDMzLDE5ICs0MzMsMTkgQEAKIAl9CiAKIAlyb3V0ZS0+a3Nucl9kZWxldGVkID0gMTsKLQlsaXN0X2RlbCAoJnJvdXRlLT5rc25yX2xpc3QpOworCWxpc3RfZGVsKCZyb3V0ZS0+a3Nucl9saXN0KTsKIAlrc29ja25hbF9yb3V0ZV9kZWNyZWYocm91dGUpOwkgICAgIC8qIGRyb3AgcGVlcidzIHJlZiAqLwogCi0JaWYgKGxpc3RfZW1wdHkgKCZwZWVyLT5rc25wX3JvdXRlcykgJiYKLQkgICAgbGlzdF9lbXB0eSAoJnBlZXItPmtzbnBfY29ubnMpKSB7CisJaWYgKGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfcm91dGVzKSAmJgorCSAgICBsaXN0X2VtcHR5KCZwZWVyLT5rc25wX2Nvbm5zKSkgewogCQkvKiBJJ3ZlIGp1c3QgcmVtb3ZlZCB0aGUgbGFzdCByb3V0ZSB0byBhIHBlZXIgd2l0aCBubyBhY3RpdmUKIAkJICogY29ubmVjdGlvbnMgKi8KLQkJa3NvY2tuYWxfdW5saW5rX3BlZXJfbG9ja2VkIChwZWVyKTsKKwkJa3NvY2tuYWxfdW5saW5rX3BlZXJfbG9ja2VkKHBlZXIpOwogCX0KIH0KIAogaW50Ci1rc29ja25hbF9hZGRfcGVlciAobG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQsIF9fdTMyIGlwYWRkciwgaW50IHBvcnQpCitrc29ja25hbF9hZGRfcGVlcihsbmV0X25pX3QgKm5pLCBsbmV0X3Byb2Nlc3NfaWRfdCBpZCwgX191MzIgaXBhZGRyLCBpbnQgcG9ydCkKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSp0bXA7CiAJa3NvY2tfcGVlcl90ICAgICAgKnBlZXI7CkBAIC00NjMsNyArNDYzLDcgQEAKIAlpZiAocmMgIT0gMCkKIAkJcmV0dXJuIHJjOwogCi0Jcm91dGUgPSBrc29ja25hbF9jcmVhdGVfcm91dGUgKGlwYWRkciwgcG9ydCk7CisJcm91dGUgPSBrc29ja25hbF9jcmVhdGVfcm91dGUoaXBhZGRyLCBwb3J0KTsKIAlpZiAocm91dGUgPT0gTlVMTCkgewogCQlrc29ja25hbF9wZWVyX2RlY3JlZihwZWVyKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC00NzIsMjAgKzQ3MiwyMCBAQAogCXdyaXRlX2xvY2tfYmgoJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jayk7CiAKIAkvKiBhbHdheXMgY2FsbGVkIHdpdGggYSByZWYgb24gbmksIHNvIHNodXRkb3duIGNhbid0IGhhdmUgc3RhcnRlZCAqLwotCUxBU1NFUlQgKCgoa3NvY2tfbmV0X3QgKikgbmktPm5pX2RhdGEpLT5rc25uX3NodXRkb3duID09IDApOworCUxBU1NFUlQoKChrc29ja19uZXRfdCAqKSBuaS0+bmlfZGF0YSktPmtzbm5fc2h1dGRvd24gPT0gMCk7CiAKLQlwZWVyMiA9IGtzb2NrbmFsX2ZpbmRfcGVlcl9sb2NrZWQgKG5pLCBpZCk7CisJcGVlcjIgPSBrc29ja25hbF9maW5kX3BlZXJfbG9ja2VkKG5pLCBpZCk7CiAJaWYgKHBlZXIyICE9IE5VTEwpIHsKIAkJa3NvY2tuYWxfcGVlcl9kZWNyZWYocGVlcik7CiAJCXBlZXIgPSBwZWVyMjsKIAl9IGVsc2UgewogCQkvKiBwZWVyIHRhYmxlIHRha2VzIG15IHJlZiBvbiBwZWVyICovCi0JCWxpc3RfYWRkX3RhaWwgKCZwZWVyLT5rc25wX2xpc3QsCi0JCQkJICAga3NvY2tuYWxfbmlkMnBlZXJsaXN0IChpZC5uaWQpKTsKKwkJbGlzdF9hZGRfdGFpbCgmcGVlci0+a3NucF9saXN0LAorCQkJCSAgIGtzb2NrbmFsX25pZDJwZWVybGlzdChpZC5uaWQpKTsKIAl9CiAKIAlyb3V0ZTIgPSBOVUxMOwotCWxpc3RfZm9yX2VhY2ggKHRtcCwgJnBlZXItPmtzbnBfcm91dGVzKSB7CisJbGlzdF9mb3JfZWFjaCh0bXAsICZwZWVyLT5rc25wX3JvdXRlcykgewogCQlyb3V0ZTIgPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfcm91dGVfdCwga3Nucl9saXN0KTsKIAogCQlpZiAocm91dGUyLT5rc25yX2lwYWRkciA9PSBpcGFkZHIpCkBAIC01MDcsNyArNTA3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtzb2NrbmFsX2RlbF9wZWVyX2xvY2tlZCAoa3NvY2tfcGVlcl90ICpwZWVyLCBfX3UzMiBpcCkKK2tzb2NrbmFsX2RlbF9wZWVyX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIsIF9fdTMyIGlwKQogewogCWtzb2NrX2Nvbm5fdCAgICAgKmNvbm47CiAJa3NvY2tfcm91dGVfdCAgICAqcm91dGU7CkBAIC01MTUsMTIgKzUxNSwxMiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgKm54dDsKIAlpbnQJICAgICAgIG5zaGFyZWQ7CiAKLQlMQVNTRVJUICghcGVlci0+a3NucF9jbG9zaW5nKTsKKwlMQVNTRVJUKCFwZWVyLT5rc25wX2Nsb3NpbmcpOwogCiAJLyogRXh0cmEgcmVmIHByZXZlbnRzIHBlZXIgZGlzYXBwZWFyaW5nIHVudGlsIEknbSBkb25lIHdpdGggaXQgKi8KIAlrc29ja25hbF9wZWVyX2FkZHJlZihwZWVyKTsKIAotCWxpc3RfZm9yX2VhY2hfc2FmZSAodG1wLCBueHQsICZwZWVyLT5rc25wX3JvdXRlcykgeworCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAsIG54dCwgJnBlZXItPmtzbnBfcm91dGVzKSB7CiAJCXJvdXRlID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX3JvdXRlX3QsIGtzbnJfbGlzdCk7CiAKIAkJLyogbm8gbWF0Y2ggKi8KQEAgLTUyOSwxMSArNTI5LDExIEBACiAKIAkJcm91dGUtPmtzbnJfc2hhcmVfY291bnQgPSAwOwogCQkvKiBUaGlzIGRlbGV0ZXMgYXNzb2NpYXRlZCBjb25ucyB0b28gKi8KLQkJa3NvY2tuYWxfZGVsX3JvdXRlX2xvY2tlZCAocm91dGUpOworCQlrc29ja25hbF9kZWxfcm91dGVfbG9ja2VkKHJvdXRlKTsKIAl9CiAKIAluc2hhcmVkID0gMDsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHRtcCwgbnh0LCAmcGVlci0+a3NucF9yb3V0ZXMpIHsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBueHQsICZwZWVyLT5rc25wX3JvdXRlcykgewogCQlyb3V0ZSA9IGxpc3RfZW50cnkodG1wLCBrc29ja19yb3V0ZV90LCBrc25yX2xpc3QpOwogCQluc2hhcmVkICs9IHJvdXRlLT5rc25yX3NoYXJlX2NvdW50OwogCX0KQEAgLTU0MiwxNSArNTQyLDE1IEBACiAJCS8qIHJlbW92ZSBldmVyeXRoaW5nIGVsc2UgaWYgdGhlcmUgYXJlIG5vIGV4cGxpY2l0IGVudHJpZXMKIAkJICogbGVmdCAqLwogCi0JCWxpc3RfZm9yX2VhY2hfc2FmZSAodG1wLCBueHQsICZwZWVyLT5rc25wX3JvdXRlcykgeworCQlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBueHQsICZwZWVyLT5rc25wX3JvdXRlcykgewogCQkJcm91dGUgPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfcm91dGVfdCwga3Nucl9saXN0KTsKIAogCQkJLyogd2Ugc2hvdWxkIG9ubHkgYmUgcmVtb3ZpbmcgYXV0by1lbnRyaWVzICovCiAJCQlMQVNTRVJUKHJvdXRlLT5rc25yX3NoYXJlX2NvdW50ID09IDApOwotCQkJa3NvY2tuYWxfZGVsX3JvdXRlX2xvY2tlZCAocm91dGUpOworCQkJa3NvY2tuYWxfZGVsX3JvdXRlX2xvY2tlZChyb3V0ZSk7CiAJCX0KIAotCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHRtcCwgbnh0LCAmcGVlci0+a3NucF9jb25ucykgeworCQlsaXN0X2Zvcl9lYWNoX3NhZmUodG1wLCBueHQsICZwZWVyLT5rc25wX2Nvbm5zKSB7CiAJCQljb25uID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX2Nvbm5fdCwga3NuY19saXN0KTsKIAogCQkJa3NvY2tuYWxfY2xvc2VfY29ubl9sb2NrZWQoY29ubiwgMCk7CkBAIC01NjIsOSArNTYyLDkgQEAKIH0KIAogc3RhdGljIGludAota3NvY2tuYWxfZGVsX3BlZXIgKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkLCBfX3UzMiBpcCkKK2tzb2NrbmFsX2RlbF9wZWVyKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkLCBfX3UzMiBpcCkKIHsKLQlMSVNUX0hFQUQgICAgICh6b21iaWVzKTsKKwlMSVNUX0hFQUQoem9tYmllcyk7CiAJc3RydWN0IGxpc3RfaGVhZAkqcHRtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpwbnh0OwogCWtzb2NrX3BlZXJfdCAgICAgICpwZWVyOwpAQCAtNTgzLDkgKzU4Myw5IEBACiAJfQogCiAJZm9yIChpID0gbG87IGkgPD0gaGk7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHB0bXAsIHBueHQsCisJCWxpc3RfZm9yX2VhY2hfc2FmZShwdG1wLCBwbnh0LAogCQkJCQkma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7Ci0JCQlwZWVyID0gbGlzdF9lbnRyeSAocHRtcCwga3NvY2tfcGVlcl90LCBrc25wX2xpc3QpOworCQkJcGVlciA9IGxpc3RfZW50cnkocHRtcCwga3NvY2tfcGVlcl90LCBrc25wX2xpc3QpOwogCiAJCQlpZiAocGVlci0+a3NucF9uaSAhPSBuaSkKIAkJCQljb250aW51ZTsKQEAgLTU5NiwxMiArNTk2LDEyIEBACiAKIAkJCWtzb2NrbmFsX3BlZXJfYWRkcmVmKHBlZXIpOyAgICAgLyogYSByZWYgZm9yIG1lLi4uICovCiAKLQkJCWtzb2NrbmFsX2RlbF9wZWVyX2xvY2tlZCAocGVlciwgaXApOworCQkJa3NvY2tuYWxfZGVsX3BlZXJfbG9ja2VkKHBlZXIsIGlwKTsKIAogCQkJaWYgKHBlZXItPmtzbnBfY2xvc2luZyAmJgogCQkJICAgICFsaXN0X2VtcHR5KCZwZWVyLT5rc25wX3R4X3F1ZXVlKSkgewotCQkJCUxBU1NFUlQgKGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfY29ubnMpKTsKLQkJCQlMQVNTRVJUIChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX3JvdXRlcykpOworCQkJCUxBU1NFUlQobGlzdF9lbXB0eSgmcGVlci0+a3NucF9jb25ucykpOworCQkJCUxBU1NFUlQobGlzdF9lbXB0eSgmcGVlci0+a3NucF9yb3V0ZXMpKTsKIAogCQkJCWxpc3Rfc3BsaWNlX2luaXQoJnBlZXItPmtzbnBfdHhfcXVldWUsCiAJCQkJCQkgICAgICZ6b21iaWVzKTsKQEAgLTYyMSw3ICs2MjEsNyBAQAogfQogCiBzdGF0aWMga3NvY2tfY29ubl90ICoKLWtzb2NrbmFsX2dldF9jb25uX2J5X2lkeCAobG5ldF9uaV90ICpuaSwgaW50IGluZGV4KQora3NvY2tuYWxfZ2V0X2Nvbm5fYnlfaWR4KGxuZXRfbmlfdCAqbmksIGludCBpbmRleCkKIHsKIAlrc29ja19wZWVyX3QgICAgICAqcGVlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSpwdG1wOwpAQCAtNjMyLDE5ICs2MzIsMTkgQEAKIAlyZWFkX2xvY2soJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwga3NvY2tuYWxfZGF0YS5rc25kX3BlZXJfaGFzaF9zaXplOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaCAocHRtcCwgJmtzb2NrbmFsX2RhdGEua3NuZF9wZWVyc1tpXSkgewotCQkJcGVlciA9IGxpc3RfZW50cnkgKHB0bXAsIGtzb2NrX3BlZXJfdCwga3NucF9saXN0KTsKKwkJbGlzdF9mb3JfZWFjaChwdG1wLCAma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7CisJCQlwZWVyID0gbGlzdF9lbnRyeShwdG1wLCBrc29ja19wZWVyX3QsIGtzbnBfbGlzdCk7CiAKLQkJCUxBU1NFUlQgKCFwZWVyLT5rc25wX2Nsb3NpbmcpOworCQkJTEFTU0VSVCghcGVlci0+a3NucF9jbG9zaW5nKTsKIAogCQkJaWYgKHBlZXItPmtzbnBfbmkgIT0gbmkpCiAJCQkJY29udGludWU7CiAKLQkJCWxpc3RfZm9yX2VhY2ggKGN0bXAsICZwZWVyLT5rc25wX2Nvbm5zKSB7CisJCQlsaXN0X2Zvcl9lYWNoKGN0bXAsICZwZWVyLT5rc25wX2Nvbm5zKSB7CiAJCQkJaWYgKGluZGV4LS0gPiAwKQogCQkJCQljb250aW51ZTsKIAotCQkJCWNvbm4gPSBsaXN0X2VudHJ5IChjdG1wLCBrc29ja19jb25uX3QsCisJCQkJY29ubiA9IGxpc3RfZW50cnkoY3RtcCwga3NvY2tfY29ubl90LAogCQkJCQkJICAgICAgIGtzbmNfbGlzdCk7CiAJCQkJa3NvY2tuYWxfY29ubl9hZGRyZWYoY29ubik7CiAJCQkJcmVhZF91bmxvY2soJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jayk7CkBAIC02ODEsNyArNjgxLDcgQEAKIH0KIAogc3RhdGljIGludAota3NvY2tuYWxfbG9jYWxfaXB2ZWMgKGxuZXRfbmlfdCAqbmksIF9fdTMyICppcGFkZHJzKQora3NvY2tuYWxfbG9jYWxfaXB2ZWMobG5ldF9uaV90ICpuaSwgX191MzIgKmlwYWRkcnMpCiB7CiAJa3NvY2tfbmV0X3QgICAgICAgKm5ldCA9IG5pLT5uaV9kYXRhOwogCWludAkJaTsKQEAgLTY5MCw3ICs2OTAsNyBAQAogCXJlYWRfbG9jaygma3NvY2tuYWxfZGF0YS5rc25kX2dsb2JhbF9sb2NrKTsKIAogCW5pcCA9IG5ldC0+a3Nubl9uaW50ZXJmYWNlczsKLQlMQVNTRVJUIChuaXAgPD0gTE5FVF9NQVhfSU5URVJGQUNFUyk7CisJTEFTU0VSVChuaXAgPD0gTE5FVF9NQVhfSU5URVJGQUNFUyk7CiAKIAkvKiBPbmx5IG9mZmVyIGludGVyZmFjZXMgZm9yIGFkZGl0aW9uYWwgY29ubmVjdGlvbnMgaWYgSSBoYXZlCiAJICogbW9yZSB0aGFuIG9uZS4gKi8KQEAgLTcwMSw3ICs3MDEsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IG5pcDsgaSsrKSB7CiAJCWlwYWRkcnNbaV0gPSBuZXQtPmtzbm5faW50ZXJmYWNlc1tpXS5rc25pX2lwYWRkcjsKLQkJTEFTU0VSVCAoaXBhZGRyc1tpXSAhPSAwKTsKKwkJTEFTU0VSVChpcGFkZHJzW2ldICE9IDApOwogCX0KIAogCXJlYWRfdW5sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwpAQCAtNzA5LDcgKzcwOSw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWtzb2NrbmFsX21hdGNoX3BlZXJpcCAoa3NvY2tfaW50ZXJmYWNlX3QgKmlmYWNlLCBfX3UzMiAqaXBzLCBpbnQgbmlwcykKK2tzb2NrbmFsX21hdGNoX3BlZXJpcChrc29ja19pbnRlcmZhY2VfdCAqaWZhY2UsIF9fdTMyICppcHMsIGludCBuaXBzKQogewogCWludCAgIGJlc3RfbmV0bWF0Y2ggPSAwOwogCWludCAgIGJlc3RfeG9yICAgICAgPSAwOwpAQCAtNzIyLDcgKzcyMiw3IEBACiAJCWlmIChpcHNbaV0gPT0gMCkKIAkJCWNvbnRpbnVlOwogCi0JCXRoaXNfeG9yID0gKGlwc1tpXSBeIGlmYWNlLT5rc25pX2lwYWRkcik7CisJCXRoaXNfeG9yID0gaXBzW2ldIF4gaWZhY2UtPmtzbmlfaXBhZGRyOwogCQl0aGlzX25ldG1hdGNoID0gKCh0aGlzX3hvciAmIGlmYWNlLT5rc25pX25ldG1hc2spID09IDApID8gMSA6IDA7CiAKIAkJaWYgKCEoYmVzdCA8IDAgfHwKQEAgLTczNiw3ICs3MzYsNyBAQAogCQliZXN0X3hvciA9IHRoaXNfeG9yOwogCX0KIAotCUxBU1NFUlQgKGJlc3QgPj0gMCk7CisJTEFTU0VSVChiZXN0ID49IDApOwogCXJldHVybiBiZXN0OwogfQogCkBAIC03NjcsOCArNzY3LDggQEAKIAogCXdyaXRlX2xvY2tfYmgoZ2xvYmFsX2xvY2spOwogCi0JTEFTU0VSVCAobl9wZWVyaXBzIDw9IExORVRfTUFYX0lOVEVSRkFDRVMpOwotCUxBU1NFUlQgKG5ldC0+a3Nubl9uaW50ZXJmYWNlcyA8PSBMTkVUX01BWF9JTlRFUkZBQ0VTKTsKKwlMQVNTRVJUKG5fcGVlcmlwcyA8PSBMTkVUX01BWF9JTlRFUkZBQ0VTKTsKKwlMQVNTRVJUKG5ldC0+a3Nubl9uaW50ZXJmYWNlcyA8PSBMTkVUX01BWF9JTlRFUkZBQ0VTKTsKIAogCS8qIE9ubHkgbWF0Y2ggaW50ZXJmYWNlcyBmb3IgYWRkaXRpb25hbCBjb25uZWN0aW9ucwogCSAqIGlmIEkgaGF2ZSA+IDEgaW50ZXJmYWNlICovCkBAIC03OTEsNyArNzkxLDcgQEAKIAogCQl9IGVsc2UgewogCQkJLyogY2hvb3NlIGEgbmV3IGludGVyZmFjZSAqLwotCQkJTEFTU0VSVCAoaSA9PSBwZWVyLT5rc25wX25fcGFzc2l2ZV9pcHMpOworCQkJTEFTU0VSVChpID09IHBlZXItPmtzbnBfbl9wYXNzaXZlX2lwcyk7CiAKIAkJCWJlc3RfaWZhY2UgPSBOVUxMOwogCQkJYmVzdF9uZXRtYXRjaCA9IDA7CkBAIC04MDksNyArODA5LDcgQEAKIAkJCQkJY29udGludWU7CiAKIAkJCQlrID0ga3NvY2tuYWxfbWF0Y2hfcGVlcmlwKGlmYWNlLCBwZWVyaXBzLCBuX3BlZXJpcHMpOwotCQkJCXhvciA9IChpcCBeIHBlZXJpcHNba10pOworCQkJCXhvciA9IGlwIF4gcGVlcmlwc1trXTsKIAkJCQl0aGlzX25ldG1hdGNoID0gKCh4b3IgJiBpZmFjZS0+a3NuaV9uZXRtYXNrKSA9PSAwKSA/IDEgOiAwOwogCiAJCQkJaWYgKCEoYmVzdF9pZmFjZSA9PSBOVUxMIHx8CkBAIC04NzQsNyArODc0LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCUxBU1NFUlQgKG5wZWVyX2lwYWRkcnMgPD0gTE5FVF9NQVhfSU5URVJGQUNFUyk7CisJTEFTU0VSVChucGVlcl9pcGFkZHJzIDw9IExORVRfTUFYX0lOVEVSRkFDRVMpOwogCiAJZm9yIChpID0gMDsgaSA8IG5wZWVyX2lwYWRkcnM7IGkrKykgewogCQlpZiAobmV3cm91dGUgIT0gTlVMTCkgewpAQCAtOTExLDcgKzkxMSw3IEBACiAJCWJlc3RfbnJvdXRlcyA9IDA7CiAJCWJlc3RfbmV0bWF0Y2ggPSAwOwogCi0JCUxBU1NFUlQgKG5ldC0+a3Nubl9uaW50ZXJmYWNlcyA8PSBMTkVUX01BWF9JTlRFUkZBQ0VTKTsKKwkJTEFTU0VSVChuZXQtPmtzbm5fbmludGVyZmFjZXMgPD0gTE5FVF9NQVhfSU5URVJGQUNFUyk7CiAKIAkJLyogU2VsZWN0IGludGVyZmFjZSB0byBjb25uZWN0IGZyb20gKi8KIAkJZm9yIChqID0gMDsgaiA8IG5ldC0+a3Nubl9uaW50ZXJmYWNlczsgaisrKSB7CkBAIC05NjEsNyArOTYxLDcgQEAKIH0KIAogaW50Ci1rc29ja25hbF9hY2NlcHQgKGxuZXRfbmlfdCAqbmksIHN0cnVjdCBzb2NrZXQgKnNvY2spCitrc29ja25hbF9hY2NlcHQobG5ldF9uaV90ICpuaSwgc3RydWN0IHNvY2tldCAqc29jaykKIHsKIAlrc29ja19jb25ucmVxX3QgICAgKmNyOwogCWludAkJIHJjOwpAQCAtOTY5LDcgKzk2OSw3IEBACiAJaW50CQkgcGVlcl9wb3J0OwogCiAJcmMgPSBsaWJjZnNfc29ja19nZXRhZGRyKHNvY2ssIDEsICZwZWVyX2lwLCAmcGVlcl9wb3J0KTsKLQlMQVNTRVJUIChyYyA9PSAwKTsJCSAgICAgIC8qIHdlIHN1Y2NlZWRlZCBiZWZvcmUgKi8KKwlMQVNTRVJUKHJjID09IDApOwkJICAgICAgLyogd2Ugc3VjY2VlZGVkIGJlZm9yZSAqLwogCiAJTElCQ0ZTX0FMTE9DKGNyLCBzaXplb2YoKmNyKSk7CiAJaWYgKGNyID09IE5VTEwpIHsKQEAgLTk5MiwxMSArOTkyLDExIEBACiB9CiAKIHN0YXRpYyBpbnQKLWtzb2NrbmFsX2Nvbm5lY3RpbmcgKGtzb2NrX3BlZXJfdCAqcGVlciwgX191MzIgaXBhZGRyKQora3NvY2tuYWxfY29ubmVjdGluZyhrc29ja19wZWVyX3QgKnBlZXIsIF9fdTMyIGlwYWRkcikKIHsKIAlrc29ja19yb3V0ZV90ICAgKnJvdXRlOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAocm91dGUsICZwZWVyLT5rc25wX3JvdXRlcywga3Nucl9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyb3V0ZSwgJnBlZXItPmtzbnBfcm91dGVzLCBrc25yX2xpc3QpIHsKIAogCQlpZiAocm91dGUtPmtzbnJfaXBhZGRyID09IGlwYWRkcikKIAkJCXJldHVybiByb3V0ZS0+a3Nucl9jb25uZWN0aW5nOwpAQCAtMTAwNSwxMSArMTAwNSwxMSBAQAogfQogCiBpbnQKLWtzb2NrbmFsX2NyZWF0ZV9jb25uIChsbmV0X25pX3QgKm5pLCBrc29ja19yb3V0ZV90ICpyb3V0ZSwKK2tzb2NrbmFsX2NyZWF0ZV9jb25uKGxuZXRfbmlfdCAqbmksIGtzb2NrX3JvdXRlX3QgKnJvdXRlLAogCQkgICAgICBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgdHlwZSkKIHsKIAlyd2xvY2tfdAkJKmdsb2JhbF9sb2NrID0gJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jazsKLQlMSVNUX0hFQUQgICAgICh6b21iaWVzKTsKKwlMSVNUX0hFQUQoem9tYmllcyk7CiAJbG5ldF9wcm9jZXNzX2lkX3QgIHBlZXJpZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSp0bXA7CiAJX191NjQJICAgICAgaW5jYXJuYXRpb247CkBAIC0xMDI4LDcgKzEwMjgsNyBAQAogCiAJYWN0aXZlID0gKHJvdXRlICE9IE5VTEwpOwogCi0JTEFTU0VSVCAoYWN0aXZlID09ICh0eXBlICE9IFNPQ0tMTkRfQ09OTl9OT05FKSk7CisJTEFTU0VSVChhY3RpdmUgPT0gKHR5cGUgIT0gU09DS0xORF9DT05OX05PTkUpKTsKIAogCUxJQkNGU19BTExPQyhjb25uLCBzaXplb2YoKmNvbm4pKTsKIAlpZiAoY29ubiA9PSBOVUxMKSB7CkBAIC0xMDQxLDE5ICsxMDQxLDE5IEBACiAJY29ubi0+a3NuY19zb2NrID0gc29jazsKIAkvKiAyIHJlZiwgMSBmb3IgY29ubiwgYW5vdGhlciBleHRyYSByZWYgcHJldmVudHMgc29ja2V0CiAJICogYmVpbmcgY2xvc2VkIGJlZm9yZSBlc3RhYmxpc2htZW50IG9mIGNvbm5lY3Rpb24gKi8KLQlhdG9taWNfc2V0ICgmY29ubi0+a3NuY19zb2NrX3JlZmNvdW50LCAyKTsKKwlhdG9taWNfc2V0KCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQsIDIpOwogCWNvbm4tPmtzbmNfdHlwZSA9IHR5cGU7CiAJa3NvY2tuYWxfbGliX3NhdmVfY2FsbGJhY2soc29jaywgY29ubik7Ci0JYXRvbWljX3NldCAoJmNvbm4tPmtzbmNfY29ubl9yZWZjb3VudCwgMSk7IC8qIDEgcmVmIGZvciBtZSAqLworCWF0b21pY19zZXQoJmNvbm4tPmtzbmNfY29ubl9yZWZjb3VudCwgMSk7IC8qIDEgcmVmIGZvciBtZSAqLwogCiAJY29ubi0+a3NuY19yeF9yZWFkeSA9IDA7CiAJY29ubi0+a3NuY19yeF9zY2hlZHVsZWQgPSAwOwogCi0JSU5JVF9MSVNUX0hFQUQgKCZjb25uLT5rc25jX3R4X3F1ZXVlKTsKKwlJTklUX0xJU1RfSEVBRCgmY29ubi0+a3NuY190eF9xdWV1ZSk7CiAJY29ubi0+a3NuY190eF9yZWFkeSA9IDA7CiAJY29ubi0+a3NuY190eF9zY2hlZHVsZWQgPSAwOwogCWNvbm4tPmtzbmNfdHhfY2FycmllciA9IE5VTEw7Ci0JYXRvbWljX3NldCAoJmNvbm4tPmtzbmNfdHhfbm9iLCAwKTsKKwlhdG9taWNfc2V0KCZjb25uLT5rc25jX3R4X25vYiwgMCk7CiAKIAlMSUJDRlNfQUxMT0MoaGVsbG8sIG9mZnNldG9mKGtzb2NrX2hlbGxvX21zZ190LAogCQkJCSAgICAga3NobV9pcHNbTE5FVF9NQVhfSU5URVJGQUNFU10pKTsKQEAgLTEwNjMsNyArMTA2Myw3IEBACiAJfQogCiAJLyogc3Rhc2ggY29ubidzIGxvY2FsIGFuZCByZW1vdGUgYWRkcnMgKi8KLQlyYyA9IGtzb2NrbmFsX2xpYl9nZXRfY29ubl9hZGRycyAoY29ubik7CisJcmMgPSBrc29ja25hbF9saWJfZ2V0X2Nvbm5fYWRkcnMoY29ubik7CiAJaWYgKHJjICE9IDApCiAJCWdvdG8gZmFpbGVkXzE7CiAKQEAgLTEwOTQsNyArMTA5NCw3IEBACiAjZW5kaWYKIAkJfQogCi0JCXJjID0ga3NvY2tuYWxfc2VuZF9oZWxsbyAobmksIGNvbm4sIHBlZXJpZC5uaWQsIGhlbGxvKTsKKwkJcmMgPSBrc29ja25hbF9zZW5kX2hlbGxvKG5pLCBjb25uLCBwZWVyaWQubmlkLCBoZWxsbyk7CiAJCWlmIChyYyAhPSAwKQogCQkJZ290byBmYWlsZWRfMTsKIAl9IGVsc2UgewpAQCAtMTEwNSwxMyArMTEwNSwxMyBAQAogCQljb25uLT5rc25jX3Byb3RvID0gTlVMTDsKIAl9CiAKLQlyYyA9IGtzb2NrbmFsX3JlY3ZfaGVsbG8gKG5pLCBjb25uLCBoZWxsbywgJnBlZXJpZCwgJmluY2FybmF0aW9uKTsKKwlyYyA9IGtzb2NrbmFsX3JlY3ZfaGVsbG8obmksIGNvbm4sIGhlbGxvLCAmcGVlcmlkLCAmaW5jYXJuYXRpb24pOwogCWlmIChyYyA8IDApCiAJCWdvdG8gZmFpbGVkXzE7CiAKLQlMQVNTRVJUIChyYyA9PSAwIHx8IGFjdGl2ZSk7Ci0JTEFTU0VSVCAoY29ubi0+a3NuY19wcm90byAhPSBOVUxMKTsKLQlMQVNTRVJUIChwZWVyaWQubmlkICE9IExORVRfTklEX0FOWSk7CisJTEFTU0VSVChyYyA9PSAwIHx8IGFjdGl2ZSk7CisJTEFTU0VSVChjb25uLT5rc25jX3Byb3RvICE9IE5VTEwpOworCUxBU1NFUlQocGVlcmlkLm5pZCAhPSBMTkVUX05JRF9BTlkpOwogCiAJY3B0ID0gbG5ldF9jcHRfb2ZfbmlkKHBlZXJpZC5uaWQpOwogCkBAIC0xMTI2LDcgKzExMjYsNyBAQAogCQl3cml0ZV9sb2NrX2JoKGdsb2JhbF9sb2NrKTsKIAogCQkvKiBjYWxsZWQgd2l0aCBhIHJlZiBvbiBuaSwgc28gc2h1dGRvd24gY2FuJ3QgaGF2ZSBzdGFydGVkICovCi0JCUxBU1NFUlQgKCgoa3NvY2tfbmV0X3QgKikgbmktPm5pX2RhdGEpLT5rc25uX3NodXRkb3duID09IDApOworCQlMQVNTRVJUKCgoa3NvY2tfbmV0X3QgKikgbmktPm5pX2RhdGEpLT5rc25uX3NodXRkb3duID09IDApOwogCiAJCXBlZXIyID0ga3NvY2tuYWxfZmluZF9wZWVyX2xvY2tlZChuaSwgcGVlcmlkKTsKIAkJaWYgKHBlZXIyID09IE5VTEwpIHsKQEAgLTExNjYsNyArMTE2Niw3IEBACiAJCSAqIE5CIHJlY3ZfaGVsbG8gbWF5IGhhdmUgcmV0dXJuZWQgRVBST1RPIHRvIHNpZ25hbCBteSBwZWVyCiAJCSAqIHdhbnRzIGEgZGlmZmVyZW50IHByb3RvY29sIHRoYW4gdGhlIG9uZSBJIGFza2VkIGZvci4KIAkJICovCi0JCUxBU1NFUlQgKGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfY29ubnMpKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX2Nvbm5zKSk7CiAKIAkJcGVlci0+a3NucF9wcm90byA9IGNvbm4tPmtzbmNfcHJvdG87CiAJCXBlZXItPmtzbnBfaW5jYXJuYXRpb24gPSBpbmNhcm5hdGlvbjsKQEAgLTEyMTEsNyArMTIxMSw3IEBACiAKIAkJCS8qIFJlcGx5IG9uIGEgcGFzc2l2ZSBjb25uZWN0aW9uIGF0dGVtcHQgc28gdGhlIHBlZXIKIAkJCSAqIHJlYWxpc2VzIHdlJ3JlIGNvbm5lY3RlZC4gKi8KLQkJCUxBU1NFUlQgKHJjID09IDApOworCQkJTEFTU0VSVChyYyA9PSAwKTsKIAkJCWlmICghYWN0aXZlKQogCQkJCXJjID0gRUFMUkVBRFk7CiAKQEAgLTEyMzUsNyArMTIzNSw3IEBACiAJICogY3JlYXRlIGFuIGFzc29jaWF0aW9uLiAgVGhpcyBhbGxvd3MgaW5jb21pbmcgY29ubmVjdGlvbnMgY3JlYXRlZAogCSAqIGJ5IHJvdXRlcyBpbiBteSBwZWVyIHRvIG1hdGNoIG15IG93biByb3V0ZSBlbnRyaWVzIHNvIEkgZG9uJ3QKIAkgKiBjb250aW51YWxseSBjcmVhdGUgZHVwbGljYXRlIHJvdXRlcy4gKi8KLQlsaXN0X2Zvcl9lYWNoICh0bXAsICZwZWVyLT5rc25wX3JvdXRlcykgeworCWxpc3RfZm9yX2VhY2godG1wLCAmcGVlci0+a3NucF9yb3V0ZXMpIHsKIAkJcm91dGUgPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfcm91dGVfdCwga3Nucl9saXN0KTsKIAogCQlpZiAocm91dGUtPmtzbnJfaXBhZGRyICE9IGNvbm4tPmtzbmNfaXBhZGRyKQpAQCAtMTI2MCw3ICsxMjYwLDcgQEAKIAljb25uLT5rc25jX3R4X2RlYWRsaW5lID0gY2ZzX3RpbWVfc2hpZnQoKmtzb2NrbmFsX3R1bmFibGVzLmtzbmRfdGltZW91dCk7CiAJbWIoKTsgICAvKiBvcmRlciB3aXRoIGFkZGluZyB0byBwZWVyJ3MgY29ubiBsaXN0ICovCiAKLQlsaXN0X2FkZCAoJmNvbm4tPmtzbmNfbGlzdCwgJnBlZXItPmtzbnBfY29ubnMpOworCWxpc3RfYWRkKCZjb25uLT5rc25jX2xpc3QsICZwZWVyLT5rc25wX2Nvbm5zKTsKIAlrc29ja25hbF9jb25uX2FkZHJlZihjb25uKTsKIAogCWtzb2NrbmFsX25ld19wYWNrZXQoY29ubiwgMCk7CkBAIC0xMjcyLDggKzEyNzIsOCBAQAogCQlpZiAoY29ubi0+a3NuY19wcm90by0+cHJvX21hdGNoX3R4KGNvbm4sIHR4LCB0eC0+dHhfbm9uYmxrKSA9PSBTT0NLTkFMX01BVENIX05PKQogCQkJCWNvbnRpbnVlOwogCi0JCWxpc3RfZGVsICgmdHgtPnR4X2xpc3QpOwotCQlrc29ja25hbF9xdWV1ZV90eF9sb2NrZWQgKHR4LCBjb25uKTsKKwkJbGlzdF9kZWwoJnR4LT50eF9saXN0KTsKKwkJa3NvY2tuYWxfcXVldWVfdHhfbG9ja2VkKHR4LCBjb25uKTsKIAl9CiAKIAl3cml0ZV91bmxvY2tfYmgoZ2xvYmFsX2xvY2spOwpAQCAtMTM0Myw4ICsxMzQzLDggQEAKIAogIGZhaWxlZF8yOgogCWlmICghcGVlci0+a3NucF9jbG9zaW5nICYmCi0JICAgIGxpc3RfZW1wdHkgKCZwZWVyLT5rc25wX2Nvbm5zKSAmJgotCSAgICBsaXN0X2VtcHR5ICgmcGVlci0+a3NucF9yb3V0ZXMpKSB7CisJICAgIGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfY29ubnMpICYmCisJICAgIGxpc3RfZW1wdHkoJnBlZXItPmtzbnBfcm91dGVzKSkgewogCQlsaXN0X2FkZCgmem9tYmllcywgJnBlZXItPmtzbnBfdHhfcXVldWUpOwogCQlsaXN0X2RlbF9pbml0KCZwZWVyLT5rc25wX3R4X3F1ZXVlKTsKIAkJa3NvY2tuYWxfdW5saW5rX3BlZXJfbG9ja2VkKHBlZXIpOwpAQCAtMTM4Myw3ICsxMzgzLDcgQEAKIAkJTElCQ0ZTX0ZSRUUoaGVsbG8sIG9mZnNldG9mKGtzb2NrX2hlbGxvX21zZ190LAogCQkJCQkgICAga3NobV9pcHNbTE5FVF9NQVhfSU5URVJGQUNFU10pKTsKIAotCUxJQkNGU19GUkVFIChjb25uLCBzaXplb2YoKmNvbm4pKTsKKwlMSUJDRlNfRlJFRShjb25uLCBzaXplb2YoKmNvbm4pKTsKIAogIGZhaWxlZF8wOgogCWxpYmNmc19zb2NrX3JlbGVhc2Uoc29jayk7CkBAIC0xMzkxLDcgKzEzOTEsNyBAQAogfQogCiB2b2lkCi1rc29ja25hbF9jbG9zZV9jb25uX2xvY2tlZCAoa3NvY2tfY29ubl90ICpjb25uLCBpbnQgZXJyb3IpCitrc29ja25hbF9jbG9zZV9jb25uX2xvY2tlZChrc29ja19jb25uX3QgKmNvbm4sIGludCBlcnJvcikKIHsKIAkvKiBUaGlzIGp1c3QgZG9lcyB0aGUgaW1tbWVkaWF0ZSBob3VzZWtlZXBpbmcsIGFuZCBxdWV1ZXMgdGhlCiAJICogY29ubmVjdGlvbiBmb3IgdGhlIHJlYXBlciB0byB0ZXJtaW5hdGUuCkBAIC0xNDAxLDE4ICsxNDAxLDE4IEBACiAJa3NvY2tfY29ubl90ICAgICAgKmNvbm4yOwogCXN0cnVjdCBsaXN0X2hlYWQJKnRtcDsKIAotCUxBU1NFUlQgKHBlZXItPmtzbnBfZXJyb3IgPT0gMCk7Ci0JTEFTU0VSVCAoIWNvbm4tPmtzbmNfY2xvc2luZyk7CisJTEFTU0VSVChwZWVyLT5rc25wX2Vycm9yID09IDApOworCUxBU1NFUlQoIWNvbm4tPmtzbmNfY2xvc2luZyk7CiAJY29ubi0+a3NuY19jbG9zaW5nID0gMTsKIAogCS8qIGtzbmRfZGVhdGhyb3dfY29ubnMgdGFrZXMgb3ZlciBwZWVyJ3MgcmVmICovCi0JbGlzdF9kZWwgKCZjb25uLT5rc25jX2xpc3QpOworCWxpc3RfZGVsKCZjb25uLT5rc25jX2xpc3QpOwogCiAJcm91dGUgPSBjb25uLT5rc25jX3JvdXRlOwogCWlmIChyb3V0ZSAhPSBOVUxMKSB7CiAJCS8qIGRpc3NvY2lhdGUgY29ubiBmcm9tIHJvdXRlLi4uICovCi0JCUxBU1NFUlQgKCFyb3V0ZS0+a3Nucl9kZWxldGVkKTsKLQkJTEFTU0VSVCAoKHJvdXRlLT5rc25yX2Nvbm5lY3RlZCAmICgxIDw8IGNvbm4tPmtzbmNfdHlwZSkpICE9IDApOworCQlMQVNTRVJUKCFyb3V0ZS0+a3Nucl9kZWxldGVkKTsKKwkJTEFTU0VSVCgocm91dGUtPmtzbnJfY29ubmVjdGVkICYgKDEgPDwgY29ubi0+a3NuY190eXBlKSkgIT0gMCk7CiAKIAkJY29ubjIgPSBOVUxMOwogCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJnBlZXItPmtzbnBfY29ubnMpIHsKQEAgLTE0MzEsMTkgKzE0MzEsMTkgQEAKIAogI2lmIDAJICAgLyogaXJyZWxldmFudCB3aXRoIG9ubHkgZWFnZXIgcm91dGVzICovCiAJCS8qIG1ha2Ugcm91dGUgbGVhc3QgZmF2b3VyaXRlICovCi0JCWxpc3RfZGVsICgmcm91dGUtPmtzbnJfbGlzdCk7Ci0JCWxpc3RfYWRkX3RhaWwgKCZyb3V0ZS0+a3Nucl9saXN0LCAmcGVlci0+a3NucF9yb3V0ZXMpOworCQlsaXN0X2RlbCgmcm91dGUtPmtzbnJfbGlzdCk7CisJCWxpc3RfYWRkX3RhaWwoJnJvdXRlLT5rc25yX2xpc3QsICZwZWVyLT5rc25wX3JvdXRlcyk7CiAjZW5kaWYKIAkJa3NvY2tuYWxfcm91dGVfZGVjcmVmKHJvdXRlKTsgICAgIC8qIGRyb3AgY29ubidzIHJlZiBvbiByb3V0ZSAqLwogCX0KIAotCWlmIChsaXN0X2VtcHR5ICgmcGVlci0+a3NucF9jb25ucykpIHsKKwlpZiAobGlzdF9lbXB0eSgmcGVlci0+a3NucF9jb25ucykpIHsKIAkJLyogTm8gbW9yZSBjb25uZWN0aW9ucyB0byB0aGlzIHBlZXIgKi8KIAogCQlpZiAoIWxpc3RfZW1wdHkoJnBlZXItPmtzbnBfdHhfcXVldWUpKSB7CiAJCQlrc29ja190eF90ICp0eDsKIAotCQkJTEFTU0VSVCAoY29ubi0+a3NuY19wcm90byA9PSAma3NvY2tuYWxfcHJvdG9jb2xfdjN4KTsKKwkJCUxBU1NFUlQoY29ubi0+a3NuY19wcm90byA9PSAma3NvY2tuYWxfcHJvdG9jb2xfdjN4KTsKIAogCQkJLyogdGhyb3cgdGhlbSB0byB0aGUgbGFzdCBjb25uZWN0aW9uLi4uLAogCQkJICogdGhlc2UgVFhzIHdpbGwgYmUgc2VuZCB0byAvZGV2L251bGwgYnkgc2NoZWR1bGVyICovCkBAIC0xNDYwLDEwICsxNDYwLDEwIEBACiAJCXBlZXItPmtzbnBfcHJvdG8gPSBOVUxMOwkvKiByZW5lZ290aWF0ZSBwcm90b2NvbCB2ZXJzaW9uICovCiAJCXBlZXItPmtzbnBfZXJyb3IgPSBlcnJvcjsgICAgICAgLyogc3Rhc2ggbGFzdCBjb25uIGNsb3NlIHJlYXNvbiAqLwogCi0JCWlmIChsaXN0X2VtcHR5ICgmcGVlci0+a3NucF9yb3V0ZXMpKSB7CisJCWlmIChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX3JvdXRlcykpIHsKIAkJCS8qIEkndmUganVzdCBjbG9zZWQgbGFzdCBjb25uIGJlbG9uZ2luZyB0byBhCiAJCQkgKiBwZWVyIHdpdGggbm8gcm91dGVzIHRvIGl0ICovCi0JCQlrc29ja25hbF91bmxpbmtfcGVlcl9sb2NrZWQgKHBlZXIpOworCQkJa3NvY2tuYWxfdW5saW5rX3BlZXJfbG9ja2VkKHBlZXIpOwogCQl9CiAJfQogCkBAIC0xNDc3LDcgKzE0NzcsNyBAQAogfQogCiB2b2lkCi1rc29ja25hbF9wZWVyX2ZhaWxlZCAoa3NvY2tfcGVlcl90ICpwZWVyKQora3NvY2tuYWxfcGVlcl9mYWlsZWQoa3NvY2tfcGVlcl90ICpwZWVyKQogewogCWludAlub3RpZnkgPSAwOwogCXVuc2lnbmVkIGxvbmcgbGFzdF9hbGl2ZSA9IDA7CkBAIC0xNDk5LDcgKzE0OTksNyBAQAogCXJlYWRfdW5sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwogCiAJaWYgKG5vdGlmeSkKLQkJbG5ldF9ub3RpZnkgKHBlZXItPmtzbnBfbmksIHBlZXItPmtzbnBfaWQubmlkLCAwLAorCQlsbmV0X25vdGlmeShwZWVyLT5rc25wX25pLCBwZWVyLT5rc25wX2lkLm5pZCwgMCwKIAkJCSAgICAgbGFzdF9hbGl2ZSk7CiB9CiAKQEAgLTE1MDksMTEgKzE1MDksMTEgQEAKIAlrc29ja19wZWVyX3QgICAgICpwZWVyID0gY29ubi0+a3NuY19wZWVyOwogCWtzb2NrX3R4X3QgICAgICAgKnR4OwogCWtzb2NrX3R4X3QgICAgICAgKnRtcDsKLQlMSVNUX0hFQUQgICAgKHpsaXN0KTsKKwlMSVNUX0hFQUQoemxpc3QpOwogCiAJLyogTkIgc2FmZSB0byBmaW5hbGl6ZSBUWHMgYmVjYXVzZSBjbG9zaW5nIG9mIHNvY2tldCB3aWxsCiAJICogYWJvcnQgYWxsIGJ1ZmZlcmVkIGRhdGEgKi8KLQlMQVNTRVJUIChjb25uLT5rc25jX3NvY2sgPT0gTlVMTCk7CisJTEFTU0VSVChjb25uLT5rc25jX3NvY2sgPT0gTlVMTCk7CiAKIAlzcGluX2xvY2soJnBlZXItPmtzbnBfbG9jayk7CiAKQEAgLTE1MjEsNyArMTUyMSw3IEBACiAJCWlmICh0eC0+dHhfY29ubiAhPSBjb25uKQogCQkJY29udGludWU7CiAKLQkJTEFTU0VSVCAodHgtPnR4X21zZy5rc21femNfY29va2llc1swXSAhPSAwKTsKKwkJTEFTU0VSVCh0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzBdICE9IDApOwogCiAJCXR4LT50eF9tc2cua3NtX3pjX2Nvb2tpZXNbMF0gPSAwOwogCQl0eC0+dHhfemNfYWJvcnRlZCA9IDE7IC8qIG1hcmsgaXQgYXMgbm90LWFja2VkICovCkBAIC0xNTQwLDcgKzE1NDAsNyBAQAogfQogCiB2b2lkCi1rc29ja25hbF90ZXJtaW5hdGVfY29ubiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfdGVybWluYXRlX2Nvbm4oa3NvY2tfY29ubl90ICpjb25uKQogewogCS8qIFRoaXMgZ2V0cyBjYWxsZWQgYnkgdGhlIHJlYXBlciAoZ3VhcmFudGVlZCB0aHJlYWQgY29udGV4dCkgdG8KIAkgKiBkaXNlbmdhZ2UgdGhlIHNvY2tldCBmcm9tIGl0cyBjYWxsYmFja3MgYW5kIGNsb3NlIGl0LgpAQCAtMTU2MCwxMyArMTU2MCwxMyBAQAogCiAJaWYgKCFjb25uLT5rc25jX3R4X3NjaGVkdWxlZCAmJgogCSAgICAhbGlzdF9lbXB0eSgmY29ubi0+a3NuY190eF9xdWV1ZSkpIHsKLQkJbGlzdF9hZGRfdGFpbCAoJmNvbm4tPmtzbmNfdHhfbGlzdCwKKwkJbGlzdF9hZGRfdGFpbCgmY29ubi0+a3NuY190eF9saXN0LAogCQkJICAgICAgICZzY2hlZC0+a3NzX3R4X2Nvbm5zKTsKIAkJY29ubi0+a3NuY190eF9zY2hlZHVsZWQgPSAxOwogCQkvKiBleHRyYSByZWYgZm9yIHNjaGVkdWxlciAqLwogCQlrc29ja25hbF9jb25uX2FkZHJlZihjb25uKTsKIAotCQl3YWtlX3VwICgmc2NoZWQtPmtzc193YWl0cSk7CisJCXdha2VfdXAoJnNjaGVkLT5rc3Nfd2FpdHEpOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZzY2hlZC0+a3NzX2xvY2spOwpAQCAtMTU4Miw3ICsxNTgyLDcgQEAKIAogCWlmIChwZWVyLT5rc25wX2Vycm9yICE9IDApIHsKIAkJLyogcGVlcidzIGxhc3QgY29ubiBjbG9zZWQgaW4gZXJyb3IgKi8KLQkJTEFTU0VSVCAobGlzdF9lbXB0eSAoJnBlZXItPmtzbnBfY29ubnMpKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZwZWVyLT5rc25wX2Nvbm5zKSk7CiAJCWZhaWxlZCA9IDE7CiAJCXBlZXItPmtzbnBfZXJyb3IgPSAwOyAgICAgLyogYXZvaWQgbXVsdGlwbGUgbm90aWZpY2F0aW9ucyAqLwogCX0KQEAgLTE2MDEsNyArMTYwMSw3IEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX3F1ZXVlX3pvbWJpZV9jb25uIChrc29ja19jb25uX3QgKmNvbm4pCitrc29ja25hbF9xdWV1ZV96b21iaWVfY29ubihrc29ja19jb25uX3QgKmNvbm4pCiB7CiAJLyogUXVldWUgdGhlIGNvbm4gZm9yIHRoZSByZWFwZXIgdG8gZGVzdHJveSAqLwogCkBAIC0xNjE1LDIwICsxNjE1LDIwIEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX2Rlc3Ryb3lfY29ubiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfZGVzdHJveV9jb25uKGtzb2NrX2Nvbm5fdCAqY29ubikKIHsKIAl1bnNpZ25lZCBsb25nICAgICAgbGFzdF9yY3Y7CiAKIAkvKiBGaW5hbCBjb3VwLWRlLWdyYWNlIG9mIHRoZSByZWFwZXIgKi8KLQlDREVCVUcgKERfTkVULCAiY29ubmVjdGlvbiAlcFxuIiwgY29ubik7CisJQ0RFQlVHKERfTkVULCAiY29ubmVjdGlvbiAlcFxuIiwgY29ubik7CiAKLQlMQVNTRVJUIChhdG9taWNfcmVhZCAoJmNvbm4tPmtzbmNfY29ubl9yZWZjb3VudCkgPT0gMCk7Ci0JTEFTU0VSVCAoYXRvbWljX3JlYWQgKCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQpID09IDApOwotCUxBU1NFUlQgKGNvbm4tPmtzbmNfc29jayA9PSBOVUxMKTsKLQlMQVNTRVJUIChjb25uLT5rc25jX3JvdXRlID09IE5VTEwpOwotCUxBU1NFUlQgKCFjb25uLT5rc25jX3R4X3NjaGVkdWxlZCk7Ci0JTEFTU0VSVCAoIWNvbm4tPmtzbmNfcnhfc2NoZWR1bGVkKTsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZjb25uLT5rc25jX3R4X3F1ZXVlKSk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmY29ubi0+a3NuY19jb25uX3JlZmNvdW50KSA9PSAwKTsKKwlMQVNTRVJUKGF0b21pY19yZWFkKCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQpID09IDApOworCUxBU1NFUlQoY29ubi0+a3NuY19zb2NrID09IE5VTEwpOworCUxBU1NFUlQoY29ubi0+a3NuY19yb3V0ZSA9PSBOVUxMKTsKKwlMQVNTRVJUKCFjb25uLT5rc25jX3R4X3NjaGVkdWxlZCk7CisJTEFTU0VSVCghY29ubi0+a3NuY19yeF9zY2hlZHVsZWQpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmY29ubi0+a3NuY190eF9xdWV1ZSkpOwogCiAJLyogY29tcGxldGUgY3VycmVudCByZWNlaXZlIGlmIGFueSAqLwogCXN3aXRjaCAoY29ubi0+a3NuY19yeF9zdGF0ZSkgewpAQCAtMTY0MSw3ICsxNjQxLDcgQEAKIAkJICAgICAgIGNvbm4tPmtzbmNfcnhfbm9iX3dhbnRlZCwgY29ubi0+a3NuY19yeF9ub2JfbGVmdCwKIAkJICAgICAgIGNmc19kdXJhdGlvbl9zZWMoY2ZzX3RpbWVfc3ViKGNmc190aW1lX2N1cnJlbnQoKSwKIAkJCQkJCSAgICAgbGFzdF9yY3YpKSk7Ci0JCWxuZXRfZmluYWxpemUgKGNvbm4tPmtzbmNfcGVlci0+a3NucF9uaSwKKwkJbG5ldF9maW5hbGl6ZShjb25uLT5rc25jX3BlZXItPmtzbnBfbmksCiAJCQkgICAgICAgY29ubi0+a3NuY19jb29raWUsIC1FSU8pOwogCQlicmVhazsKIAljYXNlIFNPQ0tOQUxfUlhfTE5FVF9IRUFERVI6CkBAIC0xNjY1LDMwICsxNjY1LDMwIEBACiAJCQkgICAgICAgJmNvbm4tPmtzbmNfaXBhZGRyLCBjb25uLT5rc25jX3BvcnQpOwogCSAgICAgICBicmVhazsKIAlkZWZhdWx0OgotCQlMQlVHICgpOworCQlMQlVHKCk7CiAJCWJyZWFrOwogCX0KIAogCWtzb2NrbmFsX3BlZXJfZGVjcmVmKGNvbm4tPmtzbmNfcGVlcik7CiAKLQlMSUJDRlNfRlJFRSAoY29ubiwgc2l6ZW9mICgqY29ubikpOworCUxJQkNGU19GUkVFKGNvbm4sIHNpemVvZigqY29ubikpOwogfQogCiBpbnQKLWtzb2NrbmFsX2Nsb3NlX3BlZXJfY29ubnNfbG9ja2VkIChrc29ja19wZWVyX3QgKnBlZXIsIF9fdTMyIGlwYWRkciwgaW50IHdoeSkKK2tzb2NrbmFsX2Nsb3NlX3BlZXJfY29ubnNfbG9ja2VkKGtzb2NrX3BlZXJfdCAqcGVlciwgX191MzIgaXBhZGRyLCBpbnQgd2h5KQogewogCWtzb2NrX2Nvbm5fdCAgICAgICAqY29ubjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAqY3RtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAqY254dDsKIAlpbnQJCSBjb3VudCA9IDA7CiAKLQlsaXN0X2Zvcl9lYWNoX3NhZmUgKGN0bXAsIGNueHQsICZwZWVyLT5rc25wX2Nvbm5zKSB7Ci0JCWNvbm4gPSBsaXN0X2VudHJ5IChjdG1wLCBrc29ja19jb25uX3QsIGtzbmNfbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGN0bXAsIGNueHQsICZwZWVyLT5rc25wX2Nvbm5zKSB7CisJCWNvbm4gPSBsaXN0X2VudHJ5KGN0bXAsIGtzb2NrX2Nvbm5fdCwga3NuY19saXN0KTsKIAogCQlpZiAoaXBhZGRyID09IDAgfHwKIAkJICAgIGNvbm4tPmtzbmNfaXBhZGRyID09IGlwYWRkcikgewogCQkJY291bnQrKzsKLQkJCWtzb2NrbmFsX2Nsb3NlX2Nvbm5fbG9ja2VkIChjb25uLCB3aHkpOworCQkJa3NvY2tuYWxfY2xvc2VfY29ubl9sb2NrZWQoY29ubiwgd2h5KTsKIAkJfQogCX0KIApAQCAtMTY5Niw3ICsxNjk2LDcgQEAKIH0KIAogaW50Ci1rc29ja25hbF9jbG9zZV9jb25uX2FuZF9zaWJsaW5ncyAoa3NvY2tfY29ubl90ICpjb25uLCBpbnQgd2h5KQora3NvY2tuYWxfY2xvc2VfY29ubl9hbmRfc2libGluZ3Moa3NvY2tfY29ubl90ICpjb25uLCBpbnQgd2h5KQogewogCWtzb2NrX3BlZXJfdCAgICAgKnBlZXIgPSBjb25uLT5rc25jX3BlZXI7CiAJX191MzIJICAgICBpcGFkZHIgPSBjb25uLT5rc25jX2lwYWRkcjsKQEAgLTE3MDQsNyArMTcwNCw3IEBACiAKIAl3cml0ZV9sb2NrX2JoKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwogCi0JY291bnQgPSBrc29ja25hbF9jbG9zZV9wZWVyX2Nvbm5zX2xvY2tlZCAocGVlciwgaXBhZGRyLCB3aHkpOworCWNvdW50ID0ga3NvY2tuYWxfY2xvc2VfcGVlcl9jb25uc19sb2NrZWQocGVlciwgaXBhZGRyLCB3aHkpOwogCiAJd3JpdGVfdW5sb2NrX2JoKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwogCkBAIC0xNzEyLDcgKzE3MTIsNyBAQAogfQogCiBpbnQKLWtzb2NrbmFsX2Nsb3NlX21hdGNoaW5nX2Nvbm5zIChsbmV0X3Byb2Nlc3NfaWRfdCBpZCwgX191MzIgaXBhZGRyKQora3NvY2tuYWxfY2xvc2VfbWF0Y2hpbmdfY29ubnMobG5ldF9wcm9jZXNzX2lkX3QgaWQsIF9fdTMyIGlwYWRkcikKIHsKIAlrc29ja19wZWVyX3QgICAgICAgKnBlZXI7CiAJc3RydWN0IGxpc3RfaGVhZAkgKnB0bXA7CkBAIC0xNzMyLDE2ICsxNzMyLDE2IEBACiAJfQogCiAJZm9yIChpID0gbG87IGkgPD0gaGk7IGkrKykgewotCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKHB0bXAsIHBueHQsCisJCWxpc3RfZm9yX2VhY2hfc2FmZShwdG1wLCBwbnh0LAogCQkJCQkma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7CiAKLQkJCXBlZXIgPSBsaXN0X2VudHJ5IChwdG1wLCBrc29ja19wZWVyX3QsIGtzbnBfbGlzdCk7CisJCQlwZWVyID0gbGlzdF9lbnRyeShwdG1wLCBrc29ja19wZWVyX3QsIGtzbnBfbGlzdCk7CiAKIAkJCWlmICghKChpZC5uaWQgPT0gTE5FVF9OSURfQU5ZIHx8IGlkLm5pZCA9PSBwZWVyLT5rc25wX2lkLm5pZCkgJiYKIAkJCSAgICAgIChpZC5waWQgPT0gTE5FVF9QSURfQU5ZIHx8IGlkLnBpZCA9PSBwZWVyLT5rc25wX2lkLnBpZCkpKQogCQkJCWNvbnRpbnVlOwogCi0JCQljb3VudCArPSBrc29ja25hbF9jbG9zZV9wZWVyX2Nvbm5zX2xvY2tlZCAocGVlciwgaXBhZGRyLCAwKTsKKwkJCWNvdW50ICs9IGtzb2NrbmFsX2Nsb3NlX3BlZXJfY29ubnNfbG9ja2VkKHBlZXIsIGlwYWRkciwgMCk7CiAJCX0KIAl9CiAKQEAgLTE3NTgsNyArMTc1OCw3IEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX25vdGlmeSAobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBnd19uaWQsIGludCBhbGl2ZSkKK2tzb2NrbmFsX25vdGlmeShsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IGd3X25pZCwgaW50IGFsaXZlKQogewogCS8qIFRoZSByb3V0ZXIgaXMgdGVsbGluZyBtZSBzaGUncyBiZWVuIG5vdGlmaWVkIG9mIGEgY2hhbmdlIGluCiAJICogZ2F0ZXdheSBzdGF0ZS4uLi4gKi8KQEAgLTE3NjcsMTIgKzE3NjcsMTIgQEAKIAlpZC5uaWQgPSBnd19uaWQ7CiAJaWQucGlkID0gTE5FVF9QSURfQU5ZOwogCi0JQ0RFQlVHIChEX05FVCwgImd3ICVzICVzXG4iLCBsaWJjZnNfbmlkMnN0cihnd19uaWQpLAorCUNERUJVRyhEX05FVCwgImd3ICVzICVzXG4iLCBsaWJjZnNfbmlkMnN0cihnd19uaWQpLAogCQlhbGl2ZSA/ICJ1cCIgOiAiZG93biIpOwogCiAJaWYgKCFhbGl2ZSkgewogCQkvKiBJZiB0aGUgZ2F0ZXdheSBjcmFzaGVkLCBjbG9zZSBhbGwgb3BlbiBjb25uZWN0aW9ucy4uLiAqLwotCQlrc29ja25hbF9jbG9zZV9tYXRjaGluZ19jb25ucyAoaWQsIDApOworCQlrc29ja25hbF9jbG9zZV9tYXRjaGluZ19jb25ucyhpZCwgMCk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTE3ODEsNyArMTc4MSw3IEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX3F1ZXJ5IChsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCwgdW5zaWduZWQgbG9uZyAqd2hlbikKK2tzb2NrbmFsX3F1ZXJ5KGxuZXRfbmlfdCAqbmksIGxuZXRfbmlkX3QgbmlkLCB1bnNpZ25lZCBsb25nICp3aGVuKQogewogCWludAkJY29ubmVjdCA9IDE7CiAJdW5zaWduZWQgbG9uZwkgbGFzdF9hbGl2ZSA9IDA7CkBAIC0xNzk4LDcgKzE3OTgsNyBAQAogCQlrc29ja19jb25uX3QgICAgICpjb25uOwogCQlpbnQJICAgICAgIGJ1Zm5vYjsKIAotCQlsaXN0X2Zvcl9lYWNoICh0bXAsICZwZWVyLT5rc25wX2Nvbm5zKSB7CisJCWxpc3RfZm9yX2VhY2godG1wLCAmcGVlci0+a3NucF9jb25ucykgewogCQkJY29ubiA9IGxpc3RfZW50cnkodG1wLCBrc29ja19jb25uX3QsIGtzbmNfbGlzdCk7CiAJCQlidWZub2IgPSBjb25uLT5rc25jX3NvY2stPnNrLT5za193bWVtX3F1ZXVlZDsKIApAQCAtMTg0Miw3ICsxODQyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLWtzb2NrbmFsX3B1c2hfcGVlciAoa3NvY2tfcGVlcl90ICpwZWVyKQora3NvY2tuYWxfcHVzaF9wZWVyKGtzb2NrX3BlZXJfdCAqcGVlcikKIHsKIAlpbnQJICAgICAgIGluZGV4OwogCWludAkgICAgICAgaTsKQEAgLTE4NTUsOSArMTg1NSw5IEBACiAJCWkgPSAwOwogCQljb25uID0gTlVMTDsKIAotCQlsaXN0X2Zvcl9lYWNoICh0bXAsICZwZWVyLT5rc25wX2Nvbm5zKSB7CisJCWxpc3RfZm9yX2VhY2godG1wLCAmcGVlci0+a3NucF9jb25ucykgewogCQkJaWYgKGkrKyA9PSBpbmRleCkgewotCQkJCWNvbm4gPSBsaXN0X2VudHJ5ICh0bXAsIGtzb2NrX2Nvbm5fdCwKKwkJCQljb25uID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX2Nvbm5fdCwKIAkJCQkJCSAgICAgICBrc25jX2xpc3QpOwogCQkJCWtzb2NrbmFsX2Nvbm5fYWRkcmVmKGNvbm4pOwogCQkJCWJyZWFrOwpAQCAtMTg2OSwxMyArMTg2OSwxMyBAQAogCQlpZiAoY29ubiA9PSBOVUxMKQogCQkJYnJlYWs7CiAKLQkJa3NvY2tuYWxfbGliX3B1c2hfY29ubiAoY29ubik7CisJCWtzb2NrbmFsX2xpYl9wdXNoX2Nvbm4oY29ubik7CiAJCWtzb2NrbmFsX2Nvbm5fZGVjcmVmKGNvbm4pOwogCX0KIH0KIAogc3RhdGljIGludAota3NvY2tuYWxfcHVzaCAobG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpCitrc29ja25hbF9wdXNoKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKQogewogCWtzb2NrX3BlZXJfdCAgICAgICpwZWVyOwogCXN0cnVjdCBsaXN0X2hlYWQJKnRtcDsKQEAgLTE4OTEsNyArMTg5MSw3IEBACiAJCQlpbmRleCA9IDA7CiAJCQlwZWVyID0gTlVMTDsKIAotCQkJbGlzdF9mb3JfZWFjaCAodG1wLCAma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7CisJCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmtzb2NrbmFsX2RhdGEua3NuZF9wZWVyc1tpXSkgewogCQkJCXBlZXIgPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfcGVlcl90LAogCQkJCQkJICAgICAga3NucF9saXN0KTsKIApAQCAtMTkxMyw3ICsxOTEzLDcgQEAKIAogCQkJaWYgKHBlZXIgIT0gTlVMTCkgewogCQkJCXJjID0gMDsKLQkJCQlrc29ja25hbF9wdXNoX3BlZXIgKHBlZXIpOworCQkJCWtzb2NrbmFsX3B1c2hfcGVlcihwZWVyKTsKIAkJCQlrc29ja25hbF9wZWVyX2RlY3JlZihwZWVyKTsKIAkJCX0KIAkJfQpAQCAtMjAwNSw3ICsyMDA1LDcgQEAKIAkJfQogCiAJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgbnh0LCAmcGVlci0+a3NucF9yb3V0ZXMpIHsKLQkJcm91dGUgPSBsaXN0X2VudHJ5ICh0bXAsIGtzb2NrX3JvdXRlX3QsIGtzbnJfbGlzdCk7CisJCXJvdXRlID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX3JvdXRlX3QsIGtzbnJfbGlzdCk7CiAKIAkJaWYgKHJvdXRlLT5rc25yX215aXBhZGRyICE9IGlwYWRkcikKIAkJCWNvbnRpbnVlOwpAQCAtMjAyMiw3ICsyMDIyLDcgQEAKIAkJY29ubiA9IGxpc3RfZW50cnkodG1wLCBrc29ja19jb25uX3QsIGtzbmNfbGlzdCk7CiAKIAkJaWYgKGNvbm4tPmtzbmNfbXlpcGFkZHIgPT0gaXBhZGRyKQotCQkJa3NvY2tuYWxfY2xvc2VfY29ubl9sb2NrZWQgKGNvbm4sIDApOworCQkJa3NvY2tuYWxfY2xvc2VfY29ubl9sb2NrZWQoY29ubiwgMCk7CiAJfQogfQogCkBAIC0yMTM5LDIxICsyMTM5LDIxIEBACiAJY2FzZSBJT0NfTElCQ0ZTX0FERF9QRUVSOgogCQlpZC5uaWQgPSBkYXRhLT5pb2NfbmlkOwogCQlpZC5waWQgPSBMVVNUUkVfU1JWX0xORVRfUElEOwotCQlyZXR1cm4ga3NvY2tuYWxfYWRkX3BlZXIgKG5pLCBpZCwKKwkJcmV0dXJuIGtzb2NrbmFsX2FkZF9wZWVyKG5pLCBpZCwKIAkJCQkJICBkYXRhLT5pb2NfdTMyWzBdLCAvKiBJUCAqLwogCQkJCQkgIGRhdGEtPmlvY191MzJbMV0pOyAvKiBwb3J0ICovCiAKIAljYXNlIElPQ19MSUJDRlNfREVMX1BFRVI6CiAJCWlkLm5pZCA9IGRhdGEtPmlvY19uaWQ7CiAJCWlkLnBpZCA9IExORVRfUElEX0FOWTsKLQkJcmV0dXJuIGtzb2NrbmFsX2RlbF9wZWVyIChuaSwgaWQsCisJCXJldHVybiBrc29ja25hbF9kZWxfcGVlcihuaSwgaWQsCiAJCQkJCSAgZGF0YS0+aW9jX3UzMlswXSk7IC8qIElQICovCiAKIAljYXNlIElPQ19MSUJDRlNfR0VUX0NPTk46IHsKIAkJaW50CSAgIHR4bWVtOwogCQlpbnQJICAgcnhtZW07CiAJCWludAkgICBuYWdsZTsKLQkJa3NvY2tfY29ubl90ICpjb25uID0ga3NvY2tuYWxfZ2V0X2Nvbm5fYnlfaWR4IChuaSwgZGF0YS0+aW9jX2NvdW50KTsKKwkJa3NvY2tfY29ubl90ICpjb25uID0ga3NvY2tuYWxfZ2V0X2Nvbm5fYnlfaWR4KG5pLCBkYXRhLT5pb2NfY291bnQpOwogCiAJCWlmIChjb25uID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT0VOVDsKQEAgLTIxNzcsNyArMjE3Nyw3IEBACiAJY2FzZSBJT0NfTElCQ0ZTX0NMT1NFX0NPTk5FQ1RJT046CiAJCWlkLm5pZCA9IGRhdGEtPmlvY19uaWQ7CiAJCWlkLnBpZCA9IExORVRfUElEX0FOWTsKLQkJcmV0dXJuIGtzb2NrbmFsX2Nsb3NlX21hdGNoaW5nX2Nvbm5zIChpZCwKKwkJcmV0dXJuIGtzb2NrbmFsX2Nsb3NlX21hdGNoaW5nX2Nvbm5zKGlkLAogCQkJCQkJICAgICAgZGF0YS0+aW9jX3UzMlswXSk7CiAKIAljYXNlIElPQ19MSUJDRlNfUkVHSVNURVJfTVlOSUQ6CkBAIC0yMjAyLDkgKzIyMDIsOSBAQAogfQogCiBzdGF0aWMgdm9pZAota3NvY2tuYWxfZnJlZV9idWZmZXJzICh2b2lkKQora3NvY2tuYWxfZnJlZV9idWZmZXJzKHZvaWQpCiB7Ci0JTEFTU0VSVCAoYXRvbWljX3JlYWQoJmtzb2NrbmFsX2RhdGEua3NuZF9uYWN0aXZlX3R4cykgPT0gMCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgma3NvY2tuYWxfZGF0YS5rc25kX25hY3RpdmVfdHhzKSA9PSAwKTsKIAogCWlmIChrc29ja25hbF9kYXRhLmtzbmRfc2NoZWRfaW5mbyAhPSBOVUxMKSB7CiAJCXN0cnVjdCBrc29ja19zY2hlZF9pbmZvCSppbmZvOwpAQCAtMjIyMCw4ICsyMjIwLDggQEAKIAkJY2ZzX3BlcmNwdF9mcmVlKGtzb2NrbmFsX2RhdGEua3NuZF9zY2hlZF9pbmZvKTsKIAl9CiAKLQlMSUJDRlNfRlJFRSAoa3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzLAotCQkgICAgIHNpemVvZiAoc3RydWN0IGxpc3RfaGVhZCkgKgorCUxJQkNGU19GUkVFKGtzb2NrbmFsX2RhdGEua3NuZF9wZWVycywKKwkJICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKgogCQkgICAgIGtzb2NrbmFsX2RhdGEua3NuZF9wZWVyX2hhc2hfc2l6ZSk7CiAKIAlzcGluX2xvY2soJmtzb2NrbmFsX2RhdGEua3NuZF90eF9sb2NrKTsKQEAgLTIyNTMsMjUgKzIyNTMsMjUgQEAKIAlpbnQJCQlqOwogCiAJQ0RFQlVHKERfTUFMTE9DLCAiYmVmb3JlIE5BTCBjbGVhbnVwOiBrbWVtICVkXG4iLAotCSAgICAgICBhdG9taWNfcmVhZCAoJmxpYmNmc19rbWVtb3J5KSk7Ci0JTEFTU0VSVCAoa3NvY2tuYWxfZGF0YS5rc25kX25uZXRzID09IDApOworCSAgICAgICBhdG9taWNfcmVhZCgmbGliY2ZzX2ttZW1vcnkpKTsKKwlMQVNTRVJUKGtzb2NrbmFsX2RhdGEua3NuZF9ubmV0cyA9PSAwKTsKIAogCXN3aXRjaCAoa3NvY2tuYWxfZGF0YS5rc25kX2luaXQpIHsKIAlkZWZhdWx0OgotCQlMQVNTRVJUICgwKTsKKwkJTEFTU0VSVCgwKTsKIAogCWNhc2UgU09DS05BTF9JTklUX0FMTDoKIAljYXNlIFNPQ0tOQUxfSU5JVF9EQVRBOgotCQlMQVNTRVJUIChrc29ja25hbF9kYXRhLmtzbmRfcGVlcnMgIT0gTlVMTCk7CisJCUxBU1NFUlQoa3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzICE9IE5VTEwpOwogCQlmb3IgKGkgPSAwOyBpIDwga3NvY2tuYWxfZGF0YS5rc25kX3BlZXJfaGFzaF9zaXplOyBpKyspIHsKLQkJCUxBU1NFUlQgKGxpc3RfZW1wdHkgKCZrc29ja25hbF9kYXRhLmtzbmRfcGVlcnNbaV0pKTsKKwkJCUxBU1NFUlQobGlzdF9lbXB0eSgma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSk7CiAJCX0KIAogCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmtzb2NrbmFsX2RhdGEua3NuZF9uZXRzKSk7Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkgKCZrc29ja25hbF9kYXRhLmtzbmRfZW5vbWVtX2Nvbm5zKSk7Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkgKCZrc29ja25hbF9kYXRhLmtzbmRfem9tYmllX2Nvbm5zKSk7Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkgKCZrc29ja25hbF9kYXRhLmtzbmRfY29ubmRfY29ubnJlcXMpKTsKLQkJTEFTU0VSVCAobGlzdF9lbXB0eSAoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF9yb3V0ZXMpKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZrc29ja25hbF9kYXRhLmtzbmRfZW5vbWVtX2Nvbm5zKSk7CisJCUxBU1NFUlQobGlzdF9lbXB0eSgma3NvY2tuYWxfZGF0YS5rc25kX3pvbWJpZV9jb25ucykpOworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF9jb25ucmVxcykpOworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF9yb3V0ZXMpKTsKIAogCQlpZiAoa3NvY2tuYWxfZGF0YS5rc25kX3NjaGVkX2luZm8gIT0gTlVMTCkgewogCQkJY2ZzX3BlcmNwdF9mb3JfZWFjaChpbmZvLCBpLApAQCAtMjMzMiwxMyArMjMzMiwxMyBAQAogCX0KIAogCUNERUJVRyhEX01BTExPQywgImFmdGVyIE5BTCBjbGVhbnVwOiBrbWVtICVkXG4iLAotCSAgICAgICBhdG9taWNfcmVhZCAoJmxpYmNmc19rbWVtb3J5KSk7CisJICAgICAgIGF0b21pY19yZWFkKCZsaWJjZnNfa21lbW9yeSkpOwogCiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CiAKIHN0YXRpYyBfX3U2NAota3NvY2tuYWxfbmV3X2luY2FybmF0aW9uICh2b2lkKQora3NvY2tuYWxfbmV3X2luY2FybmF0aW9uKHZvaWQpCiB7CiAKIAkvKiBUaGUgaW5jYXJuYXRpb24gbnVtYmVyIGlzIHRoZSB0aW1lIHRoaXMgbW9kdWxlIGxvYWRlZCBhbmQgaXQKQEAgLTIzNTQsMTQgKzIzNTQsMTQgQEAKIAlpbnQJCQlyYzsKIAlpbnQJCQlpOwogCi0JTEFTU0VSVCAoa3NvY2tuYWxfZGF0YS5rc25kX2luaXQgPT0gU09DS05BTF9JTklUX05PVEhJTkcpOwotCUxBU1NFUlQgKGtzb2NrbmFsX2RhdGEua3NuZF9ubmV0cyA9PSAwKTsKKwlMQVNTRVJUKGtzb2NrbmFsX2RhdGEua3NuZF9pbml0ID09IFNPQ0tOQUxfSU5JVF9OT1RISU5HKTsKKwlMQVNTRVJUKGtzb2NrbmFsX2RhdGEua3NuZF9ubmV0cyA9PSAwKTsKIAotCW1lbXNldCAoJmtzb2NrbmFsX2RhdGEsIDAsIHNpemVvZiAoa3NvY2tuYWxfZGF0YSkpOyAvKiB6ZXJvIHBvaW50ZXJzICovCisJbWVtc2V0KCZrc29ja25hbF9kYXRhLCAwLCBzaXplb2Yoa3NvY2tuYWxfZGF0YSkpOyAvKiB6ZXJvIHBvaW50ZXJzICovCiAKIAlrc29ja25hbF9kYXRhLmtzbmRfcGVlcl9oYXNoX3NpemUgPSBTT0NLTkFMX1BFRVJfSEFTSF9TSVpFOwotCUxJQkNGU19BTExPQyAoa3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzLAotCQkgICAgICBzaXplb2YgKHN0cnVjdCBsaXN0X2hlYWQpICoKKwlMSUJDRlNfQUxMT0Moa3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzLAorCQkgICAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKgogCQkgICAgICBrc29ja25hbF9kYXRhLmtzbmRfcGVlcl9oYXNoX3NpemUpOwogCWlmIChrc29ja25hbF9kYXRhLmtzbmRfcGVlcnMgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yMzczLDE4ICsyMzczLDE4IEBACiAJSU5JVF9MSVNUX0hFQUQoJmtzb2NrbmFsX2RhdGEua3NuZF9uZXRzKTsKIAogCXNwaW5fbG9ja19pbml0KCZrc29ja25hbF9kYXRhLmtzbmRfcmVhcGVyX2xvY2spOwotCUlOSVRfTElTVF9IRUFEICgma3NvY2tuYWxfZGF0YS5rc25kX2Vub21lbV9jb25ucyk7Ci0JSU5JVF9MSVNUX0hFQUQgKCZrc29ja25hbF9kYXRhLmtzbmRfem9tYmllX2Nvbm5zKTsKLQlJTklUX0xJU1RfSEVBRCAoJmtzb2NrbmFsX2RhdGEua3NuZF9kZWF0aHJvd19jb25ucyk7CisJSU5JVF9MSVNUX0hFQUQoJmtzb2NrbmFsX2RhdGEua3NuZF9lbm9tZW1fY29ubnMpOworCUlOSVRfTElTVF9IRUFEKCZrc29ja25hbF9kYXRhLmtzbmRfem9tYmllX2Nvbm5zKTsKKwlJTklUX0xJU1RfSEVBRCgma3NvY2tuYWxfZGF0YS5rc25kX2RlYXRocm93X2Nvbm5zKTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZrc29ja25hbF9kYXRhLmtzbmRfcmVhcGVyX3dhaXRxKTsKIAogCXNwaW5fbG9ja19pbml0KCZrc29ja25hbF9kYXRhLmtzbmRfY29ubmRfbG9jayk7Ci0JSU5JVF9MSVNUX0hFQUQgKCZrc29ja25hbF9kYXRhLmtzbmRfY29ubmRfY29ubnJlcXMpOwotCUlOSVRfTElTVF9IRUFEICgma3NvY2tuYWxfZGF0YS5rc25kX2Nvbm5kX3JvdXRlcyk7CisJSU5JVF9MSVNUX0hFQUQoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF9jb25ucmVxcyk7CisJSU5JVF9MSVNUX0hFQUQoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF9yb3V0ZXMpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmtzb2NrbmFsX2RhdGEua3NuZF9jb25uZF93YWl0cSk7CiAKIAlzcGluX2xvY2tfaW5pdCgma3NvY2tuYWxfZGF0YS5rc25kX3R4X2xvY2spOwotCUlOSVRfTElTVF9IRUFEICgma3NvY2tuYWxfZGF0YS5rc25kX2lkbGVfbm9vcF90eHMpOworCUlOSVRfTElTVF9IRUFEKCZrc29ja25hbF9kYXRhLmtzbmRfaWRsZV9ub29wX3R4cyk7CiAKIAkvKiBOQiBtZW1zZXQgYWJvdmUgemVyb3Mgd2hvbGUgb2Yga3NvY2tuYWxfZGF0YSAqLwogCkBAIC0yNDY1LDcgKzI0NjUsNyBAQAogCiAJcmMgPSBrc29ja25hbF90aHJlYWRfc3RhcnQoa3NvY2tuYWxfcmVhcGVyLCBOVUxMLCAic29ja25hbF9yZWFwZXIiKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJDYW4ndCBzcGF3biBzb2NrbmFsIHJlYXBlcjogJWRcbiIsIHJjKTsKKwkJQ0VSUk9SKCJDYW4ndCBzcGF3biBzb2NrbmFsIHJlYXBlcjogJWRcbiIsIHJjKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC0yNDgwLDcgKzI0ODAsNyBAQAogfQogCiBzdGF0aWMgdm9pZAota3NvY2tuYWxfZGVidWdfcGVlcmhhc2ggKGxuZXRfbmlfdCAqbmkpCitrc29ja25hbF9kZWJ1Z19wZWVyaGFzaChsbmV0X25pX3QgKm5pKQogewogCWtzb2NrX3BlZXJfdAkqcGVlciA9IE5VTEw7CiAJc3RydWN0IGxpc3RfaGVhZAkqdG1wOwpAQCAtMjQ4OSw4ICsyNDg5LDggQEAKIAlyZWFkX2xvY2soJmtzb2NrbmFsX2RhdGEua3NuZF9nbG9iYWxfbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwga3NvY2tuYWxfZGF0YS5rc25kX3BlZXJfaGFzaF9zaXplOyBpKyspIHsKLQkJbGlzdF9mb3JfZWFjaCAodG1wLCAma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7Ci0JCQlwZWVyID0gbGlzdF9lbnRyeSAodG1wLCBrc29ja19wZWVyX3QsIGtzbnBfbGlzdCk7CisJCWxpc3RfZm9yX2VhY2godG1wLCAma3NvY2tuYWxfZGF0YS5rc25kX3BlZXJzW2ldKSB7CisJCQlwZWVyID0gbGlzdF9lbnRyeSh0bXAsIGtzb2NrX3BlZXJfdCwga3NucF9saXN0KTsKIAogCQkJaWYgKHBlZXItPmtzbnBfbmkgPT0gbmkpCiAJCQkJYnJlYWs7CkBAIC0yNTEyLDcgKzI1MTIsNyBAQAogCQkgICAgICAhbGlzdF9lbXB0eSgmcGVlci0+a3NucF90eF9xdWV1ZSksCiAJCSAgICAgICFsaXN0X2VtcHR5KCZwZWVyLT5rc25wX3pjX3JlcV9saXN0KSk7CiAKLQkJbGlzdF9mb3JfZWFjaCAodG1wLCAmcGVlci0+a3NucF9yb3V0ZXMpIHsKKwkJbGlzdF9mb3JfZWFjaCh0bXAsICZwZWVyLT5rc25wX3JvdXRlcykgewogCQkJcm91dGUgPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfcm91dGVfdCwga3Nucl9saXN0KTsKIAkJCUNXQVJOKCJSb3V0ZTogcmVmICVkLCBzY2hkICVkLCBjb25uICVkLCBjbnRlZCAlZCwgZGVsICVkXG4iLAogCQkJICAgICAgYXRvbWljX3JlYWQoJnJvdXRlLT5rc25yX3JlZmNvdW50KSwKQEAgLTI1MjAsOSArMjUyMCw5IEBACiAJCQkgICAgICByb3V0ZS0+a3Nucl9jb25uZWN0ZWQsIHJvdXRlLT5rc25yX2RlbGV0ZWQpOwogCQl9CiAKLQkJbGlzdF9mb3JfZWFjaCAodG1wLCAmcGVlci0+a3NucF9jb25ucykgeworCQlsaXN0X2Zvcl9lYWNoKHRtcCwgJnBlZXItPmtzbnBfY29ubnMpIHsKIAkJCWNvbm4gPSBsaXN0X2VudHJ5KHRtcCwga3NvY2tfY29ubl90LCBrc25jX2xpc3QpOwotCQkJQ1dBUk4gKCJDb25uOiByZWYgJWQsIHNyZWYgJWQsIHQgJWQsIGMgJWRcbiIsCisJCQlDV0FSTigiQ29ubjogcmVmICVkLCBzcmVmICVkLCB0ICVkLCBjICVkXG4iLAogCQkJICAgICAgIGF0b21pY19yZWFkKCZjb25uLT5rc25jX2Nvbm5fcmVmY291bnQpLAogCQkJICAgICAgIGF0b21pY19yZWFkKCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQpLAogCQkJICAgICAgIGNvbm4tPmtzbmNfdHlwZSwgY29ubi0+a3NuY19jbG9zaW5nKTsKQEAgLTI1MzQsNyArMjUzNCw3IEBACiB9CiAKIHZvaWQKLWtzb2NrbmFsX3NodXRkb3duIChsbmV0X25pX3QgKm5pKQora3NvY2tuYWxfc2h1dGRvd24obG5ldF9uaV90ICpuaSkKIHsKIAlrc29ja19uZXRfdCAgICAgICpuZXQgPSBuaS0+bmlfZGF0YTsKIAlpbnQJICAgICAgIGk7CkBAIC0yNTczLDggKzI1NzMsOCBAQAogCXNwaW5fdW5sb2NrX2JoKCZuZXQtPmtzbm5fbG9jayk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbmV0LT5rc25uX25pbnRlcmZhY2VzOyBpKyspIHsKLQkJTEFTU0VSVCAobmV0LT5rc25uX2ludGVyZmFjZXNbaV0ua3NuaV9ucGVlcnMgPT0gMCk7Ci0JCUxBU1NFUlQgKG5ldC0+a3Nubl9pbnRlcmZhY2VzW2ldLmtzbmlfbnJvdXRlcyA9PSAwKTsKKwkJTEFTU0VSVChuZXQtPmtzbm5faW50ZXJmYWNlc1tpXS5rc25pX25wZWVycyA9PSAwKTsKKwkJTEFTU0VSVChuZXQtPmtzbm5faW50ZXJmYWNlc1tpXS5rc25pX25yb3V0ZXMgPT0gMCk7CiAJfQogCiAJbGlzdF9kZWwoJm5ldC0+a3Nubl9saXN0KTsKQEAgLTI3NTcsMTMgKzI3NTcsMTMgQEAKIH0KIAogaW50Ci1rc29ja25hbF9zdGFydHVwIChsbmV0X25pX3QgKm5pKQora3NvY2tuYWxfc3RhcnR1cChsbmV0X25pX3QgKm5pKQogewogCWtzb2NrX25ldF90ICAqbmV0OwogCWludAkgICByYzsKIAlpbnQJICAgaTsKIAotCUxBU1NFUlQgKG5pLT5uaV9sbmQgPT0gJnRoZV9rc29ja2xuZCk7CisJTEFTU0VSVChuaS0+bmlfbG5kID09ICZ0aGVfa3NvY2tsbmQpOwogCiAJaWYgKGtzb2NrbmFsX2RhdGEua3NuZF9pbml0ID09IFNPQ0tOQUxfSU5JVF9OT1RISU5HKSB7CiAJCXJjID0ga3NvY2tuYWxfYmFzZV9zdGFydHVwKCk7CkBAIC0yODQzLDE5ICsyODQzLDE5IEBACiAKIAogc3RhdGljIHZvaWQgX19leGl0Ci1rc29ja25hbF9tb2R1bGVfZmluaSAodm9pZCkKK2tzb2NrbmFsX21vZHVsZV9maW5pKHZvaWQpCiB7CiAJbG5ldF91bnJlZ2lzdGVyX2xuZCgmdGhlX2tzb2NrbG5kKTsKIH0KIAogc3RhdGljIGludCBfX2luaXQKLWtzb2NrbmFsX21vZHVsZV9pbml0ICh2b2lkKQora3NvY2tuYWxfbW9kdWxlX2luaXQodm9pZCkKIHsKIAlpbnQgICAgcmM7CiAKIAkvKiBjaGVjayBrc25yX2Nvbm5lY3RlZC9jb25uZWN0aW5nIGZpZWxkIGxhcmdlIGVub3VnaCAqLwotCUNMQVNTRVJUIChTT0NLTE5EX0NPTk5fTlRZUEVTIDw9IDQpOwotCUNMQVNTRVJUIChTT0NLTE5EX0NPTk5fQUNLID09IFNPQ0tMTkRfQ09OTl9CVUxLX0lOKTsKKwlDTEFTU0VSVChTT0NLTE5EX0NPTk5fTlRZUEVTIDw9IDQpOworCUNMQVNTRVJUKFNPQ0tMTkRfQ09OTl9BQ0sgPT0gU09DS0xORF9DT05OX0JVTEtfSU4pOwogCiAJLyogaW5pdGlhbGl6ZSB0aGVfa3NvY2tsbmQgKi8KIAl0aGVfa3NvY2tsbmQubG5kX3R5cGUgICAgID0gU09DS0xORDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmQuaAppbmRleCAwMzQ4OGQyLi5jNTRjOTk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZC5oCkBAIC00MDYsNyArNDA2LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbGlzdF9oZWFkICoKLWtzb2NrbmFsX25pZDJwZWVybGlzdCAobG5ldF9uaWRfdCBuaWQpCitrc29ja25hbF9uaWQycGVlcmxpc3QobG5ldF9uaWRfdCBuaWQpCiB7CiAJdW5zaWduZWQgaW50IGhhc2ggPSAoKHVuc2lnbmVkIGludCluaWQpICUga3NvY2tuYWxfZGF0YS5rc25kX3BlZXJfaGFzaF9zaXplOwogCkBAIC00MTQsMjUgKzQxNCwyNSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKLWtzb2NrbmFsX2Nvbm5fYWRkcmVmIChrc29ja19jb25uX3QgKmNvbm4pCitrc29ja25hbF9jb25uX2FkZHJlZihrc29ja19jb25uX3QgKmNvbm4pCiB7Ci0JTEFTU0VSVCAoYXRvbWljX3JlYWQoJmNvbm4tPmtzbmNfY29ubl9yZWZjb3VudCkgPiAwKTsKKwlMQVNTRVJUKGF0b21pY19yZWFkKCZjb25uLT5rc25jX2Nvbm5fcmVmY291bnQpID4gMCk7CiAJYXRvbWljX2luYygmY29ubi0+a3NuY19jb25uX3JlZmNvdW50KTsKIH0KIAotZXh0ZXJuIHZvaWQga3NvY2tuYWxfcXVldWVfem9tYmllX2Nvbm4gKGtzb2NrX2Nvbm5fdCAqY29ubik7CitleHRlcm4gdm9pZCBrc29ja25hbF9xdWV1ZV96b21iaWVfY29ubihrc29ja19jb25uX3QgKmNvbm4pOwogZXh0ZXJuIHZvaWQga3NvY2tuYWxfZmluYWxpemVfemNyZXEoa3NvY2tfY29ubl90ICpjb25uKTsKIAogc3RhdGljIGlubGluZSB2b2lkCi1rc29ja25hbF9jb25uX2RlY3JlZiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfY29ubl9kZWNyZWYoa3NvY2tfY29ubl90ICpjb25uKQogewotCUxBU1NFUlQgKGF0b21pY19yZWFkKCZjb25uLT5rc25jX2Nvbm5fcmVmY291bnQpID4gMCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmY29ubi0+a3NuY19jb25uX3JlZmNvdW50KSA+IDApOwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjb25uLT5rc25jX2Nvbm5fcmVmY291bnQpKQogCQlrc29ja25hbF9xdWV1ZV96b21iaWVfY29ubihjb25uKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLWtzb2NrbmFsX2Nvbm5zb2NrX2FkZHJlZiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfY29ubnNvY2tfYWRkcmVmKGtzb2NrX2Nvbm5fdCAqY29ubikKIHsKIAlpbnQgICByYyA9IC1FU0hVVERPV047CiAKQEAgLTQ0OCwxMSArNDQ4LDExIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAota3NvY2tuYWxfY29ubnNvY2tfZGVjcmVmIChrc29ja19jb25uX3QgKmNvbm4pCitrc29ja25hbF9jb25uc29ja19kZWNyZWYoa3NvY2tfY29ubl90ICpjb25uKQogewotCUxBU1NFUlQgKGF0b21pY19yZWFkKCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQpID4gMCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmY29ubi0+a3NuY19zb2NrX3JlZmNvdW50KSA+IDApOwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjb25uLT5rc25jX3NvY2tfcmVmY291bnQpKSB7Ci0JCUxBU1NFUlQgKGNvbm4tPmtzbmNfY2xvc2luZyk7CisJCUxBU1NFUlQoY29ubi0+a3NuY19jbG9zaW5nKTsKIAkJbGliY2ZzX3NvY2tfcmVsZWFzZShjb25uLT5rc25jX3NvY2spOwogCQljb25uLT5rc25jX3NvY2sgPSBOVUxMOwogCQlrc29ja25hbF9maW5hbGl6ZV96Y3JlcShjb25uKTsKQEAgLTQ2MCw2MSArNDYwLDYxIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAota3NvY2tuYWxfdHhfYWRkcmVmIChrc29ja190eF90ICp0eCkKK2tzb2NrbmFsX3R4X2FkZHJlZihrc29ja190eF90ICp0eCkKIHsKLQlMQVNTRVJUIChhdG9taWNfcmVhZCgmdHgtPnR4X3JlZmNvdW50KSA+IDApOworCUxBU1NFUlQoYXRvbWljX3JlYWQoJnR4LT50eF9yZWZjb3VudCkgPiAwKTsKIAlhdG9taWNfaW5jKCZ0eC0+dHhfcmVmY291bnQpOwogfQogCi1leHRlcm4gdm9pZCBrc29ja25hbF90eF9wcmVwIChrc29ja19jb25uX3QgKiwga3NvY2tfdHhfdCAqdHgpOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfdHhfZG9uZSAobG5ldF9uaV90ICpuaSwga3NvY2tfdHhfdCAqdHgpOworZXh0ZXJuIHZvaWQga3NvY2tuYWxfdHhfcHJlcChrc29ja19jb25uX3QgKiwga3NvY2tfdHhfdCAqdHgpOworZXh0ZXJuIHZvaWQga3NvY2tuYWxfdHhfZG9uZShsbmV0X25pX3QgKm5pLCBrc29ja190eF90ICp0eCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAota3NvY2tuYWxfdHhfZGVjcmVmIChrc29ja190eF90ICp0eCkKK2tzb2NrbmFsX3R4X2RlY3JlZihrc29ja190eF90ICp0eCkKIHsKLQlMQVNTRVJUIChhdG9taWNfcmVhZCgmdHgtPnR4X3JlZmNvdW50KSA+IDApOworCUxBU1NFUlQoYXRvbWljX3JlYWQoJnR4LT50eF9yZWZjb3VudCkgPiAwKTsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdHgtPnR4X3JlZmNvdW50KSkKIAkJa3NvY2tuYWxfdHhfZG9uZShOVUxMLCB0eCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAota3NvY2tuYWxfcm91dGVfYWRkcmVmIChrc29ja19yb3V0ZV90ICpyb3V0ZSkKK2tzb2NrbmFsX3JvdXRlX2FkZHJlZihrc29ja19yb3V0ZV90ICpyb3V0ZSkKIHsKLQlMQVNTRVJUIChhdG9taWNfcmVhZCgmcm91dGUtPmtzbnJfcmVmY291bnQpID4gMCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmcm91dGUtPmtzbnJfcmVmY291bnQpID4gMCk7CiAJYXRvbWljX2luYygmcm91dGUtPmtzbnJfcmVmY291bnQpOwogfQogCi1leHRlcm4gdm9pZCBrc29ja25hbF9kZXN0cm95X3JvdXRlIChrc29ja19yb3V0ZV90ICpyb3V0ZSk7CitleHRlcm4gdm9pZCBrc29ja25hbF9kZXN0cm95X3JvdXRlKGtzb2NrX3JvdXRlX3QgKnJvdXRlKTsKIAogc3RhdGljIGlubGluZSB2b2lkCi1rc29ja25hbF9yb3V0ZV9kZWNyZWYgKGtzb2NrX3JvdXRlX3QgKnJvdXRlKQora3NvY2tuYWxfcm91dGVfZGVjcmVmKGtzb2NrX3JvdXRlX3QgKnJvdXRlKQogewotCUxBU1NFUlQgKGF0b21pY19yZWFkICgmcm91dGUtPmtzbnJfcmVmY291bnQpID4gMCk7CisJTEFTU0VSVChhdG9taWNfcmVhZCgmcm91dGUtPmtzbnJfcmVmY291bnQpID4gMCk7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJvdXRlLT5rc25yX3JlZmNvdW50KSkKLQkJa3NvY2tuYWxfZGVzdHJveV9yb3V0ZSAocm91dGUpOworCQlrc29ja25hbF9kZXN0cm95X3JvdXRlKHJvdXRlKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1rc29ja25hbF9wZWVyX2FkZHJlZiAoa3NvY2tfcGVlcl90ICpwZWVyKQora3NvY2tuYWxfcGVlcl9hZGRyZWYoa3NvY2tfcGVlcl90ICpwZWVyKQogewotCUxBU1NFUlQgKGF0b21pY19yZWFkICgmcGVlci0+a3NucF9yZWZjb3VudCkgPiAwKTsKKwlMQVNTRVJUKGF0b21pY19yZWFkKCZwZWVyLT5rc25wX3JlZmNvdW50KSA+IDApOwogCWF0b21pY19pbmMoJnBlZXItPmtzbnBfcmVmY291bnQpOwogfQogCi1leHRlcm4gdm9pZCBrc29ja25hbF9kZXN0cm95X3BlZXIgKGtzb2NrX3BlZXJfdCAqcGVlcik7CitleHRlcm4gdm9pZCBrc29ja25hbF9kZXN0cm95X3BlZXIoa3NvY2tfcGVlcl90ICpwZWVyKTsKIAogc3RhdGljIGlubGluZSB2b2lkCi1rc29ja25hbF9wZWVyX2RlY3JlZiAoa3NvY2tfcGVlcl90ICpwZWVyKQora3NvY2tuYWxfcGVlcl9kZWNyZWYoa3NvY2tfcGVlcl90ICpwZWVyKQogewotCUxBU1NFUlQgKGF0b21pY19yZWFkICgmcGVlci0+a3NucF9yZWZjb3VudCkgPiAwKTsKKwlMQVNTRVJUKGF0b21pY19yZWFkKCZwZWVyLT5rc25wX3JlZmNvdW50KSA+IDApOwogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZwZWVyLT5rc25wX3JlZmNvdW50KSkKLQkJa3NvY2tuYWxfZGVzdHJveV9wZWVyIChwZWVyKTsKKwkJa3NvY2tuYWxfZGVzdHJveV9wZWVyKHBlZXIpOwogfQogCi1pbnQga3NvY2tuYWxfc3RhcnR1cCAobG5ldF9uaV90ICpuaSk7Ci12b2lkIGtzb2NrbmFsX3NodXRkb3duIChsbmV0X25pX3QgKm5pKTsKK2ludCBrc29ja25hbF9zdGFydHVwKGxuZXRfbmlfdCAqbmkpOwordm9pZCBrc29ja25hbF9zaHV0ZG93bihsbmV0X25pX3QgKm5pKTsKIGludCBrc29ja25hbF9jdGwobG5ldF9uaV90ICpuaSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqYXJnKTsKLWludCBrc29ja25hbF9zZW5kIChsbmV0X25pX3QgKm5pLCB2b2lkICpwcml2YXRlLCBsbmV0X21zZ190ICpsbnRtc2cpOworaW50IGtzb2NrbmFsX3NlbmQobG5ldF9uaV90ICpuaSwgdm9pZCAqcHJpdmF0ZSwgbG5ldF9tc2dfdCAqbG50bXNnKTsKIGludCBrc29ja25hbF9yZWN2KGxuZXRfbmlfdCAqbmksIHZvaWQgKnByaXZhdGUsIGxuZXRfbXNnX3QgKmxudG1zZywKIAkJICBpbnQgZGVsYXllZCwgdW5zaWduZWQgaW50IG5pb3YsCiAJCSAgc3RydWN0IGt2ZWMgKmlvdiwgbG5ldF9raW92X3QgKmtpb3YsCkBAIC01MjIsNDQgKzUyMiw0NCBAQAogaW50IGtzb2NrbmFsX2FjY2VwdChsbmV0X25pX3QgKm5pLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKIAogZXh0ZXJuIGludCBrc29ja25hbF9hZGRfcGVlcihsbmV0X25pX3QgKm5pLCBsbmV0X3Byb2Nlc3NfaWRfdCBpZCwgX191MzIgaXAsIGludCBwb3J0KTsKLWV4dGVybiBrc29ja19wZWVyX3QgKmtzb2NrbmFsX2ZpbmRfcGVlcl9sb2NrZWQgKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKTsKLWV4dGVybiBrc29ja19wZWVyX3QgKmtzb2NrbmFsX2ZpbmRfcGVlciAobG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfcGVlcl9mYWlsZWQgKGtzb2NrX3BlZXJfdCAqcGVlcik7Ci1leHRlcm4gaW50IGtzb2NrbmFsX2NyZWF0ZV9jb25uIChsbmV0X25pX3QgKm5pLCBrc29ja19yb3V0ZV90ICpyb3V0ZSwKK2V4dGVybiBrc29ja19wZWVyX3QgKmtzb2NrbmFsX2ZpbmRfcGVlcl9sb2NrZWQobG5ldF9uaV90ICpuaSwgbG5ldF9wcm9jZXNzX2lkX3QgaWQpOworZXh0ZXJuIGtzb2NrX3BlZXJfdCAqa3NvY2tuYWxfZmluZF9wZWVyKGxuZXRfbmlfdCAqbmksIGxuZXRfcHJvY2Vzc19pZF90IGlkKTsKK2V4dGVybiB2b2lkIGtzb2NrbmFsX3BlZXJfZmFpbGVkKGtzb2NrX3BlZXJfdCAqcGVlcik7CitleHRlcm4gaW50IGtzb2NrbmFsX2NyZWF0ZV9jb25uKGxuZXRfbmlfdCAqbmksIGtzb2NrX3JvdXRlX3QgKnJvdXRlLAogCQkJCSBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgdHlwZSk7Ci1leHRlcm4gdm9pZCBrc29ja25hbF9jbG9zZV9jb25uX2xvY2tlZCAoa3NvY2tfY29ubl90ICpjb25uLCBpbnQgd2h5KTsKLWV4dGVybiB2b2lkIGtzb2NrbmFsX3Rlcm1pbmF0ZV9jb25uIChrc29ja19jb25uX3QgKmNvbm4pOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfZGVzdHJveV9jb25uIChrc29ja19jb25uX3QgKmNvbm4pOwotZXh0ZXJuIGludCAga3NvY2tuYWxfY2xvc2VfcGVlcl9jb25uc19sb2NrZWQgKGtzb2NrX3BlZXJfdCAqcGVlciwKK2V4dGVybiB2b2lkIGtzb2NrbmFsX2Nsb3NlX2Nvbm5fbG9ja2VkKGtzb2NrX2Nvbm5fdCAqY29ubiwgaW50IHdoeSk7CitleHRlcm4gdm9pZCBrc29ja25hbF90ZXJtaW5hdGVfY29ubihrc29ja19jb25uX3QgKmNvbm4pOworZXh0ZXJuIHZvaWQga3NvY2tuYWxfZGVzdHJveV9jb25uKGtzb2NrX2Nvbm5fdCAqY29ubik7CitleHRlcm4gaW50ICBrc29ja25hbF9jbG9zZV9wZWVyX2Nvbm5zX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIsCiAJCQkJCSAgICAgIF9fdTMyIGlwYWRkciwgaW50IHdoeSk7Ci1leHRlcm4gaW50IGtzb2NrbmFsX2Nsb3NlX2Nvbm5fYW5kX3NpYmxpbmdzIChrc29ja19jb25uX3QgKmNvbm4sIGludCB3aHkpOwotZXh0ZXJuIGludCBrc29ja25hbF9jbG9zZV9tYXRjaGluZ19jb25ucyAobG5ldF9wcm9jZXNzX2lkX3QgaWQsIF9fdTMyIGlwYWRkcik7CitleHRlcm4gaW50IGtzb2NrbmFsX2Nsb3NlX2Nvbm5fYW5kX3NpYmxpbmdzKGtzb2NrX2Nvbm5fdCAqY29ubiwgaW50IHdoeSk7CitleHRlcm4gaW50IGtzb2NrbmFsX2Nsb3NlX21hdGNoaW5nX2Nvbm5zKGxuZXRfcHJvY2Vzc19pZF90IGlkLCBfX3UzMiBpcGFkZHIpOwogZXh0ZXJuIGtzb2NrX2Nvbm5fdCAqa3NvY2tuYWxfZmluZF9jb25uX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIsCiAJCQkJCSAgICAgICBrc29ja190eF90ICp0eCwgaW50IG5vbmJsayk7CiAKIGV4dGVybiBpbnQgIGtzb2NrbmFsX2xhdW5jaF9wYWNrZXQobG5ldF9uaV90ICpuaSwga3NvY2tfdHhfdCAqdHgsCiAJCQkJICAgbG5ldF9wcm9jZXNzX2lkX3QgaWQpOwogZXh0ZXJuIGtzb2NrX3R4X3QgKmtzb2NrbmFsX2FsbG9jX3R4KGludCB0eXBlLCBpbnQgc2l6ZSk7Ci1leHRlcm4gdm9pZCBrc29ja25hbF9mcmVlX3R4IChrc29ja190eF90ICp0eCk7CitleHRlcm4gdm9pZCBrc29ja25hbF9mcmVlX3R4KGtzb2NrX3R4X3QgKnR4KTsKIGV4dGVybiBrc29ja190eF90ICprc29ja25hbF9hbGxvY190eF9ub29wKF9fdTY0IGNvb2tpZSwgaW50IG5vbmJsayk7CiBleHRlcm4gdm9pZCBrc29ja25hbF9uZXh0X3R4X2NhcnJpZXIoa3NvY2tfY29ubl90ICpjb25uKTsKLWV4dGVybiB2b2lkIGtzb2NrbmFsX3F1ZXVlX3R4X2xvY2tlZCAoa3NvY2tfdHhfdCAqdHgsIGtzb2NrX2Nvbm5fdCAqY29ubik7Ci1leHRlcm4gdm9pZCBrc29ja25hbF90eGxpc3RfZG9uZSAobG5ldF9uaV90ICpuaSwgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0LAorZXh0ZXJuIHZvaWQga3NvY2tuYWxfcXVldWVfdHhfbG9ja2VkKGtzb2NrX3R4X3QgKnR4LCBrc29ja19jb25uX3QgKmNvbm4pOworZXh0ZXJuIHZvaWQga3NvY2tuYWxfdHhsaXN0X2RvbmUobG5ldF9uaV90ICpuaSwgc3RydWN0IGxpc3RfaGVhZCAqdHhsaXN0LAogCQkJCSAgaW50IGVycm9yKTsKLWV4dGVybiB2b2lkIGtzb2NrbmFsX25vdGlmeSAobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBnd19uaWQsIGludCBhbGl2ZSk7Ci1leHRlcm4gdm9pZCBrc29ja25hbF9xdWVyeSAoc3RydWN0IGxuZXRfbmkgKm5pLCBsbmV0X25pZF90IG5pZCwgdW5zaWduZWQgbG9uZyAqd2hlbik7CitleHRlcm4gdm9pZCBrc29ja25hbF9ub3RpZnkobG5ldF9uaV90ICpuaSwgbG5ldF9uaWRfdCBnd19uaWQsIGludCBhbGl2ZSk7CitleHRlcm4gdm9pZCBrc29ja25hbF9xdWVyeShzdHJ1Y3QgbG5ldF9uaSAqbmksIGxuZXRfbmlkX3QgbmlkLCB1bnNpZ25lZCBsb25nICp3aGVuKTsKIGV4dGVybiBpbnQga3NvY2tuYWxfdGhyZWFkX3N0YXJ0KGludCAoKmZuKSh2b2lkICphcmcpLCB2b2lkICphcmcsIGNoYXIgKm5hbWUpOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfdGhyZWFkX2ZpbmkgKHZvaWQpOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfbGF1bmNoX2FsbF9jb25uZWN0aW9uc19sb2NrZWQgKGtzb2NrX3BlZXJfdCAqcGVlcik7Ci1leHRlcm4ga3NvY2tfcm91dGVfdCAqa3NvY2tuYWxfZmluZF9jb25uZWN0YWJsZV9yb3V0ZV9sb2NrZWQgKGtzb2NrX3BlZXJfdCAqcGVlcik7Ci1leHRlcm4ga3NvY2tfcm91dGVfdCAqa3NvY2tuYWxfZmluZF9jb25uZWN0aW5nX3JvdXRlX2xvY2tlZCAoa3NvY2tfcGVlcl90ICpwZWVyKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfbmV3X3BhY2tldCAoa3NvY2tfY29ubl90ICpjb25uLCBpbnQgc2tpcCk7Ci1leHRlcm4gaW50IGtzb2NrbmFsX3NjaGVkdWxlciAodm9pZCAqYXJnKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfY29ubmQgKHZvaWQgKmFyZyk7Ci1leHRlcm4gaW50IGtzb2NrbmFsX3JlYXBlciAodm9pZCAqYXJnKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfc2VuZF9oZWxsbyAobG5ldF9uaV90ICpuaSwga3NvY2tfY29ubl90ICpjb25uLAorZXh0ZXJuIHZvaWQga3NvY2tuYWxfdGhyZWFkX2Zpbmkodm9pZCk7CitleHRlcm4gdm9pZCBrc29ja25hbF9sYXVuY2hfYWxsX2Nvbm5lY3Rpb25zX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIpOworZXh0ZXJuIGtzb2NrX3JvdXRlX3QgKmtzb2NrbmFsX2ZpbmRfY29ubmVjdGFibGVfcm91dGVfbG9ja2VkKGtzb2NrX3BlZXJfdCAqcGVlcik7CitleHRlcm4ga3NvY2tfcm91dGVfdCAqa3NvY2tuYWxfZmluZF9jb25uZWN0aW5nX3JvdXRlX2xvY2tlZChrc29ja19wZWVyX3QgKnBlZXIpOworZXh0ZXJuIGludCBrc29ja25hbF9uZXdfcGFja2V0KGtzb2NrX2Nvbm5fdCAqY29ubiwgaW50IHNraXApOworZXh0ZXJuIGludCBrc29ja25hbF9zY2hlZHVsZXIodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQga3NvY2tuYWxfY29ubmQodm9pZCAqYXJnKTsKK2V4dGVybiBpbnQga3NvY2tuYWxfcmVhcGVyKHZvaWQgKmFyZyk7CitleHRlcm4gaW50IGtzb2NrbmFsX3NlbmRfaGVsbG8obG5ldF9uaV90ICpuaSwga3NvY2tfY29ubl90ICpjb25uLAogCQkJCWxuZXRfbmlkX3QgcGVlcl9uaWQsIGtzb2NrX2hlbGxvX21zZ190ICpoZWxsbyk7Ci1leHRlcm4gaW50IGtzb2NrbmFsX3JlY3ZfaGVsbG8gKGxuZXRfbmlfdCAqbmksIGtzb2NrX2Nvbm5fdCAqY29ubiwKK2V4dGVybiBpbnQga3NvY2tuYWxfcmVjdl9oZWxsbyhsbmV0X25pX3QgKm5pLCBrc29ja19jb25uX3QgKmNvbm4sCiAJCQkJa3NvY2tfaGVsbG9fbXNnX3QgKmhlbGxvLCBsbmV0X3Byb2Nlc3NfaWRfdCAqaWQsCiAJCQkJX191NjQgKmluY2FybmF0aW9uKTsKIGV4dGVybiB2b2lkIGtzb2NrbmFsX3JlYWRfY2FsbGJhY2soa3NvY2tfY29ubl90ICpjb25uKTsKQEAgLTU2OSwxNSArNTY5LDE1IEBACiBleHRlcm4gdm9pZCBrc29ja25hbF9saWJfc2F2ZV9jYWxsYmFjayhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBrc29ja19jb25uX3QgKmNvbm4pOwogZXh0ZXJuIHZvaWQga3NvY2tuYWxfbGliX3NldF9jYWxsYmFjayhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCAga3NvY2tfY29ubl90ICpjb25uKTsKIGV4dGVybiB2b2lkIGtzb2NrbmFsX2xpYl9yZXNldF9jYWxsYmFjayhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBrc29ja19jb25uX3QgKmNvbm4pOwotZXh0ZXJuIHZvaWQga3NvY2tuYWxfbGliX3B1c2hfY29ubiAoa3NvY2tfY29ubl90ICpjb25uKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfbGliX2dldF9jb25uX2FkZHJzIChrc29ja19jb25uX3QgKmNvbm4pOwotZXh0ZXJuIGludCBrc29ja25hbF9saWJfc2V0dXBfc29jayAoc3RydWN0IHNvY2tldCAqc28pOwotZXh0ZXJuIGludCBrc29ja25hbF9saWJfc2VuZF9pb3YgKGtzb2NrX2Nvbm5fdCAqY29ubiwga3NvY2tfdHhfdCAqdHgpOwotZXh0ZXJuIGludCBrc29ja25hbF9saWJfc2VuZF9raW92IChrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX3R4X3QgKnR4KTsKLWV4dGVybiB2b2lkIGtzb2NrbmFsX2xpYl9lYWdlcl9hY2sgKGtzb2NrX2Nvbm5fdCAqY29ubik7Ci1leHRlcm4gaW50IGtzb2NrbmFsX2xpYl9yZWN2X2lvdiAoa3NvY2tfY29ubl90ICpjb25uKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfbGliX3JlY3Zfa2lvdiAoa3NvY2tfY29ubl90ICpjb25uKTsKLWV4dGVybiBpbnQga3NvY2tuYWxfbGliX2dldF9jb25uX3R1bmFibGVzIChrc29ja19jb25uX3QgKmNvbm4sIGludCAqdHhtZW0sCitleHRlcm4gdm9pZCBrc29ja25hbF9saWJfcHVzaF9jb25uKGtzb2NrX2Nvbm5fdCAqY29ubik7CitleHRlcm4gaW50IGtzb2NrbmFsX2xpYl9nZXRfY29ubl9hZGRycyhrc29ja19jb25uX3QgKmNvbm4pOworZXh0ZXJuIGludCBrc29ja25hbF9saWJfc2V0dXBfc29jayhzdHJ1Y3Qgc29ja2V0ICpzbyk7CitleHRlcm4gaW50IGtzb2NrbmFsX2xpYl9zZW5kX2lvdihrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX3R4X3QgKnR4KTsKK2V4dGVybiBpbnQga3NvY2tuYWxfbGliX3NlbmRfa2lvdihrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX3R4X3QgKnR4KTsKK2V4dGVybiB2b2lkIGtzb2NrbmFsX2xpYl9lYWdlcl9hY2soa3NvY2tfY29ubl90ICpjb25uKTsKK2V4dGVybiBpbnQga3NvY2tuYWxfbGliX3JlY3ZfaW92KGtzb2NrX2Nvbm5fdCAqY29ubik7CitleHRlcm4gaW50IGtzb2NrbmFsX2xpYl9yZWN2X2tpb3Yoa3NvY2tfY29ubl90ICpjb25uKTsKK2V4dGVybiBpbnQga3NvY2tuYWxfbGliX2dldF9jb25uX3R1bmFibGVzKGtzb2NrX2Nvbm5fdCAqY29ubiwgaW50ICp0eG1lbSwKIAkJCQkJICAgaW50ICpyeG1lbSwgaW50ICpuYWdsZSk7CiAKIGV4dGVybiBpbnQga3NvY2tuYWxfdHVuYWJsZXNfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfY2IuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfY2IuYwppbmRleCA5Mjc2MGZlLi5mYTdhZDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2NiLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9jYi5jCkBAIC0xMzc0LDkgKzEzNzQsOSBAQAogCiAJc3Bpbl9sb2NrX2JoKCZzY2hlZC0+a3NzX2xvY2spOwogCi0JcmMgPSAoIWtzb2NrbmFsX2RhdGEua3NuZF9zaHV0dGluZ2Rvd24gJiYKKwlyYyA9ICFrc29ja25hbF9kYXRhLmtzbmRfc2h1dHRpbmdkb3duICYmCiAJICAgICAgbGlzdF9lbXB0eSgmc2NoZWQtPmtzc19yeF9jb25ucykgJiYKLQkgICAgICBsaXN0X2VtcHR5KCZzY2hlZC0+a3NzX3R4X2Nvbm5zKSk7CisJICAgICAgbGlzdF9lbXB0eSgmc2NoZWQtPmtzc190eF9jb25ucyk7CiAKIAlzcGluX3VubG9ja19iaCgmc2NoZWQtPmtzc19sb2NrKTsKIAlyZXR1cm4gcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi1saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWItbGludXguYwppbmRleCA2NmNjNTA5Li5mNWU4YWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi1saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbGliLWxpbnV4LmMKQEAgLTM3LDI0ICszNywyNCBAQAogI2luY2x1ZGUgInNvY2tsbmQuaCIKIAogaW50Ci1rc29ja25hbF9saWJfZ2V0X2Nvbm5fYWRkcnMgKGtzb2NrX2Nvbm5fdCAqY29ubikKK2tzb2NrbmFsX2xpYl9nZXRfY29ubl9hZGRycyhrc29ja19jb25uX3QgKmNvbm4pCiB7CiAJaW50IHJjID0gbGliY2ZzX3NvY2tfZ2V0YWRkcihjb25uLT5rc25jX3NvY2ssIDEsCiAJCQkJICAgICAmY29ubi0+a3NuY19pcGFkZHIsCiAJCQkJICAgICAmY29ubi0+a3NuY19wb3J0KTsKIAogCS8qIERpZG4ndCBuZWVkIHRoZSB7Z2V0LHB1dH1jb25uc29jayBkYW5jZSB0byBkZXJlZiBrc25jX3NvY2suLi4gKi8KLQlMQVNTRVJUICghY29ubi0+a3NuY19jbG9zaW5nKTsKKwlMQVNTRVJUKCFjb25uLT5rc25jX2Nsb3NpbmcpOwogCiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiRXJyb3IgJWQgZ2V0dGluZyBzb2NrIHBlZXIgSVBcbiIsIHJjKTsKKwkJQ0VSUk9SKCJFcnJvciAlZCBnZXR0aW5nIHNvY2sgcGVlciBJUFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCiAJcmMgPSBsaWJjZnNfc29ja19nZXRhZGRyKGNvbm4tPmtzbmNfc29jaywgMCwKIAkJCQkgJmNvbm4tPmtzbmNfbXlpcGFkZHIsIE5VTEwpOwogCWlmIChyYyAhPSAwKSB7Ci0JCUNFUlJPUiAoIkVycm9yICVkIGdldHRpbmcgc29jayBsb2NhbCBJUFxuIiwgcmMpOworCQlDRVJST1IoIkVycm9yICVkIGdldHRpbmcgc29jayBsb2NhbCBJUFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC03NSw3ICs3NSw3IEBACiB9CiAKIGludAota3NvY2tuYWxfbGliX3NlbmRfaW92IChrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX3R4X3QgKnR4KQora3NvY2tuYWxfbGliX3NlbmRfaW92KGtzb2NrX2Nvbm5fdCAqY29ubiwga3NvY2tfdHhfdCAqdHgpCiB7CiAJc3RydWN0IHNvY2tldCAqc29jayA9IGNvbm4tPmtzbmNfc29jazsKIAlpbnQJICAgIG5vYjsKQEAgLTExNyw3ICsxMTcsNyBAQAogfQogCiBpbnQKLWtzb2NrbmFsX2xpYl9zZW5kX2tpb3YgKGtzb2NrX2Nvbm5fdCAqY29ubiwga3NvY2tfdHhfdCAqdHgpCitrc29ja25hbF9saWJfc2VuZF9raW92KGtzb2NrX2Nvbm5fdCAqY29ubiwga3NvY2tfdHhfdCAqdHgpCiB7CiAJc3RydWN0IHNvY2tldCAqc29jayA9IGNvbm4tPmtzbmNfc29jazsKIAlsbmV0X2tpb3ZfdCAgICpraW92ID0gdHgtPnR4X2tpb3Y7CkBAIC0xMjUsNyArMTI1LDcgQEAKIAlpbnQJICAgIG5vYjsKIAogCS8qIE5vdCBOT09QIG1lc3NhZ2UgKi8KLQlMQVNTRVJUICh0eC0+dHhfbG5ldG1zZyAhPSBOVUxMKTsKKwlMQVNTRVJUKHR4LT50eF9sbmV0bXNnICE9IE5VTEwpOwogCiAJLyogTkIgd2UgY2FuJ3QgdHJ1c3Qgc29ja2V0IG9wcyB0byBlaXRoZXIgY29uc3VtZSBvdXIgaW92cwogCSAqIG9yIGxlYXZlIHRoZW0gYWxvbmUuICovCkBAIC0xODUsNyArMTg1LDcgQEAKIH0KIAogdm9pZAota3NvY2tuYWxfbGliX2VhZ2VyX2FjayAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfbGliX2VhZ2VyX2Fjayhrc29ja19jb25uX3QgKmNvbm4pCiB7CiAJaW50CSAgICBvcHQgPSAxOwogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBjb25uLT5rc25jX3NvY2s7CkBAIC0xOTYsMTEgKzE5NiwxMSBAQAogCSAqIHBlZXIuICovCiAKIAlrZXJuZWxfc2V0c29ja29wdChzb2NrLCBTT0xfVENQLCBUQ1BfUVVJQ0tBQ0ssCi0JCQkgICAgICAgKGNoYXIgKikmb3B0LCBzaXplb2YgKG9wdCkpOworCQkJICAgICAgIChjaGFyICopJm9wdCwgc2l6ZW9mKG9wdCkpOwogfQogCiBpbnQKLWtzb2NrbmFsX2xpYl9yZWN2X2lvdiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfbGliX3JlY3ZfaW92KGtzb2NrX2Nvbm5fdCAqY29ubikKIHsKICNpZiBTT0NLTkFMX1NJTkdMRV9GUkFHX1JYCiAJc3RydWN0IGt2ZWMgIHNjcmF0Y2g7CkBAIC0yMjMsMTMgKzIyMywxMyBAQAogCiAJLyogTkIgd2UgY2FuJ3QgdHJ1c3Qgc29ja2V0IG9wcyB0byBlaXRoZXIgY29uc3VtZSBvdXIgaW92cwogCSAqIG9yIGxlYXZlIHRoZW0gYWxvbmUuICovCi0JTEFTU0VSVCAobmlvdiA+IDApOworCUxBU1NFUlQobmlvdiA+IDApOwogCiAJZm9yIChub2IgPSBpID0gMDsgaSA8IG5pb3Y7IGkrKykgewogCQlzY3JhdGNoaW92W2ldID0gaW92W2ldOwogCQlub2IgKz0gc2NyYXRjaGlvdltpXS5pb3ZfbGVuOwogCX0KLQlMQVNTRVJUIChub2IgPD0gY29ubi0+a3NuY19yeF9ub2Jfd2FudGVkKTsKKwlMQVNTRVJUKG5vYiA8PSBjb25uLT5rc25jX3J4X25vYl93YW50ZWQpOwogCiAJcmMgPSBrZXJuZWxfcmVjdm1zZyhjb25uLT5rc25jX3NvY2ssICZtc2csCiAJCXNjcmF0Y2hpb3YsIG5pb3YsIG5vYiwgTVNHX0RPTlRXQUlUKTsKQEAgLTI0Myw3ICsyNDMsNyBAQAogCWlmIChzYXZlZF9jc3VtICE9IDApIHsKIAkJLyogYWNjdW11bGF0ZSBjaGVja3N1bSAqLwogCQlmb3IgKGkgPSAwLCBzdW0gPSByYzsgc3VtID4gMDsgaSsrLCBzdW0gLT0gZnJhZ25vYikgewotCQkJTEFTU0VSVCAoaSA8IG5pb3YpOworCQkJTEFTU0VSVChpIDwgbmlvdik7CiAKIAkJCWZyYWdub2IgPSBpb3ZbaV0uaW92X2xlbjsKIAkJCWlmIChmcmFnbm9iID4gc3VtKQpAQCAtMjc4LDcgKzI3OCw3IEBACiAJaWYgKCEqa3NvY2tuYWxfdHVuYWJsZXMua3NuZF96Y19yZWN2IHx8IHBhZ2VzID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0JTEFTU0VSVCAobmlvdiA8PSBMTkVUX01BWF9JT1YpOworCUxBU1NFUlQobmlvdiA8PSBMTkVUX01BWF9JT1YpOwogCiAJaWYgKG5pb3YgPCAyIHx8CiAJICAgIG5pb3YgPCAqa3NvY2tuYWxfdHVuYWJsZXMua3NuZF96Y19yZWN2X21pbl9uZnJhZ3MpCkBAIC0zMDQsNyArMzA0LDcgQEAKIH0KIAogaW50Ci1rc29ja25hbF9saWJfcmVjdl9raW92IChrc29ja19jb25uX3QgKmNvbm4pCitrc29ja25hbF9saWJfcmVjdl9raW92KGtzb2NrX2Nvbm5fdCAqY29ubikKIHsKICNpZiBTT0NLTkFMX1NJTkdMRV9GUkFHX1JYIHx8ICFTT0NLTkFMX1JJU0tfS01BUF9ERUFETE9DSwogCXN0cnVjdCBrdmVjICAgc2NyYXRjaDsKQEAgLTM0OCwxNCArMzQ4LDE0IEBACiAJCW4gPSBuaW92OwogCX0KIAotCUxBU1NFUlQgKG5vYiA8PSBjb25uLT5rc25jX3J4X25vYl93YW50ZWQpOworCUxBU1NFUlQobm9iIDw9IGNvbm4tPmtzbmNfcnhfbm9iX3dhbnRlZCk7CiAKIAlyYyA9IGtlcm5lbF9yZWN2bXNnKGNvbm4tPmtzbmNfc29jaywgJm1zZywKIAkJCShzdHJ1Y3Qga3ZlYyAqKXNjcmF0Y2hpb3YsIG4sIG5vYiwgTVNHX0RPTlRXQUlUKTsKIAogCWlmIChjb25uLT5rc25jX21zZy5rc21fY3N1bSAhPSAwKSB7CiAJCWZvciAoaSA9IDAsIHN1bSA9IHJjOyBzdW0gPiAwOyBpKyssIHN1bSAtPSBmcmFnbm9iKSB7Ci0JCQlMQVNTRVJUIChpIDwgbmlvdik7CisJCQlMQVNTRVJUKGkgPCBuaW92KTsKIAogCQkJLyogRGFuZyEgaGF2ZSB0byBrbWFwIGFnYWluIGJlY2F1c2UgSSBoYXZlIG5vd2hlcmUgdG8gc3Rhc2ggdGhlCiAJCQkgKiBtYXBwZWQgYWRkcmVzcy4gIEJ1dCBieSBkb2luZyBpdCB3aGlsZSB0aGUgcGFnZSBpcyBzdGlsbApAQCAtNDIzLDcgKzQyMyw3IEBACiB9CiAKIGludAota3NvY2tuYWxfbGliX2dldF9jb25uX3R1bmFibGVzIChrc29ja19jb25uX3QgKmNvbm4sIGludCAqdHhtZW0sIGludCAqcnhtZW0sIGludCAqbmFnbGUpCitrc29ja25hbF9saWJfZ2V0X2Nvbm5fdHVuYWJsZXMoa3NvY2tfY29ubl90ICpjb25uLCBpbnQgKnR4bWVtLCBpbnQgKnJ4bWVtLCBpbnQgKm5hZ2xlKQogewogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBjb25uLT5rc25jX3NvY2s7CiAJaW50CSAgICBsZW47CkBAIC00MzEsNyArNDMxLDcgQEAKIAogCXJjID0ga3NvY2tuYWxfY29ubnNvY2tfYWRkcmVmKGNvbm4pOwogCWlmIChyYyAhPSAwKSB7Ci0JCUxBU1NFUlQgKGNvbm4tPmtzbmNfY2xvc2luZyk7CisJCUxBU1NFUlQoY29ubi0+a3NuY19jbG9zaW5nKTsKIAkJKnR4bWVtID0gKnJ4bWVtID0gKm5hZ2xlID0gMDsKIAkJcmV0dXJuIC1FU0hVVERPV047CiAJfQpAQCAtNDU0LDcgKzQ1NCw3IEBACiB9CiAKIGludAota3NvY2tuYWxfbGliX3NldHVwX3NvY2sgKHN0cnVjdCBzb2NrZXQgKnNvY2spCitrc29ja25hbF9saWJfc2V0dXBfc29jayhzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogewogCWludAkgICAgIHJjOwogCWludAkgICAgIG9wdGlvbjsKQEAgLTQ3MywxNyArNDczLDE3IEBACiAJbGluZ2VyLmxfbGluZ2VyID0gMDsKIAogCXJjID0ga2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fTElOR0VSLAotCQkJICAgICAgKGNoYXIgKikmbGluZ2VyLCBzaXplb2YgKGxpbmdlcikpOworCQkJICAgICAgKGNoYXIgKikmbGluZ2VyLCBzaXplb2YobGluZ2VyKSk7CiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiQ2FuJ3Qgc2V0IFNPX0xJTkdFUjogJWRcbiIsIHJjKTsKKwkJQ0VSUk9SKCJDYW4ndCBzZXQgU09fTElOR0VSOiAlZFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCiAJb3B0aW9uID0gLTE7CiAJcmMgPSBrZXJuZWxfc2V0c29ja29wdChzb2NrLCBTT0xfVENQLCBUQ1BfTElOR0VSMiwKLQkJCQkgICAgKGNoYXIgKikmb3B0aW9uLCBzaXplb2YgKG9wdGlvbikpOworCQkJCSAgICAoY2hhciAqKSZvcHRpb24sIHNpemVvZihvcHRpb24pKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJDYW4ndCBzZXQgU09fTElOR0VSMjogJWRcbiIsIHJjKTsKKwkJQ0VSUk9SKCJDYW4ndCBzZXQgU09fTElOR0VSMjogJWRcbiIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtNDkxLDkgKzQ5MSw5IEBACiAJCW9wdGlvbiA9IDE7CiAKIAkJcmMgPSBrZXJuZWxfc2V0c29ja29wdChzb2NrLCBTT0xfVENQLCBUQ1BfTk9ERUxBWSwKLQkJCQkJICAgIChjaGFyICopJm9wdGlvbiwgc2l6ZW9mIChvcHRpb24pKTsKKwkJCQkJICAgIChjaGFyICopJm9wdGlvbiwgc2l6ZW9mKG9wdGlvbikpOwogCQlpZiAocmMgIT0gMCkgewotCQkJQ0VSUk9SICgiQ2FuJ3QgZGlzYWJsZSBuYWdsZTogJWRcbiIsIHJjKTsKKwkJCUNFUlJPUigiQ2FuJ3QgZGlzYWJsZSBuYWdsZTogJWRcbiIsIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfQogCX0KQEAgLTUwMiw3ICs1MDIsNyBAQAogCQkJCSprc29ja25hbF90dW5hYmxlcy5rc25kX3R4X2J1ZmZlcl9zaXplLAogCQkJCSprc29ja25hbF90dW5hYmxlcy5rc25kX3J4X2J1ZmZlcl9zaXplKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJDYW4ndCBzZXQgYnVmZmVyIHR4ICVkLCByeCAlZCBidWZmZXJzOiAlZFxuIiwKKwkJQ0VSUk9SKCJDYW4ndCBzZXQgYnVmZmVyIHR4ICVkLCByeCAlZCBidWZmZXJzOiAlZFxuIiwKIAkJCSprc29ja25hbF90dW5hYmxlcy5rc25kX3R4X2J1ZmZlcl9zaXplLAogCQkJKmtzb2NrbmFsX3R1bmFibGVzLmtzbmRfcnhfYnVmZmVyX3NpemUsIHJjKTsKIAkJcmV0dXJuIHJjOwpAQCAtNTE5LDkgKzUxOSw5IEBACiAKIAlvcHRpb24gPSAoZG9fa2VlcGFsaXZlID8gMSA6IDApOwogCXJjID0ga2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fS0VFUEFMSVZFLAotCQkJICAgICAgKGNoYXIgKikmb3B0aW9uLCBzaXplb2YgKG9wdGlvbikpOworCQkJICAgICAgKGNoYXIgKikmb3B0aW9uLCBzaXplb2Yob3B0aW9uKSk7CiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiQ2FuJ3Qgc2V0IFNPX0tFRVBBTElWRTogJWRcbiIsIHJjKTsKKwkJQ0VSUk9SKCJDYW4ndCBzZXQgU09fS0VFUEFMSVZFOiAlZFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC01MjksMjMgKzUyOSwyMyBAQAogCQlyZXR1cm4gMDsKIAogCXJjID0ga2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1RDUCwgVENQX0tFRVBJRExFLAotCQkJCSAgICAoY2hhciAqKSZrZWVwX2lkbGUsIHNpemVvZiAoa2VlcF9pZGxlKSk7CisJCQkJICAgIChjaGFyICopJmtlZXBfaWRsZSwgc2l6ZW9mKGtlZXBfaWRsZSkpOwogCWlmIChyYyAhPSAwKSB7Ci0JCUNFUlJPUiAoIkNhbid0IHNldCBUQ1BfS0VFUElETEU6ICVkXG4iLCByYyk7CisJCUNFUlJPUigiQ2FuJ3Qgc2V0IFRDUF9LRUVQSURMRTogJWRcbiIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIAogCXJjID0ga2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1RDUCwgVENQX0tFRVBJTlRWTCwKLQkJCQkgICAgKGNoYXIgKikma2VlcF9pbnR2bCwgc2l6ZW9mIChrZWVwX2ludHZsKSk7CisJCQkJICAgIChjaGFyICopJmtlZXBfaW50dmwsIHNpemVvZihrZWVwX2ludHZsKSk7CiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiQ2FuJ3Qgc2V0IFRDUF9LRUVQSU5UVkw6ICVkXG4iLCByYyk7CisJCUNFUlJPUigiQ2FuJ3Qgc2V0IFRDUF9LRUVQSU5UVkw6ICVkXG4iLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKIAlyYyA9IGtlcm5lbF9zZXRzb2Nrb3B0KHNvY2ssIFNPTF9UQ1AsIFRDUF9LRUVQQ05ULAotCQkJCSAgICAoY2hhciAqKSZrZWVwX2NvdW50LCBzaXplb2YgKGtlZXBfY291bnQpKTsKKwkJCQkgICAgKGNoYXIgKikma2VlcF9jb3VudCwgc2l6ZW9mKGtlZXBfY291bnQpKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJDYW4ndCBzZXQgVENQX0tFRVBDTlQ6ICVkXG4iLCByYyk7CisJCUNFUlJPUigiQ2FuJ3Qgc2V0IFRDUF9LRUVQQ05UOiAlZFxuIiwgcmMpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC01NTMsNyArNTUzLDcgQEAKIH0KIAogdm9pZAota3NvY2tuYWxfbGliX3B1c2hfY29ubiAoa3NvY2tfY29ubl90ICpjb25uKQora3NvY2tuYWxfbGliX3B1c2hfY29ubihrc29ja19jb25uX3QgKmNvbm4pCiB7CiAJc3RydWN0IHNvY2sgICAgKnNrOwogCXN0cnVjdCB0Y3Bfc29jayAqdHA7CkBAIC01NjgsMjkgKzU2OCwyOSBAQAogCXNrID0gY29ubi0+a3NuY19zb2NrLT5zazsKIAl0cCA9IHRjcF9zayhzayk7CiAKLQlsb2NrX3NvY2sgKHNrKTsKKwlsb2NrX3NvY2soc2spOwogCW5vbmFnbGUgPSB0cC0+bm9uYWdsZTsKIAl0cC0+bm9uYWdsZSA9IDE7Ci0JcmVsZWFzZV9zb2NrIChzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKIAogCXJjID0ga2VybmVsX3NldHNvY2tvcHQoY29ubi0+a3NuY19zb2NrLCBTT0xfVENQLCBUQ1BfTk9ERUxBWSwKLQkJCQkgICAgICAoY2hhciAqKSZ2YWwsIHNpemVvZiAodmFsKSk7Ci0JTEFTU0VSVCAocmMgPT0gMCk7CisJCQkJICAgICAgKGNoYXIgKikmdmFsLCBzaXplb2YodmFsKSk7CisJTEFTU0VSVChyYyA9PSAwKTsKIAotCWxvY2tfc29jayAoc2spOworCWxvY2tfc29jayhzayk7CiAJdHAtPm5vbmFnbGUgPSBub25hZ2xlOwotCXJlbGVhc2Vfc29jayAoc2spOworCXJlbGVhc2Vfc29jayhzayk7CiAKIAlrc29ja25hbF9jb25uc29ja19kZWNyZWYoY29ubik7CiB9CiAKLWV4dGVybiB2b2lkIGtzb2NrbmFsX3JlYWRfY2FsbGJhY2sgKGtzb2NrX2Nvbm5fdCAqY29ubik7Ci1leHRlcm4gdm9pZCBrc29ja25hbF93cml0ZV9jYWxsYmFjayAoa3NvY2tfY29ubl90ICpjb25uKTsKK2V4dGVybiB2b2lkIGtzb2NrbmFsX3JlYWRfY2FsbGJhY2soa3NvY2tfY29ubl90ICpjb25uKTsKK2V4dGVybiB2b2lkIGtzb2NrbmFsX3dyaXRlX2NhbGxiYWNrKGtzb2NrX2Nvbm5fdCAqY29ubik7CiAvKgogICogc29ja2V0IGNhbGwgYmFjayBpbiBMaW51eAogICovCiBzdGF0aWMgdm9pZAota3NvY2tuYWxfZGF0YV9yZWFkeSAoc3RydWN0IHNvY2sgKnNrKQora3NvY2tuYWxfZGF0YV9yZWFkeShzdHJ1Y3Qgc29jayAqc2spCiB7CiAJa3NvY2tfY29ubl90ICAqY29ubjsKIApAQCAtNjAwLDggKzYwMCw4IEBACiAKIAljb25uID0gc2stPnNrX3VzZXJfZGF0YTsKIAlpZiAoY29ubiA9PSBOVUxMKSB7CSAgICAgLyogcmFjZWQgd2l0aCBrc29ja25hbF90ZXJtaW5hdGVfY29ubiAqLwotCQlMQVNTRVJUIChzay0+c2tfZGF0YV9yZWFkeSAhPSAma3NvY2tuYWxfZGF0YV9yZWFkeSk7Ci0JCXNrLT5za19kYXRhX3JlYWR5IChzayk7CisJCUxBU1NFUlQoc2stPnNrX2RhdGFfcmVhZHkgIT0gJmtzb2NrbmFsX2RhdGFfcmVhZHkpOworCQlzay0+c2tfZGF0YV9yZWFkeShzayk7CiAJfSBlbHNlCiAJCWtzb2NrbmFsX3JlYWRfY2FsbGJhY2soY29ubik7CiAKQEAgLTYwOSw3ICs2MDksNyBAQAogfQogCiBzdGF0aWMgdm9pZAota3NvY2tuYWxfd3JpdGVfc3BhY2UgKHN0cnVjdCBzb2NrICpzaykKK2tzb2NrbmFsX3dyaXRlX3NwYWNlKHN0cnVjdCBzb2NrICpzaykKIHsKIAlrc29ja19jb25uX3QgICpjb25uOwogCWludAkgICAgd3NwYWNlOwpAQCAtNjI5LDEyICs2MjksMTIgQEAKIAkJCQkgICAgICAiIHJlYWR5IiA6ICIgYmxvY2tlZCIpLAogCSAgICAgICAoY29ubiA9PSBOVUxMKSA/ICIiIDogKGNvbm4tPmtzbmNfdHhfc2NoZWR1bGVkID8KIAkJCQkgICAgICAiIHNjaGVkdWxlZCIgOiAiIGlkbGUiKSwKLQkgICAgICAgKGNvbm4gPT0gTlVMTCkgPyAiIiA6IChsaXN0X2VtcHR5ICgmY29ubi0+a3NuY190eF9xdWV1ZSkgPworCSAgICAgICAoY29ubiA9PSBOVUxMKSA/ICIiIDogKGxpc3RfZW1wdHkoJmNvbm4tPmtzbmNfdHhfcXVldWUpID8KIAkJCQkgICAgICAiIGVtcHR5IiA6ICIgcXVldWVkIikpOwogCiAJaWYgKGNvbm4gPT0gTlVMTCkgewkgICAgIC8qIHJhY2VkIHdpdGgga3NvY2tuYWxfdGVybWluYXRlX2Nvbm4gKi8KLQkJTEFTU0VSVCAoc2stPnNrX3dyaXRlX3NwYWNlICE9ICZrc29ja25hbF93cml0ZV9zcGFjZSk7Ci0JCXNrLT5za193cml0ZV9zcGFjZSAoc2spOworCQlMQVNTRVJUKHNrLT5za193cml0ZV9zcGFjZSAhPSAma3NvY2tuYWxfd3JpdGVfc3BhY2UpOworCQlzay0+c2tfd3JpdGVfc3BhY2Uoc2spOwogCiAJCXJlYWRfdW5sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwogCQlyZXR1cm47CkBAIC02NDcsNyArNjQ3LDcgQEAKIAkJICogRU5PTUVNIGNoZWNrIGluIGtzb2NrbmFsX3RyYW5zbWl0IGlzIHJhY2UtZnJlZSAodGhpbmsgYWJvdXQKIAkJICogaXQpLiAqLwogCi0JCWNsZWFyX2JpdCAoU09DS19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOworCQljbGVhcl9iaXQoU09DS19OT1NQQUNFLCAmc2stPnNrX3NvY2tldC0+ZmxhZ3MpOwogCX0KIAogCXJlYWRfdW5sb2NrKCZrc29ja25hbF9kYXRhLmtzbmRfZ2xvYmFsX2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWItbGludXguaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbGliLWxpbnV4LmgKaW5kZXggN2E3OTNkMi4uZjU1NjM4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9saWItbGludXguaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX2xpYi1saW51eC5oCkBAIC01MCw4ICs1MCw4IEBACiAjaW5jbHVkZSA8bmV0L3RjcC5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCi0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9tb2RwYXJhbXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfbW9kcGFyYW1zLmMKaW5kZXggNjZkNzhjOS4uODZiODhkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9tb2RwYXJhbXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX21vZHBhcmFtcy5jCkBAIC03Miw3ICs3Miw3IEBACiBtb2R1bGVfcGFyYW0odHlwZWRfY29ubnMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHR5cGVkX2Nvbm5zLCAidXNlIGRpZmZlcmVudCBzb2NrZXRzIGZvciBidWxrIik7CiAKLXN0YXRpYyBpbnQgbWluX2J1bGsgPSAoMTw8MTApOworc3RhdGljIGludCBtaW5fYnVsayA9IDE8PDEwOwogbW9kdWxlX3BhcmFtKG1pbl9idWxrLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhtaW5fYnVsaywgInNtYWxsZXN0ICdsYXJnZScgbWVzc2FnZSIpOwogCkBAIC0xMjIsNyArMTIyLDcgQEAKIG1vZHVsZV9wYXJhbShub25ibGtfemNhY2ssIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vbmJsa196Y2FjaywgImFsd2F5cyBzZW5kIFpDLUFDSyBvbiBub24tYmxvY2tpbmcgY29ubmVjdGlvbiIpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IHpjX21pbl9wYXlsb2FkID0gKDE2IDw8IDEwKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgemNfbWluX3BheWxvYWQgPSAxNiA8PCAxMDsKIG1vZHVsZV9wYXJhbSh6Y19taW5fcGF5bG9hZCwgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoemNfbWluX3BheWxvYWQsICJtaW5pbXVtIHBheWxvYWQgc2l6ZSB0byB6ZXJvIGNvcHkiKTsKIApAQCAtMTgyLDcgKzE4Miw3IEBACiAjZW5kaWYKIAogCWlmICgqa3NvY2tuYWxfdHVuYWJsZXMua3NuZF96Y19taW5fcGF5bG9hZCA8ICgyIDw8IDEwKSkKLQkJKmtzb2NrbmFsX3R1bmFibGVzLmtzbmRfemNfbWluX3BheWxvYWQgPSAoMiA8PCAxMCk7CisJCSprc29ja25hbF90dW5hYmxlcy5rc25kX3pjX21pbl9wYXlsb2FkID0gMiA8PCAxMDsKIAogCXJldHVybiAwOwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfcHJvdG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9rbG5kcy9zb2NrbG5kL3NvY2tsbmRfcHJvdG8uYwppbmRleCBiMmY4OGViLi44NTk2NTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQva2xuZHMvc29ja2xuZC9zb2NrbG5kX3Byb3RvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2tsbmRzL3NvY2tsbmQvc29ja2xuZF9wcm90by5jCkBAIC01NSw4ICs1NSw4IEBACiAJa3NvY2tfdHhfdCAgICAgKnR4ID0gY29ubi0+a3NuY190eF9jYXJyaWVyOwogCiAJLyogQ2FsbGVkIGhvbGRpbmcgQkggbG9jazogY29ubi0+a3NuY19zY2hlZHVsZXItPmtzc19sb2NrICovCi0JTEFTU0VSVCAoIWxpc3RfZW1wdHkoJmNvbm4tPmtzbmNfdHhfcXVldWUpKTsKLQlMQVNTRVJUICh0eCAhPSBOVUxMKTsKKwlMQVNTRVJUKCFsaXN0X2VtcHR5KCZjb25uLT5rc25jX3R4X3F1ZXVlKSk7CisJTEFTU0VSVCh0eCAhPSBOVUxMKTsKIAogCS8qIE5leHQgVFggdGhhdCBjYW4gY2FycnkgWkMtQUNLIG9yIExOZXQgbWVzc2FnZSAqLwogCWlmICh0eC0+dHhfbGlzdC5uZXh0ID09ICZjb25uLT5rc25jX3R4X3F1ZXVlKSB7CkBAIC02NSw3ICs2NSw3IEBACiAJfSBlbHNlIHsKIAkJY29ubi0+a3NuY190eF9jYXJyaWVyID0gbGlzdF9lbnRyeSh0eC0+dHhfbGlzdC5uZXh0LAogCQkJCQkJICAgICAgIGtzb2NrX3R4X3QsIHR4X2xpc3QpOwotCQlMQVNTRVJUIChjb25uLT5rc25jX3R4X2NhcnJpZXItPnR4X21zZy5rc21fdHlwZSA9PSB0eC0+dHhfbXNnLmtzbV90eXBlKTsKKwkJTEFTU0VSVChjb25uLT5rc25jX3R4X2NhcnJpZXItPnR4X21zZy5rc21fdHlwZSA9PSB0eC0+dHhfbXNnLmtzbV90eXBlKTsKIAl9CiB9CiAKQEAgLTc1LDcgKzc1LDcgQEAKIHsKIAlrc29ja190eF90ICp0eCA9IGNvbm4tPmtzbmNfdHhfY2FycmllcjsKIAotCUxBU1NFUlQgKHR4X2FjayA9PSBOVUxMIHx8CisJTEFTU0VSVCh0eF9hY2sgPT0gTlVMTCB8fAogCQkgdHhfYWNrLT50eF9tc2cua3NtX3R5cGUgPT0gS1NPQ0tfTVNHX05PT1ApOwogCiAJLyoKQEAgLTEzOSw3ICsxMzksNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlMQVNTRVJUICh0eC0+dHhfbXNnLmtzbV90eXBlID09IEtTT0NLX01TR19OT09QKTsKKwlMQVNTRVJUKHR4LT50eF9tc2cua3NtX3R5cGUgPT0gS1NPQ0tfTVNHX05PT1ApOwogCiAJLyogVGhlcmUgaXMgYSBub29wIHpjLWFjayBjYW4gYmUgcGlnZ3liYWNrZWQgKi8KIAl0eF9tc2ctPnR4X21zZy5rc21femNfY29va2llc1sxXSA9IHR4LT50eF9tc2cua3NtX3pjX2Nvb2tpZXNbMV07CkBAIC0xNjIsNyArMTYyLDcgQEAKIAkJcmV0dXJuIGtzb2NrbmFsX3F1ZXVlX3R4X3pjYWNrX3YyKGNvbm4sIHR4X2FjaywgY29va2llKTsKIAogCS8qIG5vbi1ibG9ja2luZyBaQy1BQ0sgKHRvIHJvdXRlcikgKi8KLQlMQVNTRVJUICh0eF9hY2sgPT0gTlVMTCB8fAorCUxBU1NFUlQodHhfYWNrID09IE5VTEwgfHwKIAkJIHR4X2Fjay0+dHhfbXNnLmtzbV90eXBlID09IEtTT0NLX01TR19OT09QKTsKIAogCXR4ID0gY29ubi0+a3NuY190eF9jYXJyaWVyOwpAQCAtMTg1LDcgKzE4NSw3IEBACiAKIAlpZiAodHgtPnR4X21zZy5rc21femNfY29va2llc1sxXSA9PSBTT0NLTkFMX0tFRVBBTElWRV9QSU5HKSB7CiAJCS8qIHJlcGxhY2UgdGhlIGtlZXBhbGl2ZSBQSU5HIHdpdGggYSByZWFsIEFDSyAqLwotCQlMQVNTRVJUICh0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzBdID09IDApOworCQlMQVNTRVJUKHR4LT50eF9tc2cua3NtX3pjX2Nvb2tpZXNbMF0gPT0gMCk7CiAJCXR4LT50eF9tc2cua3NtX3pjX2Nvb2tpZXNbMV0gPSBjb29raWU7CiAJCXJldHVybiAxOwogCX0KQEAgLTIyMCw3ICsyMjAsNyBAQAogCQlfX3U2NCAgIHRtcCA9IDA7CiAKIAkJLyogdHdvIHNlcGFyYXRlZCBjb29raWVzOiAoYSsyLCBhKSBvciAoYSsxLCBhKSAqLwotCQlMQVNTRVJUICh0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzBdIC0KKwkJTEFTU0VSVCh0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzBdIC0KIAkJCSB0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzFdIDw9IDIpOwogCiAJCWlmICh0eC0+dHhfbXNnLmtzbV96Y19jb29raWVzWzBdIC0KQEAgLTQwOCw3ICs0MDgsNyBAQAogCWtzb2NrX3BlZXJfdCAgICAgICpwZWVyID0gY29ubi0+a3NuY19wZWVyOwogCWtzb2NrX3R4X3QJKnR4OwogCWtzb2NrX3R4X3QJKnRtcDsKLQlMSVNUX0hFQUQgICAgICh6bGlzdCk7CisJTElTVF9IRUFEKHpsaXN0KTsKIAlpbnQJCWNvdW50OwogCiAJaWYgKGNvb2tpZTEgPT0gMCkKQEAgLTQ1MCw3ICs0NTAsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1rc29ja25hbF9zZW5kX2hlbGxvX3YxIChrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX2hlbGxvX21zZ190ICpoZWxsbykKK2tzb2NrbmFsX3NlbmRfaGVsbG9fdjEoa3NvY2tfY29ubl90ICpjb25uLCBrc29ja19oZWxsb19tc2dfdCAqaGVsbG8pCiB7CiAJc3RydWN0IHNvY2tldAkqc29jayA9IGNvbm4tPmtzbmNfc29jazsKIAlsbmV0X2hkcl90CSAgKmhkcjsKQEAgLTUyNiw3ICs1MjYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1rc29ja25hbF9zZW5kX2hlbGxvX3YyIChrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX2hlbGxvX21zZ190ICpoZWxsbykKK2tzb2NrbmFsX3NlbmRfaGVsbG9fdjIoa3NvY2tfY29ubl90ICpjb25uLCBrc29ja19oZWxsb19tc2dfdCAqaGVsbG8pCiB7CiAJc3RydWN0IHNvY2tldCAqc29jayA9IGNvbm4tPmtzbmNfc29jazsKIAlpbnQJICAgICByYzsKQEAgLTU4NCwxMiArNTg0LDEyIEBACiAJfQogCiAJcmMgPSBsaWJjZnNfc29ja19yZWFkKHNvY2ssICZoZHItPnNyY19uaWQsCi0JCQkgICAgICBzaXplb2YgKCpoZHIpIC0gb2Zmc2V0b2YgKGxuZXRfaGRyX3QsIHNyY19uaWQpLAorCQkJICAgICAgc2l6ZW9mKCpoZHIpIC0gb2Zmc2V0b2YobG5ldF9oZHJfdCwgc3JjX25pZCksCiAJCQkgICAgICB0aW1lb3V0KTsKIAlpZiAocmMgIT0gMCkgewogCQlDRVJST1IoIkVycm9yICVkIHJlYWRpbmcgcmVzdCBvZiBIRUxMTyBoZHIgZnJvbSAlcEk0aFxuIiwKIAkJCXJjLCAmY29ubi0+a3NuY19pcGFkZHIpOwotCQlMQVNTRVJUIChyYyA8IDAgJiYgcmMgIT0gLUVBTFJFQURZKTsKKwkJTEFTU0VSVChyYyA8IDAgJiYgcmMgIT0gLUVBTFJFQURZKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC02MDIsMTIgKzYwMiwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQloZWxsby0+a3NobV9zcmNfbmlkCSA9IGxlNjRfdG9fY3B1IChoZHItPnNyY19uaWQpOwotCWhlbGxvLT5rc2htX3NyY19waWQJID0gbGUzMl90b19jcHUgKGhkci0+c3JjX3BpZCk7Ci0JaGVsbG8tPmtzaG1fc3JjX2luY2FybmF0aW9uID0gbGU2NF90b19jcHUgKGhkci0+bXNnLmhlbGxvLmluY2FybmF0aW9uKTsKLQloZWxsby0+a3NobV9jdHlwZQkgICA9IGxlMzJfdG9fY3B1IChoZHItPm1zZy5oZWxsby50eXBlKTsKLQloZWxsby0+a3NobV9uaXBzCSAgICA9IGxlMzJfdG9fY3B1IChoZHItPnBheWxvYWRfbGVuZ3RoKSAvCi0JCQkJCSBzaXplb2YgKF9fdTMyKTsKKwloZWxsby0+a3NobV9zcmNfbmlkCSA9IGxlNjRfdG9fY3B1KGhkci0+c3JjX25pZCk7CisJaGVsbG8tPmtzaG1fc3JjX3BpZAkgPSBsZTMyX3RvX2NwdShoZHItPnNyY19waWQpOworCWhlbGxvLT5rc2htX3NyY19pbmNhcm5hdGlvbiA9IGxlNjRfdG9fY3B1KGhkci0+bXNnLmhlbGxvLmluY2FybmF0aW9uKTsKKwloZWxsby0+a3NobV9jdHlwZQkgICA9IGxlMzJfdG9fY3B1KGhkci0+bXNnLmhlbGxvLnR5cGUpOworCWhlbGxvLT5rc2htX25pcHMJICAgID0gbGUzMl90b19jcHUoaGRyLT5wYXlsb2FkX2xlbmd0aCkgLworCQkJCQkgc2l6ZW9mKF9fdTMyKTsKIAogCWlmIChoZWxsby0+a3NobV9uaXBzID4gTE5FVF9NQVhfSU5URVJGQUNFUykgewogCQlDRVJST1IoIkJhZCBuaXBzICVkIGZyb20gaXAgJXBJNGhcbiIsCkBAIC02NDUsNyArNjQ1LDcgQEAKIH0KIAogc3RhdGljIGludAota3NvY2tuYWxfcmVjdl9oZWxsb192MiAoa3NvY2tfY29ubl90ICpjb25uLCBrc29ja19oZWxsb19tc2dfdCAqaGVsbG8sIGludCB0aW1lb3V0KQora3NvY2tuYWxfcmVjdl9oZWxsb192Mihrc29ja19jb25uX3QgKmNvbm4sIGtzb2NrX2hlbGxvX21zZ190ICpoZWxsbywgaW50IHRpbWVvdXQpCiB7CiAJc3RydWN0IHNvY2tldCAgICpzb2NrID0gY29ubi0+a3NuY19zb2NrOwogCWludAkJcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9hcGktbmkuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCmluZGV4IGZhY2ViOTUuLjRhMTRlNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2FwaS1uaS5jCkBAIC02NTAsMTUgKzY1MCwxOSBAQAogCiAJcmVjcyA9IGxuZXRfcmVzX2NvbnRhaW5lcnNfY3JlYXRlKExORVRfQ09PS0lFX1RZUEVfTUUsIExORVRfRkxfTUFYX01FUywKIAkJCQkJICBzaXplb2YobG5ldF9tZV90KSk7Ci0JaWYgKHJlY3MgPT0gTlVMTCkKKwlpZiAocmVjcyA9PSBOVUxMKSB7CisJCXJjID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWQ7CisJfQogCiAJdGhlX2xuZXQubG5fbWVfY29udGFpbmVycyA9IHJlY3M7CiAKIAlyZWNzID0gbG5ldF9yZXNfY29udGFpbmVyc19jcmVhdGUoTE5FVF9DT09LSUVfVFlQRV9NRCwgTE5FVF9GTF9NQVhfTURTLAogCQkJCQkgIHNpemVvZihsbmV0X2xpYm1kX3QpKTsKLQlpZiAocmVjcyA9PSBOVUxMKQorCWlmIChyZWNzID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZDsKKwl9CiAKIAl0aGVfbG5ldC5sbl9tZF9jb250YWluZXJzID0gcmVjczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvY29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9jb25maWcuYwppbmRleCBhZjE3MWUyLi4yZGM0YzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9jb25maWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9jb25maWcuYwpAQCAtMzcsMTEgKzM3LDExIEBACiAjZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xORVQKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewkJCSAgICAvKiB0bXAgc3RydWN0IGZvciBwYXJzaW5nIHJvdXRlcyAqLworc3RydWN0IGxuZXRfdGV4dF9idWZfdCB7CSAgICAvKiB0bXAgc3RydWN0IGZvciBwYXJzaW5nIHJvdXRlcyAqLwogCXN0cnVjdCBsaXN0X2hlYWQJIGx0Yl9saXN0OwkvKiBzdGFzaCBvbiBsaXN0cyAqLwogCWludAkJbHRiX3NpemU7CS8qIGFsbG9jYXRlZCBzaXplICovCiAJY2hhcgkgICAgICAgbHRiX3RleHRbMF07ICAgICAvKiB0ZXh0IGJ1ZmZlciAqLwotfSBsbmV0X3RleHRfYnVmX3Q7Cit9OwogCiBzdGF0aWMgaW50IGxuZXRfdGJub2I7CQkJLyogdHJhY2sgdGV4dCBidWYgYWxsb2NhdGlvbiAqLwogI2RlZmluZSBMTkVUX01BWF9URVhUQlVGX05PQiAgICAgKDY0PDwxMCkJLyogYm91bmQgYWxsb2NhdGlvbiAqLwpAQCAtMzY1LDE0ICszNjUsMTQgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGxuZXRfdGV4dF9idWZfdCAqCitzdGF0aWMgc3RydWN0IGxuZXRfdGV4dF9idWZfdCAqCiBsbmV0X25ld190ZXh0X2J1ZihpbnQgc3RyX2xlbikKIHsKLQlsbmV0X3RleHRfYnVmX3QgKmx0YjsKKwlzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90ICpsdGI7CiAJaW50CSAgICAgIG5vYjsKIAogCS8qIE5CIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgdGVybWluYXRpbmcgMCAqLwotCW5vYiA9IG9mZnNldG9mKGxuZXRfdGV4dF9idWZfdCwgbHRiX3RleHRbc3RyX2xlbiArIDFdKTsKKwlub2IgPSBvZmZzZXRvZihzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LCBsdGJfdGV4dFtzdHJfbGVuICsgMV0pOwogCWlmIChub2IgPiBMTkVUX1NJTkdMRV9URVhUQlVGX05PQikgewogCQkvKiBfd2F5XyBjb25zZXJ2YXRpdmUgZm9yICJyb3V0ZSBuZXQgZ2F0ZXdheS4uLiIgKi8KIAkJQ0VSUk9SKCJ0ZXh0IGJ1ZmZlciB0b28gYmlnXG4iKTsKQEAgLTM5NSw3ICszOTUsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbG5ldF9mcmVlX3RleHRfYnVmKGxuZXRfdGV4dF9idWZfdCAqbHRiKQorbG5ldF9mcmVlX3RleHRfYnVmKHN0cnVjdCBsbmV0X3RleHRfYnVmX3QgKmx0YikKIHsKIAlsbmV0X3Ribm9iIC09IGx0Yi0+bHRiX3NpemU7CiAJTElCQ0ZTX0ZSRUUobHRiLCBsdGItPmx0Yl9zaXplKTsKQEAgLTQwNCwxMCArNDA0LDEwIEBACiBzdGF0aWMgdm9pZAogbG5ldF9mcmVlX3RleHRfYnVmcyhzdHJ1Y3QgbGlzdF9oZWFkICp0YnMpCiB7Ci0JbG5ldF90ZXh0X2J1Zl90ICAqbHRiOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICpsdGI7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkodGJzKSkgewotCQlsdGIgPSBsaXN0X2VudHJ5KHRicy0+bmV4dCwgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CisJCWx0YiA9IGxpc3RfZW50cnkodGJzLT5uZXh0LCBzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CiAKIAkJbGlzdF9kZWwoJmx0Yi0+bHRiX2xpc3QpOwogCQlsbmV0X2ZyZWVfdGV4dF9idWYobHRiKTsKQEAgLTQyMSw3ICs0MjEsNyBAQAogCWNoYXIJICAgICAqc2VwOwogCWludAkgICAgICAgbm9iOwogCWludAkgICAgICAgaTsKLQlsbmV0X3RleHRfYnVmX3QgICpsdGI7CisJc3RydWN0IGxuZXRfdGV4dF9idWZfdCAgKmx0YjsKIAogCUlOSVRfTElTVF9IRUFEKCZwZW5kaW5nKTsKIApAQCAtNDc5LDcgKzQ3OSw3IEBACiB7CiAJaW50CSAgICAgIGxlbjEgPSAoaW50KShzZXAxIC0gc3RyKTsKIAlpbnQJICAgICAgbGVuMiA9IHN0cmxlbihzZXAyICsgMSk7Ci0JbG5ldF90ZXh0X2J1Zl90ICpsdGI7CisJc3RydWN0IGxuZXRfdGV4dF9idWZfdCAqbHRiOwogCiAJTEFTU0VSVCgqc2VwMSA9PSAnWycpOwogCUxBU1NFUlQoKnNlcDIgPT0gJ10nKTsKQEAgLTUzMiwxNCArNTMyLDE4IEBACiAJCWlmIChlbmRpdGVtID09IHBhcnNlZCkJCS8qIG5vIGVtcHR5IGl0ZW1zICovCiAJCQlnb3RvIGZhaWxlZDsKIAotCQlpZiAoc3NjYW5mKHBhcnNlZCwgIiVkLSVkLyVkJW4iLCAmbG8sICZoaSwgJnN0cmlkZSwgJnNjYW5uZWQpIDwgMykgeworCQlpZiAoc3NjYW5mKHBhcnNlZCwgIiVkLSVkLyVkJW4iLCAmbG8sICZoaSwKKwkJCSAgICZzdHJpZGUsICZzY2FubmVkKSA8IDMpIHsKIAogCQkJaWYgKHNzY2FuZihwYXJzZWQsICIlZC0lZCVuIiwgJmxvLCAmaGksICZzY2FubmVkKSA8IDIpIHsKIAogCQkJCS8qIHNpbXBsZSBzdHJpbmcgZW51bWVyYXRpb24gKi8KLQkJCQlpZiAobG5ldF9leHBhbmQxdGIoJnBlbmRpbmcsIHN0ciwgc2VwLCBzZXAyLAotCQkJCQkJICAgcGFyc2VkLCAoaW50KShlbmRpdGVtIC0gcGFyc2VkKSkgIT0gMCkKKwkJCQlpZiAobG5ldF9leHBhbmQxdGIoCisJCQkJICAgICAmcGVuZGluZywgc3RyLCBzZXAsIHNlcDIsCisJCQkJICAgICBwYXJzZWQsCisJCQkJICAgICAoaW50KShlbmRpdGVtIC0gcGFyc2VkKSkgIT0gMCkgewogCQkJCQlnb3RvIGZhaWxlZDsKKwkJCQl9CiAKIAkJCQljb250aW51ZTsKIAkJCX0KQEAgLTYzMiw3ICs2MzYsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgKnRtcDI7CiAJX191MzIJICAgICBuZXQ7CiAJbG5ldF9uaWRfdAluaWQ7Ci0JbG5ldF90ZXh0X2J1Zl90ICAqbHRiOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICpsdGI7CiAJaW50CSAgICAgICByYzsKIAljaGFyCSAgICAgKnNlcDsKIAljaGFyCSAgICAgKnRva2VuID0gc3RyOwpAQCAtNjg4LDcgKzY5Miw4IEBACiAJCWxpc3RfYWRkX3RhaWwodG1wMSwgdG1wMik7CiAKIAkJd2hpbGUgKHRtcDEgIT0gdG1wMikgewotCQkJbHRiID0gbGlzdF9lbnRyeSh0bXAxLCBsbmV0X3RleHRfYnVmX3QsIGx0Yl9saXN0KTsKKwkJCWx0YiA9IGxpc3RfZW50cnkodG1wMSwgc3RydWN0IGxuZXRfdGV4dF9idWZfdCwKKwkJCQkJIGx0Yl9saXN0KTsKIAogCQkJcmMgPSBsbmV0X3N0cjJ0YnNfZXhwYW5kKHRtcDEtPm5leHQsIGx0Yi0+bHRiX3RleHQpOwogCQkJaWYgKHJjIDwgMCkKQEAgLTcyOCwxMiArNzMzLDEzIEBACiAJTEFTU0VSVCghbGlzdF9lbXB0eSgmZ2F0ZXdheXMpKTsKIAogCWxpc3RfZm9yX2VhY2godG1wMSwgJm5ldHMpIHsKLQkJbHRiID0gbGlzdF9lbnRyeSh0bXAxLCBsbmV0X3RleHRfYnVmX3QsIGx0Yl9saXN0KTsKKwkJbHRiID0gbGlzdF9lbnRyeSh0bXAxLCBzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CiAJCW5ldCA9IGxpYmNmc19zdHIybmV0KGx0Yi0+bHRiX3RleHQpOwogCQlMQVNTRVJUKG5ldCAhPSBMTkVUX05JRE5FVChMTkVUX05JRF9BTlkpKTsKIAogCQlsaXN0X2Zvcl9lYWNoKHRtcDIsICZnYXRld2F5cykgewotCQkJbHRiID0gbGlzdF9lbnRyeSh0bXAyLCBsbmV0X3RleHRfYnVmX3QsIGx0Yl9saXN0KTsKKwkJCWx0YiA9IGxpc3RfZW50cnkodG1wMiwgc3RydWN0IGxuZXRfdGV4dF9idWZfdCwKKwkJCQkJIGx0Yl9saXN0KTsKIAkJCW5pZCA9IGxpYmNmc19zdHIybmlkKGx0Yi0+bHRiX3RleHQpOwogCQkJTEFTU0VSVChuaWQgIT0gTE5FVF9OSURfQU5ZKTsKIApAQCAtNzY2LDEwICs3NzIsMTAgQEAKIHN0YXRpYyBpbnQKIGxuZXRfcGFyc2Vfcm91dGVfdGJzKHN0cnVjdCBsaXN0X2hlYWQgKnRicywgaW50ICppbV9hX3JvdXRlcikKIHsKLQlsbmV0X3RleHRfYnVmX3QgICAqbHRiOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICAqbHRiOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KHRicykpIHsKLQkJbHRiID0gbGlzdF9lbnRyeSh0YnMtPm5leHQsIGxuZXRfdGV4dF9idWZfdCwgbHRiX2xpc3QpOworCQlsdGIgPSBsaXN0X2VudHJ5KHRicy0+bmV4dCwgc3RydWN0IGxuZXRfdGV4dF9idWZfdCwgbHRiX2xpc3QpOwogCiAJCWlmIChsbmV0X3BhcnNlX3JvdXRlKGx0Yi0+bHRiX3RleHQsIGltX2Ffcm91dGVyKSA8IDApIHsKIAkJCWxuZXRfZnJlZV90ZXh0X2J1ZnModGJzKTsKQEAgLTkwMyw4ICs5MDksOCBAQAogCWludAkgICAgICAgb2Zmc2V0ID0gMDsKIAlpbnQJICAgICAgIG9mZnNldDI7CiAJaW50CSAgICAgICBsZW47Ci0JbG5ldF90ZXh0X2J1Zl90ICAqdGI7Ci0JbG5ldF90ZXh0X2J1Zl90ICAqdGIyOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICp0YjsKKwlzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90ICAqdGIyOwogCXN0cnVjdCBsaXN0X2hlYWQgICAgICAgKnQ7CiAJY2hhcgkgICAgICpzZXA7CiAJY2hhcgkgICAgICpicmFja2V0OwpAQCAtOTEzLDcgKzkxOSw3IEBACiAJTEFTU0VSVCghbGlzdF9lbXB0eShuZXRzKSk7CiAJTEFTU0VSVChuZXRzLT5uZXh0ID09IG5ldHMtPnByZXYpOyAgICAgLyogc2luZ2xlIGVudHJ5ICovCiAKLQl0YiA9IGxpc3RfZW50cnkobmV0cy0+bmV4dCwgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CisJdGIgPSBsaXN0X2VudHJ5KG5ldHMtPm5leHQsIHN0cnVjdCBsbmV0X3RleHRfYnVmX3QsIGx0Yl9saXN0KTsKIAogCWZvciAoOzspIHsKIAkJc2VwID0gc3RyY2hyKHRiLT5sdGJfdGV4dCwgJywnKTsKQEAgLTk0OSw3ICs5NTUsNyBAQAogCQl9CiAKIAkJbGlzdF9mb3JfZWFjaCh0LCBuZXRzKSB7Ci0JCQl0YjIgPSBsaXN0X2VudHJ5KHQsIGxuZXRfdGV4dF9idWZfdCwgbHRiX2xpc3QpOworCQkJdGIyID0gbGlzdF9lbnRyeSh0LCBzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CiAKIAkJCWlmICh0YjIgPT0gdGIpCiAJCQkJY29udGludWU7CkBAIC05ODgsOCArOTk0LDggQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCSAgY3VycmVudF9uZXRzOwogCXN0cnVjdCBsaXN0X2hlYWQJICp0OwogCXN0cnVjdCBsaXN0X2hlYWQJICp0MjsKLQlsbmV0X3RleHRfYnVmX3QgICAgKnRiOwotCWxuZXRfdGV4dF9idWZfdCAgICAqdGIyOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICAgKnRiOworCXN0cnVjdCBsbmV0X3RleHRfYnVmX3QgICAgKnRiMjsKIAlfX3UzMgkgICAgICAgbmV0MTsKIAlfX3UzMgkgICAgICAgbmV0MjsKIAlpbnQJCSBsZW47CkBAIC0xMDEyLDcgKzEwMTgsNyBAQAogCXJjID0gMDsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmcmF3X2VudHJpZXMpKSB7Ci0JCXRiID0gbGlzdF9lbnRyeShyYXdfZW50cmllcy5uZXh0LCBsbmV0X3RleHRfYnVmX3QsCisJCXRiID0gbGlzdF9lbnRyeShyYXdfZW50cmllcy5uZXh0LCBzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LAogCQkJCSAgICBsdGJfbGlzdCk7CiAKIAkJc3RybmNweShzb3VyY2UsIHRiLT5sdGJfdGV4dCwgc2l6ZW9mKHNvdXJjZSktMSk7CkBAIC0xMDM5LDEyICsxMDQ1LDEyIEBACiAKIAkJZHVwID0gMDsKIAkJbGlzdF9mb3JfZWFjaCh0LCAmY3VycmVudF9uZXRzKSB7Ci0JCQl0YiA9IGxpc3RfZW50cnkodCwgbG5ldF90ZXh0X2J1Zl90LCBsdGJfbGlzdCk7CisJCQl0YiA9IGxpc3RfZW50cnkodCwgc3RydWN0IGxuZXRfdGV4dF9idWZfdCwgbHRiX2xpc3QpOwogCQkJbmV0MSA9IGxuZXRfbmV0c3BlYzJuZXQodGItPmx0Yl90ZXh0KTsKIAkJCUxBU1NFUlQobmV0MSAhPSBMTkVUX05JRE5FVChMTkVUX05JRF9BTlkpKTsKIAogCQkJbGlzdF9mb3JfZWFjaCh0MiwgJm1hdGNoZWRfbmV0cykgewotCQkJCXRiMiA9IGxpc3RfZW50cnkodDIsIGxuZXRfdGV4dF9idWZfdCwKKwkJCQl0YjIgPSBsaXN0X2VudHJ5KHQyLCBzdHJ1Y3QgbG5ldF90ZXh0X2J1Zl90LAogCQkJCQkJICAgICBsdGJfbGlzdCk7CiAJCQkJbmV0MiA9IGxuZXRfbmV0c3BlYzJuZXQodGIyLT5sdGJfdGV4dCk7CiAJCQkJTEFTU0VSVChuZXQyICE9IExORVRfTklETkVUKExORVRfTklEX0FOWSkpOwpAQCAtMTA2NSw3ICsxMDcxLDcgQEAKIAkJfQogCiAJCWxpc3RfZm9yX2VhY2hfc2FmZSh0LCB0MiwgJmN1cnJlbnRfbmV0cykgewotCQkJdGIgPSBsaXN0X2VudHJ5KHQsIGxuZXRfdGV4dF9idWZfdCwgbHRiX2xpc3QpOworCQkJdGIgPSBsaXN0X2VudHJ5KHQsIHN0cnVjdCBsbmV0X3RleHRfYnVmX3QsIGx0Yl9saXN0KTsKIAogCQkJbGlzdF9kZWwoJnRiLT5sdGJfbGlzdCk7CiAJCQlsaXN0X2FkZF90YWlsKCZ0Yi0+bHRiX2xpc3QsICZtYXRjaGVkX25ldHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLWVxLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItZXEuYwppbmRleCA4NjNjYzM3Li41NDcwMTQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItZXEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItZXEuYwpAQCAtODEsOSArODEsOCBAQAogCiAJY291bnQgPSBjZnNfcG93ZXIyX3JvdW5kdXAoY291bnQpOwogCi0JaWYgKGNhbGxiYWNrICE9IExORVRfRVFfSEFORExFUl9OT05FICYmIGNvdW50ICE9IDApIHsKKwlpZiAoY2FsbGJhY2sgIT0gTE5FVF9FUV9IQU5ETEVSX05PTkUgJiYgY291bnQgIT0gMCkKIAkJQ1dBUk4oIkVRIGNhbGxiYWNrIGlzIGd1YXJhbnRlZWQgdG8gZ2V0IGV2ZXJ5IGV2ZW50LCBkbyB5b3Ugc3RpbGwgd2FudCB0byBzZXQgZXFjb3VudCAlZCBmb3IgcG9sbGluZyBldmVudCB3aGljaCB3aWxsIGhhdmUgbG9ja2luZyBvdmVyaGVhZD8gUGxlYXNlIGNvbnRhY3Qgd2l0aCBkZXZlbG9wZXIgdG8gY29uZmlybVxuIiwgY291bnQpOwotCX0KIAogCS8qIGNvdW50IGNhbiBiZSAwIGlmIG9ubHkgbmVlZCBjYWxsYmFjaywgd2UgY2FuIGVsaW1pbmF0ZQogCSAqIG92ZXJoZWFkIG9mIGVucXVldWUgZXZlbnQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1kLmMKaW5kZXggMzIyNWMwNi4uODlkNjYwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1kLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCiAJCWxtZC0+bWRfbGVuZ3RoID0gdG90YWxfbGVuZ3RoOwogCi0JCWlmICgodW1kLT5vcHRpb25zICYgTE5FVF9NRF9NQVhfU0laRSkgIT0gMCAmJiAvKiBtYXggc2l6ZSB1c2VkICovCisJCWlmICgodW1kLT5vcHRpb25zICYgTE5FVF9NRF9NQVhfU0laRSkgIT0gMCAmJiAvKiB1c2UgbWF4IHNpemUgKi8KIAkJICAgICh1bWQtPm1heF9zaXplIDwgMCB8fAogCQkgICAgIHVtZC0+bWF4X3NpemUgPiB0b3RhbF9sZW5ndGgpKSAvKiBpbGxlZ2FsIG1heF9zaXplICovCiAJCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tb3ZlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9saWItbW92ZS5jCmluZGV4IDBmNTNjNzYuLmMyZmI3MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L2xpYi1tb3ZlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvbGliLW1vdmUuYwpAQCAtMTUzMCw3ICsxNTMwLDcgQEAKIAlMQVNTRVJUKG1kLT5tZF9vZmZzZXQgPT0gMCk7CiAKIAlybGVuZ3RoID0gaGRyLT5wYXlsb2FkX2xlbmd0aDsKLQltbGVuZ3RoID0gbWluX3QoaW50LCBybGVuZ3RoLCBtZC0+bWRfbGVuZ3RoKTsKKwltbGVuZ3RoID0gbWluX3QodWludCwgcmxlbmd0aCwgbWQtPm1kX2xlbmd0aCk7CiAKIAlpZiAobWxlbmd0aCA8IHJsZW5ndGggJiYKIAkgICAgKG1kLT5tZF9vcHRpb25zICYgTE5FVF9NRF9UUlVOQ0FURSkgPT0gMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcGVlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcGVlci5jCmluZGV4IGM5M2FlODUuLjQ1YjU3NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3BlZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvbG5ldC9wZWVyLmMKQEAgLTg3LDcgKzg3LDcgQEAKIAogCWNmc19wZXJjcHRfZm9yX2VhY2gocHRhYmxlLCBpLCB0aGVfbG5ldC5sbl9wZWVyX3RhYmxlcykgewogCQloYXNoID0gcHRhYmxlLT5wdF9oYXNoOwotCQlpZiAoaGFzaCA9PSBOVUxMKSAvKiBub3QgaW50aWFsaXplZCAqLworCQlpZiAoaGFzaCA9PSBOVUxMKSAvKiBub3QgaW5pdGlhbGl6ZWQgKi8KIAkJCWJyZWFrOwogCiAJCUxBU1NFUlQobGlzdF9lbXB0eSgmcHRhYmxlLT5wdF9kZWF0aHJvdykpOwpAQCAtMTMyLDcgKzEzMiw3IEBACiAJfQogCiAJY2ZzX3BlcmNwdF9mb3JfZWFjaChwdGFibGUsIGksIHRoZV9sbmV0LmxuX3BlZXJfdGFibGVzKSB7Ci0JCUxJU1RfSEVBRAkoZGVhdGhyb3cpOworCQlMSVNUX0hFQUQoZGVhdGhyb3cpOwogCQlsbmV0X3BlZXJfdAkqbHA7CiAKIAkJbG5ldF9uZXRfbG9jayhpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9sbmV0L3JvdXRlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKaW5kZXggNTJlYzBhYi4uODUxMGJhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L2xuZXQvcm91dGVyLmMKQEAgLTEwNyw3ICsxMDcsOCBAQAogfQogCiB2b2lkCi1sbmV0X25vdGlmeV9sb2NrZWQobG5ldF9wZWVyX3QgKmxwLCBpbnQgbm90aWZ5bG5kLCBpbnQgYWxpdmUsIHVuc2lnbmVkIGxvbmcgd2hlbikKK2xuZXRfbm90aWZ5X2xvY2tlZChsbmV0X3BlZXJfdCAqbHAsIGludCBub3RpZnlsbmQsIGludCBhbGl2ZSwKKwkJICAgdW5zaWduZWQgbG9uZyB3aGVuKQogewogCWlmICh0aW1lX2JlZm9yZSh3aGVuLCBscC0+bHBfdGltZXN0YW1wKSkgeyAvKiBvdXQgb2YgZGF0ZSBpbmZvcm1hdGlvbiAqLwogCQlDREVCVUcoRF9ORVQsICJPdXQgb2YgZGF0ZVxuIik7CkBAIC0yMjUsNyArMjI2LDcgQEAKIH0KIAogbG5ldF9yZW1vdGVuZXRfdCAqCi1sbmV0X2ZpbmRfbmV0X2xvY2tlZCAoX191MzIgbmV0KQorbG5ldF9maW5kX25ldF9sb2NrZWQoX191MzIgbmV0KQogewogCWxuZXRfcmVtb3RlbmV0X3QJKnJuZXQ7CiAJc3RydWN0IGxpc3RfaGVhZAkJKnRtcDsKQEAgLTI2OSwxMiArMjcwLDExIEBACiAJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CiAJY2ZzX3NyYW5kKHR2LnR2X3NlYyBeIHNlZWRbMF0sIHR2LnR2X3VzZWMgXiBzZWVkWzFdKTsKIAlzZWVkZWQgPSAxOwotCXJldHVybjsKIH0KIAogLyogTkIgZXhwZWN0cyBMTkVUX0xPQ0sgaGVsZCAqLwogc3RhdGljIHZvaWQKLWxuZXRfYWRkX3JvdXRlX3RvX3JuZXQgKGxuZXRfcmVtb3RlbmV0X3QgKnJuZXQsIGxuZXRfcm91dGVfdCAqcm91dGUpCitsbmV0X2FkZF9yb3V0ZV90b19ybmV0KGxuZXRfcmVtb3RlbmV0X3QgKnJuZXQsIGxuZXRfcm91dGVfdCAqcm91dGUpCiB7CiAJdW5zaWduZWQgaW50ICAgICAgbGVuID0gMDsKIAl1bnNpZ25lZCBpbnQgICAgICBvZmZzZXQgPSAwOwpAQCAtMjgyLDEzICsyODIsMTMgQEAKIAogCWxuZXRfc2h1ZmZsZV9zZWVkKCk7CiAKLQlsaXN0X2Zvcl9lYWNoIChlLCAmcm5ldC0+bHJuX3JvdXRlcykgeworCWxpc3RfZm9yX2VhY2goZSwgJnJuZXQtPmxybl9yb3V0ZXMpIHsKIAkJbGVuKys7CiAJfQogCiAJLyogbGVuKzEgcG9zaXRpb25zIHRvIGFkZCBhIG5ldyBlbnRyeSwgYWxzbyBwcmV2ZW50cyBkaXZpc2lvbiBieSAwICovCiAJb2Zmc2V0ID0gY2ZzX3JhbmQoKSAlIChsZW4gKyAxKTsKLQlsaXN0X2Zvcl9lYWNoIChlLCAmcm5ldC0+bHJuX3JvdXRlcykgeworCWxpc3RfZm9yX2VhY2goZSwgJnJuZXQtPmxybl9yb3V0ZXMpIHsKIAkJaWYgKG9mZnNldCA9PSAwKQogCQkJYnJlYWs7CiAJCW9mZnNldC0tOwpAQCAtMzU0LDE3ICszNTQsMTYgQEAKIAkJTElCQ0ZTX0ZSRUUocm91dGUsIHNpemVvZigqcm91dGUpKTsKIAkJTElCQ0ZTX0ZSRUUocm5ldCwgc2l6ZW9mKCpybmV0KSk7CiAKLQkJaWYgKHJjID09IC1FSE9TVFVOUkVBQ0gpIHsgLyogZ2F0ZXdheSBpcyBub3Qgb24gYSBsb2NhbCBuZXQgKi8KKwkJaWYgKHJjID09IC1FSE9TVFVOUkVBQ0gpIC8qIGdhdGV3YXkgaXMgbm90IG9uIGEgbG9jYWwgbmV0ICovCiAJCQlyZXR1cm4gMDsJLyogaWdub3JlIHRoZSByb3V0ZSBlbnRyeSAqLwotCQl9IGVsc2UgewotCQkJQ0VSUk9SKCJFcnJvciAlZCBjcmVhdGluZyByb3V0ZSAlcyAlZCAlc1xuIiwgcmMsCi0JCQkgICAgICAgbGliY2ZzX25ldDJzdHIobmV0KSwgaG9wcywKLQkJCSAgICAgICBsaWJjZnNfbmlkMnN0cihnYXRld2F5KSk7Ci0JCX0KKwkJQ0VSUk9SKCJFcnJvciAlZCBjcmVhdGluZyByb3V0ZSAlcyAlZCAlc1xuIiwgcmMsCisJCSAgICAgICBsaWJjZnNfbmV0MnN0cihuZXQpLCBob3BzLAorCQkgICAgICAgbGliY2ZzX25pZDJzdHIoZ2F0ZXdheSkpOworCiAJCXJldHVybiByYzsKIAl9CiAKLQlMQVNTRVJUICghdGhlX2xuZXQubG5fc2h1dGRvd24pOworCUxBU1NFUlQoIXRoZV9sbmV0LmxuX3NodXRkb3duKTsKIAogCXJuZXQyID0gbG5ldF9maW5kX25ldF9sb2NrZWQobmV0KTsKIAlpZiAocm5ldDIgPT0gTlVMTCkgewpAQCAtMzc1LDcgKzM3NCw3IEBACiAKIAkvKiBTZWFyY2ggZm9yIGEgZHVwbGljYXRlIHJvdXRlIChpdCdzIGEgTk9PUCBpZiBpdCBpcykgKi8KIAlhZGRfcm91dGUgPSAxOwotCWxpc3RfZm9yX2VhY2ggKGUsICZybmV0Mi0+bHJuX3JvdXRlcykgeworCWxpc3RfZm9yX2VhY2goZSwgJnJuZXQyLT5scm5fcm91dGVzKSB7CiAJCWxuZXRfcm91dGVfdCAqcm91dGUyID0gbGlzdF9lbnRyeShlLCBsbmV0X3JvdXRlX3QsIGxyX2xpc3QpOwogCiAJCWlmIChyb3V0ZTItPmxyX2dhdGV3YXkgPT0gcm91dGUtPmxyX2dhdGV3YXkpIHsKQEAgLTM4NCw3ICszODMsNyBAQAogCQl9CiAKIAkJLyogb3VyIGxvb2t1cHMgbXVzdCBiZSB0cnVlICovCi0JCUxBU1NFUlQgKHJvdXRlMi0+bHJfZ2F0ZXdheS0+bHBfbmlkICE9IGdhdGV3YXkpOworCQlMQVNTRVJUKHJvdXRlMi0+bHJfZ2F0ZXdheS0+bHBfbmlkICE9IGdhdGV3YXkpOwogCX0KIAogCWlmIChhZGRfcm91dGUpIHsKQEAgLTU0Niw3ICs1NDUsNyBAQAogfQogCiB2b2lkCi1sbmV0X2Rlc3Ryb3lfcm91dGVzICh2b2lkKQorbG5ldF9kZXN0cm95X3JvdXRlcyh2b2lkKQogewogCWxuZXRfZGVsX3JvdXRlKExORVRfTklETkVUKExORVRfTklEX0FOWSksIExORVRfTklEX0FOWSk7CiB9CkBAIC02MDYsNyArNjA1LDYgQEAKIAkJX19zd2FiNjRzKCZzdGF0LT5uc19uaWQpOwogCQlfX3N3YWIzMnMoJnN0YXQtPm5zX3N0YXR1cyk7CiAJfQotCXJldHVybjsKIH0KIAogLyoqCkBAIC03NTgsMTMgKzc1NiwxMyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJICAqZW50cnk7CiAJaW50CQkgIGFsbF9rbm93bjsKIAotCUxBU1NFUlQgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfUlVOTklORyk7CisJTEFTU0VSVCh0aGVfbG5ldC5sbl9yY19zdGF0ZSA9PSBMTkVUX1JDX1NUQVRFX1JVTk5JTkcpOwogCiAJZm9yICg7OykgewogCQlpbnQJY3B0ID0gbG5ldF9uZXRfbG9ja19jdXJyZW50KCk7CiAKIAkJYWxsX2tub3duID0gMTsKLQkJbGlzdF9mb3JfZWFjaCAoZW50cnksICZ0aGVfbG5ldC5sbl9yb3V0ZXJzKSB7CisJCWxpc3RfZm9yX2VhY2goZW50cnksICZ0aGVfbG5ldC5sbl9yb3V0ZXJzKSB7CiAJCQlydHIgPSBsaXN0X2VudHJ5KGVudHJ5LCBsbmV0X3BlZXJfdCwgbHBfcnRyX2xpc3QpOwogCiAJCQlpZiAocnRyLT5scF9hbGl2ZV9jb3VudCA9PSAwKSB7CkBAIC04ODYsNyArODg0LDcgQEAKIAl9CiAJcmNkLT5yY2RfcGluZ2luZm8gPSBwaTsKIAotCUxBU1NFUlQgKCFMTmV0SGFuZGxlSXNJbnZhbGlkKHRoZV9sbmV0LmxuX3JjX2VxaCkpOworCUxBU1NFUlQoIUxOZXRIYW5kbGVJc0ludmFsaWQodGhlX2xuZXQubG5fcmNfZXFoKSk7CiAJcmMgPSBMTmV0TURCaW5kKChsbmV0X21kX3Qpey5zdGFydCAgICAgPSBwaSwKIAkJCQkgICAgLnVzZXJfcHRyICA9IHJjZCwKIAkJCQkgICAgLmxlbmd0aCAgICA9IExORVRfUElOR0lORk9fU0laRSwKQEAgLTkyOSw3ICs5MjcsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1sbmV0X3JvdXRlcl9jaGVja19pbnRlcnZhbCAobG5ldF9wZWVyX3QgKnJ0cikKK2xuZXRfcm91dGVyX2NoZWNrX2ludGVydmFsKGxuZXRfcGVlcl90ICpydHIpCiB7CiAJaW50IHNlY3M7CiAKQEAgLTk0Miw3ICs5NDAsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbG5ldF9waW5nX3JvdXRlcl9sb2NrZWQgKGxuZXRfcGVlcl90ICpydHIpCitsbmV0X3Bpbmdfcm91dGVyX2xvY2tlZChsbmV0X3BlZXJfdCAqcnRyKQogewogCWxuZXRfcmNfZGF0YV90ICpyY2QgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgICAgICBub3cgPSBjZnNfdGltZV9jdXJyZW50KCk7CkBAIC0xMDEwLDcgKzEwMDgsNiBAQAogCX0KIAogCWxuZXRfcGVlcl9kZWNyZWZfbG9ja2VkKHJ0cik7Ci0JcmV0dXJuOwogfQogCiBpbnQKQEAgLTEwMTksNyArMTAxNiw3IEBACiAJaW50CSAgcmM7CiAJaW50CSAgZXFzejsKIAotCUxBU1NFUlQgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfU0hVVERPV04pOworCUxBU1NFUlQodGhlX2xuZXQubG5fcmNfc3RhdGUgPT0gTE5FVF9SQ19TVEFURV9TSFVURE9XTik7CiAKIAlpZiAoY2hlY2tfcm91dGVyc19iZWZvcmVfdXNlICYmCiAJICAgIGRlYWRfcm91dGVyX2NoZWNrX2ludGVydmFsIDw9IDApIHsKQEAgLTEwNjcsMTQgKzEwNjQsMTQgQEAKIH0KIAogdm9pZAotbG5ldF9yb3V0ZXJfY2hlY2tlcl9zdG9wICh2b2lkKQorbG5ldF9yb3V0ZXJfY2hlY2tlcl9zdG9wKHZvaWQpCiB7CiAJaW50IHJjOwogCiAJaWYgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfU0hVVERPV04pCiAJCXJldHVybjsKIAotCUxBU1NFUlQgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfUlVOTklORyk7CisJTEFTU0VSVCh0aGVfbG5ldC5sbl9yY19zdGF0ZSA9PSBMTkVUX1JDX1NUQVRFX1JVTk5JTkcpOwogCXRoZV9sbmV0LmxuX3JjX3N0YXRlID0gTE5FVF9SQ19TVEFURV9TVE9QUElORzsKIAogCS8qIGJsb2NrIHVudGlsIGV2ZW50IGNhbGxiYWNrIHNpZ25hbHMgZXhpdCAqLwpAQCAtMTA4Miw4ICsxMDc5LDcgQEAKIAlMQVNTRVJUKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfU0hVVERPV04pOwogCiAJcmMgPSBMTmV0RVFGcmVlKHRoZV9sbmV0LmxuX3JjX2VxaCk7Ci0JTEFTU0VSVCAocmMgPT0gMCk7Ci0JcmV0dXJuOworCUxBU1NFUlQocmMgPT0gMCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMTc4LDcgKzExNzQsNyBAQAogCiAJY2ZzX2Jsb2NrX2FsbHNpZ3MoKTsKIAotCUxBU1NFUlQgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfUlVOTklORyk7CisJTEFTU0VSVCh0aGVfbG5ldC5sbl9yY19zdGF0ZSA9PSBMTkVUX1JDX1NUQVRFX1JVTk5JTkcpOwogCiAJd2hpbGUgKHRoZV9sbmV0LmxuX3JjX3N0YXRlID09IExORVRfUkNfU1RBVEVfUlVOTklORykgewogCQlfX3U2NAl2ZXJzaW9uOwpAQCAtMTI5MSwxMSArMTI4NywxMSBAQAogCWlmIChyYnAtPnJicF9uYnVmZmVycyA9PSAwKSAvKiBub3QgaW5pdGlhbGl6ZWQgb3IgYWxyZWFkeSBmcmVlZCAqLwogCQlyZXR1cm47CiAKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZyYnAtPnJicF9tc2dzKSk7Ci0JTEFTU0VSVCAocmJwLT5yYnBfY3JlZGl0cyA9PSByYnAtPnJicF9uYnVmZmVycyk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZyYnAtPnJicF9tc2dzKSk7CisJTEFTU0VSVChyYnAtPnJicF9jcmVkaXRzID09IHJicC0+cmJwX25idWZmZXJzKTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmcmJwLT5yYnBfYnVmcykpIHsKLQkJTEFTU0VSVCAocmJwLT5yYnBfY3JlZGl0cyA+IDApOworCQlMQVNTRVJUKHJicC0+cmJwX2NyZWRpdHMgPiAwKTsKIAogCQlyYiA9IGxpc3RfZW50cnkocmJwLT5yYnBfYnVmcy5uZXh0LAogCQkJCSAgICBsbmV0X3J0cmJ1Zl90LCByYl9saXN0KTsKQEAgLTEzMDQsOCArMTMwMCw4IEBACiAJCW5idWZmZXJzKys7CiAJfQogCi0JTEFTU0VSVCAocmJwLT5yYnBfbmJ1ZmZlcnMgPT0gbmJ1ZmZlcnMpOwotCUxBU1NFUlQgKHJicC0+cmJwX2NyZWRpdHMgPT0gbmJ1ZmZlcnMpOworCUxBU1NFUlQocmJwLT5yYnBfbmJ1ZmZlcnMgPT0gbmJ1ZmZlcnMpOworCUxBU1NFUlQocmJwLT5yYnBfY3JlZGl0cyA9PSBuYnVmZmVycyk7CiAKIAlyYnAtPnJicF9uYnVmZmVycyA9IHJicC0+cmJwX2NyZWRpdHMgPSAwOwogfQpAQCAtMTMxNyw3ICsxMzEzLDcgQEAKIAlpbnQJICAgIGk7CiAKIAlpZiAocmJwLT5yYnBfbmJ1ZmZlcnMgIT0gMCkgewotCQlMQVNTRVJUIChyYnAtPnJicF9uYnVmZmVycyA9PSBuYnVmcyk7CisJCUxBU1NFUlQocmJwLT5yYnBfbmJ1ZmZlcnMgPT0gbmJ1ZnMpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTEzMzcsMTAgKzEzMzMsMTAgQEAKIAogCQkvKiBObyBhbGxvY2F0aW9uICJ1bmRlciBmaXJlIiAqLwogCQkvKiBPdGhlcndpc2Ugd2UnZCBuZWVkIGNvZGUgdG8gc2NoZWR1bGUgYmxvY2tlZCBtc2dzIGV0YyAqLwotCQlMQVNTRVJUICghdGhlX2xuZXQubG5fcm91dGluZyk7CisJCUxBU1NFUlQoIXRoZV9sbmV0LmxuX3JvdXRpbmcpOwogCX0KIAotCUxBU1NFUlQgKHJicC0+cmJwX2NyZWRpdHMgPT0gbmJ1ZnMpOworCUxBU1NFUlQocmJwLT5yYnBfY3JlZGl0cyA9PSBuYnVmcyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0MzUsNyArMTQzMSw3IEBACiBsbmV0X3J0cnBvb2xzX2FsbG9jKGludCBpbV9hX3JvdXRlcikKIHsKIAlsbmV0X3J0cmJ1ZnBvb2xfdCAqcnRycDsKLQlpbnQJbGFyZ2VfcGFnZXMgPSAoTE5FVF9NVFUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PiBQQUdFX0NBQ0hFX1NISUZUOworCWludAlsYXJnZV9wYWdlczsKIAlpbnQJc21hbGxfcGFnZXMgPSAxOwogCWludAlucmJfdGlueTsKIAlpbnQJbnJiX3NtYWxsOwpAQCAtMTQ0Myw2ICsxNDM5LDggQEAKIAlpbnQJcmM7CiAJaW50CWk7CiAKKwlsYXJnZV9wYWdlcyA9IChMTkVUX01UVSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisKIAlpZiAoIXN0cmNtcChmb3J3YXJkaW5nLCAiIikpIHsKIAkJLyogbm90IHNldCBlaXRoZXIgd2F5ICovCiAJCWlmICghaW1fYV9yb3V0ZXIpCkBAIC0xNTEzLDE2ICsxNTExLDE2IEBACiAJdW5zaWduZWQgbG9uZwkJbm93ID0gY2ZzX3RpbWVfY3VycmVudCgpOwogCWludAkJCWNwdCA9IGxuZXRfY3B0X29mX25pZChuaWQpOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCAoKSk7CisJTEFTU0VSVCghaW5faW50ZXJydXB0ICgpKTsKIAotCUNERUJVRyAoRF9ORVQsICIlcyBub3RpZnlpbmcgJXM6ICVzXG4iLAorCUNERUJVRyhEX05FVCwgIiVzIG5vdGlmeWluZyAlczogJXNcbiIsCiAJCShuaSA9PSBOVUxMKSA/ICJ1c2Vyc3BhY2UiIDogbGliY2ZzX25pZDJzdHIobmktPm5pX25pZCksCiAJCWxpYmNmc19uaWQyc3RyKG5pZCksCiAJCWFsaXZlID8gInVwIiA6ICJkb3duIik7CiAKIAlpZiAobmkgIT0gTlVMTCAmJgogCSAgICBMTkVUX05JRE5FVChuaS0+bmlfbmlkKSAhPSBMTkVUX05JRE5FVChuaWQpKSB7Ci0JCUNXQVJOICgiSWdub3Jpbmcgbm90aWZpY2F0aW9uIG9mICVzICVzIGJ5ICVzIChkaWZmZXJlbnQgbmV0KVxuIiwKKwkJQ1dBUk4oIklnbm9yaW5nIG5vdGlmaWNhdGlvbiBvZiAlcyAlcyBieSAlcyAoZGlmZmVyZW50IG5ldClcbiIsCiAJCQlsaWJjZnNfbmlkMnN0cihuaWQpLCBhbGl2ZSA/ICJiaXJ0aCIgOiAiZGVhdGgiLAogCQkJbGliY2ZzX25pZDJzdHIobmktPm5pX25pZCkpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1NzcsMjEgKzE1NzUsMjAgQEAKIEVYUE9SVF9TWU1CT0wobG5ldF9ub3RpZnkpOwogCiB2b2lkCi1sbmV0X2dldF90dW5hYmxlcyAodm9pZCkKK2xuZXRfZ2V0X3R1bmFibGVzKHZvaWQpCiB7Ci0JcmV0dXJuOwogfQogCiAjZWxzZQogCiBpbnQKLWxuZXRfbm90aWZ5IChsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCwgaW50IGFsaXZlLCB1bnNpZ25lZCBsb25nIHdoZW4pCitsbmV0X25vdGlmeShsbmV0X25pX3QgKm5pLCBsbmV0X25pZF90IG5pZCwgaW50IGFsaXZlLCB1bnNpZ25lZCBsb25nIHdoZW4pCiB7CiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQogCiB2b2lkCi1sbmV0X3JvdXRlcl9jaGVja2VyICh2b2lkKQorbG5ldF9yb3V0ZXJfY2hlY2tlcih2b2lkKQogewogCXN0YXRpYyB0aW1lX3QgbGFzdDsKIAlzdGF0aWMgaW50ICAgIHJ1bm5pbmc7CkBAIC0xNjQzLDcgKzE2NDAsNyBAQAogCQkJYWJvcnQoKTsKIAkJfQogCi0JCUxBU1NFUlQgKHJjID09IDEpOworCQlMQVNTRVJUKHJjID09IDEpOwogCiAJCWxuZXRfcm91dGVyX2NoZWNrZXJfZXZlbnQoJmV2KTsKIAl9CkBAIC0xNjU1LDI2ICsxNjUyLDI1IEBACiAJCXJldHVybjsKIAl9CiAKLQlMQVNTRVJUICh0aGVfbG5ldC5sbl9yY19zdGF0ZSA9PSBMTkVUX1JDX1NUQVRFX1JVTk5JTkcpOworCUxBU1NFUlQodGhlX2xuZXQubG5fcmNfc3RhdGUgPT0gTE5FVF9SQ19TVEFURV9SVU5OSU5HKTsKIAogCWxuZXRfbmV0X2xvY2soMCk7CiAKIAl2ZXJzaW9uID0gdGhlX2xuZXQubG5fcm91dGVyc192ZXJzaW9uOwotCWxpc3RfZm9yX2VhY2hfZW50cnkgKHJ0ciwgJnRoZV9sbmV0LmxuX3JvdXRlcnMsIGxwX3J0cl9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShydHIsICZ0aGVfbG5ldC5sbl9yb3V0ZXJzLCBscF9ydHJfbGlzdCkgewogCQlsbmV0X3Bpbmdfcm91dGVyX2xvY2tlZChydHIpOwotCQlMQVNTRVJUICh2ZXJzaW9uID09IHRoZV9sbmV0LmxuX3JvdXRlcnNfdmVyc2lvbik7CisJCUxBU1NFUlQodmVyc2lvbiA9PSB0aGVfbG5ldC5sbl9yb3V0ZXJzX3ZlcnNpb24pOwogCX0KIAogCWxuZXRfbmV0X3VubG9jaygwKTsKIAogCXJ1bm5pbmcgPSAwOyAvKiBsb2NrIG9ubHkgbmVlZGVkIGZvciB0aGUgcmVjdXJzaW9uIGNoZWNrICovCi0JcmV0dXJuOwogfQogCiAvKiBOQiBsbmV0X3BlZXJzX3N0YXJ0X2Rvd24gZGVwZW5kcyBvbiBtZSwKICAqIHNvIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgcGVlciBjcmVhdGlvbiAqLwogdm9pZAotbG5ldF9nZXRfdHVuYWJsZXMgKHZvaWQpCitsbmV0X2dldF90dW5hYmxlcyh2b2lkKQogewogCWNoYXIgKnM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9icndfdGVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2Jyd190ZXN0LmMKaW5kZXggNDYzZGEwNy4uNjU4ZjQ1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2Jyd190ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2Jyd190ZXN0LmMKQEAgLTE3NSw3ICsxNzUsNiBAQAogCX0KIAogCUxCVUcoKTsKLQlyZXR1cm47CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25jdGwuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25jdGwuYwppbmRleCBmYmZmODRjLi4wNDVmZTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uY3RsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbmN0bC5jCkBAIC0yMDMsNyArMjAzLDcgQEAKIAlpZiAoYXJncy0+bHN0aW9fZ3JwX2tleSAhPSBjb25zb2xlX3Nlc3Npb24uc2VzX2tleSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKLQlpZiAoYXJncy0+bHN0aW9fZ3JwX25hbWVwID09IE5VTEx8fAorCWlmIChhcmdzLT5sc3Rpb19ncnBfbmFtZXAgPT0gTlVMTCB8fAogCSAgICBhcmdzLT5sc3Rpb19ncnBfbm1sZW4gPD0gMCB8fAogCSAgICBhcmdzLT5sc3Rpb19ncnBfbm1sZW4gPiBMU1RfTkFNRV9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg1Nyw2MiArODU3LDYyIEBACiAJbWVtc2V0KCZjb25zb2xlX3Nlc3Npb24uc2VzX3RyYW5zX3N0YXQsIDAsIHNpemVvZihsc3Rjb25fdHJhbnNfc3RhdF90KSk7CiAKIAlzd2l0Y2ggKG9wYykgewotCQljYXNlIExTVElPX1NFU1NJT05fTkVXOgotCQkJcmMgPSBsc3Rfc2Vzc2lvbl9uZXdfaW9jdGwoKGxzdGlvX3Nlc3Npb25fbmV3X2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19TRVNTSU9OX0VORDoKLQkJCXJjID0gbHN0X3Nlc3Npb25fZW5kX2lvY3RsKChsc3Rpb19zZXNzaW9uX2VuZF9hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fU0VTU0lPTl9JTkZPOgotCQkJcmMgPSBsc3Rfc2Vzc2lvbl9pbmZvX2lvY3RsKChsc3Rpb19zZXNzaW9uX2luZm9fYXJnc190ICopYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIExTVElPX0RFQlVHOgotCQkJcmMgPSBsc3RfZGVidWdfaW9jdGwoKGxzdGlvX2RlYnVnX2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19HUk9VUF9BREQ6Ci0JCQlyYyA9IGxzdF9ncm91cF9hZGRfaW9jdGwoKGxzdGlvX2dyb3VwX2FkZF9hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fR1JPVVBfREVMOgotCQkJcmMgPSBsc3RfZ3JvdXBfZGVsX2lvY3RsKChsc3Rpb19ncm91cF9kZWxfYXJnc190ICopYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIExTVElPX0dST1VQX1VQREFURToKLQkJCXJjID0gbHN0X2dyb3VwX3VwZGF0ZV9pb2N0bCgobHN0aW9fZ3JvdXBfdXBkYXRlX2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19OT0RFU19BREQ6Ci0JCQlyYyA9IGxzdF9ub2Rlc19hZGRfaW9jdGwoKGxzdGlvX2dyb3VwX25vZGVzX2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19HUk9VUF9MSVNUOgotCQkJcmMgPSBsc3RfZ3JvdXBfbGlzdF9pb2N0bCgobHN0aW9fZ3JvdXBfbGlzdF9hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fR1JPVVBfSU5GTzoKLQkJCXJjID0gbHN0X2dyb3VwX2luZm9faW9jdGwoKGxzdGlvX2dyb3VwX2luZm9fYXJnc190ICopYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIExTVElPX0JBVENIX0FERDoKLQkJCXJjID0gbHN0X2JhdGNoX2FkZF9pb2N0bCgobHN0aW9fYmF0Y2hfYWRkX2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19CQVRDSF9TVEFSVDoKLQkJCXJjID0gbHN0X2JhdGNoX3J1bl9pb2N0bCgobHN0aW9fYmF0Y2hfcnVuX2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19CQVRDSF9TVE9QOgotCQkJcmMgPSBsc3RfYmF0Y2hfc3RvcF9pb2N0bCgobHN0aW9fYmF0Y2hfc3RvcF9hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fQkFUQ0hfUVVFUlk6Ci0JCQlyYyA9IGxzdF9iYXRjaF9xdWVyeV9pb2N0bCgobHN0aW9fYmF0Y2hfcXVlcnlfYXJnc190ICopYnVmKTsKLQkJCWJyZWFrOwotCQljYXNlIExTVElPX0JBVENIX0xJU1Q6Ci0JCQlyYyA9IGxzdF9iYXRjaF9saXN0X2lvY3RsKChsc3Rpb19iYXRjaF9saXN0X2FyZ3NfdCAqKWJ1Zik7Ci0JCQlicmVhazsKLQkJY2FzZSBMU1RJT19CQVRDSF9JTkZPOgotCQkJcmMgPSBsc3RfYmF0Y2hfaW5mb19pb2N0bCgobHN0aW9fYmF0Y2hfaW5mb19hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fVEVTVF9BREQ6Ci0JCQlyYyA9IGxzdF90ZXN0X2FkZF9pb2N0bCgobHN0aW9fdGVzdF9hcmdzX3QgKilidWYpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTFNUSU9fU1RBVF9RVUVSWToKLQkJCXJjID0gbHN0X3N0YXRfcXVlcnlfaW9jdGwoKGxzdGlvX3N0YXRfYXJnc190ICopYnVmKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmMgPSAtRUlOVkFMOworCWNhc2UgTFNUSU9fU0VTU0lPTl9ORVc6CisJCXJjID0gbHN0X3Nlc3Npb25fbmV3X2lvY3RsKChsc3Rpb19zZXNzaW9uX25ld19hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX1NFU1NJT05fRU5EOgorCQlyYyA9IGxzdF9zZXNzaW9uX2VuZF9pb2N0bCgobHN0aW9fc2Vzc2lvbl9lbmRfYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19TRVNTSU9OX0lORk86CisJCXJjID0gbHN0X3Nlc3Npb25faW5mb19pb2N0bCgobHN0aW9fc2Vzc2lvbl9pbmZvX2FyZ3NfdCAqKWJ1Zik7CisJCWJyZWFrOworCWNhc2UgTFNUSU9fREVCVUc6CisJCXJjID0gbHN0X2RlYnVnX2lvY3RsKChsc3Rpb19kZWJ1Z19hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX0dST1VQX0FERDoKKwkJcmMgPSBsc3RfZ3JvdXBfYWRkX2lvY3RsKChsc3Rpb19ncm91cF9hZGRfYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19HUk9VUF9ERUw6CisJCXJjID0gbHN0X2dyb3VwX2RlbF9pb2N0bCgobHN0aW9fZ3JvdXBfZGVsX2FyZ3NfdCAqKWJ1Zik7CisJCWJyZWFrOworCWNhc2UgTFNUSU9fR1JPVVBfVVBEQVRFOgorCQlyYyA9IGxzdF9ncm91cF91cGRhdGVfaW9jdGwoKGxzdGlvX2dyb3VwX3VwZGF0ZV9hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX05PREVTX0FERDoKKwkJcmMgPSBsc3Rfbm9kZXNfYWRkX2lvY3RsKChsc3Rpb19ncm91cF9ub2Rlc19hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX0dST1VQX0xJU1Q6CisJCXJjID0gbHN0X2dyb3VwX2xpc3RfaW9jdGwoKGxzdGlvX2dyb3VwX2xpc3RfYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19HUk9VUF9JTkZPOgorCQlyYyA9IGxzdF9ncm91cF9pbmZvX2lvY3RsKChsc3Rpb19ncm91cF9pbmZvX2FyZ3NfdCAqKWJ1Zik7CisJCWJyZWFrOworCWNhc2UgTFNUSU9fQkFUQ0hfQUREOgorCQlyYyA9IGxzdF9iYXRjaF9hZGRfaW9jdGwoKGxzdGlvX2JhdGNoX2FkZF9hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX0JBVENIX1NUQVJUOgorCQlyYyA9IGxzdF9iYXRjaF9ydW5faW9jdGwoKGxzdGlvX2JhdGNoX3J1bl9hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX0JBVENIX1NUT1A6CisJCXJjID0gbHN0X2JhdGNoX3N0b3BfaW9jdGwoKGxzdGlvX2JhdGNoX3N0b3BfYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19CQVRDSF9RVUVSWToKKwkJcmMgPSBsc3RfYmF0Y2hfcXVlcnlfaW9jdGwoKGxzdGlvX2JhdGNoX3F1ZXJ5X2FyZ3NfdCAqKWJ1Zik7CisJCWJyZWFrOworCWNhc2UgTFNUSU9fQkFUQ0hfTElTVDoKKwkJcmMgPSBsc3RfYmF0Y2hfbGlzdF9pb2N0bCgobHN0aW9fYmF0Y2hfbGlzdF9hcmdzX3QgKilidWYpOworCQlicmVhazsKKwljYXNlIExTVElPX0JBVENIX0lORk86CisJCXJjID0gbHN0X2JhdGNoX2luZm9faW9jdGwoKGxzdGlvX2JhdGNoX2luZm9fYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19URVNUX0FERDoKKwkJcmMgPSBsc3RfdGVzdF9hZGRfaW9jdGwoKGxzdGlvX3Rlc3RfYXJnc190ICopYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBMU1RJT19TVEFUX1FVRVJZOgorCQlyYyA9IGxzdF9zdGF0X3F1ZXJ5X2lvY3RsKChsc3Rpb19zdGF0X2FyZ3NfdCAqKWJ1Zik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKIAl9CiAKIAlpZiAoY29weV90b191c2VyKGRhdGEtPmlvY19wYnVmMiwgJmNvbnNvbGVfc2Vzc2lvbi5zZXNfdHJhbnNfc3RhdCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5jCmluZGV4IDFlMGFmYzIuLjJiNWY1M2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuYwpAQCAtNjQsNyArNjQsNyBAQAogc3RhdGljIHZvaWQKIGxzdGNvbl9ub2RlX2dldChsc3Rjb25fbm9kZV90ICpuZCkKIHsKLQlMQVNTRVJUIChuZC0+bmRfcmVmID49IDEpOworCUxBU1NFUlQobmQtPm5kX3JlZiA+PSAxKTsKIAogCW5kLT5uZF9yZWYrKzsKIH0KQEAgLTc1LDcgKzc1LDcgQEAKIAlsc3Rjb25fbmRsaW5rX3QgKm5kbDsKIAl1bnNpZ25lZCBpbnQgICAgIGlkeCA9IExORVRfTklEQUREUihpZC5uaWQpICUgTFNUX0dMT0JBTF9IQVNIU0laRTsKIAotCUxBU1NFUlQgKGlkLm5pZCAhPSBMTkVUX05JRF9BTlkpOworCUxBU1NFUlQoaWQubmlkICE9IExORVRfTklEX0FOWSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5kbCwgJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbmRsX2hhc2hbaWR4XSwgbmRsX2hsaW5rKSB7CiAJCWlmIChuZGwtPm5kbF9ub2RlLT5uZF9pZC5uaWQgIT0gaWQubmlkIHx8CkBAIC0xMTksMTUgKzExOSwxNSBAQAogewogCWxzdGNvbl9uZGxpbmtfdCAgKm5kbDsKIAotCUxBU1NFUlQgKG5kLT5uZF9yZWYgPiAwKTsKKwlMQVNTRVJUKG5kLT5uZF9yZWYgPiAwKTsKIAogCWlmICgtLW5kLT5uZF9yZWYgPiAwKQogCQlyZXR1cm47CiAKIAluZGwgPSAobHN0Y29uX25kbGlua190ICopKG5kICsgMSk7CiAKLQlMQVNTRVJUICghbGlzdF9lbXB0eSgmbmRsLT5uZGxfbGluaykpOwotCUxBU1NFUlQgKCFsaXN0X2VtcHR5KCZuZGwtPm5kbF9obGluaykpOworCUxBU1NFUlQoIWxpc3RfZW1wdHkoJm5kbC0+bmRsX2xpbmspKTsKKwlMQVNTRVJUKCFsaXN0X2VtcHR5KCZuZGwtPm5kbF9obGluaykpOwogCiAJLyogcmVtb3ZlIGZyb20gc2Vzc2lvbiAqLwogCWxpc3RfZGVsKCZuZGwtPm5kbF9saW5rKTsKQEAgLTE4NCw4ICsxODQsOCBAQAogc3RhdGljIHZvaWQKIGxzdGNvbl9uZGxpbmtfcmVsZWFzZShsc3Rjb25fbmRsaW5rX3QgKm5kbCkKIHsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZuZGwtPm5kbF9saW5rKSk7Ci0JTEFTU0VSVCAoIWxpc3RfZW1wdHkoJm5kbC0+bmRsX2hsaW5rKSk7CisJTEFTU0VSVChsaXN0X2VtcHR5KCZuZGwtPm5kbF9saW5rKSk7CisJTEFTU0VSVCghbGlzdF9lbXB0eSgmbmRsLT5uZGxfaGxpbmspKTsKIAogCWxpc3RfZGVsKCZuZGwtPm5kbF9obGluayk7IC8qIGRlbGV0ZSBmcm9tIGhhc2ggKi8KIAlsc3Rjb25fbm9kZV9wdXQobmRsLT5uZGxfbm9kZSk7CkBAIC0yNTQsNyArMjU0LDcgQEAKIAlsc3Rjb25fZ3JvdXBfZHJhaW4oZ3JwLCAwKTsKIAogCWZvciAoaSA9IDA7IGkgPCBMU1RfTk9ERV9IQVNIU0laRTsgaSsrKSB7Ci0JCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmdycC0+Z3JwX25kbF9oYXNoW2ldKSk7CisJCUxBU1NFUlQobGlzdF9lbXB0eSgmZ3JwLT5ncnBfbmRsX2hhc2hbaV0pKTsKIAl9CiAKIAlMSUJDRlNfRlJFRShncnAsIG9mZnNldG9mKGxzdGNvbl9ncm91cF90LApAQCAtNTUyLDggKzU1Miw4IEBACiAJbHN0Y29uX2dyb3VwX3QJICpncnA7CiAJaW50CQkgICAgIHJjOwogCi0JTEFTU0VSVCAoY291bnQgPiAwKTsKLQlMQVNTRVJUIChpZHNfdXAgIT0gTlVMTCk7CisJTEFTU0VSVChjb3VudCA+IDApOworCUxBU1NFUlQoaWRzX3VwICE9IE5VTEwpOwogCiAJcmMgPSBsc3Rjb25fZ3JvdXBfZmluZChuYW1lLCAmZ3JwKTsKIAlpZiAocmMgIT0gMCkgewpAQCAtNzI2LDggKzcyNiw4IEBACiB7CiAJbHN0Y29uX2dyb3VwX3QgKmdycDsKIAotCUxBU1NFUlQgKGluZGV4ID49IDApOwotCUxBU1NFUlQgKG5hbWVfdXAgIT0gTlVMTCk7CisJTEFTU0VSVChpbmRleCA+PSAwKTsKKwlMQVNTRVJUKG5hbWVfdXAgIT0gTlVMTCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGdycCwgJmNvbnNvbGVfc2Vzc2lvbi5zZXNfZ3JwX2xpc3QsIGdycF9saW5rKSB7CiAJCWlmIChpbmRleC0tID09IDApIHsKQEAgLTc0OCwxMCArNzQ4LDEwIEBACiAJaW50CSAgICAgICBjb3VudCA9IDA7CiAJaW50CSAgICAgICBpbmRleCA9IDA7CiAKLQlMQVNTRVJUIChpbmRleF9wICE9IE5VTEwgJiYgY291bnRfcCAhPSBOVUxMKTsKLQlMQVNTRVJUIChkZW50c191cCAhPSBOVUxMKTsKLQlMQVNTRVJUICgqaW5kZXhfcCA+PSAwKTsKLQlMQVNTRVJUICgqY291bnRfcCA+IDApOworCUxBU1NFUlQoaW5kZXhfcCAhPSBOVUxMICYmIGNvdW50X3AgIT0gTlVMTCk7CisJTEFTU0VSVChkZW50c191cCAhPSBOVUxMKTsKKwlMQVNTRVJUKCppbmRleF9wID49IDApOworCUxBU1NFUlQoKmNvdW50X3AgPiAwKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobmRsLCBoZWFkLCBuZGxfbGluaykgewogCQlpZiAoaW5kZXgrKyA8ICppbmRleF9wKQpAQCAtOTA1LDggKzkwNSw4IEBACiB7CiAJbHN0Y29uX2JhdGNoX3QgICAgKmJhdDsKIAotCUxBU1NFUlQgKG5hbWVfdXAgIT0gTlVMTCk7Ci0JTEFTU0VSVCAoaW5kZXggPj0gMCk7CisJTEFTU0VSVChuYW1lX3VwICE9IE5VTEwpOworCUxBU1NFUlQoaW5kZXggPj0gMCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJhdCwgJmNvbnNvbGVfc2Vzc2lvbi5zZXNfYmF0X2xpc3QsIGJhdF9saW5rKSB7CiAJCWlmIChpbmRleC0tID09IDApIHsKQEAgLTEwOTMsNyArMTA5Myw3IEBACiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZiYXQtPmJhdF90ZXN0X2xpc3QpKSB7CiAJCXRlc3QgPSBsaXN0X2VudHJ5KGJhdC0+YmF0X3Rlc3RfbGlzdC5uZXh0LAogCQkJCSAgICAgIGxzdGNvbl90ZXN0X3QsIHRlc19saW5rKTsKLQkJTEFTU0VSVCAobGlzdF9lbXB0eSgmdGVzdC0+dGVzX3RyYW5zX2xpc3QpKTsKKwkJTEFTU0VSVChsaXN0X2VtcHR5KCZ0ZXN0LT50ZXNfdHJhbnNfbGlzdCkpOwogCiAJCWxpc3RfZGVsKCZ0ZXN0LT50ZXNfbGluayk7CiAKQEAgLTExMDQsNyArMTEwNCw3IEBACiAJCQkJCSAgIHRlc19wYXJhbVt0ZXN0LT50ZXNfcGFyYW1sZW5dKSk7CiAJfQogCi0JTEFTU0VSVCAobGlzdF9lbXB0eSgmYmF0LT5iYXRfdHJhbnNfbGlzdCkpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmYmF0LT5iYXRfdHJhbnNfbGlzdCkpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZiYXQtPmJhdF9jbGlfbGlzdCkpIHsKIAkJbmRsID0gbGlzdF9lbnRyeShiYXQtPmJhdF9jbGlfbGlzdC5uZXh0LApAQCAtMTEyMyw4ICsxMTIzLDggQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTFNUX05PREVfSEFTSFNJWkU7IGkrKykgewotCQlMQVNTRVJUIChsaXN0X2VtcHR5KCZiYXQtPmJhdF9jbGlfaGFzaFtpXSkpOwotCQlMQVNTRVJUIChsaXN0X2VtcHR5KCZiYXQtPmJhdF9zcnZfaGFzaFtpXSkpOworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmJhdC0+YmF0X2NsaV9oYXNoW2ldKSk7CisJCUxBU1NFUlQobGlzdF9lbXB0eSgmYmF0LT5iYXRfc3J2X2hhc2hbaV0pKTsKIAl9CiAKIAlMSUJDRlNfRlJFRShiYXQtPmJhdF9jbGlfaGFzaCwKQEAgLTExNDQsMTAgKzExNDQsMTAgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICpoZWFkOwogCiAJdGVzdCA9IChsc3Rjb25fdGVzdF90ICopYXJnOwotCUxBU1NFUlQgKHRlc3QgIT0gTlVMTCk7CisJTEFTU0VSVCh0ZXN0ICE9IE5VTEwpOwogCiAJYmF0Y2ggPSB0ZXN0LT50ZXNfYmF0Y2g7Ci0JTEFTU0VSVCAoYmF0Y2ggIT0gTlVMTCk7CisJTEFTU0VSVChiYXRjaCAhPSBOVUxMKTsKIAogCWlmICh0ZXN0LT50ZXNfb25lc2lkZSAmJgogCSAgICB0cmFuc29wID09IExTVF9UUkFOU19UU0JTUlZBREQpCkBAIC0xMTYxLDEzICsxMTYxLDEzIEBACiAJCWhlYWQgPSAmYmF0Y2gtPmJhdF9jbGlfbGlzdDsKIAogCX0gZWxzZSB7Ci0JCUxBU1NFUlQgKHRyYW5zb3AgPT0gTFNUX1RSQU5TX1RTQlNSVkFERCk7CisJCUxBU1NFUlQodHJhbnNvcCA9PSBMU1RfVFJBTlNfVFNCU1JWQUREKTsKIAogCQloYXNoID0gYmF0Y2gtPmJhdF9zcnZfaGFzaDsKIAkJaGVhZCA9ICZiYXRjaC0+YmF0X3Nydl9saXN0OwogCX0KIAotCUxBU1NFUlQgKG5kLT5uZF9pZC5uaWQgIT0gTE5FVF9OSURfQU5ZKTsKKwlMQVNTRVJUKG5kLT5uZF9pZC5uaWQgIT0gTE5FVF9OSURfQU5ZKTsKIAogCWlmIChsc3Rjb25fbmRsaW5rX2ZpbmQoaGFzaCwgbmQtPm5kX2lkLCAmbmRsLCAxKSAhPSAwKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTExODYsOCArMTE4Niw4IEBACiAJaW50CQkgICAgIHRyYW5zb3A7CiAJaW50CQkgICAgIHJjOwogCi0JTEFTU0VSVCAodGVzdC0+dGVzX3NyY19ncnAgIT0gTlVMTCk7Ci0JTEFTU0VSVCAodGVzdC0+dGVzX2RzdF9ncnAgIT0gTlVMTCk7CisJTEFTU0VSVCh0ZXN0LT50ZXNfc3JjX2dycCAhPSBOVUxMKTsKKwlMQVNTRVJUKHRlc3QtPnRlc19kc3RfZ3JwICE9IE5VTEwpOwogCiAJdHJhbnNvcCA9IExTVF9UUkFOU19UU0JTUlZBREQ7CiAJZ3JwICA9IHRlc3QtPnRlc19kc3RfZ3JwOwpAQCAtMTM4Miw3ICsxMzgyLDcgQEAKIHsKIAlzcnBjX2JhdGNoX3JlcGx5X3QgKnJlcCA9ICZtc2ctPm1zZ19ib2R5LmJhdF9yZXBseTsKIAotCUxBU1NFUlQgKHRyYW5zb3AgPT0gTFNUX1RSQU5TX1RTQkNMSVFSWSB8fAorCUxBU1NFUlQodHJhbnNvcCA9PSBMU1RfVFJBTlNfVFNCQ0xJUVJZIHx8CiAJCSB0cmFuc29wID09IExTVF9UUkFOU19UU0JTUlZRUlkpOwogCiAJLyogcG9zaXRpdmUgZXJybm8sIGZyYW1ld29yayBlcnJvciBjb2RlICovCkBAIC0xNjkxLDcgKzE2OTEsNyBAQAogewogCWxuZXRfcHJvY2Vzc19pZF90ICAgICAgaWQ7CiAKLQlMQVNTRVJUIChjb25zb2xlX3Nlc3Npb24uc2VzX3N0YXRlID09IExTVF9TRVNTSU9OX05PTkUpOworCUxBU1NFUlQoY29uc29sZV9zZXNzaW9uLnNlc19zdGF0ZSA9PSBMU1RfU0VTU0lPTl9OT05FKTsKIAogCUxOZXRHZXRJZCgxLCAmaWQpOwogCXNpZC0+c2VzX25pZCAgID0gaWQubmlkOwpAQCAtMTgwNiw3ICsxODA2LDcgQEAKIAlsc3Rjb25fYmF0Y2hfdCAgICAgKmJhdDsKIAlpbnQJCSByYyA9IDA7CiAKLQlMQVNTRVJUIChjb25zb2xlX3Nlc3Npb24uc2VzX3N0YXRlID09IExTVF9TRVNTSU9OX0FDVElWRSk7CisJTEFTU0VSVChjb25zb2xlX3Nlc3Npb24uc2VzX3N0YXRlID09IExTVF9TRVNTSU9OX0FDVElWRSk7CiAKIAlyYyA9IGxzdGNvbl9ycGNfdHJhbnNfbmRsaXN0KCZjb25zb2xlX3Nlc3Npb24uc2VzX25kbF9saXN0LAogCQkJCSAgICAgTlVMTCwgTFNUX1RSQU5TX1NFU0VORCwgTlVMTCwKQEAgLTE4NDYsMTMgKzE4NDYsMTMgQEAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfZ3JwX2xpc3QpKSB7CiAJCWdycCA9IGxpc3RfZW50cnkoY29uc29sZV9zZXNzaW9uLnNlc19ncnBfbGlzdC5uZXh0LAogCQkJCSAgICAgbHN0Y29uX2dyb3VwX3QsIGdycF9saW5rKTsKLQkJTEFTU0VSVCAoZ3JwLT5ncnBfcmVmID09IDEpOworCQlMQVNTRVJUKGdycC0+Z3JwX3JlZiA9PSAxKTsKIAogCQlsc3Rjb25fZ3JvdXBfcHV0KGdycCk7CiAJfQogCiAJLyogYWxsIG5vZGVzIHNob3VsZCBiZSByZWxlYXNlZCAqLwotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbmRsX2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbmRsX2xpc3QpKTsKIAogCWNvbnNvbGVfc2Vzc2lvbi5zZXNfc2h1dGRvd24gPSAwOwogCWNvbnNvbGVfc2Vzc2lvbi5zZXNfZXhwaXJlZCAgPSAwOwpAQCAtMTg5Miw3ICsxODkyLDcgQEAKIH0KIAogc3RhdGljIGludAotbHN0Y29uX2FjY2VwdG9yX2hhbmRsZSAoc3JwY19zZXJ2ZXJfcnBjX3QgKnJwYykKK2xzdGNvbl9hY2NlcHRvcl9oYW5kbGUoc3JwY19zZXJ2ZXJfcnBjX3QgKnJwYykKIHsKIAlzcnBjX21zZ190CSpyZXAgID0gJnJwYy0+c3JwY19yZXBseW1zZzsKIAlzcnBjX21zZ190CSpyZXEgID0gJnJwYy0+c3JwY19yZXFzdGJ1Zi0+YnVmX21zZzsKQEAgLTIwMjYsNyArMjAyNiw3IEBACiAJbHN0Y29uX2luaXRfYWNjZXB0b3Jfc2VydmljZSgpOwogCiAJcmMgPSBzcnBjX2FkZF9zZXJ2aWNlKCZsc3Rjb25fYWNjZXB0b3Jfc2VydmljZSk7Ci0JTEFTU0VSVCAocmMgIT0gLUVCVVNZKTsKKwlMQVNTRVJUKHJjICE9IC1FQlVTWSk7CiAJaWYgKHJjICE9IDApIHsKIAkJTElCQ0ZTX0ZSRUUoY29uc29sZV9zZXNzaW9uLnNlc19uZGxfaGFzaCwKIAkJCSAgICBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgKiBMU1RfR0xPQkFMX0hBU0hTSVpFKTsKQEAgLTIwNzgsMTMgKzIwNzgsMTMgQEAKIAogCW11dGV4X3VubG9jaygmY29uc29sZV9zZXNzaW9uLnNlc19tdXRleCk7CiAKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZjb25zb2xlX3Nlc3Npb24uc2VzX25kbF9saXN0KSk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmY29uc29sZV9zZXNzaW9uLnNlc19ncnBfbGlzdCkpOwotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfYmF0X2xpc3QpKTsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZjb25zb2xlX3Nlc3Npb24uc2VzX3RyYW5zX2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbmRsX2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfZ3JwX2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfYmF0X2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfdHJhbnNfbGlzdCkpOwogCiAJZm9yIChpID0gMDsgaSA8IExTVF9OT0RFX0hBU0hTSVpFOyBpKyspIHsKLQkJTEFTU0VSVCAobGlzdF9lbXB0eSgmY29uc29sZV9zZXNzaW9uLnNlc19uZGxfaGFzaFtpXSkpOworCQlMQVNTRVJUKGxpc3RfZW1wdHkoJmNvbnNvbGVfc2Vzc2lvbi5zZXNfbmRsX2hhc2hbaV0pKTsKIAl9CiAKIAlMSUJDRlNfRlJFRShjb25zb2xlX3Nlc3Npb24uc2VzX25kbF9oYXNoLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9jb25zb2xlLmgKaW5kZXggZjk2MDE3NC4uZTQxY2E4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2NvbnNvbGUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvY29uc29sZS5oCkBAIC0xODIsNiArMTgyLDkgQEAKIAlyZXR1cm4gJmhhc2hbaWR4XTsKIH0KIAoraW50IGxzdGNvbl9jb25zb2xlX2luaXQodm9pZCk7CitpbnQgbHN0Y29uX2lvY3RsX2VudHJ5KHVuc2lnbmVkIGludCBjbWQsIHN0cnVjdCBsaWJjZnNfaW9jdGxfZGF0YSAqZGF0YSk7CitpbnQgbHN0Y29uX2NvbnNvbGVfZmluaSh2b2lkKTsKIGV4dGVybiBpbnQgbHN0Y29uX3Nlc3Npb25fbWF0Y2gobHN0X3NpZF90IHNpZCk7CiBleHRlcm4gaW50IGxzdGNvbl9zZXNzaW9uX25ldyhjaGFyICpuYW1lLCBpbnQga2V5LCB1bnNpZ25lZCB2ZXJzaW9uLAogCQkJICAgICAgaW50IHRpbWVvdXQsIGludCBmbGFncywgbHN0X3NpZF90ICpzaWRfdXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2ZyYW1ld29yay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L2ZyYW1ld29yay5jCmluZGV4IDU3MDkxNDguLmE5M2E5MGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9mcmFtZXdvcmsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvZnJhbWV3b3JrLmMKQEAgLTExNSwxOCArMTE1LDE4IEBACiB9IHNmd19kYXRhOwogCiAvKiBmb3J3YXJkIHJlZidzICovCi1pbnQgc2Z3X3N0b3BfYmF0Y2ggKHNmd19iYXRjaF90ICp0c2IsIGludCBmb3JjZSk7Ci12b2lkIHNmd19kZXN0cm95X3Nlc3Npb24gKHNmd19zZXNzaW9uX3QgKnNuKTsKK2ludCBzZndfc3RvcF9iYXRjaChzZndfYmF0Y2hfdCAqdHNiLCBpbnQgZm9yY2UpOwordm9pZCBzZndfZGVzdHJveV9zZXNzaW9uKHNmd19zZXNzaW9uX3QgKnNuKTsKIAogc3RhdGljIGlubGluZSBzZndfdGVzdF9jYXNlX3QgKgogc2Z3X2ZpbmRfdGVzdF9jYXNlKGludCBpZCkKIHsKIAlzZndfdGVzdF9jYXNlX3QgKnRzYzsKIAotCUxBU1NFUlQgKGlkIDw9IFNSUENfU0VSVklDRV9NQVhfSUQpOwotCUxBU1NFUlQgKGlkID4gU1JQQ19GUkFNRVdPUktfU0VSVklDRV9NQVhfSUQpOworCUxBU1NFUlQoaWQgPD0gU1JQQ19TRVJWSUNFX01BWF9JRCk7CisJTEFTU0VSVChpZCA+IFNSUENfRlJBTUVXT1JLX1NFUlZJQ0VfTUFYX0lEKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkgKHRzYywgJnNmd19kYXRhLmZ3X3Rlc3RzLCB0c2NfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodHNjLCAmc2Z3X2RhdGEuZndfdGVzdHMsIHRzY19saXN0KSB7CiAJCWlmICh0c2MtPnRzY19zcnZfc2VydmljZS0+c3ZfaWQgPT0gaWQpCiAJCQlyZXR1cm4gdHNjOwogCX0KQEAgLTEzNSwxMiArMTM1LDEyIEBACiB9CiAKIHN0YXRpYyBpbnQKLXNmd19yZWdpc3Rlcl90ZXN0IChzcnBjX3NlcnZpY2VfdCAqc2VydmljZSwgc2Z3X3Rlc3RfY2xpZW50X29wc190ICpjbGlvcHMpCitzZndfcmVnaXN0ZXJfdGVzdChzcnBjX3NlcnZpY2VfdCAqc2VydmljZSwgc2Z3X3Rlc3RfY2xpZW50X29wc190ICpjbGlvcHMpCiB7CiAJc2Z3X3Rlc3RfY2FzZV90ICp0c2M7CiAKIAlpZiAoc2Z3X2ZpbmRfdGVzdF9jYXNlKHNlcnZpY2UtPnN2X2lkKSAhPSBOVUxMKSB7Ci0JCUNFUlJPUiAoIkZhaWxlZCB0byByZWdpc3RlciB0ZXN0ICVzICglZClcbiIsCisJCUNFUlJPUigiRmFpbGVkIHRvIHJlZ2lzdGVyIHRlc3QgJXMgKCVkKVxuIiwKIAkJCXNlcnZpY2UtPnN2X25hbWUsIHNlcnZpY2UtPnN2X2lkKTsKIAkJcmV0dXJuIC1FRVhJU1Q7CiAJfQpAQCAtMTU3LDE3ICsxNTcsMTcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNmd19hZGRfc2Vzc2lvbl90aW1lciAodm9pZCkKK3Nmd19hZGRfc2Vzc2lvbl90aW1lcih2b2lkKQogewogCXNmd19zZXNzaW9uX3QgKnNuID0gc2Z3X2RhdGEuZndfc2Vzc2lvbjsKIAlzdHRfdGltZXJfdCAgICp0aW1lciA9ICZzbi0+c25fdGltZXI7CiAKLQlMQVNTRVJUICghc2Z3X2RhdGEuZndfc2h1dHRpbmdkb3duKTsKKwlMQVNTRVJUKCFzZndfZGF0YS5md19zaHV0dGluZ2Rvd24pOwogCiAJaWYgKHNuID09IE5VTEwgfHwgc24tPnNuX3RpbWVvdXQgPT0gMCkKIAkJcmV0dXJuOwogCi0JTEFTU0VSVCAoIXNuLT5zbl90aW1lcl9hY3RpdmUpOworCUxBU1NFUlQoIXNuLT5zbl90aW1lcl9hY3RpdmUpOwogCiAJc24tPnNuX3RpbWVyX2FjdGl2ZSA9IDE7CiAJdGltZXItPnN0dF9leHBpcmVzID0gY2ZzX3RpbWVfYWRkKHNuLT5zbl90aW1lb3V0LApAQCAtMTc3LDE0ICsxNzcsMTQgQEAKIH0KIAogc3RhdGljIGludAotc2Z3X2RlbF9zZXNzaW9uX3RpbWVyICh2b2lkKQorc2Z3X2RlbF9zZXNzaW9uX3RpbWVyKHZvaWQpCiB7CiAJc2Z3X3Nlc3Npb25fdCAqc24gPSBzZndfZGF0YS5md19zZXNzaW9uOwogCiAJaWYgKHNuID09IE5VTEwgfHwgIXNuLT5zbl90aW1lcl9hY3RpdmUpCiAJCXJldHVybiAwOwogCi0JTEFTU0VSVCAoc24tPnNuX3RpbWVvdXQgIT0gMCk7CisJTEFTU0VSVChzbi0+c25fdGltZW91dCAhPSAwKTsKIAogCWlmIChzdHRfZGVsX3RpbWVyKCZzbi0+c25fdGltZXIpKSB7IC8qIHRpbWVyIGRlZnVzZWQgKi8KIAkJc24tPnNuX3RpbWVyX2FjdGl2ZSA9IDA7CkBAIC0xOTUsNyArMTk1LDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNmd19kZWFjdGl2YXRlX3Nlc3Npb24gKHZvaWQpCitzZndfZGVhY3RpdmF0ZV9zZXNzaW9uKHZvaWQpCiAJX19tdXN0X2hvbGQoJnNmd19kYXRhLmZ3X2xvY2spCiB7CiAJc2Z3X3Nlc3Npb25fdCAqc24gPSBzZndfZGF0YS5md19zZXNzaW9uOwpAQCAtMjA1LDcgKzIwNSw3IEBACiAKIAlpZiAoc24gPT0gTlVMTCkgcmV0dXJuOwogCi0JTEFTU0VSVCAoIXNuLT5zbl90aW1lcl9hY3RpdmUpOworCUxBU1NFUlQoIXNuLT5zbl90aW1lcl9hY3RpdmUpOwogCiAJc2Z3X2RhdGEuZndfc2Vzc2lvbiA9IE5VTEw7CiAJYXRvbWljX2luYygmc2Z3X2RhdGEuZndfbnpvbWJpZXMpOwpAQCAtMjE5LDcgKzIxOSw3IEBACiAKIAlzcGluX2xvY2soJnNmd19kYXRhLmZ3X2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAodHNiLCAmc24tPnNuX2JhdGNoZXMsIGJhdF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0c2IsICZzbi0+c25fYmF0Y2hlcywgYmF0X2xpc3QpIHsKIAkJaWYgKHNmd19iYXRjaF9hY3RpdmUodHNiKSkgewogCQkJbmFjdGl2ZSsrOwogCQkJc2Z3X3N0b3BfYmF0Y2godHNiLCAxKTsKQEAgLTIzOSwxNiArMjM5LDE2IEBACiAKIAogc3RhdGljIHZvaWQKLXNmd19zZXNzaW9uX2V4cGlyZWQgKHZvaWQgKmRhdGEpCitzZndfc2Vzc2lvbl9leHBpcmVkKHZvaWQgKmRhdGEpCiB7CiAJc2Z3X3Nlc3Npb25fdCAqc24gPSBkYXRhOwogCiAJc3Bpbl9sb2NrKCZzZndfZGF0YS5md19sb2NrKTsKIAotCUxBU1NFUlQgKHNuLT5zbl90aW1lcl9hY3RpdmUpOwotCUxBU1NFUlQgKHNuID09IHNmd19kYXRhLmZ3X3Nlc3Npb24pOworCUxBU1NFUlQoc24tPnNuX3RpbWVyX2FjdGl2ZSk7CisJTEFTU0VSVChzbiA9PSBzZndfZGF0YS5md19zZXNzaW9uKTsKIAotCUNXQVJOICgiU2Vzc2lvbiBleHBpcmVkISBzaWQ6ICVzLSVsbHUsIG5hbWU6ICVzXG4iLAorCUNXQVJOKCJTZXNzaW9uIGV4cGlyZWQhIHNpZDogJXMtJWxsdSwgbmFtZTogJXNcbiIsCiAJICAgICAgIGxpYmNmc19uaWQyc3RyKHNuLT5zbl9pZC5zZXNfbmlkKSwKIAkgICAgICAgc24tPnNuX2lkLnNlc19zdGFtcCwgJnNuLT5zbl9uYW1lWzBdKTsKIApAQCAtMjkwLDcgKzI5MCw3IEBACiAJc3RydWN0IHNycGNfc2VydmljZQkqc3YJPSBycGMtPnNycGNfc2NkLT5zY2Rfc3ZjOwogCWludAkJCXN0YXR1cwk9IHJwYy0+c3JwY19zdGF0dXM7CiAKLQlDREVCVUcgKERfTkVULAorCUNERUJVRyhEX05FVCwKIAkJIkluY29taW5nIGZyYW1ld29yayBSUEMgZG9uZTogc2VydmljZSAlcywgcGVlciAlcywgc3RhdHVzICVzOiVkXG4iLAogCQlzdi0+c3ZfbmFtZSwgbGliY2ZzX2lkMnN0cihycGMtPnNycGNfcGVlciksCiAJCXN3aV9zdGF0ZTJzdHIocnBjLT5zcnBjX3dpLnN3aV9zdGF0ZSksCkBAIC0zMDIsMTMgKzMwMiwxMyBAQAogfQogCiBzdGF0aWMgdm9pZAotc2Z3X2NsaWVudF9ycGNfZmluaSAoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKK3Nmd19jbGllbnRfcnBjX2Zpbmkoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKIHsKLQlMQVNTRVJUIChycGMtPmNycGNfYnVsay5ia19uaW92ID09IDApOwotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJnJwYy0+Y3JwY19saXN0KSk7Ci0JTEFTU0VSVCAoYXRvbWljX3JlYWQoJnJwYy0+Y3JwY19yZWZjb3VudCkgPT0gMCk7CisJTEFTU0VSVChycGMtPmNycGNfYnVsay5ia19uaW92ID09IDApOworCUxBU1NFUlQobGlzdF9lbXB0eSgmcnBjLT5jcnBjX2xpc3QpKTsKKwlMQVNTRVJUKGF0b21pY19yZWFkKCZycGMtPmNycGNfcmVmY291bnQpID09IDApOwogCi0JQ0RFQlVHIChEX05FVCwKKwlDREVCVUcoRF9ORVQsCiAJCSJPdXRnb2luZyBmcmFtZXdvcmsgUlBDIGRvbmU6IHNlcnZpY2UgJWQsIHBlZXIgJXMsIHN0YXR1cyAlczolZDolZFxuIiwKIAkJcnBjLT5jcnBjX3NlcnZpY2UsIGxpYmNmc19pZDJzdHIocnBjLT5jcnBjX2Rlc3QpLAogCQlzd2lfc3RhdGUyc3RyKHJwYy0+Y3JwY193aS5zd2lfc3RhdGUpLApAQCAtMzI0LDE0ICszMjQsMTQgQEAKIH0KIAogc3RhdGljIHNmd19iYXRjaF90ICoKLXNmd19maW5kX2JhdGNoIChsc3RfYmlkX3QgYmlkKQorc2Z3X2ZpbmRfYmF0Y2gobHN0X2JpZF90IGJpZCkKIHsKIAlzZndfc2Vzc2lvbl90ICpzbiA9IHNmd19kYXRhLmZ3X3Nlc3Npb247CiAJc2Z3X2JhdGNoX3QgICAqYmF0OwogCi0JTEFTU0VSVCAoc24gIT0gTlVMTCk7CisJTEFTU0VSVChzbiAhPSBOVUxMKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkgKGJhdCwgJnNuLT5zbl9iYXRjaGVzLCBiYXRfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmF0LCAmc24tPnNuX2JhdGNoZXMsIGJhdF9saXN0KSB7CiAJCWlmIChiYXQtPmJhdF9pZC5iYXRfaWQgPT0gYmlkLmJhdF9pZCkKIAkJCXJldHVybiBiYXQ7CiAJfQpAQCAtMzQwLDEyICszNDAsMTIgQEAKIH0KIAogc3RhdGljIHNmd19iYXRjaF90ICoKLXNmd19iaWQyYmF0Y2ggKGxzdF9iaWRfdCBiaWQpCitzZndfYmlkMmJhdGNoKGxzdF9iaWRfdCBiaWQpCiB7CiAJc2Z3X3Nlc3Npb25fdCAqc24gPSBzZndfZGF0YS5md19zZXNzaW9uOwogCXNmd19iYXRjaF90ICAgKmJhdDsKIAotCUxBU1NFUlQgKHNuICE9IE5VTEwpOworCUxBU1NFUlQoc24gIT0gTlVMTCk7CiAKIAliYXQgPSBzZndfZmluZF9iYXRjaChiaWQpOwogCWlmIChiYXQgIT0gTlVMTCkKQEAgLTM2Niw3ICszNjYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1zZndfZ2V0X3N0YXRzIChzcnBjX3N0YXRfcmVxc3RfdCAqcmVxdWVzdCwgc3JwY19zdGF0X3JlcGx5X3QgKnJlcGx5KQorc2Z3X2dldF9zdGF0cyhzcnBjX3N0YXRfcmVxc3RfdCAqcmVxdWVzdCwgc3JwY19zdGF0X3JlcGx5X3QgKnJlcGx5KQogewogCXNmd19zZXNzaW9uX3QgICpzbiA9IHNmd19kYXRhLmZ3X3Nlc3Npb247CiAJc2Z3X2NvdW50ZXJzX3QgKmNudCA9ICZyZXBseS0+c3RyX2Z3OwpAQCAtMzk5LDcgKzM5OSw3IEBACiAJY250LT56b21iaWVfc2Vzc2lvbnMgPSBhdG9taWNfcmVhZCgmc2Z3X2RhdGEuZndfbnpvbWJpZXMpOwogCiAJY250LT5hY3RpdmVfYmF0Y2hlcyA9IDA7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSAoYmF0LCAmc24tPnNuX2JhdGNoZXMsIGJhdF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShiYXQsICZzbi0+c25fYmF0Y2hlcywgYmF0X2xpc3QpIHsKIAkJaWYgKGF0b21pY19yZWFkKCZiYXQtPmJhdF9uYWN0aXZlKSA+IDApCiAJCQljbnQtPmFjdGl2ZV9iYXRjaGVzKys7CiAJfQpAQCAtNDU2LDcgKzQ1Niw3IEBACiAJLyogYnJhbmQgbmV3IG9yIGNyZWF0ZSBieSBmb3JjZSAqLwogCUxJQkNGU19BTExPQyhzbiwgc2l6ZW9mKHNmd19zZXNzaW9uX3QpKTsKIAlpZiAoc24gPT0gTlVMTCkgewotCQlDRVJST1IgKCJEcm9wcGluZyBSUEMgKG1rc24pIHVuZGVyIG1lbW9yeSBwcmVzc3VyZS5cbiIpOworCQlDRVJST1IoIkRyb3BwaW5nIFJQQyAobWtzbikgdW5kZXIgbWVtb3J5IHByZXNzdXJlLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNDc4LDcgKzQ3OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNmd19yZW1vdmVfc2Vzc2lvbiAoc3JwY19ybXNuX3JlcXN0X3QgKnJlcXVlc3QsIHNycGNfcm1zbl9yZXBseV90ICpyZXBseSkKK3Nmd19yZW1vdmVfc2Vzc2lvbihzcnBjX3Jtc25fcmVxc3RfdCAqcmVxdWVzdCwgc3JwY19ybXNuX3JlcGx5X3QgKnJlcGx5KQogewogCXNmd19zZXNzaW9uX3QgKnNuID0gc2Z3X2RhdGEuZndfc2Vzc2lvbjsKIApAQCAtNTEwLDcgKzUxMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXNmd19kZWJ1Z19zZXNzaW9uIChzcnBjX2RlYnVnX3JlcXN0X3QgKnJlcXVlc3QsIHNycGNfZGVidWdfcmVwbHlfdCAqcmVwbHkpCitzZndfZGVidWdfc2Vzc2lvbihzcnBjX2RlYnVnX3JlcXN0X3QgKnJlcXVlc3QsIHNycGNfZGVidWdfcmVwbHlfdCAqcmVwbHkpCiB7CiAJc2Z3X3Nlc3Npb25fdCAqc24gPSBzZndfZGF0YS5md19zZXNzaW9uOwogCkBAIC01MzEsMTMgKzUzMSwxMyBAQAogfQogCiBzdGF0aWMgdm9pZAotc2Z3X3Rlc3RfcnBjX2ZpbmkgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzZndfdGVzdF9ycGNfZmluaShzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQogewogCXNmd190ZXN0X3VuaXRfdCAgICAgKnRzdSA9IHJwYy0+Y3JwY19wcml2OwogCXNmd190ZXN0X2luc3RhbmNlX3QgKnRzaSA9IHRzdS0+dHN1X2luc3RhbmNlOwogCiAJLyogQ2FsbGVkIHdpdGggaG9sZCBvZiB0c2ktPnRzaV9sb2NrICovCi0JTEFTU0VSVCAobGlzdF9lbXB0eSgmcnBjLT5jcnBjX2xpc3QpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnJwYy0+Y3JwY19saXN0KSk7CiAJbGlzdF9hZGQoJnJwYy0+Y3JwY19saXN0LCAmdHNpLT50c2lfZnJlZV9ycGNzKTsKIH0KIApAQCAtNjA4LDcgKzYwOCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1zZndfZGVzdHJveV90ZXN0X2luc3RhbmNlIChzZndfdGVzdF9pbnN0YW5jZV90ICp0c2kpCitzZndfZGVzdHJveV90ZXN0X2luc3RhbmNlKHNmd190ZXN0X2luc3RhbmNlX3QgKnRzaSkKIHsKIAlzcnBjX2NsaWVudF9ycGNfdCAqcnBjOwogCXNmd190ZXN0X3VuaXRfdCAgICp0c3U7CkBAIC02MTcsOSArNjE3LDkgQEAKIAogCXRzaS0+dHNpX29wcy0+dHNvX2ZpbmkodHNpKTsKIAotCUxBU1NFUlQgKCF0c2ktPnRzaV9zdG9wcGluZyk7Ci0JTEFTU0VSVCAobGlzdF9lbXB0eSgmdHNpLT50c2lfYWN0aXZlX3JwY3MpKTsKLQlMQVNTRVJUICghc2Z3X3Rlc3RfYWN0aXZlKHRzaSkpOworCUxBU1NFUlQoIXRzaS0+dHNpX3N0b3BwaW5nKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnRzaS0+dHNpX2FjdGl2ZV9ycGNzKSk7CisJTEFTU0VSVCghc2Z3X3Rlc3RfYWN0aXZlKHRzaSkpOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZ0c2ktPnRzaV91bml0cykpIHsKIAkJdHN1ID0gbGlzdF9lbnRyeSh0c2ktPnRzaV91bml0cy5uZXh0LApAQCAtNjQyLDEyICs2NDIsMTIgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNmd19kZXN0cm95X2JhdGNoIChzZndfYmF0Y2hfdCAqdHNiKQorc2Z3X2Rlc3Ryb3lfYmF0Y2goc2Z3X2JhdGNoX3QgKnRzYikKIHsKIAlzZndfdGVzdF9pbnN0YW5jZV90ICp0c2k7CiAKLQlMQVNTRVJUICghc2Z3X2JhdGNoX2FjdGl2ZSh0c2IpKTsKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZ0c2ItPmJhdF9saXN0KSk7CisJTEFTU0VSVCghc2Z3X2JhdGNoX2FjdGl2ZSh0c2IpKTsKKwlMQVNTRVJUKGxpc3RfZW1wdHkoJnRzYi0+YmF0X2xpc3QpKTsKIAogCXdoaWxlICghbGlzdF9lbXB0eSgmdHNiLT5iYXRfdGVzdHMpKSB7CiAJCXRzaSA9IGxpc3RfZW50cnkodHNiLT5iYXRfdGVzdHMubmV4dCwKQEAgLTY2MSwxMiArNjYxLDEyIEBACiB9CiAKIHZvaWQKLXNmd19kZXN0cm95X3Nlc3Npb24gKHNmd19zZXNzaW9uX3QgKnNuKQorc2Z3X2Rlc3Ryb3lfc2Vzc2lvbihzZndfc2Vzc2lvbl90ICpzbikKIHsKIAlzZndfYmF0Y2hfdCAqYmF0Y2g7CiAKLQlMQVNTRVJUIChsaXN0X2VtcHR5KCZzbi0+c25fbGlzdCkpOwotCUxBU1NFUlQgKHNuICE9IHNmd19kYXRhLmZ3X3Nlc3Npb24pOworCUxBU1NFUlQobGlzdF9lbXB0eSgmc24tPnNuX2xpc3QpKTsKKwlMQVNTRVJUKHNuICE9IHNmd19kYXRhLmZ3X3Nlc3Npb24pOwogCiAJd2hpbGUgKCFsaXN0X2VtcHR5KCZzbi0+c25fYmF0Y2hlcykpIHsKIAkJYmF0Y2ggPSBsaXN0X2VudHJ5KHNuLT5zbl9iYXRjaGVzLm5leHQsCkBAIC02ODUsMTMgKzY4NSwxMyBAQAogewogCXNycGNfdGVzdF9yZXFzdF90ICpyZXEgPSAmbXNnLT5tc2dfYm9keS50ZXNfcmVxc3Q7CiAKLQlMQVNTRVJUIChtc2ctPm1zZ190eXBlID09IFNSUENfTVNHX1RFU1RfUkVRU1QpOwotCUxBU1NFUlQgKHJlcS0+dHNyX2lzX2NsaWVudCk7CisJTEFTU0VSVChtc2ctPm1zZ190eXBlID09IFNSUENfTVNHX1RFU1RfUkVRU1QpOworCUxBU1NFUlQocmVxLT50c3JfaXNfY2xpZW50KTsKIAogCWlmIChtc2ctPm1zZ19tYWdpYyA9PSBTUlBDX01TR19NQUdJQykKIAkJcmV0dXJuOyAvKiBubyBmbGlwcGluZyBuZWVkZWQgKi8KIAotCUxBU1NFUlQgKG1zZy0+bXNnX21hZ2ljID09IF9fc3dhYjMyKFNSUENfTVNHX01BR0lDKSk7CisJTEFTU0VSVChtc2ctPm1zZ19tYWdpYyA9PSBfX3N3YWIzMihTUlBDX01TR19NQUdJQykpOwogCiAJaWYgKHJlcS0+dHNyX3NlcnZpY2UgPT0gU1JQQ19TRVJWSUNFX0JSVykgewogCQlpZiAoKG1zZy0+bXNnX3Nlc19mZWF0cyAmIExTVF9GRUFUX0JVTEtfTEVOKSA9PSAwKSB7CkBAIC03MjEsMTIgKzcyMSwxMiBAQAogCQlyZXR1cm47CiAJfQogCi0JTEJVRyAoKTsKKwlMQlVHKCk7CiAJcmV0dXJuOwogfQogCiBzdGF0aWMgaW50Ci1zZndfYWRkX3Rlc3RfaW5zdGFuY2UgKHNmd19iYXRjaF90ICp0c2IsIHNycGNfc2VydmVyX3JwY190ICpycGMpCitzZndfYWRkX3Rlc3RfaW5zdGFuY2Uoc2Z3X2JhdGNoX3QgKnRzYiwgc3JwY19zZXJ2ZXJfcnBjX3QgKnJwYykKIHsKIAlzcnBjX21zZ190CSAgKm1zZyA9ICZycGMtPnNycGNfcmVxc3RidWYtPmJ1Zl9tc2c7CiAJc3JwY190ZXN0X3JlcXN0X3QgICAqcmVxID0gJm1zZy0+bXNnX2JvZHkudGVzX3JlcXN0OwpAQCAtNzM5LDcgKzczOSw3IEBACiAKIAlMSUJDRlNfQUxMT0ModHNpLCBzaXplb2YoKnRzaSkpOwogCWlmICh0c2kgPT0gTlVMTCkgewotCQlDRVJST1IgKCJDYW4ndCBhbGxvY2F0ZSB0ZXN0IGluc3RhbmNlIGZvciBiYXRjaDogJWxsdVxuIiwKKwkJQ0VSUk9SKCJDYW4ndCBhbGxvY2F0ZSB0ZXN0IGluc3RhbmNlIGZvciBiYXRjaDogJWxsdVxuIiwKIAkJCXRzYi0+YmF0X2lkLmJhdF9pZCk7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KQEAgLTc2NCw3ICs3NjQsNyBAQAogCQlyZXR1cm4gcmM7CiAJfQogCi0JTEFTU0VSVCAoIXNmd19iYXRjaF9hY3RpdmUodHNiKSk7CisJTEFTU0VSVCghc2Z3X2JhdGNoX2FjdGl2ZSh0c2IpKTsKIAogCWlmICghdHNpLT50c2lfaXNfY2xpZW50KSB7CiAJCS8qIGl0J3MgdGVzdCBzZXJ2ZXIsIGp1c3QgYWRkIGl0IHRvIHRzYiAqLwpAQCAtNzcyLDggKzc3Miw4IEBACiAJCXJldHVybiAwOwogCX0KIAotCUxBU1NFUlQgKGJrICE9IE5VTEwpOwotCUxBU1NFUlQgKGJrLT5ia19uaW92ICogU0ZXX0lEX1BFUl9QQUdFID49ICh1bnNpZ25lZCBpbnQpbmRlc3QpOworCUxBU1NFUlQoYmsgIT0gTlVMTCk7CisJTEFTU0VSVChiay0+YmtfbmlvdiAqIFNGV19JRF9QRVJfUEFHRSA+PSAodW5zaWduZWQgaW50KW5kZXN0KTsKIAlMQVNTRVJUKCh1bnNpZ25lZCBpbnQpYmstPmJrX2xlbiA+PQogCQlzaXplb2YobG5ldF9wcm9jZXNzX2lkX3BhY2tlZF90KSAqIG5kZXN0KTsKIApAQCAtNzg2LDcgKzc4Niw3IEBACiAJCWludAkJICAgICAgIGo7CiAKIAkJZGVzdHMgPSBwYWdlX2FkZHJlc3MoYmstPmJrX2lvdnNbaSAvIFNGV19JRF9QRVJfUEFHRV0ua2lvdl9wYWdlKTsKLQkJTEFTU0VSVCAoZGVzdHMgIT0gTlVMTCk7ICAvKiBteSBwYWdlcyBhcmUgd2l0aGluIEtWTSBhbHdheXMgKi8KKwkJTEFTU0VSVChkZXN0cyAhPSBOVUxMKTsgIC8qIG15IHBhZ2VzIGFyZSB3aXRoaW4gS1ZNIGFsd2F5cyAqLwogCQlpZCA9IGRlc3RzW2kgJSBTRldfSURfUEVSX1BBR0VdOwogCQlpZiAobXNnLT5tc2dfbWFnaWMgIT0gU1JQQ19NU0dfTUFHSUMpCiAJCQlzZndfdW5wYWNrX2lkKGlkKTsKQEAgLTc5NSw3ICs3OTUsNyBAQAogCQkJTElCQ0ZTX0FMTE9DKHRzdSwgc2l6ZW9mKHNmd190ZXN0X3VuaXRfdCkpOwogCQkJaWYgKHRzdSA9PSBOVUxMKSB7CiAJCQkJcmMgPSAtRU5PTUVNOwotCQkJCUNFUlJPUiAoIkNhbid0IGFsbG9jYXRlIHRzdSBmb3IgJWRcbiIsCisJCQkJQ0VSUk9SKCJDYW4ndCBhbGxvY2F0ZSB0c3UgZm9yICVkXG4iLAogCQkJCQl0c2ktPnRzaV9zZXJ2aWNlKTsKIAkJCQlnb3RvIGVycm9yOwogCQkJfQpAQCAtODE1LDE5ICs4MTUsMTkgQEAKIAl9CiAKIGVycm9yOgotCUxBU1NFUlQgKHJjICE9IDApOworCUxBU1NFUlQocmMgIT0gMCk7CiAJc2Z3X2Rlc3Ryb3lfdGVzdF9pbnN0YW5jZSh0c2kpOwogCXJldHVybiByYzsKIH0KIAogc3RhdGljIHZvaWQKLXNmd190ZXN0X3VuaXRfZG9uZSAoc2Z3X3Rlc3RfdW5pdF90ICp0c3UpCitzZndfdGVzdF91bml0X2RvbmUoc2Z3X3Rlc3RfdW5pdF90ICp0c3UpCiB7CiAJc2Z3X3Rlc3RfaW5zdGFuY2VfdCAqdHNpID0gdHN1LT50c3VfaW5zdGFuY2U7CiAJc2Z3X2JhdGNoX3QJICp0c2IgPSB0c2ktPnRzaV9iYXRjaDsKIAlzZndfc2Vzc2lvbl90ICAgICAgICpzbiA9IHRzYi0+YmF0X3Nlc3Npb247CiAKLQlMQVNTRVJUIChzZndfdGVzdF9hY3RpdmUodHNpKSk7CisJTEFTU0VSVChzZndfdGVzdF9hY3RpdmUodHNpKSk7CiAKIAlpZiAoIWF0b21pY19kZWNfYW5kX3Rlc3QoJnRzaS0+dHNpX25hY3RpdmUpKQogCQlyZXR1cm47CkBAIC04NDcsOSArODQ3LDkgQEAKIAkJcmV0dXJuOwogCX0KIAotCUxBU1NFUlQgKCFsaXN0X2VtcHR5KCZzbi0+c25fbGlzdCkpOyAvKiBJJ20gYSB6b21iaWUhICovCisJTEFTU0VSVCghbGlzdF9lbXB0eSgmc24tPnNuX2xpc3QpKTsgLyogSSdtIGEgem9tYmllISAqLwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAodHNiLCAmc24tPnNuX2JhdGNoZXMsIGJhdF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0c2IsICZzbi0+c25fYmF0Y2hlcywgYmF0X2xpc3QpIHsKIAkJaWYgKHNmd19iYXRjaF9hY3RpdmUodHNiKSkgewogCQkJc3Bpbl91bmxvY2soJnNmd19kYXRhLmZ3X2xvY2spOwogCQkJcmV0dXJuOwpAQCAtODY0LDcgKzg2NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1zZndfdGVzdF9ycGNfZG9uZSAoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKK3Nmd190ZXN0X3JwY19kb25lKHNycGNfY2xpZW50X3JwY190ICpycGMpCiB7CiAJc2Z3X3Rlc3RfdW5pdF90ICAgICAqdHN1ID0gcnBjLT5jcnBjX3ByaXY7CiAJc2Z3X3Rlc3RfaW5zdGFuY2VfdCAqdHNpID0gdHN1LT50c3VfaW5zdGFuY2U7CkBAIC04NzQsOCArODc0LDggQEAKIAogCXNwaW5fbG9jaygmdHNpLT50c2lfbG9jayk7CiAKLQlMQVNTRVJUIChzZndfdGVzdF9hY3RpdmUodHNpKSk7Ci0JTEFTU0VSVCAoIWxpc3RfZW1wdHkoJnJwYy0+Y3JwY19saXN0KSk7CisJTEFTU0VSVChzZndfdGVzdF9hY3RpdmUodHNpKSk7CisJTEFTU0VSVCghbGlzdF9lbXB0eSgmcnBjLT5jcnBjX2xpc3QpKTsKIAogCWxpc3RfZGVsX2luaXQoJnJwYy0+Y3JwY19saXN0KTsKIApAQCAtOTA5LDEzICs5MDksMTMgQEAKIAogCXNwaW5fbG9jaygmdHNpLT50c2lfbG9jayk7CiAKLQlMQVNTRVJUIChzZndfdGVzdF9hY3RpdmUodHNpKSk7CisJTEFTU0VSVChzZndfdGVzdF9hY3RpdmUodHNpKSk7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJnRzaS0+dHNpX2ZyZWVfcnBjcykpIHsKIAkJLyogcGljayByZXF1ZXN0IGZyb20gYnVmZmVyICovCiAJCXJwYyA9IGxpc3RfZW50cnkodHNpLT50c2lfZnJlZV9ycGNzLm5leHQsCiAJCQkJICAgICBzcnBjX2NsaWVudF9ycGNfdCwgY3JwY19saXN0KTsKLQkJTEFTU0VSVCAobmJsayA9PSBycGMtPmNycGNfYnVsay5ia19uaW92KTsKKwkJTEFTU0VSVChuYmxrID09IHJwYy0+Y3JwY19idWxrLmJrX25pb3YpOwogCQlsaXN0X2RlbF9pbml0KCZycGMtPmNycGNfbGlzdCk7CiAJfQogCkBAIC05NDMsMjAgKzk0MywyMCBAQAogfQogCiBzdGF0aWMgaW50Ci1zZndfcnVuX3Rlc3QgKHN3aV93b3JraXRlbV90ICp3aSkKK3Nmd19ydW5fdGVzdChzd2lfd29ya2l0ZW1fdCAqd2kpCiB7CiAJc2Z3X3Rlc3RfdW5pdF90ICAgICAqdHN1ID0gd2ktPnN3aV93b3JraXRlbS53aV9kYXRhOwogCXNmd190ZXN0X2luc3RhbmNlX3QgKnRzaSA9IHRzdS0+dHN1X2luc3RhbmNlOwogCXNycGNfY2xpZW50X3JwY190ICAgKnJwYyA9IE5VTEw7CiAKLQlMQVNTRVJUICh3aSA9PSAmdHN1LT50c3Vfd29ya2VyKTsKKwlMQVNTRVJUKHdpID09ICZ0c3UtPnRzdV93b3JrZXIpOwogCiAJaWYgKHRzaS0+dHNpX29wcy0+dHNvX3ByZXBfcnBjKHRzdSwgdHN1LT50c3VfZGVzdCwgJnJwYykgIT0gMCkgewotCQlMQVNTRVJUIChycGMgPT0gTlVMTCk7CisJCUxBU1NFUlQocnBjID09IE5VTEwpOwogCQlnb3RvIHRlc3RfZG9uZTsKIAl9CiAKLQlMQVNTRVJUIChycGMgIT0gTlVMTCk7CisJTEFTU0VSVChycGMgIT0gTlVMTCk7CiAKIAlzcGluX2xvY2soJnRzaS0+dHNpX2xvY2spOwogCkBAIC05OTMsNyArOTkzLDcgQEAKIH0KIAogc3RhdGljIGludAotc2Z3X3J1bl9iYXRjaCAoc2Z3X2JhdGNoX3QgKnRzYikKK3Nmd19ydW5fYmF0Y2goc2Z3X2JhdGNoX3QgKnRzYikKIHsKIAlzd2lfd29ya2l0ZW1fdCAgICAgICp3aTsKIAlzZndfdGVzdF91bml0X3QgICAgICp0c3U7CkBAIC0xMDA1LDE2ICsxMDA1LDE2IEBACiAJCXJldHVybiAwOwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkgKHRzaSwgJnRzYi0+YmF0X3Rlc3RzLCB0c2lfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodHNpLCAmdHNiLT5iYXRfdGVzdHMsIHRzaV9saXN0KSB7CiAJCWlmICghdHNpLT50c2lfaXNfY2xpZW50KSAvKiBza2lwIHNlcnZlciBpbnN0YW5jZXMgKi8KIAkJCWNvbnRpbnVlOwogCi0JCUxBU1NFUlQgKCF0c2ktPnRzaV9zdG9wcGluZyk7Ci0JCUxBU1NFUlQgKCFzZndfdGVzdF9hY3RpdmUodHNpKSk7CisJCUxBU1NFUlQoIXRzaS0+dHNpX3N0b3BwaW5nKTsKKwkJTEFTU0VSVCghc2Z3X3Rlc3RfYWN0aXZlKHRzaSkpOwogCiAJCWF0b21pY19pbmMoJnRzYi0+YmF0X25hY3RpdmUpOwogCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkgKHRzdSwgJnRzaS0+dHNpX3VuaXRzLCB0c3VfbGlzdCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRzdSwgJnRzaS0+dHNpX3VuaXRzLCB0c3VfbGlzdCkgewogCQkJYXRvbWljX2luYygmdHNpLT50c2lfbmFjdGl2ZSk7CiAJCQl0c3UtPnRzdV9sb29wID0gdHNpLT50c2lfbG9vcDsKIAkJCXdpID0gJnRzdS0+dHN1X3dvcmtlcjsKQEAgLTEwMjksNyArMTAyOSw3IEBACiB9CiAKIGludAotc2Z3X3N0b3BfYmF0Y2ggKHNmd19iYXRjaF90ICp0c2IsIGludCBmb3JjZSkKK3Nmd19zdG9wX2JhdGNoKHNmd19iYXRjaF90ICp0c2IsIGludCBmb3JjZSkKIHsKIAlzZndfdGVzdF9pbnN0YW5jZV90ICp0c2k7CiAJc3JwY19jbGllbnRfcnBjX3QgICAqcnBjOwpAQCAtMTAzOSw3ICsxMDM5LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAodHNpLCAmdHNiLT5iYXRfdGVzdHMsIHRzaV9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0c2ksICZ0c2ItPmJhdF90ZXN0cywgdHNpX2xpc3QpIHsKIAkJc3Bpbl9sb2NrKCZ0c2ktPnRzaV9sb2NrKTsKIAogCQlpZiAoIXRzaS0+dHNpX2lzX2NsaWVudCB8fApAQCAtMTA3MSw3ICsxMDcxLDcgQEAKIH0KIAogc3RhdGljIGludAotc2Z3X3F1ZXJ5X2JhdGNoIChzZndfYmF0Y2hfdCAqdHNiLCBpbnQgdGVzdGlkeCwgc3JwY19iYXRjaF9yZXBseV90ICpyZXBseSkKK3Nmd19xdWVyeV9iYXRjaChzZndfYmF0Y2hfdCAqdHNiLCBpbnQgdGVzdGlkeCwgc3JwY19iYXRjaF9yZXBseV90ICpyZXBseSkKIHsKIAlzZndfdGVzdF9pbnN0YW5jZV90ICp0c2k7CiAKQEAgLTEwODMsNyArMTA4Myw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWxpc3RfZm9yX2VhY2hfZW50cnkgKHRzaSwgJnRzYi0+YmF0X3Rlc3RzLCB0c2lfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnkodHNpLCAmdHNiLT5iYXRfdGVzdHMsIHRzaV9saXN0KSB7CiAJCWlmICh0ZXN0aWR4LS0gPiAxKQogCQkJY29udGludWU7CiAKQEAgLTEwOTUsNyArMTA5NSw3IEBACiB9CiAKIHZvaWQKLXNmd19mcmVlX3BhZ2VzIChzcnBjX3NlcnZlcl9ycGNfdCAqcnBjKQorc2Z3X2ZyZWVfcGFnZXMoc3JwY19zZXJ2ZXJfcnBjX3QgKnJwYykKIHsKIAlzcnBjX2ZyZWVfYnVsayhycGMtPnNycGNfYnVsayk7CiAJcnBjLT5zcnBjX2J1bGsgPSBOVUxMOwpAQCAtMTExNiw3ICsxMTE2LDcgQEAKIH0KIAogc3RhdGljIGludAotc2Z3X2FkZF90ZXN0IChzcnBjX3NlcnZlcl9ycGNfdCAqcnBjKQorc2Z3X2FkZF90ZXN0KHNycGNfc2VydmVyX3JwY190ICpycGMpCiB7CiAJc2Z3X3Nlc3Npb25fdCAgICAgKnNuID0gc2Z3X2RhdGEuZndfc2Vzc2lvbjsKIAlzcnBjX3Rlc3RfcmVwbHlfdCAqcmVwbHkgPSAmcnBjLT5zcnBjX3JlcGx5bXNnLm1zZ19ib2R5LnRlc19yZXBseTsKQEAgLTExNDcsNyArMTE0Nyw3IEBACiAKIAliYXQgPSBzZndfYmlkMmJhdGNoKHJlcXVlc3QtPnRzcl9iaWQpOwogCWlmIChiYXQgPT0gTlVMTCkgewotCQlDRVJST1IgKCJEcm9wcGluZyBSUEMgKCVzKSBmcm9tICVzIHVuZGVyIG1lbW9yeSBwcmVzc3VyZS5cbiIsCisJCUNFUlJPUigiRHJvcHBpbmcgUlBDICglcykgZnJvbSAlcyB1bmRlciBtZW1vcnkgcHJlc3N1cmUuXG4iLAogCQkJcnBjLT5zcnBjX3NjZC0+c2NkX3N2Yy0+c3ZfbmFtZSwKIAkJCWxpYmNmc19pZDJzdHIocnBjLT5zcnBjX3BlZXIpKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMTc1LDcgKzExNzUsNyBAQAogCX0KIAogCXJjID0gc2Z3X2FkZF90ZXN0X2luc3RhbmNlKGJhdCwgcnBjKTsKLQlDREVCVUcgKHJjID09IDAgPyBEX05FVCA6IERfV0FSTklORywKKwlDREVCVUcocmMgPT0gMCA/IERfTkVUIDogRF9XQVJOSU5HLAogCQkiJXMgdGVzdDogc3YgJWQgJXMsIGxvb3AgJWQsIGNvbmN1ciAlZCwgbmRlc3QgJWRcbiIsCiAJCXJjID09IDAgPyAiQWRkZWQiIDogIkZhaWxlZCB0byBhZGQiLCByZXF1ZXN0LT50c3Jfc2VydmljZSwKIAkJcmVxdWVzdC0+dHNyX2lzX2NsaWVudCA/ICJjbGllbnQiIDogInNlcnZlciIsCkBAIC0xMTg2LDcgKzExODYsNyBAQAogfQogCiBzdGF0aWMgaW50Ci1zZndfY29udHJvbF9iYXRjaCAoc3JwY19iYXRjaF9yZXFzdF90ICpyZXF1ZXN0LCBzcnBjX2JhdGNoX3JlcGx5X3QgKnJlcGx5KQorc2Z3X2NvbnRyb2xfYmF0Y2goc3JwY19iYXRjaF9yZXFzdF90ICpyZXF1ZXN0LCBzcnBjX2JhdGNoX3JlcGx5X3QgKnJlcGx5KQogewogCXNmd19zZXNzaW9uX3QgKnNuID0gc2Z3X2RhdGEuZndfc2Vzc2lvbjsKIAlpbnQJICAgIHJjID0gMDsKQEAgLTEyODUsNyArMTI4NSw3IEBACiAKIAlzd2l0Y2ggKHN2LT5zdl9pZCkgewogCWRlZmF1bHQ6Ci0JCUxCVUcgKCk7CisJCUxCVUcoKTsKIAljYXNlIFNSUENfU0VSVklDRV9URVNUOgogCQlyYyA9IHNmd19hZGRfdGVzdChycGMpOwogCQlicmVhazsKQEAgLTEzODcsOCArMTM4Nyw4IEBACiAKIAlzcGluX2xvY2soJnNmd19kYXRhLmZ3X2xvY2spOwogCi0JTEFTU0VSVCAoIXNmd19kYXRhLmZ3X3NodXR0aW5nZG93bik7Ci0JTEFTU0VSVCAoc2VydmljZSA8PSBTUlBDX0ZSQU1FV09SS19TRVJWSUNFX01BWF9JRCk7CisJTEFTU0VSVCghc2Z3X2RhdGEuZndfc2h1dHRpbmdkb3duKTsKKwlMQVNTRVJUKHNlcnZpY2UgPD0gU1JQQ19GUkFNRVdPUktfU0VSVklDRV9NQVhfSUQpOwogCiAJaWYgKG5idWxraW92ID09IDAgJiYgIWxpc3RfZW1wdHkoJnNmd19kYXRhLmZ3X3pvbWJpZV9ycGNzKSkgewogCQlycGMgPSBsaXN0X2VudHJ5KHNmd19kYXRhLmZ3X3pvbWJpZV9ycGNzLm5leHQsCkBAIC0xNDE2LDEzICsxNDE2LDEzIEBACiB9CiAKIHZvaWQKLXNmd191bnBhY2tfbWVzc2FnZSAoc3JwY19tc2dfdCAqbXNnKQorc2Z3X3VucGFja19tZXNzYWdlKHNycGNfbXNnX3QgKm1zZykKIHsKIAlpZiAobXNnLT5tc2dfbWFnaWMgPT0gU1JQQ19NU0dfTUFHSUMpCiAJCXJldHVybjsgLyogbm8gZmxpcHBpbmcgbmVlZGVkICovCiAKIAkvKiBzcnBjIG1vZHVsZSBzaG91bGQgZ3VhcmFudGVlIEkgd291bGRuJ3QgZ2V0IGNyYXAgKi8KLQlMQVNTRVJUIChtc2ctPm1zZ19tYWdpYyA9PSBfX3N3YWIzMihTUlBDX01TR19NQUdJQykpOworCUxBU1NFUlQobXNnLT5tc2dfbWFnaWMgPT0gX19zd2FiMzIoU1JQQ19NU0dfTUFHSUMpKTsKIAogCWlmIChtc2ctPm1zZ190eXBlID09IFNSUENfTVNHX1NUQVRfUkVRU1QpIHsKIAkJc3JwY19zdGF0X3JlcXN0X3QgKnJlcSA9ICZtc2ctPm1zZ19ib2R5LnN0YXRfcmVxc3Q7CkBAIC0xNTU1LDEyICsxNTU1LDEyIEBACiAJCXJldHVybjsKIAl9CiAKLQlMQlVHICgpOworCUxCVUcoKTsKIAlyZXR1cm47CiB9CiAKIHZvaWQKLXNmd19hYm9ydF9ycGMgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzZndfYWJvcnRfcnBjKHNycGNfY2xpZW50X3JwY190ICpycGMpCiB7CiAJTEFTU0VSVChhdG9taWNfcmVhZCgmcnBjLT5jcnBjX3JlZmNvdW50KSA+IDApOwogCUxBU1NFUlQocnBjLT5jcnBjX3NlcnZpY2UgPD0gU1JQQ19GUkFNRVdPUktfU0VSVklDRV9NQVhfSUQpOwpAQCAtMTU3MiwxNCArMTU3MiwxNCBAQAogfQogCiB2b2lkCi1zZndfcG9zdF9ycGMgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzZndfcG9zdF9ycGMoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKIHsKIAlzcGluX2xvY2soJnJwYy0+Y3JwY19sb2NrKTsKIAotCUxBU1NFUlQgKCFycGMtPmNycGNfY2xvc2VkKTsKLQlMQVNTRVJUICghcnBjLT5jcnBjX2Fib3J0ZWQpOwotCUxBU1NFUlQgKGxpc3RfZW1wdHkoJnJwYy0+Y3JwY19saXN0KSk7Ci0JTEFTU0VSVCAoIXNmd19kYXRhLmZ3X3NodXR0aW5nZG93bik7CisJTEFTU0VSVCghcnBjLT5jcnBjX2Nsb3NlZCk7CisJTEFTU0VSVCghcnBjLT5jcnBjX2Fib3J0ZWQpOworCUxBU1NFUlQobGlzdF9lbXB0eSgmcnBjLT5jcnBjX2xpc3QpKTsKKwlMQVNTRVJUKCFzZndfZGF0YS5md19zaHV0dGluZ2Rvd24pOwogCiAJcnBjLT5jcnBjX3RpbWVvdXQgPSBycGNfdGltZW91dDsKIAlzcnBjX3Bvc3RfcnBjKHJwYyk7CkBAIC0xNjM4LDcgKzE2MzgsNyBAQAogCiAKIGludAotc2Z3X3N0YXJ0dXAgKHZvaWQpCitzZndfc3RhcnR1cCh2b2lkKQogewogCWludAkgICAgICBpOwogCWludAkgICAgICByYzsKQEAgLTE2NDgsMTMgKzE2NDgsMTMgQEAKIAogCiAJaWYgKHNlc3Npb25fdGltZW91dCA8IDApIHsKLQkJQ0VSUk9SICgiU2Vzc2lvbiB0aW1lb3V0IG11c3QgYmUgbm9uLW5lZ2F0aXZlOiAlZFxuIiwKKwkJQ0VSUk9SKCJTZXNzaW9uIHRpbWVvdXQgbXVzdCBiZSBub24tbmVnYXRpdmU6ICVkXG4iLAogCQkJc2Vzc2lvbl90aW1lb3V0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHJwY190aW1lb3V0IDwgMCkgewotCQlDRVJST1IgKCJSUEMgdGltZW91dCBtdXN0IGJlIG5vbi1uZWdhdGl2ZTogJWRcbiIsCisJCUNFUlJPUigiUlBDIHRpbWVvdXQgbXVzdCBiZSBub24tbmVnYXRpdmU6ICVkXG4iLAogCQkJcnBjX3RpbWVvdXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNjc4LDIxICsxNjc4LDIxIEBACiAJYnJ3X2luaXRfdGVzdF9jbGllbnQoKTsKIAlicndfaW5pdF90ZXN0X3NlcnZpY2UoKTsKIAlyYyA9IHNmd19yZWdpc3Rlcl90ZXN0KCZicndfdGVzdF9zZXJ2aWNlLCAmYnJ3X3Rlc3RfY2xpZW50KTsKLQlMQVNTRVJUIChyYyA9PSAwKTsKKwlMQVNTRVJUKHJjID09IDApOwogCiAJcGluZ19pbml0X3Rlc3RfY2xpZW50KCk7CiAJcGluZ19pbml0X3Rlc3Rfc2VydmljZSgpOwogCXJjID0gc2Z3X3JlZ2lzdGVyX3Rlc3QoJnBpbmdfdGVzdF9zZXJ2aWNlLCAmcGluZ190ZXN0X2NsaWVudCk7Ci0JTEFTU0VSVCAocmMgPT0gMCk7CisJTEFTU0VSVChyYyA9PSAwKTsKIAogCWVycm9yID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5ICh0c2MsICZzZndfZGF0YS5md190ZXN0cywgdHNjX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRzYywgJnNmd19kYXRhLmZ3X3Rlc3RzLCB0c2NfbGlzdCkgewogCQlzdiA9IHRzYy0+dHNjX3Nydl9zZXJ2aWNlOwogCiAJCXJjID0gc3JwY19hZGRfc2VydmljZShzdik7Ci0JCUxBU1NFUlQgKHJjICE9IC1FQlVTWSk7CisJCUxBU1NFUlQocmMgIT0gLUVCVVNZKTsKIAkJaWYgKHJjICE9IDApIHsKLQkJCUNXQVJOICgiRmFpbGVkIHRvIGFkZCAlcyBzZXJ2aWNlOiAlZFxuIiwKKwkJCUNXQVJOKCJGYWlsZWQgdG8gYWRkICVzIHNlcnZpY2U6ICVkXG4iLAogCQkJICAgICAgIHN2LT5zdl9uYW1lLCByYyk7CiAJCQllcnJvciA9IHJjOwogCQl9CkBAIC0xNzA5LDkgKzE3MDksOSBAQAogCQkJc3YtPnN2X2J1bGtfcmVhZHkgPSBzZndfYnVsa19yZWFkeTsKIAogCQlyYyA9IHNycGNfYWRkX3NlcnZpY2Uoc3YpOwotCQlMQVNTRVJUIChyYyAhPSAtRUJVU1kpOworCQlMQVNTRVJUKHJjICE9IC1FQlVTWSk7CiAJCWlmIChyYyAhPSAwKSB7Ci0JCQlDV0FSTiAoIkZhaWxlZCB0byBhZGQgJXMgc2VydmljZTogJWRcbiIsCisJCQlDV0FSTigiRmFpbGVkIHRvIGFkZCAlcyBzZXJ2aWNlOiAlZFxuIiwKIAkJCSAgICAgICBzdi0+c3ZfbmFtZSwgcmMpOwogCQkJZXJyb3IgPSByYzsKIAkJfQpAQCAtMTczMyw3ICsxNzMzLDcgQEAKIH0KIAogdm9pZAotc2Z3X3NodXRkb3duICh2b2lkKQorc2Z3X3NodXRkb3duKHZvaWQpCiB7CiAJc3JwY19zZXJ2aWNlX3QJKnN2OwogCXNmd190ZXN0X2Nhc2VfdAkqdHNjOwpAQCAtMTc2Niw3ICsxNzY2LDcgQEAKIAkJc3JwY19yZW1vdmVfc2VydmljZShzdik7CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeSAodHNjLCAmc2Z3X2RhdGEuZndfdGVzdHMsIHRzY19saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0c2MsICZzZndfZGF0YS5md190ZXN0cywgdHNjX2xpc3QpIHsKIAkJc3YgPSB0c2MtPnRzY19zcnZfc2VydmljZTsKIAkJc3JwY19zaHV0ZG93bl9zZXJ2aWNlKHN2KTsKIAkJc3JwY19yZW1vdmVfc2VydmljZShzdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvbW9kdWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvbW9kdWxlLmMKaW5kZXggZmFmNDA5OC4uN2FkNjJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L21vZHVsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9tb2R1bGUuYwpAQCAtODcsNyArODcsNiBAQAogCWRlZmF1bHQ6CiAJCUxCVUcoKTsKIAl9Ci0JcmV0dXJuOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcGluZ190ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcGluZ190ZXN0LmMKaW5kZXggZDhjMGRmNi4uNjQ0MDY5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3BpbmdfdGVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9waW5nX3Rlc3QuYwpAQCAtNzAsMTkgKzcwLDE5IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1waW5nX2NsaWVudF9maW5pIChzZndfdGVzdF9pbnN0YW5jZV90ICp0c2kpCitwaW5nX2NsaWVudF9maW5pKHNmd190ZXN0X2luc3RhbmNlX3QgKnRzaSkKIHsKIAlzZndfc2Vzc2lvbl90ICpzbiA9IHRzaS0+dHNpX2JhdGNoLT5iYXRfc2Vzc2lvbjsKIAlpbnQJICAgIGVycm9yczsKIAotCUxBU1NFUlQgKHNuICE9IE5VTEwpOwotCUxBU1NFUlQgKHRzaS0+dHNpX2lzX2NsaWVudCk7CisJTEFTU0VSVChzbiAhPSBOVUxMKTsKKwlMQVNTRVJUKHRzaS0+dHNpX2lzX2NsaWVudCk7CiAKIAllcnJvcnMgPSBhdG9taWNfcmVhZCgmc24tPnNuX3BpbmdfZXJyb3JzKTsKIAlpZiAoZXJyb3JzKQotCQlDV0FSTiAoIiVkIHBpbmdzIGhhdmUgZmFpbGVkLlxuIiwgZXJyb3JzKTsKKwkJQ1dBUk4oIiVkIHBpbmdzIGhhdmUgZmFpbGVkLlxuIiwgZXJyb3JzKTsKIAllbHNlCi0JCUNERUJVRyAoRF9ORVQsICJQaW5nIHRlc3QgZmluaXNoZWQgT0suXG4iKTsKKwkJQ0RFQlVHKERfTkVULCAiUGluZyB0ZXN0IGZpbmlzaGVkIE9LLlxuIik7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTExOCw3ICsxMTgsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotcGluZ19jbGllbnRfZG9uZV9ycGMgKHNmd190ZXN0X3VuaXRfdCAqdHN1LCBzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQorcGluZ19jbGllbnRfZG9uZV9ycGMoc2Z3X3Rlc3RfdW5pdF90ICp0c3UsIHNycGNfY2xpZW50X3JwY190ICpycGMpCiB7CiAJc2Z3X3Rlc3RfaW5zdGFuY2VfdCAqdHNpID0gdHN1LT50c3VfaW5zdGFuY2U7CiAJc2Z3X3Nlc3Npb25fdCAgICAgICAqc24gPSB0c2ktPnRzaV9iYXRjaC0+YmF0X3Nlc3Npb247CkBAIC0xMjYsMTIgKzEyNiwxMiBAQAogCXNycGNfcGluZ19yZXBseV90ICAgKnJlcGx5ID0gJnJwYy0+Y3JwY19yZXBseW1zZy5tc2dfYm9keS5waW5nX3JlcGx5OwogCXN0cnVjdCB0aW1ldmFsICAgICAgIHR2OwogCi0JTEFTU0VSVCAoc24gIT0gTlVMTCk7CisJTEFTU0VSVChzbiAhPSBOVUxMKTsKIAogCWlmIChycGMtPmNycGNfc3RhdHVzICE9IDApIHsKIAkJaWYgKCF0c2ktPnRzaV9zdG9wcGluZykgLyogcnBjIGNvdWxkIGhhdmUgYmVlbiBhYm9ydGVkICovCiAJCQlhdG9taWNfaW5jKCZzbi0+c25fcGluZ19lcnJvcnMpOwotCQlDRVJST1IgKCJVbmFibGUgdG8gcGluZyAlcyAoJWQpOiAlZFxuIiwKKwkJQ0VSUk9SKCJVbmFibGUgdG8gcGluZyAlcyAoJWQpOiAlZFxuIiwKIAkJCWxpYmNmc19pZDJzdHIocnBjLT5jcnBjX2Rlc3QpLAogCQkJcmVxc3QtPnBucl9zZXEsIHJwYy0+Y3JwY19zdGF0dXMpOwogCQlyZXR1cm47CkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlpZiAocmVwbHktPnBucl9tYWdpYyAhPSBMU1RfUElOR19URVNUX01BR0lDKSB7CiAJCXJwYy0+Y3JwY19zdGF0dXMgPSAtRUJBRE1TRzsKIAkJYXRvbWljX2luYygmc24tPnNuX3BpbmdfZXJyb3JzKTsKLQkJQ0VSUk9SICgiQmFkIG1hZ2ljICV1IGZyb20gJXMsICV1IGV4cGVjdGVkLlxuIiwKKwkJQ0VSUk9SKCJCYWQgbWFnaWMgJXUgZnJvbSAlcywgJXUgZXhwZWN0ZWQuXG4iLAogCQkJcmVwbHktPnBucl9tYWdpYywgbGliY2ZzX2lkMnN0cihycGMtPmNycGNfZGVzdCksCiAJCQlMU1RfUElOR19URVNUX01BR0lDKTsKIAkJcmV0dXJuOwpAQCAtMTU1LDE0ICsxNTUsMTQgQEAKIAlpZiAocmVwbHktPnBucl9zZXEgIT0gcmVxc3QtPnBucl9zZXEpIHsKIAkJcnBjLT5jcnBjX3N0YXR1cyA9IC1FQkFETVNHOwogCQlhdG9taWNfaW5jKCZzbi0+c25fcGluZ19lcnJvcnMpOwotCQlDRVJST1IgKCJCYWQgc2VxICV1IGZyb20gJXMsICV1IGV4cGVjdGVkLlxuIiwKKwkJQ0VSUk9SKCJCYWQgc2VxICV1IGZyb20gJXMsICV1IGV4cGVjdGVkLlxuIiwKIAkJCXJlcGx5LT5wbnJfc2VxLCBsaWJjZnNfaWQyc3RyKHJwYy0+Y3JwY19kZXN0KSwKIAkJCXJlcXN0LT5wbnJfc2VxKTsKIAkJcmV0dXJuOwogCX0KIAogCWNmc19mc190aW1ldmFsKCZ0dik7Ci0JQ0RFQlVHIChEX05FVCwgIiVkIHJlcGx5IGluICV1IHVzZWNcbiIsIHJlcGx5LT5wbnJfc2VxLAorCUNERUJVRyhEX05FVCwgIiVkIHJlcGx5IGluICV1IHVzZWNcbiIsIHJlcGx5LT5wbnJfc2VxLAogCQkodW5zaWduZWQpKCh0di50dl9zZWMgLSAodW5zaWduZWQpcmVxc3QtPnBucl90aW1lX3NlYykgKiAxMDAwMDAwCiAJCQkgICArICh0di50dl91c2VjIC0gcmVxc3QtPnBucl90aW1lX3VzZWMpKSk7CiAJcmV0dXJuOwpAQCAtMTc3LDIwICsxNzcsMjAgQEAKIAlzcnBjX3BpbmdfcmVxc3RfdCAqcmVxID0gJnJlcXN0bXNnLT5tc2dfYm9keS5waW5nX3JlcXN0OwogCXNycGNfcGluZ19yZXBseV90ICpyZXAgPSAmcnBjLT5zcnBjX3JlcGx5bXNnLm1zZ19ib2R5LnBpbmdfcmVwbHk7CiAKLQlMQVNTRVJUIChzdi0+c3ZfaWQgPT0gU1JQQ19TRVJWSUNFX1BJTkcpOworCUxBU1NFUlQoc3YtPnN2X2lkID09IFNSUENfU0VSVklDRV9QSU5HKTsKIAogCWlmIChyZXFzdG1zZy0+bXNnX21hZ2ljICE9IFNSUENfTVNHX01BR0lDKSB7Ci0JCUxBU1NFUlQgKHJlcXN0bXNnLT5tc2dfbWFnaWMgPT0gX19zd2FiMzIoU1JQQ19NU0dfTUFHSUMpKTsKKwkJTEFTU0VSVChyZXFzdG1zZy0+bXNnX21hZ2ljID09IF9fc3dhYjMyKFNSUENfTVNHX01BR0lDKSk7CiAKIAkJX19zd2FiMzJzKCZyZXEtPnBucl9zZXEpOwogCQlfX3N3YWIzMnMoJnJlcS0+cG5yX21hZ2ljKTsKIAkJX19zd2FiNjRzKCZyZXEtPnBucl90aW1lX3NlYyk7CiAJCV9fc3dhYjY0cygmcmVxLT5wbnJfdGltZV91c2VjKTsKIAl9Ci0JTEFTU0VSVCAocmVxc3Rtc2ctPm1zZ190eXBlID09IHNycGNfc2VydmljZTJyZXF1ZXN0KHN2LT5zdl9pZCkpOworCUxBU1NFUlQocmVxc3Rtc2ctPm1zZ190eXBlID09IHNycGNfc2VydmljZTJyZXF1ZXN0KHN2LT5zdl9pZCkpOwogCiAJaWYgKHJlcS0+cG5yX21hZ2ljICE9IExTVF9QSU5HX1RFU1RfTUFHSUMpIHsKLQkJQ0VSUk9SICgiVW5leHBlY3RlZCBtYWdpYyAlMDh4IGZyb20gJXNcbiIsCisJCUNFUlJPUigiVW5leHBlY3RlZCBtYWdpYyAlMDh4IGZyb20gJXNcbiIsCiAJCQlyZXEtPnBucl9tYWdpYywgbGliY2ZzX2lkMnN0cihycGMtPnNycGNfcGVlcikpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcnBjLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2xuZXQvc2VsZnRlc3QvcnBjLmMKaW5kZXggMWY3ZDlhNi4uMDgwNzg4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sbmV0L3NlbGZ0ZXN0L3JwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbG5ldC9zZWxmdGVzdC9ycGMuYwpAQCAtNzEsMTYgKzcxLDE2IEBACiB9CiAKIC8qIGZvcndhcmQgcmVmJ3MgKi8KLWludCBzcnBjX2hhbmRsZV9ycGMgKHN3aV93b3JraXRlbV90ICp3aSk7CitpbnQgc3JwY19oYW5kbGVfcnBjKHN3aV93b3JraXRlbV90ICp3aSk7CiAKLXZvaWQgc3JwY19nZXRfY291bnRlcnMgKHNycGNfY291bnRlcnNfdCAqY250KQordm9pZCBzcnBjX2dldF9jb3VudGVycyhzcnBjX2NvdW50ZXJzX3QgKmNudCkKIHsKIAlzcGluX2xvY2soJnNycGNfZGF0YS5ycGNfZ2xvY2spOwogCSpjbnQgPSBzcnBjX2RhdGEucnBjX2NvdW50ZXJzOwogCXNwaW5fdW5sb2NrKCZzcnBjX2RhdGEucnBjX2dsb2NrKTsKIH0KIAotdm9pZCBzcnBjX3NldF9jb3VudGVycyAoY29uc3Qgc3JwY19jb3VudGVyc190ICpjbnQpCit2b2lkIHNycGNfc2V0X2NvdW50ZXJzKGNvbnN0IHNycGNfY291bnRlcnNfdCAqY250KQogewogCXNwaW5fbG9jaygmc3JwY19kYXRhLnJwY19nbG9jayk7CiAJc3JwY19kYXRhLnJwY19jb3VudGVycyA9ICpjbnQ7CkBAIC0xMDIsMTYgKzEwMiwxNyBAQAogfQogCiB2b2lkCi1zcnBjX2ZyZWVfYnVsayAoc3JwY19idWxrX3QgKmJrKQorc3JwY19mcmVlX2J1bGsoc3JwY19idWxrX3QgKmJrKQogewogCWludAkgaTsKIAlzdHJ1Y3QgcGFnZSAqcGc7CiAKLQlMQVNTRVJUIChiayAhPSBOVUxMKTsKKwlMQVNTRVJUKGJrICE9IE5VTEwpOwogCiAJZm9yIChpID0gMDsgaSA8IGJrLT5ia19uaW92OyBpKyspIHsKIAkJcGcgPSBiay0+YmtfaW92c1tpXS5raW92X3BhZ2U7Ci0JCWlmIChwZyA9PSBOVUxMKSBicmVhazsKKwkJaWYgKHBnID09IE5VTEwpCisJCQlicmVhazsKIAogCQlfX2ZyZWVfcGFnZShwZyk7CiAJfQpAQCAtMTYwLDcgKzE2MSw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgX191NjQKLXNycGNfbmV4dF9pZCAodm9pZCkKK3NycGNfbmV4dF9pZCh2b2lkKQogewogCV9fdTY0IGlkOwogCkBAIC0zMzUsNyArMzM2LDcgQEAKIH0KIAogaW50Ci1zcnBjX3JlbW92ZV9zZXJ2aWNlIChzcnBjX3NlcnZpY2VfdCAqc3YpCitzcnBjX3JlbW92ZV9zZXJ2aWNlKHNycGNfc2VydmljZV90ICpzdikKIHsKIAlpbnQgaWQgPSBzdi0+c3ZfaWQ7CiAKQEAgLTM2Myw4ICszNjQsOCBAQAogCXJjID0gTE5ldE1FQXR0YWNoKHBvcnRhbCwgcGVlciwgbWF0Y2hiaXRzLCAwLCBMTkVUX1VOTElOSywKIAkJCSAgbG9jYWwgPyBMTkVUX0lOU19MT0NBTCA6IExORVRfSU5TX0FGVEVSLCAmbWVoKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJMTmV0TUVBdHRhY2ggZmFpbGVkOiAlZFxuIiwgcmMpOwotCQlMQVNTRVJUIChyYyA9PSAtRU5PTUVNKTsKKwkJQ0VSUk9SKCJMTmV0TUVBdHRhY2ggZmFpbGVkOiAlZFxuIiwgcmMpOworCQlMQVNTRVJUKHJjID09IC1FTk9NRU0pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTM3NywxNSArMzc4LDE1IEBACiAKIAlyYyA9IExOZXRNREF0dGFjaChtZWgsIG1kLCBMTkVUX1VOTElOSywgbWRoKTsKIAlpZiAocmMgIT0gMCkgewotCQlDRVJST1IgKCJMTmV0TURBdHRhY2ggZmFpbGVkOiAlZFxuIiwgcmMpOwotCQlMQVNTRVJUIChyYyA9PSAtRU5PTUVNKTsKKwkJQ0VSUk9SKCJMTmV0TURBdHRhY2ggZmFpbGVkOiAlZFxuIiwgcmMpOworCQlMQVNTRVJUKHJjID09IC1FTk9NRU0pOwogCiAJCXJjID0gTE5ldE1FVW5saW5rKG1laCk7Ci0JCUxBU1NFUlQgKHJjID09IDApOworCQlMQVNTRVJUKHJjID09IDApOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlDREVCVUcgKERfTkVULAorCUNERUJVRyhEX05FVCwKIAkJIlBvc3RlZCBwYXNzaXZlIFJETUE6IHBlZXIgJXMsIHBvcnRhbCAlZCwgbWF0Y2hiaXRzICUjbGx4XG4iLAogCQlsaWJjZnNfaWQyc3RyKHBlZXIpLCBwb3J0YWwsIG1hdGNoYml0cyk7CiAJcmV0dXJuIDA7CkBAIC00MDgsOCArNDA5LDggQEAKIAogCXJjID0gTE5ldE1EQmluZChtZCwgTE5FVF9VTkxJTkssIG1kaCk7CiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiTE5ldE1EQmluZCBmYWlsZWQ6ICVkXG4iLCByYyk7Ci0JCUxBU1NFUlQgKHJjID09IC1FTk9NRU0pOworCQlDRVJST1IoIkxOZXRNREJpbmQgZmFpbGVkOiAlZFxuIiwgcmMpOworCQlMQVNTRVJUKHJjID09IC1FTk9NRU0pOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTQyMCwxMyArNDIxLDEzIEBACiAJCXJjID0gTE5ldFB1dChzZWxmLCAqbWRoLCBMTkVUX05PQUNLX1JFUSwgcGVlciwKIAkJCSAgICAgcG9ydGFsLCBtYXRjaGJpdHMsIDAsIDApOwogCX0gZWxzZSB7Ci0JCUxBU1NFUlQgKChvcHRpb25zICYgTE5FVF9NRF9PUF9HRVQpICE9IDApOworCQlMQVNTRVJUKChvcHRpb25zICYgTE5FVF9NRF9PUF9HRVQpICE9IDApOwogCiAJCXJjID0gTE5ldEdldChzZWxmLCAqbWRoLCBwZWVyLCBwb3J0YWwsIG1hdGNoYml0cywgMCk7CiAJfQogCiAJaWYgKHJjICE9IDApIHsKLQkJQ0VSUk9SICgiTE5ldCVzKCVzLCAlZCwgJWxsZCkgZmFpbGVkOiAlZFxuIiwKKwkJQ0VSUk9SKCJMTmV0JXMoJXMsICVkLCAlbGxkKSBmYWlsZWQ6ICVkXG4iLAogCQkJKChvcHRpb25zICYgTE5FVF9NRF9PUF9QVVQpICE9IDApID8gIlB1dCIgOiAiR2V0IiwKIAkJCWxpYmNmc19pZDJzdHIocGVlciksIHBvcnRhbCwgbWF0Y2hiaXRzLCByYyk7CiAKQEAgLTQzNCw5ICs0MzUsOSBAQAogCQkgKiB3aXRoIGZhaWx1cmUsIHNvIGZhbGwgdGhyb3VnaCBhbmQgcmV0dXJuIHN1Y2Nlc3MgaGVyZS4KIAkJICovCiAJCXJjID0gTE5ldE1EVW5saW5rKCptZGgpOwotCQlMQVNTRVJUIChyYyA9PSAwKTsKKwkJTEFTU0VSVChyYyA9PSAwKTsKIAl9IGVsc2UgewotCQlDREVCVUcgKERfTkVULAorCQlDREVCVUcoRF9ORVQsCiAJCQkiUG9zdGVkIGFjdGl2ZSBSRE1BOiBwZWVyICVzLCBwb3J0YWwgJXUsIG1hdGNoYml0cyAlI2xseFxuIiwKIAkJCWxpYmNmc19pZDJzdHIocGVlciksIHBvcnRhbCwgbWF0Y2hiaXRzKTsKIAl9CkBAIC03ODgsNyArNzg5LDcgQEAKIH0KIAogc3RhdGljIGludAotc3JwY19zZW5kX3JlcXVlc3QgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzcnBjX3NlbmRfcmVxdWVzdChzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQogewogCXNycGNfZXZlbnRfdCAqZXYgPSAmcnBjLT5jcnBjX3JlcXN0ZXY7CiAJaW50CSAgIHJjOwpAQCAtODAxLDE0ICs4MDIsMTQgQEAKIAkJCQkgICAgICZycGMtPmNycGNfcmVxc3Rtc2csIHNpemVvZihzcnBjX21zZ190KSwKIAkJCQkgICAgICZycGMtPmNycGNfcmVxc3RtZGgsIGV2KTsKIAlpZiAocmMgIT0gMCkgewotCQlMQVNTRVJUIChyYyA9PSAtRU5PTUVNKTsKKwkJTEFTU0VSVChyYyA9PSAtRU5PTUVNKTsKIAkJZXYtPmV2X2ZpcmVkID0gMTsgIC8qIG5vIG1vcmUgZXZlbnQgZXhwZWN0ZWQgKi8KIAl9CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50Ci1zcnBjX3ByZXBhcmVfcmVwbHkgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzcnBjX3ByZXBhcmVfcmVwbHkoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKIHsKIAlzcnBjX2V2ZW50X3QgKmV2ID0gJnJwYy0+Y3JwY19yZXBseWV2OwogCV9fdTY0CSppZCA9ICZycGMtPmNycGNfcmVxc3Rtc2cubXNnX2JvZHkucmVxc3QucnB5aWQ7CkBAIC04MjUsMTQgKzgyNiwxNCBAQAogCQkJCSAgICBMTkVUX01EX09QX1BVVCwgcnBjLT5jcnBjX2Rlc3QsCiAJCQkJICAgICZycGMtPmNycGNfcmVwbHltZGgsIGV2KTsKIAlpZiAocmMgIT0gMCkgewotCQlMQVNTRVJUIChyYyA9PSAtRU5PTUVNKTsKKwkJTEFTU0VSVChyYyA9PSAtRU5PTUVNKTsKIAkJZXYtPmV2X2ZpcmVkID0gMTsgIC8qIG5vIG1vcmUgZXZlbnQgZXhwZWN0ZWQgKi8KIAl9CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgaW50Ci1zcnBjX3ByZXBhcmVfYnVsayAoc3JwY19jbGllbnRfcnBjX3QgKnJwYykKK3NycGNfcHJlcGFyZV9idWxrKHNycGNfY2xpZW50X3JwY190ICpycGMpCiB7CiAJc3JwY19idWxrX3QgICpiayA9ICZycGMtPmNycGNfYnVsazsKIAlzcnBjX2V2ZW50X3QgKmV2ID0gJnJwYy0+Y3JwY19idWxrZXY7CkBAIC04NDAsOSArODQxLDEwIEBACiAJaW50CSAgIHJjOwogCWludAkgICBvcHQ7CiAKLQlMQVNTRVJUIChiay0+YmtfbmlvdiA8PSBMTkVUX01BWF9JT1YpOworCUxBU1NFUlQoYmstPmJrX25pb3YgPD0gTE5FVF9NQVhfSU9WKTsKIAotCWlmIChiay0+YmtfbmlvdiA9PSAwKSByZXR1cm4gMDsgLyogbm90aGluZyB0byBkbyAqLworCWlmIChiay0+YmtfbmlvdiA9PSAwKQorCQlyZXR1cm4gMDsgLyogbm90aGluZyB0byBkbyAqLwogCiAJb3B0ID0gYmstPmJrX3NpbmsgPyBMTkVUX01EX09QX1BVVCA6IExORVRfTURfT1BfR0VUOwogCW9wdCB8PSBMTkVUX01EX0tJT1Y7CkBAIC04NTcsMTQgKzg1OSwxNCBAQAogCQkJCSAgICAmYmstPmJrX2lvdnNbMF0sIGJrLT5ia19uaW92LCBvcHQsCiAJCQkJICAgIHJwYy0+Y3JwY19kZXN0LCAmYmstPmJrX21kaCwgZXYpOwogCWlmIChyYyAhPSAwKSB7Ci0JCUxBU1NFUlQgKHJjID09IC1FTk9NRU0pOworCQlMQVNTRVJUKHJjID09IC1FTk9NRU0pOwogCQlldi0+ZXZfZmlyZWQgPSAxOyAgLyogbm8gbW9yZSBldmVudCBleHBlY3RlZCAqLwogCX0KIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQKLXNycGNfZG9fYnVsayAoc3JwY19zZXJ2ZXJfcnBjX3QgKnJwYykKK3NycGNfZG9fYnVsayhzcnBjX3NlcnZlcl9ycGNfdCAqcnBjKQogewogCXNycGNfZXZlbnRfdCAgKmV2ID0gJnJwYy0+c3JwY19ldjsKIAlzcnBjX2J1bGtfdCAgICpiayA9IHJwYy0+c3JwY19idWxrOwpAQCAtODcyLDcgKzg3NCw3IEBACiAJaW50CSAgICByYzsKIAlpbnQJICAgIG9wdDsKIAotCUxBU1NFUlQgKGJrICE9IE5VTEwpOworCUxBU1NFUlQoYmsgIT0gTlVMTCk7CiAKIAlvcHQgPSBiay0+Ymtfc2luayA/IExORVRfTURfT1BfR0VUIDogTE5FVF9NRF9PUF9QVVQ7CiAJb3B0IHw9IExORVRfTURfS0lPVjsKQEAgLTg5OCwxMSArOTAwLDExIEBACiAJc3RydWN0IHNycGNfc2VydmljZQkqc3YgID0gc2NkLT5zY2Rfc3ZjOwogCXNycGNfYnVmZmVyX3QJCSpidWZmZXI7CiAKLQlMQVNTRVJUIChzdGF0dXMgIT0gMCB8fCBycGMtPnNycGNfd2kuc3dpX3N0YXRlID09IFNXSV9TVEFURV9ET05FKTsKKwlMQVNTRVJUKHN0YXR1cyAhPSAwIHx8IHJwYy0+c3JwY193aS5zd2lfc3RhdGUgPT0gU1dJX1NUQVRFX0RPTkUpOwogCiAJcnBjLT5zcnBjX3N0YXR1cyA9IHN0YXR1czsKIAotCUNERUJVR19MSU1JVCAoc3RhdHVzID09IDAgPyBEX05FVCA6IERfTkVURVJST1IsCisJQ0RFQlVHX0xJTUlUKHN0YXR1cyA9PSAwID8gRF9ORVQgOiBEX05FVEVSUk9SLAogCQkiU2VydmVyIFJQQyAlcCBkb25lOiBzZXJ2aWNlICVzLCBwZWVyICVzLCBzdGF0dXMgJXM6JWRcbiIsCiAJCXJwYywgc3YtPnN2X25hbWUsIGxpYmNmc19pZDJzdHIocnBjLT5zcnBjX3BlZXIpLAogCQlzd2lfc3RhdGUyc3RyKHJwYy0+c3JwY193aS5zd2lfc3RhdGUpLCBzdGF0dXMpOwpAQCAtOTg1LDcgKzk4Nyw3IEBACiAKIAlzd2l0Y2ggKHdpLT5zd2lfc3RhdGUpIHsKIAlkZWZhdWx0OgotCQlMQlVHICgpOworCQlMQlVHKCk7CiAJY2FzZSBTV0lfU1RBVEVfTkVXQk9STjogewogCQlzcnBjX21zZ190CSAgICptc2c7CiAJCXNycGNfZ2VuZXJpY19yZXBseV90ICpyZXBseTsKQEAgLTEwMjMsMTIgKzEwMjUsMTIgQEAKIAkJCWlmIChyYyA9PSAwKQogCQkJCXJldHVybiAwOyAvKiB3YWl0IGZvciBidWxrICovCiAKLQkJCUxBU1NFUlQgKGV2LT5ldl9maXJlZCk7CisJCQlMQVNTRVJUKGV2LT5ldl9maXJlZCk7CiAJCQlldi0+ZXZfc3RhdHVzID0gcmM7CiAJCX0KIAl9CiAJY2FzZSBTV0lfU1RBVEVfQlVMS19TVEFSVEVEOgotCQlMQVNTRVJUIChycGMtPnNycGNfYnVsayA9PSBOVUxMIHx8IGV2LT5ldl9maXJlZCk7CisJCUxBU1NFUlQocnBjLT5zcnBjX2J1bGsgPT0gTlVMTCB8fCBldi0+ZXZfZmlyZWQpOwogCiAJCWlmIChycGMtPnNycGNfYnVsayAhPSBOVUxMKSB7CiAJCQlyYyA9IGV2LT5ldl9zdGF0dXM7CkBAIC0xMDU1LDcgKzEwNTcsNyBAQAogCQkJICAgICAgIHJwYywgcnBjLT5zcnBjX2J1bGssIHN2LT5zdl9pZCk7CiAJCQlDRVJST1IoIkV2ZW50OiBzdGF0dXMgJWQsIHR5cGUgJWQsIGxuZXQgJWRcbiIsCiAJCQkgICAgICAgZXYtPmV2X3N0YXR1cywgZXYtPmV2X3R5cGUsIGV2LT5ldl9sbmV0KTsKLQkJCUxBU1NFUlQgKGV2LT5ldl9maXJlZCk7CisJCQlMQVNTRVJUKGV2LT5ldl9maXJlZCk7CiAJCX0KIAogCQl3aS0+c3dpX3N0YXRlID0gU1dJX1NUQVRFX0RPTkU7CkBAIC0xMDY3LDExICsxMDY5LDExIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1zcnBjX2NsaWVudF9ycGNfZXhwaXJlZCAodm9pZCAqZGF0YSkKK3NycGNfY2xpZW50X3JwY19leHBpcmVkKHZvaWQgKmRhdGEpCiB7CiAJc3JwY19jbGllbnRfcnBjX3QgKnJwYyA9IGRhdGE7CiAKLQlDV0FSTiAoIkNsaWVudCBSUEMgZXhwaXJlZDogc2VydmljZSAlZCwgcGVlciAlcywgdGltZW91dCAlZC5cbiIsCisJQ1dBUk4oIkNsaWVudCBSUEMgZXhwaXJlZDogc2VydmljZSAlZCwgcGVlciAlcywgdGltZW91dCAlZC5cbiIsCiAJICAgICAgIHJwYy0+Y3JwY19zZXJ2aWNlLCBsaWJjZnNfaWQyc3RyKHJwYy0+Y3JwY19kZXN0KSwKIAkgICAgICAgcnBjLT5jcnBjX3RpbWVvdXQpOwogCkBAIC0xMDg4LDExICsxMDkwLDEyIEBACiB9CiAKIGlubGluZSB2b2lkCi1zcnBjX2FkZF9jbGllbnRfcnBjX3RpbWVyIChzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQorc3JwY19hZGRfY2xpZW50X3JwY190aW1lcihzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQogewogCXN0dF90aW1lcl90ICp0aW1lciA9ICZycGMtPmNycGNfdGltZXI7CiAKLQlpZiAocnBjLT5jcnBjX3RpbWVvdXQgPT0gMCkgcmV0dXJuOworCWlmIChycGMtPmNycGNfdGltZW91dCA9PSAwKQorCQlyZXR1cm47CiAKIAlJTklUX0xJU1RfSEVBRCgmdGltZXItPnN0dF9saXN0KTsKIAl0aW1lci0+c3R0X2RhdGEgICAgPSBycGM7CkBAIC0xMTA5LDcgKzExMTIsNyBAQAogICogVXBvbiBleGl0IHRoZSBSUEMgZXhwaXJ5IHRpbWVyIGlzIG5vdCBxdWV1ZWQgYW5kIHRoZSBoYW5kbGVyIGlzIG5vdAogICogcnVubmluZyBvbiBhbnkgQ1BVLiAqLwogc3RhdGljIHZvaWQKLXNycGNfZGVsX2NsaWVudF9ycGNfdGltZXIgKHNycGNfY2xpZW50X3JwY190ICpycGMpCitzcnBjX2RlbF9jbGllbnRfcnBjX3RpbWVyKHNycGNfY2xpZW50X3JwY190ICpycGMpCiB7CiAJLyogdGltZXIgbm90IHBsYW50ZWQgb3IgYWxyZWFkeSBleHBsb2RlZCAqLwogCWlmIChycGMtPmNycGNfdGltZW91dCA9PSAwKQpAQCAtMTEzMCw3ICsxMTMzLDcgQEAKIH0KIAogc3RhdGljIHZvaWQKLXNycGNfY2xpZW50X3JwY19kb25lIChzcnBjX2NsaWVudF9ycGNfdCAqcnBjLCBpbnQgc3RhdHVzKQorc3JwY19jbGllbnRfcnBjX2RvbmUoc3JwY19jbGllbnRfcnBjX3QgKnJwYywgaW50IHN0YXR1cykKIHsKIAlzd2lfd29ya2l0ZW1fdCAqd2kgPSAmcnBjLT5jcnBjX3dpOwogCkBAIC0xMTQ0LDcgKzExNDcsNyBAQAogCiAJc3JwY19kZWxfY2xpZW50X3JwY190aW1lcihycGMpOwogCi0JQ0RFQlVHX0xJTUlUICgoc3RhdHVzID09IDApID8gRF9ORVQgOiBEX05FVEVSUk9SLAorCUNERUJVR19MSU1JVCgoc3RhdHVzID09IDApID8gRF9ORVQgOiBEX05FVEVSUk9SLAogCQkiQ2xpZW50IFJQQyBkb25lOiBzZXJ2aWNlICVkLCBwZWVyICVzLCBzdGF0dXMgJXM6JWQ6JWRcbiIsCiAJCXJwYy0+Y3JwY19zZXJ2aWNlLCBsaWJjZnNfaWQyc3RyKHJwYy0+Y3JwY19kZXN0KSwKIAkJc3dpX3N0YXRlMnN0cih3aS0+c3dpX3N0YXRlKSwgcnBjLT5jcnBjX2Fib3J0ZWQsIHN0YXR1cyk7CkBAIC0xMTU3LDcgKzExNjAsNyBAQAogCSAqICAgc2NoZWR1bGluZyBtZS4KIAkgKiBDYW5jZWwgcGVuZGluZyBzY2hlZHVsZXMgYW5kIHByZXZlbnQgZnV0dXJlIHNjaGVkdWxlIGF0dGVtcHRzOgogCSAqLwotCUxBU1NFUlQgKCFzcnBjX2V2ZW50X3BlbmRpbmcocnBjKSk7CisJTEFTU0VSVCghc3JwY19ldmVudF9wZW5kaW5nKHJwYykpOwogCXN3aV9leGl0X3dvcmtpdGVtKHdpKTsKIAogCXNwaW5fdW5sb2NrKCZycGMtPmNycGNfbG9jayk7CkBAIC0xMTY4LDcgKzExNzEsNyBAQAogCiAvKiBzZW5kcyBhbiBvdXRnb2luZyBSUEMgKi8KIGludAotc3JwY19zZW5kX3JwYyAoc3dpX3dvcmtpdGVtX3QgKndpKQorc3JwY19zZW5kX3JwYyhzd2lfd29ya2l0ZW1fdCAqd2kpCiB7CiAJaW50CQlyYyA9IDA7CiAJc3JwY19jbGllbnRfcnBjX3QgKnJwYzsKQEAgLTExNzksOCArMTE4Miw4IEBACiAKIAlycGMgPSB3aS0+c3dpX3dvcmtpdGVtLndpX2RhdGE7CiAKLQlMQVNTRVJUIChycGMgIT0gTlVMTCk7Ci0JTEFTU0VSVCAod2kgPT0gJnJwYy0+Y3JwY193aSk7CisJTEFTU0VSVChycGMgIT0gTlVMTCk7CisJTEFTU0VSVCh3aSA9PSAmcnBjLT5jcnBjX3dpKTsKIAogCXJlcGx5ID0gJnJwYy0+Y3JwY19yZXBseW1zZzsKIAlkb19idWxrID0gcnBjLT5jcnBjX2J1bGsuYmtfbmlvdiA+IDA7CkBAIC0xMTk2LDkgKzExOTksOSBAQAogCiAJc3dpdGNoICh3aS0+c3dpX3N0YXRlKSB7CiAJZGVmYXVsdDoKLQkJTEJVRyAoKTsKKwkJTEJVRygpOwogCWNhc2UgU1dJX1NUQVRFX05FV0JPUk46Ci0JCUxBU1NFUlQgKCFzcnBjX2V2ZW50X3BlbmRpbmcocnBjKSk7CisJCUxBU1NFUlQoIXNycGNfZXZlbnRfcGVuZGluZyhycGMpKTsKIAogCQlyYyA9IHNycGNfcHJlcGFyZV9yZXBseShycGMpOwogCQlpZiAocmMgIT0gMCkgewpAQCAtMTIwNyw3ICsxMjEwLDggQEAKIAkJfQogCiAJCXJjID0gc3JwY19wcmVwYXJlX2J1bGsocnBjKTsKLQkJaWYgKHJjICE9IDApIGJyZWFrOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOwogCiAJCXdpLT5zd2lfc3RhdGUgPSBTV0lfU1RBVEVfUkVRVUVTVF9TVUJNSVRURUQ7CiAJCXJjID0gc3JwY19zZW5kX3JlcXVlc3QocnBjKTsKQEAgLTEyMTcsMjAgKzEyMjEsMjQgQEAKIAkJLyogQ0FWRUFUIEVNUFRPUjogcnF0ZXYsIHJweWV2LCBhbmQgYnVsa2V2IG1heSBjb21lIGluIGFueQogCQkgKiBvcmRlcjsgaG93ZXZlciwgdGhleSdyZSBwcm9jZXNzZWQgaW4gYSBzdHJpY3Qgb3JkZXI6CiAJCSAqIHJxdCwgcnB5LCBhbmQgYnVsay4gKi8KLQkJaWYgKCFycGMtPmNycGNfcmVxc3Rldi5ldl9maXJlZCkgYnJlYWs7CisJCWlmICghcnBjLT5jcnBjX3JlcXN0ZXYuZXZfZmlyZWQpCisJCQlicmVhazsKIAogCQlyYyA9IHJwYy0+Y3JwY19yZXFzdGV2LmV2X3N0YXR1czsKLQkJaWYgKHJjICE9IDApIGJyZWFrOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOwogCiAJCXdpLT5zd2lfc3RhdGUgPSBTV0lfU1RBVEVfUkVRVUVTVF9TRU5UOwogCQkvKiBwZXJoYXBzIG1vcmUgZXZlbnRzLCBmYWxsIHRocnUgKi8KIAljYXNlIFNXSV9TVEFURV9SRVFVRVNUX1NFTlQ6IHsKIAkJc3JwY19tc2dfdHlwZV90IHR5cGUgPSBzcnBjX3NlcnZpY2UycmVwbHkocnBjLT5jcnBjX3NlcnZpY2UpOwogCi0JCWlmICghcnBjLT5jcnBjX3JlcGx5ZXYuZXZfZmlyZWQpIGJyZWFrOworCQlpZiAoIXJwYy0+Y3JwY19yZXBseWV2LmV2X2ZpcmVkKQorCQkJYnJlYWs7CiAKIAkJcmMgPSBycGMtPmNycGNfcmVwbHlldi5ldl9zdGF0dXM7Ci0JCWlmIChyYyAhPSAwKSBicmVhazsKKwkJaWYgKHJjICE9IDApCisJCQlicmVhazsKIAogCQlzcnBjX3VucGFja19tc2dfaGRyKHJlcGx5KTsKIAkJaWYgKHJlcGx5LT5tc2dfdHlwZSAhPSB0eXBlIHx8CkBAIC0xMjU0LDcgKzEyNjIsOCBAQAogCQl3aS0+c3dpX3N0YXRlID0gU1dJX1NUQVRFX1JFUExZX1JFQ0VJVkVEOwogCX0KIAljYXNlIFNXSV9TVEFURV9SRVBMWV9SRUNFSVZFRDoKLQkJaWYgKGRvX2J1bGsgJiYgIXJwYy0+Y3JwY19idWxrZXYuZXZfZmlyZWQpIGJyZWFrOworCQlpZiAoZG9fYnVsayAmJiAhcnBjLT5jcnBjX2J1bGtldi5ldl9maXJlZCkKKwkJCWJyZWFrOwogCiAJCXJjID0gZG9fYnVsayA/IHJwYy0+Y3JwY19idWxrZXYuZXZfc3RhdHVzIDogMDsKIApAQCAtMTI5Miw3ICsxMzAxLDcgQEAKIH0KIAogc3JwY19jbGllbnRfcnBjX3QgKgotc3JwY19jcmVhdGVfY2xpZW50X3JwYyAobG5ldF9wcm9jZXNzX2lkX3QgcGVlciwgaW50IHNlcnZpY2UsCitzcnBjX2NyZWF0ZV9jbGllbnRfcnBjKGxuZXRfcHJvY2Vzc19pZF90IHBlZXIsIGludCBzZXJ2aWNlLAogCQkJaW50IG5idWxraW92LCBpbnQgYnVsa2xlbiwKIAkJCXZvaWQgKCpycGNfZG9uZSkoc3JwY19jbGllbnRfcnBjX3QgKiksCiAJCQl2b2lkICgqcnBjX2ZpbmkpKHNycGNfY2xpZW50X3JwY190ICopLCB2b2lkICpwcml2KQpAQCAtMTMxMSwxNSArMTMyMCwxNSBAQAogCiAvKiBjYWxsZWQgd2l0aCBycGMtPmNycGNfbG9jayBoZWxkICovCiB2b2lkCi1zcnBjX2Fib3J0X3JwYyAoc3JwY19jbGllbnRfcnBjX3QgKnJwYywgaW50IHdoeSkKK3NycGNfYWJvcnRfcnBjKHNycGNfY2xpZW50X3JwY190ICpycGMsIGludCB3aHkpCiB7Ci0JTEFTU0VSVCAod2h5ICE9IDApOworCUxBU1NFUlQod2h5ICE9IDApOwogCiAJaWYgKHJwYy0+Y3JwY19hYm9ydGVkIHx8IC8qIGFscmVhZHkgYWJvcnRlZCAqLwogCSAgICBycGMtPmNycGNfY2xvc2VkKSAgICAvKiBjYWxsYmFjayBpbW1pbmVudCAqLwogCQlyZXR1cm47CiAKLQlDREVCVUcgKERfTkVULAorCUNERUJVRyhEX05FVCwKIAkJIkFib3J0aW5nIFJQQzogc2VydmljZSAlZCwgcGVlciAlcywgc3RhdGUgJXMsIHdoeSAlZFxuIiwKIAkJcnBjLT5jcnBjX3NlcnZpY2UsIGxpYmNmc19pZDJzdHIocnBjLT5jcnBjX2Rlc3QpLAogCQlzd2lfc3RhdGUyc3RyKHJwYy0+Y3JwY193aS5zd2lfc3RhdGUpLCB3aHkpOwpAQCAtMTMzMiwxMiArMTM0MSwxMiBAQAogCiAvKiBjYWxsZWQgd2l0aCBycGMtPmNycGNfbG9jayBoZWxkICovCiB2b2lkCi1zcnBjX3Bvc3RfcnBjIChzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQorc3JwY19wb3N0X3JwYyhzcnBjX2NsaWVudF9ycGNfdCAqcnBjKQogewotCUxBU1NFUlQgKCFycGMtPmNycGNfYWJvcnRlZCk7Ci0JTEFTU0VSVCAoc3JwY19kYXRhLnJwY19zdGF0ZSA9PSBTUlBDX1NUQVRFX1JVTk5JTkcpOworCUxBU1NFUlQoIXJwYy0+Y3JwY19hYm9ydGVkKTsKKwlMQVNTRVJUKHNycGNfZGF0YS5ycGNfc3RhdGUgPT0gU1JQQ19TVEFURV9SVU5OSU5HKTsKIAotCUNERUJVRyAoRF9ORVQsICJQb3N0aW5nIFJQQzogcGVlciAlcywgc2VydmljZSAlZCwgdGltZW91dCAlZFxuIiwKKwlDREVCVUcoRF9ORVQsICJQb3N0aW5nIFJQQzogcGVlciAlcywgc2VydmljZSAlZCwgdGltZW91dCAlZFxuIiwKIAkJbGliY2ZzX2lkMnN0cihycGMtPmNycGNfZGVzdCksIHJwYy0+Y3JwY19zZXJ2aWNlLAogCQlycGMtPmNycGNfdGltZW91dCk7CiAKQEAgLTE0MDMsNyArMTQxMiw3IEBACiAJc3JwY19tc2dfdAkqbXNnOwogCXNycGNfbXNnX3R5cGVfdCAgICB0eXBlOwogCi0JTEFTU0VSVCAoIWluX2ludGVycnVwdCgpKTsKKwlMQVNTRVJUKCFpbl9pbnRlcnJ1cHQoKSk7CiAKIAlpZiAoZXYtPnN0YXR1cyAhPSAwKSB7CiAJCXNwaW5fbG9jaygmc3JwY19kYXRhLnJwY19nbG9jayk7CkBAIC0xNDE3LDcgKzE0MjYsNyBAQAogCWRlZmF1bHQ6CiAJCUNFUlJPUigiVW5rbm93biBldmVudDogc3RhdHVzICVkLCB0eXBlICVkLCBsbmV0ICVkXG4iLAogCQkgICAgICAgcnBjZXYtPmV2X3N0YXR1cywgcnBjZXYtPmV2X3R5cGUsIHJwY2V2LT5ldl9sbmV0KTsKLQkJTEJVRyAoKTsKKwkJTEJVRygpOwogCWNhc2UgU1JQQ19SRVFVRVNUX1NFTlQ6CiAJCWlmIChldi0+c3RhdHVzID09IDAgJiYgZXYtPnR5cGUgIT0gTE5FVF9FVkVOVF9VTkxJTkspIHsKIAkJCXNwaW5fbG9jaygmc3JwY19kYXRhLnJwY19nbG9jayk7CkBAIC0xNDM2LDcgKzE0NDUsNyBAQAogCQkJICAgICAgICZjcnBjLT5jcnBjX3JlcGx5ZXYsICZjcnBjLT5jcnBjX2J1bGtldik7CiAJCQlDRVJST1IoIkJhZCBldmVudDogc3RhdHVzICVkLCB0eXBlICVkLCBsbmV0ICVkXG4iLAogCQkJICAgICAgIHJwY2V2LT5ldl9zdGF0dXMsIHJwY2V2LT5ldl90eXBlLCBycGNldi0+ZXZfbG5ldCk7Ci0JCQlMQlVHICgpOworCQkJTEJVRygpOwogCQl9CiAKIAkJc3Bpbl9sb2NrKCZjcnBjLT5jcnBjX2xvY2spOwpAQCAtMTQ1OCwxMCArMTQ2NywxMCBAQAogCiAJCXNwaW5fbG9jaygmc2NkLT5zY2RfbG9jayk7CiAKLQkJTEFTU0VSVCAoZXYtPnVubGlua2VkKTsKLQkJTEFTU0VSVCAoZXYtPnR5cGUgPT0gTE5FVF9FVkVOVF9QVVQgfHwKKwkJTEFTU0VSVChldi0+dW5saW5rZWQpOworCQlMQVNTRVJUKGV2LT50eXBlID09IExORVRfRVZFTlRfUFVUIHx8CiAJCQkgZXYtPnR5cGUgPT0gTE5FVF9FVkVOVF9VTkxJTkspOwotCQlMQVNTRVJUIChldi0+dHlwZSAhPSBMTkVUX0VWRU5UX1VOTElOSyB8fAorCQlMQVNTRVJUKGV2LT50eXBlICE9IExORVRfRVZFTlRfVU5MSU5LIHx8CiAJCQkgc3YtPnN2X3NodXR0aW5nZG93bik7CiAKIAkJYnVmZmVyID0gY29udGFpbmVyX29mKGV2LT5tZC5zdGFydCwgc3JwY19idWZmZXJfdCwgYnVmX21zZyk7CkBAIC0xNTM2LDcgKzE1NDUsNyBAQAogCQlicmVhazsKIAogCWNhc2UgU1JQQ19CVUxLX0dFVF9SUExEOgotCQlMQVNTRVJUIChldi0+dHlwZSA9PSBMTkVUX0VWRU5UX1NFTkQgfHwKKwkJTEFTU0VSVChldi0+dHlwZSA9PSBMTkVUX0VWRU5UX1NFTkQgfHwKIAkJCSBldi0+dHlwZSA9PSBMTkVUX0VWRU5UX1JFUExZIHx8CiAJCQkgZXYtPnR5cGUgPT0gTE5FVF9FVkVOVF9VTkxJTkspOwogCkBAIC0xNTc0LDcgKzE1ODMsNyBAQAogCiAKIGludAotc3JwY19zdGFydHVwICh2b2lkKQorc3JwY19zdGFydHVwKHZvaWQpCiB7CiAJaW50IHJjOwogCkBAIC0xNTkwLDcgKzE1OTksNyBAQAogCiAJcmMgPSBMTmV0TklJbml0KExVU1RSRV9TUlZfTE5FVF9QSUQpOwogCWlmIChyYyA8IDApIHsKLQkJQ0VSUk9SICgiTE5ldE5JSW5pdCgpIGhhcyBmYWlsZWQ6ICVkXG4iLCByYyk7CisJCUNFUlJPUigiTE5ldE5JSW5pdCgpIGhhcyBmYWlsZWQ6ICVkXG4iLCByYyk7CiAJCXJldHVybiByYzsKIAl9CiAKQEAgLTE2MjIsNyArMTYzMSw3IEBACiB9CiAKIHZvaWQKLXNycGNfc2h1dGRvd24gKHZvaWQpCitzcnBjX3NodXRkb3duKHZvaWQpCiB7CiAJaW50IGk7CiAJaW50IHJjOwpAQCAtMTYzMywxNCArMTY0MiwxNCBAQAogCiAJc3dpdGNoIChzdGF0ZSkgewogCWRlZmF1bHQ6Ci0JCUxCVUcgKCk7CisJCUxCVUcoKTsKIAljYXNlIFNSUENfU1RBVEVfUlVOTklORzoKIAkJc3Bpbl9sb2NrKCZzcnBjX2RhdGEucnBjX2dsb2NrKTsKIAogCQlmb3IgKGkgPSAwOyBpIDw9IFNSUENfU0VSVklDRV9NQVhfSUQ7IGkrKykgewogCQkJc3JwY19zZXJ2aWNlX3QgKnN2ID0gc3JwY19kYXRhLnJwY19zZXJ2aWNlc1tpXTsKIAotCQkJTEFTU0VSVEYgKHN2ID09IE5VTEwsCisJCQlMQVNTRVJURihzdiA9PSBOVUxMLAogCQkJCSAgInNlcnZpY2Ugbm90IGVtcHR5OiBpZCAlZCwgbmFtZSAlc1xuIiwKIAkJCQkgIGksIHN2LT5zdl9uYW1lKTsKIAkJfQpAQCAtMTY1Miw5ICsxNjYxLDkgQEAKIAljYXNlIFNSUENfU1RBVEVfRVFfSU5JVDoKIAkJcmMgPSBMTmV0Q2xlYXJMYXp5UG9ydGFsKFNSUENfRlJBTUVXT1JLX1JFUVVFU1RfUE9SVEFMKTsKIAkJcmMgPSBMTmV0Q2xlYXJMYXp5UG9ydGFsKFNSUENfUkVRVUVTVF9QT1JUQUwpOwotCQlMQVNTRVJUIChyYyA9PSAwKTsKKwkJTEFTU0VSVChyYyA9PSAwKTsKIAkJcmMgPSBMTmV0RVFGcmVlKHNycGNfZGF0YS5ycGNfbG5ldF9lcSk7Ci0JCUxBU1NFUlQgKHJjID09IDApOyAvKiB0aGUgRVEgc2hvdWxkIGhhdmUgbm8gdXNlciBieSBub3cgKi8KKwkJTEFTU0VSVChyYyA9PSAwKTsgLyogdGhlIEVRIHNob3VsZCBoYXZlIG5vIHVzZXIgYnkgbm93ICovCiAKIAljYXNlIFNSUENfU1RBVEVfTklfSU5JVDoKIAkJTE5ldE5JRmluaSgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL0tjb25maWcKaW5kZXggNjcyNTQ2Ny4uNjJjN2JiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9LY29uZmlnCkBAIC0xMCw2ICsxMCw3IEBACiAJc2VsZWN0IENSWVBUT19TSEExCiAJc2VsZWN0IENSWVBUT19TSEEyNTYKIAlzZWxlY3QgQ1JZUFRPX1NIQTUxMgorCWRlcGVuZHMgb24gTVVMVElVU0VSCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBMdXN0cmUgZmlsZSBzeXN0ZW0gY2xpZW50IHN1cHBvcnQuIENob29zZSBZCiAJICBoZXJlIGlmIHlvdSB3YW50IHRvIGFjY2VzcyBhIEx1c3RyZSBmaWxlIHN5c3RlbSBjbHVzdGVyLiBUbyBjb21waWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvbHByb2NfZmlkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9maWQvbHByb2NfZmlkLmMKaW5kZXggNmEyMWYwNy4uNzgzOTM5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmlkL2xwcm9jX2ZpZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZpZC9scHJvY19maWQuYwpAQCAtMTIwLDE1ICsxMjAsMTQgQEAKIGxwcm9jZnNfZmlkX3NwYWNlX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKQogewogCXN0cnVjdCBsdV9jbGllbnRfc2VxICpzZXEgPSAoc3RydWN0IGx1X2NsaWVudF9zZXEgKiltLT5wcml2YXRlOwotCWludCByYzsKIAogCUxBU1NFUlQoc2VxICE9IE5VTEwpOwogCiAJbXV0ZXhfbG9jaygmc2VxLT5sY3NfbXV0ZXgpOwotCXJjID0gc2VxX3ByaW50ZihtLCAiWyUjbGx4IC0gJSNsbHhdOiV4OiVzXG4iLCBQUkFOR0UoJnNlcS0+bGNzX3NwYWNlKSk7CisJc2VxX3ByaW50ZihtLCAiWyUjbGx4IC0gJSNsbHhdOiV4OiVzXG4iLCBQUkFOR0UoJnNlcS0+bGNzX3NwYWNlKSk7CiAJbXV0ZXhfdW5sb2NrKCZzZXEtPmxjc19tdXRleCk7CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxwcm9jZnNfZmlkX3dpZHRoX3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTE3MCwzMCArMTY5LDI4IEBACiBscHJvY2ZzX2ZpZF93aWR0aF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKIAlzdHJ1Y3QgbHVfY2xpZW50X3NlcSAqc2VxID0gKHN0cnVjdCBsdV9jbGllbnRfc2VxICopbS0+cHJpdmF0ZTsKLQlpbnQgcmM7CiAKIAlMQVNTRVJUKHNlcSAhPSBOVUxMKTsKIAogCW11dGV4X2xvY2soJnNlcS0+bGNzX211dGV4KTsKLQlyYyA9IHNlcV9wcmludGYobSwgIiVsbHVcbiIsIHNlcS0+bGNzX3dpZHRoKTsKKwlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCBzZXEtPmxjc193aWR0aCk7CiAJbXV0ZXhfdW5sb2NrKCZzZXEtPmxjc19tdXRleCk7CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGxwcm9jZnNfZmlkX2ZpZF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnVudXNlZCkKIHsKIAlzdHJ1Y3QgbHVfY2xpZW50X3NlcSAqc2VxID0gKHN0cnVjdCBsdV9jbGllbnRfc2VxICopbS0+cHJpdmF0ZTsKLQlpbnQgcmM7CiAKIAlMQVNTRVJUKHNlcSAhPSBOVUxMKTsKIAogCW11dGV4X2xvY2soJnNlcS0+bGNzX211dGV4KTsKLQlyYyA9IHNlcV9wcmludGYobSwgREZJRCJcbiIsIFBGSUQoJnNlcS0+bGNzX2ZpZCkpOworCXNlcV9wcmludGYobSwgREZJRCAiXG4iLCBQRklEKCZzZXEtPmxjc19maWQpKTsKIAltdXRleF91bmxvY2soJnNlcS0+bGNzX211dGV4KTsKIAotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludApAQCAtMjAxLDE3ICsxOTgsMTcgQEAKIHsKIAlzdHJ1Y3QgbHVfY2xpZW50X3NlcSAqc2VxID0gKHN0cnVjdCBsdV9jbGllbnRfc2VxICopbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpOwotCWludCByYzsKIAogCUxBU1NFUlQoc2VxICE9IE5VTEwpOwogCiAJaWYgKHNlcS0+bGNzX2V4cCAhPSBOVUxMKSB7CiAJCWNsaSA9ICZzZXEtPmxjc19leHAtPmV4cF9vYmQtPnUuY2xpOwotCQlyYyA9IHNlcV9wcmludGYobSwgIiVzXG4iLCBjbGktPmNsX3RhcmdldF91dWlkLnV1aWQpOworCQlzZXFfcHJpbnRmKG0sICIlc1xuIiwgY2xpLT5jbF90YXJnZXRfdXVpZC51dWlkKTsKIAl9IGVsc2UgewotCQlyYyA9IHNlcV9wcmludGYobSwgIiVzXG4iLCBzZXEtPmxjc19zcnYtPmxzc19uYW1lKTsKKwkJc2VxX3ByaW50ZihtLCAiJXNcbiIsIHNlcS0+bGNzX3Nydi0+bHNzX25hbWUpOwogCX0KLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIAogTFBST0NfU0VRX0ZPUFMobHByb2Nmc19maWRfc3BhY2UpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oCmluZGV4IDYxMjViYmUuLjY4YmVjNzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvZmxkX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9pbnRlcm5hbC5oCkBAIC0xNDIsNyArMTQyLDcgQEAKIGludCBmbGRfY2xpZW50X3JwYyhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwLAogCQkgICBzdHJ1Y3QgbHVfc2VxX3JhbmdlICpyYW5nZSwgX191MzIgZmxkX29wKTsKIAotI2lmIGRlZmluZWQgKENPTkZJR19QUk9DX0ZTKQorI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCiBleHRlcm4gc3RydWN0IGxwcm9jZnNfdmFycyBmbGRfY2xpZW50X3Byb2NfbGlzdFtdOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9mbGRfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9yZXF1ZXN0LmMKaW5kZXggYjhkMTdlMS4uNmFjMjI1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2ZsZF9yZXF1ZXN0LmMKQEAgLTIxNywxMCArMjE3LDkgQEAKIAkJQ0VSUk9SKCIlczogQXR0ZW1wdCB0byBhZGQgdGFyZ2V0ICVzIChpZHggJWxsdSkgb24gZmx5IC0gc2tpcCBpdFxuIiwKIAkJCWZsZC0+bGNmX25hbWUsIG5hbWUsIHRhci0+ZnRfaWR4KTsKIAkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJQ0RFQlVHKERfSU5GTywgIiVzOiBBZGRpbmcgdGFyZ2V0ICVzIChpZHggJWxsdSlcbiIsCi0JCSAgICAgICBmbGQtPmxjZl9uYW1lLCBuYW1lLCB0YXItPmZ0X2lkeCk7CiAJfQorCUNERUJVRyhEX0lORk8sICIlczogQWRkaW5nIHRhcmdldCAlcyAoaWR4ICVsbHUpXG4iLAorCQkJZmxkLT5sY2ZfbmFtZSwgbmFtZSwgdGFyLT5mdF9pZHgpOwogCiAJT0JEX0FMTE9DX1BUUih0YXJnZXQpOwogCWlmICh0YXJnZXQgPT0gTlVMTCkKQEAgLTI4MCw3ICsyNzksNyBAQAogCiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpmbGRfdHlwZV9wcm9jX2RpcjsKIAotI2lmIGRlZmluZWQgKENPTkZJR19QUk9DX0ZTKQorI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCiBzdGF0aWMgaW50IGZsZF9jbGllbnRfcHJvY19pbml0KHN0cnVjdCBsdV9jbGllbnRfZmxkICpmbGQpCiB7CiAJaW50IHJjOwpAQCAtMzI3LDcgKzMyNiw2IEBACiAKIHZvaWQgZmxkX2NsaWVudF9wcm9jX2Zpbmkoc3RydWN0IGx1X2NsaWVudF9mbGQgKmZsZCkKIHsKLQlyZXR1cm47CiB9CiAjZW5kaWYKIEVYUE9SVF9TWU1CT0woZmxkX2NsaWVudF9wcm9jX2ZpbmkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2xwcm9jX2ZsZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvZmxkL2xwcm9jX2ZsZC5jCmluZGV4IDhjNWE2NTcuLmY1M2ZkY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2ZsZC9scHJvY19mbGQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9mbGQvbHByb2NfZmxkLmMKQEAgLTE2OCw0ICsxNjgsNSBAQAogCXsgInRhcmdldHMiLCAmZmxkX3Byb2NfdGFyZ2V0c19mb3BzIH0sCiAJeyAiaGFzaCIsICZmbGRfcHJvY19oYXNoX2ZvcHMgfSwKIAl7ICJjYWNoZV9mbHVzaCIsICZmbGRfcHJvY19jYWNoZV9mbHVzaF9mb3BzIH0sCi0JeyBOVUxMIH19OworCXsgTlVMTCB9Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfcGF0Y2hsZXNzX2NvbXBhdC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9saW51eC9sdXN0cmVfcGF0Y2hsZXNzX2NvbXBhdC5oCmluZGV4IGEyNjBlOTkuLmQ3MjYwNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbGludXgvbHVzdHJlX3BhdGNobGVzc19jb21wYXQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xpbnV4L2x1c3RyZV9wYXRjaGxlc3NfY29tcGF0LmgKQEAgLTU1LDcgKzU1LDkgQEAKIAlpZiAoUGFnZVByaXZhdGUocGFnZSkpCiAJCXBhZ2UtPm1hcHBpbmctPmFfb3BzLT5pbnZhbGlkYXRlcGFnZShwYWdlLCAwLCBQQUdFX0NBQ0hFX1NJWkUpOwogCi0JY2FuY2VsX2RpcnR5X3BhZ2UocGFnZSwgUEFHRV9TSVpFKTsKKwlpZiAoVGVzdENsZWFyUGFnZURpcnR5KHBhZ2UpKQorCQlhY2NvdW50X3BhZ2VfY2xlYW5lZChwYWdlLCBtYXBwaW5nKTsKKwogCUNsZWFyUGFnZU1hcHBlZFRvRGlzayhwYWdlKTsKIAlsbF9kZWxldGVfZnJvbV9wYWdlX2NhY2hlKHBhZ2UpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oCmluZGV4IDhhMjVjZjYuLmQwMzA4NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgKQEAgLTY3OSw3ICs2NzksNyBAQAogCX0JCQkJICAgICAgIFwKIH0gd2hpbGUgKDApCiAjZGVmaW5lIExQUk9DRlNfQ0xJTVBfRVhJVChvYmQpCQkgXAotCXVwX3JlYWQoJihvYmQpLT51LmNsaS5jbF9zZW0pOworCXVwX3JlYWQoJihvYmQpLT51LmNsaS5jbF9zZW0pCiAKIAogLyogd3JpdGUgdGhlIG5hbWUjI19zZXFfc2hvdyBmdW5jdGlvbiwgY2FsbCBMUFJPQ19TRVFfRk9QU19STyBmb3IgcmVhZC1vbmx5CkBAIC03MjMsNyArNzIzLDcgQEAKIAkJcmV0dXJuIGxwcm9jZnNfd3JfIyN0eXBlKGZpbGUsIGJ1ZmZlciwJCQlcCiAJCQkJCSBjb3VudCwgc2VxLT5wcml2YXRlKTsJCVwKIAl9CQkJCQkJCQlcCi0JTFBST0NfU0VRX0ZPUFMobmFtZSMjXyMjdHlwZSk7CisJTFBST0NfU0VRX0ZPUFMobmFtZSMjXyMjdHlwZSkKIAogI2RlZmluZSBMUFJPQ19TRVFfRk9QU19XUl9PTkxZKG5hbWUsIHR5cGUpCQkJCVwKIAlzdGF0aWMgc3NpemVfdCBuYW1lIyNfIyN0eXBlIyNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCQlcCkBAIC03NDAsNyArNzQwLDcgQEAKIAkJLm9wZW4JPSBuYW1lIyNfIyN0eXBlIyNfb3BlbiwJCQkJXAogCQkud3JpdGUJPSBuYW1lIyNfIyN0eXBlIyNfd3JpdGUsCQkJXAogCQkucmVsZWFzZSA9IGxwcm9jZnNfc2luZ2xlX3JlbGVhc2UsCQkJXAotCX07CisJfQogCiAvKiBscHJvY19wdGxycGMuYyAqLwogc3RydWN0IHB0bHJwY19yZXF1ZXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdV9vYmplY3QuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVfb2JqZWN0LmgKaW5kZXggMmRkYjJiMC4uYzhjYzQ4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdV9vYmplY3QuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1X29iamVjdC5oCkBAIC0xOTIsNyArMTkyLDcgQEAKICAqLwogdHlwZWRlZiBpbnQgKCpsdV9wcmludGVyX3QpKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKIAkJCSAgICB2b2lkICpjb29raWUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQotCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKKwlfX3ByaW50ZigzLCA0KTsKIAogLyoqCiAgKiBPcGVyYXRpb25zIHNwZWNpZmljIGZvciBwYXJ0aWN1bGFyIGx1X29iamVjdC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2RsbS5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtLmgKaW5kZXggODNiYzBhOS4uYmFjOTkwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfZGxtLmgKQEAgLTEwNzUsNyArMTA3NSw3IEBACiB2b2lkIF9sZGxtX2xvY2tfZGVidWcoc3RydWN0IGxkbG1fbG9jayAqbG9jaywKIAkJICAgICAgc3RydWN0IGxpYmNmc19kZWJ1Z19tc2dfZGF0YSAqZGF0YSwKIAkJICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworCV9fcHJpbnRmKDMsIDQpOwogCiAvKioKICAqIFJhdGUtbGltaXRlZCB2ZXJzaW9uIG9mIGxvY2sgcHJpbnRpbmcgZnVuY3Rpb24uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL2x1c3RyZV9pbXBvcnQuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ltcG9ydC5oCmluZGV4IDUxZjNlOTguLmRjYzgwNzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ltcG9ydC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX2ltcG9ydC5oCkBAIC0yMTgsNiArMjE4LDggQEAKIAlhdG9taWNfdAkgICAgICBpbXBfdGltZW91dHM7CiAJLyoqIEN1cnJlbnQgaW1wb3J0IHN0YXRlICovCiAJZW51bSBsdXN0cmVfaW1wX3N0YXRlICAgICBpbXBfc3RhdGU7CisJLyoqIExhc3QgcmVwbGF5IHN0YXRlICovCisJZW51bSBsdXN0cmVfaW1wX3N0YXRlCSAgaW1wX3JlcGxheV9zdGF0ZTsKIAkvKiogSGlzdG9yeSBvZiBpbXBvcnQgc3RhdGVzICovCiAJc3RydWN0IGltcG9ydF9zdGF0ZV9oaXN0ICBpbXBfc3RhdGVfaGlzdFtJTVBfU1RBVEVfSElTVF9MRU5dOwogCWludAkJICAgICAgIGltcF9zdGF0ZV9oaXN0X2lkeDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvbHVzdHJlX25ldC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbmV0LmgKaW5kZXggMzYzOTZkMS4uZTI4MDViZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbmV0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9sdXN0cmVfbmV0LmgKQEAgLTE2NzMsNyArMTY3Myw3IEBACiAKIHZvaWQgX2RlYnVnX3JlcShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwKIAkJc3RydWN0IGxpYmNmc19kZWJ1Z19tc2dfZGF0YSAqZGF0YSwgY29uc3QgY2hhciAqZm10LCAuLi4pCi0JX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpOworCV9fcHJpbnRmKDMsIDQpOwogCiAvKioKICAqIEhlbHBlciB0aGF0IGRlY2lkZXMgaWYgd2UgbmVlZCB0byBwcmludCByZXF1ZXN0IGFjY29yZGluZyB0byBjdXJyZW50IGRlYnVnCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9jbGFzcy5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvaW5jbHVkZS9vYmRfY2xhc3MuaAppbmRleCA0YTI5MjYxLi4zNGI1ZmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9pbmNsdWRlL29iZF9jbGFzcy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2luY2x1ZGUvb2JkX2NsYXNzLmgKQEAgLTcyLDYgKzcyLDcgQEAKIHN0cnVjdCBsdV9kZXZpY2VfdHlwZTsKIAogLyogZ2Vub3BzLmMgKi8KK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIG9iZF90eXBlczsKIHN0cnVjdCBvYmRfZXhwb3J0ICpjbGFzc19jb25uMmV4cG9ydChzdHJ1Y3QgbHVzdHJlX2hhbmRsZSAqKTsKIGludCBjbGFzc19yZWdpc3Rlcl90eXBlKHN0cnVjdCBvYmRfb3BzICosIHN0cnVjdCBtZF9vcHMgKiwKIAkJCXN0cnVjdCBscHJvY2ZzX3ZhcnMgKiwgY29uc3QgY2hhciAqbm0sCkBAIC0yMjIsMjAgKzIyMywyMCBAQAogCiAjZW5kaWYKIAotI2RlZmluZSBjbGFzc19leHBvcnRfcnBjX2luYyhleHApCQkJCSAgICAgICBcCi0oewkJCQkJCQkJICAgICAgXAotCWF0b21pY19pbmMoJihleHApLT5leHBfcnBjX2NvdW50KTsJCQkgIFwKLQlDREVCVUcoRF9JTkZPLCAiUlBDIEdFVHRpbmcgZXhwb3J0ICVwIDogbmV3IHJwY19jb3VudCAlZFxuIiwgICAgXAotCSAgICAgICAoZXhwKSwgYXRvbWljX3JlYWQoJihleHApLT5leHBfcnBjX2NvdW50KSk7CSAgXAotfSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGFzc19leHBvcnRfcnBjX2luYyhzdHJ1Y3Qgb2JkX2V4cG9ydCAqZXhwKQoreworCWF0b21pY19pbmMoJihleHApLT5leHBfcnBjX2NvdW50KTsKKwlDREVCVUcoRF9JTkZPLCAiUlBDIEdFVHRpbmcgZXhwb3J0ICVwIDogbmV3IHJwY19jb3VudCAlZFxuIiwKKwkgICAgICAgKGV4cCksIGF0b21pY19yZWFkKCYoZXhwKS0+ZXhwX3JwY19jb3VudCkpOworfQogCi0jZGVmaW5lIGNsYXNzX2V4cG9ydF9ycGNfZGVjKGV4cCkJCQkJICAgICAgIFwKLSh7CQkJCQkJCQkgICAgICBcCi0JTEFTU0VSVF9BVE9NSUNfUE9TKCZleHAtPmV4cF9ycGNfY291bnQpOwkJCVwKLQlhdG9taWNfZGVjKCYoZXhwKS0+ZXhwX3JwY19jb3VudCk7CQkJICBcCi0JQ0RFQlVHKERfSU5GTywgIlJQQyBQVVR0aW5nIGV4cG9ydCAlcCA6IG5ldyBycGNfY291bnQgJWRcbiIsICAgIFwKLQkgICAgICAgKGV4cCksIGF0b21pY19yZWFkKCYoZXhwKS0+ZXhwX3JwY19jb3VudCkpOwkgIFwKLX0pCitzdGF0aWMgaW5saW5lIHZvaWQgY2xhc3NfZXhwb3J0X3JwY19kZWMoc3RydWN0IG9iZF9leHBvcnQgKmV4cCkKK3sKKwlMQVNTRVJUX0FUT01JQ19QT1MoJmV4cC0+ZXhwX3JwY19jb3VudCk7CisJYXRvbWljX2RlYygmKGV4cCktPmV4cF9ycGNfY291bnQpOworCUNERUJVRyhEX0lORk8sICJSUEMgUFVUdGluZyBleHBvcnQgJXAgOiBuZXcgcnBjX2NvdW50ICVkXG4iLAorCSAgICAgICAoZXhwKSwgYXRvbWljX3JlYWQoJihleHApLT5leHBfcnBjX2NvdW50KSk7Cit9CiAKICNkZWZpbmUgY2xhc3NfZXhwb3J0X2xvY2tfZ2V0KGV4cCwgbG9jaykJCQkJXAogKHsJCQkJCQkJCSAgICAgIFwKQEAgLTMzMiwyNSArMzMzLDI5IEBACiAKIC8qIEVuc3VyZSBvYmRfc2V0dXA6IHVzZWQgZm9yIGNsZWFudXAgd2hpY2ggbXVzdCBiZSBjYWxsZWQKICAgIHdoaWxlIG9iZCBpcyBzdG9wcGluZyAqLwotI2RlZmluZSBPQkRfQ0hFQ0tfREVWKG9iZCkJCQkJICAgICAgXAotZG8gewkJCQkJCQkgICAgXAotCWlmICghKG9iZCkpIHsJCQkJCSAgIFwKLQkJQ0VSUk9SKCJOVUxMIGRldmljZVxuIik7CQkJXAotCQlyZXR1cm4gLUVOT0RFVjsJCQkJXAotCX0JCQkJCQkgICAgICAgXAotfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgaW50IG9iZF9jaGVja19kZXYoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCkKK3sKKwlpZiAoIW9iZCkgeworCQlDRVJST1IoIk5VTEwgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXJldHVybiAwOworfQogCiAvKiBlbnN1cmUgb2JkX3NldHVwIGFuZCAhb2JkX3N0b3BwaW5nICovCi0jZGVmaW5lIE9CRF9DSEVDS19ERVZfQUNUSVZFKG9iZCkJCQkgICAgICAgXAotZG8gewkJCQkJCQkgICAgXAotCU9CRF9DSEVDS19ERVYob2JkKTsJCQkJICAgICBcCi0JaWYgKCEob2JkKS0+b2JkX3NldF91cCB8fCAob2JkKS0+b2JkX3N0b3BwaW5nKSB7CVwKLQkJQ0VSUk9SKCJEZXZpY2UgJWQgbm90IHNldHVwXG4iLAkJIFwKLQkJICAgICAgIChvYmQpLT5vYmRfbWlub3IpOwkJICAgICAgIFwKLQkJcmV0dXJuIC1FTk9ERVY7CQkJCVwKLQl9CQkJCQkJICAgICAgIFwKLX0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIGludCBvYmRfY2hlY2tfZGV2X2FjdGl2ZShzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkKQoreworCWludCByYzsKIAorCXJjID0gb2JkX2NoZWNrX2RldihvYmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCWlmICghb2JkLT5vYmRfc2V0X3VwIHx8IG9iZC0+b2JkX3N0b3BwaW5nKSB7CisJCUNFUlJPUigiRGV2aWNlICVkIG5vdCBzZXR1cFxuIiwgb2JkLT5vYmRfbWlub3IpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIHJjOworfQogCiAjaWYgZGVmaW5lZCAoQ09ORklHX1BST0NfRlMpCiAjZGVmaW5lIE9CRF9DT1VOVEVSX09GRlNFVChvcCkJCQkJICBcCkBAIC01OTMsNyArNTk4LDkgQEAKIAlpbnQgcmM7CiAJREVDTEFSRV9MVV9WQVJTKGxkdCwgZCk7CiAKLQlPQkRfQ0hFQ0tfREVWKG9iZCk7CisJcmMgPSBvYmRfY2hlY2tfZGV2KG9iZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAJbGR0ID0gb2JkLT5vYmRfdHlwZS0+dHlwX2x1OwogCWQgPSBvYmQtPm9iZF9sdV9kZXY7CiAJaWYgKGxkdCAhPSBOVUxMICYmIGQgIT0gTlVMTCkgewpAQCAtNjE5LDcgKzYyNiw5IEBACiAJaW50IHJjOwogCURFQ0xBUkVfTFVfVkFSUyhsZHQsIGQpOwogCi0JT0JEX0NIRUNLX0RFVihvYmQpOworCXJjID0gb2JkX2NoZWNrX2RldihvYmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCiAJbGR0ID0gb2JkLT5vYmRfdHlwZS0+dHlwX2x1OwogCWQgPSBvYmQtPm9iZF9sdV9kZXY7CkBAIC02NjcsNyArNjc2LDkgQEAKIAlpbnQgcmM7CiAJREVDTEFSRV9MVV9WQVJTKGxkdCwgZCk7CiAKLQlPQkRfQ0hFQ0tfREVWKG9iZCk7CisJcmMgPSBvYmRfY2hlY2tfZGV2KG9iZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlvYmQtPm9iZF9wcm9jZXNzX2NvbmYgPSAxOwogCWxkdCA9IG9iZC0+b2JkX3R5cGUtPnR5cF9sdTsKQEAgLTg4NSw3ICs4OTYsOSBAQAogCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBpbXAtPmltcF9vYmQ7CiAJaW50IHJjOwogCi0JT0JEX0NIRUNLX0RFVl9BQ1RJVkUob2JkKTsKKwlyYyA9IG9iZF9jaGVja19kZXZfYWN0aXZlKG9iZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAJT0JEX0NIRUNLX0RUX09QKG9iZCwgYWRkX2Nvbm4sIC1FT1BOT1RTVVBQKTsKIAlPQkRfQ09VTlRFUl9JTkNSRU1FTlQob2JkLCBhZGRfY29ubik7CiAKQEAgLTg5OCw3ICs5MTEsOSBAQAogCXN0cnVjdCBvYmRfZGV2aWNlICpvYmQgPSBpbXAtPmltcF9vYmQ7CiAJaW50IHJjOwogCi0JT0JEX0NIRUNLX0RFVl9BQ1RJVkUob2JkKTsKKwlyYyA9IG9iZF9jaGVja19kZXZfYWN0aXZlKG9iZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAJT0JEX0NIRUNLX0RUX09QKG9iZCwgZGVsX2Nvbm4sIC1FT1BOT1RTVVBQKTsKIAlPQkRfQ09VTlRFUl9JTkNSRU1FTlQob2JkLCBkZWxfY29ubik7CiAKQEAgLTkzMiw3ICs5NDcsOSBAQAogCV9fdTY0IG9jZiA9IGRhdGEgPyBkYXRhLT5vY2RfY29ubmVjdF9mbGFncyA6IDA7IC8qIGZvciBwb3N0LWNvbmRpdGlvbgogCQkJCQkJICAgKiBjaGVjayAqLwogCi0JT0JEX0NIRUNLX0RFVl9BQ1RJVkUob2JkKTsKKwlyYyA9IG9iZF9jaGVja19kZXZfYWN0aXZlKG9iZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAJT0JEX0NIRUNLX0RUX09QKG9iZCwgY29ubmVjdCwgLUVPUE5PVFNVUFApOwogCU9CRF9DT1VOVEVSX0lOQ1JFTUVOVChvYmQsIGNvbm5lY3QpOwogCkBAIC05NTQsNyArOTcxLDkgQEAKIAlfX3U2NCBvY2YgPSBkID8gZC0+b2NkX2Nvbm5lY3RfZmxhZ3MgOiAwOyAvKiBmb3IgcG9zdC1jb25kaXRpb24KIAkJCQkJCSAgICogY2hlY2sgKi8KIAotCU9CRF9DSEVDS19ERVZfQUNUSVZFKG9iZCk7CisJcmMgPSBvYmRfY2hlY2tfZGV2X2FjdGl2ZShvYmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCU9CRF9DSEVDS19EVF9PUChvYmQsIHJlY29ubmVjdCwgMCk7CiAJT0JEX0NPVU5URVJfSU5DUkVNRU5UKG9iZCwgcmVjb25uZWN0KTsKIApAQCAtMTI3OSw3ICsxMjk4LDkgQEAKIHsKIAlpbnQgcmM7CiAKLQlPQkRfQ0hFQ0tfREVWKG9iZCk7CisJcmMgPSBvYmRfY2hlY2tfZGV2KG9iZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAkvKiB0aGUgY2hlY2sgZm9yIGFzeW5jX3JlY292IGlzIGEgY29tcGxldGUgaGFjayAtIEknbSBoZXJlYnkKIAkgICBvdmVybG9hZGluZyB0aGUgbWVhbmluZyB0byBhbHNvIG1lYW4gInRoaXMgd2FzIGNhbGxlZCBmcm9tCkBAIC0xMzgwLDcgKzE0MDEsMTEgQEAKIHN0YXRpYyBpbmxpbmUgaW50IG9iZF9yZWdpc3Rlcl9vYnNlcnZlcihzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkLAogCQkJCQlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JzZXJ2ZXIpCiB7Ci0JT0JEX0NIRUNLX0RFVihvYmQpOworCWludCByYzsKKworCXJjID0gb2JkX2NoZWNrX2RldihvYmQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOwogCWRvd25fd3JpdGUoJm9iZC0+b2JkX29ic2VydmVyX2xpbmtfc2VtKTsKIAlpZiAob2JkLT5vYmRfb2JzZXJ2ZXIgJiYgb2JzZXJ2ZXIpIHsKIAkJdXBfd3JpdGUoJm9iZC0+b2JkX29ic2VydmVyX2xpbmtfc2VtKTsKQEAgLTE4OTUsNiArMTkyMCw4IEBACiAKIC8qIGNsYXNzX29iZC5jICovCiBleHRlcm4gY2hhciBvYmRfam9iaWRfbm9kZVtdOworZXh0ZXJuIHN0cnVjdCBtaXNjZGV2aWNlIG9iZF9wc2RldjsKK2V4dGVybiBzcGlubG9ja190IG9iZF90eXBlc19sb2NrOwogCiAvKiBwcm5nLmMgKi8KICNkZWZpbmUgbGxfZ2VuZXJhdGVfcmFuZG9tX3V1aWQodXVpZF9vdXQpIGNmc19nZXRfcmFuZG9tX2J5dGVzKHV1aWRfb3V0LCBzaXplb2YoY2xhc3NfdXVpZF90KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xjbGllbnQvbGNvbW1vbl9jbC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGNsaWVudC9sY29tbW9uX2NsLmMKaW5kZXggMjMwOTViYi4uYWI2Y2I0MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGNsaWVudC9sY29tbW9uX2NsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGNsaWVudC9sY29tbW9uX2NsLmMKQEAgLTgyOCw3ICs4MjgsOCBAQAogCQkJCSAqIC0tYnVnIDE3MzM2ICovCiAJCQkJbG9mZl90IHNpemUgPSBjbF9pc2l6ZV9yZWFkKGlub2RlKTsKIAkJCQlsb2ZmX3QgY3VyX2luZGV4ID0gc3RhcnQgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJCQlsb2ZmX3Qgc2l6ZV9pbmRleCA9ICgoc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCQkJCWxvZmZfdCBzaXplX2luZGV4ID0gKHNpemUgLSAxKSA+PgorCQkJCQkJICAgIFBBR0VfQ0FDSEVfU0hJRlQ7CiAKIAkJCQlpZiAoKHNpemUgPT0gMCAmJiBjdXJfaW5kZXggIT0gMCkgfHwKIAkJCQkgICAgc2l6ZV9pbmRleCA8IGN1cl9pbmRleCkKQEAgLTEyNjMsNyArMTI2NCw3IEBACiAJCXJldHVybiBnZW47CiAJfQogCi0JZ2VuID0gKGZpZF9mbGF0dGVuKGZpZCkgPj4gMzIpOworCWdlbiA9IGZpZF9mbGF0dGVuKGZpZCkgPj4gMzI7CiAJcmV0dXJuIGdlbjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2V4dGVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2V4dGVudC5jCmluZGV4IGE4OWVlYmEuLmZkOWIwNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9leHRlbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fZXh0ZW50LmMKQEAgLTE1MSw3ICsxNTEsOCBAQAogCiAJTEFTU0VSVChtb2RlICE9IDApOwogCUxBU1NFUlQoSVNfUE8yKG1vZGUpKTsKLQlmb3IgKGluZGV4ID0gLTE7IG1vZGU7IGluZGV4KyssIG1vZGUgPj49IDEpIDsKKwlmb3IgKGluZGV4ID0gLTE7IG1vZGU7IGluZGV4KyspCisJCW1vZGUgPj49IDE7CiAJTEFTU0VSVChpbmRleCA8IExDS19NT0RFX05VTSk7CiAJcmV0dXJuIGluZGV4OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1faW50ZXJuYWwuaAppbmRleCAyMGU2NGNkLi43MGI5MDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1faW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1faW50ZXJuYWwuaApAQCAtMTMxLDEyICsxMzEsMTIgQEAKIAl1bmlvbiBsZGxtX2dsX2Rlc2MJCSpnbF9kZXNjOyAvKiBnbGltcHNlIEFTVCBkZXNjcmlwdG9yICovCiB9OwogCi10eXBlZGVmIGVudW0geworZW51bSBsZGxtX2Rlc2NfYXN0X3QgewogCUxETE1fV09SS19CTF9BU1QsCiAJTERMTV9XT1JLX0NQX0FTVCwKIAlMRExNX1dPUktfUkVWT0tFX0FTVCwKIAlMRExNX1dPUktfR0xfQVNUCi19IGxkbG1fZGVzY19hc3RfdDsKK307CiAKIHZvaWQgbGRsbV9ncmFudF9sb2NrKHN0cnVjdCBsZGxtX2xvY2sgKmxvY2ssIHN0cnVjdCBsaXN0X2hlYWQgKndvcmtfbGlzdCk7CiBpbnQgbGRsbV9maWxsX2x2YihzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrLCBzdHJ1Y3QgcmVxX2NhcHN1bGUgKnBpbGwsCkBAIC0xNTUsNyArMTU1LDcgQEAKIHZvaWQgbGRsbV9hZGRfYXN0X3dvcmtfaXRlbShzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrLCBzdHJ1Y3QgbGRsbV9sb2NrICpuZXcsCiAJCQkgICAgc3RydWN0IGxpc3RfaGVhZCAqd29ya19saXN0KTsKIGludCBsZGxtX3J1bl9hc3Rfd29yayhzdHJ1Y3QgbGRsbV9uYW1lc3BhY2UgKm5zLCBzdHJ1Y3QgbGlzdF9oZWFkICpycGNfbGlzdCwKLQkJICAgICAgbGRsbV9kZXNjX2FzdF90IGFzdF90eXBlKTsKKwkJICAgICAgZW51bSBsZGxtX2Rlc2NfYXN0X3QgYXN0X3R5cGUpOwogaW50IGxkbG1fd29ya19nbF9hc3RfbG9jayhzdHJ1Y3QgcHRscnBjX3JlcXVlc3Rfc2V0ICpycXNldCwgdm9pZCAqb3BhcSk7CiBpbnQgbGRsbV9sb2NrX3JlbW92ZV9mcm9tX2xydShzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrKTsKIGludCBsZGxtX2xvY2tfcmVtb3ZlX2Zyb21fbHJ1X25vbG9jayhzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrKTsKQEAgLTE3Nyw2ICsxNzcsMTAgQEAKIHZvaWQgbGRsbV9oYW5kbGVfYmxfY2FsbGJhY2soc3RydWN0IGxkbG1fbmFtZXNwYWNlICpucywKIAkJCSAgICAgc3RydWN0IGxkbG1fbG9ja19kZXNjICpsZCwgc3RydWN0IGxkbG1fbG9jayAqbG9jayk7CiAKK2V4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqbGRsbV9yZXNvdXJjZV9zbGFiOworCisvKiBsZGxtX2xvY2tkLmMgJiBsZGxtX2xvY2suYyAqLworZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpsZGxtX2xvY2tfc2xhYjsKIAogLyogbGRsbV9leHRlbnQuYyAqLwogdm9pZCBsZGxtX2V4dGVudF9hZGRfbG9jayhzdHJ1Y3QgbGRsbV9yZXNvdXJjZSAqcmVzLCBzdHJ1Y3QgbGRsbV9sb2NrICpsb2NrKTsKQEAgLTIwNyw5ICsyMTEsOSBAQAogLyogaW50ZXJ2YWwgdHJlZSwgZm9yIExETE1fRVhURU5ULiAqLwogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpsZGxtX2ludGVydmFsX3NsYWI7IC8qIHNsYWIgY2FjaGUgZm9yIGxkbG1faW50ZXJ2YWwgKi8KIGV4dGVybiB2b2lkIGxkbG1faW50ZXJ2YWxfYXR0YWNoKHN0cnVjdCBsZGxtX2ludGVydmFsICpuLCBzdHJ1Y3QgbGRsbV9sb2NrICpsKTsKLWV4dGVybiBzdHJ1Y3QgbGRsbV9pbnRlcnZhbCAqbGRsbV9pbnRlcnZhbF9kZXRhY2goc3RydWN0IGxkbG1fbG9jayAqbCk7Ci1leHRlcm4gc3RydWN0IGxkbG1faW50ZXJ2YWwgKmxkbG1faW50ZXJ2YWxfYWxsb2Moc3RydWN0IGxkbG1fbG9jayAqbG9jayk7Ci1leHRlcm4gdm9pZCBsZGxtX2ludGVydmFsX2ZyZWUoc3RydWN0IGxkbG1faW50ZXJ2YWwgKm5vZGUpOworc3RydWN0IGxkbG1faW50ZXJ2YWwgKmxkbG1faW50ZXJ2YWxfZGV0YWNoKHN0cnVjdCBsZGxtX2xvY2sgKmwpOworc3RydWN0IGxkbG1faW50ZXJ2YWwgKmxkbG1faW50ZXJ2YWxfYWxsb2Moc3RydWN0IGxkbG1fbG9jayAqbG9jayk7Cit2b2lkIGxkbG1faW50ZXJ2YWxfZnJlZShzdHJ1Y3QgbGRsbV9pbnRlcnZhbCAqbm9kZSk7CiAvKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggcmVzIGxvY2sgaGVsZCAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgbGRsbV9leHRlbnQgKgogbGRsbV9pbnRlcnZhbF9leHRlbnQoc3RydWN0IGxkbG1faW50ZXJ2YWwgKm5vZGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2suYwppbmRleCA4MTkxMDA1Li44NGIxMTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9jay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9sb2NrLmMKQEAgLTE1MSw4ICsxNTEsNiBAQAogfQogRVhQT1JUX1NZTUJPTChsZGxtX2l0MnN0cik7CiAKLWV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqbGRsbV9sb2NrX3NsYWI7Ci0KIAogdm9pZCBsZGxtX3JlZ2lzdGVyX2ludGVudChzdHJ1Y3QgbGRsbV9uYW1lc3BhY2UgKm5zLCBsZGxtX3Jlc19wb2xpY3kgYXJnKQogewpAQCAtMTgwNSw3ICsxODAzLDcgQEAKICAqIG9uZS4KICAqLwogaW50IGxkbG1fcnVuX2FzdF93b3JrKHN0cnVjdCBsZGxtX25hbWVzcGFjZSAqbnMsIHN0cnVjdCBsaXN0X2hlYWQgKnJwY19saXN0LAotCQkgICAgICBsZGxtX2Rlc2NfYXN0X3QgYXN0X3R5cGUpCisJCSAgICAgIGVudW0gbGRsbV9kZXNjX2FzdF90IGFzdF90eXBlKQogewogCXN0cnVjdCBsZGxtX2NiX3NldF9hcmcgKmFyZzsKIAlzZXRfcHJvZHVjZXJfZnVuYyAgICAgICB3b3JrX2FzdF9sb2NrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX2xvY2tkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9ja2QuYwppbmRleCA5OGZiZDNmLi4wOGE5MWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9ja2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fbG9ja2QuYwpAQCAtNTUsOCArNTUsNiBAQAogbW9kdWxlX3BhcmFtKGxkbG1fY3B0cywgY2hhcnAsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhsZGxtX2NwdHMsICJDUFUgcGFydGl0aW9ucyBsZGxtIHRocmVhZHMgc2hvdWxkIHJ1biBvbiIpOwogCi1leHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmxkbG1fcmVzb3VyY2Vfc2xhYjsKLWV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqbGRsbV9sb2NrX3NsYWI7CiBzdGF0aWMgc3RydWN0IG11dGV4CWxkbG1fcmVmX211dGV4Owogc3RhdGljIGludCBsZGxtX3JlZmNvdW50OwogCkBAIC0xNTQsNyArMTUyLDcgQEAKIAlpZiAobG9jay0+bF9mbGFncyAmIExETE1fRkxfQ0FOQ0VMX09OX0JMT0NLKQogCQlsb2NrLT5sX2ZsYWdzIHw9IExETE1fRkxfQ0FOQ0VMOwogCi0JZG9fYXN0ID0gKCFsb2NrLT5sX3JlYWRlcnMgJiYgIWxvY2stPmxfd3JpdGVycyk7CisJZG9fYXN0ID0gIWxvY2stPmxfcmVhZGVycyAmJiAhbG9jay0+bF93cml0ZXJzOwogCXVubG9ja19yZXNfYW5kX2xvY2sobG9jayk7CiAKIAlpZiAoZG9fYXN0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcG9vbC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Bvb2wuYwppbmRleCBkMjBkMjc3Li5hOWY0ODMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcG9vbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9wb29sLmMKQEAgLTE0MSw4ICsxNDEsNiBAQAogICovCiAjZGVmaW5lIExETE1fUE9PTF9TTFZfU0hJRlQgKDEwKQogCi1leHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICpsZGxtX25zX3Byb2NfZGlyOwotCiBzdGF0aWMgaW5saW5lIF9fdTY0IGRydShfX3U2NCB2YWwsIF9fdTMyIHNoaWZ0LCBpbnQgcm91bmRfdXApCiB7CiAJcmV0dXJuICh2YWwgKyAocm91bmRfdXAgPyAoMSA8PCBzaGlmdCkgLSAxIDogMCkpID4+IHNoaWZ0OwpAQCAtNjg5LDggKzY4Nyw4IEBACiAJCQkgICAgICAiICBHUDogICVkXG4iLAogCQkJICAgICAgZ3JhbnRfc3RlcCwgZ3JhbnRfcGxhbik7CiAJfQotCXNlcV9wcmludGYobSwgIiAgR1I6ICAlZFxuIiAiICBDUjogICVkXG4iICIgIEdTOiAgJWRcbiIKLQkJICAgICAgIiAgRzogICAlZFxuIiAiICBMOiAgICVkXG4iLAorCXNlcV9wcmludGYobSwgIiAgR1I6ICAlZFxuICBDUjogICVkXG4gIEdTOiAgJWRcbiIKKwkJICAgICAgIiAgRzogICAlZFxuICBMOiAgICVkXG4iLAogCQkgICAgICBncmFudF9yYXRlLCBjYW5jZWxfcmF0ZSwgZ3JhbnRfc3BlZWQsCiAJCSAgICAgIGdyYW50ZWQsIGxpbWl0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xkbG0vbGRsbV9yZXF1ZXN0LmMKaW5kZXggMjg3ZGEzMi4uNGY3MTMxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3JlcXVlc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVxdWVzdC5jCkBAIC0zMDcsNyArMzA3LDcgQEAKIAlpbnQgZG9fYXN0OwogCiAJbG9jay0+bF9mbGFncyB8PSBMRExNX0ZMX0NCUEVORElORzsKLQlkb19hc3QgPSAoIWxvY2stPmxfcmVhZGVycyAmJiAhbG9jay0+bF93cml0ZXJzKTsKKwlkb19hc3QgPSAhbG9jay0+bF9yZWFkZXJzICYmICFsb2NrLT5sX3dyaXRlcnM7CiAJdW5sb2NrX3Jlc19hbmRfbG9jayhsb2NrKTsKIAogCWlmIChkb19hc3QpIHsKQEAgLTE3NzksNyArMTc3OSw2IEBACiAJCWlmIChvcGFxdWUgIT0gTlVMTCAmJiBsb2NrLT5sX2FzdF9kYXRhICE9IG9wYXF1ZSkgewogCQkJTERMTV9FUlJPUihsb2NrLCAiZGF0YSAlcCBkb2Vzbid0IG1hdGNoIG9wYXF1ZSAlcCIsCiAJCQkJICAgbG9jay0+bF9hc3RfZGF0YSwgb3BhcXVlKTsKLQkJCS8vTEJVRygpOwogCQkJY29udGludWU7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGRsbS9sZGxtX3Jlc291cmNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVzb3VyY2UuYwppbmRleCBjNmY2MmE5Li5mNzUwZDQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVzb3VyY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sZGxtL2xkbG1fcmVzb3VyY2UuYwpAQCAtNjIsNyArNjIsNyBAQAogTElTVF9IRUFEKGxkbG1fY2xpX2luYWN0aXZlX25hbWVzcGFjZV9saXN0KTsKIAogc3RydWN0IHByb2NfZGlyX2VudHJ5ICpsZGxtX3R5cGVfcHJvY19kaXIgPSBOVUxMOwotc3RydWN0IHByb2NfZGlyX2VudHJ5ICpsZGxtX25zX3Byb2NfZGlyID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmxkbG1fbnNfcHJvY19kaXIgPSBOVUxMOwogc3RydWN0IHByb2NfZGlyX2VudHJ5ICpsZGxtX3N2Y19wcm9jX2RpciA9IE5VTEw7CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgbGRsbV9jYW5jZWxfdW51c2VkX2xvY2tzX2JlZm9yZV9yZXBsYXk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvTWFrZWZpbGUKaW5kZXggZmNlY2JkMi4uMjk5NmE0OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9NYWtlZmlsZQpAQCAtMyw3ICszLDcgQEAKIGxpYmNmcy1saW51eC1vYmpzIDo9IGxpbnV4LXRyYWNlZmlsZS5vIGxpbnV4LWRlYnVnLm8KIGxpYmNmcy1saW51eC1vYmpzICs9IGxpbnV4LXByaW0ubyBsaW51eC1jcHUubwogbGliY2ZzLWxpbnV4LW9ianMgKz0gbGludXgtdGNwaXAubwotbGliY2ZzLWxpbnV4LW9ianMgKz0gbGludXgtcHJvYy5vIGxpbnV4LWN1cnByb2MubworbGliY2ZzLWxpbnV4LW9ianMgKz0gbGludXgtY3VycHJvYy5vCiBsaWJjZnMtbGludXgtb2JqcyArPSBsaW51eC1tb2R1bGUubwogbGliY2ZzLWxpbnV4LW9ianMgKz0gbGludXgtY3J5cHRvLm8KIGxpYmNmcy1saW51eC1vYmpzICs9IGxpbnV4LWNyeXB0by1hZGxlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvZGVidWcuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9kZWJ1Zy5jCmluZGV4IDc2YzYyZTguLjAyMWM5MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9kZWJ1Zy5jCkBAIC00MDksOCArNDA5LDggQEAKIAlpZiAobWF4ID4gY2ZzX3RyYWNlX21heF9kZWJ1Z19tYigpIHx8IG1heCA8IG51bV9wb3NzaWJsZV9jcHVzKCkpIHsKIAkJbWF4ID0gVENEX01BWF9QQUdFUzsKIAl9IGVsc2UgewotCQltYXggPSAobWF4IC8gbnVtX3Bvc3NpYmxlX2NwdXMoKSk7Ci0JCW1heCA9IG1heCA8PCAoMjAgLSBQQUdFX0NBQ0hFX1NISUZUKTsKKwkJbWF4ID0gbWF4IC8gbnVtX3Bvc3NpYmxlX2NwdXMoKTsKKwkJbWF4IDw8PSAoMjAgLSBQQUdFX0NBQ0hFX1NISUZUKTsKIAl9CiAJcmMgPSBjZnNfdHJhY2VmaWxlX2luaXQobWF4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2hhc2guYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9oYXNoLmMKaW5kZXggZWMzYTJhOC4uYTU1NTY3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2hhc2guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvaGFzaC5jCkBAIC0yMDA4LDEzICsyMDA4LDEwIEBACiB9CiBFWFBPUlRfU1lNQk9MKGNmc19oYXNoX3JlaGFzaF9rZXkpOwogCi1pbnQgY2ZzX2hhc2hfZGVidWdfaGVhZGVyKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3ZvaWQgY2ZzX2hhc2hfZGVidWdfaGVhZGVyKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJS0qcyU2cyU2cyU2cyU2cyU2cyU2cyU2cyU3cyU4cyU4cyU4cyVzXG4iLAotCQkgQ0ZTX0hBU0hfQklHTkFNRV9MRU4sCi0JCSAibmFtZSIsICJjdXIiLCAibWluIiwgIm1heCIsICJ0aGV0YSIsICJ0LW1pbiIsICJ0LW1heCIsCi0JCSAiZmxhZ3MiLCAicmVoYXNoIiwgImNvdW50IiwgIm1heGRlcCIsICJtYXhkZXBiIiwKLQkJICIgZGlzdHJpYnV0aW9uIik7CisJc2VxX3ByaW50ZihtLCAiJS0qcyAgIGN1ciAgIG1pbiAgIG1heCB0aGV0YSB0LW1pbiB0LW1heCBmbGFncyByZWhhc2ggICBjb3VudCAgbWF4ZGVwIG1heGRlcGIgZGlzdHJpYnV0aW9uXG4iLAorCQkgICBDRlNfSEFTSF9CSUdOQU1FX0xFTiwgIm5hbWUiKTsKIH0KIEVYUE9SVF9TWU1CT0woY2ZzX2hhc2hfZGVidWdfaGVhZGVyKTsKIApAQCAtMjA0Miw3ICsyMDM5LDcgQEAKIAkgICAgICAgQ0ZTX0hBU0hfUkhfTkJLVChocykgOiBDRlNfSEFTSF9OQktUKGhzKTsKIH0KIAotaW50IGNmc19oYXNoX2RlYnVnX3N0cihzdHJ1Y3QgY2ZzX2hhc2ggKmhzLCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit2b2lkIGNmc19oYXNoX2RlYnVnX3N0cihzdHJ1Y3QgY2ZzX2hhc2ggKmhzLCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCiB7CiAJaW50CQkgICAgZGlzdFs4XSA9IHsgMCwgfTsKIAlpbnQJCSAgICBtYXhkZXAgID0gLTE7CkBAIC0yMDk3LDcgKzIwOTQsNSBAQAogCQlzZXFfcHJpbnRmKG0sICIlZCVjIiwgIGRpc3RbaV0sIChpID09IDcpID8gJ1xuJyA6ICcvJyk7CiAKIAljZnNfaGFzaF91bmxvY2soaHMsIDApOwotCi0JcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGNmc19oYXNoX2RlYnVnX3N0cik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtY3B1LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtY3B1LmMKaW5kZXggMDVmNzU5NS4uY2MzYWIzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWNwdS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1jcHUuYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAJCX0KIAogCQl0bXAgKz0gcmM7Ci0JCWZvcl9lYWNoX2NwdV9tYXNrKGosICpjcHRhYi0+Y3RiX3BhcnRzW2ldLmNwdF9jcHVtYXNrKSB7CisJCWZvcl9lYWNoX2NwdShqLCBjcHRhYi0+Y3RiX3BhcnRzW2ldLmNwdF9jcHVtYXNrKSB7CiAJCQlyYyA9IHNucHJpbnRmKHRtcCwgbGVuLCAiJWQgIiwgaik7CiAJCQlsZW4gLT0gcmM7CiAJCQlpZiAobGVuIDw9IDApIHsKQEAgLTI0MCw4ICsyNDAsOCBAQAogCUxBU1NFUlQoY3B0ID09IENGU19DUFRfQU5ZIHx8IChjcHQgPj0gMCAmJiBjcHQgPCBjcHRhYi0+Y3RiX25wYXJ0cykpOwogCiAJcmV0dXJuIGNwdCA9PSBDRlNfQ1BUX0FOWSA/Ci0JICAgICAgIGNwdXNfd2VpZ2h0KCpjcHRhYi0+Y3RiX2NwdW1hc2spIDoKLQkgICAgICAgY3B1c193ZWlnaHQoKmNwdGFiLT5jdGJfcGFydHNbY3B0XS5jcHRfY3B1bWFzayk7CisJICAgICAgIGNwdW1hc2tfd2VpZ2h0KGNwdGFiLT5jdGJfY3B1bWFzaykgOgorCSAgICAgICBjcHVtYXNrX3dlaWdodChjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spOwogfQogRVhQT1JUX1NZTUJPTChjZnNfY3B0X3dlaWdodCk7CiAKQEAgLTI1MSw4ICsyNTEsMTAgQEAKIAlMQVNTRVJUKGNwdCA9PSBDRlNfQ1BUX0FOWSB8fCAoY3B0ID49IDAgJiYgY3B0IDwgY3B0YWItPmN0Yl9ucGFydHMpKTsKIAogCXJldHVybiBjcHQgPT0gQ0ZTX0NQVF9BTlkgPwotCSAgICAgICBhbnlfb25saW5lX2NwdSgqY3B0YWItPmN0Yl9jcHVtYXNrKSAhPSBOUl9DUFVTIDoKLQkgICAgICAgYW55X29ubGluZV9jcHUoKmNwdGFiLT5jdGJfcGFydHNbY3B0XS5jcHRfY3B1bWFzaykgIT0gTlJfQ1BVUzsKKwkgICAgICAgY3B1bWFza19hbnlfYW5kKGNwdGFiLT5jdGJfY3B1bWFzaywKKwkJCSAgICAgICBjcHVfb25saW5lX21hc2spIDwgbnJfY3B1X2lkcyA6CisJICAgICAgIGNwdW1hc2tfYW55X2FuZChjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2ssCisJCQkgICAgICAgY3B1X29ubGluZV9tYXNrKSA8IG5yX2NwdV9pZHM7CiB9CiBFWFBPUlRfU1lNQk9MKGNmc19jcHRfb25saW5lKTsKIApAQCAtMjgzLDcgKzI4NSw3IEBACiAKIAlMQVNTRVJUKGNwdCA+PSAwICYmIGNwdCA8IGNwdGFiLT5jdGJfbnBhcnRzKTsKIAotCWlmIChjcHUgPCAwIHx8IGNwdSA+PSBOUl9DUFVTIHx8ICFjcHVfb25saW5lKGNwdSkpIHsKKwlpZiAoY3B1IDwgMCB8fCBjcHUgPj0gbnJfY3B1X2lkcyB8fCAhY3B1X29ubGluZShjcHUpKSB7CiAJCUNERUJVRyhEX0lORk8sICJDUFUgJWQgaXMgaW52YWxpZCBvciBpdCdzIG9mZmxpbmVcbiIsIGNwdSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTI5NiwxMSArMjk4LDExIEBACiAKIAljcHRhYi0+Y3RiX2NwdTJjcHRbY3B1XSA9IGNwdDsKIAotCUxBU1NFUlQoIWNwdV9pc3NldChjcHUsICpjcHRhYi0+Y3RiX2NwdW1hc2spKTsKLQlMQVNTRVJUKCFjcHVfaXNzZXQoY3B1LCAqY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKSk7CisJTEFTU0VSVCghY3B1bWFza190ZXN0X2NwdShjcHUsIGNwdGFiLT5jdGJfY3B1bWFzaykpOworCUxBU1NFUlQoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spKTsKIAotCWNwdV9zZXQoY3B1LCAqY3B0YWItPmN0Yl9jcHVtYXNrKTsKLQljcHVfc2V0KGNwdSwgKmNwdGFiLT5jdGJfcGFydHNbY3B0XS5jcHRfY3B1bWFzayk7CisJY3B1bWFza19zZXRfY3B1KGNwdSwgY3B0YWItPmN0Yl9jcHVtYXNrKTsKKwljcHVtYXNrX3NldF9jcHUoY3B1LCBjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spOwogCiAJbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7CiAKQEAgLTMyNCw3ICszMjYsNyBAQAogCiAJTEFTU0VSVChjcHQgPT0gQ0ZTX0NQVF9BTlkgfHwgKGNwdCA+PSAwICYmIGNwdCA8IGNwdGFiLT5jdGJfbnBhcnRzKSk7CiAKLQlpZiAoY3B1IDwgMCB8fCBjcHUgPj0gTlJfQ1BVUykgeworCWlmIChjcHUgPCAwIHx8IGNwdSA+PSBucl9jcHVfaWRzKSB7CiAJCUNERUJVRyhEX0lORk8sICJJbnZhbGlkIENQVSBpZCAlZFxuIiwgY3B1KTsKIAkJcmV0dXJuOwogCX0KQEAgLTM0NCwxMSArMzQ2LDExIEBACiAJCXJldHVybjsKIAl9CiAKLQlMQVNTRVJUKGNwdV9pc3NldChjcHUsICpjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spKTsKLQlMQVNTRVJUKGNwdV9pc3NldChjcHUsICpjcHRhYi0+Y3RiX2NwdW1hc2spKTsKKwlMQVNTRVJUKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spKTsKKwlMQVNTRVJUKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHRhYi0+Y3RiX2NwdW1hc2spKTsKIAotCWNwdV9jbGVhcihjcHUsICpjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spOwotCWNwdV9jbGVhcihjcHUsICpjcHRhYi0+Y3RiX2NwdW1hc2spOworCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKTsKKwljcHVtYXNrX2NsZWFyX2NwdShjcHUsIGNwdGFiLT5jdGJfY3B1bWFzayk7CiAJY3B0YWItPmN0Yl9jcHUyY3B0W2NwdV0gPSAtMTsKIAogCW5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOwpAQCAtMzU2LDIyICszNTgsMjIgQEAKIAlMQVNTRVJUKG5vZGVfaXNzZXQobm9kZSwgKmNwdGFiLT5jdGJfcGFydHNbY3B0XS5jcHRfbm9kZW1hc2spKTsKIAlMQVNTRVJUKG5vZGVfaXNzZXQobm9kZSwgKmNwdGFiLT5jdGJfbm9kZW1hc2spKTsKIAotCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spIHsKKwlmb3JfZWFjaF9jcHUoaSwgY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9jcHVtYXNrKSB7CiAJCS8qIHRoaXMgQ1BUIGhhcyBvdGhlciBDUFUgYmVsb25naW5nIHRvIHRoaXMgbm9kZT8gKi8KIAkJaWYgKGNwdV90b19ub2RlKGkpID09IG5vZGUpCiAJCQlicmVhazsKIAl9CiAKLQlpZiAoaSA9PSBOUl9DUFVTKQorCWlmIChpID49IG5yX2NwdV9pZHMpCiAJCW5vZGVfY2xlYXIobm9kZSwgKmNwdGFiLT5jdGJfcGFydHNbY3B0XS5jcHRfbm9kZW1hc2spOwogCi0JZm9yX2VhY2hfY3B1X21hc2soaSwgKmNwdGFiLT5jdGJfY3B1bWFzaykgeworCWZvcl9lYWNoX2NwdShpLCBjcHRhYi0+Y3RiX2NwdW1hc2spIHsKIAkJLyogdGhpcyBDUFQtdGFibGUgaGFzIG90aGVyIENQVSBiZWxvbmdpbmcgdG8gdGhpcyBub2RlPyAqLwogCQlpZiAoY3B1X3RvX25vZGUoaSkgPT0gbm9kZSkKIAkJCWJyZWFrOwogCX0KIAotCWlmIChpID09IE5SX0NQVVMpCisJaWYgKGkgPj0gbnJfY3B1X2lkcykKIAkJbm9kZV9jbGVhcihub2RlLCAqY3B0YWItPmN0Yl9ub2RlbWFzayk7CiAKIAlyZXR1cm47CkBAIC0zODMsMTMgKzM4NSwxNCBAQAogewogCWludAlpOwogCi0JaWYgKGNwdXNfd2VpZ2h0KCptYXNrKSA9PSAwIHx8IGFueV9vbmxpbmVfY3B1KCptYXNrKSA9PSBOUl9DUFVTKSB7CisJaWYgKGNwdW1hc2tfd2VpZ2h0KG1hc2spID09IDAgfHwKKwkgICAgY3B1bWFza19hbnlfYW5kKG1hc2ssIGNwdV9vbmxpbmVfbWFzaykgPj0gbnJfY3B1X2lkcykgewogCQlDREVCVUcoRF9JTkZPLCAiTm8gb25saW5lIENQVSBpcyBmb3VuZCBpbiB0aGUgQ1BVIG1hc2sgZm9yIENQVSBwYXJ0aXRpb24gJWRcbiIsCiAJCSAgICAgICBjcHQpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlmb3JfZWFjaF9jcHVfbWFzayhpLCAqbWFzaykgeworCWZvcl9lYWNoX2NwdShpLCBtYXNrKSB7CiAJCWlmICghY2ZzX2NwdF9zZXRfY3B1KGNwdGFiLCBjcHQsIGkpKQogCQkJcmV0dXJuIDA7CiAJfQpAQCAtNDAzLDcgKzQwNiw3IEBACiB7CiAJaW50CWk7CiAKLQlmb3JfZWFjaF9jcHVfbWFzayhpLCAqbWFzaykKKwlmb3JfZWFjaF9jcHUoaSwgbWFzaykKIAkJY2ZzX2NwdF91bnNldF9jcHUoY3B0YWIsIGNwdCwgaSk7CiB9CiBFWFBPUlRfU1lNQk9MKGNmc19jcHRfdW5zZXRfY3B1bWFzayk7CkBAIC00OTMsNyArNDk2LDcgQEAKIAl9CiAKIAlmb3IgKDsgY3B0IDw9IGxhc3Q7IGNwdCsrKSB7Ci0JCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spCisJCWZvcl9lYWNoX2NwdShpLCBjcHRhYi0+Y3RiX3BhcnRzW2NwdF0uY3B0X2NwdW1hc2spCiAJCQljZnNfY3B0X3Vuc2V0X2NwdShjcHRhYiwgY3B0LCBpKTsKIAl9CiB9CkBAIC01NTQsNyArNTU3LDcgQEAKIGludAogY2ZzX2NwdF9vZl9jcHUoc3RydWN0IGNmc19jcHRfdGFibGUgKmNwdGFiLCBpbnQgY3B1KQogewotCUxBU1NFUlQoY3B1ID49IDAgJiYgY3B1IDwgTlJfQ1BVUyk7CisJTEFTU0VSVChjcHUgPj0gMCAmJiBjcHUgPCBucl9jcHVfaWRzKTsKIAogCXJldHVybiBjcHRhYi0+Y3RiX2NwdTJjcHRbY3B1XTsKIH0KQEAgLTU3OCwxNCArNTgxLDE0IEBACiAJCW5vZGVtYXNrID0gY3B0YWItPmN0Yl9wYXJ0c1tjcHRdLmNwdF9ub2RlbWFzazsKIAl9CiAKLQlpZiAoYW55X29ubGluZV9jcHUoKmNwdW1hc2spID09IE5SX0NQVVMpIHsKKwlpZiAoY3B1bWFza19hbnlfYW5kKGNwdW1hc2ssIGNwdV9vbmxpbmVfbWFzaykgPj0gbnJfY3B1X2lkcykgewogCQlDRVJST1IoIk5vIG9ubGluZSBDUFUgZm91bmQgaW4gQ1BVIHBhcnRpdGlvbiAlZCwgZGlkIHNvbWVvbmUgZG8gQ1BVIGhvdHBsdWcgb24gc3lzdGVtPyBZb3UgbWlnaHQgbmVlZCB0byByZWxvYWQgTHVzdHJlIG1vZHVsZXMgdG8ga2VlcCBzeXN0ZW0gd29ya2luZyB3ZWxsLlxuIiwKIAkJICAgICAgIGNwdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewotCQlpZiAoY3B1X2lzc2V0KGksICpjcHVtYXNrKSkKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoaSwgY3B1bWFzaykpCiAJCQljb250aW51ZTsKIAogCQlyYyA9IHNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIGNwdW1hc2spOwpAQCAtNjE2LDE0ICs2MTksMTQgQEAKIAogCUxBU1NFUlQobnVtYmVyID4gMCk7CiAKLQlpZiAobnVtYmVyID49IGNwdXNfd2VpZ2h0KCpub2RlKSkgewotCQl3aGlsZSAoIWNwdXNfZW1wdHkoKm5vZGUpKSB7Ci0JCQljcHUgPSBmaXJzdF9jcHUoKm5vZGUpOworCWlmIChudW1iZXIgPj0gY3B1bWFza193ZWlnaHQobm9kZSkpIHsKKwkJd2hpbGUgKCFjcHVtYXNrX2VtcHR5KG5vZGUpKSB7CisJCQljcHUgPSBjcHVtYXNrX2ZpcnN0KG5vZGUpOwogCiAJCQlyYyA9IGNmc19jcHRfc2V0X2NwdShjcHRhYiwgY3B0LCBjcHUpOwogCQkJaWYgKCFyYykKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWNwdV9jbGVhcihjcHUsICpub2RlKTsKKwkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbm9kZSk7CiAJCX0KIAkJcmV0dXJuIDA7CiAJfQpAQCAtNjM2LDI3ICs2MzksMjcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jd2hpbGUgKCFjcHVzX2VtcHR5KCpub2RlKSkgewotCQljcHUgPSBmaXJzdF9jcHUoKm5vZGUpOworCXdoaWxlICghY3B1bWFza19lbXB0eShub2RlKSkgeworCQljcHUgPSBjcHVtYXNrX2ZpcnN0KG5vZGUpOwogCiAJCS8qIGdldCBjcHVtYXNrIGZvciBjb3JlcyBpbiB0aGUgc2FtZSBzb2NrZXQgKi8KIAkJY2ZzX2NwdV9jb3JlX3NpYmxpbmdzKGNwdSwgc29ja2V0KTsKLQkJY3B1c19hbmQoKnNvY2tldCwgKnNvY2tldCwgKm5vZGUpOworCQljcHVtYXNrX2FuZChzb2NrZXQsIHNvY2tldCwgbm9kZSk7CiAKLQkJTEFTU0VSVCghY3B1c19lbXB0eSgqc29ja2V0KSk7CisJCUxBU1NFUlQoIWNwdW1hc2tfZW1wdHkoc29ja2V0KSk7CiAKLQkJd2hpbGUgKCFjcHVzX2VtcHR5KCpzb2NrZXQpKSB7CisJCXdoaWxlICghY3B1bWFza19lbXB0eShzb2NrZXQpKSB7CiAJCQlpbnQgICAgIGk7CiAKIAkJCS8qIGdldCBjcHVtYXNrIGZvciBodHMgaW4gdGhlIHNhbWUgY29yZSAqLwogCQkJY2ZzX2NwdV9odF9zaWJsaW5ncyhjcHUsIGNvcmUpOwotCQkJY3B1c19hbmQoKmNvcmUsICpjb3JlLCAqbm9kZSk7CisJCQljcHVtYXNrX2FuZChjb3JlLCBjb3JlLCBub2RlKTsKIAotCQkJTEFTU0VSVCghY3B1c19lbXB0eSgqY29yZSkpOworCQkJTEFTU0VSVCghY3B1bWFza19lbXB0eShjb3JlKSk7CiAKLQkJCWZvcl9lYWNoX2NwdV9tYXNrKGksICpjb3JlKSB7Ci0JCQkJY3B1X2NsZWFyKGksICpzb2NrZXQpOwotCQkJCWNwdV9jbGVhcihpLCAqbm9kZSk7CisJCQlmb3JfZWFjaF9jcHUoaSwgY29yZSkgeworCQkJCWNwdW1hc2tfY2xlYXJfY3B1KGksIHNvY2tldCk7CisJCQkJY3B1bWFza19jbGVhcl9jcHUoaSwgbm9kZSk7CiAKIAkJCQlyYyA9IGNmc19jcHRfc2V0X2NwdShjcHRhYiwgY3B0LCBpKTsKIAkJCQlpZiAoIXJjKSB7CkBAIC02NjcsNyArNjcwLDcgQEAKIAkJCQlpZiAoLS1udW1iZXIgPT0gMCkKIAkJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQljcHUgPSBmaXJzdF9jcHUoKnNvY2tldCk7CisJCQljcHUgPSBjcHVtYXNrX2ZpcnN0KHNvY2tldCk7CiAJCX0KIAl9CiAKQEAgLTc2Nyw3ICs3NzAsNyBAQAogCWZvcl9lYWNoX29ubGluZV9ub2RlKGkpIHsKIAkJY2ZzX25vZGVfdG9fY3B1bWFzayhpLCBtYXNrKTsKIAotCQl3aGlsZSAoIWNwdXNfZW1wdHkoKm1hc2spKSB7CisJCXdoaWxlICghY3B1bWFza19lbXB0eShtYXNrKSkgewogCQkJc3RydWN0IGNmc19jcHVfcGFydGl0aW9uICpwYXJ0OwogCQkJaW50ICAgIG47CiAKQEAgLTc3NiwyNCArNzc5LDI0IEBACiAKIAkJCXBhcnQgPSAmY3B0YWItPmN0Yl9wYXJ0c1tjcHRdOwogCi0JCQluID0gbnVtIC0gY3B1c193ZWlnaHQoKnBhcnQtPmNwdF9jcHVtYXNrKTsKKwkJCW4gPSBudW0gLSBjcHVtYXNrX3dlaWdodChwYXJ0LT5jcHRfY3B1bWFzayk7CiAJCQlMQVNTRVJUKG4gPiAwKTsKIAogCQkJcmMgPSBjZnNfY3B0X2Nob29zZV9uY3B1cyhjcHRhYiwgY3B0LCBtYXNrLCBuKTsKIAkJCWlmIChyYyA8IDApCiAJCQkJZ290byBmYWlsZWQ7CiAKLQkJCUxBU1NFUlQobnVtID49IGNwdXNfd2VpZ2h0KCpwYXJ0LT5jcHRfY3B1bWFzaykpOwotCQkJaWYgKG51bSA9PSBjcHVzX3dlaWdodCgqcGFydC0+Y3B0X2NwdW1hc2spKQorCQkJTEFTU0VSVChudW0gPj0gY3B1bWFza193ZWlnaHQocGFydC0+Y3B0X2NwdW1hc2spKTsKKwkJCWlmIChudW0gPT0gY3B1bWFza193ZWlnaHQocGFydC0+Y3B0X2NwdW1hc2spKQogCQkJCWNwdCsrOwogCQl9CiAJfQogCiAJaWYgKGNwdCAhPSBuY3B0IHx8Ci0JICAgIG51bSAhPSBjcHVzX3dlaWdodCgqY3B0YWItPmN0Yl9wYXJ0c1tuY3B0IC0gMV0uY3B0X2NwdW1hc2spKSB7CisJICAgIG51bSAhPSBjcHVtYXNrX3dlaWdodChjcHRhYi0+Y3RiX3BhcnRzW25jcHQgLSAxXS5jcHRfY3B1bWFzaykpIHsKIAkJQ0VSUk9SKCJFeHBlY3QgJWQoJWQpIENQVSBwYXJ0aXRpb25zIGJ1dCBnb3QgJWQoJWQpLCBDUFUgaG90cGx1Zy91bnBsdWcgd2hpbGUgc2V0dGluZz9cbiIsCiAJCSAgICAgICBjcHRhYi0+Y3RiX25wYXJ0cywgbnVtLCBjcHQsCi0JCSAgICAgICBjcHVzX3dlaWdodCgqY3B0YWItPmN0Yl9wYXJ0c1tuY3B0IC0gMV0uY3B0X2NwdW1hc2spKTsKKwkJICAgICAgIGNwdW1hc2tfd2VpZ2h0KGNwdGFiLT5jdGJfcGFydHNbbmNwdCAtIDFdLmNwdF9jcHVtYXNrKSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtODQ1LDcgKzg0OCw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWhpZ2ggPSBub2RlID8gTUFYX05VTU5PREVTIC0gMSA6IE5SX0NQVVMgLSAxOworCWhpZ2ggPSBub2RlID8gTUFYX05VTU5PREVTIC0gMSA6IG5yX2NwdV9pZHMgLSAxOwogCiAJY3B0YWIgPSBjZnNfY3B0X3RhYmxlX2FsbG9jKG5jcHQpOwogCWlmIChjcHRhYiA9PSBOVUxMKSB7CkBAIC05NjUsNyArOTY4LDggQEAKIAkJbXV0ZXhfbG9jaygmY3B0X2RhdGEuY3B0X211dGV4KTsKIAkJLyogaWYgYWxsIEhUcyBpbiBhIGNvcmUgYXJlIG9mZmxpbmUsIGl0IG1heSBicmVhayBhZmZpbml0eSAqLwogCQljZnNfY3B1X2h0X3NpYmxpbmdzKGNwdSwgY3B0X2RhdGEuY3B0X2NwdW1hc2spOwotCQl3YXJuID0gYW55X29ubGluZV9jcHUoKmNwdF9kYXRhLmNwdF9jcHVtYXNrKSA+PSBucl9jcHVfaWRzOworCQl3YXJuID0gY3B1bWFza19hbnlfYW5kKGNwdF9kYXRhLmNwdF9jcHVtYXNrLAorCQkJCSAgICAgICBjcHVfb25saW5lX21hc2spID49IG5yX2NwdV9pZHM7CiAJCW11dGV4X3VubG9jaygmY3B0X2RhdGEuY3B0X211dGV4KTsKIAkJQ0RFQlVHKHdhcm4gPyBEX1dBUk5JTkcgOiBEX0lORk8sCiAJCSAgICAgICAiTHVzdHJlOiBjYW4ndCBzdXBwb3J0IENQVSBwbHVnLW91dCB3ZWxsIG5vdywgcGVyZm9ybWFuY2UgYW5kIHN0YWJpbGl0eSBjb3VsZCBiZSBpbXBhY3RlZCBbQ1BVICV1IGFjdGlvbjogJWx4XVxuIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1kZWJ1Zy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWRlYnVnLmMKaW5kZXggMTIwMDVhNy4uNDU0NWQ1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWRlYnVnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LWRlYnVnLmMKQEAgLTUwLDcgKzUwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiAKICMgZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xORVQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1tb2R1bGUuYwppbmRleCBhNWVmZmNkLi5lOTYyZjg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LW1vZHVsZS5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChoZHItPmlvY19sZW4gKyBidWYgPj0gZW5kKSB7CisJaWYgKGhkci0+aW9jX2xlbiA+PSBlbmQgLSBidWYpIHsKIAkJQ0VSUk9SKCJQT1JUQUxTOiB1c2VyIGJ1ZmZlciBleGNlZWRzIGtlcm5lbCBidWZmZXJcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtcHJpbS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LXByaW0uYwppbmRleCAxOWY0MDVlLi44MzhmNWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtcHJpbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC1wcmltLmMKQEAgLTQzLDcgKzQzLDcgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnMuaCIKIAogI2lmIGRlZmluZWQoQ09ORklHX0tHREIpCi0jaW5jbHVkZSA8YXNtL2tnZGIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZ2RiLmg+CiAjZW5kaWYKIAogLyoqCkBAIC0xMTcsMTEgKzExNywxMiBAQAogdm9pZCBjZnNfZW50ZXJfZGVidWdnZXIodm9pZCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19LR0RCKQotLy8JQlJFQUtQT0lOVCgpOworCS8qIEJSRUFLUE9JTlQoKTsgKi8KICNlbHNlCiAJLyogbm90aGluZyAqLwogI2VuZGlmCiB9CitFWFBPUlRfU1lNQk9MKGNmc19lbnRlcl9kZWJ1Z2dlcik7CiAKIAogc2lnc2V0X3QKQEAgLTEzOCw2ICsxMzksNyBAQAogCiAJcmV0dXJuIG9sZDsKIH0KK0VYUE9SVF9TWU1CT0woY2ZzX2Jsb2NrX2FsbHNpZ3MpOwogCiBzaWdzZXRfdCBjZnNfYmxvY2tfc2lncyh1bnNpZ25lZCBsb25nIHNpZ3MpCiB7CkBAIC0xNTEsNiArMTUzLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrLCBmbGFncyk7CiAJcmV0dXJuIG9sZDsKIH0KK0VYUE9SVF9TWU1CT0woY2ZzX2Jsb2NrX3NpZ3MpOwogCiAvKiBCbG9jayBhbGwgc2lnbmFscyBleGNlcHQgZm9yIHRoZSBAc2lncyAqLwogc2lnc2V0X3QgY2ZzX2Jsb2NrX3NpZ3NpbnYodW5zaWduZWQgbG9uZyBzaWdzKQpAQCAtMTY2LDkgKzE2OSwxMCBAQAogCiAJcmV0dXJuIG9sZDsKIH0KK0VYUE9SVF9TWU1CT0woY2ZzX2Jsb2NrX3NpZ3NpbnYpOwogCiB2b2lkCi1jZnNfcmVzdG9yZV9zaWdzIChzaWdzZXRfdCBvbGQpCitjZnNfcmVzdG9yZV9zaWdzKHNpZ3NldF90IG9sZCkKIHsKIAl1bnNpZ25lZCBsb25nICBmbGFnczsKIApAQCAtMTc3LDEyICsxODEsMTQgQEAKIAlyZWNhbGNfc2lncGVuZGluZygpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0woY2ZzX3Jlc3RvcmVfc2lncyk7CiAKIGludAogY2ZzX3NpZ25hbF9wZW5kaW5nKHZvaWQpCiB7CiAJcmV0dXJuIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpOwogfQorRVhQT1JUX1NZTUJPTChjZnNfc2lnbmFsX3BlbmRpbmcpOwogCiB2b2lkCiBjZnNfY2xlYXJfc2lncGVuZGluZyh2b2lkKQpAQCAtMTkzLDI1ICsxOTksMTkgQEAKIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY3VycmVudCwgVElGX1NJR1BFTkRJTkcpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2ssIGZsYWdzKTsKIH0KK0VYUE9SVF9TWU1CT0woY2ZzX2NsZWFyX3NpZ3BlbmRpbmcpOwogCiBpbnQKIGxpYmNmc19hcmNoX2luaXQodm9pZCkKIHsKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0wobGliY2ZzX2FyY2hfaW5pdCk7CiAKIHZvaWQKIGxpYmNmc19hcmNoX2NsZWFudXAodm9pZCkKIHsKIAlyZXR1cm47CiB9Ci0KLUVYUE9SVF9TWU1CT0wobGliY2ZzX2FyY2hfaW5pdCk7CiBFWFBPUlRfU1lNQk9MKGxpYmNmc19hcmNoX2NsZWFudXApOwotRVhQT1JUX1NZTUJPTChjZnNfZW50ZXJfZGVidWdnZXIpOwotRVhQT1JUX1NZTUJPTChjZnNfYmxvY2tfYWxsc2lncyk7Ci1FWFBPUlRfU1lNQk9MKGNmc19ibG9ja19zaWdzKTsKLUVYUE9SVF9TWU1CT0woY2ZzX2Jsb2NrX3NpZ3NpbnYpOwotRVhQT1JUX1NZTUJPTChjZnNfcmVzdG9yZV9zaWdzKTsKLUVYUE9SVF9TWU1CT0woY2ZzX3NpZ25hbF9wZW5kaW5nKTsKLUVYUE9SVF9TWU1CT0woY2ZzX2NsZWFyX3NpZ3BlbmRpbmcpOworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtcHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL2xpbnV4L2xpbnV4LXByb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUzOWUzNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtcHJvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTc3ICswLDAgQEAKLS8qCi0gKiBHUEwgSEVBREVSIFNUQVJUCi0gKgotICogRE8gTk9UIEFMVEVSIE9SIFJFTU9WRSBDT1BZUklHSFQgTk9USUNFUyBPUiBUSElTIEZJTEUgSEVBREVSLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvbmx5LAotICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGZvciBtb3JlIGRldGFpbHMgKGEgY29weSBpcyBpbmNsdWRlZAotICogaW4gdGhlIExJQ0VOU0UgZmlsZSB0aGF0IGFjY29tcGFuaWVkIHRoaXMgY29kZSkuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgSWYgbm90LCBzZWUKLSAqIGh0dHA6Ly93d3cuc3VuLmNvbS9zb2Z0d2FyZS9wcm9kdWN0cy9sdXN0cmUvZG9jcy9HUEx2Mi5wZGYKLSAqCi0gKiBQbGVhc2UgY29udGFjdCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuLCA0MTUwIE5ldHdvcmsgQ2lyY2xlLCBTYW50YSBDbGFyYSwKLSAqIENBIDk1MDU0IFVTQSBvciB2aXNpdCB3d3cuc3VuLmNvbSBpZiB5b3UgbmVlZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9yCi0gKiBoYXZlIGFueSBxdWVzdGlvbnMuCi0gKgotICogR1BMIEhFQURFUiBFTkQKLSAqLwotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMCwgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyLCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqLwotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEx1c3RyZSwgaHR0cDovL3d3dy5sdXN0cmUub3JnLwotICogTHVzdHJlIGlzIGEgdHJhZGVtYXJrIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KLSAqCi0gKiBsaWJjZnMvbGliY2ZzL2xpbnV4L2xpbnV4LXByb2MuYwotICoKLSAqIEF1dGhvcjogWmFjaCBCcm93biA8emFiQHphYmJvLm5ldD4KLSAqIEF1dGhvcjogUGV0ZXIgSi4gQnJhYW0gPGJyYWFtQGNsdXN0ZXJmcy5jb20+Ci0gKiBBdXRob3I6IFBoaWwgU2Nod2FuIDxwaGlsQGNsdXN0ZXJmcy5jb20+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RhdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8bmV0L3NvY2suaD4KLSNpbmNsdWRlIDxsaW51eC91aW8uaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+Ci0KLSMgZGVmaW5lIERFQlVHX1NVQlNZU1RFTSBTX0xORVQKLQotI2luY2x1ZGUgIi4uLy4uLy4uL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmcy5oIgotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotI2luY2x1ZGUgIi4uL3RyYWNlZmlsZS5oIgotCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmxuZXRfdGFibGVfaGVhZGVyID0gTlVMTDsKLWV4dGVybiBjaGFyIGxuZXRfdXBjYWxsWzEwMjRdOwotLyoqCi0gKiBUaGUgcGF0aCBvZiBkZWJ1ZyBsb2cgZHVtcCB1cGNhbGwgc2NyaXB0LgotICovCi1leHRlcm4gY2hhciBsbmV0X2RlYnVnX2xvZ191cGNhbGxbMTAyNF07Ci0KLSNkZWZpbmUgQ1RMX0xORVQJKDB4MTAwKQotZW51bSB7Ci0JUFNERVZfREVCVUcgPSAxLAkgIC8qIGNvbnRyb2wgZGVidWdnaW5nICovCi0JUFNERVZfU1VCU1lTVEVNX0RFQlVHLCAgICAvKiBjb250cm9sIGRlYnVnZ2luZyAqLwotCVBTREVWX1BSSU5USywJICAgICAvKiBmb3JjZSBhbGwgbWVzc2FnZXMgdG8gY29uc29sZSAqLwotCVBTREVWX0NPTlNPTEVfUkFURUxJTUlULCAgLyogcmF0ZWxpbWl0IGNvbnNvbGUgbWVzc2FnZXMgKi8KLQlQU0RFVl9DT05TT0xFX01BWF9ERUxBWV9DUywgLyogbWF4aW11bSBkZWxheSBvdmVyIHdoaWNoIHdlIHNraXAgbWVzc2FnZXMgKi8KLQlQU0RFVl9DT05TT0xFX01JTl9ERUxBWV9DUywgLyogaW5pdGlhbCBkZWxheSBvdmVyIHdoaWNoIHdlIHNraXAgbWVzc2FnZXMgKi8KLQlQU0RFVl9DT05TT0xFX0JBQ0tPRkYsICAgIC8qIGRlbGF5IGluY3JlYXNlIGZhY3RvciAqLwotCVBTREVWX0RFQlVHX1BBVEgsCSAvKiBjcmFzaGR1bXAgbG9nIGxvY2F0aW9uICovCi0JUFNERVZfREVCVUdfRFVNUF9QQVRILCAgICAvKiBjcmFzaGR1bXAgdHJhY2Vsb2cgbG9jYXRpb24gKi8KLQlQU0RFVl9DUFRfVEFCTEUsCSAgLyogaW5mb3JtYXRpb24gYWJvdXQgY3B1IHBhcnRpdGlvbnMgKi8KLQlQU0RFVl9MTkVUX1VQQ0FMTCwJLyogVXNlciBtb2RlIHVwY2FsbCBzY3JpcHQgICovCi0JUFNERVZfTE5FVF9NRU1VU0VELCAgICAgICAvKiBieXRlcyBjdXJyZW50bHkgUE9SVEFMX0FMTE9DYXRlZCAqLwotCVBTREVWX0xORVRfQ0FUQVNUUk9QSEUsICAgLyogaWYgd2UgaGF2ZSBMQlVHZ2VkIG9yIHBhbmljJ2QgKi8KLQlQU0RFVl9MTkVUX1BBTklDX09OX0xCVUcsIC8qIGZsYWcgdG8gcGFuaWMgb24gTEJVRyAqLwotCVBTREVWX0xORVRfRFVNUF9LRVJORUwsICAgLyogc25hcHNob3Qga2VybmVsIGRlYnVnIGJ1ZmZlciB0byBmaWxlICovCi0JUFNERVZfTE5FVF9EQUVNT05fRklMRSwgICAvKiBzcG9vbCBrZXJuZWwgZGVidWcgYnVmZmVyIHRvIGZpbGUgKi8KLQlQU0RFVl9MTkVUX0RFQlVHX01CLCAgICAgIC8qIHNpemUgb2YgZGVidWcgYnVmZmVyICovCi0JUFNERVZfTE5FVF9ERUJVR19MT0dfVVBDQUxMLCAvKiBkZWJ1ZyBsb2cgdXBjYWxsIHNjcmlwdCAqLwotCVBTREVWX0xORVRfV0FUQ0hET0dfUkFURUxJTUlULCAgLyogcmF0ZWxpbWl0IHdhdGNoZG9nIG1lc3NhZ2VzICAqLwotCVBTREVWX0xORVRfRk9SQ0VfTEJVRywgICAgLyogaG9vayB0byBmb3JjZSBhbiBMQlVHICovCi0JUFNERVZfTE5FVF9GQUlMX0xPQywgICAgICAvKiBjb250cm9sIHRlc3QgZmFpbHVyZXMgaW5zdHJ1bWVudGF0aW9uICovCi0JUFNERVZfTE5FVF9GQUlMX1ZBTCwgICAgICAvKiB1c2VyZGF0YSBmb3IgZmFpbCBsb2MgKi8KLX07Ci0KLXN0YXRpYyBpbnQgcHJvY19jYWxsX2hhbmRsZXIodm9pZCAqZGF0YSwgaW50IHdyaXRlLCBsb2ZmX3QgKnBwb3MsCi0JCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKLQkJaW50ICgqaGFuZGxlcikodm9pZCAqZGF0YSwgaW50IHdyaXRlLAotCQlsb2ZmX3QgcG9zLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbGVuKSkKLXsKLQlpbnQgcmMgPSBoYW5kbGVyKGRhdGEsIHdyaXRlLCAqcHBvcywgYnVmZmVyLCAqbGVucCk7Ci0KLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0KLQlpZiAod3JpdGUpIHsKLQkJKnBwb3MgKz0gKmxlbnA7Ci0JfSBlbHNlIHsKLQkJKmxlbnAgPSByYzsKLQkJKnBwb3MgKz0gcmM7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9fcHJvY19kb2JpdG1hc2tzKHZvaWQgKmRhdGEsIGludCB3cml0ZSwKLQkJCSAgICAgbG9mZl90IHBvcywgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgaW50IG5vYikKLXsKLQljb25zdCBpbnQgICAgIHRtcHN0cmxlbiA9IDUxMjsKLQljaGFyCSAqdG1wc3RyOwotCWludAkgICByYzsKLQl1bnNpZ25lZCBpbnQgKm1hc2sgPSBkYXRhOwotCWludAkgICBpc19zdWJzeXMgPSAobWFzayA9PSAmbGliY2ZzX3N1YnN5c3RlbV9kZWJ1ZykgPyAxIDogMDsKLQlpbnQJICAgaXNfcHJpbnRrID0gKG1hc2sgPT0gJmxpYmNmc19wcmludGspID8gMSA6IDA7Ci0KLQlyYyA9IGNmc190cmFjZV9hbGxvY2F0ZV9zdHJpbmdfYnVmZmVyKCZ0bXBzdHIsIHRtcHN0cmxlbik7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCi0JaWYgKCF3cml0ZSkgewotCQlsaWJjZnNfZGVidWdfbWFzazJzdHIodG1wc3RyLCB0bXBzdHJsZW4sICptYXNrLCBpc19zdWJzeXMpOwotCQlyYyA9IHN0cmxlbih0bXBzdHIpOwotCi0JCWlmIChwb3MgPj0gcmMpIHsKLQkJCXJjID0gMDsKLQkJfSBlbHNlIHsKLQkJCXJjID0gY2ZzX3RyYWNlX2NvcHlvdXRfc3RyaW5nKGJ1ZmZlciwgbm9iLAotCQkJCQkJICAgICAgdG1wc3RyICsgcG9zLCAiXG4iKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJjID0gY2ZzX3RyYWNlX2NvcHlpbl9zdHJpbmcodG1wc3RyLCB0bXBzdHJsZW4sIGJ1ZmZlciwgbm9iKTsKLQkJaWYgKHJjIDwgMCkgewotCQkJY2ZzX3RyYWNlX2ZyZWVfc3RyaW5nX2J1ZmZlcih0bXBzdHIsIHRtcHN0cmxlbik7Ci0JCQlyZXR1cm4gcmM7Ci0JCX0KLQotCQlyYyA9IGxpYmNmc19kZWJ1Z19zdHIybWFzayhtYXNrLCB0bXBzdHIsIGlzX3N1YnN5cyk7Ci0JCS8qIEFsd2F5cyBwcmludCBMQlVHL0xBU1NFUlQgdG8gY29uc29sZSwgc28ga2VlcCB0aGlzIG1hc2sgKi8KLQkJaWYgKGlzX3ByaW50aykKLQkJCSptYXNrIHw9IERfRU1FUkc7Ci0JfQotCi0JY2ZzX3RyYWNlX2ZyZWVfc3RyaW5nX2J1ZmZlcih0bXBzdHIsIHRtcHN0cmxlbik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHByb2NfZG9iaXRtYXNrcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIHByb2NfY2FsbF9oYW5kbGVyKHRhYmxlLT5kYXRhLCB3cml0ZSwgcHBvcywgYnVmZmVyLCBsZW5wLAotCQkJCSBfX3Byb2NfZG9iaXRtYXNrcyk7Ci19Ci0KLXN0YXRpYyBpbnQgbWluX3dhdGNoZG9nX3JhdGVsaW1pdCA9IDA7CSAgLyogZGlzYWJsZSByYXRlbGltaXRpbmcgKi8KLXN0YXRpYyBpbnQgbWF4X3dhdGNoZG9nX3JhdGVsaW1pdCA9ICgyNCo2MCo2MCk7IC8qIGxpbWl0IHRvIG9uY2UgcGVyIGRheSAqLwotCi1zdGF0aWMgaW50IF9fcHJvY19kdW1wX2tlcm5lbCh2b2lkICpkYXRhLCBpbnQgd3JpdGUsCi0JCQkgICAgICBsb2ZmX3QgcG9zLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbm9iKQotewotCWlmICghd3JpdGUpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGNmc190cmFjZV9kdW1wX2RlYnVnX2J1ZmZlcl91c3JzdHIoYnVmZmVyLCBub2IpOwotfQotCi1zdGF0aWMgaW50IHByb2NfZHVtcF9rZXJuZWwoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gcHJvY19jYWxsX2hhbmRsZXIodGFibGUtPmRhdGEsIHdyaXRlLCBwcG9zLCBidWZmZXIsIGxlbnAsCi0JCQkJIF9fcHJvY19kdW1wX2tlcm5lbCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19wcm9jX2RhZW1vbl9maWxlKHZvaWQgKmRhdGEsIGludCB3cml0ZSwKLQkJCSAgICAgIGxvZmZfdCBwb3MsIHZvaWQgX191c2VyICpidWZmZXIsIGludCBub2IpCi17Ci0JaWYgKCF3cml0ZSkgewotCQlpbnQgbGVuID0gc3RybGVuKGNmc190cmFjZWZpbGUpOwotCi0JCWlmIChwb3MgPj0gbGVuKQotCQkJcmV0dXJuIDA7Ci0KLQkJcmV0dXJuIGNmc190cmFjZV9jb3B5b3V0X3N0cmluZyhidWZmZXIsIG5vYiwKLQkJCQkJCWNmc190cmFjZWZpbGUgKyBwb3MsICJcbiIpOwotCX0KLQotCXJldHVybiBjZnNfdHJhY2VfZGFlbW9uX2NvbW1hbmRfdXNyc3RyKGJ1ZmZlciwgbm9iKTsKLX0KLQotc3RhdGljIGludCBwcm9jX2RhZW1vbl9maWxlKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIHByb2NfY2FsbF9oYW5kbGVyKHRhYmxlLT5kYXRhLCB3cml0ZSwgcHBvcywgYnVmZmVyLCBsZW5wLAotCQkJCSBfX3Byb2NfZGFlbW9uX2ZpbGUpOwotfQotCi1zdGF0aWMgaW50IF9fcHJvY19kZWJ1Z19tYih2b2lkICpkYXRhLCBpbnQgd3JpdGUsCi0JCQkgICBsb2ZmX3QgcG9zLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbm9iKQotewotCWlmICghd3JpdGUpIHsKLQkJY2hhciB0bXBzdHJbMzJdOwotCQlpbnQgIGxlbiA9IHNucHJpbnRmKHRtcHN0ciwgc2l6ZW9mKHRtcHN0ciksICIlZCIsCi0JCQkJICAgIGNmc190cmFjZV9nZXRfZGVidWdfbWIoKSk7Ci0KLQkJaWYgKHBvcyA+PSBsZW4pCi0JCQlyZXR1cm4gMDsKLQotCQlyZXR1cm4gY2ZzX3RyYWNlX2NvcHlvdXRfc3RyaW5nKGJ1ZmZlciwgbm9iLCB0bXBzdHIgKyBwb3MsCi0JCSAgICAgICAiXG4iKTsKLQl9Ci0KLQlyZXR1cm4gY2ZzX3RyYWNlX3NldF9kZWJ1Z19tYl91c3JzdHIoYnVmZmVyLCBub2IpOwotfQotCi1zdGF0aWMgaW50IHByb2NfZGVidWdfbWIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gcHJvY19jYWxsX2hhbmRsZXIodGFibGUtPmRhdGEsIHdyaXRlLCBwcG9zLCBidWZmZXIsIGxlbnAsCi0JCQkJIF9fcHJvY19kZWJ1Z19tYik7Ci19Ci0KLXN0YXRpYyBpbnQgcHJvY19jb25zb2xlX21heF9kZWxheV9jcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAotCQkJCSAgICAgbG9mZl90ICpwcG9zKQotewotCWludCByYywgbWF4X2RlbGF5X2NzOwotCXN0cnVjdCBjdGxfdGFibGUgZHVtbXkgPSAqdGFibGU7Ci0JbG9uZyBkOwotCi0JZHVtbXkuZGF0YSA9ICZtYXhfZGVsYXlfY3M7Ci0JZHVtbXkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWM7Ci0KLQlpZiAoIXdyaXRlKSB7IC8qIHJlYWQgKi8KLQkJbWF4X2RlbGF5X2NzID0gY2ZzX2R1cmF0aW9uX3NlYyhsaWJjZnNfY29uc29sZV9tYXhfZGVsYXkgKiAxMDApOwotCQlyYyA9IHByb2NfZG9pbnR2ZWMoJmR1bW15LCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKLQkJcmV0dXJuIHJjOwotCX0KLQotCS8qIHdyaXRlICovCi0JbWF4X2RlbGF5X2NzID0gMDsKLQlyYyA9IHByb2NfZG9pbnR2ZWMoJmR1bW15LCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JaWYgKG1heF9kZWxheV9jcyA8PSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWQgPSBjZnNfdGltZV9zZWNvbmRzKG1heF9kZWxheV9jcykgLyAxMDA7Ci0JaWYgKGQgPT0gMCB8fCBkIDwgbGliY2ZzX2NvbnNvbGVfbWluX2RlbGF5KQotCQlyZXR1cm4gLUVJTlZBTDsKLQlsaWJjZnNfY29uc29sZV9tYXhfZGVsYXkgPSBkOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHByb2NfY29uc29sZV9taW5fZGVsYXlfY3Moc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKLQkJCQkgICAgIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgcmMsIG1pbl9kZWxheV9jczsKLQlzdHJ1Y3QgY3RsX3RhYmxlIGR1bW15ID0gKnRhYmxlOwotCWxvbmcgZDsKLQotCWR1bW15LmRhdGEgPSAmbWluX2RlbGF5X2NzOwotCWR1bW15LnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjOwotCi0JaWYgKCF3cml0ZSkgeyAvKiByZWFkICovCi0JCW1pbl9kZWxheV9jcyA9IGNmc19kdXJhdGlvbl9zZWMobGliY2ZzX2NvbnNvbGVfbWluX2RlbGF5ICogMTAwKTsKLQkJcmMgPSBwcm9jX2RvaW50dmVjKCZkdW1teSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiB3cml0ZSAqLwotCW1pbl9kZWxheV9jcyA9IDA7Ci0JcmMgPSBwcm9jX2RvaW50dmVjKCZkdW1teSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Ci0JaWYgKHJjIDwgMCkKLQkJcmV0dXJuIHJjOwotCWlmIChtaW5fZGVsYXlfY3MgPD0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkID0gY2ZzX3RpbWVfc2Vjb25kcyhtaW5fZGVsYXlfY3MpIC8gMTAwOwotCWlmIChkID09IDAgfHwgZCA+IGxpYmNmc19jb25zb2xlX21heF9kZWxheSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JbGliY2ZzX2NvbnNvbGVfbWluX2RlbGF5ID0gZDsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBwcm9jX2NvbnNvbGVfYmFja29mZihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQotewotCWludCByYywgYmFja29mZjsKLQlzdHJ1Y3QgY3RsX3RhYmxlIGR1bW15ID0gKnRhYmxlOwotCi0JZHVtbXkuZGF0YSA9ICZiYWNrb2ZmOwotCWR1bW15LnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjOwotCi0JaWYgKCF3cml0ZSkgeyAvKiByZWFkICovCi0JCWJhY2tvZmY9IGxpYmNmc19jb25zb2xlX2JhY2tvZmY7Ci0JCXJjID0gcHJvY19kb2ludHZlYygmZHVtbXksIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogd3JpdGUgKi8KLQliYWNrb2ZmID0gMDsKLQlyYyA9IHByb2NfZG9pbnR2ZWMoJmR1bW15LCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKLQlpZiAocmMgPCAwKQotCQlyZXR1cm4gcmM7Ci0JaWYgKGJhY2tvZmYgPD0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlsaWJjZnNfY29uc29sZV9iYWNrb2ZmID0gYmFja29mZjsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIGludCBsaWJjZnNfZm9yY2VfbGJ1ZyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAotCQkJICAgICB2b2lkIF9fdXNlciAqYnVmZmVyLAotCQkJICAgICBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlpZiAod3JpdGUpCi0JCUxCVUcoKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwcm9jX2ZhaWxfbG9jKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKLQkJCSBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlpbnQgcmM7Ci0JbG9uZyBvbGRfZmFpbF9sb2MgPSBjZnNfZmFpbF9sb2M7Ci0KLQlyYyA9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOwotCWlmIChvbGRfZmFpbF9sb2MgIT0gY2ZzX2ZhaWxfbG9jKQotCQl3YWtlX3VwKCZjZnNfcmFjZV93YWl0cSk7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IF9fcHJvY19jcHRfdGFibGUodm9pZCAqZGF0YSwgaW50IHdyaXRlLAotCQkJICAgIGxvZmZfdCBwb3MsIHZvaWQgX191c2VyICpidWZmZXIsIGludCBub2IpCi17Ci0JY2hhciAqYnVmID0gTlVMTDsKLQlpbnQgICBsZW4gPSA0MDk2OwotCWludCAgIHJjICA9IDA7Ci0KLQlpZiAod3JpdGUpCi0JCXJldHVybiAtRVBFUk07Ci0KLQlMQVNTRVJUKGNmc19jcHRfdGFibGUgIT0gTlVMTCk7Ci0KLQl3aGlsZSAoMSkgewotCQlMSUJDRlNfQUxMT0MoYnVmLCBsZW4pOwotCQlpZiAoYnVmID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQotCQlyYyA9IGNmc19jcHRfdGFibGVfcHJpbnQoY2ZzX2NwdF90YWJsZSwgYnVmLCBsZW4pOwotCQlpZiAocmMgPj0gMCkKLQkJCWJyZWFrOwotCi0JCWlmIChyYyA9PSAtRUZCSUcpIHsKLQkJCUxJQkNGU19GUkVFKGJ1ZiwgbGVuKTsKLQkJCWxlbiA8PD0gMTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChwb3MgPj0gcmMpIHsKLQkJcmMgPSAwOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyYyA9IGNmc190cmFjZV9jb3B5b3V0X3N0cmluZyhidWZmZXIsIG5vYiwgYnVmICsgcG9zLCBOVUxMKTsKLSBvdXQ6Ci0JaWYgKGJ1ZiAhPSBOVUxMKQotCQlMSUJDRlNfRlJFRShidWYsIGxlbik7Ci0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW50IHByb2NfY3B0X3RhYmxlKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCi0JCQkgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gcHJvY19jYWxsX2hhbmRsZXIodGFibGUtPmRhdGEsIHdyaXRlLCBwcG9zLCBidWZmZXIsIGxlbnAsCi0JCQkJIF9fcHJvY19jcHRfdGFibGUpOwotfQotCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZSBsbmV0X3RhYmxlW10gPSB7Ci0JLyoKLQkgKiBOQiBObyAuc3RyYXRlZ3kgZW50cmllcyBoYXZlIGJlZW4gcHJvdmlkZWQgc2luY2Ugc3lzY3RsKDgpIHByZWZlcnMKLQkgKiB0byBnbyB2aWEgL3Byb2MgZm9yIHBvcnRhYmlsaXR5LgotCSAqLwotCXsKLQkJLnByb2NuYW1lID0gImRlYnVnIiwKLQkJLmRhdGEgICAgID0gJmxpYmNmc19kZWJ1ZywKLQkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCi0JCS5tb2RlICAgICA9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2JpdG1hc2tzLAotCX0sCi0JewotCQkucHJvY25hbWUgPSAic3Vic3lzdGVtX2RlYnVnIiwKLQkJLmRhdGEgICAgID0gJmxpYmNmc19zdWJzeXN0ZW1fZGVidWcsCi0JCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAotCQkubW9kZSAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9iaXRtYXNrcywKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gInByaW50ayIsCi0JCS5kYXRhICAgICA9ICZsaWJjZnNfcHJpbnRrLAotCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvYml0bWFza3MsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJjb25zb2xlX3JhdGVsaW1pdCIsCi0JCS5kYXRhICAgICA9ICZsaWJjZnNfY29uc29sZV9yYXRlbGltaXQsCi0JCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAotCQkubW9kZSAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWMKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gImNvbnNvbGVfbWF4X2RlbGF5X2NlbnRpc2VjcyIsCi0JCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAotCQkubW9kZSAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfY29uc29sZV9tYXhfZGVsYXlfY3MKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gImNvbnNvbGVfbWluX2RlbGF5X2NlbnRpc2VjcyIsCi0JCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAotCQkubW9kZSAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfY29uc29sZV9taW5fZGVsYXlfY3MKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gImNvbnNvbGVfYmFja29mZiIsCi0JCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAotCQkubW9kZSAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfY29uc29sZV9iYWNrb2ZmCi0JfSwKLQotCXsKLQkJLnByb2NuYW1lID0gImRlYnVnX3BhdGgiLAotCQkuZGF0YSAgICAgPSBsaWJjZnNfZGVidWdfZmlsZV9wYXRoX2FyciwKLQkJLm1heGxlbiAgID0gc2l6ZW9mKGxpYmNmc19kZWJ1Z19maWxlX3BhdGhfYXJyKSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2Rvc3RyaW5nLAotCX0sCi0KLQl7Ci0JCS5wcm9jbmFtZSA9ICJjcHVfcGFydGl0aW9uX3RhYmxlIiwKLQkJLm1heGxlbiAgID0gMTI4LAotCQkubW9kZSAgICAgPSAwNDQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfY3B0X3RhYmxlLAotCX0sCi0KLQl7Ci0JCS5wcm9jbmFtZSA9ICJ1cGNhbGwiLAotCQkuZGF0YSAgICAgPSBsbmV0X3VwY2FsbCwKLQkJLm1heGxlbiAgID0gc2l6ZW9mKGxuZXRfdXBjYWxsKSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2Rvc3RyaW5nLAotCX0sCi0JewotCQkucHJvY25hbWUgPSAiZGVidWdfbG9nX3VwY2FsbCIsCi0JCS5kYXRhICAgICA9IGxuZXRfZGVidWdfbG9nX3VwY2FsbCwKLQkJLm1heGxlbiAgID0gc2l6ZW9mKGxuZXRfZGVidWdfbG9nX3VwY2FsbCksCi0JCS5tb2RlICAgICA9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb3N0cmluZywKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gImxuZXRfbWVtdXNlZCIsCi0JCS5kYXRhICAgICA9IChpbnQgKikmbGliY2ZzX2ttZW1vcnkuY291bnRlciwKLQkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCi0JCS5tb2RlICAgICA9IDA0NDQsCi0JCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gImNhdGFzdHJvcGhlIiwKLQkJLmRhdGEgICAgID0gJmxpYmNmc19jYXRhc3Ryb3BoZSwKLQkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCi0JCS5tb2RlICAgICA9IDA0NDQsCi0JCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2ludHZlYywKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gInBhbmljX29uX2xidWciLAotCQkuZGF0YSAgICAgPSAmbGliY2ZzX3BhbmljX29uX2xidWcsCi0JCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAotCQkubW9kZSAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWMsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJkdW1wX2tlcm5lbCIsCi0JCS5tYXhsZW4gICA9IDI1NiwKLQkJLm1vZGUgICAgID0gMDIwMCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2R1bXBfa2VybmVsLAotCX0sCi0JewotCQkucHJvY25hbWUgPSAiZGFlbW9uX2ZpbGUiLAotCQkubW9kZSAgICAgPSAwNjQ0LAotCQkubWF4bGVuICAgPSAyNTYsCi0JCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kYWVtb25fZmlsZSwKLQl9LAotCXsKLQkJLnByb2NuYW1lID0gImRlYnVnX21iIiwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RlYnVnX21iLAotCX0sCi0JewotCQkucHJvY25hbWUgPSAid2F0Y2hkb2dfcmF0ZWxpbWl0IiwKLQkJLmRhdGEgICAgID0gJmxpYmNmc193YXRjaGRvZ19yYXRlbGltaXQsCi0JCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAotCQkubW9kZSAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWNfbWlubWF4LAotCQkuZXh0cmExICAgPSAmbWluX3dhdGNoZG9nX3JhdGVsaW1pdCwKLQkJLmV4dHJhMiAgID0gJm1heF93YXRjaGRvZ19yYXRlbGltaXQsCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJmb3JjZV9sYnVnIiwKLQkJLmRhdGEgICAgID0gTlVMTCwKLQkJLm1heGxlbiAgID0gMCwKLQkJLm1vZGUgICAgID0gMDIwMCwKLQkJLnByb2NfaGFuZGxlciA9ICZsaWJjZnNfZm9yY2VfbGJ1ZwotCX0sCi0JewotCQkucHJvY25hbWUgPSAiZmFpbF9sb2MiLAotCQkuZGF0YSAgICAgPSAmY2ZzX2ZhaWxfbG9jLAotCQkubWF4bGVuICAgPSBzaXplb2YoY2ZzX2ZhaWxfbG9jKSwKLQkJLm1vZGUgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2ZhaWxfbG9jCi0JfSwKLQl7Ci0JCS5wcm9jbmFtZSA9ICJmYWlsX3ZhbCIsCi0JCS5kYXRhICAgICA9ICZjZnNfZmFpbF92YWwsCi0JCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAotCQkubW9kZSAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWMKLQl9LAotCXsKLQl9Ci19OwotCi1zdGF0aWMgc3RydWN0IGN0bF90YWJsZSB0b3BfdGFibGVbXSA9IHsKLQl7Ci0JCS5wcm9jbmFtZSA9ICJsbmV0IiwKLQkJLm1vZGUgICAgID0gMDU1NSwKLQkJLmRhdGEgICAgID0gTlVMTCwKLQkJLm1heGxlbiAgID0gMCwKLQkJLmNoaWxkICAgID0gbG5ldF90YWJsZSwKLQl9LAotCXsKLQl9Ci19OwotCi1pbnQgaW5zZXJ0X3Byb2Modm9pZCkKLXsKLQlpZiAobG5ldF90YWJsZV9oZWFkZXIgPT0gTlVMTCkKLQkJbG5ldF90YWJsZV9oZWFkZXIgPSByZWdpc3Rlcl9zeXNjdGxfdGFibGUodG9wX3RhYmxlKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCByZW1vdmVfcHJvYyh2b2lkKQotewotCWlmIChsbmV0X3RhYmxlX2hlYWRlciAhPSBOVUxMKQotCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShsbmV0X3RhYmxlX2hlYWRlcik7Ci0KLQlsbmV0X3RhYmxlX2hlYWRlciA9IE5VTEw7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbGludXgvbGludXgtdGNwaXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC10Y3BpcC5jCmluZGV4IGNkMmZjMDEuLmYyNDYyZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC10Y3BpcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9saW51eC9saW51eC10Y3BpcC5jCkBAIC01NDMsMTkgKzU0MywxNyBAQAogCiAJbmV3c29jay0+b3BzID0gc29jay0+b3BzOwogCi0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKLQlhZGRfd2FpdF9xdWV1ZShza19zbGVlcChzb2NrLT5zayksICZ3YWl0KTsKLQogCXJjID0gc29jay0+b3BzLT5hY2NlcHQoc29jaywgbmV3c29jaywgT19OT05CTE9DSyk7CiAJaWYgKHJjID09IC1FQUdBSU4pIHsKIAkJLyogTm90aGluZyByZWFkeSwgc28gd2FpdCBmb3IgYWN0aXZpdHkgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJYWRkX3dhaXRfcXVldWUoc2tfc2xlZXAoc29jay0+c2spLCAmd2FpdCk7CiAJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKHNrX3NsZWVwKHNvY2stPnNrKSwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCQlyYyA9IHNvY2stPm9wcy0+YWNjZXB0KHNvY2ssIG5ld3NvY2ssIE9fTk9OQkxPQ0spOwogCX0KIAotCXJlbW92ZV93YWl0X3F1ZXVlKHNrX3NsZWVwKHNvY2stPnNrKSwgJndhaXQpOwotCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KIAlpZiAocmMgIT0gMCkKIAkJZ290byBmYWlsZWQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy9tb2R1bGUuYwppbmRleCA3ZGM3N2RkLi5mMGVlNzZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL21vZHVsZS5jCkBAIC0zMywxNSArMzMsODIgQEAKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEx1c3RyZSwgaHR0cDovL3d3dy5sdXN0cmUub3JnLwogICogTHVzdHJlIGlzIGEgdHJhZGVtYXJrIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4KICAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KIAotI2RlZmluZSBERUJVR19TVUJTWVNURU0gU19MTkVUCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorCisjIGRlZmluZSBERUJVR19TVUJTWVNURU0gU19MTkVUCiAKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xpYmNmcy9saWJjZnMuaCIKKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKwogI2luY2x1ZGUgIi4uLy4uL2luY2x1ZGUvbGludXgvbGliY2ZzL2xpYmNmc19jcnlwdG8uaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xuZXQvbGliLWxuZXQuaCIKICNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L2xuZXQvbG5ldC5oIgogI2luY2x1ZGUgInRyYWNlZmlsZS5oIgogCitNT0RVTEVfQVVUSE9SKCJQZXRlciBKLiBCcmFhbSA8YnJhYW1AY2x1c3RlcmZzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUG9ydGFscyB2My4xIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2V4dGVybiBzdHJ1Y3QgbWlzY2RldmljZSBsaWJjZnNfZGV2OworZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgY2ZzX3RyYWNlZmlsZV9zZW07CitleHRlcm4gc3RydWN0IG11dGV4IGNmc190cmFjZV90aHJlYWRfbXV0ZXg7CitleHRlcm4gc3RydWN0IGNmc193aV9zY2hlZCAqY2ZzX3NjaGVkX3JlaGFzaDsKK2V4dGVybiB2b2lkIGxpYmNmc19pbml0X25pZHN0cmluZ3Modm9pZCk7CisKK3N0YXRpYyBpbnQgaW5zZXJ0X3Byb2Modm9pZCk7CitzdGF0aWMgdm9pZCByZW1vdmVfcHJvYyh2b2lkKTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpsbmV0X3RhYmxlX2hlYWRlcjsKK2V4dGVybiBjaGFyIGxuZXRfdXBjYWxsWzEwMjRdOworLyoqCisgKiBUaGUgcGF0aCBvZiBkZWJ1ZyBsb2cgZHVtcCB1cGNhbGwgc2NyaXB0LgorICovCitleHRlcm4gY2hhciBsbmV0X2RlYnVnX2xvZ191cGNhbGxbMTAyNF07CisKKyNkZWZpbmUgQ1RMX0xORVQJKDB4MTAwKQorCitlbnVtIHsKKwlQU0RFVl9ERUJVRyA9IDEsCSAgLyogY29udHJvbCBkZWJ1Z2dpbmcgKi8KKwlQU0RFVl9TVUJTWVNURU1fREVCVUcsICAgIC8qIGNvbnRyb2wgZGVidWdnaW5nICovCisJUFNERVZfUFJJTlRLLAkgICAgIC8qIGZvcmNlIGFsbCBtZXNzYWdlcyB0byBjb25zb2xlICovCisJUFNERVZfQ09OU09MRV9SQVRFTElNSVQsICAvKiByYXRlbGltaXQgY29uc29sZSBtZXNzYWdlcyAqLworCVBTREVWX0NPTlNPTEVfTUFYX0RFTEFZX0NTLCAvKiBtYXhpbXVtIGRlbGF5IG92ZXIgd2hpY2ggd2Ugc2tpcCBtZXNzYWdlcyAqLworCVBTREVWX0NPTlNPTEVfTUlOX0RFTEFZX0NTLCAvKiBpbml0aWFsIGRlbGF5IG92ZXIgd2hpY2ggd2Ugc2tpcCBtZXNzYWdlcyAqLworCVBTREVWX0NPTlNPTEVfQkFDS09GRiwgICAgLyogZGVsYXkgaW5jcmVhc2UgZmFjdG9yICovCisJUFNERVZfREVCVUdfUEFUSCwJIC8qIGNyYXNoZHVtcCBsb2cgbG9jYXRpb24gKi8KKwlQU0RFVl9ERUJVR19EVU1QX1BBVEgsICAgIC8qIGNyYXNoZHVtcCB0cmFjZWxvZyBsb2NhdGlvbiAqLworCVBTREVWX0NQVF9UQUJMRSwJICAvKiBpbmZvcm1hdGlvbiBhYm91dCBjcHUgcGFydGl0aW9ucyAqLworCVBTREVWX0xORVRfVVBDQUxMLAkvKiBVc2VyIG1vZGUgdXBjYWxsIHNjcmlwdCAgKi8KKwlQU0RFVl9MTkVUX01FTVVTRUQsICAgICAgIC8qIGJ5dGVzIGN1cnJlbnRseSBQT1JUQUxfQUxMT0NhdGVkICovCisJUFNERVZfTE5FVF9DQVRBU1RST1BIRSwgICAvKiBpZiB3ZSBoYXZlIExCVUdnZWQgb3IgcGFuaWMnZCAqLworCVBTREVWX0xORVRfUEFOSUNfT05fTEJVRywgLyogZmxhZyB0byBwYW5pYyBvbiBMQlVHICovCisJUFNERVZfTE5FVF9EVU1QX0tFUk5FTCwgICAvKiBzbmFwc2hvdCBrZXJuZWwgZGVidWcgYnVmZmVyIHRvIGZpbGUgKi8KKwlQU0RFVl9MTkVUX0RBRU1PTl9GSUxFLCAgIC8qIHNwb29sIGtlcm5lbCBkZWJ1ZyBidWZmZXIgdG8gZmlsZSAqLworCVBTREVWX0xORVRfREVCVUdfTUIsICAgICAgLyogc2l6ZSBvZiBkZWJ1ZyBidWZmZXIgKi8KKwlQU0RFVl9MTkVUX0RFQlVHX0xPR19VUENBTEwsIC8qIGRlYnVnIGxvZyB1cGNhbGwgc2NyaXB0ICovCisJUFNERVZfTE5FVF9XQVRDSERPR19SQVRFTElNSVQsICAvKiByYXRlbGltaXQgd2F0Y2hkb2cgbWVzc2FnZXMgICovCisJUFNERVZfTE5FVF9GT1JDRV9MQlVHLCAgICAvKiBob29rIHRvIGZvcmNlIGFuIExCVUcgKi8KKwlQU0RFVl9MTkVUX0ZBSUxfTE9DLCAgICAgIC8qIGNvbnRyb2wgdGVzdCBmYWlsdXJlcyBpbnN0cnVtZW50YXRpb24gKi8KKwlQU0RFVl9MTkVUX0ZBSUxfVkFMLCAgICAgIC8qIHVzZXJkYXRhIGZvciBmYWlsIGxvYyAqLworfTsKKwogc3RhdGljIHZvaWQga3BvcnRhbF9tZW1ob2dfZnJlZSAoc3RydWN0IGxpYmNmc19kZXZpY2VfdXNlcnN0YXRlICpsZHUpCiB7CiAJc3RydWN0IHBhZ2UgKipsZXZlbDBwID0gJmxkdS0+bGR1X21lbWhvZ19yb290X3BhZ2U7CkBAIC0zMjAsMTkgKzM4Nyw2IEBACiAJbGliY2ZzX2lvY3RsCiB9OwogCi1leHRlcm4gaW50IGluc2VydF9wcm9jKHZvaWQpOwotZXh0ZXJuIHZvaWQgcmVtb3ZlX3Byb2Modm9pZCk7Ci1NT0RVTEVfQVVUSE9SKCJQZXRlciBKLiBCcmFhbSA8YnJhYW1AY2x1c3RlcmZzLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiUG9ydGFscyB2My4xIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLWV4dGVybiBzdHJ1Y3QgbWlzY2RldmljZSBsaWJjZnNfZGV2OwotZXh0ZXJuIHN0cnVjdCByd19zZW1hcGhvcmUgY2ZzX3RyYWNlZmlsZV9zZW07Ci1leHRlcm4gc3RydWN0IG11dGV4IGNmc190cmFjZV90aHJlYWRfbXV0ZXg7Ci1leHRlcm4gc3RydWN0IGNmc193aV9zY2hlZCAqY2ZzX3NjaGVkX3JlaGFzaDsKLQotZXh0ZXJuIHZvaWQgbGliY2ZzX2luaXRfbmlkc3RyaW5ncyh2b2lkKTsKLQogc3RhdGljIGludCBpbml0X2xpYmNmc19tb2R1bGUodm9pZCkKIHsKIAlpbnQgcmM7CkBAIC0zNDcsNyArNDAxLDcgQEAKIAogCXJjID0gbGliY2ZzX2RlYnVnX2luaXQoNSAqIDEwMjQgKiAxMDI0KTsKIAlpZiAocmMgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTHVzdHJlRXJyb3I6IGxpYmNmc19kZWJ1Z19pbml0OiAlZFxuIiwgcmMpOworCQlwcl9lcnIoIkx1c3RyZUVycm9yOiBsaWJjZnNfZGVidWdfaW5pdDogJWRcbiIsIHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KIApAQCAtNDMzLDEyICs0ODcsNDkwIEBACiAKIAlyYyA9IGxpYmNmc19kZWJ1Z19jbGVhbnVwKCk7CiAJaWYgKHJjKQotCQlwcmludGsoS0VSTl9FUlIgIkx1c3RyZUVycm9yOiBsaWJjZnNfZGVidWdfY2xlYW51cDogJWRcbiIsCi0JCSAgICAgICByYyk7CisJCXByX2VycigiTHVzdHJlRXJyb3I6IGxpYmNmc19kZWJ1Z19jbGVhbnVwOiAlZFxuIiwgcmMpOwogCiAJbGliY2ZzX2FyY2hfY2xlYW51cCgpOwogfQogCitzdGF0aWMgaW50IHByb2NfY2FsbF9oYW5kbGVyKHZvaWQgKmRhdGEsIGludCB3cml0ZSwgbG9mZl90ICpwcG9zLAorCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCisJCWludCAoKmhhbmRsZXIpKHZvaWQgKmRhdGEsIGludCB3cml0ZSwKKwkJbG9mZl90IHBvcywgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgaW50IGxlbikpCit7CisJaW50IHJjID0gaGFuZGxlcihkYXRhLCB3cml0ZSwgKnBwb3MsIGJ1ZmZlciwgKmxlbnApOworCisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKHdyaXRlKSB7CisJCSpwcG9zICs9ICpsZW5wOworCX0gZWxzZSB7CisJCSpsZW5wID0gcmM7CisJCSpwcG9zICs9IHJjOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX3Byb2NfZG9iaXRtYXNrcyh2b2lkICpkYXRhLCBpbnQgd3JpdGUsCisJCQkgICAgIGxvZmZfdCBwb3MsIHZvaWQgX191c2VyICpidWZmZXIsIGludCBub2IpCit7CisJY29uc3QgaW50ICAgICB0bXBzdHJsZW4gPSA1MTI7CisJY2hhcgkgKnRtcHN0cjsKKwlpbnQJICAgcmM7CisJdW5zaWduZWQgaW50ICptYXNrID0gZGF0YTsKKwlpbnQJICAgaXNfc3Vic3lzID0gKG1hc2sgPT0gJmxpYmNmc19zdWJzeXN0ZW1fZGVidWcpID8gMSA6IDA7CisJaW50CSAgIGlzX3ByaW50ayA9IChtYXNrID09ICZsaWJjZnNfcHJpbnRrKSA/IDEgOiAwOworCisJcmMgPSBjZnNfdHJhY2VfYWxsb2NhdGVfc3RyaW5nX2J1ZmZlcigmdG1wc3RyLCB0bXBzdHJsZW4pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCWlmICghd3JpdGUpIHsKKwkJbGliY2ZzX2RlYnVnX21hc2syc3RyKHRtcHN0ciwgdG1wc3RybGVuLCAqbWFzaywgaXNfc3Vic3lzKTsKKwkJcmMgPSBzdHJsZW4odG1wc3RyKTsKKworCQlpZiAocG9zID49IHJjKSB7CisJCQlyYyA9IDA7CisJCX0gZWxzZSB7CisJCQlyYyA9IGNmc190cmFjZV9jb3B5b3V0X3N0cmluZyhidWZmZXIsIG5vYiwKKwkJCQkJCSAgICAgIHRtcHN0ciArIHBvcywgIlxuIik7CisJCX0KKwl9IGVsc2UgeworCQlyYyA9IGNmc190cmFjZV9jb3B5aW5fc3RyaW5nKHRtcHN0ciwgdG1wc3RybGVuLCBidWZmZXIsIG5vYik7CisJCWlmIChyYyA8IDApIHsKKwkJCWNmc190cmFjZV9mcmVlX3N0cmluZ19idWZmZXIodG1wc3RyLCB0bXBzdHJsZW4pOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJcmMgPSBsaWJjZnNfZGVidWdfc3RyMm1hc2sobWFzaywgdG1wc3RyLCBpc19zdWJzeXMpOworCQkvKiBBbHdheXMgcHJpbnQgTEJVRy9MQVNTRVJUIHRvIGNvbnNvbGUsIHNvIGtlZXAgdGhpcyBtYXNrICovCisJCWlmIChpc19wcmludGspCisJCQkqbWFzayB8PSBEX0VNRVJHOworCX0KKworCWNmc190cmFjZV9mcmVlX3N0cmluZ19idWZmZXIodG1wc3RyLCB0bXBzdHJsZW4pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwcm9jX2RvYml0bWFza3Moc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiBwcm9jX2NhbGxfaGFuZGxlcih0YWJsZS0+ZGF0YSwgd3JpdGUsIHBwb3MsIGJ1ZmZlciwgbGVucCwKKwkJCQkgX19wcm9jX2RvYml0bWFza3MpOworfQorCitzdGF0aWMgaW50IG1pbl93YXRjaGRvZ19yYXRlbGltaXQ7CSAgLyogZGlzYWJsZSByYXRlbGltaXRpbmcgKi8KK3N0YXRpYyBpbnQgbWF4X3dhdGNoZG9nX3JhdGVsaW1pdCA9ICgyNCo2MCo2MCk7IC8qIGxpbWl0IHRvIG9uY2UgcGVyIGRheSAqLworCitzdGF0aWMgaW50IF9fcHJvY19kdW1wX2tlcm5lbCh2b2lkICpkYXRhLCBpbnQgd3JpdGUsCisJCQkgICAgICBsb2ZmX3QgcG9zLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbm9iKQoreworCWlmICghd3JpdGUpCisJCXJldHVybiAwOworCisJcmV0dXJuIGNmc190cmFjZV9kdW1wX2RlYnVnX2J1ZmZlcl91c3JzdHIoYnVmZmVyLCBub2IpOworfQorCitzdGF0aWMgaW50IHByb2NfZHVtcF9rZXJuZWwoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCSAgICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gcHJvY19jYWxsX2hhbmRsZXIodGFibGUtPmRhdGEsIHdyaXRlLCBwcG9zLCBidWZmZXIsIGxlbnAsCisJCQkJIF9fcHJvY19kdW1wX2tlcm5lbCk7Cit9CisKK3N0YXRpYyBpbnQgX19wcm9jX2RhZW1vbl9maWxlKHZvaWQgKmRhdGEsIGludCB3cml0ZSwKKwkJCSAgICAgIGxvZmZfdCBwb3MsIHZvaWQgX191c2VyICpidWZmZXIsIGludCBub2IpCit7CisJaWYgKCF3cml0ZSkgeworCQlpbnQgbGVuID0gc3RybGVuKGNmc190cmFjZWZpbGUpOworCisJCWlmIChwb3MgPj0gbGVuKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIGNmc190cmFjZV9jb3B5b3V0X3N0cmluZyhidWZmZXIsIG5vYiwKKwkJCQkJCWNmc190cmFjZWZpbGUgKyBwb3MsICJcbiIpOworCX0KKworCXJldHVybiBjZnNfdHJhY2VfZGFlbW9uX2NvbW1hbmRfdXNyc3RyKGJ1ZmZlciwgbm9iKTsKK30KKworc3RhdGljIGludCBwcm9jX2RhZW1vbl9maWxlKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQkgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIHByb2NfY2FsbF9oYW5kbGVyKHRhYmxlLT5kYXRhLCB3cml0ZSwgcHBvcywgYnVmZmVyLCBsZW5wLAorCQkJCSBfX3Byb2NfZGFlbW9uX2ZpbGUpOworfQorCitzdGF0aWMgaW50IF9fcHJvY19kZWJ1Z19tYih2b2lkICpkYXRhLCBpbnQgd3JpdGUsCisJCQkgICBsb2ZmX3QgcG9zLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbm9iKQoreworCWlmICghd3JpdGUpIHsKKwkJY2hhciB0bXBzdHJbMzJdOworCQlpbnQgIGxlbiA9IHNucHJpbnRmKHRtcHN0ciwgc2l6ZW9mKHRtcHN0ciksICIlZCIsCisJCQkJICAgIGNmc190cmFjZV9nZXRfZGVidWdfbWIoKSk7CisKKwkJaWYgKHBvcyA+PSBsZW4pCisJCQlyZXR1cm4gMDsKKworCQlyZXR1cm4gY2ZzX3RyYWNlX2NvcHlvdXRfc3RyaW5nKGJ1ZmZlciwgbm9iLCB0bXBzdHIgKyBwb3MsCisJCSAgICAgICAiXG4iKTsKKwl9CisKKwlyZXR1cm4gY2ZzX3RyYWNlX3NldF9kZWJ1Z19tYl91c3JzdHIoYnVmZmVyLCBub2IpOworfQorCitzdGF0aWMgaW50IHByb2NfZGVidWdfbWIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gcHJvY19jYWxsX2hhbmRsZXIodGFibGUtPmRhdGEsIHdyaXRlLCBwcG9zLCBidWZmZXIsIGxlbnAsCisJCQkJIF9fcHJvY19kZWJ1Z19tYik7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19jb25zb2xlX21heF9kZWxheV9jcyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQkJCSAgICAgbG9mZl90ICpwcG9zKQoreworCWludCByYywgbWF4X2RlbGF5X2NzOworCXN0cnVjdCBjdGxfdGFibGUgZHVtbXkgPSAqdGFibGU7CisJbG9uZyBkOworCisJZHVtbXkuZGF0YSA9ICZtYXhfZGVsYXlfY3M7CisJZHVtbXkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWM7CisKKwlpZiAoIXdyaXRlKSB7IC8qIHJlYWQgKi8KKwkJbWF4X2RlbGF5X2NzID0gY2ZzX2R1cmF0aW9uX3NlYyhsaWJjZnNfY29uc29sZV9tYXhfZGVsYXkgKiAxMDApOworCQlyYyA9IHByb2NfZG9pbnR2ZWMoJmR1bW15LCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIHdyaXRlICovCisJbWF4X2RlbGF5X2NzID0gMDsKKwlyYyA9IHByb2NfZG9pbnR2ZWMoJmR1bW15LCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisJaWYgKG1heF9kZWxheV9jcyA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWQgPSBjZnNfdGltZV9zZWNvbmRzKG1heF9kZWxheV9jcykgLyAxMDA7CisJaWYgKGQgPT0gMCB8fCBkIDwgbGliY2ZzX2NvbnNvbGVfbWluX2RlbGF5KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsaWJjZnNfY29uc29sZV9tYXhfZGVsYXkgPSBkOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHByb2NfY29uc29sZV9taW5fZGVsYXlfY3Moc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCQkgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJCQkgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmMsIG1pbl9kZWxheV9jczsKKwlzdHJ1Y3QgY3RsX3RhYmxlIGR1bW15ID0gKnRhYmxlOworCWxvbmcgZDsKKworCWR1bW15LmRhdGEgPSAmbWluX2RlbGF5X2NzOworCWR1bW15LnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjOworCisJaWYgKCF3cml0ZSkgeyAvKiByZWFkICovCisJCW1pbl9kZWxheV9jcyA9IGNmc19kdXJhdGlvbl9zZWMobGliY2ZzX2NvbnNvbGVfbWluX2RlbGF5ICogMTAwKTsKKwkJcmMgPSBwcm9jX2RvaW50dmVjKCZkdW1teSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiB3cml0ZSAqLworCW1pbl9kZWxheV9jcyA9IDA7CisJcmMgPSBwcm9jX2RvaW50dmVjKCZkdW1teSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCWlmIChtaW5fZGVsYXlfY3MgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkID0gY2ZzX3RpbWVfc2Vjb25kcyhtaW5fZGVsYXlfY3MpIC8gMTAwOworCWlmIChkID09IDAgfHwgZCA+IGxpYmNmc19jb25zb2xlX21heF9kZWxheSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbGliY2ZzX2NvbnNvbGVfbWluX2RlbGF5ID0gZDsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwcm9jX2NvbnNvbGVfYmFja29mZihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCByYywgYmFja29mZjsKKwlzdHJ1Y3QgY3RsX3RhYmxlIGR1bW15ID0gKnRhYmxlOworCisJZHVtbXkuZGF0YSA9ICZiYWNrb2ZmOworCWR1bW15LnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjOworCisJaWYgKCF3cml0ZSkgeyAvKiByZWFkICovCisJCWJhY2tvZmYgPSBsaWJjZnNfY29uc29sZV9iYWNrb2ZmOworCQlyYyA9IHByb2NfZG9pbnR2ZWMoJmR1bW15LCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIHdyaXRlICovCisJYmFja29mZiA9IDA7CisJcmMgPSBwcm9jX2RvaW50dmVjKCZkdW1teSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCWlmIChiYWNrb2ZmIDw9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJbGliY2ZzX2NvbnNvbGVfYmFja29mZiA9IGJhY2tvZmY7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbGliY2ZzX2ZvcmNlX2xidWcoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKHdyaXRlKQorCQlMQlVHKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY19mYWlsX2xvYyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkJIHZvaWQgX191c2VyICpidWZmZXIsCisJCQkgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJjOworCWxvbmcgb2xkX2ZhaWxfbG9jID0gY2ZzX2ZhaWxfbG9jOworCisJcmMgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAob2xkX2ZhaWxfbG9jICE9IGNmc19mYWlsX2xvYykKKwkJd2FrZV91cCgmY2ZzX3JhY2Vfd2FpdHEpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBfX3Byb2NfY3B0X3RhYmxlKHZvaWQgKmRhdGEsIGludCB3cml0ZSwKKwkJCSAgICBsb2ZmX3QgcG9zLCB2b2lkIF9fdXNlciAqYnVmZmVyLCBpbnQgbm9iKQoreworCWNoYXIgKmJ1ZiA9IE5VTEw7CisJaW50ICAgbGVuID0gNDA5NjsKKwlpbnQgICByYyAgPSAwOworCisJaWYgKHdyaXRlKQorCQlyZXR1cm4gLUVQRVJNOworCisJTEFTU0VSVChjZnNfY3B0X3RhYmxlICE9IE5VTEwpOworCisJd2hpbGUgKDEpIHsKKwkJTElCQ0ZTX0FMTE9DKGJ1ZiwgbGVuKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJcmMgPSBjZnNfY3B0X3RhYmxlX3ByaW50KGNmc19jcHRfdGFibGUsIGJ1ZiwgbGVuKTsKKwkJaWYgKHJjID49IDApCisJCQlicmVhazsKKworCQlpZiAocmMgPT0gLUVGQklHKSB7CisJCQlMSUJDRlNfRlJFRShidWYsIGxlbik7CisJCQlsZW4gPDw9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocG9zID49IHJjKSB7CisJCXJjID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJcmMgPSBjZnNfdHJhY2VfY29weW91dF9zdHJpbmcoYnVmZmVyLCBub2IsIGJ1ZiArIHBvcywgTlVMTCk7Cisgb3V0OgorCWlmIChidWYgIT0gTlVMTCkKKwkJTElCQ0ZTX0ZSRUUoYnVmLCBsZW4pOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwcm9jX2NwdF90YWJsZShzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkJICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIHByb2NfY2FsbF9oYW5kbGVyKHRhYmxlLT5kYXRhLCB3cml0ZSwgcHBvcywgYnVmZmVyLCBsZW5wLAorCQkJCSBfX3Byb2NfY3B0X3RhYmxlKTsKK30KKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgbG5ldF90YWJsZVtdID0geworCS8qCisJICogTkIgTm8gLnN0cmF0ZWd5IGVudHJpZXMgaGF2ZSBiZWVuIHByb3ZpZGVkIHNpbmNlIHN5c2N0bCg4KSBwcmVmZXJzCisJICogdG8gZ28gdmlhIC9wcm9jIGZvciBwb3J0YWJpbGl0eS4KKwkgKi8KKwl7CisJCS5wcm9jbmFtZSA9ICJkZWJ1ZyIsCisJCS5kYXRhICAgICA9ICZsaWJjZnNfZGVidWcsCisJCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAorCQkubW9kZSAgICAgPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9iaXRtYXNrcywKKwl9LAorCXsKKwkJLnByb2NuYW1lID0gInN1YnN5c3RlbV9kZWJ1ZyIsCisJCS5kYXRhICAgICA9ICZsaWJjZnNfc3Vic3lzdGVtX2RlYnVnLAorCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvYml0bWFza3MsCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJwcmludGsiLAorCQkuZGF0YSAgICAgPSAmbGliY2ZzX3ByaW50aywKKwkJLm1heGxlbiAgID0gc2l6ZW9mKGludCksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb2JpdG1hc2tzLAorCX0sCisJeworCQkucHJvY25hbWUgPSAiY29uc29sZV9yYXRlbGltaXQiLAorCQkuZGF0YSAgICAgPSAmbGliY2ZzX2NvbnNvbGVfcmF0ZWxpbWl0LAorCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJjb25zb2xlX21heF9kZWxheV9jZW50aXNlY3MiLAorCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2NvbnNvbGVfbWF4X2RlbGF5X2NzCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJjb25zb2xlX21pbl9kZWxheV9jZW50aXNlY3MiLAorCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2NvbnNvbGVfbWluX2RlbGF5X2NzCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJjb25zb2xlX2JhY2tvZmYiLAorCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2NvbnNvbGVfYmFja29mZgorCX0sCisKKwl7CisJCS5wcm9jbmFtZSA9ICJkZWJ1Z19wYXRoIiwKKwkJLmRhdGEgICAgID0gbGliY2ZzX2RlYnVnX2ZpbGVfcGF0aF9hcnIsCisJCS5tYXhsZW4gICA9IHNpemVvZihsaWJjZnNfZGVidWdfZmlsZV9wYXRoX2FyciksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb3N0cmluZywKKwl9LAorCisJeworCQkucHJvY25hbWUgPSAiY3B1X3BhcnRpdGlvbl90YWJsZSIsCisJCS5tYXhsZW4gICA9IDEyOCwKKwkJLm1vZGUgICAgID0gMDQ0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2NwdF90YWJsZSwKKwl9LAorCisJeworCQkucHJvY25hbWUgPSAidXBjYWxsIiwKKwkJLmRhdGEgICAgID0gbG5ldF91cGNhbGwsCisJCS5tYXhsZW4gICA9IHNpemVvZihsbmV0X3VwY2FsbCksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kb3N0cmluZywKKwl9LAorCXsKKwkJLnByb2NuYW1lID0gImRlYnVnX2xvZ191cGNhbGwiLAorCQkuZGF0YSAgICAgPSBsbmV0X2RlYnVnX2xvZ191cGNhbGwsCisJCS5tYXhsZW4gICA9IHNpemVvZihsbmV0X2RlYnVnX2xvZ191cGNhbGwpLAorCQkubW9kZSAgICAgPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9zdHJpbmcsCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJsbmV0X21lbXVzZWQiLAorCQkuZGF0YSAgICAgPSAoaW50ICopJmxpYmNmc19rbWVtb3J5LmNvdW50ZXIsCisJCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAorCQkubW9kZSAgICAgPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJjYXRhc3Ryb3BoZSIsCisJCS5kYXRhICAgICA9ICZsaWJjZnNfY2F0YXN0cm9waGUsCisJCS5tYXhsZW4gICA9IHNpemVvZihpbnQpLAorCQkubW9kZSAgICAgPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJwYW5pY19vbl9sYnVnIiwKKwkJLmRhdGEgICAgID0gJmxpYmNmc19wYW5pY19vbl9sYnVnLAorCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkucHJvY25hbWUgPSAiZHVtcF9rZXJuZWwiLAorCQkubWF4bGVuICAgPSAyNTYsCisJCS5tb2RlICAgICA9IDAyMDAsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kdW1wX2tlcm5lbCwKKwl9LAorCXsKKwkJLnByb2NuYW1lID0gImRhZW1vbl9maWxlIiwKKwkJLm1vZGUgICAgID0gMDY0NCwKKwkJLm1heGxlbiAgID0gMjU2LAorCQkucHJvY19oYW5kbGVyID0gJnByb2NfZGFlbW9uX2ZpbGUsCisJfSwKKwl7CisJCS5wcm9jbmFtZSA9ICJkZWJ1Z19tYiIsCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19kZWJ1Z19tYiwKKwl9LAorCXsKKwkJLnByb2NuYW1lID0gIndhdGNoZG9nX3JhdGVsaW1pdCIsCisJCS5kYXRhICAgICA9ICZsaWJjZnNfd2F0Y2hkb2dfcmF0ZWxpbWl0LAorCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjX21pbm1heCwKKwkJLmV4dHJhMSAgID0gJm1pbl93YXRjaGRvZ19yYXRlbGltaXQsCisJCS5leHRyYTIgICA9ICZtYXhfd2F0Y2hkb2dfcmF0ZWxpbWl0LAorCX0sCisJeworCQkucHJvY25hbWUgPSAiZm9yY2VfbGJ1ZyIsCisJCS5kYXRhICAgICA9IE5VTEwsCisJCS5tYXhsZW4gICA9IDAsCisJCS5tb2RlICAgICA9IDAyMDAsCisJCS5wcm9jX2hhbmRsZXIgPSAmbGliY2ZzX2ZvcmNlX2xidWcKKwl9LAorCXsKKwkJLnByb2NuYW1lID0gImZhaWxfbG9jIiwKKwkJLmRhdGEgICAgID0gJmNmc19mYWlsX2xvYywKKwkJLm1heGxlbiAgID0gc2l6ZW9mKGNmc19mYWlsX2xvYyksCisJCS5tb2RlICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgPSAmcHJvY19mYWlsX2xvYworCX0sCisJeworCQkucHJvY25hbWUgPSAiZmFpbF92YWwiLAorCQkuZGF0YSAgICAgPSAmY2ZzX2ZhaWxfdmFsLAorCQkubWF4bGVuICAgPSBzaXplb2YoaW50KSwKKwkJLm1vZGUgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciA9ICZwcm9jX2RvaW50dmVjCisJfSwKKwl7CisJfQorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgdG9wX3RhYmxlW10gPSB7CisJeworCQkucHJvY25hbWUgPSAibG5ldCIsCisJCS5tb2RlICAgICA9IDA1NTUsCisJCS5kYXRhICAgICA9IE5VTEwsCisJCS5tYXhsZW4gICA9IDAsCisJCS5jaGlsZCAgICA9IGxuZXRfdGFibGUsCisJfSwKKwl7CisJfQorfTsKKworc3RhdGljIGludCBpbnNlcnRfcHJvYyh2b2lkKQoreworCWlmIChsbmV0X3RhYmxlX2hlYWRlciA9PSBOVUxMKQorCQlsbmV0X3RhYmxlX2hlYWRlciA9IHJlZ2lzdGVyX3N5c2N0bF90YWJsZSh0b3BfdGFibGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfcHJvYyh2b2lkKQoreworCWlmIChsbmV0X3RhYmxlX2hlYWRlciAhPSBOVUxMKQorCQl1bnJlZ2lzdGVyX3N5c2N0bF90YWJsZShsbmV0X3RhYmxlX2hlYWRlcik7CisKKwlsbmV0X3RhYmxlX2hlYWRlciA9IE5VTEw7Cit9CisKIE1PRFVMRV9WRVJTSU9OKCIxLjAuMCIpOworCiBtb2R1bGVfaW5pdChpbml0X2xpYmNmc19tb2R1bGUpOwogbW9kdWxlX2V4aXQoZXhpdF9saWJjZnNfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy90cmFjZWZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy90cmFjZWZpbGUuYwppbmRleCBlYjY1YjUwLi5jODYzOTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9saWJjZnMvdHJhY2VmaWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3RyYWNlZmlsZS5jCkBAIC01Myw3ICs1Myw3IEBACiBsb25nIGxvbmcgY2ZzX3RyYWNlZmlsZV9zaXplID0gQ0ZTX1RSQUNFRklMRV9TSVpFOwogc3RhdGljIHN0cnVjdCB0cmFjZWZpbGVkX2N0bCB0cmFjZV90Y3RsOwogc3RydWN0IG11dGV4IGNmc190cmFjZV90aHJlYWRfbXV0ZXg7Ci1zdGF0aWMgaW50IHRocmVhZF9ydW5uaW5nID0gMDsKK3N0YXRpYyBpbnQgdGhyZWFkX3J1bm5pbmc7CiAKIHN0YXRpYyBhdG9taWNfdCBjZnNfdGFnZV9hbGxvY2F0ZWQgPSBBVE9NSUNfSU5JVCgwKTsKIApAQCAtMjI0LDggKzIyNCw3IEBACiAJICovCiAKIAlpZiAobGVuID4gUEFHRV9DQUNIRV9TSVpFKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgImNvd2FyZGx5IHJlZnVzaW5nIHRvIHdyaXRlICVsdSBieXRlcyBpbiBhIHBhZ2VcbiIsIGxlbik7CisJCXByX2VycigiY293YXJkbHkgcmVmdXNpbmcgdG8gd3JpdGUgJWx1IGJ5dGVzIGluIGEgcGFnZVxuIiwgbGVuKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC02ODgsOCArNjg3LDggQEAKIAlpZiAoSVNfRVJSKGZpbHApKSB7CiAJCXJjID0gUFRSX0VSUihmaWxwKTsKIAkJZmlscCA9IE5VTEw7Ci0JCXByaW50ayhLRVJOX0VSUiAiTHVzdHJlRXJyb3I6IGNhbid0IG9wZW4gJXMgZm9yIGR1bXA6IHJjICVkXG4iLAotCQkgICAgICBmaWxlbmFtZSwgcmMpOworCQlwcl9lcnIoIkx1c3RyZUVycm9yOiBjYW4ndCBvcGVuICVzIGZvciBkdW1wOiByYyAlZFxuIiwKKwkJCWZpbGVuYW1lLCByYyk7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtNzI2LDcgKzcyNSw3IEBACiAJTU1TUEFDRV9DTE9TRTsKIAlyYyA9IHZmc19mc3luYyhmaWxwLCAxKTsKIAlpZiAocmMpCi0JCXByaW50ayhLRVJOX0VSUiAic3luYyByZXR1cm5zICVkXG4iLCByYyk7CisJCXByX2Vycigic3luYyByZXR1cm5zICVkXG4iLCByYyk7CiBjbG9zZToKIAlmaWxwX2Nsb3NlKGZpbHAsIE5VTEwpOwogb3V0OgpAQCAtMTA0OCwyMiArMTA0NywyMSBAQAogCQkJaW50IGk7CiAKIAkJCXByaW50ayhLRVJOX0FMRVJUICJMdXN0cmU6IHRyYWNlIHBhZ2VzIGFyZW4ndCBlbXB0eVxuIik7Ci0JCQlwcmludGsoS0VSTl9FUlIgInRvdGFsIGNwdXMoJWQpOiAiLAotCQkJICAgICAgIG51bV9wb3NzaWJsZV9jcHVzKCkpOworCQkJcHJfZXJyKCJ0b3RhbCBjcHVzKCVkKTogIiwKKwkJCQludW1fcG9zc2libGVfY3B1cygpKTsKIAkJCWZvciAoaSA9IDA7IGkgPCBudW1fcG9zc2libGVfY3B1cygpOyBpKyspCiAJCQkJaWYgKGNwdV9vbmxpbmUoaSkpCi0JCQkJCXByaW50ayhLRVJOX0VSUiAiJWQob24pICIsIGkpOworCQkJCQlwcl9jb250KCIlZChvbikgIiwgaSk7CiAJCQkJZWxzZQotCQkJCQlwcmludGsoS0VSTl9FUlIgIiVkKG9mZikgIiwgaSk7Ci0JCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CisJCQkJCXByX2NvbnQoIiVkKG9mZikgIiwgaSk7CisJCQlwcl9jb250KCJcbiIpOwogCiAJCQlpID0gMDsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YWdlLCB0bXAsICZwYy5wY19wYWdlcywKIAkJCQkJCSAgICAgbGlua2FnZSkKLQkJCQlwcmludGsoS0VSTl9FUlIgInBhZ2UgJWQgYmVsb25ncyB0byBjcHUgJWRcbiIsCi0JCQkJICAgICAgICsraSwgdGFnZS0+Y3B1KTsKLQkJCXByaW50ayhLRVJOX0VSUiAiVGhlcmUgYXJlICVkIHBhZ2VzIHVud3JpdHRlblxuIiwKLQkJCSAgICAgICBpKTsKKwkJCQlwcl9lcnIoInBhZ2UgJWQgYmVsb25ncyB0byBjcHUgJWRcbiIsCisJCQkJCSsraSwgdGFnZS0+Y3B1KTsKKwkJCXByX2VycigiVGhlcmUgYXJlICVkIHBhZ2VzIHVud3JpdHRlblxuIiwgaSk7CiAJCX0KIAkJX19MQVNTRVJUKGxpc3RfZW1wdHkoJnBjLnBjX3BhZ2VzKSk7CiBlbmRfbG9vcDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xpYmNmcy93b3JraXRlbS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3dvcmtpdGVtLmMKaW5kZXggYzRhZmFlYS4uNDgwMDliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3dvcmtpdGVtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGliY2ZzL3dvcmtpdGVtLmMKQEAgLTQ0Miw3ICs0NDIsNyBAQAogfQogCiB2b2lkCi1jZnNfd2lfc2h1dGRvd24gKHZvaWQpCitjZnNfd2lfc2h1dGRvd24odm9pZCkKIHsKIAlzdHJ1Y3QgY2ZzX3dpX3NjaGVkCSpzY2hlZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGNhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kY2FjaGUuYwppbmRleCBkZGYxZmE5Li5mZTFmZDA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kY2FjaGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kY2FjaGUuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAJcmMgPSBtZF9maW5kX2NiZGF0YShzYmktPmxsX21kX2V4cCwgbGxfaW5vZGUyZmlkKGlub2RlKSwKIAkJCSAgICByZXR1cm5faWZfZXF1YWwsIE5VTEwpOwogCWlmIChyYyAhPSAwKQotCQkgcmV0dXJuIHJjOworCQlyZXR1cm4gcmM7CiAKIAlsc20gPSBjY2NfaW5vZGVfbHNtX2dldChpbm9kZSk7CiAJaWYgKGxzbSA9PSBOVUxMKQpAQCAtMzM5LDEzICszMzksMTAgQEAKICAqLwogc3RhdGljIGludCBsbF9yZXZhbGlkYXRlX25kKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgdW5zaWduZWQgaW50IGZsYWdzKQogewotCWludCByYzsKLQogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOm5hbWU9JXBkLCBmbGFncz0ldVxuIiwKIAkgICAgICAgZGVudHJ5LCBmbGFncyk7CiAKLQlyYyA9IGxsX3JldmFsaWRhdGVfZGVudHJ5KGRlbnRyeSwgZmxhZ3MpOwotCXJldHVybiByYzsKKwlyZXR1cm4gbGxfcmV2YWxpZGF0ZV9kZW50cnkoZGVudHJ5LCBmbGFncyk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZGlyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kaXIuYwppbmRleCBhMTgyMDE5Li5hNWJjNjk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kaXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9kaXIuYwpAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4gICAvKiBmb3Igd2FpdF9vbl9idWZmZXIgKi8KICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KQEAgLTE1MTgsNiArMTUxOCw3IEBACiAJCQlsdW1wID0gKHN0cnVjdCBsb3ZfdXNlcl9tZCAqKWFyZzsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCBsb3ZfdXNlcl9tZHNfZGF0YSAqbG1kcDsKKwogCQkJbG1kcCA9IChzdHJ1Y3QgbG92X3VzZXJfbWRzX2RhdGEgKilhcmc7CiAJCQlsdW1wID0gJmxtZHAtPmxtZF9sbW07CiAJCX0KQEAgLTE5MDksMjEgKzE5MTAsMjEgQEAKIAogCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlzd2l0Y2ggKG9yaWdpbikgewotCQljYXNlIFNFRUtfU0VUOgotCQkJYnJlYWs7Ci0JCWNhc2UgU0VFS19DVVI6Ci0JCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7Ci0JCQlicmVhazsKLQkJY2FzZSBTRUVLX0VORDoKLQkJCWlmIChvZmZzZXQgPiAwKQotCQkJCWdvdG8gb3V0OwotCQkJaWYgKGFwaTMyKQotCQkJCW9mZnNldCArPSBMTF9ESVJfRU5EX09GRl8zMkJJVDsKLQkJCWVsc2UKLQkJCQlvZmZzZXQgKz0gTExfRElSX0VORF9PRkY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKKwljYXNlIFNFRUtfU0VUOgorCQlicmVhazsKKwljYXNlIFNFRUtfQ1VSOgorCQlvZmZzZXQgKz0gZmlsZS0+Zl9wb3M7CisJCWJyZWFrOworCWNhc2UgU0VFS19FTkQ6CisJCWlmIChvZmZzZXQgPiAwKQogCQkJZ290byBvdXQ7CisJCWlmIChhcGkzMikKKwkJCW9mZnNldCArPSBMTF9ESVJfRU5EX09GRl8zMkJJVDsKKwkJZWxzZQorCQkJb2Zmc2V0ICs9IExMX0RJUl9FTkRfT0ZGOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAob2Zmc2V0ID49IDAgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2ZpbGUuYwppbmRleCA1ZWJlZTZjLi41MjkwNjJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9maWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvZmlsZS5jCkBAIC0xNjEsNyArMTYxLDcgQEAKIAkJb3BfZGF0YS0+b3BfbGVhc2VfaGFuZGxlID0gb2NoLT5vY2hfbGVhc2VfaGFuZGxlOwogCQlvcF9kYXRhLT5vcF9hdHRyLmlhX3ZhbGlkIHw9IEFUVFJfU0laRSB8IEFUVFJfQkxPQ0tTOwogCX0KLQllcG9jaF9jbG9zZSA9IChvcF9kYXRhLT5vcF9mbGFncyAmIE1GX0VQT0NIX0NMT1NFKTsKKwllcG9jaF9jbG9zZSA9IG9wX2RhdGEtPm9wX2ZsYWdzICYgTUZfRVBPQ0hfQ0xPU0U7CiAJcmMgPSBtZF9jbG9zZShtZF9leHAsIG9wX2RhdGEsIG9jaC0+b2NoX21vZCwgJnJlcSk7CiAJaWYgKHJjID09IC1FQUdBSU4pIHsKIAkJLyogVGhpcyBjbG9zZSBtdXN0IGhhdmUgdGhlIGVwb2NoIGNsb3NlZC4gKi8KQEAgLTE5Nyw2ICsxOTcsNyBAQAogCX0KIAlpZiAocmMgPT0gMCAmJiBvcF9kYXRhLT5vcF9iaWFzICYgTURTX0hTTV9SRUxFQVNFKSB7CiAJCXN0cnVjdCBtZHRfYm9keSAqYm9keTsKKwogCQlib2R5ID0gcmVxX2NhcHN1bGVfc2VydmVyX2dldCgmcmVxLT5ycV9waWxsLCAmUk1GX01EVF9CT0RZKTsKIAkJaWYgKCEoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxSRUxFQVNFRCkpCiAJCQlyYyA9IC1FQlVTWTsKQEAgLTI2OSw3ICsyNzAsNyBAQAogCWludCBsb2NrbW9kZTsKIAlfX3U2NCBmbGFncyA9IExETE1fRkxfQkxPQ0tfR1JBTlRFRCB8IExETE1fRkxfVEVTVF9MT0NLOwogCXN0cnVjdCBsdXN0cmVfaGFuZGxlIGxvY2toOwotCWxkbG1fcG9saWN5X2RhdGFfdCBwb2xpY3kgPSB7LmxfaW5vZGViaXRzPXtNRFNfSU5PREVMT0NLX09QRU59fTsKKwlsZGxtX3BvbGljeV9kYXRhX3QgcG9saWN5ID0gey5sX2lub2RlYml0cyA9IHtNRFNfSU5PREVMT0NLX09QRU59fTsKIAlpbnQgcmMgPSAwOwogCiAJLyogY2xlYXIgZ3JvdXAgbG9jaywgaWYgcHJlc2VudCAqLwpAQCAtNjkyLDcgKzY5Myw3IEBACiBvdXRfb2NoX2ZyZWU6CiAJaWYgKHJjKSB7CiAJCWlmIChvY2hfcCAmJiAqb2NoX3ApIHsKLQkJCU9CRF9GUkVFKCpvY2hfcCwgc2l6ZW9mIChzdHJ1Y3Qgb2JkX2NsaWVudF9oYW5kbGUpKTsKKwkJCU9CRF9GUkVFKCpvY2hfcCwgc2l6ZW9mKHN0cnVjdCBvYmRfY2xpZW50X2hhbmRsZSkpOwogCQkJKm9jaF9wID0gTlVMTDsgLyogT0JEX0ZSRUUgd3JpdGVzIHNvbWUgbWFnaWMgdGhlcmUgKi8KIAkJCSgqb2NoX3VzZWNvdW50KS0tOwogCQl9CkBAIC0xNzExLDYgKzE3MTIsMTIgQEAKIAlmbV9rZXkub2Eub19vaSA9IGxzbS0+bHNtX29pOwogCWZtX2tleS5vYS5vX3ZhbGlkID0gT0JEX01EX0ZMSUQgfCBPQkRfTURfRkxHUk9VUDsKIAorCWlmIChpX3NpemVfcmVhZChpbm9kZSkgPT0gMCkgeworCQlyYyA9IGxsX2dsaW1wc2Vfc2l6ZShpbm9kZSk7CisJCWlmIChyYykKKwkJCWdvdG8gb3V0OworCX0KKwogCW9iZG9fZnJvbV9pbm9kZSgmZm1fa2V5Lm9hLCBpbm9kZSwgT0JEX01EX0ZMU0laRSk7CiAJb2Jkb19zZXRfcGFyZW50X2ZpZCgmZm1fa2V5Lm9hLCAmbGxfaTJpbmZvKGlub2RlKS0+bGxpX2ZpZCk7CiAJLyogSWYgZmlsZXNpemUgaXMgMCwgdGhlbiB0aGVyZSB3b3VsZCBiZSBubyBvYmplY3RzIGZvciBtYXBwaW5nICovCkBAIC0yODIxLDcgKzI4MjgsNyBAQAogCWludCBpOwogCiAJaWYgKCFpbm9kZSkKLQkgICAgICAgcmV0dXJuIDA7CisJCXJldHVybiAwOwogCiAJZmlkID0gJmxsX2kyaW5mbyhpbm9kZSktPmxsaV9maWQ7CiAJQ0RFQlVHKERfSU5GTywgInRyeWluZyB0byBtYXRjaCByZXMgIkRGSUQiIG1vZGUgJXNcbiIsIFBGSUQoZmlkKSwKQEAgLTMxMjgsOSArMzEzNSw3IEBACiAKIC8qIC1vIGxvY2FsZmxvY2sgLSBvbmx5IHByb3ZpZGVzIGxvY2FsbHkgY29uc2lzdGVudCBmbG9jayBsb2NrcyAqLwogc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsbF9maWxlX29wZXJhdGlvbnMgPSB7Ci0JLnJlYWQJICAgPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIgPSBsbF9maWxlX3JlYWRfaXRlciwKLQkud3JpdGUJICA9IG5ld19zeW5jX3dyaXRlLAogCS53cml0ZV9pdGVyID0gbGxfZmlsZV93cml0ZV9pdGVyLAogCS51bmxvY2tlZF9pb2N0bCA9IGxsX2ZpbGVfaW9jdGwsCiAJLm9wZW4JICAgPSBsbF9maWxlX29wZW4sCkBAIC0zMTQzLDkgKzMxNDgsNyBAQAogfTsKIAogc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBsbF9maWxlX29wZXJhdGlvbnNfZmxvY2sgPSB7Ci0JLnJlYWQJICAgPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIgICAgPSBsbF9maWxlX3JlYWRfaXRlciwKLQkud3JpdGUJICA9IG5ld19zeW5jX3dyaXRlLAogCS53cml0ZV9pdGVyICAgPSBsbF9maWxlX3dyaXRlX2l0ZXIsCiAJLnVubG9ja2VkX2lvY3RsID0gbGxfZmlsZV9pb2N0bCwKIAkub3BlbgkgICA9IGxsX2ZpbGVfb3BlbiwKQEAgLTMxNjEsOSArMzE2NCw3IEBACiAKIC8qIFRoZXNlIGFyZSBmb3IgLW8gbm9mbG9jayAtIHRvIHJldHVybiBFTk9TWVMgb24gZmxvY2sgY2FsbHMgKi8KIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbGxfZmlsZV9vcGVyYXRpb25zX25vZmxvY2sgPSB7Ci0JLnJlYWQJICAgPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIgICAgPSBsbF9maWxlX3JlYWRfaXRlciwKLQkud3JpdGUJICA9IG5ld19zeW5jX3dyaXRlLAogCS53cml0ZV9pdGVyICAgPSBsbF9maWxlX3dyaXRlX2l0ZXIsCiAJLnVubG9ja2VkX2lvY3RsID0gbGxfZmlsZV9pb2N0bCwKIAkub3BlbgkgICA9IGxsX2ZpbGVfb3BlbiwKQEAgLTMyMzMsNiArMzIzNCw3IEBACiAKIAlyZXR1cm4gaW5fZGF0YTsKIH0KK0VYUE9SVF9TWU1CT0wobGxfaW9jb250cm9sX3JlZ2lzdGVyKTsKIAogdm9pZCBsbF9pb2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkICptYWdpYykKIHsKQEAgLTMyNTcsOCArMzI1OSw2IEBACiAKIAlDV0FSTigiZGlkbid0IGZpbmQgaW9jb250cm9sIHJlZ2lzdGVyIGJsb2NrIHdpdGggbWFnaWM6ICVwXG4iLCBtYWdpYyk7CiB9Ci0KLUVYUE9SVF9TWU1CT0wobGxfaW9jb250cm9sX3JlZ2lzdGVyKTsKIEVYUE9SVF9TWU1CT0wobGxfaW9jb250cm9sX3VucmVnaXN0ZXIpOwogCiBzdGF0aWMgZW51bSBsbGlvY19pdGVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfY2xvc2UuYwppbmRleCAyMWI0YTUwLi5hOTRiYTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9jbG9zZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2Nsb3NlLmMKQEAgLTI4NCwxMCArMjg0LDggQEAKIAlMQVNTRVJUKGV4cF9jb25uZWN0X3NvbShsbF9pMm1kZXhwKGlub2RlKSkpOwogCiAJb3BfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpvcF9kYXRhKSwgR0ZQX05PRlMpOwotCWlmICghb3BfZGF0YSkgewotCQlDRVJST1IoImNhbid0IGFsbG9jYXRlIG9wX2RhdGFcbiIpOworCWlmICghb3BfZGF0YSkKIAkJcmV0dXJuOwotCX0KIAogCWxsX3ByZXBhcmVfZG9uZV93cml0aW5nKGlub2RlLCBvcF9kYXRhLCAmb2NoKTsKIAkvKiBJZiB0aGVyZSBpcyBubyBAb2NoLCB3ZSBkbyBub3QgZG8gRF9XIHlldC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2ludGVybmFsLmggYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9pbnRlcm5hbC5oCmluZGV4IDJhZjFkNzIuLmU3NDIyZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfaW50ZXJuYWwuaApAQCAtOTM4LDEwICs5MzgsOCBAQAogfTsKIAogc3RydWN0IHZ2cF90aHJlYWRfaW5mbyB7Ci0Jc3RydWN0IGlvdmVjCSB2dGlfbG9jYWxfaW92OwogCXN0cnVjdCB2dnBfaW9fYXJncyAgIHZ0aV9hcmdzOwogCXN0cnVjdCByYV9pb19hcmcgICAgIHZ0aV9yaWE7Ci0Jc3RydWN0IGtpb2NiCSB2dGlfa2lvY2I7CiAJc3RydWN0IGxsX2NsX2NvbnRleHQgdnRpX2lvX2N0eDsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX2xpYi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbGliLmMKaW5kZXggMGMxYjU4My4uYmYxZWMyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbGliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbGliLmMKQEAgLTg3LDExICs4NywxMCBAQAogCiAJc2lfbWVtaW5mbygmc2kpOwogCXBhZ2VzID0gc2kudG90YWxyYW0gLSBzaS50b3RhbGhpZ2g7Ci0JaWYgKHBhZ2VzID4+ICgyMCAtIFBBR0VfQ0FDSEVfU0hJRlQpIDwgNTEyKSB7CisJaWYgKHBhZ2VzID4+ICgyMCAtIFBBR0VfQ0FDSEVfU0hJRlQpIDwgNTEyKQogCQlscnVfcGFnZV9tYXggPSBwYWdlcyAvIDI7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCWxydV9wYWdlX21heCA9IChwYWdlcyAvIDQpICogMzsKLQl9CiAKIAkvKiBpbml0aWFsaXplIGxydSBkYXRhICovCiAJYXRvbWljX3NldCgmc2JpLT5sbF9jYWNoZS5jY2NfdXNlcnMsIDApOwpAQCAtNjIxLDcgKzYyMCw3IEBACiAJcmMgPSBvYmRfZ2V0X2luZm8oTlVMTCwgc2JpLT5sbF9tZF9leHAsIHNpemVvZihLRVlfTUFYX0VBU0laRSksCiAJCQkgIEtFWV9NQVhfRUFTSVpFLCAmc2l6ZSwgbG1tc2l6ZSwgTlVMTCk7CiAJaWYgKHJjKQotCQlDRVJST1IoIkdldCBtYXggbWRzaXplIGVycm9yIHJjICVkIFxuIiwgcmMpOworCQlDRVJST1IoIkdldCBtYXggbWRzaXplIGVycm9yIHJjICVkXG4iLCByYyk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC05NzgsMTkgKzk3NywxNyBAQAogCUNERUJVRyhEX0NPTkZJRywgIkZvdW5kIHByb2ZpbGUgJXM6IG1kYz0lcyBvc2M9JXNcbiIsIHByb2ZpbGVubSwKIAkgICAgICAgbHByb2YtPmxwX21kLCBscHJvZi0+bHBfZHQpOwogCi0JZHQgPSBremFsbG9jKHN0cmxlbihscHJvZi0+bHBfZHQpICsgaW5zdGxlbiArIDIsIEdGUF9OT0ZTKTsKKwlkdCA9IGthc3ByaW50ZihHRlBfTk9GUywgIiVzLSVwIiwgbHByb2YtPmxwX2R0LCBjZmctPmNmZ19pbnN0YW5jZSk7CiAJaWYgKCFkdCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9mcmVlOwogCX0KLQlzcHJpbnRmKGR0LCAiJXMtJXAiLCBscHJvZi0+bHBfZHQsIGNmZy0+Y2ZnX2luc3RhbmNlKTsKIAotCW1kID0ga3phbGxvYyhzdHJsZW4obHByb2YtPmxwX21kKSArIGluc3RsZW4gKyAyLCBHRlBfTk9GUyk7CisJbWQgPSBrYXNwcmludGYoR0ZQX05PRlMsICIlcy0lcCIsIGxwcm9mLT5scF9tZCwgY2ZnLT5jZmdfaW5zdGFuY2UpOwogCWlmICghbWQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXRfZnJlZTsKIAl9Ci0Jc3ByaW50ZihtZCwgIiVzLSVwIiwgbHByb2YtPmxwX21kLCBjZmctPmNmZ19pbnN0YW5jZSk7CiAKIAkvKiBjb25uZWN0aW9ucywgcmVnaXN0cmF0aW9ucywgc2Igc2V0dXAgKi8KIAllcnIgPSBjbGllbnRfY29tbW9uX2ZpbGxfc3VwZXIoc2IsIG1kLCBkdCwgbW50KTsKQEAgLTE0MzIsNyArMTQyOSw3IEBACiAKIAlpZiAoYXR0ci0+aWFfdmFsaWQgJiAoQVRUUl9TSVpFIHwKIAkJCSAgICAgIEFUVFJfQVRJTUUgfCBBVFRSX0FUSU1FX1NFVCB8Ci0JCQkgICAgICBBVFRSX01USU1FIHwgQVRUUl9NVElNRV9TRVQpKQorCQkJICAgICAgQVRUUl9NVElNRSB8IEFUVFJfTVRJTUVfU0VUKSkgewogCQkvKiBGb3IgdHJ1bmNhdGUgYW5kIHV0aW1lcyBzZW5kaW5nIGF0dHJpYnV0ZXMgdG8gT1NUcywgc2V0dGluZwogCQkgKiBtdGltZS9hdGltZSB0byB0aGUgcGFzdCB3aWxsIGJlIHBlcmZvcm1lZCB1bmRlciBQVyBbMDpFT0ZdCiAJCSAqIGV4dGVudCBsb2NrIChuZXdfc2l6ZTpFT0YgZm9yIHRydW5jYXRlKS4gIEl0IG1heSBzZWVtCkBAIC0xNDQ0LDYgKzE0NDEsNyBAQAogCQlyYyA9IGxsX3NldGF0dHJfb3N0KGlub2RlLCBhdHRyKTsKIAkJaWYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKQogCQkJdXBfd3JpdGUoJmxsaS0+bGxpX3RydW5jX3NlbSk7CisJfQogb3V0OgogCWlmIChvcF9kYXRhKSB7CiAJCWlmIChvcF9kYXRhLT5vcF9pb2Vwb2NoKSB7CkBAIC0xNjA4LDcgKzE2MDYsNyBAQAogCXN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20gPSBtZC0+bHNtOwogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9pMnNiaShpbm9kZSk7CiAKLQlMQVNTRVJUICgobHNtICE9IE5VTEwpID09ICgoYm9keS0+dmFsaWQgJiBPQkRfTURfRkxFQVNJWkUpICE9IDApKTsKKwlMQVNTRVJUKChsc20gIT0gTlVMTCkgPT0gKChib2R5LT52YWxpZCAmIE9CRF9NRF9GTEVBU0laRSkgIT0gMCkpOwogCWlmIChsc20gIT0gTlVMTCkgewogCQlpZiAoIWxsaS0+bGxpX2hhc19zbWQgJiYKIAkJICAgICEoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9MQVlPVVRfTE9DSykpCkBAIC0yMTUyLDcgKzIxNTAsOCBAQAogCXB0ciA9IHN0cnJjaHIobHVzdHJlX2NmZ19zdHJpbmcobGNmZywgMCksICctJyk7CiAJaWYgKCFwdHIgfHwgISooKytwdHIpKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoc3NjYW5mKHB0ciwgIiVseCIsICZ4KSAhPSAxKQorCXJjID0ga3N0cnRvdWwocHRyLCAxNiwgJngpOworCWlmIChyYyAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlzYiA9ICh2b2lkICopeDsKIAkvKiBUaGlzIGJldHRlciBiZSBhIHJlYWwgTHVzdHJlIHN1cGVyYmxvY2shICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9tbWFwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbGl0ZV9tbWFwLmMKaW5kZXggNDc5YmY0Mi4uYTkwMjE0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxpdGVfbW1hcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsaXRlX21tYXAuYwpAQCAtNDAsNyArNDAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CkBAIC0zMTIsNyArMzEyLDcgQEAKIAkJdmlvLT51LmZhdWx0LmZ0X3ZtcGFnZSAgICA9IE5VTEw7CiAJCXZpby0+dS5mYXVsdC5mYXVsdC5mdF92bWYgPSB2bWY7CiAJCXZpby0+dS5mYXVsdC5mYXVsdC5mdF9mbGFncyA9IDA7Ci0JCXZpby0+dS5mYXVsdC5mYXVsdC5mdF9mbGFnc192YWxpZCA9IDA7CisJCXZpby0+dS5mYXVsdC5mYXVsdC5mdF9mbGFnc192YWxpZCA9IGZhbHNlOwogCiAJCXJlc3VsdCA9IGNsX2lvX2xvb3AoZW52LCBpbyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsb29wLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9sbG9vcC5jCmluZGV4IDAzMTI0ODguLjQxM2E4NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xsb29wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbGxvb3AuYwpAQCAtMTAwLDggKzEwMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KLQotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGliLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmVfbGl0ZS5oIgpAQCAtMzQ5LDcgKzM0OCw3IEBACiAJICAgICAgIG9sZF9iaW8tPmJpX2l0ZXIuYmlfc2l6ZSk7CiAKIAlzcGluX2xvY2tfaXJxKCZsby0+bG9fbG9jayk7Ci0JaW5hY3RpdmUgPSAobG8tPmxvX3N0YXRlICE9IExMT09QX0JPVU5EKTsKKwlpbmFjdGl2ZSA9IGxvLT5sb19zdGF0ZSAhPSBMTE9PUF9CT1VORDsKIAlzcGluX3VubG9ja19pcnEoJmxvLT5sb19sb2NrKTsKIAlpZiAoaW5hY3RpdmUpCiAJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbHByb2NfbGxpdGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL2xwcm9jX2xsaXRlLmMKaW5kZXggYWFhMTNiZC4uODNhOWI4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbHByb2NfbGxpdGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9scHJvY19sbGl0ZS5jCkBAIC01OSw3ICs1OSw3IEBACiAJCQkJY2ZzX3RpbWVfc2hpZnRfNjQoLU9CRF9TVEFURlNfQ0FDSEVfU0VDT05EUyksCiAJCQkJT0JEX1NUQVRGU19OT0RFTEFZKTsKIAlpZiAoIXJjKQotCSAgICAgIHJjID0gc2VxX3ByaW50ZihtLCAiJXVcbiIsIG9zZnMub3NfYnNpemUpOworCQlzZXFfcHJpbnRmKG0sICIldVxuIiwgb3Nmcy5vc19ic2l6ZSk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC04Miw4ICs4Miw5IEBACiAJCXdoaWxlIChibGtfc2l6ZSA+Pj0gMSkKIAkJCXJlc3VsdCA8PD0gMTsKIAotCQlyYyA9IHNlcV9wcmludGYobSwgIiVsbHVcbiIsIHJlc3VsdCk7CisJCXNlcV9wcmludGYobSwgIiVsbHVcbiIsIHJlc3VsdCk7CiAJfQorCiAJcmV0dXJuIHJjOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obGxfa2J5dGVzdG90YWwpOwpAQCAtMTA1LDggKzEwNiw5IEBACiAJCXdoaWxlIChibGtfc2l6ZSA+Pj0gMSkKIAkJCXJlc3VsdCA8PD0gMTsKIAotCQlyYyA9IHNlcV9wcmludGYobSwgIiVsbHVcbiIsIHJlc3VsdCk7CisJCXNlcV9wcmludGYobSwgIiVsbHVcbiIsIHJlc3VsdCk7CiAJfQorCiAJcmV0dXJuIHJjOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obGxfa2J5dGVzZnJlZSk7CkBAIC0xMjgsOCArMTMwLDkgQEAKIAkJd2hpbGUgKGJsa19zaXplID4+PSAxKQogCQkJcmVzdWx0IDw8PSAxOwogCi0JCXJjID0gc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgcmVzdWx0KTsKKwkJc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgcmVzdWx0KTsKIAl9CisKIAlyZXR1cm4gcmM7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhsbF9rYnl0ZXNhdmFpbCk7CkBAIC0xNDUsNyArMTQ4LDggQEAKIAkJCQljZnNfdGltZV9zaGlmdF82NCgtT0JEX1NUQVRGU19DQUNIRV9TRUNPTkRTKSwKIAkJCQlPQkRfU1RBVEZTX05PREVMQVkpOwogCWlmICghcmMpCi0JCSByYyA9IHNlcV9wcmludGYobSwgIiVsbHVcbiIsIG9zZnMub3NfZmlsZXMpOworCQlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCBvc2ZzLm9zX2ZpbGVzKTsKKwogCXJldHVybiByYzsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKGxsX2ZpbGVzdG90YWwpOwpAQCAtMTYxLDcgKzE2NSw4IEBACiAJCQkJY2ZzX3RpbWVfc2hpZnRfNjQoLU9CRF9TVEFURlNfQ0FDSEVfU0VDT05EUyksCiAJCQkJT0JEX1NUQVRGU19OT0RFTEFZKTsKIAlpZiAoIXJjKQotCQkgcmMgPSBzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCBvc2ZzLm9zX2ZmcmVlKTsKKwkJc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgb3Nmcy5vc19mZnJlZSk7CisKIAlyZXR1cm4gcmM7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhsbF9maWxlc2ZyZWUpOwpAQCAtMTY5LDE2ICsxNzQsMTUgQEAKIHN0YXRpYyBpbnQgbGxfY2xpZW50X3R5cGVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaSgoc3RydWN0IHN1cGVyX2Jsb2NrICopbS0+cHJpdmF0ZSk7Ci0JaW50IHJjOwogCiAJTEFTU0VSVChzYmkgIT0gTlVMTCk7CiAKIAlpZiAoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9STVRfQ0xJRU5UKQotCQlyYyA9IHNlcV9wcmludGYobSwgInJlbW90ZSBjbGllbnRcbiIpOworCQlzZXFfcHV0cyhtLCAicmVtb3RlIGNsaWVudFxuIik7CiAJZWxzZQotCQlyYyA9IHNlcV9wcmludGYobSwgImxvY2FsIGNsaWVudFxuIik7CisJCXNlcV9wdXRzKG0sICJsb2NhbCBjbGllbnRcbiIpOwogCi0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obGxfY2xpZW50X3R5cGUpOwogCkBAIC0xODcsNyArMTkxLDggQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gKHN0cnVjdCBzdXBlcl9ibG9jayAqKW0tPnByaXZhdGU7CiAKIAlMQVNTRVJUKHNiICE9IE5VTEwpOwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlc1xuIiwgc2ItPnNfdHlwZS0+bmFtZSk7CisJc2VxX3ByaW50ZihtLCAiJXNcbiIsIHNiLT5zX3R5cGUtPm5hbWUpOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obGxfZnN0eXBlKTsKIApAQCAtMTk2LDcgKzIwMSw4IEBACiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiltLT5wcml2YXRlOwogCiAJTEFTU0VSVChzYiAhPSBOVUxMKTsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXNcbiIsIGxsX3Myc2JpKHNiKS0+bGxfc2JfdXVpZC51dWlkKTsKKwlzZXFfcHJpbnRmKG0sICIlc1xuIiwgbGxfczJzYmkoc2IpLT5sbF9zYl91dWlkLnV1aWQpOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obGxfc2JfdXVpZCk7CiAKQEAgLTM1MywxNyArMzU5LDE4IEBACiAKIAltYXhfY2FjaGVkX21iID0gY2FjaGUtPmNjY19scnVfbWF4ID4+IHNoaWZ0OwogCXVudXNlZF9tYiA9IGF0b21pY19yZWFkKCZjYWNoZS0+Y2NjX2xydV9sZWZ0KSA+PiBzaGlmdDsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLAotCQkJInVzZXJzOiAlZFxuIgotCQkJIm1heF9jYWNoZWRfbWI6ICVkXG4iCi0JCQkidXNlZF9tYjogJWRcbiIKLQkJCSJ1bnVzZWRfbWI6ICVkXG4iCi0JCQkicmVjbGFpbV9jb3VudDogJXVcbiIsCi0JCQlhdG9taWNfcmVhZCgmY2FjaGUtPmNjY191c2VycyksCi0JCQltYXhfY2FjaGVkX21iLAotCQkJbWF4X2NhY2hlZF9tYiAtIHVudXNlZF9tYiwKLQkJCXVudXNlZF9tYiwKLQkJCWNhY2hlLT5jY2NfbHJ1X3Nocmlua2Vycyk7CisJc2VxX3ByaW50ZihtLAorCQkgICAidXNlcnM6ICVkXG4iCisJCSAgICJtYXhfY2FjaGVkX21iOiAlZFxuIgorCQkgICAidXNlZF9tYjogJWRcbiIKKwkJICAgInVudXNlZF9tYjogJWRcbiIKKwkJICAgInJlY2xhaW1fY291bnQ6ICV1XG4iLAorCQkgICBhdG9taWNfcmVhZCgmY2FjaGUtPmNjY191c2VycyksCisJCSAgIG1heF9jYWNoZWRfbWIsCisJCSAgIG1heF9jYWNoZWRfbWIgLSB1bnVzZWRfbWIsCisJCSAgIHVudXNlZF9tYiwKKwkJICAgY2FjaGUtPmNjY19scnVfc2hyaW5rZXJzKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgbGxfbWF4X2NhY2hlZF9tYl9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC00NjcsNyArNDc0LDggQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLCAoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9DSEVDS1NVTSkgPyAxIDogMCk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIChzYmktPmxsX2ZsYWdzICYgTExfU0JJX0NIRUNLU1VNKSA/IDEgOiAwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgbGxfY2hlY2tzdW1fc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNTAzLDcgKzUxMSw4IEBACiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IG0tPnByaXZhdGU7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWx1XG4iLCBsbF9zMnNiaShzYiktPmxsX21heF9yd19jaHVuayk7CisJc2VxX3ByaW50ZihtLCAiJWx1XG4iLCBsbF9zMnNiaShzYiktPmxsX21heF9yd19jaHVuayk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxsX21heF9yd19jaHVua19zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC01MjUsMTUgKzUzNCwxNCBAQAogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtLT5wcml2YXRlOwogCi0JaWYgKGxsX3Myc2JpKHNiKS0+bGxfc3RhdHNfdHJhY2tfdHlwZSA9PSB0eXBlKSB7Ci0JCXJldHVybiBzZXFfcHJpbnRmKG0sICIlZFxuIiwKLQkJCQlsbF9zMnNiaShzYiktPmxsX3N0YXRzX3RyYWNrX2lkKTsKKwlpZiAobGxfczJzYmkoc2IpLT5sbF9zdGF0c190cmFja190eXBlID09IHR5cGUpCisJCXNlcV9wcmludGYobSwgIiVkXG4iLCBsbF9zMnNiaShzYiktPmxsX3N0YXRzX3RyYWNrX2lkKTsKKwllbHNlIGlmIChsbF9zMnNiaShzYiktPmxsX3N0YXRzX3RyYWNrX3R5cGUgPT0gU1RBVFNfVFJBQ0tfQUxMKQorCQlzZXFfcHV0cyhtLCAiMCAoYWxsKVxuIik7CisJZWxzZQorCQlzZXFfcHV0cyhtLCAidW50cmFja2VkXG4iKTsKIAotCX0gZWxzZSBpZiAobGxfczJzYmkoc2IpLT5sbF9zdGF0c190cmFja190eXBlID09IFNUQVRTX1RSQUNLX0FMTCkgewotCQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiMCAoYWxsKVxuIik7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIHNlcV9wcmludGYobSwgInVudHJhY2tlZFxuIik7Ci0JfQorCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGxsX3dyX3RyYWNrX2lkKGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsCkBAIC02MDEsNyArNjA5LDggQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLCBzYmktPmxsX3NhX21heCk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIHNiaS0+bGxfc2FfbWF4KTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgbGxfc3RhdGFoZWFkX21heF9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC02MzEsOCArNjQwLDggQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLAotCQkJc2JpLT5sbF9mbGFncyAmIExMX1NCSV9BR0xfRU5BQkxFRCA/IDEgOiAwKTsKKwlzZXFfcHJpbnRmKG0sICIldVxuIiwgc2JpLT5sbF9mbGFncyAmIExMX1NCSV9BR0xfRU5BQkxFRCA/IDEgOiAwKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgbGxfc3RhdGFoZWFkX2FnbF9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC02NjEsMTMgKzY3MCwxNCBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLAotCQkJInN0YXRhaGVhZCB0b3RhbDogJXVcbiIKLQkJCSJzdGF0YWhlYWQgd3Jvbmc6ICV1XG4iCi0JCQkiYWdsIHRvdGFsOiAldVxuIiwKLQkJCWF0b21pY19yZWFkKCZzYmktPmxsX3NhX3RvdGFsKSwKLQkJCWF0b21pY19yZWFkKCZzYmktPmxsX3NhX3dyb25nKSwKLQkJCWF0b21pY19yZWFkKCZzYmktPmxsX2FnbF90b3RhbCkpOworCXNlcV9wcmludGYobSwKKwkJICAgInN0YXRhaGVhZCB0b3RhbDogJXVcbiIKKwkJICAgInN0YXRhaGVhZCB3cm9uZzogJXVcbiIKKwkJICAgImFnbCB0b3RhbDogJXVcbiIsCisJCSAgIGF0b21pY19yZWFkKCZzYmktPmxsX3NhX3RvdGFsKSwKKwkJICAgYXRvbWljX3JlYWQoJnNiaS0+bGxfc2Ffd3JvbmcpLAorCQkgICBhdG9taWNfcmVhZCgmc2JpLT5sbF9hZ2xfdG90YWwpKTsKKwlyZXR1cm4gMDsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKGxsX3N0YXRhaGVhZF9zdGF0cyk7CiAKQEAgLTY3Niw4ICs2ODYsOCBAQAogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsCi0JCQkoc2JpLT5sbF9mbGFncyAmIExMX1NCSV9MQVpZU1RBVEZTKSA/IDEgOiAwKTsKKwlzZXFfcHJpbnRmKG0sICIldVxuIiwgc2JpLT5sbF9mbGFncyAmIExMX1NCSV9MQVpZU1RBVEZTID8gMSA6IDApOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBsbF9sYXp5c3RhdGZzX3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTcxMiwxMSArNzIyLDEyIEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIGVhbGVuKTsKKwlzZXFfcHJpbnRmKG0sICIldVxuIiwgZWFsZW4pOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obGxfbWF4X2Vhc2l6ZSk7CiAKLXN0YXRpYyBpbnQgbGxfZGVmdWx0X2Vhc2l6ZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCitzdGF0aWMgaW50IGxsX2RlZmF1bHRfZWFzaXplX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbGxfc2JfaW5mbyAqc2JpID0gbGxfczJzYmkoc2IpOwpAQCAtNzI3LDkgKzczOCwxMCBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLCBlYWxlbik7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIGVhbGVuKTsKKwlyZXR1cm4gMDsKIH0KLUxQUk9DX1NFUV9GT1BTX1JPKGxsX2RlZnVsdF9lYXNpemUpOworTFBST0NfU0VRX0ZPUFNfUk8obGxfZGVmYXVsdF9lYXNpemUpOwogCiBzdGF0aWMgaW50IGxsX21heF9jb29raWVzaXplX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKQEAgLTc0MiwxMSArNzU0LDEyIEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIGNvb2tpZWxlbik7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIGNvb2tpZWxlbik7CisJcmV0dXJuIDA7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhsbF9tYXhfY29va2llc2l6ZSk7CiAKLXN0YXRpYyBpbnQgbGxfZGVmdWx0X2Nvb2tpZXNpemVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQorc3RhdGljIGludCBsbF9kZWZhdWx0X2Nvb2tpZXNpemVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7CkBAIC03NTcsOSArNzcwLDEwIEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIGNvb2tpZWxlbik7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIGNvb2tpZWxlbik7CisJcmV0dXJuIDA7CiB9Ci1MUFJPQ19TRVFfRk9QU19STyhsbF9kZWZ1bHRfY29va2llc2l6ZSk7CitMUFJPQ19TRVFfRk9QU19STyhsbF9kZWZhdWx0X2Nvb2tpZXNpemUpOwogCiBzdGF0aWMgaW50IGxsX3NiaV9mbGFnc19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CkBAIC03ODksMTEgKzgwMywxMCBAQAogewogCXN0cnVjdCBzdXBlcl9ibG9jayAqc2IgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBsbF9zYl9pbmZvICpzYmkgPSBsbF9zMnNiaShzYik7Ci0JaW50IHJjOwogCi0JcmMgPSBzZXFfcHJpbnRmKG0sICIldVxuIiwgc2JpLT5sbF94YXR0cl9jYWNoZV9lbmFibGVkKTsKKwlzZXFfcHJpbnRmKG0sICIldVxuIiwgc2JpLT5sbF94YXR0cl9jYWNoZV9lbmFibGVkKTsKIAotCXJldHVybiByYzsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgbGxfeGF0dHJfY2FjaGVfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtODQ5LDkgKzg2Miw5IEBACiAJeyAic3RhdGFoZWFkX3N0YXRzIiwgICZsbF9zdGF0YWhlYWRfc3RhdHNfZm9wcywgTlVMTCwgMCB9LAogCXsgImxhenlzdGF0ZnMiLCAgICAgICAmbGxfbGF6eXN0YXRmc19mb3BzLCBOVUxMIH0sCiAJeyAibWF4X2Vhc2l6ZSIsICAgICAgICZsbF9tYXhfZWFzaXplX2ZvcHMsIE5VTEwsIDAgfSwKLQl7ICJkZWZhdWx0X2Vhc2l6ZSIsICAgJmxsX2RlZnVsdF9lYXNpemVfZm9wcywgTlVMTCwgMCB9LAorCXsgImRlZmF1bHRfZWFzaXplIiwgICAmbGxfZGVmYXVsdF9lYXNpemVfZm9wcywgTlVMTCwgMCB9LAogCXsgIm1heF9jb29raWVzaXplIiwgICAmbGxfbWF4X2Nvb2tpZXNpemVfZm9wcywgTlVMTCwgMCB9LAotCXsgImRlZmF1bHRfY29va2llc2l6ZSIsICZsbF9kZWZ1bHRfY29va2llc2l6ZV9mb3BzLCBOVUxMLCAwIH0sCisJeyAiZGVmYXVsdF9jb29raWVzaXplIiwgJmxsX2RlZmF1bHRfY29va2llc2l6ZV9mb3BzLCBOVUxMLCAwIH0sCiAJeyAic2JpX2ZsYWdzIiwJICAgICAgJmxsX3NiaV9mbGFnc19mb3BzLCBOVUxMLCAwIH0sCiAJeyAieGF0dHJfY2FjaGUiLCAgICAgICZsbF94YXR0cl9jYWNoZV9mb3BzLCBOVUxMLCAwIH0sCiAJeyBOVUxMIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL25hbWVpLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9uYW1laS5jCmluZGV4IDg5MGFjMTkuLjQ5ZjFjYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL25hbWVpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvbmFtZWkuYwpAQCAtODMsNyArODMsOCBAQAogCiAJbGxpLT5sbGlfZmlkID0gYm9keS0+ZmlkMTsKIAlpZiAodW5saWtlbHkoIShib2R5LT52YWxpZCAmIE9CRF9NRF9GTFRZUEUpKSkgewotCQlDRVJST1IoIkNhbiBub3QgaW5pdGlhbGl6ZSBpbm9kZSAiIERGSUQgIiB3aXRob3V0IG9iamVjdCB0eXBlOiB2YWxpZCA9ICUjbGx4XG4iLAorCQlDRVJST1IoIkNhbiBub3QgaW5pdGlhbGl6ZSBpbm9kZSAiIERGSUQKKwkJICAgICAgICIgd2l0aG91dCBvYmplY3QgdHlwZTogdmFsaWQgPSAlI2xseFxuIiwKIAkJICAgICAgIFBGSUQoJmxsaS0+bGxpX2ZpZCksIGJvZHktPnZhbGlkKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNjAwLDcgKzYwMSw4IEBACiAJbG9uZyBsb25nIGxvb2t1cF9mbGFncyA9IExPT0tVUF9PUEVOOwogCWludCByYyA9IDA7CiAKLQlDREVCVUcoRF9WRlNUUkFDRSwgIlZGUyBPcDpuYW1lPSVwZCxkaXI9JWx1LyV1KCVwKSxmaWxlICVwLG9wZW5fZmxhZ3MgJXgsbW9kZSAleCBvcGVuZWQgJWRcbiIsCisJQ0RFQlVHKERfVkZTVFJBQ0UsCisJICAgICAgICJWRlMgT3A6bmFtZT0lcGQsZGlyPSVsdS8ldSglcCksZmlsZSAlcCxvcGVuX2ZsYWdzICV4LG1vZGUgJXggb3BlbmVkICVkXG4iLAogCSAgICAgICBkZW50cnksIGRpci0+aV9pbm8sCiAJICAgICAgIGRpci0+aV9nZW5lcmF0aW9uLCBkaXIsIGZpbGUsIG9wZW5fZmxhZ3MsIG1vZGUsICpvcGVuZWQpOwogCkBAIC05NzQsMTEgKzk3NiwxMiBAQAogICogSW5zdGVhZCwgbGxfZGRlbGV0ZSgpIGFuZCBsbF9kX2lwdXQoKSB3aWxsIHVwZGF0ZSBpdCBiYXNlZCB1cG9uIGlmIHRoZXJlCiAgKiBpcyBhbnkgbG9jayBleGlzdGluZy4gVGhleSB3aWxsIHJlY3ljbGUgZGVudHJpZXMgYW5kIGlub2RlcyBiYXNlZCB1cG9uIGxvY2tzCiAgKiB0b28uIGI9MjA0MzMgKi8KLXN0YXRpYyBpbnQgbGxfdW5saW5rKHN0cnVjdCBpbm9kZSAqIGRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQorc3RhdGljIGludCBsbF91bmxpbmsoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcXVlc3QgPSBOVUxMOwogCXN0cnVjdCBtZF9vcF9kYXRhICpvcF9kYXRhOwogCWludCByYzsKKwogCUNERUJVRyhEX1ZGU1RSQUNFLCAiVkZTIE9wOm5hbWU9JXBkLGRpcj0lbHUvJXUoJXApXG4iLAogCSAgICAgICBkZW50cnksIGRpci0+aV9pbm8sIGRpci0+aV9nZW5lcmF0aW9uLCBkaXIpOwogCkBAIC0xMDMzLDcgKzEwMzYsNyBAQAogCSAgICAgICBkZW50cnksIGRpci0+aV9pbm8sIGRpci0+aV9nZW5lcmF0aW9uLCBkaXIpOwogCiAJb3BfZGF0YSA9IGxsX3ByZXBfbWRfb3BfZGF0YShOVUxMLCBkaXIsIE5VTEwsCi0JCQkJICAgICBkZW50cnktPmRfbmFtZS5uYW1lLCAKKwkJCQkgICAgIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCiAJCQkJICAgICBkZW50cnktPmRfbmFtZS5sZW4sCiAJCQkJICAgICBTX0lGRElSLCBMVVNUUkVfT1BDX0FOWSwgTlVMTCk7CiAJaWYgKElTX0VSUihvcF9kYXRhKSkKQEAgLTExMTEsMTAgKzExMTQsOSBAQAogCWludCBlcnI7CiAKIAlDREVCVUcoRF9WRlNUUkFDRSwKLQkgICAgICAgIlZGUyBPcDpvbGRuYW1lPSVwZCxzcmNfZGlyPSVsdS8ldSglcCksbmV3bmFtZT0lcGQsIgotCSAgICAgICAidGd0X2Rpcj0lbHUvJXUoJXApXG4iLCBvbGRfZGVudHJ5LAotCSAgICAgICBvbGRfZGlyLT5pX2lubywgb2xkX2Rpci0+aV9nZW5lcmF0aW9uLCBvbGRfZGlyLCBuZXdfZGVudHJ5LAotCSAgICAgICBuZXdfZGlyLT5pX2lubywgbmV3X2Rpci0+aV9nZW5lcmF0aW9uLCBuZXdfZGlyKTsKKwkgICAgICAgIlZGUyBPcDpvbGRuYW1lPSVwZCxzcmNfZGlyPSVsdS8ldSglcCksbmV3bmFtZT0lcGQsdGd0X2Rpcj0lbHUvJXUoJXApXG4iLAorCSAgICAgICBvbGRfZGVudHJ5LCBvbGRfZGlyLT5pX2lubywgb2xkX2Rpci0+aV9nZW5lcmF0aW9uLCBvbGRfZGlyLAorCSAgICAgICBuZXdfZGVudHJ5LCBuZXdfZGlyLT5pX2lubywgbmV3X2Rpci0+aV9nZW5lcmF0aW9uLCBuZXdfZGlyKTsKIAogCW9wX2RhdGEgPSBsbF9wcmVwX21kX29wX2RhdGEoTlVMTCwgb2xkX2RpciwgbmV3X2RpciwgTlVMTCwgMCwgMCwKIAkJCQkgICAgIExVU1RSRV9PUENfQU5ZLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydy5jCmluZGV4IDEwYTA0MjEuLjk5MWQyMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncuYwpAQCAtNDUsNyArNDUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KQEAgLTc1MCw3ICs3NTAsNyBAQAogCQkvKiBOb3RlOiB3ZSBvbmx5IHRyaW0gdGhlIFJQQywgaW5zdGVhZCBvZiBleHRlbmRpbmcgdGhlIFJQQwogCQkgKiB0byB0aGUgYm91bmRhcnksIHNvIHRvIGF2b2lkIHJlYWRpbmcgdG9vIG11Y2ggcGFnZXMgZHVyaW5nCiAJCSAqIHJhbmRvbSByZWFkaW5nLiAqLwotCQlycGNfYm91bmRhcnkgPSAoKGVuZCArIDEpICYgKH4oUFRMUlBDX01BWF9CUldfUEFHRVMgLSAxKSkpOworCQlycGNfYm91bmRhcnkgPSAoZW5kICsgMSkgJiAofihQVExSUENfTUFYX0JSV19QQUdFUyAtIDEpKTsKIAkJaWYgKHJwY19ib3VuZGFyeSA+IDApCiAJCQlycGNfYm91bmRhcnktLTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncyNi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvcncyNi5jCmluZGV4IDJmMjEzMDQuLjkxNDQyZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3J3MjYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9ydzI2LmMKQEAgLTQ0LDcgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21pZ3JhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3RhdGFoZWFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdGF0YWhlYWQuYwppbmRleCA2YWQ5ZGQwLi5iNzU1NjJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdGF0YWhlYWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdGF0YWhlYWQuYwpAQCAtODQsNyArODQsNyBAQAogCXN0cnVjdCBxc3RyCSAgICAgc2VfcXN0cjsKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2FpX2dlbmVyYXRpb24gPSAwOworc3RhdGljIHVuc2lnbmVkIGludCBzYWlfZ2VuZXJhdGlvbjsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2FpX2dlbmVyYXRpb25fbG9jayk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IGxsX3NhX2VudHJ5X3VuaGFzaGVkKHN0cnVjdCBsbF9zYV9lbnRyeSAqZW50cnkpCkBAIC03MDYsMTEgKzcwNiwyMSBAQAogCXN0cnVjdCBsbF9pbm9kZV9pbmZvICAgICAqbGxpID0gbGxfaTJpbmZvKGRpcik7CiAJc3RydWN0IGxsX3N0YXRhaGVhZF9pbmZvICpzYWkgPSBOVUxMOwogCXN0cnVjdCBsbF9zYV9lbnRyeSAgICAgICAqZW50cnk7CisJX191NjQJCQkgIGhhbmRsZSA9IDA7CiAJaW50CQkgICAgICAgd2FrZXVwOwogCiAJaWYgKGl0X2Rpc3Bvc2l0aW9uKGl0LCBESVNQX0xPT0tVUF9ORUcpKQogCQlyYyA9IC1FTk9FTlQ7CiAKKwlpZiAocmMgPT0gMCkgeworCQkvKiByZWxlYXNlIGliaXRzIGxvY2sgQVNBUCB0byBhdm9pZCBkZWFkbG9jayB3aGVuIHN0YXRhaGVhZAorCQkgKiB0aHJlYWQgZW5xdWV1ZXMgbG9jayBvbiBwYXJlbnQgaW4gcmVhZGRpciBhbmQgYW5vdGhlcgorCQkgKiBwcm9jZXNzIGVucXVldWVzIGxvY2sgb24gY2hpbGQgd2l0aCBwYXJlbnQgbG9jayBoZWxkLCBlZy4KKwkJICogdW5saW5rLiAqLworCQloYW5kbGUgPSBpdC0+ZC5sdXN0cmUuaXRfbG9ja19oYW5kbGU7CisJCWxsX2ludGVudF9kcm9wX2xvY2soaXQpOworCX0KKwogCXNwaW5fbG9jaygmbGxpLT5sbGlfc2FfbG9jayk7CiAJLyogc3RhbGUgZW50cnkgKi8KIAlpZiAodW5saWtlbHkobGxpLT5sbGlfc2FpID09IE5VTEwgfHwKQEAgLTc0NSw4ICs3NTUsNyBAQAogCQkJICogd2hlbiBzdGF0YWhlYWQgdGhyZWFkIHRyaWVzIHRvIGVucXVldWUgbG9jayBvbiBwYXJlbnQKIAkJCSAqIGZvciByZWFkcGFnZSBhbmQgb3RoZXIgdHJpZXMgdG8gZW5xdWV1ZSBsb2NrIG9uIGNoaWxkCiAJCQkgKiB3aXRoIHBhcmVudCdzIGxvY2sgaGVsZCwgZm9yIGV4YW1wbGU6IHVubGluay4gKi8KLQkJCWVudHJ5LT5zZV9oYW5kbGUgPSBpdC0+ZC5sdXN0cmUuaXRfbG9ja19oYW5kbGU7Ci0JCQlsbF9pbnRlbnRfZHJvcF9sb2NrKGl0KTsKKwkJCWVudHJ5LT5zZV9oYW5kbGUgPSBoYW5kbGU7CiAJCQl3YWtldXAgPSBzYV9yZWNlaXZlZF9lbXB0eShzYWkpOwogCQkJbGlzdF9hZGRfdGFpbCgmZW50cnktPnNlX2xpc3QsCiAJCQkJCSAgJnNhaS0+c2FpX2VudHJpZXNfcmVjZWl2ZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3VwZXIyNS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvc3VwZXIyNS5jCmluZGV4IDdjMWUwMmEuLmE0OTRmNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3N1cGVyMjUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS9zdXBlcjI1LmMKQEAgLTE1Miw5ICsxNTIsNyBAQAogCiAJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CiAJY2ZzX3NyYW5kKHR2LnR2X3NlYyBeIHNlZWRbMF0sIHR2LnR2X3VzZWMgXiBzZWVkWzFdKTsKLQotCWluaXRfdGltZXIoJmxsX2NhcGFfdGltZXIpOwotCWxsX2NhcGFfdGltZXIuZnVuY3Rpb24gPSBsbF9jYXBhX3RpbWVyX2NhbGxiYWNrOworCXNldHVwX3RpbWVyKCZsbF9jYXBhX3RpbWVyLCBsbF9jYXBhX3RpbWVyX2NhbGxiYWNrLCAwKTsKIAlyYyA9IGxsX2NhcGFfdGhyZWFkX3N0YXJ0KCk7CiAJaWYgKHJjICE9IDApCiAJCWdvdG8gb3V0X3Byb2M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS92dnBfZGV2LmMKaW5kZXggNWExMDc4YS4uZmRlNDFkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUvdnZwX2Rldi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3Z2cF9kZXYuYwpAQCAtNjMsMTIgKzYzLDEyIEBACiAJewogCQkuY2tkX2NhY2hlID0gJnZ2cF90aHJlYWRfa21lbSwKIAkJLmNrZF9uYW1lICA9ICJ2dnBfdGhyZWFkX2ttZW0iLAotCQkuY2tkX3NpemUgID0gc2l6ZW9mIChzdHJ1Y3QgdnZwX3RocmVhZF9pbmZvKSwKKwkJLmNrZF9zaXplICA9IHNpemVvZihzdHJ1Y3QgdnZwX3RocmVhZF9pbmZvKSwKIAl9LAogCXsKIAkJLmNrZF9jYWNoZSA9ICZ2dnBfc2Vzc2lvbl9rbWVtLAogCQkuY2tkX25hbWUgID0gInZ2cF9zZXNzaW9uX2ttZW0iLAotCQkuY2tkX3NpemUgID0gc2l6ZW9mIChzdHJ1Y3QgdnZwX3Nlc3Npb24pCisJCS5ja2Rfc2l6ZSAgPSBzaXplb2Yoc3RydWN0IHZ2cF9zZXNzaW9uKQogCX0sCiAJewogCQkuY2tkX2NhY2hlID0gTlVMTApAQCAtOTAsNiArOTAsNyBAQAogCQkJIHN0cnVjdCBsdV9jb250ZXh0X2tleSAqa2V5LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB2dnBfdGhyZWFkX2luZm8gKmluZm8gPSBkYXRhOworCiAJT0JEX1NMQUJfRlJFRV9QVFIoaW5mbywgdnZwX3RocmVhZF9rbWVtKTsKIH0KIApAQCAtMTA4LDYgKzEwOSw3IEBACiAJCQkJIHN0cnVjdCBsdV9jb250ZXh0X2tleSAqa2V5LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCB2dnBfc2Vzc2lvbiAqc2Vzc2lvbiA9IGRhdGE7CisKIAlPQkRfU0xBQl9GUkVFX1BUUihzZXNzaW9uLCB2dnBfc2Vzc2lvbl9rbWVtKTsKIH0KIApAQCAtMjg2LDcgKzI4OCw3IEBACiAKIAlpZC0+dnBpX2luZGV4ICA9IHBvcyAmIDB4ZmZmZmZmZmY7CiAJaWQtPnZwaV9kZXB0aCAgPSAocG9zID4+IFBHQ19ERVBUSF9TSElGVCkgJiAweGY7Ci0JaWQtPnZwaV9idWNrZXQgPSAoKHVuc2lnbmVkIGxvbmcgbG9uZylwb3MgPj4gUEdDX09CSl9TSElGVCk7CisJaWQtPnZwaV9idWNrZXQgPSAodW5zaWduZWQgbG9uZyBsb25nKXBvcyA+PiBQR0NfT0JKX1NISUZUOwogfQogCiBzdGF0aWMgbG9mZl90IHZ2cF9wZ2NhY2hlX2lkX3BhY2soc3RydWN0IHZ2cF9wZ2NhY2hlX2lkICppZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbGl0ZS94YXR0cl9jYWNoZS5jCmluZGV4IGUyYmFkZjEuLjY5ZWE5MmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xsaXRlL3hhdHRyX2NhY2hlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbGxpdGUveGF0dHJfY2FjaGUuYwpAQCAtMTMyLDE0ICsxMzIsMTAgQEAKIAkJICAgICAgIHhhdHRyLT54ZV9uYW1lbGVuKTsKIAkJZ290byBlcnJfbmFtZTsKIAl9Ci0JeGF0dHItPnhlX3ZhbHVlID0ga3phbGxvYyh4YXR0cl92YWxfbGVuLCBHRlBfTk9GUyk7Ci0JaWYgKCF4YXR0ci0+eGVfdmFsdWUpIHsKLQkJQ0RFQlVHKERfQ0FDSEUsICJmYWlsZWQgdG8gYWxsb2MgeGF0dHIgdmFsdWUgJWRcbiIsCi0JCSAgICAgICB4YXR0cl92YWxfbGVuKTsKKwl4YXR0ci0+eGVfdmFsdWUgPSBrbWVtZHVwKHhhdHRyX3ZhbCwgeGF0dHJfdmFsX2xlbiwgR0ZQX05PRlMpOworCWlmICgheGF0dHItPnhlX3ZhbHVlKQogCQlnb3RvIGVycl92YWx1ZTsKLQl9CiAKLQltZW1jcHkoeGF0dHItPnhlX3ZhbHVlLCB4YXR0cl92YWwsIHhhdHRyX3ZhbF9sZW4pOwogCXhhdHRyLT54ZV92YWxsZW4gPSB4YXR0cl92YWxfbGVuOwogCWxpc3RfYWRkKCZ4YXR0ci0+eGVfbGlzdCwgY2FjaGUpOwogCkBAIC0yOTksMTMgKzI5NSwxOCBAQAogCiAKIAltdXRleF9sb2NrKCZsbGktPmxsaV94YXR0cnNfZW5xX2xvY2spOwotCS8qIFRyeSBtYXRjaGluZyBmaXJzdC4gKi8KLQltb2RlID0gbGxfdGFrZV9tZF9sb2NrKGlub2RlLCBNRFNfSU5PREVMT0NLX1hBVFRSLCAmbG9ja2gsIDAsIExDS19QUik7Ci0JaWYgKG1vZGUgIT0gMCkgewotCQkvKiBmYWtlIG9pdCBpbiBtZGNfcmV2YWxpZGF0ZV9sb2NrKCkgbWFubmVyICovCi0JCW9pdC0+ZC5sdXN0cmUuaXRfbG9ja19oYW5kbGUgPSBsb2NraC5jb29raWU7Ci0JCW9pdC0+ZC5sdXN0cmUuaXRfbG9ja19tb2RlID0gbW9kZTsKLQkJZ290byBvdXQ7CisJLyogaW5vZGUgbWF5IGhhdmUgYmVlbiBzaHJ1bmsgYW5kIHJlY3JlYXRlZCwgc28gZGF0YSBpcyBnb25lLCBtYXRjaCBsb2NrCisJICogb25seSB3aGVuIGRhdGEgZXhpc3RzLiAqLworCWlmIChsbF94YXR0cl9jYWNoZV92YWxpZChsbGkpKSB7CisJCS8qIFRyeSBtYXRjaGluZyBmaXJzdC4gKi8KKwkJbW9kZSA9IGxsX3Rha2VfbWRfbG9jayhpbm9kZSwgTURTX0lOT0RFTE9DS19YQVRUUiwgJmxvY2toLCAwLAorCQkJCSAgICAgICBMQ0tfUFIpOworCQlpZiAobW9kZSAhPSAwKSB7CisJCQkvKiBmYWtlIG9pdCBpbiBtZGNfcmV2YWxpZGF0ZV9sb2NrKCkgbWFubmVyICovCisJCQlvaXQtPmQubHVzdHJlLml0X2xvY2tfaGFuZGxlID0gbG9ja2guY29va2llOworCQkJb2l0LT5kLmx1c3RyZS5pdF9sb2NrX21vZGUgPSBtb2RlOworCQkJZ290byBvdXQ7CisJCX0KIAl9CiAKIAkvKiBFbnF1ZXVlIGlmIHRoZSBsb2NrIGlzbid0IGNhY2hlZCBsb2NhbGx5LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9sbXZfb2JkLmMKaW5kZXggYjc3OWY0Ny4uYjk0NTlmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xtdl9vYmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbG12X29iZC5jCkBAIC00Myw3ICs0Myw3IEBACiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgotI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9sdXN0cmUvbHVzdHJlX2lkbC5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX3N1cHBvcnQuaCIKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogCQlfX3UzMiBvbGRzaXplID0gMDsKIAogCQl3aGlsZSAobmV3c2l6ZSA8IGluZGV4ICsgMSkKLQkJCW5ld3NpemUgPSBuZXdzaXplIDw8IDE7CisJCQluZXdzaXplIDw8PSAxOwogCQlPQkRfQUxMT0MobmV3dGd0cywgc2l6ZW9mKCpuZXd0Z3RzKSAqIG5ld3NpemUpOwogCQlpZiAobmV3dGd0cyA9PSBOVUxMKSB7CiAJCQlsbXZfaW5pdF91bmxvY2sobG12KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9scHJvY19sbXYuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xtdi9scHJvY19sbXYuYwppbmRleCA1YmU0MTc2Li4yMmU1YzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sbXYvbHByb2NfbG12LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG12L2xwcm9jX2xtdi5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RhdGZzLmg+CiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCisjaW5jbHVkZSAibG12X2ludGVybmFsLmgiCiAKIHN0YXRpYyBpbnQgbG12X251bW9iZF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7CkBAIC00OCw3ICs0OSw4IEBACiAKIAlMQVNTRVJUKGRldiAhPSBOVUxMKTsKIAlkZXNjID0gJmRldi0+dS5sbXYuZGVzYzsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIGRlc2MtPmxkX3RndF9jb3VudCk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIGRlc2MtPmxkX3RndF9jb3VudCk7CisJcmV0dXJuIDA7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhsbXZfbnVtb2JkKTsKIApAQCAtODIsNyArODQsOCBAQAogCiAJTEFTU0VSVChkZXYgIT0gTlVMTCk7CiAJbG12ID0gJmRldi0+dS5sbXY7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVzXG4iLCBwbGFjZW1lbnRfcG9saWN5Mm5hbWUobG12LT5sbXZfcGxhY2VtZW50KSk7CisJc2VxX3ByaW50ZihtLCAiJXNcbiIsIHBsYWNlbWVudF9wb2xpY3kybmFtZShsbXYtPmxtdl9wbGFjZW1lbnQpKTsKKwlyZXR1cm4gMDsKIH0KIAogI2RlZmluZSBNQVhfUE9MSUNZX1NUUklOR19TSVpFIDY0CkBAIC0xMzAsNyArMTMzLDggQEAKIAogCUxBU1NFUlQoZGV2ICE9IE5VTEwpOwogCWRlc2MgPSAmZGV2LT51Lmxtdi5kZXNjOwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIldVxuIiwgZGVzYy0+bGRfYWN0aXZlX3RndF9jb3VudCk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIGRlc2MtPmxkX2FjdGl2ZV90Z3RfY291bnQpOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obG12X2FjdGl2ZW9iZCk7CiAKQEAgLTE0MSw3ICsxNDUsOCBAQAogCiAJTEFTU0VSVChkZXYgIT0gTlVMTCk7CiAJbG12ID0gJmRldi0+dS5sbXY7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVzXG4iLCBsbXYtPmRlc2MubGRfdXVpZC51dWlkKTsKKwlzZXFfcHJpbnRmKG0sICIlc1xuIiwgbG12LT5kZXNjLmxkX3V1aWQudXVpZCk7CisJcmV0dXJuIDA7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhsbXZfZGVzY191dWlkKTsKIApAQCAtMTcxLDggKzE3NiwxMCBAQAogCiAJaWYgKHRndCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gc2VxX3ByaW50ZihwLCAiJWQ6ICVzICVzQUNUSVZFXG4iLCB0Z3QtPmx0ZF9pZHgsCi0JCQkgIHRndC0+bHRkX3V1aWQudXVpZCwgdGd0LT5sdGRfYWN0aXZlID8gIiIgOiAiSU4iKTsKKwlzZXFfcHJpbnRmKHAsICIlZDogJXMgJXNBQ1RJVkVcbiIsCisJCSAgIHRndC0+bHRkX2lkeCwgdGd0LT5sdGRfdXVpZC51dWlkLAorCQkgICB0Z3QtPmx0ZF9hY3RpdmUgPyAiIiA6ICJJTiIpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxtdl90Z3Rfc29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2Rldi5jCmluZGV4IDc5NmEwMTUuLjcxMWI4MzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9kZXYuYwpAQCAtNjAsNyArNjAsNyBAQAogc3RydWN0IGttZW1fY2FjaGUgKmxvdl9sb2NrX2xpbmtfa21lbTsKIAogLyoqIExvY2sgY2xhc3Mgb2YgbG92X2RldmljZTo6bGRfbXV0ZXguICovCi1zdHJ1Y3QgbG9ja19jbGFzc19rZXkgY2xfbG92X2RldmljZV9tdXRleF9jbGFzczsKK3N0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgY2xfbG92X2RldmljZV9tdXRleF9jbGFzczsKIAogc3RydWN0IGx1X2ttZW1fZGVzY3IgbG92X2NhY2hlc1tdID0gewogCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfZWEuYwppbmRleCBlOWVjMzljLi4yYmNmYWVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2VhLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9lYS5jCkBAIC0yMDksOCArMjA5LDggQEAKIAlyZXR1cm4gbHNtX2xtbV92ZXJpZnlfY29tbW9uKGxtbSwgbG1tX2J5dGVzLCAqc3RyaXBlX2NvdW50KTsKIH0KIAotaW50IGxzbV91bnBhY2ttZF92MShzdHJ1Y3QgbG92X29iZCAqbG92LCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAotCQkgICAgc3RydWN0IGxvdl9tZHNfbWRfdjEgKmxtbSkKK3N0YXRpYyBpbnQgbHNtX3VucGFja21kX3YxKHN0cnVjdCBsb3Zfb2JkICpsb3YsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCisJCQkgICBzdHJ1Y3QgbG92X21kc19tZF92MSAqbG1tKQogewogCXN0cnVjdCBsb3Zfb2luZm8gKmxvaTsKIAlpbnQgaTsKQEAgLTIyNyw2ICsyMjcsOSBAQAogCQlvc3RpZF9sZV90b19jcHUoJmxtbS0+bG1tX29iamVjdHNbaV0ubF9vc3Rfb2ksICZsb2ktPmxvaV9vaSk7CiAJCWxvaS0+bG9pX29zdF9pZHggPSBsZTMyX3RvX2NwdShsbW0tPmxtbV9vYmplY3RzW2ldLmxfb3N0X2lkeCk7CiAJCWxvaS0+bG9pX29zdF9nZW4gPSBsZTMyX3RvX2NwdShsbW0tPmxtbV9vYmplY3RzW2ldLmxfb3N0X2dlbik7CisJCWlmIChsb3Zfb2luZm9faXNfZHVtbXkobG9pKSkKKwkJCWNvbnRpbnVlOworCiAJCWlmIChsb2ktPmxvaV9vc3RfaWR4ID49IGxvdi0+ZGVzYy5sZF90Z3RfY291bnQpIHsKIAkJCUNFUlJPUigiT1NUIGluZGV4ICVkIG1vcmUgdGhhbiBPU1QgY291bnQgJWRcbiIsCiAJCQkgICAgICAgbG9pLT5sb2lfb3N0X2lkeCwgbG92LT5kZXNjLmxkX3RndF9jb3VudCk7CkBAIC0yODcsOCArMjkwLDggQEAKIAkJCQkgICAgICpzdHJpcGVfY291bnQpOwogfQogCi1pbnQgbHNtX3VucGFja21kX3YzKHN0cnVjdCBsb3Zfb2JkICpsb3YsIHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sCi0JCSAgICBzdHJ1Y3QgbG92X21kc19tZCAqbG1tdjEpCitzdGF0aWMgaW50IGxzbV91bnBhY2ttZF92MyhzdHJ1Y3QgbG92X29iZCAqbG92LCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAorCQkJICAgc3RydWN0IGxvdl9tZHNfbWQgKmxtbXYxKQogewogCXN0cnVjdCBsb3ZfbWRzX21kX3YzICpsbW07CiAJc3RydWN0IGxvdl9vaW5mbyAqbG9pOwpAQCAtMzE0LDYgKzMxNyw5IEBACiAJCW9zdGlkX2xlX3RvX2NwdSgmbG1tLT5sbW1fb2JqZWN0c1tpXS5sX29zdF9vaSwgJmxvaS0+bG9pX29pKTsKIAkJbG9pLT5sb2lfb3N0X2lkeCA9IGxlMzJfdG9fY3B1KGxtbS0+bG1tX29iamVjdHNbaV0ubF9vc3RfaWR4KTsKIAkJbG9pLT5sb2lfb3N0X2dlbiA9IGxlMzJfdG9fY3B1KGxtbS0+bG1tX29iamVjdHNbaV0ubF9vc3RfZ2VuKTsKKwkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQorCQkJY29udGludWU7CisKIAkJaWYgKGxvaS0+bG9pX29zdF9pZHggPj0gbG92LT5kZXNjLmxkX3RndF9jb3VudCkgewogCQkJQ0VSUk9SKCJPU1QgaW5kZXggJWQgbW9yZSB0aGFuIE9TVCBjb3VudCAlZFxuIiwKIAkJCSAgICAgICBsb2ktPmxvaV9vc3RfaWR4LCBsb3YtPmRlc2MubGRfdGd0X2NvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW50ZXJuYWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW50ZXJuYWwuaAppbmRleCA4Yzg1MDhiLi5iNjQ0YWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2ludGVybmFsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pbnRlcm5hbC5oCkBAIC0zMDQsNCArMzA0LDE2IEBACiAJcmV0dXJuIGxzbTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGxvdl9vaW5mb19pc19kdW1teShjb25zdCBzdHJ1Y3QgbG92X29pbmZvICpsb2kpCit7CisJaWYgKHVubGlrZWx5KGxvaS0+bG9pX29pLm9pLm9pX2lkID09IDAgJiYKKwkJICAgICBsb2ktPmxvaV9vaS5vaS5vaV9zZXEgPT0gMCAmJgorCQkgICAgIGxvaS0+bG9pX29zdF9pZHggPT0gMCAmJgorCQkgICAgIGxvaS0+bG9pX29zdF9nZW4gPT0gMCkpCisJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9pby5jCmluZGV4IGYxZjZkYjMuLmNmOTZlMGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2lvLmMKQEAgLTE0OCw2ICsxNDgsOSBAQAogCUxBU1NFUlQoc3ViLT5zdWJfZW52ID09IE5VTEwpOwogCUxBU1NFUlQoc3ViLT5zdWJfc3RyaXBlIDwgbGlvLT5saXNfc3RyaXBlX2NvdW50KTsKIAorCWlmICh1bmxpa2VseShsb3ZfcjAobG92KS0+bG9fc3ViW3N0cmlwZV0gPT0gTlVMTCkpCisJCXJldHVybiAtRUlPOworCiAJcmVzdWx0ID0gMDsKIAlzdWItPnN1Yl9pb19pbml0aWFsaXplZCA9IDA7CiAJc3ViLT5zdWJfYm9ycm93ZWQgPSAwOwpAQCAtMzkxLDcgKzM5NCwxNiBAQAogCQkJCQkgICBlbmRwb3MsICZzdGFydCwgJmVuZCkpCiAJCQljb250aW51ZTsKIAotCQllbmQgPSBsb3Zfb2Zmc2V0X21vZChlbmQsICsxKTsKKwkJaWYgKHVubGlrZWx5KGxvdl9yMChsaW8tPmxpc19vYmplY3QpLT5sb19zdWJbc3RyaXBlXSA9PSBOVUxMKSkgeworCQkJaWYgKGlvcy0+Y2lzX2lvLT5jaV90eXBlID09IENJVF9SRUFEIHx8CisJCQkgICAgaW9zLT5jaXNfaW8tPmNpX3R5cGUgPT0gQ0lUX1dSSVRFIHx8CisJCQkgICAgaW9zLT5jaXNfaW8tPmNpX3R5cGUgPT0gQ0lUX0ZBVUxUKQorCQkJCXJldHVybiAtRUlPOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWVuZCA9IGxvdl9vZmZzZXRfbW9kKGVuZCwgMSk7CiAJCXN1YiA9IGxvdl9zdWJfZ2V0KGVudiwgbGlvLCBzdHJpcGUpOwogCQlpZiAoIUlTX0VSUihzdWIpKSB7CiAJCQlsb3ZfaW9fc3ViX2luaGVyaXQoc3ViLT5zdWJfaW8sIGxpbywgc3RyaXBlLApAQCAtOTEzLDcgKzkyNSw3IEBACiAJCWJyZWFrOwogCWNhc2UgQ0lUX0ZTWU5DOgogCWNhc2UgQ0lUX1NFVEFUVFI6Ci0JCXJlc3VsdCA9ICsxOworCQlyZXN1bHQgPSAxOwogCQlicmVhazsKIAljYXNlIENJVF9XUklURToKIAkJcmVzdWx0ID0gLUVCQURGOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9sb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2xvY2suYwppbmRleCA0OWU2OTQyLi5mMmVjYTU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2xvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X2xvY2suYwpAQCAtMzA4LDcgKzMwOCw4IEBACiAJCSAqIFhYWCBmb3Igd2lkZSBzdHJpcGluZyBzbWFydGVyIGFsZ29yaXRobSBpcyBkZXNpcmFibGUsCiAJCSAqIGJyZWFraW5nIG91dCBvZiB0aGUgbG9vcCwgZWFybHkuCiAJCSAqLwotCQlpZiAobG92X3N0cmlwZV9pbnRlcnNlY3RzKGxvby0+bG9fbHNtLCBpLAorCQlpZiAobGlrZWx5KHIwLT5sb19zdWJbaV0gIT0gTlVMTCkgJiYKKwkJICAgIGxvdl9zdHJpcGVfaW50ZXJzZWN0cyhsb28tPmxvX2xzbSwgaSwKIAkJCQkJICBmaWxlX3N0YXJ0LCBmaWxlX2VuZCwgJnN0YXJ0LCAmZW5kKSkKIAkJCW5yKys7CiAJfQpAQCAtMzI2LDcgKzMyNyw4IEBACiAJICogdG9wLWxvY2suCiAJICovCiAJZm9yIChpID0gMCwgbnIgPSAwOyBpIDwgcjAtPmxvX25yOyArK2kpIHsKLQkJaWYgKGxvdl9zdHJpcGVfaW50ZXJzZWN0cyhsb28tPmxvX2xzbSwgaSwKKwkJaWYgKGxpa2VseShyMC0+bG9fc3ViW2ldICE9IE5VTEwpICYmCisJCSAgICBsb3Zfc3RyaXBlX2ludGVyc2VjdHMobG9vLT5sb19sc20sIGksCiAJCQkJCSAgZmlsZV9zdGFydCwgZmlsZV9lbmQsICZzdGFydCwgJmVuZCkpIHsKIAkJCXN0cnVjdCBjbF9sb2NrX2Rlc2NyICpkZXNjcjsKIApAQCAtOTE0LDEwICs5MTYsMjIgQEAKIAkgKi8KIAlzdGFydCA9IGNsX29mZnNldCgmbG92LT5sb19jbCwgZGVzY3ItPmNsZF9zdGFydCk7CiAJZW5kICAgPSBjbF9vZmZzZXQoJmxvdi0+bG9fY2wsIGRlc2NyLT5jbGRfZW5kICsgMSkgLSAxOwotCXJlc3VsdCA9IGVuZCAtIHN0YXJ0IDw9IGxzbS0+bHNtX3N0cmlwZV9zaXplICYmCi0JCSBzdHJpcGUgPT0gbG92X3N0cmlwZV9udW1iZXIobHNtLCBzdGFydCkgJiYKLQkJIHN0cmlwZSA9PSBsb3Zfc3RyaXBlX251bWJlcihsc20sIGVuZCk7Ci0JaWYgKHJlc3VsdCkgeworCXJlc3VsdCA9IDA7CisJLyogZ2xpbXBzZSBzaG91bGQgd29yayBvbiB0aGUgb2JqZWN0IHdpdGggTE9WIEVBIGhvbGUuICovCisJaWYgKGVuZCAtIHN0YXJ0IDw9IGxzbS0+bHNtX3N0cmlwZV9zaXplKSB7CisJCWludCBpZHg7CisKKwkJaWR4ID0gbG92X3N0cmlwZV9udW1iZXIobHNtLCBzdGFydCk7CisJCWlmIChpZHggPT0gc3RyaXBlIHx8CisJCSAgICB1bmxpa2VseShsb3ZfcjAobG92KS0+bG9fc3ViW2lkeF0gPT0gTlVMTCkpIHsKKwkJCWlkeCA9IGxvdl9zdHJpcGVfbnVtYmVyKGxzbSwgZW5kKTsKKwkJCWlmIChpZHggPT0gc3RyaXBlIHx8CisJCQkgICAgdW5saWtlbHkobG92X3IwKGxvdiktPmxvX3N1YltpZHhdID09IE5VTEwpKQorCQkJCXJlc3VsdCA9IDE7CisJCX0KKwl9CisKKwlpZiAocmVzdWx0ICE9IDApIHsKIAkJc3RydWN0IGNsX2xvY2tfZGVzY3IgKnN1YmQgPSAmbG92X2Vudl9pbmZvKGVudiktPmx0aV9sZGVzY3I7CiAJCXU2NCBzdWJfc3RhcnQ7CiAJCXU2NCBzdWJfZW5kOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JkLmMKaW5kZXggZWE1MDNkMi4uMDI3ODE1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iZC5jCkBAIC01NTMsNyArNTUzLDcgQEAKIAogCQluZXdzaXplID0gbWF4X3QoX191MzIsIGxvdi0+bG92X3RndF9zaXplLCAyKTsKIAkJd2hpbGUgKG5ld3NpemUgPCBpbmRleCArIDEpCi0JCQluZXdzaXplID0gbmV3c2l6ZSA8PCAxOworCQkJbmV3c2l6ZSA8PD0gMTsKIAkJT0JEX0FMTE9DKG5ld3RndHMsIHNpemVvZigqbmV3dGd0cykgKiBuZXdzaXplKTsKIAkJaWYgKG5ld3RndHMgPT0gTlVMTCkgewogCQkJbXV0ZXhfdW5sb2NrKCZsb3YtPmxvdl9sb2NrKTsKQEAgLTEwMTEsOSArMTAxMSwxMyBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBsc20tPmxzbV9zdHJpcGVfY291bnQ7IGkrKykgewotCQlpZiAobHNtLT5sc21fb2luZm9baV0tPmxvaV9vc3RfaWR4ID09IG9zdF9pZHgpIHsKLQkJCWlmIChvc3RpZF9pZCgmbHNtLT5sc21fb2luZm9baV0tPmxvaV9vaSkgIT0KLQkJCQkJb3N0aWRfaWQoJnNyY19vYS0+b19vaSkpIHsKKwkJc3RydWN0IGxvdl9vaW5mbyAqbG9pID0gbHNtLT5sc21fb2luZm9baV07CisKKwkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQorCQkJY29udGludWU7CisKKwkJaWYgKGxvaS0+bG9pX29zdF9pZHggPT0gb3N0X2lkeCkgeworCQkJaWYgKG9zdGlkX2lkKCZsb2ktPmxvaV9vaSkgIT0gb3N0aWRfaWQoJnNyY19vYS0+b19vaSkpIHsKIAkJCQlyYyA9IC1FSU5WQUw7CiAJCQkJZ290byBvdXQ7CiAJCQl9CkBAIC0xMzA1LDEwICsxMzA5LDE0IEBACiAJCXN0cnVjdCBsb3Zfc3RyaXBlX21kIHN1Ym1kOwogCQlzdHJ1Y3QgbG92X29pbmZvICpsb2kgPSBsc20tPmxzbV9vaW5mb1tpXTsKIAorCQlpZiAobG92X29pbmZvX2lzX2R1bW15KGxvaSkpCisJCQljb250aW51ZTsKKwogCQlpZiAoIWxvdi0+bG92X3RndHNbbG9pLT5sb2lfb3N0X2lkeF0pIHsKLQkJCUNERUJVRyhEX0hBLCAibG92IGlkeCAlZCBOVUxMIFxuIiwgbG9pLT5sb2lfb3N0X2lkeCk7CisJCQlDREVCVUcoRF9IQSwgImxvdiBpZHggJWQgTlVMTFxuIiwgbG9pLT5sb2lfb3N0X2lkeCk7CiAJCQljb250aW51ZTsKIAkJfQorCiAJCXN1Ym1kLmxzbV9vaSA9IGxvaS0+bG9pX29pOwogCQlzdWJtZC5sc21fc3RyaXBlX2NvdW50ID0gMDsKIAkJcmMgPSBvYmRfZmluZF9jYmRhdGEobG92LT5sb3ZfdGd0c1tsb2ktPmxvaV9vc3RfaWR4XS0+bHRkX2V4cCwKQEAgLTE2MDEsOSArMTYwOSw5IEBACiAgKiBccGFyYW0gZm1fZW5kIGxvZ2ljYWwgZW5kIG9mIG1hcHBpbmcKICAqIFxwYXJhbSBzdGFydF9zdHJpcGUgc3RhcnRpbmcgc3RyaXBlIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhpcwogICovCi11NjQgZmllbWFwX2NhbGNfZm1fZW5kX29mZnNldChzdHJ1Y3QgbGxfdXNlcl9maWVtYXAgKmZpZW1hcCwKLQkJCQkgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLCB1NjQgZm1fc3RhcnQsCi0JCQkJICAgdTY0IGZtX2VuZCwgaW50ICpzdGFydF9zdHJpcGUpCitzdGF0aWMgdTY0IGZpZW1hcF9jYWxjX2ZtX2VuZF9vZmZzZXQoc3RydWN0IGxsX3VzZXJfZmllbWFwICpmaWVtYXAsCisJCQkJICAgICBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLCB1NjQgZm1fc3RhcnQsCisJCQkJICAgICB1NjQgZm1fZW5kLCBpbnQgKnN0YXJ0X3N0cmlwZSkKIHsKIAl1NjQgbG9jYWxfZW5kID0gZmllbWFwLT5mbV9leHRlbnRzWzBdLmZlX2xvZ2ljYWw7CiAJdTY0IGx1bl9zdGFydCwgbHVuX2VuZDsKQEAgLTE2MTYsOCArMTYyNCwxMiBAQAogCiAJLyogRmluZCBvdXQgc3RyaXBlX25vIGZyb20gb3N0X2luZGV4IHNhdmVkIGluIHRoZSBmZV9kZXZpY2UgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fc3RyaXBlX2NvdW50OyBpKyspIHsKLQkJaWYgKGxzbS0+bHNtX29pbmZvW2ldLT5sb2lfb3N0X2lkeCA9PQotCQkJCQlmaWVtYXAtPmZtX2V4dGVudHNbMF0uZmVfZGV2aWNlKSB7CisJCXN0cnVjdCBsb3Zfb2luZm8gKm9pbmZvID0gbHNtLT5sc21fb2luZm9baV07CisKKwkJaWYgKGxvdl9vaW5mb19pc19kdW1teShvaW5mbykpCisJCQljb250aW51ZTsKKworCQlpZiAob2luZm8tPmxvaV9vc3RfaWR4ID09IGZpZW1hcC0+Zm1fZXh0ZW50c1swXS5mZV9kZXZpY2UpIHsKIAkJCXN0cmlwZV9ubyA9IGk7CiAJCQlicmVhazsKIAkJfQpAQCAtMTY1OCwxNyArMTY3MCwxNyBAQAogICoKICAqIFxyZXR2YWwgbGFzdF9zdHJpcGUgcmV0dXJuIHRoZSBsYXN0IHN0cmlwZSBvZiB0aGUgbWFwcGluZwogICovCi1pbnQgZmllbWFwX2NhbGNfbGFzdF9zdHJpcGUoc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwgdTY0IGZtX3N0YXJ0LAotCQkJICAgIHU2NCBmbV9lbmQsIGludCBzdGFydF9zdHJpcGUsCi0JCQkgICAgaW50ICpzdHJpcGVfY291bnQpCitzdGF0aWMgaW50IGZpZW1hcF9jYWxjX2xhc3Rfc3RyaXBlKHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20sIHU2NCBmbV9zdGFydCwKKwkJCQkgICB1NjQgZm1fZW5kLCBpbnQgc3RhcnRfc3RyaXBlLAorCQkJCSAgIGludCAqc3RyaXBlX2NvdW50KQogewogCWludCBsYXN0X3N0cmlwZTsKIAl1NjQgb2JkX3N0YXJ0LCBvYmRfZW5kOwogCWludCBpLCBqOwogCiAJaWYgKGZtX2VuZCAtIGZtX3N0YXJ0ID4gbHNtLT5sc21fc3RyaXBlX3NpemUgKiBsc20tPmxzbV9zdHJpcGVfY291bnQpIHsKLQkJbGFzdF9zdHJpcGUgPSAoc3RhcnRfc3RyaXBlIDwgMSA/IGxzbS0+bHNtX3N0cmlwZV9jb3VudCAtIDEgOgotCQkJCQkJCSAgICAgIHN0YXJ0X3N0cmlwZSAtIDEpOworCQlsYXN0X3N0cmlwZSA9IHN0YXJ0X3N0cmlwZSA8IDEgPyBsc20tPmxzbV9zdHJpcGVfY291bnQgLSAxIDoKKwkJCQkJCQkgICAgICBzdGFydF9zdHJpcGUgLSAxOwogCQkqc3RyaXBlX2NvdW50ID0gbHNtLT5sc21fc3RyaXBlX2NvdW50OwogCX0gZWxzZSB7CiAJCWZvciAoaiA9IDAsIGkgPSBzdGFydF9zdHJpcGU7IGogPCBsc20tPmxzbV9zdHJpcGVfY291bnQ7CkBAIC0xNjk0LDEwICsxNzA2LDEwIEBACiAgKiBccGFyYW0gZXh0X2NvdW50IG51bWJlciBvZiBleHRlbnRzIHRvIGJlIGNvcGllZAogICogXHBhcmFtIGN1cnJlbnRfZXh0ZW50IHdoZXJlIHRvIHN0YXJ0IGNvcHlpbmcgaW4gbWFpbiBleHRlbnQgYXJyYXkKICAqLwotdm9pZCBmaWVtYXBfcHJlcGFyZV9hbmRfY29weV9leHRzKHN0cnVjdCBsbF91c2VyX2ZpZW1hcCAqZmllbWFwLAotCQkJCSAgc3RydWN0IGxsX2ZpZW1hcF9leHRlbnQgKmxjbF9mbV9leHQsCi0JCQkJICBpbnQgb3N0X2luZGV4LCB1bnNpZ25lZCBpbnQgZXh0X2NvdW50LAotCQkJCSAgaW50IGN1cnJlbnRfZXh0ZW50KQorc3RhdGljIHZvaWQgZmllbWFwX3ByZXBhcmVfYW5kX2NvcHlfZXh0cyhzdHJ1Y3QgbGxfdXNlcl9maWVtYXAgKmZpZW1hcCwKKwkJCQkJIHN0cnVjdCBsbF9maWVtYXBfZXh0ZW50ICpsY2xfZm1fZXh0LAorCQkJCQkgaW50IG9zdF9pbmRleCwgdW5zaWduZWQgaW50IGV4dF9jb3VudCwKKwkJCQkJIGludCBjdXJyZW50X2V4dGVudCkKIHsKIAljaGFyICp0bzsKIAlpbnQgZXh0OwpAQCAtMTc5NSw2ICsxODA3LDExIEBACiAJCQkJCSAgICZsdW5fc3RhcnQsICZvYmRfb2JqZWN0X2VuZCkpID09IDApCiAJCQljb250aW51ZTsKIAorCQlpZiAobG92X29pbmZvX2lzX2R1bW15KGxzbS0+bHNtX29pbmZvW2N1cl9zdHJpcGVdKSkgeworCQkJcmMgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwogCQkvKiBJZiB0aGlzIGlzIGEgY29udGludWF0aW9uIEZJRU1BUCBjYWxsIGFuZCB3ZSBhcmUgb24KIAkJICogc3RhcnRpbmcgc3RyaXBlIHRoZW4gbHVuX3N0YXJ0IG5lZWRzIHRvIGJlIHNldCB0bwogCQkgKiBmbV9lbmRfb2Zmc2V0ICovCkBAIC0xOTg1LDYgKzIwMDIsOSBAQAogCQkgKiBiZSBOVUxMIGFuZCB3b24ndCBtYXRjaCB0aGUgbG9jaydzIGV4cG9ydC4gKi8KIAkJZm9yIChpID0gMDsgaSA8IGxzbS0+bHNtX3N0cmlwZV9jb3VudDsgaSsrKSB7CiAJCQlsb2kgPSBsc20tPmxzbV9vaW5mb1tpXTsKKwkJCWlmIChsb3Zfb2luZm9faXNfZHVtbXkobG9pKSkKKwkJCQljb250aW51ZTsKKwogCQkJaWYgKCFsb3YtPmxvdl90Z3RzW2xvaS0+bG9pX29zdF9pZHhdKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKGxvdi0+bG92X3RndHNbbG9pLT5sb2lfb3N0X2lkeF0tPmx0ZF9leHAgPT0KQEAgLTIyOTAsNyArMjMxMCw3IEBACiAJcmV0dXJuIHJjOwogfQogCi1zdHJ1Y3Qgb2JkX29wcyBsb3Zfb2JkX29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgb2JkX29wcyBsb3Zfb2JkX29wcyA9IHsKIAkub19vd25lcgkgICAgICAgPSBUSElTX01PRFVMRSwKIAkub19zZXR1cAkgICAgICAgPSBsb3Zfc2V0dXAsCiAJLm9fcHJlY2xlYW51cAkgID0gbG92X3ByZWNsZWFudXAsCkBAIC0yMzI0LDcgKzIzNDQsNyBAQAogCiBzdHJ1Y3Qga21lbV9jYWNoZSAqbG92X29pbmZvX3NsYWI7CiAKLWludCBfX2luaXQgbG92X2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGxvdl9pbml0KHZvaWQpCiB7CiAJc3RydWN0IGxwcm9jZnNfc3RhdGljX3ZhcnMgbHZhcnMgPSB7IE5VTEwgfTsKIAlpbnQgcmM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9vYmplY3QuYwppbmRleCA0Y2FiNzMwLi5hMjIzNDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X29iamVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3Zfb2JqZWN0LmMKQEAgLTQyLDYgKzQyLDcgQEAKICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfTE9WCiAKICNpbmNsdWRlICJsb3ZfY2xfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICIuLi9pbmNsdWRlL2xjbGllbnQuaCIKIAogLyoqIFxhZGR0b2dyb3VwIGxvdgogICogIEB7CkBAIC0yMzAsNiArMjMxLDkgQEAKIAkJCXN0cnVjdCBsb3Zfb2luZm8gKm9pbmZvID0gbHNtLT5sc21fb2luZm9baV07CiAJCQlpbnQgb3N0X2lkeCA9IG9pbmZvLT5sb2lfb3N0X2lkeDsKIAorCQkJaWYgKGxvdl9vaW5mb19pc19kdW1teShvaW5mbykpCisJCQkJY29udGludWU7CisKIAkJCXJlc3VsdCA9IG9zdGlkX3RvX2ZpZChvZmlkLCAmb2luZm8tPmxvaV9vaSwKIAkJCQkJICAgICAgb2luZm8tPmxvaV9vc3RfaWR4KTsKIAkJCWlmIChyZXN1bHQgIT0gMCkKQEAgLTU2Myw3ICs1NjcsNyBAQAogLyoqCiAgKiBSZXR1cm4gbG92X2xheW91dF90eXBlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGxzbQogICovCi1lbnVtIGxvdl9sYXlvdXRfdHlwZSBsb3ZfdHlwZShzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtKQorc3RhdGljIGVudW0gbG92X2xheW91dF90eXBlIGxvdl90eXBlKHN0cnVjdCBsb3Zfc3RyaXBlX21kICpsc20pCiB7CiAJaWYgKGxzbSA9PSBOVUxMKQogCQlyZXR1cm4gTExUX0VNUFRZOwpAQCAtOTczLDYgKzk3NywxMCBAQAogCQkJTEFTU0VSVChsc20gIT0gTlVMTCk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgbHNtLT5sc21fc3RyaXBlX2NvdW50OyBpKyspIHsKIAkJCQlzdHJ1Y3QgbG92X29pbmZvICpsb2kgPSBsc20tPmxzbV9vaW5mb1tpXTsKKworCQkJCWlmIChsb3Zfb2luZm9faXNfZHVtbXkobG9pKSkKKwkJCQkJY29udGludWU7CisKIAkJCQlpZiAobG9pLT5sb2lfYXIuYXJfcmMgJiYgIXJjKQogCQkJCQlyYyA9IGxvaS0+bG9pX2FyLmFyX3JjOwogCQkJCWxvaS0+bG9pX2FyLmFyX3JjID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9sb3ZfcG9vbC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wb29sLmMKaW5kZXggMGUwZWE2MC4uZDk2MTYzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wb29sLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9wb29sLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAl9CiB9CiAKLXZvaWQgbG92X3Bvb2xfcHV0cmVmX2xvY2tlZChzdHJ1Y3QgcG9vbF9kZXNjICpwb29sKQorc3RhdGljIHZvaWQgbG92X3Bvb2xfcHV0cmVmX2xvY2tlZChzdHJ1Y3QgcG9vbF9kZXNjICpwb29sKQogewogCUNERUJVRyhEX0lORk8sICJwb29sICVwXG4iLCBwb29sKTsKIAlMQVNTRVJUKGF0b21pY19yZWFkKCZwb29sLT5wb29sX3JlZmNvdW50KSA+IDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbG92X3JlcXVlc3QuYwppbmRleCA3MzU4YjlkMi4uOTMzZTJkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xvdl9yZXF1ZXN0LmMKQEAgLTI5OSw2ICsyOTksOSBAQAogCQlzdHJ1Y3QgbG92X3JlcXVlc3QgKnJlcTsKIAogCQlsb2kgPSBvaW5mby0+b2lfbWQtPmxzbV9vaW5mb1tpXTsKKwkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQorCQkJY29udGludWU7CisKIAkJaWYgKCFsb3ZfY2hlY2tfYW5kX3dhaXRfYWN0aXZlKGxvdiwgbG9pLT5sb2lfb3N0X2lkeCkpIHsKIAkJCUNERUJVRyhEX0hBLCAibG92IGlkeCAlZCBpbmFjdGl2ZVxuIiwgbG9pLT5sb2lfb3N0X2lkeCk7CiAJCQlpZiAob2luZm8tPm9pX29hLT5vX3ZhbGlkICYgT0JEX01EX0ZMRVBPQ0gpIHsKQEAgLTM4NCw2ICszODcsOSBAQAogCQlzdHJ1Y3QgbG92X3JlcXVlc3QgKnJlcTsKIAogCQlsb2kgPSBsc20tPmxzbV9vaW5mb1tpXTsKKwkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQorCQkJY29udGludWU7CisKIAkJaWYgKCFsb3ZfY2hlY2tfYW5kX3dhaXRfYWN0aXZlKGxvdiwgbG9pLT5sb2lfb3N0X2lkeCkpIHsKIAkJCUNERUJVRyhEX0hBLCAibG92IGlkeCAlZCBpbmFjdGl2ZVxuIiwgbG9pLT5sb2lfb3N0X2lkeCk7CiAJCQljb250aW51ZTsKQEAgLTQ5Nyw2ICs1MDMsOSBAQAogCQlzdHJ1Y3QgbG92X29pbmZvICpsb2kgPSBvaW5mby0+b2lfbWQtPmxzbV9vaW5mb1tpXTsKIAkJc3RydWN0IGxvdl9yZXF1ZXN0ICpyZXE7CiAKKwkJaWYgKGxvdl9vaW5mb19pc19kdW1teShsb2kpKQorCQkJY29udGludWU7CisKIAkJaWYgKCFsb3ZfY2hlY2tfYW5kX3dhaXRfYWN0aXZlKGxvdiwgbG9pLT5sb2lfb3N0X2lkeCkpIHsKIAkJCUNERUJVRyhEX0hBLCAibG92IGlkeCAlZCBpbmFjdGl2ZVxuIiwgbG9pLT5sb2lfb3N0X2lkeCk7CiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9scHJvY19sb3YuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL2xvdi9scHJvY19sb3YuYwppbmRleCBjOTlmMmY0Li4xNzRjYmY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9sb3YvbHByb2NfbG92LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbG92L2xwcm9jX2xvdi5jCkBAIC0zNSw3ICszNSw3IEBACiAgKi8KICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfQ0xBU1MKIAotI2luY2x1ZGUgPGFzbS9zdGF0ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfY2xhc3MuaCIKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtNDgsNyArNDgsOCBAQAogCiAJTEFTU0VSVChkZXYgIT0gTlVMTCk7CiAJZGVzYyA9ICZkZXYtPnUubG92LmRlc2M7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVsbHVcbiIsIGRlc2MtPmxkX2RlZmF1bHRfc3RyaXBlX3NpemUpOworCXNlcV9wcmludGYobSwgIiVsbHVcbiIsIGRlc2MtPmxkX2RlZmF1bHRfc3RyaXBlX3NpemUpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBsb3Zfc3RyaXBlc2l6ZV9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC03OSw3ICs4MCw4IEBACiAKIAlMQVNTRVJUKGRldiAhPSBOVUxMKTsKIAlkZXNjID0gJmRldi0+dS5sb3YuZGVzYzsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgZGVzYy0+bGRfZGVmYXVsdF9zdHJpcGVfb2Zmc2V0KTsKKwlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCBkZXNjLT5sZF9kZWZhdWx0X3N0cmlwZV9vZmZzZXQpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBsb3Zfc3RyaXBlb2Zmc2V0X3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTEwOSw3ICsxMTEsOCBAQAogCiAJTEFTU0VSVChkZXYgIT0gTlVMTCk7CiAJZGVzYyA9ICZkZXYtPnUubG92LmRlc2M7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiV1XG4iLCBkZXNjLT5sZF9wYXR0ZXJuKTsKKwlzZXFfcHJpbnRmKG0sICIldVxuIiwgZGVzYy0+bGRfcGF0dGVybik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGxvdl9zdHJpcGV0eXBlX3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTEzOSw4ICsxNDIsOCBAQAogCiAJTEFTU0VSVChkZXYgIT0gTlVMTCk7CiAJZGVzYyA9ICZkZXYtPnUubG92LmRlc2M7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVkXG4iLAotCQkJKF9fczE2KShkZXNjLT5sZF9kZWZhdWx0X3N0cmlwZV9jb3VudCArIDEpIC0gMSk7CisJc2VxX3ByaW50ZihtLCAiJWRcbiIsIChfX3MxNikoZGVzYy0+bGRfZGVmYXVsdF9zdHJpcGVfY291bnQgKyAxKSAtIDEpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBsb3Zfc3RyaXBlY291bnRfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMTcwLDcgKzE3Myw4IEBACiAKIAlMQVNTRVJUKGRldiAhPSBOVUxMKTsKIAlkZXNjID0gJmRldi0+dS5sb3YuZGVzYzsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIGRlc2MtPmxkX3RndF9jb3VudCk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIGRlc2MtPmxkX3RndF9jb3VudCk7CisJcmV0dXJuIDA7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhsb3ZfbnVtb2JkKTsKIApAQCAtMTgxLDcgKzE4NSw4IEBACiAKIAlMQVNTRVJUKGRldiAhPSBOVUxMKTsKIAlkZXNjID0gJmRldi0+dS5sb3YuZGVzYzsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIGRlc2MtPmxkX2FjdGl2ZV90Z3RfY291bnQpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBkZXNjLT5sZF9hY3RpdmVfdGd0X2NvdW50KTsKKwlyZXR1cm4gMDsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKGxvdl9hY3RpdmVvYmQpOwogCkBAIC0xOTIsNyArMTk3LDggQEAKIAogCUxBU1NFUlQoZGV2ICE9IE5VTEwpOwogCWxvdiA9ICZkZXYtPnUubG92OwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlc1xuIiwgbG92LT5kZXNjLmxkX3V1aWQudXVpZCk7CisJc2VxX3ByaW50ZihtLCAiJXNcbiIsIGxvdi0+ZGVzYy5sZF91dWlkLnV1aWQpOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8obG92X2Rlc2NfdXVpZCk7CiAKQEAgLTIyOCwxMiArMjM0LDE0IEBACiBzdGF0aWMgaW50IGxvdl90Z3Rfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpwLCB2b2lkICp2KQogewogCXN0cnVjdCBsb3ZfdGd0X2Rlc2MgKnRndCA9IHY7Ci0JcmV0dXJuIHNlcV9wcmludGYocCwgIiVkOiAlcyAlc0FDVElWRVxuIiwgdGd0LT5sdGRfaW5kZXgsCi0JCQkgIG9iZF91dWlkMnN0cigmdGd0LT5sdGRfdXVpZCksCi0JCQkgIHRndC0+bHRkX2FjdGl2ZSA/ICIiIDogIklOIik7CisKKwlzZXFfcHJpbnRmKHAsICIlZDogJXMgJXNBQ1RJVkVcbiIsCisJCSAgIHRndC0+bHRkX2luZGV4LCBvYmRfdXVpZDJzdHIoJnRndC0+bHRkX3V1aWQpLAorCQkgICB0Z3QtPmx0ZF9hY3RpdmUgPyAiIiA6ICJJTiIpOworCXJldHVybiAwOwogfQogCi1zdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbG92X3RndF9zb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBsb3ZfdGd0X3NvcHMgPSB7CiAJLnN0YXJ0ID0gbG92X3RndF9zZXFfc3RhcnQsCiAJLnN0b3AgPSBsb3ZfdGd0X3NlcV9zdG9wLAogCS5uZXh0ID0gbG92X3RndF9zZXFfbmV4dCwKQEAgLTI2Miw3ICsyNzAsNyBAQAogTFBST0NfU0VRX0ZPUFNfUk9fVFlQRShsb3YsIGtieXRlc2ZyZWUpOwogTFBST0NfU0VRX0ZPUFNfUk9fVFlQRShsb3YsIGtieXRlc2F2YWlsKTsKIAotc3RydWN0IGxwcm9jZnNfdmFycyBscHJvY2ZzX2xvdl9vYmRfdmFyc1tdID0geworc3RhdGljIHN0cnVjdCBscHJvY2ZzX3ZhcnMgbHByb2Nmc19sb3Zfb2JkX3ZhcnNbXSA9IHsKIAl7ICJ1dWlkIiwJICAmbG92X3V1aWRfZm9wcywJICBOVUxMLCAwIH0sCiAJeyAic3RyaXBlc2l6ZSIsICAgJmxvdl9zdHJpcGVzaXplX2ZvcHMsICAgTlVMTCB9LAogCXsgInN0cmlwZW9mZnNldCIsICZsb3Zfc3RyaXBlb2Zmc2V0X2ZvcHMsIE5VTEwgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9scHJvY19tZGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9scHJvY19tZGMuYwppbmRleCBjNzkxOTQxLi5hY2ZlMDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbHByb2NfbWRjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWRjL2xwcm9jX21kYy5jCkBAIC0zOCwxNyArMzgsMTggQEAKICNpbmNsdWRlIDxsaW51eC92ZnMuaD4KICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9jbGFzcy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKKyNpbmNsdWRlICJtZGNfaW50ZXJuYWwuaCIKIAogc3RhdGljIGludCBtZGNfbWF4X3JwY3NfaW5fZmxpZ2h0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmRldi0+dS5jbGk7Ci0JaW50IHJjOwogCiAJY2xpZW50X29iZF9saXN0X2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JcmMgPSBzZXFfcHJpbnRmKG0sICIldVxuIiwgY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCk7CiAJY2xpZW50X29iZF9saXN0X3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgbWRjX21heF9ycGNzX2luX2ZsaWdodF9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9tZGMvbWRjX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCmluZGV4IGVmMjc0NDcuLmY4ZWY1ZmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21kYy9tZGNfcmVxdWVzdC5jCkBAIC00ODEsNiArNDgxLDkgQEAKIAkJcmV0dXJuIC1FUFJPVE87CiAKIAlhY2wgPSBwb3NpeF9hY2xfZnJvbV94YXR0cigmaW5pdF91c2VyX25zLCBidWYsIGJvZHktPmFjbHNpemUpOworCWlmIChhY2wgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKIAlpZiAoSVNfRVJSKGFjbCkpIHsKIAkJcmMgPSBQVFJfRVJSKGFjbCk7CiAJCUNFUlJPUigiY29udmVydCB4YXR0ciB0byBhY2w6ICVkXG4iLCByYyk7CkBAIC0yNzA3LDE0ICsyNzEwLDEyIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IG1kY19pbml0KHZvaWQpCiB7Ci0JaW50IHJjOwogCXN0cnVjdCBscHJvY2ZzX3N0YXRpY192YXJzIGx2YXJzID0geyBOVUxMIH07CiAKIAlscHJvY2ZzX21kY19pbml0X3ZhcnMoJmx2YXJzKTsKIAotCXJjID0gY2xhc3NfcmVnaXN0ZXJfdHlwZSgmbWRjX29iZF9vcHMsICZtZGNfbWRfb3BzLCBsdmFycy5tb2R1bGVfdmFycywKKwlyZXR1cm4gY2xhc3NfcmVnaXN0ZXJfdHlwZSgmbWRjX29iZF9vcHMsICZtZGNfbWRfb3BzLCBsdmFycy5tb2R1bGVfdmFycywKIAkJCQkgTFVTVFJFX01EQ19OQU1FLCBOVUxMKTsKLQlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIC8qX19leGl0Ki8gbWRjX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL21nYy9tZ2NfcmVxdWVzdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKaW5kZXggNjBkMmIwZi4uNzk0N2FlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvbWdjL21nY19yZXF1ZXN0LmMKQEAgLTk1LDcgKzk1LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wobWdjX2ZzbmFtZTJyZXNpZCk7CiAKLWludCBtZ2NfbG9nbmFtZTJyZXNpZChjaGFyICpsb2duYW1lLCBzdHJ1Y3QgbGRsbV9yZXNfaWQgKnJlc19pZCwgaW50IHR5cGUpCitzdGF0aWMgaW50IG1nY19sb2duYW1lMnJlc2lkKGNoYXIgKmxvZ25hbWUsIHN0cnVjdCBsZGxtX3Jlc19pZCAqcmVzX2lkLCBpbnQgdHlwZSkKIHsKIAljaGFyICpuYW1lX2VuZDsKIAlpbnQgbGVuOwpAQCAtMTYwLDcgKzE2MCw3IEBACiB7CiAJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNsZDsKIAlzdHJ1Y3QgY29uZmlnX2xsb2dfZGF0YSAqZm91bmQgPSBOVUxMOwotCXZvaWQgKgkJICAgaW5zdGFuY2U7CisJdm9pZCAqaW5zdGFuY2U7CiAKIAlMQVNTRVJUKGxvZ25hbWUgIT0gTlVMTCk7CiAKQEAgLTQ1MiwxMCArNDUyLDE0IEBACiBpbnQgbHByb2Nmc19tZ2NfcmRfaXJfc3RhdGUoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBvYmRfZGV2aWNlICAgICAgICpvYmQgPSBkYXRhOwotCXN0cnVjdCBvYmRfaW1wb3J0ICAgICAgICppbXAgPSBvYmQtPnUuY2xpLmNsX2ltcG9ydDsKLQlzdHJ1Y3Qgb2JkX2Nvbm5lY3RfZGF0YSAqb2NkID0gJmltcC0+aW1wX2Nvbm5lY3RfZGF0YTsKKwlzdHJ1Y3Qgb2JkX2ltcG9ydCAgICAgICAqaW1wOworCXN0cnVjdCBvYmRfY29ubmVjdF9kYXRhICpvY2Q7CiAJc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNsZDsKIAorCUxQUk9DRlNfQ0xJTVBfQ0hFQ0sob2JkKTsKKwlpbXAgPSBvYmQtPnUuY2xpLmNsX2ltcG9ydDsKKwlvY2QgPSAmaW1wLT5pbXBfY29ubmVjdF9kYXRhOworCiAJc2VxX3ByaW50ZihtLCAiaW1wZXJhdGl2ZV9yZWNvdmVyeTogJXNcbiIsCiAJCSAgICAgIE9DRF9IQVNfRkxBRyhvY2QsIElNUF9SRUNPVikgPyAiRU5BQkxFRCIgOiAiRElTQUJMRUQiKTsKIAlzZXFfcHJpbnRmKG0sICJjbGllbnRfc3RhdGU6XG4iKTsKQEAgLTQ3MCw2ICs0NzQsNyBAQAogCX0KIAlzcGluX3VubG9jaygmY29uZmlnX2xpc3RfbG9jayk7CiAKKwlMUFJPQ0ZTX0NMSU1QX0VYSVQob2JkKTsKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgpAQCAtNDc5LDkgKzQ4NCwxMSBAQAogI2RlZmluZSBSUV9OT1cgICAgIDB4MgogI2RlZmluZSBSUV9MQVRFUiAgIDB4NAogI2RlZmluZSBSUV9TVE9QICAgIDB4OAotc3RhdGljIGludAkJICAgIHJxX3N0YXRlID0gMDsKKyNkZWZpbmUgUlFfUFJFQ0xFQU5VUCAgMHgxMAorc3RhdGljIGludCBycV9zdGF0ZTsKIHN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdAkgICAgcnFfd2FpdHE7CiBzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKHJxX2V4aXQpOworc3RhdGljIERFQ0xBUkVfQ09NUExFVElPTihycV9zdGFydCk7CiAKIHN0YXRpYyB2b2lkIGRvX3JlcXVldWUoc3RydWN0IGNvbmZpZ19sbG9nX2RhdGEgKmNsZCkKIHsKQEAgLTUxMCw2ICs1MTcsOCBAQAogCiBzdGF0aWMgaW50IG1nY19yZXF1ZXVlX3RocmVhZCh2b2lkICpkYXRhKQogeworCWJvb2wgZmlyc3QgPSB0cnVlOworCiAJQ0RFQlVHKERfTUdDLCAiU3RhcnRpbmcgcmVxdWV1ZSB0aHJlYWRcbiIpOwogCiAJLyogS2VlcCB0cnlpbmcgZmFpbGVkIGxvY2tzIHBlcmlvZGljYWxseSAqLwpAQCAtNTI2LDEzICs1MzUsMTkgQEAKIAkJcnFfc3RhdGUgJj0gfihSUV9OT1cgfCBSUV9MQVRFUik7CiAJCXNwaW5fdW5sb2NrKCZjb25maWdfbGlzdF9sb2NrKTsKIAorCQlpZiAoZmlyc3QpIHsKKwkJCWZpcnN0ID0gZmFsc2U7CisJCQljb21wbGV0ZSgmcnFfc3RhcnQpOworCQl9CisKIAkJLyogQWx3YXlzIHdhaXQgYSBmZXcgc2Vjb25kcyB0byBhbGxvdyB0aGUgc2VydmVyIHdobwogCQkgICBjYXVzZWQgdGhlIGxvY2sgcmV2b2NhdGlvbiB0byBmaW5pc2ggaXRzIHNldHVwLCBwbHVzIHNvbWUKIAkJICAgcmFuZG9tIHNvIGV2ZXJ5b25lIGRvZXNuJ3QgdHJ5IHRvIHJlY29ubmVjdCBhdCBvbmNlLiAqLwogCQl0byA9IE1HQ19USU1FT1VUX01JTl9TRUNPTkRTICogSFo7CiAJCXRvICs9IHJhbmQgKiBIWiAvIDEwMDsgLyogcmFuZCBpcyBjZW50aS1zZWNvbmRzICovCiAJCWx3aSA9IExXSV9USU1FT1VUKHRvLCBOVUxMLCBOVUxMKTsKLQkJbF93YWl0X2V2ZW50KHJxX3dhaXRxLCBycV9zdGF0ZSAmIFJRX1NUT1AsICZsd2kpOworCQlsX3dhaXRfZXZlbnQocnFfd2FpdHEsIHJxX3N0YXRlICYgKFJRX1NUT1AgfCBSUV9QUkVDTEVBTlVQKSwKKwkJCSAgICAgJmx3aSk7CiAKIAkJLyoKIAkJICogaXRlcmF0ZSAmIHByb2Nlc3NpbmcgdGhyb3VnaCB0aGUgbGlzdC4gZm9yIGVhY2ggY2xkLCBwcm9jZXNzCkBAIC01NDUsNiArNTYwLDcgQEAKIAkJY2xkX3ByZXYgPSBOVUxMOwogCiAJCXNwaW5fbG9jaygmY29uZmlnX2xpc3RfbG9jayk7CisJCXJxX3N0YXRlICY9IH5SUV9QUkVDTEVBTlVQOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsZCwgJmNvbmZpZ19sbG9nX2xpc3QsCiAJCQkJCWNsZF9saXN0X2NoYWluKSB7CiAJCQlpZiAoIWNsZC0+Y2xkX2xvc3Rsb2NrKQpAQCAtNjYxLDI0ICs2NzcsMjYgQEAKIHN0YXRpYyBpbnQgbWdjX3ByZWNsZWFudXAoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCwgZW51bSBvYmRfY2xlYW51cF9zdGFnZSBzdGFnZSkKIHsKIAlpbnQgcmMgPSAwOworCWludCB0ZW1wOwogCiAJc3dpdGNoIChzdGFnZSkgewogCWNhc2UgT0JEX0NMRUFOVVBfRUFSTFk6CiAJCWJyZWFrOwogCWNhc2UgT0JEX0NMRUFOVVBfRVhQT1JUUzoKIAkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJm1nY19jb3VudCkpIHsKLQkJCWludCBydW5uaW5nOworCQkJTEFTU0VSVChycV9zdGF0ZSAmIFJRX1JVTk5JTkcpOwogCQkJLyogc3RvcCByZXF1ZXVlIHRocmVhZCAqLwotCQkJc3Bpbl9sb2NrKCZjb25maWdfbGlzdF9sb2NrKTsKLQkJCXJ1bm5pbmcgPSBycV9zdGF0ZSAmIFJRX1JVTk5JTkc7Ci0JCQlpZiAocnVubmluZykKLQkJCQlycV9zdGF0ZSB8PSBSUV9TVE9QOwotCQkJc3Bpbl91bmxvY2soJmNvbmZpZ19saXN0X2xvY2spOwotCQkJaWYgKHJ1bm5pbmcpIHsKLQkJCQl3YWtlX3VwKCZycV93YWl0cSk7Ci0JCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcnFfZXhpdCk7Ci0JCQl9CisJCQl0ZW1wID0gUlFfU1RPUDsKKwkJfSBlbHNlIHsKKwkJCS8qIHdha2V1cCByZXF1ZXVlIHRocmVhZCB0byBjbGVhbiBvdXIgY2xkICovCisJCQl0ZW1wID0gUlFfTk9XIHwgUlFfUFJFQ0xFQU5VUDsKIAkJfQorCQlzcGluX2xvY2soJmNvbmZpZ19saXN0X2xvY2spOworCQlycV9zdGF0ZSB8PSB0ZW1wOworCQlzcGluX3VubG9jaygmY29uZmlnX2xpc3RfbG9jayk7CisJCXdha2VfdXAoJnJxX3dhaXRxKTsKKwkJaWYgKHRlbXAgJiBSUV9TVE9QKQorCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcnFfZXhpdCk7CiAJCW9iZF9jbGVhbnVwX2NsaWVudF9pbXBvcnQob2JkKTsKIAkJcmMgPSBtZ2NfbGxvZ19maW5pKE5VTEwsIG9iZCk7CiAJCWlmIChyYyAhPSAwKQpAQCAtNjkwLDggKzcwOCw2IEBACiAKIHN0YXRpYyBpbnQgbWdjX2NsZWFudXAoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCkKIHsKLQlpbnQgcmM7Ci0KIAkvKiBDT01QQVRfMTQ2IC0gb2xkIGNvbmZpZyBsb2dzIG1heSBoYXZlIGFkZGVkIHByb2ZpbGVzIHdlIGRvbid0CiAJICAga25vdyBhYm91dCAqLwogCWlmIChvYmQtPm9iZF90eXBlLT50eXBfcmVmY250IDw9IDEpCkBAIC03MDEsOCArNzE3LDcgQEAKIAlscHJvY2ZzX29iZF9jbGVhbnVwKG9iZCk7CiAJcHRscnBjZF9kZWNyZWYoKTsKIAotCXJjID0gY2xpZW50X29iZF9jbGVhbnVwKG9iZCk7Ci0JcmV0dXJuIHJjOworCXJldHVybiBjbGllbnRfb2JkX2NsZWFudXAob2JkKTsKIH0KIAogc3RhdGljIGludCBtZ2Nfc2V0dXAoc3RydWN0IG9iZF9kZXZpY2UgKm9iZCwgc3RydWN0IGx1c3RyZV9jZmcgKmxjZmcpCkBAIC03NDAsNiArNzU1LDcgQEAKIAkJfQogCQkvKiByYyBpcyB0aGUgdGFza19zdHJ1Y3QgcG9pbnRlciBvZiBtZ2NfcmVxdWV1ZV90aHJlYWQuICovCiAJCXJjID0gMDsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmcnFfc3RhcnQpOwogCX0KIAogCXJldHVybiByYzsKQEAgLTk1MSw3ICs5NjcsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50IG1nY19zZXRfaW5mb19hc3luYyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCitzdGF0aWMgaW50IG1nY19zZXRfaW5mb19hc3luYyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBvYmRfZXhwb3J0ICpleHAsCiAJCSAgICAgICB1MzIga2V5bGVuLCB2b2lkICprZXksIHUzMiB2YWxsZW4sCiAJCSAgICAgICB2b2lkICp2YWwsIHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnNldCkKIHsKQEAgLTE3MjcsNyArMTc0Myw3IEBACiAJLm9fcHJvY2Vzc19jb25maWcgPSBtZ2NfcHJvY2Vzc19jb25maWcsCiB9OwogCi1pbnQgX19pbml0IG1nY19pbml0KHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBtZ2NfaW5pdCh2b2lkKQogewogCXJldHVybiBjbGFzc19yZWdpc3Rlcl90eXBlKCZtZ2Nfb2JkX29wcywgTlVMTCwgTlVMTCwKIAkJCQkgICBMVVNUUkVfTUdDX05BTUUsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvY2xhc3Nfb2JkLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbGFzc19vYmQuYwppbmRleCAyOTQ1NmUxLi5kNGI3NGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbGFzc19vYmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9jbGFzc19vYmQuYwpAQCAtNDM3LDggKzQzNyw2IEBACiAJcmV0dXJuIGVycjsKIH0gLyogY2xhc3NfaGFuZGxlX2lvY3RsICovCiAKLWV4dGVybiBzdHJ1Y3QgbWlzY2RldmljZSBvYmRfcHNkZXY7Ci0KICNkZWZpbmUgT0JEX0lOSVRfQ0hFQ0sKIGludCBvYmRfaW5pdF9jaGVja3Modm9pZCkKIHsKQEAgLTUwOCw3ICs1MDYsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWV4dGVybiBzcGlubG9ja190IG9iZF90eXBlc19sb2NrOwogI2lmIGRlZmluZWQgKENPTkZJR19QUk9DX0ZTKQogZXh0ZXJuIGludCBjbGFzc19wcm9jZnNfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgY2xhc3NfcHJvY2ZzX2NsZWFuKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvZHRfb2JqZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9kdF9vYmplY3QuYwppbmRleCBlN2JlMjZlLi5iMWVlZTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9kdF9vYmplY3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9kdF9vYmplY3QuYwpAQCAtNDI0LDExICs0MjQsOCBAQAogLyogZHQgY2xhc3MgaW5pdCBmdW5jdGlvbi4gKi8KIGludCBkdF9nbG9iYWxfaW5pdCh2b2lkKQogewotCWludCByZXN1bHQ7Ci0KIAlMVV9DT05URVhUX0tFWV9JTklUKCZkdF9rZXkpOwotCXJlc3VsdCA9IGx1X2NvbnRleHRfa2V5X3JlZ2lzdGVyKCZkdF9rZXkpOwotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIGx1X2NvbnRleHRfa2V5X3JlZ2lzdGVyKCZkdF9rZXkpOwogfQogCiB2b2lkIGR0X2dsb2JhbF9maW5pKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9nZW5vcHMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCmluZGV4IDgyNTA4MjEuLjY2YjU2NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2dlbm9wcy5jCkBAIC00MywxNyArNDMsMTYgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9jbGFzcy5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvbHByb2Nmc19zdGF0dXMuaCIKIAotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgb2JkX3R5cGVzOwogc3BpbmxvY2tfdCBvYmRfdHlwZXNfbG9jazsKIAogc3RydWN0IGttZW1fY2FjaGUgKm9iZF9kZXZpY2VfY2FjaGVwOwogc3RydWN0IGttZW1fY2FjaGUgKm9iZG9fY2FjaGVwOwogRVhQT1JUX1NZTUJPTChvYmRvX2NhY2hlcCk7Ci1zdHJ1Y3Qga21lbV9jYWNoZSAqaW1wb3J0X2NhY2hlcDsKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqaW1wb3J0X2NhY2hlcDsKIAotc3RydWN0IGxpc3RfaGVhZCAgICAgIG9iZF96b21iaWVfaW1wb3J0czsKLXN0cnVjdCBsaXN0X2hlYWQgICAgICBvYmRfem9tYmllX2V4cG9ydHM7Ci1zcGlubG9ja190ICBvYmRfem9tYmllX2ltcGV4cF9sb2NrOworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgICAgICBvYmRfem9tYmllX2ltcG9ydHM7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAgICAgIG9iZF96b21iaWVfZXhwb3J0czsKK3N0YXRpYyBzcGlubG9ja190ICBvYmRfem9tYmllX2ltcGV4cF9sb2NrOwogc3RhdGljIHZvaWQgb2JkX3pvbWJpZV9pbXBleHBfbm90aWZ5KHZvaWQpOwogc3RhdGljIHZvaWQgb2JkX3pvbWJpZV9leHBvcnRfYWRkKHN0cnVjdCBvYmRfZXhwb3J0ICpleHApOwogc3RhdGljIHZvaWQgb2JkX3pvbWJpZV9pbXBvcnRfYWRkKHN0cnVjdCBvYmRfaW1wb3J0ICppbXApOwpAQCAtOTMwLDcgKzkyOSw3IEBACiBFWFBPUlRfU1lNQk9MKGNsYXNzX3VubGlua19leHBvcnQpOwogCiAvKiBJbXBvcnQgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KLXZvaWQgY2xhc3NfaW1wb3J0X2Rlc3Ryb3koc3RydWN0IG9iZF9pbXBvcnQgKmltcCkKK3N0YXRpYyB2b2lkIGNsYXNzX2ltcG9ydF9kZXN0cm95KHN0cnVjdCBvYmRfaW1wb3J0ICppbXApCiB7CiAJQ0RFQlVHKERfSU9DVEwsICJkZXN0cm95aW5nIGltcG9ydCAlcCBmb3IgJXNcbiIsIGltcCwKIAkJaW1wLT5pbXBfb2JkLT5vYmRfbmFtZSk7CkBAIC0xMTI3LDcgKzExMjYsNyBAQAogRVhQT1JUX1NZTUJPTChjbGFzc19jb25uZWN0KTsKIAogLyogaWYgZXhwb3J0IGlzIGludm9sdmVkIGluIHJlY292ZXJ5IHRoZW4gY2xlYW4gdXAgcmVsYXRlZCB0aGluZ3MgKi8KLXZvaWQgY2xhc3NfZXhwb3J0X3JlY292ZXJ5X2NsZWFudXAoc3RydWN0IG9iZF9leHBvcnQgKmV4cCkKK3N0YXRpYyB2b2lkIGNsYXNzX2V4cG9ydF9yZWNvdmVyeV9jbGVhbnVwKHN0cnVjdCBvYmRfZXhwb3J0ICpleHApCiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGV4cC0+ZXhwX29iZDsKIApAQCAtMTIyMSw3ICsxMjIwLDcgQEAKIAlpZiAoZXhwKSB7CiAJCWludCBjb25uZWN0ZWQ7CiAJCXNwaW5fbG9jaygmZXhwLT5leHBfbG9jayk7Ci0JCWNvbm5lY3RlZCA9IChleHAtPmV4cF9jb25uX2NudCA+IDApOworCQljb25uZWN0ZWQgPSBleHAtPmV4cF9jb25uX2NudCA+IDA7CiAJCXNwaW5fdW5sb2NrKCZleHAtPmV4cF9sb2NrKTsKIAkJcmV0dXJuIGNvbm5lY3RlZDsKIAl9CkBAIC0xNTU5LDcgKzE1NTgsNyBAQAogRVhQT1JUX1NZTUJPTChvYmRfZXhwb3J0c19iYXJyaWVyKTsKIAogLyogVG90YWwgYW1vdW50IG9mIHpvbWJpZXMgdG8gYmUgZGVzdHJveWVkICovCi1zdGF0aWMgaW50IHpvbWJpZXNfY291bnQgPSAwOworc3RhdGljIGludCB6b21iaWVzX2NvdW50OwogCiAvKioKICAqIGtpbGwgem9tYmllIGltcG9ydHMgYW5kIGV4cG9ydHMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xpbnV4L2xpbnV4LW1vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKaW5kZXggYjk0YWVhYy4uMDY5NDRiOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtbW9kdWxlLmMKQEAgLTIxNywyMyArMjE3LDI1IEBACiAKIAogI2lmIGRlZmluZWQgKENPTkZJR19QUk9DX0ZTKQotaW50IG9iZF9wcm9jX3ZlcnNpb25fc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQorc3RhdGljIGludCBvYmRfcHJvY192ZXJzaW9uX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAibHVzdHJlOiAlc1xua2VybmVsOiAlc1xuYnVpbGQ6ICAlc1xuIiwKLQkJCUxVU1RSRV9WRVJTSU9OX1NUUklORywgInBhdGNobGVzc19jbGllbnQiLAotCQkJQlVJTERfVkVSU0lPTik7CisJc2VxX3ByaW50ZihtLCAibHVzdHJlOiAlc1xua2VybmVsOiAlc1xuYnVpbGQ6ICAlc1xuIiwKKwkJICAgTFVTVFJFX1ZFUlNJT05fU1RSSU5HLCAicGF0Y2hsZXNzX2NsaWVudCIsIEJVSUxEX1ZFUlNJT04pOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8ob2JkX3Byb2NfdmVyc2lvbik7CiAKIGludCBvYmRfcHJvY19waW5nZXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlc1xuIiwgIm9uIik7CisJc2VxX3ByaW50ZihtLCAiJXNcbiIsICJvbiIpOworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8ob2JkX3Byb2NfcGluZ2VyKTsKIAogc3RhdGljIGludCBvYmRfcHJvY19oZWFsdGhfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCWludCByYyA9IDAsIGk7CisJYm9vbCBoZWFsdGh5ID0gdHJ1ZTsKKwlpbnQgaTsKIAogCWlmIChsaWJjZnNfY2F0YXN0cm9waGUpCiAJCXNlcV9wcmludGYobSwgIkxCVUdcbiIpOwpAQCAtMjU1LDI1ICsyNTcsMjcgQEAKIAogCQlpZiAob2JkX2hlYWx0aF9jaGVjayhOVUxMLCBvYmQpKSB7CiAJCQlzZXFfcHJpbnRmKG0sICJkZXZpY2UgJXMgcmVwb3J0ZWQgdW5oZWFsdGh5XG4iLAotCQkJCSAgICAgIG9iZC0+b2JkX25hbWUpOwotCQkJcmMrKzsKKwkJCQkgICBvYmQtPm9iZF9uYW1lKTsKKwkJCWhlYWx0aHkgPSBmYWxzZTsKIAkJfQogCQljbGFzc19kZWNyZWYob2JkLCBfX2Z1bmNfXywgY3VycmVudCk7CiAJCXJlYWRfbG9jaygmb2JkX2Rldl9sb2NrKTsKIAl9CiAJcmVhZF91bmxvY2soJm9iZF9kZXZfbG9jayk7CiAKLQlpZiAocmMgPT0gMCkKLQkJcmV0dXJuIHNlcV9wcmludGYobSwgImhlYWx0aHlcbiIpOworCWlmIChoZWFsdGh5KQorCQlzZXFfcHV0cyhtLCAiaGVhbHRoeVxuIik7CisJZWxzZQorCQlzZXFfcHV0cyhtLCAiTk9UIEhFQUxUSFlcbiIpOwogCi0Jc2VxX3ByaW50ZihtLCAiTk9UIEhFQUxUSFlcbiIpOwogCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8ob2JkX3Byb2NfaGVhbHRoKTsKIAogc3RhdGljIGludCBvYmRfcHJvY19qb2JpZF92YXJfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlc1xuIiwgb2JkX2pvYmlkX3Zhcik7CisJc2VxX3ByaW50ZihtLCAiJXNcbiIsIG9iZF9qb2JpZF92YXIpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBvYmRfcHJvY19qb2JpZF92YXJfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMjk5LDcgKzMwMyw4IEBACiAKIHN0YXRpYyBpbnQgb2JkX3Byb2Nfam9iaWRfbmFtZV9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVzXG4iLCBvYmRfam9iaWRfdmFyKTsKKwlzZXFfcHJpbnRmKG0sICIlc1xuIiwgb2JkX2pvYmlkX3Zhcik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9iZF9wcm9jX2pvYmlkX25hbWVfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMzc4LDEwICszODMsMTEgQEAKIAllbHNlCiAJCXN0YXR1cyA9ICItLSI7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihwLCAiJTNkICVzICVzICVzICVzICVkXG4iLAotCQkJICAoaW50KWluZGV4LCBzdGF0dXMsIG9iZC0+b2JkX3R5cGUtPnR5cF9uYW1lLAotCQkJICBvYmQtPm9iZF9uYW1lLCBvYmQtPm9iZF91dWlkLnV1aWQsCi0JCQkgIGF0b21pY19yZWFkKCZvYmQtPm9iZF9yZWZjb3VudCkpOworCXNlcV9wcmludGYocCwgIiUzZCAlcyAlcyAlcyAlcyAlZFxuIiwKKwkJICAgKGludClpbmRleCwgc3RhdHVzLCBvYmQtPm9iZF90eXBlLT50eXBfbmFtZSwKKwkJICAgb2JkLT5vYmRfbmFtZSwgb2JkLT5vYmRfdXVpZC51dWlkLAorCQkgICBhdG9taWNfcmVhZCgmb2JkLT5vYmRfcmVmY291bnQpKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IHNlcV9vcGVyYXRpb25zIG9iZF9kZXZpY2VfbGlzdF9zb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGludXgvbGludXgtc3lzY3RsLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1zeXNjdGwuYwppbmRleCBkZDQ2ZTczLi40YjYyZDI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1zeXNjdGwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9saW51eC9saW51eC1zeXNjdGwuYwpAQCAtNzksNiArNzksNyBAQAogfTsKIAogCisjaWZkZWYgQ09ORklHX1NZU0NUTAogc3RhdGljIGludCBwcm9jX3NldF90aW1lb3V0KHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCiAJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTIwNSw3ICsyMDYsNyBAQAogCQkJQ0VSUk9SKCJSZWZ1c2luZyB0byBzZXQgbWF4IGRpcnR5IHBhZ2VzIHRvICV1LCB3aGljaCBpcyBtb3JlIHRoYW4gOTAlJSBvZiBhdmFpbGFibGUgUkFNOyBzZXR0aW5nIHRvICVsdVxuIiwKIAkJCSAgICAgICBvYmRfbWF4X2RpcnR5X3BhZ2VzLAogCQkJICAgICAgICgodG90YWxyYW1fcGFnZXMgLyAxMCkgKiA5KSk7Ci0JCQlvYmRfbWF4X2RpcnR5X3BhZ2VzID0gKCh0b3RhbHJhbV9wYWdlcyAvIDEwKSAqIDkpOworCQkJb2JkX21heF9kaXJ0eV9wYWdlcyA9ICh0b3RhbHJhbV9wYWdlcyAvIDEwKSAqIDk7CiAJCX0gZWxzZSBpZiAob2JkX21heF9kaXJ0eV9wYWdlcyA8IDQgPDwgKDIwIC0gUEFHRV9DQUNIRV9TSElGVCkpIHsKIAkJCW9iZF9tYXhfZGlydHlfcGFnZXMgPSA0IDw8ICgyMCAtIFBBR0VfQ0FDSEVfU0hJRlQpOwogCQl9CkBAIC0yNTgsNyArMjU5LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLSNpZmRlZiBDT05GSUdfU1lTQ1RMCiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBvYmRfdGFibGVbXSA9IHsKIAl7CiAJCS5wcm9jbmFtZSA9ICJ0aW1lb3V0IiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9sbG9nX2NhdC5jCmluZGV4IDRiODUwZmMuLmM4ZjZhYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xsb2dfY2F0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbGxvZ19jYXQuYwpAQCAtNTI2LDggKzUyNiw5IEBACiB9CiBFWFBPUlRfU1lNQk9MKGxsb2dfY2F0X2NhbmNlbF9yZWNvcmRzKTsKIAotaW50IGxsb2dfY2F0X3Byb2Nlc3NfY2IoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgbGxvZ19oYW5kbGUgKmNhdF9sbGgsCi0JCQlzdHJ1Y3QgbGxvZ19yZWNfaGRyICpyZWMsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IGxsb2dfY2F0X3Byb2Nlc3NfY2IoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LAorCQkJICAgICAgIHN0cnVjdCBsbG9nX2hhbmRsZSAqY2F0X2xsaCwKKwkJCSAgICAgICBzdHJ1Y3QgbGxvZ19yZWNfaGRyICpyZWMsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGxsb2dfcHJvY2Vzc19kYXRhICpkID0gZGF0YTsKIAlzdHJ1Y3QgbGxvZ19sb2dpZF9yZWMgKmxpciA9IChzdHJ1Y3QgbGxvZ19sb2dpZF9yZWMgKilyZWM7CkBAIC02OTEsNyArNjkyLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wobGxvZ19jYXRfcmV2ZXJzZV9wcm9jZXNzKTsKIAotaW50IGxsb2dfY2F0X3NldF9maXJzdF9pZHgoc3RydWN0IGxsb2dfaGFuZGxlICpjYXRoYW5kbGUsIGludCBpbmRleCkKK3N0YXRpYyBpbnQgbGxvZ19jYXRfc2V0X2ZpcnN0X2lkeChzdHJ1Y3QgbGxvZ19oYW5kbGUgKmNhdGhhbmRsZSwgaW50IGluZGV4KQogewogCXN0cnVjdCBsbG9nX2xvZ19oZHIgKmxsaCA9IGNhdGhhbmRsZS0+bGdoX2hkcjsKIAlpbnQgaSwgYml0bWFwX3NpemUsIGlkeDsKQEAgLTc1MCw3ICs3NTEsNyBAQAogCXJldHVybiByYzsKIH0KIAotaW50IGNhdF9jYW5jZWxfY2IoY29uc3Qgc3RydWN0IGx1X2VudiAqZW52LCBzdHJ1Y3QgbGxvZ19oYW5kbGUgKmNhdGhhbmRsZSwKK3N0YXRpYyBpbnQgY2F0X2NhbmNlbF9jYihjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBsbG9nX2hhbmRsZSAqY2F0aGFuZGxlLAogCQkgIHN0cnVjdCBsbG9nX3JlY19oZHIgKnJlYywgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbGxvZ19sb2dpZF9yZWMJKmxpciA9IChzdHJ1Y3QgbGxvZ19sb2dpZF9yZWMgKilyZWM7CkBAIC03OTQsNyArNzk1LDYgQEAKIAogCXJldHVybiByYzsKIH0KLUVYUE9SVF9TWU1CT0woY2F0X2NhbmNlbF9jYik7CiAKIC8qIGhlbHBlciB0byBpbml0aWFsaXplIGNhdGFsb2cgbGxvZyBhbmQgcHJvY2VzcyBpdCB0byBjYW5jZWwgKi8KIGludCBsbG9nX2NhdF9pbml0X2FuZF9wcm9jZXNzKGNvbnN0IHN0cnVjdCBsdV9lbnYgKmVudiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xwcm9jZnNfc3RhdHVzLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRjbGFzcy9scHJvY2ZzX3N0YXR1cy5jCmluZGV4IGRkYWI5NGQuLmMxNzFjNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2xwcm9jZnNfc3RhdHVzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHByb2Nmc19zdGF0dXMuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAKICNpZiBkZWZpbmVkIChDT05GSUdfUFJPQ19GUykKIAotc3RhdGljIGludCBscHJvY2ZzX25vX3BlcmNwdV9zdGF0cyA9IDA7CitzdGF0aWMgaW50IGxwcm9jZnNfbm9fcGVyY3B1X3N0YXRzOwogbW9kdWxlX3BhcmFtKGxwcm9jZnNfbm9fcGVyY3B1X3N0YXRzLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhscHJvY2ZzX25vX3BlcmNwdV9zdGF0cywgIkRvIG5vdCBhbGxvYyBwZXJjcHUgZGF0YSBmb3IgbHByb2NmcyBzdGF0cyIpOwogCkBAIC0zNzcsNyArMzc3LDggQEAKIC8qIEdlbmVyaWMgY2FsbGJhY2tzICovCiBpbnQgbHByb2Nmc19yZF91aW50KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqZGF0YSkKIHsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsICoodW5zaWduZWQgaW50ICopZGF0YSk7CisJc2VxX3ByaW50ZihtLCAiJXVcbiIsICoodW5zaWduZWQgaW50ICopZGF0YSk7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGxwcm9jZnNfcmRfdWludCk7CiAKQEAgLTQwMyw3ICs0MDQsOCBAQAogCiBpbnQgbHByb2Nmc19yZF91NjQoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKQogewotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCAqKF9fdTY0ICopZGF0YSk7CisJc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgKihfX3U2NCAqKWRhdGEpOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX3JkX3U2NCk7CiAKQEAgLTQxMSw3ICs0MTMsOCBAQAogewogCWF0b21pY190ICphdG9tID0gZGF0YTsKIAlMQVNTRVJUKGF0b20gIT0gTlVMTCk7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVkXG4iLCBhdG9taWNfcmVhZChhdG9tKSk7CisJc2VxX3ByaW50ZihtLCAiJWRcbiIsIGF0b21pY19yZWFkKGF0b20pKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9hdG9taWMpOwogCkBAIC00MzksNyArNDQyLDggQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gZGF0YTsKIAogCUxBU1NFUlQob2JkICE9IE5VTEwpOwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlc1xuIiwgb2JkLT5vYmRfdXVpZC51dWlkKTsKKwlzZXFfcHJpbnRmKG0sICIlc1xuIiwgb2JkLT5vYmRfdXVpZC51dWlkKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF91dWlkKTsKIApAQCAtNDQ4LDcgKzQ1Miw4IEBACiAJc3RydWN0IG9iZF9kZXZpY2UgKmRldiA9IGRhdGE7CiAKIAlMQVNTRVJUKGRldiAhPSBOVUxMKTsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXNcbiIsIGRldi0+b2JkX25hbWUpOworCXNlcV9wcmludGYobSwgIiVzXG4iLCBkZXYtPm9iZF9uYW1lKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9uYW1lKTsKIApAQCAtNDYwLDcgKzQ2NSw4IEBACiAJCQkgICAgY2ZzX3RpbWVfc2hpZnRfNjQoLU9CRF9TVEFURlNfQ0FDSEVfU0VDT05EUyksCiAJCQkgICAgT0JEX1NUQVRGU19OT0RFTEFZKTsKIAlpZiAoIXJjKQotCQlyYyA9IHNlcV9wcmludGYobSwgIiV1XG4iLCBvc2ZzLm9zX2JzaXplKTsKKwkJc2VxX3ByaW50ZihtLCAiJXVcbiIsIG9zZnMub3NfYnNpemUpOworCiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX3JkX2Jsa3NpemUpOwpAQCAtNDc5LDggKzQ4NSw5IEBACiAJCXdoaWxlIChibGtfc2l6ZSA+Pj0gMSkKIAkJCXJlc3VsdCA8PD0gMTsKIAotCQlyYyA9IHNlcV9wcmludGYobSwgIiVsbHVcbiIsIHJlc3VsdCk7CisJCXNlcV9wcmludGYobSwgIiVsbHVcbiIsIHJlc3VsdCk7CiAJfQorCiAJcmV0dXJuIHJjOwogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX3JkX2tieXRlc3RvdGFsKTsKQEAgLTQ5OSw4ICs1MDYsOSBAQAogCQl3aGlsZSAoYmxrX3NpemUgPj49IDEpCiAJCQlyZXN1bHQgPDw9IDE7CiAKLQkJcmMgPSBzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOworCQlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOwogCX0KKwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9rYnl0ZXNmcmVlKTsKQEAgLTUxOSw4ICs1MjcsOSBAQAogCQl3aGlsZSAoYmxrX3NpemUgPj49IDEpCiAJCQlyZXN1bHQgPDw9IDE7CiAKLQkJcmMgPSBzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOworCQlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCByZXN1bHQpOwogCX0KKwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9rYnl0ZXNhdmFpbCk7CkBAIC01MzMsNyArNTQyLDcgQEAKIAkJCSAgICBjZnNfdGltZV9zaGlmdF82NCgtT0JEX1NUQVRGU19DQUNIRV9TRUNPTkRTKSwKIAkJCSAgICBPQkRfU1RBVEZTX05PREVMQVkpOwogCWlmICghcmMpCi0JCXJjID0gc2VxX3ByaW50ZihtLCAiJWxsdVxuIiwgb3Nmcy5vc19maWxlcyk7CisJCXNlcV9wcmludGYobSwgIiVsbHVcbiIsIG9zZnMub3NfZmlsZXMpOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNTQ3LDcgKzU1Niw4IEBACiAJCQkgICAgY2ZzX3RpbWVfc2hpZnRfNjQoLU9CRF9TVEFURlNfQ0FDSEVfU0VDT05EUyksCiAJCQkgICAgT0JEX1NUQVRGU19OT0RFTEFZKTsKIAlpZiAoIXJjKQotCQlyYyA9IHNlcV9wcmludGYobSwgIiVsbHVcbiIsIG9zZnMub3NfZmZyZWUpOworCQlzZXFfcHJpbnRmKG0sICIlbGx1XG4iLCBvc2ZzLm9zX2ZmcmVlKTsKKwogCXJldHVybiByYzsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9maWxlc2ZyZWUpOwpAQCAtNTU3LDE3ICs1NjcsMTggQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gZGF0YTsKIAlzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wOwogCWNoYXIgKmltcF9zdGF0ZV9uYW1lID0gTlVMTDsKLQlpbnQgcmMgPSAwOwogCiAJTEFTU0VSVChvYmQgIT0gTlVMTCk7CiAJTFBST0NGU19DTElNUF9DSEVDSyhvYmQpOwogCWltcCA9IG9iZC0+dS5jbGkuY2xfaW1wb3J0OwogCWltcF9zdGF0ZV9uYW1lID0gcHRscnBjX2ltcG9ydF9zdGF0ZV9uYW1lKGltcC0+aW1wX3N0YXRlKTsKLQlyYyA9IHNlcV9wcmludGYobSwgIiVzXHQlcyVzXG4iLCBvYmQyY2xpX3RndChvYmQpLCBpbXBfc3RhdGVfbmFtZSwKLQkJCWltcC0+aW1wX2RlYWN0aXZlID8gIlx0REVBQ1RJVkFURUQiIDogIiIpOworCXNlcV9wcmludGYobSwgIiVzXHQlcyVzXG4iLAorCQkgICBvYmQyY2xpX3RndChvYmQpLCBpbXBfc3RhdGVfbmFtZSwKKwkJICAgaW1wLT5pbXBfZGVhY3RpdmUgPyAiXHRERUFDVElWQVRFRCIgOiAiIik7CiAKIAlMUFJPQ0ZTX0NMSU1QX0VYSVQob2JkKTsKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9zZXJ2ZXJfdXVpZCk7CiAKQEAgLTU3NSwxOSArNTg2LDE5IEBACiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IGRhdGE7CiAJc3RydWN0IHB0bHJwY19jb25uZWN0aW9uICpjb25uOwotCWludCByYyA9IDA7CiAKIAlMQVNTRVJUKG9iZCAhPSBOVUxMKTsKIAogCUxQUk9DRlNfQ0xJTVBfQ0hFQ0sob2JkKTsKIAljb25uID0gb2JkLT51LmNsaS5jbF9pbXBvcnQtPmltcF9jb25uZWN0aW9uOwogCWlmIChjb25uICYmIG9iZC0+dS5jbGkuY2xfaW1wb3J0KQotCQlyYyA9IHNlcV9wcmludGYobSwgIiVzXG4iLCBjb25uLT5jX3JlbW90ZV91dWlkLnV1aWQpOworCQlzZXFfcHJpbnRmKG0sICIlc1xuIiwgY29ubi0+Y19yZW1vdGVfdXVpZC51dWlkKTsKIAllbHNlCi0JCXJjID0gc2VxX3ByaW50ZihtLCAiJXNcbiIsICI8bm9uZT4iKTsKKwkJc2VxX3B1dHMobSwgIjxub25lPlxuIik7CiAKIAlMUFJPQ0ZTX0NMSU1QX0VYSVQob2JkKTsKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobHByb2Nmc19yZF9jb25uX3V1aWQpOwogCkBAIC05MjQsNyArOTM1LDggQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gZGF0YTsKIAogCUxBU1NFUlQob2JkICE9IE5VTEwpOwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIldVxuIiwgb2JkLT5vYmRfbnVtX2V4cG9ydHMpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBvYmQtPm9iZF9udW1fZXhwb3J0cyk7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGxwcm9jZnNfcmRfbnVtX2V4cG9ydHMpOwogCkBAIC05MzMsNyArOTQ1LDggQEAKIAlzdHJ1Y3Qgb2JkX3R5cGUgKmNsYXNzID0gKHN0cnVjdCBvYmRfdHlwZSAqKSBkYXRhOwogCiAJTEFTU0VSVChjbGFzcyAhPSBOVUxMKTsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWRcbiIsIGNsYXNzLT50eXBfcmVmY250KTsKKwlzZXFfcHJpbnRmKG0sICIlZFxuIiwgY2xhc3MtPnR5cF9yZWZjbnQpOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX3JkX251bXJlZnMpOwogCkBAIC0xMjAwLDQxICsxMjEzLDMzIEBACiAJc3RydWN0IGxwcm9jZnNfY291bnRlcl9oZWFkZXIgICAqaGRyOwogCXN0cnVjdCBscHJvY2ZzX2NvdW50ZXIgICAgICAgICAgIGN0cjsKIAlpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggICAgPSAqKGxvZmZfdCAqKXY7Ci0JaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmMgICAgID0gMDsKIAogCWlmIChpZHggPT0gMCkgewogCQlzdHJ1Y3QgdGltZXZhbCBub3c7CiAJCWRvX2dldHRpbWVvZmRheSgmbm93KTsKLQkJcmMgPSBzZXFfcHJpbnRmKHAsICIlLTI1cyAlbHUuJWx1IHNlY3MudXNlY3NcbiIsCi0JCQkJInNuYXBzaG90X3RpbWUiLCBub3cudHZfc2VjLCAodW5zaWduZWQgbG9uZylub3cudHZfdXNlYyk7Ci0JCWlmIChyYyA8IDApCi0JCQlyZXR1cm4gcmM7CisJCXNlcV9wcmludGYocCwgIiUtMjVzICVsdS4lbHUgc2Vjcy51c2Vjc1xuIiwKKwkJCSAgICJzbmFwc2hvdF90aW1lIiwKKwkJCSAgIG5vdy50dl9zZWMsICh1bnNpZ25lZCBsb25nKW5vdy50dl91c2VjKTsKIAl9CisKIAloZHIgPSAmc3RhdHMtPmxzX2NudF9oZWFkZXJbaWR4XTsKIAlscHJvY2ZzX3N0YXRzX2NvbGxlY3Qoc3RhdHMsIGlkeCwgJmN0cik7CiAKLQlpZiAoY3RyLmxjX2NvdW50ID09IDApCi0JCWdvdG8gb3V0OworCWlmIChjdHIubGNfY291bnQgIT0gMCkgeworCQlzZXFfcHJpbnRmKHAsICIlLTI1cyAlbGxkIHNhbXBsZXMgWyVzXSIsCisJCQkgICBoZHItPmxjX25hbWUsIGN0ci5sY19jb3VudCwgaGRyLT5sY191bml0cyk7CiAKLQlyYyA9IHNlcV9wcmludGYocCwgIiUtMjVzICVsbGQgc2FtcGxlcyBbJXNdIiwgaGRyLT5sY19uYW1lLAotCQkJY3RyLmxjX2NvdW50LCBoZHItPmxjX3VuaXRzKTsKLQotCWlmIChyYyA8IDApCi0JCWdvdG8gb3V0OwotCi0JaWYgKChoZHItPmxjX2NvbmZpZyAmIExQUk9DRlNfQ05UUl9BVkdNSU5NQVgpICYmIChjdHIubGNfY291bnQgPiAwKSkgewotCQlyYyA9IHNlcV9wcmludGYocCwgIiAlbGxkICVsbGQgJWxsZCIsCi0JCQkJY3RyLmxjX21pbiwgY3RyLmxjX21heCwgY3RyLmxjX3N1bSk7Ci0JCWlmIChyYyA8IDApCi0JCQlnb3RvIG91dDsKLQkJaWYgKGhkci0+bGNfY29uZmlnICYgTFBST0NGU19DTlRSX1NURERFVikKLQkJCXJjID0gc2VxX3ByaW50ZihwLCAiICVsbGQiLCBjdHIubGNfc3Vtc3F1YXJlKTsKLQkJaWYgKHJjIDwgMCkKLQkJCWdvdG8gb3V0OworCQlpZiAoKGhkci0+bGNfY29uZmlnICYgTFBST0NGU19DTlRSX0FWR01JTk1BWCkgJiYKKwkJICAgIChjdHIubGNfY291bnQgPiAwKSkgeworCQkJc2VxX3ByaW50ZihwLCAiICVsbGQgJWxsZCAlbGxkIiwKKwkJCQkgICBjdHIubGNfbWluLCBjdHIubGNfbWF4LCBjdHIubGNfc3VtKTsKKwkJCWlmIChoZHItPmxjX2NvbmZpZyAmIExQUk9DRlNfQ05UUl9TVERERVYpCisJCQkJc2VxX3ByaW50ZihwLCAiICVsbGQiLCBjdHIubGNfc3Vtc3F1YXJlKTsKKwkJfQorCQlzZXFfcHV0YyhwLCAnXG4nKTsKIAl9Ci0JcmMgPSBzZXFfcHJpbnRmKHAsICJcbiIpOwotb3V0OgotCXJldHVybiAocmMgPCAwKSA/IHJjIDogMDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGxwcm9jZnNfc3RhdHNfc2VxX3NvcHMgPSB7CkBAIC0xNjA2LDggKzE2MTEsOSBAQAogCiBpbnQgbHByb2Nmc19uaWRfc3RhdHNfY2xlYXJfcmVhZChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCiB7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVzXG4iLAotCQkJICAiV3JpdGUgaW50byB0aGlzIGZpbGUgdG8gY2xlYXIgYWxsIG5pZCBzdGF0cyBhbmQgc3RhbGUgbmlkIGVudHJpZXMiKTsKKwlzZXFfcHJpbnRmKG0sICIlc1xuIiwKKwkJICAgIldyaXRlIGludG8gdGhpcyBmaWxlIHRvIGNsZWFyIGFsbCBuaWQgc3RhdHMgYW5kIHN0YWxlIG5pZCBlbnRyaWVzIik7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGxwcm9jZnNfbmlkX3N0YXRzX2NsZWFyX3JlYWQpOwogCkBAIC0yMDQxLDEyICsyMDQ3LDEyIEBACiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKmRldiA9IGRhdGE7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZkZXYtPnUuY2xpOwotCWludCByYzsKIAogCWNsaWVudF9vYmRfbGlzdF9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJjID0gc2VxX3ByaW50ZihtLCAiJWRcbiIsIGNsaS0+Y2xfbWF4X3BhZ2VzX3Blcl9ycGMpOworCXNlcV9wcmludGYobSwgIiVkXG4iLCBjbGktPmNsX21heF9wYWdlc19wZXJfcnBjKTsKIAljbGllbnRfb2JkX2xpc3RfdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJldHVybiByYzsKKworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChscHJvY2ZzX29iZF9yZF9tYXhfcGFnZXNfcGVyX3JwYyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL2x1X29iamVjdC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKaW5kZXggODNiZjE2OC4uMjBjMDc3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3MvbHVfb2JqZWN0LmMKQEAgLTEzMDgsNyArMTMwOCw3IEBACiAgKiBsdV9jb250ZXh0X3JlZmlsbCgpLiBObyBsb2NraW5nIGlzIHByb3ZpZGVkLCBhcyBpbml0aWFsaXphdGlvbiBhbmQgc2h1dGRvd24KICAqIGFyZSBzdXBwb3NlZCB0byBiZSBleHRlcm5hbGx5IHNlcmlhbGl6ZWQuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBrZXlfc2V0X3ZlcnNpb24gPSAwOworc3RhdGljIHVuc2lnbmVkIGtleV9zZXRfdmVyc2lvbjsKIAogLyoqCiAgKiBSZWdpc3RlciBuZXcga2V5LgpAQCAtMTc2OSw4ICsxNzY5LDYgQEAKIGludCBsdV9lbnZfcmVmaWxsX2J5X3RhZ3Moc3RydWN0IGx1X2VudiAqZW52LCBfX3UzMiBjdGFncywKIAkJCSAgX191MzIgc3RhZ3MpCiB7Ci0JaW50ICAgIHJlc3VsdDsKLQogCWlmICgoZW52LT5sZV9jdHgubGNfdGFncyAmIGN0YWdzKSAhPSBjdGFncykgewogCQllbnYtPmxlX2N0eC5sY192ZXJzaW9uID0gMDsKIAkJZW52LT5sZV9jdHgubGNfdGFncyB8PSBjdGFnczsKQEAgLTE3ODEsOSArMTc3OSw3IEBACiAJCWVudi0+bGVfc2VzLT5sY190YWdzIHw9IHN0YWdzOwogCX0KIAotCXJlc3VsdCA9IGx1X2Vudl9yZWZpbGwoZW52KTsKLQotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIGx1X2Vudl9yZWZpbGwoZW52KTsKIH0KIEVYUE9SVF9TWU1CT0wobHVfZW52X3JlZmlsbF9ieV90YWdzKTsKIApAQCAtMjAxNCwxOCArMjAxMCwxOSBAQAogCW1lbXNldCgmc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOwogCWx1X3NpdGVfc3RhdHNfZ2V0KHMtPmxzX29ial9oYXNoLCAmc3RhdHMsIDEpOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVkLyVkICVkLyVkICVkICVkICVkICVkICVkICVkICVkXG4iLAotCQkJc3RhdHMubHNzX2J1c3ksCi0JCQlzdGF0cy5sc3NfdG90YWwsCi0JCQlzdGF0cy5sc3NfcG9wdWxhdGVkLAotCQkJQ0ZTX0hBU0hfTkhMSVNUKHMtPmxzX29ial9oYXNoKSwKLQkJCXN0YXRzLmxzc19tYXhfc2VhcmNoLAotCQkJbHNfc3RhdHNfcmVhZChzLT5sc19zdGF0cywgTFVfU1NfQ1JFQVRFRCksCi0JCQlsc19zdGF0c19yZWFkKHMtPmxzX3N0YXRzLCBMVV9TU19DQUNIRV9ISVQpLAotCQkJbHNfc3RhdHNfcmVhZChzLT5sc19zdGF0cywgTFVfU1NfQ0FDSEVfTUlTUyksCi0JCQlsc19zdGF0c19yZWFkKHMtPmxzX3N0YXRzLCBMVV9TU19DQUNIRV9SQUNFKSwKLQkJCWxzX3N0YXRzX3JlYWQocy0+bHNfc3RhdHMsIExVX1NTX0NBQ0hFX0RFQVRIX1JBQ0UpLAotCQkJbHNfc3RhdHNfcmVhZChzLT5sc19zdGF0cywgTFVfU1NfTFJVX1BVUkdFRCkpOworCXNlcV9wcmludGYobSwgIiVkLyVkICVkLyVkICVkICVkICVkICVkICVkICVkICVkXG4iLAorCQkgICBzdGF0cy5sc3NfYnVzeSwKKwkJICAgc3RhdHMubHNzX3RvdGFsLAorCQkgICBzdGF0cy5sc3NfcG9wdWxhdGVkLAorCQkgICBDRlNfSEFTSF9OSExJU1Qocy0+bHNfb2JqX2hhc2gpLAorCQkgICBzdGF0cy5sc3NfbWF4X3NlYXJjaCwKKwkJICAgbHNfc3RhdHNfcmVhZChzLT5sc19zdGF0cywgTFVfU1NfQ1JFQVRFRCksCisJCSAgIGxzX3N0YXRzX3JlYWQocy0+bHNfc3RhdHMsIExVX1NTX0NBQ0hFX0hJVCksCisJCSAgIGxzX3N0YXRzX3JlYWQocy0+bHNfc3RhdHMsIExVX1NTX0NBQ0hFX01JU1MpLAorCQkgICBsc19zdGF0c19yZWFkKHMtPmxzX3N0YXRzLCBMVV9TU19DQUNIRV9SQUNFKSwKKwkJICAgbHNfc3RhdHNfcmVhZChzLT5sc19zdGF0cywgTFVfU1NfQ0FDSEVfREVBVEhfUkFDRSksCisJCSAgIGxzX3N0YXRzX3JlYWQocy0+bHNfc3RhdHMsIExVX1NTX0xSVV9QVVJHRUQpKTsKKwlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wobHVfc2l0ZV9zdGF0c19wcmludCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGNsYXNzL29iZF9tb3VudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX21vdW50LmMKaW5kZXggM2MwYzkxMC4uMzQzN2IyZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX21vdW50LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkY2xhc3Mvb2JkX21vdW50LmMKQEAgLTY0NSwxMCArNjQ1LDEwIEBACiB9CiAKIC8qKiogU0VSVkVSIE5BTUUgKioqCi0gKiA8RlNOQU1FPjxTRVBFUkFUT1I+PFRZUEU+PElOREVYPgorICogPEZTTkFNRT48U0VQQVJBVE9SPjxUWVBFPjxJTkRFWD4KICAqIEZTTkFNRSBpcyBiZXR3ZWVuIDEgYW5kIDggY2hhcmFjdGVycyAoaW5jbHVzaXZlKS4KICAqCUV4Y2x1ZGVkIGNoYXJhY3RlcnMgYXJlICcvJyBhbmQgJzonCi0gKiBTRVBFUkFUT1IgaXMgZWl0aGVyICc6JyBvciAnLScKKyAqIFNFUEFSQVRPUiBpcyBlaXRoZXIgJzonIG9yICctJwogICogVFlQRTogIk9TVCIsICJNRFQiLCBldGMuCiAgKiBJTkRFWDogSGV4IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbmRleAogICovCkBAIC0xMjg2LDcgKzEyODYsNyBAQAogCXJldHVybiBtb3VudF9ub2Rldihmc190eXBlLCBmbGFncywgJmxtZDIsIGx1c3RyZV9maWxsX3N1cGVyKTsKIH0KIAotdm9pZCBsdXN0cmVfa2lsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIHZvaWQgbHVzdHJlX2tpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgbHVzdHJlX3NiX2luZm8gKmxzaSA9IHMybHNpKHNiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2NsaWVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9lY2hvX2NsaWVudC5jCmluZGV4IDVmNmQ5NDQuLmQ1NDJlMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vZWNob19jbGllbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vYmRlY2hvL2VjaG9fY2xpZW50LmMKQEAgLTE0Niw2ICsxNDYsNyBAQAogc3RhdGljIGlubGluZSBzdHJ1Y3QgZWNob190aHJlYWRfaW5mbyAqZWNob19lbnZfaW5mbyhjb25zdCBzdHJ1Y3QgbHVfZW52ICplbnYpCiB7CiAJc3RydWN0IGVjaG9fdGhyZWFkX2luZm8gKmluZm87CisKIAlpbmZvID0gbHVfY29udGV4dF9rZXlfZ2V0KCZlbnYtPmxlX2N0eCwgJmVjaG9fdGhyZWFkX2tleSk7CiAJTEFTU0VSVChpbmZvICE9IE5VTEwpOwogCXJldHVybiBpbmZvOwpAQCAtMTk1LDIyICsxOTYsMjIgQEAKIAl7CiAJCS5ja2RfY2FjaGUgPSAmZWNob19sb2NrX2ttZW0sCiAJCS5ja2RfbmFtZSAgPSAiZWNob19sb2NrX2ttZW0iLAotCQkuY2tkX3NpemUgID0gc2l6ZW9mIChzdHJ1Y3QgZWNob19sb2NrKQorCQkuY2tkX3NpemUgID0gc2l6ZW9mKHN0cnVjdCBlY2hvX2xvY2spCiAJfSwKIAl7CiAJCS5ja2RfY2FjaGUgPSAmZWNob19vYmplY3Rfa21lbSwKIAkJLmNrZF9uYW1lICA9ICJlY2hvX29iamVjdF9rbWVtIiwKLQkJLmNrZF9zaXplICA9IHNpemVvZiAoc3RydWN0IGVjaG9fb2JqZWN0KQorCQkuY2tkX3NpemUgID0gc2l6ZW9mKHN0cnVjdCBlY2hvX29iamVjdCkKIAl9LAogCXsKIAkJLmNrZF9jYWNoZSA9ICZlY2hvX3RocmVhZF9rbWVtLAogCQkuY2tkX25hbWUgID0gImVjaG9fdGhyZWFkX2ttZW0iLAotCQkuY2tkX3NpemUgID0gc2l6ZW9mIChzdHJ1Y3QgZWNob190aHJlYWRfaW5mbykKKwkJLmNrZF9zaXplICA9IHNpemVvZihzdHJ1Y3QgZWNob190aHJlYWRfaW5mbykKIAl9LAogCXsKIAkJLmNrZF9jYWNoZSA9ICZlY2hvX3Nlc3Npb25fa21lbSwKIAkJLmNrZF9uYW1lICA9ICJlY2hvX3Nlc3Npb25fa21lbSIsCi0JCS5ja2Rfc2l6ZSAgPSBzaXplb2YgKHN0cnVjdCBlY2hvX3Nlc3Npb25faW5mbykKKwkJLmNrZF9zaXplICA9IHNpemVvZihzdHJ1Y3QgZWNob19zZXNzaW9uX2luZm8pCiAJfSwKIAl7CiAJCS5ja2RfY2FjaGUgPSBOVUxMCkBAIC02MzcsNiArNjM4LDcgQEAKIAkJCSBzdHJ1Y3QgbHVfY29udGV4dF9rZXkgKmtleSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgZWNob190aHJlYWRfaW5mbyAqaW5mbyA9IGRhdGE7CisKIAlPQkRfU0xBQl9GUkVFX1BUUihpbmZvLCBlY2hvX3RocmVhZF9rbWVtKTsKIH0KIApAQCAtNjY3LDYgKzY2OSw3IEBACiAJCQkJIHN0cnVjdCBsdV9jb250ZXh0X2tleSAqa2V5LCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBlY2hvX3Nlc3Npb25faW5mbyAqc2Vzc2lvbiA9IGRhdGE7CisKIAlPQkRfU0xBQl9GUkVFX1BUUihzZXNzaW9uLCBlY2hvX3Nlc3Npb25fa21lbSk7CiB9CiAKQEAgLTc4Myw2ICs3ODYsNyBAQAogCXN3aXRjaCAoY2xlYW51cCkgewogCWNhc2UgNDogewogCQlpbnQgcmMyOworCiAJCXJjMiA9IGVjaG9fY2xpZW50X2NsZWFudXAob2JkKTsKIAkJaWYgKHJjMikKIAkJCUNFUlJPUigiQ2xlYW51cCBvYmQgZGV2aWNlICVzIGVycm9yKCVkKVxuIiwKQEAgLTk1OCwxMSArOTYyLDEzIEBACiAJaWYgKGQtPmVkX25leHQpIHsKIAkJaWYgKCFkLT5lZF9uZXh0X2lzbG92KSB7CiAJCQlzdHJ1Y3QgbG92X29pbmZvICpvaW5mbyA9IGxzbS0+bHNtX29pbmZvWzBdOworCiAJCQlMQVNTRVJUKG9pbmZvICE9IE5VTEwpOwogCQkJb2luZm8tPmxvaV9vaSA9IGxzbS0+bHNtX29pOwogCQkJY29uZi0+ZW9jX2NsLnUuY29jX29pbmZvID0gb2luZm87CiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgbHVzdHJlX21kICptZDsKKwogCQkJbWQgPSAmaW5mby0+ZXRpX21kOwogCQkJbWVtc2V0KG1kLCAwLCBzaXplb2YoKm1kKSk7CiAJCQltZC0+bHNtID0gbHNtOwpAQCAtMTAxMSw2ICsxMDE3LDcgQEAKIAkvKiBhbiBleHRlcm5hbCBmdW5jdGlvbiB0byBraWxsIGFuIG9iamVjdD8gKi8KIAlpZiAoZWNvLT5lb19kZWxldGVkKSB7CiAJCXN0cnVjdCBsdV9vYmplY3RfaGVhZGVyICpsb2ggPSBvYmotPmNvX2x1LmxvX2hlYWRlcjsKKwogCQlMQVNTRVJUKCZlY28tPmVvX2hkciA9PSBsdWgyY29oKGxvaCkpOwogCQlzZXRfYml0KExVX09CSkVDVF9IRUFSRF9CQU5TSEVFLCAmbG9oLT5sb2hfZmxhZ3MpOwogCX0KQEAgLTEwMjIsNyArMTAyOSw3IEBACiAKIHN0YXRpYyBpbnQgY2xfZWNob19lbnF1ZXVlMChzdHJ1Y3QgbHVfZW52ICplbnYsIHN0cnVjdCBlY2hvX29iamVjdCAqZWNvLAogCQkJICAgIHU2NCBzdGFydCwgdTY0IGVuZCwgaW50IG1vZGUsCi0JCQkgICAgX191NjQgKmNvb2tpZSAsIF9fdTMyIGVucWZsYWdzKQorCQkJICAgIF9fdTY0ICpjb29raWUsIF9fdTMyIGVucWZsYWdzKQogewogCXN0cnVjdCBjbF9pbyAqaW87CiAJc3RydWN0IGNsX2xvY2sgKmxjazsKQEAgLTExMDYsOCArMTExMyw4IEBACiAKIAlMQVNTRVJUKGVjICE9IE5VTEwpOwogCXNwaW5fbG9jaygmZWMtPmVjX2xvY2spOwotCWxpc3RfZm9yX2VhY2ggKGVsLCAmZWMtPmVjX2xvY2tzKSB7Ci0JCWVjbCA9IGxpc3RfZW50cnkgKGVsLCBzdHJ1Y3QgZWNob19sb2NrLCBlbF9jaGFpbik7CisJbGlzdF9mb3JfZWFjaChlbCwgJmVjLT5lY19sb2NrcykgeworCQllY2wgPSBsaXN0X2VudHJ5KGVsLCBzdHJ1Y3QgZWNob19sb2NrLCBlbF9jaGFpbik7CiAJCUNERUJVRyhEX0lORk8sICJlY2w6ICVwLCBjb29raWU6ICUjbGx4XG4iLCBlY2wsIGVjbC0+ZWxfY29va2llKTsKIAkJZm91bmQgPSAoZWNsLT5lbF9jb29raWUgPT0gY29va2llKTsKIAkJaWYgKGZvdW5kKSB7CkBAIC0xMTUyLDYgKzExNTksNyBAQAogCiAJY2xfcGFnZV9saXN0X2Zvcl9lYWNoX3NhZmUoY2xwLCB0ZW1wLCAmcXVldWUtPmMyX3FpbikgewogCQlpbnQgcmM7CisKIAkJcmMgPSBjbF9wYWdlX2NhY2hlX2FkZChlbnYsIGlvLCBjbHAsIENSVF9XUklURSk7CiAJCWlmIChyYyA9PSAwKQogCQkJY29udGludWU7CkBAIC0xMjU3LDIwICsxMjY1LDIwIEBACiBzdGF0aWMgdTY0IGxhc3Rfb2JqZWN0X2lkOwogCiBzdGF0aWMgaW50Ci1lY2hvX2NvcHlvdXRfbHNtIChzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLCB2b2lkICpfdWxzbSwgaW50IHVsc21fbm9iKQorZWNob19jb3B5b3V0X2xzbShzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLCB2b2lkICpfdWxzbSwgaW50IHVsc21fbm9iKQogewogCXN0cnVjdCBsb3Zfc3RyaXBlX21kICp1bHNtID0gX3Vsc207CiAJaW50IG5vYiwgaTsKIAotCW5vYiA9IG9mZnNldG9mIChzdHJ1Y3QgbG92X3N0cmlwZV9tZCwgbHNtX29pbmZvW2xzbS0+bHNtX3N0cmlwZV9jb3VudF0pOworCW5vYiA9IG9mZnNldG9mKHN0cnVjdCBsb3Zfc3RyaXBlX21kLCBsc21fb2luZm9bbHNtLT5sc21fc3RyaXBlX2NvdW50XSk7CiAJaWYgKG5vYiA+IHVsc21fbm9iKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjb3B5X3RvX3VzZXIgKHVsc20sIGxzbSwgc2l6ZW9mKCp1bHNtKSkpCisJaWYgKGNvcHlfdG9fdXNlcih1bHNtLCBsc20sIHNpemVvZigqdWxzbSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCWZvciAoaSA9IDA7IGkgPCBsc20tPmxzbV9zdHJpcGVfY291bnQ7IGkrKykgewotCQlpZiAoY29weV90b191c2VyICh1bHNtLT5sc21fb2luZm9baV0sIGxzbS0+bHNtX29pbmZvW2ldLAorCQlpZiAoY29weV90b191c2VyKHVsc20tPmxzbV9vaW5mb1tpXSwgbHNtLT5sc21fb2luZm9baV0sCiAJCQkJICAgICAgc2l6ZW9mKGxzbS0+bHNtX29pbmZvWzBdKSkpCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9CkBAIC0xMjc4LDE2ICsxMjg2LDE2IEBACiB9CiAKIHN0YXRpYyBpbnQKLWVjaG9fY29weWluX2xzbSAoc3RydWN0IGVjaG9fZGV2aWNlICplZCwgc3RydWN0IGxvdl9zdHJpcGVfbWQgKmxzbSwKK2VjaG9fY29weWluX2xzbShzdHJ1Y3QgZWNob19kZXZpY2UgKmVkLCBzdHJ1Y3QgbG92X3N0cmlwZV9tZCAqbHNtLAogCQkgdm9pZCAqdWxzbSwgaW50IHVsc21fbm9iKQogewogCXN0cnVjdCBlY2hvX2NsaWVudF9vYmQgKmVjID0gZWQtPmVkX2VjOwogCWludAkJICAgICBpOwogCi0JaWYgKHVsc21fbm9iIDwgc2l6ZW9mICgqbHNtKSkKKwlpZiAodWxzbV9ub2IgPCBzaXplb2YoKmxzbSkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyIChsc20sIHVsc20sIHNpemVvZiAoKmxzbSkpKQorCWlmIChjb3B5X2Zyb21fdXNlcihsc20sIHVsc20sIHNpemVvZigqbHNtKSkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJaWYgKGxzbS0+bHNtX3N0cmlwZV9jb3VudCA+IGVjLT5lY19uc3RyaXBlcyB8fApAQCAtMTMyMCw3ICsxMzI4LDcgQEAKIAlpZiAoKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMSUQpID09IDAgJiYgLyogbm8gb2JqIGlkICovCiAJICAgIChvbl90YXJnZXQgfHwJCSAgICAgICAvKiBzZXRfc3RyaXBlICovCiAJICAgICBlYy0+ZWNfbnN0cmlwZXMgIT0gMCkpIHsJICAgLyogTE9WICovCi0JCUNFUlJPUiAoIk5vIHZhbGlkIG9pZFxuIik7CisJCUNFUlJPUigiTm8gdmFsaWQgb2lkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMzMzLDcgKzEzNDEsNyBAQAogCWlmICh1bHNtICE9IE5VTEwpIHsKIAkJaW50IGksIGlkeDsKIAotCQlyYyA9IGVjaG9fY29weWluX2xzbSAoZWQsIGxzbSwgdWxzbSwgdWxzbV9ub2IpOworCQlyYyA9IGVjaG9fY29weWluX2xzbShlZCwgbHNtLCB1bHNtLCB1bHNtX25vYik7CiAJCWlmIChyYyAhPSAwKQogCQkJZ290byBmYWlsZWQ7CiAKQEAgLTE0MDksNyArMTQxNyw3IEBACiAKIAlpZiAoKG9hLT5vX3ZhbGlkICYgT0JEX01EX0ZMSUQpID09IDAgfHwgb3N0aWRfaWQoJm9hLT5vX29pKSA9PSAwKSB7CiAJCS8qIGRpc2FsbG93IHVzZSBvZiBvYmplY3QgaWQgMCAqLwotCQlDRVJST1IgKCJObyB2YWxpZCBvaWRcbiIpOworCQlDRVJST1IoIk5vIHZhbGlkIG9pZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTQ1OSw3ICsxNDY3LDcgQEAKIAl3aWR0aCA9IHN0cmlwZV9zaXplICogc3RyaXBlX2NvdW50OwogCiAJLyogd29mZnNldCA9IG9mZnNldCB3aXRoaW4gYSB3aWR0aDsgb2Zmc2V0ID0gd2hvbGUgbnVtYmVyIG9mIHdpZHRocyAqLwotCXdvZmZzZXQgPSBkb19kaXYgKG9mZnNldCwgd2lkdGgpOworCXdvZmZzZXQgPSBkb19kaXYob2Zmc2V0LCB3aWR0aCk7CiAKIAlzdHJpcGVfaW5kZXggPSB3b2Zmc2V0IC8gc3RyaXBlX3NpemU7CiAKQEAgLTE1MTcsMTMgKzE1MjUsMTMgQEAKIAlmb3IgKHJjID0gZGVsdGEgPSAwOyBkZWx0YSA8IFBBR0VfQ0FDSEVfU0laRTsgZGVsdGEgKz0gT0JEX0VDSE9fQkxPQ0tfU0laRSkgewogCQlzdHJpcGVfb2ZmID0gb2Zmc2V0ICsgZGVsdGE7CiAJCXN0cmlwZV9pZCA9IGlkOwotCQllY2hvX2dldF9zdHJpcGVfb2ZmX2lkIChsc20sICZzdHJpcGVfb2ZmLCAmc3RyaXBlX2lkKTsKKwkJZWNob19nZXRfc3RyaXBlX29mZl9pZChsc20sICZzdHJpcGVfb2ZmLCAmc3RyaXBlX2lkKTsKIAogCQlyYzIgPSBibG9ja19kZWJ1Z19jaGVjaygidGVzdF9icnciLAogCQkJCQlhZGRyICsgZGVsdGEsIE9CRF9FQ0hPX0JMT0NLX1NJWkUsCiAJCQkJCXN0cmlwZV9vZmYsIHN0cmlwZV9pZCk7CiAJCWlmIChyYzIgIT0gMCkgewotCQkJQ0VSUk9SICgiRXJyb3IgaW4gZWNobyBvYmplY3QgJSNsbHhcbiIsIGlkKTsKKwkJCUNFUlJPUigiRXJyb3IgaW4gZWNobyBvYmplY3QgJSNsbHhcbiIsIGlkKTsKIAkJCXJjID0gcmMyOwogCQl9CiAJfQpAQCAtMTU4Myw3ICsxNTkxLDcgQEAKIAkgICAgIGkgPCBucGFnZXM7CiAJICAgICBpKyssIHBncCsrLCBvZmYgKz0gUEFHRV9DQUNIRV9TSVpFKSB7CiAKLQkJTEFTU0VSVCAocGdwLT5wZyA9PSBOVUxMKTsgICAgICAvKiBmb3IgY2xlYW51cCAqLworCQlMQVNTRVJUKHBncC0+cGcgPT0gTlVMTCk7ICAgICAgLyogZm9yIGNsZWFudXAgKi8KIAogCQlyYyA9IC1FTk9NRU07CiAJCU9CRF9QQUdFX0FMTE9DKHBncC0+cGcsIGdmcF9tYXNrKTsKQEAgLTE2MTUsNiArMTYyMyw3IEBACiAKIAkJaWYgKHZlcmlmeSkgewogCQkJaW50IHZyYzsKKwogCQkJdnJjID0gZWNob19jbGllbnRfcGFnZV9kZWJ1Z19jaGVjayhsc20sIHBncC0+cGcsCiAJCQkJCQkJICAgb3N0aWRfaWQoJm9hLT5vX29pKSwKIAkJCQkJCQkgICBwZ3AtPm9mZiwgcGdwLT5jb3VudCk7CkBAIC0xODEyLDcgKzE4MjEsNyBAQAogCSAgICAobm9iICYgKH5DRlNfUEFHRV9NQVNLKSkgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyYyA9IGVjaG9fZ2V0X29iamVjdCAoJmVjbywgZWQsIG9hKTsKKwlyYyA9IGVjaG9fZ2V0X29iamVjdCgmZWNvLCBlZCwgb2EpOwogCWlmIChyYyAhPSAwKQogCQlyZXR1cm4gcmM7CiAKQEAgLTE5MTEsNiArMTkyMCw3IEBACiAJCXJjID0gZWNob19nZXRfb2JqZWN0KCZlY28sIGVkLCBvYSk7CiAJCWlmIChyYyA9PSAwKSB7CiAJCQlzdHJ1Y3Qgb2JkX2luZm8gb2luZm8gPSB7IHsgeyAwIH0gfSB9OworCiAJCQlvaW5mby5vaV9tZCA9IGVjby0+ZW9fbHNtOwogCQkJb2luZm8ub2lfb2EgPSBvYTsKIAkJCXJjID0gb2JkX2dldGF0dHIoZW52LCBlYy0+ZWNfZXhwLCAmb2luZm8pOwpAQCAtMTkyNyw2ICsxOTM3LDcgQEAKIAkJcmMgPSBlY2hvX2dldF9vYmplY3QoJmVjbywgZWQsIG9hKTsKIAkJaWYgKHJjID09IDApIHsKIAkJCXN0cnVjdCBvYmRfaW5mbyBvaW5mbyA9IHsgeyB7IDAgfSB9IH07CisKIAkJCW9pbmZvLm9pX29hID0gb2E7CiAJCQlvaW5mby5vaV9tZCA9IGVjby0+ZW9fbHNtOwogCkBAIC0xOTkyLDcgKzIwMDMsNyBAQAogCQlnb3RvIG91dDsKIAogCWRlZmF1bHQ6Ci0JCUNFUlJPUiAoImVjaG9faW9jdGwoKTogdW5yZWNvZ25pc2VkIGlvY3RsICUjeFxuIiwgY21kKTsKKwkJQ0VSUk9SKCJlY2hvX2lvY3RsKCk6IHVucmVjb2duaXNlZCBpb2N0bCAlI3hcbiIsIGNtZCk7CiAJCXJjID0gLUVOT1RUWTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjAzNCw4ICsyMDQ1LDggQEAKIAl9CiAKIAlzcGluX2xvY2tfaW5pdCgmZWMtPmVjX2xvY2spOwotCUlOSVRfTElTVF9IRUFEICgmZWMtPmVjX29iamVjdHMpOwotCUlOSVRfTElTVF9IRUFEICgmZWMtPmVjX2xvY2tzKTsKKwlJTklUX0xJU1RfSEVBRCgmZWMtPmVjX29iamVjdHMpOworCUlOSVRfTElTVF9IRUFEKCZlYy0+ZWNfbG9ja3MpOwogCWVjLT5lY191bmlxdWUgPSAwOwogCWVjLT5lY19uc3RyaXBlcyA9IDA7CiAKQEAgLTIxNTgsNyArMjE2OSw2IEBACiBzdGF0aWMgaW50IF9faW5pdCBvYmRlY2hvX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgbHByb2Nmc19zdGF0aWNfdmFycyBsdmFyczsKLQlpbnQgcmM7CiAKIAlMQ09OU09MRV9JTkZPKCJFY2hvIE9CRCBkcml2ZXI7IGh0dHA6Ly93d3cubHVzdHJlLm9yZy9cbiIpOwogCkBAIC0yMTY3LDkgKzIxNzcsNyBAQAogCWxwcm9jZnNfZWNob19pbml0X3ZhcnMoJmx2YXJzKTsKIAogCi0JcmMgPSBlY2hvX2NsaWVudF9pbml0KCk7Ci0KLQlyZXR1cm4gcmM7CisJcmV0dXJuIGVjaG9fY2xpZW50X2luaXQoKTsKIH0KIAogc3RhdGljIHZvaWQgLypfX2V4aXQqLyBvYmRlY2hvX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29iZGVjaG8vbHByb2NfZWNoby5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9scHJvY19lY2hvLmMKaW5kZXggMWQzYmY2Yy4uMGJlYjk3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9scHJvY19lY2hvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb2JkZWNoby9scHJvY19lY2hvLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL2xwcm9jZnNfc3RhdHVzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9vYmRfY2xhc3MuaCIKIAotI2lmIGRlZmluZWQgKENPTkZJR19QUk9DX0ZTKQorI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCiBMUFJPQ19TRVFfRk9QU19ST19UWVBFKGVjaG8sIHV1aWQpOwogc3RhdGljIHN0cnVjdCBscHJvY2ZzX3ZhcnMgbHByb2Nmc19lY2hvX29iZF92YXJzW10gPSB7CiAJeyAidXVpZCIsCSAmZWNob191dWlkX2ZvcHMsCU5VTEwsIDAgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9scHJvY19vc2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9scHJvY19vc2MuYwppbmRleCAxNzk1ZDNhLi4xNWE2NjIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2MvbHByb2Nfb3NjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL2xwcm9jX29zYy5jCkBAIC0zNSw3ICszNSw3IEBACiAgKi8KICNkZWZpbmUgREVCVUdfU1VCU1lTVEVNIFNfQ0xBU1MKIAotI2luY2x1ZGUgPGFzbS9zdGF0ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KICNpbmNsdWRlICIuLi9pbmNsdWRlL29iZF9ja3N1bS5oIgogI2luY2x1ZGUgIi4uL2luY2x1ZGUvb2JkX2NsYXNzLmgiCiAjaW5jbHVkZSAiLi4vaW5jbHVkZS9scHJvY2ZzX3N0YXR1cy5oIgpAQCAtNDUsMTIgKzQ1LDEyIEBACiBzdGF0aWMgaW50IG9zY19hY3RpdmVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCBvYmRfZGV2aWNlICpkZXYgPSBtLT5wcml2YXRlOwotCWludCByYzsKIAogCUxQUk9DRlNfQ0xJTVBfQ0hFQ0soZGV2KTsKLQlyYyA9IHNlcV9wcmludGYobSwgIiVkXG4iLCAhZGV2LT51LmNsaS5jbF9pbXBvcnQtPmltcF9kZWFjdGl2ZSk7CisJc2VxX3ByaW50ZihtLCAiJWRcbiIsICFkZXYtPnUuY2xpLmNsX2ltcG9ydC0+aW1wX2RlYWN0aXZlKTsKIAlMUFJPQ0ZTX0NMSU1QX0VYSVQoZGV2KTsKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3Qgb3NjX2FjdGl2ZV9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC04MCwxMiArODAsMTIgQEAKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmRldi0+dS5jbGk7Ci0JaW50IHJjOwogCiAJY2xpZW50X29iZF9saXN0X2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JcmMgPSBzZXFfcHJpbnRmKG0sICIldVxuIiwgY2xpLT5jbF9tYXhfcnBjc19pbl9mbGlnaHQpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBjbGktPmNsX21heF9ycGNzX2luX2ZsaWdodCk7CiAJY2xpZW50X29iZF9saXN0X3VubG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3Qgb3NjX21heF9ycGNzX2luX2ZsaWdodF9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC0xNjQsMTYgKzE2NCwxNSBAQAogCXN0cnVjdCBvYmRfZGV2aWNlICpkZXYgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmZGV2LT51LmNsaTsKIAlpbnQgc2hpZnQgPSAyMCAtIFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JaW50IHJjOwogCi0JcmMgPSBzZXFfcHJpbnRmKG0sCi0JCSAgICAgICJ1c2VkX21iOiAlZFxuIgotCQkgICAgICAiYnVzeV9jbnQ6ICVkXG4iLAotCQkgICAgICAoYXRvbWljX3JlYWQoJmNsaS0+Y2xfbHJ1X2luX2xpc3QpICsKLQkJCWF0b21pY19yZWFkKCZjbGktPmNsX2xydV9idXN5KSkgPj4gc2hpZnQsCi0JCSAgICAgIGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9idXN5KSk7CisJc2VxX3ByaW50ZihtLAorCQkgICAidXNlZF9tYjogJWRcbiIKKwkJICAgImJ1c3lfY250OiAlZFxuIiwKKwkJICAgKGF0b21pY19yZWFkKCZjbGktPmNsX2xydV9pbl9saXN0KSArCisJCSAgICBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkpID4+IHNoaWZ0LAorCQkgICBhdG9taWNfcmVhZCgmY2xpLT5jbF9scnVfYnVzeSkpOwogCi0JcmV0dXJuIHJjOworCXJldHVybiAwOwogfQogCiAvKiBzaHJpbmsgdGhlIG51bWJlciBvZiBjYWNoaW5nIHBhZ2VzIHRvIGEgc3BlY2lmaWMgbnVtYmVyICovCkBAIC0yMTUsMTIgKzIxNCwxMiBAQAogewogCXN0cnVjdCBvYmRfZGV2aWNlICpkZXYgPSBtLT5wcml2YXRlOwogCXN0cnVjdCBjbGllbnRfb2JkICpjbGkgPSAmZGV2LT51LmNsaTsKLQlpbnQgcmM7CiAKIAljbGllbnRfb2JkX2xpc3RfbG9jaygmY2xpLT5jbF9sb2lfbGlzdF9sb2NrKTsKLQlyYyA9IHNlcV9wcmludGYobSwgIiVsdVxuIiwgY2xpLT5jbF9kaXJ0eSk7CisJc2VxX3ByaW50ZihtLCAiJWx1XG4iLCBjbGktPmNsX2RpcnR5KTsKIAljbGllbnRfb2JkX2xpc3RfdW5sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJldHVybiByYzsKKworCXJldHVybiAwOwogfQogTFBST0NfU0VRX0ZPUFNfUk8ob3NjX2N1cl9kaXJ0eV9ieXRlcyk7CiAKQEAgLTIyOCwxMiArMjI3LDEyIEBACiB7CiAJc3RydWN0IG9iZF9kZXZpY2UgKmRldiA9IG0tPnByaXZhdGU7CiAJc3RydWN0IGNsaWVudF9vYmQgKmNsaSA9ICZkZXYtPnUuY2xpOwotCWludCByYzsKIAogCWNsaWVudF9vYmRfbGlzdF9sb2NrKCZjbGktPmNsX2xvaV9saXN0X2xvY2spOwotCXJjID0gc2VxX3ByaW50ZihtLCAiJWx1XG4iLCBjbGktPmNsX2F2YWlsX2dyYW50KTsKKwlzZXFfcHJpbnRmKG0sICIlbHVcbiIsIGNsaS0+Y2xfYXZhaWxfZ3JhbnQpOwogCWNsaWVudF9vYmRfbGlzdF91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JcmV0dXJuIHJjOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9zY19jdXJfZ3JhbnRfYnl0ZXNfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMjc0LDEyICsyNzMsMTIgQEAKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqZGV2ID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgY2xpZW50X29iZCAqY2xpID0gJmRldi0+dS5jbGk7Ci0JaW50IHJjOwogCiAJY2xpZW50X29iZF9saXN0X2xvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JcmMgPSBzZXFfcHJpbnRmKG0sICIlbHVcbiIsIGNsaS0+Y2xfbG9zdF9ncmFudCk7CisJc2VxX3ByaW50ZihtLCAiJWx1XG4iLCBjbGktPmNsX2xvc3RfZ3JhbnQpOwogCWNsaWVudF9vYmRfbGlzdF91bmxvY2soJmNsaS0+Y2xfbG9pX2xpc3RfbG9jayk7Ci0JcmV0dXJuIHJjOworCisJcmV0dXJuIDA7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhvc2NfY3VyX2xvc3RfZ3JhbnRfYnl0ZXMpOwogCkBAIC0yODksOCArMjg4LDggQEAKIAogCWlmIChvYmQgPT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVkXG4iLAotCQkJb2JkLT51LmNsaS5jbF9ncmFudF9zaHJpbmtfaW50ZXJ2YWwpOworCXNlcV9wcmludGYobSwgIiVkXG4iLCBvYmQtPnUuY2xpLmNsX2dyYW50X3Nocmlua19pbnRlcnZhbCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9zY19ncmFudF9zaHJpbmtfaW50ZXJ2YWxfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtMzIzLDggKzMyMiw4IEBACiAJaWYgKG9iZCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlZFxuIiwKLQkJCW9iZC0+dS5jbGkuY2xfY2hlY2tzdW0gPyAxIDogMCk7CisJc2VxX3ByaW50ZihtLCAiJWRcbiIsIG9iZC0+dS5jbGkuY2xfY2hlY2tzdW0gPyAxIDogMCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9zY19jaGVja3N1bV9zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC00MDUsNyArNDA0LDggQEAKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gbS0+cHJpdmF0ZTsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sICIldVxuIiwgYXRvbWljX3JlYWQoJm9iZC0+dS5jbGkuY2xfcmVzZW5kcykpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBhdG9taWNfcmVhZCgmb2JkLT51LmNsaS5jbF9yZXNlbmRzKSk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IG9zY19yZXNlbmRfY291bnRfc2VxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLApAQCAtNDMzLDcgKzQzMyw4IEBACiAJc3RydWN0IG9iZF9kZXZpY2UgKm9iZCA9IG0tPnByaXZhdGU7CiAJc3RydWN0IG9zY19kZXZpY2UgKm9kICA9IG9iZDJvc2NfZGV2KG9iZCk7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsIG9kLT5vZF9jb250ZW50aW9uX3RpbWUpOworCXNlcV9wcmludGYobSwgIiV1XG4iLCBvZC0+b2RfY29udGVudGlvbl90aW1lKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3Qgb3NjX2NvbnRlbnRpb25fc2Vjb25kc19zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC00NTMsNyArNDU0LDggQEAKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3Qgb3NjX2RldmljZSAqb2QgID0gb2JkMm9zY19kZXYob2JkKTsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sICIldVxuIiwgb2QtPm9kX2xvY2tsZXNzX3RydW5jYXRlKTsKKwlzZXFfcHJpbnRmKG0sICIldVxuIiwgb2QtPm9kX2xvY2tsZXNzX3RydW5jYXRlKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3Qgb3NjX2xvY2tsZXNzX3RydW5jYXRlX3NlcV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKQEAgLTQ3MSw4ICs0NzMsOSBAQAogc3RhdGljIGludCBvc2NfZGVzdHJveXNfaW5fZmxpZ2h0X3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gbS0+cHJpdmF0ZTsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXVcbiIsCi0JCQlhdG9taWNfcmVhZCgmb2JkLT51LmNsaS5jbF9kZXN0cm95X2luX2ZsaWdodCkpOworCisJc2VxX3ByaW50ZihtLCAiJXVcbiIsIGF0b21pY19yZWFkKCZvYmQtPnUuY2xpLmNsX2Rlc3Ryb3lfaW5fZmxpZ2h0KSk7CisJcmV0dXJuIDA7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhvc2NfZGVzdHJveXNfaW5fZmxpZ2h0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jYWNoZS5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19jYWNoZS5jCmluZGV4IDcwMjJlZDQuLmQ0NGIzZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfY2FjaGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2NhY2hlLmMKQEAgLTI2MTMsNyArMjYxMyw3IEBACiAJfQogCW9zY19vYmplY3RfdW5sb2NrKG9iaik7CiAKLQlvc2NfaW9fdW5wbHVnKGVudiwgY2xpLCBvYmosIFBETF9QT0xJQ1lfUk9VTkQpOworCW9zY19pb191bnBsdWdfYXN5bmMoZW52LCBjbGksIG9iaik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfaW8uYwppbmRleCBmYWQ0YzEzLi4zYzczMDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX2lvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19pby5jCkBAIC00MTcsNyArNDE3LDcgQEAKIAogCQkJaWYgKGlhX3ZhbGlkICYgQVRUUl9TSVpFKSB7CiAJCQkJYXR0ci0+Y2F0X3NpemUgPSBhdHRyLT5jYXRfa21zID0gc2l6ZTsKLQkJCQljbF92YWxpZCA9IChDQVRfU0laRSB8IENBVF9LTVMpOworCQkJCWNsX3ZhbGlkID0gQ0FUX1NJWkUgfCBDQVRfS01TOwogCQkJfQogCQkJaWYgKGlhX3ZhbGlkICYgQVRUUl9NVElNRV9TRVQpIHsKIAkJCQlhdHRyLT5jYXRfbXRpbWUgPSBsdmItPmx2Yl9tdGltZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfbG9jay5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19sb2NrLmMKaW5kZXggNDQ1NjU1Ny4uMzUwYWQ0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19sb2NrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvb3NjL29zY19sb2NrLmMKQEAgLTEwMTAsNyArMTAxMCw3IEBACiAJc3RydWN0IGNsX2xvY2tfZGVzY3IgICAgKmRlc2NyICAgPSAmbG9jay0+Y2xsX2Rlc2NyOwogCXN0cnVjdCBjbF9vYmplY3RfaGVhZGVyICpoZHIgICAgID0gY2xfb2JqZWN0X2hlYWRlcihkZXNjci0+Y2xkX29iaik7CiAJc3RydWN0IGNsX2xvY2sJICAqc2NhbjsKLQlzdHJ1Y3QgY2xfbG9jawkgICpjb25mbGljdD0gTlVMTDsKKwlzdHJ1Y3QgY2xfbG9jawkgICpjb25mbGljdCA9IE5VTEw7CiAJaW50IGxvY2tsZXNzCQkgICAgID0gb3NjX2xvY2tfaXNfbG9ja2xlc3Mob2xjayk7CiAJaW50IHJjCQkJICAgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9vc2Mvb3NjX3JlcXVlc3QuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcmVxdWVzdC5jCmluZGV4IDBhZGZhNzAuLmQ3YTliNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcmVxdWVzdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL29zYy9vc2NfcmVxdWVzdC5jCkBAIC0xMTY1LDggKzExNjUsOCBAQAogc3RhdGljIGlubGluZSBpbnQgY2FuX21lcmdlX3BhZ2VzKHN0cnVjdCBicndfcGFnZSAqcDEsIHN0cnVjdCBicndfcGFnZSAqcDIpCiB7CiAJaWYgKHAxLT5mbGFnICE9IHAyLT5mbGFnKSB7Ci0JCXVuc2lnbmVkIG1hc2sgPSB+KE9CRF9CUldfRlJPTV9HUkFOVHwgT0JEX0JSV19OT0NBQ0hFfAotCQkJCSAgT0JEX0JSV19TWU5DfE9CRF9CUldfQVNZTkN8T0JEX0JSV19OT1FVT1RBKTsKKwkJdW5zaWduZWQgbWFzayA9IH4oT0JEX0JSV19GUk9NX0dSQU5UIHwgT0JEX0JSV19OT0NBQ0hFIHwKKwkJCQkgIE9CRF9CUldfU1lOQyB8IE9CRF9CUldfQVNZTkN8T0JEX0JSV19OT1FVT1RBKTsKIAogCQkvKiB3YXJuIGlmIHdlIHRyeSB0byBjb21iaW5lIGZsYWdzIHRoYXQgd2UgZG9uJ3Qga25vdyB0byBiZQogCQkgKiBzYWZlIHRvIGNvbWJpbmUgKi8KQEAgLTE4ODAsNiArMTg4MCw3IEBACiAJaW50CQkJCXBhZ2VfY291bnQgPSAwOwogCWludAkJCQlpOwogCWludAkJCQlyYzsKKwlzdHJ1Y3Qgb3N0X2JvZHkJCQkqYm9keTsKIAlMSVNUX0hFQUQocnBjX2xpc3QpOwogCiAJTEFTU0VSVCghbGlzdF9lbXB0eShleHRfbGlzdCkpOwpAQCAtMTk4MSw2ICsxOTgyLDggQEAKIAkgKiBsYXRlciBzZXRhdHRyIGJlZm9yZSBlYXJsaWVyIEJSVyAoYXMgZGV0ZXJtaW5lZCBieSB0aGUgcmVxdWVzdCB4aWQpLAogCSAqIHRoZSBPU1Qgd2lsbCBub3QgdXNlIEJSVyB0aW1lc3RhbXBzLiAgU2FkbHksIHRoZXJlIGlzIG5vIG9idmlvdXMKIAkgKiB3YXkgdG8gZG8gdGhpcyBpbiBhIHNpbmdsZSBjYWxsLiAgYnVnIDEwMTUwICovCisJYm9keSA9IHJlcV9jYXBzdWxlX2NsaWVudF9nZXQoJnJlcS0+cnFfcGlsbCwgJlJNRl9PU1RfQk9EWSk7CisJY3JhdHRyLT5jcmFfb2EgPSAmYm9keS0+b2E7CiAJY2xfcmVxX2F0dHJfc2V0KGVudiwgY2xlcnEsIGNyYXR0ciwKIAkJCU9CRF9NRF9GTE1USU1FfE9CRF9NRF9GTENUSU1FfE9CRF9NRF9GTEFUSU1FKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2NsaWVudC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2NsaWVudC5jCmluZGV4IDQ4ODJkZDAuLjAzNTdmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jbGllbnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY2xpZW50LmMKQEAgLTI4NSwxNCArMjg1LDI3IEBACiAJdGltZV90IG5vdyA9IGdldF9zZWNvbmRzKCk7CiAKIAlMQVNTRVJUKHJlcS0+cnFfaW1wb3J0KTsKLQlhdCA9ICZyZXEtPnJxX2ltcG9ydC0+aW1wX2F0OworCisJaWYgKHNlcnZpY2VfdGltZSA+IG5vdyAtIHJlcS0+cnFfc2VudCArIDMpIHsKKwkJLyogYnoxNjQwOCwgaG93ZXZlciwgdGhpcyBjYW4gYWxzbyBoYXBwZW4gaWYgZWFybHkgcmVwbHkKKwkJICogaXMgbG9zdCBhbmQgY2xpZW50IFJQQyBpcyBleHBpcmVkIGFuZCByZXNlbnQsIGVhcmx5IHJlcGx5CisJCSAqIG9yIHJlcGx5IG9mIG9yaWdpbmFsIFJQQyBjYW4gc3RpbGwgYmUgZml0IGluIHJlcGx5IGJ1ZmZlcgorCQkgKiBvZiByZXNlbnQgUlBDLCBub3cgY2xpZW50IGlzIG1lYXN1cmluZyB0aW1lIGZyb20gdGhlCisJCSAqIHJlc2VudCB0aW1lLCBidXQgc2VydmVyIHNlbnQgYmFjayBzZXJ2aWNlIHRpbWUgb2Ygb3JpZ2luYWwKKwkJICogUlBDLgorCQkgKi8KKwkJQ0RFQlVHKChsdXN0cmVfbXNnX2dldF9mbGFncyhyZXEtPnJxX3JlcW1zZykgJiBNU0dfUkVTRU5UKSA/CisJCSAgICAgICBEX0FEQVBUVE8gOiBEX1dBUk5JTkcsCisJCSAgICAgICAiUmVwb3J0ZWQgc2VydmljZSB0aW1lICV1ID4gdG90YWwgbWVhc3VyZWQgdGltZSAiCisJCSAgICAgICBDRlNfRFVSQVRJT05fVCJcbiIsIHNlcnZpY2VfdGltZSwKKwkJICAgICAgIGNmc190aW1lX3N1Yihub3csIHJlcS0+cnFfc2VudCkpOworCQlyZXR1cm47CisJfQogCiAJLyogTmV0d29yayBsYXRlbmN5IGlzIHRvdGFsIHRpbWUgbGVzcyBzZXJ2ZXIgcHJvY2Vzc2luZyB0aW1lICovCi0JbmwgPSBtYXhfdChpbnQsIG5vdyAtIHJlcS0+cnFfc2VudCAtIHNlcnZpY2VfdGltZSwgMCkgKyAxLypzdCByb3VuZGluZyovOwotCWlmIChzZXJ2aWNlX3RpbWUgPiBub3cgLSByZXEtPnJxX3NlbnQgKyAzIC8qIGJ6MTY0MDggKi8pCi0JCUNXQVJOKCJSZXBvcnRlZCBzZXJ2aWNlIHRpbWUgJXUgPiB0b3RhbCBtZWFzdXJlZCB0aW1lICIKLQkJICAgICAgQ0ZTX0RVUkFUSU9OX1QiXG4iLCBzZXJ2aWNlX3RpbWUsCi0JCSAgICAgIGNmc190aW1lX3N1Yihub3csIHJlcS0+cnFfc2VudCkpOworCW5sID0gbWF4X3QoaW50LCBub3cgLSByZXEtPnJxX3NlbnQgLQorCQkJc2VydmljZV90aW1lLCAwKSArIDE7IC8qIHN0IHJvdW5kaW5nICovCisJYXQgPSAmcmVxLT5ycV9pbXBvcnQtPmltcF9hdDsKIAogCW9sZG5sID0gYXRfbWVhc3VyZWQoJmF0LT5pYXRfbmV0X2xhdGVuY3ksIG5sKTsKIAlpZiAob2xkbmwgIT0gMCkKQEAgLTQ2OCw3ICs0ODEsNiBAQAogCQlsaXN0X2FkZF90YWlsKCZyZXEtPnJxX2xpc3QsICZwb29sLT5wcnBfcmVxX2xpc3QpOwogCX0KIAlzcGluX3VubG9jaygmcG9vbC0+cHJwX2xvY2spOwotCXJldHVybjsKIH0KIEVYUE9SVF9TWU1CT0wocHRscnBjX2FkZF9ycXNfdG9fcG9vbCk7CiAKQEAgLTE0MzksMTIgKzE0NTEsMTEgQEAKIAkJaWYgKHJlcS0+cnFfZXJyKSB7CiAJCQlyZXEtPnJxX3N0YXR1cyA9IHJjOwogCQkJcmV0dXJuIDE7Ci0JCX0gZWxzZSB7Ci0JCQlzcGluX2xvY2soJnJlcS0+cnFfbG9jayk7Ci0JCQlyZXEtPnJxX3dhaXRfY3R4ID0gMTsKLQkJCXNwaW5fdW5sb2NrKCZyZXEtPnJxX2xvY2spOwotCQkJcmV0dXJuIDA7CiAJCX0KKwkJc3Bpbl9sb2NrKCZyZXEtPnJxX2xvY2spOworCQlyZXEtPnJxX3dhaXRfY3R4ID0gMTsKKwkJc3Bpbl91bmxvY2soJnJlcS0+cnFfbG9jayk7CisJCXJldHVybiAwOwogCX0KIAogCUNERUJVRyhEX1JQQ1RSQUNFLCAiU2VuZGluZyBSUEMgcG5hbWU6Y2x1dWlkOnBpZDp4aWQ6bmlkOm9wYyAlczolczolZDolbGx1OiVzOiVkXG4iLApAQCAtMjE5Miw3ICsyMjAzLDcgQEAKIAlpZiAoc2V0LT5zZXRfaW50ZXJwcmV0ICE9IE5VTEwpIHsKIAkJaW50ICgqaW50ZXJwcmV0ZXIpKHN0cnVjdCBwdGxycGNfcmVxdWVzdF9zZXQgKnNldCwgdm9pZCAqLCBpbnQpID0KIAkJCXNldC0+c2V0X2ludGVycHJldDsKLQkJcmMgPSBpbnRlcnByZXRlciAoc2V0LCBzZXQtPnNldF9hcmcsIHJjKTsKKwkJcmMgPSBpbnRlcnByZXRlcihzZXQsIHNldC0+c2V0X2FyZywgcmMpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBwdGxycGNfc2V0X2NiZGF0YSAqY2JkYXRhLCAqbjsKIAkJaW50IGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jb25uZWN0aW9uLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvY29ubmVjdGlvbi5jCmluZGV4IDJhODc1YWIuLjdlMjczOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9jb25uZWN0aW9uLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2Nvbm5lY3Rpb24uYwpAQCAtMTg0LDYgKzE4NCw3IEBACiBjb25uX2tleShzdHJ1Y3QgaGxpc3Rfbm9kZSAqaG5vZGUpCiB7CiAJc3RydWN0IHB0bHJwY19jb25uZWN0aW9uICpjb25uOworCiAJY29ubiA9IGhsaXN0X2VudHJ5KGhub2RlLCBzdHJ1Y3QgcHRscnBjX2Nvbm5lY3Rpb24sIGNfaGFzaCk7CiAJcmV0dXJuICZjb25uLT5jX3BlZXI7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvaW1wb3J0LmMKaW5kZXggNGNlYjkwZC4uZDVmYzY4OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2ltcG9ydC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9pbXBvcnQuYwpAQCAtNjMsNiArNjMsMTkgQEAKIHN0YXRpYyB2b2lkIF9faW1wb3J0X3NldF9zdGF0ZShzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wLAogCQkJICAgICAgIGVudW0gbHVzdHJlX2ltcF9zdGF0ZSBzdGF0ZSkKIHsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBMVVNUUkVfSU1QX0NMT1NFRDoKKwljYXNlIExVU1RSRV9JTVBfTkVXOgorCWNhc2UgTFVTVFJFX0lNUF9ESVNDT046CisJY2FzZSBMVVNUUkVfSU1QX0NPTk5FQ1RJTkc6CisJCWJyZWFrOworCWNhc2UgTFVTVFJFX0lNUF9SRVBMQVlfV0FJVDoKKwkJaW1wLT5pbXBfcmVwbGF5X3N0YXRlID0gTFVTVFJFX0lNUF9SRVBMQVlfTE9DS1M7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWltcC0+aW1wX3JlcGxheV9zdGF0ZSA9IExVU1RSRV9JTVBfUkVQTEFZOworCX0KKwogCWltcC0+aW1wX3N0YXRlID0gc3RhdGU7CiAJaW1wLT5pbXBfc3RhdGVfaGlzdFtpbXAtPmltcF9zdGF0ZV9oaXN0X2lkeF0uaXNoX3N0YXRlID0gc3RhdGU7CiAJaW1wLT5pbXBfc3RhdGVfaGlzdFtpbXAtPmltcF9zdGF0ZV9oaXN0X2lkeF0uaXNoX3RpbWUgPQpAQCAtOTY2LDcgKzk3OSw3IEBACiAJCQlpbXAtPmltcF9yZXNlbmRfcmVwbGF5ID0gMTsKIAkJCXNwaW5fdW5sb2NrKCZpbXAtPmltcF9sb2NrKTsKIAotCQkJSU1QT1JUX1NFVF9TVEFURShpbXAsIExVU1RSRV9JTVBfUkVQTEFZKTsKKwkJCUlNUE9SVF9TRVRfU1RBVEUoaW1wLCBpbXAtPmltcF9yZXBsYXlfc3RhdGUpOwogCQl9IGVsc2UgewogCQkJSU1QT1JUX1NFVF9TVEFURShpbXAsIExVU1RSRV9JTVBfUkVDT1ZFUik7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYwppbmRleCBiYmVmNjY2Yi4uYTQyMzM1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xheW91dC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9sYXlvdXQuYwpAQCAtODExLDggKzgxMSw4IEBACiAJLnJtZl9uYW1lICAgID0gKG5hbWUpLAkJCQkgIFwKIAkucm1mX2ZsYWdzICAgPSAoZmxhZ3MpLAkJCQkgXAogCS5ybWZfc2l6ZSAgICA9IChzaXplKSwJCQkJICBcCi0JLnJtZl9zd2FiYmVyID0gKHZvaWQgKCopKHZvaWQqKSkoc3dhYmJlciksCSAgICAgIFwKLQkucm1mX2R1bXBlciAgPSAodm9pZCAoKikodm9pZCopKShkdW1wZXIpCQlcCisJLnJtZl9zd2FiYmVyID0gKHZvaWQgKCopKHZvaWQgKikpKHN3YWJiZXIpLAkgICAgICBcCisJLnJtZl9kdW1wZXIgID0gKHZvaWQgKCopKHZvaWQgKikpKGR1bXBlcikJCVwKIH0KIAogc3RydWN0IHJlcV9tc2dfZmllbGQgUk1GX0dFTkVSSUNfREFUQSA9CkBAIC0xODM5LDcgKzE4MzksNyBAQAogCUxBU1NFUlRGKG9mZnNldCA+IDAsICIlczolcywgb2ZmPSVkLCBsb2M9JWRcbiIsCiAJCQkgICAgcGlsbC0+cmNfZm10LT5yZl9uYW1lLAogCQkJICAgIGZpZWxkLT5ybWZfbmFtZSwgb2Zmc2V0LCBsb2MpOwotCW9mZnNldCAtLTsKKwlvZmZzZXQtLTsKIAogCUxBU1NFUlQoMCA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgUkVRX01BWF9GSUVMRF9OUik7CiAJcmV0dXJuIG9mZnNldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9scHJvY19wdGxycGMuYwppbmRleCAwZTIwNzFiLi45NTMzYWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbHByb2NfcHRscnBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL2xwcm9jX3B0bHJwYy5jCkBAIC0xODEsNyArMTgxLDcgQEAKIAlyZXR1cm4gbGxfZW9wY29kZV90YWJsZVtvcGNvZGVdLm9wbmFtZTsKIH0KIAotI2lmIGRlZmluZWQgKENPTkZJR19QUk9DX0ZTKQorI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpCiBzdGF0aWMgdm9pZCBwdGxycGNfbHByb2Nmc19yZWdpc3RlcihzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJvb3QsIGNoYXIgKmRpciwKIAkJCQkgICAgY2hhciAqbmFtZSwKIAkJCQkgICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcHJvY3Jvb3RfcmV0LApAQCAtMjY3LDcgKzI2Nyw4IEBACiAJcHRscnBjX3NlcnZpY2VfZm9yX2VhY2hfcGFydChzdmNwdCwgaSwgc3ZjKQogCQl0b3RhbCArPSBzdmNwdC0+c2NwX2hpc3RfbnJxYmRzOwogCi0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVkXG4iLCB0b3RhbCk7CisJc2VxX3ByaW50ZihtLCAiJWRcbiIsIHRvdGFsKTsKKwlyZXR1cm4gMDsKIH0KIExQUk9DX1NFUV9GT1BTX1JPKHB0bHJwY19scHJvY2ZzX3JlcV9oaXN0b3J5X2xlbik7CiAKQEAgLTI4Miw3ICsyODMsOCBAQAogCXB0bHJwY19zZXJ2aWNlX2Zvcl9lYWNoX3BhcnQoc3ZjcHQsIGksIHN2YykKIAkJdG90YWwgKz0gc3ZjLT5zcnZfaGlzdF9ucnFiZHNfY3B0X21heDsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlZFxuIiwgdG90YWwpOworCXNlcV9wcmludGYobSwgIiVkXG4iLCB0b3RhbCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC0zMjcsOCArMzI5LDggQEAKIHsKIAlzdHJ1Y3QgcHRscnBjX3NlcnZpY2UgKnN2YyA9IG0tPnByaXZhdGU7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWRcbiIsCi0JCQlzdmMtPnNydl9udGhyc19jcHRfaW5pdCAqIHN2Yy0+c3J2X25jcHRzKTsKKwlzZXFfcHJpbnRmKG0sICIlZFxuIiwgc3ZjLT5zcnZfbnRocnNfY3B0X2luaXQgKiBzdmMtPnNydl9uY3B0cyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC0zNzEsNyArMzczLDggQEAKIAlwdGxycGNfc2VydmljZV9mb3JfZWFjaF9wYXJ0KHN2Y3B0LCBpLCBzdmMpCiAJCXRvdGFsICs9IHN2Y3B0LT5zY3BfbnRocnNfcnVubmluZzsKIAotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlZFxuIiwgdG90YWwpOworCXNlcV9wcmludGYobSwgIiVkXG4iLCB0b3RhbCk7CisJcmV0dXJuIDA7CiB9CiBMUFJPQ19TRVFfRk9QU19STyhwdGxycGNfbHByb2Nmc190aHJlYWRzX3N0YXJ0ZWQpOwogCkBAIC0zODAsOCArMzgzLDggQEAKIHsKIAlzdHJ1Y3QgcHRscnBjX3NlcnZpY2UgKnN2YyA9IG0tPnByaXZhdGU7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWRcbiIsCi0JCQlzdmMtPnNydl9udGhyc19jcHRfbGltaXQgKiBzdmMtPnNydl9uY3B0cyk7CisJc2VxX3ByaW50ZihtLCAiJWRcbiIsIHN2Yy0+c3J2X250aHJzX2NwdF9saW1pdCAqIHN2Yy0+c3J2X25jcHRzKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QKQEAgLTEwMjYsNyArMTAyOSw4IEBACiBzdGF0aWMgaW50IHB0bHJwY19scHJvY2ZzX2hwX3JhdGlvX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgcHRscnBjX3NlcnZpY2UgKnN2YyA9IG0tPnByaXZhdGU7Ci0JcmV0dXJuIHNlcV9wcmludGYobSwgIiVkIiwgc3ZjLT5zcnZfaHByZXFfcmF0aW8pOworCXNlcV9wcmludGYobSwgIiVkIiwgc3ZjLT5zcnZfaHByZXFfcmF0aW8pOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3NpemVfdCBwdGxycGNfbHByb2Nmc19ocF9yYXRpb19zZXFfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCkBAIC0xMDgzLDcgKzEwODcsNyBAQAogCQkgLmRhdGEJICAgICA9IHN2Y30sCiAJCXtOVUxMfQogCX07Ci0Jc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVxX2hpc3RvcnlfZm9wcyA9IHsKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByZXFfaGlzdG9yeV9mb3BzID0gewogCQkub3duZXIgICAgICAgPSBUSElTX01PRFVMRSwKIAkJLm9wZW4JPSBwdGxycGNfbHByb2Nmc19zdmNfcmVxX2hpc3Rvcnlfb3BlbiwKIAkJLnJlYWQJPSBzZXFfcmVhZCwKQEAgLTEzMjQsMTMgKzEzMjgsMTIgQEAKIHsKIAlzdHJ1Y3Qgb2JkX2RldmljZSAqb2JkID0gbS0+cHJpdmF0ZTsKIAlzdHJ1Y3Qgb2JkX2ltcG9ydCAqaW1wID0gb2JkLT51LmNsaS5jbF9pbXBvcnQ7Ci0JaW50IHJjOwogCiAJTFBST0NGU19DTElNUF9DSEVDSyhvYmQpOwotCXJjID0gc2VxX3ByaW50ZihtLCAiJWRcbiIsICFpbXAtPmltcF9ub19waW5nZXJfcmVjb3Zlcik7CisJc2VxX3ByaW50ZihtLCAiJWRcbiIsICFpbXAtPmltcF9ub19waW5nZXJfcmVjb3Zlcik7CiAJTFBST0NGU19DTElNUF9FWElUKG9iZCk7CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGxwcm9jZnNfcmRfcGluZ2VyX3JlY292KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25pb2J1Zi5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25pb2J1Zi5jCmluZGV4IGY3MTVlOWEuLjJmYTI1ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9uaW9idWYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbmlvYnVmLmMKQEAgLTM4MywxMiArMzgzLDEzIEBACiAJCSAgICAgICByZXEtPnJxX2V4cG9ydC0+ZXhwX29iZC0+b2JkX21pbm9yKTsKIAl9CiAKLQkvKiBJbiBvcmRlciB0byBrZWVwIGludGVyb3ByYWJpbGl0eSB3aXRoIHRoZSBjbGllbnQgKDwgMi4zKSB3aGljaAorCS8qIEluIG9yZGVyIHRvIGtlZXAgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIHRoZSBjbGllbnQgKDwgMi4zKSB3aGljaAogCSAqIGRvZXNuJ3QgaGF2ZSBwYl9qb2JpZCBpbiBwdGxycGNfYm9keSwgV2UgaGF2ZSB0byBzaHJpbmsgdGhlCiAJICogcHRscnBjX2JvZHkgaW4gcmVwbHkgYnVmZmVyIHRvIHB0bHJwY19ib2R5X3YyLCBvdGhlcndpc2UsIHRoZQogCSAqIHJlcGx5IGJ1ZmZlciBvbiBjbGllbnQgd2lsbCBiZSBvdmVyZmxvdy4KIAkgKgotCSAqIFhYWCBSZW1vdmUgdGhpcyB3aGVuZXZlciB3ZSBkcm9wIHRoZSBpbnRlcm9wcmFiaWxpdHkgd2l0aCBzdWNoIGNsaWVudC4KKwkgKiBYWFggUmVtb3ZlIHRoaXMgd2hlbmV2ZXIgd2UgZHJvcCB0aGUgaW50ZXJvcGVyYWJpbGl0eSB3aXRoCisJICogc3VjaCBjbGllbnQuCiAJICovCiAJcmVxLT5ycV9yZXBsZW4gPSBsdXN0cmVfc2hyaW5rX21zZyhyZXEtPnJxX3JlcG1zZywgMCwKIAkJCQkJICAgc2l6ZW9mKHN0cnVjdCBwdGxycGNfYm9keV92MiksIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25ycy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL25ycy5jCmluZGV4IGQ1ZmQ3MjEuLjgxYWQ3NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9ucnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvbnJzLmMKQEAgLTE1NSw5ICsxNTUsOCBAQAogewogCXN0cnVjdCBwdGxycGNfbnJzX3BvbGljeSAqdG1wID0gbnJzLT5ucnNfcG9saWN5X3ByaW1hcnk7CiAKLQlpZiAodG1wID09IE5VTEwpIHsKKwlpZiAodG1wID09IE5VTEwpCiAJCXJldHVybjsKLQl9CiAKIAlucnMtPm5yc19wb2xpY3lfcHJpbWFyeSA9IE5VTEw7CiAKQEAgLTkxMiw3ICs5MTEsNiBAQAogc3RhdGljIGludCBucnNfc3ZjcHRfc2V0dXBfbG9ja2VkMChzdHJ1Y3QgcHRscnBjX25ycyAqbnJzLAogCQkJCSAgIHN0cnVjdCBwdGxycGNfc2VydmljZV9wYXJ0ICpzdmNwdCkKIHsKLQlpbnQJCQkJcmM7CiAJZW51bSBwdGxycGNfbnJzX3F1ZXVlX3R5cGUJcXVldWU7CiAKIAlMQVNTRVJUKG11dGV4X2lzX2xvY2tlZCgmbnJzX2NvcmUubnJzX211dGV4KSk7CkBAIC05MzAsOSArOTI4LDcgQEAKIAlJTklUX0xJU1RfSEVBRCgmbnJzLT5ucnNfcG9saWN5X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZucnMtPm5yc19wb2xpY3lfcXVldWVkKTsKIAotCXJjID0gbnJzX3JlZ2lzdGVyX3BvbGljaWVzX2xvY2tlZChucnMpOwotCi0JcmV0dXJuIHJjOworCXJldHVybiBucnNfcmVnaXN0ZXJfcG9saWNpZXNfbG9ja2VkKG5ycyk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jCmluZGV4IDJmNDVmNzY1Li5iNTFhZjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGFja19nZW5lcmljLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3BhY2tfZ2VuZXJpYy5jCkBAIC0xMTcsMTMgKzExNywxMyBAQAogLyogZWFybHkgcmVwbHkgc2l6ZSAqLwogaW50IGx1c3RyZV9tc2dfZWFybHlfc2l6ZSh2b2lkKQogewotCXN0YXRpYyBpbnQgc2l6ZSA9IDA7CisJc3RhdGljIGludCBzaXplOwogCWlmICghc2l6ZSkgewotCQkvKiBBbHdheXMgcmVwbHkgb2xkIHB0bHJwY19ib2R5X3YyIHRvIGtlZXAgaW50ZXJvcHJhYmlsaXR5CisJCS8qIEFsd2F5cyByZXBseSBvbGQgcHRscnBjX2JvZHlfdjIgdG8ga2VlcCBpbnRlcm9wZXJhYmlsaXR5CiAJCSAqIHdpdGggdGhlIG9sZCBjbGllbnQgKDwgMi4zKSB3aGljaCBkb2Vzbid0IGhhdmUgcGJfam9iaWQKIAkJICogaW4gdGhlIHB0bHJwY19ib2R5LgogCQkgKgotCQkgKiBYWFggUmVtb3ZlIHRoaXMgd2hlbmV2ZXIgd2UgZHJvcCBpbnRlcm9wcmFiaWxpdHkgd2l0aCBzdWNoCisJCSAqIFhYWCBSZW1vdmUgdGhpcyB3aGVuZXZlciB3ZSBkcm9wIGludGVyb3BlcmFiaWxpdHkgd2l0aCBzdWNoCiAJCSAqICAgICBjbGllbnQuCiAJCSAqLwogCQlfX3UzMiBwYmxlbiA9IHNpemVvZihzdHJ1Y3QgcHRscnBjX2JvZHlfdjIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3Bpbmdlci5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3Bpbmdlci5jCmluZGV4IDM0MGQ5OGEuLjlkYmRhOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9waW5nZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcGluZ2VyLmMKQEAgLTU0NSw3ICs1NDUsNyBAQAogI2RlZmluZSBQRVRfUkVBRFkgICAgIDEKICNkZWZpbmUgUEVUX1RFUk1JTkFURSAyCiAKLXN0YXRpYyBpbnQJICAgICAgIHBldF9yZWZjb3VudCA9IDA7CitzdGF0aWMgaW50IHBldF9yZWZjb3VudDsKIHN0YXRpYyBpbnQJICAgICAgIHBldF9zdGF0ZTsKIHN0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCAgICAgICBwZXRfd2FpdHE7CiBMSVNUX0hFQUQocGV0X2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY19pbnRlcm5hbC5oIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY19pbnRlcm5hbC5oCmluZGV4IDdmZTJlNTguLmE2NmRjM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNfaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjX2ludGVybmFsLmgKQEAgLTc2LDcgKzc2LDcgQEAKIGludCBsdXN0cmVfdW5wYWNrX3JlcV9wdGxycGNfYm9keShzdHJ1Y3QgcHRscnBjX3JlcXVlc3QgKnJlcSwgaW50IG9mZnNldCk7CiBpbnQgbHVzdHJlX3VucGFja19yZXBfcHRscnBjX2JvZHkoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEsIGludCBvZmZzZXQpOwogCi0jaWYgZGVmaW5lZCAoQ09ORklHX1BST0NfRlMpCisjaWYgZGVmaW5lZChDT05GSUdfUFJPQ19GUykKIHZvaWQgcHRscnBjX2xwcm9jZnNfcmVnaXN0ZXJfc2VydmljZShzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfZW50cnksCiAJCQkJICAgICBzdHJ1Y3QgcHRscnBjX3NlcnZpY2UgKnN2Yyk7CiB2b2lkIHB0bHJwY19scHJvY2ZzX3VucmVnaXN0ZXJfc2VydmljZShzdHJ1Y3QgcHRscnBjX3NlcnZpY2UgKnN2Yyk7CkBAIC0yNjMsNyArMjYzLDcgQEAKIGludCBzcHRscnBjX3Byb2NfZW5jX3Bvb2xfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KTsKIAogLyogc2VjX2xwcm9jLmMgKi8KLSNpZiBkZWZpbmVkIChDT05GSUdfUFJPQ19GUykKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9DX0ZTKQogaW50ICBzcHRscnBjX2xwcm9jX2luaXQodm9pZCk7CiB2b2lkIHNwdGxycGNfbHByb2NfZmluaSh2b2lkKTsKICNlbHNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jIGIvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3B0bHJwY2QuYwppbmRleCA0NjIxYjcxLi4wYzE3OGVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvcHRscnBjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9wdGxycGNkLmMKQEAgLTg1LDcgKzg1LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcHRscnBjZCAqcHRscnBjZHM7CiAKIHN0cnVjdCBtdXRleCBwdGxycGNkX211dGV4Owotc3RhdGljIGludCBwdGxycGNkX3VzZXJzID0gMDsKK3N0YXRpYyBpbnQgcHRscnBjZF91c2VyczsKIAogdm9pZCBwdGxycGNkX3dha2Uoc3RydWN0IHB0bHJwY19yZXF1ZXN0ICpyZXEpCiB7CkBAIC01MTEsMTAgKzUxMSwxMCBAQAogI2lmIGRlZmluZWQoQ09ORklHX05VTUEpCiAJewogCQlpbnQgaTsKLQkJbWFzayA9ICpjcHVtYXNrX29mX25vZGUoY3B1X3RvX25vZGUoaW5kZXgpKTsKKwkJY3B1bWFza19jb3B5KCZtYXNrLCBjcHVtYXNrX29mX25vZGUoY3B1X3RvX25vZGUoaW5kZXgpKSk7CiAJCWZvciAoaSA9IG1heDsgaSA8IG51bV9vbmxpbmVfY3B1cygpOyBpKyspCi0JCQljcHVfY2xlYXIoaSwgbWFzayk7Ci0JCXBjLT5wY19ucGFydG5lcnMgPSBjcHVzX3dlaWdodChtYXNrKSAtIDE7CisJCQljcHVtYXNrX2NsZWFyX2NwdShpLCAmbWFzayk7CisJCXBjLT5wY19ucGFydG5lcnMgPSBjcHVtYXNrX3dlaWdodCgmbWFzaykgLSAxOwogCQlzZXRfYml0KExJT0RfQklORCwgJnBjLT5wY19mbGFncyk7CiAJfQogI2Vsc2UKQEAgLTU1NCw3ICs1NTQsNyBAQAogCQkJCSAqIHRoYXQgYXJlIGFscmVhZHkgaW5pdGlhbGl6ZWQKIAkJCQkgKi8KIAkJCQlmb3IgKHBpZHggPSAwLCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKLQkJCQkJaWYgKGNwdV9pc3NldChpLCBtYXNrKSkgeworCQkJCQlpZiAoY3B1bWFza190ZXN0X2NwdShpLCAmbWFzaykpIHsKIAkJCQkJCXBwYyA9ICZwdGxycGNkcy0+cGRfdGhyZWFkc1tpXTsKIAkJCQkJCXBjLT5wY19wYXJ0bmVyc1twaWR4KytdID0gcHBjOwogCQkJCQkJcHBjLT5wY19wYXJ0bmVyc1twcGMtPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlY19idWxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYwppbmRleCAwZGFiZDgzLi5jMDVhODU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VjX2J1bGsuYwpAQCAtMTI1LDUyICsxMjUsNTAgQEAKICAqLwogaW50IHNwdGxycGNfcHJvY19lbmNfcG9vbF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0JaW50ICAgICByYzsKLQogCXNwaW5fbG9jaygmcGFnZV9wb29scy5lcHBfbG9jayk7CiAKLQlyYyA9IHNlcV9wcmludGYobSwKLQkJICAgICAgInBoeXNpY2FsIHBhZ2VzOgkgICVsdVxuIgotCQkgICAgICAicGFnZXMgcGVyIHBvb2w6CSAgJWx1XG4iCi0JCSAgICAgICJtYXggcGFnZXM6CSAgICAgICAlbHVcbiIKLQkJICAgICAgIm1heCBwb29sczoJICAgICAgICV1XG4iCi0JCSAgICAgICJ0b3RhbCBwYWdlczoJICAgICAlbHVcbiIKLQkJICAgICAgInRvdGFsIGZyZWU6CSAgICAgICVsdVxuIgotCQkgICAgICAiaWRsZSBpbmRleDoJICAgICAgJWx1LzEwMFxuIgotCQkgICAgICAibGFzdCBzaHJpbms6CSAgICAgJWxkc1xuIgotCQkgICAgICAibGFzdCBhY2Nlc3M6CSAgICAgJWxkc1xuIgotCQkgICAgICAibWF4IHBhZ2VzIHJlYWNoZWQ6ICAgICAgICVsdVxuIgotCQkgICAgICAiZ3Jvd3M6CQkgICAldVxuIgotCQkgICAgICAiZ3Jvd3MgZmFpbHVyZToJICAgJXVcbiIKLQkJICAgICAgInNocmlua3M6CQkgJXVcbiIKLQkJICAgICAgImNhY2hlIGFjY2VzczoJICAgICVsdVxuIgotCQkgICAgICAiY2FjaGUgbWlzc2luZzoJICAgJWx1XG4iCi0JCSAgICAgICJsb3cgZnJlZSBtYXJrOgkgICAlbHVcbiIKLQkJICAgICAgIm1heCB3YWl0cXVldWUgZGVwdGg6ICAgICAldVxuIgotCQkgICAgICAibWF4IHdhaXQgdGltZToJICAgIkNGU19USU1FX1QiLyV1XG4iCi0JCSAgICAgICwKLQkJICAgICAgdG90YWxyYW1fcGFnZXMsCi0JCSAgICAgIFBBR0VTX1BFUl9QT09MLAotCQkgICAgICBwYWdlX3Bvb2xzLmVwcF9tYXhfcGFnZXMsCi0JCSAgICAgIHBhZ2VfcG9vbHMuZXBwX21heF9wb29scywKLQkJICAgICAgcGFnZV9wb29scy5lcHBfdG90YWxfcGFnZXMsCi0JCSAgICAgIHBhZ2VfcG9vbHMuZXBwX2ZyZWVfcGFnZXMsCi0JCSAgICAgIHBhZ2VfcG9vbHMuZXBwX2lkbGVfaWR4LAotCQkgICAgICBnZXRfc2Vjb25kcygpIC0gcGFnZV9wb29scy5lcHBfbGFzdF9zaHJpbmssCi0JCSAgICAgIGdldF9zZWNvbmRzKCkgLSBwYWdlX3Bvb2xzLmVwcF9sYXN0X2FjY2VzcywKLQkJICAgICAgcGFnZV9wb29scy5lcHBfc3RfbWF4X3BhZ2VzLAotCQkgICAgICBwYWdlX3Bvb2xzLmVwcF9zdF9ncm93cywKLQkJICAgICAgcGFnZV9wb29scy5lcHBfc3RfZ3Jvd19mYWlscywKLQkJICAgICAgcGFnZV9wb29scy5lcHBfc3Rfc2hyaW5rcywKLQkJICAgICAgcGFnZV9wb29scy5lcHBfc3RfYWNjZXNzLAotCQkgICAgICBwYWdlX3Bvb2xzLmVwcF9zdF9taXNzaW5ncywKLQkJICAgICAgcGFnZV9wb29scy5lcHBfc3RfbG93ZnJlZSwKLQkJICAgICAgcGFnZV9wb29scy5lcHBfc3RfbWF4X3dxbGVuLAotCQkgICAgICBwYWdlX3Bvb2xzLmVwcF9zdF9tYXhfd2FpdCwgSFoKLQkJICAgICApOworCXNlcV9wcmludGYobSwKKwkJICAgInBoeXNpY2FsIHBhZ2VzOgkgICVsdVxuIgorCQkgICAicGFnZXMgcGVyIHBvb2w6CSAgJWx1XG4iCisJCSAgICJtYXggcGFnZXM6CSAgICAgICAlbHVcbiIKKwkJICAgIm1heCBwb29sczoJICAgICAgICV1XG4iCisJCSAgICJ0b3RhbCBwYWdlczoJICAgICAlbHVcbiIKKwkJICAgInRvdGFsIGZyZWU6CSAgICAgICVsdVxuIgorCQkgICAiaWRsZSBpbmRleDoJICAgICAgJWx1LzEwMFxuIgorCQkgICAibGFzdCBzaHJpbms6CSAgICAgJWxkc1xuIgorCQkgICAibGFzdCBhY2Nlc3M6CSAgICAgJWxkc1xuIgorCQkgICAibWF4IHBhZ2VzIHJlYWNoZWQ6ICAgICAgICVsdVxuIgorCQkgICAiZ3Jvd3M6CQkgICAldVxuIgorCQkgICAiZ3Jvd3MgZmFpbHVyZToJICAgJXVcbiIKKwkJICAgInNocmlua3M6CQkgJXVcbiIKKwkJICAgImNhY2hlIGFjY2VzczoJICAgICVsdVxuIgorCQkgICAiY2FjaGUgbWlzc2luZzoJICAgJWx1XG4iCisJCSAgICJsb3cgZnJlZSBtYXJrOgkgICAlbHVcbiIKKwkJICAgIm1heCB3YWl0cXVldWUgZGVwdGg6ICAgICAldVxuIgorCQkgICAibWF4IHdhaXQgdGltZToJICAgIiBDRlNfVElNRV9UICIvJXVcbiIsCisJCSAgIHRvdGFscmFtX3BhZ2VzLAorCQkgICBQQUdFU19QRVJfUE9PTCwKKwkJICAgcGFnZV9wb29scy5lcHBfbWF4X3BhZ2VzLAorCQkgICBwYWdlX3Bvb2xzLmVwcF9tYXhfcG9vbHMsCisJCSAgIHBhZ2VfcG9vbHMuZXBwX3RvdGFsX3BhZ2VzLAorCQkgICBwYWdlX3Bvb2xzLmVwcF9mcmVlX3BhZ2VzLAorCQkgICBwYWdlX3Bvb2xzLmVwcF9pZGxlX2lkeCwKKwkJICAgZ2V0X3NlY29uZHMoKSAtIHBhZ2VfcG9vbHMuZXBwX2xhc3Rfc2hyaW5rLAorCQkgICBnZXRfc2Vjb25kcygpIC0gcGFnZV9wb29scy5lcHBfbGFzdF9hY2Nlc3MsCisJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF9wYWdlcywKKwkJICAgcGFnZV9wb29scy5lcHBfc3RfZ3Jvd3MsCisJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X2dyb3dfZmFpbHMsCisJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X3Nocmlua3MsCisJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X2FjY2VzcywKKwkJICAgcGFnZV9wb29scy5lcHBfc3RfbWlzc2luZ3MsCisJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X2xvd2ZyZWUsCisJCSAgIHBhZ2VfcG9vbHMuZXBwX3N0X21heF93cWxlbiwKKwkJICAgcGFnZV9wb29scy5lcHBfc3RfbWF4X3dhaXQsCisJCSAgIEhaKTsKIAogCXNwaW5fdW5sb2NrKCZwYWdlX3Bvb2xzLmVwcF9sb2NrKTsKLQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZW5jX3Bvb2xzX3JlbGVhc2VfZnJlZV9wYWdlcyhsb25nIG5wYWdlcykKQEAgLTM2NSw4ICszNjMsOCBAQAogCSAqLwogCWN1cl9ucG9vbHMgPSAocGFnZV9wb29scy5lcHBfdG90YWxfcGFnZXMgKyBQQUdFU19QRVJfUE9PTCAtIDEpIC8KIAkJICAgICBQQUdFU19QRVJfUE9PTDsKLQllbmRfbnBvb2xzID0gKHBhZ2VfcG9vbHMuZXBwX3RvdGFsX3BhZ2VzICsgbnBhZ2VzICsgUEFHRVNfUEVSX1BPT0wgLSAxKSAvCi0JCSAgICAgUEFHRVNfUEVSX1BPT0w7CisJZW5kX25wb29scyA9IChwYWdlX3Bvb2xzLmVwcF90b3RhbF9wYWdlcyArIG5wYWdlcyArIFBBR0VTX1BFUl9QT09MIC0gMSkKKwkJICAgICAvIFBBR0VTX1BFUl9QT09MOwogCUxBU1NFUlQoZW5kX25wb29scyA8PSBwYWdlX3Bvb2xzLmVwcF9tYXhfcG9vbHMpOwogCiAJbnBfaWR4ID0gMDsKQEAgLTgxNiw5ICs4MTQsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoc3dhYmJlZCkgeworCWlmIChzd2FiYmVkKQogCQlfX3N3YWIzMnMoJmJzZC0+YnNkX25vYik7Ci0JfQogCiAJaWYgKHVubGlrZWx5KGJzZC0+YnNkX3ZlcnNpb24gIT0gMCkpIHsKIAkJQ0VSUk9SKCJVbmV4cGVjdGVkIHZlcnNpb24gJXVcbiIsIGJzZC0+YnNkX3ZlcnNpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlcnZpY2UuYyBiL2RyaXZlcnMvc3RhZ2luZy9sdXN0cmUvbHVzdHJlL3B0bHJwYy9zZXJ2aWNlLmMKaW5kZXggNjM1YjEyYi4uOGU2MTQyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2x1c3RyZS9sdXN0cmUvcHRscnBjL3NlcnZpY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbHVzdHJlL2x1c3RyZS9wdGxycGMvc2VydmljZS5jCkBAIC01NDMsNyArNTQzLDYgQEAKIAlpZiAodGMtPnRjX3Rocl9mYWN0b3IgIT0gMCkgewogCQlpbnQJICBmYWN0b3IgPSB0Yy0+dGNfdGhyX2ZhY3RvcjsKIAkJY29uc3QgaW50IGZhZGUgPSA0OwotCQljcHVtYXNrX3QgbWFzazsKIAogCQkvKgogCQkgKiBVc2VyIHdhbnRzIHRvIGluY3JlYXNlIG51bWJlciBvZiB0aHJlYWRzIHdpdGggZm9yCkBAIC01NTcsOCArNTU2LDggQEAKIAkJICogaGF2ZSB0b28gbWFueSB0aHJlYWRzIG5vIG1hdHRlciBob3cgbWFueSBjb3Jlcy9IVHMKIAkJICogdGhlcmUgYXJlLgogCQkgKi8KLQkJY3B1bWFza19jb3B5KCZtYXNrLCB0b3BvbG9neV90aHJlYWRfY3B1bWFzaygwKSk7Ci0JCWlmIChjcHVzX3dlaWdodChtYXNrKSA+IDEpIHsgLyogd2VpZ2h0IGlzICMgb2YgSFRzICovCisJCS8qIHdlaWdodCBpcyAjIG9mIEhUcyAqLworCQlpZiAoY3B1bWFza193ZWlnaHQodG9wb2xvZ3lfdGhyZWFkX2NwdW1hc2soMCkpID4gMSkgewogCQkJLyogZGVwcmVzcyB0aHJlYWQgZmFjdG9yIGZvciBoeXBlci10aHJlYWQgKi8KIAkJCWZhY3RvciA9IGZhY3RvciAtIChmYWN0b3IgPj4gMSkgKyAoZmFjdG9yID4+IDMpOwogCQl9CkBAIC0yNzUyLDcgKzI3NTEsNiBAQAogCiBpbnQgcHRscnBjX2hyX2luaXQodm9pZCkKIHsKLQljcHVtYXNrX3QJCQltYXNrOwogCXN0cnVjdCBwdGxycGNfaHJfcGFydGl0aW9uCSpocnA7CiAJc3RydWN0IHB0bHJwY19ocl90aHJlYWQJCSpocnQ7CiAJaW50CQkJCXJjOwpAQCAtMjc3MCw4ICsyNzY4LDcgQEAKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnB0bHJwY19oci5ocl93YWl0cSk7CiAKLQljcHVtYXNrX2NvcHkoJm1hc2ssIHRvcG9sb2d5X3RocmVhZF9jcHVtYXNrKDApKTsKLQl3ZWlnaHQgPSBjcHVzX3dlaWdodChtYXNrKTsKKwl3ZWlnaHQgPSBjcHVtYXNrX3dlaWdodCh0b3BvbG9neV90aHJlYWRfY3B1bWFzaygwKSk7CiAKIAljZnNfcGVyY3B0X2Zvcl9lYWNoKGhycCwgaSwgcHRscnBjX2hyLmhyX3BhcnRpdGlvbnMpIHsKIAkJaHJwLT5ocnBfY3B0ID0gaTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L3JhZGlvLWJjbTIwNDguYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9iY20yMDQ4L3JhZGlvLWJjbTIwNDguYwppbmRleCA1MzgyNTA2Li5mMjhmZmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvYmNtMjA0OC9yYWRpby1iY20yMDQ4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2JjbTIwNDgvcmFkaW8tYmNtMjA0OC5jCkBAIC0xNDQ4LDggKzE0NDgsOCBAQAogCQkvKiBCbG9jayBBIG1hdGNoLCBvbmx5IGRhdGEgd2l0aG91dCBjcmMgZXJyb3JzIHRha2VuICovCiAJCWlmIChiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2ldID09IEJDTTIwNDhfUkRTX0JMT0NLX0EpIHsKIAotCQkJcGkgPSAoKGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsxXSA8PCA4KSArCi0JCQkJYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzJdKTsKKwkJCXBpID0gKGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsxXSA8PCA4KSArCisJCQkJYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzJdOwogCiAJCQlpZiAoIWJkZXYtPnJkc19pbmZvLnJkc19waSkgewogCQkJCWJkZXYtPnJkc19pbmZvLnJkc19waSA9IHBpOwpAQCAtMTUwMyw4ICsxNTAzLDggQEAKIAlpZiAoKGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaV0gJiBCQ00yMDQ4X1JEU19CTE9DS19NQVNLKSA9PQogCQlCQ00yMDQ4X1JEU19CTE9DS19CKSB7CiAKLQkJcnRfaWQgPSAoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzFdICYKLQkJCUJDTTIwNDhfUkRTX0JMT0NLX01BU0spOworCQlydF9pZCA9IGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbaSsxXSAmCisJCQlCQ00yMDQ4X1JEU19CTE9DS19NQVNLOwogCQlydF9ncm91cF9iID0gYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzFdICYKIAkJCUJDTTIwNDhfUkRTX0dST1VQX0FCX01BU0s7CiAJCXJ0X2FiID0gYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtpKzJdICYKQEAgLTE3OTIsNyArMTc5Miw3IEBACiAJCWdvdG8gdW5sb2NrOwogCX0KIAotCWRhdGFfYnVmZmVyID0ga3phbGxvYyhCQ00yMDQ4X01BWF9SRFNfUkFESU9fVEVYVCo1LCBHRlBfS0VSTkVMKTsKKwlkYXRhX2J1ZmZlciA9IGtjYWxsb2MoQkNNMjA0OF9NQVhfUkRTX1JBRElPX1RFWFQsIDUsIEdGUF9LRVJORUwpOwogCWlmICghZGF0YV9idWZmZXIpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byB1bmxvY2s7CkBAIC0yMjQ1LDggKzIyNDUsNyBAQAogCiAJCXRtcGJ1ZltpXSA9IGJkZXYtPnJkc19pbmZvLnJhZGlvX3RleHRbYmRldi0+cmRfaW5kZXgraSsyXTsKIAkJdG1wYnVmW2krMV0gPSBiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2JkZXYtPnJkX2luZGV4K2krMV07Ci0JCXRtcGJ1ZltpKzJdID0gKChiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2JkZXYtPnJkX2luZGV4K2ldCi0JCQkJJiAweGYwKSA+PiA0KTsKKwkJdG1wYnVmW2krMl0gPSAoYmRldi0+cmRzX2luZm8ucmFkaW9fdGV4dFtiZGV2LT5yZF9pbmRleCArIGldICYgMHhmMCkgPj4gNDsKIAkJaWYgKChiZGV2LT5yZHNfaW5mby5yYWRpb190ZXh0W2JkZXYtPnJkX2luZGV4K2ldICYKIAkJCUJDTTIwNDhfUkRTX0NSQ19NQVNLKSA9PSBCQ00yMDQ4X1JEU19DUkNfVU5SRUNPVkFSQUJMRSkKIAkJCXRtcGJ1ZltpKzJdIHw9IDB4ODA7CkBAIC0yNzE4LDIyICsyNzE3LDcgQEAKIAkuaWRfdGFibGUJPSBiY20yMDQ4X2lkLAogfTsKIAotLyoKLSAqCU1vZHVsZSBJbnRlcmZhY2UKLSAqLwotc3RhdGljIGludCBfX2luaXQgYmNtMjA0OF9tb2R1bGVfaW5pdCh2b2lkKQotewotCXByX2luZm8oQkNNMjA0OF9EUklWRVJfREVTQyAiXG4iKTsKLQotCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYmNtMjA0OF9pMmNfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KGJjbTIwNDhfbW9kdWxlX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYmNtMjA0OF9tb2R1bGVfZXhpdCh2b2lkKQotewotCWkyY19kZWxfZHJpdmVyKCZiY20yMDQ4X2kyY19kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQoYmNtMjA0OF9tb2R1bGVfZXhpdCk7Cittb2R1bGVfaTJjX2RyaXZlcihiY20yMDQ4X2kyY19kcml2ZXIpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKEJDTTIwNDhfRFJJVkVSX0FVVEhPUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvY3hkMjA5OS9jeGQyMDk5LmMKaW5kZXggNjU3ZWE0OC4uNjkyYmEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2N4ZDIwOTkvY3hkMjA5OS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9jeGQyMDk5L2N4ZDIwOTkuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS9kbTM2NV9pcGlwZWlmLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X2lwaXBlaWYuYwppbmRleCA4N2Q0MmUxLi4xN2UxMDVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X2lwaXBlaWYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X2lwaXBlaWYuYwpAQCAtMjA5LDEwICsyMDksMTAgQEAKIAkvKiBDb21iaW5lIGFsbCB0aGUgZmllbGRzIHRvIG1ha2UgQ0ZHMSByZWdpc3RlciBvZiBJUElQRUlGICovCiAJdG1wID0gdmFsID0gZ2V0X29uZXNob3RfbW9kZShpcGlwZWlmLT5pbnB1dCk7CiAJaWYgKHRtcCA8IDApIHsKLQkJcHJfZXJyKCJpcGlwZWlmOiBsaW5rcyBzZXR1cCByZXF1aXJlZCIpOworCQlkZXZfZXJyKCZzZC0+ZGV2bm9kZS0+ZGV2LCAiaXBpcGVpZjogbGlua3Mgc2V0dXAgcmVxdWlyZWQiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCXZhbCA9IHZhbCA8PCBPTkVTSE9UX1NISUZUOworCXZhbCA8PD0gT05FU0hPVF9TSElGVDsKIAogCWlwaXBlaWZfc291cmNlID0gaXBpcGVpZl9nZXRfc291cmNlKGlwaXBlaWYpOwogCXZhbCB8PSBpcGlwZWlmX3NvdXJjZSA8PCBJTlBTUkNfU0hJRlQ7CkBAIC03NDcsNyArNzQ3LDYgQEAKIAkJCS5jbGlwID0gNDA5NSwKIAkJfSwKIAl9OwotCW1lbXNldCgmaXBpcGVpZi0+Y29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGlwaXBlaWZfcGFyYW1zKSk7CiAJbWVtY3B5KCZpcGlwZWlmLT5jb25maWcsICZpcGlwZWlmX2RlZmF1bHRzLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGlwaXBlaWZfcGFyYW1zKSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL2RtMzY1X3Jlc2l6ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfcmVzaXplci5jCmluZGV4IDc1ZTcwZTEuLjdjYzhkMWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfcmVzaXplci5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvZG0zNjVfcmVzaXplci5jCkBAIC05MDcsNyArOTA3LDYgQEAKIAkJCS5vdXRfY2hyX3BvcyA9IFZQRkVfSVBJUEVfWVVWNDIyX0NIUl9QT1NfQ09TSVRFLAogCQl9LAogCX07Ci0JbWVtc2V0KCZyZXNpemVyLT5jb25maWcsIDAsIHNpemVvZihzdHJ1Y3QgcmVzaXplcl9wYXJhbXMpKTsKIAltZW1jcHkoJnJlc2l6ZXItPmNvbmZpZywgJnJzel9kZWZhdWx0X2NvbmZpZywKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCByZXNpemVyX3BhcmFtcykpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX21jX2NhcHR1cmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9kYXZpbmNpX3ZwZmUvdnBmZV9tY19jYXB0dXJlLmMKaW5kZXggYTM1MGEyMC4uNTc0MjYxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2RhdmluY2lfdnBmZS92cGZlX21jX2NhcHR1cmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvZGF2aW5jaV92cGZlL3ZwZmVfbWNfY2FwdHVyZS5jCkBAIC0yMjYsOCArMjI2LDggQEAKIAlpZiAoIXZwZmVfY2ZnLT5udW1fY2xvY2tzKQogCQlyZXR1cm4gMDsKIAotCXZwZmVfZGV2LT5jbGtzID0ga3phbGxvYyh2cGZlX2NmZy0+bnVtX2Nsb2NrcyAqCi0JCQkJICAgc2l6ZW9mKHN0cnVjdCBjbG9jayAqKSwgR0ZQX0tFUk5FTCk7CisJdnBmZV9kZXYtPmNsa3MgPSBrY2FsbG9jKHZwZmVfY2ZnLT5udW1fY2xvY2tzLAorCQkJCSBzaXplb2Yoc3RydWN0IGNsb2NrICopLCBHRlBfS0VSTkVMKTsKIAlpZiAodnBmZV9kZXYtPmNsa3MgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTM0Niw3ICszNDYsOCBAQAogCWkyY19hZGFwID0gaTJjX2dldF9hZGFwdGVyKDEpOwogCW51bV9zdWJkZXZzID0gdnBmZV9jZmctPm51bV9zdWJkZXZzOwogCXZwZmVfZGV2LT5zZCA9Ci0JCSAga3phbGxvYyhzaXplb2Yoc3RydWN0IHY0bDJfc3ViZGV2ICopKm51bV9zdWJkZXZzLCBHRlBfS0VSTkVMKTsKKwkJICBrY2FsbG9jKG51bV9zdWJkZXZzLCBzaXplb2Yoc3RydWN0IHY0bDJfc3ViZGV2ICopLAorCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAodnBmZV9kZXYtPnNkID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX2ltb24uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCmluZGV4IDljZTdkOTkuLjMzNWI5OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfaW1vbi5jCkBAIC0yMDgsOCArMjA4LDcgQEAKIAlyZXR2YWwgPSBsaXJjX3VucmVnaXN0ZXJfZHJpdmVyKG1pbm9yKTsKIAlpZiAocmV0dmFsKQogCQlkZXZfZXJyKCZjb250ZXh0LT51c2JkZXYtPmRldiwKLQkJCSI6ICVzOiB1bmFibGUgdG8gZGVyZWdpc3RlciBmcm9tIGxpcmMoJWQpIiwKLQkJCV9fZnVuY19fLCByZXR2YWwpOworCQkJInVuYWJsZSB0byBkZXJlZ2lzdGVyIGZyb20gbGlyYyglZCkiLCByZXR2YWwpOwogCWVsc2UKIAkJZGV2X2luZm8oJmNvbnRleHQtPnVzYmRldi0+ZGV2LAogCQkJICJEZXJlZ2lzdGVyZWQgaU1PTiBkcml2ZXIgKG1pbm9yOiVkKVxuIiwgbWlub3IpOwpAQCAtMjQxLDkgKzI0MCw4IEBACiAJY29udGV4dCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKIAogCWlmICghY29udGV4dCkgewotCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwKLQkJCSIlczogbm8gY29udGV4dCBmb3VuZCBmb3IgbWlub3IgJWRcbiIsCi0JCQlfX2Z1bmNfXywgc3VibWlub3IpOworCQlkZXZfZXJyKCZpbnRlcmZhY2UtPmRldiwgIm5vIGNvbnRleHQgZm91bmQgZm9yIG1pbm9yICVkXG4iLAorCQkJc3VibWlub3IpOwogCQlyZXR2YWwgPSAtRU5PREVWOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMzM5LDEzICszMzcsMTMgQEAKIAljb250ZXh0LT50eF91cmItPmFjdHVhbF9sZW5ndGggPSAwOwogCiAJaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LT50eC5maW5pc2hlZCk7Ci0JYXRvbWljX3NldCgmKGNvbnRleHQtPnR4LmJ1c3kpLCAxKTsKKwlhdG9taWNfc2V0KCZjb250ZXh0LT50eC5idXN5LCAxKTsKIAogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKGNvbnRleHQtPnR4X3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJldHZhbCkgewotCQlhdG9taWNfc2V0KCYoY29udGV4dC0+dHguYnVzeSksIDApOwotCQlkZXZfZXJyKCZjb250ZXh0LT51c2JkZXYtPmRldiwKLQkJCSIlczogZXJyb3Igc3VibWl0dGluZyB1cmIoJWQpXG4iLCBfX2Z1bmNfXywgcmV0dmFsKTsKKwkJYXRvbWljX3NldCgmY29udGV4dC0+dHguYnVzeSwgMCk7CisJCWRldl9lcnIoJmNvbnRleHQtPnVzYmRldi0+ZGV2LCAiZXJyb3Igc3VibWl0dGluZyB1cmIoJWQpXG4iLAorCQkJcmV0dmFsKTsKIAl9IGVsc2UgewogCQkvKiBXYWl0IGZvciB0cmFuc21pc3Npb24gdG8gY29tcGxldGUgKG9yIGFib3J0KSAqLwogCQltdXRleF91bmxvY2soJmNvbnRleHQtPmN0eF9sb2NrKTsKQEAgLTM1OSw4ICszNTcsNyBAQAogCQlyZXR2YWwgPSBjb250ZXh0LT50eC5zdGF0dXM7CiAJCWlmIChyZXR2YWwpCiAJCQlkZXZfZXJyKCZjb250ZXh0LT51c2JkZXYtPmRldiwKLQkJCQkiJXM6IHBhY2tldCB0eCBmYWlsZWQgKCVkKVxuIiwKLQkJCQlfX2Z1bmNfXywgcmV0dmFsKTsKKwkJCQkicGFja2V0IHR4IGZhaWxlZCAoJWQpXG4iLCByZXR2YWwpOwogCX0KIAogCXJldHVybiByZXR2YWw7CkBAIC00MzcsOCArNDM0LDggQEAKIAkJcmV0dmFsID0gc2VuZF9wYWNrZXQoY29udGV4dCk7CiAJCWlmIChyZXR2YWwpIHsKIAkJCWRldl9lcnIoJmNvbnRleHQtPnVzYmRldi0+ZGV2LAotCQkJCSIlczogc2VuZCBwYWNrZXQgZmFpbGVkIGZvciBwYWNrZXQgIyVkXG4iLAotCQkJCV9fZnVuY19fLCBzZXEvMik7CisJCQkJInNlbmQgcGFja2V0IGZhaWxlZCBmb3IgcGFja2V0ICMlZFxuIiwKKwkJCQlzZXEgLyAyKTsKIAkJCWdvdG8gZXhpdDsKIAkJfSBlbHNlIHsKIAkJCXNlcSArPSAyOwpAQCAtNDU0LDggKzQ1MSw4IEBACiAJCXJldHZhbCA9IHNlbmRfcGFja2V0KGNvbnRleHQpOwogCQlpZiAocmV0dmFsKQogCQkJZGV2X2VycigmY29udGV4dC0+dXNiZGV2LT5kZXYsCi0JCQkJIiVzOiBzZW5kIHBhY2tldCBmYWlsZWQgZm9yIHBhY2tldCAjJWRcbiIsCi0JCQkJCV9fZnVuY19fLCBzZXEvMik7CisJCQkJInNlbmQgcGFja2V0IGZhaWxlZCBmb3IgcGFja2V0ICMlZFxuIiwKKwkJCQlzZXEgLyAyKTsKIAl9CiAKIGV4aXQ6CkBAIC04NzcsOCArODc0LDcgQEAKIAlyZXR2YWwgPSB1c2Jfc3VibWl0X3VyYihjb250ZXh0LT5yeF91cmIsIEdGUF9LRVJORUwpOwogCiAJaWYgKHJldHZhbCkgewotCQlkZXZfZXJyKGRldiwgIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgZm9yIGludGYwICglZClcbiIsCi0JCQlfX2Z1bmNfXywgcmV0dmFsKTsKKwkJZGV2X2VycihkZXYsICJ1c2Jfc3VibWl0X3VyYiBmYWlsZWQgZm9yIGludGYwICglZClcbiIsIHJldHZhbCk7CiAJCWFsbG9jX3N0YXR1cyA9IDg7CiAJCWdvdG8gdW5sb2NrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfcGFyYWxsZWwuYwppbmRleCAxOWM1YzIxLi5jMTQwODM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3BhcmFsbGVsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19wYXJhbGxlbC5jCkBAIC0xNjEsOCArMTYxLDggQEAKIAkJCSAgICAgfHwgKG5vdy50dl9zZWMgPT0gdHYudHZfc2VjCiAJCQkJICYmIG5vdy50dl91c2VjIDwgdHYudHZfdXNlYykpKTsKIAotCXRpbWVlbGFwc2VkID0gKChub3cudHZfc2VjICsgMSAtIHR2LnR2X3NlYykqMTAwMDAwMAotCQkgICAgICsgKG5vdy50dl91c2VjIC0gdHYudHZfdXNlYykpOworCXRpbWVlbGFwc2VkID0gKG5vdy50dl9zZWMgKyAxIC0gdHYudHZfc2VjKSoxMDAwMDAwCisJCSAgICAgKyAobm93LnR2X3VzZWMgLSB0di50dl91c2VjKTsKIAlpZiAoY291bnQgPj0gMTAwMCAmJiB0aW1lZWxhcHNlZCA+IDApIHsKIAkJaWYgKGRlZmF1bHRfdGltZXIgPT0gMCkgewogCQkJLyogYXV0b2RldGVjdCB0aW1lciAqLwpAQCAtMzM2LDcgKzMzNiw3IEBACiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAl3aGlsZSAoY291bnQgPCBuKSB7CiAJCWlmIChycHRyICE9IHdwdHIpIHsKLQkJCWlmIChjb3B5X3RvX3VzZXIoYnVmK2NvdW50LCAoY2hhciAqKSAmcmJ1ZltycHRyXSwKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmK2NvdW50LCAmcmJ1ZltycHRyXSwKIAkJCQkJIHNpemVvZihpbnQpKSkgewogCQkJCXJlc3VsdCA9IC1FRkFVTFQ7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Nhc2VtLmMKaW5kZXggNGEyNjgyMC4uOWU1Njc0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zYXNlbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2FzZW0uYwpAQCAtMTcwLDkgKzE3MCw2IEBACiAJa2ZyZWUoY29udGV4dC0+ZHJpdmVyLT5yYnVmKTsKIAlrZnJlZShjb250ZXh0LT5kcml2ZXIpOwogCWtmcmVlKGNvbnRleHQpOwotCi0JaWYgKGRlYnVnKQotCQlwcl9pbmZvKCIlczogY29udGV4dCBkZWxldGVkXG4iLCBfX2Z1bmNfXyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRlcmVnaXN0ZXJfZnJvbV9saXJjKHN0cnVjdCBzYXNlbV9jb250ZXh0ICpjb250ZXh0KQpAQCAtMTgyLDEwICsxNzksMTIgQEAKIAogCXJldHZhbCA9IGxpcmNfdW5yZWdpc3Rlcl9kcml2ZXIobWlub3IpOwogCWlmIChyZXR2YWwpCi0JCXByX2VycigiJXM6IHVuYWJsZSB0byBkZXJlZ2lzdGVyIGZyb20gbGlyYyAoJWQpXG4iLAorCQlkZXZfZXJyKCZjb250ZXh0LT5kZXYtPmRldiwKKwkJCSIlczogdW5hYmxlIHRvIGRlcmVnaXN0ZXIgZnJvbSBsaXJjICglZClcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgcmV0dmFsKTsKIAllbHNlCi0JCXByX2luZm8oIkRlcmVnaXN0ZXJlZCBTYXNlbSBkcml2ZXIgKG1pbm9yOiVkKVxuIiwgbWlub3IpOworCQlkZXZfaW5mbygmY29udGV4dC0+ZGV2LT5kZXYsCisJCSAgICAgICAgICJEZXJlZ2lzdGVyZWQgU2FzZW0gZHJpdmVyIChtaW5vcjolZClcbiIsIG1pbm9yKTsKIAogfQogCkBAIC0yMTQsOSArMjEzLDggQEAKIAljb250ZXh0ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOwogCiAJaWYgKCFjb250ZXh0KSB7Ci0JCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LAotCQkJIiVzOiBubyBjb250ZXh0IGZvdW5kIGZvciBtaW5vciAlZFxuIiwKLQkJCV9fZnVuY19fLCBzdWJtaW5vcik7CisJCWRldl9lcnIoJmludGVyZmFjZS0+ZGV2LCAibm8gY29udGV4dCBmb3VuZCBmb3IgbWlub3IgJWRcbiIsCisJCQlzdWJtaW5vcik7CiAJCXJldHZhbCA9IC1FTk9ERVY7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0zMzIsMTMgKzMzMCwxMyBAQAogCWNvbnRleHQtPnR4X3VyYi0+YWN0dWFsX2xlbmd0aCA9IDA7CiAKIAlpbml0X2NvbXBsZXRpb24oJmNvbnRleHQtPnR4LmZpbmlzaGVkKTsKLQlhdG9taWNfc2V0KCYoY29udGV4dC0+dHguYnVzeSksIDEpOworCWF0b21pY19zZXQoJmNvbnRleHQtPnR4LmJ1c3ksIDEpOwogCiAJcmV0dmFsID0gIHVzYl9zdWJtaXRfdXJiKGNvbnRleHQtPnR4X3VyYiwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJldHZhbCkgewotCQlhdG9taWNfc2V0KCYoY29udGV4dC0+dHguYnVzeSksIDApOwotCQlkZXZfZXJyKCZjb250ZXh0LT5kZXYtPmRldiwgIiVzOiBlcnJvciBzdWJtaXR0aW5nIHVyYiAoJWQpXG4iLAotCQkJX19mdW5jX18sIHJldHZhbCk7CisJCWF0b21pY19zZXQoJmNvbnRleHQtPnR4LmJ1c3ksIDApOworCQlkZXZfZXJyKCZjb250ZXh0LT5kZXYtPmRldiwgImVycm9yIHN1Ym1pdHRpbmcgdXJiICglZClcbiIsCisJCQlyZXR2YWwpOwogCX0gZWxzZSB7CiAJCS8qIFdhaXQgZm9yIHRyYW5zbWlzc2lvbiB0byBjb21wbGV0ZSAob3IgYWJvcnQpICovCiAJCW11dGV4X3VubG9jaygmY29udGV4dC0+Y3R4X2xvY2spOwpAQCAtMzQ4LDggKzM0Niw3IEBACiAJCXJldHZhbCA9IGNvbnRleHQtPnR4LnN0YXR1czsKIAkJaWYgKHJldHZhbCkKIAkJCWRldl9lcnIoJmNvbnRleHQtPmRldi0+ZGV2LAotCQkJCSIlczogcGFja2V0IHR4IGZhaWxlZCAoJWQpXG4iLAotCQkJCV9fZnVuY19fLCByZXR2YWwpOworCQkJCSJwYWNrZXQgdHggZmFpbGVkICglZClcbiIsIHJldHZhbCk7CiAJfQogCiAJcmV0dXJuIHJldHZhbDsKQEAgLTM4OSw3ICszODYsNyBAQAogCQlnb3RvIGV4aXQ7CiAJfQogCi0JZGF0YV9idWYgPSBtZW1kdXBfdXNlcigodm9pZCBjb25zdCBfX3VzZXIgKilidWYsIG5fYnl0ZXMpOworCWRhdGFfYnVmID0gbWVtZHVwX3VzZXIoYnVmLCBuX2J5dGVzKTsKIAlpZiAoSVNfRVJSKGRhdGFfYnVmKSkgewogCQlyZXR2YWwgPSBQVFJfRVJSKGRhdGFfYnVmKTsKIAkJZGF0YV9idWYgPSBOVUxMOwpAQCAtNDQ0LDggKzQ0MSw3IEBACiAJCXJldHZhbCA9IHNlbmRfcGFja2V0KGNvbnRleHQpOwogCQlpZiAocmV0dmFsKSB7CiAJCQlkZXZfZXJyKCZjb250ZXh0LT5kZXYtPmRldiwKLQkJCQkiJXM6IHNlbmQgcGFja2V0IGZhaWxlZCBmb3IgcGFja2V0ICMlZFxuIiwKLQkJCQlfX2Z1bmNfXywgaSk7CisJCQkJInNlbmQgcGFja2V0IGZhaWxlZCBmb3IgcGFja2V0ICMlZFxuIiwgaSk7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CkBAIC01MDksOCArNTA1LDcgQEAKIAogCWlmIChyZXR2YWwpCiAJCWRldl9lcnIoJmNvbnRleHQtPmRldi0+ZGV2LAotCQkJIiVzOiB1c2Jfc3VibWl0X3VyYiBmYWlsZWQgZm9yIGlyX29wZW4gKCVkKVxuIiwKLQkJCV9fZnVuY19fLCByZXR2YWwpOworCQkJInVzYl9zdWJtaXRfdXJiIGZhaWxlZCBmb3IgaXJfb3BlbiAoJWQpXG4iLCByZXR2YWwpOwogCWVsc2UgewogCQljb250ZXh0LT5pcl9pc29wZW4gPSAxOwogCQlkZXZfaW5mbygmY29udGV4dC0+ZGV2LT5kZXYsICJJUiBwb3J0IG9wZW5lZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3NlcmlhbC5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zZXJpYWwuYwppbmRleCAxOTYyOGQwLi5kYzc5ODQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2VyaWFsLmMKQEAgLTM0NCw3ICszNDQsNyBAQAogCS8qIEhvdyBtYW55IGNsb2NrcyBpbiBhIG1pY3Jvc2Vjb25kPywgYXZvaWRpbmcgbG9uZyBsb25nIGRpdmlkZSAqLwogCXdvcmsgPSBsb29wc19wZXJfc2VjOwogCXdvcmsgKj0gNDI5NTsgIC8qIDQyOTUgPSAyXjMyIC8gMWU2ICovCi0JY29udl91c190b19jbG9ja3MgPSAod29yayA+PiAzMik7CisJY29udl91c190b19jbG9ja3MgPSB3b3JrID4+IDMyOwogCiAJLyoKIAkgKiBDYXJyaWVyIHBlcmlvZCBpbiBjbG9ja3MsIGFwcHJvYWNoIGdvb2QgdXAgdG8gMzJHSHogY2xvY2ssCkBAIC03ODQsNyArNzg0LDcgQEAKIAogCXJlc3VsdCA9IGRldm1fcmVxdWVzdF9pcnEoJmRldi0+ZGV2LCBpcnEsIGxpcmNfaXJxX2hhbmRsZXIsCiAJCQkgICAgIChzaGFyZV9pcnEgPyBJUlFGX1NIQVJFRCA6IDApLAotCQkJICAgICBMSVJDX0RSSVZFUl9OQU1FLCAodm9pZCAqKSZoYXJkd2FyZSk7CisJCQkgICAgIExJUkNfRFJJVkVSX05BTUUsICZoYXJkd2FyZSk7CiAJaWYgKHJlc3VsdCA8IDApIHsKIAkJaWYgKHJlc3VsdCA9PSAtRUJVU1kpCiAJCQlkZXZfZXJyKCZkZXYtPmRldiwgIklSUSAlZCBidXN5XG4iLCBpcnEpOwpAQCAtODM4LDcgKzgzOCw3IEBACiAJCQkJbmhpZ2grKzsKIAkJCW1zbGVlcCg0MCk7CiAJCX0KLQkJc2Vuc2UgPSAobmxvdyA+PSBuaGlnaCA/IDEgOiAwKTsKKwkJc2Vuc2UgPSBubG93ID49IG5oaWdoID8gMSA6IDA7CiAJCWRldl9pbmZvKCZkZXYtPmRldiwgImF1dG8tZGV0ZWN0ZWQgYWN0aXZlICVzIHJlY2VpdmVyXG4iLAogCQkJIHNlbnNlID8gImxvdyIgOiAiaGlnaCIpOwogCX0gZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zaXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfc2lyLmMKaW5kZXggMzlmNDczMy4uMjkwODdmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY19zaXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3Npci5jCkBAIC02ODMsOSArNjgzLDcgQEAKIAl9CiAJcHJfaW5mbygiSS9PIHBvcnQgMHglLjR4LCBJUlEgJWQuXG4iLCBpbywgaXJxKTsKIAotCWluaXRfdGltZXIoJnRpbWVybGlzdCk7Ci0JdGltZXJsaXN0LmZ1bmN0aW9uID0gc2lyX3RpbWVvdXQ7Ci0JdGltZXJsaXN0LmRhdGEgPSAweGFiYWRjYWZlOworCXNldHVwX3RpbWVyKCZ0aW1lcmxpc3QsIHNpcl90aW1lb3V0LCAwKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY196aWxvZy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL2xpcmMvbGlyY196aWxvZy5jCmluZGV4IGUxNjYyN2MuLjI2MWUyN2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9saXJjL2xpcmNfemlsb2cuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbGlyYy9saXJjX3ppbG9nLmMKQEAgLTEzNDEsOCArMTM0MSw3IEBACiAJc3RydWN0IElSICppciA9IGZpbGVwLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoaXIgPT0gTlVMTCkgewotCQlkZXZfZXJyKGlyLT5sLmRldiwKLQkJCSJjbG9zZTogbm8gcHJpdmF0ZV9kYXRhIGF0dGFjaGVkIHRvIHRoZSBmaWxlIVxuIik7CisJCXByX2VycigiaXI6IGNsb3NlOiBubyBwcml2YXRlX2RhdGEgYXR0YWNoZWQgdG8gdGhlIGZpbGUhXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbW44ODQ3Mi9tbjg4NDcyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbW44ODQ3Mi9tbjg4NDcyLmMKaW5kZXggNmVlYmU1Ni4uMmE2ODU4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL21uODg0NzIvbW44ODQ3Mi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9tbjg4NDcyL21uODg0NzIuYwpAQCAtMjc2LDcgKzI3Niw3IEBACiAJCQlyZW1haW5pbmcgLT0gKGRldi0+aTJjX3dyX21heCAtIDEpKSB7CiAJCWxlbiA9IHJlbWFpbmluZzsKIAkJaWYgKGxlbiA+IChkZXYtPmkyY193cl9tYXggLSAxKSkKLQkJCWxlbiA9IChkZXYtPmkyY193cl9tYXggLSAxKTsKKwkJCWxlbiA9IGRldi0+aTJjX3dyX21heCAtIDE7CiAKIAkJcmV0ID0gcmVnbWFwX2J1bGtfd3JpdGUoZGV2LT5yZWdtYXBbMF0sIDB4ZjYsCiAJCQkJJmZ3LT5kYXRhW2Z3LT5zaXplIC0gcmVtYWluaW5nXSwgbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9tbjg4NDczL21uODg0NzMuYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9tbjg4NDczL21uODg0NzMuYwppbmRleCBhMzMzNzQ0Li41YmFlYjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvbW44ODQ3My9tbjg4NDczLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL21uODg0NzMvbW44ODQ3My5jCkBAIC0xNyw3ICsxNyw3IEBACiAjaW5jbHVkZSAibW44ODQ3M19wcml2LmgiCiAKIHN0YXRpYyBpbnQgbW44ODQ3M19nZXRfdHVuZV9zZXR0aW5ncyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKLQlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnMpCisJCQkJICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MgKnMpCiB7CiAJcy0+bWluX2RlbGF5X21zID0gMTAwMDsKIAlyZXR1cm4gMDsKQEAgLTMzLDEwICszMywxNCBAQAogCXU4IGRlbGl2ZXJ5X3N5c3RlbV92YWwsIGlmX3ZhbFszXSwgYndfdmFsWzddOwogCiAJZGV2X2RiZygmY2xpZW50LT5kZXYsCi0JCQkiZGVsaXZlcnlfc3lzdGVtPSV1IG1vZHVsYXRpb249JXUgZnJlcXVlbmN5PSV1IGJhbmR3aWR0aF9oej0ldSBzeW1ib2xfcmF0ZT0ldSBpbnZlcnNpb249JWQgc3RyZWFtX2lkPSVkXG4iLAotCQkJYy0+ZGVsaXZlcnlfc3lzdGVtLCBjLT5tb2R1bGF0aW9uLAotCQkJYy0+ZnJlcXVlbmN5LCBjLT5iYW5kd2lkdGhfaHosIGMtPnN5bWJvbF9yYXRlLAotCQkJYy0+aW52ZXJzaW9uLCBjLT5zdHJlYW1faWQpOworCQkiZGVsaXZlcnlfc3lzdGVtPSV1IG1vZHVsYXRpb249JXUgZnJlcXVlbmN5PSV1IGJhbmR3aWR0aF9oej0ldSBzeW1ib2xfcmF0ZT0ldSBpbnZlcnNpb249JWQgc3RyZWFtX2lkPSVkXG4iLAorCQljLT5kZWxpdmVyeV9zeXN0ZW0sCisJCWMtPm1vZHVsYXRpb24sCisJCWMtPmZyZXF1ZW5jeSwKKwkJYy0+YmFuZHdpZHRoX2h6LAorCQljLT5zeW1ib2xfcmF0ZSwKKwkJYy0+aW52ZXJzaW9uLAorCQljLT5zdHJlYW1faWQpOwogCiAJaWYgKCFkZXYtPndhcm0pIHsKIAkJcmV0ID0gLUVBR0FJTjsKQEAgLTExMiw3ICsxMTYsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIklGIGZyZXF1ZW5jeSAlZCBub3Qgc3VwcG9ydGVkXG4iLAotCQkJCWlmX2ZyZXF1ZW5jeSk7CisJCQlpZl9mcmVxdWVuY3kpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycjsKIAl9CkBAIC0yMjksNyArMjMzLDcgQEAKIAl9CiAKIAlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJkb3dubG9hZGluZyBmaXJtd2FyZSBmcm9tIGZpbGUgJyVzJ1xuIiwKLQkJCWZ3X2ZpbGUpOworCQkgZndfZmlsZSk7CiAKIAlyZXQgPSByZWdtYXBfd3JpdGUoZGV2LT5yZWdtYXBbMF0sIDB4ZjUsIDB4MDMpOwogCWlmIChyZXQpCkBAIC0yMzksMTMgKzI0MywxMyBAQAogCQkJcmVtYWluaW5nIC09IChkZXYtPmkyY193cl9tYXggLSAxKSkgewogCQlsZW4gPSByZW1haW5pbmc7CiAJCWlmIChsZW4gPiAoZGV2LT5pMmNfd3JfbWF4IC0gMSkpCi0JCQlsZW4gPSAoZGV2LT5pMmNfd3JfbWF4IC0gMSk7CisJCQlsZW4gPSBkZXYtPmkyY193cl9tYXggLSAxOwogCiAJCXJldCA9IHJlZ21hcF9idWxrX3dyaXRlKGRldi0+cmVnbWFwWzBdLCAweGY2LAotCQkJCSZmdy0+ZGF0YVtmdy0+c2l6ZSAtIHJlbWFpbmluZ10sIGxlbik7CisJCQkJCSZmdy0+ZGF0YVtmdy0+c2l6ZSAtIHJlbWFpbmluZ10sIGxlbik7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmlybXdhcmUgZG93bmxvYWQgZmFpbGVkPSVkXG4iLAotCQkJCQlyZXQpOworCQkJCXJldCk7CiAJCQlnb3RvIGVycjsKIAkJfQogCX0KQEAgLTMyNSw3ICszMjksNyBAQAogfTsKIAogc3RhdGljIGludCBtbjg4NDczX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCi0JCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKKwkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IG1uODg0NzNfY29uZmlnICpjb25maWcgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCBtbjg4NDczX2RldiAqZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzcy5jIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzcy5jCmluZGV4IDQ0YjgxYTIuLmUwYWQ1ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzLmMKQEAgLTExNjAsOCArMTE2MCw4IEBACiAJCXN1YmRldiA9IHY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoJmlzcy0+djRsMl9kZXYsIGFkYXB0ZXIsCiAJCQkJYm9hcmRfaW5mby0+Ym9hcmRfaW5mbywgTlVMTCk7CiAJCWlmIChzdWJkZXYgPT0gTlVMTCkgewotCQkJZGV2X2Vycihpc3MtPmRldiwgIiVzOiBVbmFibGUgdG8gcmVnaXN0ZXIgc3ViZGV2ICVzXG4iLAotCQkJCV9fZnVuY19fLCBib2FyZF9pbmZvLT5ib2FyZF9pbmZvLT50eXBlKTsKKwkJCWRldl9lcnIoaXNzLT5kZXYsICJVbmFibGUgdG8gcmVnaXN0ZXIgc3ViZGV2ICVzXG4iLAorCQkJCWJvYXJkX2luZm8tPmJvYXJkX2luZm8tPnR5cGUpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTE4NSwxNiArMTE4NSwxNiBAQAogCWlzcy0+bWVkaWFfZGV2Lmxpbmtfbm90aWZ5ID0gaXNzX3BpcGVsaW5lX2xpbmtfbm90aWZ5OwogCXJldCA9IG1lZGlhX2RldmljZV9yZWdpc3RlcigmaXNzLT5tZWRpYV9kZXYpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoaXNzLT5kZXYsICIlczogTWVkaWEgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQgKCVkKVxuIiwKLQkJCV9fZnVuY19fLCByZXQpOworCQlkZXZfZXJyKGlzcy0+ZGV2LCAiTWVkaWEgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQgKCVkKVxuIiwKKwkJCXJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJaXNzLT52NGwyX2Rldi5tZGV2ID0gJmlzcy0+bWVkaWFfZGV2OwogCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKGlzcy0+ZGV2LCAmaXNzLT52NGwyX2Rldik7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihpc3MtPmRldiwgIiVzOiBWNEwyIGRldmljZSByZWdpc3RyYXRpb24gZmFpbGVkICglZClcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKKwkJZGV2X2Vycihpc3MtPmRldiwgIlY0TDIgZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQgKCVkKVxuIiwKKwkJCXJldCk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTEyNTIsOCArMTI1Miw4IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJZGV2X2Vycihpc3MtPmRldiwgIiVzOiBpbnZhbGlkIGludGVyZmFjZSB0eXBlICV1XG4iLAotCQkJCV9fZnVuY19fLCBzdWJkZXZzLT5pbnRlcmZhY2UpOworCQkJZGV2X2Vycihpc3MtPmRldiwgImludmFsaWQgaW50ZXJmYWNlIHR5cGUgJXVcbiIsCisJCQkJc3ViZGV2cy0+aW50ZXJmYWNlKTsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIGRvbmU7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfdmlkZW8uYyBiL2RyaXZlcnMvc3RhZ2luZy9tZWRpYS9vbWFwNGlzcy9pc3NfdmlkZW8uYwppbmRleCA2OTU1MDQ0Li41NTkzOGNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbWVkaWEvb21hcDRpc3MvaXNzX3ZpZGVvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL21lZGlhL29tYXA0aXNzL2lzc192aWRlby5jCkBAIC0xMjIxLDggKzEyMjEsNyBAQAogCXJldCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmdmlkZW8tPnZpZGVvLCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CiAJaWYgKHJldCA8IDApCiAJCWRldl9lcnIodmlkZW8tPmlzcy0+ZGV2LAotCQkJIiVzOiBjb3VsZCBub3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlICglZClcbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKKwkJCSJjb3VsZCBub3QgcmVnaXN0ZXIgdmlkZW8gZGV2aWNlICglZClcbiIsIHJldCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL210MjlmX3NwaW5hbmQvbXQyOWZfc3BpbmFuZC5jIGIvZHJpdmVycy9zdGFnaW5nL210MjlmX3NwaW5hbmQvbXQyOWZfc3BpbmFuZC5jCmluZGV4IDNiMTkxZmMuLjcyODVjNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9tdDI5Zl9zcGluYW5kL210MjlmX3NwaW5hbmQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvbXQyOWZfc3BpbmFuZC9tdDI5Zl9zcGluYW5kLmMKQEAgLTc3MCw3ICs3NzAsNyBAQAogCQlicmVhazsKIAljYXNlIE5BTkRfQ01EX1JFQURJRDoKIAkJc3RhdGUtPmJ1Zl9wdHIgPSAwOwotCQlzcGluYW5kX3JlYWRfaWQoaW5mby0+c3BpLCAodTggKilzdGF0ZS0+YnVmKTsKKwkJc3BpbmFuZF9yZWFkX2lkKGluZm8tPnNwaSwgc3RhdGUtPmJ1Zik7CiAJCWJyZWFrOwogCWNhc2UgTkFORF9DTURfUEFSQU06CiAJCXN0YXRlLT5idWZfcHRyID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMgYi9kcml2ZXJzL3N0YWdpbmcvbmV0bG9naWMveGxyX25ldC5jCmluZGV4IGU4YWFlMDkuLjhhZTAxNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9uZXRsb2dpYy94bHJfbmV0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL25ldGxvZ2ljL3hscl9uZXQuYwpAQCAtMTAxMiw3ICsxMDEyLDcgQEAKIAkgKiBBbGxvY2F0ZSBvdXIgYWRhcHRlciBkYXRhIHN0cnVjdHVyZSBhbmQgYXR0YWNoIGl0IHRvIHRoZSBkZXZpY2UuCiAJICovCiAJYWRhcHRlciA9IChzdHJ1Y3QgeGxyX2FkYXB0ZXIgKikKLQkJZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihhZGFwdGVyKSwgR0ZQX0tFUk5FTCk7CisJCWRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmFkYXB0ZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFkYXB0ZXIpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9LY29uZmlnCmluZGV4IDk0NzVlMjAuLmUzYTg5ZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvS2NvbmZpZwpAQCAtNiw2ICs2LDkgQEAKIAkgICAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3VwcG9ydCBmb3IgYSBuVmlkaWEgY29tcGxpYW50IGVtYmVkZGVkCiAJICAgIGNvbnRyb2xsZXIuCiAKKwkgICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisgICAgICAgICAgICBjYWxsZWQgbWZkLW52ZWMKKwogY29uZmlnIEtFWUJPQVJEX05WRUMKIAl0cmlzdGF0ZSAiS2V5Ym9hcmQgb24gblZpZGlhIGNvbXBsaWFudCBFQyIKIAlkZXBlbmRzIG9uIE1GRF9OVkVDICYmIElOUFVUCkBAIC0xMyw2ICsxNiw5IEBACiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBhIGtleWJvYXJkIGNvbm5lY3RlZCB0bwogCSAgYSBuVmlkaWEgY29tcGxpYW50IGVtYmVkZGVkIGNvbnRyb2xsZXIuCiAKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorICAgICAgICAgIGNhbGxlZCBrZXlib2FyZC1udmVjCisKIGNvbmZpZyBTRVJJT19OVkVDX1BTMgogCXRyaXN0YXRlICJQUzIgb24gblZpZGlhIEVDIgogCWRlcGVuZHMgb24gTUZEX05WRUMgJiYgU0VSSU8KQEAgLTIwLDYgKzI2LDEwIEBACiAJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzdXBwb3J0IGZvciBhIFRvdWNocGFkIC8gTW91c2UgY29ubmVjdGVkCiAJICB0byBhIG5WaWRpYSBjb21wbGlhbnQgZW1iZWRkZWQgY29udHJvbGxlci4KIAorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisgICAgICAgICAgY2FsbGVkIHNlcmlvLW52ZWMtcHMyCisKKwogY29uZmlnIE5WRUNfUE9XRVIKIAl0cmlzdGF0ZSAiTlZFQyBjaGFyZ2VyIGFuZCBiYXR0ZXJ5IgogCWRlcGVuZHMgb24gTUZEX05WRUMgJiYgUE9XRVJfU1VQUExZCkBAIC0yNyw5ICszNywxNyBAQAogCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIGJhdHRlcnkgYW5kIGNoYXJnZXIgaW50ZXJmYWNlIGZvcgogCSAgblZpZGlhIGNvbXBsaWFudCBlbWJlZGRlZCBjb250cm9sbGVycy4KIAorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsIGJlCisgICAgICAgICAgY2FsbGVkIG52ZWMtcG93ZXIKKworCiBjb25maWcgTlZFQ19QQVowMAogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBPRU0gc3BlY2lmaWMgZnVuY3Rpb25zIG9uIENvbXBhbCBQQVowMCBiYXNlZCBkZXZpY2VzIgogCWRlcGVuZHMgb24gTUZEX05WRUMgJiYgTEVEU19DTEFTUwogCWhlbHAKIAkgIFNheSBZIHRvIGVuYWJsZSBjb250cm9sIG9mIHRoZSB5ZWxsb3cgc2lkZSBsZWRzIG9uIENvbXBhbCBQQVowMCBiYXNlZAogCSAgZGV2aWNlcywgZS5nLiBUb3NoYmlhIEFDMTAwIGFuZCBEeW5hYm9va3MgQVogbmV0Ym9va3MuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbCBiZQorICAgICAgICAgIGNhbGxlZCBudmVjLXBhejAwCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMuYyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWMuYwppbmRleCA1ODY4ZWJiLi4xYmRjOGQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlYy5jCkBAIC04MDMsNyArODAzLDcgQEAKIAl9CiAKIAludmVjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbnZlY19jaGlwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG52ZWMgPT0gTlVMTCkKKwlpZiAoIW52ZWMpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbnZlYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3BhejAwLmMgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3BhejAwLmMKaW5kZXggZjBjZWEwZS4uNjgxNDZiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wYXowMC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcGF6MDAuYwpAQCAtNTEsNyArNTEsNyBAQAogCWludCByZXQgPSAwOwogCiAJbGVkID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqbGVkKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGxlZCA9PSBOVUxMKQorCWlmICghbGVkKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWxlZC0+Y2Rldi5tYXhfYnJpZ2h0bmVzcyA9IE5WRUNfTEVEX01BWDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcG93ZXIuYyBiL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcG93ZXIuYwppbmRleCA2YTE0NTlkLi4wNGE3NDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3Bvd2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wb3dlci5jCkBAIC04Miw4ICs4Miw4IEBACiAJfTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5IG52ZWNfYmF0X3BzeTsKLXN0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5IG52ZWNfcHN5Oworc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgKm52ZWNfYmF0X3BzeTsKK3N0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpudmVjX3BzeTsKIAogc3RhdGljIGludCBudmVjX3Bvd2VyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCiAJCQkgICAgICAgdW5zaWduZWQgbG9uZyBldmVudF90eXBlLCB2b2lkICpkYXRhKQpAQCAtOTgsNyArOTgsNyBAQAogCWlmIChyZXMtPnN1Yl90eXBlID09IDApIHsKIAkJaWYgKHBvd2VyLT5vbiAhPSByZXMtPnBsdSkgewogCQkJcG93ZXItPm9uID0gcmVzLT5wbHU7Ci0JCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmbnZlY19wc3kpOworCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQobnZlY19wc3kpOwogCQl9CiAJCXJldHVybiBOT1RJRllfU1RPUDsKIAl9CkBAIC0xNjcsNyArMTY3LDcgQEAKIAkJfQogCQlwb3dlci0+YmF0X2NhcCA9IHJlcy0+cGxjWzFdOwogCQlpZiAoc3RhdHVzX2NoYW5nZWQpCi0JCQlwb3dlcl9zdXBwbHlfY2hhbmdlZCgmbnZlY19iYXRfcHN5KTsKKwkJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKG52ZWNfYmF0X3BzeSk7CiAJCWJyZWFrOwogCWNhc2UgVk9MVEFHRToKIAkJcG93ZXItPmJhdF92b2x0YWdlX25vdyA9IHJlcy0+cGx1ICogMTAwMDsKQEAgLTIyNSw3ICsyMjUsNyBAQAogCQkJCSAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQkgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogewotCXN0cnVjdCBudmVjX3Bvd2VyICpwb3dlciA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi0+cGFyZW50KTsKKwlzdHJ1Y3QgbnZlY19wb3dlciAqcG93ZXIgPSBkZXZfZ2V0X2RydmRhdGEocHN5LT5kZXYucGFyZW50KTsKIAogCXN3aXRjaCAocHNwKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CkBAIC0yNDEsNyArMjQxLDcgQEAKIAkJCQkgICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAkJCQkgICAgIHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpCiB7Ci0Jc3RydWN0IG52ZWNfcG93ZXIgKnBvd2VyID0gZGV2X2dldF9kcnZkYXRhKHBzeS0+ZGV2LT5wYXJlbnQpOworCXN0cnVjdCBudmVjX3Bvd2VyICpwb3dlciA9IGRldl9nZXRfZHJ2ZGF0YShwc3ktPmRldi5wYXJlbnQpOwogCiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKQEAgLTMyMyw3ICszMjMsNyBAQAogCSJiYXR0ZXJ5IiwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcG93ZXJfc3VwcGx5IG52ZWNfYmF0X3BzeSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgbnZlY19iYXRfcHN5X2Rlc2MgPSB7CiAJLm5hbWUgPSAiYmF0dGVyeSIsCiAJLnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZLAogCS5wcm9wZXJ0aWVzID0gbnZlY19iYXR0ZXJ5X3Byb3BzLApAQCAtMzMxLDExICszMzEsOSBAQAogCS5nZXRfcHJvcGVydHkgPSBudmVjX2JhdHRlcnlfZ2V0X3Byb3BlcnR5LAogfTsKIAotc3RhdGljIHN0cnVjdCBwb3dlcl9zdXBwbHkgbnZlY19wc3kgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIG52ZWNfcHN5X2Rlc2MgPSB7CiAJLm5hbWUgPSAiYWMiLAogCS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCi0JLnN1cHBsaWVkX3RvID0gbnZlY19wb3dlcl9zdXBwbGllZF90bywKLQkubnVtX3N1cHBsaWNhbnRzID0gQVJSQVlfU0laRShudmVjX3Bvd2VyX3N1cHBsaWVkX3RvKSwKIAkucHJvcGVydGllcyA9IG52ZWNfcG93ZXJfcHJvcHMsCiAJLm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRShudmVjX3Bvd2VyX3Byb3BzKSwKIAkuZ2V0X3Byb3BlcnR5ID0gbnZlY19wb3dlcl9nZXRfcHJvcGVydHksCkBAIC0zNzMsMTIgKzM3MSwxNCBAQAogCiBzdGF0aWMgaW50IG52ZWNfcG93ZXJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqKnBzeTsKKwljb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKnBzeV9kZXNjOwogCXN0cnVjdCBudmVjX3Bvd2VyICpwb3dlcjsKIAlzdHJ1Y3QgbnZlY19jaGlwICpudmVjID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHBzeV9jZmcgPSB7fTsKIAogCXBvd2VyID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbnZlY19wb3dlciksIEdGUF9OT1dBSVQpOwotCWlmIChwb3dlciA9PSBOVUxMKQorCWlmICghcG93ZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIHBvd2VyKTsKQEAgLTM4Nyw2ICszODcsOSBAQAogCXN3aXRjaCAocGRldi0+aWQpIHsKIAljYXNlIEFDOgogCQlwc3kgPSAmbnZlY19wc3k7CisJCXBzeV9kZXNjID0gJm52ZWNfcHN5X2Rlc2M7CisJCXBzeV9jZmcuc3VwcGxpZWRfdG8gPSBudmVjX3Bvd2VyX3N1cHBsaWVkX3RvOworCQlwc3lfY2ZnLm51bV9zdXBwbGljYW50cyA9IEFSUkFZX1NJWkUobnZlY19wb3dlcl9zdXBwbGllZF90byk7CiAKIAkJcG93ZXItPm5vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBudmVjX3Bvd2VyX25vdGlmaWVyOwogCkBAIC0zOTUsNiArMzk4LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBCQVQ6CiAJCXBzeSA9ICZudmVjX2JhdF9wc3k7CisJCXBzeV9kZXNjID0gJm52ZWNfYmF0X3BzeV9kZXNjOwogCiAJCXBvd2VyLT5ub3RpZmllci5ub3RpZmllcl9jYWxsID0gbnZlY19wb3dlcl9iYXRfbm90aWZpZXI7CiAJCWJyZWFrOwpAQCAtNDA3LDcgKzQxMSw5IEBACiAJaWYgKHBkZXYtPmlkID09IEJBVCkKIAkJZ2V0X2JhdF9tZmdfZGF0YShwb3dlcik7CiAKLQlyZXR1cm4gcG93ZXJfc3VwcGx5X3JlZ2lzdGVyKCZwZGV2LT5kZXYsIHBzeSk7CisJKnBzeSA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCBwc3lfZGVzYywgJnBzeV9jZmcpOworCisJcmV0dXJuIFBUUl9FUlJfT1JfWkVSTygqcHN5KTsKIH0KIAogc3RhdGljIGludCBudmVjX3Bvd2VyX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtNDE4LDEwICs0MjQsMTAgQEAKIAludmVjX3VucmVnaXN0ZXJfbm90aWZpZXIocG93ZXItPm52ZWMsICZwb3dlci0+bm90aWZpZXIpOwogCXN3aXRjaCAocGRldi0+aWQpIHsKIAljYXNlIEFDOgotCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmbnZlY19wc3kpOworCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcihudmVjX3BzeSk7CiAJCWJyZWFrOwogCWNhc2UgQkFUOgotCQlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmbnZlY19iYXRfcHN5KTsKKwkJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIobnZlY19iYXRfcHN5KTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcHMyLmMgYi9kcml2ZXJzL3N0YWdpbmcvbnZlYy9udmVjX3BzMi5jCmluZGV4IDRmZDYzYzIuLjZlYmJjODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9udmVjL252ZWNfcHMyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL252ZWMvbnZlY19wczIuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAJY2hhciBtb3VzZV9yZXNldFtdID0geyBOVkVDX1BTMiwgU0VORF9DT01NQU5ELCBQU01PVVNFX1JTVCwgMyB9OwogCiAJc2VyX2RldiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IHNlcmlvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNlcl9kZXYgPT0gTlVMTCkKKwlpZiAoIXNlcl9kZXYpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJc2VyX2Rldi0+aWQudHlwZSA9IFNFUklPX1BTX1BTVEhSVTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuYwppbmRleCAxZGFlYjMxLi45ZTU0NzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5jCkBAIC0yMTQsMTUgKzIxNCwxNCBAQAogLyoqCiAgKiBlbnVtIGN2bXhfdXNiX3BpcGVfZmxhZ3MgLSBpbnRlcm5hbCBmbGFncyBmb3IgYSBwaXBlLgogICoKLSAqIEBfX0NWTVhfVVNCX1BJUEVfRkxBR1NfU0NIRURVTEVEOiBVc2VkIGludGVybmFsbHkgdG8gZGV0ZXJtaW5lIGlmIGEgcGlwZSBpcwotICoJCQkJICAgICBhY3RpdmVseSB1c2luZyBoYXJkd2FyZS4gRG8gbm90IHVzZS4KLSAqIEBfX0NWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HOiBVc2VkIGludGVybmFsbHkgdG8gZGV0ZXJtaW5lIGlmIGEgaGlnaAotICoJCQkJICAgICBzcGVlZCBwaXBlIGlzIGluIHRoZSBwaW5nIHN0YXRlLiBEbyBub3QKLSAqCQkJCSAgICAgdXNlLgorICogQENWTVhfVVNCX1BJUEVfRkxBR1NfU0NIRURVTEVEOiBVc2VkIGludGVybmFsbHkgdG8gZGV0ZXJtaW5lIGlmIGEgcGlwZSBpcworICoJCQkJICAgYWN0aXZlbHkgdXNpbmcgaGFyZHdhcmUuCisgKiBAQ1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkc6IFVzZWQgaW50ZXJuYWxseSB0byBkZXRlcm1pbmUgaWYgYSBoaWdoIHNwZWVkCisgKgkJCQkgICBwaXBlIGlzIGluIHRoZSBwaW5nIHN0YXRlLgogICovCiBlbnVtIGN2bXhfdXNiX3BpcGVfZmxhZ3MgewotCV9fQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQJPSAxIDw8IDE3LAotCV9fQ1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkcJPSAxIDw8IDE4LAorCUNWTVhfVVNCX1BJUEVfRkxBR1NfU0NIRURVTEVECT0gMSA8PCAxNywKKwlDVk1YX1VTQl9QSVBFX0ZMQUdTX05FRURfUElORwk9IDEgPDwgMTgsCiB9OwogCiAvKiBNYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0byByZXRyeSBmYWlsZWQgdHJhbnNhY3Rpb25zICovCkBAIC0yMzEsMTUgKzIzMCw2IEBACiAvKiBNYXhpbXVtIG51bWJlciBvZiBoYXJkd2FyZSBjaGFubmVscyBzdXBwb3J0ZWQgYnkgdGhlIFVTQiBibG9jayAqLwogI2RlZmluZSBNQVhfQ0hBTk5FTFMJCTgKIAotLyogVGhlIGhpZ2hlc3QgdmFsaWQgVVNCIGRldmljZSBhZGRyZXNzICovCi0jZGVmaW5lIE1BWF9VU0JfQUREUkVTUwkJMTI3Ci0KLS8qIFRoZSBoaWdoZXN0IHZhbGlkIFVTQiBlbmRwb2ludCBudW1iZXIgKi8KLSNkZWZpbmUgTUFYX1VTQl9FTkRQT0lOVAkxNQotCi0vKiBUaGUgaGlnaGVzdCB2YWxpZCBwb3J0IG51bWJlciBvbiBhIGh1YiAqLwotI2RlZmluZSBNQVhfVVNCX0hVQl9QT1JUCTE1Ci0KIC8qCiAgKiBUaGUgbG93IGxldmVsIGhhcmR3YXJlIGNhbiB0cmFuc2ZlciBhIG1heGltdW0gb2YgdGhpcyBudW1iZXIgb2YgYnl0ZXMgaW4gZWFjaAogICogdHJhbnNmZXIuIFRoZSBmaWVsZCBpcyAxOSBiaXRzIHdpZGUKQEAgLTQwMywxNiArMzkzLDE4IEBACiAJc3RydWN0IGN2bXhfdXNiX3N0YXRlIHVzYjsKIH07CiAKLS8qIFRoaXMgbWFjcm8gc3BpbnMgb24gYSBmaWVsZCB3YWl0aW5nIGZvciBpdCB0byByZWFjaCBhIHZhbHVlICovCi0jZGVmaW5lIENWTVhfV0FJVF9GT1JfRklFTEQzMihhZGRyZXNzLCB0eXBlLCBmaWVsZCwgb3AsIHZhbHVlLCB0aW1lb3V0X3VzZWMpXAorLyogVGhpcyBtYWNybyBzcGlucyBvbiBhIHJlZ2lzdGVyIHdhaXRpbmcgZm9yIGl0IHRvIHJlYWNoIGEgY29uZGl0aW9uLiAqLworI2RlZmluZSBDVk1YX1dBSVRfRk9SX0ZJRUxEMzIoYWRkcmVzcywgX3VuaW9uLCBjb25kLCB0aW1lb3V0X3VzZWMpCSAgICBcCiAJKHtpbnQgcmVzdWx0OwkJCQkJCQkgICAgXAogCWRvIHsJCQkJCQkJCSAgICBcCiAJCXVpbnQ2NF90IGRvbmUgPSBjdm14X2dldF9jeWNsZSgpICsgKHVpbnQ2NF90KXRpbWVvdXRfdXNlYyAqIFwKIAkJCW9jdGVvbl9nZXRfY2xvY2tfcmF0ZSgpIC8gMTAwMDAwMDsJCSAgICBcCi0JCXR5cGUgYzsJCQkJCQkJICAgIFwKKwkJdW5pb24gX3VuaW9uIGM7CQkJCQkJICAgIFwKKwkJCQkJCQkJCSAgICBcCiAJCXdoaWxlICgxKSB7CQkJCQkJICAgIFwKLQkJCWMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgYWRkcmVzcyk7CSAgICBcCi0JCQlpZiAoYy5zLmZpZWxkIG9wICh2YWx1ZSkpIHsJCQkgICAgXAorCQkJYy51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgYWRkcmVzcyk7CSAgICBcCisJCQkJCQkJCQkgICAgXAorCQkJaWYgKGNvbmQpIHsJCQkJCSAgICBcCiAJCQkJcmVzdWx0ID0gMDsJCQkJICAgIFwKIAkJCQlicmVhazsJCQkJCSAgICBcCiAJCQl9IGVsc2UgaWYgKGN2bXhfZ2V0X2N5Y2xlKCkgPiBkb25lKSB7CQkgICAgXApAQCAtNDI4LDEyICs0MjAsMTMgQEAKICAqIFRoaXMgbWFjcm8gbG9naWNhbGx5IHNldHMgYSBzaW5nbGUgZmllbGQgaW4gYSBDU1IuIEl0IGRvZXMgdGhlIHNlcXVlbmNlCiAgKiByZWFkLCBtb2RpZnksIGFuZCB3cml0ZQogICovCi0jZGVmaW5lIFVTQl9TRVRfRklFTEQzMihhZGRyZXNzLCB0eXBlLCBmaWVsZCwgdmFsdWUpCQlcCisjZGVmaW5lIFVTQl9TRVRfRklFTEQzMihhZGRyZXNzLCBfdW5pb24sIGZpZWxkLCB2YWx1ZSkJCVwKIAlkbyB7CQkJCQkJCVwKLQkJdHlwZSBjOwkJCQkJCVwKLQkJYy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBhZGRyZXNzKTsJXAorCQl1bmlvbiBfdW5pb24gYzsJCQkJCVwKKwkJCQkJCQkJXAorCQljLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBhZGRyZXNzKTsJXAogCQljLnMuZmllbGQgPSB2YWx1ZTsJCQkJXAotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgYWRkcmVzcywgYy51MzIpOwlcCisJCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgYWRkcmVzcywgYy51MzIpOwlcCiAJfSB3aGlsZSAoMCkKIAogLyogUmV0dXJucyB0aGUgSU8gYWRkcmVzcyB0byBwdXNoL3BvcCBzdHVmZiBkYXRhIGZyb20gdGhlIEZJRk9zICovCkBAIC00NDIsNyArNDM1LDYgQEAKIAogLyoqCiAgKiBzdHJ1Y3Qgb2N0ZW9uX3RlbXBfYnVmZmVyIC0gYSBib3VuY2UgYnVmZmVyIGZvciBVU0IgdHJhbnNmZXJzCi0gKiBAdGVtcF9idWZmZXI6IHRoZSBuZXdseSBhbGxvY2F0ZWQgdGVtcG9yYXJ5IGJ1ZmZlciAoaW5jbHVkaW5nIG1ldGEtZGF0YSkKICAqIEBvcmlnX2J1ZmZlcjogdGhlIG9yaWdpbmFsIGJ1ZmZlciBwYXNzZWQgYnkgdGhlIFVTQiBzdGFjawogICogQGRhdGE6CSB0aGUgbmV3bHkgYWxsb2NhdGVkIHRlbXBvcmFyeSBidWZmZXIgKGV4Y2x1ZGluZyBtZXRhLWRhdGEpCiAgKgpAQCAtNDUxLDcgKzQ0Myw2IEBACiAgKiByZXByZXNlbnRzIGl0LgogICovCiBzdHJ1Y3Qgb2N0ZW9uX3RlbXBfYnVmZmVyIHsKLQl2b2lkICp0ZW1wX2J1ZmZlcjsKIAl2b2lkICpvcmlnX2J1ZmZlcjsKIAl1OCBkYXRhWzBdOwogfTsKQEAgLTQ4OSw3ICs0ODAsNiBAQAogCWlmICghdGVtcCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQl0ZW1wLT50ZW1wX2J1ZmZlciA9IHRlbXA7CiAJdGVtcC0+b3JpZ19idWZmZXIgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKIAlpZiAodXNiX3VyYl9kaXJfb3V0KHVyYikpCiAJCW1lbWNweSh0ZW1wLT5kYXRhLCB1cmItPnRyYW5zZmVyX2J1ZmZlciwKQEAgLTUyMCw3ICs1MTAsNyBAQAogCQkgICAgICAgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAl1cmItPnRyYW5zZmVyX2J1ZmZlciA9IHRlbXAtPm9yaWdfYnVmZmVyOwogCXVyYi0+dHJhbnNmZXJfZmxhZ3MgJj0gflVSQl9BTElHTkVEX1RFTVBfQlVGRkVSOwotCWtmcmVlKHRlbXAtPnRlbXBfYnVmZmVyKTsKKwlrZnJlZSh0ZW1wKTsKIH0KIAogLyoqCkBAIC01NjYsOCArNTU2LDggQEAKICAqCiAgKiBSZXR1cm5zOiBSZXN1bHQgb2YgdGhlIHJlYWQKICAqLwotc3RhdGljIGlubGluZSB1aW50MzJfdCBfX2N2bXhfdXNiX3JlYWRfY3NyMzIoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCi0JCQkJCSAgICAgdWludDY0X3QgYWRkcmVzcykKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY3ZteF91c2JfcmVhZF9jc3IzMihzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJCQkJICAgdWludDY0X3QgYWRkcmVzcykKIHsKIAl1aW50MzJfdCByZXN1bHQgPSBjdm14X3JlYWQ2NF91aW50MzIoYWRkcmVzcyBeIDQpOwogCXJldHVybiByZXN1bHQ7CkBAIC01ODMsNDUgKzU3MywxMyBAQAogICogQGFkZHJlc3M6IDY0Yml0IGFkZHJlc3MgdG8gd3JpdGUKICAqIEB2YWx1ZTogICBWYWx1ZSB0byB3cml0ZQogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jdm14X3VzYl93cml0ZV9jc3IzMihzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkJICB1aW50NjRfdCBhZGRyZXNzLCB1aW50MzJfdCB2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjdm14X3VzYl93cml0ZV9jc3IzMihzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJCQkJdWludDY0X3QgYWRkcmVzcywgdWludDMyX3QgdmFsdWUpCiB7CiAJY3ZteF93cml0ZTY0X3VpbnQzMihhZGRyZXNzIF4gNCwgdmFsdWUpOwogCWN2bXhfcmVhZDY0X3VpbnQ2NChDVk1YX1VTQk5YX0RNQTBfSU5CX0NITjAodXNiLT5pbmRleCkpOwogfQogCi0KLS8qKgotICogUmVhZCBhIFVTQiA2NGJpdCBDU1IuIEl0IGxvZ3MgdGhlIHZhbHVlIGluIGEgcmVhZGFibGUgZm9ybWF0IGlmCi0gKiBkZWJ1Z2dpbmcgaXMgb24uCi0gKgotICogQHVzYjogICAgIFVTQiBibG9jayB0aGlzIGFjY2VzcyBpcyBmb3IKLSAqIEBhZGRyZXNzOiA2NGJpdCBhZGRyZXNzIHRvIHJlYWQKLSAqCi0gKiBSZXR1cm5zOiBSZXN1bHQgb2YgdGhlIHJlYWQKLSAqLwotc3RhdGljIGlubGluZSB1aW50NjRfdCBfX2N2bXhfdXNiX3JlYWRfY3NyNjQoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCi0JCQkJCSAgICAgdWludDY0X3QgYWRkcmVzcykKLXsKLQl1aW50NjRfdCByZXN1bHQgPSBjdm14X3JlYWQ2NF91aW50NjQoYWRkcmVzcyk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vKioKLSAqIFdyaXRlIGEgVVNCIDY0Yml0IENTUi4gSXQgbG9ncyB0aGUgdmFsdWUgaW4gYSByZWFkYWJsZSBmb3JtYXQKLSAqIGlmIGRlYnVnZ2luZyBpcyBvbi4KLSAqCi0gKiBAdXNiOiAgICAgVVNCIGJsb2NrIHRoaXMgYWNjZXNzIGlzIGZvcgotICogQGFkZHJlc3M6IDY0Yml0IGFkZHJlc3MgdG8gd3JpdGUKLSAqIEB2YWx1ZTogICBWYWx1ZSB0byB3cml0ZQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jdm14X3VzYl93cml0ZV9jc3I2NChzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkJICB1aW50NjRfdCBhZGRyZXNzLCB1aW50NjRfdCB2YWx1ZSkKLXsKLQljdm14X3dyaXRlNjRfdWludDY0KGFkZHJlc3MsIHZhbHVlKTsKLX0KLQogLyoqCiAgKiBSZXR1cm4gbm9uIHplcm8gaWYgdGhpcyBwaXBlIGNvbm5lY3RzIHRvIGEgbm9uIEhJR0ggc3BlZWQKICAqIGRldmljZSB0aHJvdWdoIGEgaGlnaCBzcGVlZCBodWIuCkBAIC02MzEsOCArNTg5LDggQEAKICAqCiAgKiBSZXR1cm5zOiBOb24gemVybyBpZiB3ZSBuZWVkIHRvIGRvIHNwbGl0IHRyYW5zYWN0aW9ucwogICovCi1zdGF0aWMgaW5saW5lIGludCBfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCi0JCQkJCSAgICAgIHN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlKQorc3RhdGljIGlubGluZSBpbnQgY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdChzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJCQkJICAgIHN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlKQogewogCXJldHVybiBwaXBlLT5kZXZpY2Vfc3BlZWQgIT0gQ1ZNWF9VU0JfU1BFRURfSElHSCAmJgogCSAgICAgICB1c2ItPnVzYmN4X2hwcnQucy5wcnRzcGQgPT0gQ1ZNWF9VU0JfU1BFRURfSElHSDsKQEAgLTY0Niw0OCArNjA0LDExOSBAQAogICoKICAqIFJldHVybnM6IFBJRCBmb3IgcGlwZQogICovCi1zdGF0aWMgaW5saW5lIGludCBfX2N2bXhfdXNiX2dldF9kYXRhX3BpZChzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSkKK3N0YXRpYyBpbmxpbmUgaW50IGN2bXhfdXNiX2dldF9kYXRhX3BpZChzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSkKIHsKIAlpZiAocGlwZS0+cGlkX3RvZ2dsZSkKIAkJcmV0dXJuIDI7IC8qIERhdGExICovCiAJcmV0dXJuIDA7IC8qIERhdGEwICovCiB9CiAKK3N0YXRpYyB2b2lkIGN2bXhfZmlmb19zZXR1cChzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKK3sKKwl1bmlvbiBjdm14X3VzYmN4X2dod2NmZzMgdXNiY3hfZ2h3Y2ZnMzsKKwl1bmlvbiBjdm14X3VzYmN4X2ducHR4ZnNpeiBucHNpejsKKwl1bmlvbiBjdm14X3VzYmN4X2hwdHhmc2l6IHBzaXo7CisKKwl1c2JjeF9naHdjZmczLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCQkJQ1ZNWF9VU0JDWF9HSFdDRkczKHVzYi0+aW5kZXgpKTsKKworCS8qCisJICogUHJvZ3JhbSB0aGUgVVNCQ19HUlhGU0laIHJlZ2lzdGVyIHRvIHNlbGVjdCB0aGUgc2l6ZSBvZiB0aGUgcmVjZWl2ZQorCSAqIEZJRk8gKDI1JSkuCisJICovCisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JYRlNJWih1c2ItPmluZGV4KSwgY3ZteF91c2JjeF9ncnhmc2l6LAorCQkJcnhmZGVwLCB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDQpOworCisJLyoKKwkgKiBQcm9ncmFtIHRoZSBVU0JDX0dOUFRYRlNJWiByZWdpc3RlciB0byBzZWxlY3QgdGhlIHNpemUgYW5kIHRoZSBzdGFydAorCSAqIGFkZHJlc3Mgb2YgdGhlIG5vbi1wZXJpb2RpYyB0cmFuc21pdCBGSUZPIGZvciBub25wZXJpb2RpYworCSAqIHRyYW5zYWN0aW9ucyAoNTAlKS4KKwkgKi8KKwlucHNpei51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HTlBUWEZTSVoodXNiLT5pbmRleCkpOworCW5wc2l6LnMubnB0eGZkZXAgPSB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDI7CisJbnBzaXoucy5ucHR4ZnN0YWRkciA9IHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gNDsKKwljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR05QVFhGU0laKHVzYi0+aW5kZXgpLCBucHNpei51MzIpOworCisJLyoKKwkgKiBQcm9ncmFtIHRoZSBVU0JDX0hQVFhGU0laIHJlZ2lzdGVyIHRvIHNlbGVjdCB0aGUgc2l6ZSBhbmQgc3RhcnQKKwkgKiBhZGRyZXNzIG9mIHRoZSBwZXJpb2RpYyB0cmFuc21pdCBGSUZPIGZvciBwZXJpb2RpYyB0cmFuc2FjdGlvbnMKKwkgKiAoMjUlKS4KKwkgKi8KKwlwc2l6LnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQVFhGU0laKHVzYi0+aW5kZXgpKTsKKwlwc2l6LnMucHR4ZnNpemUgPSB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDQ7CisJcHNpei5zLnB0eGZzdGFkZHIgPSAzICogdXNiY3hfZ2h3Y2ZnMy5zLmRmaWZvZGVwdGggLyA0OworCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFRYRlNJWih1c2ItPmluZGV4KSwgcHNpei51MzIpOworCisJLyogRmx1c2ggYWxsIEZJRk9zICovCisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKKwkJCWN2bXhfdXNiY3hfZ3JzdGN0bCwgdHhmbnVtLCAweDEwKTsKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLAorCQkJY3ZteF91c2JjeF9ncnN0Y3RsLCB0eGZmbHNoLCAxKTsKKwlDVk1YX1dBSVRfRk9SX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HUlNUQ1RMKHVzYi0+aW5kZXgpLAorCQkJICAgICAgY3ZteF91c2JjeF9ncnN0Y3RsLCBjLnMudHhmZmxzaCA9PSAwLCAxMDApOworCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCisJCQljdm14X3VzYmN4X2dyc3RjdGwsIHJ4ZmZsc2gsIDEpOworCUNWTVhfV0FJVF9GT1JfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCisJCQkgICAgICBjdm14X3VzYmN4X2dyc3RjdGwsIGMucy5yeGZmbHNoID09IDAsIDEwMCk7Cit9CisKKy8qKgorICogU2h1dGRvd24gYSBVU0IgcG9ydCBhZnRlciBhIGNhbGwgdG8gY3ZteF91c2JfaW5pdGlhbGl6ZSgpLgorICogVGhlIHBvcnQgc2hvdWxkIGJlIGRpc2FibGVkIHdpdGggYWxsIHBpcGVzIGNsb3NlZCB3aGVuIHRoaXMKKyAqIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAqCisgKiBAdXNiOiBVU0IgZGV2aWNlIHN0YXRlIHBvcHVsYXRlZCBieSBjdm14X3VzYl9pbml0aWFsaXplKCkuCisgKgorICogUmV0dXJuczogMCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgY3ZteF91c2Jfc2h1dGRvd24oc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCit7CisJdW5pb24gY3ZteF91c2JueF9jbGtfY3RsIHVzYm5fY2xrX2N0bDsKKworCS8qIE1ha2Ugc3VyZSBhbGwgcGlwZXMgYXJlIGNsb3NlZCAqLworCWlmICghbGlzdF9lbXB0eSgmdXNiLT5pZGxlX3BpcGVzKSB8fAorCSAgICAhbGlzdF9lbXB0eSgmdXNiLT5hY3RpdmVfcGlwZXNbQ1ZNWF9VU0JfVFJBTlNGRVJfSVNPQ0hST05PVVNdKSB8fAorCSAgICAhbGlzdF9lbXB0eSgmdXNiLT5hY3RpdmVfcGlwZXNbQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBUXSkgfHwKKwkgICAgIWxpc3RfZW1wdHkoJnVzYi0+YWN0aXZlX3BpcGVzW0NWTVhfVVNCX1RSQU5TRkVSX0NPTlRST0xdKSB8fAorCSAgICAhbGlzdF9lbXB0eSgmdXNiLT5hY3RpdmVfcGlwZXNbQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMS10pKQorCQlyZXR1cm4gLUVCVVNZOworCisJLyogRGlzYWJsZSB0aGUgY2xvY2tzIGFuZCBwdXQgdGhlbSBpbiBwb3dlciBvbiByZXNldCAqLworCXVzYm5fY2xrX2N0bC51NjQgPSBjdm14X3JlYWQ2NF91aW50NjQoQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpKTsKKwl1c2JuX2Nsa19jdGwucy5lbmFibGUgPSAxOworCXVzYm5fY2xrX2N0bC5zLnBvciA9IDE7CisJdXNibl9jbGtfY3RsLnMuaGNsa19yc3QgPSAxOworCXVzYm5fY2xrX2N0bC5zLnByc3QgPSAwOworCXVzYm5fY2xrX2N0bC5zLmhyc3QgPSAwOworCWN2bXhfd3JpdGU2NF91aW50NjQoQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpLCB1c2JuX2Nsa19jdGwudTY0KTsKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBJbml0aWFsaXplIGEgVVNCIHBvcnQgZm9yIHVzZS4gVGhpcyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55CiAgKiBvdGhlciBhY2Nlc3MgdG8gdGhlIE9jdGVvbiBVU0IgcG9ydCBpcyBtYWRlLiBUaGUgcG9ydCBzdGFydHMKICAqIG9mZiBpbiB0aGUgZGlzYWJsZWQgc3RhdGUuCiAgKgotICogQHVzYjoJIFBvaW50ZXIgdG8gYW4gZW1wdHkgc3RydWN0IGN2bXhfdXNiX3N0YXRlCi0gKgkJIHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQgYnkgdGhlIGluaXRpYWxpemUgY2FsbC4KLSAqCQkgVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlbiBwYXNzZWQgdG8gYWxsIG90aGVyIFVTQgotICoJCSBmdW5jdGlvbnMuCi0gKiBAdXNiX3BvcnRfbnVtYmVyOgotICoJCSBXaGljaCBPY3Rlb24gVVNCIHBvcnQgdG8gaW5pdGlhbGl6ZS4KKyAqIEBkZXY6CSBQb2ludGVyIHRvIHN0cnVjdCBkZXZpY2UgZm9yIGxvZ2dpbmcgcHVycG9zZXMuCisgKiBAdXNiOgkgUG9pbnRlciB0byBzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUuCiAgKgogICogUmV0dXJuczogMCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KLXN0YXRpYyBpbnQgY3ZteF91c2JfaW5pdGlhbGl6ZShzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCSAgICAgICBpbnQgdXNiX3BvcnRfbnVtYmVyLAotCQkJICAgICAgIGVudW0gY3ZteF91c2JfaW5pdGlhbGl6ZV9mbGFncyBmbGFncykKK3N0YXRpYyBpbnQgY3ZteF91c2JfaW5pdGlhbGl6ZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCiB7CisJaW50IGNoYW5uZWw7CisJaW50IGRpdmlzb3I7CisJaW50IHJldHJpZXMgPSAwOworCXVuaW9uIGN2bXhfdXNiY3hfaGNmZyB1c2JjeF9oY2ZnOwogCXVuaW9uIGN2bXhfdXNibnhfY2xrX2N0bCB1c2JuX2Nsa19jdGw7CisJdW5pb24gY3ZteF91c2JjeF9naW50c3RzIHVzYmNfZ2ludHN0czsKKwl1bmlvbiBjdm14X3VzYmN4X2dhaGJjZmcgdXNiY3hfZ2FoYmNmZzsKKwl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2sgdXNiY3hfZ2ludG1zazsKKwl1bmlvbiBjdm14X3VzYmN4X2d1c2JjZmcgdXNiY3hfZ3VzYmNmZzsKIAl1bmlvbiBjdm14X3VzYm54X3VzYnBfY3RsX3N0YXR1cyB1c2JuX3VzYnBfY3RsX3N0YXR1czsKLQlpbnQgaTsKIAotCS8qIEF0IGZpcnN0IGFsbG93IDAtMSBmb3IgdGhlIHVzYiBwb3J0IG51bWJlciAqLwotCWlmICgodXNiX3BvcnRfbnVtYmVyIDwgMCkgfHwgKHVzYl9wb3J0X251bWJlciA+IDEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbXNldCh1c2IsIDAsIHNpemVvZigqdXNiKSk7Ci0JdXNiLT5pbml0X2ZsYWdzID0gZmxhZ3M7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBVU0Igc3RhdGUgc3RydWN0dXJlICovCi0JdXNiLT5pbmRleCA9IHVzYl9wb3J0X251bWJlcjsKLQlJTklUX0xJU1RfSEVBRCgmdXNiLT5pZGxlX3BpcGVzKTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh1c2ItPmFjdGl2ZV9waXBlcyk7IGkrKykKLQkJSU5JVF9MSVNUX0hFQUQoJnVzYi0+YWN0aXZlX3BpcGVzW2ldKTsKLQorcmV0cnk6CiAJLyoKIAkgKiBQb3dlciBPbiBSZXNldCBhbmQgUEhZIEluaXRpYWxpemF0aW9uCiAJICoKQEAgLTY5Niw4ICs3MjUsNyBAQAogCSAqIDJhLiBXcml0ZSBVU0JOMC8xX0NMS19DVExbUE9SXSA9IDEgYW5kCiAJICogICAgIFVTQk4wLzFfQ0xLX0NUTFtIUlNULFBSU1QsSENMS19SU1RdID0gMAogCSAqLwotCXVzYm5fY2xrX2N0bC51NjQgPQotCQlfX2N2bXhfdXNiX3JlYWRfY3NyNjQodXNiLCBDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCkpOworCXVzYm5fY2xrX2N0bC51NjQgPSBjdm14X3JlYWQ2NF91aW50NjQoQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpKTsKIAl1c2JuX2Nsa19jdGwucy5wb3IgPSAxOwogCXVzYm5fY2xrX2N0bC5zLmhyc3QgPSAwOwogCXVzYm5fY2xrX2N0bC5zLnByc3QgPSAwOwpAQCAtNzIyLDcgKzc1MCw4IEBACiAJCQkvKiBGcm9tIENONTJYWCBtYW51YWwgKi8KIAkJCXVzYm5fY2xrX2N0bC5zLnBfcnR5cGUgPSAxOwogCi0JCXN3aXRjaCAoZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX0NMT0NLX01IWl9NQVNLKSB7CisJCXN3aXRjaCAodXNiLT5pbml0X2ZsYWdzICYKKwkJCUNWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfQ0xPQ0tfTUhaX01BU0spIHsKIAkJY2FzZSBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX0NMT0NLXzEyTUhaOgogCQkJdXNibl9jbGtfY3RsLnMucF9jX3NlbCA9IDA7CiAJCQlicmVhazsKQEAgLTc1MiwyMCArNzgxLDE3IEBACiAJICogICAgIHNldHRpbmcgVVNCTjAvMV9DTEtfQ1RMW0VOQUJMRV0gPSAxLiBEaXZpZGUgdGhlIGNvcmUgY2xvY2sgZG93bgogCSAqICAgICBzdWNoIHRoYXQgVVNCIGlzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHRvIDEyNU1oegogCSAqLwotCXsKLQkJaW50IGRpdmlzb3IgPSBESVZfUk9VTkRfVVAob2N0ZW9uX2dldF9jbG9ja19yYXRlKCksIDEyNTAwMDAwMCk7Ci0JCS8qIExvd2VyIHRoYW4gNCBkb2Vzbid0IHNlZW0gdG8gd29yayBwcm9wZXJseSAqLwotCQlpZiAoZGl2aXNvciA8IDQpCi0JCQlkaXZpc29yID0gNDsKLQkJdXNibl9jbGtfY3RsLnMuZGl2aWRlID0gZGl2aXNvcjsKLQkJdXNibl9jbGtfY3RsLnMuZGl2aWRlMiA9IDA7Ci0JfQotCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLCBDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksCi0JCQkgICAgICAgdXNibl9jbGtfY3RsLnU2NCk7CisJZGl2aXNvciA9IERJVl9ST1VORF9VUChvY3Rlb25fZ2V0X2Nsb2NrX3JhdGUoKSwgMTI1MDAwMDAwKTsKKwkvKiBMb3dlciB0aGFuIDQgZG9lc24ndCBzZWVtIHRvIHdvcmsgcHJvcGVybHkgKi8KKwlpZiAoZGl2aXNvciA8IDQpCisJCWRpdmlzb3IgPSA0OworCXVzYm5fY2xrX2N0bC5zLmRpdmlkZSA9IGRpdmlzb3I7CisJdXNibl9jbGtfY3RsLnMuZGl2aWRlMiA9IDA7CisJY3ZteF93cml0ZTY0X3VpbnQ2NChDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksIHVzYm5fY2xrX2N0bC51NjQpOworCiAJLyogMmQuIFdyaXRlIFVTQk4wLzFfQ0xLX0NUTFtIQ0xLX1JTVF0gPSAxICovCiAJdXNibl9jbGtfY3RsLnMuaGNsa19yc3QgPSAxOwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLCBDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksCi0JCQkgICAgICAgdXNibl9jbGtfY3RsLnU2NCk7CisJY3ZteF93cml0ZTY0X3VpbnQ2NChDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksIHVzYm5fY2xrX2N0bC51NjQpOwogCS8qIDJlLiAgV2FpdCA2NCBjb3JlLWNsb2NrIGN5Y2xlcyBmb3IgSENMSyB0byBzdGFiaWxpemUgKi8KIAljdm14X3dhaXQoNjQpOwogCS8qCkBAIC03NzQsOCArODAwLDcgQEAKIAkgKiAgICBVU0JOX0NMS19DVExbUE9SXSA9IDAKIAkgKi8KIAl1c2JuX2Nsa19jdGwucy5wb3IgPSAwOwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLCBDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksCi0JCQkgICAgICAgdXNibl9jbGtfY3RsLnU2NCk7CisJY3ZteF93cml0ZTY0X3VpbnQ2NChDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksIHVzYm5fY2xrX2N0bC51NjQpOwogCS8qIDQuIFdhaXQgMSBtcyBmb3IgUEhZIGNsb2NrIHRvIHN0YXJ0ICovCiAJbWRlbGF5KDEpOwogCS8qCkBAIC03ODMsMTEgKzgwOCwxMSBAQAogCSAqICAgIFVTQlAgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyOgogCSAqICAgIFVTQk5fVVNCUF9DVExfU1RBVFVTW0FURV9SRVNFVF0gPSAxCiAJICovCi0JdXNibl91c2JwX2N0bF9zdGF0dXMudTY0ID0gX19jdm14X3VzYl9yZWFkX2NzcjY0KHVzYiwKLQkJCUNWTVhfVVNCTlhfVVNCUF9DVExfU1RBVFVTKHVzYi0+aW5kZXgpKTsKKwl1c2JuX3VzYnBfY3RsX3N0YXR1cy51NjQgPQorCQljdm14X3JlYWQ2NF91aW50NjQoQ1ZNWF9VU0JOWF9VU0JQX0NUTF9TVEFUVVModXNiLT5pbmRleCkpOwogCXVzYm5fdXNicF9jdGxfc3RhdHVzLnMuYXRlX3Jlc2V0ID0gMTsKLQlfX2N2bXhfdXNiX3dyaXRlX2NzcjY0KHVzYiwgQ1ZNWF9VU0JOWF9VU0JQX0NUTF9TVEFUVVModXNiLT5pbmRleCksCi0JCQkgICAgICAgdXNibl91c2JwX2N0bF9zdGF0dXMudTY0KTsKKwljdm14X3dyaXRlNjRfdWludDY0KENWTVhfVVNCTlhfVVNCUF9DVExfU1RBVFVTKHVzYi0+aW5kZXgpLAorCQkJICAgIHVzYm5fdXNicF9jdGxfc3RhdHVzLnU2NCk7CiAJLyogNi4gV2FpdCAxMCBjeWNsZXMgKi8KIAljdm14X3dhaXQoMTApOwogCS8qCkBAIC03OTUsMjMgKzgyMCwyMiBAQAogCSAqICAgIFVTQk5fVVNCUF9DVExfU1RBVFVTW0FURV9SRVNFVF0gPSAwCiAJICovCiAJdXNibl91c2JwX2N0bF9zdGF0dXMucy5hdGVfcmVzZXQgPSAwOwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLCBDVk1YX1VTQk5YX1VTQlBfQ1RMX1NUQVRVUyh1c2ItPmluZGV4KSwKLQkJCSAgICAgICB1c2JuX3VzYnBfY3RsX3N0YXR1cy51NjQpOworCWN2bXhfd3JpdGU2NF91aW50NjQoQ1ZNWF9VU0JOWF9VU0JQX0NUTF9TVEFUVVModXNiLT5pbmRleCksCisJCQkgICAgdXNibl91c2JwX2N0bF9zdGF0dXMudTY0KTsKIAkvKgogCSAqIDguIFByb2dyYW0gdGhlIFBIWSByZXNldCBmaWVsZCBpbiB0aGUgVVNCTiBjbG9jay1jb250cm9sIHJlZ2lzdGVyOgogCSAqICAgIFVTQk5fQ0xLX0NUTFtQUlNUXSA9IDEKIAkgKi8KIAl1c2JuX2Nsa19jdGwucy5wcnN0ID0gMTsKLQlfX2N2bXhfdXNiX3dyaXRlX2NzcjY0KHVzYiwgQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpLAotCQkJICAgICAgIHVzYm5fY2xrX2N0bC51NjQpOworCWN2bXhfd3JpdGU2NF91aW50NjQoQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpLCB1c2JuX2Nsa19jdGwudTY0KTsKIAkvKgogCSAqIDkuIFByb2dyYW0gdGhlIFVTQlAgY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlbGVjdCBob3N0IG9yCiAJICogICAgZGV2aWNlIG1vZGUuIFVTQk5fVVNCUF9DVExfU1RBVFVTW0hTVF9NT0RFXSA9IDAgZm9yIGhvc3QsID0gMSBmb3IKIAkgKiAgICBkZXZpY2UKIAkgKi8KIAl1c2JuX3VzYnBfY3RsX3N0YXR1cy5zLmhzdF9tb2RlID0gMDsKLQlfX2N2bXhfdXNiX3dyaXRlX2NzcjY0KHVzYiwgQ1ZNWF9VU0JOWF9VU0JQX0NUTF9TVEFUVVModXNiLT5pbmRleCksCi0JCQkgICAgICAgdXNibl91c2JwX2N0bF9zdGF0dXMudTY0KTsKKwljdm14X3dyaXRlNjRfdWludDY0KENWTVhfVVNCTlhfVVNCUF9DVExfU1RBVFVTKHVzYi0+aW5kZXgpLAorCQkJICAgIHVzYm5fdXNicF9jdGxfc3RhdHVzLnU2NCk7CiAJLyogMTAuIFdhaXQgMSB1cyAqLwogCXVkZWxheSgxKTsKIAkvKgpAQCAtODE5LDEyICs4NDMsMTAgQEAKIAkgKiAgICAgVVNCTl9DTEtfQ1RMW0hSU1RdID0gMQogCSAqLwogCXVzYm5fY2xrX2N0bC5zLmhyc3QgPSAxOwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLCBDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksCi0JCQkgICAgICAgdXNibl9jbGtfY3RsLnU2NCk7CisJY3ZteF93cml0ZTY0X3VpbnQ2NChDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksIHVzYm5fY2xrX2N0bC51NjQpOwogCS8qIDEyLiBQcm9jZWVkIHRvIFVTQiBjb3JlIGluaXRpYWxpemF0aW9uICovCiAJdXNibl9jbGtfY3RsLnMuZW5hYmxlID0gMTsKLQlfX2N2bXhfdXNiX3dyaXRlX2NzcjY0KHVzYiwgQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpLAotCQkJICAgICAgIHVzYm5fY2xrX2N0bC51NjQpOworCWN2bXhfd3JpdGU2NF91aW50NjQoQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpLCB1c2JuX2Nsa19jdGwudTY0KTsKIAl1ZGVsYXkoMSk7CiAKIAkvKgpAQCAtODQ1LDI5ICs4NjcsMTYgQEAKIAkgKiAgICBVU0JDX0dBSEJDRkdbUFRYRkVNUExWTF0KIAkgKiAgICBHbG9iYWwgaW50ZXJydXB0IG1hc2ssIFVTQkNfR0FIQkNGR1tHTEJMSU5UUk1TS10gPSAxCiAJICovCi0JewotCQl1bmlvbiBjdm14X3VzYmN4X2dhaGJjZmcgdXNiY3hfZ2FoYmNmZzsKLQkJLyogRHVlIHRvIGFuIGVycmF0YSwgQ04zMVhYIGRvZXNuJ3Qgc3VwcG9ydCBETUEgKi8KLQkJaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ04zMVhYKSkKLQkJCXVzYi0+aW5pdF9mbGFncyB8PSBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQTsKLQkJdXNiY3hfZ2FoYmNmZy51MzIgPSAwOwotCQl1c2JjeF9nYWhiY2ZnLnMuZG1hZW4gPSAhKHVzYi0+aW5pdF9mbGFncyAmCi0JCQkJCSAgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpOwotCQlpZiAodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpCi0JCQkvKiBPbmx5IHVzZSBvbmUgY2hhbm5lbCB3aXRoIG5vbiBETUEgKi8KLQkJCXVzYi0+aWRsZV9oYXJkd2FyZV9jaGFubmVscyA9IDB4MTsKLQkJZWxzZSBpZiAoT0NURU9OX0lTX01PREVMKE9DVEVPTl9DTjVYWFgpKQotCQkJLyogQ041WFhYIGhhdmUgYW4gZXJyYXRhIHdpdGggY2hhbm5lbCAzICovCi0JCQl1c2ItPmlkbGVfaGFyZHdhcmVfY2hhbm5lbHMgPSAweGY3OwotCQllbHNlCi0JCQl1c2ItPmlkbGVfaGFyZHdhcmVfY2hhbm5lbHMgPSAweGZmOwotCQl1c2JjeF9nYWhiY2ZnLnMuaGJzdGxlbiA9IDA7Ci0JCXVzYmN4X2dhaGJjZmcucy5ucHR4ZmVtcGx2bCA9IDE7Ci0JCXVzYmN4X2dhaGJjZmcucy5wdHhmZW1wbHZsID0gMTsKLQkJdXNiY3hfZ2FoYmNmZy5zLmdsYmxpbnRybXNrID0gMTsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR0FIQkNGRyh1c2ItPmluZGV4KSwKLQkJCQkgICAgICAgdXNiY3hfZ2FoYmNmZy51MzIpOwotCX0KKwl1c2JjeF9nYWhiY2ZnLnUzMiA9IDA7CisJdXNiY3hfZ2FoYmNmZy5zLmRtYWVuID0gISh1c2ItPmluaXRfZmxhZ3MgJgorCQkJCSAgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpOworCXVzYmN4X2dhaGJjZmcucy5oYnN0bGVuID0gMDsKKwl1c2JjeF9nYWhiY2ZnLnMubnB0eGZlbXBsdmwgPSAxOworCXVzYmN4X2dhaGJjZmcucy5wdHhmZW1wbHZsID0gMTsKKwl1c2JjeF9nYWhiY2ZnLnMuZ2xibGludHJtc2sgPSAxOworCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HQUhCQ0ZHKHVzYi0+aW5kZXgpLAorCQkJICAgICB1c2JjeF9nYWhiY2ZnLnUzMik7CisKIAkvKgogCSAqIDMuIFByb2dyYW0gdGhlIGZvbGxvd2luZyBmaWVsZHMgaW4gVVNCQ19HVVNCQ0ZHIHJlZ2lzdGVyLgogCSAqICAgIEhTL0ZTIHRpbWVvdXQgY2FsaWJyYXRpb24sIFVTQkNfR1VTQkNGR1tUT1VUQ0FMXSA9IDAKQEAgLTg3NSwxNTQgKzg4NCw5OCBAQAogCSAqICAgIFVTQiB0dXJuYXJvdW5kIHRpbWUsIFVTQkNfR1VTQkNGR1tVU0JUUkRUSU1dID0gMHg1CiAJICogICAgUEhZIGxvdy1wb3dlciBjbG9jayBzZWxlY3QsIFVTQkNfR1VTQkNGR1tQSFlMUFdSQ0xLU0VMXSA9IDAKIAkgKi8KLQl7Ci0JCXVuaW9uIGN2bXhfdXNiY3hfZ3VzYmNmZyB1c2JjeF9ndXNiY2ZnOworCXVzYmN4X2d1c2JjZmcudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJCQlDVk1YX1VTQkNYX0dVU0JDRkcodXNiLT5pbmRleCkpOworCXVzYmN4X2d1c2JjZmcucy50b3V0Y2FsID0gMDsKKwl1c2JjeF9ndXNiY2ZnLnMuZGRyc2VsID0gMDsKKwl1c2JjeF9ndXNiY2ZnLnMudXNidHJkdGltID0gMHg1OworCXVzYmN4X2d1c2JjZmcucy5waHlscHdyY2xrc2VsID0gMDsKKwljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfR1VTQkNGRyh1c2ItPmluZGV4KSwKKwkJCSAgICAgdXNiY3hfZ3VzYmNmZy51MzIpOwogCi0JCXVzYmN4X2d1c2JjZmcudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCQlDVk1YX1VTQkNYX0dVU0JDRkcodXNiLT5pbmRleCkpOwotCQl1c2JjeF9ndXNiY2ZnLnMudG91dGNhbCA9IDA7Ci0JCXVzYmN4X2d1c2JjZmcucy5kZHJzZWwgPSAwOwotCQl1c2JjeF9ndXNiY2ZnLnMudXNidHJkdGltID0gMHg1OwotCQl1c2JjeF9ndXNiY2ZnLnMucGh5bHB3cmNsa3NlbCA9IDA7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dVU0JDRkcodXNiLT5pbmRleCksCi0JCQkJICAgICAgIHVzYmN4X2d1c2JjZmcudTMyKTsKLQl9CiAJLyoKIAkgKiA0LiBUaGUgc29mdHdhcmUgbXVzdCB1bm1hc2sgdGhlIGZvbGxvd2luZyBiaXRzIGluIHRoZSBVU0JDX0dJTlRNU0sKIAkgKiAgICByZWdpc3Rlci4KIAkgKiAgICBPVEcgaW50ZXJydXB0IG1hc2ssIFVTQkNfR0lOVE1TS1tPVEdJTlRNU0tdID0gMQogCSAqICAgIE1vZGUgbWlzbWF0Y2ggaW50ZXJydXB0IG1hc2ssIFVTQkNfR0lOVE1TS1tNT0RFTUlTTVNLXSA9IDEKIAkgKi8KLQl7Ci0JCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zayB1c2JjeF9naW50bXNrOwotCQlpbnQgY2hhbm5lbDsKKwl1c2JjeF9naW50bXNrLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCQkJQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpKTsKKwl1c2JjeF9naW50bXNrLnMub3RnaW50bXNrID0gMTsKKwl1c2JjeF9naW50bXNrLnMubW9kZW1pc21zayA9IDE7CisJdXNiY3hfZ2ludG1zay5zLmhjaGludG1zayA9IDE7CisJdXNiY3hfZ2ludG1zay5zLnNvZm1zayA9IDA7CisJLyogV2UgbmVlZCBSWCBGSUZPIGludGVycnVwdHMgaWYgd2UgZG9uJ3QgaGF2ZSBETUEgKi8KKwlpZiAodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpCisJCXVzYmN4X2dpbnRtc2sucy5yeGZsdmxtc2sgPSAxOworCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAorCQkJICAgICB1c2JjeF9naW50bXNrLnUzMik7CiAKLQkJdXNiY3hfZ2ludG1zay51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJCUNWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSk7Ci0JCXVzYmN4X2dpbnRtc2sucy5vdGdpbnRtc2sgPSAxOwotCQl1c2JjeF9naW50bXNrLnMubW9kZW1pc21zayA9IDE7Ci0JCXVzYmN4X2dpbnRtc2sucy5oY2hpbnRtc2sgPSAxOwotCQl1c2JjeF9naW50bXNrLnMuc29mbXNrID0gMDsKLQkJLyogV2UgbmVlZCBSWCBGSUZPIGludGVycnVwdHMgaWYgd2UgZG9uJ3QgaGF2ZSBETUEgKi8KLQkJaWYgKHVzYi0+aW5pdF9mbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKQotCQkJdXNiY3hfZ2ludG1zay5zLnJ4Zmx2bG1zayA9IDE7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCi0JCQkJICAgICAgIHVzYmN4X2dpbnRtc2sudTMyKTsKKwkvKgorCSAqIERpc2FibGUgYWxsIGNoYW5uZWwgaW50ZXJydXB0cy4gV2UnbGwgZW5hYmxlIHRoZW0gcGVyIGNoYW5uZWwgbGF0ZXIuCisJICovCisJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IDg7IGNoYW5uZWwrKykKKwkJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCSAgICAgQ1ZNWF9VU0JDWF9IQ0lOVE1TS1goY2hhbm5lbCwgdXNiLT5pbmRleCksCisJCQkJICAgICAwKTsKIAotCQkvKgotCQkgKiBEaXNhYmxlIGFsbCBjaGFubmVsIGludGVycnVwdHMuIFdlJ2xsIGVuYWJsZSB0aGVtIHBlciBjaGFubmVsCi0JCSAqIGxhdGVyLgotCQkgKi8KLQkJZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IDg7IGNoYW5uZWwrKykKLQkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAotCQkJCUNWTVhfVVNCQ1hfSENJTlRNU0tYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLCAwKTsKLQl9CisJLyoKKwkgKiBIb3N0IFBvcnQgSW5pdGlhbGl6YXRpb24KKwkgKgorCSAqIDEuIFByb2dyYW0gdGhlIGhvc3QtcG9ydCBpbnRlcnJ1cHQtbWFzayBmaWVsZCB0byB1bm1hc2ssCisJICogICAgVVNCQ19HSU5UTVNLW1BSVElOVF0gPSAxCisJICovCisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKKwkJCWN2bXhfdXNiY3hfZ2ludG1zaywgcHJ0aW50bXNrLCAxKTsKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9HSU5UTVNLKHVzYi0+aW5kZXgpLAorCQkJY3ZteF91c2JjeF9naW50bXNrLCBkaXNjb25uaW50bXNrLCAxKTsKIAotCXsKLQkJLyoKLQkJICogSG9zdCBQb3J0IEluaXRpYWxpemF0aW9uCi0JCSAqCi0JCSAqIDEuIFByb2dyYW0gdGhlIGhvc3QtcG9ydCBpbnRlcnJ1cHQtbWFzayBmaWVsZCB0byB1bm1hc2ssCi0JCSAqICAgIFVTQkNfR0lOVE1TS1tQUlRJTlRdID0gMQotCQkgKi8KLQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKLQkJCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssIHBydGludG1zaywgMSk7Ci0JCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCi0JCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLCBkaXNjb25uaW50bXNrLCAxKTsKLQkJLyoKLQkJICogMi4gUHJvZ3JhbSB0aGUgVVNCQ19IQ0ZHIHJlZ2lzdGVyIHRvIHNlbGVjdCBmdWxsLXNwZWVkIGhvc3QKLQkJICogICAgb3IgaGlnaC1zcGVlZCBob3N0LgotCQkgKi8KLQkJewotCQkJdW5pb24gY3ZteF91c2JjeF9oY2ZnIHVzYmN4X2hjZmc7CisJLyoKKwkgKiAyLiBQcm9ncmFtIHRoZSBVU0JDX0hDRkcgcmVnaXN0ZXIgdG8gc2VsZWN0IGZ1bGwtc3BlZWQgaG9zdAorCSAqICAgIG9yIGhpZ2gtc3BlZWQgaG9zdC4KKwkgKi8KKwl1c2JjeF9oY2ZnLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hDRkcodXNiLT5pbmRleCkpOworCXVzYmN4X2hjZmcucy5mc2xzc3VwcCA9IDA7CisJdXNiY3hfaGNmZy5zLmZzbHNwY2xrc2VsID0gMDsKKwljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENGRyh1c2ItPmluZGV4KSwgdXNiY3hfaGNmZy51MzIpOwogCi0JCQl1c2JjeF9oY2ZnLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQkJCUNWTVhfVVNCQ1hfSENGRyh1c2ItPmluZGV4KSk7Ci0JCQl1c2JjeF9oY2ZnLnMuZnNsc3N1cHAgPSAwOwotCQkJdXNiY3hfaGNmZy5zLmZzbHNwY2xrc2VsID0gMDsKLQkJCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAotCQkJCQlDVk1YX1VTQkNYX0hDRkcodXNiLT5pbmRleCksCi0JCQkJCXVzYmN4X2hjZmcudTMyKTsKLQkJfQotCQkvKgotCQkgKiAzLiBQcm9ncmFtIHRoZSBwb3J0IHBvd2VyIGJpdCB0byBkcml2ZSBWQlVTIG9uIHRoZSBVU0IsCi0JCSAqICAgIFVTQkNfSFBSVFtQUlRQV1JdID0gMQotCQkgKi8KLQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwKLQkJCQl1bmlvbiBjdm14X3VzYmN4X2hwcnQsIHBydHB3ciwgMSk7CisJY3ZteF9maWZvX3NldHVwKHVzYik7CiAKLQkJLyoKLQkJICogU3RlcHMgNC0xNSBmcm9tIHRoZSBtYW51YWwgYXJlIGRvbmUgbGF0ZXIgaW4gdGhlIHBvcnQgZW5hYmxlCi0JCSAqLwotCX0KLQotCXJldHVybiAwOworCS8qCisJICogSWYgdGhlIGNvbnRyb2xsZXIgaXMgZ2V0dGluZyBwb3J0IGV2ZW50cyByaWdodCBhZnRlciB0aGUgcmVzZXQsIGl0CisJICogbWVhbnMgdGhlIGluaXRpYWxpemF0aW9uIGZhaWxlZC4gVHJ5IHJlc2V0dGluZyB0aGUgY29udHJvbGxlciBhZ2FpbgorCSAqIGluIHN1Y2ggY2FzZS4gVGhpcyBpcyBzZWVuIHRvIGhhcHBlbiBhZnRlciBjb2xkIGJvb3Qgb24gRFNSLTEwMDBOLgorCSAqLworCXVzYmNfZ2ludHN0cy51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQkJICAgICAgIENWTVhfVVNCQ1hfR0lOVFNUUyh1c2ItPmluZGV4KSk7CisJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dJTlRTVFModXNiLT5pbmRleCksCisJCQkgICAgIHVzYmNfZ2ludHN0cy51MzIpOworCWRldl9kYmcoZGV2LCAiZ2ludHN0cyBhZnRlciByZXNldDogMHgleFxuIiwgKGludCl1c2JjX2dpbnRzdHMudTMyKTsKKwlpZiAoIXVzYmNfZ2ludHN0cy5zLmRpc2Nvbm5pbnQgJiYgIXVzYmNfZ2ludHN0cy5zLnBydGludCkKKwkJcmV0dXJuIDA7CisJaWYgKHJldHJpZXMrKyA+PSA1KQorCQlyZXR1cm4gLUVBR0FJTjsKKwlkZXZfaW5mbyhkZXYsICJjb250cm9sbGVyIHJlc2V0IGZhaWxlZCAoZ2ludHN0cz0weCV4KSAtIHJldHJ5aW5nXG4iLAorCQkgKGludCl1c2JjX2dpbnRzdHMudTMyKTsKKwltc2xlZXAoNTApOworCWN2bXhfdXNiX3NodXRkb3duKHVzYik7CisJbXNsZWVwKDUwKTsKKwlnb3RvIHJldHJ5OwogfQogCi0KIC8qKgotICogU2h1dGRvd24gYSBVU0IgcG9ydCBhZnRlciBhIGNhbGwgdG8gY3ZteF91c2JfaW5pdGlhbGl6ZSgpLgotICogVGhlIHBvcnQgc2hvdWxkIGJlIGRpc2FibGVkIHdpdGggYWxsIHBpcGVzIGNsb3NlZCB3aGVuIHRoaXMKLSAqIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAqCi0gKiBAdXNiOiBVU0IgZGV2aWNlIHN0YXRlIHBvcHVsYXRlZCBieSBjdm14X3VzYl9pbml0aWFsaXplKCkuCi0gKgotICogUmV0dXJuczogMCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gKi8KLXN0YXRpYyBpbnQgY3ZteF91c2Jfc2h1dGRvd24oc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCi17Ci0JdW5pb24gY3ZteF91c2JueF9jbGtfY3RsIHVzYm5fY2xrX2N0bDsKLQotCS8qIE1ha2Ugc3VyZSBhbGwgcGlwZXMgYXJlIGNsb3NlZCAqLwotCWlmICghbGlzdF9lbXB0eSgmdXNiLT5pZGxlX3BpcGVzKSB8fAotCSAgICAhbGlzdF9lbXB0eSgmdXNiLT5hY3RpdmVfcGlwZXNbQ1ZNWF9VU0JfVFJBTlNGRVJfSVNPQ0hST05PVVNdKSB8fAotCSAgICAhbGlzdF9lbXB0eSgmdXNiLT5hY3RpdmVfcGlwZXNbQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBUXSkgfHwKLQkgICAgIWxpc3RfZW1wdHkoJnVzYi0+YWN0aXZlX3BpcGVzW0NWTVhfVVNCX1RSQU5TRkVSX0NPTlRST0xdKSB8fAotCSAgICAhbGlzdF9lbXB0eSgmdXNiLT5hY3RpdmVfcGlwZXNbQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMS10pKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JLyogRGlzYWJsZSB0aGUgY2xvY2tzIGFuZCBwdXQgdGhlbSBpbiBwb3dlciBvbiByZXNldCAqLwotCXVzYm5fY2xrX2N0bC51NjQgPSBfX2N2bXhfdXNiX3JlYWRfY3NyNjQodXNiLAotCQkJQ1ZNWF9VU0JOWF9DTEtfQ1RMKHVzYi0+aW5kZXgpKTsKLQl1c2JuX2Nsa19jdGwucy5lbmFibGUgPSAxOwotCXVzYm5fY2xrX2N0bC5zLnBvciA9IDE7Ci0JdXNibl9jbGtfY3RsLnMuaGNsa19yc3QgPSAxOwotCXVzYm5fY2xrX2N0bC5zLnByc3QgPSAwOwotCXVzYm5fY2xrX2N0bC5zLmhyc3QgPSAwOwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLCBDVk1YX1VTQk5YX0NMS19DVEwodXNiLT5pbmRleCksCi0JCQkgICAgICAgdXNibl9jbGtfY3RsLnU2NCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqCi0gKiBFbmFibGUgYSBVU0IgcG9ydC4gQWZ0ZXIgdGhpcyBjYWxsIHN1Y2NlZWRzLCB0aGUgVVNCIHBvcnQgaXMKKyAqIFJlc2V0IGEgVVNCIHBvcnQuIEFmdGVyIHRoaXMgY2FsbCBzdWNjZWVkcywgdGhlIFVTQiBwb3J0IGlzCiAgKiBvbmxpbmUgYW5kIHNlcnZpY2luZyByZXF1ZXN0cy4KICAqCiAgKiBAdXNiOiBVU0IgZGV2aWNlIHN0YXRlIHBvcHVsYXRlZCBieSBjdm14X3VzYl9pbml0aWFsaXplKCkuCi0gKgotICogUmV0dXJuczogMCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCiAgKi8KLXN0YXRpYyBpbnQgY3ZteF91c2JfZW5hYmxlKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiKQorc3RhdGljIHZvaWQgY3ZteF91c2JfcmVzZXRfcG9ydChzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYikKIHsKLQl1bmlvbiBjdm14X3VzYmN4X2dod2NmZzMgdXNiY3hfZ2h3Y2ZnMzsKLQotCXVzYi0+dXNiY3hfaHBydC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKLQotCS8qCi0JICogSWYgdGhlIHBvcnQgaXMgYWxyZWFkeSBlbmFibGVkIHRoZSBqdXN0IHJldHVybi4gV2UgZG9uJ3QgbmVlZCB0byBkbwotCSAqIGFueXRoaW5nCi0JICovCi0JaWYgKHVzYi0+dXNiY3hfaHBydC5zLnBydGVuYSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBJZiB0aGVyZSBpcyBub3RoaW5nIHBsdWdnZWQgaW50byB0aGUgcG9ydCB0aGVuIGZhaWwgaW1tZWRpYXRlbHkgKi8KLQlpZiAoIXVzYi0+dXNiY3hfaHBydC5zLnBydGNvbm5zdHMpCi0JCXJldHVybiAtRVRJTUVET1VUOworCXVzYi0+dXNiY3hfaHBydC51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQkJCSAgQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKIAogCS8qIFByb2dyYW0gdGhlIHBvcnQgcmVzZXQgYml0IHRvIHN0YXJ0IHRoZSByZXNldCBwcm9jZXNzICovCi0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgdW5pb24gY3ZteF91c2JjeF9ocHJ0LAorCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIGN2bXhfdXNiY3hfaHBydCwKIAkJCXBydHJzdCwgMSk7CiAKIAkvKgpAQCAtMTAzMiw3NSArOTg1LDE1IEBACiAJbWRlbGF5KDUwKTsKIAogCS8qIFByb2dyYW0gdGhlIHBvcnQgcmVzZXQgYml0IHRvIDAsIFVTQkNfSFBSVFtQUlRSU1RdID0gMCAqLwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksIHVuaW9uIGN2bXhfdXNiY3hfaHBydCwKKwlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCBjdm14X3VzYmN4X2hwcnQsCiAJCQlwcnRyc3QsIDApOwogCi0JLyogV2FpdCBmb3IgdGhlIFVTQkNfSFBSVFtQUlRFTkFdLiAqLwotCWlmIChDVk1YX1dBSVRfRk9SX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLAotCQkJCXVuaW9uIGN2bXhfdXNiY3hfaHBydCwgcHJ0ZW5hLCA9PSwgMSwgMTAwMDAwKSkKLQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0KIAkvKgogCSAqIFJlYWQgdGhlIHBvcnQgc3BlZWQgZmllbGQgdG8gZ2V0IHRoZSBlbnVtZXJhdGVkIHNwZWVkLAogCSAqIFVTQkNfSFBSVFtQUlRTUERdLgogCSAqLwotCXVzYi0+dXNiY3hfaHBydC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKLQl1c2JjeF9naHdjZmczLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQlDVk1YX1VTQkNYX0dIV0NGRzModXNiLT5pbmRleCkpOwotCi0JLyoKLQkgKiAxMy4gUHJvZ3JhbSB0aGUgVVNCQ19HUlhGU0laIHJlZ2lzdGVyIHRvIHNlbGVjdCB0aGUgc2l6ZSBvZiB0aGUKLQkgKiAgICAgcmVjZWl2ZSBGSUZPICgyNSUpLgotCSAqLwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSWEZTSVoodXNiLT5pbmRleCksCi0JCQl1bmlvbiBjdm14X3VzYmN4X2dyeGZzaXosIHJ4ZmRlcCwKLQkJCXVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gNCk7Ci0JLyoKLQkgKiAxNC4gUHJvZ3JhbSB0aGUgVVNCQ19HTlBUWEZTSVogcmVnaXN0ZXIgdG8gc2VsZWN0IHRoZSBzaXplIGFuZCB0aGUKLQkgKiAgICAgc3RhcnQgYWRkcmVzcyBvZiB0aGUgbm9uLSBwZXJpb2RpYyB0cmFuc21pdCBGSUZPIGZvciBub25wZXJpb2RpYwotCSAqICAgICB0cmFuc2FjdGlvbnMgKDUwJSkuCi0JICovCi0JewotCQl1bmlvbiBjdm14X3VzYmN4X2ducHR4ZnNpeiBzaXo7Ci0KLQkJc2l6LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQkJQ1ZNWF9VU0JDWF9HTlBUWEZTSVoodXNiLT5pbmRleCkpOwotCQlzaXoucy5ucHR4ZmRlcCA9IHVzYmN4X2dod2NmZzMucy5kZmlmb2RlcHRoIC8gMjsKLQkJc2l6LnMubnB0eGZzdGFkZHIgPSB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDQ7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dOUFRYRlNJWih1c2ItPmluZGV4KSwKLQkJCQkgICAgICAgc2l6LnUzMik7Ci0JfQotCS8qCi0JICogMTUuIFByb2dyYW0gdGhlIFVTQkNfSFBUWEZTSVogcmVnaXN0ZXIgdG8gc2VsZWN0IHRoZSBzaXplIGFuZCBzdGFydAotCSAqICAgICBhZGRyZXNzIG9mIHRoZSBwZXJpb2RpYyB0cmFuc21pdCBGSUZPIGZvciBwZXJpb2RpYyB0cmFuc2FjdGlvbnMKLQkgKiAgICAgKDI1JSkuCi0JICovCi0JewotCQl1bmlvbiBjdm14X3VzYmN4X2hwdHhmc2l6IHNpejsKLQotCQlzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCQlDVk1YX1VTQkNYX0hQVFhGU0laKHVzYi0+aW5kZXgpKTsKLQkJc2l6LnMucHR4ZnNpemUgPSB1c2JjeF9naHdjZmczLnMuZGZpZm9kZXB0aCAvIDQ7Ci0JCXNpei5zLnB0eGZzdGFkZHIgPSAzICogdXNiY3hfZ2h3Y2ZnMy5zLmRmaWZvZGVwdGggLyA0OwotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFRYRlNJWih1c2ItPmluZGV4KSwKLQkJCQkgICAgICAgc2l6LnUzMik7Ci0JfQotCS8qIEZsdXNoIGFsbCBGSUZPcyAqLwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCi0JCQl1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsIHR4Zm51bSwgMHgxMCk7Ci0JVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKLQkJCXVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwgdHhmZmxzaCwgMSk7Ci0JQ1ZNWF9XQUlUX0ZPUl9GSUVMRDMyKENWTVhfVVNCQ1hfR1JTVENUTCh1c2ItPmluZGV4KSwKLQkJCSAgICAgIHVuaW9uIGN2bXhfdXNiY3hfZ3JzdGN0bCwKLQkJCSAgICAgIHR4ZmZsc2gsID09LCAwLCAxMDApOwotCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCi0JCQl1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsIHJ4ZmZsc2gsIDEpOwotCUNWTVhfV0FJVF9GT1JfRklFTEQzMihDVk1YX1VTQkNYX0dSU1RDVEwodXNiLT5pbmRleCksCi0JCQkgICAgICB1bmlvbiBjdm14X3VzYmN4X2dyc3RjdGwsCi0JCQkgICAgICByeGZmbHNoLCA9PSwgMCwgMTAwKTsKLQotCXJldHVybiAwOworCXVzYi0+dXNiY3hfaHBydC51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQkJCSAgQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKIH0KIAogCkBAIC0xMTE3LDcgKzEwMTAsNyBAQAogc3RhdGljIGludCBjdm14X3VzYl9kaXNhYmxlKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiKQogewogCS8qIERpc2FibGUgdGhlIHBvcnQgKi8KLQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLCB1bmlvbiBjdm14X3VzYmN4X2hwcnQsCisJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwgY3ZteF91c2JjeF9ocHJ0LAogCQkJcHJ0ZW5hLCAxKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTExNDIsOCArMTAzNSw3IEBACiAKIAltZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHJlc3VsdCkpOwogCi0JdXNiY19ocHJ0LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQlDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOworCXVzYmNfaHBydC51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpKTsKIAlyZXN1bHQucG9ydF9lbmFibGVkID0gdXNiY19ocHJ0LnMucHJ0ZW5hOwogCXJlc3VsdC5wb3J0X292ZXJfY3VycmVudCA9IHVzYmNfaHBydC5zLnBydG92cmN1cnJhY3Q7CiAJcmVzdWx0LnBvcnRfcG93ZXJlZCA9IHVzYmNfaHBydC5zLnBydHB3cjsKQEAgLTEyMjMsNDEgKzExMTUsMTMgQEAKIHsKIAlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZTsKIAotCWlmICh1bmxpa2VseSgoZGV2aWNlX2FkZHIgPCAwKSB8fCAoZGV2aWNlX2FkZHIgPiBNQVhfVVNCX0FERFJFU1MpKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHVubGlrZWx5KChlbmRwb2ludF9udW0gPCAwKSB8fCAoZW5kcG9pbnRfbnVtID4gTUFYX1VTQl9FTkRQT0lOVCkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodW5saWtlbHkoZGV2aWNlX3NwZWVkID4gQ1ZNWF9VU0JfU1BFRURfTE9XKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHVubGlrZWx5KChtYXhfcGFja2V0IDw9IDApIHx8IChtYXhfcGFja2V0ID4gMTAyNCkpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodW5saWtlbHkodHJhbnNmZXJfdHlwZSA+IENWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCkpCi0JCXJldHVybiBOVUxMOwotCWlmICh1bmxpa2VseSgodHJhbnNmZXJfZGlyICE9IENWTVhfVVNCX0RJUkVDVElPTl9PVVQpICYmCi0JCSh0cmFuc2Zlcl9kaXIgIT0gQ1ZNWF9VU0JfRElSRUNUSU9OX0lOKSkpCi0JCXJldHVybiBOVUxMOwotCWlmICh1bmxpa2VseShpbnRlcnZhbCA8IDApKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodW5saWtlbHkoKHRyYW5zZmVyX3R5cGUgPT0gQ1ZNWF9VU0JfVFJBTlNGRVJfQ09OVFJPTCkgJiYgaW50ZXJ2YWwpKQotCQlyZXR1cm4gTlVMTDsKLQlpZiAodW5saWtlbHkobXVsdGlfY291bnQgPCAwKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHVubGlrZWx5KChkZXZpY2Vfc3BlZWQgIT0gQ1ZNWF9VU0JfU1BFRURfSElHSCkgJiYKLQkJKG11bHRpX2NvdW50ICE9IDApKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKHVubGlrZWx5KChodWJfZGV2aWNlX2FkZHIgPCAwKSB8fAotCQkoaHViX2RldmljZV9hZGRyID4gTUFYX1VTQl9BRERSRVNTKSkpCi0JCXJldHVybiBOVUxMOwotCWlmICh1bmxpa2VseSgoaHViX3BvcnQgPCAwKSB8fCAoaHViX3BvcnQgPiBNQVhfVVNCX0hVQl9QT1JUKSkpCi0JCXJldHVybiBOVUxMOwotCiAJcGlwZSA9IGt6YWxsb2Moc2l6ZW9mKCpwaXBlKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwaXBlKQogCQlyZXR1cm4gTlVMTDsKIAlpZiAoKGRldmljZV9zcGVlZCA9PSBDVk1YX1VTQl9TUEVFRF9ISUdIKSAmJgogCQkodHJhbnNmZXJfZGlyID09IENWTVhfVVNCX0RJUkVDVElPTl9PVVQpICYmCiAJCSh0cmFuc2Zlcl90eXBlID09IENWTVhfVVNCX1RSQU5TRkVSX0JVTEspKQotCQlwaXBlLT5mbGFncyB8PSBfX0NWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HOworCQlwaXBlLT5mbGFncyB8PSBDVk1YX1VTQl9QSVBFX0ZMQUdTX05FRURfUElORzsKIAlwaXBlLT5kZXZpY2VfYWRkciA9IGRldmljZV9hZGRyOwogCXBpcGUtPmVuZHBvaW50X251bSA9IGVuZHBvaW50X251bTsKIAlwaXBlLT5kZXZpY2Vfc3BlZWQgPSBkZXZpY2Vfc3BlZWQ7CkBAIC0xMjcyLDcgKzExMzYsNyBAQAogCSAqLwogCWlmICghaW50ZXJ2YWwpCiAJCWludGVydmFsID0gMTsKLQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKKwlpZiAoY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7CiAJCXBpcGUtPmludGVydmFsID0gaW50ZXJ2YWwqODsKIAkJLyogRm9yY2Ugc3RhcnQgc3BsaXRzIHRvIGJlIHNjaGVkdWxlIG9uIHVGcmFtZSAwICovCiAJCXBpcGUtPm5leHRfdHhfZnJhbWUgPSAoKHVzYi0+ZnJhbWVfbnVtYmVyKzcpJn43KSArCkBAIC0xMzA0LDcgKzExNjgsNyBAQAogICoKICAqIEB1c2I6CVVTQiBkZXZpY2Ugc3RhdGUgcG9wdWxhdGVkIGJ5IGN2bXhfdXNiX2luaXRpYWxpemUoKS4KICAqLwotc3RhdGljIHZvaWQgX19jdm14X3VzYl9wb2xsX3J4X2ZpZm8oc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCitzdGF0aWMgdm9pZCBjdm14X3VzYl9wb2xsX3J4X2ZpZm8oc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCiB7CiAJdW5pb24gY3ZteF91c2JjeF9ncnhzdHNwaCByeF9zdGF0dXM7CiAJaW50IGNoYW5uZWw7CkBAIC0xMzEyLDggKzExNzYsOCBAQAogCXVpbnQ2NF90IGFkZHJlc3M7CiAJdWludDMyX3QgKnB0cjsKIAotCXJ4X3N0YXR1cy51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJQ1ZNWF9VU0JDWF9HUlhTVFNQSCh1c2ItPmluZGV4KSk7CisJcnhfc3RhdHVzLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCQkgICAgQ1ZNWF9VU0JDWF9HUlhTVFNQSCh1c2ItPmluZGV4KSk7CiAJLyogT25seSByZWFkIGRhdGEgaWYgSU4gZGF0YSBpcyB0aGVyZSAqLwogCWlmIChyeF9zdGF0dXMucy5wa3RzdHMgIT0gMikKIAkJcmV0dXJuOwpAQCAtMTMyNywxOCArMTE5MSwxNyBAQAogCQlyZXR1cm47CiAKIAkvKiBHZXQgd2hlcmUgdGhlIERNQSBlbmdpbmUgd291bGQgaGF2ZSB3cml0dGVuIHRoaXMgZGF0YSAqLwotCWFkZHJlc3MgPSBfX2N2bXhfdXNiX3JlYWRfY3NyNjQodXNiLAotCQkJQ1ZNWF9VU0JOWF9ETUEwX0lOQl9DSE4wKHVzYi0+aW5kZXgpICsgY2hhbm5lbCo4KTsKKwlhZGRyZXNzID0gY3ZteF9yZWFkNjRfdWludDY0KENWTVhfVVNCTlhfRE1BMF9JTkJfQ0hOMCh1c2ItPmluZGV4KSArCisJCQkJICAgICBjaGFubmVsICogOCk7CiAKIAlwdHIgPSBjdm14X3BoeXNfdG9fcHRyKGFkZHJlc3MpOwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLAotCQkJICAgICAgIENWTVhfVVNCTlhfRE1BMF9JTkJfQ0hOMCh1c2ItPmluZGV4KSArIGNoYW5uZWwqOCwKLQkJCSAgICAgICBhZGRyZXNzICsgYnl0ZXMpOworCWN2bXhfd3JpdGU2NF91aW50NjQoQ1ZNWF9VU0JOWF9ETUEwX0lOQl9DSE4wKHVzYi0+aW5kZXgpICsgY2hhbm5lbCAqIDgsCisJCQkgICAgYWRkcmVzcyArIGJ5dGVzKTsKIAogCS8qIExvb3Agd3JpdGluZyB0aGUgRklGTyBkYXRhIGZvciB0aGlzIHBhY2tldCBpbnRvIG1lbW9yeSAqLwogCXdoaWxlIChieXRlcyA+IDApIHsKLQkJKnB0cisrID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCQlVU0JfRklGT19BRERSRVNTKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwkJKnB0cisrID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJCVVTQl9GSUZPX0FERFJFU1MoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCQlieXRlcyAtPSA0OwogCX0KIAlDVk1YX1NZTkNXOwpAQCAtMTM1Niw4ICsxMjE5LDggQEAKICAqIFJldHVybnM6IE5vbiB6ZXJvIGlmIHRoZSBoYXJkd2FyZSBmaWZvIHdhcyB0b28gc21hbGwgYW5kIG5lZWRzCiAgKgkgICAgdG8gYmUgc2VydmljZWQgYWdhaW4uCiAgKi8KLXN0YXRpYyBpbnQgX19jdm14X3VzYl9maWxsX3R4X2h3KHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCSBzdHJ1Y3QgY3ZteF91c2JfdHhfZmlmbyAqZmlmbywgaW50IGF2YWlsYWJsZSkKK3N0YXRpYyBpbnQgY3ZteF91c2JfZmlsbF90eF9odyhzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKKwkJCSAgICAgICBzdHJ1Y3QgY3ZteF91c2JfdHhfZmlmbyAqZmlmbywgaW50IGF2YWlsYWJsZSkKIHsKIAkvKgogCSAqIFdlJ3JlIGRvbmUgZWl0aGVyIHdoZW4gdGhlcmUgaXNuJ3QgYW55bW9yZSBzcGFjZSBvciB0aGUgc29mdHdhcmUgRklGTwpAQCAtMTQxMiwzOCArMTI3NSwzNCBAQAogICoKICAqIEB1c2I6CVVTQiBkZXZpY2Ugc3RhdGUgcG9wdWxhdGVkIGJ5IGN2bXhfdXNiX2luaXRpYWxpemUoKS4KICAqLwotc3RhdGljIHZvaWQgX19jdm14X3VzYl9wb2xsX3R4X2ZpZm8oc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCitzdGF0aWMgdm9pZCBjdm14X3VzYl9wb2xsX3R4X2ZpZm8oc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IpCiB7CiAJaWYgKHVzYi0+cGVyaW9kaWMuaGVhZCAhPSB1c2ItPnBlcmlvZGljLnRhaWwpIHsKIAkJdW5pb24gY3ZteF91c2JjeF9ocHR4c3RzIHR4X3N0YXR1czsKIAotCQl0eF9zdGF0dXMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCQlDVk1YX1VTQkNYX0hQVFhTVFModXNiLT5pbmRleCkpOwotCQlpZiAoX19jdm14X3VzYl9maWxsX3R4X2h3KHVzYiwgJnVzYi0+cGVyaW9kaWMsCi0JCQkJCSAgdHhfc3RhdHVzLnMucHR4ZnNwY2F2YWlsKSkKKwkJdHhfc3RhdHVzLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCQlDVk1YX1VTQkNYX0hQVFhTVFModXNiLT5pbmRleCkpOworCQlpZiAoY3ZteF91c2JfZmlsbF90eF9odyh1c2IsICZ1c2ItPnBlcmlvZGljLAorCQkJCQl0eF9zdGF0dXMucy5wdHhmc3BjYXZhaWwpKQogCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKLQkJCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLAotCQkJCQlwdHhmZW1wbXNrLCAxKTsKKwkJCQkJY3ZteF91c2JjeF9naW50bXNrLCBwdHhmZW1wbXNrLCAxKTsKIAkJZWxzZQogCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKLQkJCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLAotCQkJCQlwdHhmZW1wbXNrLCAwKTsKKwkJCQkJY3ZteF91c2JjeF9naW50bXNrLCBwdHhmZW1wbXNrLCAwKTsKIAl9CiAKIAlpZiAodXNiLT5ub25wZXJpb2RpYy5oZWFkICE9IHVzYi0+bm9ucGVyaW9kaWMudGFpbCkgewogCQl1bmlvbiBjdm14X3VzYmN4X2ducHR4c3RzIHR4X3N0YXR1czsKIAotCQl0eF9zdGF0dXMudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCQlDVk1YX1VTQkNYX0dOUFRYU1RTKHVzYi0+aW5kZXgpKTsKLQkJaWYgKF9fY3ZteF91c2JfZmlsbF90eF9odyh1c2IsICZ1c2ItPm5vbnBlcmlvZGljLAotCQkJCQkgIHR4X3N0YXR1cy5zLm5wdHhmc3BjYXZhaWwpKQorCQl0eF9zdGF0dXMudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJCUNWTVhfVVNCQ1hfR05QVFhTVFModXNiLT5pbmRleCkpOworCQlpZiAoY3ZteF91c2JfZmlsbF90eF9odyh1c2IsICZ1c2ItPm5vbnBlcmlvZGljLAorCQkJCQl0eF9zdGF0dXMucy5ucHR4ZnNwY2F2YWlsKSkKIAkJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCi0JCQkJCXVuaW9uIGN2bXhfdXNiY3hfZ2ludG1zaywKLQkJCQkJbnB0eGZlbXBtc2ssIDEpOworCQkJCQljdm14X3VzYmN4X2dpbnRtc2ssIG5wdHhmZW1wbXNrLCAxKTsKIAkJZWxzZQogCQkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfR0lOVE1TSyh1c2ItPmluZGV4KSwKLQkJCQkJdW5pb24gY3ZteF91c2JjeF9naW50bXNrLAotCQkJCQlucHR4ZmVtcG1zaywgMCk7CisJCQkJCWN2bXhfdXNiY3hfZ2ludG1zaywgbnB0eGZlbXBtc2ssIDApOwogCX0KIH0KIApAQCAtMTQ1NCw3ICsxMzEzLDcgQEAKICAqIEB1c2I6CSAgVVNCIGRldmljZSBzdGF0ZSBwb3B1bGF0ZWQgYnkgY3ZteF91c2JfaW5pdGlhbGl6ZSgpLgogICogQGNoYW5uZWw6CSAgQ2hhbm5lbCBudW1iZXIgdG8gZ2V0IHBhY2tldCBmcm9tCiAgKi8KLXN0YXRpYyB2b2lkIF9fY3ZteF91c2JfZmlsbF90eF9maWZvKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLCBpbnQgY2hhbm5lbCkKK3N0YXRpYyB2b2lkIGN2bXhfdXNiX2ZpbGxfdHhfZmlmbyhzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwgaW50IGNoYW5uZWwpCiB7CiAJdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4IGhjY2hhcjsKIAl1bmlvbiBjdm14X3VzYmN4X2hjc3BsdHggdXNiY19oY3NwbHQ7CkBAIC0xNDYyLDE0ICsxMzIxLDE0IEBACiAJc3RydWN0IGN2bXhfdXNiX3R4X2ZpZm8gKmZpZm87CiAKIAkvKiBXZSBvbmx5IG5lZWQgdG8gZmlsbCBkYXRhIG9uIG91dGJvdW5kIGNoYW5uZWxzICovCi0JaGNjaGFyLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJaGNjaGFyLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAogCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAlpZiAoaGNjaGFyLnMuZXBkaXIgIT0gQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkKIAkJcmV0dXJuOwogCiAJLyogT1VUIFNwbGl0cyBvbmx5IGhhdmUgZGF0YSBvbiB0aGUgc3RhcnQgYW5kIG5vdCB0aGUgY29tcGxldGUgKi8KLQl1c2JjX2hjc3BsdC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAotCQkJQ1ZNWF9VU0JDWF9IQ1NQTFRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKKwl1c2JjX2hjc3BsdC51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOwogCWlmICh1c2JjX2hjc3BsdC5zLnNwbHRlbmEgJiYgdXNiY19oY3NwbHQucy5jb21wc3BsdCkKIAkJcmV0dXJuOwogCkBAIC0xNDc3LDggKzEzMzYsOCBAQAogCSAqIEZpbmQgb3V0IGhvdyBtYW55IGJ5dGVzIHdlIG5lZWQgdG8gZmlsbCBhbmQgY29udmVydCBpdCBpbnRvIDMyYml0CiAJICogd29yZHMuCiAJICovCi0JdXNiY19oY3RzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCUNWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJdXNiY19oY3RzaXoudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAlpZiAoIXVzYmNfaGN0c2l6LnMueGZlcnNpemUpCiAJCXJldHVybjsKIApAQCAtMTQ4OSwyOCArMTM0OCwyOCBAQAogCQlmaWZvID0gJnVzYi0+bm9ucGVyaW9kaWM7CiAKIAlmaWZvLT5lbnRyeVtmaWZvLT5oZWFkXS5jaGFubmVsID0gY2hhbm5lbDsKLQlmaWZvLT5lbnRyeVtmaWZvLT5oZWFkXS5hZGRyZXNzID0gX19jdm14X3VzYl9yZWFkX2NzcjY0KHVzYiwKLQkJCUNWTVhfVVNCTlhfRE1BMF9PVVRCX0NITjAodXNiLT5pbmRleCkgKyBjaGFubmVsKjgpOworCWZpZm8tPmVudHJ5W2ZpZm8tPmhlYWRdLmFkZHJlc3MgPQorCQljdm14X3JlYWQ2NF91aW50NjQoQ1ZNWF9VU0JOWF9ETUEwX09VVEJfQ0hOMCh1c2ItPmluZGV4KSArCisJCQkJICAgY2hhbm5lbCAqIDgpOwogCWZpZm8tPmVudHJ5W2ZpZm8tPmhlYWRdLnNpemUgPSAodXNiY19oY3RzaXoucy54ZmVyc2l6ZSszKT4+MjsKIAlmaWZvLT5oZWFkKys7CiAJaWYgKGZpZm8tPmhlYWQgPiBNQVhfQ0hBTk5FTFMpCiAJCWZpZm8tPmhlYWQgPSAwOwogCi0JX19jdm14X3VzYl9wb2xsX3R4X2ZpZm8odXNiKTsKKwljdm14X3VzYl9wb2xsX3R4X2ZpZm8odXNiKTsKIH0KIAogLyoqCiAgKiBQZXJmb3JtIGNoYW5uZWwgc3BlY2lmaWMgc2V0dXAgZm9yIENvbnRyb2wgdHJhbnNhY3Rpb25zLiBBbGwKLSAqIHRoZSBnZW5lcmljIHN0dWZmIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gZG9uZSBpbgotICogX19jdm14X3VzYl9zdGFydF9jaGFubmVsKCkKKyAqIHRoZSBnZW5lcmljIHN0dWZmIHdpbGwgYWxyZWFkeSBoYXZlIGJlZW4gZG9uZSBpbiBjdm14X3VzYl9zdGFydF9jaGFubmVsKCkuCiAgKgogICogQHVzYjoJICBVU0IgZGV2aWNlIHN0YXRlIHBvcHVsYXRlZCBieSBjdm14X3VzYl9pbml0aWFsaXplKCkuCiAgKiBAY2hhbm5lbDoJICBDaGFubmVsIHRvIHNldHVwCiAgKiBAcGlwZToJICBQaXBlIGZvciBjb250cm9sIHRyYW5zYWN0aW9uCiAgKi8KLXN0YXRpYyB2b2lkIF9fY3ZteF91c2Jfc3RhcnRfY2hhbm5lbF9jb250cm9sKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAotCQkJCQkgICAgIGludCBjaGFubmVsLAotCQkJCQkgICAgIHN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlKQorc3RhdGljIHZvaWQgY3ZteF91c2Jfc3RhcnRfY2hhbm5lbF9jb250cm9sKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAorCQkJCQkgICBpbnQgY2hhbm5lbCwKKwkJCQkJICAgc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUpCiB7CiAJc3RydWN0IG9jdGVvbl9oY2QgKnByaXYgPSBjdm14X3VzYl90b19vY3Rlb24odXNiKTsKIAlzdHJ1Y3QgdXNiX2hjZCAqaGNkID0gb2N0ZW9uX3RvX2hjZChwcml2KTsKQEAgLTE1MjUsOCArMTM4NCw4IEBACiAJaW50IHBhY2tldHNfdG9fdHJhbnNmZXI7CiAJdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4IHVzYmNfaGN0c2l6OwogCi0JdXNiY19oY3RzaXoudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCUNWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJdXNiY19oY3RzaXoudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAogCXN3aXRjaCAodHJhbnNhY3Rpb24tPnN0YWdlKSB7CiAJY2FzZSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTDoKQEAgLTE1MzgsNzIgKzEzOTcsNzIgQEAKIAkJYnl0ZXNfdG9fdHJhbnNmZXIgPSBzaXplb2YoKmhlYWRlcik7CiAJCS8qIEFsbCBDb250cm9sIG9wZXJhdGlvbnMgc3RhcnQgd2l0aCBhIHNldHVwIGdvaW5nIE9VVCAqLwogCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAotCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgZXBkaXIsCisJCQkJY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKIAkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKTsKIAkJLyoKIAkJICogU2V0dXAgc2VuZCB0aGUgY29udHJvbCBoZWFkZXIgaW5zdGVhZCBvZiB0aGUgYnVmZmVyIGRhdGEuIFRoZQogCQkgKiBidWZmZXIgZGF0YSB3aWxsIGJlIHVzZWQgaW4gdGhlIG5leHQgc3RhZ2UKIAkJICovCi0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLAotCQkJQ1ZNWF9VU0JOWF9ETUEwX09VVEJfQ0hOMCh1c2ItPmluZGV4KSArIGNoYW5uZWwqOCwKLQkJCXRyYW5zYWN0aW9uLT5jb250cm9sX2hlYWRlcik7CisJCWN2bXhfd3JpdGU2NF91aW50NjQoQ1ZNWF9VU0JOWF9ETUEwX09VVEJfQ0hOMCh1c2ItPmluZGV4KSArCisJCQkJCWNoYW5uZWwgKiA4LAorCQkJCSAgICB0cmFuc2FjdGlvbi0+Y29udHJvbF9oZWFkZXIpOwogCQlicmVhazsKIAljYXNlIENWTVhfVVNCX1NUQUdFX1NFVFVQX1NQTElUX0NPTVBMRVRFOgogCQl1c2JjX2hjdHNpei5zLnBpZCA9IDM7IC8qIFNldHVwICovCiAJCWJ5dGVzX3RvX3RyYW5zZmVyID0gMDsKIAkJLyogQWxsIENvbnRyb2wgb3BlcmF0aW9ucyBzdGFydCB3aXRoIGEgc2V0dXAgZ29pbmcgT1VUICovCiAJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCi0JCQkJdW5pb24gY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKKwkJCQljdm14X3VzYmN4X2hjY2hhcngsIGVwZGlyLAogCQkJCUNWTVhfVVNCX0RJUkVDVElPTl9PVVQpOwogCiAJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksCi0JCQkJdW5pb24gY3ZteF91c2JjeF9oY3NwbHR4LCBjb21wc3BsdCwgMSk7CisJCQkJY3ZteF91c2JjeF9oY3NwbHR4LCBjb21wc3BsdCwgMSk7CiAJCWJyZWFrOwogCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfREFUQToKLQkJdXNiY19oY3RzaXoucy5waWQgPSBfX2N2bXhfdXNiX2dldF9kYXRhX3BpZChwaXBlKTsKLQkJaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7CisJCXVzYmNfaGN0c2l6LnMucGlkID0gY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHBpcGUpOworCQlpZiAoY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7CiAJCQlpZiAoaGVhZGVyLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKQogCQkJCWJ5dGVzX3RvX3RyYW5zZmVyID0gMDsKIAkJCWVsc2UgaWYgKGJ5dGVzX3RvX3RyYW5zZmVyID4gcGlwZS0+bWF4X3BhY2tldCkKIAkJCQlieXRlc190b190cmFuc2ZlciA9IHBpcGUtPm1heF9wYWNrZXQ7CiAJCX0KIAkJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwKLQkJCQl1bmlvbiBjdm14X3VzYmN4X2hjY2hhcngsIGVwZGlyLAorCQkJCWN2bXhfdXNiY3hfaGNjaGFyeCwgZXBkaXIsCiAJCQkJKChoZWFkZXItPmJSZXF1ZXN0VHlwZSAmIFVTQl9ESVJfSU4pID8KIAkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX0lOIDoKIAkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkpOwogCQlicmVhazsKIAljYXNlIENWTVhfVVNCX1NUQUdFX0RBVEFfU1BMSVRfQ09NUExFVEU6Ci0JCXVzYmNfaGN0c2l6LnMucGlkID0gX19jdm14X3VzYl9nZXRfZGF0YV9waWQocGlwZSk7CisJCXVzYmNfaGN0c2l6LnMucGlkID0gY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHBpcGUpOwogCQlpZiAoIShoZWFkZXItPmJSZXF1ZXN0VHlwZSAmIFVTQl9ESVJfSU4pKQogCQkJYnl0ZXNfdG9fdHJhbnNmZXIgPSAwOwogCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAotCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgZXBkaXIsCisJCQkJY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKIAkJCQkoKGhlYWRlci0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgPwogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fSU4gOgogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKSk7CiAJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksCi0JCQkJdW5pb24gY3ZteF91c2JjeF9oY3NwbHR4LCBjb21wc3BsdCwgMSk7CisJCQkJY3ZteF91c2JjeF9oY3NwbHR4LCBjb21wc3BsdCwgMSk7CiAJCWJyZWFrOwogCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTOgotCQl1c2JjX2hjdHNpei5zLnBpZCA9IF9fY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHBpcGUpOworCQl1c2JjX2hjdHNpei5zLnBpZCA9IGN2bXhfdXNiX2dldF9kYXRhX3BpZChwaXBlKTsKIAkJYnl0ZXNfdG9fdHJhbnNmZXIgPSAwOwogCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAotCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgZXBkaXIsCisJCQkJY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKIAkJCQkoKGhlYWRlci0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgPwogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fT1VUIDoKIAkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX0lOKSk7CiAJCWJyZWFrOwogCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTX1NQTElUX0NPTVBMRVRFOgotCQl1c2JjX2hjdHNpei5zLnBpZCA9IF9fY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHBpcGUpOworCQl1c2JjX2hjdHNpei5zLnBpZCA9IGN2bXhfdXNiX2dldF9kYXRhX3BpZChwaXBlKTsKIAkJYnl0ZXNfdG9fdHJhbnNmZXIgPSAwOwogCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAotCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgZXBkaXIsCisJCQkJY3ZteF91c2JjeF9oY2NoYXJ4LCBlcGRpciwKIAkJCQkoKGhlYWRlci0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgPwogCQkJCQlDVk1YX1VTQl9ESVJFQ1RJT05fT1VUIDoKIAkJCQkJQ1ZNWF9VU0JfRElSRUNUSU9OX0lOKSk7CiAJCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0hDU1BMVFgoY2hhbm5lbCwgdXNiLT5pbmRleCksCi0JCQkJdW5pb24gY3ZteF91c2JjeF9oY3NwbHR4LCBjb21wc3BsdCwgMSk7CisJCQkJY3ZteF91c2JjeF9oY3NwbHR4LCBjb21wc3BsdCwgMSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTY0Niw4ICsxNTA1LDggQEAKIAl1c2JjX2hjdHNpei5zLnhmZXJzaXplID0gYnl0ZXNfdG9fdHJhbnNmZXI7CiAJdXNiY19oY3RzaXoucy5wa3RjbnQgPSBwYWNrZXRzX3RvX3RyYW5zZmVyOwogCi0JX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSwKLQkJCSAgICAgICB1c2JjX2hjdHNpei51MzIpOworCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJICAgICB1c2JjX2hjdHNpei51MzIpOwogfQogCiAKQEAgLTE2NTgsOSArMTUxNyw4IEBACiAgKiBAY2hhbm5lbDoJICBDaGFubmVsIHRvIHNldHVwCiAgKiBAcGlwZToJICBQaXBlIHRvIHN0YXJ0CiAgKi8KLXN0YXRpYyB2b2lkIF9fY3ZteF91c2Jfc3RhcnRfY2hhbm5lbChzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQkgICAgIGludCBjaGFubmVsLAotCQkJCSAgICAgc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUpCitzdGF0aWMgdm9pZCBjdm14X3VzYl9zdGFydF9jaGFubmVsKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLCBpbnQgY2hhbm5lbCwKKwkJCQkgICBzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSkKIHsKIAlzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uID0KIAkJbGlzdF9maXJzdF9lbnRyeSgmcGlwZS0+dHJhbnNhY3Rpb25zLCB0eXBlb2YoKnRyYW5zYWN0aW9uKSwKQEAgLTE2NzIsNyArMTUzMCw3IEBACiAJLyogQXR0YWNoIHRoZSBjaGFubmVsIHRvIHRoZSBwaXBlICovCiAJdXNiLT5waXBlX2Zvcl9jaGFubmVsW2NoYW5uZWxdID0gcGlwZTsKIAlwaXBlLT5jaGFubmVsID0gY2hhbm5lbDsKLQlwaXBlLT5mbGFncyB8PSBfX0NWTVhfVVNCX1BJUEVfRkxBR1NfU0NIRURVTEVEOworCXBpcGUtPmZsYWdzIHw9IENWTVhfVVNCX1BJUEVfRkxBR1NfU0NIRURVTEVEOwogCiAJLyogTWFyayB0aGlzIGNoYW5uZWwgYXMgaW4gdXNlICovCiAJdXNiLT5pZGxlX2hhcmR3YXJlX2NoYW5uZWxzICY9IH4oMTw8Y2hhbm5lbCk7CkBAIC0xNjg0LDEyICsxNTQyLDEyIEBACiAJCXVuaW9uIGN2bXhfdXNiY3hfaGFpbnRtc2sgdXNiY19oYWludG1zazsKIAogCQkvKiBDbGVhciBhbGwgY2hhbm5lbCBzdGF0dXMgYml0cyAqLwotCQl1c2JjX2hjaW50LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQkJQ1ZNWF9VU0JDWF9IQ0lOVFgoY2hhbm5lbCwgdXNiLT5pbmRleCkpOworCQl1c2JjX2hjaW50LnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQkJCQlDVk1YX1VTQkNYX0hDSU5UWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CiAKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCi0JCQkJICAgICAgIENWTVhfVVNCQ1hfSENJTlRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAotCQkJCSAgICAgICB1c2JjX2hjaW50LnUzMik7CisJCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQkgICAgIENWTVhfVVNCQ1hfSENJTlRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJCSAgICAgdXNiY19oY2ludC51MzIpOwogCiAJCXVzYmNfaGNpbnRtc2sudTMyID0gMDsKIAkJdXNiY19oY2ludG1zay5zLmNoaGx0ZG1zayA9IDE7CkBAIC0xNzAyLDcgKzE1NjAsNyBAQAogCQkJdXNiY19oY2ludG1zay5zLmZybW92cnVubXNrID0gMTsKIAkJCXVzYmNfaGNpbnRtc2sucy5iYmxlcnJtc2sgPSAxOwogCQkJdXNiY19oY2ludG1zay5zLnhhY3RlcnJtc2sgPSAxOwotCQkJaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7CisJCQlpZiAoY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7CiAJCQkJLyoKIAkJCQkgKiBTcGxpdHMgZG9uJ3QgZ2VuZXJhdGUgeGZlcmNvbXBsLCBzbyB3ZSBuZWVkCiAJCQkJICogQUNLIGFuZCBOWUVULgpAQCAtMTcxNCwyMSArMTU3MiwyMSBAQAogCQkJdXNiY19oY2ludG1zay5zLnN0YWxsbXNrID0gMTsKIAkJCXVzYmNfaGNpbnRtc2sucy54ZmVyY29tcGxtc2sgPSAxOwogCQl9Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCiAJCQkJQ1ZNWF9VU0JDWF9IQ0lOVE1TS1goY2hhbm5lbCwgdXNiLT5pbmRleCksCiAJCQkJdXNiY19oY2ludG1zay51MzIpOwogCiAJCS8qIEVuYWJsZSB0aGUgY2hhbm5lbCBpbnRlcnJ1cHQgdG8gcHJvcGFnYXRlICovCi0JCXVzYmNfaGFpbnRtc2sudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJdXNiY19oYWludG1zay51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKIAkJCQkJQ1ZNWF9VU0JDWF9IQUlOVE1TSyh1c2ItPmluZGV4KSk7CiAJCXVzYmNfaGFpbnRtc2sucy5oYWludG1zayB8PSAxPDxjaGFubmVsOwotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKLQkJCQkJQ1ZNWF9VU0JDWF9IQUlOVE1TSyh1c2ItPmluZGV4KSwKLQkJCQkJdXNiY19oYWludG1zay51MzIpOworCQljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSEFJTlRNU0sodXNiLT5pbmRleCksCisJCQkJICAgICB1c2JjX2hhaW50bXNrLnUzMik7CiAJfQogCi0JLyogU2V0dXAgdGhlIGxvY2F0aW9ucyB0aGUgRE1BIGVuZ2luZXMgdXNlICAqLworCS8qIFNldHVwIHRoZSBsb2NhdGlvbiB0aGUgRE1BIGVuZ2luZSB1c2VzLiAqLwogCXsKKwkJdWludDY0X3QgcmVnOwogCQl1aW50NjRfdCBkbWFfYWRkcmVzcyA9IHRyYW5zYWN0aW9uLT5idWZmZXIgKwogCQkJCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOwogCkBAIC0xNzM3LDEzICsxNTk1LDExIEBACiAJCQkJCXRyYW5zYWN0aW9uLT5pc29fcGFja2V0c1swXS5vZmZzZXQgKwogCQkJCQl0cmFuc2FjdGlvbi0+YWN0dWFsX2J5dGVzOwogCi0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyNjQodXNiLAotCQkJQ1ZNWF9VU0JOWF9ETUEwX09VVEJfQ0hOMCh1c2ItPmluZGV4KSArIGNoYW5uZWwqOCwKLQkJCWRtYV9hZGRyZXNzKTsKLQotCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjY0KHVzYiwKLQkJCUNWTVhfVVNCTlhfRE1BMF9JTkJfQ0hOMCh1c2ItPmluZGV4KSArIGNoYW5uZWwqOCwKLQkJCWRtYV9hZGRyZXNzKTsKKwkJaWYgKHBpcGUtPnRyYW5zZmVyX2RpciA9PSBDVk1YX1VTQl9ESVJFQ1RJT05fT1VUKQorCQkJcmVnID0gQ1ZNWF9VU0JOWF9ETUEwX09VVEJfQ0hOMCh1c2ItPmluZGV4KTsKKwkJZWxzZQorCQkJcmVnID0gQ1ZNWF9VU0JOWF9ETUEwX0lOQl9DSE4wKHVzYi0+aW5kZXgpOworCQljdm14X3dyaXRlNjRfdWludDY0KHJlZyArIGNoYW5uZWwgKiA4LCBkbWFfYWRkcmVzcyk7CiAJfQogCiAJLyogU2V0dXAgYm90aCB0aGUgc2l6ZSBvZiB0aGUgdHJhbnNmZXIgYW5kIHRoZSBTUExJVCBjaGFyYWN0ZXJpc3RpY3MgKi8KQEAgLTE3NjcsNyArMTYyMyw3IEBACiAJCSAqIFdlIG5lZWQgdG8gZG8gc3BsaXQgdHJhbnNhY3Rpb25zIHdoZW4gd2UgYXJlIHRhbGtpbmcgdG8gbm9uCiAJCSAqIGhpZ2ggc3BlZWQgZGV2aWNlcyB0aGF0IGFyZSBiZWhpbmQgYSBoaWdoIHNwZWVkIGh1YgogCQkgKi8KLQkJaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7CisJCWlmIChjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKIAkJCS8qCiAJCQkgKiBPbiB0aGUgc3RhcnQgc3BsaXQgcGhhc2UgKHN0YWdlIGlzIGV2ZW4pIHJlY29yZCB0aGUKIAkJCSAqIGZyYW1lIG51bWJlciB3ZSB3aWxsIG5lZWQgdG8gc2VuZCB0aGUgc3BsaXQgY29tcGxldGUuCkBAIC0xODk4LDE4ICsxNzU0LDE5IEBACiAJCXVzYmNfaGN0c2l6LnMucGt0Y250ID0gcGFja2V0c190b190cmFuc2ZlcjsKIAogCQkvKiBVcGRhdGUgdGhlIERBVEEwL0RBVEExIHRvZ2dsZSAqLwotCQl1c2JjX2hjdHNpei5zLnBpZCA9IF9fY3ZteF91c2JfZ2V0X2RhdGFfcGlkKHBpcGUpOworCQl1c2JjX2hjdHNpei5zLnBpZCA9IGN2bXhfdXNiX2dldF9kYXRhX3BpZChwaXBlKTsKIAkJLyoKIAkJICogSGlnaCBzcGVlZCBwaXBlcyBtYXkgbmVlZCBhIGhhcmR3YXJlIHBpbmcgYmVmb3JlIHRoZXkgc3RhcnQKIAkJICovCi0JCWlmIChwaXBlLT5mbGFncyAmIF9fQ1ZNWF9VU0JfUElQRV9GTEFHU19ORUVEX1BJTkcpCisJCWlmIChwaXBlLT5mbGFncyAmIENWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HKQogCQkJdXNiY19oY3RzaXoucy5kb3BuZyA9IDE7CiAKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCi0JCQkJICAgICAgIENWTVhfVVNCQ1hfSENTUExUWChjaGFubmVsLCB1c2ItPmluZGV4KSwKLQkJCQkgICAgICAgdXNiY19oY3NwbHQudTMyKTsKLQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLAotCQkJCQl1c2ItPmluZGV4KSwgdXNiY19oY3RzaXoudTMyKTsKKwkJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCSAgICAgQ1ZNWF9VU0JDWF9IQ1NQTFRYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJCSAgICAgdXNiY19oY3NwbHQudTMyKTsKKwkJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAorCQkJCSAgICAgQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAorCQkJCSAgICAgdXNiY19oY3RzaXoudTMyKTsKIAl9CiAKIAkvKiBTZXR1cCB0aGUgSG9zdCBDaGFubmVsIENoYXJhY3RlcmlzdGljcyBSZWdpc3RlciAqLwpAQCAtMTkyOCw3ICsxNzg1LDcgQEAKIAkJICogaW1tZWRpYXRlIHJldHJpZXMgb2YgZmFpbHVyZS4gVGhlc2UgcmV0cmllcyBoYXBwZW4gdG9vCiAJCSAqIHF1aWNrbHksIHNvIHdlIGRpc2FibGUgdGhlc2UgZW50aXJlbHkgZm9yIHNwbGl0cwogCQkgKi8KLQkJaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKQorCQlpZiAoY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKQogCQkJdXNiY19oY2NoYXIucy5lYyA9IDE7CiAJCWVsc2UgaWYgKHBpcGUtPm11bHRpX2NvdW50IDwgMSkKIAkJCXVzYmNfaGNjaGFyLnMuZWMgPSAxOwpAQCAtMTk0NSwyMSArMTgwMiwyMSBAQAogCQl1c2JjX2hjY2hhci5zLmVwZGlyID0gcGlwZS0+dHJhbnNmZXJfZGlyOwogCQl1c2JjX2hjY2hhci5zLmVwbnVtID0gcGlwZS0+ZW5kcG9pbnRfbnVtOwogCQl1c2JjX2hjY2hhci5zLm1wcyA9IHBpcGUtPm1heF9wYWNrZXQ7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAotCQkJCSAgICAgICBDVk1YX1VTQkNYX0hDQ0hBUlgoY2hhbm5lbCwgdXNiLT5pbmRleCksCi0JCQkJICAgICAgIHVzYmNfaGNjaGFyLnUzMik7CisJCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCQkgICAgIENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwKKwkJCQkgICAgIHVzYmNfaGNjaGFyLnUzMik7CiAJfQogCiAJLyogRG8gdHJhbnNhY3Rpb24gdHlwZSBzcGVjaWZpYyBmaXh1cHMgYXMgbmVlZGVkICovCiAJc3dpdGNoICh0cmFuc2FjdGlvbi0+dHlwZSkgewogCWNhc2UgQ1ZNWF9VU0JfVFJBTlNGRVJfQ09OVFJPTDoKLQkJX19jdm14X3VzYl9zdGFydF9jaGFubmVsX2NvbnRyb2wodXNiLCBjaGFubmVsLCBwaXBlKTsKKwkJY3ZteF91c2Jfc3RhcnRfY2hhbm5lbF9jb250cm9sKHVzYiwgY2hhbm5lbCwgcGlwZSk7CiAJCWJyZWFrOwogCWNhc2UgQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMSzoKIAljYXNlIENWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVDoKIAkJYnJlYWs7CiAJY2FzZSBDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VUzoKLQkJaWYgKCFfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkgeworCQlpZiAoIWN2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkgewogCQkJLyoKIAkJCSAqIElTTyB0cmFuc2FjdGlvbnMgcmVxdWlyZSBkaWZmZXJlbnQgUElEcyBkZXBlbmRpbmcgb24KIAkJCSAqIGRpcmVjdGlvbiBhbmQgaG93IG1hbnkgcGFja2V0cyBhcmUgbmVlZGVkCkBAIC0xOTY5LDMyICsxODI2LDMwIEBACiAJCQkJCVVTQl9TRVRfRklFTEQzMigKIAkJCQkJCUNWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLAogCQkJCQkJCQkgICB1c2ItPmluZGV4KSwKLQkJCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGN0c2l6eCwKLQkJCQkJCXBpZCwgMCk7CisJCQkJCQljdm14X3VzYmN4X2hjdHNpengsIHBpZCwgMCk7CiAJCQkJZWxzZSAvKiBOZWVkIE1EQVRBICovCiAJCQkJCVVTQl9TRVRfRklFTEQzMigKIAkJCQkJCUNWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLAogCQkJCQkJCQkgICB1c2ItPmluZGV4KSwKLQkJCQkJCXVuaW9uIGN2bXhfdXNiY3hfaGN0c2l6eCwKLQkJCQkJCXBpZCwgMyk7CisJCQkJCQljdm14X3VzYmN4X2hjdHNpengsIHBpZCwgMyk7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CiAJfQogCXsKIAkJdW5pb24gY3ZteF91c2JjeF9oY3RzaXp4IHVzYmNfaGN0c2l6ID0gey51MzIgPQotCQkJX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCWN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAogCQkJCUNWTVhfVVNCQ1hfSENUU0laWChjaGFubmVsLCB1c2ItPmluZGV4KSl9OwogCQl0cmFuc2FjdGlvbi0+eGZlcnNpemUgPSB1c2JjX2hjdHNpei5zLnhmZXJzaXplOwogCQl0cmFuc2FjdGlvbi0+cGt0Y250ID0gdXNiY19oY3RzaXoucy5wa3RjbnQ7CiAJfQogCS8qIFJlbWViZXIgd2hlbiB3ZSBzdGFydCBhIHNwbGl0IHRyYW5zYWN0aW9uICovCi0JaWYgKF9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKQorCWlmIChjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpCiAJCXVzYi0+YWN0aXZlX3NwbGl0ID0gdHJhbnNhY3Rpb247CiAJVVNCX1NFVF9GSUVMRDMyKENWTVhfVVNCQ1hfSENDSEFSWChjaGFubmVsLCB1c2ItPmluZGV4KSwKLQkJCXVuaW9uIGN2bXhfdXNiY3hfaGNjaGFyeCwgY2hlbmEsIDEpOworCQkJY3ZteF91c2JjeF9oY2NoYXJ4LCBjaGVuYSwgMSk7CiAJaWYgKHVzYi0+aW5pdF9mbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKQotCQlfX2N2bXhfdXNiX2ZpbGxfdHhfZmlmbyh1c2IsIGNoYW5uZWwpOworCQljdm14X3VzYl9maWxsX3R4X2ZpZm8odXNiLCBjaGFubmVsKTsKIH0KIAogCkBAIC0yMDA3LDcgKzE4NjIsNyBAQAogICoKICAqIFJldHVybnM6IFBpcGUgb3IgTlVMTCBpZiBub25lIGFyZSByZWFkeQogICovCi1zdGF0aWMgc3RydWN0IGN2bXhfdXNiX3BpcGUgKl9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKAorc3RhdGljIHN0cnVjdCBjdm14X3VzYl9waXBlICpjdm14X3VzYl9maW5kX3JlYWR5X3BpcGUoCiAJCXN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLAogCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAogCQl1aW50NjRfdCBjdXJyZW50X2ZyYW1lKQpAQCAtMjAxOCw3ICsxODczLDcgQEAKIAkJc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICp0ID0KIAkJCWxpc3RfZmlyc3RfZW50cnkoJnBpcGUtPnRyYW5zYWN0aW9ucywgdHlwZW9mKCp0KSwKIAkJCQkJIG5vZGUpOwotCQlpZiAoIShwaXBlLT5mbGFncyAmIF9fQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQpICYmIHQgJiYKKwkJaWYgKCEocGlwZS0+ZmxhZ3MgJiBDVk1YX1VTQl9QSVBFX0ZMQUdTX1NDSEVEVUxFRCkgJiYgdCAmJgogCQkJKHBpcGUtPm5leHRfdHhfZnJhbWUgPD0gY3VycmVudF9mcmFtZSkgJiYKIAkJCSgocGlwZS0+c3BsaXRfc2NfZnJhbWUgPT0gLTEpIHx8CiAJCQkgKCgoKGludCljdXJyZW50X2ZyYW1lIC0gKGludClwaXBlLT5zcGxpdF9zY19mcmFtZSkKQEAgLTIwMzksNyArMTg5NCw3IEBACiAgKiBAdXNiOgkgVVNCIGRldmljZSBzdGF0ZSBwb3B1bGF0ZWQgYnkgY3ZteF91c2JfaW5pdGlhbGl6ZSgpLgogICogQGlzX3NvZjoJIFRydWUgaWYgdGhpcyBzY2hlZHVsZSB3YXMgY2FsbGVkIG9uIGEgU09GIGludGVycnVwdC4KICAqLwotc3RhdGljIHZvaWQgX19jdm14X3VzYl9zY2hlZHVsZShzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwgaW50IGlzX3NvZikKK3N0YXRpYyB2b2lkIGN2bXhfdXNiX3NjaGVkdWxlKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLCBpbnQgaXNfc29mKQogewogCWludCBjaGFubmVsOwogCXN0cnVjdCBjdm14X3VzYl9waXBlICpwaXBlOwpAQCAtMjA1MiwxMiArMTkwNywxMiBAQAogCQkgKiBhdCB0aGUgZW5kIG9mIGEgZnJhbWUgYW5kIGNhdXNlIGFuIG92ZXJydW4uCiAJCSAqLwogCQl1bmlvbiBjdm14X3VzYmN4X2hmbnVtIGhmbnVtID0gewotCQkJLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCiAJCQkJCQlDVk1YX1VTQkNYX0hGTlVNKHVzYi0+aW5kZXgpKQogCQl9OwogCiAJCXVuaW9uIGN2bXhfdXNiY3hfaGZpciBoZmlyID0gewotCQkJLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCiAJCQkJCQlDVk1YX1VTQkNYX0hGSVIodXNiLT5pbmRleCkpCiAJCX07CiAKQEAgLTIwNzksMjMgKzE5MzQsMjMgQEAKIAkJCSAqIHdheSB3ZSBhcmUgc3VyZSB0aGF0IHRoZSBwZXJpb2RpYyBkYXRhIGlzIHNlbnQgaW4gdGhlCiAJCQkgKiBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lCiAJCQkgKi8KLQkJCXBpcGUgPSBfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsCisJCQlwaXBlID0gY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwKIAkJCQkJdXNiLT5hY3RpdmVfcGlwZXMgKwogCQkJCQlDVk1YX1VTQl9UUkFOU0ZFUl9JU09DSFJPTk9VUywKIAkJCQkJdXNiLT5mcmFtZV9udW1iZXIpOwogCQkJaWYgKGxpa2VseSghcGlwZSkpCi0JCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwKKwkJCQlwaXBlID0gY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwKIAkJCQkJCXVzYi0+YWN0aXZlX3BpcGVzICsKIAkJCQkJCUNWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCwKIAkJCQkJCXVzYi0+ZnJhbWVfbnVtYmVyKTsKIAkJfQogCQlpZiAobGlrZWx5KCFwaXBlKSkgewotCQkJcGlwZSA9IF9fY3ZteF91c2JfZmluZF9yZWFkeV9waXBlKHVzYiwKKwkJCXBpcGUgPSBjdm14X3VzYl9maW5kX3JlYWR5X3BpcGUodXNiLAogCQkJCQl1c2ItPmFjdGl2ZV9waXBlcyArCiAJCQkJCUNWTVhfVVNCX1RSQU5TRkVSX0NPTlRST0wsCiAJCQkJCXVzYi0+ZnJhbWVfbnVtYmVyKTsKIAkJCWlmIChsaWtlbHkoIXBpcGUpKQotCQkJCXBpcGUgPSBfX2N2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsCisJCQkJcGlwZSA9IGN2bXhfdXNiX2ZpbmRfcmVhZHlfcGlwZSh1c2IsCiAJCQkJCQl1c2ItPmFjdGl2ZV9waXBlcyArCiAJCQkJCQlDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLLAogCQkJCQkJdXNiLT5mcmFtZV9udW1iZXIpOwpAQCAtMjEwMyw3ICsxOTU4LDcgQEAKIAkJaWYgKCFwaXBlKQogCQkJYnJlYWs7CiAKLQkJX19jdm14X3VzYl9zdGFydF9jaGFubmVsKHVzYiwgY2hhbm5lbCwgcGlwZSk7CisJCWN2bXhfdXNiX3N0YXJ0X2NoYW5uZWwodXNiLCBjaGFubmVsLCBwaXBlKTsKIAl9CiAKIGRvbmU6CkBAIC0yMTIyLDcgKzE5NzcsNyBAQAogCQl9CiAJfQogCVVTQl9TRVRfRklFTEQzMihDVk1YX1VTQkNYX0dJTlRNU0sodXNiLT5pbmRleCksCi0JCQl1bmlvbiBjdm14X3VzYmN4X2dpbnRtc2ssIHNvZm1zaywgbmVlZF9zb2YpOworCQkJY3ZteF91c2JjeF9naW50bXNrLCBzb2Ztc2ssIG5lZWRfc29mKTsKIH0KIAogc3RhdGljIHZvaWQgb2N0ZW9uX3VzYl91cmJfY29tcGxldGVfY2FsbGJhY2soc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCkBAIC0yMjI2LDExICsyMDgxLDEwIEBACiAgKiBAY29tcGxldGVfY29kZToKICAqCQkgQ29tcGxldGlvbiBjb2RlCiAgKi8KLXN0YXRpYyB2b2lkIF9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSgKLQkJCQlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiwKLQkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKLQkJCQlzdHJ1Y3QgY3ZteF91c2JfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uLAotCQkJCWVudW0gY3ZteF91c2JfY29tcGxldGUgY29tcGxldGVfY29kZSkKK3N0YXRpYyB2b2lkIGN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUoc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCisJCQkJICAgICAgc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCisJCQkJICAgICAgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbiwKKwkJCQkgICAgICBlbnVtIGN2bXhfdXNiX2NvbXBsZXRlIGNvbXBsZXRlX2NvZGUpCiB7CiAJLyogSWYgdGhpcyB3YXMgYSBzcGxpdCB0aGVuIGNsZWFyIG91ciBzcGxpdCBpbiBwcm9ncmVzcyBtYXJrZXIgKi8KIAlpZiAodXNiLT5hY3RpdmVfc3BsaXQgPT0gdHJhbnNhY3Rpb24pCkBAIC0yMjk2LDcgKzIxNTAsNyBAQAogICoKICAqIFJldHVybnM6IFRyYW5zYWN0aW9uIG9yIE5VTEwgb24gZmFpbHVyZS4KICAqLwotc3RhdGljIHN0cnVjdCBjdm14X3VzYl90cmFuc2FjdGlvbiAqX19jdm14X3VzYl9zdWJtaXRfdHJhbnNhY3Rpb24oCitzdGF0aWMgc3RydWN0IGN2bXhfdXNiX3RyYW5zYWN0aW9uICpjdm14X3VzYl9zdWJtaXRfdHJhbnNhY3Rpb24oCiAJCQkJc3RydWN0IGN2bXhfdXNiX3N0YXRlICp1c2IsCiAJCQkJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCiAJCQkJZW51bSBjdm14X3VzYl90cmFuc2ZlciB0eXBlLApAQCAtMjM0Miw3ICsyMTk2LDcgQEAKIAkJICogV2UgbWF5IG5lZWQgdG8gc2NoZWR1bGUgdGhlIHBpcGUgaWYgdGhpcyB3YXMgdGhlIGhlYWQgb2YgdGhlCiAJCSAqIHBpcGUuCiAJCSAqLwotCQlfX2N2bXhfdXNiX3NjaGVkdWxlKHVzYiwgMCk7CisJCWN2bXhfdXNiX3NjaGVkdWxlKHVzYiwgMCk7CiAJfQogCiAJcmV0dXJuIHRyYW5zYWN0aW9uOwpAQCAtMjM2MywxNCArMjIxNywxNCBAQAogCQkJCQkJc3RydWN0IGN2bXhfdXNiX3BpcGUgKnBpcGUsCiAJCQkJCQlzdHJ1Y3QgdXJiICp1cmIpCiB7Ci0JcmV0dXJuIF9fY3ZteF91c2Jfc3VibWl0X3RyYW5zYWN0aW9uKHVzYiwgcGlwZSwgQ1ZNWF9VU0JfVFJBTlNGRVJfQlVMSywKLQkJCQkJICAgICB1cmItPnRyYW5zZmVyX2RtYSwKLQkJCQkJICAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCi0JCQkJCSAgICAgMCwgLyogY29udHJvbF9oZWFkZXIgKi8KLQkJCQkJICAgICAwLCAvKiBpc29fc3RhcnRfZnJhbWUgKi8KLQkJCQkJICAgICAwLCAvKiBpc29fbnVtYmVyX3BhY2tldHMgKi8KLQkJCQkJICAgICBOVUxMLCAvKiBpc29fcGFja2V0cyAqLwotCQkJCQkgICAgIHVyYik7CisJcmV0dXJuIGN2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbih1c2IsIHBpcGUsIENWTVhfVVNCX1RSQU5TRkVSX0JVTEssCisJCQkJCSAgIHVyYi0+dHJhbnNmZXJfZG1hLAorCQkJCQkgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCisJCQkJCSAgIDAsIC8qIGNvbnRyb2xfaGVhZGVyICovCisJCQkJCSAgIDAsIC8qIGlzb19zdGFydF9mcmFtZSAqLworCQkJCQkgICAwLCAvKiBpc29fbnVtYmVyX3BhY2tldHMgKi8KKwkJCQkJICAgTlVMTCwgLyogaXNvX3BhY2tldHMgKi8KKwkJCQkJICAgdXJiKTsKIH0KIAogCkBAIC0yMzg4LDE1ICsyMjQyLDE1IEBACiAJCQkJCQlzdHJ1Y3QgY3ZteF91c2JfcGlwZSAqcGlwZSwKIAkJCQkJCXN0cnVjdCB1cmIgKnVyYikKIHsKLQlyZXR1cm4gX19jdm14X3VzYl9zdWJtaXRfdHJhbnNhY3Rpb24odXNiLCBwaXBlLAotCQkJCQkgICAgIENWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCwKLQkJCQkJICAgICB1cmItPnRyYW5zZmVyX2RtYSwKLQkJCQkJICAgICB1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgsCi0JCQkJCSAgICAgMCwgLyogY29udHJvbF9oZWFkZXIgKi8KLQkJCQkJICAgICAwLCAvKiBpc29fc3RhcnRfZnJhbWUgKi8KLQkJCQkJICAgICAwLCAvKiBpc29fbnVtYmVyX3BhY2tldHMgKi8KLQkJCQkJICAgICBOVUxMLCAvKiBpc29fcGFja2V0cyAqLwotCQkJCQkgICAgIHVyYik7CisJcmV0dXJuIGN2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbih1c2IsIHBpcGUsCisJCQkJCSAgIENWTVhfVVNCX1RSQU5TRkVSX0lOVEVSUlVQVCwKKwkJCQkJICAgdXJiLT50cmFuc2Zlcl9kbWEsCisJCQkJCSAgIHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCQkJICAgMCwgLyogY29udHJvbF9oZWFkZXIgKi8KKwkJCQkJICAgMCwgLyogaXNvX3N0YXJ0X2ZyYW1lICovCisJCQkJCSAgIDAsIC8qIGlzb19udW1iZXJfcGFja2V0cyAqLworCQkJCQkgICBOVUxMLCAvKiBpc29fcGFja2V0cyAqLworCQkJCQkgICB1cmIpOwogfQogCiAKQEAgLTI0MjEsMTQgKzIyNzUsMTQgQEAKIAlpZiAoKGhlYWRlci0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgPT0gMCkKIAkJYnVmZmVyX2xlbmd0aCA9IGxlMTZfdG9fY3B1KGhlYWRlci0+d0xlbmd0aCk7CiAKLQlyZXR1cm4gX19jdm14X3VzYl9zdWJtaXRfdHJhbnNhY3Rpb24odXNiLCBwaXBlLAotCQkJCQkgICAgIENWTVhfVVNCX1RSQU5TRkVSX0NPTlRST0wsCi0JCQkJCSAgICAgdXJiLT50cmFuc2Zlcl9kbWEsIGJ1ZmZlcl9sZW5ndGgsCi0JCQkJCSAgICAgY29udHJvbF9oZWFkZXIsCi0JCQkJCSAgICAgMCwgLyogaXNvX3N0YXJ0X2ZyYW1lICovCi0JCQkJCSAgICAgMCwgLyogaXNvX251bWJlcl9wYWNrZXRzICovCi0JCQkJCSAgICAgTlVMTCwgLyogaXNvX3BhY2tldHMgKi8KLQkJCQkJICAgICB1cmIpOworCXJldHVybiBjdm14X3VzYl9zdWJtaXRfdHJhbnNhY3Rpb24odXNiLCBwaXBlLAorCQkJCQkgICBDVk1YX1VTQl9UUkFOU0ZFUl9DT05UUk9MLAorCQkJCQkgICB1cmItPnRyYW5zZmVyX2RtYSwgYnVmZmVyX2xlbmd0aCwKKwkJCQkJICAgY29udHJvbF9oZWFkZXIsCisJCQkJCSAgIDAsIC8qIGlzb19zdGFydF9mcmFtZSAqLworCQkJCQkgICAwLCAvKiBpc29fbnVtYmVyX3BhY2tldHMgKi8KKwkJCQkJICAgTlVMTCwgLyogaXNvX3BhY2tldHMgKi8KKwkJCQkJICAgdXJiKTsKIH0KIAogCkBAIC0yNDQ5LDE0ICsyMzAzLDE0IEBACiAJc3RydWN0IGN2bXhfdXNiX2lzb19wYWNrZXQgKnBhY2tldHM7CiAKIAlwYWNrZXRzID0gKHN0cnVjdCBjdm14X3VzYl9pc29fcGFja2V0ICopIHVyYi0+c2V0dXBfcGFja2V0OwotCXJldHVybiBfX2N2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbih1c2IsIHBpcGUsCi0JCQkJCSAgICAgQ1ZNWF9VU0JfVFJBTlNGRVJfSVNPQ0hST05PVVMsCi0JCQkJCSAgICAgdXJiLT50cmFuc2Zlcl9kbWEsCi0JCQkJCSAgICAgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAotCQkJCQkgICAgIDAsIC8qIGNvbnRyb2xfaGVhZGVyICovCi0JCQkJCSAgICAgdXJiLT5zdGFydF9mcmFtZSwKLQkJCQkJICAgICB1cmItPm51bWJlcl9vZl9wYWNrZXRzLAotCQkJCQkgICAgIHBhY2tldHMsIHVyYik7CisJcmV0dXJuIGN2bXhfdXNiX3N1Ym1pdF90cmFuc2FjdGlvbih1c2IsIHBpcGUsCisJCQkJCSAgIENWTVhfVVNCX1RSQU5TRkVSX0lTT0NIUk9OT1VTLAorCQkJCQkgICB1cmItPnRyYW5zZmVyX2RtYSwKKwkJCQkJICAgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLAorCQkJCQkgICAwLCAvKiBjb250cm9sX2hlYWRlciAqLworCQkJCQkgICB1cmItPnN0YXJ0X2ZyYW1lLAorCQkJCQkgICB1cmItPm51bWJlcl9vZl9wYWNrZXRzLAorCQkJCQkgICBwYWNrZXRzLCB1cmIpOwogfQogCiAKQEAgLTI0ODIsMTUgKzIzMzYsMTUgQEAKIAkgKiB0cmVhdCBpdCBzcGVjaWFsCiAJICovCiAJaWYgKGxpc3RfZmlyc3RfZW50cnkoJnBpcGUtPnRyYW5zYWN0aW9ucywgdHlwZW9mKCp0cmFuc2FjdGlvbiksIG5vZGUpID09Ci0JICAgIHRyYW5zYWN0aW9uICYmIChwaXBlLT5mbGFncyAmIF9fQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQpKSB7CisJICAgIHRyYW5zYWN0aW9uICYmIChwaXBlLT5mbGFncyAmIENWTVhfVVNCX1BJUEVfRkxBR1NfU0NIRURVTEVEKSkgewogCQl1bmlvbiBjdm14X3VzYmN4X2hjY2hhcnggdXNiY19oY2NoYXI7CiAKIAkJdXNiLT5waXBlX2Zvcl9jaGFubmVsW3BpcGUtPmNoYW5uZWxdID0gTlVMTDsKLQkJcGlwZS0+ZmxhZ3MgJj0gfl9fQ1ZNWF9VU0JfUElQRV9GTEFHU19TQ0hFRFVMRUQ7CisJCXBpcGUtPmZsYWdzICY9IH5DVk1YX1VTQl9QSVBFX0ZMQUdTX1NDSEVEVUxFRDsKIAogCQlDVk1YX1NZTkNXOwogCi0JCXVzYmNfaGNjaGFyLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCXVzYmNfaGNjaGFyLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAogCQkJCUNWTVhfVVNCQ1hfSENDSEFSWChwaXBlLT5jaGFubmVsLCB1c2ItPmluZGV4KSk7CiAJCS8qCiAJCSAqIElmIHRoZSBjaGFubmVsIGlzbid0IGVuYWJsZWQgdGhlbiB0aGUgdHJhbnNhY3Rpb24gYWxyZWFkeQpAQCAtMjQ5OCwxNCArMjM1MiwxNCBAQAogCQkgKi8KIAkJaWYgKHVzYmNfaGNjaGFyLnMuY2hlbmEpIHsKIAkJCXVzYmNfaGNjaGFyLnMuY2hkaXMgPSAxOwotCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCiAJCQkJCUNWTVhfVVNCQ1hfSENDSEFSWChwaXBlLT5jaGFubmVsLAogCQkJCQkJdXNiLT5pbmRleCksCiAJCQkJCXVzYmNfaGNjaGFyLnUzMik7CiAJCX0KIAl9Ci0JX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCi0JCQkJICAgIENWTVhfVVNCX0NPTVBMRVRFX0NBTkNFTCk7CisJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAorCQkJCSAgQ1ZNWF9VU0JfQ09NUExFVEVfQ0FOQ0VMKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjU3MCw4ICsyNDI0LDcgQEAKIAlpbnQgZnJhbWVfbnVtYmVyOwogCXVuaW9uIGN2bXhfdXNiY3hfaGZudW0gdXNiY19oZm51bTsKIAotCXVzYmNfaGZudW0udTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCUNWTVhfVVNCQ1hfSEZOVU0odXNiLT5pbmRleCkpOworCXVzYmNfaGZudW0udTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSEZOVU0odXNiLT5pbmRleCkpOwogCWZyYW1lX251bWJlciA9IHVzYmNfaGZudW0ucy5mcm51bTsKIAogCXJldHVybiBmcmFtZV9udW1iZXI7CkBAIC0yNTg2LDcgKzI0MzksNyBAQAogICoKICAqIFJldHVybnM6IFplcm8gb24gc3VjY2VzcwogICovCi1zdGF0aWMgaW50IF9fY3ZteF91c2JfcG9sbF9jaGFubmVsKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLCBpbnQgY2hhbm5lbCkKK3N0YXRpYyBpbnQgY3ZteF91c2JfcG9sbF9jaGFubmVsKHN0cnVjdCBjdm14X3VzYl9zdGF0ZSAqdXNiLCBpbnQgY2hhbm5lbCkKIHsKIAlzdHJ1Y3Qgb2N0ZW9uX2hjZCAqcHJpdiA9IGN2bXhfdXNiX3RvX29jdGVvbih1c2IpOwogCXN0cnVjdCB1c2JfaGNkICpoY2QgPSBvY3Rlb25fdG9faGNkKHByaXYpOwpAQCAtMjYwMiwxMSArMjQ1NSwxMSBAQAogCWludCBidWZmZXJfc3BhY2VfbGVmdDsKIAogCS8qIFJlYWQgdGhlIGludGVycnVwdCBzdGF0dXMgYml0cyBmb3IgdGhlIGNoYW5uZWwgKi8KLQl1c2JjX2hjaW50LnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQlDVk1YX1VTQkNYX0hDSU5UWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CisJdXNiY19oY2ludC51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQlDVk1YX1VTQkNYX0hDSU5UWChjaGFubmVsLCB1c2ItPmluZGV4KSk7CiAKIAlpZiAodXNiLT5pbml0X2ZsYWdzICYgQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUEpIHsKLQkJdXNiY19oY2NoYXIudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJdXNiY19oY2NoYXIudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCiAJCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAogCQlpZiAodXNiY19oY2NoYXIucy5jaGVuYSAmJiB1c2JjX2hjY2hhci5zLmNoZGlzKSB7CkBAIC0yNjE1LDcgKzI0NjgsNyBAQAogCQkJICogaW50ZXJydXB0IElOIHRyYW5zZmVycyB0byBnZXQgc3R1Y2sgdW50aWwgd2UgZG8gYQogCQkJICogd3JpdGUgb2YgSENDSEFSWCB3aXRob3V0IGNoYW5naW5nIHRoaW5ncwogCQkJICovCi0JCQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKKwkJCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKIAkJCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsCiAJCQkJCQkJICAgdXNiLT5pbmRleCksCiAJCQkJCXVzYmNfaGNjaGFyLnUzMik7CkBAIC0yNjMyLDEyICsyNDg1LDEyIEBACiAJCQkJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBleGNlcHQgQ0hITFREICovCiAJCQkJaGNpbnRtc2sudTMyID0gMDsKIAkJCQloY2ludG1zay5zLmNoaGx0ZG1zayA9IDE7Ci0JCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAogCQkJCQkJQ1ZNWF9VU0JDWF9IQ0lOVE1TS1goY2hhbm5lbCwKIAkJCQkJCQl1c2ItPmluZGV4KSwKIAkJCQkJCWhjaW50bXNrLnUzMik7CiAJCQkJdXNiY19oY2NoYXIucy5jaGRpcyA9IDE7Ci0JCQkJX19jdm14X3VzYl93cml0ZV9jc3IzMih1c2IsCisJCQkJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAogCQkJCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsCiAJCQkJCQkJdXNiLT5pbmRleCksCiAJCQkJCQl1c2JjX2hjY2hhci51MzIpOwpAQCAtMjY2Myw5ICsyNTE2LDcgQEAKIAl9CiAKIAkvKiBEaXNhYmxlIHRoZSBjaGFubmVsIGludGVycnVwdHMgbm93IHRoYXQgaXQgaXMgZG9uZSAqLwotCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLAotCQkJCUNWTVhfVVNCQ1hfSENJTlRNU0tYKGNoYW5uZWwsIHVzYi0+aW5kZXgpLAotCQkJCTApOworCWN2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwgQ1ZNWF9VU0JDWF9IQ0lOVE1TS1goY2hhbm5lbCwgdXNiLT5pbmRleCksIDApOwogCXVzYi0+aWRsZV9oYXJkd2FyZV9jaGFubmVscyB8PSAoMTw8Y2hhbm5lbCk7CiAKIAkvKiBNYWtlIHN1cmUgdGhpcyBjaGFubmVsIGlzIHRpZWQgdG8gYSB2YWxpZCBwaXBlICovCkBAIC0yNjgzLDE1ICsyNTM0LDE1IEBACiAJICogZnVuY3Rpb24gd2lsbCBmaWd1cmUgb3V0IHdoaWNoIHBpcGUgbmVlZHMgdG8gZ28KIAkgKi8KIAl1c2ItPnBpcGVfZm9yX2NoYW5uZWxbY2hhbm5lbF0gPSBOVUxMOwotCXBpcGUtPmZsYWdzICY9IH5fX0NWTVhfVVNCX1BJUEVfRkxBR1NfU0NIRURVTEVEOworCXBpcGUtPmZsYWdzICY9IH5DVk1YX1VTQl9QSVBFX0ZMQUdTX1NDSEVEVUxFRDsKIAogCS8qCiAJICogUmVhZCB0aGUgY2hhbm5lbCBjb25maWcgaW5mbyBzbyB3ZSBjYW4gZmlndXJlIG91dCBob3cgbXVjaCBkYXRhCiAJICogdHJhbnNmZXJyZWQKIAkgKi8KLQl1c2JjX2hjY2hhci51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCXVzYmNfaGNjaGFyLnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAogCQkJQ1ZNWF9VU0JDWF9IQ0NIQVJYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKLQl1c2JjX2hjdHNpei51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCXVzYmNfaGN0c2l6LnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAogCQkJQ1ZNWF9VU0JDWF9IQ1RTSVpYKGNoYW5uZWwsIHVzYi0+aW5kZXgpKTsKIAogCS8qCkBAIC0yNzY2LDcgKzI2MTcsMTggQEAKIAlpZiAoKHBpcGUtPmRldmljZV9zcGVlZCA9PSBDVk1YX1VTQl9TUEVFRF9ISUdIKSAmJgogCQkocGlwZS0+dHJhbnNmZXJfdHlwZSA9PSBDVk1YX1VTQl9UUkFOU0ZFUl9CVUxLKSAmJgogCQkocGlwZS0+dHJhbnNmZXJfZGlyID09IENWTVhfVVNCX0RJUkVDVElPTl9PVVQpKQotCQlwaXBlLT5mbGFncyB8PSBfX0NWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HOworCQlwaXBlLT5mbGFncyB8PSBDVk1YX1VTQl9QSVBFX0ZMQUdTX05FRURfUElORzsKKworCWlmICh1bmxpa2VseShXQVJOX09OX09OQ0UoYnl0ZXNfdGhpc190cmFuc2ZlciA8IDApKSkgeworCQkvKgorCQkgKiBJbiBzb21lIHJhcmUgY2FzZXMgdGhlIERNQSBlbmdpbmUgc2VlbXMgdG8gZ2V0IHN0dWNrIGFuZAorCQkgKiBrZWVwcyBzdWJzdHJhY3Rpbmcgc2FtZSBieXRlIGNvdW50IG92ZXIgYW5kIG92ZXIgYWdhaW4uIEluCisJCSAqIHN1Y2ggY2FzZSB3ZSBqdXN0IG5lZWQgdG8gZmFpbCBldmVyeSB0cmFuc2FjdGlvbi4KKwkJICovCisJCWN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKKwkJCQkJICBDVk1YX1VTQl9DT01QTEVURV9FUlJPUik7CisJCXJldHVybiAwOworCX0KIAogCWlmICh1c2JjX2hjaW50LnMuc3RhbGwpIHsKIAkJLyoKQEAgLTI3NzYsNTIgKzI2MzgsMjQgQEAKIAkJICogdGhlIGFjdHVhbCBieXRlcyB0cmFuc2ZlcnJlZAogCQkgKi8KIAkJcGlwZS0+cGlkX3RvZ2dsZSA9IDA7Ci0JCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAotCQkJCQkgICAgQ1ZNWF9VU0JfQ09NUExFVEVfU1RBTEwpOworCQljdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCisJCQkJCSAgQ1ZNWF9VU0JfQ09NUExFVEVfU1RBTEwpOwogCX0gZWxzZSBpZiAodXNiY19oY2ludC5zLnhhY3RlcnIpIHsKIAkJLyoKLQkJICogV2Uga25vdyBhdCBsZWFzdCBvbmUgcGFja2V0IHdvcmtlZCBpZiB3ZSBnZXQgYSBBQ0sgb3IgTkFLLgotCQkgKiBSZXNldCB0aGUgcmV0cnkgY291bnRlcgorCQkgKiBYYWN0RXJyIGFzIGEgcmVzcG9uc2UgbWVhbnMgdGhlIGRldmljZSBzaWduYWxlZAorCQkgKiBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgdHJhbnNmZXIuIEZvciBleGFtcGxlLCBQSUQKKwkJICogdG9nZ2xlIGVycm9ycyBjYXVzZSB0aGVzZS4KIAkJICovCi0JCWlmICh1c2JjX2hjaW50LnMubmFrIHx8IHVzYmNfaGNpbnQucy5hY2spCi0JCQl0cmFuc2FjdGlvbi0+cmV0cmllcyA9IDA7Ci0JCXRyYW5zYWN0aW9uLT5yZXRyaWVzKys7Ci0JCWlmICh0cmFuc2FjdGlvbi0+cmV0cmllcyA+IE1BWF9SRVRSSUVTKSB7Ci0JCQkvKgotCQkJICogWGFjdEVyciBhcyBhIHJlc3BvbnNlIG1lYW5zIHRoZSBkZXZpY2Ugc2lnbmFsZWQKLQkJCSAqIHNvbWV0aGluZyB3cm9uZyB3aXRoIHRoZSB0cmFuc2Zlci4gRm9yIGV4YW1wbGUsIFBJRAotCQkJICogdG9nZ2xlIGVycm9ycyBjYXVzZSB0aGVzZQotCQkJICovCi0JCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKLQkJCQkJCSAgICBDVk1YX1VTQl9DT01QTEVURV9YQUNURVJSKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBJZiB0aGlzIHdhcyBhIHNwbGl0IHRoZW4gY2xlYXIgb3VyIHNwbGl0IGluIHByb2dyZXNzCi0JCQkgKiBtYXJrZXIKLQkJCSAqLwotCQkJaWYgKHVzYi0+YWN0aXZlX3NwbGl0ID09IHRyYW5zYWN0aW9uKQotCQkJCXVzYi0+YWN0aXZlX3NwbGl0ID0gTlVMTDsKLQkJCS8qCi0JCQkgKiBSZXdpbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdHJhbnNhY3Rpb24gYnkgYW5kaW5nCi0JCQkgKiBvZmYgdGhlIHNwbGl0IGNvbXBsZXRlIGJpdAotCQkJICovCi0JCQl0cmFuc2FjdGlvbi0+c3RhZ2UgJj0gfjE7Ci0JCQlwaXBlLT5zcGxpdF9zY19mcmFtZSA9IC0xOwotCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPSBwaXBlLT5pbnRlcnZhbDsKLQkJCWlmIChwaXBlLT5uZXh0X3R4X2ZyYW1lIDwgdXNiLT5mcmFtZV9udW1iZXIpCi0JCQkJcGlwZS0+bmV4dF90eF9mcmFtZSA9Ci0JCQkJCXVzYi0+ZnJhbWVfbnVtYmVyICsgcGlwZS0+aW50ZXJ2YWwgLQotCQkJCQkodXNiLT5mcmFtZV9udW1iZXIgLQotCQkJCQkgcGlwZS0+bmV4dF90eF9mcmFtZSkgJSBwaXBlLT5pbnRlcnZhbDsKLQkJfQorCQljdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCisJCQkJCSAgQ1ZNWF9VU0JfQ09NUExFVEVfWEFDVEVSUik7CiAJfSBlbHNlIGlmICh1c2JjX2hjaW50LnMuYmJsZXJyKSB7CiAJCS8qIEJhYmJsZSBFcnJvciAoQmJsRXJyKSAqLwotCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKLQkJCQkJICAgIENWTVhfVVNCX0NPTVBMRVRFX0JBQkJMRUVSUik7CisJCWN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKKwkJCQkJICBDVk1YX1VTQl9DT01QTEVURV9CQUJCTEVFUlIpOwogCX0gZWxzZSBpZiAodXNiY19oY2ludC5zLmRhdGF0Z2xlcnIpIHsKIAkJLyogRGF0YSB0b2dnbGUgZXJyb3IgKi8KLQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwgdHJhbnNhY3Rpb24sCi0JCQkJCSAgICBDVk1YX1VTQl9DT01QTEVURV9EQVRBVEdMRVJSKTsKKwkJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsIHRyYW5zYWN0aW9uLAorCQkJCQkgIENWTVhfVVNCX0NPTVBMRVRFX0RBVEFUR0xFUlIpOwogCX0gZWxzZSBpZiAodXNiY19oY2ludC5zLm55ZXQpIHsKIAkJLyoKIAkJICogTllFVCBhcyBhIHJlc3BvbnNlIGlzIG9ubHkgYWxsb3dlZCBpbiB0aHJlZSBjYXNlczogYXMgYQpAQCAtMjgyOSw3ICsyNjYzLDcgQEAKIAkJICogYXMgYSByZXNwb25zZSB0byBhIGJ1bGsgb3V0LiBUaGUgcGluZyBjYXNlIGlzIGhhbmRsZWQgYnkKIAkJICogaGFyZHdhcmUsIHNvIHdlIG9ubHkgaGF2ZSBzcGxpdHMgYW5kIGJ1bGsgb3V0CiAJCSAqLwotCQlpZiAoIV9fY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7CisJCWlmICghY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7CiAJCQl0cmFuc2FjdGlvbi0+cmV0cmllcyA9IDA7CiAJCQkvKgogCQkJICogSWYgdGhlcmUgaXMgbW9yZSBkYXRhIHRvIGdvIHRoZW4gd2UgbmVlZCB0byB0cnkKQEAgLTI4MzcsNyArMjY3MSw3IEBACiAJCQkgKi8KIAkJCWlmICgoYnVmZmVyX3NwYWNlX2xlZnQgPT0gMCkgfHwKIAkJCQkoYnl0ZXNfaW5fbGFzdF9wYWNrZXQgPCBwaXBlLT5tYXhfcGFja2V0KSkKLQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLAorCQkJCWN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLAogCQkJCQkJdHJhbnNhY3Rpb24sCiAJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJfSBlbHNlIHsKQEAgLTI4NjksNyArMjcwMyw3IEBACiAJCSAqIFNpbmNlIHdlIGdvdCBhbiBBQ0ssIHdlIGtub3cgd2UgZG9uJ3QgbmVlZCB0byBkbyBhIHBpbmcgb24KIAkJICogdGhpcyBwaXBlCiAJCSAqLwotCQlwaXBlLT5mbGFncyAmPSB+X19DVk1YX1VTQl9QSVBFX0ZMQUdTX05FRURfUElORzsKKwkJcGlwZS0+ZmxhZ3MgJj0gfkNWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HOwogCiAJCXN3aXRjaCAodHJhbnNhY3Rpb24tPnR5cGUpIHsKIAkJY2FzZSBDVk1YX1VTQl9UUkFOU0ZFUl9DT05UUk9MOgpAQCAtMjg3NywxMiArMjcxMSwxMiBAQAogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTDoKIAkJCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfTk9OX0NPTlRST0xfU1BMSVRfQ09NUExFVEU6CiAJCQkJLyogVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZSAqLwotCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsCisJCQkJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsCiAJCQkJCXRyYW5zYWN0aW9uLCBDVk1YX1VTQl9DT01QTEVURV9FUlJPUik7CiAJCQkJYnJlYWs7CiAJCQljYXNlIENWTVhfVVNCX1NUQUdFX1NFVFVQOgogCQkJCXBpcGUtPnBpZF90b2dnbGUgPSAxOwotCQkJCWlmIChfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkKKwkJCQlpZiAoY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKQogCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQogCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfU0VUVVBfU1BMSVRfQ09NUExFVEU7CiAJCQkJZWxzZSB7CkBAIC0yOTA5LDcgKzI3NDMsNyBAQAogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfREFUQToKLQkJCQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKKwkJCQlpZiAoY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKSB7CiAJCQkJCXRyYW5zYWN0aW9uLT5zdGFnZSA9CiAJCQkJCQlDVk1YX1VTQl9TVEFHRV9EQVRBX1NQTElUX0NPTVBMRVRFOwogCQkJCQkvKgpAQCAtMjk0NywxNiArMjc4MSwxNiBAQAogCQkJCX0KIAkJCQlicmVhazsKIAkJCWNhc2UgQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTOgotCQkJCWlmIChfX2N2bXhfdXNiX3BpcGVfbmVlZHNfc3BsaXQodXNiLCBwaXBlKSkKKwkJCQlpZiAoY3ZteF91c2JfcGlwZV9uZWVkc19zcGxpdCh1c2IsIHBpcGUpKQogCQkJCQl0cmFuc2FjdGlvbi0+c3RhZ2UgPQogCQkJCQkJQ1ZNWF9VU0JfU1RBR0VfU1RBVFVTX1NQTElUX0NPTVBMRVRFOwogCQkJCWVsc2UKLQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwKKwkJCQkJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsIHBpcGUsCiAJCQkJCQl0cmFuc2FjdGlvbiwKIAkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBDVk1YX1VTQl9TVEFHRV9TVEFUVVNfU1BMSVRfQ09NUExFVEU6Ci0JCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwKKwkJCQljdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwKIAkJCQkJCXRyYW5zYWN0aW9uLAogCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCQkJYnJlYWs7CkBAIC0yOTcwLDcgKzI4MDQsNyBAQAogCQkJICogRm9yIHNwbGl0cyB3ZSBuZWVkIHRvIGNvbnRpbnVlIHRoZSB0cmFuc2ZlciBpZiBtb3JlCiAJCQkgKiBkYXRhIGlzIG5lZWRlZAogCQkJICovCi0JCQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKKwkJCWlmIChjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKIAkJCQlpZiAodHJhbnNhY3Rpb24tPnN0YWdlID09CiAJCQkJCQlDVk1YX1VTQl9TVEFHRV9OT05fQ09OVFJPTCkKIAkJCQkJdHJhbnNhY3Rpb24tPnN0YWdlID0KQEAgLTI5ODYsNyArMjgyMCw3IEBACiAJCQkJCQkJQ1ZNWF9VU0JfVFJBTlNGRVJfSU5URVJSVVBUKQogCQkJCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0KIAkJCQkJCQkJcGlwZS0+aW50ZXJ2YWw7Ci0JCQkJCQkJX19jdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKAorCQkJCQkJCWN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUoCiAJCQkJCQkJCXVzYiwKIAkJCQkJCQkJcGlwZSwKIAkJCQkJCQkJdHJhbnNhY3Rpb24sCkBAIC0zMDAyLDcgKzI4MzYsNyBAQAogCQkJCSAgICAgQ1ZNWF9VU0JfRElSRUNUSU9OX09VVCkgJiYKIAkJCQkgICAgKHVzYmNfaGNpbnQucy5uYWspKQogCQkJCQlwaXBlLT5mbGFncyB8PQotCQkJCQkJX19DVk1YX1VTQl9QSVBFX0ZMQUdTX05FRURfUElORzsKKwkJCQkJCUNWTVhfVVNCX1BJUEVfRkxBR1NfTkVFRF9QSU5HOwogCQkJCWlmICghYnVmZmVyX3NwYWNlX2xlZnQgfHwKIAkJCQkJKGJ5dGVzX2luX2xhc3RfcGFja2V0IDwKIAkJCQkJIHBpcGUtPm1heF9wYWNrZXQpKSB7CkBAIC0zMDEwLDE1ICsyODQ0LDE0IEBACiAJCQkJCQlDVk1YX1VTQl9UUkFOU0ZFUl9JTlRFUlJVUFQpCiAJCQkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9CiAJCQkJCQkJcGlwZS0+aW50ZXJ2YWw7Ci0JCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsCi0JCQkJCQlwaXBlLAorCQkJCQljdm14X3VzYl9wZXJmb3JtX2NvbXBsZXRlKHVzYiwgcGlwZSwKIAkJCQkJCXRyYW5zYWN0aW9uLAogCQkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfU1VDQ0VTUyk7CiAJCQkJfQogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgQ1ZNWF9VU0JfVFJBTlNGRVJfSVNPQ0hST05PVVM6Ci0JCQlpZiAoX19jdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKKwkJCWlmIChjdm14X3VzYl9waXBlX25lZWRzX3NwbGl0KHVzYiwgcGlwZSkpIHsKIAkJCQkvKgogCQkJCSAqIElTT0NIUk9OT1VTIE9VVCBzcGxpdHMgZG9uJ3QgcmVxdWlyZSBhCiAJCQkJICogY29tcGxldGUgc3BsaXQgc3RhZ2UuIEluc3RlYWQgdGhleSB1c2UgYQpAQCAtMzAzOSwxMCArMjg3Miw4IEBACiAJCQkJCQkoYnl0ZXNfdGhpc190cmFuc2ZlciA8IDE4OCkpIHsKIAkJCQkJCXBpcGUtPm5leHRfdHhfZnJhbWUgKz0KIAkJCQkJCQlwaXBlLT5pbnRlcnZhbDsKLQkJCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSgKLQkJCQkJCQl1c2IsCi0JCQkJCQkJcGlwZSwKLQkJCQkJCQl0cmFuc2FjdGlvbiwKKwkJCQkJCWN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLAorCQkJCQkJCXBpcGUsIHRyYW5zYWN0aW9uLAogCQkJCQkJCUNWTVhfVVNCX0NPTVBMRVRFX1NVQ0NFU1MpOwogCQkJCQl9CiAJCQkJfSBlbHNlIHsKQEAgLTMwNTksNyArMjg5MCw3IEBACiAJCQkJCQkJIHBpcGUtPm1heF9wYWNrZXQpKSB7CiAJCQkJCQkJcGlwZS0+bmV4dF90eF9mcmFtZSArPQogCQkJCQkJCQlwaXBlLT5pbnRlcnZhbDsKLQkJCQkJCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUoCisJCQkJCQkJY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSgKIAkJCQkJCQkJdXNiLAogCQkJCQkJCQlwaXBlLAogCQkJCQkJCQl0cmFuc2FjdGlvbiwKQEAgLTMwNzEsOCArMjkwMiw3IEBACiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlwaXBlLT5uZXh0X3R4X2ZyYW1lICs9IHBpcGUtPmludGVydmFsOwotCQkJCV9fY3ZteF91c2JfcGVyZm9ybV9jb21wbGV0ZSh1c2IsCi0JCQkJCQlwaXBlLAorCQkJCWN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLAogCQkJCQkJdHJhbnNhY3Rpb24sCiAJCQkJCQlDVk1YX1VTQl9DT01QTEVURV9TVUNDRVNTKTsKIAkJCX0KQEAgLTMxMTAsNyArMjk0MCw3IEBACiAJCQkgKiBXZSBnZXQgY2hhbm5lbCBoYWx0ZWQgaW50ZXJydXB0cyB3aXRoIG5vIHJlc3VsdCBiaXRzCiAJCQkgKiBzZXRzIHdoZW4gdGhlIGNhYmxlIGlzIHVucGx1Z2dlZAogCQkJICovCi0JCQlfX2N2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKKwkJCWN2bXhfdXNiX3BlcmZvcm1fY29tcGxldGUodXNiLCBwaXBlLCB0cmFuc2FjdGlvbiwKIAkJCQkJQ1ZNWF9VU0JfQ09NUExFVEVfRVJST1IpOwogCQl9CiAJfQpAQCAtMzE0NCwyMSArMjk3NCwxOSBAQAogCXByZWZldGNoX3JhbmdlKHVzYiwgc2l6ZW9mKCp1c2IpKTsKIAogCS8qIFVwZGF0ZSB0aGUgZnJhbWUgY291bnRlciAqLwotCXVzYmNfaGZudW0udTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCQkJCUNWTVhfVVNCQ1hfSEZOVU0odXNiLT5pbmRleCkpOworCXVzYmNfaGZudW0udTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSEZOVU0odXNiLT5pbmRleCkpOwogCWlmICgodXNiLT5mcmFtZV9udW1iZXImMHgzZmZmKSA+IHVzYmNfaGZudW0ucy5mcm51bSkKIAkJdXNiLT5mcmFtZV9udW1iZXIgKz0gMHg0MDAwOwogCXVzYi0+ZnJhbWVfbnVtYmVyICY9IH4weDNmZmZ1bGw7CiAJdXNiLT5mcmFtZV9udW1iZXIgfD0gdXNiY19oZm51bS5zLmZybnVtOwogCiAJLyogUmVhZCB0aGUgcGVuZGluZyBpbnRlcnJ1cHRzICovCi0JdXNiY19naW50c3RzLnUzMiA9IF9fY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCi0JCQkJCQlDVk1YX1VTQkNYX0dJTlRTVFModXNiLT5pbmRleCkpOworCXVzYmNfZ2ludHN0cy51MzIgPSBjdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKKwkJCQkJICAgICAgIENWTVhfVVNCQ1hfR0lOVFNUUyh1c2ItPmluZGV4KSk7CiAKIAkvKiBDbGVhciB0aGUgaW50ZXJydXB0cyBub3cgdGhhdCB3ZSBrbm93IGFib3V0IHRoZW0gKi8KLQlfX2N2bXhfdXNiX3dyaXRlX2NzcjMyKHVzYiwKLQkJCQlDVk1YX1VTQkNYX0dJTlRTVFModXNiLT5pbmRleCksCi0JCQkJdXNiY19naW50c3RzLnUzMik7CisJY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0dJTlRTVFModXNiLT5pbmRleCksCisJCQkgICAgIHVzYmNfZ2ludHN0cy51MzIpOwogCiAJaWYgKHVzYmNfZ2ludHN0cy5zLnJ4Zmx2bCkgewogCQkvKgpAQCAtMzE2OSwxMiArMjk5NywxMiBAQAogCQkgKiBJbiBETUEgbW9kZSB0aGlzIGlzIGhhbmRsZWQgYnkgaGFyZHdhcmUKIAkJICovCiAJCWlmICh1c2ItPmluaXRfZmxhZ3MgJiBDVk1YX1VTQl9JTklUSUFMSVpFX0ZMQUdTX05PX0RNQSkKLQkJCV9fY3ZteF91c2JfcG9sbF9yeF9maWZvKHVzYik7CisJCQljdm14X3VzYl9wb2xsX3J4X2ZpZm8odXNiKTsKIAl9CiAJaWYgKHVzYmNfZ2ludHN0cy5zLnB0eGZlbXAgfHwgdXNiY19naW50c3RzLnMubnB0eGZlbXApIHsKIAkJLyogRmlsbCB0aGUgVHggRklGT3Mgd2hlbiBub3QgaW4gRE1BIG1vZGUgKi8KIAkJaWYgKHVzYi0+aW5pdF9mbGFncyAmIENWTVhfVVNCX0lOSVRJQUxJWkVfRkxBR1NfTk9fRE1BKQotCQkJX19jdm14X3VzYl9wb2xsX3R4X2ZpZm8odXNiKTsKKwkJCWN2bXhfdXNiX3BvbGxfdHhfZmlmbyh1c2IpOwogCX0KIAlpZiAodXNiY19naW50c3RzLnMuZGlzY29ubmludCB8fCB1c2JjX2dpbnRzdHMucy5wcnRpbnQpIHsKIAkJdW5pb24gY3ZteF91c2JjeF9ocHJ0IHVzYmNfaHBydDsKQEAgLTMxOTQsMTEgKzMwMjIsMTEgQEAKIAkJICovCiAJCW9jdGVvbl91c2JfcG9ydF9jYWxsYmFjayh1c2IpOwogCQkvKiBDbGVhciB0aGUgcG9ydCBjaGFuZ2UgYml0cyAqLwotCQl1c2JjX2hwcnQudTMyID0gX19jdm14X3VzYl9yZWFkX2NzcjMyKHVzYiwKLQkJCQlDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCkpOworCQl1c2JjX2hwcnQudTMyID0gY3ZteF91c2JfcmVhZF9jc3IzMih1c2IsCisJCQkJCUNWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSk7CiAJCXVzYmNfaHBydC5zLnBydGVuYSA9IDA7Ci0JCV9fY3ZteF91c2Jfd3JpdGVfY3NyMzIodXNiLCBDVk1YX1VTQkNYX0hQUlQodXNiLT5pbmRleCksCi0JCQkJICAgICAgIHVzYmNfaHBydC51MzIpOworCQljdm14X3VzYl93cml0ZV9jc3IzMih1c2IsIENWTVhfVVNCQ1hfSFBSVCh1c2ItPmluZGV4KSwKKwkJCQkgICAgIHVzYmNfaHBydC51MzIpOwogCX0KIAlpZiAodXNiY19naW50c3RzLnMuaGNoaW50KSB7CiAJCS8qCkBAIC0zMjE1LDE4ICszMDQzLDE4IEBACiAJCSAqLwogCQl1bmlvbiBjdm14X3VzYmN4X2hhaW50IHVzYmNfaGFpbnQ7CiAKLQkJdXNiY19oYWludC51MzIgPSBfX2N2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAorCQl1c2JjX2hhaW50LnUzMiA9IGN2bXhfdXNiX3JlYWRfY3NyMzIodXNiLAogCQkJCQlDVk1YX1VTQkNYX0hBSU5UKHVzYi0+aW5kZXgpKTsKIAkJd2hpbGUgKHVzYmNfaGFpbnQudTMyKSB7CiAJCQlpbnQgY2hhbm5lbDsKIAogCQkJY2hhbm5lbCA9IF9fZmxzKHVzYmNfaGFpbnQudTMyKTsKLQkJCV9fY3ZteF91c2JfcG9sbF9jaGFubmVsKHVzYiwgY2hhbm5lbCk7CisJCQljdm14X3VzYl9wb2xsX2NoYW5uZWwodXNiLCBjaGFubmVsKTsKIAkJCXVzYmNfaGFpbnQudTMyIF49IDE8PGNoYW5uZWw7CiAJCX0KIAl9CiAKLQlfX2N2bXhfdXNiX3NjaGVkdWxlKHVzYiwgdXNiY19naW50c3RzLnMuc29mKTsKKwljdm14X3VzYl9zY2hlZHVsZSh1c2IsIHVzYmNfZ2ludHN0cy5zLnNvZik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM1MTAsNiArMzMzOCw3IEBACiAJc3RydWN0IG9jdGVvbl9oY2QgKnByaXYgPSBoY2RfdG9fb2N0ZW9uKGhjZCk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gaGNkLT5zZWxmLmNvbnRyb2xsZXI7CiAJc3RydWN0IGN2bXhfdXNiX3BvcnRfc3RhdHVzIHVzYl9wb3J0X3N0YXR1czsKKwlzdHJ1Y3QgY3ZteF91c2Jfc3RhdGUgKnVzYiA9ICZwcml2LT51c2I7CiAJaW50IHBvcnRfc3RhdHVzOwogCXN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTM2ODcsMTMgKzM1MTYsMTggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6CiAJCQlkZXZfZGJnKGRldiwgIiBQT1dFUlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCS8qCisJCQkgKiBQcm9ncmFtIHRoZSBwb3J0IHBvd2VyIGJpdCB0byBkcml2ZSBWQlVTIG9uIHRoZSBVU0IuCisJCQkgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQlVU0JfU0VUX0ZJRUxEMzIoQ1ZNWF9VU0JDWF9IUFJUKHVzYi0+aW5kZXgpLAorCQkJCQljdm14X3VzYmN4X2hwcnQsIHBydHB3ciwgMSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gMDsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX1JFU0VUOgogCQkJZGV2X2RiZyhkZXYsICIgUkVTRVRcbiIpOwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCWN2bXhfdXNiX2Rpc2FibGUoJnByaXYtPnVzYik7Ci0JCQlpZiAoY3ZteF91c2JfZW5hYmxlKCZwcml2LT51c2IpKQotCQkJCWRldl9kYmcoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSB0aGUgcG9ydFxuIik7CisJCQljdm14X3VzYl9yZXNldF9wb3J0KCZwcml2LT51c2IpOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIDA7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9JTkRJQ0FUT1I6CkBAIC0zNzQxLDcgKzM1NzUsNiBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CiAJc3RydWN0IG9jdGVvbl9oY2QgKnByaXY7CiAJc3RydWN0IHVzYl9oY2QgKmhjZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXUzMiBjbG9ja19yYXRlID0gNDgwMDAwMDA7CiAJYm9vbCBpc19jcnlzdGFsX2Nsb2NrID0gZmFsc2U7CiAJY29uc3QgY2hhciAqY2xvY2tfdHlwZTsKQEAgLTM4MzgsMjAgKzM2NzEsMzMgQEAKIAogCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKIAotCXN0YXR1cyA9IGN2bXhfdXNiX2luaXRpYWxpemUoJnByaXYtPnVzYiwgdXNiX251bSwgaW5pdGlhbGl6ZV9mbGFncyk7CisJcHJpdi0+dXNiLmluaXRfZmxhZ3MgPSBpbml0aWFsaXplX2ZsYWdzOworCisJLyogSW5pdGlhbGl6ZSB0aGUgVVNCIHN0YXRlIHN0cnVjdHVyZSAqLworCXByaXYtPnVzYi5pbmRleCA9IHVzYl9udW07CisJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnVzYi5pZGxlX3BpcGVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcml2LT51c2IuYWN0aXZlX3BpcGVzKTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmcHJpdi0+dXNiLmFjdGl2ZV9waXBlc1tpXSk7CisKKwkvKiBEdWUgdG8gYW4gZXJyYXRhLCBDTjMxWFggZG9lc24ndCBzdXBwb3J0IERNQSAqLworCWlmIChPQ1RFT05fSVNfTU9ERUwoT0NURU9OX0NOMzFYWCkpIHsKKwkJcHJpdi0+dXNiLmluaXRfZmxhZ3MgfD0gQ1ZNWF9VU0JfSU5JVElBTElaRV9GTEFHU19OT19ETUE7CisJCS8qIE9ubHkgdXNlIG9uZSBjaGFubmVsIHdpdGggbm9uIERNQSAqLworCQlwcml2LT51c2IuaWRsZV9oYXJkd2FyZV9jaGFubmVscyA9IDB4MTsKKwl9IGVsc2UgaWYgKE9DVEVPTl9JU19NT0RFTChPQ1RFT05fQ041WFhYKSkgeworCQkvKiBDTjVYWFggaGF2ZSBhbiBlcnJhdGEgd2l0aCBjaGFubmVsIDMgKi8KKwkJcHJpdi0+dXNiLmlkbGVfaGFyZHdhcmVfY2hhbm5lbHMgPSAweGY3OworCX0gZWxzZSB7CisJCXByaXYtPnVzYi5pZGxlX2hhcmR3YXJlX2NoYW5uZWxzID0gMHhmZjsKKwl9CisKKwlzdGF0dXMgPSBjdm14X3VzYl9pbml0aWFsaXplKGRldiwgJnByaXYtPnVzYik7CiAJaWYgKHN0YXR1cykgewogCQlkZXZfZGJnKGRldiwgIlVTQiBpbml0aWFsaXphdGlvbiBmYWlsZWQgd2l0aCAlZFxuIiwgc3RhdHVzKTsKIAkJa2ZyZWUoaGNkKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCS8qIFRoaXMgZGVsYXkgaXMgbmVlZGVkIGZvciBDTjMwMTAsIGJ1dCBJIGRvbid0IGtub3cgd2h5Li4uICovCi0JbWRlbGF5KDEwKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JY3ZteF91c2JfcG9sbCgmcHJpdi0+dXNiKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KIAlzdGF0dXMgPSB1c2JfYWRkX2hjZChoY2QsIGlycSwgMCk7CiAJaWYgKHN0YXR1cykgewogCQlkZXZfZGJnKGRldiwgIlVTQiBhZGQgSENEIGZhaWxlZCB3aXRoICVkXG4iLCBzdGF0dXMpOwpAQCAtMzg4NSw3ICszNzMxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgb2N0ZW9uX3VzYl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2N0ZW9uX3VzYl9tYXRjaFtdID0gewogCXsKIAkJLmNvbXBhdGlibGUgPSAiY2F2aXVtLG9jdGVvbi01NzUwLXVzYmMiLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmggYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uLXVzYi9vY3Rlb24taGNkLmgKaW5kZXggNDJmZTRmZS4uM2UzNTFhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi11c2Ivb2N0ZW9uLWhjZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24tdXNiL29jdGVvbi1oY2QuaApAQCAtNDcsNiArNDcsOCBAQAogI2lmbmRlZiBfX09DVEVPTl9IQ0RfSF9fCiAjZGVmaW5lIF9fT0NURU9OX0hDRF9IX18KIAorI2luY2x1ZGUgPGFzbS9iaXRmaWVsZC5oPgorCiAjZGVmaW5lIENWTVhfVVNCQ1hCQVNFIDB4MDAwMTZGMDAxMDAwMDAwMHVsbAogI2RlZmluZSBDVk1YX1VTQkNYUkVHMShyZWcsIGJpZCkgXAogCShDVk1YX0FERF9JT19TRUcoQ1ZNWF9VU0JDWEJBU0UgfCByZWcpICsgXApAQCAtMTQzLDEzICsxNDUsMTQgQEAKIAkgKgkqIDEnYjE6IFVubWFzayB0aGUgaW50ZXJydXB0IGFzc2VydGlvbiB0byB0aGUgYXBwbGljYXRpb24uCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfZ2FoYmNmZ19zIHsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfOV8zMQk6IDIzOwotCQl1aW50MzJfdCBwdHhmZW1wbHZsCTogMTsKLQkJdWludDMyX3QgbnB0eGZlbXBsdmwJOiAxOwotCQl1aW50MzJfdCByZXNlcnZlZF82XzYJOiAxOwotCQl1aW50MzJfdCBkbWFlbgkJOiAxOwotCQl1aW50MzJfdCBoYnN0bGVuCTogNDsKLQkJdWludDMyX3QgZ2xibGludHJtc2sJOiAxOworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzlfMzEJOiAyMywKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwdHhmZW1wbHZsCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBucHR4ZmVtcGx2bAk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfNl82CTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBkbWFlbgkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGhic3RsZW4JOiA0LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGdsYmxpbnRybXNrCTogMSwKKwkJOykpKSkpKSkKIAl9IHM7CiB9OwogCkBAIC0yMDksMTYgKzIxMiwxNyBAQAogCSAqCSogT3RoZXJzOiBSZXNlcnZlZAogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2dod2NmZzNfcyB7Ci0JCXVpbnQzMl90IGRmaWZvZGVwdGgJCQkJOiAxNjsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTNfMTUJCQkJOiAzOwotCQl1aW50MzJfdCBhaGJwaHlzeW5jCQkJCTogMTsKLQkJdWludDMyX3QgcnN0dHlwZQkJCQk6IDE7Ci0JCXVpbnQzMl90IG9wdGZlYXR1cmUJCQkJOiAxOwotCQl1aW50MzJfdCB2ZW5kb3JfY29udHJvbF9pbnRlcmZhY2Vfc3VwcG9ydAk6IDE7Ci0JCXVpbnQzMl90IGkyY19zZWxlY3Rpb24JCQkJOiAxOwotCQl1aW50MzJfdCBvdGdlbgkJCQkJOiAxOwotCQl1aW50MzJfdCBwa3RzaXpld2lkdGgJCQkJOiAzOwotCQl1aW50MzJfdCB4ZmVyc2l6ZXdpZHRoCQkJCTogNDsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBkZmlmb2RlcHRoCQkJOiAxNiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8xM18xNQkJOiAzLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGFoYnBoeXN5bmMJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcnN0dHlwZQkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBvcHRmZWF0dXJlCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHZlbmRvcl9jb250cm9sX2ludGVyZmFjZV9zdXBwb3J0IDogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBpMmNfc2VsZWN0aW9uCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG90Z2VuCQkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwa3RzaXpld2lkdGgJCQk6IDMsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgeGZlcnNpemV3aWR0aAkJCTogNCwKKwkJOykpKSkpKSkpKSkKIAl9IHM7CiB9OwogCkBAIC0yNzUsMzggKzI3OSwzOSBAQAogCSAqIEBtb2RlbWlzbXNrOiBNb2RlIE1pc21hdGNoIEludGVycnVwdCBNYXNrIChNb2RlTWlzTXNrKQogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2dpbnRtc2tfcyB7Ci0JCXVpbnQzMl90IHdrdXBpbnRtc2sJCTogMTsKLQkJdWludDMyX3Qgc2Vzc3JlcWludG1zawkJOiAxOwotCQl1aW50MzJfdCBkaXNjb25uaW50bXNrCQk6IDE7Ci0JCXVpbnQzMl90IGNvbmlkc3RzY2huZ21zawk6IDE7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzI3XzI3CQk6IDE7Ci0JCXVpbnQzMl90IHB0eGZlbXBtc2sJCTogMTsKLQkJdWludDMyX3QgaGNoaW50bXNrCQk6IDE7Ci0JCXVpbnQzMl90IHBydGludG1zawkJOiAxOwotCQl1aW50MzJfdCByZXNlcnZlZF8yM18yMwkJOiAxOwotCQl1aW50MzJfdCBmZXRzdXNwbXNrCQk6IDE7Ci0JCXVpbnQzMl90IGluY29tcGxwbXNrCQk6IDE7Ci0JCXVpbnQzMl90IGluY29tcGlzb2lubXNrCQk6IDE7Ci0JCXVpbnQzMl90IG9lcGludG1zawkJOiAxOwotCQl1aW50MzJfdCBpbmVwaW50bXNrCQk6IDE7Ci0JCXVpbnQzMl90IGVwbWlzbXNrCQk6IDE7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzE2XzE2CQk6IDE7Ci0JCXVpbnQzMl90IGVvcGZtc2sJCTogMTsKLQkJdWludDMyX3QgaXNvb3V0ZHJvcG1zawkJOiAxOwotCQl1aW50MzJfdCBlbnVtZG9uZW1zawkJOiAxOwotCQl1aW50MzJfdCB1c2Jyc3Rtc2sJCTogMTsKLQkJdWludDMyX3QgdXNic3VzcG1zawkJOiAxOwotCQl1aW50MzJfdCBlcmx5c3VzcG1zawkJOiAxOwotCQl1aW50MzJfdCBpMmNpbnQJCQk6IDE7Ci0JCXVpbnQzMl90IHVscGlja2ludG1zawkJOiAxOwotCQl1aW50MzJfdCBnb3V0bmFrZWZmbXNrCQk6IDE7Ci0JCXVpbnQzMl90IGdpbm5ha2VmZm1zawkJOiAxOwotCQl1aW50MzJfdCBucHR4ZmVtcG1zawkJOiAxOwotCQl1aW50MzJfdCByeGZsdmxtc2sJCTogMTsKLQkJdWludDMyX3Qgc29mbXNrCQkJOiAxOwotCQl1aW50MzJfdCBvdGdpbnRtc2sJCTogMTsKLQkJdWludDMyX3QgbW9kZW1pc21zawkJOiAxOwotCQl1aW50MzJfdCByZXNlcnZlZF8wXzAJCTogMTsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB3a3VwaW50bXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgc2Vzc3JlcWludG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGRpc2Nvbm5pbnRtc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBjb25pZHN0c2Nobmdtc2sJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzI3XzI3CTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwdHhmZW1wbXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaGNoaW50bXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcHJ0aW50bXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMjNfMjMJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGZldHN1c3Btc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBpbmNvbXBscG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGluY29tcGlzb2lubXNrCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBvZXBpbnRtc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBpbmVwaW50bXNrCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZXBtaXNtc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8xNl8xNgk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZW9wZm1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGlzb291dGRyb3Btc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBlbnVtZG9uZW1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHVzYnJzdG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHVzYnN1c3Btc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBlcmx5c3VzcG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGkyY2ludAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHVscGlja2ludG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGdvdXRuYWtlZmZtc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBnaW5uYWtlZmZtc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBucHR4ZmVtcG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJ4Zmx2bG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHNvZm1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG90Z2ludG1zawkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG1vZGVtaXNtc2sJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8wXzAJCTogMSwKKwkJOykpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpCiAJfSBzOwogfTsKIApAQCAtNTA0LDM4ICs1MDksMzkgQEAKIAkgKgkqIDEnYjE6IEhvc3QgbW9kZQogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2dpbnRzdHNfcyB7Ci0JCXVpbnQzMl90IHdrdXBpbnQJOiAxOwotCQl1aW50MzJfdCBzZXNzcmVxaW50CTogMTsKLQkJdWludDMyX3QgZGlzY29ubmludAk6IDE7Ci0JCXVpbnQzMl90IGNvbmlkc3RzY2huZwk6IDE7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzI3XzI3CTogMTsKLQkJdWludDMyX3QgcHR4ZmVtcAk6IDE7Ci0JCXVpbnQzMl90IGhjaGludAkJOiAxOwotCQl1aW50MzJfdCBwcnRpbnQJCTogMTsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMjNfMjMJOiAxOwotCQl1aW50MzJfdCBmZXRzdXNwCTogMTsKLQkJdWludDMyX3QgaW5jb21wbHAJOiAxOwotCQl1aW50MzJfdCBpbmNvbXBpc29pbgk6IDE7Ci0JCXVpbnQzMl90IG9lcGludAkJOiAxOwotCQl1aW50MzJfdCBpZXBpbnQJCTogMTsKLQkJdWludDMyX3QgZXBtaXMJCTogMTsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTZfMTYJOiAxOwotCQl1aW50MzJfdCBlb3BmCQk6IDE7Ci0JCXVpbnQzMl90IGlzb291dGRyb3AJOiAxOwotCQl1aW50MzJfdCBlbnVtZG9uZQk6IDE7Ci0JCXVpbnQzMl90IHVzYnJzdAkJOiAxOwotCQl1aW50MzJfdCB1c2JzdXNwCTogMTsKLQkJdWludDMyX3QgZXJseXN1c3AJOiAxOwotCQl1aW50MzJfdCBpMmNpbnQJCTogMTsKLQkJdWludDMyX3QgdWxwaWNraW50CTogMTsKLQkJdWludDMyX3QgZ291dG5ha2VmZgk6IDE7Ci0JCXVpbnQzMl90IGdpbm5ha2VmZgk6IDE7Ci0JCXVpbnQzMl90IG5wdHhmZW1wCTogMTsKLQkJdWludDMyX3QgcnhmbHZsCQk6IDE7Ci0JCXVpbnQzMl90IHNvZgkJOiAxOwotCQl1aW50MzJfdCBvdGdpbnQJCTogMTsKLQkJdWludDMyX3QgbW9kZW1pcwk6IDE7Ci0JCXVpbnQzMl90IGN1cm1vZAkJOiAxOworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHdrdXBpbnQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBzZXNzcmVxaW50CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZGlzY29ubmludAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGNvbmlkc3RzY2huZwkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzI3XzI3CTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwdHhmZW1wCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaGNoaW50CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcHJ0aW50CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMjNfMjMJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGZldHN1c3AJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBpbmNvbXBscAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGluY29tcGlzb2luCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgb2VwaW50CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaWVwaW50CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZXBtaXMJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMTZfMTYJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGVvcGYJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaXNvb3V0ZHJvcAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGVudW1kb25lCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdXNicnN0CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdXNic3VzcAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGVybHlzdXNwCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaTJjaW50CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdWxwaWNraW50CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZ291dG5ha2VmZgkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGdpbm5ha2VmZgkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG5wdHhmZW1wCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcnhmbHZsCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgc29mCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG90Z2ludAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG1vZGVtaXMJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBjdXJtb2QJCTogMSwKKwkJOykpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpCiAJfSBzOwogfTsKIApAQCAtNTYwLDggKzU2Niw5IEBACiAJICoJVHJhbnNtaXQgRklGTyBSQU0uCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfZ25wdHhmc2l6X3MgewotCQl1aW50MzJfdCBucHR4ZmRlcAk6IDE2OwotCQl1aW50MzJfdCBucHR4ZnN0YWRkcgk6IDE2OworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG5wdHhmZGVwCTogMTYsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbnB0eGZzdGFkZHIJOiAxNiwKKwkJOykpCiAJfSBzOwogfTsKIApAQCAtNjEwLDEwICs2MTcsMTEgQEAKIAkgKgkqIE90aGVyczogUmVzZXJ2ZWQKIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JjeF9nbnB0eHN0c19zIHsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMzFfMzEJOiAxOwotCQl1aW50MzJfdCBucHR4cXRvcAk6IDc7Ci0JCXVpbnQzMl90IG5wdHhxc3BjYXZhaWwJOiA4OwotCQl1aW50MzJfdCBucHR4ZnNwY2F2YWlsCTogMTY7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMzFfMzEJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG5wdHhxdG9wCQk6IDcsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgbnB0eHFzcGNhdmFpbAkJOiA4LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG5wdHhmc3BjYXZhaWwJCTogMTYsCisJCTspKSkpCiAJfSBzOwogfTsKIApAQCAtNzMxLDE2ICs3MzksMTcgQEAKIAkgKglzZWxlY3RlZCwgdGhlIFBIWSBkb21haW4gaGFzIHRvIGJlIHJlc2V0IGZvciBwcm9wZXIgb3BlcmF0aW9uLgogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2dyc3RjdGxfcyB7Ci0JCXVpbnQzMl90IGFoYmlkbGUJOiAxOwotCQl1aW50MzJfdCBkbWFyZXEJCTogMTsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTFfMjkJOiAxOTsKLQkJdWludDMyX3QgdHhmbnVtCQk6IDU7Ci0JCXVpbnQzMl90IHR4ZmZsc2gJOiAxOwotCQl1aW50MzJfdCByeGZmbHNoCTogMTsKLQkJdWludDMyX3QgaW50a25xZmxzaAk6IDE7Ci0JCXVpbnQzMl90IGZybWNudHJyc3QJOiAxOwotCQl1aW50MzJfdCBoc2Z0cnN0CTogMTsKLQkJdWludDMyX3QgY3NmdHJzdAk6IDE7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgYWhiaWRsZQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGRtYXJlcQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzExXzI5CTogMTksCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdHhmbnVtCQk6IDUsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdHhmZmxzaAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJ4ZmZsc2gJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBpbnRrbnFmbHNoCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZnJtY250cnJzdAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGhzZnRyc3QJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBjc2Z0cnN0CQk6IDEsCisJCTspKSkpKSkpKSkpCiAJfSBzOwogfTsKIApAQCAtNzYyLDggKzc3MSw5IEBACiAJICoJKiBNYXhpbXVtIHZhbHVlIGlzIDMyNzY4CiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfZ3J4ZnNpel9zIHsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTZfMzEJOiAxNjsKLQkJdWludDMyX3QgcnhmZGVwCQk6IDE2OworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzE2XzMxCTogMTYsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcnhmZGVwCQk6IDE2LAorCQk7KSkKIAl9IHM7CiB9OwogCkBAIC04MDQsMTEgKzgxNCwxMiBAQAogCSAqCXBhY2tldCBiZWxvbmdzLgogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2dyeHN0c3BoX3MgewotCQl1aW50MzJfdCByZXNlcnZlZF8yMV8zMQk6IDExOwotCQl1aW50MzJfdCBwa3RzdHMJCTogNDsKLQkJdWludDMyX3QgZHBpZAkJOiAyOwotCQl1aW50MzJfdCBiY250CQk6IDExOwotCQl1aW50MzJfdCBjaG51bQkJOiA0OworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzIxXzMxCTogMTEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcGt0c3RzCQk6IDQsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZHBpZAkJCTogMiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBiY250CQkJOiAxMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBjaG51bQkJCTogNCwKKwkJOykpKSkpCiAJfSBzOwogfTsKIApAQCAtODg0LDE5ICs4OTUsMjAgQEAKIAkgKgkqIE9uZSA0OC1NSHogUEhZIGNsb2NrID0gMC4yNSBiaXQgdGltZXMKIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JjeF9ndXNiY2ZnX3MgewotCQl1aW50MzJfdCByZXNlcnZlZF8xN18zMQk6IDE1OwotCQl1aW50MzJfdCBvdGdpMmNzZWwJOiAxOwotCQl1aW50MzJfdCBwaHlscHdyY2xrc2VsCTogMTsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTRfMTQJOiAxOwotCQl1aW50MzJfdCB1c2J0cmR0aW0JOiA0OwotCQl1aW50MzJfdCBobnBjYXAJCTogMTsKLQkJdWludDMyX3Qgc3JwY2FwCQk6IDE7Ci0JCXVpbnQzMl90IGRkcnNlbAkJOiAxOwotCQl1aW50MzJfdCBwaHlzZWwJCTogMTsKLQkJdWludDMyX3QgZnNpbnRmCQk6IDE7Ci0JCXVpbnQzMl90IHVscGlfdXRtaV9zZWwJOiAxOwotCQl1aW50MzJfdCBwaHlpZgkJOiAxOwotCQl1aW50MzJfdCB0b3V0Y2FsCTogMzsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8xN18zMQk6IDE1LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG90Z2kyY3NlbAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBoeWxwd3JjbGtzZWwJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8xNF8xNAk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdXNidHJkdGltCQk6IDQsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaG5wY2FwCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgc3JwY2FwCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZGRyc2VsCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcGh5c2VsCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZnNpbnRmCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgdWxwaV91dG1pX3NlbAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBoeWlmCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHRvdXRjYWwJCTogMywKKwkJOykpKSkpKSkpKSkpKSkKIAl9IHM7CiB9OwogCkBAIC05MjAsOCArOTMyLDkgQEAKIAkgKglPbmUgYml0IHBlciBjaGFubmVsOiBCaXQgMCBmb3IgQ2hhbm5lbCAwLCBiaXQgMTUgZm9yIENoYW5uZWwgMTUKIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JjeF9oYWludF9zIHsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTZfMzEJOiAxNjsKLQkJdWludDMyX3QgaGFpbnQJCTogMTY7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMTZfMzEJOiAxNiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBoYWludAkJCTogMTYsCisJCTspKQogCX0gczsKIH07CiAKQEAgLTk0NCw4ICs5NTcsOSBAQAogCSAqCU9uZSBiaXQgcGVyIGNoYW5uZWw6IEJpdCAwIGZvciBjaGFubmVsIDAsIGJpdCAxNSBmb3IgY2hhbm5lbCAxNQogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2hhaW50bXNrX3MgewotCQl1aW50MzJfdCByZXNlcnZlZF8xNl8zMQk6IDE2OwotCQl1aW50MzJfdCBoYWludG1zawk6IDE2OworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzE2XzMxCTogMTYsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgaGFpbnRtc2sJCTogMTYsCisJCTspKQogCX0gczsKIH07CiAKQEAgLTEwMTQsMTcgKzEwMjgsMTggQEAKIAkgKglJbmRpY2F0ZXMgdGhlIG1heGltdW0gcGFja2V0IHNpemUgb2YgdGhlIGFzc29jaWF0ZWQgZW5kcG9pbnQuCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfaGNjaGFyeF9zIHsKLQkJdWludDMyX3QgY2hlbmEJCTogMTsKLQkJdWludDMyX3QgY2hkaXMJCTogMTsKLQkJdWludDMyX3Qgb2RkZnJtCQk6IDE7Ci0JCXVpbnQzMl90IGRldmFkZHIJOiA3OwotCQl1aW50MzJfdCBlYwkJOiAyOwotCQl1aW50MzJfdCBlcHR5cGUJCTogMjsKLQkJdWludDMyX3QgbHNwZGRldgk6IDE7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzE2XzE2CTogMTsKLQkJdWludDMyX3QgZXBkaXIJCTogMTsKLQkJdWludDMyX3QgZXBudW0JCTogNDsKLQkJdWludDMyX3QgbXBzCQk6IDExOworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGNoZW5hCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGNoZGlzCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG9kZGZybQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGRldmFkZHIJCTogNywKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBlYwkJCTogMiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBlcHR5cGUJCTogMiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBsc3BkZGV2CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMTZfMTYJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGVwZGlyCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGVwbnVtCQkJOiA0LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG1wcwkJCTogMTEsCisJCTspKSkpKSkpKSkpKQogCX0gczsKIH07CiAKQEAgLTEwNjksOSArMTA4NCwxMCBAQAogCSAqCSogMidiMTE6IFJlc2VydmVkCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfaGNmZ19zIHsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfM18zMQk6IDI5OwotCQl1aW50MzJfdCBmc2xzc3VwcAk6IDE7Ci0JCXVpbnQzMl90IGZzbHNwY2xrc2VsCTogMjsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8zXzMxCTogMjksCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZnNsc3N1cHAJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGZzbHNwY2xrc2VsCTogMiwKKwkJOykpKQogCX0gczsKIH07CiAKQEAgLTExMTAsMTggKzExMjYsMTkgQEAKIAkgKglUcmFuc2ZlciBjb21wbGV0ZWQgbm9ybWFsbHkgd2l0aG91dCBhbnkgZXJyb3JzLgogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2hjaW50eF9zIHsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTFfMzEJOiAyMTsKLQkJdWludDMyX3QgZGF0YXRnbGVycgk6IDE7Ci0JCXVpbnQzMl90IGZybW92cnVuCTogMTsKLQkJdWludDMyX3QgYmJsZXJyCQk6IDE7Ci0JCXVpbnQzMl90IHhhY3RlcnIJOiAxOwotCQl1aW50MzJfdCBueWV0CQk6IDE7Ci0JCXVpbnQzMl90IGFjawkJOiAxOwotCQl1aW50MzJfdCBuYWsJCTogMTsKLQkJdWludDMyX3Qgc3RhbGwJCTogMTsKLQkJdWludDMyX3QgYWhiZXJyCQk6IDE7Ci0JCXVpbnQzMl90IGNoaGx0ZAkJOiAxOwotCQl1aW50MzJfdCB4ZmVyY29tcGwJOiAxOworCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzExXzMxCTogMjEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZGF0YXRnbGVycgkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGZybW92cnVuCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgYmJsZXJyCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgeGFjdGVycgkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG55ZXQJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgYWNrCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG5hawkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBzdGFsbAkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBhaGJlcnIJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBjaGhsdGQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB4ZmVyY29tcGwJCTogMSwKKwkJOykpKSkpKSkpKSkpKQogCX0gczsKIH07CiAKQEAgLTExNTEsMTggKzExNjgsMTkgQEAKIAkgKiBAeGZlcmNvbXBsbXNrOiBUcmFuc2ZlciBDb21wbGV0ZWQgTWFzayAoWGZlckNvbXBsTXNrKQogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2hjaW50bXNreF9zIHsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTFfMzEJOiAyMTsKLQkJdWludDMyX3QgZGF0YXRnbGVycm1zawk6IDE7Ci0JCXVpbnQzMl90IGZybW92cnVubXNrCTogMTsKLQkJdWludDMyX3QgYmJsZXJybXNrCTogMTsKLQkJdWludDMyX3QgeGFjdGVycm1zawk6IDE7Ci0JCXVpbnQzMl90IG55ZXRtc2sJOiAxOwotCQl1aW50MzJfdCBhY2ttc2sJCTogMTsKLQkJdWludDMyX3QgbmFrbXNrCQk6IDE7Ci0JCXVpbnQzMl90IHN0YWxsbXNrCTogMTsKLQkJdWludDMyX3QgYWhiZXJybXNrCTogMTsKLQkJdWludDMyX3QgY2hobHRkbXNrCTogMTsKLQkJdWludDMyX3QgeGZlcmNvbXBsbXNrCTogMTsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8xMV8zMQkJOiAyMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBkYXRhdGdsZXJybXNrCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGZybW92cnVubXNrCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGJibGVycm1zawkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB4YWN0ZXJybXNrCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG55ZXRtc2sJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgYWNrbXNrCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IG5ha21zawkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBzdGFsbG1zawkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBhaGJlcnJtc2sJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgY2hobHRkbXNrCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHhmZXJjb21wbG1zawkJCTogMSwKKwkJOykpKSkpKSkpKSkpKQogCX0gczsKIH07CiAKQEAgLTEyMDEsMTIgKzEyMTksMTMgQEAKIAkgKgl0cmFuc2xhdG9yLgogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2hjc3BsdHhfcyB7Ci0JCXVpbnQzMl90IHNwbHRlbmEJOiAxOwotCQl1aW50MzJfdCByZXNlcnZlZF8xN18zMAk6IDE0OwotCQl1aW50MzJfdCBjb21wc3BsdAk6IDE7Ci0JCXVpbnQzMl90IHhhY3Rwb3MJOiAyOwotCQl1aW50MzJfdCBodWJhZGRyCTogNzsKLQkJdWludDMyX3QgcHJ0YWRkcgk6IDc7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3Qgc3BsdGVuYQkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCByZXNlcnZlZF8xN18zMAkJOiAxNCwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBjb21wc3BsdAkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB4YWN0cG9zCQkJOiAyLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IGh1YmFkZHIJCQk6IDcsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcHJ0YWRkcgkJCTogNywKKwkJOykpKSkpKQogCX0gczsKIH07CiAKQEAgLTEyNDYsMTAgKzEyNjUsMTEgQEAKIAkgKglzaXplIGZvciBJTiB0cmFuc2FjdGlvbnMgKHBlcmlvZGljIGFuZCBub24tcGVyaW9kaWMpLgogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2hjdHNpenhfcyB7Ci0JCXVpbnQzMl90IGRvcG5nCQk6IDE7Ci0JCXVpbnQzMl90IHBpZAkJOiAyOwotCQl1aW50MzJfdCBwa3RjbnQJCTogMTA7Ci0JCXVpbnQzMl90IHhmZXJzaXplCTogMTk7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZG9wbmcJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcGlkCQkJOiAyLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBrdGNudAkJOiAxMCwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCB4ZmVyc2l6ZQkJOiAxOSwKKwkJOykpKSkKIAl9IHM7CiB9OwogCkBAIC0xMjgzLDggKzEzMDMsOSBAQAogCSAqCSogMSBtcyAoUEhZIGNsb2NrIGZyZXF1ZW5jeSBmb3IgRlMvTFMpCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfaGZpcl9zIHsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTZfMzEJOiAxNjsKLQkJdWludDMyX3QgZnJpbnQJCTogMTY7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMTZfMzEJCTogMTYsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgZnJpbnQJCQkJOiAxNiwKKwkJOykpCiAJfSBzOwogfTsKIApAQCAtMTMxMiw4ICsxMzMzLDkgQEAKIAkgKglVU0IsIGFuZCBpcyByZXNldCB0byAwIHdoZW4gaXQgcmVhY2hlcyAxNidoM0ZGRi4KIAkgKi8KIAlzdHJ1Y3QgY3ZteF91c2JjeF9oZm51bV9zIHsKLQkJdWludDMyX3QgZnJyZW0JOiAxNjsKLQkJdWludDMyX3QgZnJudW0JOiAxNjsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBmcnJlbQkJOiAxNiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBmcm51bQkJOiAxNiwKKwkJOykpCiAJfSBzOwogfTsKIApAQCAtMTQzOSwyMSArMTQ2MSwyMiBAQAogCSAqCSogMTogQSBkZXZpY2UgaXMgYXR0YWNoZWQgdG8gdGhlIHBvcnQuCiAJICovCiAJc3RydWN0IGN2bXhfdXNiY3hfaHBydF9zIHsKLQkJdWludDMyX3QgcmVzZXJ2ZWRfMTlfMzEJOiAxMzsKLQkJdWludDMyX3QgcHJ0c3BkCQk6IDI7Ci0JCXVpbnQzMl90IHBydHRzdGN0bAk6IDQ7Ci0JCXVpbnQzMl90IHBydHB3cgkJOiAxOwotCQl1aW50MzJfdCBwcnRsbnN0cwk6IDI7Ci0JCXVpbnQzMl90IHJlc2VydmVkXzlfOQk6IDE7Ci0JCXVpbnQzMl90IHBydHJzdAkJOiAxOwotCQl1aW50MzJfdCBwcnRzdXNwCTogMTsKLQkJdWludDMyX3QgcHJ0cmVzCQk6IDE7Ci0JCXVpbnQzMl90IHBydG92cmN1cnJjaG5nCTogMTsKLQkJdWludDMyX3QgcHJ0b3ZyY3VycmFjdAk6IDE7Ci0JCXVpbnQzMl90IHBydGVuY2huZwk6IDE7Ci0JCXVpbnQzMl90IHBydGVuYQkJOiAxOwotCQl1aW50MzJfdCBwcnRjb25uZGV0CTogMTsKLQkJdWludDMyX3QgcHJ0Y29ubnN0cwk6IDE7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcmVzZXJ2ZWRfMTlfMzEJOiAxMywKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwcnRzcGQJCTogMiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwcnR0c3RjdGwJCTogNCwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwcnRwd3IJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwcnRsbnN0cwkJOiAyLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHJlc2VydmVkXzlfOQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydHJzdAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydHN1c3AJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwcnRyZXMJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwcnRvdnJjdXJyY2huZwk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcHJ0b3ZyY3VycmFjdAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydGVuY2huZwkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydGVuYQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHBydGNvbm5kZXQJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwcnRjb25uc3RzCQk6IDEsCisJCTspKSkpKSkpKSkpKSkpKSkKIAl9IHM7CiB9OwogCkBAIC0xNDc2LDggKzE0OTksOSBAQAogCSAqIEBwdHhmc3RhZGRyOiBIb3N0IFBlcmlvZGljIFR4RklGTyBTdGFydCBBZGRyZXNzIChQVHhGU3RBZGRyKQogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2hwdHhmc2l6X3MgewotCQl1aW50MzJfdCBwdHhmc2l6ZQk6IDE2OwotCQl1aW50MzJfdCBwdHhmc3RhZGRyCTogMTY7CisJCV9fQklURklFTERfRklFTEQodWludDMyX3QgcHR4ZnNpemUJOiAxNiwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwdHhmc3RhZGRyCTogMTYsCisJCTspKQogCX0gczsKIH07CiAKQEAgLTE1MzEsOSArMTU1NSwxMCBAQAogCSAqCSogT3RoZXJzOiBSZXNlcnZlZAogCSAqLwogCXN0cnVjdCBjdm14X3VzYmN4X2hwdHhzdHNfcyB7Ci0JCXVpbnQzMl90IHB0eHF0b3AJOiA4OwotCQl1aW50MzJfdCBwdHhxc3BjYXZhaWwJOiA4OwotCQl1aW50MzJfdCBwdHhmc3BjYXZhaWwJOiAxNjsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwdHhxdG9wCTogOCwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50MzJfdCBwdHhxc3BjYXZhaWwJOiA4LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQzMl90IHB0eGZzcGNhdmFpbAk6IDE2LAorCQk7KSkpCiAJfSBzOwogfTsKIApAQCAtMTYzNiwyMSArMTY2MSwyMiBAQAogCSAqCXVudGlsIEFGVEVSIHRoaXMgZmllbGQgaXMgc2V0IGFuZCB0aGVuIHJlYWQuCiAJICovCiAJc3RydWN0IGN2bXhfdXNibnhfY2xrX2N0bF9zIHsKLQkJdWludDY0X3QgcmVzZXJ2ZWRfMjBfNjMJOiA0NDsKLQkJdWludDY0X3QgZGl2aWRlMgk6IDI7Ci0JCXVpbnQ2NF90IGhjbGtfcnN0CTogMTsKLQkJdWludDY0X3QgcF94X29uCQk6IDE7Ci0JCXVpbnQ2NF90IHBfcnR5cGUJOiAyOwotCQl1aW50NjRfdCBwX2NvbV9vbgk6IDE7Ci0JCXVpbnQ2NF90IHBfY19zZWwJOiAyOwotCQl1aW50NjRfdCBjZGl2X2J5cAk6IDE7Ci0JCXVpbnQ2NF90IHNkX21vZGUJOiAyOwotCQl1aW50NjRfdCBzX2Jpc3QJCTogMTsKLQkJdWludDY0X3QgcG9yCQk6IDE7Ci0JCXVpbnQ2NF90IGVuYWJsZQkJOiAxOwotCQl1aW50NjRfdCBwcnN0CQk6IDE7Ci0JCXVpbnQ2NF90IGhyc3QJCTogMTsKLQkJdWludDY0X3QgZGl2aWRlCQk6IDM7CisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgcmVzZXJ2ZWRfMjBfNjMJOiA0NCwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBkaXZpZGUyCQk6IDIsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgaGNsa19yc3QJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBwX3hfb24JCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBwX3J0eXBlCQk6IDIsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgcF9jb21fb24JCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBwX2Nfc2VsCQk6IDIsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgY2Rpdl9ieXAJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBzZF9tb2RlCQk6IDIsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3Qgc19iaXN0CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgcG9yCQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGVuYWJsZQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHByc3QJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgaHJzdAkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBkaXZpZGUJCTogMywKKwkJOykpKSkpKSkpKSkpKSkpKQogCX0gczsKIH07CiAKQEAgLTE3NzgsNDEgKzE4MDQsNDIgQEAKIAkgKglkZS1hc3NlcnRpb24uCiAJICovCiAJc3RydWN0IGN2bXhfdXNibnhfdXNicF9jdGxfc3RhdHVzX3MgewotCQl1aW50NjRfdCB0eHJpc2V0dW5lCQk6IDE7Ci0JCXVpbnQ2NF90IHR4dnJlZnR1bmUJCTogNDsKLQkJdWludDY0X3QgdHhmc2xzdHVuZQkJOiA0OwotCQl1aW50NjRfdCB0eGhzeHZ0dW5lCQk6IDI7Ci0JCXVpbnQ2NF90IHNxcnh0dW5lCQk6IDM7Ci0JCXVpbnQ2NF90IGNvbXBkaXN0dW5lCQk6IDM7Ci0JCXVpbnQ2NF90IG90Z3R1bmUJCTogMzsKLQkJdWludDY0X3Qgb3RnZGlzYWJsZQkJOiAxOwotCQl1aW50NjRfdCBwb3J0cmVzZXQJCTogMTsKLQkJdWludDY0X3QgZHJ2dmJ1cwkJOiAxOwotCQl1aW50NjRfdCBsc2Jpc3QJCQk6IDE7Ci0JCXVpbnQ2NF90IGZzYmlzdAkJCTogMTsKLQkJdWludDY0X3QgaHNiaXN0CQkJOiAxOwotCQl1aW50NjRfdCBiaXN0X2RvbmUJCTogMTsKLQkJdWludDY0X3QgYmlzdF9lcnIJCTogMTsKLQkJdWludDY0X3QgdGRhdGFfb3V0CQk6IDQ7Ci0JCXVpbnQ2NF90IHNpZGRxCQkJOiAxOwotCQl1aW50NjRfdCB0eHByZWVtcGhhc2lzdHVuZQk6IDE7Ci0JCXVpbnQ2NF90IGRtYV9ibW9kZQkJOiAxOwotCQl1aW50NjRfdCB1c2JjX2VuZAkJOiAxOwotCQl1aW50NjRfdCB1c2JwX2Jpc3QJCTogMTsKLQkJdWludDY0X3QgdGNsawkJCTogMTsKLQkJdWludDY0X3QgZHBfcHVsbGQJCTogMTsKLQkJdWludDY0X3QgZG1fcHVsbGQJCTogMTsKLQkJdWludDY0X3QgaHN0X21vZGUJCTogMTsKLQkJdWludDY0X3QgdHVuaW5nCQkJOiA0OwotCQl1aW50NjRfdCB0eF9ic19lbmgJCTogMTsKLQkJdWludDY0X3QgdHhfYnNfZW4JCTogMTsKLQkJdWludDY0X3QgbG9vcF9lbmIJCTogMTsKLQkJdWludDY0X3QgdnRlc3RfZW5iCQk6IDE7Ci0JCXVpbnQ2NF90IGJpc3RfZW5iCQk6IDE7Ci0JCXVpbnQ2NF90IHRkYXRhX3NlbAkJOiAxOwotCQl1aW50NjRfdCB0YWRkcl9pbgkJOiA0OwotCQl1aW50NjRfdCB0ZGF0YV9pbgkJOiA4OwotCQl1aW50NjRfdCBhdGVfcmVzZXQJCTogMTsKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB0eHJpc2V0dW5lCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgdHh2cmVmdHVuZQkJOiA0LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHR4ZnNsc3R1bmUJCTogNCwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB0eGhzeHZ0dW5lCQk6IDIsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3Qgc3FyeHR1bmUJCTogMywKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBjb21wZGlzdHVuZQkJOiAzLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IG90Z3R1bmUJCTogMywKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBvdGdkaXNhYmxlCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgcG9ydHJlc2V0CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgZHJ2dmJ1cwkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGxzYmlzdAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGZzYmlzdAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGhzYmlzdAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGJpc3RfZG9uZQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGJpc3RfZXJyCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgdGRhdGFfb3V0CQk6IDQsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3Qgc2lkZHEJCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgdHhwcmVlbXBoYXNpc3R1bmUJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGRtYV9ibW9kZQkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHVzYmNfZW5kCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgdXNicF9iaXN0CQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgdGNsawkJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCBkcF9wdWxsZAkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGRtX3B1bGxkCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgaHN0X21vZGUJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB0dW5pbmcJCTogNCwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB0eF9ic19lbmgJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB0eF9ic19lbgkJOiAxLAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IGxvb3BfZW5iCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgdnRlc3RfZW5iCQk6IDEsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgYmlzdF9lbmIJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB0ZGF0YV9zZWwJCTogMSwKKwkJX19CSVRGSUVMRF9GSUVMRCh1aW50NjRfdCB0YWRkcl9pbgkJOiA0LAorCQlfX0JJVEZJRUxEX0ZJRUxEKHVpbnQ2NF90IHRkYXRhX2luCQk6IDgsCisJCV9fQklURklFTERfRklFTEQodWludDY0X3QgYXRlX3Jlc2V0CQk6IDEsCisJCTspKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKSkpKQogCX0gczsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMKaW5kZXggZWJmYTljOS4uNDBkYWIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC1tZGlvLmMKQEAgLTEzMCwxOSArMTMwLDYgQEAKIAl9CiB9CiAKLXZvaWQgY3ZtX29jdF9zZXRfY2FycmllcihzdHJ1Y3Qgb2N0ZW9uX2V0aGVybmV0ICpwcml2LAotCQkJIGN2bXhfaGVscGVyX2xpbmtfaW5mb190IGxpbmtfaW5mbykKLXsKLQljdm1fb2N0X25vdGVfY2Fycmllcihwcml2LCBsaW5rX2luZm8pOwotCWlmIChsaW5rX2luZm8ucy5saW5rX3VwKSB7Ci0JCWlmICghbmV0aWZfY2Fycmllcl9vayhwcml2LT5uZXRkZXYpKQotCQkJbmV0aWZfY2Fycmllcl9vbihwcml2LT5uZXRkZXYpOwotCX0gZWxzZSB7Ci0JCWlmIChuZXRpZl9jYXJyaWVyX29rKHByaXYtPm5ldGRldikpCi0JCQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwotCX0KLX0KLQogdm9pZCBjdm1fb2N0X2FkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG9jdGVvbl9ldGhlcm5ldCAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LW1kaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5oCmluZGV4IGVjY2ZjYzUuLjYxOTFiMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQtbWRpby5oCkBAIC00MCw1ICs0MCw4IEBACiAjZW5kaWYgLyogQ09ORklHX1hGUk0gKi8KIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBjdm1fb2N0X2V0aHRvb2xfb3BzOworCitleHRlcm4gdm9pZCBvY3Rlb25fbWRpb2J1c19mb3JjZV9tb2RfZGVwZW5jZW5jeSh2b2lkKTsKKwogaW50IGN2bV9vY3RfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICpycSwgaW50IGNtZCk7CiBpbnQgY3ZtX29jdF9waHlfc2V0dXBfZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jIGIvZHJpdmVycy9zdGFnaW5nL29jdGVvbi9ldGhlcm5ldC5jCmluZGV4IDQ2MGU4NTQuLmY1MzlkODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vY3Rlb24vZXRoZXJuZXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvb2N0ZW9uL2V0aGVybmV0LmMKQEAgLTU3Myw4ICs1NzMsNiBAQAogI2VuZGlmCiB9OwogCi1leHRlcm4gdm9pZCBvY3Rlb25fbWRpb2J1c19mb3JjZV9tb2RfZGVwZW5jZW5jeSh2b2lkKTsKLQogc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY3ZtX29jdF9vZl9nZXRfY2hpbGQoCiAJCQkJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQsIGludCByZWdfdmFsKQogewpAQCAtODU5LDcgKzg1Nyw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGN2bV9vY3RfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGN2bV9vY3RfbWF0Y2hbXSA9IHsKIAl7CiAJCS5jb21wYXRpYmxlID0gImNhdml1bSxvY3Rlb24tMzg2MC1waXAiLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5jIGIvZHJpdmVycy9zdGFnaW5nL29scGNfZGNvbi9vbHBjX2Rjb24uYwppbmRleCBiYzdlNjY0Li5kMTE1ZjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvb2xwY19kY29uL29scGNfZGNvbi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vbHBjX2Rjb24vb2xwY19kY29uLmMKQEAgLTE4LDggKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296aGNkLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296aGNkLmMKaW5kZXggODU0M2JiMi4uNWZmNDcxNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vemhjZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3poY2QuYwpAQCAtMjgwLDE3ICsyODAsMjAgQEAKICAqLwogc3RhdGljIHN0cnVjdCBvel9lbmRwb2ludCAqb3pfZXBfYWxsb2MoaW50IGJ1ZmZlcl9zaXplLCBnZnBfdCBtZW1fZmxhZ3MpCiB7Ci0Jc3RydWN0IG96X2VuZHBvaW50ICplcCA9Ci0JCWt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvel9lbmRwb2ludCkrYnVmZmVyX3NpemUsIG1lbV9mbGFncyk7Ci0JaWYgKGVwKSB7Ci0JCUlOSVRfTElTVF9IRUFEKCZlcC0+dXJiX2xpc3QpOwotCQlJTklUX0xJU1RfSEVBRCgmZXAtPmxpbmspOwotCQllcC0+Y3JlZGl0ID0gLTE7Ci0JCWlmIChidWZmZXJfc2l6ZSkgewotCQkJZXAtPmJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemU7Ci0JCQllcC0+YnVmZmVyID0gKHU4ICopKGVwKzEpOwotCQl9CisJc3RydWN0IG96X2VuZHBvaW50ICplcDsKKworCWVwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG96X2VuZHBvaW50KStidWZmZXJfc2l6ZSwgbWVtX2ZsYWdzKTsKKwlpZiAoIWVwKQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTElTVF9IRUFEKCZlcC0+dXJiX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZlcC0+bGluayk7CisJZXAtPmNyZWRpdCA9IC0xOworCWlmIChidWZmZXJfc2l6ZSkgeworCQllcC0+YnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKKwkJZXAtPmJ1ZmZlciA9ICh1OCAqKShlcCsxKTsKIAl9CisKIAlyZXR1cm4gZXA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3ptYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296bWFpbi5jCmluZGV4IDdkNmVmNGMuLjc0ZWYzNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3ptYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9vem1haW4uYwpAQCAtMzQsMTEgKzM0LDIxIEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IG96d3Bhbl9pbml0KHZvaWQpCiB7Ci0Jb3pfY2Rldl9yZWdpc3RlcigpOwotCW96X3Byb3RvY29sX2luaXQoZ19uZXRfZGV2KTsKKwlpbnQgZXJyOworCisJZXJyID0gb3pfY2Rldl9yZWdpc3RlcigpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gb3pfcHJvdG9jb2xfaW5pdChnX25ldF9kZXYpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3Byb3RvY29sOwogCW96X2FwcF9lbmFibGUoT1pfQVBQSURfVVNCLCAxKTsKIAlvel9hcHBzX2luaXQoKTsKIAlyZXR1cm4gMDsKKworZXJyX3Byb3RvY29sOgorCW96X2NkZXZfZGVyZWdpc3RlcigpOworCXJldHVybiBlcnI7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvb3p3cGFuL296cGQuYyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5jCmluZGV4IDg1MmMyODguLjAyMWQ3NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwZC5jCkBAIC0xMDIsMzQgKzEwMiwzNiBAQAogICovCiBzdHJ1Y3Qgb3pfcGQgKm96X3BkX2FsbG9jKGNvbnN0IHU4ICptYWNfYWRkcikKIHsKLQlzdHJ1Y3Qgb3pfcGQgKnBkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG96X3BkKSwgR0ZQX0FUT01JQyk7CisJc3RydWN0IG96X3BkICpwZDsKKwlpbnQgaTsKIAotCWlmIChwZCkgewotCQlpbnQgaTsKKwlwZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBvel9wZCksIEdGUF9BVE9NSUMpOworCWlmICghcGQpCisJCXJldHVybiBOVUxMOwogCi0JCWF0b21pY19zZXQoJnBkLT5yZWZfY291bnQsIDIpOwotCQlmb3IgKGkgPSAwOyBpIDwgT1pfTkJfQVBQUzsgaSsrKQotCQkJc3Bpbl9sb2NrX2luaXQoJnBkLT5hcHBfbG9ja1tpXSk7Ci0JCXBkLT5sYXN0X3J4X3BrdF9udW0gPSAweGZmZmZmZmZmOwotCQlvel9wZF9zZXRfc3RhdGUocGQsIE9aX1BEX1NfSURMRSk7Ci0JCXBkLT5tYXhfdHhfc2l6ZSA9IE9aX01BWF9UWF9TSVpFOwotCQlldGhlcl9hZGRyX2NvcHkocGQtPm1hY19hZGRyLCBtYWNfYWRkcik7Ci0JCW96X2VsdF9idWZfaW5pdCgmcGQtPmVsdF9idWZmKTsKLQkJc3Bpbl9sb2NrX2luaXQoJnBkLT50eF9mcmFtZV9sb2NrKTsKLQkJSU5JVF9MSVNUX0hFQUQoJnBkLT50eF9xdWV1ZSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZwZC0+ZmFyZXdlbGxfbGlzdCk7Ci0JCXBkLT5sYXN0X3NlbnRfZnJhbWUgPSAmcGQtPnR4X3F1ZXVlOwotCQlzcGluX2xvY2tfaW5pdCgmcGQtPnN0cmVhbV9sb2NrKTsKLQkJSU5JVF9MSVNUX0hFQUQoJnBkLT5zdHJlYW1fbGlzdCk7Ci0JCXRhc2tsZXRfaW5pdCgmcGQtPmhlYXJ0YmVhdF90YXNrbGV0LCBvel9wZF9oZWFydGJlYXRfaGFuZGxlciwKLQkJCQkJCQkodW5zaWduZWQgbG9uZylwZCk7Ci0JCXRhc2tsZXRfaW5pdCgmcGQtPnRpbWVvdXRfdGFza2xldCwgb3pfcGRfdGltZW91dF9oYW5kbGVyLAotCQkJCQkJCSh1bnNpZ25lZCBsb25nKXBkKTsKLQkJaHJ0aW1lcl9pbml0KCZwZC0+aGVhcnRiZWF0LCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwotCQlocnRpbWVyX2luaXQoJnBkLT50aW1lb3V0LCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwotCQlwZC0+aGVhcnRiZWF0LmZ1bmN0aW9uID0gb3pfcGRfaGVhcnRiZWF0X2V2ZW50OwotCQlwZC0+dGltZW91dC5mdW5jdGlvbiA9IG96X3BkX3RpbWVvdXRfZXZlbnQ7Ci0JfQorCWF0b21pY19zZXQoJnBkLT5yZWZfY291bnQsIDIpOworCWZvciAoaSA9IDA7IGkgPCBPWl9OQl9BUFBTOyBpKyspCisJCXNwaW5fbG9ja19pbml0KCZwZC0+YXBwX2xvY2tbaV0pOworCXBkLT5sYXN0X3J4X3BrdF9udW0gPSAweGZmZmZmZmZmOworCW96X3BkX3NldF9zdGF0ZShwZCwgT1pfUERfU19JRExFKTsKKwlwZC0+bWF4X3R4X3NpemUgPSBPWl9NQVhfVFhfU0laRTsKKwlldGhlcl9hZGRyX2NvcHkocGQtPm1hY19hZGRyLCBtYWNfYWRkcik7CisJb3pfZWx0X2J1Zl9pbml0KCZwZC0+ZWx0X2J1ZmYpOworCXNwaW5fbG9ja19pbml0KCZwZC0+dHhfZnJhbWVfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnBkLT50eF9xdWV1ZSk7CisJSU5JVF9MSVNUX0hFQUQoJnBkLT5mYXJld2VsbF9saXN0KTsKKwlwZC0+bGFzdF9zZW50X2ZyYW1lID0gJnBkLT50eF9xdWV1ZTsKKwlzcGluX2xvY2tfaW5pdCgmcGQtPnN0cmVhbV9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcGQtPnN0cmVhbV9saXN0KTsKKwl0YXNrbGV0X2luaXQoJnBkLT5oZWFydGJlYXRfdGFza2xldCwgb3pfcGRfaGVhcnRiZWF0X2hhbmRsZXIsCisJCQkJCQkodW5zaWduZWQgbG9uZylwZCk7CisJdGFza2xldF9pbml0KCZwZC0+dGltZW91dF90YXNrbGV0LCBvel9wZF90aW1lb3V0X2hhbmRsZXIsCisJCQkJCQkodW5zaWduZWQgbG9uZylwZCk7CisJaHJ0aW1lcl9pbml0KCZwZC0+aGVhcnRiZWF0LCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOworCWhydGltZXJfaW5pdCgmcGQtPnRpbWVvdXQsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJcGQtPmhlYXJ0YmVhdC5mdW5jdGlvbiA9IG96X3BkX2hlYXJ0YmVhdF9ldmVudDsKKwlwZC0+dGltZW91dC5mdW5jdGlvbiA9IG96X3BkX3RpbWVvdXRfZXZlbnQ7CisKIAlyZXR1cm4gcGQ7CiB9CiAKQEAgLTY1Miw4ICs2NTQsOSBAQAogICovCiBpbnQgb3pfaXNvY19zdHJlYW1fY3JlYXRlKHN0cnVjdCBvel9wZCAqcGQsIHU4IGVwX251bSkKIHsKLQlzdHJ1Y3Qgb3pfaXNvY19zdHJlYW0gKnN0ID0KLQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IG96X2lzb2Nfc3RyZWFtKSwgR0ZQX0FUT01JQyk7CisJc3RydWN0IG96X2lzb2Nfc3RyZWFtICpzdDsKKworCXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG96X2lzb2Nfc3RyZWFtKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFzdCkKIAkJcmV0dXJuIC1FTk9NRU07CiAJc3QtPmVwX251bSA9IGVwX251bTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9vendwYW4vb3pwcm90by5jIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmMKaW5kZXggM2QzYTNhOC4uMWJhMjRhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL296d3Bhbi9venByb3RvLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybjsKIAl9Ci0Jb3pfaGRyLT5jb250cm9sID0gKE9aX1BST1RPQ09MX1ZFUlNJT048PE9aX1ZFUlNJT05fU0hJRlQpOworCW96X2hkci0+Y29udHJvbCA9IE9aX1BST1RPQ09MX1ZFUlNJT048PE9aX1ZFUlNJT05fU0hJRlQ7CiAJb3pfaGRyLT5sYXN0X3BrdF9udW0gPSAwOwogCXB1dF91bmFsaWduZWQoMCwgJm96X2hkci0+cGt0X251bSk7CiAJZWx0LT50eXBlID0gT1pfRUxUX0NPTk5FQ1RfUlNQOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3BhbmVsL3BhbmVsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYwppbmRleCA2ZWQzNWI2Li5lYTU0ZmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcGFuZWwvcGFuZWwuYwpAQCAtMzM1LDExICszMzUsMTEgQEAKICAqIExDRCB0eXBlcwogICovCiAjZGVmaW5lIExDRF9UWVBFX05PTkUJCTAKLSNkZWZpbmUgTENEX1RZUEVfT0xECQkxCi0jZGVmaW5lIExDRF9UWVBFX0tTMDA3NAkJMgotI2RlZmluZSBMQ0RfVFlQRV9IQU5UUk9OSVgJMwotI2RlZmluZSBMQ0RfVFlQRV9ORVhDT00JCTQKLSNkZWZpbmUgTENEX1RZUEVfQ1VTVE9NCQk1CisjZGVmaW5lIExDRF9UWVBFX0NVU1RPTQkJMQorI2RlZmluZSBMQ0RfVFlQRV9PTEQJCTIKKyNkZWZpbmUgTENEX1RZUEVfS1MwMDc0CQkzCisjZGVmaW5lIExDRF9UWVBFX0hBTlRST05JWAk0CisjZGVmaW5lIExDRF9UWVBFX05FWENPTQkJNQogCiAvKgogICoga2V5cGFkIHR5cGVzCkBAIC00NzMsOCArNDczLDYgQEAKIAogc3RhdGljIGludCBrZXlwYWRfaW5pdGlhbGl6ZWQ7CiAKLXN0YXRpYyBjaGFyIGluaXRfaW5fcHJvZ3Jlc3M7Ci0KIHN0YXRpYyB2b2lkICgqbGNkX3dyaXRlX2NtZCkoaW50KTsKIHN0YXRpYyB2b2lkICgqbGNkX3dyaXRlX2RhdGEpKGludCk7CiBzdGF0aWMgdm9pZCAoKmxjZF9jbGVhcl9mYXN0KSh2b2lkKTsKQEAgLTUwMiw3ICs1MDAsNyBAQAogc3RhdGljIGludCBsY2RfdHlwZSA9IE5PVF9TRVQ7CiBtb2R1bGVfcGFyYW0obGNkX3R5cGUsIGludCwgMDAwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxjZF90eXBlLAotCQkgIkxDRCB0eXBlOiAwPW5vbmUsIDE9b2xkIC8vLCAyPXNlcmlhbCBrczAwNzQsIDM9aGFudHJvbml4IC8vLCA0PW5leGNvbSAvLywgNT1jb21waWxlZC1pbiIpOworCQkgIkxDRCB0eXBlOiAwPW5vbmUsIDE9Y29tcGlsZWQtaW4sIDI9b2xkLCAzPXNlcmlhbCBrczAwNzQsIDQ9aGFudHJvbml4LCA1PW5leGNvbSIpOwogCiBzdGF0aWMgaW50IGxjZF9oZWlnaHQgPSBOT1RfU0VUOwogbW9kdWxlX3BhcmFtKGxjZF9oZWlnaHQsIGludCwgMDAwMCk7CkBAIC0xNzE4LDkgKzE3MTYsNiBAQAogCiBzdGF0aWMgdm9pZCBrZXlwYWRfc2VuZF9rZXkoY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgbWF4X2xlbikKIHsKLQlpZiAoaW5pdF9pbl9wcm9ncmVzcykKLQkJcmV0dXJuOwotCiAJLyogc2VuZCB0aGUga2V5IHRvIHRoZSBkZXZpY2Ugb25seSBpZiBhIHByb2Nlc3MgaXMgYXR0YWNoZWQgdG8gaXQuICovCiAJaWYgKCFhdG9taWNfcmVhZCgma2V5cGFkX2F2YWlsYWJsZSkpIHsKIAkJd2hpbGUgKG1heF9sZW4tLSAmJiBrZXlwYWRfYnVmbGVuIDwgS0VZUEFEX0JVRkZFUiAmJiAqc3RyaW5nKSB7CkBAIC0yMDEwLDEwICsyMDA1LDggQEAKIAlpZiAoc2Nhbl90aW1lci5mdW5jdGlvbiAhPSBOVUxMKQogCQlyZXR1cm47CQkvKiBhbHJlYWR5IHN0YXJ0ZWQgKi8KIAotCWluaXRfdGltZXIoJnNjYW5fdGltZXIpOworCXNldHVwX3RpbWVyKCZzY2FuX3RpbWVyLCAodm9pZCAqKSZwYW5lbF9zY2FuX3RpbWVyLCAwKTsKIAlzY2FuX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSU5QVVRfUE9MTF9USU1FOwotCXNjYW5fdGltZXIuZGF0YSA9IDA7Ci0Jc2Nhbl90aW1lci5mdW5jdGlvbiA9ICh2b2lkICopJnBhbmVsX3NjYW5fdGltZXI7CiAJYWRkX3RpbWVyKCZzY2FuX3RpbWVyKTsKIH0KIApAQCAtMjIzNiw2ICsyMjI5LDcgQEAKIAkJaWYgKG1pc2NfcmVnaXN0ZXIoJmtleXBhZF9kZXYpKQogCQkJZ290byBlcnJfbGNkX3VucmVnOwogCX0KKwlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBhbmVsX25vdGlmaWVyKTsKIAlyZXR1cm47CiAKIGVycl9sY2RfdW5yZWc6CkBAIC0yMjU3LDYgKzIyNTEsOCBAQAogCQlyZXR1cm47CiAJfQogCisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBhbmVsX25vdGlmaWVyKTsKKwogCWlmIChrZXlwYWQuZW5hYmxlZCAmJiBrZXlwYWRfaW5pdGlhbGl6ZWQpIHsKIAkJbWlzY19kZXJlZ2lzdGVyKCZrZXlwYWRfZGV2KTsKIAkJa2V5cGFkX2luaXRpYWxpemVkID0gMDsKQEAgLTIyODEsNyArMjI3Nyw3IEBACiAvKiBpbml0IGZ1bmN0aW9uICovCiBzdGF0aWMgaW50IF9faW5pdCBwYW5lbF9pbml0X21vZHVsZSh2b2lkKQogewotCWludCBzZWxlY3RlZF9rZXlwYWRfdHlwZSA9IE5PVF9TRVQ7CisJaW50IHNlbGVjdGVkX2tleXBhZF90eXBlID0gTk9UX1NFVCwgZXJyOwogCiAJLyogdGFrZSBjYXJlIG9mIGFuIGV2ZW50dWFsIHByb2ZpbGUgKi8KIAlzd2l0Y2ggKHByb2ZpbGUpIHsKQEAgLTIzMjQsMjYgKzIzMjAsNiBAQAogCX0KIAogCS8qCi0JICogSW5pdCBsY2Qgc3RydWN0IHdpdGggbG9hZC10aW1lIHZhbHVlcyB0byBwcmVzZXJ2ZSBleGFjdCBjdXJyZW50Ci0JICogZnVuY3Rpb25hbGl0eSAoYXQgbGVhc3QgZm9yIG5vdykuCi0JICovCi0JbGNkLmhlaWdodCA9IGxjZF9oZWlnaHQ7Ci0JbGNkLndpZHRoID0gbGNkX3dpZHRoOwotCWxjZC5id2lkdGggPSBsY2RfYndpZHRoOwotCWxjZC5od2lkdGggPSBsY2RfaHdpZHRoOwotCWxjZC5jaGFyc2V0ID0gbGNkX2NoYXJzZXQ7Ci0JbGNkLnByb3RvID0gbGNkX3Byb3RvOwotCWxjZC5waW5zLmUgPSBsY2RfZV9waW47Ci0JbGNkLnBpbnMucnMgPSBsY2RfcnNfcGluOwotCWxjZC5waW5zLnJ3ID0gbGNkX3J3X3BpbjsKLQlsY2QucGlucy5jbCA9IGxjZF9jbF9waW47Ci0JbGNkLnBpbnMuZGEgPSBsY2RfZGFfcGluOwotCWxjZC5waW5zLmJsID0gbGNkX2JsX3BpbjsKLQotCS8qIExlYXZlIGl0IGZvciBub3csIGp1c3QgaW4gY2FzZSAqLwotCWxjZC5lc2Nfc2VxLmxlbiA9IC0xOwotCi0JLyoKIAkgKiBPdmVyd3JpdGUgc2VsZWN0aW9uIHdpdGggbW9kdWxlIHBhcmFtIHZhbHVlcyAoYm90aCBrZXlwYWQgYW5kIGxjZCksCiAJICogd2hlcmUgdGhlIGRlcHJlY2F0ZWQgcGFyYW1zIGhhdmUgbG93ZXIgcHJpby4KIAkgKi8KQEAgLTIzNjEsNiArMjMzNywyOCBAQAogCiAJbGNkLmVuYWJsZWQgPSAoc2VsZWN0ZWRfbGNkX3R5cGUgPiAwKTsKIAorCWlmIChsY2QuZW5hYmxlZCkgeworCQkvKgorCQkgKiBJbml0IGxjZCBzdHJ1Y3Qgd2l0aCBsb2FkLXRpbWUgdmFsdWVzIHRvIHByZXNlcnZlIGV4YWN0CisJCSAqIGN1cnJlbnQgZnVuY3Rpb25hbGl0eSAoYXQgbGVhc3QgZm9yIG5vdykuCisJCSAqLworCQlsY2QuaGVpZ2h0ID0gbGNkX2hlaWdodDsKKwkJbGNkLndpZHRoID0gbGNkX3dpZHRoOworCQlsY2QuYndpZHRoID0gbGNkX2J3aWR0aDsKKwkJbGNkLmh3aWR0aCA9IGxjZF9od2lkdGg7CisJCWxjZC5jaGFyc2V0ID0gbGNkX2NoYXJzZXQ7CisJCWxjZC5wcm90byA9IGxjZF9wcm90bzsKKwkJbGNkLnBpbnMuZSA9IGxjZF9lX3BpbjsKKwkJbGNkLnBpbnMucnMgPSBsY2RfcnNfcGluOworCQlsY2QucGlucy5ydyA9IGxjZF9yd19waW47CisJCWxjZC5waW5zLmNsID0gbGNkX2NsX3BpbjsKKwkJbGNkLnBpbnMuZGEgPSBsY2RfZGFfcGluOworCQlsY2QucGlucy5ibCA9IGxjZF9ibF9waW47CisKKwkJLyogTGVhdmUgaXQgZm9yIG5vdywganVzdCBpbiBjYXNlICovCisJCWxjZC5lc2Nfc2VxLmxlbiA9IC0xOworCX0KKwogCXN3aXRjaCAoc2VsZWN0ZWRfa2V5cGFkX3R5cGUpIHsKIAljYXNlIEtFWVBBRF9UWVBFX09MRDoKIAkJa2V5cGFkX3Byb2ZpbGUgPSBvbGRfa2V5cGFkX3Byb2ZpbGU7CkBAIC0yMzc2LDI3ICsyMzc0LDE3IEBACiAJCWJyZWFrOwogCX0KIAotCS8qIHRlbGxzIHZhcmlvdXMgc3Vic3lzdGVtcyBhYm91dCB0aGUgZmFjdCB0aGF0IHdlIGFyZSBpbml0aWFsaXppbmcgKi8KLQlpbml0X2luX3Byb2dyZXNzID0gMTsKLQotCWlmIChwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlcigmcGFuZWxfZHJpdmVyKSkgewotCQlwcl9lcnIoImNvdWxkIG5vdCByZWdpc3RlciB3aXRoIHBhcnBvcnQuIEFib3J0aW5nLlxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQogCWlmICghbGNkLmVuYWJsZWQgJiYgIWtleXBhZC5lbmFibGVkKSB7Ci0JCS8qIG5vIGRldmljZSBlbmFibGVkLCBsZXQncyByZWxlYXNlIHRoZSBwYXJwb3J0ICovCi0JCWlmIChwcHJ0KSB7Ci0JCQlwYXJwb3J0X3JlbGVhc2UocHBydCk7Ci0JCQlwYXJwb3J0X3VucmVnaXN0ZXJfZGV2aWNlKHBwcnQpOwotCQkJcHBydCA9IE5VTEw7Ci0JCX0KLQkJcGFycG9ydF91bnJlZ2lzdGVyX2RyaXZlcigmcGFuZWxfZHJpdmVyKTsKKwkJLyogbm8gZGV2aWNlIGVuYWJsZWQsIGxldCdzIGV4aXQgKi8KIAkJcHJfZXJyKCJkcml2ZXIgdmVyc2lvbiAiIFBBTkVMX1ZFUlNJT04gIiBkaXNhYmxlZC5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBhbmVsX25vdGlmaWVyKTsKKwllcnIgPSBwYXJwb3J0X3JlZ2lzdGVyX2RyaXZlcigmcGFuZWxfZHJpdmVyKTsKKwlpZiAoZXJyKSB7CisJCXByX2VycigiY291bGQgbm90IHJlZ2lzdGVyIHdpdGggcGFycG9ydC4gQWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CiAKIAlpZiAocHBydCkKIAkJcHJfaW5mbygiZHJpdmVyIHZlcnNpb24gIiBQQU5FTF9WRVJTSU9OCkBAIC0yNDA1LDE1ICsyMzkzLDExIEBACiAJZWxzZQogCQlwcl9pbmZvKCJkcml2ZXIgdmVyc2lvbiAiIFBBTkVMX1ZFUlNJT04KIAkJCSIgbm90IHlldCByZWdpc3RlcmVkXG4iKTsKLQkvKiB0ZWxscyB2YXJpb3VzIHN1YnN5c3RlbXMgYWJvdXQgdGhlIGZhY3QgdGhhdCBpbml0aWFsaXphdGlvbgotCSAgIGlzIGZpbmlzaGVkICovCi0JaW5pdF9pbl9wcm9ncmVzcyA9IDA7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBwYW5lbF9jbGVhbnVwX21vZHVsZSh2b2lkKQogewotCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwYW5lbF9ub3RpZmllcik7CiAKIAlpZiAoc2Nhbl90aW1lci5mdW5jdGlvbiAhPSBOVUxMKQogCQlkZWxfdGltZXJfc3luYygmc2Nhbl90aW1lcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2FwLmMKaW5kZXggZGExOTE0NS4uZTY1ZWU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19hcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfYXAuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGRydl90eXBlcy5oPgogI2luY2x1ZGUgPHdpZmkuaD4KICNpbmNsdWRlIDxpZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpZmRlZiBDT05GSUdfODhFVV9BUF9NT0RFCiAKQEAgLTc4LDExICs3OSw4IEBACiAJaWYgKHRydWUpIHsKIAkJdTggKnAsICpkc3RfaWUsICpwcmVtYWluZGVyX2llID0gTlVMTDsKIAkJdTggKnBiYWNrdXBfcmVtYWluZGVyX2llID0gTlVMTDsKLQkJX19sZTE2IHRpbV9iaXRtYXBfbGU7CiAJCXVpbnQgb2Zmc2V0LCB0bXBfbGVuLCB0aW1faWVsZW4sIHRpbV9pZV9vZmZzZXQsIHJlbWFpbmRlcl9pZWxlbjsKIAotCQl0aW1fYml0bWFwX2xlID0gY3B1X3RvX2xlMTYocHN0YXByaXYtPnRpbV9iaXRtYXApOwotCiAJCXAgPSBydHdfZ2V0X2llKHBpZSArIF9GSVhFRF9JRV9MRU5HVEhfLCBfVElNX0lFXywgJnRpbV9pZWxlbiwgcG5ldHdvcmtfbWxtZWV4dC0+SUVMZW5ndGggLSBfRklYRURfSUVfTEVOR1RIXyk7CiAJCWlmIChwICE9IE5VTEwgJiYgdGltX2llbGVuID4gMCkgewogCQkJdGltX2llbGVuICs9IDI7CkBAIC0xMzcsOSArMTM1LDkgQEAKIAkJCSpkc3RfaWUrKyA9IDA7CiAKIAkJaWYgKHRpbV9pZWxlbiA9PSA0KSB7Ci0JCQkqZHN0X2llKysgPSAqKHU4ICopJnRpbV9iaXRtYXBfbGU7CisJCQkqZHN0X2llKysgPSBwc3RhcHJpdi0+dGltX2JpdG1hcCAmIDB4ZmY7CiAJCX0gZWxzZSBpZiAodGltX2llbGVuID09IDUpIHsKLQkJCW1lbWNweShkc3RfaWUsICZ0aW1fYml0bWFwX2xlLCAyKTsKKwkJCXB1dF91bmFsaWduZWRfbGUxNihwc3RhcHJpdi0+dGltX2JpdG1hcCwgZHN0X2llKTsKIAkJCWRzdF9pZSArPSAyOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfY21kLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2NtZC5jCmluZGV4IDRiNDM0NjIuLjg5YjVlNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfY21kLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19jbWQuYwpAQCAtMzI1LDcgKzMyNSw4IEBACiAJaWYgKHJlcyA9PSBfU1VDQ0VTUykgewogCQlwbWxtZXByaXYtPnNjYW5fc3RhcnRfdGltZSA9IGppZmZpZXM7CiAKLQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLCBTQ0FOTklOR19USU1FT1VUKTsKKwkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFNDQU5OSU5HX1RJTUVPVVQpKTsKIAogCQlydHdfbGVkX2NvbnRyb2wocGFkYXB0ZXIsIExFRF9DVExfU0lURV9TVVJWRVkpOwogCkBAIC0xMjM0LDkgKzEyMzUsMTEgQEAKIAlpZiAocGNtZC0+cmVzID09IEgyQ19EUk9QUEVEKSB7CiAJCS8qIFRPRE86IGNhbmNlbCB0aW1lciBhbmQgZG8gdGltZW91dCBoYW5kbGVyIGRpcmVjdGx5Li4uICovCiAJCS8qIG5lZWQgdG8gbWFrZSB0aW1lb3V0IGhhbmRsZXJPUyBpbmRlcGVuZGVudCAqLwotCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsIDEpOworCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCX0gZWxzZSBpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7Ci0JCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwgMSk7CisJCW1vZF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywgKCJcbiAqKioqKioqKkVycm9yOiBNZ250QWN0cnR3X3NldF84MDJfMTFfYnNzaWRfTElTVF9TQ0FOIEZhaWwgKioqKioqKioqKioqXG5cbi4iKSk7CiAJfQogCkBAIC0xMjcwLDEwICsxMjczLDEyIEBACiAJaWYgKHBjbWQtPnJlcyA9PSBIMkNfRFJPUFBFRCkgewogCQkvKiBUT0RPOiBjYW5jZWwgdGltZXIgYW5kIGRvIHRpbWVvdXQgaGFuZGxlciBkaXJlY3RseS4uLiAqLwogCQkvKiBuZWVkIHRvIG1ha2UgdGltZW91dCBoYW5kbGVyT1MgaW5kZXBlbmRlbnQgKi8KLQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgMSk7CisJCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCX0gZWxzZSBpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywgKCIqKioqKioqKkVycm9yOnJ0d19zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FubmVkX3F1ZXVlIFdhaXQgU2VtYSAgRmFpbCAqKioqKioqKioqKipcbiIpKTsKLQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgMSk7CisJCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCX0KIAogCXJ0d19mcmVlX2NtZF9vYmoocGNtZCk7CkBAIC0xMjkxLDcgKzEyOTYsOCBAQAogCiAJaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sICgiXG4gKioqKioqKipFcnJvcjogcnR3X2NyZWF0ZWJzc19jbWRfY2FsbGJhY2sgIEZhaWwgKioqKioqKioqKioqXG5cbi4iKSk7Ci0JCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIDEpOworCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAl9CiAKIAlkZWxfdGltZXJfc3luYygmcG1sbWVwcml2LT5hc3NvY190aW1lcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2VmdXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2VmdXNlLmMKaW5kZXggODgxNmQxMS4uYjY2NzQ2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19lZnVzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfZWZ1c2UuYwpAQCAtMTM5LDcgKzEzOSw3IEBACiAJd2hpbGUgKChydGVtcDggIT0gMHhGRikgJiYgKGVGdXNlX0FkZHIgPCBFRlVTRV9SRUFMX0NPTlRFTlRfTEVOXzg4RSkpIHsKIAkJLyogIENoZWNrIFBHIGhlYWRlciBmb3Igc2VjdGlvbiBudW0uICovCiAJCWlmICgocnRlbXA4ICYgMHgxRikgPT0gMHgwRikgewkJLyogZXh0ZW5kZWQgaGVhZGVyICovCi0JCQl1MXRlbXAgPSAoKHJ0ZW1wOCAmIDB4RTApID4+IDUpOworCQkJdTF0ZW1wID0gKHJ0ZW1wOCAmIDB4RTApID4+IDU7CiAJCQlydGVtcDggPSAqKHBoeW1hcCtlRnVzZV9BZGRyKTsKIAkJCWlmICgocnRlbXA4ICYgMHgwRikgPT0gMHgwRikgewogCQkJCWVGdXNlX0FkZHIrKzsKQEAgLTE1MCwxMiArMTUwLDEyIEBACiAJCQkJY29udGludWU7CiAJCQl9IGVsc2UgewogCQkJCW9mZnNldCA9ICgocnRlbXA4ICYgMHhGMCkgPj4gMSkgfCB1MXRlbXA7Ci0JCQkJd3JlbiA9IChydGVtcDggJiAweDBGKTsKKwkJCQl3cmVuID0gcnRlbXA4ICYgMHgwRjsKIAkJCQllRnVzZV9BZGRyKys7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQlvZmZzZXQgPSAoKHJ0ZW1wOCA+PiA0KSAmIDB4MGYpOwotCQkJd3JlbiA9IChydGVtcDggJiAweDBmKTsKKwkJCW9mZnNldCA9IChydGVtcDggPj4gNCkgJiAweDBmOworCQkJd3JlbiA9IHJ0ZW1wOCAmIDB4MGY7CiAJCX0KIAogCQlpZiAob2Zmc2V0IDwgRUZVU0VfTUFYX1NFQ1RJT05fODhFKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2llZWU4MDIxMS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pZWVlODAyMTEuYwppbmRleCBmMmMzY2E3Li4xMWI3ODBkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2llZWU4MDIxMS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaWVlZTgwMjExLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDx3bGFuX2Jzc2RlZi5oPgogCiB1OCBSVFdfV1BBX09VSV9UWVBFW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDEgfTsKLXUxNiBSVFdfV1BBX1ZFUlNJT04gPSAxOwogdTggV1BBX0FVVEhfS0VZX01HTVRfTk9ORVtdID0geyAweDAwLCAweDUwLCAweGYyLCAwIH07CiB1OCBXUEFfQVVUSF9LRVlfTUdNVF9VTlNQRUNfODAyXzFYW10gPSB7IDB4MDAsIDB4NTAsIDB4ZjIsIDEgfTsKIHU4IFdQQV9BVVRIX0tFWV9NR01UX1BTS19PVkVSXzgwMl8xWFtdID0geyAweDAwLCAweDUwLCAweGYyLCAyIH07CkBAIC02NjMsNyArNjYyLDcgQEAKIAogCS8qIFNlYXJjaCByZXF1aXJlZCBXUEEgb3IgV1BBMiBJRSBhbmQgY29weSB0byBzZWNfaWVbXSAqLwogCi0JY250ID0gKF9USU1FU1RBTVBfICsgX0JFQUNPTl9JVEVSVkFMXyArIF9DQVBBQklMSVRZXyk7CisJY250ID0gX1RJTUVTVEFNUF8gKyBfQkVBQ09OX0lURVJWQUxfICsgX0NBUEFCSUxJVFlfOwogCiAJc2VjX2lkeCA9IDA7CiAKQEAgLTc4OSw3ICs3ODgsNyBAQAogICoKICAqIFJldHVybnM6IHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpYyBXUFMgYXR0cmlidXRlIGZvdW5kLCBvciBOVUxMCiAgKi8KLXU4ICpydHdfZ2V0X3dwc19hdHRyKHU4ICp3cHNfaWUsIHVpbnQgd3BzX2llbGVuLCB1MTYgdGFyZ2V0X2F0dHJfaWQgLCB1OCAqYnVmX2F0dHIsIHUzMiAqbGVuX2F0dHIpCit1OCAqcnR3X2dldF93cHNfYXR0cih1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwgdTE2IHRhcmdldF9hdHRyX2lkLCB1OCAqYnVmX2F0dHIsIHUzMiAqbGVuX2F0dHIpCiB7CiAJdTggKmF0dHJfcHRyID0gTlVMTDsKIAl1OCAqdGFyZ2V0X2F0dHJfcHRyID0gTlVMTDsKQEAgLTc5OSw3ICs3OTgsNyBAQAogCQkqbGVuX2F0dHIgPSAwOwogCiAJaWYgKCh3cHNfaWVbMF0gIT0gX1ZFTkRPUl9TUEVDSUZJQ19JRV8pIHx8Ci0JICAgIChtZW1jbXAod3BzX2llICsgMiwgd3BzX291aSAsIDQpKSkKKwkgICAgKG1lbWNtcCh3cHNfaWUgKyAyLCB3cHNfb3VpLCA0KSkpCiAJCXJldHVybiBhdHRyX3B0cjsKIAogCS8qICA2ID0gMShFbGVtZW50IElEKSArIDEoTGVuZ3RoKSArIDQoV1BTIE9VSSkgKi8KQEAgLTgzNSw3ICs4MzQsNyBAQAogICoKICAqIFJldHVybnM6IHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpYyBXUFMgYXR0cmlidXRlIGNvbnRlbnQgZm91bmQsIG9yIE5VTEwKICAqLwotdTggKnJ0d19nZXRfd3BzX2F0dHJfY29udGVudCh1OCAqd3BzX2llLCB1aW50IHdwc19pZWxlbiwgdTE2IHRhcmdldF9hdHRyX2lkICwgdTggKmJ1Zl9jb250ZW50LCB1aW50ICpsZW5fY29udGVudCkKK3U4ICpydHdfZ2V0X3dwc19hdHRyX2NvbnRlbnQodTggKndwc19pZSwgdWludCB3cHNfaWVsZW4sIHUxNiB0YXJnZXRfYXR0cl9pZCwgdTggKmJ1Zl9jb250ZW50LCB1aW50ICpsZW5fY29udGVudCkKIHsKIAl1OCAqYXR0cl9wdHI7CiAJdTMyIGF0dHJfbGVuOwpAQCAtMTIzOSw3ICsxMjM4LDcgQEAKIAl9IGVsc2UgewogCQlwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wgPSBFTkNSWVBfUFJPVE9DT0xfT1BFTlNZUzsKIAl9Ci0JcnR3X2dldF9zZWNfaWUocG5ldHdvcmstPm5ldHdvcmsuSUVzICwgcG5ldHdvcmstPm5ldHdvcmsuSUVMZW5ndGgsIE5VTEwsICZyc25fbGVuLCBOVUxMLCAmd3BhX2xlbik7CisJcnR3X2dldF9zZWNfaWUocG5ldHdvcmstPm5ldHdvcmsuSUVzLCBwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aCwgTlVMTCwgJnJzbl9sZW4sIE5VTEwsICZ3cGFfbGVuKTsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJydHdfZ2V0X2Jjbl9pbmZvOiBzc2lkID0lc1xuIiwgcG5ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkKSk7CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICgicnR3X2dldF9iY25faW5mbzogd3BhX2xlbiA9JWQgcnNuX2xlbiA9JWRcbiIsIHdwYV9sZW4sIHJzbl9sZW4pKTsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJydHdfZ2V0X2Jjbl9pbmZvOiBzc2lkID0lc1xuIiwgcG5ldHdvcmstPm5ldHdvcmsuU3NpZC5Tc2lkKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19pb2N0bF9zZXQuYwppbmRleCAyZmFmNmIyLi45NjkxNTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2lvY3RsX3NldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfaW9jdGxfc2V0LmMKQEAgLTg2LDcgKzg2LDggQEAKIAkJc2VsZWN0X3JldCA9IHJ0d19zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FubmVkX3F1ZXVlKHBtbG1lcHJpdik7CiAJCWlmIChzZWxlY3RfcmV0ID09IF9TVUNDRVNTKSB7CiAJCQlwbWxtZXByaXYtPnRvX2pvaW4gPSBmYWxzZTsKLQkJCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIE1BWF9KT0lOX1RJTUVPVVQpOworCQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAorCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoTUFYX0pPSU5fVElNRU9VVCkpOwogCQl9IGVsc2UgewogCQkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX1NUQVRFKSA9PSB0cnVlKSB7CiAJCQkJLyogIHN1Ym1pdCBjcmVhdGVic3NfY21kIHRvIGNoYW5nZSB0byBhIEFESE9DX01BU1RFUiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19sZWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbGVkLmMKaW5kZXggMWI4MjY0Yi4uOTQ0MDVkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19sZWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X2xlZC5jCkBAIC0yMiw5ICsyMiw5IEBACiAvKgkJQ2FsbGJhY2sgZnVuY3Rpb24gb2YgTEVEIEJsaW5rVGltZXIsICovCiAvKgkJaXQganVzdCBzY2hlZHVsZXMgdG8gY29ycmVzcG9uZGluZyBCbGlua1dvcmtJdGVtL2xlZF9ibGlua19oZGwgKi8KIC8qICAqLwotdm9pZCBCbGlua1RpbWVyQ2FsbGJhY2sodm9pZCAqZGF0YSkKK3ZvaWQgQmxpbmtUaW1lckNhbGxiYWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgTEVEXzg3MXggKnBMZWQgPSBkYXRhOworCXN0cnVjdCBMRURfODcxeCAqcExlZCA9IChzdHJ1Y3QgTEVEXzg3MXggKilkYXRhOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHBMZWQtPnBhZGFwdGVyOwogCiAJaWYgKChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgfHwgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkpCkBAIC03Miw3ICs3Miw4IEBACiAKIAlSZXNldExlZFN0YXR1cyhwTGVkKTsKIAotCV9pbml0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIHBhZGFwdGVyLT5wbmV0ZGV2LCBCbGlua1RpbWVyQ2FsbGJhY2ssIHBMZWQpOworCXNldHVwX3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIEJsaW5rVGltZXJDYWxsYmFjaywKKwkJICAgICh1bnNpZ25lZCBsb25nKXBMZWQpOwogCiAJSU5JVF9XT1JLKCYocExlZC0+QmxpbmtXb3JrSXRlbSksIEJsaW5rV29ya0l0ZW1DYWxsYmFjayk7CiB9CkBAIC0xMjIsMTQgKzEyMywxNiBAQAogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwogCQllbHNlCiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfTk9STUFMOgogCQlpZiAocExlZC0+YkxlZE9uKQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwogCQllbHNlCiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfU0NBTjoKIAkJcExlZC0+QmxpbmtUaW1lcy0tOwpAQCAtMTQzLDcgKzE0Niw4IEBACiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09GRjsKIAkJCQllbHNlCiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxMl9sZWRfY18sIF9kcnZfaW5mb18sICgiQ3VyckxlZFN0YXRlICVkXG4iLCBwTGVkLT5DdXJyTGVkU3RhdGUpKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewogCQkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtMTUyLDcgKzE1Niw4IEBACiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09GRjsKIAkJCQllbHNlCiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxMl9sZWRfY18sIF9kcnZfaW5mb18sICgiQ3VyckxlZFN0YXRlICVkXG4iLCBwTGVkLT5DdXJyTGVkU3RhdGUpKTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CkBAIC0xNjEsNyArMTY2LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfVFhSWDoKQEAgLTE3Niw3ICsxODIsOCBAQAogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQkJZWxzZQogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MTJfbGVkX2NfLCBfZHJ2X2luZm9fLCAoIkN1cnJMZWRTdGF0ZSAlZFxuIiwgcExlZC0+Q3VyckxlZFN0YXRlKSk7CiAJCQl9IGVsc2UgaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX0xJTktFRCkpIHsKIAkJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTE4NSw3ICsxOTIsOCBAQAogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQkJZWxzZQogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MTJfbGVkX2NfLCBfZHJ2X2luZm9fLCAoIkN1cnJMZWRTdGF0ZSAlZFxuIiwgcExlZC0+Q3VyckxlZFN0YXRlKSk7CiAJCQl9CiAJCQlwTGVkLT5CbGlua1RpbWVzID0gMDsKQEAgLTE5NSw3ICsyMDMsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfV1BTOgpAQCAtMjAzLDcgKzIxMiw4IEBACiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCWVsc2UKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQlicmVhazsKIAljYXNlIExFRF9CTElOS19XUFNfU1RPUDoJLyogV1BTIHN1Y2Nlc3MgKi8KIAkJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gUlRXX0xFRF9PTikKQEAgLTIxOCwxNCArMjI4LDE1IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzEyX2xlZF9jXywgX2Rydl9pbmZvXywgKCJDdXJyTGVkU3RhdGUgJWRcbiIsIHBMZWQtPkN1cnJMZWRTdGF0ZSkpOwogCiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1dQU19TVUNDRVNTX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19XUFNfU1VDQ0VTU19JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yNjIsNyArMjczLDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX0xJTks6CkBAIC0yODMsNyArMjk1LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NJVEVfU1VSVkVZOgpAQCAtMzExLDcgKzMyNCw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQkgfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfVFg6CkBAIC0zMzQsNyArMzQ4LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVEFSVF9XUFM6IC8qIHdhaXQgdW50aWwgeGlucGluIGZpbmlzaCAqLwpAQCAtMzYyLDcgKzM3Nyw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQkgfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfU1RPUF9XUFM6CkBAIC0zODksMTEgKzQwNSwxMiBAQAogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTX1NUT1A7CiAJCWlmIChwTGVkLT5iTGVkT24pIHsKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09GRjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfV1BTX1NVQ0NFU1NfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1dQU19TVUNDRVNTX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0gZWxzZSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gUlRXX0xFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTX0ZBSUw6CkBAIC00MDcsNyArNDI0LDggQEAKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBSVFdfTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IFJUV19MRURfT047Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IFJUV19MRURfT0ZGOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYwppbmRleCBkNDYzMmRhLi42YzkxYWE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWUuYwpAQCAtNjY1LDcgKzY2NSw4IEBACiAJCQkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7CiAKIAkJCQlpZiAocnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfcXVldWUocG1sbWVwcml2KSA9PSBfU1VDQ0VTUykgewotCQkJCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCBNQVhfSk9JTl9USU1FT1VUKTsKKwkJCQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAorCQkJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhNQVhfSk9JTl9USU1FT1VUKSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJc3RydWN0IHdsYW5fYnNzaWRfZXggICAgKnBkZXZfbmV0d29yayA9ICYoYWRhcHRlci0+cmVnaXN0cnlwcml2LmRldl9uZXR3b3JrKTsKIAkJCQkJdTggKnBpYnNzID0gYWRhcHRlci0+cmVnaXN0cnlwcml2LmRldl9uZXR3b3JrLk1hY0FkZHJlc3M7CkBAIC02OTIsNyArNjkzLDggQEAKIAkJCXBtbG1lcHJpdi0+dG9fam9pbiA9IGZhbHNlOwogCQkJc19yZXQgPSBydHdfc2VsZWN0X2FuZF9qb2luX2Zyb21fc2Nhbm5lZF9xdWV1ZShwbWxtZXByaXYpOwogCQkJaWYgKF9TVUNDRVNTID09IHNfcmV0KSB7Ci0JCQkgICAgIF9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIE1BWF9KT0lOX1RJTUVPVVQpOworCQkJICAgICBtb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCisJCQkJICAgICAgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKE1BWF9KT0lOX1RJTUVPVVQpKTsKIAkJCX0gZWxzZSBpZiAoc19yZXQgPT0gMikgeyAvKiB0aGVyZSBpcyBubyBuZWVkIHRvIHdhaXQgZm9yIGpvaW4gKi8KIAkJCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwogCQkJCXJ0d19pbmRpY2F0ZV9jb25uZWN0KGFkYXB0ZXIpOwpAQCAtMTEyNywxNCArMTEyOSwxNiBAQAogCiAJfSBlbHNlIGlmIChwbmV0d29yay0+am9pbl9yZXMgPT0gLTQpIHsKIAkJcnR3X3Jlc2V0X3NlY3VyaXR5cHJpdihhZGFwdGVyKTsKLQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgMSk7CisJCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCiAJCWlmICgoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSkgPT0gdHJ1ZSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywgKCJmYWlsISBjbGVhciBfRldfVU5ERVJfTElOS0lORyBeXl5md19zdGF0ZT0leFxuIiwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOwogCQkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKIAkJfQogCX0gZWxzZSB7IC8qIGlmIGpvaW5fcmVzIDwgMCAoam9pbiBmYWlscyksIHRoZW4gdHJ5IGFnYWluICovCi0JCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIDEpOworCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKIAl9CiAKQEAgLTEzNjAsOSArMTM2NCw5IEBACiAqIF9ydHdfam9pbl90aW1lb3V0X2hhbmRsZXIgLSBUaW1lb3V0L2ZhbGl1cmUgaGFuZGxlciBmb3IgQ01EIEpvaW5Cc3MKICogQGFkYXB0ZXI6IHBvaW50ZXIgdG8gc3RydWN0IGFkYXB0ZXIgc3RydWN0dXJlCiAqLwotdm9pZCBfcnR3X2pvaW5fdGltZW91dF9oYW5kbGVyICh2b2lkICpmdW5jdGlvbl9jb250ZXh0KQordm9pZCBfcnR3X2pvaW5fdGltZW91dF9oYW5kbGVyICh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBmdW5jdGlvbl9jb250ZXh0OworCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopZGF0YTsKIAlzdHJ1Y3QJbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7CiAJaW50IGRvX2pvaW5fcjsKIApAQCAtMTQwMiw5ICsxNDA2LDkgQEAKICogcnR3X3NjYW5fdGltZW91dF9oYW5kbGVyIC0gVGltZW91dC9GYWxpdXJlIGhhbmRsZXIgZm9yIENNRCBTaXRlU3VydmV5CiAqIEBhZGFwdGVyOiBwb2ludGVyIHRvIHN0cnVjdCBhZGFwdGVyIHN0cnVjdHVyZQogKi8KLXZvaWQgcnR3X3NjYW5fdGltZW91dF9oYW5kbGVyICh2b2lkICpmdW5jdGlvbl9jb250ZXh0KQordm9pZCBydHdfc2Nhbl90aW1lb3V0X2hhbmRsZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IGZ1bmN0aW9uX2NvbnRleHQ7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZhZGFwdGVyLT5tbG1lcHJpdjsKIAogCURCR184OEUoRlVOQ19BRFBUX0ZNVCIgZndfc3RhdGU9JXhcbiIsIEZVTkNfQURQVF9BUkcoYWRhcHRlciksIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwpAQCAtMTQyOSw5ICsxNDMzLDkgQEAKIAl9CiB9CiAKLXZvaWQgcnR3X2R5bmFtaWNfY2hlY2tfdGltZXJfaGFuZGxkZXIodm9pZCAqZnVuY3Rpb25fY29udGV4dCkKK3ZvaWQgcnR3X2R5bmFtaWNfY2hlY2tfdGltZXJfaGFuZGxkZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopZnVuY3Rpb25fY29udGV4dDsKKwlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKWRhdGE7CiAJc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnByZWdpc3RyeXByaXYgPSAmYWRhcHRlci0+cmVnaXN0cnlwcml2OwogCiAJaWYgKCFhZGFwdGVyKQpAQCAtMTQ0OSw3ICsxNDUzLDggQEAKIAkJcnR3X2F1dG9fc2Nhbl9oYW5kbGVyKGFkYXB0ZXIpOwogCX0KIGV4aXQ6Ci0JX3NldF90aW1lcigmYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsIDIwMDApOworCW1vZF90aW1lcigmYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsCisJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOwogfQogCiAjZGVmaW5lIFJUV19TQ0FOX1JFU1VMVF9FWFBJUkUgMjAwMApAQCAtMjAzNyw3ICsyMDQyLDcgQEAKIAlwID0gcnR3X2dldF9pZShwaWUrc2l6ZW9mKHN0cnVjdCBuZGlzXzgwMl8xMV9maXhlZF9pZSksIF9IVF9DQVBBQklMSVRZX0lFXywgJmxlbiwgaWVfbGVuLXNpemVvZihzdHJ1Y3QgbmRpc184MDJfMTFfZml4ZWRfaWUpKTsKIAlpZiAocCAmJiBsZW4gPiAwKSB7CiAJCXBodF9jYXBpZSA9IChzdHJ1Y3QgcnR3X2llZWU4MDIxMV9odF9jYXAgKikocCsyKTsKLQkJbWF4X2FtcGR1X3N6ID0gKHBodF9jYXBpZS0+YW1wZHVfcGFyYW1zX2luZm8gJiBJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0ZBQ1RPUik7CisJCW1heF9hbXBkdV9zeiA9IHBodF9jYXBpZS0+YW1wZHVfcGFyYW1zX2luZm8gJiBJRUVFODAyMTFfSFRfQ0FQX0FNUERVX0ZBQ1RPUjsKIAkJbWF4X2FtcGR1X3N6ID0gMSA8PCAobWF4X2FtcGR1X3N6KzMpOyAvKiAgbWF4X2FtcGR1X3N6IChrYnl0ZXMpOyAqLwogCQlwaHRwcml2LT5yeF9hbXBkdV9tYXhsZW4gPSBtYXhfYW1wZHVfc3o7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lX2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19tbG1lX2V4dC5jCmluZGV4IGNkMTJkZDcuLmJlOWUzNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfbWxtZV9leHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X21sbWVfZXh0LmMKQEAgLTE2MzksNyArMTYzOSw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBSVFdfV0xBTl9BQ1RJT05fQUREQkFfUkVTUDogLyogQUREQkEgcmVzcG9uc2UgKi8KIAkJCXN0YXR1cyA9IGdldF91bmFsaWduZWRfbGUxNigmZnJhbWVfYm9keVszXSk7Ci0JCQl0aWQgPSAoKGZyYW1lX2JvZHlbNV0gPj4gMikgJiAweDcpOworCQkJdGlkID0gKGZyYW1lX2JvZHlbNV0gPj4gMikgJiAweDc7CiAJCQlpZiAoc3RhdHVzID09IDApIHsJLyogc3VjY2Vzc2Z1bCAqLwogCQkJCURCR184OEUoImFnZ19lbmFibGUgZm9yIFRJRD0lZFxuIiwgdGlkKTsKIAkJCQlwc3RhLT5odHByaXYuYWdnX2VuYWJsZV9iaXRtYXAgfD0gMSA8PCB0aWQ7CkBAIC0yNDkxLDcgKzI0OTEsNyBAQAogCiAJCS8qIHNldHRpbmcgSVYgZm9yIGF1dGggc2VxICMzICovCiAJCWlmICgocG1sbWVpbmZvLT5hdXRoX3NlcSA9PSAzKSAmJiAocG1sbWVpbmZvLT5zdGF0ZSAmIFdJRklfRldfQVVUSF9TVEFURSkgJiYgKHVzZV9zaGFyZWRfa2V5ID09IDEpKSB7Ci0JCQl2YWwzMiA9ICgocG1sbWVpbmZvLT5pdisrKSB8IChwbWxtZWluZm8tPmtleV9pbmRleCA8PCAzMCkpOworCQkJdmFsMzIgPSAocG1sbWVpbmZvLT5pdisrKSB8IChwbWxtZWluZm8tPmtleV9pbmRleCA8PCAzMCk7CiAJCQlsZV90bXAzMiA9IGNwdV90b19sZTMyKHZhbDMyKTsKIAkJCXBmcmFtZSA9IHJ0d19zZXRfZml4ZWRfaWUocGZyYW1lLCA0LCAodW5zaWduZWQgY2hhciAqKSZsZV90bXAzMiwgJihwYXR0cmliLT5wa3RsZW4pKTsKIApAQCAtMzMzMSw3ICszMzMxLDcgQEAKIAkJCX0gd2hpbGUgKHBtbG1laW5mby0+ZGlhbG9nVG9rZW4gPT0gMCk7CiAJCQlwZnJhbWUgPSBydHdfc2V0X2ZpeGVkX2llKHBmcmFtZSwgMSwgJihwbWxtZWluZm8tPmRpYWxvZ1Rva2VuKSwgJihwYXR0cmliLT5wa3RsZW4pKTsKIAotCQkJQkFfcGFyYV9zZXQgPSAoMHgxMDAyIHwgKChzdGF0dXMgJiAweGYpIDw8IDIpKTsgLyogaW1tZWRpYXRlIGFjayAmIDY0IGJ1ZmZlciBzaXplICovCisJCQlCQV9wYXJhX3NldCA9IDB4MTAwMiB8ICgoc3RhdHVzICYgMHhmKSA8PCAyKTsgLyogaW1tZWRpYXRlIGFjayAmIDY0IGJ1ZmZlciBzaXplICovCiAJCQlsZV90bXAgPSBjcHVfdG9fbGUxNihCQV9wYXJhX3NldCk7CiAJCQlwZnJhbWUgPSBydHdfc2V0X2ZpeGVkX2llKHBmcmFtZSwgMiwgKHVuc2lnbmVkIGNoYXIgKikoJihsZV90bXApKSwgJihwYXR0cmliLT5wa3RsZW4pKTsKIApAQCAtMzk3Miw4ICszOTcyLDggQEAKIAkJLyogYW5kIGVuYWJsZSBhIHRpbWVyICovCiAJCWJlYWNvbl90aW1lb3V0ID0gZGVjaWRlX3dhaXRfZm9yX2JlYWNvbl90aW1lb3V0KHBtbG1laW5mby0+YmNuX2ludGVydmFsKTsKIAkJc2V0X2xpbmtfdGltZXIocG1sbWVleHQsIGJlYWNvbl90aW1lb3V0KTsKLQkJX3NldF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LmFzc29jX3RpbWVyLAotCQkJICAgKFJFQVVUSF9UTyAqIFJFQVVUSF9MSU1JVCkgKyAoUkVBU1NPQ19UTypSRUFTU09DX0xJTUlUKSArIGJlYWNvbl90aW1lb3V0KTsKKwkJbW9kX3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuYXNzb2NfdGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKChSRUFVVEhfVE8gKiBSRUFVVEhfTElNSVQpICsgKFJFQVNTT0NfVE8gKiBSRUFTU09DX0xJTUlUKSArIGJlYWNvbl90aW1lb3V0KSk7CiAKIAkJcG1sbWVpbmZvLT5zdGF0ZSA9IFdJRklfRldfQVVUSF9OVUxMIHwgV0lGSV9GV19TVEFUSU9OX1NUQVRFOwogCX0gZWxzZSBpZiAoY2FwcyZjYXBfSUJTUykgeyAvKiBhZGhvYyBjbGllbnQgKi8KQEAgLTQyNDcsNyArNDI0Nyw3IEBACiAJaWYgKHBjbWRfb2JqID09IE5VTEwpCiAJCXJldHVybjsKIAotCWNtZHN6ID0gKHNpemVvZihzdHJ1Y3Qgc3VydmV5X2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CisJY21kc3ogPSBzaXplb2Yoc3RydWN0IHN1cnZleV9ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcik7CiAJcGV2dGNtZCA9IGt6YWxsb2MoY21kc3osIEdGUF9BVE9NSUMpOwogCWlmIChwZXZ0Y21kID09IE5VTEwpIHsKIAkJa2ZyZWUocGNtZF9vYmopOwpAQCAtNDI5OSw3ICs0Mjk5LDcgQEAKIAlpZiAocGNtZF9vYmogPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JY21kc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlkb25lX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CisJY21kc3ogPSBzaXplb2Yoc3RydWN0IHN1cnZleWRvbmVfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwogCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfS0VSTkVMKTsKIAlpZiAocGV2dGNtZCA9PSBOVUxMKSB7CiAJCWtmcmVlKHBjbWRfb2JqKTsKQEAgLTQzNDUsNyArNDM0NSw3IEBACiAJaWYgKHBjbWRfb2JqID09IE5VTEwpCiAJCXJldHVybjsKIAotCWNtZHN6ID0gKHNpemVvZihzdHJ1Y3Qgam9pbmJzc19ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOworCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBqb2luYnNzX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKIAlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7CiAJaWYgKHBldnRjbWQgPT0gTlVMTCkgewogCQlrZnJlZShwY21kX29iaik7CkBAIC00Mzk4LDcgKzQzOTgsNyBAQAogCWlmIChwY21kX29iaiA9PSBOVUxMKQogCQlyZXR1cm47CiAKLQljbWRzeiA9IChzaXplb2Yoc3RydWN0IHN0YWRlbF9ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOworCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBzdGFkZWxfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwogCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfS0VSTkVMKTsKIAlpZiAocGV2dGNtZCA9PSBOVUxMKSB7CiAJCWtmcmVlKHBjbWRfb2JqKTsKQEAgLTQ0MjgsNyArNDQyOCw3IEBACiAJaWYgKHBzdGEpCiAJCW1hY19pZCA9IChpbnQpcHN0YS0+bWFjX2lkOwogCWVsc2UKLQkJbWFjX2lkID0gKC0xKTsKKwkJbWFjX2lkID0gLTE7CiAKIAlwZGVsX3N0YV9ldnQtPm1hY19pZCA9IG1hY19pZDsKIApAQCAtNDQ1Myw3ICs0NDUzLDcgQEAKIAlpZiAocGNtZF9vYmogPT0gTlVMTCkKIAkJcmV0dXJuOwogCi0JY21kc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdGFzc29jX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKSk7CisJY21kc3ogPSBzaXplb2Yoc3RydWN0IHN0YXNzb2NfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwogCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfS0VSTkVMKTsKIAlpZiAocGV2dGNtZCA9PSBOVUxMKSB7CiAJCWtmcmVlKHBjbWRfb2JqKTsKQEAgLTQ4MzUsOSArNDgzNSw5IEBACiAJfQogfQogCi12b2lkIHN1cnZleV90aW1lcl9oZGwodm9pZCAqZnVuY3Rpb25fY29udGV4dCkKK3ZvaWQgc3VydmV5X3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gZnVuY3Rpb25fY29udGV4dDsKKwlzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwogCXN0cnVjdCBjbWRfb2JqCSpwaDJjOwogCXN0cnVjdCBzaXRlc3VydmV5X3Bhcm0JKnBzdXJ2ZXlQYXJhOwogCXN0cnVjdCBjbWRfcHJpdgkJCQkJKnBjbWRwcml2ID0gJnBhZGFwdGVyLT5jbWRwcml2OwpAQCAtNDg3NSw5ICs0ODc1LDkgQEAKIAlyZXR1cm47CiB9CiAKLXZvaWQgbGlua190aW1lcl9oZGwodm9pZCAqZnVuY3Rpb25fY29udGV4dCkKK3ZvaWQgbGlua190aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKWZ1bmN0aW9uX2NvbnRleHQ7CisJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopZGF0YTsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdgkqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmKHBtbG1lZXh0LT5tbG1leHRfaW5mbyk7CiAKQEAgLTQ5MTIsOSArNDkxMiw5IEBACiAJcmV0dXJuOwogfQogCi12b2lkIGFkZGJhX3RpbWVyX2hkbCh2b2lkICpmdW5jdGlvbl9jb250ZXh0KQordm9pZCBhZGRiYV90aW1lcl9oZGwodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IGZ1bmN0aW9uX2NvbnRleHQ7CisJc3RydWN0IHN0YV9pbmZvICpwc3RhID0gKHN0cnVjdCBzdGFfaW5mbyAqKWRhdGE7CiAJc3RydWN0IGh0X3ByaXYJKnBodHByaXY7CiAKIAlpZiAoIXBzdGEpCkBAIC01MzU2LDcgKzUzNTYsNyBAQAogCiAJCXBzdGEgPSBydHdfZ2V0X3N0YWluZm8ocHN0YXByaXYsIHBwYXJtLT5hZGRyKTsKIAkJaWYgKHBzdGEpIHsKLQkJCWN0cmwgPSAoQklUKDE1KSB8ICgocHBhcm0tPmFsZ29yaXRobSkgPDwgMikpOworCQkJY3RybCA9IEJJVCgxNSkgfCAoKHBwYXJtLT5hbGdvcml0aG0pIDw8IDIpOwogCiAJCQlEQkdfODhFKCJyODcxeF9zZXRfc3Rha2V5X2hkbCgpOiBlbmNfYWxnb3JpdGhtPSVkXG4iLCBwcGFybS0+YWxnb3JpdGhtKTsKIApAQCAtNTM2NSw3ICs1MzY1LDcgQEAKIAkJCQlyZXR1cm4gSDJDX1JFSkVDVEVEOwogCQkJfQogCi0JCQljYW1faWQgPSAocHN0YS0+bWFjX2lkICsgMyk7LyogMH4zIGZvciBkZWZhdWx0IGtleSwgY21kX2lkID0gbWFjaWQgKyAzLCBtYWNpZCA9IGFpZCsxOyAqLworCQkJY2FtX2lkID0gcHN0YS0+bWFjX2lkICsgMzsvKiAwfjMgZm9yIGRlZmF1bHQga2V5LCBjbWRfaWQgPSBtYWNpZCArIDMsIG1hY2lkID0gYWlkKzE7ICovCiAKIAkJCURCR184OEUoIldyaXRlIENBTSwgbWFjX2FkZHIgPSV4OiV4OiV4OiV4OiV4OiV4LCBjYW1fZW50cnk9JWRcbiIsIHBwYXJtLT5hZGRyWzBdLAogCQkJCXBwYXJtLT5hZGRyWzFdLCBwcGFybS0+YWRkclsyXSwgcHBhcm0tPmFkZHJbM10sIHBwYXJtLT5hZGRyWzRdLApAQCAtNTQwNiw3ICs1NDA2LDggQEAKIAlpZiAoKChwbWxtZWluZm8tPnN0YXRlICYgV0lGSV9GV19BU1NPQ19TVUNDRVNTKSAmJiAocG1sbWVpbmZvLT5IVF9lbmFibGUpKSB8fAogCSAgICAoKHBtbG1laW5mby0+c3RhdGUmMHgwMykgPT0gV0lGSV9GV19BUF9TVEFURSkpIHsKIAkJaXNzdWVfYWN0aW9uX0JBKHBhZGFwdGVyLCBwcGFybS0+YWRkciwgUlRXX1dMQU5fQUNUSU9OX0FEREJBX1JFUSwgKHUxNilwcGFybS0+dGlkKTsKLQkJX3NldF90aW1lcigmcHN0YS0+YWRkYmFfcmV0cnlfdGltZXIsIEFEREJBX1RPKTsKKwkJbW9kX3RpbWVyKCZwc3RhLT5hZGRiYV9yZXRyeV90aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQUREQkFfVE8pKTsKIAl9IGVsc2UgewogCQlwc3RhLT5odHByaXYuY2FuZGlkYXRlX3RpZF9iaXRtYXAgJj0gfkJJVChwcGFybS0+dGlkKTsKIAl9CkBAIC01NDMwLDE1ICs1NDMxLDE0IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQlwdHhCZWFjb25fcGFybSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSwgR0ZQX0tFUk5FTCk7CisJcHR4QmVhY29uX3Bhcm0gPSBrbWVtZHVwKCYocG1sbWVpbmZvLT5uZXR3b3JrKSwKKwkJCQlzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpLCBHRlBfS0VSTkVMKTsKIAlpZiAocHR4QmVhY29uX3Bhcm0gPT0gTlVMTCkgewogCQlrZnJlZShwaDJjKTsKIAkJcmVzID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9CiAKLQltZW1jcHkocHR4QmVhY29uX3Bhcm0sICYocG1sbWVpbmZvLT5uZXR3b3JrKSwgc2l6ZW9mKHN0cnVjdCB3bGFuX2Jzc2lkX2V4KSk7Ci0KIAlsZW5fZGlmZiA9IHVwZGF0ZV9oaWRkZW5fc3NpZChwdHhCZWFjb25fcGFybS0+SUVzK19CRUFDT05fSUVfT0ZGU0VUXywKIAkJCQkgICAgICBwdHhCZWFjb25fcGFybS0+SUVMZW5ndGgtX0JFQUNPTl9JRV9PRkZTRVRfLAogCQkJCSAgICAgIHBtbG1laW5mby0+aGlkZGVuX3NzaWRfbW9kZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfcHdyY3RybC5jCmluZGV4IGRmNDYzYTI5Li5lYzBhOGE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3B3cmN0cmwuYwpAQCAtMjgxLDkgKzI4MSw5IEBACiAJcHdycHJpdi0+cHNfcHJvY2Vzc2luZyA9IGZhbHNlOwogfQogCi1zdGF0aWMgdm9pZCBwd3Jfc3RhdGVfY2hlY2tfaGFuZGxlcih2b2lkICpGdW5jdGlvbkNvbnRleHQpCitzdGF0aWMgdm9pZCBwd3Jfc3RhdGVfY2hlY2tfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgYWRhcHRlciAqKWRhdGE7CiAJcnR3X3BzX2NtZChwYWRhcHRlcik7CiB9CiAKQEAgLTU0NCw3ICs1NDQsOSBAQAogCiAJcHdyY3RybHByaXYtPmJ0Y29leF9yZm9uID0gZmFsc2U7CiAKLQlfaW5pdF90aW1lcigmKHB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwgcHdyX3N0YXRlX2NoZWNrX2hhbmRsZXIsICh1OCAqKXBhZGFwdGVyKTsKKwlzZXR1cF90aW1lcigmcHdyY3RybHByaXYtPnB3cl9zdGF0ZV9jaGVja190aW1lciwKKwkJICAgIHB3cl9zdGF0ZV9jaGVja19oYW5kbGVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwogfQogCiBpbmxpbmUgdm9pZCBydHdfc2V0X2lwc19kZW55KHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciwgdTMyIG1zKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19yZWN2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYwppbmRleCBiZDc5ZTllLi5jZGE3MjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3JlY3YuYwpAQCAtNDEsNyArNDEsNyBAQAogICAgICAgIDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAKIH07CiAKLXZvaWQgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbChSVFdfVElNRVJfSERMX0FSR1MpOwordm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiAKIHZvaWQgX3J0d19pbml0X3N0YV9yZWN2X3ByaXYoc3RydWN0IHN0YV9yZWN2X3ByaXYgKnBzdGFfcmVjdnByaXYpCiB7CkBAIC05OCw3ICs5OCw5IEBACiAKIAlyZXMgPSBydHdfaGFsX2luaXRfcmVjdl9wcml2KHBhZGFwdGVyKTsKIAotCV9pbml0X3RpbWVyKCZwcmVjdnByaXYtPnNpZ25hbF9zdGF0X3RpbWVyLCBwYWRhcHRlci0+cG5ldGRldiwgUlRXX1RJTUVSX0hETF9OQU1FKHNpZ25hbF9zdGF0KSwgcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwcmVjdnByaXYtPnNpZ25hbF9zdGF0X3RpbWVyLAorCQkgICAgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbCwKKwkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKIAogCXByZWN2cHJpdi0+c2lnbmFsX3N0YXRfc2FtcGxpbmdfaW50ZXJ2YWwgPSAxMDAwOyAvKiBtcyAqLwogCkBAIC0xOTI3LDcgKzE5MjksOCBAQAogCiAJLyogcmVjdl9pbmRpY2F0ZXBrdHNfaW5fb3JkZXIocGFkYXB0ZXIsIHByZW9yZGVyX2N0cmwsIHRydWUpOyAqLwogCWlmIChyZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcihwYWRhcHRlciwgcHJlb3JkZXJfY3RybCwgZmFsc2UpKSB7Ci0JCV9zZXRfdGltZXIoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lciwgUkVPUkRFUl9XQUlUX1RJTUUpOworCQltb2RfdGltZXIoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUkVPUkRFUl9XQUlUX1RJTUUpKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7CiAJfSBlbHNlIHsKIAkJc3Bpbl91bmxvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7CkBAIC0xOTQ1LDkgKzE5NDgsOSBAQAogCXJldHVybiBfRkFJTDsKIH0KIAotdm9pZCBydHdfcmVvcmRlcmluZ19jdHJsX3RpbWVvdXRfaGFuZGxlcih2b2lkICpwY29udGV4dCkKK3ZvaWQgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCA9IHBjb250ZXh0OworCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCA9IChzdHJ1Y3QgcmVjdl9yZW9yZGVyX2N0cmwgKilkYXRhOwogCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHByZW9yZGVyX2N0cmwtPnBhZGFwdGVyOwogCXN0cnVjdCBfX3F1ZXVlICpwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUgPSAmcHJlb3JkZXJfY3RybC0+cGVuZGluZ19yZWN2ZnJhbWVfcXVldWU7CiAKQEAgLTE5NTcsNyArMTk2MCw4IEBACiAJc3Bpbl9sb2NrX2JoKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2spOwogCiAJaWYgKHJlY3ZfaW5kaWNhdGVwa3RzX2luX29yZGVyKHBhZGFwdGVyLCBwcmVvcmRlcl9jdHJsLCB0cnVlKSA9PSB0cnVlKQotCQlfc2V0X3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIsIFJFT1JERVJfV0FJVF9USU1FKTsKKwkJbW9kX3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFJFT1JERVJfV0FJVF9USU1FKSk7CiAKIAlzcGluX3VubG9ja19iaCgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsKIH0KQEAgLTIxMzAsOSArMjEzNCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBydHdfc2lnbmFsX3N0YXRfdGltZXJfaGRsKFJUV19USU1FUl9IRExfQVJHUykKK3ZvaWQgcnR3X3NpZ25hbF9zdGF0X3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IGFkYXB0ZXIgKilkYXRhOwogCXN0cnVjdCByZWN2X3ByaXYgKnJlY3Zwcml2ID0gJmFkYXB0ZXItPnJlY3Zwcml2OwogCiAJdTMyIHRtcF9zLCB0bXBfcTsKQEAgLTIxNTksNyArMjE2Myw3IEBACiAKIAkJLyogdXBkYXRlIHZhbHVlIG9mIHNpZ25hbF9zdHJlbmd0aCwgcnNzaSwgc2lnbmFsX3F1YWwgKi8KIAkJaWYgKGNoZWNrX2Z3c3RhdGUoJmFkYXB0ZXItPm1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKSA9PSBmYWxzZSkgewotCQkJdG1wX3MgPSAoYXZnX3NpZ25hbF9zdHJlbmd0aCsoX2FscGhhLTEpKnJlY3Zwcml2LT5zaWduYWxfc3RyZW5ndGgpOworCQkJdG1wX3MgPSBhdmdfc2lnbmFsX3N0cmVuZ3RoKyhfYWxwaGEtMSkqcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aDsKIAkJCWlmICh0bXBfcyAlIF9hbHBoYSkKIAkJCQl0bXBfcyA9IHRtcF9zL19hbHBoYSArIDE7CiAJCQllbHNlCkBAIC0yMTY3LDcgKzIxNzEsNyBAQAogCQkJaWYgKHRtcF9zID4gMTAwKQogCQkJCXRtcF9zID0gMTAwOwogCi0JCQl0bXBfcSA9IChhdmdfc2lnbmFsX3F1YWwrKF9hbHBoYS0xKSpyZWN2cHJpdi0+c2lnbmFsX3F1YWwpOworCQkJdG1wX3EgPSBhdmdfc2lnbmFsX3F1YWwrKF9hbHBoYS0xKSpyZWN2cHJpdi0+c2lnbmFsX3F1YWw7CiAJCQlpZiAodG1wX3EgJSBfYWxwaGEpCiAJCQkJdG1wX3EgPSB0bXBfcS9fYWxwaGEgKyAxOwogCQkJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zZWN1cml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zZWN1cml0eS5jCmluZGV4IGJkOGQ2MGEuLmQ4NzBhNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc2VjdXJpdHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NlY3VyaXR5LmMKQEAgLTg1NCw3ICs4NTQsNyBAQAogCXU4IGFkZDFiWzRdOwogCXU4IGFkZDFiZjdbNF07CiAJdTggcm90bFs0XTsKLQl1OCBzd2FwX2hhbGZzWzRdOworCXU4IHN3YXBfaGFsdmVzWzRdOwogCXU4IGFuZGY3WzRdOwogCXU4IHJvdHJbNF07CiAJdTggdGVtcFs0XTsKQEAgLTg2NiwxMCArODY2LDEwIEBACiAJCQlhZGQxYltpXSA9IDB4MDA7CiAJfQogCi0Jc3dhcF9oYWxmc1swXSA9IGluWzJdOyAgICAvKiBTd2FwIGhhbHZlcyAqLwotCXN3YXBfaGFsZnNbMV0gPSBpblszXTsKLQlzd2FwX2hhbGZzWzJdID0gaW5bMF07Ci0Jc3dhcF9oYWxmc1szXSA9IGluWzFdOworCXN3YXBfaGFsdmVzWzBdID0gaW5bMl07ICAgIC8qIFN3YXAgaGFsdmVzICovCisJc3dhcF9oYWx2ZXNbMV0gPSBpblszXTsKKwlzd2FwX2hhbHZlc1syXSA9IGluWzBdOworCXN3YXBfaGFsdmVzWzNdID0gaW5bMV07CiAKIAlyb3RsWzBdID0gaW5bM107CS8qIFJvdGF0ZSBsZWZ0IDggYml0cyAqLwogCXJvdGxbMV0gPSBpblswXTsKQEAgLTkwMCw3ICs5MDAsNyBAQAogCXJvdHJbM10gPSB0ZW1wWzBdOwogCiAJeG9yXzMyKGFkZDFiZjcsIHJvdHIsIHRlbXApOwotCXhvcl8zMihzd2FwX2hhbGZzLCByb3RsLCB0ZW1wYik7CisJeG9yXzMyKHN3YXBfaGFsdmVzLCByb3RsLCB0ZW1wYik7CiAJeG9yXzMyKHRlbXAsIHRlbXBiLCBvdXQpOwogfQogCkBAIC0xMDc5LDcgKzEwNzksNyBAQAogCXVpbnQJZnJ0eXBlICA9IEdldEZyYW1lVHlwZShwZnJhbWUpOwogCXVpbnQJZnJzdWJ0eXBlICA9IEdldEZyYW1lU3ViVHlwZShwZnJhbWUpOwogCi0JZnJzdWJ0eXBlID0gZnJzdWJ0eXBlPj40OworCWZyc3VidHlwZSA+Pj0gNDsKIAogCW1lbXNldCgodm9pZCAqKW1pY19pdiwgMCwgMTYpOwogCW1lbXNldCgodm9pZCAqKW1pY19oZWFkZXIxLCAwLCAxNik7CkBAIC0xMTIyLDcgKzExMjIsNyBAQAogCW51bV9ibG9ja3MgPSBwbGVuIC8gMTY7CiAKIAkvKiBGaW5kIHN0YXJ0IG9mIHBheWxvYWQgKi8KLQlwYXlsb2FkX2luZGV4ID0gKGhkcmxlbiArIDgpOworCXBheWxvYWRfaW5kZXggPSBoZHJsZW4gKyA4OwogCiAJLyogQ2FsY3VsYXRlIE1JQyAqLwogCWFlczEyOGsxMjhkKGtleSwgbWljX2l2LCBhZXNfb3V0KTsKQEAgLTEyNzcsNyArMTI3Nyw3IEBACiAvKgl1aW50CW9mZnNldCA9IDA7ICovCiAJdWludAlmcnR5cGUgID0gR2V0RnJhbWVUeXBlKHBmcmFtZSk7CiAJdWludAlmcnN1YnR5cGUgID0gR2V0RnJhbWVTdWJUeXBlKHBmcmFtZSk7Ci0JZnJzdWJ0eXBlID0gZnJzdWJ0eXBlPj40OworCWZyc3VidHlwZSA+Pj0gNDsKIAogCW1lbXNldCgodm9pZCAqKW1pY19pdiwgMCwgMTYpOwogCW1lbXNldCgodm9pZCAqKW1pY19oZWFkZXIxLCAwLCAxNik7CkBAIC0xMzY2LDcgKzEzNjYsNyBAQAogCW51bV9ibG9ja3MgPSAocGxlbi04KSAvIDE2OwogCiAJLyogRmluZCBzdGFydCBvZiBwYXlsb2FkICovCi0JcGF5bG9hZF9pbmRleCA9IChoZHJsZW4gKyA4KTsKKwlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsKIAogCS8qIENhbGN1bGF0ZSBNSUMgKi8KIAlhZXMxMjhrMTI4ZChrZXksIG1pY19pdiwgYWVzX291dCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NyZXNldC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d19zcmVzZXQuYwppbmRleCBjZDRlMzQ0Li5lNzI1YTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3NyZXNldC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfc3Jlc2V0LmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogCWlmIChXSUZJX1NUQVRVU19TVUNDRVNTICE9IHBzcnRwcml2LT5XaWZpX0Vycm9yX1N0YXR1cykgewogCQlEQkdfODhFKCI9PT4lcyBlcnJvcl9zdGF0dXMoMHgleClcbiIsIF9fZnVuY19fLCBwc3J0cHJpdi0+V2lmaV9FcnJvcl9TdGF0dXMpOwotCQlzdGF0dXMgPSAocHNydHByaXYtPldpZmlfRXJyb3JfU3RhdHVzICYgKH4oVVNCX1JFQURfUE9SVF9GQUlMfFVTQl9XUklURV9QT1JUX0ZBSUwpKSk7CisJCXN0YXR1cyA9IHBzcnRwcml2LT5XaWZpX0Vycm9yX1N0YXR1cyAmICh+KFVTQl9SRUFEX1BPUlRfRkFJTHxVU0JfV1JJVEVfUE9SVF9GQUlMKSk7CiAJfQogCURCR184OEUoIj09PiAlcyB3aWZpX3N0YXR1cygweCV4KVxuIiwgX19mdW5jX18sIHN0YXR1cyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3dsYW5fdXRpbC5jCmluZGV4IGEzZmZjNjkuLjJiMzcxNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfd2xhbl91dGlsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9jb3JlL3J0d193bGFuX3V0aWwuYwpAQCAtODgsMzUgKzg4LDI1IEBACiAKIHVuc2lnbmVkIGNoYXIgbmV0d29ya3R5cGVfdG9fcmFpZCh1bnNpZ25lZCBjaGFyIG5ldHdvcmtfdHlwZSkKIHsKLQl1bnNpZ25lZCBjaGFyIHJhaWQ7Ci0KIAlzd2l0Y2ggKG5ldHdvcmtfdHlwZSkgewogCWNhc2UgV0lSRUxFU1NfMTFCOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfQjsKLQkJYnJlYWs7CisJCXJldHVybiBSQVRSX0lOWF9XSVJFTEVTU19COwogCWNhc2UgV0lSRUxFU1NfMTFBOgogCWNhc2UgV0lSRUxFU1NfMTFHOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfRzsKLQkJYnJlYWs7CisJCXJldHVybiBSQVRSX0lOWF9XSVJFTEVTU19HOwogCWNhc2UgV0lSRUxFU1NfMTFCRzoKLQkJcmFpZCA9IFJBVFJfSU5YX1dJUkVMRVNTX0dCOwotCQlicmVhazsKKwkJcmV0dXJuIFJBVFJfSU5YX1dJUkVMRVNTX0dCOwogCWNhc2UgV0lSRUxFU1NfMTFfMjROOgogCWNhc2UgV0lSRUxFU1NfMTFfNU46Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19OOwotCQlicmVhazsKKwkJcmV0dXJuIFJBVFJfSU5YX1dJUkVMRVNTX047CiAJY2FzZSBXSVJFTEVTU18xMUFfNU46CiAJY2FzZSBXSVJFTEVTU18xMUdfMjROOgotCQlyYWlkID0gUkFUUl9JTlhfV0lSRUxFU1NfTkc7Ci0JCWJyZWFrOworCQlyZXR1cm4gIFJBVFJfSU5YX1dJUkVMRVNTX05HOwogCWNhc2UgV0lSRUxFU1NfMTFCR18yNE46Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19OR0I7Ci0JCWJyZWFrOworCQlyZXR1cm4gUkFUUl9JTlhfV0lSRUxFU1NfTkdCOwogCWRlZmF1bHQ6Ci0JCXJhaWQgPSBSQVRSX0lOWF9XSVJFTEVTU19HQjsKLQkJYnJlYWs7CisJCXJldHVybiBSQVRSX0lOWF9XSVJFTEVTU19HQjsKIAl9Ci0JcmV0dXJuIHJhaWQ7CiB9CiAKIHU4IGp1ZGdlX25ldHdvcmtfdHlwZShzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuKQpAQCAtMTQ2LDQ3ICsxMzYsMzQgQEAKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgcmF0ZXRibF92YWxfMndpZmlyYXRlKHVuc2lnbmVkIGNoYXIgcmF0ZSkKIHsKLQl1bnNpZ25lZCBjaGFyIHZhbCA9IDA7Ci0KIAlzd2l0Y2ggKHJhdGUgJiAweDdmKSB7CiAJY2FzZSAwOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMU1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CiAJY2FzZSAxOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMk1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9DQ0tfUkFURV8yTUI7CiAJY2FzZSAyOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfNU1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9DQ0tfUkFURV81TUI7CiAJY2FzZSAzOgotCQl2YWwgPSBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKLQkJYnJlYWs7CisJCXJldHVybiBJRUVFODAyMTFfQ0NLX1JBVEVfMTFNQjsKIAljYXNlIDQ6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9PRkRNX1JBVEVfNk1COwogCWNhc2UgNToKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV85TUI7Ci0JCWJyZWFrOworCQlyZXR1cm4gSUVFRTgwMjExX09GRE1fUkFURV85TUI7CiAJY2FzZSA2OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzEyTUI7Ci0JCWJyZWFrOworCQlyZXR1cm4gSUVFRTgwMjExX09GRE1fUkFURV8xMk1COwogCWNhc2UgNzoKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV8xOE1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9PRkRNX1JBVEVfMThNQjsKIAljYXNlIDg6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfMjRNQjsKLQkJYnJlYWs7CisJCXJldHVybiBJRUVFODAyMTFfT0ZETV9SQVRFXzI0TUI7CiAJY2FzZSA5OgotCQl2YWwgPSBJRUVFODAyMTFfT0ZETV9SQVRFXzM2TUI7Ci0JCWJyZWFrOworCQlyZXR1cm4gSUVFRTgwMjExX09GRE1fUkFURV8zNk1COwogCWNhc2UgMTA6Ci0JCXZhbCA9IElFRUU4MDIxMV9PRkRNX1JBVEVfNDhNQjsKLQkJYnJlYWs7CisJCXJldHVybiBJRUVFODAyMTFfT0ZETV9SQVRFXzQ4TUI7CiAJY2FzZSAxMToKLQkJdmFsID0gSUVFRTgwMjExX09GRE1fUkFURV81NE1COwotCQlicmVhazsKKwkJcmV0dXJuIElFRUU4MDIxMV9PRkRNX1JBVEVfNTRNQjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKIAl9Ci0JcmV0dXJuIHZhbDsKIH0KIAogc3RhdGljIGludCBpc19iYXNpY3JhdGUoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCB1bnNpZ25lZCBjaGFyIHJhdGUpCkBAIC00ODUsMTQgKzQ2MiwxNCBAQAogCWZvciAoaiA9IDU7IGogPj0gMDsgai0tKSB7CiAJCXN3aXRjaCAoaikgewogCQljYXNlIDA6Ci0JCQl2YWwgPSAoY3RybCB8IChtYWNbMF0gPDwgMTYpIHwgKG1hY1sxXSA8PCAyNCkpOworCQkJdmFsID0gY3RybCB8IChtYWNbMF0gPDwgMTYpIHwgKG1hY1sxXSA8PCAyNCk7CiAJCQlicmVhazsKIAkJY2FzZSAxOgotCQkJdmFsID0gKG1hY1syXSB8IChtYWNbM10gPDwgOCkgfCAobWFjWzRdIDw8IDE2KSB8IChtYWNbNV0gPDwgMjQpKTsKKwkJCXZhbCA9IG1hY1syXSB8IChtYWNbM10gPDwgOCkgfCAobWFjWzRdIDw8IDE2KSB8IChtYWNbNV0gPDwgMjQpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlpID0gKGogLSAyKSA8PCAyOwotCQkJdmFsID0gKGtleVtpXSB8IChrZXlbaSsxXSA8PCA4KSB8IChrZXlbaSsyXSA8PCAxNikgfCAoa2V5W2krM10gPDwgMjQpKTsKKwkJCXZhbCA9IGtleVtpXSB8IChrZXlbaSsxXSA8PCA4KSB8IChrZXlbaSsyXSA8PCAxNikgfCAoa2V5W2krM10gPDwgMjQpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNTg3LDcgKzU2NCw3IEBACiAJCS8qIEFJRlMgPSBBSUZTTiAqIHNsb3QgdGltZSArIFNJRlMgLSByMnQgcGh5IGRlbGF5ICovCiAJCUFJRlMgPSAocG1sbWVpbmZvLT5XTU1fcGFyYW0uYWNfcGFyYW1baV0uQUNJX0FJRlNOICYgMHgwZikgKiBwbWxtZWluZm8tPnNsb3RUaW1lICsgYVNpZnNUaW1lOwogCi0JCUVDV01pbiA9IChwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5DVyAmIDB4MGYpOworCQlFQ1dNaW4gPSBwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5DVyAmIDB4MGY7CiAJCUVDV01heCA9IChwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5DVyAmIDB4ZjApID4+IDQ7CiAJCVRYT1AgPSBsZTE2X3RvX2NwdShwbWxtZWluZm8tPldNTV9wYXJhbS5hY19wYXJhbVtpXS5UWE9QX2xpbWl0KTsKIApAQCAtNjU5LDggKzYzNiw2IEBACiAJCXB4bWl0cHJpdi0+d21tX3BhcmFfc2VxW2ldID0gaW54W2ldOwogCQlEQkdfODhFKCJ3bW1fcGFyYV9zZXEoJWQpOiAlZFxuIiwgaSwgcHhtaXRwcml2LT53bW1fcGFyYV9zZXFbaV0pOwogCX0KLQotCXJldHVybjsKIH0KIAogc3RhdGljIHZvaWQgYndtb2RlX3VwZGF0ZV9jaGVjayhzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBuZGlzXzgwMl8xMV92YXJfaWUgKnBJRSkKQEAgLTc2NiwxNCArNzQxLDE0IEBACiAJCX0gZWxzZSB7CiAJCQkvKiBtb2RpZnkgZnJvbSAgZncgYnkgVGhvbWFzIDIwMTAvMTEvMTcgKi8KIAkJCWlmICgocG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MykgPiAocElFLT5kYXRhW2ldICYgMHgzKSkKLQkJCQltYXhfQU1QRFVfbGVuID0gKHBJRS0+ZGF0YVtpXSAmIDB4Myk7CisJCQkJbWF4X0FNUERVX2xlbiA9IHBJRS0+ZGF0YVtpXSAmIDB4MzsKIAkJCWVsc2UKLQkJCQltYXhfQU1QRFVfbGVuID0gKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDMpOworCQkJCW1heF9BTVBEVV9sZW4gPSBwbWxtZWluZm8tPkhUX2NhcHMudS5IVF9jYXBfZWxlbWVudC5BTVBEVV9wYXJhICYgMHgzOwogCiAJCQlpZiAoKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDFjKSA+IChwSUUtPmRhdGFbaV0gJiAweDFjKSkKLQkJCQltaW5fTVBEVV9zcGFjaW5nID0gKHBtbG1laW5mby0+SFRfY2Fwcy51LkhUX2NhcF9lbGVtZW50LkFNUERVX3BhcmEgJiAweDFjKTsKKwkJCQltaW5fTVBEVV9zcGFjaW5nID0gcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSAmIDB4MWM7CiAJCQllbHNlCi0JCQkJbWluX01QRFVfc3BhY2luZyA9IChwSUUtPmRhdGFbaV0gJiAweDFjKTsKKwkJCQltaW5fTVBEVV9zcGFjaW5nID0gcElFLT5kYXRhW2ldICYgMHgxYzsKIAogCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuQU1QRFVfcGFyYSA9IG1heF9BTVBEVV9sZW4gfCBtaW5fTVBEVV9zcGFjaW5nOwogCQl9CkBAIC03ODgsNyArNzYzLDYgQEAKIAkJZWxzZQogCQkJcG1sbWVpbmZvLT5IVF9jYXBzLnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGVbaV0gJj0gTUNTX3JhdGVfMlJbaV07CiAJfQotCXJldHVybjsKIH0KIAogdm9pZCBIVF9pbmZvX2hhbmRsZXIoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyLCBzdHJ1Y3QgbmRpc184MDJfMTFfdmFyX2llICpwSUUpCkBAIC04MDksNyArNzgzLDYgQEAKIAogCXBtbG1laW5mby0+SFRfaW5mb19lbmFibGUgPSAxOwogCW1lbWNweSgmKHBtbG1laW5mby0+SFRfaW5mbyksIHBJRS0+ZGF0YSwgcElFLT5MZW5ndGgpOwotCXJldHVybjsKIH0KIAogdm9pZCBIVE9uQXNzb2NSc3Aoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQpAQCAtMTIyMSw0OCArMTE5NCwzNiBAQAogCiBzdGF0aWMgaW50IHdpZmlyYXRlMl9yYXRldGJsX2lueCh1bnNpZ25lZCBjaGFyIHJhdGUpCiB7Ci0JaW50CWlueCA9IDA7CiAJcmF0ZSA9IHJhdGUgJiAweDdmOwogCiAJc3dpdGNoIChyYXRlKSB7CiAJY2FzZSA1NCoyOgotCQlpbnggPSAxMTsKLQkJYnJlYWs7CisJCXJldHVybiAxMTsKIAljYXNlIDQ4KjI6Ci0JCWlueCA9IDEwOwotCQlicmVhazsKKwkJcmV0dXJuIDEwOwogCWNhc2UgMzYqMjoKLQkJaW54ID0gOTsKLQkJYnJlYWs7CisJCXJldHVybiA5OwogCWNhc2UgMjQqMjoKLQkJaW54ID0gODsKLQkJYnJlYWs7CisJCXJldHVybiA4OwogCWNhc2UgMTgqMjoKLQkJaW54ID0gNzsKLQkJYnJlYWs7CisJCXJldHVybiA3OwogCWNhc2UgMTIqMjoKLQkJaW54ID0gNjsKLQkJYnJlYWs7CisJCXJldHVybiA2OwogCWNhc2UgOSoyOgotCQlpbnggPSA1OwotCQlicmVhazsKKwkJcmV0dXJuIDU7CiAJY2FzZSA2KjI6Ci0JCWlueCA9IDQ7Ci0JCWJyZWFrOworCQlyZXR1cm4gNDsKIAljYXNlIDExKjI6Ci0JCWlueCA9IDM7Ci0JCWJyZWFrOworCQlyZXR1cm4gMzsKIAljYXNlIDExOgotCQlpbnggPSAyOwotCQlicmVhazsKKwkJcmV0dXJuIDI7CiAJY2FzZSAyKjI6Ci0JCWlueCA9IDE7Ci0JCWJyZWFrOworCQlyZXR1cm4gMTsKIAljYXNlIDEqMjoKLQkJaW54ID0gMDsKLQkJYnJlYWs7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAwOwogCX0KLQlyZXR1cm4gaW54OwogfQogCiB1bnNpZ25lZCBpbnQgdXBkYXRlX2Jhc2ljX3JhdGUodW5zaWduZWQgY2hhciAqcHRuLCB1bnNpZ25lZCBpbnQgcHRuX3N6KQpAQCAtMTI5NSw3ICsxMjU2LDcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKLQltYXNrID0gKChwSFRfY2Fwcy0+dS5IVF9jYXBfZWxlbWVudC5NQ1NfcmF0ZVswXSA8PCAxMikgfCAocEhUX2NhcHMtPnUuSFRfY2FwX2VsZW1lbnQuTUNTX3JhdGVbMV0gPDwgMjApKTsKKwltYXNrID0gKHBIVF9jYXBzLT51LkhUX2NhcF9lbGVtZW50Lk1DU19yYXRlWzBdIDw8IDEyKSB8IChwSFRfY2Fwcy0+dS5IVF9jYXBfZWxlbWVudC5NQ1NfcmF0ZVsxXSA8PCAyMCk7CiAKIAlyZXR1cm4gbWFzazsKIH0KQEAgLTEzMDksNyArMTI3MCw3IEBACiAJaWYgKCEocG1sbWVpbmZvLT5IVF9lbmFibGUpKQogCQlyZXR1cm4gX0ZBSUw7CiAKLQlpZiAoKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX1JBTElOSykpCisJaWYgKHBtbG1laW5mby0+YXNzb2NfQVBfdmVuZG9yID09IEhUX0lPVF9QRUVSX1JBTElOSykKIAkJcmV0dXJuIF9GQUlMOwogCiAJYml0X29mZnNldCA9IChwbWxtZWV4dC0+Y3VyX2J3bW9kZSAmIEhUX0NIQU5ORUxfV0lEVEhfNDApID8gNiA6IDU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2NvcmUvcnR3X3htaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCmluZGV4IDdhNzFkZjEuLmZkYTE2OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvY29yZS9ydHdfeG1pdC5jCkBAIC0xNjM0LDIzICsxNjM0LDE1IEBACiAKIAlweG1pdHByaXYtPmh3eG1pdF9lbnRyeSA9IEhXWE1JVF9FTlRSWTsKIAotCXB4bWl0cHJpdi0+aHd4bWl0cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBod194bWl0KSAqIHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5LCBHRlBfS0VSTkVMKTsKKwlweG1pdHByaXYtPmh3eG1pdHMgPSBrY2FsbG9jKHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5LAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBod194bWl0KSwgR0ZQX0tFUk5FTCk7CiAKIAlod3htaXRzID0gcHhtaXRwcml2LT5od3htaXRzOwogCi0JaWYgKHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5ID09IDUpIHsKLQkJaHd4bWl0c1swXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+Ym1fcGVuZGluZzsKLQkJaHd4bWl0c1sxXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dm9fcGVuZGluZzsKLQkJaHd4bWl0c1syXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dmlfcGVuZGluZzsKLQkJaHd4bWl0c1szXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmtfcGVuZGluZzsKLQkJaHd4bWl0c1s0XSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmVfcGVuZGluZzsKLQl9IGVsc2UgaWYgKHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5ID09IDQpIHsKLQkJaHd4bWl0c1swXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dm9fcGVuZGluZzsKLQkJaHd4bWl0c1sxXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+dmlfcGVuZGluZzsKLQkJaHd4bWl0c1syXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmVfcGVuZGluZzsKLQkJaHd4bWl0c1szXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmtfcGVuZGluZzsKLQl9IGVsc2UgewotCX0KKwlod3htaXRzWzBdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT52b19wZW5kaW5nOworCWh3eG1pdHNbMV0gLnN0YV9xdWV1ZSA9ICZweG1pdHByaXYtPnZpX3BlbmRpbmc7CisJaHd4bWl0c1syXSAuc3RhX3F1ZXVlID0gJnB4bWl0cHJpdi0+YmVfcGVuZGluZzsKKwlod3htaXRzWzNdIC5zdGFfcXVldWUgPSAmcHhtaXRwcml2LT5ia19wZW5kaW5nOwogfQogCiB2b2lkIHJ0d19mcmVlX2h3eG1pdHMoc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsODE4OEVSYXRlQWRhcHRpdmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL0hhbDgxODhFUmF0ZUFkYXB0aXZlLmMKaW5kZXggM2M2NTFkNS4uMDgyZjBjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvSGFsODE4OEVSYXRlQWRhcHRpdmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9IYWw4MTg4RVJhdGVBZGFwdGl2ZS5jCkBAIC0xMTUsMTcgKzExNSwyMSBAQAogCX0KIAlwUmFJbmZvLT5ScHRUaW1lID0gRHluYW1pY1R4UlBUVGltaW5nW2lkeF07CiAKLQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX0xPVUQsICgicFJhSW5mby0+UnB0VGltZSA9IDB4JXhcbiIsIHBSYUluZm8tPlJwdFRpbWUpKTsKKwlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX0xPVUQsCisJCQkoInBSYUluZm8tPlJwdFRpbWUgPSAweCV4XG4iLCBwUmFJbmZvLT5ScHRUaW1lKSk7CiB9CiAKLXN0YXRpYyBpbnQgb2RtX1JhdGVEb3duXzgxODhFKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0sIHN0cnVjdCBvZG1fcmFfaW5mbyAqcFJhSW5mbykKK3N0YXRpYyBpbnQgb2RtX1JhdGVEb3duXzgxODhFKHN0cnVjdCBvZG1fZG1fc3RydWN0ICpkbV9vZG0sCisJCQkJc3RydWN0IG9kbV9yYV9pbmZvICpwUmFJbmZvKQogewogCXU4IFJhdGVJRCwgTG93ZXN0UmF0ZSwgSGlnaGVzdFJhdGU7CiAJdTggaTsKIAotCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsICgiPT09PT0+b2RtX1JhdGVEb3duXzgxODhFKClcbiIpKTsKKwlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLAorCQkJT0RNX0RCR19UUkFDRSwgKCI9PT09PT5vZG1fUmF0ZURvd25fODE4OEUoKVxuIikpOwogCWlmIChOVUxMID09IHBSYUluZm8pIHsKLQkJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19MT1VELCAoIm9kbV9SYXRlRG93bl84MTg4RSgpOiBwUmFJbmZvIGlzIE5VTExcbiIpKTsKKwkJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19MT1VELAorCQkJCSgib2RtX1JhdGVEb3duXzgxODhFKCk6IHBSYUluZm8gaXMgTlVMTFxuIikpOwogCQlyZXR1cm4gLTE7CiAJfQogCVJhdGVJRCA9IHBSYUluZm8tPlByZVJhdGU7CkBAIC0xNjcsMTAgKzE3MSwxNSBAQAogCiAJcFJhSW5mby0+RGVjaXNpb25SYXRlID0gUmF0ZUlEOwogCW9kbV9TZXRUeFJQVFRpbWluZ184MTg4RShkbV9vZG0sIHBSYUluZm8sIDIpOwotCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfTE9VRCwgKCJSYXRlIGRvd24sIFJQVCBUaW1pbmcgZGVmYXVsdFxuIikpOwotCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsICgiUkFXYWl0aW5nQ291bnRlciAlZCwgUkFQZW5kaW5nQ291bnRlciAlZCIsIHBSYUluZm8tPlJBV2FpdGluZ0NvdW50ZXIsIHBSYUluZm8tPlJBUGVuZGluZ0NvdW50ZXIpKTsKLQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX0xPVUQsICgiUmF0ZSBkb3duIHRvIFJhdGVJRCAlZCBSYXRlU0dJICVkXG4iLCBSYXRlSUQsIHBSYUluZm8tPlJhdGVTR0kpKTsKLQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLCAoIjw9PT09PSBvZG1fUmF0ZURvd25fODE4OEUoKVxuIikpOworCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsCisJCQlPRE1fREJHX0xPVUQsICgiUmF0ZSBkb3duLCBSUFQgVGltaW5nIGRlZmF1bHRcbiIpKTsKKwlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLAorCQkJKCJSQVdhaXRpbmdDb3VudGVyICVkLCBSQVBlbmRpbmdDb3VudGVyICVkIiwKKwkJCSBwUmFJbmZvLT5SQVdhaXRpbmdDb3VudGVyLCBwUmFJbmZvLT5SQVBlbmRpbmdDb3VudGVyKSk7CisJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19MT1VELAorCQkJKCJSYXRlIGRvd24gdG8gUmF0ZUlEICVkIFJhdGVTR0kgJWRcbiIsIFJhdGVJRCwgcFJhSW5mby0+UmF0ZVNHSSkpOworCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsCisJCQkoIjw9PT09PSBvZG1fUmF0ZURvd25fODE4OEUoKVxuIikpOwogCXJldHVybiAwOwogfQogCkBAIC0xODIsOSArMTkxLDExIEBACiAJdTggUmF0ZUlELCBIaWdoZXN0UmF0ZTsKIAl1OCBpOwogCi0JT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19UUkFDRSwgKCI9PT09PT5vZG1fUmF0ZVVwXzgxODhFKClcbiIpKTsKKwlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLAorCQkJT0RNX0RCR19UUkFDRSwgKCI9PT09PT5vZG1fUmF0ZVVwXzgxODhFKClcbiIpKTsKIAlpZiAoTlVMTCA9PSBwUmFJbmZvKSB7Ci0JCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfTE9VRCwgKCJvZG1fUmF0ZVVwXzgxODhFKCk6IHBSYUluZm8gaXMgTlVMTFxuIikpOworCQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX0xPVUQsCisJCQkJKCJvZG1fUmF0ZVVwXzgxODhFKCk6IHBSYUluZm8gaXMgTlVMTFxuIikpOwogCQlyZXR1cm4gLTE7CiAJfQogCVJhdGVJRCA9IHBSYUluZm8tPlByZVJhdGU7CkBAIC0yMDAsNyArMjExLDggQEAKIAkJZ290byBSYXRlVXBmaW5pc2g7CiAJfQogCW9kbV9TZXRUeFJQVFRpbWluZ184MTg4RShkbV9vZG0sIHBSYUluZm8sIDApOwotCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfTE9VRCwgKCJvZG1fUmF0ZVVwXzgxODhFKCk6RGVjcmVhc2UgUlBUIFRpbWluZ1xuIikpOworCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfTE9VRCwKKwkJCSgib2RtX1JhdGVVcF84MTg4RSgpOkRlY3JlYXNlIFJQVCBUaW1pbmdcbiIpKTsKIAogCWlmIChSYXRlSUQgPCBIaWdoZXN0UmF0ZSkgewogCQlmb3IgKGkgPSBSYXRlSUQrMTsgaSA8PSBIaWdoZXN0UmF0ZTsgaSsrKSB7CkBAIC0yMTgsMTUgKzIzMCwyMCBAQAogCQlSYXRlSUQgPSBIaWdoZXN0UmF0ZTsKIAl9CiBSYXRlVXBmaW5pc2g6Ci0JaWYgKHBSYUluZm8tPlJBV2FpdGluZ0NvdW50ZXIgPT0gKDQrUGVuZGluZ0ZvclJhdGVVcEZhaWxbcFJhSW5mby0+UkFQZW5kaW5nQ291bnRlcl0pKQorCWlmIChwUmFJbmZvLT5SQVdhaXRpbmdDb3VudGVyID09CisJCSg0K1BlbmRpbmdGb3JSYXRlVXBGYWlsW3BSYUluZm8tPlJBUGVuZGluZ0NvdW50ZXJdKSkKIAkJcFJhSW5mby0+UkFXYWl0aW5nQ291bnRlciA9IDA7CiAJZWxzZQogCQlwUmFJbmZvLT5SQVdhaXRpbmdDb3VudGVyKys7CiAKIAlwUmFJbmZvLT5EZWNpc2lvblJhdGUgPSBSYXRlSUQ7Ci0JT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19MT1VELCAoIlJhdGUgdXAgdG8gUmF0ZUlEICVkXG4iLCBSYXRlSUQpKTsKLQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLCAoIlJBV2FpdGluZ0NvdW50ZXIgJWQsIFJBUGVuZGluZ0NvdW50ZXIgJWQiLCBwUmFJbmZvLT5SQVdhaXRpbmdDb3VudGVyLCBwUmFJbmZvLT5SQVBlbmRpbmdDb3VudGVyKSk7Ci0JT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19UUkFDRSwgKCI8PT09PT0gb2RtX1JhdGVVcF84MTg4RSgpXG4iKSk7CisJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19MT1VELAorCQkJKCJSYXRlIHVwIHRvIFJhdGVJRCAlZFxuIiwgUmF0ZUlEKSk7CisJT0RNX1JUX1RSQUNFKGRtX29kbSwgT0RNX0NPTVBfUkFURV9BREFQVElWRSwgT0RNX0RCR19UUkFDRSwKKwkJCSgiUkFXYWl0aW5nQ291bnRlciAlZCwgUkFQZW5kaW5nQ291bnRlciAlZCIsCisJCQkgcFJhSW5mby0+UkFXYWl0aW5nQ291bnRlciwgcFJhSW5mby0+UkFQZW5kaW5nQ291bnRlcikpOworCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsCisJCQlPRE1fREJHX1RSQUNFLCAoIjw9PT09PSBvZG1fUmF0ZVVwXzgxODhFKClcbiIpKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjQzLDExICsyNjAsMTIgQEAKIAkJc3RydWN0IG9kbV9yYV9pbmZvICpwUmFJbmZvCiAJKQogewotCXU4IFJhdGVJRCA9IDAsIFJ0eVB0SUQgPSAwLCBQZW5hbHR5SUQxID0gMCwgUGVuYWx0eUlEMiA9IDA7CisJdTggUmF0ZUlEID0gMCwgUnR5UHRJRCA9IDAsIFBlbmFsdHlJRDEgPSAwLCBQZW5hbHR5SUQyID0gMCwgaSA9IDA7CiAJLyogdTMyIHBvb2xfcmV0cnk7ICovCiAJc3RhdGljIHU4IER5bmFtaWNUeFJQVFRpbWluZ0NvdW50ZXI7CiAKLQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLCAoIj09PT09Pm9kbV9SYXRlRGVjaXNpb25fODE4OEUoKVxuIikpOworCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsCisJCQkoIj09PT09Pm9kbV9SYXRlRGVjaXNpb25fODE4OEUoKVxuIikpOwogCiAJaWYgKHBSYUluZm8tPkFjdGl2ZSAmJiAocFJhSW5mby0+VE9UQUwgPiAwKSkgeyAvKiAgU1RBIHVzZWQgYW5kIGRhdGEgcGFja2V0IGV4aXRzICovCiAJCWlmICgocFJhSW5mby0+UnNzaVN0YVJBIDwgKHBSYUluZm8tPlByZVJzc2lTdGFSQSAtIDMpKSB8fApAQCAtMjY4LDE0ICsyODYsMTQgQEAKIAogCQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLAogCQkJICAgICAoIiBOc2NEb3duIGluaXQgaXMgJWRcbiIsIHBSYUluZm8tPk5zY0Rvd24pKTsKLQkJcFJhSW5mby0+TnNjRG93biArPSBwUmFJbmZvLT5SVFlbMF0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDFdWzBdOwotCQlwUmFJbmZvLT5Oc2NEb3duICs9IHBSYUluZm8tPlJUWVsxXSAqIFJFVFJZX1BFTkFMVFlbUGVuYWx0eUlEMV1bMV07Ci0JCXBSYUluZm8tPk5zY0Rvd24gKz0gcFJhSW5mby0+UlRZWzJdICogUkVUUllfUEVOQUxUWVtQZW5hbHR5SUQxXVsyXTsKLQkJcFJhSW5mby0+TnNjRG93biArPSBwUmFJbmZvLT5SVFlbM10gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDFdWzNdOwotCQlwUmFJbmZvLT5Oc2NEb3duICs9IHBSYUluZm8tPlJUWVs0XSAqIFJFVFJZX1BFTkFMVFlbUGVuYWx0eUlEMV1bNF07CisKKwkJZm9yIChpID0gMCA7IGkgPD0gNCA7IGkrKykKKwkJCXBSYUluZm8tPk5zY0Rvd24gKz0gcFJhSW5mby0+UlRZW2ldICogUkVUUllfUEVOQUxUWVtQZW5hbHR5SUQxXVtpXTsKKwogCQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLAotCQkJICAgICAoIiBOc2NEb3duIGlzICVkLCB0b3RhbCpwZW5hbHR5WzVdIGlzICVkXG4iLAotCQkJICAgICBwUmFJbmZvLT5Oc2NEb3duLCAocFJhSW5mby0+VE9UQUwgKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDFdWzVdKSkpOworCQkJICAgICAoIiBOc2NEb3duIGlzICVkLCB0b3RhbCpwZW5hbHR5WzVdIGlzICVkXG4iLCBwUmFJbmZvLT5Oc2NEb3duLAorCQkJICAgICAgKHBSYUluZm8tPlRPVEFMICogUkVUUllfUEVOQUxUWVtQZW5hbHR5SUQxXVs1XSkpKTsKKwogCQlpZiAocFJhSW5mby0+TnNjRG93biA+IChwUmFJbmZvLT5UT1RBTCAqIFJFVFJZX1BFTkFMVFlbUGVuYWx0eUlEMV1bNV0pKQogCQkJcFJhSW5mby0+TnNjRG93biAtPSBwUmFJbmZvLT5UT1RBTCAqIFJFVFJZX1BFTkFMVFlbUGVuYWx0eUlEMV1bNV07CiAJCWVsc2UKQEAgLTI4NSwxNCArMzAzLDE0IEBACiAJCVBlbmFsdHlJRDIgPSBSRVRSWV9QRU5BTFRZX1VQX0lEWFtSYXRlSURdOwogCQlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLAogCQkJICAgICAoIiBOc2NVcCBpbml0IGlzICVkXG4iLCBwUmFJbmZvLT5Oc2NVcCkpOwotCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbMF0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzBdOwotCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbMV0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzFdOwotCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbMl0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzJdOwotCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbM10gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzNdOwotCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbNF0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzRdOworCisJCWZvciAoaSA9IDAgOyBpIDw9IDQgOyBpKyspCisJCQlwUmFJbmZvLT5Oc2NVcCArPSBwUmFJbmZvLT5SVFlbaV0gKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdW2ldOworCiAJCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsCiAJCQkgICAgICgiTnNjVXAgaXMgJWQsIHRvdGFsKnVwWzVdIGlzICVkXG4iLAogCQkJICAgICBwUmFJbmZvLT5Oc2NVcCwgKHBSYUluZm8tPlRPVEFMICogUkVUUllfUEVOQUxUWVtQZW5hbHR5SUQyXVs1XSkpKTsKKwogCQlpZiAocFJhSW5mby0+TnNjVXAgPiAocFJhSW5mby0+VE9UQUwgKiBSRVRSWV9QRU5BTFRZW1BlbmFsdHlJRDJdWzVdKSkKIAkJCXBSYUluZm8tPk5zY1VwIC09IHBSYUluZm8tPlRPVEFMICogUkVUUllfUEVOQUxUWVtQZW5hbHR5SUQyXVs1XTsKIAkJZWxzZQpAQCAtNDg3LDcgKzUwNSw3IEBACiAJCQlicmVhazsKIAl9CiAKLQlqID0gaiA+PiAxOworCWogPj49IDE7CiAJdGVtcF9zdGFnZSA9IChwUmFJbmZvLT5QVFN0YWdlICsgMSkgPj4gMTsKIAlpZiAodGVtcF9zdGFnZSA+IGopCiAJCXN0YWdlX2lkID0gdGVtcF9zdGFnZS1qOwpAQCAtNTM4LDYgKzU1Niw3IEBACiAJc3RydWN0IG9kbV9yYV9pbmZvICpwUmFJbmZvID0gJmRtX29kbS0+UkFJbmZvW21hY2lkXTsKIAl1OCBXaXJlbGVzc01vZGUgPSAweEZGOyAvKiBpbnZhbGlkIHZhbHVlICovCiAJdTggbWF4X3JhdGVfaWR4ID0gMHgxMzsgLyogTUNTNyAqLworCiAJaWYgKGRtX29kbS0+cFdpcmVsZXNzTW9kZSAhPSBOVUxMKQogCQlXaXJlbGVzc01vZGUgPSAqKGRtX29kbS0+cFdpcmVsZXNzTW9kZSk7CiAKQEAgLTYxOCw3ICs2MzcsNyBAQAogCiAJaWYgKChOVUxMID09IGRtX29kbSkgfHwgKG1hY2lkID49IEFTU09DSUFURV9FTlRSWV9OVU0pKQogCQlyZXR1cm4gMDsKLQlEZWNpc2lvblJhdGUgPSAoZG1fb2RtLT5SQUluZm9bbWFjaWRdLkRlY2lzaW9uUmF0ZSk7CisJRGVjaXNpb25SYXRlID0gZG1fb2RtLT5SQUluZm9bbWFjaWRdLkRlY2lzaW9uUmF0ZTsKIAlPRE1fUlRfVFJBQ0UoZG1fb2RtLCBPRE1fQ09NUF9SQVRFX0FEQVBUSVZFLCBPRE1fREJHX1RSQUNFLAogCQkoIiBtYWNpZCA9JWQgRGVjaXNpb25SYXRlID0gMHgleFxuIiwgbWFjaWQsIERlY2lzaW9uUmF0ZSkpOwogCXJldHVybiBEZWNpc2lvblJhdGU7CkBAIC02MzAsNyArNjQ5LDcgQEAKIAogCWlmICgoTlVMTCA9PSBkbV9vZG0pIHx8IChtYWNpZCA+PSBBU1NPQ0lBVEVfRU5UUllfTlVNKSkKIAkJcmV0dXJuIDA7Ci0JUFRTdGFnZSA9IChkbV9vZG0tPlJBSW5mb1ttYWNpZF0uUFRTdGFnZSk7CisJUFRTdGFnZSA9IGRtX29kbS0+UkFJbmZvW21hY2lkXS5QVFN0YWdlOwogCU9ETV9SVF9UUkFDRShkbV9vZG0sIE9ETV9DT01QX1JBVEVfQURBUFRJVkUsIE9ETV9EQkdfVFJBQ0UsCiAJCSAgICAgKCJtYWNpZCA9JWQgUFRTdGFnZSA9IDB4JXhcbiIsIG1hY2lkLCBQVFN0YWdlKSk7CiAJcmV0dXJuIFBUU3RhZ2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9iYl9jZmcuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2JiX2NmZy5jCmluZGV4IDFlOTYzYmYuLjhlYjJiMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2JiX2NmZy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2JiX2NmZy5jCkBAIC01MTEsNjIgKzUxMSw3MSBAQAogc3RhdGljIHZvaWQgc3RvcmVfcHdyaW5kZXhfb2Zmc2V0KHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyLCB1MzIgcmVnYWRkciwgdTMyIGJpdG1hc2ssIHUzMiBkYXRhKQogewogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CisJIHU4IHB3ckdycENudCA9IGhhbF9kYXRhLT5wd3JHcm91cENudDsKIAogCWlmIChyZWdhZGRyID09IHJUeEFHQ19BX1JhdGUxOF8wNikKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMF0gPSBkYXRhOworCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcHdyR3JwQ250XVswXSA9IGRhdGE7CiAJaWYgKHJlZ2FkZHIgPT0gclR4QUdDX0FfUmF0ZTU0XzI0KQotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVsxXSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzFdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQV9DQ0sxX01jczMyKQotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVs2XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzZdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9DQ0sxMV9BX0NDSzJfMTEgJiYgYml0bWFzayA9PSAweGZmZmZmZjAwKQotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVs3XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzddID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQV9NY3MwM19NY3MwMCkKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMl0gPSBkYXRhOworCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcHdyR3JwQ250XVsyXSA9IGRhdGE7CiAJaWYgKHJlZ2FkZHIgPT0gclR4QUdDX0FfTWNzMDdfTWNzMDQpCi0JCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtoYWxfZGF0YS0+cHdyR3JvdXBDbnRdWzNdID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bM10gPSBkYXRhOwogCWlmIChyZWdhZGRyID09IHJUeEFHQ19BX01jczExX01jczA4KQotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVs0XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzRdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQV9NY3MxNV9NY3MxMikgewotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVs1XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzVdID0gZGF0YTsKIAkJaWYgKGhhbF9kYXRhLT5yZl90eXBlID09IFJGXzFUMVIpCiAJCQloYWxfZGF0YS0+cHdyR3JvdXBDbnQrKzsKIAl9CiAJaWYgKHJlZ2FkZHIgPT0gclR4QUdDX0JfUmF0ZTE4XzA2KQotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVs4XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzhdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9SYXRlNTRfMjQpCi0JCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtoYWxfZGF0YS0+cHdyR3JvdXBDbnRdWzldID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bOV0gPSBkYXRhOwogCWlmIChyZWdhZGRyID09IHJUeEFHQ19CX0NDSzFfNTVfTWNzMzIpCi0JCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtoYWxfZGF0YS0+cHdyR3JvdXBDbnRdWzE0XSA9IGRhdGE7CisJCWhhbF9kYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwd3JHcnBDbnRdWzE0XSA9IGRhdGE7CiAJaWYgKHJlZ2FkZHIgPT0gclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExICYmIGJpdG1hc2sgPT0gMHgwMDAwMDBmZikKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMTVdID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bMTVdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9NY3MwM19NY3MwMCkKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMTBdID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bMTBdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9NY3MwN19NY3MwNCkKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMTFdID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bMTFdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9NY3MxMV9NY3MwOCkKLQkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W2hhbF9kYXRhLT5wd3JHcm91cENudF1bMTJdID0gZGF0YTsKKwkJaGFsX2RhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3B3ckdycENudF1bMTJdID0gZGF0YTsKIAlpZiAocmVnYWRkciA9PSByVHhBR0NfQl9NY3MxNV9NY3MxMikgewotCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbaGFsX2RhdGEtPnB3ckdyb3VwQ250XVsxM10gPSBkYXRhOworCQloYWxfZGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcHdyR3JwQ250XVsxM10gPSBkYXRhOwogCQlpZiAoaGFsX2RhdGEtPnJmX3R5cGUgIT0gUkZfMVQxUikKIAkJCWhhbF9kYXRhLT5wd3JHcm91cENudCsrOwogCX0KIH0KIAotc3RhdGljIHZvaWQgcnRsX2FkZHJfZGVsYXkoc3RydWN0IGFkYXB0ZXIgKmFkYXB0LCB1MzIgYWRkciwgdTMyIGJpdF9tYXNrLCB1MzIgZGF0YSkKK3N0YXRpYyB2b2lkIHJ0bF9hZGRyX2RlbGF5KHN0cnVjdCBhZGFwdGVyICphZGFwdCwKKwkJCXUzMiBhZGRyLCB1MzIgYml0X21hc2ssIHUzMiBkYXRhKQogewotCWlmIChhZGRyID09IDB4ZmUpIHsKKwlzd2l0Y2ggKGFkZHIpIHsKKwljYXNlIDB4ZmU6CiAJCW1zbGVlcCg1MCk7Ci0JfSBlbHNlIGlmIChhZGRyID09IDB4ZmQpIHsKKwkJYnJlYWs7CisJY2FzZSAweGZkOgogCQltZGVsYXkoNSk7Ci0JfSBlbHNlIGlmIChhZGRyID09IDB4ZmMpIHsKKwkJYnJlYWs7CisJY2FzZSAweGZjOgogCQltZGVsYXkoMSk7Ci0JfSBlbHNlIGlmIChhZGRyID09IDB4ZmIpIHsKKwkJYnJlYWs7CisJY2FzZSAweGZiOgogCQl1ZGVsYXkoNTApOwotCX0gZWxzZSBpZiAoYWRkciA9PSAweGZhKSB7CisJCWJyZWFrOworCWNhc2UgMHhmYToKIAkJdWRlbGF5KDUpOwotCX0gZWxzZSBpZiAoYWRkciA9PSAweGY5KSB7CisJCWJyZWFrOworCWNhc2UgMHhmOToKIAkJdWRlbGF5KDEpOwotCX0gZWxzZXsKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJc3RvcmVfcHdyaW5kZXhfb2Zmc2V0KGFkYXB0LCBhZGRyLCBiaXRfbWFzaywgZGF0YSk7CiAJfQogfQpAQCAtNTkxLDg0ICs2MDAsOTAgQEAKIHN0YXRpYyB2b2lkIHJ0bDg4ZV9waHlfaW5pdF9iYl9yZl9yZWdpc3Rlcl9kZWZpbml0aW9uKHN0cnVjdCBhZGFwdGVyICpBZGFwdGVyKQogewogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZQkJKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOworCXN0cnVjdCBiYl9yZWdfZGVmICAgICAgICAgICAgICAgKnJlZ1s0XTsKIAotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZmludGZzID0gckZQR0EwX1hBQl9SRkludGVyZmFjZVNXOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9DXS5yZmludGZzID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVNXOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9EXS5yZmludGZzID0gckZQR0EwX1hDRF9SRkludGVyZmFjZVNXOworCXJlZ1tSRl9QQVRIX0FdID0gJihoYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0pOworCXJlZ1tSRl9QQVRIX0JdID0gJihoYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0pOworCXJlZ1tSRl9QQVRIX0NdID0gJihoYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQ10pOworCXJlZ1tSRl9QQVRIX0RdID0gJihoYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfRF0pOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0NdLnJmaW50ZmkgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkI7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmaW50ZmkgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkI7CisJcmVnW1JGX1BBVEhfQV0tPnJmaW50ZnMgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1c7CisJcmVnW1JGX1BBVEhfQl0tPnJmaW50ZnMgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1c7CisJcmVnW1JGX1BBVEhfQ10tPnJmaW50ZnMgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1c7CisJcmVnW1JGX1BBVEhfRF0tPnJmaW50ZnMgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1c7CiAKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZpbnRmbyA9IHJGUEdBMF9YQV9SRkludGVyZmFjZU9FOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZmludGZvID0gckZQR0EwX1hCX1JGSW50ZXJmYWNlT0U7CisJcmVnW1JGX1BBVEhfQV0tPnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7CisJcmVnW1JGX1BBVEhfQl0tPnJmaW50ZmkgPSByRlBHQTBfWEFCX1JGSW50ZXJmYWNlUkI7CisJcmVnW1JGX1BBVEhfQ10tPnJmaW50ZmkgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkI7CisJcmVnW1JGX1BBVEhfRF0tPnJmaW50ZmkgPSByRlBHQTBfWENEX1JGSW50ZXJmYWNlUkI7CiAKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZpbnRmZSA9IHJGUEdBMF9YQV9SRkludGVyZmFjZU9FOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZmludGZlID0gckZQR0EwX1hCX1JGSW50ZXJmYWNlT0U7CisJcmVnW1JGX1BBVEhfQV0tPnJmaW50Zm8gPSByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRTsKKwlyZWdbUkZfUEFUSF9CXS0+cmZpbnRmbyA9IHJGUEdBMF9YQl9SRkludGVyZmFjZU9FOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmM3dpcmVPZmZzZXQgPSByRlBHQTBfWEFfTFNTSVBhcmFtZXRlcjsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQl9MU1NJUGFyYW1ldGVyOworCXJlZ1tSRl9QQVRIX0FdLT5yZmludGZlID0gckZQR0EwX1hBX1JGSW50ZXJmYWNlT0U7CisJcmVnW1JGX1BBVEhfQl0tPnJmaW50ZmUgPSByRlBHQTBfWEJfUkZJbnRlcmZhY2VPRTsKIAotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hBQl9SRlBhcmFtZXRlcjsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXI7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0NdLnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWENEX1JGUGFyYW1ldGVyOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9EXS5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hDRF9SRlBhcmFtZXRlcjsKKwlyZWdbUkZfUEFUSF9BXS0+cmYzd2lyZU9mZnNldCA9IHJGUEdBMF9YQV9MU1NJUGFyYW1ldGVyOworCXJlZ1tSRl9QQVRIX0JdLT5yZjN3aXJlT2Zmc2V0ID0gckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXI7CiAKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQ10ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfRF0ucmZUeEdhaW5TdGFnZSA9IHJGUEdBMF9UeEdhaW5TdGFnZTsKKwlyZWdbUkZfUEFUSF9BXS0+cmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXI7CisJcmVnW1JGX1BBVEhfQl0tPnJmTFNTSV9TZWxlY3QgPSByRlBHQTBfWEFCX1JGUGFyYW1ldGVyOworCXJlZ1tSRl9QQVRIX0NdLT5yZkxTU0lfU2VsZWN0ID0gckZQR0EwX1hDRF9SRlBhcmFtZXRlcjsKKwlyZWdbUkZfUEFUSF9EXS0+cmZMU1NJX1NlbGVjdCA9IHJGUEdBMF9YQ0RfUkZQYXJhbWV0ZXI7CiAKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZIU1NJUGFyYTEgPSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjE7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmSFNTSVBhcmExID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIxOworCXJlZ1tSRl9QQVRIX0FdLT5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOworCXJlZ1tSRl9QQVRIX0JdLT5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOworCXJlZ1tSRl9QQVRIX0NdLT5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOworCXJlZ1tSRl9QQVRIX0RdLT5yZlR4R2FpblN0YWdlID0gckZQR0EwX1R4R2FpblN0YWdlOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmSFNTSVBhcmEyID0gckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9CXS5yZkhTU0lQYXJhMiA9IHJGUEdBMF9YQl9IU1NJUGFyYW1ldGVyMjsKKwlyZWdbUkZfUEFUSF9BXS0+cmZIU1NJUGFyYTEgPSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjE7CisJcmVnW1JGX1BBVEhfQl0tPnJmSFNTSVBhcmExID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIxOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQUJfU3dpdGNoQ29udHJvbDsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZTd2l0Y2hDb250cm9sID0gckZQR0EwX1hBQl9Td2l0Y2hDb250cm9sOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9DXS5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWENEX1N3aXRjaENvbnRyb2w7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbDsKKwlyZWdbUkZfUEFUSF9BXS0+cmZIU1NJUGFyYTIgPSByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjI7CisJcmVnW1JGX1BBVEhfQl0tPnJmSFNTSVBhcmEyID0gckZQR0EwX1hCX0hTU0lQYXJhbWV0ZXIyOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWEFBR0NDb3JlMTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZBR0NDb250cm9sMSA9IHJPRkRNMF9YQkFHQ0NvcmUxOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9DXS5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hDQUdDQ29yZTE7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWERBR0NDb3JlMTsKKwlyZWdbUkZfUEFUSF9BXS0+cmZTd2l0Y2hDb250cm9sID0gckZQR0EwX1hBQl9Td2l0Y2hDb250cm9sOworCXJlZ1tSRl9QQVRIX0JdLT5yZlN3aXRjaENvbnRyb2wgPSByRlBHQTBfWEFCX1N3aXRjaENvbnRyb2w7CisJcmVnW1JGX1BBVEhfQ10tPnJmU3dpdGNoQ29udHJvbCA9IHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbDsKKwlyZWdbUkZfUEFUSF9EXS0+cmZTd2l0Y2hDb250cm9sID0gckZQR0EwX1hDRF9Td2l0Y2hDb250cm9sOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWEFBR0NDb3JlMjsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZBR0NDb250cm9sMiA9IHJPRkRNMF9YQkFHQ0NvcmUyOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9DXS5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hDQUdDQ29yZTI7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWERBR0NDb3JlMjsKKwlyZWdbUkZfUEFUSF9BXS0+cmZBR0NDb250cm9sMSA9IHJPRkRNMF9YQUFHQ0NvcmUxOworCXJlZ1tSRl9QQVRIX0JdLT5yZkFHQ0NvbnRyb2wxID0gck9GRE0wX1hCQUdDQ29yZTE7CisJcmVnW1JGX1BBVEhfQ10tPnJmQUdDQ29udHJvbDEgPSByT0ZETTBfWENBR0NDb3JlMTsKKwlyZWdbUkZfUEFUSF9EXS0+cmZBR0NDb250cm9sMSA9IHJPRkRNMF9YREFHQ0NvcmUxOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQVJ4SVFJbWJhbGFuY2U7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQlJ4SVFJbWJhbGFuY2U7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0NdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQ1J4SVFJbWJhbGFuY2U7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YRFJ4SVFJbWJhbGFuY2U7CisJcmVnW1JGX1BBVEhfQV0tPnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWEFBR0NDb3JlMjsKKwlyZWdbUkZfUEFUSF9CXS0+cmZBR0NDb250cm9sMiA9IHJPRkRNMF9YQkFHQ0NvcmUyOworCXJlZ1tSRl9QQVRIX0NdLT5yZkFHQ0NvbnRyb2wyID0gck9GRE0wX1hDQUdDQ29yZTI7CisJcmVnW1JGX1BBVEhfRF0tPnJmQUdDQ29udHJvbDIgPSByT0ZETTBfWERBR0NDb3JlMjsKIAotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZlJ4QUZFID0gck9GRE0wX1hBUnhBRkU7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmUnhBRkUgPSByT0ZETTBfWEJSeEFGRTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQ10ucmZSeEFGRSA9IHJPRkRNMF9YQ1J4QUZFOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9EXS5yZlJ4QUZFID0gck9GRE0wX1hEUnhBRkU7CisJcmVnW1JGX1BBVEhfQV0tPnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQVJ4SVFJbWJhbGFuY2U7CisJcmVnW1JGX1BBVEhfQl0tPnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQlJ4SVFJbWJhbGFuY2U7CisJcmVnW1JGX1BBVEhfQ10tPnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YQ1J4SVFJbWJhbGFuY2U7CisJcmVnW1JGX1BBVEhfRF0tPnJmUnhJUUltYmFsYW5jZSA9IHJPRkRNMF9YRFJ4SVFJbWJhbGFuY2U7CiAKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQV0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hBVHhJUUltYmFsYW5jZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hCVHhJUUltYmFsYW5jZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQ10ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hDVHhJUUltYmFsYW5jZTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfRF0ucmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hEVHhJUUltYmFsYW5jZTsKKwlyZWdbUkZfUEFUSF9BXS0+cmZSeEFGRSA9IHJPRkRNMF9YQVJ4QUZFOworCXJlZ1tSRl9QQVRIX0JdLT5yZlJ4QUZFID0gck9GRE0wX1hCUnhBRkU7CisJcmVnW1JGX1BBVEhfQ10tPnJmUnhBRkUgPSByT0ZETTBfWENSeEFGRTsKKwlyZWdbUkZfUEFUSF9EXS0+cmZSeEFGRSA9IHJPRkRNMF9YRFJ4QUZFOwogCi0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0FdLnJmVHhBRkUgPSByT0ZETTBfWEFUeEFGRTsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQl0ucmZUeEFGRSA9IHJPRkRNMF9YQlR4QUZFOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9DXS5yZlR4QUZFID0gck9GRE0wX1hDVHhBRkU7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0RdLnJmVHhBRkUgPSByT0ZETTBfWERUeEFGRTsKKwlyZWdbUkZfUEFUSF9BXS0+cmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hBVHhJUUltYmFsYW5jZTsKKwlyZWdbUkZfUEFUSF9CXS0+cmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hCVHhJUUltYmFsYW5jZTsKKwlyZWdbUkZfUEFUSF9DXS0+cmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hDVHhJUUltYmFsYW5jZTsKKwlyZWdbUkZfUEFUSF9EXS0+cmZUeElRSW1iYWxhbmNlID0gck9GRE0wX1hEVHhJUUltYmFsYW5jZTsKIAotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQV9MU1NJUmVhZEJhY2s7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmTFNTSVJlYWRCYWNrID0gckZQR0EwX1hCX0xTU0lSZWFkQmFjazsKLQloYWxfZGF0YS0+UEhZUmVnRGVmW1JGX1BBVEhfQ10ucmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWENfTFNTSVJlYWRCYWNrOwotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9EXS5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YRF9MU1NJUmVhZEJhY2s7CisJcmVnW1JGX1BBVEhfQV0tPnJmVHhBRkUgPSByT0ZETTBfWEFUeEFGRTsKKwlyZWdbUkZfUEFUSF9CXS0+cmZUeEFGRSA9IHJPRkRNMF9YQlR4QUZFOworCXJlZ1tSRl9QQVRIX0NdLT5yZlR4QUZFID0gck9GRE0wX1hDVHhBRkU7CisJcmVnW1JGX1BBVEhfRF0tPnJmVHhBRkUgPSByT0ZETTBfWERUeEFGRTsKIAotCWhhbF9kYXRhLT5QSFlSZWdEZWZbUkZfUEFUSF9BXS5yZkxTU0lSZWFkQmFja1BpID0gVHJhbnNjZWl2ZXJBX0hTUElfUmVhZGJhY2s7Ci0JaGFsX2RhdGEtPlBIWVJlZ0RlZltSRl9QQVRIX0JdLnJmTFNTSVJlYWRCYWNrUGkgPSBUcmFuc2NlaXZlckJfSFNQSV9SZWFkYmFjazsKKwlyZWdbUkZfUEFUSF9BXS0+cmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWEFfTFNTSVJlYWRCYWNrOworCXJlZ1tSRl9QQVRIX0JdLT5yZkxTU0lSZWFkQmFjayA9IHJGUEdBMF9YQl9MU1NJUmVhZEJhY2s7CisJcmVnW1JGX1BBVEhfQ10tPnJmTFNTSVJlYWRCYWNrID0gckZQR0EwX1hDX0xTU0lSZWFkQmFjazsKKwlyZWdbUkZfUEFUSF9EXS0+cmZMU1NJUmVhZEJhY2sgPSByRlBHQTBfWERfTFNTSVJlYWRCYWNrOworCisJcmVnW1JGX1BBVEhfQV0tPnJmTFNTSVJlYWRCYWNrUGkgPSBUcmFuc2NlaXZlckFfSFNQSV9SZWFkYmFjazsKKwlyZWdbUkZfUEFUSF9CXS0+cmZMU1NJUmVhZEJhY2tQaSA9IFRyYW5zY2VpdmVyQl9IU1BJX1JlYWRiYWNrOwogfQogCiBzdGF0aWMgYm9vbCBjb25maWdfcGFyYWZpbGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvZncuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL2Z3LmMKaW5kZXggM2IyODc1NC4uYTcxYzU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvZncuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9mdy5jCkBAIC0xNTQsOSArMTU0LDggQEAKIAkJCWJyZWFrOwogCX0gd2hpbGUgKGNvdW50ZXIrKyA8IFBPTExJTkdfUkVBRFlfVElNRU9VVF9DT1VOVCk7CiAKLQlpZiAoY291bnRlciA+PSBQT0xMSU5HX1JFQURZX1RJTUVPVVRfQ09VTlQpIHsKKwlpZiAoY291bnRlciA+PSBQT0xMSU5HX1JFQURZX1RJTUVPVVRfQ09VTlQpCiAJCWdvdG8gZXhpdDsKLQl9CiAKIAl2YWx1ZTMyID0gdXNiX3JlYWQzMihhZGFwdCwgUkVHX01DVUZXREwpOwogCXZhbHVlMzIgfD0gTUNVRldETF9SRFk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbS5jCmluZGV4IDA2NDc3ZTguLjI4YjVlN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL29kbS5jCkBAIC03NDEsMTMgKzc0MSwxMyBAQAogCiAJcmV0X3ZhbHVlID0gcGh5X3F1ZXJ5X2JiX3JlZyhhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfVFlQRTFfMTFOLCBiTWFza0RXb3JkKTsKIAlGYWxzZUFsbUNudC0+Q250X0Zhc3RfRnN5bmMgPSAocmV0X3ZhbHVlJjB4ZmZmZik7Ci0JRmFsc2VBbG1DbnQtPkNudF9TQl9TZWFyY2hfZmFpbCA9ICgocmV0X3ZhbHVlJjB4ZmZmZjAwMDApPj4xNik7CisJRmFsc2VBbG1DbnQtPkNudF9TQl9TZWFyY2hfZmFpbCA9IChyZXRfdmFsdWUgJiAweGZmZmYwMDAwKT4+MTY7CiAJcmV0X3ZhbHVlID0gcGh5X3F1ZXJ5X2JiX3JlZyhhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfVFlQRTJfMTFOLCBiTWFza0RXb3JkKTsKIAlGYWxzZUFsbUNudC0+Q250X09GRE1fQ0NBID0gKHJldF92YWx1ZSYweGZmZmYpOwotCUZhbHNlQWxtQ250LT5DbnRfUGFyaXR5X0ZhaWwgPSAoKHJldF92YWx1ZSYweGZmZmYwMDAwKT4+MTYpOworCUZhbHNlQWxtQ250LT5DbnRfUGFyaXR5X0ZhaWwgPSAocmV0X3ZhbHVlICYgMHhmZmZmMDAwMCk+PjE2OwogCXJldF92YWx1ZSA9IHBoeV9xdWVyeV9iYl9yZWcoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1RZUEUzXzExTiwgYk1hc2tEV29yZCk7CiAJRmFsc2VBbG1DbnQtPkNudF9SYXRlX0lsbGVnYWwgPSAocmV0X3ZhbHVlJjB4ZmZmZik7Ci0JRmFsc2VBbG1DbnQtPkNudF9DcmM4X2ZhaWwgPSAoKHJldF92YWx1ZSYweGZmZmYwMDAwKT4+MTYpOworCUZhbHNlQWxtQ250LT5DbnRfQ3JjOF9mYWlsID0gKHJldF92YWx1ZSAmIDB4ZmZmZjAwMDApPj4xNjsKIAlyZXRfdmFsdWUgPSBwaHlfcXVlcnlfYmJfcmVnKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9UWVBFNF8xMU4sIGJNYXNrRFdvcmQpOwogCUZhbHNlQWxtQ250LT5DbnRfTWNzX2ZhaWwgPSAocmV0X3ZhbHVlJjB4ZmZmZik7CiAKQEAgLTc1Nyw3ICs3NTcsNyBAQAogCiAJcmV0X3ZhbHVlID0gcGh5X3F1ZXJ5X2JiX3JlZyhhZGFwdGVyLCBPRE1fUkVHX1NDX0NOVF8xMU4sIGJNYXNrRFdvcmQpOwogCUZhbHNlQWxtQ250LT5DbnRfQldfTFNDID0gKHJldF92YWx1ZSYweGZmZmYpOwotCUZhbHNlQWxtQ250LT5DbnRfQldfVVNDID0gKChyZXRfdmFsdWUmMHhmZmZmMDAwMCk+PjE2KTsKKwlGYWxzZUFsbUNudC0+Q250X0JXX1VTQyA9IChyZXRfdmFsdWUgJiAweGZmZmYwMDAwKT4+MTY7CiAKIAkvKiBob2xkIGNjayBjb3VudGVyICovCiAJcGh5X3NldF9iYl9yZWcoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTiwgQklUMTIsIDEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvb2RtX0hXQ29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1fSFdDb25maWcuYwppbmRleCAyOWY4N2RmLi4zNmFmZTQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1fSFdDb25maWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9vZG1fSFdDb25maWcuYwpAQCAtMTIzLDggKzEyMyw4IEBACiAJCS8qIDIwMTEuMTEuMjggTHVrZUxlZTogODhFIHVzZSBkaWZmZXJlbnQgTE5BICYgVkdBIGdhaW4gdGFibGUgKi8KIAkJLyogVGhlIFJTU0kgZm9ybXVsYSBzaG91bGQgYmUgbW9kaWZpZWQgYWNjb3JkaW5nIHRvIHRoZSBnYWluIHRhYmxlICovCiAJCS8qIEluIDg4RSwgY2NrX2hpZ2hwd3IgaXMgYWx3YXlzIHNldCB0byAxICovCi0JCUxOQV9pZHggPSAoKGNja19hZ2NfcnB0ICYgMHhFMCkgPj4gNSk7Ci0JCVZHQV9pZHggPSAoY2NrX2FnY19ycHQgJiAweDFGKTsKKwkJTE5BX2lkeCA9IChjY2tfYWdjX3JwdCAmIDB4RTApID4+IDU7CisJCVZHQV9pZHggPSBjY2tfYWdjX3JwdCAmIDB4MUY7CiAJCXN3aXRjaCAoTE5BX2lkeCkgewogCQljYXNlIDc6CiAJCQlpZiAoVkdBX2lkeCA8PSAyNykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3BoeS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcGh5LmMKaW5kZXggM2Y2NjNmZS4uNmU0YzNlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcGh5LmMKQEAgLTYwLDcgKzYwLDcgQEAKIAlpZiAoYml0bWFzayAhPSBiTWFza0RXb3JkKSB7IC8qIGlmIG5vdCAiZG91YmxlIHdvcmQiIHdyaXRlICovCiAJCW9yaWdpbmFsX3ZhbHVlID0gdXNiX3JlYWQzMihhZGFwdCwgcmVnYWRkcik7CiAJCWJpdF9zaGlmdCA9IGNhbF9iaXRfc2hpZnQoYml0bWFzayk7Ci0JCWRhdGEgPSAoKG9yaWdpbmFsX3ZhbHVlICYgKH5iaXRtYXNrKSkgfCAoZGF0YSA8PCBiaXRfc2hpZnQpKTsKKwkJZGF0YSA9IChvcmlnaW5hbF92YWx1ZSAmICh+Yml0bWFzaykpIHwgKGRhdGEgPDwgYml0X3NoaWZ0KTsKIAl9CiAKIAl1c2Jfd3JpdGUzMihhZGFwdCwgcmVnYWRkciwgZGF0YSk7CkBAIC03MiwxMiArNzIsMTAgQEAKIAl1MzIgcmV0ID0gMDsKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAlzdHJ1Y3QgYmJfcmVnX2RlZiAqcGh5cmVnID0gJmhhbF9kYXRhLT5QSFlSZWdEZWZbcmZwYXRoXTsKLQl1MzIgbmV3b2Zmc2V0OwogCXUzMiB0bXBsb25nLCB0bXBsb25nMjsKIAl1OCByZnBpX2VuYWJsZSA9IDA7CiAKIAlvZmZzZXQgJj0gMHhmZjsKLQluZXdvZmZzZXQgPSBvZmZzZXQ7CiAKIAl0bXBsb25nID0gcGh5X3F1ZXJ5X2JiX3JlZyhhZGFwdCwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLCBiTWFza0RXb3JkKTsKIAlpZiAocmZwYXRoID09IFJGX1BBVEhfQSkKQEAgLTg3LDcgKzg1LDcgQEAKIAkJCQkJICAgIGJNYXNrRFdvcmQpOwogCiAJdG1wbG9uZzIgPSAodG1wbG9uZzIgJiAofmJMU1NJUmVhZEFkZHJlc3MpKSB8Ci0JCSAgIChuZXdvZmZzZXQ8PDIzKSB8IGJMU1NJUmVhZEVkZ2U7CisJCSAgIChvZmZzZXQ8PDIzKSB8IGJMU1NJUmVhZEVkZ2U7CiAKIAlwaHlfc2V0X2JiX3JlZyhhZGFwdCwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLCBiTWFza0RXb3JkLAogCQkgICAgICAgdG1wbG9uZyYofmJMU1NJUmVhZEVkZ2UpKTsKQEAgLTExOSwxMCArMTE3LDkgQEAKIAl1MzIgZGF0YV9hbmRfYWRkciA9IDA7CiAJc3RydWN0IGhhbF9kYXRhXzgxODhlICpoYWxfZGF0YSA9IEdFVF9IQUxfREFUQShhZGFwdCk7CiAJc3RydWN0IGJiX3JlZ19kZWYgKnBoeXJlZyA9ICZoYWxfZGF0YS0+UEhZUmVnRGVmW3JmcGF0aF07Ci0JdTMyIG5ld29mZnNldDsKIAotCW5ld29mZnNldCA9IG9mZnNldCAmIDB4ZmY7Ci0JZGF0YV9hbmRfYWRkciA9ICgobmV3b2Zmc2V0PDwyMCkgfCAoZGF0YSYweDAwMGZmZmZmKSkgJiAweDBmZmZmZmZmOworCW9mZnNldCAmPSAweGZmOworCWRhdGFfYW5kX2FkZHIgPSAoKG9mZnNldDw8MjApIHwgKGRhdGEmMHgwMDBmZmZmZikpICYgMHgwZmZmZmZmZjsKIAlwaHlfc2V0X2JiX3JlZyhhZGFwdCwgcGh5cmVnLT5yZjN3aXJlT2Zmc2V0LCBiTWFza0RXb3JkLCBkYXRhX2FuZF9hZGRyKTsKIH0KIApAQCAtMTQ2LDcgKzE0Myw3IEBACiAJaWYgKGJpdF9tYXNrICE9IGJSRlJlZ09mZnNldE1hc2spIHsKIAkJb3JpZ2luYWxfdmFsdWUgPSByZl9zZXJpYWxfcmVhZChhZGFwdCwgcmZfcGF0aCwgcmVnX2FkZHIpOwogCQliaXRfc2hpZnQgPSAgY2FsX2JpdF9zaGlmdChiaXRfbWFzayk7Ci0JCWRhdGEgPSAoKG9yaWdpbmFsX3ZhbHVlICYgKH5iaXRfbWFzaykpIHwgKGRhdGEgPDwgYml0X3NoaWZ0KSk7CisJCWRhdGEgPSAob3JpZ2luYWxfdmFsdWUgJiAofmJpdF9tYXNrKSkgfCAoZGF0YSA8PCBiaXRfc2hpZnQpOwogCX0KIAogCXJmX3NlcmlhbF93cml0ZShhZGFwdCwgcmZfcGF0aCwgcmVnX2FkZHIsIGRhdGEpOwpAQCAtMzA0LDIxICszMDEsOCBAQAogCX0KIAogCS8qIFNldCBSRiByZWxhdGVkIHJlZ2lzdGVyICovCi0Jc3dpdGNoIChoYWxfZGF0YS0+cmZfY2hpcCkgewotCWNhc2UgUkZfODIyNToKLQkJYnJlYWs7Ci0JY2FzZSBSRl84MjU2OgotCQlicmVhazsKLQljYXNlIFJGXzgyNTg6Ci0JCWJyZWFrOwotCWNhc2UgUkZfUFNFVURPXzExTjoKLQkJYnJlYWs7Ci0JY2FzZSBSRl82MDUyOgorCWlmIChoYWxfZGF0YS0+cmZfY2hpcCA9PSBSRl82MDUyKQogCQlydGw4OGV1X3BoeV9yZjYwNTJfc2V0X2JhbmR3aWR0aChhZGFwdCwgaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsQlcpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9CiB9CiAKIHZvaWQgcGh5X3NldF9id19tb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdCwgZW51bSBodF9jaGFubmVsX3dpZHRoIGJhbmR3aWR0aCwKQEAgLTM2MSw3ICszNDUsNiBAQAogewogCXN0cnVjdCBoYWxfZGF0YV84MTg4ZSAqaGFsX2RhdGEgPSBHRVRfSEFMX0RBVEEoYWRhcHQpOwogCXU4IHRtcGNoYW5uZWwgPSBoYWxfZGF0YS0+Q3VycmVudENoYW5uZWw7Ci0JYm9vbCAgcmVzdWx0ID0gdHJ1ZTsKIAogCWlmIChoYWxfZGF0YS0+cmZfY2hpcCA9PSBSRl9QU0VVRE9fMTFOKQogCQlyZXR1cm47CkBAIC0zNzEsMzQgKzM1NCwyOCBAQAogCiAJaGFsX2RhdGEtPkN1cnJlbnRDaGFubmVsID0gY2hhbm5lbDsKIAotCWlmICgoIWFkYXB0LT5iRHJpdmVyU3RvcHBlZCkgJiYgKCFhZGFwdC0+YlN1cnByaXNlUmVtb3ZlZCkpIHsKKwlpZiAoKCFhZGFwdC0+YkRyaXZlclN0b3BwZWQpICYmICghYWRhcHQtPmJTdXJwcmlzZVJlbW92ZWQpKQogCQlwaHlfc3dfY2hubF9jYWxsYmFjayhhZGFwdCwgY2hhbm5lbCk7Ci0KLQkJaWYgKCFyZXN1bHQpCi0JCQloYWxfZGF0YS0+Q3VycmVudENoYW5uZWwgPSB0bXBjaGFubmVsOwotCi0JfSBlbHNlIHsKKwllbHNlCiAJCWhhbF9kYXRhLT5DdXJyZW50Q2hhbm5lbCA9IHRtcGNoYW5uZWw7Ci0JfQogfQogCiAjZGVmaW5lIE9ETV9UWFBXUlRSQUNLX01BWF9JRFhfODhFICA2CiAKIHN0YXRpYyB1OCBnZXRfcmlnaHRfY2hubF9mb3JfaXFrKHU4IGNobmwpCiB7CisJdTggcGxhY2U7CiAJdTggY2hhbm5lbF9hbGxbT0RNX1RBUkdFVF9DSE5MX05VTV8yR181R10gPSB7Ci0JCTEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKIAkJMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUwLCA1MiwgNTQsIDU2LCA1OCwgNjAsIDYyLCA2NCwKIAkJMTAwLCAxMDIsIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLCAxMTQsIDExNiwgMTE4LCAxMjAsIDEyMiwKIAkJMTI0LCAxMjYsIDEyOCwgMTMwLCAxMzIsIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQ5LCAxNTEsIDE1MywKIAkJMTU1LCAxNTcsIDE1OSwgMTYxLCAxNjMsIDE2NQogCX07Ci0JdTggcGxhY2UgPSBjaG5sOwogCiAJaWYgKGNobmwgPiAxNCkgewotCQlmb3IgKHBsYWNlID0gMTQ7IHBsYWNlIDwgc2l6ZW9mKGNoYW5uZWxfYWxsKTsgcGxhY2UrKykgeworCQlmb3IgKHBsYWNlID0gMDsgcGxhY2UgPCBzaXplb2YoY2hhbm5lbF9hbGwpOyBwbGFjZSsrKSB7CiAJCQlpZiAoY2hhbm5lbF9hbGxbcGxhY2VdID09IGNobmwpCi0JCQkJcmV0dXJuIHBsYWNlLTEzOworCQkJCXJldHVybiArK3BsYWNlOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtNDE2LDEyICszOTMsMTIgQEAKIAogCQlpZiAoZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbSA8PSBkbV9vZG0tPkJiU3dpbmdJZHhPZmRtQmFzZSkgewogCQkJKmRpcmVjdGlvbiA9IDE7Ci0JCQlwd3JfdmFsdWUgPSAoZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbUJhc2UgLQotCQkJCSAgICAgZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbSk7CisJCQlwd3JfdmFsdWUgPSBkbV9vZG0tPkJiU3dpbmdJZHhPZmRtQmFzZSAtCisJCQkJICAgICBkbV9vZG0tPkJiU3dpbmdJZHhPZmRtOwogCQl9IGVsc2UgewogCQkJKmRpcmVjdGlvbiA9IDI7Ci0JCQlwd3JfdmFsdWUgPSAoZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbSAtCi0JCQkJICAgICBkbV9vZG0tPkJiU3dpbmdJZHhPZmRtQmFzZSk7CisJCQlwd3JfdmFsdWUgPSBkbV9vZG0tPkJiU3dpbmdJZHhPZmRtIC0KKwkJCQkgICAgIGRtX29kbS0+QmJTd2luZ0lkeE9mZG1CYXNlOwogCQl9CiAKIAl9IGVsc2UgaWYgKHR5cGUgPT0gMSkgeyAvKiBGb3IgQ0NLIGFkanVzdC4gKi8KQEAgLTQzMSwxMiArNDA4LDEyIEBACiAKIAkJaWYgKGRtX29kbS0+QmJTd2luZ0lkeENjayA8PSBkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlKSB7CiAJCQkqZGlyZWN0aW9uID0gMTsKLQkJCXB3cl92YWx1ZSA9IChkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlIC0KLQkJCQkgICAgIGRtX29kbS0+QmJTd2luZ0lkeENjayk7CisJCQlwd3JfdmFsdWUgPSBkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlIC0KKwkJCQkgICAgIGRtX29kbS0+QmJTd2luZ0lkeENjazsKIAkJfSBlbHNlIHsKIAkJCSpkaXJlY3Rpb24gPSAyOwotCQkJcHdyX3ZhbHVlID0gKGRtX29kbS0+QmJTd2luZ0lkeENjayAtCi0JCQkJICAgICBkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlKTsKKwkJCXB3cl92YWx1ZSA9IGRtX29kbS0+QmJTd2luZ0lkeENjayAtCisJCQkJICAgICBkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlOwogCQl9CiAKIAl9CkBAIC00NjUsMTUgKzQ0MiwxMyBAQAogCXU4IHRoZXJtYWxfdmFsID0gMCwgZGVsdGEsIGRlbHRhX2xjaywgZGVsdGFfaXFrLCBvZmZzZXQ7CiAJdTggdGhlcm1hbF9hdmdfY291bnQgPSAwOwogCXUzMiB0aGVybWFsX2F2ZyA9IDA7Ci0JczMyIGVsZV9hID0gMCwgZWxlX2QsIHRlbXBfY2NrLCB4LCB2YWx1ZTMyOwotCXMzMiB5LCBlbGVfYyA9IDA7CisJczMyIGVsZV9kLCB0ZW1wX2NjazsKIAlzOCBvZmRtX2luZGV4WzJdLCBjY2tfaW5kZXggPSAwOwogCXM4IG9mZG1faW5kZXhfb2xkWzJdID0gezAsIDB9LCBjY2tfaW5kZXhfb2xkID0gMDsKIAl1MzIgaSA9IDAsIGogPSAwOwogCWJvb2wgaXMydCA9IGZhbHNlOwogCiAJdTggb2ZkbV9taW5faW5kZXggPSA2LCByZjsgLyogT0ZETSBCQiBTd2luZyBzaG91bGQgYmUgbGVzcyB0aGFuICszLjBkQiAqLwotCXU4IGluZGV4Zm9yY2hhbm5lbCA9IDA7CiAJczggb2ZkbV9pbmRleF9tYXBwaW5nWzJdW2luZGV4X21hcHBpbmdfTlVNXzg4RV0gPSB7CiAJCS8qIDIuNEcsIGRlY3JlYXNlIHBvd2VyICovCiAJCXswLCAwLCAyLCAzLCA0LCA0LCA1LCA2LCA3LCA3LCA4LCA5LCAxMCwgMTAsIDExfSwKQEAgLTUyOSwxOCArNTA0LDEyIEBACiAJCXRlbXBfY2NrID0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uUmVnQTI0OwogCiAJCWZvciAoaSA9IDA7IGkgPCBDQ0tfVEFCTEVfU0laRTsgaSsrKSB7Ci0JCQlpZiAoZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uYkNDS2luQ0gxNCkgewotCQkJCWlmIChtZW1jbXAoJnRlbXBfY2NrLCAmQ0NLU3dpbmdUYWJsZV9DaDE0W2ldWzJdLCA0KSkgeworCQkJaWYgKChkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iQ0NLaW5DSDE0ICYmCisJCQkJbWVtY21wKCZ0ZW1wX2NjaywgJkNDS1N3aW5nVGFibGVfQ2gxNFtpXVsyXSwgNCkpIHx8CisJCQkJbWVtY21wKCZ0ZW1wX2NjaywgJkNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbaV1bMl0sIDQpKSB7CiAJCQkJCWNja19pbmRleF9vbGQgPSAodTgpaTsKIAkJCQkJZG1fb2RtLT5CYlN3aW5nSWR4Q2NrQmFzZSA9ICh1OClpOwogCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtZW1jbXAoJnRlbXBfY2NrLCAmQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1tpXVsyXSwgNCkpIHsKLQkJCQkJY2NrX2luZGV4X29sZCA9ICh1OClpOwotCQkJCQlkbV9vZG0tPkJiU3dpbmdJZHhDY2tCYXNlID0gKHU4KWk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KIAkJCX0KIAkJfQogCkBAIC01NzAsMjcgKzUzOSwxOSBAQAogCQlpZiAodGhlcm1hbF9hdmdfY291bnQpCiAJCQl0aGVybWFsX3ZhbCA9ICh1OCkodGhlcm1hbF9hdmcgLyB0aGVybWFsX2F2Z19jb3VudCk7CiAKLQkJaWYgKGRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLmJSZWxvYWR0eHBvd2VyaW5kZXgpIHsKLQkJCWRlbHRhID0gdGhlcm1hbF92YWwgPiBoYWxfZGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyID8KLQkJCQkodGhlcm1hbF92YWwgLSBoYWxfZGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyKSA6Ci0JCQkJKGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgLSB0aGVybWFsX3ZhbCk7Ci0JCQlkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iUmVsb2FkdHhwb3dlcmluZGV4ID0gZmFsc2U7Ci0JCQlkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iRG9uZVR4cG93ZXIgPSBmYWxzZTsKLQkJfSBlbHNlIGlmIChkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iRG9uZVR4cG93ZXIpIHsKLQkJCWRlbHRhID0gKHRoZXJtYWxfdmFsID4gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlKSA/Ci0JCQkJKHRoZXJtYWxfdmFsIC0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlKSA6Ci0JCQkJKGRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLlRoZXJtYWxWYWx1ZSAtIHRoZXJtYWxfdmFsKTsKLQkJfSBlbHNlIHsKLQkJCWRlbHRhID0gdGhlcm1hbF92YWwgPiBoYWxfZGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyID8KLQkJCQkodGhlcm1hbF92YWwgLSBoYWxfZGF0YS0+RUVQUk9NVGhlcm1hbE1ldGVyKSA6Ci0JCQkJKGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgLSB0aGVybWFsX3ZhbCk7CisJCWlmIChkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iRG9uZVR4cG93ZXIgJiYKKwkJCSFkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iUmVsb2FkdHhwb3dlcmluZGV4KQorCQkJZGVsdGEgPSBhYnModGhlcm1hbF92YWwgLSBkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWUpOworCQllbHNlIHsKKwkJCWRlbHRhID0gYWJzKHRoZXJtYWxfdmFsIC0gaGFsX2RhdGEtPkVFUFJPTVRoZXJtYWxNZXRlcik7CisJCQlpZiAoZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uYlJlbG9hZHR4cG93ZXJpbmRleCkgeworCQkJCWRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLmJSZWxvYWR0eHBvd2VyaW5kZXggPSBmYWxzZTsKKwkJCQlkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5iRG9uZVR4cG93ZXIgPSBmYWxzZTsKKwkJCX0KIAkJfQotCQlkZWx0YV9sY2sgPSAodGhlcm1hbF92YWwgPiBkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfTENLKSA/Ci0JCQkgICAgKHRoZXJtYWxfdmFsIC0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlX0xDSykgOgotCQkJICAgIChkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfTENLIC0gdGhlcm1hbF92YWwpOwotCQlkZWx0YV9pcWsgPSAodGhlcm1hbF92YWwgPiBkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfSVFLKSA/Ci0JCQkgICAgKHRoZXJtYWxfdmFsIC0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlX0lRSykgOgotCQkJICAgIChkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfSVFLIC0gdGhlcm1hbF92YWwpOworCisJCWRlbHRhX2xjayA9IGFicyhkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5UaGVybWFsVmFsdWVfTENLIC0gdGhlcm1hbF92YWwpOworCQlkZWx0YV9pcWsgPSBhYnMoZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVGhlcm1hbFZhbHVlX0lRSyAtIHRoZXJtYWxfdmFsKTsKIAogCQkvKiBEZWx0YSB0ZW1wZXJhdHVyZSBpcyBlcXVhbCB0byBvciBsYXJnZXIgdGhhbiAyMCBjZW50aWdyYWRlLiovCiAJCWlmICgoZGVsdGFfbGNrID49IDgpKSB7CkBAIC01OTksOSArNTYwLDggQEAKIAkJfQogCiAJCWlmIChkZWx0YSA+IDAgJiYgZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVHhQb3dlclRyYWNrQ29udHJvbCkgewotCQkJZGVsdGEgPSB0aGVybWFsX3ZhbCA+IGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgPwotCQkJCSh0aGVybWFsX3ZhbCAtIGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpIDoKLQkJCQkoaGFsX2RhdGEtPkVFUFJPTVRoZXJtYWxNZXRlciAtIHRoZXJtYWxfdmFsKTsKKwkJCWRlbHRhID0gYWJzKGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIgLSB0aGVybWFsX3ZhbCk7CisKIAkJCS8qIGNhbGN1bGF0ZSBuZXcgT0ZETSAvIENDSyBvZmZzZXQgKi8KIAkJCWlmICh0aGVybWFsX3ZhbCA+IGhhbF9kYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpCiAJCQkJaiA9IDE7CkBAIC02MTYsMTcgKzU3NiwxNyBAQAogCQkJfQogCQkJaWYgKG9mZnNldCA+PSBpbmRleF9tYXBwaW5nX05VTV84OEUpCiAJCQkJb2Zmc2V0ID0gaW5kZXhfbWFwcGluZ19OVU1fODhFLTE7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgcmY7IGkrKykKLQkJCQlvZmRtX2luZGV4W2ldID0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uT0ZETV9pbmRleFtpXSArIG9mZG1faW5kZXhfbWFwcGluZ1tqXVtvZmZzZXRdOwotCQkJY2NrX2luZGV4ID0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uQ0NLX2luZGV4ICsgb2ZkbV9pbmRleF9tYXBwaW5nW2pdW29mZnNldF07CiAKKwkJCS8qIFVwZGF0aW5nIG9mZG1faW5kZXggdmFsdWVzIHdpdGggbmV3IE9GRE0gLyBDQ0sgb2Zmc2V0ICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgcmY7IGkrKykgeworCQkJCW9mZG1faW5kZXhbaV0gPSBkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5PRkRNX2luZGV4W2ldICsgb2ZkbV9pbmRleF9tYXBwaW5nW2pdW29mZnNldF07CiAJCQkJaWYgKG9mZG1faW5kZXhbaV0gPiBPRkRNX1RBQkxFX1NJWkVfOTJELTEpCiAJCQkJCW9mZG1faW5kZXhbaV0gPSBPRkRNX1RBQkxFX1NJWkVfOTJELTE7CiAJCQkJZWxzZSBpZiAob2ZkbV9pbmRleFtpXSA8IG9mZG1fbWluX2luZGV4KQogCQkJCQlvZmRtX2luZGV4W2ldID0gb2ZkbV9taW5faW5kZXg7CiAJCQl9CiAKKwkJCWNja19pbmRleCA9IGRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLkNDS19pbmRleCArIG9mZG1faW5kZXhfbWFwcGluZ1tqXVtvZmZzZXRdOwogCQkJaWYgKGNja19pbmRleCA+IENDS19UQUJMRV9TSVpFLTEpCiAJCQkJY2NrX2luZGV4ID0gQ0NLX1RBQkxFX1NJWkUtMTsKIAkJCWVsc2UgaWYgKGNja19pbmRleCA8IDApCkBAIC02MzcsMTEgKzU5Nyw2IEBACiAJCQlpZiAoZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uVHhQb3dlclRyYWNrQ29udHJvbCkgewogCQkJCWRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLmJEb25lVHhwb3dlciA9IHRydWU7CiAKLQkJCQkvKiBBZHVqc3QgT0ZETSBBbnRfQSBhY2NvcmRpbmcgdG8gSVFLIHJlc3VsdCAqLwotCQkJCWVsZV9kID0gKE9GRE1Td2luZ1RhYmxlWyh1OClvZmRtX2luZGV4WzBdXSAmIDB4RkZDMDAwMDApPj4yMjsKLQkJCQl4ID0gZG1fb2RtLT5SRkNhbGlicmF0ZUluZm8uSVFLTWF0cml4UmVnU2V0dGluZ1tpbmRleGZvcmNoYW5uZWxdLlZhbHVlWzBdWzBdOwotCQkJCXkgPSBkbV9vZG0tPlJGQ2FsaWJyYXRlSW5mby5JUUtNYXRyaXhSZWdTZXR0aW5nW2luZGV4Zm9yY2hhbm5lbF0uVmFsdWVbMF1bMV07Ci0KIAkJCQkvKiAgUmV2c2UgVFggcG93ZXIgdGFibGUuICovCiAJCQkJZG1fb2RtLT5CYlN3aW5nSWR4T2ZkbSA9ICh1OClvZmRtX2luZGV4WzBdOwogCQkJCWRtX29kbS0+QmJTd2luZ0lkeENjayA9ICh1OCljY2tfaW5kZXg7CkBAIC02NTUsNTMgKzYxMCw2IEBACiAJCQkJCWRtX29kbS0+QmJTd2luZ0lkeENja0N1cnJlbnQgPSBkbV9vZG0tPkJiU3dpbmdJZHhDY2s7CiAJCQkJCWRtX29kbS0+QmJTd2luZ0ZsYWdDY2sgPSB0cnVlOwogCQkJCX0KLQotCQkJCWlmICh4ICE9IDApIHsKLQkJCQkJaWYgKCh4ICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCQkJCXggPSB4IHwgMHhGRkZGRkMwMDsKLQkJCQkJZWxlX2EgPSAoKHggKiBlbGVfZCk+PjgpJjB4MDAwMDAzRkY7Ci0KLQkJCQkJLyogbmV3IGVsZW1lbnQgQyA9IGVsZW1lbnQgRCB4IFkgKi8KLQkJCQkJaWYgKCh5ICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCQkJCXkgPSB5IHwgMHhGRkZGRkMwMDsKLQkJCQkJZWxlX2MgPSAoKHkgKiBlbGVfZCk+PjgpJjB4MDAwMDAzRkY7Ci0KLQkJCQl9Ci0KLQkJCQlpZiAoaXMydCkgewotCQkJCQllbGVfZCA9IChPRkRNU3dpbmdUYWJsZVsodTgpb2ZkbV9pbmRleFsxXV0gJiAweEZGQzAwMDAwKT4+MjI7Ci0KLQkJCQkJLyogbmV3IGVsZW1lbnQgQSA9IGVsZW1lbnQgRCB4IFggKi8KLQkJCQkJeCA9IGRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLklRS01hdHJpeFJlZ1NldHRpbmdbaW5kZXhmb3JjaGFubmVsXS5WYWx1ZVswXVs0XTsKLQkJCQkJeSA9IGRtX29kbS0+UkZDYWxpYnJhdGVJbmZvLklRS01hdHJpeFJlZ1NldHRpbmdbaW5kZXhmb3JjaGFubmVsXS5WYWx1ZVswXVs1XTsKLQotCQkJCQlpZiAoKHggIT0gMCkgJiYgKCooZG1fb2RtLT5wQmFuZFR5cGUpID09IE9ETV9CQU5EXzJfNEcpKSB7Ci0JCQkJCQlpZiAoKHggJiAweDAwMDAwMjAwKSAhPSAwKQkvKiBjb25zaWRlciBtaW51cyAqLwotCQkJCQkJCXggPSB4IHwgMHhGRkZGRkMwMDsKLQkJCQkJCWVsZV9hID0gKCh4ICogZWxlX2QpPj44KSYweDAwMDAwM0ZGOwotCi0JCQkJCQkvKiBuZXcgZWxlbWVudCBDID0gZWxlbWVudCBEIHggWSAqLwotCQkJCQkJaWYgKCh5ICYgMHgwMDAwMDIwMCkgIT0gMCkKLQkJCQkJCQl5ID0geSB8IDB4RkZGRkZDMDA7Ci0JCQkJCQllbGVfYyA9ICgoeSAqIGVsZV9kKT4+OCkmMHgwMDAwM0ZGOwotCi0JCQkJCQkvKiB3dGl0ZSBuZXcgZWxlbWVudHMgQSwgQywgRCB0byByZWdDODggYW5kIHJlZ0M5QywgZWxlbWVudCBCIGlzIGFsd2F5cyAwICovCi0JCQkJCQl2YWx1ZTMyID0gKGVsZV9kPDwyMikgfCAoKGVsZV9jJjB4M0YpPDwxNikgfCBlbGVfYTsKLQkJCQkJCXBoeV9zZXRfYmJfcmVnKGFkYXB0LCByT0ZETTBfWEJUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkLCB2YWx1ZTMyKTsKLQotCQkJCQkJdmFsdWUzMiA9IChlbGVfYyYweDAwMDAwM0MwKT4+NjsKLQkJCQkJCXBoeV9zZXRfYmJfcmVnKGFkYXB0LCByT0ZETTBfWERUeEFGRSwgYk1hc2tINEJpdHMsIHZhbHVlMzIpOwotCi0JCQkJCQl2YWx1ZTMyID0gKCh4ICogZWxlX2QpPj43KSYweDAxOwotCQkJCQkJcGh5X3NldF9iYl9yZWcoYWRhcHQsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCBCSVQyOCwgdmFsdWUzMik7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwaHlfc2V0X2JiX3JlZyhhZGFwdCwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgT0ZETVN3aW5nVGFibGVbKHU4KW9mZG1faW5kZXhbMV1dKTsKLQkJCQkJCXBoeV9zZXRfYmJfcmVnKGFkYXB0LCByT0ZETTBfWERUeEFGRSwgYk1hc2tINEJpdHMsIDB4MDApOwotCQkJCQkJcGh5X3NldF9iYl9yZWcoYWRhcHQsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCBCSVQyOCwgMHgwMCk7Ci0JCQkJCX0KLQotCQkJCX0KLQogCQkJfQogCQl9CiAKQEAgLTEwMzMsMTEgKzk0MSwxMSBAQAogCXUzMiBwYXRoX29uOwogCXUzMiBpOwogCi0JcGF0aF9vbiA9IGlzX3BhdGhfYV9vbiA/IDB4MDRkYjI1YTQgOiAweDBiMWIyNWE0OwogCWlmICghaXMydCkgewogCQlwYXRoX29uID0gMHgwYmRiMjVhMDsKIAkJcGh5X3NldF9iYl9yZWcoYWRhcHQsIGFkZGFfcmVnWzBdLCBiTWFza0RXb3JkLCAweDBiMWIyNWEwKTsKIAl9IGVsc2UgeworCQlwYXRoX29uID0gaXNfcGF0aF9hX29uID8gMHgwNGRiMjVhNCA6IDB4MGIxYjI1YTQ7CiAJCXBoeV9zZXRfYmJfcmVnKGFkYXB0LCBhZGRhX3JlZ1swXSwgYk1hc2tEV29yZCwgcGF0aF9vbik7CiAJfQogCkBAIC0xMDc3LDI3ICs5ODUsMTkgQEAKIHN0YXRpYyBib29sIHNpbXVsYXJpdHlfY29tcGFyZShzdHJ1Y3QgYWRhcHRlciAqYWRhcHQsIHMzMiByZXN1bHRhW11bOF0sCiAJCQkgICAgICAgdTggYzEsIHU4IGMyKQogewotCXUzMiBpLCBqLCBkaWZmLCBzaW1fYml0bWFwLCBib3VuZCA9IDA7CisJdTMyIGksIGosIGRpZmYsIHNpbV9iaXRtYXAgPSAwLCBib3VuZDsKIAlzdHJ1Y3QgaGFsX2RhdGFfODE4OGUgKmhhbF9kYXRhID0gR0VUX0hBTF9EQVRBKGFkYXB0KTsKIAlzdHJ1Y3Qgb2RtX2RtX3N0cnVjdCAqZG1fb2RtID0gJmhhbF9kYXRhLT5vZG1wcml2OwogCXU4IGZpbmFsX2NhbmRpZGF0ZVsyXSA9IHsweEZGLCAweEZGfTsJLyogZm9yIHBhdGggQSBhbmQgcGF0aCBCICovCiAJYm9vbCByZXN1bHQgPSB0cnVlOwotCWJvb2wgaXMydDsKIAlzMzIgdG1wMSA9IDAsIHRtcDIgPSAwOwogCiAJaWYgKChkbV9vZG0tPlJGVHlwZSA9PSBPRE1fMlQyUikgfHwgKGRtX29kbS0+UkZUeXBlID09IE9ETV8yVDNSKSB8fAogCSAgICAoZG1fb2RtLT5SRlR5cGUgPT0gT0RNXzJUNFIpKQotCQlpczJ0ID0gdHJ1ZTsKLQllbHNlCi0JCWlzMnQgPSBmYWxzZTsKLQotCWlmIChpczJ0KQogCQlib3VuZCA9IDg7CiAJZWxzZQogCQlib3VuZCA9IDQ7CiAKLQlzaW1fYml0bWFwID0gMDsKLQogCWZvciAoaSA9IDA7IGkgPCBib3VuZDsgaSsrKSB7CiAJCWlmICgoaSA9PSAxKSB8fCAoaSA9PSAzKSB8fCAoaSA9PSA1KSB8fCAoaSA9PSA3KSkgewogCQkJaWYgKChyZXN1bHRhW2MxXVtpXSAmIDB4MDAwMDAyMDApICE9IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9wd3JzZXFjbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3B3cnNlcWNtZC5jCmluZGV4IGJlMDY2M2UuLjczZTFmOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3B3cnNlcWNtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3B3cnNlcWNtZC5jCkBAIC0xMDksNyArMTA5LDYgQEAKIAkJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAogCQkJCQkgKCJydGw4OGV1X3B3cnNlcWNtZHBhcnNpbmc6IFBXUl9DTURfRU5EXG4iKSk7CiAJCQkJcmV0dXJuIHRydWU7Ci0JCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKIAkJCQkJICgicnRsODhldV9wd3JzZXFjbWRwYXJzaW5nOiBVbmtub3duIENNRCEhXG4iKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9yZi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmYuYwppbmRleCBlZWE0YzhhLi4wOTcwOTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9yZi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogCQkJYnJlYWs7CiAJCWNhc2UgMjoJLyogIEJldHRlciByZWd1bGF0b3J5ICovCiAJCQkJLyogIGRvbid0IGluY3JlYXNlIGFueSBwb3dlciBkaWZmICovCi0JCQl3cml0ZV92YWwgPSAoKGluZGV4IDwgMikgPyBwb3dlcmJhc2UwW3JmXSA6IHBvd2VyYmFzZTFbcmZdKTsKKwkJCXdyaXRlX3ZhbCA9IChpbmRleCA8IDIpID8gcG93ZXJiYXNlMFtyZl0gOiBwb3dlcmJhc2UxW3JmXTsKIAkJCWJyZWFrOwogCQljYXNlIDM6CS8qICBDdXN0b21lciBkZWZpbmVkIHBvd2VyIGRpZmYuICovCiAJCQkJLyogIGluY3JlYXNlIHBvd2VyIGRpZmYgZGVmaW5lZCBieSBjdXN0b21lci4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3JmX2NmZy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKaW5kZXggNWRjMTFjYS4uNDU1ZWNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcmZfY2ZnLmMKQEAgLTM4LDEyICszOCwxMiBAQAogCQlyZXR1cm4gZmFsc2U7CiAKIAljb25kID0gY29uZGl0aW9uICYgMHgwMDAwRkYwMDsKLQljb25kID0gY29uZCA+PiA4OworCWNvbmQgPj49IDg7CiAJaWYgKChfaW50ZXJmYWNlICYgY29uZCkgPT0gMCAmJiBjb25kICE9IDB4MDcpCiAJCXJldHVybiBmYWxzZTsKIAogCWNvbmQgPSBjb25kaXRpb24gJiAweDAwRkYwMDAwOwotCWNvbmQgPSBjb25kID4+IDE2OworCWNvbmQgPj49IDE2OwogCWlmICgoX3BsYXRmb3JtICYgY29uZCkgPT0gMCAmJiBjb25kICE9IDB4MEYpCiAJCXJldHVybiBmYWxzZTsKIAlyZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZV9oYWxfaW5pdC5jCmluZGV4IDMyMjJkOGQuLjc5MDRkMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhlX2hhbF9pbml0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGVfaGFsX2luaXQuYwpAQCAtNTk2LDcgKzU5Niw4IEBACiAJc3RydWN0IGhhbF9kYXRhXzgxODhlICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CiAKIAlpZiAoIUF1dG9Mb2FkRmFpbCkKLQkJcEhhbERhdGEtPkJvYXJkVHlwZSA9ICgoaHdpbmZvW0VFUFJPTV9SRl9CT0FSRF9PUFRJT05fODhFXSYweEUwKT4+NSk7CisJCXBIYWxEYXRhLT5Cb2FyZFR5cGUgPSAoaHdpbmZvW0VFUFJPTV9SRl9CT0FSRF9PUFRJT05fODhFXQorCQkJCQkmIDB4RTApID4+IDU7CiAJZWxzZQogCQlwSGFsRGF0YS0+Qm9hcmRUeXBlID0gMDsKIAlEQkdfODhFKCJCb2FyZCBUeXBlOiAweCUyeFxuIiwgcEhhbERhdGEtPkJvYXJkVHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfcmVjdi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvcnRsODE4OGV1X3JlY3YuYwppbmRleCBiYzI3NWIyLi4wNmQxZTY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC9ydGw4MTg4ZXVfcmVjdi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3J0bDgxODhldV9yZWN2LmMKQEAgLTQyLDcgKzQyLDcgQEAKIAlfcnR3X2luaXRfcXVldWUoJnByZWN2cHJpdi0+ZnJlZV9yZWN2X2J1Zl9xdWV1ZSk7CiAKIAlwcmVjdnByaXYtPnBhbGxvY2F0ZWRfcmVjdl9idWYgPQotCQlremFsbG9jKE5SX1JFQ1ZCVUZGICogc2l6ZW9mKHN0cnVjdCByZWN2X2J1ZiksIEdGUF9LRVJORUwpOworCQlrY2FsbG9jKE5SX1JFQ1ZCVUZGLCBzaXplb2Yoc3RydWN0IHJlY3ZfYnVmKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHByZWN2cHJpdi0+cGFsbG9jYXRlZF9yZWN2X2J1ZiA9PSBOVUxMKSB7CiAJCXJlcyA9IF9GQUlMOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaGFsL3VzYl9oYWxpbml0LmMKaW5kZXggMTQ2NTBlOS4uN2IwMWQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9oYWwvdXNiX2hhbGluaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2hhbC91c2JfaGFsaW5pdC5jCkBAIC0xMDk2LDEwICsxMDk2LDggQEAKIAkJbWVtY3B5KGVlcHJvbS0+bWFjX2FkZHIsICZod2luZm9bRUVQUk9NX01BQ19BRERSXzg4RVVdLCBFVEhfQUxFTik7CiAJfQogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X25vdGljZV8sCi0JCSAoIkhhbF9FZnVzZVBhcnNlTUFDQWRkcl84MTg4RVU6IFBlcm1hbmVudCBBZGRyZXNzID0gJTAyeC0lMDJ4LSUwMngtJTAyeC0lMDJ4LSUwMnhcbiIsCi0JCSBlZXByb20tPm1hY19hZGRyWzBdLCBlZXByb20tPm1hY19hZGRyWzFdLAotCQkgZWVwcm9tLT5tYWNfYWRkclsyXSwgZWVwcm9tLT5tYWNfYWRkclszXSwKLQkJIGVlcHJvbS0+bWFjX2FkZHJbNF0sIGVlcHJvbS0+bWFjX2FkZHJbNV0pKTsKKwkJICgiSGFsX0VmdXNlUGFyc2VNQUNBZGRyXzgxODhFVTogUGVybWFuZW50IEFkZHJlc3MgPSAlcE1cbiIsCisJCSBlZXByb20tPm1hY19hZGRyKSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMzUyLDcgKzEzNTAsNyBAQAogCiAJCQkvKiAgU2V0IFJUUyBpbml0aWFsIHJhdGUgKi8KIAkJCXdoaWxlIChCcmF0ZUNmZyA+IDB4MSkgewotCQkJCUJyYXRlQ2ZnID0gKEJyYXRlQ2ZnID4+IDEpOworCQkJCUJyYXRlQ2ZnID4+PSAxOwogCQkJCVJhdGVJbmRleCsrOwogCQkJfQogCQkJLyogIFppdiAtIENoZWNrICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvaWVlZTgwMjExLmgKaW5kZXggMzI5OTU3MS4uOGZkMzVkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL2llZWU4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9pZWVlODAyMTEuaApAQCAtMTIyLDcgKzEyMiw2IEBACiAKICNkZWZpbmUgV1BBX1NFTEVDVE9SX0xFTiA0CiBleHRlcm4gdTggUlRXX1dQQV9PVUlfVFlQRVtdOwotZXh0ZXJuIHUxNiBSVFdfV1BBX1ZFUlNJT047CiBleHRlcm4gdTggV1BBX0FVVEhfS0VZX01HTVRfTk9ORVtdOwogZXh0ZXJuIHU4IFdQQV9BVVRIX0tFWV9NR01UX1VOU1BFQ184MDJfMVhbXTsKIGV4dGVybiB1OCBXUEFfQVVUSF9LRVlfTUdNVF9QU0tfT1ZFUl84MDJfMVhbXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvb3NkZXBfc2VydmljZS5oCmluZGV4IDNhMjc0NzcuLjUxNWU5NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9vc2RlcF9zZXJ2aWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL29zZGVwX3NlcnZpY2UuaApAQCAtNzYsMjUgKzc2LDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX2luaXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnB0aW1lciwKLQkJCSAgICAgICBzdHJ1Y3QgIG5ldF9kZXZpY2UgKm5pY19oZGwsCi0JCQkgICAgICAgdm9pZCAqcGZ1bmMsIHZvaWQgKmNudHgpCi17Ci0JcHRpbWVyLT5mdW5jdGlvbiA9IHBmdW5jOwotCXB0aW1lci0+ZGF0YSA9ICh1bnNpZ25lZCBsb25nKWNudHg7Ci0JaW5pdF90aW1lcihwdGltZXIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX3NldF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqcHRpbWVyLCB1MzIgZGVsYXlfdGltZSkKLXsKLQltb2RfdGltZXIocHRpbWVyICwgKGppZmZpZXMrbXNlY3NfdG9famlmZmllcyhkZWxheV90aW1lKSkpOwotfQotCi0jZGVmaW5lIFJUV19USU1FUl9IRExfQVJHUyB2b2lkICpGdW5jdGlvbkNvbnRleHQKLSNkZWZpbmUgUlRXX1RJTUVSX0hETF9OQU1FKG5hbWUpIHJ0d18jI25hbWUjI190aW1lcl9oZGwKLSNkZWZpbmUgUlRXX0RFQ0xBUkVfVElNRVJfSERMKG5hbWUpIFwKLQl2b2lkIFJUV19USU1FUl9IRExfTkFNRShuYW1lKShSVFdfVElNRVJfSERMX0FSR1MpCi0KIHN0YXRpYyBpbmxpbmUgaW50IHJ0d19uZXRpZl9xdWV1ZV9zdG9wcGVkKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQogewogCXJldHVybiAgbmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKHBuZXRkZXYsIDApKSAmJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19sZWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbGVkLmgKaW5kZXggMjNmMGNmZS4uN2E1MzAzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19sZWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X2xlZC5oCkBAIC0xMDMsNyArMTAzLDcgQEAKIAkJCShhZGFwdCktPmxlZHByaXYuTGVkQ29udHJvbEhhbmRsZXIoKGFkYXB0KSwgKGFjdGlvbikpOyBcCiAJfSB3aGlsZSAoMCkKIAotdm9pZCBCbGlua1RpbWVyQ2FsbGJhY2sodm9pZCAqZGF0YSk7Cit2b2lkIEJsaW5rVGltZXJDYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOwogdm9pZCBCbGlua1dvcmtJdGVtQ2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKIAogdm9pZCBSZXNldExlZFN0YXR1cyhzdHJ1Y3QgTEVEXzg3MXggKnBMZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaAppbmRleCA4ZDgzZjdjLi4zZjdkMWU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWUuaApAQCAtNTUxLDEwICs1NTEsMTAgQEAKIAogdm9pZCBydHdfZ2V0X2VuY3J5cHRfZGVjcnlwdF9mcm9tX3JlZ2lzdHJ5cHJpdihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlcik7CiAKLXZvaWQgX3J0d19qb2luX3RpbWVvdXRfaGFuZGxlcih2b2lkICpmdW5jdGlvbl9jb250ZXh0KTsKLXZvaWQgcnR3X3NjYW5fdGltZW91dF9oYW5kbGVyKHZvaWQgKmZ1bmN0aW9uX2NvbnRleHQpOwordm9pZCBfcnR3X2pvaW5fdGltZW91dF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIHJ0d19zY2FuX3RpbWVvdXRfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpOwogCi12b2lkIHJ0d19keW5hbWljX2NoZWNrX3RpbWVyX2hhbmRsZGVyKHZvaWQgKmZ1bmN0aW9uX2NvbnRleHQpOwordm9pZCBydHdfZHluYW1pY19jaGVja190aW1lcl9oYW5kbGRlcih1bnNpZ25lZCBsb25nIGRhdGEpOwogI2RlZmluZSBydHdfaXNfc2Nhbl9kZW55KGFkYXB0ZXIpIGZhbHNlCiAjZGVmaW5lIHJ0d19jbGVhcl9zY2FuX2RlbnkoYWRhcHRlcikgZG8ge30gd2hpbGUgKDApCiAjZGVmaW5lIHJ0d19zZXRfc2Nhbl9kZW55X3RpbWVyX2hkbChhZGFwdGVyKSBkbyB7fSB3aGlsZSAoMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfbWxtZV9leHQuaAppbmRleCA0ZjA1YWVlLi4yYmViZjQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X21sbWVfZXh0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19tbG1lX2V4dC5oCkBAIC02NDUsMTkgKzY0NSwxNyBAQAogCiB2b2lkIGxpbmtlZF9zdGF0dXNfY2hrKHN0cnVjdCBhZGFwdGVyICpwYWRhcHRlcik7CiAKLXZvaWQgc3VydmV5X3RpbWVyX2hkbCh2b2lkICpmdW5jdGlvbl9jb250ZXh0KTsKLXZvaWQgbGlua190aW1lcl9oZGwodm9pZCAqZnVudGlvbl9jb250ZXh0KTsKLXZvaWQgYWRkYmFfdGltZXJfaGRsKHZvaWQgKmZ1bmN0aW9uX2NvbnRleHQpOwordm9pZCBzdXJ2ZXlfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIGxpbmtfdGltZXJfaGRsKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit2b2lkIGFkZGJhX3RpbWVyX2hkbCh1bnNpZ25lZCBsb25nIGRhdGEpOwogCiAjZGVmaW5lIHNldF9zdXJ2ZXlfdGltZXIobWxtZWV4dCwgbXMpIFwKLQlkbyB7IFwKLQkJX3NldF90aW1lcigmKG1sbWVleHQpLT5zdXJ2ZXlfdGltZXIsIChtcykpOyBcCi0JfSB3aGlsZSAoMCkKKwltb2RfdGltZXIoJm1sbWVleHQtPnN1cnZleV90aW1lciwgamlmZmllcyArCVwKKwkJICBtc2Vjc190b19qaWZmaWVzKG1zKSkKIAogI2RlZmluZSBzZXRfbGlua190aW1lcihtbG1lZXh0LCBtcykgXAotCWRvIHsgXAotCQlfc2V0X3RpbWVyKCYobWxtZWV4dCktPmxpbmtfdGltZXIsIChtcykpOyBcCi0JfSB3aGlsZSAoMCkKKwltb2RfdGltZXIoJm1sbWVleHQtPmxpbmtfdGltZXIsIGppZmZpZXMgKwlcCisJCSAgbXNlY3NfdG9famlmZmllcyhtcykpCiAKIGludCBjY2tyYXRlc19pbmNsdWRlZCh1bnNpZ25lZCBjaGFyICpyYXRlLCBpbnQgcmF0ZWxlbik7CiBpbnQgY2NrcmF0ZXNvbmx5X2luY2x1ZGVkKHVuc2lnbmVkIGNoYXIgKnJhdGUsIGludCByYXRlbGVuKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcHdyY3RybC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKaW5kZXggNTRkZmJmMC4uYWExZmQ4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19wd3JjdHJsLmgKQEAgLTIzMyw5ICsyMzMsOCBAQAogI2RlZmluZSBSVFdfUFdSX1NUQVRFX0NIS19JTlRFUlZBTCAyMDAwCiAKICNkZWZpbmUgX3J0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKHB3cmN0cmxwcml2LCBtcykgXAotCWRvIHsgXAotCQlfc2V0X3RpbWVyKCYocHdyY3RybHByaXYpLT5wd3Jfc3RhdGVfY2hlY2tfdGltZXIsIChtcykpOyBcCi0JfSB3aGlsZSAoMCkKKwltb2RfdGltZXIoJnB3cmN0cmxwcml2LT5wd3Jfc3RhdGVfY2hlY2tfdGltZXIsCVwKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhtcykpCiAKICNkZWZpbmUgcnR3X3NldF9wd3Jfc3RhdGVfY2hlY2tfdGltZXIocHdyY3RybCkJCQlcCiAJX3J0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKChwd3JjdHJsKSwJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfcmVjdi5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKaW5kZXggZjBjMjZlZi4uZWIxYWMzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19yZWN2LmgKQEAgLTIxNiw4ICsyMTYsOCBAQAogfTsKIAogI2RlZmluZSBydHdfc2V0X3NpZ25hbF9zdGF0X3RpbWVyKHJlY3Zwcml2KQkJCVwKLQlfc2V0X3RpbWVyKCYocmVjdnByaXYpLT5zaWduYWxfc3RhdF90aW1lciwJCVwKLQkJICAgKHJlY3Zwcml2KS0+c2lnbmFsX3N0YXRfc2FtcGxpbmdfaW50ZXJ2YWwpCisJbW9kX3RpbWVyKCYocmVjdnByaXYpLT5zaWduYWxfc3RhdF90aW1lciwgamlmZmllcyArCVwKKwkJICBtc2Vjc190b19qaWZmaWVzKChyZWN2cHJpdiktPnNpZ25hbF9zdGF0X3NhbXBsaW5nX2ludGVydmFsKSkKIAogc3RydWN0IHN0YV9yZWN2X3ByaXYgewogCXNwaW5sb2NrX3QgbG9jazsKQEAgLTI3OCw3ICsyNzgsNyBAQAogCQkJICAgICAgc3RydWN0IF9fcXVldWUgKnBmcmVlX3JlY3ZfcXVldWUpOwogdTMyIHJ0d19mcmVlX3VjX3N3ZGVjX3BlbmRpbmdfcXVldWUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpOwogCi12b2lkIHJ0d19yZW9yZGVyaW5nX2N0cmxfdGltZW91dF9oYW5kbGVyKHZvaWQgKnBjb250ZXh0KTsKK3ZvaWQgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKTsKIAogc3RhdGljIGlubGluZSB1OCAqZ2V0X3J4bWVtKHN0cnVjdCByZWN2X2ZyYW1lICpwcmVjdmZyYW1lKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zZWN1cml0eS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3J0d19zZWN1cml0eS5oCmluZGV4IDY2ZDYwYWEuLmU5NzIzYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS9ydHdfc2VjdXJpdHkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvcnR3X3NlY3VyaXR5LmgKQEAgLTI0NSwxMCArMjQ1LDYgQEAKIH07CiAKIGV4dGVybiBjb25zdCB1MzIgVGUwWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRlMVsyNTZdOwotZXh0ZXJuIGNvbnN0IHUzMiBUZTJbMjU2XTsKLWV4dGVybiBjb25zdCB1MzIgVGUzWzI1Nl07Ci1leHRlcm4gY29uc3QgdTMyIFRlNFsyNTZdOwogZXh0ZXJuIGNvbnN0IHUzMiBUZDBbMjU2XTsKIGV4dGVybiBjb25zdCB1MzIgVGQxWzI1Nl07CiBleHRlcm4gY29uc3QgdTMyIFRkMlsyNTZdOwpAQCAtMjY5LDI4ICsyNjUsNiBAQAogI2RlZmluZSBURTEoaSkgcm90cihUZTBbKChpKSA+PiAxNikgJiAweGZmXSwgOCkKICNkZWZpbmUgVEUyKGkpIHJvdHIoVGUwWygoaSkgPj4gOCkgJiAweGZmXSwgMTYpCiAjZGVmaW5lIFRFMyhpKSByb3RyKFRlMFsoaSkgJiAweGZmXSwgMjQpCi0jZGVmaW5lIFRFNDEoaSkgKChUZTBbKChpKSA+PiAyNCkgJiAweGZmXSA8PCA4KSAmIDB4ZmYwMDAwMDApCi0jZGVmaW5lIFRFNDIoaSkgKFRlMFsoKGkpID4+IDE2KSAmIDB4ZmZdICYgMHgwMGZmMDAwMCkKLSNkZWZpbmUgVEU0MyhpKSAoVGUwWygoaSkgPj4gOCkgJiAweGZmXSAmIDB4MDAwMGZmMDApCi0jZGVmaW5lIFRFNDQoaSkgKChUZTBbKGkpICYgMHhmZl0gPj4gOCkgJiAweDAwMDAwMGZmKQotI2RlZmluZSBURTQyMShpKSAoKFRlMFsoKGkpID4+IDE2KSAmIDB4ZmZdIDw8IDgpICYgMHhmZjAwMDAwMCkKLSNkZWZpbmUgVEU0MzIoaSkgKFRlMFsoKGkpID4+IDgpICYgMHhmZl0gJiAweDAwZmYwMDAwKQotI2RlZmluZSBURTQ0MyhpKSAoVGUwWyhpKSAmIDB4ZmZdICYgMHgwMDAwZmYwMCkKLSNkZWZpbmUgVEU0MTQoaSkgKChUZTBbKChpKSA+PiAyNCkgJiAweGZmXSA+PiA4KSAmIDB4MDAwMDAwZmYpCi0jZGVmaW5lIFRFNChpKSAoKFRlMFsoaSldID4+IDgpICYgMHgwMDAwMDBmZikKLQotI2RlZmluZSBURDAoaSkgVGQwWygoaSkgPj4gMjQpICYgMHhmZl0KLSNkZWZpbmUgVEQxKGkpIHJvdHIoVGQwWygoaSkgPj4gMTYpICYgMHhmZl0sIDgpCi0jZGVmaW5lIFREMihpKSByb3RyKFRkMFsoKGkpID4+IDgpICYgMHhmZl0sIDE2KQotI2RlZmluZSBURDMoaSkgcm90cihUZDBbKGkpICYgMHhmZl0sIDI0KQotI2RlZmluZSBURDQxKGkpIChUZDRzWygoaSkgPj4gMjQpICYgMHhmZl0gPDwgMjQpCi0jZGVmaW5lIFRENDIoaSkgKFRkNHNbKChpKSA+PiAxNikgJiAweGZmXSA8PCAxNikKLSNkZWZpbmUgVEQ0MyhpKSAoVGQ0c1soKGkpID4+IDgpICYgMHhmZl0gPDwgOCkKLSNkZWZpbmUgVEQ0NChpKSAoVGQ0c1soaSkgJiAweGZmXSkKLSNkZWZpbmUgVEQwXyhpKSBUZDBbKGkpICYgMHhmZl0KLSNkZWZpbmUgVEQxXyhpKSByb3RyKFRkMFsoaSkgJiAweGZmXSwgOCkKLSNkZWZpbmUgVEQyXyhpKSByb3RyKFRkMFsoaSkgJiAweGZmXSwgMTYpCi0jZGVmaW5lIFREM18oaSkgcm90cihUZDBbKGkpICYgMHhmZl0sIDI0KQogCiAjZGVmaW5lIEdFVFUzMihwdCkgKCgodTMyKShwdClbMF0gPDwgMjQpIF4gKCh1MzIpKHB0KVsxXSA8PCAxNikgXiBcCiAJCQkoKHUzMikocHQpWzJdIDw8ICA4KSBeICgodTMyKShwdClbM10pKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dpZmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvaW5jbHVkZS93aWZpLmgKaW5kZXggOGRiZGZhZi4uYTg5Mjc1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dpZmkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2lmaS5oCkBAIC0zMDEsMjIgKzMwMSwxMiBAQAogI2RlZmluZSBHZXRQcml2YWN5KHBidWYpCQkJCQlcCiAJKCgoKihfX2xlMTYgKikocGJ1ZikpICYgY3B1X3RvX2xlMTYoX1BSSVZBQ1lfKSkgIT0gMCkKIAotI2RlZmluZSBDbGVhclByaXZhY3kocGJ1ZikJXAotCSooX19sZTE2ICopKHBidWYpICY9ICh+Y3B1X3RvX2xlMTYoX1BSSVZBQ1lfKSkKLQotCiAjZGVmaW5lIEdldE9yZGVyKHBidWYpCQkJCQlcCiAJKCgoKihfX2xlMTYgKikocGJ1ZikpICYgY3B1X3RvX2xlMTYoX09SREVSXykpICE9IDApCiAKICNkZWZpbmUgR2V0RnJhbWVUeXBlKHBidWYpCQkJCVwKIAkobGUxNl90b19jcHUoKihfX2xlMTYgKikocGJ1ZikpICYgKEJJVCgzKSB8IEJJVCgyKSkpCiAKLSNkZWZpbmUgU2V0RnJhbWVUeXBlKHBidWYsIHR5cGUpCVwKLQlkbyB7CVwKLQkJKih1bnNpZ25lZCBzaG9ydCAqKShwYnVmKSAmPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KH4oQklUKDMpIHwgQklUKDIpKSk7IFwKLQkJKih1bnNpZ25lZCBzaG9ydCAqKShwYnVmKSB8PSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHR5cGUpOyBcCi0JfSB3aGlsZSAoMCkKLQogI2RlZmluZSBHZXRGcmFtZVN1YlR5cGUocGJ1ZikJKGxlMTZfdG9fY3B1KCooX19sZTE2ICopKHBidWYpKSAmIChCSVQoNykgfFwKIAkgQklUKDYpIHwgQklUKDUpIHwgQklUKDQpIHwgQklUKDMpIHwgQklUKDIpKSkKIApAQCAtMzMzLDE3ICszMjMsNiBAQAogI2RlZmluZSBHZXRGcmFnTnVtKHBidWYpCQkJXAogCShsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSgoc2l6ZV90KShwYnVmKSArIDIyKSkgJiAweDBmKQogCi0jZGVmaW5lIEdldFR1cGxlQ2FjaGUocGJ1ZikJCQlcCi0JKGNwdV90b19sZTE2KCoodW5zaWduZWQgc2hvcnQgKikoKHNpemVfdCkocGJ1ZikgKyAyMikpKQotCi0jZGVmaW5lIFNldEZyYWdOdW0ocGJ1ZiwgbnVtKSBcCi0JZG8geyAgICBcCi0JCSoodW5zaWduZWQgc2hvcnQgKikoKHNpemVfdCkocGJ1ZikgKyAyMikgPSBcCi0JCQkoKCoodW5zaWduZWQgc2hvcnQgKikoKHNpemVfdCkocGJ1ZikgKyAyMikpICYJXAotCQkJbGUxNl90b19jcHUofigweDAwMGYpKSkgfCBcCi0JCQljcHVfdG9fbGUxNigweDBmICYgKG51bSkpOyAgICAgXAotCX0gd2hpbGUgKDApCi0KICNkZWZpbmUgU2V0U2VxTnVtKHBidWYsIG51bSkgXAogCWRvIHsgICAgXAogCQkqKF9fbGUxNiAqKSgoc2l6ZV90KShwYnVmKSArIDIyKSA9IFwKQEAgLTM3MCwxNSArMzQ5LDggQEAKIAogI2RlZmluZSBHZXRBTXNkdShwYnVmKSAoKChsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKXBidWYpKSA+PiA3KSAmIDB4MSkKIAotI2RlZmluZSBTZXRBTXNkdShwYnVmLCBhbXNkdSkJXAotCSooX19sZTE2ICopKHBidWYpIHw9IGNwdV90b19sZTE2KChhbXNkdSAmIDEpIDw8IDcpCi0KICNkZWZpbmUgR2V0QWlkKHBidWYpCShsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSgoc2l6ZV90KShwYnVmKSArIDIpKSAmIDB4M2ZmZikKIAotI2RlZmluZSBHZXRUaWQocGJ1ZikJKGxlMTZfdG9fY3B1KCooX19sZTE2ICopKChzaXplX3QpKHBidWYpICsJXAotCQkJKCgoR2V0VG9EcyhwYnVmKTw8MSkgfCBHZXRGckRzKHBidWYpKSA9PSAzID8JXAotCQkJMzAgOiAyNCkpKSAmIDB4MDAwZikKLQogI2RlZmluZSBHZXRBZGRyMVB0cihwYnVmKQkoKHVuc2lnbmVkIGNoYXIgKikoKHNpemVfdCkocGJ1ZikgKyA0KSkKIAogI2RlZmluZSBHZXRBZGRyMlB0cihwYnVmKQkoKHVuc2lnbmVkIGNoYXIgKikoKHNpemVfdCkocGJ1ZikgKyAxMCkpCkBAIC05MTYsNyArODg4LDcgQEAKICNkZWZpbmUJUDJQX1NUQVRVU19GQUlMX0lOQ09NUEFUSUJMRV9QUk9WU0lPTgkJMHgwQQogI2RlZmluZQlQMlBfU1RBVFVTX0ZBSUxfVVNFUl9SRUpFQ1QJCQkweDBCCiAKLS8qCVZhbHVlIG9mIEludmlhdGlvbiBGbGFncyBBdHRyaWJ1dGUgKi8KKy8qCVZhbHVlIG9mIEludml0YXRpb24gRmxhZ3MgQXR0cmlidXRlICovCiAjZGVmaW5lCVAyUF9JTlZJVEFUSU9OX0ZMQUdTX1BFUlNJU1RFTlQJCQlCSVQoMCkKIAogI2RlZmluZQlETVBfUDJQX0RFVkNBUF9TVVBQT1JUCShQMlBfREVWQ0FQX1NFUlZJQ0VfRElTQ09WRVJZIHwgXApAQCAtOTcwLDcgKzk0Miw3IEBACiAKICNkZWZpbmUJUDJQX1dJTERDQVJEX1NTSURfTEVOCQkJNwogCi0vKiBkZWZhdWx0IHZhbHVlLCB1c2VkIHdoZW46ICgxKXAycCBkaXNhYmVkIG9yICgyKXAycCBlbmFibGVkCisvKiBkZWZhdWx0IHZhbHVlLCB1c2VkIHdoZW46ICgxKXAycCBkaXNhYmxlZCBvciAoMilwMnAgZW5hYmxlZAogICogYnV0IG9ubHkgZG8gMSBzY2FuIHBoYXNlICovCiAjZGVmaW5lCVAyUF9GSU5EUEhBU0VfRVhfTk9ORQkJMAogLyogIHVzZWQgd2hlbiBwMnAgZW5hYmxlZCBhbmQgd2FudCB0byBkbyAxIHNjYW4gcGhhc2UgYW5kCkBAIC0xMDM1LDEzICsxMDA3LDEzIEBACiAJUDJQX1NUQVRFX1RYX1BST1ZJU0lPTl9ESVNfUkVRID0gNiwKIAlQMlBfU1RBVEVfUlhfUFJPVklTSU9OX0RJU19SU1AgPSA3LAogCVAyUF9TVEFURV9SWF9QUk9WSVNJT05fRElTX1JFUSA9IDgsCi0JLyogRG9pbmcgdGhlIGdyb3VwIG93bmVyIG5lZ29pdGF0aW9uIGhhbmRzaGFrZSAqLworCS8qIERvaW5nIHRoZSBncm91cCBvd25lciBuZWdvdGlhdGlvbiBoYW5kc2hha2UgKi8KIAlQMlBfU1RBVEVfR09ORUdPX0lORyA9IDksCi0JLyogZmluaXNoIHRoZSBncm91cCBuZWdvaXRhdGlvbiBoYW5kc2hha2Ugd2l0aCBzdWNjZXNzICovCisJLyogZmluaXNoIHRoZSBncm91cCBuZWdvdGlhdGlvbiBoYW5kc2hha2Ugd2l0aCBzdWNjZXNzICovCiAJUDJQX1NUQVRFX0dPTkVHT19PSyA9IDEwLAotCS8qIGZpbmlzaCB0aGUgZ3JvdXAgbmVnb2l0YXRpb24gaGFuZHNoYWtlIHdpdGggZmFpbHVyZSAqLworCS8qIGZpbmlzaCB0aGUgZ3JvdXAgbmVnb3RpYXRpb24gaGFuZHNoYWtlIHdpdGggZmFpbHVyZSAqLwogCVAyUF9TVEFURV9HT05FR09fRkFJTCA9IDExLAotCS8qIHJlY2VpdmluZyB0aGUgUDJQIEludmlhdGlvbiByZXF1ZXN0IGFuZCBtYXRjaCB3aXRoIHRoZSBwcm9maWxlLiAqLworCS8qIHJlY2VpdmluZyB0aGUgUDJQIEludml0YXRpb24gcmVxdWVzdCBhbmQgbWF0Y2ggd2l0aCB0aGUgcHJvZmlsZS4gKi8KIAlQMlBfU1RBVEVfUkVDVl9JTlZJVEVfUkVRX01BVENIID0gMTIsCiAJLyogRG9pbmcgdGhlIFAyUCBXUFMgKi8KIAlQMlBfU1RBVEVfUFJPVklTSU9OSU5HX0lORyA9IDEzLApAQCAtMTA1MSwxNyArMTAyMywxNyBAQAogCVAyUF9TVEFURV9UWF9JTlZJVEVfUkVRID0gMTUsCiAJLyogUmVjZWl2aW5nIHRoZSBQMlAgSW52aXRhdGlvbiByZXNwb25zZSAqLwogCVAyUF9TVEFURV9SWF9JTlZJVEVfUkVTUF9PSyA9IDE2LAotCS8qIHJlY2VpdmluZyB0aGUgUDJQIEludmlhdGlvbiByZXF1ZXN0IGFuZCBkaXNtYXRjaCB3aXRoIHRoZSBwcm9maWxlLiAqLworCS8qIHJlY2VpdmluZyB0aGUgUDJQIEludml0YXRpb24gcmVxdWVzdCBhbmQgZGlzbWF0Y2ggd2l0aCB0aGUgcHJvZmlsZS4gKi8KIAlQMlBfU1RBVEVfUkVDVl9JTlZJVEVfUkVRX0RJU01BVENIID0gMTcsCi0JLyogcmVjZWl2aW5nIHRoZSBQMlAgSW52aWF0aW9uIHJlcXVlc3QgYW5kIHRoaXMgd2lmaSBpcyBHTy4gKi8KKwkvKiByZWNlaXZpbmcgdGhlIFAyUCBJbnZpdGF0aW9uIHJlcXVlc3QgYW5kIHRoaXMgd2lmaSBpcyBHTy4gKi8KIAlQMlBfU1RBVEVfUkVDVl9JTlZJVEVfUkVRX0dPID0gMTgsCi0JLyogcmVjZWl2aW5nIHRoZSBQMlAgSW52aWF0aW9uIHJlcXVlc3QgdG8gam9pbiBhbiBleGlzdGluZyBQMlAgR3JvdXAuICovCisJLyogcmVjZWl2aW5nIHRoZSBQMlAgSW52aXRhdGlvbiByZXF1ZXN0IHRvIGpvaW4gYW4gZXhpc3RpbmcgUDJQIEdyb3VwLiAqLwogCVAyUF9TVEFURV9SRUNWX0lOVklURV9SRVFfSk9JTiA9IDE5LAotCS8qIHJlY3ZlaW5nIHRoZSBQMlAgSW52aWF0aW9uIHJlc3BvbnNlIHdpdGggZmFpbHVyZSAqLworCS8qIHJlY2VpdmluZyB0aGUgUDJQIEludml0YXRpb24gcmVzcG9uc2Ugd2l0aCBmYWlsdXJlICovCiAJUDJQX1NUQVRFX1JYX0lOVklURV9SRVNQX0ZBSUwgPSAyMCwKLQkvKiByZWNlaXZpbmcgcDJwIG5lZ29pdGF0aW9uIHJlc3BvbnNlIHdpdGggaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSAqLworCS8qIHJlY2VpdmluZyBwMnAgbmVnb3RpYXRpb24gcmVzcG9uc2Ugd2l0aCBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlICovCiAJUDJQX1NUQVRFX1JYX0lORk9SX05PUkVBRFkgPSAyMSwKLQkvKiBzZW5kaW5nIHAycCBuZWdvaXRhdGlvbiByZXNwb25zZSB3aXRoIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgKi8KKwkvKiBzZW5kaW5nIHAycCBuZWdvdGlhdGlvbiByZXNwb25zZSB3aXRoIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgKi8KIAlQMlBfU1RBVEVfVFhfSU5GT1JfTk9SRUFEWSA9IDIyLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9pbmNsdWRlL3dsYW5fYnNzZGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaAppbmRleCA1M2IxYmQ4Li44NWI5OWRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L2luY2x1ZGUvd2xhbl9ic3NkZWYuaApAQCAtMTU2LDE2ICsxNTYsNiBAQAogCU5kaXM4MDJfMTFSZWxvYWRXRVBLZXlzCiB9OwogCi0vKiAgS2V5IG1hcHBpbmcga2V5cyByZXF1aXJlIGEgQlNTSUQgKi8KLXN0cnVjdCBuZGlzXzgwMl8xMV9rZXkgewotCXUzMiAgICAgICAgICAgTGVuZ3RoOyAgICAgICAgICAgICAvKiAgTGVuZ3RoIG9mIHRoaXMgc3RydWN0dXJlICovCi0JdTMyICAgICAgICAgICBLZXlJbmRleDsKLQl1MzIgICAgICAgICAgIEtleUxlbmd0aDsgICAgICAgICAgLyogIGxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMgKi8KLQl1bnNpZ25lZCBjaGFyIEJTU0lEW0VUSF9BTEVOXTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgS2V5UlNDOwotCXU4ICAgICAgICAgICBLZXlNYXRlcmlhbFszMl07ICAvKiB2YXIgbGVuIGRlcGVuZGluZyBvbiBhYm92ZSBmaWVsZCAqLwotfTsKLQogc3RydWN0IG5kaXNfODAyXzExX3JlbW92ZV9rZXkgewogCXUzMiAgICAgICAgICAgICAgICAgICBMZW5ndGg7ICAgICAgICAvKiAgTGVuZ3RoICovCiAJdTMyICAgICAgICAgICAgICAgICAgIEtleUluZGV4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL2lvY3RsX2xpbnV4LmMKaW5kZXggMjRhOGY1YS4uOTZjMWMyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvaW9jdGxfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9pb2N0bF9saW51eC5jCkBAIC0zMiw2ICszMiw4IEBACiAKICNpbmNsdWRlIDxydHdfaW9sLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKICNpbmNsdWRlICJvc2RlcF9pbnRmLmgiCiAKICNkZWZpbmUgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UCShTSU9DSVdGSVJTVFBSSVYgKyAzMCkKQEAgLTkyLDcgKzk0LDcgQEAKIAltZW1zZXQoJndycXUsIDAsIHNpemVvZih1bmlvbiBpd3JlcV9kYXRhKSk7CiAKIAl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIod3JxdS5hcF9hZGRyLnNhX2RhdGEpOwogCiAJREJHXzg4RV9MRVZFTChfZHJ2X2Fsd2F5c18sICJpbmRpY2F0ZSBkaXNhc3NvY1xuIik7CiAJd2lyZWxlc3Nfc2VuZF9ldmVudChwYWRhcHRlci0+cG5ldGRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CkBAIC04MjcsNyArODI5LDcgQEAKIAkJZm9yIChqID0gMDsgaiA8IE5VTV9QTUtJRF9DQUNIRTsgaisrKSB7CiAJCQlpZiAoIW1lbWNtcChwc2VjdXJpdHlwcml2LT5QTUtJRExpc3Rbal0uQnNzaWQsIHN0cklzc3VlQnNzaWQsIEVUSF9BTEVOKSkgewogCQkJCS8qICBCU1NJRCBpcyBtYXRjaGVkLCB0aGUgc2FtZSBBUCA9PiBSZW1vdmUgdGhpcyBQTUtJRCBpbmZvcm1hdGlvbiBhbmQgcmVzZXQgaXQuICovCi0JCQkJbWVtc2V0KHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtqXS5Cc3NpZCwgMHgwMCwgRVRIX0FMRU4pOworCQkJCWV0aF96ZXJvX2FkZHIocHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2pdLkJzc2lkKTsKIAkJCQlwc2VjdXJpdHlwcml2LT5QTUtJRExpc3Rbal0uYlVzZWQgPSBmYWxzZTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTEwMjgsNyArMTAzMCw3IEBACiAKIAl3cnF1LT5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKIAotCW1lbXNldCh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKHdycXUtPmFwX2FkZHIuc2FfZGF0YSk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCJydHdfd3hfZ2V0X3dhcFxuIikpOwogCkBAIC0xMDM3LDcgKzEwMzksNyBAQAogCSAgICAoKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FQX1NUQVRFKSkgPT0gdHJ1ZSkpCiAJCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIHBjdXJfYnNzLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CiAJZWxzZQotCQltZW1zZXQod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIod3JxdS0+YXBfYWRkci5zYV9kYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTc5NiwxMSArMTc5OCw5IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCWludCByZXQ7CiAJc3RydWN0IGFkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBhZGFwdGVyICopcnR3X25ldGRldl9wcml2KGRldik7CiAKLQlyZXQgPSBydHdfc2V0X3dwYV9pZShwYWRhcHRlciwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiBydHdfc2V0X3dwYV9pZShwYWRhcHRlciwgZXh0cmEsIHdycXUtPmRhdGEubGVuZ3RoKTsKIH0KIAogc3RhdGljIGludCBydHdfd3hfc2V0X2F1dGgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL21sbWVfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL21sbWVfbGludXguYwppbmRleCAxYjg5MmM0Li5iYWZmMWUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9tbG1lX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvbWxtZV9saW51eC5jCkBAIC0yOSw5ICsyOSwxMiBAQAogewogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLQlfaW5pdF90aW1lcigmKHBtbG1lcHJpdi0+YXNzb2NfdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwgX3J0d19qb2luX3RpbWVvdXRfaGFuZGxlciwgcGFkYXB0ZXIpOwotCV9pbml0X3RpbWVyKCYocG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyKSwgcGFkYXB0ZXItPnBuZXRkZXYsIHJ0d19zY2FuX3RpbWVvdXRfaGFuZGxlciwgcGFkYXB0ZXIpOwotCV9pbml0X3RpbWVyKCYocG1sbWVwcml2LT5keW5hbWljX2Noa190aW1lciksIHBhZGFwdGVyLT5wbmV0ZGV2LCBydHdfZHluYW1pY19jaGVja190aW1lcl9oYW5kbGRlciwgcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCBfcnR3X2pvaW5fdGltZW91dF9oYW5kbGVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIsIHJ0d19zY2FuX3RpbWVvdXRfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKKwlzZXR1cF90aW1lcigmcG1sbWVwcml2LT5keW5hbWljX2Noa190aW1lciwKKwkJICAgIHJ0d19keW5hbWljX2NoZWNrX3RpbWVyX2hhbmRsZGVyLCAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7CiB9CiAKIHZvaWQgcnR3X29zX2luZGljYXRlX2Nvbm5lY3Qoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIpCkBAIC02MCw3ICs2Myw2IEBACiAJCS8qICBXZSBoYXZlIHRvIGJhY2t1cCB0aGUgUE1LIGluZm9ybWF0aW9uIGZvciBXaUZpIFBNSyBDYWNoaW5nIHRlc3QgaXRlbS4gKi8KIAkJLyogIEJhY2t1cCB0aGUgYnRraXBfY291bnRlcm1lYXN1cmUgaW5mb3JtYXRpb24uICovCiAJCS8qICBXaGVuIHRoZSBjb3VudGVybWVhc3VyZSBpcyB0cmlnZ2VyLCB0aGUgZHJpdmVyIGhhdmUgdG8gZGlzY29ubmVjdCB3aXRoIEFQIGZvciA2MCBzZWNvbmRzLiAqLwotCQltZW1zZXQoJmJhY2t1cF9wbWtpZFswXSwgMHgwMCwgc2l6ZW9mKHN0cnVjdCBydF9wbWtpZF9saXN0KSAqIE5VTV9QTUtJRF9DQUNIRSk7CiAJCW1lbWNweSgmYmFja3VwX3Bta2lkWzBdLCAmYWRhcHRlci0+c2VjdXJpdHlwcml2LlBNS0lETGlzdFswXSwgc2l6ZW9mKHN0cnVjdCBydF9wbWtpZF9saXN0KSAqIE5VTV9QTUtJRF9DQUNIRSk7CiAJCWJhY2t1cF9pbmRleCA9IGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5QTUtJREluZGV4OwogCQliYWNrdXBfY291bnRlciA9IGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idGtpcF9jb3VudGVybWVhc3VyZTsKQEAgLTEzMSwxNSArMTMzLDE4IEBACiAKIHZvaWQgaW5pdF9hZGRiYV9yZXRyeV90aW1lcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIsIHN0cnVjdCBzdGFfaW5mbyAqcHN0YSkKIHsKLQlfaW5pdF90aW1lcigmcHN0YS0+YWRkYmFfcmV0cnlfdGltZXIsIHBhZGFwdGVyLT5wbmV0ZGV2LCBhZGRiYV90aW1lcl9oZGwsIHBzdGEpOworCXNldHVwX3RpbWVyKCZwc3RhLT5hZGRiYV9yZXRyeV90aW1lciwgYWRkYmFfdGltZXJfaGRsLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcHN0YSk7CiB9CiAKIHZvaWQgaW5pdF9tbG1lX2V4dF90aW1lcihzdHJ1Y3QgYWRhcHRlciAqcGFkYXB0ZXIpCiB7CiAJc3RydWN0CW1sbWVfZXh0X3ByaXYgKnBtbG1lZXh0ID0gJnBhZGFwdGVyLT5tbG1lZXh0cHJpdjsKIAotCV9pbml0X3RpbWVyKCZwbWxtZWV4dC0+c3VydmV5X3RpbWVyLCBwYWRhcHRlci0+cG5ldGRldiwgc3VydmV5X3RpbWVyX2hkbCwgcGFkYXB0ZXIpOwotCV9pbml0X3RpbWVyKCZwbWxtZWV4dC0+bGlua190aW1lciwgcGFkYXB0ZXItPnBuZXRkZXYsIGxpbmtfdGltZXJfaGRsLCBwYWRhcHRlcik7CisJc2V0dXBfdGltZXIoJnBtbG1lZXh0LT5zdXJ2ZXlfdGltZXIsIHN1cnZleV90aW1lcl9oZGwsCisJCSAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7CisJc2V0dXBfdGltZXIoJnBtbG1lZXh0LT5saW5rX3RpbWVyLCBsaW5rX3RpbWVyX2hkbCwKKwkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKIH0KIAogI2lmZGVmIENPTkZJR184OEVVX0FQX01PREUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9vc19pbnRmcy5jCmluZGV4IDg4YTkwOWMuLjc1MGM4N2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL29zX2ludGZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvb3NfaW50ZnMuYwpAQCAtMzgsNyArMzgsNyBAQAogI2RlZmluZSBSVFdfTk9UQ0hfRklMVEVSIDAgLyogMDpEaXNhYmxlLCAxOkVuYWJsZSwgKi8KIAogLyogbW9kdWxlIHBhcmFtIGRlZmF1bHRzICovCi1zdGF0aWMgaW50IHJ0d19jaGlwX3ZlcnNpb24gPSAweDAwOworc3RhdGljIGludCBydHdfY2hpcF92ZXJzaW9uOwogc3RhdGljIGludCBydHdfcmZpbnRmcyA9IEhXUEk7CiBzdGF0aWMgaW50IHJ0d19sYmttb2RlOy8qIFJUTDg3MTJfQUlSX1RSWDsgKi8KIHN0YXRpYyBpbnQgcnR3X25ldHdvcmtfbW9kZSA9IE5kaXM4MDJfMTFJQlNTOy8qIE5kaXM4MDJfMTFJbmZyYXN0cnVjdHVyZTsgaW5mcmEsIGFkLWhvYywgYXV0byAqLwpAQCAtOTk4LDcgKzk5OCw4IEBACiAJfQogCXBhZGFwdGVyLT5uZXRfY2xvc2VkID0gZmFsc2U7CiAKLQlfc2V0X3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsIDIwMDApOworCW1vZF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LmR5bmFtaWNfY2hrX3RpbWVyLAorCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMDApKTsKIAogCXBhZGFwdGVyLT5wd3JjdHJscHJpdi5iaXBzX3Byb2Nlc3NpbmcgPSBmYWxzZTsKIAlydHdfc2V0X3B3cl9zdGF0ZV9jaGVja190aW1lcigmcGFkYXB0ZXItPnB3cmN0cmxwcml2KTsKQEAgLTEwNTIsNyArMTA1Myw4IEBACiAJCXBhZGFwdGVyLT5pbnRmX3N0YXJ0KHBhZGFwdGVyKTsKIAogCXJ0d19zZXRfcHdyX3N0YXRlX2NoZWNrX3RpbWVyKCZwYWRhcHRlci0+cHdyY3RybHByaXYpOwotCV9zZXRfdGltZXIoJnBhZGFwdGVyLT5tbG1lcHJpdi5keW5hbWljX2Noa190aW1lciwgNTAwMCk7CisJbW9kX3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIsCisJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwMCkpOwogCiAJIHJldHVybiBfU1VDQ0VTUzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvcmVjdl9saW51eC5jCmluZGV4IDA1NDI3YzQuLjA1NzAxMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3JlY3ZfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC9yZWN2X2xpbnV4LmMKQEAgLTE5Myw3ICsxOTMsOCBAQAogCiB2b2lkIHJ0d19pbml0X3JlY3ZfdGltZXIoc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICpwcmVvcmRlcl9jdHJsKQogewotCXN0cnVjdCBhZGFwdGVyICpwYWRhcHRlciA9IHByZW9yZGVyX2N0cmwtPnBhZGFwdGVyOwogCi0JX2luaXRfdGltZXIoJihwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwgcnR3X3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIsIHByZW9yZGVyX2N0cmwpOworCXNldHVwX3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIsCisJCSAgICBydHdfcmVvcmRlcmluZ19jdHJsX3RpbWVvdXRfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKXByZW9yZGVyX2N0cmwpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9pbnRmLmMKaW5kZXggYmVlMzljMi4uZWYzYzczZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX2ludGYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2JfaW50Zi5jCkBAIC0xNzksNyArMTc5LDcgQEAKIHsKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAoIit1c2JfaW50Zl9zdG9wXG4iKSk7CiAKLQkvKiBkaXNhYmVsX2h3X2ludGVycnVwdCAqLworCS8qIGRpc2FibGVfaHdfaW50ZXJydXB0ICovCiAJaWYgKCFwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewogCQkvKiBkZXZpY2Ugc3RpbGwgZXhpc3RzLCBzbyBkcml2ZXIgY2FuIGRvIGkvbyBvcGVyYXRpb24gKi8KIAkJLyogVE9ETzogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTg4ZXUvb3NfZGVwL3VzYl9vcHNfbGludXguYwppbmRleCA4MGU3ZWY5Li43ZTU5OWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE4OGV1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxODhldS9vc19kZXAvdXNiX29wc19saW51eC5jCkBAIC01MzAsNiArNTMwLDcgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgcmVjdl9idWYgKnByZWN2YnVmOworCiAJcHJlY3ZidWYgPSAoc3RydWN0IHJlY3ZfYnVmICopcGFkYXB0ZXItPnJlY3Zwcml2LnByZWN2X2J1ZjsKIAogCURCR184OEUoIiVzXG4iLCBfX2Z1bmNfXyk7CkBAIC01NTIsNyArNTUzLDYgQEAKIAl1MTYgaW5kZXg7CiAJdTE2IGxlbjsKIAl1OCBkYXRhOwotCWludCByZXQ7CiAKIAlyZXF1ZXN0ID0gMHgwNTsKIAlyZXF1ZXN0dHlwZSA9IDB4MDA7Lyogd3JpdGVfb3V0ICovCkBAIC01NjAsOCArNTYwLDggQEAKIAl3dmFsdWUgPSAodTE2KShhZGRyJjB4MDAwMGZmZmYpOwogCWxlbiA9IDE7CiAJZGF0YSA9IHZhbDsKLQlyZXQgPSB1c2JjdHJsX3ZlbmRvcnJlcShhZGFwdGVyLCByZXF1ZXN0LCB3dmFsdWUsIGluZGV4LCAmZGF0YSwgbGVuLCByZXF1ZXN0dHlwZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdXNiY3RybF92ZW5kb3JyZXEoYWRhcHRlciwgcmVxdWVzdCwgd3ZhbHVlLAorCQkJCSBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOwogfQogCiBpbnQgdXNiX3dyaXRlMTYoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBhZGRyLCB1MTYgdmFsKQpAQCAtNTcyLDcgKzU3Miw2IEBACiAJdTE2IGluZGV4OwogCXUxNiBsZW47CiAJX19sZTMyIGRhdGE7Ci0JaW50IHJldDsKIAogCiAJcmVxdWVzdCA9IDB4MDU7CkBAIC01ODQsMTAgKzU4MywxMCBAQAogCiAJZGF0YSA9IGNwdV90b19sZTMyKHZhbCAmIDB4MDAwMGZmZmYpOwogCi0JcmV0ID0gdXNiY3RybF92ZW5kb3JyZXEoYWRhcHRlciwgcmVxdWVzdCwgd3ZhbHVlLCBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOworCXJldHVybiB1c2JjdHJsX3ZlbmRvcnJlcShhZGFwdGVyLCByZXF1ZXN0LCB3dmFsdWUsCisJCQkJIGluZGV4LCAmZGF0YSwgbGVuLCByZXF1ZXN0dHlwZSk7CiAKIAotCXJldHVybiByZXQ7CiB9CiAKIGludCB1c2Jfd3JpdGUzMihzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciwgdTMyIGFkZHIsIHUzMiB2YWwpCkBAIC01OTgsNyArNTk3LDYgQEAKIAl1MTYgaW5kZXg7CiAJdTE2IGxlbjsKIAlfX2xlMzIgZGF0YTsKLQlpbnQgcmV0OwogCiAKIAlyZXF1ZXN0ID0gMHgwNTsKQEAgLTYwOSwxMCArNjA3LDEwIEBACiAJbGVuID0gNDsKIAlkYXRhID0gY3B1X3RvX2xlMzIodmFsKTsKIAotCXJldCA9IHVzYmN0cmxfdmVuZG9ycmVxKGFkYXB0ZXIsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsICZkYXRhLCBsZW4sIHJlcXVlc3R0eXBlKTsKKwlyZXR1cm4gdXNiY3RybF92ZW5kb3JyZXEoYWRhcHRlciwgcmVxdWVzdCwgd3ZhbHVlLAorCQkJCSBpbmRleCwgJmRhdGEsIGxlbiwgcmVxdWVzdHR5cGUpOwogCiAKLQlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCB1c2Jfd3JpdGVfcG9ydF9jb21wbGV0ZShzdHJ1Y3QgdXJiICpwdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9kb3QxMWQuaAppbmRleCBlZWVhNTAyLi5hYWQzMzk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvZG90MTFkLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL2RvdDExZC5oCkBAIC03NCwxNiArNzQsMTEgQEAKIAkoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVMZW4gPiAwKQogCiAjZGVmaW5lIElTX0VRVUFMX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpCQlcCi0JIGVxTWFjQWRkcihHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIF9fcFRhKQorCSBldGhlcl9hZGRyX2VxdWFsX3VuYWxpZ25lZChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZVNyY0FkZHIsIFwKKwlfX3BUYSkKICNkZWZpbmUgVVBEQVRFX0NJRV9TUkMoX19wSWVlZURldiwgX19wVGEpCQlcCiAJY3BNYWNBZGRyKEdFVF9ET1QxMURfSU5GTyhfX3BJZWVlRGV2KS0+Q291bnRyeUllU3JjQWRkciwgX19wVGEpCiAKLSNkZWZpbmUgSVNfQ09VTlRSWV9JRV9DSEFOR0VEKF9fcEllZWVEZXYsIF9fSWUpIFwKLQkoKChfX0llKS5MZW5ndGggPT0gMCB8fCAoX19JZSkuTGVuZ3RoICE9CVwKLQlHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUxlbikgPwlcCi0JZmFsc2UgOiAoIW1lbWNtcChHRVRfRE9UMTFEX0lORk8oX19wSWVlZURldiktPkNvdW50cnlJZUJ1ZiwJXAotCShfX0llKS5PY3RldCwgKF9fSWUpLkxlbmd0aCkpKQotCiAjZGVmaW5lIENJRV9XQVRDSERPR19USCAxCiAjZGVmaW5lIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikJCQkJXAogCSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVXYXRjaGRvZykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MFBfcnRsODI1Ni5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkwUF9ydGw4MjU2LmMKaW5kZXggMGU2YmRkMi4uMDFkMjIwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkwUF9ydGw4MjU2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkwUF9ydGw4MjU2LmMKQEAgLTQ3LDggKzQ3LDggQEAKIAkJCQkJCTB4MGUsIGJNYXNrMTJCaXRzLCAweDAyMSk7CiAKIAkJCX0gZWxzZSB7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6ICIKLQkJCQkJICJ1bmtub3duIGhhcmR3YXJlIHZlcnNpb25cbiIpOworCQkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCQkgIlBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoKTogdW5rbm93biBoYXJkd2FyZSB2ZXJzaW9uXG4iKTsKIAkJCX0KIAogCQkJYnJlYWs7CkBAIC02NiwxNSArNjYsMTYgQEAKIAkJCQkJCSAweDBlLCBiTWFzazEyQml0cywgMHgwZTEpOwogCiAJCQl9IGVsc2UgewotCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiUEhZX1NldFJGODI1NkJhbmR3aWR0aCgpOiAiCi0JCQkJCSAidW5rbm93biBoYXJkd2FyZSB2ZXJzaW9uXG4iKTsKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkJICJQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKCk6IHVua25vd24gaGFyZHdhcmUgdmVyc2lvblxuIik7CiAJCQl9CiAKIAogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9TZXRSRjgyNTZCYW5kd2lkdGgoKTogdW5rbm93biAiCi0JCQkJICJCYW5kd2lkdGg6ICUjWFxuIiwgQmFuZHdpZHRoKTsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCSAiUEhZX1NldFJGODI1NkJhbmR3aWR0aCgpOiB1bmtub3duIEJhbmR3aWR0aDogJSNYXG4iLAorCQkJCSBCYW5kd2lkdGgpOwogCQkJYnJlYWs7CiAKIAkJfQpAQCAtMTM4LDggKzEzOSw5IEBACiAJCXJ0U3RhdHVzID0gcnRsODE5Ml9waHlfY2hlY2tCQkFuZFJGKGRldiwgSFc5MF9CTE9DS19SRiwKIAkJCQkJCShlbnVtIHJmOTBfcmFkaW9fcGF0aCllUkZQYXRoKTsKIAkJaWYgKCFydFN0YXR1cykgewotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJQSFlfUkY4MjU2X0NvbmZpZygpOkNoZWNrICIKLQkJCQkgIlJhZGlvWyVkXSBGYWlsISFcbiIsIGVSRlBhdGgpOworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJICJQSFlfUkY4MjU2X0NvbmZpZygpOkNoZWNrIFJhZGlvWyVkXSBGYWlsISFcbiIsCisJCQkJIGVSRlBhdGgpOwogCQkJZ290byBwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZV9GYWlsOwogCQl9CiAKQEAgLTE1NSw5ICsxNTcsMTAgQEAKIAkJCQkJCSAoZW51bSByZjkwX3JhZGlvX3BhdGgpZVJGUGF0aCwKIAkJCQkJCSBSZWdPZmZTZXRUb0JlQ2hlY2ssCiAJCQkJCQkgYk1hc2sxMkJpdHMpOwotCQkJCVJUX1RSQUNFKENPTVBfUkYsICJSRiAlZCAlZCByZWdpc3RlciBmaW5hbCAiCi0JCQkJCSAidmFsdWU6ICV4XG4iLCBlUkZQYXRoLAotCQkJCQkgUmVnT2ZmU2V0VG9CZUNoZWNrLCBSRjNfRmluYWxfVmFsdWUpOworCQkJCVJUX1RSQUNFKENPTVBfUkYsCisJCQkJCSAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgdmFsdWU6ICV4XG4iLAorCQkJCQkgZVJGUGF0aCwgUmVnT2ZmU2V0VG9CZUNoZWNrLAorCQkJCQkgUkYzX0ZpbmFsX1ZhbHVlKTsKIAkJCQlSZXRyeVRpbWVzLS07CiAJCQl9CiAJCQlicmVhazsKQEAgLTE3MCw5ICsxNzMsMTAgQEAKIAkJCQkJCSAoZW51bSByZjkwX3JhZGlvX3BhdGgpZVJGUGF0aCwKIAkJCQkJCSBSZWdPZmZTZXRUb0JlQ2hlY2ssCiAJCQkJCQkgYk1hc2sxMkJpdHMpOwotCQkJCVJUX1RSQUNFKENPTVBfUkYsICJSRiAlZCAlZCByZWdpc3RlciBmaW5hbCAiCi0JCQkJCSAidmFsdWU6ICV4XG4iLCBlUkZQYXRoLAotCQkJCQkgIFJlZ09mZlNldFRvQmVDaGVjaywgUkYzX0ZpbmFsX1ZhbHVlKTsKKwkJCQlSVF9UUkFDRShDT01QX1JGLAorCQkJCQkgIlJGICVkICVkIHJlZ2lzdGVyIGZpbmFsIHZhbHVlOiAleFxuIiwKKwkJCQkJIGVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywKKwkJCQkJIFJGM19GaW5hbF9WYWx1ZSk7CiAJCQkJUmV0cnlUaW1lcy0tOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xODUsOSArMTg5LDEwIEBACiAJCQkJCQkoZW51bSByZjkwX3JhZGlvX3BhdGgpZVJGUGF0aCwKIAkJCQkJCVJlZ09mZlNldFRvQmVDaGVjaywKIAkJCQkJCWJNYXNrMTJCaXRzKTsKLQkJCQlSVF9UUkFDRShDT01QX1JGLCAiUkYgJWQgJWQgcmVnaXN0ZXIgZmluYWwgIgotCQkJCQkgInZhbHVlOiAleFxuIiwgZVJGUGF0aCwKLQkJCQkJIFJlZ09mZlNldFRvQmVDaGVjaywgUkYzX0ZpbmFsX1ZhbHVlKTsKKwkJCQlSVF9UUkFDRShDT01QX1JGLAorCQkJCQkgIlJGICVkICVkIHJlZ2lzdGVyIGZpbmFsIHZhbHVlOiAleFxuIiwKKwkJCQkJIGVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywKKwkJCQkJIFJGM19GaW5hbF9WYWx1ZSk7CiAJCQkJUmV0cnlUaW1lcy0tOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xOTksOSArMjA0LDEwIEBACiAJCQkJUkYzX0ZpbmFsX1ZhbHVlID0gcnRsODE5Ml9waHlfUXVlcnlSRlJlZyhkZXYsCiAJCQkJCSAgICAgICAoZW51bSByZjkwX3JhZGlvX3BhdGgpZVJGUGF0aCwKIAkJCQkJICAgICAgIFJlZ09mZlNldFRvQmVDaGVjaywgYk1hc2sxMkJpdHMpOwotCQkJCVJUX1RSQUNFKENPTVBfUkYsICJSRiAlZCAlZCByZWdpc3RlciBmaW5hbCAiCi0JCQkJCSAidmFsdWU6ICV4XG4iLCBlUkZQYXRoLAotCQkJCQkgIFJlZ09mZlNldFRvQmVDaGVjaywgUkYzX0ZpbmFsX1ZhbHVlKTsKKwkJCQlSVF9UUkFDRShDT01QX1JGLAorCQkJCQkgIlJGICVkICVkIHJlZ2lzdGVyIGZpbmFsIHZhbHVlOiAleFxuIiwKKwkJCQkJIGVSRlBhdGgsIFJlZ09mZlNldFRvQmVDaGVjaywKKwkJCQkJIFJGM19GaW5hbF9WYWx1ZSk7CiAJCQkJUmV0cnlUaW1lcy0tOwogCQkJfQogCQkJYnJlYWs7CkBAIC0yMjEsOCArMjI3LDkgQEAKIAkJfQogCiAJCWlmIChyZXQpIHsKLQkJCVJUX1RSQUNFKENPTVBfRVJSLCAicGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGUoKToiCi0JCQkJICJSYWRpb1slZF0gRmFpbCEhIiwgZVJGUGF0aCk7CisJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkgInBoeV9SRjgyNTZfQ29uZmlnX1BhcmFGaWxlKCk6UmFkaW9bJWRdIEZhaWwhISIsCisJCQkJIGVSRlBhdGgpOwogCQkJZ290byBwaHlfUkY4MjU2X0NvbmZpZ19QYXJhRmlsZV9GYWlsOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfY21kcGt0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2NtZHBrdC5jCmluZGV4IDJiMTQzMGQuLmVjZGQyZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfY21kcGt0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9jbWRwa3QuYwpAQCAtNDYsNyArNDYsNyBAQAogCiAJZG8gewogCQlpZiAoKGJ1ZmZlcl9sZW4gLSBmcmFnX29mZnNldCkgPiBmcmFnX3RocmVzaG9sZCkgewotCQkJZnJhZ19sZW5ndGggPSBmcmFnX3RocmVzaG9sZCA7CisJCQlmcmFnX2xlbmd0aCA9IGZyYWdfdGhyZXNob2xkOwogCQkJYkxhc3RJbmlQa3QgPSAwOwogCiAJCX0gZWxzZSB7CkBAIC0xNjUsNyArMTY1LDcgQEAKIAogc3RhdGljIHZvaWQgY21wa19oYW5kbGVfaW50ZXJydXB0X3N0YXR1cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqcG1zZykKIHsKLQlzdHJ1Y3QgY21wa19pbnRyX3N0YSByeF9pbnRyX3N0YXR1czsJLyogKi8KKwlzdHJ1Y3QgY21wa19pbnRyX3N0YSByeF9pbnRyX3N0YXR1czsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKIAlETUVTRygiLS0tPiBjbXBrX0hhbmRsZV9JbnRlcnJ1cHRfU3RhdHVzKClcbiIpOwpAQCAtMzMyLDQ0ICszMzIsNDQgQEAKIAogCQlzd2l0Y2ggKGVsZW1lbnRfaWQpIHsKIAkJY2FzZSBSWF9UWF9GRUVEQkFDSzoKLQkJCVJUX1RSQUNFKENPTVBfQ01EUEtULCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6IgotCQkJCSAiUlhfVFhfRkVFREJBQ0tcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsCisJCQkJICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTpSWF9UWF9GRUVEQkFDS1xuIik7CiAJCQljbXBrX2hhbmRsZV90eF9mZWVkYmFjayhkZXYsIHBjbWRfYnVmZik7CiAJCQljbWRfbGVuZ3RoID0gQ01QS19SWF9UWF9GQl9TSVpFOwogCQkJYnJlYWs7CiAJCWNhc2UgUlhfSU5URVJSVVBUX1NUQVRVUzoKLQkJCVJUX1RSQUNFKENPTVBfQ01EUEtULCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6IgotCQkJCSAiUlhfSU5URVJSVVBUX1NUQVRVU1xuIik7CisJCQlSVF9UUkFDRShDT01QX0NNRFBLVCwKKwkJCQkgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOlJYX0lOVEVSUlVQVF9TVEFUVVNcbiIpOwogCQkJY21wa19oYW5kbGVfaW50ZXJydXB0X3N0YXR1cyhkZXYsIHBjbWRfYnVmZik7CiAJCQljbWRfbGVuZ3RoID0gc2l6ZW9mKHN0cnVjdCBjbXBrX2ludHJfc3RhKTsKIAkJCWJyZWFrOwogCQljYXNlIEJPVEhfUVVFUllfQ09ORklHOgotCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKToiCi0JCQkJICJCT1RIX1FVRVJZX0NPTkZJR1xuIik7CisJCQlSVF9UUkFDRShDT01QX0NNRFBLVCwKKwkJCQkgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOkJPVEhfUVVFUllfQ09ORklHXG4iKTsKIAkJCWNtcGtfaGFuZGxlX3F1ZXJ5X2NvbmZpZ19yeChkZXYsIHBjbWRfYnVmZik7CiAJCQljbWRfbGVuZ3RoID0gQ01QS19CT1RIX1FVRVJZX0NPTkZJR19TSVpFOwogCQkJYnJlYWs7CiAJCWNhc2UgUlhfVFhfU1RBVFVTOgotCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKToiCi0JCQkJICJSWF9UWF9TVEFUVVNcbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsCisJCQkJICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKTpSWF9UWF9TVEFUVVNcbiIpOwogCQkJY21wa19oYW5kbGVfdHhfc3RhdHVzKGRldiwgcGNtZF9idWZmKTsKIAkJCWNtZF9sZW5ndGggPSBDTVBLX1JYX1RYX1NUU19TSVpFOwogCQkJYnJlYWs7CiAJCWNhc2UgUlhfVFhfUEVSX1BLVF9GRUVEQkFDSzoKLQkJCVJUX1RSQUNFKENPTVBfQ01EUEtULCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6IgotCQkJCSAiUlhfVFhfUEVSX1BLVF9GRUVEQkFDS1xuIik7CisJCQlSVF9UUkFDRShDT01QX0NNRFBLVCwKKwkJCQkgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOlJYX1RYX1BFUl9QS1RfRkVFREJBQ0tcbiIpOwogCQkJY21kX2xlbmd0aCA9IENNUEtfUlhfVFhfRkJfU0laRTsKIAkJCWJyZWFrOwogCQljYXNlIFJYX1RYX1JBVEVfSElTVE9SWToKLQkJCVJUX1RSQUNFKENPTVBfQ01EUEtULCAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6IgotCQkJCSAiUlhfVFhfSElTVE9SWVxuIik7CisJCQlSVF9UUkFDRShDT01QX0NNRFBLVCwKKwkJCQkgIi0tLS0+Y21wa19tZXNzYWdlX2hhbmRsZV9yeCgpOlJYX1RYX0hJU1RPUllcbiIpOwogCQkJY21wa19oYW5kbGVfdHhfcmF0ZV9oaXN0b3J5KGRldiwgcGNtZF9idWZmKTsKIAkJCWNtZF9sZW5ndGggPSBDTVBLX1RYX1JBSElTX1NJWkU7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAotCQkJUlRfVFJBQ0UoQ09NUF9DTURQS1QsICItLS0tPmNtcGtfbWVzc2FnZV9oYW5kbGVfcngoKToiCi0JCQkJICJ1bmtub3duIENNRCBFbGVtZW50XG4iKTsKKwkJCVJUX1RSQUNFKENPTVBfQ01EUEtULAorCQkJCSAiLS0tLT5jbXBrX21lc3NhZ2VfaGFuZGxlX3J4KCk6dW5rbm93biBDTUQgRWxlbWVudFxuIik7CiAJCQlyZXR1cm4gMTsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2NtZHBrdC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9jbWRwa3QuaAppbmRleCAyMzIxOWUxLi4yNjkzNjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2NtZHBrdC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfY21kcGt0LmgKQEAgLTMzLDI4ICszMywyOCBAQAogc3RydWN0IGNtcGtfdHhmYiB7CiAJdTgJZWxlbWVudF9pZDsKIAl1OAlsZW5ndGg7Ci0JdTgJVElEOjQ7CQkJCS8qICovCi0JdTgJZmFpbF9yZWFzb246MzsJCS8qICovCisJdTgJVElEOjQ7CisJdTgJZmFpbF9yZWFzb246MzsKIAl1OAl0b2s6MTsKLQl1OAlyZXNlcnZlMTo0OwkJCS8qICovCi0JdTgJcGt0X3R5cGU6MjsJCS8qICovCi0JdTgJYmFuZHdpZHRoOjE7CQkvKiAqLwotCXU4CXFvc19wa3Q6MTsJCQkvKiAqLworCXU4CXJlc2VydmUxOjQ7CisJdTgJcGt0X3R5cGU6MjsKKwl1OAliYW5kd2lkdGg6MTsKKwl1OAlxb3NfcGt0OjE7CiAKLQl1OAlyZXNlcnZlMjsJCQkvKiAqLwotCXU4CXJldHJ5X2NudDsJCQkvKiAqLwotCXUxNglwa3RfaWQ7CQkJCS8qICovCisJdTgJcmVzZXJ2ZTI7CisJdTgJcmV0cnlfY250OworCXUxNglwa3RfaWQ7CiAKLQl1MTYJc2VxX251bTsJCQkvKiAqLworCXUxNglzZXFfbnVtOwogCXU4CXNfcmF0ZTsKIAl1OAlmX3JhdGU7CiAKLQl1OAlzX3J0c19yYXRlOwkJCS8qICovCi0JdTgJZl9ydHNfcmF0ZTsJCQkvKiAqLwotCXUxNglwa3RfbGVuZ3RoOwkJCS8qICovCisJdTgJc19ydHNfcmF0ZTsKKwl1OAlmX3J0c19yYXRlOworCXUxNglwa3RfbGVuZ3RoOwogCi0JdTE2CXJlc2VydmUzOwkJCS8qICovCi0JdTE2CWR1cmF0aW9uOwkJCS8qICovCisJdTE2CXJlc2VydmUzOworCXUxNglkdXJhdGlvbjsKIH07CiAKIHN0cnVjdCBjbXBrX2ludHJfc3RhIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfZGV2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2Rldi5jCmluZGV4IDU1MmQ5NDMuLjI4Njk2MDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfZGV2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9kZXYuYwpAQCAtMjI0LDggKzIyNCw4IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiU2V0SHdSZWc4MTg1KCk6IGludmFsaWQgQUNJOiAlZCAhXG4iLAotCQkJICAgICAgIGVBQ0kpOworCQkJbmV0ZGV2X2luZm8oZGV2LCAiU2V0SHdSZWc4MTg1KCk6IGludmFsaWQgQUNJOiAlZCAhXG4iLAorCQkJCSAgICBlQUNJKTsKIAkJCWJyZWFrOwogCQl9CiAJCXByaXYtPnJ0bGxpYi0+U2V0SHdSZWdIYW5kbGVyKGRldiwgSFdfVkFSX0FDTV9DVFJMLApAQCAtMjYzLDkgKzI2Myw5IEBACiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6Ci0JCQkJUlRfVFJBQ0UoQ09NUF9RT1MsICJTZXRId1JlZzgxODUoKTogW0hXX1ZBUl8iCi0JCQkJCSAiQUNNX0NUUkxdIGFjbSBzZXQgZmFpbGVkOiBlQUNJIGlzICIKLQkJCQkJICIlZFxuIiwgZUFDSSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9RT1MsCisJCQkJCSAiU2V0SHdSZWc4MTg1KCk6IFtIV19WQVJfQUNNX0NUUkxdIGFjbSBzZXQgZmFpbGVkOiBlQUNJIGlzICVkXG4iLAorCQkJCQkgZUFDSSk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0yODcsOCArMjg3LDkgQEAKIAkJCX0KIAkJfQogCi0JCVJUX1RSQUNFKENPTVBfUU9TLCAiU2V0SHdSZWc4MTkwcGNpKCk6IFtIV19WQVJfQUNNX0NUUkxdIFdyaXRlIgotCQkJICIgMHglWFxuIiwgQWNtQ3RybCk7CisJCVJUX1RSQUNFKENPTVBfUU9TLAorCQkJICJTZXRId1JlZzgxOTBwY2koKTogW0hXX1ZBUl9BQ01fQ1RSTF0gV3JpdGUgMHglWFxuIiwKKwkJCSBBY21DdHJsKTsKIAkJd3JpdGVfbmljX2J5dGUoZGV2LCBBY21Id0N0cmwsIEFjbUN0cmwpOwogCQlicmVhazsKIAl9CkBAIC0zMzQsMTcgKzMzNSwxNyBAQAogCX0KIAogCWlmICghcHJpdi0+QXV0b2xvYWRGYWlsRmxhZykgewotCQlwcml2LT5lZXByb21fdmlkID0gZXByb21fcmVhZChkZXYsIChFRVBST01fVklEID4+IDEpKTsKLQkJcHJpdi0+ZWVwcm9tX2RpZCA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX0RJRCA+PiAxKSk7CisJCXByaXYtPmVlcHJvbV92aWQgPSBlcHJvbV9yZWFkKGRldiwgRUVQUk9NX1ZJRCA+PiAxKTsKKwkJcHJpdi0+ZWVwcm9tX2RpZCA9IGVwcm9tX3JlYWQoZGV2LCBFRVBST01fRElEID4+IDEpOwogCiAJCXVzVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKHUxNikoRUVQUk9NX0N1c3RvbWVyX0lEPj4xKSkgPj4gODsKIAkJcHJpdi0+ZWVwcm9tX0N1c3RvbWVySUQgPSAodTgpKHVzVmFsdWUgJiAweGZmKTsKLQkJdXNWYWx1ZSA9IGVwcm9tX3JlYWQoZGV2LCAoRUVQUk9NX0lDVmVyc2lvbl9DaGFubmVsUGxhbj4+MSkpOworCQl1c1ZhbHVlID0gZXByb21fcmVhZChkZXYsIEVFUFJPTV9JQ1ZlcnNpb25fQ2hhbm5lbFBsYW4+PjEpOwogCQlwcml2LT5lZXByb21fQ2hhbm5lbFBsYW4gPSB1c1ZhbHVlJjB4ZmY7Ci0JCUlDX1ZlcnNpb24gPSAoKHVzVmFsdWUmMHhmZjAwKT4+OCk7CisJCUlDX1ZlcnNpb24gPSAodXNWYWx1ZSAmIDB4ZmYwMCk+Pjg7CiAKIAkJSUNWZXI4MTkyID0gKElDX1ZlcnNpb24mMHhmKTsKLQkJSUNWZXI4MjU2ID0gKChJQ19WZXJzaW9uJjB4ZjApPj40KTsKKwkJSUNWZXI4MjU2ID0gKElDX1ZlcnNpb24gJiAweGYwKT4+NDsKIAkJUlRfVFJBQ0UoQ09NUF9JTklULCAiXG5JQ1ZlcjgxOTIgPSAweCV4XG4iLCBJQ1ZlcjgxOTIpOwogCQlSVF9UUkFDRShDT01QX0lOSVQsICJcbklDVmVyODI1NiA9IDB4JXhcbiIsIElDVmVyODI1Nik7CiAJCWlmIChJQ1ZlcjgxOTIgPT0gMHgyKSB7CkBAIC00MjQsNyArNDI1LDcgQEAKIAkJaWYgKHByaXYtPmVwcm9tdHlwZSA9PSBFRVBST01fOTNDNDYpIHsKIAkJCWlmICghcHJpdi0+QXV0b2xvYWRGYWlsRmxhZykgewogCQkJCXVzVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwKLQkJCQkJICAoRUVQUk9NX1R4UHdEaWZmX0NyeXN0YWxDYXAgPj4gMSkpOworCQkJCQkgIEVFUFJPTV9UeFB3RGlmZl9DcnlzdGFsQ2FwID4+IDEpOwogCQkJCXByaXYtPkVFUFJPTUFudFB3RGlmZiA9ICh1c1ZhbHVlJjB4MGZmZik7CiAJCQkJcHJpdi0+RUVQUk9NQ3J5c3RhbENhcCA9ICh1OCkoKHVzVmFsdWUgJiAweGYwMDApCiAJCQkJCQkJID4+IDEyKTsKQEAgLTQ0OCwxMiArNDQ5LDEyIEBACiAJCQkJCXVzVmFsdWUgPSBFRVBST01fRGVmYXVsdF9UeFBvd2VyOwogCQkJCSooKHUxNiAqKSgmcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLW2ldKSkgPQogCQkJCQkJCQkgdXNWYWx1ZTsKLQkJCQlSVF9UUkFDRShDT01QX0lOSVQsICJDQ0sgVHggUG93ZXIgTGV2ZWwsIEluZGV4IgotCQkJCQkgIiAlZCA9IDB4JTAyeFxuIiwgaSwKLQkJCQkJIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS1tpXSk7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiQ0NLIFR4IFBvd2VyIExldmVsLCBJbmRleCIKLQkJCQkJICIgJWQgPSAweCUwMnhcbiIsIGkrMSwKLQkJCQkJIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS1tpKzFdKTsKKwkJCQlSVF9UUkFDRShDT01QX0lOSVQsCisJCQkJCSAiQ0NLIFR4IFBvd2VyIExldmVsLCBJbmRleCAlZCA9IDB4JTAyeFxuIiwKKwkJCQkJIGksIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS1tpXSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULAorCQkJCQkgIkNDSyBUeCBQb3dlciBMZXZlbCwgSW5kZXggJWQgPSAweCUwMnhcbiIsCisJCQkJCSBpKzEsIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbENDS1tpKzFdKTsKIAkJCX0KIAkJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSArPSAyKSB7CiAJCQkJaWYgKCFwcml2LT5BdXRvbG9hZEZhaWxGbGFnKQpAQCAtNDY0LDExICs0NjUsMTIgQEAKIAkJCQkJdXNWYWx1ZSA9IEVFUFJPTV9EZWZhdWx0X1R4UG93ZXI7CiAJCQkJKigodTE2ICopKCZwcml2LT5FRVBST01UeFBvd2VyTGV2ZWxPRkRNMjRHW2ldKSkKIAkJCQkJCQkgPSB1c1ZhbHVlOwotCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgIk9GRE0gMi40RyBUeCBQb3dlciBMZXZlbCwiCi0JCQkJCSAiIEluZGV4ICVkID0gMHglMDJ4XG4iLCBpLAotCQkJCQkgcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1tpXSk7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiT0ZETSAyLjRHIFR4IFBvd2VyIExldmVsLCIKLQkJCQkJICIgSW5kZXggJWQgPSAweCUwMnhcbiIsIGkgKyAxLAorCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwKKwkJCQkJICJPRkRNIDIuNEcgVHggUG93ZXIgTGV2ZWwsIEluZGV4ICVkID0gMHglMDJ4XG4iLAorCQkJCQkgaSwgcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1tpXSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULAorCQkJCQkgIk9GRE0gMi40RyBUeCBQb3dlciBMZXZlbCwgSW5kZXggJWQgPSAweCUwMnhcbiIsCisJCQkJCSBpICsgMSwKIAkJCQkJIHByaXYtPkVFUFJPTVR4UG93ZXJMZXZlbE9GRE0yNEdbaSsxXSk7CiAJCQl9CiAJCX0KQEAgLTQ4MywxNSArNDg1LDE1IEBACiAJCQkJCSBwcml2LT5FRVBST01MZWdhY3lIVFR4UG93ZXJEaWZmOwogCQkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzBdID0gKHByaXYtPkVFUFJPTUFudFB3RGlmZiAmCiAJCQkJCQkgICAgMHhmKTsKLQkJCXByaXYtPkFudGVubmFUeFB3RGlmZlsxXSA9ICgocHJpdi0+RUVQUk9NQW50UHdEaWZmICYKLQkJCQkJCSAgICAweGYwKT4+NCk7Ci0JCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMl0gPSAoKHByaXYtPkVFUFJPTUFudFB3RGlmZiAmCi0JCQkJCQkgICAgMHhmMDApPj44KTsKKwkJCXByaXYtPkFudGVubmFUeFB3RGlmZlsxXSA9IChwcml2LT5FRVBST01BbnRQd0RpZmYgJgorCQkJCQkJCTB4ZjApID4+IDQ7CisJCQlwcml2LT5BbnRlbm5hVHhQd0RpZmZbMl0gPSAocHJpdi0+RUVQUk9NQW50UHdEaWZmICYKKwkJCQkJCQkweGYwMCkgPj4gODsKIAkJCXByaXYtPkNyeXN0YWxDYXAgPSBwcml2LT5FRVBST01DcnlzdGFsQ2FwOwogCQkJcHJpdi0+VGhlcm1hbE1ldGVyWzBdID0gKHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciAmCiAJCQkJCQkgMHhmKTsKLQkJCXByaXYtPlRoZXJtYWxNZXRlclsxXSA9ICgocHJpdi0+RUVQUk9NVGhlcm1hbE1ldGVyICYKLQkJCQkJCSAweGYwKT4+NCk7CisJCQlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSAocHJpdi0+RUVQUk9NVGhlcm1hbE1ldGVyICYKKwkJCQkJCSAgICAgMHhmMCkgPj4gNDsKIAkJfSBlbHNlIGlmIChwcml2LT5lcHJvbXR5cGUgPT0gRUVQUk9NXzkzQzU2KSB7CiAKIAkJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKQEAgLTUyNSwyMSArNTI3LDIxIEBACiAJCQkJCSBwcml2LT5FRVBST01SZkNPZmRtQ2hubFR4UHdMZXZlbFsyXTsKIAkJCX0KIAkJCWZvciAoaSA9IDA7IGkgPCAxNDsgaSsrKQotCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwgInByaXYtPlR4UG93ZXJMZXZlbENDS19BIgotCQkJCQkgIlslZF0gPSAweCV4XG4iLCBpLAotCQkJCQkgcHJpdi0+VHhQb3dlckxldmVsQ0NLX0FbaV0pOworCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwKKwkJCQkJICJwcml2LT5UeFBvd2VyTGV2ZWxDQ0tfQVslZF0gPSAweCV4XG4iLAorCQkJCQkgaSwgcHJpdi0+VHhQb3dlckxldmVsQ0NLX0FbaV0pOwogCQkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCi0JCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAicHJpdi0+VHhQb3dlckxldmVsT0ZETSIKLQkJCQkJICIyNEdfQVslZF0gPSAweCV4XG4iLCBpLAotCQkJCQkgcHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19BW2ldKTsKKwkJCQlSVF9UUkFDRShDT01QX0lOSVQsCisJCQkJCSAicHJpdi0+VHhQb3dlckxldmVsT0ZETTI0R19BWyVkXSA9IDB4JXhcbiIsCisJCQkJCSBpLCBwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHX0FbaV0pOwogCQkJZm9yIChpID0gMDsgaSA8IDE0OyBpKyspCi0JCQkJUlRfVFJBQ0UoQ09NUF9JTklULCAicHJpdi0+VHhQb3dlckxldmVsQ0NLX0MiCi0JCQkJCSAiWyVkXSA9IDB4JXhcbiIsIGksCi0JCQkJCSBwcml2LT5UeFBvd2VyTGV2ZWxDQ0tfQ1tpXSk7CisJCQkJUlRfVFJBQ0UoQ09NUF9JTklULAorCQkJCQkgInByaXYtPlR4UG93ZXJMZXZlbENDS19DWyVkXSA9IDB4JXhcbiIsCisJCQkJCSBpLCBwcml2LT5UeFBvd2VyTGV2ZWxDQ0tfQ1tpXSk7CiAJCQlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKLQkJCQlSVF9UUkFDRShDT01QX0lOSVQsICJwcml2LT5UeFBvd2VyTGV2ZWxPRkRNIgotCQkJCQkgIjI0R19DWyVkXSA9IDB4JXhcbiIsIGksCi0JCQkJCSBwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHX0NbaV0pOworCQkJCVJUX1RSQUNFKENPTVBfSU5JVCwKKwkJCQkJICJwcml2LT5UeFBvd2VyTGV2ZWxPRkRNMjRHX0NbJWRdID0gMHgleFxuIiwKKwkJCQkJIGksIHByaXYtPlR4UG93ZXJMZXZlbE9GRE0yNEdfQ1tpXSk7CiAJCQlwcml2LT5MZWdhY3lIVFR4UG93ZXJEaWZmID0KIAkJCQkgcHJpdi0+RUVQUk9NTGVnYWN5SFRUeFBvd2VyRGlmZjsKIAkJCXByaXYtPkFudGVubmFUeFB3RGlmZlswXSA9IDA7CkBAIC01NDgsOCArNTUwLDggQEAKIAkJCXByaXYtPkNyeXN0YWxDYXAgPSBwcml2LT5FRVBST01DcnlzdGFsQ2FwOwogCQkJcHJpdi0+VGhlcm1hbE1ldGVyWzBdID0gKHByaXYtPkVFUFJPTVRoZXJtYWxNZXRlciAmCiAJCQkJCQkgMHhmKTsKLQkJCXByaXYtPlRoZXJtYWxNZXRlclsxXSA9ICgocHJpdi0+RUVQUk9NVGhlcm1hbE1ldGVyICYKLQkJCQkJCSAweGYwKT4+NCk7CisJCQlwcml2LT5UaGVybWFsTWV0ZXJbMV0gPSAocHJpdi0+RUVQUk9NVGhlcm1hbE1ldGVyICYKKwkJCQkJCSAgICAgMHhmMCkgPj4gNDsKIAkJfQogCX0KIApAQCAtNzM1LDggKzczNyw5IEBACiAJZWxzZSBpZiAocHJpdi0+cEZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPT0gRldfU1RBVFVTXzVfUkVBRFkpCiAJCXVsUmVnUmVhZCB8PSBDUFVfR0VOX0ZJUk1XQVJFX1JFU0VUOwogCWVsc2UKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJFUlJPUiBpbiAlcygpOiB1bmRlZmluZWQgZmlybXdhcmUgc3RhdGUoJWQpIgotCQkJICJcbiIsIF9fZnVuY19fLCAgIHByaXYtPnBGaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzKTsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkgIkVSUk9SIGluICVzKCk6IHVuZGVmaW5lZCBmaXJtd2FyZSBzdGF0ZSglZClcbiIsCisJCQkgX19mdW5jX18sICAgcHJpdi0+cEZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMpOwogCiAJd3JpdGVfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgdWxSZWdSZWFkKTsKIApAQCAtNzY2LDggKzc2OSw4IEBACiAJCWVsc2UgaWYgKHByaXYtPkxvb3BiYWNrTW9kZSA9PSBSVEw4MTlYX01BQ19MT09QQkFDSykKIAkJCXVsUmVnUmVhZCB8PSBDUFVfQ0NLX0xPT1BCQUNLOwogCQllbHNlCi0JCQlSVF9UUkFDRShDT01QX0VSUiwgIlNlcmlvdXMgZXJyb3I6IHdyb25nIGxvb3BiYWNrIgotCQkJCSAiIG1vZGUgc2V0dGluZ1xuIik7CisJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkgIlNlcmlvdXMgZXJyb3I6IHdyb25nIGxvb3BiYWNrIG1vZGUgc2V0dGluZ1xuIik7CiAKIAkJd3JpdGVfbmljX2R3b3JkKGRldiwgQ1BVX0dFTiwgdWxSZWdSZWFkKTsKIApAQCAtODgzLDE1ICs4ODYsMTUgQEAKIAkJCSAgX19mdW5jX18pOwogCQlNZ250QWN0U2V0X1JGX1N0YXRlKGRldiwgZVJmT2ZmLCBSRl9DSEFOR0VfQllfU1csIHRydWUpOwogCX0gZWxzZSBpZiAocHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbiA+IFJGX0NIQU5HRV9CWV9QUykgewotCQlSVF9UUkFDRSgoQ09NUF9JTklUfENPTVBfUkZ8Q09NUF9QT1dFUiksICIlcygpOiBUdXJuIG9mZiBSRiBmb3IiCi0JCQkgIiBSZk9mZlJlYXNvbiglZCkgLS0tLS0tLS0tLVxuIiwgX19mdW5jX18sCi0JCQkgcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbik7CisJCVJUX1RSQUNFKChDT01QX0lOSVR8Q09NUF9SRnxDT01QX1BPV0VSKSwKKwkJCSAiJXMoKTogVHVybiBvZmYgUkYgZm9yIFJmT2ZmUmVhc29uKCVkKSAtLS0tLS0tLS0tXG4iLAorCQkJIF9fZnVuY19fLCBwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uKTsKIAkJTWdudEFjdFNldF9SRl9TdGF0ZShkZXYsIGVSZk9mZiwgcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbiwKIAkJCQkgICAgdHJ1ZSk7CiAJfSBlbHNlIGlmIChwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uID49IFJGX0NIQU5HRV9CWV9JUFMpIHsKLQkJUlRfVFJBQ0UoKENPTVBfSU5JVHxDT01QX1JGfENPTVBfUE9XRVIpLCAiJXMoKTogVHVybiBvZmYgUkYgZm9yIgotCQkJICIgUmZPZmZSZWFzb24oJWQpIC0tLS0tLS0tLS1cbiIsIF9fZnVuY19fLAotCQkJIHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24pOworCQlSVF9UUkFDRSgoQ09NUF9JTklUfENPTVBfUkZ8Q09NUF9QT1dFUiksCisJCQkgIiVzKCk6IFR1cm4gb2ZmIFJGIGZvciBSZk9mZlJlYXNvbiglZCkgLS0tLS0tLS0tLVxuIiwKKwkJCSBfX2Z1bmNfXywgcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbik7CiAJCU1nbnRBY3RTZXRfUkZfU3RhdGUoZGV2LCBlUmZPZmYsIHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24sCiAJCQkJICAgIHRydWUpOwogCX0gZWxzZSB7CkBAIC05MzksMTcgKzk0MiwxNyBAQAogCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlID0gMDsKIAkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPQogCQkJCSAgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl8yME1kZWZhdWx0OwotCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPnJmYV90eHBvd2VyIgotCQkJCSAidHJhY2tpbmdpbmRleF9pbml0aWFsID0gJWRcbiIsCisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJCSAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X2luaXRpYWwgPSAlZFxuIiwKIAkJCQkgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKLQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5yZmFfdHhwb3dlciIKLQkJCQkgInRyYWNraW5naW5kZXhfcmVhbF9faW5pdGlhbCA9ICVkXG4iLAorCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkgInByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsX19pbml0aWFsID0gJWRcbiIsCiAJCQkJIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKTsKLQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJwcml2LT5DQ0tQcmVzZW50IgotCQkJCSAiQXR0ZW50dWF0aW9uX2RpZmZlcmVuY2VfaW5pdGlhbCA9ICVkXG4iLAorCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkgInByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZV9pbml0aWFsID0gJWRcbiIsCiAJCQkJICBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UpOwotCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPkNDS1ByZXNlbnQiCi0JCQkJICJBdHRlbnR1YXRpb25faW5pdGlhbCA9ICVkXG4iLAorCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywKKwkJCQkgInByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25faW5pdGlhbCA9ICVkXG4iLAogCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKIAkJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gZmFsc2U7CiAJCX0KQEAgLTExNjksOCArMTE3Miw5IEBACiAJCVF1ZXVlU2VsZWN0ID0gUVNMVF9ISUdIOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlSVF9UUkFDRShDT01QX0VSUiwgIlRyYW5zbWl0VENCKCk6IEltcG9zc2libGUgUXVldWUgU2VsZWN0aW9uOiIKLQkJCSAiICVkXG4iLCBRdWV1ZUlEKTsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkgIlRyYW5zbWl0VENCKCk6IEltcG9zc2libGUgUXVldWUgU2VsZWN0aW9uOiAlZFxuIiwKKwkJCSBRdWV1ZUlEKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiBRdWV1ZVNlbGVjdDsKQEAgLTEzNjEsOSArMTM2NSwxMCBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCVJUX1RSQUNFKENPTVBfUkVDViwgIkh3UmF0ZVRvTVJhdGU5MCgpOiBOb24gc3VwcG9ydGVkIgotCQkJCSAiUmF0ZSBbJXhdLCBiSXNIVCA9ICVkISEhXG4iLCByYXRlLCBiSXNIVCk7Ci0JCQkJCQkgIGJyZWFrOworCQkJUlRfVFJBQ0UoQ09NUF9SRUNWLAorCQkJCSAiSHdSYXRlVG9NUmF0ZTkwKCk6IE5vbiBzdXBwb3J0ZWRSYXRlIFsleF0sIGJJc0hUID0gJWQhISFcbiIsCisJCQkJIHJhdGUsIGJJc0hUKTsKKwkJCWJyZWFrOwogCQl9CiAKIAl9IGVsc2UgewpAQCAtMTQyMSw4ICsxNDI2LDkgQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlSVF9UUkFDRShDT01QX1JFQ1YsICJId1JhdGVUb01SYXRlOTAoKTogTm9uIHN1cHBvcnRlZCAiCi0JCQkJICJSYXRlIFsleF0sIGJJc0hUID0gJWQhISFcbiIsIHJhdGUsIGJJc0hUKTsKKwkJCVJUX1RSQUNFKENPTVBfUkVDViwKKwkJCQkgIkh3UmF0ZVRvTVJhdGU5MCgpOiBOb24gc3VwcG9ydGVkIFJhdGUgWyV4XSwgYklzSFQgPSAlZCEhIVxuIiwKKwkJCQkgcmF0ZSwgYklzSFQpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xNTI3LDcgKzE1MzMsNyBAQAogCQlwcml2LT5zdGF0cy5udW1xcnlfcGh5c3RhdHVzQ0NLKys7CiAJCWlmICghcmVnODI0X2JpdDkpIHsKIAkJCXJlcG9ydCA9IHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4YzA7Ci0JCQlyZXBvcnQgPSByZXBvcnQ+PjY7CisJCQlyZXBvcnQgPj49IDY7CiAJCQlzd2l0Y2ggKHJlcG9ydCkgewogCQkJY2FzZSAweDM6CiAJCQkJcnhfcHdyX2FsbCA9IC0zNSAtIChwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJgpAQCAtMTU0Nyw3ICsxNTUzLDcgQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCXJlcG9ydCA9IHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4NjA7Ci0JCQlyZXBvcnQgPSByZXBvcnQ+PjU7CisJCQlyZXBvcnQgPj49IDU7CiAJCQlzd2l0Y2ggKHJlcG9ydCkgewogCQkJY2FzZSAweDM6CiAJCQkJcnhfcHdyX2FsbCA9IC0zNSAtCkBAIC0xNzM3LDggKzE3NDMsOCBAQAogCQkJaWYgKCFydGw4MTkyX3BoeV9DaGVja0lzTGVnYWxSRlBhdGgocHJpdi0+cnRsbGliLT5kZXYsCiAJCQkgICAgcmZwYXRoKSkKIAkJCQljb250aW51ZTsKLQkJCVJUX1RSQUNFKENPTVBfREJHLCAiSmFja2VuIC0+IHBQcmV2aW91c3N0YXRzLT5SeE1JTU8iCi0JCQkJICJTaWduYWxTdHJlbmd0aFtyZnBhdGhdICA9ICVkXG4iLAorCQkJUlRfVFJBQ0UoQ09NUF9EQkcsCisJCQkJICJKYWNrZW4gLT4gcFByZXZpb3Vzc3RhdHMtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW3JmcGF0aF0gID0gJWRcbiIsCiAJCQkJIHByZXZfc3QtPlJ4TUlNT1NpZ25hbFN0cmVuZ3RoW3JmcGF0aF0pOwogCQkJaWYgKHByaXYtPnN0YXRzLnJ4X3Jzc2lfcGVyY2VudGFnZVtyZnBhdGhdID09IDApIHsKIAkJCQlwcml2LT5zdGF0cy5yeF9yc3NpX3BlcmNlbnRhZ2VbcmZwYXRoXSA9CkBAIC0xNzYxLDggKzE3NjcsOCBAQAogCQkJCSAgIChwcmV2X3N0LT5SeE1JTU9TaWduYWxTdHJlbmd0aFtyZnBhdGhdKSkgLwogCQkJCSAgIChSWF9TTU9PVEgpOwogCQkJfQotCQkJUlRfVFJBQ0UoQ09NUF9EQkcsICJKYWNrZW4gLT4gcHJpdi0+UnhTdGF0cy5SeFJTU0kiCi0JCQkJICJQZXJjZW50YWdlW3JmUGF0aF0gID0gJWRcbiIsCisJCQlSVF9UUkFDRShDT01QX0RCRywKKwkJCQkgIkphY2tlbiAtPiBwcml2LT5SeFN0YXRzLlJ4UlNTSVBlcmNlbnRhZ2VbcmZQYXRoXSAgPSAlZFxuIiwKIAkJCQkgcHJpdi0+c3RhdHMucnhfcnNzaV9wZXJjZW50YWdlW3JmcGF0aF0pOwogCQl9CiAJfQpAQCAtMjAxOSw2ICsyMDI1LDcgQEAKIAkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOworCXN0cnVjdCByeF9md2luZm8gKnBEcnZJbmZvID0gTlVMTDsKIAogCXN0YXRzLT5iSUNWID0gcGRlc2MtPklDVjsKIAlzdGF0cy0+YkNSQyA9IHBkZXNjLT5DUkMzMjsKQEAgLTIwNDAsNTEgKzIwNDcsNDkgQEAKIAkJCQlwcml2LT5zdGF0cy5yeGNyY2Vycm1pZCsrOwogCQl9CiAJCXJldHVybiBmYWxzZTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgcnhfZndpbmZvICpwRHJ2SW5mbyA9IE5VTEw7Ci0KLQkJc3RhdHMtPlJ4RHJ2SW5mb1NpemUgPSBwZGVzYy0+UnhEcnZJbmZvU2l6ZTsKLQkJc3RhdHMtPlJ4QnVmU2hpZnQgPSAoKHBkZXNjLT5TaGlmdCkmMHgwMyk7Ci0JCXN0YXRzLT5EZWNyeXB0ZWQgPSAhcGRlc2MtPlNXRGVjOwotCi0JCXBEcnZJbmZvID0gKHN0cnVjdCByeF9md2luZm8gKikoc2tiLT5kYXRhICsgc3RhdHMtPlJ4QnVmU2hpZnQpOwotCi0JCXN0YXRzLT5yYXRlID0gSHdSYXRlVG9NUmF0ZTkwKChib29sKXBEcnZJbmZvLT5SeEhULAotCQkJCQkgICAgICh1OClwRHJ2SW5mby0+UnhSYXRlKTsKLQkJc3RhdHMtPmJTaG9ydFByZWFtYmxlID0gcERydkluZm8tPlNQTENQOwotCi0JCXJ0bDgxOTJfVXBkYXRlUmVjZWl2ZWRSYXRlSGlzdG9ncmFtU3RhdGlzdGljcyhkZXYsIHN0YXRzKTsKLQotCQlzdGF0cy0+YklzQU1QRFUgPSAocERydkluZm8tPlBhcnRBZ2dyID09IDEpOwotCQlzdGF0cy0+YkZpcnN0TVBEVSA9IChwRHJ2SW5mby0+UGFydEFnZ3IgPT0gMSkgJiYKLQkJCQkgICAgKHBEcnZJbmZvLT5GaXJzdEFHR1IgPT0gMSk7Ci0KLQkJc3RhdHMtPlRpbWVTdGFtcExvdyA9IHBEcnZJbmZvLT5UU0ZMOwotCQlzdGF0cy0+VGltZVN0YW1wSGlnaCA9IHJlYWRfbmljX2R3b3JkKGRldiwgVFNGUis0KTsKLQotCQlydGw4MTl4X1VwZGF0ZVJ4UGt0VGltZVN0YW1wKGRldiwgc3RhdHMpOwotCi0JCWlmICgoc3RhdHMtPlJ4QnVmU2hpZnQgKyBzdGF0cy0+UnhEcnZJbmZvU2l6ZSkgPiAwKQotCQkJc3RhdHMtPmJTaGlmdCA9IDE7Ci0KLQkJc3RhdHMtPlJ4SXM0ME1IelBhY2tldCA9IHBEcnZJbmZvLT5CVzsKLQotCQlydGw4MTkyX1RyYW5zbGF0ZVJ4U2lnbmFsU3R1ZmYoZGV2LCBza2IsIHN0YXRzLCBwZGVzYywKLQkJCQkJICAgICAgIHBEcnZJbmZvKTsKLQotCQlpZiAocERydkluZm8tPkZpcnN0QUdHUiA9PSAxIHx8IHBEcnZJbmZvLT5QYXJ0QWdnciA9PSAxKQotCQkJUlRfVFJBQ0UoQ09NUF9SWERFU0MsICJwRHJ2SW5mby0+Rmlyc3RBR0dSID0gJWQsIgotCQkJCSAiIHBEcnZJbmZvLT5QYXJ0QWdnciA9ICVkXG4iLAotCQkJCSBwRHJ2SW5mby0+Rmlyc3RBR0dSLCBwRHJ2SW5mby0+UGFydEFnZ3IpOwotCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNC8qc0NyY0xuZyovKTsKLQotCi0JCXN0YXRzLT5wYWNrZXRsZW5ndGggPSBzdGF0cy0+TGVuZ3RoLTQ7Ci0JCXN0YXRzLT5mcmFnbGVuZ3RoID0gc3RhdHMtPnBhY2tldGxlbmd0aDsKLQkJc3RhdHMtPmZyYWdvZmZzZXQgPSAwOwotCQlzdGF0cy0+bnRvdGFsZnJhZyA9IDE7Ci0JCXJldHVybiB0cnVlOwogCX0KKworCXN0YXRzLT5SeERydkluZm9TaXplID0gcGRlc2MtPlJ4RHJ2SW5mb1NpemU7CisJc3RhdHMtPlJ4QnVmU2hpZnQgPSAoKHBkZXNjLT5TaGlmdCkmMHgwMyk7CisJc3RhdHMtPkRlY3J5cHRlZCA9ICFwZGVzYy0+U1dEZWM7CisKKwlwRHJ2SW5mbyA9IChzdHJ1Y3QgcnhfZndpbmZvICopKHNrYi0+ZGF0YSArIHN0YXRzLT5SeEJ1ZlNoaWZ0KTsKKworCXN0YXRzLT5yYXRlID0gSHdSYXRlVG9NUmF0ZTkwKChib29sKXBEcnZJbmZvLT5SeEhULAorCQkJCSAgICAgKHU4KXBEcnZJbmZvLT5SeFJhdGUpOworCXN0YXRzLT5iU2hvcnRQcmVhbWJsZSA9IHBEcnZJbmZvLT5TUExDUDsKKworCXJ0bDgxOTJfVXBkYXRlUmVjZWl2ZWRSYXRlSGlzdG9ncmFtU3RhdGlzdGljcyhkZXYsIHN0YXRzKTsKKworCXN0YXRzLT5iSXNBTVBEVSA9IChwRHJ2SW5mby0+UGFydEFnZ3IgPT0gMSk7CisJc3RhdHMtPmJGaXJzdE1QRFUgPSAocERydkluZm8tPlBhcnRBZ2dyID09IDEpICYmCisJCQkgICAgKHBEcnZJbmZvLT5GaXJzdEFHR1IgPT0gMSk7CisKKwlzdGF0cy0+VGltZVN0YW1wTG93ID0gcERydkluZm8tPlRTRkw7CisJc3RhdHMtPlRpbWVTdGFtcEhpZ2ggPSByZWFkX25pY19kd29yZChkZXYsIFRTRlIrNCk7CisKKwlydGw4MTl4X1VwZGF0ZVJ4UGt0VGltZVN0YW1wKGRldiwgc3RhdHMpOworCisJaWYgKChzdGF0cy0+UnhCdWZTaGlmdCArIHN0YXRzLT5SeERydkluZm9TaXplKSA+IDApCisJCXN0YXRzLT5iU2hpZnQgPSAxOworCisJc3RhdHMtPlJ4SXM0ME1IelBhY2tldCA9IHBEcnZJbmZvLT5CVzsKKworCXJ0bDgxOTJfVHJhbnNsYXRlUnhTaWduYWxTdHVmZihkZXYsIHNrYiwgc3RhdHMsIHBkZXNjLAorCQkJCSAgICAgICBwRHJ2SW5mbyk7CisKKwlpZiAocERydkluZm8tPkZpcnN0QUdHUiA9PSAxIHx8IHBEcnZJbmZvLT5QYXJ0QWdnciA9PSAxKQorCQlSVF9UUkFDRShDT01QX1JYREVTQywKKwkJCSAicERydkluZm8tPkZpcnN0QUdHUiA9ICVkLCBwRHJ2SW5mby0+UGFydEFnZ3IgPSAlZFxuIiwKKwkJCSBwRHJ2SW5mby0+Rmlyc3RBR0dSLCBwRHJ2SW5mby0+UGFydEFnZ3IpOworCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA0LypzQ3JjTG5nKi8pOworCisKKwlzdGF0cy0+cGFja2V0bGVuZ3RoID0gc3RhdHMtPkxlbmd0aC00OworCXN0YXRzLT5mcmFnbGVuZ3RoID0gc3RhdHMtPnBhY2tldGxlbmd0aDsKKwlzdGF0cy0+ZnJhZ29mZnNldCA9IDA7CisJc3RhdHMtPm50b3RhbGZyYWcgPSAxOworCXJldHVybiB0cnVlOwogfQogCiB2b2lkIHJ0bDgxOTJfaGFsdF9hZGFwdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgcmVzZXQpCkBAIC0yMTMyLDcgKzIxMzcsNiBAQAogCQlza2JfcXVldWVfcHVyZ2UoJnByaXYtPnJ0bGxpYi0+c2tiX2FnZ1FbaV0pOwogCiAJc2tiX3F1ZXVlX3B1cmdlKCZwcml2LT5za2JfcXVldWUpOwotCXJldHVybjsKIH0KIAogdm9pZCBydGw4MTkyX3VwZGF0ZV9yYXRyX3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yMTkxLDggKzIxOTUsNyBAQAogCiAJcHJpdi0+cnRsbGliLT5zb2Z0bWFjX2ZlYXR1cmVzICA9IElFRUVfU09GVE1BQ19TQ0FOIHwKIAkJSUVFRV9TT0ZUTUFDX0FTU09DSUFURSB8IElFRUVfU09GVE1BQ19QUk9CRVJRIHwKLQkJSUVFRV9TT0ZUTUFDX1BST0JFUlMgfCBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgLyogfAotCQlJRUVFX1NPRlRNQUNfQkVBQ09OUyovOworCQlJRUVFX1NPRlRNQUNfUFJPQkVSUyB8IElFRUVfU09GVE1BQ19UWF9RVUVVRTsKIAogCXByaXYtPnJ0bGxpYi0+dHhfaGVhZHJvb20gPSBzaXplb2Yoc3RydWN0IHR4X2Z3aW5mb184MTkwcGNpKTsKIApAQCAtMjMwOCw4ICsyMzExLDcgQEAKIAkgIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IFJhdGVBZGFwdGl2ZVRIX0xvd18yME0pKSkpIHsKIAkJaWYgKHJ4X2Noa19jbnQgPCAyKQogCQkJcmV0dXJuIGJTdHVjazsKLQkJZWxzZQotCQkJcnhfY2hrX2NudCA9IDA7CisJCXJ4X2Noa19jbnQgPSAwOwogCX0gZWxzZSBpZiAoKCgocHJpdi0+Q3VycmVudENoYW5uZWxCVyAhPSBIVF9DSEFOTkVMX1dJRFRIXzIwKSAmJgogCQkgIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgUmF0ZUFkYXB0aXZlVEhfTG93XzQwTSkpIHx8CiAJCSgocHJpdi0+Q3VycmVudENoYW5uZWxCVyA9PSBIVF9DSEFOTkVMX1dJRFRIXzIwKSAmJgpAQCAtMjMxNywxMyArMjMxOSwxMSBAQAogCQlwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IFZlcnlMb3dSU1NJKSB7CiAJCWlmIChyeF9jaGtfY250IDwgNCkKIAkJCXJldHVybiBiU3R1Y2s7Ci0JCWVsc2UKLQkJCXJ4X2Noa19jbnQgPSAwOworCQlyeF9jaGtfY250ID0gMDsKIAl9IGVsc2UgewogCQlpZiAocnhfY2hrX2NudCA8IDgpCiAJCQlyZXR1cm4gYlN0dWNrOwotCQllbHNlCi0JCQlyeF9jaGtfY250ID0gMDsKKwkJcnhfY2hrX2NudCA9IDA7CiAJfQogCiAKQEAgLTI0MTMsNSArMjQxMyw0IEBACiAJZW51bSB3aXJlbGVzc19tb2RlIFdpcmVsZXNzTW9kZSwKIAlzdHJ1Y3QgY2hhbm5lbF9hY2Nlc3Nfc2V0dGluZyAqQ2hubEFjY2Vzc1NldHRpbmcpCiB7Ci0JcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9maXJtd2FyZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9maXJtd2FyZS5jCmluZGV4IDJlMjg3NDQuLmM0NjVmODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfZmlybXdhcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2Zpcm13YXJlLmMKQEAgLTM2LDcgKzM2LDYgQEAKIAkJCSAgICAgdTMyIGJ1ZmZlcl9sZW4pCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwotCWJvb2wJCSAgICBydF9zdGF0dXMgPSB0cnVlOwogCXUxNgkJICAgIGZyYWdfdGhyZXNob2xkOwogCXUxNgkJICAgIGZyYWdfbGVuZ3RoLCBmcmFnX29mZnNldCA9IDA7CiAJaW50CQkgICAgaTsKQEAgLTUxLDcgKzUwLDcgQEAKIAlmcmFnX3RocmVzaG9sZCA9IHBmaXJtd2FyZS0+Y21kcGFja2V0X2ZyYWdfdGhyZXNvbGQ7CiAJZG8gewogCQlpZiAoKGJ1ZmZlcl9sZW4gLSBmcmFnX29mZnNldCkgPiBmcmFnX3RocmVzaG9sZCkgewotCQkJZnJhZ19sZW5ndGggPSBmcmFnX3RocmVzaG9sZCA7CisJCQlmcmFnX2xlbmd0aCA9IGZyYWdfdGhyZXNob2xkOwogCQkJYkxhc3RJbmlQa3QgPSAwOwogCiAJCX0gZWxzZSB7CkBAIC04NCw4ICs4Myw4IEBACiAJCWlmICghcHJpdi0+cnRsbGliLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoZGV2LCB0Y2JfZGVzYy0+cXVldWVfaW5kZXgpIHx8CiAJCSAgICAoIXNrYl9xdWV1ZV9lbXB0eSgmcHJpdi0+cnRsbGliLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSkpIHx8CiAJCSAgICAocHJpdi0+cnRsbGliLT5xdWV1ZV9zdG9wKSkgewotCQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIj09PT09PT09PT09PT09PT09PT0+IHR4ICIKLQkJCQkgImZ1bGwhXG4iKTsKKwkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsCisJCQkJICI9PT09PT09PT09PT09PT09PT09PiB0eCBmdWxsIVxuIik7CiAJCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+cnRsbGliLT5za2Jfd2FpdFEKIAkJCQkJW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0sIHNrYik7CiAJCX0gZWxzZSB7CkBAIC05OSw3ICs5OCw3IEBACiAKIAl3cml0ZV9uaWNfYnl0ZShkZXYsIFRQUG9sbCwgVFBQb2xsX0NRKTsKIAotCXJldHVybiBydF9zdGF0dXM7CisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBib29sIENQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMDgsNyArMTA3LDcgQEAKIAl1MzIJCUNQVV9zdGF0dXMgPSAwOwogCXVuc2lnbmVkIGxvbmcgICB0aW1lb3V0OwogCi0JdGltZW91dCA9IGppZmZpZXMgKyBNU0VDUygyMDApOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMDApOwogCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgewogCQlDUFVfc3RhdHVzID0gcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOKTsKIAkJaWYgKENQVV9zdGF0dXMgJiBDUFVfR0VOX1BVVF9DT0RFX09LKQpAQCAtMTI4LDcgKzEyNyw3IEBACiAJCSAgICAgICAodTgpKChDUFVfc3RhdHVzfENQVV9HRU5fUFdSX1NUQl9DUFUpJjB4ZmYpKTsKIAltZGVsYXkoMSk7CiAKLQl0aW1lb3V0ID0gamlmZmllcyArIE1TRUNTKDIwMCk7CisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDIwMCk7CiAJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCUNQVV9zdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOwogCQlpZiAoQ1BVX3N0YXR1cyZDUFVfR0VOX0JPT1RfUkRZKQpAQCAtMTU2LDcgKzE1NSw3IEBACiAJdTMyCUNQVV9zdGF0dXMgPSAwOwogCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAotCXRpbWVvdXQgPSBqaWZmaWVzICsgTVNFQ1MoMjApOworCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygyMCk7CiAJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpKSB7CiAJCUNQVV9zdGF0dXMgPSByZWFkX25pY19kd29yZChkZXYsIENQVV9HRU4pOwogCQlpZiAoQ1BVX3N0YXR1cyZDUFVfR0VOX0ZJUk1fUkRZKQpAQCAtMTk3LDggKzE5Niw4IEBACiAJCWlmIChydF9zdGF0dXMpCiAJCQlwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9IEZXX1NUQVRVU18zX1RVUk5PTl9DUFU7CiAJCWVsc2UKLQkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJDUFVjaGVja19tYWluY29kZW9rX3R1cm5vbiIKLQkJCQkgIkNQVSBmYWlsIVxuIik7CisJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLAorCQkJCSAiQ1BVY2hlY2tfbWFpbmNvZGVva190dXJub25DUFUgZmFpbCFcbiIpOwogCiAJCWJyZWFrOwogCkBAIC0yMTAsOCArMjA5LDkgQEAKIAkJaWYgKHJ0X3N0YXR1cykKIAkJCXBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID0gRldfU1RBVFVTXzVfUkVBRFk7CiAJCWVsc2UKLQkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsICJDUFVjaGVja19maXJtd2FyZV9yZWFkeSBmYWlsIgotCQkJCSAiKCVkKSFcbiIsIHJ0X3N0YXR1cyk7CisJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLAorCQkJCSAiQ1BVY2hlY2tfZmlybXdhcmVfcmVhZHkgZmFpbCglZCkhXG4iLAorCQkJCSBydF9zdGF0dXMpOwogCiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yNDYsOCArMjQ2LDggQEAKIAkJcnN0X29wdCA9IE9QVF9GSVJNV0FSRV9SRVNFVDsKIAkJc3RhcnRpbmdfc3RhdGUgPSBGV19JTklUX1NURVAyX0RBVEE7CiAJfSBlbHNlIHsKLQkJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIlBsYXRmb3JtSW5pdEZpcm13YXJlOiB1bmRlZmluZWQiCi0JCQkgIiBmaXJtd2FyZSBzdGF0ZVxuIik7CisJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsCisJCQkgIlBsYXRmb3JtSW5pdEZpcm13YXJlOiB1bmRlZmluZWQgZmlybXdhcmUgc3RhdGVcbiIpOwogCX0KIAogCWZvciAoaW5pdF9zdGVwID0gc3RhcnRpbmdfc3RhdGU7IGluaXRfc3RlcCA8PSBGV19JTklUX1NURVAyX0RBVEE7CkBAIC0yNjYsMTQgKzI2NiwxNCBAQAogCQkJCQkJICAgICAgZndfbmFtZVtpbml0X3N0ZXBdLAogCQkJCQkJICAgICAgJnByaXYtPnBkZXYtPmRldik7CiAJCQkJaWYgKHJjIDwgMCkgewotCQkJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAicmVxdWVzdCBmaXJtd2FyZSBmYWlsIVxuIik7CisJCQkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsCisJCQkJCQkgInJlcXVlc3QgZmlybXdhcmUgZmFpbCFcbiIpOwogCQkJCQlnb3RvIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7CiAJCQkJfQogCQkJCWlmIChmd19lbnRyeS0+c2l6ZSA+CiAJCQkJICAgIHNpemVvZihwZmlybXdhcmUtPmZpcm13YXJlX2J1Zltpbml0X3N0ZXBdKSkgewotCQkJCQlSVF9UUkFDRShDT01QX0ZJUk1XQVJFLCAiaW1nIGZpbGUgc2l6ZSAiCi0JCQkJCQkgImV4Y2VlZCB0aGUgY29udGFpbmVyIHN0cnVjdCAiCi0JCQkJCQkgImJ1ZmZlciBmYWlsIVxuIik7CisJCQkJCVJUX1RSQUNFKENPTVBfRklSTVdBUkUsCisJCQkJCQkgImltZyBmaWxlIHNpemUgZXhjZWVkIHRoZSBjb250YWluZXIgc3RydWN0IGJ1ZmZlciBmYWlsIVxuIik7CiAJCQkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKIAkJCQl9CiAKQEAgLTMwMSwxMyArMzAxLDExIEBACiAJCWZpbGVfbGVuZ3RoID0gcGZpcm13YXJlLT5maXJtd2FyZV9idWZfc2l6ZVtpbml0X3N0ZXBdOwogCiAJCXJ0X3N0YXR1cyA9IGZ3X2Rvd25sb2FkX2NvZGUoZGV2LCBtYXBwZWRfZmlsZSwgZmlsZV9sZW5ndGgpOwotCQlpZiAoIXJ0X3N0YXR1cykgeworCQlpZiAoIXJ0X3N0YXR1cykKIAkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKLQkJfQogCi0JCWlmICghZmlybXdhcmVfY2hlY2tfcmVhZHkoZGV2LCBpbml0X3N0ZXApKSB7CisJCWlmICghZmlybXdhcmVfY2hlY2tfcmVhZHkoZGV2LCBpbml0X3N0ZXApKQogCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOwotCQl9CiAJfQogCiAJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIkZpcm13YXJlIERvd25sb2FkIFN1Y2Nlc3NcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9od2ltZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9od2ltZy5oCmluZGV4IDAxOTgzNmIuLmQ4MDQ4NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfaHdpbWcuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX2h3aW1nLmgKQEAgLTM0LDE4ICszNCwxOCBAQAogI2RlZmluZSBQSFlfUkVHXzFUMlJBcnJheUxlbmd0aFBjaUUgMjk2CiBleHRlcm4gdTMyIFJ0bDgxOTJQY2lFUEhZX1JFR18xVDJSQXJyYXlbUEhZX1JFR18xVDJSQXJyYXlMZW5ndGhQY2lFXTsKICNkZWZpbmUgUmFkaW9BX0FycmF5TGVuZ3RoUGNpRSAyNDYKLWV4dGVybiB1MzIgUnRsODE5MlBjaUVSYWRpb0FfQXJyYXlbUmFkaW9BX0FycmF5TGVuZ3RoUGNpRV0gOworZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRVJhZGlvQV9BcnJheVtSYWRpb0FfQXJyYXlMZW5ndGhQY2lFXTsKICNkZWZpbmUgUmFkaW9CX0FycmF5TGVuZ3RoUGNpRSA3OAotZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRVJhZGlvQl9BcnJheVtSYWRpb0JfQXJyYXlMZW5ndGhQY2lFXSA7CitleHRlcm4gdTMyIFJ0bDgxOTJQY2lFUmFkaW9CX0FycmF5W1JhZGlvQl9BcnJheUxlbmd0aFBjaUVdOwogI2RlZmluZSBSYWRpb0NfQXJyYXlMZW5ndGhQY2lFIDIKLWV4dGVybiB1MzIgUnRsODE5MlBjaUVSYWRpb0NfQXJyYXlbUmFkaW9DX0FycmF5TGVuZ3RoUGNpRV0gOworZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRVJhZGlvQ19BcnJheVtSYWRpb0NfQXJyYXlMZW5ndGhQY2lFXTsKICNkZWZpbmUgUmFkaW9EX0FycmF5TGVuZ3RoUGNpRSAyCi1leHRlcm4gdTMyIFJ0bDgxOTJQY2lFUmFkaW9EX0FycmF5W1JhZGlvRF9BcnJheUxlbmd0aFBjaUVdIDsKK2V4dGVybiB1MzIgUnRsODE5MlBjaUVSYWRpb0RfQXJyYXlbUmFkaW9EX0FycmF5TGVuZ3RoUGNpRV07CiAjZGVmaW5lIE1BQ1BIWV9BcnJheUxlbmd0aFBjaUUgMTgKLWV4dGVybiB1MzIgUnRsODE5MlBjaUVNQUNQSFlfQXJyYXlbTUFDUEhZX0FycmF5TGVuZ3RoUGNpRV0gOworZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRU1BQ1BIWV9BcnJheVtNQUNQSFlfQXJyYXlMZW5ndGhQY2lFXTsKICNkZWZpbmUgTUFDUEhZX0FycmF5X1BHTGVuZ3RoUGNpRSAzMAotZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRU1BQ1BIWV9BcnJheV9QR1tNQUNQSFlfQXJyYXlfUEdMZW5ndGhQY2lFXSA7CitleHRlcm4gdTMyIFJ0bDgxOTJQY2lFTUFDUEhZX0FycmF5X1BHW01BQ1BIWV9BcnJheV9QR0xlbmd0aFBjaUVdOwogI2RlZmluZSBBR0NUQUJfQXJyYXlMZW5ndGhQY2lFIDM4NAotZXh0ZXJuIHUzMiBSdGw4MTkyUGNpRUFHQ1RBQl9BcnJheVtBR0NUQUJfQXJyYXlMZW5ndGhQY2lFXSA7CitleHRlcm4gdTMyIFJ0bDgxOTJQY2lFQUdDVEFCX0FycmF5W0FHQ1RBQl9BcnJheUxlbmd0aFBjaUVdOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOTJFX3BoeS5jCmluZGV4IDhjMDhlZjYuLjQ2NjRhNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5MkVfcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTkyRV9waHkuYwpAQCAtOTQsNyArOTQsNiBAQAogCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBkd1JlZ0FkZHIsIE5ld1ZhbHVlKTsKIAl9IGVsc2UKIAkJd3JpdGVfbmljX2R3b3JkKGRldiwgZHdSZWdBZGRyLCBkd0RhdGEpOwotCXJldHVybjsKIH0KIAogdTMyIHJ0bDgxOTJfUXVlcnlCQlJlZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZHdSZWdBZGRyLCB1MzIgZHdCaXRNYXNrKQpAQCAtMTM2LDggKzEzNSw4IEBACiAJCX0gZWxzZQogCQkJTmV3T2Zmc2V0ID0gT2Zmc2V0OwogCX0gZWxzZSB7Ci0JCVJUX1RSQUNFKChDT01QX1BIWXxDT01QX0VSUiksICJjaGVjayBSRiB0eXBlIGhlcmUsIG5lZWQiCi0JCQkgIiB0byBiZSA4MjU2XG4iKTsKKwkJUlRfVFJBQ0UoKENPTVBfUEhZfENPTVBfRVJSKSwKKwkJCSAiY2hlY2sgUkYgdHlwZSBoZXJlLCBuZWVkIHRvIGJlIDgyNTZcbiIpOwogCQlOZXdPZmZzZXQgPSBPZmZzZXQ7CiAJfQogCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwgYkxTU0lSZWFkQWRkcmVzcywKQEAgLTE5Miw4ICsxOTEsOCBAQAogCQl9IGVsc2UKIAkJCU5ld09mZnNldCA9IE9mZnNldDsKIAl9IGVsc2UgewotCQlSVF9UUkFDRSgoQ09NUF9QSFl8Q09NUF9FUlIpLCAiY2hlY2sgUkYgdHlwZSBoZXJlLCBuZWVkIHRvIGJlIgotCQkJICIgODI1NlxuIik7CisJCVJUX1RSQUNFKChDT01QX1BIWXxDT01QX0VSUiksCisJCQkgImNoZWNrIFJGIHR5cGUgaGVyZSwgbmVlZCB0byBiZSA4MjU2XG4iKTsKIAkJTmV3T2Zmc2V0ID0gT2Zmc2V0OwogCX0KIApAQCAtMjE1LDcgKzIxNCw2IEBACiAJCX0KIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0LCAweDMwMCwgMHgzKTsKIAl9Ci0JcmV0dXJuOwogfQogCiB2b2lkIHJ0bDgxOTJfcGh5X1NldFJGUmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGVudW0gcmY5MF9yYWRpb19wYXRoIGVSRlBhdGgsCkBAIC0yNTYsNyArMjU0LDYgQEAKIAkJfSBlbHNlCiAJCQlydGw4MTkyX3BoeV9SRlNlcmlhbFdyaXRlKGRldiwgZVJGUGF0aCwgUmVnQWRkciwgRGF0YSk7CiAJfQotCXJldHVybjsKIH0KIAogdTMyIHJ0bDgxOTJfcGh5X1F1ZXJ5UkZSZWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgZW51bSByZjkwX3JhZGlvX3BhdGggZVJGUGF0aCwKQEAgLTMwNyw3ICszMDQsNyBAQAogCX0KIAlyZXR1cm4gcmVhZF9uaWNfZHdvcmQoZGV2LCBSRl9EQVRBKTsKIAotfQkvKiBwaHlfRndSRlNlcmlhbFJlYWQgKi8KK30KIAogc3RhdGljIHZvaWQgcGh5X0Z3UkZTZXJpYWxXcml0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCWVudW0gcmY5MF9yYWRpb19wYXRoIGVSRlBhdGgsCkBAIC0zMjgsNyArMzI1LDcgQEAKIAl9CiAJd3JpdGVfbmljX2R3b3JkKGRldiwgUVBOUiwgRGF0YSk7CiAKLX0JLyogcGh5X0Z3UkZTZXJpYWxXcml0ZSAqLworfQogCiAKIHZvaWQgcnRsODE5Ml9waHlfY29uZmlnbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0zNDgsOCArMzQ1LDggQEAKIAkJcGR3QXJyYXkgPSBSdGw4MTlYTUFDUEhZX0FycmF5OwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgZHdBcnJheUxlbjsgaSArPSAzKSB7Ci0JCVJUX1RSQUNFKENPTVBfREJHLCAiVGhlIFJ0bDgxOTBNQUNQSFlfQXJyYXlbMF0gaXMgJXggUnRsODE5ME1BQyIKLQkJCSAiUEhZX0FycmF5WzFdIGlzICV4IFJ0bDgxOTBNQUNQSFlfQXJyYXlbMl0gaXMgJXhcbiIsCisJCVJUX1RSQUNFKENPTVBfREJHLAorCQkJICJUaGUgUnRsODE5ME1BQ1BIWV9BcnJheVswXSBpcyAleCBSdGw4MTkwTUFDUEhZX0FycmF5WzFdIGlzICV4IFJ0bDgxOTBNQUNQSFlfQXJyYXlbMl0gaXMgJXhcbiIsCiAJCQkgcGR3QXJyYXlbaV0sIHBkd0FycmF5W2krMV0sIHBkd0FycmF5W2krMl0pOwogCQlpZiAocGR3QXJyYXlbaV0gPT0gMHgzMTgpCiAJCQlwZHdBcnJheVtpKzJdID0gMHgwMDAwMDgwMDsKQEAgLTM4Myw4ICszODAsOCBAQAogCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFJ0bDgxOVhQSFlfUkVHQXJyYXlfVGFibGVbaV0sCiAJCQkJCSBiTWFza0RXb3JkLAogCQkJCQkgUnRsODE5WFBIWV9SRUdBcnJheV9UYWJsZVtpKzFdKTsKLQkJCVJUX1RSQUNFKENPTVBfREJHLCAiaTogJXgsIFRoZSBSdGw4MTl4VXNiUEhZX1JFR0FycmF5IgotCQkJCSAiWzBdIGlzICV4IFJ0bDgxOXhVc2JQSFlfUkVHQXJyYXlbMV0gaXMgJXhcbiIsCisJCQlSVF9UUkFDRShDT01QX0RCRywKKwkJCQkgImk6ICV4LCBUaGUgUnRsODE5eFVzYlBIWV9SRUdBcnJheVswXSBpcyAleCBSdGw4MTl4VXNiUEhZX1JFR0FycmF5WzFdIGlzICV4XG4iLAogCQkJCSBpLCBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlW2ldLAogCQkJCSBSdGw4MTlYUEhZX1JFR0FycmF5X1RhYmxlW2krMV0pOwogCQl9CkBAIC0zOTMsMTMgKzM5MCwxMiBAQAogCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFJ0bDgxOVhBR0NUQUJfQXJyYXlfVGFibGVbaV0sCiAJCQkJCSBiTWFza0RXb3JkLAogCQkJCQkgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVtpKzFdKTsKLQkJCVJUX1RSQUNFKENPTVBfREJHLCAiaToleCwgVGhlIHJ0bDgxOVhBR0NUQUJfQXJyYXlbMF0gIgotCQkJCSAiaXMgJXggcnRsODE5WEFHQ1RBQl9BcnJheVsxXSBpcyAleFxuIiwgaSwKLQkJCQkgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVtpXSwKKwkJCVJUX1RSQUNFKENPTVBfREJHLAorCQkJCSAiaToleCwgVGhlIHJ0bDgxOVhBR0NUQUJfQXJyYXlbMF0gaXMgJXggcnRsODE5WEFHQ1RBQl9BcnJheVsxXSBpcyAleFxuIiwKKwkJCQkgaSwgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVtpXSwKIAkJCQkgUnRsODE5WEFHQ1RBQl9BcnJheV9UYWJsZVtpKzFdKTsKIAkJfQogCX0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHJ0bDgxOTJfSW5pdEJCUkZSZWdEZWYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTUxMSw4ICs1MDcsOCBAQAogCWZvciAoaSA9IDA7IGkgPCBDaGVja1RpbWVzOyBpKyspIHsKIAkJc3dpdGNoIChDaGVja0Jsb2NrKSB7CiAJCWNhc2UgSFc5MF9CTE9DS19NQUM6Ci0JCQlSVF9UUkFDRShDT01QX0VSUiwgIlBIWV9DaGVja0JCUkZPSygpOiBOZXZlciBXcml0ZSAiCi0JCQkJICIweDEwMCBoZXJlISIpOworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJICJQSFlfQ2hlY2tCQlJGT0soKTogTmV2ZXIgV3JpdGUgMHgxMDAgaGVyZSEiKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgSFc5MF9CTE9DS19QSFkwOgpAQCAtNTQxLDggKzUzNyw5IEBACiAKIAogCQlpZiAoZHdSZWdSZWFkICE9IFdyaXRlRGF0YVtpXSkgewotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICI9PT09PmVycm9yPT09PT1kd1JlZ1JlYWQ6ICV4LCAiCi0JCQkJICJXcml0ZURhdGE6ICV4XG4iLCBkd1JlZ1JlYWQsIFdyaXRlRGF0YVtpXSk7CisJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkgIj09PT0+ZXJyb3I9PT09PWR3UmVnUmVhZDogJXgsIFdyaXRlRGF0YTogJXhcbiIsCisJCQkJIGR3UmVnUmVhZCwgV3JpdGVEYXRhW2ldKTsKIAkJCXJldCA9IGZhbHNlOwogCQkJYnJlYWs7CiAJCX0KQEAgLTU3MCw4ICs1NjcsOSBAQAogCQkJCQkgKGVudW0gaHc5MF9ibG9jayllQ2hlY2tJdGVtLAogCQkJCQkgKGVudW0gcmY5MF9yYWRpb19wYXRoKTApOwogCQlpZiAoIXJ0U3RhdHVzKSB7Ci0JCQlSVF9UUkFDRSgoQ09NUF9FUlIgfCBDT01QX1BIWSksICJQSFlfUkY4MjU2X0NvbmZpZygpOiIKLQkJCQkgIkNoZWNrIFBIWSVkIEZhaWwhIVxuIiwgZUNoZWNrSXRlbS0xKTsKKwkJCVJUX1RSQUNFKChDT01QX0VSUiB8IENPTVBfUEhZKSwKKwkJCQkgIlBIWV9SRjgyNTZfQ29uZmlnKCk6Q2hlY2sgUEhZJWQgRmFpbCEhXG4iLAorCQkJCSBlQ2hlY2tJdGVtLTEpOwogCQkJcmV0dXJuIHJ0U3RhdHVzOwogCQl9CiAJfQpAQCAtNjI4LDggKzYyNiw4IEBACiAJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzFdID0gcmVhZF9uaWNfYnl0ZShkZXYsIHJPRkRNMF9YQkFHQ0NvcmUxKTsKIAlwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMl0gPSByZWFkX25pY19ieXRlKGRldiwgck9GRE0wX1hDQUdDQ29yZTEpOwogCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblszXSA9IHJlYWRfbmljX2J5dGUoZGV2LCByT0ZETTBfWERBR0NDb3JlMSk7Ci0JUlRfVFJBQ0UoQ09NUF9JTklULCAiRGVmYXVsdCBpbml0aWFsIGdhaW4gKGM1MD0weCV4LCBjNTg9MHgleCwgIgotCQkiYzYwPTB4JXgsIGM2OD0weCV4KVxuIiwKKwlSVF9UUkFDRShDT01QX0lOSVQsCisJCSAiRGVmYXVsdCBpbml0aWFsIGdhaW4gKGM1MD0weCV4LCBjNTg9MHgleCwgYzYwPTB4JXgsIGM2OD0weCV4KVxuIiwKIAkJcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzBdLCBwcml2LT5EZWZhdWx0SW5pdGlhbEdhaW5bMV0sCiAJCXByaXYtPkRlZmF1bHRJbml0aWFsR2FpblsyXSwgcHJpdi0+RGVmYXVsdEluaXRpYWxHYWluWzNdKTsKIApAQCAtNjM4LDcgKzYzNiw2IEBACiAJUlRfVFJBQ0UoQ09NUF9JTklULCAiRGVmYXVsdCBmcmFtZXN5bmMgKDB4JXgpID0gMHgleFxuIiwKIAkJck9GRE0wX1J4RGV0ZWN0b3IzLCBwcml2LT5mcmFtZXN5bmMpOwogCXByaXYtPlNpZnNUaW1lID0gcmVhZF9uaWNfd29yZChkZXYsIFNJRlMpOwotCXJldHVybjsKIH0KIAogdm9pZCBydGw4MTkyX3BoeV9zZXRUeFBvd2VyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGNoYW5uZWwpCkBAIC02OTIsNyArNjg5LDYgQEAKIAkJCSBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCX0KLQlyZXR1cm47CiB9CiAKIGJvb2wgcnRsODE5Ml9waHlfUkZDb25maWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTcyMSw3ICs3MTcsNiBAQAogCiB2b2lkIHJ0bDgxOTJfcGh5X3VwZGF0ZUluaXRHYWluKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuOwogfQogCiB1OCBydGw4MTkyX3BoeV9Db25maWdSRldpdGhIZWFkZXJGaWxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC04MDcsMTEgKzgwMiwxMCBAQAogCWNhc2UgUkZfODI1ODoKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJ1bmtub3duIHJmIGNoaXAgSUQgaW4gcnRsODE5Ml9TZXRUeFBvd2VyIgotCQkJICJMZXZlbCgpXG4iKTsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkgInVua25vd24gcmYgY2hpcCBJRCBpbiBydGw4MTkyX1NldFR4UG93ZXJMZXZlbCgpXG4iKTsKIAkJYnJlYWs7CiAJfQotCXJldHVybjsKIH0KIAogc3RhdGljIHU4IHJ0bDgxOTJfcGh5X1NldFN3Q2hubENtZEFycmF5KHN0cnVjdCBzd19jaG5sX2NtZCAqQ21kVGFibGUsCkBAIC04MjIsMTUgKzgxNiwxNCBAQAogCXN0cnVjdCBzd19jaG5sX2NtZCAqcENtZDsKIAogCWlmIChDbWRUYWJsZSA9PSBOVUxMKSB7Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCAicGh5X1NldFN3Q2hubENtZEFycmF5KCk6IENtZFRhYmxlIGNhbm5vdCAiCi0JCQkgImJlIE5VTEwuXG4iKTsKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkgInBoeV9TZXRTd0NobmxDbWRBcnJheSgpOiBDbWRUYWJsZSBjYW5ub3QgYmUgTlVMTC5cbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCWlmIChDbWRUYWJsZUlkeCA+PSBDbWRUYWJsZVN6KSB7Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCAicGh5X1NldFN3Q2hubENtZEFycmF5KCk6IEFjY2VzcyBpbnZhbGlkIgotCQkJICIgaW5kZXgsIHBsZWFzZSBjaGVjayBzaXplIG9mIHRoZSB0YWJsZSwgQ21kVGFibGVJZHg6IgotCQkJICIlZCwgQ21kVGFibGVTejolZFxuIiwKLQkJCQlDbWRUYWJsZUlkeCwgQ21kVGFibGVTeik7CisJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJICJwaHlfU2V0U3dDaG5sQ21kQXJyYXkoKTogQWNjZXNzIGludmFsaWQgaW5kZXgsIHBsZWFzZSBjaGVjayBzaXplIG9mIHRoZSB0YWJsZSwgQ21kVGFibGVJZHg6JWQsIENtZFRhYmxlU3o6JWRcbiIsCisJCQkgQ21kVGFibGVJZHgsIENtZFRhYmxlU3opOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCkBAIC04ODMsOCArODc2LDkgQEAKIAkJc3dpdGNoIChwcml2LT5yZl9jaGlwKSB7CiAJCWNhc2UgUkZfODIyNToKIAkJCWlmICghKGNoYW5uZWwgPj0gMSAmJiBjaGFubmVsIDw9IDE0KSkgewotCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiaWxsZWdhbCBjaGFubmVsIGZvciBaZWJyYSAiCi0JCQkJCSAiODIyNTogJWRcbiIsIGNoYW5uZWwpOworCQkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCQkgImlsbGVnYWwgY2hhbm5lbCBmb3IgWmVicmEgODIyNTogJWRcbiIsCisJCQkJCSBjaGFubmVsKTsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShpZWVlLT5SZkRlcGVuZENtZCwKQEAgLTg5OCw4ICs4OTIsOSBAQAogCiAJCWNhc2UgUkZfODI1NjoKIAkJCWlmICghKGNoYW5uZWwgPj0gMSAmJiBjaGFubmVsIDw9IDE0KSkgewotCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiaWxsZWdhbCBjaGFubmVsIGZvciBaZWJyYSIKLQkJCQkJICIgODI1NjogJWRcbiIsIGNoYW5uZWwpOworCQkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCQkgImlsbGVnYWwgY2hhbm5lbCBmb3IgWmVicmEgODI1NjogJWRcbiIsCisJCQkJCSBjaGFubmVsKTsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCQlydGw4MTkyX3BoeV9TZXRTd0NobmxDbWRBcnJheShpZWVlLT5SZkRlcGVuZENtZCwKQEAgLTkyMCw3ICs5MTUsNiBAQAogCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJVbmtub3duIFJGQ2hpcElEOiAlZFxuIiwKIAkJCQkgcHJpdi0+cmZfY2hpcCk7CiAJCQlyZXR1cm4gZmFsc2U7Ci0JCQlicmVhazsKIAkJfQogCiAKQEAgLTkzOCwxMyArOTMyLDExIEBACiAJCQl9CiAKIAkJCWlmIChDdXJyZW50Q21kICYmIEN1cnJlbnRDbWQtPkNtZElEID09IENtZElEX0VuZCkgewotCQkJCWlmICgoKnN0YWdlKSA9PSAyKSB7CisJCQkJaWYgKCgqc3RhZ2UpID09IDIpCiAJCQkJCXJldHVybiB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCSgqc3RhZ2UpKys7Ci0JCQkJCSgqc3RlcCkgPSAwOwotCQkJCQljb250aW51ZTsKLQkJCQl9CisJCQkJKCpzdGFnZSkrKzsKKwkJCQkoKnN0ZXApID0gMDsKKwkJCQljb250aW51ZTsKIAkJCX0KIAogCQkJaWYgKCFDdXJyZW50Q21kKQpAQCAtOTk2LDcgKzk4OCw3IEBACiAJICAgICAgJnByaXYtPlN3Q2hubFN0ZXAsICZkZWxheSkpIHsKIAkJaWYgKGRlbGF5ID4gMCkKIAkJCW1zbGVlcChkZWxheSk7Ci0JCWlmIChJU19OSUNfRE9XTihwcml2KSkKKwkJaWYgKCFwcml2LT51cCkKIAkJCWJyZWFrOwogCX0KIH0KQEAgLTEwMjAsNyArMTAxMiw3IEBACiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCiAJUlRfVFJBQ0UoQ09NUF9QSFksICI9PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7Ci0JaWYgKElTX05JQ19ET1dOKHByaXYpKSB7CisJaWYgKCFwcml2LT51cCkgewogCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCk6IEVSUiAhISBkcml2ZXIgaXMgbm90IHVwXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC0xMDYwLDcgKzEwNTIsNyBAQAogCXByaXYtPlN3Q2hubFN0YWdlID0gMDsKIAlwcml2LT5Td0NobmxTdGVwID0gMDsKIAotCWlmICghSVNfTklDX0RPV04ocHJpdikpCisJaWYgKHByaXYtPnVwKQogCQlydGw4MTkyX1N3Q2hubF9Xb3JrSXRlbShkZXYpOwogCXByaXYtPlN3Q2hubEluUHJvZ3Jlc3MgPSBmYWxzZTsKIAlyZXR1cm4gdHJ1ZTsKQEAgLTEwODMsOCArMTA3NSw4IEBACiAJCWlmIChwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uIDwgMCkKIAkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAwOwogCi0JCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICIyME0sIHByaXYtPkNDS1ByZXNlbnQiCi0JCQkgIkF0dGVudHVhdGlvbiA9ICVkXG4iLAorCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJICIyME0sIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAlZFxuIiwKIAkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKIAogCQlpZiAocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAxNCAmJgpAQCAtMTEwNSw4ICsxMDk3LDggQEAKIAkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fNDBNZGVmYXVsdCArCiAJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7CiAKLQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIjQwTSwgcHJpdi0+Q0NLUHJlc2VudCIKLQkJCSAiQXR0ZW50dWF0aW9uID0gJWRcbiIsCisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkgIjQwTSwgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9ICVkXG4iLAogCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pOwogCQlpZiAocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA+CiAJCSAgICAoQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aCAtIDEpKQpAQCAtMTE0NiwxNSArMTEzOCwxNSBAQAogCQlpZiAocHJpdi0+UmVjb3JkX0NDS18yME1pbmRleCA9PSAwKQogCQkJcHJpdi0+UmVjb3JkX0NDS18yME1pbmRleCA9IDY7CiAJCXByaXYtPkNDS19pbmRleCA9IHByaXYtPlJlY29yZF9DQ0tfMjBNaW5kZXg7Ci0JCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICIyME1IeiwgQ0NLX1R4X1Bvd2VyX1RyYWNrX0JXXyIKLQkJCSAiU3dpdGNoX1RoZXJtYWxNZXRlcigpLENDS19pbmRleCA9ICVkXG4iLAorCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJICIyME1IeiwgQ0NLX1R4X1Bvd2VyX1RyYWNrX0JXX1N3aXRjaF9UaGVybWFsTWV0ZXIoKSxDQ0tfaW5kZXggPSAlZFxuIiwKIAkJCSBwcml2LT5DQ0tfaW5kZXgpOwogCWJyZWFrOwogCiAJY2FzZSBIVF9DSEFOTkVMX1dJRFRIXzIwXzQwOgogCQlwcml2LT5DQ0tfaW5kZXggPSBwcml2LT5SZWNvcmRfQ0NLXzQwTWluZGV4OwotCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiNDBNSHosIENDS19UeF9Qb3dlcl9UcmFja19CV18iCi0JCQkgIlN3aXRjaF9UaGVybWFsTWV0ZXIoKSwgQ0NLX2luZGV4ID0gJWRcbiIsCisJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkgIjQwTUh6LCBDQ0tfVHhfUG93ZXJfVHJhY2tfQldfU3dpdGNoX1RoZXJtYWxNZXRlcigpLCBDQ0tfaW5kZXggPSAlZFxuIiwKIAkJCSBwcml2LT5DQ0tfaW5kZXgpOwogCWJyZWFrOwogCX0KQEAgLTExNzcsMTYgKzExNjksMTcgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAJdTggcmVnQndPcE1vZGU7CiAKLQlSVF9UUkFDRShDT01QX1NXQlcsICI9PT5ydGw4MTkyX1NldEJXTW9kZVdvcmtJdGVtKCkgIFN3aXRjaCB0byAlcyAiCi0JCSAiYmFuZHdpZHRoXG4iLCBwcml2LT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjAgPwotCQkgIjIwTUh6IiA6ICI0ME1IeiIpOworCVJUX1RSQUNFKENPTVBfU1dCVywKKwkJICI9PT5ydGw4MTkyX1NldEJXTW9kZVdvcmtJdGVtKCkgIFN3aXRjaCB0byAlcyBiYW5kd2lkdGhcbiIsCisJCSBwcml2LT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjAgPworCQkJICIyME1IeiIgOiAiNDBNSHoiKTsKIAogCiAJaWYgKHByaXYtPnJmX2NoaXAgPT0gUkZfUFNFVURPXzExTikgewogCQlwcml2LT5TZXRCV01vZGVJblByb2dyZXNzID0gZmFsc2U7CiAJCXJldHVybjsKIAl9Ci0JaWYgKElTX05JQ19ET1dOKHByaXYpKSB7CisJaWYgKCFwcml2LT51cCkgewogCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCk6IEVSUiEhIGRyaXZlciBpcyBub3QgdXBcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KQEAgLTEyMDQsOCArMTE5Nyw5IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRDaGFubmVsQmFuZHdpZHRoODE5eFVzYigpOiB1bmtub3duICIKLQkJCSAiQmFuZHdpZHRoOiAlI1hcbiIsIHByaXYtPkN1cnJlbnRDaGFubmVsQlcpOworCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCSAiU2V0Q2hhbm5lbEJhbmR3aWR0aDgxOXhVc2IoKTogdW5rbm93biBCYW5kd2lkdGg6ICUjWFxuIiwKKwkJCSBwcml2LT5DdXJyZW50Q2hhbm5lbEJXKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xMjQ1LDggKzEyMzksOSBAQAogCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckZQR0EwX0FuYWxvZ1BhcmFtZXRlcjEsIDB4MDAxMDAwMDAsIDApOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlSVF9UUkFDRShDT01QX0VSUiwgIlNldENoYW5uZWxCYW5kd2lkdGg4MTl4VXNiKCk6IHVua25vd24gIgotCQkJICJCYW5kd2lkdGg6ICUjWFxuIiwgcHJpdi0+Q3VycmVudENoYW5uZWxCVyk7CisJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJICJTZXRDaGFubmVsQmFuZHdpZHRoODE5eFVzYigpOiB1bmtub3duIEJhbmR3aWR0aDogJSNYXG4iLAorCQkJIHByaXYtPkN1cnJlbnRDaGFubmVsQlcpOwogCQlicmVhazsKIAogCX0KQEAgLTEzMDksMTEgKzEzMDQsMTEgQEAKIAl1MzIgQml0TWFzazsKIAl1OCBpbml0aWFsX2dhaW47CiAKLQlpZiAoIUlTX05JQ19ET1dOKHByaXYpKSB7CisJaWYgKHByaXYtPnVwKSB7CiAJCXN3aXRjaCAoT3BlcmF0aW9uKSB7CiAJCWNhc2UgSUdfQmFja3VwOgotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiSUdfQmFja3VwLCBiYWNrdXAgdGhlIGluaXRpYWwiCi0JCQkJICIgZ2Fpbi5cbiIpOworCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLAorCQkJCSAiSUdfQmFja3VwLCBiYWNrdXAgdGhlIGluaXRpYWwgZ2Fpbi5cbiIpOwogCQkJaW5pdGlhbF9nYWluID0gU0NBTl9SWF9JTklUSUFMX0dBSU47CiAJCQlCaXRNYXNrID0gYk1hc2tCeXRlMDsKIAkJCWlmIChkbV9kaWd0YWJsZS5kaWdfYWxnb3JpdGhtID09CkBAIC0xMzM1LDE2ICsxMzMwLDIxIEBACiAJCQlwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhID0gKHU4KXJ0bDgxOTJfUXVlcnlCQlJlZyhkZXYsCiAJCQkJCQkgICAgckNDSzBfQ0NBLCBCaXRNYXNrKTsKIAotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM1MCBpcyIKLQkJCQkgIiAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhhYWdjY29yZTEpOwotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM1OCBpcyIKLQkJCQkgIiAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhiYWdjY29yZTEpOwotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM2MCBpcyIKLQkJCQkgIiAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhjYWdjY29yZTEpOwotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGM2OCBpcyIKLQkJCQkgIiAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLnhkYWdjY29yZTEpOwotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiU2NhbiBJbml0aWFsR2FpbkJhY2t1cCAweGEwYSBpcyIKLQkJCQkgIiAleFxuIiwgcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sCisJCQkJICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzUwIGlzICV4XG4iLAorCQkJCSBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sCisJCQkJICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzU4IGlzICV4XG4iLAorCQkJCSBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sCisJCQkJICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzYwIGlzICV4XG4iLAorCQkJCSBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sCisJCQkJICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YzY4IGlzICV4XG4iLAorCQkJCSBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sCisJCQkJICJTY2FuIEluaXRpYWxHYWluQmFja3VwIDB4YTBhIGlzICV4XG4iLAorCQkJCSBwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhKTsKIAogCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiV3JpdGUgc2NhbiBpbml0aWFsIGdhaW4gPSAweCV4XG4iLAogCQkJCSBpbml0aWFsX2dhaW4pOwpAQCAtMTM1Nyw4ICsxMzU3LDggQEAKIAkJCXdyaXRlX25pY19ieXRlKGRldiwgMHhhMGEsIFBPV0VSX0RFVEVDVElPTl9USCk7CiAJCQlicmVhazsKIAkJY2FzZSBJR19SZXN0b3JlOgotCQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiSUdfUmVzdG9yZSwgcmVzdG9yZSB0aGUgaW5pdGlhbCAiCi0JCQkJICJnYWluLlxuIik7CisJCQlSVF9UUkFDRShDT01QX1NDQU4sCisJCQkJICJJR19SZXN0b3JlLCByZXN0b3JlIHRoZSBpbml0aWFsIGdhaW4uXG4iKTsKIAkJCUJpdE1hc2sgPSAweDdmOwogCQkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19hbGdvcml0aG0gPT0KIAkJCSAgICBESUdfQUxHT19CWV9GQUxTRV9BTEFSTSkKQEAgLTEzNzYsMTYgKzEzNzYsMjEgQEAKIAkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9DQ0EsIEJpdE1hc2ssCiAJCQkJCSAodTMyKXByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOwogCi0JCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzUwIgotCQkJCSAiIGlzICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGFhZ2Njb3JlMSk7Ci0JCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzU4IgotCQkJCSAiIGlzICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGJhZ2Njb3JlMSk7Ci0JCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzYwIgotCQkJCSAiIGlzICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGNhZ2Njb3JlMSk7Ci0JCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YzY4IgotCQkJCSAiIGlzICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAueGRhZ2Njb3JlMSk7Ci0JCQlSVF9UUkFDRShDT01QX1NDQU4sICJTY2FuIEJCSW5pdGlhbEdhaW5SZXN0b3JlIDB4YTBhIgotCQkJCSAiIGlzICV4XG4iLCBwcml2LT5pbml0Z2Fpbl9iYWNrdXAuY2NhKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwKKwkJCQkgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNTAgaXMgJXhcbiIsCisJCQkJIHByaXYtPmluaXRnYWluX2JhY2t1cC54YWFnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwKKwkJCQkgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNTggaXMgJXhcbiIsCisJCQkJIHByaXYtPmluaXRnYWluX2JhY2t1cC54YmFnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwKKwkJCQkgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNjAgaXMgJXhcbiIsCisJCQkJIHByaXYtPmluaXRnYWluX2JhY2t1cC54Y2FnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwKKwkJCQkgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhjNjggaXMgJXhcbiIsCisJCQkJIHByaXYtPmluaXRnYWluX2JhY2t1cC54ZGFnY2NvcmUxKTsKKwkJCVJUX1RSQUNFKENPTVBfU0NBTiwKKwkJCQkgIlNjYW4gQkJJbml0aWFsR2FpblJlc3RvcmUgMHhhMGEgaXMgJXhcbiIsCisJCQkJIHByaXYtPmluaXRnYWluX2JhY2t1cC5jY2EpOwogCiAJCQlydGw4MTkyX3BoeV9zZXRUeFBvd2VyKGRldiwKIAkJCQkJIHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwpOwpAQCAtMTQ0Nyw4ICsxNDUyLDggQEAKIAkJCQl9IHdoaWxlICghcnRzdGF0dXMgJiYgKEluaXRpbGl6ZUNvdW50ID4gMCkpOwogCiAJCQkJaWYgKCFydHN0YXR1cykgewotCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCk6SW5pdGlhbGl6ZSBBZGEiCi0JCQkJCQkgInB0ZXIgZmFpbCxyZXR1cm5cbiIsCisJCQkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCQkJICIlcygpOkluaXRpYWxpemUgQWRhcHRlciBmYWlsLHJldHVyblxuIiwKIAkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJCXByaXYtPlNldFJGUG93ZXJTdGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTQ5MiwxOSArMTQ5NywxNiBAQAogCQkJCQlRdWV1ZUlEKys7CiAJCQkJCWNvbnRpbnVlOwogCQkJCX0gZWxzZSB7Ci0JCQkJCVJUX1RSQUNFKChDT01QX1BPV0VSfENPTVBfUkYpLCAiZVJmIE9mZiIKLQkJCQkJCSAiL1NsZWVwOiAlZCB0aW1lcyBUY2JCdXN5UXVldWUiCi0JCQkJCQkgIlslZF0gIT0wIGJlZm9yZSBkb3plIVxuIiwKKwkJCQkJUlRfVFJBQ0UoKENPTVBfUE9XRVJ8Q09NUF9SRiksCisJCQkJCQkgImVSZiBPZmYvU2xlZXA6ICVkIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIT0wIGJlZm9yZSBkb3plIVxuIiwKIAkJCQkJCSAoaSsxKSwgUXVldWVJRCk7CiAJCQkJCXVkZWxheSgxMCk7CiAJCQkJCWkrKzsKIAkJCQl9CiAKIAkJCQlpZiAoaSA+PSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzl4KSB7Ci0JCQkJCVJUX1RSQUNFKENPTVBfUE9XRVIsICJcblxuXG4gVGltZU91dCEhICIKLQkJCQkJCSAiU2V0UkZQb3dlclN0YXRlODE5MCgpOiBlUmZPZmYiCi0JCQkJCQkgIjogJWQgdGltZXMgVGNiQnVzeVF1ZXVlWyVkXSAiCi0JCQkJCQkgIiE9IDAgISEhXG4iLAorCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSLAorCQkJCQkJICJcblxuXG4gVGltZU91dCEhIFNldFJGUG93ZXJTdGF0ZTgxOTAoKTogZVJmT2ZmOiAlZCB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICE9IDAgISEhXG4iLAogCQkJCQkJIE1BWF9ET1pFX1dBSVRJTkdfVElNRVNfOXgsCiAJCQkJCQkgUXVldWVJRCk7CiAJCQkJCWJyZWFrOwpAQCAtMTUxNCw4ICsxNTE2LDggQEAKIAkJCWJyZWFrOwogCiAJCWNhc2UgZVJmT2ZmOgotCQkJUlRfVFJBQ0UoQ09NUF9QUywgIlNldFJGUG93ZXJTdGF0ZTgxOTAoKSBlUmZPZmYvIgotCQkJCSAiU2xlZXAgIVxuIik7CisJCQlSVF9UUkFDRShDT01QX1BTLAorCQkJCSAiU2V0UkZQb3dlclN0YXRlODE5MCgpIGVSZk9mZi9TbGVlcCAhXG4iKTsKIAogCQkJZm9yIChRdWV1ZUlEID0gMCwgaSA9IDA7IFF1ZXVlSUQgPCBNQVhfVFhfUVVFVUU7ICkgewogCQkJCXJpbmcgPSAmcHJpdi0+dHhfcmluZ1tRdWV1ZUlEXTsKQEAgLTE1MjQsMTkgKzE1MjYsMTYgQEAKIAkJCQkJUXVldWVJRCsrOwogCQkJCQljb250aW51ZTsKIAkJCQl9IGVsc2UgewotCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSLCAiZVJmIE9mZi9TbGVlcDogJWQiCi0JCQkJCQkgIiB0aW1lcyBUY2JCdXN5UXVldWVbJWRdICE9MCBiIgotCQkJCQkJICJlZm9yZSBkb3plIVxuIiwgKGkrMSksCi0JCQkJCQkgUXVldWVJRCk7CisJCQkJCVJUX1RSQUNFKENPTVBfUE9XRVIsCisJCQkJCQkgImVSZiBPZmYvU2xlZXA6ICVkIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIT0wIGJlZm9yZSBkb3plIVxuIiwKKwkJCQkJCSAoaSsxKSwgUXVldWVJRCk7CiAJCQkJCXVkZWxheSgxMCk7CiAJCQkJCWkrKzsKIAkJCQl9CiAKIAkJCQlpZiAoaSA+PSBNQVhfRE9aRV9XQUlUSU5HX1RJTUVTXzl4KSB7Ci0JCQkJCVJUX1RSQUNFKENPTVBfUE9XRVIsICJcblxuXG4gU2V0WmVicmE6ICIKLQkJCQkJCSAiUkZQb3dlclN0YXRlODE4NUIoKTogZVJmT2ZmOiIKLQkJCQkJCSAiICVkIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIgotCQkJCQkJICIhPSAwICEhIVxuIiwKKwkJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUiwKKwkJCQkJCSAiXG5cblxuIFNldFplYnJhOiBSRlBvd2VyU3RhdGU4MTg1QigpOiBlUmZPZmY6ICVkIHRpbWVzIFRjYkJ1c3lRdWV1ZVslZF0gIT0gMCAhISFcbiIsCiAJCQkJCQkgTUFYX0RPWkVfV0FJVElOR19USU1FU185eCwKIAkJCQkJCSBRdWV1ZUlEKTsKIAkJCQkJYnJlYWs7CkBAIC0xNTU2LDggKzE1NTUsOSBAQAogCiAJCWRlZmF1bHQ6CiAJCQliUmVzdWx0ID0gZmFsc2U7Ci0JCQlSVF9UUkFDRShDT01QX0VSUiwgIlNldFJGUG93ZXJTdGF0ZTgxOTAoKTogdW5rbm93biBzdGF0ZSIKLQkJCQkgIiB0byBzZXQ6IDB4JVghISFcbiIsIGVSRlBvd2VyU3RhdGUpOworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJICJTZXRSRlBvd2VyU3RhdGU4MTkwKCk6IHVua25vd24gc3RhdGUgdG8gc2V0OiAweCVYISEhXG4iLAorCQkJCSBlUkZQb3dlclN0YXRlKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTE1NzYsOCArMTU3Niw4IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJTZXRSRlBvd2VyU3RhdGU4MTkwKCk6IFVua25vd24gIgotCQkJCSAiUkYgdHlwZVxuIik7CisJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkgIlNldFJGUG93ZXJTdGF0ZTgxOTAoKTogVW5rbm93biBSRiB0eXBlXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTU5OSw4ICsxNTk5LDggQEAKIAkJIGVSRlBvd2VyU3RhdGUpOwogCWlmIChlUkZQb3dlclN0YXRlID09IHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZSAmJgogCSAgICBwcml2LT5iSHdSZk9mZkFjdGlvbiA9PSAwKSB7Ci0JCVJUX1RSQUNFKENPTVBfUFMsICI8LS0tLS0tLS0tIFNldFJGUG93ZXJTdGF0ZSgpOiBkaXNjYXJkIHRoZSAiCi0JCQkgInJlcXVlc3QgZm9yIGVSRlBvd2VyU3RhdGUoJWQpIGlzIHRoZSBzYW1lLlxuIiwKKwkJUlRfVFJBQ0UoQ09NUF9QUywKKwkJCSAiPC0tLS0tLS0tLSBTZXRSRlBvd2VyU3RhdGUoKTogZGlzY2FyZCB0aGUgcmVxdWVzdCBmb3IgZVJGUG93ZXJTdGF0ZSglZCkgaXMgdGhlIHNhbWUuXG4iLAogCQkJIGVSRlBvd2VyU3RhdGUpOwogCQlyZXR1cm4gYlJlc3VsdDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOXhFX3BoeXJlZy5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3I4MTl4RV9waHlyZWcuaAppbmRleCA5NzAyOThiLi4wM2VlZTNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcjgxOXhFX3BoeXJlZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9yODE5eEVfcGh5cmVnLmgKQEAgLTg4OCwxMyArODg4LDYgQEAKICNkZWZpbmUgYk9GRE1QSFkwX0VuZCAgICAgICAgICAgICAweGNmZgogI2RlZmluZSBiT0ZETVBIWTFfRW5kICAgICAgICAgICAgIDB4ZGZmCiAKLS8qI2RlZmluZSBtYXggZGVidWcgaXRlbSBpbiBlYWNoIGRlYnVnIHBhZ2UKLSNkZWZpbmUgYk1heEl0ZW1fRlBHQV9QSFkwICAgICAgICAweDkKLSNkZWZpbmUgYk1heEl0ZW1fRlBHQV9QSFkxICAgICAgICAweDMKLSNkZWZpbmUgYk1heEl0ZW1fUEhZXzExQiAgICAgICAgICAweDE2Ci0jZGVmaW5lIGJNYXhJdGVtX09GRE1fUEhZMCAgICAgICAgMHgyOQotI2RlZmluZSBiTWF4SXRlbV9PRkRNX1BIWTEgICAgICAgIDB4MCAqLwotCiAjZGVmaW5lIGJQTUFDQ29udHJvbCAgICAgICAgICAgICAgMHgwCiAjZGVmaW5lIGJXTUFDQ29udHJvbCAgICAgICAgICAgICAgMHgxCiAjZGVmaW5lIGJXTklDQ29udHJvbCAgICAgICAgICAgICAgMHgyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NhbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9jYW0uYwppbmRleCA4OWVhNzBiLi40MWIwMjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NhbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY2FtLmMKQEAgLTg2LDkgKzg2LDkgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBwcml2LT5ydGxsaWI7CiAKLQlSVF9UUkFDRShDT01QX0RCRywgIj09PT09PT09PT09PiVzKCk6RW50cnlObyBpcyAlZCxLZXlJbmRleCBpcyAiCi0JCSAiJWQsS2V5VHlwZSBpcyAlZCxpc19tZXNoIGlzICVkXG4iLCBfX2Z1bmNfXywgRW50cnlObywKLQkJIEtleUluZGV4LCBLZXlUeXBlLCBpc19tZXNoKTsKKwlSVF9UUkFDRShDT01QX0RCRywKKwkJICI9PT09PT09PT09PT4lcygpOkVudHJ5Tm8gaXMgJWQsS2V5SW5kZXggaXMgJWQsS2V5VHlwZSBpcyAlZCxpc19tZXNoIGlzICVkXG4iLAorCQkgX19mdW5jX18sIEVudHJ5Tm8sIEtleUluZGV4LCBLZXlUeXBlLCBpc19tZXNoKTsKIAlpZiAoIWlzX21lc2gpIHsKIAkJaWVlZS0+c3djYW10YWJsZVtFbnRyeU5vXS5idXNlZCA9IHRydWU7CiAJCWllZWUtPnN3Y2FtdGFibGVbRW50cnlOb10ua2V5X2luZGV4ID0gS2V5SW5kZXg7CkBAIC0xMTUsMjEgKzExNSwyMCBAQAogCQkJaWYgKHByaXYtPnJ0bGxpYi0+UmZPZmZSZWFzb24gPiBSRl9DSEFOR0VfQllfSVBTKSB7CiAJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOiBSRiBpcyBPRkYuXG4iLAogCQkJCQlfX2Z1bmNfXyk7Ci0JCQkJcmV0dXJuIDsKLQkJCX0gZWxzZSB7Ci0JCQkJZG93bigmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKLQkJCQlJUFNMZWF2ZShkZXYpOwotCQkJCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOworCQkJCXJldHVybjsKIAkJCX0KKwkJCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQlJUFNMZWF2ZShkZXYpOworCQkJdXAoJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CiAJCX0KIAl9CiAJcHJpdi0+cnRsbGliLT5pc19zZXRfa2V5ID0gdHJ1ZTsKIAlpZiAoRW50cnlObyA+PSBUT1RBTF9DQU1fRU5UUlkpCiAJCVJUX1RSQUNFKENPTVBfRVJSLCAiY2FtIGVudHJ5IGV4Y2VlZHMgaW4gc2V0S2V5KClcbiIpOwogCi0JUlRfVFJBQ0UoQ09NUF9TRUMsICI9PT09PnRvIHNldEtleSgpLCBkZXY6JXAsIEVudHJ5Tm86JWQsIEtleUluZGV4OiVkLCIKLQkJICJLZXlUeXBlOiVkLCBNYWNBZGRyICVwTVxuIiwgZGV2LCBFbnRyeU5vLCBLZXlJbmRleCwKLQkJIEtleVR5cGUsIE1hY0FkZHIpOworCVJUX1RSQUNFKENPTVBfU0VDLAorCQkgIj09PT0+dG8gc2V0S2V5KCksIGRldjolcCwgRW50cnlObzolZCwgS2V5SW5kZXg6JWQsS2V5VHlwZTolZCwgTWFjQWRkciAlcE1cbiIsCisJCSBkZXYsIEVudHJ5Tm8sIEtleUluZGV4LCBLZXlUeXBlLCBNYWNBZGRyKTsKIAogCWlmIChEZWZhdWx0S2V5KQogCQl1c0NvbmZpZyB8PSBCSVQxNSB8IChLZXlUeXBlPDwyKTsKQEAgLTE5Miw3ICsxOTEsNyBAQAogCQlmb3IgKEVudHJ5SWQgPSAwOyBFbnRyeUlkIDwgNDsgRW50cnlJZCsrKSB7CiAJCQlNYWNBZGRyID0gQ0FNX0NPTlNUX0FERFJbRW50cnlJZF07CiAJCQlpZiAocHJpdi0+cnRsbGliLT5zd2NhbXRhYmxlW0VudHJ5SWRdLmJ1c2VkKSB7Ci0JCQkJc2V0S2V5KGRldiwgRW50cnlJZCAsIEVudHJ5SWQsCisJCQkJc2V0S2V5KGRldiwgRW50cnlJZCwgRW50cnlJZCwKIAkJCQkgICAgICAgcHJpdi0+cnRsbGliLT5wYWlyd2lzZV9rZXlfdHlwZSwgTWFjQWRkciwKIAkJCQkgICAgICAgMCwgKHUzMiAqKSgmcHJpdi0+cnRsbGliLT5zd2NhbXRhYmxlCiAJCQkJICAgICAgW0VudHJ5SWRdLmtleV9idWZbMF0pKTsKQEAgLTI0NCw4ICsyNDMsOCBAQAogCQkJCSAgICAgICAodTMyICopKCZwcml2LT5ydGxsaWItPnN3Y2FtdGFibGVbMF0ua2V5X2J1ZlswXSkKIAkJCQkgICAgICk7CiAJCQl9IGVsc2UgewotCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiPT09PiVzKCk6RVJSISEgQURIT0MgVEtJUCAiCi0JCQkJCSAiLGJ1dCAwIGVudHJ5IGlzIGhhdmUgbm8gZGF0YVxuIiwKKwkJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkJICI9PT0+JXMoKTpFUlIhISBBREhPQyBUS0lQICxidXQgMCBlbnRyeSBpcyBoYXZlIG5vIGRhdGFcbiIsCiAJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJcmV0dXJuOwogCQkJfQpAQCAtMjU0LDcgKzI1Myw3IEBACiAJCU1hY0FkZHIgPSBDQU1fQ09OU1RfQlJPQUQ7CiAJCWZvciAoRW50cnlJZCA9IDE7IEVudHJ5SWQgPCA0OyBFbnRyeUlkKyspIHsKIAkJCWlmIChwcml2LT5ydGxsaWItPnN3Y2FtdGFibGVbRW50cnlJZF0uYnVzZWQpIHsKLQkJCQlzZXRLZXkoZGV2LCBFbnRyeUlkICwgRW50cnlJZCwKKwkJCQlzZXRLZXkoZGV2LCBFbnRyeUlkLCBFbnRyeUlkLAogCQkJCSAgICAgICBwcml2LT5ydGxsaWItPmdyb3VwX2tleV90eXBlLAogCQkJCSAgICAgICBNYWNBZGRyLCAwLAogCQkJCSAgICAgICAodTMyICopKCZwcml2LT5ydGxsaWItPnN3Y2FtdGFibGVbRW50cnlJZF0ua2V5X2J1ZlswXSkpOwpAQCAtMjYzLDEzICsyNjIsMTMgQEAKIAogCQlpZiAocHJpdi0+cnRsbGliLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKIAkJCWlmIChwcml2LT5ydGxsaWItPnN3Y2FtdGFibGVbMF0uYnVzZWQpIHsKLQkJCQlzZXRLZXkoZGV2LCAwICwgMCwKKwkJCQlzZXRLZXkoZGV2LCAwLCAwLAogCQkJCQlwcml2LT5ydGxsaWItPmdyb3VwX2tleV90eXBlLAogCQkJCQlDQU1fQ09OU1RfQUREUlswXSwgMCwKIAkJCQkJKHUzMiAqKSgmcHJpdi0+cnRsbGliLT5zd2NhbXRhYmxlWzBdLmtleV9idWZbMF0pKTsKIAkJCX0gZWxzZSB7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICI9PT0+JXMoKTpFUlIhISBBREhPQyBDQ01QICwiCi0JCQkJCSAiYnV0IDAgZW50cnkgaXMgaGF2ZSBubyBkYXRhXG4iLAorCQkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCQkgIj09PT4lcygpOkVSUiEhIEFESE9DIENDTVAgLGJ1dCAwIGVudHJ5IGlzIGhhdmUgbm8gZGF0YVxuIiwKIAkJCQkJIF9fZnVuY19fKTsKIAkJCQlyZXR1cm47CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY29yZS5jCmluZGV4IDU2MTVjODAuLjM1MmQzODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY29yZS5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAogdm9pZCB3cml0ZV9uaWNfaW9fYnl0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTggeSkKIHsKLQl1MzIgdTRiUGFnZSA9ICh4ID4+IDgpOworCXUzMiB1NGJQYWdlID0geCA+PiA4OwogCXU4IHUxUGFnZU1hc2sgPSAwOwogCWJvb2wJYklzTGVnYWxQYWdlID0gZmFsc2U7CiAKQEAgLTE1NCw3ICsxNTQsNyBAQAogCiB2b2lkIHdyaXRlX25pY19pb193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LCB1MTYgeSkKIHsKLQl1MzIgdTRiUGFnZSA9ICh4ID4+IDgpOworCXUzMiB1NGJQYWdlID0geCA+PiA4OwogCXU4IHUxUGFnZU1hc2sgPSAwOwogCWJvb2wJYklzTGVnYWxQYWdlID0gZmFsc2U7CiAKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCiB2b2lkIHdyaXRlX25pY19pb19kd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCwgdTMyIHkpCiB7Ci0JdTMyIHU0YlBhZ2UgPSAoeCA+PiA4KTsKKwl1MzIgdTRiUGFnZSA9IHggPj4gODsKIAl1OCB1MVBhZ2VNYXNrID0gMDsKIAlib29sCWJJc0xlZ2FsUGFnZSA9IGZhbHNlOwogCkBAIC0xOTksMjQgKzE5OSwyMyBAQAogCiB1OCByZWFkX25pY19pb19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KQogewotCXUzMiB1NGJQYWdlID0gKHggPj4gOCk7CisJdTMyIHU0YlBhZ2UgPSB4ID4+IDg7CiAJdTggdTFQYWdlTWFzayA9IDA7CiAJYm9vbAliSXNMZWdhbFBhZ2UgPSBmYWxzZTsKIAl1OAlEYXRhID0gMDsKIAotCWlmICh1NGJQYWdlID09IDApIHsKKwlpZiAodTRiUGFnZSA9PSAwKQogCQlyZXR1cm4gMHhmZiZpbmIoZGV2LT5iYXNlX2FkZHIgKyB4KTsKLQl9IGVsc2UgewotCQliSXNMZWdhbFBhZ2UgPSBQbGF0Zm9ybUlPQ2hlY2tQYWdlTGVnYWxBbmRHZXRSZWdNYXNrKHU0YlBhZ2UsCi0JCQkJCQkJJnUxUGFnZU1hc2spOwotCQlpZiAoYklzTGVnYWxQYWdlKSB7Ci0JCQl1OCB1MWJQc3IgPSByZWFkX25pY19pb19ieXRlKGRldiwgUFNSKTsKIAotCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICgodTFiUHNyICYgdTFQYWdlTWFzaykgfAotCQkJCQkgICh1OCl1NGJQYWdlKSk7Ci0JCQlEYXRhID0gcmVhZF9uaWNfaW9fYnl0ZShkZXYsICh4ICYgMHhmZikpOwotCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICh1MWJQc3IgJiB1MVBhZ2VNYXNrKSk7Ci0JCX0KKwliSXNMZWdhbFBhZ2UgPSBQbGF0Zm9ybUlPQ2hlY2tQYWdlTGVnYWxBbmRHZXRSZWdNYXNrKHU0YlBhZ2UsCisJCQkJCQkJICAgICAmdTFQYWdlTWFzayk7CisJaWYgKGJJc0xlZ2FsUGFnZSkgeworCQl1OCB1MWJQc3IgPSByZWFkX25pY19pb19ieXRlKGRldiwgUFNSKTsKKworCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKCh1MWJQc3IgJiB1MVBhZ2VNYXNrKSB8CisJCQkJICAodTgpdTRiUGFnZSkpOworCQlEYXRhID0gcmVhZF9uaWNfaW9fYnl0ZShkZXYsICh4ICYgMHhmZikpOworCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKHUxYlBzciAmIHUxUGFnZU1hc2spKTsKIAl9CiAKIAlyZXR1cm4gRGF0YTsKQEAgLTIyNCwyNSArMjIzLDIyIEBACiAKIHUxNiByZWFkX25pY19pb193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KQogewotCXUzMiB1NGJQYWdlID0gKHggPj4gOCk7CisJdTMyIHU0YlBhZ2UgPSB4ID4+IDg7CiAJdTggdTFQYWdlTWFzayA9IDA7CiAJYm9vbAliSXNMZWdhbFBhZ2UgPSBmYWxzZTsKIAl1MTYJRGF0YSA9IDA7CiAKLQlpZiAodTRiUGFnZSA9PSAwKSB7CisJaWYgKHU0YlBhZ2UgPT0gMCkKIAkJcmV0dXJuIGludyhkZXYtPmJhc2VfYWRkciArIHgpOwotCX0gZWxzZSB7Ci0JCWJJc0xlZ2FsUGFnZSA9IFBsYXRmb3JtSU9DaGVja1BhZ2VMZWdhbEFuZEdldFJlZ01hc2sodTRiUGFnZSwKLQkJCSAgICAgICAmdTFQYWdlTWFzayk7Ci0JCWlmIChiSXNMZWdhbFBhZ2UpIHsKLQkJCXU4IHUxYlBzciA9IHJlYWRfbmljX2lvX2J5dGUoZGV2LCBQU1IpOworCWJJc0xlZ2FsUGFnZSA9IFBsYXRmb3JtSU9DaGVja1BhZ2VMZWdhbEFuZEdldFJlZ01hc2sodTRiUGFnZSwKKwkJCQkJCQkgICAgICZ1MVBhZ2VNYXNrKTsKKwlpZiAoYklzTGVnYWxQYWdlKSB7CisJCXU4IHUxYlBzciA9IHJlYWRfbmljX2lvX2J5dGUoZGV2LCBQU1IpOwogCi0JCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKCh1MWJQc3IgJiB1MVBhZ2VNYXNrKSB8Ci0JCQkJCSAgKHU4KXU0YlBhZ2UpKTsKLQkJCURhdGEgPSByZWFkX25pY19pb193b3JkKGRldiwgKHggJiAweGZmKSk7Ci0JCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKHUxYlBzciAmIHUxUGFnZU1hc2spKTsKLQotCQl9CisJCXdyaXRlX25pY19pb19ieXRlKGRldiwgUFNSLCAoKHUxYlBzciAmIHUxUGFnZU1hc2spIHwKKwkJCQkgICh1OCl1NGJQYWdlKSk7CisJCURhdGEgPSByZWFkX25pY19pb193b3JkKGRldiwgKHggJiAweGZmKSk7CisJCXdyaXRlX25pY19pb19ieXRlKGRldiwgUFNSLCAodTFiUHNyICYgdTFQYWdlTWFzaykpOwogCX0KIAogCXJldHVybiBEYXRhOwpAQCAtMjUwLDI1ICsyNDYsMjIgQEAKIAogdTMyIHJlYWRfbmljX2lvX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KQogewotCXUzMiB1NGJQYWdlID0gKHggPj4gOCk7CisJdTMyIHU0YlBhZ2UgPSB4ID4+IDg7CiAJdTggdTFQYWdlTWFzayA9IDA7CiAJYm9vbAliSXNMZWdhbFBhZ2UgPSBmYWxzZTsKIAl1MzIJRGF0YSA9IDA7CiAKLQlpZiAodTRiUGFnZSA9PSAwKSB7CisJaWYgKHU0YlBhZ2UgPT0gMCkKIAkJcmV0dXJuIGlubChkZXYtPmJhc2VfYWRkciArIHgpOwotCX0gZWxzZSB7Ci0JCWJJc0xlZ2FsUGFnZSA9IFBsYXRmb3JtSU9DaGVja1BhZ2VMZWdhbEFuZEdldFJlZ01hc2sodTRiUGFnZSwKLQkJCSAgICAgICAmdTFQYWdlTWFzayk7Ci0JCWlmIChiSXNMZWdhbFBhZ2UpIHsKLQkJCXU4IHUxYlBzciA9IHJlYWRfbmljX2lvX2J5dGUoZGV2LCBQU1IpOworCWJJc0xlZ2FsUGFnZSA9IFBsYXRmb3JtSU9DaGVja1BhZ2VMZWdhbEFuZEdldFJlZ01hc2sodTRiUGFnZSwKKwkJICAgICAgICZ1MVBhZ2VNYXNrKTsKKwlpZiAoYklzTGVnYWxQYWdlKSB7CisJCXU4IHUxYlBzciA9IHJlYWRfbmljX2lvX2J5dGUoZGV2LCBQU1IpOwogCi0JCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKCh1MWJQc3IgJiB1MVBhZ2VNYXNrKSB8Ci0JCQkJCSAgKHU4KXU0YlBhZ2UpKTsKLQkJCURhdGEgPSByZWFkX25pY19pb19kd29yZChkZXYsICh4ICYgMHhmZikpOwotCQkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICh1MWJQc3IgJiB1MVBhZ2VNYXNrKSk7Ci0KLQkJfQorCQl3cml0ZV9uaWNfaW9fYnl0ZShkZXYsIFBTUiwgKCh1MWJQc3IgJiB1MVBhZ2VNYXNrKSB8CisJCQkJICAodTgpdTRiUGFnZSkpOworCQlEYXRhID0gcmVhZF9uaWNfaW9fZHdvcmQoZGV2LCAoeCAmIDB4ZmYpKTsKKwkJd3JpdGVfbmljX2lvX2J5dGUoZGV2LCBQU1IsICh1MWJQc3IgJiB1MVBhZ2VNYXNrKSk7CiAJfQogCiAJcmV0dXJuIERhdGE7CkBAIC0zMjYsOCArMzE5LDggQEAKIAl1MTYJCQlSRldhaXRDb3VudGVyID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWc7CiAKLQlSVF9UUkFDRSgoQ09NUF9QUyB8IENPTVBfUkYpLCAiPT09Pk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogIgotCQkgIlN0YXRlVG9TZXQoJWQpXG4iLCBTdGF0ZVRvU2V0KTsKKwlSVF9UUkFDRSgoQ09NUF9QUyB8IENPTVBfUkYpLAorCQkgIj09PT5NZ250QWN0U2V0X1JGX1N0YXRlKCk6IFN0YXRlVG9TZXQoJWQpXG4iLCBTdGF0ZVRvU2V0KTsKIAogCVByb3RlY3RPck5vdCA9IGZhbHNlOwogCkBAIC0zMzgsMjIgKzMzMSwxOSBAQAogCQkJaWYgKHByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcykgewogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWcpOwogCQkJCVJUX1RSQUNFKChDT01QX1BTIHwgQ09NUF9SRiksCi0JCQkJCSAiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBSRiBDaGFuZ2UgaW4gIgotCQkJCQkgInByb2dyZXNzISBXYWl0IHRvIHNldC4uU3RhdGVUb1NldCIKLQkJCQkJICIoJWQpLlxuIiwgU3RhdGVUb1NldCk7CisJCQkJCSAiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBSRiBDaGFuZ2UgaW4gcHJvZ3Jlc3MhIFdhaXQgdG8gc2V0Li5TdGF0ZVRvU2V0KCVkKS5cbiIsCisJCQkJCSBTdGF0ZVRvU2V0KTsKIAogCQkJCXdoaWxlIChwcml2LT5SRkNoYW5nZUluUHJvZ3Jlc3MpIHsKIAkJCQkJUkZXYWl0Q291bnRlcisrOwogCQkJCQlSVF9UUkFDRSgoQ09NUF9QUyB8IENPTVBfUkYpLAotCQkJCQkJICJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IFdhaXQgMSIKLQkJCQkJCSAiIG1zICglZCB0aW1lcykuLi5cbiIsCisJCQkJCQkgIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogV2FpdCAxIG1zICglZCB0aW1lcykuLi5cbiIsCiAJCQkJCQkgUkZXYWl0Q291bnRlcik7CiAJCQkJCW1kZWxheSgxKTsKIAogCQkJCQlpZiAoUkZXYWl0Q291bnRlciA+IDEwMCkgewotCQkJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJNZ250QWN0U2V0XyIKLQkJCQkJCQkgIlJGX1N0YXRlKCk6IFdhaXQgdG9vICIKLQkJCQkJCQkgImxvZ24gdG8gc2V0IFJGXG4iKTsKKwkJCQkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCQkJCSAiTWdudEFjdFNldF9SRl9TdGF0ZSgpOiBXYWl0IHRvbyBsb2duIHRvIHNldCBSRlxuIik7CiAJCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQkJCX0KIAkJCQl9CkBAIC0zODMsOSArMzczLDggQEAKIAkJCSAgICBDaGFuZ2VTb3VyY2UgPj0gUkZfQ0hBTkdFX0JZX0hXKQogCQkJCWJDb25uZWN0QnlTU0lEID0gdHJ1ZTsKIAkJfSBlbHNlIHsKLQkJCVJUX1RSQUNFKChDT01QX1BTIHwgQ09NUF9SRiksICJNZ250QWN0U2V0X1JGX1N0YXRlIC0gIgotCQkJCSAiZVJmb24gcmVqZWN0IHBNZ250SW5mby0+UmZPZmZSZWFzb249IDB4JXgsIgotCQkJCSAiIENoYW5nZVNvdXJjZT0weCVYXG4iLAorCQkJUlRfVFJBQ0UoKENPTVBfUFMgfCBDT01QX1JGKSwKKwkJCQkgIk1nbnRBY3RTZXRfUkZfU3RhdGUgLSBlUmZvbiByZWplY3QgcE1nbnRJbmZvLT5SZk9mZlJlYXNvbj0gMHgleCwgQ2hhbmdlU291cmNlPTB4JVhcbiIsCiAJCQkJICBwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uLCBDaGFuZ2VTb3VyY2UpOwogCX0KIApAQCAtNDIxLDggKzQxMCw4IEBACiAJfQogCiAJaWYgKGJBY3Rpb25BbGxvd2VkKSB7Ci0JCVJUX1RSQUNFKChDT01QX1BTIHwgQ09NUF9SRiksICJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IEFjdGlvbiBpcyIKLQkJCSAiIGFsbG93ZWQuLi4uIFN0YXRlVG9TZXQoJWQpLCBSZk9mZlJlYXNvbiglI1gpXG4iLAorCQlSVF9UUkFDRSgoQ09NUF9QUyB8IENPTVBfUkYpLAorCQkJICJNZ250QWN0U2V0X1JGX1N0YXRlKCk6IEFjdGlvbiBpcyBhbGxvd2VkLi4uLiBTdGF0ZVRvU2V0KCVkKSwgUmZPZmZSZWFzb24oJSNYKVxuIiwKIAkJCSBTdGF0ZVRvU2V0LCBwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uKTsKIAkJUEhZX1NldFJGUG93ZXJTdGF0ZShkZXYsIFN0YXRlVG9TZXQpOwogCQlpZiAoU3RhdGVUb1NldCA9PSBlUmZPbikgewpAQCAtNDM0LDEwICs0MjMsOSBAQAogCQkJfQogCQl9CiAJfSBlbHNlIHsKLQkJUlRfVFJBQ0UoKENPTVBfUFMgfCBDT01QX1JGKSwgIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogIgotCQkJICJBY3Rpb24gaXMgcmVqZWN0ZWQuLi4uIFN0YXRlVG9TZXQoJWQpLCBDaGFuZ2VTb3VyY2UiCi0JCQkgIiglI1gpLCBSZk9mZlJlYXNvbiglI1gpXG4iLCBTdGF0ZVRvU2V0LCBDaGFuZ2VTb3VyY2UsCi0JCQkgcHJpdi0+cnRsbGliLT5SZk9mZlJlYXNvbik7CisJCVJUX1RSQUNFKChDT01QX1BTIHwgQ09NUF9SRiksCisJCQkgIk1nbnRBY3RTZXRfUkZfU3RhdGUoKTogQWN0aW9uIGlzIHJlamVjdGVkLi4uLiBTdGF0ZVRvU2V0KCVkKSwgQ2hhbmdlU291cmNlKCUjWCksIFJmT2ZmUmVhc29uKCUjWClcbiIsCisJCQkgU3RhdGVUb1NldCwgQ2hhbmdlU291cmNlLCBwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uKTsKIAl9CiAKIAlpZiAoIVByb3RlY3RPck5vdCkgewpAQCAtNDYwLDkgKzQ0OCw5IEBACiAJKiBiZXR3ZWVuIHRoZSB0YWlsIGFuZCB0aGUgaGVhZAogCSovCiAJaWYgKChwcmlvID09IE1HTlRfUVVFVUUpICYmIChza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkgPiAxMCkpCi0JCVJUX1RSQUNFKENPTVBfREJHLCAiLS0tLS1bJWRdLS0tLS0tLS0tcmluZy0+aWR4PSVkICIKLQkJCSAicXVldWVfbGVuPSVkLS0tLS0tLS0tXG4iLCBwcmlvLCByaW5nLT5pZHgsCi0JCQkgc2tiX3F1ZXVlX2xlbigmcmluZy0+cXVldWUpKTsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsCisJCQkgIi0tLS0tWyVkXS0tLS0tLS0tLXJpbmctPmlkeD0lZCBxdWV1ZV9sZW49JWQtLS0tLS0tLS1cbiIsCisJCQkgcHJpbywgcmluZy0+aWR4LCBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpOwogCXJldHVybiBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSk7CiB9CiAKQEAgLTQ4MSw3ICs0NjksNyBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAogCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dxKTsKLQlwcmludGsoS0VSTl9JTkZPICJUWFRJTUVPVVQiKTsKKwluZXRkZXZfaW5mbyhkZXYsICJUWFRJTUVPVVQiKTsKIH0KIAogdm9pZCBydGw4MTkyX2lycV9lbmFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTUyNiw4ICs1MTQsOSBAQAogCQlpZiAocHJpdi0+ZG90MTFDdXJyZW50UHJlYW1ibGVNb2RlICE9IFBSRUFNQkxFX1NIT1JUKSB7CiAJCQlTaG9ydFByZWFtYmxlID0gdHJ1ZTsKIAkJCXByaXYtPmRvdDExQ3VycmVudFByZWFtYmxlTW9kZSA9IFBSRUFNQkxFX1NIT1JUOwotCQkJUlRfVFJBQ0UoQ09NUF9EQkcsICIlcygpOiBXTEFOX0NBUEFCSUxJVFlfU0hPUlRfIgotCQkJCSAiUFJFQU1CTEVcbiIsIF9fZnVuY19fKTsKKwkJCVJUX1RSQUNFKENPTVBfREJHLAorCQkJCSAiJXMoKTogV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFXG4iLAorCQkJCSBfX2Z1bmNfXyk7CiAJCQlwcml2LT5ydGxsaWItPlNldEh3UmVnSGFuZGxlcihkZXYsIEhXX1ZBUl9BQ0tfUFJFQU1CTEUsCiAJCQkJCSh1bnNpZ25lZCBjaGFyICopJlNob3J0UHJlYW1ibGUpOwogCQl9CkBAIC01MzUsOCArNTI0LDkgQEAKIAkJaWYgKHByaXYtPmRvdDExQ3VycmVudFByZWFtYmxlTW9kZSAhPSBQUkVBTUJMRV9MT05HKSB7CiAJCQlTaG9ydFByZWFtYmxlID0gZmFsc2U7CiAJCQlwcml2LT5kb3QxMUN1cnJlbnRQcmVhbWJsZU1vZGUgPSBQUkVBTUJMRV9MT05HOwotCQkJUlRfVFJBQ0UoQ09NUF9EQkcsICIlcygpOiBXTEFOX0NBUEFCSUxJVFlfTE9OR18iCi0JCQkJICJQUkVBTUJMRVxuIiwgX19mdW5jX18pOworCQkJUlRfVFJBQ0UoQ09NUF9EQkcsCisJCQkJICIlcygpOiBXTEFOX0NBUEFCSUxJVFlfTE9OR19QUkVBTUJMRVxuIiwKKwkJCQkgX19mdW5jX18pOwogCQkJcHJpdi0+cnRsbGliLT5TZXRId1JlZ0hhbmRsZXIoZGV2LCBIV19WQVJfQUNLX1BSRUFNQkxFLAogCQkJCQkgICAgICAodW5zaWduZWQgY2hhciAqKSZTaG9ydFByZWFtYmxlKTsKIAkJfQpAQCAtNTk3LDggKzU4Nyw4IEBACiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwogCWlmIChwcml2LT5ydGxsaWItPnN0YXRlICE9IFJUTExJQl9MSU5LRUQpCiAJCWdvdG8gc3VjY2VzczsKLQlSVF9UUkFDRShDT01QX1FPUywgInFvcyBhY3RpdmUgcHJvY2VzcyB3aXRoIGFzc29jaWF0ZSByZXNwb25zZSAiCi0JCSAicmVjZWl2ZWRcbiIpOworCVJUX1RSQUNFKENPTVBfUU9TLAorCQkgInFvcyBhY3RpdmUgcHJvY2VzcyB3aXRoIGFzc29jaWF0ZSByZXNwb25zZSByZWNlaXZlZFxuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgIFFPU19RVUVVRV9OVU07IGkrKykKIAkJcHJpdi0+cnRsbGliLT5TZXRId1JlZ0hhbmRsZXIoZGV2LCBIV19WQVJfQUNfUEFSQU0sICh1OCAqKSgmaSkpOwpAQCAtNjE4LDcgKzYwOCw3IEBACiAJaWYgKHByaXYtPnJ0bGxpYi0+c3RhdGUgIT0gUlRMTElCX0xJTktFRCkKIAkJcmV0dXJuIHJldDsKIAotCWlmICgocHJpdi0+cnRsbGliLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEpKQorCWlmIChwcml2LT5ydGxsaWItPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSkKIAkJcmV0dXJuIHJldDsKIAogCWlmIChuZXR3b3JrLT5mbGFncyAmIE5FVFdPUktfSEFTX1FPU19NQVNLKSB7CkBAIC02MzQsOCArNjI0LDggQEAKIAkJCQluZXR3b3JrLT5xb3NfZGF0YS5wYXJhbV9jb3VudDsKIAlwcml2LT5ydGxsaWItPndtbV9hY20gPSBuZXR3b3JrLT5xb3NfZGF0YS53bW1fYWNtOwogCQkJcXVldWVfd29ya19yc2wocHJpdi0+cHJpdl93cSwgJnByaXYtPnFvc19hY3RpdmF0ZSk7Ci0JCQlSVF9UUkFDRShDT01QX1FPUywgIlFvUyBwYXJhbWV0ZXJzIGNoYW5nZSBjYWxsICIKLQkJCQkJInFvc19hY3RpdmF0ZVxuIik7CisJCQlSVF9UUkFDRShDT01QX1FPUywKKwkJCQkgIlFvUyBwYXJhbWV0ZXJzIGNoYW5nZSBjYWxsIHFvc19hY3RpdmF0ZVxuIik7CiAJCX0KIAl9IGVsc2UgewogCQltZW1jcHkoJnByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnBhcmFtZXRlcnMsCkBAIC02NDMsOCArNjMzLDggQEAKIAogCQlpZiAoKG5ldHdvcmstPnFvc19kYXRhLmFjdGl2ZSA9PSAxKSAmJiAoYWN0aXZlX25ldHdvcmsgPT0gMSkpIHsKIAkJCXF1ZXVlX3dvcmtfcnNsKHByaXYtPnByaXZfd3EsICZwcml2LT5xb3NfYWN0aXZhdGUpOwotCQkJUlRfVFJBQ0UoQ09NUF9RT1MsICJRb1Mgd2FzIGRpc2FibGVkIGNhbGwgcW9zXyIKLQkJCQkgImFjdGl2YXRlXG4iKTsKKwkJCVJUX1RSQUNFKENPTVBfUU9TLAorCQkJCSAiUW9TIHdhcyBkaXNhYmxlZCBjYWxsIHFvc19hY3RpdmF0ZVxuIik7CiAJCX0KIAkJbmV0d29yay0+cW9zX2RhdGEuYWN0aXZlID0gMDsKIAkJbmV0d29yay0+cW9zX2RhdGEuc3VwcG9ydGVkID0gMDsKQEAgLTY3OSw3ICs2NjksNyBAQAogCWlmIChwcml2LT5ydGxsaWItPnN0YXRlICE9IFJUTExJQl9MSU5LRUQpCiAJCXJldHVybiAwOwogCi0JaWYgKChwcml2LT5ydGxsaWItPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSkpCisJaWYgKHByaXYtPnJ0bGxpYi0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBKQogCQlyZXR1cm4gMDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5ydGxsaWItPmxvY2ssIGZsYWdzKTsKQEAgLTc1MSw4ICs3NDEsNiBAQAogCXByaXYtPm9wcy0+dHhfZmlsbF9kZXNjcmlwdG9yKGRldiwgcGRlc2MsIHRjYl9kZXNjLCBwbmV3c2tiKTsKIAlfX3NrYl9xdWV1ZV90YWlsKCZyaW5nLT5xdWV1ZSwgcG5ld3NrYik7CiAJcGRlc2MtPk9XTiA9IDE7Ci0KLQlyZXR1cm47CiB9CiAKIHN0YXRpYyB2b2lkIHJ0bDgxOTJfc3RvcF9iZWFjb24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTg2Niw3ICs4NTQsNiBAQAogCX0gZWxzZSB7CiAJCW1lbXNldChpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCAwLCAxNik7CiAJfQotCXJldHVybjsKIH0KIAogc3RhdGljIHU4IHJ0bDgxOTJfZ2V0U3VwcG9ydGVkV2lyZWxlZU1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTkwOSw4ICs4OTYsOSBAQAogCQl9IGVsc2UgaWYgKChiU3VwcG9ydE1vZGUgJiBXSVJFTEVTU19NT0RFX0IpKSB7CiAJCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9COwogCQl9IGVsc2UgewotCQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpLCBObyB2YWxpZCB3aXJlbGVzcyBtb2RlICIKLQkJCQkgInN1cHBvcnRlZCAoJXgpISEhXG4iLCBfX2Z1bmNfXywgYlN1cHBvcnRNb2RlKTsKKwkJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJCSAiJXMoKSwgTm8gdmFsaWQgd2lyZWxlc3MgbW9kZSBzdXBwb3J0ZWQgKCV4KSEhIVxuIiwKKwkJCQkgX19mdW5jX18sIGJTdXBwb3J0TW9kZSk7CiAJCQl3aXJlbGVzc19tb2RlID0gV0lSRUxFU1NfTU9ERV9COwogCQl9CiAJfQpAQCAtMTAyNSw4ICsxMDEzLDkgQEAKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFncyk7CiAJCQlicmVhazsKIAkJfQotCQlSVF9UUkFDRShDT01QX0RCRywgIj09PT4lcygpOlJGIGlzIGluIHByb2dyZXNzLCBuZWVkIHRvIHdhaXQgIgotCQkJICJ1bnRpbCByZiBjaGFuZ2UgaXMgZG9uZS5cbiIsIF9fZnVuY19fKTsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsCisJCQkgIj09PT4lcygpOlJGIGlzIGluIHByb2dyZXNzLCBuZWVkIHRvIHdhaXQgdW50aWwgcmYgY2hhbmdlIGlzIGRvbmUuXG4iLAorCQkJIF9fZnVuY19fKTsKIAkJbWRlbGF5KDEpOwogCQlSRkluUHJvZ3Jlc3NUaW1lT3V0Kys7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFncyk7CkBAIC0xMjEyLDggKzEyMDEsOCBAQAogCXByaXYtPkFjbUNvbnRyb2wgPSAwOwogCXByaXYtPnBGaXJtd2FyZSA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCBydF9maXJtd2FyZSkpOwogCWlmICghcHJpdi0+cEZpcm13YXJlKQotCQlwcmludGsoS0VSTl9FUlIgInJ0bDgxOTJlOiBVbmFibGUgdG8gYWxsb2NhdGUgc3BhY2UgIgotCQkgICAgICAgImZvciBmaXJtd2FyZVxuIik7CisJCW5ldGRldl9lcnIoZGV2LAorCQkJICAgInJ0bDgxOTJlOiBVbmFibGUgdG8gYWxsb2NhdGUgc3BhY2UgZm9yIGZpcm13YXJlXG4iKTsKIAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPnJ4X3F1ZXVlKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT5za2JfcXVldWUpOwpAQCAtMTI3OCwxNCArMTI2NywxNSBAQAogCiAJaWYgKChwcml2LT5yZl9jaGlwICE9IFJGXzgyMjUpICYmIChwcml2LT5yZl9jaGlwICE9IFJGXzgyNTYpCiAJCQkmJiAocHJpdi0+cmZfY2hpcCAhPSBSRl82MDUyKSkgewotCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzOiB1bmtub3duIHJmIGNoaXAsIGNhbid0IHNldCBjaGFubmVsICIKLQkJCSAibWFwXG4iLCBfX2Z1bmNfXyk7CisJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJICIlczogdW5rbm93biByZiBjaGlwLCBjYW4ndCBzZXQgY2hhbm5lbCBtYXBcbiIsCisJCQkgX19mdW5jX18pOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKHByaXYtPkNoYW5uZWxQbGFuID49IENPVU5UUllfQ09ERV9NQVgpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAicnRsODE5eF9pbml0OkVycm9yIGNoYW5uZWwgcGxhbiEgU2V0IHRvICIKLQkJICAgICAgICJkZWZhdWx0LlxuIik7CisJCW5ldGRldl9pbmZvKGRldiwKKwkJCSAgICAicnRsODE5eF9pbml0OkVycm9yIGNoYW5uZWwgcGxhbiEgU2V0IHRvIGRlZmF1bHQuXG4iKTsKIAkJcHJpdi0+Q2hhbm5lbFBsYW4gPSBDT1VOVFJZX0NPREVfRkNDOwogCX0KIAlSVF9UUkFDRShDT01QX0lOSVQsICJDaGFubmVsIHBsYW4gaXMgJWRcbiIsIHByaXYtPkNoYW5uZWxQbGFuKTsKQEAgLTEzMjksMTUgKzEzMTksMTUgQEAKIAlydGw4MTkyX2lycV9kaXNhYmxlKGRldik7CiAJaWYgKHJlcXVlc3RfaXJxKGRldi0+aXJxLCBydGw4MTkyX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsCiAJICAgIGRldi0+bmFtZSwgZGV2KSkgewotCQlwcmludGsoS0VSTl9FUlIgIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkIiwgZGV2LT5pcnEpOworCQluZXRkZXZfZXJyKGRldiwgIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkIiwgZGV2LT5pcnEpOwogCQlyZXR1cm4gLTE7Ci0JfSBlbHNlIHsKLQkJcHJpdi0+aXJxID0gZGV2LT5pcnE7Ci0JCVJUX1RSQUNFKENPTVBfSU5JVCwgIklSUSAlZFxuIiwgZGV2LT5pcnEpOwogCX0KIAorCXByaXYtPmlycSA9IGRldi0+aXJxOworCVJUX1RSQUNFKENPTVBfSU5JVCwgIklSUSAlZFxuIiwgZGV2LT5pcnEpOworCiAJaWYgKHJ0bDgxOTJfcGNpX2luaXRkZXNjcmluZyhkZXYpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJFbmRvcG9pbnRzIGluaXRpYWxpemF0aW9uIGZhaWxlZCIpOworCQluZXRkZXZfZXJyKGRldiwgIkVuZG9wb2ludHMgaW5pdGlhbGl6YXRpb24gZmFpbGVkIik7CiAJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTM1Nyw3ICsxMzQ3LDcgQEAKIAkJaWYgKChpID09IFRYQ01EX1FVRVVFKSB8fCAoaSA9PSBIQ0NBX1FVRVVFKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoc2tiX3F1ZXVlX2xlbigmKCZwcml2LT50eF9yaW5nW2ldKS0+cXVldWUpID4gMCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PnR4IHF1ZXVlIGlzIG5vdCBlbXB0eTolZCwgJWRcbiIsCisJCQluZXRkZXZfaW5mbyhkZXYsICI9PT0+dHggcXVldWUgaXMgbm90IGVtcHR5OiVkLCAlZFxuIiwKIAkJCSAgICAgICBpLCBza2JfcXVldWVfbGVuKCYoJnByaXYtPnR4X3JpbmdbaV0pLT5xdWV1ZSkpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTE0MDYsMTcgKzEzOTYsMTggQEAKIAkJCXRjYl9kZXNjLT5uU3R1Y2tDb3VudCsrOwogCQkJYkNoZWNrRndUeENudCA9IHRydWU7CiAJCQlpZiAodGNiX2Rlc2MtPm5TdHVja0NvdW50ID4gMSkKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogUXVldWVJRD0lZCB0Y2JfZGVzYy0+biIKLQkJCQkgICAgICAgIlN0dWNrQ291bnQ9JWRcbiIsIF9fZnVuY19fLCBRdWV1ZUlELAotCQkJCSAgICAgICB0Y2JfZGVzYy0+blN0dWNrQ291bnQpOworCQkJCW5ldGRldl9pbmZvKGRldiwKKwkJCQkJICAgICIlczogUXVldWVJRD0lZCB0Y2JfZGVzYy0+blN0dWNrQ291bnQ9JWRcbiIsCisJCQkJCSAgICBfX2Z1bmNfXywgUXVldWVJRCwKKwkJCQkJICAgIHRjYl9kZXNjLT5uU3R1Y2tDb3VudCk7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aXJxX3RoX2xvY2ssIGZsYWdzKTsKIAogCWlmIChiQ2hlY2tGd1R4Q250KSB7CiAJCWlmIChwcml2LT5vcHMtPlR4Q2hlY2tTdHVja0hhbmRsZXIoZGV2KSkgewotCQkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIlR4Q2hlY2tTdHVjaygpOiBGdyBpbmRpY2F0ZXMgbm8iCi0JCQkJICIgVHggY29uZGl0aW9uIVxuIik7CisJCQlSVF9UUkFDRShDT01QX1JFU0VULAorCQkJCSAiVHhDaGVja1N0dWNrKCk6IEZ3IGluZGljYXRlcyBubyBUeCBjb25kaXRpb24hXG4iKTsKIAkJCXJldHVybiBSRVNFVF9UWVBFX1NJTEVOVDsKIAkJfQogCX0KQEAgLTE0NTUsMTMgKzE0NDYsMTMgQEAKIAogCWlmIChUeFJlc2V0VHlwZSA9PSBSRVNFVF9UWVBFX05PUk1BTCB8fAogCSAgICBSeFJlc2V0VHlwZSA9PSBSRVNFVF9UWVBFX05PUk1BTCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlcygpOiBUeFJlc2V0VHlwZSBpcyAlZCwgUnhSZXNldFR5cGUgaXMgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgVHhSZXNldFR5cGUsIFJ4UmVzZXRUeXBlKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiJXMoKTogVHhSZXNldFR5cGUgaXMgJWQsIFJ4UmVzZXRUeXBlIGlzICVkXG4iLAorCQkJICAgIF9fZnVuY19fLCBUeFJlc2V0VHlwZSwgUnhSZXNldFR5cGUpOwogCQlyZXR1cm4gUkVTRVRfVFlQRV9OT1JNQUw7CiAJfSBlbHNlIGlmIChUeFJlc2V0VHlwZSA9PSBSRVNFVF9UWVBFX1NJTEVOVCB8fAogCQkgICBSeFJlc2V0VHlwZSA9PSBSRVNFVF9UWVBFX1NJTEVOVCkgewotCQlwcmludGsoS0VSTl9JTkZPICIlcygpOiBUeFJlc2V0VHlwZSBpcyAlZCwgUnhSZXNldFR5cGUgaXMgJWRcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgVHhSZXNldFR5cGUsIFJ4UmVzZXRUeXBlKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiJXMoKTogVHhSZXNldFR5cGUgaXMgJWQsIFJ4UmVzZXRUeXBlIGlzICVkXG4iLAorCQkJICAgIF9fZnVuY19fLCBUeFJlc2V0VHlwZSwgUnhSZXNldFR5cGUpOwogCQlyZXR1cm4gUkVTRVRfVFlQRV9TSUxFTlQ7CiAJfSBlbHNlIHsKIAkJcmV0dXJuIFJFU0VUX1RZUEVfTk9SRVNFVDsKQEAgLTE1MDYsOSArMTQ5NywxMCBAQAogCQlpZiAocHJpdi0+cnRsbGliLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKQogCQkJTGVpc3VyZVBTTGVhdmUoZGV2KTsKIAotCQlpZiAoSVNfTklDX0RPV04ocHJpdikpIHsKLQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTp0aGUgZHJpdmVyIGlzIG5vdCB1cCEgIgotCQkJCSAicmV0dXJuXG4iLCBfX2Z1bmNfXyk7CisJCWlmIChwcml2LT51cCkgeworCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJICIlcygpOnRoZSBkcml2ZXIgaXMgbm90IHVwISByZXR1cm5cbiIsCisJCQkJIF9fZnVuY19fKTsKIAkJCXVwKCZwcml2LT53eF9zZW0pOwogCQkJcmV0dXJuOwogCQl9CkBAIC0xNTE3LDggKzE1MDksOSBAQAogCQlSVF9UUkFDRShDT01QX1JFU0VULCAiJXMoKTo9PT09PT0+c3RhcnQgdG8gZG93biB0aGUgZHJpdmVyXG4iLAogCQkJICBfX2Z1bmNfXyk7CiAJCW1kZWxheSgxMDAwKTsKLQkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIiVzKCk6MTExMTExMTExMTExMTExMTExMTExMTExPT09PT09PnN0YXJ0IgotCQkJICIgdG8gZG93biB0aGUgZHJpdmVyXG4iLCBfX2Z1bmNfXyk7CisJCVJUX1RSQUNFKENPTVBfUkVTRVQsCisJCQkgIiVzKCk6MTExMTExMTExMTExMTExMTExMTExMTExPT09PT09PnN0YXJ0IHRvIGRvd24gdGhlIGRyaXZlclxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAKIAkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGRldikpCiAJCQluZXRpZl9zdG9wX3F1ZXVlKGRldik7CkBAIC0xNTMxLDcgKzE1MjQsNyBAQAogCiAJCWlmIChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSB7CiAJCQlTRU1fRE9XTl9JRUVFX1dYKCZpZWVlLT53eF9zZW0pOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWVlZS0+c3RhdGUgaXMgUlRMTElCX0xJTktFRFxuIik7CisJCQluZXRkZXZfaW5mbyhkZXYsICJpZWVlLT5zdGF0ZSBpcyBSVExMSUJfTElOS0VEXG4iKTsKIAkJCXJ0bGxpYl9zdG9wX3NlbmRfYmVhY29ucyhwcml2LT5ydGxsaWIpOwogCQkJZGVsX3RpbWVyX3N5bmMoJmllZWUtPmFzc29jaWF0ZV90aW1lcik7CiAJCQljYW5jZWxfZGVsYXllZF93b3JrKCZpZWVlLT5hc3NvY2lhdGVfcmV0cnlfd3EpOwpAQCAtMTUzOSwyOSArMTUzMiwzMSBAQAogCQkJbmV0aWZfY2Fycmllcl9vZmYoZGV2KTsKIAkJCVNFTV9VUF9JRUVFX1dYKCZpZWVlLT53eF9zZW0pOwogCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiaWVlZS0+c3RhdGUgaXMgTk9UIExJTktFRFxuIik7CisJCQluZXRkZXZfaW5mbyhkZXYsICJpZWVlLT5zdGF0ZSBpcyBOT1QgTElOS0VEXG4iKTsKIAkJCXJ0bGxpYl9zb2Z0bWFjX3N0b3BfcHJvdG9jb2wocHJpdi0+cnRsbGliLCAwICwgdHJ1ZSk7CiAJCX0KIAogCQlkbV9iYWNrdXBfZHluYW1pY19tZWNoYW5pc21fc3RhdGUoZGV2KTsKIAogCQl1cCgmcHJpdi0+d3hfc2VtKTsKLQkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwgIiVzKCk6PD09PT09PT09PT1kb3duIHByb2Nlc3MgaXMgIgotCQkJICJmaW5pc2hlZFxuIiwgX19mdW5jX18pOworCQlSVF9UUkFDRShDT01QX1JFU0VULAorCQkJICIlcygpOjw9PT09PT09PT09ZG93biBwcm9jZXNzIGlzIGZpbmlzaGVkXG4iLAorCQkJIF9fZnVuY19fKTsKIAogCQlSVF9UUkFDRShDT01QX1JFU0VULCAiJXMoKTo8PT09PT09PT09PT11cCBwcm9jZXNzIHN0YXJ0XG4iLAogCQkJIF9fZnVuY19fKTsKIAkJcmVzZXRfc3RhdHVzID0gX3J0bDgxOTJfdXAoZGV2LCB0cnVlKTsKIAotCQlSVF9UUkFDRShDT01QX1JFU0VULCAiJXMoKTo8PT09PT09PT09PT11cCBwcm9jZXNzIGlzICIKLQkJCSAiZmluaXNoZWRcbiIsIF9fZnVuY19fKTsKKwkJUlRfVFJBQ0UoQ09NUF9SRVNFVCwKKwkJCSAiJXMoKTo8PT09PT09PT09PT11cCBwcm9jZXNzIGlzIGZpbmlzaGVkXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChyZXNldF9zdGF0dXMgPT0gLTEpIHsKIAkJCWlmIChyZXNldF90aW1lcyA8IDMpIHsKIAkJCQlyZXNldF90aW1lcysrOwogCQkJCWdvdG8gUkVTRVRfU1RBUlQ7CiAJCQl9IGVsc2UgewotCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiIEVSUiEhISAlcygpOiAgUmVzZXQgIgotCQkJCQkgIkZhaWxlZCEhXG4iLCBfX2Z1bmNfXyk7CisJCQkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkJCSAiIEVSUiEhISAlcygpOiAgUmVzZXQgRmFpbGVkISFcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CiAJCQl9CiAJCX0KIApAQCAtMTY1MCw3ICsxNjQ1LDcgQEAKIAlib29sCWJIaWdoZXJCdXN5UnhUcmFmZmljID0gZmFsc2U7CiAJYm9vbCBiRW50ZXJQUyA9IGZhbHNlOwogCi0JaWYgKElTX05JQ19ET1dOKHByaXYpIHx8IHByaXYtPmJId1JhZGlvT2ZmKQorCWlmICghcHJpdi0+dXAgfHwgcHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybjsKIAogCWlmIChwcml2LT5ydGxsaWItPnN0YXRlID49IFJUTExJQl9MSU5LRUQpIHsKQEAgLTE2NzAsOCArMTY2NSw4IEBACiAJCQlpZiAoKGllZWUtPlBvd2VyU2F2ZUNvbnRyb2wuUmV0dXJuUG9pbnQgPT0KIAkJCSAgICAgSVBTX0NBTExCQUNLX05PTkUpICYmCiAJCQkgICAgICghaWVlZS0+Yk5ldFByb21pc2N1b3VzTW9kZSkpIHsKLQkJCQlSVF9UUkFDRShDT01QX1BTLCAiPT09PT09PT09PT09PT09PT09PT0+aGFoYTogIgotCQkJCQkgIklQU0VudGVyKClcbiIpOworCQkJCVJUX1RSQUNFKENPTVBfUFMsCisJCQkJCSAiPT09PT09PT09PT09PT09PT09PT0+aGFoYTogSVBTRW50ZXIoKVxuIik7CiAJCQkJSVBTRW50ZXIoZGV2KTsKIAkJCX0KIAkJfQpAQCAtMTczNiw4ICsxNzMxLDkgQEAKIAkJCWlmIChpZWVlLT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikKIAkJCQlSVF9UUkFDRShDT01QX0VSUiwgIj09PT09PT09PiVzKClcbiIsIF9fZnVuY19fKTsKIAotCQkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PiVzKCk6IEFQIGlzIHBvd2VyIG9mZiwgY2hhbjolZCwiCi0JCQkgICAgICAgIiBjb25uZWN0IGFub3RoZXIgb25lXG4iLCBfX2Z1bmNfXywgcHJpdi0+Y2hhbik7CisJCQluZXRkZXZfaW5mbyhkZXYsCisJCQkJICAgICI9PT0+JXMoKTogQVAgaXMgcG93ZXIgb2ZmLCBjaGFuOiVkLCBjb25uZWN0IGFub3RoZXIgb25lXG4iLAorCQkJCSAgICBfX2Z1bmNfXywgcHJpdi0+Y2hhbik7CiAKIAkJCWllZWUtPnN0YXRlID0gUlRMTElCX0FTU09DSUFUSU5HOwogCkBAIC0xNzkzLDcgKzE3ODksNyBAQAogCiAJcXVldWVfZGVsYXllZF93b3JrX3JzbChwcml2LT5wcml2X3dxLCAmcHJpdi0+d2F0Y2hfZG9nX3dxLCAwKTsKIAltb2RfdGltZXIoJnByaXYtPndhdGNoX2RvZ190aW1lciwgamlmZmllcyArCi0JCSAgTVNFQ1MoUlRMTElCX1dBVENIX0RPR19USU1FKSk7CisJCSAgbXNlY3NfdG9famlmZmllcyhSVExMSUJfV0FUQ0hfRE9HX1RJTUUpKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE4ODIsNyArMTg3OCw3IEBACiAJCQkJICAgIE1BWF9ERVZfQUREUl9TSVpFKTsKIAl1OCBxdWV1ZV9pbmRleCA9IHRjYl9kZXNjLT5xdWV1ZV9pbmRleDsKIAotCWlmICgocHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlID09IGVSZk9mZikgfHwgSVNfTklDX0RPV04ocHJpdikgfHwKKwlpZiAoKHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZSA9PSBlUmZPZmYpIHx8ICFwcml2LT51cCB8fAogCSAgICAgcHJpdi0+YlJlc2V0SW5Qcm9ncmVzcykgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuOwpAQCAtMTkwMiw4ICsxODk4LDYgQEAKIAkJCQkJCSBwcml2LT5ydGxsaWItPnR4X2hlYWRyb29tKTsKIAkJcHJpdi0+cnRsbGliLT5zdGF0cy50eF9wYWNrZXRzKys7CiAJfQotCi0JcmV0dXJuOwogfQogCiBpbnQgcnRsODE5Ml9oYXJkX3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTE5MTYsNyArMTkxMCw3IEBACiAKIAlpZiAocXVldWVfaW5kZXggIT0gVFhDTURfUVVFVUUpIHsKIAkJaWYgKChwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGUgPT0gZVJmT2ZmKSB8fAotCQkgICAgIElTX05JQ19ET1dOKHByaXYpIHx8IHByaXYtPmJSZXNldEluUHJvZ3Jlc3MpIHsKKwkJICAgICAhcHJpdi0+dXAgfHwgcHJpdi0+YlJlc2V0SW5Qcm9ncmVzcykgewogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlyZXR1cm4gMDsKIAkJfQpAQCAtMTkyNiwxNyArMTkyMCwxNiBAQAogCWlmIChxdWV1ZV9pbmRleCA9PSBUWENNRF9RVUVVRSkgewogCQlydGw4MTkyX3R4X2NtZChkZXYsIHNrYik7CiAJCXJldHVybiAwOwotCX0gZWxzZSB7Ci0JCXRjYl9kZXNjLT5SQVRSSW5kZXggPSA3OwotCQl0Y2JfZGVzYy0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IDE7Ci0JCXRjYl9kZXNjLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSAxOwotCQl0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyID0gMTsKLQkJc2tiX3B1c2goc2tiLCBwcml2LT5ydGxsaWItPnR4X2hlYWRyb29tKTsKLQkJcmV0ID0gcnRsODE5Ml90eChkZXYsIHNrYik7Ci0JCWlmIChyZXQgIT0gMCkKLQkJCWtmcmVlX3NrYihza2IpOwogCX0KIAorCXRjYl9kZXNjLT5SQVRSSW5kZXggPSA3OworCXRjYl9kZXNjLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gMTsKKwl0Y2JfZGVzYy0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gMTsKKwl0Y2JfZGVzYy0+YlR4RW5hYmxlRndDYWxjRHVyID0gMTsKKwlza2JfcHVzaChza2IsIHByaXYtPnJ0bGxpYi0+dHhfaGVhZHJvb20pOworCXJldCA9IHJ0bDgxOTJfdHgoZGV2LCBza2IpOworCWlmIChyZXQgIT0gMCkKKwkJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTk4Nyw4ICsxOTgwLDYgQEAKIAogCV9fc2tiX3F1ZXVlX3RhaWwoJnJpbmctPnF1ZXVlLCBza2IpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmlycV90aF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm47CiB9CiAKIHNob3J0IHJ0bDgxOTJfdHgoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTIwMDcsOSArMTk5OCw5IEBACiAJdTMyIGZ3aW5mb19zaXplID0gMDsKIAogCWlmIChwcml2LT5iZGlzYWJsZV9uaWMpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlczogRVJSISEgTmljIGlzIGRpc2FibGVkISBDYW4ndCB0eCBwYWNrZXQiCi0JCQkgIiBsZW49JWQgcWlkeD0lZCEhIVxuIiwgX19mdW5jX18sIHNrYi0+bGVuLAotCQkJIHRjYl9kZXNjLT5xdWV1ZV9pbmRleCk7CisJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJICIlczogRVJSISEgTmljIGlzIGRpc2FibGVkISBDYW4ndCB0eCBwYWNrZXQgbGVuPSVkIHFpZHg9JWQhISFcbiIsCisJCQkgX19mdW5jX18sIHNrYi0+bGVuLCB0Y2JfZGVzYy0+cXVldWVfaW5kZXgpOwogCQlyZXR1cm4gc2tiLT5sZW47CiAJfQogCkBAIC0yMDQ2LDggKzIwMzcsOCBAQAogCiAJcGRlc2MgPSAmcmluZy0+ZGVzY1tpZHhdOwogCWlmICgocGRlc2MtPk9XTiA9PSAxKSAmJiAodGNiX2Rlc2MtPnF1ZXVlX2luZGV4ICE9IEJFQUNPTl9RVUVVRSkpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICJObyBtb3JlIFRYIGRlc2NAJWQsIHJpbmctPmlkeCA9ICVkLCBpZHggPSAiCi0JCQkgIiVkLCBza2JsZW4gPSAweCV4IHF1ZXVlbGVuPSVkIiwKKwkJUlRfVFJBQ0UoQ09NUF9FUlIsCisJCQkgIk5vIG1vcmUgVFggZGVzY0AlZCwgcmluZy0+aWR4ID0gJWQsIGlkeCA9ICVkLCBza2JsZW4gPSAweCV4IHF1ZXVlbGVuPSVkIiwKIAkJCSB0Y2JfZGVzYy0+cXVldWVfaW5kZXgsIHJpbmctPmlkeCwgaWR4LCBza2ItPmxlbiwKIAkJCSBza2JfcXVldWVfbGVuKCZyaW5nLT5xdWV1ZSkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5pcnFfdGhfbG9jaywgZmxhZ3MpOwpAQCAtMjMzMiw3NiArMjMyMyw3NCBAQAogCQkJCQlbcHJpdi0+cnhfaWR4W3J4X3F1ZXVlX2lkeF1dOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcHJpdi0+cnhfYnVmW3J4X3F1ZXVlX2lkeF0KIAkJCQkgICAgICBbcHJpdi0+cnhfaWR4W3J4X3F1ZXVlX2lkeF1dOworCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKIAotCQlpZiAocGRlc2MtPk9XTikgeworCQlpZiAocGRlc2MtPk9XTikKIAkJCXJldHVybjsKKwkJaWYgKCFwcml2LT5vcHMtPnJ4X3F1ZXJ5X3N0YXR1c19kZXNjcmlwdG9yKGRldiwgJnN0YXRzLAorCQlwZGVzYywgc2tiKSkKKwkJCWdvdG8gZG9uZTsKKwkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IocHJpdi0+cnhidWZmZXJzaXplKTsKKwkJLyogaWYgYWxsb2NhdGlvbiBvZiBuZXcgc2tiIGZhaWxlZCAtIGRyb3AgY3VycmVudCBwYWNrZXQKKwkJICogYW5kIHJldXNlIHNrYgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KCFuZXdfc2tiKSkKKwkJCWdvdG8gZG9uZTsKKworCQlwY2lfdW5tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJKigoZG1hX2FkZHJfdCAqKXNrYi0+Y2IpLAorCQkJCXByaXYtPnJ4YnVmZmVyc2l6ZSwKKwkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCXNrYl9wdXQoc2tiLCBwZGVzYy0+TGVuZ3RoKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCBzdGF0cy5SeERydkluZm9TaXplICsKKwkJCXN0YXRzLlJ4QnVmU2hpZnQpOworCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gNC8qc0NyY0xuZyovKTsKKwkJcnRsbGliX2hkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl8xYWRkciAqKXNrYi0+ZGF0YTsKKwkJaWYgKCFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihydGxsaWJfaGRyLT5hZGRyMSkpIHsKKwkJCS8qIHVuaWNhc3QgcGFja2V0ICovCisJCQl1bmljYXN0X3BhY2tldCA9IHRydWU7CisJCX0KKwkJZmMgPSBsZTE2X3RvX2NwdShydGxsaWJfaGRyLT5mcmFtZV9jdGwpOworCQl0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7CisJCWlmICh0eXBlID09IFJUTExJQl9GVFlQRV9NR01UKQorCQkJYkxlZEJsaW5raW5nID0gZmFsc2U7CisKKwkJaWYgKGJMZWRCbGlua2luZykKKwkJCWlmIChwcml2LT5ydGxsaWItPkxlZENvbnRyb2xIYW5kbGVyKQorCQkJCXByaXYtPnJ0bGxpYi0+TGVkQ29udHJvbEhhbmRsZXIoZGV2LAorCQkJCQkJCUxFRF9DVExfUlgpOworCisJCWlmIChzdGF0cy5iQ1JDKSB7CisJCQlpZiAodHlwZSAhPSBSVExMSUJfRlRZUEVfTUdNVCkKKwkJCQlwcml2LT5zdGF0cy5yeGRhdGFjcmNlcnIrKzsKKwkJCWVsc2UKKwkJCQlwcml2LT5zdGF0cy5yeG1nbXRjcmNlcnIrKzsKKwkJfQorCisJCXNrYl9sZW4gPSBza2ItPmxlbjsKKworCQlpZiAoIXJ0bGxpYl9yeChwcml2LT5ydGxsaWIsIHNrYiwgJnN0YXRzKSkgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJfSBlbHNlIHsKLQkJCXN0cnVjdCBza19idWZmICpuZXdfc2tiOworCQkJcHJpdi0+c3RhdHMucnhvaysrOworCQkJaWYgKHVuaWNhc3RfcGFja2V0KQorCQkJCXByaXYtPnN0YXRzLnJ4Ynl0ZXN1bmljYXN0ICs9IHNrYl9sZW47CisJCX0KIAotCQkJaWYgKCFwcml2LT5vcHMtPnJ4X3F1ZXJ5X3N0YXR1c19kZXNjcmlwdG9yKGRldiwgJnN0YXRzLAotCQkJcGRlc2MsIHNrYikpCi0JCQkJZ290byBkb25lOwotCQkJbmV3X3NrYiA9IGRldl9hbGxvY19za2IocHJpdi0+cnhidWZmZXJzaXplKTsKLQkJCS8qIGlmIGFsbG9jYXRpb24gb2YgbmV3IHNrYiBmYWlsZWQgLSBkcm9wIGN1cnJlbnQgcGFja2V0Ci0JCQkqIGFuZCByZXVzZSBza2IgKi8KLQkJCWlmICh1bmxpa2VseSghbmV3X3NrYikpCi0JCQkJZ290byBkb25lOworCQlza2IgPSBuZXdfc2tiOworCQlza2ItPmRldiA9IGRldjsKIAotCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LAotCQkJCQkqKChkbWFfYWRkcl90ICopc2tiLT5jYiksCi0JCQkJCXByaXYtPnJ4YnVmZmVyc2l6ZSwKLQkJCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQotCQkJc2tiX3B1dChza2IsIHBkZXNjLT5MZW5ndGgpOwotCQkJc2tiX3Jlc2VydmUoc2tiLCBzdGF0cy5SeERydkluZm9TaXplICsKLQkJCQlzdGF0cy5SeEJ1ZlNoaWZ0KTsKLQkJCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSA0LypzQ3JjTG5nKi8pOwotCQkJcnRsbGliX2hkciA9IChzdHJ1Y3QgcnRsbGliX2hkcl8xYWRkciAqKXNrYi0+ZGF0YTsKLQkJCWlmICghaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocnRsbGliX2hkci0+YWRkcjEpKSB7Ci0JCQkJLyogdW5pY2FzdCBwYWNrZXQgKi8KLQkJCQl1bmljYXN0X3BhY2tldCA9IHRydWU7Ci0JCQl9Ci0JCQlmYyA9IGxlMTZfdG9fY3B1KHJ0bGxpYl9oZHItPmZyYW1lX2N0bCk7Ci0JCQl0eXBlID0gV0xBTl9GQ19HRVRfVFlQRShmYyk7Ci0JCQlpZiAodHlwZSA9PSBSVExMSUJfRlRZUEVfTUdNVCkKLQkJCQliTGVkQmxpbmtpbmcgPSBmYWxzZTsKLQotCQkJaWYgKGJMZWRCbGlua2luZykKLQkJCQlpZiAocHJpdi0+cnRsbGliLT5MZWRDb250cm9sSGFuZGxlcikKLQkJCQkJcHJpdi0+cnRsbGliLT5MZWRDb250cm9sSGFuZGxlcihkZXYsCi0JCQkJCQkJCUxFRF9DVExfUlgpOwotCi0JCQlpZiAoc3RhdHMuYkNSQykgewotCQkJCWlmICh0eXBlICE9IFJUTExJQl9GVFlQRV9NR01UKQotCQkJCQlwcml2LT5zdGF0cy5yeGRhdGFjcmNlcnIrKzsKLQkJCQllbHNlCi0JCQkJCXByaXYtPnN0YXRzLnJ4bWdtdGNyY2VycisrOwotCQkJfQotCi0JCQlza2JfbGVuID0gc2tiLT5sZW47Ci0KLQkJCWlmICghcnRsbGliX3J4KHByaXYtPnJ0bGxpYiwgc2tiLCAmc3RhdHMpKSB7Ci0JCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJpdi0+c3RhdHMucnhvaysrOwotCQkJCWlmICh1bmljYXN0X3BhY2tldCkKLQkJCQkJcHJpdi0+c3RhdHMucnhieXRlc3VuaWNhc3QgKz0gc2tiX2xlbjsKLQkJCX0KLQotCQkJc2tiID0gbmV3X3NrYjsKLQkJCXNrYi0+ZGV2ID0gZGV2OwotCi0JCQlwcml2LT5yeF9idWZbcnhfcXVldWVfaWR4XVtwcml2LT5yeF9pZHhbcnhfcXVldWVfaWR4XV0gPQotCQkJCQkJCQkJIHNrYjsKLQkJCSooKGRtYV9hZGRyX3QgKikgc2tiLT5jYikgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LAotCQkJCQkJICAgIHNrYl90YWlsX3BvaW50ZXJfcnNsKHNrYiksCi0JCQkJCQkgICAgcHJpdi0+cnhidWZmZXJzaXplLAotCQkJCQkJICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKHByaXYtPnBkZXYsCi0JCQkJCQkgICooKGRtYV9hZGRyX3QgKilza2ItPmNiKSkpIHsKLQkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJCXJldHVybjsKLQkJCX0KKwkJcHJpdi0+cnhfYnVmW3J4X3F1ZXVlX2lkeF1bcHJpdi0+cnhfaWR4W3J4X3F1ZXVlX2lkeF1dID0KKwkJCQkJCQkJIHNrYjsKKwkJKigoZG1hX2FkZHJfdCAqKSBza2ItPmNiKSA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYsCisJCQkJCSAgICBza2JfdGFpbF9wb2ludGVyX3JzbChza2IpLAorCQkJCQkgICAgcHJpdi0+cnhidWZmZXJzaXplLAorCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihwcml2LT5wZGV2LAorCQkJCQkgICooKGRtYV9hZGRyX3QgKilza2ItPmNiKSkpIHsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlyZXR1cm47CiAJCX0KIGRvbmU6CiAJCXBkZXNjLT5CdWZmZXJBZGRyZXNzID0gKigoZG1hX2FkZHJfdCAqKXNrYi0+Y2IpOwpAQCAtMjU2Nyw3ICsyNTU2LDcgQEAKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CiAKLQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhKTsKIAogCXNjaGVkdWxlX3dvcmsoJnByaXYtPnJlc2V0X3dxKTsKIAl1cCgmcHJpdi0+d3hfc2VtKTsKQEAgLTI4NjksNyArMjg1OCw4IEBACiAKIAlpZiAoIXBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSkpIHsKIAkJaWYgKHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5hYmxlIHRvIG9idGFpbiAzMmJpdCBETUEgZm9yIGNvbnNpc3RlbnQgYWxsb2NhdGlvbnNcbiIpOworCQkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCQkgIlVuYWJsZSB0byBvYnRhaW4gMzJiaXQgRE1BIGZvciBjb25zaXN0ZW50IGFsbG9jYXRpb25zXG4iKTsKIAkJCWdvdG8gZXJyX3BjaV9kaXNhYmxlOwogCQl9CiAJfQpAQCAtMjkwMiw3ICsyODkyLDggQEAKIAkJZ290byBlcnJfcmVsX3J0bGxpYjsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJNZW1vcnkgbWFwcGVkIHNwYWNlIHN0YXJ0OiAweCUwOGx4XG4iLCBwbWVtX3N0YXJ0KTsKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiTWVtb3J5IG1hcHBlZCBzcGFjZSBzdGFydDogMHglMDhseFxuIiwKKwkJIHBtZW1fc3RhcnQpOwogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBtZW1fc3RhcnQsIHBtZW1fbGVuLCBEUlZfTkFNRSkpIHsKIAkJUlRfVFJBQ0UoQ09NUF9FUlIsICJyZXF1ZXN0X21lbV9yZWdpb24gZmFpbGVkISIpOwogCQlnb3RvIGVycl9yZWxfcnRsbGliOwpAQCAtMjk0MCw4ICsyOTMxLDggQEAKIAlkZXYtPndhdGNoZG9nX3RpbWVvID0gSFogKiAzOwogCiAJaWYgKGRldl9hbGxvY19uYW1lKGRldiwgaWZuYW1lKSA8IDApIHsKLQkJUlRfVFJBQ0UoQ09NUF9JTklULCAiT29wczogZGV2bmFtZSBhbHJlYWR5IHRha2VuISBUcnlpbmcgIgotCQkJICJ3bGFuJSVkLi4uXG4iKTsKKwkJUlRfVFJBQ0UoQ09NUF9JTklULAorCQkJICJPb3BzOiBkZXZuYW1lIGFscmVhZHkgdGFrZW4hIFRyeWluZyB3bGFuJSVkLi4uXG4iKTsKIAkJCWRldl9hbGxvY19uYW1lKGRldiwgaWZuYW1lKTsKIAl9CiAKQEAgLTI5ODEsNyArMjk3Miw3IEBACiBzdGF0aWMgdm9pZCBydGw4MTkyX3BjaV9kaXNjb25uZWN0KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgOworCXN0cnVjdCByODE5Ml9wcml2ICpwcml2OwogCXUzMiBpOwogCiAJaWYgKGRldikgewpAQCAtMzAwNCw3ICsyOTk1LDcgQEAKIAkJCXJ0bDgxOTJfZnJlZV90eF9yaW5nKGRldiwgaSk7CiAKIAkJaWYgKHByaXYtPmlycSkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiRnJlZWluZyBpcnEgJWRcbiIsIGRldi0+aXJxKTsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJGcmVlaW5nIGlycSAlZFxuIiwgZGV2LT5pcnEpOwogCQkJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CiAJCQlwcml2LT5pcnEgPSAwOwogCQl9CkBAIC0zMDMyLDcgKzMwMjMsNyBAQAogCXN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICpwUFNDID0gKHN0cnVjdCBydF9wd3Jfc2F2ZV9jdHJsICopCiAJCQkJCSgmKHByaXYtPnJ0bGxpYi0+UG93ZXJTYXZlQ29udHJvbCkpOwogCi0JaWYgKElTX05JQ19ET1dOKHByaXYpKSB7CisJaWYgKCFwcml2LT51cCkgewogCQlSVF9UUkFDRShDT01QX0VSUiwgIkVSUiEhISAlcygpOiBEcml2ZXIgaXMgYWxyZWFkeSBkb3duIVxuIiwKIAkJCSBfX2Z1bmNfXyk7CiAJCXByaXYtPmJkaXNhYmxlX25pYyA9IGZhbHNlOwpAQCAtMzA1OSw3ICszMDUwLDYgQEAKIH0KIGJvb2wgTmljSUZEaXNhYmxlTklDKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JYm9vbAlzdGF0dXMgPSB0cnVlOwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAl1OCB0bXBfc3RhdGUgPSAwOwogCkBAIC0zMDc0LDEzICszMDY0LDEzIEBACiAJcHJpdi0+b3BzLT5zdG9wX2FkYXB0ZXIoZGV2LCBmYWxzZSk7CiAJUlRfVFJBQ0UoQ09NUF9QUywgIjw9PT09PT09PT0lcygpXG4iLCBfX2Z1bmNfXyk7CiAKLQlyZXR1cm4gc3RhdHVzOworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBydGw4MTkyX3BjaV9tb2R1bGVfaW5pdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gIlxuTGludXgga2VybmVsIGRyaXZlciBmb3IgUlRMODE5MkUgV0xBTiBjYXJkc1xuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQ29weXJpZ2h0IChjKSAyMDA3LTIwMDgsIFJlYWxzaWwgV2xhbiBEcml2ZXJcbiIpOworCXByX2luZm8oIlxuTGludXgga2VybmVsIGRyaXZlciBmb3IgUlRMODE5MkUgV0xBTiBjYXJkc1xuIik7CisJcHJfaW5mbygiQ29weXJpZ2h0IChjKSAyMDA3LTIwMDgsIFJlYWxzaWwgV2xhbiBEcml2ZXJcbiIpOwogCiAJaWYgKDAgIT0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmcnRsODE5Ml9wY2lfZHJpdmVyKSkgewogCQlETUVTRygiTm8gZGV2aWNlIGZvdW5kIik7CkBAIC0zMTA2LDcgKzMwOTYsNyBAQAogCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2wocHJpdi0+cHJpdl93cSwgJnByaXYtPmdwaW9fY2hhbmdlX3JmX3dxLCAwKTsKIAogCW1vZF90aW1lcigmcHJpdi0+Z3Bpb19wb2xsaW5nX3RpbWVyLCBqaWZmaWVzICsKLQkJICBNU0VDUyhSVExMSUJfV0FUQ0hfRE9HX1RJTUUpKTsKKwkJICBtc2Vjc190b19qaWZmaWVzKFJUTExJQl9XQVRDSF9ET0dfVElNRSkpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2NvcmUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY29yZS5oCmluZGV4IGQxNDM4YzIuLmQzNjVhZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY29yZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfY29yZS5oCkBAIC05OCwxNCArOTgsOCBAQAogI2RlZmluZSBCSVQoX2kpCQkJCSgxPDwoX2kpKQogI2VuZGlmCiAKLSNkZWZpbmUgSVNfTklDX0RPV04ocHJpdikJKCEocHJpdiktPnVwKQotCiAjZGVmaW5lIElTX0FEQVBURVJfU0VORFNfQkVBQ09OKGRldikgMAogCi0jZGVmaW5lIElTX1VOREVSXzExTl9BRVNfTU9ERShfcnRsbGliKQkJXAotCSgoX3J0bGxpYi0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gdHJ1ZSkgJiYgXAotCShfcnRsbGliLT5wYWlyd2lzZV9rZXlfdHlwZSA9PSBLRVlfVFlQRV9DQ01QKSkKLQogI2RlZmluZSBIQUxfTUVNT1JZX01BUFBFRF9JT19SQU5HRV84MTkwUENJCTB4MTAwMAogI2RlZmluZSBIQUxfSFdfUENJX1JFVklTSU9OX0lEXzgxOTBQQ0kJCQkweDAwCiAjZGVmaW5lIEhBTF9NRU1PUllfTUFQUEVEX0lPX1JBTkdFXzgxOTJQQ0lFCTB4NDAwMApAQCAtMTAwNCwxNCArOTk4LDE0IEBACiAKIHU4IHJlYWRfbmljX2lvX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpOwogdTMyIHJlYWRfbmljX2lvX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKLXUxNiByZWFkX25pY19pb193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KSA7Cit1MTYgcmVhZF9uaWNfaW9fd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7CiB2b2lkIHdyaXRlX25pY19pb19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LCB1OCB5KTsKIHZvaWQgd3JpdGVfbmljX2lvX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsIHUxNiB5KTsKIHZvaWQgd3JpdGVfbmljX2lvX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LCB1MzIgeSk7CiAKIHU4IHJlYWRfbmljX2J5dGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgpOwogdTMyIHJlYWRfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KTsKLXUxNiByZWFkX25pY193b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4KSA7Cit1MTYgcmVhZF9uaWNfd29yZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgeCk7CiB2b2lkIHdyaXRlX25pY19ieXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LCB1OCB5KTsKIHZvaWQgd3JpdGVfbmljX3dvcmQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHgsIHUxNiB5KTsKIHZvaWQgd3JpdGVfbmljX2R3b3JkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCB4LCB1MzIgeSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2RtLmMKaW5kZXggYjg4OTFjNi4uZGY0YmJjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfZG0uYwpAQCAtMjY3LDcgKzI2Nyw3IEBACiAJYm9vbCBic2hvcnRfZ2lfZW5hYmxlZCA9IGZhbHNlOwogCXN0YXRpYyB1OCBwaW5nX3Jzc2lfc3RhdGU7CiAKLQlpZiAoSVNfTklDX0RPV04ocHJpdikpIHsKKwlpZiAoIXByaXYtPnVwKSB7CiAJCVJUX1RSQUNFKENPTVBfUkFURSwgIjwtLS0tIGRtX2NoZWNrX3JhdGVfYWRhcHRpdmUoKTogZHJpdmVyIGlzIGdvaW5nIHRvIHVubG9hZFxuIik7CiAJCXJldHVybjsKIAl9CkBAIC0zNzgsMTkgKzM3OCwxNiBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAogCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjAgfHwKLQkgICAhcHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2guYmF1dG9zd2l0Y2hfZW5hYmxlKSB7CisJICAgIXByaXYtPnJ0bGxpYi0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLmJhdXRvc3dpdGNoX2VuYWJsZSkKIAkJcmV0dXJuOworCWlmIChwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHogPT0gZmFsc2UpIHsKKwkJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPD0KKwkJICAgIHByaXYtPnJ0bGxpYi0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF80ME1oenRvMjBNaHopCisJCQlwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHogPSB0cnVlOwogCX0gZWxzZSB7Ci0JCWlmIChwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHogPT0gZmFsc2UpIHsKLQkJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9Ci0JCQkgICAgcHJpdi0+cnRsbGliLT5iYW5kd2lkdGhfYXV0b19zd2l0Y2gudGhyZXNob2xkXzQwTWh6dG8yME1oeikKLQkJCQlwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHogPSB0cnVlOwotCQl9IGVsc2UgewotCQkJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0KLQkJCSAgICBwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC50aHJlc2hvbGRfMjBNaHp0bzQwTWh6KQotCQkJCXByaXYtPnJ0bGxpYi0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLmJmb3JjZWRfdHgyME1oeiA9IGZhbHNlOwotCi0JCX0KKwkJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0KKwkJICAgIHByaXYtPnJ0bGxpYi0+YmFuZHdpZHRoX2F1dG9fc3dpdGNoLnRocmVzaG9sZF8yME1oenRvNDBNaHopCisJCQlwcml2LT5ydGxsaWItPmJhbmR3aWR0aF9hdXRvX3N3aXRjaC5iZm9yY2VkX3R4MjBNaHogPSBmYWxzZTsKIAl9CiB9CiAKQEAgLTUwMSw3ICs0OTgsNyBAQAogCQkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEZXX0J1c3lfRmxhZywgMCk7CiAJCQkJCXJldHVybjsKIAkJCQl9Ci0JCQkJaWYgKChwcml2LT5ydGxsaWItPmVSRlBvd2VyU3RhdGUgIT0gZVJmT24pKSB7CisJCQkJaWYgKHByaXYtPnJ0bGxpYi0+ZVJGUG93ZXJTdGF0ZSAhPSBlUmZPbikgewogCQkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAogCQkJCQkJICJ3ZSBhcmUgaW4gcG93ZXIgc2F2ZSwgc28gcmV0dXJuXG4iKTsKIAkJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQd19UcmFja19GbGFnLCAwKTsKQEAgLTU4MSwxNDggKzU3OCwxNDggQEAKIAkJCQkJICJwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gJWRcbiIsCiAJCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKIAkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCWlmIChBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyIDwgVFNTSV8xM2RCbSAtIEVfRk9SX1RYX1BPV0VSX1RSQUNLKSB7Ci0JCQkJCWlmIChSRl9UeXBlID09IFJGXzJUNFIpIHsKKwkJCX0KKwkJCWlmIChBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyIDwgVFNTSV8xM2RCbSAtIEVfRk9SX1RYX1BPV0VSX1RSQUNLKSB7CisJCQkJaWYgKFJGX1R5cGUgPT0gUkZfMlQ0UikgewogCi0JCQkJCQlpZiAoKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA+IDApICYmCi0JCQkJCQkgICAgKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCA+IDApKSB7Ci0JCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4LS07Ci0JCQkJCQkJaWYgKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID4gNCkgewotCQkJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbC0tOwotCQkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKLQkJCQkJCQkJCSByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAotCQkJCQkJCQkJIGJNYXNrRFdvcmQsCi0JCQkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXgtLTsKLQkJCQkJCQlpZiAocHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPiA0KSB7Ci0JCQkJCQkJCXByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsLS07Ci0JCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAotCQkJCQkJCQkJIHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UsCi0JCQkJCQkJCQkgYk1hc2tEV29yZCwKLQkJCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOwotCQkJCQkJCX0KLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCi0JCQkJCQkJCQkgYk1hc2tEV29yZCwKLQkJCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVs0XS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCi0JCQkJCQkJCQkgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwKLQkJCQkJCQkJCSBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVs0XS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID4gMCkgewotCQkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleC0tOwotCQkJCQkJCWlmIChwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCA+IDQpIHsKLQkJCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwtLTsKLQkJCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCi0JCQkJCQkJCQkJIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCi0JCQkJCQkJCQkJIGJNYXNrRFdvcmQsCi0JCQkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlCi0JCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCi0JCQkJCQkJCQkgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbNF0udHhiYmdhaW5fdmFsdWUpOwotCi0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoUkZfVHlwZSA9PSBSRl8yVDRSKSB7Ci0JCQkJCQlpZiAoKHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA8Ci0JCQkJCQkgICAgVHhCQkdhaW5UYWJsZUxlbmd0aCAtIDEpICYmCi0JCQkJCQkgICAgKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCA8Ci0JCQkJCQkgICAgVHhCQkdhaW5UYWJsZUxlbmd0aCAtIDEpKSB7Ci0JCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4Kys7Ci0JCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwrKzsKKwkJCQkJaWYgKChwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPiAwKSAmJgorCQkJCQkgICAgKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCA+IDApKSB7CisJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgtLTsKKwkJCQkJCWlmIChwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCA+IDQpIHsKKwkJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbC0tOwogCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAogCQkJCQkJCQkgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKIAkJCQkJCQkJIGJNYXNrRFdvcmQsCi0JCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZQotCQkJCQkJCQkgW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4Kys7Ci0JCQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwrKzsKKwkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCQl9CisKKwkJCQkJCXByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleC0tOworCQkJCQkJaWYgKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsID4gNCkgeworCQkJCQkJCXByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsLS07CiAJCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCiAJCQkJCQkJCSByT0ZETTBfWENUeElRSW1iYWxhbmNlLAogCQkJCQkJCQkgYk1hc2tEV29yZCwKIAkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW3ByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsXS50eGJiZ2Fpbl92YWx1ZSk7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAotCQkJCQkJCQkgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKLQkJCQkJCQkJIGJNYXNrRFdvcmQsCi0JCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMV0udHhiYmdhaW5fdmFsdWUpOwotCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAotCQkJCQkJCQkgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwKLQkJCQkJCQkJIGJNYXNrRFdvcmQsIHByaXYtPnR4YmJnYWluX3RhYmxlW1R4QkJHYWluVGFibGVMZW5ndGggLSAxXS50eGJiZ2Fpbl92YWx1ZSk7CiAJCQkJCQl9CiAJCQkJCX0gZWxzZSB7Ci0JCQkJCQlpZiAocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4IDwgKFR4QkJHYWluVGFibGVMZW5ndGggLSAxKSkgewotCQkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCsrOwotCQkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKys7Ci0JCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCisJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkJIGJNYXNrRFdvcmQsCisJCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVs0XS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKKwkJCQkJCQkJIHJPRkRNMF9YQ1R4SVFJbWJhbGFuY2UsCisJCQkJCQkJCSBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVs0XS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID4gMCkgeworCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4LS07CisJCQkJCQlpZiAocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPiA0KSB7CisJCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwtLTsKKwkJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKKwkJCQkJCQkJCSByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAogCQkJCQkJCQkJIGJNYXNrRFdvcmQsCiAJCQkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKLQkJCQkJCX0gZWxzZQotCQkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAotCQkJCQkJCQkJIGJNYXNrRFdvcmQsCi0JCQkJCQkJCQkgcHJpdi0+dHhiYmdhaW5fdGFibGVbVHhCQkdhaW5UYWJsZUxlbmd0aCAtIDFdLnR4YmJnYWluX3ZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoUkZfVHlwZSA9PSBSRl8yVDRSKSB7Ci0JCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZQotCQkJCQkJPSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggLSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5nX2RlZmF1bHQ7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlCi0JCQkJCQk9IHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsIC0gcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ19kZWZhdWx0OwotCQkJCX0KLQotCQkJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjApCi0JCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPQotCQkJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fMjBNZGVmYXVsdCArCi0JCQkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOwotCQkJCWVsc2UKLQkJCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9Ci0JCQkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl80ME1kZWZhdWx0ICsKLQkJCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2U7Ci0KLQkJCQlpZiAocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA+IChDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoLTEpKQotCQkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aC0xOwotCQkJCWlmIChwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uIDwgMCkKLQkJCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9IDA7Ci0KLQkJCQlpZiAocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA+IC0xICYmCi0JCQkJICAgIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPCBDQ0tUeEJCR2FpblRhYmxlTGVuZ3RoKSB7Ci0JCQkJCWlmIChwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDE0ICYmCi0JCQkJCSAgICAhcHJpdi0+YmNja19pbl9jaDE0KSB7Ci0JCQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSB0cnVlOwotCQkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKLQkJCQkJfSBlbHNlIGlmIChwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICE9IDE0ICYmIHByaXYtPmJjY2tfaW5fY2gxNCkgewotCQkJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gZmFsc2U7Ci0JCQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LCBwcml2LT5iY2NrX2luX2NoMTQpOworCQkJCQkJfQogCQkJCQl9IGVsc2UKLQkJCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7Ci0JCQkJfQotCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCi0JCQkJCSAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4ID0gJWRcbiIsCi0JCQkJCSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgpOwotCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCi0JCQkJCSAicHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgPSAlZFxuIiwKLQkJCQkJIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKTsKLQkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAotCQkJCQkgInByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA9ICVkXG4iLAotCQkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlKTsKLQkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAotCQkJCQkgInByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAlZFxuIiwKLQkJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pOworCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCisJCQkJCQkJCSBiTWFza0RXb3JkLCBwcml2LT50eGJiZ2Fpbl90YWJsZVs0XS50eGJiZ2Fpbl92YWx1ZSk7CiAKLQkJCQlpZiAocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlIDw9IC0xMiB8fCBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPj0gMjQpIHsKLQkJCQkJcHJpdi0+cnRsbGliLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IHRydWU7Ci0JCQkJCXdyaXRlX25pY19ieXRlKGRldiwgUHdfVHJhY2tfRmxhZywgMCk7Ci0JCQkJCXdyaXRlX25pY19ieXRlKGRldiwgRldfQnVzeV9GbGFnLCAwKTsKLQkJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInR4IHBvd2VyIHRyYWNrLS0tPmxpbWl0ZWRcbiIpOwotCQkJCQlyZXR1cm47CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoUkZfVHlwZSA9PSBSRl8yVDRSKSB7CisJCQkJCWlmICgocHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4IDwKKwkJCQkJICAgIFR4QkJHYWluVGFibGVMZW5ndGggLSAxKSAmJgorCQkJCQkgICAgKHByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCA8CisJCQkJCSAgICBUeEJCR2FpblRhYmxlTGVuZ3RoIC0gMSkpIHsKKwkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCsrOworCQkJCQkJcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwrKzsKKwkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAorCQkJCQkJCSByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAorCQkJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZQorCQkJCQkJCSBbcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWxdLnR4YmJnYWluX3ZhbHVlKTsKKwkJCQkJCXByaXYtPnJmY190eHBvd2VydHJhY2tpbmdpbmRleCsrOworCQkJCQkJcHJpdi0+cmZjX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwrKzsKKwkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LAorCQkJCQkJCSByT0ZETTBfWENUeElRSW1iYWxhbmNlLAorCQkJCQkJCSBiTWFza0RXb3JkLAorCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmNfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOworCQkJCQl9IGVsc2UgeworCQkJCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsCisJCQkJCQkJIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsCisJCQkJCQkJIGJNYXNrRFdvcmQsCisJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW1R4QkJHYWluVGFibGVMZW5ndGggLSAxXS50eGJiZ2Fpbl92YWx1ZSk7CisJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwKKwkJCQkJCQkgck9GRE0wX1hDVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkgYk1hc2tEV29yZCwgcHJpdi0+dHhiYmdhaW5fdGFibGVbVHhCQkdhaW5UYWJsZUxlbmd0aCAtIDFdLnR4YmJnYWluX3ZhbHVlKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmIChwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPCAoVHhCQkdhaW5UYWJsZUxlbmd0aCAtIDEpKSB7CisJCQkJCQlwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgrKzsKKwkJCQkJCXByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleF9yZWFsKys7CisJCQkJCQlydGw4MTkyX3NldEJCcmVnKGRldiwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCQkJIGJNYXNrRFdvcmQsCisJCQkJCQkJCSBwcml2LT50eGJiZ2Fpbl90YWJsZVtwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbF0udHhiYmdhaW5fdmFsdWUpOworCQkJCQl9IGVsc2UKKwkJCQkJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAorCQkJCQkJCQkgYk1hc2tEV29yZCwKKwkJCQkJCQkJIHByaXYtPnR4YmJnYWluX3RhYmxlW1R4QkJHYWluVGFibGVMZW5ndGggLSAxXS50eGJiZ2Fpbl92YWx1ZSk7CiAJCQkJfQogCQkJfQorCQkJaWYgKFJGX1R5cGUgPT0gUkZfMlQ0UikgeworCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZQorCQkJCQk9IHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCAtIHByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdfZGVmYXVsdDsKKwkJCX0gZWxzZSB7CisJCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlCisJCQkJCT0gcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4X3JlYWwgLSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5nX2RlZmF1bHQ7CisJCQl9CisKKwkJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfMjApCisJCQkJcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9CisJCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uXzIwTWRlZmF1bHQgKworCQkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlOworCQkJZWxzZQorCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPQorCQkJCQkgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl80ME1kZWZhdWx0ICsKKwkJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZTsKKworCQkJaWYgKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPiAoQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aC0xKSkKKwkJCQlwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uID0gQ0NLVHhCQkdhaW5UYWJsZUxlbmd0aC0xOworCQkJaWYgKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPCAwKQorCQkJCXByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24gPSAwOworCisJCQlpZiAocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA+IC0xICYmCisJCQkgICAgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA8IENDS1R4QkJHYWluVGFibGVMZW5ndGgpIHsKKwkJCQlpZiAocHJpdi0+cnRsbGliLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAxNCAmJgorCQkJCSAgICAhcHJpdi0+YmNja19pbl9jaDE0KSB7CisJCQkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IHRydWU7CisJCQkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CisJCQkJfSBlbHNlIGlmIChwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICE9IDE0ICYmIHByaXYtPmJjY2tfaW5fY2gxNCkgeworCQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBmYWxzZTsKKwkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKKwkJCQl9IGVsc2UKKwkJCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKKwkJCX0KKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJICJwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXggPSAlZFxuIiwKKwkJCQkgcHJpdi0+cmZhX3R4cG93ZXJ0cmFja2luZ2luZGV4KTsKKwkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJICJwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCA9ICVkXG4iLAorCQkJCSBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXhfcmVhbCk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJCSAicHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlID0gJWRcbiIsCisJCQkJIHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSk7CisJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLAorCQkJCSAicHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbiA9ICVkXG4iLAorCQkJCSBwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKTsKKworCQkJaWYgKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA8PSAtMTIgfHwgcHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbl9kaWZmZXJlbmNlID49IDI0KSB7CisJCQkJcHJpdi0+cnRsbGliLT5iZHluYW1pY190eHBvd2VyX2VuYWJsZSA9IHRydWU7CisJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQd19UcmFja19GbGFnLCAwKTsKKwkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIEZXX0J1c3lfRmxhZywgMCk7CisJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInR4IHBvd2VyIHRyYWNrLS0tPmxpbWl0ZWRcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKwogCQkJd3JpdGVfbmljX2J5dGUoZGV2LCBQd19UcmFja19GbGFnLCAwKTsKIAkJCUF2Z19UU1NJX01lYXNfZnJvbV9kcml2ZXIgPSAwOwogCQkJZm9yIChrID0gMDsgayA8IDU7IGsrKykKQEAgLTc1Nyw4ICs3NTQsOCBAQAogCQlmb3IgKGkgPSAwOyBpIDwgQ0NLX1RhYmxlX2xlbmd0aDsgaSsrKSB7CiAJCQlpZiAoVGVtcENDayA9PSAodTMyKUNDS1N3aW5nVGFibGVfQ2gxX0NoMTNbaV1bMF0pIHsKIAkJCQlwcml2LT5DQ0tfaW5kZXggPSAodTgpIGk7Ci0JCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkluaXRpYWwgcmVnMHgleCIKLQkJCQkJICIgPSAweCV4LCBDQ0tfaW5kZXggPSAweCV4XG4iLAorCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCQkJCSAiSW5pdGlhbCByZWcweCV4ID0gMHgleCwgQ0NLX2luZGV4ID0gMHgleFxuIiwKIAkJCQkJIHJDQ0swX1R4RmlsdGVyMSwgVGVtcENDaywKIAkJCQkJIHByaXYtPkNDS19pbmRleCk7CiAJCQkJYnJlYWs7CkBAIC04MDMsOCArODAwLDggQEAKIAogCXByaXYtPlJlY29yZF9DQ0tfMjBNaW5kZXggPSB0bXBDQ0syME1pbmRleDsKIAlwcml2LT5SZWNvcmRfQ0NLXzQwTWluZGV4ID0gdG1wQ0NLNDBNaW5kZXg7Ci0JUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIlJlY29yZF9DQ0tfMjBNaW5kZXggLyBSZWNvcmRfQ0NLXzQwIgotCQkgIk1pbmRleCA9ICVkIC8gJWQuXG4iLAorCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsCisJCSAiUmVjb3JkX0NDS18yME1pbmRleCAvIFJlY29yZF9DQ0tfNDBNaW5kZXggPSAlZCAvICVkLlxuIiwKIAkJIHByaXYtPlJlY29yZF9DQ0tfMjBNaW5kZXgsIHByaXYtPlJlY29yZF9DQ0tfNDBNaW5kZXgpOwogCiAJaWYgKHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMTQgJiYKQEAgLTE0MDEsMTMgKzEzOTgsMTIgQEAKIAkJVHhQb3dlckNoZWNrQ250ID0gNTsKIAllbHNlCiAJCVR4UG93ZXJDaGVja0NudCA9IDI7Ci0JaWYgKCFwcml2LT5idHhwb3dlcl90cmFja2luZykgeworCWlmICghcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcpCiAJCXJldHVybjsKLQl9IGVsc2UgewotCQlpZiAocHJpdi0+dHhwb3dlcl9jb3VudCAgPD0gVHhQb3dlckNoZWNrQ250KSB7Ci0JCQlwcml2LT50eHBvd2VyX2NvdW50Kys7Ci0JCQlyZXR1cm47Ci0JCX0KKworCWlmIChwcml2LT50eHBvd2VyX2NvdW50ICA8PSBUeFBvd2VyQ2hlY2tDbnQpIHsKKwkJcHJpdi0+dHhwb3dlcl9jb3VudCsrOworCQlyZXR1cm47CiAJfQogCiAJaWYgKCFUTV9UcmlnZ2VyKSB7CkBAIC0xNDE5LDE0ICsxNDE1LDEyIEBACiAJCX0KIAkJVE1fVHJpZ2dlciA9IDE7CiAJCXJldHVybjsKLQl9IGVsc2UgewotCSAgICBwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT0+U2NoZWR1bGUgVHhQb3dlclRyYWNraW5nV29ya0l0ZW1cbiIpOwotCi0JCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2wocHJpdi0+cHJpdl93cSwgJnByaXYtPnR4cG93ZXJfdHJhY2tpbmdfd3EsIDApOwotCQlUTV9UcmlnZ2VyID0gMDsKLQkJfQotCiAJfQorCW5ldGRldl9pbmZvKGRldiwgIj09PT09PT09PT09PT09PT5TY2hlZHVsZSBUeFBvd2VyVHJhY2tpbmdXb3JrSXRlbVxuIik7CisJcXVldWVfZGVsYXllZF93b3JrX3JzbChwcml2LT5wcml2X3dxLCAmcHJpdi0+dHhwb3dlcl90cmFja2luZ193cSwgMCk7CisJVE1fVHJpZ2dlciA9IDA7CisKK30KIAogc3RhdGljIHZvaWQgZG1fY2hlY2tfdHhwb3dlcl90cmFja2luZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMTQ0Niw3ICsxNDQwLDcgQEAKIAlUZW1wVmFsID0gMDsKIAlpZiAoIWJJbkNIMTQpIHsKIAkJVGVtcFZhbCA9ICh1MzIpKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMF0gKwotCQkJICAocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVsxXTw8OCkpIDsKKwkJCSAgKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV08PDgpKTsKIAogCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIxLCBiTWFza0hXb3JkLCBUZW1wVmFsKTsKIAkJVGVtcFZhbCA9ICh1MzIpKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMl0gKwpAQCAtMTQ1NSwxMiArMTQ0OSwxMiBAQAogCQkJICAocHJpdi0+Y2NrX3R4YmJnYWluX3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVs1XTw8MjQpKTsKIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMiwgYk1hc2tEV29yZCwgVGVtcFZhbCk7CiAJCVRlbXBWYWwgPSAodTMyKShwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzZdICsKLQkJCSAgKHByaXYtPmNja190eGJiZ2Fpbl90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN108PDgpKSA7CisJCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzddPDw4KSk7CiAKIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCwgYk1hc2tMV29yZCwgVGVtcFZhbCk7CiAJfSBlbHNlIHsKIAkJVGVtcFZhbCA9ICh1MzIpKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVswXSArCi0JCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV08PDgpKSA7CisJCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbMV08PDgpKTsKIAogCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIxLCBiTWFza0hXb3JkLCBUZW1wVmFsKTsKIAkJVGVtcFZhbCA9ICh1MzIpKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVsyXSArCkBAIC0xNDY5LDcgKzE0NjMsNyBAQAogCQkJICAocHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbKHU4KShwcml2LT5DQ0tQcmVzZW50QXR0ZW50dWF0aW9uKV0uY2NrdHhiYl92YWx1ZWFycmF5WzVdPDwyNCkpOwogCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfVHhGaWx0ZXIyLCBiTWFza0RXb3JkLCBUZW1wVmFsKTsKIAkJVGVtcFZhbCA9ICh1MzIpKHByaXYtPmNja190eGJiZ2Fpbl9jaDE0X3RhYmxlWyh1OCkocHJpdi0+Q0NLUHJlc2VudEF0dGVudHVhdGlvbildLmNja3R4YmJfdmFsdWVhcnJheVs2XSArCi0JCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN108PDgpKSA7CisJCQkgIChwcml2LT5jY2tfdHhiYmdhaW5fY2gxNF90YWJsZVsodTgpKHByaXYtPkNDS1ByZXNlbnRBdHRlbnR1YXRpb24pXS5jY2t0eGJiX3ZhbHVlYXJyYXlbN108PDgpKTsKIAogCQlydGw4MTkyX3NldEJCcmVnKGRldiwgckNDSzBfRGVidWdQb3J0LCBiTWFza0xXb3JkLCBUZW1wVmFsKTsKIAl9CkBAIC0xNDg1LDcgKzE0NzksNyBAQAogCVRlbXBWYWwgPSAwOwogCWlmICghYkluQ0gxNCkgewogCQlUZW1wVmFsID0JQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzBdICsKLQkJCQkJKENDS1N3aW5nVGFibGVfQ2gxX0NoMTNbcHJpdi0+Q0NLX2luZGV4XVsxXTw8OCkgOworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzFdPDw4KTsKIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX1R4RmlsdGVyMSwgYk1hc2tIV29yZCwgVGVtcFZhbCk7CiAJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgbm90IGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKIAkJCXJDQ0swX1R4RmlsdGVyMSwgVGVtcFZhbCk7CkBAIC0xNDk3LDE0ICsxNDkxLDE0IEBACiAJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgbm90IGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKIAkJCXJDQ0swX1R4RmlsdGVyMiwgVGVtcFZhbCk7CiAJCVRlbXBWYWwgPQlDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bNl0gKwotCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDFfQ2gxM1twcml2LT5DQ0tfaW5kZXhdWzddPDw4KSA7CisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMV9DaDEzW3ByaXYtPkNDS19pbmRleF1bN108PDgpOwogCiAJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9EZWJ1Z1BvcnQsIGJNYXNrTFdvcmQsIFRlbXBWYWwpOwogCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIG5vdCBjaG5sIDE0LCByZWcgMHgleCA9IDB4JXhcbiIsCiAJCQlyQ0NLMF9EZWJ1Z1BvcnQsIFRlbXBWYWwpOwogCX0gZWxzZSB7CiAJCVRlbXBWYWwgPQlDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVswXSArCi0JCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVsxXTw8OCkgOworCQkJCQkoQ0NLU3dpbmdUYWJsZV9DaDE0W3ByaXYtPkNDS19pbmRleF1bMV08PDgpOwogCiAJCXJ0bDgxOTJfc2V0QkJyZWcoZGV2LCByQ0NLMF9UeEZpbHRlcjEsIGJNYXNrSFdvcmQsIFRlbXBWYWwpOwogCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAiQ0NLIGNobmwgMTQsIHJlZyAweCV4ID0gMHgleFxuIiwKQEAgLTE1MTcsNyArMTUxMSw3IEBACiAJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgY2hubCAxNCwgcmVnIDB4JXggPSAweCV4XG4iLAogCQkJckNDSzBfVHhGaWx0ZXIyLCBUZW1wVmFsKTsKIAkJVGVtcFZhbCA9CUNDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzZdICsKLQkJCQkJKENDS1N3aW5nVGFibGVfQ2gxNFtwcml2LT5DQ0tfaW5kZXhdWzddPDw4KSA7CisJCQkJCShDQ0tTd2luZ1RhYmxlX0NoMTRbcHJpdi0+Q0NLX2luZGV4XVs3XTw8OCk7CiAKIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJDQ0swX0RlYnVnUG9ydCwgYk1hc2tMV29yZCwgVGVtcFZhbCk7CiAJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJDQ0sgY2hubCAxNCwgcmVnIDB4JXggPSAweCV4XG4iLApAQCAtMTU2OSw3ICsxNTYzLDcgQEAKIAl1MzIJcmVnX3JhdHIgPSBwcml2LT5yYXRlX2FkYXB0aXZlLmxhc3RfcmF0cjsKIAl1MzIgcmF0cl92YWx1ZTsKIAotCWlmIChJU19OSUNfRE9XTihwcml2KSkgeworCWlmICghcHJpdi0+dXApIHsKIAkJUlRfVFJBQ0UoQ09NUF9SQVRFLCAiPC0tLS0gZG1fcmVzdG9yZV9keW5hbWljX21lY2hhbmlzbV9zdGF0ZSgpOiBkcml2ZXIgaXMgZ29pbmcgdG8gdW5sb2FkXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTE4MzAsMTIgKzE4MjQsMTEgQEAKIAlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPiBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpICYmCiAJCShwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkpCiAJCXJldHVybjsKLQlpZiAoKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPD0gZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoKSkgeworCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkgewogCQlpZiAoZG1fZGlndGFibGUuZGlnX3N0YXRlID09IERNX1NUQV9ESUdfT0ZGICYmCiAJCQkocHJpdi0+cmVzZXRfY291bnQgPT0gcmVzZXRfY250KSkKIAkJCXJldHVybjsKLQkJZWxzZQotCQkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CisJCXJlc2V0X2NudCA9IHByaXYtPnJlc2V0X2NvdW50OwogCiAJCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19NQVg7CiAJCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZSA9IERNX1NUQV9ESUdfT0ZGOwpAQCAtMTg1NywxOSArMTg1MCwxOCBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2gpKSB7CisJaWYgKHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkgewogCQl1OCByZXNldF9mbGFnID0gMDsKIAogCQlpZiAoZG1fZGlndGFibGUuZGlnX3N0YXRlID09IERNX1NUQV9ESUdfT04gJiYKIAkJICAgIChwcml2LT5yZXNldF9jb3VudCA9PSByZXNldF9jbnQpKSB7CiAJCQlkbV9jdHJsX2luaXRnYWluX2J5cnNzaV9oaWdocHdyKGRldik7CiAJCQlyZXR1cm47Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocHJpdi0+cmVzZXRfY291bnQgIT0gcmVzZXRfY250KQotCQkJCXJlc2V0X2ZsYWcgPSAxOwotCi0JCQlyZXNldF9jbnQgPSBwcml2LT5yZXNldF9jb3VudDsKIAkJfQorCQlpZiAocHJpdi0+cmVzZXRfY291bnQgIT0gcmVzZXRfY250KQorCQkJcmVzZXRfZmxhZyA9IDE7CisKKwkJcmVzZXRfY250ID0gcHJpdi0+cmVzZXRfY291bnQ7CiAKIAkJZG1fZGlndGFibGUuZGlnX3N0YXRlID0gRE1fU1RBX0RJR19PTjsKIApAQCAtMTkxMSw4ICsxOTAzLDcgQEAKIAkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID09IERNX1NUQV9ESUdfT04gJiYKIAkJCShwcml2LT5yZXNldF9jb3VudCA9PSByZXNldF9jbnRfaGlnaHB3cikpCiAJCQlyZXR1cm47Ci0JCWVsc2UKLQkJCWRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID0gRE1fU1RBX0RJR19PTjsKKwkJZG1fZGlndGFibGUuZGlnX2hpZ2hwd3Jfc3RhdGUgPSBETV9TVEFfRElHX09OOwogCiAJCWlmIChwcml2LT5DdXJyZW50Q2hhbm5lbEJXICE9IEhUX0NIQU5ORUxfV0lEVEhfMjApCiAJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAock9GRE0wX1hBVHhBRkUrMyksIDB4MTApOwpAQCAtMTkyMiw4ICsxOTEzLDcgQEAKIAkJaWYgKGRtX2RpZ3RhYmxlLmRpZ19oaWdocHdyX3N0YXRlID09IERNX1NUQV9ESUdfT0ZGICYmCiAJCQkocHJpdi0+cmVzZXRfY291bnQgPT0gcmVzZXRfY250X2hpZ2hwd3IpKQogCQkJcmV0dXJuOwotCQllbHNlCi0JCQlkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9IERNX1NUQV9ESUdfT0ZGOworCQlkbV9kaWd0YWJsZS5kaWdfaGlnaHB3cl9zdGF0ZSA9IERNX1NUQV9ESUdfT0ZGOwogCiAJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiIDwgZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2xvd3RocmVzaCAmJgogCQkJIHByaXYtPnVuZGVjb3JhdGVkX3Ntb290aGVkX3B3ZGIgPj0gZG1fZGlndGFibGUucnNzaV9oaWdoX3RocmVzaCkgewpAQCAtMjAwOCw3ICsxOTk4LDcgQEAKIAkJaWYgKGRtX2RpZ3RhYmxlLkN1clNUQUNvbm5lY3RTdGF0ZSA9PSBESUdfU1RBX0NPTk5FQ1QpIHsKIAkJCWlmIChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfaGlnaHRocmVzaCkKIAkJCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX0hJR0hfUE9XRVI7Ci0JCQllbHNlIGlmICgoZG1fZGlndGFibGUucnNzaV92YWwgPD0gZG1fZGlndGFibGUucnNzaV9sb3dfdGhyZXNoKSkKKwkJCWVsc2UgaWYgKGRtX2RpZ3RhYmxlLnJzc2lfdmFsIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkKIAkJCQlkbV9kaWd0YWJsZS5jdXJwZF90aHN0YXRlID0gRElHX1BEX0FUX0xPV19QT1dFUjsKIAkJCWVsc2UgaWYgKChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSAmJgogCQkJCQkoZG1fZGlndGFibGUucnNzaV92YWwgPCBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfcG93ZXJfbG93dGhyZXNoKSkKQEAgLTIwNjUsOSArMjA1NSw5IEBACiAKIAlpZiAoZG1fZGlndGFibGUuUHJlU1RBQ29ubmVjdFN0YXRlID09IGRtX2RpZ3RhYmxlLkN1clNUQUNvbm5lY3RTdGF0ZSkgewogCQlpZiAoZG1fZGlndGFibGUuQ3VyU1RBQ29ubmVjdFN0YXRlID09IERJR19TVEFfQ09OTkVDVCkgewotCQkJaWYgKChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA8PSBkbV9kaWd0YWJsZS5yc3NpX2xvd190aHJlc2gpKQorCQkJaWYgKGRtX2RpZ3RhYmxlLnJzc2lfdmFsIDw9IGRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCkKIAkJCQlkbV9kaWd0YWJsZS5jdXJjc19yYXRpb19zdGF0ZSA9IERJR19DU19SQVRJT19MT1dFUjsKLQkJCWVsc2UgaWYgKChkbV9kaWd0YWJsZS5yc3NpX3ZhbCA+PSBkbV9kaWd0YWJsZS5yc3NpX2hpZ2hfdGhyZXNoKSkKKwkJCWVsc2UgaWYgKGRtX2RpZ3RhYmxlLnJzc2lfdmFsID49IGRtX2RpZ3RhYmxlLnJzc2lfaGlnaF90aHJlc2gpCiAJCQkJZG1fZGlndGFibGUuY3VyY3NfcmF0aW9fc3RhdGUgPSBESUdfQ1NfUkFUSU9fSElHSEVSOwogCQkJZWxzZQogCQkJCWRtX2RpZ3RhYmxlLmN1cmNzX3JhdGlvX3N0YXRlID0gZG1fZGlndGFibGUucHJlY3NfcmF0aW9fc3RhdGU7CkBAIC0yMTMxLDEwICsyMTIxLDEwIEBACiAJCXN0YXRpYyBpbnQgd2JfdG1wOwogCiAJCWlmICh3Yl90bXAgPT0gMCkgewotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTppb3QgcGVlciBpcyAlcywgYnNzaWQ6IgotCQkJICAgICAgICIgJXBNXG4iLCBfX2Z1bmNfXywKLQkJCSAgICAgICBwZWVybmFtZVtwSFRJbmZvLT5JT1RQZWVyXSwKLQkJCSAgICAgICBwcml2LT5ydGxsaWItPmN1cnJlbnRfbmV0d29yay5ic3NpZCk7CisJCQluZXRkZXZfaW5mbyhkZXYsCisJCQkJICAgICIlcygpOmlvdCBwZWVyIGlzICVzLCBic3NpZDogJXBNXG4iLAorCQkJCSAgICBfX2Z1bmNfXywgcGVlcm5hbWVbcEhUSW5mby0+SU9UUGVlcl0sCisJCQkJICAgIHByaXYtPnJ0bGxpYi0+Y3VycmVudF9uZXR3b3JrLmJzc2lkKTsKIAkJCXdiX3RtcCA9IDE7CiAJCX0KIAl9CkBAIC0yNjM4LDkgKzI2MjgsMTAgQEAKIAkJfQogCQlwcml2LT5yYXRlX3JlY29yZCA9IHJhdGVfY291bnQ7CiAJCXByaXYtPnJhdGVDb3VudERpZmZSZWNvcmQgPSByYXRlX2NvdW50X2RpZmY7Ci0JCVJUX1RSQUNFKENPTVBfSEFMRE0sICJyYXRlUmVjb3JkICVkIHJhdGVDb3VudCAlZCwgcmF0ZSIKLQkJCSAiQ291bnRkaWZmICVkIGJTd2l0Y2hGc3luYyAlZFxuIiwgcHJpdi0+cmF0ZV9yZWNvcmQsCi0JCQkgcmF0ZV9jb3VudCwgcmF0ZV9jb3VudF9kaWZmLCBwcml2LT5ic3dpdGNoX2ZzeW5jKTsKKwkJUlRfVFJBQ0UoQ09NUF9IQUxETSwKKwkJCSAicmF0ZVJlY29yZCAlZCByYXRlQ291bnQgJWQsIHJhdGVDb3VudGRpZmYgJWQgYlN3aXRjaEZzeW5jICVkXG4iLAorCQkJIHByaXYtPnJhdGVfcmVjb3JkLCByYXRlX2NvdW50LCByYXRlX2NvdW50X2RpZmYsCisJCQkgcHJpdi0+YnN3aXRjaF9mc3luYyk7CiAJCWlmIChwcml2LT51bmRlY29yYXRlZF9zbW9vdGhlZF9wd2RiID4KIAkJICAgIHByaXYtPnJ0bGxpYi0+ZnN5bmNfcnNzaV90aHJlc2hvbGQgJiYKIAkJICAgIGJTd2l0Y2hGcm9tQ291bnREaWZmKSB7CkBAIC0yNjY1LDE0ICsyNjU2LDE0IEBACiAJCQlpZiAodGltZXJfcGVuZGluZygmcHJpdi0+ZnN5bmNfdGltZXIpKQogCQkJCWRlbF90aW1lcl9zeW5jKCZwcml2LT5mc3luY190aW1lcik7CiAJCQlwcml2LT5mc3luY190aW1lci5leHBpcmVzID0gamlmZmllcyArCi0JCQkJIE1TRUNTKHByaXYtPnJ0bGxpYi0+ZnN5bmNfdGltZV9pbnRlcnZhbCAqCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMocHJpdi0+cnRsbGliLT5mc3luY190aW1lX2ludGVydmFsICoKIAkJCQkgcHJpdi0+cnRsbGliLT5mc3luY19tdWx0aXBsZV90aW1laW50ZXJ2YWwpOwogCQkJYWRkX3RpbWVyKCZwcml2LT5mc3luY190aW1lcik7CiAJCX0gZWxzZSB7CiAJCQlpZiAodGltZXJfcGVuZGluZygmcHJpdi0+ZnN5bmNfdGltZXIpKQogCQkJCWRlbF90aW1lcl9zeW5jKCZwcml2LT5mc3luY190aW1lcik7CiAJCQlwcml2LT5mc3luY190aW1lci5leHBpcmVzID0gamlmZmllcyArCi0JCQkJIE1TRUNTKHByaXYtPnJ0bGxpYi0+ZnN5bmNfdGltZV9pbnRlcnZhbCk7CisJCQkJIG1zZWNzX3RvX2ppZmZpZXMocHJpdi0+cnRsbGliLT5mc3luY190aW1lX2ludGVydmFsKTsKIAkJCWFkZF90aW1lcigmcHJpdi0+ZnN5bmNfdGltZXIpOwogCQl9CiAJfSBlbHNlIHsKQEAgLTI2ODUsOSArMjY3NiwxMCBAQAogCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjIsIDB4NDY1YzUyY2QpOwogCX0KIAlSVF9UUkFDRShDT01QX0hBTERNLCAiQ29udGludWVEaWZmQ291bnQgJWRcbiIsIHByaXYtPkNvbnRpbnVlRGlmZkNvdW50KTsKLQlSVF9UUkFDRShDT01QX0hBTERNLCAicmF0ZVJlY29yZCAlZCByYXRlQ291bnQgJWQsIHJhdGVDb3VudGRpZmYgJWQgIgotCQkgImJTd2l0Y2hGc3luYyAlZFxuIiwgcHJpdi0+cmF0ZV9yZWNvcmQsIHJhdGVfY291bnQsCi0JCSByYXRlX2NvdW50X2RpZmYsIHByaXYtPmJzd2l0Y2hfZnN5bmMpOworCVJUX1RSQUNFKENPTVBfSEFMRE0sCisJCSAicmF0ZVJlY29yZCAlZCByYXRlQ291bnQgJWQsIHJhdGVDb3VudGRpZmYgJWQgYlN3aXRjaEZzeW5jICVkXG4iLAorCQkgcHJpdi0+cmF0ZV9yZWNvcmQsIHJhdGVfY291bnQsIHJhdGVfY291bnRfZGlmZiwKKwkJIHByaXYtPmJzd2l0Y2hfZnN5bmMpOwogfQogCiBzdGF0aWMgdm9pZCBkbV9TdGFydEhXRnN5bmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTI3NjIsNyArMjc1NCw3IEBACiAJaWYgKHRpbWVyX3BlbmRpbmcoJnByaXYtPmZzeW5jX3RpbWVyKSkKIAkJZGVsX3RpbWVyX3N5bmMoJnByaXYtPmZzeW5jX3RpbWVyKTsKIAlwcml2LT5mc3luY190aW1lci5leHBpcmVzID0gamlmZmllcyArCi0JCQkJICAgIE1TRUNTKHByaXYtPnJ0bGxpYi0+ZnN5bmNfdGltZV9pbnRlcnZhbCk7CisJCQkJICAgIG1zZWNzX3RvX2ppZmZpZXMocHJpdi0+cnRsbGliLT5mc3luY190aW1lX2ludGVydmFsKTsKIAlhZGRfdGltZXIoJnByaXYtPmZzeW5jX3RpbWVyKTsKIAogCXdyaXRlX25pY19kd29yZChkZXYsIHJPRkRNMF9SeERldGVjdG9yMiwgMHg0NjVjMTJjZCk7CkBAIC0yNzc4LDEyICsyNzcwLDE0IEBACiAJc3RhdGljIHU4IHJlZ19jMzhfU3RhdGUgPSBSZWdDMzhfRGVmYXVsdDsKIAlzdGF0aWMgdTMyIHJlc2V0X2NudDsKIAotCVJUX1RSQUNFKENPTVBfSEFMRE0sICJSU1NJICVkIFRpbWVJbnRlcnZhbCAlZCBNdWx0aXBsZVRpbWVJbnRlcnZhbCAiCi0JCSAiJWRcbiIsIHByaXYtPnJ0bGxpYi0+ZnN5bmNfcnNzaV90aHJlc2hvbGQsCisJUlRfVFJBQ0UoQ09NUF9IQUxETSwKKwkJICJSU1NJICVkIFRpbWVJbnRlcnZhbCAlZCBNdWx0aXBsZVRpbWVJbnRlcnZhbCAlZFxuIiwKKwkJIHByaXYtPnJ0bGxpYi0+ZnN5bmNfcnNzaV90aHJlc2hvbGQsCiAJCSBwcml2LT5ydGxsaWItPmZzeW5jX3RpbWVfaW50ZXJ2YWwsCiAJCSBwcml2LT5ydGxsaWItPmZzeW5jX211bHRpcGxlX3RpbWVpbnRlcnZhbCk7Ci0JUlRfVFJBQ0UoQ09NUF9IQUxETSwgIlJhdGVCaXRtYXAgMHgleCBGaXJzdERpZmZSYXRlVGhyZXNob2xkICVkIFNlY29uZCIKLQkJICJEaWZmUmF0ZVRocmVzaG9sZCAlZFxuIiwgcHJpdi0+cnRsbGliLT5mc3luY19yYXRlX2JpdG1hcCwKKwlSVF9UUkFDRShDT01QX0hBTERNLAorCQkgIlJhdGVCaXRtYXAgMHgleCBGaXJzdERpZmZSYXRlVGhyZXNob2xkICVkIFNlY29uZERpZmZSYXRlVGhyZXNob2xkICVkXG4iLAorCQkgcHJpdi0+cnRsbGliLT5mc3luY19yYXRlX2JpdG1hcCwKIAkJIHByaXYtPnJ0bGxpYi0+ZnN5bmNfZmlyc3RkaWZmX3JhdGV0aHJlc2hvbGQsCiAJCSBwcml2LT5ydGxsaWItPmZzeW5jX3NlY29uZGRpZmZfcmF0ZXRocmVzaG9sZCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfZG0uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfZG0uaAppbmRleCBhYjQ0YTlhLi4zZjAyZTExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX2RtLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9kbS5oCkBAIC0yNTUsMTQgKzI1NSw2IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBNYXJjbyBEZWZpbml0aW9uLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNkZWZpbmUgRE1fQVBJbml0R2FpbkNoYW5nZU5vdGlmeShFdmVudCkJCVwKLQl7CQkJCQkJXAotCQlkbV9kaWd0YWJsZS5DdXJBUENvbm5lY3RTdGF0ZSA9IEV2ZW50OwlcCi0JfQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgTWFyY28gRGVmaW5pdGlvbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydGVkIEZ1bmN0aW9uIHByb3RvdHlwZS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRXhwb3J0ZWQgRnVuY3Rpb24gcHJvdG90eXBlLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIGV4dGVybiAgdm9pZCAgICBpbml0X2hhbF9kbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BjaS5jCmluZGV4IDJhZDkyZWUuLjUxZjUzYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wY2kuYwpAQCAtNjUsMjcgKzY1LDMyIEBACiAJaWYgKERldmljZUlEID09IDB4ODE3MikgewogCQlzd2l0Y2ggKFJldmlzaW9uSUQpIHsKIAkJY2FzZSBIQUxfSFdfUENJX1JFVklTSU9OX0lEXzgxOTJQQ0lFOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiQWRhcHRlcig4MTkyIFBDSS1FKSBpcyBmb3VuZCAtICIKLQkJCSAgICAgICAiRGV2aWNlSUQ9JXhcbiIsIERldmljZUlEKTsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkJICJBZGFwdGVyKDgxOTIgUENJLUUpIGlzIGZvdW5kIC0gRGV2aWNlSUQ9JXhcbiIsCisJCQkJIERldmljZUlEKTsKIAkJCXByaXYtPmNhcmRfODE5MiA9IE5JQ184MTkyRTsKIAkJCWJyZWFrOwogCQljYXNlIEhBTF9IV19QQ0lfUkVWSVNJT05fSURfODE5MlNFOgotCQkJcHJpbnRrKEtFUk5fSU5GTyAiQWRhcHRlcig4MTkyU0UpIGlzIGZvdW5kIC0gIgotCQkJICAgICAgICJEZXZpY2VJRD0leFxuIiwgRGV2aWNlSUQpOworCQkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCQkgIkFkYXB0ZXIoODE5MlNFKSBpcyBmb3VuZCAtIERldmljZUlEPSV4XG4iLAorCQkJCSBEZXZpY2VJRCk7CiAJCQlwcml2LT5jYXJkXzgxOTIgPSBOSUNfODE5MlNFOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlwcmludGsoS0VSTl9JTkZPICJVTktOT1dOIG5pYyB0eXBlKCU0eDolNHgpXG4iLAotCQkJICAgICAgIHBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlKTsKKwkJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkJICJVTktOT1dOIG5pYyB0eXBlKCU0eDolNHgpXG4iLAorCQkJCSBwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSk7CiAJCQlwcml2LT5jYXJkXzgxOTIgPSBOSUNfVU5LTk9XTjsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCX0KIAogCWlmIChwcml2LT5vcHMtPm5pY190eXBlICE9IHByaXYtPmNhcmRfODE5MikgewotCQlwcmludGsoS0VSTl9JTkZPICJEZXRlY3QgaW5mbygleCkgYW5kIGhhcmR3YXJlIGluZm8oJXgpIG5vdCBtYXRjaCFcbiIsCi0JCQkJcHJpdi0+b3BzLT5uaWNfdHlwZSwgcHJpdi0+Y2FyZF84MTkyKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUGxlYXNlIHNlbGVjdCBwcm9wZXIgZHJpdmVyIGJlZm9yZSBpbnN0YWxsISEhIVxuIik7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIkRldGVjdCBpbmZvKCV4KSBhbmQgaGFyZHdhcmUgaW5mbygleCkgbm90IG1hdGNoIVxuIiwKKwkJCSBwcml2LT5vcHMtPm5pY190eXBlLCBwcml2LT5jYXJkXzgxOTIpOworCQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJICJQbGVhc2Ugc2VsZWN0IHByb3BlciBkcml2ZXIgYmVmb3JlIGluc3RhbGwhISEhXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wbS5jCmluZGV4IDBiNGY3NjQuLmNhNmVjZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BtLmMKQEAgLTI5LDE0ICsyOSwxNCBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAl1MzIJdWxSZWdSZWFkOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PiByODE5MkUgc3VzcGVuZCBjYWxsLlxuIik7CisJbmV0ZGV2X2luZm8oZGV2LCAiPT09PT09PT09PT09PiByODE5MkUgc3VzcGVuZCBjYWxsLlxuIik7CiAJZGVsX3RpbWVyX3N5bmMoJnByaXYtPmdwaW9fcG9sbGluZ190aW1lcik7CiAJY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+Z3Bpb19jaGFuZ2VfcmZfd3EpOwogCXByaXYtPnBvbGxpbmdfdGltZXJfb24gPSAwOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUlRMODE5WEU6VUkgaXMgb3BlbiBvdXQgb2Ygc3VzcGVuZCAiCi0JCSAgICAgICAiZnVuY3Rpb25cbiIpOworCQluZXRkZXZfaW5mbyhkZXYsCisJCQkgICAgIlJUTDgxOVhFOlVJIGlzIG9wZW4gb3V0IG9mIHN1c3BlbmQgZnVuY3Rpb25cbiIpOwogCQlnb3RvIG91dF9wY2lfc3VzcGVuZDsKIAl9CiAKQEAgLTU3LDEwICs1NywxMCBAQAogCQl3cml0ZV9uaWNfYnl0ZShkZXYsIE1hY0Jsa0N0cmwsIDB4YSk7CiAJfQogb3V0X3BjaV9zdXNwZW5kOgotCXByaW50aygicjgxOTJFIHN1cHBvcnQgV09MIGNhbGw/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/XG4iKTsKKwluZXRkZXZfaW5mbyhkZXYsICJyODE5MkUgc3VwcG9ydCBXT0wgY2FsbD8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz9cbiIpOwogCWlmIChwcml2LT5ydGxsaWItPmJTdXBwb3J0UmVtb3RlV2FrZVVwKQotCQlSVF9UUkFDRShDT01QX1BPV0VSLCAicjgxOTJFIHN1cHBvcnQgV09MIGNhbGwhISEhISEhIgotCQkJICIhISEhISEhISEhIS5cbiIpOworCQlSVF9UUkFDRShDT01QX1BPV0VSLAorCQkJICJyODE5MkUgc3VwcG9ydCBXT0wgY2FsbCEhISEhISEhISEhISEhISEhIS5cbiIpOwogCXBjaV9zYXZlX3N0YXRlKHBkZXYpOwogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAlwY2lfZW5hYmxlX3dha2UocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSksCkBAIC03OSwxNCArNzksMTMgQEAKIAlpbnQgZXJyOwogCXUzMiB2YWw7CiAKLQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT09PT09PnI4MTkyRSByZXN1bWUgY2FsbC5cbiIpOworCW5ldGRldl9pbmZvKGRldiwgIj09PT09PT09PT09PT09PT0+cjgxOTJFIHJlc3VtZSBjYWxsLlxuIik7CiAKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CiAKIAllcnIgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiJXM6IHBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCBvbiByZXN1bWVcbiIsCi0JCSAgICAgICBkZXYtPm5hbWUpOworCQluZXRkZXZfZXJyKGRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCBvbiByZXN1bWVcbiIpOwogCQlyZXR1cm4gZXJyOwogCX0KIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKQEAgLTEwMSw4ICsxMDAsOCBAQAogCQljaGVja19yZmN0cmxfZ3Bpb190aW1lcigodW5zaWduZWQgbG9uZylkZXYpOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUlRMODE5WEU6VUkgaXMgb3BlbiBvdXQgb2YgcmVzdW1lICIKLQkJICAgICAgICJmdW5jdGlvblxuIik7CisJCW5ldGRldl9pbmZvKGRldiwKKwkJCSAgICAiUlRMODE5WEU6VUkgaXMgb3BlbiBvdXQgb2YgcmVzdW1lIGZ1bmN0aW9uXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3BzLmMKaW5kZXggNDg1NmI3Ni4uMGJiZmZlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF9wcy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfcHMuYwpAQCAtMzcsOCArMzcsOCBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFncyk7CiAJaWYgKHByaXYtPlJGQ2hhbmdlSW5Qcm9ncmVzcykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFncyk7Ci0JCVJUX1RSQUNFKENPTVBfREJHLCAicnRsODE5Ml9od19zbGVlcF9kb3duKCk6IFJGIENoYW5nZSBpbiAiCi0JCQkgInByb2dyZXNzIVxuIik7CisJCVJUX1RSQUNFKENPTVBfREJHLAorCQkJICJydGw4MTkyX2h3X3NsZWVwX2Rvd24oKTogUkYgQ2hhbmdlIGluIHByb2dyZXNzIVxuIik7CiAJCXJldHVybjsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmZfcHNfbG9jaywgZmxhZ3MpOwpAQCAtNjQsMTAgKzY0LDExIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWdzKTsKIAlpZiAocHJpdi0+UkZDaGFuZ2VJblByb2dyZXNzKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJmX3BzX2xvY2ssIGZsYWdzKTsKLQkJUlRfVFJBQ0UoQ09NUF9EQkcsICJydGw4MTkyX2h3X3dha2V1cCgpOiBSRiBDaGFuZ2UgaW4gIgotCQkJICJwcm9ncmVzcyFcbiIpOworCQlSVF9UUkFDRShDT01QX0RCRywKKwkJCSAicnRsODE5Ml9od193YWtldXAoKTogUkYgQ2hhbmdlIGluIHByb2dyZXNzIVxuIik7CiAJCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2wocHJpdi0+cnRsbGliLT53cSwKLQkJCQkgICAgICAgJnByaXYtPnJ0bGxpYi0+aHdfd2FrZXVwX3dxLCBNU0VDUygxMCkpOworCQkJCSAgICAgICAmcHJpdi0+cnRsbGliLT5od193YWtldXBfd3EsCisJCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKIAkJcmV0dXJuOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZl9wc19sb2NrLCBmbGFncyk7CkBAIC05NSwxOCArOTYsMTggQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5wc19sb2NrLCBmbGFncyk7CiAKLQl0aW1lIC09IE1TRUNTKDgrMTYrNyk7CisJdGltZSAtPSBtc2Vjc190b19qaWZmaWVzKDggKyAxNiArIDcpOwogCi0JaWYgKCh0aW1lIC0gamlmZmllcykgPD0gTVNFQ1MoTUlOX1NMRUVQX1RJTUUpKSB7CisJaWYgKCh0aW1lIC0gamlmZmllcykgPD0gbXNlY3NfdG9famlmZmllcyhNSU5fU0xFRVBfVElNRSkpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cHNfbG9jaywgZmxhZ3MpOwotCQlwcmludGsoS0VSTl9JTkZPICJ0b28gc2hvcnQgdG8gc2xlZXA6OiVsbGQgPCAlbGRcbiIsCi0JCSAgICAgICB0aW1lIC0gamlmZmllcywgTVNFQ1MoTUlOX1NMRUVQX1RJTUUpKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAidG9vIHNob3J0IHRvIHNsZWVwOjolbGxkIDwgJWxkXG4iLAorCQkJICAgIHRpbWUgLSBqaWZmaWVzLCBtc2Vjc190b19qaWZmaWVzKE1JTl9TTEVFUF9USU1FKSk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoKHRpbWUgLSBqaWZmaWVzKSA+IE1TRUNTKE1BWF9TTEVFUF9USU1FKSkgewotCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT50b28gbG9uZyB0byBzbGVlcDolbGxkID4gJWxkXG4iLAotCQkgICAgICAgdGltZSAtIGppZmZpZXMsICBNU0VDUyhNQVhfU0xFRVBfVElNRSkpOworCWlmICgodGltZSAtIGppZmZpZXMpID4gbXNlY3NfdG9famlmZmllcyhNQVhfU0xFRVBfVElNRSkpIHsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiPT09PT09PT0+dG9vIGxvbmcgdG8gc2xlZXA6JWxsZCA+ICVsZFxuIiwKKwkJCSAgICB0aW1lIC0gamlmZmllcywgbXNlY3NfdG9famlmZmllcyhNQVhfU0xFRVBfVElNRSkpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wc19sb2NrLCBmbGFncyk7CiAJCXJldHVybjsKIAl9CkBAIC0yMDEsMTIgKzIwMiwxMSBAQAogCQkJCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTogUkYgaXMgT0ZGLlxuIiwKIAkJCQkJIF9fZnVuY19fKTsKIAkJCQlyZXR1cm47Ci0JCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT4lcygpOiBJUFNMZWF2ZVxuIiwKLQkJCQkgICAgICAgX19mdW5jX18pOwotCQkJCXF1ZXVlX3dvcmtfcnNsKHByaXYtPnJ0bGxpYi0+d3EsCi0JCQkJCSAgICAgICAmcHJpdi0+cnRsbGliLT5pcHNfbGVhdmVfd3EpOwogCQkJfQorCQkJbmV0ZGV2X2luZm8oZGV2LCAiPT09PT09PT09PiVzKCk6IElQU0xlYXZlXG4iLAorCQkJCSAgICBfX2Z1bmNfXyk7CisJCQlxdWV1ZV93b3JrX3JzbChwcml2LT5ydGxsaWItPndxLAorCQkJCSAgICAgICAmcHJpdi0+cnRsbGliLT5pcHNfbGVhdmVfd3EpOwogCQl9CiAJfQogfQpAQCAtMjM5LDggKzIzOSw4IEBACiAJCXByaXYtPnJ0bGxpYi0+c3RhX3NsZWVwID0gTFBTX0lTX1dBS0U7CiAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJihwcml2LT5ydGxsaWItPm1nbXRfdHhfbG9jayksIGZsYWdzKTsKLQkJUlRfVFJBQ0UoQ09NUF9EQkcsICJMUFMgbGVhdmU6IG5vdGlmeSBBUCB3ZSBhcmUgYXdha2VkIgotCQkJICIgKysrKysrKysrKyBTZW5kTnVsbEZ1bmN0aW9uRGF0YVxuIik7CisJCVJUX1RSQUNFKENPTVBfREJHLAorCQkJICJMUFMgbGVhdmU6IG5vdGlmeSBBUCB3ZSBhcmUgYXdha2VkICsrKysrKysrKysgU2VuZE51bGxGdW5jdGlvbkRhdGFcbiIpOwogCQlydGxsaWJfc3RhX3BzX3NlbmRfbnVsbF9mcmFtZShwcml2LT5ydGxsaWIsIDApOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocHJpdi0+cnRsbGliLT5tZ210X3R4X2xvY2spLCBmbGFncyk7CiAJfQpAQCAtMjU1LDggKzI1NSw4IEBACiAJCQkJCSYocHJpdi0+cnRsbGliLT5Qb3dlclNhdmVDb250cm9sKTsKIAogCVJUX1RSQUNFKENPTVBfUFMsICJMZWlzdXJlUFNFbnRlcigpLi4uXG4iKTsKLQlSVF9UUkFDRShDT01QX1BTLCAicFBTQy0+YkxlaXN1cmVQcyA9ICVkLCBpZWVlLT5wcyA9ICVkLHBQU0MtPkxwc0lkbGUiCi0JCSAiQ291bnQgaXMgJWQsUlRfQ0hFQ0tfRk9SX0hBTkdfUEVSSU9EIGlzICVkXG4iLAorCVJUX1RSQUNFKENPTVBfUFMsCisJCSAicFBTQy0+YkxlaXN1cmVQcyA9ICVkLCBpZWVlLT5wcyA9ICVkLHBQU0MtPkxwc0lkbGVDb3VudCBpcyAlZCxSVF9DSEVDS19GT1JfSEFOR19QRVJJT0QgaXMgJWRcbiIsCiAJCSBwUFNDLT5iTGVpc3VyZVBzLCBwcml2LT5ydGxsaWItPnBzLCBwUFNDLT5McHNJZGxlQ291bnQsCiAJCSBSVF9DSEVDS19GT1JfSEFOR19QRVJJT0QpOwogCkBAIC0yNzEsOCArMjcxLDggQEAKIAogCQkJaWYgKHByaXYtPnJ0bGxpYi0+cHMgPT0gUlRMTElCX1BTX0RJU0FCTEVEKSB7CiAKLQkJCQlSVF9UUkFDRShDT01QX0xQUywgIkxlaXN1cmVQU0VudGVyKCk6IEVudGVyICIKLQkJCQkJICI4MDIuMTEgcG93ZXIgc2F2ZSBtb2RlLi4uXG4iKTsKKwkJCQlSVF9UUkFDRShDT01QX0xQUywKKwkJCQkJICJMZWlzdXJlUFNFbnRlcigpOiBFbnRlciA4MDIuMTEgcG93ZXIgc2F2ZSBtb2RlLi4uXG4iKTsKIAogCQkJCWlmICghcFBTQy0+YkZ3Q3RybExQUykgewogCQkJCQlpZiAocHJpdi0+cnRsbGliLT5TZXRGd0NtZEhhbmRsZXIpCkBAIC0zMDEsOCArMzAxLDggQEAKIAogCWlmIChwUFNDLT5iTGVpc3VyZVBzKSB7CiAJCWlmIChwcml2LT5ydGxsaWItPnBzICE9IFJUTExJQl9QU19ESVNBQkxFRCkgewotCQkJUlRfVFJBQ0UoQ09NUF9MUFMsICJMZWlzdXJlUFNMZWF2ZSgpOiBCdXN5IFRyYWZmaWMgLCAiCi0JCQkJICJMZWF2ZSA4MDIuMTEgcG93ZXIgc2F2ZS4uXG4iKTsKKwkJCVJUX1RSQUNFKENPTVBfTFBTLAorCQkJCSAiTGVpc3VyZVBTTGVhdmUoKTogQnVzeSBUcmFmZmljICwgTGVhdmUgODAyLjExIHBvd2VyIHNhdmUuLlxuIik7CiAJCQlNZ250QWN0U2V0XzgwMl8xMV9Qb3dlclNhdmVNb2RlKGRldiwKIAkJCQkJIFJUTExJQl9QU19ESVNBQkxFRCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTkyZS9ydGxfd3guYwppbmRleCBkZjAzMjNmLi44ZDZhMTA5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5MmUvcnRsX3d4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOTJlL3J0bF93eC5jCkBAIC02Nyw3ICs2Nyw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTg3LDcgKzg3LDcgQEAKIAlpbnQgcmV0OwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKIAlkb3duKCZwcml2LT53eF9zZW0pOwpAQCAtMTE1LDkgKzExNSwxMCBAQAogCWludCByZXQ7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpIHsKLQkJUlRfVFJBQ0UoQ09NUF9FUlIsICIlcygpOkh3IGlzIFJhZGlvIE9mZiwgd2UgY2FuJ3Qgc2V0ICIKLQkJCSAiUG93ZXIscmV0dXJuXG4iLCBfX2Z1bmNfXyk7CisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKSB7CisJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJICIlcygpOkh3IGlzIFJhZGlvIE9mZiwgd2UgY2FuJ3Qgc2V0IFBvd2VyLHJldHVyblxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlkb3duKCZwcml2LT53eF9zZW0pOwpAQCAtMTQ1LDcgKzE0Niw3IEBACiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCWludCByZXQ7CiAKLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTI1NCwxMCArMjU1LDExIEBACiAKIAlkb3duKCZwcml2LT53eF9zZW0pOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogc2V0IHJhZGlvICEgZXh0cmEgaXMgJWRcbiIsIF9fZnVuY19fLCAqZXh0cmEpOworCW5ldGRldl9pbmZvKGRldiwgIiVzKCk6IHNldCByYWRpbyAhIGV4dHJhIGlzICVkXG4iLCBfX2Z1bmNfXywgKmV4dHJhKTsKIAlpZiAoKCpleHRyYSAhPSAwKSAmJiAoKmV4dHJhICE9IDEpKSB7Ci0JCVJUX1RSQUNFKENPTVBfRVJSLCAiJXMoKTogc2V0IHJhZGlvIGFuIGVyciB2YWx1ZSxtdXN0IDAocmFkaW8gIgotCQkJICJvZmYpIG9yIDEocmFkaW8gb24pXG4iLCBfX2Z1bmNfXyk7CisJCVJUX1RSQUNFKENPTVBfRVJSLAorCQkJICIlcygpOiBzZXQgcmFkaW8gYW4gZXJyIHZhbHVlLG11c3QgMChyYWRpbyBvZmYpIG9yIDEocmFkaW8gb24pXG4iLAorCQkJIF9fZnVuY19fKTsKIAkJdXAoJnByaXYtPnd4X3NlbSk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yNzcsOCArMjc5LDggQEAKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlcygpOiBzZXQgbHBzIGF3YWtlIGludGVydmFsICEgZXh0cmEgaXMgJWRcbiIsCi0JICAgICAgIF9fZnVuY19fLCAqZXh0cmEpOworCW5ldGRldl9pbmZvKGRldiwgIiVzKCk6IHNldCBscHMgYXdha2UgaW50ZXJ2YWwgISBleHRyYSBpcyAlZFxuIiwKKwkJICAgIF9fZnVuY19fLCAqZXh0cmEpOwogCiAJcFBTQy0+UmVnTWF4TFBTQXdha2VJbnR2bCA9ICpleHRyYTsKIAl1cCgmcHJpdi0+d3hfc2VtKTsKQEAgLTI5Myw4ICsyOTUsOSBAQAogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKIAotCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IGZvcmNlIExQUyAhIGV4dHJhIGlzICVkICgxIGlzIG9wZW4gMCBpcyAiCi0JICAgICAgICJjbG9zZSlcbiIsIF9fZnVuY19fLCAqZXh0cmEpOworCW5ldGRldl9pbmZvKGRldiwKKwkJICAgICIlcygpOiBmb3JjZSBMUFMgISBleHRyYSBpcyAlZCAoMSBpcyBvcGVuIDAgaXMgY2xvc2UpXG4iLAorCQkgICAgX19mdW5jX18sICpleHRyYSk7CiAJcHJpdi0+Zm9yY2VfbHBzID0gKmV4dHJhOwogCXVwKCZwcml2LT53eF9zZW0pOwogCXJldHVybiAwOwpAQCAtMzA4LDExICszMTEsMTEgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAJdTggYyA9ICpleHRyYTsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKLQlwcmludGsoS0VSTl9JTkZPICI9PT09PT4lcygpLCAqZXh0cmE6JXgsIGRlYnVnZmxhZzoleFxuIiwgX19mdW5jX18sCi0JICAgICAgICpleHRyYSwgcnRfZ2xvYmFsX2RlYnVnX2NvbXBvbmVudCk7CisJbmV0ZGV2X2luZm8oZGV2LCAiPT09PT0+JXMoKSwgKmV4dHJhOiV4LCBkZWJ1Z2ZsYWc6JXhcbiIsIF9fZnVuY19fLAorCQkgICAgKmV4dHJhLCBydF9nbG9iYWxfZGVidWdfY29tcG9uZW50KTsKIAlpZiAoYyA+IDApCiAJCXJ0X2dsb2JhbF9kZWJ1Z19jb21wb25lbnQgfD0gKDE8PGMpOwogCWVsc2UKQEAgLTMyOSw3ICszMzIsNyBAQAogCWVudW0gcnRfcmZfcG93ZXJfc3RhdGUgcnRTdGF0ZTsKIAlpbnQgcmV0OwogCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAlydFN0YXRlID0gcHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlOwogCWRvd24oJnByaXYtPnd4X3NlbSk7CkBAIC0zNDMsMTMgKzM0NiwxMiBAQAogCQkJCQkJIF9fZnVuY19fKTsKIAkJCQkJdXAoJnByaXYtPnd4X3NlbSk7CiAJCQkJCXJldHVybiAtMTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT0+JXMoKTogIgotCQkJCQkgICAgICAgIklQU0xlYXZlXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7Ci0JCQkJCUlQU0xlYXZlKGRldik7Ci0JCQkJCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOwogCQkJCX0KKwkJCQluZXRkZXZfaW5mbyhkZXYsICAiPT09PT09PT09PiVzKCk6IElQU0xlYXZlXG4iLAorCQkJCQkgICAgX19mdW5jX18pOworCQkJCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQkJSVBTTGVhdmUoZGV2KTsKKwkJCQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKIAkJCX0KIAkJfQogCX0KQEAgLTQ3MCw5ICs0NzIsOSBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT09PT09PT4lcygpOiBod3JhZGlvIG9mZlxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpIHsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiPT09PT09PT09PT09PT09PT4lcygpOiBod3JhZGlvIG9mZlxuIiwKKwkJCSAgICBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAlydFN0YXRlID0gcHJpdi0+cnRsbGliLT5lUkZQb3dlclN0YXRlOwpAQCAtNTAwLDE3ICs1MDIsMTcgQEAKIAkJCWlmIChydFN0YXRlID09IGVSZk9mZikgewogCQkJCWlmIChwcml2LT5ydGxsaWItPlJmT2ZmUmVhc29uID4KIAkJCQkgICAgUkZfQ0hBTkdFX0JZX0lQUykgewotCQkJCQlSVF9UUkFDRShDT01QX0VSUiwgIiVzKCk6IFJGIGlzICIKLQkJCQkJCSAiT0ZGLlxuIiwgX19mdW5jX18pOworCQkJCQlSVF9UUkFDRShDT01QX0VSUiwKKwkJCQkJCSAiJXMoKTogUkYgaXMgT0ZGLlxuIiwKKwkJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJCXVwKCZwcml2LT53eF9zZW0pOwogCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUlRfVFJBQ0UoQ09NUF9QUywgIj09PT09PT09PT4lcygpOiAiCi0JCQkJCQkgIklQU0xlYXZlXG4iLCBfX2Z1bmNfXyk7Ci0JCQkJCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7Ci0JCQkJCUlQU0xlYXZlKGRldik7Ci0JCQkJCXVwKCZwcml2LT5ydGxsaWItPmlwc19zZW0pOwogCQkJCX0KKwkJCQlSVF9UUkFDRShDT01QX1BTLCAiPT09PT09PT09PiVzKCk6IElQU0xlYXZlXG4iLAorCQkJCQkgX19mdW5jX18pOworCQkJCWRvd24oJnByaXYtPnJ0bGxpYi0+aXBzX3NlbSk7CisJCQkJSVBTTGVhdmUoZGV2KTsKKwkJCQl1cCgmcHJpdi0+cnRsbGliLT5pcHNfc2VtKTsKIAkJCX0KIAkJfQogCQlydGxsaWJfc3RvcF9zY2FuKHByaXYtPnJ0bGxpYik7CkBAIC01NTIsNyArNTU0LDcgQEAKIAlpZiAoIXByaXYtPnVwKQogCQlyZXR1cm4gLUVORVRET1dOOwogCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAogCkBAIC01NzIsMTMgKzU3NCwxMCBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAlpbnQgcmV0OwogCi0JaWYgKChydGxsaWJfYWN0X3NjYW5uaW5nKHByaXYtPnJ0bGxpYiwgZmFsc2UpKSAmJgotCSAgICAhKHByaXYtPnJ0bGxpYi0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKSkgewotCQk7CS8qIFRPRE8gLSBnZXQgcmlkIG9mIGlmICovCi0JfQotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT4lcygpOmh3IHJhZGlvIG9mZixvciBSZiBzdGF0ZSBpcyAiCi0JCSAgICAgICAiZVJmT2ZmLCByZXR1cm5cbiIsIF9fZnVuY19fKTsKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpIHsKKwkJbmV0ZGV2X2luZm8oZGV2LAorCQkJICAgICI9PT09PT09PT0+JXMoKTpodyByYWRpbyBvZmYsb3IgUmYgc3RhdGUgaXMgZVJmT2ZmLCByZXR1cm5cbiIsCisJCQkgICAgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTY0Miw3ICs2NDEsNyBAQAogCWludCByZXQ7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CkBAIC02NjksNyArNjY4LDcgQEAKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCiAJaWYgKHdycXUtPmZyYWcuZGlzYWJsZWQpCkBAIC03MDgsMTIgKzcwNyw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IHJ0bGxpYl9wcml2KGRldik7CiAKLQlpZiAoKHJ0bGxpYl9hY3Rfc2Nhbm5pbmcocHJpdi0+cnRsbGliLCBmYWxzZSkpICYmCi0JICAgICEocHJpdi0+cnRsbGliLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NDQU4pKSB7Ci0JCTsJLyogVE9ETyAtIGdldCByaWQgb2YgaWYgKi8KLQl9Ci0KLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTc2MywxMCArNzU3LDcgQEAKIAkJCSAgICAgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDN9IH07CiAJaW50IGk7CiAKLQlpZiAoKHJ0bGxpYl9hY3Rfc2Nhbm5pbmcocHJpdi0+cnRsbGliLCBmYWxzZSkpICYmCi0JICAgIShwcml2LT5ydGxsaWItPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTikpCi0JCTsJLyogVE9ETyAtIGdldCByaWQgb2YgaWYgKi8KLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCiAJaWYgKCFwcml2LT51cCkKQEAgLTgzOCw3ICs4MjksOCBAQAogCQkJc2V0X3N3Y2FtKGRldiwga2V5X2lkeCwga2V5X2lkeCwgS0VZX1RZUEVfV0VQMTA0LAogCQkJCSAgemVyb19hZGRyW2tleV9pZHhdLCAwLCBod2tleSwgMCk7CiAJCX0gZWxzZSB7Ci0JCQkgcHJpbnRrKEtFUk5fSU5GTyAid3JvbmcgdHlwZSBpbiBXRVAsIG5vdCBXRVA0MCBhbmQgV0VQMTA0XG4iKTsKKwkJCW5ldGRldl9pbmZvKGRldiwKKwkJCQkgICAgIndyb25nIHR5cGUgaW4gV0VQLCBub3QgV0VQNDAgYW5kIFdFUDEwNFxuIik7CiAJCX0KIAl9CiAKQEAgLTg1NSw3ICs4NDcsNyBAQAogCWludCAqcGFybXMgPSAoaW50ICopcDsKIAlpbnQgbW9kZSA9IHBhcm1zWzBdOwogCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAogCXByaXYtPnJ0bGxpYi0+YWN0aXZlX3NjYW4gPSBtb2RlOwpAQCAtODczLDcgKzg2NSw3IEBACiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBydGxsaWJfcHJpdihkZXYpOwogCWludCBlcnIgPSAwOwogCi0JaWYgKHByaXYtPmJId1JhZGlvT2ZmID09IHRydWUpCisJaWYgKHByaXYtPmJId1JhZGlvT2ZmKQogCQlyZXR1cm4gMDsKIAogCWRvd24oJnByaXYtPnd4X3NlbSk7CkBAIC05NTYsNyArOTQ4LDcgQEAKIAogCXNob3J0IGVyciA9IDA7CiAKLQlpZiAocHJpdi0+Ykh3UmFkaW9PZmYgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+Ykh3UmFkaW9PZmYpCiAJCXJldHVybiAwOwogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKQEAgLTk4Myw3ICs5NzUsNyBAQAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IHByaXYtPnJ0bGxpYjsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKIAlkb3duKCZwcml2LT53eF9zZW0pOwpAQCAtMTA2NCw3ICsxMDU2LDcgQEAKIAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKIAlkb3duKCZwcml2LT53eF9zZW0pOwpAQCAtMTA4Miw3ICsxMDc0LDcgQEAKIAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKIAlkb3duKCZwcml2LT53eF9zZW0pOwpAQCAtMTA5OSw3ICsxMDkxLDcgQEAKIAogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gcnRsbGliX3ByaXYoZGV2KTsKIAotCWlmIChwcml2LT5iSHdSYWRpb09mZiA9PSB0cnVlKQorCWlmIChwcml2LT5iSHdSYWRpb09mZikKIAkJcmV0dXJuIDA7CiAKIAlkb3duKCZwcml2LT53eF9zZW0pOwpAQCAtMTE2MCw4ICsxMTUyLDEwIEBACiAJCQkocnRsbGliX0VuYWJsZUludGVsUHJvbWlzY3VvdXNNb2RlKGRldiwgZmFsc2UpKSA6CiAJCQkocnRsbGliX0Rpc2FibGVJbnRlbFByb21pc2N1b3VzTW9kZShkZXYsIGZhbHNlKSk7CiAKLQkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT4lcygpLCBvbiA9ICVkLCBmaWx0ZXIgc3JjIHN0YSA9ICVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIGJQcm9taXNjdW91c09uLCBiRmlsdGVyU291cmNlU3RhdGlvbkZyYW1lKTsKKwkJbmV0ZGV2X2luZm8oZGV2LAorCQkJICAgICI9PT09PT09PiVzKCksIG9uID0gJWQsIGZpbHRlciBzcmMgc3RhID0gJWRcbiIsCisJCQkgICAgX19mdW5jX18sIGJQcm9taXNjdW91c09uLAorCQkJICAgIGJGaWx0ZXJTb3VyY2VTdGF0aW9uRnJhbWUpOwogCX0gZWxzZSB7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0xMjI3LDExICsxMjIxLDEwIEBACiAJSVdfSU9DVEwoU0lPQ1NJV0VOQ09ERUVYVCkgPSByODE5Ml93eF9zZXRfZW5jX2V4dCwKIH07CiAKLS8qCi0gKiB0aGUgZm9sbG93aW5nIHJ1bGUgbmVlZCB0byBiZSBmb2xsb3dpbmcsCisvKiB0aGUgZm9sbG93aW5nIHJ1bGUgbmVlZCB0byBiZSBmb2xsb3dpbmcsCiAgKiBPZGQgOiBnZXQgKHdvcmxkIGFjY2VzcyksCiAgKiBldmVuIDogc2V0IChyb290IGFjY2VzcykKLSAqICovCisgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdfcHJpdl9hcmdzIHI4MTkyX3ByaXZhdGVfYXJnc1tdID0gewogCXsKIAkJU0lPQ0lXRklSU1RQUklWICsgMHgwLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfQkFQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9CQVByb2MuYwppbmRleCAwNDE1ZTAyLi4yNjI1OGVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9CQVByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9CQVByb2MuYwpAQCAtMjYsNyArMjYsNyBAQAogewogCXBCQS0+YlZhbGlkID0gdHJ1ZTsKIAlpZiAoVGltZSAhPSAwKQotCQltb2RfdGltZXIoJnBCQS0+VGltZXIsIGppZmZpZXMgKyBNU0VDUyhUaW1lKSk7CisJCW1vZF90aW1lcigmcEJBLT5UaW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoVGltZSkpOwogfQogCiBzdGF0aWMgdm9pZCBEZUFjdGl2YXRlQkFFbnRyeShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IGJhX3JlY29yZCAqcEJBKQpAQCAtODMsOSArODMsOSBAQAogCXU4ICp0YWcgPSBOVUxMOwogCXUxNiBsZW4gPSBpZWVlLT50eF9oZWFkcm9vbSArIDk7CiAKLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1RSQUNFIHwgUlRMTElCX0RMX0JBLCAiPT09PT09PT0+JXMoKSwgZnJhbWUoJWQpIgotCQkgICAgICIgc2VudGQgdG86ICVwTSwgaWVlZS0+ZGV2OiVwXG4iLCBfX2Z1bmNfXywKLQkJICAgICB0eXBlLCBEc3QsIGllZWUtPmRldik7CisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9UUkFDRSB8IFJUTExJQl9ETF9CQSwKKwkJICAgICAiPT09PT09PT0+JXMoKSwgZnJhbWUoJWQpIHNlbnRkIHRvOiAlcE0sIGllZWUtPmRldjolcFxuIiwKKwkJICAgICBfX2Z1bmNfXywgdHlwZSwgRHN0LCBpZWVlLT5kZXYpOwogCWlmIChwQkEgPT0gTlVMTCkgewogCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgInBCQSBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xNDgsOSArMTQ4LDggQEAKIAogCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfVFJBQ0UgfCBSVExMSUJfRExfQkEsCi0JCQkgICAgICI9PT09PT09PT4lcygpLCBSZWFzb24iCi0JCQkgICAgICJDb2RlKCVkKSBzZW50ZCB0bzogJXBNXG4iLCBfX2Z1bmNfXywKLQkJCSAgICAgUmVhc29uQ29kZSwgZHN0KTsKKwkJCSAgICAgIj09PT09PT09PiVzKCksIFJlYXNvbkNvZGUoJWQpIHNlbnRkIHRvOiAlcE1cbiIsCisJCQkgICAgIF9fZnVuY19fLCBSZWFzb25Db2RlLCBkc3QpOwogCiAJbWVtc2V0KCZEZWxiYVBhcmFtU2V0LCAwLCAyKTsKIApAQCAtMjAzLDggKzIwMiw4IEBACiAJCVJUX1RSQUNFKENPTVBfREJHLCAiPT09PT50byBzZW5kIEFEREJBUkVRISEhISFcbiIpOwogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwogCX0gZWxzZSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiYWxsb2Mgc2tiIGVycm9yIGluIGZ1bmN0aW9uIgotCQkJICAgICAiICVzKClcbiIsIF9fZnVuY19fKTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkgICAgICJhbGxvYyBza2IgZXJyb3IgaW4gZnVuY3Rpb24gJXMoKVxuIiwgX19mdW5jX18pOwogCX0KIH0KIApAQCAtMjE3LDggKzIxNiw4IEBACiAJaWYgKHNrYikKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKIAllbHNlCi0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiYWxsb2Mgc2tiIGVycm9yIGluIGZ1bmN0aW9uIgotCQkJICAgICAiICVzKClcbiIsIF9fZnVuY19fKTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkgICAgICJhbGxvYyBza2IgZXJyb3IgaW4gZnVuY3Rpb24gJXMoKVxuIiwgX19mdW5jX18pOwogfQogCiBzdGF0aWMgdm9pZCBydGxsaWJfc2VuZF9ERUxCQShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKmRzdCwKQEAgLTIzMSw4ICsyMzAsOCBAQAogCWlmIChza2IpCiAJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CiAJZWxzZQotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgImFsbG9jIHNrYiBlcnJvciBpbiBmdW5jdGlvbiIKLQkJCSAgICAgIiAlcygpXG4iLCBfX2Z1bmNfXyk7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAiYWxsb2Mgc2tiIGVycm9yIGluIGZ1bmN0aW9uICVzKClcbiIsIF9fZnVuY19fKTsKIH0KIAogaW50IHJ0bGxpYl9yeF9BRERCQVJlcShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTI0Nyw4ICsyNDYsOSBAQAogCXN0cnVjdCByeF90c19yZWNvcmQgKnBUUyA9IE5VTEw7CiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIpICsgOSkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIiBJbnZhbGlkIHNrYiBsZW4gaW4gQkFSRVEoJWQgLyAiCi0JCQkgICAgICIlZClcbiIsIChpbnQpc2tiLT5sZW4sCisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAiIEludmFsaWQgc2tiIGxlbiBpbiBCQVJFUSglZCAvICVkKVxuIiwKKwkJCSAgICAgKGludClza2ItPmxlbiwKIAkJCSAgICAgKGludCkoc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKSArIDkpKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTI2OSw4ICsyNjksOCBAQAogCSAgICAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UpIHx8CiAJICAgIChpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX1JFSkVDVF9BRERCQV9SRVEpKSB7CiAJCXJjID0gQUREQkFfU1RBVFVTX1JFRlVTRUQ7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiRmFpbGVkIHRvIHJlcGx5IG9uIEFEREJBX1JFUSBhcyAiCi0JCQkgICAgICJzb21lIGNhcGFiaWxpdHkgaXMgbm90IHJlYWR5KCVkLCAlZClcbiIsCisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAiRmFpbGVkIHRvIHJlcGx5IG9uIEFEREJBX1JFUSBhcyBzb21lIGNhcGFiaWxpdHkgaXMgbm90IHJlYWR5KCVkLCAlZClcbiIsCiAJCQkgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUsCiAJCQkgICAgIGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KTsKIAkJZ290byBPbkFEREJBUmVxX0ZhaWw7CkBAIC0yODUsOCArMjg1LDggQEAKIAogCWlmIChwQmFQYXJhbVNldC0+ZmllbGQuQkFQb2xpY3kgPT0gQkFfUE9MSUNZX0RFTEFZRUQpIHsKIAkJcmMgPSBBRERCQV9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJCQSBQb2xpY3kgaXMgbm90IGNvcnJlY3QgaW4gIgotCQkJICAgICAiJXMoKVxuIiwgX19mdW5jX18pOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgIkJBIFBvbGljeSBpcyBub3QgY29ycmVjdCBpbiAlcygpXG4iLCBfX2Z1bmNfXyk7CiAJCWdvdG8gT25BRERCQVJlcV9GYWlsOwogCX0KIApAQCAtMzMzLDggKzMzMyw5IEBACiAJdTE2CQkJUmVhc29uQ29kZTsKIAogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcikgKyA5KSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiIEludmFsaWQgc2tiIGxlbiBpbiBCQVJTUCglZCAvICIKLQkJCSAgICAgIiVkKVxuIiwgKGludClza2ItPmxlbiwKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkgICAgICJJbnZhbGlkIHNrYiBsZW4gaW4gQkFSU1AoJWQgLyAlZClcbiIsCisJCQkgICAgIChpbnQpc2tiLT5sZW4sCiAJCQkgICAgIChpbnQpKHNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcikgKyA5KSk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0zNTEsOCArMzUyLDggQEAKIAlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9PSAwICB8fAogCSAgICBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCA9PSBmYWxzZSB8fAogCSAgICBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEFNUERVRW5hYmxlID09IGZhbHNlKSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAicmVqZWN0IHRvIEFEREJBX1JTUCBhcyBzb21lIGNhcGFiIgotCQkJICAgICAiaWxpdHkgaXMgbm90IHJlYWR5KCVkLCAlZCwgJWQpXG4iLAorCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgInJlamVjdCB0byBBRERCQV9SU1AgYXMgc29tZSBjYXBhYmlsaXR5IGlzIG5vdCByZWFkeSglZCwgJWQsICVkKVxuIiwKIAkJCSAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSwKIAkJCSAgICAgaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQsCiAJCQkgICAgIGllZWUtPnBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUpOwpAQCAtMzc0LDE4ICszNzUsMTkgQEAKIAogCiAJaWYgKHBBZG1pdHRlZEJBLT5iVmFsaWQgPT0gdHJ1ZSkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0JBLCAiT25BRERCQVJzcCgpOiBSZWN2IEFEREJBIFJzcC4iCi0JCQkgICAgICIgRHJvcCBiZWNhdXNlIGFscmVhZHkgYWRtaXQgaXQhXG4iKTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwKKwkJCSAgICAgIk9uQUREQkFSc3AoKTogUmVjdiBBRERCQSBSc3AuIERyb3AgYmVjYXVzZSBhbHJlYWR5IGFkbWl0IGl0IVxuIik7CiAJCXJldHVybiAtMTsKIAl9IGVsc2UgaWYgKChwUGVuZGluZ0JBLT5iVmFsaWQgPT0gZmFsc2UpIHx8CiAJCSAgICgqcERpYWxvZ1Rva2VuICE9IHBQZW5kaW5nQkEtPkRpYWxvZ1Rva2VuKSkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgICJPbkFEREJBUnNwKCk6IFJlY3YgQUREQkEgUnNwLiAiCi0JCQkgICAgICJCQSBpbnZhbGlkLCBERUxCQSFcbiIpOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgIk9uQUREQkFSc3AoKTogUmVjdiBBRERCQSBSc3AuIEJBIGludmFsaWQsIERFTEJBIVxuIik7CiAJCVJlYXNvbkNvZGUgPSBERUxCQV9SRUFTT05fVU5LTk9XTl9CQTsKIAkJZ290byBPbkFEREJBUnNwX1JlamVjdDsKIAl9IGVsc2UgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0JBLCAiT25BRERCQVJzcCgpOiBSZWN2IEFEREJBIFJzcC4gQkEgIgotCQkJICAgICAiaXMgYWRtaXR0ZWQhIFN0YXR1cyBjb2RlOiVYXG4iLCAqcFN0YXR1c0NvZGUpOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0JBLAorCQkJICAgICAiT25BRERCQVJzcCgpOiBSZWN2IEFEREJBIFJzcC4gQkEgaXMgYWRtaXR0ZWQhIFN0YXR1cyBjb2RlOiVYXG4iLAorCQkJICAgICAqcFN0YXR1c0NvZGUpOwogCQlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwUGVuZGluZ0JBKTsKIAl9CiAKQEAgLTQzMiwxNiArNDM0LDE3IEBACiAJdTggKmRzdCA9IE5VTEw7CiAKIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIpICsgNikgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgIiBJbnZhbGlkIHNrYiBsZW4gaW4gREVMQkEoJWQgLyIKLQkJCSAgICAgIiAlZClcbiIsIChpbnQpc2tiLT5sZW4sCisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAiSW52YWxpZCBza2IgbGVuIGluIERFTEJBKCVkIC8gJWQpXG4iLAorCQkJICAgICAoaW50KXNrYi0+bGVuLAogCQkJICAgICAoaW50KShzaXplb2Yoc3RydWN0IHJ0bGxpYl9oZHJfM2FkZHIpICsgNikpOwogCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCAgfHwKIAkJaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJyZWNlaXZlZCBERUxCQSB3aGlsZSBRT1Mgb3IgSFQgIgotCQkJICAgICAiaXMgbm90IHN1cHBvcnRlZCglZCwgJWQpXG4iLAorCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgInJlY2VpdmVkIERFTEJBIHdoaWxlIFFPUyBvciBIVCBpcyBub3Qgc3VwcG9ydGVkKCVkLCAlZClcbiIsCiAJCQkgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay4gcW9zX2RhdGEuYWN0aXZlLAogCQkJICAgICBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCk7CiAJCXJldHVybiAtMTsKQEAgLTQ1OSw4ICs0NjIsOSBAQAogCiAJCWlmICghR2V0VHMoaWVlZSwgKHN0cnVjdCB0c19jb21tb25faW5mbyAqKikmcFJ4VHMsIGRzdCwKIAkJICAgICh1OClwRGVsQmFQYXJhbVNldC0+ZmllbGQuVElELCBSWF9ESVIsIGZhbHNlKSkgewotCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICAiY2FuJ3QgZ2V0IFRTIGZvciBSWFRTIGluICIKLQkJCQkgICAgICIlcygpLmRzdDogJXBNIFRJRDolZFxuIiwgX19mdW5jX18sIGRzdCwKKwkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJCSAgICAgImNhbid0IGdldCBUUyBmb3IgUlhUUyBpbiAlcygpLmRzdDogJXBNIFRJRDolZFxuIiwKKwkJCQkgICAgIF9fZnVuY19fLCBkc3QsCiAJCQkJICAgICAodTgpcERlbEJhUGFyYW1TZXQtPmZpZWxkLlRJRCk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTQ3MSw4ICs0NzUsOSBAQAogCiAJCWlmICghR2V0VHMoaWVlZSwgKHN0cnVjdCB0c19jb21tb25faW5mbyAqKikmcFR4VHMsIGRzdCwKIAkJCSAgICh1OClwRGVsQmFQYXJhbVNldC0+ZmllbGQuVElELCBUWF9ESVIsIGZhbHNlKSkgewotCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICAiY2FuJ3QgZ2V0IFRTIGZvciBUWFRTIGluICIKLQkJCQkgICAgICIlcygpXG4iLCBfX2Z1bmNfXyk7CisJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCQkgICAgICJjYW4ndCBnZXQgVFMgZm9yIFRYVFMgaW4gJXMoKVxuIiwKKwkJCQkgICAgIF9fZnVuY19fKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9IVC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfSFQuaAppbmRleCAxM2Y0MTA1Li5mNzA3NmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9IVC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X0hULmgKQEAgLTc3LDQzICs3Nyw2IEBACiAJQ0hOTE9QX1NXQ0hOTCA9IDMsCiB9OwogCi0jZGVmaW5lIENISExPUF9JTl9QUk9HUkVTUyhfcEhUSW5mbykJXAotCQkoKF9wSFRJbmZvKS0+Q2hubE9wID4gQ0hOTE9QX05PTkUpID8gdHJ1ZSA6IGZhbHNlCi0KLS8qCi11bmlvbiBodF9jYXBhYmlsaXR5IHsKLQl1MTYJU2hvcnREYXRhOwotCXU4CUNoYXJEYXRhWzJdOwotCXN0cnVjdAotCXsKLQkJdTE2CUFkdkNvZGluZzoxOwotCQl1MTYJQ2hsV2lkdGg6MTsKLQkJdTE2CU1pbW9Qd3JTYXZlOjI7Ci0JCXUxNglHcmVlbkZpZWxkOjE7Ci0JCXUxNglTaG9ydEdJMjBNaHo6MTsKLQkJdTE2CVNob3J0R0k0ME1oejoxOwotCQl1MTYJU1RCQzoxOwotCQl1MTYJQmVhbUZvcm06MTsKLQkJdTE2CURlbGF5QkE6MTsKLQkJdTE2CU1heEFNU0RVU2l6ZToxOwotCQl1MTYJRHNzQ0NrOjE7Ci0JCXUxNglQU01QOjE7Ci0JCXUxNglSc3ZkOjM7Ci0JfUZpZWxkOwotfTsKLQotdW5pb24gaHRfY2FwYWJpbGl0eV9tYWNwYXJhIHsKLQl1OAlTaG9ydERhdGE7Ci0JdTgJQ2hhckRhdGFbMV07Ci0Jc3RydWN0Ci0JewotCQl1OAlNYXhSeEFNUERVOjI7Ci0JCXU4CU1QRFVEZW5zaXR5OjI7Ci0JCXU4CVJzdmQ6NDsKLQl9RmllbGQ7Ci19OwotKi8KLQogZW51bSBodF9hY3Rpb24gewogCUFDVF9SRUNPTU1BTkRfV0lEVEgJCT0gMCwKIAlBQ1RfTUlNT19QV1JfU0FWRQkJPSAxLApAQCAtMzgwLDE2ICszNDMsNiBAQAogZXh0ZXJuIHU4IE1DU19GSUxURVJfQUxMWzE2XTsKIGV4dGVybiB1OCBNQ1NfRklMVEVSXzFTU1sxNl07CiAKLSNkZWZpbmUgUElDS19SQVRFKF9uTGVnYWN5UmF0ZSwgX25NY3NSYXRlKQlcCi0JCSgoX25NY3NSYXRlID09IDApID8gKF9uTGVnYWN5UmF0ZSYweDdmKSA6IChfbk1jc1JhdGUpKQotI2RlZmluZQlMRUdBQ1lfV0lSRUxFU1NfTU9ERQlJRUVFX01PREVfTUFTSwotCi0jZGVmaW5lIENVUlJFTlRfUkFURShXaXJlbGVzc01vZGUsIExlZ2FjeVJhdGUsIEhUUmF0ZSkJXAotCQkJKChXaXJlbGVzc01vZGUgJiAoTEVHQUNZX1dJUkVMRVNTX01PREUpKSAhPSAwKSA/IFwKLQkJCShMZWdhY3lSYXRlKSA6IChQSUNLX1JBVEUoTGVnYWN5UmF0ZSwgSFRSYXRlKSkKLQotCi0KICNkZWZpbmUJUkFURV9BRFBUXzFTU19NQVNLCQkweEZGCiAjZGVmaW5lCVJBVEVfQURQVF8yU1NfTUFTSwkJMHhGMAogI2RlZmluZQlSQVRFX0FEUFRfTUNTMzJfTUFTSwkJMHgwMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfSFRQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9IVFByb2MuYwppbmRleCAxZWE0MjZiLi43ZjEwMzExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9IVFByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9IVFByb2MuYwpAQCAtMTE3LDE2MCArMTE3LDYgQEAKIAlwSFRJbmZvLT5SeFJlb3JkZXJQZW5kaW5nVGltZSA9IDMwOwogfQogCi12b2lkIEhURGVidWdIVENhcGFiaWxpdHkodTggKkNhcElFLCB1OCAqVGl0bGVTdHJpbmcpCi17Ci0KLQlzdGF0aWMgdTgJRVdDMTFOSFRDYXBbXSA9IHsweDAwLCAweDkwLCAweDRjLCAweDMzfTsKLQlzdHJ1Y3QgaHRfY2FwYWJfZWxlICpwQ2FwRUxFOwotCi0JaWYgKCFtZW1jbXAoQ2FwSUUsIEVXQzExTkhUQ2FwLCBzaXplb2YoRVdDMTFOSFRDYXApKSkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiRVdDIElFIGluICVzKClcbiIsIF9fZnVuY19fKTsKLQkJcENhcEVMRSA9IChzdHJ1Y3QgaHRfY2FwYWJfZWxlICopKCZDYXBJRVs0XSk7Ci0JfSBlbHNlCi0JCXBDYXBFTEUgPSAoc3RydWN0IGh0X2NhcGFiX2VsZSAqKSgmQ2FwSUVbMF0pOwotCi0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIjxMb2cgSFQgQ2FwYWJpbGl0eT4uIENhbGxlZCBieSAlc1xuIiwKLQkJICAgICBUaXRsZVN0cmluZyk7Ci0KLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAgIlx0U3VwcG9ydGVkIENoYW5uZWwgV2lkdGggPSAlc1xuIiwKLQkJICAgICAocENhcEVMRS0+Q2hsV2lkdGgpID8gIjIwTUh6IiA6ICIyMC80ME1IeiIpOwotCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICAiXHRTdXBwb3J0IFNob3J0IEdJIGZvciAyME0gPSAlc1xuIiwKLQkJICAgICAocENhcEVMRS0+U2hvcnRHSTIwTWh6KSA/ICJZRVMiIDogIk5PIik7Ci0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgICJcdFN1cHBvcnQgU2hvcnQgR0kgZm9yIDQwTSA9ICVzXG4iLAotCQkgICAgIChwQ2FwRUxFLT5TaG9ydEdJNDBNaHopID8gIllFUyIgOiAiTk8iKTsKLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAgIlx0U3VwcG9ydCBUWCBTVEJDID0gJXNcbiIsCi0JCSAgICAgKHBDYXBFTEUtPlR4U1RCQykgPyAiWUVTIiA6ICJOTyIpOwotCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICAiXHRNYXggQU1TRFUgU2l6ZSA9ICVzXG4iLAotCQkgICAgIChwQ2FwRUxFLT5NYXhBTVNEVVNpemUpID8gIjM4MzkiIDogIjc5MzUiKTsKLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAgIlx0U3VwcG9ydCBDQ0sgaW4gMjAvNDAgbW9kZSA9ICVzXG4iLAotCQkgICAgIChwQ2FwRUxFLT5Ec3NDQ2spID8gIllFUyIgOiAiTk8iKTsKLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAgIlx0TWF4IEFNUERVIEZhY3RvciA9ICVkXG4iLAotCQkgICAgIHBDYXBFTEUtPk1heFJ4QU1QRFVGYWN0b3IpOwotCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICAiXHRNUERVIERlbnNpdHkgPSAlZFxuIiwKLQkJICAgICBwQ2FwRUxFLT5NUERVRGVuc2l0eSk7Ci0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgICJcdE1DUyBSYXRlIFNldCA9IFsleF1bJXhdWyV4XVsleF1bJXhdXG4iLAotCQkgICAgIHBDYXBFTEUtPk1DU1swXSwgcENhcEVMRS0+TUNTWzFdLCBwQ2FwRUxFLT5NQ1NbMl0sCi0JCSAgICAgcENhcEVMRS0+TUNTWzNdLCBwQ2FwRUxFLT5NQ1NbNF0pOwotCXJldHVybjsKLQotfQotCi12b2lkIEhURGVidWdIVEluZm8odTggKkluZm9JRSwgdTggKlRpdGxlU3RyaW5nKQotewotCi0Jc3RhdGljIHU4CUVXQzExTkhUSW5mb1tdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzR9OwotCXN0cnVjdCBodF9pbmZvX2VsZSAqcEhUSW5mb0VsZTsKLQotCWlmICghbWVtY21wKEluZm9JRSwgRVdDMTFOSFRJbmZvLCBzaXplb2YoRVdDMTFOSFRJbmZvKSkpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIkVXQyBJRSBpbiAlcygpXG4iLCBfX2Z1bmNfXyk7Ci0JCXBIVEluZm9FbGUgPSAoc3RydWN0IGh0X2luZm9fZWxlICopKCZJbmZvSUVbNF0pOwotCX0gZWxzZQotCQlwSFRJbmZvRWxlID0gKHN0cnVjdCBodF9pbmZvX2VsZSAqKSgmSW5mb0lFWzBdKTsKLQotCi0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIjxMb2cgSFQgSW5mb3JtYXRpb24gRWxlbWVudD4uICIKLQkJICAgICAiQ2FsbGVkIGJ5ICVzXG4iLCBUaXRsZVN0cmluZyk7Ci0KLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiXHRQcmltYXJ5IGNoYW5uZWwgPSAlZFxuIiwKLQkJICAgICBwSFRJbmZvRWxlLT5Db250cm9sQ2hsKTsKLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiXHRTZW5vbmRhcnkgY2hhbm5lbCA9Iik7Ci0Jc3dpdGNoIChwSFRJbmZvRWxlLT5FeHRDaGxPZmZzZXQpIHsKLQljYXNlIDA6Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJOb3QgUHJlc2VudFxuIik7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIlVwcGVyIGNoYW5uZWxcbiIpOwotCQlicmVhazsKLQljYXNlIDI6Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJSZXNlcnZlZC4gRW9vcm8hISFcbiIpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJMb3dlciBDaGFubmVsXG4iKTsKLQkJYnJlYWs7Ci0JfQotCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJcdFJlY29tbWVuZGVkIGNoYW5uZWwgd2lkdGggPSAlc1xuIiwKLQkJICAgICAocEhUSW5mb0VsZS0+UmVjb21tZW1kZWRUeFdpZHRoKSA/ICIyME1oeiIgOiAiNDBNaHoiKTsKLQotCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJcdE9wZXJhdGlvbiBtb2RlIGZvciBwcm90ZWN0aW9uID0gIik7Ci0Jc3dpdGNoIChwSFRJbmZvRWxlLT5PcHRNb2RlKSB7Ci0JY2FzZSAwOgotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiTm8gUHJvdGVjdGlvblxuIik7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIkhUIG5vbi1tZW1iZXIgcHJvdGVjdGlvbiBtb2RlXG4iKTsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiU3VnZ2VzdCB0byBvcGVuIHByb3RlY3Rpb25cbiIpOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJIVCBtaXhlZCBtb2RlXG4iKTsKLQkJYnJlYWs7Ci0JfQotCi0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIlx0QmFzaWMgTUNTIFJhdGUgU2V0ID0gWyV4XVsleF1bJXhdWyV4XSIKLQkJICAgICAiWyV4XVxuIiwgcEhUSW5mb0VsZS0+QmFzaWNNU0NbMF0sIHBIVEluZm9FbGUtPkJhc2ljTVNDWzFdLAotCQkgICAgIHBIVEluZm9FbGUtPkJhc2ljTVNDWzJdLCBwSFRJbmZvRWxlLT5CYXNpY01TQ1szXSwKLQkJICAgICBwSFRJbmZvRWxlLT5CYXNpY01TQ1s0XSk7Ci19Ci0KLXN0YXRpYyBib29sIElzSFRIYWxmTm1vZGU0MEJhbmR3aWR0aChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKLXsKLQlib29sCQkJcmV0VmFsdWUgPSBmYWxzZTsKLQlzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUSW5mbyA9IGllZWUtPnBIVEluZm87Ci0KLQlpZiAocEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgPT0gZmFsc2UpCi0JCXJldFZhbHVlID0gZmFsc2U7Ci0JZWxzZSBpZiAocEhUSW5mby0+YlJlZ0JXNDBNSHogPT0gZmFsc2UpCi0JCXJldFZhbHVlID0gZmFsc2U7Ci0JZWxzZSBpZiAoIWllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkKLQkJcmV0VmFsdWUgPSBmYWxzZTsKLQllbHNlIGlmICgoKHN0cnVjdCBodF9jYXBhYl9lbGUgKikocEhUSW5mby0+UGVlckhUQ2FwQnVmKSktPkNobFdpZHRoKQotCQlyZXRWYWx1ZSA9IHRydWU7Ci0JZWxzZQotCQlyZXRWYWx1ZSA9IGZhbHNlOwotCi0JcmV0dXJuIHJldFZhbHVlOwotfQotCi1zdGF0aWMgYm9vbCBJc0hUSGFsZk5tb2RlU0dJKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBib29sIGlzNDBNSHopCi17Ci0JYm9vbAkJCXJldFZhbHVlID0gZmFsc2U7Ci0Jc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwotCi0JaWYgKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlKQotCQlyZXRWYWx1ZSA9IGZhbHNlOwotCWVsc2UgaWYgKCFpZWVlLT5HZXRIYWxmTm1vZGVTdXBwb3J0QnlBUHNIYW5kbGVyKGllZWUtPmRldikpCi0JCXJldFZhbHVlID0gZmFsc2U7Ci0JZWxzZSBpZiAoaXM0ME1IeikgewotCQlpZiAoKChzdHJ1Y3QgaHRfY2FwYWJfZWxlICopCi0JCSAgICAocEhUSW5mby0+UGVlckhUQ2FwQnVmKSktPlNob3J0R0k0ME1oeikKLQkJCXJldFZhbHVlID0gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0VmFsdWUgPSBmYWxzZTsKLQl9IGVsc2UgewotCQlpZiAoKChzdHJ1Y3QgaHRfY2FwYWJfZWxlICopCi0JCSAgIChwSFRJbmZvLT5QZWVySFRDYXBCdWYpKS0+U2hvcnRHSTIwTWh6KQotCQkJcmV0VmFsdWUgPSB0cnVlOwotCQllbHNlCi0JCQlyZXRWYWx1ZSA9IGZhbHNlOwotCX0KLQotCXJldHVybiByZXRWYWx1ZTsKLX0KLQotdTE2IEhUSGFsZk1jc1RvRGF0YVJhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4IG5NY3NSYXRlKQotewotCi0JdTgJaXM0ME1IejsKLQl1OAlpc1Nob3J0R0k7Ci0KLQlpczQwTUh6ICA9ICAoSXNIVEhhbGZObW9kZTQwQmFuZHdpZHRoKGllZWUpKSA/IDEgOiAwOwotCWlzU2hvcnRHSSA9IChJc0hUSGFsZk5tb2RlU0dJKGllZWUsIGlzNDBNSHopKSA/IDEgOiAwOwotCi0JcmV0dXJuIE1DU19EQVRBX1JBVEVbaXM0ME1Iel1baXNTaG9ydEdJXVsobk1jc1JhdGUgJiAweDdmKV07Ci19Ci0KLQogdTE2IEhUTWNzVG9EYXRhUmF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggbk1jc1JhdGUpCiB7CiAJc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQgKnBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwpAQCAtMjg5LDI1ICsxMzUsMjIgQEAKIAl1OAlpczQwTUh6ID0gMDsKIAl1OAlpc1Nob3J0R0kgPSAwOwogCi0JaWYgKG5EYXRhUmF0ZSA8IDEyKSB7CisJaWYgKG5EYXRhUmF0ZSA8IDEyKQogCQlyZXR1cm4gQ0NLT0ZETVJhdGVbbkRhdGFSYXRlXTsKLQl9IGVsc2UgewotCQlpZiAobkRhdGFSYXRlID49IDB4MTAgJiYgbkRhdGFSYXRlIDw9IDB4MWYpIHsKLQkJCWlzNDBNSHogPSAwOwotCQkJaXNTaG9ydEdJID0gMDsKLQkJfSBlbHNlIGlmIChuRGF0YVJhdGUgPj0gMHgyMCAgJiYgbkRhdGFSYXRlIDw9IDB4MmYpIHsKLQkJCWlzNDBNSHogPSAxOwotCQkJaXNTaG9ydEdJID0gMDsKLQotCQl9IGVsc2UgaWYgKG5EYXRhUmF0ZSA+PSAweDMwICAmJiBuRGF0YVJhdGUgPD0gMHgzZikgewotCQkJaXM0ME1IeiA9IDA7Ci0JCQlpc1Nob3J0R0kgPSAxOwotCQl9IGVsc2UgaWYgKG5EYXRhUmF0ZSA+PSAweDQwICAmJiBuRGF0YVJhdGUgPD0gMHg0ZikgewotCQkJaXM0ME1IeiA9IDE7Ci0JCQlpc1Nob3J0R0kgPSAxOwotCQl9Ci0JCXJldHVybiBNQ1NfREFUQV9SQVRFW2lzNDBNSHpdW2lzU2hvcnRHSV1bbkRhdGFSYXRlJjB4Zl07CisJaWYgKG5EYXRhUmF0ZSA+PSAweDEwICYmIG5EYXRhUmF0ZSA8PSAweDFmKSB7CisJCWlzNDBNSHogPSAwOworCQlpc1Nob3J0R0kgPSAwOworCX0gZWxzZSBpZiAobkRhdGFSYXRlID49IDB4MjAgICYmIG5EYXRhUmF0ZSA8PSAweDJmKSB7CisJCWlzNDBNSHogPSAxOworCQlpc1Nob3J0R0kgPSAwOworCX0gZWxzZSBpZiAobkRhdGFSYXRlID49IDB4MzAgICYmIG5EYXRhUmF0ZSA8PSAweDNmKSB7CisJCWlzNDBNSHogPSAwOworCQlpc1Nob3J0R0kgPSAxOworCX0gZWxzZSBpZiAobkRhdGFSYXRlID49IDB4NDAgICYmIG5EYXRhUmF0ZSA8PSAweDRmKSB7CisJCWlzNDBNSHogPSAxOworCQlpc1Nob3J0R0kgPSAxOwogCX0KKwlyZXR1cm4gTUNTX0RBVEFfUkFURVtpczQwTUh6XVtpc1Nob3J0R0ldW25EYXRhUmF0ZSYweGZdOwogfQogCiBib29sIElzSFRIYWxmTm1vZGVBUHMoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCkBAIC0zODYsOSArMjI5LDcgQEAKIAogc3RhdGljIGJvb2wgSFRJT1RBY3RJc0Rpc2FibGVNQ1MxNShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSkKIHsKLQlib29sIHJldFZhbHVlID0gZmFsc2U7Ci0KLQlyZXR1cm4gcmV0VmFsdWU7CisJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgYm9vbCBIVElPVEFjdElzRGlzYWJsZU1DU1R3b1NwYXRpYWxTdHJlYW0oc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCkBAIC00NTAsOCArMjkxLDggQEAKIAlzdHJ1Y3QgaHRfY2FwYWJfZWxlICpwQ2FwRUxFID0gTlVMTDsKIAogCWlmICgocG9zSFRDYXAgPT0gTlVMTCkgfHwgKHBIVCA9PSBOVUxMKSkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgInBvc0hUQ2FwIG9yIHBIVEluZm8gY2FuJ3QgYmUgIgotCQkJICAgICAibnVsbCBpbiBIVENvbnN0cnVjdENhcGFiaWxpdHlFbGVtZW50KClcbiIpOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgInBvc0hUQ2FwIG9yIHBIVEluZm8gY2FuJ3QgYmUgbnVsbCBpbiBIVENvbnN0cnVjdENhcGFiaWxpdHlFbGVtZW50KClcbiIpOwogCQlyZXR1cm47CiAJfQogCW1lbXNldChwb3NIVENhcCwgMCwgKmxlbik7CkBAIC00ODcsOSArMzI4LDkgQEAKIAlwQ2FwRUxFLT5MU2lnVHhvcFByb3RlY3QgPSAwOwogCiAKLQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0hULCAiVFggSFQgY2FwL2luZm8gZWxlIEJXPSVkIE1heEFNU0RVU2l6ZTolZCAiCi0JCSAgICAgIkRzc0NDazolZFxuIiwgcENhcEVMRS0+Q2hsV2lkdGgsIHBDYXBFTEUtPk1heEFNU0RVU2l6ZSwKLQkJICAgICBwQ2FwRUxFLT5Ec3NDQ2spOworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsCisJCSAgICAgIlRYIEhUIGNhcC9pbmZvIGVsZSBCVz0lZCBNYXhBTVNEVVNpemU6JWQgRHNzQ0NrOiVkXG4iLAorCQkgICAgIHBDYXBFTEUtPkNobFdpZHRoLCBwQ2FwRUxFLT5NYXhBTVNEVVNpemUsIHBDYXBFTEUtPkRzc0NDayk7CiAKIAlpZiAoSXNFbmNyeXB0KSB7CiAJCXBDYXBFTEUtPk1QRFVEZW5zaXR5CT0gNzsKQEAgLTUzMiw4ICszNzMsOCBAQAogCXN0cnVjdCBodF9pbmZvX2VsZSAqcEhUSW5mb0VsZSA9IChzdHJ1Y3QgaHRfaW5mb19lbGUgKilwb3NIVEluZm87CiAKIAlpZiAoKHBvc0hUSW5mbyA9PSBOVUxMKSB8fCAocEhUSW5mb0VsZSA9PSBOVUxMKSkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgInBvc0hUSW5mbyBvciBwSFRJbmZvRWxlIGNhbid0IGJlICIKLQkJCSAgICAgIm51bGwgaW4gSFRDb25zdHJ1Y3RJbmZvRWxlbWVudCgpXG4iKTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkgICAgICJwb3NIVEluZm8gb3IgcEhUSW5mb0VsZSBjYW4ndCBiZSBudWxsIGluIEhUQ29uc3RydWN0SW5mb0VsZW1lbnQoKVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTU3Miw4ICs0MTMsOCBAQAogCQkJCXU4ICpsZW4pCiB7CiAJaWYgKHBvc1JUMlJUQWdnID09IE5VTEwpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJwb3NSVDJSVEFnZyBjYW4ndCBiZSBudWxsIGluICIKLQkJCSAgICAgIkhUQ29uc3RydWN0UlQyUlRBZ2dFbGVtZW50KClcbiIpOworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCSAgICAgInBvc1JUMlJUQWdnIGNhbid0IGJlIG51bGwgaW4gSFRDb25zdHJ1Y3RSVDJSVEFnZ0VsZW1lbnQoKVxuIik7CiAJCXJldHVybjsKIAl9CiAJbWVtc2V0KHBvc1JUMlJUQWdnLCAwLCAqbGVuKTsKQEAgLTU5Niw4ICs0MzcsOCBAQAogCXU4IGk7CiAKIAlpZiAocE9wZXJhdGVNQ1MgPT0gTlVMTCkgewotCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwgInBPcGVyYXRlTUNTIGNhbid0IGJlIG51bGwiCi0JCQkgICAgICIgaW4gSFRfUGlja01DU1JhdGUoKVxuIik7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAicE9wZXJhdGVNQ1MgY2FuJ3QgYmUgbnVsbCBpbiBIVF9QaWNrTUNTUmF0ZSgpXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtNjMxLDggKzQ3Miw4IEBACiAJdTgJCWF2YWlsYWJsZU1jc1JhdGVbMTZdOwogCiAJaWYgKHBNQ1NSYXRlU2V0ID09IE5VTEwgfHwgcE1DU0ZpbHRlciA9PSBOVUxMKSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAicE1DU1JhdGVTZXQgb3IgcE1DU0ZpbHRlciBjYW4ndCAiCi0JCQkgICAgICJiZSBudWxsIGluIEhUR2V0SGlnaGVzdE1DU1JhdGUoKVxuIik7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAicE1DU1JhdGVTZXQgb3IgcE1DU0ZpbHRlciBjYW4ndCBiZSBudWxsIGluIEhUR2V0SGlnaGVzdE1DU1JhdGUoKVxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCkBAIC02NTQsNyArNDk1LDcgQEAKIAkJCQkJICAgIEhUTWNzVG9EYXRhUmF0ZShpZWVlLCBtY3NSYXRlKSkKIAkJCQkJCW1jc1JhdGUgPSAoOCppK2opOwogCQkJCX0KLQkJCQliaXRNYXAgPSBiaXRNYXA+PjE7CisJCQkJYml0TWFwID4+PSAxOwogCQkJfQogCQl9CiAJfQpAQCAtNjk3LDggKzUzOCw4IEBACiAJc3RhdGljIHU4IEVXQzExTkhUSW5mb1tdID0gezB4MDAsIDB4OTAsIDB4NGMsIDB4MzR9OwogCiAJaWYgKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlKSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiPD09PSBIVE9uQXNzb2NSc3AoKTogIgotCQkJICAgICAiSFRfRElTQUJMRVxuIik7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAiPD09PSBIVE9uQXNzb2NSc3AoKTogSFRfRElTQUJMRVxuIik7CiAJCXJldHVybjsKIAl9CiAJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9IVCwgIj09PT4gSFRPbkFzc29jUnNwX3dxKCk6IEhUX0VOQUJMRVxuIik7CkBAIC04NzgsNyArNzE5LDggQEAKIAogCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICI9PT09PT09PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CiAJLyogdW5tYXJrIGJFbmFibGVIVCBmbGFnIGhlcmUgaXMgdGhlIHNhbWUgcmVhc29uIHdoeSB1bm1hcmtlZCBpbgotCSAqIGZ1bmN0aW9uIHJ0bGxpYl9zb2Z0bWFjX25ld19uZXQuIFdCIDIwMDguMDkuMTAqLworCSAqIGZ1bmN0aW9uIHJ0bGxpYl9zb2Z0bWFjX25ld19uZXQuIFdCIDIwMDguMDkuMTAKKwkgKi8KIAlpZiAocE5ldHdvcmstPmJzc2h0LmJkU3VwcG9ydEhUKSB7CiAJCXBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID0gdHJ1ZTsKIAkJcEhUSW5mby0+ZVBlZXJIVFNwZWNWZXIgPSBwTmV0d29yay0+YnNzaHQuYmRIVFNwZWNWZXI7CkBAIC05OTksOCArODQxLDggQEAKIHsKIAlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpIHsKIAkJaWYgKChJc1FvU0RhdGFGcmFtZShwRnJhbWUpICYmIEZyYW1lX09yZGVyKHBGcmFtZSkpID09IDEpIHsKLQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsICJIVCBDT05UUk9MIEZJTEVEICIKLQkJCQkgICAgICJFWElTVCEhXG4iKTsKKwkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfSFQsCisJCQkJICAgICAiSFQgQ09OVFJPTCBGSUxFRCBFWElTVCEhXG4iKTsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfUW9zLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9Rb3MuaAppbmRleCA5NzMzNDJiLi41NWVmN2VjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9Rb3MuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsODE5eF9Rb3MuaApAQCAtMTksOCArMTksNiBAQAogI2lmbmRlZiBfX0lOQ19RT1NfVFlQRV9ICiAjZGVmaW5lIF9fSU5DX1FPU19UWVBFX0gKIAotI2luY2x1ZGUgInJ0bGxpYl9lbmRpYW5mcmVlLmgiCi0KICNkZWZpbmUgQklUMAkJICAgIDB4MDAwMDAwMDEKICNkZWZpbmUgQklUMQkJICAgIDB4MDAwMDAwMDIKICNkZWZpbmUgQklUMgkJICAgIDB4MDAwMDAwMDQKQEAgLTM0MCwxOCArMzM4LDYgQEAKIH07CiAKICNkZWZpbmUgUUJTU19MT0FEX1NJWkUJCQkJNQotI2RlZmluZSBHRVRfUUJTU19MT0FEX1NUQV9DT1VOVChfX3BTdGFydCkJXAotCQlSZWFkRUYyQnl0ZShfX3BTdGFydCkKLSNkZWZpbmUgU0VUX1FCU1NfTE9BRF9TVEFfQ09VTlQoX19wU3RhcnQsIF9fVmFsdWUpCVwKLQkJV3JpdGVFRjJCeXRlKF9fcFN0YXJ0LCBfX1ZhbHVlKQotI2RlZmluZSBHRVRfUUJTU19MT0FEX0NITkxfVVRJTElaQVRJT04oX19wU3RhcnQpCVwKLQkJUmVhZEVGMUJ5dGUoKHU4ICopKF9fcFN0YXJ0KSArIDIpCi0jZGVmaW5lIFNFVF9RQlNTX0xPQURfQ0hOTF9VVElMSVpBVElPTihfX3BTdGFydCwgX19WYWx1ZSkJXAotCQlXcml0ZUVGMUJ5dGUoKHU4ICopKF9fcFN0YXJ0KSArIDIsIF9fVmFsdWUpCi0jZGVmaW5lIEdFVF9RQlNTX0xPQURfQVZBSUxBQkxFX0NBUEFDSVRZKF9fcFN0YXJ0KQlcCi0JCVJlYWRFRjJCeXRlKCh1OCAqKShfX3BTdGFydCkgKyAzKQotI2RlZmluZSBTRVRfUUJTU19MT0FEX0FWQUlMQUJMRV9DQVBBQ0lUWShfX3BTdGFydCwgX19WYWx1ZSkgXAotCQlXcml0ZUVGMkJ5dGUoKHU4ICopKF9fcFN0YXJ0KSArIDMsIF9fVmFsdWUpCiAKIHN0cnVjdCBic3NfcW9zIHsKIAlRT1NfTU9ERSBiZFFvU01vZGU7CkBAIC0zNjcsMTAgKzM1Myw2IEBACiAJYm9vbCBiUUJzc0xvYWRWYWxpZDsKIH07CiAKLSNkZWZpbmUgc1FvU0N0bExuZwkyCi0jZGVmaW5lIFFPU19DVFJMX0xFTihfUW9zTW9kZSkJKChfUW9zTW9kZSA+IFFPU19ESVNBQkxFKSA/IHNRb1NDdGxMbmcgOiAwKQotCi0KICNkZWZpbmUgSXNBQ1ZhbGlkKGFjKQkJKChhYyA+PSAwICYmIGFjIDw9IDcpID8gdHJ1ZSA6IGZhbHNlKQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGw4MTl4X1RTUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfVFNQcm9jLmMKaW5kZXggMjk0ODQ3ZC4uN2Q3N2QwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfVFNQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bDgxOXhfVFNQcm9jLmMKQEAgLTU4LDkgKzU4LDkgQEAKIAkJCQkJcFJ4VHMtPlJ4SW5kaWNhdGVTZXEgPQogCQkJCQkgICAgICAocFJ4VHMtPlJ4SW5kaWNhdGVTZXEgKyAxKSAlIDQwOTY7CiAKLQkJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1JFT1JERVIsICIlcygpOiBJbmRpY2F0ZSIKLQkJCQkJICAgICAiIFNlcU51bTogJWRcbiIsIF9fZnVuY19fLAotCQkJCQkgICAgIHBSZW9yZGVyRW50cnktPlNlcU51bSk7CisJCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9SRU9SREVSLAorCQkJCQkgICAgICIlcygpOiBJbmRpY2F0ZSBTZXFOdW06ICVkXG4iLAorCQkJCQkgICAgIF9fZnVuY19fLCBwUmVvcmRlckVudHJ5LT5TZXFOdW0pOwogCQkJCWllZWUtPnN0YXRzX0luZGljYXRlQXJyYXlbaW5kZXhdID0KIAkJCQkJCQkgcFJlb3JkZXJFbnRyeS0+cHJ4YjsKIAkJCQlpbmRleCsrOwpAQCAtNzgsOCArNzgsOCBAQAogCQlwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSAweGZmZmY7CiAKIAkJaWYgKGluZGV4ID4gUkVPUkRFUl9XSU5fU0laRSkgewotCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCgpOiIKLQkJCQkgICAgICIgUnggUmVvcmRlciBzdHJ1Y3QgYnVmZmVyIGZ1bGwhIVxuIik7CisJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0VSUiwKKwkJCQkgICAgICJSeFJlb3JkZXJJbmRpY2F0ZVBhY2tldCgpOiBSeCBSZW9yZGVyIHN0cnVjdCBidWZmZXIgZnVsbCEhXG4iKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpZWVlLT5yZW9yZGVyX3NwaW5sb2NrKSwKIAkJCQkJICAgICAgIGZsYWdzKTsKIAkJCXJldHVybjsKQEAgLTkxLDcgKzkxLDcgQEAKIAlpZiAoYlBrdEluQnVmICYmIChwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPT0gMHhmZmZmKSkgewogCQlwUnhUcy0+UnhUaW1lb3V0SW5kaWNhdGVTZXEgPSBwUnhUcy0+UnhJbmRpY2F0ZVNlcTsKIAkJbW9kX3RpbWVyKCZwUnhUcy0+UnhQa3RQZW5kaW5nVGltZXIsICBqaWZmaWVzICsKLQkJCSAgTVNFQ1MoaWVlZS0+cEhUSW5mby0+UnhSZW9yZGVyUGVuZGluZ1RpbWUpKTsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhpZWVlLT5wSFRJbmZvLT5SeFJlb3JkZXJQZW5kaW5nVGltZSkpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKIH0KQEAgLTEwNCw4ICsxMDQsOCBAQAogCQkJCSAgICAgVHhUc1JlY29yZFtudW1dKTsKIAogCVRzSW5pdEFkZEJBKGllZWUsIHBUeFRzLCBCQV9QT0xJQ1lfSU1NRURJQVRFLCBmYWxzZSk7Ci0JUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwgIlRzQWRkQmFQcm9jZXNzKCk6IEFEREJBIFJlcSBpcyAiCi0JCSAgICAgInN0YXJ0ZWQhIVxuIik7CisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwKKwkJICAgICAiVHNBZGRCYVByb2Nlc3MoKTogQUREQkEgUmVxIGlzIHN0YXJ0ZWQhIVxuIik7CiB9CiAKIHN0YXRpYyB2b2lkIFJlc2V0VHNDb21tb25JbmZvKHN0cnVjdCB0c19jb21tb25faW5mbyAqcFRzQ29tbW9uSW5mbykKQEAgLTIyMyw3ICsyMjMsNyBAQAogCiAJaWYgKEluYWN0VGltZSAhPSAwKQogCQltb2RfdGltZXIoJnBUc0NvbW1vbkluZm8tPkluYWN0VGltZXIsIGppZmZpZXMgKwotCQkJICBNU0VDUyhJbmFjdFRpbWUpKTsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhJbmFjdFRpbWUpKTsKIH0KIAogc3RhdGljIHN0cnVjdCB0c19jb21tb25faW5mbyAqU2VhcmNoQWRtaXRUUlN0cmVhbShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwKQEAgLTMxMSwxOCArMzExLDI0IEBACiAJICAgdTggKkFkZHIsIHU4IFRJRCwgZW51bSB0cl9zZWxlY3QgVHhSeFNlbGVjdCwgYm9vbCBiQWRkTmV3VHMpCiB7CiAJdTgJVVAgPSAwOworCXVuaW9uIHRzcGVjX2JvZHkgVFNwZWM7CisJdW5pb24gcW9zX3RzaW5mbyAqcFRTSW5mbyA9ICZUU3BlYy5mLlRTSW5mbzsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwVW51c2VkTGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwQWRkbWl0TGlzdDsKKwllbnVtIGRpcmVjdGlvbl92YWx1ZSBEaXI7CiAKIAlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoQWRkcikpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJFUlIhIGdldCBUUyBmb3IgQnJvYWRjYXN0IG9yICIKLQkJCSAgICAgIk11bHRpY2FzdFxuIik7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAiRVJSISBnZXQgVFMgZm9yIEJyb2FkY2FzdCBvciBNdWx0aWNhc3RcbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuc3VwcG9ydGVkID09IDApIHsKIAkJVVAgPSAwOwogCX0gZWxzZSB7CiAJCWlmICghSXNBQ1ZhbGlkKFRJRCkpIHsKLQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiRVJSISBpbiAlcygpLCBUSUQoJWQpIGlzICIKLQkJCQkgICAgICJub3QgdmFsaWRcbiIsIF9fZnVuY19fLCBUSUQpOworCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkJICAgICAiRVJSISBpbiAlcygpLCBUSUQoJWQpIGlzIG5vdCB2YWxpZFxuIiwKKwkJCQkgICAgIF9fZnVuY19fLCBUSUQpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKQEAgLTM0Nyw3NyArMzUzLDcwIEBACiAJfQogCiAJKnBwVFMgPSBTZWFyY2hBZG1pdFRSU3RyZWFtKGllZWUsIEFkZHIsIFVQLCBUeFJ4U2VsZWN0KTsKLQlpZiAoKnBwVFMgIT0gTlVMTCkgeworCWlmICgqcHBUUyAhPSBOVUxMKQogCQlyZXR1cm4gdHJ1ZTsKLQl9IGVsc2UgewotCQlpZiAoIWJBZGROZXdUcykgewotCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9UUywgImFkZCBuZXcgVFMgZmFpbGVkIgotCQkJCSAgICAgIih0aWQ6JWQpXG4iLCBVUCk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQl1bmlvbiB0c3BlY19ib2R5IFRTcGVjOwotCQkJdW5pb24gcW9zX3RzaW5mbyAqcFRTSW5mbyA9ICZUU3BlYy5mLlRTSW5mbzsKLQkJCXN0cnVjdCBsaXN0X2hlYWQgKnBVbnVzZWRMaXN0ID0KLQkJCQkoVHhSeFNlbGVjdCA9PSBUWF9ESVIpID8KKworCWlmICghYkFkZE5ld1RzKSB7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfVFMsCisJCQkgICAgICJhZGQgbmV3IFRTIGZhaWxlZCh0aWQ6JWQpXG4iLCBVUCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlwVW51c2VkTGlzdCA9IChUeFJ4U2VsZWN0ID09IFRYX0RJUikgPwogCQkJCSgmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpIDoKIAkJCQkoJmllZWUtPlJ4X1RTX1VudXNlZF9MaXN0KTsKIAotCQkJc3RydWN0IGxpc3RfaGVhZCAqcEFkZG1pdExpc3QgPQotCQkJCShUeFJ4U2VsZWN0ID09IFRYX0RJUikgPworCXBBZGRtaXRMaXN0ID0gKFR4UnhTZWxlY3QgPT0gVFhfRElSKSA/CiAJCQkJKCZpZWVlLT5UeF9UU19BZG1pdF9MaXN0KSA6CiAJCQkJKCZpZWVlLT5SeF9UU19BZG1pdF9MaXN0KTsKIAotCQkJZW51bSBkaXJlY3Rpb25fdmFsdWUgRGlyID0KLQkJCQkgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NQVNURVIpID8KLQkJCQkgKChUeFJ4U2VsZWN0ID09IFRYX0RJUikgPyBESVJfRE9XTiA6IERJUl9VUCkgOgotCQkJCSAoKFR4UnhTZWxlY3QgPT0gVFhfRElSKSA/IERJUl9VUCA6IERJUl9ET1dOKTsKLQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfVFMsICJ0byBhZGQgVHNcbiIpOwotCQkJaWYgKCFsaXN0X2VtcHR5KHBVbnVzZWRMaXN0KSkgewotCQkJCSgqcHBUUykgPSBsaXN0X2VudHJ5KHBVbnVzZWRMaXN0LT5uZXh0LAotCQkJCQkgIHN0cnVjdCB0c19jb21tb25faW5mbywgTGlzdCk7Ci0JCQkJbGlzdF9kZWxfaW5pdCgmKCpwcFRTKS0+TGlzdCk7Ci0JCQkJaWYgKFR4UnhTZWxlY3QgPT0gVFhfRElSKSB7Ci0JCQkJCXN0cnVjdCB0eF90c19yZWNvcmQgKnRtcCA9Ci0JCQkJCQljb250YWluZXJfb2YoKnBwVFMsCi0JCQkJCQlzdHJ1Y3QgdHhfdHNfcmVjb3JkLAotCQkJCQkJVHNDb21tb25JbmZvKTsKLQkJCQkJUmVzZXRUeFRzRW50cnkodG1wKTsKLQkJCQl9IGVsc2UgewotCQkJCQlzdHJ1Y3QgcnhfdHNfcmVjb3JkICp0bXAgPQotCQkJCQkJIGNvbnRhaW5lcl9vZigqcHBUUywKLQkJCQkJCSBzdHJ1Y3QgcnhfdHNfcmVjb3JkLAotCQkJCQkJIFRzQ29tbW9uSW5mbyk7Ci0JCQkJCVJlc2V0UnhUc0VudHJ5KHRtcCk7Ci0JCQkJfQorCURpciA9IChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKSA/CisJCQkJKChUeFJ4U2VsZWN0ID09IFRYX0RJUikgPyBESVJfRE9XTiA6IERJUl9VUCkgOgorCQkJCSgoVHhSeFNlbGVjdCA9PSBUWF9ESVIpID8gRElSX1VQIDogRElSX0RPV04pOwogCi0JCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9UUywgInRvIGluaXQgY3VycmVudCBUUyIKLQkJCQkJICAgICAiLCBVUDolZCwgRGlyOiVkLCBhZGRyOiAlcE0iCi0JCQkJCSAgICAgIiBwcFRzPSVwXG4iLCBVUCwgRGlyLAotCQkJCQkgICAgICBBZGRyLCAqcHBUUyk7Ci0JCQkJcFRTSW5mby0+ZmllbGQudWNUcmFmZmljVHlwZSA9IDA7Ci0JCQkJcFRTSW5mby0+ZmllbGQudWNUU0lEID0gVVA7Ci0JCQkJcFRTSW5mby0+ZmllbGQudWNEaXJlY3Rpb24gPSBEaXI7Ci0JCQkJcFRTSW5mby0+ZmllbGQudWNBY2Nlc3NQb2xpY3kgPSAxOwotCQkJCXBUU0luZm8tPmZpZWxkLnVjQWdncmVnYXRpb24gPSAwOwotCQkJCXBUU0luZm8tPmZpZWxkLnVjUFNCID0gMDsKLQkJCQlwVFNJbmZvLT5maWVsZC51Y1VQID0gVVA7Ci0JCQkJcFRTSW5mby0+ZmllbGQudWNUU0luZm9BY2tQb2xpY3kgPSAwOwotCQkJCXBUU0luZm8tPmZpZWxkLnVjU2NoZWR1bGUgPSAwOwotCi0JCQkJTWFrZVRTRW50cnkoKnBwVFMsIEFkZHIsICZUU3BlYywgTlVMTCwgMCwgMCk7Ci0JCQkJQWRtaXRUUyhpZWVlLCAqcHBUUywgMCk7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmKCgqcHBUUyktPkxpc3QpLCBwQWRkbWl0TGlzdCk7Ci0KLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsICJFUlIhIWluIGZ1bmN0aW9uICIKLQkJCQkJICAgICAiJXMoKSBUaGVyZSBpcyBub3QgZW5vdWdoIGRpcj0lZCIKLQkJCQkJICAgICAiKDA9dXAgZG93bj0xKSBUUyByZWNvcmQgdG8gYmUgIgotCQkJCQkgICAgICJ1c2VkISEiLCBfX2Z1bmNfXywgRGlyKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9CisJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9UUywgInRvIGFkZCBUc1xuIik7CisJaWYgKCFsaXN0X2VtcHR5KHBVbnVzZWRMaXN0KSkgeworCQkoKnBwVFMpID0gbGlzdF9lbnRyeShwVW51c2VkTGlzdC0+bmV4dCwKKwkJCSAgc3RydWN0IHRzX2NvbW1vbl9pbmZvLCBMaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmKCpwcFRTKS0+TGlzdCk7CisJCWlmIChUeFJ4U2VsZWN0ID09IFRYX0RJUikgeworCQkJc3RydWN0IHR4X3RzX3JlY29yZCAqdG1wID0KKwkJCQljb250YWluZXJfb2YoKnBwVFMsCisJCQkJc3RydWN0IHR4X3RzX3JlY29yZCwKKwkJCQlUc0NvbW1vbkluZm8pOworCQkJUmVzZXRUeFRzRW50cnkodG1wKTsKKwkJfSBlbHNlIHsKKwkJCXN0cnVjdCByeF90c19yZWNvcmQgKnRtcCA9CisJCQkJIGNvbnRhaW5lcl9vZigqcHBUUywKKwkJCQkgc3RydWN0IHJ4X3RzX3JlY29yZCwKKwkJCQkgVHNDb21tb25JbmZvKTsKKwkJCVJlc2V0UnhUc0VudHJ5KHRtcCk7CiAJCX0KKworCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1RTLAorCQkJICAgICAidG8gaW5pdCBjdXJyZW50IFRTLCBVUDolZCwgRGlyOiVkLCBhZGRyOiAlcE0gcHBUcz0lcFxuIiwKKwkJCSAgICAgVVAsIERpciwgQWRkciwgKnBwVFMpOworCQlwVFNJbmZvLT5maWVsZC51Y1RyYWZmaWNUeXBlID0gMDsKKwkJcFRTSW5mby0+ZmllbGQudWNUU0lEID0gVVA7CisJCXBUU0luZm8tPmZpZWxkLnVjRGlyZWN0aW9uID0gRGlyOworCQlwVFNJbmZvLT5maWVsZC51Y0FjY2Vzc1BvbGljeSA9IDE7CisJCXBUU0luZm8tPmZpZWxkLnVjQWdncmVnYXRpb24gPSAwOworCQlwVFNJbmZvLT5maWVsZC51Y1BTQiA9IDA7CisJCXBUU0luZm8tPmZpZWxkLnVjVVAgPSBVUDsKKwkJcFRTSW5mby0+ZmllbGQudWNUU0luZm9BY2tQb2xpY3kgPSAwOworCQlwVFNJbmZvLT5maWVsZC51Y1NjaGVkdWxlID0gMDsKKworCQlNYWtlVFNFbnRyeSgqcHBUUywgQWRkciwgJlRTcGVjLCBOVUxMLCAwLCAwKTsKKwkJQWRtaXRUUyhpZWVlLCAqcHBUUywgMCk7CisJCWxpc3RfYWRkX3RhaWwoJigoKnBwVFMpLT5MaXN0KSwgcEFkZG1pdExpc3QpOworCisJCXJldHVybiB0cnVlOwogCX0KKworCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkgICAgICJFUlIhIWluIGZ1bmN0aW9uICVzKCkgVGhlcmUgaXMgbm90IGVub3VnaCBkaXI9JWQoMD11cCBkb3duPTEpIFRTIHJlY29yZCB0byBiZSB1c2VkISEiLAorCQkgICAgIF9fZnVuY19fLCBEaXIpOworCXJldHVybiBmYWxzZTsKIH0KIAogc3RhdGljIHZvaWQgUmVtb3ZlVHNFbnRyeShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHRzX2NvbW1vbl9pbmZvICpwVHMsCkBAIC00MzgsOCArNDM3LDggQEAKIAkJCXBSeFJlb3JkZXJFbnRyeSA9IChzdHJ1Y3QgcnhfcmVvcmRlcl9lbnRyeSAqKQogCQkJCQlsaXN0X2VudHJ5KHBSeFRTLT5SeFBlbmRpbmdQa3RMaXN0LnByZXYsCiAJCQkJCXN0cnVjdCByeF9yZW9yZGVyX2VudHJ5LCBMaXN0KTsKLQkJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfUkVPUkRFUiwgIiVzKCk6IERlbGV0ZSBTZXFOdW0gIgotCQkJCSAgICAgIiVkIVxuIiwgX19mdW5jX18sCisJCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX1JFT1JERVIsCisJCQkJICAgICAiJXMoKTogRGVsZXRlIFNlcU51bSAlZCFcbiIsIF9fZnVuY19fLAogCQkJCSAgICAgcFJ4UmVvcmRlckVudHJ5LT5TZXFOdW0pOwogCQkJbGlzdF9kZWxfaW5pdCgmcFJ4UmVvcmRlckVudHJ5LT5MaXN0KTsKIAkJCXsKQEAgLTQ2Nyw3ICs0NjYsNyBAQAogewogCXN0cnVjdCB0c19jb21tb25faW5mbyAqcFRTLCAqcFRtcFRTOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT09PT0+UmVtb3ZlUGVlclRTLCAlcE1cbiIsIEFkZHIpOworCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIj09PT09PT09PT09PlJlbW92ZVBlZXJUUywgJXBNXG4iLCBBZGRyKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwVFMsIHBUbXBUUywgJmllZWUtPlR4X1RTX1BlbmRpbmdfTGlzdCwgTGlzdCkgewogCQlpZiAobWVtY21wKHBUUy0+QWRkciwgQWRkciwgNikgPT0gMCkgewpAQCAtNDc5LDcgKzQ3OCw4IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocFRTLCBwVG1wVFMsICZpZWVlLT5UeF9UU19BZG1pdF9MaXN0LCBMaXN0KSB7CiAJCWlmIChtZW1jbXAocFRTLT5BZGRyLCBBZGRyLCA2KSA9PSAwKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICI9PT09PnJlbW92ZSBUeF9UU19hZG1pbl9saXN0XG4iKTsKKwkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCQkgICAgIj09PT0+cmVtb3ZlIFR4X1RTX2FkbWluX2xpc3RcbiIpOwogCQkJUmVtb3ZlVHNFbnRyeShpZWVlLCBwVFMsIFRYX0RJUik7CiAJCQlsaXN0X2RlbF9pbml0KCZwVFMtPkxpc3QpOwogCQkJbGlzdF9hZGRfdGFpbCgmcFRTLT5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOwpAQCAtNTM5LDEzICs1MzksMTMgQEAKIAkJcFR4VFMtPmJBZGRCYVJlcUluUHJvZ3Jlc3MgPSB0cnVlOwogCiAJCWlmIChwVHhUUy0+YkFkZEJhUmVxRGVsYXllZCkgewotCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwgIlRzU3RhcnRBZGRCYVByb2Nlc3MoKTogIgotCQkJCSAgICAgIkRlbGF5ZWQgU3RhcnQgQUREQkEgYWZ0ZXIgNjAgc2VjISFcbiIpOworCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwKKwkJCQkgICAgICJUc1N0YXJ0QWRkQmFQcm9jZXNzKCk6IERlbGF5ZWQgU3RhcnQgQUREQkEgYWZ0ZXIgNjAgc2VjISFcbiIpOwogCQkJbW9kX3RpbWVyKCZwVHhUUy0+VHNBZGRCYVRpbWVyLCBqaWZmaWVzICsKLQkJCQkgIE1TRUNTKFRTX0FEREJBX0RFTEFZKSk7CisJCQkJICBtc2Vjc190b19qaWZmaWVzKFRTX0FEREJBX0RFTEFZKSk7CiAJCX0gZWxzZSB7Ci0JCQlSVExMSUJfREVCVUcoUlRMTElCX0RMX0JBLCAiVHNTdGFydEFkZEJhUHJvY2VzcygpOiAiCi0JCQkJICAgICAiSW1tZWRpYXRlbHkgU3RhcnQgQUREQkEgbm93ISFcbiIpOworCQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9CQSwKKwkJCQkgICAgICJUc1N0YXJ0QWRkQmFQcm9jZXNzKCk6IEltbWVkaWF0ZWx5IFN0YXJ0IEFEREJBIG5vdyEhXG4iKTsKIAkJCW1vZF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lciwgamlmZmllcysxMCk7CiAJCX0KIAl9IGVsc2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWIuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWIuaAppbmRleCBjZWYyZGMyLi4zYzhiNzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYi5oCkBAIC02NiwyNSArNjYsOCBAQAogI2RlZmluZSBJV19DVVNUT01fTUFYCTI1NgkvKiBJbiBieXRlcyAqLwogI2VuZGlmCiAKLSNpZm5kZWYgY29udGFpbmVyX29mCi0vKioKLSAqIGNvbnRhaW5lcl9vZiAtIGNhc3QgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgb3V0IHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQotICoKLSAqIEBwdHI6CXRoZSBwb2ludGVyIHRvIHRoZSBtZW1iZXIuCi0gKiBAdHlwZTogICAgICAgdGhlIHR5cGUgb2YgdGhlIGNvbnRhaW5lciBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KLSAqIEBtZW1iZXI6ICAgICB0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIHdpdGhpbiB0aGUgc3RydWN0LgotICoKLSAqLwotI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7CQkgICAgICBcCi0JY29uc3QgdHlwZW9mKCgodHlwZSAqKTApLT5tZW1iZXIpKl9fbXB0ciA9IChwdHIpOyAgICBcCi0JKHR5cGUgKikoKGNoYXIgKilfX21wdHIgLSBvZmZzZXRvZih0eXBlLCBtZW1iZXIpKTsgfSkKLSNlbmRpZgotCiAjZGVmaW5lIHNrYl90YWlsX3BvaW50ZXJfcnNsKHNrYikgc2tiX3RhaWxfcG9pbnRlcihza2IpCiAKLSNkZWZpbmUgRVhQT1JUX1NZTUJPTF9SU0woeCkgRVhQT1JUX1NZTUJPTCh4KQotCi0KICNkZWZpbmUgcXVldWVfZGVsYXllZF93b3JrX3JzbCh4LCB5LCB6KSBxdWV1ZV9kZWxheWVkX3dvcmsoeCwgeSwgeikKICNkZWZpbmUgSU5JVF9ERUxBWUVEX1dPUktfUlNMKHgsIHksIHopIElOSVRfREVMQVlFRF9XT1JLKHgsIHkpCiAKQEAgLTQ4Miw5ICs0NjUsNiBAQAogI2RlZmluZQlJRUVFX0NSWVBUX0FMR19OQU1FX0xFTgkJCTE2CiAKICNkZWZpbmUgTUFYX0lFX0xFTiAgMHhmZgotI2RlZmluZSBSVF9BU1NFUlRfUkVUKF9FeHApIGRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBSVF9BU1NFUlRfUkVUX1ZBTFVFKF9FeHAsIFJldCkJCVwKLQlkbyB7fSB3aGlsZSAoMCkKIAogc3RydWN0IGllZWVfcGFyYW0gewogCXUzMiBjbWQ7CkBAIC01MjUsMTcgKzUwNSwxNyBAQAogI2RlZmluZSBJV19RVUFMX05PSVNFX1VQREFURUQgIDB4NAogI2VuZGlmCiAKLSNkZWZpbmUgTVNFQ1ModCkgbXNlY3NfdG9famlmZmllcyh0KQogI2RlZmluZSBtc2xlZXBfaW50ZXJydXB0aWJsZV9yc2wgIG1zbGVlcF9pbnRlcnJ1cHRpYmxlCiAKICNkZWZpbmUgUlRMTElCX0RBVEFfTEVOCQkyMzA0CiAvKiBNYXhpbXVtIHNpemUgZm9yIHRoZSBNQS1VTklUREFUQSBwcmltaXRpdmUsIDgwMi4xMSBzdGFuZGFyZCBzZWN0aW9uCi0gICA2LjIuMS4xLjIuCi0KLSAgIFRoZSBmaWd1cmUgaW4gc2VjdGlvbiA3LjEuMiBzdWdnZXN0cyBhIGJvZHkgc2l6ZSBvZiB1cCB0byAyMzEyCi0gICBieXRlcyBpcyBhbGxvd2VkLCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcsIEkgc3VzcGVjdCB0aGlzCi0gICByZXByZXNlbnRzIHRoZSAyMzA0IGJ5dGVzIG9mIHJlYWwgZGF0YSwgcGx1cyBhIHBvc3NpYmxlIDggYnl0ZXMgb2YKLSAgIFdFUCBJViBhbmQgSUNWLiAodGhpcyBpbnRlcnByZXRhdGlvbiBzdWdnZXN0ZWQgYnkgUmFtaXJvIEJhcnJlaXJvKSAqLworICogNi4yLjEuMS4yLgorICoKKyAqIFRoZSBmaWd1cmUgaW4gc2VjdGlvbiA3LjEuMiBzdWdnZXN0cyBhIGJvZHkgc2l6ZSBvZiB1cCB0byAyMzEyCisgKiBieXRlcyBpcyBhbGxvd2VkLCB3aGljaCBpcyBhIGJpdCBjb25mdXNpbmcsIEkgc3VzcGVjdCB0aGlzCisgKiByZXByZXNlbnRzIHRoZSAyMzA0IGJ5dGVzIG9mIHJlYWwgZGF0YSwgcGx1cyBhIHBvc3NpYmxlIDggYnl0ZXMgb2YKKyAqIFdFUCBJViBhbmQgSUNWLiAodGhpcyBpbnRlcnByZXRhdGlvbiBzdWdnZXN0ZWQgYnkgUmFtaXJvIEJhcnJlaXJvKQorICovCiAjZGVmaW5lIFJUTExJQl8xQUREUl9MRU4gMTAKICNkZWZpbmUgUlRMTElCXzJBRERSX0xFTiAxNgogI2RlZmluZSBSVExMSUJfM0FERFJfTEVOIDI0CkBAIC03MTEsMjAgKzY5MSwxMyBAQAogI2RlZmluZSBSVExMSUJfREVCVUdfREFUQShsZXZlbCwgZGF0YSwgZGF0YWxlbikJXAogCWRvIHsJCQkJCQkJXAogCQlpZiAoKHJ0bGxpYl9kZWJ1Z19sZXZlbCAmIChsZXZlbCkpID09IChsZXZlbCkpIHsJXAotCQkJaW50IGk7CQkJCQlcCi0JCQl1OCAqcGRhdGEgPSAodTggKilkYXRhOwkJCVwKIAkJCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWI6ICVzKClcbiIsIF9fZnVuY19fKTsJXAotCQkJZm9yIChpID0gMDsgaSA8IChpbnQpKGRhdGFsZW4pOyBpKyspCXsJXAotCQkJCXByaW50aygiJTIuMnggIiwgcGRhdGFbaV0pOwkJXAotCQkJCWlmICgoaSsxKSUxNiA9PSAwKQkJCVwKLQkJCQkJcHJpbnRrKCJcbiIpOwlcCi0JCQl9CQkJCVwKLQkJCXByaW50aygiXG4iKTsJCQlcCisJCQlwcmludF9oZXhfZHVtcF9ieXRlcyhLRVJOX0RFQlVHLCBEVU1QX1BSRUZJWF9OT05FLCBcCisJCQkJCSAgICAgZGF0YSwgZGF0YWxlbik7IFwKIAkJfQkJCQkJXAogCX0gd2hpbGUgKDApCiAKLS8qCi0gKiBUbyB1c2UgdGhlIGRlYnVnIHN5c3RlbTsKKy8qIFRvIHVzZSB0aGUgZGVidWcgc3lzdGVtOwogICoKICAqIElmIHlvdSBhcmUgZGVmaW5pbmcgYSBuZXcgZGVidWcgY2xhc3NpZmljYXRpb24sIHNpbXBseSBhZGQgaXQgdG8gdGhlICNkZWZpbmUKICAqIGxpc3QgaGVyZSBpbiB0aGUgZm9ybSBvZjoKQEAgLTc0Myw4ICs3MTYsNiBAQAogICogJSBjYXQgL3Byb2MvbmV0L2lwdy9kZWJ1Z19sZXZlbAogICoKICAqIHlvdSBzaW1wbHkgbmVlZCB0byBhZGQgeW91ciBlbnRyeSB0byB0aGUgaXB3X2RlYnVnX2xldmVscyBhcnJheS4KLSAqCi0gKgogICovCiAKICNkZWZpbmUgUlRMTElCX0RMX0lORk8JICAoMTw8MCkKQEAgLTc2OSw4ICs3NDAsOCBAQAogI2RlZmluZSBSVExMSUJfRExfVFJBQ0UJICAgKDE8PDI5KQogI2RlZmluZSBSVExMSUJfRExfREFUQQkgICAoMTw8MzApCiAjZGVmaW5lIFJUTExJQl9ETF9FUlIJICAgKDE8PDMxKQotI2RlZmluZSBSVExMSUJfRVJST1IoZiwgYS4uLikgcHJpbnRrKEtFUk5fRVJSICJydGxsaWI6ICIgZiwgIyMgYSkKLSNkZWZpbmUgUlRMTElCX1dBUk5JTkcoZiwgYS4uLikgcHJpbnRrKEtFUk5fV0FSTklORyAicnRsbGliOiAiIGYsICMjIGEpCisjZGVmaW5lIFJUTExJQl9FUlJPUihmLCBhLi4uKSBwcl9lcnIoInJ0bGxpYjogIiBmLCAjIyBhKQorI2RlZmluZSBSVExMSUJfV0FSTklORyhmLCBhLi4uKSBwcl93YXJuKCJydGxsaWI6ICIgZiwgIyMgYSkKICNkZWZpbmUgUlRMTElCX0RFQlVHX0lORk8oZiwgYS4uLikgICBSVExMSUJfREVCVUcoUlRMTElCX0RMX0lORk8sIGYsICMjIGEpCiAKICNkZWZpbmUgUlRMTElCX0RFQlVHX1dYKGYsIGEuLi4pICAgICBSVExMSUJfREVCVUcoUlRMTElCX0RMX1dYLCBmLCAjIyBhKQpAQCAtNzg0LDI2ICs3NTUsNiBAQAogI2RlZmluZSBSVExMSUJfREVCVUdfUlgoZiwgYS4uLikgIFJUTExJQl9ERUJVRyhSVExMSUJfRExfUlgsIGYsICMjIGEpCiAjZGVmaW5lIFJUTExJQl9ERUJVR19RT1MoZiwgYS4uLikgIFJUTExJQl9ERUJVRyhSVExMSUJfRExfUU9TLCBmLCAjIyBhKQogCi0vKiBBZGRlZCBieSBBbm5pZSwgMjAwNS0xMS0yMi4gKi8KLSNkZWZpbmUgTUFYX1NUUl9MRU4gICAgIDY0Ci0vKiBJIHdhbnQgdG8gc2VlIEFTQ0lJIDMzIHRvIDEyNiBvbmx5LiBPdGhlcndpc2UsIEkgcHJpbnQgJz8nLiAqLwotI2RlZmluZSBQUklOVEFCTEUoX2NoKSAgKF9jaCA+ICchJyAmJiBfY2ggPCAnficpCi0jZGVmaW5lIFJUTExJQl9QUklOVF9TVFIoX0NvbXAsIF9UaXRsZVN0cmluZywgX1B0ciwgX0xlbikJCVwKLQlpZiAoKF9Db21wKSAmIGxldmVsKSB7CQkJCQkgICAgICAgXAotCQlpbnQJICAgICBfX2k7CQkJCSAgICBcCi0JCXU4ICBzdHJ1Y3QgYnVmZmVyW01BWF9TVFJfTEVOXTsJCQkJXAotCQlpbnQgbGVuZ3RoID0gKF9MZW4gPCBNQVhfU1RSX0xFTikgPyBfTGVuIDogKE1BWF9TVFJfTEVOLTEpIDtcCi0JCW1lbXNldChzdHJ1Y3QgYnVmZmVyLCAwLCBNQVhfU1RSX0xFTik7CQlcCi0JCW1lbWNweShzdHJ1Y3QgYnVmZmVyLCAodTggKilfUHRyLCBsZW5ndGgpOwkJXAotCQlmb3IgKF9faSA9IDA7IF9faSA8IE1BWF9TVFJfTEVOOyBfX2krKykgewkJXAotCQkJaWYgKCFQUklOVEFCTEUoc3RydWN0IGJ1ZmZlcltfX2ldKSkJCVwKLQkJCQlzdHJ1Y3QgYnVmZmVyW19faV0gPSAnPyc7CQlcCi0JCX0JCQkJCQkJXAotCQlzdHJ1Y3QgYnVmZmVyW2xlbmd0aF0gPSAnXDAnOwkJCQlcCi0JCXByaW50ayhLRVJOX0lORk8gIlJ0bDgxOXg6ICIpOwkJCQlcCi0JCXByaW50ayhfVGl0bGVTdHJpbmcpOwkJCQkJXAotCQlwcmludGsoIjogJWQsIDwlcz5cbiIsIF9MZW4sIHN0cnVjdCBidWZmZXIpOwkJXAotCX0KICNpZm5kZWYgRVRIX1BfUEFFCiAjZGVmaW5lIEVUSF9QX1BBRSAweDg4OEUgLyogUG9ydCBBY2Nlc3MgRW50aXR5IChJRUVFIDgwMi4xWCkgKi8KICNkZWZpbmUgRVRIX1BfSVAJMHgwODAwCQkvKiBJbnRlcm5ldCBQcm90b2NvbCBwYWNrZXQJKi8KQEAgLTEwMjIsNyArOTczLDggQEAKIC8qIElFRUUgODAyLjExIHJlcXVpcmVzIHRoYXQgU1RBIHN1cHBvcnRzIGNvbmN1cnJlbnQgcmVjZXB0aW9uIG9mIGF0IGxlYXN0CiAgKiB0aHJlZSBmcmFnbWVudGVkIGZyYW1lcy4gVGhpcyBkZWZpbmUgY2FuIGJlIGluY3JlYXNlZCB0byBzdXBwb3J0IG1vcmUKICAqIGNvbmN1cnJlbnQgZnJhbWVzLCBidXQgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgZWFjaCBlbnRyeSBjYW4gY29uc3VtZSBhYm91dAotICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LiAqLworICogMiBrQiBvZiBSQU0gYW5kIGluY3JlYXNpbmcgY2FjaGUgc2l6ZSB3aWxsIHNsb3cgZG93biBmcmFtZSByZWFzc2VtYmx5LgorICovCiAjZGVmaW5lIFJUTExJQl9GUkFHX0NBQ0hFX0xFTiA0CiAKIHN0cnVjdCBydGxsaWJfZnJhZ19lbnRyeSB7CkBAIC0xMTAwLDE2ICsxMDUyLDE1IEBACiB9IF9fcGFja2VkOwogCiAKLS8qCi0gODAyLjExIGRhdGEgZnJhbWUgZnJvbSBBUAotICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi1CeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKLSAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAotRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgZnJhbWUgIHwgIGZjcyB8Ci0gICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8CSB8CSB8IGVuY2UgfCAgZGF0YSAgIHwgICAgICB8Ci0gICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKLVRvdGFsOiAyOC0yMzQwIGJ5dGVzCi0qLworLyogODAyLjExIGRhdGEgZnJhbWUgZnJvbSBBUAorICogICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisgKiBCeXRlcyB8ICAyICAgfCAgMiAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgIDIgICB8IDAuLjIzMTIgfCAgIDQgIHwKKyAqICAgICAgIHwtLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfAorICogRGVzYy4gfCBjdHJsIHwgZHVyYSB8ICBEQS9SQSAgfCAgIFRBICAgIHwgICAgU0EgICB8IFNlcXUgfCAgZnJhbWUgIHwgIGZjcyB8CisgKiAgICAgICB8ICAgICAgfCB0aW9uIHwgKEJTU0lEKSB8ICAgICAgICAgfCAgICAgICAgIHwgZW5jZSB8ICBkYXRhICAgfCAgICAgIHwKKyAqICAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworICogVG90YWw6IDI4LTIzNDAgYnl0ZXMKKyAqLwogCiAvKiBNYW5hZ2VtZW50IEZyYW1lIEluZm9ybWF0aW9uIEVsZW1lbnQgVHlwZXMgKi8KIGVudW0gcnRsbGliX21maWUgewpAQCAtMTE0Nyw3ICsxMDk4LDggQEAKIAogLyogTWluaW1hbCBoZWFkZXI7IGNhbiBiZSB1c2VkIGZvciBwYXNzaW5nIDgwMi4xMSBmcmFtZXMgd2l0aCBzdWZmaWNpZW50CiAgKiBpbmZvcm1hdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0eXBlIG9mIHVuZGVybHlpbmcgZGF0YSB0eXBlIGlzIGFjdHVhbGx5Ci0gKiBzdG9yZWQgaW4gdGhlIGRhdGEuICovCisgKiBzdG9yZWQgaW4gdGhlIGRhdGEuCisgKi8KIHN0cnVjdCBydGxsaWJfcHNwb2xsX2hkciB7CiAJX19sZTE2IGZyYW1lX2N0bDsKIAlfX2xlMTYgYWlkOwpAQCAtMTI1Nyw3ICsxMjA5LDggQEAKIAlfX2xlMTYgYmVhY29uX2ludGVydmFsOwogCV9fbGUxNiBjYXBhYmlsaXR5OwogCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcywgRkggcGFyYW1zLCBEUyBwYXJhbXMsCi0JICogQ0YgcGFyYW1zLCBJQlNTIHBhcmFtcywgVElNIChpZiBiZWFjb24pLCBSU04gKi8KKwkgKiBDRiBwYXJhbXMsIElCU1MgcGFyYW1zLCBUSU0gKGlmIGJlYWNvbiksIFJTTgorCSAqLwogCXN0cnVjdCBydGxsaWJfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKIH0gX19wYWNrZWQ7CiAKQEAgLTEzMzIsNyArMTI4NSw4IEBACiAvKiBNQVhfUkFURVNfTEVOR1RIIG5lZWRzIHRvIGJlIDEyLiAgVGhlIHNwZWMgc2F5cyA4LCBhbmQgbWFueSBBUHMKICAqIG9ubHkgdXNlIDgsIGFuZCB0aGVuIHVzZSBleHRlbmRlZCByYXRlcyBmb3IgdGhlIHJlbWFpbmluZyBzdXBwb3J0ZWQKICAqIHJhdGVzLiAgT3RoZXIgQVBzLCBob3dldmVyLCBzdGljayBhbGwgb2YgdGhlaXIgc3VwcG9ydGVkIHJhdGVzIG9uIHRoZQotICogbWFpbiByYXRlcyBpbmZvcm1hdGlvbiBlbGVtZW50Li4uICovCisgKiBtYWluIHJhdGVzIGluZm9ybWF0aW9uIGVsZW1lbnQuLi4KKyAqLwogI2RlZmluZSBNQVhfUkFURVNfTEVOR1RICQkgICgodTgpMTIpCiAjZGVmaW5lIE1BWF9SQVRFU19FWF9MRU5HVEgJICAgICAgICgodTgpMTYpCiAjZGVmaW5lIE1BWF9ORVRXT1JLX0NPVU5UCQkgIDk2CkBAIC0xNTE5LDIyICsxNDczLDIxIEBACiAJdTggbGVuOwogfSBfX3BhY2tlZDsKIAotLyoKLSAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cworLyogVGhlc2UgYXJlIHRoZSBkYXRhIHR5cGVzIHRoYXQgY2FuIG1ha2UgdXAgbWFuYWdlbWVudCBwYWNrZXRzCiAgKgotCXUxNiBhdXRoX2FsZ29yaXRobTsKLQl1MTYgYXV0aF9zZXF1ZW5jZTsKLQl1MTYgYmVhY29uX2ludGVydmFsOwotCXUxNiBjYXBhYmlsaXR5OwotCXU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOwotCXUxNiBsaXN0ZW5faW50ZXJ2YWw7Ci0Jc3RydWN0IHsKLQkJdTE2IGFzc29jaWF0aW9uX2lkOjE0LCByZXNlcnZlZDoyOwotCX0gX19wYWNrZWQ7Ci0JdTMyIHRpbWVfc3RhbXBbMl07Ci0JdTE2IHJlYXNvbjsKLQl1MTYgc3RhdHVzOwotKi8KKyAqIHUxNiBhdXRoX2FsZ29yaXRobTsKKyAqIHUxNiBhdXRoX3NlcXVlbmNlOworICogdTE2IGJlYWNvbl9pbnRlcnZhbDsKKyAqIHUxNiBjYXBhYmlsaXR5OworICogdTggY3VycmVudF9hcFtFVEhfQUxFTl07CisgKiB1MTYgbGlzdGVuX2ludGVydmFsOworICogc3RydWN0IHsKKyAqICAgdTE2IGFzc29jaWF0aW9uX2lkOjE0LCByZXNlcnZlZDoyOworICogfSBfX3BhY2tlZDsKKyAqIHUzMiB0aW1lX3N0YW1wWzJdOworICogdTE2IHJlYXNvbjsKKyAqIHUxNiBzdGF0dXM7CisgKi8KIAogI2RlZmluZSBSVExMSUJfREVGQVVMVF9UWF9FU1NJRCAiUGVuZ3VpbiIKICNkZWZpbmUgUlRMTElCX0RFRkFVTFRfQkFTSUNfUkFURSAyCkBAIC0xNjcwLDcgKzE2MjMsNiBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKLSNpZiAxCiBlbnVtIHJ0bGxpYl9zdGF0ZSB7CiAKIAkvKiB0aGUgY2FyZCBpcyBub3QgbGlua2VkIGF0IGFsbCAqLwpAQCAtMTcwOCwxNyArMTY2MCw2IEBACiAJICovCiAJUlRMTElCX0xJTktFRF9TQ0FOTklORywKIH07Ci0jZWxzZQotZW51bSBydGxsaWJfc3RhdGUgewotCVJUTExJQl9VTklOSVRJQUxJWkVEID0gMCwKLQlSVExMSUJfSU5JVElBTElaRUQsCi0JUlRMTElCX0FTU09DSUFUSU5HLAotCVJUTExJQl9BU1NPQ0lBVEVELAotCVJUTExJQl9BVVRIRU5USUNBVElORywKLQlSVExMSUJfQVVUSEVOVElDQVRFRCwKLQlSVExMSUJfU0hVVERPV04KLX07Ci0jZW5kaWYKIAogI2RlZmluZSBERUZBVUxUX01BWF9TQ0FOX0FHRSAoMTUgKiBIWikKICNkZWZpbmUgREVGQVVMVF9GVFMgMjM0NgpAQCAtMTczNiwxMSArMTY3Nyw2IEBACiAjZGVmaW5lIFJUTExJQl81MkdIWl9NQVhfQ0hBTk5FTCAxNjUKICNkZWZpbmUgUlRMTElCXzUyR0haX0NIQU5ORUxTIChSVExMSUJfNTJHSFpfTUFYX0NIQU5ORUwgLSBcCiAJCQkJICBSVExMSUJfNTJHSFpfTUlOX0NIQU5ORUwgKyAxKQotI2lmbmRlZiBlcU1hY0FkZHIKLSNkZWZpbmUgZXFNYWNBZGRyKGEsIGIpCQkJCQlcCi0JKCgoYSlbMF0gPT0gKGIpWzBdICYmIChhKVsxXSA9PSAoYilbMV0gJiYgKGEpWzJdID09IChiKVsyXSAmJglcCi0JKGEpWzNdID09IChiKVszXSAmJiAoYSlbNF0gPT0gKGIpWzRdICYmIChhKVs1XSA9PSAoYilbNV0pID8gMSA6IDApCi0jZW5kaWYKIHN0cnVjdCB0eF9wZW5kaW5nIHsKIAlpbnQgZnJhZzsKIAlzdHJ1Y3QgcnRsbGliX3R4YiAqdHhiOwpAQCAtMjE0OSwxNCArMjA4NSwxNiBAQAogCXNwaW5sb2NrX3Qgd3BheF9zdWl0bGlzdF9sb2NrOwogCiAJaW50IHR4X2hlYWRyb29tOyAvKiBTZXQgdG8gc2l6ZSBvZiBhbnkgYWRkaXRpb25hbCByb29tIG5lZWRlZCBhdCBmcm9udAotCQkJICAqIG9mIGFsbG9jYXRlZCBUeCBTS0JzICovCisJCQkgICogb2YgYWxsb2NhdGVkIFR4IFNLQnMKKwkJCSAgKi8KIAl1MzIgY29uZmlnOwogCiAJLyogV0VQIGFuZCBvdGhlciBlbmNyeXB0aW9uIHJlbGF0ZWQgc2V0dGluZ3MgYXQgdGhlIGRldmljZSBsZXZlbCAqLwogCWludCBvcGVuX3dlcDsgLyogU2V0IHRvIDEgdG8gYWxsb3cgdW5lbmNyeXB0ZWQgZnJhbWVzICovCiAJaW50IGF1dGhfbW9kZTsKIAlpbnQgcmVzZXRfb25fa2V5Y2hhbmdlOyAvKiBTZXQgdG8gMSBpZiB0aGUgSFcgbmVlZHMgdG8gYmUgcmVzZXQgb24KLQkJCQkgKiBXRVAga2V5IGNoYW5nZXMgKi8KKwkJCQkgKiBXRVAga2V5IGNoYW5nZXMKKwkJCQkgKi8KIAogCS8qIElmIHRoZSBob3N0IHBlcmZvcm1zIHtlbixkZX1jcnlwdGlvbiwgdGhlbiBzZXQgdG8gMSAqLwogCWludCBob3N0X2VuY3J5cHQ7CkBAIC0yMjc2LDcgKzIyMTQsNyBAQAogCXNob3J0IHJhd190eDsKIAkvKiB1c2VkIGlmIElFRUVfU09GVE1BQ19UWF9RVUVVRSBpcyBzZXQgKi8KIAlzaG9ydCBxdWV1ZV9zdG9wOwotCXNob3J0IHNjYW5uaW5nX2NvbnRpbnVlIDsKKwlzaG9ydCBzY2FubmluZ19jb250aW51ZTsKIAlzaG9ydCBwcm90b19zdGFydGVkOwogCXNob3J0IHByb3RvX3N0b3BwcGluZzsKIApAQCAtMjQyNiw3ICsyMzY0LDcgQEAKIAkvKiBPSyB0aGlzIGlzIGNvbXBsZW1lbnRpbmcgdG8gZGF0YV9wb2xsX2hhcmRfc3RvcCAqLwogCXZvaWQgKCpkYXRhX2hhcmRfcmVzdW1lKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAotCS8qIGFzayB0byB0aGUgZHJpdmVyIHRvIHJldHVuZSB0aGUgcmFkaW8gLgorCS8qIGFzayB0byB0aGUgZHJpdmVyIHRvIHJldHVuZSB0aGUgcmFkaW8uCiAJICogVGhpcyBmdW5jdGlvbiBjYW4gc2xlZXAuIHRoZSBkcml2ZXIgc2hvdWxkIGVuc3VyZQogCSAqIHRoZSByYWRpbyBoYXMgYmVlbiBzd2l0Y2hlZCBiZWZvcmUgcmV0dXJuLgogCSAqLwpAQCAtMjUyMCw3ICsyNDU4LDggQEAKIAl2b2lkICgqcnRsbGliX3Jma2lsbF9wb2xsKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogCS8qIFRoaXMgbXVzdCBiZSB0aGUgbGFzdCBpdGVtIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZSBkYXRhCi0JICogYWxsb2NhdGVkIGJleW9uZCB0aGlzIHN0cnVjdHVyZSBieSBhbGxvY19ydGxsaWIgKi8KKwkgKiBhbGxvY2F0ZWQgYmV5b25kIHRoaXMgc3RydWN0dXJlIGJ5IGFsbG9jX3J0bGxpYgorCSAqLwogCXU4IHByaXZbMF07CiB9OwogCkBAIC0yNTQ5LDcgKzI0ODgsOCBAQAogCiAvKiBUaGUgaWVlZTgwMi4xMSBzdGFjayB3aWxsIG1hbmFnZSB0aGUgbmV0aWYgcXVldWUKICAqIHdha2Uvc3RvcCBmb3IgdGhlIGRyaXZlciwgdGFraW5nIGNhcmUgb2YgODAyLjExCi0gKiBmcmFnbWVudGF0aW9uLiBTZWUgc29mdG1hYy5jIGZvciBkZXRhaWxzLiAqLworICogZnJhZ21lbnRhdGlvbi4gU2VlIHNvZnRtYWMuYyBmb3IgZGV0YWlscy4KKyAqLwogI2RlZmluZSBJRUVFX1NPRlRNQUNfVFhfUVVFVUUgKDE8PDcpCiAKIC8qIFVzZXMgb25seSB0aGUgc29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdApAQCAtMjU4NiwxMSArMjUyNiw5IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHJ0bGxpYl9pc192YWxpZF9tb2RlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBpbnQgbW9kZSkKIHsKLQkvKgotCSAqIEl0IGlzIHBvc3NpYmxlIGZvciBib3RoIGFjY2VzcyBwb2ludHMgYW5kIG91ciBkZXZpY2UgdG8gc3VwcG9ydAorCS8qIEl0IGlzIHBvc3NpYmxlIGZvciBib3RoIGFjY2VzcyBwb2ludHMgYW5kIG91ciBkZXZpY2UgdG8gc3VwcG9ydAogCSAqIGNvbWJpbmF0aW9ucyBvZiBtb2Rlcywgc28gYXMgbG9uZyBhcyB0aGVyZSBpcyBvbmUgdmFsaWQgY29tYmluYXRpb24KIAkgKiBvZiBhcC9kZXZpY2Ugc3VwcG9ydGVkIG1vZGVzLCB0aGVuIHJldHVybiBzdWNjZXNzCi0JICoKIAkgKi8KIAlpZiAoKG1vZGUgJiBJRUVFX0EpICYmCiAJICAgIChpZWVlLT5tb2R1bGF0aW9uICYgUlRMTElCX09GRE1fTU9EVUxBVElPTikgJiYKQEAgLTI4ODIsOCArMjgyMCw2IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKTsKICNkZWZpbmUgTUFYX1JFQ0VJVkVfQlVGRkVSX1NJWkUgOTEwMAotZXh0ZXJuIHZvaWQgSFREZWJ1Z0hUQ2FwYWJpbGl0eSh1OCAqQ2FwSUUsIHU4ICpUaXRsZVN0cmluZyk7Ci1leHRlcm4gdm9pZCBIVERlYnVnSFRJbmZvKHU4ICpJbmZvSUUsIHU4ICpUaXRsZVN0cmluZyk7CiAKIHZvaWQgSFRTZXRDb25uZWN0QndNb2RlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLAogCQkJZW51bSBodF9jaGFubmVsX3dpZHRoIEJhbmR3aWR0aCwKQEAgLTI5MDYsMTEgKzI4NDIsMTAgQEAKIGV4dGVybiB1OCBIVEdldEhpZ2hlc3RNQ1NSYXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCAqcE1DU1JhdGVTZXQsCiAJCQkgICAgICB1OCAqcE1DU0ZpbHRlcik7CiBleHRlcm4gdTggTUNTX0ZJTFRFUl9BTExbXTsKLWV4dGVybiB1MTYgTUNTX0RBVEFfUkFURVsyXVsyXVs3N10gOworZXh0ZXJuIHUxNiBNQ1NfREFUQV9SQVRFWzJdWzJdWzc3XTsKIGV4dGVybiB1OCBIVENDaGVjayhzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggKnBGcmFtZSk7CiBleHRlcm4gdm9pZCBIVFJlc2V0SU9UU2V0dGluZyhzdHJ1Y3QgcnRfaGlfdGhyb3VnaHB1dCAqcEhUSW5mbyk7CiBleHRlcm4gYm9vbCBJc0hUSGFsZk5tb2RlQVBzKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlKTsKLWV4dGVybiB1MTYgSFRIYWxmTWNzVG9EYXRhUmF0ZShzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgdTggbk1jc1JhdGUpOwogZXh0ZXJuIHUxNiBIVE1jc1RvRGF0YVJhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHU4IG5NY3NSYXRlKTsKIGV4dGVybiB1MTYgIFR4Q291bnRUb0RhdGFSYXRlKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCB1OCBuRGF0YVJhdGUpOwogZXh0ZXJuIGludCBydGxsaWJfcnhfQUREQkFSZXEoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdC5jCmluZGV4IDYwYzBjZWQuLjFlNmFlOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0LmMKQEAgLTYyLDggKzYyLDkgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZShpbmZvLT5sb2NrLCBmbGFncyk7CiAJcnRsbGliX2NyeXB0X2RlaW5pdF9lbnRyaWVzKGluZm8sIDApOwogCWlmICghbGlzdF9lbXB0eSgmaW5mby0+Y3J5cHRfZGVpbml0X2xpc3QpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50cmllcyByZW1haW5pbmcgaW4gZGVsYXllZCBjcnlwdCAiCi0JCSAgICAgICAiZGVsZXRpb24gbGlzdFxuIiwgaW5mby0+bmFtZSk7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiJXM6IGVudHJpZXMgcmVtYWluaW5nIGluIGRlbGF5ZWQgY3J5cHQgZGVsZXRpb24gbGlzdFxuIiwKKwkJICAgICAgIGluZm8tPm5hbWUpOwogCQlpbmZvLT5jcnlwdF9kZWluaXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKIAkJYWRkX3RpbWVyKCZpbmZvLT5jcnlwdF9kZWluaXRfdGltZXIpOwogCX0KQEAgLTg2LDcgKzg3LDggQEAKIAogCS8qIG11c3Qgbm90IHJ1biBvcHMtPmRlaW5pdCgpIHdoaWxlIHRoZXJlIG1heSBiZSBwZW5kaW5nIGVuY3J5cHQgb3IKIAkgKiBkZWNyeXB0IG9wZXJhdGlvbnMuIFVzZSBhIGxpc3Qgb2YgZGVsYXllZCBkZWluaXRzIHRvIGF2b2lkIG5lZWRpbmcKLQkgKiBsb2NraW5nLiAqLworCSAqIGxvY2tpbmcuCisJICovCiAKIAlzcGluX2xvY2tfaXJxc2F2ZShpbmZvLT5sb2NrLCBmbGFncyk7CiAJbGlzdF9hZGQoJnRtcC0+bGlzdCwgJmluZm8tPmNyeXB0X2RlaW5pdF9saXN0KTsKQEAgLTE0NSw4ICsxNDcsOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOwogCiAJaWYgKGRlbF9hbGcpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bGxpYl9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAiCi0JCSAgICAgICAiJyVzJ1xuIiwgb3BzLT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bGxpYl9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAnJXMnXG4iLAorCQkgICAgICAgb3BzLT5uYW1lKTsKIAkJa2ZyZWUoZGVsX2FsZyk7CiAJfQogCkBAIC0yMzcsOCArMjM5LDkgQEAKIAkJc3RydWN0IHJ0bGxpYl9jcnlwdG9fYWxnICphbGcgPQogCQkJKHN0cnVjdCBydGxsaWJfY3J5cHRvX2FsZyAqKSBwdHI7CiAJCWxpc3RfZGVsKHB0cik7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWJfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gIgotCQkgICAgICAgIiclcycgKGRlaW5pdClcbiIsIGFsZy0+b3BzLT5uYW1lKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJydGxsaWJfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gJyVzJyAoZGVpbml0KVxuIiwKKwkJICAgICAgIGFsZy0+b3BzLT5uYW1lKTsKIAkJa2ZyZWUoYWxnKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHQuaAppbmRleCBlMTc3YzkyLi5iOGNmNTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdC5oCkBAIC0xNyw4ICsxNyw3IEBACiAgKiBtb3JlIGRldGFpbHMuCiAgKi8KIAotLyoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgdG8gdGhlIHJ0bGxpYiBjcnlwdG8gbW9kdWxlLgorLyogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSB0byB0aGUgcnRsbGliIGNyeXB0byBtb2R1bGUuCiAgKi8KICNpZm5kZWYgUlRMTElCX0NSWVBUX0gKICNkZWZpbmUgUlRMTElCX0NSWVBUX0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHRfY2NtcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF9jY21wLmMKaW5kZXggMDFmODVkYi4uN2Q0ODZlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF9jY21wLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF9jY21wLmMKQEAgLTY5LDggKzY5LDcgQEAKIAogCXByaXYtPnRmbSA9ICh2b2lkICopY3J5cHRvX2FsbG9jX2NpcGhlcigiYWVzIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihwcml2LT50Zm0pKSB7Ci0JCXByX2RlYnVnKCJydGxsaWJfY3J5cHRfY2NtcDogY291bGQgbm90IGFsbG9jYXRlICIKLQkJICAgICAgICJjcnlwdG8gQVBJIGFlc1xuIik7CisJCXByX2RlYnVnKCJydGxsaWJfY3J5cHRfY2NtcDogY291bGQgbm90IGFsbG9jYXRlIGNyeXB0byBBUEkgYWVzXG4iKTsKIAkJcHJpdi0+dGZtID0gTlVMTDsKIAkJZ290byBmYWlsOwogCX0KQEAgLTEyMSwxMCArMTIwLDcgQEAKIAlmYyA9IGxlMTZfdG9fY3B1KGhkci0+ZnJhbWVfY3RsKTsKIAlhNF9pbmNsdWRlZCA9ICgoZmMgJiAoUlRMTElCX0ZDVExfVE9EUyB8IFJUTExJQl9GQ1RMX0ZST01EUykpID09CiAJCSAgICAgICAoUlRMTElCX0ZDVExfVE9EUyB8IFJUTExJQl9GQ1RMX0ZST01EUykpOwotCS8qCi0JcWNfaW5jbHVkZWQgPSAoKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IFJUTExJQl9GVFlQRV9EQVRBKSAmJgotCQkgICAgICAgKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAmIDB4MDgpKTsKLQkqLworCiAJcWNfaW5jbHVkZWQgPSAoKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IFJUTExJQl9GVFlQRV9EQVRBKSAmJgogCQkgICAgICAgKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAmIDB4ODApKTsKIAlhYWRfbGVuID0gMjI7CkBAIC0xNDEsNyArMTM3LDggQEAKIAkgKiBGbGFnIChJbmNsdWRlIGF1dGhlbnRpY2F0aW9uIGhlYWRlciwgTT0zICg4LW9jdGV0IE1JQyksCiAJICogICAgICAgTD0xICgyLW9jdGV0IERsZW4pKQogCSAqIE5vbmNlOiAweDAwIHwgQTIgfCBQTgotCSAqIERsZW4gKi8KKwkgKiBEbGVuCisJICovCiAJYjBbMF0gPSAweDU5OwogCWIwWzFdID0gcWM7CiAJbWVtY3B5KGIwICsgMiwgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOwpAQCAtMjc4LDIzICsyNzUsMjIgQEAKIAlrZXlpZHggPSBwb3NbM107CiAJaWYgKCEoa2V5aWR4ICYgKDEgPDwgNSkpKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCXByX2RlYnVnKCJDQ01QOiByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBFeHRJViIKLQkJCSAgICAgICAiIGZsYWcgZnJvbSAlcE1cbiIsIGhkci0+YWRkcjIpOworCQkJcHJfZGVidWcoIkNDTVA6IHJlY2VpdmVkIHBhY2tldCB3aXRob3V0IEV4dElWIGZsYWcgZnJvbSAlcE1cbiIsCisJCQkJIGhkci0+YWRkcjIpOwogCQl9CiAJCWtleS0+ZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzKys7CiAJCXJldHVybiAtMjsKIAl9CiAJa2V5aWR4ID4+PSA2OwogCWlmIChrZXktPmtleV9pZHggIT0ga2V5aWR4KSB7Ci0JCXByX2RlYnVnKCJDQ01QOiBSWCB0a2V5LT5rZXlfaWR4PSVkIGZyYW1lICIKLQkJICAgICAgICJrZXlpZHg9JWQgcHJpdj0lcFxuIiwga2V5LT5rZXlfaWR4LCBrZXlpZHgsIHByaXYpOworCQlwcl9kZWJ1ZygiQ0NNUDogUlggdGtleS0+a2V5X2lkeD0lZCBmcmFtZSBrZXlpZHg9JWQgcHJpdj0lcFxuIiwKKwkJCSBrZXktPmtleV9pZHgsIGtleWlkeCwgcHJpdik7CiAJCXJldHVybiAtNjsKIAl9CiAJaWYgKCFrZXktPmtleV9zZXQpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewotCQkJcHJfZGVidWcoIkNDTVA6IHJlY2VpdmVkIHBhY2tldCBmcm9tICVwTSIKLQkJCSAgICAgICAiIHdpdGgga2V5aWQ9JWQgdGhhdCBkb2VzIG5vdCBoYXZlIGEgY29uZmlndXJlZCIKLQkJCSAgICAgICAiIGtleVxuIiwgaGRyLT5hZGRyMiwga2V5aWR4KTsKKwkJCXByX2RlYnVnKCJDQ01QOiByZWNlaXZlZCBwYWNrZXQgZnJvbSAlcE0gd2l0aCBrZXlpZD0lZCB0aGF0IGRvZXMgbm90IGhhdmUgYSBjb25maWd1cmVkIGtleVxuIiwKKwkJCQkgaGRyLT5hZGRyMiwga2V5aWR4KTsKIAkJfQogCQlyZXR1cm4gLTM7CiAJfQpAQCAtMzQxLDggKzMzNyw4IEBACiAKIAkJaWYgKG1lbWNtcChtaWMsIGEsIENDTVBfTUlDX0xFTikgIT0gMCkgewogCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewotCQkJCXByX2RlYnVnKCJDQ01QOiBkZWNyeXB0IGZhaWxlZDogU1RBPSIKLQkJCQkiICVwTVxuIiwgaGRyLT5hZGRyMik7CisJCQkJcHJfZGVidWcoIkNDTVA6IGRlY3J5cHQgZmFpbGVkOiBTVEE9ICVwTVxuIiwKKwkJCQkJIGhkci0+YWRkcjIpOwogCQkJfQogCQkJa2V5LT5kb3QxMVJTTkFTdGF0c0NDTVBEZWNyeXB0RXJyb3JzKys7CiAJCQlyZXR1cm4gLTU7CkBAIC00MTksOSArNDE1LDcgQEAKIAlzdHJ1Y3QgcnRsbGliX2NjbXBfZGF0YSAqY2NtcCA9IHByaXY7CiAKIAlzZXFfcHJpbnRmKG0sCi0JCSAgICJrZXlbJWRdIGFsZz1DQ01QIGtleV9zZXQ9JWQgIgotCQkgICAidHhfcG49JXBNIHJ4X3BuPSVwTSAiCi0JCSAgICJmb3JtYXRfZXJyb3JzPSVkIHJlcGxheXM9JWQgZGVjcnlwdF9lcnJvcnM9JWRcbiIsCisJCSAgICJrZXlbJWRdIGFsZz1DQ01QIGtleV9zZXQ9JWQgdHhfcG49JXBNIHJ4X3BuPSVwTSBmb3JtYXRfZXJyb3JzPSVkIHJlcGxheXM9JWQgZGVjcnlwdF9lcnJvcnM9JWRcbiIsCiAJCSAgIGNjbXAtPmtleV9pZHgsIGNjbXAtPmtleV9zZXQsCiAJCSAgIGNjbXAtPnR4X3BuLCBjY21wLT5yeF9wbiwKIAkJICAgY2NtcC0+ZG90MTFSU05BU3RhdHNDQ01QRm9ybWF0RXJyb3JzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF90a2lwLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0X3RraXAuYwppbmRleCA3OGRiMmI2Li42NTZiNGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0X3RraXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0X3RraXAuYwpAQCAtNjYsOCArNjYsOCBAQAogCXByaXYtPnR4X3RmbV9hcmM0ID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwKIAkJCUNSWVBUT19BTEdfQVNZTkMpOwogCWlmIChJU19FUlIocHJpdi0+dHhfdGZtX2FyYzQpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJydGxsaWJfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlICIKLQkJCQkiY3J5cHRvIEFQSSBhcmM0XG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJydGxsaWJfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlIGNyeXB0byBBUEkgYXJjNFxuIik7CiAJCXByaXYtPnR4X3RmbV9hcmM0ID0gTlVMTDsKIAkJZ290byBmYWlsOwogCX0KQEAgLTc1LDggKzc1LDggQEAKIAlwcml2LT50eF90Zm1fbWljaGFlbCA9IGNyeXB0b19hbGxvY19oYXNoKCJtaWNoYWVsX21pYyIsIDAsCiAJCQlDUllQVE9fQUxHX0FTWU5DKTsKIAlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbV9taWNoYWVsKSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAicnRsbGliX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCi0JCQkJImNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOworCQlwcmludGsoS0VSTl9ERUJVRworCQkgICAgICAgInJ0bGxpYl9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgY3J5cHRvIEFQSSBtaWNoYWVsX21pY1xuIik7CiAJCXByaXYtPnR4X3RmbV9taWNoYWVsID0gTlVMTDsKIAkJZ290byBmYWlsOwogCX0KQEAgLTg0LDggKzg0LDggQEAKIAlwcml2LT5yeF90Zm1fYXJjNCA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsCiAJCQlDUllQVE9fQUxHX0FTWU5DKTsKIAlpZiAoSVNfRVJSKHByaXYtPnJ4X3RmbV9hcmM0KSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAicnRsbGliX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCi0JCQkJImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAicnRsbGliX2NyeXB0X3RraXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSBjcnlwdG8gQVBJIGFyYzRcbiIpOwogCQlwcml2LT5yeF90Zm1fYXJjNCA9IE5VTEw7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC05Myw4ICs5Myw4IEBACiAJcHJpdi0+cnhfdGZtX21pY2hhZWwgPSBjcnlwdG9fYWxsb2NfaGFzaCgibWljaGFlbF9taWMiLCAwLAogCQkJQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihwcml2LT5yeF90Zm1fbWljaGFlbCkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgInJ0bGxpYl9jcnlwdF90a2lwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgotCQkJCSJjcnlwdG8gQVBJIG1pY2hhZWxfbWljXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJydGxsaWJfY3J5cHRfdGtpcDogY291bGQgbm90IGFsbG9jYXRlIGNyeXB0byBBUEkgbWljaGFlbF9taWNcbiIpOwogCQlwcml2LT5yeF90Zm1fbWljaGFlbCA9IE5VTEw7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC0yNDksNyArMjQ5LDggQEAKIAkJCSAgICAgICB1MTYgSVYxNikKIHsKIAkvKiBNYWtlIHRlbXBvcmFyeSBhcmVhIG92ZXJsYXAgV0VQIHNlZWQgc28gdGhhdCB0aGUgZmluYWwgY29weSBjYW4gYmUKLQkgKiBhdm9pZGVkIG9uIGxpdHRsZSBlbmRpYW4gaG9zdHMuICovCisJICogYXZvaWRlZCBvbiBsaXR0bGUgZW5kaWFuIGhvc3RzLgorCSAqLwogCXUxNiAqUFBLID0gKHUxNiAqKSAmV0VQU2VlZFs0XTsKIAogCS8qIFN0ZXAgMSAtIG1ha2UgY29weSBvZiBUVEFLIGFuZCBicmluZyBpbiBUU0MgKi8KQEAgLTI3Niw3ICsyNzcsOCBAQAogCVBQS1s1XSArPSBSb3RSMShQUEtbNF0pOwogCiAJLyogU3RlcCAzIC0gYnJpbmcgaW4gbGFzdCBvZiBUSyBiaXRzLCBhc3NpZ24gMjQtYml0IFdFUCBJViB2YWx1ZQotCSAqIFdFUFNlZWRbMC4uMl0gaXMgdHJhbnNtaXR0ZWQgYXMgV0VQIElWICovCisJICogV0VQU2VlZFswLi4yXSBpcyB0cmFuc21pdHRlZCBhcyBXRVAgSVYKKwkgKi8KIAlXRVBTZWVkWzBdID0gSGk4KElWMTYpOwogCVdFUFNlZWRbMV0gPSAoSGk4KElWMTYpIHwgMHgyMCkgJiAweDdGOwogCVdFUFNlZWRbMl0gPSBMbzgoSVYxNik7CkBAIC0zOTksMjIgKzQwMSwyNCBAQAogCWtleWlkeCA9IHBvc1szXTsKIAlpZiAoIShrZXlpZHggJiAoMSA8PCA1KSkpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlRLSVA6IHJlY2VpdmVkIHBhY2tldCB3aXRob3V0IEV4dElWIgotCQkJICAgICAgICIgZmxhZyBmcm9tICVwTVxuIiwgaGRyLT5hZGRyMik7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICJUS0lQOiByZWNlaXZlZCBwYWNrZXQgd2l0aG91dCBFeHRJViBmbGFnIGZyb20gJXBNXG4iLAorCQkJICAgICAgIGhkci0+YWRkcjIpOwogCQl9CiAJCXJldHVybiAtMjsKIAl9CiAJa2V5aWR4ID4+PSA2OwogCWlmICh0a2V5LT5rZXlfaWR4ICE9IGtleWlkeCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogUlggdGtleS0+a2V5X2lkeD0lZCBmcmFtZSAiCi0JCSAgICAgICAia2V5aWR4PSVkIHByaXY9JXBcbiIsIHRrZXktPmtleV9pZHgsIGtleWlkeCwgcHJpdik7CisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiVEtJUDogUlggdGtleS0+a2V5X2lkeD0lZCBmcmFtZSBrZXlpZHg9JWQgcHJpdj0lcFxuIiwKKwkJICAgICAgIHRrZXktPmtleV9pZHgsIGtleWlkeCwgcHJpdik7CiAJCXJldHVybiAtNjsKIAl9CiAJaWYgKCF0a2V5LT5rZXlfc2V0KSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCXByaW50ayhLRVJOX0RFQlVHICJUS0lQOiByZWNlaXZlZCBwYWNrZXQgZnJvbSAlcE0iCi0JCQkgICAgICAgIiB3aXRoIGtleWlkPSVkIHRoYXQgZG9lcyBub3QgaGF2ZSBhIGNvbmZpZ3VyZWQiCi0JCQkgICAgICAgIiBrZXlcbiIsIGhkci0+YWRkcjIsIGtleWlkeCk7CisJCQlwcmludGsoS0VSTl9ERUJVRworCQkJICAgICAgICJUS0lQOiByZWNlaXZlZCBwYWNrZXQgZnJvbSAlcE0gd2l0aCBrZXlpZD0lZCB0aGF0IGRvZXMgbm90IGhhdmUgYSBjb25maWd1cmVkIGtleVxuIiwKKwkJCSAgICAgICBoZHItPmFkZHIyLCBrZXlpZHgpOwogCQl9CiAJCXJldHVybiAtMzsKIAl9CkBAIC00MjcsMTAgKzQzMSwxMCBAQAogCQkgICAgKGl2MzIgPT0gdGtleS0+cnhfaXYzMiAmJiBpdjE2IDw9IHRrZXktPnJ4X2l2MTYpKSAmJgogCQkgICAgdGtleS0+aW5pdGlhbGl6ZWQpIHsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogcmVwbGF5IGRldGVjdGVkOiBTVEE9IgotCQkJCSAgICAgICAiICVwTSBwcmV2aW91cyBUU0MgJTA4eCUwNHggcmVjZWl2ZWQgIgotCQkJCSAgICAgICJUU0MgJTA4eCUwNHhcbiIsIGhkci0+YWRkcjIsCi0JCQkJICAgICAgdGtleS0+cnhfaXYzMiwgdGtleS0+cnhfaXYxNiwgaXYzMiwgaXYxNik7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcKKwkJCQkgICAgICAgIlRLSVA6IHJlcGxheSBkZXRlY3RlZDogU1RBPSAlcE0gcHJldmlvdXMgVFNDICUwOHglMDR4IHJlY2VpdmVkIFRTQyAlMDh4JTA0eFxuIiwKKwkJCQkgICAgICAgaGRyLT5hZGRyMiwgdGtleS0+cnhfaXYzMiwgdGtleS0+cnhfaXYxNiwKKwkJCQkgICAgICAgaXYzMiwgaXYxNik7CiAJCQl9CiAJCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBSZXBsYXlzKys7CiAJCQlyZXR1cm4gLTQ7CkBAIC00NTEsOCArNDU1LDggQEAKIAkJY3J5cHRvX2Jsa2NpcGhlcl9zZXRrZXkodGtleS0+cnhfdGZtX2FyYzQsIHJjNGtleSwgMTYpOwogCQlpZiAoY3J5cHRvX2Jsa2NpcGhlcl9kZWNyeXB0KCZkZXNjLCAmc2csICZzZywgcGxlbiArIDQpKSB7CiAJCQlpZiAobmV0X3JhdGVsaW1pdCgpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIjogVEtJUDogZmFpbGVkIHRvIGRlY3J5cHQgIgotCQkJCSAgICAgICAicmVjZWl2ZWQgcGFja2V0IGZyb20gJXBNXG4iLAorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICI6IFRLSVA6IGZhaWxlZCB0byBkZWNyeXB0IHJlY2VpdmVkIHBhY2tldCBmcm9tICVwTVxuIiwKIAkJCQkgICAgICAgaGRyLT5hZGRyMik7CiAJCQl9CiAJCQlyZXR1cm4gLTc7CkBAIC00NjgsMTIgKzQ3MiwxNCBAQAogCQkJaWYgKGl2MzIgIT0gdGtleS0+cnhfaXYzMikgewogCQkJCS8qIFByZXZpb3VzbHkgY2FjaGVkIFBoYXNlMSByZXN1bHQgd2FzIGFscmVhZHkKIAkJCQkgKiBsb3N0LCBzbyBpdCBuZWVkcyB0byBiZSByZWNhbGN1bGF0ZWQgZm9yIHRoZQotCQkJCSAqIG5leHQgcGFja2V0LiAqLworCQkJCSAqIG5leHQgcGFja2V0LgorCQkJCSAqLwogCQkJCXRrZXktPnJ4X3BoYXNlMV9kb25lID0gMDsKIAkJCX0KIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpIHsKLQkJCQlwcmludGsoS0VSTl9ERUJVRyAiVEtJUDogSUNWIGVycm9yIGRldGVjdGVkOiBTVEE9IgotCQkJCSIgJXBNXG4iLCBoZHItPmFkZHIyKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiVEtJUDogSUNWIGVycm9yIGRldGVjdGVkOiBTVEE9ICVwTVxuIiwKKwkJCQkgICAgICAgaGRyLT5hZGRyMik7CiAJCQl9CiAJCQl0a2V5LT5kb3QxMVJTTkFTdGF0c1RLSVBJQ1ZFcnJvcnMrKzsKIAkJCXJldHVybiAtNTsKQEAgLTQ4Miw3ICs0ODgsOCBAQAogCX0KIAogCS8qIFVwZGF0ZSByZWFsIGNvdW50ZXJzIG9ubHkgYWZ0ZXIgTWljaGFlbCBNSUMgdmVyaWZpY2F0aW9uIGhhcwotCSAqIGNvbXBsZXRlZCAqLworCSAqIGNvbXBsZXRlZAorCSAqLwogCXRrZXktPnJ4X2l2MzJfbmV3ID0gaXYzMjsKIAl0a2V5LT5yeF9pdjE2X25ldyA9IGl2MTY7CiAKQEAgLTUwMiw3ICs1MDksNyBAQAogCXN0cnVjdCBzY2F0dGVybGlzdCBzZ1syXTsKIAogCWlmICh0Zm1fbWljaGFlbCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pY2hhZWxfbWljOiB0Zm1fbWljaGFlbCA9PSBOVUxMXG4iKTsKKwkJcHJfd2FybigibWljaGFlbF9taWM6IHRmbV9taWNoYWVsID09IE5VTExcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCXNnX2luaXRfdGFibGUoc2csIDIpOwpAQCAtNTU3LDggKzU2NCw4IEBACiAJaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKIAogCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IDggfHwgc2tiLT5sZW4gPCBoZHJfbGVuKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJJbnZhbGlkIHBhY2tldCBmb3IgTWljaGFlbCBNSUMgYWRkICIKLQkJICAgICAgICIodGFpbHJvb209JWQgaGRyX2xlbj0lZCBza2ItPmxlbj0lZClcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHCisJCSAgICAgICAiSW52YWxpZCBwYWNrZXQgZm9yIE1pY2hhZWwgTUlDIGFkZCAodGFpbHJvb209JWQgaGRyX2xlbj0lZCBza2ItPmxlbj0lZClcbiIsCiAJCSAgICAgICBza2JfdGFpbHJvb20oc2tiKSwgaGRyX2xlbiwgc2tiLT5sZW4pOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNjIxLDE0ICs2MjgsMTQgQEAKIAkJc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKmhkcjsKIAogCQloZHIgPSAoc3RydWN0IHJ0bGxpYl9oZHJfNGFkZHIgKikgc2tiLT5kYXRhOwotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE1pY2hhZWwgTUlDIHZlcmlmaWNhdGlvbiBmYWlsZWQgZm9yICIKLQkJICAgICAgICJNU0RVIGZyb20gJXBNIGtleWlkeD0lZFxuIiwKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICIlczogTWljaGFlbCBNSUMgdmVyaWZpY2F0aW9uIGZhaWxlZCBmb3IgTVNEVSBmcm9tICVwTSBrZXlpZHg9JWRcbiIsCiAJCSAgICAgICBza2ItPmRldiA/IHNrYi0+ZGV2LT5uYW1lIDogIk4vQSIsIGhkci0+YWRkcjIsCiAJCSAgICAgICBrZXlpZHgpOwogCQlwcmludGsoS0VSTl9ERUJVRyAiJWRcbiIsCiAJCSAgICAgICBtZW1jbXAobWljLCBza2ItPmRhdGEgKyBza2ItPmxlbiAtIDgsIDgpICE9IDApOwogCQlpZiAoc2tiLT5kZXYpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gInNrYi0+ZGV2ICE9IE5VTExcbiIpOworCQkJcHJfaW5mbygic2tiLT5kZXYgIT0gTlVMTFxuIik7CiAJCQlydGxsaWJfbWljaGFlbF9taWNfZmFpbHVyZShza2ItPmRldiwgaGRyLCBrZXlpZHgpOwogCQl9CiAJCXRrZXktPmRvdDExUlNOQVN0YXRzVEtJUExvY2FsTUlDRmFpbHVyZXMrKzsKQEAgLTYzNiw3ICs2NDMsOCBAQAogCX0KIAogCS8qIFVwZGF0ZSBUU0MgY291bnRlcnMgZm9yIFJYIG5vdyB0aGF0IHRoZSBwYWNrZXQgdmVyaWZpY2F0aW9uIGhhcwotCSAqIGNvbXBsZXRlZC4gKi8KKwkgKiBjb21wbGV0ZWQuCisJICovCiAJdGtleS0+cnhfaXYzMiA9IHRrZXktPnJ4X2l2MzJfbmV3OwogCXRrZXktPnJ4X2l2MTYgPSB0a2V5LT5yeF9pdjE2X25ldzsKIApAQCAtNzE3LDEwICs3MjUsNyBAQAogCXN0cnVjdCBydGxsaWJfdGtpcF9kYXRhICp0a2lwID0gcHJpdjsKIAogCXNlcV9wcmludGYobSwKLQkJICAgImtleVslZF0gYWxnPVRLSVAga2V5X3NldD0lZCAiCi0JCSAgICJ0eF9wbj0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgotCQkgICAicnhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKLQkJICAgInJlcGxheXM9JWQgaWN2X2Vycm9ycz0lZCBsb2NhbF9taWNfZmFpbHVyZXM9JWRcbiIsCisJCSAgICJrZXlbJWRdIGFsZz1US0lQIGtleV9zZXQ9JWQgdHhfcG49JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IHJ4X3BuPSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCByZXBsYXlzPSVkIGljdl9lcnJvcnM9JWQgbG9jYWxfbWljX2ZhaWx1cmVzPSVkXG4iLAogCQkgICB0a2lwLT5rZXlfaWR4LCB0a2lwLT5rZXlfc2V0LAogCQkgICAodGtpcC0+dHhfaXYzMiA+PiAyNCkgJiAweGZmLAogCQkgICAodGtpcC0+dHhfaXYzMiA+PiAxNikgJiAweGZmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfY3J5cHRfd2VwLmMKaW5kZXggNzVlN2IwMi4uMjFkN2VlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9jcnlwdF93ZXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2NyeXB0X3dlcC5jCkBAIC00NCwxNSArNDQsMTMgQEAKIAogCXByaXYtPnR4X3RmbSA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhcmM0KSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOwogCWlmIChJU19FUlIocHJpdi0+dHhfdGZtKSkgewotCQlwcl9kZWJ1ZygicnRsbGliX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKLQkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOworCQlwcl9kZWJ1ZygicnRsbGliX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlIGNyeXB0byBBUEkgYXJjNFxuIik7CiAJCXByaXYtPnR4X3RmbSA9IE5VTEw7CiAJCWdvdG8gZmFpbDsKIAl9CiAJcHJpdi0+cnhfdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihwcml2LT5yeF90Zm0pKSB7Ci0JCXByX2RlYnVnKCJydGxsaWJfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgotCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CisJCXByX2RlYnVnKCJydGxsaWJfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgY3J5cHRvIEFQSSBhcmM0XG4iKTsKIAkJcHJpdi0+cnhfdGZtID0gTlVMTDsKIAkJZ290byBmYWlsOwogCX0KQEAgLTEwOCw5ICsxMDYsOCBAQAogCiAJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgNCB8fCBza2JfdGFpbHJvb20oc2tiKSA8IDQgfHwKIAkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKXsKLQkJcHJpbnRrKEtFUk5fRVJSICJFcnJvciEhISBoZWFkcm9vbT0lZCB0YWlscm9vbT0lZCBza2JsZW49JWQiCi0JCSAgICAgICAiIGhkcl9sZW49JWRcbiIsIHNrYl9oZWFkcm9vbShza2IpLCBza2JfdGFpbHJvb20oc2tiKSwKLQkJICAgICAgIHNrYi0+bGVuLCBoZHJfbGVuKTsKKwkJcHJfZXJyKCJFcnJvciEhISBoZWFkcm9vbT0lZCB0YWlscm9vbT0lZCBza2JsZW49JWQgaGRyX2xlbj0lZFxuIiwKKwkJICAgICAgIHNrYl9oZWFkcm9vbShza2IpLCBza2JfdGFpbHJvb20oc2tiKSwgc2tiLT5sZW4sIGhkcl9sZW4pOwogCQlyZXR1cm4gLTE7CiAJfQogCWxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKQEAgLTEyNCw3ICsxMjEsOCBAQAogCiAJLyogRmx1aHJlciwgTWFudGluLCBhbmQgU2hhbWlyIGhhdmUgcmVwb3J0ZWQgd2Vha25lc3NlcyBpbiB0aGUga2V5CiAJICogc2NoZWR1bGluZyBhbGdvcml0aG0gb2YgUkM0LiBBdCBsZWFzdCBJVnMgKEtleUJ5dGUgKyAzLCAweGZmLCBOKQotCSAqIGNhbiBiZSB1c2VkIHRvIHNwZWVkdXAgYXR0YWNrcywgc28gYXZvaWQgdXNpbmcgdGhlbS4gKi8KKwkgKiBjYW4gYmUgdXNlZCB0byBzcGVlZHVwIGF0dGFja3MsIHNvIGF2b2lkIHVzaW5nIHRoZW0uCisJICovCiAJaWYgKCh3ZXAtPml2ICYgMHhmZjAwKSA9PSAweGZmMDApIHsKIAkJdTggQiA9ICh3ZXAtPml2ID4+IDE2KSAmIDB4ZmY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfZGVidWcuaAppbmRleCA3NTM3ZGFlLi4xMTk3MjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2RlYnVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9kZWJ1Zy5oCkBAIC04MCw5ICs4MCw5IEBACiAjZGVmaW5lIGFzc2VydChleHByKSBcCiBkbyB7CVwKIAlpZiAoIShleHByKSkgewkJCQkgIFwKLQkJcHJpbnRrKEtFUk5fSU5GTyAiQXNzZXJ0aW9uIGZhaWxlZCEgJXMsJXMsJXMsbGluZT0lZFxuIiwgXAorCQlwcl9pbmZvKCJBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLCBcCiAJCSNleHByLCBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fKTsJICBcCiAJfQlcCi19IHdoaWxlICgwKTsKK30gd2hpbGUgKDApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9lbmRpYW5mcmVlLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2VuZGlhbmZyZWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4OWZhNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX2VuZGlhbmZyZWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0jaWZuZGVmIF9fSU5DX0VORElBTkZSRUVfSAotI2RlZmluZSBfX0lOQ19FTkRJQU5GUkVFX0gKLQotLyoKLSAqCUNhbGwgZW5kaWFuIGZyZWUgZnVuY3Rpb24gd2hlbgotICoJCTEuIFJlYWQvd3JpdGUgcGFja2V0IGNvbnRlbnQuCi0gKgkJMi4gQmVmb3JlIHdyaXRlIGludGVnZXIgdG8gSU8uCi0gKgkJMy4gQWZ0ZXIgcmVhZCBpbnRlZ2VyIGZyb20gSU8uCi0gKi8KLQotI2RlZmluZSBfX01BQ0hJTkVfTElUVExFX0VORElBTiAxMjM0ICAgIC8qIExTQiBmaXJzdDogaTM4NiwgdmF4ICovCi0jZGVmaW5lIF9fTUFDSElORV9CSUdfRU5ESUFOICAgIDQzMjEgICAgLyogTVNCIGZpcnN0OiA2ODAwMCwgaWJtLCBuZXQsIHBwYyAqLwotCi0jZGVmaW5lIEJZVEVfT1JERVIgX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KLQotI2lmIEJZVEVfT1JERVIgPT0gX19NQUNISU5FX0xJVFRMRV9FTkRJQU4KLSNkZWZpbmUgRUYxQnl0ZShfdmFsKQkJCSgodTgpKF92YWwpKQotI2RlZmluZSBFRjJCeXRlKF92YWwpCQkJKCh1MTYpKF92YWwpKQotI2RlZmluZSBFRjRCeXRlKF92YWwpCQkJKCh1MzIpKF92YWwpKQotCi0jZWxzZQotI2RlZmluZSBFRjFCeXRlKF92YWwpCQkJKCh1OCkoX3ZhbCkpCi0jZGVmaW5lIEVGMkJ5dGUoX3ZhbCkJCQlcCi0JKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXwoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCi0jZGVmaW5lIEVGNEJ5dGUoX3ZhbCkJCQlcCi0JKCgoKCh1MzIpKF92YWwpKSYweDAwMDAwMGZmKTw8MjQpfFwKLQkoKCgodTMyKShfdmFsKSkmMHgwMDAwZmYwMCk8PDgpfFwKLQkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpfFwKLQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKLSNlbmRpZgotCi0jZGVmaW5lIFJlYWRFRjFCeXRlKF9wdHIpCQlFRjFCeXRlKCooKHU4ICopKF9wdHIpKSkKLSNkZWZpbmUgUmVhZEVGMkJ5dGUoX3B0cikJCUVGMkJ5dGUoKigodTE2ICopKF9wdHIpKSkKLSNkZWZpbmUgUmVhZEVGNEJ5dGUoX3B0cikJCUVGNEJ5dGUoKigodTMyICopKF9wdHIpKSkKLQotI2RlZmluZSBXcml0ZUVGMUJ5dGUoX3B0ciwgX3ZhbCkJKCgqKCh1OCAqKShfcHRyKSkpID0gRUYxQnl0ZShfdmFsKSkKLSNkZWZpbmUgV3JpdGVFRjJCeXRlKF9wdHIsIF92YWwpCSgoKigodTE2ICopKF9wdHIpKSkgPSBFRjJCeXRlKF92YWwpKQotI2RlZmluZSBXcml0ZUVGNEJ5dGUoX3B0ciwgX3ZhbCkJKCgqKCh1MzIgKikoX3B0cikpKSA9IEVGNEJ5dGUoX3ZhbCkpCi0jaWYgQllURV9PUkRFUiA9PSBfX01BQ0hJTkVfTElUVExFX0VORElBTgotI2RlZmluZSBIMk4xQllURShfdmFsKQkoKHU4KShfdmFsKSkKLSNkZWZpbmUgSDJOMkJZVEUoX3ZhbCkJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXxcCi0JCQkoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCi0jZGVmaW5lIEgyTjRCWVRFKF92YWwpCSgoKCgodTMyKShfdmFsKSkmMHgwMDAwMDBmZik8PDI0KXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHgwMDAwZmYwMCk8PDgpCXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpCXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKLSNlbHNlCi0jZGVmaW5lIEgyTjFCWVRFKF92YWwpCQkJKCh1OCkoX3ZhbCkpCi0jZGVmaW5lIEgyTjJCWVRFKF92YWwpCQkJKCh1MTYpKF92YWwpKQotI2RlZmluZSBIMk40QllURShfdmFsKQkJCSgodTMyKShfdmFsKSkKLSNlbmRpZgotCi0jaWYgQllURV9PUkRFUiA9PSBfX01BQ0hJTkVfTElUVExFX0VORElBTgotI2RlZmluZSBOMkgxQllURShfdmFsKQkoKHU4KShfdmFsKSkKLSNkZWZpbmUgTjJIMkJZVEUoX3ZhbCkJKCgoKCh1MTYpKF92YWwpKSYweDAwZmYpPDw4KXxcCi0JCQkoKCgodTE2KShfdmFsKSkmMHhmZjAwKT4+OCkpCi0jZGVmaW5lIE4ySDRCWVRFKF92YWwpCSgoKCgodTMyKShfdmFsKSkmMHgwMDAwMDBmZik8PDI0KXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHgwMDAwZmYwMCk8PDgpCXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHgwMGZmMDAwMCk+PjgpCXxcCi0JCQkoKCgodTMyKShfdmFsKSkmMHhmZjAwMDAwMCk+PjI0KSkKLSNlbHNlCi0jZGVmaW5lIE4ySDFCWVRFKF92YWwpCQkJKCh1OCkoX3ZhbCkpCi0jZGVmaW5lIE4ySDJCWVRFKF92YWwpCQkJKCh1MTYpKF92YWwpKQotI2RlZmluZSBOMkg0QllURShfdmFsKQkJCSgodTMyKShfdmFsKSkKLSNlbmRpZgotCi0jZGVmaW5lIEJJVF9MRU5fTUFTS18zMihfX0JpdExlbikgKDB4RkZGRkZGRkYgPj4gKDMyIC0gKF9fQml0TGVuKSkpCi0jZGVmaW5lIEJJVF9PRkZTRVRfTEVOX01BU0tfMzIoX19CaXRPZmZzZXQsIF9fQml0TGVuKQkJCVwKLQkoQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSA8PCAoX19CaXRPZmZzZXQpKQotCi0jZGVmaW5lIExFX1A0QllURV9UT19IT1NUXzRCWVRFKF9fcFN0YXJ0KSAoRUY0Qnl0ZSgqKCh1MzIgKikoX19wU3RhcnQpKSkpCi0KLSNkZWZpbmUgTEVfQklUU19UT180QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKCBcCi0JICAoTEVfUDRCWVRFX1RPX0hPU1RfNEJZVEUoX19wU3RhcnQpID4+IChfX0JpdE9mZnNldCkpIFwKLQkgICYgXAotCSAgQklUX0xFTl9NQVNLXzMyKF9fQml0TGVuKSBcCi0JKQotCi0jZGVmaW5lIExFX0JJVFNfQ0xFQVJFRF9UT180QllURShfX3BTdGFydCwgX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKCBcCi0JICBMRV9QNEJZVEVfVE9fSE9TVF80QllURShfX3BTdGFydCkgXAotCSAgJiBcCi0JICAofkJJVF9PRkZTRVRfTEVOX01BU0tfMzIoX19CaXRPZmZzZXQsIF9fQml0TGVuKSkgXAotCSkKLQotI2RlZmluZSBCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIFwKLQkoMHhGRkZGID4+ICgxNiAtIChfX0JpdExlbikpKQotCi0jZGVmaW5lIEJJVF9PRkZTRVRfTEVOX01BU0tfMTYoX19CaXRPZmZzZXQsIF9fQml0TGVuKSBcCi0JKEJJVF9MRU5fTUFTS18xNihfX0JpdExlbikgPDwgKF9fQml0T2Zmc2V0KSkKLQotI2RlZmluZSBMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BTdGFydCkgXAotCShFRjJCeXRlKCooKHUxNiAqKShfX3BTdGFydCkpKSkKLQotI2RlZmluZSBMRV9CSVRTX1RPXzJCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkoIFwKLQkgIChMRV9QMkJZVEVfVE9fSE9TVF8yQllURShfX3BTdGFydCkgPj4gKF9fQml0T2Zmc2V0KSkgXAotCSAgJiBcCi0JICBCSVRfTEVOX01BU0tfMTYoX19CaXRMZW4pIFwKLQkpCi0KLSNkZWZpbmUgQklUX0xFTl9NQVNLXzgoX19CaXRMZW4pIFwKLQkoMHhGRiA+PiAoOCAtIChfX0JpdExlbikpKQotCi0jZGVmaW5lIEJJVF9PRkZTRVRfTEVOX01BU0tfOChfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkoQklUX0xFTl9NQVNLXzgoX19CaXRMZW4pIDw8IChfX0JpdE9mZnNldCkpCi0KLSNkZWZpbmUgTEVfUDFCWVRFX1RPX0hPU1RfMUJZVEUoX19wU3RhcnQpIFwKLQkoRUYxQnl0ZSgqKCh1OCAqKShfX3BTdGFydCkpKSkKLQotI2RlZmluZSBMRV9CSVRTX1RPXzFCWVRFKF9fcFN0YXJ0LCBfX0JpdE9mZnNldCwgX19CaXRMZW4pIFwKLQkoIFwKLQkgIChMRV9QMUJZVEVfVE9fSE9TVF8xQllURShfX3BTdGFydCkgPj4gKF9fQml0T2Zmc2V0KSkgXAotCSAgJiBcCi0JICBCSVRfTEVOX01BU0tfOChfX0JpdExlbikgXAotCSkKLQotI2RlZmluZQlOX0JZVEVfQUxJR01FTlQoX19WYWx1ZSwgX19BbGlnbWVudCkJCQlcCi0JICgoX19BbGlnbWVudCA9PSAxKSA/IChfX1ZhbHVlKSA6ICgoKF9fVmFsdWUgKyBfX0FsaWdtZW50IC0gMSkgLyBcCi0JX19BbGlnbWVudCkgKiBfX0FsaWdtZW50KSkKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9tb2R1bGUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfbW9kdWxlLmMKaW5kZXggMGNmMzgwOS4uMzJjYzhkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9tb2R1bGUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX21vZHVsZS5jCkBAIC03MiwxMSArNzIsOCBAQAogCWllZWUtPm5ldHdvcmtzID0ga3phbGxvYygKIAkJTUFYX05FVFdPUktfQ09VTlQgKiBzaXplb2Yoc3RydWN0IHJ0bGxpYl9uZXR3b3JrKSwKIAkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpZWVlLT5uZXR3b3JrcykgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJlYWNvbnNcbiIsCi0JCSAgICAgICBpZWVlLT5kZXYtPm5hbWUpOworCWlmICghaWVlZS0+bmV0d29ya3MpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCXJldHVybiAwOwogfQpAQCAtMTYxLDEwICsxNTgsOSBAQAogCXJ0bGxpYl9zb2Z0bWFjX2luaXQoaWVlZSk7CiAKIAlpZWVlLT5wSFRJbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJ0X2hpX3Rocm91Z2hwdXQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoaWVlZS0+cEhUSW5mbyA9PSBOVUxMKSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiY2FuJ3QgYWxsb2MgbWVtb3J5IGZvciBIVEluZm9cbiIpOworCWlmIChpZWVlLT5wSFRJbmZvID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCX0KKwogCUhUVXBkYXRlRGVmYXVsdFNldHRpbmcoaWVlZSk7CiAJSFRJbml0aWFsaXplSFRJbmZvKGllZWUpOwogCVRTSW5pdGlhbGl6ZShpZWVlKTsKQEAgLTIwNyw3ICsyMDMsOSBAQAogCiBzdGF0aWMgaW50IHNob3dfZGVidWdfbGV2ZWwoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXJldHVybiBzZXFfcHJpbnRmKG0sICIweCUwOFhcbiIsIHJ0bGxpYl9kZWJ1Z19sZXZlbCk7CisJc2VxX3ByaW50ZihtLCAiMHglMDhYXG4iLCBydGxsaWJfZGVidWdfbGV2ZWwpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2RlYnVnX2xldmVsKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9yeC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9yeC5jCmluZGV4IDE2NjQwNDAuLmZlM2U3ZTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9yeC5jCkBAIC0xNDMsNyArMTQzLDggQEAKIAkJbWVtY3B5KGVudHJ5LT5kc3RfYWRkciwgaGRyLT5hZGRyMSwgRVRIX0FMRU4pOwogCX0gZWxzZSB7CiAJCS8qIHJlY2VpdmVkIGEgZnJhZ21lbnQgb2YgYSBmcmFtZSBmb3Igd2hpY2ggdGhlIGhlYWQgZnJhZ21lbnQKLQkJICogc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlY2VpdmVkICovCisJCSAqIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiByZWNlaXZlZAorCQkgKi8KIAkJZW50cnkgPSBydGxsaWJfZnJhZ19jYWNoZV9maW5kKGllZWUsIHNlcSwgZnJhZywgdGlkLCBoZHItPmFkZHIyLAogCQkJCQkJICBoZHItPmFkZHIxKTsKIAkJaWYgKGVudHJ5ICE9IE5VTEwpIHsKQEAgLTE5OSw3ICsyMDAsOCBAQAogICoKICAqIFJlc3BvbnNpYmxlIGZvciBoYW5kbGluZyBtYW5hZ2VtZW50IGNvbnRyb2wgZnJhbWVzCiAgKgotICogQ2FsbGVkIGJ5IHJ0bGxpYl9yeCAqLworICogQ2FsbGVkIGJ5IHJ0bGxpYl9yeAorICovCiBzdGF0aWMgaW5saW5lIGludAogcnRsbGliX3J4X2ZyYW1lX21nbXQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQlzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cywgdTE2IHR5cGUsCkBAIC0yMjQsOCArMjI2LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogU2VlIElFRUUgODAyLjFIIGZvciBMTEMvU05BUCBlbmNhcHN1bGF0aW9uL2RlY2Fwc3VsYXRpb24gKi8KLS8qIEV0aGVybmV0LUlJIHNuYXAgaGVhZGVyIChSRkMxMDQyIGZvciBtb3N0IEV0aGVyVHlwZXMpICovCisvKiBTZWUgSUVFRSA4MDIuMUggZm9yIExMQy9TTkFQIGVuY2Fwc3VsYXRpb24vZGVjYXBzdWxhdGlvbgorICogRXRoZXJuZXQtSUkgc25hcCBoZWFkZXIgKFJGQzEwNDIgZm9yIG1vc3QgRXRoZXJUeXBlcykKKyAqLwogc3RhdGljIHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSA9IHsKIAkweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweDAwCiB9OwpAQCAtMzk0LDEwICszOTcsOSBAQAogCQl9CiAJCWlmIChwID09ICZpZWVlLT5pYnNzX21hY19oYXNoW2luZGV4XSkgewogCQkJZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZV9pYnNzX3NlcSksIEdGUF9BVE9NSUMpOwotCQkJaWYgKCFlbnRyeSkgewotCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkNhbm5vdCBtYWxsb2MgbmV3IG1hYyBlbnRyeVxuIik7CisJCQlpZiAoIWVudHJ5KQogCQkJCXJldHVybiAwOwotCQkJfQorCiAJCQltZW1jcHkoZW50cnktPm1hYywgbWFjLCBFVEhfQUxFTik7CiAJCQllbnRyeS0+c2VxX251bVt0aWRdID0gc2VxOwogCQkJZW50cnktPmZyYWdfbnVtW3RpZF0gPSBmcmFnOwpAQCAtNDgzLDcgKzQ4NSw4IEBACiAJCQkgICAgZXRoZXJ0eXBlICE9IEVUSF9QX0FBUlAgJiYgZXRoZXJ0eXBlICE9IEVUSF9QX0lQWCkgfHwKIAkJCSAgICBtZW1jbXAoc3ViX3NrYi0+ZGF0YSwgYnJpZGdlX3R1bm5lbF9oZWFkZXIsIFNOQVBfU0laRSkgPT0gMCkpIHsKIAkJCQkvKiByZW1vdmUgUkZDMTA0MiBvciBCcmlkZ2UtVHVubmVsIGVuY2Fwc3VsYXRpb24KLQkJCQkgKiBhbmQgcmVwbGFjZSBFdGhlclR5cGUgKi8KKwkJCQkgKiBhbmQgcmVwbGFjZSBFdGhlclR5cGUKKwkJCQkgKi8KIAkJCQlza2JfcHVsbChzdWJfc2tiLCBTTkFQX1NJWkUpOwogCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHByeGItPnNyYywgRVRIX0FMRU4pOwogCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHByeGItPmRzdCwgRVRIX0FMRU4pOwpAQCAtNTI0LDcgKzUyNyw5IEBACiAJZGVsX3RpbWVyX3N5bmMoJnBUUy0+UnhQa3RQZW5kaW5nVGltZXIpOwogCXdoaWxlICghbGlzdF9lbXB0eSgmcFRTLT5SeFBlbmRpbmdQa3RMaXN0KSkgewogCQlpZiAoUmZkQ250ID49IFJFT1JERVJfV0lOX1NJWkUpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tPiVzKCkgZXJyb3IhIFJmZENudCA+PSBSRU9SREVSX1dJTl9TSVpFXG4iLCBfX2Z1bmNfXyk7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJICAgICItLS0tLS0tLS0tLS0tLT4lcygpIGVycm9yISBSZmRDbnQgPj0gUkVPUkRFUl9XSU5fU0laRVxuIiwKKwkJCQkgICAgX19mdW5jX18pOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNTgxLDggKzU4Niw3IEBACiAJCXJldHVybjsKIAl9CiAKLQkvKgotCSAqIFNsaWRpbmcgd2luZG93IG1hbmlwdWxhdGlvbi4gQ29uZGl0aW9ucyBpbmNsdWRlczoKKwkvKiBTbGlkaW5nIHdpbmRvdyBtYW5pcHVsYXRpb24uIENvbmRpdGlvbnMgaW5jbHVkZXM6CiAJICogMS4gSW5jb21pbmcgU2VxTnVtIGlzIGVxdWFsIHRvIFdpblN0YXJ0ID0+V2luZG93IHNoaWZ0IDEKIAkgKiAyLiBJbmNvbWluZyBTZXFOdW0gaXMgbGFyZ2VyIHRoYW4gdGhlIFdpbkVuZCA9PiBXaW5kb3cgc2hpZnQgTgogCSAqLwpAQCAtNTk3LDEzICs2MDEsMTIgQEAKIAkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9SRU9SREVSLCAiV2luZG93IFNoaWZ0ISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIsIHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKIAl9CiAKLQkvKgotCSAqIEluZGljYXRpb24gcHJvY2Vzcy4KKwkvKiBJbmRpY2F0aW9uIHByb2Nlc3MuCiAJICogQWZ0ZXIgUGFja2V0IGRyb3BwaW5nIGFuZCBTbGlkaW5nIFdpbmRvdyBzaGlmdGluZyBhcyBhYm92ZSwgd2UgY2FuCiAJICogbm93IGp1c3QgaW5kaWNhdGUgdGhlIHBhY2tldHMgd2l0aCB0aGUgU2VxTnVtIHNtYWxsZXIgdGhhbiBsYXRlc3QKIAkgKiBXaW5TdGFydCBhbmQgc3RydWN0IGJ1ZmZlciBvdGhlciBwYWNrZXRzLgotCSAqLwotCS8qIEZvciBSeCBSZW9yZGVyIGNvbmRpdGlvbjoKKwkgKgorCSAqIEZvciBSeCBSZW9yZGVyIGNvbmRpdGlvbjoKIAkgKiAxLiBBbGwgcGFja2V0cyB3aXRoIFNlcU51bSBzbWFsbGVyIHRoYW4gV2luU3RhcnQgPT4gSW5kaWNhdGUKIAkgKiAyLiBBbGwgcGFja2V0cyB3aXRoIFNlcU51bSBsYXJnZXIgdGhhbiBvciBlcXVhbCB0bwogCSAqCSBXaW5TdGFydCA9PiBCdWZmZXIgaXQuCkBAIC02NDYsOCArNjQ5LDcgQEAKIAkJCQkJIHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBQYWNrZXRzIGFyZSBkcm9wcGVkIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIHJlb3JkZXIKKwkJCS8qIFBhY2tldHMgYXJlIGRyb3BwZWQgaWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggcmVvcmRlcgogCQkJICogZW50cmllcy4gVGhpcyBwYXJ0IHNob3VsZCBiZSBtb2RpZmllZCEhIFdlIGNhbiBqdXN0CiAJCQkgKiBpbmRpY2F0ZSBhbGwgdGhlIHBhY2tldHMgaW4gc3RydWN0IGJ1ZmZlciBhbmQgZ2V0CiAJCQkgKiByZW9yZGVyIGVudHJpZXMuCkBAIC02OTcsNyArNjk5LDggQEAKIAl9CiAKIAkvKiBIYW5kbGluZyBwZW5kaW5nIHRpbWVyLiBTZXQgdGhpcyB0aW1lciB0byBwcmV2ZW50IGZyb20gbG9uZyB0aW1lCi0JICogUnggYnVmZmVyaW5nLiovCisJICogUnggYnVmZmVyaW5nLgorCSAqLwogCWlmIChpbmRleCA+IDApIHsKIAkJaWYgKHRpbWVyX3BlbmRpbmcoJnBUUy0+UnhQa3RQZW5kaW5nVGltZXIpKQogCQkJZGVsX3RpbWVyX3N5bmMoJnBUUy0+UnhQa3RQZW5kaW5nVGltZXIpOwpAQCAtNzE4LDcgKzcyMSw3IEBACiAJCQkgICAgIF9fZnVuY19fKTsKIAkJcFRTLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcSA9IHBUUy0+UnhJbmRpY2F0ZVNlcTsKIAkJbW9kX3RpbWVyKCZwVFMtPlJ4UGt0UGVuZGluZ1RpbWVyLCBqaWZmaWVzICsKLQkJCSAgTVNFQ1MocEhUSW5mby0+UnhSZW9yZGVyUGVuZGluZ1RpbWUpKTsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhwSFRJbmZvLT5SeFJlb3JkZXJQZW5kaW5nVGltZSkpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoaWVlZS0+cmVvcmRlcl9zcGlubG9jayksIGZsYWdzKTsKIH0KQEAgLTc4Miw2OSArNzg1LDc0IEBACiAJCW1lbWNweShyeGItPmRzdCwgZHN0LCBFVEhfQUxFTik7CiAJCXJ4Yi0+c3ViZnJhbWVzWzBdLT5kZXYgPSBpZWVlLT5kZXY7CiAJCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXJ4Yi0+bnJfc3ViZnJhbWVzID0gMDsKLQkJbWVtY3B5KHJ4Yi0+c3JjLCBzcmMsIEVUSF9BTEVOKTsKLQkJbWVtY3B5KHJ4Yi0+ZHN0LCBkc3QsIEVUSF9BTEVOKTsKLQkJd2hpbGUgKHNrYi0+bGVuID4gRVRIRVJORVRfSEVBREVSX1NJWkUpIHsKLQkJCS8qIE9mZnNldCAxMiBkZW5vdGUgMiBtYWMgYWRkcmVzcyAqLwotCQkJblN1YmZyYW1lX0xlbmd0aCA9ICooKHUxNiAqKShza2ItPmRhdGEgKyAxMikpOwotCQkJblN1YmZyYW1lX0xlbmd0aCA9IChuU3ViZnJhbWVfTGVuZ3RoID4+IDgpICsKLQkJCQkJICAgKG5TdWJmcmFtZV9MZW5ndGggPDwgOCk7CisJfQogCi0JCQlpZiAoc2tiLT5sZW4gPCAoRVRIRVJORVRfSEVBREVSX1NJWkUgKyBuU3ViZnJhbWVfTGVuZ3RoKSkgewotCQkJCXByaW50ayhLRVJOX0lORk8gIiVzOiBBLU1TRFUgcGFyc2UgZXJyb3IhISBwUmZkLT5uVG90YWxTdWJmcmFtZSA6ICVkXG4iLFwKLQkJCQkgICAgICAgX19mdW5jX18sIHJ4Yi0+bnJfc3ViZnJhbWVzKTsKLQkJCQlwcmludGsoS0VSTl9JTkZPICIlczogQS1NU0RVIHBhcnNlIGVycm9yISEgU3ViZnJhbWUgTGVuZ3RoOiAlZFxuIiwgX19mdW5jX18sCi0JCQkJICAgICAgIG5TdWJmcmFtZV9MZW5ndGgpOwotCQkJCXByaW50ayhLRVJOX0lORk8gIm5SZW1haW5fTGVuZ3RoIGlzICVkIGFuZCBuU3ViZnJhbWVfTGVuZ3RoIGlzIDogJWRcbiIsIHNrYi0+bGVuLAotCQkJCSAgICAgICBuU3ViZnJhbWVfTGVuZ3RoKTsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJUaGUgUGFja2V0IFNlcU51bSBpcyAlZFxuIiwgU2VxTnVtKTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0KKwlyeGItPm5yX3N1YmZyYW1lcyA9IDA7CisJbWVtY3B5KHJ4Yi0+c3JjLCBzcmMsIEVUSF9BTEVOKTsKKwltZW1jcHkocnhiLT5kc3QsIGRzdCwgRVRIX0FMRU4pOworCXdoaWxlIChza2ItPmxlbiA+IEVUSEVSTkVUX0hFQURFUl9TSVpFKSB7CisJCS8qIE9mZnNldCAxMiBkZW5vdGUgMiBtYWMgYWRkcmVzcyAqLworCQluU3ViZnJhbWVfTGVuZ3RoID0gKigodTE2ICopKHNrYi0+ZGF0YSArIDEyKSk7CisJCW5TdWJmcmFtZV9MZW5ndGggPSAoblN1YmZyYW1lX0xlbmd0aCA+PiA4KSArCisJCQkJICAgKG5TdWJmcmFtZV9MZW5ndGggPDwgOCk7CiAKLQkJCS8qIG1vdmUgdGhlIGRhdGEgcG9pbnQgdG8gZGF0YSBjb250ZW50ICovCi0JCQlza2JfcHVsbChza2IsIEVUSEVSTkVUX0hFQURFUl9TSVpFKTsKLQotCQkJLyogYWx0ZXJlZCBieSBjbGFyayAzLzMwLzIwMTAKLQkJCSAqIFRoZSBzdHJ1Y3QgYnVmZmVyIHNpemUgb2YgdGhlIHNrYiBpbmRpY2F0ZWQgdG8gdXBwZXIgbGF5ZXIKLQkJCSAqIG11c3QgYmUgbGVzcyB0aGFuIDUwMDAsIG9yIHRoZSBkZWZyYWdlZCBJUCBkYXRhZ3JhbQotCQkJICogaW4gdGhlIElQIGxheWVyIHdpbGwgZXhjZWVkICJpcGZyYWdfaGlnaF90cmVzaCIgYW5kIGJlCi0JCQkgKiBkaXNjYXJkZWQuIHNvIHRoZXJlIG11c3Qgbm90IHVzZSB0aGUgZnVuY3Rpb24KLQkJCSAqICJza2JfY29weSIgYW5kICJza2JfY2xvbmUiIGZvciAic2tiIi4KLQkJCSAqLwotCi0JCQkvKiBBbGxvY2F0ZSBuZXcgc2tiIGZvciByZWxlYXNpbmcgdG8gdXBwZXIgbGF5ZXIgKi8KLQkJCXN1Yl9za2IgPSBkZXZfYWxsb2Nfc2tiKG5TdWJmcmFtZV9MZW5ndGggKyAxMik7Ci0JCQlpZiAoIXN1Yl9za2IpCi0JCQkJcmV0dXJuIDA7Ci0JCQlza2JfcmVzZXJ2ZShzdWJfc2tiLCAxMik7Ci0JCQlkYXRhX3B0ciA9ICh1OCAqKXNrYl9wdXQoc3ViX3NrYiwgblN1YmZyYW1lX0xlbmd0aCk7Ci0JCQltZW1jcHkoZGF0YV9wdHIsIHNrYi0+ZGF0YSwgblN1YmZyYW1lX0xlbmd0aCk7Ci0KLQkJCXN1Yl9za2ItPmRldiA9IGllZWUtPmRldjsKLQkJCXJ4Yi0+c3ViZnJhbWVzW3J4Yi0+bnJfc3ViZnJhbWVzKytdID0gc3ViX3NrYjsKLQkJCWlmIChyeGItPm5yX3N1YmZyYW1lcyA+PSBNQVhfU1VCRlJBTUVfQ09VTlQpIHsKLQkJCQlSVExMSUJfREVCVUdfUlgoIlBhcnNlU3ViZnJhbWUoKTogVG9vIG1hbnkgU3ViZnJhbWVzISBQYWNrZXRzIGRyb3BwZWQhXG4iKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCXNrYl9wdWxsKHNrYiwgblN1YmZyYW1lX0xlbmd0aCk7Ci0KLQkJCWlmIChza2ItPmxlbiAhPSAwKSB7Ci0JCQkJblBhZGRpbmdfTGVuZ3RoID0gNCAtICgoblN1YmZyYW1lX0xlbmd0aCArCi0JCQkJCQkgIEVUSEVSTkVUX0hFQURFUl9TSVpFKSAlIDQpOwotCQkJCWlmIChuUGFkZGluZ19MZW5ndGggPT0gNCkKLQkJCQkJblBhZGRpbmdfTGVuZ3RoID0gMDsKLQotCQkJCWlmIChza2ItPmxlbiA8IG5QYWRkaW5nX0xlbmd0aCkKLQkJCQkJcmV0dXJuIDA7Ci0KLQkJCQlza2JfcHVsbChza2IsIG5QYWRkaW5nX0xlbmd0aCk7Ci0JCQl9CisJCWlmIChza2ItPmxlbiA8IChFVEhFUk5FVF9IRUFERVJfU0laRSArIG5TdWJmcmFtZV9MZW5ndGgpKSB7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJICAgICIlczogQS1NU0RVIHBhcnNlIGVycm9yISEgcFJmZC0+blRvdGFsU3ViZnJhbWUgOiAlZFxuIiwKKwkJCQkgICAgX19mdW5jX18sIHJ4Yi0+bnJfc3ViZnJhbWVzKTsKKwkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCQkgICAgIiVzOiBBLU1TRFUgcGFyc2UgZXJyb3IhISBTdWJmcmFtZSBMZW5ndGg6ICVkXG4iLAorCQkJCSAgICBfX2Z1bmNfXywgblN1YmZyYW1lX0xlbmd0aCk7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJICAgICJuUmVtYWluX0xlbmd0aCBpcyAlZCBhbmQgblN1YmZyYW1lX0xlbmd0aCBpcyA6ICVkXG4iLAorCQkJCSAgICBza2ItPmxlbiwgblN1YmZyYW1lX0xlbmd0aCk7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJICAgICJUaGUgUGFja2V0IFNlcU51bSBpcyAlZFxuIiwKKwkJCQkgICAgU2VxTnVtKTsKKwkJCXJldHVybiAwOwogCQl9CiAKLQkJcmV0dXJuIHJ4Yi0+bnJfc3ViZnJhbWVzOworCQkvKiBtb3ZlIHRoZSBkYXRhIHBvaW50IHRvIGRhdGEgY29udGVudCAqLworCQlza2JfcHVsbChza2IsIEVUSEVSTkVUX0hFQURFUl9TSVpFKTsKKworCQkvKiBhbHRlcmVkIGJ5IGNsYXJrIDMvMzAvMjAxMAorCQkgKiBUaGUgc3RydWN0IGJ1ZmZlciBzaXplIG9mIHRoZSBza2IgaW5kaWNhdGVkIHRvIHVwcGVyIGxheWVyCisJCSAqIG11c3QgYmUgbGVzcyB0aGFuIDUwMDAsIG9yIHRoZSBkZWZyYWdlZCBJUCBkYXRhZ3JhbQorCQkgKiBpbiB0aGUgSVAgbGF5ZXIgd2lsbCBleGNlZWQgImlwZnJhZ19oaWdoX3RyZXNoIiBhbmQgYmUKKwkJICogZGlzY2FyZGVkLiBzbyB0aGVyZSBtdXN0IG5vdCB1c2UgdGhlIGZ1bmN0aW9uCisJCSAqICJza2JfY29weSIgYW5kICJza2JfY2xvbmUiIGZvciAic2tiIi4KKwkJICovCisKKwkJLyogQWxsb2NhdGUgbmV3IHNrYiBmb3IgcmVsZWFzaW5nIHRvIHVwcGVyIGxheWVyICovCisJCXN1Yl9za2IgPSBkZXZfYWxsb2Nfc2tiKG5TdWJmcmFtZV9MZW5ndGggKyAxMik7CisJCWlmICghc3ViX3NrYikKKwkJCXJldHVybiAwOworCQlza2JfcmVzZXJ2ZShzdWJfc2tiLCAxMik7CisJCWRhdGFfcHRyID0gKHU4ICopc2tiX3B1dChzdWJfc2tiLCBuU3ViZnJhbWVfTGVuZ3RoKTsKKwkJbWVtY3B5KGRhdGFfcHRyLCBza2ItPmRhdGEsIG5TdWJmcmFtZV9MZW5ndGgpOworCisJCXN1Yl9za2ItPmRldiA9IGllZWUtPmRldjsKKwkJcnhiLT5zdWJmcmFtZXNbcnhiLT5ucl9zdWJmcmFtZXMrK10gPSBzdWJfc2tiOworCQlpZiAocnhiLT5ucl9zdWJmcmFtZXMgPj0gTUFYX1NVQkZSQU1FX0NPVU5UKSB7CisJCQlSVExMSUJfREVCVUdfUlgoIlBhcnNlU3ViZnJhbWUoKTogVG9vIG1hbnkgU3ViZnJhbWVzISBQYWNrZXRzIGRyb3BwZWQhXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCXNrYl9wdWxsKHNrYiwgblN1YmZyYW1lX0xlbmd0aCk7CisKKwkJaWYgKHNrYi0+bGVuICE9IDApIHsKKwkJCW5QYWRkaW5nX0xlbmd0aCA9IDQgLSAoKG5TdWJmcmFtZV9MZW5ndGggKworCQkJCQkgIEVUSEVSTkVUX0hFQURFUl9TSVpFKSAlIDQpOworCQkJaWYgKG5QYWRkaW5nX0xlbmd0aCA9PSA0KQorCQkJCW5QYWRkaW5nX0xlbmd0aCA9IDA7CisKKwkJCWlmIChza2ItPmxlbiA8IG5QYWRkaW5nX0xlbmd0aCkKKwkJCQlyZXR1cm4gMDsKKworCQkJc2tiX3B1bGwoc2tiLCBuUGFkZGluZ19MZW5ndGgpOworCQl9CiAJfQorCisJcmV0dXJuIHJ4Yi0+bnJfc3ViZnJhbWVzOwogfQogCiAKQEAgLTg1OSw3ICs4NjcsOCBAQAogCWhkcmxlbiA9IHJ0bGxpYl9nZXRfaGRybGVuKGZjKTsKIAlpZiAoSFRDQ2hlY2soaWVlZSwgc2tiLT5kYXRhKSkgewogCQlpZiAobmV0X3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGZpbmQgSFRDQ29udHJvbCFcbiIsIF9fZnVuY19fKTsKKwkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIiVzOiBmaW5kIEhUQ0NvbnRyb2whXG4iLAorCQkJCSAgICBfX2Z1bmNfXyk7CiAJCWhkcmxlbiArPSA0OwogCQlyeF9zdGF0cy0+YkNvbnRhaW5IVEMgPSB0cnVlOwogCX0KQEAgLTk2Niw3ICs5NzUsOCBAQAogCX0KIAogCS8qIE51bGxmdW5jIGZyYW1lcyBtYXkgaGF2ZSBQUy1iaXQgc2V0LCBzbyB0aGV5IG11c3QgYmUgcGFzc2VkIHRvCi0JICogaG9zdGFwX2hhbmRsZV9zdGFfcngoKSBiZWZvcmUgYmVpbmcgZHJvcHBlZCBoZXJlLiAqLworCSAqIGhvc3RhcF9oYW5kbGVfc3RhX3J4KCkgYmVmb3JlIGJlaW5nIGRyb3BwZWQgaGVyZS4KKwkgKi8KIAlpZiAoIWllZWUtPkludGVsUHJvbWlzY3VvdXNNb2RlSW5mby5iUHJvbWlzY3VvdXNPbikgewogCQlpZiAoc3R5cGUgIT0gUlRMTElCX1NUWVBFX0RBVEEgJiYKIAkJICAgIHN0eXBlICE9IFJUTExJQl9TVFlQRV9EQVRBX0NGQUNLICYmCkBAIC0xMDA4LDcgKzEwMTgsOCBAQAogCiAJCSpjcnlwdCA9IGllZWUtPmNyeXB0X2luZm8uY3J5cHRbaWR4XTsKIAkJLyogYWxsb3cgTlVMTCBkZWNyeXB0IHRvIGluZGljYXRlIGFuIHN0YXRpb24gc3BlY2lmaWMgb3ZlcnJpZGUKLQkJICogZm9yIGRlZmF1bHQgZW5jcnlwdGlvbiAqLworCQkgKiBmb3IgZGVmYXVsdCBlbmNyeXB0aW9uCisJCSAqLwogCQlpZiAoKmNyeXB0ICYmICgoKmNyeXB0KS0+b3BzID09IE5VTEwgfHwKIAkJCSAgICAgICgqY3J5cHQpLT5vcHMtPmRlY3J5cHRfbXBkdSA9PSBOVUxMKSkKIAkJCSpjcnlwdCA9IE5VTEw7CkBAIC0xMDE3LDcgKzEwMjgsOCBAQAogCQkJLyogVGhpcyBzZWVtcyB0byBiZSB0cmlnZ2VyZWQgYnkgc29tZSAobXVsdGljYXN0PykKIAkJCSAqIGZyYW1lcyBmcm9tIG90aGVyIHRoYW4gY3VycmVudCBCU1MsIHNvIGp1c3QgZHJvcCB0aGUKIAkJCSAqIGZyYW1lcyBzaWxlbnRseSBpbnN0ZWFkIG9mIGZpbGxpbmcgc3lzdGVtIGxvZyB3aXRoCi0JCQkgKiB0aGVzZSByZXBvcnRzLiAqLworCQkJICogdGhlc2UgcmVwb3J0cy4KKwkJCSAqLwogCQkJUlRMTElCX0RFQlVHX0RST1AoIkRlY3J5cHRpb24gZmFpbGVkIChub3Qgc2V0KSAoU0E9ICVwTSlcbiIsCiAJCQkJCSAgICAgaGRyLT5hZGRyMik7CiAJCQlpZWVlLT5pZWVlX3N0YXRzLnJ4X2Rpc2NhcmRzX3VuZGVjcnlwdGFibGUrKzsKQEAgLTEwNDksNyArMTA2MSw3IEBACiAKIAlrZXlpZHggPSBydGxsaWJfcnhfZnJhbWVfZGVjcnlwdChpZWVlLCBza2IsIGNyeXB0KTsKIAlpZiAoaWVlZS0+aG9zdF9kZWNyeXB0ICYmIChmYyAmIFJUTExJQl9GQ1RMX1dFUCkgJiYgKGtleWlkeCA8IDApKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBkZWNyeXB0IGZyYW1lIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIiVzOiBkZWNyeXB0IGZyYW1lIGVycm9yXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTEwNzIsMTkgKzEwODQsMjIgQEAKIAkJCWZsZW4gLT0gaGRybGVuOwogCiAJCWlmIChmcmFnX3NrYi0+dGFpbCArIGZsZW4gPiBmcmFnX3NrYi0+ZW5kKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogaG9zdCBkZWNyeXB0ZWQgYW5kIHJlYXNzZW1ibGVkIGZyYW1lIGRpZCBub3QgZml0IHNrYlxuIiwKLQkJCSAgICAgICBfX2Z1bmNfXyk7CisJCQluZXRkZXZfd2FybihpZWVlLT5kZXYsCisJCQkJICAgICIlczogaG9zdCBkZWNyeXB0ZWQgYW5kIHJlYXNzZW1ibGVkIGZyYW1lIGRpZCBub3QgZml0IHNrYlxuIiwKKwkJCQkgICAgX19mdW5jX18pOwogCQkJcnRsbGliX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShpZWVlLCBoZHIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAKIAkJaWYgKGZyYWcgPT0gMCkgewogCQkJLyogY29weSBmaXJzdCBmcmFnbWVudCAoaW5jbHVkaW5nIGZ1bGwgaGVhZGVycykgaW50bwotCQkJICogYmVnaW5uaW5nIG9mIHRoZSBmcmFnbWVudCBjYWNoZSBza2IgKi8KKwkJCSAqIGJlZ2lubmluZyBvZiB0aGUgZnJhZ21lbnQgY2FjaGUgc2tiCisJCQkgKi8KIAkJCW1lbWNweShza2JfcHV0KGZyYWdfc2tiLCBmbGVuKSwgc2tiLT5kYXRhLCBmbGVuKTsKIAkJfSBlbHNlIHsKIAkJCS8qIGFwcGVuZCBmcmFtZSBwYXlsb2FkIHRvIHRoZSBlbmQgb2YgdGhlIGZyYWdtZW50Ci0JCQkgKiBjYWNoZSBza2IgKi8KKwkJCSAqIGNhY2hlIHNrYgorCQkJICovCiAJCQltZW1jcHkoc2tiX3B1dChmcmFnX3NrYiwgZmxlbiksIHNrYi0+ZGF0YSArIGhkcmxlbiwKIAkJCSAgICAgICBmbGVuKTsKIAkJfQpAQCAtMTA5NCwyMiArMTEwOSwyNSBAQAogCQlpZiAoZmMgJiBSVExMSUJfRkNUTF9NT1JFRlJBR1MpIHsKIAkJCS8qIG1vcmUgZnJhZ21lbnRzIGV4cGVjdGVkIC0gbGVhdmUgdGhlIHNrYiBpbiBmcmFnbWVudAogCQkJICogY2FjaGUgZm9yIG5vdzsgaXQgd2lsbCBiZSBkZWxpdmVyZWQgdG8gdXBwZXIgbGF5ZXJzCi0JCQkgKiBhZnRlciBhbGwgZnJhZ21lbnRzIGhhdmUgYmVlbiByZWNlaXZlZCAqLworCQkJICogYWZ0ZXIgYWxsIGZyYWdtZW50cyBoYXZlIGJlZW4gcmVjZWl2ZWQKKwkJCSAqLwogCQkJcmV0dXJuIC0yOwogCQl9CiAKIAkJLyogdGhpcyB3YXMgdGhlIGxhc3QgZnJhZ21lbnQgYW5kIHRoZSBmcmFtZSB3aWxsIGJlCi0JCSAqIGRlbGl2ZXJlZCwgc28gcmVtb3ZlIHNrYiBmcm9tIGZyYWdtZW50IGNhY2hlICovCisJCSAqIGRlbGl2ZXJlZCwgc28gcmVtb3ZlIHNrYiBmcm9tIGZyYWdtZW50IGNhY2hlCisJCSAqLwogCQlza2IgPSBmcmFnX3NrYjsKIAkJaGRyID0gKHN0cnVjdCBydGxsaWJfaGRyXzRhZGRyICopIHNrYi0+ZGF0YTsKIAkJcnRsbGliX2ZyYWdfY2FjaGVfaW52YWxpZGF0ZShpZWVlLCBoZHIpOwogCX0KIAogCS8qIHNrYjogaGRyICsgKHBvc3NpYmxlIHJlYXNzZW1ibGVkKSBmdWxsIE1TRFUgcGF5bG9hZDsgcG9zc2libHkgc3RpbGwKLQkgKiBlbmNyeXB0ZWQvYXV0aGVudGljYXRlZCAqLworCSAqIGVuY3J5cHRlZC9hdXRoZW50aWNhdGVkCisJICovCiAJaWYgKGllZWUtPmhvc3RfZGVjcnlwdCAmJiAoZmMgJiBSVExMSUJfRkNUTF9XRVApICYmCiAJCXJ0bGxpYl9yeF9mcmFtZV9kZWNyeXB0X21zZHUoaWVlZSwgc2tiLCBrZXlpZHgsIGNyeXB0KSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogPT0+ZGVjcnlwdCBtc2R1IGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIiVzOiA9PT5kZWNyeXB0IG1zZHUgZXJyb3JcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTExOSw3ICsxMTM3LDggQEAKIAkJICAgIHJ0bGxpYl9pc19lYXBvbF9mcmFtZShpZWVlLCBza2IsIGhkcmxlbikpIHsKIAogCQkJLyogcGFzcyB1bmVuY3J5cHRlZCBFQVBPTCBmcmFtZXMgZXZlbiBpZiBlbmNyeXB0aW9uIGlzCi0JCQkgKiBjb25maWd1cmVkICovCisJCQkgKiBjb25maWd1cmVkCisJCQkgKi8KIAkJCXN0cnVjdCBlYXBvbCAqZWFwID0gKHN0cnVjdCBlYXBvbCAqKShza2ItPmRhdGEgKwogCQkJCTI0KTsKIAkJCVJUTExJQl9ERUJVR19FQVAoIlJYOiBJRUVFIDgwMi4xWCBFQVBPTCBmcmFtZTogJXNcbiIsCkBAIC0xMTQ5LDcgKzExNjgsNyBAQAogCX0KIAogCWlmIChydGxsaWJfaXNfZWFwb2xfZnJhbWUoaWVlZSwgc2tiLCBoZHJsZW4pKQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJSWDogSUVFRTgwMi4xWCBFQVBPTCBmcmFtZSFcbiIpOworCQluZXRkZXZfd2FybihpZWVlLT5kZXYsICJSWDogSUVFRTgwMi4xWCBFQVBPTCBmcmFtZSFcbiIpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTU4LDcgKzExNzcsNyBAQAogewogCWlmICh1bmljYXN0KSB7CiAKLQkJaWYgKChpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEKSkgeworCQlpZiAoaWVlZS0+c3RhdGUgPT0gUlRMTElCX0xJTktFRCkgewogCQkJaWYgKCgoaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUnhVbmljYXN0T2tJblBlcmlvZCArCiAJCQkgICAgaWVlZS0+TGlua0RldGVjdEluZm8uTnVtVHhPa0luUGVyaW9kKSA+IDgpIHx8CiAJCQkgICAgKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJ4VW5pY2FzdE9rSW5QZXJpb2QgPiAyKSkgewpAQCAtMTE4MSw4ICsxMjAwLDggQEAKIAlpbnQgaSA9IDA7CiAKIAlpZiAocnhiID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHJ4YiBpcyBOVUxMISFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuIDsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiJXM6IHJ4YiBpcyBOVUxMISFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCByeGItPm5yX3N1YmZyYW1lczsgaSsrKSB7CkBAIC0xMTk2LDcgKzEyMTUsOCBAQAogCQkJCWV0aGVydHlwZSAhPSBFVEhfUF9BQVJQICYmIGV0aGVydHlwZSAhPSBFVEhfUF9JUFgpIHx8CiAJCQkJbWVtY21wKHN1Yl9za2ItPmRhdGEsIGJyaWRnZV90dW5uZWxfaGVhZGVyLCBTTkFQX1NJWkUpID09IDApKSB7CiAJCQkJLyogcmVtb3ZlIFJGQzEwNDIgb3IgQnJpZGdlLVR1bm5lbCBlbmNhcHN1bGF0aW9uIGFuZAotCQkJCSAqIHJlcGxhY2UgRXRoZXJUeXBlICovCisJCQkJICogcmVwbGFjZSBFdGhlclR5cGUKKwkJCQkgKi8KIAkJCQlza2JfcHVsbChzdWJfc2tiLCBTTkFQX1NJWkUpOwogCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIHNyYywgRVRIX0FMRU4pOwogCQkJCW1lbWNweShza2JfcHVzaChzdWJfc2tiLCBFVEhfQUxFTiksIGRzdCwgRVRIX0FMRU4pOwpAQCAtMTIyNiw3ICsxMjQ2LDYgQEAKIAkJfQogCX0KIAlrZnJlZShyeGIpOwotCXJ4YiA9IE5VTEw7CiB9CiAKIHN0YXRpYyBpbnQgcnRsbGliX3J4X0luZnJhQWRob2Moc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCkBAIC0xMjYzLDcgKzEyODIsOCBAQAogCS8qRmlsdGVyIHBrdCBoYXMgdG9vIHNtYWxsIGxlbmd0aCAqLwogCWhkcmxlbiA9IHJ0bGxpYl9yeF9nZXRfaGRybGVuKGllZWUsIHNrYiwgcnhfc3RhdHMpOwogCWlmIChza2ItPmxlbiA8IGhkcmxlbikgewotCQlwcmludGsoS0VSTl9JTkZPICIlcygpOkVSUiEhISBza2ItPmxlbiBpcyBzbWFsbGVyIHRoYW4gaGRybGVuXG4iLCBfX2Z1bmNfXyk7CisJCW5ldGRldl9pbmZvKGRldiwgIiVzKCk6RVJSISEhIHNrYi0+bGVuIGlzIHNtYWxsZXIgdGhhbiBoZHJsZW5cbiIsCisJCQkgICAgX19mdW5jX18pOwogCQlnb3RvIHJ4X2Ryb3BwZWQ7CiAJfQogCkBAIC0xMzQ1LDExICsxMzY1LDkgQEAKIAkvKiBza2I6IGhkciArIChwb3NzaWJsZSByZWFzc2VtYmxlZCkgZnVsbCBwbGFpbnRleHQgcGF5bG9hZCAqLwogCXBheWxvYWQgPSBza2ItPmRhdGEgKyBoZHJsZW47CiAJcnhiID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHJ0bGxpYl9yeGIpLCBHRlBfQVRPTUlDKTsKLQlpZiAocnhiID09IE5VTEwpIHsKLQkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCi0JCQkgICAgICIlcygpOiBrbWFsbG9jIHJ4YiBlcnJvclxuIiwgX19mdW5jX18pOworCWlmIChyeGIgPT0gTlVMTCkKIAkJZ290byByeF9kcm9wcGVkOwotCX0KKwogCS8qIHRvIHBhcnNlIGFtc2R1IHBhY2tldHMgKi8KIAkvKiBxb3MgZGF0YSBwYWNrZXRzICYgcmVzZXJ2ZWQgYml0IGlzIDEgKi8KIAlpZiAocGFyc2Vfc3ViZnJhbWUoaWVlZSwgc2tiLCByeF9zdGF0cywgcnhiLCBzcmMsIGRzdCkgPT0gMCkgewpAQCAtMTM5MCw3ICsxNDA4LDggQEAKIAogCS8qIFJldHVybmluZyAwIGluZGljYXRlcyB0byBjYWxsZXIgdGhhdCB3ZSBoYXZlIG5vdCBoYW5kbGVkIHRoZSBTS0ItLQogCSAqIHNvIGl0IGlzIHN0aWxsIGFsbG9jYXRlZCBhbmQgY2FuIGJlIHVzZWQgYWdhaW4gYnkgdW5kZXJseWluZwotCSAqIGhhcmR3YXJlIGFzIGEgRE1BIHRhcmdldCAqLworCSAqIGhhcmR3YXJlIGFzIGEgRE1BIHRhcmdldAorCSAqLwogCXJldHVybiAwOwogfQogCkBAIC0xNDA4LDEzICsxNDI3LDE2IEBACiAJc2l6ZV90IGhkcmxlbiA9IHJ0bGxpYl9nZXRfaGRybGVuKGZjKTsKIAogCWlmIChza2ItPmxlbiA8IGhkcmxlbikgewotCQlwcmludGsoS0VSTl9JTkZPICIlcygpOkVSUiEhISBza2ItPmxlbiBpcyBzbWFsbGVyIHRoYW4gaGRybGVuXG4iLCBfX2Z1bmNfXyk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCSAgICAiJXMoKTpFUlIhISEgc2tiLT5sZW4gaXMgc21hbGxlciB0aGFuIGhkcmxlblxuIiwKKwkJCSAgICBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIAogCWlmIChIVENDaGVjayhpZWVlLCBza2ItPmRhdGEpKSB7CiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQlwcmludGsoS0VSTl9JTkZPICIlczogRmluZCBIVENDb250cm9sIVxuIiwgX19mdW5jX18pOworCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiJXM6IEZpbmQgSFRDQ29udHJvbCFcbiIsCisJCQkJICAgIF9fZnVuY19fKTsKIAkJaGRybGVuICs9IDQ7CiAJfQogCkBAIC0xNDMzLDE4ICsxNDU1LDE5IEBACiAKIC8qIEFsbCByZWNlaXZlZCBmcmFtZXMgYXJlIHNlbnQgdG8gdGhpcyBmdW5jdGlvbi4gQHNrYiBjb250YWlucyB0aGUgZnJhbWUgaW4KICAqIElFRUUgODAyLjExIGZvcm1hdCwgaS5lLiwgaW4gdGhlIGZvcm1hdCBpdCB3YXMgc2VudCBvdmVyIGFpci4KLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgYXMgYSB0YXNrbGV0IChzb2Z0d2FyZSBJUlEpLiAqLworICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBhcyBhIHRhc2tsZXQgKHNvZnR3YXJlIElSUSkuCisgKi8KIGludCBydGxsaWJfcngoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKIHsKIAlpbnQgcmV0ID0gMDsKIAogCWlmICgoTlVMTCA9PSBpZWVlKSB8fCAoTlVMTCA9PSBza2IpIHx8IChOVUxMID09IHJ4X3N0YXRzKSkgewotCQlwcmludGsoS0VSTl9JTkZPICIlczogSW5wdXQgcGFyYW1ldGVycyBOVUxMIVxuIiwgX19mdW5jX18pOworCQlwcl9pbmZvKCIlczogSW5wdXQgcGFyYW1ldGVycyBOVUxMIVxuIiwgX19mdW5jX18pOwogCQlnb3RvIHJ4X2Ryb3BwZWQ7CiAJfQogCWlmIChza2ItPmxlbiA8IDEwKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzOiBTS0IgbGVuZ3RoIDwgMTBcbiIsIF9fZnVuY19fKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiJXM6IFNLQiBsZW5ndGggPCAxMFxuIiwgX19mdW5jX18pOwogCQlnb3RvIHJ4X2Ryb3BwZWQ7CiAJfQogCkBAIC0xNDY0LDcgKzE0ODcsNyBAQAogCQlyZXQgPSBydGxsaWJfcnhfTWVzaChpZWVlLCBza2IsIHJ4X3N0YXRzKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyIlczogRVJSIGl3IG1vZGUhISFcbiIsIF9fZnVuY19fKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiJXM6IEVSUiBpdyBtb2RlISEhXG4iLCBfX2Z1bmNfXyk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTQ3OSwxMCArMTUwMiw3IEBACiAKIHN0YXRpYyB1OCBxb3Nfb3VpW1FPU19PVUlfTEVOXSA9IHsgMHgwMCwgMHg1MCwgMHhGMiB9OwogCi0vKgotKiBNYWtlIHRoZXIgc3RydWN0dXJlIHdlIHJlYWQgZnJvbSB0aGUgYmVhY29uIHBhY2tldCBoYXMKLSogdGhlIHJpZ2h0IHZhbHVlcwotKi8KKy8qIE1ha2UgdGhlciBzdHJ1Y3R1cmUgd2UgcmVhZCBmcm9tIHRoZSBiZWFjb24gcGFja2V0IGhhcyB0aGUgcmlnaHQgdmFsdWVzICovCiBzdGF0aWMgaW50IHJ0bGxpYl92ZXJpZnlfcW9zX2luZm8oc3RydWN0IHJ0bGxpYl9xb3NfaW5mb3JtYXRpb25fZWxlbWVudAogCQkJCSAgICAgKmluZm9fZWxlbWVudCwgaW50IHN1Yl90eXBlKQogewpAQCAtMTUwMCw5ICsxNTIwLDcgQEAKIH0KIAogCi0vKgotICogUGFyc2UgYSBRb1MgcGFyYW1ldGVyIGVsZW1lbnQKLSAqLworLyogUGFyc2UgYSBRb1MgcGFyYW1ldGVyIGVsZW1lbnQgKi8KIHN0YXRpYyBpbnQgcnRsbGliX3JlYWRfcW9zX3BhcmFtX2VsZW1lbnQoc3RydWN0IHJ0bGxpYl9xb3NfcGFyYW1ldGVyX2luZm8KIAkJCQkJICAgICplbGVtZW50X3BhcmFtLCBzdHJ1Y3QgcnRsbGliX2luZm9fZWxlbWVudAogCQkJCQkgICAgKmluZm9fZWxlbWVudCkKQEAgLTE1MjYsOSArMTU0NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqIFBhcnNlIGEgUW9TIGluZm9ybWF0aW9uIGVsZW1lbnQKLSAqLworLyogUGFyc2UgYSBRb1MgaW5mb3JtYXRpb24gZWxlbWVudCAqLwogc3RhdGljIGludCBydGxsaWJfcmVhZF9xb3NfaW5mb19lbGVtZW50KHN0cnVjdAogCQkJCQkgICBydGxsaWJfcW9zX2luZm9ybWF0aW9uX2VsZW1lbnQKIAkJCQkJICAgKmVsZW1lbnRfaW5mbywgc3RydWN0IHJ0bGxpYl9pbmZvX2VsZW1lbnQKQEAgLTE1NTcsOSArMTU3Myw3IEBACiB9CiAKIAotLyoKLSAqIFdyaXRlIFFvUyBwYXJhbWV0ZXJzIGZyb20gdGhlIGFjIHBhcmFtZXRlcnMuCi0gKi8KKy8qIFdyaXRlIFFvUyBwYXJhbWV0ZXJzIGZyb20gdGhlIGFjIHBhcmFtZXRlcnMuICovCiBzdGF0aWMgaW50IHJ0bGxpYl9xb3NfY29udmVydF9hY190b19wYXJhbWV0ZXJzKHN0cnVjdCBydGxsaWJfcW9zX3BhcmFtZXRlcl9pbmZvICpwYXJhbV9lbG0sCiAJCXN0cnVjdCBydGxsaWJfcW9zX2RhdGEgKnFvc19kYXRhKQogewpAQCAtMTYxOCw4ICsxNjMyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIHdlIGhhdmUgYSBnZW5lcmljIGRhdGEgZWxlbWVudCB3aGljaCBpdCBtYXkgY29udGFpbiBRb1MgaW5mb3JtYXRpb24gb3IKKy8qIHdlIGhhdmUgYSBnZW5lcmljIGRhdGEgZWxlbWVudCB3aGljaCBpdCBtYXkgY29udGFpbiBRb1MgaW5mb3JtYXRpb24gb3IKICAqIHBhcmFtZXRlcnMgZWxlbWVudC4gY2hlY2sgdGhlIGluZm9ybWF0aW9uIGVsZW1lbnQgbGVuZ3RoIHRvIGRlY2lkZQogICogd2hpY2ggdHlwZSB0byByZWFkCiAgKi8KQEAgLTE3MDUsNyArMTcxOCw5IEBACiAKIAkJCWlmICghSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkgewogCQkJCWlmIChydGxsaWJfYWN0X3NjYW5uaW5nKGllZWUsIGZhbHNlKSAmJiBpZWVlLT5GaXJzdEllX0luU2NhbikKLQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiUmVjZWl2ZWQgYmVhY29uIENvbnRyeUlFLCBTU0lEOiA8JXM+XG4iLCBuZXR3b3JrLT5zc2lkKTsKKwkJCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJCQkJICAgICJSZWNlaXZlZCBiZWFjb24gQ29udHJ5SUUsIFNTSUQ6IDwlcz5cbiIsCisJCQkJCQkgICAgbmV0d29yay0+c3NpZCk7CiAJCQkJRG90MTFkX1VwZGF0ZUNvdW50cnlJZShpZWVlLCBhZGRyMiwgaW5mb19lbGVtZW50LT5sZW4sIGluZm9fZWxlbWVudC0+ZGF0YSk7CiAJCQl9CiAJCX0KQEAgLTE3MzksNyArMTc1NCw4IEBACiAJCQkJCSAgICAgbGVuZ3RoLCBpbmZvX2VsZW1lbnQtPmlkKTsKIAkJCS8qIFdlIHN0b3AgcHJvY2Vzc2luZyBidXQgZG9uJ3QgcmV0dXJuIGFuIGVycm9yIGhlcmUKIAkJCSAqIGJlY2F1c2Ugc29tZSBtaXNiZWhhdmlvdXIgQVBzIGJyZWFrIHRoaXMgcnVsZS4gaWUuCi0JCQkgKiBPcmlub2NvIEFQMTAwMC4gKi8KKwkJCSAqIE9yaW5vY28gQVAxMDAwLgorCQkJICovCiAJCQlicmVhazsKIAkJfQogCkBAIC0xOTA4LDcgKzE5MjQsNyBAQAogCQkJCSAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCiAJCQkJICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDMzKSB7CiAKLQkJCQkJCXRtcF9odGNhcF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sICh1OClNQVhfSUVfTEVOKTsKKwkJCQkJCXRtcF9odGNhcF9sZW4gPSBtaW5fdCh1OCwgaW5mb19lbGVtZW50LT5sZW4sIE1BWF9JRV9MRU4pOwogCQkJCQkJaWYgKHRtcF9odGNhcF9sZW4gIT0gMCkgewogCQkJCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyID0gSFRfU1BFQ19WRVJfRVdDOwogCQkJCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4gPSB0bXBfaHRjYXBfbGVuID4gc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpID8KQEAgLTE5MzIsNyArMTk0OCw3IEBACiAJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDkwICYmCiAJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDRjICYmCiAJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVszXSA9PSAweDAzNCkgewotCQkJCQl0bXBfaHRpbmZvX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwgKHU4KU1BWF9JRV9MRU4pOworCQkJCQl0bXBfaHRpbmZvX2xlbiA9IG1pbl90KHU4LCBpbmZvX2VsZW1lbnQtPmxlbiwgTUFYX0lFX0xFTik7CiAJCQkJCWlmICh0bXBfaHRpbmZvX2xlbiAhPSAwKSB7CiAJCQkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0VXQzsKIAkJCQkJCWlmICh0bXBfaHRpbmZvX2xlbikgewpAQCAtMTk1Myw3ICsxOTY5LDcgQEAKIAkJCQkJICAgIGluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweGUwICYmCiAJCQkJCSAgICBpbmZvX2VsZW1lbnQtPmRhdGFbMl0gPT0gMHg0YyAmJgogCQkJCQkgICAgaW5mb19lbGVtZW50LT5kYXRhWzNdID09IDB4MDIpIHsKLQkJCQkJCWh0X3JlYWx0ZWtfYWdnX2xlbiA9IG1pbihpbmZvX2VsZW1lbnQtPmxlbiwgKHU4KU1BWF9JRV9MRU4pOworCQkJCQkJaHRfcmVhbHRla19hZ2dfbGVuID0gbWluX3QodTgsIGluZm9fZWxlbWVudC0+bGVuLCBNQVhfSUVfTEVOKTsKIAkJCQkJCW1lbWNweShodF9yZWFsdGVrX2FnZ19idWYsIGluZm9fZWxlbWVudC0+ZGF0YSwgaW5mb19lbGVtZW50LT5sZW4pOwogCQkJCQl9CiAJCQkJCWlmIChodF9yZWFsdGVrX2FnZ19sZW4gPj0gNSkgewpAQCAtMjA4Myw3ICsyMDk5LDcgQEAKIAkJY2FzZSBNRklFX1RZUEVfSFRfQ0FQOgogCQkJUlRMTElCX0RFQlVHX1NDQU4oIk1GSUVfVFlQRV9IVF9DQVA6ICVkIGJ5dGVzXG4iLAogCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKLQkJCXRtcF9odGNhcF9sZW4gPSBtaW4oaW5mb19lbGVtZW50LT5sZW4sICh1OClNQVhfSUVfTEVOKTsKKwkJCXRtcF9odGNhcF9sZW4gPSBtaW5fdCh1OCwgaW5mb19lbGVtZW50LT5sZW4sIE1BWF9JRV9MRU4pOwogCQkJaWYgKHRtcF9odGNhcF9sZW4gIT0gMCkgewogCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRTcGVjVmVyID0gSFRfU1BFQ19WRVJfRVdDOwogCQkJCW5ldHdvcmstPmJzc2h0LmJkSFRDYXBMZW4gPSB0bXBfaHRjYXBfbGVuID4gc2l6ZW9mKG5ldHdvcmstPmJzc2h0LmJkSFRDYXBCdWYpID8KQEAgLTIxMTAsNyArMjEyNiw3IEBACiAJCWNhc2UgTUZJRV9UWVBFX0hUX0lORk86CiAJCQlSVExMSUJfREVCVUdfU0NBTigiTUZJRV9UWVBFX0hUX0lORk86ICVkIGJ5dGVzXG4iLAogCQkJCQkgICAgIGluZm9fZWxlbWVudC0+bGVuKTsKLQkJCXRtcF9odGluZm9fbGVuID0gbWluKGluZm9fZWxlbWVudC0+bGVuLCAodTgpTUFYX0lFX0xFTik7CisJCQl0bXBfaHRpbmZvX2xlbiA9IG1pbl90KHU4LCBpbmZvX2VsZW1lbnQtPmxlbiwgTUFYX0lFX0xFTik7CiAJCQlpZiAodG1wX2h0aW5mb19sZW4pIHsKIAkJCQluZXR3b3JrLT5ic3NodC5iZEhUU3BlY1ZlciA9IEhUX1NQRUNfVkVSX0lFRUU7CiAJCQkJbmV0d29yay0+YnNzaHQuYmRIVEluZm9MZW4gPSB0bXBfaHRpbmZvX2xlbiA+CkBAIC0yMTQyLDggKzIxNTgsOCBAQAogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgTUZJRV9UWVBFX1FPU19QQVJBTUVURVI6Ci0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiUW9TIEVycm9yIG5lZWQgdG8gcGFyc2UgUU9TX1BBUkFNRVRFUiBJRVxuIik7CisJCQluZXRkZXZfZXJyKGllZWUtPmRldiwKKwkJCQkgICAiUW9TIEVycm9yIG5lZWQgdG8gcGFyc2UgUU9TX1BBUkFNRVRFUiBJRVxuIik7CiAJCQlicmVhazsKIAogCQljYXNlIE1GSUVfVFlQRV9DT1VOVFJZOgpAQCAtMjE5MiwxMyArMjIwOCw2IEBACiAJc3RydWN0IHJ0bGxpYl9uZXR3b3JrICpuZXR3b3JrLAogCXN0cnVjdCBydGxsaWJfcnhfc3RhdHMgKnN0YXRzKQogewotCi0JLyoKLQluZXR3b3JrLT5xb3NfZGF0YS5hY3RpdmUgPSAwOwotCW5ldHdvcmstPnFvc19kYXRhLnN1cHBvcnRlZCA9IDA7Ci0JbmV0d29yay0+cW9zX2RhdGEucGFyYW1fY291bnQgPSAwOwotCW5ldHdvcmstPnFvc19kYXRhLm9sZF9wYXJhbV9jb3VudCA9IDA7Ci0JKi8KIAltZW1zZXQoJm5ldHdvcmstPnFvc19kYXRhLCAwLCBzaXplb2Yoc3RydWN0IHJ0bGxpYl9xb3NfZGF0YSkpOwogCiAJLyogUHVsbCBvdXQgZml4ZWQgZmllbGQgZGF0YSAqLwpAQCAtMjI5MSw3ICsyMzAwLDggQEAKIAkvKiBBIG5ldHdvcmsgaXMgb25seSBhIGR1cGxpY2F0ZSBpZiB0aGUgY2hhbm5lbCwgQlNTSUQsIEVTU0lECiAJICogYW5kIHRoZSBjYXBhYmlsaXR5IGZpZWxkIChpbiBwYXJ0aWN1bGFyIElCU1MgYW5kIEJTUykgYWxsIG1hdGNoLgogCSAqIFdlIHRyZWF0IGFsbCA8aGlkZGVuPiB3aXRoIHRoZSBzYW1lIEJTU0lEIGFuZCBjaGFubmVsCi0JICogYXMgb25lIG5ldHdvcmsgKi8KKwkgKiBhcyBvbmUgbmV0d29yaworCSAqLwogCXJldHVybiAoKChzcmMtPnNzaWRfbGVuID09IGRzdC0+c3NpZF9sZW4pIHx8ICghc3NpZGJyb2FkKSkgJiYKIAkJKHNyYy0+Y2hhbm5lbCA9PSBkc3QtPmNoYW5uZWwpICYmCiAJCSFtZW1jbXAoc3JjLT5ic3NpZCwgZHN0LT5ic3NpZCwgRVRIX0FMRU4pICYmCkBAIC0yNDIyLDcgKzI0MzIsNyBAQAogc3RhdGljIGludCBJc1Bhc3NpdmVDaGFubmVsKHN0cnVjdCBydGxsaWJfZGV2aWNlICpydGxsaWIsIHU4IGNoYW5uZWwpCiB7CiAJaWYgKE1BWF9DSEFOTkVMX05VTUJFUiA8IGNoYW5uZWwpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogSW52YWxpZCBDaGFubmVsXG4iLCBfX2Z1bmNfXyk7CisJCW5ldGRldl9pbmZvKHJ0bGxpYi0+ZGV2LCAiJXMoKTogSW52YWxpZCBDaGFubmVsXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMjQzNSw3ICsyNDQ1LDcgQEAKIGludCBydGxsaWJfbGVnYWxfY2hhbm5lbChzdHJ1Y3QgcnRsbGliX2RldmljZSAqcnRsbGliLCB1OCBjaGFubmVsKQogewogCWlmIChNQVhfQ0hBTk5FTF9OVU1CRVIgPCBjaGFubmVsKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIiVzKCk6IEludmFsaWQgQ2hhbm5lbFxuIiwgX19mdW5jX18pOworCQluZXRkZXZfaW5mbyhydGxsaWItPmRldiwgIiVzKCk6IEludmFsaWQgQ2hhbm5lbFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHJ0bGxpYi0+YWN0aXZlX2NoYW5uZWxfbWFwW2NoYW5uZWxdID4gMCkKQEAgLTI1MDEsOCArMjUxMSw5IEBACiAJaWYgKFdMQU5fRkNfR0VUX1NUWVBFKGxlMTZfdG9fY3B1KGJlYWNvbi0+aGVhZGVyLmZyYW1lX2N0bCkpID09CiAJICAgIFJUTExJQl9TVFlQRV9QUk9CRV9SRVNQKSB7CiAJCWlmIChJc1Bhc3NpdmVDaGFubmVsKGllZWUsIG5ldHdvcmstPmNoYW5uZWwpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICJHZXRTY2FuSW5mbygpOiBGb3IgR2xvYmFsIERvbWFpbiwgZmlsdGVyIHByb2JlIHJlc3BvbnNlIGF0IGNoYW5uZWwoJWQpLlxuIiwKLQkJCSAgICAgICBuZXR3b3JrLT5jaGFubmVsKTsKKwkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCQkgICAgIkdldFNjYW5JbmZvKCk6IEZvciBHbG9iYWwgRG9tYWluLCBmaWx0ZXIgcHJvYmUgcmVzcG9uc2UgYXQgY2hhbm5lbCglZCkuXG4iLAorCQkJCSAgICBuZXR3b3JrLT5jaGFubmVsKTsKIAkJCWdvdG8gZnJlZV9uZXR3b3JrOwogCQl9CiAJfQpAQCAtMjUxMiwxMCArMjUyMywxMiBAQAogCSAqCiAJICogTk9URTogIFRoaXMgc2VhcmNoIGlzIGRlZmluaXRlbHkgbm90IG9wdGltaXplZC4gIE9uY2UgaXRzIGRvaW5nCiAJICoJdGhlICJyaWdodCB0aGluZyIgd2UnbGwgb3B0aW1pemUgaXQgZm9yIGVmZmljaWVuY3kgaWYKLQkgKgluZWNlc3NhcnkgKi8KKwkgKgluZWNlc3NhcnkKKwkgKi8KIAogCS8qIFNlYXJjaCBmb3IgdGhpcyBlbnRyeSBpbiB0aGUgbGlzdCBhbmQgdXBkYXRlIGl0IGlmIGl0IGlzCi0JICogYWxyZWFkeSB0aGVyZS4gKi8KKwkgKiBhbHJlYWR5IHRoZXJlLgorCSAqLwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAlpZiAoaXNfc2FtZV9uZXR3b3JrKCZpZWVlLT5jdXJyZW50X25ldHdvcmssIG5ldHdvcmssCkBAIC0yNTQ0LDcgKzI1NTcsOCBAQAogCX0KIAogCS8qIElmIHdlIGRpZG4ndCBmaW5kIGEgbWF0Y2gsIHRoZW4gZ2V0IGEgbmV3IG5ldHdvcmsgc2xvdCB0byBpbml0aWFsaXplCi0JICogd2l0aCB0aGlzIGJlYWNvbidzIGluZm9ybWF0aW9uICovCisJICogd2l0aCB0aGlzIGJlYWNvbidzIGluZm9ybWF0aW9uCisJICovCiAJaWYgKCZ0YXJnZXQtPmxpc3QgPT0gJmllZWUtPm5ldHdvcmtfbGlzdCkgewogCQlpZiAobGlzdF9lbXB0eSgmaWVlZS0+bmV0d29ya19mcmVlX2xpc3QpKSB7CiAJCQkvKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBzbG90cywgZXhwaXJlIHRoZSBvbGRlc3QgKi8KQEAgLTI2MTEsNyArMjYyNSw2IEBACiAJfQogZnJlZV9uZXR3b3JrOgogCWtmcmVlKG5ldHdvcmspOwotCXJldHVybjsKIH0KIAogdm9pZCBydGxsaWJfcnhfbWd0KHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl9zb2Z0bWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWMuYwppbmRleCBkOTkyYTc1Li4yM2I3YTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWMuYwpAQCAtNjgsNyArNjgsOCBAQAogCX0KIAogCS8qIFdlIG1heSBhZGQgYW4gb3B0aW9uIGZvciBjdXN0b20gcmF0ZXMgdGhhdCBzcGVjaWZpYyBIVwotCSAqIG1pZ2h0IHN1cHBvcnQgKi8KKwkgKiBtaWdodCBzdXBwb3J0CisJICovCiAJKnRhZ19wID0gdGFnOwogfQogCkBAIC04OSw3ICs5MCw4IEBACiAJCSp0YWcrKyA9IFJUTExJQl9CQVNJQ19SQVRFX01BU0sgfCBSVExMSUJfT0ZETV9SQVRFXzU0TUI7CiAJfQogCS8qIFdlIG1heSBhZGQgYW4gb3B0aW9uIGZvciBjdXN0b20gcmF0ZXMgdGhhdCBzcGVjaWZpYyBIVyBtaWdodAotCSAqIHN1cHBvcnQgKi8KKwkgKiBzdXBwb3J0CisJICovCiAJKnRhZ19wID0gdGFnOwogfQogCkBAIC0xMjQsNyArMTI2LDcgQEAKIAkqdGFnKysgPSAweDAwOwogCiAJKnRhZ19wID0gdGFnOwotCXByaW50ayhLRVJOX0FMRVJUICJUaGlzIGlzIGVuYWJsZSB0dXJibyBtb2RlIElFIHByb2Nlc3NcbiIpOworCW5ldGRldl9hbGVydChpZWVlLT5kZXYsICJUaGlzIGlzIGVuYWJsZSB0dXJibyBtb2RlIElFIHByb2Nlc3NcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBlbnF1ZXVlX21nbXQoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xMzMsOCArMTM1LDcgQEAKIAogCW5oID0gKGllZWUtPm1nbXRfcXVldWVfaGVhZCArIDEpICUgTUdNVF9RVUVVRV9OVU07CiAKLS8qCi0gKiBpZiB0aGUgcXVldWUgaXMgZnVsbCBidXQgd2UgaGF2ZSBuZXdlciBmcmFtZXMgdGhlbgorLyogaWYgdGhlIHF1ZXVlIGlzIGZ1bGwgYnV0IHdlIGhhdmUgbmV3ZXIgZnJhbWVzIHRoZW4KICAqIGp1c3Qgb3ZlcndyaXRlcyB0aGUgb2xkZXN0LgogICoKICAqIGlmIChuaCA9PSBpZWVlLT5tZ210X3F1ZXVlX3RhaWwpCkBAIC0xODgsNyArMTg5LDcgQEAKIAogCWlmIChRdWVyeVJhdGUgPT0gMCkgewogCQlRdWVyeVJhdGUgPSAxMjsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiTm8gQmFzaWNSYXRlIGZvdW5kISFcbiIpOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJObyBCYXNpY1JhdGUgZm91bmQhIVxuIik7CiAJfQogCXJldHVybiBRdWVyeVJhdGU7CiB9CkBAIC0yNzMsMTIgKzI3NCwxNCBAQAogCQlpZiAoIWllZWUtPmNoZWNrX25pY19lbm91Z2hfZGVzYyhpZWVlLT5kZXYsIHRjYl9kZXNjLT5xdWV1ZV9pbmRleCkgfHwKIAkJICAgIChza2JfcXVldWVfbGVuKCZpZWVlLT5za2Jfd2FpdFFbdGNiX2Rlc2MtPnF1ZXVlX2luZGV4XSkgIT0gMCkgfHwKIAkJICAgIChpZWVlLT5xdWV1ZV9zdG9wKSkgewotCQkJLyogaW5zZXJ0IHRoZSBza2IgcGFja2V0IHRvIHRoZSBtYW5hZ2VtZW50IHF1ZXVlICovCi0JCQkvKiBhcyBmb3IgdGhlIGNvbXBsZXRpb24gZnVuY3Rpb24sIGl0IGRvZXMgbm90IG5lZWQKKwkJCS8qIGluc2VydCB0aGUgc2tiIHBhY2tldCB0byB0aGUgbWFuYWdlbWVudCBxdWV1ZQorCQkJICoKKwkJCSAqIGFzIGZvciB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiwgaXQgZG9lcyBub3QgbmVlZAogCQkJICogdG8gY2hlY2sgaXQgYW55IG1vcmUuCi0JCQkgKiAqLwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTppbnNlcnQgdG8gd2FpdHF1ZXVlLCBxdWV1ZV9pbmRleCIKLQkJCSAgICAgICAiOiVkIVxuIiwgX19mdW5jX18sIHRjYl9kZXNjLT5xdWV1ZV9pbmRleCk7CisJCQkgKi8KKwkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCSAgICAgICAiJXMoKTppbnNlcnQgdG8gd2FpdHF1ZXVlLCBxdWV1ZV9pbmRleDolZCFcbiIsCisJCQkgICAgICAgX19mdW5jX18sIHRjYl9kZXNjLT5xdWV1ZV9pbmRleCk7CiAJCQlza2JfcXVldWVfdGFpbCgmaWVlZS0+c2tiX3dhaXRRW3RjYl9kZXNjLT5xdWV1ZV9pbmRleF0sCiAJCQkJICAgICAgIHNrYik7CiAJCX0gZWxzZSB7CkBAIC00MDEsNyArNDA0LDcgQEAKIAogCWlmIChpZWVlLT5iZWFjb25fdHhpbmcgJiYgaWVlZS0+aWVlZV91cCkKIAkJbW9kX3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIsIGppZmZpZXMgKwotCQkJICAoTVNFQ1MoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAtIDUpKSk7CisJCQkgIChtc2Vjc190b19qaWZmaWVzKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwgLSA1KSkpOwogfQogCiAKQEAgLTQxNiw0MCArNDE5LDMzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+YmVhY29uX2xvY2ssIGZsYWdzKTsKIH0KIAotLyoKLSAqIERlc2NyaXB0aW9uOgotICoJICAgICAgRW5hYmxlIG5ldHdvcmsgbW9uaXRvciBtb2RlLCBhbGwgcnggcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLgotICovCisvKiBFbmFibGVzIG5ldHdvcmsgbW9uaXRvciBtb2RlLCBhbGwgcnggcGFja2V0cyB3aWxsIGJlIHJlY2VpdmVkLiAqLwogdm9pZCBydGxsaWJfRW5hYmxlTmV0TW9uaXRvck1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJYm9vbCBiSW5pdFN0YXRlKQogewogCXN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlID0gbmV0ZGV2X3ByaXZfcnNsKGRldik7CiAKLQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT5FbnRlciBNb25pdG9yIE1vZGVcbiIpOworCW5ldGRldl9pbmZvKGRldiwgIj09PT09PT09PkVudGVyIE1vbml0b3IgTW9kZVxuIik7CiAKIAlpZWVlLT5BbGxvd0FsbERlc3RBZGRySGFuZGxlcihkZXYsIHRydWUsICFiSW5pdFN0YXRlKTsKIH0KIAogCi0vKgotICogICAgICBEZXNjcmlwdGlvbjoKLSAqCSAgICAgIERpc2FibGUgbmV0d29yayBuZXR3b3JrIG1vbml0b3IgbW9kZSwgb25seSBwYWNrZXRzIGRlc3RpbmF0ZWQgdG8KLSAqCSAgICAgIHVzIHdpbGwgYmUgcmVjZWl2ZWQuCisvKiBEaXNhYmxlcyBuZXR3b3JrIG1vbml0b3IgbW9kZS4gT25seSBwYWNrZXRzIGRlc3RpbmF0ZWQgdG8KKyAqIHVzIHdpbGwgYmUgcmVjZWl2ZWQuCiAgKi8KIHZvaWQgcnRsbGliX0Rpc2FibGVOZXRNb25pdG9yTW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQlib29sIGJJbml0U3RhdGUpCiB7CiAJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdl9yc2woZGV2KTsKIAotCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PkV4aXQgTW9uaXRvciBNb2RlXG4iKTsKKwluZXRkZXZfaW5mbyhkZXYsICI9PT09PT09PT5FeGl0IE1vbml0b3IgTW9kZVxuIik7CiAKIAlpZWVlLT5BbGxvd0FsbERlc3RBZGRySGFuZGxlcihkZXYsIGZhbHNlLCAhYkluaXRTdGF0ZSk7CiB9CiAKIAotLyoKLSAqIERlc2NyaXB0aW9uOgotICogVGhpcyBlbmFibGVzIHRoZSBzcGVjaWFsaXplZCBwcm9taXNjdW91cyBtb2RlIHJlcXVpcmVkIGJ5IEludGVsLgorLyogRW5hYmxlcyB0aGUgc3BlY2lhbGl6ZWQgcHJvbWlzY3VvdXMgbW9kZSByZXF1aXJlZCBieSBJbnRlbC4KICAqIEluIHRoaXMgbW9kZSwgSW50ZWwgaW50ZW5kcyB0byBoZWFyIHRyYWZmaWNzIGZyb20vdG8gb3RoZXIgU1RBcyBpbiB0aGUKICAqIHNhbWUgQlNTLiBUaGVyZWZvcmUgd2UgZG9uJ3QgaGF2ZSB0byBkaXNhYmxlIGNoZWNraW5nIEJTU0lEIGFuZCB3ZSBvbmx5IG5lZWQKICAqIHRvIGFsbG93IGFsbCBkZXN0LiBCVVQ6IGlmIHdlIGVuYWJsZSBjaGVja2luZyBCU1NJRCB0aGVuIHdlIGNhbid0IHJlY3YKQEAgLTQ2Miw3ICs0NTgsNyBAQAogCiAJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdl9yc2woZGV2KTsKIAotCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PkVudGVyIEludGVsIFByb21pc2N1b3VzIE1vZGVcbiIpOworCW5ldGRldl9pbmZvKGRldiwgIj09PT09PT09PkVudGVyIEludGVsIFByb21pc2N1b3VzIE1vZGVcbiIpOwogCiAJaWVlZS0+QWxsb3dBbGxEZXN0QWRkckhhbmRsZXIoZGV2LCB0cnVlLCAhYkluaXRTdGF0ZSk7CiAJaWVlZS0+U2V0SHdSZWdIYW5kbGVyKGRldiwgSFdfVkFSX0NFQ0hLX0JTU0lELApAQCAtNDczLDEwICs0NjksOCBAQAogRVhQT1JUX1NZTUJPTChydGxsaWJfRW5hYmxlSW50ZWxQcm9taXNjdW91c01vZGUpOwogCiAKLS8qCi0gKiBEZXNjcmlwdGlvbjoKLSAqCSAgICAgIFRoaXMgZGlzYWJsZXMgdGhlIHNwZWNpYWxpemVkIHByb21pc2N1b3VzIG1vZGUgcmVxdWlyZWQgYnkgSW50ZWwuCi0gKgkgICAgICBTZWUgTWdudEVuYWJsZUludGVsUHJvbWlzY3VvdXNNb2RlIGZvciBkZXRhaWwuCisvKiBEaXNhYmxlcyB0aGUgc3BlY2lhbGl6ZWQgcHJvbWlzY3VvdXMgbW9kZSByZXF1aXJlZCBieSBJbnRlbC4KKyAqIFNlZSBNZ250RW5hYmxlSW50ZWxQcm9taXNjdW91c01vZGUgZm9yIGRldGFpbC4KICAqLwogdm9pZCBydGxsaWJfRGlzYWJsZUludGVsUHJvbWlzY3VvdXNNb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCWJvb2wgYkluaXRTdGF0ZSkKQEAgLTQ4NSw3ICs0NzksNyBAQAogCiAJc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdl9yc2woZGV2KTsKIAotCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PkV4aXQgSW50ZWwgUHJvbWlzY3VvdXMgTW9kZVxuIik7CisJbmV0ZGV2X2luZm8oZGV2LCAiPT09PT09PT0+RXhpdCBJbnRlbCBQcm9taXNjdW91cyBNb2RlXG4iKTsKIAogCWllZWUtPkFsbG93QWxsRGVzdEFkZHJIYW5kbGVyKGRldiwgZmFsc2UsICFiSW5pdFN0YXRlKTsKIAlpZWVlLT5TZXRId1JlZ0hhbmRsZXIoZGV2LCBIV19WQVJfQ0VDSEtfQlNTSUQsCkBAIC01NjksNyArNTYzLDggQEAKIAkJaWYgKGllZWUtPnN0YXRlID09IFJUTExJQl9MSU5LRUQpCiAJCQlnb3RvIG91dDsKIAkJaWYgKGllZWUtPnN5bmNfc2Nhbl9odXJyeXVwKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICI9PT09PT09PT09PT0+c3luY19zY2FuX2h1cnJ5dXAgb3V0XG4iKTsKKwkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCQkgICAgIj09PT09PT09PT09PT5zeW5jX3NjYW5faHVycnl1cCBvdXRcbiIpOwogCQkJZ290byBvdXQ7CiAJCX0KIApAQCAtNjE0LDggKzYwOSw5IEBACiAJZG93bigmaWVlZS0+c2Nhbl9zZW0pOwogCiAJaWYgKGllZWUtPmVSRlBvd2VyU3RhdGUgPT0gZVJmT2ZmKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIj09PT09PT4lcygpOnJmIHN0YXRlIGlzIGVSZk9mZiwgcmV0dXJuXG4iLAotCQkgICAgICAgX19mdW5jX18pOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkgICAgIj09PT09PT4lcygpOnJmIHN0YXRlIGlzIGVSZk9mZiwgcmV0dXJuXG4iLAorCQkJICAgIF9fZnVuY19fKTsKIAkJZ290byBvdXQxOwogCX0KIApAQCAtNjM5LDcgKzYzNSw3IEBACiAJCXJ0bGxpYl9zZW5kX3Byb2JlX3JlcXVlc3RzKGllZWUsIDApOwogCiAJcXVldWVfZGVsYXllZF93b3JrX3JzbChpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwKLQkJCSAgICAgICBNU0VDUyhSVExMSUJfU09GVE1BQ19TQ0FOX1RJTUUpKTsKKwkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKFJUTExJQl9TT0ZUTUFDX1NDQU5fVElNRSkpOwogCiAJdXAoJmllZWUtPnNjYW5fc2VtKTsKIAlyZXR1cm47CkBAIC0xMjM4LDggKzEyMzQsOCBAQAogCVBNS0NhY2hlSWR4ID0gU2VjSXNJblBNS0lETGlzdChpZWVlLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQpOwogCWlmIChQTUtDYWNoZUlkeCA+PSAwKSB7CiAJCXdwYV9pZV9sZW4gKz0gMTg7Ci0JCXByaW50ayhLRVJOX0lORk8gIltQTUsgY2FjaGVdOiBXUEEyIElFIGxlbmd0aDogJXhcbiIsCi0JCSAgICAgICB3cGFfaWVfbGVuKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiW1BNSyBjYWNoZV06IFdQQTIgSUUgbGVuZ3RoOiAleFxuIiwKKwkJCSAgICB3cGFfaWVfbGVuKTsKIAl9CiAJbGVuID0gc2l6ZW9mKHN0cnVjdCBydGxsaWJfYXNzb2NfcmVxdWVzdF9mcmFtZSkgKyAyCiAJCSsgYmVhY29uLT5zc2lkX2xlbgpAQCAtMTQxOCw4ICsxNDE0LDkgQEAKIAlpZiAoaWVlZS0+YXNzb2NyZXFfaWVzKQogCQltZW1jcHkoaWVlZS0+YXNzb2NyZXFfaWVzLCBpZXMsIGllZWUtPmFzc29jcmVxX2llc19sZW4pOwogCWVsc2UgewotCQlwcmludGsoS0VSTl9JTkZPICIlcygpV2FybmluZzogY2FuJ3QgYWxsb2MgbWVtb3J5IGZvciBhc3NvY3JlcSIKLQkJICAgICAgICJfaWVzXG4iLCBfX2Z1bmNfXyk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCSAgICAiJXMoKVdhcm5pbmc6IGNhbid0IGFsbG9jIG1lbW9yeSBmb3IgYXNzb2NyZXFfaWVzXG4iLAorCQkJICAgIF9fZnVuY19fKTsKIAkJaWVlZS0+YXNzb2NyZXFfaWVzX2xlbiA9IDA7CiAJfQogCXJldHVybiBza2I7CkBAIC0xNDc0LDcgKzE0NzEsNyBAQAogCWlmICghc2tiKQogCQlydGxsaWJfYXNzb2NpYXRlX2Fib3J0KGllZWUpOwogCWVsc2UgewotCQlpZWVlLT5zdGF0ZSA9IFJUTExJQl9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyA7CisJCWllZWUtPnN0YXRlID0gUlRMTElCX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HOwogCQlSVExMSUJfREVCVUdfTUdNVCgiU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0XG4iKTsKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKIAkJaWYgKCF0aW1lcl9wZW5kaW5nKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpKSB7CkBAIC0xNTAzLDggKzE1MDAsNyBAQAogCQkqKGMrKykgPSBjaGxlbjsKIAkJbWVtY3B5KGMsIGNoYWxsZW5nZSwgY2hsZW4pOwogCi0JCVJUTExJQl9ERUJVR19NR01UKCJTZW5kaW5nIGF1dGhlbnRpY2F0aW9uIGNoYWxsZW5nZSAiCi0JCQkJICAicmVzcG9uc2VcbiIpOworCQlSVExMSUJfREVCVUdfTUdNVCgiU2VuZGluZyBhdXRoZW50aWNhdGlvbiBjaGFsbGVuZ2UgcmVzcG9uc2VcbiIpOwogCiAJCXJ0bGxpYl9lbmNyeXB0X2ZyYWdtZW50KGllZWUsIHNrYiwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBydGxsaWJfaGRyXzNhZGRyKSk7CkBAIC0xNTQzLDkgKzE1MzksOSBAQAogCQkJCSAgICAgYXNzb2NpYXRlX2NvbXBsZXRlX3dxKTsKIAlzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqcFBTQyA9IChzdHJ1Y3QgcnRfcHdyX3NhdmVfY3RybCAqKQogCQkJCQkoJihpZWVlLT5Qb3dlclNhdmVDb250cm9sKSk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiQXNzb2NpYXRlZCBzdWNjZXNzZnVsbHlcbiIpOworCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIkFzc29jaWF0ZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKIAlpZiAoIWllZWUtPmlzX3NpbGVudF9yZXNldCkgewotCQlwcmludGsoS0VSTl9JTkZPICJub3JtYWwgYXNzb2NpYXRlXG4iKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAibm9ybWFsIGFzc29jaWF0ZVxuIik7CiAJCW5vdGlmeV93eF9hc3NvY19ldmVudChpZWVlKTsKIAl9CiAKQEAgLTE1NTQsMjAgKzE1NTAsMjAgQEAKIAlpZiAocnRsbGliX2lzXzU0ZygmaWVlZS0+Y3VycmVudF9uZXR3b3JrKSAmJgogCSAgIChpZWVlLT5tb2R1bGF0aW9uICYgUlRMTElCX09GRE1fTU9EVUxBVElPTikpIHsKIAkJaWVlZS0+cmF0ZSA9IDEwODsKLQkJcHJpbnRrKEtFUk5fSU5GTyJVc2luZyBHIHJhdGVzOiVkXG4iLCBpZWVlLT5yYXRlKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiVXNpbmcgRyByYXRlczolZFxuIiwgaWVlZS0+cmF0ZSk7CiAJfSBlbHNlIHsKIAkJaWVlZS0+cmF0ZSA9IDIyOwogCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0IpOwotCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEIgcmF0ZXM6JWRcbiIsIGllZWUtPnJhdGUpOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJVc2luZyBCIHJhdGVzOiVkXG4iLCBpZWVlLT5yYXRlKTsKIAl9CiAJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ICYmIGllZWUtPnBIVEluZm8tPmJFbmFibGVIVCkgewotCQlwcmludGsoS0VSTl9JTkZPICJTdWNjZXNzZnVsbHkgYXNzb2NpYXRlZCwgaHQgZW5hYmxlZFxuIik7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIlN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkLCBodCBlbmFibGVkXG4iKTsKIAkJSFRPbkFzc29jUnNwKGllZWUpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIlN1Y2Nlc3NmdWxseSBhc3NvY2lhdGVkLCBodCBub3QgIgotCQkgICAgICAgImVuYWJsZWQoJWQsICVkKVxuIiwKLQkJICAgICAgIGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0LAotCQkgICAgICAgaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJICAgICJTdWNjZXNzZnVsbHkgYXNzb2NpYXRlZCwgaHQgbm90IGVuYWJsZWQoJWQsICVkKVxuIiwKKwkJCSAgICBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCwKKwkJCSAgICBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQpOwogCQltZW1zZXQoaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgMCwgMTYpOwogCX0KIAlpZWVlLT5MaW5rRGV0ZWN0SW5mby5TbG90TnVtID0gMiAqICgxICsKQEAgLTE1ODIsNyArMTU3OCw3IEBACiAJaWVlZS0+bGlua19jaGFuZ2UoaWVlZS0+ZGV2KTsKIAogCWlmIChpZWVlLT5pc19zaWxlbnRfcmVzZXQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAic2lsZW50IHJlc2V0IGFzc29jaWF0ZVxuIik7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgInNpbGVudCByZXNldCBhc3NvY2lhdGVcbiIpOwogCQlpZWVlLT5pc19zaWxlbnRfcmVzZXQgPSBmYWxzZTsKIAl9CiAKQEAgLTE2MjMsOCArMTYxOSw5IEBACiAJCSBpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCk7CiAJSFRTZXRDb25uZWN0QndNb2RlKGllZWUsIEhUX0NIQU5ORUxfV0lEVEhfMjAsIEhUX0VYVENITkxfT0ZGU0VUX05PX0VYVCk7CiAJaWYgKGllZWUtPmVSRlBvd2VyU3RhdGUgPT0gZVJmT2ZmKSB7Ci0JCVJUX1RSQUNFKENPTVBfREJHLCAiPT09PT09PT09PT09PT4lcygpOlJmIHN0YXRlIGlzIGVSZk9mZiwiCi0JCQkgIiBzY2hlZHVsZSBpcHNsZWF2ZSB3cSBhZ2FpbixyZXR1cm5cbiIsIF9fZnVuY19fKTsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsCisJCQkgIj09PT09PT09PT09PT0+JXMoKTpSZiBzdGF0ZSBpcyBlUmZPZmYsIHNjaGVkdWxlIGlwc2xlYXZlIHdxIGFnYWluLHJldHVyblxuIiwKKwkJCSBfX2Z1bmNfXyk7CiAJCWlmIChpZWVlLT5ydGxsaWJfaXBzX2xlYXZlX3dxICE9IE5VTEwpCiAJCQlpZWVlLT5ydGxsaWJfaXBzX2xlYXZlX3dxKGllZWUtPmRldik7CiAJCXVwKCZpZWVlLT53eF9zZW0pOwpAQCAtMTcwNSw4ICsxNzAyLDggQEAKIAkJICAgKCFhcHNldCAmJiBzc2lkc2V0ICYmIHNzaWRicm9hZCAmJiBzc2lkbWF0Y2gpIHx8CiAJCSAgIChpZWVlLT5pc19yb2FtaW5nICYmIHNzaWRzZXQgJiYgc3NpZGJyb2FkICYmIHNzaWRtYXRjaCkpIHsKIAkJCS8qIGlmIHRoZSBlc3NpZCBpcyBoaWRkZW4gcmVwbGFjZSBpdCB3aXRoIHRoZQotCQkJKiBlc3NpZCBwcm92aWRlZCBieSB0aGUgdXNlci4KLQkJCSovCisJCQkgKiBlc3NpZCBwcm92aWRlZCBieSB0aGUgdXNlci4KKwkJCSAqLwogCQkJaWYgKCFzc2lkYnJvYWQpIHsKIAkJCQlzdHJuY3B5KHRtcF9zc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwKIAkJCQkJSVdfRVNTSURfTUFYX1NJWkUpOwpAQCAtMTcxOSwxNSArMTcxNiwxNSBAQAogCQkJCQlJV19FU1NJRF9NQVhfU0laRSk7CiAJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gdG1wX3NzaWRfbGVuOwogCQkJfQotCQkJcHJpbnRrKEtFUk5fSU5GTyJMaW5raW5nIHdpdGggJXMsY2hhbm5lbDolZCwgcW9zOiVkLCAiCi0JCQkgICAgICAgIm15SFQ6JWQsIG5ldHdvcmtIVDolZCwgbW9kZToleCBjdXJfbmV0LmZsYWdzIgotCQkJICAgICAgICI6MHgleFxuIiwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsCi0JCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwsCi0JCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLnN1cHBvcnRlZCwKLQkJCSAgICAgICBpZWVlLT5wSFRJbmZvLT5iRW5hYmxlSFQsCi0JCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2h0LmJkU3VwcG9ydEhULAotCQkJICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlLAotCQkJICAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5mbGFncyk7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJICAgICJMaW5raW5nIHdpdGggJXMsY2hhbm5lbDolZCwgcW9zOiVkLCBteUhUOiVkLCBuZXR3b3JrSFQ6JWQsIG1vZGU6JXggY3VyX25ldC5mbGFnczoweCV4XG4iLAorCQkJCSAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwKKwkJCQkgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwsCisJCQkJICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5zdXBwb3J0ZWQsCisJCQkJICAgIGllZWUtPnBIVEluZm8tPmJFbmFibGVIVCwKKwkJCQkgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2h0LmJkU3VwcG9ydEhULAorCQkJCSAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSwKKwkJCQkgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmZsYWdzKTsKIAogCQkJaWYgKChydGxsaWJfYWN0X3NjYW5uaW5nKGllZWUsIGZhbHNlKSkgJiYKIAkJCSAgICEoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TQ0FOKSkKQEAgLTE3NTgsMTEgKzE3NTUsMTEgQEAKIAkJCQkJKGllZWUtPm1vZHVsYXRpb24gJiBSVExMSUJfT0ZETV9NT0RVTEFUSU9OKSkgewogCQkJCQlpZWVlLT5yYXRlID0gMTA4OwogCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0cpOwotCQkJCQlwcmludGsoS0VSTl9JTkZPIlVzaW5nIEcgcmF0ZXNcbiIpOworCQkJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJVc2luZyBHIHJhdGVzXG4iKTsKIAkJCQl9IGVsc2UgewogCQkJCQlpZWVlLT5yYXRlID0gMjI7CiAJCQkJCWllZWUtPlNldFdpcmVsZXNzTW9kZShpZWVlLT5kZXYsIElFRUVfQik7Ci0JCQkJCXByaW50ayhLRVJOX0lORk8iVXNpbmcgQiByYXRlc1xuIik7CisJCQkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIlVzaW5nIEIgcmF0ZXNcbiIpOwogCQkJCX0KIAkJCQltZW1zZXQoaWVlZS0+ZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgMCwgMTYpOwogCQkJCWllZWUtPnN0YXRlID0gUlRMTElCX0xJTktFRDsKQEAgLTE5NjUsNyArMTk2Miw3IEBACiAJaWYgKGFzc29jX3JxX3BhcnNlKHNrYiwgZGVzdCkgIT0gLTEpCiAJCXJ0bGxpYl9yZXNwX3RvX2Fzc29jX3JxKGllZWUsIGRlc3QpOwogCi0JcHJpbnRrKEtFUk5fSU5GTyJOZXcgY2xpZW50IGFzc29jaWF0ZWQ6ICVwTVxuIiwgZGVzdCk7CisJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiTmV3IGNsaWVudCBhc3NvY2lhdGVkOiAlcE1cbiIsIGRlc3QpOwogfQogCiB2b2lkIHJ0bGxpYl9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzaG9ydCBwd3IpCkBAIC0yMDA0LDEzICsyMDAxLDE2IEBACiAJdGltZW91dCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWw7CiAJaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fZGF0YSA9IFJUTExJQl9EVElNX0lOVkFMSUQ7CiAJLyogdGhlcmUncyBubyBuZWVkIHRvIG5vZml0eSBBUCB0aGF0IEkgZmluZCB5b3UgYnVmZmVyZWQKLQkgKiB3aXRoIGJyb2FkY2FzdCBwYWNrZXQgKi8KKwkgKiB3aXRoIGJyb2FkY2FzdCBwYWNrZXQKKwkgKi8KIAlpZiAoZHRpbSAmIChSVExMSUJfRFRJTV9VQ0FTVCAmIGllZWUtPnBzKSkKIAkJcmV0dXJuIDI7CiAKLQlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywgaWVlZS0+ZGV2LT50cmFuc19zdGFydCArIE1TRUNTKHRpbWVvdXQpKSkKKwlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywKKwkJCWllZWUtPmRldi0+dHJhbnNfc3RhcnQgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpKSkKIAkJcmV0dXJuIDA7Ci0JaWYgKCF0aW1lX2FmdGVyKGppZmZpZXMsIGllZWUtPmxhc3RfcnhfcHNfdGltZSArIE1TRUNTKHRpbWVvdXQpKSkKKwlpZiAoIXRpbWVfYWZ0ZXIoamlmZmllcywKKwkJCWllZWUtPmxhc3RfcnhfcHNfdGltZSArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpKQogCQlyZXR1cm4gMDsKIAlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0lOR0xFX1FVRVVFKSAmJgogCSAgICAoaWVlZS0+bWdtdF9xdWV1ZV90YWlsICE9IGllZWUtPm1nbXRfcXVldWVfaGVhZCkpCkBAIC0yMDYwLDcgKzIwNjAsNyBAQAogCQkJfQogCiAJCSp0aW1lID0gaWVlZS0+Y3VycmVudF9uZXR3b3JrLmxhc3RfZHRpbV9zdGFfdGltZQotCQkJKyBNU0VDUyhpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsICoKKwkJCSsgbXNlY3NfdG9famlmZmllcyhpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsICoKIAkJCUxQU0F3YWtlSW50dmxfdG1wKTsKIAl9CiAJfQpAQCAtMjA4MSwxMCArMjA4MSw5IEBACiAJaWYgKChpZWVlLT5wcyA9PSBSVExMSUJfUFNfRElTQUJMRUQgfHwKIAkgICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSB8fAogCSAgICAgaWVlZS0+c3RhdGUgIT0gUlRMTElCX0xJTktFRCkpIHsKLQkJUlRfVFJBQ0UoQ09NUF9EQkcsICI9PT09PT4lcygpOiBubyBuZWVkIHRvIHBzLHdha2UgdXAhISAiCi0JCQkgImllZWUtPnBzIGlzICVkLCBpZWVlLT5pd19tb2RlIGlzICVkLCBpZWVlLT5zdGF0ZSIKLQkJCSAiIGlzICVkXG4iLCBfX2Z1bmNfXywgaWVlZS0+cHMsIGllZWUtPml3X21vZGUsCi0JCQkgIGllZWUtPnN0YXRlKTsKKwkJUlRfVFJBQ0UoQ09NUF9EQkcsCisJCQkgIj09PT09PiVzKCk6IG5vIG5lZWQgdG8gcHMsd2FrZSB1cCEhIGllZWUtPnBzIGlzICVkLCBpZWVlLT5pd19tb2RlIGlzICVkLCBpZWVlLT5zdGF0ZSBpcyAlZFxuIiwKKwkJCSBfX2Z1bmNfXywgaWVlZS0+cHMsIGllZWUtPml3X21vZGUsIGllZWUtPnN0YXRlKTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKIAkJcnRsbGliX3N0YV93YWtldXAoaWVlZSwgMSk7CiAKQEAgLTIxOTksOCArMjE5OCw4IEBACiAJdTggY2F0ZWdvcnkgPSAwOwogCiAJaWYgKGFjdCA9PSBOVUxMKSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiZXJyb3IgdG8gZ2V0IHBheWxvYWQgb2YgIgotCQkJICAgICAiYWN0aW9uIGZyYW1lXG4iKTsKKwkJUlRMTElCX0RFQlVHKFJUTExJQl9ETF9FUlIsCisJCQkgICAgICJlcnJvciB0byBnZXQgcGF5bG9hZCBvZiBhY3Rpb24gZnJhbWVcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yMjIzLDcgKzIyMjIsNiBAQAogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KLQlyZXR1cm47CiB9CiAKIGlubGluZSBpbnQgcnRsbGliX3J4X2Fzc29jX3Jlc3Aoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IsCkBAIC0yMjg1LDE2ICsyMjgzLDE4IEBACiAJCQkJbWVtY3B5KGllZWUtPmFzc29jcmVzcF9pZXMsIGllcywKIAkJCQkgICAgICAgaWVlZS0+YXNzb2NyZXNwX2llc19sZW4pOwogCQkJZWxzZSB7Ci0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMoKVdhcm5pbmc6IGNhbid0IGFsbG9jICIKLQkJCQkgICAgICAgIm1lbW9yeSBmb3IgYXNzb2NyZXNwX2llc1xuIiwgX19mdW5jX18pOworCQkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwKKwkJCQkJICAgICIlcygpV2FybmluZzogY2FuJ3QgYWxsb2MgbWVtb3J5IGZvciBhc3NvY3Jlc3BfaWVzXG4iLAorCQkJCQkgICAgX19mdW5jX18pOwogCQkJCWllZWUtPmFzc29jcmVzcF9pZXNfbGVuID0gMDsKIAkJCX0KIAkJCXJ0bGxpYl9hc3NvY2lhdGVfY29tcGxldGUoaWVlZSk7CiAJCX0gZWxzZSB7CiAJCQkvKiBhaWQgY291bGQgbm90IGJlZW4gYWxsb2NhdGVkICovCiAJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2Fzc19lcnIrKzsKLQkJCXByaW50ayhLRVJOX0lORk8gIkFzc29jaWF0aW9uIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXhcbiIsCi0JCQkJZXJyY29kZSk7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJICAgICJBc3NvY2lhdGlvbiByZXNwb25zZSBzdGF0dXMgY29kZSAweCV4XG4iLAorCQkJCSAgICBlcnJjb2RlKTsKIAkJCVJUTExJQl9ERUJVR19NR01UKAogCQkJCSJBc3NvY2lhdGlvbiByZXNwb25zZSBzdGF0dXMgY29kZSAweCV4XG4iLAogCQkJCWVycmNvZGUpOwpAQCAtMjMwOCw3MiArMjMwOCw3MSBAQAogCXJldHVybiAwOwogfQogCi1pbmxpbmUgaW50IHJ0bGxpYl9yeF9hdXRoKHN0cnVjdCBydGxsaWJfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICBzdHJ1Y3QgcnRsbGliX3J4X3N0YXRzICpyeF9zdGF0cykKK3N0YXRpYyB2b2lkIHJ0bGxpYl9yeF9hdXRoX3Jlc3Aoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdTE2IGVycmNvZGU7CiAJdTggKmNoYWxsZW5nZTsKIAlpbnQgY2hsZW4gPSAwOwogCWJvb2wgYlN1cHBvcnRObW9kZSA9IHRydWUsIGJIYWxmU3VwcG9ydE5tb2RlID0gZmFsc2U7CiAKKwllcnJjb2RlID0gYXV0aF9wYXJzZShza2IsICZjaGFsbGVuZ2UsICZjaGxlbik7CisKKwlpZiAoZXJyY29kZSkgeworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfZXJyKys7CisJCVJUTExJQl9ERUJVR19NR01UKCJBdXRoZW50aWNhdGlvbiByZXNwb3NlIHN0YXR1cyBjb2RlIDB4JXgiLAorCQkJCSAgZXJyY29kZSk7CisKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJICAgICJBdXRoZW50aWNhdGlvbiByZXNwb3NlIHN0YXR1cyBjb2RlIDB4JXgiLCBlcnJjb2RlKTsKKwkJcnRsbGliX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpZWVlLT5vcGVuX3dlcCB8fCAhY2hhbGxlbmdlKSB7CisJCWllZWUtPnN0YXRlID0gUlRMTElCX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FURUQ7CisJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19vaysrOworCQlpZiAoIShpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX1BVUkVfTl9NT0RFKSkgeworCQkJaWYgKCFpZWVlLT5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyhpZWVlLT5kZXYpKSB7CisJCQkJaWYgKElzSFRIYWxmTm1vZGVBUHMoaWVlZSkpIHsKKwkJCQkJYlN1cHBvcnRObW9kZSA9IHRydWU7CisJCQkJCWJIYWxmU3VwcG9ydE5tb2RlID0gdHJ1ZTsKKwkJCQl9IGVsc2UgeworCQkJCQliU3VwcG9ydE5tb2RlID0gZmFsc2U7CisJCQkJCWJIYWxmU3VwcG9ydE5tb2RlID0gZmFsc2U7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIER1bW15IHdpcmxlc3MgbW9kZSBzZXR0aW5nIHRvIGF2b2lkIGVuY3J5cHRpb24gaXNzdWUgKi8KKwkJaWYgKGJTdXBwb3J0Tm1vZGUpIHsKKwkJCWllZWUtPlNldFdpcmVsZXNzTW9kZShpZWVlLT5kZXYsCisJCQkJCSAgICAgIGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlKTsKKwkJfSBlbHNlIHsKKwkJCS8qVE9ETyovCisJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0cpOworCQl9CisKKwkJaWYgKChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHKSAmJgorCQkgICAgYkhhbGZTdXBwb3J0Tm1vZGUpIHsKKwkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIj09PT09PT5lbnRlciBoYWxmIE4gbW9kZVxuIik7CisJCQlpZWVlLT5iSGFsZldpcmVsZXNzTjI0R01vZGUgPSB0cnVlOworCQl9IGVsc2UgeworCQkJaWVlZS0+YkhhbGZXaXJlbGVzc04yNEdNb2RlID0gZmFsc2U7CisJCX0KKwkJcnRsbGliX2Fzc29jaWF0ZV9zdGVwMihpZWVlKTsKKwl9IGVsc2UgeworCQlydGxsaWJfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLCAgY2hsZW4pOworCX0KK30KKworaW5saW5lIGludCBydGxsaWJfcnhfYXV0aChzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgc3RydWN0IHJ0bGxpYl9yeF9zdGF0cyAqcnhfc3RhdHMpCit7CisKIAlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpIHsKIAkJaWYgKGllZWUtPnN0YXRlID09IFJUTExJQl9BU1NPQ0lBVElOR19BVVRIRU5USUNBVElORyAmJgogCQkgICAgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSkpIHsKIAkJCVJUTExJQl9ERUJVR19NR01UKCJSZWNlaXZlZCBhdXRoZW50aWNhdGlvbiByZXNwb25zZSIpOwotCi0JCQllcnJjb2RlID0gYXV0aF9wYXJzZShza2IsICZjaGFsbGVuZ2UsICZjaGxlbik7Ci0JCQlpZiAoMCA9PSBlcnJjb2RlKSB7Ci0JCQkJaWYgKGllZWUtPm9wZW5fd2VwIHx8ICFjaGFsbGVuZ2UpIHsKLQkJCQkJaWVlZS0+c3RhdGUgPSBSVExMSUJfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRDsKLQkJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hdXRoX3JzX29rKys7Ci0JCQkJCWlmICghKGllZWUtPnBIVEluZm8tPklPVEFjdGlvbiAmCi0JCQkJCSAgICBIVF9JT1RfQUNUX1BVUkVfTl9NT0RFKSkgewotCQkJCQkJaWYgKCFpZWVlLT5HZXRObW9kZVN1cHBvcnRCeVNlY0NmZyhpZWVlLT5kZXYpKSB7Ci0JCQkJCQkJaWYgKElzSFRIYWxmTm1vZGVBUHMoaWVlZSkpIHsKLQkJCQkJCQkJYlN1cHBvcnRObW9kZSA9IHRydWU7Ci0JCQkJCQkJCWJIYWxmU3VwcG9ydE5tb2RlID0gdHJ1ZTsKLQkJCQkJCQl9IGVsc2UgewotCQkJCQkJCQliU3VwcG9ydE5tb2RlID0gZmFsc2U7Ci0JCQkJCQkJCWJIYWxmU3VwcG9ydE5tb2RlID0gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8qIER1bW15IHdpcmxlc3MgbW9kZSBzZXR0aW5nIHRvIGF2b2lkCi0JCQkJCSAqIGVuY3J5cHRpb24gaXNzdWUgKi8KLQkJCQkJaWYgKGJTdXBwb3J0Tm1vZGUpIHsKLQkJCQkJCWllZWUtPlNldFdpcmVsZXNzTW9kZShpZWVlLT5kZXYsCi0JCQkJCQkgICBpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQkvKlRPRE8qLwotCQkJCQkJaWVlZS0+U2V0V2lyZWxlc3NNb2RlKGllZWUtPmRldiwKLQkJCQkJCQkJICAgICAgSUVFRV9HKTsKLQkJCQkJfQotCi0JCQkJCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PQotCQkJCQkgICAgSUVFRV9OXzI0RyAmJiBiSGFsZlN1cHBvcnRObW9kZSkgewotCQkJCQkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PmVudGVyICIKLQkJCQkJCSAgICAgICAiaGFsZiBOIG1vZGVcbiIpOwotCQkJCQkJaWVlZS0+YkhhbGZXaXJlbGVzc04yNEdNb2RlID0KLQkJCQkJCQkJCSB0cnVlOwotCQkJCQl9IGVsc2UKLQkJCQkJCWllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZSA9Ci0JCQkJCQkJCQkgZmFsc2U7Ci0KLQkJCQkJcnRsbGliX2Fzc29jaWF0ZV9zdGVwMihpZWVlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlydGxsaWJfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLAotCQkJCQkJCSAgICAgIGNobGVuKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19lcnIrKzsKLQkJCQlSVExMSUJfREVCVUdfTUdNVCgiQXV0aGVudGljYXRpb24gcmVzcG9zZSIKLQkJCQkJCSAgIiBzdGF0dXMgY29kZSAweCV4IiwgZXJyY29kZSk7Ci0KLQkJCQlwcmludGsoS0VSTl9JTkZPICJBdXRoZW50aWNhdGlvbiByZXNwb3NlICIKLQkJCQkgICAgICAgInN0YXR1cyBjb2RlIDB4JXgiLCBlcnJjb2RlKTsKLQkJCQlydGxsaWJfYXNzb2NpYXRlX2Fib3J0KGllZWUpOwotCQkJfQotCisJCQlydGxsaWJfcnhfYXV0aF9yZXNwKGllZWUsIHNrYik7CiAJCX0gZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgewogCQkJcnRsbGliX3J4X2F1dGhfcnEoaWVlZSwgc2tiKTsKIAkJfQpAQCAtMjM4OSwxNSArMjM4OCwxNSBAQAogCQlyZXR1cm4gMDsKIAogCS8qIEZJWE1FIGZvciBub3cgcmVwZWF0IGFsbCB0aGUgYXNzb2NpYXRpb24gcHJvY2VkdXJlCi0JKiBib3RoIGZvciBkaXNhc3NvY2lhdGlvbiBhbmQgZGVhdXRoZW50aWNhdGlvbgotCSovCisJICogYm90aCBmb3IgZGlzYXNzb2NpYXRpb24gYW5kIGRlYXV0aGVudGljYXRpb24KKwkgKi8KIAlpZiAoKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfQVNTT0NJQVRFKSAmJgogCSAgICBpZWVlLT5zdGF0ZSA9PSBSVExMSUJfTElOS0VEICYmCiAJICAgIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT0+cmVjZWl2ZWQgZGlzYXNzb2MvZGVhdXRoKCV4KSAiCi0JCSAgICAgICAiZnJhbWUsIHJlYXNvbiBjb2RlOiV4XG4iLAotCQkgICAgICAgV0xBTl9GQ19HRVRfU1RZUEUoaGVhZGVyLT5mcmFtZV9jdGwpLAotCQkgICAgICAgKChzdHJ1Y3QgcnRsbGliX2Rpc2Fzc29jICopc2tiLT5kYXRhKS0+cmVhc29uKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LAorCQkJICAgICI9PT09PT09PT09PnJlY2VpdmVkIGRpc2Fzc29jL2RlYXV0aCgleCkgZnJhbWUsIHJlYXNvbiBjb2RlOiV4XG4iLAorCQkJICAgIFdMQU5fRkNfR0VUX1NUWVBFKGhlYWRlci0+ZnJhbWVfY3RsKSwKKwkJCSAgICAoKHN0cnVjdCBydGxsaWJfZGlzYXNzb2MgKilza2ItPmRhdGEpLT5yZWFzb24pOwogCQlpZWVlLT5zdGF0ZSA9IFJUTExJQl9BU1NPQ0lBVElORzsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy5yZWFzc29jKys7CiAJCWllZWUtPmlzX3JvYW1pbmcgPSB0cnVlOwpAQCAtMjQ1MCw3ICsyNDQ5LDYgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC0xOwotCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDk0LDE2ICsyNDkyLDE3IEBACiAJCWllZWUtPnN0YXRzLm11bHRpY2FzdCsrOwogCiAJLyogaWYgeG1pdCBhdmFpbGFibGUsIGp1c3QgeG1pdCBpdCBpbW1lZGlhdGVseSwgZWxzZSBqdXN0IGluc2VydCBpdCB0bwotCSAqIHRoZSB3YWl0IHF1ZXVlICovCisJICogdGhlIHdhaXQgcXVldWUKKwkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgdHhiLT5ucl9mcmFnczsgaSsrKSB7CiAJCXF1ZXVlX2xlbiA9IHNrYl9xdWV1ZV9sZW4oJmllZWUtPnNrYl93YWl0UVtxdWV1ZV9pbmRleF0pOwotCQlpZiAoKHF1ZXVlX2xlbiAgIT0gMCkgfHxcCisJCWlmICgocXVldWVfbGVuICAhPSAwKSB8fAogCQkgICAgKCFpZWVlLT5jaGVja19uaWNfZW5vdWdoX2Rlc2MoaWVlZS0+ZGV2LCBxdWV1ZV9pbmRleCkpIHx8CiAJCSAgICAoaWVlZS0+cXVldWVfc3RvcCkpIHsKLQkJCS8qIGluc2VydCB0aGUgc2tiIHBhY2tldCB0byB0aGUgd2FpdCBxdWV1ZSAqLwotCQkJLyogYXMgZm9yIHRoZSBjb21wbGV0aW9uIGZ1bmN0aW9uLCBpdCBkb2VzIG5vdCBuZWVkCisJCQkvKiBpbnNlcnQgdGhlIHNrYiBwYWNrZXQgdG8gdGhlIHdhaXQgcXVldWUKKwkJCSAqIGFzIGZvciB0aGUgY29tcGxldGlvbiBmdW5jdGlvbiwgaXQgZG9lcyBub3QgbmVlZAogCQkJICogdG8gY2hlY2sgaXQgYW55IG1vcmUuCi0JCQkgKiAqLworCQkJICovCiAJCQlpZiAocXVldWVfbGVuIDwgMjAwKQogCQkJCXNrYl9xdWV1ZV90YWlsKCZpZWVlLT5za2Jfd2FpdFFbcXVldWVfaW5kZXhdLAogCQkJCQkgICAgICAgdHhiLT5mcmFnbWVudHNbaV0pOwpAQCAtMjUzMywxMyArMjUzMiwxMiBAQAogCQlpZiAoaWVlZS0+cXVldWVfc3RvcCkgewogCQkJaWVlZS0+dHhfcGVuZGluZy5mcmFnID0gaTsKIAkJCXJldHVybjsKLQkJfSBlbHNlIHsKLQotCQkJaWVlZS0+c29mdG1hY19kYXRhX2hhcmRfc3RhcnRfeG1pdCgKLQkJCQlpZWVlLT50eF9wZW5kaW5nLnR4Yi0+ZnJhZ21lbnRzW2ldLAotCQkJCWllZWUtPmRldiwgaWVlZS0+cmF0ZSk7Ci0JCQlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCX0KKworCQlpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0KAorCQkJaWVlZS0+dHhfcGVuZGluZy50eGItPmZyYWdtZW50c1tpXSwKKwkJCWllZWUtPmRldiwgaWVlZS0+cmF0ZSk7CisJCWllZWUtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAl9CiAKIAlydGxsaWJfdHhiX2ZyZWUoaWVlZS0+dHhfcGVuZGluZy50eGIpOwpAQCAtMjY4OCw3ICsyNjg2LDcgQEAKIAkgKiBvbiB0aGUgc2VtYXBob3JlCiAJICovCiAJaWYgKCFpZWVlLT5wcm90b19zdGFydGVkKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT1vaCBkcml2ZXIgZG93biByZXR1cm5cbiIpOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICI9PT09PT09PT09b2ggZHJpdmVyIGRvd24gcmV0dXJuXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlkb3duKCZpZWVlLT53eF9zZW0pOwpAQCAtMjcyNCw3ICsyNzIyLDcgQEAKIAogCS8qIHRoZSBuZXR3b3JrIGRlZmluaXRpdmVseSBpcyBub3QgaGVyZS4uIGNyZWF0ZSBhIG5ldyBjZWxsICovCiAJaWYgKGllZWUtPnN0YXRlID09IFJUTExJQl9OT0xJTkspIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiY3JlYXRpbmcgbmV3IElCU1MgY2VsbFxuIik7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgImNyZWF0aW5nIG5ldyBJQlNTIGNlbGxcbiIpOwogCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9IGllZWUtPklic3NTdGFydENobmw7CiAJCWlmICghaWVlZS0+d2FwX3NldCkKIAkJCXJ0bGxpYl9yYW5kb21pemVfY2VsbChpZWVlKTsKQEAgLTI3NzgsNyArMjc3Niw3IEBACiAJCWllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ID0gV0xBTl9DQVBBQklMSVRZX0lCU1M7CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXMoKTogaWVlZS0+bW9kZSA9ICVkXG4iLCBfX2Z1bmNfXywgaWVlZS0+bW9kZSk7CisJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiJXMoKTogaWVlZS0+bW9kZSA9ICVkXG4iLCBfX2Z1bmNfXywgaWVlZS0+bW9kZSk7CiAJaWYgKChpZWVlLT5tb2RlID09IElFRUVfTl8yNEcpIHx8IChpZWVlLT5tb2RlID09IElFRUVfTl81RykpCiAJCUhUVXNlRGVmYXVsdFNldHRpbmcoaWVlZSk7CiAJZWxzZQpAQCAtMjgwOCw3ICsyODA2LDggQEAKIAogaW5saW5lIHZvaWQgcnRsbGliX3N0YXJ0X2lic3Moc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCiB7Ci0JcXVldWVfZGVsYXllZF93b3JrX3JzbChpZWVlLT53cSwgJmllZWUtPnN0YXJ0X2lic3Nfd3EsIE1TRUNTKDE1MCkpOworCXF1ZXVlX2RlbGF5ZWRfd29ya19yc2woaWVlZS0+d3EsICZpZWVlLT5zdGFydF9pYnNzX3dxLAorCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMTUwKSk7CiB9CiAKIC8qIHRoaXMgaXMgY2FsbGVkIG9ubHkgaW4gdXNlciBjb250ZXh0LCB3aXRoIHd4X3NlbSBoZWxkICovCkBAIC0yODgxLDE4ICsyODgwLDE4IEBACiAJCWdvdG8gZXhpdDsKIAogCS8qIHVudGlsIHdlIGRvIG5vdCBzZXQgdGhlIHN0YXRlIHRvIFJUTExJQl9OT0xJTksKLQkqIHRoZXJlIGFyZSBubyBwb3NzaWJpbGl0eSB0byBoYXZlIHNvbWVvbmUgZWxzZSB0cnlpbmcKLQkqIHRvIHN0YXJ0IGFuIGFzc29jaWF0aW9uIHByb2NlZHVyZSAod2UgZ2V0IGhlcmUgd2l0aAotCSogaWVlZS0+c3RhdGUgPSBSVExMSUJfQVNTT0NJQVRJTkcpLgotCSogV2hlbiB3ZSBzZXQgdGhlIHN0YXRlIHRvIFJUTExJQl9OT0xJTksgaXQgaXMgcG9zc2libGUKLQkqIHRoYXQgdGhlIFJYIHBhdGggcnVuIGFuIGF0dGVtcHQgdG8gYXNzb2NpYXRlLCBidXQKLQkqIGJvdGggcnRsbGliX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMgYW5kIHRoZQotCSogUlggcGF0aCB3b3JrcyB3aXRoIGllZWUtPmxvY2sgaGVsZCBzbyB0aGVyZSBhcmUgbm8KLQkqIHByb2JsZW1zLiBJZiB3ZSBhcmUgc3RpbGwgZGlzYXNzb2NpYXRlZCB0aGVuIHN0YXJ0IGEgc2Nhbi4KLQkqIHRoZSBsb2NrIGhlcmUgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBubyBvbmUgdHJ5IHRvIHN0YXJ0Ci0JKiBhbiBhc3NvY2lhdGlvbiBwcm9jZWR1cmUgd2hlbiB3ZSBoYXZlIGp1c3QgY2hlY2tlZCB0aGUKLQkqIHN0YXRlIGFuZCB3ZSBhcmUgZ29pbmcgdG8gc3RhcnQgdGhlIHNjYW4uCi0JKi8KKwkgKiB0aGVyZSBhcmUgbm8gcG9zc2liaWxpdHkgdG8gaGF2ZSBzb21lb25lIGVsc2UgdHJ5aW5nCisJICogdG8gc3RhcnQgYW4gYXNzb2NpYXRpb24gcHJvY2VkdXJlICh3ZSBnZXQgaGVyZSB3aXRoCisJICogaWVlZS0+c3RhdGUgPSBSVExMSUJfQVNTT0NJQVRJTkcpLgorCSAqIFdoZW4gd2Ugc2V0IHRoZSBzdGF0ZSB0byBSVExMSUJfTk9MSU5LIGl0IGlzIHBvc3NpYmxlCisJICogdGhhdCB0aGUgUlggcGF0aCBydW4gYW4gYXR0ZW1wdCB0byBhc3NvY2lhdGUsIGJ1dAorCSAqIGJvdGggcnRsbGliX3NvZnRtYWNfY2hlY2tfYWxsX25ldHMgYW5kIHRoZQorCSAqIFJYIHBhdGggd29ya3Mgd2l0aCBpZWVlLT5sb2NrIGhlbGQgc28gdGhlcmUgYXJlIG5vCisJICogcHJvYmxlbXMuIElmIHdlIGFyZSBzdGlsbCBkaXNhc3NvY2lhdGVkIHRoZW4gc3RhcnQgYSBzY2FuLgorCSAqIHRoZSBsb2NrIGhlcmUgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSBubyBvbmUgdHJ5IHRvIHN0YXJ0CisJICogYW4gYXNzb2NpYXRpb24gcHJvY2VkdXJlIHdoZW4gd2UgaGF2ZSBqdXN0IGNoZWNrZWQgdGhlCisJICogc3RhdGUgYW5kIHdlIGFyZSBnb2luZyB0byBzdGFydCB0aGUgc2Nhbi4KKwkgKi8KIAlpZWVlLT5iZWlucmV0cnkgPSB0cnVlOwogCWllZWUtPnN0YXRlID0gUlRMTElCX05PTElOSzsKIApAQCAtMzE4MCw4ICszMTc5LDkgQEAKIHN0YXRpYyBpbnQgcnRsbGliX3dwYV9lbmFibGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUsIGludCB2YWx1ZSkKIHsKIAkvKiBUaGlzIGlzIGNhbGxlZCB3aGVuIHdwYV9zdXBwbGljYW50IGxvYWRzIGFuZCBjbG9zZXMgdGhlIGRyaXZlcgotCSAqIGludGVyZmFjZS4gKi8KLQlwcmludGsoS0VSTl9JTkZPICIlcyBXUEFcbiIsIHZhbHVlID8gImVuYWJsaW5nIiA6ICJkaXNhYmxpbmciKTsKKwkgKiBpbnRlcmZhY2UuCisJICovCisJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiJXMgV1BBXG4iLCB2YWx1ZSA/ICJlbmFibGluZyIgOiAiZGlzYWJsaW5nIik7CiAJaWVlZS0+d3BhX2VuYWJsZWQgPSB2YWx1ZTsKIAltZW1zZXQoaWVlZS0+YXBfbWFjX2FkZHIsIDAsIDYpOwogCXJldHVybiAwOwpAQCAtMzIxMiw3ICszMjEyLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9JTkZPICJVbmtub3duIE1MTUUgcmVxdWVzdDogJWRcbiIsIGNvbW1hbmQpOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJVbmtub3duIE1MTUUgcmVxdWVzdDogJWRcbiIsIGNvbW1hbmQpOwogCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAl9CiAKQEAgLTMzNDMsNyArMzM0Myw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biBXUEEgcGFyYW06ICVkXG4iLCBuYW1lKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiVW5rbm93biBXUEEgcGFyYW06ICVkXG4iLCBuYW1lKTsKIAkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJfQogCkBAIC0zMzY5LDggKzMzNjksOCBAQAogCWlmIChwYXJhbV9sZW4gIT0KIAkgICAgKGludCkgKChjaGFyICopIHBhcmFtLT51LmNyeXB0LmtleSAtIChjaGFyICopIHBhcmFtKSArCiAJICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiTGVuIG1pc21hdGNoICVkLCAlZFxuIiwgcGFyYW1fbGVuLAotCQkJICAgICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4pOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJMZW4gbWlzbWF0Y2ggJWQsICVkXG4iLCBwYXJhbV9sZW4sCisJCQkgICAgcGFyYW0tPnUuY3J5cHQua2V5X2xlbik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIocGFyYW0tPnN0YV9hZGRyKSkgewpAQCAtMzQxMCw4ICszNDEwLDggQEAKIAkJb3BzID0gbGliODAyMTFfZ2V0X2NyeXB0b19vcHMocGFyYW0tPnUuY3J5cHQuYWxnKTsKIAl9CiAJaWYgKG9wcyA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gInVua25vd24gY3J5cHRvIGFsZyAnJXMnXG4iLAotCQkgICAgICAgcGFyYW0tPnUuY3J5cHQuYWxnKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAidW5rbm93biBjcnlwdG8gYWxnICclcydcbiIsCisJCQkgICAgcGFyYW0tPnUuY3J5cHQuYWxnKTsKIAkJcGFyYW0tPnUuY3J5cHQuZXJyID0gSUVFRV9DUllQVF9FUlJfVU5LTk9XTl9BTEc7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gZG9uZTsKQEAgLTM0MjEsMTIgKzM0MjEsMTEgQEAKIAogCQlsaWI4MDIxMV9jcnlwdF9kZWxheWVkX2RlaW5pdCgmaWVlZS0+Y3J5cHRfaW5mbywgY3J5cHQpOwogCi0JCW5ld19jcnlwdCA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKKwkJbmV3X2NyeXB0ID0ga3phbGxvYyhzaXplb2YoKm5ld19jcnlwdCksIEdGUF9LRVJORUwpOwogCQlpZiAobmV3X2NyeXB0ID09IE5VTEwpIHsKIAkJCXJldCA9IC1FTk9NRU07CiAJCQlnb3RvIGRvbmU7CiAJCX0KLQkJbWVtc2V0KG5ld19jcnlwdCwgMCwgc2l6ZW9mKHN0cnVjdCBsaWI4MDIxMV9jcnlwdF9kYXRhKSk7CiAJCW5ld19jcnlwdC0+b3BzID0gb3BzOwogCQlpZiAobmV3X2NyeXB0LT5vcHMpCiAJCQluZXdfY3J5cHQtPnByaXYgPQpAQCAtMzQ0Niw3ICszNDQ1LDcgQEAKIAkgICAgKCpjcnlwdCktPm9wcy0+c2V0X2tleShwYXJhbS0+dS5jcnlwdC5rZXksCiAJICAgIHBhcmFtLT51LmNyeXB0LmtleV9sZW4sIHBhcmFtLT51LmNyeXB0LnNlcSwKIAkgICAgKCpjcnlwdCktPnByaXYpIDwgMCkgewotCQlwcmludGsoS0VSTl9JTkZPICJrZXkgc2V0dGluZyBmYWlsZWRcbiIpOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJrZXkgc2V0dGluZyBmYWlsZWRcbiIpOwogCQlwYXJhbS0+dS5jcnlwdC5lcnIgPSBJRUVFX0NSWVBUX0VSUl9LRVlfU0VUX0ZBSUxFRDsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBkb25lOwpAQCAtMzQ4NiwxMiArMzQ4NSwxMyBAQAogCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKIAkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAogCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgotCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KKwkgKiB0aGUgY2FsbGJhY2tzIHN0cnVjdHVyZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA4MDIuMTEgc3RhY2suCisJICovCiAJaWYgKGllZWUtPnJlc2V0X29uX2tleWNoYW5nZSAmJgogCSAgICBpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgJiYKIAkgICAgaWVlZS0+cmVzZXRfcG9ydCAmJgogCSAgICBpZWVlLT5yZXNldF9wb3J0KGllZWUtPmRldikpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAicmVzZXRfcG9ydCBmYWlsZWRcbiIpOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJyZXNldF9wb3J0IGZhaWxlZFxuIik7CiAJCXBhcmFtLT51LmNyeXB0LmVyciA9IElFRUVfQ1JZUFRfRVJSX0NBUkRfQ09ORl9GQUlMRUQ7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTM2MzQsOCArMzYzNCw4IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVW5rbm93biBXUEEgc3VwcGxpY2FudCByZXF1ZXN0OiAlZFxuIiwKLQkJICAgICAgIHBhcmFtLT5jbWQpOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJVbmtub3duIFdQQSBzdXBwbGljYW50IHJlcXVlc3Q6ICVkXG4iLAorCQkJICAgIHBhcmFtLT5jbWQpOwogCQlyZXQgPSAtRU9QTk9UU1VQUDsKIAkJYnJlYWs7CiAJfQpAQCAtMzc0OSw5ICszNzQ5LDkgQEAKIAkJICAgICAgIEVUSF9BTEVOKTsKIAllbHNlIHsKIAotCQlwcmludGsoS0VSTl9JTkZPICIlcygpOiBUZWxsIHVzZXIgc3BhY2UgZGlzY29ubmVjdGVkXG4iLAotCQkgICAgICAgX19mdW5jX18pOwotCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiJXMoKTogVGVsbCB1c2VyIHNwYWNlIGRpc2Nvbm5lY3RlZFxuIiwKKwkJCSAgICBfX2Z1bmNfXyk7CisJCWV0aF96ZXJvX2FkZHIod3JxdS5hcF9hZGRyLnNhX2RhdGEpOwogCX0KIAl3aXJlbGVzc19zZW5kX2V2ZW50KGllZWUtPmRldiwgU0lPQ0dJV0FQLCAmd3JxdSwgTlVMTCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3NvZnRtYWNfd3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hY193eC5jCmluZGV4IDgzNWYzZDcuLjk3MTVhNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hY193eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfc29mdG1hY193eC5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAkJaWVlZS0+c3RhdGUgIT0gUlRMTElCX0xJTktFRF9TQ0FOTklORyAmJgogCQlpZWVlLT53YXBfc2V0ID09IDApCiAKLQkJbWVtc2V0KHdycXUtPmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCQlldGhfemVyb19hZGRyKHdycXUtPmFwX2FkZHIuc2FfZGF0YSk7CiAJZWxzZQogCQltZW1jcHkod3JxdS0+YXBfYWRkci5zYV9kYXRhLAogCQkgICAgICAgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CkBAIC01MjcsOCArNTI3LDggQEAKIAllbHNlCiAJCWllZWUtPnJhd190eCA9IDA7CiAKLQlwcmludGsoS0VSTl9JTkZPInJhdyBUWCBpcyAlc1xuIiwKLQkgICAgICBpZWVlLT5yYXdfdHggPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJyYXcgVFggaXMgJXNcbiIsCisJCSAgICBpZWVlLT5yYXdfdHggPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKIAogCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgewogCQlpZiAocHJldiA9PSAwICYmIGllZWUtPnJhd190eCkgewpAQCAtNTc1LDggKzU3NSw5IEBACiAJaWYgKCghaWVlZS0+c3RhX3dha2VfdXApIHx8CiAJICAgICghaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUpIHx8CiAJICAgICghaWVlZS0+cHNfaXNfcXVldWVfZW1wdHkpKSB7Ci0JCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLCAiJXMoKTogUFMgbW9kZSBpcyB0cmllZCB0byBiZSB1c2UgIgotCQkJICAgICAiYnV0IGRyaXZlciBtaXNzZWQgYSBjYWxsYmFja1xuXG4iLCBfX2Z1bmNfXyk7CisJCVJUTExJQl9ERUJVRyhSVExMSUJfRExfRVJSLAorCQkJICAgICAiJXMoKTogUFMgbW9kZSBpcyB0cmllZCB0byBiZSB1c2UgYnV0IGRyaXZlciBtaXNzZWQgYSBjYWxsYmFja1xuXG4iLAorCQkJICAgICBfX2Z1bmNfXyk7CiAJCXJldHVybiAtMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfdHguYwppbmRleCA0ZjY4ZmZlLi4zYjE1OTYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl90eC5jCkBAIC01MywxMDIgKzUzLDk5IEBACiAKICNpbmNsdWRlICJydGxsaWIuaCIKIAotLyoKLQotCi04MDIuMTEgRGF0YSBGcmFtZQotCi0KLTgwMi4xMSBmcmFtZV9jb250cm9sIGZvciBkYXRhIGZyYW1lcyAtIDIgYnl0ZXMKLSAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotYml0cyB8IDAgIHwgIDEgIHwgIDIgIHwgIDMgIHwgIDQgIHwgIDUgIHwgIDYgIHwgIDcgIHwgIDggIHwgIDkgIHwgIGEgIHwgIGIgIHwgIGMgIHwgIGQgIHwgIGUgICB8Ci0gICAgIHwtLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tLXwKLXZhbCAgfCAwICB8ICAwICB8ICAwICB8ICAxICB8ICB4ICB8ICAwICB8ICAwICB8ICAwICB8ICAxICB8ICAwICB8ICB4ICB8ICB4ICB8ICB4ICB8ICB4ICB8ICB4ICAgfAotICAgICB8LS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLXwtLS0tLS18Ci1kZXNjIHwgXi12ZXItXiAgfCAgXnR5cGUtXiAgfCAgXi0tLS0tc3VidHlwZS0tLS0tXiAgfCB0byAgfGZyb20gfG1vcmUgfHJldHJ5fCBwd3IgfG1vcmUgfHdlcCAgIHwKLSAgICAgfAkgIHwJICAgfCB4PTAgZGF0YSx4PTEgZGF0YSthY2sgfCBEUyAgfCBEUyAgfGZyYWcgfCAgICAgfCBtZ20gfGRhdGEgfCAgICAgIHwKLSAgICAgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJwotCQkJCQkJICAgIC9cCi0JCQkJCQkgICAgfAotODAyLjExIERhdGEgRnJhbWUJCQkJICAgfAotCSAgICwtLS0tLS0tLS0gJ2N0cmwnIGV4cGFuZHMgdG8gPi0tLS0tLS0tLS0tJwotCSAgfAotICAgICAgLC0tJy0tLSwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgotQnl0ZXMgfCAgMiAgIHwgIDIgICB8ICAgIDYgICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAyICAgfCAwLi4yMzEyIHwgICA0ICB8Ci0gICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLXwKLURlc2MuIHwgY3RybCB8IGR1cmEgfCAgREEvUkEgIHwgICBUQSAgICB8ICAgIFNBICAgfCBTZXF1IHwgIEZyYW1lICB8ICBmY3MgfAotICAgICAgfCAgICAgIHwgdGlvbiB8IChCU1NJRCkgfAkgfAkgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAotICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAkgfC0tLS0tLScKLVRvdGFsOiAyOCBub24tZGF0YSBieXRlcwkJCQkgYC0tLS0uLS0tLScKLQkJCQkJCQkgICAgICB8Ci0gICAgICAgLi0gJ0ZyYW1lIGRhdGEnIGV4cGFuZHMgdG8gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKLSAgICAgICB8Ci0gICAgICAgVgotICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLUJ5dGVzIHwgIDEgICB8ICAxICAgfCAgICAxICAgIHwgICAgMyAgICAgfCAgMiAgIHwgIDAtMjMwNCB8Ci0gICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfAotRGVzYy4gfCBTTkFQIHwgU05BUCB8IENvbnRyb2wgfEV0aCBUdW5uZWx8IFR5cGUgfCBJUCAgICAgIHwKLSAgICAgIHwgRFNBUCB8IFNTQVAgfAkgfAkgIHwgICAgICB8IFBhY2tldCAgfAotICAgICAgfCAweEFBIHwgMHhBQSB8MHgwMyAoVUkpfDB4MDAtMDAtRjh8ICAgICAgfAkgfAotICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAkgfAotVG90YWw6IDggbm9uLWRhdGEgYnl0ZXMJCQkgYC0tLS0uLS0tLScKLQkJCQkJCSAgICAgfAotICAgICAgIC4tICdJUCBQYWNrZXQnIGV4cGFuZHMsIGlmIFdFUCBlbmFibGVkLCB0byA8LS0nCi0gICAgICAgfAotICAgICAgIFYKLSAgICAgICwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KLUJ5dGVzIHwgIDQgIHwgICAwLTIyOTYgIHwgIDQgIHwKLSAgICAgIHwtLS0tLXwtLS0tLS0tLS0tLXwtLS0tLXwKLURlc2MuIHwgSVYgIHwgRW5jcnlwdGVkIHwgSUNWIHwKLSAgICAgIHwgICAgIHwgSVAgUGFja2V0IHwgICAgIHwKLSAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKLVRvdGFsOiA4IG5vbi1kYXRhIGJ5dGVzCi0KLQotODAyLjMgRXRoZXJuZXQgRGF0YSBGcmFtZQotCi0gICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCi1CeXRlcyB8ICAgNiAgIHwgICA2ICAgfCAgMiAgIHwgIFZhcmlhYmxlIHwgICA0ICB8Ci0gICAgICB8LS0tLS0tLXwtLS0tLS0tfC0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS18Ci1EZXNjLiB8IERlc3QuIHwgU291cmNlfCBUeXBlIHwgSVAgUGFja2V0IHwgIGZjcyB8Ci0gICAgICB8ICBNQUMgIHwgIE1BQyAgfCAgICAgIHwJICAgfCAgICAgIHwKLSAgICAgIGAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKLVRvdGFsOiAxOCBub24tZGF0YSBieXRlcwotCi1JbiB0aGUgZXZlbnQgdGhhdCBmcmFnbWVudGF0aW9uIGlzIHJlcXVpcmVkLCB0aGUgaW5jb21pbmcgcGF5bG9hZCBpcyBzcGxpdCBpbnRvCi1OIHBhcnRzIG9mIHNpemUgaWVlZS0+ZnRzLiAgVGhlIGZpcnN0IGZyYWdtZW50IGNvbnRhaW5zIHRoZSBTTkFQIGhlYWRlciBhbmQgdGhlCi1yZW1haW5pbmcgcGFja2V0cyBhcmUganVzdCBkYXRhLgotCi1JZiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQsIGVhY2ggZnJhZ21lbnQgcGF5bG9hZCBzaXplIGlzIHJlZHVjZWQgYnkgZW5vdWdoIHNwYWNlCi10byBhZGQgdGhlIHByZWZpeCBhbmQgcG9zdGZpeCAoSVYgYW5kIElDViB0b3RhbGxpbmcgOCBieXRlcyBpbiB0aGUgY2FzZSBvZiBXRVApCi1TbyBpZiB5b3UgaGF2ZSAxNTAwIGJ5dGVzIG9mIHBheWxvYWQgd2l0aCBpZWVlLT5mdHMgc2V0IHRvIDUwMCB3aXRob3V0Ci1lbmNyeXB0aW9uIGl0IHdpbGwgdGFrZSAzIGZyYW1lcy4gIFdpdGggV0VQIGl0IHdpbGwgdGFrZSA0IGZyYW1lcyBhcyB0aGUKLXBheWxvYWQgb2YgZWFjaCBmcmFtZSBpcyByZWR1Y2VkIHRvIDQ5MiBieXRlcy4KLQotKiBTS0IgdmlzdWFsaXphdGlvbgotKgotKiAgLC0gc2tiLT5kYXRhCi0qIHwKLSogfCAgICBFVEhFUk5FVCBIRUFERVIJLC08LS0gUEFZTE9BRAotKiB8CQkJICAgfCAgICAgMTQgYnl0ZXMgZnJvbSBza2ItPmRhdGEKLSogfCAgMiBieXRlcyBmb3IgVHlwZSAtLT4gLFQuIHwgICAgIChzaXplb2YgZXRoaGRyKQotKiB8CQkgICAgICAgfCB8IHwKLSogfCwtRGVzdC4tLS4gLC0tU3JjLi0tLS4gfCB8IHwKLSogfCAgNiBieXRlc3wgfCA2IGJ5dGVzIHwgfCB8IHwKLSogdgkgfCB8CSB8IHwgfCB8Ci0qIDAJIHwgdiAgICAgICAxIHwgdiB8IHYJICAgMgotKiAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUKLSogICAgIF4gICAgIHwgXgkgfCBeIHwKLSogICAgIHwgICAgIHwgfAkgfCB8IHwKLSogICAgIHwgICAgIHwgfAkgfCBgVCcgPC0tLS0gMiBieXRlcyBmb3IgVHlwZQotKiAgICAgfCAgICAgfCB8CSB8Ci0qICAgICB8ICAgICB8ICctLS1TTkFQLS0nIDwtLS0tLS0tLSA2IGJ5dGVzIGZvciBTTkFQCi0qICAgICB8ICAgICB8Ci0qICAgICBgLUlWLS0nIDwtLS0tLS0tLS0tLS0tLS0tLS0tLSA0IGJ5dGVzIGZvciBJViAoV0VQKQotKgotKiAgICAgIFNOQVAgSEVBREVSCi0qCi0qLworLyogODAyLjExIERhdGEgRnJhbWUKKyAqCisgKgorICogODAyLjExIGZyYW1lX2NvbnRyb2wgZm9yIGRhdGEgZnJhbWVzIC0gMiBieXRlcworICogICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisgKiBiaXRzIHwgMCAgfCAgMSAgfCAgMiAgfCAgMyAgfCAgNCAgfCAgNSAgfCAgNiAgfCAgNyAgfCAgOCAgfCAgOSAgfCAgYSAgfCAgYiAgfCAgYyAgfCAgZCAgfCAgZSAgIHwKKyAqICAgICAgfC0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS0tfAorICogdmFsICB8IDAgIHwgIDAgIHwgIDAgIHwgIDEgIHwgIHggIHwgIDAgIHwgIDAgIHwgIDAgIHwgIDEgIHwgIDAgIHwgIHggIHwgIHggIHwgIHggIHwgIHggIHwgIHggICB8CisgKiAgICAgIHwtLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tLXwKKyAqIGRlc2MgfCBeLXZlci1eICB8ICBedHlwZS1eICB8ICBeLS0tLS1zdWJ0eXBlLS0tLS1eICB8IHRvICB8ZnJvbSB8bW9yZSB8cmV0cnl8IHB3ciB8bW9yZSB8d2VwICAgfAorICogICAgICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgeD0wIGRhdGEseD0xIGRhdGErYWNrIHwgRFMgIHwgRFMgIHxmcmFnIHwgICAgIHwgbWdtIHxkYXRhIHwgICAgICB8CisgKiAgICAgICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgL1wKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogODAyLjExIERhdGEgRnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgICAsLS0tLS0tLS0tICdjdHJsJyBleHBhbmRzIHRvID4tLS0tLS0tLS0tLScKKyAqICAgICAgICAgIHwKKyAqICAgICAgICwtLSctLS0sLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyAqIEJ5dGVzIHwgIDIgICB8ICAyICAgfCAgICA2ICAgIHwgICAgNiAgICB8ICAgIDYgICAgfCAgMiAgIHwgMC4uMjMxMiB8ICAgNCAgfAorICogICAgICAgfC0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tfC0tLS0tLS0tLXwtLS0tLS18CisgKiBEZXNjLiB8IGN0cmwgfCBkdXJhIHwgIERBL1JBICB8ICAgVEEgICAgfCAgICBTQSAgIHwgU2VxdSB8ICBGcmFtZSAgfCAgZmNzIHwKKyAqICAgICAgIHwgICAgICB8IHRpb24gfCAoQlNTSUQpIHwgICAgICAgICB8ICAgICAgICAgfCBlbmNlIHwgIGRhdGEgICB8ICAgICAgfAorICogICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwtLS0tLS0nCisgKiBUb3RhbDogMjggbm9uLWRhdGEgYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLS0tLS4tLS0tJworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAgICAgICAgLi0gJ0ZyYW1lIGRhdGEnIGV4cGFuZHMgdG8gPC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScKKyAqICAgICAgICB8CisgKiAgICAgICAgVgorICogICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KKyAqIEJ5dGVzIHwgIDEgICB8ICAxICAgfCAgICAxICAgIHwgICAgMyAgICAgfCAgMiAgIHwgIDAtMjMwNCB8CisgKiAgICAgICB8LS0tLS0tfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tfAorICogRGVzYy4gfCBTTkFQIHwgU05BUCB8IENvbnRyb2wgfEV0aCBUdW5uZWx8IFR5cGUgfCBJUCAgICAgIHwKKyAqICAgICAgIHwgRFNBUCB8IFNTQVAgfCAgICAgICAgIHwgICAgICAgICAgfCAgICAgIHwgUGFja2V0ICB8CisgKiAgICAgICB8IDB4QUEgfCAweEFBIHwweDAzIChVSSl8MHgwMC0wMC1GOHwgICAgICB8ICAgICAgICAgfAorICogICAgICAgYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgIHwKKyAqIFRvdGFsOiA4IG5vbi1kYXRhIGJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgIGAtLS0tLi0tLS0nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAuLSAnSVAgUGFja2V0JyBleHBhbmRzLCBpZiBXRVAgZW5hYmxlZCwgdG8gPC0tJworICogICAgICAgIHwKKyAqICAgICAgICBWCisgKiAgICAgICAsLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCisgKiBCeXRlcyB8ICA0ICB8ICAgMC0yMjk2ICB8ICA0ICB8CisgKiAgICAgICB8LS0tLS18LS0tLS0tLS0tLS18LS0tLS18CisgKiBEZXNjLiB8IElWICB8IEVuY3J5cHRlZCB8IElDViB8CisgKiAgICAgICB8ICAgICB8IElQIFBhY2tldCB8ICAgICB8CisgKiAgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgKiBUb3RhbDogOCBub24tZGF0YSBieXRlcworICoKKyAqCisgKiA4MDIuMyBFdGhlcm5ldCBEYXRhIEZyYW1lCisgKgorICogICAgICAgLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorICogQnl0ZXMgfCAgIDYgICB8ICAgNiAgIHwgIDIgICB8ICBWYXJpYWJsZSB8ICAgNCAgfAorICogICAgICAgfC0tLS0tLS18LS0tLS0tLXwtLS0tLS18LS0tLS0tLS0tLS18LS0tLS0tfAorICogRGVzYy4gfCBEZXN0LiB8IFNvdXJjZXwgVHlwZSB8IElQIFBhY2tldCB8ICBmY3MgfAorICogICAgICAgfCAgTUFDICB8ICBNQUMgIHwgICAgICB8CSAgIHwgICAgICB8CisgKiAgICAgICBgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nCisgKiBUb3RhbDogMTggbm9uLWRhdGEgYnl0ZXMKKyAqCisgKiBJbiB0aGUgZXZlbnQgdGhhdCBmcmFnbWVudGF0aW9uIGlzIHJlcXVpcmVkLCB0aGUgaW5jb21pbmcgcGF5bG9hZCBpcyBzcGxpdCBpbnRvCisgKiBOIHBhcnRzIG9mIHNpemUgaWVlZS0+ZnRzLiAgVGhlIGZpcnN0IGZyYWdtZW50IGNvbnRhaW5zIHRoZSBTTkFQIGhlYWRlciBhbmQgdGhlCisgKiByZW1haW5pbmcgcGFja2V0cyBhcmUganVzdCBkYXRhLgorICoKKyAqIElmIGVuY3J5cHRpb24gaXMgZW5hYmxlZCwgZWFjaCBmcmFnbWVudCBwYXlsb2FkIHNpemUgaXMgcmVkdWNlZCBieSBlbm91Z2ggc3BhY2UKKyAqIHRvIGFkZCB0aGUgcHJlZml4IGFuZCBwb3N0Zml4IChJViBhbmQgSUNWIHRvdGFsbGluZyA4IGJ5dGVzIGluIHRoZSBjYXNlIG9mIFdFUCkKKyAqIFNvIGlmIHlvdSBoYXZlIDE1MDAgYnl0ZXMgb2YgcGF5bG9hZCB3aXRoIGllZWUtPmZ0cyBzZXQgdG8gNTAwIHdpdGhvdXQKKyAqIGVuY3J5cHRpb24gaXQgd2lsbCB0YWtlIDMgZnJhbWVzLiAgV2l0aCBXRVAgaXQgd2lsbCB0YWtlIDQgZnJhbWVzIGFzIHRoZQorICogcGF5bG9hZCBvZiBlYWNoIGZyYW1lIGlzIHJlZHVjZWQgdG8gNDkyIGJ5dGVzLgorICoKKyAqIFNLQiB2aXN1YWxpemF0aW9uCisgKgorICogLC0gc2tiLT5kYXRhCisgKiB8CisgKiB8ICAgIEVUSEVSTkVUIEhFQURFUiAgICAgICAgLC08LS0gUEFZTE9BRAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIDE0IGJ5dGVzIGZyb20gc2tiLT5kYXRhCisgKiB8ICAyIGJ5dGVzIGZvciBUeXBlIC0tPiAsVC4gfCAgICAgKHNpemVvZiBldGhoZHIpCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICB8IHwgfAorICogfCwtRGVzdC4tLS4gLC0tU3JjLi0tLS4gfCB8IHwKKyAqIHwgIDYgYnl0ZXN8IHwgNiBieXRlcyB8IHwgfCB8CisgKiB2ICAgICAgICAgfCB8ICAgICAgICAgfCB8IHwgfAorICogMCAgICAgICAgIHwgdiAgICAgICAxIHwgdiB8IHYgICAgICAgICAgIDIKKyAqIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNQorICogICAgIF4gICAgIHwgXiAgICAgICAgIHwgXiB8CisgKiAgICAgfCAgICAgfCB8ICAgICAgICAgfCB8IHwKKyAqICAgICB8ICAgICB8IHwgICAgICAgICB8IGBUJyA8LS0tLSAyIGJ5dGVzIGZvciBUeXBlCisgKiAgICAgfCAgICAgfCB8ICAgICAgICAgfAorICogICAgIHwgICAgIHwgJy0tLVNOQVAtLScgPC0tLS0tLS0tIDYgYnl0ZXMgZm9yIFNOQVAKKyAqICAgICB8ICAgICB8CisgKiAgICAgYC1JVi0tJyA8LS0tLS0tLS0tLS0tLS0tLS0tLS0gNCBieXRlcyBmb3IgSVYgKFdFUCkKKyAqCisgKiAgICAgIFNOQVAgSEVBREVSCisgKgorICovCiAKIHN0YXRpYyB1OCBQODAyXzFIX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4ZjggfTsKIHN0YXRpYyB1OCBSRkMxMDQyX09VSVtQODAyMTFfT1VJX0xFTl0gPSB7IDB4MDAsIDB4MDAsIDB4MDAgfTsKQEAgLTE4NSwxNCArMTgyLDE3IEBACiAJY3J5cHQgPSBpZWVlLT5jcnlwdF9pbmZvLmNyeXB0W2llZWUtPmNyeXB0X2luZm8udHhfa2V5aWR4XTsKIAogCWlmICghKGNyeXB0ICYmIGNyeXB0LT5vcHMpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT4lcygpLCBjcnlwdCBpcyBudWxsXG4iLCBfX2Z1bmNfXyk7CisJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgIj09PT09PT09PT4lcygpLCBjcnlwdCBpcyBudWxsXG4iLAorCQkJICAgIF9fZnVuY19fKTsKIAkJcmV0dXJuIC0xOwogCX0KIAkvKiBUbyBlbmNyeXB0LCBmcmFtZSBmb3JtYXQgaXM6Ci0JICogSVYgKDQgYnl0ZXMpLCBjbGVhciBwYXlsb2FkIChpbmNsdWRpbmcgU05BUCksIElDViAoNCBieXRlcykgKi8KKwkgKiBJViAoNCBieXRlcyksIGNsZWFyIHBheWxvYWQgKGluY2x1ZGluZyBTTkFQKSwgSUNWICg0IGJ5dGVzKQorCSAqLwogCiAJLyogSG9zdC1iYXNlZCBJRUVFIDgwMi4xMSBmcmFnbWVudGF0aW9uIGZvciBUWCBpcyBub3QgeWV0IHN1cHBvcnRlZCwgc28KLQkgKiBjYWxsIGJvdGggTVNEVSBhbmQgTVBEVSBlbmNyeXB0aW9uIGZ1bmN0aW9ucyBmcm9tIGhlcmUuICovCisJICogY2FsbCBib3RoIE1TRFUgYW5kIE1QRFUgZW5jcnlwdGlvbiBmdW5jdGlvbnMgZnJvbSBoZXJlLgorCSAqLwogCWF0b21pY19pbmMoJmNyeXB0LT5yZWZjbnQpOwogCXJlcyA9IDA7CiAJaWYgKGNyeXB0LT5vcHMtPmVuY3J5cHRfbXNkdSkKQEAgLTIwMiw4ICsyMDIsOCBAQAogCiAJYXRvbWljX2RlYygmY3J5cHQtPnJlZmNudCk7CiAJaWYgKHJlcyA8IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEVuY3J5cHRpb24gZmFpbGVkOiBsZW49JWQuXG4iLAotCQkgICAgICAgaWVlZS0+ZGV2LT5uYW1lLCBmcmFnLT5sZW4pOworCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICIlczogRW5jcnlwdGlvbiBmYWlsZWQ6IGxlbj0lZC5cbiIsCisJCQkgICAgaWVlZS0+ZGV2LT5uYW1lLCBmcmFnLT5sZW4pOwogCQlpZWVlLT5pZWVlX3N0YXRzLnR4X2Rpc2NhcmRzKys7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0zMTEsNyArMzExLDcgQEAKIAlpZiAocEhUSW5mby0+YkN1cnJlbnRBTVBEVUVuYWJsZSkgewogCQlpZiAoIUdldFRzKGllZWUsIChzdHJ1Y3QgdHNfY29tbW9uX2luZm8gKiopKCZwVHhUcyksIGhkci0+YWRkcjEsCiAJCSAgICBza2ItPnByaW9yaXR5LCBUWF9ESVIsIHRydWUpKSB7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlczogY2FuJ3QgZ2V0IFRTXG4iLCBfX2Z1bmNfXyk7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICIlczogY2FuJ3QgZ2V0IFRTXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm47CiAJCX0KIAkJaWYgKHBUeFRzLT5UeEFkbWl0dGVkQkFSZWNvcmQuYlZhbGlkID09IGZhbHNlKSB7CkBAIC00MTIsNiArNDEyLDggQEAKIAkJCQkJc3RydWN0IGNiX2Rlc2MgKnRjYl9kZXNjLAogCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCXN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFRJbmZvOworCiAJdGNiX2Rlc2MtPmJSVFNTVEJDCQkJPSBmYWxzZTsKIAl0Y2JfZGVzYy0+YlJUU1VzZVNob3J0R0kJCT0gZmFsc2U7CiAJdGNiX2Rlc2MtPmJDVFNFbmFibGUJCQk9IGZhbHNlOwpAQCAtNDM0LDUwICs0MzYsNTAgQEAKIAkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07CiAJCX0KIAkJcmV0dXJuOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBydF9oaV90aHJvdWdocHV0ICpwSFRJbmZvID0gaWVlZS0+cEhUSW5mbzsKKwl9CiAKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChwSFRJbmZvLT5JT1RBY3Rpb24gJiBIVF9JT1RfQUNUX0ZPUkNFRF9DVFMyU0VMRikgewotCQkJCXRjYl9kZXNjLT5iQ1RTRW5hYmxlCT0gdHJ1ZTsKLQkJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgID0JTUdOXzI0TTsKLQkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHBIVEluZm8tPklPVEFjdGlvbiAmIChIVF9JT1RfQUNUX0ZPUkNFRF9SVFMgfAotCQkJCSAgIEhUX0lPVF9BQ1RfUFVSRV9OX01PREUpKSB7Ci0JCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOwotCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSAgPQlNR05fMjRNOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5idXNlcHJvdGVjdGlvbikgewotCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKLQkJCQl0Y2JfZGVzYy0+YkNUU0VuYWJsZSA9IHRydWU7Ci0JCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChwSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCAgJiYgcEhUSW5mby0+YkVuYWJsZUhUKSB7Ci0JCQkJdTggSFRPcE1vZGUgPSBwSFRJbmZvLT5DdXJyZW50T3BNb2RlOworCXBIVEluZm8gPSBpZWVlLT5wSFRJbmZvOwogCi0JCQkJaWYgKChwSFRJbmZvLT5iQ3VyQlc0ME1IeiAmJiAoSFRPcE1vZGUgPT0gMiB8fAotCQkJCSAgICAgSFRPcE1vZGUgPT0gMykpIHx8Ci0JCQkJICAgICAoIXBIVEluZm8tPmJDdXJCVzQwTUh6ICYmIEhUT3BNb2RlID09IDMpKSB7Ci0JCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07Ci0JCQkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNrYi0+bGVuID4gaWVlZS0+cnRzKSB7Ci0JCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKLQkJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAodGNiX2Rlc2MtPmJBTVBEVUVuYWJsZSkgewotCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07Ci0JCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWdvdG8gTk9fUFJPVEVDVElPTjsKKwl3aGlsZSAodHJ1ZSkgeworCQlpZiAocEhUSW5mby0+SU9UQWN0aW9uICYgSFRfSU9UX0FDVF9GT1JDRURfQ1RTMlNFTEYpIHsKKwkJCXRjYl9kZXNjLT5iQ1RTRW5hYmxlCT0gdHJ1ZTsKKwkJCXRjYl9kZXNjLT5ydHNfcmF0ZSAgPQlNR05fMjRNOworCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAocEhUSW5mby0+SU9UQWN0aW9uICYgKEhUX0lPVF9BQ1RfRk9SQ0VEX1JUUyB8CisJCQkgICBIVF9JT1RfQUNUX1BVUkVfTl9NT0RFKSkgeworCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJdGNiX2Rlc2MtPnJ0c19yYXRlICA9CU1HTl8yNE07CisJCQlicmVhazsKIAkJfQorCQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJ1c2Vwcm90ZWN0aW9uKSB7CisJCQl0Y2JfZGVzYy0+YlJUU0VuYWJsZSA9IHRydWU7CisJCQl0Y2JfZGVzYy0+YkNUU0VuYWJsZSA9IHRydWU7CisJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ICAmJiBwSFRJbmZvLT5iRW5hYmxlSFQpIHsKKwkJCXU4IEhUT3BNb2RlID0gcEhUSW5mby0+Q3VycmVudE9wTW9kZTsKKworCQkJaWYgKChwSFRJbmZvLT5iQ3VyQlc0ME1IeiAmJiAoSFRPcE1vZGUgPT0gMiB8fAorCQkJICAgICBIVE9wTW9kZSA9PSAzKSkgfHwKKwkJCSAgICAgKCFwSFRJbmZvLT5iQ3VyQlc0ME1IeiAmJiBIVE9wTW9kZSA9PSAzKSkgeworCQkJCXRjYl9kZXNjLT5ydHNfcmF0ZSA9IE1HTl8yNE07CisJCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChza2ItPmxlbiA+IGllZWUtPnJ0cykgeworCQkJdGNiX2Rlc2MtPnJ0c19yYXRlID0gTUdOXzI0TTsKKwkJCXRjYl9kZXNjLT5iUlRTRW5hYmxlID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJCWlmICh0Y2JfZGVzYy0+YkFNUERVRW5hYmxlKSB7CisJCQl0Y2JfZGVzYy0+cnRzX3JhdGUgPSBNR05fMjRNOworCQkJdGNiX2Rlc2MtPmJSVFNFbmFibGUgPSBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisJCWdvdG8gTk9fUFJPVEVDVElPTjsKIAl9CiAJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX1NIT1JUX1BSRUFNQkxFKQogCQl0Y2JfZGVzYy0+YlVzZVNob3J0UHJlYW1ibGUgPSB0cnVlOwpAQCAtNTQ5LDYgKzU1MSwxNyBAQAogCX0KIH0KIAorc3RhdGljIHU4IHJ0bGxpYl9jdXJyZW50X3JhdGUoc3RydWN0IHJ0bGxpYl9kZXZpY2UgKmllZWUpCit7CisJaWYgKGllZWUtPm1vZGUgJiBJRUVFX01PREVfTUFTSykKKwkJcmV0dXJuIGllZWUtPnJhdGU7CisKKwlpZiAoaWVlZS0+SFRDdXJyZW50T3BlcmFSYXRlKQorCQlyZXR1cm4gaWVlZS0+SFRDdXJyZW50T3BlcmFSYXRlOworCWVsc2UKKwkJcmV0dXJuIGllZWUtPnJhdGUgJiAweDdGOworfQorCiBpbnQgcnRsbGliX3htaXRfaW50ZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcnRsbGliX2RldmljZSAqaWVlZSA9IChzdHJ1Y3QgcnRsbGliX2RldmljZSAqKQpAQCAtNTc3LDIxICs1OTAsMjEgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCiAJLyogSWYgdGhlcmUgaXMgbm8gZHJpdmVyIGhhbmRsZXIgdG8gdGFrZSB0aGUgVFhCLCBkb24ndCBib3RoZXIKLQkgKiBjcmVhdGluZyBpdC4uLiAqLworCSAqIGNyZWF0aW5nIGl0Li4uCisJICovCiAJaWYgKCghaWVlZS0+aGFyZF9zdGFydF94bWl0ICYmICEoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmCiAJICAgSUVFRV9TT0ZUTUFDX1RYX1FVRVVFKSkgfHwKIAkgICAoKCFpZWVlLT5zb2Z0bWFjX2RhdGFfaGFyZF9zdGFydF94bWl0ICYmCiAJICAgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfVFhfUVVFVUUpKSkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IE5vIHhtaXQgaGFuZGxlci5cbiIsCi0JCSAgICAgICBpZWVlLT5kZXYtPm5hbWUpOworCQluZXRkZXZfd2FybihpZWVlLT5kZXYsICJObyB4bWl0IGhhbmRsZXIuXG4iKTsKIAkJZ290byBzdWNjZXNzOwogCX0KIAogCiAJaWYgKGxpa2VseShpZWVlLT5yYXdfdHggPT0gMCkpIHsKIAkJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgU05BUF9TSVpFICsgc2l6ZW9mKHUxNikpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2tiIHRvbyBzbWFsbCAoJWQpLlxuIiwKLQkJCWllZWUtPmRldi0+bmFtZSwgc2tiLT5sZW4pOworCQkJbmV0ZGV2X3dhcm4oaWVlZS0+ZGV2LCAic2tiIHRvbyBzbWFsbCAoJWQpLlxuIiwKKwkJCQkgICAgc2tiLT5sZW4pOwogCQkJZ290byBzdWNjZXNzOwogCQl9CiAJCS8qIFNhdmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgKi8KQEAgLTYwNCw5ICs2MTcsOCBAQAogCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpIHsKIAkJCXR4YiA9IHJ0bGxpYl9hbGxvY190eGIoMSwgc2tiLT5sZW4sIEdGUF9BVE9NSUMpOwogCQkJaWYgKHVubGlrZWx5KCF0eGIpKSB7Ci0JCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSAiCi0JCQkJICAgICAgICJUWEJcbiIsCi0JCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJCQluZXRkZXZfd2FybihpZWVlLT5kZXYsCisJCQkJCSAgICAiQ291bGQgbm90IGFsbG9jYXRlIFRYQlxuIik7CiAJCQkJZ290byBmYWlsZWQ7CiAJCQl9CiAKQEAgLTYzNiw4ICs2NDgsOCBAQAogCQkJCQl9CiAJCQkJfQogCQkJfSBlbHNlIGlmIChFVEhfUF9BUlAgPT0gZXRoZXJfdHlwZSkgewotCQkJCXByaW50ayhLRVJOX0lORk8gIj09PT09PT09PT09PT09PT09PkRIQ1AgIgotCQkJCSAgICAgICAiUHJvdG9jb2wgc3RhcnQgdHggQVJQIHBrdCEhXG4iKTsKKwkJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsCisJCQkJCSAgICAiPT09PT09PT09PT09PT09PT0+REhDUCBQcm90b2NvbCBzdGFydCB0eCBBUlAgcGt0ISFcbiIpOwogCQkJCWJkaGNwID0gdHJ1ZTsKIAkJCQlpZWVlLT5MUFNEZWxheUNudCA9CiAJCQkJCSBpZWVlLT5jdXJyZW50X25ldHdvcmsudGltLnRpbV9jb3VudDsKQEAgLTY4MCw3ICs2OTIsOCBAQAogCQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBKSB7CiAJCQlmYyB8PSBSVExMSUJfRkNUTF9UT0RTOwogCQkJLyogVG8gRFM6IEFkZHIxID0gQlNTSUQsIEFkZHIyID0gU0EsCi0JCQlBZGRyMyA9IERBICovCisJCQkgKiBBZGRyMyA9IERBCisJCQkgKi8KIAkJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsCiAJCQkgICAgICAgRVRIX0FMRU4pOwogCQkJbWVtY3B5KCZoZWFkZXIuYWRkcjIsICZzcmMsIEVUSF9BTEVOKTsKQEAgLTY5MSw3ICs3MDQsOCBAQAogCQkJCW1lbWNweSgmaGVhZGVyLmFkZHIzLCAmZGVzdCwgRVRIX0FMRU4pOwogCQl9IGVsc2UgaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQykgewogCQkJLyogbm90IEZyb20vVG8gRFM6IEFkZHIxID0gREEsIEFkZHIyID0gU0EsCi0JCQlBZGRyMyA9IEJTU0lEICovCisJCQkgKiBBZGRyMyA9IEJTU0lECisJCQkgKi8KIAkJCW1lbWNweSgmaGVhZGVyLmFkZHIxLCBkZXN0LCBFVEhfQUxFTik7CiAJCQltZW1jcHkoJmhlYWRlci5hZGRyMiwgc3JjLCBFVEhfQUxFTik7CiAJCQltZW1jcHkoJmhlYWRlci5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLApAQCAtNzAzLDcgKzcxNyw4IEBACiAJCWhlYWRlci5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNihmYyk7CiAKIAkJLyogRGV0ZXJtaW5lIGZyYWdtZW50YXRpb24gc2l6ZSBiYXNlZCBvbiBkZXN0aW5hdGlvbiAobXVsdGljYXN0Ci0JCSogYW5kIGJyb2FkY2FzdCBhcmUgbm90IGZyYWdtZW50ZWQpICovCisJCSAqIGFuZCBicm9hZGNhc3QgYXJlIG5vdCBmcmFnbWVudGVkKQorCQkgKi8KIAkJaWYgKGJJc011bHRpY2FzdCkgewogCQkJZnJhZ19zaXplID0gTUFYX0ZSQUdfVEhSRVNIT0xEOwogCQkJcW9zX2N0bCB8PSBRT1NfQ1RMX05PVENPTlRBSU5fQUNLOwpAQCAtNzE3LDEwICs3MzIsMTEgQEAKIAogCQkvKiBpbiBjYXNlIHdlIGFyZSBhIGNsaWVudCB2ZXJpZnkgYWNtIGlzIG5vdCBzZXQgZm9yIHRoaXMgYWMgKi8KIAkJd2hpbGUgKHVubGlrZWx5KGllZWUtPndtbV9hY20gJiAoMHgwMSA8PCBza2ItPnByaW9yaXR5KSkpIHsKLQkJCXByaW50ayhLRVJOX0lORk8gInNrYi0+cHJpb3JpdHkgPSAleFxuIiwgc2tiLT5wcmlvcml0eSk7CisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJza2ItPnByaW9yaXR5ID0gJXhcbiIsCisJCQkJICAgIHNrYi0+cHJpb3JpdHkpOwogCQkJaWYgKHdtZV9kb3duZ3JhZGVfYWMoc2tiKSkKIAkJCQlicmVhazsKLQkJCXByaW50ayhLRVJOX0lORk8gImNvbnZlcnRlZCBza2ItPnByaW9yaXR5ID0gJXhcbiIsCisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJjb252ZXJ0ZWQgc2tiLT5wcmlvcml0eSA9ICV4XG4iLAogCQkJICAgICAgIHNrYi0+cHJpb3JpdHkpOwogCQkgfQogCQkJcW9zX2N0bCB8PSBza2ItPnByaW9yaXR5OwpAQCAtNzMxLDE0ICs3NDcsMTYgQEAKIAkJLyogRGV0ZXJtaW5lIGFtb3VudCBvZiBwYXlsb2FkIHBlciBmcmFnbWVudC4gIFJlZ2FyZGxlc3Mgb2YgaWYKIAkJICogdGhpcyBzdGFjayBpcyBwcm92aWRpbmcgdGhlIGZ1bGwgODAyLjExIGhlYWRlciwgb25lIHdpbGwKIAkJICogZXZlbnR1YWxseSBiZSBhZmZpeGVkIHRvIHRoaXMgZnJhZ21lbnQgLS0gc28gd2UgbXVzdCBhY2NvdW50Ci0JCSAqIGZvciBpdCB3aGVuIGRldGVybWluaW5nIHRoZSBhbW91bnQgb2YgcGF5bG9hZCBzcGFjZS4gKi8KKwkJICogZm9yIGl0IHdoZW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvZiBwYXlsb2FkIHNwYWNlLgorCQkgKi8KIAkJYnl0ZXNfcGVyX2ZyYWcgPSBmcmFnX3NpemUgLSBoZHJfbGVuOwogCQlpZiAoaWVlZS0+Y29uZmlnICYKIAkJICAgKENGR19SVExMSUJfQ09NUFVURV9GQ1MgfCBDRkdfUlRMTElCX1JFU0VSVkVfRkNTKSkKIAkJCWJ5dGVzX3Blcl9mcmFnIC09IFJUTExJQl9GQ1NfTEVOOwogCiAJCS8qIEVhY2ggZnJhZ21lbnQgbWF5IG5lZWQgdG8gaGF2ZSByb29tIGZvciBlbmNyeXB0aW5nCi0JCSAqIHByZS9wb3N0Zml4ICovCisJCSAqIHByZS9wb3N0Zml4CisJCSAqLwogCQlpZiAoZW5jcnlwdCkgewogCQkJYnl0ZXNfcGVyX2ZyYWcgLT0gY3J5cHQtPm9wcy0+ZXh0cmFfbXBkdV9wcmVmaXhfbGVuICsKIAkJCQljcnlwdC0+b3BzLT5leHRyYV9tcGR1X3Bvc3RmaXhfbGVuICsKQEAgLTc0Niw3ICs3NjQsOCBAQAogCQkJCWNyeXB0LT5vcHMtPmV4dHJhX21zZHVfcG9zdGZpeF9sZW47CiAJCX0KIAkJLyogTnVtYmVyIG9mIGZyYWdtZW50cyBpcyB0aGUgdG90YWwgYnl0ZXNfcGVyX2ZyYWcgLwotCQkqIHBheWxvYWRfcGVyX2ZyYWdtZW50ICovCisJCSAqIHBheWxvYWRfcGVyX2ZyYWdtZW50CisJCSAqLwogCQlucl9mcmFncyA9IGJ5dGVzIC8gYnl0ZXNfcGVyX2ZyYWc7CiAJCWJ5dGVzX2xhc3RfZnJhZyA9IGJ5dGVzICUgYnl0ZXNfcGVyX2ZyYWc7CiAJCWlmIChieXRlc19sYXN0X2ZyYWcpCkBAIC03NTYsMTIgKzc3NSwxMiBAQAogCiAJCS8qIFdoZW4gd2UgYWxsb2NhdGUgdGhlIFRYQiB3ZSBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZQogCQkgKiByZXNlcnZlIGFuZCBmdWxsIGZyYWdtZW50IGJ5dGVzIChieXRlc19wZXJfZnJhZyBkb2Vzbid0Ci0JCSAqIGluY2x1ZGUgcHJlZml4LCBwb3N0Zml4LCBoZWFkZXIsIEZDUywgZXRjLikgKi8KKwkJICogaW5jbHVkZSBwcmVmaXgsIHBvc3RmaXgsIGhlYWRlciwgRkNTLCBldGMuKQorCQkgKi8KIAkJdHhiID0gcnRsbGliX2FsbG9jX3R4Yihucl9mcmFncywgZnJhZ19zaXplICsKIAkJCQkgICAgICAgaWVlZS0+dHhfaGVhZHJvb20sIEdGUF9BVE9NSUMpOwogCQlpZiAodW5saWtlbHkoIXR4YikpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iLAotCQkJaWVlZS0+ZGV2LT5uYW1lKTsKKwkJCW5ldGRldl93YXJuKGllZWUtPmRldiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBUWEJcbiIpOwogCQkJZ290byBmYWlsZWQ7CiAJCX0KIAkJdHhiLT5lbmNyeXB0ZWQgPSBlbmNyeXB0OwpAQCAtODAxLDcgKzgyMCw4IEBACiAJCQltZW1jcHkoZnJhZ19oZHIsICZoZWFkZXIsIGhkcl9sZW4pOwogCiAJCQkvKiBJZiB0aGlzIGlzIG5vdCB0aGUgbGFzdCBmcmFnbWVudCwgdGhlbiBhZGQgdGhlCi0JCQkgKiBNT1JFRlJBR1MgYml0IHRvIHRoZSBmcmFtZSBjb250cm9sICovCisJCQkgKiBNT1JFRlJBR1MgYml0IHRvIHRoZSBmcmFtZSBjb250cm9sCisJCQkgKi8KIAkJCWlmIChpICE9IG5yX2ZyYWdzIC0gMSkgewogCQkJCWZyYWdfaGRyLT5mcmFtZV9jdGwgPSBjcHVfdG9fbGUxNigKIAkJCQkJZmMgfCBSVExMSUJfRkNUTF9NT1JFRlJBR1MpOwpAQCAtODM2LDcgKzg1Niw4IEBACiAKIAkJCS8qIEVuY3J5cHRpb24gcm91dGluZSB3aWxsIG1vdmUgdGhlIGhlYWRlciBmb3J3YXJkIGluCiAJCQkgKiBvcmRlciB0byBpbnNlcnQgdGhlIElWIGJldHdlZW4gdGhlIGhlYWRlciBhbmQgdGhlCi0JCQkgKiBwYXlsb2FkICovCisJCQkgKiBwYXlsb2FkCisJCQkgKi8KIAkJCWlmIChlbmNyeXB0KQogCQkJCXJ0bGxpYl9lbmNyeXB0X2ZyYWdtZW50KGllZWUsIHNrYl9mcmFnLAogCQkJCQkJCWhkcl9sZW4pOwpAQCAtODU4LDE1ICs4NzksMTQgQEAKIAkJfQogCX0gZWxzZSB7CiAJCWlmICh1bmxpa2VseShza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgcnRsbGliX2hkcl8zYWRkcikpKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogc2tiIHRvbyBzbWFsbCAoJWQpLlxuIiwKLQkJCWllZWUtPmRldi0+bmFtZSwgc2tiLT5sZW4pOworCQkJbmV0ZGV2X3dhcm4oaWVlZS0+ZGV2LCAic2tiIHRvbyBzbWFsbCAoJWQpLlxuIiwKKwkJCQkgICAgc2tiLT5sZW4pOwogCQkJZ290byBzdWNjZXNzOwogCQl9CiAKIAkJdHhiID0gcnRsbGliX2FsbG9jX3R4YigxLCBza2ItPmxlbiwgR0ZQX0FUT01JQyk7CiAJCWlmICghdHhiKSB7Ci0JCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIFRYQlxuIiwKLQkJCWllZWUtPmRldi0+bmFtZSk7CisJCQluZXRkZXZfd2FybihpZWVlLT5kZXYsICJDb3VsZCBub3QgYWxsb2NhdGUgVFhCXG4iKTsKIAkJCWdvdG8gZmFpbGVkOwogCQl9CiAKQEAgLTkwNiw4ICs5MjYsNyBAQAogCQkJaWYgKHRjYl9kZXNjLT5iTXVsdGljYXN0IHx8ICB0Y2JfZGVzYy0+YkJyb2FkY2FzdCkKIAkJCQl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gaWVlZS0+YmFzaWNfcmF0ZTsKIAkJCWVsc2UKLQkJCQl0Y2JfZGVzYy0+ZGF0YV9yYXRlID0gQ1VSUkVOVF9SQVRFKGllZWUtPm1vZGUsCi0JCQkJCWllZWUtPnJhdGUsIGllZWUtPkhUQ3VycmVudE9wZXJhUmF0ZSk7CisJCQkJdGNiX2Rlc2MtPmRhdGFfcmF0ZSA9IHJ0bGxpYl9jdXJyZW50X3JhdGUoaWVlZSk7CiAKIAkJCWlmIChiZGhjcCkgewogCQkJCWlmIChpZWVlLT5wSFRJbmZvLT5JT1RBY3Rpb24gJgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJlL3J0bGxpYl93eC5jCmluZGV4IDllMGY5NzUuLjYyMzRhYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkyZS9ydGxsaWJfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MmUvcnRsbGliX3d4LmMKQEAgLTMyLDcgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLQorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSAicnRsbGliLmgiCiBzdHJ1Y3QgbW9kZXNfdW5pdCB7CiAJY2hhciAqbW9kZV9zdHJpbmc7CkBAIC02NSw3ICs2NSw3IEBACiAJLyogRmlyc3QgZW50cnkgKk1VU1QqIGJlIHRoZSBBUCBNQUMgYWRkcmVzcyAqLwogCWl3ZS5jbWQgPSBTSU9DR0lXQVA7CiAJaXdlLnUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JbWVtY3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgbmV0d29yay0+YnNzaWQsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBuZXR3b3JrLT5ic3NpZCk7CiAJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9yc2woaW5mbywgc3RhcnQsIHN0b3AsCiAJCQkJCSAmaXdlLCBJV19FVl9BRERSX0xFTik7CiAJLyogUmVtYWluaW5nIGVudHJpZXMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yZGVyIHdlIHByb3ZpZGUgdGhlbSAqLwpAQCAtNzQsNyArNzQsNyBAQAogCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CiAJaXdlLnUuZGF0YS5mbGFncyA9IDE7CiAJaWYgKG5ldHdvcmstPnNzaWRfbGVuID4gMCkgewotCQlpd2UudS5kYXRhLmxlbmd0aCA9IG1pbihuZXR3b3JrLT5zc2lkX2xlbiwgKHU4KTMyKTsKKwkJaXdlLnUuZGF0YS5sZW5ndGggPSBtaW5fdCh1OCwgbmV0d29yay0+c3NpZF9sZW4sIDMyKTsKIAkJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9yc2woaW5mbywgc3RhcnQsIHN0b3AsICZpd2UsCiAJCQkJCQkgbmV0d29yay0+c3NpZCk7CiAJfSBlbHNlIGlmIChuZXR3b3JrLT5oaWRkZW5fc3NpZF9sZW4gPT0gMCkgewpAQCAtODIsNyArODIsNyBAQAogCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwKIAkJCQkJCSAmaXdlLCAiPGhpZGRlbj4iKTsKIAl9IGVsc2UgewotCQlpd2UudS5kYXRhLmxlbmd0aCA9IG1pbihuZXR3b3JrLT5oaWRkZW5fc3NpZF9sZW4sICh1OCkzMik7CisJCWl3ZS51LmRhdGEubGVuZ3RoID0gbWluX3QodTgsIG5ldHdvcmstPmhpZGRlbl9zc2lkX2xlbiwgMzIpOwogCQlzdGFydCA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50X3JzbChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwKIAkJCQkJCSBuZXR3b3JrLT5oaWRkZW5fc3NpZCk7CiAJfQpAQCAtMTEzLDggKzExMyw2IEBACiAKIAkvKiBBZGQgZnJlcXVlbmN5L2NoYW5uZWwgKi8KIAlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7Ci0vKglpd2UudS5mcmVxLm0gPSBydGxsaWJfZnJlcXVlbmN5KG5ldHdvcmstPmNoYW5uZWwsIG5ldHdvcmstPm1vZGUpOwotCWl3ZS51LmZyZXEuZSA9IDM7ICovCiAJaXdlLnUuZnJlcS5tID0gbmV0d29yay0+Y2hhbm5lbDsKIAlpd2UudS5mcmVxLmUgPSAwOwogCWl3ZS51LmZyZXEuaSA9IDA7CkBAIC0yNDEsNyArMjM5LDggQEAKIAl9CiAKIAkvKiBBZGQgRVhUUkE6IEFnZSB0byBkaXNwbGF5IHNlY29uZHMgc2luY2UgbGFzdCBiZWFjb24vcHJvYmUgcmVzcG9uc2UKLQkgKiBmb3IgZ2l2ZW4gbmV0d29yay4gKi8KKwkgKiBmb3IgZ2l2ZW4gbmV0d29yay4KKwkgKi8KIAlpd2UuY21kID0gSVdFVkNVU1RPTTsKIAlwID0gY3VzdG9tOwogCXAgKz0gc25wcmludGYocCwgTUFYX0NVU1RPTV9MRU4gLSAocCAtIGN1c3RvbSksCkBAIC0yODIsOCArMjgxLDcgQEAKIAkJCWV2ID0gcnRsODE5eF90cmFuc2xhdGVfc2NhbihpZWVlLCBldiwgc3RvcCwgbmV0d29yaywKIAkJCQkJCSAgICBpbmZvKTsKIAkJZWxzZQotCQkJUlRMTElCX0RFQlVHX1NDQU4oIk5vdCBzaG93aW5nIG5ldHdvcmsgJyVzICgiCi0JCQkJIiAlcE0pJyBkdWUgdG8gYWdlICglbHVtcykuXG4iLAorCQkJUlRMTElCX0RFQlVHX1NDQU4oIk5vdCBzaG93aW5nIG5ldHdvcmsgJyVzICggJXBNKScgZHVlIHRvIGFnZSAoJWx1bXMpLlxuIiwKIAkJCQllc2NhcGVfZXNzaWQobmV0d29yay0+c3NpZCwKIAkJCQkJICAgICBuZXR3b3JrLT5zc2lkX2xlbiksCiAJCQkJbmV0d29yay0+YnNzaWQsCkBAIC0zMzgsMTMgKzMzNiwxNCBAQAogCQkJUlRMTElCX0RFQlVHX1dYKCJEaXNhYmxpbmcgZW5jcnlwdGlvbi5cbiIpOwogCiAJCS8qIENoZWNrIGFsbCB0aGUga2V5cyB0byBzZWUgaWYgYW55IGFyZSBzdGlsbCBjb25maWd1cmVkLAotCQkgKiBhbmQgaWYgbm8ga2V5IGluZGV4IHdhcyBwcm92aWRlZCwgZGUtaW5pdCB0aGVtIGFsbCAqLworCQkgKiBhbmQgaWYgbm8ga2V5IGluZGV4IHdhcyBwcm92aWRlZCwgZGUtaW5pdCB0aGVtIGFsbAorCQkgKi8KIAkJZm9yIChpID0gMDsgaSA8IE5VTV9XRVBfS0VZUzsgaSsrKSB7CiAJCQlpZiAoaWVlZS0+Y3J5cHRfaW5mby5jcnlwdFtpXSAhPSBOVUxMKSB7CiAJCQkJaWYgKGtleV9wcm92aWRlZCkKIAkJCQkJYnJlYWs7CiAJCQkJbGliODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoJmllZWUtPmNyeXB0X2luZm8sCi0JCQkJCQkJICAgICZpZWVlLT5jcnlwdF9pbmZvLmNyeXB0W2ldKTsKKwkJCQkJCSAgICAmaWVlZS0+Y3J5cHRfaW5mby5jcnlwdFtpXSk7CiAJCQl9CiAJCX0KIApAQCAtMzY1LDcgKzM2NCw4IEBACiAJaWYgKCpjcnlwdCAhPSBOVUxMICYmICgqY3J5cHQpLT5vcHMgIT0gTlVMTCAmJgogCSAgICBzdHJjbXAoKCpjcnlwdCktPm9wcy0+bmFtZSwgIlItV0VQIikgIT0gMCkgewogCQkvKiBjaGFuZ2luZyB0byB1c2UgV0VQOyBkZWluaXQgcHJldmlvdXNseSB1c2VkIGFsZ29yaXRobQotCQkgKiBvbiB0aGlzIGtleSAqLworCQkgKiBvbiB0aGlzIGtleQorCQkgKi8KIAkJbGliODAyMTFfY3J5cHRfZGVsYXllZF9kZWluaXQoJmllZWUtPmNyeXB0X2luZm8sIGNyeXB0KTsKIAl9CiAKQEAgLTM5MCw5ICszOTAsOSBAQAogCQkJa2ZyZWUobmV3X2NyeXB0KTsKIAkJCW5ld19jcnlwdCA9IE5VTEw7CiAKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBjb3VsZCBub3QgaW5pdGlhbGl6ZSBXRVA6ICIKLQkJCSAgICAgICAibG9hZCBtb2R1bGUgcnRsbGliX2NyeXB0X3dlcFxuIiwKLQkJCSAgICAgICBkZXYtPm5hbWUpOworCQkJbmV0ZGV2X3dhcm4oZGV2LAorCQkJCSAgICAiJXM6IGNvdWxkIG5vdCBpbml0aWFsaXplIFdFUDogbG9hZCBtb2R1bGUgcnRsbGliX2NyeXB0X3dlcFxuIiwKKwkJCQkgICAgZGV2LT5uYW1lKTsKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAkJfQogCQkqY3J5cHQgPSBuZXdfY3J5cHQ7CkBAIC00MTMsNyArNDEzLDggQEAKIAkJCQkgICAgICAgKCpjcnlwdCktPnByaXYpOwogCQlzZWMuZmxhZ3MgfD0gKDEgPDwga2V5KTsKIAkJLyogVGhpcyBlbnN1cmVzIGEga2V5IHdpbGwgYmUgYWN0aXZhdGVkIGlmIG5vIGtleSBpcwotCQkgKiBleHBsaWNpdGx5IHNldCAqLworCQkgKiBleHBsaWNpdGx5IHNldAorCQkgKi8KIAkJaWYgKGtleSA9PSBzZWMuYWN0aXZlX2tleSkKIAkJCXNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKIAkJaWVlZS0+Y3J5cHRfaW5mby50eF9rZXlpZHggPSBrZXk7CkBAIC00MjMsMTEgKzQyNCw5IEBACiAJCQkJCSAgICAgTlVMTCwgKCpjcnlwdCktPnByaXYpOwogCQlpZiAobGVuID09IDApIHsKIAkJCS8qIFNldCBhIGRlZmF1bHQga2V5IG9mIGFsbCAwICovCi0JCQlwcmludGsoS0VSTl9JTkZPICJTZXR0aW5nIGtleSAlZCB0byBhbGwgemVyby5cbiIsCisJCQluZXRkZXZfaW5mbyhpZWVlLT5kZXYsICJTZXR0aW5nIGtleSAlZCB0byBhbGwgemVyby5cbiIsCiAJCQkJCSAgIGtleSk7CiAKLQkJCVJUTExJQl9ERUJVR19XWCgiU2V0dGluZyBrZXkgJWQgdG8gYWxsIHplcm8uXG4iLAotCQkJCQkgICBrZXkpOwogCQkJbWVtc2V0KHNlYy5rZXlzW2tleV0sIDAsIDEzKTsKIAkJCSgqY3J5cHQpLT5vcHMtPnNldF9rZXkoc2VjLmtleXNba2V5XSwgMTMsIE5VTEwsCiAJCQkJCSAgICAgICAoKmNyeXB0KS0+cHJpdik7CkBAIC00MzcsOCArNDM2LDggQEAKIAogCQkvKiBObyBrZXkgZGF0YSAtIGp1c3Qgc2V0IHRoZSBkZWZhdWx0IFRYIGtleSBpbmRleCAqLwogCQlpZiAoa2V5X3Byb3ZpZGVkKSB7Ci0JCQlSVExMSUJfREVCVUdfV1goCi0JCQkJIlNldHRpbmcga2V5ICVkIHRvIGRlZmF1bHQgVHgga2V5LlxuIiwga2V5KTsKKwkJCVJUTExJQl9ERUJVR19XWCgiU2V0dGluZyBrZXkgJWQgdG8gZGVmYXVsdCBUeCBrZXkuXG4iLAorCQkJCQlrZXkpOwogCQkJaWVlZS0+Y3J5cHRfaW5mby50eF9rZXlpZHggPSBrZXk7CiAJCQlzZWMuYWN0aXZlX2tleSA9IGtleTsKIAkJCXNlYy5mbGFncyB8PSBTRUNfQUNUSVZFX0tFWTsKQEAgLTQ1NCw3ICs0NTMsOCBAQAogCQkJICAgIk9QRU4iIDogIlNIQVJFRCBLRVkiKTsKIAogCS8qIEZvciBub3cgd2UganVzdCBzdXBwb3J0IFdFUCwgc28gb25seSBzZXQgdGhhdCBzZWN1cml0eSBsZXZlbC4uLgotCSAqIFRPRE86IFdoZW4gV1BBIGlzIGFkZGVkIHRoaXMgaXMgb25lIHBsYWNlIHRoYXQgbmVlZHMgdG8gY2hhbmdlICovCisJICogVE9ETzogV2hlbiBXUEEgaXMgYWRkZWQgdGhpcyBpcyBvbmUgcGxhY2UgdGhhdCBuZWVkcyB0byBjaGFuZ2UKKwkgKi8KIAlzZWMuZmxhZ3MgfD0gU0VDX0xFVkVMOwogCXNlYy5sZXZlbCA9IFNFQ19MRVZFTF8xOyAvKiA0MCBhbmQgMTA0IGJpdCBXRVAgKi8KIApAQCAtNDY1LDExICs0NjUsMTIgQEAKIAkgKiBnZW5lcmF0ZSBuZXcgSUVFRSA4MDIuMTEgYXV0aGVudGljYXRpb24gd2hpY2ggbWF5IGVuZCB1cCBpbiBsb29waW5nCiAJICogd2l0aCBJRUVFIDgwMi4xWC4gIElmIHlvdXIgaGFyZHdhcmUgcmVxdWlyZXMgYSByZXNldCBhZnRlciBXRVAKIAkgKiBjb25maWd1cmF0aW9uIChmb3IgZXhhbXBsZS4uLiBQcmlzbTIpLCBpbXBsZW1lbnQgdGhlIHJlc2V0X3BvcnQgaW4KLQkgKiB0aGUgY2FsbGJhY2tzIHN0cnVjdHVyZXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSA4MDIuMTEgc3RhY2suICovCisJICogdGhlIGNhbGxiYWNrcyBzdHJ1Y3R1cmVzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgODAyLjExIHN0YWNrLgorCSAqLwogCWlmIChpZWVlLT5yZXNldF9vbl9rZXljaGFuZ2UgJiYKIAkgICAgaWVlZS0+aXdfbW9kZSAhPSBJV19NT0RFX0lORlJBICYmCiAJICAgIGllZWUtPnJlc2V0X3BvcnQgJiYgaWVlZS0+cmVzZXRfcG9ydChkZXYpKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlczogcmVzZXRfcG9ydCBmYWlsZWRcbiIsIGRldi0+bmFtZSk7CisJCW5ldGRldl9kYmcoZGV2LCAiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJcmV0dXJuIDA7CkBAIC01OTYsNyArNTk3LDcgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBkb25lOwogCX0KLQlwcmludGsoS0VSTl9JTkZPICJhbGcgbmFtZTolc1xuIiwgYWxnKTsKKwluZXRkZXZfaW5mbyhkZXYsICJhbGcgbmFtZTolc1xuIiwgYWxnKTsKIAogCW9wcyA9IGxpYjgwMjExX2dldF9jcnlwdG9fb3BzKGFsZyk7CiAJaWYgKG9wcyA9PSBOVUxMKSB7CkBAIC02MDgsOSArNjA5LDcgQEAKIAkJb3BzID0gbGliODAyMTFfZ2V0X2NyeXB0b19vcHMoYWxnKTsKIAl9CiAJaWYgKG9wcyA9PSBOVUxMKSB7Ci0JCVJUTExJQl9ERUJVR19XWCgiJXM6IHVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwKLQkJCQkgICBkZXYtPm5hbWUsIGV4dC0+YWxnKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiPT09PT09PT0+dW5rbm93biBjcnlwdG8gYWxnICVkXG4iLCBleHQtPmFsZyk7CisJCW5ldGRldl9pbmZvKGRldiwgIj09PT09PT09PnVua25vd24gY3J5cHRvIGFsZyAlZFxuIiwgZXh0LT5hbGcpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtNjQxLDggKzY0MCw3IEBACiAJaWYgKGV4dC0+a2V5X2xlbiA+IDAgJiYgKCpjcnlwdCktPm9wcy0+c2V0X2tleSAmJgogCSAgICAoKmNyeXB0KS0+b3BzLT5zZXRfa2V5KGV4dC0+a2V5LCBleHQtPmtleV9sZW4sIGV4dC0+cnhfc2VxLAogCQkJCSAgICgqY3J5cHQpLT5wcml2KSA8IDApIHsKLQkJUlRMTElCX0RFQlVHX1dYKCIlczoga2V5IHNldHRpbmcgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOwotCQlwcmludGsoS0VSTl9JTkZPICJrZXkgc2V0dGluZyBmYWlsZWRcbiIpOworCQluZXRkZXZfaW5mbyhkZXYsICJrZXkgc2V0dGluZyBmYWlsZWRcbiIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtNzU5LDkgKzc1Nyw5IEBACiAKIAljYXNlIElXX01MTUVfRElTQVNTT0M6CiAJCWlmIChkZWF1dGgpCi0JCQlwcmludGsoS0VSTl9JTkZPICJkaXNhdXRoIHBhY2tldCAhXG4iKTsKKwkJCW5ldGRldl9pbmZvKGllZWUtPmRldiwgImRpc2F1dGggcGFja2V0ICFcbiIpOwogCQllbHNlCi0JCQlwcmludGsoS0VSTl9JTkZPICJkaXMgYXNzb2NpYXRlIHBhY2tldCFcbiIpOworCQkJbmV0ZGV2X2luZm8oaWVlZS0+ZGV2LCAiZGlzIGFzc29jaWF0ZSBwYWNrZXQhXG4iKTsKIAogCQlpZWVlLT5jYW5ub3Rfbm90aWZ5ID0gdHJ1ZTsKIApAQCAtNzk3LDggKzc5NSw3IEBACiAJY2FzZSBJV19BVVRIX0NJUEhFUl9QQUlSV0lTRToKIAljYXNlIElXX0FVVEhfQ0lQSEVSX0dST1VQOgogCWNhc2UgSVdfQVVUSF9LRVlfTUdNVDoKLQkJLyoKLQkJICogSG9zdCBBUCBkcml2ZXIgZG9lcyBub3QgdXNlIHRoZXNlIHBhcmFtZXRlcnMgYW5kIGFsbG93cworCQkvKiBIb3N0IEFQIGRyaXZlciBkb2VzIG5vdCB1c2UgdGhlc2UgcGFyYW1ldGVycyBhbmQgYWxsb3dzCiAJCSAqIHdwYV9zdXBwbGljYW50IHRvIGNvbnRyb2wgdGhlbSBpbnRlcm5hbGx5LgogCQkgKi8KIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuYwppbmRleCA5MGFjZTc5Li44MmQ2MDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmMKQEAgLTYsNyArNiw3IEBACiB7CiAJUFJUX0RPVDExRF9JTkZPIHBEb3QxMWRJbmZvID0gR0VUX0RPVDExRF9JTkZPKGllZWUpOwogCi0JcERvdDExZEluZm8tPmJFbmFibGVkID0gMDsKKwlwRG90MTFkSW5mby0+YkVuYWJsZWQgPSBmYWxzZTsKIAogCXBEb3QxMWRJbmZvLT5TdGF0ZSA9IERPVDExRF9TVEFURV9OT05FOwogCXBEb3QxMWRJbmZvLT5Db3VudHJ5SWVMZW4gPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvZG90MTFkLmgKaW5kZXggYmQ3NWUyOS4uOGFlNjczYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9kb3QxMWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2RvdDExZC5oCkBAIC01Myw3ICs1Myw3IEBACiAKICNkZWZpbmUgQ0lFX1dBVENIRE9HX1RIIDEKICNkZWZpbmUgR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5Db3VudHJ5SWVXYXRjaGRvZykKLSNkZWZpbmUgUkVTRVRfQ0lFX1dBVENIRE9HKF9fcEllZWVEZXYpIEdFVF9DSUVfV0FUQ0hET0coX19wSWVlZURldikgPSAwCisjZGVmaW5lIFJFU0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSAoR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSA9IDApCiAjZGVmaW5lIFVQREFURV9DSUVfV0FUQ0hET0coX19wSWVlZURldikgKCsrR0VUX0NJRV9XQVRDSERPRyhfX3BJZWVlRGV2KSkKIAogI2RlZmluZSBJU19ET1QxMURfU1RBVEVfRE9ORShfX3BJZWVlRGV2KSAoR0VUX0RPVDExRF9JTkZPKF9fcEllZWVEZXYpLT5TdGF0ZSA9PSBET1QxMURfU1RBVEVfRE9ORSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMS5oCmluZGV4IGI0NGFhMTcuLjBmNTNjNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTEuaApAQCAtNjA2LDMzICs2MDYsNiBAQAogI2RlZmluZSBJRUVFODAyMTFfREVCVUdfUlgoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUlgsIGYsICMjIGEpCiAjZGVmaW5lIElFRUU4MDIxMV9ERUJVR19RT1MoZiwgYS4uLikgIElFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfUU9TLCBmLCAjIyBhKQogCi0jaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRwotLyogQWRkZWQgYnkgQW5uaWUsIDIwMDUtMTEtMjIuICovCi0jZGVmaW5lIE1BWF9TVFJfTEVOICAgICA2NAotLyogSSB3YW50IHRvIHNlZSBBU0NJSSAzMyB0byAxMjYgb25seS4gT3RoZXJ3aXNlLCBJIHByaW50ICc/Jy4gQW5uaWUsIDIwMDUtMTEtMjIuKi8KLSNkZWZpbmUgUFJJTlRBQkxFKF9jaCkgIChfY2g+JyEnICYmIF9jaDwnficpCi0jZGVmaW5lIElFRUU4MDIxMV9QUklOVF9TVFIoX0NvbXAsIF9UaXRsZVN0cmluZywgX1B0ciwgX0xlbikJCQkJCVwKLQkJCWlmKChfQ29tcCkgJiBsZXZlbCkJCQkJCQkJXAotCQkJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCWludCAgICAgICAgICAgICBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJdTggIGJ1ZmZlcltNQVhfU1RSX0xFTl07CQkJCQlcCi0JCQkJaW50IGxlbmd0aCA9IChfTGVuPE1BWF9TVFJfTEVOKT8gX0xlbiA6IChNQVhfU1RSX0xFTi0xKSA7CVwKLQkJCQltZW1zZXQoYnVmZmVyLCAwLCBNQVhfU1RSX0xFTik7CQkJCQlcCi0JCQkJbWVtY3B5KGJ1ZmZlciwgKHU4ICopX1B0ciwgbGVuZ3RoICk7CQkJCVwKLQkJCQlmb3IoIF9faT0wOyBfX2k8TUFYX1NUUl9MRU47IF9faSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJICAgICBpZiggIVBSSU5UQUJMRShidWZmZXJbX19pXSkgKSAgIGJ1ZmZlcltfX2ldID0gJz8nOwkJXAotCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCQkJYnVmZmVyW2xlbmd0aF0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQlwcmludGsoIlJ0bDgxOXg6ICIpOwkJCQkJCVwKLQkJCQlwcmludGsoX1RpdGxlU3RyaW5nKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCQlwcmludGsoIjogJWQsIDwlcz5cbiIsIF9MZW4sIGJ1ZmZlcik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJCX0KLSNlbHNlCi0jZGVmaW5lIElFRUU4MDIxMV9QUklOVF9TVFIoX0NvbXAsIF9UaXRsZVN0cmluZywgX1B0ciwgX0xlbikgIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4gLyogQVJQSFJEX0VUSEVSICovCiAKICNpZm5kZWYgV0lSRUxFU1NfU1BZCkBAIC02NjEsNyArNjM0LDcgQEAKIAl1OCAgICBjdHJsOyAgIC8qIGFsd2F5cyAweDAzICovCiAJdTggICAgb3VpW1A4MDIxMV9PVUlfTEVOXTsgICAgLyogb3JnYW5pemF0aW9uYWwgdW5pdmVyc2FsIGlkICovCiAKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogI2RlZmluZSBTTkFQX1NJWkUgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfc25hcF9oZHIpCiAKQEAgLTk5Niw3ICs5NjksNyBAQAogCXU4IGtleXNbV0VQX0tFWVNdW1NDTV9LRVlfTEVOXTsKIAl1OCBsZXZlbDsKIAl1MTYgZmxhZ3M7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIAogLyoKQEAgLTEwNTEsMTQgKzEwMjQsMTQgQEAKIAlfX2xlMTYgZnJhbWVfY3RsOwogCV9fbGUxNiBkdXJhdGlvbl9pZDsKIAl1OCBwYXlsb2FkWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8xYWRkciB7CiAJX19sZTE2IGZyYW1lX2N0bDsKIAlfX2xlMTYgZHVyYXRpb25faWQ7CiAJdTggYWRkcjFbRVRIX0FMRU5dOwogCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfaGRyXzJhZGRyIHsKIAlfX2xlMTYgZnJhbWVfY3RsOwpAQCAtMTA2Niw3ICsxMDM5LDcgQEAKIAl1OCBhZGRyMVtFVEhfQUxFTl07CiAJdTggYWRkcjJbRVRIX0FMRU5dOwogCXU4IHBheWxvYWRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyIHsKIAlfX2xlMTYgZnJhbWVfY3RsOwpAQCAtMTA3Niw3ICsxMDQ5LDcgQEAKIAl1OCBhZGRyM1tFVEhfQUxFTl07CiAJX19sZTE2IHNlcV9jdGw7CiAJdTggcGF5bG9hZFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHIgewogCV9fbGUxNiBmcmFtZV9jdGw7CkBAIC0xMDg3LDcgKzEwNjAsNyBAQAogCV9fbGUxNiBzZXFfY3RsOwogCXU4IGFkZHI0W0VUSF9BTEVOXTsKIAl1OCBwYXlsb2FkWzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcnFvcyB7CiAJX19sZTE2IGZyYW1lX2N0bDsKQEAgLTEwOTgsNyArMTA3MSw3IEBACiAJX19sZTE2IHNlcV9jdGw7CiAJdTggcGF5bG9hZFswXTsKIAlfX2xlMTYgcW9zX2N0bDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9oZHJfNGFkZHJxb3MgewogCV9fbGUxNiBmcmFtZV9jdGw7CkBAIC0xMTEwLDEzICsxMDgzLDEzIEBACiAJdTggYWRkcjRbRVRIX0FMRU5dOwogCXU4IHBheWxvYWRbMF07CiAJX19sZTE2IHFvc19jdGw7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IHsKIAl1OCBpZDsKIAl1OCBsZW47CiAJdTggZGF0YVswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwpAQCAtMTEyNSwxOCArMTA5OCwxOCBAQAogCV9fbGUxNiBzdGF0dXM7CiAJLypjaGFsbGVuZ2UqLwogCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9kaXNhc3NvYyB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwogCV9fbGUxNiByZWFzb247Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfcHJvYmVfcmVxdWVzdCB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwogCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcyAqLwogCXN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50IGluZm9fZWxlbWVudFswXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9wcm9iZV9yZXNwb25zZSB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGVhZGVyOwpAQCAtMTE0Niw3ICsxMTE5LDcgQEAKIAkvKiBTU0lELCBzdXBwb3J0ZWQgcmF0ZXMsIEZIIHBhcmFtcywgRFMgcGFyYW1zLAogCSAqIENGIHBhcmFtcywgSUJTUyBwYXJhbXMsIFRJTSAoaWYgYmVhY29uKSwgUlNOICovCiAJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvKiBBbGlhcyBiZWFjb24gZm9yIHByb2JlX3Jlc3BvbnNlICovCiAjZGVmaW5lIGllZWU4MDIxMV9iZWFjb24gaWVlZTgwMjExX3Byb2JlX3Jlc3BvbnNlCkBAIC0xMTU3LDcgKzExMzAsNyBAQAogCV9fbGUxNiBsaXN0ZW5faW50ZXJ2YWw7CiAJLyogU1NJRCwgc3VwcG9ydGVkIHJhdGVzLCBSU04gKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfcmVhc3NvY19yZXF1ZXN0X2ZyYW1lIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CkBAIC0xMTY2LDcgKzExMzksNyBAQAogCXU4IGN1cnJlbnRfYXBbRVRIX0FMRU5dOwogCS8qIFNTSUQsIHN1cHBvcnRlZCByYXRlcywgUlNOICovCiAJc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQgaW5mb19lbGVtZW50WzBdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciBoZWFkZXI7CkBAIC0xMTc0LDcgKzExNDcsNyBAQAogCV9fbGUxNiBzdGF0dXM7CiAJX19sZTE2IGFpZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCBpbmZvX2VsZW1lbnRbMF07IC8qIHN1cHBvcnRlZCByYXRlcyAqLwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX3R4YiB7CiAJdTggbnJfZnJhZ3M7CkBAIC0xMTkxLDcgKzExNjQsNyBAQAogc3RydWN0IGllZWU4MDIxMV9kcnZfYWdnX3R4YiB7CiAJdTggbnJfZHJ2X2FnZ19mcmFtZXM7CiAJc3RydWN0IHNrX2J1ZmYgKnR4X2FnZ19mcmFtZXNbTUFYX1RYX0FHR19DT1VOVF07Ci19X19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjZGVmaW5lIE1BWF9TVUJGUkFNRV9DT1VOVAkJICA2NAogc3RydWN0IGllZWU4MDIxMV9yeGIgewpAQCAtMTE5OSw3ICsxMTcyLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc3ViZnJhbWVzW01BWF9TVUJGUkFNRV9DT1VOVF07CiAJdTggZHN0W0VUSF9BTEVOXTsKIAl1OCBzcmNbRVRIX0FMRU5dOwotfV9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogdHlwZWRlZiB1bmlvbiBfZnJhbWVxb3MgewogCXUxNiBzaG9ydGRhdGE7CkBAIC0xMjY3LDE5ICsxMjQwLDE5IEBACiAJdTggcXVpX3N1YnR5cGU7CiAJdTggdmVyc2lvbjsKIAl1OCBhY19pbmZvOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX3Fvc19hY19wYXJhbWV0ZXIgewogCXU4IGFjaV9haWZzbjsKIAl1OCBlY3dfbWluX21heDsKIAlfX2xlMTYgdHhfb3BfbGltaXQ7Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBpZWVlODAyMTFfcW9zX3BhcmFtZXRlcl9pbmZvIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19pbmZvcm1hdGlvbl9lbGVtZW50IGluZm9fZWxlbWVudDsKIAl1OCByZXNlcnZlZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19hY19wYXJhbWV0ZXIgYWNfcGFyYW1zX3JlY29yZFtRT1NfUVVFVUVfTlVNXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyB7CiAJX19sZTE2IGN3X21pbltRT1NfUVVFVUVfTlVNXTsKQEAgLTEyODcsNyArMTI2MCw3IEBACiAJdTggYWlmc1tRT1NfUVVFVUVfTlVNXTsKIAl1OCBmbGFnW1FPU19RVUVVRV9OVU1dOwogCV9fbGUxNiB0eF9vcF9saW1pdFtRT1NfUVVFVUVfTlVNXTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogc3RydWN0IGllZWU4MDIxMV9xb3NfZGF0YSB7CiAJc3RydWN0IGllZWU4MDIxMV9xb3NfcGFyYW1ldGVycyBwYXJhbWV0ZXJzOwpAQCAtMTMwMCw3ICsxMjczLDcgQEAKIHN0cnVjdCBpZWVlODAyMTFfdGltX3BhcmFtZXRlcnMgewogCXU4IHRpbV9jb3VudDsKIAl1OCB0aW1fcGVyaW9kOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAvLyNlbHNlCiBzdHJ1Y3QgaWVlZTgwMjExX3dtbV9hY19wYXJhbSB7CkBAIC0xMzEzLDcgKzEyODYsNyBAQAogCXU4IGFjX2Rpcl90aWQ7CiAJdTggYWNfdXBfcHNiOwogCXU4IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX3dtbV90c3BlY19lbGVtIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3dtbV90c19pbmZvIHRzX2luZm87CkBAIC0xMzMyLDcgKzEzMDUsNyBAQAogCXUzMiBtaW5fcGh5X3JhdGU7CiAJdTE2IHN1cnBfYmFuZF9hbGxvdzsKIAl1MTYgbWVkaXVtX3RpbWU7Ci19X19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogZW51bSBlYXBfdHlwZSB7CiAJRUFQX1BBQ0tFVCA9IDAsCiAJRUFQT0xfU1RBUlQsCkBAIC0xMzcxLDcgKzEzNDQsNyBAQAogCXU4IHZlcnNpb247CiAJdTggdHlwZTsKIAl1MTYgbGVuZ3RoOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaWVlZTgwMjExX3NvZnRtYWNfc3RhdHN7CiAJdW5zaWduZWQgaW50IHJ4X2Fzc19vazsKQEAgLTE0MDEsNyArMTM3NCw3IEBACiBzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudF9oZHIgewogCXU4IGlkOwogCXU4IGxlbjsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworfSBfX3BhY2tlZDsKIAogLyoKICAqIFRoZXNlIGFyZSB0aGUgZGF0YSB0eXBlcyB0aGF0IGNhbiBtYWtlIHVwIG1hbmFnZW1lbnQgcGFja2V0cwpAQCAtMTQxNCw3ICsxMzg3LDcgQEAKIAl1MTYgbGlzdGVuX2ludGVydmFsOwogCXN0cnVjdCB7CiAJCXUxNiBhc3NvY2lhdGlvbl9pZDoxNCwgcmVzZXJ2ZWQ6MjsKLQl9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKwl9IF9fcGFja2VkOwogCXUzMiB0aW1lX3N0YW1wWzJdOwogCXUxNiByZWFzb247CiAJdTE2IHN0YXR1czsKQEAgLTE0NzUsNyArMTQ0OCw3IEBACiAJdTggZXRoZXJfZGhvc3RbRVRIRVJfQUREUl9MRU5dOwogCXU4IGV0aGVyX3Nob3N0W0VUSEVSX0FERFJfTEVOXTsKIAl1MTYgZXRoZXJfdHlwZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Cit9IF9fcGFja2VkOwogCiAjaWZuZGVmIEVUSEVSVFlQRV9QQUUKICNkZWZpbmUJRVRIRVJUWVBFX1BBRQkweDg4OGUJCS8qIEVBUE9MIFBBRS84MDIuMXggKi8KQEAgLTE0ODQsMjQgKzE0NTcsNiBAQAogI2RlZmluZQlFVEhFUlRZUEVfSVAJMHgwODAwCQkvKiBJUCBwcm90b2NvbCAqLwogI2VuZGlmCiAKLXR5cGVkZWYgc3RydWN0IF9ic3NfaHR7Ci0KLQlib29sCQkJCXN1cHBvcnRfaHQ7Ci0KLQkvLyBIVCByZWxhdGVkIGVsZW1lbnRzCi0JdTgJCQkJCWh0X2NhcF9idWZbMzJdOwotCXUxNgkJCQkJaHRfY2FwX2xlbjsKLQl1OAkJCQkJaHRfaW5mb19idWZbMzJdOwotCXUxNgkJCQkJaHRfaW5mb19sZW47Ci0KLQlIVF9TUEVDX1ZFUgkJCWh0X3NwZWNfdmVyOwotCS8vSFRfQ0FQQUJJTElUWV9FTEUJCQliZEhUQ2FwRWxlOwotCS8vSFRfSU5GT1JNQVRJT05fRUxFCQliZEhUSW5mb0VsZTsKLQotCWJvb2wJCQkJYWdncmVnYXRpb247Ci0JYm9vbAkJCQlsb25nX3Nsb3RfdGltZTsKLX1ic3NfaHQsICpwYnNzX2h0OwotCiB0eXBlZGVmIGVudW0gX2VycF90ewogCUVSUF9Ob25FUlBwcmVzZW50CT0gMHgwMSwKIAlFUlBfVXNlUHJvdGVjdGlvbgk9IDB4MDIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHQuYwppbmRleCA1NTMzMjIxLi4zOTk1NjIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0LmMKQEAgLTExLDEyICsxMSwxMSBAQAogICoKICAqLwogCi0vLyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KLSNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogCiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCiAKQEAgLTY2LDggKzY1LDggQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCWllZWU4MDIxMV9jcnlwdF9kZWluaXRfZW50cmllcyhpZWVlLCAwKTsKIAlpZiAoIWxpc3RfZW1wdHkoJmllZWUtPmNyeXB0X2RlaW5pdF9saXN0KSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGVudHJpZXMgcmVtYWluaW5nIGluIGRlbGF5ZWQgY3J5cHQgIgotCQkgICAgICAgImRlbGV0aW9uIGxpc3RcbiIsIGllZWUtPmRldi0+bmFtZSk7CisJCW5ldGRldl9kYmcoaWVlZS0+ZGV2LCAiJXM6IGVudHJpZXMgcmVtYWluaW5nIGluIGRlbGF5ZWQgY3J5cHQgZGVsZXRpb24gbGlzdFxuIiwKKwkJCQlpZWVlLT5kZXYtPm5hbWUpOwogCQlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBIWjsKIAkJYWRkX3RpbWVyKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIpOwogCX0KQEAgLTExOCw3ICsxMTcsNyBAQAogCWxpc3RfYWRkKCZhbGctPmxpc3QsICZoY3J5cHQtPmFsZ3MpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhjcnlwdC0+bG9jaywgZmxhZ3MpOwogCi0JcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdDogcmVnaXN0ZXJlZCBhbGdvcml0aG0gJyVzJ1xuIiwKKwlwcl9kZWJ1ZygiaWVlZTgwMjExX2NyeXB0OiByZWdpc3RlcmVkIGFsZ29yaXRobSAnJXMnXG4iLAogCSAgICAgICBvcHMtPm5hbWUpOwogCiAJcmV0dXJuIDA7CkBAIC0xNDYsOCArMTQ1LDggQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoY3J5cHQtPmxvY2ssIGZsYWdzKTsKIAogCWlmIChkZWxfYWxnKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gIgotCQkgICAgICAgIiclcydcbiIsIG9wcy0+bmFtZSk7CisJCXByX2RlYnVnKCJpZWVlODAyMTFfY3J5cHQ6IHVucmVnaXN0ZXJlZCBhbGdvcml0aG0gJyVzJ1xuIiwKKwkJCQlvcHMtPm5hbWUpOwogCQlrZnJlZShkZWxfYWxnKTsKIAl9CiAKQEAgLTIzMiw4ICsyMzEsOCBAQAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0b19hbGcgKmFsZyA9CiAJCQkoc3RydWN0IGllZWU4MDIxMV9jcnlwdG9fYWxnICopIHB0cjsKIAkJbGlzdF9kZWwocHRyKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdDogdW5yZWdpc3RlcmVkIGFsZ29yaXRobSAiCi0JCSAgICAgICAiJyVzJyAoZGVpbml0KVxuIiwgYWxnLT5vcHMtPm5hbWUpOworCQlwcl9kZWJ1ZygiaWVlZTgwMjExX2NyeXB0OiB1bnJlZ2lzdGVyZWQgYWxnb3JpdGhtICclcycgKGRlaW5pdClcbiIsCisJCQkJYWxnLT5vcHMtPm5hbWUpOwogCQlrZnJlZShhbGcpOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfY2NtcC5jCmluZGV4IDE0M2I2ODIuLjc4ODcwNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X2NjbXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF9jY21wLmMKQEAgLTksNyArOSw2IEBACiAgKiBtb3JlIGRldGFpbHMuCiAgKi8KIAotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTE4LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogCiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCkBAIC0xMzAsOSArMTI5LDkgQEAKIAlxY19pbmNsdWRlZCA9ICgoV0xBTl9GQ19HRVRfVFlQRShmYykgPT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpICYmCiAJCSAgICAgICAoV0xBTl9GQ19HRVRfU1RZUEUoZmMpICYgMHgwOCkpOwogCSovCi0JLy8gZml4ZWQgYnkgRGF2aWQgOjIwMDYuOS42Ci0JcWNfaW5jbHVkZWQgPSAoKFdMQU5fRkNfR0VUX1RZUEUoZmMpID09IElFRUU4MDIxMV9GVFlQRV9EQVRBKSAmJgotCQkgICAgICAgKFdMQU5fRkNfR0VUX1NUWVBFKGZjKSAmIDB4ODApKTsKKwkvKiBmaXhlZCBieSBEYXZpZCA6MjAwNi45LjYgKi8KKwlxY19pbmNsdWRlZCA9IChXTEFOX0ZDX0dFVF9UWVBFKGZjKSA9PSBJRUVFODAyMTFfRlRZUEVfREFUQSkgJiYKKwkJICAgICAgIChXTEFOX0ZDX0dFVF9TVFlQRShmYykgJiAweDgwKTsKIAlhYWRfbGVuID0gMjI7CiAJaWYgKGE0X2luY2x1ZGVkKQogCQlhYWRfbGVuICs9IDY7CkBAIC0yMDksNyArMjA4LDcgQEAKIAlwb3MgPSBza2JfcHVzaChza2IsIENDTVBfSERSX0xFTik7CiAJbWVtbW92ZShwb3MsIHBvcyArIENDTVBfSERSX0xFTiwgaGRyX2xlbik7CiAJcG9zICs9IGhkcl9sZW47Ci0vLwltaWMgPSBza2JfcHV0KHNrYiwgQ0NNUF9NSUNfTEVOKTsKKwkvKiBtaWMgPSBza2JfcHV0KHNrYiwgQ0NNUF9NSUNfTEVOKTsgKi8KIAogCWkgPSBDQ01QX1BOX0xFTiAtIDE7CiAJd2hpbGUgKGkgPj0gMCkgewpAQCAtMjM5LDcgKzIzOCw3IEBACiAJCXU4ICplID0ga2V5LT50eF9lOwogCQl1OCAqczAgPSBrZXktPnR4X3MwOwogCi0JCS8vbWljIGlzIG1vdmVkIHRvIGhlcmUgYnkgam9obgorCQkvKiBtaWMgaXMgbW92ZWQgdG8gaGVyZSBieSBqb2huICovCiAJCW1pYyA9IHNrYl9wdXQoc2tiLCBDQ01QX01JQ19MRU4pOwogCiAJCWNjbXBfaW5pdF9ibG9ja3Moa2V5LT50Zm0sIGhkciwga2V5LT50eF9wbiwgZGF0YV9sZW4sIGIwLCBiLCBzMCk7CkBAIC00NDQsNyArNDQzLDcgQEAKIAogdm9pZCBpZWVlODAyMTFfY2NtcF9udWxsKHZvaWQpCiB7Ci0vLyAgICBwcmludGsoIj09PT09PT09PT09PT4lcygpXG4iLCBfX2Z1bmNfXyk7CisJLyogcHJpbnRrKCI9PT09PT09PT09PT0+JXMoKVxuIiwgX19mdW5jX18pOyAqLwogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfY3J5cHRfdGtpcC5jCmluZGV4IGZjYzkwYTUuLmU4MTVjODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3RraXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF90a2lwLmMKQEAgLTksNyArOSw2IEBACiAgKiBtb3JlIGRldGFpbHMuCiAgKi8KIAotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTE4LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgotI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KIAogI2luY2x1ZGUgImllZWU4MDIxMS5oIgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9jcnlwdF93ZXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCmluZGV4IDhjMWJmMWYuLjBhMTdmODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX2NyeXB0X3dlcC5jCkBAIC05LDEzICs5LDEyIEBACiAgKiBtb3JlIGRldGFpbHMuCiAgKi8KIAotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxhc20vc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAKICNpbmNsdWRlICJpZWVlODAyMTEuaCIKIApAQCAtNDksMTQgKzQ4LDE0IEBACiAKIAlwcml2LT50eF90Zm0gPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYXJjNCkiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKIAlpZiAoSVNfRVJSKHByaXYtPnR4X3RmbSkpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgImllZWU4MDIxMV9jcnlwdF93ZXA6IGNvdWxkIG5vdCBhbGxvY2F0ZSAiCisJCXByX2RlYnVnKCJpZWVlODAyMTFfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgogCQkgICAgICAgImNyeXB0byBBUEkgYXJjNFxuIik7CiAJCXByaXYtPnR4X3RmbSA9IE5VTEw7CiAJCWdvdG8gZmFpbDsKIAl9CiAJcHJpdi0+cnhfdGZtID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFyYzQpIiwgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CiAJaWYgKElTX0VSUihwcml2LT5yeF90Zm0pKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJpZWVlODAyMTFfY3J5cHRfd2VwOiBjb3VsZCBub3QgYWxsb2NhdGUgIgorCQlwcl9kZWJ1ZygiaWVlZTgwMjExX2NyeXB0X3dlcDogY291bGQgbm90IGFsbG9jYXRlICIKIAkJICAgICAgICJjcnlwdG8gQVBJIGFyYzRcbiIpOwogCQlwcml2LT5yeF90Zm0gPSBOVUxMOwogCQlnb3RvIGZhaWw7CkBAIC0xMTAsNiArMTA5LDcgQEAKIAl1MzIgY3JjOwogCXU4ICppY3Y7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOworCiAJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgNCB8fCBza2JfdGFpbHJvb20oc2tiKSA8IDQgfHwKIAkgICAgc2tiLT5sZW4gPCBoZHJfbGVuKQogCQlyZXR1cm4gLTE7CkBAIC0xMjgsNiArMTI4LDcgQEAKIAkgKiBjYW4gYmUgdXNlZCB0byBzcGVlZHVwIGF0dGFja3MsIHNvIGF2b2lkIHVzaW5nIHRoZW0uICovCiAJaWYgKCh3ZXAtPml2ICYgMHhmZjAwKSA9PSAweGZmMDApIHsKIAkJdTggQiA9ICh3ZXAtPml2ID4+IDE2KSAmIDB4ZmY7CisKIAkJaWYgKEIgPj0gMyAmJiBCIDwga2xlbikKIAkJCXdlcC0+aXYgKz0gMHgwMTAwOwogCX0KQEAgLTE4MCw2ICsxODEsNyBAQAogCXUzMiBjcmM7CiAJdTggaWN2WzRdOwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKKwogCWlmIChza2ItPmxlbiA8IGhkcl9sZW4gKyA4KQogCQlyZXR1cm4gLTE7CiAKQEAgLTI1Niw2ICsyNTgsNyBAQAogc3RhdGljIGNoYXIgKnByaXNtMl93ZXBfcHJpbnRfc3RhdHMoY2hhciAqcCwgdm9pZCAqcHJpdikKIHsKIAlzdHJ1Y3QgcHJpc20yX3dlcF9kYXRhICp3ZXAgPSBwcml2OworCiAJcCArPSBzcHJpbnRmKHAsICJrZXlbJWRdIGFsZz1XRVAgbGVuPSVkXG4iLAogCQkgICAgIHdlcC0+a2V5X2lkeCwgd2VwLT5rZXlfbGVuKTsKIAlyZXR1cm4gcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX21vZHVsZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKaW5kZXggYWZiZDA5ZC4uMzEyMzNkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfbW9kdWxlLmMKQEAgLTMxLDcgKzMxLDcgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisvKiAjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+ICovCiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KQEAgLTEzMywxNSArMTMzLDE0IEBACiAJaWVlZS0+aWVlZTgwMl8xeCA9IDE7IC8qIERlZmF1bHQgdG8gc3VwcG9ydGluZyA4MDIuMXggKi8KIAogCUlOSVRfTElTVF9IRUFEKCZpZWVlLT5jcnlwdF9kZWluaXRfbGlzdCk7Ci0JaW5pdF90aW1lcigmaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyKTsKLQlpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWllZWU7Ci0JaWVlZS0+Y3J5cHRfZGVpbml0X3RpbWVyLmZ1bmN0aW9uID0gaWVlZTgwMjExX2NyeXB0X2RlaW5pdF9oYW5kbGVyOworCXNldHVwX3RpbWVyKCZpZWVlLT5jcnlwdF9kZWluaXRfdGltZXIsCisJCSAgICBpZWVlODAyMTFfY3J5cHRfZGVpbml0X2hhbmRsZXIsICh1bnNpZ25lZCBsb25nKWllZWUpOwogCiAJc3Bpbl9sb2NrX2luaXQoJmllZWUtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZpZWVlLT53cGF4X3N1aXRsaXN0X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZpZWVlLT5id19zcGlubG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmllZWUtPnJlb3JkZXJfc3BpbmxvY2spOwotCS8vYWRkZWQgYnkgV0IKKwkvKiBhZGRlZCBieSBXQiAqLwogCWF0b21pY19zZXQoJihpZWVlLT5hdG1fY2hubG9wKSwgMCk7CiAJYXRvbWljX3NldCgmKGllZWUtPmF0bV9zd2J3KSwgMCk7CiAKQEAgLTE1Myw3ICsxNTIsNyBAQAogCWllZWUtPmllZWU4MDJfMXggPSAxOwogCWllZWUtPnJhd190eCA9IDA7CiAJLy9pZWVlLT5od3NlY19zdXBwb3J0ID0gMTsgLy9kZWZhbHQgc3VwcG9ydCBodyBzZWN1cml0eS4gLy91c2UgbW9kdWxlX3BhcmFtIGluc3RlYWQuCi0JaWVlZS0+aHdzZWNfYWN0aXZlID0gMDsgLy9kaXNhYmxlIGh3c2VjLCBzd2l0Y2ggaXQgb24gd2hlbiBuZWNlc3NhcnkuCisJaWVlZS0+aHdzZWNfYWN0aXZlID0gMDsgLyogZGlzYWJsZSBod3NlYywgc3dpdGNoIGl0IG9uIHdoZW4gbmVjZXNzYXJ5LiAqLwogCiAJaWVlZTgwMjExX3NvZnRtYWNfaW5pdChpZWVlKTsKIApAQCAtMTY0LDcgKzE2Myw3IEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAlIVFVwZGF0ZURlZmF1bHRTZXR0aW5nKGllZWUpOwotCUhUSW5pdGlhbGl6ZUhUSW5mbyhpZWVlKTsgLy9tYXkgbW92ZSB0byBvdGhlciBwbGFjZS4KKwlIVEluaXRpYWxpemVIVEluZm8oaWVlZSk7IC8qIG1heSBtb3ZlIHRvIG90aGVyIHBsYWNlLiAqLwogCVRTSW5pdGlhbGl6ZShpZWVlKTsKIAogCWZvciAoaSA9IDA7IGkgPCBJRUVFX0lCU1NfTUFDX0hBU0hfU0laRTsgaSsrKQpAQCAtMTc2LDcgKzE3NSw3IEBACiAJICBpZWVlLT5sYXN0X3BhY2tldF90aW1lW2ldID0gMDsKIAl9CiAKLS8vVGhlc2UgZnVuY3Rpb24gd2VyZSBhZGRlZCB0byBsb2FkIGNyeXB0ZSBtb2R1bGUgYXV0b2x5CisvKiBUaGVzZSBmdW5jdGlvbiB3ZXJlIGFkZGVkIHRvIGxvYWQgY3J5cHRlIG1vZHVsZSBhdXRvbHkgKi8KIAlpZWVlODAyMTFfdGtpcF9udWxsKCk7CiAJaWVlZTgwMjExX3dlcF9udWxsKCk7CiAJaWVlZTgwMjExX2NjbXBfbnVsbCgpOwpAQCAtMTk1LDcgKzE5NCw3IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBpOwotCS8vc3RydWN0IGxpc3RfaGVhZCAqcCwgKnE7CisJLyogc3RydWN0IGxpc3RfaGVhZCAqcCwgKnE7ICovCiAvLwlkZWxfdGltZXJfc3luYygmaWVlZS0+U3dCd1RpbWVyKTsKIAlrZnJlZShpZWVlLT5wSFRJbmZvKTsKIAlpZWVlLT5wSFRJbmZvID0gTlVMTDsKQEAgLTIzOSwxMyArMjM4LDE1IEBACiAJLy8JCSAgICBJRUVFODAyMTFfRExfUkVPUkRFUnwKIC8vCQkJICAgIElFRUU4MDIxMV9ETF9UUkFDRSAgfAogCQkJICAgIC8vSUVFRTgwMjExX0RMX0RBVEEJfAotCQkJICAgIElFRUU4MDIxMV9ETF9FUlIJICAvL2F3YXlscyBvcGVuIHRoaXMgZmxhZ3MgdG8gc2hvdyBlcnJvciBvdXQKKwkJCSAgICBJRUVFODAyMTFfRExfRVJSCSAgLyogYXdheWxzIG9wZW4gdGhpcyBmbGFncyB0byBzaG93IGVycm9yIG91dCAqLwogCQkJICAgIDsKIHN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmllZWU4MDIxMV9wcm9jOwogCiBzdGF0aWMgaW50IHNob3dfZGVidWdfbGV2ZWwoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewotCXJldHVybiBzZXFfcHJpbnRmKG0sICIweCUwOFhcbiIsIGllZWU4MDIxMV9kZWJ1Z19sZXZlbCk7CisJc2VxX3ByaW50ZihtLCAiMHglMDhYXG4iLCBpZWVlODAyMTFfZGVidWdfbGV2ZWwpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHdyaXRlX2RlYnVnX2xldmVsKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLApAQCAtMjg0LDcgKzI4NSw3IEBACiAJCQkJIiBwcm9jIGRpcmVjdG9yeVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KLQllID0gcHJvY19jcmVhdGUoImRlYnVnX2xldmVsIiwgU19JUlVHTyB8IFNfSVdVU1IsIAorCWUgPSBwcm9jX2NyZWF0ZSgiZGVidWdfbGV2ZWwiLCBTX0lSVUdPIHwgU19JV1VTUiwKIAkJCSAgICAgIGllZWU4MDIxMV9wcm9jLCAmZm9wcyk7CiAJaWYgKCFlKSB7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KERSVl9OQU1FLCBpbml0X25ldC5wcm9jX25ldCk7CkBAIC0zMDMsNyArMzA0LDYgQEAKIAl9CiB9CiAKLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIG91dHB1dCBtYXNrIik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9yeC5jCmluZGV4IGQ0MDFkYmYuLjlmYmI1M2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3J4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfcnguYwpAQCAtMjIsNyArMjIsNiBAQAogCiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotLy8jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KQEAgLTM5LDcgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dpcmVsZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogCiAjaW5jbHVkZSAiaWVlZTgwMjExLmgiCkBAIC01Niw3ICs1NSw3IEBACiAKIAlza2JfcHVsbChza2IsIGllZWU4MDIxMV9nZXRfaGRybGVuKGZjKSk7CiAJc2tiLT5wa3RfdHlwZSA9IFBBQ0tFVF9PVEhFUkhPU1Q7Ci0Jc2tiLT5wcm90b2NvbCA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfODAyMTFfUkFXKTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyMTFfUkFXKTsKIAltZW1zZXQoc2tiLT5jYiwgMCwgc2l6ZW9mKHNrYi0+Y2IpKTsKIAluZXRpZl9yeChza2IpOwogfQpAQCAtMjIyLDggKzIyMSw4IEBACiAKIAlyeF9zdGF0cy0+bGVuID0gc2tiLT5sZW47CiAJaWVlZTgwMjExX3J4X21ndChpZWVlLChzdHJ1Y3QgaWVlZTgwMjExX2hkcl80YWRkciAqKXNrYi0+ZGF0YSxyeF9zdGF0cyk7Ci0JLy9pZiAoKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpICYmIChtZW1jbXAoaGRyLT5hZGRyMywgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTikpKQotCWlmICgobWVtY21wKGhkci0+YWRkcjEsIGllZWUtPmRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKSkpLy91c2UgQUREUjEgdG8gcGVyZm9ybSBhZGRyZXNzIG1hdGNoaW5nIGZvciBNYW5hZ2VtZW50IGZyYW1lcworCS8qIGlmICgoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0xJTktFRCkgJiYgKG1lbWNtcChoZHItPmFkZHIzLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKSkpICovCisJaWYgKChtZW1jbXAoaGRyLT5hZGRyMSwgaWVlZS0+ZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pKSkvKiB1c2UgQUREUjEgdG8gcGVyZm9ybSBhZGRyZXNzIG1hdGNoaW5nIGZvciBNYW5hZ2VtZW50IGZyYW1lcyAqLwogCXsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAkJcmV0dXJuIDA7CkBAIC02MDksMTIgKzYwOCwxMiBAQAogCWJvb2wJCQliTWF0Y2hXaW5TdGFydCA9IGZhbHNlLCBiUGt0SW5CdWYgPSBmYWxzZTsKIAlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIiVzKCk6IFNlcSBpcyAlZCxwVFMtPlJ4SW5kaWNhdGVTZXEgaXMgJWQsIFdpblNpemUgaXMgJWRcbiIsX19mdW5jX18sU2VxTnVtLHBUUy0+UnhJbmRpY2F0ZVNlcSxXaW5TaXplKTsKIAkvKiBSeCBSZW9yZGVyIGluaXRpYWxpemUgY29uZGl0aW9uLiovCi0JaWYocFRTLT5SeEluZGljYXRlU2VxID09IDB4ZmZmZikgeworCWlmIChwVFMtPlJ4SW5kaWNhdGVTZXEgPT0gMHhmZmZmKSB7CiAJCXBUUy0+UnhJbmRpY2F0ZVNlcSA9IFNlcU51bTsKIAl9CiAKIAkvKiBEcm9wIG91dCB0aGUgcGFja2V0IHdoaWNoIFNlcU51bSBpcyBzbWFsbGVyIHRoYW4gV2luU3RhcnQgKi8KLQlpZihTTl9MRVNTKFNlcU51bSwgcFRTLT5SeEluZGljYXRlU2VxKSkgeworCWlmIChTTl9MRVNTKFNlcU51bSwgcFRTLT5SeEluZGljYXRlU2VxKSkgewogCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1JFT1JERVIsIlBhY2tldCBEcm9wISBJbmRpY2F0ZVNlcTogJWQsIE5ld1NlcTogJWRcbiIsCiAJCQkJIHBUUy0+UnhJbmRpY2F0ZVNlcSwgU2VxTnVtKTsKIAkJcEhUSW5mby0+UnhSZW9yZGVyRHJvcENvdW50ZXIrKzsKQEAgLTcxNyw3ICs3MTYsNyBAQAogCQkgICAgU05fRVFVQUwocFJlb3JkZXJFbnRyeS0+U2VxTnVtLCBwVFMtPlJ4SW5kaWNhdGVTZXEpKQogCQl7CiAJCQkvKiBUaGlzIHByb3RlY3QgYnVmZmVyIGZyb20gb3ZlcmZsb3cuICovCi0JCQlpZihpbmRleCA+PSBSRU9SREVSX1dJTl9TSVpFKSB7CisJCQlpZiAoaW5kZXggPj0gUkVPUkRFUl9XSU5fU0laRSkgewogCQkJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiUnhSZW9yZGVySW5kaWNhdGVQYWNrZXQoKTogQnVmZmVyIG92ZXJmbG93ISEgXG4iKTsKIAkJCQliUGt0SW5CdWYgPSB0cnVlOwogCQkJCWJyZWFrOwpAQCAtNzQxLDcgKzc0MCw3IEBACiAJfQogCiAJLyogSGFuZGxpbmcgcGVuZGluZyB0aW1lci4gU2V0IHRoaXMgdGltZXIgdG8gcHJldmVudCBmcm9tIGxvbmcgdGltZSBSeCBidWZmZXJpbmcuKi8KLQlpZihpbmRleD4wKSB7CisJaWYgKGluZGV4PjApIHsKIAkJLy8gQ2FuY2VsIHByZXZpb3VzIHBlbmRpbmcgdGltZXIuCiAJLy8JZGVsX3RpbWVyX3N5bmMoJnBUUy0+UnhQa3RQZW5kaW5nVGltZXIpOwogCQlwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gMHhmZmZmOwpAQCAtNzU0LDcgKzc1Myw3IEBACiAJCWllZWU4MDIxMV9pbmRpY2F0ZV9wYWNrZXRzKGllZWUsIHByeGJJbmRpY2F0ZUFycmF5LCBpbmRleCk7CiAJfQogCi0JaWYoYlBrdEluQnVmICYmIHBUUy0+UnhUaW1lb3V0SW5kaWNhdGVTZXE9PTB4ZmZmZikgeworCWlmIChiUGt0SW5CdWYgJiYgcFRTLT5SeFRpbWVvdXRJbmRpY2F0ZVNlcT09MHhmZmZmKSB7CiAJCS8vIFNldCBuZXcgcGVuZGluZyB0aW1lci4KIAkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9SRU9SREVSLCIlcygpOiBTRVQgcnggdGltZW91dCB0aW1lclxuIiwgX19mdW5jX18pOwogCQlwVFMtPlJ4VGltZW91dEluZGljYXRlU2VxID0gcFRTLT5SeEluZGljYXRlU2VxOwpAQCAtNzg0LDE2ICs3ODMsMTYgQEAKIAkvKiBqdXN0IGZvciBkZWJ1ZyBwdXJwb3NlICovCiAJU2VxTnVtID0gV0xBTl9HRVRfU0VRX1NFUShsZTE2X3RvX2NwdShoZHItPnNlcV9jdGwpKTsKIAotCWlmKChJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSYmXAorCWlmICgoSUVFRTgwMjExX1FPU19IQVNfU0VRKGZjKSkmJlwKIAkJCSgoKGZyYW1lcW9zICopKHNrYi0+ZGF0YSArIElFRUU4MDIxMV8zQUREUl9MRU4pKS0+ZmllbGQucmVzZXJ2ZWQpKSB7CiAJCWJJc0FnZ3JlZ2F0ZUZyYW1lID0gdHJ1ZTsKIAl9CiAKLQlpZihJRUVFODAyMTFfUU9TX0hBU19TRVEoZmMpKSB7CisJaWYgKElFRUU4MDIxMV9RT1NfSEFTX1NFUShmYykpIHsKIAkJTExDT2Zmc2V0ICs9IDI7CiAJfQogCi0JaWYocnhfc3RhdHMtPmJDb250YWluSFRDKSB7CisJaWYgKHJ4X3N0YXRzLT5iQ29udGFpbkhUQykgewogCQlMTENPZmZzZXQgKz0gc0hUQ0xuZzsKIAl9CiAJLy9wcmludGsoIkNoa0xlbmd0aCA9ICVkXG4iLCBMTENPZmZzZXQpOwpAQCAtODI3LDcgKzgyNiw3IEBACiAJCQkvLz09bT09PmNoYW5nZSB0aGUgbGVuZ3RoIG9yZGVyCiAJCQluU3ViZnJhbWVfTGVuZ3RoID0gKG5TdWJmcmFtZV9MZW5ndGg+PjgpICsgKG5TdWJmcmFtZV9MZW5ndGg8PDgpOwogCi0JCQlpZihza2ItPmxlbjwoRVRIRVJORVRfSEVBREVSX1NJWkUgKyBuU3ViZnJhbWVfTGVuZ3RoKSkgeworCQkJaWYgKHNrYi0+bGVuPChFVEhFUk5FVF9IRUFERVJfU0laRSArIG5TdWJmcmFtZV9MZW5ndGgpKSB7CiAJCQkJcHJpbnRrKCIlczogQS1NU0RVIHBhcnNlIGVycm9yISEgcFJmZC0+blRvdGFsU3ViZnJhbWUgOiAlZFxuIixcCiAJCQkJCQlfX2Z1bmNfXywgcnhiLT5ucl9zdWJmcmFtZXMpOwogCQkJCXByaW50aygiJXM6IEEtTVNEVSBwYXJzZSBlcnJvciEhIFN1YmZyYW1lIExlbmd0aDogJWRcbiIsX19mdW5jX18sIG5TdWJmcmFtZV9MZW5ndGgpOwpAQCAtODUzLDE5ICs4NTIsMTkgQEAKIAkJCW1lbWNweShkYXRhX3B0ciwgc2tiLT5kYXRhLCBuU3ViZnJhbWVfTGVuZ3RoKTsKICNlbmRpZgogCQkJcnhiLT5zdWJmcmFtZXNbcnhiLT5ucl9zdWJmcmFtZXMrK10gPSBzdWJfc2tiOwotCQkJaWYocnhiLT5ucl9zdWJmcmFtZXMgPj0gTUFYX1NVQkZSQU1FX0NPVU5UKSB7CisJCQlpZiAocnhiLT5ucl9zdWJmcmFtZXMgPj0gTUFYX1NVQkZSQU1FX0NPVU5UKSB7CiAJCQkJSUVFRTgwMjExX0RFQlVHX1JYKCJQYXJzZVN1YmZyYW1lKCk6IFRvbyBtYW55IFN1YmZyYW1lcyEgUGFja2V0cyBkcm9wcGVkIVxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlza2JfcHVsbChza2IsIG5TdWJmcmFtZV9MZW5ndGgpOwogCi0JCQlpZihza2ItPmxlbiAhPSAwKSB7CisJCQlpZiAoc2tiLT5sZW4gIT0gMCkgewogCQkJCW5QYWRkaW5nX0xlbmd0aCA9IDQgLSAoKG5TdWJmcmFtZV9MZW5ndGggKyBFVEhFUk5FVF9IRUFERVJfU0laRSkgJSA0KTsKLQkJCQlpZihuUGFkZGluZ19MZW5ndGggPT0gNCkgeworCQkJCWlmIChuUGFkZGluZ19MZW5ndGggPT0gNCkgewogCQkJCQluUGFkZGluZ19MZW5ndGggPSAwOwogCQkJCX0KIAotCQkJCWlmKHNrYi0+bGVuIDwgblBhZGRpbmdfTGVuZ3RoKSB7CisJCQkJaWYgKHNrYi0+bGVuIDwgblBhZGRpbmdfTGVuZ3RoKSB7CiAJCQkJCXJldHVybiAwOwogCQkJCX0KIApAQCAtOTM5LDEyICs5MzgsMTIgQEAKIAlmcmFnID0gV0xBTl9HRVRfU0VRX0ZSQUcoc2MpOwogCWhkcmxlbiA9IGllZWU4MDIxMV9nZXRfaGRybGVuKGZjKTsKIAotCWlmKEhUQ0NoZWNrKGllZWUsIHNrYi0+ZGF0YSkpCisJaWYgKEhUQ0NoZWNrKGllZWUsIHNrYi0+ZGF0YSkpCiAJewogCQlpZihuZXRfcmF0ZWxpbWl0KCkpCiAJCXByaW50aygiZmluZCBIVENDb250cm9sXG4iKTsKIAkJaGRybGVuICs9IDQ7Ci0JCXJ4X3N0YXRzLT5iQ29udGFpbkhUQyA9IDE7CisJCXJ4X3N0YXRzLT5iQ29udGFpbkhUQyA9IHRydWU7CiAJfQogCiAJLy9JRUVFODAyMTFfREVCVUdfREFUQShJRUVFODAyMTFfRExfREFUQSwgc2tiLT5kYXRhLCBza2ItPmxlbik7CkBAIC0xMjc0LDEzICsxMjczLDEzIEBACiAJfQogKi8KIC8vYWRkZWQgYnkgYW15IGZvciByZW9yZGVyCi0JaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSAmJiBJc1FvU0RhdGFGcmFtZShza2ItPmRhdGEpCisJaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgJiYgSXNRb1NEYXRhRnJhbWUoc2tiLT5kYXRhKQogCQkmJiAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkpCiAJewogCQlUSUQgPSBGcmFtZV9Rb1NUSUQoc2tiLT5kYXRhKTsKIAkJU2VxTnVtID0gV0xBTl9HRVRfU0VRX1NFUShzYyk7CiAJCUdldFRzKGllZWUsKFBUU19DT01NT05fSU5GTyAqKSAmcFRTLGhkci0+YWRkcjIsVElELFJYX0RJUix0cnVlKTsKLQkJaWYoVElEICE9MCAmJiBUSUQgIT0zKQorCQlpZiAoVElEICE9MCAmJiBUSUQgIT0zKQogCQl7CiAJCQlpZWVlLT5iaXNfYW55X25vbmJlcGt0cyA9IHRydWU7CiAJCX0KQEAgLTEyOTAsNyArMTI4OSw3IEBACiAJcGF5bG9hZCA9IHNrYi0+ZGF0YSArIGhkcmxlbjsKIAkvL2V0aGVydHlwZSA9IChwYXlsb2FkWzZdIDw8IDgpIHwgcGF5bG9hZFs3XTsKIAlyeGIgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3J4YiksIEdGUF9BVE9NSUMpOwotCWlmKHJ4YiA9PSBOVUxMKQorCWlmIChyeGIgPT0gTlVMTCkKIAl7CiAJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCIlcygpOiBrbWFsbG9jIHJ4YiBlcnJvclxuIixfX2Z1bmNfXyk7CiAJCWdvdG8gcnhfZHJvcHBlZDsKQEAgLTEzMzYsNyArMTMzNSw3IEBACiAKIAkJCQlzdGF0cy0+cnhfcGFja2V0cysrOwogCQkJCXN0YXRzLT5yeF9ieXRlcyArPSBzdWJfc2tiLT5sZW47Ci0JCQkJaWYoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZHN0KSkgeworCQkJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkc3QpKSB7CiAJCQkJCXN0YXRzLT5tdWx0aWNhc3QrKzsKIAkJCQl9CiAKQEAgLTE1OTAsMTQgKzE1ODksMTQgQEAKIAl1OCAqYWRkcjIKICkKIHsKLQlpZihJU19ET1QxMURfRU5BQkxFKGllZWUpKQorCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpKQogCXsKLQkJaWYoaW5mb19lbGVtZW50LT5sZW4hPSAwKQorCQlpZiAoaW5mb19lbGVtZW50LT5sZW4hPSAwKQogCQl7CiAJCQltZW1jcHkobmV0d29yay0+Q291bnRyeUllQnVmLCBpbmZvX2VsZW1lbnQtPmRhdGEsIGluZm9fZWxlbWVudC0+bGVuKTsKIAkJCW5ldHdvcmstPkNvdW50cnlJZUxlbiA9IGluZm9fZWxlbWVudC0+bGVuOwogCi0JCQlpZighSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKKwkJCWlmICghSVNfQ09VTlRSWV9JRV9WQUxJRChpZWVlKSkKIAkJCXsKIAkJCQlEb3QxMWRfVXBkYXRlQ291bnRyeUllKGllZWUsIGFkZHIyLCBpbmZvX2VsZW1lbnQtPmxlbiwgaW5mb19lbGVtZW50LT5kYXRhKTsKIAkJCX0KQEAgLTE2MDgsNyArMTYwNyw3IEBACiAJCS8vIHNvbWUgQVAgKGUuZy4gQ2lzY28gMTI0MikgZG9uJ3QgaW5jbHVkZSBjb3VudHJ5IElFIGluIHRoZWlyCiAJCS8vIHByb2JlIHJlc3BvbnNlIGZyYW1lLgogCQkvLwotCQlpZihJU19FUVVBTF9DSUVfU1JDKGllZWUsIGFkZHIyKSApCisJCWlmIChJU19FUVVBTF9DSUVfU1JDKGllZWUsIGFkZHIyKSApCiAJCXsKIAkJCVVQREFURV9DSUVfV0FUQ0hET0coaWVlZSk7CiAJCX0KQEAgLTE3MDUsNyArMTcwNCw3IEBACiAjaWZkZWYgQ09ORklHX0lFRUU4MDIxMV9ERUJVRwogCQkJCXAgKz0gc25wcmludGYocCwgc2l6ZW9mKHJhdGVzX3N0cikgLQogCQkJCQkgICAgICAocCAtIHJhdGVzX3N0ciksICIlMDJYICIsCi0JCQkJCSAgICAgIG5ldHdvcmstPnJhdGVzW2ldKTsKKwkJCQkJICAgICAgbmV0d29yay0+cmF0ZXNfZXhbaV0pOwogI2VuZGlmCiAJCQkJaWYgKGllZWU4MDIxMV9pc19vZmRtX3JhdGUKIAkJCQkgICAgKGluZm9fZWxlbWVudC0+ZGF0YVtpXSkpIHsKQEAgLTE4ODgsNyArMTg4Nyw3IEBACiAKIAkJCS8vaWYodG1wX2h0Y2FwX2xlbiAhPTAgIHx8ICB0bXBfaHRpbmZvX2xlbiAhPSAwKQogCQkJewotCQkJCWlmKChpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCisJCQkJaWYgKChpbmZvX2VsZW1lbnQtPmxlbiA+PSAzICYmCiAJCQkJCSBpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgogCQkJCQkgaW5mb19lbGVtZW50LT5kYXRhWzFdID09IDB4MDUgJiYKIAkJCQkJIGluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweGI1KSB8fApAQCAtMTk0MCw3ICsxOTM5LDcgQEAKIAkJCWVsc2UKIAkJCQluZXR3b3JrLT5jaXNjb19jYXBfZXhpc3QgPSBmYWxzZTsKIAkJCS8vYWRkZWQgYnkgYW15IGZvciBMRUFQIG9mIGNpc2NvCi0JCQlpZihpbmZvX2VsZW1lbnQtPmxlbiA+IDQgJiYKKwkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+IDQgJiYKIAkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMF0gPT0gMHgwMCAmJgogCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsxXSA9PSAweDQwICYmCiAJCQkJaW5mb19lbGVtZW50LT5kYXRhWzJdID09IDB4OTYgJiYKQEAgLTE5NzYsNyArMTk3NSw3IEBACiAJCQkJCW5ldHdvcmstPmJDY3hSbUVuYWJsZSA9IGZhbHNlOwogCQkJCX0KIAkJCX0KLQkJCWlmKGluZm9fZWxlbWVudC0+bGVuID4gNCAgJiYKKwkJCWlmIChpbmZvX2VsZW1lbnQtPmxlbiA+IDQgICYmCiAJCQkJaW5mb19lbGVtZW50LT5kYXRhWzBdID09IDB4MDAgJiYKIAkJCQlpbmZvX2VsZW1lbnQtPmRhdGFbMV0gPT0gMHg0MCAmJgogCQkJCWluZm9fZWxlbWVudC0+ZGF0YVsyXSA9PSAweDk2ICYmCkBAIC0yMjk2LDcgKzIyOTUsNyBAQAogCWRzdC0+cmF0ZXNfbGVuID0gc3JjLT5yYXRlc19sZW47CiAJbWVtY3B5KGRzdC0+cmF0ZXNfZXgsIHNyYy0+cmF0ZXNfZXgsIHNyYy0+cmF0ZXNfZXhfbGVuKTsKIAlkc3QtPnJhdGVzX2V4X2xlbiA9IHNyYy0+cmF0ZXNfZXhfbGVuOwotCWlmKHNyYy0+c3NpZF9sZW4gPiAwKQorCWlmIChzcmMtPnNzaWRfbGVuID4gMCkKIAl7CiAJCW1lbXNldChkc3QtPnNzaWQsIDAsIGRzdC0+c3NpZF9sZW4pOwogCQlkc3QtPnNzaWRfbGVuID0gc3JjLT5zc2lkX2xlbjsKQEAgLTIzNTIsNyArMjM1MSw3IEBACiAJCWRzdC0+cW9zX2RhdGEucGFyYW1fY291bnQgPSBzcmMtPnFvc19kYXRhLnBhcmFtX2NvdW50OwogCX0KIAotCWlmKGRzdC0+cW9zX2RhdGEuc3VwcG9ydGVkID09IDEpIHsKKwlpZiAoZHN0LT5xb3NfZGF0YS5zdXBwb3J0ZWQgPT0gMSkgewogCQlkc3QtPlFvU19FbmFibGUgPSAxOwogCQlpZihkc3QtPnNzaWRfbGVuKQogCQkJSUVFRTgwMjExX0RFQlVHX1FPUwpAQCAtMjM2Nyw3ICsyMzY2LDcgQEAKIAogCS8qIGRzdC0+bGFzdF9hc3NvY2lhdGUgaXMgbm90IG92ZXJ3cml0dGVuICovCiAJZHN0LT53bW1faW5mbyA9IHNyYy0+d21tX2luZm87IC8vc3VyZSB0byBleGlzdCBpbiBiZWFjb24gb3IgcHJvYmUgcmVzcG9uc2UgZnJhbWUuCi0JaWYoc3JjLT53bW1fcGFyYW1bMF0uYWNfYWNpX2FjbV9haWZzbnx8IFwKKwlpZiAoc3JjLT53bW1fcGFyYW1bMF0uYWNfYWNpX2FjbV9haWZzbnx8IFwKIAkgICBzcmMtPndtbV9wYXJhbVsxXS5hY19hY2lfYWNtX2FpZnNufHwgXAogCSAgIHNyYy0+d21tX3BhcmFtWzJdLmFjX2FjaV9hY21fYWlmc258fCBcCiAJICAgc3JjLT53bW1fcGFyYW1bM10uYWNfYWNpX2FjbV9haWZzbikgewpAQCAtMjQ1Niw3ICsyNDU1LDcgQEAKIAogCWlmICghSXNMZWdhbENoYW5uZWwoaWVlZSwgbmV0d29yay5jaGFubmVsKSkKIAkJcmV0dXJuOwotCWlmKGllZWUtPmJHbG9iYWxEb21haW4pCisJaWYgKGllZWUtPmJHbG9iYWxEb21haW4pCiAJewogCQlpZiAoV0xBTl9GQ19HRVRfU1RZUEUoYmVhY29uLT5oZWFkZXIuZnJhbWVfY3RsKSA9PSBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCkKIAkJewpAQCAtMjQ3Miw3ICsyNDcxLDcgQEAKIAkJCWVsc2UKIAkJCXsKIAkJCQkvLyBGaWx0ZXIgb3ZlciBjaGFubmVsIGNoMTJ+MTQKLQkJCQlpZihuZXR3b3JrLmNoYW5uZWwgPiAxMSkKKwkJCQlpZiAobmV0d29yay5jaGFubmVsID4gMTEpCiAJCQkJewogCQkJCQlwcmludGsoIkdldFNjYW5JbmZvKCk6IEZvciBHbG9iYWwgRG9tYWluLCBmaWx0ZXIgcHJvYmUgcmVzcG9uc2UgYXQgY2hhbm5lbCglZCkuXG4iLCBuZXR3b3JrLmNoYW5uZWwpOwogCQkJCQlyZXR1cm47CkBAIC0yNDkzLDcgKzI0OTIsNyBAQAogCQkJZWxzZQogCQkJewogCQkJCS8vIEZpbHRlciBvdmVyIGNoYW5uZWwgY2gxMn4xNAotCQkJCWlmKG5ldHdvcmsuY2hhbm5lbCA+IDE0KQorCQkJCWlmIChuZXR3b3JrLmNoYW5uZWwgPiAxNCkKIAkJCQl7CiAJCQkJCXByaW50aygiR2V0U2NhbkluZm8oKTogRm9yIEdsb2JhbCBEb21haW4sIGZpbHRlciBiZWFjb24gYXQgY2hhbm5lbCglZCkuXG4iLG5ldHdvcmsuY2hhbm5lbCk7CiAJCQkJCXJldHVybjsKQEAgLTI1MTQsOSArMjUxMyw5IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCi0JaWYoaXNfc2FtZV9uZXR3b3JrKCZpZWVlLT5jdXJyZW50X25ldHdvcmssICZuZXR3b3JrLCBpZWVlKSkgeworCWlmIChpc19zYW1lX25ldHdvcmsoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgJm5ldHdvcmssIGllZWUpKSB7CiAJCXVwZGF0ZV9uZXR3b3JrKCZpZWVlLT5jdXJyZW50X25ldHdvcmssICZuZXR3b3JrKTsKLQkJaWYoKGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl8yNEcgfHwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9HKQorCQlpZiAoKGllZWUtPmN1cnJlbnRfbmV0d29yay5tb2RlID09IElFRUVfTl8yNEcgfHwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUgPT0gSUVFRV9HKQogCQkmJiBpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVycF9pbmZvX3ZhbGlkKXsKIAkJaWYoaWVlZS0+Y3VycmVudF9uZXR3b3JrLmVycF92YWx1ZSYgRVJQX1VzZVByb3RlY3Rpb24pCiAJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuYnVzZXByb3RlY3Rpb24gPSB0cnVlOwpAQCAtMjYwNiw3ICsyNjA1LDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpZWVlLT5sb2NrLCBmbGFncyk7CiAJaWYgKGlzX2JlYWNvbihiZWFjb24tPmhlYWRlci5mcmFtZV9jdGwpJiZpc19zYW1lX25ldHdvcmsoJmllZWUtPmN1cnJlbnRfbmV0d29yaywgJm5ldHdvcmssIGllZWUpJiZcCiAJCShpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTElOS0VEKSkgewotCQlpZihpZWVlLT5oYW5kbGVfYmVhY29uICE9IE5VTEwpIHsKKwkJaWYgKGllZWUtPmhhbmRsZV9iZWFjb24gIT0gTlVMTCkgewogCQkJaWVlZS0+aGFuZGxlX2JlYWNvbihpZWVlLT5kZXYsYmVhY29uLCZpZWVlLT5jdXJyZW50X25ldHdvcmspOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hYy5jCmluZGV4IGQxNDcxODcuLmMyMzg4ODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjLmMKQEAgLTYyLDcgKzYyLDcgQEAKIHsKIAl1OCAqdGFnID0gKnRhZ19wOwogCi0JaWYgKGllZWUtPm1vZHVsYXRpb24gJiBJRUVFODAyMTFfQ0NLX01PRFVMQVRJT04peworCWlmIChpZWVlLT5tb2R1bGF0aW9uICYgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OKSB7CiAJCSp0YWcrKyA9IE1GSUVfVFlQRV9SQVRFUzsKIAkJKnRhZysrID0gNDsKIAkJKnRhZysrID0gSUVFRTgwMjExX0JBU0lDX1JBVEVfTUFTSyB8IElFRUU4MDIxMV9DQ0tfUkFURV8xTUI7CkBAIC03OSw3ICs3OSw3IEBACiB7CiAJdTggKnRhZyA9ICp0YWdfcDsKIAotCQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04peworCQlpZiAoaWVlZS0+bW9kdWxhdGlvbiAmIElFRUU4MDIxMV9PRkRNX01PRFVMQVRJT04pIHsKIAogCQkqdGFnKysgPSBNRklFX1RZUEVfUkFURVNfRVg7CiAJCSp0YWcrKyA9IDg7CkBAIC0xOTIsNyArMTkyLDcgQEAKIAllbHNlCiAJCXJhdGUgPSBpZWVlLT5iYXNpY19yYXRlICYgMHg3ZjsKIAotCWlmKHJhdGUgPT0gMCl7CisJaWYgKHJhdGUgPT0gMCkgewogCQkvLyAyMDA1LjAxLjI2LCBieSByY25qa28uCiAJCWlmKGllZWUtPm1vZGUgPT0gSUVFRV9BfHwKIAkJICAgaWVlZS0+bW9kZT09IElFRUVfTl81R3x8CkBAIC0zNjksNyArMzY5LDcgQEAKIAkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc2tiID0gaWVlZTgwMjExX2dldF9iZWFjb25fKGllZWUpOwogCi0JaWYgKHNrYil7CisJaWYgKHNrYikgewogCQlzb2Z0bWFjX21nbXRfeG1pdChza2IsIGllZWUpOwogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnR4X2JlYWNvbnMrKzsKIAkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKQEAgLTM3OCw3ICszNzgsNyBAQAogLy8JCShNU0VDUyggaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbCAtNSkpOwogCiAJLy9zcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+YmVhY29uX2xvY2ssZmxhZ3MpOwotCWlmKGllZWUtPmJlYWNvbl90eGluZyAmJiBpZWVlLT5pZWVlX3VwKXsKKwlpZiAoaWVlZS0+YmVhY29uX3R4aW5nICYmIGllZWUtPmllZWVfdXApIHsKIC8vCQlpZighdGltZXJfcGVuZGluZygmaWVlZS0+YmVhY29uX3RpbWVyKSkKIC8vCQkJYWRkX3RpbWVyKCZpZWVlLT5iZWFjb25fdGltZXIpOwogCQltb2RfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcixqaWZmaWVzKyhNU0VDUyhpZWVlLT5jdXJyZW50X25ldHdvcmsuYmVhY29uX2ludGVydmFsLTUpKSk7CkBAIC00MDQsNyArNDA0LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJc2tiID0gaWVlZTgwMjExX3Byb2JlX3JlcShpZWVlKTsKLQlpZiAoc2tiKXsKKwlpZiAoc2tiKSB7CiAJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CiAJCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfcHJvYmVfcnErKzsKIAkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKQEAgLTQxMyw3ICs0MTMsNyBAQAogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9wcm9iZV9yZXF1ZXN0cyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlpZiAoaWVlZS0+YWN0aXZlX3NjYW4gJiYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfUFJPQkVSUSkpeworCWlmIChpZWVlLT5hY3RpdmVfc2NhbiAmJiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19QUk9CRVJRKSkgewogCQlpZWVlODAyMTFfc2VuZF9wcm9iZShpZWVlKTsKIAkJaWVlZTgwMjExX3NlbmRfcHJvYmUoaWVlZSk7CiAJfQpAQCAtNTg3LDcgKzU4Nyw3IEBACiAJZG93bigmaWVlZS0+c2Nhbl9zZW0pOwogLy8Jc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAotCWlmIChpZWVlLT5zY2FubmluZyA9PSAxKXsKKwlpZiAoaWVlZS0+c2Nhbm5pbmcgPT0gMSkgewogCQlpZWVlLT5zY2FubmluZyA9IDA7CiAKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWVlZS0+c29mdG1hY19zY2FuX3dxKTsKQEAgLTYwOSwxNSArNjA5LDE1IEBACiAvKiBjYWxsZWQgd2l0aCBpZWVlLT5sb2NrIGhlbGQgKi8KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9zdGFydF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQorCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpICkKIAl7Ci0JCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJCWlmIChJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQogCQl7CiAJCQlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CiAJCX0KIAl9CiAJaWYgKGllZWUtPnNvZnRtYWNfZmVhdHVyZXMgJiBJRUVFX1NPRlRNQUNfU0NBTil7Ci0JCWlmIChpZWVlLT5zY2FubmluZyA9PSAwKXsKKwkJaWYgKGllZWUtPnNjYW5uaW5nID09IDApIHsKIAkJCWllZWUtPnNjYW5uaW5nID0gMTsKIAkJCXF1ZXVlX2RlbGF5ZWRfd29yayhpZWVlLT53cSwgJmllZWUtPnNvZnRtYWNfc2Nhbl93cSwgMCk7CiAJCX0KQEAgLTYyOSw5ICs2MjksOSBAQAogLyogY2FsbGVkIHdpdGggd3hfc2VtIGhlbGQgKi8KIHZvaWQgaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlKQogewotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgKQorCWlmIChJU19ET1QxMURfRU5BQkxFKGllZWUpICkKIAl7Ci0JCWlmKElTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJCWlmIChJU19DT1VOVFJZX0lFX1ZBTElEKGllZWUpKQogCQl7CiAJCQlSRVNFVF9DSUVfV0FUQ0hET0coaWVlZSk7CiAJCX0KQEAgLTczOSw3ICs3MzksNyBAQAogCUhUQ29uc3RydWN0SW5mb0VsZW1lbnQoaWVlZSx0bXBfaHRfaW5mb19idWYsJnRtcF9odF9pbmZvX2xlbiwgZW5jcnlwdCk7CiAKIAotCWlmKHBIVEluZm8tPmJSZWdSVDJSVEFnZ3JlZ2F0aW9uKQorCWlmIChwSFRJbmZvLT5iUmVnUlQyUlRBZ2dyZWdhdGlvbikKIAl7CiAJCXRtcF9nZW5lcmljX2llX2J1ZiA9IGllZWUtPnBIVEluZm8tPnN6UlQyUlRBZ2dCdWZmZXI7CiAJCXRtcF9nZW5lcmljX2llX2xlbiA9IHNpemVvZihpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyKTsKQEAgLTgwMyw3ICs4MDMsNyBAQAogCSoodGFnKyspID0gMTsKIAkqKHRhZysrKSA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsOwogCi0JaWYoYXRpbV9sZW4peworCWlmIChhdGltX2xlbikgewogCQkqKHRhZysrKSA9IE1GSUVfVFlQRV9JQlNTX1NFVDsKIAkJKih0YWcrKykgPSAyOwogCkBAIC04MTIsMTIgKzgxMiwxMiBAQAogCQl0YWcrPTI7CiAJfQogCi0JaWYoZXJwX2xlbil7CisJaWYgKGVycF9sZW4pIHsKIAkJKih0YWcrKykgPSBNRklFX1RZUEVfRVJQOwogCQkqKHRhZysrKSA9IDE7CiAJCSoodGFnKyspID0gZXJwaW5mb19jb250ZW50OwogCX0KLQlpZihyYXRlX2V4X2xlbil7CisJaWYgKHJhdGVfZXhfbGVuKSB7CiAJCSoodGFnKyspID0gTUZJRV9UWVBFX1JBVEVTX0VYOwogCQkqKHRhZysrKSA9IHJhdGVfZXhfbGVuLTI7CiAJCW1lbWNweSh0YWcsIGllZWUtPmN1cnJlbnRfbmV0d29yay5yYXRlc19leCwgcmF0ZV9leF9sZW4tMik7CkBAIC04NzcsNyArODc3LDcgQEAKIAkJY3J5cHQgPSBpZWVlLT5jcnlwdFtpZWVlLT50eF9rZXlpZHhdOwogCWVsc2UgY3J5cHQgPSBOVUxMOwogCi0JZW5jcnlwdCA9IChjcnlwdCAmJiBjcnlwdC0+b3BzKTsKKwllbmNyeXB0ID0gY3J5cHQgJiYgY3J5cHQtPm9wczsKIAogCWlmIChlbmNyeXB0KQogCQlhc3NvYy0+Y2FwYWJpbGl0eSB8PSBjcHVfdG9fbGUxNihXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CkBAIC0xMDE2LDEyICsxMDE2LDEyIEBACiAJZW5jcnlwdCA9IGllZWUtPmhvc3RfZW5jcnlwdCAmJiBjcnlwdCAmJiBjcnlwdC0+b3BzICYmICgoMCA9PSBzdHJjbXAoY3J5cHQtPm9wcy0+bmFtZSwiV0VQIikgfHwgd3BhX2llX2xlbikpOwogCiAJLy9JbmNsdWRlIEhpZ2ggVGhyb3VwdXQgY2FwYWJpbGl0eSAmJiBSZWFsdGVrIHByb3ByaWV0YXJ5Ci0JaWYoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQmJmllZWUtPnBIVEluZm8tPmJFbmFibGVIVCkKKwlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQmJmllZWUtPnBIVEluZm8tPmJFbmFibGVIVCkKIAl7CiAJCWh0X2NhcF9idWYgPSAodTggKikmKGllZWUtPnBIVEluZm8tPlNlbGZIVENhcCk7CiAJCWh0X2NhcF9sZW4gPSBzaXplb2YoaWVlZS0+cEhUSW5mby0+U2VsZkhUQ2FwKTsKIAkJSFRDb25zdHJ1Y3RDYXBhYmlsaXR5RWxlbWVudChpZWVlLCBodF9jYXBfYnVmLCAmaHRfY2FwX2xlbiwgZW5jcnlwdCk7Ci0JCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbikKKwkJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbikKIAkJewogCQkJcmVhbHRla19pZV9idWYgPSBpZWVlLT5wSFRJbmZvLT5zelJUMlJUQWdnQnVmZmVyOwogCQkJcmVhbHRla19pZV9sZW4gPSBzaXplb2YoIGllZWUtPnBIVEluZm8tPnN6UlQyUlRBZ2dCdWZmZXIpOwpAQCAtMTAyOSwxNiArMTAyOSwxNiBAQAogCiAJCX0KIAl9Ci0JaWYoaWVlZS0+cW9zX3N1cHBvcnQpeworCWlmIChpZWVlLT5xb3Nfc3VwcG9ydCkgewogCQl3bW1faW5mb19sZW4gPSBiZWFjb24tPnFvc19kYXRhLnN1cHBvcnRlZD85OjA7CiAJfQogCiAKLQlpZihiZWFjb24tPmJDa2lwU3VwcG9ydGVkKQorCWlmIChiZWFjb24tPmJDa2lwU3VwcG9ydGVkKQogCXsKIAkJY2tpcF9pZV9sZW4gPSAzMCsyOwogCX0KLQlpZihiZWFjb24tPmJDY3hSbUVuYWJsZSkKKwlpZiAoYmVhY29uLT5iQ2N4Um1FbmFibGUpCiAJewogCQljY3hybV9pZV9sZW4gPSA2KzI7CiAJfQpAQCAtMTE0MSw3ICsxMTQxLDcgQEAKIAkJdGFnICs9IG9zQ2N4QWlyb25ldElFLkxlbmd0aDsKIAl9CiAKLQlpZihiZWFjb24tPmJDY3hSbUVuYWJsZSkKKwlpZiAoYmVhY29uLT5iQ2N4Um1FbmFibGUpCiAJewogCQlzdGF0aWMgdTggQ2N4Um1DYXBCdWZbXSA9IHsweDAwLCAweDQwLCAweDk2LCAweDAxLCAweDAxLCAweDAwfTsKIAkJT0NURVRfU1RSSU5HIG9zQ2N4Um1DYXA7CkBAIC0xMTY4LDggKzExNjgsOCBAQAogCQl0YWcgKz0gb3NDY3hWZXJOdW0uTGVuZ3RoOwogCX0KIAkvL0hUIGNhcCBlbGVtZW50Ci0JaWYoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQmJmllZWUtPnBIVEluZm8tPmJFbmFibGVIVCl7Ci0JCWlmKGllZWUtPnBIVEluZm8tPmVQZWVySFRTcGVjVmVyICE9IEhUX1NQRUNfVkVSX0VXQykKKwlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQgJiYgaWVlZS0+cEhUSW5mby0+YkVuYWJsZUhUKSB7CisJCWlmIChpZWVlLT5wSFRJbmZvLT5lUGVlckhUU3BlY1ZlciAhPSBIVF9TUEVDX1ZFUl9FV0MpCiAJCXsKIAkJCXRhZyA9IHNrYl9wdXQoc2tiLCBodF9jYXBfbGVuKTsKIAkJCSp0YWcrKyA9IE1GSUVfVFlQRV9IVF9DQVA7CkBAIC0xMTgyLDIyICsxMTgyLDIyIEBACiAKIAkvL2Nob29zZSB3aGF0IHdwYV9zdXBwbGljYW50IGdpdmVzIHRvIGFzc29jaWF0ZS4KIAl0YWcgPSBza2JfcHV0KHNrYiwgd3BhX2llX2xlbik7Ci0JaWYgKHdwYV9pZV9sZW4peworCWlmICh3cGFfaWVfbGVuKSB7CiAJCW1lbWNweSh0YWcsIGllZWUtPndwYV9pZSwgaWVlZS0+d3BhX2llX2xlbik7CiAJfQogCiAJdGFnID0gc2tiX3B1dChza2IsIHdtbV9pbmZvX2xlbik7Ci0JaWYod21tX2luZm9fbGVuKSB7CisJaWYgKHdtbV9pbmZvX2xlbikgewogCSAgaWVlZTgwMjExX1dNTV9JbmZvKGllZWUsICZ0YWcpOwogCX0KICNpZmRlZiBUSE9NQVNfVFVSQk8KIAl0YWcgPSBza2JfcHV0KHNrYiwgdHVyYm9faW5mb19sZW4pOwotCWlmKHR1cmJvX2luZm9fbGVuKSB7CisJaWYgKHR1cmJvX2luZm9fbGVuKSB7CiAJCWllZWU4MDIxMV9UVVJCT19JbmZvKGllZWUsICZ0YWcpOwogCX0KICNlbmRpZgogCi0JaWYoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQmJmllZWUtPnBIVEluZm8tPmJFbmFibGVIVCl7CisJaWYgKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ICYmIGllZWUtPnBIVEluZm8tPmJFbmFibGVIVCkgewogCQlpZihpZWVlLT5wSFRJbmZvLT5lUGVlckhUU3BlY1ZlciA9PSBIVF9TUEVDX1ZFUl9FV0MpCiAJCXsKIAkJCXRhZyA9IHNrYl9wdXQoc2tiLCBodF9jYXBfbGVuKTsKQEAgLTEyMDcsNyArMTIwNyw3IEBACiAJCQl0YWcgKz0gaHRfY2FwX2xlbiAtMjsKIAkJfQogCi0JCWlmKGllZWUtPnBIVEluZm8tPmJDdXJyZW50UlQyUlRBZ2dyZWdhdGlvbil7CisJCWlmIChpZWVlLT5wSFRJbmZvLT5iQ3VycmVudFJUMlJUQWdncmVnYXRpb24pIHsKIAkJCXRhZyA9IHNrYl9wdXQoc2tiLCByZWFsdGVrX2llX2xlbik7CiAJCQkqdGFnKysgPSBNRklFX1RZUEVfR0VORVJJQzsKIAkJCSp0YWcrKyA9IHJlYWx0ZWtfaWVfbGVuIC0gMjsKQEAgLTEyNzMsNyArMTI3Myw3IEBACiAJCS8vcHJpbnRrKEtFUk5fV0FSTklORyAiU2VuZGluZyBhdXRoZW50aWNhdGlvbiByZXF1ZXN0XG4iKTsKIAkJc29mdG1hY19tZ210X3htaXQoc2tiLCBpZWVlKTsKIAkJLy9CVUdPTiB3aGVuIHlvdSB0cnkgdG8gYWRkX3RpbWVyIHR3aWNlLCB1c2luZyBtb2RfdGltZXIgbWF5IGJlIGJldHRlciwgam9objA3MDkKLQkJaWYoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpeworCQlpZiAoIXRpbWVyX3BlbmRpbmcoJmllZWUtPmFzc29jaWF0ZV90aW1lcikpIHsKIAkJCWllZWUtPmFzc29jaWF0ZV90aW1lci5leHBpcmVzID0gamlmZmllcyArIChIWiAvIDIpOwogCQkJYWRkX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwogCQl9CkBAIC0xMzU4LDcgKzEzNTgsNyBAQAogCX0KIAlpZWVlLT5MaW5rRGV0ZWN0SW5mby5TbG90TnVtID0gMiAqICgxICsgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJlYWNvbl9pbnRlcnZhbC81MDApOwogCS8vIFRvIHByZXZlbnQgdGhlIGltbWVkaWF0ZWx5IGNhbGxpbmcgd2F0Y2hfZG9nIGFmdGVyIGFzc29jaWF0aW9uLgotCWlmKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZD09MHx8aWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD09MCApCisJaWYgKGllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZD09MHx8aWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkRhdGFJblBlcmlvZD09MCApCiAJewogCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2QmNuSW5QZXJpb2QgPSAxOwogCQlpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kPSAxOwpAQCAtMTM3MSw3ICsxMzcxLDcgQEAKIAllbHNlIGlmKGllZWUtPmlzX3NpbGVudF9yZXNldCA9PSAxKQogCXsKIAkJcHJpbnRrKCI9PT09PT09PT09PT09PT09PT0+c2lsZW50IHJlc2V0IGFzc29jaWF0ZVxuIik7Ci0JCWllZWUtPmlzX3NpbGVudF9yZXNldCA9IDA7CisJCWllZWUtPmlzX3NpbGVudF9yZXNldCA9IGZhbHNlOwogCX0KIAogCWlmIChpZWVlLT5kYXRhX2hhcmRfcmVzdW1lKQpAQCAtMTQzMCw3ICsxNDMwLDcgQEAKIAkJcmV0dXJuOwogCiAKLQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX0lORlJBIHx8IGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9BREhPQyl7CisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9JTkZSQSB8fCBpZWVlLT5pd19tb2RlID09IElXX01PREVfQURIT0MpIHsKIAkJLyogaWYgdGhlIHVzZXIgc3BlY2lmaWVkIHRoZSBBUCBNQUMsIHdlIG5lZWQgYWxzbyB0aGUgZXNzaWQKIAkJICogVGhpcyBjb3VsZCBiZSBvYnRhaW5lZCBieSBiZWFjb25zIG9yLCBpZiB0aGUgbmV0d29yayBkb2VzIG5vdAogCQkgKiBicm9hZGNhc3QgaXQsIGl0IGNhbiBiZSBwdXQgbWFudWFsbHkuCkBAIC0xNDU4LDEzICsxNDU4LDEzIEBACiAJCQkJLyogaWYgdGhlIGVzc2lkIGlzIGhpZGRlbiByZXBsYWNlIGl0IHdpdGggdGhlCiAJCQkJKiBlc3NpZCBwcm92aWRlZCBieSB0aGUgdXNlci4KIAkJCQkqLwotCQkJCWlmICghc3NpZGJyb2FkKXsKKwkJCQlpZiAoIXNzaWRicm9hZCkgewogCQkJCQlzdHJuY3B5KHRtcF9zc2lkLCBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOwogCQkJCQl0bXBfc3NpZF9sZW4gPSBpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW47CiAJCQkJfQogCQkJCW1lbWNweSgmaWVlZS0+Y3VycmVudF9uZXR3b3JrLCBuZXQsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX25ldHdvcmspKTsKIAotCQkJCWlmICghc3NpZGJyb2FkKXsKKwkJCQlpZiAoIXNzaWRicm9hZCkgewogCQkJCQlzdHJuY3B5KGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkLCB0bXBfc3NpZCwgSVdfRVNTSURfTUFYX1NJWkUpOwogCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPSB0bXBfc3NpZF9sZW47CiAJCQkJfQpAQCAtMTU0MSwxNiArMTU0MSwxNiBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmE7CiAJdTggKnQ7Ci0JaWYgKHNrYi0+bGVuIDwgIChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiktc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaW5mb19lbGVtZW50KSkpeworCWlmIChza2ItPmxlbiA8IChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbikgLSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSkgewogCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiaW52YWxpZCBsZW4gaW4gYXV0aCByZXNwOiAlZFxuIixza2ItPmxlbik7CiAJCXJldHVybiAweGNhZmU7CiAJfQogCSpjaGFsbGVuZ2UgPSBOVUxMOwogCWEgPSAoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbiAqKSBza2ItPmRhdGE7Ci0JaWYoc2tiLT5sZW4gPiAoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24pICszKSl7CisJaWYgKHNrYi0+bGVuID4gKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSArIDMpKSB7CiAJCXQgPSBza2ItPmRhdGEgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hdXRoZW50aWNhdGlvbik7CiAKLQkJaWYoKih0KyspID09IE1GSUVfVFlQRV9DSEFMTEVOR0UpeworCQlpZiAoKih0KyspID09IE1GSUVfVFlQRV9DSEFMTEVOR0UpIHsKIAkJCSpjaGxlbiA9ICoodCsrKTsKIAkJCSpjaGFsbGVuZ2UgPSBrbWVtZHVwKHQsICpjaGxlbiwgR0ZQX0FUT01JQyk7CiAJCQlpZiAoISpjaGFsbGVuZ2UpCkBAIC0xNTY3LDcgKzE1NjcsNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfYXV0aGVudGljYXRpb24gKmE7CiAKLQlpZiAoc2tiLT5sZW4gPCAgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKS1zaXplb2Yoc3RydWN0IGllZWU4MDIxMV9pbmZvX2VsZW1lbnQpKSl7CisJaWYgKHNrYi0+bGVuIDwgKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2F1dGhlbnRpY2F0aW9uKSAtIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCkpKSB7CiAJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJpbnZhbGlkIGxlbiBpbiBhdXRoIHJlcXVlc3Q6ICVkXG4iLHNrYi0+bGVuKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTE2MDEsNyArMTYwMSw3IEBACiAJdGFnID0gc2tiLT5kYXRhICsgc2l6ZW9mIChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAgKTsKIAogCXdoaWxlICh0YWcrMSA8IHNrYmVuZCl7Ci0JCWlmICgqdGFnID09IDApeworCQlpZiAoKnRhZyA9PSAwKSB7CiAJCQlzc2lkID0gdGFnKzI7CiAJCQlzc2lkbGVuID0gKih0YWcrMSk7CiAJCQlicmVhazsKQEAgLTE2NDIsNyArMTY0Miw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSAqcmVzcG9uc2VfaGVhZDsKIAl1MTYgc3RhdHVzX2NvZGU7CiAKLQlpZiAoc2tiLT5sZW4gPCAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUpKXsKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9hc3NvY19yZXNwb25zZV9mcmFtZSkpIHsKIAkJSUVFRTgwMjExX0RFQlVHX01HTVQoImludmFsaWQgbGVuIGluIGF1dGggcmVzcDogJWRcbiIsIHNrYi0+bGVuKTsKIAkJcmV0dXJuIDB4Y2FmZTsKIAl9CkBAIC0xNjcyLDcgKzE2NzIsNyBAQAogCS8vSUVFRTgwMjExRE1FU0coIlJ4IHByb2JlIik7CiAJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9wcm9iZV9ycSsrOwogCS8vRE1FU0coIkRlc3QgaXMgIk1BQ1NUUiwgTUFDMlNUUihkZXN0KSk7Ci0JaWYgKHByb2JlX3JxX3BhcnNlKGllZWUsIHNrYiwgZGVzdCkpeworCWlmIChwcm9iZV9ycV9wYXJzZShpZWVlLCBza2IsIGRlc3QpKSB7CiAJCS8vSUVFRTgwMjExRE1FU0coIldhcyBmb3IgbWUhIik7CiAJCWllZWUtPnNvZnRtYWNfc3RhdHMudHhfcHJvYmVfcnMrKzsKIAkJaWVlZTgwMjExX3Jlc3BfdG9fcHJvYmUoaWVlZSwgZGVzdCk7CkBAIC0xNzAzLDcgKzE3MDMsNyBAQAogCS8vdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXNzX3JxKys7Ci0JaWYgKGFzc29jX3JxX3BhcnNlKHNrYixkZXN0KSAhPSAtMSl7CisJaWYgKGFzc29jX3JxX3BhcnNlKHNrYiwgZGVzdCkgIT0gLTEpIHsKIAkJaWVlZTgwMjExX3Jlc3BfdG9fYXNzb2NfcnEoaWVlZSwgZGVzdCk7CiAJfQogCkBAIC0xNzU1LDEzICsxNzU1LDEzIEBACiAJCShpZWVlLT5tZ210X3F1ZXVlX3RhaWwgIT0gaWVlZS0+bWdtdF9xdWV1ZV9oZWFkKSkKIAkJcmV0dXJuIDA7CiAKLQlpZih0aW1lX2wpeworCWlmICh0aW1lX2wpIHsKIAkJKnRpbWVfbCA9IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0KIAkJCSsgKGllZWUtPmN1cnJlbnRfbmV0d29yay5iZWFjb25faW50ZXJ2YWwKIAkJCSogaWVlZS0+Y3VycmVudF9uZXR3b3JrLmR0aW1fcGVyaW9kKSAqIDEwMDA7CiAJfQogCi0JaWYodGltZV9oKXsKKwlpZiAodGltZV9oKSB7CiAJCSp0aW1lX2ggPSBpZWVlLT5jdXJyZW50X25ldHdvcmsubGFzdF9kdGltX3N0YV90aW1lWzFdOwogCQlpZih0aW1lX2wgJiYgKnRpbWVfbCA8IGllZWUtPmN1cnJlbnRfbmV0d29yay5sYXN0X2R0aW1fc3RhX3RpbWVbMF0pCiAJCQkqdGltZV9oICs9IDE7CkBAIC0xNzgyLDcgKzE3ODIsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPmxvY2ssIGZsYWdzKTsKIAotCWlmKChpZWVlLT5wcyA9PSBJRUVFODAyMTFfUFNfRElTQUJMRUQgfHwKKwlpZiAoKGllZWUtPnBzID09IElFRUU4MDIxMV9QU19ESVNBQkxFRCB8fAogCQlpZWVlLT5pd19tb2RlICE9IElXX01PREVfSU5GUkEgfHwKIAkJaWVlZS0+c3RhdGUgIT0gSUVFRTgwMjExX0xJTktFRCkpewogCkBAIC0xODQxLDggKzE4NDEsOCBAQAogCiB2b2lkIGllZWU4MDIxMV9zdGFfd2FrZXVwKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzaG9ydCBubCkKIHsKLQlpZihpZWVlLT5zdGFfc2xlZXAgPT0gMCl7Ci0JCWlmKG5sKXsKKwlpZiAoaWVlZS0+c3RhX3NsZWVwID09IDApIHsKKwkJaWYgKG5sKSB7CiAJCQlwcmludGsoIldhcm5pbmc6IGRyaXZlciBpcyBwcm9iYWJseSBmYWlsaW5nIHRvIHJlcG9ydCBUWCBwcyBlcnJvclxuIik7CiAJCQlpZWVlLT5wc19yZXF1ZXN0X3R4X2FjayhpZWVlLT5kZXYpOwogCQkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CkBAIC0xODU2LDcgKzE4NTYsNyBAQAogCiAJaWVlZS0+c3RhX3NsZWVwID0gMDsKIAotCWlmKG5sKXsKKwlpZiAobmwpIHsKIAkJaWVlZS0+cHNfcmVxdWVzdF90eF9hY2soaWVlZS0+ZGV2KTsKIAkJaWVlZTgwMjExX3N0YV9wc19zZW5kX251bGxfZnJhbWUoaWVlZSwgMCk7CiAJfQpAQCAtMTg3MCw3ICsxODcwLDcgQEAKIAogCWlmKGllZWUtPnN0YV9zbGVlcCA9PSAyKXsKIAkJLyogTnVsbCBmcmFtZSB3aXRoIFBTIGJpdCBzZXQgKi8KLQkJaWYoc3VjY2Vzcyl7CisJCWlmIChzdWNjZXNzKSB7CiAJCQlpZWVlLT5zdGFfc2xlZXAgPSAxOwogCQkJaWVlZS0+ZW50ZXJfc2xlZXBfc3RhdGUoaWVlZS0+ZGV2LGllZWUtPnBzX3RoLGllZWUtPnBzX3RsKTsKIAkJfQpAQCAtMTg4MSw3ICsxODgxLDcgQEAKIAkvKiAyMTExMjAwNSAtIHR4IGFnYWluIG51bGwgd2l0aG91dCBQUyBiaXQgaWYgbG9zdCAqLwogCWVsc2UgewogCi0JCWlmKChpZWVlLT5zdGFfc2xlZXAgPT0gMCkgJiYgIXN1Y2Nlc3MpeworCQlpZiAoKGllZWUtPnN0YV9zbGVlcCA9PSAwKSAmJiAhc3VjY2VzcykgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmllZWUtPm1nbXRfdHhfbG9jaywgZmxhZ3MyKTsKIAkJCWllZWU4MDIxMV9zdGFfcHNfc2VuZF9udWxsX2ZyYW1lKGllZWUsIDApOwogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWVlZS0+bWdtdF90eF9sb2NrLCBmbGFnczIpOwpAQCAtMTkyMCw2ICsxOTIwLDY2IEBACiAJcmV0dXJuOwogCiB9CisKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9jaGVja19hdXRoX3Jlc3BvbnNlKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLAorCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCit7CisJLyogZGVmYXVsdCBzdXBwb3J0IE4gbW9kZSwgZGlzYWJsZSBoYWxmTm1vZGUgKi8KKwlib29sIGJTdXBwb3J0Tm1vZGUgPSB0cnVlLCBiSGFsZlN1cHBvcnRObW9kZSA9IGZhbHNlOworCXUxNiBlcnJjb2RlOworCXU4ICpjaGFsbGVuZ2U7CisJaW50IGNobGVuID0gMDsKKwl1MzIgaW90QWN0aW9uOworCisJZXJyY29kZSA9IGF1dGhfcGFyc2Uoc2tiLCAmY2hhbGxlbmdlLCAmY2hsZW4pOworCWlmICghZXJyY29kZSkgeworCQlpZiAoaWVlZS0+b3Blbl93ZXAgfHwgIWNoYWxsZW5nZSkgeworCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRDsKKwkJCWllZWUtPnNvZnRtYWNfc3RhdHMucnhfYXV0aF9yc19vaysrOworCQkJaW90QWN0aW9uID0gaWVlZS0+cEhUSW5mby0+SU9UQWN0aW9uOworCQkJaWYgKCEoaW90QWN0aW9uICYgSFRfSU9UX0FDVF9QVVJFX05fTU9ERSkpIHsKKwkJCQlpZiAoIWllZWUtPkdldE5tb2RlU3VwcG9ydEJ5U2VjQ2ZnKGllZWUtPmRldikpIHsKKwkJCQkJLyogV0VQIG9yIFRLSVAgZW5jcnlwdGlvbiAqLworCQkJCQlpZiAoSXNIVEhhbGZObW9kZUFQcyhpZWVlKSkgeworCQkJCQkJYlN1cHBvcnRObW9kZSA9IHRydWU7CisJCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9IHRydWU7CisJCQkJCX0gZWxzZSB7CisJCQkJCQliU3VwcG9ydE5tb2RlID0gZmFsc2U7CisJCQkJCQliSGFsZlN1cHBvcnRObW9kZSA9IGZhbHNlOworCQkJCQl9CisJCQkJCW5ldGRldl9kYmcoaWVlZS0+ZGV2LCAiU0VDKCVkLCAlZClcbiIsCisJCQkJCQkJYlN1cHBvcnRObW9kZSwKKwkJCQkJCQliSGFsZlN1cHBvcnRObW9kZSk7CisJCQkJfQorCQkJfQorCQkJLyogRHVtbXkgd2lybGVzcyBtb2RlIHNldHRpbmctIGF2b2lkIGVuY3J5cHRpb24gaXNzdWUgKi8KKwkJCWlmIChiU3VwcG9ydE5tb2RlKSB7CisJCQkJLyogTiBtb2RlIHNldHRpbmcgKi8KKwkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LAorCQkJCQkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLm1vZGUpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBiL2cgbW9kZSBzZXR0aW5nIC0gVE9ETyAqLworCQkJCWllZWUtPlNldFdpcmVsZXNzTW9kZShpZWVlLT5kZXYsIElFRUVfRyk7CisJCQl9CisKKwkJCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHICYmCisJCQkJCWJIYWxmU3VwcG9ydE5tb2RlID09IHRydWUpIHsKKwkJCQluZXRkZXZfZGJnKGllZWUtPmRldiwgImVudGVyIGhhbGYgTiBtb2RlXG4iKTsKKwkJCQlpZWVlLT5iSGFsZldpcmVsZXNzTjI0R01vZGUgPSB0cnVlOworCQkJfSBlbHNlCisJCQkJaWVlZS0+YkhhbGZXaXJlbGVzc04yNEdNb2RlID0gZmFsc2U7CisKKwkJCWllZWU4MDIxMV9hc3NvY2lhdGVfc3RlcDIoaWVlZSk7CisJCX0gZWxzZSB7CisJCQlpZWVlODAyMTFfYXV0aF9jaGFsbGVuZ2UoaWVlZSwgY2hhbGxlbmdlLCBjaGxlbik7CisJCX0KKwl9IGVsc2UgeworCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfZXJyKys7CisJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJBdXRoIHJlc3BvbnNlIHN0YXR1cyBjb2RlIDB4JXgiLCBlcnJjb2RlKTsKKwkJaWVlZTgwMjExX2Fzc29jaWF0ZV9hYm9ydChpZWVlKTsKKwl9Cit9CisKIGlubGluZSBpbnQKIGllZWU4MDIxMV9yeF9mcmFtZV9zb2Z0bWFjKHN0cnVjdCBpZWVlODAyMTFfZGV2aWNlICppZWVlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0cyAqcnhfc3RhdHMsIHUxNiB0eXBlLApAQCAtMTkyNywxMiArMTk4Nyw5IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkciAqKSBza2ItPmRhdGE7CiAJdTE2IGVycmNvZGU7Ci0JdTggKmNoYWxsZW5nZTsKLQlpbnQgY2hsZW49MDsKIAlpbnQgYWlkOwogCXN0cnVjdCBpZWVlODAyMTFfYXNzb2NfcmVzcG9uc2VfZnJhbWUgKmFzc29jX3Jlc3A7CiAvLwlzdHJ1Y3QgaWVlZTgwMjExX2luZm9fZWxlbWVudCAqaW5mb19lbGVtZW50OwotCWJvb2wgYlN1cHBvcnRObW9kZSA9IHRydWUsIGJIYWxmU3VwcG9ydE5tb2RlID0gZmFsc2U7IC8vZGVmYXVsdCBzdXBwb3J0IE4gbW9kZSwgZGlzYWJsZSBoYWxmTm1vZGUKIAogCWlmKCFpZWVlLT5wcm90b19zdGFydGVkKQogCQlyZXR1cm4gMDsKQEAgLTE5NjcsNyArMjAyNCw3IEBACiAJCQkJaWVlZS0+c29mdG1hY19zdGF0cy5yeF9hc3Nfb2srKzsKIAkJCQkvKiBzdGF0aW9uIHN1cHBvcnQgcW9zICovCiAJCQkJLyogTGV0IHRoZSByZWdpc3RlciBzZXR0aW5nIGRlZmF1bHRseSB3aXRoIExlZ2FjeSBzdGF0aW9uICovCi0JCQkJaWYoaWVlZS0+cW9zX3N1cHBvcnQpIHsKKwkJCQlpZiAoaWVlZS0+cW9zX3N1cHBvcnQpIHsKIAkJCQkJYXNzb2NfcmVzcCA9IChzdHJ1Y3QgaWVlZTgwMjExX2Fzc29jX3Jlc3BvbnNlX2ZyYW1lICopc2tiLT5kYXRhOwogCQkJCQltZW1zZXQobmV0d29yaywgMCwgc2l6ZW9mKCpuZXR3b3JrKSk7CiAJCQkJCWlmIChpZWVlODAyMTFfcGFyc2VfaW5mb19wYXJhbShpZWVlLGFzc29jX3Jlc3AtPmluZm9fZWxlbWVudCxcCkBAIC0yMDEzLDY4ICsyMDcwLDE2IEBACiAKIAljYXNlIElFRUU4MDIxMV9TVFlQRV9BVVRIOgogCi0JCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX0FTU09DSUFURSl7Ci0JCQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX0FTU09DSUFUSU5HX0FVVEhFTlRJQ0FUSU5HICYmCi0JCQlpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCQlpZiAoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19BU1NPQ0lBVEUpIHsKKwkJCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRJTkcKKwkJCQkmJiBpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKIAotCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiUmVjZWl2ZWQgYXV0aGVudGljYXRpb24gcmVzcG9uc2UiKTsKLQotCQkJCQllcnJjb2RlID0gYXV0aF9wYXJzZShza2IsICZjaGFsbGVuZ2UsICZjaGxlbik7Ci0JCQkJCWlmICghZXJyY29kZSkgewotCQkJCQkJaWYoaWVlZS0+b3Blbl93ZXAgfHwgIWNoYWxsZW5nZSl7Ci0JCQkJCQkJaWVlZS0+c3RhdGUgPSBJRUVFODAyMTFfQVNTT0NJQVRJTkdfQVVUSEVOVElDQVRFRDsKLQkJCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfb2srKzsKLQkJCQkJCQlpZighKGllZWUtPnBIVEluZm8tPklPVEFjdGlvbiZIVF9JT1RfQUNUX1BVUkVfTl9NT0RFKSkKLQkJCQkJCQl7Ci0JCQkJCQkJCWlmICghaWVlZS0+R2V0Tm1vZGVTdXBwb3J0QnlTZWNDZmcoaWVlZS0+ZGV2KSkKLQkJCQkJCQkJewotCQkJCQkJCQkJCQkvLyBXRVAgb3IgVEtJUCBlbmNyeXB0aW9uCi0JCQkJCQkJCQlpZihJc0hUSGFsZk5tb2RlQVBzKGllZWUpKQotCQkJCQkJCQkJewotCQkJCQkJCQkJCWJTdXBwb3J0Tm1vZGUgPSB0cnVlOwotCQkJCQkJCQkJCWJIYWxmU3VwcG9ydE5tb2RlID0gdHJ1ZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UKLQkJCQkJCQkJCXsKLQkJCQkJCQkJCQliU3VwcG9ydE5tb2RlID0gZmFsc2U7Ci0JCQkJCQkJCQkJYkhhbGZTdXBwb3J0Tm1vZGUgPSBmYWxzZTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJcHJpbnRrKCI9PT09PT09PT09PnRvIGxpbmsgd2l0aCBBUCB1c2luZyBTRUMoJWQsICVkKSIsIGJTdXBwb3J0Tm1vZGUsIGJIYWxmU3VwcG9ydE5tb2RlKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQkvKiBEdW1teSB3aXJsZXNzIG1vZGUgc2V0dGluZyB0byBhdm9pZCBlbmNyeXB0aW9uIGlzc3VlICovCi0JCQkJCQkJaWYoYlN1cHBvcnRObW9kZSkgewotCQkJCQkJCQkvL04gbW9kZSBzZXR0aW5nCi0JCQkJCQkJCWllZWUtPlNldFdpcmVsZXNzTW9kZShpZWVlLT5kZXYsIFwKLQkJCQkJCQkJCQlpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSk7Ci0JCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCS8vYi9nIG1vZGUgc2V0dGluZwotCQkJCQkJCQkvKlRPRE8qLwotCQkJCQkJCQlpZWVlLT5TZXRXaXJlbGVzc01vZGUoaWVlZS0+ZGV2LCBJRUVFX0cpOwotCQkJCQkJCX0KLQotCQkJCQkJCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsubW9kZSA9PSBJRUVFX05fMjRHICYmIGJIYWxmU3VwcG9ydE5tb2RlID09IHRydWUpCi0JCQkJCQkJewotCQkJCQkJCQlwcmludGsoIj09PT09PT09PT09PT09PT5lbnRlcm4gaGFsZiBOIG1vZGVcbiIpOwotCQkJCQkJCQlpZWVlLT5iSGFsZldpcmVsZXNzTjI0R01vZGUgPSB0cnVlOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlCi0JCQkJCQkJCWllZWUtPmJIYWxmV2lyZWxlc3NOMjRHTW9kZSA9IGZhbHNlOwotCi0JCQkJCQkJaWVlZTgwMjExX2Fzc29jaWF0ZV9zdGVwMihpZWVlKTsKLQkJCQkJCX1lbHNlewotCQkJCQkJCWllZWU4MDIxMV9hdXRoX2NoYWxsZW5nZShpZWVlLCBjaGFsbGVuZ2UsIGNobGVuKTsKLQkJCQkJCX0KLQkJCQkJfWVsc2V7Ci0JCQkJCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnJ4X2F1dGhfcnNfZXJyKys7Ci0JCQkJCQlJRUVFODAyMTFfREVCVUdfTUdNVCgiQXV0aGVudGljYXRpb24gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgMHgleCIsZXJyY29kZSk7Ci0JCQkJCQlpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0KGllZWUpOwotCQkJCQl9Ci0KLQkJCQl9ZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUil7Ci0JCQkJCWllZWU4MDIxMV9yeF9hdXRoX3JxKGllZWUsIHNrYik7Ci0JCQkJfQorCQkJCUlFRUU4MDIxMV9ERUJVR19NR01UKCJSZWNlaXZlZCBhdXRoIHJlc3BvbnNlIik7CisJCQkJaWVlZTgwMjExX2NoZWNrX2F1dGhfcmVzcG9uc2UoaWVlZSwgc2tiKTsKKwkJCX0gZWxzZSBpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgeworCQkJCWllZWU4MDIxMV9yeF9hdXRoX3JxKGllZWUsIHNrYik7CiAJCQl9CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVE6CkBAIC0yMTEwLDI3ICsyMTE1LDI2IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtMTsKLQkJYnJlYWs7CiAJfQogCiAJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCXJldHVybiAwOwogfQogCi0vKiBmb2xsb3dpbmcgYXJlIGZvciBhIHNpbXBsZXIgVFggcXVldWUgbWFuYWdlbWVudC4KLSAqIEluc3RlYWQgb2YgdXNpbmcgbmV0aWZfW3N0b3Avd2FrZV1fcXVldWUgdGhlIGRyaXZlcgotICogd2lsbCB1c2VzIHRoZXNlIHR3byBmdW5jdGlvbiAocGx1cyBhIHJlc2V0IG9uZSksIHRoYXQKLSAqIHdpbGwgaW50ZXJuYWxseSB1c2VzIHRoZSBrZXJuZWwgbmV0aWZfKiBhbmQgdGFrZXMKLSAqIGNhcmUgb2YgdGhlIGllZWU4MDIuMTEgZnJhZ21lbnRhdGlvbi4KLSAqIFNvIHRoZSBkcml2ZXIgcmVjZWl2ZXMgYSBmcmFnbWVudCBwZXIgdGltZSBhbmQgbWlnaHQKLSAqIGNhbGwgdGhlIHN0b3AgZnVuY3Rpb24gd2hlbiBpdCB3YW50IHdpdGhvdXQgdGFrZSBjYXJlCi0gKiB0byBoYXZlIGVub3VnaHQgcm9vbSB0byBUWCBhbiBlbnRpcmUgcGFja2V0LgotICogVGhpcyBtaWdodCBiZSB1c2VmdWwgaWYgZWFjaCBmcmFnbWVudCBuZWVkIGl0J3Mgb3duCi0gKiBkZXNjcmlwdG9yLCB0aHVzIGp1c3Qga2VlcCBhIHRvdGFsIGZyZWUgbWVtb3J5ID4gdGhhbgotICogdGhlIG1heCBmcmFnbWVudGF0aW9uIHRyZXNob2xkIGlzIG5vdCBlbm91Z2h0Li4gSWYgdGhlCi0gKiBpZWVlODAyLjExIHN0YWNrIHBhc3NlZCBhIFRYQiBzdHJ1Y3QgdGhlbiB5b3UgbmVlZGVkCisvKiBUaGUgZm9sbG93aW5nIGFyZSBmb3IgYSBzaW1wbGVyIFRYIHF1ZXVlIG1hbmFnZW1lbnQuCisgKiBJbnN0ZWFkIG9mIHVzaW5nIG5ldGlmX1tzdG9wL3dha2VdX3F1ZXVlLCB0aGUgZHJpdmVyCisgKiB3aWxsIHVzZSB0aGVzZSB0d28gZnVuY3Rpb25zIChwbHVzIGEgcmVzZXQgb25lKSB0aGF0CisgKiB3aWxsIGludGVybmFsbHkgY2FsbCB0aGUga2VybmVsIG5ldGlmXyogYW5kIHRha2UgY2FyZQorICogb2YgdGhlIGllZWU4MDIuMTEgZnJhZ21lbnRhdGlvbi4KKyAqIFNvLCB0aGUgZHJpdmVyIHJlY2VpdmVzIGEgZnJhZ21lbnQgYXQgYSB0aW1lIGFuZCBtaWdodAorICogY2FsbCB0aGUgc3RvcCBmdW5jdGlvbiB3aGVuIGl0IHdhbnRzLCB3aXRob3V0IHRha2luZworICogY2FyZSB0byBoYXZlIGVub3VnaCByb29tIHRvIFRYIGFuIGVudGlyZSBwYWNrZXQuCisgKiBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBpZiBlYWNoIGZyYWdtZW50IG5lZWRzIGl0cyBvd24KKyAqIGRlc2NyaXB0b3IuIFRodXMsIGp1c3Qga2VlcGluZyBhIHRvdGFsIGZyZWUgbWVtb3J5ID4gdGhhbgorICogdGhlIG1heCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCBpcyBub3QgZW5vdWdoLiBJZiB0aGUKKyAqIGllZWU4MDIuMTEgc3RhY2sgcGFzc2VkIGEgVFhCIHN0cnVjdCwgdGhlbiB5b3Ugd291bGQgbmVlZAogICogdG8ga2VlcCBOIGZyZWUgZGVzY3JpcHRvcnMgd2hlcmUKLSAqIE4gPSBNQVhfUEFDS0VUX1NJWkUgLyBNSU5fRlJBR19UUkVTSE9MRAorICogTiA9IE1BWF9QQUNLRVRfU0laRSAvIE1JTl9GUkFHX1RIUkVTSE9MRC4KICAqIEluIHRoaXMgd2F5IHlvdSBuZWVkIGp1c3Qgb25lIGFuZCB0aGUgODAyLjExIHN0YWNrCiAgKiB3aWxsIHRha2UgY2FyZSBvZiBidWZmZXJpbmcgZnJhZ21lbnRzIGFuZCBwYXNzIHRoZW0gdG8KICAqIHRvIHRoZSBkcml2ZXIgbGF0ZXIsIHdoZW4gaXQgd2FrZXMgdGhlIHF1ZXVlLgpAQCAtMjE1Miw3ICsyMTU2LDcgQEAKIAlpZWVlLT5zdGF0cy50eF9ieXRlcyArPSB0eGItPnBheWxvYWRfc2l6ZTsKIAlpZWVlLT5zdGF0cy50eF9wYWNrZXRzKys7CiAJdGNiX2Rlc2MgPSAoY2JfZGVzYyAqKSh0eGItPmZyYWdtZW50c1swXS0+Y2IgKyBNQVhfREVWX0FERFJfU0laRSk7Ci0JaWYodGNiX2Rlc2MtPmJNdWx0aWNhc3QpIHsKKwlpZiAodGNiX2Rlc2MtPmJNdWx0aWNhc3QpIHsKIAkJaWVlZS0+c3RhdHMubXVsdGljYXN0Kys7CiAJfQogCS8qIGlmIHhtaXQgYXZhaWxhYmxlLCBqdXN0IHhtaXQgaXQgaW1tZWRpYXRlbHksIGVsc2UganVzdCBpbnNlcnQgaXQgdG8gdGhlIHdhaXQgcXVldWUgKi8KQEAgLTIyMjQsNyArMjIyOCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCWluaXRfbWdtdF9xdWV1ZShpZWVlKTsKLQlpZiAoaWVlZS0+dHhfcGVuZGluZy50eGIpeworCWlmIChpZWVlLT50eF9wZW5kaW5nLnR4YikgewogCQlpZWVlODAyMTFfdHhiX2ZyZWUoaWVlZS0+dHhfcGVuZGluZy50eGIpOwogCQlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7CiAJfQpAQCAtMjI0Niw3ICsyMjUwLDcgQEAKIAogCWllZWUtPnF1ZXVlX3N0b3AgPSAwOwogCi0JaWYoaWVlZS0+c29mdG1hY19mZWF0dXJlcyAmIElFRUVfU09GVE1BQ19TSU5HTEVfUVVFVUUpeworCWlmIChpZWVlLT5zb2Z0bWFjX2ZlYXR1cmVzICYgSUVFRV9TT0ZUTUFDX1NJTkdMRV9RVUVVRSkgewogCQl3aGlsZSAoIWllZWUtPnF1ZXVlX3N0b3AgJiYgKHNrYiA9IGRlcXVldWVfbWdtdChpZWVlKSkpewogCiAJCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgICopIHNrYi0+ZGF0YTsKQEAgLTIyNjUsNyArMjI2OSw3IEBACiAJaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIGllZWUtPnR4X3BlbmRpbmcudHhiKQogCQlpZWVlODAyMTFfcmVzdW1lX3R4KGllZWUpOwogCi0JaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSl7CisJaWYgKCFpZWVlLT5xdWV1ZV9zdG9wICYmIG5ldGlmX3F1ZXVlX3N0b3BwZWQoaWVlZS0+ZGV2KSkgewogCQlpZWVlLT5zb2Z0bWFjX3N0YXRzLnN3dHhhd2FrZSsrOwogCQluZXRpZl93YWtlX3F1ZXVlKGllZWUtPmRldik7CiAJfQpAQCAtMjI4MCw3ICsyMjg0LDcgQEAKIAkvL3Vuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJLy9zcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jayxmbGFncyk7CiAKLQlpZiAoISBuZXRpZl9xdWV1ZV9zdG9wcGVkKGllZWUtPmRldikpeworCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChpZWVlLT5kZXYpKSB7CiAJCW5ldGlmX3N0b3BfcXVldWUoaWVlZS0+ZGV2KTsKIAkJaWVlZS0+c29mdG1hY19zdGF0cy5zd3R4c3RvcCsrOwogCX0KQEAgLTIzMDEsNyArMjMwNSw3IEBACiB7CiAJaWVlZS0+YXNzb2NfaWQgPSAxOwogCi0JaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5zc2lkX2xlbiA9PSAwKXsKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApIHsKIAkJc3RybmNweShpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZCwKIAkJCUlFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lELAogCQkJSVdfRVNTSURfTUFYX1NJWkUpOwpAQCAtMjMyNSw3ICsyMzI5LDcgQEAKIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YXJ0X21vbml0b3JfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSkKIHsKLQlpZihpZWVlLT5yYXdfdHgpeworCWlmIChpZWVlLT5yYXdfdHgpIHsKIAogCQlpZiAoaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZSkKIAkJCWllZWUtPmRhdGFfaGFyZF9yZXN1bWUoaWVlZS0+ZGV2KTsKQEAgLTIzNDUsMTMgKzIzNDksMTMgQEAKIAkgKiAoYWJvcnQpIHRoaXMgd3EgKHdoZW4gc3luY3JvIHNjYW5uaW5nKSBiZWZvcmUgc2xlZXBpbmcKIAkgKiBvbiB0aGUgc2VtYXBob3JlCiAJICovCi0JaWYoIWllZWUtPnByb3RvX3N0YXJ0ZWQpeworCWlmICghaWVlZS0+cHJvdG9fc3RhcnRlZCkgewogCQlwcmludGsoIj09PT09PT09PT1vaCBkcml2ZXIgZG93biByZXR1cm5cbiIpOwogCQlyZXR1cm47CiAJfQogCWRvd24oJmllZWUtPnd4X3NlbSk7CiAKLQlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID09IDApeworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuc3NpZF9sZW4gPT0gMCkgewogCQlzdHJjcHkoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWQsIElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEKTsKIAkJaWVlZS0+Y3VycmVudF9uZXR3b3JrLnNzaWRfbGVuID0gc3RybGVuKElFRUU4MDIxMV9ERUZBVUxUX1RYX0VTU0lEKTsKIAkJaWVlZS0+c3NpZF9zZXQgPSAxOwpAQCAtMjM4Miw3ICsyMzg2LDcgQEAKIAkJaWVlZTgwMjExX3N0YXJ0X3NjYW5fc3luY3JvKGllZWUpOwogCiAJLyogdGhlIG5ldHdvcmsgZGVmaW5pdGl2ZWx5IGlzIG5vdCBoZXJlLi4gY3JlYXRlIGEgbmV3IGNlbGwgKi8KLQlpZiAoaWVlZS0+c3RhdGUgPT0gSUVFRTgwMjExX05PTElOSyl7CisJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspIHsKIAkJcHJpbnRrKCJjcmVhdGluZyBuZXcgSUJTUyBjZWxsXG4iKTsKIAkJaWYoIWllZWUtPndhcF9zZXQpCiAJCQlpZWVlODAyMTFfcmFuZG9taXplX2NlbGwoaWVlZSk7CkBAIC0yNDU2LDkgKzI0NjAsOSBAQAogCS8vIFJlZjogODAyLjExZCAxMS4xLjMuMwogCS8vIFNUQSBzaGFsbCBub3Qgc3RhcnQgYSBCU1MgdW5sZXNzIHByb3Blcmx5IGZvcm1lZCBCZWFjb24gZnJhbWUgaW5jbHVkaW5nIGEgQ291bnRyeSBJRS4KIAkvLwotCWlmKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgJiYgIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCisJaWYgKElTX0RPVDExRF9FTkFCTEUoaWVlZSkgJiYgIUlTX0NPVU5UUllfSUVfVkFMSUQoaWVlZSkpCiAJewotCQlpZighIGllZWUtPmJHbG9iYWxEb21haW4pCisJCWlmICghIGllZWUtPmJHbG9iYWxEb21haW4pCiAJCXsKIAkJCXJldHVybjsKIAkJfQpAQCAtMjQ3OSw3ICsyNDgzLDcgQEAKIAkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmaWVlZS0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9OT0xJTkspeworCWlmIChpZWVlLT5zdGF0ZSA9PSBJRUVFODAyMTFfTk9MSU5LKSB7CiAJCWllZWUtPmFjdHNjYW5uaW5nID0gdHJ1ZTsKIAkJaWVlZTgwMjExX3N0YXJ0X3NjYW4oaWVlZSk7CiAJfQpAQCAtMjYzMyw3ICsyNjM3LDcgQEAKIAogCWllZWUtPnByb3RvX3N0YXJ0ZWQgPSAxOwogCi0JaWYgKGllZWUtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsID09IDApeworCWlmIChpZWVlLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAwKSB7CiAJCWRvewogCQkJY2grKzsKIAkJCWlmIChjaCA+IE1BWF9DSEFOTkVMX05VTUJFUikKQEAgLTI3MTksMTYgKzI3MjMsMTQgQEAKIAlpZWVlLT5zdGFfZWRjYV9wYXJhbVsyXSA9IDB4MDA1RTQzNDI7CiAJaWVlZS0+c3RhX2VkY2FfcGFyYW1bM10gPSAweDAwMkYzMjYyOwogCWllZWUtPmFnZ3JlZ2F0aW9uID0gdHJ1ZTsKLQlpZWVlLT5lbmFibGVfcnhfaW1tX0JBID0gMTsKKwlpZWVlLT5lbmFibGVfcnhfaW1tX0JBID0gdHJ1ZTsKIAlpZWVlLT50eF9wZW5kaW5nLnR4YiA9IE5VTEw7CiAKLQlpbml0X3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIpOwotCWllZWUtPmFzc29jaWF0ZV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaWVlZTsKLQlpZWVlLT5hc3NvY2lhdGVfdGltZXIuZnVuY3Rpb24gPSBpZWVlODAyMTFfYXNzb2NpYXRlX2Fib3J0X2NiOworCXNldHVwX3RpbWVyKCZpZWVlLT5hc3NvY2lhdGVfdGltZXIsIGllZWU4MDIxMV9hc3NvY2lhdGVfYWJvcnRfY2IsCisJCSAgICAodW5zaWduZWQgbG9uZylpZWVlKTsKIAotCWluaXRfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lcik7Ci0JaWVlZS0+YmVhY29uX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgaWVlZTsKLQlpZWVlLT5iZWFjb25fdGltZXIuZnVuY3Rpb24gPSBpZWVlODAyMTFfc2VuZF9iZWFjb25fY2I7CisJc2V0dXBfdGltZXIoJmllZWUtPmJlYWNvbl90aW1lciwgaWVlZTgwMjExX3NlbmRfYmVhY29uX2NiLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpaWVlZSk7CiAKIAlpZWVlLT53cSA9IGNyZWF0ZV93b3JrcXVldWUoRFJWX05BTUUpOwogCkBAIC0zMDI3LDEyICszMDI5LDExIEBACiAKIAkJaWVlZTgwMjExX2NyeXB0X2RlbGF5ZWRfZGVpbml0KGllZWUsIGNyeXB0KTsKIAotCQluZXdfY3J5cHQgPSBrbWFsbG9jKHNpemVvZigqbmV3X2NyeXB0KSwgR0ZQX0tFUk5FTCk7CisJCW5ld19jcnlwdCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXdfY3J5cHQpLCBHRlBfS0VSTkVMKTsKIAkJaWYgKG5ld19jcnlwdCA9PSBOVUxMKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBkb25lOwogCQl9Ci0JCW1lbXNldChuZXdfY3J5cHQsIDAsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NyeXB0X2RhdGEpKTsKIAkJbmV3X2NyeXB0LT5vcHMgPSBvcHM7CiAJCWlmIChuZXdfY3J5cHQtPm9wcyAmJiB0cnlfbW9kdWxlX2dldChuZXdfY3J5cHQtPm9wcy0+b3duZXIpKQogCQkJbmV3X2NyeXB0LT5wcml2ID0KQEAgLTMxNDAsNyArMzE0MSw3IEBACiAJCXN0cnVjdCBpZWVlODAyMTFfbmV0d29yayAqYmVhY29uID0gJmllZWUtPmN1cnJlbnRfbmV0d29yazsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkJc2tiID0gaWVlZTgwMjExX2Rpc2Fzc29jaWF0ZV9za2IoYmVhY29uLGllZWUsYXNSc24pOwotCQlpZiAoc2tiKXsKKwkJaWYgKHNrYikgewogCQkJCXNvZnRtYWNfbWdtdF94bWl0KHNrYiwgaWVlZSk7CiAJCQkJLy9kZXZfa2ZyZWVfc2tiX2FueShza2IpOy8vZWRpdCBieSB0aG9tYXMKIAkJfQpAQCAtMzE1NSw3ICszMTU2LDcgQEAKIAlkb3duKCZpZWVlLT53eF9zZW0pOwogCS8vSUVFRV9ERUJVR19JTkZPKCJ3cGFfc3VwcGxpY2FudDogbGVuPSVkXG4iLCBwLT5sZW5ndGgpOwogCi0JaWYgKHAtPmxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgaWVlZV9wYXJhbSkgfHwgIXAtPnBvaW50ZXIpeworCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTMyMTAsNyArMzIxMSw3IEBACiAJaWYgKGllZWUtPnN0YXRlID09IElFRUU4MDIxMV9MSU5LRUQpCiAJCW1lbWNweSh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgaWVlZS0+Y3VycmVudF9uZXR3b3JrLmJzc2lkLCBFVEhfQUxFTik7CiAJZWxzZQotCQltZW1zZXQod3JxdS5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcih3cnF1LmFwX2FkZHIuc2FfZGF0YSk7CiAJd2lyZWxlc3Nfc2VuZF9ldmVudChpZWVlLT5kZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwogfQogRVhQT1JUX1NZTUJPTChub3RpZnlfd3hfYXNzb2NfZXZlbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfc29mdG1hY193eC5jCmluZGV4IDY0NDM2OGQuLjcxNGZiY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3NvZnRtYWNfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV9zb2Z0bWFjX3d4LmMKQEAgLTM2LDcgKzM2LDcgQEAKIAogCWRvd24oJmllZWUtPnd4X3NlbSk7CiAKLQlpZihpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpeworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfSU5GUkEpIHsKIAkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEyMSw3ICsxMjEsNyBAQAogCQlpZWVlLT5zdGF0ZSAhPSBJRUVFODAyMTFfTElOS0VEX1NDQU5OSU5HICYmCiAJCWllZWUtPndhcF9zZXQgPT0gMCkKIAotCQltZW1zZXQod3JxdS0+YXBfYWRkci5zYV9kYXRhLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIod3JxdS0+YXBfYWRkci5zYV9kYXRhKTsKIAllbHNlCiAJCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsCiAJCSAgICAgICBpZWVlLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsIEVUSF9BTEVOKTsKQEAgLTE0OCwxMiArMTQ4LDEyIEBACiAKIAlkb3duKCZpZWVlLT53eF9zZW0pOwogCS8qIHVzZSBpZmNvbmZpZyBodyBldGhlciAqLwotCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTUFTVEVSKXsKKwlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01BU1RFUikgewogCQlyZXQgPSAtMTsKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHRlbXAtPnNhX2ZhbWlseSAhPSBBUlBIUkRfRVRIRVIpeworCWlmICh0ZW1wLT5zYV9mYW1pbHkgIT0gQVJQSFJEX0VUSEVSKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTM0NSw3ICszNDUsNyBAQAogCWllZWUtPnN0YXRlID0gSUVFRTgwMjExX0xJTktFRDsKIAlpZWVlLT5saW5rX2NoYW5nZShpZWVlLT5kZXYpOwogCS8vIFRvIHByZXZlbnQgdGhlIGltbWVkaWF0ZWx5IGNhbGxpbmcgd2F0Y2hfZG9nIGFmdGVyIHNjYW4uCi0JaWYoaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kPT0wfHxpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kPT0wICkKKwlpZiAoaWVlZS0+TGlua0RldGVjdEluZm8uTnVtUmVjdkJjbkluUGVyaW9kPT0wfHxpZWVlLT5MaW5rRGV0ZWN0SW5mby5OdW1SZWN2RGF0YUluUGVyaW9kPT0wICkKIAl7CiAJCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZCY25JblBlcmlvZCA9IDE7CiAJCWllZWUtPkxpbmtEZXRlY3RJbmZvLk51bVJlY3ZEYXRhSW5QZXJpb2Q9IDE7CkBAIC0zNjksNyArMzY5LDcgQEAKIAogCWRvd24oJmllZWUtPnd4X3NlbSk7CiAKLQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IgfHwgIShpZWVlLT5wcm90b19zdGFydGVkKSl7CisJaWYgKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SIHx8ICEoaWVlZS0+cHJvdG9fc3RhcnRlZCkpIHsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQwMCwxMiArNDAwLDEyIEBACiAKIAlwcm90b19zdGFydGVkID0gaWVlZS0+cHJvdG9fc3RhcnRlZDsKIAotCWlmICh3cnF1LT5lc3NpZC5sZW5ndGggPiBJV19FU1NJRF9NQVhfU0laRSl7CisJaWYgKHdycXUtPmVzc2lkLmxlbmd0aCA+IElXX0VTU0lEX01BWF9TSVpFKSB7CiAJCXJldD0gLUUyQklHOwogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoaWVlZS0+aXdfbW9kZSA9PSBJV19NT0RFX01PTklUT1IpeworCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikgewogCQlyZXQ9IC0xOwogCQlnb3RvIG91dDsKIAl9CkBAIC00NjksOSArNDY5LDkgQEAKIAlwcmludGsoS0VSTl9JTkZPInJhdyBUWCBpcyAlc1xuIiwKIAkgICAgICBpZWVlLT5yYXdfdHggPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKIAotCWlmKGllZWUtPml3X21vZGUgPT0gSVdfTU9ERV9NT05JVE9SKQorCWlmIChpZWVlLT5pd19tb2RlID09IElXX01PREVfTU9OSVRPUikKIAl7Ci0JCWlmKHByZXYgPT0gMCAmJiBpZWVlLT5yYXdfdHgpeworCQlpZiAocHJldiA9PSAwICYmIGllZWUtPnJhd190eCkgewogCQkJaWYgKGllZWUtPmRhdGFfaGFyZF9yZXN1bWUpCiAJCQkJaWVlZS0+ZGF0YV9oYXJkX3Jlc3VtZShpZWVlLT5kZXYpOwogCkBAIC01MjIsNyArNTIyLDcgQEAKIAlpbnQgcmV0ID0gMDsKIAlkb3duKCZpZWVlLT53eF9zZW0pOwogCi0JaWYgKHdycXUtPnBvd2VyLmRpc2FibGVkKXsKKwlpZiAod3JxdS0+cG93ZXIuZGlzYWJsZWQpIHsKIAkJaWVlZS0+cHMgPSBJRUVFODAyMTFfUFNfRElTQUJMRUQ7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC01NzIsNyArNTcyLDcgQEAKIHsKIAlkb3duKCZpZWVlLT53eF9zZW0pOwogCi0JaWYoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEKXsKKwlpZiAoaWVlZS0+cHMgPT0gSUVFRTgwMjExX1BTX0RJU0FCTEVEKSB7CiAJCXdycXUtPnBvd2VyLmRpc2FibGVkID0gMTsKIAkJZ290byBleGl0OwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL2llZWU4MDIxMV90eC5jCmluZGV4IGZjYTczYzcuLjlmNjhjNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvaWVlZTgwMjExX3R4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9pZWVlODAyMTFfdHguYwpAQCAtMzIsNyArMzIsNiBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLS8vI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvaW42Lmg+CkBAIC01NTQsMTYgKzU1MywxNiBAQAogI2lmZGVmIFRPX0RPX0xJU1QKIAlpZighSXNEYXRhRnJhbWUocEZyYW1lKSkKIAl7Ci0JCXBUY2ItPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSBUUlVFOwotCQlwVGNiLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSBUUlVFOworCQlwVGNiLT5iVHhEaXNhYmxlUmF0ZUZhbGxCYWNrID0gdHJ1ZTsKKwkJcFRjYi0+YlR4VXNlRHJpdmVyQXNzaW5nZWRSYXRlID0gdHJ1ZTsKIAkJcFRjYi0+UkFUUkluZGV4ID0gNzsKIAkJcmV0dXJuOwogCX0KIAogCWlmKHBNZ250SW5mby0+Rm9yY2VkRGF0YVJhdGUhPSAwKQogCXsKLQkJcFRjYi0+YlR4RGlzYWJsZVJhdGVGYWxsQmFjayA9IFRSVUU7Ci0JCXBUY2ItPmJUeFVzZURyaXZlckFzc2luZ2VkUmF0ZSA9IFRSVUU7CisJCXBUY2ItPmJUeERpc2FibGVSYXRlRmFsbEJhY2sgPSB0cnVlOworCQlwVGNiLT5iVHhVc2VEcml2ZXJBc3NpbmdlZFJhdGUgPSB0cnVlOwogCQlyZXR1cm47CiAJfQogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfQkFQcm9jLmMKaW5kZXggMWI0NjIzYy4uNjE4ZDJjYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0JBUHJvYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9CQVByb2MuYwpAQCAtNDYsMTQgKzQ2LDE0IEBACiAJdTgJCQliU2VuZERFTEJBID0gZmFsc2U7CiAKIAkvLyBEZWxldGUgcGVuZGluZyBCQQotCWlmKHBQZW5kaW5nQmEtPmJWYWxpZCkKKwlpZiAocFBlbmRpbmdCYS0+YlZhbGlkKQogCXsKIAkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcFBlbmRpbmdCYSk7CiAJCWJTZW5kREVMQkEgPSB0cnVlOwogCX0KIAogCS8vIERlbGV0ZSBhZG1pdHRlZCBCQQotCWlmKHBBZG1pdHRlZEJhLT5iVmFsaWQpCisJaWYgKHBBZG1pdHRlZEJhLT5iVmFsaWQpCiAJewogCQlEZUFjdGl2YXRlQkFFbnRyeShpZWVlLCBwQWRtaXR0ZWRCYSk7CiAJCWJTZW5kREVMQkEgPSB0cnVlOwpAQCAtNzQsNyArNzQsNyBAQAogCVBCQV9SRUNPUkQJCXBCYSA9ICZwUnhUcy0+UnhBZG1pdHRlZEJBUmVjb3JkOwogCXU4CQkJYlNlbmRERUxCQSA9IGZhbHNlOwogCi0JaWYocEJhLT5iVmFsaWQpCisJaWYgKHBCYS0+YlZhbGlkKQogCXsKIAkJRGVBY3RpdmF0ZUJBRW50cnkoaWVlZSwgcEJhKTsKIAkJYlNlbmRERUxCQSA9IHRydWU7CkBAIC0zNjMsNyArMzYzLDcgQEAKIAogCXByaW50aygiPT09PT09PT09PT09PT09PT09PT0+cnggQUREQkFSRVEgZnJvbSA6JXBNXG4iLCBkc3QpOwogLy9zb21lIG90aGVyIGNhcGFiaWxpdHkgaXMgbm90IHJlYWR5IG5vdy4KLQlpZigJKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCkgfHwKKwlpZiAoKGllZWUtPmN1cnJlbnRfbmV0d29yay5xb3NfZGF0YS5hY3RpdmUgPT0gMCkgfHwKIAkJKGllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlKSkgLy98fAogCS8vCShpZWVlLT5wU3RhUW9zLT5iRW5hYmxlUnhJbW1CQSA9PSBmYWxzZSkJKQogCXsKQEAgLTM3Myw3ICszNzMsNyBAQAogCX0KIAkvLyBTZWFyY2ggZm9yIHJlbGF0ZWQgdHJhZmZpYyBzdHJlYW0uCiAJLy8gSWYgdGhlcmUgaXMgbm8gbWF0Y2hlZCBUUywgcmVqZWN0IHRoZSBBRERCQSByZXF1ZXN0LgotCWlmKAkhR2V0VHMoCisJaWYgKCFHZXRUcygKIAkJCWllZWUsCiAJCQkoUFRTX0NPTU1PTl9JTkZPICopKCZwVFMpLAogCQkJZHN0LApAQCAtMzkwLDcgKzM5MCw3IEBACiAJLy8gV2UgY2FuIGRvIG11Y2ggbW9yZSBjaGVjayBoZXJlLCBpbmNsdWRpbmcgQnVmZmVyU2l6ZSwgQU1TRFVfU3VwcG9ydCwgUG9saWN5LCBTdGFydFNlcUN0cmwuLi4KIAkvLyBJIHdhbnQgdG8gY2hlY2sgU3RhcnRTZXFDdHJsIHRvIG1ha2Ugc3VyZSB3aGVuIHdlIHN0YXJ0IGFnZ3JlZ2F0aW9uISEhCiAJLy8KLQlpZihwQmFQYXJhbVNldC0+ZmllbGQuQkFQb2xpY3kgPT0gQkFfUE9MSUNZX0RFTEFZRUQpCisJaWYgKHBCYVBhcmFtU2V0LT5maWVsZC5CQVBvbGljeSA9PSBCQV9QT0xJQ1lfREVMQVlFRCkKIAl7CiAJCXJjID0gQUREQkFfU1RBVFVTX0lOVkFMSURfUEFSQU07CiAJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAiQkEgUG9saWN5IGlzIG5vdCBjb3JyZWN0IGluICVzKClcbiIsIF9fZnVuY19fKTsKQEAgLTUyMiw3ICs1MjIsNyBAQAogCQkvLyBXZSBjYW4gY29tcGFyZSB0aGUgdmFsdWUgb2YgQkEgcGFyYW1ldGVyIHNldCB0aGF0IFBlZXIgcmV0dXJuZWQgYW5kIFNlbGYgc2VudC4KIAkJLy8gSWYgaXQgaXMgT0ssIHRoZW4gYWRtaXR0ZWQuIE9yIHdlIGNhbiBzZW5kIERFTEJBIHRvIGNhbmNlbCBCQSBtZWNoYW5pc20uCiAJCS8vCi0JCWlmKHBCYVBhcmFtU2V0LT5maWVsZC5CQVBvbGljeSA9PSBCQV9QT0xJQ1lfREVMQVlFRCkKKwkJaWYgKHBCYVBhcmFtU2V0LT5maWVsZC5CQVBvbGljeSA9PSBCQV9QT0xJQ1lfREVMQVlFRCkKIAkJewogCQkJLy8gU2luY2UgdGhpcyBpcyBhIGtpbmQgb2YgQUREQkEgZmFpbGVkLCB3ZSBkZWxheSBuZXh0IEFEREJBIHByb2Nlc3MuCiAJCQlwVFMtPmJBZGRCYVJlcURlbGF5ZWQgPSB0cnVlOwpAQCAtNTgyLDcgKzU4Miw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlpZihpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlID09IDAgfHwKKwlpZiAoaWVlZS0+Y3VycmVudF9uZXR3b3JrLnFvc19kYXRhLmFjdGl2ZSA9PSAwIHx8CiAJCWllZWUtPnBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0ID09IGZhbHNlICkKIAl7CiAJCUlFRUU4MDIxMV9ERUJVRyhJRUVFODAyMTFfRExfRVJSLCAicmVjZWl2ZWQgREVMQkEgd2hpbGUgUU9TIG9yIEhUIGlzIG5vdCBzdXBwb3J0ZWQoJWQsICVkKVxuIixpZWVlLT5jdXJyZW50X25ldHdvcmsucW9zX2RhdGEuYWN0aXZlLCBpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCk7CkBAIC02MDAsNyArNjAwLDcgQEAKIAl7CiAJCVBSWF9UU19SRUNPUkQJcFJ4VHM7CiAKLQkJaWYoICFHZXRUcygKKwkJaWYgKCFHZXRUcygKIAkJCQlpZWVlLAogCQkJCShQVFNfQ09NTU9OX0lORk8gKikmcFJ4VHMsCiAJCQkJZHN0LApAQCAtNjE4LDcgKzYxOCw3IEBACiAJewogCQlQVFhfVFNfUkVDT1JECXBUeFRzOwogCi0JCWlmKCFHZXRUcygKKwkJaWYgKCFHZXRUcygKIAkJCWllZWUsCiAJCQkoUFRTX0NPTU1PTl9JTkZPICopJnBUeFRzLAogCQkJZHN0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X0hUUHJvYy5jCmluZGV4IGU2MGQ5MjYuLmMyNTg4ZjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9IVFByb2MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfSFRQcm9jLmMKQEAgLTQ3MSwxMiArNDcxLDEwIEBACiBzdGF0aWMgYm9vbCBIVElPVEFjdElzRGlzYWJsZU1DU1R3b1NwYXRpYWxTdHJlYW0oc3RydWN0IGllZWU4MDIxMV9kZXZpY2UgKmllZWUsCiAJCQkJCQkgdTggKlBlZXJNYWNBZGRyKQogewotCWJvb2wgcmV0VmFsdWUgPSBmYWxzZTsKLQogI2lmZGVmIFRPRE8KIAkvLyBBcHBseSBmb3IgODE5dSBvbmx5CiAjZW5kaWYKLQlyZXR1cm4gcmV0VmFsdWU7CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTQ4OCwxMSArNDg2LDggQEAKICAgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHN0YXRpYyB1OCBIVElPVEFjdElzRGlzYWJsZUVEQ0FUdXJibyhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwKIAkJCQkgICAgIHU4ICpQZWVyTWFjQWRkcikKLXsKLQl1OAlyZXRWYWx1ZSA9IGZhbHNlOwkvLyBkZWZhdWx0IGVuYWJsZSBFRENBIFR1cmJvIG1vZGUuCi0JLy8gU2V0IHNwZWNpZmljIEVEQ0EgcGFyYW1ldGVyIGZvciBkaWZmZXJlbnQgQVAgaW4gRE0gaGFuZGxlci4KLQotCXJldHVybiByZXRWYWx1ZTsKK3sJLyogZGVmYXVsdCBlbmFibGUgRURDQSBUdXJibyBtb2RlLiAqLworCXJldHVybiBmYWxzZTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC01MDgsNyArNTAzLDcgQEAKIAkvLyAyMDA4LzAxLzI1IE1IIEp1ZGVnIGlmIHdlIG5lZWQgdG8gdXNlIE9GRE0gdG8gc25lZCBNR05UIGZyYW1lIGZvciBicm9hZGNvbSBBUC4KIAkvLyAyMDA4LzAxLzI4IE1IIFdlIG11c3QgcHJldmVudCB0aGF0IHdlIHNlbGVjdCBudWxsIGJzc2lkIHRvIGxpbmsuCiAKLQlpZihuZXR3b3JrLT5icm9hZGNvbV9jYXBfZXhpc3QpCisJaWYgKG5ldHdvcmstPmJyb2FkY29tX2NhcF9leGlzdCkKIAl7CiAJCXJldFZhbHVlID0gMTsKIAl9CkBAIC02MjUsNyArNjIwLDcgQEAKIAogCS8vIDIwMDguMDYuMTIKIAkvLyBGb3IgUlRMODE5WCwgaWYgcGFpcndpc2VrZXkgPSB3ZXAvdGtpcCwgYXAgaXMgcmFsaW5rLCB3ZSBzdXBwb3J0IG9ubHkgTUNTMH43LgotCWlmKGllZWUtPkdldEhhbGZObW9kZVN1cHBvcnRCeUFQc0hhbmRsZXIoaWVlZS0+ZGV2KSkKKwlpZiAoaWVlZS0+R2V0SGFsZk5tb2RlU3VwcG9ydEJ5QVBzSGFuZGxlcihpZWVlLT5kZXYpKQogCXsKIAkJaW50IGk7CiAJCWZvcihpID0gMTsgaTwgMTY7IGkrKykKQEAgLTc1Miw3ICs3NDcsNyBAQAogCSpwb3NSVDJSVEFnZysrID0gMHgwMTsKIAkqcG9zUlQyUlRBZ2cgPSAweDEwOy8vKnBvc1JUMlJUQWdnID0gMHgwMjsKIAotCWlmKGllZWUtPmJTdXBwb3J0UmVtb3RlV2FrZVVwKSB7CisJaWYgKGllZWUtPmJTdXBwb3J0UmVtb3RlV2FrZVVwKSB7CiAJCSpwb3NSVDJSVEFnZyB8PSAweDA4Oy8vUlRfSFRfQ0FQX1VTRV9XT1c7CiAJfQogCkBAIC04NzksMTcgKzg3NCwxNyBAQAogCiAJZm9yKGkgPSAwOyBpIDwgMTY7IGkrKykKIAl7Ci0JCWlmKGF2YWlsYWJsZU1jc1JhdGVbaV0gIT0gMCkKKwkJaWYgKGF2YWlsYWJsZU1jc1JhdGVbaV0gIT0gMCkKIAkJewogCQkJYml0TWFwID0gYXZhaWxhYmxlTWNzUmF0ZVtpXTsKIAkJCWZvcihqID0gMDsgaiA8IDg7IGorKykKIAkJCXsKLQkJCQlpZigoYml0TWFwJTIpICE9IDApCisJCQkJaWYgKChiaXRNYXAlMikgIT0gMCkKIAkJCQl7CiAJCQkJCWlmKEhUTWNzVG9EYXRhUmF0ZShpZWVlLCAoOCppK2opKSA+IEhUTWNzVG9EYXRhUmF0ZShpZWVlLCBtY3NSYXRlKSkKIAkJCQkJCW1jc1JhdGUgPSAoOCppK2opOwogCQkJCX0KLQkJCQliaXRNYXAgPSBiaXRNYXA+PjE7CisJCQkJYml0TWFwID4+PSAxOwogCQkJfQogCQl9CiAJfQpAQCAtMTA2Nyw3ICsxMDYyLDcgQEAKIAogCS8vIExhbmhzaW46IG1hcmsgZm9yIHRtcCB0byBhdm9pZCBkZWF1dGggYnkgYXAgZnJvbSAgczMKIAkvL2lmKG1lbWNtcChwTWdudEluZm8tPkJzc2lkLCBORVRHRUFSODM0QnYyX0JST0FEQ09NLCAzKT09MCkKLQlpZigwKQorCWlmICgwKQogCQl7CiAKIAkJCXBIVEluZm8tPmJDdXJyZW50QU1QRFVFbmFibGUgPSBmYWxzZTsKQEAgLTEzMDMsNyArMTI5OCw3IEBACiAvLwlQSFRfQ0FQQUJJTElUWV9FTEUJCXBQZWVySFRDYXAgPSAoUEhUX0NBUEFCSUxJVFlfRUxFKXBOZXR3b3JrLT5ic3NodC5iZEhUQ2FwQnVmOwogCVBIVF9JTkZPUk1BVElPTl9FTEUJCXBQZWVySFRJbmZvID0gKFBIVF9JTkZPUk1BVElPTl9FTEUpcE5ldHdvcmstPmJzc2h0LmJkSFRJbmZvQnVmOwogCi0JaWYocEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpCisJaWYgKHBIVEluZm8tPmJDdXJyZW50SFRTdXBwb3J0KQogCXsKIAkJLy8KIAkJLy8gQ29uZmlnIGN1cnJlbnQgb3BlcmF0aW9uIG1vZGUuCkBAIC0xMzI4LDcgKzEzMjMsNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB1OCBIVENDaGVjayhzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSwgdTggKnBGcmFtZSkKIHsKLQlpZihpZWVlLT5wSFRJbmZvLT5iQ3VycmVudEhUU3VwcG9ydCkKKwlpZiAoaWVlZS0+cEhUSW5mby0+YkN1cnJlbnRIVFN1cHBvcnQpCiAJewogCQlpZiAoKElzUW9TRGF0YUZyYW1lKHBGcmFtZSkgJiYgRnJhbWVfT3JkZXIocEZyYW1lKSkgPT0gMSkgewogCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9IVCwgIkhUIENPTlRST0wgRklMRUQgRVhJU1QhIVxuIik7CkBAIC0xMzU3LDcgKzEzNTIsNyBAQAogLy8JCXJldHVybjsKIAogLy8Jc3Bpbl9sb2NrX2lycXNhdmUoJihpZWVlLT5id19zcGlubG9jayksIGZsYWdzKTsKLQlpZihwSFRJbmZvLT5iU3dCd0luUHJvZ3Jlc3MpIHsKKwlpZiAocEhUSW5mby0+YlN3QndJblByb2dyZXNzKSB7CiAvLwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGllZWUtPmJ3X3NwaW5sb2NrKSwgZmxhZ3MpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFMuaAppbmRleCA3ZWQ3MjQzLi44NzM5NjljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFMuaApAQCAtMSwxNCArMSwxNCBAQAogI2lmbmRlZiBfVFNUWVBFX0hfCiAjZGVmaW5lIF9UU1RZUEVfSF8KICNpbmNsdWRlICJydGw4MTl4X1Fvcy5oIgotI2RlZmluZSBUU19TRVRVUF9USU1FT1VUCTYwICAvLyBJbiBtaWxsaXNlY29uZAorI2RlZmluZSBUU19TRVRVUF9USU1FT1VUCTYwICAvKiAgSW4gbWlsbGlzZWNvbmQgKi8KICNkZWZpbmUgVFNfSU5BQ1RfVElNRU9VVAk2MAogI2RlZmluZSBUU19BRERCQV9ERUxBWQkJNjAKIAogI2RlZmluZSBUT1RBTF9UU19OVU0JCTE2CiAjZGVmaW5lIFRDTEFTX05VTQkJNAogCi0vLyBUaGlzIGRlZmluZSB0aGUgVHgvUnggZGlyZWN0aW9ucworLyogIFRoaXMgZGVmaW5lIHRoZSBUeC9SeCBkaXJlY3Rpb25zICovCiB0eXBlZGVmIGVudW0gX1RSX1NFTEVDVCB7CiAJVFhfRElSID0gMCwKIAlSWF9ESVIgPSAxLApAQCAtMjgsOSArMjgsOSBAQAogdHlwZWRlZiBzdHJ1Y3QgX1RYX1RTX1JFQ09SRHsKIAlUU19DT01NT05fSU5GTwkJVHNDb21tb25JbmZvOwogCXUxNgkJCQlUeEN1clNlcTsKLQlCQV9SRUNPUkQJCQlUeFBlbmRpbmdCQVJlY29yZDsJLy8gRm9yIEJBIE9yaWdpbmF0b3IKLQlCQV9SRUNPUkQJCQlUeEFkbWl0dGVkQkFSZWNvcmQ7CS8vIEZvciBCQSBPcmlnaW5hdG9yCi0vLwlRT1NfRExfUkVDT1JECQlETFJlY29yZDsKKwlCQV9SRUNPUkQJCQlUeFBlbmRpbmdCQVJlY29yZDsJLyogIEZvciBCQSBPcmlnaW5hdG9yICovCisJQkFfUkVDT1JECQkJVHhBZG1pdHRlZEJBUmVjb3JkOwkvKiAgRm9yIEJBIE9yaWdpbmF0b3IgKi8KKy8qIAlRT1NfRExfUkVDT1JECQlETFJlY29yZDsgKi8KIAl1OAkJCQliQWRkQmFSZXFJblByb2dyZXNzOwogCXU4CQkJCWJBZGRCYVJlcURlbGF5ZWQ7CiAJdTgJCQkJYlVzaW5nQmE7CkBAIC00NCwxMSArNDQsMTEgQEAKIAl1MTYJCQkJUnhUaW1lb3V0SW5kaWNhdGVTZXE7CiAJc3RydWN0IGxpc3RfaGVhZAkJUnhQZW5kaW5nUGt0TGlzdDsKIAlzdHJ1Y3QgdGltZXJfbGlzdAkJUnhQa3RQZW5kaW5nVGltZXI7Ci0JQkFfUkVDT1JECQkJUnhBZG1pdHRlZEJBUmVjb3JkOwkgLy8gRm9yIEJBIFJlY2lwaWVudAorCUJBX1JFQ09SRAkJCVJ4QWRtaXR0ZWRCQVJlY29yZDsJIC8qICBGb3IgQkEgUmVjaXBpZW50ICovCiAJdTE2CQkJCVJ4TGFzdFNlcU51bTsKIAl1OAkJCQlSeExhc3RGcmFnTnVtOwogCXU4CQkJCW51bTsKLS8vCVFPU19ETF9SRUNPUkQJCURMUmVjb3JkOworLyogCVFPU19ETF9SRUNPUkQJCURMUmVjb3JkOyAqLwogfSBSWF9UU19SRUNPUkQsICpQUlhfVFNfUkVDT1JEOwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9pZWVlODAyMTEvcnRsODE5eF9UU1Byb2MuYwppbmRleCBhY2FhNzIzLi5lYTkyZmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvaWVlZTgwMjExL3J0bDgxOXhfVFNQcm9jLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L2llZWU4MDIxMS9ydGw4MTl4X1RTUHJvYy5jCkBAIC0xNTYsMjYgKzE1NiwxNiBAQAogCQlwVHhUUy0+bnVtID0gY291bnQ7CiAJCS8vIFRoZSB0aW1lcnMgZm9yIHRoZSBvcGVyYXRpb24gb2YgVHJhZmZpYyBTdHJlYW0gYW5kIEJsb2NrIEFjay4KIAkJLy8gRExTIHJlbGF0ZWQgdGltZXIgd2lsbCBiZSBhZGQgaGVyZSBpbiB0aGUgZnV0dXJlISEKLQkJaW5pdF90aW1lcigmcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyKTsKLQkJcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKLQkJcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLmZ1bmN0aW9uID0gVHNTZXR1cFRpbWVPdXQ7Ci0KLQkJaW5pdF90aW1lcigmcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyKTsKLQkJcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKLQkJcFR4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLmZ1bmN0aW9uID0gVHNJbmFjdFRpbWVvdXQ7Ci0KLQkJaW5pdF90aW1lcigmcFR4VFMtPlRzQWRkQmFUaW1lcik7Ci0JCXBUeFRTLT5Uc0FkZEJhVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBUeFRTOwotCQlwVHhUUy0+VHNBZGRCYVRpbWVyLmZ1bmN0aW9uID0gVHNBZGRCYVByb2Nlc3M7Ci0KLQkJaW5pdF90aW1lcigmcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyKTsKLQkJcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwVHhUUzsKLQkJcFR4VFMtPlR4UGVuZGluZ0JBUmVjb3JkLlRpbWVyLmZ1bmN0aW9uID0gQmFTZXR1cFRpbWVPdXQ7Ci0KLQkJaW5pdF90aW1lcigmcFR4VFMtPlR4QWRtaXR0ZWRCQVJlY29yZC5UaW1lcik7Ci0JCXBUeFRTLT5UeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBUeFRTOwotCQlwVHhUUy0+VHhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyLmZ1bmN0aW9uID0gVHhCYUluYWN0VGltZW91dDsKLQorCQlzZXR1cF90aW1lcigmcFR4VFMtPlRzQ29tbW9uSW5mby5TZXR1cFRpbWVyLCBUc1NldHVwVGltZU91dCwKKwkJCSAgICAodW5zaWduZWQgbG9uZylwVHhUUyk7CisJCXNldHVwX3RpbWVyKCZwVHhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIsIFRzSW5hY3RUaW1lb3V0LAorCQkJICAgICh1bnNpZ25lZCBsb25nKXBUeFRTKTsKKwkJc2V0dXBfdGltZXIoJnBUeFRTLT5Uc0FkZEJhVGltZXIsIFRzQWRkQmFQcm9jZXNzLAorCQkJICAgICh1bnNpZ25lZCBsb25nKXBUeFRTKTsKKwkJc2V0dXBfdGltZXIoJnBUeFRTLT5UeFBlbmRpbmdCQVJlY29yZC5UaW1lciwgQmFTZXR1cFRpbWVPdXQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpcFR4VFMpOworCQlzZXR1cF90aW1lcigmcFR4VFMtPlR4QWRtaXR0ZWRCQVJlY29yZC5UaW1lciwKKwkJCSAgICBUeEJhSW5hY3RUaW1lb3V0LCAodW5zaWduZWQgbG9uZylwVHhUUyk7CiAJCVJlc2V0VHhUc0VudHJ5KHBUeFRTKTsKIAkJbGlzdF9hZGRfdGFpbCgmcFR4VFMtPlRzQ29tbW9uSW5mby5MaXN0LCAmaWVlZS0+VHhfVFNfVW51c2VkX0xpc3QpOwogCQlwVHhUUysrOwpAQCAtMTg5LDIzICsxNzksMTQgQEAKIAl7CiAJCXBSeFRTLT5udW0gPSBjb3VudDsKIAkJSU5JVF9MSVNUX0hFQUQoJnBSeFRTLT5SeFBlbmRpbmdQa3RMaXN0KTsKLQotCQlpbml0X3RpbWVyKCZwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIpOwotCQlwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBSeFRTOwotCQlwUnhUUy0+VHNDb21tb25JbmZvLlNldHVwVGltZXIuZnVuY3Rpb24gPSBUc1NldHVwVGltZU91dDsKLQotCQlpbml0X3RpbWVyKCZwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIpOwotCQlwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXBSeFRTOwotCQlwUnhUUy0+VHNDb21tb25JbmZvLkluYWN0VGltZXIuZnVuY3Rpb24gPSBUc0luYWN0VGltZW91dDsKLQotCQlpbml0X3RpbWVyKCZwUnhUUy0+UnhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyKTsKLQkJcFJ4VFMtPlJ4QWRtaXR0ZWRCQVJlY29yZC5UaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFJ4VFM7Ci0JCXBSeFRTLT5SeEFkbWl0dGVkQkFSZWNvcmQuVGltZXIuZnVuY3Rpb24gPSBSeEJhSW5hY3RUaW1lb3V0OwotCi0JCWluaXRfdGltZXIoJnBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lcik7Ci0JCXBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcFJ4VFM7Ci0JCXBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lci5mdW5jdGlvbiA9IFJ4UGt0UGVuZGluZ1RpbWVvdXQ7Ci0KKwkJc2V0dXBfdGltZXIoJnBSeFRTLT5Uc0NvbW1vbkluZm8uU2V0dXBUaW1lciwgVHNTZXR1cFRpbWVPdXQsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpcFJ4VFMpOworCQlzZXR1cF90aW1lcigmcFJ4VFMtPlRzQ29tbW9uSW5mby5JbmFjdFRpbWVyLCBUc0luYWN0VGltZW91dCwKKwkJCSAgICAodW5zaWduZWQgbG9uZylwUnhUUyk7CisJCXNldHVwX3RpbWVyKCZwUnhUUy0+UnhBZG1pdHRlZEJBUmVjb3JkLlRpbWVyLAorCQkJICAgIFJ4QmFJbmFjdFRpbWVvdXQsICh1bnNpZ25lZCBsb25nKXBSeFRTKTsKKwkJc2V0dXBfdGltZXIoJnBSeFRTLT5SeFBrdFBlbmRpbmdUaW1lciwgUnhQa3RQZW5kaW5nVGltZW91dCwKKwkJCSAgICAodW5zaWduZWQgbG9uZylwUnhUUyk7CiAJCVJlc2V0UnhUc0VudHJ5KHBSeFRTKTsKIAkJbGlzdF9hZGRfdGFpbCgmcFJ4VFMtPlRzQ29tbW9uSW5mby5MaXN0LCAmaWVlZS0+UnhfVFNfVW51c2VkX0xpc3QpOwogCQlwUnhUUysrOwpAQCAtMjg4LDcgKzI2OSw3IEBACiAJLy9mb3IoZGlyID0gRElSX1VQOyBkaXIgPD0gRElSX0JJX0RJUjsgZGlyKyspCiAJZm9yKGRpciA9IDA7IGRpciA8PSBESVJfQklfRElSOyBkaXIrKykKIAl7Ci0JCWlmKHNlYXJjaF9kaXJbZGlyXSA9PWZhbHNlICkKKwkJaWYgKCFzZWFyY2hfZGlyW2Rpcl0pCiAJCQljb250aW51ZTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShwUmV0LCBwc2VhcmNoX2xpc3QsIExpc3QpewogCS8vCQlJRUVFODAyMTFfREVCVUcoSUVFRTgwMjExX0RMX1RTLCAiQUREOiVwTSwgVElEOiVkLCBkaXI6JWRcbiIsIHBSZXQtPkFkZHIsIHBSZXQtPlRTcGVjLmYuVFNJbmZvLmZpZWxkLnVjVFNJRCwgcFJldC0+VFNwZWMuZi5UU0luZm8uZmllbGQudWNEaXJlY3Rpb24pOwpAQCAtNDAwLDggKzM4MSw3IEBACiAJfQogCWVsc2UKIAl7Ci0JCWlmKGJBZGROZXdUcyA9PSBmYWxzZSkKLQkJeworCQlpZiAoIWJBZGROZXdUcykgewogCQkJSUVFRTgwMjExX0RFQlVHKElFRUU4MDIxMV9ETF9UUywgImFkZCBuZXcgVFMgZmFpbGVkKHRpZDolZClcbiIsIFVQKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MF9ydGw4MjU2LmMKaW5kZXggMTg2ODM1Mi4uZTAwMDMyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTBfcnRsODI1Ni5jCkBAIC0yMjUsNyArMjI1LDcgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJVHhBR0MgPSBwb3dlcmxldmVsOwogCi0JaWYgKHByaXYtPmJEeW5hbWljVHhMb3dQb3dlciA9PSBUUlVFKSB7CisJaWYgKHByaXYtPmJEeW5hbWljVHhMb3dQb3dlcikgewogCQlpZiAocHJpdi0+Q3VzdG9tZXJJRCA9PSBSVF9DSURfODE5eF9OZXRjb3JlKQogCQkJVHhBR0MgPSAweDIyOwogCQllbHNlCkBAIC0yNzUsNyArMjc1LDcgQEAKIAkJCXByaXYtPlB3cl9UcmFjayA9IHdyaXRlVmFsX3RtcDsKIAkJfQogCi0JCWlmIChwcml2LT5iRHluYW1pY1R4SGlnaFBvd2VyID09IFRSVUUpIHsKKwkJaWYgKHByaXYtPmJEeW5hbWljVHhIaWdoUG93ZXIpIHsKIAkJCS8qQWRkIGJ5IEphY2tlbiAyMDA4LzAzLzA2CiAJCQkgKkVtaWx5LCAyMDA4MDYxMy4gU2V0IGxvdyB0eCBwb3dlciBmb3IgYm90aCBNQ1MgYW5kIGxlZ2FjeSBPRkRNCiAJCQkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MF9ydGw4MjU2LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTBfcnRsODI1Ni5oCmluZGV4IGZhNmRkMzcuLjZlNTY2MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MF9ydGw4MjU2LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkwX3J0bDgyNTYuaApAQCAtMTMsOCArMTMsOSBAQAogI2lmbmRlZiBSVEw4MjI1SAogI2RlZmluZSBSVEw4MjI1SAogCi0jZGVmaW5lIFJUTDgxOVhfVE9UQUxfUkZfUEFUSCAyIC8vZm9yIDgxOTJVCi1leHRlcm4gdm9pZCBQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgLCBIVF9DSEFOTkVMX1dJRFRIIEJhbmR3aWR0aCk7CisjZGVmaW5lIFJUTDgxOVhfVE9UQUxfUkZfUEFUSCAyIC8qIGZvciA4MTkyVSAqLworZXh0ZXJuIHZvaWQgUEhZX1NldFJGODI1NkJhbmR3aWR0aChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgIEhUX0NIQU5ORUxfV0lEVEggQmFuZHdpZHRoKTsKIGV4dGVybiB2b2lkIFBIWV9SRjgyNTZfQ29uZmlnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIHZvaWQgcGh5X1JGODI1Nl9Db25maWdfUGFyYUZpbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBleHRlcm4gdm9pZCBQSFlfU2V0UkY4MjU2Q0NLVHhQb3dlcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OAlwb3dlcmxldmVsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlUuaAppbmRleCBjOWQ4YzEwLi42YzJlNDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVS5oCkBAIC00MCw4ICs0MCw2IEBACiAjZGVmaW5lIFJUTDgxOTJVCiAjZGVmaW5lIFJUTDgxOXhVX01PRFVMRV9OQU1FICJydGw4MTl4VSIKIC8qIEhXIHNlY3VyaXR5ICovCi0jZGVmaW5lIEZBTFNFIDAKLSNkZWZpbmUgVFJVRSAxCiAjZGVmaW5lIE1BWF9LRVlfTEVOICAgICA2MQogI2RlZmluZSBLRVlfQlVGX1NJWkUgICAgNQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2NvcmUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCmluZGV4IGUwMzFhMjUuLmE0Nzk1YWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfY29yZS5jCkBAIC00MDgsOSArNDA4LDggQEAKIH0KIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpydGw4MTkyX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdm9pZCBydGw4MTkyX2NvbW1pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgcnRsODE5Ml9yZXN0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci12b2lkIHdhdGNoX2RvZ190aW1lcl9jYWxsYmFjayh1bnNpZ25lZCBsb25nIGRhdGEpOworc3RhdGljIHZvaWQgcnRsODE5Ml9yZXN0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBkYXRhKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1QUk9DRlMgU1RVRkYtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04MjcsNyArODI2LDYgQEAKIAkJbmV0ZGV2X3dhcm4oZGV2LCAic2tiX3F1ZXVlIG5vdCBlbXB0eVxuIik7CiAKIAlza2JfcXVldWVfcHVyZ2UoJnByaXYtPnNrYl9xdWV1ZSk7Ci0JcmV0dXJuOwogfQogCiBpbmxpbmUgdTE2IGllZWVyYXRlMnJ0bHJhdGUoaW50IHJhdGUpCkBAIC05NjYsOCArOTY0LDYgQEAKIAlyZXQgPSBydGw4MTkyX3R4KGRldiwgc2tiKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnR4X2xvY2ssIGZsYWdzKTsKLQotCXJldHVybjsKIH0KIAogLyogVGhpcyBpcyBhIHJvdWdoIGF0dGVtcHQgdG8gVFggYSBmcmFtZQpAQCAtMTc2Niw3ICsxNzYyLDcgQEAKIH0KICNlbmRpZgogCi1leHRlcm4gdm9pZCBydGw4MTkyX3VwZGF0ZV9yYXRyX3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RhdGljIHZvaWQgcnRsODE5Ml91cGRhdGVfcmF0cl90YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0YXRpYyB2b2lkIHJ0bDgxOTJfbGlua19jaGFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CkBAIC0xOTcxLDcgKzE5NjcsNyBAQAogfQogCiAKLXZvaWQgcnRsODE5Ml91cGRhdGVfcmF0cl90YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgcnRsODE5Ml91cGRhdGVfcmF0cl90YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2RldmljZSAqaWVlZSA9IHByaXYtPmllZWU4MDIxMTsKQEAgLTIwNjcsNyArMjA2Myw2IEBACiAJCW1lbWNweShpZWVlLT5SZWdkb3QxMUhUT3BlcmF0aW9uYWxSYXRlU2V0LCBpZWVlLT5SZWdIVFN1cHBSYXRlU2V0LCAxNik7CiAJZWxzZQogCQltZW1zZXQoaWVlZS0+UmVnZG90MTFIVE9wZXJhdGlvbmFsUmF0ZVNldCwgMCwgMTYpOwotCXJldHVybjsKIH0KIAogc3RhdGljIHU4IHJ0bDgxOTJfZ2V0U3VwcG9ydGVkV2lyZWxlZU1vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTIwNzgsMTAgKzIwNzMsMTAgQEAKIAljYXNlIFJGXzgyMjU6CiAJY2FzZSBSRl84MjU2OgogCWNhc2UgUkZfUFNFVURPXzExTjoKLQkJcmV0ID0gKFdJUkVMRVNTX01PREVfTl8yNEd8V0lSRUxFU1NfTU9ERV9HfFdJUkVMRVNTX01PREVfQik7CisJCXJldCA9IFdJUkVMRVNTX01PREVfTl8yNEd8V0lSRUxFU1NfTU9ERV9HfFdJUkVMRVNTX01PREVfQjsKIAkJYnJlYWs7CiAJY2FzZSBSRl84MjU4OgotCQlyZXQgPSAoV0lSRUxFU1NfTU9ERV9BfFdJUkVMRVNTX01PREVfTl81Ryk7CisJCXJldCA9IFdJUkVMRVNTX01PREVfQXxXSVJFTEVTU19NT0RFX05fNUc7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IFdJUkVMRVNTX01PREVfQjsKQEAgLTIxNDMsNyArMjEzOCw3IEBACiAJLy9mb3Igc2lsZW50IHJlc2V0CiAJcHJpdi0+SXJwUGVuZGluZ0NvdW50ID0gMTsKIAlwcml2LT5SZXNldFByb2dyZXNzID0gUkVTRVRfVFlQRV9OT1JFU0VUOwotCXByaXYtPmJGb3JjZWRTaWxlbnRSZXNldCA9IDA7CisJcHJpdi0+YkZvcmNlZFNpbGVudFJlc2V0ID0gZmFsc2U7CiAJcHJpdi0+YkRpc2FibGVOb3JtYWxSZXNldENoZWNrID0gZmFsc2U7CiAJcHJpdi0+Zm9yY2VfcmVzZXQgPSBmYWxzZTsKIApAQCAtMjI0Nyw5ICsyMjQyLDkgQEAKIAltdXRleF9pbml0KCZwcml2LT5tdXRleCk7CiB9CiAKLWV4dGVybiAgdm9pZCAgICBydGw4MTl4X3dhdGNoZG9nX3dxY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyB2b2lkIHJ0bDgxOXhfd2F0Y2hkb2dfd3FjYWxsYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCi12b2lkIHJ0bDgxOTJfaXJxX3J4X3Rhc2tsZXQoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOworc3RhdGljIHZvaWQgcnRsODE5Ml9pcnFfcnhfdGFza2xldChzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7CiAvL2luaXQgdGFza2xldCBhbmQgd2FpdF9xdWV1ZSBoZXJlLiBvbmx5IDIuNiBhYm92ZSBrZXJuZWwgaXMgY29uc2lkZXJlZAogI2RlZmluZSBEUlZfTkFNRSAid2xhbjAiCiBzdGF0aWMgdm9pZCBydGw4MTkyX2luaXRfcHJpdl90YXNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yMzEwLDExICsyMzA1LDExIEBACiAJfQogCiAJaWYgKGJMb2FkX0Zyb21fRUVQT00pIHsKLQkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9WSUQ+PjEpKTsKKwkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgRUVQUk9NX1ZJRD4+MSk7CiAJCXByaXYtPmVlcHJvbV92aWQgPSBlbmRpYW5fc3dhcCgmdG1wVmFsdWUpOwotCQlwcml2LT5lZXByb21fcGlkID0gZXByb21fcmVhZChkZXYsIChFRVBST01fUElEPj4xKSk7Ci0JCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsIChFRVBST01fQ2hhbm5lbFBsYW4+PjEpKTsKLQkJcHJpdi0+ZWVwcm9tX0NoYW5uZWxQbGFuID0gKCh0bXBWYWx1ZSYweGZmMDApPj44KTsKKwkJcHJpdi0+ZWVwcm9tX3BpZCA9IGVwcm9tX3JlYWQoZGV2LCBFRVBST01fUElEPj4xKTsKKwkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwgRUVQUk9NX0NoYW5uZWxQbGFuPj4xKTsKKwkJcHJpdi0+ZWVwcm9tX0NoYW5uZWxQbGFuID0gKHRtcFZhbHVlICYgMHhmZjAwKT4+ODsKIAkJcHJpdi0+YnR4cG93ZXJkYXRhX3JlYWRmcm9tRUVQT1JNID0gdHJ1ZTsKIAkJcHJpdi0+ZWVwcm9tX0N1c3RvbWVySUQgPSBlcHJvbV9yZWFkKGRldiwgKEVFUFJPTV9DdXN0b21lcl9JRD4+MSkpID4+ODsKIAl9IGVsc2UgewpAQCAtMjM5Nyw3ICsyMzkyLDggQEAKIAkJCX0KIAkJfSBlbHNlIGlmIChwcml2LT5FRVBST01fRGVmX1ZlciA9PSAxKSB7CiAJCQlpZiAoYkxvYWRfRnJvbV9FRVBPTSkgewotCQkJCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsIChFRVBST01fVHhQd0luZGV4X0NDS19WMT4+MSkpOworCQkJCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsCisJCQkJCQlFRVBST01fVHhQd0luZGV4X0NDS19WMSA+PiAxKTsKIAkJCQl0bXBWYWx1ZSA9ICh0bXBWYWx1ZSAmIDB4ZmYwMCkgPj4gODsKIAkJCX0gZWxzZSB7CiAJCQkJdG1wVmFsdWUgPSAweDEwOwpAQCAtMjQxMCw3ICsyNDA2LDggQEAKIAkJCQl0bXBWYWx1ZSA9IDB4MTAxMDsKIAkJCSooKHUxNiAqKSgmcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsQ0NLX1YxWzFdKSkgPSB0bXBWYWx1ZTsKIAkJCWlmIChiTG9hZF9Gcm9tX0VFUE9NKQotCQkJCXRtcFZhbHVlID0gZXByb21fcmVhZChkZXYsIChFRVBST01fVHhQd0luZGV4X09GRE1fMjRHX1YxPj4xKSk7CisJCQkJdG1wVmFsdWUgPSBlcHJvbV9yZWFkKGRldiwKKwkJCQkJRUVQUk9NX1R4UHdJbmRleF9PRkRNXzI0R19WMSA+PiAxKTsKIAkJCWVsc2UKIAkJCQl0bXBWYWx1ZSA9IDB4MTAxMDsKIAkJCSooKHUxNiAqKSgmcHJpdi0+RUVQUk9NVHhQb3dlckxldmVsT0ZETTI0R1swXSkpID0gdG1wVmFsdWU7CkBAIC0yNDUzLDcgKzI0NTAsNyBAQAogCQkvLyBBbnRlbm5hIEIgZ2FpbiBvZmZzZXQgdG8gYW50ZW5uYSBBLCBiaXQwfjMKIAkJcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzBdID0gKHByaXYtPkVFUFJPTVR4UG93ZXJEaWZmICYgMHhmKTsKIAkJLy8gQW50ZW5uYSBDIGdhaW4gb2Zmc2V0IHRvIGFudGVubmEgQSwgYml0NH43Ci0JCXByaXYtPkFudGVubmFUeFB3RGlmZlsxXSA9ICgocHJpdi0+RUVQUk9NVHhQb3dlckRpZmYgJiAweGYwKT4+NCk7CisJCXByaXYtPkFudGVubmFUeFB3RGlmZlsxXSA9IChwcml2LT5FRVBST01UeFBvd2VyRGlmZiAmIDB4ZjApPj40OwogCQkvLyBDcnlzdGFsQ2FwLCBiaXQxMn4xNQogCQlwcml2LT5DcnlzdGFsQ2FwID0gcHJpdi0+RUVQUk9NQ3J5c3RhbENhcDsKIAkJLy8gVGhlcm1hbE1ldGVyLCBiaXQwfjMgZm9yIFJGSUMxLCBiaXQ0fjcgZm9yIFJGSUMyCkBAIC0yNTA1LDcgKzI1MDIsNiBAQAogCS8vd2UgbmVlZCBpbml0IERJRyBSQVRSIHRhYmxlIGhlcmUgYWdhaW4uCiAKIAlSVF9UUkFDRShDT01QX0VQUk9NLCAiPD09PT09PT09PT09JXMoKVxuIiwgX19mdW5jX18pOwotCXJldHVybjsKIH0KIAogc3RhdGljIHNob3J0IHJ0bDgxOTJfZ2V0X2NoYW5uZWxfbWFwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yNTQ3LDkgKzI1NDMsOCBAQAogCXJ0bDgxOTJfcmVhZF9lZXByb21faW5mbyhkZXYpOwogCXJ0bDgxOTJfZ2V0X2NoYW5uZWxfbWFwKGRldik7CiAJaW5pdF9oYWxfZG0oZGV2KTsKLQlpbml0X3RpbWVyKCZwcml2LT53YXRjaF9kb2dfdGltZXIpOwotCXByaXYtPndhdGNoX2RvZ190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpZGV2OwotCXByaXYtPndhdGNoX2RvZ190aW1lci5mdW5jdGlvbiA9IHdhdGNoX2RvZ190aW1lcl9jYWxsYmFjazsKKwlzZXR1cF90aW1lcigmcHJpdi0+d2F0Y2hfZG9nX3RpbWVyLCB3YXRjaF9kb2dfdGltZXJfY2FsbGJhY2ssCisJCSAgICAodW5zaWduZWQgbG9uZylkZXYpOwogCWlmIChydGw4MTkyX3VzYl9pbml0ZW5kcG9pbnRzKGRldikgIT0gMCkgewogCQlETUVTRygiRW5kb3BvaW50cyBpbml0aWFsaXphdGlvbiBmYWlsZWQiKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0yNjg2LDcgKzI2ODEsNyBAQAogCiAJcmVhZF9uaWNfZHdvcmQoZGV2LCBDUFVfR0VOLCAmZHdSZWdSZWFkKTsKIAlpZiAocHJpdi0+TG9vcGJhY2tNb2RlID09IFJUTDgxOXhVX05PX0xPT1BCQUNLKQotCQlkd1JlZ1JlYWQgPSAoKGR3UmVnUmVhZCAmIENQVV9HRU5fTk9fTE9PUEJBQ0tfTVNLKSB8IENQVV9HRU5fTk9fTE9PUEJBQ0tfU0VUKTsKKwkJZHdSZWdSZWFkID0gKGR3UmVnUmVhZCAmIENQVV9HRU5fTk9fTE9PUEJBQ0tfTVNLKSB8IENQVV9HRU5fTk9fTE9PUEJBQ0tfU0VUOwogCWVsc2UgaWYgKHByaXYtPkxvb3BiYWNrTW9kZSA9PSBSVEw4MTl4VV9NQUNfTE9PUEJBQ0spCiAJCWR3UmVnUmVhZCB8PSBDUFVfQ0NLX0xPT1BCQUNLOwogCWVsc2UKQEAgLTI3NjcsNyArMjc2Miw3IEBACiAJLy8KICNpZmRlZiBUT19ET19MSVNUCiAJaWYgKEFkYXB0ZXItPlJlc2V0UHJvZ3Jlc3MgPT0gUkVTRVRfVFlQRV9OT1JFU0VUKSB7Ci0JCWlmIChwTWdudEluZm8tPlJlZ1JmT2ZmID09IFRSVUUpIHsgLyogVXNlciBkaXNhYmxlIFJGIHZpYSByZWdpc3RyeS4gKi8KKwkJaWYgKHBNZ250SW5mby0+UmVnUmZPZmYgPT0gdHJ1ZSkgeyAvKiBVc2VyIGRpc2FibGUgUkYgdmlhIHJlZ2lzdHJ5LiAqLwogCQkJUlRfVFJBQ0UoKENPTVBfSU5JVHxDT01QX1JGKSwgREJHX0xPVUQsICgiSW5pdGlhbGl6ZUFkYXB0ZXI4MTl4VXNiKCk6IFR1cm4gb2ZmIFJGIGZvciBSZWdSZk9mZiAtLS0tLS0tLS0tXG4iKSk7CiAJCQlNZ250QWN0U2V0X1JGX1N0YXRlKEFkYXB0ZXIsIGVSZk9mZiwgUkZfQ0hBTkdFX0JZX1NXKTsKIAkJCS8vIFRob3NlIGFjdGlvbnMgd2lsbCBiZSBkaXNjYXJkIGluIE1nbnRBY3RTZXRfUkZfU3RhdGUgYmVjYXVzZSBvZiB0aGUgc2FtZSBzdGF0ZQpAQCAtMjgxNCwxNSArMjgwOSwxNSBAQAogCQl1OCB0bXB2YWx1ZTsKIAkJcmVhZF9uaWNfYnl0ZShkZXYsIDB4MzAxLCAmdG1wdmFsdWUpOwogCQlpZiAodG1wdmFsdWUgPT0gMHgwMykgewotCQkJcHJpdi0+YkRjdXQgPSBUUlVFOworCQkJcHJpdi0+YkRjdXQgPSB0cnVlOwogCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkQtY3V0XG4iKTsKIAkJfSBlbHNlIHsKLQkJCXByaXYtPmJEY3V0ID0gRkFMU0U7CisJCQlwcml2LT5iRGN1dCA9IGZhbHNlOwogCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgIkMtY3V0XG4iKTsKIAkJfQogCQlkbV9pbml0aWFsaXplX3R4cG93ZXJfdHJhY2tpbmcoZGV2KTsKIAotCQlpZiAocHJpdi0+YkRjdXQgPT0gVFJVRSkgeworCQlpZiAocHJpdi0+YkRjdXQpIHsKIAkJCXUzMiBpLCBUZW1wQ0NrOwogCQkJdTMyIHRtcFJlZ0EgPSBydGw4MTkyX1F1ZXJ5QkJSZWcoZGV2LCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLCBiTWFza0RXb3JkKTsKIAkJCWZvciAoaSA9IDA7IGkgPCBUeEJCR2FpblRhYmxlTGVuZ3RoOyBpKyspIHsKQEAgLTI4NzQsMTEgKzI4NjksMTEgQEAKIHsKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGllZWU4MDIxMV9wcml2KGRldik7CiAJdTE2CQlSZWdUeENvdW50ZXI7Ci0JYm9vbAkJYlN0dWNrID0gRkFMU0U7CisJYm9vbAkJYlN0dWNrID0gZmFsc2U7CiAJcmVhZF9uaWNfd29yZChkZXYsIDB4MTI4LCAmUmVnVHhDb3VudGVyKTsKIAlSVF9UUkFDRShDT01QX1JFU0VULCAiJXMoKTpSZWdUeENvdW50ZXIgaXMgJWQsVHhDb3VudGVyIGlzICVkXG4iLCBfX2Z1bmNfXywgUmVnVHhDb3VudGVyLCBwcml2LT5UeENvdW50ZXIpOwogCWlmIChwcml2LT5UeENvdW50ZXIgPT0gUmVnVHhDb3VudGVyKQotCQliU3R1Y2sgPSBUUlVFOworCQliU3R1Y2sgPSB0cnVlOwogCiAJcHJpdi0+VHhDb3VudGVyID0gUmVnVHhDb3VudGVyOwogCkBAIC0yOTIwLDcgKzI5MTUsNyBAQAogewogCXUxNglSZWdSeENvdW50ZXI7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCWJvb2wgYlN0dWNrID0gRkFMU0U7CisJYm9vbCBiU3R1Y2sgPSBmYWxzZTsKIAlzdGF0aWMgdTgJcnhfY2hrX2NudDsKIAlyZWFkX25pY193b3JkKGRldiwgMHgxMzAsICZSZWdSeENvdW50ZXIpOwogCVJUX1RSQUNFKENPTVBfUkVTRVQsICIlcygpOiBSZWdSeENvdW50ZXIgaXMgJWQsUnhDb3VudGVyIGlzICVkXG4iLCBfX2Z1bmNfXywgUmVnUnhDb3VudGVyLCBwcml2LT5SeENvdW50ZXIpOwpAQCAtMjk1MSw3ICsyOTQ2LDcgQEAKIAl9CiAKIAlpZiAocHJpdi0+UnhDb3VudGVyID09IFJlZ1J4Q291bnRlcikKLQkJYlN0dWNrID0gVFJVRTsKKwkJYlN0dWNrID0gdHJ1ZTsKIAogCXByaXYtPlJ4Q291bnRlciA9IFJlZ1J4Q291bnRlcjsKIApAQCAtMjk2MSwxMCArMjk1NiwxMCBAQAogc3RhdGljIFJFU0VUX1RZUEUgUnhDaGVja1N0dWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCWJvb2wgICAgICAgIGJSeENoZWNrID0gRkFMU0U7CisJYm9vbCAgICAgICAgYlJ4Q2hlY2sgPSBmYWxzZTsKIAogCWlmIChwcml2LT5JcnBQZW5kaW5nQ291bnQgPiAxKQotCQliUnhDaGVjayA9IFRSVUU7CisJCWJSeENoZWNrID0gdHJ1ZTsKIAogCWlmIChiUnhDaGVjaykgewogCQlpZiAoSGFsUnhDaGVja1N0dWNrODE5eFVzYihkZXYpKSB7CkBAIC0zMDIxLDkgKzMwMTYsOSBAQAogCiB9CiAKLXZvaWQgcnRsODE5Ml9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdik7Ci1pbnQgX3J0bDgxOTJfdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1pbnQgcnRsODE5Ml9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHJ0bDgxOTJfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IHI4MTkyX3ByaXYgKnByaXYpOworc3RhdGljIGludCBfcnRsODE5Ml91cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgcnRsODE5Ml9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIAogCiAKQEAgLTM2NDIsNyArMzYzNyw3IEBACiAJCQkJcmV0X3JhdGUgPSBNR05fTUNTMTU7CiAJCQkJYnJlYWs7CiAJCQljYXNlIERFU0M5MF9SQVRFTUNTMzI6Ci0JCQkJcmV0X3JhdGUgPSAoMHg4MHwweDIwKTsKKwkJCQlyZXRfcmF0ZSA9IDB4ODB8MHgyMDsKIAkJCQlicmVhazsKIAogCQkJZGVmYXVsdDoKQEAgLTQwMzgsNyArNDAzMyw3IEBACiAKIAkJaWYgKCFwcml2LT5iQ2NrSGlnaFBvd2VyKSB7CiAJCQlyZXBvcnQgPSBwY2NrX2J1Zi0+Y2NrX2FnY19ycHQgJiAweGMwOwotCQkJcmVwb3J0ID0gcmVwb3J0Pj42OworCQkJcmVwb3J0ID4+PSA2OwogCQkJc3dpdGNoIChyZXBvcnQpIHsKIAkJCQkvL0ZpeGVkIGJ5IEphY2tlbiBmcm9tIEJyeWFudCAyMDA4LTAzLTIwCiAJCQkJLy9PcmlnaW5hbCB2YWx1ZSBpcyAtMzggLCAtMjYgLCAtMTQgLCAtMgpAQCAtNDA1OCw3ICs0MDUzLDcgQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCXJlcG9ydCA9IHBjY2tfYnVmLT5jY2tfYWdjX3JwdCAmIDB4NjA7Ci0JCQlyZXBvcnQgPSByZXBvcnQ+PjU7CisJCQlyZXBvcnQgPj49IDU7CiAJCQlzd2l0Y2ggKHJlcG9ydCkgewogCQkJY2FzZSAweDM6CiAJCQkJcnhfcHdyX2FsbCA9IC0zNSAtICgocGNja19idWYtPmNja19hZ2NfcnB0ICYgMHgxZik8PDEpOwpAQCAtNDIwOCw3ICs0MjAzLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaW5mby0+ZGV2OwogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gKHN0cnVjdCByODE5Ml9wcml2ICopaWVlZTgwMjExX3ByaXYoZGV2KTsKIAlib29sIGJwYWNrZXRfbWF0Y2hfYnNzaWQsIGJwYWNrZXRfdG9zZWxmOwotCWJvb2wgYlBhY2tldEJlYWNvbiA9IEZBTFNFLCBiVG9TZWxmQkEgPSBGQUxTRTsKKwlib29sIGJQYWNrZXRCZWFjb24gPSBmYWxzZSwgYlRvU2VsZkJBID0gZmFsc2U7CiAJc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHMgIHByZXZpb3VzX3N0YXRzOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyXzNhZGRyICpoZHI7Ly9ieSBhbXkKIAl1MTYgZmMsIHR5cGU7CkBAIC00MjI3LDkgKzQyMjIsOSBAQAogCXByYWRkciA9IGhkci0+YWRkcjE7CiAKIAkvKiBDaGVjayBpZiB0aGUgcmVjZWl2ZWQgcGFja2V0IGlzIGFjY2VwdGFibGUuICovCi0JYnBhY2tldF9tYXRjaF9ic3NpZCA9ICgoSUVFRTgwMjExX0ZUWVBFX0NUTCAhPSB0eXBlKSAmJgorCWJwYWNrZXRfbWF0Y2hfYnNzaWQgPSAoSUVFRTgwMjExX0ZUWVBFX0NUTCAhPSB0eXBlKSAmJgogCQkJICAgICAgIChlcU1hY0FkZHIocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuYnNzaWQsICAoZmMgJiBJRUVFODAyMTFfRkNUTF9UT0RTKSA/IGhkci0+YWRkcjEgOiAoZmMgJiBJRUVFODAyMTFfRkNUTF9GUk9NRFMpID8gaGRyLT5hZGRyMiA6IGhkci0+YWRkcjMpKQotCQkJICAgICAgICYmICghcHN0YXRzLT5iSHdFcnJvcikgJiYgKCFwc3RhdHMtPmJDUkMpICYmICghcHN0YXRzLT5iSUNWKSk7CisJCQkgICAgICAgJiYgKCFwc3RhdHMtPmJId0Vycm9yKSAmJiAoIXBzdGF0cy0+YkNSQykgJiYgKCFwc3RhdHMtPmJJQ1YpOwogCWJwYWNrZXRfdG9zZWxmID0gIGJwYWNrZXRfbWF0Y2hfYnNzaWQgJiAoZXFNYWNBZGRyKHByYWRkciwgcHJpdi0+aWVlZTgwMjExLT5kZXYtPmRldl9hZGRyKSk7CiAKIAlpZiAoV0xBTl9GQ19HRVRfRlJBTUVUWVBFKGZjKSA9PSBJRUVFODAyMTFfU1RZUEVfQkVBQ09OKQpAQCAtNDQ3NCwxMyArNDQ2OSwxMCBAQAogCQlza2JfcHVsbChza2IsIHN0YXRzLT5SeEJ1ZlNoaWZ0ICsgc3RhdHMtPlJ4RHJ2SW5mb1NpemUpOwogCX0KIAotCS8qIGZvciBkZWJ1ZyAyMDA4LjUuMjkgKi8KLQotCS8vYWRkZWQgYnkgdml2aSwgZm9yIE1QLCAyMDA4MDEwOAotCXN0YXRzLT5SeElzNDBNSHpQYWNrZXQgPSBkcml2ZXJfaW5mby0+Qlc7Ci0JaWYgKHN0YXRzLT5SeERydkluZm9TaXplICE9IDApCisJaWYgKGRyaXZlcl9pbmZvKSB7CisJCXN0YXRzLT5SeElzNDBNSHpQYWNrZXQgPSBkcml2ZXJfaW5mby0+Qlc7CiAJCVRyYW5zbGF0ZVJ4U2lnbmFsU3R1ZmY4MTl4VXNiKHNrYiwgc3RhdHMsIGRyaXZlcl9pbmZvKTsKLQorCX0KIH0KIAogc3RhdGljIHZvaWQgcnRsODE5Ml9yeF9ub21hbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV9kbS5jCmluZGV4IGVlNmI5MzYuLjEyZGQxOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmMKQEAgLTM2LDExICszNiwxMiBAQAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiBEZWJ1ZyB2YXJpYWJsZSA/ICovCi1kaWdfdAlkbV9kaWd0YWJsZTsKK3N0cnVjdCBkaWcgZG1fZGlndGFibGU7CiAvKiBTdG9yZSBjdXJyZW50IHNvZnR3YXJlIHdyaXRlIHJlZ2lzdGVyIGNvbnRlbnQgZm9yIE1BQyBQSFkuICovCiB1OAkJZG1fc2hhZG93WzE2XVsyNTZdID0geyB7MH0gfTsKIC8qIEZvciBEeW5hbWljIFJ4IFBhdGggU2VsZWN0aW9uIGJ5IFNpZ25hbCBTdHJlbmd0aCAqLwotRFJ4UGF0aFNlbAlETV9SeFBhdGhTZWxUYWJsZTsKK3N0cnVjdCBkeW5hbWljX3J4X3BhdGhfc2VsIERNX1J4UGF0aFNlbFRhYmxlOworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLURlZmluZSBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIApAQCAtNTAyLDcgKzUwMyw3IEBACiBzdGF0aWMgdm9pZCBkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UU1NJKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwotCWJvb2wJCQkJCQliSGlnaHBvd2Vyc3RhdGUsIHZpdmlmbGFnID0gRkFMU0U7CisJYm9vbAkJCQkJCWJIaWdocG93ZXJzdGF0ZSwgdml2aWZsYWcgPSBmYWxzZTsKIAlEQ01EX1RYQ01EX1QJCQl0eF9jbWQ7CiAJdTgJCQkJCQlwb3dlcmxldmVsT0ZETTI0RzsKIAlpbnQJCQkJCQlpID0gMCwgaiA9IDAsIGsgPSAwOwpAQCAtNTU4LDEzICs1NTksMTMgQEAKIAkJCS8qIGNoZWNrIGlmIHRoZSByZXBvcnQgdmFsdWUgaXMgcmlnaHQgKi8KIAkJCWZvciAoayA9IDA7IGsgPCA1OyBrKyspIHsKIAkJCQlpZiAodG1wX3JlcG9ydFtrXSA8PSAyMCkgewotCQkJCQl2aXZpZmxhZyA9IFRSVUU7CisJCQkJCXZpdmlmbGFnID0gdHJ1ZTsKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJfQotCQkJaWYgKHZpdmlmbGFnID09IFRSVUUpIHsKKwkJCWlmICh2aXZpZmxhZyA9PSB0cnVlKSB7CiAJCQkJd3JpdGVfbmljX2J5dGUoZGV2LCAweDFiYSwgMCk7Ci0JCQkJdml2aWZsYWcgPSBGQUxTRTsKKwkJCQl2aXZpZmxhZyA9IGZhbHNlOwogCQkJCVJUX1RSQUNFKENPTVBfUE9XRVJfVFJBQ0tJTkcsICJ3ZSBmaWx0ZXJlZCB0aGUgZGF0YVxuIik7CiAJCQkJZm9yIChrID0gMDsgayA8IDU7IGsrKykKIAkJCQkJdG1wX3JlcG9ydFtrXSA9IDA7CkBAIC01ODcsNyArNTg4LDcgQEAKIAkJCQlkZWx0YSA9IFRTU0lfMTNkQm0gLSBBdmdfVFNTSV9NZWFzX2Zyb21fZHJpdmVyOwogCiAJCQlpZiAoZGVsdGEgPD0gRV9GT1JfVFhfUE9XRVJfVFJBQ0spIHsKLQkJCQlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gVFJVRTsKKwkJCQlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gdHJ1ZTsKIAkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MWJhLCAwKTsKIAkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAidHggcG93ZXIgdHJhY2sgaXMgZG9uZVxuIik7CiAJCQkJUlRfVFJBQ0UoQ09NUF9QT1dFUl9UUkFDS0lORywgInByaXYtPnJmYV90eHBvd2VydHJhY2tpbmdpbmRleCA9ICVkXG4iLCBwcml2LT5yZmFfdHhwb3dlcnRyYWNraW5naW5kZXgpOwpAQCAtNjI0LDEwICs2MjUsMTAgQEAKIAogCQkJaWYgKHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA+IC0xICYmIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbiA8IDIzKSB7CiAJCQkJaWYgKHByaXYtPmllZWU4MDIxMS0+Y3VycmVudF9uZXR3b3JrLmNoYW5uZWwgPT0gMTQgJiYgIXByaXYtPmJjY2tfaW5fY2gxNCkgewotCQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSBUUlVFOworCQkJCQlwcml2LT5iY2NrX2luX2NoMTQgPSB0cnVlOwogCQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LCBwcml2LT5iY2NrX2luX2NoMTQpOwogCQkJCX0gZWxzZSBpZiAocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCAhPSAxNCAmJiBwcml2LT5iY2NrX2luX2NoMTQpIHsKLQkJCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gRkFMU0U7CisJCQkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IGZhbHNlOwogCQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LCBwcml2LT5iY2NrX2luX2NoMTQpOwogCQkJCX0gZWxzZQogCQkJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LCBwcml2LT5iY2NrX2luX2NoMTQpOwpAQCAtNjM4LDcgKzYzOSw3IEBACiAJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAicHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uID0gJWRcbiIsIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbik7CiAKIAkJCWlmIChwcml2LT5jY2tfcHJlc2VudF9hdHRlbnR1YXRpb25fZGlmZmVyZW5jZSA8PSAtMTIgfHwgcHJpdi0+Y2NrX3ByZXNlbnRfYXR0ZW50dWF0aW9uX2RpZmZlcmVuY2UgPj0gMjQpIHsKLQkJCQlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gVFJVRTsKKwkJCQlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gdHJ1ZTsKIAkJCQl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MWJhLCAwKTsKIAkJCQlSVF9UUkFDRShDT01QX1BPV0VSX1RSQUNLSU5HLCAidHggcG93ZXIgdHJhY2stLS0+bGltaXRlZFxuIik7CiAJCQkJcmV0dXJuOwpAQCAtNjUxLDcgKzY1Miw3IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gVFJVRTsKKwlwcml2LT5pZWVlODAyMTEtPmJkeW5hbWljX3R4cG93ZXJfZW5hYmxlID0gdHJ1ZTsKIAl3cml0ZV9uaWNfYnl0ZShkZXYsIDB4MWJhLCAwKTsKIH0KIApAQCAtNjg0LDcgKzY4NSw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KLQkJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmdJbml0ID0gVFJVRTsKKwkJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmdJbml0ID0gdHJ1ZTsKIAkJLypwSGFsRGF0YS0+VFhQb3dlcmNvdW50ID0gMDsqLwogCQlyZXR1cm47CiAJfQpAQCAtNzE3LDcgKzcxOCw3IEBACiAJCWlmICh0bXBDQ0s0ME1pbmRleCA+PSBDQ0tfVGFibGVfbGVuZ3RoKQogCQkJdG1wQ0NLNDBNaW5kZXggPSBDQ0tfVGFibGVfbGVuZ3RoLTE7CiAJfSBlbHNlIHsKLQkJdG1wdmFsID0gKCh1OCl0bXBSZWdBIC0gcHJpdi0+VGhlcm1hbE1ldGVyWzBdKTsKKwkJdG1wdmFsID0gKHU4KXRtcFJlZ0EgLSBwcml2LT5UaGVybWFsTWV0ZXJbMF07CiAKIAkJaWYgKHRtcHZhbCA+PSA2KSAvKiBoaWdoZXIgdGVtcGVyYXR1cmUgKi8KIAkJCXRtcE9GRE1pbmRleCA9IHRtcENDSzIwTWluZGV4ID0gMDsgLyogbWF4IHRvICs2ZEIgKi8KQEAgLTczNCwxMCArNzM1LDEwIEBACiAJCXRtcENDS2luZGV4ID0gdG1wQ0NLMjBNaW5kZXg7CiAKIAlpZiAocHJpdi0+aWVlZTgwMjExLT5jdXJyZW50X25ldHdvcmsuY2hhbm5lbCA9PSAxNCAmJiAhcHJpdi0+YmNja19pbl9jaDE0KSB7Ci0JCXByaXYtPmJjY2tfaW5fY2gxNCA9IFRSVUU7CisJCXByaXYtPmJjY2tfaW5fY2gxNCA9IHRydWU7CiAJCUNDS1N3aW5nTmVlZFVwZGF0ZSA9IDE7CiAJfSBlbHNlIGlmIChwcml2LT5pZWVlODAyMTEtPmN1cnJlbnRfbmV0d29yay5jaGFubmVsICE9IDE0ICYmIHByaXYtPmJjY2tfaW5fY2gxNCkgewotCQlwcml2LT5iY2NrX2luX2NoMTQgPSBGQUxTRTsKKwkJcHJpdi0+YmNja19pbl9jaDE0ID0gZmFsc2U7CiAJCUNDS1N3aW5nTmVlZFVwZGF0ZSA9IDE7CiAJfQogCkBAIC03NjUsNyArNzY2LDcgQEAKIAlzdHJ1Y3QgcjgxOTJfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHI4MTkyX3ByaXYsIHR4cG93ZXJfdHJhY2tpbmdfd3EpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBwcml2LT5pZWVlODAyMTEtPmRldjsKIAotCWlmIChwcml2LT5iRGN1dCA9PSBUUlVFKQorCWlmIChwcml2LT5iRGN1dCA9PSB0cnVlKQogCQlkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UU1NJKGRldik7CiAJZWxzZQogCQlkbV9UWFBvd2VyVHJhY2tpbmdDYWxsYmFja19UaGVybWFsTWV0ZXIoZGV2KTsKQEAgLTEyNzMsOSArMTI3NCw5IEBACiAJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVs2XSA9IDB4MDA7CiAJcHJpdi0+Y2NrX3R4YmJnYWluX2NoMTRfdGFibGVbMjJdLmNja3R4YmJfdmFsdWVhcnJheVs3XSA9IDB4MDA7CiAKLQlwcml2LT5idHhwb3dlcl90cmFja2luZyA9IFRSVUU7CisJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmcgPSB0cnVlOwogCXByaXYtPnR4cG93ZXJfY291bnQgICAgICAgPSAwOwotCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IEZBTFNFOworCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nSW5pdCA9IGZhbHNlOwogCiB9CiAKQEAgLTEyODksMTggKzEyOTAsMTggQEAKIAkgKiAzLXdpcmUgYnkgZHJpdmVyIGNhdXNlcyBSRiB0byBnbyBpbnRvIGEgd3Jvbmcgc3RhdGUuCiAJICovCiAJaWYgKHByaXYtPmllZWU4MDIxMS0+RndSV1JGKQotCQlwcml2LT5idHhwb3dlcl90cmFja2luZyA9IFRSVUU7CisJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gdHJ1ZTsKIAllbHNlCi0JCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gRkFMU0U7CisJCXByaXYtPmJ0eHBvd2VyX3RyYWNraW5nID0gZmFsc2U7CiAJcHJpdi0+dHhwb3dlcl9jb3VudCAgICAgICA9IDA7Ci0JcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmdJbml0ID0gRkFMU0U7CisJcHJpdi0+YnR4cG93ZXJfdHJhY2tpbmdJbml0ID0gZmFsc2U7CiB9CiAKIHZvaWQgZG1faW5pdGlhbGl6ZV90eHBvd2VyX3RyYWNraW5nKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCi0JaWYgKHByaXYtPmJEY3V0ID09IFRSVUUpCisJaWYgKHByaXYtPmJEY3V0ID09IHRydWUpCiAJCWRtX0luaXRpYWxpemVUWFBvd2VyVHJhY2tpbmdfVFNTSShkZXYpOwogCWVsc2UKIAkJZG1fSW5pdGlhbGl6ZVRYUG93ZXJUcmFja2luZ19UaGVybWFsTWV0ZXIoZGV2KTsKQEAgLTEzNTYsNyArMTM1Nyw3IEBACiAjaWZkZWYgUlRMODE5MFAKIAlkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UU1NJKGRldik7CiAjZWxzZQotCWlmIChwcml2LT5iRGN1dCA9PSBUUlVFKQorCWlmIChwcml2LT5iRGN1dCA9PSB0cnVlKQogCQlkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UU1NJKGRldik7CiAJZWxzZQogCQlkbV9DaGVja1RYUG93ZXJUcmFja2luZ19UaGVybWFsTWV0ZXIoZGV2KTsKQEAgLTE0NjYsNyArMTQ2Nyw3IEBACiB7CS8qICBkbV9DQ0tUeFBvd2VyQWRqdXN0ICovCiAJc3RydWN0IHI4MTkyX3ByaXYgKnByaXYgPSBpZWVlODAyMTFfcHJpdihkZXYpOwogCi0JaWYgKHByaXYtPmJEY3V0ID09IFRSVUUpCisJaWYgKHByaXYtPmJEY3V0ID09IHRydWUpCiAJCWRtX0NDS1R4UG93ZXJBZGp1c3RfVFNTSShkZXYsIGJpbmNoMTQpOwogCWVsc2UKIAkJZG1fQ0NLVHhQb3dlckFkanVzdF9UaGVybWFsTWV0ZXIoZGV2LCBiaW5jaDE0KTsKQEAgLTE2MjgsOCArMTYyOSw4IEBACiAJCWRtX2RpZ3RhYmxlLnJzc2lfbG93X3RocmVzaCA9IGRtX3ZhbHVlOwogCX0gZWxzZSBpZiAoZG1fdHlwZSA9PSBESUdfVFlQRV9USFJFU0hfSElHSFBXUl9ISUdIKSB7CiAJCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9oaWdodGhyZXNoID0gZG1fdmFsdWU7Ci0JfSBlbHNlIGlmIChkbV90eXBlID09IERJR19UWVBFX1RIUkVTSF9ISUdIUFdSX0hJR0gpIHsKLQkJZG1fZGlndGFibGUucnNzaV9oaWdoX3Bvd2VyX2hpZ2h0aHJlc2ggPSBkbV92YWx1ZTsKKwl9IGVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfVEhSRVNIX0hJR0hQV1JfTE9XKSB7CisJCWRtX2RpZ3RhYmxlLnJzc2lfaGlnaF9wb3dlcl9sb3d0aHJlc2ggPSBkbV92YWx1ZTsKIAl9IGVsc2UgaWYgKGRtX3R5cGUgPT0gRElHX1RZUEVfRU5BQkxFKSB7CiAJCWRtX2RpZ3RhYmxlLmRpZ19zdGF0ZQkJPSBETV9TVEFfRElHX01BWDsKIAkJZG1fZGlndGFibGUuZGlnX2VuYWJsZV9mbGFnCT0gdHJ1ZTsKQEAgLTIyNzAsMTAgKzIyNzEsMTAgQEAKIAkJCQkvKiAgRm9yIEVhY2ggdGltZSB1cGRhdGluZyBFRENBIHBhcmFtZXRlciwgcmVzZXQgRURDQSB0dXJibyBtb2RlIHN0YXR1cy4gKi8KIAkJCQlkbV9pbml0X2VkY2FfdHVyYm8oZGV2KTsKIAkJCQl1MWJBSUZTID0gcW9zX3BhcmFtZXRlcnMtPmFpZnNbMF0gKiAoKG1vZGUmKElFRUVfR3xJRUVFX05fMjRHKSkgPyA5IDogMjApICsgYVNpZnNUaW1lOwotCQkJCXU0YkFjUGFyYW0gPSAoKCgodTMyKShxb3NfcGFyYW1ldGVycy0+dHhfb3BfbGltaXRbMF0pKSA8PCBBQ19QQVJBTV9UWE9QX0xJTUlUX09GRlNFVCl8CisJCQkJdTRiQWNQYXJhbSA9ICgoKHUzMikocW9zX3BhcmFtZXRlcnMtPnR4X29wX2xpbWl0WzBdKSkgPDwgQUNfUEFSQU1fVFhPUF9MSU1JVF9PRkZTRVQpfAogCQkJCQkoKCh1MzIpKHFvc19wYXJhbWV0ZXJzLT5jd19tYXhbMF0pKSA8PCBBQ19QQVJBTV9FQ1dfTUFYX09GRlNFVCl8CiAJCQkJCSgoKHUzMikocW9zX3BhcmFtZXRlcnMtPmN3X21pblswXSkpIDw8IEFDX1BBUkFNX0VDV19NSU5fT0ZGU0VUKXwKLQkJCQkJKCh1MzIpdTFiQUlGUyA8PCBBQ19QQVJBTV9BSUZTX09GRlNFVCkpOworCQkJCQkoKHUzMil1MWJBSUZTIDw8IEFDX1BBUkFNX0FJRlNfT0ZGU0VUKTsKIAkJCQkvKndyaXRlX25pY19kd29yZChkZXYsIFdEQ0FQQVJBX0FERFtpXSwgdTRiQWNQYXJhbSk7Ki8KIAkJCQl3cml0ZV9uaWNfZHdvcmQoZGV2LCBFRENBUEFSQV9CRSwgIHU0YkFjUGFyYW0pOwogCkBAIC0yMzE0LDcgKzIzMTUsNyBAQAogewogCXN0cnVjdCByODE5Ml9wcml2ICpwcml2ID0gaWVlZTgwMjExX3ByaXYoKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2KTsKIAotCXByaXYtPmllZWU4MDIxMS0+YkNUU1RvU2VsZkVuYWJsZSA9IFRSVUU7CisJcHJpdi0+aWVlZTgwMjExLT5iQ1RTVG9TZWxmRW5hYmxlID0gdHJ1ZTsKIAlwcml2LT5pZWVlODAyMTEtPkNUU1RvU2VsZlRIID0gQ1RTVG9TZWxmVEhWYWw7CiB9CiAKQEAgLTIzMjcsNyArMjMyOCw3IEBACiAJdW5zaWduZWQgbG9uZwkJCQkJCWN1clR4T2tDbnQgPSAwOwogCXVuc2lnbmVkIGxvbmcJCQkJCQljdXJSeE9rQ250ID0gMDsKIAotCWlmIChwcml2LT5pZWVlODAyMTEtPmJDVFNUb1NlbGZFbmFibGUgIT0gVFJVRSkgeworCWlmIChwcml2LT5pZWVlODAyMTEtPmJDVFNUb1NlbGZFbmFibGUgIT0gdHJ1ZSkgewogCQlwSFRJbmZvLT5JT1RBY3Rpb24gJj0gfkhUX0lPVF9BQ1RfRk9SQ0VEX0NUUzJTRUxGOwogCQlyZXR1cm47CiAJfQpAQCAtMjQxOSw5ICsyNDIwLDkgQEAKIAkvKiBDaGVjayBCaXQgMC0zLCBpdCBtZWFucyBpZiBSRiBBLUQgaXMgZW5hYmxlZC4gKi8KIAlmb3IgKGkgPSAwOyBpIDwgUkY5MF9QQVRIX01BWDsgaSsrKSB7CiAJCWlmIChyZnBhdGggJiAoMHgwMTw8aSkpCi0JCQlwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldID0gMTsKKwkJCXByaXYtPmJyZnBhdGhfcnhlbmFibGVbaV0gPSB0cnVlOwogCQllbHNlCi0JCQlwcml2LT5icmZwYXRoX3J4ZW5hYmxlW2ldID0gMDsKKwkJCXByaXYtPmJyZnBhdGhfcnhlbmFibGVbaV0gPSBmYWxzZTsKIAl9CiAJaWYgKCFETV9SeFBhdGhTZWxUYWJsZS5FbmFibGUpCiAJCXJldHVybjsKQEAgLTI2ODEsMTAgKzI2ODIsOCBAQAogCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc2Vjb25kZGlmZl9yYXRldGhyZXNob2xkID0gMjAwOwogCXByaXYtPmllZWU4MDIxMS0+ZnN5bmNfc3RhdGUgPSBEZWZhdWx0X0ZzeW5jOwogCXByaXYtPmZyYW1lc3luY01vbml0b3IgPSAxOwkvKiBjdXJyZW50IGRlZmF1bHQgMHhjMzggbW9uaXRvciBvbiAqLwotCi0JaW5pdF90aW1lcigmcHJpdi0+ZnN5bmNfdGltZXIpOwotCXByaXYtPmZzeW5jX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylkZXY7Ci0JcHJpdi0+ZnN5bmNfdGltZXIuZnVuY3Rpb24gPSBkbV9mc3luY190aW1lcl9jYWxsYmFjazsKKwlzZXR1cF90aW1lcigmcHJpdi0+ZnN5bmNfdGltZXIsIGRtX2ZzeW5jX3RpbWVyX2NhbGxiYWNrLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgZG1fZGVJbml0X2ZzeW5jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmgKaW5kZXggMzAwOGY5MS4uNmNkMzJlYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfZG0uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX2RtLmgKQEAgLTY3LDcgKzY3LDcgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgc3RydWN0dXJlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAvKiAyMDA3LzEwLzA0IE1IIERlZmluZSB1cHBlciBhbmQgbG93ZXIgdGhyZXNob2xkIG9mIERJRyBlbmFibGUgb3IgZGlzYWJsZS4gKi8KLXR5cGVkZWYgc3RydWN0IF9keW5hbWljX2luaXRpYWxfZ2Fpbl90aHJlc2hvbGRfIHsKK3N0cnVjdCBkaWcgewogCXU4CQlkaWdfZW5hYmxlX2ZsYWc7CiAJdTgJCWRpZ19hbGdvcml0aG07CiAJdTgJCWRiZ19tb2RlOwpAQCAtOTgsNyArOTgsNyBAQAogCWJvb2wJCWluaXRpYWxnYWluX2xvd2VyYm91bmRfc3RhdGU7CiAKIAlsb25nCQlyc3NpX3ZhbDsKLX0gZGlnX3Q7Cit9OwogCiB0eXBlZGVmIGVudW0gdGFnX2R5bmFtaWNfaW5pdF9nYWluX3N0YXRlX2RlZmluaXRpb24gewogCURNX1NUQV9ESUdfT0ZGID0gMCwKQEAgLTE2Myw3ICsxNjMsNyBAQAogCURJR19DU19SQVRJT19ISUdIRVIgPSAxLAogCURJR19DU19NQVgKIH0gZG1fZGlnX2NzX3JhdGlvX2U7Ci10eXBlZGVmIHN0cnVjdCBfRHluYW1pY19SeF9QYXRoX1NlbGVjdGlvbl8geworc3RydWN0IGR5bmFtaWNfcnhfcGF0aF9zZWwgewogCXU4CQlFbmFibGU7CiAJdTgJCURiZ01vZGU7CiAJdTgJCWNja19tZXRob2Q7CkBAIC0xNzcsNyArMTc3LDcgQEAKIAl1OAkJcmZfcnNzaVs0XTsKIAl1OAkJcmZfZW5hYmxlX3Jzc2lfdGhbNF07CiAJbG9uZwkJY2NrX3B3ZGJfc3RhWzRdOwotfSBEUnhQYXRoU2VsOworfTsKIAogdHlwZWRlZiBlbnVtIHRhZ19DQ0tfUnhfUGF0aF9NZXRob2RfRGVmaW5pdGlvbiB7CiAJQ0NLX1J4X1ZlcnNpb25fMSA9IDAsCkBAIC0yMDAsOSArMjAwLDkgQEAKIAogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLUV4cG9ydCBnbG9iYWwgdmFyaWFibGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWV4dGVybiBkaWdfdCBkbV9kaWd0YWJsZTsKK2V4dGVybiBzdHJ1Y3QgZGlnIGRtX2RpZ3RhYmxlOwogZXh0ZXJuIHU4IGRtX3NoYWRvd1sxNl1bMjU2XTsKLWV4dGVybiBEUnhQYXRoU2VsIERNX1J4UGF0aFNlbFRhYmxlOworZXh0ZXJuIHN0cnVjdCBkeW5hbWljX3J4X3BhdGhfc2VsIERNX1J4UGF0aFNlbFRhYmxlOwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1FeHBvcnQgZ2xvYmFsIHZhcmlhYmxlLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5jCmluZGV4IDM2MWQyZDAuLjgzNTk3MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmMKQEAgLTEzOSw3ICsxMzksNyBAQAogCiAJZG93bigmcHJpdi0+d3hfc2VtKTsKIAotCXByaW50aygiJXMoKTogZm9yY2UgcmVzZXQgISBleHRyYSBpcyAlZFxuIiwgX19mdW5jX18sICpleHRyYSk7CisJbmV0ZGV2X2RiZyhkZXYsICIlcygpOiBmb3JjZSByZXNldCAhIGV4dHJhIGlzICVkXG4iLCBfX2Z1bmNfXywgKmV4dHJhKTsKIAlwcml2LT5mb3JjZV9yZXNldCA9ICpleHRyYTsKIAl1cCgmcHJpdi0+d3hfc2VtKTsKIAlyZXR1cm4gMDsKQEAgLTMzNSw3ICszMzUsNyBAQAogCWlmICghcHJpdi0+dXApCiAJCXJldHVybiAtRU5FVERPV047CiAKLQlpZiAocHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5iQnVzeVRyYWZmaWMgPT0gdHJ1ZSkKKwlpZiAocHJpdi0+aWVlZTgwMjExLT5MaW5rRGV0ZWN0SW5mby5iQnVzeVRyYWZmaWMpCiAJCXJldHVybiAtRUFHQUlOOwogCWlmICh3cnF1LT5kYXRhLmZsYWdzICYgSVdfU0NBTl9USElTX0VTU0lEKSB7CiAJCXN0cnVjdCBpd19zY2FuX3JlcSAqcmVxID0gKHN0cnVjdCBpd19zY2FuX3JlcSAqKWI7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOTJVX3d4LmgKaW5kZXggYWU3YTYxNy4uZDZhMmQ5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTkyVV93eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5MlVfd3guaApAQCAtMSwyMCArMSwyMSBAQAogLyoKLQlUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlciAtIHYgMC4zCi0JQ29weXJpZ2h0IChDKSBBbmRyZWEgTWVyZWxsbyAyMDA0ICA8YW5kcmVhLm1lcmVsbG9AZ21haWwuY29tPgotCVJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHUEwgKEdlbmVyYWwgUHVibGljIExpY2VuY2UpCisgKiBUaGlzIGlzIHBhcnQgb2YgcnRsODE4MCBPcGVuU291cmNlIGRyaXZlciAtIHYgMC4zCisgKiBDb3B5cmlnaHQgKEMpIEFuZHJlYSBNZXJlbGxvIDIwMDQgIDxhbmRyZWEubWVyZWxsb0BnbWFpbC5jb20+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgR1BMIChHZW5lcmFsIFB1YmxpYyBMaWNlbmNlKQorICoKKyAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCisgKiBQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIHJ0bDgxODAgZHJpdmVyIHNrZWxldG9uIGZyb20gUGF0cmljCisgKiBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KKyAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgSW50ZWwgUHJvIFdpcmVsZXNzIDIxMDAgR1BMIGRyaXZlcgorICoKKyAqIFdlIHdhbnQgdG8gdGhhbmsgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QKKyAqIEF1dGhvcnMuCisgKi8KIAotCVBhcnRzIG9mIHRoaXMgZHJpdmVyIGFyZSBiYXNlZCBvbiB0aGUgR1BMIHBhcnQgb2YgdGhlIG9mZmljaWFsIHJlYWx0ZWsgZHJpdmVyCi0JUGFydHMgb2YgdGhpcyBkcml2ZXIgYXJlIGJhc2VkIG9uIHRoZSBydGw4MTgwIGRyaXZlciBza2VsZXRvbiBmcm9tIFBhdHJpYyBTY2hlbmtlICYgQW5kcmVzIFNhbG9tb24KLQlQYXJ0cyBvZiB0aGlzIGRyaXZlciBhcmUgYmFzZWQgb24gdGhlIEludGVsIFBybyBXaXJlbGVzcyAyMTAwIEdQTCBkcml2ZXIKLQotCVdlIHdhbnQgdG8gdGhhbmsgdGhlIEF1dGhvcnMgb2Ygc3VjaCBwcm9qZWN0cyBhbmQgdGhlIE5kaXN3cmFwcGVyIHByb2plY3QgQXV0aG9ycy4KLSovCi0KLS8qIHRoaXMgZmlsZSAod2lsbCkgY29udGFpbnMgd2lyZWxlc3MgZXh0ZW5zaW9uIGhhbmRsZXJzKi8KKy8qIHRoaXMgZmlsZSAod2lsbCkgY29udGFpbnMgd2lyZWxlc3MgZXh0ZW5zaW9uIGhhbmRsZXJzICovCiAKICNpZm5kZWYgUjgxODBfV1hfSAogI2RlZmluZSBSODE4MF9XWF9ICi0vLyNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogCiBleHRlcm4gc3RydWN0IGl3X2hhbmRsZXJfZGVmIHI4MTkyX3d4X2hhbmRsZXJzX2RlZjsKIC8qIEVuYWJsZSAgdGhlIHJ0bDgxOXhfY29yZS5jIHRvIHNoYXJlIHRoaXMgZnVuY3Rpb24sIGRhdmlkIDIwMDguOS4yMiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9maXJtd2FyZS5jCmluZGV4IGMyMzBiZTIuLmQyN2IxZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfZmlybXdhcmUuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX2Zpcm13YXJlLmMKQEAgLTM3LDcgKzM3LDYgQEAKIAlib29sCQkgICAgcnRfc3RhdHVzID0gdHJ1ZTsKIAl1MTYJCSAgICBmcmFnX3RocmVzaG9sZDsKIAl1MTYJCSAgICBmcmFnX2xlbmd0aCwgZnJhZ19vZmZzZXQgPSAwOwotCS8vdTE2CQkgICAgdG90YWxfc2l6ZTsKIAlpbnQJCSAgICBpOwogCiAJcnRfZmlybXdhcmUJICAgICpwZmlybXdhcmUgPSBwcml2LT5wRmlybXdhcmU7CkBAIC00OCw3ICs0Nyw3IEBACiAJdTgJCSAgICBpbmRleDsKIAogCWZpcm13YXJlX2luaXRfcGFyYW0oZGV2KTsKLQkvL0ZyYWdtZW50YXRpb24gbWlnaHQgYmUgcmVxdWlyZWQKKwkvKiBGcmFnbWVudGF0aW9uIG1pZ2h0IGJlIHJlcXVpcmVkICovCiAJZnJhZ190aHJlc2hvbGQgPSBwZmlybXdhcmUtPmNtZHBhY2tldF9mcmFnX3RocmVzb2xkOwogCWRvIHsKIAkJaWYgKChidWZmZXJfbGVuIC0gZnJhZ19vZmZzZXQpID4gZnJhZ190aHJlc2hvbGQpIHsKQEAgLTEwNywxOSArMTA2LDIwIEBACiAKIH0KIAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJvY2VkdXJlOiAgICBDaGVjayB3aGV0aGVyIG1haW4gY29kZSBpcyBkb3dubG9hZCBPSy4gSWYgT0ssIHR1cm4gb24gQ1BVCi0vLwotLy8gRGVzY3JpcHRpb246ICAgQ1BVIHJlZ2lzdGVyIGxvY2F0ZXMgaW4gZGlmZmVyZW50IHBhZ2UgYWdhaW5zdCBnZW5lcmFsIHJlZ2lzdGVyLgotLy8JCQkgICAgU3dpdGNoIHRvIENQVSByZWdpc3RlciBpbiB0aGUgYmVnaW4gYW5kIHN3aXRjaCBiYWNrIGJlZm9yZSByZXR1cm4KLS8vCi0vLwotLy8gQXJndW1lbnRzOiAgIFRoZSBwb2ludGVyIG9mIHRoZSBhZGFwdGVyCi0vLwotLy8gUmV0dXJuczoKLS8vICAgICAgICBORElTX1NUQVRVU19GQUlMVVJFIC0gdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNob3VsZCBiZSB0ZXJtaW5hdGVkCi0vLyAgICAgICAgTkRJU19TVEFUVVNfU1VDQ0VTUyAtIGlmIGZpcm13YXJlIGluaXRpYWxpemF0aW9uIHByb2Nlc3Mgc3VjY2VzcwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyoKKyAqIFByb2NlZHVyZToJQ2hlY2sgd2hldGhlciBtYWluIGNvZGUgaXMgZG93bmxvYWQgT0suIElmIE9LLCB0dXJuIG9uIENQVQorICoKKyAqIERlc2NyaXB0aW9uOglDUFUgcmVnaXN0ZXIgbG9jYXRlcyBpbiBkaWZmZXJlbnQgcGFnZSBhZ2FpbnN0IGdlbmVyYWwgcmVnaXN0ZXIuCisgKgkgICAgU3dpdGNoIHRvIENQVSByZWdpc3RlciBpbiB0aGUgYmVnaW4gYW5kIHN3aXRjaCBiYWNrIGJlZm9yZSByZXR1cm4KKyAqCisgKgorICogQXJndW1lbnRzOiAgIFRoZSBwb2ludGVyIG9mIHRoZSBhZGFwdGVyCisgKgorICogUmV0dXJuczoKKyAqICAgICAgICBORElTX1NUQVRVU19GQUlMVVJFIC0gdGhlIGZvbGxvd2luZyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHNob3VsZAorICoJCQkJYmUgdGVybWluYXRlZAorICogICAgICAgIE5ESVNfU1RBVFVTX1NVQ0NFU1MgLSBpZiBmaXJtd2FyZSBpbml0aWFsaXphdGlvbiBwcm9jZXNzIHN1Y2Nlc3MKKyAqLwogc3RhdGljIGJvb2wgQ1BVY2hlY2tfbWFpbmNvZGVva190dXJub25DUFUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlib29sCQlydF9zdGF0dXMgPSB0cnVlOwpAQCAtMTY0LDcgKzE2NCw3IEBACiAKIENQVUNoZWNrTWFpbkNvZGVPS0FuZFR1cm5PbkNQVV9GYWlsOgogCVJUX1RSQUNFKENPTVBfRVJSLCAiRVJSIGluICVzKClcbiIsIF9fZnVuY19fKTsKLQlydF9zdGF0dXMgPSBGQUxTRTsKKwlydF9zdGF0dXMgPSBmYWxzZTsKIAlyZXR1cm4gcnRfc3RhdHVzOwogfQogCkBAIC0yMDEsNyArMjAxLDcgQEAKIGJvb2wgaW5pdF9maXJtd2FyZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCByODE5Ml9wcml2CSpwcml2ID0gaWVlZTgwMjExX3ByaXYoZGV2KTsKLQlib29sCQkJcnRfc3RhdHVzID0gVFJVRTsKKwlib29sCQkJcnRfc3RhdHVzID0gdHJ1ZTsKIAogCXUzMgkJCWZpbGVfbGVuZ3RoID0gMDsKIAl1OAkJCSptYXBwZWRfZmlsZSA9IE5VTEw7CkBAIC0yMjIsNyArMjIyLDcgQEAKIAkJLyogaXQgaXMgY2FsbGVkIGJ5IHJlc2V0ICovCiAJCXJzdF9vcHQgPSBPUFRfU1lTVEVNX1JFU0VUOwogCQlzdGFydGluZ19zdGF0ZSA9IEZXX0lOSVRfU1RFUDBfQk9PVDsKLQkJLy8gVE9ETzogc3lzdGVtIHJlc2V0CisJCS8qIFRPRE86IHN5c3RlbSByZXNldCAqLwogCiAJfSBlbHNlIGlmIChwZmlybXdhcmUtPmZpcm13YXJlX3N0YXR1cyA9PSBGV19TVEFUVVNfNV9SRUFEWSkgewogCQkvKiBpdCBpcyBjYWxsZWQgYnkgSW5pdGlhbGl6ZSAqLwpAQCAtMjgxLDcgKzI4MSw3IEBACiAJCWlmIChyc3Rfb3B0ID09IE9QVF9TWVNURU1fUkVTRVQpCiAJCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2VudHJ5KTsKIAotCQlpZiAocnRfc3RhdHVzICE9IFRSVUUpCisJCWlmICghcnRfc3RhdHVzKQogCQkJZ290byBkb3dubG9hZF9maXJtd2FyZV9mYWlsOwogCiAJCXN3aXRjaCAoaW5pdF9zdGVwKSB7CkBAIC0yOTEsNyArMjkxLDcgQEAKIAkJCSAqIHdpbGwgc2V0IHBvbGxpbmcgYml0IHdoZW4gZmlybXdhcmUgY29kZSBpcyBhbHNvIGNvbmZpZ3VyZWQKIAkJCSAqLwogCQkJcGZpcm13YXJlLT5maXJtd2FyZV9zdGF0dXMgPSBGV19TVEFUVVNfMV9NT1ZFX0JPT1RfQ09ERTsKLQkJCS8vbWRlbGF5KDEwMDApOworCQkJLyogbWRlbGF5KDEwMDApOyAqLwogCQkJLyoKIAkJCSAqIFRvIGluaXRpYWxpemUgSU1FTSwgQ1BVIG1vdmUgY29kZSAgZnJvbSAweDgwMDAwMDgwLAogCQkJICogaGVuY2UsIHdlIHNlbmQgMHg4MCBieXRlIHBhY2tldApAQCAtMzA0LDcgKzMwNCw3IEBACiAKIAkJCS8qIENoZWNrIFB1dCBDb2RlIE9LIGFuZCBUdXJuIE9uIENQVSAqLwogCQkJcnRfc3RhdHVzID0gQ1BVY2hlY2tfbWFpbmNvZGVva190dXJub25DUFUoZGV2KTsKLQkJCWlmIChydF9zdGF0dXMgIT0gVFJVRSkgeworCQkJaWYgKCFydF9zdGF0dXMpIHsKIAkJCQlSVF9UUkFDRShDT01QX0VSUiwgIkNQVWNoZWNrX21haW5jb2Rlb2tfdHVybm9uQ1BVIGZhaWwhXG4iKTsKIAkJCQlnb3RvIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw7CiAJCQl9CkBAIC0zMTgsNyArMzE4LDcgQEAKIAkJCW1kZWxheSgxKTsKIAogCQkJcnRfc3RhdHVzID0gQ1BVY2hlY2tfZmlybXdhcmVfcmVhZHkoZGV2KTsKLQkJCWlmIChydF9zdGF0dXMgIT0gVFJVRSkgeworCQkJaWYgKCFydF9zdGF0dXMpIHsKIAkJCQlSVF9UUkFDRShDT01QX0VSUiwgIkNQVWNoZWNrX2Zpcm13YXJlX3JlYWR5IGZhaWwoJWQpIVxuIixydF9zdGF0dXMpOwogCQkJCWdvdG8gZG93bmxvYWRfZmlybXdhcmVfZmFpbDsKIAkJCX0KQEAgLTMzMCwxMyArMzMwLDExIEBACiAJfQogCiAJUlRfVFJBQ0UoQ09NUF9GSVJNV0FSRSwgIkZpcm13YXJlIERvd25sb2FkIFN1Y2Nlc3NcbiIpOwotCS8vYXNzZXJ0KHBmaXJtd2FyZS0+ZmlybXdhcmVfc3RhdHVzID09IEZXX1NUQVRVU181X1JFQURZLCAoIkZpcm13YXJlIERvd25sb2FkIEZhaWxcbiIpKTsKLQogCXJldHVybiBydF9zdGF0dXM7CiAKIGRvd25sb2FkX2Zpcm13YXJlX2ZhaWw6CiAJUlRfVFJBQ0UoQ09NUF9FUlIsICJFUlIgaW4gJXMoKVxuIiwgX19mdW5jX18pOwotCXJ0X3N0YXR1cyA9IEZBTFNFOworCXJ0X3N0YXR1cyA9IGZhbHNlOwogCXJldHVybiBydF9zdGF0dXM7CiAKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODE5MnUvcjgxOXhVX3BoeS5jCmluZGV4IDA1ODk2MDIuLmU1ZGJhY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4MTkydS9yODE5eFVfcGh5LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDgxOTJ1L3I4MTl4VV9waHkuYwpAQCAtMTA2LDEwICsxMDYsMTAgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIGZ1bmN0aW9uOiAgVGhpcyBmdW5jdGlvbiByZWFkcyBzcGVjaWZpYyBiaXRzIGZyb20gQkIgcmVnaXN0ZXIKICAqIGlucHV0OiAgICAgbmV0X2RldmljZQkqZGV2Ci0gKiAgICAgICAgICAgIHUzMgkgCXJlZ19hZGRyICAgLy90YXJnZXQgYWRkciB0byBiZSByZWFkYmFjawotICogICAgICAgICAgICB1MzIJIAliaXRtYXNrICAgIC8vdGFnZXQgYml0IHBvcyB0byBiZSByZWFkYmFjaworICogICAgICAgICAgICB1MzIJCXJlZ19hZGRyICAgLy90YXJnZXQgYWRkciB0byBiZSByZWFkYmFjaworICogICAgICAgICAgICB1MzIJCWJpdG1hc2sgICAgLy90YWdldCBiaXQgcG9zIHRvIGJlIHJlYWRiYWNrCiAgKiBvdXRwdXQ6ICAgIG5vbmUKLSAqIHJldHVybjogICAgdTMyCSAJZGF0YSAgICAgICAvL3RoZSByZWFkYmFjayByZWdpc3RlciB2YWx1ZQorICogcmV0dXJuOiAgICB1MzIJCWRhdGEgICAgICAgLy90aGUgcmVhZGJhY2sgcmVnaXN0ZXIgdmFsdWUKICAqIG5vdGljZToKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiB1MzIgcnRsODE5Ml9RdWVyeUJCUmVnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiByZWdfYWRkciwgdTMyIGJpdG1hc2spCkBAIC0zNTIsMTYgKzM1MiwxNCBAQAogCQlyZXR1cm4gMDsKIAlpZiAocHJpdi0+UmZfTW9kZSA9PSBSRl9PUF9CeV9GVykgewogCQlyZWcgPSBwaHlfRndSRlNlcmlhbFJlYWQoZGV2LCBlUkZQYXRoLCByZWdfYWRkcik7Ci0JCWJpdHNoaWZ0ID0gIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoYml0bWFzayk7Ci0JCXJlZyA9IChyZWcgJiBiaXRtYXNrKSA+PiBiaXRzaGlmdDsKIAkJdWRlbGF5KDIwMCk7Ci0JCXJldHVybiByZWc7CiAJfSBlbHNlIHsKIAkJcmVnID0gcnRsODE5Ml9waHlfUkZTZXJpYWxSZWFkKGRldiwgZVJGUGF0aCwgcmVnX2FkZHIpOwotCQliaXRzaGlmdCA9ICBydGw4MTkyX0NhbGN1bGF0ZUJpdFNoaWZ0KGJpdG1hc2spOwotCQlyZWcgPSAocmVnICYgYml0bWFzaykgPj4gYml0c2hpZnQ7Ci0JCXJldHVybiByZWc7CiAJfQorCWJpdHNoaWZ0ID0gIHJ0bDgxOTJfQ2FsY3VsYXRlQml0U2hpZnQoYml0bWFzayk7CisJcmVnID0gKHJlZyAmIGJpdG1hc2spID4+IGJpdHNoaWZ0OworCXJldHVybiByZWc7CisKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNDc4LDcgKzQ3Niw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBmdW5jdGlvbjogIFRoaXMgZnVuY3Rpb24gcmVhZHMgQkIgcGFyYW1ldGVycyBmcm9tIGhlYWRlciBmaWxlIHdlIGdlbmVyYXRlLAogICogICAgICAgICAgICBhbmQgZG8gcmVnaXN0ZXIgcmVhZC93cml0ZQotICogaW5wdXQ6ICAgICBuZXRfZGV2aWNlIAkqZGV2CisgKiBpbnB1dDogICAgIG5ldF9kZXZpY2UJKmRldgogICogb3V0cHV0OiAgICBub25lCiAgKiByZXR1cm46ICAgIG5vbmUKICAqIG5vdGljZTogICAgQkIgcGFyYW1ldGVycyBtYXkgY2hhbmdlIGFsbCB0aGUgdGltZSwgc28gcGxlYXNlIG1ha2UKQEAgLTgyNSw4ICs4MjMsOCBAQAogCXdyaXRlX25pY19ieXRlX0UoZGV2LCAweDVlLCAweDAwKTsKIAlpZiAocHJpdi0+Y2FyZF84MTkyX3ZlcnNpb24gPT0gKHU4KVZFUlNJT05fODE5eFVfQSkgewogCQkvKiBBbnRlbm5hIGdhaW4gb2Zmc2V0IGZyb20gQi9DL0QgdG8gQSAqLwotCQlyZWdfdTMyID0gKHByaXYtPkFudGVubmFUeFB3RGlmZlsxXTw8NCB8Ci0JCQkgICBwcml2LT5BbnRlbm5hVHhQd0RpZmZbMF0pOworCQlyZWdfdTMyID0gcHJpdi0+QW50ZW5uYVR4UHdEaWZmWzFdPDw0IHwKKwkJCSAgIHByaXYtPkFudGVubmFUeFB3RGlmZlswXTsKIAkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIHJGUEdBMF9UeEdhaW5TdGFnZSwgKGJYQlR4QUdDfGJYQ1R4QUdDKSwKIAkJCQkgcmVnX3UzMik7CiAKQEAgLTkwMCw3ICs4OTgsNyBAQAogCXJlYWRfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjMsICZwcml2LT5mcmFtZXN5bmMpOwogCXJlYWRfbmljX2J5dGUoZGV2LCByT0ZETTBfUnhEZXRlY3RvcjIsICZ0bXApOwogCXByaXYtPmZyYW1lc3luY0MzNCA9IHRtcDsKLQlSVF9UUkFDRShDT01QX0lOSVQsICJEZWZhdWx0IGZyYW1lc3luYyAoMHgleCkgPSAweCV4IFxuIiwKKwlSVF9UUkFDRShDT01QX0lOSVQsICJEZWZhdWx0IGZyYW1lc3luYyAoMHgleCkgPSAweCV4XG4iLAogCQlyT0ZETTBfUnhEZXRlY3RvcjMsIHByaXYtPmZyYW1lc3luYyk7CiAKIAkvKiBSZWFkIFNJRlMgKHNhdmUgdGhlIHZhbHVlIHJlYWQgZm9tZSBNQUNQSFlfUkVHLnR4dCkgKi8KQEAgLTExMDEsNyArMTA5OSw3IEBACiAJaWYgKGVSRlBvd2VyU3RhdGUgPT0gcHJpdi0+aWVlZTgwMjExLT5lUkZQb3dlclN0YXRlKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAocHJpdi0+U2V0UkZQb3dlclN0YXRlSW5Qcm9ncmVzcyA9PSB0cnVlKQorCWlmIChwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlwcml2LT5TZXRSRlBvd2VyU3RhdGVJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTExODcsNyArMTE4NSw3IEBACiAJCQkJLyogVHVybiBvbiBSRiB3ZSBhcmUgc3RpbGwgbGlua2VkLCB3aGljaCBtaWdodAogCQkJCSAgIGhhcHBlbiB3aGVuIHdlIHF1aWNrbHkgdHVybiBvZmYgYW5kIG9uIEhXIFJGLgogCQkJCSAqLwotCQkJCWlmIChwTWdudEluZm8tPmJNZWRpYUNvbm5lY3QgPT0gVFJVRSkKKwkJCQlpZiAocE1nbnRJbmZvLT5iTWVkaWFDb25uZWN0KQogCQkJCQlBZGFwdGVyLT5IYWxGdW5jLkxlZENvbnRyb2xIYW5kbGVyKEFkYXB0ZXIsIExFRF9DVExfTElOSyk7CiAJCQkJZWxzZQogCQkJCQkvKiBUdXJuIG9mZiBMRUQgaWYgUkYgaXMgbm90IE9OLiAqLwpAQCAtMTM0NCw3ICsxMzQyLDYgQEAKIAlkZWZhdWx0OgogCQlSVF9UUkFDRShDT01QX0VSUiwgIlVua25vd24gUkZDaGlwSUQ6ICVkXG4iLCBwcml2LT5yZl9jaGlwKTsKIAkJcmV0dXJuIHRydWU7Ci0JCWJyZWFrOwogCX0KIAogCkBAIC0xMzY1LDExICsxMzYyLDEwIEBACiAJCQlpZiAoKCpzdGFnZSkgPT0gMikgewogCQkJCSgqZGVsYXkpID0gQ3VycmVudENtZC0+bXNEZWxheTsKIAkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJKCpzdGFnZSkrKzsKLQkJCQkoKnN0ZXApID0gMDsKLQkJCQljb250aW51ZTsKIAkJCX0KKwkJCSgqc3RhZ2UpKys7CisJCQkoKnN0ZXApID0gMDsKKwkJCWNvbnRpbnVlOwogCQl9CiAKIAkJc3dpdGNoIChDdXJyZW50Q21kLT5DbWRJRCkgewpAQCAtMTU3OSwxMCArMTU3NSwxMCBAQAogCQkJIHByaXYtPmNja19wcmVzZW50X2F0dGVudHVhdGlvbik7CiAKIAkJaWYgKHByaXYtPmNoYW4gPT0gMTQgJiYgIXByaXYtPmJjY2tfaW5fY2gxNCkgewotCQkJcHJpdi0+YmNja19pbl9jaDE0ID0gVFJVRTsKKwkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IHRydWU7CiAJCQlkbV9jY2tfdHhwb3dlcl9hZGp1c3QoZGV2LCBwcml2LT5iY2NrX2luX2NoMTQpOwogCQl9IGVsc2UgaWYgKHByaXYtPmNoYW4gIT0gMTQgJiYgcHJpdi0+YmNja19pbl9jaDE0KSB7Ci0JCQlwcml2LT5iY2NrX2luX2NoMTQgPSBGQUxTRTsKKwkJCXByaXYtPmJjY2tfaW5fY2gxNCA9IGZhbHNlOwogCQkJZG1fY2NrX3R4cG93ZXJfYWRqdXN0KGRldiwgcHJpdi0+YmNja19pbl9jaDE0KTsKIAkJfSBlbHNlIHsKIAkJCWRtX2Nja190eHBvd2VyX2FkanVzdChkZXYsIHByaXYtPmJjY2tfaW5fY2gxNCk7CkBAIC0xNzQ2LDEzICsxNzQyLDEzIEBACiAJCVJUX1RSQUNFKENPTVBfU0NBTiwgIlNjYW4gSW5pdGlhbEdhaW5CYWNrdXAgMHhhMGEgaXMgJXhcbiIsCiAJCQkgcHJpdi0+aW5pdGdhaW5fYmFja3VwLmNjYSk7CiAKLQkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiV3JpdGUgc2NhbiBpbml0aWFsIGdhaW4gPSAweCV4IFxuIiwKKwkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiV3JpdGUgc2NhbiBpbml0aWFsIGdhaW4gPSAweCV4XG4iLAogCQkJIGluaXRpYWxfZ2Fpbik7CiAJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hBQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CiAJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hCQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CiAJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hDQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7CiAJCXdyaXRlX25pY19ieXRlKGRldiwgck9GRE0wX1hEQUdDQ29yZTEsIGluaXRpYWxfZ2Fpbik7Ci0JCVJUX1RSQUNFKENPTVBfU0NBTiwgIldyaXRlIHNjYW4gMHhhMGEgPSAweCV4IFxuIiwKKwkJUlRfVFJBQ0UoQ09NUF9TQ0FOLCAiV3JpdGUgc2NhbiAweGEwYSA9IDB4JXhcbiIsCiAJCQkgUE9XRVJfREVURUNUSU9OX1RIKTsKIAkJd3JpdGVfbmljX2J5dGUoZGV2LCAweGEwYSwgUE9XRVJfREVURUNUSU9OX1RIKTsKIAkJYnJlYWs7CkBAIC0xNzkzLDcgKzE3ODksNyBAQAogCQkJcnRsODE5Ml9zZXRCQnJlZyhkZXYsIFVGV1AsIGJNYXNrQnl0ZTEsIDB4MSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCVJUX1RSQUNFKENPTVBfU0NBTiwgIlVua25vd24gSUcgT3BlcmF0aW9uLiBcbiIpOworCQlSVF9UUkFDRShDT01QX1NDQU4sICJVbmtub3duIElHIE9wZXJhdGlvbi5cbiIpOwogCQlicmVhazsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9oYWxfaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvaGFsX2luaXQuYwppbmRleCAzMjRkYTM0Li4wYTFjNjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9oYWxfaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL2hhbF9pbml0LmMKQEAgLTkyLDcgKzkyLDcgQEAKIAogc3RhdGljIHZvaWQgZmlsbF9md3ByaXYoc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciwgc3RydWN0IGZ3X3ByaXYgKnBmd3ByaXYpCiB7Ci0Jc3RydWN0IGR2b2JqX3ByaXYgKnBkdm9iaiA9IChzdHJ1Y3QgZHZvYmpfcHJpdiAqKSZwYWRhcHRlci0+ZHZvYmpwcml2OworCXN0cnVjdCBkdm9ial9wcml2ICpwZHZvYmogPSAmcGFkYXB0ZXItPmR2b2JqcHJpdjsKIAlzdHJ1Y3QgcmVnaXN0cnlfcHJpdiAqcHJlZ3ByaXYgPSAmcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdjsKIAogCW1lbXNldChwZndwcml2LCAwLCBzaXplb2Yoc3RydWN0IGZ3X3ByaXYpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL21sbWVfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL21sbWVfbGludXguYwppbmRleCAzNTRiZDAzLi44YzVhNDc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9tbG1lX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvbWxtZV9saW51eC5jCkBAIC0zMiw2MCArMzIsNjEgQEAKICNpbmNsdWRlICJkcnZfdHlwZXMuaCIKICNpbmNsdWRlICJtbG1lX29zZGVwLmgiCiAKLXN0YXRpYyB2b2lkIHNpdGVzdXJ2ZXlfY3RybF9oYW5kbGVyKHZvaWQgKkZ1bmN0aW9uQ29udGV4dCkKK3N0YXRpYyB2b2lkIHNpdGVzdXJ2ZXlfY3RybF9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilkYXRhOwogCiAJX3I4NzEyX3NpdGVzdXJ2ZXlfY3RybF9oYW5kbGVyKGFkYXB0ZXIpOwotCV9zZXRfdGltZXIoJmFkYXB0ZXItPm1sbWVwcml2LnNpdGVzdXJ2ZXljdHJsLnNpdGVzdXJ2ZXlfY3RybF90aW1lciwKLQkJICAgMzAwMCk7CisJbW9kX3RpbWVyKCZhZGFwdGVyLT5tbG1lcHJpdi5zaXRlc3VydmV5Y3RybC5zaXRlc3VydmV5X2N0cmxfdGltZXIsCisJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMzAwMCkpOwogfQogCi1zdGF0aWMgdm9pZCBqb2luX3RpbWVvdXRfaGFuZGxlciAodm9pZCAqRnVuY3Rpb25Db250ZXh0KQorc3RhdGljIHZvaWQgam9pbl90aW1lb3V0X2hhbmRsZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilkYXRhOwogCiAJX3I4NzEyX2pvaW5fdGltZW91dF9oYW5kbGVyKGFkYXB0ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBfc2Nhbl90aW1lb3V0X2hhbmRsZXIgKHZvaWQgKkZ1bmN0aW9uQ29udGV4dCkKK3N0YXRpYyB2b2lkIF9zY2FuX3RpbWVvdXRfaGFuZGxlciAodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKWRhdGE7CiAKIAlyODcxMl9zY2FuX3RpbWVvdXRfaGFuZGxlcihhZGFwdGVyKTsKIH0KIAotc3RhdGljIHZvaWQgZGhjcF90aW1lb3V0X2hhbmRsZXIgKHZvaWQgKkZ1bmN0aW9uQ29udGV4dCkKK3N0YXRpYyB2b2lkIGRoY3BfdGltZW91dF9oYW5kbGVyICh1bnNpZ25lZCBsb25nIGRhdGEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopZGF0YTsKIAogCV9yODcxMl9kaGNwX3RpbWVvdXRfaGFuZGxlcihhZGFwdGVyKTsKIH0KIAotc3RhdGljIHZvaWQgd2RnX3RpbWVvdXRfaGFuZGxlciAodm9pZCAqRnVuY3Rpb25Db250ZXh0KQorc3RhdGljIHZvaWQgd2RnX3RpbWVvdXRfaGFuZGxlciAodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilGdW5jdGlvbkNvbnRleHQ7CisJc3RydWN0IF9hZGFwdGVyICphZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKWRhdGE7CiAKIAlfcjg3MTJfd2RnX3RpbWVvdXRfaGFuZGxlcihhZGFwdGVyKTsKIAotCV9zZXRfdGltZXIoJmFkYXB0ZXItPm1sbWVwcml2LndkZ190aW1lciwgMjAwMCk7CisJbW9kX3RpbWVyKCZhZGFwdGVyLT5tbG1lcHJpdi53ZGdfdGltZXIsCisJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOwogfQogCiB2b2lkIHI4NzEyX2luaXRfbWxtZV90aW1lcihzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKQogewogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKLQlfaW5pdF90aW1lcigmKHBtbG1lcHJpdi0+YXNzb2NfdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwKLQkJICAgIGpvaW5fdGltZW91dF9oYW5kbGVyLCAocG1sbWVwcml2LT5uaWNfaGRsKSk7Ci0JX2luaXRfdGltZXIoJihwbWxtZXByaXYtPnNpdGVzdXJ2ZXljdHJsLnNpdGVzdXJ2ZXlfY3RybF90aW1lciksCi0JCSAgICBwYWRhcHRlci0+cG5ldGRldiwgc2l0ZXN1cnZleV9jdHJsX2hhbmRsZXIsCi0JCSAgICAodTggKikocG1sbWVwcml2LT5uaWNfaGRsKSk7Ci0JX2luaXRfdGltZXIoJihwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwKLQkJICAgIF9zY2FuX3RpbWVvdXRfaGFuZGxlciwgKHBtbG1lcHJpdi0+bmljX2hkbCkpOwotCV9pbml0X3RpbWVyKCYocG1sbWVwcml2LT5kaGNwX3RpbWVyKSwgcGFkYXB0ZXItPnBuZXRkZXYsCi0JCSAgICBkaGNwX3RpbWVvdXRfaGFuZGxlciwgKHU4ICopKHBtbG1lcHJpdi0+bmljX2hkbCkpOwotCV9pbml0X3RpbWVyKCYocG1sbWVwcml2LT53ZGdfdGltZXIpLCBwYWRhcHRlci0+cG5ldGRldiwKLQkJICAgIHdkZ190aW1lb3V0X2hhbmRsZXIsICh1OCAqKShwbWxtZXByaXYtPm5pY19oZGwpKTsKKwlzZXR1cF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgam9pbl90aW1lb3V0X2hhbmRsZXIsCisJCSAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7CisJc2V0dXBfdGltZXIoJnBtbG1lcHJpdi0+c2l0ZXN1cnZleWN0cmwuc2l0ZXN1cnZleV9jdHJsX3RpbWVyLAorCQkgICAgc2l0ZXN1cnZleV9jdHJsX2hhbmRsZXIsCisJCSAgICAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7CisJc2V0dXBfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwgX3NjYW5fdGltZW91dF9oYW5kbGVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPmRoY3BfdGltZXIsIGRoY3BfdGltZW91dF9oYW5kbGVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwbWxtZXByaXYtPndkZ190aW1lciwgd2RnX3RpbWVvdXRfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKXBhZGFwdGVyKTsKIH0KIAogdm9pZCByODcxMl9vc19pbmRpY2F0ZV9jb25uZWN0KHN0cnVjdCBfYWRhcHRlciAqYWRhcHRlcikKQEAgLTExNyw5ICsxMTgsOSBAQAogCQkJCQkgICBidGtpcF9jb3VudGVybWVhc3VyZTsKIAkJbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopJmFkYXB0ZXItPnNlY3VyaXR5cHJpdiwgMCwKIAkJCSBzaXplb2Yoc3RydWN0IHNlY3VyaXR5X3ByaXYpKTsKLQkJX2luaXRfdGltZXIoJihhZGFwdGVyLT5zZWN1cml0eXByaXYudGtpcF90aW1lciksCi0JCQkgICAgYWRhcHRlci0+cG5ldGRldiwgcjg3MTJfdXNlX3RraXBrZXlfaGFuZGxlciwKLQkJCSAgICBhZGFwdGVyKTsKKwkJc2V0dXBfdGltZXIoJmFkYXB0ZXItPnNlY3VyaXR5cHJpdi50a2lwX3RpbWVyLAorCQkJICAgIHI4NzEyX3VzZV90a2lwa2V5X2hhbmRsZXIsCisJCQkgICAgKHVuc2lnbmVkIGxvbmcpYWRhcHRlcik7CiAJCS8qIFJlc3RvcmUgdGhlIFBNSyBpbmZvcm1hdGlvbiB0byBzZWN1cml0eXByaXYgc3RydWN0dXJlCiAJCSAqIGZvciB0aGUgZm9sbG93aW5nIGNvbm5lY3Rpb24uICovCiAJCW1lbWNweSgmYWRhcHRlci0+c2VjdXJpdHlwcml2LlBNS0lETGlzdFswXSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc19pbnRmcy5jCmluZGV4IDEzZGViYjUuLjZlNzc2ZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zX2ludGZzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NfaW50ZnMuYwpAQCAtMTc3LDcgKzE3Nyw3IEBACiAKIHN0YXRpYyBpbnQgcjg3MXhfbmV0X3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqcG5ldGRldiwgdm9pZCAqcCkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KHBuZXRkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAlzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSBwOwogCiAJaWYgKHBhZGFwdGVyLT5idXAgPT0gZmFsc2UpCkBAIC0xODcsNyArMTg3LDcgQEAKIAogc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpyODcxeF9uZXRfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KHBuZXRkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAlzdHJ1Y3QgeG1pdF9wcml2ICpweG1pdHByaXYgPSAmKHBhZGFwdGVyLT54bWl0cHJpdik7CiAJc3RydWN0IHJlY3ZfcHJpdiAqcHJlY3Zwcml2ID0gJihwYWRhcHRlci0+cmVjdnByaXYpOwogCkBAIC0yMjEsNyArMjIxLDcgQEAKIAkJc3RyY3B5KGlmbmFtZSwgIndsYW4lZCIpOwogCQlkZXZfYWxsb2NfbmFtZShwbmV0ZGV2LCBpZm5hbWUpOwogCX0KLQlwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYocG5ldGRldik7CisJcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAlwYWRhcHRlci0+cG5ldGRldiA9IHBuZXRkZXY7CiAJcHJfaW5mbygicjg3MTJ1OiByZWdpc3RlciBydGw4NzEyX25ldGRldl9vcHMgdG8gbmV0ZGV2X29wc1xuIik7CiAJcG5ldGRldi0+bmV0ZGV2X29wcyA9ICZydGw4NzEyX25ldGRldl9vcHM7CkBAIC0yNTUsMjAgKzI1NSwyMCBAQAogCiBzdGF0aWMgdm9pZCBzdGFydF9kcnZfdGltZXJzKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIpCiB7Ci0JX3NldF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LnNpdGVzdXJ2ZXljdHJsLnNpdGVzdXJ2ZXlfY3RybF90aW1lciwKLQkJICAgNTAwMCk7Ci0JX3NldF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LndkZ190aW1lciwgMjAwMCk7CisJbW9kX3RpbWVyKCZwYWRhcHRlci0+bWxtZXByaXYuc2l0ZXN1cnZleWN0cmwuc2l0ZXN1cnZleV9jdHJsX3RpbWVyLAorCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwMDApKTsKKwltb2RfdGltZXIoJnBhZGFwdGVyLT5tbG1lcHJpdi53ZGdfdGltZXIsCisJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjAwMCkpOwogfQogCiB2b2lkIHI4NzEyX3N0b3BfZHJ2X3RpbWVycyhzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyKQogewotCV9jYW5jZWxfdGltZXJfZXgoJnBhZGFwdGVyLT5tbG1lcHJpdi5hc3NvY190aW1lcik7Ci0JX2NhbmNlbF90aW1lcl9leCgmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi50a2lwX3RpbWVyKTsKLQlfY2FuY2VsX3RpbWVyX2V4KCZwYWRhcHRlci0+bWxtZXByaXYuc2Nhbl90b190aW1lcik7Ci0JX2NhbmNlbF90aW1lcl9leCgmcGFkYXB0ZXItPm1sbWVwcml2LmRoY3BfdGltZXIpOwotCV9jYW5jZWxfdGltZXJfZXgoJnBhZGFwdGVyLT5tbG1lcHJpdi53ZGdfdGltZXIpOwotCV9jYW5jZWxfdGltZXJfZXgoJnBhZGFwdGVyLT5tbG1lcHJpdi5zaXRlc3VydmV5Y3RybC4KLQkJCSBzaXRlc3VydmV5X2N0cmxfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+bWxtZXByaXYuYXNzb2NfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+c2VjdXJpdHlwcml2LnRraXBfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+bWxtZXByaXYuc2Nhbl90b190aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5tbG1lcHJpdi5kaGNwX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPm1sbWVwcml2LndkZ190aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5tbG1lcHJpdi5zaXRlc3VydmV5Y3RybC5zaXRlc3VydmV5X2N0cmxfdGltZXIpOwogfQogCiBzdGF0aWMgdTggaW5pdF9kZWZhdWx0X3ZhbHVlKHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIpCkBAIC0zMjIsOCArMzIyLDggQEAKIAlfcjg3MTJfaW5pdF9yZWN2X3ByaXYoJnBhZGFwdGVyLT5yZWN2cHJpdiwgcGFkYXB0ZXIpOwogCW1lbXNldCgodW5zaWduZWQgY2hhciAqKSZwYWRhcHRlci0+c2VjdXJpdHlwcml2LCAwLAogCSAgICAgICBzaXplb2Yoc3RydWN0IHNlY3VyaXR5X3ByaXYpKTsKLQlfaW5pdF90aW1lcigmKHBhZGFwdGVyLT5zZWN1cml0eXByaXYudGtpcF90aW1lciksIHBhZGFwdGVyLT5wbmV0ZGV2LAotCQkgICAgcjg3MTJfdXNlX3RraXBrZXlfaGFuZGxlciwgcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwYWRhcHRlci0+c2VjdXJpdHlwcml2LnRraXBfdGltZXIsCisJCSAgICByODcxMl91c2VfdGtpcGtleV9oYW5kbGVyLCAodW5zaWduZWQgbG9uZylwYWRhcHRlcik7CiAJX3I4NzEyX2luaXRfc3RhX3ByaXYoJnBhZGFwdGVyLT5zdGFwcml2KTsKIAlwYWRhcHRlci0+c3RhcHJpdi5wYWRhcHRlciA9IHBhZGFwdGVyOwogCXI4NzEyX2luaXRfYmNtY19zdGFpbmZvKHBhZGFwdGVyKTsKQEAgLTM4NCw3ICszODQsNyBAQAogICovCiBzdGF0aWMgaW50IG5ldGRldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYocG5ldGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KHBuZXRkZXYpOwogCiAJbXV0ZXhfbG9jaygmcGFkYXB0ZXItPm11dGV4X3N0YXJ0KTsKIAlpZiAocGFkYXB0ZXItPmJ1cCA9PSBmYWxzZSkgewpAQCAtNDUyLDcgKzQ1Miw3IEBACiAgKi8KIHN0YXRpYyBpbnQgbmV0ZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpwbmV0ZGV2KQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KHBuZXRkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihwbmV0ZGV2KTsKIAogCS8qIENsb3NlIExFRCovCiAJcGFkYXB0ZXItPmxlZHByaXYuTGVkQ29udHJvbEhhbmRsZXIocGFkYXB0ZXIsIExFRF9DVExfUE9XRVJfT0ZGKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL29zZGVwX3NlcnZpY2UuaAppbmRleCAzNjM0OGQ5Li4wYTdmNThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9vc2RlcF9zZXJ2aWNlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvb3NkZXBfc2VydmljZS5oCkBAIC02MCwyNiArNjAsNiBAQAogI2RlZmluZSBMSVNUX0NPTlRBSU5PUihwdHIsIHR5cGUsIG1lbWJlcikgXAogCSgodHlwZSAqKSgoY2hhciAqKShwdHIpLShTSVpFX1QpKCYoKHR5cGUgKikwKS0+bWVtYmVyKSkpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfaW5pdF90aW1lcihzdHJ1Y3QgdGltZXJfbGlzdCAqcHRpbWVyLAotCQkJICAgICAgIHN0cnVjdCAgbmV0X2RldmljZSAqcGFkYXB0ZXIsCi0JCQkgICAgICAgdm9pZCAqcGZ1bmMsIHZvaWQgKmNudHgpCi17Ci0JcHRpbWVyLT5mdW5jdGlvbiA9IHBmdW5jOwotCXB0aW1lci0+ZGF0YSA9IChhZGRyX3QpY250eDsKLQlpbml0X3RpbWVyKHB0aW1lcik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfc2V0X3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICpwdGltZXIsIHUzMiBkZWxheV90aW1lKQotewotCW1vZF90aW1lcihwdGltZXIsIChqaWZmaWVzK21zZWNzX3RvX2ppZmZpZXMoZGVsYXlfdGltZSkpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9jYW5jZWxfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnB0aW1lciwgdTggKmJjYW5jZWxsZWQpCi17Ci0JZGVsX3RpbWVyKHB0aW1lcik7Ci0JKmJjYW5jZWxsZWQgPSB0cnVlOyAvKnRydWUgPT0xOyBmYWxzZT09MCovCi19Ci0KICNpZm5kZWYgQklUCiAJI2RlZmluZSBCSVQoeCkJKDEgPDwgKHgpKQogI2VuZGlmCkBAIC0xMDYsMTEgKzg2LDYgQEAKIAlzY2hlZHVsZV90aW1lb3V0KGRlbHRhKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyIF9jYW5jZWxfdGltZXJfZXgoc3RydWN0IHRpbWVyX2xpc3QgKnB0aW1lcikKLXsKLQlyZXR1cm4gZGVsX3RpbWVyKHB0aW1lcik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9zaWduYWxzX3RocmVhZCh2b2lkKQogewogCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3JlY3ZfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3JlY3ZfbGludXguYwppbmRleCA0MDljOGM4Li43OTlhMGY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9yZWN2X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcmVjdl9saW51eC5jCkBAIC05Niw3ICs5Niw3IEBACiAJZWxzZQogCQlldi5mbGFncyB8PSBJV19NSUNGQUlMVVJFX1BBSVJXSVNFOwogCWV2LnNyY19hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQltZW1jcHkoZXYuc3JjX2FkZHIuc2FfZGF0YSwgJnBtbG1lcHJpdi0+YXNzb2NfYnNzaWRbMF0sIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoZXYuc3JjX2FkZHIuc2FfZGF0YSwgJnBtbG1lcHJpdi0+YXNzb2NfYnNzaWRbMF0pOwogCW1lbXNldCgmd3JxdSwgMHgwMCwgc2l6ZW9mKHdycXUpKTsKIAl3cnF1LmRhdGEubGVuZ3RoID0gc2l6ZW9mKGV2KTsKIAl3aXJlbGVzc19zZW5kX2V2ZW50KHBhZGFwdGVyLT5wbmV0ZGV2LCBJV0VWTUlDSEFFTE1JQ0ZBSUxVUkUsICZ3cnF1LApAQCAtMTM3LDE4ICsxMzcsMTcgQEAKIAkgcHJlY3Zwcml2LT5yeF9kcm9wKys7CiB9CiAKLXN0YXRpYyB2b2lkIF9yODcxMl9yZW9yZGVyaW5nX2N0cmxfdGltZW91dF9oYW5kbGVyICh2b2lkICpGdW5jdGlvbkNvbnRleHQpCitzdGF0aWMgdm9pZCBfcjg3MTJfcmVvcmRlcmluZ19jdHJsX3RpbWVvdXRfaGFuZGxlciAodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCA9Ci0JCQkgKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqKUZ1bmN0aW9uQ29udGV4dDsKKwkJCSAoc3RydWN0IHJlY3ZfcmVvcmRlcl9jdHJsICopZGF0YTsKIAogCXI4NzEyX3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIocHJlb3JkZXJfY3RybCk7CiB9CiAKIHZvaWQgcjg3MTJfaW5pdF9yZWN2X3RpbWVyKHN0cnVjdCByZWN2X3Jlb3JkZXJfY3RybCAqcHJlb3JkZXJfY3RybCkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gcHJlb3JkZXJfY3RybC0+cGFkYXB0ZXI7Ci0KLQlfaW5pdF90aW1lcigmKHByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lciksIHBhZGFwdGVyLT5wbmV0ZGV2LAotCQkgICAgX3I4NzEyX3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIsIHByZW9yZGVyX2N0cmwpOworCXNldHVwX3RpbWVyKCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIsCisJCSAgICAgX3I4NzEyX3Jlb3JkZXJpbmdfY3RybF90aW1lb3V0X2hhbmRsZXIsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpcHJlb3JkZXJfY3RybCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2NtZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9jbWQuYwppbmRleCA2MmU1M2NjLi4wMDdmMGEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfY21kLmMKQEAgLTk1LDcgKzk1LDcgQEAKIAkJCXZhbDMyID0gcjg3MTJfcmVhZDMyKHBhZGFwdGVyLCBJT0NNRF9EQVRBX1JFRyk7CiAJCWVsc2UgLyogdGltZSBvdXQgKi8KIAkJCXZhbDMyID0gMDsKLQkJdmFsMzIgPSB2YWwzMiA+PiA0OworCQl2YWwzMiA+Pj0gNDsKIAkJcGFkYXB0ZXItPnJlY3Zwcml2LmZ3X3Jzc2kgPQogCQkJICh1OClyODcxMl9zaWduYWxfc2NhbGVfbWFwcGluZyh2YWwzMik7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9sZWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MTJfbGVkLmMKaW5kZXggNTZlOGFkZC4uZjFkNDdhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9sZWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX2xlZC5jCkBAIC05Nyw3ICs5Nyw4IEBACiAJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCXBMZWQtPkJsaW5rVGltZXMgPSAwOwogCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfVU5LTk9XTjsKLQlfaW5pdF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBuaWMsIEJsaW5rVGltZXJDYWxsYmFjaywgcExlZCk7CisJc2V0dXBfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIEJsaW5rVGltZXJDYWxsYmFjaywKKwkJICAgICh1bnNpZ25lZCBsb25nKXBMZWQpOwogCUlOSVRfV09SSygmcExlZC0+QmxpbmtXb3JrSXRlbSwgQmxpbmtXb3JrSXRlbUNhbGxiYWNrKTsKIH0KIApAQCAtMTA3LDcgKzEwOCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIERlSW5pdExlZDg3MXgoc3RydWN0IExFRF84NzF4ICpwTGVkKQogewotCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCS8qIFdlIHNob3VsZCByZXNldCBiTGVkQmxpbmtJblByb2dyZXNzIGlmIHdlIGNhbmNlbAogCSAqIHRoZSBMZWRDb250cm9sVGltZXIsICovCiAJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwpAQCAtMjU4LDIxICsyNTksMjEgQEAKIAkJLyogU2NoZWR1bGUgYSB0aW1lciB0byB0b2dnbGUgTEVEIHN0YXRlLiAqLwogCQlzd2l0Y2ggKHBMZWQtPkN1cnJMZWRTdGF0ZSkgewogCQljYXNlIExFRF9CTElOS19OT1JNQUw6Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCQlicmVhazsKIAkJY2FzZSBMRURfQkxJTktfU0xPV0xZOgogCQljYXNlIExFRF9CTElOS19TdGFydFRvQmxpbms6Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NMT1dMWV9JTlRFUlZBTCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKSk7CiAJCQlicmVhazsKIAkJY2FzZSBMRURfQkxJTktfV1BTOgotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCQlMRURfQkxJTktfTE9OR19JTlRFUlZBTCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTE9OR19JTlRFUlZBTCkpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NMT1dMWV9JTlRFUlZBTCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKSk7CiAJCQlicmVhazsKIAkJfQogCX0KQEAgLTMxNSwxNiArMzE2LDE2IEBACiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX05PUk1BTDoKIAkJaWYgKHBMZWQtPmJMZWRPbikKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQllbHNlCiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkgICBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfU0NBTl9CTElOSzoKIAkJcExlZC0+QmxpbmtUaW1lcy0tOwpAQCAtMzM4LDggKzMzOSw4IEBACiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJCWVsc2UKIAkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJCSAgIExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewogCQkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CkBAIC0zNDcsOCArMzQ4LDggQEAKIAkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQkJZWxzZQogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJfQogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKQEAgLTM1Niw4ICszNTcsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9UWFJYX0JMSU5LOgpAQCAtMzcyLDggKzM3Myw4IEBACiAJCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJCWVsc2UKIAkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJCSAgIExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCX0gZWxzZSBpZiAoIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKSkgewogCQkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9CTElOS19TTE9XTFk7CkBAIC0zODEsOCArMzgyLDggQEAKIAkJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQkJZWxzZQogCQkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJfQogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDA7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CkBAIC0zOTEsOCArMzkyLDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQUzoKQEAgLTQwMCwxNCArNDAxLDE0IEBACiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQU19TVE9QOgkvKiBXUFMgc3VjY2VzcyAqLwogCQlpZiAocExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9PSBMRURfT04pIHsKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19XUFNfU1VDRVNTX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19XUFNfU1VDRVNTX0lOVEVSVkFMX0FMUEhBKSk7CiAJCQliU3RvcEJsaW5raW5nID0gZmFsc2U7CiAJCX0gZWxzZQogCQkJYlN0b3BCbGlua2luZyA9IHRydWU7CkBAIC00MTgsOCArNDE5LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQlicmVhazsKQEAgLTQ2MCw4ICs0NjEsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9UWFJYX0JMSU5LOgpAQCAtNDg0LDggKzQ4NSw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtNTI4LDggKzUyOSw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX1RYUlhfQkxJTks6CkBAIC01NTQsOCArNTU1LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQUzoKQEAgLTU2MywxNCArNTY0LDE0IEBACiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQU19TVE9QOgkvKldQUyBzdWNjZXNzKi8KIAkJaWYgKHBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPT0gTEVEX09OKSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSkpOwogCQkJYlN0b3BCbGlua2luZyA9IGZhbHNlOwogCQl9IGVsc2UKIAkJCWJTdG9wQmxpbmtpbmcgPSB0cnVlOwpAQCAtNjEwLDE4ICs2MTEsMTggQEAKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQllbHNlCiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkgICBMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfU3RhcnRUb0JsaW5rOgogCQlpZiAocExlZC0+YkxlZE9uKSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpKTsKIAkJfSBlbHNlIHsKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfU0NBTl9CTElOSzoKQEAgLTYzNSwxNiArNjM2LDE2IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCWlmIChwTGVkLT5iTGVkT24pCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX1RYUlhfQkxJTks6CkBAIC02NTgsMjcgKzY1OSwyNyBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlIHsKIAkJCSBpZiAocExlZC0+YkxlZE9uKQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfV1BTOgogCQlpZiAocExlZC0+YkxlZE9uKSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpKTsKIAkJfSBlbHNlIHsKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQkxJTktfV1BTX1NUT1A6CS8qV1BTIGF1dGhlbnRpY2F0aW9uIGZhaWwqLwpAQCAtNjg2LDcgKzY4Nyw4IEBACiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCBMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQU19TVE9QX09WRVJMQVA6CS8qV1BTIHNlc3Npb24gb3ZlcmxhcCAqLwogCQlwTGVkLT5CbGlua1RpbWVzLS07CkBAIC02OTksMTUgKzcwMSwxNSBAQAogCQlpZiAoYlN0b3BCbGlua2luZykgewogCQkJcExlZC0+QmxpbmtUaW1lcyA9IDEwOwogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQl9IGVsc2UgewogCQkJaWYgKHBMZWQtPmJMZWRPbikKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC03MzQsMTYgKzczNiwxNiBAQAogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09OOwogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKIAkJCWlmICghcExlZC0+YkxlZE9uKQotCQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkJICAgTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSk7CisJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQlpZiAocExlZC0+YkxlZE9uKQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9UWFJYX0JMSU5LOgpAQCAtNzU0LDE2ICs3NTYsMTYgQEAKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CiAJCQlpZiAoIXBMZWQtPmJMZWRPbikKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJCSAgIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0gZWxzZSB7CiAJCQkgaWYgKHBMZWQtPmJMZWRPbikKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC03OTcsOCArNzk5LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0JMSU5LX1dQUzoKQEAgLTgwNiw3ICs4MDgsOCBAQAogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWVsc2UKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTg5NSwxMSArODk4LDExIEBACiAJCQkgIElTX0xFRF9XUFNfQkxJTktJTkcocExlZCkpCiAJCQkJcmV0dXJuOwogCQkJaWYgKHBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtOTA4LDggKzkxMSw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9MSU5LOgpAQCAtOTE4LDExICs5MjEsMTEgQEAKIAkJCSAgICBJU19MRURfV1BTX0JMSU5LSU5HKHBMZWQpKQogCQkJCXJldHVybjsKIAkJCWlmIChwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtOTMxLDggKzkzNCw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTElOS19JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TSVRFX1NVUlZFWToKQEAgLTk0MywxNSArOTQ2LDE1IEBACiAJCQlpZiAoSVNfTEVEX1dQU19CTElOS0lORyhwTGVkKSkKIAkJCQlyZXR1cm47CiAJCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJaWYgKHBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQkgcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC05NjEsOCArOTY0LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCSB9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9UWDoKQEAgLTk3MiwxMSArOTc1LDExIEBACiAJCQkgICAgSVNfTEVEX1dQU19CTElOS0lORyhwTGVkKSkKIAkJCQlyZXR1cm47CiAJCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJaWYgKHBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC05ODYsOCArOTg5LDggQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCkBAIC05OTUsMTkgKzk5OCwxOSBAQAogCWNhc2UgTEVEX0NUTF9TVEFSVF9XUFNfQk9UVE9OOgogCQkgaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPT0gZmFsc2UpIHsKIAkJCWlmIChwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlpZiAocExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCSBwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCWlmIChwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwpAQCAtMTAxNiw0NCArMTAxOSw0NSBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfU1RPUF9XUFM6CiAJCWlmIChwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkgcExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCWVsc2UKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTX1NUT1A7CiAJCWlmIChwTGVkLT5iTGVkT24pIHsKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19XUFNfU1VDRVNTX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19XUFNfU1VDRVNTX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0gZWxzZSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfU1RPUF9XUFNfRkFJTDoKIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xMDYyLDMzICsxMDY2LDM0IEBACiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZExpbmtCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMTExMSw3ICsxMTE2LDcgQEAKIAkJCQlyZXR1cm47CiAKIAkJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xMTIxLDggKzExMjYsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJIH0KIAkJYnJlYWs7CiAKQEAgLTExNDAsOCArMTE0NSw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIApAQCAtMTE0OSwzMiArMTE1NCwzNCBAQAogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CiAJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CiAKIAljYXNlIExFRF9DVExfU1RBUlRfV1BTOiAvKndhaXQgdW50aWwgeGlucGluIGZpbmlzaCovCiAJY2FzZSBMRURfQ1RMX1NUQVJUX1dQU19CT1RUT046CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID09IGZhbHNlKSB7CiAJCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJaWYgKHBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJIH0KIAkJYnJlYWs7CiAKQEAgLTExODIsMTQgKzExODksMTYgQEAKIAkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQlicmVhazsKIAogCWNhc2UgTEVEX0NUTF9TVE9QX1dQU19GQUlMOgogCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CiAKIAljYXNlIExFRF9DVExfU1RBUlRfVE9fTElOSzoKQEAgLTExOTcsMjUgKzEyMDYsMjcgQEAKIAkJaWYgKCFJU19MRURfQkxJTktJTkcocExlZCkpIHsKIAkJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1BPV0VSX09GRjoKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKIAkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMTIzNyw3ICsxMjQ4LDcgQEAKIAkJCWlmIChJU19MRURfV1BTX0JMSU5LSU5HKHBMZWQpKQogCQkJCXJldHVybjsKIAkJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xMjQ3LDggKzEyNTgsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX1NDQU5fSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfVFg6CkBAIC0xMjY1LDggKzEyNzYsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX0xJTks6CkBAIC0xMjc1LDI0ICsxMjg2LDI1IEBACiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PTjsKIAkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKIAkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUQVJUX1dQUzogLyogd2FpdCB1bnRpbCB4aW5waW4gZmluaXNoICovCiAJY2FzZSBMRURfQ1RMX1NUQVJUX1dQU19CT1RUT046CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID09IGZhbHNlKSB7CiAJCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJaWYgKHBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xMzAxLDU5ICsxMzEzLDYzIEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVE9QX1dQUzoKIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmKHBMZWQtPkJsaW5rVGltZXIpKTsKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfSBlbHNlCiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQU19TVE9QOwogCQlpZiAocExlZC0+YkxlZE9uKSB7CiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfV1BTX1NVQ0VTU19JTlRFUlZBTF9BTFBIQSkpOwogCQl9IGVsc2UgewogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTX0ZBSUw6CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUQVJUX1RPX0xJTks6CiAJY2FzZSBMRURfQ1RMX05PX0xJTks6CiAJCWlmICghSVNfTEVEX0JMSU5LSU5HKHBMZWQpKSB7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAorCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKQEAgLTEzNzIsMzQgKzEzODgsMzUgQEAKIAljYXNlIExFRF9DVExfU1RBUlRfVE9fTElOSzoKIAkJaWYgKHBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7CiAJCQlwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQxLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZDEtPkJsaW5rVGltZXIpOwogCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJcExlZDEtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQlpZiAocExlZDEtPmJMZWRPbikKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRTdGFydFRvTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSBmYWxzZSkgewogCQkJaWYgKHBMZWQtPkN1cnJMZWRTdGF0ZSA9PSBMRURfU0NBTl9CTElOSyB8fAogCQkJICAgIElTX0xFRF9XUFNfQkxJTktJTkcocExlZCkpCiAJCQkJcmV0dXJuOwogCQkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCWlmIChwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlwTGVkLT5iTGVkU3RhcnRUb0xpbmtCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1N0YXJ0VG9CbGluazsKIAkJCWlmIChwTGVkLT5iTGVkT24pIHsKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJCSAgIExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0xPV0xZX0lOVEVSVkFMKSk7CiAJCQl9IGVsc2UgewogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCQkgICBMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKTsKKwkJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PUk1BTF9JTlRFUlZBTCkpOwogCQkJfQogCQl9CiAJCWJyZWFrOwpAQCAtMTQwOSwxMSArMTQyNiwxMiBAQAogCQlpZiAoTGVkQWN0aW9uID09IExFRF9DVExfTElOSykgewogCQkJaWYgKHBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7CiAJCQkJcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZDEtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZDEtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKIAkJCQlpZiAocExlZDEtPmJMZWRPbikKLQkJCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAorCQkJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCQl9CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWROb0xpbmtCbGlua0luUHJvZ3Jlc3MgPT0gZmFsc2UpIHsKQEAgLTE0MjEsNyArMTQzOSw3IEBACiAJCQkgICAgSVNfTEVEX1dQU19CTElOS0lORyhwTGVkKSkKIAkJCQlyZXR1cm47CiAJCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xNDMwLDggKzE0NDgsOCBAQAogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJZWxzZQogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfU0lURV9TVVJWRVk6CkBAIC0xNDQyLDExICsxNDYwLDExIEBACiAJCQlpZiAoSVNfTEVEX1dQU19CTElOS0lORyhwTGVkKSkKIAkJCQlyZXR1cm47CiAJCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTE0NTYsOCArMTQ3NCw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9UWDoKQEAgLTE0NjcsNyArMTQ4NSw3IEBACiAJCQkgICAgSVNfTEVEX1dQU19CTElOS0lORyhwTGVkKSkKIAkJCQlyZXR1cm47CiAJCQlpZiAocExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xNDc3LDQ5ICsxNDk1LDUwIEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfRkFTVEVSX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIExFRF9DVExfU1RBUlRfV1BTOiAvKndhaXQgdW50aWwgeGlucGluIGZpbmlzaCovCiAJY2FzZSBMRURfQ1RMX1NUQVJUX1dQU19CT1RUT046CiAJCWlmIChwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewogCQkJcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkMS0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJihwTGVkMS0+QmxpbmtUaW1lcikpOwogCQkJcExlZDEtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQkJcExlZDEtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQlpZiAocExlZDEtPmJMZWRPbikKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIDApOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPT0gZmFsc2UpIHsKIAkJCWlmIChwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9PSB0cnVlKSB7Ci0JCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQkJcExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJaWYgKHBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQkJfQogCQkJcExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTOwogCQkJaWYgKHBMZWQtPmJMZWRPbikgewogCQkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwotCQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkJICAgTEVEX0JMSU5LX1NMT1dMWV9JTlRFUlZBTCk7CisJCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TTE9XTFlfSU5URVJWQUwpKTsKIAkJCX0gZWxzZSB7CiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkJCSAgIExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpOworCQkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfTk9STUFMX0lOVEVSVkFMKSk7CiAJCQl9CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTOgkvKldQUyBjb25uZWN0IHN1Y2Nlc3MqLwogCQlpZiAocExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTE1MjgsMTIgKzE1NDcsMTIgQEAKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQllbHNlCiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkgICBMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTX0ZBSUw6CS8qV1BTIGF1dGhlbnRpY2F0aW9uIGZhaWwqLwogCQlpZiAocExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTE1NDIsMTEgKzE1NjEsMTEgQEAKIAkJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQllbHNlCiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksCi0JCQkgICBMRURfQkxJTktfTk9fTElOS19JTlRFUlZBTF9BTFBIQSk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpKTsKIAkJLypMRUQxIHNldHRpbmdzKi8KIAkJaWYgKHBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKQotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQxLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZDEtPkJsaW5rVGltZXIpOwogCQllbHNlCiAJCQlwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CiAJCXBMZWQxLT5DdXJyTGVkU3RhdGUgPSBMRURfQkxJTktfV1BTX1NUT1A7CkBAIC0xNTU0LDExICsxNTczLDEyIEBACiAJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWVsc2UKIAkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTX0ZBSUxfT1ZFUkxBUDoJLypXUFMgc2Vzc2lvbiBvdmVybGFwKi8KIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IHRydWU7CkBAIC0xNTY3LDExICsxNTg3LDExIEBACiAJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJZWxzZQogCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJICAgTEVEX0JMSU5LX05PX0xJTktfSU5URVJWQUxfQUxQSEEpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT19MSU5LX0lOVEVSVkFMX0FMUEhBKSk7CiAJCS8qTEVEMSBzZXR0aW5ncyovCiAJCWlmIChwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkMS0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQxLT5CbGlua1RpbWVyKTsKIAkJZWxzZQogCQkJcExlZDEtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSB0cnVlOwogCQlwTGVkMS0+Q3VyckxlZFN0YXRlID0gTEVEX0JMSU5LX1dQU19TVE9QX09WRVJMQVA7CkBAIC0xNTgwLDM3ICsxNjAwLDM4IEBACiAJCQlwTGVkMS0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWVsc2UKIAkJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQlfc2V0X3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpOworCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19OT1JNQUxfSU5URVJWQUwpKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1BPV0VSX09GRjoKIAkJcExlZC0+Q3VyckxlZFN0YXRlID0gTEVEX09GRjsKIAkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCWlmIChwTGVkLT5iTGVkTm9MaW5rQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZE5vTGlua0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCWlmIChwTGVkLT5iTGVkTGlua0JsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRMaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFNjYW5CbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlpZiAocExlZC0+YkxlZFN0YXJ0VG9MaW5rQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJcExlZC0+YkxlZFN0YXJ0VG9MaW5rQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQxLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzKSB7Ci0JCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZDEtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkMS0+QmxpbmtUaW1lcik7CiAJCQlwTGVkMS0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcyA9IGZhbHNlOwogCQl9CiAJCXBMZWQxLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX1VOS05PV047CkBAIC0xNjQxLDcgKzE2NjIsOCBAQAogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CiAJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygwKSk7CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TSVRFX1NVUlZFWToKIAkJaWYgKChwbWxtZXByaXYtPnNpdGVzdXJ2ZXljdHJsLnRyYWZmaWNfYnVzeSkgJiYKQEAgLTE2NDksNyArMTY3MSw3IEBACiAJCQk7IC8qIGR1bW15IGJyYW5jaCAqLwogCQllbHNlIGlmIChwTGVkLT5iTGVkU2NhbkJsaW5rSW5Qcm9ncmVzcyA9PSBmYWxzZSkgewogCQkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPT0gdHJ1ZSkgewotCQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQkJZGVsX3RpbWVyX3N5bmMoJnBMZWQtPkJsaW5rVGltZXIpOwogCQkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJCX0KIAkJCXBMZWQtPmJMZWRTY2FuQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTE2NTksOCArMTY4MSw4IEBACiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCQllbHNlCiAJCQkJcExlZC0+QmxpbmtpbmdMZWRTdGF0ZSA9IExFRF9PTjsKLQkJCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwKLQkJCQkgICBMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSk7CisJCQltb2RfdGltZXIoJnBMZWQtPkJsaW5rVGltZXIsIGppZmZpZXMgKworCQkJCSAgbXNlY3NfdG9famlmZmllcyhMRURfQkxJTktfU0NBTl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9UWDoKQEAgLTE2NzUsMTUgKzE2OTcsMTUgQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9QT1dFUl9PRkY6CiAJCXBMZWQtPkN1cnJMZWRTdGF0ZSA9IExFRF9PRkY7CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT0ZGOwogCQlpZiAocExlZC0+YkxlZEJsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlTd0xlZE9mZihwYWRhcHRlciwgcExlZCk7CkBAIC0xNzExLDcgKzE3MzMsNyBAQAogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047CiAJCXBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLCAwKTsKKwkJbW9kX3RpbWVyKCYocExlZC0+QmxpbmtUaW1lciksIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDApKTsKIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1RYOgogCWNhc2UgTEVEX0NUTF9SWDoKQEAgLTE3MjYsMTUgKzE3NDgsMTUgQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19GQVNURVJfSU5URVJWQUxfQUxQSEEpOworCQkJbW9kX3RpbWVyKCZwTGVkLT5CbGlua1RpbWVyLCBqaWZmaWVzICsKKwkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTEVEX0JMSU5LX0ZBU1RFUl9JTlRFUlZBTF9BTFBIQSkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTEVEX0NUTF9TVEFSVF9XUFM6IC8qd2FpdCB1bnRpbCB4aW5waW4gZmluaXNoKi8KIAljYXNlIExFRF9DVExfU1RBUlRfV1BTX0JPVFRPTjoKIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPT0gZmFsc2UpIHsKIAkJCWlmIChwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID09IHRydWUpIHsKLQkJCQlfY2FuY2VsX3RpbWVyX2V4KCYocExlZC0+QmxpbmtUaW1lcikpOworCQkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCQl9CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gdHJ1ZTsKQEAgLTE3NDMsMjkgKzE3NjUsMzAgQEAKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJCWVsc2UKIAkJCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09OOwotCQkJX3NldF90aW1lcigmKHBMZWQtPkJsaW5rVGltZXIpLAotCQkJCSAgIExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKTsKKwkJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwgamlmZmllcyArCisJCQkJICBtc2Vjc190b19qaWZmaWVzKExFRF9CTElOS19TQ0FOX0lOVEVSVkFMX0FMUEhBKSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTX0ZBSUw6CiAJY2FzZSBMRURfQ1RMX1NUT1BfV1BTOgogCQlpZiAocExlZC0+YkxlZFdQU0JsaW5rSW5Qcm9ncmVzcykgewotCQkJX2NhbmNlbF90aW1lcl9leCgmKHBMZWQtPkJsaW5rVGltZXIpKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwTGVkLT5CbGlua1RpbWVyKTsKIAkJCXBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MgPSBmYWxzZTsKIAkJfQogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT047CiAJCXBMZWQtPkJsaW5raW5nTGVkU3RhdGUgPSBMRURfT047Ci0JCV9zZXRfdGltZXIoJihwTGVkLT5CbGlua1RpbWVyKSwgMCk7CisJCW1vZF90aW1lcigmcExlZC0+QmxpbmtUaW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMCkpOwogCQlicmVhazsKIAljYXNlIExFRF9DVExfUE9XRVJfT0ZGOgogCQlwTGVkLT5DdXJyTGVkU3RhdGUgPSBMRURfT0ZGOwogCQlwTGVkLT5CbGlua2luZ0xlZFN0YXRlID0gTEVEX09GRjsKIAkJaWYgKHBMZWQtPmJMZWRCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJaWYgKHBMZWQtPmJMZWRXUFNCbGlua0luUHJvZ3Jlc3MpIHsKLQkJCV9jYW5jZWxfdGltZXJfZXgoJihwTGVkLT5CbGlua1RpbWVyKSk7CisJCQlkZWxfdGltZXJfc3luYygmcExlZC0+QmxpbmtUaW1lcik7CiAJCQlwTGVkLT5iTGVkV1BTQmxpbmtJblByb2dyZXNzID0gZmFsc2U7CiAJCX0KIAkJU3dMZWRPZmYocGFkYXB0ZXIsIHBMZWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxMl9yZWN2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuYwppbmRleCBjZDhiNDQ0Li41MDIyN2I1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzEyX3JlY3YuYwpAQCAtMTYxLDEyICsxNjEsMTIgQEAKIAl1MTYgZHJ2aW5mb19zeiA9IDA7CiAKIAlkcnZpbmZvX3N6ID0gKGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcwKSYweDAwMGYwMDAwKT4+MTY7Ci0JZHJ2aW5mb19zeiA9IGRydmluZm9fc3o8PDM7CisJZHJ2aW5mb19zeiA8PD0gMzsKIAkvKlRPRE86CiAJICogT2Zmc2V0IDAgKi8KIAlwYXR0cmliLT5iZGVjcnlwdGVkID0gKChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCkgJiBCSVQoMjcpKSA+PiAyNykKIAkJCQkgPyAwIDogMTsKLQlwYXR0cmliLT5jcmNfZXJyID0gKChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCkgJiBCSVQoMTQpKSA+PiAxNCk7CisJcGF0dHJpYi0+Y3JjX2VyciA9IChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCkgJiBCSVQoMTQpKSA+PiAxNDsKIAkvKk9mZnNldCA0Ki8KIAkvKk9mZnNldCA4Ki8KIAkvKk9mZnNldCAxMiovCkBAIC00MzUsOCArNDM1LDggQEAKIAlwb2Zmc2V0ID0gKHU4ICopcHJ4Y21kYnVmOwogCXZvZmZzZXQgPSAqKHVpbnQgKilwb2Zmc2V0OwogCXByeHN0YXQgPSAoc3RydWN0IHJlY3Zfc3RhdCAqKXByeGNtZGJ1ZjsKLQlkcnZpbmZvX3N6ID0gKChsZTMyX3RvX2NwdShwcnhzdGF0LT5yeGR3MCkgJiAweDAwMGYwMDAwKSA+PiAxNik7Ci0JZHJ2aW5mb19zeiA9IGRydmluZm9fc3ogPDwgMzsKKwlkcnZpbmZvX3N6ID0gKGxlMzJfdG9fY3B1KHByeHN0YXQtPnJ4ZHcwKSAmIDB4MDAwZjAwMDApID4+IDE2OworCWRydmluZm9fc3ogPDw9IDM7CiAJcG9mZnNldCArPSBSWERFU0NfU0laRSArIGRydmluZm9fc3o7CiAJZG8gewogCQl2b2Zmc2V0ICA9ICoodWludCAqKXBvZmZzZXQ7CkBAIC02MDQsMTIgKzYwNCwxMiBAQAogCSAqLwogCWlmIChyODcxMl9yZWN2X2luZGljYXRlcGt0c19pbl9vcmRlcihwYWRhcHRlciwgcHJlb3JkZXJfY3RybCwgZmFsc2UpID09CiAJICAgIHRydWUpIHsKLQkJX3NldF90aW1lcigmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyLAotCQkJICAgUkVPUkRFUl9XQUlUX1RJTUUpOworCQltb2RfdGltZXIoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUkVPUkRFUl9XQUlUX1RJTUUpKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrLCBpcnFsKTsKIAl9IGVsc2UgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcGVuZGluZ19yZWN2ZnJhbWVfcXVldWUtPmxvY2ssIGlycWwpOwotCQlfY2FuY2VsX3RpbWVyX2V4KCZwcmVvcmRlcl9jdHJsLT5yZW9yZGVyaW5nX2N0cmxfdGltZXIpOworCQlkZWxfdGltZXIoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7CiAJfQogCXJldHVybiBfU1VDQ0VTUzsKIF9lcnJfZXhpdDoKQEAgLTc0OSw3ICs3NDksNyBAQAogCQkgKi8KIAkJaWYgKCFjY2tfaGlnaHB3cikgewogCQkJcmVwb3J0ID0gcGNja19idWYtPmNja19hZ2NfcnB0ICYgMHhjMDsKLQkJCXJlcG9ydCA9IHJlcG9ydCA+PiA2OworCQkJcmVwb3J0ID4+PSA2OwogCQkJc3dpdGNoIChyZXBvcnQpIHsKIAkJCS8qIE1vZGlmeSB0aGUgUkYgUk5BIGdhaW4gdmFsdWUgdG8gLTQwLCAtMjAsCiAJCQkgKiAtMiwgMTQgYnkgSmVueXUncyBzdWdnZXN0aW9uCkBAIC03NzUsNyArNzc1LDcgQEAKIAkJfSBlbHNlIHsKIAkJCXJlcG9ydCA9ICgodTgpKGxlMzJfdG9fY3B1KHBwaHlfc3RhdC0+cGh5ZHcxKSA+PiA4KSkgJgogCQkJCSAweDYwOwotCQkJcmVwb3J0ID0gcmVwb3J0ID4+IDU7CisJCQlyZXBvcnQgPj49IDU7CiAJCQlzd2l0Y2ggKHJlcG9ydCkgewogCQkJY2FzZSAweDM6CiAJCQkJcnhfcHdyX2FsbCA9IC00MCAtICgocGNja19idWYtPmNja19hZ2NfcnB0ICYKQEAgLTEwMzksNyArMTAzOSw3IEBACiAJCWZyYWcgPSAobGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzIpID4+IDEyKSAmIDB4ZjsKIAkJLyogdWludCAyXjMgPSA4IGJ5dGVzICovCiAJCWRydmluZm9fc3ogPSAobGUzMl90b19jcHUocHJ4c3RhdC0+cnhkdzApICYgMHgwMDBmMDAwMCkgPj4gMTY7Ci0JCWRydmluZm9fc3ogPSBkcnZpbmZvX3N6PDwzOworCQlkcnZpbmZvX3N6IDw8PSAzOwogCQlpZiAocGt0X2xlbiA8PSAwKQogCQkJZ290byAgX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7CiAJCS8qIFFvcyBkYXRhLCB3aXJlbGVzcyBsYW4gaGVhZGVyIGxlbmd0aCBpcyAyNiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfY21kLmMKaW5kZXggZmU1ZTMxNS4uMWExYzM4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2NtZC5jCkBAIC0yNDcsNyArMjQ3LDggQEAKIAl9CiAJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKTsKIAlyODcxMl9lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7Ci0JX3NldF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLCBTQ0FOTklOR19USU1FT1VUKTsKKwltb2RfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhTQ0FOTklOR19USU1FT1VUKSk7CiAJcGFkYXB0ZXItPmxlZHByaXYuTGVkQ29udHJvbEhhbmRsZXIocGFkYXB0ZXIsIExFRF9DVExfU0lURV9TVVJWRVkpOwogCXBhZGFwdGVyLT5ibG5FbmFibGVSeEZGMEZpbHRlciA9IDA7CiAJcmV0dXJuIF9TVUNDRVNTOwpAQCAtNTMwLDggKzUzMSw4IEBACiAJICogdGhlIGRyaXZlciBqdXN0IGhhcyB0aGUgYnNzaWQgaW5mb3JtYXRpb24gZm9yIFBNS0lETGlzdCBzZWFyY2hpbmcuCiAJICovCiAJaWYgKHBtbG1lcHJpdi0+YXNzb2NfYnlfYnNzaWQgPT0gZmFsc2UpCi0JCW1lbWNweSgmcG1sbWVwcml2LT5hc3NvY19ic3NpZFswXSwKLQkJCSZwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzWzBdLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weSgmcG1sbWVwcml2LT5hc3NvY19ic3NpZFswXSwKKwkJCQkmcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzc1swXSk7CiAJcHNlY25ldHdvcmstPklFTGVuZ3RoID0gcjg3MTJfcmVzdHJ1Y3Rfc2VjX2llKHBhZGFwdGVyLAogCQkJCQkJJnBuZXR3b3JrLT5uZXR3b3JrLklFc1swXSwKIAkJCQkJCSZwc2VjbmV0d29yay0+SUVzWzBdLApAQCAtNjgyLDcgKzY4Myw3IEBACiAJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHNldHN0YWtleV9wYXJhLCBfU2V0U3RhS2V5X0NNRF8pOwogCXBoMmMtPnJzcCA9ICh1OCAqKSBwc2V0c3Rha2V5X3JzcDsKIAlwaDJjLT5yc3BzeiA9IHNpemVvZihzdHJ1Y3Qgc2V0X3N0YWtleV9yc3ApOwotCW1lbWNweShwc2V0c3Rha2V5X3BhcmEtPmFkZHIsIHN0YS0+aHdhZGRyLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHBzZXRzdGFrZXlfcGFyYS0+YWRkciwgc3RhLT5od2FkZHIpOwogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkKIAkJcHNldHN0YWtleV9wYXJhLT5hbGdvcml0aG0gPSAodW5zaWduZWQgY2hhcikKIAkJCQkJICAgIHBzZWN1cml0eXByaXYtPlByaXZhY3lBbGdydGhtOwpAQCAtNzg0LDcgKzc4NSw3IEBACiAJfQogCWluaXRfaDJmd2NtZF93X3Bhcm1fbm9fcnNwKHBoMmMsIHBzZXRNYWNBZGRyX3BhcmEsCiAJCQkJICAgX1NldE1hY0FkZHJlc3NfQ01EXyk7Ci0JbWVtY3B5KHBzZXRNYWNBZGRyX3BhcmEtPk1hY0FkZHIsIG1hY19hZGRyLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KHBzZXRNYWNBZGRyX3BhcmEtPk1hY0FkZHIsIG1hY19hZGRyKTsKIAlyODcxMl9lbnF1ZXVlX2NtZChwY21kcHJpdiwgcGgyYyk7CiAJcmV0dXJuIF9TVUNDRVNTOwogfQpAQCAtODEzLDcgKzgxNCw3IEBACiAJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHNldGFzc29jc3RhX3BhcmEsIF9TZXRBc3NvY1N0YV9DTURfKTsKIAlwaDJjLT5yc3AgPSAodTggKikgcHNldGFzc29jc3RhX3JzcDsKIAlwaDJjLT5yc3BzeiA9IHNpemVvZihzdHJ1Y3Qgc2V0X2Fzc29jc3RhX3JzcCk7Ci0JbWVtY3B5KHBzZXRhc3NvY3N0YV9wYXJhLT5hZGRyLCBtYWNfYWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShwc2V0YXNzb2NzdGFfcGFyYS0+YWRkciwgbWFjX2FkZHIpOwogCXI4NzEyX2VucXVldWVfY21kKHBjbWRwcml2LCBwaDJjKTsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC04OTAsNyArODkxLDggQEAKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCiAJaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykKLQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwgMSk7CisJCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKKwkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCXI4NzEyX2ZyZWVfY21kX29iaihwY21kKTsKIH0KIApAQCAtODk4LDcgKzkwMCw2IEBACiAJCQkJICBzdHJ1Y3QgY21kX29iaiAqcGNtZCkKIHsKIAl1bnNpZ25lZCBsb25nIGlycUw7Ci0JdTggdGltZXJfY2FuY2VsbGVkOwogCXN0cnVjdCBzdGFfaW5mbyAqcHN0YSA9IE5VTEw7CiAJc3RydWN0IHdsYW5fbmV0d29yayAqcHdsYW4gPSBOVUxMOwogCXN0cnVjdAltbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CkBAIC05MDcsOCArOTA4LDkgQEAKIAlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICp0Z3RfbmV0d29yayA9ICYocG1sbWVwcml2LT5jdXJfbmV0d29yayk7CiAKIAlpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKQotCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCAxKTsKLQlfY2FuY2VsX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCAmdGltZXJfY2FuY2VsbGVkKTsKKwkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7CisJZGVsX3RpbWVyX3N5bmMoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIpOwogI2lmZGVmIF9fQklHX0VORElBTgogCS8qIGVuZGlhbl9jb252ZXJ0ICovCiAJcG5ldHdvcmstPkxlbmd0aCA9IGxlMzJfdG9fY3B1KHBuZXR3b3JrLT5MZW5ndGgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9lZXByb20uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfZWVwcm9tLmMKaW5kZXggMmYxNDVkNi4uNTAzMzllNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9lZXByb20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2VlcHJvbS5jCkBAIC02NCw3ICs2NCw3IEBACiAJCXVkZWxheShDTE9DS19SQVRFKTsKIAkJdXBfY2xrKHBhZGFwdGVyLCAmeCk7CiAJCWRvd25fY2xrKHBhZGFwdGVyLCAmeCk7Ci0JCW1hc2sgPSBtYXNrID4+IDE7CisJCW1hc2sgPj49IDE7CiAJfSB3aGlsZSAobWFzayk7CiAJaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUpCiAJCWdvdG8gb3V0OwpAQCAtODMsNyArODMsNyBAQAogCXggJj0gfihfRUVETyB8IF9FRURJKTsKIAlkID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotCQlkID0gZCA8PCAxOworCQlkIDw8PSAxOwogCQl1cF9jbGsocGFkYXB0ZXIsICZ4KTsKIAkJaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkID09IHRydWUpCiAJCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfbGludXguYwppbmRleCA5YmIzNjRmLi40MmZiYTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9saW51eC5jCkBAIC00Niw2ICs0Niw4IEBACiAjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorCiAKICNkZWZpbmUgUlRMX0lPQ1RMX1dQQV9TVVBQTElDQU5UCShTSU9DSVdGSVJTVFBSSVYgKyAweDFFKQogCkBAIC0xMTIsNyArMTE0LDcgQEAKIAl1bmlvbiBpd3JlcV9kYXRhIHdycXU7CiAKIAl3cnF1LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwotCW1lbXNldCh3cnF1LmFwX2FkZHIuc2FfZGF0YSwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIod3JxdS5hcF9hZGRyLnNhX2RhdGEpOwogCXdpcmVsZXNzX3NlbmRfZXZlbnQocGFkYXB0ZXItPnBuZXRkZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwogfQogCkBAIC0xMjksNyArMTMxLDggQEAKIAkJbWVtY3B5KHBzdGEtPnRraXByeG1pY2tleS4gc2tleSwgJihwYXJhbS0+dS5jcnlwdC4KIAkJCWtleVsyNF0pLCA4KTsKIAkJcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi4gYnVzZXRraXBrZXkgPSBmYWxzZTsKLQkJX3NldF90aW1lcigmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi50a2lwX3RpbWVyLCA1MCk7CisJCW1vZF90aW1lcigmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi50a2lwX3RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg1MCkpOwogCX0KIAlyODcxMl9zZXRzdGFrZXlfY21kKHBhZGFwdGVyLCAodW5zaWduZWQgY2hhciAqKXBzdGEsIHRydWUpOwogfQpAQCAtMTUzLDggKzE1Niw4IEBACiAJCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LnBvd2VyX21nbnQgPiBQU19NT0RFX0FDVElWRSkgewogCQkJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucG93ZXJfbWdudCAhPSBwYWRhcHRlci0+CiAJCQkgICAgcHdyY3RybHByaXYucHdyX21vZGUpCi0JCQkJX3NldF90aW1lcigmKHBhZGFwdGVyLT5tbG1lcHJpdi5kaGNwX3RpbWVyKSwKLQkJCQkJICAgNjAwMDApOworCQkJCW1vZF90aW1lcigmcGFkYXB0ZXItPm1sbWVwcml2LmRoY3BfdGltZXIsCisJCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNjAwMDApKTsKIAkJfQogCX0KIH0KQEAgLTE4Miw3ICsxODUsNyBAQAogCS8qIEFQIE1BQyBhZGRyZXNzICovCiAJaXdlLmNtZCA9IFNJT0NHSVdBUDsKIAlpd2UudS5hcF9hZGRyLnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKLQltZW1jcHkoaXdlLnUuYXBfYWRkci5zYV9kYXRhLCBwbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJZXRoZXJfYWRkcl9jb3B5KGl3ZS51LmFwX2FkZHIuc2FfZGF0YSwgcG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7CiAJc3RhcnQgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdGFydCwgc3RvcCwgJml3ZSwgSVdfRVZfQUREUl9MRU4pOwogCS8qIEFkZCB0aGUgRVNTSUQgKi8KIAlpd2UuY21kID0gU0lPQ0dJV0VTU0lEOwpAQCAtMzYwLDcgKzM2Myw3IEBACiAKIHN0YXRpYyBpbnQgd3BhX3NldF9hdXRoX2FsZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIHZhbHVlKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoKHZhbHVlICYgQVVUSF9BTEdfU0hBUkVEX0tFWSkgJiYgKHZhbHVlICYgQVVUSF9BTEdfT1BFTl9TWVNURU0pKSB7CkBAIC0zOTIsNyArMzk1LDcgQEAKIAlpbnQgcmV0ID0gMDsKIAl1MzIgd2VwX2tleV9pZHgsIHdlcF9rZXlfbGVuID0gMDsKIAlzdHJ1Y3QgTkRJU184MDJfMTFfV0VQCSAqcHdlcCA9IE5VTEw7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIApAQCAtNjI2LDcgKzYyOSw3IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgaHRfaWVsZW4gPSAwOwogCWNoYXIgKnA7CiAJdTggaHRfY2FwID0gZmFsc2U7CkBAIC02ODIsNyArNjg1LDcgQEAKIAkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpd19mcmVxICpmd3JxID0gJndycXUtPmZyZXE7CiAJaW50IHJjID0gMDsKIApAQCAtNzE4LDcgKzcyMSw3IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCBuZGlzX3dsYW5fYnNzaWRfZXggKnBjdXJfYnNzID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKIApAQCAtNzM3LDcgKzc0MCw3IEBACiAJCQkgICAgIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCWVudW0gTkRJU184MDJfMTFfTkVUV09SS19JTkZSQVNUUlVDVFVSRSBuZXR3b3JrVHlwZTsKIAogCXN3aXRjaCAod3JxdS0+bW9kZSkgewpAQCAtNzY4LDcgKzc3MSw3IEBACiBzdGF0aWMgaW50IHI4NzExX3d4X2dldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCiAJCQkgICAgIHVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmIpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfU1RBVElPTl9TVEFURSkgPT0gdHJ1ZSkKQEAgLTc4Nyw3ICs3OTAsNyBAQAogCQkJICAgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAogCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNlY3VyaXR5X3ByaXYgKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKIAlzdHJ1Y3QgaXdfcG1rc2EgKnBQTUsgPSAoc3RydWN0IGl3X3Bta3NhICopIGV4dHJhOwogCXU4IHN0clplcm9NYWNBZGRyZXNzW0VUSF9BTEVOXSA9IHsweDAwfTsKQEAgLTg1MSw4ICs4NTQsNyBAQAogCQkJICAgIHN0cklzc3VlQnNzaWQsIEVUSF9BTEVOKSkgewogCQkJCS8qIEJTU0lEIGlzIG1hdGNoZWQsIHRoZSBzYW1lIEFQID0+IFJlbW92ZQogCQkJCSAqIHRoaXMgUE1LSUQgaW5mb3JtYXRpb24gYW5kIHJlc2V0IGl0LiAqLwotCQkJCW1lbXNldChwc2VjdXJpdHlwcml2LT5QTUtJRExpc3Rbal0uQnNzaWQsCi0JCQkJCTB4MDAsIEVUSF9BTEVOKTsKKwkJCQlldGhfemVyb19hZGRyKHBzZWN1cml0eXByaXYtPlBNS0lETGlzdFtqXS5Cc3NpZCk7CiAJCQkJcHNlY3VyaXR5cHJpdi0+UE1LSURMaXN0W2pdLmJVc2VkID0gZmFsc2U7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xMDU5LDcgKzEwNjEsNyBAQAogCQkJIGNoYXIgKmV4dHJhKQogewogCWludCByZXQgPSAtRUlOUFJPR1JFU1M7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCAgX19xdWV1ZSAqcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwogCXN0cnVjdCBzb2NrYWRkciAqdGVtcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKilhd3JxOwpAQCAtMTEwOCwxNiArMTExMCwxNiBAQAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IG5kaXNfd2xhbl9ic3NpZF9leCAqcGN1cl9ic3MgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwogCiAJd3JxdS0+YXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7CiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEIHwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUgfAogCQkJCSAgICAgV0lGSV9BUF9TVEFURSkpCi0JCW1lbWNweSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIHBjdXJfYnNzLT5NYWNBZGRyZXNzLCBFVEhfQUxFTik7CisJCWV0aGVyX2FkZHJfY29weSh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIHBjdXJfYnNzLT5NYWNBZGRyZXNzKTsKIAllbHNlCi0JCW1lbXNldCh3cnF1LT5hcF9hZGRyLnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcih3cnF1LT5hcF9hZGRyLnNhX2RhdGEpOwogCXJldHVybiAwOwogfQogCkBAIC0xMTI2LDcgKzExMjgsNyBAQAogCQkJICAgICB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKIAlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl3X21sbWUgKm1sbWUgPSAoc3RydWN0IGl3X21sbWUgKikgZXh0cmE7CiAKIAlpZiAobWxtZSA9PSBOVUxMKQpAQCAtMTE1OCw3ICsxMTYwLDcgQEAKIAkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCiAJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAl1OCBzdGF0dXMgPSB0cnVlOwogCkBAIC0xMjA3LDcgKzEyMDksNyBAQAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmEsCiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0ICBfX3F1ZXVlICpxdWV1ZSA9ICZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWU7CiAJc3RydWN0IHdsYW5fbmV0d29yayAqcG5ldHdvcmsgPSBOVUxMOwpAQCAtMTI2MSw3ICsxMjYzLDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICphLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCAgX19xdWV1ZSAqcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwogCXN0cnVjdCB3bGFuX25ldHdvcmsgKnBuZXR3b3JrID0gTlVMTDsKQEAgLTEzMjQsNyArMTMyNiw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAlzdHJ1Y3QgbmRpc193bGFuX2Jzc2lkX2V4ICpwY3VyX2JzcyA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrLm5ldHdvcms7CiAJdTMyIGxlbiwgcmV0ID0gMDsKQEAgLTEzNDQsNyArMTM0Niw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqYSwKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKW5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIHRhcmdldF9yYXRlID0gd3JxdS0+Yml0cmF0ZS52YWx1ZTsKIAl1MzIgZml4ZWQgPSB3cnF1LT5iaXRyYXRlLmZpeGVkOwogCXUzMiByYXRldmFsdWUgPSAwOwpAQCAtMTQxNiw3ICsxNDE4LDcgQEAKIAkJCSAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAJc3RydWN0IG5kaXNfd2xhbl9ic3NpZF9leCAqcGN1cl9ic3MgPSAmcG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrOwogCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpwaHRfY2FwaWU7CkBAIC0xNDczLDcgKzE0NzUsNyBAQAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJd3JxdS0+cnRzLnZhbHVlID0gcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5ydHNfdGhyZXNoOwogCXdycXUtPnJ0cy5maXhlZCA9IDA7CS8qIG5vIGF1dG8gc2VsZWN0ICovCkBAIC0xNDg0LDcgKzE0ODYsNyBAQAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJaWYgKHdycXUtPmZyYWcuZGlzYWJsZWQpCiAJCXBhZGFwdGVyLT54bWl0cHJpdi5mcmFnX2xlbiA9IE1BWF9GUkFHX1RIUkVTSE9MRDsKQEAgLTE1MDEsNyArMTUwMyw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJd3JxdS0+ZnJhZy52YWx1ZSA9IHBhZGFwdGVyLT54bWl0cHJpdi5mcmFnX2xlbjsKIAl3cnF1LT5mcmFnLmZpeGVkID0gMDsJLyogbm8gYXV0byBzZWxlY3QgKi8KQEAgLTE1MjcsNyArMTUyOSw3IEBACiAJc3RydWN0IE5ESVNfODAyXzExX1dFUAkgd2VwOwogCWVudW0gTkRJU184MDJfMTFfQVVUSEVOVElDQVRJT05fTU9ERSBhdXRobW9kZTsKIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOwotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAKIAlrZXkgPSBlcnEtPmZsYWdzICYgSVdfRU5DT0RFX0lOREVYOwogCW1lbXNldCgmd2VwLCAwLCBzaXplb2Yoc3RydWN0IE5ESVNfODAyXzExX1dFUCkpOwpAQCAtMTYxOSw3ICsxNjIxLDcgQEAKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXlidWYpCiB7CiAJdWludCBrZXksIHJldCA9IDA7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXdfcG9pbnQgKmVycSA9ICYod3JxdS0+ZW5jb2RpbmcpOwogCXN0cnVjdAltbG1lX3ByaXYJKnBtbG1lcHJpdiA9ICYocGFkYXB0ZXItPm1sbWVwcml2KTsKIApAQCAtMTY5MSw3ICsxNjkzLDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXJldHVybiByODcxeF9zZXRfd3BhX2llKHBhZGFwdGVyLCBleHRyYSwgd3JxdS0+ZGF0YS5sZW5ndGgpOwogfQpAQCAtMTcwMCw3ICsxNzAyLDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXdfcGFyYW0gKnBhcmFtID0gKHN0cnVjdCBpd19wYXJhbSAqKSYod3JxdS0+cGFyYW0pOwogCWludCBwYXJhbWlkOwogCWludCBwYXJhbXZhbDsKQEAgLTE4NDcsNyArMTg0OSw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXlidWYpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgYWRkcjsKIAl1MzIgZGF0YTMyOwogCkBAIC0xODY0LDcgKzE4NjYsNyBAQAogCQkJCSBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCSB1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICprZXlidWYpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgYWRkcjsKIAl1MzIgZGF0YTMyOwogCkBAIC0xODkyLDcgKzE4OTQsNyBAQAogCQkJCXN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sCiAJCQkJdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpd19wb2ludCAqcCA9ICZ3cnF1LT5kYXRhOwogCXN0cnVjdCBvaWRfcGFyX3ByaXYgb2lkX3BhcjsKIAlzdHJ1Y3QgbXBfaW9jdGxfaGFuZGxlciAqcGhhbmRsZXI7CkBAIC0xOTEwLDEzICsxOTEyLDkgQEAKIAlic2V0ID0gKHU4KShwLT5mbGFncyAmIDB4RkZGRik7CiAJbGVuID0gcC0+bGVuZ3RoOwogCXBwYXJtYnVmID0gTlVMTDsKLQlwcGFybWJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAocHBhcm1idWYgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIF9yODcxeF9tcF9pb2N0bF9oZGxfZXhpdDsKLQl9Ci0JaWYgKGNvcHlfZnJvbV91c2VyKHBwYXJtYnVmLCBwLT5wb2ludGVyLCBsZW4pKSB7Ci0JCXJldCA9IC1FRkFVTFQ7CisJcHBhcm1idWYgPSBtZW1kdXBfdXNlcihwLT5wb2ludGVyLCBsZW4pOworCWlmIChJU19FUlIocHBhcm1idWYpKSB7CisJCXJldCA9IFBUUl9FUlIocHBhcm1idWYpOwogCQlnb3RvIF9yODcxeF9tcF9pb2N0bF9oZGxfZXhpdDsKIAl9CiAJcG9pZHBhcmFtID0gKHN0cnVjdCBtcF9pb2N0bF9wYXJhbSAqKXBwYXJtYnVmOwpAQCAtMTk3NSw3ICsxOTczLDcgQEAKIAkJCQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmcGFkYXB0ZXItPm1sbWVwcml2OwogCXN0cnVjdCAgX19xdWV1ZSAqcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwogCXN0cnVjdCBpd19wb2ludCAqcGRhdGEgPSAmd3JxdS0+ZGF0YTsKQEAgLTIwNDYsNyArMjA0NCw3IEBACiAJCQkJc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCQl1bmlvbiBpd3JlcV9kYXRhICp3cnF1LCBjaGFyICpleHRyYSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBfYWRhcHRlciAqKSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpd19wb2ludCAqcGRhdGEgPSAmd3JxdS0+ZGF0YTsKIAogCWlmICgocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKSB8fCAocGRhdGEgPT0gTlVMTCkpCkBAIC0yMDYxLDcgKzIwNTksNyBAQAogCQkJCXVuaW9uIGl3cmVxX2RhdGEgKndycXUsIGNoYXIgKmV4dHJhKQogewogCWludCByZXQgPSAwOwotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGl3X3BvaW50ICpwZGF0YSA9ICZ3cnF1LT5kYXRhOwogCWludCBjaF9wbGFuID0gLTE7CiAKQEAgLTIwODEsNyArMjA3OSw3IEBACiAJCQkgICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAogCQkJICAgdW5pb24gaXdyZXFfZGF0YSAqd3JxdSwgY2hhciAqZXh0cmEpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKiluZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBpd19wb2ludCAqcGRhdGEgPSAmd3JxdS0+ZGF0YTsKIAl1MzIgICB1MzJ3cHNfc3RhcnQgPSAwOwogCkBAIC0yMTA1LDcgKzIxMDMsNyBAQAogCiBzdGF0aWMgaW50IHdwYV9zZXRfcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggbmFtZSwgdTMyIHZhbHVlKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAKIAlzd2l0Y2ggKG5hbWUpIHsKIAljYXNlIElFRUVfUEFSQU1fV1BBX0VOQUJMRUQ6CkBAIC0yMTU3LDcgKzIxNTUsNyBAQAogCiBzdGF0aWMgaW50IHdwYV9tbG1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBjb21tYW5kLCB1MzIgcmVhc29uKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopIG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KGRldik7CiAKIAlzd2l0Y2ggKGNvbW1hbmQpIHsKIAljYXNlIElFRUVfTUxNRV9TVEFfREVBVVRIOgpAQCAtMjE3OCw3ICsyMTc2LDcgQEAKIHsKIAlzdHJ1Y3QgaWVlZV9wYXJhbSAqcGFyYW07CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCWlmIChwLT5sZW5ndGggPCBzaXplb2Yoc3RydWN0IGllZWVfcGFyYW0pIHx8ICFwLT5wb2ludGVyKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIzMzEsNyArMjMyOSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcjg3MXhfZ2V0X3dpcmVsZXNzX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKikgbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgX2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXdfc3RhdGlzdGljcyAqcGl3c3RhdHMgPSAmcGFkYXB0ZXItPml3c3RhdHM7CiAJaW50IHRtcF9sZXZlbCA9IDA7CiAJaW50IHRtcF9xdWFsID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X2lvY3RsX3NldC5jCmluZGV4IDYzMThhMGUuLjIyMjYyYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfaW9jdGxfc2V0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9pb2N0bF9zZXQuYwpAQCAtODUsNyArODUsOCBAQAogCiAJCXJldCA9IHI4NzEyX3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW4ocG1sbWVwcml2KTsKIAkJaWYgKHJldCA9PSBfU1VDQ0VTUykKLQkJCV9zZXRfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIE1BWF9KT0lOX1RJTUVPVVQpOworCQkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAorCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoTUFYX0pPSU5fVElNRU9VVCkpOwogCQllbHNlIHsKIAkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSkpIHsKIAkJCQkvKiBzdWJtaXQgcjg3MTJfY3JlYXRlYnNzX2NtZCB0byBjaGFuZ2UgdG8gYW4KQEAgLTI2NSw4ICsyNjYsNyBAQAogCQkvKiBjbGVhciBXSUZJX1NUQVRJT05fU1RBVEU7IFdJRklfQVBfU1RBVEU7IFdJRklfQURIT0NfU1RBVEU7CiAJCSAqIFdJRklfQURIT0NfTUFTVEVSX1NUQVRFICovCiAJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUgfCBXSUZJX0FQX1NUQVRFIHwKLQkJCSAgICAgIFdJRklfQURIT0NfU1RBVEUgfCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSB8Ci0JCQkgICAgICBXSUZJX0FQX1NUQVRFKTsKKwkJCSAgICAgIFdJRklfQURIT0NfU1RBVEUgfCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSk7CiAJCXN3aXRjaCAobmV0d29ya3R5cGUpIHsKIAkJY2FzZSBOZGlzODAyXzExSUJTUzoKIAkJCXNldF9md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19TVEFURSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21sbWUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5jCmluZGV4IDk3N2E4MzMuLmZiMmIxOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbWxtZS5jCkBAIC01ODIsOSArNTgyLDcgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG1sbWVwcml2LT5sb2NrLCBpcnFMKTsKIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkgPT0gdHJ1ZSkgewotCQl1OCB0aW1lcl9jYW5jZWxsZWQ7Ci0KLQkJX2NhbmNlbF90aW1lcigmcG1sbWVwcml2LT5zY2FuX3RvX3RpbWVyLCAmdGltZXJfY2FuY2VsbGVkKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lcik7CiAKIAkJX2Nscl9md3N0YXRlXyhwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpOwogCX0KQEAgLTU5Niw4ICs1OTQsOCBAQAogCiAJCQkJaWYgKHI4NzEyX3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW4ocG1sbWVwcml2KQogCQkJCSAgICA9PSBfU1VDQ0VTUykKLQkJCQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKLQkJCQkJCSAgIE1BWF9KT0lOX1RJTUVPVVQpOworCQkJCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIGppZmZpZXMgKworCQkJCQkJICBtc2Vjc190b19qaWZmaWVzKE1BWF9KT0lOX1RJTUVPVVQpKTsKIAkJCQllbHNlIHsKIAkJCQkJc3RydWN0IHdsYW5fYnNzaWRfZXggKnBkZXZfbmV0d29yayA9CiAJCQkJCSAgJihhZGFwdGVyLT5yZWdpc3RyeXByaXYuZGV2X25ldHdvcmspOwpAQCAtNjIyLDggKzYyMCw4IEBACiAJCQlzZXRfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKTsKIAkJCWlmIChyODcxMl9zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FuKHBtbG1lcHJpdikgPT0KIAkJCSAgICBfU1VDQ0VTUykKLQkJCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAotCQkJCQkgICBNQVhfSk9JTl9USU1FT1VUKTsKKwkJCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsIGppZmZpZXMgKworCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoTUFYX0pPSU5fVElNRU9VVCkpOwogCQkJZWxzZQogCQkJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7CiAJCX0KQEAgLTY3OSw3ICs2NzcsOCBAQAogCXBhZGFwdGVyLT5sZWRwcml2LkxlZENvbnRyb2xIYW5kbGVyKHBhZGFwdGVyLCBMRURfQ1RMX0xJTkspOwogCXI4NzEyX29zX2luZGljYXRlX2Nvbm5lY3QocGFkYXB0ZXIpOwogCWlmIChwYWRhcHRlci0+cmVnaXN0cnlwcml2LnBvd2VyX21nbnQgPiBQU19NT0RFX0FDVElWRSkKLQkJX3NldF90aW1lcigmcG1sbWVwcml2LT5kaGNwX3RpbWVyLCA2MDAwMCk7CisJCW1vZF90aW1lcigmcG1sbWVwcml2LT5kaGNwX3RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyg2MDAwMCkpOwogfQogCiAKQEAgLTY5Nyw3ICs2OTYsNyBAQAogCX0KIAlpZiAocGFkYXB0ZXItPnB3cmN0cmxwcml2LnB3cl9tb2RlICE9CiAJICAgIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucG93ZXJfbWdudCkgewotCQlfY2FuY2VsX3RpbWVyX2V4KCZwbWxtZXByaXYtPmRoY3BfdGltZXIpOworCQlkZWxfdGltZXJfc3luYygmcG1sbWVwcml2LT5kaGNwX3RpbWVyKTsKIAkJcjg3MTJfc2V0X3BzX21vZGUocGFkYXB0ZXIsIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucG93ZXJfbWdudCwKIAkJCQkgIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYuc21hcnRfcHMpOwogCX0KQEAgLTcxNiw3ICs3MTUsNiBAQAogdm9pZCByODcxMl9qb2luYnNzX2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciwgdTggKnBidWYpCiB7CiAJdW5zaWduZWQgbG9uZyBpcnFMID0gMCwgaXJxTDI7Ci0JdTggdGltZXJfY2FuY2VsbGVkOwogCXN0cnVjdCBzdGFfaW5mbwkqcHRhcmdldF9zdGEgPSBOVUxMLCAqcGN1cl9zdGEgPSBOVUxMOwogCXN0cnVjdCBzdGFfcHJpdgkqcHN0YXByaXYgPSAmYWRhcHRlci0+c3RhcHJpdjsKIAlzdHJ1Y3QgbWxtZV9wcml2CSpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7CkBAIC03MjcsNiArNzI1LDggQEAKIAogCWlmIChzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCkgPT0gNCAqIHNpemVvZih1MzIpKSB7CiAJCXBuZXR3b3JrID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHdsYW5fbmV0d29yayksIEdGUF9BVE9NSUMpOworCQlpZiAoIXBuZXR3b3JrKQorCQkJcmV0dXJuOwogCQltZW1jcHkoKHU4ICopcG5ldHdvcmsrMTYsICh1OCAqKXBidWYgKyA4LAogCQkJc2l6ZW9mKHN0cnVjdCB3bGFuX25ldHdvcmspIC0gMTYpOwogCX0gZWxzZQpAQCAtOTEwLDEzICs5MTAsMTMgQEAKIAkJCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKQogCQkJCT09IHRydWUpCiAJCQkJcjg3MTJfaW5kaWNhdGVfY29ubmVjdChhZGFwdGVyKTsKLQkJCV9jYW5jZWxfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCi0JCQkJICAgICAgJnRpbWVyX2NhbmNlbGxlZCk7CisJCQlkZWxfdGltZXJfc3luYygmcG1sbWVwcml2LT5hc3NvY190aW1lcik7CiAJCX0gZWxzZQogCQkJZ290byBpZ25vcmVfam9pbmJzc19jYWxsYmFjazsKIAl9IGVsc2UgewogCQlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9MSU5LSU5HKSA9PSB0cnVlKSB7Ci0JCQlfc2V0X3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLCAxKTsKKwkJCW1vZF90aW1lcigmcG1sbWVwcml2LT5hc3NvY190aW1lciwKKwkJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAkJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORyk7CiAJCX0KIAl9CkBAIC0xNTk5LDE3ICsxNTk5LDE1IEBACiAJaUVudHJ5ID0gU2VjSXNJblBNS0lETGlzdChhZGFwdGVyLCBwbWxtZXByaXYtPmFzc29jX2Jzc2lkKTsKIAlpZiAoaUVudHJ5IDwgMCkKIAkJcmV0dXJuIGllbGVuZ3RoOwotCWVsc2UgewotCQlpZiAoYXV0aG1vZGUgPT0gX1dQQTJfSUVfSURfKSB7Ci0JCQlvdXRfaWVbaWVsZW5ndGhdID0gMTsKLQkJCWllbGVuZ3RoKys7Ci0JCQlvdXRfaWVbaWVsZW5ndGhdID0gMDsJLypQTUtJRCBjb3VudCA9IDB4MDEwMCovCi0JCQlpZWxlbmd0aCsrOwotCQkJbWVtY3B5KCZvdXRfaWVbaWVsZW5ndGhdLAotCQkJCSZwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaUVudHJ5XS5QTUtJRCwgMTYpOwotCQkJaWVsZW5ndGggKz0gMTY7Ci0JCQlvdXRfaWVbMTNdICs9IDE4Oy8qUE1LSUQgbGVuZ3RoID0gMisxNiovCi0JCX0KKwlpZiAoYXV0aG1vZGUgPT0gX1dQQTJfSUVfSURfKSB7CisJCW91dF9pZVtpZWxlbmd0aF0gPSAxOworCQlpZWxlbmd0aCsrOworCQlvdXRfaWVbaWVsZW5ndGhdID0gMDsJLypQTUtJRCBjb3VudCA9IDB4MDEwMCovCisJCWllbGVuZ3RoKys7CisJCW1lbWNweSgmb3V0X2llW2llbGVuZ3RoXSwKKwkJCSZwc2VjdXJpdHlwcml2LT5QTUtJRExpc3RbaUVudHJ5XS5QTUtJRCwgMTYpOworCQlpZWxlbmd0aCArPSAxNjsKKwkJb3V0X2llWzEzXSArPSAxODsvKlBNS0lEIGxlbmd0aCA9IDIrMTYqLwogCX0KIAlyZXR1cm4gaWVsZW5ndGg7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X21wLmMKaW5kZXggM2Q5MTNiOS4uMjYyMDFlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9tcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfbXAuYwpAQCAtMzI3LDggKzMyNyw4IEBACiAJdTMyIFR4QUdDT2Zmc2V0X0IsIFR4QUdDT2Zmc2V0X0MsIFR4QUdDT2Zmc2V0X0QsIHRtcEFHQzsKIAogCVR4QUdDT2Zmc2V0X0IgPSAodWxUeEFHQ09mZnNldCYweDAwMDAwMGZmKTsKLQlUeEFHQ09mZnNldF9DID0gKCh1bFR4QUdDT2Zmc2V0JjB4MDAwMGZmMDApPj44KTsKLQlUeEFHQ09mZnNldF9EID0gKCh1bFR4QUdDT2Zmc2V0JjB4MDBmZjAwMDApPj4xNik7CisJVHhBR0NPZmZzZXRfQyA9ICh1bFR4QUdDT2Zmc2V0ICYgMHgwMDAwZmYwMCk+Pjg7CisJVHhBR0NPZmZzZXRfRCA9ICh1bFR4QUdDT2Zmc2V0ICYgMHgwMGZmMDAwMCk+PjE2OwogCXRtcEFHQyA9IChUeEFHQ09mZnNldF9EPDw4IHwgVHhBR0NPZmZzZXRfQzw8NCB8IFR4QUdDT2Zmc2V0X0IpOwogCXNldF9iYl9yZWcocEFkYXB0ZXIsIHJGUEdBMF9UeEdhaW5TdGFnZSwKIAkJCShiWEJUeEFHQ3xiWENUeEFHQ3xiWERUeEFHQyksIHRtcEFHQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3B3cmN0cmwuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5jCmluZGV4IGVkMjg0NGQuLmFhYTU4NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfcHdyY3RybC5jCkBAIC0xMDMsNyArMTAzLDcgQEAKIAogCWlmIChwd3Jwcml2LT5jcHdtX3RvZyA9PSAoKHByZXBvcnRwd3JzdGF0ZS0+c3RhdGUpICYgMHg4MCkpCiAJCXJldHVybjsKLQlfY2FuY2VsX3RpbWVyX2V4KCZwYWRhcHRlci0+cHdyY3RybHByaXYuIHJwd21fY2hlY2tfdGltZXIpOworCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+cHdyY3RybHByaXYucnB3bV9jaGVja190aW1lcik7CiAJX2VudGVyX3B3cmxvY2soJnB3cnByaXYtPmxvY2spOwogCXB3cnByaXYtPmNwd20gPSAocHJlcG9ydHB3cnN0YXRlLT5zdGF0ZSkgJiAweGY7CiAJaWYgKHB3cnByaXYtPmNwd20gPj0gUFNfU1RBVEVfUzIpIHsKQEAgLTE2NSw5ICsxNjUsOSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgcnB3bV9jaGVja19oYW5kbGVyICh2b2lkICpGdW5jdGlvbkNvbnRleHQpCitzdGF0aWMgdm9pZCBycHdtX2NoZWNrX2hhbmRsZXIgKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgX2FkYXB0ZXIgKmFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBfYWRhcHRlciAqYWRhcHRlciA9IChzdHJ1Y3QgX2FkYXB0ZXIgKilkYXRhOwogCiAJX3Jwd21fY2hlY2tfaGFuZGxlcihhZGFwdGVyKTsKIH0KQEAgLTE4Niw4ICsxODYsOCBAQAogCXI4NzEyX3dyaXRlOChwYWRhcHRlciwgMHgxMDI1RkU1OCwgMCk7CiAJSU5JVF9XT1JLKCZwd3JjdHJscHJpdi0+U2V0UFNNb2RlV29ya0l0ZW0sIFNldFBTTW9kZVdvcmtJdGVtQ2FsbGJhY2spOwogCUlOSVRfV09SSygmcHdyY3RybHByaXYtPnJwd21fd29ya2l0ZW0sIHJwd21fd29ya2l0ZW1fY2FsbGJhY2spOwotCV9pbml0X3RpbWVyKCYocHdyY3RybHByaXYtPnJwd21fY2hlY2tfdGltZXIpLAotCQkgICAgcGFkYXB0ZXItPnBuZXRkZXYsIHJwd21fY2hlY2tfaGFuZGxlciwgKHU4ICopcGFkYXB0ZXIpOworCXNldHVwX3RpbWVyKCZwd3JjdHJscHJpdi0+cnB3bV9jaGVja190aW1lciwgcnB3bV9jaGVja19oYW5kbGVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpcGFkYXB0ZXIpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9yZWN2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3JlY3YuYwppbmRleCAwNmYxNWY4Li4wNDZhNDZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3JlY3YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3JlY3YuYwpAQCAtNTE3LDggKzUxNyw3IEBACiAJCXJldHVybiBfRkFJTDsKIAlpZiAocHN0YSA9PSBOVUxMKQogCQlyZXR1cm4gX0ZBSUw7Ci0JZWxzZQotCQlwcmVjdl9mcmFtZS0+dS5oZHIucHN0YSA9IHBzdGE7CisJcHJlY3ZfZnJhbWUtPnUuaGRyLnBzdGEgPSBwc3RhOwogCXBhdHRyaWItPmFtc2R1ID0gMDsKIAkvKiBwYXJzaW5nIFFDIGZpZWxkICovCiAJaWYgKHBhdHRyaWItPnFvcyA9PSAxKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmMKaW5kZXggYzY1M2FkNi4uYmNkMWE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuYwpAQCAtMTUzLDcgKzE1Myw3IEBACiAJdTggKnA7CiAJdTMyICBjcmM7CiAKLQlpZiAoYmNyYzMyaW5pdGlhbGl6ZWQgPT0gMCkKKwlpZiAoIWJjcmMzMmluaXRpYWxpemVkKQogCQljcmMzMl9pbml0KCk7CiAJY3JjID0gMHhmZmZmZmZmZjsgLyogcHJlbG9hZCBzaGlmdCByZWdpc3RlciwgcGVyIENSQy0zMiBzcGVjICovCiAJZm9yIChwID0gYnVmOyBsZW4gPiAwOyArK3AsIC0tbGVuKQpAQCAtMTA0NSw3ICsxMDQ1LDcgQEAKIAl1aW50CWZydHlwZSAgPSBHZXRGcmFtZVR5cGUocGZyYW1lKTsKIAl1aW50CWZyc3VidHlwZSAgPSBHZXRGcmFtZVN1YlR5cGUocGZyYW1lKTsKIAotCWZyc3VidHlwZSA9IGZyc3VidHlwZSA+PiA0OworCWZyc3VidHlwZSA+Pj0gNDsKIAltZW1zZXQoKHZvaWQgKiltaWNfaXYsIDAsIDE2KTsKIAltZW1zZXQoKHZvaWQgKiltaWNfaGVhZGVyMSwgMCwgMTYpOwogCW1lbXNldCgodm9pZCAqKW1pY19oZWFkZXIyLCAwLCAxNik7CkBAIC0xMDg2LDcgKzEwODYsNyBAQAogCXBheWxvYWRfcmVtYWluZGVyID0gcGxlbiAlIDE2OwogCW51bV9ibG9ja3MgPSBwbGVuIC8gMTY7CiAJLyogRmluZCBzdGFydCBvZiBwYXlsb2FkICovCi0JcGF5bG9hZF9pbmRleCA9IChoZHJsZW4gKyA4KTsKKwlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsKIAkvKiBDYWxjdWxhdGUgTUlDICovCiAJYWVzMTI4azEyOGQoa2V5LCBtaWNfaXYsIGFlc19vdXQpOwogCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIxLCBjaGFpbl9idWZmZXIpOwpAQCAtMTIxNiw3ICsxMjE2LDcgQEAKIAl1aW50IGZydHlwZSAgPSBHZXRGcmFtZVR5cGUocGZyYW1lKTsKIAl1aW50IGZyc3VidHlwZSAgPSBHZXRGcmFtZVN1YlR5cGUocGZyYW1lKTsKIAotCWZyc3VidHlwZSA9IGZyc3VidHlwZSA+PiA0OworCWZyc3VidHlwZSA+Pj0gNDsKIAltZW1zZXQoKHZvaWQgKiltaWNfaXYsIDAsIDE2KTsKIAltZW1zZXQoKHZvaWQgKiltaWNfaGVhZGVyMSwgMCwgMTYpOwogCW1lbXNldCgodm9pZCAqKW1pY19oZWFkZXIyLCAwLCAxNik7CkBAIC0xMjkyLDcgKzEyOTIsNyBAQAogCXBheWxvYWRfcmVtYWluZGVyID0gKHBsZW4gLSA4KSAlIDE2OwogCW51bV9ibG9ja3MgPSAocGxlbiAtIDgpIC8gMTY7CiAJLyogRmluZCBzdGFydCBvZiBwYXlsb2FkICovCi0JcGF5bG9hZF9pbmRleCA9IChoZHJsZW4gKyA4KTsKKwlwYXlsb2FkX2luZGV4ID0gaGRybGVuICsgODsKIAkvKiBDYWxjdWxhdGUgTUlDICovCiAJYWVzMTI4azEyOGQoa2V5LCBtaWNfaXYsIGFlc19vdXQpOwogCWJpdHdpc2VfeG9yKGFlc19vdXQsIG1pY19oZWFkZXIxLCBjaGFpbl9idWZmZXIpOwpAQCAtMTM5Miw5ICsxMzkyLDkgQEAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKLXZvaWQgcjg3MTJfdXNlX3RraXBrZXlfaGFuZGxlcih2b2lkICpGdW5jdGlvbkNvbnRleHQpCit2b2lkIHI4NzEyX3VzZV90a2lwa2V5X2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopRnVuY3Rpb25Db250ZXh0OworCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopZGF0YTsKIAogCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkgPSB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zZWN1cml0eS5oCmluZGV4IGM3MzJhZWEuLjIyOTVmMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3J0bDg3MXhfc2VjdXJpdHkuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3NlY3VyaXR5LmgKQEAgLTIxNiw3ICsyMTYsNyBAQAogdTMyIHI4NzEyX2Flc19kZWNyeXB0KHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICAqcHJlY3ZmcmFtZSk7CiB1MzIgcjg3MTJfdGtpcF9kZWNyeXB0KHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICAqcHJlY3ZmcmFtZSk7CiB2b2lkIHI4NzEyX3dlcF9kZWNyeXB0KHN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIsIHU4ICAqcHJlY3ZmcmFtZSk7Ci12b2lkIHI4NzEyX3VzZV90a2lwa2V5X2hhbmRsZXIodm9pZCAqRnVuY3Rpb25Db250ZXh0KTsKK3ZvaWQgcjg3MTJfdXNlX3RraXBrZXlfaGFuZGxlcih1bnNpZ25lZCBsb25nIGRhdGEpOwogCiAjZW5kaWYJLypfX1JUTDg3MVhfU0VDVVJJVFlfSF8gKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF9zdGFfbWd0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3N0YV9tZ3QuYwppbmRleCAxNzUyMTIxLi43YmI5NmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3N0YV9tZ3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3N0YV9tZ3QuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJICogY2FuY2VsIHJlb3JkZXJpbmdfY3RybF90aW1lciAqLwogCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAJCXByZW9yZGVyX2N0cmwgPSAmcHN0YS0+cmVjdnJlb3JkZXJfY3RybFtpXTsKLQkJX2NhbmNlbF90aW1lcl9leCgmcHJlb3JkZXJfY3RybC0+cmVvcmRlcmluZ19jdHJsX3RpbWVyKTsKKwkJZGVsX3RpbWVyX3N5bmMoJnByZW9yZGVyX2N0cmwtPnJlb3JkZXJpbmdfY3RybF90aW1lcik7CiAJfQogCXNwaW5fbG9jaygmKHBmcmVlX3N0YV9xdWV1ZS0+bG9jaykpOwogCS8qIGluc2VydCBpbnRvIGZyZWVfc3RhX3F1ZXVlOyAyMDA2MTExNCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvcnRsODcxeF94bWl0LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYwppbmRleCBhMjhhZjAzLi4yZTRmYTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi9ydGw4NzF4X3htaXQuYwpAQCAtMjAzLDEzICsyMDMsMTIgQEAKIAlwYXR0cmliLT5ldGhlcl90eXBlID0gbnRvaHMoZXRoZXJoZHIuaF9wcm90byk7CiAKIHsKLQl1OCBib29sOwogCS8qSWYgZHJpdmVyIHhtaXQgQVJQIHBhY2tldCwgZHJpdmVyIGNhbiBzZXQgcHMgbW9kZSB0byBpbml0aWFsCiAJICogc2V0dGluZy4gSXQgc3RhbmRzIGZvciBnZXR0aW5nIERIQ1Agb3IgZml4IElQLiovCiAJaWYgKHBhdHRyaWItPmV0aGVyX3R5cGUgPT0gMHgwODA2KSB7CiAJCWlmIChwYWRhcHRlci0+cHdyY3RybHByaXYucHdyX21vZGUgIT0KIAkJICAgIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYucG93ZXJfbWdudCkgewotCQkJX2NhbmNlbF90aW1lcigmKHBtbG1lcHJpdi0+ZGhjcF90aW1lciksICZib29sKTsKKwkJCWRlbF90aW1lcl9zeW5jKCZwbWxtZXByaXYtPmRoY3BfdGltZXIpOwogCQkJcjg3MTJfc2V0X3BzX21vZGUocGFkYXB0ZXIsIHBhZGFwdGVyLT5yZWdpc3RyeXByaXYuCiAJCQkJcG93ZXJfbWdudCwgcGFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi5zbWFydF9wcyk7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dpZmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3dpZmkuaAppbmRleCA3M2Q3Y2QyLi4xN2Y1MTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi93aWZpLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvd2lmaS5oCkBAIC0yMzUsMTEgKzIzNSw2IEBACiAjZGVmaW5lIEdldFByaXZhY3kocGJ1ZikJKCgoKih1bnNpZ25lZCBzaG9ydCAqKShwYnVmKSkgJiBcCiAJCQkJbGUxNl90b19jcHUoX1BSSVZBQ1lfKSkgIT0gMCkKIAotI2RlZmluZSBDbGVhclByaXZhY3kocGJ1ZikgKHsgXAotCSoodW5zaWduZWQgc2hvcnQgKikocGJ1ZikgJj0gKH5jcHVfdG9fbGUxNihfUFJJVkFDWV8pKTsgXAotfSkKLQotCiAjZGVmaW5lIEdldE9yZGVyKHBidWYpCSgoKCoodW5zaWduZWQgc2hvcnQgKikocGJ1ZikpICYgXAogCQkJbGUxNl90b19jcHUoX09SREVSXykpICE9IDApCiAKQEAgLTI0OCw5ICsyNDMsOSBAQAogCiAjZGVmaW5lIFNldEZyYW1lVHlwZShwYnVmLCB0eXBlKQlcCiAJZG8gewlcCi0JCSoodW5zaWduZWQgc2hvcnQgKikocGJ1ZikgJj0gX19jb25zdGFudF9jcHVfdG9fbGUxNih+KEJJVCgzKSB8IFwKKwkJKih1bnNpZ25lZCBzaG9ydCAqKShwYnVmKSAmPSBjcHVfdG9fbGUxNih+KEJJVCgzKSB8IFwKIAkJQklUKDIpKSk7IFwKLQkJKih1bnNpZ25lZCBzaG9ydCAqKShwYnVmKSB8PSBfX2NvbnN0YW50X2NwdV90b19sZTE2KHR5cGUpOyBcCisJCSoodW5zaWduZWQgc2hvcnQgKikocGJ1ZikgfD0gY3B1X3RvX2xlMTYodHlwZSk7IFwKIAl9IHdoaWxlICgwKQogCiAjZGVmaW5lIEdldEZyYW1lU3ViVHlwZShwYnVmKQkoY3B1X3RvX2xlMTYoKih1bnNpZ25lZCBzaG9ydCAqKShwYnVmKSkgJiBcCkBAIC0yNzAsMTYgKzI2NSw2IEBACiAjZGVmaW5lIEdldEZyYWdOdW0ocGJ1ZikJKGNwdV90b19sZTE2KCoodW5zaWduZWQgc2hvcnQgKikoKGFkZHJfdClcCiAJCQkJKHBidWYpICsgMjIpKSAmIDB4MGYpCiAKLSNkZWZpbmUgR2V0VHVwbGVDYWNoZShwYnVmKQkoY3B1X3RvX2xlMTYoKih1bnNpZ25lZCBzaG9ydCAqKVwKLQkJCQkoKGFkZHJfdCkocGJ1ZikgKyAyMikpKQotCi0jZGVmaW5lIFNldEZyYWdOdW0ocGJ1ZiwgbnVtKSAoeyBcCi0JKih1bnNpZ25lZCBzaG9ydCAqKSgoYWRkcl90KShwYnVmKSArIDIyKSA9IFwKLQkoKCoodW5zaWduZWQgc2hvcnQgKikoKGFkZHJfdCkocGJ1ZikgKyAyMikpICYgXAotCWxlMTZfdG9fY3B1KH4oMHgwMDBmKSkpIHwgXAotCWNwdV90b19sZTE2KDB4MGYgJiAobnVtKSk7ICAgICBcCi19KQotCiAjZGVmaW5lIFNldFNlcU51bShwYnVmLCBudW0pICh7IFwKIAkqKHVuc2lnbmVkIHNob3J0ICopKChhZGRyX3QpKHBidWYpICsgMjIpID0gXAogCSgoKih1bnNpZ25lZCBzaG9ydCAqKSgoYWRkcl90KShwYnVmKSArIDIyKSkgJiBcCkBAIC0zMDYsMTcgKzI5MSw5IEBACiAKICNkZWZpbmUgR2V0QU1zZHUocGJ1ZikgKCgobGUxNl90b19jcHUoKih1bnNpZ25lZCBzaG9ydCAqKXBidWYpKSA+PiA3KSAmIDB4MSkKIAotI2RlZmluZSBTZXRBTXNkdShwYnVmLCBhbXNkdSkgKHsgXAotCSoodW5zaWduZWQgc2hvcnQgKikocGJ1ZikgfD0gY3B1X3RvX2xlMTYoKGFtc2R1ICYgMSkgPDwgNyk7IFwKLX0pCi0KICNkZWZpbmUgR2V0QWlkKHBidWYpCShjcHVfdG9fbGUxNigqKHVuc2lnbmVkIHNob3J0ICopKChhZGRyX3QpKHBidWYpICsgMikpIFwKIAkJCSYgMHgzZmZmKQogCi0jZGVmaW5lIEdldFRpZChwYnVmKQkoY3B1X3RvX2xlMTYoKih1bnNpZ25lZCBzaG9ydCAqKSgoYWRkcl90KShwYnVmKSArIFwKLQkJCSgoKEdldFRvRHMocGJ1ZikgPDwgMSl8R2V0RnJEcyhwYnVmKSkgPT0gMyA/IFwKLQkJCTMwIDogMjQpKSkgJiAweDAwMGYpCi0KICNkZWZpbmUgR2V0QWRkcjFQdHIocGJ1ZikJKCh1bnNpZ25lZCBjaGFyICopKChhZGRyX3QpKHBidWYpICsgNCkpCiAKICNkZWZpbmUgR2V0QWRkcjJQdHIocGJ1ZikJKCh1bnNpZ25lZCBjaGFyICopKChhZGRyX3QpKHBidWYpICsgMTApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIveG1pdF9saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIveG1pdF9saW51eC5jCmluZGV4IDAzOWI1OTguLmQxNWZiMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3htaXRfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi94bWl0X2xpbnV4LmMKQEAgLTE2Miw3ICsxNjIsNyBAQAogaW50IHI4NzEyX3htaXRfZW50cnkoX3BrdCAqcGt0LCBzdHJ1Y3QgIG5ldF9kZXZpY2UgKnBuZXRkZXYpCiB7CiAJc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUgPSBOVUxMOwotCXN0cnVjdCBfYWRhcHRlciAqcGFkYXB0ZXIgPSAoc3RydWN0IF9hZGFwdGVyICopbmV0ZGV2X3ByaXYocG5ldGRldik7CisJc3RydWN0IF9hZGFwdGVyICpwYWRhcHRlciA9IG5ldGRldl9wcml2KHBuZXRkZXYpOwogCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICYocGFkYXB0ZXItPnhtaXRwcml2KTsKIAlpbnQgcmV0ID0gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19hcC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19hcC5jCmluZGV4IGM2MzI3YzAuLjY0NTY2ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfYXAuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2FwLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDx3aWZpLmg+CiAjaW5jbHVkZSA8cnRsODcyM2FfY21kLmg+CiAjaW5jbHVkZSA8cnRsODcyM2FfaGFsLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiBleHRlcm4gdW5zaWduZWQgY2hhciBXTU1fT1VJMjNBW107CiBleHRlcm4gdW5zaWduZWQgY2hhciBXUFNfT1VJMjNBW107CkBAIC03MiwxMSArNzMsOCBAQAogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpwbmV0d29ya19tbG1lZXh0ID0gJnBtbG1laW5mby0+bmV0d29yazsKIAl1bnNpZ25lZCBjaGFyICpwaWUgPSBwbmV0d29ya19tbG1lZXh0LT5JRXM7CiAJdTggKnAsICpkc3RfaWUsICpwcmVtYWluZGVyX2llID0gTlVMTCwgKnBiYWNrdXBfcmVtYWluZGVyX2llID0gTlVMTDsKLQlfX2xlMTYgdGltX2JpdG1hcF9sZTsKIAl1aW50IG9mZnNldCwgdG1wX2xlbiwgdGltX2llbGVuLCB0aW1faWVfb2Zmc2V0LCByZW1haW5kZXJfaWVsZW47CiAKLQl0aW1fYml0bWFwX2xlID0gY3B1X3RvX2xlMTYocHN0YXByaXYtPnRpbV9iaXRtYXApOwotCiAJcCA9IHJ0d19nZXRfaWUyM2EocGllLCBXTEFOX0VJRF9USU0sICZ0aW1faWVsZW4sCiAJCQkgIHBuZXR3b3JrX21sbWVleHQtPklFTGVuZ3RoKTsKIAlpZiAocCAhPSBOVUxMICYmIHRpbV9pZWxlbiA+IDApIHsKQEAgLTE0Myw5ICsxNDEsOSBAQAogCQkqZHN0X2llKysgPSAwOwogCiAJaWYgKHRpbV9pZWxlbiA9PSA0KSB7Ci0JCSpkc3RfaWUrKyA9ICoodTggKikmdGltX2JpdG1hcF9sZTsKKwkJKmRzdF9pZSsrID0gcHN0YXByaXYtPnRpbV9iaXRtYXAgJiAweGZmOwogCX0gZWxzZSBpZiAodGltX2llbGVuID09IDUpIHsKLQkJbWVtY3B5KGRzdF9pZSwgJnRpbV9iaXRtYXBfbGUsIDIpOworCQlwdXRfdW5hbGlnbmVkX2xlMTYocHN0YXByaXYtPnRpbV9iaXRtYXAsIGRzdF9pZSk7CiAJCWRzdF9pZSArPSAyOwogCX0KIApAQCAtMjYyLDE1ICsyNjAsMTcgQEAKIAkJCWxpc3RfZGVsX2luaXQoJnBzdGEtPmFzb2NfbGlzdCk7CiAJCQlwc3RhcHJpdi0+YXNvY19saXN0X2NudC0tOwogCi0JCQlEQkdfODcyM0EoImFzb2MgZXhwaXJlICJNQUNfRk1UIiwgc3RhdGUgPSAweCV4XG4iLCBNQUNfQVJHKHBzdGEtPmh3YWRkciksIHBzdGEtPnN0YXRlKTsKKwkJCURCR184NzIzQSgiYXNvYyBleHBpcmUgJXBNLCBzdGF0ZSA9IDB4JXhcbiIsCisJCQkJICBwc3RhLT5od2FkZHIsIHBzdGEtPnN0YXRlKTsKIAkJCXVwZGF0ZWQgPSBhcF9mcmVlX3N0YTIzYShwYWRhcHRlciwgcHN0YSwgZmFsc2UsIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKIAkJfSBlbHNlIHsKIAkJCS8qIFRPRE86IEFnaW5nIG1lY2hhbmlzbSB0byBkaWdlc3QgZnJhbWVzIGluIHNsZWVwX3EgdG8gYXZvaWQgcnVubmluZyBvdXQgb2YgeG1pdGZyYW1lICovCiAJCQlpZiAocHN0YS0+c2xlZXBxX2xlbiA+IChOUl9YTUlURlJBTUUvcHN0YXByaXYtPmFzb2NfbGlzdF9jbnQpCiAJCQkJJiYgcGFkYXB0ZXItPnhtaXRwcml2LmZyZWVfeG1pdGZyYW1lX2NudCA8ICgoTlJfWE1JVEZSQU1FL3BzdGFwcml2LT5hc29jX2xpc3RfY250KS8yKQogCQkJKSB7Ci0JCQkJREJHXzg3MjNBKCIlcyBzdGE6Ik1BQ19GTVQiLCBzbGVlcHFfbGVuOiV1LCBmcmVlX3htaXRmcmFtZV9jbnQ6JXUsIGFzb2NfbGlzdF9jbnQ6JXUsIGNsZWFyIHNsZWVwX3FcbiIsIF9fZnVuY19fLAotCQkJCQkgIE1BQ19BUkcocHN0YS0+aHdhZGRyKSwKKwkJCQlEQkdfODcyM0EoIiVzIHN0YTolcE0sIHNsZWVwcV9sZW46JXUsIGZyZWVfeG1pdGZyYW1lX2NudDoldSwgYXNvY19saXN0X2NudDoldSwgY2xlYXIgc2xlZXBfcVxuIiwKKwkJCQkJICBfX2Z1bmNfXywKKwkJCQkJICBwc3RhLT5od2FkZHIsCiAJCQkJCSAgcHN0YS0+c2xlZXBxX2xlbiwKIAkJCQkJICBwYWRhcHRlci0+eG1pdHByaXYuZnJlZV94bWl0ZnJhbWVfY250LAogCQkJCQkgIHBzdGFwcml2LT5hc29jX2xpc3RfY250KTsKQEAgLTMwNyw3ICszMDcsOCBAQAogCiAJCXBzdGEtPmtlZXBfYWxpdmVfdHJ5Y250Kys7CiAJCWlmIChyZXQgPT0gX1NVQ0NFU1MpIHsKLQkJCURCR184NzIzQSgiYXNvYyBjaGVjaywgc3RhKCIgTUFDX0ZNVCAiKSBpcyBhbGl2ZVxuIiwgTUFDX0FSRyhwc3RhLT5od2FkZHIpKTsKKwkJCURCR184NzIzQSgiYXNvYyBjaGVjaywgc3RhKCVwTSkgaXMgYWxpdmVcbiIsCisJCQkJICBwc3RhLT5od2FkZHIpOwogCQkJcHN0YS0+ZXhwaXJlX3RvID0gcHN0YXByaXYtPmV4cGlyZV90bzsKIAkJCXBzdGEtPmtlZXBfYWxpdmVfdHJ5Y250ID0gMDsKIAkJCWNvbnRpbnVlOwpAQCAtMzE5LDcgKzMyMCw4IEBACiAKIAkJcHN0YS0+a2VlcF9hbGl2ZV90cnljbnQgPSAwOwogCi0JCURCR184NzIzQSgiYXNvYyBleHBpcmUgIk1BQ19GTVQiLCBzdGF0ZSA9IDB4JXhcbiIsIE1BQ19BUkcocHN0YS0+aHdhZGRyKSwgcHN0YS0+c3RhdGUpOworCQlEQkdfODcyM0EoImFzb2MgZXhwaXJlICVwTSwgc3RhdGUgPSAweCV4XG4iLAorCQkJICBwc3RhLT5od2FkZHIsIHBzdGEtPnN0YXRlKTsKIAkJc3Bpbl9sb2NrX2JoKCZwc3RhcHJpdi0+YXNvY19saXN0X2xvY2spOwogCQlpZiAoIWxpc3RfZW1wdHkoJnBzdGEtPmFzb2NfbGlzdCkpIHsKIAkJCWxpc3RfZGVsX2luaXQoJnBzdGEtPmFzb2NfbGlzdCk7CkBAIC03ODUsNiArNzg3LDcgQEAKIAlzdHJ1Y3Qgd2xhbl9ic3NpZF9leCAqcGJzc19uZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcmsubmV0d29yazsKIAl1OCAqaWUgPSBwYnNzX25ldHdvcmstPklFczsKIAl1OCAqcGJ1ZiA9IG1nbXQtPnUuYmVhY29uLnZhcmlhYmxlOworCiAJbGVuIC09IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpOwogCS8qIFNTSUQgKi8KIAkvKiBTdXBwb3J0ZWQgcmF0ZXMgKi8KQEAgLTEwNDUsNyArMTA0OCw3IEBACiAJc3RydWN0IHdsYW5fYWNsX3Bvb2wgKnBhY2xfbGlzdCA9ICZwc3RhcHJpdi0+YWNsX2xpc3Q7CiAJc3RydWN0IHJ0d19xdWV1ZSAqcGFjbF9ub2RlX3EgPSAmcGFjbF9saXN0LT5hY2xfbm9kZV9xOwogCi0JREJHXzg3MjNBKCIlcyhhY2xfbnVtID0lZCkgPSIgTUFDX0ZNVCAiXG4iLCBfX2Z1bmNfXywgcGFjbF9saXN0LT5udW0sIE1BQ19BUkcoYWRkcikpOworCURCR184NzIzQSgiJXMoYWNsX251bSA9JWQpID0lcE1cbiIsIF9fZnVuY19fLCBwYWNsX2xpc3QtPm51bSwgYWRkcik7CiAKIAlpZiAoKE5VTV9BQ0wtMSkgPCBwYWNsX2xpc3QtPm51bSkKIAkJcmV0dXJuIC0xOwpAQCAtMTQ3Nyw4ICsxNDgwLDggQEAKIAlpZiAocHN0YS0+ZmxhZ3MgJiBXTEFOX1NUQV9IVCkgewogCQl1MTYgaHRfY2FwYWIgPSBsZTE2X3RvX2NwdShwc3RhLT5odHByaXYuaHRfY2FwLmNhcF9pbmZvKTsKIAotCQlEQkdfODcyM0EoIkhUOiBTVEEgIiBNQUNfRk1UICIgSFQgQ2FwYWJpbGl0aWVzICIKLQkJCSAgICJJbmZvOiAweCUwNHhcbiIsIE1BQ19BUkcocHN0YS0+aHdhZGRyKSwgaHRfY2FwYWIpOworCQlEQkdfODcyM0EoIkhUOiBTVEEgJXBNIEhUIENhcGFiaWxpdGllcyBJbmZvOiAweCUwNHhcbiIsCisJCQkgIHBzdGEtPmh3YWRkciwgaHRfY2FwYWIpOwogCiAJCWlmIChwc3RhLT5ub19odF9zZXQpIHsKIAkJCXBzdGEtPm5vX2h0X3NldCA9IDA7CkBAIC0xNDkwLDEwICsxNDkzLDkgQEAKIAkJCQlwc3RhLT5ub19odF9nZl9zZXQgPSAxOwogCQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9odF9ub19nZisrOwogCQkJfQotCQkJREJHXzg3MjNBKCIlcyBTVEEgIiBNQUNfRk1UICIgLSBubyAiCi0JCQkJICAgImdyZWVuZmllbGQsIG51bSBvZiBub24tZ2Ygc3RhdGlvbnMgJWRcbiIsCi0JCQkJICAgX19mdW5jX18sIE1BQ19BUkcocHN0YS0+aHdhZGRyKSwKLQkJCQkgICBwbWxtZXByaXYtPm51bV9zdGFfaHRfbm9fZ2YpOworCQkJREJHXzg3MjNBKCIlcyBTVEEgJXBNIC0gbm8gZ3JlZW5maWVsZCwgbnVtIG9mIG5vbi1nZiBzdGF0aW9ucyAlZFxuIiwKKwkJCQkgIF9fZnVuY19fLCBwc3RhLT5od2FkZHIsCisJCQkJICBwbWxtZXByaXYtPm51bV9zdGFfaHRfbm9fZ2YpOwogCQl9CiAKIAkJaWYgKChodF9jYXBhYiAmIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwKSA9PSAwKSB7CkBAIC0xNTAxLDEwICsxNTAzLDkgQEAKIAkJCQlwc3RhLT5odF8yMG1oel9zZXQgPSAxOwogCQkJCXBtbG1lcHJpdi0+bnVtX3N0YV9odF8yMG1oeisrOwogCQkJfQotCQkJREJHXzg3MjNBKCIlcyBTVEEgIiBNQUNfRk1UICIgLSAyMCBNSHogSFQsICIKLQkJCQkgICAibnVtIG9mIDIwTUh6IEhUIFNUQXMgJWRcbiIsCi0JCQkJICAgX19mdW5jX18sIE1BQ19BUkcocHN0YS0+aHdhZGRyKSwKLQkJCQkgICBwbWxtZXByaXYtPm51bV9zdGFfaHRfMjBtaHopOworCQkJREJHXzg3MjNBKCIlcyBTVEEgJXBNIC0gMjAgTUh6IEhULCBudW0gb2YgMjBNSHogSFQgU1RBcyAlZFxuIiwKKwkJCQkgIF9fZnVuY19fLCBwc3RhLT5od2FkZHIsCisJCQkJICBwbWxtZXByaXYtPm51bV9zdGFfaHRfMjBtaHopOwogCQl9CiAKIAl9IGVsc2UgewpAQCAtMTUxMywxMCArMTUxNCw5IEBACiAJCQlwbWxtZXByaXYtPm51bV9zdGFfbm9faHQrKzsKIAkJfQogCQlpZiAocG1sbWVwcml2LT5odHByaXYuaHRfb3B0aW9uKSB7Ci0JCQlEQkdfODcyM0EoIiVzIFNUQSAiIE1BQ19GTVQKLQkJCQkgICAiIC0gbm8gSFQsIG51bSBvZiBub24tSFQgc3RhdGlvbnMgJWRcbiIsCi0JCQkJICAgX19mdW5jX18sIE1BQ19BUkcocHN0YS0+aHdhZGRyKSwKLQkJCQkgICBwbWxtZXByaXYtPm51bV9zdGFfbm9faHQpOworCQkJREJHXzg3MjNBKCIlcyBTVEEgJXBNIC0gbm8gSFQsIG51bSBvZiBub24tSFQgc3RhdGlvbnMgJWRcbiIsCisJCQkJICBfX2Z1bmNfXywgcHN0YS0+aHdhZGRyLAorCQkJCSAgcG1sbWVwcml2LT5udW1fc3RhX25vX2h0KTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfY21kLmMKaW5kZXggMjQ0N2E1Ni4uNDZhZWExNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19jbWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2NtZC5jCkBAIC0yOTksOSArMjk5LDggQEAKIAkJcGNtZF9jYWxsYmFjayA9CXJ0d19jbWRfY2FsbGJhY2tbcGNtZC0+Y21kY29kZV0uY2FsbGJhY2s7CiAJCWlmICghcGNtZF9jYWxsYmFjaykgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9pbmZvXywKLQkJCQkgKCJtbG1lX2NtZF9oZGwoKTogcGNtZF9jYWxsYmFjayA9IDB4JXAsICIKLQkJCQkgICJjbWRjb2RlID0gMHgleFxuIiwKLQkJCQkgIHBjbWRfY2FsbGJhY2ssIHBjbWQtPmNtZGNvZGUpKTsKKwkJCQkgIm1sbWVfY21kX2hkbCgpOiBwY21kX2NhbGxiYWNrID0gMHglcCwgY21kY29kZSA9IDB4JXhcbiIsCisJCQkJIHBjbWRfY2FsbGJhY2ssIHBjbWQtPmNtZGNvZGUpOwogCQkJcnR3X2ZyZWVfY21kX29iajIzYShwY21kKTsKIAkJfSBlbHNlIHsKIAkJCS8qIG5lZWQgY29uc2lkZXIgdGhhdCBmcmVlIGNtZF9vYmogaW4KQEAgLTMxMCw4ICszMDksOCBAQAogCQl9CiAJfSBlbHNlIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICgiJXM6IGNtZGNvZGUgPSAweCV4IGNhbGxiYWNrIG5vdCBkZWZpbmVkIVxuIiwKLQkJCSAgX19mdW5jX18sIHBjbWQtPmNtZGNvZGUpKTsKKwkJCSAiJXM6IGNtZGNvZGUgPSAweCV4IGNhbGxiYWNrIG5vdCBkZWZpbmVkIVxuIiwKKwkJCSBfX2Z1bmNfXywgcGNtZC0+Y21kY29kZSk7CiAJCXJ0d19mcmVlX2NtZF9vYmoyM2EocGNtZCk7CiAJfQogfQpAQCAtMzQzLDcgKzM0Miw3IEBACiAJcnR3X2ZyZWVfbmV0d29ya19xdWV1ZTIzYShwYWRhcHRlcik7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2luZm9fLAotCQkgKCIlczogZmx1c2ggbmV0d29yayBxdWV1ZVxuIiwgX19mdW5jX18pKTsKKwkJICIlczogZmx1c2ggbmV0d29yayBxdWV1ZVxuIiwgX19mdW5jX18pOwogCiAJaW5pdF9oMmZ3Y21kX3dfcGFybV9ub19yc3AocGgyYywgcHN1cnZleVBhcmEsCiAJCQkJICAgR0VOX0NNRF9DT0RFKF9TaXRlU3VydmV5KSk7CkBAIC00MTIsMTIgKzQxMSwxMiBAQAogCiAJaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbiA9PSAwKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCIgY3JlYXRlYnNzIGZvciBBbnkgU1NpZDolc1xuIiwKLQkJCSAgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpKTsKKwkJCSAiY3JlYXRlYnNzIGZvciBBbnkgU1NpZDolc1xuIiwKKwkJCSBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCk7CiAJfSBlbHNlIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIiBjcmVhdGVic3MgZm9yIFNTaWQ6JXNcbiIsCi0JCQkgIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkKSk7CisJCQkgImNyZWF0ZWJzcyBmb3IgU1NpZDolc1xuIiwKKwkJCSBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCk7CiAJfQogCiAJcGNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjbWRfb2JqKSwgR0ZQX0FUT01JQyk7CkBAIC00NjAsMTkgKzQ1OSwxOCBAQAogCiAJaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbiA9PSAwKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCIrSm9pbiBjbWQ6IEFueSBTU2lkXG4iKSk7CisJCQkgIitKb2luIGNtZDogQW55IFNTaWRcbiIpOwogCX0gZWxzZSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfbm90aWNlXywKLQkJCSAoIitKb2luIGNtZDogU1NpZCA9WyVzXVxuIiwKLQkJCSAgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpKTsKKwkJCSAiK0pvaW4gY21kOiBTU2lkID1bJXNdXG4iLAorCQkJIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkKTsKIAl9CiAKIAlwY21kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtZF9vYmopLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXBjbWQpIHsKIAkJcmVzID0gX0ZBSUw7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAoInJ0d19qb2luYnNzX2NtZDIzYTogbWVtb3J5IGFsbG9jYXRlIGZvciBjbWRfb2JqICIKLQkJCSAgImZhaWwhISFcbiIpKTsKKwkJCSAicnR3X2pvaW5ic3NfY21kMjNhOiBtZW1vcnkgYWxsb2NhdGUgZm9yIGNtZF9vYmogZmFpbCEhIVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTQ5Nyw3ICs0OTUsNyBAQAogCQlyZXMgPSBfRkFJTDsKIAogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJydHdfam9pbmJzc19jbWQyM2EgOnBzZWNuZXR3b3JrID09IE5VTEwhISFcbiIpKTsKKwkJCSAicnR3X2pvaW5ic3NfY21kMjNhIDpwc2VjbmV0d29yayA9PSBOVUxMISEhXG4iKTsKIAogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtNTk5LDcgKzU5Nyw3IEBACiAJaW50IHJlcyA9IF9TVUNDRVNTOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9ub3RpY2VfLAotCQkgKCIrcnR3X2Rpc2Fzc29jX2NtZDIzYVxuIikpOworCQkgIitydHdfZGlzYXNzb2NfY21kMjNhXG4iKTsKIAogCS8qIHByZXBhcmUgY21kIHBhcmFtZXRlciAqLwogCXBhcmFtID0ga3phbGxvYyhzaXplb2YoKnBhcmFtKSwgR0ZQX0FUT01JQyk7CkBAIC0xMjkxLDggKzEyODksNyBAQAogCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+c2Nhbl90b190aW1lciwKIAkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbiAqKioqKioqKkVycm9yOiBNZ250QWN0cnR3X3NldF84MDJfMTFfYnNzaWQyM2FfIgotCQkJICAiTElTVF9TQ0FOIEZhaWwgKioqKioqKioqKioqXG5cbi4iKSk7CisJCQkgIioqKioqKioqRXJyb3I6IE1nbnRBY3RydHdfc2V0XzgwMl8xMV9ic3NpZDIzYV9MSVNUX1NDQU4gRmFpbCAqKioqKioqKioqKipcbiIpOwogCX0KIAogCS8qICBmcmVlIGNtZCAqLwpAQCAtMTMwOSw3ICsxMzA2LDcgQEAKIAkJc2V0X2Z3c3RhdGUocG1sbWVwcml2LCBfRldfTElOS0VEKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAoIlxuICoqKkVycm9yOiBkaXNjb25uZWN0X2NtZF9jYWxsYmFjayBGYWlsICoqKlxuLiIpKTsKKwkJCSAiKioqRXJyb3I6IGRpc2Nvbm5lY3RfY21kX2NhbGxiYWNrIEZhaWwgKioqXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTMyOSw4ICsxMzI2LDcgQEAKIAkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCX0gZWxzZSBpZiAocGNtZC0+cmVzICE9IEgyQ19TVUNDRVNTKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAoIioqKioqKioqRXJyb3I6cnR3X3NlbGVjdF9hbmRfam9pbl9mcm9tX3NjYW5uZWRfIgotCQkJICAicXVldWUgV2FpdCBTZW1hICBGYWlsICoqKioqKioqKioqKlxuIikpOworCQkJICIqKioqKioqKkVycm9yOnJ0d19zZWxlY3RfYW5kX2pvaW5fZnJvbV9zY2FubmVkX3F1ZXVlIFdhaXQgU2VtYSAgRmFpbCAqKioqKioqKioqKipcbiIpOwogCQltb2RfdGltZXIoJnBtbG1lcHJpdi0+YXNzb2NfdGltZXIsCiAJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAl9CkBAIC0xMzQ5LDggKzEzNDUsNyBAQAogCiAJaWYgKHBjbWQtPnJlcyAhPSBIMkNfU1VDQ0VTUykgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbiAqKioqKioqKkVycm9yOiBydHdfY3JlYXRlYnNzX2NtZDIzYV9jYWxsYmFjayAgIgotCQkJICAiRmFpbCAqKioqKioqKioqKipcblxuLiIpKTsKKwkJCSAiKioqKioqKipFcnJvcjogcnR3X2NyZWF0ZWJzc19jbWQyM2FfY2FsbGJhY2sgIEZhaWwgKioqKioqKioqKioqXG4iKTsKIAkJbW9kX3RpbWVyKCZwbWxtZXByaXYtPmFzc29jX3RpbWVyLAogCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxKSk7CiAJfQpAQCAtMTM2Niw5ICsxMzYxLDggQEAKIAkJCQkJCSAgICBHRlBfS0VSTkVMKTsKIAkJCWlmICghcHN0YSkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCQkJICgiXG5DYW4ndCBhbGxvYyBzdGFfaW5mbyB3aGVuICIKLQkJCQkJICAiY3JlYXRlYnNzX2NtZF9jYWxsYmFja1xuIikpOwotCQkJCWdvdG8gY3JlYXRlYnNzX2NtZF9mYWlsIDsKKwkJCQkJICJDYW4ndCBhbGxvYyBzdGFfaW5mbyB3aGVuIGNyZWF0ZWJzc19jbWRfY2FsbGJhY2tcbiIpOworCQkJCWdvdG8gY3JlYXRlYnNzX2NtZF9mYWlsOwogCQkJfQogCQl9CiAKQEAgLTEzODIsOCArMTM3Niw3IEBACiAJCQlwd2xhbiA9IHJ0d19nZXRfb2xkZXN0X3dsYW5fbmV0d29yazIzYSgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlKTsKIAkJCWlmICghcHdsYW4pIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfY21kX2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAoIlxuIEVycm9yOiAgY2FuJ3QgZ2V0IHB3bGFuIGluICIKLQkJCQkJICAicnR3MjNhX2pvaW5ic3NfZXZlbnRfY2JcbiIpKTsKKwkJCQkJICJFcnJvcjogIGNhbid0IGdldCBwd2xhbiBpbiBydHcyM2Ffam9pbmJzc19ldmVudF9jYlxuIik7CiAJCQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKIAkJCQlnb3RvIGNyZWF0ZWJzc19jbWRfZmFpbDsKIAkJCX0KQEAgLTE0MzIsOCArMTQyNSw3IEBACiAKIAlpZiAoIXBzdGEpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICgiXG5FUlJPUjogcnR3X3NldHN0YUtleV9jbWRyc3BfY2FsbGJhY2syM2EgPT4gIgotCQkJICAiY2FuJ3QgZ2V0IHN0YV9pbmZvXG5cbiIpKTsKKwkJCSAiRVJST1I6IHJ0d19zZXRzdGFLZXlfY21kcnNwX2NhbGxiYWNrMjNhID0+IGNhbid0IGdldCBzdGFfaW5mb1xuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTE0NTcsOCArMTQ0OSw3IEBACiAKIAlpZiAocHN0YSA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAoIlxuRVJST1I6IHNldGFzc29jc3RhX2NtZHJzcF9jYWxsYmFjID0+IGNhbid0ICIKLQkJCSAgImdldCBzdGFfaW5mb1xuXG4iKSk7CisJCQkgIkVSUk9SOiBzZXRhc3NvY3N0YV9jbWRyc3BfY2FsbGJhYyA9PiBjYW4ndCBnZXQgc3RhX2luZm9cbiIpOwogCQlnb3RvIGV4aXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2VmdXNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2VmdXNlLmMKaW5kZXggYTZkZWRkYy4uOTJhMzRkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19lZnVzZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfZWZ1c2UuYwpAQCAtMzA0LDggKzMwNCw3IEBACiAJCX0KIAkJZGF0YSA9IHJ0bDg3MjNhdV9yZWFkOChBZGFwdGVyLCBFRlVTRV9DVFJMKTsKIAkJcmV0dXJuIGRhdGE7Ci0JfQotCWVsc2UKKwl9IGVsc2UKIAkJcmV0dXJuIDB4RkY7CiB9LyogRUZVU0VfUmVhZDFCeXRlMjNhICovCiAKQEAgLTMzNiw3ICszMzUsNiBAQAogCXUzMglrID0gMDsKIAl1MTYJY29udGVudExlbiA9IDA7CiAKLQkvKiBSVF9UUkFDRShDT01QX0VGVVNFLCBEQkdfTE9VRCwgKCJBZGRyID0leCBEYXRhID0leFxuIiwgQWRkcmVzcywgVmFsdWUpKTsgKi8KIAlFRlVTRV9HZXRFZnVzZURlZmluaXRpb24yM2EoQWRhcHRlciwgRUZVU0VfV0lGSSwKIAkJCQkgVFlQRV9FRlVTRV9SRUFMX0NPTlRFTlRfTEVOLAogCQkJCSAodm9pZCAqKSZjb250ZW50TGVuKTsKQEAgLTQwNSw4ICs0MDMsNiBAQAogCXU4CXRtcGlkeCA9IDA7CiAJaW50CWJSZXN1bHQ7CiAKLQkvKiBSVF9UUkFDRShDT01QX0VGVVNFLCBEQkdfTE9VRCwgKCJBZGRyID0gJXggRGF0YSA9JXhcbiIsIGFkZHIsIGRhdGEpKTsgKi8KLQogCS8qIHJldHVybgkwOyAqLwogCiAJLyogIC0tLS0tLS0tLS0tLS0tLS0tZS1mdXNlIHJlZyBjdHJsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19pZWVlODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfaWVlZTgwMjExLmMKaW5kZXggYmJiY2ZjOC4uY2RkN2JjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19pZWVlODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X2llZWU4MDIxMS5jCkBAIC00NzIsOCArNDcyLDggQEAKIAkJbGVmdCAtPSBXUEFfU0VMRUNUT1JfTEVOOwogCX0gZWxzZSBpZiAobGVmdCA+IDApIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAoIiVzOiBpZSBsZW5ndGggbWlzbWF0Y2gsICV1IHRvbyBtdWNoIiwKLQkJCSAgX19mdW5jX18sIGxlZnQpKTsKKwkJCSAiJXM6IGllIGxlbmd0aCBtaXNtYXRjaCwgJXUgdG9vIG11Y2hcbiIsCisJCQkgX19mdW5jX18sIGxlZnQpOwogCiAJCXJldHVybiBfRkFJTDsKIAl9CkBAIC00ODcsOSArNDg3LDggQEAKIAogCQlpZiAoY291bnQgPT0gMCB8fCBsZWZ0IDwgY291bnQgKiBXUEFfU0VMRUNUT1JfTEVOKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJCSAoIiVzOiBpZSBjb3VudCBib3RjaCAocGFpcndpc2UpLCAiCi0JCQkJICAiY291bnQgJXUgbGVmdCAldSIsIF9fZnVuY19fLAotCQkJCSAgY291bnQsIGxlZnQpKTsKKwkJCQkgIiVzOiBpZSBjb3VudCBib3RjaCAocGFpcndpc2UpLCBjb3VudCAldSBsZWZ0ICV1XG4iLAorCQkJCSBfX2Z1bmNfXywgY291bnQsIGxlZnQpOwogCQkJcmV0dXJuIF9GQUlMOwogCQl9CiAKQEAgLTUwMSw3ICs1MDAsNyBAQAogCQl9CiAJfSBlbHNlIGlmIChsZWZ0ID09IDEpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAoIiVzOiBpZSB0b28gc2hvcnQgKGZvciBrZXkgbWdtdCkiLCBfX2Z1bmNfXykpOworCQkJICIlczogaWUgdG9vIHNob3J0IChmb3Iga2V5IG1nbXQpXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBfRkFJTDsKIAl9CiAKQEAgLTUxMCw4ICs1MDksOCBAQAogCQkJcG9zICs9IDI7CiAJCQlpZiAoIW1lbWNtcChwb3MsIFJUV19XUEFfT1VJMjNBX1RZUEUsIDQpKSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAoIiVzIDogdGhlcmUgaGFzIDgwMi4xeCBhdXRoXG4iLAotCQkJCQkgIF9fZnVuY19fKSk7CisJCQkJCSAiJXMgOiB0aGVyZSBoYXMgODAyLjF4IGF1dGhcbiIsCisJCQkJCSBfX2Z1bmNfXyk7CiAJCQkJKmlzXzgwMjF4ID0gMTsKIAkJCX0KIAkJfQpAQCAtNTQ5LDggKzU0OCw4IEBACiAJCWxlZnQgLT0gUlNOX1NFTEVDVE9SX0xFTjsKIAl9IGVsc2UgaWYgKGxlZnQgPiAwKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIlczogaWUgbGVuZ3RoIG1pc21hdGNoLCAldSB0b28gbXVjaCIsCi0JCQkgIF9fZnVuY19fLCBsZWZ0KSk7CisJCQkgIiVzOiBpZSBsZW5ndGggbWlzbWF0Y2gsICV1IHRvbyBtdWNoXG4iLAorCQkJIF9fZnVuY19fLCBsZWZ0KTsKIAkJcmV0dXJuIF9GQUlMOwogCX0KIApAQCAtNTYzLDkgKzU2Miw4IEBACiAKIAkJaWYgKGNvdW50ID09IDAgfHwgbGVmdCA8IGNvdW50ICogUlNOX1NFTEVDVE9SX0xFTikgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCQkgKCIlczogaWUgY291bnQgYm90Y2ggKHBhaXJ3aXNlKSwgIgotCQkJCSAgImNvdW50ICV1IGxlZnQgJXUiLAotCQkJCSAgX19mdW5jX18sIGNvdW50LCBsZWZ0KSk7CisJCQkJICIlczogaWUgY291bnQgYm90Y2ggKHBhaXJ3aXNlKSwgY291bnQgJXUgbGVmdCAldVxuIiwKKwkJCQkgX19mdW5jX18sIGNvdW50LCBsZWZ0KTsKIAkJCXJldHVybiBfRkFJTDsKIAkJfQogCkBAIC01NzcsNyArNTc1LDcgQEAKIAkJfQogCX0gZWxzZSBpZiAobGVmdCA9PSAxKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIlczogaWUgdG9vIHNob3J0IChmb3Iga2V5IG1nbXQpIiwgIF9fZnVuY19fKSk7CisJCQkgIiVzOiBpZSB0b28gc2hvcnQgKGZvciBrZXkgbWdtdClcbiIsICBfX2Z1bmNfXyk7CiAKIAkJcmV0dXJuIF9GQUlMOwogCX0KQEAgLTU4Nyw4ICs1ODUsOCBAQAogCQkJcG9zICs9IDI7CiAJCQlpZiAoIW1lbWNtcChwb3MsIFNVSVRFXzFYLCA0KSkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgKCIlcyAoKTogdGhlcmUgaGFzIDgwMi4xeCBhdXRoXG4iLAotCQkJCQkgIF9fZnVuY19fKSk7CisJCQkJCSAiJXMgKCk6IHRoZXJlIGhhcyA4MDIuMXggYXV0aFxuIiwKKwkJCQkJIF9fZnVuY19fKTsKIAkJCQkqaXNfODAyMXggPSAxOwogCQkJfQogCQl9CkBAIC03MDAsNyArNjk4LDcgQEAKIAogCWlmIChwYnVmICYmIHBidWZbMV0gPiAwKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJICgicnR3X2dldF9jaXBoZXJfaW5mbzogd3BhX2llbGVuOiAlZCIsIHBidWZbMV0pKTsKKwkJCSAicnR3X2dldF9jaXBoZXJfaW5mbzogd3BhX2llbGVuOiAlZFxuIiwgcGJ1ZlsxXSk7CiAJCXIgPSBydHdfcGFyc2Vfd3BhX2llMjNhKHBidWYsIHBidWZbMV0gKyAyLCAmZ3JvdXBfY2lwaGVyLAogCQkJCSAgICAgJnBhaXJ3aXNlX2NpcGhlciwgJmlzODAyMXgpOwogCQlpZiAociA9PSBfU1VDQ0VTUykgewpAQCAtNzA4LDEwICs3MDYsOSBAQAogCQkJcG5ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyID0gZ3JvdXBfY2lwaGVyOwogCQkJcG5ldHdvcmstPkJjbkluZm8uaXNfODAyMXggPSBpczgwMjF4OwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJICgiJXM6IHBuZXR3b3JrLT5wYWlyd2lzZV9jaXBoZXI6ICVkLCBpc18iCi0JCQkJICAiODAyMXggaXMgJWQiLCBfX2Z1bmNfXywKLQkJCQkgIHBuZXR3b3JrLT5CY25JbmZvLnBhaXJ3aXNlX2NpcGhlciwKLQkJCQkgIHBuZXR3b3JrLT5CY25JbmZvLmlzXzgwMjF4KSk7CisJCQkJICIlczogcG5ldHdvcmstPnBhaXJ3aXNlX2NpcGhlcjogJWQsIGlzXzgwMjF4IGlzICVkXG4iLAorCQkJCSBfX2Z1bmNfXywgcG5ldHdvcmstPkJjbkluZm8ucGFpcndpc2VfY2lwaGVyLAorCQkJCSBwbmV0d29yay0+QmNuSW5mby5pc184MDIxeCk7CiAJCQlyZXQgPSBfU1VDQ0VTUzsKIAkJfQogCX0gZWxzZSB7CkBAIC03MTksMjQgKzcxNiwyMyBAQAogCiAJCWlmIChwYnVmICYmIHBidWZbMV0gPiAwKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkgKCJnZXQgUlNOIElFXG4iKSk7CisJCQkJICJnZXQgUlNOIElFXG4iKTsKIAkJCXIgPSBydHdfcGFyc2Vfd3BhMl9pZTIzYShwYnVmLCBwYnVmWzFdICsgMiwKIAkJCQkJICAgICAgJmdyb3VwX2NpcGhlciwgJnBhaXJ3aXNlX2NpcGhlciwKIAkJCQkJICAgICAgJmlzODAyMXgpOwogCQkJaWYgKHIgPT0gX1NVQ0NFU1MpIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkJICgiZ2V0IFJTTiBJRSAgT0shISFcbiIpKTsKKwkJCQkJICJnZXQgUlNOIElFICBPSyEhIVxuIik7CiAJCQkJcG5ldHdvcmstPkJjbkluZm8ucGFpcndpc2VfY2lwaGVyID0KIAkJCQkJcGFpcndpc2VfY2lwaGVyOwogCQkJCXBuZXR3b3JrLT5CY25JbmZvLmdyb3VwX2NpcGhlciA9IGdyb3VwX2NpcGhlcjsKIAkJCQlwbmV0d29yay0+QmNuSW5mby5pc184MDIxeCA9IGlzODAyMXg7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAoIiVzOiBwbmV0d29yay0+cGFpcndpc2VfY2lwaGVyOiAlZCwiCi0JCQkJCSAgInBuZXR3b3JrLT5ncm91cF9jaXBoZXIgaXMgJWQsICIKLQkJCQkJICAiaXNfODAyMXggaXMgJWQiLCBfX2Z1bmNfXywKLQkJCQkJICBwbmV0d29yay0+QmNuSW5mby5wYWlyd2lzZV9jaXBoZXIsCi0JCQkJCSAgcG5ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyLAotCQkJCQkgIHBuZXR3b3JrLT5CY25JbmZvLmlzXzgwMjF4KSk7CisJCQkJCSAiJXM6IHBuZXR3b3JrLT5wYWlyd2lzZV9jaXBoZXI6ICVkLHBuZXR3b3JrLT5ncm91cF9jaXBoZXIgaXMgJWQsIGlzXzgwMjF4IGlzICVkXG4iLAorCQkJCQkgX19mdW5jX18sCisJCQkJCSBwbmV0d29yay0+QmNuSW5mby5wYWlyd2lzZV9jaXBoZXIsCisJCQkJCSBwbmV0d29yay0+QmNuSW5mby5ncm91cF9jaXBoZXIsCisJCQkJCSBwbmV0d29yay0+QmNuSW5mby5pc184MDIxeCk7CiAJCQkJcmV0ID0gX1NVQ0NFU1M7CiAJCQl9CiAJCX0KQEAgLTc1OSw3ICs3NTUsNyBAQAogCQlwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wgPSBFTkNSWVBfUFJPVE9DT0xfT1BFTlNZUzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgKCIlczogc3NpZCA9JXNcbiIsIF9fZnVuY19fLCBwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQpKTsKKwkJICIlczogc3NpZCA9JXNcbiIsIF9fZnVuY19fLCBwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQpOwogCiAJcGllID0gcG5ldHdvcmstPm5ldHdvcmsuSUVzOwogCXBpZV9sZW4gPSBwbmV0d29yay0+bmV0d29yay5JRUxlbmd0aDsKQEAgLTc3NiwxMSArNzcyLDExIEBACiAJCQlwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wgPSBFTkNSWVBfUFJPVE9DT0xfV0VQOwogCX0KIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICgiJXM6IHBuZXR3b3JrLT5lbmNyeXBfcHJvdG9jb2wgaXMgJXhcbiIsIF9fZnVuY19fLAotCQkgIHBuZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCkpOworCQkgIiVzOiBwbmV0d29yay0+ZW5jcnlwX3Byb3RvY29sIGlzICV4XG4iLCBfX2Z1bmNfXywKKwkJIHBuZXR3b3JrLT5CY25JbmZvLmVuY3J5cF9wcm90b2NvbCk7CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAoIiVzOiBwbmV0d29yay0+ZW5jcnlwX3Byb3RvY29sIGlzICV4XG4iLCBfX2Z1bmNfXywKLQkJICBwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wpKTsKKwkJICIlczogcG5ldHdvcmstPmVuY3J5cF9wcm90b2NvbCBpcyAleFxuIiwgX19mdW5jX18sCisJCSBwbmV0d29yay0+QmNuSW5mby5lbmNyeXBfcHJvdG9jb2wpOwogCXJ0d19nZXRfY2lwaGVyX2luZm8ocG5ldHdvcmspOwogCiAJLyogZ2V0IGJ3bW9kZSBhbmQgY2hfb2Zmc2V0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWUuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZS5jCmluZGV4IDcyOTllZjAuLjNjMDllYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZS5jCkBAIC05NCw3ICs5NCw3IEBACiB2b2lkIHJ0d19mcmVlX21sbWVfcHJpdjIzYShzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYpCiB7CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJICgicnR3X2ZyZWVfbWxtZV9wcml2MjNhXG4iKSk7CisJCSAicnR3X2ZyZWVfbWxtZV9wcml2MjNhXG4iKTsKIAogCXJ0dzIzYV9mcmVlX21sbWVfcHJpdl9pZV9kYXRhKHBtbG1lcHJpdik7CiB9CkBAIC0xOTYsOSArMTk2LDggQEAKIAlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkIHx8CiAJICAgICFjaGVja19md3N0YXRlKCZwYWRhcHRlci0+bWxtZXByaXYsIF9GV19MSU5LRUQpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJICgicnR3X2lmX3VwMjNhOmJEcml2ZXJTdG9wcGVkKCVkKSBPUiAiCi0JCQkgICJiU3VycHJpc2VSZW1vdmVkKCVkKSIsIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKLQkJCSAgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpKTsKKwkJCSAicnR3X2lmX3VwMjNhOmJEcml2ZXJTdG9wcGVkKCVkKSBPUiBiU3VycHJpc2VSZW1vdmVkKCVkKVxuIiwKKwkJCSBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKTsKIAkJcmVzID0gZmFsc2U7CiAJfSBlbHNlCiAJCXJlcyA9ICB0cnVlOwpAQCAtMjM4LDkgKzIzNyw5IEBACiAJCXBuZXR3b3JrID0gJnBtbG1lcHJpdi0+Y3VyX25ldHdvcms7CiAKIAlpZiAocGFkYXB0ZXItPm1sbWVwcml2LnRvX3JvYW1pbmcgPiAwKSB7Ci0JCURCR184NzIzQSgicm9hbWluZyBmcm9tICVzKCJNQUNfRk1UIiksIGxlbmd0aDolZFxuIiwKKwkJREJHXzg3MjNBKCJyb2FtaW5nIGZyb20gJXMoJXBNKSwgbGVuZ3RoOiVkXG4iLAogCQkJICBwbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQsCi0JCQkgIE1BQ19BUkcocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyksCisJCQkgIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCiAJCQkgIHBuZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4pOwogCQltZW1jcHkoJnBtbG1lcHJpdi0+YXNzb2Nfc3NpZCwgJnBuZXR3b3JrLT5uZXR3b3JrLlNzaWQsCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGNmZzgwMjExX3NzaWQpKTsKQEAgLTQ2Niw3ICs0NjUsNyBAQAogCQlpZiAoIXBuZXR3b3JrKSB7CiAJCQlpZiAoIW9sZGVzdCkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAoIlxuXG5cbnNvbWV0aGluZyB3cm9uZyBoZXJlXG5cblxuIikpOworCQkJCQkgInNvbWV0aGluZyB3cm9uZyBoZXJlXG4iKTsKIAkJCQlnb3RvIGV4aXQ7CiAJCQl9CiAJCQlwbmV0d29yayA9IG9sZGVzdDsKQEAgLTU2OCwxMyArNTY3LDYgQEAKIAlyZXR1cm4gYnNlbGVjdGVkOwogfQogCi0vKiBUT0RPOiBQZXJyeSA6IEZvciBQb3dlciBNYW5hZ2VtZW50ICovCi12b2lkIHJ0d19hdGltZG9uZV9ldmVudF9jYWxsYmFjazIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIsIGNvbnN0IHU4ICpwYnVmKQotewotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAoInJlY2VpdmUgYXRpbWRvbmVfZXZldFxuIikpOwotfQotCiB2b2lkIHJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyLCBjb25zdCB1OCAqcGJ1ZikKIHsKIAl1MzIgbGVuOwpAQCAtNTg1LDEzICs1NzcsMTIgQEAKIAlwbmV0d29yayA9IHN1cnZleS0+YnNzOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAoInJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2EsIHNzaWQ9JXNcbiIsIHBuZXR3b3JrLT5Tc2lkLnNzaWQpKTsKKwkJICJydHdfc3VydmV5X2V2ZW50X2NiMjNhLCBzc2lkPSVzXG4iLCBwbmV0d29yay0+U3NpZC5zc2lkKTsKIAogCWxlbiA9IGdldF93bGFuX2Jzc2lkX2V4X3N6KHBuZXR3b3JrKTsKIAlpZiAobGVuID4gKHNpemVvZihzdHJ1Y3Qgd2xhbl9ic3NpZF9leCkpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbiAqKioqcnR3X3N1cnZleV9ldmVudF9jYjIzYTogcmV0dXJuIGEgd3JvbmcgIgotCQkJICAiYnNzICoqKlxuIikpOworCQkJICIqKioqcnR3X3N1cnZleV9ldmVudF9jYjIzYTogcmV0dXJuIGEgd3JvbmcgYnNzICoqKlxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTU5OSw4ICs1OTAsNiBAQAogCiAJLyogIHVwZGF0ZSBJQlNTX25ldHdvcmsgJ3MgdGltZXN0YW1wICovCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX0FESE9DX01BU1RFUl9TVEFURSkpIHsKLQkJLyogUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJICAgInJ0d19zdXJ2ZXlfZXZlbnRfY2IyM2EgOiBXSUZJX0FESE9DX01BU1RFUl9TVEFURVxuXG4iKTsgKi8KIAkJaWYgKGV0aGVyX2FkZHJfZXF1YWwocG1sbWVwcml2LT5jdXJfbmV0d29yay5uZXR3b3JrLk1hY0FkZHJlc3MsCiAJCQkJICAgICBwbmV0d29yay0+TWFjQWRkcmVzcykpIHsKIAkJCXN0cnVjdCB3bGFuX25ldHdvcmsgKmlic3Nfd2xhbjsKQEAgLTY2MCw4ICs2NDksOCBAQAogCX0KIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJydHdfc3VydmV5ZG9uZV9ldmVudF9jYWxsYmFjazIzYTogZndfc3RhdGU6JXhcblxuIiwKLQkJICBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7CisJCSAicnR3X3N1cnZleWRvbmVfZXZlbnRfY2FsbGJhY2syM2E6IGZ3X3N0YXRlOiV4XG4iLAorCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7CiAKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19VTkRFUl9TVVJWRVkpKSB7CiAJCWRlbF90aW1lcl9zeW5jKCZwbWxtZXByaXYtPnNjYW5fdG9fdGltZXIpOwpAQCAtNjY5LDggKzY1OCw4IEBACiAJCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKTsKIAl9IGVsc2UgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgibmljIHN0YXR1cyA9JXgsIHN1cnZleSBkb25lIGV2ZW50IGNvbWVzIHRvbyBsYXRlIVxuIiwKLQkJCSAgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOworCQkJICJuaWMgc3RhdHVzID0leCwgc3VydmV5IGRvbmUgZXZlbnQgY29tZXMgdG9vIGxhdGUhXG4iLAorCQkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwogCX0KIAogCXJ0d19zZXRfc2lnbmFsX3N0YXRfdGltZXIoJmFkYXB0ZXItPnJlY3Zwcml2KTsKQEAgLTcyNSw3ICs3MTQsNyBAQAogCXN0cnVjdCBydHdfcXVldWUgKnNjYW5fcXVldWUgPSAmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlOwogCXN0cnVjdCBsaXN0X2hlYWQgKnBsaXN0LCAqcGhlYWQsICpwdGVtcDsKIAotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sICgiK2ZyZWVfc2NhbnF1ZXVlXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywgIitmcmVlX3NjYW5xdWV1ZVxuIik7CiAJc3Bpbl9sb2NrX2JoKCZzY2FuX3F1ZXVlLT5sb2NrKTsKIAogCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChzY2FuX3F1ZXVlKTsKQEAgLTc1MiwxMSArNzQxLDExIEBACiAJc3RydWN0IHN0YV9pbmZvICpwc3RhOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJICgiK3J0d19mcmVlX2Fzc29jX3Jlc291cmNlczIzYVxuIikpOworCQkgIitydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2FcbiIpOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJ0Z3RfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzPSJNQUNfRk1UIiBzc2lkPSVzXG4iLAotCQkgIE1BQ19BUkcodGd0X25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyksCi0JCSAgdGd0X25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkKSk7CisJCSAidGd0X25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcz0lcE0gc3NpZD0lc1xuIiwKKwkJIHRndF9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsCisJCSB0Z3RfbmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWQpOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEV8V0lGSV9BUF9TVEFURSkpIHsKIAkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmYWRhcHRlci0+c3RhcHJpdiwKQEAgLTc4OCw3ICs3NzcsNyBAQAogCQlwd2xhbi0+Zml4ZWQgPSBmYWxzZTsKIAllbHNlCiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJydHdfZnJlZV9hc3NvY19yZXNvdXJjZXMyM2EgOiBwd2xhbj09IE5VTExcbiIpKTsKKwkJCSAicnR3X2ZyZWVfYXNzb2NfcmVzb3VyY2VzMjNhIDogcHdsYW49PSBOVUxMXG4iKTsKIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BREhPQ19NQVNURVJfU1RBVEUpICYmCiAJICAgIGFkYXB0ZXItPnN0YXByaXYuYXNvY19zdGFfY291bnQgPT0gMSkKQEAgLTgwOCw3ICs3OTcsNyBAQAogCXN0cnVjdCBtbG1lX3ByaXYgKnBtbG1lcHJpdiA9ICZwYWRhcHRlci0+bWxtZXByaXY7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkgKCIrcnR3X2luZGljYXRlX2Nvbm5lY3QyM2FcbiIpKTsKKwkJICIrcnR3X2luZGljYXRlX2Nvbm5lY3QyM2FcbiIpOwogCiAJcG1sbWVwcml2LT50b19qb2luID0gZmFsc2U7CiAKQEAgLTgyOCw4ICs4MTcsOCBAQAogCXJ0d19zZXRfc2Nhbl9kZW55KHBhZGFwdGVyLCAzMDAwKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAoIi1ydHdfaW5kaWNhdGVfY29ubmVjdDIzYTogZndfc3RhdGU9MHglMDh4XG4iLAotCQkgIGdldF9md3N0YXRlKHBtbG1lcHJpdikpKTsKKwkJICItcnR3X2luZGljYXRlX2Nvbm5lY3QyM2E6IGZ3X3N0YXRlPTB4JTA4eFxuIiwKKwkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwogfQogCiAvKgpAQCAtODQwLDcgKzgyOSw3IEBACiAJc3RydWN0IG1sbWVfcHJpdiAqcG1sbWVwcml2ID0gJnBhZGFwdGVyLT5tbG1lcHJpdjsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAoIitydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYVxuIikpOworCQkgIitydHdfaW5kaWNhdGVfZGlzY29ubmVjdDIzYVxuIik7CiAKIAlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkd8V0lGSV9VTkRFUl9XUFMpOwogCkBAIC05OTgsOCArOTg3LDkgQEAKIAlEQkdfODcyM0EoIiVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICgiXG5md19zdGF0ZToleCwgQlNTSUQ6Ik1BQ19GTVQiXG4iLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpLAotCQkgIE1BQ19BUkcocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcykpKTsKKwkJICJmd19zdGF0ZToleCwgQlNTSUQ6JXBNXG4iLAorCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSwKKwkJIHBuZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwogCiAJLyogIHdoeSBub3QgdXNlIHB0YXJnZXRfd2xhbj8/ICovCiAJbWVtY3B5KCZjdXJfbmV0d29yay0+bmV0d29yaywgJnBuZXR3b3JrLT5uZXR3b3JrLApAQCAtMTA0Miw3ICsxMDMyLDcgQEAKIAlkZWZhdWx0OgogCQlwbWxtZXByaXYtPmZ3X3N0YXRlID0gV0lGSV9OVUxMX1NUQVRFOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiSW52YWxpZCBuZXR3b3JrX21vZGVcbiIpKTsKKwkJCSAiSW52YWxpZCBuZXR3b3JrX21vZGVcbiIpOwogCQlicmVhazsKIAl9CiAKQEAgLTEwNzcsMTYgKzEwNjcsMTYgQEAKIAlib29sIHRoZV9zYW1lX21hY2FkZHI7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJICgiam9pbmJzcyBldmVudCBjYWxsIGJhY2sgcmVjZWl2ZWQgd2l0aCByZXM9JWRcbiIsCi0JCSAgcG5ldHdvcmstPmpvaW5fcmVzKSk7CisJCSAiam9pbmJzcyBldmVudCBjYWxsIGJhY2sgcmVjZWl2ZWQgd2l0aCByZXM9JWRcbiIsCisJCSBwbmV0d29yay0+am9pbl9yZXMpOwogCiAJaWYgKHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbiA9PSAwKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJAQEBAQCAgIGpvaW5ic3MgZXZlbnQgY2FsbCBiYWNrICBmb3IgQW55IFNTaWRcbiIpKTsKKwkJCSAiQEBAQEAgICBqb2luYnNzIGV2ZW50IGNhbGwgYmFjayAgZm9yIEFueSBTU2lkXG4iKTsKIAl9IGVsc2UgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiQEBAQEAgICBydHcyM2Ffam9pbmJzc19ldmVudF9jYiBmb3IgU1NpZDolc1xuIiwKLQkJCSAgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQpKTsKKwkJCSAiQEBAQEAgICBydHcyM2Ffam9pbmJzc19ldmVudF9jYiBmb3IgU1NpZDolc1xuIiwKKwkJCSBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZCk7CiAJfQogCiAJaWYgKGV0aGVyX2FkZHJfZXF1YWwocG5ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcywKQEAgLTEwOTgsMTUgKzEwODgsMTQgQEAKIAlwbmV0d29yay0+bmV0d29yay5MZW5ndGggPSBnZXRfd2xhbl9ic3NpZF9leF9zeigmcG5ldHdvcmstPm5ldHdvcmspOwogCWlmIChwbmV0d29yay0+bmV0d29yay5MZW5ndGggPiBzaXplb2Yoc3RydWN0IHdsYW5fYnNzaWRfZXgpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcblxuICoqKmpvaW5ic3NfZXZ0X2NhbGxiYWNrIHJldHVybiBhIHdyb25nIGJzcyAiCi0JCQkgICIqKipcblxuIikpOworCQkJICIqKipqb2luYnNzX2V2dF9jYWxsYmFjayByZXR1cm4gYSB3cm9uZyBic3MgKioqXG4iKTsKIAkJcmV0dXJuOwogCX0KIAogCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJcbiBydHcyM2Ffam9pbmJzc19ldmVudF9jYiAhISBfZW50ZXJfY3JpdGljYWxcbiIpKTsKKwkJICJydHcyM2Ffam9pbmJzc19ldmVudF9jYiAhISBfZW50ZXJfY3JpdGljYWxcbiIpOwogCiAJaWYgKHBuZXR3b3JrLT5qb2luX3JlcyA+IDApIHsKIAkJc3Bpbl9sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CkBAIC0xMTU1LDggKzExNDQsNyBAQAogCQkJCQkJCSAgICAgIHBuZXR3b3JrKTsKIAkJCWVsc2UgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAoIkNhbid0IGZpbmQgcHRhcmdldF93bGFuIHdoZW4gIgotCQkJCQkgICJqb2luYnNzX2V2ZW50IGNhbGxiYWNrXG4iKSk7CisJCQkJCSAiQ2FuJ3QgZmluZCBwdGFyZ2V0X3dsYW4gd2hlbiBqb2luYnNzX2V2ZW50IGNhbGxiYWNrXG4iKTsKIAkJCQlzcGluX3VubG9ja19iaCgmcG1sbWVwcml2LT5zY2FubmVkX3F1ZXVlLmxvY2spOwogCQkJCWdvdG8gaWdub3JlX2pvaW5ic3NfY2FsbGJhY2s7CiAJCQl9CkBAIC0xMTY5LDggKzExNTcsNyBAQAogCQkJCWlmICghcHRhcmdldF9zdGEpIHsKIAkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sCiAJCQkJCQkgX2Rydl9lcnJfLAotCQkJCQkJICgiQ2FuJ3QgdXBkYXRlIHN0YWluZm8gd2hlbiAiCi0JCQkJCQkgICJqb2luYnNzX2V2ZW50IGNhbGxiYWNrXG4iKSk7CisJCQkJCQkgIkNhbid0IHVwZGF0ZSBzdGFpbmZvIHdoZW4gam9pbmJzc19ldmVudCBjYWxsYmFja1xuIik7CiAJCQkJCXNwaW5fdW5sb2NrX2JoKCZwbWxtZXByaXYtPnNjYW5uZWRfcXVldWUubG9jayk7CiAJCQkJCWdvdG8gaWdub3JlX2pvaW5ic3NfY2FsbGJhY2s7CiAJCQkJfQpAQCAtMTE4MywxOSArMTE3MCwxOSBAQAogCQkJCS8qIGFkaG9jIG1vZGUgd2lsbCBydHdfaW5kaWNhdGVfY29ubmVjdDIzYQogCQkJCSAgIHdoZW4gcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2EgKi8KIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywKLQkJCQkJICgiYWRob2MgbW9kZSwgZndfc3RhdGU6JXgiLAotCQkJCQkgIGdldF9md3N0YXRlKHBtbG1lcHJpdikpKTsKKwkJCQkJICJhZGhvYyBtb2RlLCBmd19zdGF0ZToleFxuIiwKKwkJCQkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwogCQkJfQogCiAJCQkvKiBzNS4gQ2FuY2xlIGFzc29jX3RpbWVyICovCiAJCQlkZWxfdGltZXJfc3luYygmcG1sbWVwcml2LT5hc3NvY190aW1lcik7CiAKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoIkNhbmNsZSBhc3NvY190aW1lclxuIikpOworCQkJCSAiQ2FuY2xlIGFzc29jX3RpbWVyXG4iKTsKIAkJfSBlbHNlIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgicnR3MjNhX2pvaW5ic3NfZXZlbnRfY2IgZXJyOiBmd19zdGF0ZToleCIsCi0JCQkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpKTsKKwkJCQkgInJ0dzIzYV9qb2luYnNzX2V2ZW50X2NiIGVycjogZndfc3RhdGU6JXhcbiIsCisJCQkJIGdldF9md3N0YXRlKHBtbG1lcHJpdikpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+c2Nhbm5lZF9xdWV1ZS5sb2NrKTsKIAkJCWdvdG8gaWdub3JlX2pvaW5ic3NfY2FsbGJhY2s7CiAJCX0KQEAgLTEyMDksOCArMTE5Niw4IEBACiAKIAkJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiZmFpbCEgY2xlYXIgX0ZXX1VOREVSX0xJTktJTkcgXl5eZndfc3RhdGU9IgotCQkJCSAgIiV4XG4iLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7CisJCQkJICJmYWlsISBjbGVhciBfRldfVU5ERVJfTElOS0lORyBeXl5md19zdGF0ZT0leFxuIiwKKwkJCQkgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7CiAJCQlfY2xyX2Z3c3RhdGVfKHBtbG1lcHJpdiwgX0ZXX1VOREVSX0xJTktJTkcpOwogCQl9CiAJfSBlbHNlIHsKQEAgLTEyNjEsOCArMTI0OCw3IEBACiAJaWYgKHBzdGEgIT0gTlVMTCkgewogCQkvKiB0aGUgc3RhIGhhdmUgYmVlbiBpbiBzdGFfaW5mb19xdWV1ZSA9PiBkbyBub3RoaW5nICovCiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJFcnJvcjogcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2E6IHN0YSBoYXMgIgotCQkJICAiYmVlbiBpbiBzdGFfaGFzaF9xdWV1ZVxuIikpOworCQkJICJFcnJvcjogcnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2E6IHN0YSBoYXMgYmVlbiBpbiBzdGFfaGFzaF9xdWV1ZVxuIik7CiAJCS8qIGJldHdlZW4gZHJ2IGhhcyByZWNlaXZlZCB0aGlzIGV2ZW50IGJlZm9yZSBhbmQKIAkJICAgZncgaGF2ZSBub3QgeWV0IHRvIHNldCBrZXkgdG8gQ0FNX0VOVFJZKSAqLwogCQlyZXR1cm47CkBAIC0xMjcyLDggKzEyNTgsNyBAQAogCQlHRlBfS0VSTkVMKTsKIAlpZiAoIXBzdGEpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAoIkNhbid0IGFsbG9jIHN0YV9pbmZvIHdoZW4gIgotCQkJICAicnR3X3N0YXNzb2NfZXZlbnRfY2FsbGJhY2syM2FcbiIpKTsKKwkJCSAiQ2FuJ3QgYWxsb2Mgc3RhX2luZm8gd2hlbiBydHdfc3Rhc3NvY19ldmVudF9jYWxsYmFjazIzYVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEzMzAsOCArMTMxNSw3IEBACiAJZWxzZQogCQltYWNfaWQgPSBwc3RhZGVsLT5tYWNfaWQ7CiAKLQlEQkdfODcyM0EoIiVzKG1hY19pZD0lZCk9IiBNQUNfRk1UICJcbiIsIF9fZnVuY19fLCBtYWNfaWQsCi0JCSAgTUFDX0FSRyhwc3RhZGVsLT5tYWNhZGRyKSk7CisJREJHXzg3MjNBKCIlcyhtYWNfaWQ9JWQpPSVwTVxuIiwgX19mdW5jX18sIG1hY19pZCwgcHN0YWRlbC0+bWFjYWRkcik7CiAKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpKQogCQlyZXR1cm47CkBAIC0xNTgyLDEzICsxNTY2LDEyIEBACiAJfQogCiAJaWYgKHVwZGF0ZWQpIHsKLQkJREJHXzg3MjNBKCJbYnlfYnNzaWQ6JXVdW2Fzc29jX3NzaWQ6JXNdW3RvX3JvYW1pbmc6JXVdICIKLQkJCSAgIm5ldyBjYW5kaWRhdGU6ICVzKCJNQUNfRk1UIikgcnNzaTolZFxuIiwKKwkJREJHXzg3MjNBKCJbYnlfYnNzaWQ6JXVdW2Fzc29jX3NzaWQ6JXNdW3RvX3JvYW1pbmc6JXVdIG5ldyBjYW5kaWRhdGU6ICVzKCVwTSkgcnNzaTolZFxuIiwKIAkJCSAgcG1sbWVwcml2LT5hc3NvY19ieV9ic3NpZCwKIAkJCSAgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQsCiAJCQkgIGFkYXB0ZXItPm1sbWVwcml2LnRvX3JvYW1pbmcsCiAJCQkgICgqY2FuZGlkYXRlKS0+bmV0d29yay5Tc2lkLnNzaWQsCi0JCQkgIE1BQ19BUkcoKCpjYW5kaWRhdGUpLT5uZXR3b3JrLk1hY0FkZHJlc3MpLAorCQkJICAoKmNhbmRpZGF0ZSktPm5ldHdvcmsuTWFjQWRkcmVzcywKIAkJCSAgKGludCkoKmNhbmRpZGF0ZSktPm5ldHdvcmsuUnNzaSk7CiAJfQogCkBAIC0xNjUzLDggKzE2MzYsOCBAQAogCQlwbmV0d29yayA9IGNvbnRhaW5lcl9vZihwbGlzdCwgc3RydWN0IHdsYW5fbmV0d29yaywgbGlzdCk7CiAJCWlmICghcG5ldHdvcmspIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiJXM6IHJldHVybiBfRkFJTDoocG5ldHdvcmsgPT0gTlVMTClcbiIsCi0JCQkJICBfX2Z1bmNfXykpOworCQkJCSAiJXM6IHJldHVybiBfRkFJTDoocG5ldHdvcmsgPT0gTlVMTClcbiIsCisJCQkJIF9fZnVuY19fKTsKIAkJCWdvdG8gZXhpdDsKIAkJfQogCkBAIC0xNjgwLDcgKzE2NjMsNyBAQAogCV9jbHJfZndzdGF0ZV8ocG1sbWVwcml2LCBfRldfVU5ERVJfU1VSVkVZKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAoInN3aXRjaGluZyB0byBhZGhvYyBtYXN0ZXJcbiIpKTsKKwkJICJzd2l0Y2hpbmcgdG8gYWRob2MgbWFzdGVyXG4iKTsKIAogCW1lbWNweSgmcGRldl9uZXR3b3JrLT5Tc2lkLCAmcG1sbWVwcml2LT5hc3NvY19zc2lkLAogCSAgICAgICBzaXplb2Yoc3RydWN0IGNmZzgwMjExX3NzaWQpKTsKQEAgLTE2OTMsNyArMTY3Niw3IEBACiAJcmV0ID0gcnR3X2NyZWF0ZWJzc19jbWQyM2EoYWRhcHRlcik7CiAJaWYgKHJldCAhPSBfU1VDQ0VTUykgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAotCQkJICgiRXJyb3IgPT5ydHdfY3JlYXRlYnNzX2NtZDIzYSBzdGF0dXMgRkFJTFxuIikpOworCQkJICJFcnJvciA9PnJ0d19jcmVhdGVic3NfY21kMjNhIHN0YXR1cyBGQUlMXG4iKTsKIAl9IGVsc2UgIHsKIAkJcG1sbWVwcml2LT50b19qb2luID0gZmFsc2U7CiAJfQpAQCAtMTczOSw5ICsxNzIyLDEwIEBACiAJCXJldCA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfSBlbHNlIHsKLQkJREJHXzg3MjNBKCIlczogY2FuZGlkYXRlOiAlcygiTUFDX0ZNVCIsIGNoOiV1KVxuIiwgX19mdW5jX18sCisJCURCR184NzIzQSgiJXM6IGNhbmRpZGF0ZTogJXMoJXBNLCBjaDoldSlcbiIsCisJCQkgIF9fZnVuY19fLAogCQkJICBjYW5kaWRhdGUtPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJICBNQUNfQVJHKGNhbmRpZGF0ZS0+bmV0d29yay5NYWNBZGRyZXNzKSwKKwkJCSAgY2FuZGlkYXRlLT5uZXR3b3JrLk1hY0FkZHJlc3MsCiAJCQkgIGNhbmRpZGF0ZS0+bmV0d29yay5EU0NvbmZpZyk7CiAJfQogCkBAIC0xNzgxLDggKzE3NjUsOCBAQAogCXBjbWQtPnJzcHN6ID0gMDsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAoImFmdGVyIGVucXVldWUgc2V0X2F1dGhfY21kLCBhdXRoX21vZGU9JXhcbiIsCi0JCSAgcHNlY3VyaXR5cHJpdi0+ZG90MTFBdXRoQWxncnRobSkpOworCQkgImFmdGVyIGVucXVldWUgc2V0X2F1dGhfY21kLCBhdXRoX21vZGU9JXhcbiIsCisJCSBwc2VjdXJpdHlwcml2LT5kb3QxMUF1dGhBbGdydGhtKTsKIAogCXJlcyA9IHJ0d19lbnF1ZXVlX2NtZDIzYShwY21kcHJpdiwgcGNtZCk7CiAKQEAgLTE4MjIsMTUgKzE4MDYsMTMgQEAKIAkJcHNldGtleXBhcm0tPmFsZ29yaXRobSA9ICh1bnNpZ25lZCBjaGFyKQogCQkJcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycFByaXZhY3k7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbiBydHdfc2V0X2tleTIzYTogcHNldGtleXBhcm0tPmFsZ29yaXRobSA9ICIKLQkJCSAgIih1bnNpZ25lZCBjaGFyKXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ICIKLQkJCSAgIj0lZFxuIiwgcHNldGtleXBhcm0tPmFsZ29yaXRobSkpOworCQkJICJydHdfc2V0X2tleTIzYTogcHNldGtleXBhcm0tPmFsZ29yaXRobSA9ICh1bnNpZ25lZCBjaGFyKXBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBQcml2YWN5ID0lZFxuIiwKKwkJCSBwc2V0a2V5cGFybS0+YWxnb3JpdGhtKTsKIAl9IGVsc2UgewogCQlwc2V0a2V5cGFybS0+YWxnb3JpdGhtID0gKHU4KXBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG07CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbiBydHdfc2V0X2tleTIzYTogcHNldGtleXBhcm0tPmFsZ29yaXRobSA9ICh1OCkiCi0JCQkgICJwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0lZFxuIiwKLQkJCSAgcHNldGtleXBhcm0tPmFsZ29yaXRobSkpOworCQkJICJydHdfc2V0X2tleTIzYTogcHNldGtleXBhcm0tPmFsZ29yaXRobSA9ICh1OClwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0lZFxuIiwKKwkJCSBwc2V0a2V5cGFybS0+YWxnb3JpdGhtKTsKIAl9CiAJcHNldGtleXBhcm0tPmtleWlkID0ga2V5aWQ7LyogMH4zICovCiAJcHNldGtleXBhcm0tPnNldF90eCA9IHNldF90eDsKQEAgLTE4NDEsOCArMTgyMyw4IEBACiAJCSAgcHNldGtleXBhcm0tPmFsZ29yaXRobSwgcHNldGtleXBhcm0tPmtleWlkLAogCQkgIHBtbG1lcHJpdi0+a2V5X21hc2spOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCSAoIlxuIHJ0d19zZXRfa2V5MjNhOiBwc2V0a2V5cGFybS0+YWxnb3JpdGhtID0lZCBwc2V0a2V5cGFybS0+IgotCQkgICJrZXlpZCA9ICh1OClrZXlpZCA9JWRcbiIsIHBzZXRrZXlwYXJtLT5hbGdvcml0aG0sIGtleWlkKSk7CisJCSAicnR3X3NldF9rZXkyM2E6IHBzZXRrZXlwYXJtLT5hbGdvcml0aG0gPSVkIHBzZXRrZXlwYXJtLT5rZXlpZCA9ICh1OClrZXlpZCA9JWRcbiIsCisJCSBwc2V0a2V5cGFybS0+YWxnb3JpdGhtLCBrZXlpZCk7CiAKIAlzd2l0Y2ggKHBzZXRrZXlwYXJtLT5hbGdvcml0aG0pIHsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgpAQCAtMTg2OSw5ICsxODUxLDggQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAoIlxuIHJ0d19zZXRfa2V5MjNhOnBzZWN1cml0eXByaXYtPmRvdDExUHJpdmFjeUFsZ3J0aG0iCi0JCQkgICIgPSAleCAobXVzdCBiZSAxIG9yIDIgb3IgNCBvciA1KVxuIiwKLQkJCSAgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSkpOworCQkJICJydHdfc2V0X2tleTIzYTpwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gJXggKG11c3QgYmUgMSBvciAyIG9yIDQgb3IgNSlcbiIsCisJCQkgcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSk7CiAJCXJlcyA9IF9GQUlMOwogCQlrZnJlZShwY21kKTsKIAkJa2ZyZWUocHNldGtleXBhcm0pOwpAQCAtMTk5OCw4ICsxOTc5LDggQEAKIAl1aW50IG5kaXNzZWN1cml0eXR5cGUgPSBwc2VjdXJpdHlwcml2LT5uZGlzZW5jcnlwdHN0YXR1czsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCSAoIitydHdfcmVzdHJ1Y3Rfc2VjX2llMjNhOiBuZGlzYXV0aG1vZGU9JWQgIgotCQkgICJuZGlzc2VjdXJpdHl0eXBlPSVkXG4iLCBuZGlzYXV0aG1vZGUsIG5kaXNzZWN1cml0eXR5cGUpKTsKKwkJICIrcnR3X3Jlc3RydWN0X3NlY19pZTIzYTogbmRpc2F1dGhtb2RlPSVkIG5kaXNzZWN1cml0eXR5cGU9JWRcbiIsCisJCSBuZGlzYXV0aG1vZGUsIG5kaXNzZWN1cml0eXR5cGUpOwogCiAJaWVsZW5ndGggPSAwOwogCWlmIChuZGlzYXV0aG1vZGUgPT0gTmRpczgwMl8xMUF1dGhNb2RlV1BBIHx8CkBAIC0yMDY1LDggKzIwNDYsOCBAQAogCiAJcGRldl9uZXR3b3JrLT5EU0NvbmZpZyA9IHByZWdpc3RyeXByaXYtPmNoYW5uZWw7CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAoInByZWdpc3RyeXByaXYtPmNoYW5uZWwgPSVkLCBwZGV2X25ldHdvcmstPkRTQ29uZmlnID0gMHgleFxuIiwKLQkJICBwcmVnaXN0cnlwcml2LT5jaGFubmVsLCBwZGV2X25ldHdvcmstPkRTQ29uZmlnKSk7CisJCSAicHJlZ2lzdHJ5cHJpdi0+Y2hhbm5lbCA9JWQsIHBkZXZfbmV0d29yay0+RFNDb25maWcgPSAweCV4XG4iLAorCQkgcHJlZ2lzdHJ5cHJpdi0+Y2hhbm5lbCwgcGRldl9uZXR3b3JrLT5EU0NvbmZpZyk7CiAKIAlpZiAoY3VyX25ldHdvcmstPm5ldHdvcmsuaWZtb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQogCQlwZGV2X25ldHdvcmstPkFUSU1XaW5kb3cgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19tbG1lX2V4dC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19tbG1lX2V4dC5jCmluZGV4IDBlMGY3M2MuLjE5NmJlYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfbWxtZV9leHQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X21sbWVfZXh0LmMKQEAgLTY1Nyw4ICs2NTcsOCBAQAogCiAJaWYgKGluZGV4ID4gMTMpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfZXJyXywKLQkJCSAoIkN1cnJlbnRseSB3ZSBkbyBub3Qgc3VwcG9ydCByZXNlcnZlZCBzdWItZnItdHlwZSA9IgotCQkJICAiJWRcbiIsIGluZGV4KSk7CisJCQkgIkN1cnJlbnRseSB3ZSBkbyBub3Qgc3VwcG9ydCByZXNlcnZlZCBzdWItZnItdHlwZSA9JWRcbiIsCisJCQkgaW5kZXgpOwogCQlyZXR1cm47CiAJfQogCXB0YWJsZSArPSBpbmRleDsKQEAgLTk2OCw4ICs5NjgsNyBAQAogCXBzdGF0ID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBzYSk7CiAJaWYgKCFwc3RhdCkgewogCQkvKiAgYWxsb2NhdGUgYSBuZXcgb25lICovCi0JCURCR184NzIzQSgiZ29pbmcgdG8gYWxsb2Mgc3RhaW5mbyBmb3Igc2EgPSJNQUNfRk1UIlxuIiwKLQkJCSAgTUFDX0FSRyhzYSkpOworCQlEQkdfODcyM0EoImdvaW5nIHRvIGFsbG9jIHN0YWluZm8gZm9yIHNhID0lcE1cbiIsIHNhKTsKIAkJcHN0YXQgPSBydHdfYWxsb2Nfc3RhaW5mbzIzYShwc3RhcHJpdiwgc2EsIEdGUF9BVE9NSUMpOwogCQlpZiAoIXBzdGF0KSB7CiAJCQlEQkdfODcyM0EoIiBFeGNlZWQgdGhlIHVwcGVyIGxpbWl0IG9mIHN1cHBvcnRlZCAiCkBAIC0xMzk2LDggKzEzOTUsOCBAQAogCS8qIG5vdyBwYXJzZSBhbGwgaWVlZTgwMl8xMSBpZSB0byBwb2ludCB0byBlbGVtcyAqLwogCiAJaWYgKHJ0d192YWxpZGF0ZV9mcmFtZV9pZXMocG9zLCBsZWZ0KSkgewotCQlEQkdfODcyM0EoIlNUQSAiIE1BQ19GTVQgIiBzZW50IGludmFsaWQgYXNzb2NpYXRpb24gcmVxdWVzdFxuIiwKLQkJCSAgTUFDX0FSRyhwc3RhdC0+aHdhZGRyKSk7CisJCURCR184NzIzQSgiU1RBICVwTSBzZW50IGludmFsaWQgYXNzb2NpYXRpb24gcmVxdWVzdFxuIiwKKwkJCSAgcHN0YXQtPmh3YWRkcik7CiAJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkU7CiAJCWdvdG8gT25Bc3NvY1JlcTIzYUZhaWw7CiAJfQpAQCAtMTQwNyw4ICsxNDA2LDggQEAKIAlwID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TU0lELCBwb3MsIGxlZnQpOwogCWlmICghcCB8fCBwWzFdID09IDApIHsKIAkJLyogIGJyb2FkY2FzdCBzc2lkLCBob3dldmVyIGl0IGlzIG5vdCBhbGxvd2VkIGluIGFzc29jcmVxICovCi0JCURCR184NzIzQSgiU1RBICIgTUFDX0ZNVCAiIHNlbnQgaW52YWxpZCBhc3NvY2lhdGlvbiByZXF1ZXN0ICIKLQkJCSAgImxhY2tpbmcgYW4gU1NJRFxuIiwgTUFDX0FSRyhwc3RhdC0+aHdhZGRyKSk7CisJCURCR184NzIzQSgiU1RBICVwTSBzZW50IGludmFsaWQgYXNzb2NpYXRpb24gcmVxdWVzdCBsYWNraW5nIGFuIFNTSURcbiIsCisJCQkgIHBzdGF0LT5od2FkZHIpOwogCQlzdGF0dXMgPSBXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFOwogCQlnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOwogCX0gZWxzZSB7CkBAIC0xNTM3LDkgKzE1MzYsOCBAQAogCQlpbnQgY29weV9sZW47CiAKIAkJaWYgKHBzZWN1cml0eXByaXYtPndwYV9wc2sgPT0gMCkgewotCQkJREJHXzg3MjNBKCJTVEEgIiBNQUNfRk1UICI6IFdQQS9SU04gSUUgaW4gYXNzb2NpYXRpb24gIgotCQkJInJlcXVlc3QsIGJ1dCBBUCBkb24ndCBzdXBwb3J0IFdQQS9SU05cbiIsCi0JCQkJICBNQUNfQVJHKHBzdGF0LT5od2FkZHIpKTsKKwkJCURCR184NzIzQSgiU1RBICVwTTogV1BBL1JTTiBJRSBpbiBhc3NvY2lhdGlvbiByZXF1ZXN0LCBidXQgQVAgZG9uJ3Qgc3VwcG9ydCBXUEEvUlNOXG4iLAorCQkJCSAgcHN0YXQtPmh3YWRkcik7CiAKIAkJCXN0YXR1cyA9IFdMQU5fU1RBVFVTX0lOVkFMSURfSUU7CiAKQEAgLTE2MTQsOCArMTYxMiw4IEBACiAJCQkJCWVsc2UKIAkJCQkJCXBzdGF0LT51YXBzZF9iZSA9IDA7CiAKKwkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCWJyZWFrOwogCQkJfSBlbHNlIHsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTE2NDUsOCArMTY0Myw4IEBACiAJaWYgKHBzdGF0LT5mbGFncyAmIFdMQU5fU1RBX0hUICYmCiAJICAgIChwc3RhdC0+d3BhMl9wYWlyd2lzZV9jaXBoZXIgJiBXUEFfQ0lQSEVSX1RLSVAgfHwKIAkgICAgIHBzdGF0LT53cGFfcGFpcndpc2VfY2lwaGVyICYgV1BBX0NJUEhFUl9US0lQKSkgewotCQlEQkdfODcyM0EoIkhUOiAiIE1BQ19GTVQgIiB0cmllZCB0byB1c2UgVEtJUCB3aXRoIEhUICIKLQkJCSAgImFzc29jaWF0aW9uXG4iLCBNQUNfQVJHKHBzdGF0LT5od2FkZHIpKTsKKwkJREJHXzg3MjNBKCJIVDogJXBNIHRyaWVkIHRvIHVzZSBUS0lQIHdpdGggSFQgYXNzb2NpYXRpb25cbiIsCisJCQkgIHBzdGF0LT5od2FkZHIpOwogCiAJCS8qIHN0YXR1cyA9IFdMQU5fU1RBVFVTX0NJUEhFUl9SRUpFQ1RFRF9QRVJfUE9MSUNZOyAqLwogCQkvKiBnb3RvIE9uQXNzb2NSZXEyM2FGYWlsOyAqLwpAQCAtMjY4Nyw3ICsyNjg1LDcgQEAKIAl1OCBiY19hZGRyW10gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLAotCQkgKCIrJXNcbiIsIF9fZnVuY19fKSk7CisJCSAiKyVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHB4bWl0cHJpdik7CiAJaWYgKCFwbWdudGZyYW1lKQpAQCAtMjc1OCw3ICsyNzU2LDcgQEAKIAlwYXR0cmliLT5sYXN0X3R4Y21kc3ogPSBwYXR0cmliLT5wa3RsZW47CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9ub3RpY2VfLAotCQkgKCJpc3N1aW5nIHByb2JlX3JlcSwgdHhfbGVuID0lZFxuIiwgcGF0dHJpYi0+bGFzdF90eGNtZHN6KSk7CisJCSAiaXNzdWluZyBwcm9iZV9yZXEsIHR4X2xlbiA9JWRcbiIsIHBhdHRyaWItPmxhc3RfdHhjbWRzeik7CiAKIAlpZiAod2FpdF9hY2spIHsKIAkJcmV0ID0gZHVtcF9tZ250ZnJhbWUyM2FfYW5kX3dhaXRfYWNrMjNhKHBhZGFwdGVyLCBwbWdudGZyYW1lKTsKQEAgLTI4MDYsMTcgKzI4MDQsMTYgQEAKIAogCWlmICh0cnlfY250ICYmIHdhaXRfbXMpIHsKIAkJaWYgKGRhKQotCQkJREJHXzg3MjNBKCIlcyglcyk6IHRvICJNQUNfRk1UIiwgY2g6JXUlcywgJWQvJWQgIgotCQkJCSAgImluICV1IG1zXG4iLAlfX2Z1bmNfXywKLQkJCQkgIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAotCQkJCSAgTUFDX0FSRyhkYSksIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1M/IiwgYWNrZWQiOiIiLCBpLCB0cnlfY250LAorCQkJREJHXzg3MjNBKCIlcyglcyk6IHRvICVwTSwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCisJCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCisJCQkJICBkYSwgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKKwkJCQkgIHJldCA9PSBfU1VDQ0VTUyA/ICIsIGFja2VkIiA6ICIiLCBpLCB0cnlfY250LAogCQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKIAkJZWxzZQogCQkJREJHXzg3MjNBKCIlcyglcyk6LCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKIAkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKIAkJCQkgIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCi0JCQkJICByZXQgPT0gX1NVQ0NFU1M/IiwgYWNrZWQiOiIiLCBpLCB0cnlfY250LAorCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCiAJCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwogCX0KIGV4aXQ6CkBAIC0zNDYwLDE3ICszNDU3LDE2IEBACiAKIAlpZiAodHJ5X2NudCAmJiB3YWl0X21zKSB7CiAJCWlmIChkYSkKLQkJCURCR184NzIzQSgiJXMoJXMpOiB0byAiTUFDX0ZNVCIsIGNoOiV1JXMsICVkLyVkICIKLQkJCQkgICJpbiAldSBtc1xuIiwgX19mdW5jX18sCi0JCQkJICBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKLQkJCQkgIE1BQ19BUkcoZGEpLCBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTPyIsIGFja2VkIjoiIiwgaSwgdHJ5X2NudCwKKwkJCURCR184NzIzQSgiJXMoJXMpOiB0byAlcE0sIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAorCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAorCQkJCSAgZGEsIHJ0d19nZXRfb3Blcl9jaDIzYShwYWRhcHRlciksCisJCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKIAkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7CiAJCWVsc2UKIAkJCURCR184NzIzQSgiJXMoJXMpOiwgY2g6JXUlcywgJWQvJWQgaW4gJXUgbXNcbiIsCiAJCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCiAJCQkJICBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAotCQkJCSAgcmV0ID09IF9TVUNDRVNTPyIsIGFja2VkIjoiIiwgaSwgdHJ5X2NudCwKKwkJCQkgIHJldCA9PSBfU1VDQ0VTUyA/ICIsIGFja2VkIiA6ICIiLCBpLCB0cnlfY250LAogCQkJCSAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gc3RhcnQpKTsKIAl9CiBleGl0OgpAQCAtMzU4NywxNyArMzU4MywxNiBAQAogCiAJaWYgKHRyeV9jbnQgJiYgd2FpdF9tcykgewogCQlpZiAoZGEpCi0JCQlEQkdfODcyM0EoIiVzKCVzKTogdG8gIk1BQ19GTVQiLCBjaDoldSVzLCAlZC8lZCAiCi0JCQkJICAiaW4gJXUgbXNcbiIsIF9fZnVuY19fLAotCQkJCSAgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBNQUNfQVJHKGRhKSwgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUz8iLCBhY2tlZCI6IiIsIGksIHRyeV9jbnQsCisJCQlEQkdfODcyM0EoIiVzKCVzKTogdG8gJXBNLCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKKwkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKKwkJCQkgIGRhLCBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAorCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCiAJCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwogCQllbHNlCiAJCQlEQkdfODcyM0EoIiVzKCVzKTosIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAogCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAogCQkJCSAgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUz8iLCBhY2tlZCI6IiIsIGksIHRyeV9jbnQsCisJCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKIAkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7CiAJfQogZXhpdDoKQEAgLTM2MTUsNyArMzYxMCw3IEBACiAJc3RydWN0IG1sbWVfZXh0X2luZm8gKnBtbG1laW5mbyA9ICZwbWxtZWV4dC0+bWxtZXh0X2luZm87CiAJaW50IHJldCA9IF9GQUlMOwogCi0JLyogREJHXzg3MjNBKCIlcyB0byAiTUFDX0ZNVCJcbiIsIF9fZnVuY19fLCBNQUNfQVJHKGRhKSk7ICovCisJLyogREJHXzg3MjNBKCIlcyB0byAlcE1cbiIsIF9fZnVuY19fLCBkYSk7ICovCiAKIAlwbWdudGZyYW1lID0gYWxsb2NfbWd0eG1pdGZyYW1lMjNhKHB4bWl0cHJpdik7CiAJaWYgKCFwbWdudGZyYW1lKQpAQCAtMzY2MCw3ICszNjU1LDcgQEAKIGludCBpc3N1ZV9kZWF1dGgyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwgdW5zaWduZWQgY2hhciAqZGEsCiAJCSAgICB1bnNpZ25lZCBzaG9ydCByZWFzb24pCiB7Ci0JREJHXzg3MjNBKCIlcyB0byAiTUFDX0ZNVCJcbiIsIF9fZnVuY19fLCBNQUNfQVJHKGRhKSk7CisJREJHXzg3MjNBKCIlcyB0byAlcE1cbiIsIF9fZnVuY19fLCBkYSk7CiAJcmV0dXJuIF9pc3N1ZV9kZWF1dGgocGFkYXB0ZXIsIGRhLCByZWFzb24sIGZhbHNlKTsKIH0KIApAQCAtMzY5MiwxNyArMzY4NywxNiBAQAogCiAJaWYgKHRyeV9jbnQgJiYgd2FpdF9tcykgewogCQlpZiAoZGEpCi0JCQlEQkdfODcyM0EoIiVzKCVzKTogdG8gIk1BQ19GTVQiLCBjaDoldSVzLCAlZC8lZCAiCi0JCQkJICAiaW4gJXUgbXNcbiIsIF9fZnVuY19fLAotCQkJCSAgcGFkYXB0ZXItPnBuZXRkZXYtPm5hbWUsCi0JCQkJICBNQUNfQVJHKGRhKSwgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUz8iLCBhY2tlZCI6IiIsIGksIHRyeV9jbnQsCisJCQlEQkdfODcyM0EoIiVzKCVzKTogdG8gJXBNLCBjaDoldSVzLCAlZC8lZCBpbiAldSBtc1xuIiwKKwkJCQkgIF9fZnVuY19fLCBwYWRhcHRlci0+cG5ldGRldi0+bmFtZSwKKwkJCQkgIGRhLCBydHdfZ2V0X29wZXJfY2gyM2EocGFkYXB0ZXIpLAorCQkJCSAgcmV0ID09IF9TVUNDRVNTID8gIiwgYWNrZWQiIDogIiIsIGksIHRyeV9jbnQsCiAJCQkJICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBzdGFydCkpOwogCQllbHNlCiAJCQlEQkdfODcyM0EoIiVzKCVzKTosIGNoOiV1JXMsICVkLyVkIGluICV1IG1zXG4iLAogCQkJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLAogCQkJCSAgcnR3X2dldF9vcGVyX2NoMjNhKHBhZGFwdGVyKSwKLQkJCQkgIHJldCA9PSBfU1VDQ0VTUz8iLCBhY2tlZCI6IiIsIGksIHRyeV9jbnQsCisJCQkJICByZXQgPT0gX1NVQ0NFU1MgPyAiLCBhY2tlZCIgOiAiIiwgaSwgdHJ5X2NudCwKIAkJCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7CiAJfQogZXhpdDoKQEAgLTM3MTksOCArMzcxMyw4IEBACiAJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCi0JREJHXzg3MjNBKCIlcyglcyk6IHJhID0iTUFDX0ZNVCIsIGNoOiV1LCBvZmZzZXQ6JXVcbiIsIF9fZnVuY19fLAotCQkgIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLCBNQUNfQVJHKHJhKSwgbmV3X2NoLCBjaF9vZmZzZXQpOworCURCR184NzIzQSgiJXMoJXMpOiByYT0lcE0sIGNoOiV1LCBvZmZzZXQ6JXVcbiIsCisJCSAgX19mdW5jX18sIHBhZGFwdGVyLT5wbmV0ZGV2LT5uYW1lLCByYSwgbmV3X2NoLCBjaF9vZmZzZXQpOwogCiAJcG1nbnRmcmFtZSA9IGFsbG9jX21ndHhtaXRmcmFtZTIzYShweG1pdHByaXYpOwogCWlmICghcG1nbnRmcmFtZSkKQEAgLTM3NjcsNyArMzc2MSw2IEBACiB7CiAJdTE2IHN0YXJ0X3NlcTsKIAl1MTYgQkFfcGFyYV9zZXQ7Ci0JdTE2IEJBX3RpbWVvdXRfdmFsdWU7CiAJdTE2IEJBX3N0YXJ0aW5nX3NlcWN0cmw7CiAJdTE2IEJBX3BhcmE7CiAJaW50IG1heF9yeF9hbXBkdV9mYWN0b3I7CkBAIC0zODQyLDE2ICszODM1LDE0IEBACiAJCQkJSUVFRTgwMjExX0FEREJBX1BBUkFNX0JVRl9TSVpFX01BU0s7CiAJCX0gZWxzZSB7CiAJCQkvKiBpbW1lZGlhdGUgYWNrICYgNjQgYnVmZmVyIHNpemUgKi8KLQkJCUJBX3BhcmFfc2V0ID0gKDB4MTAwMiB8ICgoc3RhdHVzICYgMHhmKSA8PCAyKSk7CisJCQlCQV9wYXJhX3NldCA9IDB4MTAwMiB8ICgoc3RhdHVzICYgMHhmKSA8PCAyKTsKIAkJfQogCiAJCXB1dF91bmFsaWduZWRfbGUxNihCQV9wYXJhX3NldCwKIAkJCQkgICAmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuY2FwYWIpOwogCi0JCUJBX3RpbWVvdXRfdmFsdWUgPSA1MDAwOy8qICA1bXMgKi8KLQkJQkFfdGltZW91dF92YWx1ZSA9IGNwdV90b19sZTE2KEJBX3RpbWVvdXRfdmFsdWUpOwotCQlwdXRfdW5hbGlnbmVkX2xlMTYoQkFfdGltZW91dF92YWx1ZSwKLQkJCQkgICAmbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEudGltZW91dCk7CisJCS8qICA1bXMgKi8KKwkJcHV0X3VuYWxpZ25lZF9sZTE2KDUwMDAsICZtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS50aW1lb3V0KTsKIAogCQlwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCByYWRkcik7CiAJCWlmIChwc3RhKSB7CkBAIC00MzQ3LDcgKzQzMzgsOCBAQAogCiAJCS8qIGlzc3VlIGJlYWNvbiAqLwogCQlpZiAoc2VuZF9iZWFjb24yM2EocGFkYXB0ZXIpID09IF9GQUlMKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLCAoImlzc3VpbmcgYmVhY29uIGZyYW1lIGZhaWwuLi4uXG4iKSk7CisJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9lcnJfLAorCQkJCSAiaXNzdWluZyBiZWFjb24gZnJhbWUgZmFpbC4uLi5cbiIpOwogCiAJCQlyZXBvcnRfam9pbl9yZXMyM2EocGFkYXB0ZXIsIC0xKTsKIAkJCXBtbG1laW5mby0+c3RhdGUgPSBNU1JfTk9MSU5LOwpAQCAtNDUzMSw3ICs0NTIzLDcgQEAKIAogCQlwICs9IDM7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgKCIlczogODAyLjExZCBjb3VudHJ5ID0lc1xuIiwgX19mdW5jX18sIGNvdW50cnkpKTsKKwkJCSAiJXM6IDgwMi4xMWQgY291bnRyeSA9JXNcbiIsIF9fZnVuY19fLCBjb3VudHJ5KTsKIAogCQlpID0gMDsKIAkJd2hpbGUgKChpZSAtIHApID49IDMpIHsKQEAgLTQ3MDgsOSArNDcwMCw4IEBACiAKIAkJCQljaHBsYW5fbmV3W2ldLlNjYW5UeXBlID0gU0NBTl9BQ1RJVkU7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfbm90aWNlXywKLQkJCQkJICgiJXM6IGNoYW5nZSBjaGFubmVsICVkIHNjYW4gdHlwZSAiCi0JCQkJCSAgImZyb20gcGFzc2l2ZSB0byBhY3RpdmVcbiIsCi0JCQkJCSAgX19mdW5jX18sIGNoYW5uZWwpKTsKKwkJCQkJICIlczogY2hhbmdlIGNoYW5uZWwgJWQgc2NhbiB0eXBlIGZyb20gcGFzc2l2ZSB0byBhY3RpdmVcbiIsCisJCQkJCSBfX2Z1bmNfXywgY2hhbm5lbCk7CiAJCQl9CiAJCQlicmVhazsKIAkJfQpAQCAtNDc0NSw3ICs0NzM2LDcgQEAKIAlpZiAoIXBjbWRfb2JqKQogCQlyZXR1cm47CiAKLQljbWRzeiA9IChzaXplb2Yoc3RydWN0IHN1cnZleV9ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOworCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBzdXJ2ZXlfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpOwogCXBldnRjbWQgPSBremFsbG9jKGNtZHN6LCBHRlBfQVRPTUlDKTsKIAlpZiAoIXBldnRjbWQpIHsKIAkJa2ZyZWUocGNtZF9vYmopOwpAQCAtNDc5Niw3ICs0Nzg3LDcgQEAKIAlpZiAoIXBjbWRfb2JqKQogCQlyZXR1cm47CiAKLQljbWRzeiA9IChzaXplb2Yoc3RydWN0IHN1cnZleWRvbmVfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKKwljbWRzeiA9IHNpemVvZihzdHJ1Y3Qgc3VydmV5ZG9uZV9ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcik7CiAJcGV2dGNtZCA9IGt6YWxsb2MoY21kc3osIEdGUF9BVE9NSUMpOwogCWlmICghcGV2dGNtZCkgewogCQlrZnJlZShwY21kX29iaik7CkBAIC00ODQwLDcgKzQ4MzEsNyBAQAogCWlmICghcGNtZF9vYmopCiAJCXJldHVybjsKIAotCWNtZHN6ID0gKHNpemVvZihzdHJ1Y3Qgam9pbmJzc19ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcikpOworCWNtZHN6ID0gc2l6ZW9mKHN0cnVjdCBqb2luYnNzX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKIAlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwZXZ0Y21kKSB7CiAJCWtmcmVlKHBjbWRfb2JqKTsKQEAgLTQ4OTAsNyArNDg4MSw3IEBACiAJaWYgKCFwY21kX29iaikKIAkJcmV0dXJuOwogCi0JY21kc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdGFkZWxfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKKwljbWRzeiA9IHNpemVvZihzdHJ1Y3Qgc3RhZGVsX2V2ZW50KSArIHNpemVvZihzdHJ1Y3QgQzJIRXZlbnRfSGVhZGVyKTsKIAlwZXZ0Y21kID0ga3phbGxvYyhjbWRzeiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwZXZ0Y21kKSB7CiAJCWtmcmVlKHBjbWRfb2JqKTsKQEAgLTQ5MTgsNyArNDkwOSw3IEBACiAJaWYgKHBzdGEpCiAJCW1hY19pZCA9IChpbnQpcHN0YS0+bWFjX2lkOwogCWVsc2UKLQkJbWFjX2lkID0gKC0xKTsKKwkJbWFjX2lkID0gLTE7CiAKIAlwZGVsX3N0YV9ldnQtPm1hY19pZCA9IG1hY19pZDsKIApAQCAtNDk0NCw3ICs0OTM1LDcgQEAKIAlpZiAoIXBjbWRfb2JqKQogCQlyZXR1cm47CiAKLQljbWRzeiA9IChzaXplb2Yoc3RydWN0IHN0YXNzb2NfZXZlbnQpICsgc2l6ZW9mKHN0cnVjdCBDMkhFdmVudF9IZWFkZXIpKTsKKwljbWRzeiA9IHNpemVvZihzdHJ1Y3Qgc3Rhc3NvY19ldmVudCkgKyBzaXplb2Yoc3RydWN0IEMySEV2ZW50X0hlYWRlcik7CiAJcGV2dGNtZCA9IGt6YWxsb2MoY21kc3osIEdGUF9BVE9NSUMpOwogCWlmICghcGV2dGNtZCkgewogCQlrZnJlZShwY21kX29iaik7CkBAIC01OTUxLDcgKzU5NDIsNyBAQAogCiAJCQkvKiAwfjMgZm9yIGRlZmF1bHQga2V5LCBjbWRfaWQgPSBtYWNpZCArIDMsCiAJCQkgICBtYWNpZCA9IGFpZCsxOyAqLwotCQkJY2FtX2lkID0gKHBzdGEtPm1hY19pZCArIDMpOworCQkJY2FtX2lkID0gcHN0YS0+bWFjX2lkICsgMzsKIAogCQkJREJHXzg3MjNBKCJXcml0ZSBDQU0sIG1hY19hZGRyID0leDoleDoleDoleDoleDoleCwgIgogCQkJCSAgImNhbV9lbnRyeSA9JWRcbiIsIHBwYXJtLT5hZGRyWzBdLApAQCAtNjA2Niw3ICs2MDU3LDcgQEAKIAkvKiAgY2hlY2tpbmcgaWYgZXZlbnQgY29kZSBpcyB2YWxpZCAqLwogCWlmIChldnRfY29kZSA+PSBNQVhfQzJIRVZUKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9jbWRfY18sIF9kcnZfZXJyXywKLQkJCSAoIlxuRXZlbnQgQ29kZSglZCkgbWlzbWF0Y2ghXG4iLCBldnRfY29kZSkpOworCQkJICJFdmVudCBDb2RlKCVkKSBtaXNtYXRjaCFcbiIsIGV2dF9jb2RlKTsKIAkJZ290byBfYWJvcnRfZXZlbnRfOwogCX0KIApAQCAtNjA3NCw4ICs2MDY1LDggQEAKIAlpZiAod2xhbmV2ZW50c1tldnRfY29kZV0ucGFybXNpemUgIT0gMCAmJgogCSAgICB3bGFuZXZlbnRzW2V2dF9jb2RlXS5wYXJtc2l6ZSAhPSBldnRfc3opIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2NtZF9jXywgX2Rydl9lcnJfLAotCQkJICgiXG5FdmVudCglZCkgUGFybSBTaXplIG1pc21hdGNoICglZCB2cyAlZCkhXG4iLAotCQkJICBldnRfY29kZSwgd2xhbmV2ZW50c1tldnRfY29kZV0ucGFybXNpemUsIGV2dF9zeikpOworCQkJICJFdmVudCglZCkgUGFybSBTaXplIG1pc21hdGNoICglZCB2cyAlZCkhXG4iLAorCQkJIGV2dF9jb2RlLCB3bGFuZXZlbnRzW2V2dF9jb2RlXS5wYXJtc2l6ZSwgZXZ0X3N6KTsKIAkJZ290byBfYWJvcnRfZXZlbnRfOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19wd3JjdHJsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3B3cmN0cmwuYwppbmRleCBlMmQ1MWFmLi43NDg4YTEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3B3cmN0cmwuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3B3cmN0cmwuYwpAQCAtMjAyLDE3ICsyMDIsMTcgQEAKIAogCWlmIChwd3Jwcml2LT5ycHdtID09IHBzbHYpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3B3cmN0cmxfY18sIF9kcnZfZXJyXywKLQkJCSgiJXM6IEFscmVhZHkgc2V0IHJwd21bMHglMDJYXSwgbmV3ID0gMHglMDJYIVxuIiwKLQkJCSBfX2Z1bmNfXywgcHdycHJpdi0+cnB3bSwgcHNsdikpOworCQkJICIlczogQWxyZWFkeSBzZXQgcnB3bVsweCUwMlhdLCBuZXcgPSAweCUwMlghXG4iLAorCQkJIF9fZnVuY19fLCBwd3Jwcml2LT5ycHdtLCBwc2x2KTsKIAkJcmV0dXJuOwogCX0KIAogCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCA9PSB0cnVlIHx8CiAJICAgIHBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCA9PSBmYWxzZSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9lcnJfLAotCQkJICgiJXM6IFN1cnByaXNlUmVtb3ZlZCglZCkgaHdfaW5pdF9jb21wbGV0ZWQoJWQpXG4iLAotCQkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQsCi0JCQkgIHBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCkpOworCQkJICIlczogU3VycHJpc2VSZW1vdmVkKCVkKSBod19pbml0X2NvbXBsZXRlZCglZClcbiIsCisJCQkgX19mdW5jX18sIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkLAorCQkJIHBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCk7CiAKIAkJcHdycHJpdi0+Y3B3bSA9IFBTX1NUQVRFX1M0OwogCkBAIC0yMjEsMjIgKzIyMSwyMSBAQAogCiAJaWYgKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSB0cnVlKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIlczogY2hhbmdlIHBvd2VyIHN0YXRlKDB4JTAyWCkgd2hlbiBEcml2ZXJTdG9wcGVkXG4iLAotCQkJICBfX2Z1bmNfXywgcHNsdikpOworCQkJICIlczogY2hhbmdlIHBvd2VyIHN0YXRlKDB4JTAyWCkgd2hlbiBEcml2ZXJTdG9wcGVkXG4iLAorCQkJIF9fZnVuY19fLCBwc2x2KTsKIAogCQlpZiAocHNsdiA8IFBTX1NUQVRFX1MyKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9lcnJfLAotCQkJCSAoIiVzOiBSZWplY3QgdG8gZW50ZXIgUFNfU1RBVEUoMHglMDJYKSBsb3dlciAiCi0JCQkJICAidGhhbiBTMiB3aGVuIERyaXZlclN0b3BwZWQhIVxuIiwKLQkJCQkgIF9fZnVuY19fLCBwc2x2KSk7CisJCQkJICIlczogUmVqZWN0IHRvIGVudGVyIFBTX1NUQVRFKDB4JTAyWCkgbG93ZXIgdGhhbiBTMiB3aGVuIERyaXZlclN0b3BwZWQhIVxuIiwKKwkJCQkgX19mdW5jX18sIHBzbHYpOwogCQkJcmV0dXJuOwogCQl9CiAJfQogCiAJcnB3bSA9IHBzbHYgfCBwd3Jwcml2LT50b2c7CiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3B3cmN0cmxfY18sIF9kcnZfbm90aWNlXywKLQkJICgicnR3X3NldF9ycHdtMjNhOiBycHdtID0gMHglMDJ4IGNwd20gPSAweCUwMnhcbiIsCi0JCSAgcnB3bSwgcHdycHJpdi0+Y3B3bSkpOworCQkgInJ0d19zZXRfcnB3bTIzYTogcnB3bSA9IDB4JTAyeCBjcHdtID0gMHglMDJ4XG4iLAorCQkgcnB3bSwgcHdycHJpdi0+Y3B3bSk7CiAKIAlwd3Jwcml2LT5ycHdtID0gcHNsdjsKIApAQCAtMjgyLDEyICsyODEsMTIgQEAKIAlzdHJ1Y3QgcHdyY3RybF9wcml2ICpwd3Jwcml2ID0gJnBhZGFwdGVyLT5wd3JjdHJscHJpdjsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9wd3JjdHJsX2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgKCIlczogUG93ZXJNb2RlID0lZCBTbWFydF9QUyA9JWRcbiIsCi0JCQkgIF9fZnVuY19fLCBwc19tb2RlLCBzbWFydF9wcykpOworCQkgIiVzOiBQb3dlck1vZGUgPSVkIFNtYXJ0X1BTID0lZFxuIiwKKwkJIF9fZnVuY19fLCBwc19tb2RlLCBzbWFydF9wcyk7CiAKIAlpZiAocHNfbW9kZSA+IFBNX0NhcmRfRGlzYWJsZSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcHdyY3RybF9jXywgX2Rydl9lcnJfLAotCQkJICgicHNfbW9kZTolZCBlcnJvclxuIiwgcHNfbW9kZSkpOworCQkJICJwc19tb2RlOiVkIGVycm9yXG4iLCBwc19tb2RlKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19yZWN2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3JlY3YuYwppbmRleCA1NTlkZGRlLi4yNzRhNGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3JlY3YuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3JlY3YuYwpAQCAtMjk5LDEyICsyOTksOSBAQAogCiAJaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiXG4gcmVjdmZyYW1lX2Noa21pYzpwcnhhdHRyaWItPmVuY3J5cHQgPT0gV0xBTl9DSVBIRVJfU1VJVEVfVEtJUFxuIikpOworCQkJICJyZWN2ZnJhbWVfY2hrbWljOnByeGF0dHJpYi0+ZW5jcnlwdCA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQXG4iKTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJcbiByZWN2ZnJhbWVfY2hrbWljOmRhID0gMHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OiIKLQkJCSAgIjB4JTAyeDoweCUwMnhcbiIsIHByeGF0dHJpYi0+cmFbMF0sCi0JCQkgIHByeGF0dHJpYi0+cmFbMV0sIHByeGF0dHJpYi0+cmFbMl0sIHByeGF0dHJpYi0+cmFbM10sCi0JCQkgIHByeGF0dHJpYi0+cmFbNF0sIHByeGF0dHJpYi0+cmFbNV0pKTsKKwkJCSAicmVjdmZyYW1lX2Noa21pYzpkYSA9ICVwTVxuIiwgcHJ4YXR0cmliLT5yYSk7CiAKIAkJLyogY2FsY3VsYXRlIG1pYyBjb2RlICovCiAJCWlmIChzdGFpbmZvICE9IE5VTEwpIHsKQEAgLTMxMiwxNCArMzA5LDEzIEBACiAJCQkJbWlja2V5ID0gJnBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnByeG1pY2tleVtwcnhhdHRyaWItPmtleV9pbmRleF0uc2tleVswXTsKIAogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgKCJcbiByZWN2ZnJhbWVfY2hrbWljOiBiY21jIGtleVxuIikpOworCQkJCQkgInJlY3ZmcmFtZV9jaGttaWM6IGJjbWMga2V5XG4iKTsKIAogCQkJCWlmICghcHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkpIHsKIAkJCQkJcmVzID0gX0ZBSUw7CiAJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAogCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAoIlxuIHJlY3ZmcmFtZV9jaGttaWM6ZGlkbid0ICIKLQkJCQkJCSAgImluc3RhbGwgZ3JvdXAga2V5ISEhISEhXG4iKSk7CisJCQkJCQkgInJlY3ZmcmFtZV9jaGttaWM6ZGlkbid0IGluc3RhbGwgZ3JvdXAga2V5IVxuIik7CiAJCQkJCURCR184NzIzQSgiXG4gcmVjdmZyYW1lX2Noa21pYzpkaWRuJ3QgIgogCQkJCQkJICAiaW5zdGFsbCBncm91cCBrZXkhISEhISFcbiIpOwogCQkJCQlnb3RvIGV4aXQ7CkBAIC0zMjcsOCArMzIzLDcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJbWlja2V5ID0gJnN0YWluZm8tPmRvdDExdGtpcHJ4bWlja2V5LnNrZXlbMF07CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICgiXG4gcmVjdmZyYW1lX2Noa21pYzogdW5pY2FzdCAiCi0JCQkJCSAgImtleVxuIikpOworCQkJCQkgInJlY3ZmcmFtZV9jaGttaWM6IHVuaWNhc3Qga2V5XG4iKTsKIAkJCX0KIAogCQkJLyogaWN2X2xlbiBpbmNsdWRlZCB0aGUgbWljIGNvZGUgKi8KQEAgLTMzOSw5ICszMzQsOCBAQAogCQkJCXByeGF0dHJpYi0+aXZfbGVuOwogCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCQkgKCJcbiBwcnhhdHRyaWItPml2X2xlbiA9JWQgcHJ4YXR0cmliLT5pY3ZfbGVuID0iCi0JCQkJICAiJWRcbiIsIHByeGF0dHJpYi0+aXZfbGVuLAotCQkJCSAgcHJ4YXR0cmliLT5pY3ZfbGVuKSk7CisJCQkJICJwcnhhdHRyaWItPml2X2xlbiA9JWQgcHJ4YXR0cmliLT5pY3ZfbGVuID0lZFxuIiwKKwkJCQkgcHJ4YXR0cmliLT5pdl9sZW4sIHByeGF0dHJpYi0+aWN2X2xlbik7CiAKIAkJCS8qIGNhcmUgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSAqLwogCQkJcnR3X3NlY2NhbGN0a2lwbWljMjNhKG1pY2tleSwgcGZyYW1lLCBwYXlsb2FkLApAQCAtMzU2LDEwICszNTAsOSBAQAogCQkJCWlmIChtaWNjb2RlW2ldICE9ICoocGZyYW1lbWljICsgaSkpIHsKIAkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sCiAJCQkJCQkgX2Rydl9lcnJfLAotCQkJCQkJICgicmVjdmZyYW1lX2Noa21pYzptaWNjb2RlIgotCQkJCQkJICAiWyVkXSglMDJ4KSAhPSAqKHBmcmFtZW1pYysiCi0JCQkJCQkgICIlZCkoJTAyeCkgIiwgaSwgbWljY29kZVtpXSwKLQkJCQkJCSAgaSwgKihwZnJhbWVtaWMgKyBpKSkpOworCQkJCQkJICJyZWN2ZnJhbWVfY2hrbWljOm1pY2NvZGVbJWRdKCUwMngpICE9ICoocGZyYW1lbWljKyVkKSglMDJ4KVxuIiwKKwkJCQkJCSBpLCBtaWNjb2RlW2ldLAorCQkJCQkJIGksICoocGZyYW1lbWljICsgaSkpOwogCQkJCQlibWljX2VyciA9IHRydWU7CiAJCQkJfQogCQkJfQpAQCAtMzY4LDUxICszNjEsNDQgQEAKIAkJCQlpbnQgaTsKIAogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAoIlxuICoocGZyYW1lbWljLTgpLSoocGZyYW1lbWljLTEpID0iCi0JCQkJCSAgIjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6IgotCQkJCQkgICIweCUwMng6MHglMDJ4OjB4JTAyeFxuIiwKLQkJCQkJICAqKHBmcmFtZW1pYyAtIDgpLCAqKHBmcmFtZW1pYyAtIDcpLAotCQkJCQkgICoocGZyYW1lbWljIC0gNiksICoocGZyYW1lbWljIC0gNSksCi0JCQkJCSAgKihwZnJhbWVtaWMgLSA0KSwgKihwZnJhbWVtaWMgLSAzKSwKLQkJCQkJICAqKHBmcmFtZW1pYyAtIDIpLCAqKHBmcmFtZW1pYyAtIDEpKSk7CisJCQkJCSAiKihwZnJhbWVtaWMtOCktKihwZnJhbWVtaWMtMSkgPTB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMnhcbiIsCisJCQkJCSAqKHBmcmFtZW1pYyAtIDgpLCAqKHBmcmFtZW1pYyAtIDcpLAorCQkJCQkgKihwZnJhbWVtaWMgLSA2KSwgKihwZnJhbWVtaWMgLSA1KSwKKwkJCQkJICoocGZyYW1lbWljIC0gNCksICoocGZyYW1lbWljIC0gMyksCisJCQkJCSAqKHBmcmFtZW1pYyAtIDIpLCAqKHBmcmFtZW1pYyAtIDEpKTsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkgKCJcbiAqKHBmcmFtZW1pYy0xNiktKihwZnJhbWVtaWMtOSkgPSIKLQkJCQkJICAiMHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoiCi0JCQkJCSAgIjB4JTAyeDoweCUwMng6MHglMDJ4XG4iLAotCQkJCQkgICoocGZyYW1lbWljIC0gMTYpLCAqKHBmcmFtZW1pYyAtIDE1KSwKLQkJCQkJICAqKHBmcmFtZW1pYyAtIDE0KSwgKihwZnJhbWVtaWMgLSAxMyksCi0JCQkJCSAgKihwZnJhbWVtaWMgLSAxMiksICoocGZyYW1lbWljIC0gMTEpLAotCQkJCQkgICoocGZyYW1lbWljIC0gMTApLCAqKHBmcmFtZW1pYyAtIDkpKSk7CisJCQkJCSAiKihwZnJhbWVtaWMtMTYpLSoocGZyYW1lbWljLTkpID0weCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4XG4iLAorCQkJCQkgKihwZnJhbWVtaWMgLSAxNiksICoocGZyYW1lbWljIC0gMTUpLAorCQkJCQkgKihwZnJhbWVtaWMgLSAxNCksICoocGZyYW1lbWljIC0gMTMpLAorCQkJCQkgKihwZnJhbWVtaWMgLSAxMiksICoocGZyYW1lbWljIC0gMTEpLAorCQkJCQkgKihwZnJhbWVtaWMgLSAxMCksICoocGZyYW1lbWljIC0gOSkpOwogCiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICgiXG4gPT09PT09IGRlbXAgcGFja2V0IChsZW4gPSVkKSA9PT09PT0iCi0JCQkJCSAgIlxuIiwgcHJlY3ZmcmFtZS0+cGt0LT5sZW4pKTsKKwkJCQkJICI9PT09PT0gZGVtcCBwYWNrZXQgKGxlbiA9JWQpID09PT09PVxuIiwKKwkJCQkJIHByZWN2ZnJhbWUtPnBrdC0+bGVuKTsKIAkJCQlmb3IgKGkgPSAwOyBpIDwgcHJlY3ZmcmFtZS0+cGt0LT5sZW47IGkgPSBpICsgOCkgewogCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywKLQkJCQkJCSBfZHJ2X2Vycl8sICgiMHglMDJ4OjB4JTAyeDoweCIKLQkJCQkJCQkgICAgIiUwMng6MHglMDJ4OjB4JTAiCi0JCQkJCQkJICAgICIyeDoweCUwMng6MHglMDJ4IgotCQkJCQkJCSAgICAiOjB4JTAyeCIsCi0JCQkJCQkJICAgICoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2kpLCoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2krMSksCi0JCQkJCQkJICAgICoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2krMiksKihwcmVjdmZyYW1lLT5wa3QtPmRhdGEraSszKSwKLQkJCQkJCQkgICAgKihwcmVjdmZyYW1lLT5wa3QtPmRhdGEraSs0KSwqKHByZWN2ZnJhbWUtPnBrdC0+ZGF0YStpKzUpLAotCQkJCQkJCSAgICAqKHByZWN2ZnJhbWUtPnBrdC0+ZGF0YStpKzYpLCoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2krNykpKTsKKwkJCQkJCSBfZHJ2X2Vycl8sCisJCQkJCQkgIjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMng6MHglMDJ4OjB4JTAyeDoweCUwMnhcbiIsCisJCQkJCQkgKihwcmVjdmZyYW1lLT5wa3QtPmRhdGEraSksCisJCQkJCQkgKihwcmVjdmZyYW1lLT5wa3QtPmRhdGEraSsxKSwKKwkJCQkJCSAqKHByZWN2ZnJhbWUtPnBrdC0+ZGF0YStpKzIpLAorCQkJCQkJICoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2krMyksCisJCQkJCQkgKihwcmVjdmZyYW1lLT5wa3QtPmRhdGEraSs0KSwKKwkJCQkJCSAqKHByZWN2ZnJhbWUtPnBrdC0+ZGF0YStpKzUpLAorCQkJCQkJICoocHJlY3ZmcmFtZS0+cGt0LT5kYXRhK2krNiksCisJCQkJCQkgKihwcmVjdmZyYW1lLT5wa3QtPmRhdGEraSs3KSk7CiAJCQkJfQogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJCSAoIlxuID09PT09PSBkZW1wIHBhY2tldCBlbmQgW2xlbiA9JWRdIgotCQkJCQkgICI9PT09PT1cbiIsIHByZWN2ZnJhbWUtPnBrdC0+bGVuKSk7CisJCQkJCSAiPT09PT09IGRlbXAgcGFja2V0IGVuZCBbbGVuID0lZF09PT09PT1cbiIsCisJCQkJCSBwcmVjdmZyYW1lLT5wa3QtPmxlbik7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkJICgiXG4gaHJkbGVuID0lZCxcbiIsCi0JCQkJCSAgcHJ4YXR0cmliLT5oZHJsZW4pKTsKKwkJCQkJICJocmRsZW4gPSVkXG4iLCBwcnhhdHRyaWItPmhkcmxlbik7CiAKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCQkgKCJyYSA9IDB4JS4yeCAweCUuMnggMHglLjJ4IDB4JS4yeCAweCUuIgotCQkJCQkgICIyeCAweCUuMnggcHNlY3VyaXR5cHJpdi0+IgotCQkJCQkgICJiaW5zdGFsbEdycGtleSA9JWQgIiwKLQkJCQkJICBwcnhhdHRyaWItPnJhWzBdLCBwcnhhdHRyaWItPnJhWzFdLAotCQkJCQkgIHByeGF0dHJpYi0+cmFbMl0sIHByeGF0dHJpYi0+cmFbM10sCi0JCQkJCSAgcHJ4YXR0cmliLT5yYVs0XSwgcHJ4YXR0cmliLT5yYVs1XSwKLQkJCQkJICBwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSkpOworCQkJCQkgInJhID0gJXBNIHBzZWN1cml0eXByaXYtPmJpbnN0YWxsR3Jwa2V5ID0lZFxuIiwKKwkJCQkJIHByeGF0dHJpYi0+cmEsCisJCQkJCSBwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSk7CiAKIAkJCQkvKiAgZG91YmxlIGNoZWNrIGtleV9pbmRleCBmb3Igc29tZSB0aW1pbmcKIAkJCQkgICAgaXNzdWUsIGNhbm5vdCBjb21wYXJlIHdpdGgKQEAgLTQyNiwxNiArNDEyLDE3IEBACiAJCQkJaWYgKChwcnhhdHRyaWItPmJkZWNyeXB0ZWQgPT0gdHJ1ZSkgJiYKIAkJCQkgICAgKGJycHRfbWljZXJyb3IgPT0gdHJ1ZSkpIHsKIAkJCQkJcnR3X2hhbmRsZV90a2lwX21pY19lcnIyM2EoYWRhcHRlciwgKHU4KWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHByeGF0dHJpYi0+cmEpKTsKLQkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCIgbWljIGVycm9yIDpwcnhhdHRyaWItPmJkZWNyeXB0ZWQgPSVkICIsIHByeGF0dHJpYi0+YmRlY3J5cHRlZCkpOworCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAorCQkJCQkJICJtaWMgZXJyb3IgOnByeGF0dHJpYi0+YmRlY3J5cHRlZCA9JWRcbiIsCisJCQkJCQkgcHJ4YXR0cmliLT5iZGVjcnlwdGVkKTsKIAkJCQkJREJHXzg3MjNBKCIgbWljIGVycm9yIDpwcnhhdHRyaWItPiIKIAkJCQkJCSAgImJkZWNyeXB0ZWQgPSVkXG4iLAogCQkJCQkJICBwcnhhdHRyaWItPmJkZWNyeXB0ZWQpOwogCQkJCX0gZWxzZSB7CiAJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLAogCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAoIiBtaWMgZXJyb3IgOnByeGF0dHJpYi0+IgotCQkJCQkJICAiYmRlY3J5cHRlZCA9JWQgIiwKLQkJCQkJCSAgcHJ4YXR0cmliLT5iZGVjcnlwdGVkKSk7CisJCQkJCQkgIm1pYyBlcnJvciA6cHJ4YXR0cmliLT5iZGVjcnlwdGVkID0lZFxuIiwKKwkJCQkJCSBwcnhhdHRyaWItPmJkZWNyeXB0ZWQpOwogCQkJCQlEQkdfODcyM0EoIiBtaWMgZXJyb3IgOnByeGF0dHJpYi0+IgogCQkJCQkJICAiYmRlY3J5cHRlZCA9JWRcbiIsCiAJCQkJCQkgIHByeGF0dHJpYi0+YmRlY3J5cHRlZCk7CkBAIC00NDksMTQgKzQzNiwxMiBAQAogCQkJCQlwc2VjdXJpdHlwcml2LT5iY2hlY2tfZ3Jwa2V5ID0gMTsKIAkJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sCiAJCQkJCQkgX2Rydl9lcnJfLAotCQkJCQkJICgicHNlY3VyaXR5cHJpdi0+YmNoZWNrX2dycCIKLQkJCQkJCSAgImtleSA9IHRydWUiKSk7CisJCQkJCQkgInBzZWN1cml0eXByaXYtPmJjaGVja19ncnBrZXkgPSB0cnVlXG4iKTsKIAkJCQl9CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAoInJlY3ZmcmFtZV9jaGttaWM6IHJ0d19nZXRfc3RhaW5mbzIzYSA9PSIKLQkJCQkgICJOVUxMISEhXG4iKSk7CisJCQkJICJyZWN2ZnJhbWVfY2hrbWljOiBydHdfZ2V0X3N0YWluZm8yM2EgPT1OVUxMISEhXG4iKTsKIAkJfQogCiAJCXNrYl90cmltKHByZWN2ZnJhbWUtPnBrdCwgcHJlY3ZmcmFtZS0+cGt0LT5sZW4gLSA4KTsKQEAgLTQ4MSw4ICs0NjYsOCBAQAogCWludCByZXMgPSBfU1VDQ0VTUzsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJwcnhzdGF0LT5kZWNyeXB0ZWQgPSV4IHByeGF0dHJpYi0+ZW5jcnlwdCA9IDB4JTAzeFxuIiwKLQkJICBwcnhhdHRyaWItPmJkZWNyeXB0ZWQsIHByeGF0dHJpYi0+ZW5jcnlwdCkpOworCQkgInByeHN0YXQtPmRlY3J5cHRlZCA9JXggcHJ4YXR0cmliLT5lbmNyeXB0ID0gMHglMDN4XG4iLAorCQkgcHJ4YXR0cmliLT5iZGVjcnlwdGVkLCBwcnhhdHRyaWItPmVuY3J5cHQpOwogCiAJaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCA+IDApIHsKIAkJdTggKml2ID0gcHJlY3ZfZnJhbWUtPnBrdC0+ZGF0YSArIHByeGF0dHJpYi0+aGRybGVuOwpAQCAtNTY1LDggKzU1MCw4IEBACiAJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcHN0YV9hZGRyKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkgKCIjIyMjIyMjI3BvcnRjdHJsOmFkYXB0ZXItPnNlY3VyaXR5cHJpdi5kb3QxMUF1dGhBbGdydGhtID0iCi0JCSAgIiVkXG4iLCBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFBdXRoQWxncnRobSkpOworCQkgIiMjIyMjIyMjcG9ydGN0cmw6YWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0gPSVkXG4iLAorCQkgYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExQXV0aEFsZ3J0aG0pOwogCiAJcHJ0bmZyYW1lID0gcHJlY3ZfZnJhbWU7CiAKQEAgLTU4MCw4ICs1NjUsNyBAQAogCQkJLyogYmxvY2tlZCAqLwogCQkJLyogb25seSBhY2NlcHQgRUFQT0wgZnJhbWUgKi8KIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoIiMjIyMjIyMjcG9ydGN0cmw6cHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0iCi0JCQkJICAiMVxuIikpOworCQkJCSAiIyMjIyMjIyNwb3J0Y3RybDpwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9PTFcbiIpOwogCiAJCQlpZiAoZXRoZXJfdHlwZSAhPSBlYXBvbF90eXBlKSB7CiAJCQkJLyogZnJlZSB0aGlzIGZyYW1lICovCkBAIC02MDgsOCArNTkyLDggQEAKIAogCWlmICh0aWQgPiAxNSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkJICgicmVjdl9kZWNhY2hlLCAodGlkPjE1KSEgc2VxX2N0cmwgPSAweCV4LCB0aWQgPSAweCV4XG4iLAotCQkJICBzZXFfY3RybCwgdGlkKSk7CisJCQkgInJlY3ZfZGVjYWNoZSwgKHRpZD4xNSkhIHNlcV9jdHJsID0gMHgleCwgdGlkID0gMHgleFxuIiwKKwkJCSBzZXFfY3RybCwgdGlkKTsKIAogCQlyZXR1cm4gX0ZBSUw7CiAJfQpAQCAtNjE3LDkgKzYwMSw4IEBACiAJaWYgKDEpIHsgLyogaWYgKGJyZXRyeSkgKi8KIAkJaWYgKHNlcV9jdHJsID09IHByeGNhY2hlLT50aWRfcnhzZXFbdGlkXSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJCQkgKCJyZWN2X2RlY2FjaGUsIHNlcV9jdHJsID0gMHgleCwgdGlkID0gMHgleCwgIgotCQkJCSAgInRpZF9yeHNlcSA9IDB4JXhcbiIsCi0JCQkJICBzZXFfY3RybCwgdGlkLCBwcnhjYWNoZS0+dGlkX3J4c2VxW3RpZF0pKTsKKwkJCQkgInJlY3ZfZGVjYWNoZSwgc2VxX2N0cmwgPSAweCV4LCB0aWQgPSAweCV4LCB0aWRfcnhzZXEgPSAweCV4XG4iLAorCQkJCSBzZXFfY3RybCwgdGlkLCBwcnhjYWNoZS0+dGlkX3J4c2VxW3RpZF0pOwogCiAJCQlyZXR1cm4gX0ZBSUw7CiAJCX0KQEAgLTc3Nyw3ICs3NjAsNyBAQAogCQkvKiAgZmlsdGVyIHBhY2tldHMgdGhhdCBTQSBpcyBteXNlbGYgb3IgbXVsdGljYXN0IG9yIGJyb2FkY2FzdCAqLwogCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChteWh3YWRkciwgcGF0dHJpYi0+c3JjKSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgKCIgU0EgPT0gbXlzZWxmXG4iKSk7CisJCQkJICJTQSA9PSBteXNlbGZcbiIpOwogCQkJcmV0ID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTgwMCw4ICs3ODMsNyBAQAogCQkgICAgYW5kIERBIGlzIG15IG1hYy1hZGRyZXNzICovCiAJCWlmICghZXRoZXJfYWRkcl9lcXVhbChwYXR0cmliLT5ic3NpZCwgcGF0dHJpYi0+c3JjKSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJic3NpZCAhPSBUQSB1bmRlciBTVEFUSU9OX01PREU7IGRyb3AgIgotCQkJCSAgInBrdFxuIikpOworCQkJCSAiYnNzaWQgIT0gVEEgdW5kZXIgU1RBVElPTl9NT0RFOyBkcm9wIHBrdFxuIik7CiAJCQlyZXQgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtODQzLDcgKzgyNSw4IEBACiAJCSpwc3RhID0gcnR3X2dldF9zdGFpbmZvMjNhKHBzdGFwcml2LCBzdGFfYWRkcik7IC8qICBnZXQgYXBfaW5mbyAqLwogCiAJaWYgKCpwc3RhID09IE5VTEwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgKCJjYW4ndCBnZXQgcHN0YSB1bmRlciBzdGEyc3RhX2RhdGFfZnJhbWUgOyBkcm9wIHBrdFxuIikpOworCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAorCQkJICJjYW4ndCBnZXQgcHN0YSB1bmRlciBzdGEyc3RhX2RhdGFfZnJhbWUgOyBkcm9wIHBrdFxuIik7CiAJCXJldCA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtODc5LDcgKzg2Miw3IEBACiAJCS8qIGZpbHRlciBwYWNrZXRzIHRoYXQgU0EgaXMgbXlzZWxmIG9yIG11bHRpY2FzdCBvciBicm9hZGNhc3QgKi8KIAkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobXlod2FkZHIsIHBhdHRyaWItPnNyYykpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiIFNBID09IG15c2VsZlxuIikpOworCQkJCSAiU0EgPT0gbXlzZWxmXG4iKTsKIAkJCXJldCA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CkBAIC04ODcsOCArODcwLDggQEAKIAkJLyogIGRhIHNob3VsZCBiZSBmb3IgbWUgKi8KIAkJaWYgKCFldGhlcl9hZGRyX2VxdWFsKG15aHdhZGRyLCBwYXR0cmliLT5kc3QpICYmICFibWNhc3QpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSgiIGFwMnN0YV9kYXRhX2ZyYW1lOiAgY29tcGFyZSBEQSBmYWlsOyBEQSA9IgotCQkJCSBNQUNfRk1UIlxuIiwgTUFDX0FSRyhwYXR0cmliLT5kc3QpKSk7CisJCQkJICJhcDJzdGFfZGF0YV9mcmFtZTogIGNvbXBhcmUgREEgZmFpbGVkOyBEQT0lcE1cbiIsCisJCQkJIHBhdHRyaWItPmRzdCk7CiAJCQlyZXQgPSBfRkFJTDsKIAkJCWdvdG8gZXhpdDsKIAkJfQpAQCAtODk4LDE1ICs4ODEsMTQgQEAKIAkJICAgIGV0aGVyX2FkZHJfZXF1YWwobXlic3NpZCwgIlx4MFx4MFx4MFx4MFx4MFx4MCIpIHx8CiAJCSAgICAhZXRoZXJfYWRkcl9lcXVhbChwYXR0cmliLT5ic3NpZCwgbXlic3NpZCkpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSgiIGFwMnN0YV9kYXRhX2ZyYW1lOiAgY29tcGFyZSBCU1NJRCBmYWlsIDsgIgotCQkJCSAiQlNTSUQgPSJNQUNfRk1UIlxuIiwgTUFDX0FSRyhwYXR0cmliLT5ic3NpZCkpKTsKKwkJCQkgImFwMnN0YV9kYXRhX2ZyYW1lOiAgY29tcGFyZSBCU1NJRCBmYWlsZWQ7IEJTU0lEPSVwTVxuIiwKKwkJCQkgcGF0dHJpYi0+YnNzaWQpOwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkJICgibXlic3NpZCA9Ik1BQ19GTVQiXG4iLCBNQUNfQVJHKG15YnNzaWQpKSk7CisJCQkJICJteWJzc2lkPSVwTVxuIiwgbXlic3NpZCk7CiAKIAkJCWlmICghYm1jYXN0KSB7Ci0JCQkJREJHXzg3MjNBKCJpc3N1ZV9kZWF1dGgyM2EgdG8gdGhlIG5vbmFzc29jaWF0ZWQgIgotCQkJCQkgICJhcCA9IiBNQUNfRk1UICIgZm9yIHRoZSByZWFzb24oNylcbiIsCi0JCQkJCSAgTUFDX0FSRyhwYXR0cmliLT5ic3NpZCkpOworCQkJCURCR184NzIzQSgiaXNzdWVfZGVhdXRoMjNhIHRvIHRoZSBub25hc3NvY2lhdGVkIGFwPSVwTSBmb3IgdGhlIHJlYXNvbig3KVxuIiwKKwkJCQkJICBwYXR0cmliLT5ic3NpZCk7CiAJCQkJaXNzdWVfZGVhdXRoMjNhKGFkYXB0ZXIsIHBhdHRyaWItPmJzc2lkLAogCQkJCQkgICAgIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSk7CiAJCQl9CkBAIC05MjMsOCArOTA1LDcgQEAKIAogCQlpZiAoKnBzdGEgPT0gTlVMTCkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJhcDJzdGE6IGNhbid0IGdldCBwc3RhIHVuZGVyIFNUQVRJT05fTU9ERSA7IgotCQkJCSAgIiBkcm9wIHBrdFxuIikpOworCQkJCSAiYXAyc3RhOiBjYW4ndCBnZXQgcHN0YSB1bmRlciBTVEFUSU9OX01PREU7IGRyb3AgcGt0XG4iKTsKIAkJCXJldCA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CkBAIC05NTIsNyArOTMzLDcgQEAKIAkJKnBzdGEgPSBydHdfZ2V0X3N0YWluZm8yM2EocHN0YXByaXYsIHBhdHRyaWItPmJzc2lkKTsKIAkJaWYgKCpwc3RhID09IE5VTEwpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiY2FuJ3QgZ2V0IHBzdGEgdW5kZXIgTVBfTU9ERSA7IGRyb3AgcGt0XG4iKSk7CisJCQkJICJjYW4ndCBnZXQgcHN0YSB1bmRlciBNUF9NT0RFIDsgZHJvcCBwa3RcbiIpOwogCQkJcmV0ID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTk2NCw5ICs5NDUsOCBAQAogCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChteWh3YWRkciwgcGF0dHJpYi0+ZHN0KSAmJiAhYm1jYXN0KSB7CiAJCQkqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+YnNzaWQpOwogCQkJaWYgKCpwc3RhID09IE5VTEwpIHsKLQkJCQlEQkdfODcyM0EoImlzc3VlX2RlYXV0aDIzYSB0byB0aGUgYXAgPSIgTUFDX0ZNVAotCQkJCQkgICIgZm9yIHRoZSByZWFzb24oNylcbiIsCi0JCQkJCSAgTUFDX0FSRyhwYXR0cmliLT5ic3NpZCkpOworCQkJCURCR184NzIzQSgiaXNzdWVfZGVhdXRoMjNhIHRvIHRoZSBhcD0lcE0gZm9yIHRoZSByZWFzb24oNylcbiIsCisJCQkJCSAgcGF0dHJpYi0+YnNzaWQpOwogCiAJCQkJaXNzdWVfZGVhdXRoMjNhKGFkYXB0ZXIsIHBhdHRyaWItPmJzc2lkLAogCQkJCQkgICAgIFdMQU5fUkVBU09OX0NMQVNTM19GUkFNRV9GUk9NX05PTkFTU09DX1NUQSk7CkBAIC0xMDEwLDEwICs5OTAsOSBAQAogCQkqcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+c3JjKTsKIAkJaWYgKCpwc3RhID09IE5VTEwpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiY2FuJ3QgZ2V0IHBzdGEgdW5kZXIgQVBfTU9ERTsgZHJvcCBwa3RcbiIpKTsKLQkJCURCR184NzIzQSgiaXNzdWVfZGVhdXRoMjNhIHRvIHN0YSA9IiBNQUNfRk1UCi0JCQkJICAiIGZvciB0aGUgcmVhc29uKDcpXG4iLAotCQkJCSAgTUFDX0FSRyhwYXR0cmliLT5zcmMpKTsKKwkJCQkgImNhbid0IGdldCBwc3RhIHVuZGVyIEFQX01PREU7IGRyb3AgcGt0XG4iKTsKKwkJCURCR184NzIzQSgiaXNzdWVfZGVhdXRoMjNhIHRvIHN0YT0lcE0gZm9yIHRoZSByZWFzb24oNylcbiIsCisJCQkJICBwYXR0cmliLT5zcmMpOwogCiAJCQlpc3N1ZV9kZWF1dGgyM2EoYWRhcHRlciwgcGF0dHJpYi0+c3JjLAogCQkJCSAgICAgV0xBTl9SRUFTT05fQ0xBU1MzX0ZSQU1FX0ZST01fTk9OQVNTT0NfU1RBKTsKQEAgLTEwNDMsOCArMTAyMiw4IEBACiAJCQlyZXQgPSBSVFdfUlhfSEFORExFRDsKIAkJCWdvdG8gZXhpdDsKIAkJfQotCQlEQkdfODcyM0EoImlzc3VlX2RlYXV0aDIzYSB0byBzdGEgPSIgTUFDX0ZNVCAiIGZvciB0aGUgcmVhc29uKDcpXG4iLAotCQkJICBNQUNfQVJHKHBhdHRyaWItPnNyYykpOworCQlEQkdfODcyM0EoImlzc3VlX2RlYXV0aDIzYSB0byBzdGE9JXBNIGZvciB0aGUgcmVhc29uKDcpXG4iLAorCQkJICBwYXR0cmliLT5zcmMpOwogCQlpc3N1ZV9kZWF1dGgyM2EoYWRhcHRlciwgcGF0dHJpYi0+c3JjLAogCQkJICAgICBXTEFOX1JFQVNPTl9DTEFTUzNfRlJBTUVfRlJPTV9OT05BU1NPQ19TVEEpOwogCQlyZXQgPSBSVFdfUlhfSEFORExFRDsKQEAgLTEyMTQsMTIgKzExOTMsMTIgQEAKIAkvKiBzdHJ1Y3QgbWxtZV9wcml2ICpwbWxtZXByaXYgPSAmYWRhcHRlci0+bWxtZXByaXY7ICovCiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJICgiK3ZhbGlkYXRlX3JlY3ZfbWdudF9mcmFtZVxuIikpOworCQkgIit2YWxpZGF0ZV9yZWN2X21nbnRfZnJhbWVcbiIpOwogCiAJcHJlY3ZfZnJhbWUgPSByZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYShwYWRhcHRlciwgcHJlY3ZfZnJhbWUpOwogCWlmIChwcmVjdl9mcmFtZSA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgKCIlczogZnJhZ21lbnQgcGFja2V0XG4iLCBfX2Z1bmNfXykpOworCQkJICIlczogZnJhZ21lbnQgcGFja2V0XG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBfU1VDQ0VTUzsKIAl9CiAKQEAgLTEzMDUsNyArMTI4NCw3IEBACiAJCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT5yYSwgaGRyLT5hZGRyMSk7CiAJCWV0aGVyX2FkZHJfY29weShwYXR0cmliLT50YSwgaGRyLT5hZGRyMik7CiAJCXJldCA9IF9GQUlMOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLCAoIiBjYXNlIDNcbiIpKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywgImNhc2UgM1xuIik7CiAJCWJyZWFrOwogCX0KIApAQCAtMTMxNCw3ICsxMjkzLDcgQEAKIAogCWlmICghcHN0YSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICgiIGFmdGVyIHRvX2ZyX2RzX2NoazsgcHN0YSA9PSBOVUxMXG4iKSk7CisJCQkgImFmdGVyIHRvX2ZyX2RzX2NoazsgcHN0YSA9PSBOVUxMXG4iKTsKIAkJcmV0ID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0xMzU3LDI2ICsxMzM2LDI1IEBACiAJaWYgKHJlY3ZfZGVjYWNoZShwcmVjdl9mcmFtZSwgYnJldHJ5LCAmcHN0YS0+c3RhX3JlY3Zwcml2LnJ4Y2FjaGUpID09CiAJICAgIF9GQUlMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJkZWNhY2hlIDogZHJvcCBwa3RcbiIpKTsKKwkJCSAiZGVjYWNoZSA6IGRyb3AgcGt0XG4iKTsKIAkJcmV0ID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAocGF0dHJpYi0+cHJpdmFjeSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAoInZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZTpwYXR0cmliLT5wcml2YWN5ID0leFxuIiwKLQkJCSBwYXR0cmliLT5wcml2YWN5KSk7CisJCQkgInZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZTpwYXR0cmliLT5wcml2YWN5ID0leFxuIiwKKwkJCSBwYXR0cmliLT5wcml2YWN5KTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJcbiBeXl5eXl5eXl5eXmlzX211bHRpY2FzdF9ldGhlcl9hZGRyIgotCQkJICAiKHBhdHRyaWItPnJhKDB4JTAyeCkpID0lZF5eXl5eXl5eXl5eXl5eXjZcbiIsCi0JCQkgIHBhdHRyaWItPnJhWzBdLAotCQkJICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSkpKTsKKwkJCSAiXl5eXl5eXl5eXl5pc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSgweCUwMngpKSA9JWReXl5eXl5eXl5eXl5eXl42XG4iLAorCQkJIHBhdHRyaWItPnJhWzBdLAorCQkJIGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKSk7CiAKIAkJR0VUX0VOQ1JZX0FMR08ocHNlY3VyaXR5cHJpdiwgcHN0YSwgcGF0dHJpYi0+ZW5jcnlwdCwKIAkJCSAgICAgICBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSkpOwogCiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiXG4gcGF0dHJpYi0+ZW5jcnlwdCA9JWRcbiIsIHBhdHRyaWItPmVuY3J5cHQpKTsKKwkJCSAicGF0dHJpYi0+ZW5jcnlwdCA9JWRcbiIsIHBhdHRyaWItPmVuY3J5cHQpOwogCiAJCXN3aXRjaCAocGF0dHJpYi0+ZW5jcnlwdCkgewogCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgpAQCAtMTQ1Nyw3ICsxNDM1LDcgQEAKIAkvKiBhZGQgdmVyc2lvbiBjaGsgKi8KIAlpZiAodmVyICE9IDApIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAoInZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZSBmYWlsISAodmVyIT0gMClcbiIpKTsKKwkJCSAidmFsaWRhdGVfcmVjdl9kYXRhX2ZyYW1lIGZhaWwhICh2ZXIhPSAwKVxuIik7CiAJCXJldHZhbCA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMTQ4Miw3ICsxNDYwLDcgQEAKIAkJcmV0dmFsID0gdmFsaWRhdGVfcmVjdl9tZ250X2ZyYW1lKGFkYXB0ZXIsIHByZWN2X2ZyYW1lKTsKIAkJaWYgKHJldHZhbCA9PSBfRkFJTCkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJ2YWxpZGF0ZV9yZWN2X21nbnRfZnJhbWUgZmFpbFxuIikpOworCQkJCSAidmFsaWRhdGVfcmVjdl9tZ250X2ZyYW1lIGZhaWxcbiIpOwogCQl9CiAJCXJldHZhbCA9IF9GQUlMOyAvKiAgb25seSBkYXRhIGZyYW1lIHJldHVybiBfU1VDQ0VTUyAqLwogCQlicmVhazsKQEAgLTE0OTAsNyArMTQ2OCw3IEBACiAJCXJldHZhbCA9IHZhbGlkYXRlX3JlY3ZfY3RybF9mcmFtZShhZGFwdGVyLCBwcmVjdl9mcmFtZSk7CiAJCWlmIChyZXR2YWwgPT0gX0ZBSUwpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgidmFsaWRhdGVfcmVjdl9jdHJsX2ZyYW1lIGZhaWxcbiIpKTsKKwkJCQkgInZhbGlkYXRlX3JlY3ZfY3RybF9mcmFtZSBmYWlsXG4iKTsKIAkJfQogCQlyZXR2YWwgPSBfRkFJTDsgLyogIG9ubHkgZGF0YSBmcmFtZSByZXR1cm4gX1NVQ0NFU1MgKi8KIAkJYnJlYWs7CkBAIC0xNDk5LDEzICsxNDc3LDEzIEBACiAJCXJldHZhbCA9IHZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZShhZGFwdGVyLCBwcmVjdl9mcmFtZSk7CiAJCWlmIChyZXR2YWwgPT0gX0ZBSUwpIHsKIAkJCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZhZGFwdGVyLT5yZWN2cHJpdjsKLQkJCS8qIFJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sICgidmFsaWRhdGVfcmVjdl9kYXRhX2ZyYW1lIGZhaWxcbiIpKTsgKi8KKwogCQkJcHJlY3Zwcml2LT5yeF9kcm9wKys7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAoInZhbGlkYXRlX3JlY3ZfZGF0YV9mcmFtZSBmYWlsISB0eXBlID0gMHgleFxuIiwgdHlwZSkpOworCQkJICJ2YWxpZGF0ZV9yZWN2X2RhdGFfZnJhbWUgZmFpbCEgdHlwZSA9IDB4JXhcbiIsIHR5cGUpOwogCQlyZXR2YWwgPSBfRkFJTDsKIAkJYnJlYWs7CiAJfQpAQCAtMTU1Miw4ICsxNTMwLDggQEAKIAlsZW4gPSBza2ItPmxlbiAtIGhkcmxlbjsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJcbiA9PT0gcGF0dHJpYi0+aGRybGVuOiAleCwgIHBhdHRyaWItPml2X2xlbjoleCA9PT1cblxuIiwKLQkJICBwYXR0cmliLT5oZHJsZW4sICBwYXR0cmliLT5pdl9sZW4pKTsKKwkJICI9PT0gcGF0dHJpYi0+aGRybGVuOiAleCwgIHBhdHRyaWItPml2X2xlbjoleCA9PT1cbiIsCisJCSBwYXR0cmliLT5oZHJsZW4sICBwYXR0cmliLT5pdl9sZW4pOwogCiAJcGF0dHJpYi0+ZXRoX3R5cGUgPSBldGhfdHlwZTsKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfTVBfU1RBVEUpKSB7CkBAIC0xNjY1LDcgKzE2NDMsNyBAQAogCXJ0d19mcmVlX3JlY3ZmcmFtZTIzYV9xdWV1ZShkZWZyYWdfcSk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJICgiUGVyZm9ybWFuY2UgZGVmcmFnISEhISFcbiIpKTsKKwkJICJQZXJmb3JtYW5jZSBkZWZyYWchISEhIVxuIik7CiAKIAogCkBAIC0xNzM2LDggKzE3MTQsOCBAQAogCQkJLyogc3Bpbl91bmxvY2soJnBkZWZyYWdfcS0+bG9jayk7ICovCiAKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoIkVucXVldXE6IGlzbWZyYWcgPSAlZCwgZnJhZ251bSA9ICVkXG4iLAotCQkJCSAgaXNtZnJhZywgZnJhZ251bSkpOworCQkJCSAiRW5xdWV1cTogaXNtZnJhZyA9ICVkLCBmcmFnbnVtID0gJWRcbiIsCisJCQkJIGlzbWZyYWcsIGZyYWdudW0pOwogCiAJCQlwcnRuZnJhbWUgPSBOVUxMOwogCkBAIC0xNzQ3LDggKzE3MjUsOCBAQAogCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2X2ZyYW1lKTsKIAkJCXBydG5mcmFtZSA9IE5VTEw7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAoIkZyZWUgYmVjYXVzZSBwZGVmcmFnX3EgPT0gTlVMTDogaXNtZnJhZyA9ICIKLQkJCQkgICIlZCwgZnJhZ251bSA9ICVkXG4iLCBpc21mcmFnLCBmcmFnbnVtKSk7CisJCQkJICJGcmVlIGJlY2F1c2UgcGRlZnJhZ19xID09IE5VTEw6IGlzbWZyYWcgPSAlZCwgZnJhZ251bSA9ICVkXG4iLAorCQkJCSBpc21mcmFnLCBmcmFnbnVtKTsKIAkJfQogCX0KIApAQCAtMTc2Myw4ICsxNzQxLDggQEAKIAogCQkJLyogY2FsbCByZWN2ZnJhbWVfZGVmcmFnIHRvIGRlZnJhZyAqLwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfaW5mb18sCi0JCQkJICgiZGVmcmFnOiBpc21mcmFnID0gJWQsIGZyYWdudW0gPSAlZFxuIiwKLQkJCQkgIGlzbWZyYWcsIGZyYWdudW0pKTsKKwkJCQkgImRlZnJhZzogaXNtZnJhZyA9ICVkLCBmcmFnbnVtID0gJWRcbiIsCisJCQkJIGlzbWZyYWcsIGZyYWdudW0pOwogCQkJcHJlY3ZfZnJhbWUgPSByZWN2ZnJhbWVfZGVmcmFnKHBhZGFwdGVyLCBwZGVmcmFnX3EpOwogCQkJcHJ0bmZyYW1lID0gcHJlY3ZfZnJhbWU7CiAJCX0gZWxzZSB7CkBAIC0xNzczLDggKzE3NTEsOCBAQAogCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2X2ZyYW1lKTsKIAkJCXBydG5mcmFtZSA9IE5VTEw7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJCSAoIkZyZWUgYmVjYXVzZSBwZGVmcmFnX3EgPT0gTlVMTDogaXNtZnJhZyA9ICIKLQkJCQkgICIlZCwgZnJhZ251bSA9ICVkXG4iLCBpc21mcmFnLCBmcmFnbnVtKSk7CisJCQkJICJGcmVlIGJlY2F1c2UgcGRlZnJhZ19xID09IE5VTEw6IGlzbWZyYWcgPSAlZCwgZnJhZ251bSA9ICVkXG4iLAorCQkJCSBpc21mcmFnLCBmcmFnbnVtKTsKIAkJfQogCiAJfQpAQCAtMTc4Myw4ICsxNzYxLDcgQEAKIAkJLyogYWZ0ZXIgZGVmcmFnIHdlIG11c3QgY2hlY2sgdGtpcCBtaWMgY29kZSAqLwogCQlpZiAocmVjdmZyYW1lX2Noa21pYyhwYWRhcHRlciwgIHBydG5mcmFtZSkgPT0gX0ZBSUwpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgicmVjdmZyYW1lX2Noa21pYyhwYWRhcHRlciwgIHBydG5mcmFtZSkgPT0iCi0JCQkJICAiX0ZBSUxcbiIpKTsKKwkJCQkgInJlY3ZmcmFtZV9jaGttaWMocGFkYXB0ZXIsICBwcnRuZnJhbWUpID09X0ZBSUxcbiIpOwogCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHBydG5mcmFtZSk7CiAJCQlwcnRuZnJhbWUgPSBOVUxMOwogCQl9CkBAIC0xODgzLDcgKzE4NjAsNiBAQAogCQkJY29udGludWU7CiAJCX0gZWxzZSBpZiAoU05fRVFVQUwocG5leHRhdHRyaWItPnNlcV9udW0sIHBhdHRyaWItPnNlcV9udW0pKSB7CiAJCQkvKiBEdXBsaWNhdGUgZW50cnkgaXMgZm91bmQhISBEbyBub3QgaW5zZXJ0IGN1cnJlbnQgZW50cnkuICovCi0JCQkvKiBSVF9UUkFDRShDT01QX1JYX1JFT1JERVIsIERCR19UUkFDRSwgKCJJbnNlcnRSeFJlb3JkZXJMaXN0KCk6IER1cGxpY2F0ZSBwYWNrZXQgaXMgZHJvcHBlZCEhIEluZGljYXRlU2VxOiAlZCwgTmV3U2VxOiAlZFxuIiwgcFRTLT5SeEluZGljYXRlU2VxLCBTZXFOdW0pKTsgKi8KIAogCQkJLyogc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsgKi8KIAkJCXJldHVybiBmYWxzZTsKQEAgLTE5MDQsNyArMTg4MCw2IEBACiAJLyogc3Bpbl91bmxvY2tfZXgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7ICovCiAJLyogc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHBlbmRpbmdfcmVjdmZyYW1lX3F1ZXVlLT5sb2NrKTsgKi8KIAotCS8qIFJUX1RSQUNFKENPTVBfUlhfUkVPUkRFUiwgREJHX1RSQUNFLCAoIkluc2VydFJ4UmVvcmRlckxpc3QoKTogUGt0IGluc2VydCBpbnRvIGJ1ZmZlciEhIEluZGljYXRlU2VxOiAlZCwgTmV3U2VxOiAlZFxuIiwgcFRTLT5SeEluZGljYXRlU2VxLCBTZXFOdW0pKTsgKi8KIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTk1NiwxMCArMTkzMSw5IEBACiAKIAkJaWYgKCFTTl9MRVNTKHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSwgcGF0dHJpYi0+c2VxX251bSkpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICgicmVjdl9pbmRpY2F0ZXBrdHNfaW5fb3JkZXI6IGluZGljYXRlID0lZCAiCi0JCQkJICAic2VxID0lZCBhbXNkdSA9JWRcbiIsCi0JCQkJICBwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEsCi0JCQkJICBwYXR0cmliLT5zZXFfbnVtLCBwYXR0cmliLT5hbXNkdSkpOworCQkJCSAicmVjdl9pbmRpY2F0ZXBrdHNfaW5fb3JkZXI6IGluZGljYXRlID0lZCBzZXEgPSVkIGFtc2R1ID0lZFxuIiwKKwkJCQkgcHJlb3JkZXJfY3RybC0+aW5kaWNhdGVfc2VxLAorCQkJCSBwYXR0cmliLT5zZXFfbnVtLCBwYXR0cmliLT5hbXNkdSk7CiAKIAkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CiAJCQlsaXN0X2RlbF9pbml0KCZwcmZyYW1lLT5saXN0KTsKQEAgLTIwMjEsOCArMTk5NSw3IEBACiAJCQlpZiAoKHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9PSBmYWxzZSkgJiYKIAkJCSAgICAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gZmFsc2UpKSB7CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJCQkJICgiQEBAQCAgcmVjdl9pbmRpY2F0ZXBrdF9yZW9yZGVyIC0iCi0JCQkJCSAgInJlY3ZfZnVuYyByZWN2X2luZGljYXRlcGt0XG4iKSk7CisJCQkJCSAiQEBAQCAgcmVjdl9pbmRpY2F0ZXBrdF9yZW9yZGVyIC1yZWN2X2Z1bmMgcmVjdl9pbmRpY2F0ZXBrdFxuIik7CiAKIAkJCQlydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYShwYWRhcHRlciwgcHJmcmFtZSk7CiAJCQkJcmV0dXJuIF9TVUNDRVNTOwpAQCAtMjA1NSw4ICsyMDI4LDggQEAKIAlzcGluX2xvY2tfYmgoJnBwZW5kaW5nX3JlY3ZmcmFtZV9xdWV1ZS0+bG9jayk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9ub3RpY2VfLAotCQkgKCJyZWN2X2luZGljYXRlcGt0X3Jlb3JkZXI6IGluZGljYXRlID0lZCBzZXEgPSVkXG4iLAotCQkgIHByZW9yZGVyX2N0cmwtPmluZGljYXRlX3NlcSwgcGF0dHJpYi0+c2VxX251bSkpOworCQkgInJlY3ZfaW5kaWNhdGVwa3RfcmVvcmRlcjogaW5kaWNhdGUgPSVkIHNlcSA9JWRcbiIsCisJCSBwcmVvcmRlcl9jdHJsLT5pbmRpY2F0ZV9zZXEsIHBhdHRyaWItPnNlcV9udW0pOwogCiAJLyogczIuIGNoZWNrIGlmIHdpbnN0YXJ0X2IoaW5kaWNhdGVfc2VxKSBuZWVkcyB0byBiZWVuIHVwZGF0ZWQgKi8KIAlpZiAoIWNoZWNrX2luZGljYXRlX3NlcShwcmVvcmRlcl9jdHJsLCBwYXR0cmliLT5zZXFfbnVtKSkgewpAQCAtMjE0OSw3ICsyMTIyLDcgQEAKIAkJcmV0dmFsID0gd2xhbmhkcl90b19ldGhoZHIocHJmcmFtZSk7CiAJCWlmIChyZXR2YWwgIT0gX1NVQ0NFU1MpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgid2xhbmhkcl90b19ldGhoZHI6IGRyb3AgcGt0XG4iKSk7CisJCQkJICJ3bGFuaGRyX3RvX2V0aGhkcjogZHJvcCBwa3RcbiIpOwogCQkJcmV0dXJuIHJldHZhbDsKIAkJfQogCkBAIC0yMTU3LDE5ICsyMTMwLDE2IEBACiAJCSAgICAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPT0gZmFsc2UpKSB7CiAJCQkvKiBpbmRpY2F0ZSB0aGlzIHJlY3ZfZnJhbWUgKi8KIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICgiQEBAQCBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzLSAiCi0JCQkJICAicmVjdl9mdW5jIHJlY3ZfaW5kaWNhdGVwa3RcbiIpKTsKKwkJCQkgIkBAQEAgcHJvY2Vzc19yZWN2X2luZGljYXRlcGt0cy0gcmVjdl9mdW5jIHJlY3ZfaW5kaWNhdGVwa3RcbiIpOwogCQkJcnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EocGFkYXB0ZXIsIHByZnJhbWUpOwogCQl9IGVsc2UgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfbm90aWNlXywKLQkJCQkgKCJAQEBAIHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMtICIKLQkJCQkgICJyZWN2X2Z1bmMgZnJlZV9pbmRpY2F0ZXBrdFxuIikpOworCQkJCSAiQEBAQCBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzLSByZWN2X2Z1bmMgZnJlZV9pbmRpY2F0ZXBrdFxuIik7CiAKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkJICgicmVjdl9mdW5jOmJEcml2ZXJTdG9wcGVkKCVkKSBPUiAiCi0JCQkJICAiYlN1cnByaXNlUmVtb3ZlZCglZCkiLAotCQkJCSAgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLAotCQkJCSAgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpKTsKKwkJCQkgInJlY3ZfZnVuYzpiRHJpdmVyU3RvcHBlZCglZCkgT1IgYlN1cnByaXNlUmVtb3ZlZCglZClcbiIsCisJCQkJIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKKwkJCQkgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpOwogCQkJcmV0dmFsID0gX0ZBSUw7CiAJCQlyZXR1cm4gcmV0dmFsOwogCQl9CkBAIC0yMTg4LDcgKzIxNTgsNyBAQAogCXJldCA9IHZhbGlkYXRlX3JlY3ZfZnJhbWUocGFkYXB0ZXIsIHJmcmFtZSk7CiAJaWYgKHJldCAhPSBfU1VDQ0VTUykgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAoInJlY3ZfZnVuYzogdmFsaWRhdGVfcmVjdl9mcmFtZSBmYWlsISBkcm9wIHBrdFxuIikpOworCQkJICJyZWN2X2Z1bmM6IHZhbGlkYXRlX3JlY3ZfZnJhbWUgZmFpbCEgZHJvcCBwa3RcbiIpOwogCQlydHdfZnJlZV9yZWN2ZnJhbWUyM2EocmZyYW1lKTsKIAkJZ290byBleGl0OwogCX0KQEAgLTIyMDgsNyArMjE3OCw3IEBACiAJcHJmcmFtZSA9IGRlY3J5cHRvcihwYWRhcHRlciwgcHJmcmFtZSk7CiAJaWYgKHByZnJhbWUgPT0gTlVMTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9lcnJfLAotCQkJICgiZGVjcnlwdG9yOiBkcm9wIHBrdFxuIikpOworCQkJICJkZWNyeXB0b3I6IGRyb3AgcGt0XG4iKTsKIAkJcmV0ID0gX0ZBSUw7CiAJCWdvdG8gX3JlY3ZfZGF0YV9kcm9wOwogCX0KQEAgLTIyMTYsNyArMjE4Niw3IEBACiAJcHJmcmFtZSA9IHJlY3ZmcmFtZV9jaGtfZGVmcmFnMjNhKHBhZGFwdGVyLCBwcmZyYW1lKTsKIAlpZiAoIXByZnJhbWUpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAoInJlY3ZmcmFtZV9jaGtfZGVmcmFnMjNhOiBkcm9wIHBrdFxuIikpOworCQkJICJyZWN2ZnJhbWVfY2hrX2RlZnJhZzIzYTogZHJvcCBwa3RcbiIpOwogCQlnb3RvIF9yZWN2X2RhdGFfZHJvcDsKIAl9CiAKQEAgLTIyMzUsNyArMjIwNSw3IEBACiAJcHJmcmFtZSA9IHBvcnRjdHJsKHBhZGFwdGVyLCBwcmZyYW1lKTsKIAlpZiAoIXByZnJhbWUpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCSAoInBvcnRjdHJsOiBkcm9wIHBrdFxuIikpOworCQkJICJwb3J0Y3RybDogZHJvcCBwa3RcbiIpOwogCQlyZXQgPSBfRkFJTDsKIAkJZ290byBfcmVjdl9kYXRhX2Ryb3A7CiAJfQpAQCAtMjI0NSw3ICsyMjE1LDcgQEAKIAlyZXQgPSBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzKHBhZGFwdGVyLCBwcmZyYW1lKTsKIAlpZiAocmV0ICE9IF9TVUNDRVNTKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJyZWN2X2Z1bmM6IHByb2Nlc3NfcmVjdl9pbmRpY2F0ZXBrdHMgZmFpbCFcbiIpKTsKKwkJCSAicmVjdl9mdW5jOiBwcm9jZXNzX3JlY3ZfaW5kaWNhdGVwa3RzIGZhaWwhXG4iKTsKIAkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKG9yaWdfcHJmcmFtZSk7LyogZnJlZSB0aGlzIHJlY3ZfZnJhbWUgKi8KIAkJZ290byBfcmVjdl9kYXRhX2Ryb3A7CiAJfQpAQCAtMjMzNCw4ICsyMzA0LDggQEAKIAogCS8qIHVwZGF0ZSB2YWx1ZSBvZiBzaWduYWxfc3RyZW5ndGgsIHJzc2ksIHNpZ25hbF9xdWFsICovCiAJaWYgKCFjaGVja19md3N0YXRlKCZhZGFwdGVyLT5tbG1lcHJpdiwgX0ZXX1VOREVSX1NVUlZFWSkpIHsKLQkJdG1wX3MgPSAoYXZnX3NpZ25hbF9zdHJlbmd0aCArIChfYWxwaGEgLSAxKSAqCi0JCQkgcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aCk7CisJCXRtcF9zID0gYXZnX3NpZ25hbF9zdHJlbmd0aCArIChfYWxwaGEgLSAxKSAqCisJCQkgcmVjdnByaXYtPnNpZ25hbF9zdHJlbmd0aDsKIAkJaWYgKHRtcF9zICVfYWxwaGEpCiAJCQl0bXBfcyA9IHRtcF9zIC8gX2FscGhhICsgMTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zZWN1cml0eS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zZWN1cml0eS5jCmluZGV4IDcxNWE0NzQuLmFmNTNjOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc2VjdXJpdHkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3NlY3VyaXR5LmMKQEAgLTMxLDExICszMSwxMSBAQAogCiBzdGF0aWMgdm9pZCBhcmNmb3VyX2luaXQoc3RydWN0IGFyYzRjb250ZXh0ICpwYXJjNGN0eCwgdTggKmtleSwgdTMyIGtleV9sZW4pCiB7Ci0JdTMyCXQsIHU7Ci0JdTMyCWtleWluZGV4OwotCXUzMglzdGF0ZWluZGV4OworCXUzMiB0LCB1OworCXUzMiBrZXlpbmRleDsKKwl1MzIgc3RhdGVpbmRleDsKIAl1OCAqc3RhdGU7Ci0JdTMyCWNvdW50ZXI7CisJdTMyIGNvdW50ZXI7CiAKIAlzdGF0ZSA9IHBhcmM0Y3R4LT5zdGF0ZTsKIAlwYXJjNGN0eC0+eCA9IDA7CkBAIC01NSw3ICs1NSw4IEBACiAJfQogCiB9Ci1zdGF0aWMgdTMyIGFyY2ZvdXJfYnl0ZSgJc3RydWN0IGFyYzRjb250ZXh0CSpwYXJjNGN0eCkKKworc3RhdGljIHUzMiBhcmNmb3VyX2J5dGUoc3RydWN0IGFyYzRjb250ZXh0ICpwYXJjNGN0eCkKIHsKIAl1MzIgeDsKIAl1MzIgeTsKQEAgLTc1LDE5ICs3NiwxNiBAQAogCXJldHVybiBzdGF0ZVsoc3ggKyBzeSkgJiAweGZmXTsKIH0KIAotc3RhdGljIHZvaWQgYXJjZm91cl9lbmNyeXB0KAlzdHJ1Y3QgYXJjNGNvbnRleHQJKnBhcmM0Y3R4LAotCXU4ICpkZXN0LAotCXU4ICpzcmMsCi0JdTMyIGxlbikKK3N0YXRpYyB2b2lkIGFyY2ZvdXJfZW5jcnlwdChzdHJ1Y3QgYXJjNGNvbnRleHQgKnBhcmM0Y3R4LCB1OCAqZGVzdCwKKwkJCSAgICB1OCAqc3JjLCB1MzIgbGVuKQogewotCXUzMglpOworCXUzMiBpOwogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQogCQlkZXN0W2ldID0gc3JjW2ldIF4gKHVuc2lnbmVkIGNoYXIpYXJjZm91cl9ieXRlKHBhcmM0Y3R4KTsKLQogfQogCi1zdGF0aWMgaW50IGJjcmMzMmluaXRpYWxpemVkID0gMDsKK3N0YXRpYyBpbnQgYmNyYzMyaW5pdGlhbGl6ZWQ7CiBzdGF0aWMgdTMyIGNyYzMyX3RhYmxlWzI1Nl07CiAKIHN0YXRpYyB1OCBjcmMzMl9yZXZlcnNlQml0KHU4IGRhdGEpCkBAIC0xMDEsNDYgKzk5LDQ4IEBACiAKIHN0YXRpYyB2b2lkIGNyYzMyX2luaXQodm9pZCkKIHsKKwlpbnQgaSwgajsKKwl1MzIgYzsKKwl1OCAqcCwgKnAxOworCXU4IGs7CiAKIAlpZiAoYmNyYzMyaW5pdGlhbGl6ZWQgPT0gMSkKIAkJcmV0dXJuOwotCWVsc2V7Ci0JCWludCBpLCBqOwotCQl1MzIgYzsKLQkJdTggKnAgPSAodTggKikmYywgKnAxOwotCQl1OCBrOwogCi0JCWMgPSAweDEyMzQwMDAwOworCXAgPSAodTggKikgJmM7CisJYyA9IDB4MTIzNDAwMDA7CiAKLQkJZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7Ci0JCQlrID0gY3JjMzJfcmV2ZXJzZUJpdCgodTgpaSk7Ci0JCQlmb3IgKGMgPSAoKHUzMilrKSA8PCAyNCwgaiA9IDg7IGogPiAwOyAtLWopIHsKLQkJCQljID0gYyAmIDB4ODAwMDAwMDAgPyAoYyA8PCAxKSBeIENSQzMyX1BPTFkgOiAoYyA8PCAxKTsKLQkJCX0KLQkJCXAxID0gKHU4ICopJmNyYzMyX3RhYmxlW2ldOworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworCQlrID0gY3JjMzJfcmV2ZXJzZUJpdCgodTgpaSk7CiAKLQkJCXAxWzBdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzNdKTsKLQkJCXAxWzFdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzJdKTsKLQkJCXAxWzJdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzFdKTsKLQkJCXAxWzNdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzBdKTsKLQkJfQotCQliY3JjMzJpbml0aWFsaXplZCA9IDE7CisJCWZvciAoYyA9ICgodTMyKWspIDw8IDI0LCBqID0gODsgaiA+IDA7IC0taikKKwkJCWMgPSBjICYgMHg4MDAwMDAwMCA/IChjIDw8IDEpIF4gQ1JDMzJfUE9MWSA6IChjIDw8IDEpOworCisJCXAxID0gKHU4ICopJmNyYzMyX3RhYmxlW2ldOworCisJCXAxWzBdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzNdKTsKKwkJcDFbMV0gPSBjcmMzMl9yZXZlcnNlQml0KHBbMl0pOworCQlwMVsyXSA9IGNyYzMyX3JldmVyc2VCaXQocFsxXSk7CisJCXAxWzNdID0gY3JjMzJfcmV2ZXJzZUJpdChwWzBdKTsKIAl9CisKKwliY3JjMzJpbml0aWFsaXplZCA9IDE7CiB9CiAKIHN0YXRpYyB1MzIgZ2V0Y3JjMzIodTggKmJ1ZiwgaW50IGxlbikKIHsKIAl1OCAqcDsKLQl1MzIgIGNyYzsKKwl1MzIgY3JjOwogCi0JaWYgKGJjcmMzMmluaXRpYWxpemVkID09IDApIGNyYzMyX2luaXQoKTsKKwlpZiAoYmNyYzMyaW5pdGlhbGl6ZWQgPT0gMCkKKwkJY3JjMzJfaW5pdCgpOwogCi0JY3JjID0gMHhmZmZmZmZmZjsgICAgICAgLyogcHJlbG9hZCBzaGlmdCByZWdpc3RlciwgcGVyIENSQy0zMiBzcGVjICovCisJY3JjID0gMHhmZmZmZmZmZjsgLyogcHJlbG9hZCBzaGlmdCByZWdpc3RlciwgcGVyIENSQy0zMiBzcGVjICovCiAKIAlmb3IgKHAgPSBidWY7IGxlbiA+IDA7ICsrcCwgLS1sZW4pCi0JCWNyYyA9IGNyYzMyX3RhYmxlWyAoY3JjIF4gKnApICYgMHhmZl0gXiAoY3JjID4+IDgpOworCQljcmMgPSBjcmMzMl90YWJsZVsoY3JjIF4gKnApICYgMHhmZl0gXiAoY3JjID4+IDgpOwogCi0JcmV0dXJuIH5jcmM7ICAgIC8qIHRyYW5zbWl0IGNvbXBsZW1lbnQsIHBlciBDUkMtMzIgc3BlYyAqLworCXJldHVybiB+Y3JjOyAvKiB0cmFuc21pdCBjb21wbGVtZW50LCBwZXIgQ1JDLTMyIHNwZWMgKi8KIH0KIAogLyogTmVlZCB0byBjb25zaWRlciB0aGUgZnJhZ21lbnQgIHNpdHVhdGlvbiAqLwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJc3RydWN0IGFyYzRjb250ZXh0IG15Y29udGV4dDsKIAlpbnQgY3VyZnJhZ251bSwgbGVuZ3RoLCBpbmRleDsKIAl1MzIga2V5bGVuZ3RoOwotCXU4ICpwZnJhbWUsICpwYXlsb2FkLCAqaXY7ICAgIC8qIHdlcGtleSAqLworCXU4ICpwZnJhbWUsICpwYXlsb2FkLCAqaXY7IC8qIHdlcGtleSAqLwogCXU4IHdlcGtleVsxNl07CiAJdTggaHdfaGRyX29mZnNldCA9IDA7CiAJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCWlmICgoY3VyZnJhZ251bSArIDEpID09IHBhdHRyaWItPm5yX2ZyYWdzKSB7CiAJCQkvKiB0aGUgbGFzdCBmcmFnbWVudCAqLwogCQkJbGVuZ3RoID0gcGF0dHJpYi0+bGFzdF90eGNtZHN6IC0gcGF0dHJpYi0+aGRybGVuIC0KLQkJCQlwYXR0cmliLT5pdl9sZW4tIHBhdHRyaWItPmljdl9sZW47CisJCQkJcGF0dHJpYi0+aXZfbGVuIC0gcGF0dHJpYi0+aWN2X2xlbjsKIAogCQkJKigodTMyICopY3JjKSA9IGNwdV90b19sZTMyKGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCkpOwogCkBAIC0yMTAsNyArMjEwLDcgQEAKIAkJICAgICBzdHJ1Y3QgcmVjdl9mcmFtZSAqcHJlY3ZmcmFtZSkKIHsKIAkvKiAgZXhjbHVkZSBJQ1YgKi8KLQl1OCBjcmNbNF07CisJdTMyIGFjdHVhbF9jcmMsIGV4cGVjdGVkX2NyYzsKIAlzdHJ1Y3QgYXJjNGNvbnRleHQgbXljb250ZXh0OwogCWludCBsZW5ndGg7CiAJdTMyIGtleWxlbmd0aDsKQEAgLTI0MywxOSArMjQzLDE0IEBACiAJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQsIHBheWxvYWQsIGxlbmd0aCk7CiAKIAkvKiBjYWxjdWxhdGUgaWN2IGFuZCBjb21wYXJlIHRoZSBpY3YgKi8KLQkqKCh1MzIgKiljcmMpID0gbGUzMl90b19jcHUoZ2V0Y3JjMzIocGF5bG9hZCwgbGVuZ3RoIC0gNCkpOworCWFjdHVhbF9jcmMgPSBsZTMyX3RvX2NwdShnZXRjcmMzMihwYXlsb2FkLCBsZW5ndGggLSA0KSk7CisJZXhwZWN0ZWRfY3JjID0gbGUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZF9sZTMyKCZwYXlsb2FkW2xlbmd0aCAtIDRdKSk7CiAKLQlpZiAoY3JjWzNdICE9IHBheWxvYWRbbGVuZ3RoIC0gMV0gfHwgY3JjWzJdICE9IHBheWxvYWRbbGVuZ3RoIC0gMl0gfHwKLQkgICAgY3JjWzFdICE9IHBheWxvYWRbbGVuZ3RoIC0gM10gfHwgY3JjWzBdICE9IHBheWxvYWRbbGVuZ3RoIC0gNF0pIHsKKwlpZiAoYWN0dWFsX2NyYyAhPSBleHBlY3RlZF9jcmMpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJydHdfd2VwX2RlY3J5cHQyM2E6aWN2IGVycm9yIGNyY1szXSgleCkhPSBwYXlsb2FkIgotCQkJICAiW2xlbmd0aC0xXSgleCkgfHwgY3JjWzJdKCV4KSE9IHBheWxvYWRbbGVuZ3RoLTJdKCV4KSIKLQkJCSAgIiB8fCBjcmNbMV0oJXgpIT0gcGF5bG9hZFtsZW5ndGgtM10oJXgpIHx8IGNyY1swXSgleCkiCi0JCQkgICIhPSBwYXlsb2FkW2xlbmd0aC00XSgleClcbiIsCi0JCQkgIGNyY1szXSwgcGF5bG9hZFtsZW5ndGggLSAxXSwKLQkJCSAgY3JjWzJdLCBwYXlsb2FkW2xlbmd0aCAtIDJdLAotCQkJICBjcmNbMV0sIHBheWxvYWRbbGVuZ3RoIC0gM10sCi0JCQkgIGNyY1swXSwgcGF5bG9hZFtsZW5ndGggLSA0XSkpOworCQkJICIlczppY3YgQ1JDIG1pc21hdGNoOiAiCisJCQkgImFjdHVhbDogJTA4eCwgZXhwZWN0ZWQ6ICUwOHhcbiIsCisJCQkgX19mdW5jX18sIGFjdHVhbF9jcmMsIGV4cGVjdGVkX2NyYyk7CiAJfQogfQogCkBAIC0yNjcsOSArMjYyLDggQEAKIAlzMzIgaTsKIAl1MzIgcmVzID0gMDsKIAotCWZvciAoaSA9IDA7IGk8NDsgaSsrKSB7Ci0JCXJlcyB8PSAoKHUzMikoKnArKykpIDw8ICg4KmkpOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQlyZXMgfD0gKCh1MzIpKCpwKyspKSA8PCAoOCAqIGkpOwogCiAJcmV0dXJuIHJlczsKIH0KQEAgLTI3OSw3ICsyNzMsNyBAQAogewogCWxvbmcgaTsKIAotCWZvciAoaSA9IDA7IGk8NDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQkqcCsrID0gKHU4KSAodmFsICYgMHhmZik7CiAJCXZhbCA+Pj0gODsKIAl9CkBAIC0zMTIsNyArMzA2LDcgQEAKIHsKIAogCS8qICBBcHBlbmQgdGhlIGJ5dGUgdG8gb3VyIHdvcmQtc2l6ZWQgYnVmZmVyICovCi0JcG1pY2RhdGEtPk0gfD0gKCh1bnNpZ25lZCBsb25nKWIpIDw8ICg4KnBtaWNkYXRhLT5uQnl0ZXNJbk0pOworCXBtaWNkYXRhLT5NIHw9ICgodW5zaWduZWQgbG9uZyliKSA8PCAoOCAqIHBtaWNkYXRhLT5uQnl0ZXNJbk0pOwogCXBtaWNkYXRhLT5uQnl0ZXNJbk0rKzsKIAkvKiAgUHJvY2VzcyB0aGUgd29yZCBpZiBpdCBpcyBmdWxsLiAqLwogCWlmIChwbWljZGF0YS0+bkJ5dGVzSW5NID49IDQpIHsKQEAgLTMzNiw3ICszMzAsNyBAQAogewogCiAJLyogIFRoaXMgaXMgc2ltcGxlICovCi0Jd2hpbGUobmJ5dGVzID4gMCkgeworCXdoaWxlIChuYnl0ZXMgPiAwKSB7CiAJCXJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHBtaWNkYXRhLCAqc3JjKyspOwogCQluYnl0ZXMtLTsKIAl9CkBAIC0zNTMsMTIgKzM0NywxMSBAQAogCXJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHBtaWNkYXRhLCAwKTsKIAlydHdfc2VjbWljYXBwZW5kMjNhYnl0ZTIzYShwbWljZGF0YSwgMCk7CiAJLyogIGFuZCB0aGVuIHplcm9lcyB1bnRpbCB0aGUgbGVuZ3RoIGlzIGEgbXVsdGlwbGUgb2YgNCAqLwotCXdoaWxlKHBtaWNkYXRhLT5uQnl0ZXNJbk0gIT0gMCkgeworCXdoaWxlIChwbWljZGF0YS0+bkJ5dGVzSW5NICE9IDApCiAJCXJ0d19zZWNtaWNhcHBlbmQyM2FieXRlMjNhKHBtaWNkYXRhLCAwKTsKLQl9CiAJLyogIFRoZSBhcHBlbmRCeXRlIGZ1bmN0aW9uIGhhcyBhbHJlYWR5IGNvbXB1dGVkIHRoZSByZXN1bHQuICovCiAJc2VjbWljcHV0dWludDMyKGRzdCwgcG1pY2RhdGEtPkwpOwotCXNlY21pY3B1dHVpbnQzMihkc3QrNCwgcG1pY2RhdGEtPlIpOworCXNlY21pY3B1dHVpbnQzMihkc3QgKyA0LCBwbWljZGF0YS0+Uik7CiAJLyogIFJlc2V0IHRvIHRoZSBlbXB0eSBtZXNzYWdlLiAqLwogCXNlY21pY2NsZWFyKHBtaWNkYXRhKTsKIApAQCAtMzY4LDIzICszNjEsMjIgQEAKIAkJCSAgIHU4ICptaWNfY29kZSwgdTggcHJpKQogewogCi0Jc3RydWN0IG1pY19kYXRhCW1pY2RhdGE7Ci0JdTggcHJpb3JpdHlbNF09ezB4MCwgMHgwLCAweDAsIDB4MH07CisJc3RydWN0IG1pY19kYXRhIG1pY2RhdGE7CisJdTggcHJpb3JpdHlbNF0gPSB7MHgwLCAweDAsIDB4MCwgMHgwfTsKIAogCXJ0d19zZWNtaWNzZXRrZXkyM2EoJm1pY2RhdGEsIGtleSk7Ci0JcHJpb3JpdHlbMF09IHByaTsKKwlwcmlvcml0eVswXSA9IHByaTsKIAogCS8qIE1pY2hhZWwgTUlDIHBzZXVkbyBoZWFkZXI6IERBLCBTQSwgMyB4IDAsIFByaW9yaXR5ICovCi0JaWYgKGhlYWRlclsxXSYxKSB7ICAgLyogVG9EUyA9PSAxICovCi0JCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzE2XSwgNik7ICAvKiBEQSAqLwotCQlpZiAoaGVhZGVyWzFdJjIpICAvKiBGcm9tIERzID09IDEgKi8KKwlpZiAoaGVhZGVyWzFdJjEpIHsgLyogVG9EUyA9PSAxICovCisJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzE2XSwgNik7IC8qIERBICovCisJCWlmIChoZWFkZXJbMV0mMikgLyogRnJvbSBEcyA9PSAxICovCiAJCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzI0XSwgNik7CiAJCWVsc2UKIAkJCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsICZoZWFkZXJbMTBdLCA2KTsKLQl9Ci0JZWxzZXsJLyogVG9EUyA9PSAwICovCi0JCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsICZoZWFkZXJbNF0sIDYpOyAgIC8qIERBICovCi0JCWlmIChoZWFkZXJbMV0mMikgIC8qIEZyb20gRHMgPT0gMSAqLworCX0gZWxzZSB7IC8qIFRvRFMgPT0gMCAqLworCQlydHdfc2VjbWljYXBwZW5kMjNhKCZtaWNkYXRhLCAmaGVhZGVyWzRdLCA2KTsgLyogREEgKi8KKwkJaWYgKGhlYWRlclsxXSYyKSAvKiBGcm9tIERzID09IDEgKi8KIAkJCXJ0d19zZWNtaWNhcHBlbmQyM2EoJm1pY2RhdGEsICZoZWFkZXJbMTZdLCA2KTsKIAkJZWxzZQogCQkJcnR3X3NlY21pY2FwcGVuZDIzYSgmbWljZGF0YSwgJmhlYWRlclsxMF0sIDYpOwpAQCAtNDAzLDExICszOTUsMTEgQEAKICNkZWZpbmUgICBMbzgodjE2KSAgICgodTgpKCh2MTYpICAgICAgICYgMHgwMEZGKSkKICNkZWZpbmUgICBIaTgodjE2KSAgICgodTgpKCgodjE2KSA+PiA4KSAmIDB4MDBGRikpCiAjZGVmaW5lICBMbzE2KHYzMikgICAoKHUxNikoKHYzMikgICAgICAgJiAweEZGRkYpKQotI2RlZmluZSAgSGkxNih2MzIpICAgKCh1MTYpKCgodjMyKSA+PjE2KSAmIDB4RkZGRikpCisjZGVmaW5lICBIaTE2KHYzMikgICAoKHUxNikoKCh2MzIpID4+IDE2KSAmIDB4RkZGRikpCiAjZGVmaW5lICBNazE2KGhpLCBsbykgKChsbykgXiAoKCh1MTYpKGhpKSkgPDwgOCkpCiAKLS8qIHNlbGVjdCB0aGUgTnRoIDE2LWJpdCB3b3JkIG9mIHRoZSB0ZW1wb3JhbCBrZXkgdW5zaWduZWQgY2hhciBhcnJheSBUS1tdICAgKi8KLSNkZWZpbmUgIFRLMTYoTikgICAgIE1rMTYodGtbMiooTikrMV0sIHRrWzIqKE4pXSkKKy8qIHNlbGVjdCB0aGUgTnRoIDE2LWJpdCB3b3JkIG9mIHRoZSB0ZW1wb3JhbCBrZXkgdW5zaWduZWQgY2hhciBhcnJheSBUS1tdICovCisjZGVmaW5lICBUSzE2KE4pICAgICBNazE2KHRrWzIgKiAoTikgKyAxXSwgdGtbMiAqIChOKV0pCiAKIC8qIFMtYm94IGxvb2t1cDogMTYgYml0cyAtLT4gMTYgYml0cyAqLwogI2RlZmluZSBfU18odjE2KSAgICAgKFNib3gxWzBdW0xvOCh2MTYpXSBeIFNib3gxWzFdW0hpOCh2MTYpXSkKQEAgLTQyMCw3NiArNDEyLDc2IEBACiAjZGVmaW5lIFJDNF9LRVlfU0laRSAgICAgMTYgICAgLyogMTI4LWJpdCBSQzRLRVkgKDEwNCBiaXRzIHVua25vd24pICovCiAKIC8qIDItdW5zaWduZWQgY2hhciBieSAyLXVuc2lnbmVkIGNoYXIgc3Vic2V0IG9mIHRoZSBmdWxsIEFFUyBTLWJveCB0YWJsZSAqLwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNib3gxWzJdWzI1Nl09ICAgICAgIC8qIFNib3ggZm9yIGhhc2ggKGNhbiBiZSBpbiBST00pICAgICAqLwoteyB7Ci0gICAweEM2QTUsIDB4Rjg4NCwgMHhFRTk5LCAweEY2OEQsIDB4RkYwRCwgMHhENkJELCAweERFQjEsIDB4OTE1NCwKLSAgIDB4NjA1MCwgMHgwMjAzLCAweENFQTksIDB4NTY3RCwgMHhFNzE5LCAweEI1NjIsIDB4NERFNiwgMHhFQzlBLAotICAgMHg4RjQ1LCAweDFGOUQsIDB4ODk0MCwgMHhGQTg3LCAweEVGMTUsIDB4QjJFQiwgMHg4RUM5LCAweEZCMEIsCi0gICAweDQxRUMsIDB4QjM2NywgMHg1RkZELCAweDQ1RUEsIDB4MjNCRiwgMHg1M0Y3LCAweEU0OTYsIDB4OUI1QiwKLSAgIDB4NzVDMiwgMHhFMTFDLCAweDNEQUUsIDB4NEM2QSwgMHg2QzVBLCAweDdFNDEsIDB4RjUwMiwgMHg4MzRGLAotICAgMHg2ODVDLCAweDUxRjQsIDB4RDEzNCwgMHhGOTA4LCAweEUyOTMsIDB4QUI3MywgMHg2MjUzLCAweDJBM0YsCi0gICAweDA4MEMsIDB4OTU1MiwgMHg0NjY1LCAweDlENUUsIDB4MzAyOCwgMHgzN0ExLCAweDBBMEYsIDB4MkZCNSwKLSAgIDB4MEUwOSwgMHgyNDM2LCAweDFCOUIsIDB4REYzRCwgMHhDRDI2LCAweDRFNjksIDB4N0ZDRCwgMHhFQTlGLAotICAgMHgxMjFCLCAweDFEOUUsIDB4NTg3NCwgMHgzNDJFLCAweDM2MkQsIDB4RENCMiwgMHhCNEVFLCAweDVCRkIsCi0gICAweEE0RjYsIDB4NzY0RCwgMHhCNzYxLCAweDdEQ0UsIDB4NTI3QiwgMHhERDNFLCAweDVFNzEsIDB4MTM5NywKLSAgIDB4QTZGNSwgMHhCOTY4LCAweDAwMDAsIDB4QzEyQywgMHg0MDYwLCAweEUzMUYsIDB4NzlDOCwgMHhCNkVELAotICAgMHhENEJFLCAweDhENDYsIDB4NjdEOSwgMHg3MjRCLCAweDk0REUsIDB4OThENCwgMHhCMEU4LCAweDg1NEEsCi0gICAweEJCNkIsIDB4QzUyQSwgMHg0RkU1LCAweEVEMTYsIDB4ODZDNSwgMHg5QUQ3LCAweDY2NTUsIDB4MTE5NCwKLSAgIDB4OEFDRiwgMHhFOTEwLCAweDA0MDYsIDB4RkU4MSwgMHhBMEYwLCAweDc4NDQsIDB4MjVCQSwgMHg0QkUzLAotICAgMHhBMkYzLCAweDVERkUsIDB4ODBDMCwgMHgwNThBLCAweDNGQUQsIDB4MjFCQywgMHg3MDQ4LCAweEYxMDQsCi0gICAweDYzREYsIDB4NzdDMSwgMHhBRjc1LCAweDQyNjMsIDB4MjAzMCwgMHhFNTFBLCAweEZEMEUsIDB4QkY2RCwKLSAgIDB4ODE0QywgMHgxODE0LCAweDI2MzUsIDB4QzMyRiwgMHhCRUUxLCAweDM1QTIsIDB4ODhDQywgMHgyRTM5LAotICAgMHg5MzU3LCAweDU1RjIsIDB4RkM4MiwgMHg3QTQ3LCAweEM4QUMsIDB4QkFFNywgMHgzMjJCLCAweEU2OTUsCi0gICAweEMwQTAsIDB4MTk5OCwgMHg5RUQxLCAweEEzN0YsIDB4NDQ2NiwgMHg1NDdFLCAweDNCQUIsIDB4MEI4MywKLSAgIDB4OENDQSwgMHhDNzI5LCAweDZCRDMsIDB4MjgzQywgMHhBNzc5LCAweEJDRTIsIDB4MTYxRCwgMHhBRDc2LAotICAgMHhEQjNCLCAweDY0NTYsIDB4NzQ0RSwgMHgxNDFFLCAweDkyREIsIDB4MEMwQSwgMHg0ODZDLCAweEI4RTQsCi0gICAweDlGNUQsIDB4QkQ2RSwgMHg0M0VGLCAweEM0QTYsIDB4MzlBOCwgMHgzMUE0LCAweEQzMzcsIDB4RjI4QiwKLSAgIDB4RDUzMiwgMHg4QjQzLCAweDZFNTksIDB4REFCNywgMHgwMThDLCAweEIxNjQsIDB4OUNEMiwgMHg0OUUwLAotICAgMHhEOEI0LCAweEFDRkEsIDB4RjMwNywgMHhDRjI1LCAweENBQUYsIDB4RjQ4RSwgMHg0N0U5LCAweDEwMTgsCi0gICAweDZGRDUsIDB4RjA4OCwgMHg0QTZGLCAweDVDNzIsIDB4MzgyNCwgMHg1N0YxLCAweDczQzcsIDB4OTc1MSwKLSAgIDB4Q0IyMywgMHhBMTdDLCAweEU4OUMsIDB4M0UyMSwgMHg5NkRELCAweDYxREMsIDB4MEQ4NiwgMHgwRjg1LAotICAgMHhFMDkwLCAweDdDNDIsIDB4NzFDNCwgMHhDQ0FBLCAweDkwRDgsIDB4MDYwNSwgMHhGNzAxLCAweDFDMTIsCi0gICAweEMyQTMsIDB4NkE1RiwgMHhBRUY5LCAweDY5RDAsIDB4MTc5MSwgMHg5OTU4LCAweDNBMjcsIDB4MjdCOSwKLSAgIDB4RDkzOCwgMHhFQjEzLCAweDJCQjMsIDB4MjIzMywgMHhEMkJCLCAweEE5NzAsIDB4MDc4OSwgMHgzM0E3LAotICAgMHgyREI2LCAweDNDMjIsIDB4MTU5MiwgMHhDOTIwLCAweDg3NDksIDB4QUFGRiwgMHg1MDc4LCAweEE1N0EsCi0gICAweDAzOEYsIDB4NTlGOCwgMHgwOTgwLCAweDFBMTcsIDB4NjVEQSwgMHhENzMxLCAweDg0QzYsIDB4RDBCOCwKLSAgIDB4ODJDMywgMHgyOUIwLCAweDVBNzcsIDB4MUUxMSwgMHg3QkNCLCAweEE4RkMsIDB4NkRENiwgMHgyQzNBLAotICB9LAotCi0gIHsgIC8qIHNlY29uZCBoYWxmIG9mIHRhYmxlIGlzIHVuc2lnbmVkIGNoYXItcmV2ZXJzZWQgdmVyc2lvbiBvZiBmaXJzdCEgKi8KLSAgIDB4QTVDNiwgMHg4NEY4LCAweDk5RUUsIDB4OERGNiwgMHgwREZGLCAweEJERDYsIDB4QjFERSwgMHg1NDkxLAotICAgMHg1MDYwLCAweDAzMDIsIDB4QTlDRSwgMHg3RDU2LCAweDE5RTcsIDB4NjJCNSwgMHhFNjRELCAweDlBRUMsCi0gICAweDQ1OEYsIDB4OUQxRiwgMHg0MDg5LCAweDg3RkEsIDB4MTVFRiwgMHhFQkIyLCAweEM5OEUsIDB4MEJGQiwKLSAgIDB4RUM0MSwgMHg2N0IzLCAweEZENUYsIDB4RUE0NSwgMHhCRjIzLCAweEY3NTMsIDB4OTZFNCwgMHg1QjlCLAotICAgMHhDMjc1LCAweDFDRTEsIDB4QUUzRCwgMHg2QTRDLCAweDVBNkMsIDB4NDE3RSwgMHgwMkY1LCAweDRGODMsCi0gICAweDVDNjgsIDB4RjQ1MSwgMHgzNEQxLCAweDA4RjksIDB4OTNFMiwgMHg3M0FCLCAweDUzNjIsIDB4M0YyQSwKLSAgIDB4MEMwOCwgMHg1Mjk1LCAweDY1NDYsIDB4NUU5RCwgMHgyODMwLCAweEExMzcsIDB4MEYwQSwgMHhCNTJGLAotICAgMHgwOTBFLCAweDM2MjQsIDB4OUIxQiwgMHgzRERGLCAweDI2Q0QsIDB4Njk0RSwgMHhDRDdGLCAweDlGRUEsCi0gICAweDFCMTIsIDB4OUUxRCwgMHg3NDU4LCAweDJFMzQsIDB4MkQzNiwgMHhCMkRDLCAweEVFQjQsIDB4RkI1QiwKLSAgIDB4RjZBNCwgMHg0RDc2LCAweDYxQjcsIDB4Q0U3RCwgMHg3QjUyLCAweDNFREQsIDB4NzE1RSwgMHg5NzEzLAotICAgMHhGNUE2LCAweDY4QjksIDB4MDAwMCwgMHgyQ0MxLCAweDYwNDAsIDB4MUZFMywgMHhDODc5LCAweEVEQjYsCi0gICAweEJFRDQsIDB4NDY4RCwgMHhEOTY3LCAweDRCNzIsIDB4REU5NCwgMHhENDk4LCAweEU4QjAsIDB4NEE4NSwKLSAgIDB4NkJCQiwgMHgyQUM1LCAweEU1NEYsIDB4MTZFRCwgMHhDNTg2LCAweEQ3OUEsIDB4NTU2NiwgMHg5NDExLAotICAgMHhDRjhBLCAweDEwRTksIDB4MDYwNCwgMHg4MUZFLCAweEYwQTAsIDB4NDQ3OCwgMHhCQTI1LCAweEUzNEIsCi0gICAweEYzQTIsIDB4RkU1RCwgMHhDMDgwLCAweDhBMDUsIDB4QUQzRiwgMHhCQzIxLCAweDQ4NzAsIDB4MDRGMSwKLSAgIDB4REY2MywgMHhDMTc3LCAweDc1QUYsIDB4NjM0MiwgMHgzMDIwLCAweDFBRTUsIDB4MEVGRCwgMHg2REJGLAotICAgMHg0QzgxLCAweDE0MTgsIDB4MzUyNiwgMHgyRkMzLCAweEUxQkUsIDB4QTIzNSwgMHhDQzg4LCAweDM5MkUsCi0gICAweDU3OTMsIDB4RjI1NSwgMHg4MkZDLCAweDQ3N0EsIDB4QUNDOCwgMHhFN0JBLCAweDJCMzIsIDB4OTVFNiwKLSAgIDB4QTBDMCwgMHg5ODE5LCAweEQxOUUsIDB4N0ZBMywgMHg2NjQ0LCAweDdFNTQsIDB4QUIzQiwgMHg4MzBCLAotICAgMHhDQThDLCAweDI5QzcsIDB4RDM2QiwgMHgzQzI4LCAweDc5QTcsIDB4RTJCQywgMHgxRDE2LCAweDc2QUQsCi0gICAweDNCREIsIDB4NTY2NCwgMHg0RTc0LCAweDFFMTQsIDB4REI5MiwgMHgwQTBDLCAweDZDNDgsIDB4RTRCOCwKLSAgIDB4NUQ5RiwgMHg2RUJELCAweEVGNDMsIDB4QTZDNCwgMHhBODM5LCAweEE0MzEsIDB4MzdEMywgMHg4QkYyLAotICAgMHgzMkQ1LCAweDQzOEIsIDB4NTk2RSwgMHhCN0RBLCAweDhDMDEsIDB4NjRCMSwgMHhEMjlDLCAweEUwNDksCi0gICAweEI0RDgsIDB4RkFBQywgMHgwN0YzLCAweDI1Q0YsIDB4QUZDQSwgMHg4RUY0LCAweEU5NDcsIDB4MTgxMCwKLSAgIDB4RDU2RiwgMHg4OEYwLCAweDZGNEEsIDB4NzI1QywgMHgyNDM4LCAweEYxNTcsIDB4Qzc3MywgMHg1MTk3LAotICAgMHgyM0NCLCAweDdDQTEsIDB4OUNFOCwgMHgyMTNFLCAweEREOTYsIDB4REM2MSwgMHg4NjBELCAweDg1MEYsCi0gICAweDkwRTAsIDB4NDI3QywgMHhDNDcxLCAweEFBQ0MsIDB4RDg5MCwgMHgwNTA2LCAweDAxRjcsIDB4MTIxQywKLSAgIDB4QTNDMiwgMHg1RjZBLCAweEY5QUUsIDB4RDA2OSwgMHg5MTE3LCAweDU4OTksIDB4MjczQSwgMHhCOTI3LAotICAgMHgzOEQ5LCAweDEzRUIsIDB4QjMyQiwgMHgzMzIyLCAweEJCRDIsIDB4NzBBOSwgMHg4OTA3LCAweEE3MzMsCi0gICAweEI2MkQsIDB4MjIzQywgMHg5MjE1LCAweDIwQzksIDB4NDk4NywgMHhGRkFBLCAweDc4NTAsIDB4N0FBNSwKLSAgIDB4OEYwMywgMHhGODU5LCAweDgwMDksIDB4MTcxQSwgMHhEQTY1LCAweDMxRDcsIDB4QzY4NCwgMHhCOEQwLAotICAgMHhDMzgyLCAweEIwMjksIDB4Nzc1QSwgMHgxMTFFLCAweENCN0IsIDB4RkNBOCwgMHhENjZELCAweDNBMkMsCi0gIH0KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBTYm94MVsyXVsyNTZdID0geworCS8qIFNib3ggZm9yIGhhc2ggKGNhbiBiZSBpbiBST00pICovCisJeworCQkweEM2QTUsIDB4Rjg4NCwgMHhFRTk5LCAweEY2OEQsIDB4RkYwRCwgMHhENkJELCAweERFQjEsIDB4OTE1NCwKKwkJMHg2MDUwLCAweDAyMDMsIDB4Q0VBOSwgMHg1NjdELCAweEU3MTksIDB4QjU2MiwgMHg0REU2LCAweEVDOUEsCisJCTB4OEY0NSwgMHgxRjlELCAweDg5NDAsIDB4RkE4NywgMHhFRjE1LCAweEIyRUIsIDB4OEVDOSwgMHhGQjBCLAorCQkweDQxRUMsIDB4QjM2NywgMHg1RkZELCAweDQ1RUEsIDB4MjNCRiwgMHg1M0Y3LCAweEU0OTYsIDB4OUI1QiwKKwkJMHg3NUMyLCAweEUxMUMsIDB4M0RBRSwgMHg0QzZBLCAweDZDNUEsIDB4N0U0MSwgMHhGNTAyLCAweDgzNEYsCisJCTB4Njg1QywgMHg1MUY0LCAweEQxMzQsIDB4RjkwOCwgMHhFMjkzLCAweEFCNzMsIDB4NjI1MywgMHgyQTNGLAorCQkweDA4MEMsIDB4OTU1MiwgMHg0NjY1LCAweDlENUUsIDB4MzAyOCwgMHgzN0ExLCAweDBBMEYsIDB4MkZCNSwKKwkJMHgwRTA5LCAweDI0MzYsIDB4MUI5QiwgMHhERjNELCAweENEMjYsIDB4NEU2OSwgMHg3RkNELCAweEVBOUYsCisJCTB4MTIxQiwgMHgxRDlFLCAweDU4NzQsIDB4MzQyRSwgMHgzNjJELCAweERDQjIsIDB4QjRFRSwgMHg1QkZCLAorCQkweEE0RjYsIDB4NzY0RCwgMHhCNzYxLCAweDdEQ0UsIDB4NTI3QiwgMHhERDNFLCAweDVFNzEsIDB4MTM5NywKKwkJMHhBNkY1LCAweEI5NjgsIDB4MDAwMCwgMHhDMTJDLCAweDQwNjAsIDB4RTMxRiwgMHg3OUM4LCAweEI2RUQsCisJCTB4RDRCRSwgMHg4RDQ2LCAweDY3RDksIDB4NzI0QiwgMHg5NERFLCAweDk4RDQsIDB4QjBFOCwgMHg4NTRBLAorCQkweEJCNkIsIDB4QzUyQSwgMHg0RkU1LCAweEVEMTYsIDB4ODZDNSwgMHg5QUQ3LCAweDY2NTUsIDB4MTE5NCwKKwkJMHg4QUNGLCAweEU5MTAsIDB4MDQwNiwgMHhGRTgxLCAweEEwRjAsIDB4Nzg0NCwgMHgyNUJBLCAweDRCRTMsCisJCTB4QTJGMywgMHg1REZFLCAweDgwQzAsIDB4MDU4QSwgMHgzRkFELCAweDIxQkMsIDB4NzA0OCwgMHhGMTA0LAorCQkweDYzREYsIDB4NzdDMSwgMHhBRjc1LCAweDQyNjMsIDB4MjAzMCwgMHhFNTFBLCAweEZEMEUsIDB4QkY2RCwKKwkJMHg4MTRDLCAweDE4MTQsIDB4MjYzNSwgMHhDMzJGLCAweEJFRTEsIDB4MzVBMiwgMHg4OENDLCAweDJFMzksCisJCTB4OTM1NywgMHg1NUYyLCAweEZDODIsIDB4N0E0NywgMHhDOEFDLCAweEJBRTcsIDB4MzIyQiwgMHhFNjk1LAorCQkweEMwQTAsIDB4MTk5OCwgMHg5RUQxLCAweEEzN0YsIDB4NDQ2NiwgMHg1NDdFLCAweDNCQUIsIDB4MEI4MywKKwkJMHg4Q0NBLCAweEM3MjksIDB4NkJEMywgMHgyODNDLCAweEE3NzksIDB4QkNFMiwgMHgxNjFELCAweEFENzYsCisJCTB4REIzQiwgMHg2NDU2LCAweDc0NEUsIDB4MTQxRSwgMHg5MkRCLCAweDBDMEEsIDB4NDg2QywgMHhCOEU0LAorCQkweDlGNUQsIDB4QkQ2RSwgMHg0M0VGLCAweEM0QTYsIDB4MzlBOCwgMHgzMUE0LCAweEQzMzcsIDB4RjI4QiwKKwkJMHhENTMyLCAweDhCNDMsIDB4NkU1OSwgMHhEQUI3LCAweDAxOEMsIDB4QjE2NCwgMHg5Q0QyLCAweDQ5RTAsCisJCTB4RDhCNCwgMHhBQ0ZBLCAweEYzMDcsIDB4Q0YyNSwgMHhDQUFGLCAweEY0OEUsIDB4NDdFOSwgMHgxMDE4LAorCQkweDZGRDUsIDB4RjA4OCwgMHg0QTZGLCAweDVDNzIsIDB4MzgyNCwgMHg1N0YxLCAweDczQzcsIDB4OTc1MSwKKwkJMHhDQjIzLCAweEExN0MsIDB4RTg5QywgMHgzRTIxLCAweDk2REQsIDB4NjFEQywgMHgwRDg2LCAweDBGODUsCisJCTB4RTA5MCwgMHg3QzQyLCAweDcxQzQsIDB4Q0NBQSwgMHg5MEQ4LCAweDA2MDUsIDB4RjcwMSwgMHgxQzEyLAorCQkweEMyQTMsIDB4NkE1RiwgMHhBRUY5LCAweDY5RDAsIDB4MTc5MSwgMHg5OTU4LCAweDNBMjcsIDB4MjdCOSwKKwkJMHhEOTM4LCAweEVCMTMsIDB4MkJCMywgMHgyMjMzLCAweEQyQkIsIDB4QTk3MCwgMHgwNzg5LCAweDMzQTcsCisJCTB4MkRCNiwgMHgzQzIyLCAweDE1OTIsIDB4QzkyMCwgMHg4NzQ5LCAweEFBRkYsIDB4NTA3OCwgMHhBNTdBLAorCQkweDAzOEYsIDB4NTlGOCwgMHgwOTgwLCAweDFBMTcsIDB4NjVEQSwgMHhENzMxLCAweDg0QzYsIDB4RDBCOCwKKwkJMHg4MkMzLCAweDI5QjAsIDB4NUE3NywgMHgxRTExLCAweDdCQ0IsIDB4QThGQywgMHg2REQ2LCAweDJDM0EsCisJfSwKKwl7IC8qIHNlY29uZCBoYWxmIG9mIHRhYmxlIGlzIHVuc2lnbmVkIGNoYXItcmV2ZXJzZWQgdmVyc2lvbiBvZiBmaXJzdCEgKi8KKwkJMHhBNUM2LCAweDg0RjgsIDB4OTlFRSwgMHg4REY2LCAweDBERkYsIDB4QkRENiwgMHhCMURFLCAweDU0OTEsCisJCTB4NTA2MCwgMHgwMzAyLCAweEE5Q0UsIDB4N0Q1NiwgMHgxOUU3LCAweDYyQjUsIDB4RTY0RCwgMHg5QUVDLAorCQkweDQ1OEYsIDB4OUQxRiwgMHg0MDg5LCAweDg3RkEsIDB4MTVFRiwgMHhFQkIyLCAweEM5OEUsIDB4MEJGQiwKKwkJMHhFQzQxLCAweDY3QjMsIDB4RkQ1RiwgMHhFQTQ1LCAweEJGMjMsIDB4Rjc1MywgMHg5NkU0LCAweDVCOUIsCisJCTB4QzI3NSwgMHgxQ0UxLCAweEFFM0QsIDB4NkE0QywgMHg1QTZDLCAweDQxN0UsIDB4MDJGNSwgMHg0RjgzLAorCQkweDVDNjgsIDB4RjQ1MSwgMHgzNEQxLCAweDA4RjksIDB4OTNFMiwgMHg3M0FCLCAweDUzNjIsIDB4M0YyQSwKKwkJMHgwQzA4LCAweDUyOTUsIDB4NjU0NiwgMHg1RTlELCAweDI4MzAsIDB4QTEzNywgMHgwRjBBLCAweEI1MkYsCisJCTB4MDkwRSwgMHgzNjI0LCAweDlCMUIsIDB4M0RERiwgMHgyNkNELCAweDY5NEUsIDB4Q0Q3RiwgMHg5RkVBLAorCQkweDFCMTIsIDB4OUUxRCwgMHg3NDU4LCAweDJFMzQsIDB4MkQzNiwgMHhCMkRDLCAweEVFQjQsIDB4RkI1QiwKKwkJMHhGNkE0LCAweDRENzYsIDB4NjFCNywgMHhDRTdELCAweDdCNTIsIDB4M0VERCwgMHg3MTVFLCAweDk3MTMsCisJCTB4RjVBNiwgMHg2OEI5LCAweDAwMDAsIDB4MkNDMSwgMHg2MDQwLCAweDFGRTMsIDB4Qzg3OSwgMHhFREI2LAorCQkweEJFRDQsIDB4NDY4RCwgMHhEOTY3LCAweDRCNzIsIDB4REU5NCwgMHhENDk4LCAweEU4QjAsIDB4NEE4NSwKKwkJMHg2QkJCLCAweDJBQzUsIDB4RTU0RiwgMHgxNkVELCAweEM1ODYsIDB4RDc5QSwgMHg1NTY2LCAweDk0MTEsCisJCTB4Q0Y4QSwgMHgxMEU5LCAweDA2MDQsIDB4ODFGRSwgMHhGMEEwLCAweDQ0NzgsIDB4QkEyNSwgMHhFMzRCLAorCQkweEYzQTIsIDB4RkU1RCwgMHhDMDgwLCAweDhBMDUsIDB4QUQzRiwgMHhCQzIxLCAweDQ4NzAsIDB4MDRGMSwKKwkJMHhERjYzLCAweEMxNzcsIDB4NzVBRiwgMHg2MzQyLCAweDMwMjAsIDB4MUFFNSwgMHgwRUZELCAweDZEQkYsCisJCTB4NEM4MSwgMHgxNDE4LCAweDM1MjYsIDB4MkZDMywgMHhFMUJFLCAweEEyMzUsIDB4Q0M4OCwgMHgzOTJFLAorCQkweDU3OTMsIDB4RjI1NSwgMHg4MkZDLCAweDQ3N0EsIDB4QUNDOCwgMHhFN0JBLCAweDJCMzIsIDB4OTVFNiwKKwkJMHhBMEMwLCAweDk4MTksIDB4RDE5RSwgMHg3RkEzLCAweDY2NDQsIDB4N0U1NCwgMHhBQjNCLCAweDgzMEIsCisJCTB4Q0E4QywgMHgyOUM3LCAweEQzNkIsIDB4M0MyOCwgMHg3OUE3LCAweEUyQkMsIDB4MUQxNiwgMHg3NkFELAorCQkweDNCREIsIDB4NTY2NCwgMHg0RTc0LCAweDFFMTQsIDB4REI5MiwgMHgwQTBDLCAweDZDNDgsIDB4RTRCOCwKKwkJMHg1RDlGLCAweDZFQkQsIDB4RUY0MywgMHhBNkM0LCAweEE4MzksIDB4QTQzMSwgMHgzN0QzLCAweDhCRjIsCisJCTB4MzJENSwgMHg0MzhCLCAweDU5NkUsIDB4QjdEQSwgMHg4QzAxLCAweDY0QjEsIDB4RDI5QywgMHhFMDQ5LAorCQkweEI0RDgsIDB4RkFBQywgMHgwN0YzLCAweDI1Q0YsIDB4QUZDQSwgMHg4RUY0LCAweEU5NDcsIDB4MTgxMCwKKwkJMHhENTZGLCAweDg4RjAsIDB4NkY0QSwgMHg3MjVDLCAweDI0MzgsIDB4RjE1NywgMHhDNzczLCAweDUxOTcsCisJCTB4MjNDQiwgMHg3Q0ExLCAweDlDRTgsIDB4MjEzRSwgMHhERDk2LCAweERDNjEsIDB4ODYwRCwgMHg4NTBGLAorCQkweDkwRTAsIDB4NDI3QywgMHhDNDcxLCAweEFBQ0MsIDB4RDg5MCwgMHgwNTA2LCAweDAxRjcsIDB4MTIxQywKKwkJMHhBM0MyLCAweDVGNkEsIDB4RjlBRSwgMHhEMDY5LCAweDkxMTcsIDB4NTg5OSwgMHgyNzNBLCAweEI5MjcsCisJCTB4MzhEOSwgMHgxM0VCLCAweEIzMkIsIDB4MzMyMiwgMHhCQkQyLCAweDcwQTksIDB4ODkwNywgMHhBNzMzLAorCQkweEI2MkQsIDB4MjIzQywgMHg5MjE1LCAweDIwQzksIDB4NDk4NywgMHhGRkFBLCAweDc4NTAsIDB4N0FBNSwKKwkJMHg4RjAzLCAweEY4NTksIDB4ODAwOSwgMHgxNzFBLCAweERBNjUsIDB4MzFENywgMHhDNjg0LCAweEI4RDAsCisJCTB4QzM4MiwgMHhCMDI5LCAweDc3NUEsIDB4MTExRSwgMHhDQjdCLCAweEZDQTgsIDB4RDY2RCwgMHgzQTJDLAorCX0KIH07CiAKICAvKgpAQCAtNTEzLDcgKzUwNSw3IEBACiB7CiAJaW50ICBpOwogCi0JLyogSW5pdGlhbGl6ZSB0aGUgODAgYml0cyBvZiBQMUtbXSBmcm9tIElWMzIgYW5kIFRBWzAuLjVdICAgICAqLworCS8qIEluaXRpYWxpemUgdGhlIDgwIGJpdHMgb2YgUDFLW10gZnJvbSBJVjMyIGFuZCBUQVswLi41XSAqLwogCXAxa1swXSAgICAgID0gTG8xNihpdjMyKTsKIAlwMWtbMV0gICAgICA9IEhpMTYoaXYzMik7CiAJcDFrWzJdICAgICAgPSBNazE2KHRhWzFdLCB0YVswXSk7IC8qIHVzZSBUQVtdIGFzIGxpdHRsZS1lbmRpYW4gKi8KQEAgLTUyMiwxNCArNTE0LDE0IEBACiAKIAkvKiBOb3cgY29tcHV0ZSBhbiB1bmJhbGFuY2VkIEZlaXN0ZWwgY2lwaGVyIHdpdGggODAtYml0IGJsb2NrICovCiAJLyogc2l6ZSBvbiB0aGUgODAtYml0IGJsb2NrIFAxS1tdLCB1c2luZyB0aGUgMTI4LWJpdCBrZXkgVEtbXSAqLwotCWZvciAoaSA9IDA7IGkgPCBQSEFTRTFfTE9PUF9DTlQgO2krKykgeworCWZvciAoaSA9IDA7IGkgPCBQSEFTRTFfTE9PUF9DTlQ7IGkrKykgewogCQkvKiBFYWNoIGFkZCBvcGVyYXRpb24gaGVyZSBpcyBtb2QgMioqMTYgKi8KLQkJcDFrWzBdICs9IF9TXyhwMWtbNF0gXiBUSzE2KChpJjEpKzApKTsKLQkJcDFrWzFdICs9IF9TXyhwMWtbMF0gXiBUSzE2KChpJjEpKzIpKTsKLQkJcDFrWzJdICs9IF9TXyhwMWtbMV0gXiBUSzE2KChpJjEpKzQpKTsKLQkJcDFrWzNdICs9IF9TXyhwMWtbMl0gXiBUSzE2KChpJjEpKzYpKTsKLQkJcDFrWzRdICs9IF9TXyhwMWtbM10gXiBUSzE2KChpJjEpKzApKTsKLQkJcDFrWzRdICs9ICAodW5zaWduZWQgc2hvcnQpaTsgICAgICAgICAgICAgICAgICAgIC8qIGF2b2lkICJzbGlkZSBhdHRhY2tzIiAqLworCQlwMWtbMF0gKz0gX1NfKHAxa1s0XSBeIFRLMTYoKGkgJiAxKSArIDApKTsKKwkJcDFrWzFdICs9IF9TXyhwMWtbMF0gXiBUSzE2KChpICYgMSkgKyAyKSk7CisJCXAxa1syXSArPSBfU18ocDFrWzFdIF4gVEsxNigoaSAmIDEpICsgNCkpOworCQlwMWtbM10gKz0gX1NfKHAxa1syXSBeIFRLMTYoKGkgJiAxKSArIDYpKTsKKwkJcDFrWzRdICs9IF9TXyhwMWtbM10gXiBUSzE2KChpICYgMSkgKyAwKSk7CisJCXAxa1s0XSArPSAgKHVuc2lnbmVkIHNob3J0KSBpOyAvKiBhdm9pZCAic2xpZGUgYXR0YWNrcyIgKi8KIAkJfQogCiB9CkBAIC01NjAsNDIgKzU1Miw0NCBAQAogc3RhdGljIHZvaWQgcGhhc2UyKHU4ICpyYzRrZXksIGNvbnN0IHU4ICp0aywgY29uc3QgdTE2ICpwMWssIHUxNiBpdjE2KQogewogCWludCAgaTsKLQl1MTYgUFBLWzZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IGtleSBmb3IgbWl4aW5nICAgICovCisJdTE2IFBQS1s2XTsgLyogdGVtcG9yYXJ5IGtleSBmb3IgbWl4aW5nICAgICovCiAKLQkvKiBOb3RlOiBhbGwgYWRkcyBpbiB0aGUgUFBLW10gZXF1YXRpb25zIGJlbG93IGFyZSBtb2QgMioqMTYgICAgICAgICAqLwotCWZvciAoaSA9IDA7aTw1O2krKykgUFBLW2ldPSBwMWtbaV07ICAgICAgLyogZmlyc3QsIGNvcHkgUDFLIHRvIFBQSyAgICAgICovCi0JCVBQS1s1XSAgPSAgcDFrWzRdICtpdjE2OyAgICAgICAgICAgICAvKiBuZXh0LCAgYWRkIGluIElWMTYgICAgICAgICAgKi8KKwkvKiBOb3RlOiBhbGwgYWRkcyBpbiB0aGUgUFBLW10gZXF1YXRpb25zIGJlbG93IGFyZSBtb2QgMioqMTYgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQorCQlQUEtbaV0gPSBwMWtbaV07IC8qIGZpcnN0LCBjb3B5IFAxSyB0byBQUEsgKi8KIAotCS8qIEJpamVjdGl2ZSBub24tbGluZWFyIG1peGluZyBvZiB0aGUgOTYgYml0cyBvZiBQUEtbMC4uNV0gICAgICAgICAgICovCi0JUFBLWzBdICs9ICAgIF9TXyhQUEtbNV0gXiBUSzE2KDApKTsgICAvKiBNaXgga2V5IGluIGVhY2ggInJvdW5kIiAgICAgKi8KLQlQUEtbMV0gKz0gICAgX1NfKFBQS1swXSBeIFRLMTYoMSkpOwotCVBQS1syXSArPSAgICBfU18oUFBLWzFdIF4gVEsxNigyKSk7Ci0JUFBLWzNdICs9ICAgIF9TXyhQUEtbMl0gXiBUSzE2KDMpKTsKLQlQUEtbNF0gKz0gICAgX1NfKFBQS1szXSBeIFRLMTYoNCkpOwotCVBQS1s1XSArPSAgICBfU18oUFBLWzRdIF4gVEsxNig1KSk7ICAgLyogVG90YWwgIyBTLWJveCBsb29rdXBzID09IDYgICovCisJUFBLWzVdID0gcDFrWzRdICsgaXYxNjsgLyogbmV4dCwgIGFkZCBpbiBJVjE2ICovCiAKLQkvKiBGaW5hbCBzd2VlcDogYmlqZWN0aXZlLCAibGluZWFyIi4gUm90YXRlcyBraWxsIExTQiBjb3JyZWxhdGlvbnMgICAqLworCS8qIEJpamVjdGl2ZSBub24tbGluZWFyIG1peGluZyBvZiB0aGUgOTYgYml0cyBvZiBQUEtbMC4uNV0gKi8KKwlQUEtbMF0gKz0gX1NfKFBQS1s1XSBeIFRLMTYoMCkpOyAvKiBNaXgga2V5IGluIGVhY2ggInJvdW5kIiAqLworCVBQS1sxXSArPSBfU18oUFBLWzBdIF4gVEsxNigxKSk7CisJUFBLWzJdICs9IF9TXyhQUEtbMV0gXiBUSzE2KDIpKTsKKwlQUEtbM10gKz0gX1NfKFBQS1syXSBeIFRLMTYoMykpOworCVBQS1s0XSArPSBfU18oUFBLWzNdIF4gVEsxNig0KSk7CisJUFBLWzVdICs9IF9TXyhQUEtbNF0gXiBUSzE2KDUpKTsgLyogVG90YWwgIyBTLWJveCBsb29rdXBzID09IDYgKi8KKworCS8qIEZpbmFsIHN3ZWVwOiBiaWplY3RpdmUsICJsaW5lYXIiLiBSb3RhdGVzIGtpbGwgTFNCIGNvcnJlbGF0aW9ucyAqLwogCVBQS1swXSArPSAgUm90UjEoUFBLWzVdIF4gVEsxNig2KSk7Ci0JUFBLWzFdICs9ICBSb3RSMShQUEtbMF0gXiBUSzE2KDcpKTsgICAvKiBVc2UgYWxsIG9mIFRLW10gaW4gUGhhc2UyICAgKi8KKwlQUEtbMV0gKz0gIFJvdFIxKFBQS1swXSBeIFRLMTYoNykpOyAvKiBVc2UgYWxsIG9mIFRLW10gaW4gUGhhc2UyICovCiAJUFBLWzJdICs9ICBSb3RSMShQUEtbMV0pOwogCVBQS1szXSArPSAgUm90UjEoUFBLWzJdKTsKIAlQUEtbNF0gKz0gIFJvdFIxKFBQS1szXSk7CiAJUFBLWzVdICs9ICBSb3RSMShQUEtbNF0pOwogCS8qIE5vdGU6IEF0IHRoaXMgcG9pbnQsIGZvciBhIGdpdmVuIGtleSBUS1swLi4xNV0sIHRoZSA5Ni1iaXQgb3V0cHV0ICovCiAJLyogICAgICAgdmFsdWUgUFBLWzAuLjVdIGlzIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlLCBhcyBhIGZ1bmN0aW9uICAgKi8KLQkvKiAgICAgICBvZiB0aGUgOTYtYml0ICJpbnB1dCIgdmFsdWUgICB7VEEsIElWMzIsIElWMTZ9LiBUaGF0IGlzLCBQMUsgICovCi0JLyogICAgICAgaXMgbm93IGEga2V5ZWQgcGVybXV0YXRpb24gb2Yge1RBLCBJVjMyLCBJVjE2fS4gICAgICAgICAgICAgICAqLworCS8qICAgICAgIG9mIHRoZSA5Ni1iaXQgImlucHV0IiB2YWx1ZSAgIHtUQSwgSVYzMiwgSVYxNn0uIFRoYXQgaXMsICAgICovCisJLyogICAgICAgUDFLIGlzIG5vdyBhIGtleWVkIHBlcm11dGF0aW9uIG9mIHtUQSwgSVYzMiwgSVYxNn0uICAgICAgICAgKi8KIAogCS8qIFNldCBSQzRLRVlbMC4uM10sIHdoaWNoIGluY2x1ZGVzICJjbGVhcnRleHQiIHBvcnRpb24gb2YgUkM0IGtleSAgICovCi0JcmM0a2V5WzBdID0gSGk4KGl2MTYpOyAgICAgICAgICAgICAgICAvKiBSQzRLRVlbMC4uMl0gaXMgdGhlIFdFUCBJViAgKi8KLQlyYzRrZXlbMV0gPSAoSGk4KGl2MTYpIHwgMHgyMCkgJiAweDdGOyAvKiBIZWxwIGF2b2lkIHdlYWsgKEZNUykga2V5cyAgKi8KKwlyYzRrZXlbMF0gPSBIaTgoaXYxNik7ICAgICAgICAgICAgICAgICAvKiBSQzRLRVlbMC4uMl0gaXMgdGhlIFdFUCBJViAqLworCXJjNGtleVsxXSA9IChIaTgoaXYxNikgfCAweDIwKSAmIDB4N0Y7IC8qIEhlbHAgYXZvaWQgd2VhayAoRk1TKSBrZXlzICovCiAJcmM0a2V5WzJdID0gTG84KGl2MTYpOwogCXJjNGtleVszXSA9IExvOCgoUFBLWzVdIF4gVEsxNigwKSkgPj4gMSk7CiAKLQkvKiBDb3B5IDk2IGJpdHMgb2YgUFBLWzAuLjVdIHRvIFJDNEtFWVs0Li4xNV0gIChsaXR0bGUtZW5kaWFuKSAgICAgICAqLwotCWZvciAoaSA9IDA7aTw2O2krKykgewotCQlyYzRrZXlbNCsyKmldID0gTG84KFBQS1tpXSk7Ci0JCXJjNGtleVs1KzIqaV0gPSBIaTgoUFBLW2ldKTsKKwkvKiBDb3B5IDk2IGJpdHMgb2YgUFBLWzAuLjVdIHRvIFJDNEtFWVs0Li4xNV0gIChsaXR0bGUtZW5kaWFuKSAqLworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJcmM0a2V5WzQgKyAyICogaV0gPSBMbzgoUFBLW2ldKTsKKwkJcmM0a2V5WzUgKyAyICogaV0gPSBIaTgoUFBLW2ldKTsKIAl9CiAKIH0KQEAgLTYwNCw5NyArNTk4LDEwNyBAQAogaW50IHJ0d190a2lwX2VuY3J5cHQyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlciwKIAkJCXN0cnVjdCB4bWl0X2ZyYW1lICpweG1pdGZyYW1lKQogewotCXUxNglwbmw7Ci0JdTMyCXBuaDsKLQl1OAlyYzRrZXlbMTZdOwotCXU4ICAgdHRrZXlbMTZdOwotCXU4CWNyY1s0XTsKLQl1OCAgIGh3X2hkcl9vZmZzZXQgPSAwOworCXUxNiBwbmw7CisJdTMyIHBuaDsKKwl1OCByYzRrZXlbMTZdOworCXU4IHR0a2V5WzE2XTsKKwl1OCBjcmNbNF07CisJdTggaHdfaGRyX29mZnNldCA9IDA7CiAJc3RydWN0IGFyYzRjb250ZXh0IG15Y29udGV4dDsKLQlpbnQJCQljdXJmcmFnbnVtLCBsZW5ndGg7Ci0JdTMyCXByd3NrZXlsZW47Ci0JdTgJKnBmcmFtZSwgKnBheWxvYWQsICppdiwgKnByd3NrZXk7CisJaW50IGN1cmZyYWdudW0sIGxlbmd0aDsKKwl1MzIgcHJ3c2tleWxlbjsKKwl1OCAqcGZyYW1lLCAqcGF5bG9hZCwgKml2LCAqcHJ3c2tleTsKIAl1bmlvbiBwbjQ4IGRvdDExdHhwbjsKLQlzdHJ1Y3QJc3RhX2luZm8JCSpzdGFpbmZvOwotCXN0cnVjdAlwa3RfYXR0cmliCSAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7Ci0Jc3RydWN0CXNlY3VyaXR5X3ByaXYJKnBzZWN1cml0eXByaXYgPSAmcGFkYXB0ZXItPnNlY3VyaXR5cHJpdjsKLQlzdHJ1Y3QJeG1pdF9wcml2CQkqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YWluZm87CisJc3RydWN0IHBrdF9hdHRyaWIgKnBhdHRyaWIgPSAmcHhtaXRmcmFtZS0+YXR0cmliOworCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CisJc3RydWN0IHhtaXRfcHJpdiAqcHhtaXRwcml2ID0gJnBhZGFwdGVyLT54bWl0cHJpdjsKIAlpbnQgcmVzID0gX1NVQ0NFU1M7CiAKKwlpZiAocGF0dHJpYi0+ZW5jcnlwdCAhPSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKQorCQlyZXR1cm4gX0ZBSUw7CisKIAlpZiAoIXB4bWl0ZnJhbWUtPmJ1Zl9hZGRyKQogCQlyZXR1cm4gX0ZBSUw7CiAKIAlod19oZHJfb2Zmc2V0ID0gVFhERVNDX09GRlNFVDsKIAogCXBmcmFtZSA9IHB4bWl0ZnJhbWUtPmJ1Zl9hZGRyICsgaHdfaGRyX29mZnNldDsKKworCWlmIChwYXR0cmliLT5wc3RhKQorCQlzdGFpbmZvID0gcGF0dHJpYi0+cHN0YTsKKwllbHNlIHsKKwkJREJHXzg3MjNBKCIlcywgY2FsbCBydHdfZ2V0X3N0YWluZm8oKVxuIiwgX19mdW5jX18pOworCQlzdGFpbmZvID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwKKwkJCQkJICAgICAmcGF0dHJpYi0+cmFbMF0pOworCX0KKworCWlmIChzdGFpbmZvID09IE5VTEwpIHsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCisJCQkgIiVzOiBzdGFpbmZvID09IE5VTEwhISFcbiIsIF9fZnVuY19fKTsKKwkJREJHXzg3MjNBKCIlcywgcHN0YSA9PSBOVUxcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIF9GQUlMOworCX0KKworCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAorCQkgIiVzOiBzdGFpbmZvIT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOworCisJaWYgKCEoc3RhaW5mby0+c3RhdGUgJiBfRldfTElOS0VEKSkgeworCQlEQkdfODcyM0EoIiVzLCBwc3RhLT5zdGF0ZSgweCV4KSAhPSBfRldfTElOS0VEXG4iLCBfX2Z1bmNfXywgc3RhaW5mby0+c3RhdGUpOworCQlyZXR1cm4gX0ZBSUw7CisJfQorCisJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKSkKKwkJcHJ3c2tleSA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkXS5za2V5OworCWVsc2UKKwkJcHJ3c2tleSA9ICZzdGFpbmZvLT5kb3QxMTgwMjF4X1VuY3N0S2V5LnNrZXlbMF07CisKKwlwcndza2V5bGVuID0gMTY7CisKIAkvKiA0IHN0YXJ0IHRvIGVuY3J5cHQgZWFjaCBmcmFnbWVudCAqLwotCWlmIChwYXR0cmliLT5lbmNyeXB0ID09IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApIHsKLQkJaWYgKHBhdHRyaWItPnBzdGEpCi0JCQlzdGFpbmZvID0gcGF0dHJpYi0+cHN0YTsKLQkJZWxzZSB7Ci0JCQlEQkdfODcyM0EoIiVzLCBjYWxsIHJ0d19nZXRfc3RhaW5mbygpXG4iLCBfX2Z1bmNfXyk7Ci0JCQlzdGFpbmZvID0gcnR3X2dldF9zdGFpbmZvMjNhKCZwYWRhcHRlci0+c3RhcHJpdiwKLQkJCQkJCSAgICAgJnBhdHRyaWItPnJhWzBdKTsKKwlmb3IgKGN1cmZyYWdudW0gPSAwOyBjdXJmcmFnbnVtIDwgcGF0dHJpYi0+bnJfZnJhZ3M7IGN1cmZyYWdudW0rKykgeworCQlpdiA9IHBmcmFtZSArIHBhdHRyaWItPmhkcmxlbjsKKwkJcGF5bG9hZCA9IHBmcmFtZSArIHBhdHRyaWItPml2X2xlbiArIHBhdHRyaWItPmhkcmxlbjsKKworCQlHRVRfVEtJUF9QTihpdiwgZG90MTF0eHBuKTsKKworCQlwbmwgPSAodTE2KShkb3QxMXR4cG4udmFsKTsKKwkJcG5oID0gKHUzMikoZG90MTF0eHBuLnZhbD4+MTYpOworCisJCXBoYXNlMSgodTE2ICopJnR0a2V5WzBdLCBwcndza2V5LCAmcGF0dHJpYi0+dGFbMF0sIHBuaCk7CisKKwkJcGhhc2UyKCZyYzRrZXlbMF0sIHByd3NrZXksICh1MTYgKikmdHRrZXlbMF0sIHBubCk7CisKKwkJaWYgKChjdXJmcmFnbnVtICsgMSkgPT0gcGF0dHJpYi0+bnJfZnJhZ3MpIHsgLyogNCB0aGUgbGFzdCBmcmFnbWVudCAqLworCQkJbGVuZ3RoID0gKHBhdHRyaWItPmxhc3RfdHhjbWRzeiAtCisJCQkJICBwYXR0cmliLT5oZHJsZW4gLQorCQkJCSAgcGF0dHJpYi0+aXZfbGVuIC0KKwkJCQkgIHBhdHRyaWItPmljdl9sZW4pOworCisJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfaW5mb18sCisJCQkJICJwYXR0cmliLT5pdl9sZW4gPSV4LCBwYXR0cmliLT5pY3ZfbGVuID0leFxuIiwKKwkJCQkgcGF0dHJpYi0+aXZfbGVuLAorCQkJCSBwYXR0cmliLT5pY3ZfbGVuKTsKKwkJCSooKHUzMiAqKWNyYykgPSBjcHVfdG9fbGUzMihnZXRjcmMzMihwYXlsb2FkLCBsZW5ndGgpKTsKKworCQkJYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHJjNGtleSwgMTYpOworCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQsIHBheWxvYWQsIGxlbmd0aCk7CisJCQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCArIGxlbmd0aCwgY3JjLCA0KTsKKworCQl9IGVsc2UgeworCQkJbGVuZ3RoID0gKHB4bWl0cHJpdi0+ZnJhZ19sZW4gLQorCQkJCSAgcGF0dHJpYi0+aGRybGVuIC0KKwkJCQkgIHBhdHRyaWItPml2X2xlbiAtCisJCQkJICBwYXR0cmliLT5pY3ZfbGVuKTsKKworCQkJKigodTMyICopY3JjKSA9IGNwdV90b19sZTMyKGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aCkpOworCQkJYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHJjNGtleSwgMTYpOworCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQsIHBheWxvYWQsIGxlbmd0aCk7CisJCQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCArIGxlbmd0aCwgY3JjLCA0KTsKKworCQkJcGZyYW1lICs9IHB4bWl0cHJpdi0+ZnJhZ19sZW47CisJCQlwZnJhbWUgID0gUFRSX0FMSUdOKHBmcmFtZSwgNCk7CiAJCX0KLQotCQlpZiAoc3RhaW5mbyE9IE5VTEwpIHsKLQotCQkJaWYgKCEoc3RhaW5mby0+c3RhdGUgJl9GV19MSU5LRUQpKSB7Ci0JCQkJREJHXzg3MjNBKCIlcywgcHN0YS0+c3RhdGUoMHgleCkgIT0gX0ZXX0xJTktFRFxuIiwgX19mdW5jX18sIHN0YWluZm8tPnN0YXRlKTsKLQkJCQlyZXR1cm4gX0ZBSUw7Ci0JCQl9Ci0KLQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLCAoInJ0d190a2lwX2VuY3J5cHQyM2E6IHN0YWluZm8hPSBOVUxMISEhXG4iKSk7Ci0KLQkJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwYXR0cmliLT5yYSkpCi0JCQkJcHJ3c2tleSA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleWlkXS5za2V5OwotCQkJZWxzZQotCQkJCXByd3NrZXkgPSAmc3RhaW5mby0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5WzBdOwotCi0JCQlwcndza2V5bGVuID0gMTY7Ci0KLQkJCWZvciAoY3VyZnJhZ251bSA9IDA7Y3VyZnJhZ251bTxwYXR0cmliLT5ucl9mcmFncztjdXJmcmFnbnVtKyspIHsKLQkJCQlpdiA9IHBmcmFtZStwYXR0cmliLT5oZHJsZW47Ci0JCQkJcGF5bG9hZCA9IHBmcmFtZStwYXR0cmliLT5pdl9sZW4rcGF0dHJpYi0+aGRybGVuOwotCi0JCQkJR0VUX1RLSVBfUE4oaXYsIGRvdDExdHhwbik7Ci0KLQkJCQlwbmwgPSAodTE2KShkb3QxMXR4cG4udmFsKTsKLQkJCQlwbmggPSAodTMyKShkb3QxMXR4cG4udmFsPj4xNik7Ci0KLQkJCQlwaGFzZTEoKHUxNiAqKSZ0dGtleVswXSwgcHJ3c2tleSwmcGF0dHJpYi0+dGFbMF0sIHBuaCk7Ci0KLQkJCQlwaGFzZTIoJnJjNGtleVswXSwgcHJ3c2tleSwgKHUxNiAqKSZ0dGtleVswXSwgcG5sKTsKLQotCQkJCWlmICgoY3VyZnJhZ251bSsxKSA9PSBwYXR0cmliLT5ucl9mcmFncykgewkvKiA0IHRoZSBsYXN0IGZyYWdtZW50ICovCi0JCQkJCWxlbmd0aCA9IHBhdHRyaWItPmxhc3RfdHhjbWRzei1wYXR0cmliLT5oZHJsZW4tcGF0dHJpYi0+aXZfbGVuLSBwYXR0cmliLT5pY3ZfbGVuOwotCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfaW5mb18sICgicGF0dHJpYi0+aXZfbGVuID0leCwgcGF0dHJpYi0+aWN2X2xlbiA9JXhcbiIsIHBhdHRyaWItPml2X2xlbiwgcGF0dHJpYi0+aWN2X2xlbikpOwotCQkJCQkqKCh1MzIgKiljcmMpID0gY3B1X3RvX2xlMzIoZ2V0Y3JjMzIocGF5bG9hZCwgbGVuZ3RoKSk7LyogbW9kaWZpZWQgYnkgQW15Ki8KLQotCQkJCQlhcmNmb3VyX2luaXQoJm15Y29udGV4dCwgcmM0a2V5LCAxNik7Ci0JCQkJCWFyY2ZvdXJfZW5jcnlwdCgmbXljb250ZXh0LCBwYXlsb2FkLCBwYXlsb2FkLCBsZW5ndGgpOwotCQkJCQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCtsZW5ndGgsIGNyYywgNCk7Ci0KLQkJCQl9Ci0JCQkJZWxzZXsKLQkJCQkJbGVuZ3RoID0gcHhtaXRwcml2LT5mcmFnX2xlbi1wYXR0cmliLT5oZHJsZW4tcGF0dHJpYi0+aXZfbGVuLXBhdHRyaWItPmljdl9sZW4gOwotCQkJCQkqKCh1MzIgKiljcmMpID0gY3B1X3RvX2xlMzIoZ2V0Y3JjMzIocGF5bG9hZCwgbGVuZ3RoKSk7LyogbW9kaWZpZWQgYnkgQW15Ki8KLQkJCQkJYXJjZm91cl9pbml0KCZteWNvbnRleHQsIHJjNGtleSwgMTYpOwotCQkJCQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCwgcGF5bG9hZCwgbGVuZ3RoKTsKLQkJCQkJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQrbGVuZ3RoLCBjcmMsIDQpOwotCi0JCQkJcGZyYW1lKz0gcHhtaXRwcml2LT5mcmFnX2xlbjsKLQkJCQlwZnJhbWUgPSBQVFJfQUxJR04ocGZyYW1lLCA0KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQllbHNlewotCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sICgicnR3X3RraXBfZW5jcnlwdDIzYTogc3RhaW5mbyA9PSBOVUxMISEhXG4iKSk7Ci0JCQlEQkdfODcyM0EoIiVzLCBwc3RhID09IE5VTFxuIiwgX19mdW5jX18pOwotCQkJcmVzID0gX0ZBSUw7Ci0JCX0KLQogCX0KIAogCXJldHVybiByZXM7CkBAIC03MDYsNzIgKzcxMCw3NiBAQAogewogCXUxNiBwbmw7CiAJdTMyIHBuaDsKLQl1OCAgIHJjNGtleVsxNl07Ci0JdTggICB0dGtleVsxNl07Ci0JdTgJY3JjWzRdOworCXU4IHJjNGtleVsxNl07CisJdTggdHRrZXlbMTZdOworCXUzMiBhY3R1YWxfY3JjLCBleHBlY3RlZF9jcmM7CiAJc3RydWN0IGFyYzRjb250ZXh0IG15Y29udGV4dDsKLQlpbnQJbGVuZ3RoOwotCXUzMglwcndza2V5bGVuOwotCXU4CSpwZnJhbWUsICpwYXlsb2FkLCAqaXYsICpwcndza2V5OworCWludCBsZW5ndGg7CisJdTMyIHByd3NrZXlsZW47CisJdTggKnBmcmFtZSwgKnBheWxvYWQsICppdiwgKnByd3NrZXk7CiAJdW5pb24gcG40OCBkb3QxMXR4cG47Ci0Jc3RydWN0CXN0YV9pbmZvCQkqc3RhaW5mbzsKLQlzdHJ1Y3QJcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKLQlzdHJ1Y3QJc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OworCXN0cnVjdCBzdGFfaW5mbyAqc3RhaW5mbzsKKwlzdHJ1Y3QgcnhfcGt0X2F0dHJpYiAqcHJ4YXR0cmliID0gJnByZWN2ZnJhbWUtPmF0dHJpYjsKKwlzdHJ1Y3Qgc2VjdXJpdHlfcHJpdiAqcHNlY3VyaXR5cHJpdiA9ICZwYWRhcHRlci0+c2VjdXJpdHlwcml2OwogCXN0cnVjdCBza19idWZmICpza2IgPSBwcmVjdmZyYW1lLT5wa3Q7CiAJaW50IHJlcyA9IF9TVUNDRVNTOwogCisJaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCAhPSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKQorCQlyZXR1cm4gX0ZBSUw7CisKIAlwZnJhbWUgPSBza2ItPmRhdGE7CiAKLQkvKiA0IHN0YXJ0IHRvIGRlY3J5cHQgcmVjdmZyYW1lICovCi0JaWYgKHByeGF0dHJpYi0+ZW5jcnlwdCA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQKSB7Ci0KLQkJc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsCi0JCQkJCSAgICAgJnByeGF0dHJpYi0+dGFbMF0pOwotCQlpZiAoc3RhaW5mbyE9IE5VTEwpIHsKLQotCQkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHByeGF0dHJpYi0+cmEpKSB7Ci0JCQkJaWYgKHBzZWN1cml0eXByaXYtPmJpbnN0YWxsR3Jwa2V5ID09IDApIHsKLQkJCQkJcmVzID0gX0ZBSUw7Ci0JCQkJCURCR184NzIzQSgiJXM6cnggYmMvbWMgcGFja2V0cywgYnV0IGRpZG4ndCBpbnN0YWxsIGdyb3VwIGtleSEhISEhISEhISFcbiIsIF9fZnVuY19fKTsKLQkJCQkJZ290byBleGl0OwotCQkJCX0KLQkJCQlwcndza2V5ID0gcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleVtwcnhhdHRyaWItPmtleV9pbmRleF0uc2tleTsKLQkJCQlwcndza2V5bGVuID0gMTY7Ci0JCQl9IGVsc2UgewotCQkJICAgICAgICBSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywgKCJydHdfdGtpcF9kZWNyeXB0MjNhOiBzdGFpbmZvIT0gTlVMTCEhIVxuIikpOwotCQkJCXByd3NrZXkgPSAmc3RhaW5mby0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5WzBdOwotCQkJCXByd3NrZXlsZW4gPSAxNjsKLQkJCX0KLQotCQkJaXYgPSBwZnJhbWUrcHJ4YXR0cmliLT5oZHJsZW47Ci0JCQlwYXlsb2FkID0gcGZyYW1lK3ByeGF0dHJpYi0+aXZfbGVuK3ByeGF0dHJpYi0+aGRybGVuOwotCQkJbGVuZ3RoID0gc2tiLT5sZW4gLSBwcnhhdHRyaWItPmhkcmxlbi1wcnhhdHRyaWItPml2X2xlbjsKLQotCQkJR0VUX1RLSVBfUE4oaXYsIGRvdDExdHhwbik7Ci0KLQkJCXBubCA9ICh1MTYpKGRvdDExdHhwbi52YWwpOwotCQkJcG5oID0gKHUzMikoZG90MTF0eHBuLnZhbD4+MTYpOwotCi0JCQlwaGFzZTEoKHUxNiAqKSZ0dGtleVswXSwgcHJ3c2tleSwmcHJ4YXR0cmliLT50YVswXSwgcG5oKTsKLQkJCXBoYXNlMigmcmM0a2V5WzBdLCBwcndza2V5LCAodW5zaWduZWQgc2hvcnQgKikmdHRrZXlbMF0sIHBubCk7Ci0KLQkJCS8qIDQgZGVjcnlwdCBwYXlsb2FkIGluY2x1ZGUgaWN2ICovCi0JCQlhcmNmb3VyX2luaXQoJm15Y29udGV4dCwgcmM0a2V5LCAxNik7Ci0JCQlhcmNmb3VyX2VuY3J5cHQoJm15Y29udGV4dCwgcGF5bG9hZCwgcGF5bG9hZCwgbGVuZ3RoKTsKLQotCQkJKigodTMyICopY3JjKSA9IGxlMzJfdG9fY3B1KGdldGNyYzMyKHBheWxvYWQsIGxlbmd0aC00KSk7Ci0KLQkJCWlmIChjcmNbM10hPSBwYXlsb2FkW2xlbmd0aC0xXSB8fCBjcmNbMl0hPSBwYXlsb2FkW2xlbmd0aC0yXSB8fCBjcmNbMV0hPSBwYXlsb2FkW2xlbmd0aC0zXSB8fCBjcmNbMF0hPSBwYXlsb2FkW2xlbmd0aC00XSkKLQkJCXsKLQkJCSAgICBSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywgKCJydHdfd2VwX2RlY3J5cHQyM2E6aWN2IGVycm9yIGNyY1szXSgleCkhPSBwYXlsb2FkW2xlbmd0aC0xXSgleCkgfHwgY3JjWzJdKCV4KSE9IHBheWxvYWRbbGVuZ3RoLTJdKCV4KSB8fCBjcmNbMV0oJXgpIT0gcGF5bG9hZFtsZW5ndGgtM10oJXgpIHx8IGNyY1swXSgleCkhPSBwYXlsb2FkW2xlbmd0aC00XSgleClcbiIsCi0JCQkJCQljcmNbM10sIHBheWxvYWRbbGVuZ3RoLTFdLCBjcmNbMl0sIHBheWxvYWRbbGVuZ3RoLTJdLCBjcmNbMV0sIHBheWxvYWRbbGVuZ3RoLTNdLCBjcmNbMF0sIHBheWxvYWRbbGVuZ3RoLTRdKSk7Ci0JCQkJcmVzID0gX0ZBSUw7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywgKCJydHdfdGtpcF9kZWNyeXB0MjNhOiBzdGFpbmZvID09IE5VTEwhISFcbiIpKTsKLQkJCXJlcyA9IF9GQUlMOwotCQl9CisJc3RhaW5mbyA9IHJ0d19nZXRfc3RhaW5mbzIzYSgmcGFkYXB0ZXItPnN0YXByaXYsCisJCQkJICAgICAmcHJ4YXR0cmliLT50YVswXSk7CisJaWYgKHN0YWluZm8gPT0gTlVMTCkgeworCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKKwkJCSAiJXM6IHN0YWluZm8gPT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gX0ZBSUw7CiAJfQorCisJLyogNCBzdGFydCB0byBkZWNyeXB0IHJlY3ZmcmFtZSAqLworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihwcnhhdHRyaWItPnJhKSkgeworCQlpZiAocHNlY3VyaXR5cHJpdi0+Ymluc3RhbGxHcnBrZXkgPT0gMCkgeworCQkJcmVzID0gX0ZBSUw7CisJCQlEQkdfODcyM0EoIiVzOnJ4IGJjL21jIHBhY2tldHMsIGJ1dCBkaWRuJ3QgaW5zdGFsbCBncm91cCBrZXkhISEhISEhISEhXG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwkJcHJ3c2tleSA9IHBzZWN1cml0eXByaXYtPmRvdDExODAyMVhHcnBLZXlbcHJ4YXR0cmliLT5rZXlfaW5kZXhdLnNrZXk7CisJCXByd3NrZXlsZW4gPSAxNjsKKwl9IGVsc2UgeworCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKKwkJCSAiJXM6IHN0YWluZm8hPSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7CisJCXByd3NrZXkgPSAmc3RhaW5mby0+ZG90MTE4MDIxeF9VbmNzdEtleS5za2V5WzBdOworCQlwcndza2V5bGVuID0gMTY7CisJfQorCisJaXYgPSBwZnJhbWUgKyBwcnhhdHRyaWItPmhkcmxlbjsKKwlwYXlsb2FkID0gcGZyYW1lICsgcHJ4YXR0cmliLT5pdl9sZW4gKyBwcnhhdHRyaWItPmhkcmxlbjsKKwlsZW5ndGggPSBza2ItPmxlbiAtIHByeGF0dHJpYi0+aGRybGVuIC0gcHJ4YXR0cmliLT5pdl9sZW47CisKKwlHRVRfVEtJUF9QTihpdiwgZG90MTF0eHBuKTsKKworCXBubCA9ICh1MTYpKGRvdDExdHhwbi52YWwpOworCXBuaCA9ICh1MzIpKGRvdDExdHhwbi52YWw+PjE2KTsKKworCXBoYXNlMSgodTE2ICopJnR0a2V5WzBdLCBwcndza2V5LCAmcHJ4YXR0cmliLT50YVswXSwgcG5oKTsKKwlwaGFzZTIoJnJjNGtleVswXSwgcHJ3c2tleSwgKHVuc2lnbmVkIHNob3J0ICopJnR0a2V5WzBdLCBwbmwpOworCisJLyogNCBkZWNyeXB0IHBheWxvYWQgaW5jbHVkZSBpY3YgKi8KKwlhcmNmb3VyX2luaXQoJm15Y29udGV4dCwgcmM0a2V5LCAxNik7CisJYXJjZm91cl9lbmNyeXB0KCZteWNvbnRleHQsIHBheWxvYWQsIHBheWxvYWQsIGxlbmd0aCk7CisKKwlhY3R1YWxfY3JjID0gbGUzMl90b19jcHUoZ2V0Y3JjMzIocGF5bG9hZCwgbGVuZ3RoIC0gNCkpOworCWV4cGVjdGVkX2NyYyA9IGxlMzJfdG9fY3B1KGdldF91bmFsaWduZWRfbGUzMigmcGF5bG9hZFtsZW5ndGggLSA0XSkpOworCisJaWYgKGFjdHVhbF9jcmMgIT0gZXhwZWN0ZWRfY3JjKSB7CisJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAorCQkJICIlczppY3YgQ1JDIG1pc21hdGNoOiAiCisJCQkgImFjdHVhbDogJTA4eCwgZXhwZWN0ZWQ6ICUwOHhcbiIsCisJCQkgX19mdW5jX18sIGFjdHVhbF9jcmMsIGV4cGVjdGVkX2NyYyk7CisJCXJlcyA9IF9GQUlMOworCX0KKwogZXhpdDoKIAlyZXR1cm4gcmVzOwogfQpAQCAtODI5LDcgKzgzNyw3IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwO2k8MTY7IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKIAkJb3V0W2ldID0gYVtpXSBeIGJbaV07CiB9CiAKQEAgLTg1MCw4ICs4NTgsNyBAQAogewogCXU4IHJjb247CiAJdTggc2JveF9rZXlbNF07Ci0JdTggcmNvbl90YWJsZVsxMl0gPQotCXsKKwl1OCByY29uX3RhYmxlWzEyXSA9IHsKIAkJMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwKIAkJMHgxYiwgMHgzNiwgMHgzNiwgMHgzNgogCX07CkBAIC04NzYsMTAgKzg4Myw4IEBACiB7CiAJaW50IGk7CiAKLQlmb3IgKGkgPSAwOyBpPCAxNjsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCiAJCW91dFtpXSA9IHNib3goaW5baV0pOwotCX0KLQogfQogCiBzdGF0aWMgdm9pZCBzaGlmdF9yb3codTggKmluLCB1OCAqb3V0KQpAQCAtOTE2LDE5ICs5MjEsMTkgQEAKIAl1OCB0ZW1wWzRdOwogCXU4IHRlbXBiWzRdOwogCi0JZm9yIChpID0gMCA7IGk8NDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQlpZiAoKGluW2ldICYgMHg4MCkgPT0gMHg4MCkKLQkJICAgIGFkZDFiW2ldID0gMHgxYjsKKwkJCWFkZDFiW2ldID0gMHgxYjsKIAkJZWxzZQotCQkgICAgYWRkMWJbaV0gPSAweDAwOworCQkJYWRkMWJbaV0gPSAweDAwOwogCX0KIAotCXN3YXBfaGFsZnNbMF0gPSBpblsyXTsgICAgLyogU3dhcCBoYWxmcyAqLworCXN3YXBfaGFsZnNbMF0gPSBpblsyXTsgLyogU3dhcCBoYWxmcyAqLwogCXN3YXBfaGFsZnNbMV0gPSBpblszXTsKIAlzd2FwX2hhbGZzWzJdID0gaW5bMF07CiAJc3dhcF9oYWxmc1szXSA9IGluWzFdOwogCi0Jcm90bFswXSA9IGluWzNdOyAgICAgICAgLyogUm90YXRlIGxlZnQgOCBiaXRzICovCisJcm90bFswXSA9IGluWzNdOyAvKiBSb3RhdGUgbGVmdCA4IGJpdHMgKi8KIAlyb3RsWzFdID0gaW5bMF07CiAJcm90bFsyXSA9IGluWzFdOwogCXJvdGxbM10gPSBpblsyXTsKQEAgLTkzOCwxMSArOTQzLDEwIEBACiAJYW5kZjdbMl0gPSBpblsyXSAmIDB4N2Y7CiAJYW5kZjdbM10gPSBpblszXSAmIDB4N2Y7CiAKLQlmb3IgKGkgPSAzOyBpPjA7IGktLSkgeyAvKiBsb2dpY2FsIHNoaWZ0IGxlZnQgMSBiaXQgKi8KKwlmb3IgKGkgPSAzOyBpID4gMDsgaS0tKSB7IC8qIGxvZ2ljYWwgc2hpZnQgbGVmdCAxIGJpdCAqLwogCQlhbmRmN1tpXSA9IGFuZGY3W2ldIDw8IDE7Ci0JCWlmICgoYW5kZjdbaS0xXSAmIDB4ODApID09IDB4ODApIHsKLQkJICAgIGFuZGY3W2ldID0gKGFuZGY3W2ldIHwgMHgwMSk7Ci0JCX0KKwkJaWYgKChhbmRmN1tpIC0gMV0gJiAweDgwKSA9PSAweDgwKQorCQkJYW5kZjdbaV0gPSAoYW5kZjdbaV0gfCAweDAxKTsKIAl9CiAJYW5kZjdbMF0gPSBhbmRmN1swXSA8PCAxOwogCWFuZGY3WzBdID0gYW5kZjdbMF0gJiAweGZlOwpAQCAtOTUxLDcgKzk1NSw3IEBACiAKIAl4b3JfMzIoaW4sIGFkZDFiZjcsIHJvdHIpOwogCi0JdGVtcFswXSA9IHJvdHJbMF07ICAgICAgICAgLyogUm90YXRlIHJpZ2h0IDggYml0cyAqLworCXRlbXBbMF0gPSByb3RyWzBdOyAvKiBSb3RhdGUgcmlnaHQgOCBiaXRzICovCiAJcm90clswXSA9IHJvdHJbMV07CiAJcm90clsxXSA9IHJvdHJbMl07CiAJcm90clsyXSA9IHJvdHJbM107CkBAIC05NzEsMjUgKzk3NSwyNiBAQAogCXU4IGludGVybWVkaWF0ZWJbMTZdOwogCXU4IHJvdW5kX2tleVsxNl07CiAKLQlmb3IgKGkgPSAwOyBpPDE2OyBpKyspIHJvdW5kX2tleVtpXSA9IGtleVtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJcm91bmRfa2V5W2ldID0ga2V5W2ldOwogCiAJZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgMTE7IHJvdW5kKyspIHsKIAkJaWYgKHJvdW5kID09IDApIHsKLQkJICAgIHhvcl8xMjgocm91bmRfa2V5LCBkYXRhLCBjaXBoZXJ0ZXh0KTsKLQkJICAgIG5leHRfa2V5KHJvdW5kX2tleSwgcm91bmQpOworCQkJeG9yXzEyOChyb3VuZF9rZXksIGRhdGEsIGNpcGhlcnRleHQpOworCQkJbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7CiAJCX0gZWxzZSBpZiAocm91bmQgPT0gMTApIHsKLQkJICAgIGJ5dGVfc3ViKGNpcGhlcnRleHQsIGludGVybWVkaWF0ZWEpOwotCQkgICAgc2hpZnRfcm93KGludGVybWVkaWF0ZWEsIGludGVybWVkaWF0ZWIpOwotCQkgICAgeG9yXzEyOChpbnRlcm1lZGlhdGViLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOworCQkJYnl0ZV9zdWIoY2lwaGVydGV4dCwgaW50ZXJtZWRpYXRlYSk7CisJCQlzaGlmdF9yb3coaW50ZXJtZWRpYXRlYSwgaW50ZXJtZWRpYXRlYik7CisJCQl4b3JfMTI4KGludGVybWVkaWF0ZWIsIHJvdW5kX2tleSwgY2lwaGVydGV4dCk7CiAJCX0gZWxzZSB7IC8qIDEgLSA5ICovCi0JCSAgICBieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKLQkJICAgIHNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKLQkJICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMF0sICZpbnRlcm1lZGlhdGVhWzBdKTsKLQkJICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbNF0sICZpbnRlcm1lZGlhdGVhWzRdKTsKLQkJICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbOF0sICZpbnRlcm1lZGlhdGVhWzhdKTsKLQkJICAgIG1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMTJdLCAmaW50ZXJtZWRpYXRlYVsxMl0pOwotCQkgICAgeG9yXzEyOChpbnRlcm1lZGlhdGVhLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOwotCQkgICAgbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7CisJCQlieXRlX3N1YihjaXBoZXJ0ZXh0LCBpbnRlcm1lZGlhdGVhKTsKKwkJCXNoaWZ0X3JvdyhpbnRlcm1lZGlhdGVhLCBpbnRlcm1lZGlhdGViKTsKKwkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMF0sICZpbnRlcm1lZGlhdGVhWzBdKTsKKwkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbNF0sICZpbnRlcm1lZGlhdGVhWzRdKTsKKwkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbOF0sICZpbnRlcm1lZGlhdGVhWzhdKTsKKwkJCW1peF9jb2x1bW4oJmludGVybWVkaWF0ZWJbMTJdLCAmaW50ZXJtZWRpYXRlYVsxMl0pOworCQkJeG9yXzEyOChpbnRlcm1lZGlhdGVhLCByb3VuZF9rZXksIGNpcGhlcnRleHQpOworCQkJbmV4dF9rZXkocm91bmRfa2V5LCByb3VuZCk7CiAJCX0KIAl9CiAKQEAgLTEwMDYsOSArMTAxMSw5IEBACiAKIAltaWNfaXZbMF0gPSAweDU5OwogCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKQotCQltaWNfaXZbMV0gPSBtcGR1WzMwXSAmIDB4MGY7ICAgIC8qIFFvU19UQyAgICAgICAgICAgKi8KKwkJbWljX2l2WzFdID0gbXBkdVszMF0gJiAweDBmOyAvKiBRb1NfVEMgICAgICAgICovCiAJaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKQotCQltaWNfaXZbMV0gPSBtcGR1WzI0XSAmIDB4MGY7ICAgLyogbXV0ZSBiaXRzIDctNCAgICAqLworCQltaWNfaXZbMV0gPSBtcGR1WzI0XSAmIDB4MGY7IC8qIG11dGUgYml0cyA3LTQgKi8KIAlpZiAoIXFjX2V4aXN0cykKIAkJbWljX2l2WzFdID0gMHgwMDsKIAlmb3IgKGkgPSAyOyBpIDwgODsgaSsrKQpAQCAtMTAyOCwxNSArMTAzMywxNSBAQAogewogCW1pY19oZWFkZXIxWzBdID0gKHU4KSgoaGVhZGVyX2xlbmd0aCAtIDIpIC8gMjU2KTsKIAltaWNfaGVhZGVyMVsxXSA9ICh1OCkoKGhlYWRlcl9sZW5ndGggLSAyKSAlIDI1Nik7Ci0JbWljX2hlYWRlcjFbMl0gPSBtcGR1WzBdICYgMHhjZjsgICAgLyogTXV0ZSBDRiBwb2xsICYgQ0YgYWNrIGJpdHMgKi8KLQltaWNfaGVhZGVyMVszXSA9IG1wZHVbMV0gJiAweGM3OyAgICAvKiBNdXRlIHJldHJ5LCBtb3JlIGRhdGEgYW5kIHB3ciBtZ3QgYml0cyAqLwotCW1pY19oZWFkZXIxWzRdID0gbXBkdVs0XTsgICAgICAgLyogQTEgKi8KKwltaWNfaGVhZGVyMVsyXSA9IG1wZHVbMF0gJiAweGNmOyAvKiBNdXRlIENGIHBvbGwgJiBDRiBhY2sgYml0cyAqLworCW1pY19oZWFkZXIxWzNdID0gbXBkdVsxXSAmIDB4Yzc7IC8qIE11dGUgcmV0cnksIG1vcmUgZGF0YSBhbmQgcHdyIG1ndCBiaXRzICovCisJbWljX2hlYWRlcjFbNF0gPSBtcGR1WzRdOyAvKiBBMSAqLwogCW1pY19oZWFkZXIxWzVdID0gbXBkdVs1XTsKIAltaWNfaGVhZGVyMVs2XSA9IG1wZHVbNl07CiAJbWljX2hlYWRlcjFbN10gPSBtcGR1WzddOwogCW1pY19oZWFkZXIxWzhdID0gbXBkdVs4XTsKIAltaWNfaGVhZGVyMVs5XSA9IG1wZHVbOV07Ci0JbWljX2hlYWRlcjFbMTBdID0gbXBkdVsxMF07ICAgICAvKiBBMiAqLworCW1pY19oZWFkZXIxWzEwXSA9IG1wZHVbMTBdOyAvKiBBMiAqLwogCW1pY19oZWFkZXIxWzExXSA9IG1wZHVbMTFdOwogCW1pY19oZWFkZXIxWzEyXSA9IG1wZHVbMTJdOwogCW1pY19oZWFkZXIxWzEzXSA9IG1wZHVbMTNdOwpAQCAtMTA0Niw3ICsxMDUxLDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQkvKiBjb25zdHJ1Y3RfbWljX2hlYWRlcjIoKSAgICAgICAgICAgICAgICAgICAgICAqLworLyogY29uc3RydWN0X21pY19oZWFkZXIyKCkgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEJ1aWxkcyB0aGUgbGFzdCBNSUMgaGVhZGVyIGJsb2NrIGZyb20gICAgICAgICovCiAvKiBoZWFkZXIgZmllbGRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwNTUsOSArMTA2MCwxMCBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaTwxNjsgaSsrKSBtaWNfaGVhZGVyMltpXT0gMHgwMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJbWljX2hlYWRlcjJbaV0gPSAweDAwOwogCi0JbWljX2hlYWRlcjJbMF0gPSBtcGR1WzE2XTsgICAgLyogQTMgKi8KKwltaWNfaGVhZGVyMlswXSA9IG1wZHVbMTZdOyAvKiBBMyAqLwogCW1pY19oZWFkZXIyWzFdID0gbXBkdVsxN107CiAJbWljX2hlYWRlcjJbMl0gPSBtcGR1WzE4XTsKIAltaWNfaGVhZGVyMlszXSA9IG1wZHVbMTldOwpAQCAtMTA2OCw4ICsxMDc0LDggQEAKIAltaWNfaGVhZGVyMls3XSA9IDB4MDA7IC8qIG1wZHVbMjNdOyAqLwogCiAJaWYgKCFxY19leGlzdHMgJiYgYTRfZXhpc3RzKSB7Ci0JCWZvciAoaSA9IDA7aTw2O2krKykgbWljX2hlYWRlcjJbOCtpXSA9IG1wZHVbMjQraV07ICAgLyogQTQgKi8KLQorCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorCQkJbWljX2hlYWRlcjJbOCtpXSA9IG1wZHVbMjQraV07IC8qIEE0ICovCiAJfQogCiAJaWYgKHFjX2V4aXN0cyAmJiAhYTRfZXhpc3RzKSB7CkBAIC0xMDc4LDcgKzEwODQsOCBAQAogCX0KIAogCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKSB7Ci0JCWZvciAoaSA9IDA7aTw2O2krKykgbWljX2hlYWRlcjJbOCtpXSA9IG1wZHVbMjQraV07ICAgLyogQTQgKi8KKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCW1pY19oZWFkZXIyWzgraV0gPSBtcGR1WzI0K2ldOyAvKiBBNCAqLwogCiAJCW1pY19oZWFkZXIyWzE0XSA9IG1wZHVbMzBdICYgMHgwZjsKIAkJbWljX2hlYWRlcjJbMTVdID0gbXBkdVszMV0gJiAweDAwOwpAQCAtMTA5NiwxOSArMTEwMywyMSBAQAogewogCWludCBpID0gMDsKIAotCWZvciAoaSA9IDA7IGk8MTY7IGkrKykgY3RyX3ByZWxvYWRbaV0gPSAweDAwOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQljdHJfcHJlbG9hZFtpXSA9IDB4MDA7CisKIAlpID0gMDsKIAotCWN0cl9wcmVsb2FkWzBdID0gMHgwMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmxhZyAqLworCWN0cl9wcmVsb2FkWzBdID0gMHgwMTsgLyogZmxhZyAqLwogCWlmIChxY19leGlzdHMgJiYgYTRfZXhpc3RzKQotCQljdHJfcHJlbG9hZFsxXSA9IG1wZHVbMzBdICYgMHgwZjsgICAvKiBRb0NfQ29udHJvbCAqLworCQljdHJfcHJlbG9hZFsxXSA9IG1wZHVbMzBdICYgMHgwZjsgLyogUW9DX0NvbnRyb2wgKi8KIAlpZiAocWNfZXhpc3RzICYmICFhNF9leGlzdHMpCiAJCWN0cl9wcmVsb2FkWzFdID0gbXBkdVsyNF0gJiAweDBmOwogCiAJZm9yIChpID0gMjsgaSA8IDg7IGkrKykKLQkJY3RyX3ByZWxvYWRbaV0gPSBtcGR1W2kgKyA4XTsgICAgICAgICAgICAgICAgICAgICAgIC8qIGN0cl9wcmVsb2FkWzI6N10gPSBBMlswOjVdID0gbXBkdVsxMDoxNV0gKi8KKwkJY3RyX3ByZWxvYWRbaV0gPSBtcGR1W2kgKyA4XTsgLyogY3RyX3ByZWxvYWRbMjo3XSA9IEEyWzA6NV0gPSBtcGR1WzEwOjE1XSAqLwogCWZvciAoaSA9IDg7IGkgPCAxNDsgaSsrKQotCQljdHJfcHJlbG9hZFtpXSA9ICAgIHBuX3ZlY3RvclsxMyAtIGldOyAgICAgICAgICAvKiBjdHJfcHJlbG9hZFs4OjEzXSA9IFBOWzU6MF0gKi8KKwkJY3RyX3ByZWxvYWRbaV0gPSBwbl92ZWN0b3JbMTMgLSBpXTsgLyogY3RyX3ByZWxvYWRbODoxM10gPSBQTls1OjBdICovCiAJY3RyX3ByZWxvYWRbMTRdID0gICh1bnNpZ25lZCBjaGFyKSAoYyAvIDI1Nik7IC8qIEN0ciAqLwogCWN0cl9wcmVsb2FkWzE1XSA9ICAodW5zaWduZWQgY2hhcikgKGMgJSAyNTYpOwogCkBAIC0xMTI4LDggKzExMzcsOCBAQAogCiBzdGF0aWMgaW50IGFlc19jaXBoZXIodTggKmtleSwgdWludCBoZHJsZW4sIHU4ICpwZnJhbWUsIHVpbnQgcGxlbikKIHsKLQl1aW50CXFjX2V4aXN0cywgYTRfZXhpc3RzLCBpLCBqLCBwYXlsb2FkX3JlbWFpbmRlciwKLQkJbnVtX2Jsb2NrcywgcGF5bG9hZF9pbmRleDsKKwl1aW50IHFjX2V4aXN0cywgYTRfZXhpc3RzLCBpLCBqLCBwYXlsb2FkX3JlbWFpbmRlciwKKwkgICAgIG51bV9ibG9ja3MsIHBheWxvYWRfaW5kZXg7CiAJdTggcG5fdmVjdG9yWzZdOwogCXU4IG1pY19pdlsxNl07CiAJdTggbWljX2hlYWRlcjFbMTZdOwpAQCAtMTE3NywxMiArMTE4NiwxMiBAQAogCX0gZWxzZSB7CiAJCXFjX2V4aXN0cyA9IDA7CiAJfQotCXBuX3ZlY3RvclswXT0gcGZyYW1lW2hkcmxlbl07Ci0JcG5fdmVjdG9yWzFdPSBwZnJhbWVbaGRybGVuKzFdOwotCXBuX3ZlY3RvclsyXT0gcGZyYW1lW2hkcmxlbis0XTsKLQlwbl92ZWN0b3JbM109IHBmcmFtZVtoZHJsZW4rNV07Ci0JcG5fdmVjdG9yWzRdPSBwZnJhbWVbaGRybGVuKzZdOwotCXBuX3ZlY3Rvcls1XT0gcGZyYW1lW2hkcmxlbis3XTsKKwlwbl92ZWN0b3JbMF0gPSBwZnJhbWVbaGRybGVuXTsKKwlwbl92ZWN0b3JbMV0gPSBwZnJhbWVbaGRybGVuICsgMV07CisJcG5fdmVjdG9yWzJdID0gcGZyYW1lW2hkcmxlbiArIDRdOworCXBuX3ZlY3RvclszXSA9IHBmcmFtZVtoZHJsZW4gKyA1XTsKKwlwbl92ZWN0b3JbNF0gPSBwZnJhbWVbaGRybGVuICsgNl07CisJcG5fdmVjdG9yWzVdID0gcGZyYW1lW2hkcmxlbiArIDddOwogCiAJY29uc3RydWN0X21pY19pdihtaWNfaXYsIHFjX2V4aXN0cywgYTRfZXhpc3RzLCBwZnJhbWUsIHBsZW4sIHBuX3ZlY3Rvcik7CiAKQEAgLTExOTMsNyArMTIwMiw3IEBACiAJbnVtX2Jsb2NrcyA9IHBsZW4gLyAxNjsKIAogCS8qIEZpbmQgc3RhcnQgb2YgcGF5bG9hZCAqLwotCXBheWxvYWRfaW5kZXggPSAoaGRybGVuICsgOCk7CisJcGF5bG9hZF9pbmRleCA9IGhkcmxlbiArIDg7CiAKIAkvKiBDYWxjdWxhdGUgTUlDICovCiAJYWVzMTI4azEyOGQoa2V5LCBtaWNfaXYsIGFlc19vdXQpOwpAQCAtMTIyNCwxMiArMTIzMywxMiBAQAogCiAJLyogSW5zZXJ0IE1JQyBpbnRvIHBheWxvYWQgKi8KIAlmb3IgKGogPSAwOyBqIDwgODsgaisrKQotCQlwZnJhbWVbcGF5bG9hZF9pbmRleCtqXSA9IG1pY1tqXTsKKwkJcGZyYW1lW3BheWxvYWRfaW5kZXggKyBqXSA9IG1pY1tqXTsKIAogCXBheWxvYWRfaW5kZXggPSBoZHJsZW4gKyA4OwogCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKIAkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywKLQkJCQkgICAgICBwZnJhbWUsIHBuX3ZlY3RvciwgaSsxKTsKKwkJCQkgICAgICBwZnJhbWUsIHBuX3ZlY3RvciwgaSArIDEpOwogCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKIAkJYml0d2lzZV94b3IoYWVzX291dCwgJnBmcmFtZVtwYXlsb2FkX2luZGV4XSwgY2hhaW5fYnVmZmVyKTsKIAkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCkBAIC0xMjQxLDE1ICsxMjUwLDE1IEBACiAJCSAqIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjawogCQkgKi8KIAkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywgcGZyYW1lLAotCQkJCSAgICAgIHBuX3ZlY3RvciwgbnVtX2Jsb2NrcysxKTsKKwkJCQkgICAgICBwbl92ZWN0b3IsIG51bV9ibG9ja3MgKyAxKTsKIAogCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKIAkJCXBhZGRlZF9idWZmZXJbal0gPSAweDAwOwogCQlmb3IgKGogPSAwOyBqIDwgcGF5bG9hZF9yZW1haW5kZXI7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSBwZnJhbWVbcGF5bG9hZF9pbmRleCtqXTsKKwkJCXBhZGRlZF9idWZmZXJbal0gPSBwZnJhbWVbcGF5bG9hZF9pbmRleCArIGpdOwogCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKIAkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKLQkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyO2orKykKKwkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCiAJCQlwZnJhbWVbcGF5bG9hZF9pbmRleCsrXSA9IGNoYWluX2J1ZmZlcltqXTsKIAl9CiAKQEAgLTEyNjAsMTEgKzEyNjksMTEgQEAKIAlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKIAkJcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7CiAJZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJcGFkZGVkX2J1ZmZlcltqXSA9IHBmcmFtZVtqK2hkcmxlbis4K3BsZW5dOworCQlwYWRkZWRfYnVmZmVyW2pdID0gcGZyYW1lW2ogKyBoZHJsZW4gKyA4ICsgcGxlbl07CiAKIAlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKIAliaXR3aXNlX3hvcihhZXNfb3V0LCBwYWRkZWRfYnVmZmVyLCBjaGFpbl9idWZmZXIpOwotCWZvciAoaiA9IDA7IGogPCA4O2orKykKKwlmb3IgKGogPSAwOyBqIDwgODsgaisrKQogCQlwZnJhbWVbcGF5bG9hZF9pbmRleCsrXSA9IGNoYWluX2J1ZmZlcltqXTsKIAogCXJldHVybiBfU1VDQ0VTUzsKQEAgLTEyNzIsMTEgKzEyODEsMTEgQEAKIAogaW50IHJ0d19hZXNfZW5jcnlwdDIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLAogCQkgICAgICAgc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUpCi17CS8qICBleGNsdWRlIElDViAqLworewkvKiBleGNsdWRlIElDViAqLwogCS8qIEludGVybWVkaWF0ZSBCdWZmZXJzICovCiAJaW50IGN1cmZyYWdudW0sIGxlbmd0aDsKIAl1MzIgcHJ3c2tleWxlbjsKLQl1OCAqcGZyYW1lLCAqcHJ3c2tleTsJLyogICpwYXlsb2FkLCppdiAqLworCXU4ICpwZnJhbWUsICpwcndza2V5OwogCXU4IGh3X2hkcl9vZmZzZXQgPSAwOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhaW5mbzsKIAlzdHJ1Y3QgcGt0X2F0dHJpYiAqcGF0dHJpYiA9ICZweG1pdGZyYW1lLT5hdHRyaWI7CkBAIC0xMzA0LDE4ICsxMzEzLDE4IEBACiAKIAlpZiAoIXN0YWluZm8pIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJydHdfYWVzX2VuY3J5cHQyM2E6IHN0YWluZm8gPT0gTlVMTCEhIVxuIikpOworCQkJICIlczogc3RhaW5mbyA9PSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7CiAJCURCR184NzIzQSgiJXMsIHBzdGEgPT0gTlVMXG4iLCBfX2Z1bmNfXyk7CiAJCXJlcyA9IF9GQUlMOwogCQlnb3RvIG91dDsKIAl9Ci0JaWYgKCEoc3RhaW5mby0+c3RhdGUgJl9GV19MSU5LRUQpKSB7CisJaWYgKCEoc3RhaW5mby0+c3RhdGUgJiBfRldfTElOS0VEKSkgewogCQlEQkdfODcyM0EoIiVzLCBwc3RhLT5zdGF0ZSgweCV4KSAhPSBfRldfTElOS0VEXG4iLAogCQkJICBfX2Z1bmNfXywgc3RhaW5mby0+c3RhdGUpOwogCQlyZXR1cm4gX0ZBSUw7CiAJfQogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkgKCJydHdfYWVzX2VuY3J5cHQyM2E6IHN0YWluZm8hPSBOVUxMISEhXG4iKSk7CisJCSAiJXM6IHN0YWluZm8hPSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocGF0dHJpYi0+cmEpKQogCQlwcndza2V5ID0gcHNlY3VyaXR5cHJpdi0+ZG90MTE4MDIxWEdycEtleVtwc2VjdXJpdHlwcml2LT5kb3QxMTgwMjFYR3JwS2V5aWRdLnNrZXk7CkBAIC0xMzQ1LDEyICsxMzU0LDExIEBACiAJcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIGludCBhZXNfZGVjaXBoZXIodTggKmtleSwgdWludAloZHJsZW4sCi0JCQl1OCAqcGZyYW1lLCB1aW50IHBsZW4pCitzdGF0aWMgaW50IGFlc19kZWNpcGhlcih1OCAqa2V5LCB1aW50IGhkcmxlbiwgdTggKnBmcmFtZSwgdWludCBwbGVuKQogewotCXN0YXRpYyB1OAltZXNzYWdlW01BWF9NU0dfU0laRV07Ci0JdWludAlxY19leGlzdHMsIGE0X2V4aXN0cywgaSwgaiwgcGF5bG9hZF9yZW1haW5kZXIsCi0JCQludW1fYmxvY2tzLCBwYXlsb2FkX2luZGV4OworCXN0YXRpYyB1OCBtZXNzYWdlW01BWF9NU0dfU0laRV07CisJdWludCBxY19leGlzdHMsIGE0X2V4aXN0cywgaSwgaiwgcGF5bG9hZF9yZW1haW5kZXIsCisJICAgICBudW1fYmxvY2tzLCBwYXlsb2FkX2luZGV4OwogCWludCByZXMgPSBfU1VDQ0VTUzsKIAl1OCBwbl92ZWN0b3JbNl07CiAJdTggbWljX2l2WzE2XTsKQEAgLTEzNzUsMTYgKzEzODMsMTYgQEAKIAogCS8qIHN0YXJ0IHRvIGRlY3J5cHQgdGhlIHBheWxvYWQgKi8KIAotCW51bV9ibG9ja3MgPSAocGxlbi04KSAvIDE2OyAvKiBwbGVuIGluY2x1ZGluZyBsbGMsIHBheWxvYWRfbGVuZ3RoIGFuZCBtaWMpICovCisJbnVtX2Jsb2NrcyA9IChwbGVuIC0gOCkgLyAxNjsgLyogcGxlbiBpbmNsdWRpbmcgbGxjLCBwYXlsb2FkX2xlbmd0aCBhbmQgbWljKSAqLwogCi0JcGF5bG9hZF9yZW1haW5kZXIgPSAocGxlbi04KSAlIDE2OworCXBheWxvYWRfcmVtYWluZGVyID0gKHBsZW4gLSA4KSAlIDE2OwogCiAJcG5fdmVjdG9yWzBdICA9IHBmcmFtZVtoZHJsZW5dOwotCXBuX3ZlY3RvclsxXSAgPSBwZnJhbWVbaGRybGVuKzFdOwotCXBuX3ZlY3RvclsyXSAgPSBwZnJhbWVbaGRybGVuKzRdOwotCXBuX3ZlY3RvclszXSAgPSBwZnJhbWVbaGRybGVuKzVdOwotCXBuX3ZlY3Rvcls0XSAgPSBwZnJhbWVbaGRybGVuKzZdOwotCXBuX3ZlY3Rvcls1XSAgPSBwZnJhbWVbaGRybGVuKzddOworCXBuX3ZlY3RvclsxXSAgPSBwZnJhbWVbaGRybGVuICsgMV07CisJcG5fdmVjdG9yWzJdICA9IHBmcmFtZVtoZHJsZW4gKyA0XTsKKwlwbl92ZWN0b3JbM10gID0gcGZyYW1lW2hkcmxlbiArIDVdOworCXBuX3ZlY3Rvcls0XSAgPSBwZnJhbWVbaGRybGVuICsgNl07CisJcG5fdmVjdG9yWzVdICA9IHBmcmFtZVtoZHJsZW4gKyA3XTsKIAogCWlmICgoaGRybGVuID09IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgfHwKIAkgICAgKGhkcmxlbiA9PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyKSkpKQpAQCAtMTQxMywxMyArMTQyMSwxMyBAQAogCQlxY19leGlzdHMgPSAwOwogCX0KIAotCS8qICBub3csIGRlY3J5cHQgcGZyYW1lIHdpdGggaGRybGVuIG9mZnNldCBhbmQgcGxlbiBsb25nICovCisJLyogbm93LCBkZWNyeXB0IHBmcmFtZSB3aXRoIGhkcmxlbiBvZmZzZXQgYW5kIHBsZW4gbG9uZyAqLwogCiAJcGF5bG9hZF9pbmRleCA9IGhkcmxlbiArIDg7IC8qICA4IGlzIGZvciBleHRpdiAqLwogCiAJZm9yIChpID0gMDsgaSA8IG51bV9ibG9ja3M7IGkrKykgewogCQljb25zdHJ1Y3RfY3RyX3ByZWxvYWQoY3RyX3ByZWxvYWQsIGE0X2V4aXN0cywgcWNfZXhpc3RzLAotCQkJCSAgICAgIHBmcmFtZSwgcG5fdmVjdG9yLCBpKzEpOworCQkJCSAgICAgIHBmcmFtZSwgcG5fdmVjdG9yLCBpICsgMSk7CiAKIAkJYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CiAJCWJpdHdpc2VfeG9yKGFlc19vdXQsICZwZnJhbWVbcGF5bG9hZF9pbmRleF0sIGNoYWluX2J1ZmZlcik7CkBAIC0xNDMzLDEyICsxNDQxLDEyIEBACiAJCSAqIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjawogCQkgKi8KIAkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywgcGZyYW1lLAotCQkJCSAgICAgIHBuX3ZlY3RvciwgbnVtX2Jsb2NrcysxKTsKKwkJCQkgICAgICBwbl92ZWN0b3IsIG51bV9ibG9ja3MgKyAxKTsKIAogCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKIAkJCXBhZGRlZF9idWZmZXJbal0gPSAweDAwOwogCQlmb3IgKGogPSAwOyBqIDwgcGF5bG9hZF9yZW1haW5kZXI7IGorKykKLQkJCXBhZGRlZF9idWZmZXJbal0gPSBwZnJhbWVbcGF5bG9hZF9pbmRleCtqXTsKKwkJCXBhZGRlZF9idWZmZXJbal0gPSBwZnJhbWVbcGF5bG9hZF9pbmRleCArIGpdOwogCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKIAkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKIAkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCkBAIC0xNDQ2LDI3ICsxNDU0LDI3IEBACiAJfQogCiAJLyogc3RhcnQgdG8gY2FsY3VsYXRlIHRoZSBtaWMgKi8KLQlpZiAoKGhkcmxlbiArcGxlbis4KSA8PSBNQVhfTVNHX1NJWkUpCi0JCW1lbWNweShtZXNzYWdlLCBwZnJhbWUsIChoZHJsZW4rcGxlbis4KSk7IC8qIDggaXMgZm9yIGV4dCBpdiBsZW4gKi8KKwlpZiAoKGhkcmxlbiArIHBsZW4gKyA4KSA8PSBNQVhfTVNHX1NJWkUpCisJCW1lbWNweShtZXNzYWdlLCBwZnJhbWUsIChoZHJsZW4gKyBwbGVuICsgOCkpOyAvKiA4IGlzIGZvciBleHQgaXYgbGVuICovCiAKIAlwbl92ZWN0b3JbMF0gPSBwZnJhbWVbaGRybGVuXTsKLQlwbl92ZWN0b3JbMV0gPSBwZnJhbWVbaGRybGVuKzFdOwotCXBuX3ZlY3RvclsyXSA9IHBmcmFtZVtoZHJsZW4rNF07Ci0JcG5fdmVjdG9yWzNdID0gcGZyYW1lW2hkcmxlbis1XTsKLQlwbl92ZWN0b3JbNF0gPSBwZnJhbWVbaGRybGVuKzZdOwotCXBuX3ZlY3Rvcls1XSA9IHBmcmFtZVtoZHJsZW4rN107CisJcG5fdmVjdG9yWzFdID0gcGZyYW1lW2hkcmxlbiArIDFdOworCXBuX3ZlY3RvclsyXSA9IHBmcmFtZVtoZHJsZW4gKyA0XTsKKwlwbl92ZWN0b3JbM10gPSBwZnJhbWVbaGRybGVuICsgNV07CisJcG5fdmVjdG9yWzRdID0gcGZyYW1lW2hkcmxlbiArIDZdOworCXBuX3ZlY3Rvcls1XSA9IHBmcmFtZVtoZHJsZW4gKyA3XTsKIAogCWNvbnN0cnVjdF9taWNfaXYobWljX2l2LCBxY19leGlzdHMsIGE0X2V4aXN0cywgbWVzc2FnZSwKLQkJCSBwbGVuLTgsIHBuX3ZlY3Rvcik7CisJCQkgcGxlbiAtIDgsIHBuX3ZlY3Rvcik7CiAKIAljb25zdHJ1Y3RfbWljX2hlYWRlcjEobWljX2hlYWRlcjEsIGhkcmxlbiwgbWVzc2FnZSk7CiAJY29uc3RydWN0X21pY19oZWFkZXIyKG1pY19oZWFkZXIyLCBtZXNzYWdlLCBhNF9leGlzdHMsIHFjX2V4aXN0cyk7CiAKLQlwYXlsb2FkX3JlbWFpbmRlciA9IChwbGVuLTgpICUgMTY7Ci0JbnVtX2Jsb2NrcyA9IChwbGVuLTgpIC8gMTY7CisJcGF5bG9hZF9yZW1haW5kZXIgPSAocGxlbiAtIDgpICUgMTY7CisJbnVtX2Jsb2NrcyA9IChwbGVuIC0gOCkgLyAxNjsKIAogCS8qIEZpbmQgc3RhcnQgb2YgcGF5bG9hZCAqLwotCXBheWxvYWRfaW5kZXggPSAoaGRybGVuICsgOCk7CisJcGF5bG9hZF9pbmRleCA9IGhkcmxlbiArIDg7CiAKIAkvKiBDYWxjdWxhdGUgTUlDICovCiAJYWVzMTI4azEyOGQoa2V5LCBtaWNfaXYsIGFlc19vdXQpOwpAQCAtMTQ4Nyw3ICsxNDk1LDcgQEAKIAkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCiAJCQlwYWRkZWRfYnVmZmVyW2pdID0gMHgwMDsKIAkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCi0JCSAgICBwYWRkZWRfYnVmZmVyW2pdID0gbWVzc2FnZVtwYXlsb2FkX2luZGV4KytdOworCQkJcGFkZGVkX2J1ZmZlcltqXSA9IG1lc3NhZ2VbcGF5bG9hZF9pbmRleCsrXTsKIAkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKIAkJYWVzMTI4azEyOGQoa2V5LCBjaGFpbl9idWZmZXIsIGFlc19vdXQpOwogCX0KQEAgLTE0OTcsMTIgKzE1MDUsMTIgQEAKIAogCS8qIEluc2VydCBNSUMgaW50byBwYXlsb2FkICovCiAJZm9yIChqID0gMDsgaiA8IDg7IGorKykKLQkJbWVzc2FnZVtwYXlsb2FkX2luZGV4K2pdID0gbWljW2pdOworCQltZXNzYWdlW3BheWxvYWRfaW5kZXggKyBqXSA9IG1pY1tqXTsKIAogCXBheWxvYWRfaW5kZXggPSBoZHJsZW4gKyA4OwotCWZvciAoaSA9IDA7IGk8IG51bV9ibG9ja3M7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBudW1fYmxvY2tzOyBpKyspIHsKIAkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywKLQkJCQkgICAgICBtZXNzYWdlLCBwbl92ZWN0b3IsIGkrMSk7CisJCQkJICAgICAgbWVzc2FnZSwgcG5fdmVjdG9yLCBpICsgMSk7CiAJCWFlczEyOGsxMjhkKGtleSwgY3RyX3ByZWxvYWQsIGFlc19vdXQpOwogCQliaXR3aXNlX3hvcihhZXNfb3V0LCAmbWVzc2FnZVtwYXlsb2FkX2luZGV4XSwgY2hhaW5fYnVmZmVyKTsKIAkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCkBAIC0xNTE0LDEyICsxNTIyLDEyIEBACiAJCSAqIGVuY3J5cHQgaXQgYW5kIGNvcHkgdGhlIHVucGFkZGVkIHBhcnQgYmFjawogCQkgKi8KIAkJY29uc3RydWN0X2N0cl9wcmVsb2FkKGN0cl9wcmVsb2FkLCBhNF9leGlzdHMsIHFjX2V4aXN0cywKLQkJCQkgICAgICBtZXNzYWdlLCBwbl92ZWN0b3IsIG51bV9ibG9ja3MrMSk7CisJCQkJICAgICAgbWVzc2FnZSwgcG5fdmVjdG9yLCBudW1fYmxvY2tzICsgMSk7CiAKIAkJZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0JCQkgcGFkZGVkX2J1ZmZlcltqXSA9IDB4MDA7CisJCQlwYWRkZWRfYnVmZmVyW2pdID0gMHgwMDsKIAkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCi0JCQlwYWRkZWRfYnVmZmVyW2pdID0gbWVzc2FnZVtwYXlsb2FkX2luZGV4K2pdOworCQkJcGFkZGVkX2J1ZmZlcltqXSA9IG1lc3NhZ2VbcGF5bG9hZF9pbmRleCArIGpdOwogCQlhZXMxMjhrMTI4ZChrZXksIGN0cl9wcmVsb2FkLCBhZXNfb3V0KTsKIAkJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKIAkJZm9yIChqID0gMDsgaiA8IHBheWxvYWRfcmVtYWluZGVyOyBqKyspCkBAIC0xNTMzLDcgKzE1NDEsNyBAQAogCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQogCQlwYWRkZWRfYnVmZmVyW2pdID0gMHgwMDsKIAlmb3IgKGogPSAwOyBqIDwgODsgaisrKQotCQlwYWRkZWRfYnVmZmVyW2pdID0gbWVzc2FnZVtqK2hkcmxlbis4K3BsZW4tOF07CisJCXBhZGRlZF9idWZmZXJbal0gPSBtZXNzYWdlW2ogKyBoZHJsZW4gKyA4ICsgcGxlbiAtIDhdOwogCiAJYWVzMTI4azEyOGQoa2V5LCBjdHJfcHJlbG9hZCwgYWVzX291dCk7CiAJYml0d2lzZV94b3IoYWVzX291dCwgcGFkZGVkX2J1ZmZlciwgY2hhaW5fYnVmZmVyKTsKQEAgLTE1NDIsMTIgKzE1NTAsMTYgQEAKIAogCS8qIGNvbXBhcmUgdGhlIG1pYyAqLwogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYgKHBmcmFtZVtoZHJsZW4rOCtwbGVuLTgraV0gIT0gbWVzc2FnZVtoZHJsZW4rOCtwbGVuLTgraV0pIHsKKwkJaWYgKHBmcmFtZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSAhPSBtZXNzYWdlW2hkcmxlbiArIDggKyBwbGVuIC0gOCArIGldKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJhZXNfZGVjaXBoZXI6bWljIGNoZWNrIGVycm9yIG1pY1slZF06IHBmcmFtZSgleCkgIT0gbWVzc2FnZSgleClcbiIsCi0JCQkJIGksIHBmcmFtZVtoZHJsZW4rOCtwbGVuLTgraV0sIG1lc3NhZ2VbaGRybGVuKzgrcGxlbi04K2ldKSk7Ci0JCQlEQkdfODcyM0EoImFlc19kZWNpcGhlcjptaWMgY2hlY2sgZXJyb3IgbWljWyVkXTogcGZyYW1lKCV4KSAhPSBtZXNzYWdlKCV4KVxuIiwKLQkJCQkgIGksIHBmcmFtZVtoZHJsZW4rOCtwbGVuLTgraV0sIG1lc3NhZ2VbaGRybGVuKzgrcGxlbi04K2ldKTsKKwkJCQkgIiVzOm1pYyBjaGVjayBlcnJvciBtaWNbJWRdOiBwZnJhbWUoJXgpICE9IG1lc3NhZ2UoJXgpXG4iLAorCQkJCSBfX2Z1bmNfXywgaSwKKwkJCQkgcGZyYW1lW2hkcmxlbiArIDggKyBwbGVuIC0gOCArIGldLAorCQkJCSBtZXNzYWdlW2hkcmxlbiArIDggKyBwbGVuIC0gOCArIGldKTsKKwkJCURCR184NzIzQSgiJXM6bWljIGNoZWNrIGVycm9yIG1pY1slZF06IHBmcmFtZSgleCkgIT0gbWVzc2FnZSgleClcbiIsCisJCQkJICBfX2Z1bmNfXywgaSwKKwkJCQkgIHBmcmFtZVtoZHJsZW4gKyA4ICsgcGxlbiAtIDggKyBpXSwKKwkJCQkgIG1lc3NhZ2VbaGRybGVuICsgOCArIHBsZW4gLSA4ICsgaV0pOwogCQkJcmVzID0gX0ZBSUw7CiAJCX0KIAl9CkBAIC0xNTYyLDcgKzE1NzQsNyBAQAogCXN0cnVjdCBzZWN1cml0eV9wcml2ICpwc2VjdXJpdHlwcml2ID0gJnBhZGFwdGVyLT5zZWN1cml0eXByaXY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByZWN2ZnJhbWUtPnBrdDsKIAlpbnQgbGVuZ3RoOwotCXU4ICpwZnJhbWUsICpwcndza2V5OwkvKiAgKnBheWxvYWQsKml2ICovCisJdTggKnBmcmFtZSwgKnByd3NrZXk7CiAJaW50IHJlcyA9IF9TVUNDRVNTOwogCiAJcGZyYW1lID0gc2tiLT5kYXRhOwpAQCAtMTU3MywxNyArMTU4NSwxOCBAQAogCXN0YWluZm8gPSBydHdfZ2V0X3N0YWluZm8yM2EoJnBhZGFwdGVyLT5zdGFwcml2LCAmcHJ4YXR0cmliLT50YVswXSk7CiAJaWYgKCFzdGFpbmZvKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkJICgicnR3X2Flc19lbmNyeXB0MjNhOiBzdGFpbmZvID09IE5VTEwhISFcbiIpKTsKKwkJCSAiJXM6IHN0YWluZm8gPT0gTlVMTCEhIVxuIiwgX19mdW5jX18pOwogCQlyZXMgPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkgKCJydHdfYWVzX2RlY3J5cHQyM2E6IHN0YWluZm8hPSBOVUxMISEhXG4iKSk7CisJCSAiJXM6IHN0YWluZm8hPSBOVUxMISEhXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIocHJ4YXR0cmliLT5yYSkpIHsKLQkJLyogaW4gY29uY3VycmVudCB3ZSBzaG91bGQgdXNlIHN3IGRlY3J5cHQgaW4gZ3JvdXAga2V5LAotCQkgICBzbyB3ZSByZW1vdmUgdGhpcyBtZXNzYWdlICovCisJCS8qIGluIGNvbmN1cnJlbnQgd2Ugc2hvdWxkIHVzZSBzdyBkZWNyeXB0IGluCisJCSAqIGdyb3VwIGtleSwgc28gd2UgcmVtb3ZlIHRoaXMgbWVzc2FnZQorCQkgKi8KIAkJaWYgKCFwc2VjdXJpdHlwcml2LT5iaW5zdGFsbEdycGtleSkgewogCQkJcmVzID0gX0ZBSUw7CiAJCQlEQkdfODcyM0EoIiVzOnJ4IGJjL21jIHBhY2tldHMsIGJ1dCBkaWRuJ3QgaW5zdGFsbCAiCkBAIC0xNjEzLDkgKzE2MjYsMTAgQEAKIHsKIAlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gKHN0cnVjdCBydHdfYWRhcHRlciAqKUZ1bmN0aW9uQ29udGV4dDsKIAotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLCAoIl5eXnJ0d191c2VfdGtpcGtleV9oYW5kbGVyMjNhIF5eXlxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAorCQkgIl5eXiVzIF5eXlxuIiwgX19mdW5jX18pOwogCXBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkgPSAxOwogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9lcnJfLAotCQkgKCJeXl5ydHdfdXNlX3RraXBrZXlfaGFuZGxlcjIzYSBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5ID0lZF5eXlxuIiwKLQkJIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkpKTsKKwkJICJeXl4lcyBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5ID0lZF5eXlxuIiwKKwkJIF9fZnVuY19fLCBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfc3RhX21ndC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zdGFfbWd0LmMKaW5kZXggZDE3OTk4ZC4uYjA2YmZmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zdGFfbWd0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d19zdGFfbWd0LmMKQEAgLTEzNiwxMCArMTM2LDEwIEBACiAJaW5kZXggPSB3aWZpX21hY19oYXNoKGh3YWRkcik7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXywgX2Rydl9pbmZvXywKLQkJICgicnR3X2FsbG9jX3N0YWluZm8yM2E6IGluZGV4ICA9ICV4IiwgaW5kZXgpKTsKKwkJICJydHdfYWxsb2Nfc3RhaW5mbzIzYTogaW5kZXggID0gJXhcbiIsIGluZGV4KTsKIAlpZiAoaW5kZXggPj0gTlVNX1NUQSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXywgX2Rydl9lcnJfLAotCQkJICgiRVJST1IgPT4gcnR3X2FsbG9jX3N0YWluZm8yM2E6IGluZGV4ID49IE5VTV9TVEEiKSk7CisJCQkgIkVSUk9SID0+IHJ0d19hbGxvY19zdGFpbmZvMjNhOiBpbmRleCA+PSBOVU1fU1RBXG4iKTsKIAkJcHN0YSA9IE5VTEw7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0xNjAsOCArMTYwLDggQEAKIAkJCSZ3UnhTZXFJbml0aWFsVmFsdWUsIDIpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3N0YV9tZ3RfY18sIF9kcnZfaW5mb18sCi0JCSAoImFsbG9jIG51bWJlcl8lZCBzdGFpbmZvICB3aXRoIGh3YWRkciA9ICVwTVxuIiwKLQkJIHBzdGFwcml2LT5hc29jX3N0YV9jb3VudCwgaHdhZGRyKSk7CisJCSAiYWxsb2MgbnVtYmVyXyVkIHN0YWluZm8gIHdpdGggaHdhZGRyID0gJXBNXG4iLAorCQkgcHN0YXByaXYtPmFzb2Nfc3RhX2NvdW50LCBod2FkZHIpOwogCiAJaW5pdF9hZGRiYV9yZXRyeV90aW1lcjIzYShwc3RhKTsKIApAQCAtMjQ5LDEwICsyNDksOCBAQAogCiAJbGlzdF9kZWxfaW5pdCgmcHN0YS0+aGFzaF9saXN0KTsKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc3RhX21ndF9jXywgX2Rydl9lcnJfLAotCQkoIlxuIGZyZWUgbnVtYmVyXyVkIHN0YWluZm8gIHdpdGggaHdhZGRyID0gMHglLjJ4IDB4JS4yeCAweCUuMnggMHglLjJ4IDB4JS4yeCAweCUuMnhcbiIsCi0JCQlwc3RhcHJpdi0+YXNvY19zdGFfY291bnQsIHBzdGEtPmh3YWRkclswXSwKLQkJCXBzdGEtPmh3YWRkclsxXSwgcHN0YS0+aHdhZGRyWzJdLCBwc3RhLT5od2FkZHJbM10sCi0JCQlwc3RhLT5od2FkZHJbNF0sIHBzdGEtPmh3YWRkcls1XSkpOworCQkgImZyZWUgbnVtYmVyXyVkIHN0YWluZm8gIHdpdGggaHdhZGRyID0gJXBNXG4iLAorCQkgcHN0YXByaXYtPmFzb2Nfc3RhX2NvdW50LCBwc3RhLT5od2FkZHIpOwogCXBzdGFwcml2LT5hc29jX3N0YV9jb3VudC0tOwogCiAJLyogIHJlLWluaXQgc3RhX2luZm87IDIwMDYxMTE0ICB3aWxsIGJlIGluaXQgaW4gYWxsb2Nfc3RhaW5mbyAqLwpAQCAtMzk3LDcgKzM5NSw3IEBACiAJaWYgKHBzdGEgPT0gTlVMTCkgewogCQlyZXMgPSBfRkFJTDsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3N0YV9tZ3RfY18sIF9kcnZfZXJyXywKLQkJCSAoInJ0d19hbGxvY19zdGFpbmZvMjNhIGZhaWwiKSk7CisJCQkgInJ0d19hbGxvY19zdGFpbmZvMjNhIGZhaWxcbiIpOwogCQlyZXR1cm4gcmVzOwogCX0KIAkvKiAgZGVmYXVsdCBicm9hZGNhc3QgJiBtdWx0aWNhc3QgdXNlIG1hY2lkIDEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfd2xhbl91dGlsLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2NvcmUvcnR3X3dsYW5fdXRpbC5jCmluZGV4IDY5ZDllMGYuLjUyODAzMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfd2xhbl91dGlsLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d193bGFuX3V0aWwuYwpAQCAtODc2LDkgKzg3Niw5IEBACiAJfQogCiAJaWYgKCFldGhlcl9hZGRyX2VxdWFsKGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MsIG1nbXQtPmJzc2lkKSkgewotCQlEQkdfODcyM0EoIiVzOiBsaW5rZWQgYnV0IHJlY3Ygb3RoZXIgYnNzaWQgYmNuIgotCQkJICBNQUNfRk1UIE1BQ19GTVQgIlxuIiwgX19mdW5jX18sIE1BQ19BUkcobWdtdC0+YnNzaWQpLAotCQkJICBNQUNfQVJHKGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpKTsKKwkJREJHXzg3MjNBKCIlczogbGlua2VkIGJ1dCByZWN2IG90aGVyIGJzc2lkIGJjbiAlcE0gJXBNXG4iLAorCQkJICBfX2Z1bmNfXywgbWdtdC0+YnNzaWQsCisJCQkgIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpOwogCQlyZXR1cm4gX0ZBSUw7CiAJfQogCkBAIC05MjYsMTAgKzkyNiw5IEBACiAJfQogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCSAoIiVzIGJzc2lkLlNzaWQuU3NpZDolcyBic3NpZC5Tc2lkLlNzaWRMZW5ndGg6JWQgIgotCQkgICJjdXJfbmV0d29yay0+bmV0d29yay5Tc2lkLlNzaWQ6JXMgbGVuOiVkXG4iLCBfX2Z1bmNfXywKLQkJICBzc2lkLCBzc2lkX2xlbiwgY3VyX25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkgIGN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4pKTsKKwkJICIlcyBic3NpZC5Tc2lkLlNzaWQ6JXMgYnNzaWQuU3NpZC5Tc2lkTGVuZ3RoOiVkIGN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuU3NpZDolcyBsZW46JWRcbiIsCisJCSBfX2Z1bmNfXywgc3NpZCwgc3NpZF9sZW4sIGN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCwKKwkJIGN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4pOwogCiAJaWYgKHNzaWRfbGVuICE9IGN1cl9uZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4gfHwgc3NpZF9sZW4gPiAzMiB8fAogCSAgICAoc3NpZF9sZW4gJiYKQEAgLTk0Nyw4ICs5NDYsOCBAQAogCQlwcml2YWN5ID0gMDsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkgKCIlcygpOiBjdXJfbmV0d29yay0+bmV0d29yay5Qcml2YWN5IGlzICVkLCBic3NpZC5Qcml2YWN5ICIKLQkJICAiaXMgJWRcbiIsIF9fZnVuY19fLCBjdXJfbmV0d29yay0+bmV0d29yay5Qcml2YWN5LCBwcml2YWN5KSk7CisJCSAiJXMoKTogY3VyX25ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSBpcyAlZCwgYnNzaWQuUHJpdmFjeSBpcyAlZFxuIiwKKwkJIF9fZnVuY19fLCBjdXJfbmV0d29yay0+bmV0d29yay5Qcml2YWN5LCBwcml2YWN5KTsKIAlpZiAoY3VyX25ldHdvcmstPm5ldHdvcmsuUHJpdmFjeSAhPSBwcml2YWN5KSB7CiAJCURCR184NzIzQSgiJXMoKSwgcHJpdmFjeSBpcyBub3QgbWF0Y2ggcmV0dXJuIEZBSUxcbiIsIF9fZnVuY19fKTsKIAkJZ290byBfbWlzbWF0Y2g7CkBAIC05NjIsMTAgKzk2MSw5IEBACiAJCQkJCQkgJnBhaXJ3aXNlX2NpcGhlciwgJmlzXzgwMjF4KTsKIAkJCWlmIChyID09IF9TVUNDRVNTKQogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgKCIlcyBwbmV0d29yay0+cGFpcndpc2VfY2lwaGVyOiAlZCwgIgotCQkJCQkgICJwbmV0d29yay0+Z3JvdXBfY2lwaGVyOiAlZCwgaXNfODAyeCAiCi0JCQkJCSAgIjogJWRcbiIsIF9fZnVuY19fLCBwYWlyd2lzZV9jaXBoZXIsCi0JCQkJCSAgZ3JvdXBfY2lwaGVyLCBpc184MDIxeCkpOworCQkJCQkgIiVzIHBuZXR3b3JrLT5wYWlyd2lzZV9jaXBoZXI6ICVkLCBwbmV0d29yay0+Z3JvdXBfY2lwaGVyOiAlZCwgaXNfODAyeCA6ICVkXG4iLAorCQkJCQkgX19mdW5jX18sIHBhaXJ3aXNlX2NpcGhlciwKKwkJCQkJIGdyb3VwX2NpcGhlciwgaXNfODAyMXgpOwogCQkJfQogCX0gZWxzZSB7CiAJCXAgPSBjZmc4MDIxMV9maW5kX3ZlbmRvcl9pZShXTEFOX09VSV9NSUNST1NPRlQsCkBAIC05NzcsMTAgKzk3NSw5IEBACiAJCQkJCQkmcGFpcndpc2VfY2lwaGVyLCAmaXNfODAyMXgpOwogCQkJaWYgKHIgPT0gX1NVQ0NFU1MpCiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAoIiVzIHBuZXR3b3JrLT5wYWlyd2lzZV9jaXBoZXI6ICVkLCAiCi0JCQkJCSAgImdyb3VwX2NpcGhlciBpcyAlZCwgaXNfODAyMXggaXMgIgotCQkJCQkgICIlZFxuIiwgX19mdW5jX18sIHBhaXJ3aXNlX2NpcGhlciwKLQkJCQkJICBncm91cF9jaXBoZXIsIGlzXzgwMjF4KSk7CisJCQkJCSAiJXMgcG5ldHdvcmstPnBhaXJ3aXNlX2NpcGhlcjogJWQsIGdyb3VwX2NpcGhlciBpcyAlZCwgaXNfODAyMXggaXMgJWRcbiIsCisJCQkJCSBfX2Z1bmNfXywgcGFpcndpc2VfY2lwaGVyLAorCQkJCQkgZ3JvdXBfY2lwaGVyLCBpc184MDIxeCk7CiAJCX0gZWxzZSB7CiAJCQlpZiAocHJpdmFjeSkKIAkJCQljcnlwdG8gPSBFTkNSWVBfUFJPVE9DT0xfV0VQOwpAQCAtOTk2LDggKzk5Myw4IEBACiAKIAlpZiAoY3J5cHRvID09IEVOQ1JZUF9QUk9UT0NPTF9XUEEgfHwgY3J5cHRvID09IEVOQ1JZUF9QUk9UT0NPTF9XUEEyKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9tbG1lX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIlcyBjdXJfbmV0d29yay0+Z3JvdXBfY2lwaGVyIGlzICVkOiAlZFxuIiwgX19mdW5jX18sCi0JCQkgIGN1cl9uZXR3b3JrLT5CY25JbmZvLmdyb3VwX2NpcGhlciwgZ3JvdXBfY2lwaGVyKSk7CisJCQkgIiVzIGN1cl9uZXR3b3JrLT5ncm91cF9jaXBoZXIgaXMgJWQ6ICVkXG4iLCBfX2Z1bmNfXywKKwkJCSBjdXJfbmV0d29yay0+QmNuSW5mby5ncm91cF9jaXBoZXIsIGdyb3VwX2NpcGhlcik7CiAJCWlmIChwYWlyd2lzZV9jaXBoZXIgIT0gY3VyX25ldHdvcmstPkJjbkluZm8ucGFpcndpc2VfY2lwaGVyIHx8CiAJCSAgICBncm91cF9jaXBoZXIgIT0gY3VyX25ldHdvcmstPkJjbkluZm8uZ3JvdXBfY2lwaGVyKSB7CiAJCQlEQkdfODcyM0EoIiVzIHBhaXJ3aXNlX2NpcGhlcigleDoleCkgb3IgZ3JvdXBfY2lwaGVyICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvY29yZS9ydHdfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d194bWl0LmMKaW5kZXggMWM4MmRmZi4uYTRiNmJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d194bWl0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9jb3JlL3J0d194bWl0LmMKQEAgLTQ2Myw5ICs0NjMsNyBAQAogCQkJCQkvKiAgNjcgOiBVRFAgQk9PVFAgc2VydmVyICovCiAJCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLAogCQkJCQkJIF9kcnZfZXJyXywKLQkJCQkJCSAoIj09PT09PT09PT09PT09PT09PT09PT0iCi0JCQkJCQkgICJ1cGRhdGVfYXR0cmliOiBnZXQgREhDUCAiCi0JCQkJCQkgICJQYWNrZXRcbiIpKTsKKwkJCQkJCSAiPT09PT09PT09PT09PT09PT09PT09PXVwZGF0ZV9hdHRyaWI6IGdldCBESENQIFBhY2tldFxuIik7CiAJCQkJCXBhdHRyaWItPmRoY3BfcGt0ID0gMTsKIAkJCQl9CiAJCQl9CkBAIC00OTMsOCArNDkxLDggQEAKIAkJcHN0YSA9IHJ0d19nZXRfc3RhaW5mbzIzYShwc3RhcHJpdiwgcGF0dHJpYi0+cmEpOwogCQlpZiAocHN0YSA9PSBOVUxMKSB7IC8qICBpZiB3ZSBjYW5ub3QgZ2V0IHBzdGEgPT4gZHJycCB0aGUgcGt0ICovCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9hbGVydF8sCi0JCQkJICgiXG51cGRhdGVfYXR0cmliID0+IGdldCBzdGFfaW5mbyBmYWlsLCByYToiCi0JCQkJICBNQUNfRk1UIlxuIiwgTUFDX0FSRyhwYXR0cmliLT5yYSkpKTsKKwkJCQkgInVwZGF0ZV9hdHRyaWIgPT4gZ2V0IHN0YV9pbmZvIGZhaWwsIHJhOiVwTVxuIiwKKwkJCQkgcGF0dHJpYi0+cmEpOwogCQkJcmVzID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0gZWxzZSBpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIFdJRklfQVBfU1RBVEUpICYmCkBAIC01MTEsOCArNTA5LDggQEAKIAl9IGVsc2UgewogCQkvKiAgaWYgd2UgY2Fubm90IGdldCBwc3RhID0+IGRyb3AgdGhlIHBrdCAqLwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9hbGVydF8sCi0JCQkgKCJcbnVwZGF0ZV9hdHRyaWIgPT4gZ2V0IHN0YV9pbmZvIGZhaWwsIHJhOiIgTUFDX0ZNVAotCQkJICAiXG4iLCBNQUNfQVJHKHBhdHRyaWItPnJhKSkpOworCQkJICJ1cGRhdGVfYXR0cmliID0+IGdldCBzdGFfaW5mbyBmYWlsLCByYTolcE1cbiIsCisJCQkgcGF0dHJpYi0+cmEpOwogCQlyZXMgPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KQEAgLTU0NCwxNiArNTQyLDE1IEBACiAKIAlpZiAocHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0gdHJ1ZSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICgiXG4gcHN0YS0+aWVlZTgwMjF4X2Jsb2NrZWQgPT0gdHJ1ZVxuIikpOworCQkJICJwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9PSB0cnVlXG4iKTsKIAogCQlwYXR0cmliLT5lbmNyeXB0ID0gMDsKIAogCQlpZiAoKHBhdHRyaWItPmV0aGVyX3R5cGUgIT0gRVRIX1BfUEFFKSAmJgogCQkgICAgIWNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX01QX1NUQVRFKSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJcbnBzdGEtPmllZWU4MDIxeF9ibG9ja2VkID09IHRydWUsICAiCi0JCQkJICAicGF0dHJpYi0+ZXRoZXJfdHlwZSglLjR4KSAhPSAweDg4OGVcbiIsCi0JCQkJICBwYXR0cmliLT5ldGhlcl90eXBlKSk7CisJCQkJICJwc3RhLT5pZWVlODAyMXhfYmxvY2tlZCA9PSB0cnVlLCAgcGF0dHJpYi0+ZXRoZXJfdHlwZSglLjR4KSAhPSAweDg4OGVcbiIsCisJCQkJIHBhdHRyaWItPmV0aGVyX3R5cGUpOwogCQkJcmVzID0gX0ZBSUw7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KQEAgLTU5NCw5ICs1OTEsOCBAQAogCiAJCWlmICghcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5idXNldGtpcGtleSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJcbnBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXAiCi0JCQkJICAia2V5KCVkKSA9PSBmYWxzZSBkcm9wIHBhY2tldFxuIiwKLQkJCQkgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkpKTsKKwkJCQkgInBhZGFwdGVyLT5zZWN1cml0eXByaXYuYnVzZXRraXBrZXkoJWQpID09IGZhbHNlIGRyb3AgcGFja2V0XG4iLAorCQkJCSBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmJ1c2V0a2lwa2V5KTsKIAkJCXJlcyA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CkBAIC02MDQsOCArNjAwLDggQEAKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoInBhdHRyaWItPmVuY3J5cHQgPSVkIChXTEFOX0NJUEhFUl9TVUlURV9DQ01QKVxuIiwKLQkJCSAgcGF0dHJpYi0+ZW5jcnlwdCkpOworCQkJICJwYXR0cmliLT5lbmNyeXB0ID0lZCAoV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUClcbiIsCisJCQkgcGF0dHJpYi0+ZW5jcnlwdCk7CiAJCXBhdHRyaWItPml2X2xlbiA9IElFRUU4MDIxMV9DQ01QX0hEUl9MRU47CiAJCXBhdHRyaWItPmljdl9sZW4gPSBJRUVFODAyMTFfQ0NNUF9NSUNfTEVOOwogCQlicmVhazsKQEAgLTYxNywxNyArNjEzLDE3IEBACiAJfQogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoInVwZGF0ZV9hdHRyaWI6IGVuY3J5cHQgPSVkXG4iLCBwYXR0cmliLT5lbmNyeXB0KSk7CisJCSAidXBkYXRlX2F0dHJpYjogZW5jcnlwdCA9JWRcbiIsIHBhdHRyaWItPmVuY3J5cHQpOwogCiAJaWYgKHBhdHRyaWItPmVuY3J5cHQgJiYgIXBzZWN1cml0eXByaXYtPmh3X2RlY3J5cHRlZCkgewogCQlwYXR0cmliLT5ic3dlbmMgPSB0cnVlOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICgidXBkYXRlX2F0dHJpYjogZW5jcnlwdCA9JWQgYnN3ZW5jID0gdHJ1ZVxuIiwKLQkJCSAgcGF0dHJpYi0+ZW5jcnlwdCkpOworCQkJICJ1cGRhdGVfYXR0cmliOiBlbmNyeXB0ID0lZCBic3dlbmMgPSB0cnVlXG4iLAorCQkJIHBhdHRyaWItPmVuY3J5cHQpOwogCX0gZWxzZSB7CiAJCXBhdHRyaWItPmJzd2VuYyA9IGZhbHNlOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoInVwZGF0ZV9hdHRyaWI6IGJzd2VuYyA9IGZhbHNlXG4iKSk7CisJCQkgInVwZGF0ZV9hdHRyaWI6IGJzd2VuYyA9IGZhbHNlXG4iKTsKIAl9CiAJdXBkYXRlX2F0dHJpYl9waHlfaW5mbyhwYXR0cmliLCBwc3RhKTsKIApAQCAtNzI2LDIwICs3MjIsMTggQEAKIAkJCSAgICAgY3VyZnJhZ251bSsrKSB7CiAJCQkJcGF5bG9hZCA9IFBUUl9BTElHTihwYXlsb2FkLCA0KTsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCQkgKCI9PT0gY3VyZnJhZ251bSA9JWQsIHBmcmFtZSA9IDB4JS4yeCwgIgotCQkJCQkgICIweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4IgotCQkJCQkgICIlLjJ4LCAweCUuMngsIDB4JS4yeCwhISFcbiIsCi0JCQkJCSAgY3VyZnJhZ251bSwgKnBheWxvYWQsICoocGF5bG9hZCArIDEpLAotCQkJCQkgICoocGF5bG9hZCArIDIpLCAqKHBheWxvYWQgKyAzKSwKLQkJCQkJICAqKHBheWxvYWQgKyA0KSwgKihwYXlsb2FkICsgNSksCi0JCQkJCSAgKihwYXlsb2FkICsgNiksICoocGF5bG9hZCArIDcpKSk7CisJCQkJCSAiPT09IGN1cmZyYWdudW0gPSVkLCBwZnJhbWUgPSAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwgMHglLjJ4LCAweCUuMngsIDB4JS4yeCwhISFcbiIsCisJCQkJCSBjdXJmcmFnbnVtLCAqcGF5bG9hZCwgKihwYXlsb2FkICsgMSksCisJCQkJCSAqKHBheWxvYWQgKyAyKSwgKihwYXlsb2FkICsgMyksCisJCQkJCSAqKHBheWxvYWQgKyA0KSwgKihwYXlsb2FkICsgNSksCisJCQkJCSAqKHBheWxvYWQgKyA2KSwgKihwYXlsb2FkICsgNykpOwogCiAJCQkJcGF5bG9hZCA9IHBheWxvYWQgKyBwYXR0cmliLT5oZHJsZW4gKwogCQkJCQlwYXR0cmliLT5pdl9sZW47CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkJICgiY3VyZnJhZ251bSA9JWQgcGF0dHJpYi0+aGRybGVuID0lZCAiCi0JCQkJCSAgInBhdHRyaWItPml2X2xlbiA9JWQiLCBjdXJmcmFnbnVtLAotCQkJCQkgIHBhdHRyaWItPmhkcmxlbiwgcGF0dHJpYi0+aXZfbGVuKSk7CisJCQkJCSAiY3VyZnJhZ251bSA9JWQgcGF0dHJpYi0+aGRybGVuID0lZCBwYXR0cmliLT5pdl9sZW4gPSVkXG4iLAorCQkJCQkgY3VyZnJhZ251bSwKKwkJCQkJIHBhdHRyaWItPmhkcmxlbiwgcGF0dHJpYi0+aXZfbGVuKTsKIAkJCQlpZiAoKGN1cmZyYWdudW0gKyAxKSA9PSBwYXR0cmliLT5ucl9mcmFncykgewogCQkJCQlsZW5ndGggPSBwYXR0cmliLT5sYXN0X3R4Y21kc3ogLQogCQkJCQkJcGF0dHJpYi0+aGRybGVuIC0KQEAgLTc2MSwyNSArNzU1LDIxIEBACiAJCQkJCQlwYXR0cmliLT5pY3ZfbGVuOwogCQkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywKIAkJCQkJCSBfZHJ2X2Vycl8sCi0JCQkJCQkgKCJjdXJmcmFnbnVtID0lZCBsZW5ndGggPSVkICIKLQkJCQkJCSAgInBhdHRyaWItPmljdl9sZW4gPSVkIiwKLQkJCQkJCSAgY3VyZnJhZ251bSwgbGVuZ3RoLAotCQkJCQkJICBwYXR0cmliLT5pY3ZfbGVuKSk7CisJCQkJCQkgImN1cmZyYWdudW0gPSVkIGxlbmd0aCA9JWQgcGF0dHJpYi0+aWN2X2xlbiA9JWRcbiIsCisJCQkJCQkgY3VyZnJhZ251bSwgbGVuZ3RoLAorCQkJCQkJIHBhdHRyaWItPmljdl9sZW4pOwogCQkJCX0KIAkJCX0KIAkJCXJ0d19zZWNnZXRtaWMyM2EoJm1pY2RhdGEsICZtaWNbMF0pOwogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJ4bWl0ZnJhbWVfYWRkbWljOiBiZWZvcmUgYWRkIG1pYyBjb2RlISFcbiIpKTsKKwkJCQkgInhtaXRmcmFtZV9hZGRtaWM6IGJlZm9yZSBhZGQgbWljIGNvZGUhIVxuIik7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAoInhtaXRmcmFtZV9hZGRtaWM6IHBhdHRyaWItPmxhc3RfdHhjbWRzeiA9IgotCQkJCSAgIiVkISEhXG4iLCBwYXR0cmliLT5sYXN0X3R4Y21kc3opKTsKKwkJCQkgInhtaXRmcmFtZV9hZGRtaWM6IHBhdHRyaWItPmxhc3RfdHhjbWRzeiA9JWQhISFcbiIsCisJCQkJIHBhdHRyaWItPmxhc3RfdHhjbWRzeik7CiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJCSAoInhtaXRmcmFtZV9hZGRtaWM6IG1pY1swXT0gMHglLjJ4ICwgbWljWzFdPSIKLQkJCQkgICIweCUuMnggLCBtaWNbMl09IDB4JS4yeCAsIG1pY1szXT0gMHglLjJ4XG4iCi0JCQkJICAibWljWzRdPSAweCUuMnggLCBtaWNbNV09IDB4JS4yeCAsIG1pY1s2XT0gMHglLjJ4ICIKLQkJCQkgICIsIG1pY1s3XT0gMHglLjJ4ICEhISFcbiIsIG1pY1swXSwgbWljWzFdLAotCQkJCSAgbWljWzJdLCBtaWNbM10sIG1pY1s0XSwgbWljWzVdLCBtaWNbNl0sCi0JCQkJICBtaWNbN10pKTsKKwkJCQkgInhtaXRmcmFtZV9hZGRtaWM6IG1pY1swXT0gMHglLjJ4ICwgbWljWzFdPTB4JS4yeCAsIG1pY1syXT0gMHglLjJ4ICwgbWljWzNdPSAweCUuMnhcbm1pY1s0XT0gMHglLjJ4ICwgbWljWzVdPSAweCUuMnggLCBtaWNbNl09IDB4JS4yeCAsIG1pY1s3XT0gMHglLjJ4ICEhISFcbiIsCisJCQkJIG1pY1swXSwgbWljWzFdLCBtaWNbMl0sIG1pY1szXSwKKwkJCQkgbWljWzRdLCBtaWNbNV0sIG1pY1s2XSwgbWljWzddKTsKIAkJCS8qIGFkZCBtaWMgY29kZSAgYW5kIGFkZCB0aGUgbWljIGNvZGUgbGVuZ3RoCiAJCQkgICBpbiBsYXN0X3R4Y21kc3ogKi8KIApAQCAtNzg3LDI1ICs3NzcsMjQgQEAKIAkJCXBhdHRyaWItPmxhc3RfdHhjbWRzeiArPSA4OwogCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkgKCJcbiA9PT09PT09PSBsYXN0IHBrdCA9PT09PT09PVxuIikpOworCQkJCSAiPT09PT09PT0gbGFzdCBwa3QgPT09PT09PT1cbiIpOwogCQkJcGF5bG9hZCA9IHBheWxvYWQgLSBwYXR0cmliLT5sYXN0X3R4Y21kc3ogKyA4OwogCQkJZm9yIChjdXJmcmFnbnVtID0gMDsgY3VyZnJhZ251bSA8IHBhdHRyaWItPmxhc3RfdHhjbWRzejsKLQkJCSAgICAgY3VyZnJhZ251bSA9IGN1cmZyYWdudW0gKyA4KQorCQkJICAgICBjdXJmcmFnbnVtID0gY3VyZnJhZ251bSArIDgpIHsKIAkJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkJICgiICUuMngsICAlLjJ4LCAgJS4yeCwgICUuMngsICAlLjJ4LCAiCi0JCQkJCSAgIiAlLjJ4LCAgJS4yeCwgICUuMnggIiwKLQkJCQkJICAqKHBheWxvYWQgKyBjdXJmcmFnbnVtKSwKLQkJCQkJICAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgMSksCi0JCQkJCSAgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDIpLAotCQkJCQkgICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyAzKSwKLQkJCQkJICAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgNCksCi0JCQkJCSAgKihwYXlsb2FkICsgY3VyZnJhZ251bSArIDUpLAotCQkJCQkgICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyA2KSwKLQkJCQkJICAqKHBheWxvYWQgKyBjdXJmcmFnbnVtICsgNykpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCQkJICgieG1pdGZyYW1lX2FkZG1pYzogcnR3X2dldF9zdGFpbmZvMjNhID09IgotCQkJCQkgICJOVUxMISEhXG4iKSk7CisJCQkJCSAiJS4yeCwgICUuMngsICAlLjJ4LCAgJS4yeCwgICUuMngsICAlLjJ4LCAgJS4yeCwgICUuMnhcbiIsCisJCQkJCSAqKHBheWxvYWQgKyBjdXJmcmFnbnVtKSwKKwkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyAxKSwKKwkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyAyKSwKKwkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyAzKSwKKwkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyA0KSwKKwkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyA1KSwKKwkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyA2KSwKKwkJCQkJICoocGF5bG9hZCArIGN1cmZyYWdudW0gKyA3KSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAorCQkJCSAieG1pdGZyYW1lX2FkZG1pYzogcnR3X2dldF9zdGFpbmZvMjNhID09TlVMTCEhIVxuIik7CiAJCX0KIAl9CiAKQEAgLTgyMSw3ICs4MTAsNyBAQAogCWlmIChwYXR0cmliLT5ic3dlbmMpIHsKIAkJLyogREJHXzg3MjNBKCJzdGFydCB4bWl0ZnJhbWVfc3dlbmNyeXB0XG4iKTsgKi8KIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfYWxlcnRfLAotCQkJICgiIyMjIHhtaXRmcmFtZV9zd2VuY3J5cHRcbiIpKTsKKwkJCSAiIyMjIHhtaXRmcmFtZV9zd2VuY3J5cHRcbiIpOwogCQlzd2l0Y2ggKHBhdHRyaWItPmVuY3J5cHQpIHsKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKIAkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CkBAIC04MzksNyArODI4LDcgQEAKIAogCX0gZWxzZSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X25vdGljZV8sCi0JCQkgKCIjIyMgeG1pdGZyYW1lX2h3ZW5jcnlwdFxuIikpOworCQkJICIjIyMgeG1pdGZyYW1lX2h3ZW5jcnlwdFxuIik7CiAJfQogCiAJcmV0dXJuIF9TVUNDRVNTOwpAQCAtOTE2LDcgKzkwNSw5IEBACiAJCQkJcW9zX29wdGlvbiA9IHRydWU7CiAJCX0KIAkJZWxzZSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLCAoImZ3X3N0YXRlOiV4IGlzIG5vdCBhbGxvd2VkIHRvIHhtaXQgZnJhbWVcbiIsIGdldF9md3N0YXRlKHBtbG1lcHJpdikpKTsKKwkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCisJCQkJICJmd19zdGF0ZToleCBpcyBub3QgYWxsb3dlZCB0byB4bWl0IGZyYW1lXG4iLAorCQkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKIAkJCXJlcyA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CkBAIC0xMTE3LDcgKzExMDgsNyBAQAogCiAJaWYgKHJ0d19tYWtlX3dsYW5oZHIocGFkYXB0ZXIsIG1lbV9zdGFydCwgcGF0dHJpYikgPT0gX0ZBSUwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywKLQkJCSAoIiVzOiBydHdfbWFrZV93bGFuaGRyIGZhaWw7IGRyb3AgcGt0XG4iLCBfX2Z1bmNfXykpOworCQkJICIlczogcnR3X21ha2Vfd2xhbmhkciBmYWlsOyBkcm9wIHBrdFxuIiwgX19mdW5jX18pOwogCQlyZXMgPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KQEAgLTExNzIsMTEgKzExNjMsMTAgQEAKIAkJCW1lbWNweShwZnJhbWUsIHBhdHRyaWItPml2LCBwYXR0cmliLT5pdl9sZW4pOwogCiAJCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9ub3RpY2VfLAotCQkJCSAoInJ0d194bWlhZnJhbWVfY29hbGVzY2UyM2E6IGtleWlkID0lZCBwYXR0cmliIgotCQkJCSAgIi0+aXZbM109JS4yeCBwZnJhbWUgPSUuMnggJS4yeCAlLjJ4ICUuMnhcbiIsCi0JCQkJICBwYWRhcHRlci0+c2VjdXJpdHlwcml2LmRvdDExUHJpdmFjeUtleUluZGV4LAotCQkJCSAgcGF0dHJpYi0+aXZbM10sICpwZnJhbWUsICoocGZyYW1lKzEpLAotCQkJCSAgKihwZnJhbWUrMiksICoocGZyYW1lKzMpKSk7CisJCQkJICJydHdfeG1pYWZyYW1lX2NvYWxlc2NlMjNhOiBrZXlpZCA9JWQgcGF0dHJpYi0+aXZbM109JS4yeCBwZnJhbWUgPSUuMnggJS4yeCAlLjJ4ICUuMnhcbiIsCisJCQkJIHBhZGFwdGVyLT5zZWN1cml0eXByaXYuZG90MTFQcml2YWN5S2V5SW5kZXgsCisJCQkJIHBhdHRyaWItPml2WzNdLCAqcGZyYW1lLCAqKHBmcmFtZSsxKSwKKwkJCQkgKihwZnJhbWUrMiksICoocGZyYW1lKzMpKTsKIAkJCXBmcmFtZSArPSBwYXR0cmliLT5pdl9sZW47CiAJCQltcGR1X2xlbiAtPSBwYXR0cmliLT5pdl9sZW47CiAJCX0KQEAgLTEyMjMsOCArMTIxMyw4IEBACiAJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiJXM6IFRoZXJlJ3JlIHN0aWxsIHNvbWV0aGluZyBpbiBwYWNrZXQhXG4iLAotCQkJCSAgX19mdW5jX18pKTsKKwkJCQkgIiVzOiBUaGVyZSdyZSBzdGlsbCBzb21ldGhpbmcgaW4gcGFja2V0IVxuIiwKKwkJCQkgX19mdW5jX18pOwogCQl9CiAJCWhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9NT1JFRlJBR1MpOwogCkBAIC0xMjM0LDcgKzEyMjQsNyBAQAogCiAJaWYgKHhtaXRmcmFtZV9hZGRtaWMocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpID09IF9GQUlMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJ4bWl0ZnJhbWVfYWRkbWljKHBhZGFwdGVyLCBweG1pdGZyYW1lKSA9PSBfRkFJTFxuIikpOworCQkJICJ4bWl0ZnJhbWVfYWRkbWljKHBhZGFwdGVyLCBweG1pdGZyYW1lKSA9PSBfRkFJTFxuIik7CiAJCURCR184NzIzQSgieG1pdGZyYW1lX2FkZG1pYyhwYWRhcHRlciwgcHhtaXRmcmFtZSkgPT0gX0ZBSUxcbiIpOwogCQlyZXMgPSBfRkFJTDsKIAkJZ290byBleGl0OwpAQCAtMTQ2Miw4ICsxNDUyLDggQEAKIAogCWlmIChsaXN0X2VtcHR5KCZwZnJlZV94bWl0X3F1ZXVlLT5xdWV1ZSkpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJydHdfYWxsb2NfeG1pdGZyYW1lOiVkXG4iLAotCQkJICBweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCkpOworCQkJICJydHdfYWxsb2NfeG1pdGZyYW1lOiVkXG4iLAorCQkJIHB4bWl0cHJpdi0+ZnJlZV94bWl0ZnJhbWVfY250KTsKIAkJcHhmcmFtZSA9ICBOVUxMOwogCX0gZWxzZSB7CiAJCXBoZWFkID0gZ2V0X2xpc3RfaGVhZChwZnJlZV94bWl0X3F1ZXVlKTsKQEAgLTE0NzUsOCArMTQ2NSw4IEBACiAJCWxpc3RfZGVsX2luaXQoJnB4ZnJhbWUtPmxpc3QpOwogCQlweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudC0tOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoInJ0d19hbGxvY194bWl0ZnJhbWUoKTpmcmVlX3htaXRmcmFtZV9jbnQgPSVkXG4iLAotCQkJICBweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCkpOworCQkJICJydHdfYWxsb2NfeG1pdGZyYW1lKCk6ZnJlZV94bWl0ZnJhbWVfY250ID0lZFxuIiwKKwkJCSBweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCk7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnBmcmVlX3htaXRfcXVldWUtPmxvY2spOwpAQCAtMTQ5NSw3ICsxNDg1LDkgQEAKIAlzcGluX2xvY2tfYmgoJnF1ZXVlLT5sb2NrKTsKIAogCWlmIChsaXN0X2VtcHR5KCZxdWV1ZS0+cXVldWUpKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAoInJ0d19hbGxvY194bWl0ZnJhbWUyM2FfZXh0OiVkXG4iLCBweG1pdHByaXYtPmZyZWVfeGZyYW1lX2V4dF9jbnQpKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCisJCQkgInJ0d19hbGxvY194bWl0ZnJhbWUyM2FfZXh0OiVkXG4iLAorCQkJIHB4bWl0cHJpdi0+ZnJlZV94ZnJhbWVfZXh0X2NudCk7CiAJCXB4ZnJhbWUgPSAgTlVMTDsKIAl9IGVsc2UgewogCQlwaGVhZCA9IGdldF9saXN0X2hlYWQocXVldWUpOwpAQCAtMTUwNCw3ICsxNDk2LDkgQEAKIAogCQlsaXN0X2RlbF9pbml0KCZweGZyYW1lLT5saXN0KTsKIAkJcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250LS07Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAoInJ0d19hbGxvY194bWl0ZnJhbWUyM2FfZXh0KCk6ZnJlZV94bWl0ZnJhbWVfY250ID0lZFxuIiwgcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250KSk7CisJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAorCQkJICJydHdfYWxsb2NfeG1pdGZyYW1lMjNhX2V4dCgpOmZyZWVfeG1pdGZyYW1lX2NudCA9JWRcbiIsCisJCQkgcHhtaXRwcml2LT5mcmVlX3hmcmFtZV9leHRfY250KTsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcXVldWUtPmxvY2spOwpAQCAtMTUyMSw3ICsxNTE1LDggQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqcG5kaXNfcGt0ID0gTlVMTDsKIAogCWlmIChweG1pdGZyYW1lID09IE5VTEwpIHsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZXJyXywgKCI9PT09PT0gcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKCk6cHhtaXRmcmFtZSA9PSBOVUxMISEhISEhISEhIVxuIikpOworCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAorCQkJICI9PT09PT0gcnR3X2ZyZWVfeG1pdGZyYW1lMjNhKCk6cHhtaXRmcmFtZSA9PSBOVUxMISEhISEhISEhIVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTE1NDMsMTAgKzE1MzgsMTQgQEAKIAlsaXN0X2FkZF90YWlsKCZweG1pdGZyYW1lLT5saXN0LCBnZXRfbGlzdF9oZWFkKHF1ZXVlKSk7CiAJaWYgKHB4bWl0ZnJhbWUtPmV4dF90YWcgPT0gMCkgewogCQlweG1pdHByaXYtPmZyZWVfeG1pdGZyYW1lX2NudCsrOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9kZWJ1Z18sICgicnR3X2ZyZWVfeG1pdGZyYW1lMjNhKCk6ZnJlZV94bWl0ZnJhbWVfY250ID0lZFxuIiwgcHhtaXRwcml2LT5mcmVlX3htaXRmcmFtZV9jbnQpKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZGVidWdfLAorCQkJICJydHdfZnJlZV94bWl0ZnJhbWUyM2EoKTpmcmVlX3htaXRmcmFtZV9jbnQgPSVkXG4iLAorCQkJIHB4bWl0cHJpdi0+ZnJlZV94bWl0ZnJhbWVfY250KTsKIAl9IGVsc2UgaWYgKHB4bWl0ZnJhbWUtPmV4dF90YWcgPT0gMSkgewogCQlweG1pdHByaXYtPmZyZWVfeGZyYW1lX2V4dF9jbnQrKzsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZGVidWdfLCAoInJ0d19mcmVlX3htaXRmcmFtZTIzYSgpOmZyZWVfeGZyYW1lX2V4dF9jbnQgPSVkXG4iLCBweG1pdHByaXYtPmZyZWVfeGZyYW1lX2V4dF9jbnQpKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfZGVidWdfLAorCQkJICJydHdfZnJlZV94bWl0ZnJhbWUyM2EoKTpmcmVlX3hmcmFtZV9leHRfY250ID0lZFxuIiwKKwkJCSBweG1pdHByaXYtPmZyZWVfeGZyYW1lX2V4dF9jbnQpOwogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+bG9jayk7CkBAIC0xNTg1LDggKzE1ODQsNyBAQAogewogCWlmIChydHdfeG1pdDIzYV9jbGFzc2lmaWVyKHBhZGFwdGVyLCBweG1pdGZyYW1lKSA9PSBfRkFJTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9lcnJfLAotCQkJICgicnR3X3htaXRmcmFtZV9lbnF1ZXVlMjNhOiBkcm9wIHhtaXQgcGt0IGZvciAiCi0JCQkgICJjbGFzc2lmaWVyIGZhaWxcbiIpKTsKKwkJCSAicnR3X3htaXRmcmFtZV9lbnF1ZXVlMjNhOiBkcm9wIHhtaXQgcGt0IGZvciBjbGFzc2lmaWVyIGZhaWxcbiIpOwogCQlyZXR1cm4gX0ZBSUw7CiAJfQogCkBAIC0xNjc1LDI2ICsxNjczLDMwIEBACiAJY2FzZSAyOgogCQlwdHhzZXJ2cSA9ICZwc3RhLT5zdGFfeG1pdHByaXYuYmtfcTsKIAkJKihhYykgPSAzOwotCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgKCJydHdfZ2V0X3N0YV9wZW5kaW5nMjNhIDogQktcbiIpKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCisJCQkgInJ0d19nZXRfc3RhX3BlbmRpbmcyM2EgOiBCS1xuIik7CiAJCWJyZWFrOwogCWNhc2UgNDoKIAljYXNlIDU6CiAJCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi52aV9xOwogCQkqKGFjKSA9IDE7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAoInJ0d19nZXRfc3RhX3BlbmRpbmcyM2EgOiBWSVxuIikpOworCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKKwkJCSAicnR3X2dldF9zdGFfcGVuZGluZzIzYSA6IFZJXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSA2OgogCWNhc2UgNzoKIAkJcHR4c2VydnEgPSAmcHN0YS0+c3RhX3htaXRwcml2LnZvX3E7CiAJCSooYWMpID0gMDsKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sICgicnR3X2dldF9zdGFfcGVuZGluZzIzYSA6IFZPXG4iKSk7CisJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAorCQkJICJydHdfZ2V0X3N0YV9wZW5kaW5nMjNhIDogVk9cbiIpOwogCQlicmVhazsKIAljYXNlIDA6CiAJY2FzZSAzOgogCWRlZmF1bHQ6CiAJCXB0eHNlcnZxID0gJnBzdGEtPnN0YV94bWl0cHJpdi5iZV9xOwogCQkqKGFjKSA9IDI7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLCAoInJ0d19nZXRfc3RhX3BlbmRpbmcyM2EgOiBCRVxuIikpOworCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKKwkJCSAicnR3X2dldF9zdGFfcGVuZGluZzIzYSA6IEJFXG4iKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiBwdHhzZXJ2cTsKQEAgLTE3MjUsNyArMTcyNyw3IEBACiAJCXJlcyA9IF9GQUlMOwogCQlEQkdfODcyM0EoInJ0d194bWl0MjNhX2NsYXNzaWZpZXI6IHBzdGEgPT0gTlVMTFxuIik7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJydHdfeG1pdDIzYV9jbGFzc2lmaWVyOiBwc3RhID09IE5VTExcbiIpKTsKKwkJCSAicnR3X3htaXQyM2FfY2xhc3NpZmllcjogcHN0YSA9PSBOVUxMXG4iKTsKIAkJZ290byBleGl0OwogCX0KIAlpZiAoIShwc3RhLT5zdGF0ZSAmIF9GV19MSU5LRUQpKSB7CkBAIC0xODc2LDE0ICsxODc4LDE1IEBACiAKIAlpZiAocHhtaXRmcmFtZSA9PSBOVUxMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfeG1pdF9vc2RlcF9jXywgX2Rydl9lcnJfLAotCQkJICgicnR3X3htaXQyM2E6IG5vIG1vcmUgcHhtaXRmcmFtZVxuIikpOworCQkJICJydHdfeG1pdDIzYTogbm8gbW9yZSBweG1pdGZyYW1lXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAogCXJlcyA9IHVwZGF0ZV9hdHRyaWIocGFkYXB0ZXIsIHNrYiwgJnB4bWl0ZnJhbWUtPmF0dHJpYik7CiAKIAlpZiAocmVzID09IF9GQUlMKSB7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfeG1pdF9vc2RlcF9jXywgX2Rydl9lcnJfLCAoInJ0d194bWl0MjNhOiB1cGRhdGUgYXR0cmliIGZhaWxcbiIpKTsKKwkJUlRfVFJBQ0UoX21vZHVsZV94bWl0X29zZGVwX2NfLCBfZHJ2X2Vycl8sCisJCQkgInJ0d194bWl0MjNhOiB1cGRhdGUgYXR0cmliIGZhaWxcbiIpOwogCQlydHdfZnJlZV94bWl0ZnJhbWUyM2EocHhtaXRwcml2LCBweG1pdGZyYW1lKTsKIAkJcmV0dXJuIC0xOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbERNT3V0U3JjODcyM0FfQ0UuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbERNT3V0U3JjODcyM0FfQ0UuYwppbmRleCAxNzlhMWJhLi4zZjllYzllMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsRE1PdXRTcmM4NzIzQV9DRS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbERNT3V0U3JjODcyM0FfQ0UuYwpAQCAtMjMsOSArMjMsOCBAQAogI2RlZmluZQkJRFBLX0RFTFRBX01BUFBJTkdfTlVNCTEzCiAjZGVmaW5lCQlpbmRleF9tYXBwaW5nX0hQX05VTQkxNQogLyogMDkxMjEyIGNoaXlva29saW4gKi8KLXN0YXRpYwl2b2lkCi1vZG1fVFhQb3dlclRyYWNraW5nQ2FsbGJhY2tfVGhlcm1hbE1ldGVyXzkyQygKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCitzdGF0aWMgdm9pZAorb2RtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RoZXJtYWxNZXRlcl85MkMoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQogewogCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAJc3RydWN0IGRtX3ByaXYgKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKQEAgLTM1LDcgKzM0LDYgQEAKIAlzOCBPRkRNX2luZGV4WzJdLCBDQ0tfaW5kZXggPSAwLCBPRkRNX2luZGV4X29sZFsyXSA9IHswfTsKIAlzOCBDQ0tfaW5kZXhfb2xkID0gMDsKIAlpbnQgaSA9IDA7Ci0JYm9vbCBpczJUID0gSVNfOTJDX1NFUklBTChwSGFsRGF0YS0+VmVyc2lvbklEKTsKIAl1OCBPRkRNX21pbl9pbmRleCA9IDYsIHJmOyAvKiBPRkRNIEJCIFN3aW5nIHNob3VsZCBiZSBsZXNzIHRoYW4gKzMuMGRCKi8KIAl1OCBUaGVybWFsVmFsdWVfSFBfY291bnQgPSAwOwogCXUzMiBUaGVybWFsVmFsdWVfSFAgPSAwOwpAQCAtNjAsMTUgKzU4LDE1IEBACiAJcnRsODcyM2FfcGh5X2FwX2NhbGlicmF0ZShBZGFwdGVyLCAoVGhlcm1hbFZhbHVlIC0KIAkJCQkgIHBIYWxEYXRhLT5FRVBST01UaGVybWFsTWV0ZXIpKTsKIAotCWlmIChpczJUKQorCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKQogCQlyZiA9IDI7CiAJZWxzZQogCQlyZiA9IDE7CiAKIAlpZiAoVGhlcm1hbFZhbHVlKSB7CiAJCS8qIFF1ZXJ5IE9GRE0gcGF0aCBBIGRlZmF1bHQgc2V0dGluZwkgKi8KLQkJZWxlX0QgPSBQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAotCQkJCSAgICAgICBiTWFza0RXb3JkKSZiTWFza09GRE1fRDsKKwkJZWxlX0QgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UpICYKKwkJCWJNYXNrT0ZETV9EOwogCQlmb3IgKGkgPSAwOyBpIDwgT0ZETV9UQUJMRV9TSVpFXzkyQzsgaSsrKSB7CiAJCQkvKiBmaW5kIHRoZSBpbmRleCAqLwogCQkJaWYgKGVsZV9EID09IChPRkRNU3dpbmdUYWJsZTIzQVtpXSZiTWFza09GRE1fRCkpIHsKQEAgLTc4LDkgKzc2LDEwIEBACiAJCX0KIAogCQkvKiBRdWVyeSBPRkRNIHBhdGggQiBkZWZhdWx0IHNldHRpbmcgICovCi0JCWlmIChpczJUKSB7Ci0JCQllbGVfRCA9IFBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UsCi0JCQkJCSAgICAgICBiTWFza0RXb3JkKSZiTWFza09GRE1fRDsKKwkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpIHsKKwkJCWVsZV9EID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLAorCQkJCQkJIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UpOworCQkJZWxlX0QgJj0gYk1hc2tPRkRNX0Q7CiAJCQlmb3IgKGkgPSAwOyBpIDwgT0ZETV9UQUJMRV9TSVpFXzkyQzsgaSsrKSB7CS8qIGZpbmQgdGhlIGluZGV4ICAqLwogCQkJCWlmIChlbGVfRCA9PSAoT0ZETVN3aW5nVGFibGUyM0FbaV0mYk1hc2tPRkRNX0QpKSB7CiAJCQkJCU9GRE1faW5kZXhfb2xkWzFdID0gKHU4KWk7CkBAIC05MCw4ICs4OSw3IEBACiAJCX0KIAogCQkvKiBRdWVyeSBDQ0sgZGVmYXVsdCBzZXR0aW5nIEZyb20gMHhhMjQgKi8KLQkJVGVtcENDayA9IFBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHJDQ0swX1R4RmlsdGVyMiwKLQkJCQkJIGJNYXNrRFdvcmQpJmJNYXNrQ0NLOworCQlUZW1wQ0NrID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByQ0NLMF9UeEZpbHRlcjIpICYgYk1hc2tDQ0s7CiAJCWZvciAoaSA9IDAgOyBpIDwgQ0NLX1RBQkxFX1NJWkUgOyBpKyspIHsKIAkJCWlmIChwZG1wcml2LT5iQ0NLaW5DSDE0KSB7CiAJCQkJaWYgKCFtZW1jbXAoJlRlbXBDQ2ssCkBAIC0yMjQsMTIgKzIyMiwxMyBAQAogCQkJfQogCiAJCQlpZiAoQ0NLX2luZGV4ID4gKENDS19UQUJMRV9TSVpFLTEpKQotCQkJCUNDS19pbmRleCA9IChDQ0tfVEFCTEVfU0laRS0xKTsKKwkJCQlDQ0tfaW5kZXggPSBDQ0tfVEFCTEVfU0laRS0xOwogCQkJZWxzZSBpZiAoQ0NLX2luZGV4IDwgMCkKIAkJCQlDQ0tfaW5kZXggPSAwOwogCQl9CiAKLQkJaWYgKHBkbXByaXYtPlR4UG93ZXJUcmFja0NvbnRyb2wgJiYgKGRlbHRhICE9IDAgfHwgZGVsdGFfSFAgIT0gMCkpIHsKKwkJaWYgKHBkbXByaXYtPlR4UG93ZXJUcmFja0NvbnRyb2wgJiYKKwkJICAgIChkZWx0YSAhPSAwIHx8IGRlbHRhX0hQICE9IDApKSB7CiAJCQkvKiBBZHVqc3QgT0ZETSBBbnRfQSBhY2NvcmRpbmcgdG8gSVFLIHJlc3VsdCAqLwogCQkJZWxlX0QgPSAoT0ZETVN3aW5nVGFibGUyM0FbT0ZETV9pbmRleFswXV0gJiAweEZGQzAwMDAwKT4+MjI7CiAJCQlYID0gcGRtcHJpdi0+UmVnRTk0OwpAQCAtMjQ3LDcgKzI0Niw5IEBACiAKIAkJCQkvKiB3cml0ZSBuZXcgZWxlbWVudHMgQSwgQywgRCB0byByZWdDODAgYW5kIHJlZ0M5NCwgZWxlbWVudCBCIGlzIGFsd2F5cyAwICovCiAJCQkJdmFsdWUzMiA9IChlbGVfRDw8MjIpfCgoZWxlX0MmMHgzRik8PDE2KXxlbGVfQTsKLQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgYk1hc2tEV29yZCwgdmFsdWUzMik7CisJCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwKKwkJCQkJCSAgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKKwkJCQkJCSAgdmFsdWUzMik7CiAKIAkJCQl2YWx1ZTMyID0gKGVsZV9DJjB4MDAwMDAzQzApPj42OwogCQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByT0ZETTBfWENUeEFGRSwgYk1hc2tINEJpdHMsIHZhbHVlMzIpOwpAQCAtMjYwLDkgKzI2MSw5IEBACiAJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLAogCQkJCQkgICAgIEJJVCgyOSksIHZhbHVlMzIpOwogCQkJfSBlbHNlIHsKLQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwKLQkJCQkJICAgICBiTWFza0RXb3JkLAotCQkJCQkgICAgIE9GRE1Td2luZ1RhYmxlMjNBW09GRE1faW5kZXhbMF1dKTsKKwkJCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLAorCQkJCQkJICByT0ZETTBfWEFUeElRSW1iYWxhbmNlLAorCQkJCQkJICBPRkRNU3dpbmdUYWJsZTIzQVtPRkRNX2luZGV4WzBdXSk7CiAJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9YQ1R4QUZFLAogCQkJCQkgICAgIGJNYXNrSDRCaXRzLCAweDAwKTsKIAkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX0VDQ0FUaHJlc2hvbGQsCkBAIC0yOTAsNyArMjkxLDcgQEAKIAkJCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4YTI5LCBDQ0tTd2luZ1RhYmxlX0NoMTQyM0FbQ0NLX2luZGV4XVs3XSk7CiAJCQl9CiAKLQkJCWlmIChpczJUKSB7CisJCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikgewogCQkJCWVsZV9EID0gKE9GRE1Td2luZ1RhYmxlMjNBWyh1OClPRkRNX2luZGV4WzFdXSAmIDB4RkZDMDAwMDApPj4yMjsKIAogCQkJCS8qIG5ldyBlbGVtZW50IEEgPSBlbGVtZW50IEQgeCBYICovCkBAIC0zMDksNyArMzEwLDcgQEAKIAogCQkJCQkvKiB3cml0ZSBuZXcgZWxlbWVudHMgQSwgQywgRCB0byByZWdDODggYW5kIHJlZ0M5QywgZWxlbWVudCBCIGlzIGFsd2F5cyAwICovCiAJCQkJCXZhbHVlMzIgPSAoZWxlX0Q8PDIyKXwoKGVsZV9DJjB4M0YpPDwxNikgfCBlbGVfQTsKLQkJCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQsIHZhbHVlMzIpOworCQkJCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByT0ZETTBfWEJUeElRSW1iYWxhbmNlLCB2YWx1ZTMyKTsKIAogCQkJCQl2YWx1ZTMyID0gKGVsZV9DJjB4MDAwMDAzQzApPj42OwogCQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgck9GRE0wX1hEVHhBRkUsIGJNYXNrSDRCaXRzLCB2YWx1ZTMyKTsKQEAgLTMyNCwxMCArMzI1LDkgQEAKIAkJCQkJCSAgICAgck9GRE0wX0VDQ0FUaHJlc2hvbGQsCiAJCQkJCQkgICAgIEJJVCgyNSksIHZhbHVlMzIpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLAotCQkJCQkJICAgICByT0ZETTBfWEJUeElRSW1iYWxhbmNlLAotCQkJCQkJICAgICBiTWFza0RXb3JkLAotCQkJCQkJICAgICBPRkRNU3dpbmdUYWJsZTIzQVtPRkRNX2luZGV4WzFdXSk7CisJCQkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsCisJCQkJCQkJICByT0ZETTBfWEJUeElRSW1iYWxhbmNlLAorCQkJCQkJCSAgT0ZETVN3aW5nVGFibGUyM0FbT0ZETV9pbmRleFsxXV0pOwogCQkJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwKIAkJCQkJCSAgICAgck9GRE0wX1hEVHhBRkUsCiAJCQkJCQkgICAgIGJNYXNrSDRCaXRzLCAweDAwKTsKQEAgLTM2MSwxNCArMzYxLDEwIEBACiAJb2RtX1RYUG93ZXJUcmFja2luZ0NhbGxiYWNrX1RoZXJtYWxNZXRlcl85MkMoQWRhcHRlcik7CiB9CiAKLXN0YXRpYyB2b2lkIG9kbV9DaGVja1RYUG93ZXJUcmFja2luZ19UaGVybWFsTWV0ZXIoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQordm9pZCBydGw4NzIzYV9vZG1fY2hlY2tfdHhfcG93ZXJfdHJhY2tpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQogewogCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAJc3RydWN0IGRtX3ByaXYgKnBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBvZG1wcml2ID0gJnBIYWxEYXRhLT5vZG1wcml2OwotCi0JaWYgKCEocG9kbXByaXYtPlN1cHBvcnRBYmlsaXR5ICYgT0RNX1JGX1RYX1BXUl9UUkFDSykpCi0JCXJldHVybjsKIAogCWlmICghcGRtcHJpdi0+VE1fVHJpZ2dlcikgewkJLyogYXQgbGVhc3QgZGVsYXkgMSBzZWMgKi8KIAkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQSwgUkZfVF9NRVRFUiwgYlJGUmVnT2Zmc2V0TWFzaywgMHg2MCk7CkBAIC0zODEsMTEgKzM3Nyw2IEBACiAJfQogfQogCi12b2lkIHJ0bDg3MjNhX29kbV9jaGVja190eF9wb3dlcl90cmFja2luZyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jb2RtX0NoZWNrVFhQb3dlclRyYWNraW5nX1RoZXJtYWxNZXRlcihBZGFwdGVyKTsKLX0KLQogLyoJSVFLICovCiAjZGVmaW5lIE1BWF9UT0xFUkFOQ0UJCTUKICNkZWZpbmUgSVFLX0RFTEFZX1RJTUUJCTEJLyogbXMgKi8KQEAgLTM5NywzNiArMzg4LDM3IEBACiAJc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CiAKIAkvKiBwYXRoLUEgSVFLIHNldHRpbmcgKi8KLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJUeF9JUUtfVG9uZV9BLCBiTWFza0RXb3JkLCAweDEwMDA4YzFmKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJSeF9JUUtfVG9uZV9BLCBiTWFza0RXb3JkLCAweDEwMDA4YzFmKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJUeF9JUUtfUElfQSwgYk1hc2tEV29yZCwgMHg4MjE0MDEwMik7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJUeF9JUUtfVG9uZV9BLCAweDEwMDA4YzFmKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRS19Ub25lX0EsIDB4MTAwMDhjMWYpOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1BJX0EsIDB4ODIxNDAxMDIpOwogCi0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByUnhfSVFLX1BJX0EsIGJNYXNrRFdvcmQsIGNvbmZpZ1BhdGhCID8gMHgyODE2MDIwMiA6CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJSeF9JUUtfUElfQSwgY29uZmlnUGF0aEIgPyAweDI4MTYwMjAyIDoKIAkJSVNfODF4eENfVkVORE9SX1VNQ19CX0NVVChwSGFsRGF0YS0+VmVyc2lvbklEKT8weDI4MTYwMjAyOjB4MjgxNjA1MDIpOwogCiAJLyogcGF0aC1CIElRSyBzZXR0aW5nICovCiAJaWYgKGNvbmZpZ1BhdGhCKSB7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgclR4X0lRS19Ub25lX0IsIGJNYXNrRFdvcmQsIDB4MTAwMDhjMjIpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJSeF9JUUtfVG9uZV9CLCBiTWFza0RXb3JkLCAweDEwMDA4YzIyKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByVHhfSVFLX1BJX0IsIGJNYXNrRFdvcmQsIDB4ODIxNDAxMDIpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJSeF9JUUtfUElfQiwgYk1hc2tEV29yZCwgMHgyODE2MDIwMik7CisJCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1RvbmVfQiwgMHgxMDAwOGMyMik7CisJCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByUnhfSVFLX1RvbmVfQiwgMHgxMDAwOGMyMik7CisJCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByVHhfSVFLX1BJX0IsIDB4ODIxNDAxMDIpOworCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgclJ4X0lRS19QSV9CLCAweDI4MTYwMjAyKTsKIAl9CiAKIAkvKiBMTyBjYWxpYnJhdGlvbiBzZXR0aW5nICovCi0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCBySVFLX0FHQ19Sc3AsIGJNYXNrRFdvcmQsIDB4MDAxMDI4ZDEpOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBySVFLX0FHQ19Sc3AsIDB4MDAxMDI4ZDEpOwogCiAJLyogT25lIHNob3QsIHBhdGggQSBMT0sgJiBJUUsgKi8KLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJJUUtfQUdDX1B0cywgYk1hc2tEV29yZCwgMHhmOTAwMDAwMCk7Ci0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCBySVFLX0FHQ19QdHMsIGJNYXNrRFdvcmQsIDB4ZjgwMDAwMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBySVFLX0FHQ19QdHMsIDB4ZjkwMDAwMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCBySVFLX0FHQ19QdHMsIDB4ZjgwMDAwMDApOwogCiAJLyogIGRlbGF5IHggbXMgKi8KLQl1ZGVsYXkoSVFLX0RFTEFZX1RJTUUqMTAwMCk7LyogUGxhdGZvcm1TdGFsbEV4ZWN1dGlvbihJUUtfREVMQVlfVElNRSoxMDAwKTsgKi8KKwkvKiBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKElRS19ERUxBWV9USU1FKjEwMDApOyAqLworCXVkZWxheShJUUtfREVMQVlfVElNRSoxMDAwKTsKIAogCS8qICBDaGVjayBmYWlsZWQgKi8KLQlyZWdFQUMgPSBQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19BXzIsIGJNYXNrRFdvcmQpOwotCXJlZ0U5NCA9IFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19BLCBiTWFza0RXb3JkKTsKLQlyZWdFOUMgPSBQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19BLCBiTWFza0RXb3JkKTsKLQlyZWdFQTQgPSBQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQV8yLCBiTWFza0RXb3JkKTsKKwlyZWdFQUMgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByUnhfUG93ZXJfQWZ0ZXJfSVFLX0FfMik7CisJcmVnRTk0ID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQSk7CisJcmVnRTlDID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19BKTsKKwlyZWdFQTQgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByUnhfUG93ZXJfQmVmb3JlX0lRS19BXzIpOwogCiAJaWYgKCEocmVnRUFDICYgQklUKDI4KSkgJiYKIAkgICAgKCgocmVnRTk0ICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDE0MikgJiYKQEAgLTQzNSw3ICs0MjcsNyBAQAogCWVsc2UJCQkvKiBpZiBUeCBub3QgT0ssIGlnbm9yZSBSeCAqLwogCQlyZXR1cm4gcmVzdWx0OwogCi0JaWYgKCEocmVnRUFDICYgQklUKDI3KSkgJiYJCS8qIGlmIFR4IGlzIE9LLCBjaGVjayB3aGV0aGVyIFJ4IGlzIE9LICovCisJaWYgKCEocmVnRUFDICYgQklUKDI3KSkgJiYgLyogaWYgVHggaXMgT0ssIGNoZWNrIHdoZXRoZXIgUnggaXMgT0sgKi8KIAkgICAgKCgocmVnRUE0ICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDEzMikgJiYKIAkgICAgKCgocmVnRUFDICYgMHgwM0ZGMDAwMCk+PjE2KSAhPSAweDM2KSkKIAkJcmVzdWx0IHw9IDB4MDI7CkBAIC00NTAsMTggKzQ0MiwxOCBAQAogCXU4IHJlc3VsdCA9IDB4MDA7CiAKIAkvKiBPbmUgc2hvdCwgcGF0aCBCIExPSyAmIElRSyAqLwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgcklRS19BR0NfQ29udCwgYk1hc2tEV29yZCwgMHgwMDAwMDAwMik7Ci0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCBySVFLX0FHQ19Db250LCBiTWFza0RXb3JkLCAweDAwMDAwMDAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgcklRS19BR0NfQ29udCwgMHgwMDAwMDAwMik7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJJUUtfQUdDX0NvbnQsIDB4MDAwMDAwMDApOwogCiAJLyogIGRlbGF5IHggbXMgKi8KIAl1ZGVsYXkoSVFLX0RFTEFZX1RJTUUqMTAwMCk7CiAKIAkvKiAgQ2hlY2sgZmFpbGVkICovCi0JcmVnRUFDID0gUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQV8yLCBiTWFza0RXb3JkKTsKLQlyZWdFQjQgPSBQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQiwgYk1hc2tEV29yZCk7Ci0JcmVnRUJDID0gUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQiwgYk1hc2tEV29yZCk7Ci0JcmVnRUM0ID0gUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJSeF9Qb3dlcl9CZWZvcmVfSVFLX0JfMiwgYk1hc2tEV29yZCk7Ci0JcmVnRUNDID0gUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQl8yLCBiTWFza0RXb3JkKTsKKwlyZWdFQUMgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByUnhfUG93ZXJfQWZ0ZXJfSVFLX0FfMik7CisJcmVnRUI0ID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQik7CisJcmVnRUJDID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19CKTsKKwlyZWdFQzQgPSBydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByUnhfUG93ZXJfQmVmb3JlX0lRS19CXzIpOworCXJlZ0VDQyA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJSeF9Qb3dlcl9BZnRlcl9JUUtfQl8yKTsKIAogCWlmICghKHJlZ0VBQyAmIEJJVCgzMSkpICYmCiAJICAgICgoKHJlZ0VCNCAmIDB4MDNGRjAwMDApPj4xNikgIT0gMHgxNDIpICYmCkBAIC00OTQsMjIgKzQ4NiwyNyBAQAogCWlmIChmaW5hbF9jYW5kaWRhdGUgPT0gMHhGRikgewogCQlyZXR1cm47CiAJfSBlbHNlIGlmIChiSVFLT0spIHsKLQkJT2xkdmFsXzAgPSAoUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQpID4+IDIyKSAmIDB4M0ZGOworCQlPbGR2YWxfMCA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJPRkRNMF9YQVR4SVFJbWJhbGFuY2UpOworCQlPbGR2YWxfMCA9IChPbGR2YWxfMCA+PiAyMikgJiAweDNGRjsKIAogCQlYID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bMF07CiAJCWlmICgoWCAmIDB4MDAwMDAyMDApICE9IDApCiAJCQlYID0gWCB8IDB4RkZGRkZDMDA7CiAJCVRYMF9BID0gKFggKiBPbGR2YWxfMCkgPj4gODsKIAkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEFUeElRSW1iYWxhbmNlLCAweDNGRiwgVFgwX0EpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCBCSVQoMzEpLCAoKFggKiBPbGR2YWxfMD4+NykgJiAweDEpKTsKKwkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgQklUKDMxKSwKKwkJCSAgICAgKChYICogT2xkdmFsXzA+PjcpICYgMHgxKSk7CiAKIAkJWSA9IHJlc3VsdFtmaW5hbF9jYW5kaWRhdGVdWzFdOwogCQlpZiAoKFkgJiAweDAwMDAwMjAwKSAhPSAwKQogCQkJWSA9IFkgfCAweEZGRkZGQzAwOwogCQlUWDBfQyA9IChZICogT2xkdmFsXzApID4+IDg7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hDVHhBRkUsIDB4RjAwMDAwMDAsICgoVFgwX0MmMHgzQzApPj42KSk7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgMHgwMDNGMDAwMCwgKFRYMF9DJjB4M0YpKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgQklUKDI5KSwgKChZICogT2xkdmFsXzA+PjcpICYgMHgxKSk7CisJCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hDVHhBRkUsIDB4RjAwMDAwMDAsCisJCQkgICAgICgoVFgwX0MmMHgzQzApPj42KSk7CisJCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hBVHhJUUltYmFsYW5jZSwgMHgwMDNGMDAwMCwKKwkJCSAgICAgKFRYMF9DJjB4M0YpKTsKKwkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgQklUKDI5KSwKKwkJCSAgICAgKChZICogT2xkdmFsXzA+PjcpICYgMHgxKSk7CiAKIAkJaWYgKGJUeE9ubHkpIHsKIAkJCURCR184NzIzQSgiX1BIWV9QYXRoQUZpbGxJUUtNYXRyaXggb25seSBUeCBPS1xuIik7CkBAIC01MzcsMjIgKzUzNCwyNyBAQAogCWlmIChmaW5hbF9jYW5kaWRhdGUgPT0gMHhGRikgewogCQlyZXR1cm47CiAJfSBlbHNlIGlmIChiSVFLT0spIHsKLQkJT2xkdmFsXzEgPSAoUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UsIGJNYXNrRFdvcmQpID4+IDIyKSAmIDB4M0ZGOworCQlPbGR2YWxfMSA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJPRkRNMF9YQlR4SVFJbWJhbGFuY2UpOworCQlPbGR2YWxfMSA9IChPbGR2YWxfMSA+PiAyMikgJiAweDNGRjsKIAogCQlYID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNF07CiAJCWlmICgoWCAmIDB4MDAwMDAyMDApICE9IDApCiAJCQlYID0gWCB8IDB4RkZGRkZDMDA7CiAJCVRYMV9BID0gKFggKiBPbGR2YWxfMSkgPj4gODsKIAkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEJUeElRSW1iYWxhbmNlLCAweDNGRiwgVFgxX0EpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCBCSVQoMjcpLCAoKFggKiBPbGR2YWxfMT4+NykgJiAweDEpKTsKKwkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfRUNDQVRocmVzaG9sZCwgQklUKDI3KSwKKwkJCSAgICAgKChYICogT2xkdmFsXzEgPj4gNykgJiAweDEpKTsKIAogCQlZID0gcmVzdWx0W2ZpbmFsX2NhbmRpZGF0ZV1bNV07CiAJCWlmICgoWSAmIDB4MDAwMDAyMDApICE9IDApCiAJCQlZID0gWSB8IDB4RkZGRkZDMDA7CiAJCVRYMV9DID0gKFkgKiBPbGR2YWxfMSkgPj4gODsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWERUeEFGRSwgMHhGMDAwMDAwMCwgKChUWDFfQyYweDNDMCk+PjYpKTsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWEJUeElRSW1iYWxhbmNlLCAweDAwM0YwMDAwLCAoVFgxX0MmMHgzRikpOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCBCSVQoMjUpLCAoKFkgKiBPbGR2YWxfMT4+NykgJiAweDEpKTsKKwkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByT0ZETTBfWERUeEFGRSwgMHhGMDAwMDAwMCwKKwkJCSAgICAgKChUWDFfQyAmIDB4M0MwKSA+PiA2KSk7CisJCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1hCVHhJUUltYmFsYW5jZSwgMHgwMDNGMDAwMCwKKwkJCSAgICAgKFRYMV9DICYgMHgzRikpOworCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJPRkRNMF9FQ0NBVGhyZXNob2xkLCBCSVQoMjUpLAorCQkJICAgICAoKFkgKiBPbGR2YWxfMSA+PiA3KSAmIDB4MSkpOwogCiAJCWlmIChiVHhPbmx5KQogCQkJcmV0dXJuOwpAQCAtNTczLDExICs1NzUsMTIgQEAKIAl1MzIgaTsKIAogCWZvciAoaSA9IDAgOyBpIDwgUmVnaXN0ZXJOdW0gOyBpKyspIHsKLQkJQUREQUJhY2t1cFtpXSA9IFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCBBRERBUmVnW2ldLCBiTWFza0RXb3JkKTsKKwkJQUREQUJhY2t1cFtpXSA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIEFEREFSZWdbaV0pOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX1BIWV9TYXZlTUFDUmVnaXN0ZXJzKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUzMiAqTUFDUmVnLCB1MzIgKk1BQ0JhY2t1cCkKK3N0YXRpYyB2b2lkIF9QSFlfU2F2ZU1BQ1JlZ2lzdGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgKk1BQ1JlZywKKwkJCQkgIHUzMiAqTUFDQmFja3VwKQogewogCXUzMiBpOwogCkBAIC01ODcsMTYgKzU5MCwxOSBAQAogCU1BQ0JhY2t1cFtpXSA9IHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIE1BQ1JlZ1tpXSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9QSFlfUmVsb2FkQUREQVJlZ2lzdGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCB1MzIgKkFEREFSZWcsIHUzMiAqQUREQUJhY2t1cCwgdTMyIFJlZ2llc3Rlck51bSkKK3N0YXRpYyB2b2lkIF9QSFlfUmVsb2FkQUREQVJlZ2lzdGVycyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLAorCQkJCSAgICAgdTMyICpBRERBUmVnLCB1MzIgKkFEREFCYWNrdXAsCisJCQkJICAgICB1MzIgUmVnaWVzdGVyTnVtKQogewogCXUzMiBpOwogCiAJZm9yIChpID0gMCA7IGkgPCBSZWdpZXN0ZXJOdW0gOyBpKyspIHsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCBBRERBUmVnW2ldLCBiTWFza0RXb3JkLCBBRERBQmFja3VwW2ldKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIEFEREFSZWdbaV0sIEFEREFCYWNrdXBbaV0pOwogCX0KIH0KIAotc3RhdGljIHZvaWQgX1BIWV9SZWxvYWRNQUNSZWdpc3RlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTMyICpNQUNSZWcsIHUzMiAqTUFDQmFja3VwKQorc3RhdGljIHZvaWQgX1BIWV9SZWxvYWRNQUNSZWdpc3RlcnMoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwKKwkJCQkgICAgdTMyICpNQUNSZWcsIHUzMiAqTUFDQmFja3VwKQogewogCXUzMiBpOwogCkBAIC02MDYsNyArNjEyLDggQEAKIAlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgTUFDUmVnW2ldLCBNQUNCYWNrdXBbaV0pOwogfQogCi1zdGF0aWMgdm9pZCBfUEhZX1BhdGhBRERBT24oc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlciwgdTMyICpBRERBUmVnLCBib29sIGlzUGF0aEFPbiwgYm9vbCBpczJUKQorc3RhdGljIHZvaWQgX1BIWV9QYXRoQUREQU9uKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUzMiAqQUREQVJlZywKKwkJCSAgICBib29sIGlzUGF0aEFPbiwgYm9vbCBpczJUKQogewogCXUzMiBwYXRoT247CiAJdTMyIGk7CkBAIC02MTQsMTYgKzYyMSwxNyBAQAogCXBhdGhPbiA9IGlzUGF0aEFPbiA/IDB4MDRkYjI1YTQgOiAweDBiMWIyNWE0OwogCWlmICghaXMyVCkgewogCQlwYXRoT24gPSAweDBiZGIyNWEwOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIEFEREFSZWdbMF0sIGJNYXNrRFdvcmQsIDB4MGIxYjI1YTApOworCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgQUREQVJlZ1swXSwgMHgwYjFiMjVhMCk7CiAJfSBlbHNlIHsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCBBRERBUmVnWzBdLCBiTWFza0RXb3JkLCBwYXRoT24pOworCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgQUREQVJlZ1swXSwgcGF0aE9uKTsKIAl9CiAKIAlmb3IgKGkgPSAxIDsgaSA8IElRS19BRERBX1JFR19OVU0gOyBpKyspCi0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgQUREQVJlZ1tpXSwgYk1hc2tEV29yZCwgcGF0aE9uKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIEFEREFSZWdbaV0sIHBhdGhPbik7CiB9CiAKLXN0YXRpYyB2b2lkIF9QSFlfTUFDU2V0dGluZ0NhbGlicmF0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUzMiAqTUFDUmVnLCB1MzIgKk1BQ0JhY2t1cCkKK3N0YXRpYyB2b2lkIF9QSFlfTUFDU2V0dGluZ0NhbGlicmF0aW9uKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsCisJCQkJICAgICAgIHUzMiAqTUFDUmVnLCB1MzIgKk1BQ0JhY2t1cCkKIHsKIAl1MzIgaSA9IDA7CiAKQEAgLTYzOCw5ICs2NDYsOSBAQAogCiBzdGF0aWMgdm9pZCBfUEhZX1BhdGhBU3RhbmRCeShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyKQogewotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX0lRSywgYk1hc2tEV29yZCwgMHgwKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIDB4ODQwLCBiTWFza0RXb3JkLCAweDAwMDEwMDAwKTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9JUUssIGJNYXNrRFdvcmQsIDB4ODA4MDAwMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByRlBHQTBfSVFLLCAweDApOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCAweDg0MCwgMHgwMDAxMDAwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4ODA4MDAwMDApOwogfQogCiBzdGF0aWMgdm9pZCBfUEhZX1BJTW9kZVN3aXRjaChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyLCBib29sIFBJTW9kZSkKQEAgLTY0OCw4ICs2NTYsOCBAQAogCXUzMiBtb2RlOwogCiAJbW9kZSA9IFBJTW9kZSA/IDB4MDEwMDAxMDAgOiAweDAxMDAwMDAwOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgMHg4MjAsIGJNYXNrRFdvcmQsIG1vZGUpOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgMHg4MjgsIGJNYXNrRFdvcmQsIG1vZGUpOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCAweDgyMCwgbW9kZSk7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIDB4ODI4LCBtb2RlKTsKIH0KIAogLyoKQEAgLTY2MCw5ICs2NjgsOSBAQAogCXUzMiBpLCBqLCBkaWZmLCBTaW11bGFyaXR5Qml0TWFwLCBib3VuZCA9IDA7CiAJc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShwQWRhcHRlcik7CiAJdTggZmluYWxfY2FuZGlkYXRlWzJdID0gezB4RkYsIDB4RkZ9OwkvKiBmb3IgcGF0aCBBIGFuZCBwYXRoIEIgKi8KLQlib29sIGJSZXN1bHQgPSB0cnVlLCBpczJUID0gSVNfOTJDX1NFUklBTChwSGFsRGF0YS0+VmVyc2lvbklEKTsKKwlib29sIGJSZXN1bHQgPSB0cnVlOwogCi0JaWYgKGlzMlQpCisJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIpCiAJCWJvdW5kID0gODsKIAllbHNlCiAJCWJvdW5kID0gNDsKQEAgLTY5OSw3ICs3MDcsNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQkJcmVzdWx0WzNdW2ldID0gcmVzdWx0W2MxXVtpXTsKIAkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZSBpZiAoIShTaW11bGFyaXR5Qml0TWFwICYgMHhGMCkgJiYgaXMyVCkgeworCX0gZWxzZSBpZiAoIShTaW11bGFyaXR5Qml0TWFwICYgMHhGMCkgJiYgcEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikgewogCQkvKiBwYXRoIEIgT0sgKi8KIAkJZm9yIChpID0gNDsgaSA8IDg7IGkrKykKIAkJCXJlc3VsdFszXVtpXSA9IHJlc3VsdFtjMV1baV07CkBAIC03NDYsNyArNzU0LDcgQEAKIAl1MzIgYmJ2YWx1ZTsKIAogCWlmICh0ID09IDApIHsKLQkJYmJ2YWx1ZSA9IFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByRlBHQTBfUkZNT0QsIGJNYXNrRFdvcmQpOworCQliYnZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgckZQR0EwX1JGTU9EKTsKIAogCQkvKiAgU2F2ZSBBRERBIHBhcmFtZXRlcnMsIHR1cm4gUGF0aCBBIEFEREEgb24gKi8KIAkJX1BIWV9TYXZlQUREQVJlZ2lzdGVycyhwQWRhcHRlciwgQUREQV9SRUcsIHBkbXByaXYtPkFEREFfYmFja3VwLCBJUUtfQUREQV9SRUdfTlVNKTsKQEAgLTc2Niw0OCArNzc0LDUwIEBACiAJfQogCiAJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfUkZNT0QsIEJJVCgyNCksIDB4MDApOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1RSeFBhdGhFbmFibGUsIGJNYXNrRFdvcmQsIDB4MDNhMDU2MDApOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgck9GRE0wX1RSTXV4UGFyLCBiTWFza0RXb3JkLCAweDAwMDgwMGU0KTsKLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVywgYk1hc2tEV29yZCwgMHgyMjIwNDAwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLCAweDAzYTA1NjAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgck9GRE0wX1RSTXV4UGFyLCAweDAwMDgwMGU0KTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXLCAweDIyMjA0MDAwKTsKIAlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZJbnRlcmZhY2VTVywgQklUKDEwKSwgMHgwMSk7CiAJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfWEFCX1JGSW50ZXJmYWNlU1csIEJJVCgyNiksIDB4MDEpOwogCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIEJJVCgxMCksIDB4MDApOwogCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hCX1JGSW50ZXJmYWNlT0UsIEJJVCgxMCksIDB4MDApOwogCiAJaWYgKGlzMlQpIHsKLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfWEFfTFNTSVBhcmFtZXRlciwgYk1hc2tEV29yZCwgMHgwMDAxMDAwMCk7Ci0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckZQR0EwX1hCX0xTU0lQYXJhbWV0ZXIsIGJNYXNrRFdvcmQsIDB4MDAwMTAwMDApOworCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwKKwkJCQkgIHJGUEdBMF9YQV9MU1NJUGFyYW1ldGVyLCAweDAwMDEwMDAwKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsCisJCQkJICByRlBHQTBfWEJfTFNTSVBhcmFtZXRlciwgMHgwMDAxMDAwMCk7CiAJfQogCiAJLyogTUFDIHNldHRpbmdzICovCiAJX1BIWV9NQUNTZXR0aW5nQ2FsaWJyYXRpb24ocEFkYXB0ZXIsIElRS19NQUNfUkVHLCBwZG1wcml2LT5JUUtfTUFDX2JhY2t1cCk7CiAKIAkvKiBQYWdlIEIgaW5pdCAqLwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgckNvbmZpZ19BbnRBLCBiTWFza0RXb3JkLCAweDAwMDgwMDAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckNvbmZpZ19BbnRBLCAweDAwMDgwMDAwKTsKIAogCWlmIChpczJUKQotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJDb25maWdfQW50QiwgYk1hc2tEV29yZCwgMHgwMDA4MDAwMCk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByQ29uZmlnX0FudEIsIDB4MDAwODAwMDApOwogCiAJLyogIElRIGNhbGlicmF0aW9uIHNldHRpbmcgKi8KLQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJGUEdBMF9JUUssIGJNYXNrRFdvcmQsIDB4ODA4MDAwMDApOwotCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgclR4X0lRSywgYk1hc2tEV29yZCwgMHgwMTAwN2MwMCk7Ci0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByUnhfSVFLLCBiTWFza0RXb3JkLCAweDAxMDA0ODAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckZQR0EwX0lRSywgMHg4MDgwMDAwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJUeF9JUUssIDB4MDEwMDdjMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLCByUnhfSVFLLCAweDAxMDA0ODAwKTsKIAogCWZvciAoaSA9IDAgOyBpIDwgcmV0cnlDb3VudCA7IGkrKykgewogCQlQYXRoQU9LID0gX1BIWV9QYXRoQV9JUUsocEFkYXB0ZXIsIGlzMlQpOwogCQlpZiAoUGF0aEFPSyA9PSAweDAzKSB7CiAJCQkJREJHXzg3MjNBKCJQYXRoIEEgSVFLIFN1Y2Nlc3MhIVxuIik7Ci0JCQkJcmVzdWx0W3RdWzBdID0gKFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19BLCBiTWFza0RXb3JkKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bMV0gPSAoUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQSwgYk1hc2tEV29yZCkmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzJdID0gKFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByUnhfUG93ZXJfQmVmb3JlX0lRS19BXzIsIGJNYXNrRFdvcmQpJjB4M0ZGMDAwMCk+PjE2OwotCQkJCXJlc3VsdFt0XVszXSA9IChQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19BXzIsIGJNYXNrRFdvcmQpJjB4M0ZGMDAwMCk+PjE2OworCQkJCXJlc3VsdFt0XVswXSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19BKSYweDNGRjAwMDApPj4xNjsKKwkJCQlyZXN1bHRbdF1bMV0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19BKSYweDNGRjAwMDApPj4xNjsKKwkJCQlyZXN1bHRbdF1bMl0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQV8yKSYweDNGRjAwMDApPj4xNjsKKwkJCQlyZXN1bHRbdF1bM10gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19BXzIpJjB4M0ZGMDAwMCk+PjE2OwogCQkJYnJlYWs7CiAJCX0gZWxzZSBpZiAoaSA9PSAocmV0cnlDb3VudC0xKSAmJiBQYXRoQU9LID09IDB4MDEpIHsKIAkJCS8qIFR4IElRSyBPSyAqLwogCQkJREJHXzg3MjNBKCJQYXRoIEEgSVFLIE9ubHkgIFR4IFN1Y2Nlc3MhIVxuIik7CiAKLQkJCXJlc3VsdFt0XVswXSA9IChQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQSwgYk1hc2tEV29yZCkmMHgzRkYwMDAwKT4+MTY7Ci0JCQlyZXN1bHRbdF1bMV0gPSAoUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQSwgYk1hc2tEV29yZCkmMHgzRkYwMDAwKT4+MTY7CisJCQlyZXN1bHRbdF1bMF0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQSkmMHgzRkYwMDAwKT4+MTY7CisJCQlyZXN1bHRbdF1bMV0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19BKSYweDNGRjAwMDApPj4xNjsKIAkJfQogCX0KIApAQCAtODI1LDE2ICs4MzUsMTYgQEAKIAkJCVBhdGhCT0sgPSBfUEhZX1BhdGhCX0lRSyhwQWRhcHRlcik7CiAJCQlpZiAoUGF0aEJPSyA9PSAweDAzKSB7CiAJCQkJREJHXzg3MjNBKCJQYXRoIEIgSVFLIFN1Y2Nlc3MhIVxuIik7Ci0JCQkJcmVzdWx0W3RdWzRdID0gKFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19CLCBiTWFza0RXb3JkKSYweDNGRjAwMDApPj4xNjsKLQkJCQlyZXN1bHRbdF1bNV0gPSAoUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQiwgYk1hc2tEV29yZCkmMHgzRkYwMDAwKT4+MTY7Ci0JCQkJcmVzdWx0W3RdWzZdID0gKFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCByUnhfUG93ZXJfQmVmb3JlX0lRS19CXzIsIGJNYXNrRFdvcmQpJjB4M0ZGMDAwMCk+PjE2OwotCQkJCXJlc3VsdFt0XVs3XSA9IChQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19CXzIsIGJNYXNrRFdvcmQpJjB4M0ZGMDAwMCk+PjE2OworCQkJCXJlc3VsdFt0XVs0XSA9IChydGw4NzIzYXVfcmVhZDMyKHBBZGFwdGVyLCByVHhfUG93ZXJfQmVmb3JlX0lRS19CKSYweDNGRjAwMDApPj4xNjsKKwkJCQlyZXN1bHRbdF1bNV0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19CKSYweDNGRjAwMDApPj4xNjsKKwkJCQlyZXN1bHRbdF1bNl0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0JlZm9yZV9JUUtfQl8yKSYweDNGRjAwMDApPj4xNjsKKwkJCQlyZXN1bHRbdF1bN10gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclJ4X1Bvd2VyX0FmdGVyX0lRS19CXzIpJjB4M0ZGMDAwMCk+PjE2OwogCQkJCWJyZWFrOwogCQkJfSBlbHNlIGlmIChpID09IChyZXRyeUNvdW50IC0gMSkgJiYgUGF0aEJPSyA9PSAweDAxKSB7CiAJCQkJLyogVHggSVFLIE9LICovCiAJCQkJREJHXzg3MjNBKCJQYXRoIEIgT25seSBUeCBJUUsgU3VjY2VzcyEhXG4iKTsKLQkJCQlyZXN1bHRbdF1bNF0gPSAoUEhZX1F1ZXJ5QkJSZWcocEFkYXB0ZXIsIHJUeF9Qb3dlcl9CZWZvcmVfSVFLX0IsIGJNYXNrRFdvcmQpJjB4M0ZGMDAwMCk+PjE2OwotCQkJCXJlc3VsdFt0XVs1XSA9IChQSFlfUXVlcnlCQlJlZyhwQWRhcHRlciwgclR4X1Bvd2VyX0FmdGVyX0lRS19CLCBiTWFza0RXb3JkKSYweDNGRjAwMDApPj4xNjsKKwkJCQlyZXN1bHRbdF1bNF0gPSAocnRsODcyM2F1X3JlYWQzMihwQWRhcHRlciwgclR4X1Bvd2VyX0JlZm9yZV9JUUtfQikmMHgzRkYwMDAwKT4+MTY7CisJCQkJcmVzdWx0W3RdWzVdID0gKHJ0bDg3MjNhdV9yZWFkMzIocEFkYXB0ZXIsIHJUeF9Qb3dlcl9BZnRlcl9JUUtfQikmMHgzRkYwMDAwKT4+MTY7CiAJCQl9CiAJCX0KIApAQCAtODQ0LDcgKzg1NCw3IEBACiAJfQogCiAJLyogQmFjayB0byBCQiBtb2RlLCBsb2FkIG9yaWdpbmFsIHZhbHVlICovCi0JUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfSVFLLCBiTWFza0RXb3JkLCAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwgckZQR0EwX0lRSywgMCk7CiAKIAlpZiAodCAhPSAwKSB7CiAJCWlmICghcGRtcHJpdi0+YlJmUGlFbmFibGUpIHsKQEAgLTg2MiwxNCArODcyLDE2IEBACiAJCV9QSFlfUmVsb2FkQUREQVJlZ2lzdGVycyhwQWRhcHRlciwgSVFLX0JCX1JFR185MkMsIHBkbXByaXYtPklRS19CQl9iYWNrdXAsIElRS19CQl9SRUdfTlVNKTsKIAogCQkvKiAgUmVzdG9yZSBSWCBpbml0aWFsIGdhaW4gKi8KLQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfWEFfTFNTSVBhcmFtZXRlciwgYk1hc2tEV29yZCwgMHgwMDAzMmVkMyk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKHBBZGFwdGVyLAorCQkJCSAgckZQR0EwX1hBX0xTU0lQYXJhbWV0ZXIsIDB4MDAwMzJlZDMpOwogCQlpZiAoaXMyVCkgewotCQkJUEhZX1NldEJCUmVnKHBBZGFwdGVyLCByRlBHQTBfWEJfTFNTSVBhcmFtZXRlciwgYk1hc2tEV29yZCwgMHgwMDAzMmVkMyk7CisJCQlydGw4NzIzYXVfd3JpdGUzMihwQWRhcHRlciwKKwkJCQkJICByRlBHQTBfWEJfTFNTSVBhcmFtZXRlciwgMHgwMDAzMmVkMyk7CiAJCX0KIAogCQkvKiBsb2FkIDB4ZTMwIElRQyBkZWZhdWx0IHZhbHVlICovCi0JCVBIWV9TZXRCQlJlZyhwQWRhcHRlciwgclR4X0lRS19Ub25lX0EsIGJNYXNrRFdvcmQsIDB4MDEwMDhjMDApOwotCQlQSFlfU2V0QkJSZWcocEFkYXB0ZXIsIHJSeF9JUUtfVG9uZV9BLCBiTWFza0RXb3JkLCAweDAxMDA4YzAwKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJUeF9JUUtfVG9uZV9BLCAweDAxMDA4YzAwKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIocEFkYXB0ZXIsIHJSeF9JUUtfVG9uZV9BLCAweDAxMDA4YzAwKTsKIAogCX0KIH0KQEAgLTk4MCwxMiArOTkyLDEwIEBACiAJaXMxM3NpbXVsYXIgPSBmYWxzZTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJaWYgKElTXzkyQ19TRVJJQUwocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKLQkJCSBfUEhZX0lRQ2FsaWJyYXRlKHBBZGFwdGVyLCByZXN1bHQsIGksIHRydWUpOwotCQl9IGVsc2UgewotCQkJLyogIEZvciA4OEMgMVQxUiAqLworCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikKKwkJCV9QSFlfSVFDYWxpYnJhdGUocEFkYXB0ZXIsIHJlc3VsdCwgaSwgdHJ1ZSk7CisJCWVsc2UgLyogIEZvciA4OEMgMVQxUiAqLwogCQkJX1BIWV9JUUNhbGlicmF0ZShwQWRhcHRlciwgcmVzdWx0LCBpLCBmYWxzZSk7Ci0JCX0KIAogCQlpZiAoaSA9PSAxKSB7CiAJCQlpczEyc2ltdWxhciA9IF9QSFlfU2ltdWxhcml0eUNvbXBhcmUocEFkYXB0ZXIsIHJlc3VsdCwgMCwgMSk7CkBAIC0xMDUzLDkgKzEwNjMsMTAgQEAKIAlpZiAoKFJlZ0U5NCAhPSAwKS8qJiYoUmVnRUE0ICE9IDApKi8pCiAJCV9QSFlfUGF0aEFGaWxsSVFLTWF0cml4KHBBZGFwdGVyLCBiUGF0aEFPSywgcmVzdWx0LCBmaW5hbF9jYW5kaWRhdGUsIChSZWdFQTQgPT0gMCkpOwogCi0JaWYgKElTXzkyQ19TRVJJQUwocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKKwlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMlQyUikgewogCQlpZiAoKFJlZ0VCNCAhPSAwKS8qJiYoUmVnRUM0ICE9IDApKi8pCi0JCV9QSFlfUGF0aEJGaWxsSVFLTWF0cml4KHBBZGFwdGVyLCBiUGF0aEJPSywgcmVzdWx0LCBmaW5hbF9jYW5kaWRhdGUsIChSZWdFQzQgPT0gMCkpOworCQkJX1BIWV9QYXRoQkZpbGxJUUtNYXRyaXgocEFkYXB0ZXIsIGJQYXRoQk9LLCByZXN1bHQsCisJCQkJCQlmaW5hbF9jYW5kaWRhdGUsIChSZWdFQzQgPT0gMCkpOwogCX0KIAogCV9QSFlfU2F2ZUFEREFSZWdpc3RlcnMocEFkYXB0ZXIsIElRS19CQl9SRUdfOTJDLCBwZG1wcml2LT5JUUtfQkJfYmFja3VwX3JlY292ZXIsIDkpOwpAQCAtMTA3NCwxMiArMTA4NSwxMCBAQAogCWlmIChwbWxtZWV4dC0+c2l0ZXN1cnZleV9yZXMuc3RhdGUgPT0gU0NBTl9QUk9DRVNTKQogCQlyZXR1cm47CiAKLQlpZiAoSVNfOTJDX1NFUklBTChwSGFsRGF0YS0+VmVyc2lvbklEKSkgeworCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKQogCQlfUEhZX0xDQ2FsaWJyYXRlKHBBZGFwdGVyLCB0cnVlKTsKLQl9IGVsc2UgewotCQkvKiAgRm9yIDg4QyAxVDFSICovCisJZWxzZQkvKiAgRm9yIDg4QyAxVDFSICovCiAJCV9QSFlfTENDYWxpYnJhdGUocEFkYXB0ZXIsIGZhbHNlKTsKLQl9CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfQkIuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfQkIuYwppbmRleCA5ZDRmNmJlLi5lOGNhYjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX0JCLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9CQi5jCkBAIC0zMCwxMiArMzAsMTIgQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJY29uZCA9IENvbmRpdGlvbiAmIDB4MDAwMEZGMDA7Ci0JY29uZCA9IGNvbmQgPj4gODsKKwljb25kID4+PSA4OwogCWlmICgoX2ludGVyZmFjZSAmIGNvbmQpID09IDAgJiYgY29uZCAhPSAweDA3KQogCQlyZXR1cm4gZmFsc2U7CiAKIAljb25kID0gQ29uZGl0aW9uICYgMHgwMEZGMDAwMDsKLQljb25kID0gY29uZCA+PiAxNjsKKwljb25kID4+PSAxNjsKIAlpZiAoKF9wbGF0Zm9ybSAmIGNvbmQpID09IDAgJiYgY29uZCAhPSAweDBGKQogCQlyZXR1cm4gZmFsc2U7CiAJcmV0dXJuIHRydWU7CkBAIC0yMTUsMTcgKzIxNSwxNSBAQAogCiB2b2lkIE9ETV9SZWFkQW5kQ29uZmlnX0FHQ19UQUJfMVRfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQogewotCiAJdTMyIGhleDsKIAl1MzIgaTsKIAl1OCBwbGF0Zm9ybSA9IDB4MDQ7Ci0JdTggaW50ZXJmYWNlVmFsdWUgICA9IHBETV9PZG0tPlN1cHBvcnRJbnRlcmZhY2U7CiAJdTggYm9hcmQgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7CiAJdTMyIEFycmF5TGVuID0gc2l6ZW9mKEFycmF5X0FHQ19UQUJfMVRfODcyM0EpL3NpemVvZih1MzIpOwogCXUzMiAqQXJyYXkgPSBBcnJheV9BR0NfVEFCXzFUXzg3MjNBOwogCiAJaGV4ID0gYm9hcmQ7Ci0JaGV4ICs9IGludGVyZmFjZVZhbHVlIDw8IDg7CisJaGV4ICs9IE9ETV9JVFJGX1VTQiA8PCA4OwogCWhleCArPSBwbGF0Zm9ybSA8PCAxNjsKIAloZXggKz0gMHhGRjAwMDAwMDsKIAlmb3IgKGkgPSAwOyBpIDwgQXJyYXlMZW47IGkgKz0gMikgewpAQCAtMjM0LDExICsyMzIsMTEgQEAKIAogCQkvKiAgVGhpcyAob2Zmc2V0LCBkYXRhKSBwYWlyIG1lZXRzIHRoZSBjb25kaXRpb24uICovCiAJCWlmICh2MSA8IDB4Q0RDRENEQ0QpIHsKLQkJCW9kbV9Db25maWdCQl9BR0NfODcyM0EocERNX09kbSwgdjEsIGJNYXNrRFdvcmQsIHYyKTsKKwkJCW9kbV9Db25maWdCQl9BR0NfODcyM0EocERNX09kbSwgdjEsIHYyKTsKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UgewogCQkJaWYgKCFDaGVja0NvbmRpdGlvbihBcnJheVtpXSwgaGV4KSkgewotCQkJCS8qICBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMuICovCisJCQkJLyogRGlzY2FyZCB0aGUgZm9sbG93aW5nIChvZmZzZXQsIGRhdGEpIHBhaXJzICovCiAJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKIAkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCiAJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgpAQCAtMjQ2LDEyICsyNDQsMTMgQEAKIAkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKIAkJCQlpIC09IDI7IC8qICBwcmV2ZW50IGZyb20gZm9yLWxvb3AgKz0gMiAqLwogCQkJfSBlbHNlIHsKLQkJCQkvKiAgQ29uZmlndXJlIG1hdGNoZWQgcGFpcnMgYW5kIHNraXAgdG8gZW5kIG9mIGlmLWVsc2UuICovCisJCQkJLyogIENvbmZpZ3VyZSBtYXRjaGVkIHBhaXJzIGFuZCBza2lwIHRvCisJCQkJICAgIGVuZCBvZiBpZi1lbHNlLiAqLwogCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7CiAJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgogCQkJCSAgICAgICB2MiAhPSAweENERUYgJiYKIAkJCQkgICAgICAgdjIgIT0gMHhDRENEICYmIGkgPCBBcnJheUxlbiAtIDIpIHsKLQkJCQkJb2RtX0NvbmZpZ0JCX0FHQ184NzIzQShwRE1fT2RtLCB2MSwgYk1hc2tEV29yZCwgdjIpOworCQkJCQlvZG1fQ29uZmlnQkJfQUdDXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7CiAJCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7CiAJCQkJfQogCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYgaSA8IEFycmF5TGVuIC0gMikKQEAgLTQ2NywxMyArNDY2LDEyIEBACiAJdTMyIGhleCA9IDA7CiAJdTMyIGkgPSAwOwogCXU4ICBwbGF0Zm9ybSA9IDB4MDQ7Ci0JdTggIGludGVyZmFjZVZhbHVlID0gcERNX09kbS0+U3VwcG9ydEludGVyZmFjZTsKIAl1OCAgYm9hcmQgPSBwRE1fT2RtLT5Cb2FyZFR5cGU7CiAJdTMyIEFycmF5TGVuID0gc2l6ZW9mKEFycmF5X1BIWV9SRUdfMVRfODcyM0EpL3NpemVvZih1MzIpOwogCXUzMiAqQXJyYXkgPSBBcnJheV9QSFlfUkVHXzFUXzg3MjNBOwogCiAJaGV4ICs9IGJvYXJkOwotCWhleCArPSBpbnRlcmZhY2VWYWx1ZSA8PCA4OworCWhleCArPSBPRE1fSVRSRl9VU0IgPDwgODsKIAloZXggKz0gcGxhdGZvcm0gPDwgMTY7CiAJaGV4ICs9IDB4RkYwMDAwMDA7CiAJZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKQEAgLTQ4MiwxMSArNDgwLDExIEBACiAKIAkJLyogIFRoaXMgKG9mZnNldCwgZGF0YSkgcGFpciBtZWV0cyB0aGUgY29uZGl0aW9uLiAqLwogCQlpZiAodjEgPCAweENEQ0RDRENEKSB7Ci0JCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCBiTWFza0RXb3JkLCB2Mik7CisJCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCB2Mik7CiAJCQljb250aW51ZTsKIAkJfSBlbHNlIHsKIAkJCWlmICghQ2hlY2tDb25kaXRpb24oQXJyYXlbaV0sIGhleCkpIHsKLQkJCQkvKiAgRGlzY2FyZCB0aGUgZm9sbG93aW5nIChvZmZzZXQsIGRhdGEpIHBhaXJzLiAqLworCQkJCS8qIERpc2NhcmQgdGhlIGZvbGxvd2luZyAob2Zmc2V0LCBkYXRhKSBwYWlycyAqLwogCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7CiAJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJgogCQkJCSAgICAgICB2MiAhPSAweENERUYgJiYKQEAgLTQ5NCwxMiArNDkyLDEzIEBACiAJCQkJCVJFQURfTkVYVF9QQUlSKHYxLCB2MiwgaSk7CiAJCQkJaSAtPSAyOyAvKiAgcHJldmVudCBmcm9tIGZvci1sb29wICs9IDIgKi8KIAkJCX0gZWxzZSB7Ci0JCQkJLyogIENvbmZpZ3VyZSBtYXRjaGVkIHBhaXJzIGFuZCBza2lwIHRvIGVuZCBvZiBpZi1lbHNlLiAqLworCQkJCS8qICBDb25maWd1cmUgbWF0Y2hlZCBwYWlycyBhbmQgc2tpcCB0bworCQkJCSAgICBlbmQgb2YgaWYtZWxzZS4gKi8KIAkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwogCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKIAkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCiAJCQkJICAgICAgIHYyICE9IDB4Q0RDRCAmJiBpIDwgQXJyYXlMZW4gLSAyKSB7Ci0JCQkJCW9kbV9Db25maWdCQl9QSFlfODcyM0EocERNX09kbSwgdjEsIGJNYXNrRFdvcmQsIHYyKTsKKwkJCQkJb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShwRE1fT2RtLCB2MSwgdjIpOwogCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwogCQkJCX0KIAkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmIGkgPCBBcnJheUxlbiAtIDIpCkBAIC01MjAsMTYgKzUxOSwxNSBAQAogCiB2b2lkIE9ETV9SZWFkQW5kQ29uZmlnX1BIWV9SRUdfTVBfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQogewotCXUzMiAgICAgaGV4ICAgICAgICAgPSAwOwotCXUzMiAgICAgaSAgICAgICAgICAgPSAwOwotCXU4ICAgICBwbGF0Zm9ybSAgICA9IDB4MDQ7Ci0JdTggICAgIGludGVyZmFjZVZhbHVlICAgPSBwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlOwotCXU4ICAgICBib2FyZCAgICAgICA9IHBETV9PZG0tPkJvYXJkVHlwZTsKLQl1MzIgICAgIEFycmF5TGVuICAgID0gc2l6ZW9mKEFycmF5X1BIWV9SRUdfTVBfODcyM0EpL3NpemVvZih1MzIpOwotCXUzMiAqQXJyYXkgICAgICAgPSBBcnJheV9QSFlfUkVHX01QXzg3MjNBOworCXUzMiBoZXggPSAwOworCXUzMiBpOworCXU4IHBsYXRmb3JtID0gMHgwNDsKKwl1OCBib2FyZCA9IHBETV9PZG0tPkJvYXJkVHlwZTsKKwl1MzIgQXJyYXlMZW4gPSBzaXplb2YoQXJyYXlfUEhZX1JFR19NUF84NzIzQSkvc2l6ZW9mKHUzMik7CisJdTMyICpBcnJheSA9IEFycmF5X1BIWV9SRUdfTVBfODcyM0E7CiAKIAloZXggKz0gYm9hcmQ7Ci0JaGV4ICs9IGludGVyZmFjZVZhbHVlIDw8IDg7CisJaGV4ICs9IE9ETV9JVFJGX1VTQiA8PCA4OwogCWhleCArPSBwbGF0Zm9ybSA8PCAxNjsKIAloZXggKz0gMHhGRjAwMDAwMDsKIAlmb3IgKGkgPSAwOyBpIDwgQXJyYXlMZW47IGkgKz0gMikgewpAQCAtNTM4LDExICs1MzYsMTEgQEAKIAogCQkvKiAgVGhpcyAob2Zmc2V0LCBkYXRhKSBwYWlyIG1lZXRzIHRoZSBjb25kaXRpb24uICovCiAJCWlmICh2MSA8IDB4Q0RDRENEQ0QpIHsKLQkJCW9kbV9Db25maWdCQl9QSFlfODcyM0EocERNX09kbSwgdjEsIGJNYXNrRFdvcmQsIHYyKTsKKwkJCW9kbV9Db25maWdCQl9QSFlfODcyM0EocERNX09kbSwgdjEsIHYyKTsKIAkJCWNvbnRpbnVlOwogCQl9IGVsc2UgewogCQkJaWYgKCFDaGVja0NvbmRpdGlvbihBcnJheVtpXSwgaGV4KSkgewotCQkJCS8qIERpc2NhcmQgdGhlIGZvbGxvd2luZyAob2Zmc2V0LCBkYXRhKSBwYWlycy4gKi8KKwkJCQkvKiBEaXNjYXJkIHRoZSBmb2xsb3dpbmcgKG9mZnNldCwgZGF0YSkgcGFpcnMgKi8KIAkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwogCQkJCXdoaWxlICh2MiAhPSAweERFQUQgJiYKIAkJCQkgICAgICAgdjIgIT0gMHhDREVGICYmCkBAIC01NTAsMTIgKzU0OCwxMyBAQAogCQkJCQlSRUFEX05FWFRfUEFJUih2MSwgdjIsIGkpOwogCQkJCWkgLT0gMjsgLyogIHByZXZlbnQgZnJvbSBmb3ItbG9vcCArPSAyICovCiAJCQl9IGVsc2UgewotCQkJCS8qIENvbmZpZ3VyZSBtYXRjaGVkIHBhaXJzIGFuZCBza2lwIHRvIGVuZCBvZiBpZi1lbHNlLiAqLworCQkJCS8qIENvbmZpZ3VyZSBtYXRjaGVkIHBhaXJzIGFuZCBza2lwIHRvCisJCQkJICAgZW5kIG9mIGlmLWVsc2UuICovCiAJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKIAkJCQl3aGlsZSAodjIgIT0gMHhERUFEICYmCiAJCQkJICAgICAgIHYyICE9IDB4Q0RFRiAmJgogCQkJCSAgICAgICB2MiAhPSAweENEQ0QgJiYgaSA8IEFycmF5TGVuIC0gMikgewotCQkJCQlvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHBETV9PZG0sIHYxLCBiTWFza0RXb3JkLCB2Mik7CisJCQkJCW9kbV9Db25maWdCQl9QSFlfODcyM0EocERNX09kbSwgdjEsIHYyKTsKIAkJCQkJUkVBRF9ORVhUX1BBSVIodjEsIHYyLCBpKTsKIAkJCQl9CiAJCQkJd2hpbGUgKHYyICE9IDB4REVBRCAmJiBpIDwgQXJyYXlMZW4gLSAyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9NQUMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfTUFDLmMKaW5kZXggMTIwNzE0NS4uOTNiMmQxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9NQUMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX01BQy5jCkBAIC0zMCwxMiArMzAsMTIgQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJY29uZCA9IENvbmRpdGlvbiAmIDB4MDAwMEZGMDA7Ci0JY29uZCA9IGNvbmQgPj4gODsKKwljb25kID4+PSA4OwogCWlmICgoX2ludGVyZmFjZSAmIGNvbmQpID09IDAgJiYgY29uZCAhPSAweDA3KQogCQlyZXR1cm4gZmFsc2U7CiAKIAljb25kID0gQ29uZGl0aW9uICYgMHgwMEZGMDAwMDsKLQljb25kID0gY29uZCA+PiAxNjsKKwljb25kID4+PSAxNjsKIAlpZiAoKF9wbGF0Zm9ybSAmIGNvbmQpID09IDAgJiYgY29uZCAhPSAweDBGKQogCQlyZXR1cm4gZmFsc2U7CiAJcmV0dXJuIHRydWU7CkBAIC0xNDQsMTMgKzE0NCwxMiBAQAogCXUzMiAgICAgaGV4ICAgICAgICAgPSAwOwogCXUzMiAgICAgaSAgICAgICAgICAgPSAwOwogCXU4ICAgICBwbGF0Zm9ybSAgICA9IDB4MDQ7Ci0JdTggICAgIGludGVyZmFjZVZhbHVlICAgPSBwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlOwogCXU4ICAgICBib2FyZCAgICAgICA9IHBETV9PZG0tPkJvYXJkVHlwZTsKIAl1MzIgICAgIEFycmF5TGVuICAgID0gc2l6ZW9mKEFycmF5X01BQ19SRUdfODcyM0EpL3NpemVvZih1MzIpOwogCXUzMiAqQXJyYXkgICAgICAgPSBBcnJheV9NQUNfUkVHXzg3MjNBOwogCiAJaGV4ICs9IGJvYXJkOwotCWhleCArPSBpbnRlcmZhY2VWYWx1ZSA8PCA4OworCWhleCArPSBPRE1fSVRSRl9VU0IgPDwgODsKIAloZXggKz0gcGxhdGZvcm0gPDwgMTY7CiAJaGV4ICs9IDB4RkYwMDAwMDA7CiAJZm9yIChpID0gMDsgaSA8IEFycmF5TGVuOyBpICs9IDIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfUkYuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbEhXSW1nODcyM0FfUkYuYwppbmRleCAwMDQ4MGY1Li5kYmY1NzFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxIV0ltZzg3MjNBX1JGLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvSGFsSFdJbWc4NzIzQV9SRi5jCkBAIC0zMCwxMiArMzAsMTIgQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJY29uZCA9IENvbmRpdGlvbiAmIDB4MDAwMEZGMDA7Ci0JY29uZCA9IGNvbmQgPj4gODsKKwljb25kID4+PSA4OwogCWlmICgoX2ludGVyZmFjZSAmIGNvbmQpID09IDAgJiYgY29uZCAhPSAweDA3KQogCQlyZXR1cm4gZmFsc2U7CiAKIAljb25kID0gQ29uZGl0aW9uICYgMHgwMEZGMDAwMDsKLQljb25kID0gY29uZCA+PiAxNjsKKwljb25kID4+PSAxNjsKIAlpZiAoKF9wbGF0Zm9ybSAmIGNvbmQpID09IDAgJiYgY29uZCAhPSAweDBGKQogCQlyZXR1cm4gZmFsc2U7CiAJcmV0dXJuIHRydWU7CkBAIC0yMTQsMTMgKzIxNCwxMiBAQAogCXUzMiAgICAgaGV4ICAgICAgICAgPSAwOwogCXUzMiAgICAgaSAgICAgICAgICAgPSAwOwogCXU4ICAgICBwbGF0Zm9ybSAgICA9IDB4MDQ7Ci0JdTggICAgIGludGVyZmFjZVZhbHVlICAgPSBwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlOwogCXU4ICAgICBib2FyZCAgICAgICA9IHBETV9PZG0tPkJvYXJkVHlwZTsKIAl1MzIgICAgIEFycmF5TGVuICAgID0gc2l6ZW9mKEFycmF5X1JhZGlvQV8xVF84NzIzQSkvc2l6ZW9mKHUzMik7CiAJdTMyICpBcnJheSA9IEFycmF5X1JhZGlvQV8xVF84NzIzQTsKIAogCWhleCArPSBib2FyZDsKLQloZXggKz0gaW50ZXJmYWNlVmFsdWUgPDwgODsKKwloZXggKz0gT0RNX0lUUkZfVVNCIDw8IDg7CiAJaGV4ICs9IHBsYXRmb3JtIDw8IDE2OwogCWhleCArPSAweEZGMDAwMDAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9IYWxQd3JTZXFDbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbFB3clNlcUNtZC5jCmluZGV4IDMzNzc3ZDIuLmFlMDkwYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbFB3clNlcUNtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL0hhbFB3clNlcUNtZC5jCkBAIC01OSwxNyArNTksMTUgQEAKIAkJUHdyQ2ZnQ21kID0gUHdyU2VxQ21kW0FyeUlkeF07CiAKIAkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6IG9mZnNldCglI3gpIGN1dF9tc2soJSN4KSAiCi0JCQkgICJmYWJfbXNrKCUjeCkgaW50ZXJmYWNlX21zayglI3gpIGJhc2UoJSN4KSBjbWQoJSN4KSAiCi0JCQkgICJtc2soJSN4KSB2YWx1ZSglI3gpXG4iLAotCQkJICBHRVRfUFdSX0NGR19PRkZTRVQoUHdyQ2ZnQ21kKSwKLQkJCSAgR0VUX1BXUl9DRkdfQ1VUX01BU0soUHdyQ2ZnQ21kKSwKLQkJCSAgR0VUX1BXUl9DRkdfRkFCX01BU0soUHdyQ2ZnQ21kKSwKLQkJCSAgR0VUX1BXUl9DRkdfSU5URl9NQVNLKFB3ckNmZ0NtZCksCi0JCQkgIEdFVF9QV1JfQ0ZHX0JBU0UoUHdyQ2ZnQ21kKSwKLQkJCSAgR0VUX1BXUl9DRkdfQ01EKFB3ckNmZ0NtZCksCi0JCQkgIEdFVF9QV1JfQ0ZHX01BU0soUHdyQ2ZnQ21kKSwKLQkJCSAgR0VUX1BXUl9DRkdfVkFMVUUoUHdyQ2ZnQ21kKSkpOworCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBvZmZzZXQoJSN4KSBjdXRfbXNrKCUjeCkgZmFiX21zayglI3gpIGludGVyZmFjZV9tc2soJSN4KSBiYXNlKCUjeCkgY21kKCUjeCkgbXNrKCUjeCkgdmFsdWUoJSN4KVxuIiwKKwkJCSBHRVRfUFdSX0NGR19PRkZTRVQoUHdyQ2ZnQ21kKSwKKwkJCSBHRVRfUFdSX0NGR19DVVRfTUFTSyhQd3JDZmdDbWQpLAorCQkJIEdFVF9QV1JfQ0ZHX0ZBQl9NQVNLKFB3ckNmZ0NtZCksCisJCQkgR0VUX1BXUl9DRkdfSU5URl9NQVNLKFB3ckNmZ0NtZCksCisJCQkgR0VUX1BXUl9DRkdfQkFTRShQd3JDZmdDbWQpLAorCQkJIEdFVF9QV1JfQ0ZHX0NNRChQd3JDZmdDbWQpLAorCQkJIEdFVF9QV1JfQ0ZHX01BU0soUHdyQ2ZnQ21kKSwKKwkJCSBHRVRfUFdSX0NGR19WQUxVRShQd3JDZmdDbWQpKTsKIAogCQkvKiAyIE9ubHkgSGFuZGxlIHRoZSBjb21tYW5kIHdob3NlIEZBQiwgQ1VULCBhbmQgSW50ZXJmYWNlIGFyZQogCQkgICBtYXRjaGVkICovCkBAIC03OSwxNCArNzcsMTIgQEAKIAkJCXN3aXRjaCAoR0VUX1BXUl9DRkdfQ01EKFB3ckNmZ0NtZCkpIHsKIAkJCWNhc2UgUFdSX0NNRF9SRUFEOgogCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAoIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6ICIKLQkJCQkJICAiUFdSX0NNRF9SRUFEXG4iKSk7CisJCQkJCSAiSGFsUHdyU2VxQ21kUGFyc2luZzIzYTogUFdSX0NNRF9SRUFEXG4iKTsKIAkJCQlicmVhazsKIAogCQkJY2FzZSBQV1JfQ01EX1dSSVRFOgogCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAoIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6ICIKLQkJCQkJICAiUFdSX0NNRF9XUklURVxuIikpOworCQkJCQkgIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6IFBXUl9DTURfV1JJVEVcbiIpOwogCQkJCW9mZnNldCA9IEdFVF9QV1JfQ0ZHX09GRlNFVChQd3JDZmdDbWQpOwogCiAJCQkJLyogIFJlYWQgdGhlIHZhbHVlIGZyb20gc3lzdGVtIHJlZ2lzdGVyICovCkBAIC0xMDIsOCArOTgsNyBAQAogCiAJCQljYXNlIFBXUl9DTURfUE9MTElORzoKIAkJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgKCJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiAiCi0JCQkJCSAgIlBXUl9DTURfUE9MTElOR1xuIikpOworCQkJCQkgIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6IFBXUl9DTURfUE9MTElOR1xuIik7CiAKIAkJCQliUG9sbGluZ0JpdCA9IGZhbHNlOwogCQkJCW9mZnNldCA9IEdFVF9QV1JfQ0ZHX09GRlNFVChQd3JDZmdDbWQpOwpAQCAtMTMxLDggKzEyNiw3IEBACiAKIAkJCWNhc2UgUFdSX0NNRF9ERUxBWToKIAkJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCQkgKCJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiAiCi0JCQkJCSAgIlBXUl9DTURfREVMQVlcbiIpKTsKKwkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBQV1JfQ01EX0RFTEFZXG4iKTsKIAkJCQlpZiAoR0VUX1BXUl9DRkdfVkFMVUUoUHdyQ2ZnQ21kKSA9PQogCQkJCSAgICBQV1JTRVFfREVMQVlfVVMpCiAJCQkJCXVkZWxheShHRVRfUFdSX0NGR19PRkZTRVQoUHdyQ2ZnQ21kKSk7CkBAIC0xNDUsMTUgKzEzOSwxMiBAQAogCQkJCS8qICBXaGVuIHRoaXMgY29tbWFuZCBpcyBwYXJzZWQsIGVuZAogCQkJCSAgICB0aGUgcHJvY2VzcyAqLwogCQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJCSAoIkhhbFB3clNlcUNtZFBhcnNpbmcyM2E6ICIKLQkJCQkJICAiUFdSX0NNRF9FTkRcbiIpKTsKKwkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBQV1JfQ01EX0VORFxuIik7CiAJCQkJcmV0dXJuIHRydWU7Ci0JCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6CiAJCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJCQkgKCJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiAiCi0JCQkJCSAgIlVua25vd24gQ01EISFcbiIpKTsKKwkJCQkJICJIYWxQd3JTZXFDbWRQYXJzaW5nMjNhOiBVbmtub3duIENNRCEhXG4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvaGFsX2NvbS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvaGFsX2NvbS5jCmluZGV4IGJmNGNhZTIuLjUzMGRiNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL2hhbF9jb20uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9oYWxfY29tLmMKQEAgLTIyLDQ2ICsyMiw2IEBACiAKICNkZWZpbmUgX0hBTF9JTklUX0NfCiAKLXZvaWQgZHVtcF9jaGlwX2luZm8yM2Eoc3RydWN0IGhhbF92ZXJzaW9uIENoaXBWZXJzaW9uKQotewotCWludCBjbnQgPSAwOwotCXU4IGJ1ZlsxMjhdOwotCi0JY250ICs9IHNwcmludGYoKGJ1ZiArIGNudCksICJDaGlwIFZlcnNpb24gSW5mbzogQ0hJUF84NzIzQV8iKTsKLQotCWNudCArPSBzcHJpbnRmKChidWYgKyBjbnQpLCAiJXNfIiwgSVNfTk9STUFMX0NISVAoQ2hpcFZlcnNpb24pID8KLQkJICAgICAgICJOb3JtYWxfQ2hpcCIgOiAiVGVzdF9DaGlwIik7Ci0JY250ICs9IHNwcmludGYoKGJ1ZiArIGNudCksICIlc18iLAotCQkgICAgICAgSVNfQ0hJUF9WRU5ET1JfVFNNQyhDaGlwVmVyc2lvbikgPyAiVFNNQyIgOiAiVU1DIik7Ci0JaWYgKElTX0FfQ1VUKENoaXBWZXJzaW9uKSkKLQkJY250ICs9IHNwcmludGYoKGJ1ZiArIGNudCksICJBX0NVVF8iKTsKLQllbHNlIGlmIChJU19CX0NVVChDaGlwVmVyc2lvbikpCi0JCWNudCArPSBzcHJpbnRmKChidWYgKyBjbnQpLCAiQl9DVVRfIik7Ci0JZWxzZSBpZiAoSVNfQ19DVVQoQ2hpcFZlcnNpb24pKQotCQljbnQgKz0gc3ByaW50ZigoYnVmICsgY250KSwgIkNfQ1VUXyIpOwotCWVsc2UgaWYgKElTX0RfQ1VUKENoaXBWZXJzaW9uKSkKLQkJY250ICs9IHNwcmludGYoKGJ1ZiArIGNudCksICJEX0NVVF8iKTsKLQllbHNlIGlmIChJU19FX0NVVChDaGlwVmVyc2lvbikpCi0JCWNudCArPSBzcHJpbnRmKChidWYgKyBjbnQpLCAiRV9DVVRfIik7Ci0JZWxzZQotCQljbnQgKz0gc3ByaW50ZigoYnVmICsgY250KSwgIlVOS05PV05fQ1VUKCVkKV8iLAotCQkJICAgICAgIENoaXBWZXJzaW9uLkNVVFZlcnNpb24pOwotCi0JaWYgKElTXzFUMVIoQ2hpcFZlcnNpb24pKQotCQljbnQgKz0gc3ByaW50ZigoYnVmICsgY250KSwgIjFUMVJfIik7Ci0JZWxzZSBpZiAoSVNfMVQyUihDaGlwVmVyc2lvbikpCi0JCWNudCArPSBzcHJpbnRmKChidWYgKyBjbnQpLCAiMVQyUl8iKTsKLQllbHNlIGlmIChJU18yVDJSKENoaXBWZXJzaW9uKSkKLQkJY250ICs9IHNwcmludGYoKGJ1ZiArIGNudCksICIyVDJSXyIpOwotCWVsc2UKLQkJY250ICs9IHNwcmludGYoKGJ1ZiArIGNudCksICJVTktOT1dOX1JGVFlQRSglZClfIiwKLQkJCSAgICAgICBDaGlwVmVyc2lvbi5SRlR5cGUpOwotCi0JY250ICs9IHNwcmludGYoKGJ1ZiArIGNudCksICJSb21WZXIoJWQpXG4iLCBDaGlwVmVyc2lvbi5ST01WZXIpOwotCi0JREJHXzg3MjNBKCIlcyIsIGJ1Zik7Ci19Ci0KICNkZWZpbmUJRUVQUk9NX0NIQU5ORUxfUExBTl9CWV9IV19NQVNLCTB4ODAKIAogLyogcmV0dXJuIHRoZSBmaW5hbCBjaGFubmVsIHBsYW4gZGVjaXNpb24gKi8KQEAgLTIzMSwxMyArMTkxLDExIEBACiAJcmF0ZV9pbmRleCA9IDA7CiAJLyogIFNldCBSVFMgaW5pdGlhbCByYXRlICovCiAJd2hpbGUgKGJyYXRlX2NmZyA+IDB4MSkgewotCQlicmF0ZV9jZmcgPSAoYnJhdGVfY2ZnID4+IDEpOworCQlicmF0ZV9jZmcgPj49IDE7CiAJCXJhdGVfaW5kZXgrKzsKIAl9CiAJCS8qICBaaXYgLSBDaGVjayAqLwogCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19JTklSVFNfUkFURV9TRUwsIHJhdGVfaW5kZXgpOwotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMgdm9pZCBfT25lT3V0UGlwZU1hcHBpbmcoc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlcikKQEAgLTQzNyw5ICszOTUsNiBAQAogCQlpZiAoTWluU3BhY2luZ1RvU2V0IDwgU2VjTWluU3BhY2UpCiAJCQlNaW5TcGFjaW5nVG9TZXQgPSBTZWNNaW5TcGFjZTsKIAotCQkvKiBSVF9UUkFDRShDT01QX01MTUUsIERCR19MT1VELAotCQkgICAoIlNldCBIV19WQVJfQU1QRFVfTUlOX1NQQUNFOiAlI3hcbiIsCi0JCSAgIHBhZGFwdGVyLT5NZ250SW5mby5NaW5TcGFjZUNmZykpOyAqLwogCQlNaW5TcGFjaW5nVG9TZXQgfD0KIAkJCXJ0bDg3MjNhdV9yZWFkOChwYWRhcHRlciwgUkVHX0FNUERVX01JTl9TUEFDRSkgJiAweGY4OwogCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfQU1QRFVfTUlOX1NQQUNFLApAQCAtNDc5LDkgKzQzNCw2IEBACiAJCQlydGw4NzIzYXVfd3JpdGU4KHBhZGFwdGVyLCBSRUdfQUdHTEVOX0xNVCArIGluZGV4LAogCQkJCQkgcFJlZ1RvU2V0W2luZGV4XSk7CiAJCX0KLQotCQkvKiBSVF9UUkFDRShDT01QX01MTUUsIERCR19MT1VELAotCQkgICAoIlNldCBIV19WQVJfQU1QRFVfRkFDVE9SOiAlI3hcbiIsIEZhY3RvclRvU2V0KSk7ICovCiAJfQogfQogCkBAIC02NjYsMTQgKzYxOCw4IEBACiAJCS8qICB3cml0ZSBjb250ZW50IDAgaXMgZXF1YWxsIHRvIG1hcmsgaW52YWxpZCAqLwogCQkvKiBkZWxheV9tcyg0MCk7ICovCiAJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBXQ0FNSSwgdWxDb250ZW50KTsKLQkJLyogUlRfVFJBQ0UoQ09NUF9TRUMsIERCR19MT1VELAotCQkgICAoInJ0bDg3MjNhX2NhbV9lbXB0eV9lbnRyeSgpOiBXUklURSBBNDogJWx4XG4iLAotCQkgICB1bENvbnRlbnQpKTsqLwogCQkvKiBkZWxheV9tcyg0MCk7ICovCiAJCXJ0bDg3MjNhdV93cml0ZTMyKHBhZGFwdGVyLCBSRUdfQ0FNQ01ELCB1bENvbW1hbmQpOwotCQkvKiBSVF9UUkFDRShDT01QX1NFQywgREJHX0xPVUQsCi0JCSAgICgicnRsODcyM2FfY2FtX2VtcHR5X2VudHJ5KCk6IFdSSVRFIEEwOiAlbHhcbiIsCi0JCSAgIHVsQ29tbWFuZCkpOyovCiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG0uYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbS5jCmluZGV4IDUyNjliNDYuLmVjNTQzY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbS5jCkBAIC0xODksMjUgKzE4OSwxNiBAQAogCiAvKiBFTkQtLS0tLS0tLS1CQiBQT1dFUiBTQVZFLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotdm9pZCBvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2syM2FDRTIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCiB2b2lkIG9kbV9EeW5hbWljVHhQb3dlcjIzYUluaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKIAotdm9pZCBvZG1fUlNTSU1vbml0b3JDaGVjazIzYUNFKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci12b2lkIG9kbV9SU1NJTW9uaXRvckNoZWNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7CitzdGF0aWMgdm9pZCBvZG1fUlNTSU1vbml0b3JDaGVjayhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwogdm9pZCBvZG1fRHluYW1pY1R4UG93ZXIyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKIAotdm9pZCBvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2syM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotdm9pZCBPRE1fVFhQb3dlclRyYWNraW5nQ2hlY2syM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKK3N0YXRpYyB2b2lkIG9kbV9SZWZyZXNoUmF0ZUFkYXB0aXZlTWFzayhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwogCiB2b2lkIG9kbV9SYXRlQWRhcHRpdmVNYXNrSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwogCi12b2lkIG9kbV9UWFBvd2VyVHJhY2tpbmdUaGVybWFsTWV0ZXJJbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7Ci0KLXZvaWQgb2RtX1RYUG93ZXJUcmFja2luZ0luaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKLQotdm9pZCBvZG1fVFhQb3dlclRyYWNraW5nQ2hlY2tDRTIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOworc3RhdGljIHZvaWQgb2RtX1RYUG93ZXJUcmFja2luZ0luaXQoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKTsKIAogc3RhdGljIHZvaWQgb2RtX0VkY2FUdXJib0NoZWNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSk7CiBzdGF0aWMgdm9pZCBPRE1fRWRjYVR1cmJvSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwpAQCAtMjE2LDE2ICsyMDcsMTYgQEAKICNkZWZpbmUJUnhEZWZhdWx0QW50MgkJMHg1NjlhCiAKIGJvb2wgb2RtX1N0YURlZkFudFNlbChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0gdTMyIE9GRE1fQW50MV9DbnQsCi0gdTMyIE9GRE1fQW50Ml9DbnQsCi0gdTMyIENDS19BbnQxX0NudCwKLSB1MzIgQ0NLX0FudDJfQ250LAotIHU4ICpwRGVmQW50CisJdTMyIE9GRE1fQW50MV9DbnQsCisJdTMyIE9GRE1fQW50Ml9DbnQsCisJdTMyIENDS19BbnQxX0NudCwKKwl1MzIgQ0NLX0FudDJfQ250LAorCXU4ICpwRGVmQW50CiAJKTsKIAogdm9pZCBvZG1fU2V0UnhJZGxlQW50KHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKIAl1OCBBbnQsCi0gICBib29sICAgYkR1YWxQYXRoCisJYm9vbCAgIGJEdWFsUGF0aAogKTsKIAogLyogMyBFeHBvcnQgSW50ZXJmYWNlICovCkBAIC0yNDEsNyArMjMyLDcgQEAKIAogCW9kbTIzYV9EeW5CQlBTSW5pdChwRE1fT2RtKTsKIAlvZG1fRHluYW1pY1R4UG93ZXIyM2FJbml0KHBETV9PZG0pOwotCW9kbV9UWFBvd2VyVHJhY2tpbmdJbml0MjNhKHBETV9PZG0pOworCW9kbV9UWFBvd2VyVHJhY2tpbmdJbml0KHBETV9PZG0pOwogCU9ETV9FZGNhVHVyYm9Jbml0MjNhKHBETV9PZG0pOwogfQogCkBAIC0yNTgsNyArMjQ5LDcgQEAKIAlvZG1fQ21uSW5mb1VwZGF0ZV9EZWJ1ZzIzYShwRE1fT2RtKTsKIAlvZG1fQ29tbW9uSW5mb1NlbGZVcGRhdGUocEhhbERhdGEpOwogCW9kbV9GYWxzZUFsYXJtQ291bnRlclN0YXRpc3RpY3MyM2EocERNX09kbSk7Ci0Jb2RtX1JTU0lNb25pdG9yQ2hlY2syM2EocERNX09kbSk7CisJb2RtX1JTU0lNb25pdG9yQ2hlY2socERNX09kbSk7CiAKIAkvKiA4NzIzQSBvciA4MTg5RVMgcGxhdGZvcm0gKi8KIAkvKiBOZWlsQ2hlbi0tMjAxMi0tMDgtLTI0LS0gKi8KQEAgLTI3NywxNCArMjY4LDExIEBACiAJaWYgKHB3cmN0cmxwcml2LT5icG93ZXJfc2F2aW5nKQogCQlyZXR1cm47CiAKLQlvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2syM2EocERNX09kbSk7CisJb2RtX1JlZnJlc2hSYXRlQWRhcHRpdmVNYXNrKHBETV9PZG0pOwogCiAJb2RtX0R5bmFtaWNCQlBvd2VyU2F2aW5nMjNhKHBETV9PZG0pOwogCi0JT0RNX1RYUG93ZXJUcmFja2luZ0NoZWNrMjNhKHBETV9PZG0pOwogCW9kbV9FZGNhVHVyYm9DaGVjazIzYShwRE1fT2RtKTsKLQotCW9kbV9kdGMocERNX09kbSk7CiB9CiAKIC8qICAqLwpAQCAtMzAyLDExICsyOTAsNiBAQAogCS8qICAqLwogCXN3aXRjaAkoQ21uSW5mbykgewogCS8qICBGaXhlZCBPRE0gdmFsdWUuICovCi0JY2FzZQlPRE1fQ01OSU5GT19QTEFURk9STToKLQkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19JTlRFUkZBQ0U6Ci0JCXBETV9PZG0tPlN1cHBvcnRJbnRlcmZhY2UgPSAodTgpVmFsdWU7Ci0JCWJyZWFrOwogCWNhc2UJT0RNX0NNTklORk9fTVBfVEVTVF9DSElQOgogCQlwRE1fT2RtLT5iSXNNUENoaXAgPSAodTgpVmFsdWU7CiAJCWJyZWFrOwpAQCAtMzE5LDkgKzMwMiw2IEBACiAJY2FzZQlPRE1fQ01OSU5GT19GQUJfVkVSOgogCQlwRE1fT2RtLT5GYWJWZXJzaW9uID0gKHU4KVZhbHVlOwogCQlicmVhazsKLQljYXNlCU9ETV9DTU5JTkZPX1JGX1RZUEU6Ci0JCXBETV9PZG0tPlJGVHlwZSA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7CiAJY2FzZQlPRE1fQ01OSU5GT19CT0FSRF9UWVBFOgogCQlwRE1fT2RtLT5Cb2FyZFR5cGUgPSAodTgpVmFsdWU7CiAJCWJyZWFrOwpAQCAtMzM0LDkgKzMxNCw2IEBACiAJY2FzZQlPRE1fQ01OSU5GT19FWFRfVFJTVzoKIAkJcERNX09kbS0+RXh0VFJTVyA9ICh1OClWYWx1ZTsKIAkJYnJlYWs7Ci0JY2FzZQlPRE1fQ01OSU5GT19QQVRDSF9JRDoKLQkJcERNX09kbS0+UGF0Y2hJRCA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7CiAJY2FzZQlPRE1fQ01OSU5GT19CSU5IQ1RfVEVTVDoKIAkJcERNX09kbS0+YkluSGN0VGVzdCA9IChib29sKVZhbHVlOwogCQlicmVhazsKQEAgLTM1MSwxNSArMzI4LDYgQEAKIAkJLyogZG8gbm90aGluZyAqLwogCQlicmVhazsKIAl9Ci0KLQkvKiAgKi8KLQkvKiAgVHggcG93ZXIgdHJhY2tpbmcgQkIgc3dpbmcgdGFibGUuICovCi0JLyogIFRoZSBiYXNlIGluZGV4ID0gMTIuICsoKDEyLW4pLzIpZEIgMTN+Pz8gPSBkZWNyZWFzZSB0eCBwd3IgYnkgLSgobi0xMikvMilkQiAqLwotCS8qICAqLwotCXBETV9PZG0tPkJiU3dpbmdJZHhPZmRtCQkJPSAxMjsgLyogIFNldCBkZWZhbHV0IHZhbHVlIGFzIGluZGV4IDEyLiAqLwotCXBETV9PZG0tPkJiU3dpbmdJZHhPZmRtQ3VycmVudAk9IDEyOwotCXBETV9PZG0tPkJiU3dpbmdGbGFnT2ZkbQkJPSBmYWxzZTsKLQogfQogCiB2b2lkIE9ETV9DbW5JbmZvUHRyQXJyYXlIb29rMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBvZG1fY21uaW5mbyBDbW5JbmZvLApAQCAtMzgzLDkgKzM1MSw2IEBACiB7CiAJLyogIFRoaXMgaW5pdCB2YXJpYWJsZSBtYXkgYmUgY2hhbmdlZCBpbiBydW4gdGltZS4gKi8KIAlzd2l0Y2gJKENtbkluZm8pIHsKLQljYXNlCU9ETV9DTU5JTkZPX1JGX1RZUEU6Ci0JCXBETV9PZG0tPlJGVHlwZSA9ICh1OClWYWx1ZTsKLQkJYnJlYWs7CiAJY2FzZQlPRE1fQ01OSU5GT19XSUZJX0RJUkVDVDoKIAkJcERNX09kbS0+YldJRklfRGlyZWN0ID0gKGJvb2wpVmFsdWU7CiAJCWJyZWFrOwpAQCAtNDE0LDEzICszNzksMTggQEAKIAogfQogCi12b2lkIG9kbV9Db21tb25JbmZvU2VsZkluaXQyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtCi0JKQordm9pZCBvZG1fQ29tbW9uSW5mb1NlbGZJbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKIHsKLQlwRE1fT2RtLT5iQ2NrSGlnaFBvd2VyID0KLQkJKGJvb2wpIE9ETV9HZXRCQlJlZyhwRE1fT2RtLCByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIsIEJJVCg5KSk7CisJdTMyIHZhbDMyOworCisJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBETV9PZG0tPkFkYXB0ZXIsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMik7CisJaWYgKHZhbDMyICYgQklUKDkpKQorCQlwRE1fT2RtLT5iQ2NrSGlnaFBvd2VyID0gdHJ1ZTsKKwllbHNlCisJCXBETV9PZG0tPmJDY2tIaWdoUG93ZXIgPSBmYWxzZTsKKwkJCiAJcERNX09kbS0+UkZQYXRoUnhFbmFibGUgPQotCQkodTgpIE9ETV9HZXRCQlJlZyhwRE1fT2RtLCByT0ZETTBfVFJ4UGF0aEVuYWJsZSwgMHgwRik7CisJCXJ0bDg3MjNhdV9yZWFkMzIocERNX09kbS0+QWRhcHRlciwgck9GRE0wX1RSeFBhdGhFbmFibGUpICYgMHgwRjsKIAogCU9ETV9Jbml0RGVidWdTZXR0aW5nMjNhKHBETV9PZG0pOwogfQpAQCAtNDMyLDE1ICs0MDIsNiBAQAogCXU4IEVudHJ5Q250ID0gMDsKIAl1OCBpOwogCi0JaWYgKHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXID09IEhUX0NIQU5ORUxfV0lEVEhfNDApIHsKLQkJaWYgKHBIYWxEYXRhLT5uQ3VyNDBNaHpQcmltZVNDID09IDEpCi0JCQlwRE1fT2RtLT5Db250cm9sQ2hhbm5lbCA9IHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCAtIDI7Ci0JCWVsc2UgaWYgKHBIYWxEYXRhLT5uQ3VyNDBNaHpQcmltZVNDID09IDIpCi0JCQlwRE1fT2RtLT5Db250cm9sQ2hhbm5lbCA9IHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbCArIDI7Ci0JfSBlbHNlIHsKLQkJcERNX09kbS0+Q29udHJvbENoYW5uZWwgPSBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWw7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IE9ETV9BU1NPQ0lBVEVfRU5UUllfTlVNOyBpKyspIHsKIAkJcEVudHJ5ID0gcERNX09kbS0+cE9ETV9TdGFJbmZvW2ldOwogCQlpZiAocEVudHJ5KQpAQCAtNDU2LDE2ICs0MTcsMTMgQEAKIHsKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgib2RtX0NtbkluZm9Jbml0X0RlYnVnMjNhID09PlxuIikpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJTdXBwb3J0QWJpbGl0eSA9IDB4JXhcbiIsIHBETV9PZG0tPlN1cHBvcnRBYmlsaXR5KSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIlN1cHBvcnRJbnRlcmZhY2UgPSVkXG4iLCBwRE1fT2RtLT5TdXBwb3J0SW50ZXJmYWNlKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIlN1cHBvcnRJQ1R5cGUgPSAweCV4XG4iLCBwRE1fT2RtLT5TdXBwb3J0SUNUeXBlKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkN1dFZlcnNpb24gPSVkXG4iLCBwRE1fT2RtLT5DdXRWZXJzaW9uKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkZhYlZlcnNpb24gPSVkXG4iLCBwRE1fT2RtLT5GYWJWZXJzaW9uKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIlJGVHlwZSA9JWRcbiIsIHBETV9PZG0tPlJGVHlwZSkpOwogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9DT01NT04sIE9ETV9EQkdfTE9VRCwgKCJCb2FyZFR5cGUgPSVkXG4iLCBwRE1fT2RtLT5Cb2FyZFR5cGUpKTsKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiRXh0TE5BID0lZFxuIiwgcERNX09kbS0+RXh0TE5BKSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIkV4dFBBID0lZFxuIiwgcERNX09kbS0+RXh0UEEpKTsKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiRXh0VFJTVyA9JWRcbiIsIHBETV9PZG0tPkV4dFRSU1cpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiUGF0Y2hJRCA9JWRcbiIsIHBETV9PZG0tPlBhdGNoSUQpKTsKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiYkluSGN0VGVzdCA9JWRcbiIsIHBETV9PZG0tPmJJbkhjdFRlc3QpKTsKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQ09NTU9OLCBPRE1fREJHX0xPVUQsICgiYldJRklUZXN0ID0lZFxuIiwgcERNX09kbS0+YldJRklUZXN0KSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoImJEdWFsTWFjU21hcnRDb25jdXJyZW50ID0lZFxuIiwgcERNX09kbS0+YkR1YWxNYWNTbWFydENvbmN1cnJlbnQpKTsKQEAgLTQ4MSwxOCArNDM5LDE5IEBACiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0NPTU1PTiwgT0RNX0RCR19MT1VELCAoIlJTU0lfTWluID0lZFxuIiwgcERNX09kbS0+UlNTSV9NaW4pKTsKIH0KIAotdm9pZCBPRE1fV3JpdGVfRElHMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwKLQl1OCBDdXJyZW50SUdJCi0JKQordm9pZCBPRE1fV3JpdGVfRElHMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwJdTggQ3VycmVudElHSSkKIHsKKwlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwogCXN0cnVjdCBkaWdfdCAqcERNX0RpZ1RhYmxlID0gJnBETV9PZG0tPkRNX0RpZ1RhYmxlOwotCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIk9ETV9SRUcoSUdJX0EsIHBETV9PZG0pID0gMHgleCwgT0RNX0JJVChJR0ksIHBETV9PZG0pID0gMHgleCBcbiIsCi0JCU9ETV9SRUcoSUdJX0EsIHBETV9PZG0pLCBPRE1fQklUKElHSSwgcERNX09kbSkpKTsKKwl1MzIgdmFsMzI7CiAKIAlpZiAocERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlICE9IEN1cnJlbnRJR0kpIHsKLQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIE9ETV9SRUcoSUdJX0EsIHBETV9PZG0pLCBPRE1fQklUKElHSSwgcERNX09kbSksIEN1cnJlbnRJR0kpOwotCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgiQ3VycmVudElHSSgweCUwMngpLiBcbiIsIEN1cnJlbnRJR0kpKTsKKwkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfSUdJX0FfMTFOKTsKKwkJdmFsMzIgJj0gfk9ETV9CSVRfSUdJXzExTjsKKwkJdmFsMzIgfD0gQ3VycmVudElHSTsKKwkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19JR0lfQV8xMU4sIHZhbDMyKTsKKwkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAorCQkJICAgICAoIkN1cnJlbnRJR0koMHglMDJ4KS4gXG4iLCBDdXJyZW50SUdJKSk7CiAJCXBETV9EaWdUYWJsZS0+Q3VySUdWYWx1ZSA9IEN1cnJlbnRJR0k7CiAJfQogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwKQEAgLTUxNSwxMSArNDc0LDEwIEBACiAJQ3VycmVudElHSSA9IEN1cnJlbnRJR0krUlNTSV9PRkZTRVRfRElHOwogCWJGd0N1cnJlbnRJblBTTW9kZSA9IHBBZGFwdGVyLT5wd3JjdHJscHJpdi5iRndDdXJyZW50SW5QU01vZGU7CiAKLQkvKiBPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHX0xQUywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKSA9PT5cbiIpKTsgKi8KLQogCS8qICBVc2luZyBGVyBQUyBtb2RlIHRvIG1ha2UgSUdJICovCiAJaWYgKGJGd0N1cnJlbnRJblBTTW9kZSkgewotCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsICgiLS0tTmVpbC0tLW9kbV9ESUcyM2EgaXMgaW4gTFBTIG1vZGVcbiIpKTsKKwkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELAorCQkJICAgICAoIi0tLU5laWwtLS1vZG1fRElHMjNhIGlzIGluIExQUyBtb2RlXG4iKSk7CiAJCS8qIEFkanVzdCBieSAgRkEgaW4gTFBTIE1PREUgKi8KIAkJaWYgKHBGYWxzZUFsbUNudC0+Q250X2FsbCA+IERNX0RJR19GQV9USDJfTFBTKQogCQkJQ3VycmVudElHSSA9IEN1cnJlbnRJR0krMjsKQEAgLTU0NSwxNSArNTAzLDE3IEBACiAJIGVsc2UgaWYgKEN1cnJlbnRJR0kgPCBSU1NJX0xvd2VyKQogCQlDdXJyZW50SUdJID0gUlNTSV9Mb3dlcjsKIAotCU9ETV9Xcml0ZV9ESUcyM2EocERNX09kbSwgQ3VycmVudElHSSk7LyogT0RNX1dyaXRlX0RJRzIzYShwRE1fT2RtLCBwRE1fRGlnVGFibGUtPkN1cklHVmFsdWUpOyAqLwotCisJT0RNX1dyaXRlX0RJRzIzYShwRE1fT2RtLCBDdXJyZW50SUdJKTsKIH0KIAogdm9pZCBvZG1fRElHMjNhSW5pdChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCiB7CiAJc3RydWN0IGRpZ190ICpwRE1fRGlnVGFibGUgPSAmcERNX09kbS0+RE1fRGlnVGFibGU7CisJdTMyIHZhbDMyOwogCi0JcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlID0gKHU4KSBPRE1fR2V0QkJSZWcocERNX09kbSwgT0RNX1JFRyhJR0lfQSwgcERNX09kbSksIE9ETV9CSVQoSUdJLCBwRE1fT2RtKSk7CisJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKHBETV9PZG0tPkFkYXB0ZXIsIE9ETV9SRUdfSUdJX0FfMTFOKTsKKwlwRE1fRGlnVGFibGUtPkN1cklHVmFsdWUgPSB2YWwzMiAmIE9ETV9CSVRfSUdJXzExTjsKKwogCXBETV9EaWdUYWJsZS0+UnNzaUxvd1RocmVzaAk9IERNX0RJR19USFJFU0hfTE9XOwogCXBETV9EaWdUYWJsZS0+UnNzaUhpZ2hUaHJlc2gJPSBETV9ESUdfVEhSRVNIX0hJR0g7CiAJcERNX0RpZ1RhYmxlLT5GQUxvd1RocmVzaAk9IERNX0ZBTFNFQUxBUk1fVEhSRVNIX0xPVzsKQEAgLTU5MSwyNiArNTUxLDIyIEBACiAJdTggZG1fZGlnX21heCwgZG1fZGlnX21pbjsKIAl1OCBDdXJyZW50SUdJID0gcERNX0RpZ1RhYmxlLT5DdXJJR1ZhbHVlOwogCi0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0RJRywgT0RNX0RCR19MT1VELCAoIm9kbV9ESUcyM2EoKSA9PT5cbiIpKTsKLQkvKiBpZiAoIShwRE1fT2RtLT5TdXBwb3J0QWJpbGl0eSAmIChPRE1fQkJfRElHfE9ETV9CQl9GQV9DTlQpKSkgKi8KLQlpZiAoKCEocERNX09kbS0+U3VwcG9ydEFiaWxpdHkmT0RNX0JCX0RJRykpIHx8ICghKHBETV9PZG0tPlN1cHBvcnRBYmlsaXR5Jk9ETV9CQl9GQV9DTlQpKSkgewotCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCi0JCQkgICAgICgib2RtX0RJRzIzYSgpIFJldHVybjogU3VwcG9ydEFiaWxpdHkgT0RNX0JCX0RJRyBvciBPRE1fQkJfRkFfQ05UIGlzIGRpc2FibGVkXG4iKSk7Ci0JCXJldHVybjsKLQl9Ci0KKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCisJCSAgICAgKCJvZG1fRElHMjNhKCkgPT0+XG4iKSk7CiAJaWYgKGFkYXB0ZXItPm1sbWVwcml2LmJTY2FuSW5Qcm9jZXNzKSB7Ci0JCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9ESUcsIE9ETV9EQkdfTE9VRCwgKCJvZG1fRElHMjNhKCkgUmV0dXJuOiBJbiBTY2FuIFByb2dyZXNzIFxuIikpOworCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRElHLCBPRE1fREJHX0xPVUQsCisJCQkgICAgICgib2RtX0RJRzIzYSgpIFJldHVybjogSW4gU2NhbiBQcm9ncmVzcyBcbiIpKTsKIAkJcmV0dXJuOwogCX0KIAogCURJR19EeW5hbWljX01JTiA9IHBETV9EaWdUYWJsZS0+RElHX0R5bmFtaWNfTUlOXzA7CiAJRmlyc3RDb25uZWN0ID0gKHBETV9PZG0tPmJMaW5rZWQpICYmICghcERNX0RpZ1RhYmxlLT5iTWVkaWFDb25uZWN0XzApOwotCUZpcnN0RGlzQ29ubmVjdCA9ICghcERNX09kbS0+YkxpbmtlZCkgJiYgKHBETV9EaWdUYWJsZS0+Yk1lZGlhQ29ubmVjdF8wKTsKKwlGaXJzdERpc0Nvbm5lY3QgPSAoIXBETV9PZG0tPmJMaW5rZWQpICYmCisJCShwRE1fRGlnVGFibGUtPmJNZWRpYUNvbm5lY3RfMCk7CiAKIAkvKiAxIEJvdW5kYXJ5IERlY2lzaW9uICovCiAJaWYgKChwRE1fT2RtLT5TdXBwb3J0SUNUeXBlICYgT0RNX1JUTDg3MjNBKSAmJgotCSAgICAoKHBETV9PZG0tPkJvYXJkVHlwZSA9PSBPRE1fQk9BUkRfSElHSFBXUikgfHwgcERNX09kbS0+RXh0TE5BKSkgeworCSAgICAocERNX09kbS0+Qm9hcmRUeXBlID09IE9ETV9CT0FSRF9ISUdIUFdSIHx8IHBETV9PZG0tPkV4dExOQSkpIHsKIAkJZG1fZGlnX21heCA9IERNX0RJR19NQVhfTklDX0hQOwogCQlkbV9kaWdfbWluID0gRE1fRElHX01JTl9OSUNfSFA7CiAJCURJR19NYXhPZk1pbiA9IERNX0RJR19NQVhfQVBfSFA7CkBAIC03NjQsMzEgKzcyMCwyOSBAQAogCiB2b2lkIG9kbV9GYWxzZUFsYXJtQ291bnRlclN0YXRpc3RpY3MyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQogewotCXUzMiByZXRfdmFsdWU7CisJc3RydWN0IHJ0d19hZGFwdGVyICphZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKIAlzdHJ1Y3QgZmFsc2VfYWxhcm1fc3RhdHMgKkZhbHNlQWxtQ250ID0gJnBETV9PZG0tPkZhbHNlQWxtQ250OwotCi0JaWYgKCEocERNX09kbS0+U3VwcG9ydEFiaWxpdHkgJiBPRE1fQkJfRkFfQ05UKSkKLQkJcmV0dXJuOworCXUzMiByZXRfdmFsdWUsIHZhbDMyOwogCiAJLyogaG9sZCBvZmRtIGNvdW50ZXIgKi8KLQkgLyogaG9sZCBwYWdlIEMgY291bnRlciAqLwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCBPRE1fUkVHX09GRE1fRkFfSE9MRENfMTFOLCBCSVQoMzEpLCAxKTsKKwkvKiBob2xkIHBhZ2UgQyBjb3VudGVyICovCisJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9IT0xEQ18xMU4pOworCXZhbDMyIHw9IEJJVCgzMSk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX0hPTERDXzExTiwgdmFsMzIpOwogCS8qIGhvbGQgcGFnZSBEIGNvdW50ZXIgKi8KLQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOLCBCSVQoMzEpLCAxKTsKLQlyZXRfdmFsdWUgPQotCQlPRE1fR2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19PRkRNX0ZBX1RZUEUxXzExTiwgYk1hc2tEV29yZCk7CisJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTik7CisJdmFsMzIgfD0gQklUKDMxKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4sIHZhbDMyKTsKKwlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9UWVBFMV8xMU4pOwogCUZhbHNlQWxtQ250LT5DbnRfRmFzdF9Gc3luYyA9IChyZXRfdmFsdWUmMHhmZmZmKTsKLQlGYWxzZUFsbUNudC0+Q250X1NCX1NlYXJjaF9mYWlsID0gKChyZXRfdmFsdWUmMHhmZmZmMDAwMCk+PjE2KTsKLQlyZXRfdmFsdWUgPQotCQlPRE1fR2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19PRkRNX0ZBX1RZUEUyXzExTiwgYk1hc2tEV29yZCk7CisJRmFsc2VBbG1DbnQtPkNudF9TQl9TZWFyY2hfZmFpbCA9IChyZXRfdmFsdWUgJiAweGZmZmYwMDAwKT4+MTY7CisJcmV0X3ZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfVFlQRTJfMTFOKTsKIAlGYWxzZUFsbUNudC0+Q250X09GRE1fQ0NBID0gKHJldF92YWx1ZSYweGZmZmYpOwotCUZhbHNlQWxtQ250LT5DbnRfUGFyaXR5X0ZhaWwgPSAoKHJldF92YWx1ZSYweGZmZmYwMDAwKT4+MTYpOwotCXJldF92YWx1ZSA9Ci0JCU9ETV9HZXRCQlJlZyhwRE1fT2RtLCBPRE1fUkVHX09GRE1fRkFfVFlQRTNfMTFOLCBiTWFza0RXb3JkKTsKKwlGYWxzZUFsbUNudC0+Q250X1Bhcml0eV9GYWlsID0gKHJldF92YWx1ZSAmIDB4ZmZmZjAwMDApPj4xNjsKKwlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9UWVBFM18xMU4pOwogCUZhbHNlQWxtQ250LT5DbnRfUmF0ZV9JbGxlZ2FsID0gKHJldF92YWx1ZSYweGZmZmYpOwotCUZhbHNlQWxtQ250LT5DbnRfQ3JjOF9mYWlsID0gKChyZXRfdmFsdWUmMHhmZmZmMDAwMCk+PjE2KTsKLQlyZXRfdmFsdWUgPQotCQlPRE1fR2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19PRkRNX0ZBX1RZUEU0XzExTiwgYk1hc2tEV29yZCk7CisJRmFsc2VBbG1DbnQtPkNudF9DcmM4X2ZhaWwgPSAocmV0X3ZhbHVlICYgMHhmZmZmMDAwMCk+PjE2OworCXJldF92YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1RZUEU0XzExTik7CiAJRmFsc2VBbG1DbnQtPkNudF9NY3NfZmFpbCA9IChyZXRfdmFsdWUmMHhmZmZmKTsKIAogCUZhbHNlQWxtQ250LT5DbnRfT2ZkbV9mYWlsID0gRmFsc2VBbG1DbnQtPkNudF9QYXJpdHlfRmFpbCArCkBAIC03OTgsMTUgKzc1MiwxNiBAQAogCQlGYWxzZUFsbUNudC0+Q250X0Zhc3RfRnN5bmMgKwogCQlGYWxzZUFsbUNudC0+Q250X1NCX1NlYXJjaF9mYWlsOwogCS8qIGhvbGQgY2NrIGNvdW50ZXIgKi8KLQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTiwgQklUKDEyKSwgMSk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sIEJJVCgxNCksIDEpOworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX0NDS19GQV9SU1RfMTFOKTsKKwl2YWwzMiB8PSAoQklUKDEyKSB8IEJJVCgxNCkpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sIHZhbDMyKTsKIAotCXJldF92YWx1ZSA9IE9ETV9HZXRCQlJlZyhwRE1fT2RtLCBPRE1fUkVHX0NDS19GQV9MU0JfMTFOLCBiTWFza0J5dGUwKTsKKwlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX0xTQl8xMU4pICYgMHhmZjsKIAlGYWxzZUFsbUNudC0+Q250X0Nja19mYWlsID0gcmV0X3ZhbHVlOwotCXJldF92YWx1ZSA9IE9ETV9HZXRCQlJlZyhwRE1fT2RtLCBPRE1fUkVHX0NDS19GQV9NU0JfMTFOLCBiTWFza0J5dGUzKTsKLQlGYWxzZUFsbUNudC0+Q250X0Nja19mYWlsICs9ICAocmV0X3ZhbHVlICYgMHhmZikgPDwgODsKKwlyZXRfdmFsdWUgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX01TQl8xMU4pID4+IDE2OworCUZhbHNlQWxtQ250LT5DbnRfQ2NrX2ZhaWwgKz0gKHJldF92YWx1ZSAmIDB4ZmYwMCk7CiAKLQlyZXRfdmFsdWUgPSBPRE1fR2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19DQ0tfQ0NBX0NOVF8xMU4sIGJNYXNrRFdvcmQpOworCXJldF92YWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfQ0NBX0NOVF8xMU4pOwogCUZhbHNlQWxtQ250LT5DbnRfQ0NLX0NDQSA9CiAJCSgocmV0X3ZhbHVlJjB4RkYpPDw4KSB8ICgocmV0X3ZhbHVlJjB4RkYwMCk+PjgpOwogCkBAIC04MjMsMjYgKzc3OCwzOSBAQAogCiAJaWYgKHBETV9PZG0tPlN1cHBvcnRJQ1R5cGUgPj0gT0RNX1JUTDg3MjNBKSB7CiAJCS8qIHJlc2V0IGZhbHNlIGFsYXJtIGNvdW50ZXIgcmVnaXN0ZXJzICovCi0JCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCBPRE1fUkVHX09GRE1fRkFfUlNUQ18xMU4sIEJJVCgzMSksIDEpOwotCQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19PRkRNX0ZBX1JTVENfMTFOLCBCSVQoMzEpLCAwKTsKLQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTiwgQklUKDI3KSwgMSk7Ci0JCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4sIEJJVCgyNyksIDApOworCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVENfMTFOKTsKKwkJdmFsMzIgfD0gQklUKDMxKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVENfMTFOLCB2YWwzMik7CisJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfUlNUQ18xMU4pOworCQl2YWwzMiAmPSB+QklUKDMxKTsKKwkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVENfMTFOLCB2YWwzMik7CisKKwkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTik7CisJCXZhbDMyIHw9IEJJVCgyNyk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTiwgdmFsMzIpOworCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOKTsKKwkJdmFsMzIgJj0gfkJJVCgyNyk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTiwgdmFsMzIpOworCiAJCS8qIHVwZGF0ZSBvZmRtIGNvdW50ZXIgKi8KIAkJIC8qIHVwZGF0ZSBwYWdlIEMgY291bnRlciAqLwotCQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19PRkRNX0ZBX0hPTERDXzExTiwgQklUKDMxKSwgMCk7CisJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCBPRE1fUkVHX09GRE1fRkFfSE9MRENfMTFOKTsKKwkJdmFsMzIgJj0gfkJJVCgzMSk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9IT0xEQ18xMU4sIHZhbDMyKTsKKwogCQkgLyogdXBkYXRlIHBhZ2UgRCBjb3VudGVyICovCi0JCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCBPRE1fUkVHX09GRE1fRkFfUlNURF8xMU4sIEJJVCgzMSksIDApOworCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19PRkRNX0ZBX1JTVERfMTFOKTsKKwkJdmFsMzIgJj0gfkJJVCgzMSk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfT0ZETV9GQV9SU1REXzExTiwgdmFsMzIpOwogCiAJCS8qIHJlc2V0IENDSyBDQ0EgY291bnRlciAqLwotCQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTiwKLQkJCSAgICAgQklUKDEzKSB8IEJJVCgxMiksIDApOwotCQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTiwKLQkJCSAgICAgQklUKDEzKSB8IEJJVCgxMiksIDIpOwotCQkvKiByZXNldCBDQ0sgRkEgY291bnRlciAqLwotCQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTiwKLQkJCSAgICAgQklUKDE1KSB8IEJJVCgxNCksIDApOwotCQlPRE1fU2V0QkJSZWcocERNX09kbSwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTiwKLQkJCSAgICAgQklUKDE1KSB8IEJJVCgxNCksIDIpOworCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTik7CisJCXZhbDMyICY9IH4oQklUKDEyKSB8IEJJVCgxMykgfCBCSVQoMTQpIHwgQklUKDE1KSk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sIHZhbDMyKTsKKworCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgT0RNX1JFR19DQ0tfRkFfUlNUXzExTik7CisJCXZhbDMyIHw9IChCSVQoMTMpIHwgQklUKDE1KSk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIE9ETV9SRUdfQ0NLX0ZBX1JTVF8xMU4sIHZhbDMyKTsKIAl9CiAKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRkFfQ05ULCBPRE1fREJHX0xPVUQsCkBAIC04NTksOSArODI3LDEyIEBACiAJCSAgICAgKCJDbnRfQ3JjOF9mYWlsID0lZCwgQ250X01jc19mYWlsID0lZFxuIiwKIAkJICAgICAgRmFsc2VBbG1DbnQtPkNudF9DcmM4X2ZhaWwsIEZhbHNlQWxtQ250LT5DbnRfTWNzX2ZhaWwpKTsKIAotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwgKCJDbnRfQ2NrX2ZhaWwgPSVkXG4iLCBGYWxzZUFsbUNudC0+Q250X0Nja19mYWlsKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0ZBX0NOVCwgT0RNX0RCR19MT1VELCAoIkNudF9PZmRtX2ZhaWwgPSVkXG4iLCBGYWxzZUFsbUNudC0+Q250X09mZG1fZmFpbCkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwgKCJUb3RhbCBGYWxzZSBBbGFybSA9JWRcbiIsIEZhbHNlQWxtQ250LT5DbnRfYWxsKSk7CisJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0ZBX0NOVCwgT0RNX0RCR19MT1VELAorCQkgICAgICgiQ250X0Nja19mYWlsID0lZFxuIiwgRmFsc2VBbG1DbnQtPkNudF9DY2tfZmFpbCkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKKwkJICAgICAoIkNudF9PZmRtX2ZhaWwgPSVkXG4iLCBGYWxzZUFsbUNudC0+Q250X09mZG1fZmFpbCkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9GQV9DTlQsIE9ETV9EQkdfTE9VRCwKKwkJICAgICAoIlRvdGFsIEZhbHNlIEFsYXJtID0lZFxuIiwgRmFsc2VBbG1DbnQtPkNudF9hbGwpKTsKIH0KIAogLyogMyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KQEAgLTg3MywxNiArODQ0LDEzIEBACiAJc3RydWN0IGZhbHNlX2FsYXJtX3N0YXRzICpGYWxzZUFsbUNudCA9ICZwRE1fT2RtLT5GYWxzZUFsbUNudDsKIAl1OCBDdXJDQ0tfQ0NBVGhyZXM7CiAKLQlpZiAoIShwRE1fT2RtLT5TdXBwb3J0QWJpbGl0eSAmIChPRE1fQkJfQ0NLX1BEfE9ETV9CQl9GQV9DTlQpKSkKLQkJcmV0dXJuOwotCiAJaWYgKHBETV9PZG0tPkV4dExOQSkKIAkJcmV0dXJuOwogCiAJaWYgKHBETV9PZG0tPmJMaW5rZWQpIHsKIAkJaWYgKHBETV9PZG0tPlJTU0lfTWluID4gMjUpIHsKIAkJCUN1ckNDS19DQ0FUaHJlcyA9IDB4Y2Q7Ci0JCX0gZWxzZSBpZiAoKHBETV9PZG0tPlJTU0lfTWluIDw9IDI1KSAmJiAocERNX09kbS0+UlNTSV9NaW4gPiAxMCkpIHsKKwkJfSBlbHNlIGlmIChwRE1fT2RtLT5SU1NJX01pbiA8PSAyNSAmJiBwRE1fT2RtLT5SU1NJX01pbiA+IDEwKSB7CiAJCQlDdXJDQ0tfQ0NBVGhyZXMgPSAweDgzOwogCQl9IGVsc2UgewogCQkJaWYgKEZhbHNlQWxtQ250LT5DbnRfQ2NrX2ZhaWwgPiAxMDAwKQpAQCAtOTA1LDEwICs4NzMsMTAgQEAKIAlzdHJ1Y3QgZGlnX3QgKnBETV9EaWdUYWJsZSA9ICZwRE1fT2RtLT5ETV9EaWdUYWJsZTsKIAogCWlmIChwRE1fRGlnVGFibGUtPkN1ckNDS19DQ0FUaHJlcyAhPSBDdXJDQ0tfQ0NBVGhyZXMpCi0JCU9ETV9Xcml0ZTFCeXRlKHBETV9PZG0sIE9ETV9SRUcoQ0NLX0NDQSwgcERNX09kbSksIEN1ckNDS19DQ0FUaHJlcyk7CisJCXJ0bDg3MjNhdV93cml0ZTgocERNX09kbS0+QWRhcHRlciwgT0RNX1JFRyhDQ0tfQ0NBLCBwRE1fT2RtKSwKKwkJCQkgQ3VyQ0NLX0NDQVRocmVzKTsKIAlwRE1fRGlnVGFibGUtPlByZUNDS19DQ0FUaHJlcyA9IHBETV9EaWdUYWJsZS0+Q3VyQ0NLX0NDQVRocmVzOwogCXBETV9EaWdUYWJsZS0+Q3VyQ0NLX0NDQVRocmVzID0gQ3VyQ0NLX0NDQVRocmVzOwotCiB9CiAKIC8qIDMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCkBAIC05MzQsMjAgKzkwMiwxOSBAQAogdm9pZCBPRE1fUkZfU2F2aW5nMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTggYkZvcmNlSW5Ob3JtYWwpCiB7CiAJc3RydWN0IGR5bmFtaWNfcHdyX3NhdiAqcERNX1BTVGFibGUgPSAmcERNX09kbS0+RE1fUFNUYWJsZTsKKwlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOworCXUzMiB2YWwzMjsKIAl1OCBSc3NpX1VwX2JvdW5kID0gMzA7CiAJdTggUnNzaV9Mb3dfYm91bmQgPSAyNTsKLQlpZiAocERNX09kbS0+UGF0Y2hJRCA9PSA0MCkgeyAvKiBSVF9DSURfODE5eF9GVU5BSV9UViAqLwotCQlSc3NpX1VwX2JvdW5kID0gNTA7Ci0JCVJzc2lfTG93X2JvdW5kID0gNDU7Ci0JfQogCWlmIChwRE1fUFNUYWJsZS0+aW5pdGlhbGl6ZSA9PSAwKSB7CiAKLQkJcERNX1BTVGFibGUtPlJlZzg3NCA9IChPRE1fR2V0QkJSZWcocERNX09kbSwgMHg4NzQsIGJNYXNrRFdvcmQpJjB4MUNDMDAwKT4+MTQ7CisJCXBETV9QU1RhYmxlLT5SZWc4NzQgPQorCQkJcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDg3NCkgJiAweDFDQzAwMDsKIAkJcERNX1BTVGFibGUtPlJlZ0M3MCA9Ci0JCQkoT0RNX0dldEJCUmVnKHBETV9PZG0sIDB4YzcwLCBiTWFza0RXb3JkKSAmIEJJVCgzKSkgPj4zOwotCQlwRE1fUFNUYWJsZS0+UmVnODVDID0gKE9ETV9HZXRCQlJlZyhwRE1fT2RtLCAweDg1YywgYk1hc2tEV29yZCkmMHhGRjAwMDAwMCk+PjI0OwotCQlwRE1fUFNUYWJsZS0+UmVnQTc0ID0gKE9ETV9HZXRCQlJlZyhwRE1fT2RtLCAweGE3NCwgYk1hc2tEV29yZCkmMHhGMDAwKT4+MTI7Ci0JCS8qIFJlZzgxOCA9IFBIWV9RdWVyeUJCUmVnKHBBZGFwdGVyLCAweDgxOCwgYk1hc2tEV29yZCk7ICovCisJCQlydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4YzcwKSAmIEJJVCgzKTsKKwkJcERNX1BTVGFibGUtPlJlZzg1QyA9CisJCQlydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODVjKSAmIDB4RkYwMDAwMDA7CisJCXBETV9QU1RhYmxlLT5SZWdBNzQgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4YTc0KSAmIDB4RjAwMDsKIAkJcERNX1BTVGFibGUtPmluaXRpYWxpemUgPSAxOwogCX0KIApAQCAtOTczLDI2ICs5NDAsNzQgQEAKIAogCWlmIChwRE1fUFNUYWJsZS0+UHJlUkZTdGF0ZSAhPSBwRE1fUFNUYWJsZS0+Q3VyUkZTdGF0ZSkgewogCQlpZiAocERNX1BTVGFibGUtPkN1clJGU3RhdGUgPT0gUkZfU2F2ZSkgewotCQkJLyogIDx0eW5saV9ub3RlPiA4NzIzIFJTU0kgcmVwb3J0IHdpbGwgYmUgd3JvbmcuIFNldCAweDg3NFs1XT0gMSB3aGVuIGVudGVyIEJCIHBvd2VyIHNhdmluZyBtb2RlLiAqLworCQkJLyogIDx0eW5saV9ub3RlPiA4NzIzIFJTU0kgcmVwb3J0IHdpbGwgYmUgd3JvbmcuCisJCQkgKiBTZXQgMHg4NzRbNV09IDEgd2hlbiBlbnRlciBCQiBwb3dlciBzYXZpbmcgbW9kZS4gKi8KIAkJCS8qICBTdWdnZXN0ZWQgYnkgU0QzIFl1LU5hbi4gMjAxMS4wMS4yMC4gKi8KLQkJCWlmIChwRE1fT2RtLT5TdXBwb3J0SUNUeXBlID09IE9ETV9SVEw4NzIzQSkKLQkJCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHg4NzQsIEJJVCg1KSwgMHgxKTsgLyogUmVnODc0WzVdPSAxYicxICovCi0JCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHg4NzQsIDB4MUMwMDAwLCAweDIpOyAvKiBSZWc4NzRbMjA6MThdPSAzJ2IwMTAgKi8KLQkJCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCAweGM3MCwgQklUKDMpLCAwKTsgLyogUmVnQzcwWzNdPSAxJ2IwICovCi0JCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHg4NWMsIDB4RkYwMDAwMDAsIDB4NjMpOyAvKiBSZWc4NUNbMzE6MjRdPSAweDYzICovCi0JCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHg4NzQsIDB4QzAwMCwgMHgyKTsgLyogUmVnODc0WzE1OjE0XT0gMidiMTAgKi8KLQkJCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCAweGE3NCwgMHhGMDAwLCAweDMpOyAvKiBSZWdBNzVbNzo0XT0gMHgzICovCi0JCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHg4MTgsIEJJVCgyOCksIDB4MCk7IC8qIFJlZzgxOFsyOF09IDEnYjAgKi8KLQkJCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCAweDgxOCwgQklUKDI4KSwgMHgxKTsgLyogUmVnODE4WzI4XT0gMSdiMSAqLworCQkJLyogUmVnODc0WzVdPSAxYicxICovCisJCQlpZiAocERNX09kbS0+U3VwcG9ydElDVHlwZSA9PSBPRE1fUlRMODcyM0EpIHsKKwkJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOworCQkJCXZhbDMyIHw9IEJJVCg1KTsKKwkJCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweDg3NCwgdmFsMzIpOworCQkJfQorCQkJLyogUmVnODc0WzIwOjE4XT0gMydiMDEwICovCisJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOworCQkJdmFsMzIgJj0gfihCSVQoMTgpIHwgQklUKDIwKSk7CisJCQl2YWwzMiB8PSBCSVQoMTkpOworCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKKwkJCS8qIFJlZ0M3MFszXT0gMSdiMCAqLworCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4YzcwKTsKKwkJCXZhbDMyICY9IH5CSVQoMyk7CisJCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweGM3MCwgdmFsMzIpOworCQkJLyogUmVnODVDWzMxOjI0XT0gMHg2MyAqLworCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODVjKTsKKwkJCXZhbDMyICY9IDB4MDBmZmZmZmY7CisJCQl2YWwzMiB8PSAweDYzMDAwMDAwOworCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NWMsIHZhbDMyKTsKKwkJCS8qIFJlZzg3NFsxNToxNF09IDInYjEwICovCisJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOworCQkJdmFsMzIgJj0gfkJJVCgxNCk7CisJCQl2YWwzMiB8PSBCSVQoMTUpOworCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKKwkJCS8qIFJlZ0E3NVs3OjRdPSAweDMgKi8KKwkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweGE3NCk7CisJCQl2YWwzMiAmPSB+KEJJVCgxNCkgfCBCSVQoMTUpKTsKKwkJCXZhbDMyIHw9IChCSVQoMTIpIHwgQklUKDEzKSk7CisJCQlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweGE3NCwgdmFsMzIpOworCQkJLyogUmVnODE4WzI4XT0gMSdiMCAqLworCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODE4KTsKKwkJCXZhbDMyICY9IH5CSVQoMjgpOworCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MTgsIHZhbDMyKTsKKwkJCS8qIFJlZzgxOFsyOF09IDEnYjEgKi8KKwkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgxOCk7CisJCQl2YWwzMiB8PSBCSVQoMjgpOworCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MTgsIHZhbDMyKTsKIAkJfSBlbHNlIHsKLQkJCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCAweDg3NCwgMHgxQ0MwMDAsIHBETV9QU1RhYmxlLT5SZWc4NzQpOwotCQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIDB4YzcwLCBCSVQoMyksIHBETV9QU1RhYmxlLT5SZWdDNzApOwotCQkJT0RNX1NldEJCUmVnKHBETV9PZG0sIDB4ODVjLCAweEZGMDAwMDAwLCBwRE1fUFNUYWJsZS0+UmVnODVDKTsKLQkJCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCAweGE3NCwgMHhGMDAwLCBwRE1fUFNUYWJsZS0+UmVnQTc0KTsKLQkJCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCAweDgxOCwgQklUKDI4KSwgMHgwKTsKKwkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDg3NCk7CisJCQl2YWwzMiB8PSBwRE1fUFNUYWJsZS0+UmVnODc0OworCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKKwkJCisJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHhjNzApOworCQkJdmFsMzIgfD0gcERNX1BTVGFibGUtPlJlZ0M3MDsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4YzcwLCB2YWwzMik7CiAKLQkJCWlmIChwRE1fT2RtLT5TdXBwb3J0SUNUeXBlID09IE9ETV9SVEw4NzIzQSkKLQkJCQlPRE1fU2V0QkJSZWcocERNX09kbSwgMHg4NzQsIEJJVCg1KSwgMHgwKTsgLyogUmVnODc0WzVdPSAxYicwICovCisJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NWMpOworCQkJdmFsMzIgfD0gcERNX1BTVGFibGUtPlJlZzg1QzsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIDB4ODVjLCB2YWwzMik7CisKKwkJCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweGE3NCk7CisJCQl2YWwzMiB8PSBwRE1fUFNUYWJsZS0+UmVnQTc0OworCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHhhNzQsIHZhbDMyKTsKKworCQkJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODE4KTsKKwkJCXZhbDMyICY9IH5CSVQoMjgpOworCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MTgsIHZhbDMyKTsKKworCQkJLyogUmVnODc0WzVdPSAxYicwICovCisJCQlpZiAocERNX09kbS0+U3VwcG9ydElDVHlwZSA9PSBPRE1fUlRMODcyM0EpIHsKKwkJCQl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4NzQpOworCQkJCXZhbDMyICY9IH5CSVQoNSk7CisJCQkJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4NzQsIHZhbDMyKTsKKwkJCX0KIAkJfQogCQlwRE1fUFNUYWJsZS0+UHJlUkZTdGF0ZSA9IHBETV9QU1RhYmxlLT5DdXJSRlN0YXRlOwogCX0KQEAgLTEwMTAsMTAgKzEwMjUsNiBAQAogCXN0cnVjdCBvZG1fcmF0ZV9hZGFwdCAqcE9kbVJBID0gJnBETV9PZG0tPlJhdGVBZGFwdGl2ZTsKIAogCXBPZG1SQS0+VHlwZSA9IERNX1R5cGVfQnlEcml2ZXI7Ci0JaWYgKHBPZG1SQS0+VHlwZSA9PSBETV9UeXBlX0J5RHJpdmVyKQotCQlwRE1fT2RtLT5iVXNlUkFNYXNrID0gdHJ1ZTsKLQllbHNlCi0JCXBETV9PZG0tPmJVc2VSQU1hc2sgPSBmYWxzZTsKIAogCXBPZG1SQS0+UkFUUlN0YXRlID0gRE1fUkFUUl9TVEFfSU5JVDsKIAlwT2RtUkEtPkhpZ2hSU1NJVGhyZXNoID0gNTA7CkBAIC0xMDU3LDcgKzEwNjgsOCBAQAogCQlicmVhazsKIAljYXNlIChPRE1fV01fQnxPRE1fV01fR3xPRE1fV01fTjI0Ryk6CiAJY2FzZSAoT0RNX1dNX0F8T0RNX1dNX0J8T0RNX1dNX0d8T0RNX1dNX04yNEcpOgotCQlpZiAocERNX09kbS0+UkZUeXBlID09IE9ETV8xVDJSIHx8IHBETV9PZG0tPlJGVHlwZSA9PSBPRE1fMVQxUikgeworCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMVQyUiB8fAorCQkgICAgcEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMVQxUikgewogCQkJaWYgKHJzc2lfbGV2ZWwgPT0gRE1fUkFUUl9TVEFfSElHSCkgewogCQkJCXJhdGVfYml0bWFwID0gMHgwMDBmMDAwMDsKIAkJCX0gZWxzZSBpZiAocnNzaV9sZXZlbCA9PSBETV9SQVRSX1NUQV9NSURETEUpIHsKQEAgLTEwODYsMjIgKzEwOTgsMjIgQEAKIAlkZWZhdWx0OgogCQkvKiBjYXNlIFdJUkVMRVNTXzExXzI0TjogKi8KIAkJLyogY2FzZSBXSVJFTEVTU18xMV81TjogKi8KLQkJaWYgKHBETV9PZG0tPlJGVHlwZSA9PSBSRl8xVDJSKQorCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMVQyUikKIAkJCXJhdGVfYml0bWFwID0gMHgwMDBmZmZmZjsKIAkJZWxzZQogCQkJcmF0ZV9iaXRtYXAgPSAweDBmZmZmZmZmOwogCQlicmVhazsKIAl9CiAKLQkvKiBwcmludGsoIiVzID09PiByc3NpX2xldmVsOjB4JTAyeCwgV2lyZWxlc3NNb2RlOjB4JTAyeCwgcmF0ZV9iaXRtYXA6MHglMDh4IFxuIiwgX19mdW5jX18sIHJzc2lfbGV2ZWwsIFdpcmVsZXNzTW9kZSwgcmF0ZV9iaXRtYXApOyAqLwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9SQV9NQVNLLCBPRE1fREJHX0xPVUQsICgiID09PiByc3NpX2xldmVsOjB4JTAyeCwgV2lyZWxlc3NNb2RlOjB4JTAyeCwgcmF0ZV9iaXRtYXA6MHglMDh4IFxuIiwgcnNzaV9sZXZlbCwgV2lyZWxlc3NNb2RlLCByYXRlX2JpdG1hcCkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9SQV9NQVNLLCBPRE1fREJHX0xPVUQsCisJKCIgPT0+IHJzc2lfbGV2ZWw6MHglMDJ4LCBXaXJlbGVzc01vZGU6MHglMDJ4LCByYXRlX2JpdG1hcDoweCUwOHggXG4iLAorCSByc3NpX2xldmVsLCBXaXJlbGVzc01vZGUsIHJhdGVfYml0bWFwKSk7CiAKIAlyZXR1cm4gcmF0ZV9iaXRtYXA7Ci0KIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogRnVuY3Rpb246CW9kbV9SZWZyZXNoUmF0ZUFkYXB0aXZlTWFzazIzYSgpCisgKiBGdW5jdGlvbjoJb2RtX1JlZnJlc2hSYXRlQWRhcHRpdmVNYXNrKCkKICAqCiAgKiBPdmVydmlldzoJVXBkYXRlIHJhdGUgdGFibGUgbWFzayBhY2NvcmRpbmcgdG8gcnNzaQogICoKQEAgLTExMTYsNTEgKzExMjgsMzUgQEAKICAqMDUvMjcvMjAwOQlocGZhbglDcmVhdGUgVmVyc2lvbiAwLgogICoKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLXZvaWQgb2RtX1JlZnJlc2hSYXRlQWRhcHRpdmVNYXNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKK3N0YXRpYyB2b2lkIG9kbV9SZWZyZXNoUmF0ZUFkYXB0aXZlTWFzayhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCiB7Ci0JaWYgKCEocERNX09kbS0+U3VwcG9ydEFiaWxpdHkgJiBPRE1fQkJfUkFfTUFTSykpCi0JCXJldHVybjsKLQkvKiAgKi8KLQkvKiAgMjAxMS8wOS8yOSBNSCBJbiBIVyBpbnRlZ3JhdGlvbiBmaXJzdCBzdGFnZSwgd2UgcHJvdmlkZSA0IGRpZmZlcmVudCBoYW5kbGUgdG8gb3BlcmF0ZSAqLwotCS8qICBhdCB0aGUgc2FtZSB0aW1lLiBJbiB0aGUgc3RhZ2UyLzMsIHdlIG5lZWQgdG8gcHJpdmUgdW5pdmVyc2FsIGludGVyZmFjZSBhbmQgbWVyZ2UgYWxsICovCi0JLyogIEhXIGR5bmFtaWMgbWVjaGFuaXNtLiAqLwotCS8qICAqLwotCW9kbV9SZWZyZXNoUmF0ZUFkYXB0aXZlTWFzazIzYUNFMjNhKHBETV9PZG0pOwotfQotCi12b2lkIG9kbV9SZWZyZXNoUmF0ZUFkYXB0aXZlTWFzazIzYUNFMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKKwlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKKwl1MzIgc21vb3RoZWQ7CiAJdTggaTsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyCSA9ICBwRE1fT2RtLT5BZGFwdGVyOwogCiAJaWYgKHBBZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCkgewogCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfUkFfTUFTSywgT0RNX0RCR19UUkFDRSwKLQkJCSAgICAgKCI8LS0tLSBvZG1fUmVmcmVzaFJhdGVBZGFwdGl2ZU1hc2syM2EoKTogZHJpdmVyIGlzIGdvaW5nIHRvIHVubG9hZFxuIikpOworCQkJICAgICAoIjwtLS0tICVzOiBkcml2ZXIgaXMgZ29pbmcgdG8gdW5sb2FkXG4iLAorCQkJICAgICAgX19mdW5jX18pKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICghcERNX09kbS0+YlVzZVJBTWFzaykgewotCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfUkFfTUFTSywgT0RNX0RCR19MT1VELAotCQkJICAgICAoIjwtLS0tIG9kbV9SZWZyZXNoUmF0ZUFkYXB0aXZlTWFzazIzYSgpOiBkcml2ZXIgZG9lcyBub3QgY29udHJvbCByYXRlIGFkYXB0aXZlIG1hc2tcbiIpKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHByaW50aygiPT0+ICVzIFxuIiwgX19mdW5jX18pOyAqLwotCiAJZm9yIChpID0gMDsgaSA8IE9ETV9BU1NPQ0lBVEVfRU5UUllfTlVNOyBpKyspIHsKIAkJc3RydWN0IHN0YV9pbmZvICpwc3RhdCA9IHBETV9PZG0tPnBPRE1fU3RhSW5mb1tpXTsKIAkJaWYgKHBzdGF0KSB7Ci0JCQlpZiAoT0RNX1JBU3RhdGVDaGVjazIzYShwRE1fT2RtLCBwc3RhdC0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCLCBmYWxzZSwgJnBzdGF0LT5yc3NpX2xldmVsKSkgewotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9SQV9NQVNLLCBPRE1fREJHX0xPVUQsCisJCQlzbW9vdGhlZCA9IHBzdGF0LT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7CisJCQlpZiAoT0RNX1JBU3RhdGVDaGVjazIzYShwRE1fT2RtLCBzbW9vdGhlZCwgZmFsc2UsCisJCQkJCQkmcHN0YXQtPnJzc2lfbGV2ZWwpKSB7CisJCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX1JBX01BU0ssCisJCQkJCSAgICAgT0RNX0RCR19MT1VELAogCQkJCQkgICAgICgiUlNTSTolZCwgUlNTSV9MRVZFTDolZFxuIiwKLQkJCQkJICAgICBwc3RhdC0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCLAotCQkJCQkgICAgIHBzdGF0LT5yc3NpX2xldmVsKSk7Ci0JCQkJcnR3X2hhbF91cGRhdGVfcmFfbWFzazIzYShwc3RhdCwgcHN0YXQtPnJzc2lfbGV2ZWwpOworCQkJCQkgICAgICBzbW9vdGhlZCwKKwkJCQkJICAgICAgcHN0YXQtPnJzc2lfbGV2ZWwpKTsKKwkJCQlydHdfaGFsX3VwZGF0ZV9yYV9tYXNrMjNhKHBzdGF0LAorCQkJCQkJCSAgcHN0YXQtPnJzc2lfbGV2ZWwpOwogCQkJfQotCiAJCX0KIAl9Ci0KIH0KIAogLyogIFJldHVybiBWYWx1ZTogYm9vbCAqLwpAQCAtMTE4OSw3ICsxMTg1LDggQEAKIAkJTG93UlNTSVRocmVzaEZvclJBICs9IEdvVXBHYXA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCU9ETV9SVF9BU1NFUlQocERNX09kbSwgZmFsc2UsICgid3JvbmcgcnNzaSBsZXZlbCBzZXR0aW5nICVkICEiLCAqcFJBVFJTdGF0ZSkpOworCQlPRE1fUlRfQVNTRVJUKHBETV9PZG0sIGZhbHNlLCAoIndyb25nIHJzc2kgbGV2ZWwgc2V0dGluZyAlZCAhIiwKKwkJCQkJICAgICAgICpwUkFUUlN0YXRlKSk7CiAJCWJyZWFrOwogCX0KIApAQCAtMTIyNywyNCArMTIyNCw4IEBACiAJcGRtcHJpdi0+RHluYW1pY1R4SGlnaFBvd2VyTHZsID0gVHhIaWdoUHdyTGV2ZWxfTm9ybWFsOwogfQogCi12b2lkIG9kbV9SU1NJTW9uaXRvckNoZWNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQkvKiAgRm9yIEFQL0FEU0wgdXNlIHN0cnVjdCBydGw4NzIzYV9wcml2ICogKi8KLQkvKiAgRm9yIENFL05JQyB1c2Ugc3RydWN0IHJ0d19hZGFwdGVyICogKi8KLQotCWlmICghKHBETV9PZG0tPlN1cHBvcnRBYmlsaXR5ICYgT0RNX0JCX1JTU0lfTU9OSVRPUikpCi0JCXJldHVybjsKLQotCS8qICAyMDExLzA5LzI5IE1IIEluIEhXIGludGVncmF0aW9uIGZpcnN0IHN0YWdlLCB3ZSBwcm92aWRlIDQgZGlmZmVyZW50IGhhbmRsZSB0byBvcGVyYXRlICovCi0JLyogIGF0IHRoZSBzYW1lIHRpbWUuIEluIHRoZSBzdGFnZTIvMywgd2UgbmVlZCB0byBwcml2ZSB1bml2ZXJzYWwgaW50ZXJmYWNlIGFuZCBtZXJnZSBhbGwgKi8KLQkvKiAgSFcgZHluYW1pYyBtZWNoYW5pc20uICovCi0Jb2RtX1JTU0lNb25pdG9yQ2hlY2syM2FDRShwRE1fT2RtKTsKLX0JLyogIG9kbV9SU1NJTW9uaXRvckNoZWNrMjNhICovCi0KIHN0YXRpYyB2b2lkCi1GaW5kTWluaW11bVJTU0koCi0Jc3RydWN0IHJ0d19hZGFwdGVyICpwQWRhcHRlcgotCSkKK0ZpbmRNaW5pbXVtUlNTSShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBBZGFwdGVyKQogewogCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOwogCXN0cnVjdCBkbV9wcml2ICpwZG1wcml2ID0gJnBIYWxEYXRhLT5kbXByaXY7CkBAIC0xMjUyLDIxICsxMjMzLDIyIEBACiAKIAkvKiAxIDEuRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIFJTU0kgKi8KIAotCWlmICgoIXBETV9PZG0tPmJMaW5rZWQpICYmCi0JICAgIChwZG1wcml2LT5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCID09IDApKQorCWlmICghcERNX09kbS0+YkxpbmtlZCAmJiAhcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQikKIAkJcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0gPSAwOwogCWVsc2UKLQkJcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0gPSBwZG1wcml2LT5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOworCQlwZG1wcml2LT5NaW5VbmRlY29yYXRlZFBXREJGb3JETSA9CisJCQlwZG1wcml2LT5FbnRyeU1pblVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwogfQogCi12b2lkIG9kbV9SU1NJTW9uaXRvckNoZWNrMjNhQ0Uoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQorc3RhdGljIHZvaWQgb2RtX1JTU0lNb25pdG9yQ2hlY2soc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQogewogCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7CiAJc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKIAlzdHJ1Y3QgZG1fcHJpdiAqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwotCWludAlpOwotCWludAl0bXBFbnRyeU1heFBXREIgPSAwLCB0bXBFbnRyeU1pblBXREIgPSAweGZmOworCWludCBpOworCWludCBNYXhEQiA9IDAsIE1pbkRCID0gMHhmZjsKIAl1OCBzdGFfY250ID0gMDsKKwl1MzIgdG1wZGI7CiAJdTMyIFBXREJfcnNzaVtOVU1fU1RBXSA9IHswfTsvKiAwfjE1XTpNQUNJRCwgWzE2fjMxXTpQV0RCX3Jzc2kgKi8KIAlzdHJ1Y3Qgc3RhX2luZm8gKnBzdGE7CiAKQEAgLTEyNzYsMzcgKzEyNTgsMzYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgT0RNX0FTU09DSUFURV9FTlRSWV9OVU07IGkrKykgewogCQlwc3RhID0gcERNX09kbS0+cE9ETV9TdGFJbmZvW2ldOwogCQlpZiAocHN0YSkgewotCQkJaWYgKHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA8IHRtcEVudHJ5TWluUFdEQikKLQkJCQl0bXBFbnRyeU1pblBXREIgPSBwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7CisJCQlpZiAocHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCIDwgTWluREIpCisJCQkJTWluREIgPSBwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREI7CiAKLQkJCWlmIChwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPiB0bXBFbnRyeU1heFBXREIpCi0JCQkJdG1wRW50cnlNYXhQV0RCID0gcHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOworCQkJaWYgKHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA+IE1heERCKQorCQkJCU1heERCID0gcHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCOwogCi0JCQlpZiAocHN0YS0+cnNzaV9zdGF0LlVuZGVjb3JhdGVkU21vb3RoZWRQV0RCICE9ICgtMSkpCi0JCQkJUFdEQl9yc3NpW3N0YV9jbnQrK10gPSAocHN0YS0+bWFjX2lkIHwgKHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQjw8MTYpKTsKKwkJCWlmIChwc3RhLT5yc3NpX3N0YXQuVW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgIT0gLTEpIHsKKwkJCQl0bXBkYiA9IHBzdGEtPnJzc2lfc3RhdC5VbmRlY29yYXRlZFNtb290aGVkUFdEQjsKKwkJCQlQV0RCX3Jzc2lbc3RhX2NudCsrXSA9IHBzdGEtPm1hY19pZCB8CisJCQkJCSh0bXBkYiA8PCAxNik7CisJCQl9CiAJCX0KIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgc3RhX2NudDsgaSsrKSB7Ci0JCWlmIChQV0RCX3Jzc2lbaV0gIT0gKDApKSB7Ci0JCQlpZiAocEhhbERhdGEtPmZ3X3JhY3RybCkgLyogIFJlcG9ydCBldmVyeSBzdGEncyBSU1NJIHRvIEZXICovCi0JCQkJcnRsODcyM2Ffc2V0X3Jzc2lfY21kKEFkYXB0ZXIsICh1OCAqKSZQV0RCX3Jzc2lbaV0pOwotCQl9CisJCWlmIChQV0RCX3Jzc2lbaV0gIT0gKDApKQorCQkJcnRsODcyM2Ffc2V0X3Jzc2lfY21kKEFkYXB0ZXIsICh1OCAqKSZQV0RCX3Jzc2lbaV0pOwogCX0KIAotCWlmICh0bXBFbnRyeU1heFBXREIgIT0gMCkJLyogIElmIGFzc29jaWF0ZWQgZW50cnkgaXMgZm91bmQgKi8KLQkJcGRtcHJpdi0+RW50cnlNYXhVbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IHRtcEVudHJ5TWF4UFdEQjsKLQllbHNlCi0JCXBkbXByaXYtPkVudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSAwOworCXBkbXByaXYtPkVudHJ5TWF4VW5kZWNvcmF0ZWRTbW9vdGhlZFBXREIgPSBNYXhEQjsKIAotCWlmICh0bXBFbnRyeU1pblBXREIgIT0gMHhmZikgLyogIElmIGFzc29jaWF0ZWQgZW50cnkgaXMgZm91bmQgKi8KLQkJcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IHRtcEVudHJ5TWluUFdEQjsKKwlpZiAoTWluREIgIT0gMHhmZikgLyogIElmIGFzc29jaWF0ZWQgZW50cnkgaXMgZm91bmQgKi8KKwkJcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IE1pbkRCOwogCWVsc2UKIAkJcGRtcHJpdi0+RW50cnlNaW5VbmRlY29yYXRlZFNtb290aGVkUFdEQiA9IDA7CiAKIAlGaW5kTWluaW11bVJTU0koQWRhcHRlcik7LyogZ2V0IHBkbXByaXYtPk1pblVuZGVjb3JhdGVkUFdEQkZvckRNICovCiAKLQlPRE1fQ21uSW5mb1VwZGF0ZTIzYSgmcEhhbERhdGEtPm9kbXByaXYsIE9ETV9DTU5JTkZPX1JTU0lfTUlOLCBwZG1wcml2LT5NaW5VbmRlY29yYXRlZFBXREJGb3JETSk7CisJT0RNX0NtbkluZm9VcGRhdGUyM2EoJnBIYWxEYXRhLT5vZG1wcml2LCBPRE1fQ01OSU5GT19SU1NJX01JTiwKKwkJCSAgICAgcGRtcHJpdi0+TWluVW5kZWNvcmF0ZWRQV0RCRm9yRE0pOwogfQogCiAvKiBlbmRpZiAqLwpAQCAtMTMxNCwxMiArMTI5NSw3IEBACiAvKiAzIFR4IFBvd2VyIFRyYWNraW5nICovCiAvKiAzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwogCi12b2lkIG9kbV9UWFBvd2VyVHJhY2tpbmdJbml0MjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQlvZG1fVFhQb3dlclRyYWNraW5nVGhlcm1hbE1ldGVySW5pdDIzYShwRE1fT2RtKTsKLX0KLQotdm9pZCBvZG1fVFhQb3dlclRyYWNraW5nVGhlcm1hbE1ldGVySW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCitzdGF0aWMgdm9pZCBvZG1fVFhQb3dlclRyYWNraW5nSW5pdChzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCiB7CiAJc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKIAlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwpAQCAtMTMyOSw0MiArMTMwNSwzMyBAQAogCXBkbXByaXYtPlRYUG93ZXJjb3VudCA9IDA7CiAJcGRtcHJpdi0+YlRYUG93ZXJUcmFja2luZ0luaXQgPSBmYWxzZTsKIAlwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sID0gdHJ1ZTsKLQlNU0dfODcyM0EoInBkbXByaXYtPlR4UG93ZXJUcmFja0NvbnRyb2wgPSAlZFxuIiwgcGRtcHJpdi0+VHhQb3dlclRyYWNrQ29udHJvbCk7CisJTVNHXzg3MjNBKCJwZG1wcml2LT5UeFBvd2VyVHJhY2tDb250cm9sID0gJWRcbiIsCisJCSAgcGRtcHJpdi0+VHhQb3dlclRyYWNrQ29udHJvbCk7CiAKIAlwRE1fT2RtLT5SRkNhbGlicmF0ZUluZm8uVHhQb3dlclRyYWNrQ29udHJvbCA9IHRydWU7CiB9CiAKLXZvaWQgT0RNX1RYUG93ZXJUcmFja2luZ0NoZWNrMjNhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSkKLXsKLQkvKiAgRm9yIEFQL0FEU0wgdXNlIHN0cnVjdCBydGw4NzIzYV9wcml2ICogKi8KLQkvKiAgRm9yIENFL05JQyB1c2Ugc3RydWN0IHJ0d19hZGFwdGVyICogKi8KLQotCS8qICAyMDExLzA5LzI5IE1IIEluIEhXIGludGVncmF0aW9uIGZpcnN0IHN0YWdlLCB3ZSBwcm92aWRlIDQgZGlmZmVyZW50IGhhbmRsZSB0byBvcGVyYXRlICovCi0JLyogIGF0IHRoZSBzYW1lIHRpbWUuIEluIHRoZSBzdGFnZTIvMywgd2UgbmVlZCB0byBwcml2ZSB1bml2ZXJzYWwgaW50ZXJmYWNlIGFuZCBtZXJnZSBhbGwgKi8KLQkvKiAgSFcgZHluYW1pYyBtZWNoYW5pc20uICovCi0Jb2RtX1RYUG93ZXJUcmFja2luZ0NoZWNrQ0UyM2EocERNX09kbSk7Ci19Ci0KLXZvaWQgb2RtX1RYUG93ZXJUcmFja2luZ0NoZWNrQ0UyM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQotewotfQotCiAvKiBFRENBIFR1cmJvICovCiBzdGF0aWMgdm9pZCBPRE1fRWRjYVR1cmJvSW5pdDIzYShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pCiB7Ci0KIAlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwogCiAJcERNX09kbS0+RE1fRURDQV9UYWJsZS5iQ3VycmVudFR1cmJvRURDQSA9IGZhbHNlOwotCXBETV9PZG0tPkRNX0VEQ0FfVGFibGUuYklzQ3VyUkRMU3RhdGUgPSBmYWxzZTsKIAlBZGFwdGVyLT5yZWN2cHJpdi5iSXNBbnlOb25CRVBrdHMgPSBmYWxzZTsKIAotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsICgiT3JnaW5pYWwgVk8gUEFSQU06IDB4JXhcbiIsIE9ETV9SZWFkNEJ5dGUocERNX09kbSwgT0RNX0VEQ0FfVk9fUEFSQU0pKSk7Ci0JT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwgKCJPcmdpbmlhbCBWSSBQQVJBTTogMHgleFxuIiwgT0RNX1JlYWQ0Qnl0ZShwRE1fT2RtLCBPRE1fRURDQV9WSV9QQVJBTSkpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELCAoIk9yZ2luaWFsIEJFIFBBUkFNOiAweCV4XG4iLCBPRE1fUmVhZDRCeXRlKHBETV9PZG0sIE9ETV9FRENBX0JFX1BBUkFNKSkpOwotCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsICgiT3JnaW5pYWwgQksgUEFSQU06IDB4JXhcbiIsIE9ETV9SZWFkNEJ5dGUocERNX09kbSwgT0RNX0VEQ0FfQktfUEFSQU0pKSk7Ci0KLX0JLyogIE9ETV9Jbml0RWRjYVR1cmJvICovCisJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwKKwkJICAgICAoIk9yZ2luaWFsIFZPIFBBUkFNOiAweCV4XG4iLAorCQkgICAgICBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX1ZPX1BBUkFNKSkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9FRENBX1RVUkJPLCBPRE1fREJHX0xPVUQsCisJCSAgICAgKCJPcmdpbmlhbCBWSSBQQVJBTTogMHgleFxuIiwKKwkJICAgICAgcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBPRE1fRURDQV9WSV9QQVJBTSkpKTsKKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfRURDQV9UVVJCTywgT0RNX0RCR19MT1VELAorCQkgICAgICgiT3JnaW5pYWwgQkUgUEFSQU06IDB4JXhcbiIsCisJCSAgICAgIHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgT0RNX0VEQ0FfQkVfUEFSQU0pKSk7CisJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0VEQ0FfVFVSQk8sIE9ETV9EQkdfTE9VRCwKKwkJICAgICAoIk9yZ2luaWFsIEJLIFBBUkFNOiAweCV4XG4iLAorCQkgICAgICBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIE9ETV9FRENBX0JLX1BBUkFNKSkpOworfQogCiBzdGF0aWMgdm9pZCBvZG1fRWRjYVR1cmJvQ2hlY2syM2Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQogewpAQCAtMTM3NywxOSArMTM0NCwxOCBAQAogCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwogCXUzMiB0cmFmZmljSW5kZXg7CiAJdTMyIGVkY2FfcGFyYW07Ci0JdTY0IGN1cl90eF9ieXRlcyA9IDA7Ci0JdTY0IGN1cl9yeF9ieXRlcyA9IDA7Ci0JdTggYmJ0Y2hhbmdlID0gZmFsc2U7CisJdTY0IGN1cl90eF9ieXRlczsKKwl1NjQgY3VyX3J4X2J5dGVzOwogCiAJLyogIEZvciBBUC9BRFNMIHVzZSBzdHJ1Y3QgcnRsODcyM2FfcHJpdiAqICovCiAJLyogIEZvciBDRS9OSUMgdXNlIHN0cnVjdCBydHdfYWRhcHRlciAqICovCiAKLQkvKiAgMjAxMS8wOS8yOSBNSCBJbiBIVyBpbnRlZ3JhdGlvbiBmaXJzdCBzdGFnZSwgd2UgcHJvdmlkZSA0IGRpZmZlcmVudCBoYW5kbGUgdG8gb3BlcmF0ZSAqLwotCS8qICBhdCB0aGUgc2FtZSB0aW1lLiBJbiB0aGUgc3RhZ2UyLzMsIHdlIG5lZWQgdG8gcHJpdmUgdW5pdmVyc2FsIGludGVyZmFjZSBhbmQgbWVyZ2UgYWxsICovCi0JLyogIEhXIGR5bmFtaWMgbWVjaGFuaXNtLiAqLwotCi0JaWYgKCEocERNX09kbS0+U3VwcG9ydEFiaWxpdHkgJiBPRE1fTUFDX0VEQ0FfVFVSQk8pKQotCQlyZXR1cm47CisJLyoKKwkgKiAyMDExLzA5LzI5IE1IIEluIEhXIGludGVncmF0aW9uIGZpcnN0IHN0YWdlLCB3ZSBwcm92aWRlIDQKKwkgKiBkaWZmZXJlbnQgaGFuZGxlIHRvIG9wZXJhdGUgYXQgdGhlIHNhbWUgdGltZS4gSW4gdGhlIHN0YWdlMi8zLAorCSAqIHdlIG5lZWQgdG8gcHJpdmUgdW5pdmVyc2FsIGludGVyZmFjZSBhbmQgbWVyZ2UgYWxsIEhXIGR5bmFtaWMKKwkgKiBtZWNoYW5pc20uCisJICovCiAKIAlpZiAoKHByZWdwcml2LT53aWZpX3NwZWMgPT0gMSkpLyogIChwbWxtZWluZm8tPkhUX2VuYWJsZSA9PSAwKSkgKi8KIAkJZ290byBkbV9DaGVja0VkY2FUdXJib19FWElUOwpAQCAtMTQwMSw3ICsxMzY3LDcgQEAKIAkJZ290byBkbV9DaGVja0VkY2FUdXJib19FWElUOwogCiAJLyogIENoZWNrIGlmIHRoZSBzdGF0dXMgbmVlZHMgdG8gYmUgY2hhbmdlZC4gKi8KLQlpZiAoKGJidGNoYW5nZSkgfHwgKCFwcmVjdnByaXYtPmJJc0FueU5vbkJFUGt0cykpIHsKKwlpZiAoIXByZWN2cHJpdi0+YklzQW55Tm9uQkVQa3RzKSB7CiAJCWN1cl90eF9ieXRlcyA9IHB4bWl0cHJpdi0+dHhfYnl0ZXMgLSBweG1pdHByaXYtPmxhc3RfdHhfYnl0ZXM7CiAJCWN1cl9yeF9ieXRlcyA9IHByZWN2cHJpdi0+cnhfYnl0ZXMgLSBwcmVjdnByaXYtPmxhc3RfcnhfYnl0ZXM7CiAKQEAgLTE0NTQsMjkgKzE0MjAsMzcgQEAKIAlwcmVjdnByaXYtPmxhc3RfcnhfYnl0ZXMgPSBwcmVjdnByaXYtPnJ4X2J5dGVzOwogfQogCi11MzIgR2V0UFNERGF0YShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHVuc2lnbmVkIGludCBwb2ludCwgdTggaW5pdGlhbF9nYWluX3BzZCkKK3UzMiBHZXRQU0REYXRhKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdW5zaWduZWQgaW50IHBvaW50LAorCSAgICAgICB1OCBpbml0aWFsX2dhaW5fcHNkKQogewotCXUzMiBwc2RfcmVwb3J0OworCXN0cnVjdCBydHdfYWRhcHRlciAqYWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7CisJdTMyIHBzZF9yZXBvcnQsIHZhbDMyOwogCiAJLyogU2V0IERDTyBmcmVxdWVuY3kgaW5kZXgsIG9mZnNldCA9ICg0ME1Iei9TYW1wbGVQdHMpKnBvaW50ICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIDB4ODA4LCAweDNGRiwgcG9pbnQpOworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCAweDgwOCk7CisJdmFsMzIgJj0gfjB4M2ZmOworCXZhbDMyIHw9IChwb2ludCAmIDB4M2ZmKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweDgwOCwgdmFsMzIpOwogCiAJLyogU3RhcnQgUFNEIGNhbGN1bGF0aW9uLCBSZWc4MDhbMjJdPSAwLT4xICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIDB4ODA4LCBCSVQoMjIpLCAxKTsKKwl2YWwzMiA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgMHg4MDgpOworCXZhbDMyIHw9IEJJVCgyMik7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgMHg4MDgsIHZhbDMyKTsKIAkvKiBOZWVkIHRvIHdhaXQgZm9yIEhXIFBTRCByZXBvcnQgKi8KIAl1ZGVsYXkoMzApOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCAweDgwOCwgQklUKDIyKSwgMCk7CisJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4ODA4KTsKKwl2YWwzMiAmPSB+QklUKDIyKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCAweDgwOCwgdmFsMzIpOwogCS8qIFJlYWQgUFNEIHJlcG9ydCwgUmVnOEI0WzE1OjBdICovCi0JcHNkX3JlcG9ydCA9IE9ETV9HZXRCQlJlZyhwRE1fT2RtLCAweDhCNCwgYk1hc2tEV29yZCkgJiAweDAwMDBGRkZGOworCXBzZF9yZXBvcnQgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIDB4OEI0KSAmIDB4MDAwMEZGRkY7CiAKLQlwc2RfcmVwb3J0ID0gKHUzMikoQ29udmVydFRvX2RCMjNhKHBzZF9yZXBvcnQpKSsodTMyKShpbml0aWFsX2dhaW5fcHNkLTB4MWMpOworCXBzZF9yZXBvcnQgPSAodTMyKShDb252ZXJ0VG9fZEIyM2EocHNkX3JlcG9ydCkpICsKKwkJKHUzMikoaW5pdGlhbF9nYWluX3BzZC0weDFjKTsKIAogCXJldHVybiBwc2RfcmVwb3J0OwogfQogCi11MzIKLUNvbnZlcnRUb19kQjIzYSgKLQl1MzIgVmFsdWUpCit1MzIgQ29udmVydFRvX2RCMjNhKHUzMiBWYWx1ZSkKIHsKIAl1OCBpOwogCXU4IGo7CkBAIC0xNTA0LDcgKzE0NzgsOCBAQAogCiAvKiAgKi8KIC8qICBEZXNjcmlwdGlvbjogKi8KLS8qU2V0IFNpbmdsZS9EdWFsIEFudGVubmEgZGVmYXVsdCBzZXR0aW5nIGZvciBwcm9kdWN0cyB0aGF0IGRvIG5vdCBkbyBkZXRlY3Rpb24gaW4gYWR2YW5jZS4gKi8KKy8qIFNldCBTaW5nbGUvRHVhbCBBbnRlbm5hIGRlZmF1bHQgc2V0dGluZyBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QKKyAqIGRvIGRldGVjdGlvbiBpbiBhZHZhbmNlLiAqLwogLyogICovCiAvKiAgQWRkZWQgYnkgSm9zZXBoLCAyMDEyLjAzLjIyICovCiAvKiAgKi8KQEAgLTE1MTgsMTggKzE0OTMsMTMgQEAKIAogLyogMiA4NzIzQSBBTlQgREVURUNUICovCiAKLXN0YXRpYyB2b2lkIG9kbV9QSFlfU2F2ZUFGRVJlZ2lzdGVycygKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JdTMyICpBRkVSZWcsCi0JdTMyICpBRkVCYWNrdXAsCi0JdTMyIFJlZ2lzdGVyTnVtCi0JKQorc3RhdGljIHZvaWQgb2RtX1BIWV9TYXZlQUZFUmVnaXN0ZXJzKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyICpBRkVSZWcsCisJCQkJICAgICB1MzIgKkFGRUJhY2t1cCwgdTMyIFJlZ2lzdGVyTnVtKQogewogCXUzMiBpOwogCi0JLyogUlRQUklOVChGSU5JVCwgSU5JVF9JUUssICgiU2F2ZSBBRERBIHBhcmFtZXRlcnMuXG4iKSk7ICovCiAJZm9yIChpID0gMCA7IGkgPCBSZWdpc3Rlck51bSA7IGkrKykKLQkJQUZFQmFja3VwW2ldID0gT0RNX0dldEJCUmVnKHBETV9PZG0sIEFGRVJlZ1tpXSwgYk1hc2tEV29yZCk7CisJCUFGRUJhY2t1cFtpXSA9IHJ0bDg3MjNhdV9yZWFkMzIocERNX09kbS0+QWRhcHRlciwgQUZFUmVnW2ldKTsKIH0KIAogc3RhdGljIHZvaWQgb2RtX1BIWV9SZWxvYWRBRkVSZWdpc3RlcnMoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgKkFGRVJlZywKQEAgLTE1MzgsNyArMTUwOCw3IEBACiAJdTMyIGk7CiAKIAlmb3IgKGkgPSAwIDsgaSA8IFJlZ2llc3Rlck51bTsgaSsrKQotCQlPRE1fU2V0QkJSZWcocERNX09kbSwgQUZFUmVnW2ldLCBiTWFza0RXb3JkLCBBRkVCYWNrdXBbaV0pOworCQlydGw4NzIzYXVfd3JpdGUzMihwRE1fT2RtLT5BZGFwdGVyLCBBRkVSZWdbaV0sIEFGRUJhY2t1cFtpXSk7CiB9CiAKIC8qIDIgODcyM0EgQU5UIERFVEVDVCAqLwpAQCAtMTU0OCw5ICsxNTE4LDEwIEBACiBib29sIE9ETV9TaW5nbGVEdWFsQW50ZW5uYURldGVjdGlvbihzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHU4IG1vZGUpCiB7CiAJc3RydWN0IHN3X2FudF9zdyAqcERNX1NXQVRfVGFibGUgPSAmcERNX09kbS0+RE1fU1dBVF9UYWJsZTsKKwlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwogCXUzMiBDdXJyZW50Q2hhbm5lbCwgUmZMb29wUmVnOwogCXU4IG47Ci0JdTMyIFJlZzg4YywgUmVnYzA4LCBSZWc4NzQsIFJlZ2M1MDsKKwl1MzIgUmVnODhjLCBSZWdjMDgsIFJlZzg3NCwgUmVnYzUwLCB2YWwzMjsKIAl1OCBpbml0aWFsX2dhaW4gPSAweDVhOwogCXUzMiBQU0RfcmVwb3J0X3RtcDsKIAl1MzIgQW50QV9yZXBvcnQgPSAweDAsIEFudEJfcmVwb3J0ID0gMHgwLCBBbnRPX3JlcG9ydCA9IDB4MDsKQEAgLTE1NzMsNzIgKzE1NDQsODAgQEAKIAkJcmV0dXJuIGJSZXN1bHQ7CiAJLyogMSBCYWNrdXAgQ3VycmVudCBSRi9CQiBTZXR0aW5ncyAqLwogCi0JQ3VycmVudENoYW5uZWwgPSBPRE1fR2V0UkZSZWcocERNX09kbSwgUkZfUEFUSF9BLCBPRE1fQ0hBTk5FTCwgYlJGUmVnT2Zmc2V0TWFzayk7CisJQ3VycmVudENoYW5uZWwgPSBPRE1fR2V0UkZSZWcocERNX09kbSwgUkZfUEFUSF9BLCBPRE1fQ0hBTk5FTCwKKwkJCQkgICAgICBiUkZSZWdPZmZzZXRNYXNrKTsKIAlSZkxvb3BSZWcgPSBPRE1fR2V0UkZSZWcocERNX09kbSwgUkZfUEFUSF9BLCAweDAwLCBiUkZSZWdPZmZzZXRNYXNrKTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIE9ETV9EUERULCBBbnRlbm5hX0EpOyAgLyogIGNoYW5nZSB0byBBbnRlbm5hIEEgKi8KKwkvKiAgY2hhbmdlIHRvIEFudGVubmEgQSAqLworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSk7CisJdmFsMzIgJj0gfjB4MzAwOworCXZhbDMyIHw9IDB4MTAwOwkJLyogRW5hYmxlIGFudGVubmEgQSAqLworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCB2YWwzMik7CisKIAkvKiAgU3RlcCAxOiBVU0UgSVFLIHRvIHRyYW5zbWl0dGVyIHNpbmdsZSB0b25lICovCiAKIAl1ZGVsYXkoMTApOwogCiAJLyogU3RvcmUgQSBQYXRoIFJlZ2lzdGVyIDg4YywgYzA4LCA4NzQsIGM1MCAqLwotCVJlZzg4YyA9IE9ETV9HZXRCQlJlZyhwRE1fT2RtLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgYk1hc2tEV29yZCk7Ci0JUmVnYzA4ID0gT0RNX0dldEJCUmVnKHBETV9PZG0sIHJPRkRNMF9UUk11eFBhciwgYk1hc2tEV29yZCk7Ci0JUmVnODc0ID0gT0RNX0dldEJCUmVnKHBETV9PZG0sIHJGUEdBMF9YQ0RfUkZJbnRlcmZhY2VTVywgYk1hc2tEV29yZCk7Ci0JUmVnYzUwID0gT0RNX0dldEJCUmVnKHBETV9PZG0sIHJPRkRNMF9YQUFHQ0NvcmUxLCBiTWFza0RXb3JkKTsKKwlSZWc4OGMgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0KTsKKwlSZWdjMDggPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJPRkRNMF9UUk11eFBhcik7CisJUmVnODc0ID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1cpOworCVJlZ2M1MCA9IHJ0bDg3MjNhdV9yZWFkMzIoYWRhcHRlciwgck9GRE0wX1hBQUdDQ29yZTEpOwogCiAJLyogIFN0b3JlIEFGRSBSZWdpc3RlcnMgKi8KIAlvZG1fUEhZX1NhdmVBRkVSZWdpc3RlcnMocERNX09kbSwgQUZFX1JFR184NzIzQSwgQUZFX0JhY2t1cCwgMTYpOwogCiAJLyogU2V0IFBTRCAxMjggcHRzICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJGUEdBMF9QU0RGdW5jdGlvbiwgQklUKDE0KSB8IEJJVCgxNSksIDB4MCk7CisJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9QU0RGdW5jdGlvbik7CisJdmFsMzIgJj0gfihCSVQoMTQpIHwgQklUKDE1KSk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1BTREZ1bmN0aW9uLCB2YWwzMik7CiAKIAkvKiAgVG8gU0VUIENIMSB0byBkbyAqLwotCU9ETV9TZXRSRlJlZyhwRE1fT2RtLCBSRl9QQVRIX0EsIE9ETV9DSEFOTkVMLCBiUkZSZWdPZmZzZXRNYXNrLCAweDAxKTsgICAgIC8qIENoYW5uZWwgMSAqLworCU9ETV9TZXRSRlJlZyhwRE1fT2RtLCBSRl9QQVRIX0EsIE9ETV9DSEFOTkVMLCBiUkZSZWdPZmZzZXRNYXNrLCAweDAxKTsKIAogCS8qICBBRkUgYWxsIG9uIHN0ZXAgKi8KLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclJ4X1dhaXRfQ0NBLCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclR4X0NDS19SRk9OLCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclR4X0NDS19CQk9OLCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclR4X09GRE1fUkZPTiwgYk1hc2tEV29yZCwgMHg2RkRCMjVBNCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJUeF9PRkRNX0JCT04sIGJNYXNrRFdvcmQsIDB4NkZEQjI1QTQpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByVHhfVG9fUngsIGJNYXNrRFdvcmQsIDB4NkZEQjI1QTQpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByVHhfVG9fVHgsIGJNYXNrRFdvcmQsIDB4NkZEQjI1QTQpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByUnhfQ0NLLCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclJ4X09GRE0sIGJNYXNrRFdvcmQsIDB4NkZEQjI1QTQpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByUnhfV2FpdF9SSUZTLCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclJ4X1RPX1J4LCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclN0YW5kYnksIGJNYXNrRFdvcmQsIDB4NkZEQjI1QTQpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByU2xlZXAsIGJNYXNrRFdvcmQsIDB4NkZEQjI1QTQpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByUE1QRF9BTkFFTiwgYk1hc2tEV29yZCwgMHg2RkRCMjVBNCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbCwgYk1hc2tEV29yZCwgMHg2RkRCMjVBNCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJCbHVlX1Rvb3RoLCBiTWFza0RXb3JkLCAweDZGREIyNUE0KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByUnhfV2FpdF9DQ0EsIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9DQ0tfUkZPTiwgMHg2RkRCMjVBNCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X0NDS19CQk9OLCAweDZGREIyNUE0KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfT0ZETV9SRk9OLCAweDZGREIyNUE0KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfT0ZETV9CQk9OLCAweDZGREIyNUE0KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfVG9fUngsIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJUeF9Ub19UeCwgMHg2RkRCMjVBNCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X0NDSywgMHg2RkRCMjVBNCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclJ4X09GRE0sIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9XYWl0X1JJRlMsIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJSeF9UT19SeCwgMHg2RkRCMjVBNCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclN0YW5kYnksIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJTbGVlcCwgMHg2RkRCMjVBNCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclBNUERfQU5BRU4sIDB4NkZEQjI1QTQpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQ0RfU3dpdGNoQ29udHJvbCwgMHg2RkRCMjVBNCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckJsdWVfVG9vdGgsIDB4NkZEQjI1QTQpOwogCiAJLyogIDMgd2lyZSBEaXNhYmxlICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJGUEdBMF9BbmFsb2dQYXJhbWV0ZXI0LCBiTWFza0RXb3JkLCAweENDRjAwMEMwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgMHhDQ0YwMDBDMCk7CiAKIAkvKiBCQiBJUUsgU2V0dGluZyAqLwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByT0ZETTBfVFJNdXhQYXIsIGJNYXNrRFdvcmQsIDB4MDAwODAwRTQpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1csIGJNYXNrRFdvcmQsIDB4MjIyMDgwMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJPRkRNMF9UUk11eFBhciwgMHgwMDA4MDBFNCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXLCAweDIyMjA4MDAwKTsKIAogCS8qIElRSyBzZXR0aW5nIHRvbmVAIDQuMzRNaHogKi8KLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclR4X0lRS19Ub25lX0EsIGJNYXNrRFdvcmQsIDB4MTAwMDhDMUMpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByVHhfSVFLLCBiTWFza0RXb3JkLCAweDAxMDA3YzAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByVHhfSVFLX1RvbmVfQSwgMHgxMDAwOEMxQyk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X0lRSywgMHgwMTAwN2MwMCk7CiAKIAkvKiBQYWdlIEIgaW5pdCAqLwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByQ29uZmlnX0FudEEsIGJNYXNrRFdvcmQsIDB4MDAwODAwMDApOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByQ29uZmlnX0FudEEsIGJNYXNrRFdvcmQsIDB4MGY2MDAwMDApOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByUnhfSVFLLCBiTWFza0RXb3JkLCAweDAxMDA0ODAwKTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgclJ4X0lRS19Ub25lX0EsIGJNYXNrRFdvcmQsIDB4MTAwMDhjMWYpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByVHhfSVFLX1BJX0EsIGJNYXNrRFdvcmQsIDB4ODIxNTAwMDgpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByUnhfSVFLX1BJX0EsIGJNYXNrRFdvcmQsIDB4MjgxNTAwMDgpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCBySVFLX0FHQ19Sc3AsIGJNYXNrRFdvcmQsIDB4MDAxMDI4ZDApOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJDb25maWdfQW50QSwgMHgwMDA4MDAwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckNvbmZpZ19BbnRBLCAweDBmNjAwMDAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByUnhfSVFLLCAweDAxMDA0ODAwKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByUnhfSVFLX1RvbmVfQSwgMHgxMDAwOGMxZik7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgclR4X0lRS19QSV9BLCAweDgyMTUwMDA4KTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByUnhfSVFLX1BJX0EsIDB4MjgxNTAwMDgpOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJJUUtfQUdDX1JzcCwgMHgwMDEwMjhkMCk7CiAKIAkvKiBSRiBsb29wIFNldHRpbmcgKi8KIAlPRE1fU2V0UkZSZWcocERNX09kbSwgUkZfUEFUSF9BLCAweDAsIDB4RkZGRkYsIDB4NTAwMDgpOwogCiAJLyogSVFLIFNpbmdsZSB0b25lIHN0YXJ0ICovCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJGUEdBMF9JUUssIGJNYXNrRFdvcmQsIDB4ODA4MDAwMDApOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCBySVFLX0FHQ19QdHMsIGJNYXNrRFdvcmQsIDB4ZjgwMDAwMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9JUUssIDB4ODA4MDAwMDApOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJJUUtfQUdDX1B0cywgMHhmODAwMDAwMCk7CiAJdWRlbGF5KDEwMDApOwogCVBTRF9yZXBvcnRfdG1wID0gMHgwOwogCkBAIC0xNjUwLDcgKzE2MjksMTAgQEAKIAogCVBTRF9yZXBvcnRfdG1wID0gMHgwOwogCi0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCAweDMwMCwgQW50ZW5uYV9CKTsgIC8qICBjaGFuZ2UgdG8gQW50ZW5uYSBCICovCisJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FKTsKKwl2YWwzMiAmPSB+MHgzMDA7CisJdmFsMzIgfD0gMHgyMDA7CQkvKiBFbmFibGUgYW50ZW5uYSBCICovCisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIHZhbDMyKTsKIAl1ZGVsYXkoMTApOwogCiAJZm9yIChuID0gMDsgbiA8IDI7IG4rKykgewpAQCAtMTY2MCw3ICsxNjQyLDEwIEBACiAJfQogCiAJLyogIGNoYW5nZSB0byBvcGVuIGNhc2UgKi8KLQlPRE1fU2V0QkJSZWcocERNX09kbSwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIDB4MzAwLCAwKTsgIC8qICBjaGFuZ2UgdG8gQW50IEEgYW5kIEIgYWxsIG9wZW4gY2FzZSAqLworCS8qICBjaGFuZ2UgdG8gQW50IEEgYW5kIEIgYWxsIG9wZW4gY2FzZSAqLworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSk7CisJdmFsMzIgJj0gfjB4MzAwOworCXJ0bDg3MjNhdV93cml0ZTMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FLCB2YWwzMik7CiAJdWRlbGF5KDEwKTsKIAogCWZvciAobiA9IDA7IG4gPCAyOyBuKyspIHsKQEAgLTE2NzAsMjUgKzE2NTUsMzYgQEAKIAl9CiAKIAkvKiBDbG9zZSBJUUsgU2luZ2xlIFRvbmUgZnVuY3Rpb24gKi8KLQlPRE1fU2V0QkJSZWcocERNX09kbSwgckZQR0EwX0lRSywgYk1hc2tEV29yZCwgMHgwMDAwMDAwMCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX0lRSywgMHgwMDAwMDAwMCk7CiAJUFNEX3JlcG9ydF90bXAgPSAweDA7CiAKIAkvKiAxIFJldHVybiB0byBhbnRhbm5hIEEgKi8KLQlPRE1fU2V0QkJSZWcocERNX09kbSwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIDB4MzAwLCBBbnRlbm5hX0EpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgYk1hc2tEV29yZCwgUmVnODhjKTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgck9GRE0wX1RSTXV4UGFyLCBiTWFza0RXb3JkLCBSZWdjMDgpOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCByRlBHQTBfWENEX1JGSW50ZXJmYWNlU1csIGJNYXNrRFdvcmQsIFJlZzg3NCk7Ci0JT0RNX1NldEJCUmVnKHBETV9PZG0sIHJPRkRNMF9YQUFHQ0NvcmUxLCAweDdGLCAweDQwKTsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgck9GRE0wX1hBQUdDQ29yZTEsIGJNYXNrRFdvcmQsIFJlZ2M1MCk7Ci0JT0RNX1NldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgUkZfQ0hOTEJXLCBiUkZSZWdPZmZzZXRNYXNrLCBDdXJyZW50Q2hhbm5lbCk7CisJdmFsMzIgPSBydGw4NzIzYXVfcmVhZDMyKGFkYXB0ZXIsIHJGUEdBMF9YQV9SRkludGVyZmFjZU9FKTsKKwl2YWwzMiAmPSB+MHgzMDA7CisJdmFsMzIgfD0gMHgxMDA7CQkvKiBFbmFibGUgYW50ZW5uYSBBICovCisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIHZhbDMyKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByRlBHQTBfQW5hbG9nUGFyYW1ldGVyNCwgUmVnODhjKTsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByT0ZETTBfVFJNdXhQYXIsIFJlZ2MwOCk7CisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgckZQR0EwX1hDRF9SRkludGVyZmFjZVNXLCBSZWc4NzQpOworCXZhbDMyID0gcnRsODcyM2F1X3JlYWQzMihhZGFwdGVyLCByT0ZETTBfWEFBR0NDb3JlMSk7CisJdmFsMzIgJj0gfjB4N2Y7CisJdmFsMzIgfD0gMHg0MDsKKwlydGw4NzIzYXVfd3JpdGUzMihhZGFwdGVyLCByT0ZETTBfWEFBR0NDb3JlMSwgdmFsMzIpOworCisJcnRsODcyM2F1X3dyaXRlMzIoYWRhcHRlciwgck9GRE0wX1hBQUdDQ29yZTEsIFJlZ2M1MCk7CisJT0RNX1NldFJGUmVnKHBETV9PZG0sIFJGX1BBVEhfQSwgUkZfQ0hOTEJXLCBiUkZSZWdPZmZzZXRNYXNrLAorCQkgICAgIEN1cnJlbnRDaGFubmVsKTsKIAlPRE1fU2V0UkZSZWcocERNX09kbSwgUkZfUEFUSF9BLCAweDAwLCBiUkZSZWdPZmZzZXRNYXNrLCBSZkxvb3BSZWcpOwogCiAJLyogUmVsb2FkIEFGRSBSZWdpc3RlcnMgKi8KIAlvZG1fUEhZX1JlbG9hZEFGRVJlZ2lzdGVycyhwRE1fT2RtLCBBRkVfUkVHXzg3MjNBLCBBRkVfQmFja3VwLCAxNik7CiAKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELCAoInBzZF9yZXBvcnRfQVslZF09ICVkIFxuIiwgMjQxNiwgQW50QV9yZXBvcnQpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELCAoInBzZF9yZXBvcnRfQlslZF09ICVkIFxuIiwgMjQxNiwgQW50Ql9yZXBvcnQpKTsKLQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELCAoInBzZF9yZXBvcnRfT1slZF09ICVkIFxuIiwgMjQxNiwgQW50T19yZXBvcnQpKTsKKwlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELAorCQkgICAgICgicHNkX3JlcG9ydF9BWyVkXT0gJWQgXG4iLCAyNDE2LCBBbnRBX3JlcG9ydCkpOworCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsCisJCSAgICAgKCJwc2RfcmVwb3J0X0JbJWRdPSAlZCBcbiIsIDI0MTYsIEFudEJfcmVwb3J0KSk7CisJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwKKwkJICAgICAoInBzZF9yZXBvcnRfT1slZF09ICVkIFxuIiwgMjQxNiwgQW50T19yZXBvcnQpKTsKIAogCS8qIDIgVGVzdCBBbnQgQiBiYXNlZCBvbiBBbnQgQSBpcyBPTiAqLwogCWlmIChtb2RlID09IEFOVFRFU1RCKSB7CkBAIC0xNzEwLDMwICsxNzA2LDMzIEBACiAJCWlmICgoQW50T19yZXBvcnQgPj0gMTAwKSAmIChBbnRPX3JlcG9ydCA8IDExOCkpIHsKIAkJCWlmIChBbnRBX3JlcG9ydCA+IChBbnRPX3JlcG9ydCsxKSkgewogCQkJCXBETV9TV0FUX1RhYmxlLT5BTlRBX09OID0gZmFsc2U7Ci0JCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsIE9ETV9EQkdfTE9VRCwgKCJBbnQgQSBpcyBPRkYiKSk7CisJCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsCisJCQkJCSAgICAgT0RNX0RCR19MT1VELCAoIkFudCBBIGlzIE9GRiIpKTsKIAkJCX0gZWxzZSB7CiAJCQkJcERNX1NXQVRfVGFibGUtPkFOVEFfT04gPSB0cnVlOwotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsICgiQW50IEEgaXMgT04iKSk7CisJCQkJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0FOVF9ESVYsCisJCQkJCSAgICAgT0RNX0RCR19MT1VELCAoIkFudCBBIGlzIE9OIikpOwogCQkJfQogCiAJCQlpZiAoQW50Ql9yZXBvcnQgPiAoQW50T19yZXBvcnQrMikpIHsKIAkJCQlwRE1fU1dBVF9UYWJsZS0+QU5UQl9PTiA9IGZhbHNlOwotCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsICgiQW50IEIgaXMgT0ZGIikpOworCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLAorCQkJCQkgICAgIE9ETV9EQkdfTE9VRCwgKCJBbnQgQiBpcyBPRkYiKSk7CiAJCQl9IGVsc2UgewogCQkJCXBETV9TV0FUX1RhYmxlLT5BTlRCX09OID0gdHJ1ZTsKLQkJCQlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfQU5UX0RJViwgT0RNX0RCR19MT1VELCAoIkFudCBCIGlzIE9OIikpOworCQkJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLAorCQkJCQkgICAgIE9ETV9EQkdfTE9VRCwgKCJBbnQgQiBpcyBPTiIpKTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsICgiT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGV0ZWN0aW9uKCk6IE5lZWQgdG8gY2hlY2sgYWdhaW5cbiIpKTsKLQkJcERNX1NXQVRfVGFibGUtPkFOVEFfT04gPSB0cnVlOyAvKiAgU2V0IEFudGVubmEgQSBvbiBhcyBkZWZhdWx0ICovCi0JCXBETV9TV0FUX1RhYmxlLT5BTlRCX09OID0gZmFsc2U7IC8qICBTZXQgQW50ZW5uYSBCIG9mZiBhcyBkZWZhdWx0ICovCisJCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9BTlRfRElWLCBPRE1fREJHX0xPVUQsCisJCSgiT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGV0ZWN0aW9uKCk6IE5lZWQgdG8gY2hlY2sgYWdhaW5cbiIpKTsKKwkJLyogIFNldCBBbnRlbm5hIEEgb24gYXMgZGVmYXVsdCAqLworCQlwRE1fU1dBVF9UYWJsZS0+QU5UQV9PTiA9IHRydWU7CisJCS8qICBTZXQgQW50ZW5uYSBCIG9mZiBhcyBkZWZhdWx0ICovCisJCXBETV9TV0FUX1RhYmxlLT5BTlRCX09OID0gZmFsc2U7CiAJCWJSZXN1bHQgPSBmYWxzZTsKIAl9Ci0JcmV0dXJuIGJSZXN1bHQ7Ci19CiAKLS8qIEp1c3RpbjogQWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IFJSU0kgdG8gYWRqdXN0IFJlc3BvbnNlIEZyYW1lIFRYIHBvd2VyLCAyMDEyLzExLzA1ICovCi12b2lkIG9kbV9kdGMoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtKQoteworCXJldHVybiBiUmVzdWx0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX0hXQ29uZmlnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fSFdDb25maWcuYwppbmRleCAzM2FhZmEwLi43Yjk3OTllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fSFdDb25maWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fSFdDb25maWcuYwpAQCAtMzMsMjQgKzMzLDIzIEBACiB7CiAJczMyIFJldFNpZyA9IDA7CiAKLQlpZiAoKHBETV9PZG0tPlN1cHBvcnRJbnRlcmZhY2UgID09IE9ETV9JVFJGX1VTQikgfHwgKHBETV9PZG0tPlN1cHBvcnRJbnRlcmZhY2UgID09IE9ETV9JVFJGX1NESU8pKSB7Ci0JCWlmIChDdXJyU2lnID49IDUxICYmIEN1cnJTaWcgPD0gMTAwKQotCQkJUmV0U2lnID0gMTAwOwotCQllbHNlIGlmIChDdXJyU2lnID49IDQxICYmIEN1cnJTaWcgPD0gNTApCi0JCQlSZXRTaWcgPSA4MCArICgoQ3VyclNpZyAtIDQwKSoyKTsKLQkJZWxzZSBpZiAoQ3VyclNpZyA+PSAzMSAmJiBDdXJyU2lnIDw9IDQwKQotCQkJUmV0U2lnID0gNjYgKyAoQ3VyclNpZyAtIDMwKTsKLQkJZWxzZSBpZiAoQ3VyclNpZyA+PSAyMSAmJiBDdXJyU2lnIDw9IDMwKQotCQkJUmV0U2lnID0gNTQgKyAoQ3VyclNpZyAtIDIwKTsKLQkJZWxzZSBpZiAoQ3VyclNpZyA+PSAxMCAmJiBDdXJyU2lnIDw9IDIwKQotCQkJUmV0U2lnID0gNDIgKyAoKChDdXJyU2lnIC0gMTApICogMikgLyAzKTsKLQkJZWxzZSBpZiAoQ3VyclNpZyA+PSA1ICYmIEN1cnJTaWcgPD0gOSkKLQkJCVJldFNpZyA9IDIyICsgKCgoQ3VyclNpZyAtIDUpICogMykgLyAyKTsKLQkJZWxzZSBpZiAoQ3VyclNpZyA+PSAxICYmIEN1cnJTaWcgPD0gNCkKLQkJCVJldFNpZyA9IDYgKyAoKChDdXJyU2lnIC0gMSkgKiAzKSAvIDIpOwotCQllbHNlCi0JCQlSZXRTaWcgPSBDdXJyU2lnOwotCX0KKwlpZiAoQ3VyclNpZyA+PSA1MSAmJiBDdXJyU2lnIDw9IDEwMCkKKwkJUmV0U2lnID0gMTAwOworCWVsc2UgaWYgKEN1cnJTaWcgPj0gNDEgJiYgQ3VyclNpZyA8PSA1MCkKKwkJUmV0U2lnID0gODAgKyAoKEN1cnJTaWcgLSA0MCkqMik7CisJZWxzZSBpZiAoQ3VyclNpZyA+PSAzMSAmJiBDdXJyU2lnIDw9IDQwKQorCQlSZXRTaWcgPSA2NiArIChDdXJyU2lnIC0gMzApOworCWVsc2UgaWYgKEN1cnJTaWcgPj0gMjEgJiYgQ3VyclNpZyA8PSAzMCkKKwkJUmV0U2lnID0gNTQgKyAoQ3VyclNpZyAtIDIwKTsKKwllbHNlIGlmIChDdXJyU2lnID49IDEwICYmIEN1cnJTaWcgPD0gMjApCisJCVJldFNpZyA9IDQyICsgKCgoQ3VyclNpZyAtIDEwKSAqIDIpIC8gMyk7CisJZWxzZSBpZiAoQ3VyclNpZyA+PSA1ICYmIEN1cnJTaWcgPD0gOSkKKwkJUmV0U2lnID0gMjIgKyAoKChDdXJyU2lnIC0gNSkgKiAzKSAvIDIpOworCWVsc2UgaWYgKEN1cnJTaWcgPj0gMSAmJiBDdXJyU2lnIDw9IDQpCisJCVJldFNpZyA9IDYgKyAoKChDdXJyU2lnIC0gMSkgKiAzKSAvIDIpOworCWVsc2UKKwkJUmV0U2lnID0gQ3VyclNpZzsKKwogCXJldHVybiBSZXRTaWc7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9SZWdDb25maWc4NzIzQS5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX1JlZ0NvbmZpZzg3MjNBLmMKaW5kZXggODhlMDEyNi4uMzQyZGVjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX1JlZ0NvbmZpZzg3MjNBLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX1JlZ0NvbmZpZzg3MjNBLmMKQEAgLTE0LDYgKzE0LDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlICJvZG1fcHJlY29tcC5oIgorI2luY2x1ZGUgInVzYl9vcHNfbGludXguaCIKIAogdm9pZAogb2RtX0NvbmZpZ1JGUmVnXzg3MjNBKApAQCAtNDMsNjIgKzQ0LDQ1IEBACiAJfQogfQogCi12b2lkIG9kbV9Db25maWdNQUNfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXUzMgkJQWRkciwKLQl1OAkJRGF0YQotCSkKK3ZvaWQgb2RtX0NvbmZpZ01BQ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBhZGRyLCB1OAlkYXRhKQogewotCU9ETV9Xcml0ZTFCeXRlKHBETV9PZG0sIEFkZHIsIERhdGEpOworCXJ0bDg3MjNhdV93cml0ZTgocERNX09kbS0+QWRhcHRlciwgYWRkciwgZGF0YSk7CiAJT0RNX1JUX1RSQUNFKHBETV9PZG0sIE9ETV9DT01QX0lOSVQsIE9ETV9EQkdfTE9VRCwKLQkJICAgICAoIj09PT4gT0RNX0NvbmZpZ01BQ1dpdGhIZWFkZXJGaWxlMjNhOiBbTUFDX1JFR10gJTA4WCAlMDhYXG4iLAotCQkgICAgIEFkZHIsIERhdGEpKTsKKwkJICAgICAoIj09PT4gJXM6IFtNQUNfUkVHXSAlMDhYICUwOFhcbiIsIF9fZnVuY19fLCBhZGRyLCBkYXRhKSk7CiB9CiAKLXZvaWQKLW9kbV9Db25maWdCQl9BR0NfODcyM0EoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXUzMgkJQWRkciwKLQl1MzIJCUJpdG1hc2ssCi0JdTMyCQlEYXRhCi0gICkKK3ZvaWQgb2RtX0NvbmZpZ0JCX0FHQ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBhZGRyLCB1MzIgZGF0YSkKIHsKLQlPRE1fU2V0QkJSZWcocERNX09kbSwgQWRkciwgQml0bWFzaywgRGF0YSk7CisJcnRsODcyM2F1X3dyaXRlMzIocERNX09kbS0+QWRhcHRlciwgYWRkciwgZGF0YSk7CiAJLyogIEFkZCAxdXMgZGVsYXkgYmV0d2VlbiBCQi9SRiByZWdpc3RlciBzZXR0aW5nLiAqLwogCXVkZWxheSgxKTsKIAogCU9ETV9SVF9UUkFDRShwRE1fT2RtLCBPRE1fQ09NUF9JTklULCBPRE1fREJHX0xPVUQsCi0JCSAgICAgKCI9PT0+IE9ETV9Db25maWdCQldpdGhIZWFkZXJGaWxlMjNhOiBbQUdDX1RBQl0gJTA4WCAlMDhYXG4iLAotCQkgICAgIEFkZHIsIERhdGEpKTsKKwkJICAgICAoIj09PT4gJXM6IFtBR0NfVEFCXSAlMDhYICUwOFhcbiIsIF9fZnVuY19fLCBhZGRyLCBkYXRhKSk7CiB9CiAKIHZvaWQKLW9kbV9Db25maWdCQl9QSFlfODcyM0EoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXUzMgkJQWRkciwKLQl1MzIJCUJpdG1hc2ssCi0JdTMyCQlEYXRhCi0gICkKK29kbV9Db25maWdCQl9QSFlfODcyM0Eoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgYWRkciwgdTMyIGRhdGEpCiB7Ci0JaWYgKEFkZHIgPT0gMHhmZSkKKwlpZiAoYWRkciA9PSAweGZlKQogCQltc2xlZXAoNTApOwotCWVsc2UgaWYgKEFkZHIgPT0gMHhmZCkKKwllbHNlIGlmIChhZGRyID09IDB4ZmQpCiAJCW1kZWxheSg1KTsKLQllbHNlIGlmIChBZGRyID09IDB4ZmMpCisJZWxzZSBpZiAoYWRkciA9PSAweGZjKQogCQltZGVsYXkoMSk7Ci0JZWxzZSBpZiAoQWRkciA9PSAweGZiKQorCWVsc2UgaWYgKGFkZHIgPT0gMHhmYikKIAkJdWRlbGF5KDUwKTsKLQllbHNlIGlmIChBZGRyID09IDB4ZmEpCisJZWxzZSBpZiAoYWRkciA9PSAweGZhKQogCQl1ZGVsYXkoNSk7Ci0JZWxzZSBpZiAoQWRkciA9PSAweGY5KQorCWVsc2UgaWYgKGFkZHIgPT0gMHhmOSkKIAkJdWRlbGF5KDEpOwotCWVsc2UgaWYgKEFkZHIgPT0gMHhhMjQpCi0JCXBETV9PZG0tPlJGQ2FsaWJyYXRlSW5mby5SZWdBMjQgPSBEYXRhOwotCU9ETV9TZXRCQlJlZyhwRE1fT2RtLCBBZGRyLCBCaXRtYXNrLCBEYXRhKTsKKwllbHNlIGlmIChhZGRyID09IDB4YTI0KQorCQlwRE1fT2RtLT5SRkNhbGlicmF0ZUluZm8uUmVnQTI0ID0gZGF0YTsKKwlydGw4NzIzYXVfd3JpdGUzMihwRE1fT2RtLT5BZGFwdGVyLCBhZGRyLCBkYXRhKTsKIAogCS8qICBBZGQgMXVzIGRlbGF5IGJldHdlZW4gQkIvUkYgcmVnaXN0ZXIgc2V0dGluZy4gKi8KIAl1ZGVsYXkoMSk7CiAKIAlPRE1fUlRfVFJBQ0UocERNX09kbSwgT0RNX0NPTVBfSU5JVCwgT0RNX0RCR19MT1VELAotCQkgICAgICgiPT09PiBPRE1fQ29uZmlnQkJXaXRoSGVhZGVyRmlsZTIzYTogW1BIWV9SRUddICUwOFggJTA4WFxuIiwKLQkJICAgICBBZGRyLCBEYXRhKSk7CisJCSAgICAgKCI9PT0+ICVzOiBbUEhZX1JFR10gJTA4WCAlMDhYXG4iLCBfX2Z1bmNfXywgYWRkciwgZGF0YSkpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvb2RtX2RlYnVnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fZGVidWcuYwppbmRleCBjOTEyYWI4Li5jYjJiZGRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fZGVidWcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1fZGVidWcuYwpAQCAtMjIsMyArMjIsMTggQEAKIH0KIAogdTMyIEdsb2JhbERlYnVnTGV2ZWwyM0E7CisKK3ZvaWQgcnRfdHJhY2UoaW50IGNvbXAsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlwcl9pbmZvKERSSVZFUl9QUkVGSVggIiBbMHglMDh4LCVkXSAlcFYiLCBjb21wLCBsZXZlbCwgJnZhZik7CisKKwl2YV9lbmQoYXJncyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1faW50ZXJmYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1faW50ZXJmYWNlLmMKaW5kZXggZjAzZjZkNGEuLmQ4ZjY3OTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL29kbV9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9vZG1faW50ZXJmYWNlLmMKQEAgLTIzLDk2ICsyMyw2IEBACiAvKiAgKi8KICNpbmNsdWRlIDx1c2Jfb3BzX2xpbnV4Lmg+CiAKLXU4IE9ETV9SZWFkMUJ5dGUoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXUzMgkJCVJlZ0FkZHIKLQkpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQotCXJldHVybiBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUmVnQWRkcik7Ci19Ci0KLXUxNiBPRE1fUmVhZDJCeXRlKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQotCXJldHVybiBydGw4NzIzYXVfcmVhZDE2KEFkYXB0ZXIsIFJlZ0FkZHIpOwotfQotCi11MzIgT0RNX1JlYWQ0Qnl0ZShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0KLQlyZXR1cm4gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBSZWdBZGRyKTsKLX0KLQotdm9pZCBPRE1fV3JpdGUxQnl0ZShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1OCBEYXRhKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0KLQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJlZ0FkZHIsIERhdGEpOwotfQotCi12b2lkIE9ETV9Xcml0ZTJCeXRlKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHUxNiBEYXRhKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0KLQlydGw4NzIzYXVfd3JpdGUxNihBZGFwdGVyLCBSZWdBZGRyLCBEYXRhKTsKLX0KLQotdm9pZCBPRE1fV3JpdGU0Qnl0ZShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1MzIgRGF0YSkKLXsKLQlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIgPSBwRE1fT2RtLT5BZGFwdGVyOwotCi0JcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUmVnQWRkciwgRGF0YSk7Ci19Ci0KLXZvaWQgT0RNX1NldE1BQ1JlZygKLQlzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sCi0JdTMyCQlSZWdBZGRyLAotCXUzMgkJQml0TWFzaywKLQl1MzIJCURhdGEKLQkpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCBSZWdBZGRyLCBCaXRNYXNrLCBEYXRhKTsKLX0KLQotdTMyIE9ETV9HZXRNQUNSZWcoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXUzMgkJUmVnQWRkciwKLQl1MzIJCUJpdE1hc2sKLQkpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQotCXJldHVybiBQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCBSZWdBZGRyLCBCaXRNYXNrKTsKLX0KLQotdm9pZCBPRE1fU2V0QkJSZWcoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXUzMgkJUmVnQWRkciwKLQl1MzIJCUJpdE1hc2ssCi0JdTMyCQlEYXRhCi0JKQotewotCXN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlciA9IHBETV9PZG0tPkFkYXB0ZXI7Ci0KLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgUmVnQWRkciwgQml0TWFzaywgRGF0YSk7Ci19Ci0KLXUzMiBPRE1fR2V0QkJSZWcoCi0Jc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAotCXUzMgkJUmVnQWRkciwKLQl1MzIJCUJpdE1hc2sKLQkpCi17Ci0Jc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyID0gcERNX09kbS0+QWRhcHRlcjsKLQotCXJldHVybiBQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCBSZWdBZGRyLCBCaXRNYXNrKTsKLX0KLQogdm9pZCBPRE1fU2V0UkZSZWcoCiAJc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLAogCWVudW0gUkZfUkFESU9fUEFUSAllUkZQYXRoLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfYnQtY29leGlzdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfYnQtY29leGlzdC5jCmluZGV4IDczY2ZkZGQuLmNmMTVmODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2J0LWNvZXhpc3QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9idC1jb2V4aXN0LmMKQEAgLTE1NTQsNyArMTU1NCw4IEBACiAJCXBCdFNlYy0+YlVzZWRId0VuY3J5cHQgPSB0cnVlOwogCWVsc2UKIAkJcEJ0U2VjLT5iVXNlZEh3RW5jcnlwdCA9IGZhbHNlOwotCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9pbmZvXywgKCIlczogYlVzZWRId0VuY3J5cHQgPSVkXG4iLCBfX2Z1bmNfXywgcEJ0U2VjLT5iVXNlZEh3RW5jcnlwdCkpOworCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9zZWN1cml0eV9jXywgX2Rydl9pbmZvXywKKwkJICIlczogYlVzZWRId0VuY3J5cHQgPSVkXG4iLCBfX2Z1bmNfXywgcEJ0U2VjLT5iVXNlZEh3RW5jcnlwdCk7CiAKIAlwQnRTZWMtPlJTTklFLk9jdGV0ID0gcEJ0U2VjLT5SU05JRUJ1ZjsKIH0KQEAgLTMyMDgsNyArMzIwOSw3IEBACiAJcEJ0RGJnLT5kYmdIY2lJbmZvLmhjaUNtZENudERpc2Nvbm5lY3RQaHlMaW5rKys7CiAKIAlQTEggPSAqKCh1OCAqKXBIY2lDbWQtPkRhdGEpOwotCVBoeXNMaW5rRGlzY29ubmVjdFJlYXNvbiA9ICgqKCh1OCAqKXBIY2lDbWQtPkRhdGErMSkpOworCVBoeXNMaW5rRGlzY29ubmVjdFJlYXNvbiA9ICooKHU4ICopcEhjaUNtZC0+RGF0YSsxKTsKIAlSVFBSSU5UKEZJT0NUTCwgSU9DVExfQlRfSENJQ01ELCAoIkhDSV9ESVNDT05ORUNUX1BIWVNJQ0FMX0xJTksgIFBoeUhhbmRsZSA9IDB4JXgsIFJlYXNvbiA9IDB4JXhcbiIsCiAJCVBMSCwgUGh5c0xpbmtEaXNjb25uZWN0UmVhc29uKSk7CiAKQEAgLTQ1MTgsOCArNDUxOSw4IEBACiAJCVJUUFJJTlQoRklPQ1RMLCBJT0NUTF9TVEFURSwgKCJTVEFURV9DTURfTUFDX0NPTk5FQ1RfQ09NUExFVEVcbiIpKTsKIAogCQlpZiAocEJUSW5mby0+QnRBc29jRW50cnlbRW50cnlOdW1dLkFNUFJvbGUgPT0gQU1QX0JUQVBfSk9JTkVSKSB7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfc2VjdXJpdHlfY18sCi0JCQkJIF9kcnZfaW5mb18sICgiU3RhdGVDb25uZWN0aW5nIFxuIikpOworCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3NlY3VyaXR5X2NfLCBfZHJ2X2luZm9fLAorCQkJCSAiU3RhdGVDb25uZWN0aW5nXG4iKTsKIAkJfQogCQlicmVhazsKIAljYXNlIFNUQVRFX0NNRF9ESVNDT05ORUNUX1BIWV9MSU5LOgpAQCAtNTc5Niw3ICs1Nzk3LDcgQEAKIGJ0ZG1fMUFudFVwZGF0ZUhhbFJBTWFzayhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1MzIgbWFjX2lkLCB1MzIgZmlsdGVyKQogewogCXU4IGluaXRfcmF0ZSA9IDA7Ci0JdTggcmFpZDsKKwl1OCByYWlkLCBhcmc7CiAJdTMyIG1hc2s7CiAJdTggc2hvcnRHSXJhdGUgPSBmYWxzZTsKIAlpbnQgc3VwcG9ydFJhdGVOdW0gPSAwOwpAQCAtNTg2MCwyNiArNTg2MSwxNiBAQAogCW1hc2sgJj0gfmZpbHRlcjsKIAlpbml0X3JhdGUgPSBnZXRfaGlnaGVzdF9yYXRlX2lkeDIzYShtYXNrKSYweDNmOwogCi0JaWYgKHBIYWxEYXRhLT5md19yYWN0cmwpIHsKLQkJdTggYXJnID0gMDsKKwlhcmcgPSBtYWNfaWQmMHgxZjsvKiBNQUNJRCAqLworCWFyZyB8PSBCSVQoNyk7CisJaWYgKHRydWUgPT0gc2hvcnRHSXJhdGUpCisJCWFyZyB8PSBCSVQoNSk7CiAKLQkJYXJnID0gbWFjX2lkJjB4MWY7LyogTUFDSUQgKi8KLQkJYXJnIHw9IEJJVCg3KTsKLQkJaWYgKHRydWUgPT0gc2hvcnRHSXJhdGUpCi0JCQlhcmcgfD0gQklUKDUpOworCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKKwkJKCJbQlRDb2V4XSwgVXBkYXRlIEZXIFJBSUQgZW50cnksIE1BU0sgPSAweCUwOHgsICIKKwkJICJhcmcgPSAweCUwMnhcbiIsIG1hc2ssIGFyZykpOwogCi0JCVJUUFJJTlQoRkJULCBCVF9UUkFDRSwKLQkJCSgiW0JUQ29leF0sIFVwZGF0ZSBGVyBSQUlEIGVudHJ5LCBNQVNLID0gMHglMDh4LCAiCi0JCQkgImFyZyA9IDB4JTAyeFxuIiwgbWFzaywgYXJnKSk7Ci0KLQkJcnRsODcyM2Ffc2V0X3JhaWRfY21kKHBhZGFwdGVyLCBtYXNrLCBhcmcpOwotCX0gZWxzZSB7Ci0JCWlmIChzaG9ydEdJcmF0ZSkKLQkJCWluaXRfcmF0ZSB8PSBCSVQoNik7Ci0KLQkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0lOSURBVEFfUkFURV9TRUwgKyBtYWNfaWQsCi0JCQkJIGluaXRfcmF0ZSk7Ci0JfQorCXJ0bDg3MjNhX3NldF9yYWlkX2NtZChwYWRhcHRlciwgbWFzaywgYXJnKTsKIAogCXBzdGEtPmluaXRfcmF0ZSA9IGluaXRfcmF0ZTsKIAlwZG1wcml2LT5JTklEQVRBX1JBVEVbbWFjX2lkXSA9IGluaXRfcmF0ZTsKQEAgLTExMjA2LDE1ICsxMTE5NywxNyBAQAogCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJ0X3JhZGlvc2hhcmVkdHlwZSA9IHBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhSYWRpb1NoYXJlZDsKIAogCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIkJUIENvZXhpc3RhbmNlID0gMHgleFxuIiwgcnRsODcyM2FfQlRfY29leGlzdChwYWRhcHRlcikpKTsKKwkJICJCVCBDb2V4aXN0YW5jZSA9IDB4JXhcbiIsIHJ0bDg3MjNhX0JUX2NvZXhpc3QocGFkYXB0ZXIpKTsKIAogCWlmIChydGw4NzIzYV9CVF9jb2V4aXN0KHBhZGFwdGVyKSkgewogCQlpZiAocEhhbERhdGEtPmJ0X2NvZXhpc3QuQlRfQW50X051bSA9PSBBbnRfeDIpIHsKIAkJCUJURE1fU2V0QnRDb2V4Q3VyckFudE51bShwYWRhcHRlciwgMik7Ci0JCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAoIkJsdWVUb290aCBCVF9BbnRfTnVtID0gQW50eDJcbiIpKTsKKwkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCisJCQkJICJCbHVlVG9vdGggQlRfQW50X051bSA9IEFudHgyXG4iKTsKIAkJfSBlbHNlIGlmIChwSGFsRGF0YS0+YnRfY29leGlzdC5CVF9BbnRfTnVtID09IEFudF94MSkgewogCQkJQlRETV9TZXRCdENvZXhDdXJyQW50TnVtKHBhZGFwdGVyLCAxKTsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICgiQmx1ZVRvb3RoIEJUX0FudF9OdW0gPSBBbnR4MVxuIikpOworCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKKwkJCQkgIkJsdWVUb290aCBCVF9BbnRfTnVtID0gQW50eDFcbiIpOwogCQl9CiAJCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJCVEJ1c3lUcmFmZmljID0gZmFsc2U7CiAJCXBIYWxEYXRhLT5idF9jb2V4aXN0LmJCVFRyYWZmaWNNb2RlU2V0ID0gZmFsc2U7CkBAIC0xMTIyMyw4ICsxMTIxNiw4IEBACiAJCXBIYWxEYXRhLT5idF9jb2V4aXN0LlByZXZpb3VzU3RhdGUgPSAwOwogCiAJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJidF9yYWRpb3NoYXJlZFR5cGUgPSAweCV4XG4iLAotCQkJIHBIYWxEYXRhLT5idF9jb2V4aXN0LmJ0X3JhZGlvc2hhcmVkdHlwZSkpOworCQkJICJidF9yYWRpb3NoYXJlZFR5cGUgPSAweCV4XG4iLAorCQkJIHBIYWxEYXRhLT5idF9jb2V4aXN0LmJ0X3JhZGlvc2hhcmVkdHlwZSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9jbWQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2NtZC5jCmluZGV4IDdiNTY0MTEuLjExZTExMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2NtZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2NtZC5jCkBAIC0xNDIsMzIgKzE0MiwxOCBAQAogLyogYXJnWzVdID0gU2hvcnQgR0kgKi8KIHZvaWQgcnRsODcyM2FfYWRkX3JhdGVhdGlkKHN0cnVjdCBydHdfYWRhcHRlciAqcEFkYXB0ZXIsIHUzMiBiaXRtYXAsIHU4IGFyZywgdTggcnNzaV9sZXZlbCkKIHsKLQlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EJKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKHBBZGFwdGVyKTsKLQl1OCBtYWNpZCA9IGFyZyYweDFmOwotCXU4IHJhaWQgPSAoYml0bWFwPj4yOCkgJiAweDBmOworCXN0cnVjdCBoYWxfZGF0YV84NzIzYSAqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEocEFkYXB0ZXIpOworCXU4IG1hY2lkID0gYXJnICYgMHgxZjsKKwl1MzIgcmFpZCA9IGJpdG1hcCAmIDB4ZjAwMDAwMDA7CiAKIAliaXRtYXAgJj0gMHgwZmZmZmZmZjsKIAlpZiAocnNzaV9sZXZlbCAhPSBETV9SQVRSX1NUQV9JTklUKQogCQliaXRtYXAgPSBPRE1fR2V0X1JhdGVfQml0bWFwMjNhKHBIYWxEYXRhLCBtYWNpZCwgYml0bWFwLAogCQkJCQkJcnNzaV9sZXZlbCk7CiAKLQliaXRtYXAgfD0gKChyYWlkPDwyOCkmMHhmMDAwMDAwMCk7CisJYml0bWFwIHw9IHJhaWQ7CiAKLQlpZiAocEhhbERhdGEtPmZ3X3JhY3RybCA9PSB0cnVlKSB7Ci0JCXJ0bDg3MjNhX3NldF9yYWlkX2NtZChwQWRhcHRlciwgYml0bWFwLCBhcmcpOwotCX0gZWxzZSB7Ci0JCXU4IGluaXRfcmF0ZSwgc2hvcnRHSXJhdGUgPSBmYWxzZTsKLQotCQlpbml0X3JhdGUgPSBnZXRfaGlnaGVzdF9yYXRlX2lkeDIzYShiaXRtYXAmMHgwZmZmZmZmZikmMHgzZjsKLQotCQlzaG9ydEdJcmF0ZSA9IChhcmcmQklUKDUpKSA/IHRydWU6ZmFsc2U7Ci0KLQkJaWYgKHNob3J0R0lyYXRlID09IHRydWUpCi0JCQlpbml0X3JhdGUgfD0gQklUKDYpOwotCi0JCXJ0bDg3MjNhdV93cml0ZTgocEFkYXB0ZXIsIFJFR19JTklEQVRBX1JBVEVfU0VMICsgbWFjaWQsCi0JCQkJIGluaXRfcmF0ZSk7Ci0JfQorCXJ0bDg3MjNhX3NldF9yYWlkX2NtZChwQWRhcHRlciwgYml0bWFwLCBhcmcpOwogfQogCiB2b2lkIHJ0bDg3MjNhX3NldF9Gd1B3ck1vZGVfY21kKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIHU4IE1vZGUpCkBAIC0xODMsMTAgKzE2OSw4IEBACiAJICAgIHByZXZlbnQgY29uZmljdGluZyBzZXR0aW5nIGluIEZ3IHBvd2VyICovCiAJLyogIHNhdmluZyBzZXF1ZW5jZS4gMjAxMC4wNi4wNy4gQWRkZWQgYnkgdHlubGkuCiAJICAgIFN1Z2dlc3RlZCBieSBTRDMgeXNjaGFuZy4gKi8KLQlpZiAoKE1vZGUgIT0gUFNfTU9ERV9BQ1RJVkUpICYmCi0JICAgICghSVNfOTJDX1NFUklBTChwSGFsRGF0YS0+VmVyc2lvbklEKSkpIHsKKwlpZiAoTW9kZSAhPSBQU19NT0RFX0FDVElWRSAmJiBwSGFsRGF0YS0+cmZfdHlwZSAhPSBSRl8yVDJSKQogCQlPRE1fUkZfU2F2aW5nMjNhKCZwSGFsRGF0YS0+b2RtcHJpdiwgdHJ1ZSk7Ci0JfQogCiAJSDJDU2V0UHdyTW9kZS5Nb2RlID0gTW9kZTsKIAlIMkNTZXRQd3JNb2RlLlNtYXJ0UFMgPSBwd3Jwcml2LT5zbWFydF9wczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2RtLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9kbS5jCmluZGV4IGZhODI2YjAuLjFlODMxZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2RtLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfZG0uYwpAQCAtOTQsOCArOTQsNiBAQAogCW1lbXNldChwRE1fT2RtLCAwLCBzaXplb2YoKnBETV9PZG0pKTsKIAogCXBETV9PZG0tPkFkYXB0ZXIgPSBBZGFwdGVyOwotCU9ETV9DbW5JbmZvSW5pdDIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19QTEFURk9STSwgMHgwNCk7Ci0JT0RNX0NtbkluZm9Jbml0MjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX0lOVEVSRkFDRSwgUlRXX1VTQik7LyogUlRMODcxWF9IQ0lfVFlQRSAqLwogCiAJT0RNX0NtbkluZm9Jbml0MjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX0lDX1RZUEUsIE9ETV9SVEw4NzIzQSk7CiAKQEAgLTExOSwxNSArMTE3LDcgQEAKIAkJT0RNX0NtbkluZm9Jbml0MjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX0VYVF9MTkEsIHRydWUpOwogCQlPRE1fQ21uSW5mb0luaXQyM2EocERNX09kbSwgT0RNX0NNTklORk9fRVhUX1BBLCB0cnVlKTsKIAl9Ci0JT0RNX0NtbkluZm9Jbml0MjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX1BBVENIX0lELCBwSGFsRGF0YS0+Q3VzdG9tZXJJRCk7CiAJT0RNX0NtbkluZm9Jbml0MjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX0JXSUZJX1RFU1QsIEFkYXB0ZXItPnJlZ2lzdHJ5cHJpdi53aWZpX3NwZWMpOwotCi0JaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzFUMVIpCi0JCU9ETV9DbW5JbmZvVXBkYXRlMjNhKHBETV9PZG0sIE9ETV9DTU5JTkZPX1JGX1RZUEUsIE9ETV8xVDFSKTsKLQllbHNlIGlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSBSRl8yVDJSKQotCQlPRE1fQ21uSW5mb1VwZGF0ZTIzYShwRE1fT2RtLCBPRE1fQ01OSU5GT19SRl9UWVBFLCBPRE1fMlQyUik7Ci0JZWxzZSBpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gUkZfMVQyUikKLQkJT0RNX0NtbkluZm9VcGRhdGUyM2EocERNX09kbSwgT0RNX0NNTklORk9fUkZfVFlQRSwgT0RNXzFUMlIpOwogfQogCiBzdGF0aWMgdm9pZCBVcGRhdGVfT0RNX0NvbUluZm9fODcyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpBZGFwdGVyKQpAQCAtMTM2LDE2ICsxMjYsNyBAQAogCXN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSA9ICZwSGFsRGF0YS0+b2RtcHJpdjsKIAlzdHJ1Y3QgZG1fcHJpdgkqcGRtcHJpdiA9ICZwSGFsRGF0YS0+ZG1wcml2OwogCWludCBpOwotCXBkbXByaXYtPkluaXRPRE1GbGFnID0JT0RNX0JCX0RJRwkJfAotCQkJCU9ETV9CQl9SQV9NQVNLCQl8Ci0JCQkJT0RNX0JCX0RZTkFNSUNfVFhQV1IJfAotCQkJCU9ETV9CQl9GQV9DTlQJCXwKLQkJCQlPRE1fQkJfUlNTSV9NT05JVE9SCXwKLQkJCQlPRE1fQkJfQ0NLX1BECQl8Ci0JCQkJT0RNX0JCX1BXUl9TQVZFCQl8Ci0JCQkJT0RNX01BQ19FRENBX1RVUkJPCXwKLQkJCQlPRE1fUkZfVFhfUFdSX1RSQUNLCXwKLQkJCQlPRE1fUkZfQ0FMSUJSQVRJT047CisJcGRtcHJpdi0+SW5pdE9ETUZsYWcgPSAwOwogCS8qICBQb2ludGVyIHJlZmVyZW5jZSAqLwogCXJ0bDg3MjNhX29kbV9zdXBwb3J0X2FiaWxpdHlfc2V0KEFkYXB0ZXIsIERZTkFNSUNfQUxMX0ZVTkNfRU5BQkxFKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfaGFsX2luaXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX2hhbF9pbml0LmMKaW5kZXggYTVlYWRkNC4uMDRkMDE4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfaGFsX2luaXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9oYWxfaW5pdC5jCkBAIC05NSw3ICs5NSw3IEBACiAJCQlnb3RvIGV4aXQ7CiAJfQogCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIl9Xcml0ZUZXIERvbmUtIGZvciBOb3JtYWwgY2hpcC5cbiIpKTsKKwkJICJfV3JpdGVGVyBEb25lLSBmb3IgTm9ybWFsIGNoaXAuXG4iKTsKIAogZXhpdDoKIAlyZXR1cm4gcmV0OwpAQCAtMTE1LDEzICsxMTUsMTMgQEAKIAogCWlmIChjb3VudGVyID49IFBPTExJTkdfUkVBRFlfVElNRU9VVF9DT1VOVCkgewogCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIlczogY2hrc3VtIHJlcG9ydCBmYWlsISBSRUdfTUNVRldETDoweCUwOHhcbiIsCi0JCQkgIF9fZnVuY19fLCB2YWx1ZTMyKSk7CisJCQkgIiVzOiBjaGtzdW0gcmVwb3J0IGZhaWwhIFJFR19NQ1VGV0RMOjB4JTA4eFxuIiwKKwkJCSBfX2Z1bmNfXywgdmFsdWUzMik7CiAJCXJldHVybiBfRkFJTDsKIAl9CiAJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICgiJXM6IENoZWNrc3VtIHJlcG9ydCBPSyEgUkVHX01DVUZXREw6MHglMDh4XG4iLCBfX2Z1bmNfXywKLQkJICB2YWx1ZTMyKSk7CisJCSAiJXM6IENoZWNrc3VtIHJlcG9ydCBPSyEgUkVHX01DVUZXREw6MHglMDh4XG4iLCBfX2Z1bmNfXywKKwkJIHZhbHVlMzIpOwogCiAJdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19NQ1VGV0RMKTsKIAl2YWx1ZTMyIHw9IE1DVUZXRExfUkRZOwpAQCAtMTM0LDE3ICsxMzQsMTYgQEAKIAkJdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19NQ1VGV0RMKTsKIAkJaWYgKHZhbHVlMzIgJiBXSU5USU5JX1JEWSkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCQkgKCIlczogUG9sbGluZyBGVyByZWFkeSBzdWNjZXNzISEgIgotCQkJCSAgIlJFR19NQ1VGV0RMOjB4JTA4eFxuIiwKLQkJCQkgIF9fZnVuY19fLCB2YWx1ZTMyKSk7CisJCQkJICIlczogUG9sbGluZyBGVyByZWFkeSBzdWNjZXNzISEgUkVHX01DVUZXREw6MHglMDh4XG4iLAorCQkJCSBfX2Z1bmNfXywgdmFsdWUzMik7CiAJCQlyZXR1cm4gX1NVQ0NFU1M7CiAJCX0KIAkJdWRlbGF5KDUpOwogCX0gd2hpbGUgKGNvdW50ZXIrKyA8IFBPTExJTkdfUkVBRFlfVElNRU9VVF9DT1VOVCk7CiAKIAlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCSAoIiVzOiBQb2xsaW5nIEZXIHJlYWR5IGZhaWwhISBSRUdfTUNVRldETDoweCUwOHhcbiIsCi0JCSAgX19mdW5jX18sIHZhbHVlMzIpKTsKKwkJICIlczogUG9sbGluZyBGVyByZWFkeSBmYWlsISEgUkVHX01DVUZXREw6MHglMDh4XG4iLAorCQkgX19mdW5jX18sIHZhbHVlMzIpOwogCXJldHVybiBfRkFJTDsKIH0KIApAQCAtMTczLDggKzE3Miw4IEBACiAJCQl1MWJUbXAgPSBydGw4NzIzYXVfcmVhZDgocGFkYXB0ZXIsIFJFR19TWVNfRlVOQ19FTiArIDEpOwogCQl9CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCItJXM6IDgwNTEgcmVzZXQgc3VjY2VzcyAoJWQpXG4iLCBfX2Z1bmNfXywKLQkJCSAgRGVsYXkpKTsKKwkJCSAiLSVzOiA4MDUxIHJlc2V0IHN1Y2Nlc3MgKCVkKVxuIiwgX19mdW5jX18sCisJCQkgRGVsYXkpOwogCiAJCWlmICgoRGVsYXkgPT0gMCkpIHsKIAkJCS8qIGZvcmNlIGZpcm13YXJlIHJlc2V0ICovCkBAIC0yMDYsMTMgKzIwNSwxMiBAQAogCWludCBmd19zaXplOwogCXN0YXRpYyBpbnQgbG9nX3ZlcnNpb247CiAKLQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAoIislc1xuIiwgX19mdW5jX18pKTsKKwlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLCAiKyVzXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoSVNfODcyM0FfQV9DVVQocEhhbERhdGEtPlZlcnNpb25JRCkpIHsKIAkJZndfbmFtZSA9ICJydGx3aWZpL3J0bDg3MjNhdWZ3X0EuYmluIjsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoInJ0bDg3MjNhX0Zpcm13YXJlRG93bmxvYWQ6IFI4NzIzRndJbWFnZUFycmF5X1VNQyAiCi0JCQkgICJmb3IgUlRMODcyM0EgQSBDVVRcbiIpKTsKKwkJCSAicnRsODcyM2FfRmlybXdhcmVEb3dubG9hZDogUjg3MjNGd0ltYWdlQXJyYXlfVU1DIGZvciBSVEw4NzIzQSBBIENVVFxuIik7CiAJfSBlbHNlIGlmIChJU184NzIzQV9CX0NVVChwSGFsRGF0YS0+VmVyc2lvbklEKSkgewogCQkvKiAgV0xBTiBGdy4gKi8KIAkJaWYgKHBhZGFwdGVyLT5yZWdpc3RyeXByaXYud2lmaV9zcGVjID09IDEpIHsKQEAgLTIzNCw3ICsyMzIsNyBAQAogCQkvKiAgPFJvZ2VyX1RPRE8+IFdlIHNob3VsZCBkb3dubG9hZCBwcm9wZXIgUkFNIENvZGUgaGVyZQogCQkgICAgdG8gbWF0Y2ggdGhlIFJPTSBjb2RlLiAqLwogCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCIlczogdW5rbm93IHZlcnNpb24hXG4iLCBfX2Z1bmNfXykpOworCQkJICIlczogdW5rbm93biB2ZXJzaW9uIVxuIiwgX19mdW5jX18pOwogCQlydFN0YXR1cyA9IF9GQUlMOwogCQlnb3RvIEV4aXQ7CiAJfQpAQCAtMzE5LDExICszMTcsMTEgQEAKIAlydFN0YXR1cyA9IF9GV0ZyZWVUb0dvKHBhZGFwdGVyKTsKIAlpZiAoX1NVQ0NFU1MgIT0gcnRTdGF0dXMpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICgiREwgRmlybXdhcmUgZmFpbGVkIVxuIikpOworCQkJICJETCBGaXJtd2FyZSBmYWlsZWQhXG4iKTsKIAkJZ290byBFeGl0OwogCX0KIAlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJGaXJtd2FyZSBpcyByZWFkeSB0byBydW4hXG4iKSk7CisJCSAiRmlybXdhcmUgaXMgcmVhZHkgdG8gcnVuIVxuIik7CiAKIEV4aXQ6CiAJa2ZyZWUoZmlybXdhcmVfYnVmKTsKQEAgLTQyNCwxNSArNDIyLDE0IEBACiAJCQlvZmZzZXQgPSBHRVRfSERSX09GRlNFVF8yXzAoZWZ1c2VIZWFkZXIpOwogCiAJCQlSZWFkRUZ1c2VCeXRlMjNhKHBhZGFwdGVyLCBlRnVzZV9BZGRyKyssICZlZnVzZUV4dEhkcik7Ci0JCQlpZiAoQUxMX1dPUkRTX0RJU0FCTEVEKGVmdXNlRXh0SGRyKSkgeworCQkJaWYgKEFMTF9XT1JEU19ESVNBQkxFRChlZnVzZUV4dEhkcikpCiAJCQkJY29udGludWU7Ci0JCQl9CiAKIAkJCW9mZnNldCB8PSAoKGVmdXNlRXh0SGRyICYgMHhGMCkgPj4gMSk7Ci0JCQl3ZGVuID0gKGVmdXNlRXh0SGRyICYgMHgwRik7CisJCQl3ZGVuID0gZWZ1c2VFeHRIZHIgJiAweDBGOwogCQl9IGVsc2UgewotCQkJb2Zmc2V0ID0gKChlZnVzZUhlYWRlciA+PiA0KSAmIDB4MGYpOwotCQkJd2RlbiA9IChlZnVzZUhlYWRlciAmIDB4MGYpOworCQkJb2Zmc2V0ID0gKGVmdXNlSGVhZGVyID4+IDQpICYgMHgwZjsKKwkJCXdkZW4gPSBlZnVzZUhlYWRlciAmIDB4MGY7CiAJCX0KIAogCQlpZiAob2Zmc2V0IDwgRUZVU0VfTUFYX1NFQ1RJT05fODcyM0EpIHsKQEAgLTUyNCwxNSArNTIxLDE0IEBACiAKIAkJCQlSZWFkRUZ1c2VCeXRlMjNhKHBhZGFwdGVyLCBlRnVzZV9BZGRyKyssCiAJCQkJCSAgICAgICZlZnVzZUV4dEhkcik7Ci0JCQkJaWYgKEFMTF9XT1JEU19ESVNBQkxFRChlZnVzZUV4dEhkcikpIHsKKwkJCQlpZiAoQUxMX1dPUkRTX0RJU0FCTEVEKGVmdXNlRXh0SGRyKSkKIAkJCQkJY29udGludWU7Ci0JCQkJfQogCiAJCQkJb2Zmc2V0IHw9ICgoZWZ1c2VFeHRIZHIgJiAweEYwKSA+PiAxKTsKLQkJCQl3ZGVuID0gKGVmdXNlRXh0SGRyICYgMHgwRik7CisJCQkJd2RlbiA9IGVmdXNlRXh0SGRyICYgMHgwRjsKIAkJCX0gZWxzZSB7Ci0JCQkJb2Zmc2V0ID0gKChlZnVzZUhlYWRlciA+PiA0KSAmIDB4MGYpOwotCQkJCXdkZW4gPSAoZWZ1c2VIZWFkZXIgJiAweDBmKTsKKwkJCQlvZmZzZXQgPSAoZWZ1c2VIZWFkZXIgPj4gNCkgJiAweDBmOworCQkJCXdkZW4gPSBlZnVzZUhlYWRlciAmIDB4MGY7CiAJCQl9CiAKIAkJCWlmIChvZmZzZXQgPCBFRlVTRV9CVF9NQVhfU0VDVElPTikgewpAQCAtNjMwLDkgKzYyNiw4IEBACiAJCQlob2Zmc2V0ID0gR0VUX0hEUl9PRkZTRVRfMl8wKGVmdXNlX2RhdGEpOwogCQkJZWZ1c2VfYWRkcisrOwogCQkJZWZ1c2VfT25lQnl0ZVJlYWQyM2EocGFkYXB0ZXIsIGVmdXNlX2FkZHIsICZlZnVzZV9kYXRhKTsKLQkJCWlmIChBTExfV09SRFNfRElTQUJMRUQoZWZ1c2VfZGF0YSkpIHsKKwkJCWlmIChBTExfV09SRFNfRElTQUJMRUQoZWZ1c2VfZGF0YSkpCiAJCQkJY29udGludWU7Ci0JCQl9CiAKIAkJCWhvZmZzZXQgfD0gKChlZnVzZV9kYXRhICYgMHhGMCkgPj4gMSk7CiAJCQlod29yZGVuID0gZWZ1c2VfZGF0YSAmIDB4MEY7CkBAIC03MjEsOSArNzE2LDggQEAKIAkJfQogCiAJCS8qICBDaGVjayBpZiB3ZSBuZWVkIHRvIGNoZWNrIG5leHQgYmFuayBlZnVzZSAqLwotCQlpZiAoZWZ1c2VfYWRkciA8IHJldFUyKSB7CisJCWlmIChlZnVzZV9hZGRyIDwgcmV0VTIpCiAJCQlicmVhazsJLyogIGRvbid0IG5lZWQgdG8gY2hlY2sgbmV4dCBiYW5rLiAqLwotCQl9CiAJfQogCiAJcmV0VTIgPSAoKGJhbmsgLSAxKSAqIEVGVVNFX0JUX1JFQUxfQkFOS19DT05URU5UX0xFTikgKyBlZnVzZV9hZGRyOwpAQCAtNzQ0LDcgKzczOCw3IEBACiAJdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19TWVNfQ0ZHKTsKIAlDaGlwVmVyc2lvbi5JQ1R5cGUgPSBDSElQXzg3MjNBOwogCUNoaXBWZXJzaW9uLkNoaXBUeXBlID0gKCh2YWx1ZTMyICYgUlRMX0lEKSA/IFRFU1RfQ0hJUCA6IE5PUk1BTF9DSElQKTsKLQlDaGlwVmVyc2lvbi5SRlR5cGUgPSBSRl9UWVBFXzFUMVI7CisJcEhhbERhdGEtPnJmX3R5cGUgPSBSRl8xVDFSOwogCUNoaXBWZXJzaW9uLlZlbmRvclR5cGUgPQogCQkoKHZhbHVlMzIgJiBWRU5ET1JfSUQpID8gQ0hJUF9WRU5ET1JfVU1DIDogQ0hJUF9WRU5ET1JfVFNNQyk7CiAJQ2hpcFZlcnNpb24uQ1VUVmVyc2lvbiA9ICh2YWx1ZTMyICYgQ0hJUF9WRVJfUlRMX01BU0spID4+IENISVBfVkVSX1JUTF9TSElGVDsJLyogIElDIHZlcnNpb24gKENVVCkgKi8KQEAgLTc1NSw3ICs3NDksNyBAQAogCiAJdmFsdWUzMiA9IHJ0bDg3MjNhdV9yZWFkMzIocGFkYXB0ZXIsIFJFR19HUElPX09VVFNUUyk7CiAJLyogIFJPTSBjb2RlIHZlcnNpb24uICovCi0JQ2hpcFZlcnNpb24uUk9NVmVyID0gKCh2YWx1ZTMyICYgUkZfUkxfSUQpID4+IDIwKTsKKwlDaGlwVmVyc2lvbi5ST01WZXIgPSAodmFsdWUzMiAmIFJGX1JMX0lEKSA+PiAyMDsKIAogCS8qICBGb3IgbXVsdGktZnVuY3Rpb24gY29uc2lkZXJhdGlvbi4gQWRkZWQgYnkgUm9nZXIsIDIwMTAuMTAuMDYuICovCiAJcEhhbERhdGEtPk11bHRpRnVuYyA9IFJUX01VTFRJX0ZVTkNfTk9ORTsKQEAgLTc2OCwxNiArNzYyLDggQEAKIAlwSGFsRGF0YS0+UG9sYXJpdHlDdGwgPQogCQkoKHZhbHVlMzIgJiBXTF9IV1BETl9TTCkgPyBSVF9QT0xBUklUWV9ISUdIX0FDVCA6CiAJCSBSVF9QT0xBUklUWV9MT1dfQUNUKTsKLQlkdW1wX2NoaXBfaW5mbzIzYShDaGlwVmVyc2lvbik7CiAJcEhhbERhdGEtPlZlcnNpb25JRCA9IENoaXBWZXJzaW9uOwogCi0JaWYgKElTXzFUMlIoQ2hpcFZlcnNpb24pKQotCQlwSGFsRGF0YS0+cmZfdHlwZSA9IFJGXzFUMlI7Ci0JZWxzZSBpZiAoSVNfMlQyUihDaGlwVmVyc2lvbikpCi0JCXBIYWxEYXRhLT5yZl90eXBlID0gUkZfMlQyUjsKLQllbHNlCi0JCXBIYWxEYXRhLT5yZl90eXBlID0gUkZfMVQxUjsKLQogCU1TR184NzIzQSgiUkZfVHlwZSBpcyAleCEhXG4iLCBwSGFsRGF0YS0+cmZfdHlwZSk7CiB9CiAKQEAgLTgzMSw3ICs4MTcsNyBAQAogCSAgICB3ZSByZWNvcmQgdGhlIHZhbHVlICovCiAJLyogIHdoaWNoIHNob3VsZCBiZSByZWFkIGZyb20gcmVnaXN0ZXIgdG8gYSBnbG9iYWwgdmFyaWFibGUuICovCiAKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgKCIrUmVzdW1lVHhCZWFjb25cbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgIitSZXN1bWVUeEJlYWNvblxuIik7CiAKIAlwSGFsRGF0YS0+UmVnRndId1R4UUN0cmwgfD0gQklUKDYpOwogCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMICsgMiwKQEAgLTg0OSw3ICs4MzUsNyBAQAogCSAgICB3ZSByZWNvcmQgdGhlIHZhbHVlICovCiAJLyogIHdoaWNoIHNob3VsZCBiZSByZWFkIGZyb20gcmVnaXN0ZXIgdG8gYSBnbG9iYWwgdmFyaWFibGUuICovCiAKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgKCIrU3RvcFR4QmVhY29uXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICIrU3RvcFR4QmVhY29uXG4iKTsKIAogCXBIYWxEYXRhLT5SZWdGd0h3VHhRQ3RybCAmPSB+QklUKDYpOwogCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIFJFR19GV0hXX1RYUV9DVFJMICsgMiwKQEAgLTk5NSw3ICs5ODEsNyBAQAogCXN3aXRjaCAoYzJoX2V2dC0+aWQpIHsKIAljYXNlIEMySF9EQkc6CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJDMkhDb21tYW5kSGFuZGxlcjogJXNcbiIsIGMyaF9ldnQtPnBheWxvYWQpKTsKKwkJCSAiQzJIQ29tbWFuZEhhbmRsZXI6ICVzXG4iLCBjMmhfZXZ0LT5wYXlsb2FkKTsKIAkJYnJlYWs7CiAKIAljYXNlIEMySF9DQ1hfVFhfUlBUOgpAQCAtMTAwNSwyMiArOTkxLDIyIEBACiAJCWJyZWFrOwogCWNhc2UgQzJIX0hXX0lORk9fRVhDSDoKIAkJUlRfVFJBQ0UoX21vZHVsZV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIltCVF0sIEMySF9IV19JTkZPX0VYQ0hcbiIpKTsKKwkJCSAiW0JUXSwgQzJIX0hXX0lORk9fRVhDSFxuIik7CiAJCWZvciAoaSA9IDA7IGkgPCBjMmhfZXZ0LT5wbGVuOyBpKyspIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICgiW0JUXSwgdG1wQnVmWyVkXT0gMHgleFxuIiwgaSwKLQkJCQkgIGMyaF9ldnQtPnBheWxvYWRbaV0pKTsKKwkJCQkgIltCVF0sIHRtcEJ1ZlslZF09IDB4JXhcbiIsIGksCisJCQkJIGMyaF9ldnQtPnBheWxvYWRbaV0pOwogCQl9CiAJCWJyZWFrOwogCiAJY2FzZSBDMkhfQzJIX0gyQ19URVNUOgogCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiW0JUXSwgQzJIX0gyQ19URVNUXG4iKSk7CisJCQkgIltCVF0sIEMySF9IMkNfVEVTVFxuIik7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJbQlRdLCB0bXBCdWZbMF0vWzFdL1syXS9bM10vWzRdPSAweCV4LyAweCV4LyAiCi0JCQkgICIweCV4LyAweCV4LyAweCV4XG4iLCBjMmhfZXZ0LT5wYXlsb2FkWzBdLAotCQkJICBjMmhfZXZ0LT5wYXlsb2FkWzFdLCBjMmhfZXZ0LT5wYXlsb2FkWzJdLAotCQkJICBjMmhfZXZ0LT5wYXlsb2FkWzNdLCBjMmhfZXZ0LT5wYXlsb2FkWzRdKSk7CisJCQkgIltCVF0sIHRtcEJ1ZlswXS9bMV0vWzJdL1szXS9bNF09IDB4JXgvIDB4JXgvIDB4JXgvIDB4JXgvIDB4JXhcbiIsCisJCQkgYzJoX2V2dC0+cGF5bG9hZFswXSwKKwkJCSBjMmhfZXZ0LT5wYXlsb2FkWzFdLCBjMmhfZXZ0LT5wYXlsb2FkWzJdLAorCQkJIGMyaF9ldnQtPnBheWxvYWRbM10sIGMyaF9ldnQtPnBheWxvYWRbNF0pOwogCQlicmVhazsKIAogCWNhc2UgQzJIX0JUX0lORk86CkBAIC0xMDk1LDcgKzEwODEsNiBAQAogCXBkbXByaXYgPSAmcEhhbERhdGEtPmRtcHJpdjsKIAogCS8qICBpbml0IGRlZmF1bHQgdmFsdWUgKi8KLQlwSGFsRGF0YS0+ZndfcmFjdHJsID0gZmFsc2U7CiAJcEhhbERhdGEtPmJJUUtJbml0aWFsaXplZCA9IGZhbHNlOwogCWlmICghcGFkYXB0ZXItPnB3cmN0cmxwcml2LmJrZWVwZndhbGl2ZSkKIAkJcEhhbERhdGEtPkxhc3RITUVCb3hOdW0gPSAwOwpAQCAtMTE0OSwxNCArMTEzNCwxMyBAQAogCS8qIHBvbGxpbmcgKi8KIAlkbyB7CiAJCXZhbHVlID0gcnRsODcyM2F1X3JlYWQzMihwYWRhcHRlciwgTExUUmVnKTsKLQkJaWYgKF9MTFRfTk9fQUNUSVZFID09IF9MTFRfT1BfVkFMVUUodmFsdWUpKSB7CisJCWlmIChfTExUX05PX0FDVElWRSA9PSBfTExUX09QX1ZBTFVFKHZhbHVlKSkKIAkJCWJyZWFrOwotCQl9CiAKIAkJaWYgKGNvdW50ID4gUE9MTElOR19MTFRfVEhSRVNIT0xEKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiRmFpbGVkIHRvIHBvbGxpbmcgd3JpdGUgTExUIGRvbmUgYXQgIgotCQkJCSAgImFkZHJlc3MgJWQhXG4iLCBhZGRyZXNzKSk7CisJCQkJICJGYWlsZWQgdG8gcG9sbGluZyB3cml0ZSBMTFQgZG9uZSBhdCBhZGRyZXNzICVkIVxuIiwKKwkJCQkgYWRkcmVzcyk7CiAJCQlzdGF0dXMgPSBfRkFJTDsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMTc0LDE2ICsxMTU4LDE0IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgKHR4cGt0YnVmX2JuZHkgLSAxKTsgaSsrKSB7CiAJCXN0YXR1cyA9IF9MTFRXcml0ZShwYWRhcHRlciwgaSwgaSArIDEpOwotCQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKSB7CisJCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpCiAJCQlyZXR1cm4gc3RhdHVzOwotCQl9CiAJfQogCiAJLyogIGVuZCBvZiBsaXN0ICovCiAJc3RhdHVzID0gX0xMVFdyaXRlKHBhZGFwdGVyLCAodHhwa3RidWZfYm5keSAtIDEpLCAweEZGKTsKLQlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKSB7CisJaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykKIAkJcmV0dXJuIHN0YXR1czsKLQl9CiAKIAkvKiAgTWFrZSB0aGUgb3RoZXIgcGFnZXMgYXMgcmluZyBidWZmZXIgKi8KIAkvKiAgVGhpcyByaW5nIGJ1ZmZlciBpcyB1c2VkIGFzIGJlYWNvbiBidWZmZXIgaWYgd2UgY29uZmlnIHRoaXMKQEAgLTExOTEsMTYgKzExNzMsMTQgQEAKIAkvKiAgT3RoZXJ3aXNlIHVzZWQgYXMgbG9jYWwgbG9vcGJhY2sgYnVmZmVyLiAqLwogCWZvciAoaSA9IHR4cGt0YnVmX2JuZHk7IGkgPCBMYXN0X0VudHJ5X09mX1R4UGt0QnVmOyBpKyspIHsKIAkJc3RhdHVzID0gX0xMVFdyaXRlKHBhZGFwdGVyLCBpLCAoaSArIDEpKTsKLQkJaWYgKF9TVUNDRVNTICE9IHN0YXR1cykgeworCQlpZiAoX1NVQ0NFU1MgIT0gc3RhdHVzKQogCQkJcmV0dXJuIHN0YXR1czsKLQkJfQogCX0KIAogCS8qICBMZXQgbGFzdCBlbnRyeSBwb2ludCB0byB0aGUgc3RhcnQgZW50cnkgb2YgcmluZyBidWZmZXIgKi8KIAlzdGF0dXMgPSBfTExUV3JpdGUocGFkYXB0ZXIsIExhc3RfRW50cnlfT2ZfVHhQa3RCdWYsIHR4cGt0YnVmX2JuZHkpOwotCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpIHsKKwlpZiAoc3RhdHVzICE9IF9TVUNDRVNTKQogCQlyZXR1cm4gc3RhdHVzOwotCX0KIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xMjcyLDggKzEyNTIsNiBAQAogCiAJLyogIDIwMTAvMDgvMTIgTUggV2UgbmVlZCB0byBzZXQgQkIvR0xCQUwgcmVzZXQgdG8gc2F2ZSBwb3dlcgogCSAgICBmb3IgU1MgbW9kZS4gKi8KLQotLyoJUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwgKCI9PT09PT0+IFJGIG9mZiBhbmQgcmVzZXQgQkIuXG4iKSk7ICovCiB9CiAKIHN0YXRpYyB2b2lkIF9SZXNldERpZ2l0YWxQcm9jZWR1cmUxXzkyQyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLApAQCAtMTQwMiw4ICsxMzgwLDYgQEAKIAkJdmFsdWU4ID0gcnRsODcyM2F1X3JlYWQ4KHBhZGFwdGVyLCBSRUdfTERPVjEyRF9DVFJMKTsKIAkJdmFsdWU4ICY9IH5MRFYxMl9FTjsKIAkJcnRsODcyM2F1X3dyaXRlOChwYWRhcHRlciwgUkVHX0xET1YxMkRfQ1RSTCwgdmFsdWU4KTsKLS8qCQlSVF9UUkFDRShDT01QX0lOSVQsIERCR19MT1VELAotCQkoIiBSRUdfTERPVjEyRF9DVFJMIFJlZzB4MjE6MHglMDJ4LlxuIiwgdmFsdWU4KSk7ICovCiAJfQogCiAJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xNDM1LDkgKzE0MTEsOSBAQAogLyogIEhXIEF1dG8gc3RhdGUgbWFjaGluZSAqLwogaW50IENhcmREaXNhYmxlSFdTTShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyLCB1OCByZXNldE1DVSkKIHsKLQlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpIHsKKwlpZiAocGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpCiAJCXJldHVybiBfU1VDQ0VTUzsKLQl9CisKIAkvKiAgUkYgT2ZmIFNlcXVlbmNlID09PT0gKi8KIAlfRGlzYWJsZVJGQUZFQW5kUmVzZXRCQjgxOTJDKHBhZGFwdGVyKTsKIApAQCAtMTQ1MSw3ICsxNDI3LDcgQEAKIAlfRGlzYWJsZUFuYWxvZyhwYWRhcHRlciwgZmFsc2UpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIj09PT09PT4gQ2FyZCBkaXNhYmxlIGZpbmlzaGVkLlxuIikpOworCQkgIj09PT09PT4gQ2FyZCBkaXNhYmxlIGZpbmlzaGVkLlxuIik7CiAKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CkBAIC0xNDU5LDkgKzE0MzUsOCBAQAogLyogIHdpdGhvdXQgSFcgQXV0byBzdGF0ZSBtYWNoaW5lICovCiBpbnQgQ2FyZERpc2FibGVXaXRob3V0SFdTTShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQogewotCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgeworCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkKIAkJcmV0dXJuIF9TVUNDRVNTOwotCX0KIAogCS8qICBSRiBPZmYgU2VxdWVuY2UgPT09PSAqLwogCV9EaXNhYmxlUkZBRkVBbmRSZXNldEJCODE5MkMocGFkYXB0ZXIpOwpAQCAtMTQ3OCw4ICsxNDUzLDYgQEAKIAkvKiAgID09PT0gRGlzYWJsZSBhbmFsb2cgc2VxdWVuY2UgPT09ICovCiAJX0Rpc2FibGVBbmFsb2cocGFkYXB0ZXIsIHRydWUpOwogCi0JLyogUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfTE9VRCwKLQkgICAoIjw9PT09PT0gQ2FyZCBEaXNhYmxlIFdpdGhvdXQgSFdTTSAuXG4iKSk7ICovCiAJcmV0dXJuIF9TVUNDRVNTOwogfQogCkBAIC0xNDk2LDcgKzE0NjksNyBAQAogCQl9CiAJfSBlbHNlIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfbm90aWNlXywKLQkJCSAoIkF1dG9Mb2FkIEZhaWwgcmVwb3J0ZWQgZnJvbSBDUjkzNDYhIVxuIikpOworCQkJICJBdXRvTG9hZCBGYWlsIHJlcG9ydGVkIGZyb20gQ1I5MzQ2ISFcbiIpOwogCQkvKiB1cGRhdGUgdG8gZGVmYXVsdCB2YWx1ZSAweEZGICovCiAJCWlmICghcEVFUFJPTS0+RWVwcm9tT3JFZnVzZSkKIAkJCUVGVVNFX1NoYWRvd01hcFVwZGF0ZTIzYShwYWRhcHRlciwgRUZVU0VfV0lGSSk7CkBAIC0xNTIxLDcgKzE0OTQsNyBAQAogCX0KIAogCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIkVFUFJPTSBJRCA9IDB4JTA0eFxuIiwgRUVQUk9NSWQpKTsKKwkJICJFRVBST00gSUQgPSAweCUwNHhcbiIsIEVFUFJPTUlkKTsKIH0KIAogc3RhdGljIHZvaWQgSGFsX0VFVmFsdWVDaGVjayh1OCBFRVR5cGUsIHZvaWQgKnBJblZhbHVlLCB2b2lkICpwT3V0VmFsdWUpCkBAIC0xNTM2LDkgKzE1MDksOCBAQAogCQkJKnBPdXQgPSAqcEluOwogCQllbHNlIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgiRUVUWVBFX1RYX1BXUiwgdmFsdWUgPSVkIGlzIGludmFsaWQsIHNldCAiCi0JCQkJICAidG8gZGVmYXVsdCA9IDB4JXhcbiIsCi0JCQkJICAqcEluLCBFRVBST01fRGVmYXVsdF9UeFBvd2VyTGV2ZWwpKTsKKwkJCQkgIkVFVFlQRV9UWF9QV1IsIHZhbHVlID0lZCBpcyBpbnZhbGlkLCBzZXQgdG8gZGVmYXVsdCA9IDB4JXhcbiIsCisJCQkJICpwSW4sIEVFUFJPTV9EZWZhdWx0X1R4UG93ZXJMZXZlbCk7CiAJCQkqcE91dCA9IEVFUFJPTV9EZWZhdWx0X1R4UG93ZXJMZXZlbDsKIAkJfQogCX0KQEAgLTE2NzYsMzUgKzE2NDgsMzQgQEAKIAlmb3IgKHJmUGF0aCA9IDA7IHJmUGF0aCA8IFJGX1BBVEhfTUFYOyByZlBhdGgrKykgewogCQlmb3IgKGNoID0gMDsgY2ggPCBDSEFOTkVMX01BWF9OVU1CRVI7IGNoKyspIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoIlJGKCV1KS1DaCgldSkgW0NDSyAvIEhUNDBfMVMgLyBIVDQwXzJTXSA9ICIKLQkJCQkgICJbMHgleCAvIDB4JXggLyAweCV4XVxuIiwKLQkJCQkgIHJmUGF0aCwgY2gsCi0JCQkJICBwSGFsRGF0YS0+VHhQd3JMZXZlbENja1tyZlBhdGhdW2NoXSwKLQkJCQkgIHBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8xU1tyZlBhdGhdW2NoXSwKLQkJCQkgIHBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8yU1tyZlBhdGhdW2NoXSkpOworCQkJCSAiUkYoJXUpLUNoKCV1KSBbQ0NLIC8gSFQ0MF8xUyAvIEhUNDBfMlNdID0gWzB4JXggLyAweCV4IC8gMHgleF1cbiIsCisJCQkJIHJmUGF0aCwgY2gsCisJCQkJIHBIYWxEYXRhLT5UeFB3ckxldmVsQ2NrW3JmUGF0aF1bY2hdLAorCQkJCSBwSGFsRGF0YS0+VHhQd3JMZXZlbEhUNDBfMVNbcmZQYXRoXVtjaF0sCisJCQkJIHBIYWxEYXRhLT5UeFB3ckxldmVsSFQ0MF8yU1tyZlBhdGhdW2NoXSk7CiAKIAkJfQogCX0KIAlmb3IgKGNoID0gMDsgY2ggPCBDSEFOTkVMX01BWF9OVU1CRVI7IGNoKyspIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJSRi1BIEh0MjAgdG8gSFQ0MCBEaWZmWyV1XSA9IDB4JXgoJWQpXG4iLCBjaCwKLQkJCSAgcEhhbERhdGEtPlR4UHdySHQyMERpZmZbUkZfUEFUSF9BXVtjaF0sCi0JCQkgIHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW1JGX1BBVEhfQV1bY2hdKSk7CisJCQkgIlJGLUEgSHQyMCB0byBIVDQwIERpZmZbJXVdID0gMHgleCglZClcbiIsIGNoLAorCQkJIHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW1JGX1BBVEhfQV1bY2hdLAorCQkJIHBIYWxEYXRhLT5UeFB3ckh0MjBEaWZmW1JGX1BBVEhfQV1bY2hdKTsKIAl9CiAJZm9yIChjaCA9IDA7IGNoIDwgQ0hBTk5FTF9NQVhfTlVNQkVSOyBjaCsrKQogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIlJGLUEgTGVnYWN5IHRvIEh0NDAgRGlmZlsldV0gPSAweCV4XG4iLCBjaCwKLQkJCSAgcEhhbERhdGEtPlR4UHdyTGVnYWN5SHREaWZmW1JGX1BBVEhfQV1bY2hdKSk7CisJCQkgIlJGLUEgTGVnYWN5IHRvIEh0NDAgRGlmZlsldV0gPSAweCV4XG4iLCBjaCwKKwkJCSBwSGFsRGF0YS0+VHhQd3JMZWdhY3lIdERpZmZbUkZfUEFUSF9BXVtjaF0pOwogCWZvciAoY2ggPSAwOyBjaCA8IENIQU5ORUxfTUFYX05VTUJFUjsgY2grKykgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIlJGLUIgSHQyMCB0byBIVDQwIERpZmZbJXVdID0gMHgleCglZClcbiIsIGNoLAotCQkJICBwSGFsRGF0YS0+VHhQd3JIdDIwRGlmZltSRl9QQVRIX0JdW2NoXSwKLQkJCSAgcEhhbERhdGEtPlR4UHdySHQyMERpZmZbUkZfUEFUSF9CXVtjaF0pKTsKKwkJCSAiUkYtQiBIdDIwIHRvIEhUNDAgRGlmZlsldV0gPSAweCV4KCVkKVxuIiwgY2gsCisJCQkgcEhhbERhdGEtPlR4UHdySHQyMERpZmZbUkZfUEFUSF9CXVtjaF0sCisJCQkgcEhhbERhdGEtPlR4UHdySHQyMERpZmZbUkZfUEFUSF9CXVtjaF0pOwogCX0KIAlmb3IgKGNoID0gMDsgY2ggPCBDSEFOTkVMX01BWF9OVU1CRVI7IGNoKyspCiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiUkYtQiBMZWdhY3kgdG8gSFQ0MCBEaWZmWyV1XSA9IDB4JXhcbiIsIGNoLAotCQkJICBwSGFsRGF0YS0+VHhQd3JMZWdhY3lIdERpZmZbUkZfUEFUSF9CXVtjaF0pKTsKKwkJCSAiUkYtQiBMZWdhY3kgdG8gSFQ0MCBEaWZmWyV1XSA9IDB4JXhcbiIsIGNoLAorCQkJIHBIYWxEYXRhLT5UeFB3ckxlZ2FjeUh0RGlmZltSRl9QQVRIX0JdW2NoXSk7CiAJaWYgKCFBdXRvTG9hZEZhaWwpIHsKIAkJc3RydWN0IHJlZ2lzdHJ5X3ByaXYgKnJlZ2lzdHJ5X3BhciA9ICZwYWRhcHRlci0+cmVnaXN0cnlwcml2OwogCQlpZiAocmVnaXN0cnlfcGFyLT5yZWd1bGF0b3J5X3RpZCA9PSAweGZmKSB7CkBAIC0xNzIxLDcgKzE2OTIsNyBAQAogCQlwSGFsRGF0YS0+RUVQUk9NUmVndWxhdG9yeSA9IDA7CiAJfQogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJFRVBST01SZWd1bGF0b3J5ID0gMHgleFxuIiwgcEhhbERhdGEtPkVFUFJPTVJlZ3VsYXRvcnkpKTsKKwkJICJFRVBST01SZWd1bGF0b3J5ID0gMHgleFxuIiwgcEhhbERhdGEtPkVFUFJPTVJlZ3VsYXRvcnkpOwogCiAJaWYgKCFBdXRvTG9hZEZhaWwpCiAJCXBIYWxEYXRhLT5iVFhQb3dlckRhdGFSZWFkRnJvbUVFUE9STSA9IHRydWU7CkBAIC0xNzQ3LDggKzE3MTgsOCBAQAogCQkvKiAgZWVwcm9tIHNwZWMgKi8KIAkJdGVtcHZhbCA9IGh3aW5mb1tSRl9PUFRJT040Xzg3MjNBXTsKIAkJcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aEFudE51bSA9ICh0ZW1wdmFsICYgMHgxKTsKLQkJcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aEFudElzb2xhdGlvbiA9ICgodGVtcHZhbCAmIDB4MTApID4+IDQpOwotCQlwSGFsRGF0YS0+RUVQUk9NQmx1ZXRvb3RoUmFkaW9TaGFyZWQgPSAoKHRlbXB2YWwgJiAweDIwKSA+PiA1KTsKKwkJcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aEFudElzb2xhdGlvbiA9ICh0ZW1wdmFsICYgMHgxMCkgPj4gNDsKKwkJcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aFJhZGlvU2hhcmVkID0gKHRlbXB2YWwgJiAweDIwKSA+PiA1OwogCX0gZWxzZSB7CiAJCXBIYWxEYXRhLT5FRVBST01CbHVldG9vdGhDb2V4aXN0ID0gMDsKIAkJcEhhbERhdGEtPkVFUFJPTUJsdWV0b290aFR5cGUgPSBCVF9SVEw4NzIzQTsKQEAgLTE3NzEsOCArMTc0Miw4IEBACiAJZWxzZQogCQlwSGFsRGF0YS0+RUVQUk9NVmVyc2lvbiA9IDE7CiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIkhhbF9FZnVzZVBhcnNlRUVQUk9NVmVyKCksIEVFVmVyID0gJWRcbiIsCi0JCSAgcEhhbERhdGEtPkVFUFJPTVZlcnNpb24pKTsKKwkJICJIYWxfRWZ1c2VQYXJzZUVFUFJPTVZlcigpLCBFRVZlciA9ICVkXG4iLAorCQkgcEhhbERhdGEtPkVFUFJPTVZlcnNpb24pOwogfQogCiB2b2lkCkBAIC0xODA1LDEwICsxNzc2LDEwIEBACiAJCXBIYWxEYXRhLT5FRVBST01TdWJDdXN0b21lcklEID0gMDsKIAl9CiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sCi0JCSAoIkVFUFJPTSBDdXN0b21lciBJRDogMHglMnhcbiIsIHBIYWxEYXRhLT5FRVBST01DdXN0b21lcklEKSk7CisJCSAiRUVQUk9NIEN1c3RvbWVyIElEOiAweCUyeFxuIiwgcEhhbERhdGEtPkVFUFJPTUN1c3RvbWVySUQpOwogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCJFRVBST00gU3ViQ3VzdG9tZXIgSUQ6IDB4JTAyeFxuIiwKLQkJICBwSGFsRGF0YS0+RUVQUk9NU3ViQ3VzdG9tZXJJRCkpOworCQkgIkVFUFJPTSBTdWJDdXN0b21lciBJRDogMHglMDJ4XG4iLAorCQkgcEhhbERhdGEtPkVFUFJPTVN1YkN1c3RvbWVySUQpOwogfQogCiB2b2lkCkBAIC0xODM3LDggKzE4MDgsOCBAQAogCQlwSGFsRGF0YS0+Q3J5c3RhbENhcCA9IEVFUFJPTV9EZWZhdWx0X0NyeXN0YWxDYXBfODcyM0E7CiAJfQogCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAotCQkgKCIlczogQ3J5c3RhbENhcCA9IDB4JTJ4XG4iLCBfX2Z1bmNfXywKLQkJICBwSGFsRGF0YS0+Q3J5c3RhbENhcCkpOworCQkgIiVzOiBDcnlzdGFsQ2FwID0gMHglMnhcbiIsIF9fZnVuY19fLAorCQkgcEhhbERhdGEtPkNyeXN0YWxDYXApOwogfQogCiB2b2lkCkBAIC0xODc1LDkgKzE4NDYsOCBAQAogCS8qICBDbGVhciBmaXJzdCAqLwogCXB0eGRlc2MtPnR4ZHc3ICY9IGNwdV90b19sZTMyKDB4ZmZmZjAwMDApOwogCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKykKIAkJY2hlY2tzdW0gXj0gbGUxNl90b19jcHUoKih1c1B0ciArIGluZGV4KSk7Ci0JfQogCiAJcHR4ZGVzYy0+dHhkdzcgfD0gY3B1X3RvX2xlMzIoY2hlY2tzdW0gJiAweDAwMDBmZmZmKTsKIH0KQEAgLTE5MjUsOSArMTg5NSw4IEBACiAJCXB0eGRlc2MtPnR4ZHczIHw9IGNwdV90b19sZTMyKCg4IDw8IDI4KSk7CiAJfQogCi0JaWYgKHRydWUgPT0gSXNCVFFvc051bGwpIHsKKwlpZiAodHJ1ZSA9PSBJc0JUUW9zTnVsbCkKIAkJcHR4ZGVzYy0+dHhkdzIgfD0gY3B1X3RvX2xlMzIoQklUKDIzKSk7CS8qICBCVCBOVUxMICovCi0JfQogCiAJLyogb2Zmc2V0IDE2ICovCiAJcHR4ZGVzYy0+dHhkdzQgfD0gY3B1X3RvX2xlMzIoQklUKDgpKTsJLyogZHJpdmVyIHVzZXMgcmF0ZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcGh5Y2ZnLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9waHljZmcuYwppbmRleCAxOWRjNWUzLi40NmEzMDY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9waHljZmcuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYV9waHljZmcuYwpAQCAtMTIxLDE4ICsxMjEsMTUgQEAKIHsKIAl1MzIgT3JpZ2luYWxWYWx1ZSwgQml0U2hpZnQ7CiAKLQkvKiBSVF9UUkFDRShDT01QX1JGLCBEQkdfVFJBQ0UsICgiLS0tPlBIWV9TZXRCQlJlZygpOiBSZWdBZGRyKCUjbHgpLCBCaXRNYXNrKCUjbHgpLCBEYXRhKCUjbHgpXG4iLCBSZWdBZGRyLCBCaXRNYXNrLCBEYXRhKSk7ICovCi0KIAlpZiAoQml0TWFzayAhPSBiTWFza0RXb3JkKSB7LyogaWYgbm90ICJkb3VibGUgd29yZCIgd3JpdGUgKi8KIAkJT3JpZ2luYWxWYWx1ZSA9IHJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgUmVnQWRkcik7CiAJCUJpdFNoaWZ0ID0gcGh5X0NhbGN1bGF0ZUJpdFNoaWZ0KEJpdE1hc2spOwotCQlEYXRhID0gKChPcmlnaW5hbFZhbHVlICYgKH5CaXRNYXNrKSkgfCAoRGF0YSA8PCBCaXRTaGlmdCkpOworCQlEYXRhID0gKE9yaWdpbmFsVmFsdWUgJiAofkJpdE1hc2spKSB8IChEYXRhIDw8IEJpdFNoaWZ0KTsKIAl9CiAKIAlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSZWdBZGRyLCBEYXRhKTsKIAogCS8qIFJUUFJJTlQoRlBIWSwgUEhZX0JCVywgKCJCQlcgTUFTSyA9IDB4JWx4IEFkZHJbMHglbHhdPSAweCVseFxuIiwgQml0TWFzaywgUmVnQWRkciwgRGF0YSkpOyAqLwotCS8qIFJUX1RSQUNFKENPTVBfUkYsIERCR19UUkFDRSwgKCI8LS0tUEhZX1NldEJCUmVnKCk6IFJlZ0FkZHIoJSNseCksIEJpdE1hc2soJSNseCksIERhdGEoJSNseClcbiIsIFJlZ0FkZHIsIEJpdE1hc2ssIERhdGEpKTsgKi8KIH0KIAogLyogICovCkBAIC0xOTAsMjUgKzE4NywyNCBAQAogCS8qICBGb3IgOTJTIExTU0kgUmVhZCBSRkxTU0lSZWFkICovCiAJLyogIEZvciBSRiBBL0Igd3JpdGUgMHg4MjQvODJjKGRvZXMgbm90IHdvcmsgaW4gdGhlIGZ1dHVyZSkgKi8KIAkvKiAgV2UgbXVzdCB1c2UgMHg4MjQgZm9yIFJGIEEgYW5kIEIgdG8gZXhlY3V0ZSByZWFkIHRyaWdnZXIgKi8KLQl0bXBsb25nID0gUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLCBiTWFza0RXb3JkKTsKKwl0bXBsb25nID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIpOwogCWlmIChlUkZQYXRoID09IFJGX1BBVEhfQSkKIAkJdG1wbG9uZzIgPSB0bXBsb25nOwogCWVsc2UKLQkJdG1wbG9uZzIgPSBQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCBwUGh5UmVnLT5yZkhTU0lQYXJhMiwKLQkJCQkJICBiTWFza0RXb3JkKTsKKwkJdG1wbG9uZzIgPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHBQaHlSZWctPnJmSFNTSVBhcmEyKTsKIAogCXRtcGxvbmcyID0gKHRtcGxvbmcyICYgfmJMU1NJUmVhZEFkZHJlc3MpIHwKIAkJKE5ld09mZnNldCA8PCAyMykgfCBiTFNTSVJlYWRFZGdlOwkvKiBUNjUgUkYgKi8KIAotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIsCi0JCSAgICAgYk1hc2tEV29yZCwgdG1wbG9uZyAmICh+YkxTU0lSZWFkRWRnZSkpOworCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJGUEdBMF9YQV9IU1NJUGFyYW1ldGVyMiwKKwkJCSAgdG1wbG9uZyAmICh+YkxTU0lSZWFkRWRnZSkpOwogCXVkZWxheSgxMCk7LyogIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oMTApOyAqLwogCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHBQaHlSZWctPnJmSFNTSVBhcmEyLCBiTWFza0RXb3JkLCB0bXBsb25nMik7CisJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgcFBoeVJlZy0+cmZIU1NJUGFyYTIsIHRtcGxvbmcyKTsKIAl1ZGVsYXkoMTAwKTsvKiBQbGF0Zm9ybVN0YWxsRXhlY3V0aW9uKDEwMCk7ICovCiAKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1hBX0hTU0lQYXJhbWV0ZXIyLCBiTWFza0RXb3JkLAotCQkgICAgIHRtcGxvbmcgfCBiTFNTSVJlYWRFZGdlKTsKKwlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByRlBHQTBfWEFfSFNTSVBhcmFtZXRlcjIsCisJCQkgIHRtcGxvbmcgfCBiTFNTSVJlYWRFZGdlKTsKIAl1ZGVsYXkoMTApOy8qIFBsYXRmb3JtU3RhbGxFeGVjdXRpb24oMTApOyAqLwogCiAJaWYgKGVSRlBhdGggPT0gUkZfUEFUSF9BKQpAQCAtMzE5LDkgKzMxNSw3IEBACiAJLyogICovCiAJLyogIFdyaXRlIE9wZXJhdGlvbiAqLwogCS8qICAqLwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCBwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LCBiTWFza0RXb3JkLCBEYXRhQW5kQWRkcik7Ci0JLyogUlRQUklOVChGUEhZLCBQSFlfUkZXLCAoIlJGVy0lZCBBZGRyWzB4JWx4XT0gMHglbHhcbiIsIGVSRlBhdGgsIHBQaHlSZWctPnJmM3dpcmVPZmZzZXQsIERhdGFBbmRBZGRyKSk7ICovCi0KKwlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBwUGh5UmVnLT5yZjN3aXJlT2Zmc2V0LCBEYXRhQW5kQWRkcik7CiB9CiAKIC8qKgpAQCAtMzkyLDcgKzM4Niw3IEBACiAJaWYgKEJpdE1hc2sgIT0gYlJGUmVnT2Zmc2V0TWFzaykgewogCQlPcmlnaW5hbF9WYWx1ZSA9IHBoeV9SRlNlcmlhbFJlYWQoQWRhcHRlciwgZVJGUGF0aCwgUmVnQWRkcik7CiAJCUJpdFNoaWZ0ID0gIHBoeV9DYWxjdWxhdGVCaXRTaGlmdChCaXRNYXNrKTsKLQkJRGF0YSA9ICgoT3JpZ2luYWxfVmFsdWUgJiAofkJpdE1hc2spKSB8IChEYXRhIDw8IEJpdFNoaWZ0KSk7CisJCURhdGEgPSAoT3JpZ2luYWxfVmFsdWUgJiAofkJpdE1hc2spKSB8IChEYXRhIDw8IEJpdFNoaWZ0KTsKIAl9CiAKIAlwaHlfUkZTZXJpYWxXcml0ZShBZGFwdGVyLCBlUkZQYXRoLCBSZWdBZGRyLCBEYXRhKTsKQEAgLTQxOSw3ICs0MTMsNiBAQAogaW50IFBIWV9NQUNDb25maWc4NzIzQShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCiB7CiAJc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQlib29sIGlzOTJDID0gSVNfOTJDX1NFUklBTChwSGFsRGF0YS0+VmVyc2lvbklEKTsKIAogCS8qICAqLwogCS8qICBDb25maWcgTUFDICovCkBAIC00MjcsOSArNDIwLDkgQEAKIAlPRE1fUmVhZEFuZENvbmZpZ19NQUNfUkVHXzg3MjNBKCZwSGFsRGF0YS0+b2RtcHJpdik7CiAKIAkvKiAgMjAxMC4wNy4xMyBBTVBEVSBhZ2dyZWdhdGlvbiBudW1iZXIgOSAqLwotCS8qIHJ0d193cml0ZTE2KEFkYXB0ZXIsIFJFR19NQVhfQUdHUl9OVU0sIE1BWF9BR0dSX05VTSk7ICovCiAJcnRsODcyM2F1X3dyaXRlOChBZGFwdGVyLCBSRUdfTUFYX0FHR1JfTlVNLCAweDBBKTsKLQlpZiAoaXM5MkMgJiYgKEJPQVJEX1VTQl9ET05HTEUgPT0gcEhhbERhdGEtPkJvYXJkVHlwZSkpCisJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09IFJGXzJUMlIgJiYKKwkgICAgQk9BUkRfVVNCX0RPTkdMRSA9PSBwSGFsRGF0YS0+Qm9hcmRUeXBlKQogCQlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIDB4NDAsIDB4MDQpOwogCiAJcmV0dXJuIF9TVUNDRVNTOwpAQCAtNTUyLDEzMSArNTQ1LDUxIEBACiAKIAlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9SYXRlMThfMDYpIHsKIAkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bMF0gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bMF0gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzBdKSk7ICovCiAJfQogCWlmIChSZWdBZGRyID09IHJUeEFHQ19BX1JhdGU1NF8yNCkgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxXSA9IERhdGE7Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkgICAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVsxXSA9IDB4JWx4XG4iLAotCQkgICBwSGFsRGF0YS0+cHdyR3JvdXBDbnQsICovCi0JCS8qCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsKLQkJCXBIYWxEYXRhLT5wd3JHcm91cENudF1bMV0pKTsgKi8KIAl9CiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0FfQ0NLMV9NY3MzMikgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs2XSA9IERhdGE7Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkgICAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVs2XSA9IDB4JWx4XG4iLAotCQkgICBwSGFsRGF0YS0+cHdyR3JvdXBDbnQsICovCi0JCS8qCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsKLQkJCXBIYWxEYXRhLT5wd3JHcm91cENudF1bNl0pKTsgKi8KIAl9CiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfQ0NLMTFfQV9DQ0syXzExICYmIEJpdE1hc2sgPT0gMHhmZmZmZmYwMCkgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs3XSA9IERhdGE7Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkgICAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVs3XSA9IDB4JWx4XG4iLAotCQkgICBwSGFsRGF0YS0+cHdyR3JvdXBDbnQsICovCi0JCS8qCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsKLQkJCXBIYWxEYXRhLT5wd3JHcm91cENudF1bN10pKTsgKi8KIAl9CiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0FfTWNzMDNfTWNzMDApIHsKIAkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bMl0gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bMl0gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzJdKSk7ICovCiAJfQogCWlmIChSZWdBZGRyID09IHJUeEFHQ19BX01jczA3X01jczA0KSB7CiAJCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzNdID0gRGF0YTsKLQkJLyogUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCi0JCSAgICgiTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbJWRdWzNdID0gMHglbHhcbiIsCi0JCSAgIHBIYWxEYXRhLT5wd3JHcm91cENudCwgKi8KLQkJLyoJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WwotCQkJcEhhbERhdGEtPnB3ckdyb3VwQ250XVszXSkpOyAqLwogCX0KIAlpZiAoUmVnQWRkciA9PSByVHhBR0NfQV9NY3MxMV9NY3MwOCkgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs0XSA9IERhdGE7Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkgICAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVs0XSA9IDB4JWx4XG4iLAotCQkgICBwSGFsRGF0YS0+cHdyR3JvdXBDbnQsICovCi0JCS8qCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsKLQkJCXBIYWxEYXRhLT5wd3JHcm91cENudF1bNF0pKTsgKi8KIAl9CiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0FfTWNzMTVfTWNzMTIpIHsKIAkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bNV0gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bNV0gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzVdKSk7ICovCiAJfQogCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX1JhdGUxOF8wNikgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVs4XSA9IERhdGE7Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkgICAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVs4XSA9IDB4JWx4XG4iLAotCQkgICBwSGFsRGF0YS0+cHdyR3JvdXBDbnQsICovCi0JCS8qCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsKLQkJCXBIYWxEYXRhLT5wd3JHcm91cENudF1bOF0pKTsgKi8KIAl9CiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfUmF0ZTU0XzI0KSB7CiAJCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzldID0gRGF0YTsKLQkJLyogUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCi0JCSAgICgiTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbJWRdWzldID0gMHglbHhcbiIsCi0JCSAgIHBIYWxEYXRhLT5wd3JHcm91cENudCwgKi8KLQkJLyoJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WwotCQkJcEhhbERhdGEtPnB3ckdyb3VwQ250XVs5XSkpOyAqLwogCX0KIAlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9DQ0sxXzU1X01jczMyKSB7CiAJCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzE0XSA9IERhdGE7Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkgICAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVsxNF0gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzE0XSkpOyAqLwogCX0KIAlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9DQ0sxMV9BX0NDSzJfMTEgJiYgQml0TWFzayA9PSAweDAwMDAwMGZmKSB7CiAJCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzE1XSA9IERhdGE7Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkgICAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVsxNV0gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzE1XSkpOyAqLwogCX0KIAlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9NY3MwM19NY3MwMCkgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxMF0gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bMTBdID0gMHglbHhcbiIsCi0JCSAgIHBIYWxEYXRhLT5wd3JHcm91cENudCwgKi8KLQkJLyoJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WwotCQkJcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxMF0pKTsgKi8KIAl9CiAJaWYgKFJlZ0FkZHIgPT0gclR4QUdDX0JfTWNzMDdfTWNzMDQpIHsKIAkJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0W3BIYWxEYXRhLT5wd3JHcm91cENudF1bMTFdID0gRGF0YTsKLQkJLyogUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfVFJBQ0UsCi0JCSAgICgiTUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbJWRdWzExXSA9IDB4JWx4XG4iLAotCQkgICBwSGFsRGF0YS0+cHdyR3JvdXBDbnQsICovCi0JCS8qCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFsKLQkJCXBIYWxEYXRhLT5wd3JHcm91cENudF1bMTFdKSk7ICovCiAJfQogCWlmIChSZWdBZGRyID09IHJUeEFHQ19CX01jczExX01jczA4KSB7CiAJCXBIYWxEYXRhLT5NQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFtwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzEyXSA9IERhdGE7Ci0JCS8qIFJUX1RSQUNFKENPTVBfSU5JVCwgREJHX1RSQUNFLAotCQkgICAoIk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WyVkXVsxMl0gPSAweCVseFxuIiwKLQkJICAgcEhhbERhdGEtPnB3ckdyb3VwQ250LCAqLwotCQkvKglwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbCi0JCQlwSGFsRGF0YS0+cHdyR3JvdXBDbnRdWzEyXSkpOyAqLwogCX0KIAlpZiAoUmVnQWRkciA9PSByVHhBR0NfQl9NY3MxNV9NY3MxMikgewogCQlwSGFsRGF0YS0+TUNTVHhQb3dlckxldmVsT3JpZ2luYWxPZmZzZXRbcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxM10gPSBEYXRhOwotCQkvKiBSVF9UUkFDRShDT01QX0lOSVQsIERCR19UUkFDRSwKLQkJICAgKCJNQ1NUeFBvd2VyTGV2ZWxPcmlnaW5hbE9mZnNldFslZF1bMTNdID0gMHglbHhcbiIsCi0JCSAgIHBIYWxEYXRhLT5wd3JHcm91cENudCwgKi8KLQkJLyoJcEhhbERhdGEtPk1DU1R4UG93ZXJMZXZlbE9yaWdpbmFsT2Zmc2V0WwotCQkJcEhhbERhdGEtPnB3ckdyb3VwQ250XVsxM10pKTsgKi8KIAkJcEhhbERhdGEtPnB3ckdyb3VwQ250Kys7CiAJfQogfQpAQCAtODMxLDcgKzc0NCw3IEBACiAJCQkgICAgIChDcnlzdGFsQ2FwIHwgKENyeXN0YWxDYXAgPDwgNikpKTsKIAl9CiAKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgUkVHX0xET0ExNV9DVFJMLCBiTWFza0RXb3JkLCAweDAxNTcyNTA1KTsKKwlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCBSRUdfTERPQTE1X0NUUkwsIDB4MDE1NzI1MDUpOwogCXJldHVybiBydFN0YXR1czsKIH0KIApAQCAtOTIwLDEwICs4MzMsNiBAQAogCXU4IHJlZ0J3T3BNb2RlOwogCXU4IHJlZ1JSU1JfUlNDOwogCi0JLyogIFRoZXJlIGlzIG5vIDQwTUh6IG1vZGUgaW4gUkZfODIyNS4gKi8KLQlpZiAocEhhbERhdGEtPnJmX2NoaXAgPT0gUkZfODIyNSkKLQkJcmV0dXJuOwotCiAJaWYgKEFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkKQogCQlyZXR1cm47CiAKQEAgLTk4MiwxMCArODkxLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQkvKlJUX1RSQUNFKENPTVBfREJHLCBEQkdfTE9VRCwKLQkJICAoIlBIWV9TZXRCV01vZGUyM2FDYWxsYmFjazgxOTJDKCk6IHVua25vd24gQmFuZHdpZHRoOiAlI1hcbiIgXAotCQkgICwgcEhhbERhdGEtPkN1cnJlbnRDaGFubmVsQlcpKTsqLwotCQkJYnJlYWs7CisJCWJyZWFrOwogCX0KIAkvKiBTa2lwIG92ZXIgc2V0dGluZyBvZiBKLW1vZGUgaW4gQkIgcmVnaXN0ZXIgaGVyZS4gRGVmYXVsdCB2YWx1ZQogCSAgIGlzICJOb25lIEogbW9kZSIuIEVtaWx5IDIwMDcwMzE1ICovCkBAIC05OTQsNDEgKzkwMCw4IEBACiAJLyogTm93TCA9IFBsYXRmb3JtRUZJT1JlYWQ0Qnl0ZShBZGFwdGVyLCBUU0ZSKTsgKi8KIAkvKiBOb3dIID0gUGxhdGZvcm1FRklPUmVhZDRCeXRlKEFkYXB0ZXIsIFRTRlIrNCk7ICovCiAJLyogRW5kVGltZSA9ICgodTY0KU5vd0ggPDwgMzIpICsgTm93TDsgKi8KLQkvKiBSVF9UUkFDRShDT01QX1NDQU4sIERCR19MT1VELCAoIlNldEJXTW9kZTIzYUNhbGxiYWNrODE5MFBjaTogdGltZQotCSAgIG9mIFNldEJXTW9kZTIzYSA9ICVJNjRkIHVzIVxuIiwgKEVuZFRpbWUgLSBCZWdpblRpbWUpKSk7ICovCiAKLQkvKiAzPDM+U2V0IFJGIHJlbGF0ZWQgcmVnaXN0ZXIgKi8KLQlzd2l0Y2ggKHBIYWxEYXRhLT5yZl9jaGlwKSB7Ci0JY2FzZSBSRl84MjI1OgotCQkvKiBQSFlfU2V0UkY4MjI1QmFuZHdpZHRoKEFkYXB0ZXIsCi0JCSAgIHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXKTsgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIFJGXzgyNTY6Ci0JCS8qICBQbGVhc2UgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gaW4gSGFsODE5MFBjaVBoeTgyNTYuYyAqLwotCQkvKiBQSFlfU2V0UkY4MjU2QmFuZHdpZHRoKEFkYXB0ZXIsCi0JCSAgIHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXKTsgKi8KLQkJYnJlYWs7Ci0KLQljYXNlIFJGXzgyNTg6Ci0JCS8qICBQbGVhc2UgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gaW4gSGFsODE5MFBjaVBoeTgyNTguYyAqLwotCQkvKiAgUEhZX1NldFJGODI1OEJhbmR3aWR0aCgpOyAqLwotCQlicmVhazsKLQotCWNhc2UgUkZfNjA1MjoKLQkJcnRsODcyM2FfcGh5X3JmNjA1MnNldF9idyhBZGFwdGVyLCBwSGFsRGF0YS0+Q3VycmVudENoYW5uZWxCVyk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJLyogUlRfQVNTRVJUKGZhbHNlLCAoIlVua25vd24gUkZDaGlwSUQ6ICVkXG4iLAotCQkgICBwSGFsRGF0YS0+UkZDaGlwSUQpKTsgKi8KLQkJYnJlYWs7Ci0JfQotCi0JLyogcEhhbERhdGEtPlNldEJXTW9kZTIzYUluUHJvZ3Jlc3MgPSBmYWxzZTsgKi8KLQotCS8qIFJUX1RSQUNFKENPTVBfU0NBTiwgREJHX0xPVUQsCi0JICAgKCI8PT0gUEhZX1NldEJXTW9kZTIzYUNhbGxiYWNrODE5MkMoKSBcbiIpKTsgKi8KKwlydGw4NzIzYV9waHlfcmY2MDUyc2V0X2J3KEFkYXB0ZXIsIHBIYWxEYXRhLT5DdXJyZW50Q2hhbm5lbEJXKTsKIH0KIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhX3JmNjA1Mi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcmY2MDUyLmMKaW5kZXggMWFhZDQzOC4uM2UzZjE4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcmY2MDUyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2FfcmY2MDUyLmMKQEAgLTI2Nyw4ICsyNjcsOCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgMjoJLyogIEJldHRlciByZWd1bGF0b3J5ICovCiAJCQkvKiAgZG9uJ3QgaW5jcmVhc2UgYW55IHBvd2VyIGRpZmYgKi8KLQkJCXdyaXRlVmFsID0gKChpbmRleCA8IDIpID8gcG93ZXJCYXNlMFtyZl0gOgotCQkJCSAgICBwb3dlckJhc2UxW3JmXSk7CisJCQl3cml0ZVZhbCA9IChpbmRleCA8IDIpID8gcG93ZXJCYXNlMFtyZl0gOgorCQkJCSAgICBwb3dlckJhc2UxW3JmXTsKIAkJCWJyZWFrOwogCQljYXNlIDM6CS8qICBDdXN0b21lciBkZWZpbmVkIHBvd2VyIGRpZmYuICovCiAJCQljaG5sR3JvdXAgPSAwOwpAQCAtMzUzLDcgKzM1Myw3IEBACiAJCWVsc2UKIAkJCVJlZ09mZnNldCA9IFJlZ09mZnNldF9CW2luZGV4XTsKIAotCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgUmVnT2Zmc2V0LCBiTWFza0RXb3JkLCB3cml0ZVZhbCk7CisJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJlZ09mZnNldCwgd3JpdGVWYWwpOwogCiAJCS8qICAyMDEwMDUxMTUgSm9zZXBoOiBTZXQgVHggUG93ZXIgZGlmZiBmb3IgVHggcG93ZXIKIAkJICAgIHRyYWluaW5nIG1lY2hhbmlzbS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhdV9yZWN2LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfcmVjdi5jCmluZGV4IDYwNzViNmQuLjBmZWM4NGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhdV9yZWN2LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2F1X3JlY3YuYwpAQCAtNDgsNyArNDgsNyBAQAogCWlmICghcHJlY3Zwcml2LT5wcmVjdl9idWYpIHsKIAkJcmVzID0gX0ZBSUw7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJhbGxvYyByZWN2X2J1ZiBmYWlsIVxuIikpOworCQkJICJhbGxvYyByZWN2X2J1ZiBmYWlsIVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTE5NCw4ICsxOTQsOCBAQAogCWJvb2wgbWF0Y2hic3NpZCA9IGZhbHNlOwogCXU4ICpic3NpZDsKIAotCW1hdGNoYnNzaWQgPSAoIWllZWU4MDIxMV9pc19jdGwoaGRyLT5mcmFtZV9jb250cm9sKSAmJgotCQkgICAgICAhcGF0dHJpYi0+aWN2X2VyciAmJiAhcGF0dHJpYi0+Y3JjX2Vycik7CisJbWF0Y2hic3NpZCA9ICFpZWVlODAyMTFfaXNfY3RsKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKKwkJICAgICAgIXBhdHRyaWItPmljdl9lcnIgJiYgIXBhdHRyaWItPmNyY19lcnI7CiAKIAlpZiAobWF0Y2hic3NpZCkgewogCQlzd2l0Y2ggKGhkci0+ZnJhbWVfY29udHJvbCAmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfeG1pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvcnRsODcyM2F1X3htaXQuYwppbmRleCAxNzU5NDg3Li42YmY4N2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC9ydGw4NzIzYXVfeG1pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3J0bDg3MjNhdV94bWl0LmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogc3RhdGljIHZvaWQgcnRsODE5MmN1X2NhbF90eGRlc2NfY2hrc3VtKHN0cnVjdCB0eF9kZXNjCSpwdHhkZXNjKQogewotCQl1MTYJKnVzUHRyID0gKHUxNiAqKXB0eGRlc2M7CisJCV9fbGUxNgkqdXNQdHIgPSAoX19sZTE2ICopcHR4ZGVzYzsKIAkJdTMyIGNvdW50ID0gMTY7CQkvKiAgKDMyIGJ5dGVzIC8gMiBieXRlcyBwZXIgWE9SKSA9PiAxNiB0aW1lcyAqLwogCQl1MzIgaW5kZXg7CiAJCXUxNiBjaGVja3N1bSA9IDA7CkBAIC0xMzAsNyArMTMwLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzMzIgdXBkYXRlX3R4ZGVzYyhzdHJ1Y3QgeG1pdF9mcmFtZSAqcHhtaXRmcmFtZSwgdTggKnBtZW0sIHMzMiBzeiwgdTggYmFnZ19wa3QpCitzdGF0aWMgczMyIHVwZGF0ZV90eGRlc2Moc3RydWN0IHhtaXRfZnJhbWUgKnB4bWl0ZnJhbWUsIHU4ICpwbWVtLCBzMzIgc3opCiB7CiAJaW50CXB1bGwgPSAwOwogCXVpbnQJcXNlbDsKQEAgLTE0Myw3ICsxNDMsNyBAQAogCXN0cnVjdCBtbG1lX2V4dF9pbmZvCSpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwogCWludAlibWNzdCA9IGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKHBhdHRyaWItPnJhKTsKIAotCWlmICgoIWJhZ2dfcGt0KSAmJiAodXJiX3plcm9fcGFja2V0X2NoayhwYWRhcHRlciwgc3opID09IDApKSB7CisJaWYgKHVyYl96ZXJvX3BhY2tldF9jaGsocGFkYXB0ZXIsIHN6KSA9PSAwKSB7CiAJCXB0eGRlc2MgPSAoc3RydWN0IHR4X2Rlc2MgKikocG1lbStQQUNLRVRfT0ZGU0VUX1NaKTsKIAkJcHVsbCA9IDE7CiAJCXB4bWl0ZnJhbWUtPnBrdF9vZmZzZXQtLTsKQEAgLTI3Miw3ICsyNzIsOCBAQAogCWlmIChibWNzdCkKIAkJcHR4ZGVzYy0+dHhkdzAgfD0gY3B1X3RvX2xlMzIoQklUKDI0KSk7CiAKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgKCJvZmZzZXQwLXR4ZGVzYyA9IDB4JXhcbiIsIHB0eGRlc2MtPnR4ZHcwKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sCisJCSAib2Zmc2V0MC10eGRlc2MgPSAweCV4XG4iLCBwdHhkZXNjLT50eGR3MCk7CiAKIAkvKiBvZmZzZXQgNCAqLwogCS8qICBwa3Rfb2Zmc2V0LCB1bml0OjggYnl0ZXMgcGFkZGluZyAqLwpAQCAtMzAzLDcgKzMwNCw3IEBACiAKIAltZW1fYWRkciA9IHB4bWl0ZnJhbWUtPmJ1Zl9hZGRyOwogCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sICgicnR3X2R1bXBfeGZyYW1lKClcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgInJ0d19kdW1wX3hmcmFtZSgpXG4iKTsKIAogCWZvciAodCA9IDA7IHQgPCBwYXR0cmliLT5ucl9mcmFnczsgdCsrKSB7CiAJCWlmIChpbm5lcl9yZXQgIT0gX1NVQ0NFU1MgJiYgcmV0ID09IF9TVUNDRVNTKQpAQCAtMzExLDcgKzMxMiw3IEBACiAKIAkJaWYgKHQgIT0gKHBhdHRyaWItPm5yX2ZyYWdzIC0gMSkpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgicGF0dHJpYi0+bnJfZnJhZ3MgPSVkXG4iLCBwYXR0cmliLT5ucl9mcmFncykpOworCQkJCSAicGF0dHJpYi0+bnJfZnJhZ3MgPSVkXG4iLCBwYXR0cmliLT5ucl9mcmFncyk7CiAKIAkJCXN6ID0gcHhtaXRwcml2LT5mcmFnX2xlbjsKIAkJCXN6ID0gc3ogLSA0IC0gcGF0dHJpYi0+aWN2X2xlbjsKQEAgLTMyMCw3ICszMjEsNyBAQAogCQkJc3ogPSBwYXR0cmliLT5sYXN0X3R4Y21kc3o7CiAJCX0KIAotCQlwdWxsID0gdXBkYXRlX3R4ZGVzYyhweG1pdGZyYW1lLCBtZW1fYWRkciwgc3osIGZhbHNlKTsKKwkJcHVsbCA9IHVwZGF0ZV90eGRlc2MocHhtaXRmcmFtZSwgbWVtX2FkZHIsIHN6KTsKIAogCQlpZiAocHVsbCkgewogCQkJbWVtX2FkZHIgKz0gUEFDS0VUX09GRlNFVF9TWjsgLyogcHVsbCB0eGRlc2MgaGVhZCAqLwpAQCAtMzM4LDcgKzMzOSw3IEBACiAJCXJ0d19jb3VudF90eF9zdGF0czIzYShwYWRhcHRlciwgcHhtaXRmcmFtZSwgc3opOwogCiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF94bWl0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgicnR3X3dyaXRlX3BvcnQsIHdfc3ogPSVkXG4iLCB3X3N6KSk7CisJCQkgInJ0d193cml0ZV9wb3J0LCB3X3N6ID0lZFxuIiwgd19zeik7CiAKIAkJbWVtX2FkZHIgKz0gd19zejsKIApAQCAtMzY1LDcgKzM2Niw3IEBACiAJcGh3eG1pdHMgPSBweG1pdHByaXYtPmh3eG1pdHM7CiAJaHdlbnRyeSA9IHB4bWl0cHJpdi0+aHd4bWl0X2VudHJ5OwogCi0JUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sICgieG1pdGZyYW1lX2NvbXBsZXRlKClcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywgInhtaXRmcmFtZV9jb21wbGV0ZSgpXG4iKTsKIAogCWlmIChweG1pdGJ1ZiA9PSBOVUxMKSB7CiAJCXB4bWl0YnVmID0gcnR3X2FsbG9jX3htaXRidWYyM2EocHhtaXRwcml2KTsKQEAgLTM4OCw3ICszODksOCBAQAogCQkJcnR3X29zX3htaXRfY29tcGxldGUyM2EocGFkYXB0ZXIsIHB4bWl0ZnJhbWUpOy8qIGFsd2F5cyByZXR1cm4gbmRpc19wYWNrZXQgYWZ0ZXIgcnR3X3htaXRmcmFtZV9jb2FsZXNjZTIzYSAqLwogCQl9CiAKLQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3htaXRfY18sIF9kcnZfaW5mb18sICgieG1pdGZyYW1lX2NvbXBsZXRlKCk6IHJ0d19kdW1wX3hmcmFtZVxuIikpOworCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfeG1pdF9jXywgX2Rydl9pbmZvXywKKwkJCSAieG1pdGZyYW1lX2NvbXBsZXRlKCk6IHJ0d19kdW1wX3hmcmFtZVxuIik7CiAKIAkJaWYgKHJlcyA9PSBfU1VDQ0VTUykgewogCQkJcnR3X2R1bXBfeGZyYW1lKHBhZGFwdGVyLCBweG1pdGZyYW1lKTsKQEAgLTQ4MSw3ICs0ODMsNyBAQAogCiAJaWYgKHJlcyAhPSBfU1VDQ0VTUykgewogCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAoInByZV94bWl0ZnJhbWU6IGVucXVldWUgeG1pdGZyYW1lIGZhaWxcbiIpKTsKKwkJCSAicHJlX3htaXRmcmFtZTogZW5xdWV1ZSB4bWl0ZnJhbWUgZmFpbFxuIik7CiAJCXJ0d19mcmVlX3htaXRmcmFtZTIzYShweG1pdHByaXYsIHB4bWl0ZnJhbWUpOwogCiAJCS8qICBUcmljaywgbWFrZSB0aGUgc3RhdGlzdGljcyBjb3JyZWN0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2JfaGFsaW5pdC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvdXNiX2hhbGluaXQuYwppbmRleCBhZGJmMWMyLi40MmFlMjlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2JfaGFsaW5pdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9oYWxpbml0LmMKQEAgLTQ0NywyMiArNDQ3LDggQEAKIHN0YXRpYyB2b2lkIF9Jbml0UkZUeXBlKHN0cnVjdCBydHdfYWRhcHRlciAqQWRhcHRlcikKIHsKIAlzdHJ1Y3QgaGFsX2RhdGFfODcyM2EgKnBIYWxEYXRhID0gR0VUX0hBTF9EQVRBKEFkYXB0ZXIpOwotCWJvb2wgaXM5MkNVID0gSVNfOTJDX1NFUklBTChwSGFsRGF0YS0+VmVyc2lvbklEKTsKIAotCXBIYWxEYXRhLT5yZl9jaGlwID0gUkZfNjA1MjsKLQotCWlmICghaXM5MkNVKSB7Ci0JCXBIYWxEYXRhLT5yZl90eXBlID0gUkZfMVQxUjsKLQkJREJHXzg3MjNBKCJTZXQgUkYgQ2hpcCBJRCB0byBSRl82MDUyIGFuZCBSRiB0eXBlIHRvIDFUMVIuXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qICBUT0RPOiBDb25zaWRlciB0aGF0IEVFUFJPTSBzZXQgOTJDVSB0byAxVDFSIGxhdGVyLiAqLwotCS8qICBGb3JjZSB0byBvdmVyd3JpdGUgc2V0dGluZyBhY2NvcmRpbmcgdG8gY2hpcCB2ZXJzaW9uLiBJZ25vcmUKLQkgICAgRUVQUk9NIHNldHRpbmcuICovCi0JLyogcEhhbERhdGEtPlJGX1R5cGUgPSBpczkyQ1UgPyBSRl8yVDJSIDogUkZfMVQxUjsgKi8KLQlNU0dfODcyM0EoIlNldCBSRiBDaGlwIElEIHRvIFJGXzYwNTIgYW5kIFJGIHR5cGUgdG8gJWQuXG4iLAotCQkgIHBIYWxEYXRhLT5yZl90eXBlKTsKKwlwSGFsRGF0YS0+cmZfdHlwZSA9IFJGXzFUMVI7CiB9CiAKIC8qICBTZXQgQ0NLIGFuZCBPRkRNIEJsb2NrICJPTiIgKi8KQEAgLTUzMCw3ICs1MTYsNyBAQAogCS8qICBDaGVjayBpZiBNQUMgaGFzIGFscmVhZHkgcG93ZXIgb24uIGJ5IHR5bmxpLiAyMDExLjA1LjI3LiAqLwogCXZhbDggPSBydGw4NzIzYXVfcmVhZDgoQWRhcHRlciwgUkVHX0NSKTsKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICgiJXM6IFJFR19DUiAweDEwMCA9IDB4JTAyeFxuIiwgX19mdW5jX18sIHZhbDgpKTsKKwkJICIlczogUkVHX0NSIDB4MTAwID0gMHglMDJ4XG4iLCBfX2Z1bmNfXywgdmFsOCk7CiAJLyogRml4IDkyRFUtVkMgUzMgaGFuZyB3aXRoIHRoZSByZWFzb24gaXMgdGhhdCBzZWNvbmRhcnkgbWFjIGlzIG5vdAogCSAgIGluaXRpYWxpemVkLiAqLwogCS8qIDB4MTAwIHZhbHVlIG9mIGZpcnN0IG1hYyBpcyAweEVBIHdoaWxlIDB4MTAwIHZhbHVlIG9mIHNlY29uZGFyeQpAQCAtNTQwLDEzICs1MjYsMTMgQEAKIAl9IGVsc2UgewogCQltYWNfb24gPSB0cnVlOwogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIiVzOiBNQUMgaGFzIGFscmVhZHkgcG93ZXIgb25cbiIsIF9fZnVuY19fKSk7CisJCQkgIiVzOiBNQUMgaGFzIGFscmVhZHkgcG93ZXIgb25cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlzdGF0dXMgPSBfSW5pdFBvd2VyT24oQWRhcHRlcik7CiAJaWYgKHN0YXR1cyA9PSBfRkFJTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICgiRmFpbGVkIHRvIGluaXQgcG93ZXIgb24hXG4iKSk7CisJCQkgIkZhaWxlZCB0byBpbml0IHBvd2VyIG9uIVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTU2MSw3ICs1NDcsNyBAQAogCQlzdGF0dXMgPSAgSW5pdExMVFRhYmxlMjNhKEFkYXB0ZXIsIGJvdW5kYXJ5KTsKIAkJaWYgKHN0YXR1cyA9PSBfRkFJTCkgewogCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJGYWlsZWQgdG8gaW5pdCBMTFQgdGFibGVcbiIpKTsKKwkJCQkgIkZhaWxlZCB0byBpbml0IExMVCB0YWJsZVxuIik7CiAJCQlnb3RvIGV4aXQ7CiAJCX0KIAl9CkBAIC01NzIsMTIgKzU1OCwxMCBAQAogCXN0YXR1cyA9IHJ0bDg3MjNhX0Zpcm13YXJlRG93bmxvYWQoQWRhcHRlcik7CiAJaWYgKHN0YXR1cyAhPSBfU1VDQ0VTUykgewogCQlBZGFwdGVyLT5iRldSZWFkeSA9IGZhbHNlOwotCQlwSGFsRGF0YS0+ZndfcmFjdHJsID0gZmFsc2U7CiAJCURCR184NzIzQSgiZncgZG93bmxvYWQgZmFpbCFcbiIpOwogCQlnb3RvIGV4aXQ7CiAJfSBlbHNlIHsKIAkJQWRhcHRlci0+YkZXUmVhZHkgPSB0cnVlOwotCQlwSGFsRGF0YS0+ZndfcmFjdHJsID0gdHJ1ZTsKIAkJREJHXzg3MjNBKCJmdyBkb3dubG9hZCBvayFcbiIpOwogCX0KIApAQCAtNjI1LDE3ICs2MDksMjIgQEAKIAl9CiAKIAkvKiByZWR1Y2luZyA4ME0gc3B1ciAqLwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCBSRUdfQUZFX1hUQUxfQ1RSTCwgYk1hc2tEV29yZCwgMHgwMzgxODA4ZCk7Ci0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwsIGJNYXNrRFdvcmQsIDB4ZjBmZmZmODMpOwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCBSRUdfQUZFX1BMTF9DVFJMLCBiTWFza0RXb3JkLCAweGYwZmZmZjgyKTsKLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgUkVHX0FGRV9QTExfQ1RSTCwgYk1hc2tEV29yZCwgMHhmMGZmZmY4Myk7CisJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX0FGRV9YVEFMX0NUUkwsIDB4MDM4MTgwOGQpOworCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwsIDB4ZjBmZmZmODMpOworCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwsIDB4ZjBmZmZmODIpOworCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19BRkVfUExMX0NUUkwsIDB4ZjBmZmZmODMpOwogCiAJLyogUkZTVyBDb250cm9sICovCi0JUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9UeEluZm8sIGJNYXNrRFdvcmQsIDB4MDAwMDAwMDMpOwkvKiAweDgwNFsxNF09IDAgKi8KLQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1hBQl9SRkludGVyZmFjZVNXLCBiTWFza0RXb3JkLCAweDA3MDAwNzYwKTsJLyogMHg4NzBbNjo1XT0gYicxMSAqLwotCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByRlBHQTBfWEFfUkZJbnRlcmZhY2VPRSwgYk1hc2tEV29yZCwgMHg2NkY2MDIxMCk7IC8qIDB4ODYwWzY6NV09IGInMDAgKi8KKwkvKiAweDgwNFsxNF09IDAgKi8KKwlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByRlBHQTBfVHhJbmZvLCAweDAwMDAwMDAzKTsKKwkvKiAweDg3MFs2OjVdPSBiJzExICovCisJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgckZQR0EwX1hBQl9SRkludGVyZmFjZVNXLCAweDA3MDAwNzYwKTsKKwkvKiAweDg2MFs2OjVdPSBiJzAwICovCisJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgckZQR0EwX1hBX1JGSW50ZXJmYWNlT0UsIDB4NjZGNjAyMTApOwogCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICgiJXM6IDB4ODcwID0gdmFsdWUgMHgleFxuIiwgX19mdW5jX18sIFBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIDB4ODcwLCBiTWFza0RXb3JkKSkpOworCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2luZm9fLAorCQkgIiVzOiAweDg3MCA9IHZhbHVlIDB4JXhcbiIsIF9fZnVuY19fLAorCQkgcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCAweDg3MCkpOwogCiAJLyogICovCiAJLyogIEpvc2VwaCBOb3RlOiBLZWVwIFJmUmVnQ2hubFZhbCBmb3IgbGF0ZXIgdXNlLiAqLwpAQCAtNzQ3LDE1ICs3MzYsMTYgQEAKIAogCXJ0bDg3MjNhX0luaXRIYWxEbShBZGFwdGVyKTsKIAotCXZhbDggPSAoKFdpRmlOYXZVcHBlclVzICsgSEFMXzg3MjNBX05BVl9VUFBFUl9VTklUIC0gMSkgLwotCQlIQUxfODcyM0FfTkFWX1VQUEVSX1VOSVQpOworCXZhbDggPSAoV2lGaU5hdlVwcGVyVXMgKyBIQUxfODcyM0FfTkFWX1VQUEVSX1VOSVQgLSAxKSAvCisJCUhBTF84NzIzQV9OQVZfVVBQRVJfVU5JVDsKIAlydGw4NzIzYXVfd3JpdGU4KEFkYXB0ZXIsIFJFR19OQVZfVVBQRVIsIHZhbDgpOwogCiAJLyogIDIwMTEvMDMvMDkgTUggZGVidWcgb25seSwgVU1DLUIgY3V0IHBhc3MgMjUwMCBTNSB0ZXN0LCBidXQgd2UgbmVlZCB0byBmaW4gcm9vdCBjYXVzZS4gKi8KIAlpZiAoKChydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCkgJiAweEZGMDAwMDAwKSAhPQogCSAgICAgMHg4MzAwMDAwMCkpIHsKIAkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9SRk1PRCwgQklUKDI0KSwgMSk7Ci0JCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sICgiJXM6IElRSyBmYWlsIHJlY29ydmVyXG4iLCBfX2Z1bmNfXykpOworCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAorCQkJICIlczogSVFLIGZhaWwgcmVjb3ZlclxuIiwgX19mdW5jX18pOwogCX0KIAogCS8qIGFjayBmb3IgeG1pdCBtZ210IGZyYW1lcy4gKi8KQEAgLTgwNiwxOSArNzk2LDE4IEBACiAKIAkJLyogQUZFICovCiAJCWlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSAgUkZfMlQyUikKLQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIGJNYXNrRFdvcmQsCi0JCQkJICAgICAweDYzREIyNUEwKTsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJSeF9XYWl0X0NDQSwgMHg2M0RCMjVBMCk7CiAJCWVsc2UgaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8xVDFSKQotCQkJUEhZX1NldEJCUmVnKEFkYXB0ZXIsIHJSeF9XYWl0X0NDQSwgYk1hc2tEV29yZCwKLQkJCQkgICAgIDB4NjMxQjI1QTApOworCQkJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgclJ4X1dhaXRfQ0NBLCAweDYzMUIyNUEwKTsKIAogCQkvKiAgNC4gaXNzdWUgMy13aXJlIGNvbW1hbmQgdGhhdCBSRiBzZXQgdG8gUnggaWRsZQogCQkgICAgbW9kZS4gVGhpcyBpcyB1c2VkIHRvIHJlLXdyaXRlIHRoZSBSWCBpZGxlIG1vZGUuICovCiAJCS8qICBXZSBjYW4gb25seSBwcnZpZGUgYSB1c3VhbCB2YWx1ZSBpbnN0ZWFkIGFuZCB0aGVuCiAJCSAgICBIVyB3aWxsIG1vZGlmeSB0aGUgdmFsdWUgYnkgaXRzZWxmLiAqLwotCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9BLCAwLCBiUkZSZWdPZmZzZXRNYXNrLCAweDMyRDk1KTsKKwkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQSwgUkZfQUMsCisJCQkgICAgIGJSRlJlZ09mZnNldE1hc2ssIDB4MzJEOTUpOwogCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzJUMlIpIHsKLQkJCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0IsIDAsCisJCQlQSFlfU2V0UkZSZWcoQWRhcHRlciwgUkZfUEFUSF9CLCBSRl9BQywKIAkJCQkgICAgIGJSRlJlZ09mZnNldE1hc2ssIDB4MzJEOTUpOwogCQl9CiAJCWJyZWFrOwpAQCAtODI5LDcgKzgxOCw3IEBACiAJCWVsc2UKIAkJCXNwczAgJj0gfihCSVQoMCkgfCBCSVQoMykpOwogCi0JCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywgKCJTUyBMVkwxXG4iKSk7CisJCVJUX1RSQUNFKF9tb2R1bGVfaGFsX2luaXRfY18sIF9kcnZfZXJyXywgIlNTIExWTDFcbiIpOwogCQkvKiAgRGlzYWJsZSBSRiBhbmQgQkIgb25seSBmb3IgU2VsZWN0U3VzcGVuZC4gKi8KIAogCQkvKiAgMS4gU2V0IEJCL1JGIHRvIHNodXRkb3duLiAqLwpAQCAtODQwLDEzICs4MjksMTEgQEAKIAkJCQkJCWZvciBwYWNrZXQgZGV0ZWN0aW9uICovCiAJCS8qCSg0KSBSZWc4MDBbMV0gPSAxCWVuYWJsZSBwcmVhbWJsZSBwb3dlciBzYXZpbmcgKi8KIAkJQWRhcHRlci0+cHdyY3RybHByaXYuUFNfQkJSZWdCYWNrdXBbUFNCQlJFR19SRjBdID0KLQkJCVBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHJGUEdBMF9YQUJfUkZQYXJhbWV0ZXIsCi0JCQkJICAgICAgIGJNYXNrRFdvcmQpOworCQkJcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByRlBHQTBfWEFCX1JGUGFyYW1ldGVyKTsKIAkJQWRhcHRlci0+cHdyY3RybHByaXYuUFNfQkJSZWdCYWNrdXBbUFNCQlJFR19SRjFdID0KLQkJCVBIWV9RdWVyeUJCUmVnKEFkYXB0ZXIsIHJPRkRNMF9UUnhQYXRoRW5hYmxlLAotCQkJCSAgICAgICBiTWFza0RXb3JkKTsKKwkJCXJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgck9GRE0wX1RSeFBhdGhFbmFibGUpOwogCQlBZGFwdGVyLT5wd3JjdHJscHJpdi5QU19CQlJlZ0JhY2t1cFtQU0JCUkVHX1JGMl0gPQotCQkJUEhZX1F1ZXJ5QkJSZWcoQWRhcHRlciwgckZQR0EwX1JGTU9ELCBiTWFza0RXb3JkKTsKKwkJCXJ0bDg3MjNhdV9yZWFkMzIoQWRhcHRlciwgckZQR0EwX1JGTU9EKTsKIAkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKSB7CiAJCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgckZQR0EwX1hBQl9SRlBhcmFtZXRlciwKIAkJCQkgICAgIDB4MzgwMDM4LCAwKTsKQEAgLTg1OCwxOCArODQ1LDE2IEBACiAKIAkJLyogIDIgLkFGRSBjb250cm9sIHJlZ2lzdGVyIHRvIHBvd2VyIGRvd24uIGJpdFszMDoyMl0gKi8KIAkJQWRhcHRlci0+cHdyY3RybHByaXYuUFNfQkJSZWdCYWNrdXBbUFNCQlJFR19BRkUwXSA9Ci0JCQlQSFlfUXVlcnlCQlJlZyhBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIGJNYXNrRFdvcmQpOworCQkJcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCByUnhfV2FpdF9DQ0EpOwogCQlpZiAocEhhbERhdGEtPnJmX3R5cGUgPT0gIFJGXzJUMlIpCi0JCQlQSFlfU2V0QkJSZWcoQWRhcHRlciwgclJ4X1dhaXRfQ0NBLCBiTWFza0RXb3JkLAotCQkJCSAgICAgMHgwMERCMjVBMCk7CisJCQlydGw4NzIzYXVfd3JpdGUzMihBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIDB4MDBEQjI1QTApOwogCQllbHNlIGlmIChwSGFsRGF0YS0+cmZfdHlwZSA9PSAgUkZfMVQxUikKLQkJCVBIWV9TZXRCQlJlZyhBZGFwdGVyLCByUnhfV2FpdF9DQ0EsIGJNYXNrRFdvcmQsCi0JCQkJICAgICAweDAwMUIyNUEwKTsKKwkJCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIHJSeF9XYWl0X0NDQSwgMHgwMDFCMjVBMCk7CiAKIAkJLyogIDMuIGlzc3VlIDMtd2lyZSBjb21tYW5kIHRoYXQgUkYgc2V0IHRvIHBvd2VyIGRvd24uKi8KLQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQSwgMCwgYlJGUmVnT2Zmc2V0TWFzaywgMCk7CisJCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0EsIFJGX0FDLCBiUkZSZWdPZmZzZXRNYXNrLCAwKTsKIAkJaWYgKHBIYWxEYXRhLT5yZl90eXBlID09ICBSRl8yVDJSKQotCQkJUEhZX1NldFJGUmVnKEFkYXB0ZXIsIFJGX1BBVEhfQiwgMCwKKwkJCVBIWV9TZXRSRlJlZyhBZGFwdGVyLCBSRl9QQVRIX0IsIFJGX0FDLAogCQkJCSAgICAgYlJGUmVnT2Zmc2V0TWFzaywgMCk7CiAKIAkJLyogIDQuIEZvcmNlIFBGTSAsIGRpc2FibGUgU1BTMThfTERPX01hcmNvX0Jsb2NrICovCkBAIC05NDksMTQgKzkzNCwxNCBAQAogCiAJc3RhdHVzID0gX1NVQ0NFU1M7CiAKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywgKCI9PT0+IHVzYl9pbmlycF9pbml0XG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaGFsX2luaXRfY18sIF9kcnZfaW5mb18sICI9PT0+IHVzYl9pbmlycF9pbml0XG4iKTsKIAogCS8qIGlzc3VlIFJ4IGlycCB0byByZWNlaXZlIGRhdGEgKi8KIAlwcmVjdmJ1ZiA9IChzdHJ1Y3QgcmVjdl9idWYgKilwcmVjdnByaXYtPnByZWN2X2J1ZjsKIAlmb3IgKGkgPSAwOyBpIDwgTlJfUkVDVkJVRkY7IGkrKykgewogCQlpZiAocnRsODcyM2F1X3JlYWRfcG9ydChBZGFwdGVyLCAwLCBwcmVjdmJ1ZikgPT0gX0ZBSUwpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2hhbF9pbml0X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgidXNiX3J4X2luaXQ6IHVzYl9yZWFkX3BvcnQgZXJyb3JcbiIpKTsKKwkJCQkgInVzYl9yeF9pbml0OiB1c2JfcmVhZF9wb3J0IGVycm9yXG4iKTsKIAkJCXN0YXR1cyA9IF9GQUlMOwogCQkJZ290byBleGl0OwogCQl9CkBAIC05NjQsNyArOTQ5LDcgQEAKIAl9CiAJaWYgKHJ0bDg3MjNhdV9yZWFkX2ludGVycnVwdChBZGFwdGVyKSA9PSBfRkFJTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9lcnJfLAotCQkJICgiJXM6IHVzYl9yZWFkX2ludGVycnVwdCBlcnJvclxuIiwgX19mdW5jX18pKTsKKwkJCSAiJXM6IHVzYl9yZWFkX2ludGVycnVwdCBlcnJvclxuIiwgX19mdW5jX18pOwogCQlzdGF0dXMgPSBfRkFJTDsKIAl9CiAJcEhhbERhdGEtPkludHJNYXNrWzBdID0gcnRsODcyM2F1X3JlYWQzMihBZGFwdGVyLCBSRUdfVVNCX0hJTVIpOwpAQCAtOTczLDcgKzk1OCw3IEBACiAJcnRsODcyM2F1X3dyaXRlMzIoQWRhcHRlciwgUkVHX1VTQl9ISU1SLCBwSGFsRGF0YS0+SW50ck1hc2tbMF0pOwogZXhpdDoKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICgiPD09PSB1c2JfaW5pcnBfaW5pdFxuIikpOworCQkgIjw9PT0gdXNiX2luaXJwX2luaXRcbiIpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTk4Miw3ICs5NjcsNyBAQAogCXN0cnVjdCBoYWxfZGF0YV84NzIzYQkqcEhhbERhdGEgPSBHRVRfSEFMX0RBVEEoQWRhcHRlcik7CiAKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICgiXG4gPT09PiB1c2JfcnhfZGVpbml0XG4iKSk7CisJCSAiPT09PiB1c2JfcnhfZGVpbml0XG4iKTsKIAlydGw4NzIzYXVfcmVhZF9wb3J0X2NhbmNlbChBZGFwdGVyKTsKIAlwSGFsRGF0YS0+SW50ck1hc2tbMF0gPSBydGw4NzIzYXVfcmVhZDMyKEFkYXB0ZXIsIFJFR19VU0JfSElNUik7CiAJTVNHXzg3MjNBKCIlcyBwSGFsRGF0YS0+SW50ck1hc2sgPSAweCUwNHhcbiIsIF9fZnVuY19fLApAQCAtOTkwLDcgKzk3NSw3IEBACiAJcEhhbERhdGEtPkludHJNYXNrWzBdID0gMHgwOwogCXJ0bDg3MjNhdV93cml0ZTMyKEFkYXB0ZXIsIFJFR19VU0JfSElNUiwgcEhhbERhdGEtPkludHJNYXNrWzBdKTsKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9pbmZvXywKLQkJICgiXG4gPD09PSB1c2JfcnhfZGVpbml0XG4iKSk7CisJCSAiPD09PSB1c2JfcnhfZGVpbml0XG4iKTsKIAlyZXR1cm4gX1NVQ0NFU1M7CiB9CiAKQEAgLTEwMzcsMTEgKzEwMjIsMTAgQEAKIAl9CiAKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9oYWxfaW5pdF9jXywgX2Rydl9ub3RpY2VfLAotCQkgKCJIYWxfRWZ1c2VQYXJzZU1BQ0FkZHJfODcyM0FVOiBQZXJtYW5lbnQgQWRkcmVzcyA9JTAyeDolMDJ4OiIKLQkJICAiJTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJICBwRUVQUk9NLT5tYWNfYWRkclswXSwgcEVFUFJPTS0+bWFjX2FkZHJbMV0sCi0JCSAgcEVFUFJPTS0+bWFjX2FkZHJbMl0sIHBFRVBST00tPm1hY19hZGRyWzNdLAotCQkgIHBFRVBST00tPm1hY19hZGRyWzRdLCBwRUVQUk9NLT5tYWNfYWRkcls1XSkpOworCQkgIkhhbF9FZnVzZVBhcnNlTUFDQWRkcl84NzIzQVU6IFBlcm1hbmVudCBBZGRyZXNzID0lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKKwkJIHBFRVBST00tPm1hY19hZGRyWzBdLCBwRUVQUk9NLT5tYWNfYWRkclsxXSwKKwkJIHBFRVBST00tPm1hY19hZGRyWzJdLCBwRUVQUk9NLT5tYWNfYWRkclszXSwKKwkJIHBFRVBST00tPm1hY19hZGRyWzRdLCBwRUVQUk9NLT5tYWNfYWRkcls1XSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlYWRBZGFwdGVySW5mbyhzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQpAQCAtMTEwMiwxMyArMTA4Niw2IEBACiAJcmVhZEFkYXB0ZXJJbmZvKEFkYXB0ZXIpOwogfQogCi1zdGF0aWMgdm9pZCBfUmVhZFJGVHlwZShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKkFkYXB0ZXIpCi17Ci0Jc3RydWN0IGhhbF9kYXRhXzg3MjNhICpwSGFsRGF0YSA9IEdFVF9IQUxfREFUQShBZGFwdGVyKTsKLQotCXBIYWxEYXRhLT5yZl9jaGlwID0gUkZfNjA1MjsKLX0KLQogLyogICovCiAvKglEZXNjcmlwdGlvbjogKi8KIC8qCQlXZSBzaG91bGQgc2V0IEVmdXNlIGNlbGwgc2VsZWN0aW9uIHRvIFdpRmkgY2VsbCBpbiBkZWZhdWx0LiAqLwpAQCAtMTEzOCwxMiArMTExNSw4IEBACiAKIAloYWxfRWZ1c2VDZWxsU2VsKEFkYXB0ZXIpOwogCi0JX1JlYWRSRlR5cGUoQWRhcHRlcik7LyogcmZfY2hpcCAtPiBfSW5pdFJGVHlwZSgpICovCiAJX1JlYWRQUk9NQ29udGVudChBZGFwdGVyKTsKIAotCS8qIE1TR184NzIzQSgiJXMoKShkb25lKSwgcmZfY2hpcCA9IDB4JXgsIHJmX3R5cGUgPSAweCV4XG4iLAotCSAgIF9fZnVuY19fLCBwSGFsRGF0YS0+cmZfY2hpcCwgcEhhbERhdGEtPnJmX3R5cGUpOyAqLwotCiAJTVNHXzg3MjNBKCI8PT09PSBfUmVhZEFkYXB0ZXJJbmZvODcyM0FVIGluICVkIG1zXG4iLAogCQkgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIHN0YXJ0KSk7CiB9CkBAIC0xMTkyLDggKzExNjUsNiBAQAogCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJLyogUlRfVFJBQ0UoQ09NUF9JTklULCBEQkdfV0FSTklORywgKCJHZXRIYWxEZWZWYXI4MTkyQ1VzYigpOiAiCi0JCSAgICJVbmtvd24gdmFyaWFibGU6ICVkIVxuIiwgZVZhcmlhYmxlKSk7ICovCiAJCWJSZXN1bHQgPSBfRkFJTDsKIAkJYnJlYWs7CiAJfQpAQCAtMTIxMSw3ICsxMTgyLDcgQEAKIAlzdHJ1Y3QgbWxtZV9leHRfcHJpdiAqcG1sbWVleHQgPSAmcGFkYXB0ZXItPm1sbWVleHRwcml2OwogCXN0cnVjdCBtbG1lX2V4dF9pbmZvICpwbWxtZWluZm8gPSAmcG1sbWVleHQtPm1sbWV4dF9pbmZvOwogCXN0cnVjdCB3bGFuX2Jzc2lkX2V4ICpjdXJfbmV0d29yayA9ICZwbWxtZWluZm8tPm5ldHdvcms7Ci0JdTggaW5pdF9yYXRlLCBuZXR3b3JrVHlwZSwgcmFpZDsKKwl1OCBpbml0X3JhdGUsIG5ldHdvcmtUeXBlLCByYWlkLCBhcmc7CiAJdTMyIG1hc2ssIHJhdGVfYml0bWFwOwogCXU4IHNob3J0R0lyYXRlID0gZmFsc2U7CiAJaW50IHN1cHBvcnRSYXRlTnVtOwpAQCAtMTI4MywyNyArMTI1NCwxNSBAQAogCiAJaW5pdF9yYXRlID0gZ2V0X2hpZ2hlc3RfcmF0ZV9pZHgyM2EobWFzaykgJiAweDNmOwogCi0JaWYgKHBIYWxEYXRhLT5md19yYWN0cmwgPT0gdHJ1ZSkgewotCQl1OCBhcmcgPSAwOworCWFyZyA9IG1hY19pZCAmIDB4MWY7LyogTUFDSUQgKi8KKwlhcmcgfD0gQklUKDcpOwogCi0JCWFyZyA9IG1hY19pZCAmIDB4MWY7LyogTUFDSUQgKi8KKwlpZiAoc2hvcnRHSXJhdGUgPT0gdHJ1ZSkKKwkJYXJnIHw9IEJJVCg1KTsKIAotCQlhcmcgfD0gQklUKDcpOworCURCR184NzIzQSgidXBkYXRlIHJhaWQgZW50cnksIG1hc2sgPSAweCV4LCBhcmcgPSAweCV4XG4iLCBtYXNrLCBhcmcpOwogCi0JCWlmIChzaG9ydEdJcmF0ZSA9PSB0cnVlKQotCQkJYXJnIHw9IEJJVCg1KTsKLQotCQlEQkdfODcyM0EoInVwZGF0ZSByYWlkIGVudHJ5LCBtYXNrID0gMHgleCwgYXJnID0gMHgleFxuIiwKLQkJCSAgbWFzaywgYXJnKTsKLQotCQlydGw4NzIzYV9zZXRfcmFpZF9jbWQocGFkYXB0ZXIsIG1hc2ssIGFyZyk7Ci0JfSBlbHNlIHsKLQkJaWYgKHNob3J0R0lyYXRlID09IHRydWUpCi0JCQlpbml0X3JhdGUgfD0gQklUKDYpOwotCi0JCXJ0bDg3MjNhdV93cml0ZTgocGFkYXB0ZXIsIChSRUdfSU5JREFUQV9SQVRFX1NFTCArIG1hY19pZCksCi0JCQkJIGluaXRfcmF0ZSk7Ci0JfQorCXJ0bDg3MjNhX3NldF9yYWlkX2NtZChwYWRhcHRlciwgbWFzaywgYXJnKTsKIAogCS8qIHNldCByYV9pZCAqLwogCXBzdGEtPnJhaWQgPSByYWlkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvdXNiX29wc19saW51eC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9oYWwvdXNiX29wc19saW51eC5jCmluZGV4IGE2ZDE2YWQuLjM3MWU2YjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaGFsL3VzYl9vcHNfbGludXguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2hhbC91c2Jfb3BzX2xpbnV4LmMKQEAgLTI5NywxNCArMjk3LDEyIEBACiAJCWNhc2UgLUVOT0RFVjoKIAkJY2FzZSAtRVNIVVRET1dOOgogCQkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiU3VycHJpc2VSZW1vdmVkID0iCi0JCQkJICAidHJ1ZVxuIikpOworCQkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiU3VycHJpc2VSZW1vdmVkID10cnVlXG4iKTsKIAkJCS8qIEZhbGwgVGhyb3VnaCBoZXJlICovCiAJCWNhc2UgLUVOT0VOVDoKIAkJCXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9IHRydWU7CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlOmJEcml2ZXJTdG9wcGVkID0iCi0JCQkJICAidHJ1ZVxuIikpOworCQkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCA9dHJ1ZVxuIik7CiAJCQlicmVhazsKIAkJY2FzZSAtRVBST1RPOgogCQkJYnJlYWs7CkBAIC0zNjcsMTYgKzM2NSwxNiBAQAogCiAJZG8gewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfcmVjdl9jXywgX2Rydl9pbmZvXywKLQkJCSAoInJlY3ZidWYycmVjdmZyYW1lOiByeGRlc2MgPSBvZmZzc2V0IDA6MHglMDh4LCAiCi0JCQkgICI0OjB4JTA4eCwgODoweCUwOHgsIEM6MHglMDh4XG4iLCBwcnhzdGF0LT5yeGR3MCwKLQkJCSAgcHJ4c3RhdC0+cnhkdzEsIHByeHN0YXQtPnJ4ZHcyLCBwcnhzdGF0LT5yeGR3NCkpOworCQkJICJyZWN2YnVmMnJlY3ZmcmFtZTogcnhkZXNjID0gb2Zmc3NldCAwOjB4JTA4eCwgNDoweCUwOHgsIDg6MHglMDh4LCBDOjB4JTA4eFxuIiwKKwkJCSBwcnhzdGF0LT5yeGR3MCwgcHJ4c3RhdC0+cnhkdzEsCisJCQkgcHJ4c3RhdC0+cnhkdzIsIHByeHN0YXQtPnJ4ZHc0KTsKIAogCQlwcnhzdGF0ID0gKHN0cnVjdCByZWN2X3N0YXQgKilwYnVmOwogCiAJCXByZWN2ZnJhbWUgPSBydHdfYWxsb2NfcmVjdmZyYW1lMjNhKHBmcmVlX3JlY3ZfcXVldWUpOwogCQlpZiAoIXByZWN2ZnJhbWUpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2Vycl8sCi0JCQkJICgicmVjdmJ1ZjJyZWN2ZnJhbWU6IHByZWN2ZnJhbWUgPT0gTlVMTFxuIikpOworCQkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHByZWN2ZnJhbWUgPT0gTlVMTFxuIik7CiAJCQlEQkdfODcyM0EoIiVzKCktJWQ6IHJ0d19hbGxvY19yZWN2ZnJhbWUyM2EoKSBmYWlsZWQhIFJYICIKIAkJCQkgICJEcm9wIVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJCWdvdG8gX2V4aXRfcmVjdmJ1ZjJyZWN2ZnJhbWU7CkBAIC00MDAsNyArMzk4LDcgQEAKIAogCQlpZiAocGF0dHJpYi0+cGt0X2xlbiA8PSAwIHx8IHBrdF9vZmZzZXQgPiB0cmFuc2Zlcl9sZW4pIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9yZWN2X2NfLCBfZHJ2X2luZm9fLAotCQkJCSAoInJlY3ZidWYycmVjdmZyYW1lOiBwa3RfbGVuPD0gMFxuIikpOworCQkJCSAicmVjdmJ1ZjJyZWN2ZnJhbWU6IHBrdF9sZW48PSAwXG4iKTsKIAkJCURCR184NzIzQSgiJXMoKS0lZDogUlggV2FybmluZyFcbiIsCiAJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2ZnJhbWUpOwpAQCAtNDcxLDggKzQ2OSw3IEBACiAKIAkJaWYgKHJ0d19yZWN2X2VudHJ5MjNhKHByZWN2ZnJhbWUpICE9IF9TVUNDRVNTKQogCQkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X3JlY3ZfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJyZWN2YnVmMnJlY3ZmcmFtZTogcnR3X3JlY3ZfZW50cnkyM2EiCi0JCQkJICAiKHByZWN2ZnJhbWUpICE9IF9TVUNDRVNTXG4iKSk7CisJCQkJICJyZWN2YnVmMnJlY3ZmcmFtZTogcnR3X3JlY3ZfZW50cnkyM2EocHJlY3ZmcmFtZSkgIT0gX1NVQ0NFU1NcbiIpOwogCiAJCXBrdF9jbnQtLTsKIAkJdHJhbnNmZXJfbGVuIC09IHBrdF9vZmZzZXQ7CkBAIC01MjAsMTYgKzUxNywxNSBAQAogCXN0cnVjdCByZWN2X3ByaXYgKnByZWN2cHJpdiA9ICZwYWRhcHRlci0+cmVjdnByaXY7CiAKIAlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJICgidXNiX3JlYWRfcG9ydF9jb21wbGV0ZSEhIVxuIikpOworCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGUhISFcbiIpOwogCiAJcHJlY3Zwcml2LT5yeF9wZW5kaW5nX2NudC0tOwogCiAJaWYgKHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkIHx8IHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fAogCSAgICBwYWRhcHRlci0+YlJlYWRQb3J0Q2FuY2VsKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICgidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCglZCkgT1IgIgotCQkJICAiYlN1cnByaXNlUmVtb3ZlZCglZClcbiIsIHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCwKLQkJCSAgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpKTsKKwkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCglZCkgT1IgYlN1cnByaXNlUmVtb3ZlZCglZClcbiIsCisJCQkgcGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkLCBwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCk7CiAKIAkJREJHXzg3MjNBKCIlcygpLSVkOiBSWCBXYXJuaW5nISBiRHJpdmVyU3RvcHBlZCglZCkgT1IgIgogCQkJICAiYlN1cnByaXNlUmVtb3ZlZCglZCkgYlJlYWRQb3J0Q2FuY2VsKCVkKVxuIiwKQEAgLTU0Miw5ICs1MzgsNyBAQAogCQlpZiAocHVyYi0+YWN0dWFsX2xlbmd0aCA+IE1BWF9SRUNWQlVGX1NaIHx8CiAJCSAgICBwdXJiLT5hY3R1YWxfbGVuZ3RoIDwgUlhERVNDX1NJWkUpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAoInVzYl9yZWFkX3BvcnRfY29tcGxldGU6IChwdXJiLT5hY3R1YWxfIgotCQkJCSAgImxlbmd0aCA+IE1BWF9SRUNWQlVGX1NaKSB8fCAocHVyYi0+YWN0dWFsXyIKLQkJCQkgICJsZW5ndGggPCBSWERFU0NfU0laRSlcbiIpKTsKKwkJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6IChwdXJiLT5hY3R1YWxfbGVuZ3RoID4gTUFYX1JFQ1ZCVUZfU1opIHx8IChwdXJiLT5hY3R1YWxfbGVuZ3RoIDwgUlhERVNDX1NJWkUpXG4iKTsKIAkJCXJ0bDg3MjNhdV9yZWFkX3BvcnQocGFkYXB0ZXIsIDAsIHByZWN2YnVmKTsKIAkJCURCR184NzIzQSgiJXMoKS0lZDogUlggV2FybmluZyFcbiIsCiAJCQkJICBfX2Z1bmNfXywgX19MSU5FX18pOwpAQCAtNTY0LDggKzU1OCw4IEBACiAJCX0KIAl9IGVsc2UgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAoInVzYl9yZWFkX3BvcnRfY29tcGxldGUgOiBwdXJiLT5zdGF0dXMoJWQpICE9IDAgXG4iLAotCQkJICBwdXJiLT5zdGF0dXMpKTsKKwkJCSAidXNiX3JlYWRfcG9ydF9jb21wbGV0ZSA6IHB1cmItPnN0YXR1cyglZCkgIT0gMFxuIiwKKwkJCSBwdXJiLT5zdGF0dXMpOwogCQlza2JfcHV0KHByZWN2YnVmLT5wc2tiLCBwdXJiLT5hY3R1YWxfbGVuZ3RoKTsKIAkJcHJlY3ZidWYtPnBza2IgPSBOVUxMOwogCkBAIC01ODMsMTQgKzU3NywxMiBAQAogCQljYXNlIC1FTk9ERVY6CiAJCWNhc2UgLUVTSFVURE9XTjoKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAoInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YlN1cnByaXNlIgotCQkJCSAgIlJlbW92ZWQgPSB0cnVlXG4iKSk7CisJCQkJICJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlOmJTdXJwcmlzZVJlbW92ZWQgPSB0cnVlXG4iKTsKIAkJCS8qIEludGVudGlvbmFsIGZhbGwgdGhyb3VnaCBoZXJlICovCiAJCWNhc2UgLUVOT0VOVDoKIAkJCXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9IHRydWU7CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJ1c2JfcmVhZF9wb3J0X2NvbXBsZXRlOiIKLQkJCQkgICJiRHJpdmVyU3RvcHBlZCA9IHRydWVcbiIpKTsKKwkJCQkgInVzYl9yZWFkX3BvcnRfY29tcGxldGU6YkRyaXZlclN0b3BwZWQgPSB0cnVlXG4iKTsKIAkJCWJyZWFrOwogCQljYXNlIC1FUFJPVE86CiAJCWNhc2UgLUVPVkVSRkxPVzoKQEAgLTYyMCwxNCArNjEyLDEzIEBACiAKIAlpZiAoYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAoInVzYl9yZWFkX3BvcnQ6KHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCIKLQkJCSAgInBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSEhIVxuIikpOworCQkJICJ1c2JfcmVhZF9wb3J0OihwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHxwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkhISFcbiIpOwogCQlyZXR1cm4gX0ZBSUw7CiAJfQogCiAJaWYgKCFwcmVjdmJ1ZikgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAoInVzYl9yZWFkX3BvcnQ6cHJlY3ZidWYgPT0gTlVMTFxuIikpOworCQkJICJ1c2JfcmVhZF9wb3J0OnByZWN2YnVmID09IE5VTExcbiIpOwogCQlyZXR1cm4gX0ZBSUw7CiAJfQogCkBAIC02MzgsNyArNjI5LDggQEAKIAlpZiAoIXByZWN2YnVmLT5wc2tiKSB7CiAJCXByZWN2YnVmLT5wc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihhZGFwdGVyLT5wbmV0ZGV2LCBNQVhfUkVDVkJVRl9TWiArIFJFQ1ZCVUZGX0FMSUdOX1NaKTsKIAkJaWYgKHByZWN2YnVmLT5wc2tiID09IE5VTEwpIHsKLQkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLCAoImluaXRfcmVjdmJ1ZigpOiBhbGxvY19za2IgZmFpbCFcbiIpKTsKKwkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAorCQkJCSAiaW5pdF9yZWN2YnVmKCk6IGFsbG9jX3NrYiBmYWlsIVxuIik7CiAJCQlyZXR1cm4gX0ZBSUw7CiAJCX0KIApAQCAtNjYxLDggKzY1Myw4IEBACiAJZXJyID0gdXNiX3N1Ym1pdF91cmIocHVyYiwgR0ZQX0FUT01JQyk7CiAJaWYgKChlcnIpICYmIChlcnIgIT0gLUVQRVJNKSkgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAoImNhbm5vdCBzdWJtaXQgcnggaW4tdG9rZW4oZXJyID0gMHglLjh4KSwgVVJCX1NUQVRVUyAiCi0JCQkgICI9IDB4JS44eCIsIGVyciwgcHVyYi0+c3RhdHVzKSk7CisJCQkgImNhbm5vdCBzdWJtaXQgcnggaW4tdG9rZW4oZXJyID0gMHglLjh4KSwgVVJCX1NUQVRVUyA9IDB4JS44eFxuIiwKKwkJCSBlcnIsIHB1cmItPnN0YXR1cyk7CiAJCURCR184NzIzQSgiY2Fubm90IHN1Ym1pdCByeCBpbi10b2tlbihlcnIgPSAweCUwOHgpLCB1cmJfc3RhdHVzICIKIAkJCSAgIj0gJWRcbiIsIGVyciwgcHVyYi0+c3RhdHVzKTsKIAkJcmV0ID0gX0ZBSUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsODcyM0FQaHlDZmcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzQVBoeUNmZy5oCmluZGV4IDIyNDdkOTguLmJjZjM2NTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzQVBoeUNmZy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWw4NzIzQVBoeUNmZy5oCkBAIC0xNiw5ICsxNiw2IEBACiAjaWZuZGVmIF9fSU5DX0hBTDg3MjNQSFlDRkdfSF9fCiAjZGVmaW5lIF9fSU5DX0hBTDg3MjNQSFlDRkdfSF9fCiAKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1EZWZpbmUgUGFyYW1ldGVycy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBNQVhfQUdHUl9OVU0JMHgwOTA5Ci0KIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tRGVmaW5lIHN0cnVjdHVyZS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogZW51bSBSRl9SQURJT19QQVRIIHsKIAlSRl9QQVRIX0EgPSAwLAkJCS8qIFJhZGlvIFBhdGggQSAqLwpAQCAtMzksMTUgKzM2LDYgQEAKIAlXSVJFTEVTU19NT0RFX0FDCT0gQklUKDYpCiB9OwogCi0vKiBCQi9SRiByZWxhdGVkICovCi1lbnVtIHJmX3R5cGVfODE5MHAgewotCVJGX1RZUEVfTUlOLAkJLyogIDAgKi8KLQlSRl84MjI1ID0gMSwJCS8qICAxIDExYi9nIFJGIGZvciB2ZXJpZmljYXRpb24gb25seSAqLwotCVJGXzgyNTYgPSAyLAkJLyogIDIgMTFiL2cvbiAqLwotCVJGXzgyNTggPSAzLAkJLyogIDMgMTFhL2IvZy9uIFJGICovCi0JUkZfNjA1MiA9IDQsCQkvKiAgNCAxMWIvZy9uIFJGICovCi19OwotCiBzdHJ1Y3QgYmJfcmVnX2RlZmluZSB7CiAJdTMyIHJmaW50ZnM7CQkvKiAgc2V0IHNvZnR3YXJlIGNvbnRyb2w6ICovCiAJCQkJLyoJCTB4ODcwfjB4ODc3WzggYnl0ZXNdICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsVmVyRGVmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvSGFsVmVyRGVmLmgKaW5kZXggNjA3YjcxZi4uMmEwZTRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL0hhbFZlckRlZi5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9IYWxWZXJEZWYuaApAQCAtNTEsMzAgKzUxLDE3IEBACiAJQ0hJUF9WRU5ET1JfVU1DCQk9CTEsCiB9OwogCi1lbnVtIGhhbF9yZl90eXBlIHsKLQlSRl9UWVBFXzFUMVIJPQkwLAotCVJGX1RZUEVfMVQyUgk9CTEsCi0JUkZfVFlQRV8yVDJSCT0JMiwKLQlSRl9UWVBFXzJUM1IJPQkzLAotCVJGX1RZUEVfMlQ0Ugk9CTQsCi0JUkZfVFlQRV8zVDNSCT0JNSwKLQlSRl9UWVBFXzNUNFIJPQk2LAotCVJGX1RZUEVfNFQ0Ugk9CTcsCi19OwotCiBzdHJ1Y3QgaGFsX3ZlcnNpb24gewogCWVudW0gaGFsX2ljX3R5cGUJSUNUeXBlOwogCWVudW0gaGFsX2NoaXBfdHlwZQlDaGlwVHlwZTsKIAllbnVtIGhhbF9jdXRfdmVyc2lvbglDVVRWZXJzaW9uOwogCWVudW0gaGFsX3ZlbmRvcgkJVmVuZG9yVHlwZTsKLQllbnVtIGhhbF9yZl90eXBlCVJGVHlwZTsKIAl1OAkJCVJPTVZlcjsKIH07CiAKIC8qICBHZXQgZWxlbWVudCAqLwogI2RlZmluZSBHRVRfQ1ZJRF9JQ19UWVBFKHZlcnNpb24pCSgodmVyc2lvbikuSUNUeXBlKQogI2RlZmluZSBHRVRfQ1ZJRF9DSElQX1RZUEUodmVyc2lvbikJKCh2ZXJzaW9uKS5DaGlwVHlwZSkKLSNkZWZpbmUgR0VUX0NWSURfUkZfVFlQRSh2ZXJzaW9uKQkoKHZlcnNpb24pLlJGVHlwZSkKICNkZWZpbmUgR0VUX0NWSURfTUFOVUZBQ1RVRVIodmVyc2lvbikJKCh2ZXJzaW9uKS5WZW5kb3JUeXBlKQogI2RlZmluZSBHRVRfQ1ZJRF9DVVRfVkVSU0lPTih2ZXJzaW9uKQkoKHZlcnNpb24pLkNVVFZlcnNpb24pCiAjZGVmaW5lIEdFVF9DVklEX1JPTV9WRVJTSU9OKHZlcnNpb24pCSgoKHZlcnNpb24pLlJPTVZlcikgJiBST01fVkVSU0lPTl9NQVNLKQpAQCAtMTA4LDE3ICs5NSw4IEBACiAjZGVmaW5lIElTX0NISVBfVkVORE9SX1VNQyh2ZXJzaW9uKQkJXAogCSgoR0VUX0NWSURfTUFOVUZBQ1RVRVIodmVyc2lvbikgPT0gQ0hJUF9WRU5ET1JfVU1DKSA/IHRydWUgOiBmYWxzZSkKIAotI2RlZmluZSBJU18xVDFSKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfUkZfVFlQRSh2ZXJzaW9uKSA9PSBSRl9UWVBFXzFUMVIpID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZSBJU18xVDJSKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfUkZfVFlQRSh2ZXJzaW9uKSA9PSBSRl9UWVBFXzFUMlIpID8gdHJ1ZSA6IGZhbHNlKQotI2RlZmluZSBJU18yVDJSKHZlcnNpb24pCQkJXAotCSgoR0VUX0NWSURfUkZfVFlQRSh2ZXJzaW9uKSA9PSBSRl9UWVBFXzJUMlIpID8gdHJ1ZSA6IGZhbHNlKQotCiAvKiBDaGlwIHZlcnNpb24gTWFjcm8uIC0tICovCiAKLSNkZWZpbmUgSVNfOTJDX1NFUklBTCh2ZXJzaW9uKQkJCQkJXAotCSgoSVNfODFYWEModmVyc2lvbikgJiYgSVNfMlQyUih2ZXJzaW9uKSkgPyB0cnVlIDogZmFsc2UpCiAjZGVmaW5lIElTXzgxeHhDX1ZFTkRPUl9VTUNfQV9DVVQodmVyc2lvbikJCQlcCiAJKElTXzgxWFhDKHZlcnNpb24pPyhJU19DSElQX1ZFTkRPUl9VTUModmVyc2lvbikgPwlcCiAJKElTX0FfQ1VUKHZlcnNpb24pID8gdHJ1ZSA6IGZhbHNlKSA6IGZhbHNlKSA6IGZhbHNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9jb20uaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9oYWxfY29tLmgKaW5kZXggN2MzMTg2NS4uOWM1MDMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9jb20uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaGFsX2NvbS5oCkBAIC02NSwzNiArNjUsNiBAQAogI2RlZmluZSBSQVRFXzM2TQkJCQlCSVQoOSkKICNkZWZpbmUgUkFURV80OE0JCQkJQklUKDEwKQogI2RlZmluZSBSQVRFXzU0TQkJCQlCSVQoMTEpCi0vKiBNQ1MgMSBTcGF0aWFsIFN0cmVhbSAqLwotI2RlZmluZSBSQVRFX01DUzAJCQkJQklUKDEyKQotI2RlZmluZSBSQVRFX01DUzEJCQkJQklUKDEzKQotI2RlZmluZSBSQVRFX01DUzIJCQkJQklUKDE0KQotI2RlZmluZSBSQVRFX01DUzMJCQkJQklUKDE1KQotI2RlZmluZSBSQVRFX01DUzQJCQkJQklUKDE2KQotI2RlZmluZSBSQVRFX01DUzUJCQkJQklUKDE3KQotI2RlZmluZSBSQVRFX01DUzYJCQkJQklUKDE4KQotI2RlZmluZSBSQVRFX01DUzcJCQkJQklUKDE5KQotLyogTUNTIDIgU3BhdGlhbCBTdHJlYW0gKi8KLSNkZWZpbmUgUkFURV9NQ1M4CQkJCUJJVCgyMCkKLSNkZWZpbmUgUkFURV9NQ1M5CQkJCUJJVCgyMSkKLSNkZWZpbmUgUkFURV9NQ1MxMAkJCQlCSVQoMjIpCi0jZGVmaW5lIFJBVEVfTUNTMTEJCQkJQklUKDIzKQotI2RlZmluZSBSQVRFX01DUzEyCQkJCUJJVCgyNCkKLSNkZWZpbmUgUkFURV9NQ1MxMwkJCQlCSVQoMjUpCi0jZGVmaW5lIFJBVEVfTUNTMTQJCQkJQklUKDI2KQotI2RlZmluZSBSQVRFX01DUzE1CQkJCUJJVCgyNykKLQotLyogIEFMTCBDQ0sgUmF0ZSAqLwotI2RlZmluZQlSQVRFX0FMTF9DQ0sJKFJBVFJfMU0gfCBSQVRSXzJNIHwgUkFUUl81NU0gfCBSQVRSXzExTSkKLSNkZWZpbmUJUkFURV9BTExfT0ZETV9BRwkJCQlcCi0JKFJBVFJfNk0gfCBSQVRSXzlNIHwgUkFUUl8xMk0gfCBSQVRSXzE4TSB8IFJBVFJfMjRNfCBcCi0JIFJBVFJfMzZNfFJBVFJfNDhNfFJBVFJfNTRNKQotI2RlZmluZQlSQVRFX0FMTF9PRkRNXzFTUwkJCQlcCi0JKFJBVFJfTUNTMCB8IFJBVFJfTUNTMSB8IFJBVFJfTUNTMiB8IFJBVFJfTUNTMyB8CVwKLQkgUkFUUl9NQ1M0IHwgUkFUUl9NQ1M1IHwgUkFUUl9NQ1M2IHwgUkFUUl9NQ1M3KQotI2RlZmluZQlSQVRFX0FMTF9PRkRNXzJTUwkJCQlcCi0JKFJBVFJfTUNTOCB8IFJBVFJfTUNTOSB8IFJBVFJfTUNTMTAgfCBSQVRSX01DUzExfAlcCi0JIFJBVFJfTUNTMTIgfCBSQVRSX01DUzEzIHwgUkFUUl9NQ1MxNCB8IFJBVFJfTUNTMTUpCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFR4IERlc2MgZGVmaW5pdGlvbiBNYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyogcHJhZ21hIG1hcmsgLS0gVHggRGVzYyByZWxhdGVkIGRlZmluaXRpb24uIC0tICovCkBAIC0xNDYsNyArMTE2LDYgQEAKICNkZWZpbmUgUkVHX05PQV9ERVNDX0NPVU5UCQkJMHgwNUVDCiAKICNpbmNsdWRlICJIYWxWZXJEZWYuaCIKLXZvaWQgZHVtcF9jaGlwX2luZm8yM2Eoc3RydWN0IGhhbF92ZXJzaW9uCUNoaXBWZXJzaW9uKTsKIAogCiB1OAkvKiByZXR1cm4gdGhlIGZpbmFsIGNoYW5uZWwgcGxhbiBkZWNpc2lvbiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2hhbF9pbnRmLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaGFsX2ludGYuaAppbmRleCA0MDRhY2I1Li5iOTI0ZDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaGFsX2ludGYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaGFsX2ludGYuaApAQCAtMTgsMTMgKzE4LDYgQEAKICNpbmNsdWRlIDxvc2RlcF9zZXJ2aWNlLmg+CiAjaW5jbHVkZSA8ZHJ2X3R5cGVzLmg+CiAKLWVudW0gUlRMODcxWF9IQ0lfVFlQRSB7Ci0JUlRXX1BDSUUJPSBCSVQoMCksCi0JUlRXX1VTQgkJPSBCSVQoMSksCi0JUlRXX1NESU8JPSBCSVQoMiksCi0JUlRXX0dTUEkJPSBCSVQoMyksCi19OwotCiBlbnVtIF9DSElQX1RZUEUgewogCU5VTExfQ0hJUF9UWVBFLAogCVJUTDg3MTJfODE4OFNfODE5MVNfODE5MlMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaWVlZTgwMjExLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvaWVlZTgwMjExLmgKaW5kZXggY2IyM2NkMC4uM2FhNDBhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL2llZWU4MDIxMS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9pZWVlODAyMTEuaApAQCAtMTcxLDIwICsxNzEsNiBAQAogI2RlZmluZSBXTEFOX1JFQVNPTl9KT0lOX1dST05HX0NIQU5ORUwgICAgICAgNjU1MzQKICNkZWZpbmUgV0xBTl9SRUFTT05fRVhQSVJBVElPTl9DSEsgNjU1MzUKIAotCi0jZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19TSUdOQUwgKDE8PDApCi0jZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SU1NJICgxPDwxKQotI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfTk9JU0UgKDE8PDIpCi0jZGVmaW5lIElFRUU4MDIxMV9TVEFUTUFTS19SQVRFICgxPDwzKQotI2RlZmluZSBJRUVFODAyMTFfU1RBVE1BU0tfV0VNQVNLIDB4NwotCi0KLSNkZWZpbmUgSUVFRTgwMjExX0NDS19NT0RVTEFUSU9OICAgICgxPDwwKQotI2RlZmluZSBJRUVFODAyMTFfT0ZETV9NT0RVTEFUSU9OICAgKDE8PDEpCi0KLSNkZWZpbmUgSUVFRTgwMjExXzI0R0haX0JBTkQgICAgICgxPDwwKQotI2RlZmluZSBJRUVFODAyMTFfNTJHSFpfQkFORCAgICAgKDE8PDEpCi0KICNkZWZpbmUgSUVFRTgwMjExX0NDS19SQVRFX0xFTgkJCTQKICNkZWZpbmUgSUVFRTgwMjExX05VTV9PRkRNX1JBVEVTTEVOCTgKIApAQCAtMjY1LDkgKzI1MSw2IEBACiA+IDA6IFRJRAogKi8KIAotI2RlZmluZSBNQUNfRk1UICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIKLSNkZWZpbmUgTUFDX0FSRyh4KSAoKHU4KikoeCkpWzBdLCgodTgqKSh4KSlbMV0sKCh1OCopKHgpKVsyXSwoKHU4KikoeCkpWzNdLCgodTgqKSh4KSlbNF0sKCh1OCopKHgpKVs1XQotCiAjZGVmaW5lIE1BWFRJRAkxNgogCiAjZGVmaW5lIFdNRV9PVUlfVFlQRSAyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtLmgKaW5kZXggNWEwNTYxZS4uMjRmMmYyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG0uaApAQCAtMTU4LDI3ICsxNTgsNiBAQAogCXUzMglDbnRfQldfTFNDOwkvKiBHYXJ5ICovCiB9OwogCi1zdHJ1Y3QgcHJpX2NjYSB7Ci0JdTgJCVByaUNDQV9mbGFnOwotCXU4CQlpbnRmX2ZsYWc7Ci0JdTgJCWludGZfdHlwZTsKLQl1OAkJRHVwUlRTX2ZsYWc7Ci0JdTgJCU1vbml0b3JfZmxhZzsKLX07Ci0KLXN0cnVjdCByeF9ocCB7Ci0JdTgJCVJYSFBfZmxhZzsKLQl1OAkJUFNEX2Z1bmNfdHJpZ2dlcjsKLQl1OAkJUFNEX2JpdG1hcF9SWEhQWzgwXTsKLQl1OAkJUHJlX0lHSTsKLQl1OAkJQ3VyX0lHSTsKLQl1OAkJUHJlX3B3X3RoOwotCXU4CQlDdXJfcHdfdGg7Ci0JYm9vbAkJRmlyc3RfdGltZV9lbnRlcjsKLQlib29sCQlSWEhQX2VuYWJsZTsKLQl1OAkJVFBfTW9kZTsKLX07Ci0KICNkZWZpbmUgQVNTT0NJQVRFX0VOVFJZX05VTQkJCQkJMzIgLyogIE1heCBzaXplIG9mIEFzb2NFbnRyeVtdLiAqLwogI2RlZmluZQlPRE1fQVNTT0NJQVRFX0VOVFJZX05VTQkJCQlBU1NPQ0lBVEVfRU5UUllfTlVNCiAKQEAgLTIyNyw3ICsyMDYsNiBAQAogCiBzdHJ1Y3QgZWRjYV90dXJibyB7CiAJYm9vbCBiQ3VycmVudFR1cmJvRURDQTsKLQlib29sIGJJc0N1clJETFN0YXRlOwogCXUzMglwcnZfdHJhZmZpY19pZHg7IC8qICBlZGNhIHR1cmJvICovCiB9OwogCkBAIC0yOTgsMTggKzI3NiwxNCBAQAogCS8qICBGaXhlZCB2YWx1ZTogKi8KIAkvKiAgKi8KIAotCU9ETV9DTU5JTkZPX1BMQVRGT1JNID0gMCwKLQlPRE1fQ01OSU5GT19JTlRFUkZBQ0UsCQkJCS8qICBlbnVtIG9kbV9pbnRlcmZhY2VfZGVmICovCi0JT0RNX0NNTklORk9fTVBfVEVTVF9DSElQLAotCU9ETV9DTU5JTkZPX0lDX1RZUEUsCQkJCQkvKiAgZW51bSBvZG1faWNfdHlwZV9kZWYgKi8KLQlPRE1fQ01OSU5GT19DVVRfVkVSLAkJCQkJLyogIGVudW0gb2RtX2N1dF92ZXJzaW9uICovCi0JT0RNX0NNTklORk9fRkFCX1ZFUiwJCQkJCS8qICBlbnVtIG9kbV9mYWJfdmVyc2lvbiAqLwotCU9ETV9DTU5JTkZPX1JGX1RZUEUsCQkJCQkvKiAgZW51bSByZl9wYXRoX2RlZiBvciBlbnVtIG9kbV9yZl90eXBlPyAqLwotCU9ETV9DTU5JTkZPX0JPQVJEX1RZUEUsCQkJCS8qICBlbnVtIG9kbV9ib2FyZF90eXBlICovCi0JT0RNX0NNTklORk9fRVhUX0xOQSwJCQkJCS8qICB0cnVlICovCisJT0RNX0NNTklORk9fTVBfVEVTVF9DSElQID0gMiwKKwlPRE1fQ01OSU5GT19JQ19UWVBFLAkJCS8qICBlbnVtIG9kbV9pY190eXBlX2RlZiAqLworCU9ETV9DTU5JTkZPX0NVVF9WRVIsCQkJLyogIGVudW0gb2RtX2N1dF92ZXJzaW9uICovCisJT0RNX0NNTklORk9fRkFCX1ZFUiwJCQkvKiAgZW51bSBvZG1fZmFiX3ZlcnNpb24gKi8KKwlPRE1fQ01OSU5GT19CT0FSRF9UWVBFLAkJCS8qICBlbnVtIG9kbV9ib2FyZF90eXBlICovCisJT0RNX0NNTklORk9fRVhUX0xOQSwJCQkvKiAgdHJ1ZSAqLwogCU9ETV9DTU5JTkZPX0VYVF9QQSwKIAlPRE1fQ01OSU5GT19FWFRfVFJTVywKLQlPRE1fQ01OSU5GT19QQVRDSF9JRCwJCQkJLyogQ1VTVE9NRVIgSUQgKi8KIAlPRE1fQ01OSU5GT19CSU5IQ1RfVEVTVCwKIAlPRE1fQ01OSU5GT19CV0lGSV9URVNULAogCU9ETV9DTU5JTkZPX1NNQVJUX0NPTkNVUlJFTlQsCkBAIC0zNDgsMjkgKzMyMiw3IEBACiAvKiAgRGVmaW5lIE9ETSBzdXBwb3J0IGFiaWxpdHkuICBPRE1fQ01OSU5GT19BQklMSVRZICovCiBlbnVtIHsKIAkvKiAgQkIgT0RNIHNlY3Rpb24gQklUIDAtMTUgKi8KLQlPRE1fQkJfRElHCQkJCT0gQklUKDApLAotCU9ETV9CQl9SQV9NQVNLCQkJCT0gQklUKDEpLAotCU9ETV9CQl9EWU5BTUlDX1RYUFdSCQkJPSBCSVQoMiksCi0JT0RNX0JCX0ZBX0NOVAkJCQk9IEJJVCgzKSwKLQlPRE1fQkJfUlNTSV9NT05JVE9SCQkJPSBCSVQoNCksCi0JT0RNX0JCX0NDS19QRAkJCQk9IEJJVCg1KSwKIAlPRE1fQkJfQU5UX0RJVgkJCQk9IEJJVCg2KSwKLQlPRE1fQkJfUFdSX1NBVkUJCQkJPSBCSVQoNyksCi0JT0RNX0JCX1BXUl9UUkFJTgkJCT0gQklUKDgpLAotCU9ETV9CQl9SQVRFX0FEQVBUSVZFCQkJPSBCSVQoOSksCi0JT0RNX0JCX1BBVEhfRElWCQkJCT0gQklUKDEwKSwKLQlPRE1fQkJfUFNECQkJCT0gQklUKDExKSwKLQlPRE1fQkJfUlhIUAkJCQk9IEJJVCgxMiksCi0KLQkvKiAgTUFDIERNIHNlY3Rpb24gQklUIDE2LTIzICovCi0JT0RNX01BQ19FRENBX1RVUkJPCQkJPSBCSVQoMTYpLAotCU9ETV9NQUNfRUFSTFlfTU9ERQkJCT0gQklUKDE3KSwKLQotCS8qICBSRiBPRE0gc2VjdGlvbiBCSVQgMjQtMzEgKi8KLQlPRE1fUkZfVFhfUFdSX1RSQUNLCQkJPSBCSVQoMjQpLAotCU9ETV9SRl9SWF9HQUlOX1RSQUNLCQkJPSBCSVQoMjUpLAotCU9ETV9SRl9DQUxJQlJBVElPTgkJCT0gQklUKDI2KSwKLQogfTsKIAogLyoJT0RNX0NNTklORk9fSU5URVJGQUNFICovCkBAIC00MDksNyArMzYxLDYgQEAKIAlPRE1fVU1DCQk9CTEsCiB9OwogCi0vKiAgT0RNX0NNTklORk9fUkZfVFlQRSAqLwogLyogIEZvciBleGFtcGxlIDFUMlIgKEErQUIgPSBCSVQwfEJJVDR8QklUNSkgKi8KIGVudW0gcmZfcGF0aF9kZWYgewogCU9ETV9SRl9UWF9BCT0JQklUKDApLApAQCAtNDIyLDE4ICszNzMsNiBAQAogCU9ETV9SRl9SWF9ECT0JQklUKDcpLAogfTsKIAotCi1lbnVtIG9kbV9yZl90eXBlIHsKLQlPRE1fMVQxUgk9CTAsCi0JT0RNXzFUMlIJPQkxLAotCU9ETV8yVDJSCT0JMiwKLQlPRE1fMlQzUgk9CTMsCi0JT0RNXzJUNFIJPQk0LAotCU9ETV8zVDNSCT0JNSwKLQlPRE1fM1Q0Ugk9CTYsCi0JT0RNXzRUNFIJPQk3LAotfTsKLQogLyogIE9ETSBEeW5hbWljIGNvbW1vbiBpbmZvIHZhbHVlIGRlZmluaXRpb24gKi8KIAogZW51bSBvZG1fbWFjX3BoeV9tb2RlIHsKQEAgLTU4NywzMyArNTI2LDYgQEAKIAl1OAliRFBQYXRoQk9LOwogfTsKIAotLyogIE9ETSBEeW5hbWljIGNvbW1vbiBpbmZvIHZhbHVlIGRlZmluaXRpb24gKi8KLXN0cnVjdCBvZG1fZmF0X3QgewotCXU4CUJzc2lkWzZdOwotCXU4CWFudHNlbF9yeF9rZWVwXzA7Ci0JdTgJYW50c2VsX3J4X2tlZXBfMTsKLQl1OAlhbnRzZWxfcnhfa2VlcF8yOwotCXUzMglhbnRTdW1SU1NJWzddOwotCXUzMglhbnRSU1NJY250WzddOwotCXUzMglhbnRBdmVSU1NJWzddOwotCXU4CUZBVF9TdGF0ZTsKLQl1MzIJVHJhaW5JZHg7Ci0JdTgJYW50c2VsX2FbT0RNX0FTU09DSUFURV9FTlRSWV9OVU1dOwotCXU4CWFudHNlbF9iW09ETV9BU1NPQ0lBVEVfRU5UUllfTlVNXTsKLQl1OAlhbnRzZWxfY1tPRE1fQVNTT0NJQVRFX0VOVFJZX05VTV07Ci0JdTMyCU1haW5BbnRfU3VtW09ETV9BU1NPQ0lBVEVfRU5UUllfTlVNXTsKLQl1MzIJQXV4QW50X1N1bVtPRE1fQVNTT0NJQVRFX0VOVFJZX05VTV07Ci0JdTMyCU1haW5BbnRfQ250W09ETV9BU1NPQ0lBVEVfRU5UUllfTlVNXTsKLQl1MzIJQXV4QW50X0NudFtPRE1fQVNTT0NJQVRFX0VOVFJZX05VTV07Ci0JdTgJUnhJZGxlQW50OwotCWJvb2wJYkJlY29tZUxpbmtlZDsKLX07Ci0KLWVudW0gZmF0X3N0YXRlIHsKLQlGQVRfTk9STUFMX1NUQVRFCQk9IDAsCi0JRkFUX1RSQUlOSU5HX1NUQVRFCQk9IDEsCi19OwotCiBlbnVtIGFudF9kaWZfdHlwZSB7CiAJTk9fQU5URElWCQkJPSAweEZGLAogCUNHX1RSWF9IV19BTlRESVYJCT0gMHgwMSwKQEAgLTYzNiw3ICs1NDgsNiBAQAogLyogIE9ETSBIQU5ETEUsIERSSVZFUiBORUVEUyBOT1QgVE8gSE9PSy0tLS0tLSAqLwogCWJvb2wJCQliQ2NrSGlnaFBvd2VyOwogCXU4CQkJUkZQYXRoUnhFbmFibGU7CQkvKiAgT0RNX0NNTklORk9fUkZQQVRIX0VOQUJMRSAqLwotCXU4CQkJQ29udHJvbENoYW5uZWw7CiAvKiAgT0RNIEhBTkRMRSwgRFJJVkVSIE5FRURTIE5PVCBUTyBIT09LLS0tLS0tICovCiAKIC8qIDEgIENPTU1PTiBJTkZPUk1BVElPTiAqLwpAQCAtNjQ1LDE2ICs1NTYsMTIgQEAKIC8qIEhPT0sgQkVGT1JFIFJFRyBJTklULS0tLS0tLS0tLS0gKi8KIAkvKiAgT0RNIFN1cHBvcnQgQWJpbGl0eSBESUcvUkFUUi9UWF9QV1JfVFJBQ0svIKFLoUsgPSAxLzIvMy+hSyAqLwogCXUzMgkJCVN1cHBvcnRBYmlsaXR5OwotCS8qICBPRE0gUENJRS9VU0IvU0RJTy9HU1BJID0gMC8xLzIvMyAqLwotCXU4CQkJU3VwcG9ydEludGVyZmFjZTsKIAkvKiAgT0RNIGNvbXBvc2l0ZSBvciBpbmRlcGVuZGVudC4gQml0IG9yaWVudGVkLyA5MkMrOTJEKyAuLi4uIG9yIGFueSBvdGhlciB0eXBlID0gMS8yLzMvLi4uICovCiAJdTMyCQkJU3VwcG9ydElDVHlwZTsKIAkvKiAgQ3V0IFZlcnNpb24gVGVzdENoaXAvQS1jdXQvQi1jdXQuLi4gPSAwLzEvMi8zLy4uLiAqLwogCXU4CQkJQ3V0VmVyc2lvbjsKIAkvKiAgRmFiIFZlcnNpb24gVFNNQy9VTUMgPSAwLzEgKi8KIAl1OAkJCUZhYlZlcnNpb247Ci0JLyogIFJGIFR5cGUgNFQ0Ui8zVDNSLzJUMlIvMVQyUi8xVDFSLy4uLiAqLwotCXU4CQkJUkZUeXBlOwogCS8qICBCb2FyZCBUeXBlIE5vcm1hbC9IaWdoUG93ZXIvTWluaUNhcmQvU0xJTS9Db21iby8uLi4gPSAwLzEvMi8zLzQvLi4uICovCiAJdTgJCQlCb2FyZFR5cGU7CiAJLyogIHdpdGggZXh0ZXJuYWwgTE5BICBOTy9ZZXMgPSAwLzEgKi8KQEAgLTY2Myw3ICs1NzAsNiBAQAogCXU4CQkJRXh0UEE7CiAJLyogIHdpdGggZXh0ZXJuYWwgVFJTVyAgTk8vWWVzID0gMC8xICovCiAJdTgJCQlFeHRUUlNXOwotCXU4CQkJUGF0Y2hJRDsgLyogQ3VzdG9tZXIgSUQgKi8KIAlib29sCQkJYkluSGN0VGVzdDsKIAlib29sCQkJYldJRklUZXN0OwogCkBAIC03MDMsMTQgKzYwOSw2IEBACiAJLyogIDIwMTIvMDEvMTIgTUggRm9yIE1QLCB3ZSBuZWVkIHRvIHJlZHVjZSBvbmUgYXJyYXkgcG9pbnRlciBmb3IgZGVmYXVsdCBwb3J0Lj8/ICovCiAJc3RydWN0IHN0YV9pbmZvICoJCXBPRE1fU3RhSW5mb1tPRE1fQVNTT0NJQVRFX0VOVFJZX05VTV07CiAKLQkvKiAgKi8KLQkvKiAgMjAxMi8wMi8xNCBNSCBBZGQgdG8gc2hhcmUgODhFIHJhIHdpdGggb3RoZXIgU1cgdGVhbS4gKi8KLQkvKiAgV2UgbmVlZCB0byBjb2xlbGN0IGFsbCBzdXBwb3J0IGFiaWxpdCB0byBhIHByb3BlciBhcmVhLiAqLwotCS8qICAqLwotCWJvb2wJCQkJUmFTdXBwb3J0ODhFOwotCi0JLyogIERlZmluZSAuLi4uLi4uLi4uLiAqLwotCiAJLyogIExhdGVzdCBwYWNrZXQgcGh5IGluZm8gKE9ETSB3cml0ZSkgKi8KIAlzdHJ1Y3Qgb2RtX3BoeV9kYmdfaW5mbwkgUGh5RGJnSW5mbzsKIAkvKiBQSFlfSU5GT184OEUJCVBoeUluZm87ICovCkBAIC03MjgsMTEgKzYyNiw4IEBACiAJLyogICovCiAJLyogT0RNIFN0cnVjdHVyZSAqLwogCS8qICAqLwotCXN0cnVjdCBvZG1fZmF0X3QJCURNX0ZhdFRhYmxlOwogCXN0cnVjdCBkaWdfdAlETV9EaWdUYWJsZTsKIAlzdHJ1Y3QgZHluYW1pY19wd3Jfc2F2CQlETV9QU1RhYmxlOwotCXN0cnVjdCBwcmlfY2NhCURNX1ByaUNDQTsKLQlzdHJ1Y3QgcnhfaHAJCURNX1JYSFBfVGFibGU7CiAJc3RydWN0IGZhbHNlX2FsYXJtX3N0YXRzCUZhbHNlQWxtQ250OwogCXN0cnVjdCBmYWxzZV9hbGFybV9zdGF0cwlGbGFzZUFsbUNudEJ1ZGR5QWRhcHRlcjsKIAlzdHJ1Y3Qgc3dfYW50X3N3CQlETV9TV0FUX1RhYmxlOwpAQCAtNzQ1LDMyICs2NDAsMTEgQEAKIAkvKiAgKi8KIAogCS8qIFBTRCAqLwotCWJvb2wJCQliVXNlckFzc2lnbkxldmVsOwotCXU4CQkJUlNTSV9CVDsJCQkvKiBjb21lIGZyb20gQlQgKi8KLQlib29sCQkJYlBTRGluUHJvY2VzczsKLQotCS8qIGZvciByYXRlIGFkYXB0aXZlLCBpbiBmYWN0LCAgODhjLzkyYyBmdyB3aWxsIGhhbmRsZSB0aGlzICovCi0JdTgJCQliVXNlUkFNYXNrOwotCisJdTgJCQlSU1NJX0JUOwkJLyogY29tZSBmcm9tIEJUICovCiAJc3RydWN0IG9kbV9yYXRlX2FkYXB0CVJhdGVBZGFwdGl2ZTsKIAogCiAJc3RydWN0IG9kbV9yZl9jYWxfdAlSRkNhbGlicmF0ZUluZm87Ci0KLQkvKiAgKi8KLQkvKiAgVFggcG93ZXIgdHJhY2tpbmcgKi8KLQkvKiAgKi8KLQl1OAkJCUJiU3dpbmdJZHhPZmRtOwotCXU4CQkJQmJTd2luZ0lkeE9mZG1DdXJyZW50OwotCXU4CQkJQmJTd2luZ0lkeE9mZG1CYXNlOwotCWJvb2wJCQlCYlN3aW5nRmxhZ09mZG07Ci0JdTgJCQlCYlN3aW5nSWR4Q2NrOwotCXU4CQkJQmJTd2luZ0lkeENja0N1cnJlbnQ7Ci0JdTgJCQlCYlN3aW5nSWR4Q2NrQmFzZTsKLQlib29sCQkJQmJTd2luZ0ZsYWdDY2s7Ci0JLyogICovCi0JLyogIE9ETSBzeXN0ZW0gcmVzb3VyY2UuICovCi0JLyogICovCiB9OwkvKiAgRE1fRHluYW1pY19NZWNoYW5pc21fU3RydWN0dXJlICovCiAKIGVudW0gb2RtX3JmX2NvbnRlbnQgewpAQCAtOTgzLDYgKzg1Nyw0IEBACiAKIGJvb2wgT0RNX1NpbmdsZUR1YWxBbnRlbm5hRGV0ZWN0aW9uKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTggbW9kZSk7CiAKLXZvaWQgb2RtX2R0YyhzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0pOwotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fUmVnQ29uZmlnODcyM0EuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1fUmVnQ29uZmlnODcyM0EuaAppbmRleCBhNmNmYjZkLi5mMmE1NGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX1JlZ0NvbmZpZzg3MjNBLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9SZWdDb25maWc4NzIzQS5oCkBAIC0yMCw5ICsyMCw4IEBACiAKIHZvaWQgb2RtX0NvbmZpZ01BQ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBBZGRyLCB1OCBEYXRhKTsKIAotdm9pZCBvZG1fQ29uZmlnQkJfQUdDXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIEFkZHIsCi0JCQkgICAgdTMyIEJpdG1hc2ssIHUzMiBEYXRhKTsKK3ZvaWQgb2RtX0NvbmZpZ0JCX0FHQ184NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBhZGRyLCB1MzIgZGF0YSk7CiAKLXZvaWQgb2RtX0NvbmZpZ0JCX1BIWV84NzIzQShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBBZGRyLCB1MzIgQml0bWFzaywgdTMyIERhdGEpOwordm9pZCBvZG1fQ29uZmlnQkJfUEhZXzg3MjNBKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIGFkZHIsIHUzMiBkYXRhKTsKIAogI2VuZGlmIC8qICBlbmQgb2YgU1VQUE9SVCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9pbnRlcmZhY2UuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9vZG1faW50ZXJmYWNlLmgKaW5kZXggZWEzNTA3MC4uMWQzYmYwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL29kbV9pbnRlcmZhY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvb2RtX2ludGVyZmFjZS5oCkBAIC01NCwxNyArNTQsNiBAQAogLyogID09PT09PT09PT09IEVYdGVybiBGdW5jdGlvbiBQcm90b3R5cGUgKi8KIC8qICAqLwogCi0KLXU4IE9ETV9SZWFkMUJ5dGUoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgUmVnQWRkcik7Ci11MTYgT0RNX1JlYWQyQnl0ZShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyKTsKLXUzMiBPRE1fUmVhZDRCeXRlKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIpOwotdm9pZCBPRE1fV3JpdGUxQnl0ZShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1OCBEYXRhKTsKLXZvaWQgT0RNX1dyaXRlMkJ5dGUoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTE2IERhdGEpOwotdm9pZCBPRE1fV3JpdGU0Qnl0ZShzdHJ1Y3QgZG1fb2RtX3QgKnBETV9PZG0sIHUzMiBSZWdBZGRyLCB1MzIgRGF0YSk7Ci12b2lkIE9ETV9TZXRNQUNSZWcoc3RydWN0IGRtX29kbV90ICpwRE1fT2RtLCB1MzIgUmVnQWRkciwgdTMyIEJpdE1hc2ssIHUzMiBEYXRhKTsKLXUzMiBPRE1fR2V0TUFDUmVnKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKTsKLXZvaWQgT0RNX1NldEJCUmVnKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrLCB1MzIgRGF0YSk7Ci11MzIgT0RNX0dldEJCUmVnKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrKTsKIHZvaWQgT0RNX1NldFJGUmVnKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsCiAJCSAgdTMyIFJlZ0FkZHIsIHUzMiBCaXRNYXNrLCB1MzIgRGF0YSk7CiB1MzIgT0RNX0dldFJGUmVnKHN0cnVjdCBkbV9vZG1fdCAqcERNX09kbSwgZW51bSBSRl9SQURJT19QQVRIIGVSRlBhdGgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfaGFsLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnRsODcyM2FfaGFsLmgKaW5kZXggZTE0NjMzNi4uYWQzYTQ0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0bDg3MjNhX2hhbC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydGw4NzIzYV9oYWwuaApAQCAtMjcwLDcgKzI3MCw2IEBACiAJdTE2CUJhc2ljUmF0ZVNldDsKIAogCS8qIHJmX2N0cmwgKi8KLQl1OAlyZl9jaGlwOwogCXU4CXJmX3R5cGU7CiAJdTgJTnVtVG90YWxSRlBhdGg7CiAKQEAgLTM0OCw3ICszNDcsNiBAQAogCS8qIGZvciBob3N0IG1lc3NhZ2UgdG8gZncgKi8KIAl1OAlMYXN0SE1FQm94TnVtOwogCi0JdTgJZndfcmFjdHJsOwogCXU4CVJlZ1R4UGF1c2U7CiAJLyogIEJlYWNvbiBmdW5jdGlvbiByZWxhdGVkIGdsb2JhbCB2YXJpYWJsZS4gKi8KIAl1OAlSZWdGd0h3VHhRQ3RybDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfZGVidWcuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvaW5jbHVkZS9ydHdfZGVidWcuaAppbmRleCBiNmIwMTczLi4xNTkxODNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L2luY2x1ZGUvcnR3X2RlYnVnLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9pbmNsdWRlL3J0d19kZWJ1Zy5oCkBAIC0xNjMsMTQgKzE2MywxMyBAQAogCiBleHRlcm4gdTMyIEdsb2JhbERlYnVnTGV2ZWwyM0E7CiAKK19fcHJpbnRmKDMsIDQpCit2b2lkIHJ0X3RyYWNlKGludCBjb21wLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAotI2RlZmluZSBSVF9UUkFDRShfQ29tcCwgX0xldmVsLCBGbXQpCQkJCQlcCisjZGVmaW5lIFJUX1RSQUNFKF9Db21wLCBfTGV2ZWwsIEZtdCwgLi4uKQkJCQlcCiBkbyB7CQkJCQkJCQkJXAotCWlmIChfTGV2ZWwgPD0gR2xvYmFsRGVidWdMZXZlbDIzQSkgewkJCQlcCi0JCXByX2luZm8oIiVzIFsweCUwOHgsJWRdIiwgRFJJVkVSX1BSRUZJWCwJCVwKLQkJCSAodW5zaWduZWQgaW50KV9Db21wLCBfTGV2ZWwpOwkJCVwKLQkJcHJfaW5mbyBGbXQ7CQkJCQkJXAotCX0JCQkJCQkJCVwKKwlpZiAoX0xldmVsIDw9IEdsb2JhbERlYnVnTGV2ZWwyM0EpCQkJCVwKKwkJcnRfdHJhY2UoX0NvbXAsIF9MZXZlbCwgRm10LCAjI19fVkFfQVJHU19fKTsJCVwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgUlRfUFJJTlRfREFUQShfQ29tcCwgX0xldmVsLCBfVGl0bGVTdHJpbmcsIF9IZXhEYXRhLAkJXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvaW9jdGxfY2ZnODAyMTEuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL2lvY3RsX2NmZzgwMjExLmMKaW5kZXggNTM3YmQ4Mi4uYmM5NWNlOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvaW9jdGxfY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9pb2N0bF9jZmc4MDIxMS5jCkBAIC03MjksNyArNzI5LDcgQEAKIAlpZiAoa2V5cGFybXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAogCSAgICBrZXlwYXJtcy0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYywgX2Rydl9lcnJfLAotCQkJICgid3BhX3NldF9lbmNyeXB0aW9uLCBjcnlwdC5hbGcgPSBXRVBcbiIpKTsKKwkJCSAid3BhX3NldF9lbmNyeXB0aW9uLCBjcnlwdC5hbGcgPSBXRVBcbiIpOwogCQlEQkdfODcyM0EoIndwYV9zZXRfZW5jcnlwdGlvbiwgY3J5cHQuYWxnID0gV0VQXG4iKTsKIAogCQlpZiAocHNlY3VyaXR5cHJpdi0+YldlcERlZmF1bHRLZXlJZHhTZXQgPT0gMCkgewpAQCAtMTA3Niw4ICsxMDc2LDcgQEAKIAkJcmV0ID0gLUVOT0VOVDsKIAkJZ290byBleGl0OwogCX0KLQlEQkdfODcyM0EoIiVzKCVzKTogbWFjID0iIE1BQ19GTVQgIlxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUsCi0JCSAgTUFDX0FSRyhtYWMpKTsKKwlEQkdfODcyM0EoIiVzKCVzKTogbWFjPSVwTVxuIiwgX19mdW5jX18sIG5kZXYtPm5hbWUsIG1hYyk7CiAKIAkvKiBmb3IgaW5mcmEuL1AyUENsaWVudCBtb2RlICovCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBXSUZJX1NUQVRJT05fU1RBVEUpICYmCkBAIC0xMDg1LDggKzEwODQsOCBAQAogCQlzdHJ1Y3Qgd2xhbl9uZXR3b3JrICpjdXJfbmV0d29yayA9ICZwbWxtZXByaXYtPmN1cl9uZXR3b3JrOwogCiAJCWlmICghZXRoZXJfYWRkcl9lcXVhbChtYWMsIGN1cl9uZXR3b3JrLT5uZXR3b3JrLk1hY0FkZHJlc3MpKSB7Ci0JCQlEQkdfODcyM0EoIiVzLCBtaXNtYXRjaCBic3NpZCA9IiBNQUNfRk1UICJcbiIsIF9fZnVuY19fLAotCQkJCSAgTUFDX0FSRyhjdXJfbmV0d29yay0+bmV0d29yay5NYWNBZGRyZXNzKSk7CisJCQlEQkdfODcyM0EoIiVzLCBtaXNtYXRjaCBic3NpZD0lcE1cbiIsCisJCQkJICBfX2Z1bmNfXywgY3VyX25ldHdvcmstPm5ldHdvcmsuTWFjQWRkcmVzcyk7CiAJCQlyZXQgPSAtRU5PRU5UOwogCQkJZ290byBleGl0OwogCQl9CkBAIC0xMTI4LDE0ICsxMTI3LDE0IEBACiAJb2xkX21vZGUgPSBjdXJfbmV0d29yay0+bmV0d29yay5pZm1vZGU7CiAKIAlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X25vdGljZV8sCi0JCSAoIislczogb2xkID0lZCBuZXcgPSVkIGZ3X3N0YXRlID0gMHglMDh4XG4iLCBfX2Z1bmNfXywKLQkJICBvbGRfbW9kZSwgaWZtb2RlLCBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7CisJCSAiKyVzOiBvbGQgPSVkIG5ldyA9JWQgZndfc3RhdGUgPSAweCUwOHhcbiIsIF9fZnVuY19fLAorCQkgb2xkX21vZGUsIGlmbW9kZSwgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSk7CiAKIAlpZiAob2xkX21vZGUgIT0gaWZtb2RlKSB7CiAJCXNwaW5fbG9ja19iaCgmcG1sbWVwcml2LT5sb2NrKTsKIAogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiIGNoYW5nZSBtb2RlISIpKTsKKwkJCSAiY2hhbmdlIG1vZGUhXG4iKTsKIAogCQlpZiAob2xkX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKIAkJICAgIG9sZF9tb2RlID09IE5MODAyMTFfSUZUWVBFX1AyUF9HTykgewpAQCAtMTE5NSwxMCArMTE5NCw2IEBACiAKIAkJLyogU2VjQ2xlYXJBbGxLZXlzKGFkYXB0ZXIpOyAqLwogCi0JCS8qIFJUX1RSQUNFKENPTVBfT0lEX1NFVCwgREJHX0xPVUQsCi0JCSAgICgic2V0X2luZnJhc3RydWN0dXJlOiBmd19zdGF0ZToleCBhZnRlciBjaGFuZ2luZyBtb2RlXG4iLCAqLwotCQkvKiBnZXRfZndzdGF0ZShwbWxtZXByaXYpKSk7ICovCi0KIAkJc3Bpbl91bmxvY2tfYmgoJnBtbG1lcHJpdi0+bG9jayk7CiAJfQogCkBAIC0xNjAzLDcgKzE1OTgsNyBAQAogCQkJICBwaWVbaSArIDRdLCBwaWVbaSArIDVdLCBwaWVbaSArIDZdLCBwaWVbaSArIDddKTsKIAlpZiAoaWVsZW4gPCBSU05fSEVBREVSX0xFTikgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfb3NfYywgX2Rydl9lcnJfLAotCQkJICgiSWUgbGVuIHRvbyBzaG9ydCAlZFxuIiwgKGludClpZWxlbikpOworCQkJICJJZSBsZW4gdG9vIHNob3J0ICVkXG4iLCAoaW50KWllbGVuKTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gZXhpdDsKIAl9CkBAIC0xNzI2LDExICsxNzIxLDEwIEBACiAJCXJ0bDg3MjNhX29mZl9yY3JfYW0ocGFkYXB0ZXIpOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX29zX2MsIF9kcnZfaW5mb18sCi0JCSAoInJ0d19zZXRfd3BhX2llOiBwYWlyd2lzZV9jaXBoZXIgPSAweCUwOHggcGFkYXB0ZXItPiIKLQkJICAic2VjdXJpdHlwcml2Lm5kaXNlbmNyeXB0c3RhdHVzID0lZCBwYWRhcHRlci0+IgotCQkgICJzZWN1cml0eXByaXYubmRpc2F1dGh0eXBlID0lZFxuIiwgcGFpcndpc2VfY2lwaGVyLAotCQkgIHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMsCi0JCSAgcGFkYXB0ZXItPnNlY3VyaXR5cHJpdi5uZGlzYXV0aHR5cGUpKTsKKwkJICJydHdfc2V0X3dwYV9pZTogcGFpcndpc2VfY2lwaGVyID0gMHglMDh4IHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMgPSVkIHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2F1dGh0eXBlID0lZFxuIiwKKwkJIHBhaXJ3aXNlX2NpcGhlciwKKwkJIHBhZGFwdGVyLT5zZWN1cml0eXByaXYubmRpc2VuY3J5cHRzdGF0dXMsCisJCSBwYWRhcHRlci0+c2VjdXJpdHlwcml2Lm5kaXNhdXRodHlwZSk7CiAKIGV4aXQ6CiAJaWYgKHJldCkKQEAgLTE3NDYsNyArMTc0MCw3IEBACiAKIAlpZiAoa2V5aWQgPj0gTlVNX1dFUF9LRVlTKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywKLQkJCSAoIiVzOmtleWlkPjQgPT5mYWlsXG4iLCBfX2Z1bmNfXykpOworCQkJICIlczprZXlpZD40ID0+ZmFpbFxuIiwgX19mdW5jX18pOwogCQlyZXMgPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KQEAgLTE3NTUsNDUgKzE3NDksNDUgQEAKIAljYXNlIFdMQU5fS0VZX0xFTl9XRVA0MDoKIAkJcHNlY3VyaXR5cHJpdi0+ZG90MTFQcml2YWN5QWxncnRobSA9IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiJXM6d2VwLT5LZXlMZW5ndGggPSA1XG4iLCBfX2Z1bmNfXykpOworCQkJICIlczp3ZXAtPktleUxlbmd0aCA9IDVcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0tFWV9MRU5fV0VQMTA0OgogCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OwogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2luZm9fLAotCQkJICgiJXM6d2VwLT5LZXlMZW5ndGggPSAxM1xuIiwgX19mdW5jX18pKTsKKwkJCSAiJXM6d2VwLT5LZXlMZW5ndGggPSAxM1xuIiwgX19mdW5jX18pOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lBbGdydGhtID0gMDsKIAkJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJCSAoIiVzOndlcC0+S2V5TGVuZ3RoIT0gNSBvciAxM1xuIiwgX19mdW5jX18pKTsKKwkJCSAiJXM6d2VwLT5LZXlMZW5ndGghPSA1IG9yIDEzXG4iLCBfX2Z1bmNfXyk7CiAJCXJlcyA9IF9GQUlMOwogCQlnb3RvIGV4aXQ7CiAJfQogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJICgiJXM6YmVmb3JlIG1lbWNweSwgd2VwLT5LZXlMZW5ndGggPSAweCV4IGtleWlkID0leFxuIiwKLQkJICBfX2Z1bmNfXywgd2VwLT5rZXlsZW4sIGtleWlkKSk7CisJCSAiJXM6YmVmb3JlIG1lbWNweSwgd2VwLT5LZXlMZW5ndGggPSAweCV4IGtleWlkID0leFxuIiwKKwkJIF9fZnVuY19fLCB3ZXAtPmtleWxlbiwga2V5aWQpOwogCiAJbWVtY3B5KCZwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXSwgd2VwLCBzaXplb2Yoc3RydWN0IHJ0d193ZXBfa2V5KSk7CiAKIAlwc2VjdXJpdHlwcml2LT5kb3QxMVByaXZhY3lLZXlJbmRleCA9IGtleWlkOwogCiAJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X2lvY3RsX3NldF9jXywgX2Rydl9pbmZvXywKLQkJICgiJXM6c2VjdXJpdHkga2V5IG1hdGVyaWFsIDogIgotCQkgICIleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleCAleFxuIiwgX19mdW5jX18sCi0JCSAgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzBdLAotCQkgIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVsxXSwKLQkJICBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMl0sCi0JCSAgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzNdLAotCQkgIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVs0XSwKLQkJICBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbNV0sCi0JCSAgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzZdLAotCQkgIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVs3XSwKLQkJICBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbOF0sCi0JCSAgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzldLAotCQkgIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVsxMF0sCi0JCSAgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzExXSwKLQkJICBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMTJdKSk7CisJCSAiJXM6c2VjdXJpdHkga2V5IG1hdGVyaWFsIDogJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXhcbiIsCisJCSBfX2Z1bmNfXywKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVswXSwKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVsxXSwKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVsyXSwKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVszXSwKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVs0XSwKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVs1XSwKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVs2XSwKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVs3XSwKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVs4XSwKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVs5XSwKKwkJIHBzZWN1cml0eXByaXYtPndlcF9rZXlba2V5aWRdLmtleVsxMF0sCisJCSBwc2VjdXJpdHlwcml2LT53ZXBfa2V5W2tleWlkXS5rZXlbMTFdLAorCQkgcHNlY3VyaXR5cHJpdi0+d2VwX2tleVtrZXlpZF0ua2V5WzEyXSk7CiAKIAlyZXMgPSBydHdfc2V0X2tleTIzYShwYWRhcHRlciwgcHNlY3VyaXR5cHJpdiwga2V5aWQsIDEpOwogCkBAIC0xODE1LDcgKzE4MDksNyBAQAogCiAJaWYgKHBhZGFwdGVyLT5od19pbml0X2NvbXBsZXRlZCA9PSBmYWxzZSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfaW9jdGxfc2V0X2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJzZXRfc3NpZDogaHdfaW5pdF9jb21wbGV0ZWQgPT0gZmFsc2UgPT5leGl0ISEhXG4iKSk7CisJCQkgInNldF9zc2lkOiBod19pbml0X2NvbXBsZXRlZCA9PSBmYWxzZSA9PmV4aXQhISFcbiIpOwogCQlzdGF0dXMgPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KQEAgLTE4MjgsNyArMTgyMiw3IEBACiAKIAlpZiAoY2hlY2tfZndzdGF0ZShwbWxtZXByaXYsIF9GV19MSU5LRUR8V0lGSV9BREhPQ19NQVNURVJfU1RBVEUpKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkgKCJzZXRfc3NpZDogX0ZXX0xJTktFRHx8V0lGSV9BREhPQ19NQVNURVJfU1RBVEVcbiIpKTsKKwkJCSAic2V0X3NzaWQ6IF9GV19MSU5LRUR8fFdJRklfQURIT0NfTUFTVEVSX1NUQVRFXG4iKTsKIAogCQlpZiAocG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWRfbGVuID09CiAJCSAgICBuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZF9sZW4gJiYKQEAgLTE4MzcsOSArMTgzMSw5IEBACiAJCQkgICAgbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuKSkgewogCQkJaWYgKCFjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9TVEFUSU9OX1NUQVRFKSkgewogCQkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sCi0JCQkJCSBfZHJ2X2Vycl8sICgiTmV3IFNTSUQgaXMgc2FtZSBTU0lELCAiCi0JCQkJCQkgICAgICJmd19zdGF0ZSA9IDB4JTA4eFxuIiwKLQkJCQkJCSAgICAgZ2V0X2Z3c3RhdGUocG1sbWVwcml2KSkpOworCQkJCQkgX2Rydl9lcnJfLAorCQkJCQkgIk5ldyBTU0lEIGlzIHNhbWUgU1NJRCwgZndfc3RhdGUgPSAweCUwOHhcbiIsCisJCQkJCSBnZXRfZndzdGF0ZShwbWxtZXByaXYpKTsKIAogCQkJCWlmIChydHdfaXNfc2FtZV9pYnNzMjNhKHBhZGFwdGVyLCBwbmV0d29yaykpIHsKIAkJCQkJLyoKQEAgLTE4NzUsMTUgKzE4NjksMTUgQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICgiU2V0IFNTSUQgbm90IHRoZSBzYW1lIHNzaWRcbiIpKTsKKwkJCQkgIlNldCBTU0lEIG5vdCB0aGUgc2FtZSBzc2lkXG4iKTsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICgic2V0X3NzaWQgPVslc10gbGVuID0gMHgleFxuIiwKLQkJCQkgIG5ld25ldHdvcmstPm5ldHdvcmsuU3NpZC5zc2lkLAotCQkJCSAgbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuKSk7CisJCQkJICJzZXRfc3NpZCA9WyVzXSBsZW4gPSAweCV4XG4iLAorCQkJCSBuZXduZXR3b3JrLT5uZXR3b3JrLlNzaWQuc3NpZCwKKwkJCQkgbmV3bmV0d29yay0+bmV0d29yay5Tc2lkLnNzaWRfbGVuKTsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfaW5mb18sCi0JCQkJICgiYXNzb2Nfc3NpZCA9WyVzXSBsZW4gPSAweCV4XG4iLAotCQkJCSAgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQsCi0JCQkJICBwbWxtZXByaXYtPmFzc29jX3NzaWQuc3NpZF9sZW4pKTsKKwkJCQkgImFzc29jX3NzaWQgPVslc10gbGVuID0gMHgleFxuIiwKKwkJCQkgcG1sbWVwcml2LT5hc3NvY19zc2lkLnNzaWQsCisJCQkJIHBtbG1lcHJpdi0+YXNzb2Nfc3NpZC5zc2lkX2xlbik7CiAKIAkJCXJ0d19kaXNhc3NvY19jbWQyM2EocGFkYXB0ZXIsIDAsIHRydWUpOwogCkBAIC0xOTQ3LDcgKzE5NDEsNyBAQAogCiBleGl0OgogCVJUX1RSQUNFKF9tb2R1bGVfcnRsODcxeF9pb2N0bF9zZXRfY18sIF9kcnZfZXJyXywKLQkJICgiLSVzOiBzdGF0dXMgPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKSk7CisJCSAiLSVzOiBzdGF0dXMgPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xOTg5LDcgKzE5ODMsNyBAQAogCURCR184NzIzQSgic3NpZCA9JXMsIGxlbiA9JXp1XG4iLCBzbWUtPnNzaWQsIHNtZS0+c3NpZF9sZW4pOwogCiAJaWYgKHNtZS0+YnNzaWQpCi0JCURCR184NzIzQSgiYnNzaWQgPSIgTUFDX0ZNVCAiXG4iLCBNQUNfQVJHKHNtZS0+YnNzaWQpKTsKKwkJREJHXzg3MjNBKCJic3NpZD0lcE1cbiIsIHNtZS0+YnNzaWQpOwogCiAJaWYgKGNoZWNrX2Z3c3RhdGUocG1sbWVwcml2LCBfRldfVU5ERVJfTElOS0lORykpIHsKIAkJcmV0ID0gLUVCVVNZOwpAQCAtMjUyMyw4ICsyNTE3LDggQEAKIAogCQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKWRvdDExX2hkcjsKIAotCQlEQkdfODcyM0EoIlJUV19UeDpkYSA9IiBNQUNfRk1UICIgdmlhICVzKCVzKVxuIiwKLQkJCSAgTUFDX0FSRyhtZ210LT5kYSksIF9fZnVuY19fLCBuZGV2LT5uYW1lKTsKKwkJREJHXzg3MjNBKCJSVFdfVHg6ZGE9JXBNIHZpYSAlcyglcylcbiIsCisJCQkgIG1nbXQtPmRhLCBfX2Z1bmNfXywgbmRldi0+bmFtZSk7CiAJCWNhdGVnb3J5ID0gbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnk7CiAJCWFjdGlvbiA9IG1nbXQtPnUuYWN0aW9uLnUud21lX2FjdGlvbi5hY3Rpb25fY29kZTsKIAkJREJHXzg3MjNBKCJSVFdfVHg6Y2F0ZWdvcnkoJXUpLCBhY3Rpb24oJXUpXG4iLApAQCAtMjU4MCw2ICsyNTc0LDcgQEAKIH07CiAKIHN0YXRpYyBpbnQgcnR3X2NmZzgwMjExX2FkZF9tb25pdG9yX2lmKHN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXIsIGNoYXIgKm5hbWUsCisJCQkJICAgICAgIHVuc2lnbmVkIGNoYXIgbmFtZV9hc3NpZ25fdHlwZSwKIAkJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKipuZGV2KQogewogCWludCByZXQgPSAwOwpAQCAtMjYxMiw2ICsyNjA3LDcgQEAKIAltb25fbmRldi0+dHlwZSA9IEFSUEhSRF9JRUVFODAyMTFfUkFESU9UQVA7CiAJc3RybmNweShtb25fbmRldi0+bmFtZSwgbmFtZSwgSUZOQU1TSVopOwogCW1vbl9uZGV2LT5uYW1lW0lGTkFNU0laIC0gMV0gPSAwOworCW1vbl9uZGV2LT5uYW1lX2Fzc2lnbl90eXBlID0gbmFtZV9hc3NpZ25fdHlwZTsKIAltb25fbmRldi0+ZGVzdHJ1Y3RvciA9IHJ0d19uZGV2X2Rlc3RydWN0b3I7CiAKIAltb25fbmRldi0+bmV0ZGV2X29wcyA9ICZydHdfY2ZnODAyMTFfbW9uaXRvcl9pZl9vcHM7CkBAIC0yNjU0LDYgKzI2NTAsNyBAQAogCiBzdGF0aWMgc3RydWN0IHdpcmVsZXNzX2RldiAqCiBjZmc4MDIxMV9ydHdfYWRkX3ZpcnR1YWxfaW50ZihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgdW5zaWduZWQgY2hhciBuYW1lX2Fzc2lnbl90eXBlLAogCQkJICAgICAgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLCB1MzIgKmZsYWdzLAogCQkJICAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTI2NzMsNyArMjY3MCw4IEBACiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTU9OSVRPUjoKIAkJcmV0ID0KLQkJICAgIHJ0d19jZmc4MDIxMV9hZGRfbW9uaXRvcl9pZihwYWRhcHRlciwgKGNoYXIgKiluYW1lLCAmbmRldik7CisJCSAgICBydHdfY2ZnODAyMTFfYWRkX21vbml0b3JfaWYocGFkYXB0ZXIsIChjaGFyICopbmFtZSwKKwkJCQkJCW5hbWVfYXNzaWduX3R5cGUsICZuZGV2KTsKIAkJYnJlYWs7CiAKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CkBAIC0yODc3LDcgKzI4NzUsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCURCR184NzIzQSgiZnJlZSBzdGEgbWFjYWRkciA9IiBNQUNfRk1UICJcbiIsIE1BQ19BUkcobWFjKSk7CisJREJHXzg3MjNBKCJmcmVlIHN0YSBtYWNhZGRyPSVwTVxuIiwgbWFjKTsKIAogCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtYWMpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTMwNTMsOCArMzA1MSw3IEBACiAJY2ZnODAyMTFfbWdtdF90eF9zdGF0dXMocGFkYXB0ZXItPnJ0d193ZGV2LCAqY29va2llLCBidWYsIGxlbiwgYWNrLAogCQkJCUdGUF9LRVJORUwpOwogCi0JREJHXzg3MjNBKCJSVFdfVHg6dHhfY2ggPSVkLCBkYSA9IiBNQUNfRk1UICJcbiIsIHR4X2NoLAotCQkgIE1BQ19BUkcoaGRyLT5kYSkpOworCURCR184NzIzQSgiUlRXX1R4OnR4X2NoID0lZCwgZGEgPSVwTVxuIiwgdHhfY2gsIGhkci0+ZGEpOwogCWNhdGVnb3J5ID0gaGRyLT51LmFjdGlvbi5jYXRlZ29yeTsKIAlhY3Rpb24gPSBoZHItPnUuYWN0aW9uLnUud21lX2FjdGlvbi5hY3Rpb25fY29kZTsKIAlEQkdfODcyM0EoIlJUV19UeDpjYXRlZ29yeSgldSksIGFjdGlvbigldSlcbiIsIGNhdGVnb3J5LCBhY3Rpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvb3NfaW50ZnMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL29zX2ludGZzLmMKaW5kZXggMWIyM2ViMS4uODM2OTYzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvb3NfaW50ZnMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9vc19pbnRmcy5jCkBAIC0zNCw3ICszNCw3IEBACiBNT0RVTEVfRklSTVdBUkUoInJ0bHdpZmkvcnRsODcyM2F1ZndfQl9Ob0JULmJpbiIpOwogCiAvKiBtb2R1bGUgcGFyYW0gZGVmYXVsdHMgKi8KLXN0YXRpYyBpbnQgcnR3X2NoaXBfdmVyc2lvbiA9IDB4MDA7CitzdGF0aWMgaW50IHJ0d19jaGlwX3ZlcnNpb247CiBzdGF0aWMgaW50IHJ0d19yZmludGZzID0gSFdQSTsKIHN0YXRpYyBpbnQgcnR3X2RlYnVnID0gMTsKIApAQCAtMzQyLDcgKzM0Miw3IEBACiB7CiAJaWYgKGRldl9hbGxvY19uYW1lKHBuZXRkZXYsIGlmbmFtZSkgPCAwKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAoImRldl9hbGxvY19uYW1lLCBmYWlsIVxuIikpOworCQkJICJkZXZfYWxsb2NfbmFtZSwgZmFpbCFcbiIpOwogCX0KIAluZXRpZl9jYXJyaWVyX29mZihwbmV0ZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTM1Nyw3ICszNTcsNyBAQAogCXN0cnVjdCBydHdfYWRhcHRlciAqcGFkYXB0ZXI7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBuZXRkZXY7CiAKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIitpbml0X25ldF9kZXZcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiK2luaXRfbmV0X2RldlxuIik7CiAKIAlwbmV0ZGV2ID0gYWxsb2NfZXRoZXJkZXZfbXEoc2l6ZW9mKHN0cnVjdCBydHdfYWRhcHRlciksIDQpOwogCWlmICghcG5ldGRldikKQEAgLTQ1NiwxMSArNDU2LDExIEBACiB7CiAJaW50IHJldDggPSBfU1VDQ0VTUzsKIAotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiK3J0d19pbml0X2Rydl9zdzIzYVxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICIrcnR3X2luaXRfZHJ2X3N3MjNhXG4iKTsKIAogCWlmIChydHdfaW5pdF9jbWRfcHJpdjIzYSgmcGFkYXB0ZXItPmNtZHByaXYpID09IF9GQUlMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAoIlxuIENhbid0IGluaXQgY21kX3ByaXZcbiIpKTsKKwkJCSAiQ2FuJ3QgaW5pdCBjbWRfcHJpdlxuIik7CiAJCXJldDggPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KQEAgLTQ2OSwxNCArNDY5LDE0IEBACiAKIAlpZiAocnR3X2luaXRfZXZ0X3ByaXYyM2EoJnBhZGFwdGVyLT5ldnRwcml2KSA9PSBfRkFJTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbiBDYW4ndCBpbml0IGV2dF9wcml2XG4iKSk7CisJCQkgIkNhbid0IGluaXQgZXZ0X3ByaXZcbiIpOwogCQlyZXQ4ID0gX0ZBSUw7CiAJCWdvdG8gZXhpdDsKIAl9CiAKIAlpZiAocnR3X2luaXRfbWxtZV9wcml2MjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJcbiBDYW4ndCBpbml0IG1sbWVfcHJpdlxuIikpOworCQkJICJDYW4ndCBpbml0IG1sbWVfcHJpdlxuIik7CiAJCXJldDggPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KQEAgLTQ4NCw3ICs0ODQsNyBAQAogCiAJaWYgKGluaXRfbWxtZV9leHRfcHJpdjIzYShwYWRhcHRlcikgPT0gX0ZBSUwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICgiXG4gQ2FuJ3QgaW5pdCBtbG1lX2V4dF9wcml2XG4iKSk7CisJCQkgIkNhbid0IGluaXQgbWxtZV9leHRfcHJpdlxuIik7CiAJCXJldDggPSBfRkFJTDsKIAkJZ290byBleGl0OwogCX0KQEAgLTUyMSw0MCArNTIxLDQwIEBACiAKIGV4aXQ6CiAKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIi1ydHdfaW5pdF9kcnZfc3cyM2FcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAiLXJ0d19pbml0X2Rydl9zdzIzYVxuIik7CiAJcmV0dXJuIHJldDg7CiB9CiAKIHZvaWQgcnR3X2NhbmNlbF9hbGxfdGltZXIyM2Eoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKIHsKIAlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLAotCQkgKCIrcnR3X2NhbmNlbF9hbGxfdGltZXIyM2FcbiIpKTsKKwkJICIrcnR3X2NhbmNlbF9hbGxfdGltZXIyM2FcbiIpOwogCiAJZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5tbG1lcHJpdi5hc3NvY190aW1lcik7CiAJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywKLQkJICgiJXM6Y2FuY2VsIGFzc29jaWF0aW9uIHRpbWVyIGNvbXBsZXRlIVxuIiwgX19mdW5jX18pKTsKKwkJICIlczpjYW5jZWwgYXNzb2NpYXRpb24gdGltZXIgY29tcGxldGUhXG4iLCBfX2Z1bmNfXyk7CiAKIAlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPm1sbWVwcml2LnNjYW5fdG9fdGltZXIpOwogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sCi0JCSAoIiVzOmNhbmNlbCBzY2FuX3RvX3RpbWVyIVxuIiwgX19mdW5jX18pKTsKKwkJICIlczpjYW5jZWwgc2Nhbl90b190aW1lciFcbiIsIF9fZnVuY19fKTsKIAogCWRlbF90aW1lcl9zeW5jKCZwYWRhcHRlci0+bWxtZXByaXYuZHluYW1pY19jaGtfdGltZXIpOwogCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sCi0JCSAoIiVzOmNhbmNlbCBkeW5hbWljX2Noa190aW1lciFcbiIsIF9fZnVuY19fKSk7CisJCSAiJXM6Y2FuY2VsIGR5bmFtaWNfY2hrX3RpbWVyIVxuIiwgX19mdW5jX18pOwogCiAJZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5wd3JjdHJscHJpdi5wd3Jfc3RhdGVfY2hlY2tfdGltZXIpOwogCiAJZGVsX3RpbWVyX3N5bmMoJnBhZGFwdGVyLT5tbG1lcHJpdi5zZXRfc2Nhbl9kZW55X3RpbWVyKTsKIAlydHdfY2xlYXJfc2Nhbl9kZW55KHBhZGFwdGVyKTsKIAlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLAotCQkgKCIlczpjYW5jZWwgc2V0X3NjYW5fZGVueV90aW1lciFcbiIsIF9fZnVuY19fKSk7CisJCSAiJXM6Y2FuY2VsIHNldF9zY2FuX2RlbnlfdGltZXIhXG4iLCBfX2Z1bmNfXyk7CiAKIAlkZWxfdGltZXJfc3luYygmcGFkYXB0ZXItPnJlY3Zwcml2LnNpZ25hbF9zdGF0X3RpbWVyKTsKIH0KIAogaW50IHJ0d19mcmVlX2Rydl9zdzIzYShzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQogewotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiPT0+cnR3X2ZyZWVfZHJ2X3N3MjNhIikpOworCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICI9PT5ydHdfZnJlZV9kcnZfc3cyM2FcbiIpOwogCiAJZnJlZV9tbG1lX2V4dF9wcml2MjNhKCZwYWRhcHRlci0+bWxtZWV4dHByaXYpOwogCkBAIC01NzQsNyArNTc0LDcgQEAKIAlrZnJlZShwYWRhcHRlci0+SGFsRGF0YSk7CiAJcGFkYXB0ZXItPkhhbERhdGEgPSBOVUxMOwogCi0JUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgKCItcnR3X2ZyZWVfZHJ2X3N3MjNhXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIi1ydHdfZnJlZV9kcnZfc3cyM2FcbiIpOwogCXJldHVybiBfU1VDQ0VTUzsKIH0KIApAQCAtNTk0LDggKzU5NCw4IEBACiAJCXJldCA9IF9GQUlMOwogCQlnb3RvIGVycm9yX3JlZ2lzdGVyX25ldGRldjsKIAl9Ci0JREJHXzg3MjNBKCIlcywgTUFDIEFkZHJlc3MgKGlmJWQpID0gIiBNQUNfRk1UICJcbiIsIF9fZnVuY19fLAotCQkgIChwYWRhcHRlci0+aWZhY2VfaWQgKyAxKSwgTUFDX0FSRyhwbmV0ZGV2LT5kZXZfYWRkcikpOworCURCR184NzIzQSgiJXMsIE1BQyBBZGRyZXNzIChpZiVkKSA9ICVwTVxuIiwKKwkJICBfX2Z1bmNfXywgcGFkYXB0ZXItPmlmYWNlX2lkICsgMSwgcG5ldGRldi0+ZGV2X2FkZHIpOwogCXJldHVybiByZXQ7CiAKIGVycm9yX3JlZ2lzdGVyX25ldGRldjoKQEAgLTY0Nyw3ICs2NDcsNyBAQAogCWludCByZXQgPSAwOwogCWludCBzdGF0dXM7CiAKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIis4NzF4X2RydiAtIGRldl9vcGVuXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIis4NzF4X2RydiAtIGRldl9vcGVuXG4iKTsKIAlEQkdfODcyM0EoIis4NzF4X2RydiAtIGRydl9vcGVuLCBidXAgPSVkXG4iLCBwYWRhcHRlci0+YnVwKTsKIAogCW11dGV4X2xvY2soJmFkYXB0ZXJfdG9fZHZvYmoocGFkYXB0ZXIpLT5od19pbml0X211dGV4KTsKQEAgLTY2MiwxMiArNjYyLDExIEBACiAJCXN0YXR1cyA9IHJ0bDg3MjNhdV9oYWxfaW5pdChwYWRhcHRlcik7CiAJCWlmIChzdGF0dXMgPT0gX0ZBSUwpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJydGw4NzF4X2hhbF9pbml0KCk6IENhbid0IGluaXQgaC93IVxuIikpOworCQkJCSAicnRsODcxeF9oYWxfaW5pdCgpOiBDYW4ndCBpbml0IGgvdyFcbiIpOwogCQkJZ290byBuZXRkZXZfb3BlbjIzYV9lcnJvcjsKIAkJfQogCi0JCURCR184NzIzQSgiTUFDIEFkZHJlc3MgPSAiTUFDX0ZNVCJcbiIsCi0JCQkgIE1BQ19BUkcocG5ldGRldi0+ZGV2X2FkZHIpKTsKKwkJREJHXzg3MjNBKCJNQUMgQWRkcmVzcyA9ICVwTVxuIiwgcG5ldGRldi0+ZGV2X2FkZHIpOwogCiAJCWlmIChpbml0X2h3X21sbWVfZXh0MjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkgewogCQkJREJHXzg3MjNBKCJjYW4ndCBpbml0IG1sbWVfZXh0X3ByaXZcbiIpOwpAQCAtNjk1LDcgKzY5NCw3IEBACiAJZWxzZQogCQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMocG5ldGRldik7CiAKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIi04NzF4X2RydiAtIGRldl9vcGVuXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIi04NzF4X2RydiAtIGRldl9vcGVuXG4iKTsKIAlEQkdfODcyM0EoIi04NzF4X2RydiAtIGRydl9vcGVuLCBidXAgPSVkXG4iLCBwYWRhcHRlci0+YnVwKTsKIGV4aXQ6CiAJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyX3RvX2R2b2JqKHBhZGFwdGVyKS0+aHdfaW5pdF9tdXRleCk7CkBAIC03MDgsNyArNzA3LDcgQEAKIAluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMocG5ldGRldik7CiAKIAlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCSAoIi04NzF4X2RydiAtIGRldl9vcGVuLCBmYWlsIVxuIikpOworCQkgIi04NzF4X2RydiAtIGRldl9vcGVuLCBmYWlsIVxuIik7CiAJREJHXzg3MjNBKCItODcxeF9kcnYgLSBkcnZfb3BlbiBmYWlsLCBidXAgPSVkXG4iLCBwYWRhcHRlci0+YnVwKTsKIAogCXJldCA9IC0xOwpAQCAtNzI5LDcgKzcyOCw3IEBACiAJc3RhdHVzID0gcnRsODcyM2F1X2hhbF9pbml0KHBhZGFwdGVyKTsKIAlpZiAoc3RhdHVzID09IF9GQUlMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAoImlwc19uZXRkcnZfb3BlbigpOiBDYW4ndCBpbml0IGgvdyFcbiIpKTsKKwkJCSAiaXBzX25ldGRydl9vcGVuKCk6IENhbid0IGluaXQgaC93IVxuIik7CiAJCWdvdG8gbmV0ZGV2X29wZW4yM2FfZXJyb3I7CiAJfQogCkBAIC04MDcsNyArODA2LDcgQEAKIHsKIAlzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyID0gbmV0ZGV2X3ByaXYocG5ldGRldik7CiAKLQlSVF9UUkFDRShfbW9kdWxlX29zX2ludGZzX2NfLCBfZHJ2X2luZm9fLCAoIis4NzF4X2RydiAtIGRydl9jbG9zZVxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICIrODcxeF9kcnYgLSBkcnZfY2xvc2VcbiIpOwogCiAJcGFkYXB0ZXItPm5ldF9jbG9zZWQgPSB0cnVlOwogCkBAIC04MzUsNyArODM0LDcgQEAKIAogCXJ0d19zY2FuX2Fib3J0MjNhKHBhZGFwdGVyKTsKIAotCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfaW5mb18sICgiLTg3MXhfZHJ2IC0gZHJ2X2Nsb3NlXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9vc19pbnRmc19jXywgX2Rydl9pbmZvXywgIi04NzF4X2RydiAtIGRydl9jbG9zZVxuIik7CiAJREJHXzg3MjNBKCItODcxeF9kcnYgLSBkcnZfY2xvc2UsIGJ1cCA9JWRcbiIsIHBhZGFwdGVyLT5idXApOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9yZWN2X2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC9yZWN2X2xpbnV4LmMKaW5kZXggYmNkOTcwYi4uMDg0YjUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvcmVjdl9saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3JlY3ZfbGludXguYwpAQCAtODEsMTkgKzgxLDE5IEBACiAJc2tiID0gcHJlY3ZfZnJhbWUtPnBrdDsKIAlpZiAoIXNrYikgewogCQlSVF9UUkFDRShfbW9kdWxlX3JlY3Zfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAoInJ0d19yZWN2X2luZGljYXRlcGt0MjNhKCk6c2tiID09IE5VTEwhISEhXG4iKSk7CisJCQkgInJ0d19yZWN2X2luZGljYXRlcGt0MjNhKCk6c2tiID09IE5VTEwhISEhXG4iKTsKIAkJZ290byBfcmVjdl9pbmRpY2F0ZXBrdF9kcm9wOwogCX0KIAogCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9pbmZvXywKLQkJICgicnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EoKTpza2IgIT0gTlVMTCAhISFcbiIpKTsKKwkJICJydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYSgpOnNrYiAhPSBOVUxMICEhIVxuIik7CiAJUlRfVFJBQ0UoX21vZHVsZV9yZWN2X29zZGVwX2NfLCBfZHJ2X2luZm9fLAotCQkgKCJydHdfcmVjdl9pbmRpY2F0ZXBrdDIzYSgpOnByZWN2X2ZyYW1lLT5oZHIucnhfZGF0YSA9JXBcbiIsCi0JCSAgcHJlY3ZfZnJhbWUtPnBrdC0+ZGF0YSkpOworCQkgInJ0d19yZWN2X2luZGljYXRlcGt0MjNhKCk6cHJlY3ZfZnJhbWUtPmhkci5yeF9kYXRhID0lcFxuIiwKKwkJIHByZWN2X2ZyYW1lLT5wa3QtPmRhdGEpOwogCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9pbmZvXywKLQkJICgiXG4gc2tiLT5oZWFkID0lcCBza2ItPmRhdGEgPSVwIHNrYi0+dGFpbCA9JXAgc2tiLT5lbmQgPSVwIHNrYi0+bGVuID0lZFxuIiwKLQkJICBza2ItPmhlYWQsIHNrYi0+ZGF0YSwKLQkJICBza2JfdGFpbF9wb2ludGVyKHNrYiksIHNrYl9lbmRfcG9pbnRlcihza2IpLCBza2ItPmxlbikpOworCQkgInNrYi0+aGVhZCA9JXAgc2tiLT5kYXRhID0lcCBza2ItPnRhaWwgPSVwIHNrYi0+ZW5kID0lcCBza2ItPmxlbiA9JWRcbiIsCisJCSBza2ItPmhlYWQsIHNrYi0+ZGF0YSwKKwkJIHNrYl90YWlsX3BvaW50ZXIoc2tiKSwgc2tiX2VuZF9wb2ludGVyKHNrYiksIHNrYi0+bGVuKTsKIAogCWlmIChjaGVja19md3N0YXRlKHBtbG1lcHJpdiwgV0lGSV9BUF9TVEFURSkgPT0gdHJ1ZSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqcHNrYjIgPSBOVUxMOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJcnR3X2ZyZWVfcmVjdmZyYW1lMjNhKHByZWN2X2ZyYW1lKTsKIAogCVJUX1RSQUNFKF9tb2R1bGVfcmVjdl9vc2RlcF9jXywgX2Rydl9pbmZvXywKLQkJICgiXG4gcnR3X3JlY3ZfaW5kaWNhdGVwa3QyM2EgOmFmdGVyIG5ldGlmX3J4ISEhIVxuIikpOworCQkgInJ0d19yZWN2X2luZGljYXRlcGt0MjNhIDphZnRlciBuZXRpZl9yeCEhISFcbiIpOwogCXJldHVybiBfU1VDQ0VTUzsKIAogX3JlY3ZfaW5kaWNhdGVwa3RfZHJvcDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9pbnRmLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC91c2JfaW50Zi5jCmluZGV4IDA1NzU1YjguLjI3YjNhNWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9pbnRmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvdXNiX2ludGYuYwpAQCAtMTU5LDcgKzE1OSw3IEBACiAKIAlpZiAocnR3X2luaXRfaW50Zl9wcml2KHBkdm9ianByaXYpID09IF9GQUlMKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfb3NfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAoIlxuIENhbid0IElOSVQgcnR3X2luaXRfaW50Zl9wcml2XG4iKSk7CisJCQkgIkNhbid0IElOSVQgcnR3X2luaXRfaW50Zl9wcml2XG4iKTsKIAkJZ290byBmcmVlX2R2b2JqOwogCX0KIAkvKiAzIG1pc2MgKi8KQEAgLTIxMyw3ICsyMTMsNyBAQAogCiB2b2lkIHJ0bDg3MjNhX3VzYl9pbnRmX3N0b3Aoc3RydWN0IHJ0d19hZGFwdGVyICpwYWRhcHRlcikKIHsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAoIit1c2JfaW50Zl9zdG9wXG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgIit1c2JfaW50Zl9zdG9wXG4iKTsKIAogCS8qIGRpc2FibGVfaHdfaW50ZXJydXB0ICovCiAJaWYgKCFwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkgewpAQCAtMjIxLDcgKzIyMSw3IEBACiAJCSAqIFRPRE86CiAJCSAqLwogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICgiU3VycHJpc2VSZW1vdmVkID09IGZhbHNlXG4iKSk7CisJCQkgIlN1cnByaXNlUmVtb3ZlZCA9PSBmYWxzZVxuIik7CiAJfQogCiAJLyogY2FuY2VsIGluIGlycCAqLwpAQCAtMjMxLDEzICsyMzEsMTQgQEAKIAlydGw4NzIzYXVfd3JpdGVfcG9ydF9jYW5jZWwocGFkYXB0ZXIpOwogCiAJLyogdG9kbzpjYW5jZWwgb3RoZXIgaXJwcyAqLwotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICgiLXVzYl9pbnRmX3N0b3BcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiLXVzYl9pbnRmX3N0b3BcbiIpOwogfQogCiBzdGF0aWMgdm9pZCBydHdfZGV2X3VubG9hZChzdHJ1Y3QgcnR3X2FkYXB0ZXIgKnBhZGFwdGVyKQogewogCXN0cnVjdCBzdWJtaXRfY3R4ICpwYWNrX3R4X29wcyA9ICZwYWRhcHRlci0+eG1pdHByaXYuYWNrX3R4X29wczsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAoIitydHdfZGV2X3VubG9hZFxuIikpOworCisJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgIitydHdfZGV2X3VubG9hZFxuIik7CiAKIAlpZiAocGFkYXB0ZXItPmJ1cCkgewogCQlEQkdfODcyM0EoIj09PT4gcnR3X2Rldl91bmxvYWRcbiIpOwpAQCAtMjYxLDEwICsyNjIsMTAgQEAKIAkJcGFkYXB0ZXItPmJ1cCA9IGZhbHNlOwogCX0gZWxzZSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJyODcxeF9kZXZfdW5sb2FkKCk6cGFkYXB0ZXItPmJ1cCA9PSBmYWxzZVxuIikpOworCQkJICJyODcxeF9kZXZfdW5sb2FkKCk6cGFkYXB0ZXItPmJ1cCA9PSBmYWxzZVxuIik7CiAJfQogCURCR184NzIzQSgiPD09PSBydHdfZGV2X3VubG9hZFxuIik7Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgKCItcnR3X2Rldl91bmxvYWRcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiLXJ0d19kZXZfdW5sb2FkXG4iKTsKIH0KIAogc3RhdGljIGludCBydHdfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqcHVzYl9pbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKQEAgLTQzNSw3ICs0MzYsNyBAQAogCS8qIHN0ZXAgNS4gKi8KIAlpZiAocnR3X2luaXRfZHJ2X3N3MjNhKHBhZGFwdGVyKSA9PSBfRkFJTCkgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLAotCQkJICgiSW5pdGlhbGl6ZSBkcml2ZXIgc29mdHdhcmUgcmVzb3VyY2UgRmFpbGVkIVxuIikpOworCQkJICJJbml0aWFsaXplIGRyaXZlciBzb2Z0d2FyZSByZXNvdXJjZSBGYWlsZWQhXG4iKTsKIAkJZ290byBmcmVlX2hhbF9kYXRhOwogCX0KIApAQCAtNTMzLDEzICs1MzQsMTMgQEAKIAlzdHJ1Y3QgZHZvYmpfcHJpdiAqZHZvYmo7CiAJaW50IHN0YXR1cyA9IF9GQUlMOwogCi0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgKCIrcnR3X2Rydl9pbml0XG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgIitydHdfZHJ2X2luaXRcbiIpOwogCiAJLyogSW5pdGlhbGl6ZSBkdm9ial9wcml2ICovCiAJZHZvYmogPSB1c2JfZHZvYmpfaW5pdChwdXNiX2ludGYpOwogCWlmICghZHZvYmopIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJCSAoImluaXRpYWxpemUgZGV2aWNlIG9iamVjdCBwcml2IEZhaWxlZCFcbiIpKTsKKwkJCSAiaW5pdGlhbGl6ZSBkZXZpY2Ugb2JqZWN0IHByaXYgRmFpbGVkIVxuIik7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTU1NCw3ICs1NTUsNyBAQAogCWlmIChzdGF0dXMgIT0gX1NVQ0NFU1MpCiAJCWdvdG8gZnJlZV9pZjE7CiAJUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywKLQkJICgiLTg3MXhfZHJ2IC0gZHJ2X2luaXQsIHN1Y2Nlc3MhXG4iKSk7CisJCSAiLTg3MXhfZHJ2IC0gZHJ2X2luaXQsIHN1Y2Nlc3MhXG4iKTsKIAogCXN0YXR1cyA9IF9TVUNDRVNTOwogCkBAIC01ODYsNyArNTg3LDcgQEAKIAogCXVzYl9zZXRfaW50ZmRhdGEocHVzYl9pbnRmLCBOVUxMKTsKIAotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICgiK2Rldl9yZW1vdmUoKVxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICIrZGV2X3JlbW92ZSgpXG4iKTsKIAogCXJ0d19wbV9zZXRfaXBzMjNhKHBhZGFwdGVyLCBJUFNfTk9ORSk7CiAJcnR3X3BtX3NldF9scHMyM2EocGFkYXB0ZXIsIFBTX01PREVfQUNUSVZFKTsKQEAgLTU5NywyMSArNTk4LDE5IEBACiAKIAl1c2JfZHZvYmpfZGVpbml0KHB1c2JfaW50Zik7CiAKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAoIi1kZXZfcmVtb3ZlKClcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX2hjaV9pbnRmc19jXywgX2Rydl9lcnJfLCAiLWRldl9yZW1vdmUoKVxuIik7CiAJREJHXzg3MjNBKCItcjg3MXh1X2Rldl9yZW1vdmUsIGRvbmVcbiIpOwotCi0JcmV0dXJuOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBydHdfZHJ2X2VudHJ5KHZvaWQpCiB7Ci0JUlRfVFJBQ0UoX21vZHVsZV9oY2lfaW50ZnNfY18sIF9kcnZfZXJyXywgKCIrcnR3X2Rydl9lbnRyeVxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICIrcnR3X2Rydl9lbnRyeVxuIik7CiAJcmV0dXJuIHVzYl9yZWdpc3Rlcih1c2JfZHJ2KTsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHJ0d19kcnZfaGFsdCh2b2lkKQogewotCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICgiK3J0d19kcnZfaGFsdFxuIikpOworCVJUX1RSQUNFKF9tb2R1bGVfaGNpX2ludGZzX2NfLCBfZHJ2X2Vycl8sICIrcnR3X2Rydl9oYWx0XG4iKTsKIAlEQkdfODcyM0EoIitydHdfZHJ2X2hhbHRcbiIpOwogCiAJdXNiX2RlcmVnaXN0ZXIodXNiX2Rydik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC91c2Jfb3BzX2xpbnV4LmMKaW5kZXggM2UxOWIzYi4uMGNkYWVmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAvdXNiX29wc19saW51eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3VzYl9vcHNfbGludXguYwpAQCAtNTgsOSArNTgsOCBAQAogCWlmIChwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCB8fCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwKIAkgICAgcGFkYXB0ZXItPmJXcml0ZVBvcnRDYW5jZWwpIHsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCglZCkgT1IgIgotCQkJICAiYlN1cnByaXNlUmVtb3ZlZCglZCkiLCBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsCi0JCQkgIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSk7CisJCQkgInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOmJEcml2ZXJTdG9wcGVkKCVkKSBPUiBiU3VycHJpc2VSZW1vdmVkKCVkKVxuIiwKKwkJCSBwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQsIHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKTsKIAkJREJHXzg3MjNBKCIlcygpOiBUWCBXYXJuaW5nISBiRHJpdmVyU3RvcHBlZCglZCkgT1IgIgogCQkJICAiYlN1cnByaXNlUmVtb3ZlZCglZCkgYldyaXRlUG9ydENhbmNlbCglZCkgIgogCQkJICAicHhtaXRidWYtPmV4dF90YWcoJXgpXG4iLCBfX2Z1bmNfXywKQEAgLTcyLDE0ICs3MSwxNCBAQAogCiAJaWYgKHB1cmItPnN0YXR1cykgewogCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCSAoInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlIDogcHVyYi0+c3RhdHVzKCVkKSAiCi0JCQkgICIhPSAwXG4iLCBwdXJiLT5zdGF0dXMpKTsKKwkJCSAidXNiX3dyaXRlX3BvcnQyM2FfY29tcGxldGUgOiBwdXJiLT5zdGF0dXMoJWQpICE9IDBcbiIsCisJCQkgcHVyYi0+c3RhdHVzKTsKIAkJREJHXzg3MjNBKCIjIyM9PiB1cmJfd3JpdGVfcG9ydF9jb21wbGV0ZSBzdGF0dXMoJWQpXG4iLAogCQkJICBwdXJiLT5zdGF0dXMpOwogCQlpZiAocHVyYi0+c3RhdHVzID09IC1FUElQRSB8fCBwdXJiLT5zdGF0dXMgPT0gLUVQUk9UTykgewogCQl9IGVsc2UgaWYgKHB1cmItPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpIHsKIAkJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJCSAoInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOiBFSU5QUk9HRVNTXG4iKSk7CisJCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTogRUlOUFJPR0VTU1xuIik7CiAJCQlnb3RvIGNoZWNrX2NvbXBsZXRpb247CiAJCX0gZWxzZSBpZiAocHVyYi0+c3RhdHVzID09IC1FTk9FTlQpIHsKIAkJCURCR184NzIzQSgiJXM6IC1FTk9FTlRcbiIsIF9fZnVuY19fKTsKQEAgLTg5LDE4ICs4OCwxNiBAQAogCQkJZ290byBjaGVja19jb21wbGV0aW9uOwogCQl9IGVsc2UgaWYgKHB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSB7CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTogRVNIVVRET1dOXG4iKSk7CisJCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTogRVNIVVRET1dOXG4iKTsKIAkJCXBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCA9IHRydWU7CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCAiCi0JCQkJICAiPSB0cnVlXG4iKSk7CisJCQkJICJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTpiRHJpdmVyU3RvcHBlZCA9IHRydWVcbiIpOwogCQkJZ290byBjaGVja19jb21wbGV0aW9uOwogCQl9IGVsc2UgewogCQkJcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQgPSB0cnVlOwogCQkJREJHXzg3MjNBKCJiU3VycHJpc2VSZW1vdmVkID0gdHJ1ZVxuIik7CiAJCQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywKLQkJCQkgKCJ1c2Jfd3JpdGVfcG9ydDIzYV9jb21wbGV0ZTpiU3VycHJpc2VSZW1vdmVkICIKLQkJCQkgICI9IHRydWVcbiIpKTsKKwkJCQkgInVzYl93cml0ZV9wb3J0MjNhX2NvbXBsZXRlOmJTdXJwcmlzZVJlbW92ZWQgPSB0cnVlXG4iKTsKIAkJCWdvdG8gY2hlY2tfY29tcGxldGlvbjsKIAkJfQogCX0KQEAgLTEzMiwxMiArMTI5LDEyIEBACiAJaW50IHN0YXR1czsKIAlpbnQgcmV0ID0gX0ZBSUw7CiAKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywgKCIrdXNiX3dyaXRlX3BvcnQyM2FcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywgIit1c2Jfd3JpdGVfcG9ydDIzYVxuIik7CiAKIAlpZiAocGFkYXB0ZXItPmJEcml2ZXJTdG9wcGVkIHx8IHBhZGFwdGVyLT5iU3VycHJpc2VSZW1vdmVkKSB7CiAJCVJUX1RSQUNFKF9tb2R1bGVfaGNpX29wc19vc19jXywgX2Rydl9lcnJfLAotCQkJICgiJXM6KHBhZGFwdGVyLT5iRHJpdmVyU3RvcHBlZCB8fCAiCi0JCQkgICJwYWRhcHRlci0+YlN1cnByaXNlUmVtb3ZlZCkhISFcbiIsIF9fZnVuY19fKSk7CisJCQkgIiVzOihwYWRhcHRlci0+YkRyaXZlclN0b3BwZWQgfHwgcGFkYXB0ZXItPmJTdXJwcmlzZVJlbW92ZWQpISEhXG4iLAorCQkJIF9fZnVuY19fKTsKIAkJcnR3MjNhX3NjdHhfZG9uZV9lcnIoJnB4bWl0YnVmLT5zY3R4LCBSVFdfU0NUWF9ET05FX1RYX0RFTlkpOwogCQlnb3RvIGV4aXQ7CiAJfQpAQCAtMTg4LDggKzE4NSw4IEBACiAJCQkJICAgICBSVFdfU0NUWF9ET05FX1dSSVRFX1BPUlRfRVJSKTsKIAkJREJHXzg3MjNBKCJ1c2Jfd3JpdGVfcG9ydDIzYSwgc3RhdHVzID0lZFxuIiwgc3RhdHVzKTsKIAkJUlRfVFJBQ0UoX21vZHVsZV9oY2lfb3BzX29zX2NfLCBfZHJ2X2Vycl8sCi0JCQkgKCJ1c2Jfd3JpdGVfcG9ydDIzYSgpOiB1c2Jfc3VibWl0X3VyYiwgc3RhdHVzID0leFxuIiwKLQkJCSBzdGF0dXMpKTsKKwkJCSAidXNiX3dyaXRlX3BvcnQyM2EoKTogdXNiX3N1Ym1pdF91cmIsIHN0YXR1cyA9JXhcbiIsCisJCQkgc3RhdHVzKTsKIAogCQlzd2l0Y2ggKHN0YXR1cykgewogCQljYXNlIC1FTk9ERVY6CkBAIC0yMDEsNyArMTk4LDcgQEAKIAkJZ290byBleGl0OwogCX0KIAlyZXQgPSBfU1VDQ0VTUzsKLQlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywgKCItdXNiX3dyaXRlX3BvcnQyM2FcbiIpKTsKKwlSVF9UUkFDRShfbW9kdWxlX2hjaV9vcHNfb3NfY18sIF9kcnZfZXJyXywgIi11c2Jfd3JpdGVfcG9ydDIzYVxuIik7CiAKIGV4aXQ6CiAJaWYgKHJldCAhPSBfU1VDQ0VTUykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3htaXRfbGludXguYyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzIzYXUvb3NfZGVwL3htaXRfbGludXguYwppbmRleCA2OWY4ODg0Li45YTE0MDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcyM2F1L29zX2RlcC94bWl0X2xpbnV4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MjNhdS9vc19kZXAveG1pdF9saW51eC5jCkBAIC0xMjMsMTEgKzEyMywxMSBAQAogCXN0cnVjdCB4bWl0X3ByaXYgKnB4bWl0cHJpdiA9ICZwYWRhcHRlci0+eG1pdHByaXY7CiAJaW50IHJlcyA9IDA7CiAKLQlSVF9UUkFDRShfbW9kdWxlX3J0bDg3MXhfbWxtZV9jXywgX2Rydl9pbmZvXywgKCIreG1pdF9lbnJ5XG4iKSk7CisJUlRfVFJBQ0UoX21vZHVsZV9ydGw4NzF4X21sbWVfY18sIF9kcnZfaW5mb18sICIreG1pdF9lbnJ5XG4iKTsKIAogCWlmICghcnR3X2lmX3VwMjNhKHBhZGFwdGVyKSkgewogCQlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfZXJyXywKLQkJCSAoInJ0d194bWl0MjNhX2VudHJ5MjNhOiBydHdfaWZfdXAyM2EgZmFpbFxuIikpOworCQkJICJydHdfeG1pdDIzYV9lbnRyeTIzYTogcnR3X2lmX3VwMjNhIGZhaWxcbiIpOwogCQlnb3RvIGRyb3BfcGFja2V0OwogCX0KIApAQCAtMTM5LDE2ICsxMzksMTYgQEAKIAogCXB4bWl0cHJpdi0+dHhfcGt0cysrOwogCVJUX1RSQUNFKF9tb2R1bGVfeG1pdF9vc2RlcF9jXywgX2Rydl9pbmZvXywKLQkJICgicnR3X3htaXQyM2FfZW50cnkyM2E6IHR4X3BrdHM9JWRcbiIsCi0JCSAodTMyKXB4bWl0cHJpdi0+dHhfcGt0cykpOworCQkgInJ0d194bWl0MjNhX2VudHJ5MjNhOiB0eF9wa3RzPSVkXG4iLAorCQkgKHUzMilweG1pdHByaXYtPnR4X3BrdHMpOwogCWdvdG8gZXhpdDsKIAogZHJvcF9wYWNrZXQ6CiAJcHhtaXRwcml2LT50eF9kcm9wKys7CiAJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAlSVF9UUkFDRShfbW9kdWxlX3htaXRfb3NkZXBfY18sIF9kcnZfbm90aWNlXywKLQkJICgicnR3X3htaXQyM2FfZW50cnkyM2E6IGRyb3AsIHR4X2Ryb3A9JWRcbiIsCi0JCSAodTMyKXB4bWl0cHJpdi0+dHhfZHJvcCkpOworCQkgInJ0d194bWl0MjNhX2VudHJ5MjNhOiBkcm9wLCB0eF9kcm9wPSVkXG4iLAorCQkgKHUzMilweG1pdHByaXYtPnR4X2Ryb3ApOwogZXhpdDoKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvTWFrZWZpbGUKaW5kZXggMTdiNDQ3MS4uZjdmZDAzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvTWFrZWZpbGUKQEAgLTMsNCArMyw0IEBACiBjY2ZsYWdzLXkgOj0gLUlkcml2ZXJzL3Njc2kKIAogcnRzNTIwOC15IDo9IHJ0c3gubyBydHN4X2NoaXAubyBydHN4X3RyYW5zcG9ydC5vIHJ0c3hfc2NzaS5vIFwKLQlydHN4X2NhcmQubyBnZW5lcmFsLm8gc2QubyB4ZC5vIG1zLm8gc3BpLm8KKwlydHN4X2NhcmQubyBnZW5lcmFsLm8gc2QubyB4ZC5vIG1zLm8gc3BpLm8gdHJhY2UubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmMKaW5kZXggYTQ3YTE5MS4uZWU4MThiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5jCkBAIC0yNiw5ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSAicnRzeC5oIgotI2luY2x1ZGUgInJ0c3hfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAicnRzeF9zY3NpLmgiCi0jaW5jbHVkZSAicnRzeF9jYXJkLmgiCiAjaW5jbHVkZSAibXMuaCIKIAogc3RhdGljIGlubGluZSB2b2lkIG1zX3NldF9lcnJfY29kZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBlcnJfY29kZSkKQEAgLTQ3LDcgKzQ0LDggQEAKIAogc3RhdGljIGludCBtc19wYXJzZV9lcnJfY29kZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewotCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CiAKIHN0YXRpYyBpbnQgbXNfdHJhbnNmZXJfdHBjKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IHRyYW5zX21vZGUsCkBAIC03OCw3ICs3Niw4IEBACiAJaWYgKHJldHZhbCA8IDApIHsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKIAkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX1RPX0VSUk9SKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApOwogCX0KIAogCXB0ciA9IHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApICsgMTsKQEAgLTg2LDEzICs4NSwxNSBAQAogCWlmICghKHRwYyAmIDB4MDgpKSB7CQkvKiBSZWFkIFBhY2tldCAqLwogCQlpZiAoKnB0ciAmIE1TX0NSQzE2X0VSUikgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NSQzE2X0VSUk9SKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBtc19wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApOwogCQl9CiAJfSBlbHNlIHsJCQkvKiBXcml0ZSBQYWNrZXQgKi8KIAkJaWYgKENIS19NU1BSTyhtc19jYXJkKSAmJiAhKCpwdHIgJiAweDgwKSkgewogCQkJaWYgKCpwdHIgJiAoTVNfSU5UX0VSUiB8IE1TX0lOVF9DTUROSykpIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApOwogCQkJfQogCQl9CiAJfQpAQCAtMTAwLDIyICsxMDEsMjUgQEAKIAlpZiAoKnB0ciAmIE1TX1JEWV9USU1FT1VUKSB7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7CiAJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19UT19FUlJPUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBtc19wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBtc19wYXJzZV9lcnJfY29kZShjaGlwKTsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIHN0YXRpYyBpbnQgbXNfdHJhbnNmZXJfZGF0YShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCB0cmFuc19tb2RlLAotCQkJdTggdHBjLCB1MTYgc2VjX2NudCwgdTggY2ZnLCBpbnQgbW9kZV8yaywKKwkJCXU4IHRwYywgdTE2IHNlY19jbnQsIHU4IGNmZywgYm9vbCBtb2RlXzJrLAogCQkJaW50IHVzZV9zZywgdm9pZCAqYnVmLCBpbnQgYnVmX2xlbikKIHsKIAlpbnQgcmV0dmFsOwogCXU4IHZhbCwgZXJyX2NvZGUgPSAwOwogCWVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcjsKIAotCWlmICghYnVmIHx8ICFidWZfbGVuKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICghYnVmIHx8ICFidWZfbGVuKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAodHJhbnNfbW9kZSA9PSBNU19UTV9BVVRPX1JFQUQpIHsKIAkJZGlyID0gRE1BX0ZST01fREVWSUNFOwpAQCAtMTI0LDcgKzEyOCw4IEBACiAJCWRpciA9IERNQV9UT19ERVZJQ0U7CiAJCWVycl9jb2RlID0gTVNfRkxBU0hfV1JJVEVfRVJST1I7CiAJfSBlbHNlIHsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CkBAIC0xNjAsMTIgKzE2NSwxOSBAQAogCQllbHNlCiAJCQlyZXR2YWwgPSBTVEFUVVNfRkFJTDsKIAotCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKIAl9CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIE1TX1RSQU5TX0NGRywgJnZhbCk7Ci0JaWYgKHZhbCAmIChNU19JTlRfQ01ETksgfCBNU19JTlRfRVJSIHwgTVNfQ1JDMTZfRVJSIHwgTVNfUkRZX1RJTUVPVVQpKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBNU19UUkFOU19DRkcsICZ2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJaWYgKHZhbCAmIChNU19JTlRfQ01ETksgfCBNU19JTlRfRVJSIHwgTVNfQ1JDMTZfRVJSIHwgTVNfUkRZX1RJTUVPVVQpKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0xNzYsOCArMTg4LDEwIEBACiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOwogCWludCByZXR2YWwsIGk7CiAKLQlpZiAoIWRhdGEgfHwgKGRhdGFfbGVuIDwgY250KSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJaWYgKCFkYXRhIHx8IChkYXRhX2xlbiA8IGNudCkpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19FUlJPUjsKKwl9CiAKIAlydHN4X2luaXRfY21kKGNoaXApOwogCkBAIC0yMTEsMjUgKzIyNSwyOCBAQAogCQlpZiAoISh0cGMgJiAweDA4KSkgewogCQkJaWYgKHZhbCAmIE1TX0NSQzE2X0VSUikgewogCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DUkMxNl9FUlJPUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBtc19wYXJzZV9lcnJfY29kZShjaGlwKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmIChDSEtfTVNQUk8obXNfY2FyZCkgJiYgISh2YWwgJiAweDgwKSkgewogCQkJCWlmICh2YWwgJiAoTVNfSU5UX0VSUiB8IE1TX0lOVF9DTUROSykpIHsKIAkJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NNRF9OSyk7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLAotCQkJCQkJbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCk7CiAJCQkJfQogCQkJfQogCQl9CiAKIAkJaWYgKHZhbCAmIE1TX1JEWV9USU1FT1VUKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCk7CiAJCX0KIAogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOwotCQlUUkFDRV9SRVQoY2hpcCwgbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCkpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCk7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMjQyLDggKzI1OSwxMCBAQAogCWludCByZXR2YWwsIGk7CiAJdTggKnB0cjsKIAotCWlmICghZGF0YSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJaWYgKCFkYXRhKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRVJST1I7CisJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtMjc3LDI1ICsyOTYsMjggQEAKIAkJaWYgKCEodHBjICYgMHgwOCkpIHsKIAkJCWlmICh2YWwgJiBNU19DUkMxNl9FUlIpIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ1JDMTZfRVJST1IpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBtc19wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gbXNfcGFyc2VfZXJyX2NvZGUoY2hpcCk7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoQ0hLX01TUFJPKG1zX2NhcmQpICYmICEodmFsICYgMHg4MCkpIHsKIAkJCQlpZiAodmFsICYgKE1TX0lOVF9FUlIgfCBNU19JTlRfQ01ETkspKSB7CiAJCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19DTURfTkspOwotCQkJCQlUUkFDRV9SRVQoY2hpcCwKLQkJCQkJCW1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApOwogCQkJCX0KIAkJCX0KIAkJfQogCiAJCWlmICh2YWwgJiBNU19SRFlfVElNRU9VVCkgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX1RPX0VSUk9SKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBtc19wYXJzZV9lcnJfY29kZShjaGlwKSk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApOwogCQl9CiAKIAkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX1RPX0VSUk9SKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIG1zX3BhcnNlX2Vycl9jb2RlKGNoaXApOwogCX0KIAogCXB0ciA9IHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApICsgMTsKQEAgLTMzMSw3ICszNTMsOCBAQAogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwogCX0KIAotCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CiAKIHN0YXRpYyBpbnQgbXNfc2VuZF9jbWQoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggY21kLCB1OCBjZmcpCkBAIC0zNjksMTIgKzM5MiwxNiBAQAogCX0KIAogCXJldHZhbCA9IHN3aXRjaF9jbG9jayhjaGlwLCBtc19jYXJkLT5tc19jbG9jayk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzZWxlY3RfY2FyZChjaGlwLCBNU19DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTM4NSwzNyArNDEyLDg3IEBACiAJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IHNlbGVjdF9jYXJkKGNoaXAsIE1TX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc3dpdGNoX2Nsb2NrKGNoaXAsIG1zX2NhcmQtPm1zX2Nsb2NrKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAogc3RhdGljIGludCBtc19wdWxsX2N0bF9kaXNhYmxlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CisJaW50IHJldHZhbDsKKwogCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMSwgMHhGRiwKLQkJCU1TX0QxX1BEIHwgTVNfRDJfUEQgfCBNU19DTEtfUEQgfCBNU19ENl9QRCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwyLCAweEZGLAotCQkJTVNfRDNfUEQgfCBNU19EMF9QRCB8IE1TX0JTX1BEIHwgWERfRDRfUEQpOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMywgMHhGRiwKLQkJCU1TX0Q3X1BEIHwgWERfQ0VfUEQgfCBYRF9DTEVfUEQgfCBYRF9DRF9QVSk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEw0LCAweEZGLAotCQkJWERfUkRZX1BEIHwgU0RfRDNfUEQgfCBTRF9EMl9QRCB8IFhEX0FMRV9QRCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEw1LCAweEZGLAotCQkJTVNfSU5TX1BVIHwgU0RfV1BfUEQgfCBTRF9DRF9QVSB8IFNEX0NNRF9QRCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEw2LCAweEZGLAotCQkJTVNfRDVfUEQgfCBNU19ENF9QRCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDEsIDB4RkYsCisJCQkJCSAgICAgTVNfRDFfUEQgfCBNU19EMl9QRCB8IE1TX0NMS19QRCB8IE1TX0Q2X1BEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMiwgMHhGRiwKKwkJCQkJICAgICBNU19EM19QRCB8IE1TX0QwX1BEIHwgTVNfQlNfUEQgfCBYRF9ENF9QRCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDMsIDB4RkYsCisJCQkJCSAgICAgTVNfRDdfUEQgfCBYRF9DRV9QRCB8IFhEX0NMRV9QRCB8IFhEX0NEX1BVKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMNCwgMHhGRiwKKwkJCQkJICAgICBYRF9SRFlfUEQgfCBTRF9EM19QRCB8IFNEX0QyX1BEIHwgWERfQUxFX1BEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMNSwgMHhGRiwKKwkJCQkJICAgICBNU19JTlNfUFUgfCBTRF9XUF9QRCB8IFNEX0NEX1BVIHwgU0RfQ01EX1BEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMNiwgMHhGRiwKKwkJCQkJICAgICBNU19ENV9QRCB8IE1TX0Q0X1BEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9IGVsc2UgaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpKSB7CiAJCWlmIChDSEVDS19CQVJPX1BLRyhjaGlwLCBRRk4pKSB7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMSwgMHhGRiwgMHg1NSk7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMiwgMHhGRiwgMHg1NSk7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMywgMHhGRiwgMHg0Qik7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMNCwgMHhGRiwgMHg2OSk7CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwxLAorCQkJCQkJICAgICAweEZGLCAweDU1KTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwyLAorCQkJCQkJICAgICAweEZGLCAweDU1KTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwzLAorCQkJCQkJICAgICAweEZGLCAweDRCKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw0LAorCQkJCQkJICAgICAweEZGLCAweDY5KTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTQ1NSw4ICs1MzIsMTAgQEAKIAl9CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIE1TX0NBUkQsIDEwMCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTQ3NSwyOSArNTU0LDQxIEBACiAJbXNfY2FyZC0+cHJvX3VuZGVyX2Zvcm1hdHRpbmcgPSAwOwogCiAJcmV0dmFsID0gbXNfcG93ZXJfb2ZmX2NhcmQzdjMoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoIWNoaXAtPmZ0Ml9mYXN0X21vZGUpCiAJCXdhaXRfdGltZW91dCgyNTApOwogCiAJcmV0dmFsID0gZW5hYmxlX2NhcmRfY2xvY2soY2hpcCwgTVNfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CiAJCXJldHZhbCA9IG1zX3B1bGxfY3RsX2VuYWJsZShjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9IGVsc2UgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBGUEdBX1BVTExfQ1RMLAotCQkJRlBHQV9NU19QVUxMX0NUTF9CSVQgfCAweDIwLCAwKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBGUEdBX1BVTExfQ1RMLAorCQkJCQkgICAgIEZQR0FfTVNfUFVMTF9DVExfQklUIHwgMHgyMCwgMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfQogCiAJaWYgKCFjaGlwLT5mdDJfZmFzdF9tb2RlKSB7CiAJCXJldHZhbCA9IGNhcmRfcG93ZXJfb24oY2hpcCwgTVNfQ0FSRCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJd2FpdF90aW1lb3V0KDE1MCk7CiAKQEAgLTUxMCwzMCArNjAxLDUyIEBACiAJCWlmIChjaGlwLT5vY3Bfc3RhdCAmIG9jX21hc2spIHsKIAkJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJPdmVyIGN1cnJlbnQsIE9DUFNUQVQgaXMgMHgleFxuIiwKIAkJCQljaGlwLT5vY3Bfc3RhdCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogI2VuZGlmCiAJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9PRSwgTVNfT1VUUFVUX0VOLCBNU19PVVRQVVRfRU4pOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9PRSwgTVNfT1VUUFVUX0VOLAorCQkJCSAgICAgTVNfT1VUUFVUX0VOKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKGNoaXAtPmFzaWNfY29kZSkgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBNU19DRkcsIDB4RkYsCi0JCQlTQU1QTEVfVElNRV9SSVNJTkcgfCBQVVNIX1RJTUVfREVGQVVMVCB8Ci0JCQlOT19FWFRFTkRfVE9HR0xFIHwgTVNfQlVTX1dJRFRIXzEpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1TX0NGRywgMHhGRiwKKwkJCQkJICAgICBTQU1QTEVfVElNRV9SSVNJTkcgfCBQVVNIX1RJTUVfREVGQVVMVCB8IE5PX0VYVEVORF9UT0dHTEUgfCBNU19CVVNfV0lEVEhfMSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfSBlbHNlIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgTVNfQ0ZHLCAweEZGLAotCQkJU0FNUExFX1RJTUVfRkFMTElORyB8IFBVU0hfVElNRV9ERUZBVUxUIHwKLQkJCU5PX0VYVEVORF9UT0dHTEUgfCBNU19CVVNfV0lEVEhfMSk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgTVNfQ0ZHLCAweEZGLAorCQkJCQkgICAgIFNBTVBMRV9USU1FX0ZBTExJTkcgfCBQVVNIX1RJTUVfREVGQVVMVCB8IE5PX0VYVEVORF9UT0dHTEUgfCBNU19CVVNfV0lEVEhfMSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfQotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIE1TX1RSQU5TX0NGRywKLQkJMHhGRiwgTk9fV0FJVF9JTlQgfCBOT19BVVRPX1JFQURfSU5UX1JFRyk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9TVE9QLAotCQlNU19TVE9QIHwgTVNfQ0xSX0VSUiwgTVNfU1RPUCB8IE1TX0NMUl9FUlIpOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAweEZGLAorCQkJCSAgICAgTk9fV0FJVF9JTlQgfCBOT19BVVRPX1JFQURfSU5UX1JFRyk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfU1RPUCwgTVNfU1RPUCB8IE1TX0NMUl9FUlIsCisJCQkJICAgICBNU19TVE9QIHwgTVNfQ0xSX0VSUik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHZhbCA9IG1zX3NldF9pbml0X3BhcmEoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC01NDUsOCArNjU4LDEwIEBACiAJdTggdmFsOwogCiAJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIFByb19TdGF0dXNSZWcsIDYsIFN5c3RlbVBhcm0sIDEpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IE1TX01BWF9SRVRSWV9DT1VOVDsgaSsrKSB7CiAJCXJldHZhbCA9IG1zX3RyYW5zZmVyX3RwYyhjaGlwLCBNU19UTV9SRUFEX0JZVEVTLCBSRUFEX1JFRywKQEAgLTU1NCwyOSArNjY5LDQ5IEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBQUEJVRl9CQVNFMiArIDIsICZ2YWwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBQUEJVRl9CQVNFMiArIDIsICZ2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlR5cGUgcmVnaXN0ZXI6IDB4JXhcbiIsIHZhbCk7CiAJaWYgKHZhbCAhPSAweDAxKSB7CiAJCWlmICh2YWwgIT0gMHgwMikKIAkJCW1zX2NhcmQtPmNoZWNrX21zX2Zsb3cgPSAxOwogCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFBQQlVGX0JBU0UyICsgNCwgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBQQlVGX0JBU0UyICsgNCwgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiQ2F0ZWdvcnkgcmVnaXN0ZXI6IDB4JXhcbiIsIHZhbCk7CiAJaWYgKHZhbCAhPSAwKSB7CiAJCW1zX2NhcmQtPmNoZWNrX21zX2Zsb3cgPSAxOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBQUEJVRl9CQVNFMiArIDUsICZ2YWwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBQUEJVRl9CQVNFMiArIDUsICZ2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIkNsYXNzIHJlZ2lzdGVyOiAweCV4XG4iLCB2YWwpOwogCWlmICh2YWwgPT0gMCkgewotCQlSVFNYX1JFQURfUkVHKGNoaXAsIFBQQlVGX0JBU0UyLCAmdmFsKTsKKwkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBQQlVGX0JBU0UyLCAmdmFsKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAkJaWYgKHZhbCAmIFdSVF9QUlRDVCkKIAkJCWNoaXAtPmNhcmRfd3AgfD0gTVNfQ0FSRDsKIAkJZWxzZQpAQCAtNTg2LDEyICs3MjEsMTcgQEAKIAkJY2hpcC0+Y2FyZF93cCB8PSBNU19DQVJEOwogCX0gZWxzZSB7CiAJCW1zX2NhcmQtPmNoZWNrX21zX2Zsb3cgPSAxOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJbXNfY2FyZC0+bXNfdHlwZSB8PSBUWVBFX01TUFJPOwogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBQUEJVRl9CQVNFMiArIDMsICZ2YWwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBQUEJVRl9CQVNFMiArIDMsICZ2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIklGIE1vZGUgcmVnaXN0ZXI6IDB4JXhcbiIsIHZhbCk7CiAJaWYgKHZhbCA9PSAwKSB7CiAJCW1zX2NhcmQtPm1zX3R5cGUgJj0gMHgwRjsKQEAgLTYwMiw3ICs3NDIsOCBAQAogCQkJbXNfY2FyZC0+bXNfdHlwZSAmPSAweDBGOwogCiAJfSBlbHNlIHsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTYxOCw3ICs3NTksOCBAQAogCWRvIHsKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIE1TX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fQ0FSRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBNU19NQVhfUkVUUllfQ09VTlQ7IGkrKykgewpAQCAtNjI3LDExICs3NjksMTUgQEAKIAkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQkJYnJlYWs7CiAJCX0KLQkJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKLQkJaWYgKGsgPiAxMDApCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAoayA+IDEwMCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWsrKzsKIAkJd2FpdF90aW1lb3V0KDEwMCk7CkBAIC02NDIsMTQgKzc4OCwxOCBAQAogCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQogCQkJYnJlYWs7CiAJfQotCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICh2YWwgJiBJTlRfUkVHX0VSUikgewogCQlpZiAodmFsICYgSU5UX1JFR19DTUROSykKIAkJCWNoaXAtPmNhcmRfd3AgfD0gKE1TX0NBUkQpOwotCQllbHNlCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQllbHNlIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAJLyogLS0gIGVuZCBjb25maXJtIENQVSBzdGFydHVwICovCiAKQEAgLTY2OSw4ICs4MTksMTAgQEAKIAkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCX0KLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTY4OSwyMSArODQxLDMxIEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBNU19DRkcsIDB4OTgsCi0JCU1TX0JVU19XSURUSF84IHwgU0FNUExFX1RJTUVfRkFMTElORyk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBNU19DRkcsIDB4OTgsCisJCQkJICAgICBNU19CVVNfV0lEVEhfOCB8IFNBTVBMRV9USU1FX0ZBTExJTkcpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJbXNfY2FyZC0+bXNfdHlwZSB8PSBNU184QklUOwogCXJldHZhbCA9IG1zX3NldF9pbml0X3BhcmEoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTVNfTUFYX1JFVFJZX0NPVU5UOyBpKyspIHsKIAkJcmV0dmFsID0gbXNfdHJhbnNmZXJfdHBjKGNoaXAsIE1TX1RNX1JFQURfQllURVMsIEdFVF9JTlQsCiAJCQkJCTEsIE5PX1dBSVRfSU5UKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC03MTYsMjIgKzg3OCwyOSBAQAogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQlyZXR2YWwgPSBtc19wcmVwYXJlX3Jlc2V0KGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJldHZhbCA9IG1zX2lkZW50aWZ5X21lZGlhX3R5cGUoY2hpcCwgc3dpdGNoXzhiaXRfYnVzKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlyZXR2YWwgPSBtc19jb25maXJtX2NwdV9zdGFydHVwKGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJldHZhbCA9IG1zX3N3aXRjaF9wYXJhbGxlbF9idXMoY2hpcCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBNU19DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19DQVJEKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJY29udGludWU7CiAJCX0gZWxzZSB7CkBAIC03MzksMjMgKzkwOCwzNyBAQAogCQl9CiAJfQogCi0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAkvKiBTd2l0Y2ggTVMtUFJPIGludG8gUGFyYWxsZWwgbW9kZSAqLwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIE1TX0NGRywgMHgxOCwgTVNfQlVTX1dJRFRIXzQpOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIE1TX0NGRywgUFVTSF9USU1FX09ERCwgUFVTSF9USU1FX09ERCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBNU19DRkcsIDB4MTgsIE1TX0JVU19XSURUSF80KTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgTVNfQ0ZHLCBQVVNIX1RJTUVfT0RELAorCQkJCSAgICAgUFVTSF9USU1FX09ERCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHZhbCA9IG1zX3NldF9pbml0X3BhcmEoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAkvKiBJZiBNU1BybyBIRyBDYXJkLCBXZSBzaGFsbCB0cnkgdG8gc3dpdGNoIHRvIDgtYml0IGJ1cyAqLwogCWlmIChDSEtfTVNIRyhtc19jYXJkKSAmJiBjaGlwLT5zdXBwb3J0X21zXzhiaXQgJiYgc3dpdGNoXzhiaXRfYnVzKSB7CiAJCXJldHZhbCA9IG1zX3N3aXRjaF84Yml0X2J1cyhjaGlwKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJbXNfY2FyZC0+c3dpdGNoXzhiaXRfZmFpbCA9IDE7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIApAQCAtNzcxLDggKzk1NCwxMCBAQAogCW1zX2NsZWFudXBfd29yayhjaGlwKTsKIAogCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCAwLCAwLCBQcm9fRGF0YUNvdW50MSwgNik7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlidWZbMF0gPSAwOwogCWJ1ZlsxXSA9IG1vZGU7CkBAIC03ODIsMTYgKzk2NywyNiBAQAogCWJ1Zls1XSA9IDA7CiAKIAlyZXR2YWwgPSBtc193cml0ZV9ieXRlcyhjaGlwLCBQUk9fV1JJVEVfUkVHLCA2LCBOT19XQUlUX0lOVCwgYnVmLCA2KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIFhDX0NIR19QT1dFUiwgV0FJVF9JTlQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBNU19UUkFOU19DRkcsIGJ1Zik7Ci0JaWYgKGJ1ZlswXSAmIChNU19JTlRfQ01ETksgfCBNU19JTlRfRVJSKSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgTVNfVFJBTlNfQ0ZHLCBidWYpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJaWYgKGJ1ZlswXSAmIChNU19JTlRfQ01ETksgfCBNU19JTlRfRVJSKSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtODEzLDggKzEwMDgsMTAgQEAKICNlbmRpZgogCiAJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIFByb19JbnRSZWcsIDIsIFByb19TeXN0ZW1QYXJtLCA3KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChDSEtfTVM4QklUKG1zX2NhcmQpKQogCQlkYXRhWzBdID0gUEFSQUxMRUxfOEJJVF9JRjsKQEAgLTgzNiwxMiArMTAzMywxNiBAQAogCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQogCQkJYnJlYWs7CiAJfQotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJYnVmID0ga21hbGxvYyg2NCAqIDUxMiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19FUlJPUjsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTVNfTUFYX1JFVFJZX0NPVU5UOyBpKyspIHsKIAkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgUFJPX1JFQURfQVRSQiwgV0FJVF9JTlQpOwpAQCAtODUxLDExICsxMDUyLDEzIEBACiAJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBNU19UUkFOU19DRkcsICZ2YWwpOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlrZnJlZShidWYpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAkJaWYgKCEodmFsICYgTVNfSU5UX0JSRVEpKSB7CiAJCQlrZnJlZShidWYpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAkJcmV0dmFsID0gbXNfdHJhbnNmZXJfZGF0YShjaGlwLCBNU19UTV9BVVRPX1JFQUQsCiAJCQkJCVBST19SRUFEX0xPTkdfREFUQSwgMHg0MCwgV0FJVF9JTlQsCkBAIC04NjcsNyArMTA3MCw4IEBACiAJfQogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJa2ZyZWUoYnVmKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWkgPSAwOwpAQCAtODc1LDcgKzEwNzksOCBAQAogCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgTVNfVFJBTlNfQ0ZHLCAmdmFsKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJa2ZyZWUoYnVmKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJaWYgKCh2YWwgJiBNU19JTlRfQ0VEKSB8fCAhKHZhbCAmIE1TX0lOVF9CUkVRKSkKQEAgLTg4NSw3ICsxMDkwLDggQEAKIAkJCQkJUFJPX1JFQURfTE9OR19EQVRBLCAwLCBXQUlUX0lOVCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWtmcmVlKGJ1Zik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCWkrKzsKQEAgLTg5MywxOCArMTA5OSwyMSBAQAogCiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlrZnJlZShidWYpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKChidWZbMF0gIT0gMHhhNSkgJiYgKGJ1ZlsxXSAhPSAweGMzKSkgewogCQkvKiBTaWduYXR1cmUgY29kZSBpcyB3cm9uZyAqLwogCQlrZnJlZShidWYpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKChidWZbNF0gPCAxKSB8fCAoYnVmWzRdID4gMTIpKSB7CiAJCWtmcmVlKGJ1Zik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgYnVmWzRdOyBpKyspIHsKQEAgLTkyOSwxNSArMTEzOCwxOCBAQAogCQkJCXN5c19pbmZvX2FkZHIsIHN5c19pbmZvX3NpemUpOwogCQkJaWYgKHN5c19pbmZvX3NpemUgIT0gOTYpICB7CiAJCQkJa2ZyZWUoYnVmKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJaWYgKHN5c19pbmZvX2FkZHIgPCAweDFBMCkgewogCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCWlmICgoc3lzX2luZm9fc2l6ZSArIHN5c19pbmZvX2FkZHIpID4gMHg4MDAwKSB7CiAJCQkJa2ZyZWUoYnVmKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAjaWZkZWYgU1VQUE9SVF9NU1hDCkBAIC05NjQsMTUgKzExNzYsMTggQEAKIAkJCQltb2RlbF9uYW1lX2FkZHIsIG1vZGVsX25hbWVfc2l6ZSk7CiAJCQlpZiAobW9kZWxfbmFtZV9zaXplICE9IDQ4KSAgewogCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCWlmIChtb2RlbF9uYW1lX2FkZHIgPCAweDFBMCkgewogCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCWlmICgobW9kZWxfbmFtZV9zaXplICsgbW9kZWxfbmFtZV9hZGRyKSA+IDB4ODAwMCkgewogCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAogCQkJZm91bmRfbW9kZWxfbmFtZSA9IDE7CkBAIC05ODUsNyArMTIwMCw4IEBACiAKIAlpZiAoaSA9PSBidWZbNF0pIHsKIAkJa2ZyZWUoYnVmKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWNsYXNzX2NvZGUgPSAgYnVmW3N5c19pbmZvX2FkZHIgKyAwXTsKQEAgLTEwMzAsMTUgKzEyNDYsMjEgQEAKIAogI2lmZGVmIFNVUFBPUlRfTVNYQwogCWlmIChDSEtfTVNYQyhtc19jYXJkKSkgewotCQlpZiAoY2xhc3NfY29kZSAhPSAweDAzKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKGNsYXNzX2NvZGUgIT0gMHgwMykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0gZWxzZSB7Ci0JCWlmIChjbGFzc19jb2RlICE9IDB4MDIpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAoY2xhc3NfY29kZSAhPSAweDAyKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogI2Vsc2UKLQlpZiAoY2xhc3NfY29kZSAhPSAweDAyKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChjbGFzc19jb2RlICE9IDB4MDIpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KICNlbmRpZgogCiAJaWYgKGRldmljZV90eXBlICE9IDB4MDApIHsKQEAgLTEwNDYsMTIgKzEyNjgsMTUgQEAKIAkJCQkoZGV2aWNlX3R5cGUgPT0gMHgwMykpIHsKIAkJCWNoaXAtPmNhcmRfd3AgfD0gTVNfQ0FSRDsKIAkJfSBlbHNlIHsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfQogCi0JaWYgKHN1Yl9jbGFzcyAmIDB4QzApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHN1Yl9jbGFzcyAmIDB4QzApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJjbGFzc19jb2RlOiAweCV4LCBkZXZpY2VfdHlwZTogMHgleCwgc3ViX2NsYXNzOiAweCV4XG4iLAogCQljbGFzc19jb2RlLCBkZXZpY2VfdHlwZSwgc3ViX2NsYXNzKTsKQEAgLTEwOTksMTYgKzEzMjQsMjEgQEAKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCWlmIChtc19jYXJkLT5zd2l0Y2hfOGJpdF9mYWlsKSB7CiAJCQlyZXR2YWwgPSBtc19wcm9fcmVzZXRfZmxvdyhjaGlwLCAwKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAkJfSBlbHNlIHsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfQogCiAJcmV0dmFsID0gbXNfcmVhZF9hdHRyaWJ1dGVfaW5mbyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogI2lmZGVmIFhDX1BPV0VSQ0xBU1MKIAlpZiAoQ0hLX0hHOEJJVChtc19jYXJkKSkKQEAgLTExNDgsOCArMTM3OCwxMCBAQAogCiAjaWZkZWYgU1VQUE9SVF9NQUdJQ19HQVRFCiAJcmV0dmFsID0gbWdfc2V0X3RwY19wYXJhX3N1YihjaGlwLCAwLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KICNlbmRpZgogCiAJaWYgKENIS19IRzhCSVQobXNfY2FyZCkpCkBAIC0xMTY2LDE2ICsxMzk4LDIxIEBACiAJdTggdmFsWzJdOwogCiAJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIFN0YXR1c1JlZzAsIDIsIDAsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBSRUFEX1JFRywgMiwgTk9fV0FJVF9JTlQsIHZhbCwgMik7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAodmFsWzFdICYgKFNUU19VQ0RUIHwgU1RTX1VDRVggfCBTVFNfVUNGRykpIHsKIAkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1JFQURfRVJST1IpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMTE5MSw4ICsxNDI4LDEwIEBACiAKIAlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwKIAkJCQlTeXN0ZW1QYXJtLCA2KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKSB7CiAJCS8qIFBhcmFsbGVsIGludGVyZmFjZSAqLwpAQCAtMTIxMyw4ICsxNDUyLDEwIEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIApAQCAtMTIyMywzNSArMTQ2NCw0NiBAQAogCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQogCQkJYnJlYWs7CiAJfQotCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAodmFsICYgSU5UX1JFR19DTUROSykgewogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAlpZiAodmFsICYgSU5UX1JFR19DRUQpIHsKIAkJaWYgKHZhbCAmIElOVF9SRUdfRVJSKSB7CiAJCQlyZXR2YWwgPSBtc19yZWFkX3N0YXR1c19yZWcoY2hpcCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAKIAkJCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLAogCQkJCQkJTVNfRVhUUkFfU0laRSwgU3lzdGVtUGFybSwgNik7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAJCX0KIAl9CiAKIAlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIFJFQURfUkVHLCBNU19FWFRSQV9TSVpFLCBOT19XQUlUX0lOVCwKIAkJCWRhdGEsIE1TX0VYVFJBX1NJWkUpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKGJ1ZiAmJiBidWZfbGVuKSB7CiAJCWlmIChidWZfbGVuID4gTVNfRVhUUkFfU0laRSkKQEAgLTEyNjksMTMgKzE1MjEsMTcgQEAKIAlpbnQgcmV0dmFsLCBpOwogCXU4IHZhbCwgZGF0YVsxNl07CiAKLQlpZiAoIWJ1ZiB8fCAoYnVmX2xlbiA8IE1TX0VYVFJBX1NJWkUpKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICghYnVmIHx8IChidWZfbGVuIDwgTVNfRVhUUkFfU0laRSkpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLCBNU19FWFRSQV9TSVpFLAogCQkJCVN5c3RlbVBhcm0sIDYgKyBNU19FWFRSQV9TSVpFKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChDSEtfTVM0QklUKG1zX2NhcmQpKQogCQlkYXRhWzBdID0gMHg4ODsKQEAgLTEyOTMsMjYgKzE1NDksMzQgQEAKIAogCXJldHZhbCA9IG1zX3dyaXRlX2J5dGVzKGNoaXAsIFdSSVRFX1JFRywgKDYgKyBNU19FWFRSQV9TSVpFKSwKIAkJCQlOT19XQUlUX0lOVCwgZGF0YSwgMTYpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfV1JJVEUsIFdBSVRfSU5UKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAodmFsICYgSU5UX1JFR19DTUROSykgewogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAlpZiAodmFsICYgSU5UX1JFR19DRUQpIHsKIAkJaWYgKHZhbCAmIElOVF9SRUdfRVJSKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfV1JJVEVfRVJST1IpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKQEAgLTEzMjgsOCArMTU5MiwxMCBAQAogCiAJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIE92ZXJ3cml0ZUZsYWcsIE1TX0VYVFJBX1NJWkUsCiAJCQkJU3lzdGVtUGFybSwgNik7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoQ0hLX01TNEJJVChtc19jYXJkKSkKIAkJZGF0YVswXSA9IDB4ODg7CkBAIC0xMzQzLDI4ICsxNjA5LDM2IEBACiAJZGF0YVs1XSA9IHBhZ2VfbnVtOwogCiAJcmV0dmFsID0gbXNfd3JpdGVfYnl0ZXMoY2hpcCwgV1JJVEVfUkVHLCA2LCBOT19XQUlUX0lOVCwgZGF0YSwgNik7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBCTE9DS19SRUFELCBXQUlUX0lOVCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOwogCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsICZ2YWwsIDEpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKHZhbCAmIElOVF9SRUdfQ01ETkspIHsKIAkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NNRF9OSyk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAodmFsICYgSU5UX1JFR19DRUQpIHsKIAkJaWYgKHZhbCAmIElOVF9SRUdfRVJSKSB7CiAJCQlpZiAoISh2YWwgJiBJTlRfUkVHX0JSRVEpKSB7CiAJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsICBNU19GTEFTSF9SRUFEX0VSUk9SKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJcmV0dmFsID0gbXNfcmVhZF9zdGF0dXNfcmVnKGNoaXApOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKQEAgLTEzNzMsMTggKzE2NDcsMjMgQEAKIAkJfSBlbHNlIHsKIAkJCWlmICghKHZhbCAmIElOVF9SRUdfQlJFUSkpIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQlJFUV9FUlJPUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCX0KIAogCXJldHZhbCA9IG1zX3RyYW5zZmVyX3RwYyhjaGlwLCBNU19UTV9OT1JNQUxfUkVBRCwgUkVBRF9QQUdFX0RBVEEsCiAJCQkJMCwgTk9fV0FJVF9JTlQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JaWYgKG1zX2NoZWNrX2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAobXNfY2hlY2tfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfV1JJVEVfRVJST1IpKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0xMzk3LDEzICsxNjc2LDE3IEBACiAJdTggdmFsLCBkYXRhWzhdLCBleHRyYVtNU19FWFRSQV9TSVpFXTsKIAogCXJldHZhbCA9IG1zX3JlYWRfZXh0cmFfZGF0YShjaGlwLCBwaHlfYmxrLCAwLCBleHRyYSwgTVNfRVhUUkFfU0laRSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwKIAkJCQlTeXN0ZW1QYXJtLCA3KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAKQEAgLTE0MjEsMjcgKzE3MDQsMzUgQEAKIAlkYXRhWzddID0gMHhGRjsKIAogCXJldHZhbCA9IG1zX3dyaXRlX2J5dGVzKGNoaXAsIFdSSVRFX1JFRywgNywgTk9fV0FJVF9JTlQsIGRhdGEsIDcpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfV1JJVEUsIFdBSVRfSU5UKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAodmFsICYgSU5UX1JFR19DTUROSykgewogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmICh2YWwgJiBJTlRfUkVHX0NFRCkgewogCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9XUklURV9FUlJPUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIApAQCAtMTQ1Nyw4ICsxNzQ4LDEwIEBACiAKIAlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwKIAkJCQlTeXN0ZW1QYXJtLCA2KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAKQEAgLTE0NzQsMTggKzE3NjcsMjQgQEAKIAlkYXRhWzVdID0gMDsKIAogCXJldHZhbCA9IG1zX3dyaXRlX2J5dGVzKGNoaXAsIFdSSVRFX1JFRywgNiwgTk9fV0FJVF9JTlQsIGRhdGEsIDYpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiBFUkFTRV9SVFk6CiAJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfRVJBU0UsIFdBSVRfSU5UKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAodmFsICYgSU5UX1JFR19DTUROSykgewogCQlpZiAoaSA8IDMpIHsKQEAgLTE0OTUsMTMgKzE3OTQsMTUgQEAKIAogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKIAkJbXNfc2V0X2JhZF9ibG9jayhjaGlwLCBwaHlfYmxrKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmICh2YWwgJiBJTlRfUkVHX0NFRCkgewogCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9XUklURV9FUlJPUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIApAQCAtMTU0NCwxMyArMTg0NSwxNiBAQAogCWZvciAoaSA9IHN0YXJ0X3BhZ2U7IGkgPCBlbmRfcGFnZTsgaSsrKSB7CiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBNU19DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0NBUkQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlyZXR2YWwgPSBtc193cml0ZV9leHRyYV9kYXRhKGNoaXAsIHBoeV9ibGssIGksCiAJCQkJCWV4dHJhLCBNU19FWFRSQV9TSVpFKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xNTYwLDcgKzE4NjQsOCBAQAogCQl1MTYgbG9nX2JsaywgdTggc3RhcnRfcGFnZSwgdTggZW5kX3BhZ2UpCiB7CiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOwotCWludCByZXR2YWwsIHJ0eV9jbnQsIHVuY29ycmVjdF9mbGFnID0gMDsKKwlib29sIHVuY29ycmVjdF9mbGFnID0gZmFsc2U7CisJaW50IHJldHZhbCwgcnR5X2NudDsKIAl1OCBleHRyYVtNU19FWFRSQV9TSVpFXSwgdmFsLCBpLCBqLCBkYXRhWzE2XTsKIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJDb3B5IHBhZ2UgZnJvbSAweCV4IHRvIDB4JXgsIGxvZ2ljYWwgYmxvY2sgaXMgMHgleFxuIiwKQEAgLTE1NjksNDIgKzE4NzQsNTggQEAKIAkJc3RhcnRfcGFnZSwgZW5kX3BhZ2UpOwogCiAJcmV0dmFsID0gbXNfcmVhZF9leHRyYV9kYXRhKGNoaXAsIG5ld19ibGssIDAsIGV4dHJhLCBNU19FWFRSQV9TSVpFKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IG1zX3JlYWRfc3RhdHVzX3JlZyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgUFBCVUZfQkFTRTIsICZ2YWwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBQUEJVRl9CQVNFMiwgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWlmICh2YWwgJiBCVUZfRlVMTCkgewogCQlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBDTEVBUl9CVUYsIFdBSVRfSU5UKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsIE5PX1dBSVRfSU5ULCAmdmFsLCAxKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlpZiAoISh2YWwgJiBJTlRfUkVHX0NFRCkpIHsKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9XUklURV9FUlJPUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0KIAogCWZvciAoaSA9IHN0YXJ0X3BhZ2U7IGkgPCBlbmRfcGFnZTsgaSsrKSB7CiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBNU19DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0NBUkQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQltc19yZWFkX2V4dHJhX2RhdGEoY2hpcCwgb2xkX2JsaywgaSwgZXh0cmEsIE1TX0VYVFJBX1NJWkUpOwogCiAJCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLAogCQkJCQlNU19FWFRSQV9TSVpFLCBTeXN0ZW1QYXJtLCA2KTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOwogCkBAIC0xNjIxLDM5ICsxOTQyLDQ4IEBACiAKIAkJcmV0dmFsID0gbXNfd3JpdGVfYnl0ZXMoY2hpcCwgV1JJVEVfUkVHLCA2LCBOT19XQUlUX0lOVCwKIAkJCQkJZGF0YSwgNik7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfUkVBRCwgV0FJVF9JTlQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAJCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgR0VUX0lOVCwgMSwgTk9fV0FJVF9JTlQsICZ2YWwsIDEpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWlmICh2YWwgJiBJTlRfUkVHX0NNRE5LKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJaWYgKHZhbCAmIElOVF9SRUdfQ0VEKSB7CiAJCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKIAkJCQlyZXR2YWwgPSBtc19yZWFkX3N0YXR1c19yZWcoY2hpcCk7CiAJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCQl1bmNvcnJlY3RfZmxhZyA9IDE7CisJCQkJCXVuY29ycmVjdF9mbGFnID0gdHJ1ZTsKIAkJCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlVuY29ycmVjdGFibGUgZXJyb3JcbiIpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXVuY29ycmVjdF9mbGFnID0gMDsKKwkJCQkJdW5jb3JyZWN0X2ZsYWcgPSBmYWxzZTsKIAkJCQl9CiAKIAkJCQlyZXR2YWwgPSBtc190cmFuc2Zlcl90cGMoY2hpcCwKIAkJCQkJCQlNU19UTV9OT1JNQUxfUkVBRCwKIAkJCQkJCQlSRUFEX1BBR0VfREFUQSwKIAkJCQkJCQkwLCBOT19XQUlUX0lOVCk7Ci0JCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQl9CiAKIAkJCQlpZiAodW5jb3JyZWN0X2ZsYWcpIHsKIAkJCQkJbXNfc2V0X3BhZ2Vfc3RhdHVzKGxvZ19ibGssIHNldFBTX05HLApAQCAtMTY4NCwxMyArMjAxNCwxNiBAQAogCQkJCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQogCQkJCQkJYnJlYWs7CiAJCQkJfQotCQkJCWlmIChydHlfY250ID09IE1TX01BWF9SRVRSWV9DT1VOVCkKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlpZiAocnR5X2NudCA9PSBNU19NQVhfUkVUUllfQ09VTlQpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAkJCX0KIAogCQkJaWYgKCEodmFsICYgSU5UX1JFR19CUkVRKSkgewogCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19CUkVRX0VSUk9SKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9CiAKQEAgLTE3MjQsMzUgKzIwNTcsNDUgQEAKIAogCQlyZXR2YWwgPSBtc193cml0ZV9ieXRlcyhjaGlwLCBXUklURV9SRUcsICg2ICsgTVNfRVhUUkFfU0laRSksCiAJCQkJCU5PX1dBSVRfSU5ULCBkYXRhLCAxNik7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfV1JJVEUsIFdBSVRfSU5UKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfTk9fRVJST1IpOwogCQlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsIE5PX1dBSVRfSU5ULCAmdmFsLCAxKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlpZiAodmFsICYgSU5UX1JFR19DTUROSykgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NNRF9OSyk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCWlmICh2YWwgJiBJTlRfUkVHX0NFRCkgewogCQkJaWYgKHZhbCAmIElOVF9SRUdfRVJSKSB7CiAJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1dSSVRFX0VSUk9SKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9CiAKIAkJaWYgKGkgPT0gMCkgewogCQkJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIE92ZXJ3cml0ZUZsYWcsCiAJCQkJCQlNU19FWFRSQV9TSVpFLCBTeXN0ZW1QYXJtLCA3KTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIApAQCAtMTc3MSwyOSArMjExNCwzNyBAQAogCiAJCQlyZXR2YWwgPSBtc193cml0ZV9ieXRlcyhjaGlwLCBXUklURV9SRUcsIDcsCiAJCQkJCQlOT19XQUlUX0lOVCwgZGF0YSwgOCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAKIAkJCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIEJMT0NLX1dSSVRFLCBXQUlUX0lOVCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAJCQlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsCiAJCQkJCU5PX1dBSVRfSU5ULCAmdmFsLCAxKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJaWYgKHZhbCAmIElOVF9SRUdfQ01ETkspIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQ01EX05LKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAJCQlpZiAodmFsICYgSU5UX1JFR19DRUQpIHsKIAkJCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKIAkJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsCiAJCQkJCQkJTVNfRkxBU0hfV1JJVEVfRVJST1IpOwotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0xODE0LDIwICsyMTY1LDMwIEBACiAjZW5kaWYKIAogCXJldHZhbCA9IG1zX3ByZXBhcmVfcmVzZXQoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAltc19jYXJkLT5tc190eXBlIHw9IFRZUEVfTVM7CiAKIAlyZXR2YWwgPSBtc19zZW5kX2NtZChjaGlwLCBNU19SRVNFVCwgTk9fV0FJVF9JTlQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gbXNfcmVhZF9zdGF0dXNfcmVnKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBQUEJVRl9CQVNFMiwgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBQQlVGX0JBU0UyLCAmdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCWlmICh2YWwgJiBXUlRfUFJUQ1QpCiAJCWNoaXAtPmNhcmRfd3AgfD0gTVNfQ0FSRDsKIAllbHNlCkBAIC0xODQwLDcgKzIyMDEsOCBAQAogCXdoaWxlIChpIDwgKE1BWF9ERUZFQ1RJVkVfQkxPQ0sgKyAyKSkgewogCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgTVNfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19DQVJEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJcmV0dmFsID0gbXNfcmVhZF9leHRyYV9kYXRhKGNoaXAsIGksIDAsIGV4dHJhLCBNU19FWFRSQV9TSVpFKTsKQEAgLTE4NjAsNyArMjIyMiw4IEBACiAKIAlpZiAoaSA9PSAoTUFYX0RFRkVDVElWRV9CTE9DSyArIDIpKSB7CiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJObyBib290IGJsb2NrIGZvdW5kISIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJZm9yIChqID0gMDsgaiA8IDM7IGorKykgewpAQCAtMTg3NSw4ICsyMjM4LDEwIEBACiAJfQogCiAJcmV0dmFsID0gbXNfcmVhZF9wYWdlKGNoaXAsIG1zX2NhcmQtPmJvb3RfYmxvY2ssIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJLyogUmVhZCBNUyBzeXN0ZW0gaW5mb3JtYXRpb24gYXMgc3lzX2luZm8gKi8KIAlydHN4X2luaXRfY21kKGNoaXApOwpAQCAtMTg4NSw4ICsyMjUwLDEwIEBACiAJCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFBQQlVGX0JBU0UyICsgMHgxQTAgKyBpLCAwLCAwKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgTVNfQ0FSRCwgMTAwKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcHRyID0gcnRzeF9nZXRfY21kX2RhdGEoY2hpcCk7CiAJbWVtY3B5KG1zX2NhcmQtPnJhd19zeXNfaW5mbywgcHRyLCA5Nik7CkBAIC0xOTA4LDggKzIyNzUsMTAgQEAKIAlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBNU180Yml0X1N1cHBvcnQsIDAsIDApOwogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCBNU19DQVJELCAxMDApOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlwdHIgPSBydHN4X2dldF9jbWRfZGF0YShjaGlwKTsKIApAQCAtMTk4MiwxOSArMjM1MSwzNiBAQAogCS8qIFN3aXRjaCBJL0YgTW9kZSAqLwogCWlmIChwdHJbMTVdKSB7CiAJCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCAwLCAwLCBTeXN0ZW1QYXJtLCAxKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBQUEJVRl9CQVNFMiwgMHhGRiwgMHg4OCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFBQQlVGX0JBU0UyICsgMSwgMHhGRiwgMCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUFBCVUZfQkFTRTIsIDB4RkYsIDB4ODgpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBQQlVGX0JBU0UyICsgMSwgMHhGRiwgMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAKIAkJcmV0dmFsID0gbXNfdHJhbnNmZXJfdHBjKGNoaXAsIE1TX1RNX1dSSVRFX0JZVEVTLCBXUklURV9SRUcsIDEsCiAJCQkJCU5PX1dBSVRfSU5UKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBNU19DRkcsIDB4NTggfCBNU19OT19DSEVDS19JTlQsCi0JCQlNU19CVVNfV0lEVEhfNCB8IFBVU0hfVElNRV9PREQgfCBNU19OT19DSEVDS19JTlQpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1TX0NGRywKKwkJCQkJICAgICAweDU4IHwgTVNfTk9fQ0hFQ0tfSU5ULAorCQkJCQkgICAgIE1TX0JVU19XSURUSF80IHwgUFVTSF9USU1FX09ERCB8IE1TX05PX0NIRUNLX0lOVCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAKIAkJbXNfY2FyZC0+bXNfdHlwZSB8PSBNU180QklUOwogCX0KQEAgLTIwMjAsMjkgKzI0MDYsNDEgQEAKIAogCXNpemUgPSBtc19jYXJkLT5zZWdtZW50X2NudCAqIHNpemVvZihzdHJ1Y3Qgem9uZV9lbnRyeSk7CiAJbXNfY2FyZC0+c2VnbWVudCA9IHZ6YWxsb2Moc2l6ZSk7Ci0JaWYgKG1zX2NhcmQtPnNlZ21lbnQgPT0gTlVMTCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAobXNfY2FyZC0+c2VnbWVudCA9PSBOVUxMKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtc19yZWFkX3BhZ2UoY2hpcCwgbXNfY2FyZC0+Ym9vdF9ibG9jaywgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfR09UTyhjaGlwLCBJTklUX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBJTklUX0ZBSUw7CisJfQogCiAJcmVnX2FkZHIgPSBQUEJVRl9CQVNFMjsKIAlmb3IgKGkgPSAwOyBpIDwgKCgobXNfY2FyZC0+dG90YWxfYmxvY2sgPj4gOSkgKiAxMCkgKyAxKTsgaSsrKSB7CisJCWludCBibG9ja19ubzsKKwogCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgcmVnX2FkZHIrKywgJnZhbDEpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBJTklUX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBJTklUX0ZBSUw7CisJCX0KIAogCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgcmVnX2FkZHIrKywgJnZhbDIpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBJTklUX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBJTklUX0ZBSUw7CisJCX0KIAogCQlkZWZlY3RfYmxvY2sgPSAoKHUxNil2YWwxIDw8IDgpIHwgdmFsMjsKIAkJaWYgKGRlZmVjdF9ibG9jayA9PSAweEZGRkYpCiAJCQlicmVhazsKIAogCQlzZWdfbm8gPSBkZWZlY3RfYmxvY2sgLyA1MTI7Ci0JCW1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXS5kZWZlY3RfbGlzdFttc19jYXJkLT5zZWdtZW50W3NlZ19ub10uZGlzYWJsZV9jb3VudCsrXSA9IGRlZmVjdF9ibG9jazsKKworCQlibG9ja19ubyA9IG1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXS5kaXNhYmxlX2NvdW50Kys7CisJCW1zX2NhcmQtPnNlZ21lbnRbc2VnX25vXS5kZWZlY3RfbGlzdFtibG9ja19ub10gPSBkZWZlY3RfYmxvY2s7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IG1zX2NhcmQtPnNlZ21lbnRfY250OyBpKyspIHsKQEAgLTIxODcsMTYgKzI1ODUsMTkgQEAKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CiAJc3RydWN0IHpvbmVfZW50cnkgKnNlZ21lbnQ7Ci0JaW50IHJldHZhbCwgdGFibGVfc2l6ZSwgZGlzYWJsZV9jbnQsIGRlZmVjdF9mbGFnLCBpOwotCXUxNiBzdGFydCwgZW5kLCBwaHlfYmxrLCBsb2dfYmxrLCB0bXBfYmxrOworCWJvb2wgZGVmZWN0X2ZsYWc7CisJaW50IHJldHZhbCwgdGFibGVfc2l6ZSwgZGlzYWJsZV9jbnQsIGk7CisJdTE2IHN0YXJ0LCBlbmQsIHBoeV9ibGssIGxvZ19ibGssIHRtcF9ibGssIGlkeDsKIAl1OCBleHRyYVtNU19FWFRSQV9TSVpFXSwgdXMxLCB1czI7CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAibXNfYnVpbGRfbDJwX3RibDogJWRcbiIsIHNlZ19ubyk7CiAKIAlpZiAobXNfY2FyZC0+c2VnbWVudCA9PSBOVUxMKSB7CiAJCXJldHZhbCA9IG1zX2luaXRfbDJwX3RibChjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0KIAogCWlmIChtc19jYXJkLT5zZWdtZW50W3NlZ19ub10uYnVpbGRfZmxhZykgewpAQCAtMjIxNCwxNSArMjYxNSwxOSBAQAogCiAJaWYgKHNlZ21lbnQtPmwycF90YWJsZSA9PSBOVUxMKSB7CiAJCXNlZ21lbnQtPmwycF90YWJsZSA9IHZtYWxsb2ModGFibGVfc2l6ZSAqIDIpOwotCQlpZiAoc2VnbWVudC0+bDJwX3RhYmxlID09IE5VTEwpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIEJVSUxEX0ZBSUwpOworCQlpZiAoc2VnbWVudC0+bDJwX3RhYmxlID09IE5VTEwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIEJVSUxEX0ZBSUw7CisJCX0KIAl9CiAJbWVtc2V0KCh1OCAqKShzZWdtZW50LT5sMnBfdGFibGUpLCAweGZmLCB0YWJsZV9zaXplICogMik7CiAKIAlpZiAoc2VnbWVudC0+ZnJlZV90YWJsZSA9PSBOVUxMKSB7CiAJCXNlZ21lbnQtPmZyZWVfdGFibGUgPSB2bWFsbG9jKE1TX0ZSRUVfVEFCTEVfQ05UICogMik7Ci0JCWlmIChzZWdtZW50LT5mcmVlX3RhYmxlID09IE5VTEwpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIEJVSUxEX0ZBSUwpOworCQlpZiAoc2VnbWVudC0+ZnJlZV90YWJsZSA9PSBOVUxMKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBCVUlMRF9GQUlMOworCQl9CiAJfQogCW1lbXNldCgodTggKikoc2VnbWVudC0+ZnJlZV90YWJsZSksIDB4ZmYsIE1TX0ZSRUVfVEFCTEVfQ05UICogMik7CiAKQEAgLTIyMzYsMTAgKzI2NDEsMTAgQEAKIAogCWZvciAocGh5X2JsayA9IHN0YXJ0OyBwaHlfYmxrIDwgZW5kOyBwaHlfYmxrKyspIHsKIAkJaWYgKGRpc2FibGVfY250KSB7Ci0JCQlkZWZlY3RfZmxhZyA9IDA7CisJCQlkZWZlY3RfZmxhZyA9IGZhbHNlOwogCQkJZm9yIChpID0gMDsgaSA8IHNlZ21lbnQtPmRpc2FibGVfY291bnQ7IGkrKykgewogCQkJCWlmIChwaHlfYmxrID09IHNlZ21lbnQtPmRlZmVjdF9saXN0W2ldKSB7Ci0JCQkJCWRlZmVjdF9mbGFnID0gMTsKKwkJCQkJZGVmZWN0X2ZsYWcgPSB0cnVlOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CkBAIC0yMjk5LDEzICsyNzA0LDE1IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmIChzZWdtZW50LT5sMnBfdGFibGVbbG9nX2JsayAtIG1zX3N0YXJ0X2lkeFtzZWdfbm9dXSA9PSAweEZGRkYpIHsKLQkJCXNlZ21lbnQtPmwycF90YWJsZVtsb2dfYmxrIC0gbXNfc3RhcnRfaWR4W3NlZ19ub11dID0gcGh5X2JsazsKKwkJaWR4ID0gbG9nX2JsayAtIG1zX3N0YXJ0X2lkeFtzZWdfbm9dOworCisJCWlmIChzZWdtZW50LT5sMnBfdGFibGVbaWR4XSA9PSAweEZGRkYpIHsKKwkJCXNlZ21lbnQtPmwycF90YWJsZVtpZHhdID0gcGh5X2JsazsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJdXMxID0gZXh0cmFbMF0gJiAweDEwOwotCQl0bXBfYmxrID0gc2VnbWVudC0+bDJwX3RhYmxlW2xvZ19ibGsgLSBtc19zdGFydF9pZHhbc2VnX25vXV07CisJCXRtcF9ibGsgPSBzZWdtZW50LT5sMnBfdGFibGVbaWR4XTsKIAkJcmV0dmFsID0gbXNfcmVhZF9leHRyYV9kYXRhKGNoaXAsIHRtcF9ibGssIDAsCiAJCQkJCWV4dHJhLCBNU19FWFRSQV9TSVpFKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKQEAgLTIzMzYsMTcgKzI3NDMsMjAgQEAKIAogCWZvciAobG9nX2JsayA9IG1zX3N0YXJ0X2lkeFtzZWdfbm9dOwogCSAgICAgbG9nX2JsayA8IG1zX3N0YXJ0X2lkeFtzZWdfbm8gKyAxXTsgbG9nX2JsaysrKSB7Ci0JCWlmIChzZWdtZW50LT5sMnBfdGFibGVbbG9nX2Jsay1tc19zdGFydF9pZHhbc2VnX25vXV0gPT0gMHhGRkZGKSB7CisJCWlkeCA9IGxvZ19ibGsgLSBtc19zdGFydF9pZHhbc2VnX25vXTsKKwkJaWYgKHNlZ21lbnQtPmwycF90YWJsZVtpZHhdID09IDB4RkZGRikgewogCQkJcGh5X2JsayA9IG1zX2dldF91bnVzZWRfYmxvY2soY2hpcCwgc2VnX25vKTsKIAkJCWlmIChwaHlfYmxrID09IDB4RkZGRikgewogCQkJCWNoaXAtPmNhcmRfd3AgfD0gTVNfQ0FSRDsKIAkJCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiAJCQl9CiAJCQlyZXR2YWwgPSBtc19pbml0X3BhZ2UoY2hpcCwgcGh5X2JsaywgbG9nX2JsaywgMCwgMSk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX0dPVE8oY2hpcCwgQlVJTERfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlnb3RvIEJVSUxEX0ZBSUw7CisJCQl9CiAKLQkJCXNlZ21lbnQtPmwycF90YWJsZVtsb2dfYmxrLW1zX3N0YXJ0X2lkeFtzZWdfbm9dXSA9IHBoeV9ibGs7CisJCQlzZWdtZW50LT5sMnBfdGFibGVbaWR4XSA9IHBoeV9ibGs7CiAJCQlpZiAoc2VnX25vID09IG1zX2NhcmQtPnNlZ21lbnRfY250IC0gMSkgewogCQkJCWlmIChzZWdtZW50LT51bnVzZWRfYmxrX2NudCA8IDIpIHsKIAkJCQkJY2hpcC0+Y2FyZF93cCB8PSBNU19DQVJEOwpAQCAtMjM3NCwxNCArMjc4NCwxOCBAQAogCQkJCXBoeV9ibGsgPSBtc19nZXRfdW51c2VkX2Jsb2NrKGNoaXAsIDApOwogCQkJCXJldHZhbCA9IG1zX2NvcHlfcGFnZShjaGlwLCB0bXBfYmxrLCBwaHlfYmxrLAogCQkJCQkJbG9nX2JsaywgMCwgbXNfY2FyZC0+cGFnZV9vZmYgKyAxKTsKLQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAogCQkJCXNlZ21lbnQtPmwycF90YWJsZVtsb2dfYmxrXSA9IHBoeV9ibGs7CiAKIAkJCQlyZXR2YWwgPSBtc19zZXRfYmFkX2Jsb2NrKGNoaXAsIHRtcF9ibGspOwotCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJfQogCQkJfQogCQl9CiAJfQpAQCAtMjQxMSwxMiArMjgyNSwxNiBAQAogCW1lbXNldChtc19jYXJkLCAwLCBzaXplb2Yoc3RydWN0IG1zX2luZm8pKTsKIAogCXJldHZhbCA9IGVuYWJsZV9jYXJkX2Nsb2NrKGNoaXAsIE1TX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc2VsZWN0X2NhcmQoY2hpcCwgTVNfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAltc19jYXJkLT5tc190eXBlID0gMDsKIApAQCAtMjQyNCwyNCArMjg0MiwzMSBAQAogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJaWYgKG1zX2NhcmQtPmNoZWNrX21zX2Zsb3cpIHsKIAkJCXJldHZhbCA9IHJlc2V0X21zKGNoaXApOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCQl9IGVsc2UgewotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKIAlyZXR2YWwgPSBtc19zZXRfaW5pdF9wYXJhKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKCFDSEtfTVNQUk8obXNfY2FyZCkpIHsKIAkJLyogQnVpbGQgdGFibGUgZm9yIHRoZSBsYXN0IHNlZ21lbnQsCiAJCSAqIHRvIGNoZWNrIGlmIEwyUCB0YWJsZSBibG9jayBleGlzdHMsIGVyYXNpbmcgaXQKIAkJICovCiAJCXJldHZhbCA9IG1zX2J1aWxkX2wycF90YmwoY2hpcCwgbXNfY2FyZC0+dG90YWxfYmxvY2sgLyA1MTIgLSAxKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAibXNfY2FyZC0+bXNfdHlwZSA9IDB4JXhcbiIsIG1zX2NhcmQtPm1zX3R5cGUpOwpAQCAtMjQ3MCw4ICsyODk1LDEwIEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMjUxMSw4ICsyOTM4LDEwIEBACiAJfQogCiAJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMjUyMiw3ICsyOTUxLDggQEAKIAkJCQl1MTYgc2VjdG9yX2NudCkKIHsKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7Ci0JaW50IHJldHZhbCwgbW9kZV8yayA9IDA7CisJYm9vbCBtb2RlXzJrID0gZmFsc2U7CisJaW50IHJldHZhbDsKIAl1MTYgY291bnQ7CiAJdTggdmFsLCB0cmFuc19tb2RlLCByd190cGMsIHJ3X2NtZDsKIApAQCAtMjU0Nyw3ICsyOTc3LDcgQEAKIAkJCQlyd190cGMgPSBQUk9fV1JJVEVfUVVBRF9EQVRBOwogCQkJCXJ3X2NtZCA9IFBST19XUklURV8yS19EQVRBOwogCQkJfQotCQkJbW9kZV8yayA9IDE7CisJCQltb2RlXzJrID0gdHJ1ZTsKIAkJfQogCX0gZWxzZSB7CiAJCWlmIChzcmItPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgewpAQCAtMjU2MCwxNSArMjk5MCwyMSBAQAogCX0KIAogCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChzcmItPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkKIAkJdHJhbnNfbW9kZSA9IE1TX1RNX0FVVE9fUkVBRDsKIAllbHNlCiAJCXRyYW5zX21vZGUgPSBNU19UTV9BVVRPX1dSSVRFOwogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBNU19UUkFOU19DRkcsICZ2YWwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBNU19UUkFOU19DRkcsICZ2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlpZiAobXNfY2FyZC0+c2VxX21vZGUpIHsKIAkJaWYgKChtc19jYXJkLT5wcmVfZGlyICE9IHNyYi0+c2NfZGF0YV9kaXJlY3Rpb24pCkBAIC0yNTgxLDggKzMwMTcsMTAgQEAKIAkJCW1zX2NhcmQtPnRvdGFsX3NlY19jbnQgPSAwOwogCQkJaWYgKHZhbCAmIE1TX0lOVF9CUkVRKSB7CiAJCQkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgUFJPX1NUT1AsIFdBSVRfSU5UKTsKLQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAogCQkJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkJDVEwsIFJCX0ZMVVNILCBSQl9GTFVTSCk7CiAJCQl9CkBAIC0yNjA5LDcgKzMwNDcsOCBAQAogCQlyZXR2YWwgPSBtc3Byb19zZXRfcndfY21kKGNoaXAsIHN0YXJ0X3NlY3RvciwgY291bnQsIHJ3X2NtZCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCW1zX2NhcmQtPnNlcV9tb2RlID0gMDsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfQogCkBAIC0yNjI0LDcgKzMwNjMsOCBAQAogCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgTVNfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWNoaXAtPnJ3X25lZWRfcmV0cnkgPSAwOwogCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIk5vIGNhcmQgZXhpc3QsIGV4aXQgbXNwcm9fcndfbXVsdGlfc2VjdG9yXG4iKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJaWYgKHZhbCAmIE1TX0lOVF9CUkVRKQpAQCAtMjYzNiw3ICszMDc2LDggQEAKIAkJCW1zX2F1dG9fdHVuZV9jbG9jayhjaGlwKTsKIAkJfQogCi0JCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOwogCX0KIAogCWlmIChtc19jYXJkLT5zZXFfbW9kZSkgewpAQCAtMjY2NCwxMyArMzEwNSwxNSBAQAogCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCW1zX2NhcmQtPmZvcm1hdF9zdGF0dXMgPSBGT1JNQVRfRkFJTDsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBNU19UUkFOU19DRkcsICZ0bXApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJbXNfY2FyZC0+Zm9ybWF0X3N0YXR1cyA9IEZPUk1BVF9GQUlMOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKCEodG1wICYgTVNfSU5UX0JSRVEpKSB7CkBAIC0yNjc5LDcgKzMxMjIsOCBAQAogCQkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogCQl9CiAJCW1zX2NhcmQtPmZvcm1hdF9zdGF0dXMgPSBGT1JNQVRfRkFJTDsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmIChzaG9ydF9kYXRhX2xlbiA+PSAyNTYpCkBAIC0yNjkxLDE0ICszMTM1LDE2IEBACiAJCQkJTVNfTk9fQ0hFQ0tfSU5UKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCW1zX2NhcmQtPmZvcm1hdF9zdGF0dXMgPSBGT1JNQVRfRkFJTDsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgUFJPX1JFQURfU0hPUlRfREFUQSwgY250LCBXQUlUX0lOVCwKIAkJCWRhdGEsIDgpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJbXNfY2FyZC0+Zm9ybWF0X3N0YXR1cyA9IEZPUk1BVF9GQUlMOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJdG90YWxfcHJvZ3Jlc3MgPSAoZGF0YVswXSA8PCAyNCkgfCAoZGF0YVsxXSA8PCAxNikgfApAQCAtMjcyMyw3ICszMTY5LDggQEAKIAkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIE1TX1RSQU5TX0NGRywgJnRtcCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCW1zX2NhcmQtPmZvcm1hdF9zdGF0dXMgPSBGT1JNQVRfRkFJTDsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJCWlmICh0bXAgJiAoTVNfSU5UX0NFRCB8IE1TX0lOVF9DTUROSyB8CiAJCQkJTVNfSU5UX0JSRVEgfCBNU19JTlRfRVJSKSkKQEAgLTI3MzUsMTcgKzMxODIsMjAgQEAKIAlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1TX0NGRywgTVNfTk9fQ0hFQ0tfSU5ULCAwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCW1zX2NhcmQtPmZvcm1hdF9zdGF0dXMgPSBGT1JNQVRfRkFJTDsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmIChpID09IDUwMDApIHsKIAkJbXNfY2FyZC0+Zm9ybWF0X3N0YXR1cyA9IEZPUk1BVF9GQUlMOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKHRtcCAmIChNU19JTlRfQ01ETksgfCBNU19JTlRfRVJSKSkgewogCQltc19jYXJkLT5mb3JtYXRfc3RhdHVzID0gRk9STUFUX0ZBSUw7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAodG1wICYgTVNfSU5UX0NFRCkgewpAQCAtMjc1Niw3ICszMjA2LDggQEAKIAl9IGVsc2UgewogCQltc19jYXJkLT5mb3JtYXRfc3RhdHVzID0gRk9STUFUX0ZBSUw7CiAJCW1zX2NhcmQtPnByb191bmRlcl9mb3JtYXR0aW5nID0gMDsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTI3ODAsNyArMzIzMSw3IEBACiB9CiAKIGludCBtc3Byb19mb3JtYXQoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLAotCQlpbnQgc2hvcnRfZGF0YV9sZW4sIGludCBxdWlja19mb3JtYXQpCisJCWludCBzaG9ydF9kYXRhX2xlbiwgYm9vbCBxdWlja19mb3JtYXQpCiB7CiAJc3RydWN0IG1zX2luZm8gKm1zX2NhcmQgPSAmKGNoaXAtPm1zX2NhcmQpOwogCWludCByZXR2YWwsIGk7CkBAIC0yNzg4LDEyICszMjM5LDE2IEBACiAJdTE2IHBhcmE7CiAKIAlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgMHgwMCwgMHgwMCwgUHJvX1RQQ1Bhcm0sIDB4MDEpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJbWVtc2V0KGJ1ZiwgMCwgMik7CiAJc3dpdGNoIChzaG9ydF9kYXRhX2xlbikgewpAQCAtMjgxOCw4ICszMjczLDEwIEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKHF1aWNrX2Zvcm1hdCkKIAkJcGFyYSA9IDB4MDAwMDsKQEAgLTI4MjcsMTMgKzMyODQsMjEgQEAKIAkJcGFyYSA9IDB4MDAwMTsKIAogCXJldHZhbCA9IG1zcHJvX3NldF9yd19jbWQoY2hpcCwgMCwgcGFyYSwgUFJPX0ZPUk1BVCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIE1TX1RSQU5TX0NGRywgJnRtcCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIE1TX1RSQU5TX0NGRywgJnRtcCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAotCWlmICh0bXAgJiAoTVNfSU5UX0NNRE5LIHwgTVNfSU5UX0VSUikpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHRtcCAmIChNU19JTlRfQ01ETksgfCBNU19JTlRfRVJSKSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKCh0bXAgJiAoTVNfSU5UX0JSRVEgfCBNU19JTlRfQ0VEKSkgPT0gTVNfSU5UX0JSRVEpIHsKIAkJbXNfY2FyZC0+cHJvX3VuZGVyX2Zvcm1hdHRpbmcgPSAxOwpAQCAtMjg1MCw3ICszMzE1LDggQEAKIAkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogCX0KIAotCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CiAKIApAQCAtMjg2OSwxNCArMzMzNSwxNyBAQAogCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJaWYgKChleHRyYVsxXSAmIDB4MzApICE9IDB4MzApIHsKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9SRUFEX0VSUk9SKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfQogCiAJcmV0dmFsID0gbXNfc2V0X3J3X3JlZ19hZGRyKGNoaXAsIE92ZXJ3cml0ZUZsYWcsIE1TX0VYVFJBX1NJWkUsCiAJCQkJU3lzdGVtUGFybSwgNik7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoQ0hLX01TNEJJVChtc19jYXJkKSkKIAkJZGF0YVswXSA9IDB4ODg7CkBAIC0yODk1LDE0ICszMzY0LDE4IEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIAogCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIEJMT0NLX1JFQUQsIFdBSVRfSU5UKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXB0ciA9IGJ1ZjsKIApAQCAtMjkxMSwxNiArMzM4NCwyMCBAQAogCiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBNU19DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0NBUkQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsIE5PX1dBSVRfSU5ULCAmdmFsLCAxKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlpZiAodmFsICYgSU5UX1JFR19DTUROSykgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NNRF9OSyk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKIAkJCWlmICh2YWwgJiBJTlRfUkVHX0JSRVEpIHsKQEAgLTI5MzMsMzQgKzM0MTAsNDIgQEAKIAkJCQkJCQkJcGFnZV9hZGRyLCBleHRyYSwgTVNfRVhUUkFfU0laRSk7CiAJCQkJCX0KIAkJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1JFQURfRVJST1IpOwotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfRkxBU0hfUkVBRF9FUlJPUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmICghKHZhbCAmIElOVF9SRUdfQlJFUSkpIHsKIAkJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQlJFUV9FUlJPUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCiAJCWlmIChwYWdlX2FkZHIgPT0gKGVuZF9wYWdlIC0gMSkpIHsKIAkJCWlmICghKHZhbCAmIElOVF9SRUdfQ0VEKSkgewogCQkJCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIEJMT0NLX0VORCwgV0FJVF9JTlQpOwotCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJfQogCQkJfQogCiAJCQlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsIE5PX1dBSVRfSU5ULAogCQkJCQkmdmFsLCAxKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJaWYgKCEodmFsICYgSU5UX1JFR19DRUQpKSB7CiAJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0ZMQVNIX1JFQURfRVJST1IpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCXRyYW5zX2NmZyA9IE5PX1dBSVRfSU5UOwpAQCAtMjk5MywxOSArMzQ3OCwyMiBAQAogCQkJaWYgKHJldHZhbCA9PSAtRVRJTUVET1VUKSB7CiAJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX1RPX0VSUk9SKTsKIAkJCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfVElNRURPVVQpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19USU1FRE9VVDsKIAkJCX0KIAogCQkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIE1TX1RSQU5TX0NGRywgJnZhbCk7CiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX1RPX0VSUk9SKTsKIAkJCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfVElNRURPVVQpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19USU1FRE9VVDsKIAkJCX0KIAkJCWlmICh2YWwgJiAoTVNfQ1JDMTZfRVJSIHwgTVNfUkRZX1RJTUVPVVQpKSB7CiAJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NSQzE2X0VSUk9SKTsKIAkJCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCX0KIApAQCAtMzAyOSw4ICszNTE3LDEwIEBACiAJaWYgKCFzdGFydF9wYWdlKSB7CiAJCXJldHZhbCA9IG1zX3NldF9yd19yZWdfYWRkcihjaGlwLCBPdmVyd3JpdGVGbGFnLCBNU19FWFRSQV9TSVpFLAogCQkJCQlTeXN0ZW1QYXJtLCA3KTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlpZiAoQ0hLX01TNEJJVChtc19jYXJkKSkKIAkJCWRhdGFbMF0gPSAweDg4OwpAQCAtMzA0NywyNCArMzUzNywzMiBAQAogCiAJCXJldHZhbCA9IG1zX3dyaXRlX2J5dGVzKGNoaXAsIFdSSVRFX1JFRywgNywgTk9fV0FJVF9JTlQsCiAJCQkJCWRhdGEsIDgpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJldHZhbCA9IG1zX3NlbmRfY21kKGNoaXAsIEJMT0NLX1dSSVRFLCBXQUlUX0lOVCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0VSUk9SKTsKIAkJcmV0dmFsID0gbXNfdHJhbnNmZXJfdHBjKGNoaXAsIE1TX1RNX1JFQURfQllURVMsIEdFVF9JTlQsIDEsCiAJCQkJCU5PX1dBSVRfSU5UKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgT3ZlcndyaXRlRmxhZywgTVNfRVhUUkFfU0laRSwKIAkJCQlTeXN0ZW1QYXJtLCAoNiArIE1TX0VYVFJBX1NJWkUpKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19OT19FUlJPUik7CiAKQEAgLTMwOTYsMjAgKzM1OTQsMjYgQEAKIAkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCX0KLQlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgTVNfTUFYX1JFVFJZX0NPVU5UOyBpKyspIHsKIAkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfV1JJVEUsIFdBSVRfSU5UKTsKIAkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykKIAkJCWJyZWFrOwogCX0KLQlpZiAoaSA9PSBNU19NQVhfUkVUUllfQ09VTlQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsIE5PX1dBSVRfSU5ULCAmdmFsLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXB0ciA9IGJ1ZjsKIAlmb3IgKHBhZ2VfYWRkciA9IHN0YXJ0X3BhZ2U7IHBhZ2VfYWRkciA8IGVuZF9wYWdlOyBwYWdlX2FkZHIrKykgewpAQCAtMzExNywyMCArMzYyMSwyNCBAQAogCiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBNU19DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX05PX0NBUkQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlpZiAodmFsICYgSU5UX1JFR19DTUROSykgewogCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsIE1TX0NNRF9OSyk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCQlpZiAodmFsICYgSU5UX1JFR19FUlIpIHsKIAkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9XUklURV9FUlJPUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCQlpZiAoISh2YWwgJiBJTlRfUkVHX0JSRVEpKSB7CiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfQlJFUV9FUlJPUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCXVkZWxheSgzMCk7CkBAIC0zMTYxLDM0ICszNjY5LDQzIEBACiAJCQltc19zZXRfZXJyX2NvZGUoY2hpcCwgTVNfVE9fRVJST1IpOwogCQkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKIAotCQkJaWYgKHJldHZhbCA9PSAtRVRJTUVET1VUKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfVElNRURPVVQpOwotCQkJZWxzZQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsID09IC1FVElNRURPVVQpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfVElNRURPVVQ7CisJCQl9CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJcmV0dmFsID0gbXNfcmVhZF9ieXRlcyhjaGlwLCBHRVRfSU5ULCAxLCBOT19XQUlUX0lOVCwgJnZhbCwgMSk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJaWYgKChlbmRfcGFnZSAtIHN0YXJ0X3BhZ2UpID09IDEpIHsKIAkJCWlmICghKHZhbCAmIElOVF9SRUdfQ0VEKSkgewogCQkJCW1zX3NldF9lcnJfY29kZShjaGlwLCBNU19GTEFTSF9XUklURV9FUlJPUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWlmIChwYWdlX2FkZHIgPT0gKGVuZF9wYWdlIC0gMSkpIHsKIAkJCQlpZiAoISh2YWwgJiBJTlRfUkVHX0NFRCkpIHsKIAkJCQkJcmV0dmFsID0gbXNfc2VuZF9jbWQoY2hpcCwgQkxPQ0tfRU5ELAogCQkJCQkJCVdBSVRfSU5UKTsKLQkJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJCX0KIAkJCQl9CiAKIAkJCQlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIEdFVF9JTlQsIDEsCiAJCQkJCQlOT19XQUlUX0lOVCwgJnZhbCwgMSk7Ci0JCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQl9CiAJCQl9CiAKIAkJCWlmICgocGFnZV9hZGRyID09IChlbmRfcGFnZSAtIDEpKSB8fApAQCAtMzE5Niw3ICszNzEzLDggQEAKIAkJCQlpZiAoISh2YWwgJiBJTlRfUkVHX0NFRCkpIHsKIAkJCQkJbXNfc2V0X2Vycl9jb2RlKGNoaXAsCiAJCQkJCQkJTVNfRkxBU0hfV1JJVEVfRVJST1IpOwotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQkJfQogCQkJfQogCQl9CkBAIC0zMjE3LDggKzM3MzUsMTAgQEAKIAogCXJldHZhbCA9IG1zX2NvcHlfcGFnZShjaGlwLCBvbGRfYmxrLCBuZXdfYmxrLCBsb2dfYmxrLAogCQkJcGFnZV9vZmYsIG1zX2NhcmQtPnBhZ2Vfb2ZmICsgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlzZWdfbm8gPSBvbGRfYmxrID4+IDk7CiAKQEAgLTMyNDQsOCArMzc2NCwxMCBAQAogCWlmIChzdGFydF9wYWdlKSB7CiAJCXJldHZhbCA9IG1zX2NvcHlfcGFnZShjaGlwLCBvbGRfYmxrLCBuZXdfYmxrLCBsb2dfYmxrLAogCQkJCTAsIHN0YXJ0X3BhZ2UpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTMyNjAsOCArMzc4MiwxMCBAQAogCiAJaWYgKGRlbGF5X3dyaXRlLT5kZWxheV93cml0ZV9mbGFnKSB7CiAJCXJldHZhbCA9IG1zX3NldF9pbml0X3BhcmEoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJZGVsYXlfd3JpdGUtPmRlbGF5X3dyaXRlX2ZsYWcgPSAwOwogCQlyZXR2YWwgPSBtc19maW5pc2hfd3JpdGUoY2hpcCwKQEAgLTMyNjksOCArMzc5MywxMCBAQAogCQkJCQlkZWxheV93cml0ZS0+bmV3X3BoeWJsb2NrLAogCQkJCQlkZWxheV93cml0ZS0+bG9nYmxvY2ssCiAJCQkJCWRlbGF5X3dyaXRlLT5wYWdlb2ZmKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0zMzA5LDcgKzM4MzUsOCBAQAogCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCW1zX3J3X2ZhaWwoc3JiLCBjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWxvZ19ibGsgPSAodTE2KShzdGFydF9zZWN0b3IgPj4gbXNfY2FyZC0+YmxvY2tfc2hpZnQpOwpAQCAtMzMyNSw3ICszODUyLDggQEAKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJY2hpcC0+Y2FyZF9mYWlsIHw9IE1TX0NBUkQ7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKQEAgLTMzNDIsNyArMzg3MCw4IEBACiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCW9sZF9ibGsgPSBkZWxheV93cml0ZS0+b2xkX3BoeWJsb2NrOwogCQkJbmV3X2JsayA9IGRlbGF5X3dyaXRlLT5uZXdfcGh5YmxvY2s7CkBAIC0zMzU3LDcgKzM4ODYsOCBAQAogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAjZW5kaWYKIAkJCW9sZF9ibGsgPSBtc19nZXRfbDJwX3RibChjaGlwLCBzZWdfbm8sCkBAIC0zMzY2LDcgKzM4OTYsOCBAQAogCQkJaWYgKChvbGRfYmxrID09IDB4RkZGRikgfHwgKG5ld19ibGsgPT0gMHhGRkZGKSkgewogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCXJldHZhbCA9IG1zX3ByZXBhcmVfd3JpdGUoY2hpcCwgb2xkX2JsaywgbmV3X2JsaywKQEAgLTMzNzUsMTEgKzM5MDYsMTMgQEAKIAkJCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgTVNfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQkJU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCQl9CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KICNpZmRlZiBNU19ERUxBWV9XUklURQogCQl9CkBAIC0zMzkxLDExICszOTI0LDEzIEBACiAJCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgTVNfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KICNlbmRpZgogCQlvbGRfYmxrID0gbXNfZ2V0X2wycF90YmwoY2hpcCwgc2VnX25vLApAQCAtMzQwMyw3ICszOTM4LDggQEAKIAkJaWYgKG9sZF9ibGsgPT0gMHhGRkZGKSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKQEAgLTM0MzYsMTAgKzM5NzIsMTIgQEAKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBNU19DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCW1zX3J3X2ZhaWwoc3JiLCBjaGlwKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJaWYgKHNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgewpAQCAtMzQ3NSw3ICs0MDEzLDggQEAKIAkJCQljaGlwLT5jYXJkX2ZhaWwgfD0gTVNfQ0FSRDsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCX0KIApAQCAtMzQ4MywxNCArNDAyMiwxNiBAQAogCQkJCQlsb2dfYmxrIC0gbXNfc3RhcnRfaWR4W3NlZ19ub10pOwogCQlpZiAob2xkX2JsayA9PSAweEZGRkYpIHsKIAkJCW1zX3J3X2ZhaWwoc3JiLCBjaGlwKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJaWYgKHNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgewogCQkJbmV3X2JsayA9IG1zX2dldF91bnVzZWRfYmxvY2soY2hpcCwgc2VnX25vKTsKIAkJCWlmIChuZXdfYmxrID09IDB4RkZGRikgewogCQkJCW1zX3J3X2ZhaWwoc3JiLCBjaGlwKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9CiAKQEAgLTM1MTUsMTEgKzQwNTYsMTMgQEAKIAkJCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgTVNfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQkJU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCQl9CiAKIAkJCQltc19yd19mYWlsKHNyYiwgY2hpcCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KICNlbmRpZgogCQl9CkBAIC0zNTgxLDEyICs0MTI0LDE2IEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIENIRUNLX1JFR19DTUQsIE1TX1RSQU5TX0NGRywgTVNfSU5UX0NFRCwgTVNfSU5UX0NFRCk7CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIE1TX0NBUkQsIDUwMDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJdmFsID0gKnJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApOwotCWlmICh2YWwgJiBNU19JTlRfRVJSKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmICh2YWwgJiBNU19JTlRfRVJSKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0zNjQ5LDEyICs0MTk2LDE1IEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKGkgPT0gTVNfTUFYX1JFVFJZX0NPVU5UKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChpID09IE1TX01BWF9SRVRSWV9DT1VOVCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKGNoZWNrX21zX2VycihjaGlwKSkgewogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMzY3MSw4ICs0MjIxLDEwIEBACiAJZWxzZQogCQlyZXR2YWwgPSBtc19zZXRfcndfcmVnX2FkZHIoY2hpcCwgMCwgMCwgUHJvX0RhdGFDb3VudDEsIDYpOwogCi0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlidWZbMF0gPSAwOwogCWJ1ZlsxXSA9IDA7CkBAIC0zNjg0LDggKzQyMzYsMTAgQEAKIAl9CiAJcmV0dmFsID0gbXNfd3JpdGVfYnl0ZXMoY2hpcCwgUFJPX1dSSVRFX1JFRywgKHR5cGUgPT0gMCkgPyAxIDogNiwKIAkJCQlOT19XQUlUX0lOVCwgYnVmLCA2KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTM2OTksMTkgKzQyNTMsMjMgQEAKIAogCWlmIChzY3NpX2J1ZmZsZW4oc3JiKSA8IDEyKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAltc19jbGVhbnVwX3dvcmsoY2hpcCk7CiAKIAlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtZ19zZW5kX2V4X2NtZChjaGlwLCBNR19TRVRfTElELCAwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfRVNUQUIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJbWVtc2V0KGJ1ZjEsIDAsIDMyKTsKQEAgLTM3MjMsMTIgKzQyODEsMTQgQEAKIAkJCQlidWYxLCAzMik7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0VTVEFCKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAlpZiAoY2hlY2tfbXNfZXJyKGNoaXApKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfRVNUQUIpOwogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMzc0NCwxMiArNDMwNCwxNiBAQAogCW1zX2NsZWFudXBfd29yayhjaGlwKTsKIAogCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWJ1ZiA9IGttYWxsb2MoMTU0MCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRVJST1I7CisJfQogCiAJYnVmWzBdID0gMHgwNDsKIAlidWZbMV0gPSAweDFBOwpAQCAtMzc1OSw3ICs0MzIzLDggQEAKIAlyZXR2YWwgPSBtZ19zZW5kX2V4X2NtZChjaGlwLCBNR19HRVRfTEVLQiwgMCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7Ci0JCVRSQUNFX0dPVE8oY2hpcCwgR2V0RUtCRmluaXNoKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBHZXRFS0JGaW5pc2g7CiAJfQogCiAJcmV0dmFsID0gbXNfdHJhbnNmZXJfZGF0YShjaGlwLCBNU19UTV9BVVRPX1JFQUQsIFBST19SRUFEX0xPTkdfREFUQSwKQEAgLTM3NjcsMTIgKzQzMzIsMTQgQEAKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKLQkJVFJBQ0VfR09UTyhjaGlwLCBHZXRFS0JGaW5pc2gpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIEdldEVLQkZpbmlzaDsKIAl9CiAJaWYgKGNoZWNrX21zX2VycihjaGlwKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlidWZmbGVuID0gbWluX3QoaW50LCAxMDUyLCBzY3NpX2J1ZmZsZW4oc3JiKSk7CkBAIC0zNzk1LDI1ICs0MzYyLDMwIEBACiAJbXNfY2xlYW51cF93b3JrKGNoaXApOwogCiAJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gbWdfc2VuZF9leF9jbWQoY2hpcCwgTUdfR0VUX0lELCAwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19JTkNPTVBBVElCTEVfTUVESVVNKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHZhbCA9IG1zX3JlYWRfYnl0ZXMoY2hpcCwgUFJPX1JFQURfU0hPUlRfREFUQSwgMzIsIFdBSVRfSU5ULAogCQkJYnVmLCAzMik7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfSU5DT01QQVRJQkxFX01FRElVTSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAJaWYgKGNoZWNrX21zX2VycihjaGlwKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfSU5DT01QQVRJQkxFX01FRElVTSk7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAltZW1jcHkobXNfY2FyZC0+bWFnaWNfZ2F0ZV9pZCwgYnVmLCAxNik7CkBAIC0zODIyLDE0ICs0Mzk0LDE2IEBACiAJcmV0dmFsID0gbXNfcG9sbF9pbnQoY2hpcCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfSU5DT01QQVRJQkxFX01FRElVTSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAjZW5kaWYKIAogCXJldHZhbCA9IG1nX3NlbmRfZXhfY21kKGNoaXAsIE1HX1NFVF9SRCwgMCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfSU5DT01QQVRJQkxFX01FRElVTSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlidWZmbGVuID0gbWluX3QoaW50LCAxMiwgc2NzaV9idWZmbGVuKHNyYikpOwpAQCAtMzg0NSwxMiArNDQxOSwxNCBAQAogCQkJCTMyLCBXQUlUX0lOVCwgYnVmLCAzMik7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfSU5DT01QQVRJQkxFX01FRElVTSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAJaWYgKGNoZWNrX21zX2VycihjaGlwKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfSU5DT01QQVRJQkxFX01FRElVTSk7CiAJCXJ0c3hfY2xlYXJfbXNfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAltc19jYXJkLT5tZ19hdXRoID0gMDsKQEAgLTM4NjksMjUgKzQ0NDUsMzAgQEAKIAltc19jbGVhbnVwX3dvcmsoY2hpcCk7CiAKIAlyZXR2YWwgPSBtc19zd2l0Y2hfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBtZ19zZW5kX2V4X2NtZChjaGlwLCBNR19NQUtFX1JNUywgMCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUdfS0VZX0ZBSUxfTk9UX0FVVEhFTik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR2YWwgPSBtc19yZWFkX2J5dGVzKGNoaXAsIFBST19SRUFEX1NIT1JUX0RBVEEsIDMyLCBXQUlUX0lOVCwKIAkJCWJ1ZjEsIDMyKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAlpZiAoY2hlY2tfbXNfZXJyKGNoaXApKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWJ1ZjJbMF0gPSAweDAwOwpAQCAtMzkwNSw3ICs0NDg2LDggQEAKIAlyZXR2YWwgPSBtc19wb2xsX2ludChjaGlwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KICNlbmRpZgogCkBAIC0zOTI0LDEzICs0NTA2LDE2IEBACiAJbXNfY2xlYW51cF93b3JrKGNoaXApOwogCiAJcmV0dmFsID0gbXNfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gbWdfc2VuZF9leF9jbWQoY2hpcCwgTUdfTUFLRV9LU0UsIDApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0tFWV9GQUlMX05PVF9BVVRIRU4pOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJYnVmZmxlbiA9IG1pbl90KGludCwgMTIsIHNjc2lfYnVmZmxlbihzcmIpKTsKQEAgLTM5NDYsMTIgKzQ1MzEsMTQgQEAKIAkJCQlidWYsIDMyKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAlpZiAoY2hlY2tfbXNfZXJyKGNoaXApKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19LRVlfRkFJTF9OT1RfQVVUSEVOKTsKIAkJcnRzeF9jbGVhcl9tc19lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCW1zX2NhcmQtPm1nX2F1dGggPSAxOwpAQCAtMzk3MCwxMiArNDU1NywxNiBAQAogCW1zX2NsZWFudXBfd29yayhjaGlwKTsKIAogCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWJ1ZiA9IGttYWxsb2MoMTAyOCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRVJST1I7CisJfQogCiAJYnVmWzBdID0gMHgwNDsKIAlidWZbMV0gPSAweDAyOwpAQCAtMzk4NSw3ICs0NTc2LDggQEAKIAlyZXR2YWwgPSBtZ19zZW5kX2V4X2NtZChjaGlwLCBNR19HRVRfSUJELCBtc19jYXJkLT5tZ19lbnRyeV9udW0pOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCVRSQUNFX0dPVE8oY2hpcCwgR2V0SUNWRmluaXNoKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBHZXRJQ1ZGaW5pc2g7CiAJfQogCiAJcmV0dmFsID0gbXNfdHJhbnNmZXJfZGF0YShjaGlwLCBNU19UTV9BVVRPX1JFQUQsIFBST19SRUFEX0xPTkdfREFUQSwKQEAgLTM5OTMsMTIgKzQ1ODUsMTQgQEAKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwotCQlUUkFDRV9HT1RPKGNoaXAsIEdldElDVkZpbmlzaCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gR2V0SUNWRmluaXNoOwogCX0KIAlpZiAoY2hlY2tfbXNfZXJyKGNoaXApKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwogCQlydHN4X2NsZWFyX21zX2Vycm9yKGNoaXApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJYnVmZmxlbiA9IG1pbl90KGludCwgMTAyOCwgc2NzaV9idWZmbGVuKHNyYikpOwpAQCAtNDAyMywxMiArNDYxNywxNiBAQAogCW1zX2NsZWFudXBfd29yayhjaGlwKTsKIAogCXJldHZhbCA9IG1zX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWJ1ZiA9IGttYWxsb2MoMTAyOCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRVJST1I7CisJfQogCiAJYnVmZmxlbiA9IG1pbl90KGludCwgMTAyOCwgc2NzaV9idWZmbGVuKHNyYikpOwogCXJ0c3hfc3Rvcl9nZXRfeGZlcl9idWYoYnVmLCBidWZmbGVuLCBzcmIpOwpAQCAtNDA0NSw3ICs0NjQzLDggQEAKIAkJfSBlbHNlIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19XUklURV9FUlIpOwogCQl9Ci0JCVRSQUNFX0dPVE8oY2hpcCwgU2V0SUNWRmluaXNoKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBTZXRJQ1ZGaW5pc2g7CiAJfQogCiAjaWZkZWYgTUdfU0VUX0lDVl9TTE9XCkBAIC00MDg0LDcgKzQ2ODMsOCBAQAogCQkJCQlTRU5TRV9UWVBFX01HX1dSSVRFX0VSUik7CiAJCQl9CiAJCQlyZXR2YWwgPSBTVEFUVVNfRkFJTDsKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU2V0SUNWRmluaXNoKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNldElDVkZpbmlzaDsKIAkJfQogCX0KICNlbHNlCkBAIC00MTAyLDcgKzQ3MDIsOCBAQAogCQl9IGVsc2UgewogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX1dSSVRFX0VSUik7CiAJCX0KLQkJVFJBQ0VfR09UTyhjaGlwLCBTZXRJQ1ZGaW5pc2gpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIFNldElDVkZpbmlzaDsKIAl9CiAjZW5kaWYKIApAQCAtNDE0MiwyMiArNDc0MywzNyBAQAogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBkaXNhYmxlX2NhcmRfY2xvY2soY2hpcCwgTVNfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CiAJCXJldHZhbCA9IG1zX3B1bGxfY3RsX2Rpc2FibGUoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfSBlbHNlIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRlBHQV9QVUxMX0NUTCwKLQkJCUZQR0FfTVNfUFVMTF9DVExfQklUIHwgMHgyMCwgRlBHQV9NU19QVUxMX0NUTF9CSVQpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEZQR0FfUFVMTF9DVEwsCisJCQkJCSAgICAgRlBHQV9NU19QVUxMX0NUTF9CSVQgfCAweDIwLAorCQkJCQkgICAgIEZQR0FfTVNfUFVMTF9DVExfQklUKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9PRSwgTVNfT1VUUFVUX0VOLCAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfT0UsIE1TX09VVFBVVF9FTiwgMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlpZiAoIWNoaXAtPmZ0Ml9mYXN0X21vZGUpIHsKIAkJcmV0dmFsID0gY2FyZF9wb3dlcl9vZmYoY2hpcCwgTVNfQ0FSRCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtNDE4NSw4ICs0ODAxLDEwIEBACiAjZW5kaWYKIAogCXJldHZhbCA9IG1zX3Bvd2VyX29mZl9jYXJkM3YzKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L21zLmgKaW5kZXggMjZjNWIwMy4uZDkxOTE3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvbXMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9tcy5oCkBAIC0yMDUsNyArMjA1LDcgQEAKIGludCBtc19ydyhzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsCiAJdTMyIHN0YXJ0X3NlY3RvciwgdTE2IHNlY3Rvcl9jbnQpOwogaW50IG1zcHJvX2Zvcm1hdChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsCi0JCWludCBzaG9ydF9kYXRhX2xlbiwgaW50IHF1aWNrX2Zvcm1hdCk7CisJCWludCBzaG9ydF9kYXRhX2xlbiwgYm9vbCBxdWlja19mb3JtYXQpOwogdm9pZCBtc19mcmVlX2wycF90Ymwoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCk7CiB2b2lkIG1zX2NsZWFudXBfd29yayhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKTsKIGludCBtc19wb3dlcl9vZmZfY2FyZDN2MyhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guYwppbmRleCBjNzRmMWI4Li5kNjRiNmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5jCkBAIC0yNiwxMiArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSAicnRzeC5oIgotI2luY2x1ZGUgInJ0c3hfY2hpcC5oIgotI2luY2x1ZGUgInJ0c3hfdHJhbnNwb3J0LmgiCi0jaW5jbHVkZSAicnRzeF9zY3NpLmgiCi0jaW5jbHVkZSAicnRzeF9jYXJkLmgiCi0jaW5jbHVkZSAiZ2VuZXJhbC5oIgotCiAjaW5jbHVkZSAibXMuaCIKICNpbmNsdWRlICJzZC5oIgogI2luY2x1ZGUgInhkLmgiCkBAIC0xMzcsOCArMTMxLDggQEAKIAogCS8qIGNoZWNrIGZvciBzdGF0ZS10cmFuc2l0aW9uIGVycm9ycyAqLwogCWlmIChjaGlwLT5zcmIgIT0gTlVMTCkgewotCQlkZXZfZXJyKCZkZXYtPnBjaS0+ZGV2LCAiRXJyb3IgaW4gJXM6IGNoaXAtPnNyYiA9ICVwXG4iLAotCQkJX19mdW5jX18sIGNoaXAtPnNyYik7CisJCWRldl9lcnIoJmRldi0+cGNpLT5kZXYsICJFcnJvcjogY2hpcC0+c3JiID0gJXBcbiIsCisJCQljaGlwLT5zcmIpOwogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0hPU1RfQlVTWTsKIAl9CiAKQEAgLTEwMzYsNyArMTAzMCw3IEBACiBNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcnRzeF9pZHMpOwogCiAvKiBwY2lfZHJpdmVyIGRlZmluaXRpb24gKi8KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBkcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcnRzeF9kcml2ZXIgPSB7CiAJLm5hbWUgPSBDUl9EUklWRVJfTkFNRSwKIAkuaWRfdGFibGUgPSBydHN4X2lkcywKIAkucHJvYmUgPSBydHN4X3Byb2JlLApAQCAtMTA0OCwyMSArMTA0Miw0IEBACiAJLnNodXRkb3duID0gcnRzeF9zaHV0ZG93biwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHJ0c3hfaW5pdCh2b2lkKQotewotCXByX2luZm8oIkluaXRpYWxpemluZyBSZWFsdGVrIFBDSUUgc3RvcmFnZSBkcml2ZXIuLi5cbiIpOwotCi0JcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBydHN4X2V4aXQodm9pZCkKLXsKLQlwcl9pbmZvKCJydHN4X2V4aXQoKSBjYWxsZWRcbiIpOwotCi0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOwotCi0JcHJfaW5mbygiJXMgbW9kdWxlIGV4aXRcbiIsIENSX0RSSVZFUl9OQU1FKTsKLX0KLQotbW9kdWxlX2luaXQocnRzeF9pbml0KQotbW9kdWxlX2V4aXQocnRzeF9leGl0KQorbW9kdWxlX3BjaV9kcml2ZXIocnRzeF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeC5oCmluZGV4IDllNmVjYjcuLjI2MjQ0MWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3guaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4LmgKQEAgLTQ2LDkgKzQ2LDYgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfZWguaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgogCi0jaW5jbHVkZSAidHJhY2UuaCIKLSNpbmNsdWRlICJnZW5lcmFsLmgiCi0KICNkZWZpbmUgQ1JfRFJJVkVSX05BTUUJCSJydHM1MjA4IgogCiAjZGVmaW5lIHBjaV9nZXRfYnVzX2FuZF9zbG90KGJ1cywgZGV2Zm4pCVwKQEAgLTE4MSw0ICsxNzgsMTQgQEAKIAogaW50IHJ0c3hfcmVhZF9wY2lfY2ZnX2J5dGUodTggYnVzLCB1OCBkZXYsIHU4IGZ1bmMsIHU4IG9mZnNldCwgdTggKnZhbCk7CiAKKyNkZWZpbmUgX01TR19UUkFDRQorCisjaW5jbHVkZSAidHJhY2UuaCIKKyNpbmNsdWRlICJydHN4X2NoaXAuaCIKKyNpbmNsdWRlICJydHN4X3RyYW5zcG9ydC5oIgorI2luY2x1ZGUgInJ0c3hfc2NzaS5oIgorI2luY2x1ZGUgInJ0c3hfY2FyZC5oIgorI2luY2x1ZGUgInJ0c3hfc3lzLmgiCisjaW5jbHVkZSAiZ2VuZXJhbC5oIgorCiAjZW5kaWYgIC8qIF9fUkVBTFRFS19SVFNYX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2FyZC5jIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMKaW5kZXggYjQ1OTVhYi4uNDM3NDM2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmMKQEAgLTI3LDEzICsyNyw2IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAKICNpbmNsdWRlICJydHN4LmgiCi0jaW5jbHVkZSAicnRzeF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJydHN4X3Njc2kuaCIKLSNpbmNsdWRlICJydHN4X2NhcmQuaCIKLQotI2luY2x1ZGUgInJ0c3hfc3lzLmgiCi0jaW5jbHVkZSAiZ2VuZXJhbC5oIgotCiAjaW5jbHVkZSAic2QuaCIKICNpbmNsdWRlICJ4ZC5oIgogI2luY2x1ZGUgIm1zLmgiCkBAIC02NTcsOCArNjUwLDEwIEBACiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlN3aXRjaCBTU0MgY2xvY2sgdG8gJWRNSHogKGN1cl9jbGsgPSAlZClcbiIsCiAJCWNsaywgY2hpcC0+Y3VyX2Nsayk7CiAKLQlpZiAoKGNsayA8PSAyKSB8fCAoTiA+IG1heF9OKSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoKGNsayA8PSAyKSB8fCAoTiA+IG1heF9OKSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJbWN1X2NudCA9ICh1OCkoMTI1L2NsayArIDMpOwogCWlmIChtY3VfY250ID4gNykKQEAgLTY5NywxMSArNjkyLDE3IEBACiAJfQogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCBXQUlUX1RJTUUpOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0VSUk9SOworCX0KIAogCXVkZWxheSgxMCk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0xLX0NUTCwgQ0xLX0xPV19GUkVRLCAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19DVEwsIENMS19MT1dfRlJFUSwgMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWNoaXAtPmN1cl9jbGsgPSBjbGs7CiAKQEAgLTcxMCw2ICs3MTEsNyBAQAogCiBpbnQgc3dpdGNoX25vcm1hbF9jbG9jayhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCBpbnQgY2xrKQogeworCWludCByZXR2YWw7CiAJdTggc2VsLCBkaXYsIG1jdV9jbnQ7CiAJaW50IHNkX3ZwY2xrX3BoYXNlX3Jlc2V0ID0gMDsKIApAQCAtNzkwLDI2ICs3OTIsNjIgQEAKIAlkZWZhdWx0OgogCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiVHJ5IHRvIHN3aXRjaCB0byBhbiBpbGxlZ2FsIGNsb2NrICglZClcbiIsCiAJCQljbGspOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0xLX0NUTCwgMHhGRiwgQ0xLX0xPV19GUkVRKTsKLQlpZiAoc2RfdnBjbGtfcGhhc2VfcmVzZXQpIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBDTEswX0NUTCwgUEhBU0VfTk9UX1JFU0VULCAwKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBDTEsxX0NUTCwgUEhBU0VfTk9UX1JFU0VULCAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19DVEwsIDB4RkYsIENMS19MT1dfRlJFUSk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOwogCX0KLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfRElWLCAweEZGLCAoZGl2IDw8IDQpIHwgbWN1X2NudCk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0xLX1NFTCwgMHhGRiwgc2VsKTsKKwlpZiAoc2RfdnBjbGtfcGhhc2VfcmVzZXQpIHsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9WUENMSzBfQ1RMLAorCQkJCQkgICAgIFBIQVNFX05PVF9SRVNFVCwgMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfVlBDTEsxX0NUTCwKKwkJCQkJICAgICBQSEFTRV9OT1RfUkVTRVQsIDApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19ESVYsIDB4RkYsCisJCQkJICAgICAoZGl2IDw8IDQpIHwgbWN1X2NudCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19TRUwsIDB4RkYsIHNlbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWlmIChzZF92cGNsa19waGFzZV9yZXNldCkgewogCQl1ZGVsYXkoMjAwKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBDTEswX0NUTCwgUEhBU0VfTk9UX1JFU0VULAotCQkJCVBIQVNFX05PVF9SRVNFVCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX1ZQQ0xLMV9DVEwsIFBIQVNFX05PVF9SRVNFVCwKLQkJCQlQSEFTRV9OT1RfUkVTRVQpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1ZQQ0xLMF9DVEwsCisJCQkJCSAgICAgUEhBU0VfTk9UX1JFU0VULCBQSEFTRV9OT1RfUkVTRVQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1ZQQ0xLMV9DVEwsCisJCQkJCSAgICAgUEhBU0VfTk9UX1JFU0VULCBQSEFTRV9OT1RfUkVTRVQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCQl1ZGVsYXkoMjAwKTsKIAl9Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0xLX0NUTCwgMHhGRiwgMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDTEtfQ1RMLCAweEZGLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJY2hpcC0+Y3VyX2NsayA9IGNsazsKIApAQCAtODQ0LDYgKzg4Miw3IEBACiAKIGludCBlbmFibGVfY2FyZF9jbG9jayhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBjYXJkKQogeworCWludCByZXR2YWw7CiAJdTggY2xrX2VuID0gMDsKIAogCWlmIChjYXJkICYgWERfQ0FSRCkKQEAgLTg1MywxMyArODkyLDE4IEBACiAJaWYgKGNhcmQgJiBNU19DQVJEKQogCQljbGtfZW4gfD0gTVNfQ0xLX0VOOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9DTEtfRU4sIGNsa19lbiwgY2xrX2VuKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfQ0xLX0VOLCBjbGtfZW4sIGNsa19lbik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAogaW50IGRpc2FibGVfY2FyZF9jbG9jayhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBjYXJkKQogeworCWludCByZXR2YWw7CiAJdTggY2xrX2VuID0gMDsKIAogCWlmIChjYXJkICYgWERfQ0FSRCkKQEAgLTg2OSw3ICs5MTMsMTEgQEAKIAlpZiAoY2FyZCAmIE1TX0NBUkQpCiAJCWNsa19lbiB8PSBNU19DTEtfRU47CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX0NMS19FTiwgY2xrX2VuLCAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfQ0xLX0VOLCBjbGtfZW4sIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC04OTMsOCArOTQxLDEwIEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfUFdSX0NUTCwgbWFzaywgdmFsMSk7CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIDAsIDEwMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAl1ZGVsYXkoY2hpcC0+cG1vc19wd3Jfb25faW50ZXJ2YWwpOwogCkBAIC05MDIsMTQgKzk1MiwxNyBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBXUklURV9SRUdfQ01ELCBDQVJEX1BXUl9DVEwsIG1hc2ssIHZhbDIpOwogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAxMDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCiBpbnQgY2FyZF9wb3dlcl9vZmYoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggY2FyZCkKIHsKKwlpbnQgcmV0dmFsOwogCXU4IG1hc2ssIHZhbDsKIAogCWlmIChDSEVDS19MVU5fTU9ERShjaGlwLCBTRF9NU18yTFVOKSAmJiAoY2FyZCA9PSBNU19DQVJEKSkgewpAQCAtOTIwLDcgKzk3MywxMSBAQAogCQl2YWwgPSBTRF9QT1dFUl9PRkY7CiAJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QV1JfQ1RMLCBtYXNrLCB2YWwpOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QV1JfQ1RMLCBtYXNrLCB2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC05MzIsOCArOTg5LDEwIEBACiAJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CiAJaW50IGk7CiAKLQlpZiAoY2hpcC0+cndfY2FyZFtsdW5dID09IE5VTEwpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGNoaXAtPnJ3X2NhcmRbbHVuXSA9PSBOVUxMKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCWNoaXAtPnJ3X25lZWRfcmV0cnkgPSAwOwpAQCAtOTQyLDExICsxMDAxLDE0IEBACiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWlmIChydHN4X2NoZWNrX2NoaXBfZXhpc3QoY2hpcCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlydHN4X3JlbGVhc2VfY2hpcChjaGlwKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIGNoaXAtPmN1cl9jYXJkKSAhPQotCQkJCQkJCVNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCQkJU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAogCQkJaWYgKCFjaGlwLT5yd19uZWVkX3JldHJ5KSB7CiAJCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlJXIGZhaWwsIGJ1dCBubyBuZWVkIHRvIHJldHJ5XG4iKTsKQEAgLTk2NSw2ICsxMDI3LDcgQEAKIAogaW50IGNhcmRfc2hhcmVfbW9kZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCBpbnQgY2FyZCkKIHsKKwlpbnQgcmV0dmFsOwogCXU4IG1hc2ssIHZhbHVlOwogCiAJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpKSB7CkBAIC05NzUsOCArMTAzOCwxMCBAQAogCQkJdmFsdWUgPSBDQVJEX1NIQVJFXzQ4X01TOwogCQllbHNlIGlmIChjYXJkID09IFhEX0NBUkQpCiAJCQl2YWx1ZSA9IENBUkRfU0hBUkVfNDhfWEQ7Ci0JCWVsc2UKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWVsc2UgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJfSBlbHNlIGlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkgewogCQltYXNrID0gMHgwMzsKQEAgLTk4NiwxNCArMTA1MSwyMSBAQAogCQkJdmFsdWUgPSBDQVJEX1NIQVJFX0JBUk9TU0FfTVM7CiAJCWVsc2UgaWYgKGNhcmQgPT0gWERfQ0FSRCkKIAkJCXZhbHVlID0gQ0FSRF9TSEFSRV9CQVJPU1NBX1hEOwotCQllbHNlCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQllbHNlIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCX0gZWxzZSB7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1NIQVJFX01PREUsIG1hc2ssIHZhbHVlKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfU0hBUkVfTU9ERSwgbWFzaywgdmFsdWUpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0xMDE0LDE1ICsxMDg2LDIzIEBACiAJCQltb2QgPSBYRF9NT0RfU0VMOwogCQllbHNlIGlmIChjYXJkID09IFNQSV9DQVJEKQogCQkJbW9kID0gU1BJX01PRF9TRUw7Ci0JCWVsc2UKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWVsc2UgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCi0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfU0VMRUNULCAweDA3LCBtb2QpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfU0VMRUNULCAweDA3LCBtb2QpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCQljaGlwLT5jdXJfY2FyZCA9IGNhcmQ7CiAKIAkJcmV0dmFsID0gIGNhcmRfc2hhcmVfbW9kZShjaGlwLCBjYXJkKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xMDY3LDEyICsxMTQ3LDE1IEBACiAJCWNhcmRfY2QgPSBYRF9FWElTVDsKIAl9IGVsc2UgewogCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiV3JvbmcgY2FyZCB0eXBlOiAweCV4XG4iLCBjYXJkKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXN0YXR1cyA9IHJ0c3hfcmVhZGwoY2hpcCwgUlRTWF9CSVBSKTsKLQlpZiAoIShzdGF0dXMgJiBjYXJkX2NkKSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoIShzdGF0dXMgJiBjYXJkX2NkKSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF9jYXJkLmggYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NhcmQuaAppbmRleCA3NWNmNTg4Li44ZjJjZjlhNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2FyZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2FyZC5oCkBAIC0xMDYxLDcgKzEwNjEsMTMgQEAKIAogc3RhdGljIGlubGluZSBpbnQgY2FyZF9wb3dlcl9vZmZfYWxsKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QV1JfQ1RMLCAweDBGLCAweDBGKTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BXUl9DVEwsIDB4MEYsIDB4MEYpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5jCmluZGV4IDk1OTNkODEuLjBjMTcxNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5jCkBAIC0yNywxMyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2luY2x1ZGUgInJ0c3guaCIKLSNpbmNsdWRlICJydHN4X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInJ0c3hfc2NzaS5oIgotI2luY2x1ZGUgInJ0c3hfY2FyZC5oIgotI2luY2x1ZGUgInJ0c3hfY2hpcC5oIgotI2luY2x1ZGUgInJ0c3hfc3lzLmgiCi0jaW5jbHVkZSAiZ2VuZXJhbC5oIgotCiAjaW5jbHVkZSAic2QuaCIKICNpbmNsdWRlICJ4ZC5oIgogI2luY2x1ZGUgIm1zLmgiCkBAIC0xMjMsMjIgKzExNiw0NiBAQAogCiBzdGF0aWMgaW50IHJ0c3hfcHJlX2hhbmRsZV9zZGlvX29sZChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogeworCWludCByZXR2YWw7CisKIAlpZiAoY2hpcC0+aWdub3JlX3NkICYmIENIS19TRElPX0VYSVNUKGNoaXApKSB7CiAJCWlmIChjaGlwLT5hc2ljX2NvZGUpIHsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEw1LCAweEZGLAotCQkJCSAgICAgICBNU19JTlNfUFUgfCBTRF9XUF9QVSB8Ci0JCQkJICAgICAgIFNEX0NEX1BVIHwgU0RfQ01EX1BVKTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDUsCisJCQkJCQkgICAgIDB4RkYsCisJCQkJCQkgICAgIE1TX0lOU19QVSB8IFNEX1dQX1BVIHwgU0RfQ0RfUFUgfCBTRF9DTURfUFUpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJfSBlbHNlIHsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIEZQR0FfUFVMTF9DVEwsIDB4RkYsCi0JCQkJICAgICAgIEZQR0FfU0RfUFVMTF9DVExfRU4pOworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBGUEdBX1BVTExfQ1RMLAorCQkJCQkJICAgICAweEZGLAorCQkJCQkJICAgICBGUEdBX1NEX1BVTExfQ1RMX0VOKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CiAJCX0KLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9TSEFSRV9NT0RFLCAweEZGLCBDQVJEX1NIQVJFXzQ4X1NEKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1NIQVJFX01PREUsIDB4RkYsCisJCQkJCSAgICAgQ0FSRF9TSEFSRV80OF9TRCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAKIAkJLyogRW5hYmxlIFNESU8gaW50ZXJuYWwgY2xvY2sgKi8KLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgMHhGRjJDLCAweDAxLCAweDAxKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCAweEZGMkMsIDB4MDEsIDB4MDEpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCi0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNESU9fQ1RSTCwgMHhGRiwKLQkJCSAgICAgICBTRElPX0JVU19DVFJMIHwgU0RJT19DRF9DVFJMKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRElPX0NUUkwsIDB4RkYsCisJCQkJCSAgICAgU0RJT19CVVNfQ1RSTCB8IFNESU9fQ0RfQ1RSTCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAKIAkJY2hpcC0+c2RfaW50ID0gMTsKIAkJY2hpcC0+c2RfaW8gPSAxOwpAQCAtMTUzLDIyICsxNzAsMzAgQEAKIHN0YXRpYyBpbnQgcnRzeF9wcmVfaGFuZGxlX3NkaW9fbmV3KHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJdTggdG1wOwotCWludCBzd19ieXBhc3Nfc2QgPSAwOworCWJvb2wgc3dfYnlwYXNzX3NkID0gZmFsc2U7CiAJaW50IHJldHZhbDsKIAogCWlmIChjaGlwLT5kcml2ZXJfZmlyc3RfbG9hZCkgewogCQlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpIHsKLQkJCVJUU1hfUkVBRF9SRUcoY2hpcCwgMHhGRTVBLCAmdG1wKTsKKwkJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCAweEZFNUEsICZ0bXApOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJCWlmICh0bXAgJiAweDA4KQotCQkJCXN3X2J5cGFzc19zZCA9IDE7CisJCQkJc3dfYnlwYXNzX3NkID0gdHJ1ZTsKIAkJfSBlbHNlIGlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgewotCQkJUlRTWF9SRUFEX1JFRyhjaGlwLCAweEZFNzAsICZ0bXApOworCQkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIDB4RkU3MCwgJnRtcCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQkJaWYgKHRtcCAmIDB4ODApCi0JCQkJc3dfYnlwYXNzX3NkID0gMTsKKwkJCQlzd19ieXBhc3Nfc2QgPSB0cnVlOwogCQl9CiAJfSBlbHNlIHsKIAkJaWYgKGNoaXAtPnNkaW9faW5fY2hhcmdlKQotCQkJc3dfYnlwYXNzX3NkID0gMTsKKwkJCXN3X2J5cGFzc19zZCA9IHRydWU7CiAJfQogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJjaGlwLT5zZGlvX2luX2NoYXJnZSA9ICVkXG4iLAogCQljaGlwLT5zZGlvX2luX2NoYXJnZSk7CkBAIC0xODAsMTcgKzIwNSwzNyBAQAogCWlmIChzd19ieXBhc3Nfc2QpIHsKIAkJdTggY2RfdG9nZ2xlX21hc2sgPSAwOwogCi0JCVJUU1hfUkVBRF9SRUcoY2hpcCwgVExQVElTVEFULCAmdG1wKTsKKwkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFRMUFRJU1RBVCwgJnRtcCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCWNkX3RvZ2dsZV9tYXNrID0gMHgwODsKIAogCQlpZiAodG1wICYgY2RfdG9nZ2xlX21hc2spIHsKIAkJCS8qIERpc2FibGUgc2Rpb19idXNfYXV0b19zd2l0Y2ggKi8KLQkJCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkKLQkJCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCAweEZFNUEsIDB4MDgsIDB4MDApOwotCQkJZWxzZSBpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTIwOCkpCi0JCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgMHhGRTcwLCAweDgwLCAweDAwKTsKKwkJCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkgeworCQkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgMHhGRTVBLAorCQkJCQkJCSAgICAgMHgwOCwgMHgwMCk7CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTIwOCkpIHsKKwkJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIDB4RkU3MCwKKwkJCQkJCQkgICAgIDB4ODAsIDB4MDApOworCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIHJldHZhbDsKKwkJCQl9CisJCQl9CiAKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFRMUFRJU1RBVCwgMHhGRiwgdG1wKTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgVExQVElTVEFULCAweEZGLAorCQkJCQkJICAgICB0bXApOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAogCQkJY2hpcC0+bmVlZF9yZXNldCB8PSBTRF9DQVJEOwogCQl9IGVsc2UgewpAQCAtMTk4LDI3ICsyNDMsNTIgQEAKIAogCQkJaWYgKGNoaXAtPmFzaWNfY29kZSkgewogCQkJCXJldHZhbCA9IHNkX3B1bGxfY3RsX2VuYWJsZShjaGlwKTsKLQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRlBHQV9QVUxMX0NUTCwKLQkJCQkJICAgICAgIEZQR0FfU0RfUFVMTF9DVExfQklUIHwgMHgyMCwgMCk7CisJCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLAorCQkJCQkJCSAgICAgRlBHQV9QVUxMX0NUTCwKKwkJCQkJCQkgICAgIEZQR0FfU0RfUFVMTF9DVExfQklUIHwgMHgyMCwKKwkJCQkJCQkgICAgIDApOworCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIHJldHZhbDsKKwkJCQl9CiAJCQl9CiAJCQlyZXR2YWwgPSBjYXJkX3NoYXJlX21vZGUoY2hpcCwgU0RfQ0FSRCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAKIAkJCS8qIEVuYWJsZSBzZGlvX2J1c19hdXRvX3N3aXRjaCAqLwotCQkJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpKQotCQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIDB4RkU1QSwgMHgwOCwgMHgwOCk7Ci0JCQllbHNlIGlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkKLQkJCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCAweEZFNzAsIDB4ODAsIDB4ODApOworCQkJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpKSB7CisJCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCAweEZFNUEsCisJCQkJCQkJICAgICAweDA4LCAweDA4KTsKKwkJCQlpZiAocmV0dmFsKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiByZXR2YWw7CisJCQkJfQorCQkJfSBlbHNlIGlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgeworCQkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgMHhGRTcwLAorCQkJCQkJCSAgICAgMHg4MCwgMHg4MCk7CisJCQkJaWYgKHJldHZhbCkgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gcmV0dmFsOworCQkJCX0KKwkJCX0KIAogCQkJY2hpcC0+Y2hpcF9pbnNlcnRfd2l0aF9zZGlvID0gMTsKIAkJCWNoaXAtPnNkX2lvID0gMTsKIAkJfQogCX0gZWxzZSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFRMUFRJU1RBVCwgMHgwOCwgMHgwOCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgVExQVElTVEFULCAweDA4LCAweDA4KTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAogCQljaGlwLT5uZWVkX3Jlc2V0IHw9IFNEX0NBUkQ7CiAJfQpAQCAtMjM3LDI1ICszMDcsMzYgQEAKIAogCQlyZXQgPSBydHN4X3dyaXRlX2NmZ19kdyhjaGlwLCAyLCAweEMwLCAweEZGLAogCQkJCQljaGlwLT5hc3BtX2wwc19sMV9lbik7Ci0JCWlmIChyZXQgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0ICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogCX0KIAotCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQVNQTV9GT1JDRV9DVEwsIDB4RkYsIDB4M0YpOworCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgeworCQlyZXQgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEFTUE1fRk9SQ0VfQ1RMLCAweEZGLCAweDNGKTsKKwkJaWYgKHJldCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CiAJcmV0ID0gcnRzeF93cml0ZV9jb25maWdfYnl0ZShjaGlwLCBMQ1RMUiwgY2hpcC0+YXNwbV9sMHNfbDFfZW4pOwotCWlmIChyZXQgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJY2hpcC0+YXNwbV9sZXZlbFswXSA9IGNoaXAtPmFzcG1fbDBzX2wxX2VuOwogCWlmIChDSEtfU0RJT19FWElTVChjaGlwKSkgewogCQljaGlwLT5hc3BtX2xldmVsWzFdID0gY2hpcC0+YXNwbV9sMHNfbDFfZW47CiAJCXJldCA9IHJ0c3hfd3JpdGVfY2ZnX2R3KGNoaXAsIENIRUNLX1BJRChjaGlwLCAweDUyODgpID8gMiA6IDEsCiAJCQkJCTB4QzAsIDB4RkYsIGNoaXAtPmFzcG1fbDBzX2wxX2VuKTsKLQkJaWYgKHJldCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXQgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAljaGlwLT5hc3BtX2VuYWJsZWQgPSAxOwpAQCAtMjczLDcgKzM1NCwxMSBAQAogCX0KIAogCWlmIChjaGlwLT5waHlfZGVidWdfbW9kZSkgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDRFJFU1VNRUNUTCwgMHg3NywgMCk7CisJCXJldCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0RSRVNVTUVDVEwsIDB4NzcsIDApOworCQlpZiAocmV0KSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldDsKKwkJfQogCQlydHN4X2Rpc2FibGVfYnVzX2ludChjaGlwKTsKIAl9IGVsc2UgewogCQlydHN4X2VuYWJsZV9idXNfaW50KGNoaXApOwpAQCAtMjgzLDIzICszNjgsMzEgQEAKIAkJdTE2IHJlZzsKIAogCQlyZXQgPSBydHN4X3JlYWRfcGh5X3JlZ2lzdGVyKGNoaXAsIDB4MDAsICZyZWcpOwotCQlpZiAocmV0ICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJlZyAmPSAweEZFN0Y7CiAJCXJlZyB8PSAweDgwOwogCQlyZXQgPSBydHN4X3dyaXRlX3BoeV9yZWdpc3RlcihjaGlwLCAweDAwLCByZWcpOwotCQlpZiAocmV0ICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJldCA9IHJ0c3hfcmVhZF9waHlfcmVnaXN0ZXIoY2hpcCwgMHgxQywgJnJlZyk7Ci0JCWlmIChyZXQgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0ICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmVnICY9IDB4RkZGNzsKIAkJcmV0ID0gcnRzeF93cml0ZV9waHlfcmVnaXN0ZXIoY2hpcCwgMHgxQywgcmVnKTsKLQkJaWYgKHJldCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXQgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlpZiAoY2hpcC0+ZHJpdmVyX2ZpcnN0X2xvYWQgJiYgKGNoaXAtPmljX3ZlcnNpb24gPCBJQ19WRVJfQykpCkBAIC0zMTYsNDcgKzQwOSwxMTYgQEAKIAogCXJ0c3hfZGlzYWJsZV9hc3BtKGNoaXApOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgSE9TVF9TTEVFUF9TVEFURSwgMHgwMywgMHgwMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBIT1NUX1NMRUVQX1NUQVRFLCAweDAzLCAweDAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJLyogRGlzYWJsZSBjYXJkIGNsb2NrICovCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9DTEtfRU4sIDB4MUUsIDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9DTEtfRU4sIDB4MUUsIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKICNpZmRlZiBTVVBQT1JUX09DUAogCS8qIFNTQyBwb3dlciBvbiwgT0NEIHBvd2VyIG9uICovCi0JaWYgKENIRUNLX0xVTl9NT0RFKGNoaXAsIFNEX01TXzJMVU4pKQotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBGUERDVEwsIE9DX1BPV0VSX0RPV04sIDApOwotCWVsc2UKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRlBEQ1RMLCBPQ19QT1dFUl9ET1dOLCBNU19PQ19QT1dFUl9ET1dOKTsKKwlpZiAoQ0hFQ0tfTFVOX01PREUoY2hpcCwgU0RfTVNfMkxVTikpIHsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBGUERDVEwsIE9DX1BPV0VSX0RPV04sIDApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0gZWxzZSB7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRlBEQ1RMLCBPQ19QT1dFUl9ET1dOLAorCQkJCQkgICAgIE1TX09DX1BPV0VSX0RPV04pOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIE9DUFBBUkExLCBPQ1BfVElNRV9NQVNLLCBPQ1BfVElNRV84MDApOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIE9DUFBBUkEyLCBPQ1BfVEhEX01BU0ssIE9DUF9USERfMjQ0Xzk0Nik7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgT0NQQ1RMLCAweEZGLCBDQVJEX09DX0lOVF9FTiB8IENBUkRfREVURUNUX0VOKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE9DUFBBUkExLCBPQ1BfVElNRV9NQVNLLAorCQkJCSAgICAgT0NQX1RJTUVfODAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgT0NQUEFSQTIsIE9DUF9USERfTUFTSywKKwkJCQkgICAgIE9DUF9USERfMjQ0Xzk0Nik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE9DUENUTCwgMHhGRiwKKwkJCQkgICAgIENBUkRfT0NfSU5UX0VOIHwgQ0FSRF9ERVRFQ1RfRU4pOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAjZWxzZQogCS8qIE9DIHBvd2VyIGRvd24gKi8KLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBGUERDVEwsIE9DX1BPV0VSX0RPV04sIE9DX1BPV0VSX0RPV04pOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRlBEQ1RMLCBPQ19QT1dFUl9ET1dOLAorCQkJCSAgICAgT0NfUE9XRVJfRE9XTik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KICNlbmRpZgogCi0JaWYgKCFDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9HUElPX0RJUiwgMHhGRiwgMHgwMyk7CisJaWYgKCFDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSkgeworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfR1BJT19ESVIsIDB4RkYsIDB4MDMpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KIAogCS8qIFR1cm4gb2ZmIExFRCAqLwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfR1BJTywgMHhGRiwgMHgwMyk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU8sIDB4RkYsIDB4MDMpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAkvKiBSZXNldCBkZWxpbmsgbW9kZSAqLwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENIQU5HRV9MSU5LX1NUQVRFLCAweDBBLCAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENIQU5HRV9MSU5LX1NUQVRFLCAweDBBLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJLyogQ2FyZCBkcml2aW5nIHNlbGVjdCAqLwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfRFJJVkVfU0VMLCAweEZGLCBjaGlwLT5jYXJkX2RyaXZlX3NlbCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0RSSVZFX1NFTCwgMHhGRiwKKwkJCQkgICAgIGNoaXAtPmNhcmRfZHJpdmVfc2VsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAjaWZkZWYgTEVEX0FVVE9fQkxJTksKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX0FVVE9fQkxJTkssIDB4RkYsCi0JCSAgICAgICBMRURfQkxJTktfU1BFRUQgfCBCTElOS19FTiB8IExFRF9HUElPMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0FVVE9fQkxJTkssIDB4RkYsCisJCQkJICAgICBMRURfQkxJTktfU1BFRUQgfCBCTElOS19FTiB8IExFRF9HUElPMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KICNlbmRpZgogCiAJaWYgKGNoaXAtPmFzaWNfY29kZSkgewogCQkvKiBFbmFibGUgU1NDIENsb2NrICovCi0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNTQ19DVEwxLCAweEZGLCBTU0NfOFhfRU4gfCBTU0NfU0VMXzRNKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU1NDX0NUTDIsIDB4RkYsIDB4MTIpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNTQ19DVEwxLCAweEZGLAorCQkJCQkgICAgIFNTQ184WF9FTiB8IFNTQ19TRUxfNE0pOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNTQ19DVEwyLCAweEZGLCAweDEyKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9CiAKIAkvKiBEaXNhYmxlIGNkX3B3cl9zYXZlICh1X2ZvcmNlX3JzdF9jb3JlX2VuPTAsIHVfY2RfcnN0X2NvcmVfZW49MCkKQEAgLTM2Niw1NSArNTI4LDg0IEBACiAJICAgICAgYml0WzVdICAgIHVfbWFjX3BoeV9yc3Rfbl9kYmcJcnN0X3ZhbHVlID0gMQogCSAgICAgIGJpdFs0XQl1X25vbl9zdGlja3lfcnN0X25fZGJnCXJzdF92YWx1ZSA9IDAKIAkqLwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENIQU5HRV9MSU5LX1NUQVRFLCAweDE2LCAweDEwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENIQU5HRV9MSU5LX1NUQVRFLCAweDE2LCAweDEwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJLyogRW5hYmxlIEFTUE0gKi8KIAlpZiAoY2hpcC0+YXNwbV9sMHNfbDFfZW4pIHsKIAkJcmV0dmFsID0gcnRzeF9yZXNldF9hc3BtKGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0gZWxzZSB7CiAJCWlmIChjaGlwLT5hc2ljX2NvZGUgJiYgQ0hFQ0tfUElEKGNoaXAsIDB4NTIwOCkpIHsKIAkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKGNoaXAsIDB4MDcsIDB4MDEyOSk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAJCX0KIAkJcmV0dmFsID0gcnRzeF93cml0ZV9jb25maWdfYnl0ZShjaGlwLCBMQ1RMUiwKIAkJCQkJCWNoaXAtPmFzcG1fbDBzX2wxX2VuKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR2YWwgPSBydHN4X3dyaXRlX2NvbmZpZ19ieXRlKGNoaXAsIDB4ODEsIDEpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKENIS19TRElPX0VYSVNUKGNoaXApKSB7CiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfY2ZnX2R3KGNoaXAsCiAJCQkJCSAgIENIRUNLX1BJRChjaGlwLCAweDUyODgpID8gMiA6IDEsCiAJCQkJCSAgIDB4QzAsIDB4RkYwMCwgMHgwMTAwKTsKIAotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1Mjg4KSAmJiAhQ0hLX1NESU9fRVhJU1QoY2hpcCkpIHsKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9jZmdfZHcoY2hpcCwgMiwgMHhDMCwgMHhGRkZGLCAweDAxMDMpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfY2ZnX2R3KGNoaXAsIDIsIDB4ODQsIDB4RkYsIDB4MDMpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIElSUVNUQVQwLCBMSU5LX1JEWV9JTlQsIExJTktfUkRZX0lOVCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBJUlFTVEFUMCwgTElOS19SRFlfSU5ULAorCQkJCSAgICAgTElOS19SRFlfSU5UKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgUEVSU1RfR0xJVENIX1dJRFRILCAweEZGLCAweDgwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBFUlNUX0dMSVRDSF9XSURUSCwgMHhGRiwgMHg4MCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHZhbCA9IHJ0c3hfZW5hYmxlX3BjaWVfaW50cihjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWNoaXAtPm5lZWRfcmVzZXQgPSAwOwogCkBAIC00MzYsMTMgKzYyNywxOSBAQAogI2Vsc2UgIC8qIEhXX0FVVE9fU1dJVENIX1NEX0JVUyAqLwogCQlyZXR2YWwgPSBydHN4X3ByZV9oYW5kbGVfc2Rpb19vbGQoY2hpcCk7CiAjZW5kaWYgIC8qIEhXX0FVVE9fU1dJVENIX1NEX0JVUyAqLwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJfSBlbHNlIHsKIAkJY2hpcC0+c2RfaW8gPSAwOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRElPX0NUUkwsIFNESU9fQlVTX0NUUkwgfCBTRElPX0NEX0NUUkwsCi0JCQkgICAgICAgMCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RJT19DVFJMLAorCQkJCQkgICAgIFNESU9fQlVTX0NUUkwgfCBTRElPX0NEX0NUUkwsIDApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0KIAogbmV4dGNhcmQ6CkBAIC00NTAsNDMgKzY0Nyw5MSBAQAogCQljaGlwLT5uZWVkX3Jlc2V0IHw9IFhEX0NBUkQ7CiAJaWYgKGNoaXAtPmludF9yZWcgJiBNU19FWElTVCkKIAkJY2hpcC0+bmVlZF9yZXNldCB8PSBNU19DQVJEOwotCWlmIChjaGlwLT5pbnRfcmVnICYgQ0FSRF9FWElTVCkKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU1NDX0NUTDEsIFNTQ19SU1RCLCBTU0NfUlNUQik7CisJaWYgKGNoaXAtPmludF9yZWcgJiBDQVJEX0VYSVNUKSB7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU1NDX0NUTDEsIFNTQ19SU1RCLAorCQkJCQkgICAgIFNTQ19SU1RCKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiSW4gJXMsIGNoaXAtPm5lZWRfcmVzZXQgPSAweCV4XG4iLCBfX2Z1bmNfXywKIAkJKHVuc2lnbmVkIGludCkoY2hpcC0+bmVlZF9yZXNldCkpOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgUkNDVEwsIDB4MDEsIDB4MDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkNDVEwsIDB4MDEsIDB4MDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTIwOCkgfHwgQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpIHsKIAkJLyogVHVybiBvZmYgbWFpbiBwb3dlciB3aGVuIGVudGVyaW5nIFMzL1M0IHN0YXRlICovCi0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIE1BSU5fUFdSX09GRl9DVEwsIDB4MDMsIDB4MDMpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIE1BSU5fUFdSX09GRl9DVEwsIDB4MDMsCisJCQkJCSAgICAgMHgwMyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfQogCiAJaWYgKGNoaXAtPnJlbW90ZV93YWtldXBfZW4gJiYgIWNoaXAtPmF1dG9fZGVsaW5rX2VuKSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFdBS0VfU0VMX0NUTCwgMHgwNywgMHgwNyk7Ci0JCWlmIChjaGlwLT5hdXhfcHdyX2V4aXN0KQotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgUE1FX0ZPUkNFX0NUTCwgMHhGRiwgMHgzMyk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgV0FLRV9TRUxfQ1RMLCAweDA3LCAweDA3KTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJaWYgKGNoaXAtPmF1eF9wd3JfZXhpc3QpIHsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUE1FX0ZPUkNFX0NUTCwKKwkJCQkJCSAgICAgMHhGRiwgMHgzMyk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQl9CiAJfSBlbHNlIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgV0FLRV9TRUxfQ1RMLCAweDA3LCAweDA0KTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgUE1FX0ZPUkNFX0NUTCwgMHhGRiwgMHgzMCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgV0FLRV9TRUxfQ1RMLCAweDA3LCAweDA0KTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQTUVfRk9SQ0VfQ1RMLCAweEZGLCAweDMwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9CiAKLQlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTIwOCkgJiYgKGNoaXAtPmljX3ZlcnNpb24gPj0gSUNfVkVSX0QpKQotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBQRVRYQ0ZHLCAweDFDLCAweDE0KTsKKwlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTIwOCkgJiYgKGNoaXAtPmljX3ZlcnNpb24gPj0gSUNfVkVSX0QpKSB7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUEVUWENGRywgMHgxQywgMHgxNCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQogCiAJaWYgKGNoaXAtPmFzaWNfY29kZSAmJiBDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgewogCQlyZXR2YWwgPSBydHN4X2Nscl9waHlfcmVnX2JpdChjaGlwLCAweDFDLCAyKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlpZiAoY2hpcC0+ZnQyX2Zhc3RfbW9kZSkgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BXUl9DVEwsIDB4RkYsCi0JCQkgICAgICAgTVNfUEFSVElBTF9QT1dFUl9PTiB8IFNEX1BBUlRJQUxfUE9XRVJfT04pOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFdSX0NUTCwgMHhGRiwKKwkJCQkJICAgICBNU19QQVJUSUFMX1BPV0VSX09OIHwgU0RfUEFSVElBTF9QT1dFUl9PTik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCXVkZWxheShjaGlwLT5wbW9zX3B3cl9vbl9pbnRlcnZhbCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFdSX0NUTCwgMHhGRiwKLQkJCSAgICAgICBNU19QT1dFUl9PTiB8IFNEX1BPV0VSX09OKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BXUl9DVEwsIDB4RkYsCisJCQkJCSAgICAgTVNfUE9XRVJfT04gfCBTRF9QT1dFUl9PTik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAKIAkJd2FpdF90aW1lb3V0KDIwMCk7CiAJfQpAQCAtNTAxLDEzICs3NDYsMTQgQEAKIAogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc2Rfc3BlZWRfcHJpb3IodTMyIHNkX3NwZWVkX3ByaW9yKQogewotCWludCBpLCBmYWtlX3BhcmEgPSAwOworCWJvb2wgZmFrZV9wYXJhID0gZmFsc2U7CisJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAJCXU4IHRtcCA9ICh1OCkoc2Rfc3BlZWRfcHJpb3IgPj4gKGkqOCkpOwogCiAJCWlmICgodG1wIDwgMHgwMSkgfHwgKHRtcCA+IDB4MDQpKSB7Ci0JCQlmYWtlX3BhcmEgPSAxOworCQkJZmFrZV9wYXJhID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNTE3LDEzICs3NjMsMTQgQEAKIAogc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc2RfY3VycmVudF9wcmlvcih1MzIgc2RfY3VycmVudF9wcmlvcikKIHsKLQlpbnQgaSwgZmFrZV9wYXJhID0gMDsKKwlib29sIGZha2VfcGFyYSA9IGZhbHNlOworCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogCQl1OCB0bXAgPSAodTgpKHNkX2N1cnJlbnRfcHJpb3IgPj4gKGkqOCkpOwogCiAJCWlmICh0bXAgPiAweDAzKSB7Ci0JCQlmYWtlX3BhcmEgPSAxOworCQkJZmFrZV9wYXJhID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtNTM3LDE0ICs3ODQsMjQgQEAKIAl1MTYgcmVnID0gMDsKIAl1OCB2YWwgPSAwOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0xLX1NFTCwgMHgwMywgMHgwMyk7Ci0JUlRTWF9SRUFEX1JFRyhjaGlwLCBDTEtfU0VMLCAmdmFsKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19TRUwsIDB4MDMsIDB4MDMpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIENMS19TRUwsICZ2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJY2hpcC0+YXNpY19jb2RlID0gdmFsID09IDAgPyAxIDogMDsKIAogCWlmIChjaGlwLT5hc2ljX2NvZGUpIHsKIAkJcmV0dmFsID0gcnRzeF9yZWFkX3BoeV9yZWdpc3RlcihjaGlwLCAweDFDLCAmcmVnKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiVmFsdWUgb2YgcGh5IHJlZ2lzdGVyIDB4MUMgaXMgMHgleFxuIiwKIAkJCXJlZyk7CkBAIC01NTIsMTYgKzgwOSwyOCBAQAogCQljaGlwLT5waHlfZGVidWdfbW9kZSA9IHJlZyAmIFBIWV9ERUJVR19NT0RFID8gMSA6IDA7CiAKIAl9IGVsc2UgewotCQlSVFNYX1JFQURfUkVHKGNoaXAsIDB4RkU4MCwgJnZhbCk7CisJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCAweEZFODAsICZ2YWwpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCQljaGlwLT5pY192ZXJzaW9uID0gdmFsOwogCQljaGlwLT5waHlfZGVidWdfbW9kZSA9IDA7CiAJfQogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBQRElORk8sICZ2YWwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBQRElORk8sICZ2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlBESU5GTzogMHgleFxuIiwgdmFsKTsKIAljaGlwLT5hdXhfcHdyX2V4aXN0ID0gdmFsICYgQVVYX1BXUl9ERVRFQ1RFRCA/IDEgOiAwOwogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCAweEZFNTAsICZ2YWwpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCAweEZFNTAsICZ2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJY2hpcC0+aHdfYnlwYXNzX3NkID0gdmFsICYgMHgwMSA/IDEgOiAwOwogCiAJcnRzeF9yZWFkX2NvbmZpZ19ieXRlKGNoaXAsIDB4MEUsICZ2YWwpOwpAQCAtNTcxLDcgKzg0MCwxMSBAQAogCQlDTFJfU0RJT19FWElTVChjaGlwKTsKIAogCWlmIChjaGlwLT51c2VfaHdfc2V0dGluZykgewotCQlSVFNYX1JFQURfUkVHKGNoaXAsIENIQU5HRV9MSU5LX1NUQVRFLCAmdmFsKTsKKwkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIENIQU5HRV9MSU5LX1NUQVRFLCAmdmFsKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAkJY2hpcC0+YXV0b19kZWxpbmtfZW4gPSB2YWwgJiAweDgwID8gMSA6IDA7CiAJfQogCkBAIC01ODQsMjcgKzg1Nyw0OSBAQAogCXU4IHZhbCA9IDAsIG1heF9mdW5jOwogCXUzMiBsdmFsID0gMDsKIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENMS19TRUwsIDB4MDMsIDB4MDMpOwotCVJUU1hfUkVBRF9SRUcoY2hpcCwgQ0xLX1NFTCwgJnZhbCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDTEtfU0VMLCAweDAzLCAweDAzKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBDTEtfU0VMLCAmdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCWNoaXAtPmFzaWNfY29kZSA9IHZhbCA9PSAwID8gMSA6IDA7CiAKIAljaGlwLT5pY192ZXJzaW9uID0gMDsKIAljaGlwLT5waHlfZGVidWdfbW9kZSA9IDA7CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFBESU5GTywgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBESU5GTywgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiUERJTkZPOiAweCV4XG4iLCB2YWwpOwogCWNoaXAtPmF1eF9wd3JfZXhpc3QgPSB2YWwgJiBBVVhfUFdSX0RFVEVDVEVEID8gMSA6IDA7CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIENBUkRfU0hBUkVfTU9ERSwgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIENBUkRfU0hBUkVfTU9ERSwgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiQ0FSRF9TSEFSRV9NT0RFOiAweCV4XG4iLCB2YWwpOwogCWNoaXAtPmJhcm9fcGtnID0gdmFsICYgMHgwNCA/IFFGTiA6IExRRlA7CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIDB4RkU1QSwgJnZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIDB4RkU1QSwgJnZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAljaGlwLT5od19ieXBhc3Nfc2QgPSB2YWwgJiAweDEwID8gMSA6IDA7CiAKIAlyZXR2YWwgPSBydHN4X3JlYWRfY2ZnX2R3KGNoaXAsIDAsIDB4NzE4LCAmbHZhbCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAltYXhfZnVuYyA9ICh1OCkoKGx2YWwgPj4gMjkpICYgMHgwNyk7CiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIk1heCBmdW5jdGlvbiBudW1iZXI6ICVkXG4iLCBtYXhfZnVuYyk7CkBAIC02MTQsNyArOTA5LDExIEBACiAJCUNMUl9TRElPX0VYSVNUKGNoaXApOwogCiAJaWYgKGNoaXAtPnVzZV9od19zZXR0aW5nKSB7Ci0JCVJUU1hfUkVBRF9SRUcoY2hpcCwgQ0hBTkdFX0xJTktfU1RBVEUsICZ2YWwpOworCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgQ0hBTkdFX0xJTktfU1RBVEUsICZ2YWwpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCQljaGlwLT5hdXRvX2RlbGlua19lbiA9IHZhbCAmIDB4ODAgPyAxIDogMDsKIAogCQlpZiAoQ0hFQ0tfQkFST19QS0coY2hpcCwgTFFGUCkpCkBAIC02OTMsMjEgKzk5MiwzMyBAQAogCWlmICgoY2hpcC0+bW1jX2Rkcl90eF9waGFzZSA+IDMxKSB8fCAoY2hpcC0+bW1jX2Rkcl90eF9waGFzZSA8IDApKQogCQljaGlwLT5tbWNfZGRyX3R4X3BoYXNlID0gMDsKIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIEZQRENUTCwgU1NDX1BPV0VSX0RPV04sIDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRlBEQ1RMLCBTU0NfUE9XRVJfRE9XTiwgMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAl3YWl0X3RpbWVvdXQoMjAwKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfRElWLCAweDA3LCAweDA3KTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19ESVYsIDB4MDcsIDB4MDcpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgImNoaXAtPnVzZV9od19zZXR0aW5nID0gJWRcbiIsCiAJCWNoaXAtPnVzZV9od19zZXR0aW5nKTsKIAogCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgewogCQlyZXR2YWwgPSBydHM1MjA4X2luaXQoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAl9IGVsc2UgaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpKSB7CiAJCXJldHZhbCA9IHJ0czUyODhfaW5pdChjaGlwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlpZiAoY2hpcC0+c3NfZW4gPT0gMikKQEAgLTc1NCw4ICsxMDY1LDEwIEBACiAJfQogCiAJcmV0dmFsID0gcnRzeF9yZXNldF9jaGlwKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtNzg0LDMxICsxMDk3LDMxIEBACiAKIHN0YXRpYyB2b2lkIHJ0c3hfbW9uaXRvcl9hc3BtX2NvbmZpZyhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewotCWludCBtYXliZV9zdXBwb3J0X2FzcG0sIHJlZ19jaGFuZ2VkOworCWJvb2wgcmVnX2NoYW5nZWQsIG1heWJlX3N1cHBvcnRfYXNwbTsKIAl1MzIgdG1wID0gMDsKIAl1OCByZWcwID0gMCwgcmVnMSA9IDA7CiAKLQltYXliZV9zdXBwb3J0X2FzcG0gPSAwOwotCXJlZ19jaGFuZ2VkID0gMDsKKwltYXliZV9zdXBwb3J0X2FzcG0gPSBmYWxzZTsKKwlyZWdfY2hhbmdlZCA9IGZhbHNlOwogCXJ0c3hfcmVhZF9jb25maWdfYnl0ZShjaGlwLCBMQ1RMUiwgJnJlZzApOwogCWlmIChjaGlwLT5hc3BtX2xldmVsWzBdICE9IHJlZzApIHsKLQkJcmVnX2NoYW5nZWQgPSAxOworCQlyZWdfY2hhbmdlZCA9IHRydWU7CiAJCWNoaXAtPmFzcG1fbGV2ZWxbMF0gPSByZWcwOwogCX0KIAlpZiAoQ0hLX1NESU9fRVhJU1QoY2hpcCkgJiYgIUNIS19TRElPX0lHTk9SRUQoY2hpcCkpIHsKIAkJcnRzeF9yZWFkX2NmZ19kdyhjaGlwLCAxLCAweEMwLCAmdG1wKTsKIAkJcmVnMSA9ICh1OCl0bXA7CiAJCWlmIChjaGlwLT5hc3BtX2xldmVsWzFdICE9IHJlZzEpIHsKLQkJCXJlZ19jaGFuZ2VkID0gMTsKKwkJCXJlZ19jaGFuZ2VkID0gdHJ1ZTsKIAkJCWNoaXAtPmFzcG1fbGV2ZWxbMV0gPSByZWcxOwogCQl9CiAKIAkJaWYgKChyZWcwICYgMHgwMykgJiYgKHJlZzEgJiAweDAzKSkKLQkJCW1heWJlX3N1cHBvcnRfYXNwbSA9IDE7CisJCQltYXliZV9zdXBwb3J0X2FzcG0gPSB0cnVlOwogCiAJfSBlbHNlIHsKIAkJaWYgKHJlZzAgJiAweDAzKQotCQkJbWF5YmVfc3VwcG9ydF9hc3BtID0gMTsKKwkJCW1heWJlX3N1cHBvcnRfYXNwbSA9IHRydWU7CiAJfQogCiAJaWYgKHJlZ19jaGFuZ2VkKSB7CkBAIC04MzUsNyArMTE0OCw3IEBACiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCiAJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmY2hpcC0+c2RfY2FyZDsKICNlbmRpZgotCWludCBzc19hbGxvd2VkOworCWJvb2wgc3NfYWxsb3dlZDsKIAogCWlmIChydHN4X2Noa19zdGF0KGNoaXAsIFJUU1hfU1RBVF9TVVNQRU5EKSkKIAkJcmV0dXJuOwpAQCAtODg3LDIxICsxMjAwLDIxIEBACiAJcnRzeF9pbml0X2NhcmRzKGNoaXApOwogCiAJaWYgKGNoaXAtPnNzX2VuKSB7Ci0JCXNzX2FsbG93ZWQgPSAxOworCQlzc19hbGxvd2VkID0gdHJ1ZTsKIAogCQlpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpIHsKLQkJCXNzX2FsbG93ZWQgPSAwOworCQkJc3NfYWxsb3dlZCA9IGZhbHNlOwogCQl9IGVsc2UgewogCQkJaWYgKENIS19TRElPX0VYSVNUKGNoaXApICYmICFDSEtfU0RJT19JR05PUkVEKGNoaXApKSB7CiAJCQkJdTMyIHZhbDsKIAogCQkJCXJ0c3hfcmVhZF9jZmdfZHcoY2hpcCwgMSwgMHgwNCwgJnZhbCk7CiAJCQkJaWYgKHZhbCAmIDB4MDcpCi0JCQkJCXNzX2FsbG93ZWQgPSAwOworCQkJCQlzc19hbGxvd2VkID0gZmFsc2U7CiAJCQl9CiAJCX0KIAl9IGVsc2UgewotCQlzc19hbGxvd2VkID0gMDsKKwkJc3NfYWxsb3dlZCA9IGZhbHNlOwogCX0KIAogCWlmIChzc19hbGxvd2VkICYmICFjaGlwLT5zZF9pbykgewpAQCAtMTE1MywxNCArMTQ2NiwxNyBAQAogCWZvciAoaSA9IDA7IGkgPCBNQVhfUldfUkVHX0NOVDsgaSsrKSB7CiAJCXZhbCA9IHJ0c3hfcmVhZGwoY2hpcCwgUlRTWF9IQUlNUik7CiAJCWlmICgodmFsICYgKDEgPDwgMzEpKSA9PSAwKSB7Ci0JCQlpZiAoZGF0YSAhPSAodTgpdmFsKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAoZGF0YSAhPSAodTgpdmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAKIAkJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIAkJfQogCX0KIAotCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfVElNRURPVVQpOworCXJ0c3hfdHJhY2UoY2hpcCk7CisJcmV0dXJuIFNUQVRVU19USU1FRE9VVDsKIH0KIAogaW50IHJ0c3hfcmVhZF9yZWdpc3RlcihzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1MTYgYWRkciwgdTggKmRhdGEpCkBAIC0xMTgxLDggKzE0OTcsMTAgQEAKIAkJCWJyZWFrOwogCX0KIAotCWlmIChpID49IE1BWF9SV19SRUdfQ05UKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX1RJTUVET1VUKTsKKwlpZiAoaSA+PSBNQVhfUldfUkVHX0NOVCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX1RJTUVET1VUOworCX0KIAogCWlmIChkYXRhKQogCQkqZGF0YSA9ICh1OCkodmFsICYgMHhGRik7CkBAIC0xMTkzLDEzICsxNTExLDE5IEBACiBpbnQgcnRzeF93cml0ZV9jZmdfZHcoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggZnVuY19ubywgdTE2IGFkZHIsIHUzMiBtYXNrLAogCQkgICAgICB1MzIgdmFsKQogeworCWludCByZXR2YWw7CiAJdTggbW9kZSA9IDAsIHRtcDsKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKIAkJaWYgKG1hc2sgJiAweEZGKSB7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDRkdEQVRBMCArIGksCi0JCQkJICAgICAgIDB4RkYsICh1OCkodmFsICYgbWFzayAmIDB4RkYpKTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0ZHREFUQTAgKyBpLAorCQkJCQkJICAgICAweEZGLAorCQkJCQkJICAgICAodTgpKHZhbCAmIG1hc2sgJiAweEZGKSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQkJbW9kZSB8PSAoMSA8PCBpKTsKIAkJfQogCQltYXNrID4+PSA4OwpAQCAtMTIwNywxNCArMTUzMSwzMSBAQAogCX0KIAogCWlmIChtb2RlKSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENGR0FERFIwLCAweEZGLCAodTgpYWRkcik7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENGR0FERFIxLCAweEZGLCAodTgpKGFkZHIgPj4gOCkpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENGR0FERFIwLCAweEZGLCAodTgpYWRkcik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0ZHQUREUjEsIDB4RkYsCisJCQkJCSAgICAgKHU4KShhZGRyID4+IDgpKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDRkdSV0NUTCwgMHhGRiwKLQkJCSAgICAgICAweDgwIHwgbW9kZSB8ICgoZnVuY19ubyAmIDB4MDMpIDw8IDQpKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDRkdSV0NUTCwgMHhGRiwKKwkJCQkJICAgICAweDgwIHwgbW9kZSB8ICgoZnVuY19ubyAmIDB4MDMpIDw8IDQpKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JXX1JFR19DTlQ7IGkrKykgewotCQkJUlRTWF9SRUFEX1JFRyhjaGlwLCBDRkdSV0NUTCwgJnRtcCk7CisJCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgQ0ZHUldDVEwsICZ0bXApOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJCWlmICgodG1wICYgMHg4MCkgPT0gMCkKIAkJCQlicmVhazsKIAkJfQpAQCAtMTIyNSwyMiArMTU2Niw0NCBAQAogCiBpbnQgcnRzeF9yZWFkX2NmZ19kdyhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBmdW5jX25vLCB1MTYgYWRkciwgdTMyICp2YWwpCiB7CisJaW50IHJldHZhbDsKIAlpbnQgaTsKIAl1OCB0bXA7CiAJdTMyIGRhdGEgPSAwOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0ZHQUREUjAsIDB4RkYsICh1OClhZGRyKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDRkdBRERSMSwgMHhGRiwgKHU4KShhZGRyID4+IDgpKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDRkdSV0NUTCwgMHhGRiwgMHg4MCB8ICgoZnVuY19ubyAmIDB4MDMpIDw8IDQpKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENGR0FERFIwLCAweEZGLCAodTgpYWRkcik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENGR0FERFIxLCAweEZGLCAodTgpKGFkZHIgPj4gOCkpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDRkdSV0NUTCwgMHhGRiwKKwkJCQkgICAgIDB4ODAgfCAoKGZ1bmNfbm8gJiAweDAzKSA8PCA0KSk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfUldfUkVHX0NOVDsgaSsrKSB7Ci0JCVJUU1hfUkVBRF9SRUcoY2hpcCwgQ0ZHUldDVEwsICZ0bXApOworCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgQ0ZHUldDVEwsICZ0bXApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCQlpZiAoKHRtcCAmIDB4ODApID09IDApCiAJCQlicmVhazsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCVJUU1hfUkVBRF9SRUcoY2hpcCwgQ0ZHREFUQTAgKyBpLCAmdG1wKTsKKwkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIENGR0RBVEEwICsgaSwgJnRtcCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCWRhdGEgfD0gKHUzMil0bXAgPDwgKGkgKiA4KTsKIAl9CiAKQEAgLTEyNTksOCArMTYyMiwxMCBAQAogCWludCBkd19sZW4sIGksIGo7CiAJaW50IHJldHZhbDsKIAotCWlmICghYnVmKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX05PTUVNKTsKKwlpZiAoIWJ1ZikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX05PTUVNOworCX0KIAogCWlmICgobGVuICsgb2Zmc2V0KSAlIDQpCiAJCWR3X2xlbiA9IChsZW4gKyBvZmZzZXQpIC8gNCArIDE7CkBAIC0xMjcwLDEzICsxNjM1LDE2IEBACiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgImR3X2xlbiA9ICVkXG4iLCBkd19sZW4pOwogCiAJZGF0YSA9IHZ6YWxsb2MoZHdfbGVuICogNCk7Ci0JaWYgKCFkYXRhKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX05PTUVNKTsKKwlpZiAoIWRhdGEpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19OT01FTTsKKwl9CiAKIAltYXNrID0gdnphbGxvYyhkd19sZW4gKiA0KTsKIAlpZiAoIW1hc2spIHsKIAkJdmZyZWUoZGF0YSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfTk9NRU0pOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX05PTUVNOwogCX0KIAogCWogPSAwOwpAQCAtMTMwMCw3ICsxNjY4LDggQEAKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJdmZyZWUoZGF0YSk7CiAJCQl2ZnJlZShtYXNrKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfQogCkBAIC0xMzI3LDE1ICsxNjk2LDE4IEBACiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgImR3X2xlbiA9ICVkXG4iLCBkd19sZW4pOwogCiAJZGF0YSA9IHZtYWxsb2MoZHdfbGVuICogNCk7Ci0JaWYgKCFkYXRhKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX05PTUVNKTsKKwlpZiAoIWRhdGEpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19OT01FTTsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgZHdfbGVuOyBpKyspIHsKIAkJcmV0dmFsID0gcnRzeF9yZWFkX2NmZ19kdyhjaGlwLCBmdW5jLCBhbGlnbmVkX2FkZHIgKyBpICogNCwKIAkJCQkJICBkYXRhICsgaSk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXZmcmVlKGRhdGEpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKQEAgLTEzNTgsNTEgKzE3MzAsOTkgQEAKIAogaW50IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGFkZHIsIHUxNiB2YWwpCiB7Ci0JaW50IGksIGZpbmlzaGVkID0gMDsKKwlpbnQgcmV0dmFsOworCWJvb2wgZmluaXNoZWQgPSBmYWxzZTsKKwlpbnQgaTsKIAl1OCB0bXA7CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBQSFlEQVRBMCwgMHhGRiwgKHU4KXZhbCk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgUEhZREFUQTEsIDB4RkYsICh1OCkodmFsID4+IDgpKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBQSFlBRERSLCAweEZGLCBhZGRyKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBQSFlSV0NUTCwgMHhGRiwgMHg4MSk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQSFlEQVRBMCwgMHhGRiwgKHU4KXZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBIWURBVEExLCAweEZGLCAodTgpKHZhbCA+PiA4KSk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBIWUFERFIsIDB4RkYsIGFkZHIpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQSFlSV0NUTCwgMHhGRiwgMHg4MSk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgewotCQlSVFNYX1JFQURfUkVHKGNoaXAsIFBIWVJXQ1RMLCAmdG1wKTsKKwkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBIWVJXQ1RMLCAmdG1wKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAkJaWYgKCEodG1wICYgMHg4MCkpIHsKLQkJCWZpbmlzaGVkID0gMTsKKwkJCWZpbmlzaGVkID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JaWYgKCFmaW5pc2hlZCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoIWZpbmlzaGVkKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIGludCBydHN4X3JlYWRfcGh5X3JlZ2lzdGVyKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGFkZHIsIHUxNiAqdmFsKQogewotCWludCBpLCBmaW5pc2hlZCA9IDA7CisJaW50IHJldHZhbDsKKwlib29sIGZpbmlzaGVkID0gZmFsc2U7CisJaW50IGk7CiAJdTE2IGRhdGEgPSAwOwogCXU4IHRtcDsKIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFBIWUFERFIsIDB4RkYsIGFkZHIpOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFBIWVJXQ1RMLCAweEZGLCAweDgwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFBIWUFERFIsIDB4RkYsIGFkZHIpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQSFlSV0NUTCwgMHhGRiwgMHg4MCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCAxMDAwMDA7IGkrKykgewotCQlSVFNYX1JFQURfUkVHKGNoaXAsIFBIWVJXQ1RMLCAmdG1wKTsKKwkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFBIWVJXQ1RMLCAmdG1wKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAkJaWYgKCEodG1wICYgMHg4MCkpIHsKLQkJCWZpbmlzaGVkID0gMTsKKwkJCWZpbmlzaGVkID0gdHJ1ZTsKIAkJCWJyZWFrOwogCQl9CiAJfQogCi0JaWYgKCFmaW5pc2hlZCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoIWZpbmlzaGVkKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFBIWURBVEEwLCAmdG1wKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgUEhZREFUQTAsICZ0bXApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJZGF0YSA9IHRtcDsKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFBIWURBVEExLCAmdG1wKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgUEhZREFUQTEsICZ0bXApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJZGF0YSB8PSAodTE2KXRtcCA8PCA4OwogCiAJaWYgKHZhbCkKQEAgLTE0MTMsMjIgKzE4MzMsMzcgQEAKIAogaW50IHJ0c3hfcmVhZF9lZnVzZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBhZGRyLCB1OCAqdmFsKQogeworCWludCByZXR2YWw7CiAJaW50IGk7CiAJdTggZGF0YSA9IDA7CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBFRlVTRV9DVFJMLCAweEZGLCAweDgwfGFkZHIpOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRUZVU0VfQ1RSTCwgMHhGRiwgMHg4MCB8IGFkZHIpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJUlRTWF9SRUFEX1JFRyhjaGlwLCBFRlVTRV9DVFJMLCAmZGF0YSk7CisJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBFRlVTRV9DVFJMLCAmZGF0YSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCWlmICghKGRhdGEgJiAweDgwKSkKIAkJCWJyZWFrOwogCQl1ZGVsYXkoMSk7CiAJfQogCi0JaWYgKGRhdGEgJiAweDgwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX1RJTUVET1VUKTsKKwlpZiAoZGF0YSAmIDB4ODApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19USU1FRE9VVDsKKwl9CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIEVGVVNFX0RBVEEsICZkYXRhKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgRUZVU0VfREFUQSwgJmRhdGEpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJaWYgKHZhbCkKIAkJKnZhbCA9IGRhdGE7CiAKQEAgLTE0MzcsNiArMTg3Miw3IEBACiAKIGludCBydHN4X3dyaXRlX2VmdXNlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIHU4IGFkZHIsIHU4IHZhbCkKIHsKKwlpbnQgcmV0dmFsOwogCWludCBpLCBqOwogCXU4IGRhdGEgPSAwLCB0bXAgPSAweEZGOwogCkBAIC0xNDQ3LDE4ICsxODgzLDMzIEBACiAJCXRtcCAmPSAofih1OCkoMSA8PCBpKSk7CiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJXcml0ZSAweCV4IHRvIDB4JXhcbiIsIHRtcCwgYWRkcik7CiAKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRUZVU0VfREFUQSwgMHhGRiwgdG1wKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRUZVU0VfQ1RSTCwgMHhGRiwgMHhBMHxhZGRyKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBFRlVTRV9EQVRBLCAweEZGLCB0bXApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEVGVVNFX0NUUkwsIDB4RkYsCisJCQkJCSAgICAgMHhBMCB8IGFkZHIpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCiAJCWZvciAoaiA9IDA7IGogPCAxMDA7IGorKykgewotCQkJUlRTWF9SRUFEX1JFRyhjaGlwLCBFRlVTRV9DVFJMLCAmZGF0YSk7CisJCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgRUZVU0VfQ1RSTCwgJmRhdGEpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJCWlmICghKGRhdGEgJiAweDgwKSkKIAkJCQlicmVhazsKIAkJCXdhaXRfdGltZW91dCgzKTsKIAkJfQogCi0JCWlmIChkYXRhICYgMHg4MCkKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfVElNRURPVVQpOworCQlpZiAoZGF0YSAmIDB4ODApIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX1RJTUVET1VUOworCQl9CiAKIAkJd2FpdF90aW1lb3V0KDUpOwogCX0KQEAgLTE0NzIsMTQgKzE5MjMsMTggQEAKIAl1MTYgdmFsdWU7CiAKIAlyZXR2YWwgPSBydHN4X3JlYWRfcGh5X3JlZ2lzdGVyKGNoaXAsIHJlZywgJnZhbHVlKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICh2YWx1ZSAmICgxIDw8IGJpdCkpIHsKIAkJdmFsdWUgJj0gfigxIDw8IGJpdCk7CiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKGNoaXAsIHJlZywgdmFsdWUpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE0OTEsMTQgKzE5NDYsMTggQEAKIAl1MTYgdmFsdWU7CiAKIAlyZXR2YWwgPSBydHN4X3JlYWRfcGh5X3JlZ2lzdGVyKGNoaXAsIHJlZywgJnZhbHVlKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICgodmFsdWUgJiAoMSA8PCBiaXQpKSA9PSAwKSB7CiAJCXZhbHVlIHw9ICgxIDw8IGJpdCk7CiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKGNoaXAsIHJlZywgdmFsdWUpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE1MDYsOSArMTk2NSwxNCBAQAogCiBpbnQgcnRzeF9jaGVja19saW5rX3JlYWR5KHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CisJaW50IHJldHZhbDsKIAl1OCB2YWw7CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIElSUVNUQVQwLCAmdmFsKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgSVJRU1RBVDAsICZ2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiSVJRU1RBVDA6IDB4JXhcbiIsIHZhbCk7CiAJaWYgKHZhbCAmIExJTktfUkRZX0lOVCkgewpAQCAtMTYxNSw3ICsyMDc5LDcgQEAKIGludCBydHN4X3ByZV9oYW5kbGVfaW50ZXJydXB0KHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJdTMyIHN0YXR1cywgaW50X2VuYWJsZTsKLQlpbnQgZXhpdF9zcyA9IDA7CisJYm9vbCBleGl0X3NzID0gZmFsc2U7CiAjaWZkZWYgU1VQUE9SVF9PQ1AKIAl1MzIgb2NwX2ludCA9IDA7CiAKQEAgLTE2MjUsNyArMjA4OSw3IEBACiAJaWYgKGNoaXAtPnNzX2VuKSB7CiAJCWNoaXAtPnNzX2NvdW50ZXIgPSAwOwogCQlpZiAocnRzeF9nZXRfc3RhdChjaGlwKSA9PSBSVFNYX1NUQVRfU1MpIHsKLQkJCWV4aXRfc3MgPSAxOworCQkJZXhpdF9zcyA9IHRydWU7CiAJCQlydHN4X2V4aXRfTDEoY2hpcCk7CiAJCQlydHN4X3NldF9zdGF0KGNoaXAsIFJUU1hfU1RBVF9SVU4pOwogCQl9CkBAIC0xODE0LDggKzIyNzgsMTAgQEAKIAl1MTYgcmVnX2FkZHI7CiAJdTggKnB0cjsKIAotCWlmICghYnVmKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKwlpZiAoIWJ1ZikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0VSUk9SOworCX0KIAogCXB0ciA9IGJ1ZjsKIAlyZWdfYWRkciA9IFBQQlVGX0JBU0UyOwpAQCAtMTgyNiw4ICsyMjkyLDEwIEBACiAJCQlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCByZWdfYWRkcisrLCAwLCAwKTsKIAogCQlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIDAsIDI1MCk7Ci0JCWlmIChyZXR2YWwgPCAwKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQltZW1jcHkocHRyLCBydHN4X2dldF9jbWRfZGF0YShjaGlwKSwgMjU2KTsKIAkJcHRyICs9IDI1NjsKQEAgLTE4NDAsOCArMjMwOCwxMCBAQAogCQkJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgcmVnX2FkZHIrKywgMCwgMCk7CiAKIAkJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAyNTApOwotCQlpZiAocmV0dmFsIDwgMCkKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgPCAwKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJbWVtY3B5KHB0ciwgcnRzeF9nZXRfY21kX2RhdGEoY2hpcCksIGJ1Zl9sZW4lMjU2KTsKQEAgLTE4NTYsOCArMjMyNiwxMCBAQAogCXUxNiByZWdfYWRkcjsKIAl1OCAqcHRyOwogCi0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRVJST1I7CisJfQogCiAJcHRyID0gYnVmOwogCXJlZ19hZGRyID0gUFBCVUZfQkFTRTI7CkBAIC0xODcxLDggKzIzNDMsMTAgQEAKIAkJfQogCiAJCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMjUwKTsKLQkJaWYgKHJldHZhbCA8IDApCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCWlmIChidWZfbGVuJTI1NikgewpAQCAtMTg4NSw4ICsyMzU5LDEwIEBACiAJCX0KIAogCQlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIDAsIDI1MCk7Ci0JCWlmIChyZXR2YWwgPCAwKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xODk0LDggKzIzNzAsMTAgQEAKIAogaW50IHJ0c3hfY2hlY2tfY2hpcF9leGlzdChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewotCWlmIChydHN4X3JlYWRsKGNoaXAsIDApID09IDB4RkZGRkZGRkYpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJ0c3hfcmVhZGwoY2hpcCwgMCkgPT0gMHhGRkZGRkZGRikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMTkxOCw4ICsyMzk2LDEwIEBACiAKIAlpZiAobWFzaykgewogCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEZQRENUTCwgbWFzaywgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpKQogCQkJd2FpdF90aW1lb3V0KDIwMCk7CkBAIC0xOTQ3LDggKzI0MjcsMTAgQEAKIAlpZiAobWFzaykgewogCQl2YWwgPSBtYXNrOwogCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEZQRENUTCwgbWFzaywgdmFsKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X2NoaXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5oCmluZGV4IGZlYWM5ODYuLmMyOTViMWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfY2hpcC5oCkBAIC05ODgsMjAgKzk4OCw0IEBACiBpbnQgcnRzeF93cml0ZV9wcGJ1ZihzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCAqYnVmLCBpbnQgYnVmX2xlbik7CiBpbnQgcnRzeF9jaGVja19jaGlwX2V4aXN0KHN0cnVjdCBydHN4X2NoaXAgKmNoaXApOwogCi0jZGVmaW5lIFJUU1hfV1JJVEVfUkVHKGNoaXAsIGFkZHIsIG1hc2ssIGRhdGEpCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWludCByZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKChjaGlwKSwgKGFkZHIpLCAobWFzayksIChkYXRhKSk7IFwKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewkJCQlcCi0JCQlUUkFDRV9SRVQoKGNoaXApLCByZXR2YWwpOwkJCVwKLQkJfQkJCQkJCQlcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBSVFNYX1JFQURfUkVHKGNoaXAsIGFkZHIsIGRhdGEpCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpbnQgcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKChjaGlwKSwgKGFkZHIpLCAoZGF0YSkpOyBcCi0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsJCQkJXAotCQkJVFJBQ0VfUkVUKChjaGlwKSwgcmV0dmFsKTsJCQlcCi0JCX0JCQkJCQkJXAotCX0gd2hpbGUgKDApCi0KICNlbmRpZiAgLyogX19SRUFMVEVLX1JUU1hfQ0hJUF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3Njc2kuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jCmluZGV4IDExNjEwODIuLjhhNWQ2YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfc2NzaS5jCkBAIC0yNiwxMSArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KIAogI2luY2x1ZGUgInJ0c3guaCIKLSNpbmNsdWRlICJydHN4X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInJ0c3hfc3lzLmgiCi0jaW5jbHVkZSAicnRzeF9jYXJkLmgiCi0jaW5jbHVkZSAicnRzeF9jaGlwLmgiCi0jaW5jbHVkZSAicnRzeF9zY3NpLmgiCiAjaW5jbHVkZSAic2QuaCIKICNpbmNsdWRlICJtcy5oIgogI2luY2x1ZGUgInNwaS5oIgpAQCAtMzksNyArMzQsOCBAQAogewogCXN0cnVjdCBzY3NpX2NtbmQgKnNyYiA9IGNoaXAtPnNyYjsKIAljaGFyICp3aGF0ID0gTlVMTDsKLQlpbnQgdW5rbm93bl9jbWQgPSAwLCBsZW47CisJYm9vbCB1bmtub3duX2NtZCA9IGZhbHNlOworCWludCBsZW47CiAKIAlzd2l0Y2ggKHNyYi0+Y21uZFswXSkgewogCWNhc2UgVEVTVF9VTklUX1JFQURZOgpAQCAtMzEwLDcgKzMwNiw4IEBACiAJCXdoYXQgPSAiUmVhbHRlaydzIHZlbmRvciBjb21tYW5kIjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJd2hhdCA9ICIodW5rbm93biBjb21tYW5kKSI7IHVua25vd25fY21kID0gMTsKKwkJd2hhdCA9ICIodW5rbm93biBjb21tYW5kKSI7CisJCXVua25vd25fY21kID0gdHJ1ZTsKIAkJYnJlYWs7CiAJfQogCkBAIC00ODUsNyArNDgyLDcgQEAKIAl1bnNpZ25lZCBjaGFyIHNlbmRieXRlczsKIAl1bnNpZ25lZCBjaGFyICpidWY7CiAJdTggY2FyZCA9IGdldF9sdW5fY2FyZChjaGlwLCBsdW4pOwotCWludCBwcm9fZm9ybWF0dGVyX2ZsYWcgPSAwOworCWJvb2wgcHJvX2Zvcm1hdHRlcl9mbGFnID0gZmFsc2U7CiAJdW5zaWduZWQgY2hhciBpbnF1aXJ5X2J1ZltdID0gewogCQlRVUxJRklSRXxEUkNUX0FDQ0VTU19ERVYsCiAJCVJNQl9ESVNDfDB4MEQsCkBAIC01MTAsOCArNTA3LDEwIEBACiAJfQogCiAJYnVmID0gdm1hbGxvYyhzY3NpX2J1ZmZsZW4oc3JiKSk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwl9CiAKICNpZmRlZiBTVVBQT1JUX01BR0lDX0dBVEUKIAlpZiAoKGNoaXAtPm1zcHJvX2Zvcm1hdHRlcl9lbmFibGUpICYmCkBAIC01MTksMTAgKzUxOCw4IEBACiAjZWxzZQogCWlmIChjaGlwLT5tc3Byb19mb3JtYXR0ZXJfZW5hYmxlKQogI2VuZGlmCi0JewogCQlpZiAoIWNhcmQgfHwgKGNhcmQgPT0gTVNfQ0FSRCkpCi0JCQlwcm9fZm9ybWF0dGVyX2ZsYWcgPSAxOwotCX0KKwkJCXByb19mb3JtYXR0ZXJfZmxhZyA9IHRydWU7CiAKIAlpZiAocHJvX2Zvcm1hdHRlcl9mbGFnKSB7CiAJCWlmIChzY3NpX2J1ZmZsZW4oc3JiKSA8IDU2KQpAQCAtNTg3LDEyICs1ODQsMTQgQEAKIAkJaWYgKGNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSkKIAkJCXJldHVybiBUUkFOU1BPUlRfR09PRDsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAogCQlicmVhazsKIAl9CiAKLQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CiB9CiAKIApAQCAtNjA3LDcgKzYwNiw4IEBACiAJaWYgKHByZXZlbnQpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJldHVybiBUUkFOU1BPUlRfR09PRDsKQEAgLTY0NCw4ICs2NDQsMTAgQEAKIAl9CiAKIAlidWYgPSB2bWFsbG9jKHNjc2lfYnVmZmxlbihzcmIpKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAogCXRtcCA9ICh1bnNpZ25lZCBjaGFyICopc2Vuc2U7CiAJbWVtY3B5KGJ1ZiwgdG1wLCBzY3NpX2J1ZmZsZW4oc3JiKSk7CkBAIC02NjUsNyArNjY3LDcgQEAKIAlzdHJ1Y3QgbXNfaW5mbyAqbXNfY2FyZCA9ICYoY2hpcC0+bXNfY2FyZCk7CiAJaW50IHN5c19pbmZvX29mZnNldDsKIAlpbnQgZGF0YV9zaXplID0gYnVmX2xlbjsKLQlpbnQgc3VwcG9ydF9mb3JtYXQgPSAwOworCWJvb2wgc3VwcG9ydF9mb3JtYXQgPSBmYWxzZTsKIAlpbnQgaSA9IDA7CiAKIAlpZiAoY21kID09IE1PREVfU0VOU0UpIHsKQEAgLTY4NiwxMCArNjg4LDEwIEBACiAJLyogTWVkaXVtIFR5cGUgQ29kZSAqLwogCWlmIChjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKIAkJaWYgKENIS19NU1hDKG1zX2NhcmQpKSB7Ci0JCQlzdXBwb3J0X2Zvcm1hdCA9IDE7CisJCQlzdXBwb3J0X2Zvcm1hdCA9IHRydWU7CiAJCQlidWZbaSsrXSA9IDB4NDA7CiAJCX0gZWxzZSBpZiAoQ0hLX01TUFJPKG1zX2NhcmQpKSB7Ci0JCQlzdXBwb3J0X2Zvcm1hdCA9IDE7CisJCQlzdXBwb3J0X2Zvcm1hdCA9IHRydWU7CiAJCQlidWZbaSsrXSA9IDB4MjA7CiAJCX0gZWxzZSB7CiAJCQlidWZbaSsrXSA9IDB4MTA7CkBAIC03NTcsNyArNzU5LDcgQEAKIAl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKIAl1bnNpZ25lZCBpbnQgZGF0YVNpemU7CiAJaW50IHN0YXR1czsKLQlpbnQgcHJvX2Zvcm1hdHRlcl9mbGFnOworCWJvb2wgcHJvX2Zvcm1hdHRlcl9mbGFnOwogCXVuc2lnbmVkIGNoYXIgcGFnZUNvZGUsICpidWY7CiAJdTggY2FyZCA9IGdldF9sdW5fY2FyZChjaGlwLCBsdW4pOwogCkBAIC03NjUsMzIgKzc2NywzNSBAQAogCWlmICghY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CiAJCXNjc2lfc2V0X3Jlc2lkKHNyYiwgc2NzaV9idWZmbGVuKHNyYikpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KICNlbmRpZgogCi0JcHJvX2Zvcm1hdHRlcl9mbGFnID0gMDsKKwlwcm9fZm9ybWF0dGVyX2ZsYWcgPSBmYWxzZTsKIAlkYXRhU2l6ZSA9IDg7CiAjaWZkZWYgU1VQUE9SVF9NQUdJQ19HQVRFCiAJaWYgKChjaGlwLT5sdW4yY2FyZFtsdW5dICYgTVNfQ0FSRCkpIHsKIAkJaWYgKCFjYXJkIHx8IChjYXJkID09IE1TX0NBUkQpKSB7CiAJCQlkYXRhU2l6ZSA9IDEwODsKIAkJCWlmIChjaGlwLT5tc3Byb19mb3JtYXR0ZXJfZW5hYmxlKQotCQkJCXByb19mb3JtYXR0ZXJfZmxhZyA9IDE7CisJCQkJcHJvX2Zvcm1hdHRlcl9mbGFnID0gdHJ1ZTsKIAkJfQogCX0KICNlbHNlCiAJaWYgKGNhcmQgPT0gTVNfQ0FSRCkgewogCQlpZiAoY2hpcC0+bXNwcm9fZm9ybWF0dGVyX2VuYWJsZSkgewotCQkJcHJvX2Zvcm1hdHRlcl9mbGFnID0gMTsKKwkJCXByb19mb3JtYXR0ZXJfZmxhZyA9IHRydWU7CiAJCQlkYXRhU2l6ZSA9IDEwODsKIAkJfQogCX0KICNlbmRpZgogCiAJYnVmID0ga21hbGxvYyhkYXRhU2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwl9CiAKIAlwYWdlQ29kZSA9IHNyYi0+Y21uZFsyXSAmIDB4M2Y7CiAKQEAgLTg2OSw3ICs4NzQsOCBAQAogCiAJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikgfHwgKGdldF9jYXJkX3NpemUoY2hpcCwgbHVuKSA9PSAwKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmICghKENIS19CSVQoY2hpcC0+bHVuX21jLCBsdW4pKSkgewpAQCAtODg1LDcgKzg5MSw4IEBACiAJCSAqLwogCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiU0QgY2FyZCBiZWluZyBlcmFzZWQhXG4iKTsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1JFQURfRk9SQklEREVOKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgPT0gU0RfQ0FSRCkgewpAQCAtODkzLDcgKzkwMCw4IEBACiAJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiU0QgY2FyZCBsb2NrZWQhXG4iKTsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1JFQURfRk9SQklEREVOKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCX0KICNlbmRpZgpAQCAtOTE2LDcgKzkyNCw4IEBACiAJCXNlY19jbnQgPSAoKHUxNikoc3JiLT5jbW5kWzldKSA8PCA4KSB8IHNyYi0+Y21uZFsxMF07CiAJfSBlbHNlIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAkvKiBJbiBzb21lIHRlc3QsIHdlIHdpbGwgcmVjZWl2ZSBhIHN0YXJ0X3NlYyBsaWtlIDB4RkZGRkZGRkYuCkBAIC05MjYsNyArOTM1LDggQEAKIAlpZiAoKHN0YXJ0X3NlYyA+IGdldF9jYXJkX3NpemUoY2hpcCwgbHVuKSkgfHwKIAkJCSgoc3RhcnRfc2VjICsgc2VjX2NudCkgPiBnZXRfY2FyZF9zaXplKGNoaXAsIGx1bikpKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MQkFfT1ZFUl9SQU5HRSk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKHNlY19jbnQgPT0gMCkgewpAQCAtOTQyLDcgKzk1Miw4IEBACiAJCWVsc2UKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwogCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKHNyYi0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgewpAQCAtOTUwLDcgKzk2MSw4IEBACiAJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiV3JpdGUgcHJvdGVjdGVkIGNhcmQhXG4iKTsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX1BST1RFQ1QpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfQogCkBAIC05NjksNyArOTgxLDggQEAKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwogCQl9CiAJCXJldHZhbCA9IFRSQU5TUE9SVF9GQUlMRUQ7Ci0JCVRSQUNFX0dPVE8oY2hpcCwgRXhpdCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gRXhpdDsKIAl9IGVsc2UgewogCQljaGlwLT5yd19mYWlsX2NudFtsdW5dID0gMDsKIAkJcmV0dmFsID0gVFJBTlNQT1JUX0dPT0Q7CkBAIC05OTQsMTUgKzEwMDcsMTggQEAKIAlpZiAoIWNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSkgewogCQlpZiAoIWNoaXAtPm1zcHJvX2Zvcm1hdHRlcl9lbmFibGUpIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9CiAKIAlidWZfbGVuID0gKHNjc2lfYnVmZmxlbihzcmIpID4gMTIpID8gMHgxNCA6IDEyOwogCiAJYnVmID0ga21hbGxvYyhidWZfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAogCWJ1ZltpKytdID0gMDsKIAlidWZbaSsrXSA9IDA7CkBAIC0xMDY3LDcgKzEwODMsOCBAQAogCiAJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoIShDSEtfQklUKGNoaXAtPmx1bl9tYywgbHVuKSkpIHsKQEAgLTEwNzcsOCArMTA5NCwxMCBAQAogCX0KIAogCWJ1ZiA9IGttYWxsb2MoOCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwlpZiAoYnVmID09IE5VTEwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwl9CiAKIAljYXJkX3NpemUgPSBnZXRfY2FyZF9zaXplKGNoaXAsIGx1bik7CiAJYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpKChjYXJkX3NpemUgLSAxKSA+PiAyNCk7CkBAIC0xMTE2LDE1ICsxMTM1LDE4IEBACiAJbGVuID0gKCh1MTYpc3JiLT5jbW5kWzRdIDw8IDgpIHwgc3JiLT5jbW5kWzVdOwogCiAJYnVmID0gdm1hbGxvYyhsZW4pOwotCWlmICghYnVmKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwlpZiAoIWJ1ZikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAogCXJldHZhbCA9IHJ0c3hfZm9yY2VfcG93ZXJfb24oY2hpcCwgU1NDX1BEQ1RMKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXZmcmVlKGJ1Zik7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CkBAIC0xMTMzLDcgKzExNTUsOCBAQAogCQkJdmZyZWUoYnVmKTsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfQogCkBAIC0xMTY1LDcgKzExODgsOCBAQAogCXJldHZhbCA9IHJ0c3hfZm9yY2VfcG93ZXJfb24oY2hpcCwgU1NDX1BEQ1RMKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAobGVuID09IDUxMSkgewpAQCAtMTE3MywxNCArMTE5NywxNyBAQAogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCX0gZWxzZSB7CiAJCWxlbiA9ICh1bnNpZ25lZCBzaG9ydCltaW5fdCh1bnNpZ25lZCBpbnQsIHNjc2lfYnVmZmxlbihzcmIpLAogCQkJCQlsZW4pOwogCQlidWYgPSB2bWFsbG9jKGxlbik7Ci0JCWlmIChidWYgPT0gTlVMTCkKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCQlpZiAoYnVmID09IE5VTEwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCQl9CiAKIAkJcnRzeF9zdG9yX2dldF94ZmVyX2J1ZihidWYsIGxlbiwgc3JiKTsKIAkJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKSAtIGxlbik7CkBAIC0xMTkxLDcgKzEyMTgsOCBAQAogCQkJCXZmcmVlKGJ1Zik7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQkJfQogCQl9CiAKQEAgLTEyMjEsMTggKzEyNDksMjIgQEAKIAlpZiAoYWRkciA8IDB4RkMwMCkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJYnVmID0gdm1hbGxvYyhsZW4pOwotCWlmICghYnVmKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwlpZiAoIWJ1ZikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAogCXJldHZhbCA9IHJ0c3hfZm9yY2VfcG93ZXJfb24oY2hpcCwgU1NDX1BEQ1RMKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXZmcmVlKGJ1Zik7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTEyNDEsNyArMTI3Myw4IEBACiAJCQl2ZnJlZShidWYpOwogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9CiAKQEAgLTEyNzQsMTMgKzEzMDcsMTYgQEAKIAlpZiAoYWRkciA8IDB4RkMwMCkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJbGVuID0gKHVuc2lnbmVkIHNob3J0KW1pbl90KHVuc2lnbmVkIGludCwgc2NzaV9idWZmbGVuKHNyYiksIGxlbik7CiAJYnVmID0gdm1hbGxvYyhsZW4pOwotCWlmIChidWYgPT0gTlVMTCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCiAJcnRzeF9zdG9yX2dldF94ZmVyX2J1ZihidWYsIGxlbiwgc3JiKTsKIAlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gbGVuKTsKQEAgLTEyODksNyArMTMyNSw4IEBACiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQl2ZnJlZShidWYpOwogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLCBTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CkBAIC0xMjk4LDcgKzEzMzUsOCBAQAogCQkJdmZyZWUoYnVmKTsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfQogCkBAIC0xMzE0LDEyICsxMzUyLDE0IEBACiAKIAlpZiAoIWNoZWNrX2NhcmRfcmVhZHkoY2hpcCwgbHVuKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmIChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBTRF9DQVJEKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CkBAIC0xMzYxLDE0ICsxNDAxLDE3IEBACiAJaWYgKChzY3NpX2J1ZmZsZW4oc3JiKSA8IGJ1Zl9sZW4pIHx8IChzY3NpX3NnbGlzdChzcmIpID09IE5VTEwpKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJY2xlYXIgPSBzcmItPmNtbmRbMl07CiAKIAlidWYgPSB2bWFsbG9jKHNjc2lfYnVmZmxlbihzcmIpKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAlwdHIgPSBidWY7CiAKIAlpZiAoY2hpcC0+dHJhY2VfbXNnW2NoaXAtPm1zZ19pZHhdLnZhbGlkKQpAQCAtMTUwMCw3ICsxNTQzLDggQEAKIAkJZGVmYXVsdDoKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCX0gZWxzZSBpZiAoc3JiLT5jbW5kWzNdID09IDIpIHsKIAkJaWYgKHNyYi0+Y21uZFs0XSkgewpAQCAtMTUyMywxNCArMTU2NywxNiBAQAogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJCX0KIAogCQkJdHVybl9vZmZfbGVkKGNoaXAsIExFRF9HUElPKTsKIAkJfQogCX0gZWxzZSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJcmV0dXJuIFRSQU5TUE9SVF9HT09EOwpAQCAtMTU2Miw3ICsxNjA4LDggQEAKIAkJZGVmYXVsdDoKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCiAJCXJ0c3hfc3Rvcl9zZXRfeGZlcl9idWYoJnRtcCwgMSwgc3JiKTsKQEAgLTE1NzIsNyArMTYxOSw4IEBACiAJCXJ0c3hfc3Rvcl9zZXRfeGZlcl9idWYoJnRtcCwgMSwgc3JiKTsKIAl9IGVsc2UgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJldHVybiBUUkFOU1BPUlRfR09PRDsKQEAgLTE2MTAsNyArMTY1OCw4IEBACiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwogCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CiAKQEAgLTE3NTcsNyArMTgwNiw4IEBACiAJaWYgKCFDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJcGh5X2RlYnVnX21vZGUgPSAoaW50KShzcmItPmNtbmRbM10pOwpAQCAtMTc2NSwzNSArMTgxNSw0NyBAQAogCWlmIChwaHlfZGVidWdfbW9kZSkgewogCQljaGlwLT5waHlfZGVidWdfbW9kZSA9IDE7CiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0RSRVNVTUVDVEwsIDB4NzcsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCX0KIAogCQlydHN4X2Rpc2FibGVfYnVzX2ludChjaGlwKTsKIAogCQlyZXR2YWwgPSBydHN4X3JlYWRfcGh5X3JlZ2lzdGVyKGNoaXAsIDB4MUMsICZyZWcpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCX0KIAogCQlyZWcgfD0gMHgwMDAxOwogCQlyZXR2YWwgPSBydHN4X3dyaXRlX3BoeV9yZWdpc3RlcihjaGlwLCAweDFDLCByZWcpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCX0KIAl9IGVsc2UgewogCQljaGlwLT5waHlfZGVidWdfbW9kZSA9IDA7CiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0RSRVNVTUVDVEwsIDB4NzcsIDB4NzcpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCX0KIAogCQlydHN4X2VuYWJsZV9idXNfaW50KGNoaXApOwogCiAJCXJldHZhbCA9IHJ0c3hfcmVhZF9waHlfcmVnaXN0ZXIoY2hpcCwgMHgxQywgJnJlZyk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJfQogCiAJCXJlZyAmPSAweEZGRkU7CiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKGNoaXAsIDB4MUMsIHJlZyk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJfQogCX0KIAogCXJldHVybiBUUkFOU1BPUlRfR09PRDsKQEAgLTE4MjQsNyArMTg4Niw4IEBACiAJCWlmIChjbWRfdHlwZSA+IDIpIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCQlhZGRyID0gKHNyYi0+Y21uZFs1XSA8PCA4KSB8IHNyYi0+Y21uZFs2XTsKIAkJbWFzayA9IHNyYi0+Y21uZFs3XTsKQEAgLTE4NDIsNyArMTkwNSw4IEBACiAJCWlmIChzY3NpX2J1ZmZsZW4oc3JiKSA8IDEpIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCQlydHN4X3N0b3Jfc2V0X3hmZXJfYnVmKCZ2YWx1ZSwgMSwgc3JiKTsKIAkJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKQEAgLTE4NTAsMTIgKzE5MTQsMTQgQEAKIAogCWRlZmF1bHQ6CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7CkBAIC0xOTAyLDE1ICsxOTY4LDE4IEBACiAKIAlpZiAobGVuKSB7CiAJCWJ1ZiA9IHZtYWxsb2MobGVuKTsKLQkJaWYgKCFidWYpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJaWYgKCFidWYpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCQl9CiAKIAkJcmV0dmFsID0gcnRzeF9mb3JjZV9wb3dlcl9vbihjaGlwLCBTU0NfUERDVEwpOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQl2ZnJlZShidWYpOwogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAogCQlmb3IgKGkgPSAwOyBpIDwgbGVuIC8gMjsgaSsrKSB7CkBAIC0xOTE5LDcgKzE5ODgsOCBAQAogCQkJCXZmcmVlKGJ1Zik7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQkJfQogCiAJCQlidWZbMippXSA9ICh1OCkodmFsID4+IDgpOwpAQCAtMTk2Myw4ICsyMDMzLDEwIEBACiAJCQkJCWxlbik7CiAKIAkJYnVmID0gdm1hbGxvYyhsZW4pOwotCQlpZiAoYnVmID09IE5VTEwpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwkJfQogCiAJCXJ0c3hfc3Rvcl9nZXRfeGZlcl9idWYoYnVmLCBsZW4sIHNyYik7CiAJCXNjc2lfc2V0X3Jlc2lkKHNyYiwgc2NzaV9idWZmbGVuKHNyYikgLSBsZW4pOwpAQCAtMTk3NCw3ICsyMDQ2LDggQEAKIAkJCXZmcmVlKGJ1Zik7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBsZW4gLyAyOyBpKyspIHsKQEAgLTE5ODQsNyArMjA1Nyw4IEBACiAJCQkJdmZyZWUoYnVmKTsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCQl9CiAJCX0KIApAQCAtMjAxMSw3ICsyMDg1LDggQEAKIAlyZXR2YWwgPSBydHN4X2ZvcmNlX3Bvd2VyX29uKGNoaXAsIFNTQ19QRENUTCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLCBTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJbW9kZSA9IHNyYi0+Y21uZFszXTsKQEAgLTIwMjIsMTkgKzIwOTcsMjIgQEAKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9IGVsc2UgaWYgKG1vZGUgPT0gMSkgewogCQlyZXR2YWwgPSBzcGlfZXJhc2VfZWVwcm9tX2J5dGUoY2hpcCwgYWRkcik7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfSBlbHNlIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJldHVybiBUUkFOU1BPUlRfR09PRDsKQEAgLTIwNTgsMTUgKzIxMzYsMTggQEAKIAlsZW4gPSAoKHUxNilzcmItPmNtbmRbNl0gPDwgOCkgfCBzcmItPmNtbmRbN107CiAKIAlidWYgPSB2bWFsbG9jKGxlbik7Ci0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCiAJcmV0dmFsID0gcnRzeF9mb3JjZV9wb3dlcl9vbihjaGlwLCBTU0NfUERDVEwpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJdmZyZWUoYnVmKTsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTIwNzUsNyArMjE1Niw4IEBACiAJCQl2ZnJlZShidWYpOwogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAl9CiAKQEAgLTIxMDcsOCArMjE4OSwxMCBAQAogCiAJbGVuID0gKHVuc2lnbmVkIHNob3J0KW1pbl90KHVuc2lnbmVkIGludCwgc2NzaV9idWZmbGVuKHNyYiksIGxlbik7CiAJYnVmID0gdm1hbGxvYyhsZW4pOwotCWlmIChidWYgPT0gTlVMTCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCiAJcnRzeF9zdG9yX2dldF94ZmVyX2J1ZihidWYsIGxlbiwgc3JiKTsKIAlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gbGVuKTsKQEAgLTIxMTcsNyArMjIwMSw4IEBACiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQl2ZnJlZShidWYpOwogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLCBTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CkBAIC0yMTI2LDcgKzIyMTEsOCBAQAogCQkJdmZyZWUoYnVmKTsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfQogCkBAIC0yMTUzLDE1ICsyMjM5LDE4IEBACiAJbGVuID0gc3JiLT5jbW5kWzVdOwogCiAJYnVmID0gdm1hbGxvYyhsZW4pOwotCWlmICghYnVmKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwlpZiAoIWJ1ZikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAogCXJldHZhbCA9IHJ0c3hfZm9yY2VfcG93ZXJfb24oY2hpcCwgU1NDX1BEQ1RMKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXZmcmVlKGJ1Zik7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQlTRU5TRV9UWVBFX01FRElBX1VOUkVDT1ZFUl9SRUFEX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CkBAIC0yMTcwLDcgKzIyNTksOCBAQAogCQkJdmZyZWUoYnVmKTsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfQogCkBAIC0yMjAzLDggKzIyOTMsMTAgQEAKIAogCWxlbiA9ICh1OCltaW5fdCh1bnNpZ25lZCBpbnQsIHNjc2lfYnVmZmxlbihzcmIpLCBsZW4pOwogCWJ1ZiA9IHZtYWxsb2MobGVuKTsKLQlpZiAoYnVmID09IE5VTEwpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmIChidWYgPT0gTlVMTCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCX0KIAogCXJ0c3hfc3Rvcl9nZXRfeGZlcl9idWYoYnVmLCBsZW4sIHNyYik7CiAJc2NzaV9zZXRfcmVzaWQoc3JiLCBzY3NpX2J1ZmZsZW4oc3JiKSAtIGxlbik7CkBAIC0yMjEyLDIxICsyMzA0LDI0IEBACiAJcmV0dmFsID0gcnRzeF9mb3JjZV9wb3dlcl9vbihjaGlwLCBTU0NfUERDVEwpOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJdmZyZWUoYnVmKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CiAJfQogCiAJaWYgKGNoaXAtPmFzaWNfY29kZSkgewogCQlyZXR2YWwgPSBydHN4X3JlYWRfcGh5X3JlZ2lzdGVyKGNoaXAsIDB4MDgsICZ2YWwpOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQl2ZnJlZShidWYpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKIAkJfQogCiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUFdSX0dBVEVfQ1RSTCwKIAkJCQkJTERPMzMxOF9QV1JfTUFTSywgTERPX09GRik7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXZmcmVlKGJ1Zik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOwogCQl9CiAKIAkJd2FpdF90aW1lb3V0KDYwMCk7CkBAIC0yMjM1LDE0ICsyMzMwLDE2IEBACiAJCQkJCQkweDRDMDAgfCBjaGlwLT5waHlfdm9sdGFnZSk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXZmcmVlKGJ1Zik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOwogCQl9CiAKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQV1JfR0FURV9DVFJMLAogCQkJCQlMRE8zMzE4X1BXUl9NQVNLLCBMRE9fT04pOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQl2ZnJlZShidWYpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKIAkJfQogCiAJCXdhaXRfdGltZW91dCg2MDApOwpAQCAtMjI1MSw3ICsyMzQ4LDggQEAKIAlyZXR2YWwgPSBjYXJkX3Bvd2VyX29uKGNoaXAsIFNQSV9DQVJEKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXZmcmVlKGJ1Zik7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOwogCX0KIAogCXdhaXRfdGltZW91dCg1MCk7CkBAIC0yMjYyLDcgKzIzNjAsOCBAQAogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7CiAJCQlyZXN1bHQgPSBUUkFOU1BPUlRfRkFJTEVEOwotCQkJVFJBQ0VfR09UTyhjaGlwLCBFeGl0KTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIEV4aXQ7CiAJCX0KIAl9CiAKQEAgLTIyNzAsMjUgKzIzNjksMzMgQEAKIAl2ZnJlZShidWYpOwogCiAJcmV0dmFsID0gY2FyZF9wb3dlcl9vZmYoY2hpcCwgU1BJX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwl9CiAKIAlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUFdSX0dBVEVfQ1RSTCwKIAkJCQkJTERPMzMxOF9QV1JfTUFTSywgTERPX09GRik7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJCX0KIAogCQl3YWl0X3RpbWVvdXQoNjAwKTsKIAogCQlyZXR2YWwgPSBydHN4X3dyaXRlX3BoeV9yZWdpc3RlcihjaGlwLCAweDA4LCB2YWwpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCQl9CiAKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBQV1JfR0FURV9DVFJMLAogCQkJCQlMRE8zMzE4X1BXUl9NQVNLLCBMRE9fT04pOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0VSUk9SOworCQl9CiAJfQogCiAJcmV0dXJuIHJlc3VsdDsKQEAgLTIyOTcsNyArMjQwNCw4IEBACiBzdGF0aWMgaW50IHJlYWRfY2ZnX2J5dGUoc3RydWN0IHNjc2lfY21uZCAqc3JiLCBzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCWludCByZXR2YWw7Ci0JdTggZnVuYywgZnVuY19tYXg7CisJYm9vbCBmdW5jX21heDsKKwl1OCBmdW5jOwogCXUxNiBhZGRyLCBsZW47CiAJdTggKmJ1ZjsKIApAQCAtMjMxNywyNiArMjQyNSwzMCBAQAogCQlfX2Z1bmNfXywgZnVuYywgYWRkciwgbGVuKTsKIAogCWlmIChDSEtfU0RJT19FWElTVChjaGlwKSAmJiAhQ0hLX1NESU9fSUdOT1JFRChjaGlwKSkKLQkJZnVuY19tYXggPSAxOworCQlmdW5jX21heCA9IHRydWU7CiAJZWxzZQotCQlmdW5jX21heCA9IDA7CisJCWZ1bmNfbWF4ID0gZmFsc2U7CiAKIAlpZiAoZnVuYyA+IGZ1bmNfbWF4KSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlidWYgPSB2bWFsbG9jKGxlbik7Ci0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCiAJcmV0dmFsID0gcnRzeF9yZWFkX2NmZ19zZXEoY2hpcCwgZnVuYywgYWRkciwgYnVmLCBsZW4pOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKIAkJdmZyZWUoYnVmKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlsZW4gPSAodTE2KW1pbl90KHVuc2lnbmVkIGludCwgc2NzaV9idWZmbGVuKHNyYiksIGxlbik7CkBAIC0yMzUxLDcgKzI0NjMsOCBAQAogc3RhdGljIGludCB3cml0ZV9jZmdfYnl0ZShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CiAJaW50IHJldHZhbDsKLQl1OCBmdW5jLCBmdW5jX21heDsKKwlib29sIGZ1bmNfbWF4OworCXU4IGZ1bmM7CiAJdTE2IGFkZHIsIGxlbjsKIAl1OCAqYnVmOwogCkBAIC0yMzcxLDIwICsyNDg0LDIzIEBACiAJCV9fZnVuY19fLCBmdW5jLCBhZGRyKTsKIAogCWlmIChDSEtfU0RJT19FWElTVChjaGlwKSAmJiAhQ0hLX1NESU9fSUdOT1JFRChjaGlwKSkKLQkJZnVuY19tYXggPSAxOworCQlmdW5jX21heCA9IHRydWU7CiAJZWxzZQotCQlmdW5jX21heCA9IDA7CisJCWZ1bmNfbWF4ID0gZmFsc2U7CiAKIAlpZiAoZnVuYyA+IGZ1bmNfbWF4KSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlsZW4gPSAodW5zaWduZWQgc2hvcnQpbWluX3QodW5zaWduZWQgaW50LCBzY3NpX2J1ZmZsZW4oc3JiKSwgbGVuKTsKIAlidWYgPSB2bWFsbG9jKGxlbik7Ci0JaWYgKCFidWYpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRVJST1IpOworCWlmICghYnVmKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJfQogCiAJcnRzeF9zdG9yX2dldF94ZmVyX2J1ZihidWYsIGxlbiwgc3JiKTsKIAlzY3NpX3NldF9yZXNpZChzcmIsIHNjc2lfYnVmZmxlbihzcmIpIC0gbGVuKTsKQEAgLTIzOTMsNyArMjUwOSw4IEBACiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBTQ1NJX0xVTihzcmIpLCBTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7CiAJCXZmcmVlKGJ1Zik7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJdmZyZWUoYnVmKTsKQEAgLTI0ODMsNyArMjYwMCw4IEBACiAJZGVmYXVsdDoKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgU0NTSV9MVU4oc3JiKSwKIAkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC0yNjI2LDcgKzI3NDQsOCBAQAogCiAJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAljYXJkID0gZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bik7CkBAIC0yNjM0LDcgKzI3NTMsOCBAQAogCQlidXNfd2lkdGggPSBjaGlwLT5jYXJkX2J1c193aWR0aFtsdW5dOwogCX0gZWxzZSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CkBAIC0yNjUxLDcgKzI3NzEsOCBAQAogCiAJaWYgKENIRUNLX1BJRChjaGlwLCAweDUyMDgpIHx8IENIRUNLX1BJRChjaGlwLCAweDUyODgpKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJcnRzeF9kaXNhYmxlX2FzcG0oY2hpcCk7CkBAIC0yNzAwLDEzICsyODIxLDE2IEBACiAJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9HUElPX0RJUiwgMHgwNywgZ3Bpb19kaXIpOwogCiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU9fRElSLCAweDA3LCBncGlvX2Rpcik7CiAKLQlpZiAocmVzdWx0ICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJaWYgKHJlc3VsdCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwl9CiAKIAlyZXR1cm4gVFJBTlNQT1JUX0dPT0Q7CiB9CkBAIC0yNzY1LDcgKzI4ODksOCBAQAogCWRlZmF1bHQ6CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIFNDU0lfTFVOKHNyYiksCiAJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjc5NywxOCArMjkyMiwyMSBAQAogewogCXN0cnVjdCBtc19pbmZvICptc19jYXJkID0gJihjaGlwLT5tc19jYXJkKTsKIAl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKLQlpbnQgcmV0dmFsLCBxdWlja19mb3JtYXQ7CisJYm9vbCBxdWlja19mb3JtYXQ7CisJaW50IHJldHZhbDsKIAogCWlmIChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBNU19DQVJEKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmICgoc3JiLT5jbW5kWzNdICE9IDB4NEQpIHx8IChzcmItPmNtbmRbNF0gIT0gMHg0NykgfHwKIAkJKHNyYi0+Y21uZFs1XSAhPSAweDY2KSB8fCAoc3JiLT5jbW5kWzZdICE9IDB4NkQpIHx8CiAJCShzcmItPmNtbmRbN10gIT0gMHg3NCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlydHN4X2Rpc2FibGVfYXNwbShjaGlwKTsKQEAgLTI4MjAsMzUgKzI5NDgsNDAgQEAKIAkJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikgfHwKIAkJCQkoZ2V0X2NhcmRfc2l6ZShjaGlwLCBsdW4pID09IDApKSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfQogCXJ0c3hfc2V0X3N0YXQoY2hpcCwgUlRTWF9TVEFUX1JVTik7CiAKIAlpZiAoc3JiLT5jbW5kWzhdICYgMHgwMSkKLQkJcXVpY2tfZm9ybWF0ID0gMDsKKwkJcXVpY2tfZm9ybWF0ID0gZmFsc2U7CiAJZWxzZQotCQlxdWlja19mb3JtYXQgPSAxOworCQlxdWlja19mb3JtYXQgPSB0cnVlOwogCiAJaWYgKCEoY2hpcC0+Y2FyZF9yZWFkeSAmIE1TX0NBUkQpKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKGNoaXAtPmNhcmRfd3AgJiBNU19DQVJEKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9XUklURV9QUk9URUNUKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoIUNIS19NU1BSTyhtc19jYXJkKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTFVOX05PVF9TVVBQT1JUKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlyZXR2YWwgPSBtc3Byb19mb3JtYXQoc3JiLCBjaGlwLCBNU19TSE9SVF9EQVRBX0xFTiwgcXVpY2tfZm9ybWF0KTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9GT1JNQVRfQ01EX0ZBSUxFRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKQEAgLTI4NjcsMTggKzMwMDAsMjEgQEAKIAogCWlmICghY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCWlmIChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBNU19DQVJEKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmICgoc3JiLT5jbW5kWzJdICE9IDB4QjApIHx8IChzcmItPmNtbmRbNF0gIT0gMHg0RCkgfHwKIAkJKHNyYi0+Y21uZFs1XSAhPSAweDUzKSB8fCAoc3JiLT5jbW5kWzZdICE9IDB4NDkpIHx8CiAJCShzcmItPmNtbmRbN10gIT0gMHg0NCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlkZXZfaW5mb19pZCA9IHNyYi0+Y21uZFszXTsKQEAgLTI4ODYsNyArMzAyMiw4IEBACiAJCQkoIUNIS19NU1hDKG1zX2NhcmQpICYmIChkZXZfaW5mb19pZCA9PSAweDEzKSkgfHwKIAkJCSFDSEtfTVNQUk8obXNfY2FyZCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoZGV2X2luZm9faWQgPT0gMHgxNSkKQEAgLTI4OTUsOCArMzAzMiwxMCBAQAogCQlidWZfbGVuID0gZGF0YV9sZW4gPSAweDZBOwogCiAJYnVmID0ga21hbGxvYyhidWZfbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJaWYgKCFidWYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwl9CiAKIAlpID0gMDsKIAkvKiAgR0VUIE1lbW9yeSBTdGljayBNZWRpYSBJbmZvcm1hdGlvbiBSZXNwb25zZSBIZWFkZXIgKi8KQEAgLTI5ODMsMTEgKzMxMjIsMTMgQEAKIAogCWlmICghY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCWlmIChnZXRfbHVuX2NhcmQoY2hpcCwgbHVuKSAhPSBTRF9DQVJEKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9MVU5fTk9UX1NVUFBPUlQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXN3aXRjaCAoc3JiLT5jbW5kWzBdKSB7CkBAIC0zMDE3LDcgKzMxNTgsOCBAQAogCiAJZGVmYXVsdDoKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMzA0NCwyMSArMzE4NiwyNSBAQAogCiAJaWYgKCFjaGVja19jYXJkX3JlYWR5KGNoaXAsIGx1bikpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAJaWYgKGdldF9sdW5fY2FyZChjaGlwLCBsdW4pICE9IE1TX0NBUkQpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0xVTl9OT1RfU1VQUE9SVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKHNyYi0+Y21uZFs3XSAhPSBLQ19NR19SX1BSTykgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmICghQ0hLX01TUFJPKG1zX2NhcmQpKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NR19JTkNPTVBBVElCTEVfTUVESVVNKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlrZXlfZm9ybWF0ID0gc3JiLT5jbW5kWzEwXSAmIDB4M0Y7CkBAIC0zMDcwLDEzICszMjE2LDE2IEBACiAJCQkoc3JiLT5jbW5kWzhdID09IDB4MDQpICYmCiAJCQkoc3JiLT5jbW5kWzldID09IDB4MUMpKSB7CiAJCQlyZXR2YWwgPSBtZ19nZXRfbG9jYWxfRUtCKHNyYiwgY2hpcCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQkJfQogCiAJCX0gZWxzZSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTMwODUsMTMgKzMyMzQsMTYgQEAKIAkJCShzcmItPmNtbmRbOF0gPT0gMHgwMCkgJiYKIAkJCShzcmItPmNtbmRbOV0gPT0gMHgyNCkpIHsKIAkJCXJldHZhbCA9IG1nX2dldF9yc3BfY2hnKHNyYiwgY2hpcCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQkJfQogCiAJCX0gZWxzZSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTMxMDUsMTkgKzMyNTcsMjMgQEAKIAkJCShzcmItPmNtbmRbNF0gPT0gMHgwMCkgJiYKIAkJCShzcmItPmNtbmRbNV0gPCAzMikpIHsKIAkJCXJldHZhbCA9IG1nX2dldF9JQ1Yoc3JiLCBjaGlwKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCQl9CiAKIAkJfSBlbHNlIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJc2NzaV9zZXRfcmVzaWQoc3JiLCAwKTsKQEAgLTMxNDMsMjUgKzMyOTksMzAgQEAKIAogCWlmICghY2hlY2tfY2FyZF9yZWFkeShjaGlwLCBsdW4pKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCWlmIChjaGVja19jYXJkX3dwKGNoaXAsIGx1bikpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX1dSSVRFX1BST1RFQ1QpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAlpZiAoZ2V0X2x1bl9jYXJkKGNoaXAsIGx1bikgIT0gTVNfQ0FSRCkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTFVOX05PVF9TVVBQT1JUKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoc3JiLT5jbW5kWzddICE9IEtDX01HX1JfUFJPKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJaWYgKCFDSEtfTVNQUk8obXNfY2FyZCkpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01HX0lOQ09NUEFUSUJMRV9NRURJVU0pOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWtleV9mb3JtYXQgPSBzcmItPmNtbmRbMTBdICYgMHgzRjsKQEAgLTMxNzMsMTMgKzMzMzQsMTYgQEAKIAkJCShzcmItPmNtbmRbOF0gPT0gMHgwMCkgJiYKIAkJCShzcmItPmNtbmRbOV0gPT0gMHgwQykpIHsKIAkJCXJldHZhbCA9IG1nX3NldF9sZWFmX2lkKHNyYiwgY2hpcCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQkJfQogCiAJCX0gZWxzZSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTMxODgsMTMgKzMzNTIsMTYgQEAKIAkJCShzcmItPmNtbmRbOF0gPT0gMHgwMCkgJiYKIAkJCShzcmItPmNtbmRbOV0gPT0gMHgwQykpIHsKIAkJCXJldHZhbCA9IG1nX2NoZyhzcmIsIGNoaXApOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJCX0KIAogCQl9IGVsc2UgewogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJCWJyZWFrOwogCkBAIC0zMjAzLDEzICszMzcwLDE2IEBACiAJCQkoc3JiLT5jbW5kWzhdID09IDB4MDApICYmCiAJCQkoc3JiLT5jbW5kWzldID09IDB4MEMpKSB7CiAJCQlyZXR2YWwgPSBtZ19yc3Aoc3JiLCBjaGlwKTsKLQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJCQl9CiAKIAkJfSBlbHNlIHsKIAkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQlTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCQlicmVhazsKIApAQCAtMzIyMywxOSArMzM5MywyMyBAQAogCQkJKHNyYi0+Y21uZFs0XSA9PSAweDAwKSAmJgogCQkJKHNyYi0+Y21uZFs1XSA8IDMyKSkgewogCQkJcmV0dmFsID0gbWdfc2V0X0lDVihzcmIsIGNoaXApOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJCX0KIAogCQl9IGVsc2UgewogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCVNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlzY3NpX3NldF9yZXNpZChzcmIsIDApOwpAQCAtMzI2NCw3ICszNDM4LDggQEAKIAkJCS8qIExvZ2ljYWwgVW5pdCBOb3QgUmVhZHkgRm9ybWF0IGluIFByb2dyZXNzICovCiAJCQlzZXRfc2Vuc2VfZGF0YShjaGlwLCBsdW4sIENVUl9FUlIsCiAJCQkJICAgICAgIDB4MDIsIDAsIDB4MDQsIDB4MDQsIDAsIDApOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJfQogI2VuZGlmCkBAIC0zMjc2LDcgKzM0NTEsOCBAQAogCQkJLyogTG9naWNhbCBVbml0IE5vdCBSZWFkeSBGb3JtYXQgaW4gUHJvZ3Jlc3MgKi8KIAkJCXNldF9zZW5zZV9kYXRhKGNoaXAsIGx1biwgQ1VSX0VSUiwgMHgwMiwgMCwgMHgwNCwgMHgwNCwKIAkJCQkJMCwgKHUxNikobXNfY2FyZC0+cHJvZ3Jlc3MpKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF90cmFuc3BvcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3J0c3hfdHJhbnNwb3J0LmMKaW5kZXggZGFiMTk5NS4uZjI3NDkxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvcnRzeF90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9ydHN4X3RyYW5zcG9ydC5jCkBAIC0yNSwxMCArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpbmNsdWRlICJydHN4LmgiCi0jaW5jbHVkZSAicnRzeF9zY3NpLmgiCi0jaW5jbHVkZSAicnRzeF90cmFuc3BvcnQuaCIKLSNpbmNsdWRlICJydHN4X2NoaXAuaCIKLSNpbmNsdWRlICJydHN4X2NhcmQuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBTY2F0dGVyLWdhdGhlciB0cmFuc2ZlciBidWZmZXIgYWNjZXNzIHJvdXRpbmVzCkBAIC0yNzYsNyArMjcyLDggQEAKIAkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgImNoaXAtPmludF9yZWcgPSAweCV4XG4iLAogCQkJY2hpcC0+aW50X3JlZyk7CiAJCWVyciA9IC1FVElNRURPVVQ7Ci0JCVRSQUNFX0dPVE8oY2hpcCwgZmluaXNoX3NlbmRfY21kKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBmaW5pc2hfc2VuZF9jbWQ7CiAJfQogCiAJc3Bpbl9sb2NrX2lycSgmcnRzeC0+cmVnX2xvY2spOwpAQCAtNjQyLDcgKzYzOSw3IEBACiAJZG1hX2FkZHJfdCBhZGRyOwogCXU4IGRpcjsKIAlpbnQgZXJyID0gMDsKLQl1MzIgdmFsID0gKDEgPDwgMzEpOworCXUzMiB2YWwgPSAxIDw8IDMxOwogCWxvbmcgdGltZWxlZnQ7CiAKIAlpZiAoKGJ1ZiA9PSBOVUxMKSB8fCAobGVuIDw9IDApKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc2QuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NkLmMKaW5kZXggYzI4YTkyNy4uYThkNjU3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc2QuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zZC5jCkBAIC0yNSw5ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgInJ0c3guaCIKLSNpbmNsdWRlICJydHN4X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInJ0c3hfc2NzaS5oIgotI2luY2x1ZGUgInJ0c3hfY2FyZC5oIgogI2luY2x1ZGUgInNkLmgiCiAKICNkZWZpbmUgU0RfTUFYX1JFVFJZX0NPVU5UCTMKQEAgLTEwOCwxMyArMTA1LDE5IEBACiAKIHN0YXRpYyBpbnQgc2RfY2hlY2tfZGF0YTBfc3RhdHVzKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CisJaW50IHJldHZhbDsKIAl1OCBzdGF0OwogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBSRUdfU0RfU1RBVDEsICZzdGF0KTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX1NUQVQxLCAmc3RhdCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWlmICghKHN0YXQgJiBTRF9EQVQwX1NUQVRVUykpIHsKIAkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX0JVU1kpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMTg3LDcgKzE5MCw4IEBACiAJCQkJcmV0dmFsID0gc2RfY2hlY2tfZGF0YTBfc3RhdHVzKGNoaXApOwogCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQkJcnRzeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiByZXR2YWw7CiAJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfVE9fRVJSKTsKQEAgLTE5OCw3ICsyMDIsOCBAQAogCQl9CiAJCXJ0c3hfY2xlYXJfc2RfZXJyb3IoY2hpcCk7CiAKLQkJVFJBQ0VfUkVUKGNoaXAsIHJldHZhbCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CiAJfQogCiAJaWYgKHJzcF90eXBlID09IFNEX1JTUF9UWVBFX1IwKQpAQCAtMjA4LDE0ICsyMTMsMTYgQEAKIAogCWlmICgocHRyWzBdICYgMHhDMCkgIT0gMCkgewogCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfU1RTX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAoIShyc3BfdHlwZSAmIFNEX05PX0NIRUNLX0NSQzcpKSB7CiAJCWlmIChwdHJbc3RhdF9pZHhdICYgU0RfQ1JDN19FUlIpIHsKIAkJCWlmIChjbWRfaWR4ID09IFdSSVRFX01VTFRJUExFX0JMT0NLKSB7CiAJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX0NSQ19FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCQlpZiAocnR5X2NudCA8IFNEX01BWF9SRVRSWV9DT1VOVCkgewogCQkJCXdhaXRfdGltZW91dCgyMCk7CkBAIC0yMjMsNyArMjMwLDggQEAKIAkJCQlnb3RvIFJUWV9TRU5EX0NNRDsKIAkJCX0gZWxzZSB7CiAJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX0NSQ19FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCX0KIAl9CkBAIC0yMzIsOCArMjQwLDEwIEBACiAJCWlmICgoY21kX2lkeCAhPSBTRU5EX1JFTEFUSVZFX0FERFIpICYmCiAJCQkoY21kX2lkeCAhPSBTRU5EX0lGX0NPTkQpKSB7CiAJCQlpZiAoY21kX2lkeCAhPSBTVE9QX1RSQU5TTUlTU0lPTikgewotCQkJCWlmIChwdHJbMV0gJiAweDgwKQotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCWlmIChwdHJbMV0gJiAweDgwKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQl9CiAJCQl9CiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCiAJCQlpZiAocHRyWzFdICYgMHg3RCkKQEAgLTI0MywxNyArMjUzLDIwIEBACiAJCQl7CiAJCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgInB0clsxXTogMHglMDJ4XG4iLAogCQkJCQlwdHJbMV0pOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCQlpZiAocHRyWzJdICYgMHhGRikgewogCQkJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJwdHJbMl06IDB4JTAyeFxuIiwKIAkJCQkJcHRyWzJdKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQkJaWYgKHB0clszXSAmIDB4ODApIHsKIAkJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAicHRyWzNdOiAweCUwMnhcbiIsCiAJCQkJCXB0clszXSk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCWlmIChwdHJbM10gJiAweDAxKQogCQkJCXNkX2NhcmQtPnNkX2RhdGFfYnVmX3JlYWR5ID0gMTsKQEAgLTI4Miw4ICsyOTUsMTAgQEAKIAlpZiAoIWJ1ZikKIAkJYnVmX2xlbiA9IDA7CiAKLQlpZiAoYnVmX2xlbiA+IDUxMikKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoYnVmX2xlbiA+IDUxMikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtMzIzLDEzICszMzgsMTYgQEAKIAkJCQkJICAgIFNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKIAkJfQogCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAoYnVmICYmIGJ1Zl9sZW4pIHsKIAkJcmV0dmFsID0gcnRzeF9yZWFkX3BwYnVmKGNoaXAsIGJ1ZiwgYnVmX2xlbik7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMzUwLDEzICszNjgsMTYgQEAKIAogCWlmIChidWZfbGVuID4gNTEyKSB7CiAJCS8qIFRoaXMgZnVuY3Rpb24gY2FuJ3Qgd3JpdGUgZGF0YSBtb3JlIHRoYW4gb25lIHBhZ2UgKi8KLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmIChidWYgJiYgYnVmX2xlbikgewogCQlyZXR2YWwgPSBydHN4X3dyaXRlX3BwYnVmKGNoaXAsIGJ1ZiwgYnVmX2xlbik7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKQEAgLTM5NSw3ICs0MTYsOCBAQAogCQkJCXNkX2NhcmQtPnNkX2FkZHIsIFNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKIAkJfQogCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC00MTIsNyArNDM0LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfQ1NELCBzZF9jYXJkLT5zZF9hZGRyLApAQCAtNDIxLDggKzQ0NCwxMCBAQAogCQkJYnJlYWs7CiAJfQogCi0JaWYgKGkgPT0gNikKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoaSA9PSA2KSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAltZW1jcHkoc2RfY2FyZC0+cmF3X2NzZCwgcnNwICsgMSwgMTUpOwogCkBAIC00NjQsMTAgKzQ4OSwxMiBAQAogCQkJZWxzZQogCQkJCXNkX2NhcmQtPnNkX2Nsb2NrID0gQ0xLXzIwOwogCQl9IGVsc2UgewotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9IGVsc2UgewotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKENIS19NTUNfU0VDVE9SX01PREUoc2RfY2FyZCkpIHsKQEAgLTUwNyw4ICs1MzQsOCBAQAogCiBzdGF0aWMgaW50IHNkX3NldF9zYW1wbGVfcHVzaF90aW1pbmcoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKKwlpbnQgcmV0dmFsOwogCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKLQogCXU4IHZhbCA9IDA7CiAKIAlpZiAoKGNoaXAtPnNkX2N0bCAmIFNEX1BVU0hfUE9JTlRfQ1RMX01BU0spID09IFNEX1BVU0hfUE9JTlRfREVMQVkpCkBAIC01MzYsNyArNTYzLDExIEBACiAJCQl2YWwgfD0gMHgwODsKIAl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBSRUdfU0RfQ0ZHMSwgMHgxQywgdmFsKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9DRkcxLCAweDFDLCB2YWwpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC01ODUsNiArNjE2LDcgQEAKIAogc3RhdGljIGludCBzZF9zZXRfY2xvY2tfZGl2aWRlcihzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBjbGtfZGl2KQogeworCWludCByZXR2YWw7CiAJdTggbWFzayA9IDAsIHZhbCA9IDA7CiAKIAltYXNrID0gMHg2MDsKQEAgLTU5NSw3ICs2MjcsMTEgQEAKIAllbHNlIGlmIChjbGtfZGl2ID09IFNEX0NMS19ESVZJREVfMjU2KQogCQl2YWwgPSAweDIwOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgUkVHX1NEX0NGRzEsIG1hc2ssIHZhbCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQ0ZHMSwgbWFzaywgdmFsKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtNjA2LDE0ICs2NDIsMTggQEAKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gc2Rfc2V0X3NhbXBsZV9wdXNoX3RpbWluZyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXNkX2Nob29zZV9wcm9wZXJfY2xvY2soY2hpcCk7CiAKIAlyZXR2YWwgPSBzd2l0Y2hfY2xvY2soY2hpcCwgc2RfY2FyZC0+c2RfY2xvY2spOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtNjM2LDggKzY3NiwxMCBAQAogCX0KIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgY21kX2lkeCwgYWRkciwgY21kX3R5cGUsIE5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtNjUxLDggKzY5MywxMCBAQAogCiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywgc2RfY2FyZC0+c2RfYWRkciwKIAkJCQlTRF9SU1BfVFlQRV9SMSwgcnNwLCA1KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChyc3BbMV0gJiAweDAyKQogCQlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyB8PSBTRF9MT0NLRUQ7CkBAIC02NjIsOCArNzA2LDEwIEBACiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgInNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzID0gMHgleFxuIiwKIAkJc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMpOwogCi0JaWYgKHJzcFsxXSAmIDB4MDEpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJzcFsxXSAmIDB4MDEpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTY4MCwxNSArNzI2LDE4IEBACiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsCiAJCQkJCXNkX2NhcmQtPnNkX2FkZHIsIFNEX1JTUF9UWVBFX1IxLCByc3AsCiAJCQkJCTUpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWlmICgoKHJzcFszXSAmIDB4MUUpID09IHN0YXRlKSAmJgogCQkJKChyc3BbM10gJiAweDAxKSA9PSBkYXRhX3JlYWR5KSkKIAkJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIAl9CiAKLQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCXJ0c3hfdHJhY2UoY2hpcCk7CisJcmV0dXJuIFNUQVRVU19GQUlMOwogfQogCiBzdGF0aWMgaW50IHNkX2NoYW5nZV9iYW5rX3ZvbHRhZ2Uoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggdm9sdGFnZSkKQEAgLTcwMCwyNCArNzQ5LDM5IEBACiAJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3BoeV9yZWdpc3RlcihjaGlwLCAweDA4LAogCQkJCQkJCTB4NEZDMCB8CiAJCQkJCQkJY2hpcC0+cGh5X3ZvbHRhZ2UpOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCQl9IGVsc2UgewotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfUEFEX0NUTCwgU0RfSU9fVVNJTkdfMVY4LCAwKTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfUEFEX0NUTCwKKwkJCQkJCSAgICAgU0RfSU9fVVNJTkdfMVY4LCAwKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CiAJCX0KIAl9IGVsc2UgaWYgKHZvbHRhZ2UgPT0gU0RfSU9fMVY4KSB7CiAJCWlmIChjaGlwLT5hc2ljX2NvZGUpIHsKIAkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcGh5X3JlZ2lzdGVyKGNoaXAsIDB4MDgsCiAJCQkJCQkJMHg0QzQwIHwKIAkJCQkJCQljaGlwLT5waHlfdm9sdGFnZSk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAJCX0gZWxzZSB7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9QQURfQ1RMLCBTRF9JT19VU0lOR18xVjgsCi0JCQkJU0RfSU9fVVNJTkdfMVY4KTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfUEFEX0NUTCwKKwkJCQkJCSAgICAgU0RfSU9fVVNJTkdfMVY4LAorCQkJCQkJICAgICBTRF9JT19VU0lOR18xVjgpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC03MjgsMzMgKzc5Miw2MSBAQAogCWludCByZXR2YWw7CiAJdTggc3RhdDsKIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX0JVU19TVEFULCBTRF9DTEtfVE9HR0xFX0VOIHwgU0RfQ0xLX0ZPUkNFX1NUT1AsCi0JCVNEX0NMS19UT0dHTEVfRU4pOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQlVTX1NUQVQsCisJCQkJICAgICBTRF9DTEtfVE9HR0xFX0VOIHwgU0RfQ0xLX0ZPUkNFX1NUT1AsCisJCQkJICAgICBTRF9DTEtfVE9HR0xFX0VOKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBWT0xUQUdFX1NXSVRDSCwgMCwgU0RfUlNQX1RZUEVfUjEsCiAJCQkJTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAl1ZGVsYXkoY2hpcC0+c2Rfdm9sdGFnZV9zd2l0Y2hfZGVsYXkpOwogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBTRF9CVVNfU1RBVCwgJnN0YXQpOworCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBTRF9CVVNfU1RBVCwgJnN0YXQpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJaWYgKHN0YXQgJiAoU0RfQ01EX1NUQVRVUyB8IFNEX0RBVDNfU1RBVFVTIHwgU0RfREFUMl9TVEFUVVMgfAogCQkJCVNEX0RBVDFfU1RBVFVTIHwgU0RfREFUMF9TVEFUVVMpKSB7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9CVVNfU1RBVCwgMHhGRiwgU0RfQ0xLX0ZPUkNFX1NUT1ApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQlVTX1NUQVQsIDB4RkYsCisJCQkJICAgICBTRF9DTEtfRk9SQ0VfU1RPUCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlyZXR2YWwgPSBzZF9jaGFuZ2VfYmFua192b2x0YWdlKGNoaXAsIFNEX0lPXzFWOCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAl3YWl0X3RpbWVvdXQoNTApOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfQlVTX1NUQVQsIDB4RkYsIFNEX0NMS19UT0dHTEVfRU4pOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQlVTX1NUQVQsIDB4RkYsCisJCQkJICAgICBTRF9DTEtfVE9HR0xFX0VOKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCXdhaXRfdGltZW91dCgxMCk7CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFNEX0JVU19TVEFULCAmc3RhdCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFNEX0JVU19TVEFULCAmc3RhdCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlpZiAoKHN0YXQgJiAoU0RfQ01EX1NUQVRVUyB8IFNEX0RBVDNfU1RBVFVTIHwgU0RfREFUMl9TVEFUVVMgfAogCQkJCVNEX0RBVDFfU1RBVFVTIHwgU0RfREFUMF9TVEFUVVMpKSAhPQogCQkJKFNEX0NNRF9TVEFUVVMgfCBTRF9EQVQzX1NUQVRVUyB8IFNEX0RBVDJfU1RBVFVTIHwKQEAgLTc2MywyMyArODU1LDQ4IEBACiAJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQlVTX1NUQVQsCiAJCQkJU0RfQ0xLX1RPR0dMRV9FTiB8IFNEX0NMS19GT1JDRV9TVE9QLCAwKTsKIAkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0NMS19FTiwgMHhGRiwgMCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9CVVNfU1RBVCwgU0RfQ0xLX1RPR0dMRV9FTiB8IFNEX0NMS19GT1JDRV9TVE9QLAotCQkwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0JVU19TVEFULAorCQkJCSAgICAgU0RfQ0xLX1RPR0dMRV9FTiB8IFNEX0NMS19GT1JDRV9TVE9QLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQogCiBzdGF0aWMgaW50IHNkX3Jlc2V0X2RjbShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCB0dW5lX2RpcikKIHsKKwlpbnQgcmV0dmFsOworCiAJaWYgKHR1bmVfZGlyID09IFRVTkVfUlgpIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRENNX0RSUF9DVEwsIDB4RkYsIERDTV9SRVNFVCB8IERDTV9SWCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIERDTV9EUlBfQ1RMLCAweEZGLCBEQ01fUlgpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIERDTV9EUlBfQ1RMLCAweEZGLAorCQkJCQkgICAgIERDTV9SRVNFVCB8IERDTV9SWCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRENNX0RSUF9DVEwsIDB4RkYsIERDTV9SWCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfSBlbHNlIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRENNX0RSUF9DVEwsIDB4RkYsIERDTV9SRVNFVCB8IERDTV9UWCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIERDTV9EUlBfQ1RMLCAweEZGLCBEQ01fVFgpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIERDTV9EUlBfQ1RMLCAweEZGLAorCQkJCQkgICAgIERDTV9SRVNFVCB8IERDTV9UWCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRENNX0RSUF9DVEwsIDB4RkYsIERDTV9UWCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtNzkxLDcgKzkwOCw3IEBACiAJdTE2IFNEX1ZQX0NUTCwgU0RfRENNUFNfQ1RMOwogCXU4IHZhbDsKIAlpbnQgcmV0dmFsOwotCWludCBkZHJfcnggPSAwOworCWJvb2wgZGRyX3J4ID0gZmFsc2U7CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAic2RfY2hhbmdlX3BoYXNlIChzYW1wbGVfcG9pbnQgPSAlZCwgdHVuZV9kaXIgPSAlZClcbiIsCiAJCXNhbXBsZV9wb2ludCwgdHVuZV9kaXIpOwpAQCAtODAwLDE5ICs5MTcsNDIgQEAKIAkJU0RfVlBfQ1RMID0gU0RfVlBSWF9DVEw7CiAJCVNEX0RDTVBTX0NUTCA9IFNEX0RDTVBTX1JYX0NUTDsKIAkJaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkKLQkJCWRkcl9yeCA9IDE7CisJCQlkZHJfcnggPSB0cnVlOwogCX0gZWxzZSB7CiAJCVNEX1ZQX0NUTCA9IFNEX1ZQVFhfQ1RMOwogCQlTRF9EQ01QU19DVEwgPSBTRF9EQ01QU19UWF9DVEw7CiAJfQogCiAJaWYgKGNoaXAtPmFzaWNfY29kZSkgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfQ1RMLCBDSEFOR0VfQ0xLLCBDSEFOR0VfQ0xLKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBfQ1RMLCAweDFGLCBzYW1wbGVfcG9pbnQpOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUENMSzBfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsIDApOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUENMSzBfQ1RMLCBQSEFTRV9OT1RfUkVTRVQsCi0JCQlQSEFTRV9OT1RfUkVTRVQpOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfQ1RMLCBDSEFOR0VfQ0xLLCAwKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDTEtfQ1RMLCBDSEFOR0VfQ0xLLAorCQkJCQkgICAgIENIQU5HRV9DTEspOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1ZQX0NUTCwgMHgxRiwKKwkJCQkJICAgICBzYW1wbGVfcG9pbnQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1ZQQ0xLMF9DVEwsCisJCQkJCSAgICAgUEhBU0VfTk9UX1JFU0VULCAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9WUENMSzBfQ1RMLAorCQkJCQkgICAgIFBIQVNFX05PVF9SRVNFVCwgUEhBU0VfTk9UX1JFU0VUKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDTEtfQ1RMLCBDSEFOR0VfQ0xLLCAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9IGVsc2UgewogCQlydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgU0RfVlBfQ1RMLCAmdmFsKTsKIAkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlNEX1ZQX0NUTDogMHgleFxuIiwgdmFsKTsKQEAgLTgyMCwxNiArOTYwLDM0IEBACiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJTRF9EQ01QU19DVEw6IDB4JXhcbiIsIHZhbCk7CiAKIAkJaWYgKGRkcl9yeCkgewotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBfQ1RMLCBQSEFTRV9DSEFOR0UsCi0JCQkJUEhBU0VfQ0hBTkdFKTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfVlBfQ1RMLAorCQkJCQkJICAgICBQSEFTRV9DSEFOR0UsCisJCQkJCQkgICAgIFBIQVNFX0NIQU5HRSk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQkJdWRlbGF5KDUwKTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX1ZQX0NUTCwgMHhGRiwKLQkJCQlQSEFTRV9DSEFOR0UgfCBQSEFTRV9OT1RfUkVTRVQgfCBzYW1wbGVfcG9pbnQpOworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9WUF9DVEwsIDB4RkYsCisJCQkJCQkgICAgIFBIQVNFX0NIQU5HRSB8IFBIQVNFX05PVF9SRVNFVCB8IHNhbXBsZV9wb2ludCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQogCQl9IGVsc2UgewotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0xLX0NUTCwgQ0hBTkdFX0NMSywgQ0hBTkdFX0NMSyk7CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENMS19DVEwsCisJCQkJCQkgICAgIENIQU5HRV9DTEssIENIQU5HRV9DTEspOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJCXVkZWxheSg1MCk7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9WUF9DVEwsIDB4RkYsCi0JCQkJCVBIQVNFX05PVF9SRVNFVCB8IHNhbXBsZV9wb2ludCk7CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1ZQX0NUTCwgMHhGRiwKKwkJCQkJCSAgICAgUEhBU0VfTk9UX1JFU0VUIHwgc2FtcGxlX3BvaW50KTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CiAJCX0KIAkJdWRlbGF5KDEwMCk7CiAKQEAgLTgzOSwyNiArOTk3LDUyIEBACiAJCXJ0c3hfYWRkX2NtZChjaGlwLCBDSEVDS19SRUdfQ01ELCBTRF9EQ01QU19DVEwsCiAJCQlEQ01QU19DSEFOR0VfRE9ORSwgRENNUFNfQ0hBTkdFX0RPTkUpOwogCQlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIFNEX0NBUkQsIDEwMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIEZhaWwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBGYWlsOworCQl9CiAKIAkJdmFsID0gKnJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApOwotCQlpZiAodmFsICYgRENNUFNfRVJST1IpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIEZhaWwpOworCQlpZiAodmFsICYgRENNUFNfRVJST1IpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIEZhaWw7CisJCX0KIAotCQlpZiAoKHZhbCAmIERDTVBTX0NVUlJFTlRfUEhBU0UpICE9IHNhbXBsZV9wb2ludCkKLQkJCVRSQUNFX0dPVE8oY2hpcCwgRmFpbCk7CisJCWlmICgodmFsICYgRENNUFNfQ1VSUkVOVF9QSEFTRSkgIT0gc2FtcGxlX3BvaW50KSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBGYWlsOworCQl9CiAKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfRENNUFNfQ1RMLCBEQ01QU19DSEFOR0UsIDApOwotCQlpZiAoZGRyX3J4KQotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfVlBfQ1RMLCBQSEFTRV9DSEFOR0UsIDApOwotCQllbHNlCi0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDTEtfQ1RMLCBDSEFOR0VfQ0xLLCAwKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9EQ01QU19DVEwsCisJCQkJCSAgICAgRENNUFNfQ0hBTkdFLCAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJaWYgKGRkcl9yeCkgeworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9WUF9DVEwsCisJCQkJCQkgICAgIFBIQVNFX0NIQU5HRSwgMCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDTEtfQ1RMLAorCQkJCQkJICAgICBDSEFOR0VfQ0xLLCAwKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCX0KIAogCQl1ZGVsYXkoNTApOwogCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEX0NGRzEsIFNEX0FTWU5DX0ZJRk9fTk9UX1JTVCwgMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkcxLCBTRF9BU1lOQ19GSUZPX05PVF9SU1QsIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiAKQEAgLTg4Myw4ICsxMDY3LDEwIEBACiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsIHNkX2NhcmQtPnNkX2FkZHIsCiAJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJY21kWzBdID0gMHg0MCB8IFNFTkRfU0NSOwogCWNtZFsxXSA9IDA7CkBAIC04OTYsMTMgKzEwODIsMTYgQEAKIAkJCWJ1ZiwgOCwgMjUwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXJ0c3hfY2xlYXJfc2RfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAltZW1jcHkoc2RfY2FyZC0+cmF3X3NjciwgYnVmLCA4KTsKIAotCWlmICgoYnVmWzBdICYgMHgwRikgPT0gMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoKGJ1ZlswXSAmIDB4MEYpID09IDApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTk0NCw3ICsxMTMzLDggQEAKIAkJCWJyZWFrOwogCiAJCWRlZmF1bHQ6Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0gZWxzZSBpZiAoZnVuY19ncm91cCA9PSBTRF9GVU5DX0dST1VQXzMpIHsKIAkJc3VwcG9ydF9vZmZzZXQgPSBGVU5DVElPTl9HUk9VUDNfU1VQUE9SVF9PRkZTRVQ7CkBAIC05NzEsNyArMTE2MSw4IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9IGVsc2UgaWYgKGZ1bmNfZ3JvdXAgPT0gU0RfRlVOQ19HUk9VUF80KSB7CiAJCXN1cHBvcnRfb2Zmc2V0ID0gRlVOQ1RJT05fR1JPVVA0X1NVUFBPUlRfT0ZGU0VUOwpAQCAtOTk4LDIzICsxMTg5LDI3IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9IGVsc2UgewotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKGZ1bmNfZ3JvdXAgPT0gU0RfRlVOQ19HUk9VUF8xKSB7CiAJCWlmICghKGJ1ZltzdXBwb3J0X29mZnNldF0gJiBzdXBwb3J0X21hc2spIHx8CiAJCQkoKGJ1ZltxdWVyeV9zd2l0Y2hfb2Zmc2V0XSAmIDB4MEYpICE9IHF1ZXJ5X3N3aXRjaCkpIHsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfQogCiAJLyogQ2hlY2sgJ0J1c3kgU3RhdHVzJyAqLwogCWlmICgoYnVmW0RBVEFfU1RSVUNUVVJFX1ZFUl9PRkZTRVRdID09IDB4MDEpICYmCiAJCSAgICAoKGJ1ZltjaGVja19idXN5X29mZnNldF0gJiBzd2l0Y2hfYnVzeSkgPT0gc3dpdGNoX2J1c3kpKSB7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xMDU2LDcgKzEyNTEsOCBAQAogCQkJYnVmLCA2NCwgMjUwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXJ0c3hfY2xlYXJfc2RfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiJSpwaFxuIiwgNjQsIGJ1Zik7CkBAIC0xMDgzLDE5ICsxMjc5LDMzIEBACiAKIAkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIk1heGltdW0gY3VycmVudCBjb25zdW1wdGlvbjogJWRtQVxuIiwKIAkJCWNjKTsKLQkJaWYgKChjYyA9PSAwKSB8fCAoY2MgPiA4MDApKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKChjYyA9PSAwKSB8fCAoY2MgPiA4MDApKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gc2RfcXVlcnlfc3dpdGNoX3Jlc3VsdChjaGlwLCBmdW5jX2dyb3VwLAogCQkJCQkJZnVuY190b19zd2l0Y2gsIGJ1ZiwgNjQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWlmICgoY2MgPiA0MDApIHx8IChmdW5jX3RvX3N3aXRjaCA+IENVUlJFTlRfTElNSVRfNDAwKSkgewotCQkJUlRTWF9XUklURV9SRUcoY2hpcCwgT0NQUEFSQTIsIFNEX09DUF9USERfTUFTSywKLQkJCQljaGlwLT5zZF84MDBtQV9vY3BfdGhkKTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFdSX0NUTCwgUE1PU19TVFJHX01BU0ssCi0JCQkJUE1PU19TVFJHXzgwMG1BKTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgT0NQUEFSQTIsCisJCQkJCQkgICAgIFNEX09DUF9USERfTUFTSywKKwkJCQkJCSAgICAgY2hpcC0+c2RfODAwbUFfb2NwX3RoZCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BXUl9DVEwsCisJCQkJCQkgICAgIFBNT1NfU1RSR19NQVNLLAorCQkJCQkJICAgICBQTU9TX1NUUkdfODAwbUEpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJfQogCX0KIApAQCAtMTEyMSwxMiArMTMzMSwxMyBAQAogewogCWludCByZXR2YWw7CiAJaW50IGk7Ci0JaW50IHN3aXRjaF9nb29kID0gMDsKKwlib29sIHN3aXRjaF9nb29kID0gZmFsc2U7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlyZXR2YWwgPSBzZF9jaGVja19zd2l0Y2hfbW9kZShjaGlwLCBTRF9DSEVDS19NT0RFLCBmdW5jX2dyb3VwLApAQCAtMTEzNywxNCArMTM0OCwxOSBAQAogCQkJcmV0dmFsID0gc2RfY2hlY2tfc3dpdGNoX21vZGUoY2hpcCwgU0RfU1dJVENIX01PREUsCiAJCQkJCWZ1bmNfZ3JvdXAsIGZ1bmNfdG9fc3dpdGNoLCBidXNfd2lkdGgpOwogCQkJaWYgKHJldHZhbCA9PSBTVEFUVVNfU1VDQ0VTUykgewotCQkJCXN3aXRjaF9nb29kID0gMTsKKwkJCQlzd2l0Y2hfZ29vZCA9IHRydWU7CiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCVJUU1hfUkVBRF9SRUcoY2hpcCwgU0RfU1RBVDEsICZzdGF0KTsKKwkJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBTRF9TVEFUMSwgJnN0YXQpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJCWlmIChzdGF0ICYgU0RfQ1JDMTZfRVJSKSB7CiAJCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlNEIENSQzE2IGVycm9yIHdoZW4gc3dpdGNoaW5nIG1vZGVcbiIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCX0KIApAQCAtMTE1NCw4ICsxMzcwLDEwIEBACiAJCXdhaXRfdGltZW91dCgyMCk7CiAJfQogCi0JaWYgKCFzd2l0Y2hfZ29vZCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoIXN3aXRjaF9nb29kKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0xMTcwLDggKzEzODgsMTAgQEAKIAkvKiBHZXQgc3VwcG9ydGVkIGZ1bmN0aW9ucyAqLwogCXJldHZhbCA9IHNkX2NoZWNrX3N3aXRjaF9tb2RlKGNoaXAsIFNEX0NIRUNLX01PREUsCiAJCQlOT19BUkdVTUVOVCwgTk9fQVJHVU1FTlQsIGJ1c193aWR0aCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlzZF9jYXJkLT5mdW5jX2dyb3VwMV9tYXNrICY9IH4oc2RfY2FyZC0+c2Rfc3dpdGNoX2ZhaWwpOwogCkBAIC0xMjM5LDcgKzE0NTksOCBAQAogCQkJCXNkX2NhcmQtPnNkX3N3aXRjaF9mYWlsID0gU0RSMTA0X1NVUFBPUlRfTUFTSyB8CiAJCQkJCUREUjUwX1NVUFBPUlRfTUFTSyB8IFNEUjUwX1NVUFBPUlRfTUFTSzsKIAkJCX0KLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJaWYgKGZ1bmNfdG9fc3dpdGNoID09IFNEUjEwNF9TVVBQT1JUKQpAQCAtMTI1MywxMCArMTQ3NCwxNyBAQAogCX0KIAogCWlmIChDSEtfU0RfRERSNTAoc2RfY2FyZCkpIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfUFVTSF9QT0lOVF9DVEwsIDB4MDYsIDB4MDQpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX1BVU0hfUE9JTlRfQ1RMLCAweDA2LAorCQkJCQkgICAgIDB4MDQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCQlyZXR2YWwgPSBzZF9zZXRfc2FtcGxlX3B1c2hfdGltaW5nKGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCWlmICghZnVuY190b19zd2l0Y2ggfHwgKGZ1bmNfdG9fc3dpdGNoID09IEhTX1NVUFBPUlQpKSB7CkBAIC0xMzEwLDE1ICsxNTM4LDIyIEBACiAJCXJldHZhbCA9IHNkX2NoZWNrX3N3aXRjaChjaGlwLCBTRF9GVU5DX0dST1VQXzQsIGZ1bmNfdG9fc3dpdGNoLAogCQkJCQlidXNfd2lkdGgpOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7Ci0JCQlpZiAoc2RfY2hlY2tfZXJyX2NvZGUoY2hpcCwgU0RfTk9fQ0FSRCkpCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCWlmIChzZF9jaGVja19lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKSkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCQl9CiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJTd2l0Y2ggY3VycmVudCBsaW1pdCBmaW5pc2hlZCEgKCVkKVxuIiwKIAkJCXJldHZhbCk7CiAJfQogCi0JaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfUFVTSF9QT0lOVF9DVEwsIDB4MDYsIDApOworCWlmIChDSEtfU0RfRERSNTAoc2RfY2FyZCkpIHsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9QVVNIX1BPSU5UX0NUTCwgMHgwNiwgMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMTMzMCw3ICsxNTY1LDExIEBACiAJdTggdmFsID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQlSVFNYX1JFQURfUkVHKGNoaXAsIFNEX0RBVEFfU1RBVEUsICZ2YWwpOworCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgU0RfREFUQV9TVEFURSwgJnZhbCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJCWlmICh2YWwgJiBTRF9EQVRBX0lETEUpIHsKIAkJCXJldHZhbCA9IFNUQVRVU19TVUNDRVNTOwogCQkJYnJlYWs7CkBAIC0xMzQ4LDggKzE1ODcsMTAgQEAKIAl1OCBjbWRbNV07CiAKIAlyZXR2YWwgPSBzZF9jaGFuZ2VfcGhhc2UoY2hpcCwgc2FtcGxlX3BvaW50LCBUVU5FX1JYKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWNtZFswXSA9IDB4NDAgfCBTRU5EX1RVTklOR19QQVRURVJOOwogCWNtZFsxXSA9IDA7CkBAIC0xMzYzLDcgKzE2MDQsOCBAQAogCQkodm9pZClzZF93YWl0X2RhdGFfaWRsZShjaGlwKTsKIAogCQlydHN4X2NsZWFyX3NkX2Vycm9yKGNoaXApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMTM3NiwxNSArMTYxOCwxOSBAQAogCXU4IGNtZFs1XTsKIAogCXJldHZhbCA9IHNkX2NoYW5nZV9waGFzZShjaGlwLCBzYW1wbGVfcG9pbnQsIFRVTkVfUlgpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgInNkIGRkciB0dW5pbmcgcnhcbiIpOwogCiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWNtZFswXSA9IDB4NDAgfCBTRF9TVEFUVVM7CiAJY21kWzFdID0gMDsKQEAgLTEzOTgsNyArMTY0NCw4IEBACiAJCSh2b2lkKXNkX3dhaXRfZGF0YV9pZGxlKGNoaXApOwogCiAJCXJ0c3hfY2xlYXJfc2RfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xNDE4LDggKzE2NjUsMTAgQEAKIAkJYnVzX3dpZHRoID0gU0RfQlVTX1dJRFRIXzE7CiAKIAlyZXR2YWwgPSBzZF9jaGFuZ2VfcGhhc2UoY2hpcCwgc2FtcGxlX3BvaW50LCBUVU5FX1JYKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJtbWMgZGRyIHR1bmluZyByeFxuIik7CiAKQEAgLTE0MzUsNyArMTY4NCw4IEBACiAJCSh2b2lkKXNkX3dhaXRfZGF0YV9pZGxlKGNoaXApOwogCiAJCXJ0c3hfY2xlYXJfc2RfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xNDQ3LDExICsxNjk3LDE3IEBACiAJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IHNkX2NoYW5nZV9waGFzZShjaGlwLCBzYW1wbGVfcG9pbnQsIFRVTkVfVFgpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfQ0ZHMywgU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4sCi0JCVNEX1JTUF84MENMS19USU1FT1VUX0VOKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNEX0NGRzMsIFNEX1JTUF84MENMS19USU1FT1VUX0VOLAorCQkJCSAgICAgU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4pOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLCBzZF9jYXJkLT5zZF9hZGRyLAogCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7CkBAIC0xNDU5LDExICsxNzE1LDE3IEBACiAJCWlmIChzZF9jaGVja19lcnJfY29kZShjaGlwLCBTRF9SU1BfVElNRU9VVCkpIHsKIAkJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQ0ZHMywKIAkJCQkJU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4sIDApOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwgMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwKKwkJCQkgICAgIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0xNDc1LDggKzE3MzcsMTAgQEAKIAl1OCBjbWRbNV0sIGJ1c193aWR0aDsKIAogCXJldHZhbCA9IHNkX2NoYW5nZV9waGFzZShjaGlwLCBzYW1wbGVfcG9pbnQsIFRVTkVfVFgpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKENIS19TRChzZF9jYXJkKSkgewogCQlidXNfd2lkdGggPSBTRF9CVVNfV0lEVEhfNDsKQEAgLTE0OTAsMTEgKzE3NTQsMTcgQEAKIAl9CiAKIAlyZXR2YWwgPSBzZF93YWl0X3N0YXRlX2RhdGFfcmVhZHkoY2hpcCwgMHgwOCwgMSwgMTAwMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwKLQkJU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4pOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQ0ZHMywgU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4sCisJCQkJICAgICBTRF9SU1BfODBDTEtfVElNRU9VVF9FTik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWNtZFswXSA9IDB4NDAgfCBQUk9HUkFNX0NTRDsKIAljbWRbMV0gPSAwOwpAQCAtMTUwNywxMCArMTc3NywxNiBAQAogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJcnRzeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKIAkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwgMCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwgMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwKKwkJCQkgICAgIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLCBzZF9jYXJkLT5zZF9hZGRyLCBTRF9SU1BfVFlQRV9SMSwKIAkJCU5VTEwsIDApOwpAQCAtMTUyNCw3ICsxODAwLDggQEAKIAlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CiAJc3RydWN0IHRpbWluZ19waGFzZV9wYXRoIHBhdGhbTUFYX1BIQVNFICsgMV07CiAJaW50IGksIGosIGNvbnRfcGF0aF9jbnQ7Ci0JaW50IG5ld19ibG9jaywgbWF4X2xlbiwgZmluYWxfcGF0aF9pZHg7CisJYm9vbCBuZXdfYmxvY2s7CisJaW50IG1heF9sZW4sIGZpbmFsX3BhdGhfaWR4OwogCXU4IGZpbmFsX3BoYXNlID0gMHhGRjsKIAogCWlmIChwaGFzZV9tYXAgPT0gMHhGRkZGRkZGRikgewpAQCAtMTUzNywxMiArMTgxNCwxMiBAQAogCX0KIAogCWNvbnRfcGF0aF9jbnQgPSAwOwotCW5ld19ibG9jayA9IDE7CisJbmV3X2Jsb2NrID0gdHJ1ZTsKIAlqID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1BIQVNFICsgMTsgaSsrKSB7CiAJCWlmIChwaGFzZV9tYXAgJiAoMSA8PCBpKSkgewogCQkJaWYgKG5ld19ibG9jaykgewotCQkJCW5ld19ibG9jayA9IDA7CisJCQkJbmV3X2Jsb2NrID0gZmFsc2U7CiAJCQkJaiA9IGNvbnRfcGF0aF9jbnQrKzsKIAkJCQlwYXRoW2pdLnN0YXJ0ID0gaTsKIAkJCQlwYXRoW2pdLmVuZCA9IGk7CkBAIC0xNTUwLDcgKzE4MjcsNyBAQAogCQkJCXBhdGhbal0uZW5kID0gaTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCW5ld19ibG9jayA9IDE7CisJCQluZXdfYmxvY2sgPSB0cnVlOwogCQkJaWYgKGNvbnRfcGF0aF9jbnQpIHsKIAkJCQlpbnQgaWR4ID0gY29udF9wYXRoX2NudCAtIDE7CiAKQEAgLTE2NTQsOCArMTkzMSwxMCBAQAogCX0gZWxzZSB7CiAJCWlmIChDSEtfTU1DX0REUjUyKHNkX2NhcmQpKQogCQkJdHVuaW5nX2NtZCA9IG1tY19kZHJfdHVubmluZ19yeF9jbWQ7Ci0JCWVsc2UKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWVsc2UgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKQEAgLTE2NjMsNyArMTk0Miw4IEBACiAJCWZvciAoaiA9IE1BWF9QSEFTRTsgaiA+PSAwOyBqLS0pIHsKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAJCQlyZXR2YWwgPSB0dW5pbmdfY21kKGNoaXAsICh1OClqKTsKQEAgLTE2ODAsMTIgKzE5NjAsMTYgQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiUlggcGhhc2VfbWFwID0gMHglMDh4XG4iLCBwaGFzZV9tYXApOwogCiAJZmluYWxfcGhhc2UgPSBzZF9zZWFyY2hfZmluYWxfcGhhc2UoY2hpcCwgcGhhc2VfbWFwLCBUVU5FX1JYKTsKLQlpZiAoZmluYWxfcGhhc2UgPT0gMHhGRikKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoZmluYWxfcGhhc2UgPT0gMHhGRikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc2RfY2hhbmdlX3BoYXNlKGNoaXAsIGZpbmFsX3BoYXNlLCBUVU5FX1JYKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTE2OTgsOCArMTk4MiwxMiBAQAogCXUzMiBwaGFzZV9tYXA7CiAJdTggZmluYWxfcGhhc2U7CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTRF9DRkczLCBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwKLQkJU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4pOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQ0ZHMywgU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4sCisJCQkJICAgICBTRF9SU1BfODBDTEtfVElNRU9VVF9FTik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXBoYXNlX21hcCA9IDA7CiAJZm9yIChpID0gTUFYX1BIQVNFOyBpID49IDA7IGktLSkgewpAQCAtMTcwNyw3ICsxOTk1LDggQEAKIAkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKTsKIAkJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQ0ZHMywKIAkJCQkJCVNEX1JTUF84MENMS19USU1FT1VUX0VOLCAwKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJcmV0dmFsID0gc2RfY2hhbmdlX3BoYXNlKGNoaXAsICh1OClpLCBUVU5FX1RYKTsKQEAgLTE3MjIsMTggKzIwMTEsMjcgQEAKIAkJCXBoYXNlX21hcCB8PSAxIDw8IGk7CiAJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgU0RfQ0ZHMywgU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4sIDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQ0ZHMywgU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4sCisJCQkJICAgICAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIkREUiBUWCBwcmUgdHVuZSBwaGFzZV9tYXAgPSAweCUwOHhcbiIsCiAJCXBoYXNlX21hcCk7CiAKIAlmaW5hbF9waGFzZSA9IHNkX3NlYXJjaF9maW5hbF9waGFzZShjaGlwLCBwaGFzZV9tYXAsIFRVTkVfVFgpOwotCWlmIChmaW5hbF9waGFzZSA9PSAweEZGKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChmaW5hbF9waGFzZSA9PSAweEZGKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzZF9jaGFuZ2VfcGhhc2UoY2hpcCwgZmluYWxfcGhhc2UsIFRVTkVfVFgpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIkREUiBUWCBwcmUgdHVuZSBwaGFzZTogJWRcbiIsCiAJCShpbnQpZmluYWxfcGhhc2UpOwpAQCAtMTc1OSw4ICsyMDU3LDEwIEBACiAJfSBlbHNlIHsKIAkJaWYgKENIS19NTUNfRERSNTIoc2RfY2FyZCkpCiAJCQl0dW5pbmdfY21kID0gc2RfZGRyX3R1bmluZ190eF9jbWQ7Ci0JCWVsc2UKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWVsc2UgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKQEAgLTE3NzAsNyArMjA3MCw4IEBACiAJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpOwogCQkJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQ0ZHMywKIAkJCQkJCSAgICBTRF9SU1BfODBDTEtfVElNRU9VVF9FTiwgMCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAogCQkJcmV0dmFsID0gdHVuaW5nX2NtZChjaGlwLCAodTgpaik7CkBAIC0xNzg3LDEyICsyMDg4LDE2IEBACiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlRYIHBoYXNlX21hcCA9IDB4JTA4eFxuIiwgcGhhc2VfbWFwKTsKIAogCWZpbmFsX3BoYXNlID0gc2Rfc2VhcmNoX2ZpbmFsX3BoYXNlKGNoaXAsIHBoYXNlX21hcCwgVFVORV9UWCk7Ci0JaWYgKGZpbmFsX3BoYXNlID09IDB4RkYpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGZpbmFsX3BoYXNlID09IDB4RkYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNkX2NoYW5nZV9waGFzZShjaGlwLCBmaW5hbF9waGFzZSwgVFVORV9UWCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0xODAyLDEyICsyMTA3LDE2IEBACiAJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IHNkX3R1bmluZ190eChjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNkX3R1bmluZ19yeChjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTE4MTgsMjMgKzIxMjcsMzEgQEAKIAogCWlmICghKGNoaXAtPnNkX2N0bCAmIFNEX0REUl9UWF9QSEFTRV9TRVRfQllfVVNFUikpIHsKIAkJcmV0dmFsID0gc2RfZGRyX3ByZV90dW5pbmdfdHgoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gc2RfY2hhbmdlX3BoYXNlKGNoaXAsICh1OCljaGlwLT5zZF9kZHJfdHhfcGhhc2UsCiAJCQkJCVRVTkVfVFgpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHZhbCA9IHNkX3R1bmluZ19yeChjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICghKGNoaXAtPnNkX2N0bCAmIFNEX0REUl9UWF9QSEFTRV9TRVRfQllfVVNFUikpIHsKIAkJcmV0dmFsID0gc2RfdHVuaW5nX3R4KGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE4NDYsMjMgKzIxNjMsMzEgQEAKIAogCWlmICghKGNoaXAtPnNkX2N0bCAmIE1NQ19ERFJfVFhfUEhBU0VfU0VUX0JZX1VTRVIpKSB7CiAJCXJldHZhbCA9IHNkX2Rkcl9wcmVfdHVuaW5nX3R4KGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0gZWxzZSB7CiAJCXJldHZhbCA9IHNkX2NoYW5nZV9waGFzZShjaGlwLCAodTgpY2hpcC0+bW1jX2Rkcl90eF9waGFzZSwKIAkJCQkJVFVORV9UWCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfQogCiAJcmV0dmFsID0gc2RfdHVuaW5nX3J4KGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKCEoY2hpcC0+c2RfY3RsICYgTU1DX0REUl9UWF9QSEFTRV9TRVRfQllfVVNFUikpIHsKIAkJcmV0dmFsID0gc2RfdHVuaW5nX3R4KGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE4NzUsMTIgKzIyMDAsMTYgQEAKIAlpbnQgcmVfdHVuaW5nID0gMDsKIAogCXJldHZhbCA9IHNlbGVjdF9jYXJkKGNoaXAsIFNEX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc3dpdGNoX2Nsb2NrKGNoaXAsIHNkX2NhcmQtPnNkX2Nsb2NrKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChyZV90dW5pbmcpIHsKIAkJaWYgKENIS19TRChzZF9jYXJkKSkgewpAQCAtMTg5Myw4ICsyMjIyLDEwIEBACiAJCQkJcmV0dmFsID0gbW1jX2Rkcl90dW5pbmcoY2hpcCk7CiAJCX0KIAotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE5MjQsNDEgKzIyNTUsMTAwIEBACiAJY2hpcC0+c2RfaW8gPSAwOwogCiAJcmV0dmFsID0gc2Rfc2V0X2luaXRfcGFyYShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgUkVHX1NEX0NGRzEsIDB4RkYsIDB4NDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzEsIDB4RkYsIDB4NDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1NUT1AsIFNEX1NUT1AgfCBTRF9DTFJfRVJSLAotCQlTRF9TVE9QIHwgU0RfQ0xSX0VSUik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1NUT1AsIFNEX1NUT1AgfCBTRF9DTFJfRVJSLAorCQkJCSAgICAgU0RfU1RPUCB8IFNEX0NMUl9FUlIpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR2YWwgPSBzZWxlY3RfY2FyZChjaGlwLCBTRF9DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KIAogc3RhdGljIGludCBzZF9wdWxsX2N0bF9kaXNhYmxlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CisJaW50IHJldHZhbDsKKwogCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMSwgMHhGRiwKLQkJCVhEX0QzX1BEIHwgU0RfRDdfUEQgfCBTRF9DTEtfUEQgfCBTRF9ENV9QRCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwyLCAweEZGLAotCQkJU0RfRDZfUEQgfCBTRF9EMF9QRCB8IFNEX0QxX1BEIHwgWERfRDVfUEQpOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMywgMHhGRiwKLQkJCVNEX0Q0X1BEIHwgWERfQ0VfUEQgfCBYRF9DTEVfUEQgfCBYRF9DRF9QVSk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEw0LCAweEZGLAotCQkJWERfUkRZX1BEIHwgU0RfRDNfUEQgfCBTRF9EMl9QRCB8IFhEX0FMRV9QRCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEw1LCAweEZGLAotCQkJTVNfSU5TX1BVIHwgU0RfV1BfUEQgfCBTRF9DRF9QVSB8IFNEX0NNRF9QRCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEw2LCAweEZGLCBNU19ENV9QRCB8IE1TX0Q0X1BEKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMSwgMHhGRiwKKwkJCQkJICAgICBYRF9EM19QRCB8IFNEX0Q3X1BEIHwgU0RfQ0xLX1BEIHwgU0RfRDVfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwyLCAweEZGLAorCQkJCQkgICAgIFNEX0Q2X1BEIHwgU0RfRDBfUEQgfCBTRF9EMV9QRCB8IFhEX0Q1X1BEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMywgMHhGRiwKKwkJCQkJICAgICBTRF9ENF9QRCB8IFhEX0NFX1BEIHwgWERfQ0xFX1BEIHwgWERfQ0RfUFUpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw0LCAweEZGLAorCQkJCQkgICAgIFhEX1JEWV9QRCB8IFNEX0QzX1BEIHwgU0RfRDJfUEQgfCBYRF9BTEVfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw1LCAweEZGLAorCQkJCQkgICAgIE1TX0lOU19QVSB8IFNEX1dQX1BEIHwgU0RfQ0RfUFUgfCBTRF9DTURfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw2LCAweEZGLAorCQkJCQkgICAgIE1TX0Q1X1BEIHwgTVNfRDRfUEQpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0gZWxzZSBpZiAoQ0hFQ0tfUElEKGNoaXAsIDB4NTI4OCkpIHsKIAkJaWYgKENIRUNLX0JBUk9fUEtHKGNoaXAsIFFGTikpIHsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwxLCAweEZGLCAweDU1KTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwyLCAweEZGLCAweDU1KTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwzLCAweEZGLCAweDRCKTsKLQkJCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEw0LCAweEZGLCAweDY5KTsKKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDEsCisJCQkJCQkgICAgIDB4RkYsIDB4NTUpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDIsCisJCQkJCQkgICAgIDB4RkYsIDB4NTUpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDMsCisJCQkJCQkgICAgIDB4RkYsIDB4NEIpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDQsCisJCQkJCQkgICAgIDB4RkYsIDB4NjkpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAkJfQogCX0KIApAQCAtMTk5OCw4ICsyMzg4LDEwIEBACiAJfQogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCBTRF9DQVJELCAxMDApOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0yMDA5LDI5ICsyNDAxLDQxIEBACiAJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IHNkX3Bvd2VyX29mZl9jYXJkM3YzKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKCFjaGlwLT5mdDJfZmFzdF9tb2RlKQogCQl3YWl0X3RpbWVvdXQoMjUwKTsKIAogCXJldHZhbCA9IGVuYWJsZV9jYXJkX2Nsb2NrKGNoaXAsIFNEX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKGNoaXAtPmFzaWNfY29kZSkgewogCQlyZXR2YWwgPSBzZF9wdWxsX2N0bF9lbmFibGUoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfSBlbHNlIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRlBHQV9QVUxMX0NUTCwgRlBHQV9TRF9QVUxMX0NUTF9CSVQgfCAweDIwLAotCQkJMCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRlBHQV9QVUxMX0NUTCwKKwkJCQkJICAgICBGUEdBX1NEX1BVTExfQ1RMX0JJVCB8IDB4MjAsIDApOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCX0KIAogCWlmICghY2hpcC0+ZnQyX2Zhc3RfbW9kZSkgewogCQlyZXR2YWwgPSBjYXJkX3Bvd2VyX29uKGNoaXAsIFNEX0NBUkQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXdhaXRfdGltZW91dCgyNjApOwogCkBAIC0yMDM5LDIxICsyNDQzLDM3IEBACiAJCWlmIChjaGlwLT5vY3Bfc3RhdCAmIChTRF9PQ19OT1cgfCBTRF9PQ19FVkVSKSkgewogCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIk92ZXIgY3VycmVudCwgT0NQU1RBVCBpcyAweCV4XG4iLAogCQkJCWNoaXAtPm9jcF9zdGF0KTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAjZW5kaWYKIAl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX09FLCBTRF9PVVRQVVRfRU4sIFNEX09VVFBVVF9FTik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX09FLCBTRF9PVVRQVVRfRU4sCisJCQkJICAgICBTRF9PVVRQVVRfRU4pOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CiAKIHN0YXRpYyBpbnQgc2RfZHVtbXlfY2xvY2soc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKIHsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBSRUdfU0RfQ0ZHMywgMHgwMSwgMHgwMSk7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzMsIDB4MDEsIDB4MDEpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJd2FpdF90aW1lb3V0KDUpOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFJFR19TRF9DRkczLCAweDAxLCAwKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9DRkczLCAweDAxLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMjA4NSw3ICsyNTA1LDggQEAKIAkJNSwgNTEyLCAxLCBidXNfd2lkdGgsIE5VTEwsIDAsIDEwMCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlydHN4X2NsZWFyX3NkX2Vycm9yKGNoaXApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMjEwMSw4ICsyNTIyLDEwIEBACiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsCiAJCQlzZF9jYXJkLT5zZF9hZGRyLCBTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAljbWRbMF0gPSAweDQwIHwgU0RfU1RBVFVTOwogCWNtZFsxXSA9IDA7CkBAIC0yMTE3LDcgKzI1NDAsOCBAQAogCiAJCXNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsIHNkX2NhcmQtPnNkX2FkZHIsCiAJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIkFDTUQxMzpcbiIpOwpAQCAtMjE0MSwxNCArMjU2NSwxNSBAQAogc3RhdGljIGludCByZXNldF9zZChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKQogewogCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKLQlpbnQgcmV0dmFsLCBpID0gMCwgaiA9IDAsIGsgPSAwLCBoaV9jYXBfZmxvdyA9IDA7Ci0JaW50IHNkX2RvbnRfc3dpdGNoID0gMDsKLQlpbnQgc3VwcG9ydF8xdjggPSAwOwotCWludCB0cnlfc2RpbyA9IDE7CisJYm9vbCBoaV9jYXBfZmxvdyA9IGZhbHNlOworCWludCByZXR2YWwsIGkgPSAwLCBqID0gMCwgayA9IDA7CisJYm9vbCBzZF9kb250X3N3aXRjaCA9IGZhbHNlOworCWJvb2wgc3VwcG9ydF8xdjggPSBmYWxzZTsKKwlib29sIHRyeV9zZGlvID0gdHJ1ZTsKIAl1OCByc3BbMTZdOwogCXU4IHN3aXRjaF9idXNfd2lkdGg7CiAJdTMyIHZvbHRhZ2UgPSAwOwotCWludCBzZDIwX21vZGUgPSAwOworCWJvb2wgc2QyMF9tb2RlID0gZmFsc2U7CiAKIAlTRVRfU0Qoc2RfY2FyZCk7CiAKQEAgLTIxNTcsNyArMjU4Miw3IEBACiAJaSA9IDA7CiAJaiA9IDA7CiAJayA9IDA7Ci0JaGlfY2FwX2Zsb3cgPSAwOworCWhpX2NhcF9mbG93ID0gZmFsc2U7CiAKICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKIAlpZiAoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9VTkxPQ0tfUE9XX09OKQpAQCAtMjE2NSwxMiArMjU5MCwxNiBAQAogI2VuZGlmCiAKIAlyZXR2YWwgPSBzZF9wcmVwYXJlX3Jlc2V0KGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc2RfZHVtbXlfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoQ0hLX1NESU9fRVhJU1QoY2hpcCkgJiYgIUNIS19TRElPX0lHTk9SRUQoY2hpcCkgJiYgdHJ5X3NkaW8pIHsKIAkJaW50IHJ0eV9jbnQgPSAwOwpAQCAtMjE3OCw3ICsyNjA3LDggQEAKIAkJZm9yICg7IHJ0eV9jbnQgPCBjaGlwLT5zZGlvX3JldHJ5X2NudDsgcnR5X2NudCsrKSB7CiAJCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgU0RfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfTk9fQ0FSRCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAogCQkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBJT19TRU5EX09QX0NPTkQsIDAsCkBAIC0yMTkwLDcgKzI2MjAsOCBAQAogCQkJCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiU0RfSU8gY2FyZCAoRnVuY3Rpb24gbnVtYmVyOiAlZCkhXG4iLAogCQkJCQkJZnVuY19udW0pOwogCQkJCQljaGlwLT5zZF9pbyA9IDE7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCQl9CiAKIAkJCQlicmVhazsKQEAgLTIyMDgsOCArMjYzOSwxMCBAQAogUlRZX1NEX1JTVDoKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEdPX0lETEVfU1RBVEUsIDAsIFNEX1JTUF9UWVBFX1IwLAogCQkJCU5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJd2FpdF90aW1lb3V0KDIwKTsKIApAQCAtMjIxNyw3ICsyNjUwLDcgQEAKIAkJCQlTRF9SU1BfVFlQRV9SNywgcnNwLCA1KTsKIAlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKSB7CiAJCWlmICgocnNwWzRdID09IDB4QUEpICYmICgocnNwWzNdICYgMHgwZikgPT0gMHgwMSkpIHsKLQkJCWhpX2NhcF9mbG93ID0gMTsKKwkJCWhpX2NhcF9mbG93ID0gdHJ1ZTsKIAkJCXZvbHRhZ2UgPSBTVVBQT1JUX1ZPTFRBR0UgfCAweDQwMDAwMDAwOwogCQl9CiAJfQpAQCAtMjIyNyw4ICsyNjYwLDEwIEBACiAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBHT19JRExFX1NUQVRFLCAwLAogCQkJCQlTRF9SU1BfVFlQRV9SMCwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJd2FpdF90aW1lb3V0KDIwKTsKIAl9CkBAIC0yMjM5LDE0ICsyNjc0LDE3IEBACiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBTRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAJCQlqKys7CiAJCQlpZiAoaiA8IDMpCiAJCQkJZ290byBSVFlfU0RfUlNUOwotCQkJZWxzZQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQllbHNlIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAkJfQogCiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0RfQVBQX09QX0NPTkQsIHZvbHRhZ2UsCkBAIC0yMjU1LDE2ICsyNjkzLDIwIEBACiAJCQlrKys7CiAJCQlpZiAoayA8IDMpCiAJCQkJZ290byBSVFlfU0RfUlNUOwotCQkJZWxzZQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQllbHNlIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAkJfQogCiAJCWkrKzsKIAkJd2FpdF90aW1lb3V0KDIwKTsKIAl9IHdoaWxlICghKHJzcFsxXSAmIDB4ODApICYmIChpIDwgMjU1KSk7CiAKLQlpZiAoaSA9PSAyNTUpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKGkgPT0gMjU1KSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoaGlfY2FwX2Zsb3cpIHsKIAkJaWYgKHJzcFsxXSAmIDB4NDApCkBAIC0yMjcyLDI5ICsyNzE0LDM1IEBACiAJCWVsc2UKIAkJCUNMUl9TRF9IQ1hDKHNkX2NhcmQpOwogCi0JCXN1cHBvcnRfMXY4ID0gMDsKKwkJc3VwcG9ydF8xdjggPSBmYWxzZTsKIAl9IGVsc2UgewogCQlDTFJfU0RfSENYQyhzZF9jYXJkKTsKLQkJc3VwcG9ydF8xdjggPSAwOworCQlzdXBwb3J0XzF2OCA9IGZhbHNlOwogCX0KIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAic3VwcG9ydF8xdjggPSAlZFxuIiwgc3VwcG9ydF8xdjgpOwogCiAJaWYgKHN1cHBvcnRfMXY4KSB7CiAJCXJldHZhbCA9IHNkX3ZvbHRhZ2Vfc3dpdGNoKGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQUxMX1NFTkRfQ0lELCAwLCBTRF9SU1BfVFlQRV9SMiwKIAkJCQlOVUxMLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1JFTEFUSVZFX0FERFIsIDAsCiAJCQkJCVNEX1JTUF9UWVBFX1I2LCByc3AsIDUpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXNkX2NhcmQtPnNkX2FkZHIgPSAodTMyKXJzcFsxXSA8PCAyNDsKIAkJc2RfY2FyZC0+c2RfYWRkciArPSAodTMyKXJzcFsyXSA8PCAxNjsKQEAgLTIzMDQsMTggKzI3NTIsMjQgQEAKIAl9CiAKIAlyZXR2YWwgPSBzZF9jaGVja19jc2QoY2hpcCwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzZF9zZWxlY3RfY2FyZChjaGlwLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogU0RfVU5MT0NLX0VOVFJZOgogCXJldHZhbCA9IHNkX3VwZGF0ZV9sb2NrX3N0YXR1cyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmIChzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyAmIFNEX0xPQ0tFRCkgewogCQlzZF9jYXJkLT5zZF9sb2NrX3N0YXR1cyB8PSAoU0RfTE9DS18xQklUX01PREUgfCBTRF9QV0RfRVhJU1QpOwpAQCAtMjMyNywyNCArMjc4MSwzMiBAQAogCiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0NMUl9DQVJEX0RFVEVDVCwgMCwKIAkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoc3VwcG9ydF8xdjgpIHsKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQlVTX1dJRFRILCAyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJc3dpdGNoX2J1c193aWR0aCA9IFNEX0JVU19XSURUSF80OwogCX0gZWxzZSB7CkBAIC0yMzUzLDE1ICsyODE1LDE5IEBACiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9CTE9DS0xFTiwgMHgyMDAsIFNEX1JTUF9UWVBFX1IxLAogCQkJCU5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc2Rfc2V0X2Nsb2NrX2RpdmlkZXIoY2hpcCwgU0RfQ0xLX0RJVklERV8wKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICghKHNkX2NhcmQtPnJhd19jc2RbNF0gJiAweDQwKSkKLQkJc2RfZG9udF9zd2l0Y2ggPSAxOworCQlzZF9kb250X3N3aXRjaCA9IHRydWU7CiAKIAlpZiAoIXNkX2RvbnRfc3dpdGNoKSB7CiAJCWlmIChzZDIwX21vZGUpIHsKQEAgLTIzNzgsMTYgKzI4NDQsMTYgQEAKIAkJCXJldHZhbCA9IHNkX3N3aXRjaF9mdW5jdGlvbihjaGlwLCBzd2l0Y2hfYnVzX3dpZHRoKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlzZF9pbml0X3Bvd2VyKGNoaXApOwotCQkJCXNkX2RvbnRfc3dpdGNoID0gMTsKLQkJCQl0cnlfc2RpbyA9IDA7CisJCQkJc2RfZG9udF9zd2l0Y2ggPSB0cnVlOworCQkJCXRyeV9zZGlvID0gZmFsc2U7CiAKIAkJCQlnb3RvIFN3aXRjaF9GYWlsOwogCQkJfQogCQl9IGVsc2UgewogCQkJaWYgKHN1cHBvcnRfMXY4KSB7CiAJCQkJc2RfaW5pdF9wb3dlcihjaGlwKTsKLQkJCQlzZF9kb250X3N3aXRjaCA9IDE7Ci0JCQkJdHJ5X3NkaW8gPSAwOworCQkJCXNkX2RvbnRfc3dpdGNoID0gdHJ1ZTsKKwkJCQl0cnlfc2RpbyA9IGZhbHNlOwogCiAJCQkJZ290byBTd2l0Y2hfRmFpbDsKIAkJCX0KQEAgLTIzOTcsMTMgKzI4NjMsMTcgQEAKIAlpZiAoIXN1cHBvcnRfMXY4KSB7CiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQVBQX0NNRCwgc2RfY2FyZC0+c2RfYWRkciwKIAkJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0JVU19XSURUSCwgMiwKIAkJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwpAQCAtMjQxMywxMiArMjg4MywxOCBAQAogCWlmICghc2QyMF9tb2RlICYmIENIS19TRDMwX1NQRUVEKHNkX2NhcmQpKSB7CiAJCWludCByZWFkX2xiYTAgPSAxOwogCi0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNEMzBfRFJJVkVfU0VMLCAweDA3LAotCQkJY2hpcC0+c2QzMF9kcml2ZV9zZWxfMXY4KTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRDMwX0RSSVZFX1NFTCwgMHgwNywKKwkJCQkJICAgICBjaGlwLT5zZDMwX2RyaXZlX3NlbF8xdjgpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQogCiAJCXJldHZhbCA9IHNkX3NldF9pbml0X3BhcmEoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJaWYgKENIS19TRF9ERFI1MChzZF9jYXJkKSkKIAkJCXJldHZhbCA9IHNkX2Rkcl90dW5pbmcoY2hpcCk7CkBAIC0yNDI3LDE0ICsyOTAzLDE3IEBACiAKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJaWYgKHNkMjBfbW9kZSkgewotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9IGVsc2UgewogCQkJCXJldHZhbCA9IHNkX2luaXRfcG93ZXIoY2hpcCk7Ci0JCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQl9CiAKLQkJCQl0cnlfc2RpbyA9IDA7Ci0JCQkJc2QyMF9tb2RlID0gMTsKKwkJCQl0cnlfc2RpbyA9IGZhbHNlOworCQkJCXNkMjBfbW9kZSA9IHRydWU7CiAJCQkJZ290byBTd2l0Y2hfRmFpbDsKIAkJCX0KIAkJfQpAQCAtMjQ1MiwxNCArMjkzMSwxNyBAQAogCQkJcmV0dmFsID0gc2RfcmVhZF9sYmEwKGNoaXApOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCWlmIChzZDIwX21vZGUpIHsKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJCX0gZWxzZSB7CiAJCQkJCXJldHZhbCA9IHNkX2luaXRfcG93ZXIoY2hpcCk7Ci0JCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCQl9CiAKLQkJCQkJdHJ5X3NkaW8gPSAwOwotCQkJCQlzZDIwX21vZGUgPSAxOworCQkJCQl0cnlfc2RpbyA9IGZhbHNlOworCQkJCQlzZDIwX21vZGUgPSB0cnVlOwogCQkJCQlnb3RvIFN3aXRjaF9GYWlsOwogCQkJCX0KIAkJCX0KQEAgLTI0NjcsMTUgKzI5NDksMjcgQEAKIAl9CiAKIAlyZXR2YWwgPSBzZF9jaGVja193cF9zdGF0ZShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWNoaXAtPmNhcmRfYnVzX3dpZHRoW2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IDQ7CiAKICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKIAlpZiAoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9VTkxPQ0tfUE9XX09OKSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFJFR19TRF9CTE9DS19DTlRfSCwgMHhGRiwgMHgwMik7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFJFR19TRF9CTE9DS19DTlRfTCwgMHhGRiwgMHgwMCk7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0JMT0NLX0NOVF9ILCAweEZGLAorCQkJCQkgICAgIDB4MDIpOworCQlpZiAocmV0dmFsKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9CTE9DS19DTlRfTCwgMHhGRiwKKwkJCQkJICAgICAweDAwKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9CiAjZW5kaWYKIApAQCAtMjQ5Myw4ICsyOTg3LDEwIEBACiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEJVU1RFU1RfVywgMCwgU0RfUlNQX1RZUEVfUjEsIE5VTEwsCiAJCQkJMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNXSVRDSF9GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTV0lUQ0hfRkFJTDsKKwl9CiAKIAlpZiAod2lkdGggPT0gTU1DXzhCSVRfQlVTKSB7CiAJCWJ1ZlswXSA9IDB4NTU7CkBAIC0yNTEwLDIwICszMDA2LDI1IEBACiAJfQogCiAJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQ0ZHMywgMHgwMiwgMHgwMik7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNXSVRDSF9FUlIpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNXSVRDSF9FUlI7CisJfQogCiAJcmV0dmFsID0gc2Rfd3JpdGVfZGF0YShjaGlwLCBTRF9UTV9BVVRPX1dSSVRFXzMsCiAJCQlOVUxMLCAwLCBieXRlX2NudCwgMSwgYnVzX3dpZHRoLCBidWYsIGxlbiwgMTAwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXJ0c3hfY2xlYXJfc2RfZXJyb3IoY2hpcCk7CiAJCXJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzMsIDB4MDIsIDApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1dJVENIX0VSUik7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTV0lUQ0hfRVJSOwogCX0KIAogCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzMsIDB4MDIsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTV0lUQ0hfRVJSKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTV0lUQ0hfRVJSOworCX0KIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJTRC9NTUMgQ01EICVkXG4iLCBCVVNURVNUX1IpOwogCkBAIC0yNTU4LDcgKzMwNTksOCBAQAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgU0RfQ0FSRCwgMTAwKTsKIAlpZiAocmV0dmFsIDwgMCkgewogCQlydHN4X2NsZWFyX3NkX2Vycm9yKGNoaXApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1dJVENIX0VSUik7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTV0lUQ0hfRVJSOwogCX0KIAogCXB0ciA9IHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApICsgMTsKQEAgLTI2MDAsMTEgKzMxMDIsMTIgQEAKIAkJfQogCX0KIAotCVRSQUNFX1JFVChjaGlwLCBTV0lUQ0hfRkFJTCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1dJVENIX0ZBSUw7CiB9CiAKIAotc3RhdGljIGludCBtbWNfc3dpdGNoX3RpbWluZ19idXMoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgaW50IHN3aXRjaF9kZHIpCitzdGF0aWMgaW50IG1tY19zd2l0Y2hfdGltaW5nX2J1cyhzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCBib29sIHN3aXRjaF9kZHIpCiB7CiAJc3RydWN0IHNkX2luZm8gKnNkX2NhcmQgPSAmKGNoaXAtPnNkX2NhcmQpOwogCWludCByZXR2YWw7CkBAIC0yNjUxLDE0ICszMTU0LDE2IEBACiAJCQlzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLCBzZF9jYXJkLT5zZF9hZGRyLAogCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7CiAJCX0KLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXB0ciA9IHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApOwogCWlmIChwdHJbMF0gJiBTRF9UUkFOU0ZFUl9FUlIpIHsKIAkJc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywgc2RfY2FyZC0+c2RfYWRkciwKIAkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAoQ0hLX01NQ19TRUNUT1JfTU9ERShzZF9jYXJkKSkgewpAQCAtMjY5MCw4ICszMTk1LDEwIEBACiAKIAlzZF9jaG9vc2VfcHJvcGVyX2Nsb2NrKGNoaXApOwogCXJldHZhbCA9IHN3aXRjaF9jbG9jayhjaGlwLCBzZF9jYXJkLT5zZF9jbG9jayk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAkvKiBUZXN0IEJ1cyBQcm9jZWR1cmUgKi8KIAlyZXR2YWwgPSBtbWNfdGVzdF9zd2l0Y2hfYnVzKGNoaXAsIE1NQ184QklUX0JVUyk7CkBAIC0yNzEzLDEwICszMjIwLDEyIEBACiAJCQlDTFJfTU1DXzhCSVQoc2RfY2FyZCk7CiAJCQlDTFJfTU1DXzRCSVQoc2RfY2FyZCk7CiAJCX0gZWxzZSB7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCX0gZWxzZSB7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0yNzI3LDcgKzMyMzYsNyBAQAogewogCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKIAlpbnQgcmV0dmFsLCBpID0gMCwgaiA9IDAsIGsgPSAwOwotCWludCBzd2l0Y2hfZGRyID0gMTsKKwlib29sIHN3aXRjaF9kZHIgPSB0cnVlOwogCXU4IHJzcFsxNl07CiAJdTggc3BlY192ZXIgPSAwOwogCXUzMiB0ZW1wOwpAQCAtMjczOSwyMSArMzI0OCwyNiBAQAogCiBTd2l0Y2hfRmFpbDoKIAlyZXR2YWwgPSBzZF9wcmVwYXJlX3Jlc2V0KGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCByZXR2YWwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlTRVRfTU1DKHNkX2NhcmQpOwogCiBSVFlfTU1DX1JTVDoKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEdPX0lETEVfU1RBVEUsIDAsIFNEX1JTUF9UWVBFX1IwLAogCQkJCU5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJZG8gewogCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgU0RfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX09QX0NPTkQsCkBAIC0yNzY3LDcgKzMyODEsOCBAQAogCQkJCQlzZF9jbHJfZXJyX2NvZGUoY2hpcCk7CiAJCQkJCWdvdG8gUlRZX01NQ19SU1Q7CiAJCQkJfSBlbHNlIHsKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJaisrOwpAQCAtMjc3NSw3ICszMjkwLDggQEAKIAkJCQkJc2RfY2xyX2Vycl9jb2RlKGNoaXApOwogCQkJCQlnb3RvIFJUWV9NTUNfUlNUOwogCQkJCX0gZWxzZSB7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTI3ODQsOCArMzMwMCwxMCBAQAogCQlpKys7CiAJfSB3aGlsZSAoIShyc3BbMV0gJiAweDgwKSAmJiAoaSA8IDI1NSkpOwogCi0JaWYgKGkgPT0gMjU1KQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChpID09IDI1NSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKChyc3BbMV0gJiAweDYwKSA9PSAweDQwKQogCQlTRVRfTU1DX1NFQ1RPUl9NT0RFKHNkX2NhcmQpOwpAQCAtMjc5NCw0MCArMzMxMiw1NCBAQAogCiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBTExfU0VORF9DSUQsIDAsIFNEX1JTUF9UWVBFX1IyLAogCQkJCU5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJc2RfY2FyZC0+c2RfYWRkciA9IDB4MDAxMDAwMDA7CiAJcmV0dmFsID0gc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfUkVMQVRJVkVfQUREUiwgc2RfY2FyZC0+c2RfYWRkciwKIAkJCQlTRF9SU1BfVFlQRV9SNiwgcnNwLCA1KTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNkX2NoZWNrX2NzZChjaGlwLCAxKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXNwZWNfdmVyID0gKHNkX2NhcmQtPnJhd19jc2RbMF0gJiAweDNDKSA+PiAyOwogCiAJcmV0dmFsID0gc2Rfc2VsZWN0X2NhcmQoY2hpcCwgMSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFVF9CTE9DS0xFTiwgMHgyMDAsIFNEX1JTUF9UWVBFX1IxLAogCQkJCU5VTEwsIDApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCiBNTUNfVU5MT0NLX0VOVFJZOgogCXJldHZhbCA9IHNkX3VwZGF0ZV9sb2NrX3N0YXR1cyhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KICNlbmRpZgogCiAJcmV0dmFsID0gc2Rfc2V0X2Nsb2NrX2RpdmlkZXIoY2hpcCwgU0RfQ0xLX0RJVklERV8wKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWNoaXAtPmNhcmRfYnVzX3dpZHRoW2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IDE7CiAKQEAgLTI4MzcsMjkgKzMzNjksMzkgQEAKIAkJCXJldHZhbCA9IG1tY19zd2l0Y2hfdGltaW5nX2J1cyhjaGlwLCBzd2l0Y2hfZGRyKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlyZXR2YWwgPSBzZF9pbml0X3Bvd2VyKGNoaXApOwotCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJfQogCQkJCXNkX2NhcmQtPm1tY19kb250X3N3aXRjaF9idXMgPSAxOwotCQkJCVRSQUNFX0dPVE8oY2hpcCwgU3dpdGNoX0ZhaWwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJZ290byBTd2l0Y2hfRmFpbDsKIAkJCX0KIAkJfQogCi0JCWlmIChDSEtfTU1DX1NFQ1RPUl9NT0RFKHNkX2NhcmQpICYmIChzZF9jYXJkLT5jYXBhY2l0eSA9PSAwKSkKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChDSEtfTU1DX1NFQ1RPUl9NT0RFKHNkX2NhcmQpICYmIChzZF9jYXJkLT5jYXBhY2l0eSA9PSAwKSkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWlmIChzd2l0Y2hfZGRyICYmIENIS19NTUNfRERSNTIoc2RfY2FyZCkpIHsKIAkJCXJldHZhbCA9IHNkX3NldF9pbml0X3BhcmEoY2hpcCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAKIAkJCXJldHZhbCA9IG1tY19kZHJfdHVuaW5nKGNoaXApOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCXJldHZhbCA9IHNkX2luaXRfcG93ZXIoY2hpcCk7Ci0JCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQl9CiAKLQkJCQlzd2l0Y2hfZGRyID0gMDsKLQkJCQlUUkFDRV9HT1RPKGNoaXAsIFN3aXRjaF9GYWlsKTsKKwkJCQlzd2l0Y2hfZGRyID0gZmFsc2U7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlnb3RvIFN3aXRjaF9GYWlsOwogCQkJfQogCiAJCQlyZXR2YWwgPSBzZF93YWl0X3N0YXRlX2RhdGFfcmVhZHkoY2hpcCwgMHgwOCwgMSwgMTAwMCk7CkBAIC0yODY3LDExICszNDA5LDE0IEBACiAJCQkJcmV0dmFsID0gc2RfcmVhZF9sYmEwKGNoaXApOwogCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQkJcmV0dmFsID0gc2RfaW5pdF9wb3dlcihjaGlwKTsKLQkJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQkJCX0KIAotCQkJCQlzd2l0Y2hfZGRyID0gMDsKLQkJCQkJVFJBQ0VfR09UTyhjaGlwLCBTd2l0Y2hfRmFpbCk7CisJCQkJCXN3aXRjaF9kZHIgPSBmYWxzZTsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJZ290byBTd2l0Y2hfRmFpbDsKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTI4NzksOCArMzQyNCwxOCBAQAogCiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCiAJaWYgKHNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICYgU0RfVU5MT0NLX1BPV19PTikgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBSRUdfU0RfQkxPQ0tfQ05UX0gsIDB4RkYsIDB4MDIpOwotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBSRUdfU0RfQkxPQ0tfQ05UX0wsIDB4RkYsIDB4MDApOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9CTE9DS19DTlRfSCwgMHhGRiwKKwkJCQkJICAgICAweDAyKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQkxPQ0tfQ05UX0wsIDB4RkYsCisJCQkJCSAgICAgMHgwMCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfQogI2VuZGlmCiAKQEAgLTI5MDIsNzEgKzM0NTcsMTAzIEBACiAJY2hpcC0+Y2FwYWNpdHlbY2hpcC0+Y2FyZDJsdW5bU0RfQ0FSRF1dID0gMDsKIAogCXJldHZhbCA9IGVuYWJsZV9jYXJkX2Nsb2NrKGNoaXAsIFNEX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKGNoaXAtPmlnbm9yZV9zZCAmJiBDSEtfU0RJT19FWElTVChjaGlwKSAmJgogCQkhQ0hLX1NESU9fSUdOT1JFRChjaGlwKSkgewogCQlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CiAJCQlyZXR2YWwgPSBzZF9wdWxsX2N0bF9lbmFibGUoY2hpcCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIEZQR0FfUFVMTF9DVEwsCiAJCQkJCQlGUEdBX1NEX1BVTExfQ1RMX0JJVCB8IDB4MjAsIDApOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCQl9CiAJCXJldHZhbCA9IGNhcmRfc2hhcmVfbW9kZShjaGlwLCBTRF9DQVJEKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQljaGlwLT5zZF9pbyA9IDE7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR2YWwgPSBzZF9pbml0X3Bvd2VyKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKGNoaXAtPnNkX2N0bCAmIFJFU0VUX01NQ19GSVJTVCkgewogCQlyZXR2YWwgPSByZXNldF9tbWMoY2hpcCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCWlmIChzZF9jaGVja19lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKSkKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHNkX2NoZWNrX2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAKIAkJCXJldHZhbCA9IHJlc2V0X3NkKGNoaXApOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCQl9CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0gcmVzZXRfc2QoY2hpcCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCWlmIChzZF9jaGVja19lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKSkKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHNkX2NoZWNrX2Vycl9jb2RlKGNoaXAsIFNEX05PX0NBUkQpKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAKIAkJCWlmIChjaGlwLT5zZF9pbykgewotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9IGVsc2UgewogCQkJCXJldHZhbCA9IHJlc2V0X21tYyhjaGlwKTsKLQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJCX0KIAkJCX0KIAkJfQogCX0KIAogCXJldHZhbCA9IHNkX3NldF9jbG9ja19kaXZpZGVyKGNoaXAsIFNEX0NMS19ESVZJREVfMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBSRUdfU0RfQllURV9DTlRfTCwgMHhGRiwgMCk7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgUkVHX1NEX0JZVEVfQ05UX0gsIDB4RkYsIDIpOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0JZVEVfQ05UX0wsIDB4RkYsIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSRUdfU0RfQllURV9DTlRfSCwgMHhGRiwgMik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWNoaXAtPmNhcGFjaXR5W2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IHNkX2NhcmQtPmNhcGFjaXR5OwogCiAJcmV0dmFsID0gc2Rfc2V0X2luaXRfcGFyYShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJzZF9jYXJkLT5zZF90eXBlID0gMHgleFxuIiwgc2RfY2FyZC0+c2RfdHlwZSk7CiAKQEAgLTI5OTIsMjkgKzM1NzksNDcgQEAKIAljaGlwLT5jYXBhY2l0eVtjaGlwLT5jYXJkMmx1bltTRF9DQVJEXV0gPSBzZF9jYXJkLT5jYXBhY2l0eSA9IDA7CiAKIAlyZXR2YWwgPSBlbmFibGVfY2FyZF9jbG9jayhjaGlwLCBTRF9DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNkX2luaXRfcG93ZXIoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSByZXNldF9tbWMoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSBzZF9zZXRfY2xvY2tfZGl2aWRlcihjaGlwLCBTRF9DTEtfRElWSURFXzApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgUkVHX1NEX0JZVEVfQ05UX0wsIDB4RkYsIDApOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFJFR19TRF9CWVRFX0NOVF9ILCAweEZGLCAyKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9CWVRFX0NOVF9MLCAweEZGLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQorCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0JZVEVfQ05UX0gsIDB4RkYsIDIpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAljaGlwLT5jYXBhY2l0eVtjaGlwLT5jYXJkMmx1bltTRF9DQVJEXV0gPSBzZF9jYXJkLT5jYXBhY2l0eTsKIAogCXJldHZhbCA9IHNkX3NldF9pbml0X3BhcmEoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiSW4gcmVzZXRfbW1jX29ubHksIHNkX2NhcmQtPnNkX3R5cGUgPSAweCV4XG4iLAogCQlzZF9jYXJkLT5zZF90eXBlKTsKQEAgLTMwMzIsMTUgKzM2MzcsMTggQEAKIAlmb3IgKGkgPSAwOyBpIDwgV0FJVF9EQVRBX1JFQURZX1JUWV9DTlQ7IGkrKykgewogCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgU0RfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9OT19DQVJEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJc2RfY2FyZC0+c2RfZGF0YV9idWZfcmVhZHkgPSAwOwogCiAJCXJldHZhbCA9IHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsCiAJCQkJc2RfY2FyZC0+c2RfYWRkciwgU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWlmIChzZF9jYXJkLT5zZF9kYXRhX2J1Zl9yZWFkeSkgewogCQkJcmV0dXJuIHNkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VORF9TVEFUVVMsCkBAIC0zMDUwLDcgKzM2NTgsOCBAQAogCiAJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX1RPX0VSUik7CiAKLQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCXJ0c3hfdHJhY2UoY2hpcCk7CisJcmV0dXJuIFNUQVRVU19GQUlMOwogfQogCiB2b2lkIHNkX3N0b3Bfc2VxX21vZGUoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKQEAgLTMxMTgsOCArMzcyNywxMCBAQAogCX0KIAogCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTMxNTYsNyArMzc2Nyw4IEBACiAJCQljaGlwLT5jYXJkX2ZhaWwgfD0gU0RfQ0FSRDsKIAkJCWNoaXAtPmNhcGFjaXR5W2NoaXAtPmNhcmQybHVuW1NEX0NBUkRdXSA9IDA7CiAJCQljaGlwLT5yd19uZWVkX3JldHJ5ID0gMTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfQogCkBAIC0zMTcwLDcgKzM3ODIsOCBAQAogCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9JT19FUlIpOwotCQlUUkFDRV9HT1RPKGNoaXAsIFJXX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIFJXX0ZBSUw7CiAJfQogCiAJaWYgKHNkX2NhcmQtPnNlcV9tb2RlICYmCkBAIC0zMTkxLDcgKzM4MDQsOCBAQAogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQljaGlwLT5yd19uZWVkX3JldHJ5ID0gMTsKIAkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9TVFNfRVJSKTsKLQkJCVRSQUNFX0dPVE8oY2hpcCwgUldfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBSV19GQUlMOwogCQl9CiAKIAkJc2RfY2FyZC0+c2VxX21vZGUgPSAwOwpAQCAtMzE5OSw3ICszODEzLDggQEAKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBSQkNUTCwgUkJfRkxVU0gsIFJCX0ZMVVNIKTsKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX0lPX0VSUik7Ci0JCQlUUkFDRV9HT1RPKGNoaXAsIFJXX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gUldfRkFJTDsKIAkJfQogCiAJCWlmICgoc2RfY2FyZC0+cHJlX3NlY19jbnQgPCAweDgwKQpAQCAtMzI5MCwyMSArMzkwNSwyNCBAQAogCiAJCQkJY2hpcC0+cndfbmVlZF9yZXRyeSA9IDE7CiAJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX1RPX0VSUik7Ci0JCQkJVFJBQ0VfR09UTyhjaGlwLCBSV19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCWdvdG8gUldfRkFJTDsKIAkJCX0KIAogCQkJcmV0dmFsID0gd2FpdF9kYXRhX2J1Zl9yZWFkeShjaGlwKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQljaGlwLT5yd19uZWVkX3JldHJ5ID0gMTsKIAkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfVE9fRVJSKTsKLQkJCQlUUkFDRV9HT1RPKGNoaXAsIFJXX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJZ290byBSV19GQUlMOwogCQkJfQogCiAJCQlyZXR2YWwgPSBzZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFdSSVRFX01VTFRJUExFX0JMT0NLLAogCQkJCQlkYXRhX2FkZHIsIFNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQljaGlwLT5yd19uZWVkX3JldHJ5ID0gMTsKLQkJCQlUUkFDRV9HT1RPKGNoaXAsIFJXX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJZ290byBSV19GQUlMOwogCQkJfQogCiAJCQlydHN4X2luaXRfY21kKGNoaXApOwpAQCAtMzM0OCw3ICszOTY2LDggQEAKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQljaGlwLT5yd19uZWVkX3JldHJ5ID0gMDsKIAkJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJObyBjYXJkIGV4aXN0LCBleGl0IHNkX3J3XG4iKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJY2hpcC0+cndfbmVlZF9yZXRyeSA9IDE7CkBAIC0zMzU3LDIxICszOTc2LDI1IEBACiAJCQkJCVNEX1JTUF9UWVBFX1IxYiwgTlVMTCwgMCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9TVFNfRVJSKTsKLQkJCVRSQUNFX0dPVE8oY2hpcCwgUldfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBSV19GQUlMOwogCQl9CiAKIAkJaWYgKHN0YXQgJiAoU0RfQ1JDN19FUlIgfCBTRF9DUkMxNl9FUlIgfCBTRF9DUkNfV1JJVEVfRVJSKSkgewogCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlNEIENSQyBlcnJvciwgdHVuZSBjbG9jayFcbiIpOwogCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX0NSQ19FUlIpOwotCQkJVFJBQ0VfR09UTyhjaGlwLCBSV19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFJXX0ZBSUw7CiAJCX0KIAogCQlpZiAoZXJyID09IFNUQVRVU19USU1FRE9VVCkgewogCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX1RPX0VSUik7Ci0JCQlUUkFDRV9HT1RPKGNoaXAsIFJXX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gUldfRkFJTDsKIAkJfQogCi0JCVRSQUNFX1JFVChjaGlwLCBlcnIpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gZXJyOwogCX0KIAogCXNkX2NhcmQtPnByZV9zZWNfYWRkciA9IHN0YXJ0X3NlY3RvcjsKQEAgLTMzODYsNyArNDAwOSw4IEBACiAJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFNEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCWNoaXAtPnJ3X25lZWRfcmV0cnkgPSAwOwogCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiTm8gY2FyZCBleGlzdCwgZXhpdCBzZF9yd1xuIik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlpZiAoc2RfY2hlY2tfZXJyX2NvZGUoY2hpcCwgU0RfQ1JDX0VSUikpIHsKQEAgLTM0MDcsNyArNDAzMSw4IEBACiAJCX0KIAl9CiAKLQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCXJ0c3hfdHJhY2UoY2hpcCk7CisJcmV0dXJuIFNUQVRVU19GQUlMOwogfQogCiAjaWZkZWYgU1VQUE9SVF9DUFJNCkBAIC0zNDE3LDcgKzQwNDIsNyBAQAogfQogCiBpbnQgZXh0X3NkX3NlbmRfY21kX2dldF9yc3Aoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTggY21kX2lkeCwKLQkJdTMyIGFyZywgdTggcnNwX3R5cGUsIHU4ICpyc3AsIGludCByc3BfbGVuLCBpbnQgc3BlY2lhbF9jaGVjaykKKwkJdTMyIGFyZywgdTggcnNwX3R5cGUsIHU4ICpyc3AsIGludCByc3BfbGVuLCBib29sIHNwZWNpYWxfY2hlY2spCiB7CiAJaW50IHJldHZhbDsKIAlpbnQgdGltZW91dCA9IDEwMDsKQEAgLTM0NzMsMTMgKzQwOTgsMTYgQEAKIAogCQkJaWYgKHJzcF90eXBlICYgU0RfV0FJVF9CVVNZX0VORCkgewogCQkJCXJldHZhbCA9IHNkX2NoZWNrX2RhdGEwX3N0YXR1cyhjaGlwKTsKLQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCQlUUkFDRV9SRVQoY2hpcCwgcmV0dmFsKTsKKwkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiByZXR2YWw7CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfVE9fRVJSKTsKIAkJCX0KIAkJfQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKHJzcF90eXBlID09IFNEX1JTUF9UWVBFX1IwKQpAQCAtMzQ4OSwxNCArNDExNywxNiBAQAogCiAJaWYgKChwdHJbMF0gJiAweEMwKSAhPSAwKSB7CiAJCXNkX3NldF9lcnJfY29kZShjaGlwLCBTRF9TVFNfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmICghKHJzcF90eXBlICYgU0RfTk9fQ0hFQ0tfQ1JDNykpIHsKIAkJaWYgKHB0cltzdGF0X2lkeF0gJiBTRF9DUkM3X0VSUikgewogCQkJaWYgKGNtZF9pZHggPT0gV1JJVEVfTVVMVElQTEVfQkxPQ0spIHsKIAkJCQlzZF9zZXRfZXJyX2NvZGUoY2hpcCwgU0RfQ1JDX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJCWlmIChydHlfY250IDwgU0RfTUFYX1JFVFJZX0NPVU5UKSB7CiAJCQkJd2FpdF90aW1lb3V0KDIwKTsKQEAgLTM1MDQsMTYgKzQxMzQsMTkgQEAKIAkJCQlnb3RvIFJUWV9TRU5EX0NNRDsKIAkJCX0gZWxzZSB7CiAJCQkJc2Rfc2V0X2Vycl9jb2RlKGNoaXAsIFNEX0NSQ19FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCX0KIAl9CiAKIAlpZiAoKGNtZF9pZHggPT0gU0VMRUNUX0NBUkQpIHx8IChjbWRfaWR4ID09IEFQUF9DTUQpIHx8CiAJCShjbWRfaWR4ID09IFNFTkRfU1RBVFVTKSB8fCAoY21kX2lkeCA9PSBTVE9QX1RSQU5TTUlTU0lPTikpIHsKLQkJaWYgKChjbWRfaWR4ICE9IFNUT1BfVFJBTlNNSVNTSU9OKSAmJiAoc3BlY2lhbF9jaGVjayA9PSAwKSkgewotCQkJaWYgKHB0clsxXSAmIDB4ODApCi0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKChjbWRfaWR4ICE9IFNUT1BfVFJBTlNNSVNTSU9OKSAmJiAhc3BlY2lhbF9jaGVjaykgeworCQkJaWYgKHB0clsxXSAmIDB4ODApIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCX0KIAkJfQogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogCQlpZiAocHRyWzFdICYgMHg3RCkKQEAgLTM1MjEsMTkgKzQxNTQsMjYgQEAKIAkJaWYgKHB0clsxXSAmIDB4N0YpCiAjZW5kaWYKIAkJewotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KLQkJaWYgKHB0clsyXSAmIDB4RjgpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocHRyWzJdICYgMHhGOCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWlmIChjbWRfaWR4ID09IFNFTEVDVF9DQVJEKSB7CiAJCQlpZiAocnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjIpIHsKLQkJCQlpZiAoKHB0clszXSAmIDB4MUUpICE9IDB4MDQpCi0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJaWYgKChwdHJbM10gJiAweDFFKSAhPSAweDA0KSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQl9CiAKIAkJCX0gZWxzZSBpZiAocnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjApIHsKLQkJCQlpZiAoKHB0clszXSAmIDB4MUUpICE9IDB4MDMpCi0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJaWYgKChwdHJbM10gJiAweDFFKSAhPSAweDAzKSB7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJCQl9CiAJCQl9CiAJCX0KIAl9CkBAIC0zNTcwLDggKzQyMTAsMTAgQEAKIAlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBSRUdfU0RfQ01ENSwgMHhGRiwgMCk7CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIFNEX0NBUkQsIDEwMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAocnNwKSB7CiAJCWludCBtaW5fbGVuID0gKHJzcF9sZW4gPCBsZW4pID8gcnNwX2xlbiA6IGxlbjsKQEAgLTM2MTcsNyArNDI1OSw4IEBACiAJaWYgKCEoQ0hLX0JJVChjaGlwLT5sdW5fbWMsIGx1bikpKSB7CiAJCVNFVF9CSVQoY2hpcC0+bHVuX21jLCBsdW4pOwogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfQ0hBTkdFKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoKDB4NTMgIT0gc3JiLT5jbW5kWzJdKSB8fCAoMHg0NCAhPSBzcmItPmNtbmRbM10pIHx8CkBAIC0zNjI1LDcgKzQyNjgsOCBAQAogCQkoMHg2MSAhPSBzcmItPmNtbmRbNl0pIHx8ICgweDcyICE9IHNyYi0+Y21uZFs3XSkgfHwKIAkJKDB4NjQgIT0gc3JiLT5jbW5kWzhdKSkgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXN3aXRjaCAoc3JiLT5jbW5kWzFdICYgMHgwRikgewpAQCAtMzYzOSw3ICs0MjgzLDggQEAKIAogCWRlZmF1bHQ6CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJYnVmWzVdID0gKDEgPT0gQ0hLX1NEKHNkX2NhcmQpKSA/ICAweDAxIDogMHgwMjsKQEAgLTM3MDIsMzAgKzQzNDcsMzQgQEAKIAl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKIAlpbnQgcmV0dmFsLCByc3BfbGVuOwogCXU4IGNtZF9pZHgsIHJzcF90eXBlOwotCXU4IHN0YW5kYnkgPSAwLCBhY21kID0gMDsKKwlib29sIHN0YW5kYnkgPSBmYWxzZSwgYWNtZCA9IGZhbHNlOwogCXUzMiBhcmc7CiAKIAlpZiAoIXNkX2NhcmQtPnNkX3Bhc3NfdGhydV9lbikgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwl9CiAKIAlpZiAoc2RfY2FyZC0+cHJlX2NtZF9lcnIpIHsKIAkJc2RfY2FyZC0+cHJlX2NtZF9lcnIgPSAwOwogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfQ0hBTkdFKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAljbWRfaWR4ID0gc3JiLT5jbW5kWzJdICYgMHgzRjsKIAlpZiAoc3JiLT5jbW5kWzFdICYgMHgwMikKLQkJc3RhbmRieSA9IDE7CisJCXN0YW5kYnkgPSB0cnVlOwogCiAJaWYgKHNyYi0+Y21uZFsxXSAmIDB4MDEpCi0JCWFjbWQgPSAxOworCQlhY21kID0gdHJ1ZTsKIAogCWFyZyA9ICgodTMyKXNyYi0+Y21uZFszXSA8PCAyNCkgfCAoKHUzMilzcmItPmNtbmRbNF0gPDwgMTYpIHwKIAkJKCh1MzIpc3JiLT5jbW5kWzVdIDw8IDgpIHwgc3JiLT5jbW5kWzZdOwpAQCAtMzczMyw2NCArNDM4Miw4MyBAQAogCXJldHZhbCA9IGdldF9yc3BfdHlwZShzcmIsICZyc3BfdHlwZSwgJnJzcF9sZW4pOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAJc2RfY2FyZC0+bGFzdF9yc3BfdHlwZSA9IHJzcF90eXBlOwogCiAJcmV0dmFsID0gc2Rfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCX0KIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogCWlmICgoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9MT0NLXzFCSVRfTU9ERSkgPT0gMCkgewogCQlpZiAoQ0hLX01NQ184QklUKHNkX2NhcmQpKSB7CiAJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9DRkcxLCAweDAzLAogCQkJCQkJU0RfQlVTX1dJRFRIXzgpOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJCX0KIAogCQl9IGVsc2UgaWYgKENIS19TRChzZF9jYXJkKSB8fCBDSEtfTU1DXzRCSVQoc2RfY2FyZCkpIHsKIAkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzEsIDB4MDMsCiAJCQkJCQlTRF9CVVNfV0lEVEhfNCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQkJfQogCQl9CiAJfQogI2Vsc2UKIAlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9DRkcxLCAweDAzLCBTRF9CVVNfV0lEVEhfNCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJfQogI2VuZGlmCiAKIAlpZiAoc3RhbmRieSkgewogCQlyZXR2YWwgPSBzZF9zZWxlY3RfY2FyZChjaGlwLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9DbWRfRmFpbGVkKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9DbWRfRmFpbGVkOworCQl9CiAJfQogCiAJaWYgKGFjbWQpIHsKIAkJcmV0dmFsID0gZXh0X3NkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgQVBQX0NNRCwKIAkJCQkJCXNkX2NhcmQtPnNkX2FkZHIsCi0JCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfQ21kX0ZhaWxlZCk7CisJCQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgZmFsc2UpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBjbWRfaWR4LCBhcmcsIHJzcF90eXBlLAotCQkJc2RfY2FyZC0+cnNwLCByc3BfbGVuLCAwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfQ21kX0ZhaWxlZCk7CisJCQlzZF9jYXJkLT5yc3AsIHJzcF9sZW4sIGZhbHNlKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gU0RfRXhlY3V0ZV9DbWRfRmFpbGVkOworCX0KIAogCWlmIChzdGFuZGJ5KSB7CiAJCXJldHZhbCA9IHNkX3NlbGVjdF9jYXJkKGNoaXAsIDEpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX0NtZF9GYWlsZWQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKIAlyZXR2YWwgPSBzZF91cGRhdGVfbG9ja19zdGF0dXMoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX0NtZF9GYWlsZWQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBTRF9FeGVjdXRlX0NtZF9GYWlsZWQ7CisJfQogI2VuZGlmCiAKIAlzY3NpX3NldF9yZXNpZChzcmIsIDApOwpAQCAtMzgwNCw3ICs0NDcyLDggQEAKIAlpZiAoIShjaGlwLT5jYXJkX3JlYWR5ICYgU0RfQ0FSRCkpCiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CiAKLQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIH0KIAogaW50IHNkX2V4ZWN1dGVfcmVhZF9kYXRhKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKQEAgLTM4MTIsMzUgKzQ0ODEsMzkgQEAKIAlzdHJ1Y3Qgc2RfaW5mbyAqc2RfY2FyZCA9ICYoY2hpcC0+c2RfY2FyZCk7CiAJdW5zaWduZWQgaW50IGx1biA9IFNDU0lfTFVOKHNyYik7CiAJaW50IHJldHZhbCwgcnNwX2xlbiwgaTsKLQlpbnQgY21kMTNfY2hlY2tiaXQgPSAwLCByZWFkX2VyciA9IDA7CisJYm9vbCByZWFkX2VyciA9IGZhbHNlLCBjbWQxM19jaGVja2JpdCA9IGZhbHNlOwogCXU4IGNtZF9pZHgsIHJzcF90eXBlLCBidXNfd2lkdGg7Ci0JdTggc2VuZF9jbWQxMiA9IDAsIHN0YW5kYnkgPSAwLCBhY21kID0gMDsKKwlib29sIHN0YW5kYnkgPSBmYWxzZSwgc2VuZF9jbWQxMiA9IGZhbHNlLCBhY21kID0gZmFsc2U7CiAJdTMyIGRhdGFfbGVuOwogCiAJaWYgKCFzZF9jYXJkLT5zZF9wYXNzX3RocnVfZW4pIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlpZiAoc2RfY2FyZC0+cHJlX2NtZF9lcnIpIHsKIAkJc2RfY2FyZC0+cHJlX2NtZF9lcnIgPSAwOwogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfQ0hBTkdFKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlyZXR2YWwgPSBzZF9zd2l0Y2hfY2xvY2soY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJfQogCiAJY21kX2lkeCA9IHNyYi0+Y21uZFsyXSAmIDB4M0Y7CiAJaWYgKHNyYi0+Y21uZFsxXSAmIDB4MDQpCi0JCXNlbmRfY21kMTIgPSAxOworCQlzZW5kX2NtZDEyID0gdHJ1ZTsKIAogCWlmIChzcmItPmNtbmRbMV0gJiAweDAyKQotCQlzdGFuZGJ5ID0gMTsKKwkJc3RhbmRieSA9IHRydWU7CiAKIAlpZiAoc3JiLT5jbW5kWzFdICYgMHgwMSkKLQkJYWNtZCA9IDE7CisJCWFjbWQgPSB0cnVlOwogCiAJZGF0YV9sZW4gPSAoKHUzMilzcmItPmNtbmRbN10gPDwgMTYpIHwgKCh1MzIpc3JiLT5jbW5kWzhdCiAJCQkJCQk8PCA4KSB8IHNyYi0+Y21uZFs5XTsKQEAgLTM4NDgsMTMgKzQ1MjEsMTYgQEAKIAlyZXR2YWwgPSBnZXRfcnNwX3R5cGUoc3JiLCAmcnNwX3R5cGUsICZyc3BfbGVuKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCXNkX2NhcmQtPmxhc3RfcnNwX3R5cGUgPSByc3BfdHlwZTsKIAogCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwl9CiAKICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKIAlpZiAoKHNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICYgU0RfTE9DS18xQklUX01PREUpID09IDApIHsKQEAgLTM4NzQsMjMgKzQ1NTAsMjkgQEAKIAogCWlmIChkYXRhX2xlbiA8IDUxMikgewogCQlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQkxPQ0tMRU4sIGRhdGFfbGVuLAotCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwLCBmYWxzZSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkOworCQl9CiAJfQogCiAJaWYgKHN0YW5kYnkpIHsKIAkJcmV0dmFsID0gc2Rfc2VsZWN0X2NhcmQoY2hpcCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlpZiAoYWNtZCkgewogCQlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBBUFBfQ01ELAogCQkJCQkJc2RfY2FyZC0+c2RfYWRkciwKLQkJCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCQkJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIGZhbHNlKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlpZiAoZGF0YV9sZW4gPD0gNTEyKSB7CkBAIC0zOTA5LDE2ICs0NTkxLDE5IEBACiAJCWNtZFs0XSA9IHNyYi0+Y21uZFs2XTsKIAogCQlidWYgPSBrbWFsbG9jKGRhdGFfbGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGJ1ZiA9PSBOVUxMKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9FUlJPUik7CisJCWlmIChidWYgPT0gTlVMTCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRVJST1I7CisJCX0KIAogCQlyZXR2YWwgPSBzZF9yZWFkX2RhdGEoY2hpcCwgU0RfVE1fTk9STUFMX1JFQUQsIGNtZCwgNSwgYnl0ZV9jbnQsCiAJCQkJICAgICAgIGJsa19jbnQsIGJ1c193aWR0aCwgYnVmLCBkYXRhX2xlbiwgMjAwMCk7CiAJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKLQkJCXJlYWRfZXJyID0gMTsKKwkJCXJlYWRfZXJyID0gdHJ1ZTsKIAkJCWtmcmVlKGJ1Zik7CiAJCQlydHN4X2NsZWFyX3NkX2Vycm9yKGNoaXApOwotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZDsKIAkJfQogCiAJCW1pbl9sZW4gPSBtaW4oZGF0YV9sZW4sIHNjc2lfYnVmZmxlbihzcmIpKTsKQEAgLTM5NjQsNDkgKzQ2NDksNjMgQEAKIAkJCQkJc2NzaV9idWZmbGVuKHNyYiksIHNjc2lfc2dfY291bnQoc3JiKSwKIAkJCQkJRE1BX0ZST01fREVWSUNFLCAxMDAwMCk7CiAJCWlmIChyZXR2YWwgPCAwKSB7Ci0JCQlyZWFkX2VyciA9IDE7CisJCQlyZWFkX2VyciA9IHRydWU7CiAJCQlydHN4X2NsZWFyX3NkX2Vycm9yKGNoaXApOwotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZDsKIAkJfQogCiAJfSBlbHNlIHsKLQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQ7CiAJfQogCiAJcmV0dmFsID0gZXh0X3NkX2dldF9yc3AoY2hpcCwgcnNwX2xlbiwgc2RfY2FyZC0+cnNwLCByc3BfdHlwZSk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkOworCX0KIAogCWlmIChzdGFuZGJ5KSB7CiAJCXJldHZhbCA9IHNkX3NlbGVjdF9jYXJkKGNoaXAsIDEpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkOworCQl9CiAJfQogCiAJaWYgKHNlbmRfY21kMTIpIHsKIAkJcmV0dmFsID0gZXh0X3NkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU1RPUF9UUkFOU01JU1NJT04sCi0JCQkJMCwgU0RfUlNQX1RZUEVfUjFiLCBOVUxMLCAwLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCQkJCTAsIFNEX1JTUF9UWVBFX1IxYiwgTlVMTCwgMCwgZmFsc2UpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZDsKKwkJfQogCX0KIAogCWlmIChkYXRhX2xlbiA8IDUxMikgewogCQlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRVRfQkxPQ0tMRU4sIDB4MjAwLAotCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCQkJCVNEX1JTUF9UWVBFX1IxLCBOVUxMLCAwLCBmYWxzZSk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkOworCQl9CiAKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9CWVRFX0NOVF9ILCAweEZGLCAweDAyKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZDsKKwkJfQogCiAJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU0RfQllURV9DTlRfTCwgMHhGRiwgMHgwMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9SZWFkX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlpZiAoKHNyYi0+Y21uZFsxXSAmIDB4MDIpIHx8IChzcmItPmNtbmRbMV0gJiAweDA0KSkKLQkJY21kMTNfY2hlY2tiaXQgPSAxOworCQljbWQxM19jaGVja2JpdCA9IHRydWU7CiAKIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAJCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIFNFTkRfU1RBVFVTLApAQCAtNDAxNiw4ICs0NzE1LDEwIEBACiAJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQlicmVhazsKIAl9Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1JlYWRfQ21kX0ZhaWxlZCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIFNEX0V4ZWN1dGVfUmVhZF9DbWRfRmFpbGVkOworCX0KIAogCXNjc2lfc2V0X3Jlc2lkKHNyYiwgMCk7CiAJcmV0dXJuIFRSQU5TUE9SVF9HT09EOwpAQCAtNDAzMyw3ICs0NzM0LDggQEAKIAlpZiAoIShjaGlwLT5jYXJkX3JlYWR5ICYgU0RfQ0FSRCkpCiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7CiAKLQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIH0KIAogaW50IHNkX2V4ZWN1dGVfd3JpdGVfZGF0YShzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCkBAIC00MDQxLDkgKzQ3NDMsOSBAQAogCXN0cnVjdCBzZF9pbmZvICpzZF9jYXJkID0gJihjaGlwLT5zZF9jYXJkKTsKIAl1bnNpZ25lZCBpbnQgbHVuID0gU0NTSV9MVU4oc3JiKTsKIAlpbnQgcmV0dmFsLCByc3BfbGVuLCBpOwotCWludCBjbWQxM19jaGVja2JpdCA9IDAsIHdyaXRlX2VyciA9IDA7CisJYm9vbCB3cml0ZV9lcnIgPSBmYWxzZSwgY21kMTNfY2hlY2tiaXQgPSBmYWxzZTsKIAl1OCBjbWRfaWR4LCByc3BfdHlwZTsKLQl1OCBzZW5kX2NtZDEyID0gMCwgc3RhbmRieSA9IDAsIGFjbWQgPSAwOworCWJvb2wgc3RhbmRieSA9IGZhbHNlLCBzZW5kX2NtZDEyID0gZmFsc2UsIGFjbWQgPSBmYWxzZTsKIAl1MzIgZGF0YV9sZW4sIGFyZzsKICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKIAlpbnQgbG9ja19jbWRfZmFpbCA9IDA7CkBAIC00MDUzLDI4ICs0NzU1LDMyIEBACiAKIAlpZiAoIXNkX2NhcmQtPnNkX3Bhc3NfdGhydV9lbikgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmIChzZF9jYXJkLT5wcmVfY21kX2VycikgewogCQlzZF9jYXJkLT5wcmVfY21kX2VyciA9IDA7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9DSEFOR0UpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCXJldHZhbCA9IHNkX3N3aXRjaF9jbG9jayhjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwl9CiAKIAljbWRfaWR4ID0gc3JiLT5jbW5kWzJdICYgMHgzRjsKIAlpZiAoc3JiLT5jbW5kWzFdICYgMHgwNCkKLQkJc2VuZF9jbWQxMiA9IDE7CisJCXNlbmRfY21kMTIgPSB0cnVlOwogCiAJaWYgKHNyYi0+Y21uZFsxXSAmIDB4MDIpCi0JCXN0YW5kYnkgPSAxOworCQlzdGFuZGJ5ID0gdHJ1ZTsKIAogCWlmIChzcmItPmNtbmRbMV0gJiAweDAxKQotCQlhY21kID0gMTsKKwkJYWNtZCA9IHRydWU7CiAKIAlkYXRhX2xlbiA9ICgodTMyKXNyYi0+Y21uZFs3XSA8PCAxNikgfCAoKHUzMilzcmItPmNtbmRbOF0KIAkJCQkJCTw8IDgpIHwgc3JiLT5jbW5kWzldOwpAQCAtNDA5MSw2OCArNDc5Nyw4NyBAQAogCXJldHZhbCA9IGdldF9yc3BfdHlwZShzcmIsICZyc3BfdHlwZSwgJnJzcF9sZW4pOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAJc2RfY2FyZC0+bGFzdF9yc3BfdHlwZSA9IHJzcF90eXBlOwogCiAJcmV0dmFsID0gc2Rfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCX0KIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogCWlmICgoc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJiBTRF9MT0NLXzFCSVRfTU9ERSkgPT0gMCkgewogCQlpZiAoQ0hLX01NQ184QklUKHNkX2NhcmQpKSB7CiAJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9DRkcxLCAweDAzLAogCQkJCQkJU0RfQlVTX1dJRFRIXzgpOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKKwkJCX0KIAogCQl9IGVsc2UgaWYgKENIS19TRChzZF9jYXJkKSB8fCBDSEtfTU1DXzRCSVQoc2RfY2FyZCkpIHsKIAkJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgUkVHX1NEX0NGRzEsIDB4MDMsCiAJCQkJCQlTRF9CVVNfV0lEVEhfNCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOworCQkJfQogCQl9CiAJfQogI2Vsc2UKIAlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFJFR19TRF9DRkcxLCAweDAzLCBTRF9CVVNfV0lEVEhfNCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CisJfQogI2VuZGlmCiAKIAlpZiAoZGF0YV9sZW4gPCA1MTIpIHsKIAkJcmV0dmFsID0gZXh0X3NkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0JMT0NLTEVOLCBkYXRhX2xlbiwKLQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIGZhbHNlKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOworCQl9CiAJfQogCiAJaWYgKHN0YW5kYnkpIHsKIAkJcmV0dmFsID0gc2Rfc2VsZWN0X2NhcmQoY2hpcCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZDsKKwkJfQogCX0KIAogCWlmIChhY21kKSB7CiAJCXJldHZhbCA9IGV4dF9zZF9zZW5kX2NtZF9nZXRfcnNwKGNoaXAsIEFQUF9DTUQsCiAJCQkJCQlzZF9jYXJkLT5zZF9hZGRyLAotCQkJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQkJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIGZhbHNlKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOworCQl9CiAJfQogCiAJcmV0dmFsID0gZXh0X3NkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgY21kX2lkeCwgYXJnLCByc3BfdHlwZSwKLQkJCXNkX2NhcmQtPnJzcCwgcnNwX2xlbiwgMCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQkJc2RfY2FyZC0+cnNwLCByc3BfbGVuLCBmYWxzZSk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZDsKKwl9CiAKIAlpZiAoZGF0YV9sZW4gPD0gNTEyKSB7CiAJCXUxNiBpOwogCQl1OCAqYnVmOwogCiAJCWJ1ZiA9IGttYWxsb2MoZGF0YV9sZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoYnVmID09IE5VTEwpCi0JCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0VSUk9SKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFRSQU5TUE9SVF9FUlJPUjsKKwkJfQogCiAJCXJ0c3hfc3Rvcl9nZXRfeGZlcl9idWYoYnVmLCBkYXRhX2xlbiwgc3JiKTsKIApAQCAtNDE3MCw3ICs0ODk1LDggQEAKIAkJCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMjUwKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlrZnJlZShidWYpOwotCQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOwogCQkJfQogCiAJCQlydHN4X2luaXRfY21kKGNoaXApOwpAQCAtNDE4MSw3ICs0OTA3LDggQEAKIAkJCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMjUwKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlrZnJlZShidWYpOwotCQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOwogCQkJfQogCQl9IGVsc2UgewogCQkJcnRzeF9pbml0X2NtZChjaGlwKTsKQEAgLTQxOTIsNyArNDkxOSw4IEBACiAJCQlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIDAsIDI1MCk7CiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJa2ZyZWUoYnVmKTsKLQkJCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlnb3RvIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZDsKIAkJCX0KIAkJfQogCkBAIC00MjQzLDEzICs0OTcxLDE1IEBACiAJCQkJCURNQV9UT19ERVZJQ0UsIDEwMDAwKTsKIAogCX0gZWxzZSB7Ci0JCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CiAJfQogCiAJaWYgKHJldHZhbCA8IDApIHsKLQkJd3JpdGVfZXJyID0gMTsKKwkJd3JpdGVfZXJyID0gdHJ1ZTsKIAkJcnRzeF9jbGVhcl9zZF9lcnJvcihjaGlwKTsKLQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlnb3RvIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZDsKIAl9CiAKICNpZmRlZiBTVVBQT1JUX1NEX0xPQ0sKQEAgLTQyNzUsMzQgKzUwMDUsNDQgQEAKIAogCWlmIChzdGFuZGJ5KSB7CiAJCXJldHZhbCA9IHNkX3NlbGVjdF9jYXJkKGNoaXAsIDEpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlpZiAoc2VuZF9jbWQxMikgewogCQlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTVE9QX1RSQU5TTUlTU0lPTiwKLQkJCQkwLCBTRF9SU1BfVFlQRV9SMWIsIE5VTEwsIDAsIDApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQkJCTAsIFNEX1JTUF9UWVBFX1IxYiwgTlVMTCwgMCwgZmFsc2UpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CisJCX0KIAl9CiAKIAlpZiAoZGF0YV9sZW4gPCA1MTIpIHsKIAkJcmV0dmFsID0gZXh0X3NkX3NlbmRfY21kX2dldF9yc3AoY2hpcCwgU0VUX0JMT0NLTEVOLCAweDIwMCwKLQkJCQlTRF9SU1BfVFlQRV9SMSwgTlVMTCwgMCwgMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9HT1RPKGNoaXAsIFNEX0V4ZWN1dGVfV3JpdGVfQ21kX0ZhaWxlZCk7CisJCQkJU0RfUlNQX1RZUEVfUjEsIE5VTEwsIDAsIGZhbHNlKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOworCQl9CiAKIAkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9CWVRFX0NOVF9ILCAweEZGLCAweDAyKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOworCQl9CiAKIAkJcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTRF9CWVRFX0NOVF9MLCAweEZGLCAweDAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOworCQl9CiAJfQogCiAJaWYgKChzcmItPmNtbmRbMV0gJiAweDAyKSB8fCAoc3JiLT5jbW5kWzFdICYgMHgwNCkpCi0JCWNtZDEzX2NoZWNrYml0ID0gMTsKKwkJY21kMTNfY2hlY2tiaXQgPSB0cnVlOwogCiAJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogCQlyZXR2YWwgPSBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChjaGlwLCBTRU5EX1NUQVRVUywKQEAgLTQzMTIsOCArNTA1MiwxMCBAQAogCQlpZiAocmV0dmFsID09IFNUQVRVU19TVUNDRVNTKQogCQkJYnJlYWs7CiAJfQotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX0dPVE8oY2hpcCwgU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCWdvdG8gU0RfRXhlY3V0ZV9Xcml0ZV9DbWRfRmFpbGVkOworCX0KIAogI2lmZGVmIFNVUFBPUlRfU0RfTE9DSwogCWlmIChjbWRfaWR4ID09IExPQ0tfVU5MT0NLKSB7CkBAIC00MzM5LDcgKzUwODEsOCBAQAogCQkJCQkJcmV0dmFsID0gcmVzZXRfc2QoY2hpcCk7CiAJCQkJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJCQkJc2RfY2FyZC0+c2RfbG9ja19zdGF0dXMgJj0gfihTRF9VTkxPQ0tfUE9XX09OIHwgU0RfU0RSX1JTVCk7Ci0JCQkJCQkJVFJBQ0VfR09UTyhjaGlwLCBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQpOworCQkJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCQkJZ290byBTRF9FeGVjdXRlX1dyaXRlX0NtZF9GYWlsZWQ7CiAJCQkJCQl9CiAJCQkJCX0KIApAQCAtNDM1Miw3ICs1MDk1LDggQEAKIAlpZiAobG9ja19jbWRfZmFpbCkgewogCQlzY3NpX3NldF9yZXNpZChzcmIsIDApOwogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTk9fU0VOU0UpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KICNlbmRpZiAgLyogU1VQUE9SVF9TRF9MT0NLICovCiAKQEAgLTQzNzAsNyArNTExNCw4IEBACiAJaWYgKCEoY2hpcC0+Y2FyZF9yZWFkeSAmIFNEX0NBUkQpKQogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwogCi0JVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCXJ0c3hfdHJhY2UoY2hpcCk7CisJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiB9CiAKIGludCBzZF9nZXRfY21kX3JzcChzdHJ1Y3Qgc2NzaV9jbW5kICpzcmIsIHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCkBAIC00MzgyLDIwICs1MTI3LDIzIEBACiAKIAlpZiAoIXNkX2NhcmQtPnNkX3Bhc3NfdGhydV9lbikgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmIChzZF9jYXJkLT5wcmVfY21kX2VycikgewogCQlzZF9jYXJkLT5wcmVfY21kX2VyciA9IDA7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9DSEFOR0UpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWRhdGFfbGVuID0gKCh1MTYpc3JiLT5jbW5kWzddIDw8IDgpIHwgc3JiLT5jbW5kWzhdOwogCiAJaWYgKHNkX2NhcmQtPmxhc3RfcnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjApIHsKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9IGVsc2UgaWYgKHNkX2NhcmQtPmxhc3RfcnNwX3R5cGUgPT0gU0RfUlNQX1RZUEVfUjIpIHsKIAkJY291bnQgPSAoZGF0YV9sZW4gPCAxNykgPyBkYXRhX2xlbiA6IDE3OwogCX0gZWxzZSB7CkBAIC00NDIwLDEzICs1MTY4LDE1IEBACiAKIAlpZiAoIXNkX2NhcmQtPnNkX3Bhc3NfdGhydV9lbikgewogCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfSU5WQUxJRF9DTURfRklFTEQpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmIChzZF9jYXJkLT5wcmVfY21kX2VycikgewogCQlzZF9jYXJkLT5wcmVfY21kX2VyciA9IDA7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9DSEFOR0UpOwotCQlUUkFDRV9SRVQoY2hpcCwgVFJBTlNQT1JUX0ZBSUxFRCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCX0KIAogCWlmICgoMHg1MyAhPSBzcmItPmNtbmRbMl0pIHx8ICgweDQ0ICE9IHNyYi0+Y21uZFszXSkgfHwKQEAgLTQ0MzQsNyArNTE4NCw4IEBACiAJCSgweDYxICE9IHNyYi0+Y21uZFs2XSkgfHwgKDB4NzIgIT0gc3JiLT5jbW5kWzddKSB8fAogCQkoMHg2NCAhPSBzcmItPmNtbmRbOF0pKSB7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9JTlZBTElEX0NNRF9GSUVMRCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBUUkFOU1BPUlRfRkFJTEVEKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFRSQU5TUE9SVF9GQUlMRUQ7CiAJfQogCiAJc3dpdGNoIChzcmItPmNtbmRbMV0gJiAweDBGKSB7CkBAIC00NDUwLDcgKzUyMDEsOCBAQAogI2VuZGlmCiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwogCQkJc2RfY2FyZC0+cHJlX2NtZF9lcnIgPSAxOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAjaWZkZWYgU1VQUE9SVF9TRF9MT0NLCiAJCXNkX2NhcmQtPnNkX2xvY2tfc3RhdHVzICY9IH5TRF9TRFJfUlNUOwpAQCAtNDQ2MiwxMyArNTIxNCwxNSBAQAogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwogCQkJc2RfY2FyZC0+cHJlX2NtZF9lcnIgPSAxOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBUUkFOU1BPUlRfRkFJTEVEOwogCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX0lOVkFMSURfQ01EX0ZJRUxEKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFRSQU5TUE9SVF9GQUlMRUQpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gVFJBTlNQT1JUX0ZBSUxFRDsKIAl9CiAKIAlzY3NpX3NldF9yZXNpZChzcmIsIDApOwpAQCAtNDQ5MiwyNiArNTI0Niw0MSBAQAogCWludCByZXR2YWw7CiAKIAlyZXR2YWwgPSBkaXNhYmxlX2NhcmRfY2xvY2soY2hpcCwgU0RfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX09FLCBTRF9PVVRQVVRfRU4sIDApOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9PRSwgU0RfT1VUUFVUX0VOLCAwKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKCFjaGlwLT5mdDJfZmFzdF9tb2RlKSB7CiAJCXJldHZhbCA9IGNhcmRfcG93ZXJfb2ZmKGNoaXAsIFNEX0NBUkQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXdhaXRfdGltZW91dCg1MCk7CiAJfQogCiAJaWYgKGNoaXAtPmFzaWNfY29kZSkgewogCQlyZXR2YWwgPSBzZF9wdWxsX2N0bF9kaXNhYmxlKGNoaXApOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0gZWxzZSB7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIEZQR0FfUFVMTF9DVEwsCi0JCQlGUEdBX1NEX1BVTExfQ1RMX0JJVCB8IDB4MjAsIEZQR0FfU0RfUFVMTF9DVExfQklUKTsKKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBGUEdBX1BVTExfQ1RMLAorCQkJCQkgICAgIEZQR0FfU0RfUFVMTF9DVExfQklUIHwgMHgyMCwKKwkJCQkJICAgICBGUEdBX1NEX1BVTExfQ1RMX0JJVCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtNDUzOCw4ICs1MzA3LDEwIEBACiAJbWVtc2V0KHNkX2NhcmQtPnJhd19zY3IsIDAsIDgpOwogCiAJcmV0dmFsID0gc2RfcG93ZXJfb2ZmX2NhcmQzdjMoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zZC5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvc2QuaAppbmRleCA3MzViMmQwLi42MGI3OTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NkLmgKQEAgLTI4Nyw3ICsyODcsNyBAQAogI2lmZGVmIFNVUFBPUlRfQ1BSTQogaW50IHNvZnRfcmVzZXRfc2RfY2FyZChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwKTsKIGludCBleHRfc2Rfc2VuZF9jbWRfZ2V0X3JzcChzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBjbWRfaWR4LAotCQl1MzIgYXJnLCB1OCByc3BfdHlwZSwgdTggKnJzcCwgaW50IHJzcF9sZW4sIGludCBzcGVjaWFsX2NoZWNrKTsKKwkJdTMyIGFyZywgdTggcnNwX3R5cGUsIHU4ICpyc3AsIGludCByc3BfbGVuLCBib29sIHNwZWNpYWxfY2hlY2spOwogaW50IGV4dF9zZF9nZXRfcnNwKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGludCBsZW4sIHU4ICpyc3AsIHU4IHJzcF90eXBlKTsKIAogaW50IHNkX3Bhc3NfdGhydV9tb2RlKHN0cnVjdCBzY3NpX2NtbmQgKnNyYiwgc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC9zcGkuYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NwaS5jCmluZGV4IDI5ZjRhODAuLmU2N2U3ZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NwaS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3NwaS5jCkBAIC0yNSw5ICsyNSw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KIAogI2luY2x1ZGUgInJ0c3guaCIKLSNpbmNsdWRlICJydHN4X3RyYW5zcG9ydC5oIgotI2luY2x1ZGUgInJ0c3hfc2NzaS5oIgotI2luY2x1ZGUgInJ0c3hfY2FyZC5oIgogI2luY2x1ZGUgInNwaS5oIgogCiBzdGF0aWMgaW5saW5lIHZvaWQgc3BpX3NldF9lcnJfY29kZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCB1OCBlcnJfY29kZSkKQEAgLTM5LDEwICszNiwyMCBAQAogCiBzdGF0aWMgaW50IHNwaV9pbml0KHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7Ci0JUlRTWF9XUklURV9SRUcoY2hpcCwgU1BJX0NPTlRST0wsIDB4RkYsCi0JCUNTX1BPTEFSSVRZX0xPVyB8IERUT19NU0JfRklSU1QgfCBTUElfTUFTVEVSIHwgU1BJX01PREUwIHwKLQkJU1BJX0FVVE8pOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNQSV9UQ1RMLCBFRE9fVElNSU5HX01BU0ssIFNBTVBMRV9ERUxBWV9IQUxGKTsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTUElfQ09OVFJPTCwgMHhGRiwKKwkJCQkgICAgIENTX1BPTEFSSVRZX0xPVyB8IERUT19NU0JfRklSU1QgfCBTUElfTUFTVEVSIHwgU1BJX01PREUwIHwgU1BJX0FVVE8pOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTUElfVENUTCwgRURPX1RJTUlOR19NQVNLLAorCQkJCSAgICAgU0FNUExFX0RFTEFZX0hBTEYpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC01MiwyNSArNTksNTEgQEAKIAlzdHJ1Y3Qgc3BpX2luZm8gKnNwaSA9ICYoY2hpcC0+c3BpKTsKIAlpbnQgcmV0dmFsOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgU1BJX0NMS19ESVZJREVSMSwgMHhGRiwgKHU4KShzcGktPmNsa19kaXYgPj4gOCkpOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNQSV9DTEtfRElWSURFUjAsIDB4RkYsICh1OCkoc3BpLT5jbGtfZGl2KSk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTUElfQ0xLX0RJVklERVIxLCAweEZGLAorCQkJCSAgICAgKHU4KShzcGktPmNsa19kaXYgPj4gOCkpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTUElfQ0xLX0RJVklERVIwLCAweEZGLAorCQkJCSAgICAgKHU4KShzcGktPmNsa19kaXYpKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dmFsID0gc3dpdGNoX2Nsb2NrKGNoaXAsIHNwaS0+c3BpX2Nsb2NrKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNlbGVjdF9jYXJkKGNoaXAsIFNQSV9DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfQ0xLX0VOLCBTUElfQ0xLX0VOLCBTUElfQ0xLX0VOKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX09FLCBTUElfT1VUUFVUX0VOLCBTUElfT1VUUFVUX0VOKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfQ0xLX0VOLCBTUElfQ0xLX0VOLAorCQkJCSAgICAgU1BJX0NMS19FTik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfT0UsIFNQSV9PVVRQVVRfRU4sCisJCQkJICAgICBTUElfT1VUUFVUX0VOKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJd2FpdF90aW1lb3V0KDEwKTsKIAogCXJldHZhbCA9IHNwaV9pbml0KGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtOTEsNyArMTI0LDggQEAKIAlpZiAocmV0dmFsIDwgMCkgewogCQlydHN4X2NsZWFyX3NwaV9lcnJvcihjaGlwKTsKIAkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfQlVTWV9FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMTE5LDcgKzE1Myw4IEBACiAJaWYgKHJldHZhbCA8IDApIHsKIAkJcnRzeF9jbGVhcl9zcGlfZXJyb3IoY2hpcCk7CiAJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX0hXX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xNDcsNyArMTgyLDggQEAKIAlpZiAocmV0dmFsIDwgMCkgewogCQlydHN4X2NsZWFyX3NwaV9lcnJvcihjaGlwKTsKIAkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSFdfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTIwNSw3ICsyNDEsOCBAQAogCWlmIChyZXR2YWwgPCAwKSB7CiAJCXJ0c3hfY2xlYXJfc3BpX2Vycm9yKGNoaXApOwogCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9IV19FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMjIxLDI1ICsyNTgsNTYgQEAKIAllbHNlCiAJCWNsayA9IENMS18zMDsKIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNQSV9DTEtfRElWSURFUjEsIDB4RkYsIDB4MDApOwotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNQSV9DTEtfRElWSURFUjAsIDB4RkYsIDB4MjcpOworCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgU1BJX0NMS19ESVZJREVSMSwgMHhGRiwgMHgwMCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIFNQSV9DTEtfRElWSURFUjAsIDB4RkYsIDB4MjcpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR2YWwgPSBzd2l0Y2hfY2xvY2soY2hpcCwgY2xrKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHNlbGVjdF9jYXJkKGNoaXAsIFNQSV9DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfQ0xLX0VOLCBTUElfQ0xLX0VOLCBTUElfQ0xLX0VOKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX09FLCBTUElfT1VUUFVUX0VOLCBTUElfT1VUUFVUX0VOKTsKKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfQ0xLX0VOLCBTUElfQ0xLX0VOLAorCQkJCSAgICAgU1BJX0NMS19FTik7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfT0UsIFNQSV9PVVRQVVRfRU4sCisJCQkJICAgICBTUElfT1VUUFVUX0VOKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJd2FpdF90aW1lb3V0KDEwKTsKIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIFNQSV9DT05UUk9MLCAweEZGLAotCQlDU19QT0xBUklUWV9ISUdIIHwgU1BJX0VFUFJPTV9BVVRPKTsKLQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBTUElfVENUTCwgRURPX1RJTUlOR19NQVNLLCBTQU1QTEVfREVMQVlfSEFMRik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTUElfQ09OVFJPTCwgMHhGRiwKKwkJCQkgICAgIENTX1BPTEFSSVRZX0hJR0ggfCBTUElfRUVQUk9NX0FVVE8pOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBTUElfVENUTCwgRURPX1RJTUlOR19NQVNLLAorCQkJCSAgICAgU0FNUExFX0RFTEFZX0hBTEYpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0yNTgsOCArMzI2LDEwIEBACiAJCVNQSV9UUkFOU0ZFUjBfRU5EKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMTAwKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMjY5LDEyICszMzksMTYgQEAKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gc3BpX2luaXRfZWVwcm9tKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc3BpX2VlcHJvbV9wcm9ncmFtX2VuYWJsZShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKQEAgLTI4OCwxMCArMzYyLDE2IEBACiAJCVNQSV9UUkFOU0ZFUjBfRU5EKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMTAwKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9HUElPX0RJUiwgMHgwMSwgMHgwMSk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU9fRElSLCAweDAxLCAweDAxKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMzAxLDEyICszODEsMTYgQEAKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gc3BpX2luaXRfZWVwcm9tKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc3BpX2VlcHJvbV9wcm9ncmFtX2VuYWJsZShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKQEAgLTMyMiwxMCArNDA2LDE2IEBACiAJCVNQSV9UUkFOU0ZFUjBfRU5EKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMTAwKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9HUElPX0RJUiwgMHgwMSwgMHgwMSk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU9fRElSLCAweDAxLCAweDAxKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMzM3LDggKzQyNywxMCBAQAogCXU4IGRhdGE7CiAKIAlyZXR2YWwgPSBzcGlfaW5pdF9lZXByb20oY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlydHN4X2luaXRfY21kKGNoaXApOwogCkBAIC0zNTUsMTYgKzQ0NywyNiBAQAogCQlTUElfVFJBTlNGRVIwX0VORCk7CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIDAsIDEwMCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXdhaXRfdGltZW91dCg1KTsKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFNQSV9EQVRBLCAmZGF0YSk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFNQSV9EQVRBLCAmZGF0YSk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWlmICh2YWwpCiAJCSp2YWwgPSBkYXRhOwogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9HUElPX0RJUiwgMHgwMSwgMHgwMSk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU9fRElSLCAweDAxLCAweDAxKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtMzc0LDEyICs0NzYsMTYgQEAKIAlpbnQgcmV0dmFsOwogCiAJcmV0dmFsID0gc3BpX2luaXRfZWVwcm9tKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc3BpX2VlcHJvbV9wcm9ncmFtX2VuYWJsZShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKQEAgLTM5NiwxMCArNTAyLDE2IEBACiAJCVNQSV9UUkFOU0ZFUjBfRU5EKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgMCwgMTAwKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCi0JUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9HUElPX0RJUiwgMHgwMSwgMHgwMSk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0dQSU9fRElSLCAweDAxLCAweDAxKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtNDQ5LDEzICs1NjEsMTUgQEAKIAlsZW4gPSAoKHUxNikoc3JiLT5jbW5kWzddKSA8PCA4KSB8IHNyYi0+Y21uZFs4XTsKIAlpZiAobGVuID4gNTEyKSB7CiAJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX0lOVkFMSURfQ09NTUFORCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR2YWwgPSBzcGlfc2V0X2luaXRfcGFyYShjaGlwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX0hXX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlydHN4X2luaXRfY21kKGNoaXApOwpAQCAtNDk3LDE5ICs2MTEsMjMgQEAKIAlpZiAocmV0dmFsIDwgMCkgewogCQlydHN4X2NsZWFyX3NwaV9lcnJvcihjaGlwKTsKIAkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSFdfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmIChsZW4pIHsKIAkJYnVmID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoIWJ1ZikKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCQlpZiAoIWJ1ZikgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRVJST1I7CisJCX0KIAogCQlyZXR2YWwgPSBydHN4X3JlYWRfcHBidWYoY2hpcCwgYnVmLCBsZW4pOwogCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9SRUFEX0VSUik7CiAJCQlrZnJlZShidWYpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlydHN4X3N0b3Jfc2V0X3hmZXJfYnVmKGJ1Ziwgc2NzaV9idWZmbGVuKHNyYiksIHNyYik7CkBAIC01NDEsMTIgKzY1OSwxNSBAQAogCXJldHZhbCA9IHNwaV9zZXRfaW5pdF9wYXJhKGNoaXApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSFdfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWJ1ZiA9IGttYWxsb2MoU0ZfUEFHRV9MRU4sIEdGUF9LRVJORUwpOwotCWlmIChidWYgPT0gTlVMTCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJaWYgKGJ1ZiA9PSBOVUxMKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRVJST1I7CisJfQogCiAJd2hpbGUgKGxlbikgewogCQl1MTYgcGFnZWxlbiA9IFNGX1BBR0VfTEVOIC0gKHU4KWFkZHI7CkBAIC01OTgsNyArNzE5LDggQEAKIAkJCWtmcmVlKGJ1Zik7CiAJCQlydHN4X2NsZWFyX3NwaV9lcnJvcihjaGlwKTsKIAkJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX0hXX0VSUik7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCXJ0c3hfc3Rvcl9hY2Nlc3NfeGZlcl9idWYoYnVmLCBwYWdlbGVuLCBzcmIsICZpbmRleCwgJm9mZnNldCwKQEAgLTYzNCwxOSArNzU2LDIzIEBACiAJcmV0dmFsID0gc3BpX3NldF9pbml0X3BhcmEoY2hpcCk7CiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9IV19FUlIpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJaWYgKHByb2dyYW1fbW9kZSA9PSBCWVRFX1BST0dSQU0pIHsKIAkJYnVmID0ga21hbGxvYyg0LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFidWYpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0VSUk9SKTsKKwkJaWYgKCFidWYpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0VSUk9SOworCQl9CiAKIAkJd2hpbGUgKGxlbikgewogCQkJcmV0dmFsID0gc2ZfZW5hYmxlX3dyaXRlKGNoaXAsIFNQSV9XUkVOKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlrZnJlZShidWYpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCXJ0c3hfc3Rvcl9hY2Nlc3NfeGZlcl9idWYoYnVmLCAxLCBzcmIsICZpbmRleCwgJm9mZnNldCwKQEAgLTY2NSwxMyArNzkxLDE1IEBACiAJCQkJa2ZyZWUoYnVmKTsKIAkJCQlydHN4X2NsZWFyX3NwaV9lcnJvcihjaGlwKTsKIAkJCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9IV19FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCXJldHZhbCA9IHNmX3BvbGxpbmdfc3RhdHVzKGNoaXAsIDEwMCk7CiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJa2ZyZWUoYnVmKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAJCQlhZGRyKys7CkBAIC02ODQsMTIgKzgxMiwxNiBAQAogCQlpbnQgZmlyc3RfYnl0ZSA9IDE7CiAKIAkJcmV0dmFsID0gc2ZfZW5hYmxlX3dyaXRlKGNoaXAsIFNQSV9XUkVOKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlidWYgPSBrbWFsbG9jKDQsIEdGUF9LRVJORUwpOwotCQlpZiAoIWJ1ZikKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRVJST1IpOworCQlpZiAoIWJ1ZikgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRVJST1I7CisJCX0KIAogCQl3aGlsZSAobGVuKSB7CiAJCQlydHN4X3N0b3JfYWNjZXNzX3hmZXJfYnVmKGJ1ZiwgMSwgc3JiLCAmaW5kZXgsICZvZmZzZXQsCkBAIC03MTMsMTMgKzg0NSwxNSBAQAogCQkJCWtmcmVlKGJ1Zik7CiAJCQkJcnRzeF9jbGVhcl9zcGlfZXJyb3IoY2hpcCk7CiAJCQkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSFdfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAJCQlyZXR2YWwgPSBzZl9wb2xsaW5nX3N0YXR1cyhjaGlwLCAxMDApOwogCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCWtmcmVlKGJ1Zik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAogCQkJbGVuLS07CkBAIC03MjgsMTYgKzg2MiwyMiBAQAogCQlrZnJlZShidWYpOwogCiAJCXJldHZhbCA9IHNmX2Rpc2FibGVfd3JpdGUoY2hpcCwgU1BJX1dSREkpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJldHZhbCA9IHNmX3BvbGxpbmdfc3RhdHVzKGNoaXAsIDEwMCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfSBlbHNlIGlmIChwcm9ncmFtX21vZGUgPT0gUEFHRV9QUk9HUkFNKSB7CiAJCWJ1ZiA9IGttYWxsb2MoU0ZfUEFHRV9MRU4sIEdGUF9LRVJORUwpOwotCQlpZiAoIWJ1ZikKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfTk9NRU0pOworCQlpZiAoIWJ1ZikgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfTk9NRU07CisJCX0KIAogCQl3aGlsZSAobGVuKSB7CiAJCQl1MTYgcGFnZWxlbiA9IFNGX1BBR0VfTEVOIC0gKHU4KWFkZHI7CkBAIC03NDgsNyArODg4LDggQEAKIAkJCXJldHZhbCA9IHNmX2VuYWJsZV93cml0ZShjaGlwLCBTUElfV1JFTik7CiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJa2ZyZWUoYnVmKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCiAJCQlydHN4X2luaXRfY21kKGNoaXApOwpAQCAtNzY3LDEzICs5MDgsMTUgQEAKIAkJCQlrZnJlZShidWYpOwogCQkJCXJ0c3hfY2xlYXJfc3BpX2Vycm9yKGNoaXApOwogCQkJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX0hXX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAogCQkJcmV0dmFsID0gc2ZfcG9sbGluZ19zdGF0dXMoY2hpcCwgMTAwKTsKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlrZnJlZShidWYpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCWFkZHIgKz0gcGFnZWxlbjsKQEAgLTc4Myw3ICs5MjYsOCBAQAogCQlrZnJlZShidWYpOwogCX0gZWxzZSB7CiAJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX0lOVkFMSURfQ09NTUFORCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC04MDUsMjggKzk0OSwzOCBAQAogCXJldHZhbCA9IHNwaV9zZXRfaW5pdF9wYXJhKGNoaXApOwogCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSFdfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCWlmIChlcmFzZV9tb2RlID09IFBBR0VfRVJBU0UpIHsKIAkJcmV0dmFsID0gc2ZfZW5hYmxlX3dyaXRlKGNoaXAsIFNQSV9XUkVOKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQlyZXR2YWwgPSBzZl9lcmFzZShjaGlwLCBpbnMsIDEsIGFkZHIpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0gZWxzZSBpZiAoZXJhc2VfbW9kZSA9PSBDSElQX0VSQVNFKSB7CiAJCXJldHZhbCA9IHNmX2VuYWJsZV93cml0ZShjaGlwLCBTUElfV1JFTik7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJcmV0dmFsID0gc2ZfZXJhc2UoY2hpcCwgaW5zLCAwLCAwKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9IGVsc2UgewogCQlzcGlfc2V0X2Vycl9jb2RlKGNoaXAsIFNQSV9JTlZBTElEX0NPTU1BTkQpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtODQ0LDEyICs5OTgsMTUgQEAKIAlyZXR2YWwgPSBzcGlfc2V0X2luaXRfcGFyYShjaGlwKTsKIAlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCXNwaV9zZXRfZXJyX2NvZGUoY2hpcCwgU1BJX0hXX0VSUik7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR2YWwgPSBzZl9lbmFibGVfd3JpdGUoY2hpcCwgZXdzcik7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlydHN4X2luaXRfY21kKGNoaXApOwogCkBAIC04NzEsNyArMTAyOCw4IEBACiAJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQlydHN4X2NsZWFyX3NwaV9lcnJvcihjaGlwKTsKIAkJc3BpX3NldF9lcnJfY29kZShjaGlwLCBTUElfSFdfRVJSKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3RyYWNlLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC90cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZGRiZGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC90cmFjZS5jCkBAIC0wLDAgKzEsMjYgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworI2luY2x1ZGUgInJ0c3guaCIKKworI2lmZGVmIF9NU0dfVFJBQ0UKKwordm9pZCBfcnRzeF90cmFjZShzdHJ1Y3QgcnRzeF9jaGlwICpjaGlwLCBjb25zdCBjaGFyICpmaWxlLCBjb25zdCBjaGFyICpmdW5jLAorCQkgaW50IGxpbmUpCit7CisJc3RydWN0IHRyYWNlX21zZ190ICptc2cgPSAmY2hpcC0+dHJhY2VfbXNnW2NoaXAtPm1zZ19pZHhdOworCisJZmlsZSA9IGtiYXNlbmFtZShmaWxlKTsKKwlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiWyVzXVslc106WyVkXVxuIiwgZmlsZSwgZnVuYywgbGluZSk7CisKKwlzdHJuY3B5KG1zZy0+ZmlsZSwgZmlsZSwgTVNHX0ZJTEVfTEVOIC0gMSk7CisJc3RybmNweShtc2ctPmZ1bmMsIGZ1bmMsIE1TR19GVU5DX0xFTiAtIDEpOworCW1zZy0+bGluZSA9ICh1MTYpbGluZTsKKwlnZXRfY3VycmVudF90aW1lKG1zZy0+dGltZXZhbF9idWYsIFRJTUVfVkFMX0xFTik7CisJbXNnLT52YWxpZCA9IDE7CisKKwljaGlwLT5tc2dfaWR4Kys7CisJaWYgKGNoaXAtPm1zZ19pZHggPj0gVFJBQ0VfSVRFTV9DTlQpCisJCWNoaXAtPm1zZ19pZHggPSAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC90cmFjZS5oIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgvdHJhY2UuaAppbmRleCBhOWFiNDA3Li41YjgwNzg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC90cmFjZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3RyYWNlLmgKQEAgLTI0LDY0ICsyNCwxNyBAQAogI2lmbmRlZiBfX1JFQUxURUtfUlRTWF9UUkFDRV9ICiAjZGVmaW5lIF9fUkVBTFRFS19SVFNYX1RSQUNFX0gKIAotI2RlZmluZSBfTVNHX1RSQUNFCitzdHJ1Y3QgcnRzeF9jaGlwOwogCiAjaWZkZWYgX01TR19UUkFDRQotc3RhdGljIGlubGluZSBjaGFyICpmaWxlbmFtZShjaGFyICpwYXRoKQotewotCWNoYXIgKnB0cjsKLQotCWlmIChwYXRoID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JcHRyID0gcGF0aDsKLQotCXdoaWxlICgqcHRyICE9ICdcMCcpIHsKLQkJaWYgKCgqcHRyID09ICdcXCcpIHx8ICgqcHRyID09ICcvJykpCi0JCQlwYXRoID0gcHRyICsgMTsKLQotCQlwdHIrKzsKLQl9Ci0KLQlyZXR1cm4gcGF0aDsKLX0KLQotI2RlZmluZSBUUkFDRV9SRVQoY2hpcCwgcmV0KQkJCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWNoYXIgKl9maWxlID0gZmlsZW5hbWUoX19GSUxFX18pOwkJCVwKLQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIlslc11bJXNdOlslZF1cbiIsIF9maWxlLAlcCi0JCQlfX2Z1bmNfXywgX19MSU5FX18pOwkJCQlcCi0JCShjaGlwKS0+dHJhY2VfbXNnWyhjaGlwKS0+bXNnX2lkeF0ubGluZSA9ICh1MTYpKF9fTElORV9fKTsgXAotCQlzdHJuY3B5KChjaGlwKS0+dHJhY2VfbXNnWyhjaGlwKS0+bXNnX2lkeF0uZnVuYywgX19mdW5jX18sIE1TR19GVU5DX0xFTi0xKTsgXAotCQlzdHJuY3B5KChjaGlwKS0+dHJhY2VfbXNnWyhjaGlwKS0+bXNnX2lkeF0uZmlsZSwgX2ZpbGUsIE1TR19GSUxFX0xFTi0xKTsgXAotCQlnZXRfY3VycmVudF90aW1lKChjaGlwKS0+dHJhY2VfbXNnWyhjaGlwKS0+bXNnX2lkeF0udGltZXZhbF9idWYsIFRJTUVfVkFMX0xFTik7CVwKLQkJKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS52YWxpZCA9IDE7CQlcCi0JCShjaGlwKS0+bXNnX2lkeCsrOwkJCQkJXAotCQlpZiAoKGNoaXApLT5tc2dfaWR4ID49IFRSQUNFX0lURU1fQ05UKSB7CQlcCi0JCQkoY2hpcCktPm1zZ19pZHggPSAwOwkJCQlcCi0JCX0JCQkJCQkJXAotCQlyZXR1cm4gcmV0OwkJCQkJCVwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIFRSQUNFX0dPVE8oY2hpcCwgbGFiZWwpCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJY2hhciAqX2ZpbGUgPSBmaWxlbmFtZShfX0ZJTEVfXyk7CQkJXAotCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiWyVzXVslc106WyVkXVxuIiwgX2ZpbGUsCVwKLQkJCV9fZnVuY19fLCBfX0xJTkVfXyk7CQkJCVwKLQkJKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS5saW5lID0gKHUxNikoX19MSU5FX18pOyBcCi0JCXN0cm5jcHkoKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS5mdW5jLCBfX2Z1bmNfXywgTVNHX0ZVTkNfTEVOLTEpOyBcCi0JCXN0cm5jcHkoKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS5maWxlLCBfZmlsZSwgTVNHX0ZJTEVfTEVOLTEpOyBcCi0JCWdldF9jdXJyZW50X3RpbWUoKGNoaXApLT50cmFjZV9tc2dbKGNoaXApLT5tc2dfaWR4XS50aW1ldmFsX2J1ZiwgVElNRV9WQUxfTEVOKTsJXAotCQkoY2hpcCktPnRyYWNlX21zZ1soY2hpcCktPm1zZ19pZHhdLnZhbGlkID0gMTsJCVwKLQkJKGNoaXApLT5tc2dfaWR4Kys7CQkJCQlcCi0JCWlmICgoY2hpcCktPm1zZ19pZHggPj0gVFJBQ0VfSVRFTV9DTlQpIHsJCVwKLQkJCShjaGlwKS0+bXNnX2lkeCA9IDA7CQkJCVwKLQkJfQkJCQkJCQlcCi0JCWdvdG8gbGFiZWw7CQkJCQkJXAotCX0gd2hpbGUgKDApCit2b2lkIF9ydHN4X3RyYWNlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXAsIGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKmZ1bmMsCisJCSBpbnQgbGluZSk7CisjZGVmaW5lIHJ0c3hfdHJhY2UoY2hpcCkJCQkJCQlcCisJX3J0c3hfdHJhY2UoY2hpcCwgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXykKICNlbHNlCi0jZGVmaW5lIFRSQUNFX1JFVChjaGlwLCByZXQpCXJldHVybiByZXQKLSNkZWZpbmUgVFJBQ0VfR09UTyhjaGlwLCBsYWJlbCkJZ290byBsYWJlbAorc3RhdGljIGlubGluZSB2b2lkIHJ0c3hfdHJhY2Uoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCkKK3sKK30KICNlbmRpZgogCiAjZW5kaWYgIC8qIF9fUkVBTFRFS19SVFNYX1RSQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3hkLmMgYi9kcml2ZXJzL3N0YWdpbmcvcnRzNTIwOC94ZC5jCmluZGV4IDBkMDI5ZmUuLjhmZDEwOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHM1MjA4L3hkLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3J0czUyMDgveGQuYwpAQCAtNjAsOCArNjAsMTAgQEAKIAkJeGRfY2FyZC0+eGRfY2xvY2sgPSBDTEtfNTA7CiAKIAlyZXR2YWwgPSBzd2l0Y2hfY2xvY2soY2hpcCwgeGRfY2FyZC0+eGRfY2xvY2spOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwogfQpAQCAtNzIsMTIgKzc0LDE2IEBACiAJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IHNlbGVjdF9jYXJkKGNoaXAsIFhEX0NBUkQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcmV0dmFsID0gc3dpdGNoX2Nsb2NrKGNoaXAsIHhkX2NhcmQtPnhkX2Nsb2NrKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTk5LDggKzEwNSwxMCBAQAogCQlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCAodTE2KShYRF9BRERSRVNTMSArIGkpLCAwLCAwKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgWERfQ0FSRCwgMjApOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlwdHIgPSBydHN4X2dldF9jbWRfZGF0YShjaGlwKSArIDE7CiAJaWYgKGlkX2J1ZiAmJiBidWZfbGVuKSB7CkBAIC0xNjcsOCArMTc1LDEwIEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIFJFQURfUkVHX0NNRCwgWERfUEFSSVRZLCAwLCAwKTsKIAogCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgWERfQ0FSRCwgNTAwKTsKLQlpZiAocmV0dmFsIDwgMCkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJaWYgKGJ1ZiAmJiBidWZfbGVuKSB7CiAJCXU4ICpwdHIgPSBydHN4X2dldF9jbWRfZGF0YShjaGlwKSArIDE7CkBAIC0xODYsOCArMTk2LDEwIEBACiB7CiAJaW50IHJldHZhbCwgaTsKIAotCWlmICghYnVmIHx8IChidWZfbGVuIDwgMCkpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKCFidWYgfHwgKGJ1Zl9sZW4gPCAwKSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtMTk4LDcgKzIxMCw4IEBACiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCAwLCAyNTApOwogCWlmIChyZXR2YWwgPCAwKSB7CiAJCXJ0c3hfY2xlYXJfeGRfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAltZW1jcHkoYnVmLCBydHN4X2dldF9jbWRfZGF0YShjaGlwKSwgYnVmX2xlbik7CkBAIC0yMTIsOCArMjI1LDEwIEBACiAJaW50IHJldHZhbDsKIAl1OCByZWc7CiAKLQlpZiAoIWJ1ZiB8fCAoYnVmX2xlbiA8IDEwKSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoIWJ1ZiB8fCAoYnVmX2xlbiA8IDEwKSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcnRzeF9pbml0X2NtZChjaGlwKTsKIApAQCAtMjMzLDI1ICsyNDgsNDcgQEAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIFhEX0NBUkQsIDI1MCk7CiAJaWYgKHJldHZhbCA9PSAtRVRJTUVET1VUKSB7CiAJCXJ0c3hfY2xlYXJfeGRfZXJyb3IoY2hpcCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFhEX1BBR0VfU1RBVFVTLCAmcmVnKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgWERfUEFHRV9TVEFUVVMsICZyZWcpOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAJaWYgKHJlZyAhPSBYRF9HUEcpIHsKIAkJcnRzeF9jbGVhcl94ZF9lcnJvcihjaGlwKTsKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOwogCX0KIAotCVJUU1hfUkVBRF9SRUcoY2hpcCwgWERfQ1RMLCAmcmVnKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgWERfQ1RMLCAmcmVnKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCWlmICghKHJlZyAmIFhEX0VDQzFfRVJST1IpIHx8ICEocmVnICYgWERfRUNDMV9VTkNPUlJFQ1RBQkxFKSkgewogCQlyZXR2YWwgPSB4ZF9yZWFkX2RhdGFfZnJvbV9wcGIoY2hpcCwgMCwgYnVmLCBidWZfbGVuKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAkJaWYgKHJlZyAmIFhEX0VDQzFfRVJST1IpIHsKIAkJCXU4IGVjY19iaXQsIGVjY19ieXRlOwogCi0JCQlSVFNYX1JFQURfUkVHKGNoaXAsIFhEX0VDQ19CSVQxLCAmZWNjX2JpdCk7Ci0JCQlSVFNYX1JFQURfUkVHKGNoaXAsIFhEX0VDQ19CWVRFMSwgJmVjY19ieXRlKTsKKwkJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBYRF9FQ0NfQklUMSwKKwkJCQkJCSAgICAmZWNjX2JpdCk7CisJCQlpZiAocmV0dmFsKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gcmV0dmFsOworCQkJfQorCQkJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFhEX0VDQ19CWVRFMSwKKwkJCQkJCSAgICAmZWNjX2J5dGUpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KIAogCQkJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIkVDQ19CSVQxID0gMHgleCwgRUNDX0JZVEUxID0gMHgleFxuIiwKIAkJCQllY2NfYml0LCBlY2NfYnl0ZSk7CkBAIC0yNjcsMTMgKzMwNCwyNSBAQAogCQlydHN4X2NsZWFyX3hkX2Vycm9yKGNoaXApOwogCiAJCXJldHZhbCA9IHhkX3JlYWRfZGF0YV9mcm9tX3BwYihjaGlwLCAyNTYsIGJ1ZiwgYnVmX2xlbik7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJCWlmIChyZWcgJiBYRF9FQ0MyX0VSUk9SKSB7CiAJCQl1OCBlY2NfYml0LCBlY2NfYnl0ZTsKIAotCQkJUlRTWF9SRUFEX1JFRyhjaGlwLCBYRF9FQ0NfQklUMiwgJmVjY19iaXQpOwotCQkJUlRTWF9SRUFEX1JFRyhjaGlwLCBYRF9FQ0NfQllURTIsICZlY2NfYnl0ZSk7CisJCQlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgWERfRUNDX0JJVDIsCisJCQkJCQkgICAgJmVjY19iaXQpOworCQkJaWYgKHJldHZhbCkgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIHJldHZhbDsKKwkJCX0KKwkJCXJldHZhbCA9IHJ0c3hfcmVhZF9yZWdpc3RlcihjaGlwLCBYRF9FQ0NfQllURTIsCisJCQkJCQkgICAgJmVjY19ieXRlKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CiAKIAkJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJFQ0NfQklUMiA9IDB4JXgsIEVDQ19CWVRFMiA9IDB4JXhcbiIsCiAJCQkJZWNjX2JpdCwgZWNjX2J5dGUpOwpAQCAtMjg3LDcgKzMzNiw4IEBACiAJCX0KIAl9IGVsc2UgewogCQlydHN4X2NsZWFyX3hkX2Vycm9yKGNoaXApOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMzYzLDI0ICs0MTMsNzEgQEAKIAogc3RhdGljIGludCB4ZF9wdWxsX2N0bF9kaXNhYmxlKHN0cnVjdCBydHN4X2NoaXAgKmNoaXApCiB7CisJaW50IHJldHZhbDsKKwogCWlmIChDSEVDS19QSUQoY2hpcCwgMHg1MjA4KSkgewotCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMSwgMHhGRiwKLQkJCVhEX0QzX1BEIHwgWERfRDJfUEQgfCBYRF9EMV9QRCB8IFhEX0QwX1BEKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDIsIDB4RkYsCi0JCQlYRF9EN19QRCB8IFhEX0Q2X1BEIHwgWERfRDVfUEQgfCBYRF9ENF9QRCk7Ci0JCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfUFVMTF9DVEwzLCAweEZGLAotCQkJWERfV1BfUEQgfCBYRF9DRV9QRCB8IFhEX0NMRV9QRCB8IFhEX0NEX1BVKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDQsIDB4RkYsCi0JCQlYRF9SRFlfUEQgfCBYRF9XRV9QRCB8IFhEX1JFX1BEIHwgWERfQUxFX1BEKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDUsIDB4RkYsCi0JCQlNU19JTlNfUFUgfCBTRF9XUF9QRCB8IFNEX0NEX1BVIHwgU0RfQ01EX1BEKTsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgQ0FSRF9QVUxMX0NUTDYsIDB4RkYsIE1TX0Q1X1BEIHwgTVNfRDRfUEQpOworCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwxLCAweEZGLAorCQkJCQkgICAgIFhEX0QzX1BEIHwgWERfRDJfUEQgfCBYRF9EMV9QRCB8IFhEX0QwX1BEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMMiwgMHhGRiwKKwkJCQkJICAgICBYRF9EN19QRCB8IFhEX0Q2X1BEIHwgWERfRDVfUEQgfCBYRF9ENF9QRCk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgQ0FSRF9QVUxMX0NUTDMsIDB4RkYsCisJCQkJCSAgICAgWERfV1BfUEQgfCBYRF9DRV9QRCB8IFhEX0NMRV9QRCB8IFhEX0NEX1BVKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMNCwgMHhGRiwKKwkJCQkJICAgICBYRF9SRFlfUEQgfCBYRF9XRV9QRCB8IFhEX1JFX1BEIHwgWERfQUxFX1BEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMNSwgMHhGRiwKKwkJCQkJICAgICBNU19JTlNfUFUgfCBTRF9XUF9QRCB8IFNEX0NEX1BVIHwgU0RfQ01EX1BEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwkJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX1BVTExfQ1RMNiwgMHhGRiwKKwkJCQkJICAgICBNU19ENV9QRCB8IE1TX0Q0X1BEKTsKKwkJaWYgKHJldHZhbCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KIAl9IGVsc2UgaWYgKENIRUNLX1BJRChjaGlwLCAweDUyODgpKSB7CiAJCWlmIChDSEVDS19CQVJPX1BLRyhjaGlwLCBRRk4pKSB7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMSwgMHhGRiwgMHg1NSk7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMiwgMHhGRiwgMHg1NSk7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMMywgMHhGRiwgMHg0Qik7Ci0JCQlSVFNYX1dSSVRFX1JFRyhjaGlwLCBDQVJEX1BVTExfQ1RMNCwgMHhGRiwgMHg2OSk7CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwxLAorCQkJCQkJICAgICAweEZGLCAweDU1KTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwyLAorCQkJCQkJICAgICAweEZGLCAweDU1KTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEwzLAorCQkJCQkJICAgICAweEZGLCAweDRCKTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CisJCQlyZXR2YWwgPSBydHN4X3dyaXRlX3JlZ2lzdGVyKGNoaXAsIENBUkRfUFVMTF9DVEw0LAorCQkJCQkJICAgICAweEZGLCAweDY5KTsKKwkJCWlmIChyZXR2YWwpIHsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiByZXR2YWw7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTM5NCw4ICs0OTEsMTAgQEAKIAl1OCAqcHRyLCBpZF9idWZbNF0sIHJlZHVudFsxMV07CiAKIAlyZXR2YWwgPSBzZWxlY3RfY2FyZChjaGlwLCBYRF9DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKQEAgLTQxOCwxMyArNTE3LDE3IEBACiAJcnRzeF9hZGRfY21kKGNoaXAsIFdSSVRFX1JFR19DTUQsIENBUkRfT0UsIFhEX09VVFBVVF9FTiwgMCk7CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIFhEX0NBUkQsIDEwMCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCWlmICghY2hpcC0+ZnQyX2Zhc3RfbW9kZSkgewogCQlyZXR2YWwgPSBjYXJkX3Bvd2VyX29mZihjaGlwLCBYRF9DQVJEKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAogCQl3YWl0X3RpbWVvdXQoMjUwKTsKIApAQCAtNDM5LDE5ICs1NDIsMjQgQEAKIAkJfQogCiAJCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgWERfQ0FSRCwgMTAwKTsKLQkJaWYgKHJldHZhbCA8IDApCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXJldHZhbCA9IGNhcmRfcG93ZXJfb24oY2hpcCwgWERfQ0FSRCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKICNpZmRlZiBTVVBQT1JUX09DUAogCQl3YWl0X3RpbWVvdXQoNTApOwogCQlpZiAoY2hpcC0+b2NwX3N0YXQgJiAoU0RfT0NfTk9XIHwgU0RfT0NfRVZFUikpIHsKIAkJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJPdmVyIGN1cnJlbnQsIE9DUFNUQVQgaXMgMHgleFxuIiwKIAkJCQljaGlwLT5vY3Bfc3RhdCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogI2VuZGlmCiAJfQpAQCAtNDcyLDE1ICs1ODAsMTkgQEAKIAlydHN4X2FkZF9jbWQoY2hpcCwgV1JJVEVfUkVHX0NNRCwgWERfQ1RMLCBYRF9DRV9ESVNFTiwgWERfQ0VfRElTRU4pOwogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCBYRF9DQVJELCAxMDApOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlpZiAoIWNoaXAtPmZ0Ml9mYXN0X21vZGUpCiAJCXdhaXRfdGltZW91dCgyMDApOwogCiAJcmV0dmFsID0geGRfc2V0X2luaXRfcGFyYShjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCS8qIFJlYWQgSUQgdG8gY2hlY2sgaWYgdGhlIHRpbWluZyBzZXR0aW5nIGlzIHJpZ2h0ICovCiAJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewpAQCAtNTAyLDggKzYxNCwxMCBAQAogCQlydHN4X2FkZF9jbWQoY2hpcCwgUkVBRF9SRUdfQ01ELCBYRF9DVEwsIDAsIDApOwogCiAJCXJldHZhbCA9IHJ0c3hfc2VuZF9jbWQoY2hpcCwgWERfQ0FSRCwgMTAwKTsKLQkJaWYgKHJldHZhbCA8IDApCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsIDwgMCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXB0ciA9IHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApICsgMTsKIApAQCAtNTE1LDggKzYyOSwxMCBAQAogCQkJY29udGludWU7CiAKIAkJcmV0dmFsID0geGRfcmVhZF9pZChjaGlwLCBSRUFEX0lELCBpZF9idWYsIDQpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJSRUFEX0lEOiAweCV4IDB4JXggMHgleCAweCV4XG4iLAogCQkJaWRfYnVmWzBdLCBpZF9idWZbMV0sIGlkX2J1ZlsyXSwgaWRfYnVmWzNdKTsKQEAgLTU5Niw4ICs3MTIsMTAgQEAKIAkJLyogQ29uZmlybSB0aW1pbmcgc2V0dGluZyAqLwogCQlmb3IgKGogPSAwOyBqIDwgMTA7IGorKykgewogCQkJcmV0dmFsID0geGRfcmVhZF9pZChjaGlwLCBSRUFEX0lELCBpZF9idWYsIDQpOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCiAJCQlpZiAoaWRfYnVmWzFdICE9IHhkX2NhcmQtPmRldmljZV9jb2RlKQogCQkJCWJyZWFrOwpAQCAtNjEzLDIzICs3MzEsMzAgQEAKIAkJeGRfY2FyZC0+YWRkcl9jeWNsZSA9IDA7CiAJCXhkX2NhcmQtPmNhcGFjaXR5ID0gMDsKIAotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dmFsID0geGRfcmVhZF9pZChjaGlwLCBSRUFEX3hEX0lELCBpZF9idWYsIDQpOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJSRUFEX3hEX0lEOiAweCV4IDB4JXggMHgleCAweCV4XG4iLAogCQlpZF9idWZbMF0sIGlkX2J1ZlsxXSwgaWRfYnVmWzJdLCBpZF9idWZbM10pOwotCWlmIChpZF9idWZbMl0gIT0gWERfSURfQ09ERSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoaWRfYnVmWzJdICE9IFhEX0lEX0NPREUpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCS8qIFNlYXJjaCBDSVMgYmxvY2sgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMjQ7IGkrKykgewogCQl1MzIgcGFnZV9hZGRyOwogCi0JCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCiAJCXBhZ2VfYWRkciA9ICh1MzIpaSA8PCB4ZF9jYXJkLT5ibG9ja19zaGlmdDsKIApAQCAtNjY3LDggKzc5MiwxMCBAQAogCQkJcGFnZV9hZGRyICs9IGo7CiAKIAkJCXJldHZhbCA9IHhkX3JlYWRfY2lzKGNoaXAsIHBhZ2VfYWRkciwgYnVmLCAxMCk7Ci0JCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCQl9CiAKIAkJCWlmICgoYnVmWzBdID09IDB4MDEpICYmIChidWZbMV0gPT0gMHgwMykgJiYKIAkJCQkoYnVmWzJdID09IDB4RDkpCkBAIC02ODQsOCArODExLDEwIEBACiAJfQogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIkNJUyBibG9jazogMHgleFxuIiwgeGRfY2FyZC0+Y2lzX2Jsb2NrKTsKLQlpZiAoeGRfY2FyZC0+Y2lzX2Jsb2NrID09IDB4RkZGRikKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoeGRfY2FyZC0+Y2lzX2Jsb2NrID09IDB4RkZGRikgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJY2hpcC0+Y2FwYWNpdHlbY2hpcC0+Y2FyZDJsdW5bWERfQ0FSRF1dID0geGRfY2FyZC0+Y2FwYWNpdHk7CiAKQEAgLTczOSwxNSArODY4LDE5IEBACiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgInhkX2luaXRfbDJwX3RibDogem9uZV9jbnQgPSAlZFxuIiwKIAkJeGRfY2FyZC0+em9uZV9jbnQpOwogCi0JaWYgKHhkX2NhcmQtPnpvbmVfY250IDwgMSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoeGRfY2FyZC0+em9uZV9jbnQgPCAxKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlzaXplID0geGRfY2FyZC0+em9uZV9jbnQgKiBzaXplb2Yoc3RydWN0IHpvbmVfZW50cnkpOwogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJCdWZmZXIgc2l6ZSBmb3IgbDJwIHRhYmxlIGlzICVkXG4iLCBzaXplKTsKIAogCXhkX2NhcmQtPnpvbmUgPSB2bWFsbG9jKHNpemUpOwotCWlmICgheGRfY2FyZC0+em9uZSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19FUlJPUik7CisJaWYgKCF4ZF9jYXJkLT56b25lKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRVJST1I7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IHhkX2NhcmQtPnpvbmVfY250OyBpKyspIHsKIAkJeGRfY2FyZC0+em9uZVtpXS5idWlsZF9mbGFnID0gMDsKQEAgLTkyNywxNiArMTA2MCwyMiBAQAogCXhkX2NhcmQtPmRlbGF5X3dyaXRlLmRlbGF5X3dyaXRlX2ZsYWcgPSAwOwogCiAJcmV0dmFsID0gZW5hYmxlX2NhcmRfY2xvY2soY2hpcCwgWERfQ0FSRCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR2YWwgPSByZXNldF94ZChjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHZhbCA9IHhkX2luaXRfbDJwX3RibChjaGlwKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIH0KQEAgLTk1MCw4ICsxMDg5LDEwIEBACiAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAibWFyayBibG9jayAweCV4IGFzIGJhZCBibG9ja1xuIiwgcGh5X2Jsayk7CiAKLQlpZiAocGh5X2JsayA9PSBCTEtfTk9UX0ZPVU5EKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChwaHlfYmxrID09IEJMS19OT1RfRk9VTkQpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKQEAgLTk4Niw3ICsxMTI3LDggQEAKIAkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9QUkdfRVJST1IpOwogCQllbHNlCiAJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfVE9fRVJST1IpOwotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMTAwMiwxMCArMTE0NCwxNCBAQAogCiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIkluaXQgYmxvY2sgMHgleFxuIiwgcGh5X2Jsayk7CiAKLQlpZiAoc3RhcnRfcGFnZSA+IGVuZF9wYWdlKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOwotCWlmIChwaHlfYmxrID09IEJMS19OT1RfRk9VTkQpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHN0YXJ0X3BhZ2UgPiBlbmRfcGFnZSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQorCWlmIChwaHlfYmxrID09IEJMS19OT1RfRk9VTkQpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKQEAgLTEwNDAsNyArMTE4Niw4IEBACiAJCX0gZWxzZSB7CiAJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfVE9fRVJST1IpOwogCQl9Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xMDU3LDI0ICsxMjA0LDM0IEBACiAJZGV2X2RiZyhydHN4X2RldihjaGlwKSwgIkNvcHkgcGFnZSBmcm9tIGJsb2NrIDB4JXggdG8gYmxvY2sgMHgleFxuIiwKIAkJb2xkX2JsaywgbmV3X2Jsayk7CiAKLQlpZiAoc3RhcnRfcGFnZSA+IGVuZF9wYWdlKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAotCWlmICgob2xkX2JsayA9PSBCTEtfTk9UX0ZPVU5EKSB8fCAobmV3X2JsayA9PSBCTEtfTk9UX0ZPVU5EKSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoKG9sZF9ibGsgPT0gQkxLX05PVF9GT1VORCkgfHwgKG5ld19ibGsgPT0gQkxLX05PVF9GT1VORCkpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCW9sZF9wYWdlID0gKG9sZF9ibGsgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQpICsgc3RhcnRfcGFnZTsKIAluZXdfcGFnZSA9IChuZXdfYmxrIDw8IHhkX2NhcmQtPmJsb2NrX3NoaWZ0KSArIHN0YXJ0X3BhZ2U7CiAKIAlYRF9DTFJfQkFEX05FV0JMSyh4ZF9jYXJkKTsKIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfREFUQV9TT1VSQ0UsIDB4MDEsIFBJTkdQT05HX0JVRkZFUik7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX0RBVEFfU09VUkNFLCAweDAxLAorCQkJCSAgICAgUElOR1BPTkdfQlVGRkVSKTsKKwlpZiAocmV0dmFsKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiByZXR2YWw7CisJfQogCiAJZm9yIChpID0gc3RhcnRfcGFnZTsgaSA8IGVuZF9wYWdlOyBpKyspIHsKIAkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQlydHN4X2NsZWFyX3hkX2Vycm9yKGNoaXApOwogCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX05PX0NBUkQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlydHN4X2luaXRfY21kKGNoaXApOwpAQCAtMTEwMCw3ICsxMjU3LDggQEAKIAkJCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwKIAkJCQkJWERfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX05PX0NBUkQpOwotCQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQkJfQogCiAJCQkJaWYgKCgocmVnICYgKFhEX0VDQzFfRVJST1IgfCBYRF9FQ0MxX1VOQ09SUkVDVEFCTEUpKSA9PQpAQCAtMTExOSw3ICsxMjc3LDggQEAKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9UT19FUlJPUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCkBAIC0xMTQ3LDcgKzEzMDYsOCBAQAogCQkJfSBlbHNlIHsKIAkJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfVE9fRVJST1IpOwogCQkJfQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlvbGRfcGFnZSsrOwpAQCAtMTE3MiwxNCArMTMzMiwxNyBAQAogCXJ0c3hfYWRkX2NtZChjaGlwLCBSRUFEX1JFR19DTUQsIFhEX0NUTCwgMCwgMCk7CiAKIAlyZXR2YWwgPSBydHN4X3NlbmRfY21kKGNoaXAsIFhEX0NBUkQsIDEwMCk7Ci0JaWYgKHJldHZhbCA8IDApCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXB0ciA9IHJ0c3hfZ2V0X2NtZF9kYXRhKGNoaXApICsgMTsKIAlpZiAoKChwdHJbMF0gJiBSRUFEWV9GTEFHKSA9PSBSRUFEWV9TVEFURSkgJiYgKHB0clsxXSAmIFhEX1JEWSkpCiAJCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIAotCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CiAKIHN0YXRpYyBpbnQgeGRfZXJhc2VfYmxvY2soc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwgdTMyIHBoeV9ibGspCkBAIC0xMTg5LDggKzEzNTIsMTAgQEAKIAl1OCByZWcgPSAwLCAqcHRyOwogCWludCBpLCByZXR2YWw7CiAKLQlpZiAocGh5X2JsayA9PSBCTEtfTk9UX0ZPVU5EKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChwaHlfYmxrID09IEJMS19OT1RfRk9VTkQpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXBhZ2VfYWRkciA9IHBoeV9ibGsgPDwgeGRfY2FyZC0+YmxvY2tfc2hpZnQ7CiAKQEAgLTEyMTIsMTMgKzEzNzcsMTYgQEAKIAkJCWlmIChyZWcgJiBQUk9HUkFNX0VSUk9SKSB7CiAJCQkJeGRfbWFya19iYWRfYmxvY2soY2hpcCwgcGh5X2Jsayk7CiAJCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1BSR19FUlJPUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0gZWxzZSB7CiAJCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX0VSQVNFX0ZBSUwpOwogCQkJfQogCQkJcmV0dmFsID0geGRfcmVzZXRfY21kKGNoaXApOwotCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQkJfQogCQkJY29udGludWU7CiAJCX0KIApAQCAtMTIyNiw3ICsxMzk0LDggQEAKIAkJaWYgKCpwdHIgJiBQUk9HUkFNX0VSUk9SKSB7CiAJCQl4ZF9tYXJrX2JhZF9ibG9jayhjaGlwLCBwaHlfYmxrKTsKIAkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9QUkdfRVJST1IpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xMjM0LDcgKzE0MDMsOCBAQAogCiAJeGRfbWFya19iYWRfYmxvY2soY2hpcCwgcGh5X2Jsayk7CiAJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX0VSQVNFX0ZBSUwpOwotCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CiAKIApAQCAtMTI2NiwxNSArMTQzNiwxOSBAQAogCiAJaWYgKHpvbmUtPmwycF90YWJsZSA9PSBOVUxMKSB7CiAJCXpvbmUtPmwycF90YWJsZSA9IHZtYWxsb2MoMjAwMCk7Ci0JCWlmICh6b25lLT5sMnBfdGFibGUgPT0gTlVMTCkKLQkJCVRSQUNFX0dPVE8oY2hpcCwgQnVpbGRfRmFpbCk7CisJCWlmICh6b25lLT5sMnBfdGFibGUgPT0gTlVMTCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gQnVpbGRfRmFpbDsKKwkJfQogCX0KIAltZW1zZXQoKHU4ICopKHpvbmUtPmwycF90YWJsZSksIDB4ZmYsIDIwMDApOwogCiAJaWYgKHpvbmUtPmZyZWVfdGFibGUgPT0gTlVMTCkgewogCQl6b25lLT5mcmVlX3RhYmxlID0gdm1hbGxvYyhYRF9GUkVFX1RBQkxFX0NOVCAqIDIpOwotCQlpZiAoem9uZS0+ZnJlZV90YWJsZSA9PSBOVUxMKQotCQkJVFJBQ0VfR09UTyhjaGlwLCBCdWlsZF9GYWlsKTsKKwkJaWYgKHpvbmUtPmZyZWVfdGFibGUgPT0gTlVMTCkgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gQnVpbGRfRmFpbDsKKwkJfQogCX0KIAltZW1zZXQoKHU4ICopKHpvbmUtPmZyZWVfdGFibGUpLCAweGZmLCBYRF9GUkVFX1RBQkxFX0NOVCAqIDIpOwogCkBAIC0xNDQwLDggKzE2MTQsMTAgQEAKIAkJWERfVFJBTlNGRVJfRU5ELCBYRF9UUkFOU0ZFUl9FTkQpOwogCiAJcmV0dmFsID0gcnRzeF9zZW5kX2NtZChjaGlwLCBYRF9DQVJELCAyMDApOwotCWlmIChyZXR2YWwgPCAwKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CkBAIC0xNDU3LDggKzE2MzMsMTAgQEAKIAl1OCByZWdfdmFsLCBwYWdlX2NudDsKIAlpbnQgem9uZV9ubywgcmV0dmFsLCBpOwogCi0JaWYgKHN0YXJ0X3BhZ2UgPiBlbmRfcGFnZSkKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAoc3RhcnRfcGFnZSA+IGVuZF9wYWdlKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlwYWdlX2NudCA9IGVuZF9wYWdlIC0gc3RhcnRfcGFnZTsKIAl6b25lX25vID0gKGludCkobG9nX2JsayAvIDEwMDApOwpAQCAtMTQ3NCw3ICsxNjUyLDggQEAKIAogCQkJaWYgKGRldGVjdF9jYXJkX2NkKGNoaXAsIFhEX0NBUkQpICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX05PX0NBUkQpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCX0KIAl9CkBAIC0xNTA5LDIxICsxNjg4LDMxIEBACiAKIAkJaWYgKHJldHZhbCA9PSAtRVRJTUVET1VUKSB7CiAJCQl4ZF9zZXRfZXJyX2NvZGUoY2hpcCwgWERfVE9fRVJST1IpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0gZWxzZSB7Ci0JCQlUUkFDRV9HT1RPKGNoaXAsIEZhaWwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCWdvdG8gRmFpbDsKIAkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKIAogRmFpbDoKLQlSVFNYX1JFQURfUkVHKGNoaXAsIFhEX1BBR0VfU1RBVFVTLCAmcmVnX3ZhbCk7CisJcmV0dmFsID0gcnRzeF9yZWFkX3JlZ2lzdGVyKGNoaXAsIFhEX1BBR0VfU1RBVFVTLCAmcmVnX3ZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWlmIChyZWdfdmFsICE9ICBYRF9HUEcpCiAJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9QUkdfRVJST1IpOwogCi0JUlRTWF9SRUFEX1JFRyhjaGlwLCBYRF9DVEwsICZyZWdfdmFsKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgWERfQ1RMLCAmcmVnX3ZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCWlmICgoKHJlZ192YWwgJiAoWERfRUNDMV9FUlJPUiB8IFhEX0VDQzFfVU5DT1JSRUNUQUJMRSkpCiAJCQkJPT0gKFhEX0VDQzFfRVJST1IgfCBYRF9FQ0MxX1VOQ09SUkVDVEFCTEUpKQpAQCAtMTUzMyw3ICsxNzIyLDggQEAKIAogCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgWERfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCXhkX3NldF9lcnJfY29kZShjaGlwLCBYRF9OT19DQVJEKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX0VDQ19FUlJPUik7CkBAIC0xNTQxLDcgKzE3MzEsOCBAQAogCQluZXdfYmxrID0geGRfZ2V0X3VudXNlZF9ibG9jayhjaGlwLCB6b25lX25vKTsKIAkJaWYgKG5ld19ibGsgPT0gTk9fTkVXX0JMSykgewogCQkJWERfQ0xSX0JBRF9PTERCTEsoeGRfY2FyZCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCXJldHZhbCA9IHhkX2NvcHlfcGFnZShjaGlwLCBwaHlfYmxrLCBuZXdfYmxrLCAwLApAQCAtMTU1NSw3ICsxNzQ2LDggQEAKIAkJCQlYRF9DTFJfQkFEX05FV0JMSyh4ZF9jYXJkKTsKIAkJCX0KIAkJCVhEX0NMUl9CQURfT0xEQkxLKHhkX2NhcmQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAkJeGRfc2V0X2wycF90YmwoY2hpcCwgem9uZV9ubywgbG9nX29mZiwgKHUxNikobmV3X2JsayAmIDB4M0ZGKSk7CiAJCXhkX2VyYXNlX2Jsb2NrKGNoaXAsIHBoeV9ibGspOwpAQCAtMTU2Myw3ICsxNzU1LDggQEAKIAkJWERfQ0xSX0JBRF9PTERCTEsoeGRfY2FyZCk7CiAJfQogCi0JVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlydHN4X3RyYWNlKGNoaXApOworCXJldHVybiBTVEFUVVNfRkFJTDsKIH0KIAogc3RhdGljIGludCB4ZF9maW5pc2hfd3JpdGUoc3RydWN0IHJ0c3hfY2hpcCAqY2hpcCwKQEAgLTE1NzYsOCArMTc2OSwxMCBAQAogCWRldl9kYmcocnRzeF9kZXYoY2hpcCksICJ4ZF9maW5pc2hfd3JpdGUsIG9sZF9ibGsgPSAweCV4LCBuZXdfYmxrID0gMHgleCwgbG9nX2JsayA9IDB4JXhcbiIsCiAJCW9sZF9ibGssIG5ld19ibGssIGxvZ19ibGspOwogCi0JaWYgKHBhZ2Vfb2ZmID4geGRfY2FyZC0+cGFnZV9vZmYpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHBhZ2Vfb2ZmID4geGRfY2FyZC0+cGFnZV9vZmYpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXpvbmVfbm8gPSAoaW50KShsb2dfYmxrIC8gMTAwMCk7CiAJbG9nX29mZiA9ICh1MTYpKGxvZ19ibGsgJSAxMDAwKTsKQEAgLTE1ODksNyArMTc4NCw4IEBACiAJCQlyZXR2YWwgPSB4ZF9lcmFzZV9ibG9jayhjaGlwLCBuZXdfYmxrKTsKIAkJCWlmIChyZXR2YWwgPT0gU1RBVFVTX1NVQ0NFU1MpCiAJCQkJeGRfc2V0X3VudXNlZF9ibG9jayhjaGlwLCBuZXdfYmxrKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAJfSBlbHNlIHsKIAkJcmV0dmFsID0geGRfY29weV9wYWdlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssCkBAIC0xNjAxLDcgKzE3OTcsOCBAQAogCQkJCQl4ZF9zZXRfdW51c2VkX2Jsb2NrKGNoaXAsIG5ld19ibGspOwogCQkJfQogCQkJWERfQ0xSX0JBRF9ORVdCTEsoeGRfY2FyZCk7Ci0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCXJldHZhbCA9IHhkX2VyYXNlX2Jsb2NrKGNoaXAsIG9sZF9ibGspOwpAQCAtMTYzMyw4ICsxODMwLDEwIEBACiAKIAlpZiAocGFnZV9vZmYpIHsKIAkJcmV0dmFsID0geGRfY29weV9wYWdlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssIDAsIHBhZ2Vfb2ZmKTsKLQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJCX0KIAl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CkBAIC0xNjU1LDggKzE4NTQsMTAgQEAKIAlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAiJXMsIG9sZF9ibGsgPSAweCV4LCBuZXdfYmxrID0gMHgleCwgbG9nX2JsayA9IDB4JXhcbiIsCiAJCV9fZnVuY19fLCBvbGRfYmxrLCBuZXdfYmxrLCBsb2dfYmxrKTsKIAotCWlmIChzdGFydF9wYWdlID4gZW5kX3BhZ2UpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHN0YXJ0X3BhZ2UgPiBlbmRfcGFnZSkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAJcGFnZV9jbnQgPSBlbmRfcGFnZSAtIHN0YXJ0X3BhZ2U7CiAJem9uZV9ubyA9IChpbnQpKGxvZ19ibGsgLyAxMDAwKTsKQEAgLTE2NjUsOCArMTg2NiwxMCBAQAogCXBhZ2VfYWRkciA9IChuZXdfYmxrIDw8IHhkX2NhcmQtPmJsb2NrX3NoaWZ0KSArIHN0YXJ0X3BhZ2U7CiAKIAlyZXR2YWwgPSB4ZF9zZW5kX2NtZChjaGlwLCBSRUFEMV8xKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAogCXJ0c3hfaW5pdF9jbWQoY2hpcCk7CiAKQEAgLTE3MDEsOSArMTkwNCwxMSBAQAogCiAJCWlmIChyZXR2YWwgPT0gLUVUSU1FRE9VVCkgewogCQkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1RPX0VSUk9SKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9IGVsc2UgewotCQkJVFJBQ0VfR09UTyhjaGlwLCBGYWlsKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlnb3RvIEZhaWw7CiAJCX0KIAl9CiAKQEAgLTE3MzAsMTMgKzE5MzUsMTggQEAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiAKIEZhaWw6Ci0JUlRTWF9SRUFEX1JFRyhjaGlwLCBYRF9EQVQsICZyZWdfdmFsKTsKKwlyZXR2YWwgPSBydHN4X3JlYWRfcmVnaXN0ZXIoY2hpcCwgWERfREFULCAmcmVnX3ZhbCk7CisJaWYgKHJldHZhbCkgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAlpZiAocmVnX3ZhbCAmIFBST0dSQU1fRVJST1IpIHsKIAkJeGRfc2V0X2Vycl9jb2RlKGNoaXAsIFhEX1BSR19FUlJPUik7CiAJCXhkX21hcmtfYmFkX2Jsb2NrKGNoaXAsIG5ld19ibGspOwogCX0KIAotCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJcnRzeF90cmFjZShjaGlwKTsKKwlyZXR1cm4gU1RBVFVTX0ZBSUw7CiB9CiAKICNpZmRlZiBYRF9ERUxBWV9XUklURQpAQCAtMTc0OSwxNiArMTk1OSwyMCBAQAogCWlmIChkZWxheV93cml0ZS0+ZGVsYXlfd3JpdGVfZmxhZykgewogCQlkZXZfZGJnKHJ0c3hfZGV2KGNoaXApLCAieGRfZGVsYXlfd3JpdGVcbiIpOwogCQlyZXR2YWwgPSB4ZF9zd2l0Y2hfY2xvY2soY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJZGVsYXlfd3JpdGUtPmRlbGF5X3dyaXRlX2ZsYWcgPSAwOwogCQlyZXR2YWwgPSB4ZF9maW5pc2hfd3JpdGUoY2hpcCwKIAkJCQlkZWxheV93cml0ZS0+b2xkX3BoeWJsb2NrLAogCQkJCQlkZWxheV93cml0ZS0+bmV3X3BoeWJsb2NrLAogCQkJCWRlbGF5X3dyaXRlLT5sb2dibG9jaywgZGVsYXlfd3JpdGUtPnBhZ2VvZmYpOwotCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKKwkJfQogCX0KIAogCXJldHVybiBTVEFUVVNfU1VDQ0VTUzsKQEAgLTE3OTAsMTQgKzIwMDQsMTcgQEAKIAlwdHIgPSAodTggKilzY3NpX3NnbGlzdChzcmIpOwogCiAJcmV0dmFsID0geGRfc3dpdGNoX2Nsb2NrKGNoaXApOwotCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgeworCQlydHN4X3RyYWNlKGNoaXApOworCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CisJfQogCiAKIAlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgWERfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJY2hpcC0+Y2FyZF9mYWlsIHw9IFhEX0NBUkQ7CiAJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwgU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKIAl9CiAKIAlsb2dfYmxrID0gc3RhcnRfc2VjdG9yID4+IHhkX2NhcmQtPmJsb2NrX3NoaWZ0OwpAQCAtMTgxMCw3ICsyMDI3LDggQEAKIAkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJY2hpcC0+Y2FyZF9mYWlsIHw9IFhEX0NBUkQ7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKQEAgLTE4MjgsNyArMjA0Niw4IEBACiAJCQkJaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCQl9CiAJCQl9CiAJCQlvbGRfYmxrID0gZGVsYXlfd3JpdGUtPm9sZF9waHlibG9jazsKQEAgLTE4NDQsNyArMjA2Myw4IEBACiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KICNlbmRpZgogCQkJb2xkX2JsayA9IHhkX2dldF9sMnBfdGJsKGNoaXAsIHpvbmVfbm8sIGxvZ19vZmYpOwpAQCAtMTg1Myw3ICsyMDczLDggQEAKIAkJCQkobmV3X2JsayA9PSBCTEtfTk9UX0ZPVU5EKSkgewogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAKIAkJCXJldHZhbCA9IHhkX3ByZXBhcmVfd3JpdGUoY2hpcCwgb2xkX2JsaywgbmV3X2JsaywKQEAgLTE4NjMsMTEgKzIwODQsMTMgQEAKIAkJCQkJU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQkJU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCQl9CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KICNpZmRlZiBYRF9ERUxBWV9XUklURQogCQl9CkBAIC0xODc5LDExICsyMTAyLDEzIEBACiAJCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgWERfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KICNlbmRpZgogCkBAIC0xODkxLDcgKzIxMTYsOCBAQAogCQlpZiAob2xkX2JsayA9PSBCTEtfTk9UX0ZPVU5EKSB7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJU0VOU0VfVFlQRV9NRURJQV9VTlJFQ09WRVJfUkVBRF9FUlIpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAl9CiAKQEAgLTE5MDEsNyArMjEyNyw4IEBACiAJCWlmIChkZXRlY3RfY2FyZF9jZChjaGlwLCBYRF9DQVJEKSAhPSBTVEFUVVNfU1VDQ0VTUykgewogCQkJY2hpcC0+Y2FyZF9mYWlsIHw9IFhEX0NBUkQ7CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCX0KIAogCQlpZiAoKHN0YXJ0X3BhZ2UgKyB0b3RhbF9zZWNfY250KSA+ICh4ZF9jYXJkLT5wYWdlX29mZiArIDEpKQpAQCAtMTkxNyw3ICsyMTQ0LDggQEAKIAkJCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfVU5SRUNPVkVSX1JFQURfRVJSKTsKLQkJCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQkJfQogCQl9IGVsc2UgewogCQkJcmV0dmFsID0geGRfd3JpdGVfbXVsdGlwbGVfcGFnZXMoY2hpcCwgb2xkX2JsaywKQEAgLTE5MjcsNyArMjE1NSw4IEBACiAJCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCkBAIC0xOTQ4LDcgKzIxNzcsOCBAQAogCQkJCWNoaXAtPmNhcmRfZmFpbCB8PSBYRF9DQVJEOwogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9OT1RfUFJFU0VOVCk7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCkBAIC0xOTYxLDcgKzIxOTEsOCBAQAogCQkJCXNldF9zZW5zZV90eXBlKGNoaXAsIGx1biwKIAkJCQkJU0VOU0VfVFlQRV9NRURJQV9XUklURV9FUlIpOwogCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJfQogCiAJCWlmIChzcmItPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKQEAgLTE5NjksNyArMjIwMCw4IEBACiAJCQlpZiAobmV3X2JsayA9PSBCTEtfTk9UX0ZPVU5EKSB7CiAJCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLAogCQkJCQlTRU5TRV9UWVBFX01FRElBX1dSSVRFX0VSUik7Ci0JCQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwkJCQlydHN4X3RyYWNlKGNoaXApOworCQkJCXJldHVybiBTVEFUVVNfRkFJTDsKIAkJCX0KIAkJfQogCkBAIC0xOTg4LDcgKzIyMjAsOCBAQAogCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgWERfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCWNoaXAtPmNhcmRfZmFpbCB8PSBYRF9DQVJEOwogCQkJc2V0X3NlbnNlX3R5cGUoY2hpcCwgbHVuLCBTRU5TRV9UWVBFX01FRElBX05PVF9QUkVTRU5UKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAKIAkJcmV0dmFsID0geGRfZmluaXNoX3dyaXRlKGNoaXAsIG9sZF9ibGssIG5ld19ibGssCkBAIC0xOTk3LDEwICsyMjMwLDEyIEBACiAJCQlpZiAoZGV0ZWN0X2NhcmRfY2QoY2hpcCwgWERfQ0FSRCkgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKIAkJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sCiAJCQkJCVNFTlNFX1RZUEVfTUVESUFfTk9UX1BSRVNFTlQpOwotCQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQkJcnRzeF90cmFjZShjaGlwKTsKKwkJCQlyZXR1cm4gU1RBVFVTX0ZBSUw7CiAJCQl9CiAJCQlzZXRfc2Vuc2VfdHlwZShjaGlwLCBsdW4sIFNFTlNFX1RZUEVfTUVESUFfV1JJVEVfRVJSKTsKLQkJCVRSQUNFX1JFVChjaGlwLCBTVEFUVVNfRkFJTCk7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOwogCQl9CiAjZW5kaWYKIAl9CkBAIC0yMDQ5LDI1ICsyMjg0LDM5IEBACiAJaW50IHJldHZhbDsKIAogCXJldHZhbCA9IGRpc2FibGVfY2FyZF9jbG9jayhjaGlwLCBYRF9DQVJEKTsKLQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKQotCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIFNUQVRVU19GQUlMOworCX0KIAotCVJUU1hfV1JJVEVfUkVHKGNoaXAsIENBUkRfT0UsIFhEX09VVFBVVF9FTiwgMCk7CisJcmV0dmFsID0gcnRzeF93cml0ZV9yZWdpc3RlcihjaGlwLCBDQVJEX09FLCBYRF9PVVRQVVRfRU4sIDApOworCWlmIChyZXR2YWwpIHsKKwkJcnRzeF90cmFjZShjaGlwKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CiAKIAlpZiAoIWNoaXAtPmZ0Ml9mYXN0X21vZGUpIHsKIAkJcmV0dmFsID0gY2FyZF9wb3dlcl9vZmYoY2hpcCwgWERfQ0FSRCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAKIAkJd2FpdF90aW1lb3V0KDUwKTsKIAl9CiAKIAlpZiAoY2hpcC0+YXNpY19jb2RlKSB7CiAJCXJldHZhbCA9IHhkX3B1bGxfY3RsX2Rpc2FibGUoY2hpcCk7Ci0JCWlmIChyZXR2YWwgIT0gU1RBVFVTX1NVQ0NFU1MpCi0JCQlUUkFDRV9SRVQoY2hpcCwgU1RBVFVTX0ZBSUwpOworCQlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCQlydHN4X3RyYWNlKGNoaXApOworCQkJcmV0dXJuIFNUQVRVU19GQUlMOworCQl9CiAJfSBlbHNlIHsKLQkJUlRTWF9XUklURV9SRUcoY2hpcCwgRlBHQV9QVUxMX0NUTCwgMHhGRiwgMHhERik7CisJCXJldHZhbCA9IHJ0c3hfd3JpdGVfcmVnaXN0ZXIoY2hpcCwgRlBHQV9QVUxMX0NUTCwgMHhGRiwgMHhERik7CisJCWlmIChyZXR2YWwpIHsKKwkJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CiAJfQogCiAJcmV0dXJuIFNUQVRVU19TVUNDRVNTOwpAQCAtMjA4Nyw4ICsyMzM2LDEwIEBACiAJeGRfZnJlZV9sMnBfdGJsKGNoaXApOwogCiAJcmV0dmFsID0geGRfcG93ZXJfb2ZmX2NhcmQzdjMoY2hpcCk7Ci0JaWYgKHJldHZhbCAhPSBTVEFUVVNfU1VDQ0VTUykKLQkJVFJBQ0VfUkVUKGNoaXAsIFNUQVRVU19GQUlMKTsKKwlpZiAocmV0dmFsICE9IFNUQVRVU19TVUNDRVNTKSB7CisJCXJ0c3hfdHJhY2UoY2hpcCk7CisJCXJldHVybiBTVEFUVVNfRkFJTDsKKwl9CiAKIAlyZXR1cm4gU1RBVFVTX1NVQ0NFU1M7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc2tlaW4vc2tlaW5fYmxvY2suYyBiL2RyaXZlcnMvc3RhZ2luZy9za2Vpbi9za2Vpbl9ibG9jay5jCmluZGV4IDliZDY5Y2UuLmIwY2Q5MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9za2Vpbi9za2Vpbl9ibG9jay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9za2Vpbi9za2Vpbl9ibG9jay5jCkBAIC02OCw5ICs2OCw3IEBACiAKICNpZiBTS0VJTl9VTlJPTExfMjU2ID09IDAKICNkZWZpbmUgUjI1NihwMCwgcDEsIHAyLCBwMywgUk9ULCByX251bSkgLyogZnVsbHkgdW5yb2xsZWQgKi8gXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JUk9VTkQyNTYocDAsIHAxLCBwMiwgcDMsIFJPVCwgcl9udW0pOyAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKKwlST1VORDI1NihwMCwgcDEsIHAyLCBwMywgUk9ULCByX251bSkKIAogI2RlZmluZSBJMjU2KFIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE1Miw5ICsxNTAsNyBAQAogCiAjaWYgU0tFSU5fVU5ST0xMXzUxMiA9PSAwCiAjZGVmaW5lIFI1MTIocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBST1QsIHJfbnVtKSAvKiB1bnJvbGxlZCAqLyBcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JUk9VTkQ1MTIocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBST1QsIHJfbnVtKTsgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCisJUk9VTkQ1MTIocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBST1QsIHJfbnVtKQogCiAjZGVmaW5lIEk1MTIoUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jIGIvZHJpdmVycy9zdGFnaW5nL3NsaWNvc3Mvc2xpY29zcy5jCmluZGV4IDQyZDYyZWYuLmMyYmRhMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zbGljb3NzL3NsaWNvc3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc2xpY29zcy9zbGljb3NzLmMKQEAgLTg0LDcgKzg0LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogCiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtOTksOCArOTgsNyBAQAogI2luY2x1ZGUgInNsaWMuaCIKIAogc3RhdGljIHVpbnQgc2xpY19maXJzdF9pbml0ID0gMTsKLXN0YXRpYyBjaGFyICpzbGljX2Jhbm5lciA9ICJBbGFjcml0ZWNoIFNMSUMgVGVjaG5vbG9neSh0bSkgU2VydmVyICIKLQkJImFuZCBTdG9yYWdlIEFjY2VsZXJhdG9yIChOb24tQWNjZWxlcmF0ZWQpIjsKK3N0YXRpYyBjaGFyICpzbGljX2Jhbm5lciA9ICJBbGFjcml0ZWNoIFNMSUMgVGVjaG5vbG9neSh0bSkgU2VydmVyIGFuZCBTdG9yYWdlIEFjY2VsZXJhdG9yIChOb24tQWNjZWxlcmF0ZWQpIjsKIAogc3RhdGljIGNoYXIgKnNsaWNfcHJvY192ZXJzaW9uID0gIjIuMC4zNTEgIDIwMDYvMDcvMTQgMTI6MjY6MDAiOwogCkBAIC0xNjYsNyArMTY0LDcgQEAKIAkvKiBHZXQgdGhlIENSQyBwb2x5bm9taWFsIGZvciB0aGUgbWFjIGFkZHJlc3MgKi8KIAkvKiB3ZSB1c2UgYml0cyAxLTggKGxzYiksIGJpdHdpc2UgcmV2ZXJzZWQsCiAJICogbXNiICg9IGxzYiBiaXQgMCBiZWZvcmUgYml0cmV2KSBpcyBhdXRvbWF0aWNhbGx5IGRpc2NhcmRlZCAqLwotCWNyY3BvbHkgPSAoZXRoZXJfY3JjKEVUSF9BTEVOLCBhZGRyZXNzKT4+MjMpOworCWNyY3BvbHkgPSBldGhlcl9jcmMoRVRIX0FMRU4sIGFkZHJlc3MpPj4yMzsKIAogCS8qIFdlIG9ubHkgaGF2ZSBzcGFjZSBvbiB0aGUgU0xJQyBmb3IgNjQgZW50cmllcy4gIExvcAogCSAqIG9mZiB0aGUgdG9wIHR3byBiaXRzLiAoMl42ID0gNjQpCkBAIC0xODUyLDcgKzE4NTAsNyBAQAogCiAJaWhjbWQgPSAmaGNtZC0+Y21kNjQ7CiAKLQlpaGNtZC0+ZmxhZ3MgPSAoYWRhcHRlci0+cG9ydCA8PCBJSEZMR19JRlNIRlQpOworCWloY21kLT5mbGFncyA9IGFkYXB0ZXItPnBvcnQgPDwgSUhGTEdfSUZTSEZUOwogCWloY21kLT5jb21tYW5kID0gSUhDTURfWE1UX1JFUTsKIAlpaGNtZC0+dS5zbGljX2J1ZmZlcnMudG90bGVuID0gc2tiLT5sZW47CiAJcGh5c19hZGRyID0gcGNpX21hcF9zaW5nbGUoYWRhcHRlci0+cGNpZGV2LCBza2ItPmRhdGEsIHNrYi0+bGVuLApAQCAtMTg2NCw4ICsxODYyLDggQEAKIAloY21kLT5jbWRzaXplID0gKHUzMikgKCgoKHU2NCkmaWhjbWQtPnUuc2xpY19idWZmZXJzLmJ1ZnNbMV0gLQogCQkJCSAgICAgKHU2NCkgaGNtZCkgKyAzMSkgPj4gNSk7CiAjZWxzZQotCWhjbWQtPmNtZHNpemUgPSAoKCgodTMyKSAmaWhjbWQtPnUuc2xpY19idWZmZXJzLmJ1ZnNbMV0gLQotCQkJICAgKHUzMikgaGNtZCkgKyAzMSkgPj4gNSk7CisJaGNtZC0+Y21kc2l6ZSA9ICgoKHUzMikmaWhjbWQtPnUuc2xpY19idWZmZXJzLmJ1ZnNbMV0gLQorCQkJCSAgICAgICAodTMyKWhjbWQpICsgMzEpID4+IDU7CiAjZW5kaWYKIH0KIApAQCAtMjMxNSw5ICsyMzEzLDggQEAKIAl9CiAJcmMgPSBzbGljX2FkYXB0ZXJfYWxsb2NyZXNvdXJjZXMoYWRhcHRlcik7CiAJaWYgKHJjKSB7Ci0JCWRldl9lcnIoJmRldi0+ZGV2LAotCQkJIiVzOiBzbGljX2FkYXB0ZXJfYWxsb2NyZXNvdXJjZXMgRkFJTEVEICV4XG4iLAotCQkJX19mdW5jX18sIHJjKTsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJzbGljX2FkYXB0ZXJfYWxsb2NyZXNvdXJjZXMgRkFJTEVEICV4XG4iLAorCQkJcmMpOwogCQlzbGljX2FkYXB0ZXJfZnJlZXJlc291cmNlcyhhZGFwdGVyKTsKIAkJZ290byBlcnI7CiAJfQpAQCAtMjM2MiwyMiArMjM1OSwxOSBAQAogCiAJYWRhcHRlci0+c3RhdGUgPSBBREFQVF9VUDsKIAlpZiAoIWNhcmQtPmxvYWR0aW1lcnNldCkgewotCQlpbml0X3RpbWVyKCZjYXJkLT5sb2FkdGltZXIpOworCQlzZXR1cF90aW1lcigmY2FyZC0+bG9hZHRpbWVyLCAmc2xpY190aW1lcl9sb2FkX2NoZWNrLAorCQkJICAgICh1bG9uZyljYXJkKTsKIAkJY2FyZC0+bG9hZHRpbWVyLmV4cGlyZXMgPQogCQkgICAgamlmZmllcyArIChTTElDX0xPQURUSU1FUl9QRVJJT0QgKiBIWik7Ci0JCWNhcmQtPmxvYWR0aW1lci5kYXRhID0gKHVsb25nKSBjYXJkOwotCQljYXJkLT5sb2FkdGltZXIuZnVuY3Rpb24gPSAmc2xpY190aW1lcl9sb2FkX2NoZWNrOwogCQlhZGRfdGltZXIoJmNhcmQtPmxvYWR0aW1lcik7CiAKIAkJY2FyZC0+bG9hZHRpbWVyc2V0ID0gMTsKIAl9CiAKIAlpZiAoIWFkYXB0ZXItPnBpbmd0aW1lcnNldCkgewotCQlpbml0X3RpbWVyKCZhZGFwdGVyLT5waW5ndGltZXIpOworCQlzZXR1cF90aW1lcigmYWRhcHRlci0+cGluZ3RpbWVyLCAmc2xpY190aW1lcl9waW5nLCAodWxvbmcpZGV2KTsKIAkJYWRhcHRlci0+cGluZ3RpbWVyLmV4cGlyZXMgPQogCQkgICAgamlmZmllcyArIChQSU5HX1RJTUVSX0lOVEVSVkFMICogSFopOwotCQlhZGFwdGVyLT5waW5ndGltZXIuZGF0YSA9ICh1bG9uZykgZGV2OwotCQlhZGFwdGVyLT5waW5ndGltZXIuZnVuY3Rpb24gPSAmc2xpY190aW1lcl9waW5nOwogCQlhZGRfdGltZXIoJmFkYXB0ZXItPnBpbmd0aW1lcik7CiAJCWFkYXB0ZXItPnBpbmd0aW1lcnNldCA9IDE7CiAJCWFkYXB0ZXItPmNhcmQtPnBpbmdzdGF0dXMgPSBJU1JfUElOR01BU0s7CkBAIC0yNTU0LDQ2ICsyNTQ4LDExIEBACiAJCWlmIChjb3B5X2Zyb21fdXNlcihkYXRhLCBycS0+aWZyX2RhdGEsIDI4KSkKIAkJCXJldHVybiAtRUZBVUxUOwogCQlpbnRhZ2cgPSBkYXRhWzBdOwotCQlkZXZfZXJyKCZkZXYtPmRldiwgIiVzOiBzZXQgaW50ZXJydXB0IGFnZ3JlZ2F0aW9uIHRvICVkXG4iLAotCQkJX19mdW5jX18sIGludGFnZyk7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAic2V0IGludGVycnVwdCBhZ2dyZWdhdGlvbiB0byAlZFxuIiwKKwkJCWludGFnZyk7CiAJCXNsaWNfaW50YWdnX3NldChhZGFwdGVyLCBpbnRhZ2cpOwogCQlyZXR1cm4gMDsKIAotI2lmZGVmIFNMSUNfVFJBQ0VfRFVNUF9FTkFCTEVECi0JY2FzZSBTSU9DU0xJQ1RSQUNFRFVNUDoKLQkJewotCQkJdTMyIHZhbHVlOwotCi0JCQlEQkdfSU9DVEwoInNsaWNfaW9jdGwgIFNJT0NTTElDX1RSQUNFX0RVTVBcbiIpOwotCi0JCQlpZiAoY29weV9mcm9tX3VzZXIoZGF0YSwgcnEtPmlmcl9kYXRhLCAyOCkpIHsKLQkJCQlQUklOVF9FUlJPUgotCQkJCSAgICAoInNsaWM6IGNvcHlfZnJvbV91c2VyIEZBSUxFRCBnZXR0aW5nIGluaXRpYWwgc2ltYmEgcGFyYW1cbiIpOwotCQkJCXJldHVybiAtRUZBVUxUOwotCQkJfQotCi0JCQl2YWx1ZSA9IGRhdGFbMF07Ci0JCQlpZiAodHJhY2Vtb25fcmVxdWVzdCA9PSBTTElDX0RVTVBfRE9ORSkgewotCQkJCVBSSU5UX0VSUk9SCi0JCQkJICAgICgiQVRLIERpYWdub3N0aWMgVHJhY2UgRHVtcCBSZXF1ZXN0ZWRcbiIpOwotCQkJCXRyYWNlbW9uX3JlcXVlc3QgPSBTTElDX0RVTVBfUkVRVUVTVEVEOwotCQkJCXRyYWNlbW9uX3JlcXVlc3RfdHlwZSA9IHZhbHVlOwotCQkJCXRyYWNlbW9uX3RpbWVzdGFtcCA9IGppZmZpZXM7Ci0JCQl9IGVsc2UgaWYgKCh0cmFjZW1vbl9yZXF1ZXN0ID09IFNMSUNfRFVNUF9SRVFVRVNURUQpIHx8Ci0JCQkJICAgKHRyYWNlbW9uX3JlcXVlc3QgPT0KLQkJCQkgICAgU0xJQ19EVU1QX0lOX1BST0dSRVNTKSkgewotCQkJCVBSSU5UX0VSUk9SCi0JCQkJICAgICgiQVRLIERpYWdub3N0aWMgVHJhY2UgRHVtcCBSZXF1ZXN0ZWQgYnV0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuLi4gaWdub3JlXG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJUFJJTlRfRVJST1IKLQkJCQkgICAgKCJBVEsgRGlhZ25vc3RpYyBUcmFjZSBEdW1wIFJlcXVlc3RlZFxuIik7Ci0JCQkJdHJhY2Vtb25fcmVxdWVzdCA9IFNMSUNfRFVNUF9SRVFVRVNURUQ7Ci0JCQkJdHJhY2Vtb25fcmVxdWVzdF90eXBlID0gdmFsdWU7Ci0JCQkJdHJhY2Vtb25fdGltZXN0YW1wID0gamlmZmllczsKLQkJCX0KLQkJCXJldHVybiAwOwotCQl9Ci0jZW5kaWYKIAljYXNlIFNJT0NFVEhUT09MOgogCQlpZiAoY29weV9mcm9tX3VzZXIoJmVjbWQsIHJxLT5pZnJfZGF0YSwgc2l6ZW9mKGVjbWQpKSkKIAkJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwZDA4OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL0tjb25maWcKQEAgLTAsMCArMSwxMCBAQAorY29uZmlnIEZCX1NNNzUwCisJdHJpc3RhdGUgIlNpbGljb24gTW90aW9uIFNNNzUwIGZyYW1lYnVmZmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBGQiAmJiBQQ0kKKwloZWxwCisJICBGcmFtZSBidWZmZXIgZHJpdmVyIGZvciB0aGUgU2lsaWNvbiBNb3Rpb24gU003NTAgY2hpcAorCSAgd2l0aCAyRCBhY2NlbGVhcmlvbiBhbmQgZHVhbCBoZWFkIHN1cHBvcnQuCisKKwkgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlLiBUaGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBzbTc1MGZiLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTQorCSAgaGVyZSBhbmQgcmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dD4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjY2UzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK29iai0kKENPTkZJR19GQl9TTTc1MCkJKz0gc203NTBmYi5vCisKK3NtNzUwZmItb2JqcwkJOj0gc203NTAubyBzbTc1MF9ody5vIHNtNzUwX2FjY2VsLm8gc203NTBfY3Vyc29yLm8gZGRrNzUwX2NoaXAubyBkZGs3NTBfcG93ZXIubyBkZGs3NTBfbW9kZS5vCitzbTc1MGZiLW9ianMJCSs9IGRkazc1MF9kaXNwbGF5Lm8gZGRrNzUwX2hlbHAubyBkZGs3NTBfc3dpMmMubyBkZGs3NTBfc2lpMTY0Lm8gZGRrNzUwX2R2aS5vIGRkazc1MF9od2kyYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9UT0RPIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvVE9ETwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzE2MTcyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvVE9ETwpAQCAtMCwwICsxLDE1IEBACitUT0RPOgorLSBsb3RzIG9mIGNsZWNocGF0Y2ggY2xlYW51cAorLSB1c2Uga2VybmVsIGNvZGluZyBzdHlsZQorLSByZWZpbmUgdGhlIGNvZGUgYW5kIHJlbW92ZSB1bnVzZWQgY29kZQorLSBjaGVjayBvbiBoYXJkd2FyZSBlZmZlY3RzIG9mIHJlbW92YWwgb2YgVVNFX0hXX0kyQyBhbmQgVVNFX0RWSUNISVAgKHRoZXNlIHR3bworCWFyZSBzdXBwb3NlZCB0byBiZSBzYW1wbGUgY29kZSB3aGljaCBpcyBnaXZlbiBoZXJlIGlmIHNvbWVvbmUgd2FudHMgdG8KKwl1c2UgdGhvc2UgZnVuY3Rpb25hbGl0aWVzKQorLSBtb3ZlIGl0IHRvIGRyaXZlcnMvdmlkZW8vZmJkZXYKKy0gbW9kaWZ5IHRoZSBjb2RlIGZvciBkcm0gZnJhbWV3b3JrCisKK1BsZWFzZSBzZW5kIGFueSBwYXRjaGVzIHRvCisJR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4KKwlTdWRpcCBNdWtoZXJqZWUgPHN1ZGlwbS5tdWtoZXJqZWVAZ21haWwuY29tPgorCVRlZGR5IFdhbmcgPHRlZGR5LndhbmdAc2lsaWNvbm1vdGlvbi5jb20+CisJU3VkaXAgTXVraGVyamVlIDxzdWRpcEB2ZWN0b3JpbmRpYS5vcmc+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTAuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMTBhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTAuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIERESzc1MF9IX18KKyNkZWZpbmUgRERLNzUwX0hfXworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgYnkgU2lsaWNvbiBNb3Rpb24sIEluYy4gKFNNSSkKKyoKKyogIEFsbCByaWdodHMgYXJlIHJlc2VydmVkLiBSZXByb2R1Y3Rpb24gb3IgaW4gcGFydCBpcyBwcm9oaWJpdGVkCisqICB3aXRob3V0IHRoZSB3cml0dGVuIGNvbnNlbnQgb2YgdGhlIGNvcHlyaWdodCBvd25lci4KKyoKKyogIFJlZ1NDLmggLS0tIFNNNzE4IFNESworKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgdGhlIFN5c3RlbSBDb25maWd1cmF0aW9uIHJlZ2lzdGVycy4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiZGRrNzUwX3JlZy5oIgorI2luY2x1ZGUgImRkazc1MF9tb2RlLmgiCisjaW5jbHVkZSAiZGRrNzUwX2NoaXAuaCIKKyNpbmNsdWRlICJkZGs3NTBfZGlzcGxheS5oIgorI2luY2x1ZGUgImRkazc1MF9wb3dlci5oIgorI2luY2x1ZGUgImRkazc1MF9oZWxwLmgiCisjaWZkZWYgVVNFX0hXX0kyQworI2luY2x1ZGUgImRkazc1MF9od2kyYy5oIgorI2VuZGlmCisjaW5jbHVkZSAiZGRrNzUwX3N3aTJjLmgiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfY2hpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMjgzMjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfY2hpcC5jCkBAIC0wLDAgKzEsNjIyIEBACisjaW5jbHVkZSAiZGRrNzUwX2hlbHAuaCIKKyNpbmNsdWRlICJkZGs3NTBfcmVnLmgiCisjaW5jbHVkZSAiZGRrNzUwX2NoaXAuaCIKKyNpbmNsdWRlICJkZGs3NTBfcG93ZXIuaCIKK3R5cGVkZWYgc3RydWN0IF9wbGxjYWxwYXJhbSB7CisJdW5zaWduZWQgY2hhciBwb3dlcjsvKiBkIDogMH4gNiovCisJdW5zaWduZWQgY2hhciBwb2Q7CisJdW5zaWduZWQgY2hhciBvZDsKKwl1bnNpZ25lZCBjaGFyIHZhbHVlOy8qIHZhbHVlIG9mICAyIHBvd2VyIGQgKDJeZCkgKi8KK30KK3BsbGNhbHBhcmFtOworCisKK2xvZ2ljYWxfY2hpcF90eXBlX3QgZ2V0Q2hpcFR5cGUodm9pZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBwaHlzaWNhbElEOworCWNoYXIgcGh5c2ljYWxSZXY7CisJbG9naWNhbF9jaGlwX3R5cGVfdCBjaGlwOworCisJcGh5c2ljYWxJRCA9IGRldklkNzUwOy8vZWl0aGVyIDB4NzE4IG9yIDB4NzUwCisJcGh5c2ljYWxSZXYgPSByZXZJZDc1MDsKKworCWlmIChwaHlzaWNhbElEID09IDB4NzE4KQorCQljaGlwID0gU003MTg7CisJZWxzZSBpZiAocGh5c2ljYWxJRCA9PSAweDc1MCkgeworCQljaGlwID0gU003NTA7CisJCS8qIFNNNzUwIGFuZCBTTTc1MExFIGFyZSBkaWZmZXJlbnQgaW4gdGhlaXIgcmV2aXNpb24gSUQgb25seS4gKi8KKwkJaWYgKHBoeXNpY2FsUmV2ID09IFNNNzUwTEVfUkVWSVNJT05fSUQpCisJCQljaGlwID0gU003NTBMRTsKKwl9IGVsc2UKKwkJY2hpcCA9IFNNX1VOS05PV047CisKKwlyZXR1cm4gY2hpcDsKK30KKworCitpbmxpbmUgdW5zaWduZWQgaW50IHR3b1RvUG93ZXJPZngodW5zaWduZWQgbG9uZyB4KQoreworCXVuc2lnbmVkIGxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDE7CisKKwlmb3IgKGkgPSAxOyBpIDw9IHg7IGkrKykKKwkJcmVzdWx0ICo9IDI7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW5saW5lIHVuc2lnbmVkIGludCBjYWxjUExMKHBsbF92YWx1ZV90ICpwUExMKQoreworCXJldHVybiAocFBMTC0+aW5wdXRGcmVxICogcFBMTC0+TSAvIHBQTEwtPk4gLyB0d29Ub1Bvd2VyT2Z4KHBQTEwtPk9EKSAvIHR3b1RvUG93ZXJPZngocFBMTC0+UE9EKSk7Cit9CisKK3Vuc2lnbmVkIGludCBnZXRQbGxWYWx1ZShjbG9ja190eXBlX3QgY2xvY2tUeXBlLCBwbGxfdmFsdWVfdCAqcFBMTCkKK3sKKwl1bnNpZ25lZCBpbnQgdWxQbGxSZWcgPSAwOworCisJcFBMTC0+aW5wdXRGcmVxID0gREVGQVVMVF9JTlBVVF9DTE9DSzsKKwlwUExMLT5jbG9ja1R5cGUgPSBjbG9ja1R5cGU7CisKKwlzd2l0Y2ggKGNsb2NrVHlwZSkgeworCWNhc2UgTVhDTEtfUExMOgorCQl1bFBsbFJlZyA9IFBFRUszMihNWENMS19QTExfQ1RSTCk7CisJCWJyZWFrOworCWNhc2UgUFJJTUFSWV9QTEw6CisJCXVsUGxsUmVnID0gUEVFSzMyKFBBTkVMX1BMTF9DVFJMKTsKKwkJYnJlYWs7CisJY2FzZSBTRUNPTkRBUllfUExMOgorCQl1bFBsbFJlZyA9IFBFRUszMihDUlRfUExMX0NUUkwpOworCQlicmVhazsKKwljYXNlIFZHQTBfUExMOgorCQl1bFBsbFJlZyA9IFBFRUszMihWR0FfUExMMF9DVFJMKTsKKwkJYnJlYWs7CisJY2FzZSBWR0ExX1BMTDoKKwkJdWxQbGxSZWcgPSBQRUVLMzIoVkdBX1BMTDFfQ1RSTCk7CisJCWJyZWFrOworCX0KKworCXBQTEwtPk0gPSBGSUVMRF9HRVQodWxQbGxSZWcsIFBBTkVMX1BMTF9DVFJMLCBNKTsKKwlwUExMLT5OID0gRklFTERfR0VUKHVsUGxsUmVnLCBQQU5FTF9QTExfQ1RSTCwgTik7CisJcFBMTC0+T0QgPSBGSUVMRF9HRVQodWxQbGxSZWcsIFBBTkVMX1BMTF9DVFJMLCBPRCk7CisJcFBMTC0+UE9EID0gRklFTERfR0VUKHVsUGxsUmVnLCBQQU5FTF9QTExfQ1RSTCwgUE9EKTsKKworCXJldHVybiBjYWxjUExMKHBQTEwpOworfQorCisKK3Vuc2lnbmVkIGludCBnZXRDaGlwQ2xvY2sodm9pZCkKK3sKKwlwbGxfdmFsdWVfdCBwbGw7CisjaWYgMQorCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJCXJldHVybiBNSHooMTMwKTsKKyNlbmRpZgorCisJcmV0dXJuIGdldFBsbFZhbHVlKE1YQ0xLX1BMTCwgJnBsbCk7Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0IHVwIHRoZSBtYWluIGNoaXAgY2xvY2suCisgKgorICogSW5wdXQ6IEZyZXF1ZW5jeSB0byBiZSBzZXQuCisgKi8KK3ZvaWQgc2V0Q2hpcENsb2NrKHVuc2lnbmVkIGludCBmcmVxdWVuY3kpCit7CisJcGxsX3ZhbHVlX3QgcGxsOworCXVuc2lnbmVkIGludCB1bEFjdHVhbE14Q2xrOworI2lmIDEKKwkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIGNoaXAgY2xvY2sgaXMgZml4ZWQuIE5vdGhpbmcgdG8gc2V0LiAqLworCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJCXJldHVybjsKKyNlbmRpZgorCisJaWYgKGZyZXF1ZW5jeSkgeworCQkvKgorCQkqIFNldCB1cCBQTEwsIGEgc3RydWN0dXJlIHRvIGhvbGQgdGhlIHZhbHVlIHRvIGJlIHNldCBpbiBjbG9ja3MuCisJCSovCisJCXBsbC5pbnB1dEZyZXEgPSBERUZBVUxUX0lOUFVUX0NMT0NLOyAvKiBEZWZpbmVkIGluIENMT0NLLkggKi8KKwkJcGxsLmNsb2NrVHlwZSA9IE1YQ0xLX1BMTDsKKworCQkvKgorCQkqIENhbGwgY2FsY1BsbFZhbHVlKCkgdG8gZmlsbCB1cCB0aGUgb3RoZXIgZmllbGRzIGZvciBQTEwgc3RydWN0dXJlLgorCQkqIFNvbWV0aW1lLCB0aGUgY2hpcCBjYW5ub3Qgc2V0IHVwIHRoZSBleGFjdCBjbG9jayByZXF1aXJlZCBieSBVc2VyLgorCQkqIFJldHVybiB2YWx1ZSBmcm9tIGNhbGNQbGxWYWx1ZSgpIGdpdmVzIHRoZSBhY3R1YWwgcG9zc2libGUgY2xvY2suCisJCSovCisJCXVsQWN0dWFsTXhDbGsgPSBjYWxjUGxsVmFsdWUoZnJlcXVlbmN5LCAmcGxsKTsKKworCQkvKiBNYXN0ZXIgQ2xvY2sgQ29udHJvbDogTVhDTEtfUExMICovCisJCVBPS0UzMihNWENMS19QTExfQ1RSTCwgZm9ybWF0UGxsUmVnKCZwbGwpKTsKKwl9Cit9CisKKworCit2b2lkIHNldE1lbW9yeUNsb2NrKHVuc2lnbmVkIGludCBmcmVxdWVuY3kpCit7CisJdW5zaWduZWQgaW50IHVsUmVnLCBkaXZpc29yOworICNpZiAxCisJLyogQ2hlb2tfMDUwOTogRm9yIFNNNzUwTEUsIHRoZSBtZW1vcnkgY2xvY2sgaXMgZml4ZWQuIE5vdGhpbmcgdG8gc2V0LiAqLworCWlmIChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpCisJCXJldHVybjsKKyNlbmRpZgorCWlmIChmcmVxdWVuY3kpIHsKKwkJLyogU2V0IHRoZSBmcmVxdWVuY3kgdG8gdGhlIG1heGltdW0gZnJlcXVlbmN5IHRoYXQgdGhlIEREUiBNZW1vcnkgY2FuIHRha2UKKwkJd2hpY2ggaXMgMzM2TUh6LiAqLworCQlpZiAoZnJlcXVlbmN5ID4gTUh6KDMzNikpCisJCQlmcmVxdWVuY3kgPSBNSHooMzM2KTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIGRpdmlzb3IgKi8KKwkJZGl2aXNvciA9ICh1bnNpZ25lZCBpbnQpIHJvdW5kZWREaXYoZ2V0Q2hpcENsb2NrKCksIGZyZXF1ZW5jeSk7CisKKwkJLyogU2V0IHRoZSBjb3JyZXNwb25kaW5nIGRpdmlzb3IgaW4gdGhlIHJlZ2lzdGVyLiAqLworCQl1bFJlZyA9IFBFRUszMihDVVJSRU5UX0dBVEUpOworCQlzd2l0Y2ggKGRpdmlzb3IpIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSAxOgorCQkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIENVUlJFTlRfR0FURSwgTTJYQ0xLLCBESVZfMSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIENVUlJFTlRfR0FURSwgTTJYQ0xLLCBESVZfMik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIENVUlJFTlRfR0FURSwgTTJYQ0xLLCBESVZfMyk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIENVUlJFTlRfR0FURSwgTTJYQ0xLLCBESVZfNCk7CisJCQlicmVhazsKKwkJfQorCisJCXNldEN1cnJlbnRHYXRlKHVsUmVnKTsKKwl9Cit9CisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0IHVwIHRoZSBtYXN0ZXIgY2xvY2sgKE1DTEspLgorICoKKyAqIElucHV0OiBGcmVxdWVuY3kgdG8gYmUgc2V0LgorICoKKyAqIE5PVEU6CisgKiAgICAgIFRoZSBtYXhpbXVtIGZyZXF1ZW5jeSB0aGUgZW5naW5lIGNhbiBydW4gaXMgMTY4TUh6LgorICovCit2b2lkIHNldE1hc3RlckNsb2NrKHVuc2lnbmVkIGludCBmcmVxdWVuY3kpCit7CisJdW5zaWduZWQgaW50IHVsUmVnLCBkaXZpc29yOworI2lmIDEKKwkvKiBDaGVva18wNTA5OiBGb3IgU003NTBMRSwgdGhlIG1lbW9yeSBjbG9jayBpcyBmaXhlZC4gTm90aGluZyB0byBzZXQuICovCisJaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwkJcmV0dXJuOworI2VuZGlmCisJaWYgKGZyZXF1ZW5jeSkgeworCQkvKiBTZXQgdGhlIGZyZXF1ZW5jeSB0byB0aGUgbWF4aW11bSBmcmVxdWVuY3kgdGhhdCB0aGUgU003NTAgZW5naW5lIGNhbgorCQlydW4sIHdoaWNoIGlzIGFib3V0IDE5MCBNSHouICovCisJCWlmIChmcmVxdWVuY3kgPiBNSHooMTkwKSkKKwkJCWZyZXF1ZW5jeSA9IE1IeigxOTApOworCisJCS8qIENhbGN1bGF0ZSB0aGUgZGl2aXNvciAqLworCQlkaXZpc29yID0gKHVuc2lnbmVkIGludCkgcm91bmRlZERpdihnZXRDaGlwQ2xvY2soKSwgZnJlcXVlbmN5KTsKKworCQkvKiBTZXQgdGhlIGNvcnJlc3BvbmRpbmcgZGl2aXNvciBpbiB0aGUgcmVnaXN0ZXIuICovCisJCXVsUmVnID0gUEVFSzMyKENVUlJFTlRfR0FURSk7CisJCXN3aXRjaCAoZGl2aXNvcikgeworCQlkZWZhdWx0OgorCQljYXNlIDM6CisJCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgQ1VSUkVOVF9HQVRFLCBNQ0xLLCBESVZfMyk7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIENVUlJFTlRfR0FURSwgTUNMSywgRElWXzQpOworCQkJYnJlYWs7CisJCWNhc2UgNjoKKwkJCXVsUmVnID0gRklFTERfU0VUKHVsUmVnLCBDVVJSRU5UX0dBVEUsIE1DTEssIERJVl82KTsKKwkJCWJyZWFrOworCQljYXNlIDg6CisJCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgQ1VSUkVOVF9HQVRFLCBNQ0xLLCBESVZfOCk7CisJCQlicmVhazsKKwkJfQorCisJCXNldEN1cnJlbnRHYXRlKHVsUmVnKTsKKwkJfQorfQorCisKK3Vuc2lnbmVkIGludCBkZGs3NTBfZ2V0Vk1TaXplKHZvaWQpCit7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBpbnQgZGF0YTsKKworCS8qIHNtNzUwbGUgb25seSB1c2UgNjQgbWIgbWVtb3J5Ki8KKwlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKQorCQlyZXR1cm4gTUIoNjQpOworCisJLyogZm9yIDc1MCxhbHdheXMgdXNlIHBvd2VyIG1vZGUwKi8KKwlyZWcgPSBQRUVLMzIoTU9ERTBfR0FURSk7CisJcmVnID0gRklFTERfU0VUKHJlZywgTU9ERTBfR0FURSwgR1BJTywgT04pOworCVBPS0UzMihNT0RFMF9HQVRFLCByZWcpOworCisJLyogZ2V0IGZyYW1lIGJ1ZmZlciBzaXplIGZyb20gR1BJTyAqLworCXJlZyA9IEZJRUxEX0dFVChQRUVLMzIoTUlTQ19DVFJMKSwgTUlTQ19DVFJMLCBMT0NBTE1FTV9TSVpFKTsKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgTUlTQ19DVFJMX0xPQ0FMTUVNX1NJWkVfOE06CisJCWRhdGEgPSBNQig4KTsgIGJyZWFrOyAvKiA4ICBNZWdhIGJ5dGUgKi8KKwljYXNlIE1JU0NfQ1RSTF9MT0NBTE1FTV9TSVpFXzE2TToKKwkJZGF0YSA9IE1CKDE2KTsgYnJlYWs7IC8qIDE2IE1lZ2EgYnl0ZSAqLworCWNhc2UgTUlTQ19DVFJMX0xPQ0FMTUVNX1NJWkVfMzJNOgorCQlkYXRhID0gTUIoMzIpOyBicmVhazsgLyogMzIgTWVnYSBieXRlICovCisJY2FzZSBNSVNDX0NUUkxfTE9DQUxNRU1fU0laRV82NE06CisJCWRhdGEgPSBNQig2NCk7IGJyZWFrOyAvKiA2NCBNZWdhIGJ5dGUgKi8KKwlkZWZhdWx0OgorCQlkYXRhID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBkYXRhOworCit9CisKK2ludCBkZGs3NTBfaW5pdEh3KGluaXRjaGlwX3BhcmFtX3QgKnBJbml0UGFyYW0pCit7CisKKwl1bnNpZ25lZCBpbnQgdWxSZWc7CisjaWYgMAorCS8vbW92ZSB0aGUgY29kZSB0byBtYXAgcmVnaXRlciBmdW5jdGlvbi4KKwlpZiAoZ2V0Q2hpcFR5cGUoKSA9PSBTTTcxOCkgeworCQkvKiB0dXJuIG9uIGJpZyBlbmRpYW4gYml0Ki8KKwkJdWxSZWcgPSBQRUVLMzIoMHg3NCk7CisJCS8qIG5vdyBjb25zaWRlciByZWdpc3RlciBkZWZpbml0aW9uIGluIGEgYmlnIGVuZGlhbiBwYXR0ZXJuKi8KKwkJUE9LRTMyKDB4NzQsIHVsUmVnfDB4ODAwMDAwMDApOworCX0KKworI2VuZGlmCisKKworCWlmIChwSW5pdFBhcmFtLT5wb3dlck1vZGUgIT0gMCApCisJCXBJbml0UGFyYW0tPnBvd2VyTW9kZSA9IDA7CisJc2V0UG93ZXJNb2RlKHBJbml0UGFyYW0tPnBvd2VyTW9kZSk7CisKKwkvKiBFbmFibGUgZGlzcGxheSBwb3dlciBnYXRlICYgTE9DQUxNRU0gcG93ZXIgZ2F0ZSovCisJdWxSZWcgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKTsKKwl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgQ1VSUkVOVF9HQVRFLCBESVNQTEFZLCBPTik7CisJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIENVUlJFTlRfR0FURSwgTE9DQUxNRU0sIE9OKTsKKwlzZXRDdXJyZW50R2F0ZSh1bFJlZyk7CisKKwlpZiAoZ2V0Q2hpcFR5cGUoKSAhPSBTTTc1MExFKSB7CisJCS8qCXNldCBwYW5lbCBwbGwgYW5kIGdyYXBoaWMgbW9kZSB2aWEgbW1pb184OCAqLworCQl1bFJlZyA9IFBFRUszMihWR0FfQ09ORklHVVJBVElPTik7CisJCXVsUmVnID0gRklFTERfU0VUKHVsUmVnLCBWR0FfQ09ORklHVVJBVElPTiwgUExMLCBQQU5FTCk7CisJCXVsUmVnID0gRklFTERfU0VUKHVsUmVnLCBWR0FfQ09ORklHVVJBVElPTiwgTU9ERSwgR1JBUEhJQyk7CisJCVBPS0UzMihWR0FfQ09ORklHVVJBVElPTiwgdWxSZWcpOworCX0gZWxzZSB7CisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZCggX194ODZfNjRfXykKKwkJLyogc2V0IGdyYXBoaWMgbW9kZSB2aWEgSU8gbWV0aG9kICovCisJCW91dGJfcCgweDg4LCAweDNkNCk7CisJCW91dGJfcCgweDA2LCAweDNkNSk7CisjZW5kaWYKKwl9CisKKwkvKiBTZXQgdGhlIE1haW4gQ2hpcCBDbG9jayAqLworCXNldENoaXBDbG9jayhNSHooKHVuc2lnbmVkIGludClwSW5pdFBhcmFtLT5jaGlwQ2xvY2spKTsKKworCS8qIFNldCB1cCBtZW1vcnkgY2xvY2suICovCisJc2V0TWVtb3J5Q2xvY2soTUh6KHBJbml0UGFyYW0tPm1lbUNsb2NrKSk7CisKKwkvKiBTZXQgdXAgbWFzdGVyIGNsb2NrICovCisJc2V0TWFzdGVyQ2xvY2soTUh6KHBJbml0UGFyYW0tPm1hc3RlckNsb2NrKSk7CisKKworCS8qIFJlc2V0IHRoZSBtZW1vcnkgY29udHJvbGxlci4gSWYgdGhlIG1lbW9yeSBjb250cm9sbGVyIGlzIG5vdCByZXNldCBpbiBTTTc1MCwKKwkgICB0aGUgc3lzdGVtIG1pZ2h0IGhhbmcgd2hlbiBzdyBhY2Nlc3NlcyB0aGUgbWVtb3J5LgorCSAgIFRoZSBtZW1vcnkgc2hvdWxkIGJlIHJlc2V0dGVkIGFmdGVyIGNoYW5naW5nIHRoZSBNWENMSy4KKwkgKi8KKwlpZiAocEluaXRQYXJhbS0+cmVzZXRNZW1vcnkgPT0gMSkgeworCQl1bFJlZyA9IFBFRUszMihNSVNDX0NUUkwpOworCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgTUlTQ19DVFJMLCBMT0NBTE1FTV9SRVNFVCwgUkVTRVQpOworCQlQT0tFMzIoTUlTQ19DVFJMLCB1bFJlZyk7CisKKwkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIE1JU0NfQ1RSTCwgTE9DQUxNRU1fUkVTRVQsIE5PUk1BTCk7CisJCVBPS0UzMihNSVNDX0NUUkwsIHVsUmVnKTsKKwl9CisKKwlpZiAocEluaXRQYXJhbS0+c2V0QWxsRW5nT2ZmID09IDEpIHsKKwkJZW5hYmxlMkRFbmdpbmUoMCk7CisKKwkJLyogRGlzYWJsZSBPdmVybGF5LCBpZiBhIGZvcm1lciBhcHBsaWNhdGlvbiBsZWZ0IGl0IG9uICovCisJCXVsUmVnID0gUEVFSzMyKFZJREVPX0RJU1BMQVlfQ1RSTCk7CisJCXVsUmVnID0gRklFTERfU0VUKHVsUmVnLCBWSURFT19ESVNQTEFZX0NUUkwsIFBMQU5FLCBESVNBQkxFKTsKKwkJUE9LRTMyKFZJREVPX0RJU1BMQVlfQ1RSTCwgdWxSZWcpOworCisJCS8qIERpc2FibGUgdmlkZW8gYWxwaGEsIGlmIGEgZm9ybWVyIGFwcGxpY2F0aW9uIGxlZnQgaXQgb24gKi8KKwkJdWxSZWcgPSBQRUVLMzIoVklERU9fQUxQSEFfRElTUExBWV9DVFJMKTsKKwkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTCwgUExBTkUsIERJU0FCTEUpOworCQlQT0tFMzIoVklERU9fQUxQSEFfRElTUExBWV9DVFJMLCB1bFJlZyk7CisKKwkJLyogRGlzYWJsZSBhbHBoYSBwbGFuZSwgaWYgYSBmb3JtZXIgYXBwbGljYXRpb24gbGVmdCBpdCBvbiAqLworCQl1bFJlZyA9IFBFRUszMihBTFBIQV9ESVNQTEFZX0NUUkwpOworCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgQUxQSEFfRElTUExBWV9DVFJMLCBQTEFORSwgRElTQUJMRSk7CisJCVBPS0UzMihBTFBIQV9ESVNQTEFZX0NUUkwsIHVsUmVnKTsKKworI2lmIDAKKwkJLyogRGlzYWJsZSBMQ0QgaGFyZHdhcmUgY3Vyc29yLCBpZiBhIGZvcm1lciBhcHBsaWNhdGlvbiBsZWZ0IGl0IG9uICovCisJCXVsUmVnID0gUEVFSzMyKFBBTkVMX0hXQ19BRERSRVNTKTsKKwkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIFBBTkVMX0hXQ19BRERSRVNTLCBFTkFCTEUsIERJU0FCTEUpOworCQlQT0tFMzIoUEFORUxfSFdDX0FERFJFU1MsIHVsUmVnKTsKKworCQkvKiBEaXNhYmxlIENSVCBoYXJkd2FyZSBjdXJzb3IsIGlmIGEgZm9ybWVyIGFwcGxpY2F0aW9uIGxlZnQgaXQgb24gKi8KKwkJdWxSZWcgPSBQRUVLMzIoQ1JUX0hXQ19BRERSRVNTKTsKKwkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIENSVF9IV0NfQUREUkVTUywgRU5BQkxFLCBESVNBQkxFKTsKKwkJUE9LRTMyKENSVF9IV0NfQUREUkVTUywgdWxSZWcpOworCisJCS8qIERpc2FibGUgWlYgUG9ydCAwLCBpZiBhIGZvcm1lciBhcHBsaWNhdGlvbiBsZWZ0IGl0IG9uICovCisJCXVsUmVnID0gUEVFSzMyKFpWMF9DQVBUVVJFX0NUUkwpOworCQl1bFJlZyA9IEZJRUxEX1NFVCh1bFJlZywgWlYwX0NBUFRVUkVfQ1RSTCwgQ0FQLCBESVNBQkxFKTsKKwkJUE9LRTMyKFpWMF9DQVBUVVJFX0NUUkwsIHVsUmVnKTsKKworCQkvKiBEaXNhYmxlIFpWIFBvcnQgMSwgaWYgYSBmb3JtZXIgYXBwbGljYXRpb24gbGVmdCBpdCBvbiAqLworCQl1bFJlZyA9IFBFRUszMihaVjFfQ0FQVFVSRV9DVFJMKTsKKwkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIFpWMV9DQVBUVVJFX0NUUkwsIENBUCwgRElTQUJMRSk7CisJCVBPS0UzMihaVjFfQ0FQVFVSRV9DVFJMLCB1bFJlZyk7CisKKwkJLyogRGlzYWJsZSBaViBQb3J0IFBvd2VyLCBpZiBhIGZvcm1lciBhcHBsaWNhdGlvbiBsZWZ0IGl0IG9uICovCisJCWVuYWJsZVpWUG9ydCgwKTsKKwkJLyogRGlzYWJsZSBETUEgQ2hhbm5lbCwgaWYgYSBmb3JtZXIgYXBwbGljYXRpb24gbGVmdCBpdCBvbiAqLworCQl1bFJlZyA9IFBFRUszMihETUFfQUJPUlRfSU5URVJSVVBUKTsKKwkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIERNQV9BQk9SVF9JTlRFUlJVUFQsIEFCT1JUXzEsIEFCT1JUKTsKKwkJUE9LRTMyKERNQV9BQk9SVF9JTlRFUlJVUFQsIHVsUmVnKTsKKworCQkvKiBEaXNhYmxlIGkyYyAqLworCQllbmFibGVJMkMoMCk7CisjZW5kaWYKKwkJLyogRGlzYWJsZSBETUEgQ2hhbm5lbCwgaWYgYSBmb3JtZXIgYXBwbGljYXRpb24gbGVmdCBpdCBvbiAqLworCQl1bFJlZyA9IFBFRUszMihETUFfQUJPUlRfSU5URVJSVVBUKTsKKwkJdWxSZWcgPSBGSUVMRF9TRVQodWxSZWcsIERNQV9BQk9SVF9JTlRFUlJVUFQsIEFCT1JUXzEsIEFCT1JUKTsKKwkJUE9LRTMyKERNQV9BQk9SVF9JTlRFUlJVUFQsIHVsUmVnKTsKKworCQkvKiBEaXNhYmxlIERNQSBQb3dlciwgaWYgYSBmb3JtZXIgYXBwbGljYXRpb24gbGVmdCBpdCBvbiAqLworCQllbmFibGVETUEoMCk7CisJfQorCisJLyogV2UgY2FuIGFkZCBtb3JlIGluaXRpYWxpemF0aW9uIGFzIG5lZWRlZC4gKi8KKworCXJldHVybiAwOworfQorCisjaWYgMAorCit1bnNpZ25lZCBpbnQgYWJzRGlmZih1bnNpZ25lZCBpbnQgYSwgdW5zaWduZWQgaW50IGIpCit7CisJaWYgKCBhID4gYiApCisJCXJldHVybihhIC0gYik7CisJZWxzZQorCQlyZXR1cm4oYiAtIGEpOworfQorCisjZW5kaWYKKy8qCisJbW9uayBsaXUgQCA0LzYvMjAxMToKKwkJICAgcmUtd3JpdGUgdGhlIGNhbGN1bGF0ZVBMTCBmdW5jdGlvbiBvZiBkZGs3NTAuCisJCSAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSBzb21lIG1hdGhlbWF0aWNzIHRyaWNrcyBhbmQgc2hvcnRjdXQKKwkJICAgd2hlbiBpdCBkb2luZyB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIGJlc3QgTixNLEQgY29tYmluYXRpb24KKwkJICAgSSB0aGluayB0aGlzIHZlcnNpb24gZ2l2ZXMgYSBsaXR0bGUgdXBncmFkZSBpbiBzcGVlZAorCisJNzUwIHBsbCBjbG9jayBmb3JtdWxhcjoKKwlSZXF1ZXN0IENsb2NrID0gKElucHV0IENsb2NrICogTSApLyhOICogWCkKKworCUlucHV0IENsb2NrID0gMTQzMTgxODEgaHoKKwlYID0gMiBwb3dlciBECisJRCA9ezAsMSwyLDMsNCw1LDZ9CisJTSA9IHsxLC4uLiwyNTV9CisJTiA9IHsyLC4uLiwxNX0KKyovCit1bnNpZ25lZCBpbnQgY2FsY1BsbFZhbHVlKHVuc2lnbmVkIGludCByZXF1ZXN0X29yaWcsIHBsbF92YWx1ZV90ICpwbGwpCit7CisJLyogdXNlZCBmb3IgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IGNoYW5uZWwgcGl4ZWwgY2xvY2sgcGxsICovCisJc3RhdGljIHBsbGNhbHBhcmFtIHhwYXJtX1BJWEVMW10gPSB7CisJCS8qIDJeMCA9IDEqLwkJCXswLCAwLCAwLCAxfSwKKwkJLyogMl4gMSA9MiovCQkJezEsIDAsIDEsIDJ9LAorCQkvKiAyXiAyICA9IDQqLwkJezIsIDAsIDIsIDR9LAorCQkJCQkJCXszLCAwLCAzLCA4fSwKKwkJCQkJCQl7NCwgMSwgMywgMTZ9LAorCQkJCQkJCXs1LCAyLCAzLCAzMn0sCisJCS8qIDJeNiA9IDY0ICAqLwkJezYsIDMsIDMsIDY0fSwKKwkJCQkJCQl9OworCisJLyogdXNlZCBmb3IgTVhDTEsgKGNoaXAgY2xvY2spICovCisJc3RhdGljIHBsbGNhbHBhcmFtIHhwYXJtX01YQ0xLW10gPSB7CisJCS8qIDJeMCA9IDEqLwkJCXswLCAwLCAwLCAxfSwKKwkJLyogMl4gMSA9MiovCQkJezEsIDAsIDEsIDJ9LAorCQkvKiAyXiAyICA9IDQqLwkJezIsIDAsIDIsIDR9LAorCQkJCQkJCXszLCAwLCAzLCA4fSwKKwkJCQkJCQl9OworCisJLyogYXMgc203NTAgcmVnaXN0ZXIgZGVmaW5pdGlvbiwgTiBsb2NhdGVkIGluIDIsMTUgYW5kIE0gbG9jYXRlZCBpbiAxLDI1NQkqLworCWludCBOLCBNLCBYLCBkOworCWludCB4Y250OworCWludCBtaW5pRGlmZjsKKwl1bnNpZ25lZCBpbnQgUk4sIHF1bywgcmVtLCBmbF9xdW87CisJdW5zaWduZWQgaW50IGlucHV0LCByZXF1ZXN0OworCXVuc2lnbmVkIGludCB0bXBDbG9jaywgcmV0OworCXBsbGNhbHBhcmFtICogeHBhcm07CisKKyNpZiAxCisJaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkgeworCQkvKiBTTTc1MExFIGRvbid0IGhhdmUgcHJncmFtbWFibGUgUExMIGFuZCBNL04gdmFsdWVzIHRvIHdvcmsgb24uCisJCUp1c3QgcmV0dXJuIHRoZSByZXF1ZXN0ZWQgY2xvY2suICovCisJCXJldHVybiByZXF1ZXN0X29yaWc7CisJfQorI2VuZGlmCisKKwlyZXQgPSAwOworCW1pbmlEaWZmID0gfjA7CisJcmVxdWVzdCA9IHJlcXVlc3Rfb3JpZyAvIDEwMDA7CisJaW5wdXQgPSBwbGwtPmlucHV0RnJlcSAvIDEwMDA7CisKKwkvKiBmb3IgTVhDTEsgcmVnaXN0ZXIgLCBubyBQT0QgcHJvdmlkZWQsIHNvIG5lZWQgYmUgdHJlYXRlZCBkaWZmZXJlbnRseQkqLworCisJaWYgKHBsbC0+Y2xvY2tUeXBlICE9IE1YQ0xLX1BMTCkgeworCQl4cGFybSA9ICZ4cGFybV9QSVhFTFswXTsKKwkJeGNudCA9IHNpemVvZih4cGFybV9QSVhFTCkvc2l6ZW9mKHhwYXJtX1BJWEVMWzBdKTsKKwl9IGVsc2UgeworCQl4cGFybSA9ICZ4cGFybV9NWENMS1swXTsKKwkJeGNudCA9IHNpemVvZih4cGFybV9NWENMSykvc2l6ZW9mKHhwYXJtX01YQ0xLWzBdKTsKKwl9CisKKworCWZvciAoTiA9IDE1OyBOID4gMTsgTi0tKSB7CisJCS8qIFJOIHdpbGwgbm90IGV4Y2VlZCBtYXhpbXVtIGxvbmcgaWYgQHJlcXVlc3QgPD0gMjg1IE1IWiAoZm9yIDMyYml0IGNwdSkgKi8KKwkJUk4gPSBOICogcmVxdWVzdDsKKwkJcXVvID0gUk4gLyBpbnB1dDsKKwkJcmVtID0gUk4gJSBpbnB1dDsvKiByZW0gYWx3YXlzIHNtYWxsIHRoYW4gMTQzMTgxODEgKi8KKwkJZmxfcXVvID0gKHJlbSAqIDEwMDAwIC9pbnB1dCk7CisKKwkJZm9yIChkID0geGNudCAtIDE7IGQgPj0gMDsgZC0tKSB7CisJCQlYID0geHBhcm1bZF0udmFsdWU7CisJCQlNID0gcXVvKlg7CisJCQlNICs9IGZsX3F1byAqIFggLyAxMDAwMDsKKwkJCS8qIHJvdW5kIHN0ZXAgKi8KKwkJCU0gKz0gKGZsX3F1bypYICUgMTAwMDApPjUwMDA/MTowOworCQkJaWYgKE0gPCAyNTYgJiYgTSA+IDApIHsKKwkJCQl1bnNpZ25lZCBpbnQgZGlmZjsKKwkJCQl0bXBDbG9jayA9IHBsbC0+aW5wdXRGcmVxICpNIC8gTiAvIFg7CisJCQkJZGlmZiA9IGFic0RpZmYodG1wQ2xvY2ssIHJlcXVlc3Rfb3JpZyk7CisJCQkJaWYgKGRpZmYgPCBtaW5pRGlmZikgeworCQkJCQlwbGwtPk0gPSBNOworCQkJCQlwbGwtPk4gPSBOOworCQkJCQlwbGwtPk9EID0geHBhcm1bZF0ub2Q7CisJCQkJCXBsbC0+UE9EID0geHBhcm1bZF0ucG9kOworCQkJCQltaW5pRGlmZiA9IGRpZmY7CisJCQkJCXJldCA9IHRtcENsb2NrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCS8vcHJpbnRrKCJGaW5hbGx5OiAgcGxsLT5uWyVsdV0sbVslbHVdLG9kWyVsdV0scG9kWyVsdV1cbiIscGxsLT5OLHBsbC0+TSxwbGwtPk9ELHBsbC0+UE9EKTsKKwlyZXR1cm4gcmV0OworfQorCit1bnNpZ25lZCBpbnQgY2FsY1BsbFZhbHVlMigKK3Vuc2lnbmVkIGludCB1bFJlcXVlc3RDbGssIC8qIFJlcXVpcmVkIHBpeGVsIGNsb2NrIGluIEh6IHVuaXQgKi8KK3BsbF92YWx1ZV90ICpwUExMICAgICAgICAgICAvKiBTdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgdmFsdWUgdG8gYmUgc2V0IGluIFBMTCAqLworKQoreworCXVuc2lnbmVkIGludCBNLCBOLCBPRCwgUE9EID0gMCwgZGlmZiwgcGxsQ2xrLCBvZFBvd2VyLCBwb2RQb3dlcjsKKwl1bnNpZ25lZCBpbnQgYmVzdERpZmYgPSAweGZmZmZmZmZmOyAvKiBiaWdnZXN0IDMyIGJpdCB1bnNpZ25lZCBudW1iZXIgKi8KKwl1bnNpZ25lZCBpbnQgcmV0OworICAgIC8qIEluaXQgUExMIHN0cnVjdHVyZSB0byBrbm93IHN0YXRlcyAqLworCXBQTEwtPk0gPSAwOworCXBQTEwtPk4gPSAwOworCXBQTEwtPk9EID0gMDsKKwlwUExMLT5QT0QgPSAwOworCisgICAgLyogU2FuaXR5IGNoZWNrOiBOb25lIGF0IHRoZSBtb21lbnQgKi8KKworICAgIC8qIENvbnZlcnQgZXZlcnl0aGluZyBpbiBLaHogcmFuZ2UgaW4gb3JkZXIgdG8gYXZvaWQgY2FsY3VsYXRpb24gb3ZlcmZsb3cgKi8KKwlwUExMLT5pbnB1dEZyZXEgLz0gMTAwMDsKKwl1bFJlcXVlc3RDbGsgLz0gMTAwMDsKKworI2lmbmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAvKiBUaGUgbWF4aW11bSBvZiBwb3N0IGRpdmlkZXIgaXMgOC4gKi8KKwlmb3IgKFBPRCA9IDA7IFBPRCA8PSAzOyBQT0QrKykKKyNlbmRpZgorCQl7CisKKyNpZm5kZWYgVkFMSURBVElPTl9DSElQCisJLyogTVhDTEtfUExMIGRvZXMgbm90IGhhdmUgcG9zdCBkaXZpZGVyLiAqLworCWlmICgoUE9EID4gMCkgJiYgKHBQTEwtPmNsb2NrVHlwZSA9PSBNWENMS19QTEwpKQorCQlicmVhazsKKyNlbmRpZgorCisJLyogV29yayBvdXQgMiB0byB0aGUgcG93ZXIgb2YgUE9EICovCisJcG9kUG93ZXIgPSB0d29Ub1Bvd2VyT2Z4KFBPRCk7CisKKwkvKiBPRCBoYXMgb25seSAyIGJpdHMgWzE1OjE0XSBhbmQgaXRzIHZhbHVlIG11c3QgYmV0d2VlbiAwIHRvIDMgKi8KKwlmb3IgKE9EID0gMDsgT0QgPD0gMzsgT0QrKykgeworCQkvKiBXb3JrIG91dCAyIHRvIHRoZSBwb3dlciBvZiBPRCAqLworCQlvZFBvd2VyID0gdHdvVG9Qb3dlck9meChPRCk7CisKKyNpZmRlZiBWQUxJREFUSU9OX0NISVAKKwlpZiAob2RQb3dlciA+IDQpCisJCXBvZFBvd2VyID0gNDsKKwllbHNlCisJCXBvZFBvd2VyID0gb2RQb3dlcjsKKyNlbmRpZgorCisJCS8qIE4gaGFzIDQgYml0cyBbMTE6OF0gYW5kIGl0cyB2YWx1ZSBtdXN0IGJldHdlZW4gMiBhbmQgMTUuCisJCVRoZSBOID09IDEgd2lsbCBiZWhhdmUgZGlmZmVyZW50bHkgLS0+IFJlc3VsdCBpcyBub3QgY29ycmVjdC4gKi8KKwlmb3IgKE4gPSAyOyBOIDw9IDE1OyBOKyspIHsKKwkJLyogVGhlIGZvcm11bGEgZm9yIFBMTCBpcyB1bFJlcXVlc3RDbGsgPSBpbnB1dEZyZXEgKiBNIC8gTiAvICgyXk9EKQorCQlJbiB0aGUgZm9sbG93aW5nIHN0ZXBzLCB3ZSB0cnkgdG8gd29yayBvdXQgYSBiZXN0IE0gdmFsdWUgZ2l2ZW4gdGhlIG90aGVycyBhcmUga25vd24uCisJCVRvIGF2b2lkIGRlY2ltYWwgY2FsY3VsYXRpb24sIHdlIHVzZSAxMDAwIGFzIG11bHRpcGxpZXIgZm9yIHVwIHRvIDMgZGVjaW1hbCBwbGFjZXMgb2YgYWNjdXJhY3kuCisJCSovCisJCU0gPSB1bFJlcXVlc3RDbGsgKiBOICogb2RQb3dlciAqIDEwMDAgLyBwUExMLT5pbnB1dEZyZXE7CisJCU0gPSByb3VuZGVkRGl2KE0sIDEwMDApOworCisJCS8qIE0gZmllbGQgaGFzIG9ubHkgOCBiaXRzLCByZWplY3QgdmFsdWUgYmlnZ2VyIHRoYW4gOCBiaXRzICovCisJCWlmIChNIDwgMjU2KSB7CisJCQkvKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCBjbG9jayBmb3IgYSBnaXZlbiBNICYgTiAqLworCQkJcGxsQ2xrID0gcFBMTC0+aW5wdXRGcmVxICogTSAvIE4gLyBvZFBvd2VyIC8gcG9kUG93ZXI7CisKKwkJCS8qIEhvdyBtdWNoIGFyZSB3ZSBkaWZmZXJlbnQgZnJvbSB0aGUgcmVxdWlyZW1lbnQgKi8KKwkJCWRpZmYgPSBhYnNEaWZmKHBsbENsaywgdWxSZXF1ZXN0Q2xrKTsKKworCQkJaWYgKGRpZmYgPCBiZXN0RGlmZikgeworCQkJCWJlc3REaWZmID0gZGlmZjsKKworCQkJCS8qIFN0b3JlIE0gYW5kIE4gdmFsdWVzICovCisJCQkJcFBMTC0+TSAgPSBNOworCQkJCXBQTEwtPk4gID0gTjsKKwkJCQlwUExMLT5PRCA9IE9EOworCisjaWZkZWYgVkFMSURBVElPTl9DSElQCisJCQlpZiAoT0QgPiAyKQorCQkJCVBPRCA9IDI7CisJCQllbHNlCisJCQkJUE9EID0gT0Q7CisjZW5kaWYKKworCQkJcFBMTC0+UE9EID0gUE9EOworCQkJfQorCQl9CisJfQorCX0KKwl9CisKKyAgICAvKiBSZXN0b3JlIGlucHV0IGZyZXF1ZW5jeSBmcm9tIEtoeiB0byBoeiB1bml0ICovCisvLyAgICBwUExMLT5pbnB1dEZyZXEgKj0gMTAwMDsKKwl1bFJlcXVlc3RDbGsgKj0gMTAwMDsKKwlwUExMLT5pbnB1dEZyZXEgPSBERUZBVUxUX0lOUFVUX0NMT0NLOyAvKiBEZWZhdWx0IHJlZmVyZW5jZSBjbG9jayAqLworCisgICAgLyogT3V0cHV0IGRlYnVnIGluZm9ybWF0aW9uICovCisJLy9EREtERUJVR1BSSU5UKChESVNQTEFZX0xFVkVMLCAiY2FsY1BsbFZhbHVlOiBSZXF1ZXN0ZWQgRnJlcXVlbmN5ID0gJWRcbiIsIHVsUmVxdWVzdENsaykpOworCS8vRERLREVCVUdQUklOVCgoRElTUExBWV9MRVZFTCwgImNhbGNQbGxWYWx1ZTogSW5wdXQgQ0xLID0gJWRIeiwgTT0lZCwgTj0lZCwgT0Q9JWQsIFBPRD0lZFxuIiwgcFBMTC0+aW5wdXRGcmVxLCBwUExMLT5NLCBwUExMLT5OLCBwUExMLT5PRCwgcFBMTC0+UE9EKSk7CisKKyAgICAvKiBSZXR1cm4gYWN0dWFsIGZyZXF1ZW5jeSB0aGF0IHRoZSBQTEwgY2FuIHNldCAqLworCXJldCA9IGNhbGNQTEwocFBMTCk7CisJcmV0dXJuIHJldDsKK30KKworCisKKworCit1bnNpZ25lZCBpbnQgZm9ybWF0UGxsUmVnKHBsbF92YWx1ZV90ICpwUExMKQoreworCXVuc2lnbmVkIGludCB1bFBsbFJlZyA9IDA7CisKKyAgICAvKiBOb3RlIHRoYXQgYWxsIFBMTCdzIGhhdmUgdGhlIHNhbWUgZm9ybWF0LiBIZXJlLCB3ZSBqdXN0IHVzZSBQYW5lbCBQTEwgcGFyYW1ldGVyCisgICAgICAgdG8gd29yayBvdXQgdGhlIGJpdCBmaWVsZHMgaW4gdGhlIHJlZ2lzdGVyLgorICAgICAgIE9uIHJldHVybmluZyBhIDMyIGJpdCBudW1iZXIsIHRoZSB2YWx1ZSBjYW4gYmUgYXBwbGllZCB0byBhbnkgUExMIGluIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLgorICAgICovCisJdWxQbGxSZWcgPQorCUZJRUxEX1NFVCggIDAsIFBBTkVMX1BMTF9DVFJMLCBCWVBBU1MsIE9GRikKKwl8IEZJRUxEX1NFVCggIDAsIFBBTkVMX1BMTF9DVFJMLCBQT1dFUiwgIE9OKQorCXwgRklFTERfU0VUKCAgMCwgUEFORUxfUExMX0NUUkwsIElOUFVULCAgT1NDKQorI2lmbmRlZiBWQUxJREFUSU9OX0NISVAKKwl8IEZJRUxEX1ZBTFVFKDAsIFBBTkVMX1BMTF9DVFJMLCBQT0QsICAgIHBQTEwtPlBPRCkKKyNlbmRpZgorCXwgRklFTERfVkFMVUUoMCwgUEFORUxfUExMX0NUUkwsIE9ELCAgICAgcFBMTC0+T0QpCisJfCBGSUVMRF9WQUxVRSgwLCBQQU5FTF9QTExfQ1RSTCwgTiwgICAgICBwUExMLT5OKQorCXwgRklFTERfVkFMVUUoMCwgUEFORUxfUExMX0NUUkwsIE0sICAgICAgcFBMTC0+TSk7CisKKyAgICByZXR1cm4gdWxQbGxSZWc7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2NoaXAuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRjYjBkNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9jaGlwLmgKQEAgLTAsMCArMSw4NyBAQAorI2lmbmRlZiBEREs3NTBfQ0hJUF9IX18KKyNkZWZpbmUgRERLNzUwX0NISVBfSF9fCisjZGVmaW5lIERFRkFVTFRfSU5QVVRfQ0xPQ0sgMTQzMTgxODEgLyogRGVmYXVsdCByZWZlcmVuY2UgY2xvY2sgKi8KKyNpZm5kZWYgU003NTBMRV9SRVZJU0lPTl9JRAorI2RlZmluZSBTTTc1MExFX1JFVklTSU9OX0lEICgodW5zaWduZWQgY2hhcikweGZlKQorI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisvKiBUaGlzIGlzIGFsbCB0aGUgY2hpcHMgcmVjb2duaXplZCBieSB0aGlzIGxpYnJhcnkgKi8KK3R5cGVkZWYgZW51bSBfbG9naWNhbF9jaGlwX3R5cGVfdAoreworICAgIFNNX1VOS05PV04sCisgICAgU003MTgsCisgICAgU003NTAsCisgICAgU003NTBMRSwKK30KK2xvZ2ljYWxfY2hpcF90eXBlX3Q7CisKKwordHlwZWRlZiBlbnVtIF9jbG9ja190eXBlX3QKK3sKKwlNWENMS19QTEwsCisJUFJJTUFSWV9QTEwsCisJU0VDT05EQVJZX1BMTCwKKwlWR0EwX1BMTCwKKwlWR0ExX1BMTCwKK30KK2Nsb2NrX3R5cGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX3BsbF92YWx1ZV90Cit7CisgICAgY2xvY2tfdHlwZV90IGNsb2NrVHlwZTsKKyAgICB1bnNpZ25lZCBsb25nIGlucHV0RnJlcTsgLyogSW5wdXQgY2xvY2sgZnJlcXVlbmN5IHRvIHRoZSBQTEwgKi8KKworICAgIC8qIFVzZSB0aGlzIHdoZW4gY2xvY2tUeXBlID0gUEFORUxfUExMICovCisgICAgdW5zaWduZWQgbG9uZyBNOworICAgIHVuc2lnbmVkIGxvbmcgTjsKKyAgICB1bnNpZ25lZCBsb25nIE9EOworICAgIHVuc2lnbmVkIGxvbmcgUE9EOworfQorcGxsX3ZhbHVlX3Q7CisKKy8qIGlucHV0IHN0cnVjdCB0byBpbml0Q2hpcFBhcmFtKCkgZnVuY3Rpb24gKi8KK3R5cGVkZWYgc3RydWN0IF9pbml0Y2hpcF9wYXJhbV90Cit7CisgICAgdW5zaWduZWQgc2hvcnQgcG93ZXJNb2RlOyAgICAvKiBVc2UgcG93ZXIgbW9kZSAwIG9yIDEgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBjaGlwQ2xvY2s7ICAgIC8qIFNwZWVkIG9mIG1haW4gY2hpcCBjbG9jayBpbiBNSHogdW5pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9IGtlZXAgdGhlIGN1cnJlbnQgY2xvY2sgc2V0dGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJzID0gdGhlIG5ldyBtYWluIGNoaXAgY2xvY2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIHNob3J0IG1lbUNsb2NrOyAgICAgLyogU3BlZWQgb2YgbWVtb3J5IGNsb2NrIGluIE1IeiB1bml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0ga2VlcCB0aGUgY3VycmVudCBjbG9jayBzZXR0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcnMgPSB0aGUgbmV3IG1lbW9yeSBjbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgc2hvcnQgbWFzdGVyQ2xvY2s7ICAvKiBTcGVlZCBvZiBtYXN0ZXIgY2xvY2sgaW4gTUh6IHVuaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPSBrZWVwIHRoZSBjdXJyZW50IGNsb2NrIHNldHRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVycyA9IHRoZSBuZXcgbWFzdGVyIGNsb2NrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBzZXRBbGxFbmdPZmY7IC8qIDAgPSBsZWF2ZSBhbGwgZW5naW5lIHN0YXRlIHVudG91Y2hlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBtYWtlIHN1cmUgdGhleSBhcmUgb2ZmOiAyRCwgT3ZlcmxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGFscGhhLCBhbHBoYSwgaGFyZHdhcmUgY3Vyc29ycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHJlc2V0TWVtb3J5OyAgIC8qIDAgPSBEbyBub3QgcmVzZXQgdGhlIG1lbW9yeSBjb250cm9sbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gUmVzZXQgdGhlIG1lbW9yeSBjb250cm9sbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIC8qIE1vcmUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIGNhbiBiZSBhZGRlZCBpZiBuZWVkZWQgKi8KK30KK2luaXRjaGlwX3BhcmFtX3Q7CisKKworbG9naWNhbF9jaGlwX3R5cGVfdCBnZXRDaGlwVHlwZSh2b2lkKTsKK3Vuc2lnbmVkIGludCBjYWxjUGxsVmFsdWUodW5zaWduZWQgaW50IHJlcXVlc3QscGxsX3ZhbHVlX3QgKnBsbCk7Cit1bnNpZ25lZCBpbnQgY2FsY1BsbFZhbHVlMih1bnNpZ25lZCBpbnQscGxsX3ZhbHVlX3QgKik7Cit1bnNpZ25lZCBpbnQgZm9ybWF0UGxsUmVnKHBsbF92YWx1ZV90ICpwUExMKTsKK3ZvaWQgZGRrNzUwX3NldF9tbWlvKHZvaWQgX19pb21lbSAqLHVuc2lnbmVkIHNob3J0LGNoYXIpOwordW5zaWduZWQgaW50IGRkazc1MF9nZXRWTVNpemUodm9pZCk7CitpbnQgZGRrNzUwX2luaXRIdyhpbml0Y2hpcF9wYXJhbV90ICopOwordW5zaWduZWQgaW50IGdldFBsbFZhbHVlKGNsb2NrX3R5cGVfdCBjbG9ja1R5cGUsIHBsbF92YWx1ZV90ICpwUExMKTsKK3Vuc2lnbmVkIGludCBnZXRDaGlwQ2xvY2sodm9pZCk7Cit2b2lkIHNldENoaXBDbG9jayh1bnNpZ25lZCBpbnQpOwordm9pZCBzZXRNZW1vcnlDbG9jayh1bnNpZ25lZCBpbnQgZnJlcXVlbmN5KTsKK3ZvaWQgc2V0TWFzdGVyQ2xvY2sodW5zaWduZWQgaW50IGZyZXF1ZW5jeSk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZGlzcGxheS5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQxOTZhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuYwpAQCAtMCwwICsxLDMwNyBAQAorI2luY2x1ZGUgImRkazc1MF9yZWcuaCIKKyNpbmNsdWRlICJkZGs3NTBfaGVscC5oIgorI2luY2x1ZGUgImRkazc1MF9kaXNwbGF5LmgiCisjaW5jbHVkZSAiZGRrNzUwX3Bvd2VyLmgiCisjaW5jbHVkZSAiZGRrNzUwX2R2aS5oIgorCisjZGVmaW5lIHByaW1hcnlXYWl0VmVydGljYWxTeW5jKGRlbGF5KSB3YWl0TmV4dFZlcnRpY2FsU3luYygwLGRlbGF5KQorCitzdGF0aWMgdm9pZCBzZXREaXNwbGF5Q29udHJvbChpbnQgY3RybCxpbnQgZGlzcFN0YXRlKQoreworCS8qIHN0YXRlICE9IDAgbWVhbnMgdHVybiBvbiBib3RoIHRpbWluZyAmIHBsYW5lIGVuX2JpdCAqLworCXVuc2lnbmVkIGxvbmcgdWxEaXNwbGF5Q3RybFJlZywgdWxSZXNlcnZlZEJpdHM7CisJaW50IGNudDsKKworCWNudCA9IDA7CisKKwkvKiBTZXQgdGhlIHByaW1hcnkgZGlzcGxheSBjb250cm9sICovCisJaWYgKCFjdHJsKQorCXsKKwkJdWxEaXNwbGF5Q3RybFJlZyA9IFBFRUszMihQQU5FTF9ESVNQTEFZX0NUUkwpOworCQkvKiBUdXJuIG9uL29mZiB0aGUgUGFuZWwgZGlzcGxheSBjb250cm9sICovCisJCWlmIChkaXNwU3RhdGUpCisJCXsKKwkJCS8qIFRpbWluZyBzaG91bGQgYmUgZW5hYmxlZCBmaXJzdCBiZWZvcmUgZW5hYmxpbmcgdGhlIHBsYW5lCisJCQkgKiBiZWNhdXNlIGNoYW5naW5nIGF0IHRoZSBzYW1lIHRpbWUgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQKKwkJCSAqIHRoZSBwbGFuZSB3aWxsIGFsc28gZW5hYmxlZCBvciBkaXNhYmxlZC4KKyAgICAgCSAgICAgKi8KKwkJCXVsRGlzcGxheUN0cmxSZWcgPSBGSUVMRF9TRVQodWxEaXNwbGF5Q3RybFJlZywKKwkJCQkJCQkJUEFORUxfRElTUExBWV9DVFJMLCBUSU1JTkcsIEVOQUJMRSk7CisJCQlQT0tFMzIoUEFORUxfRElTUExBWV9DVFJMLCB1bERpc3BsYXlDdHJsUmVnKTsKKworCQkJdWxEaXNwbGF5Q3RybFJlZyA9IEZJRUxEX1NFVCh1bERpc3BsYXlDdHJsUmVnLAorCQkJCQkJCQlQQU5FTF9ESVNQTEFZX0NUUkwsIFBMQU5FLCBFTkFCTEUpOworCisJCQkvKiBBZGRlZCBzb21lIG1hc2tzIHRvIG1hc2sgb3V0IHRoZSByZXNlcnZlZCBiaXRzLgorCQkJICogU29tZXRpbWVzLCB0aGUgcmVzZXJ2ZWQgYml0cyBhcmUgc2V0L3Jlc2V0IHJhbmRvbWx5IHdoZW4KKwkJCSAqIHdyaXRpbmcgdG8gdGhlIFBSSU1BUllfRElTUExBWV9DVFJMLCB0aGVyZWZvcmUsIHRoZSByZWdpc3RlcgorCQkJICogcmVzZXJ2ZWQgYml0cyBhcmUgbmVlZGVkIHRvIGJlIG1hc2tlZCBvdXQuCisJCQkgKi8KKwkJCXVsUmVzZXJ2ZWRCaXRzID0gRklFTERfU0VUKDAsIFBBTkVMX0RJU1BMQVlfQ1RSTCwgUkVTRVJWRURfMV9NQVNLLCBFTkFCTEUpIHwKKwkJCQlGSUVMRF9TRVQoMCwgUEFORUxfRElTUExBWV9DVFJMLCBSRVNFUlZFRF8yX01BU0ssIEVOQUJMRSkgfAorCQkJCUZJRUxEX1NFVCgwLCBQQU5FTF9ESVNQTEFZX0NUUkwsIFJFU0VSVkVEXzNfTUFTSywgRU5BQkxFKTsKKworCQkJLyogU29tZWhvdyB0aGUgcmVnaXN0ZXIgdmFsdWUgb24gdGhlIHBsYW5lIGlzIG5vdCBzZXQKKwkJCSAqIHVudGlsIGEgZmV3IGRlbGF5LiBOZWVkIHRvIHdyaXRlCisJCQkgKiBhbmQgcmVhZCBpdCBhIGNvdXBsZSB0aW1lcworCQkJICovCisJCQlkbworCQkJeworCQkJCWNudCsrOworCQkJCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwsIHVsRGlzcGxheUN0cmxSZWcpOworCQkJfSB3aGlsZSgoUEVFSzMyKFBBTkVMX0RJU1BMQVlfQ1RSTCkgJiB+dWxSZXNlcnZlZEJpdHMpICE9CisJCQkJCSh1bERpc3BsYXlDdHJsUmVnICYgfnVsUmVzZXJ2ZWRCaXRzKSk7CisJCQlwcmludGsoIlNldCBQYW5lbCBQbGFuZSBlbmJpdDphZnRlciB0cmllZCAlZCB0aW1lc1xuIixjbnQpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogV2hlbiB0dXJuaW5nIG9mZiwgdGhlcmUgaXMgbm8gcnVsZSBvbiB0aGUgcHJvZ3JhbW1pbmcKKwkJCSAqIHNlcXVlbmNlIHNpbmNlIHdoZW5ldmVyIHRoZSBjbG9jayBpcyBvZmYsIHRoZW4gaXQgZG9lcyBub3QKKwkJCSAqIG1hdHRlciB3aGV0aGVyIHRoZSBwbGFuZSBpcyBlbmFibGVkIG9yIGRpc2FibGVkLgorCQkJICogTm90ZTogTW9kaWZ5aW5nIHRoZSBwbGFuZSBiaXQgd2lsbCB0YWtlIGVmZmVjdCBvbiB0aGUKKwkJCSAqIG5leHQgdmVydGljYWwgc3luYy4gTmVlZCB0byBmaW5kIG91dCBpZiBpdCBpcyBuZWNlc3NhcnkgdG8KKwkJCSAqIHdhaXQgZm9yIDEgdnN5bmMgYmVmb3JlIG1vZGlmeWluZyB0aGUgdGltaW5nIGVuYWJsZSBiaXQuCisJCQkgKiAqLworCQkJdWxEaXNwbGF5Q3RybFJlZyA9IEZJRUxEX1NFVCh1bERpc3BsYXlDdHJsUmVnLAorCQkJCQkJCQlQQU5FTF9ESVNQTEFZX0NUUkwsIFBMQU5FLCBESVNBQkxFKTsKKwkJCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwsIHVsRGlzcGxheUN0cmxSZWcpOworCisJCQl1bERpc3BsYXlDdHJsUmVnID0gRklFTERfU0VUKHVsRGlzcGxheUN0cmxSZWcsCisJCQkJCQkJCVBBTkVMX0RJU1BMQVlfQ1RSTCwgVElNSU5HLCBESVNBQkxFKTsKKwkJCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwsIHVsRGlzcGxheUN0cmxSZWcpOworCQl9CisKKwl9CisJLyogU2V0IHRoZSBzZWNvbmRhcnkgZGlzcGxheSBjb250cm9sICovCisJZWxzZQorCXsKKwkJdWxEaXNwbGF5Q3RybFJlZyA9IFBFRUszMihDUlRfRElTUExBWV9DVFJMKTsKKworCQlpZiAoZGlzcFN0YXRlKQorCQl7CisJCQkvKiBUaW1pbmcgc2hvdWxkIGJlIGVuYWJsZWQgZmlyc3QgYmVmb3JlIGVuYWJsaW5nIHRoZSBwbGFuZSBiZWNhdXNlIGNoYW5naW5nIGF0IHRoZQorCQkJICAgc2FtZSB0aW1lIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHRoZSBwbGFuZSB3aWxsIGFsc28gZW5hYmxlZCBvciBkaXNhYmxlZC4KKwkJCSAgICovCisJCQl1bERpc3BsYXlDdHJsUmVnID0gRklFTERfU0VUKHVsRGlzcGxheUN0cmxSZWcsCisJCQkJCQkJCUNSVF9ESVNQTEFZX0NUUkwsIFRJTUlORywgRU5BQkxFKTsKKwkJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLCB1bERpc3BsYXlDdHJsUmVnKTsKKworCQkJdWxEaXNwbGF5Q3RybFJlZyA9IEZJRUxEX1NFVCh1bERpc3BsYXlDdHJsUmVnLAorCQkJCQkJCQlDUlRfRElTUExBWV9DVFJMLCBQTEFORSwgRU5BQkxFKTsKKworCQkJLyogQWRkZWQgc29tZSBtYXNrcyB0byBtYXNrIG91dCB0aGUgcmVzZXJ2ZWQgYml0cy4KKwkJCSAqIFNvbWV0aW1lcywgdGhlIHJlc2VydmVkIGJpdHMgYXJlIHNldC9yZXNldCByYW5kb21seSB3aGVuCisJCQkgKiB3cml0aW5nIHRvIHRoZSBQUklNQVJZX0RJU1BMQVlfQ1RSTCwgdGhlcmVmb3JlLCB0aGUgcmVnaXN0ZXIKKwkJCSAqIHJlc2VydmVkIGJpdHMgYXJlIG5lZWRlZCB0byBiZSBtYXNrZWQgb3V0LgorCQkJICovCisKKwkJCXVsUmVzZXJ2ZWRCaXRzID0gRklFTERfU0VUKDAsIENSVF9ESVNQTEFZX0NUUkwsIFJFU0VSVkVEXzFfTUFTSywgRU5BQkxFKSB8CisJCQkJRklFTERfU0VUKDAsIENSVF9ESVNQTEFZX0NUUkwsIFJFU0VSVkVEXzJfTUFTSywgRU5BQkxFKSB8CisJCQkJRklFTERfU0VUKDAsIENSVF9ESVNQTEFZX0NUUkwsIFJFU0VSVkVEXzNfTUFTSywgRU5BQkxFKSB8CisJCQkJRklFTERfU0VUKDAsIENSVF9ESVNQTEFZX0NUUkwsIFJFU0VSVkVEXzRfTUFTSywgRU5BQkxFKTsKKworCQkJZG8KKwkJCXsKKwkJCQljbnQrKzsKKwkJCQlQT0tFMzIoQ1JUX0RJU1BMQVlfQ1RSTCwgdWxEaXNwbGF5Q3RybFJlZyk7CisJCQl9IHdoaWxlKChQRUVLMzIoQ1JUX0RJU1BMQVlfQ1RSTCkgJiB+dWxSZXNlcnZlZEJpdHMpICE9CisJCQkJCSh1bERpc3BsYXlDdHJsUmVnICYgfnVsUmVzZXJ2ZWRCaXRzKSk7CisJCQkJcHJpbnRrKCJTZXQgQ3J0IFBsYW5lIGVuYml0OmFmdGVyIHRyaWVkICVkIHRpbWVzXG4iLGNudCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBXaGVuIHR1cm5pbmcgb2ZmLCB0aGVyZSBpcyBubyBydWxlIG9uIHRoZSBwcm9ncmFtbWluZworCQkJICogc2VxdWVuY2Ugc2luY2Ugd2hlbmV2ZXIgdGhlIGNsb2NrIGlzIG9mZiwgdGhlbiBpdCBkb2VzIG5vdAorCQkJICogbWF0dGVyIHdoZXRoZXIgdGhlIHBsYW5lIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuCisJCQkgKiBOb3RlOiBNb2RpZnlpbmcgdGhlIHBsYW5lIGJpdCB3aWxsIHRha2UgZWZmZWN0IG9uIHRoZSBuZXh0CisJCQkgKiB2ZXJ0aWNhbCBzeW5jLiBOZWVkIHRvIGZpbmQgb3V0IGlmIGl0IGlzIG5lY2Vzc2FyeSB0bworCQkJICogd2FpdCBmb3IgMSB2c3luYyBiZWZvcmUgbW9kaWZ5aW5nIHRoZSB0aW1pbmcgZW5hYmxlIGJpdC4KKwkJCSAqLworCQkJdWxEaXNwbGF5Q3RybFJlZyA9IEZJRUxEX1NFVCh1bERpc3BsYXlDdHJsUmVnLAorCQkJCQkJCQlDUlRfRElTUExBWV9DVFJMLCBQTEFORSwgRElTQUJMRSk7CisJCQlQT0tFMzIoQ1JUX0RJU1BMQVlfQ1RSTCwgdWxEaXNwbGF5Q3RybFJlZyk7CisKKwkJCXVsRGlzcGxheUN0cmxSZWcgPSBGSUVMRF9TRVQodWxEaXNwbGF5Q3RybFJlZywKKwkJCQkJCQkJQ1JUX0RJU1BMQVlfQ1RSTCwgVElNSU5HLCBESVNBQkxFKTsKKwkJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLCB1bERpc3BsYXlDdHJsUmVnKTsKKwkJfQorCX0KK30KKworCitzdGF0aWMgdm9pZCB3YWl0TmV4dFZlcnRpY2FsU3luYyhpbnQgY3RybCxpbnQgZGVsYXkpCit7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKwlpZighY3RybCl7CisJCS8qIHByaW1hcnkgY29udHJvbGxlciAqLworCisgICAgICAgIC8qIERvIG5vdCB3YWl0IHdoZW4gdGhlIFByaW1hcnkgUExMIGlzIG9mZiBvciBkaXNwbGF5IGNvbnRyb2wgaXMgYWxyZWFkeSBvZmYuCisJICAgICAgICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgc29mdHdhcmUgdG8gd2FpdCBmb3JldmVyLiAqLworCQlpZiAoKEZJRUxEX0dFVChQRUVLMzIoUEFORUxfUExMX0NUUkwpLCBQQU5FTF9QTExfQ1RSTCwgUE9XRVIpID09CisJCQkgUEFORUxfUExMX0NUUkxfUE9XRVJfT0ZGKSB8fAorCQkJKEZJRUxEX0dFVChQRUVLMzIoUEFORUxfRElTUExBWV9DVFJMKSwgUEFORUxfRElTUExBWV9DVFJMLCBUSU1JTkcpID09CisJCQkgUEFORUxfRElTUExBWV9DVFJMX1RJTUlOR19ESVNBQkxFKSkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKyAgICAgICAgd2hpbGUgKGRlbGF5LS0gPiAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBXYWl0IGZvciBlbmQgb2YgdnN5bmMuICovCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IEZJRUxEX0dFVChQRUVLMzIoU1lTVEVNX0NUUkwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTWVNURU1fQ1RSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFORUxfVlNZTkMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUgKHN0YXR1cyA9PSBTWVNURU1fQ1RSTF9QQU5FTF9WU1lOQ19BQ1RJVkUpOworCisgICAgICAgICAgICAvKiBXYWl0IGZvciBzdGFydCBvZiB2c3luYy4gKi8KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gRklFTERfR0VUKFBFRUszMihTWVNURU1fQ1RSTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU1RFTV9DVFJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQU5FTF9WU1lOQyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoc3RhdHVzID09IFNZU1RFTV9DVFJMX1BBTkVMX1ZTWU5DX0lOQUNUSVZFKTsKKyAgICAgICAgfQorCisJfWVsc2V7CisKKwkJLyogRG8gbm90IHdhaXQgd2hlbiB0aGUgUHJpbWFyeSBQTEwgaXMgb2ZmIG9yIGRpc3BsYXkgY29udHJvbCBpcyBhbHJlYWR5IG9mZi4KKwkJCSAgIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBzb2Z0d2FyZSB0byB3YWl0IGZvcmV2ZXIuICovCisJCWlmICgoRklFTERfR0VUKFBFRUszMihDUlRfUExMX0NUUkwpLCBDUlRfUExMX0NUUkwsIFBPV0VSKSA9PQorCQkJIENSVF9QTExfQ1RSTF9QT1dFUl9PRkYpIHx8CisJCQkoRklFTERfR0VUKFBFRUszMihDUlRfRElTUExBWV9DVFJMKSwgQ1JUX0RJU1BMQVlfQ1RSTCwgVElNSU5HKSA9PQorCQkJIENSVF9ESVNQTEFZX0NUUkxfVElNSU5HX0RJU0FCTEUpKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQl3aGlsZSAoZGVsYXktLSA+IDApCisJCXsKKwkJCS8qIFdhaXQgZm9yIGVuZCBvZiB2c3luYy4gKi8KKwkJCWRvCisJCQl7CisJCQkJc3RhdHVzID0gRklFTERfR0VUKFBFRUszMihTWVNURU1fQ1RSTCksCisJCQkJCQkJCSAgIFNZU1RFTV9DVFJMLAorCQkJCQkJCQkgICBDUlRfVlNZTkMpOworCQkJfQorCQkJd2hpbGUgKHN0YXR1cyA9PSBTWVNURU1fQ1RSTF9DUlRfVlNZTkNfQUNUSVZFKTsKKworCQkJLyogV2FpdCBmb3Igc3RhcnQgb2YgdnN5bmMuICovCisJCQlkbworCQkJeworCQkJCXN0YXR1cyA9IEZJRUxEX0dFVChQRUVLMzIoU1lTVEVNX0NUUkwpLAorCQkJCQkJCQkgICBTWVNURU1fQ1RSTCwKKwkJCQkJCQkJICAgQ1JUX1ZTWU5DKTsKKwkJCX0KKwkJCXdoaWxlIChzdGF0dXMgPT0gU1lTVEVNX0NUUkxfQ1JUX1ZTWU5DX0lOQUNUSVZFKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc3dQYW5lbFBvd2VyU2VxdWVuY2UoaW50IGRpc3AsaW50IGRlbGF5KQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwkvKiBkaXNwIHNob3VsZCBiZSAxIHRvIG9wZW4gc2VxdWVuY2UgKi8KKwlyZWcgPSBQRUVLMzIoUEFORUxfRElTUExBWV9DVFJMKTsKKwlyZWcgPSBGSUVMRF9WQUxVRShyZWcsUEFORUxfRElTUExBWV9DVFJMLEZQRU4sZGlzcCk7CisJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCxyZWcpOworCXByaW1hcnlXYWl0VmVydGljYWxTeW5jKGRlbGF5KTsKKworCisJcmVnID0gUEVFSzMyKFBBTkVMX0RJU1BMQVlfQ1RSTCk7CisJcmVnID0gRklFTERfVkFMVUUocmVnLFBBTkVMX0RJU1BMQVlfQ1RSTCxEQVRBLGRpc3ApOworCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwscmVnKTsKKwlwcmltYXJ5V2FpdFZlcnRpY2FsU3luYyhkZWxheSk7CisKKwlyZWcgPSBQRUVLMzIoUEFORUxfRElTUExBWV9DVFJMKTsKKwlyZWcgPSBGSUVMRF9WQUxVRShyZWcsUEFORUxfRElTUExBWV9DVFJMLFZCSUFTRU4sZGlzcCk7CisJUE9LRTMyKFBBTkVMX0RJU1BMQVlfQ1RSTCxyZWcpOworCXByaW1hcnlXYWl0VmVydGljYWxTeW5jKGRlbGF5KTsKKworCisJcmVnID0gUEVFSzMyKFBBTkVMX0RJU1BMQVlfQ1RSTCk7CisJcmVnID0gRklFTERfVkFMVUUocmVnLFBBTkVMX0RJU1BMQVlfQ1RSTCxGUEVOLGRpc3ApOworCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwscmVnKTsKKwlwcmltYXJ5V2FpdFZlcnRpY2FsU3luYyhkZWxheSk7CisKK30KKwordm9pZCBkZGs3NTBfc2V0TG9naWNhbERpc3BPdXQoZGlzcF9vdXRwdXRfdCBvdXRwdXQpCit7CisJdW5zaWduZWQgaW50IHJlZzsKKwlpZihvdXRwdXQgJiBQTkxfMl9VU0FHRSl7CisJCS8qIHNldCBwYW5lbCBwYXRoIGNvbnRyb2xsZXIgc2VsZWN0ICovCisJCXJlZyA9IFBFRUszMihQQU5FTF9ESVNQTEFZX0NUUkwpOworCQlyZWcgPSBGSUVMRF9WQUxVRShyZWcsUEFORUxfRElTUExBWV9DVFJMLFNFTEVDVCwob3V0cHV0ICYgUE5MXzJfTUFTSyk+PlBOTF8yX09GRlNFVCk7CisJCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwscmVnKTsKKwl9CisKKwlpZihvdXRwdXQgJiBDUlRfMl9VU0FHRSl7CisJCS8qIHNldCBjcnQgcGF0aCBjb250cm9sbGVyIHNlbGVjdCAqLworCQlyZWcgPSBQRUVLMzIoQ1JUX0RJU1BMQVlfQ1RSTCk7CisJCXJlZyA9IEZJRUxEX1ZBTFVFKHJlZyxDUlRfRElTUExBWV9DVFJMLFNFTEVDVCwob3V0cHV0ICYgQ1JUXzJfTUFTSyk+PkNSVF8yX09GRlNFVCk7CisJCS8qc2UgYmxhbmsgb2ZmICovCisJCXJlZyA9IEZJRUxEX1NFVChyZWcsQ1JUX0RJU1BMQVlfQ1RSTCxCTEFOSyxPRkYpOworCQlQT0tFMzIoQ1JUX0RJU1BMQVlfQ1RSTCxyZWcpOworCisJfQorCisJaWYob3V0cHV0ICYgUFJJX1RQX1VTQUdFKXsKKwkJLyogc2V0IHByaW1hcnkgdGltaW5nIGFuZCBwbGFuZSBlbl9iaXQgKi8KKwkJc2V0RGlzcGxheUNvbnRyb2woMCwob3V0cHV0JlBSSV9UUF9NQVNLKT4+UFJJX1RQX09GRlNFVCk7CisJfQorCisJaWYob3V0cHV0ICYgU0VDX1RQX1VTQUdFKXsKKwkJLyogc2V0IHNlY29uZGFyeSB0aW1pbmcgYW5kIHBsYW5lIGVuX2JpdCovCisJCXNldERpc3BsYXlDb250cm9sKDEsKG91dHB1dCZTRUNfVFBfTUFTSyk+PlNFQ19UUF9PRkZTRVQpOworCX0KKworCWlmKG91dHB1dCAmIFBOTF9TRVFfVVNBR0UpeworCQkvKiBzZXQgIHBhbmVsIHNlcXVlbmNlICovCisJCXN3UGFuZWxQb3dlclNlcXVlbmNlKChvdXRwdXQmUE5MX1NFUV9NQVNLKT4+UE5MX1NFUV9PRkZTRVQsNCk7CisJfQorCisJaWYob3V0cHV0ICYgREFDX1VTQUdFKQorCQlzZXREQUMoKG91dHB1dCAmIERBQ19NQVNLKT4+REFDX09GRlNFVCk7CisKKwlpZihvdXRwdXQgJiBEUE1TX1VTQUdFKQorCQlkZGs3NTBfc2V0RFBNUygob3V0cHV0ICYgRFBNU19NQVNLKSA+PiBEUE1TX09GRlNFVCk7Cit9CisKKworaW50IGRkazc1MF9pbml0RFZJRGlzcCh2b2lkKQoreworICAgIC8qIEluaXRpYWxpemUgRFZJLiBJZiB0aGUgZHZpSW5pdCBmYWlsIGFuZCB0aGUgVmVuZG9ySUQgb3IgdGhlIERldmljZUlEIGFyZQorICAgICAgIG5vdCB6ZXJvZWQsIHRoZW4gc2V0IHRoZSBmYWlsdXJlIGZsYWcuIElmIGl0IGlzIHplcm9lLCBpdCBtaWdodCBtZWFuCisgICAgICAgdGhhdCB0aGUgc3lzdGVtIGlzIGluIER1YWwgQ1JUIE1vbml0b3IgY29uZmlndXJhdGlvbi4gKi8KKworICAgIC8qIERlLXNrZXcgZW5hYmxlZCB3aXRoIGRlZmF1bHQgMTExYiB2YWx1ZS4KKyAgICAgICBUaGlzIHdpbGwgZml4IHNvbWUgYXJ0aWZhY3RzIHByb2JsZW0gaW4gc29tZSBtb2RlIG9uIGJvYXJkIDIuMi4KKyAgICAgICBTb21laG93IHRoaXMgZml4IGRvZXMgbm90IGFmZmVjdCBib2FyZCAyLjEuCisgICAgICovCisgICAgaWYgKChkdmlJbml0KDEsICAvKiBTZWxlY3QgUmlzaW5nIEVkZ2UgKi8KKyAgICAgICAgICAgICAgICAxLCAgLyogU2VsZWN0IDI0LWJpdCBidXMgKi8KKyAgICAgICAgICAgICAgICAwLCAgLyogU2VsZWN0IFNpbmdsZSBFZGdlIGNsb2NrICovCisgICAgICAgICAgICAgICAgMSwgIC8qIEVuYWJsZSBIU3luYyBhcyBpcyAqLworICAgICAgICAgICAgICAgIDEsICAvKiBFbmFibGUgVlN5bmMgYXMgaXMgKi8KKyAgICAgICAgICAgICAgICAxLCAgLyogRW5hYmxlIERlLXNrZXcgKi8KKyAgICAgICAgICAgICAgICA3LCAgLyogU2V0IHRoZSBkZS1za2V3IHNldHRpbmcgdG8gbWF4aW11bSBzZXR1cCAqLworICAgICAgICAgICAgICAgIDEsICAvKiBFbmFibGUgY29udGludW91cyBTeW5jICovCisgICAgICAgICAgICAgICAgMSwgIC8qIEVuYWJsZSBQTEwgRmlsdGVyICovCisgICAgICAgICAgICAgICAgNCAgIC8qIFVzZSB0aGUgcmVjb21tZW5kZWQgdmFsdWUgZm9yIFBMTCBGaWx0ZXIgdmFsdWUgKi8KKyAgICAgICAgKSAhPSAwKSAmJiAoZHZpR2V0VmVuZG9ySUQoKSAhPSAweDAwMDApICYmIChkdmlHZXREZXZpY2VJRCgpICE9IDB4MDAwMCkpCisgICAgeworICAgICAgICByZXR1cm4gKC0xKTsKKyAgICB9CisKKyAgICAvKiBUT0RPOiBJbml0aWFsaXplIG90aGVyIGRpc3BsYXkgY29tcG9uZW50ICovCisKKyAgICAvKiBTdWNjZXNzICovCisgICAgcmV0dXJuIDA7CisKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2Rpc3BsYXkuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kaXNwbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwZjg0YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kaXNwbGF5LmgKQEAgLTAsMCArMSwxNjAgQEAKKyNpZm5kZWYgRERLNzUwX0RJU1BMQVlfSF9fCisjZGVmaW5lIERESzc1MF9ESVNQTEFZX0hfXworCisvKiBwYW5lbCBwYXRoIHNlbGVjdAorCTgwMDAwWzI5OjI4XQorKi8KKworI2RlZmluZSBQTkxfMl9PRkZTRVQgMAorI2RlZmluZSBQTkxfMl9NQVNLICgzIDw8IFBOTF8yX09GRlNFVCkKKyNkZWZpbmUgUE5MXzJfVVNBR0UJKFBOTF8yX01BU0sgPDwgMTYpCisjZGVmaW5lIFBOTF8yX1BSSSAJKCgwIDw8IFBOTF8yX09GRlNFVCl8UE5MXzJfVVNBR0UpCisjZGVmaW5lIFBOTF8yX1NFQwkoKDIgPDwgUE5MXzJfT0ZGU0VUKXxQTkxfMl9VU0FHRSkKKworCisvKiBwcmltYXJ5IHRpbWluZyAmIHBsYW5lIGVuYWJsZSBiaXQKKwkxOiA4MDAwMFs4XSAmIDgwMDAwWzJdIG9uCisJMDogYm90aCBvZmYKKyovCisjZGVmaW5lIFBSSV9UUF9PRkZTRVQgNAorI2RlZmluZSBQUklfVFBfTUFTSyAoMSA8PCBQUklfVFBfT0ZGU0VUKQorI2RlZmluZSBQUklfVFBfVVNBR0UgKFBSSV9UUF9NQVNLIDw8IDE2KQorI2RlZmluZSBQUklfVFBfT04gKCgweDEgPDwgUFJJX1RQX09GRlNFVCl8UFJJX1RQX1VTQUdFKQorI2RlZmluZSBQUklfVFBfT0ZGICgoMHgwIDw8IFBSSV9UUF9PRkZTRVQpfFBSSV9UUF9VU0FHRSkKKworCisvKiBwYW5lbCBzZXF1ZW5jeSBzdGF0dXMKKwk4MDAwMFsyNzoyNF0KKyovCisjZGVmaW5lIFBOTF9TRVFfT0ZGU0VUIDYKKyNkZWZpbmUgUE5MX1NFUV9NQVNLICgxIDw8IFBOTF9TRVFfT0ZGU0VUKQorI2RlZmluZSBQTkxfU0VRX1VTQUdFIChQTkxfU0VRX01BU0sgPDwgMTYpCisjZGVmaW5lIFBOTF9TRVFfT04gKCgxIDw8IFBOTF9TRVFfT0ZGU0VUKXxQTkxfU0VRX1VTQUdFKQorI2RlZmluZSBQTkxfU0VRX09GRiAoKDAgPDwgUE5MX1NFUV9PRkZTRVQpfFBOTF9TRVFfVVNBR0UpCisKKy8qIGR1YWwgZGlnaXRhbCBvdXRwdXQKKwk4MDAwMFsxOV0KKyovCisjZGVmaW5lIERVQUxfVEZUX09GRlNFVCA4CisjZGVmaW5lIERVQUxfVEZUX01BU0sgKDEgPDwgRFVBTF9URlRfT0ZGU0VUKQorI2RlZmluZSBEVUFMX1RGVF9VU0FHRSAoRFVBTF9URlRfTUFTSyA8PCAxNikKKyNkZWZpbmUgRFVBTF9URlRfT04gKCgxIDw8IERVQUxfVEZUX09GRlNFVCl8RFVBTF9URlRfVVNBR0UpCisjZGVmaW5lIERVQUxfVEZUX09GRiAoKDAgPDwgRFVBTF9URlRfT0ZGU0VUKXxEVUFMX1RGVF9VU0FHRSkKKworLyogc2Vjb25kYXJ5IHRpbWluZyAmIHBsYW5lIGVuYWJsZSBiaXQKKwkxOjgwMjAwWzhdICYgODAyMDBbMl0gb24KKwkwOiBib3RoIG9mZgorKi8KKyNkZWZpbmUgU0VDX1RQX09GRlNFVCA1CisjZGVmaW5lIFNFQ19UUF9NQVNLICgxPDwgU0VDX1RQX09GRlNFVCkKKyNkZWZpbmUgU0VDX1RQX1VTQUdFIChTRUNfVFBfTUFTSyA8PCAxNikKKyNkZWZpbmUgU0VDX1RQX09OICAoKDB4MSA8PCBTRUNfVFBfT0ZGU0VUKXxTRUNfVFBfVVNBR0UpCisjZGVmaW5lIFNFQ19UUF9PRkYgKCgweDAgPDwgU0VDX1RQX09GRlNFVCl8U0VDX1RQX1VTQUdFKQorCisvKiBjcnQgcGF0aCBzZWxlY3QKKwk4MDIwMFsxOToxOF0KKyovCisjZGVmaW5lIENSVF8yX09GRlNFVCAyCisjZGVmaW5lIENSVF8yX01BU0sgKDMgPDwgQ1JUXzJfT0ZGU0VUKQorI2RlZmluZSBDUlRfMl9VU0FHRSAoQ1JUXzJfTUFTSyA8PCAxNikKKyNkZWZpbmUgQ1JUXzJfUFJJICgoMHgwIDw8IENSVF8yX09GRlNFVCl8Q1JUXzJfVVNBR0UpCisjZGVmaW5lIENSVF8yX1NFQyAoKDB4MiA8PCBDUlRfMl9PRkZTRVQpfENSVF8yX1VTQUdFKQorCisKKy8qIERBQyBhZmZlY3QgYm90aCBEVkkgYW5kIERTVUIKKwk0WzIwXQorKi8KKyNkZWZpbmUgREFDX09GRlNFVCA3CisjZGVmaW5lIERBQ19NQVNLICgxIDw8IERBQ19PRkZTRVQpCisjZGVmaW5lIERBQ19VU0FHRSAoREFDX01BU0sgPDwgMTYpCisjZGVmaW5lIERBQ19PTiAoKDB4MDw8IERBQ19PRkZTRVQpfERBQ19VU0FHRSkKKyNkZWZpbmUgREFDX09GRiAoKDB4MSA8PCBEQUNfT0ZGU0VUKXxEQUNfVVNBR0UpCisKKy8qIERQTVMgb25seSBhZmZlY3QgRC1TVUIgaGVhZAorCTBbMzE6MzBdCisqLworI2RlZmluZSBEUE1TX09GRlNFVCA5CisjZGVmaW5lIERQTVNfTUFTSyAoMyA8PCBEUE1TX09GRlNFVCkKKyNkZWZpbmUgRFBNU19VU0FHRSAoRFBNU19NQVNLIDw8IDE2KQorI2RlZmluZSBEUE1TX09GRiAoKDMgPDwgRFBNU19PRkZTRVQpfERQTVNfVVNBR0UpCisjZGVmaW5lIERQTVNfT04gKCgwIDw8IERQTVNfT0ZGU0VUKXxEUE1TX1VTQUdFKQorCisKKworLyoKKwlMQ0QxIG1lYW5zIHBhbmVsIHBhdGggVEZUMSAgJiBwYW5lbCBwYXRoIERWSSAoc28gZW5hYmxlIERBQykKKwlDUlQgbWVhbnMgY3J0IHBhdGggRFNVQgorKi8KKyNpZiAwCit0eXBlZGVmIGVudW0gX2Rpc3Bfb3V0cHV0X3QKK3sKKwlOT19ESVNQTEFZID0gRFBNU19PRkYsCisKKwlMQ0QxX1BSSSA9IFBOTF8yX1BSSXxQUklfVFBfT058UE5MX1NFUV9PTnxEUE1TX09GRnxEQUNfT04sCisJTENEMV9TRUMgPSBQTkxfMl9TRUN8U0VDX1RQX09OfFBOTF9TRVFfT058RFBNU19PRkZ8REFDX09OLAorCisJTENEMl9QUkkgPSBDUlRfMl9QUkl8UFJJX1RQX09OfERVQUxfVEZUX09OfERQTVNfT0ZGLAorCUxDRDJfU0VDID0gQ1JUXzJfU0VDfFNFQ19UUF9PTnxEVUFMX1RGVF9PTnxEUE1TX09GRiwKKworCURTVUJfUFJJID0gQ1JUXzJfUFJJfFBSSV9UUF9PTnxEQUNfT04sCisJRFNVQl9TRUMgPSBDUlRfMl9TRUN8U0VDX1RQX09OfERBQ19PTiwKKworCUxDRDFfRFNVQl9QUkkgPSBQTkxfMl9QUkl8UFJJX1RQX09OfFBOTF9TRVFfT058CisJCQkJCUNSVF8yX1BSSXxTRUNfVFBfT0ZGfERBQ19PTiwKKworCUxDRDFfRFNVQl9TRUMgPSBQTkxfMl9TRUN8U0VDX1RQX09OfFBOTF9TRVFfT058CisJCQkJCUNSVF8yX1NFQ3xQUklfVFBfT0ZGfERBQ19PTiwKKworCS8qIExDRDEgc2hvdyBwcmltYXJ5IGFuZCBEU1VCIHNob3cgc2Vjb25kYXJ5ICovCisJTENEMV9EU1VCX0RVQUwgPSBQTkxfMl9QUkl8UFJJX1RQX09OfFBOTF9TRVFfT058CisJCQkJCSBDUlRfMl9TRUN8U0VDX1RQX09OfERBQ19PTiwKKworCS8qIExDRDEgc2hvdyBzZWNvbmRhcnkgYW5kIERTVUIgc2hvdyBwcmltYXJ5ICovCisJTENEMV9EU1VCX0RVQUxfU1dBUCA9IFBOTF8yX1NFQ3xTRUNfVFBfT058UE5MX1NFUV9PTnwKKwkJCQkJCQlDUlRfMl9QUkl8UFJJX1RQX09OfERBQ19PTiwKKworCUxDRDFfTENEMl9QUkkgPSBQTkxfMl9QUkl8UFJJX1RQX09OfFBOTF9TRVFfT058CisJCQkJCUNSVF8yX1BSSXxTRUNfVFBfT0ZGfERQTVNfT0ZGfERVQUxfVEZUX09OLAorCisJTENEMV9MQ0QyX1NFQyA9IFBOTF8yX1NFQ3xTRUNfVFBfT058UE5MX1NFUV9PTnwKKwkJCQkJQ1JUXzJfU0VDfFBSSV9UUF9PRkZ8RFBNU19PRkZ8RFVBTF9URlRfT04sCisKKwlMQ0QxX0xDRDJfRFNVQl9QUkkgPSBQTkxfMl9QUkl8UFJJX1RQX09OfFBOTF9TRVFfT058REFDX09OfAorCQkJCQkJQ1JUXzJfUFJJfFNFQ19UUF9PRkZ8RFBNU19PTnxEVUFMX1RGVF9PTiwKKworCUxDRDFfTENEMl9EU1VCX1NFQyA9IFBOTF8yX1NFQ3xTRUNfVFBfT058UE5MX1NFUV9PTnxEQUNfT058CisJCQkJCQlDUlRfMl9TRUN8UFJJX1RQX09GRnxEUE1TX09OfERVQUxfVEZUX09OLAorCisKK30KK2Rpc3Bfb3V0cHV0X3Q7CisjZWxzZQordHlwZWRlZiBlbnVtIF9kaXNwX291dHB1dF90eworCWRvX0xDRDFfUFJJID0gUE5MXzJfUFJJfFBSSV9UUF9PTnxQTkxfU0VRX09OfERBQ19PTiwKKwlkb19MQ0QxX1NFQyA9IFBOTF8yX1NFQ3xTRUNfVFBfT058UE5MX1NFUV9PTnxEQUNfT04sCisjaWYgMAorCWRvX0xDRDJfUFJJID0gQ1JUXzJfUFJJfFBSSV9UUF9PTiwKKwlkb19MQ0QyX1NFQyA9IENSVF8yX1NFQ3xTRUNfVFBfT04sCisjZWxzZQorCWRvX0xDRDJfUFJJID0gQ1JUXzJfUFJJfFBSSV9UUF9PTnxEVUFMX1RGVF9PTiwKKwlkb19MQ0QyX1NFQyA9IENSVF8yX1NFQ3xTRUNfVFBfT058RFVBTF9URlRfT04sCisjZW5kaWYKKwkvKgorCWRvX0RTVUJfUFJJID0gQ1JUXzJfUFJJfFBSSV9UUF9PTnxEUE1TX09OfERBQ19PTiwKKwlkb19EU1VCX1NFQyA9IENSVF8yX1NFQ3xTRUNfVFBfT058RFBNU19PTnxEQUNfT04sCisJKi8KKyNpZiAwCisJZG9fQ1JUX1BSSSA9IENSVF8yX1BSSXxQUklfVFBfT04sCisJZG9fQ1JUX1NFQyA9IENSVF8yX1NFQ3xTRUNfVFBfT04sCisjZWxzZQorCWRvX0NSVF9QUkkgPSBDUlRfMl9QUkl8UFJJX1RQX09OfERQTVNfT058REFDX09OLAorCWRvX0NSVF9TRUMgPSBDUlRfMl9TRUN8U0VDX1RQX09OfERQTVNfT058REFDX09OLAorI2VuZGlmCit9CitkaXNwX291dHB1dF90OworI2VuZGlmCisKK3ZvaWQgZGRrNzUwX3NldExvZ2ljYWxEaXNwT3V0KGRpc3Bfb3V0cHV0X3QpOworaW50IGRkazc1MF9pbml0RFZJRGlzcCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZHZpLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfZHZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5MzJiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kdmkuYwpAQCAtMCwwICsxLDk5IEBACisjZGVmaW5lIFVTRV9EVklDSElQIAorI2lmZGVmIFVTRV9EVklDSElQCisjaW5jbHVkZSAiZGRrNzUwX2hlbHAuaCIKKyNpbmNsdWRlICJkZGs3NTBfcmVnLmgiCisjaW5jbHVkZSAiZGRrNzUwX2R2aS5oIgorI2luY2x1ZGUgImRkazc1MF9zaWkxNjQuaCIKKworCisvKiBUaGlzIGdsb2JhbCB2YXJpYWJsZSBjb250YWlucyBhbGwgdGhlIHN1cHBvcnRlZCBkcml2ZXIgYW5kIGl0cyBjb3JyZXNwb25kaW5nCisgICBmdW5jdGlvbiBBUEkuIFBsZWFzZSBzZXQgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gTlVMTCB3aGVuZXZlciB0aGUgZnVuY3Rpb24KKyAgIGlzIG5vdCBzdXBwb3J0ZWQuICovCitzdGF0aWMgZHZpX2N0cmxfZGV2aWNlX3QgZ19kY2Z0U3VwcG9ydGVkRHZpQ29udHJvbGxlcltdID0KK3sKKyNpZmRlZiBEVklfQ1RSTF9TSUkxNjQKKyAgICB7CisgICAgICAgIC5wZm5Jbml0ID0gc2lpMTY0SW5pdENoaXAsCisgICAgICAgIC5wZm5HZXRWZW5kb3JJZCA9IHNpaTE2NEdldFZlbmRvcklELAorICAgICAgICAucGZuR2V0RGV2aWNlSWQgPSBzaWkxNjRHZXREZXZpY2VJRCwKKyNpZmRlZiBTSUkxNjRfRlVMTF9GVU5DVElPTlMKKyAgICAgICAgLnBmblJlc2V0Q2hpcCA9IHNpaTE2NFJlc2V0Q2hpcCwKKyAgICAgICAgLnBmbkdldENoaXBTdHJpbmcgPSBzaWkxNjRHZXRDaGlwU3RyaW5nLAorICAgICAgICAucGZuU2V0UG93ZXIgPSBzaWkxNjRTZXRQb3dlciwKKyAgICAgICAgLnBmbkVuYWJsZUhvdFBsdWdEZXRlY3Rpb24gPSBzaWkxNjRFbmFibGVIb3RQbHVnRGV0ZWN0aW9uLAorICAgICAgICAucGZuSXNDb25uZWN0ZWQgPSBzaWkxNjRJc0Nvbm5lY3RlZCwKKyAgICAgICAgLnBmbkNoZWNrSW50ZXJydXB0ID0gc2lpMTY0Q2hlY2tJbnRlcnJ1cHQsCisgICAgICAgIC5wZm5DbGVhckludGVycnVwdCA9IHNpaTE2NENsZWFySW50ZXJydXB0LAorI2VuZGlmCisgICAgfSwKKyNlbmRpZgorfTsKKworCitpbnQgZHZpSW5pdCgKKyAgICB1bnNpZ25lZCBjaGFyIGVkZ2VTZWxlY3QsCisgICAgdW5zaWduZWQgY2hhciBidXNTZWxlY3QsCisgICAgdW5zaWduZWQgY2hhciBkdWFsRWRnZUNsa1NlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGhzeW5jRW5hYmxlLAorICAgIHVuc2lnbmVkIGNoYXIgdnN5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBkZXNrZXdFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBkZXNrZXdTZXR0aW5nLAorICAgIHVuc2lnbmVkIGNoYXIgY29udGludW91c1N5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBwbGxGaWx0ZXJFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBwbGxGaWx0ZXJWYWx1ZQorCQkJKQoreworCWR2aV9jdHJsX2RldmljZV90ICpwQ3VycmVudER2aUN0cmw7CisJcEN1cnJlbnREdmlDdHJsID0gZ19kY2Z0U3VwcG9ydGVkRHZpQ29udHJvbGxlcjsKKwlpZihwQ3VycmVudER2aUN0cmwtPnBmbkluaXQgIT0gTlVMTCkKKwl7CisJCXJldHVybiBwQ3VycmVudER2aUN0cmwtPnBmbkluaXQoZWRnZVNlbGVjdCwgYnVzU2VsZWN0LCBkdWFsRWRnZUNsa1NlbGVjdCwgaHN5bmNFbmFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3luY0VuYWJsZSwgZGVza2V3RW5hYmxlLCBkZXNrZXdTZXR0aW5nLCBjb250aW51b3VzU3luY0VuYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsbEZpbHRlckVuYWJsZSwgcGxsRmlsdGVyVmFsdWUpOworCX0KKwlyZXR1cm4gLTE7Ly9lcnJvcgorfQorCisKKy8qCisgKiAgZHZpR2V0VmVuZG9ySUQKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBnZXRzIHRoZSB2ZW5kb3IgSUQgb2YgdGhlIERWSSBjb250cm9sbGVyIGNoaXAuCisgKgorICogIE91dHB1dDoKKyAqICAgICAgVmVuZG9yIElECisgKi8KK3Vuc2lnbmVkIHNob3J0IGR2aUdldFZlbmRvcklEKHZvaWQpCit7CisgICAgZHZpX2N0cmxfZGV2aWNlX3QgKnBDdXJyZW50RHZpQ3RybDsKKworICAgIC8vcEN1cnJlbnREdmlDdHJsID0gZ2V0RHZpQ3RybCgpOworICAgIHBDdXJyZW50RHZpQ3RybCA9IGdfZGNmdFN1cHBvcnRlZER2aUNvbnRyb2xsZXI7CisgICAgaWYgKHBDdXJyZW50RHZpQ3RybCAhPSAoZHZpX2N0cmxfZGV2aWNlX3QgKikwKQorICAgICAgICByZXR1cm4gcEN1cnJlbnREdmlDdHJsLT5wZm5HZXRWZW5kb3JJZCgpOworCisgICAgcmV0dXJuIDB4MDAwMDsKK30KKworCisvKgorICogIGR2aUdldERldmljZUlECisgKiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyB0aGUgZGV2aWNlIElEIG9mIHRoZSBEVkkgY29udHJvbGxlciBjaGlwLgorICoKKyAqICBPdXRwdXQ6CisgKiAgICAgIERldmljZSBJRAorICovCit1bnNpZ25lZCBzaG9ydCBkdmlHZXREZXZpY2VJRCh2b2lkKQoreworICAgIGR2aV9jdHJsX2RldmljZV90ICpwQ3VycmVudER2aUN0cmw7CisKKy8vICAgIHBDdXJyZW50RHZpQ3RybCA9IGdldER2aUN0cmwoKTsKKwlwQ3VycmVudER2aUN0cmwgPSBnX2RjZnRTdXBwb3J0ZWREdmlDb250cm9sbGVyOworICAgIGlmIChwQ3VycmVudER2aUN0cmwgIT0gKGR2aV9jdHJsX2RldmljZV90ICopMCkKKyAgICAgICAgcmV0dXJuIHBDdXJyZW50RHZpQ3RybC0+cGZuR2V0RGV2aWNlSWQoKTsKKworICAgIHJldHVybiAweDAwMDA7Cit9CisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kdmkuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9kdmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJjZWMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2R2aS5oCkBAIC0wLDAgKzEsNjcgQEAKKyNpZm5kZWYgRERLNzUwX0RWSV9IX18KKyNkZWZpbmUgRERLNzUwX0RWSV9IX18KKworLyogZHZpIGNoaXAgc3R1ZmZzIHN0cnVjdHJvcyAqLworCit0eXBlZGVmIGxvbmcgKCpQRk5fRFZJQ1RSTF9JTklUKSgKKyAgICB1bnNpZ25lZCBjaGFyIGVkZ2VTZWxlY3QsCisgICAgdW5zaWduZWQgY2hhciBidXNTZWxlY3QsCisgICAgdW5zaWduZWQgY2hhciBkdWFsRWRnZUNsa1NlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGhzeW5jRW5hYmxlLAorICAgIHVuc2lnbmVkIGNoYXIgdnN5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBkZXNrZXdFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBkZXNrZXdTZXR0aW5nLAorICAgIHVuc2lnbmVkIGNoYXIgY29udGludW91c1N5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBwbGxGaWx0ZXJFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBwbGxGaWx0ZXJWYWx1ZSk7Cit0eXBlZGVmIHZvaWQgKCpQRk5fRFZJQ1RSTF9SRVNFVENISVApKHZvaWQpOwordHlwZWRlZiBjaGFyKiAoKlBGTl9EVklDVFJMX0dFVENISVBTVFJJTkcpKHZvaWQpOwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAoKlBGTl9EVklDVFJMX0dFVFZFTkRPUklEKSh2b2lkKTsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgKCpQRk5fRFZJQ1RSTF9HRVRERVZJQ0VJRCkodm9pZCk7Cit0eXBlZGVmIHZvaWQgKCpQRk5fRFZJQ1RSTF9TRVRQT1dFUikodW5zaWduZWQgY2hhciBwb3dlclVwKTsKK3R5cGVkZWYgdm9pZCAoKlBGTl9EVklDVFJMX0hPVFBMVUdERVRFQ1RJT04pKHVuc2lnbmVkIGNoYXIgZW5hYmxlSG90UGx1Zyk7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKCpQRk5fRFZJQ1RSTF9JU0NPTk5FQ1RFRCkodm9pZCk7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgKCpQRk5fRFZJQ1RSTF9DSEVDS0lOVEVSUlVQVCkodm9pZCk7Cit0eXBlZGVmIHZvaWQgKCpQRk5fRFZJQ1RSTF9DTEVBUklOVEVSUlVQVCkodm9pZCk7CisKKworCisvKiBTdHJ1Y3R1cmUgdG8gaG9sZCBhbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIERWSSBDb250cm9sbGVyLiAqLwordHlwZWRlZiBzdHJ1Y3QgX2R2aV9jdHJsX2RldmljZV90Cit7CisgICAgUEZOX0RWSUNUUkxfSU5JVCAgICAgICAgICAgICAgICBwZm5Jbml0OworICAgIFBGTl9EVklDVFJMX1JFU0VUQ0hJUCAgICAgICAgICAgcGZuUmVzZXRDaGlwOworICAgIFBGTl9EVklDVFJMX0dFVENISVBTVFJJTkcgICAgICAgcGZuR2V0Q2hpcFN0cmluZzsKKyAgICBQRk5fRFZJQ1RSTF9HRVRWRU5ET1JJRCAgICAgICAgIHBmbkdldFZlbmRvcklkOworICAgIFBGTl9EVklDVFJMX0dFVERFVklDRUlEICAgICAgICAgcGZuR2V0RGV2aWNlSWQ7CisgICAgUEZOX0RWSUNUUkxfU0VUUE9XRVIgICAgICAgICAgICBwZm5TZXRQb3dlcjsKKyAgICBQRk5fRFZJQ1RSTF9IT1RQTFVHREVURUNUSU9OICAgIHBmbkVuYWJsZUhvdFBsdWdEZXRlY3Rpb247CisgICAgUEZOX0RWSUNUUkxfSVNDT05ORUNURUQgICAgICAgICBwZm5Jc0Nvbm5lY3RlZDsKKyAgICBQRk5fRFZJQ1RSTF9DSEVDS0lOVEVSUlVQVCAgICAgIHBmbkNoZWNrSW50ZXJydXB0OworICAgIFBGTl9EVklDVFJMX0NMRUFSSU5URVJSVVBUICAgICAgcGZuQ2xlYXJJbnRlcnJ1cHQ7Cit9IGR2aV9jdHJsX2RldmljZV90OworI2RlZmluZSBEVklfQ1RSTF9TSUkxNjQKKworCisKKy8qIGR2aSBmdW5jdGlvbnMgcHJvdG90eXBlICovCitpbnQgZHZpSW5pdCgKKyAgICB1bnNpZ25lZCBjaGFyIGVkZ2VTZWxlY3QsCisgICAgdW5zaWduZWQgY2hhciBidXNTZWxlY3QsCisgICAgdW5zaWduZWQgY2hhciBkdWFsRWRnZUNsa1NlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGhzeW5jRW5hYmxlLAorICAgIHVuc2lnbmVkIGNoYXIgdnN5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBkZXNrZXdFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBkZXNrZXdTZXR0aW5nLAorICAgIHVuc2lnbmVkIGNoYXIgY29udGludW91c1N5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBwbGxGaWx0ZXJFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBwbGxGaWx0ZXJWYWx1ZQorKTsKKwordW5zaWduZWQgc2hvcnQgZHZpR2V0VmVuZG9ySUQodm9pZCk7Cit1bnNpZ25lZCBzaG9ydCBkdmlHZXREZXZpY2VJRCh2b2lkKTsKKworCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaGVscC5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2hlbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhmZjNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2hlbHAuYwpAQCAtMCwwICsxLDE5IEBACisvLyNpbmNsdWRlICJkZGs3NTBfcmVnLmgiCisvLyNpbmNsdWRlICJkZGs3NTBfY2hpcC5oIgorI2luY2x1ZGUgImRkazc1MF9oZWxwLmgiCisKK3ZvaWQgX19pb21lbSAqIG1taW83NTAgPSBOVUxMOworY2hhciByZXZJZDc1MCA9IDA7Cit1bnNpZ25lZCBzaG9ydCBkZXZJZDc1MCA9IDA7CisKKy8qIGFmdGVyIGRyaXZlciBtYXBwZWQgaW8gcmVnaXN0ZXJzLCB1c2UgdGhpcyBmdW5jdGlvbiBmaXJzdCAqLwordm9pZCBkZGs3NTBfc2V0X21taW8odm9pZCBfX2lvbWVtICogYWRkcix1bnNpZ25lZCBzaG9ydCBkZXZJZCxjaGFyIHJldklkKQoreworCW1taW83NTAgPSBhZGRyOworCWRldklkNzUwID0gZGV2SWQ7CisJcmV2SWQ3NTAgPSByZXZJZDsKKwlpZihyZXZJZCA9PSAweGZlKQorCQlwcmludGsoImZvdW5kIHNtNzUwbGVcbiIpOworfQorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9oZWxwLmggYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaGVscC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YzgyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaGVscC5oCkBAIC0wLDAgKzEsMjkgQEAKKyNpZm5kZWYgRERLNzUwX0hFTFBfSF9fCisjZGVmaW5lIERESzc1MF9IRUxQX0hfXworI2luY2x1ZGUgImRkazc1MF9jaGlwLmgiCisjaWZuZGVmIFVTRV9JTlRFUk5BTF9SRUdJU1RFUl9BQ0NFU1MKKworI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAic203NTBfaGVscC5oIgorCisKKyNpZiAwCisvKiBpZiA3MTggYmlnIGVuZGlhbiB0dXJuZWQgb24sYmUgYXdhcmUgdGhhdCBkb24ndCB1c2UgdGhpcyBkcml2ZXIgZm9yIGdlbmVyYWwgdXNlLG9ubHkgZm9yIHBwYyBiaWctZW5kaWFuICovCisjd2FybmluZyAiYmlnIGVuZGlhbiBvbiB0YXJnZXQgY3B1IGFuZCBlbmFibGUgbmF0dXJlIGJpZyBlbmRpYW4gc3VwcG9ydCBvZiA3MTggY2FwYWJpbGl0eSAhIgorI2RlZmluZSBQRUVLMzIoYWRkcikgIAkJCV9fcmF3X3JlYWRsKG1taW83NTAgKyBhZGRyKQorI2RlZmluZSBQT0tFMzIoYWRkcixkYXRhKSAJCV9fcmF3X3dyaXRlbChkYXRhLCBtbWlvNzUwICsgYWRkcikKKyNlbHNlIC8qIHNvZnR3YXJlIGNvbnRyb2wgZW5kaWFuZXNzICovCisjZGVmaW5lIFBFRUszMihhZGRyKSByZWFkbChhZGRyICsgbW1pbzc1MCkKKyNkZWZpbmUgUE9LRTMyKGFkZHIsZGF0YSkgd3JpdGVsKGRhdGEsIGFkZHIgKyBtbWlvNzUwKQorI2VuZGlmCisKK2V4dGVybiB2b2lkIF9faW9tZW0gKiBtbWlvNzUwOworZXh0ZXJuIGNoYXIgcmV2SWQ3NTA7CitleHRlcm4gdW5zaWduZWQgc2hvcnQgZGV2SWQ3NTA7CisjZWxzZQorLyogaW1wbGVtZW50IGlmIHlvdSB3YW50IHVzZSBpdCovCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaHdpMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9od2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjYzNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfaHdpMmMuYwpAQCAtMCwwICsxLDI3MSBAQAorI2RlZmluZSBVU0VfSFdfSTJDCisjaWZkZWYgVVNFX0hXX0kyQworI2luY2x1ZGUgImRkazc1MF9oZWxwLmgiCisjaW5jbHVkZSAiZGRrNzUwX3JlZy5oIgorI2luY2x1ZGUgImRkazc1MF9od2kyYy5oIgorI2luY2x1ZGUgImRkazc1MF9wb3dlci5oIgorCisjZGVmaW5lIE1BWF9IV0kyQ19GSUZPICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgSFdJMkNfV0FJVF9USU1FT1VUICAgICAgICAgICAgICAweEYwMDAwCisKKworaW50IGh3STJDSW5pdCgKKyAgICB1bnNpZ25lZCBjaGFyIGJ1c1NwZWVkTW9kZQorKQoreworICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKKworICAgIC8qIEVuYWJsZSBHUElPIDMwICYgMzEgYXMgSUlDIGNsb2NrICYgZGF0YSAqLworCXZhbHVlID0gUEVFSzMyKEdQSU9fTVVYKTsKKworICAgIHZhbHVlID0gRklFTERfU0VUKHZhbHVlLCBHUElPX01VWCwgMzAsIEkyQykgfAorCQkJRklFTERfU0VUKDAsIEdQSU9fTVVYLCAzMSwgSTJDKTsKKwlQT0tFMzIoR1BJT19NVVgsIHZhbHVlKTsKKworICAgIC8qIEVuYWJsZSBIYXJkd2FyZSBJMkMgcG93ZXIuCisgICAgICAgVE9ETzogQ2hlY2sgaWYgd2UgbmVlZCB0byBlbmFibGUgR1BJTyBwb3dlcj8KKyAgICAgKi8KKyAgICBlbmFibGVJMkMoMSk7CisKKyAgICAvKiBFbmFibGUgdGhlIEkyQyBDb250cm9sbGVyIGFuZCBzZXQgdGhlIGJ1cyBzcGVlZCBtb2RlICovCisgICAgdmFsdWUgPSBQRUVLMzIoSTJDX0NUUkwpOworICAgIGlmIChidXNTcGVlZE1vZGUgPT0gMCkKKyAgICAgICAgdmFsdWUgPSBGSUVMRF9TRVQodmFsdWUsIEkyQ19DVFJMLCBNT0RFLCBTVEFOREFSRCk7CisgICAgZWxzZQorICAgICAgICB2YWx1ZSA9IEZJRUxEX1NFVCh2YWx1ZSwgSTJDX0NUUkwsIE1PREUsIEZBU1QpOworICAgIHZhbHVlID0gRklFTERfU0VUKHZhbHVlLCBJMkNfQ1RSTCwgRU4sIEVOQUJMRSk7CisgICAgUE9LRTMyKEkyQ19DVFJMLCB2YWx1ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkIGh3STJDQ2xvc2Uodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdmFsdWU7CisKKyAgICAvKiBEaXNhYmxlIEkyQyBjb250cm9sbGVyICovCisgICAgdmFsdWUgPSBQRUVLMzIoSTJDX0NUUkwpOworICAgIHZhbHVlID0gRklFTERfU0VUKHZhbHVlLCBJMkNfQ1RSTCwgRU4sIERJU0FCTEUpOworICAgIFBPS0UzMihJMkNfQ1RSTCwgdmFsdWUpOworCisgICAgLyogRGlzYWJsZSBJMkMgUG93ZXIgKi8KKyAgICBlbmFibGVJMkMoMCk7CisKKyAgICAvKiBTZXQgR1BJTyAzMCAmIDMxIGJhY2sgYXMgR1BJTyBwaW5zICovCisgICAgdmFsdWUgPSBQRUVLMzIoR1BJT19NVVgpOworICAgIHZhbHVlID0gRklFTERfU0VUKHZhbHVlLCBHUElPX01VWCwgMzAsIEdQSU8pOworICAgIHZhbHVlID0gRklFTERfU0VUKHZhbHVlLCBHUElPX01VWCwgMzEsIEdQSU8pOworICAgIFBPS0UzMihHUElPX01VWCwgdmFsdWUpOworfQorCisKK3N0YXRpYyBsb25nIGh3STJDV2FpdFRYRG9uZSh2b2lkKQoreworICAgIHVuc2lnbmVkIGludCB0aW1lb3V0OworCisgICAgLyogV2FpdCB1bnRpbCB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGVkLiAqLworICAgIHRpbWVvdXQgPSBIV0kyQ19XQUlUX1RJTUVPVVQ7CisJd2hpbGUgKChGSUVMRF9HRVQoUEVFSzMyKEkyQ19TVEFUVVMpLCBJMkNfU1RBVFVTLCBUWCkgIT0gSTJDX1NUQVRVU19UWF9DT01QTEVURUQpICYmCisgICAgICAgICAgICh0aW1lb3V0ICE9IDApKQorCQl0aW1lb3V0LS07CisKKwlpZiAodGltZW91dCA9PSAwKQorCSAgICByZXR1cm4gKC0xKTsKKworICAgIHJldHVybiAwOworfQorCisKKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBkYXRhIHRvIHRoZSBpMmMgc2xhdmUgZGV2aWNlIHJlZ2lzdGVycy4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2aWNlQWRkcmVzcyAgIC0gaTJjIFNsYXZlIGRldmljZSBhZGRyZXNzCisgKiAgICAgIGxlbmd0aCAgICAgICAgICAtIFRvdGFsIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIHRvIHRoZSBkZXZpY2UKKyAqICAgICAgcEJ1ZmZlciAgICAgICAgIC0gVGhlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgIGkyYyBkZXZpY2UuCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRob3NlIGFyZSBhY3R1YWxseSB3cml0dGVuLgorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGh3STJDV3JpdGVEYXRhKAorICAgIHVuc2lnbmVkIGNoYXIgZGV2aWNlQWRkcmVzcywKKyAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoLAorICAgIHVuc2lnbmVkIGNoYXIgKnBCdWZmZXIKKykKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGNvdW50LCBpOworICAgIHVuc2lnbmVkIGludCB0b3RhbEJ5dGVzID0gMDsKKworICAgIC8qIFNldCB0aGUgRGV2aWNlIEFkZHJlc3MgKi8KKyAgICBQT0tFMzIoSTJDX1NMQVZFX0FERFJFU1MsIGRldmljZUFkZHJlc3MgJiB+MHgwMSk7CisKKyAgICAvKiBXcml0ZSBkYXRhLgorICAgICAqIE5vdGU6CisgICAgICogICAgICBPbmx5IDE2IGJ5dGUgY2FuIGJlIGFjY2Vzc2VkIHBlciBpMmMgc3RhcnQgaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgZG8KKyAgICB7CisgICAgICAgIC8qIFJlc2V0IEkyQyBieSB3cml0aW5nIDAgdG8gSTJDX1JFU0VUIHJlZ2lzdGVyIHRvIGNsZWFyIHRoZSBwcmV2aW91cyBzdGF0dXMuICovCisgICAgICAgIFBPS0UzMihJMkNfUkVTRVQsIDApOworCisgICAgICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4gKi8KKyAgICAgICAgaWYgKGxlbmd0aCA8IE1BWF9IV0kyQ19GSUZPKQorICAgICAgICAgICAgY291bnQgPSBsZW5ndGggLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb3VudCA9IE1BWF9IV0kyQ19GSUZPIC0gMTsKKyAgICAgICAgUE9LRTMyKEkyQ19CWVRFX0NPVU5ULCBjb3VudCk7CisKKyAgICAgICAgLyogTW92ZSB0aGUgZGF0YSB0byB0aGUgSTJDIGRhdGEgcmVnaXN0ZXIgKi8KKwkgICAgZm9yIChpID0gMDsgaSA8PSBjb3VudDsgaSsrKQorICAgICAgICAgICAgUE9LRTMyKEkyQ19EQVRBMCArIGksICpwQnVmZmVyKyspOworCisgICAgICAgIC8qIFN0YXJ0IHRoZSBJMkMgKi8KKyAgICAgICAgUE9LRTMyKEkyQ19DVFJMLCBGSUVMRF9TRVQoUEVFSzMyKEkyQ19DVFJMKSwgSTJDX0NUUkwsIENUUkwsIFNUQVJUKSk7CisKKyAgICAgICAgLyogV2FpdCB1bnRpbCB0aGUgdHJhbnNmZXIgaXMgY29tcGxldGVkLiAqLworICAgICAgICBpZiAoaHdJMkNXYWl0VFhEb25lKCkgIT0gMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIFN1YnN0cmFjdCBsZW5ndGggKi8KKyAgICAgICAgbGVuZ3RoIC09IChjb3VudCArIDEpOworCisgICAgICAgIC8qIFRvdGFsIGJ5dGUgd3JpdHRlbiAqLworICAgICAgICB0b3RhbEJ5dGVzICs9IChjb3VudCArIDEpOworCisgICAgfSB3aGlsZSAobGVuZ3RoID4gMCk7CisKKyAgICByZXR1cm4gdG90YWxCeXRlczsKK30KKworCisKKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHJlYWRzIGRhdGEgZnJvbSB0aGUgc2xhdmUgZGV2aWNlIGFuZCBzdG9yZXMgdGhlbQorICogIGluIHRoZSBnaXZlbiBidWZmZXIKKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2aWNlQWRkcmVzcyAgIC0gaTJjIFNsYXZlIGRldmljZSBhZGRyZXNzCisgKiAgICAgIGxlbmd0aCAgICAgICAgICAtIFRvdGFsIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkCisgKiAgICAgIHBCdWZmZXIgICAgICAgICAtIFBvaW50ZXIgdG8gYSBidWZmZXIgdG8gYmUgZmlsbGVkIHdpdGggdGhlIGRhdGEgcmVhZAorICogICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBzbGF2ZSBkZXZpY2UuIEl0IGhhcyB0byBiZSB0aGUgc2FtZSBzaXplIGFzIHRoZQorICogICAgICAgICAgICAgICAgICAgICBsZW5ndGggdG8gbWFrZSBzdXJlIHRoYXQgaXQgY2FuIGtlZXAgYWxsIHRoZSBkYXRhIHJlYWQuCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgVG90YWwgbnVtYmVyIG9mIGFjdHVhbCBieXRlcyByZWFkIGZyb20gdGhlIHNsYXZlIGRldmljZQorICovCitzdGF0aWMgdW5zaWduZWQgaW50IGh3STJDUmVhZERhdGEoCisgICAgdW5zaWduZWQgY2hhciBkZXZpY2VBZGRyZXNzLAorICAgIHVuc2lnbmVkIGludCBsZW5ndGgsCisgICAgdW5zaWduZWQgY2hhciAqcEJ1ZmZlcgorKQoreworICAgIHVuc2lnbmVkIGNoYXIgY291bnQsIGk7CisgICAgdW5zaWduZWQgaW50IHRvdGFsQnl0ZXMgPSAwOworCisgICAgLyogU2V0IHRoZSBEZXZpY2UgQWRkcmVzcyAqLworICAgIFBPS0UzMihJMkNfU0xBVkVfQUREUkVTUywgZGV2aWNlQWRkcmVzcyB8IDB4MDEpOworCisgICAgLyogUmVhZCBkYXRhIGFuZCBzYXZlIHRoZW0gdG8gdGhlIGJ1ZmZlci4KKyAgICAgKiBOb3RlOgorICAgICAqICAgICAgT25seSAxNiBieXRlIGNhbiBiZSBhY2Nlc3NlZCBwZXIgaTJjIHN0YXJ0IGluc3RydWN0aW9uLgorICAgICAqLworICAgIGRvCisgICAgeworICAgICAgICAvKiBSZXNldCBJMkMgYnkgd3JpdGluZyAwIHRvIEkyQ19SRVNFVCByZWdpc3RlciB0byBjbGVhciBhbGwgdGhlIHN0YXR1cy4gKi8KKyAgICAgICAgUE9LRTMyKEkyQ19SRVNFVCwgMCk7CisKKyAgICAgICAgLyogU2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCAqLworICAgICAgICBpZiAobGVuZ3RoIDw9IE1BWF9IV0kyQ19GSUZPKQorICAgICAgICAgICAgY291bnQgPSBsZW5ndGggLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb3VudCA9IE1BWF9IV0kyQ19GSUZPIC0gMTsKKyAgICAgICAgUE9LRTMyKEkyQ19CWVRFX0NPVU5ULCBjb3VudCk7CisKKyAgICAgICAgLyogU3RhcnQgdGhlIEkyQyAqLworICAgICAgICBQT0tFMzIoSTJDX0NUUkwsIEZJRUxEX1NFVChQRUVLMzIoSTJDX0NUUkwpLCBJMkNfQ1RSTCwgQ1RSTCwgU1RBUlQpKTsKKworICAgICAgICAvKiBXYWl0IHVudGlsIHRyYW5zYWN0aW9uIGRvbmUuICovCisgICAgICAgIGlmIChod0kyQ1dhaXRUWERvbmUoKSAhPSAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogU2F2ZSB0aGUgZGF0YSB0byB0aGUgZ2l2ZW4gYnVmZmVyICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY291bnQ7IGkrKykKKwkJICAgICpwQnVmZmVyKysgPSBQRUVLMzIoSTJDX0RBVEEwICsgaSk7CisKKyAgICAgICAgLyogU3Vic3RyYWN0IGxlbmd0aCBieSAxNiAqLworICAgICAgICBsZW5ndGggLT0gKGNvdW50ICsgMSk7CisKKyAgICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIHJlYWQuICovCisgICAgICAgIHRvdGFsQnl0ZXMgKz0gKGNvdW50ICsgMSk7CisKKyAgICB9IHdoaWxlIChsZW5ndGggPiAwKTsKKworICAgIHJldHVybiB0b3RhbEJ5dGVzOworfQorCisKKworCisvKgorICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHNsYXZlIGRldmljZSdzIHJlZ2lzdGVyCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldmljZUFkZHJlc3MgICAtIGkyYyBTbGF2ZSBkZXZpY2UgYWRkcmVzcyB3aGljaCByZWdpc3RlcgorICogICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZWFkIGZyb20KKyAqICAgICAgcmVnaXN0ZXJJbmRleCAgIC0gU2xhdmUgZGV2aWNlJ3MgcmVnaXN0ZXIgdG8gYmUgcmVhZAorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIFJlZ2lzdGVyIHZhbHVlCisgKi8KK3Vuc2lnbmVkIGNoYXIgaHdJMkNSZWFkUmVnKAorICAgIHVuc2lnbmVkIGNoYXIgZGV2aWNlQWRkcmVzcywKKyAgICB1bnNpZ25lZCBjaGFyIHJlZ2lzdGVySW5kZXgKKykKK3sKKyAgICB1bnNpZ25lZCBjaGFyIHZhbHVlID0gKDB4RkYpOworCisgICAgaWYgKGh3STJDV3JpdGVEYXRhKGRldmljZUFkZHJlc3MsIDEsICZyZWdpc3RlckluZGV4KSA9PSAxKQorICAgICAgICBod0kyQ1JlYWREYXRhKGRldmljZUFkZHJlc3MsIDEsICZ2YWx1ZSk7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKworCisKKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBhIHZhbHVlIHRvIHRoZSBzbGF2ZSBkZXZpY2UncyByZWdpc3RlcgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZpY2VBZGRyZXNzICAgLSBpMmMgU2xhdmUgZGV2aWNlIGFkZHJlc3Mgd2hpY2ggcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgd3JpdHRlbgorICogICAgICByZWdpc3RlckluZGV4ICAgLSBTbGF2ZSBkZXZpY2UncyByZWdpc3RlciB0byBiZSB3cml0dGVuCisgKiAgICAgIGRhdGEgICAgICAgICAgICAtIERhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgcmVnaXN0ZXIKKyAqCisgKiAgUmVzdWx0OgorICogICAgICAgICAgMCAgIC0gU3VjY2VzcworICogICAgICAgICAtMSAgIC0gRmFpbAorICovCitpbnQgaHdJMkNXcml0ZVJlZygKKyAgICB1bnNpZ25lZCBjaGFyIGRldmljZUFkZHJlc3MsCisgICAgdW5zaWduZWQgY2hhciByZWdpc3RlckluZGV4LAorICAgIHVuc2lnbmVkIGNoYXIgZGF0YQorKQoreworICAgIHVuc2lnbmVkIGNoYXIgdmFsdWVbMl07CisKKyAgICB2YWx1ZVswXSA9IHJlZ2lzdGVySW5kZXg7CisgICAgdmFsdWVbMV0gPSBkYXRhOworICAgIGlmIChod0kyQ1dyaXRlRGF0YShkZXZpY2VBZGRyZXNzLCAyLCB2YWx1ZSkgPT0gMikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gKC0xKTsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9od2kyYy5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX2h3aTJjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzMTE0OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9od2kyYy5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgRERLNzUwX0hXSTJDX0hfXworI2RlZmluZSBEREs3NTBfSFdJMkNfSF9fCisKKy8qIGh3aTJjIGZ1bmN0aW9ucyAqLworaW50IGh3STJDSW5pdCh1bnNpZ25lZCBjaGFyIGJ1c1NwZWVkTW9kZSk7Cit2b2lkIGh3STJDQ2xvc2Uodm9pZCk7CisKK3Vuc2lnbmVkIGNoYXIgaHdJMkNSZWFkUmVnKHVuc2lnbmVkIGNoYXIgZGV2aWNlQWRkcmVzcyx1bnNpZ25lZCBjaGFyIHJlZ2lzdGVySW5kZXgpOworaW50IGh3STJDV3JpdGVSZWcodW5zaWduZWQgY2hhciBkZXZpY2VBZGRyZXNzLHVuc2lnbmVkIGNoYXIgcmVnaXN0ZXJJbmRleCx1bnNpZ25lZCBjaGFyIGRhdGEpOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfbW9kZS5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX21vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTQxOGZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX21vZGUuYwpAQCAtMCwwICsxLDIwNSBAQAorCisjaW5jbHVkZSAiZGRrNzUwX2hlbHAuaCIKKyNpbmNsdWRlICJkZGs3NTBfcmVnLmgiCisjaW5jbHVkZSAiZGRrNzUwX21vZGUuaCIKKyNpbmNsdWRlICJkZGs3NTBfY2hpcC5oIgorCisvKgorCVNNNzUwTEUgb25seToKKyAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgZXh0cmEgcmVnaXN0ZXJzIGFuZCBiaXQgZmllbGRzIHJlcXVpcmVkIHRvIHNldAorICAgIHVwIGEgbW9kZSBpbiBTTTc1MExFCisKKwlFeHBsYW5hdGlvbiBhYm91dCBEaXNwbGF5IENvbnRyb2wgcmVnaXN0ZXI6CisgICAgSFcgb25seSBzdXBwb3J0cyA3IHByZWRlZmluZWQgcGl4ZWwgY2xvY2tzLCBhbmQgY2xvY2sgc2VsZWN0IGlzCisgICAgaW4gYml0IDI5OjI3IG9mCURpc3BsYXkgQ29udHJvbCByZWdpc3Rlci4KKyovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXNwbGF5Q29udHJvbEFkanVzdF9TTTc1MExFKG1vZGVfcGFyYW1ldGVyX3QgKnBNb2RlUGFyYW0sIHVuc2lnbmVkIGxvbmcgZGlzcENvbnRyb2wpCit7CisJdW5zaWduZWQgbG9uZyB4LCB5OworCisJeCA9IHBNb2RlUGFyYW0tPmhvcml6b250YWxfZGlzcGxheV9lbmQ7CisJeSA9IHBNb2RlUGFyYW0tPnZlcnRpY2FsX2Rpc3BsYXlfZW5kOworCisgICAgLyogU003NTBMRSBoYXMgdG8gc2V0IHVwIHRoZSB0b3AtbGVmdCBhbmQgYm90dG9tLXJpZ2h0CisgICAgICAgcmVnaXN0ZXJzIGFzIHdlbGwuCisgICAgICAgTm90ZSB0aGF0IG5vcm1hbCBTTTc1MC9TTTcxOCBvbmx5IHVzZSB0aG9zZSB0d28gcmVnaXN0ZXIgZm9yCisgICAgICAgYXV0by1jZW50ZXJpbmcgbW9kZS4KKyAgICAqLworICAgIFBPS0UzMihDUlRfQVVUT19DRU5URVJJTkdfVEwsCisgICAgICBGSUVMRF9WQUxVRSgwLCBDUlRfQVVUT19DRU5URVJJTkdfVEwsIFRPUCwgMCkKKyAgICB8IEZJRUxEX1ZBTFVFKDAsIENSVF9BVVRPX0NFTlRFUklOR19UTCwgTEVGVCwgMCkpOworCisgICAgUE9LRTMyKENSVF9BVVRPX0NFTlRFUklOR19CUiwKKyAgICAgIEZJRUxEX1ZBTFVFKDAsIENSVF9BVVRPX0NFTlRFUklOR19CUiwgQk9UVE9NLCB5LTEpCisgICAgfCBGSUVMRF9WQUxVRSgwLCBDUlRfQVVUT19DRU5URVJJTkdfQlIsIFJJR0hULCB4LTEpKTsKKworICAgIC8qIEFzc3VtZSBjb21tb24gZmllbGRzIGluIGRpc3BDb250cm9sIGhhdmUgYmVlbiBwcm9wZXJseSBzZXQgYmVmb3JlCisgICAgICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAgICAgIFRoaXMgZnVuY3Rpb24gb25seSBzZXRzIHRoZSBleHRyYSBmaWVsZHMgaW4gZGlzcENvbnRyb2wuCisgICAgKi8KKworCS8qIENsZWFyIGJpdCAyOToyNyBvZiBkaXNwbGF5IGNvbnRyb2wgcmVnaXN0ZXIgKi8KKyAgICBkaXNwQ29udHJvbCAmPSBGSUVMRF9DTEVBUihDUlRfRElTUExBWV9DVFJMLCBDTEspOworCisJLyogU2V0IGJpdCAyOToyNyBvZiBkaXNwbGF5IGNvbnRyb2wgcmVnaXN0ZXIgZm9yIHRoZSByaWdodCBjbG9jayAqLworCS8qIE5vdGUgdGhhdCBTTTc1MExFIG9ubHkgbmVlZCB0byBzdXBwb3J0ZWQgNyByZXNvbHVpdG9ucy4gKi8KKwlpZiAoIHggPT0gODAwICYmIHkgPT0gNjAwICkKKyAgICAJZGlzcENvbnRyb2wgPSBGSUVMRF9TRVQoZGlzcENvbnRyb2wsIENSVF9ESVNQTEFZX0NUUkwsIENMSywgUExMNDEpOworCWVsc2UgaWYgKHggPT0gMTAyNCAmJiB5ID09IDc2OCkKKyAgICAJZGlzcENvbnRyb2wgPSBGSUVMRF9TRVQoZGlzcENvbnRyb2wsIENSVF9ESVNQTEFZX0NUUkwsIENMSywgUExMNjUpOworCWVsc2UgaWYgKHggPT0gMTE1MiAmJiB5ID09IDg2NCkKKyAgICAJZGlzcENvbnRyb2wgPSBGSUVMRF9TRVQoZGlzcENvbnRyb2wsIENSVF9ESVNQTEFZX0NUUkwsIENMSywgUExMODApOworCWVsc2UgaWYgKHggPT0gMTI4MCAmJiB5ID09IDc2OCkKKyAgICAJZGlzcENvbnRyb2wgPSBGSUVMRF9TRVQoZGlzcENvbnRyb2wsIENSVF9ESVNQTEFZX0NUUkwsIENMSywgUExMODApOworCWVsc2UgaWYgKHggPT0gMTI4MCAmJiB5ID09IDcyMCkKKyAgICAJZGlzcENvbnRyb2wgPSBGSUVMRF9TRVQoZGlzcENvbnRyb2wsIENSVF9ESVNQTEFZX0NUUkwsIENMSywgUExMNzQpOworCWVsc2UgaWYgKHggPT0gMTI4MCAmJiB5ID09IDk2MCkKKyAgICAJZGlzcENvbnRyb2wgPSBGSUVMRF9TRVQoZGlzcENvbnRyb2wsIENSVF9ESVNQTEFZX0NUUkwsIENMSywgUExMMTA4KTsKKwllbHNlIGlmICh4ID09IDEyODAgJiYgeSA9PSAxMDI0KQorICAgIAlkaXNwQ29udHJvbCA9IEZJRUxEX1NFVChkaXNwQ29udHJvbCwgQ1JUX0RJU1BMQVlfQ1RSTCwgQ0xLLCBQTEwxMDgpOworCWVsc2UgLyogZGVmYXVsdCB0byBWR0EgY2xvY2sgKi8KKyAgICAJZGlzcENvbnRyb2wgPSBGSUVMRF9TRVQoZGlzcENvbnRyb2wsIENSVF9ESVNQTEFZX0NUUkwsIENMSywgUExMMjUpOworCisJLyogU2V0IGJpdCAyNToyNCBvZiBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KKyAgICBkaXNwQ29udHJvbCA9IEZJRUxEX1NFVChkaXNwQ29udHJvbCwgQ1JUX0RJU1BMQVlfQ1RSTCwgQ1JUU0VMRUNULCBDUlQpOworICAgIGRpc3BDb250cm9sID0gRklFTERfU0VUKGRpc3BDb250cm9sLCBDUlRfRElTUExBWV9DVFJMLCBSR0JCSVQsIDI0QklUKTsKKworICAgIC8qIFNldCBiaXQgMTQgb2YgZGlzcGxheSBjb250cm9sbGVyICovCisgICAgZGlzcENvbnRyb2wgPSBGSUVMRF9TRVQoZGlzcENvbnRyb2wsIENSVF9ESVNQTEFZX0NUUkwsIENMT0NLX1BIQVNFLCBBQ1RJVkVfTE9XKTsKKworICAgIFBPS0UzMihDUlRfRElTUExBWV9DVFJMLCBkaXNwQ29udHJvbCk7CisKKwlyZXR1cm4gZGlzcENvbnRyb2w7Cit9CisKKworCisvKiBvbmx5IHRpbWluZyByZWxhdGVkIHJlZ2lzdGVycyB3aWxsIGJlICBwcm9ncmFtZWQgKi8KK3N0YXRpYyBpbnQgcHJvZ3JhbU1vZGVSZWdpc3RlcnMobW9kZV9wYXJhbWV0ZXJfdCAqIHBNb2RlUGFyYW0scGxsX3ZhbHVlX3QgKiBwbGwpCit7CisJaW50IHJldCA9IDA7CisJaW50IGNudCA9IDA7CisJdW5zaWduZWQgaW50IHVsVG1wVmFsdWUsdWxSZWc7CisJaWYocGxsLT5jbG9ja1R5cGUgPT0gU0VDT05EQVJZX1BMTCkKKwl7CisJCS8qIHByb2dyYW1lIHNlY29uZGFyeSBwaXhlbCBjbG9jayAqLworCQlQT0tFMzIoQ1JUX1BMTF9DVFJMLGZvcm1hdFBsbFJlZyhwbGwpKTsKKyAgICAgICAgUE9LRTMyKENSVF9IT1JJWk9OVEFMX1RPVEFMLAorICAgICAgICAgICAgICBGSUVMRF9WQUxVRSgwLCBDUlRfSE9SSVpPTlRBTF9UT1RBTCwgVE9UQUwsIHBNb2RlUGFyYW0tPmhvcml6b250YWxfdG90YWwgLSAxKQorICAgICAgICAgICAgfCBGSUVMRF9WQUxVRSgwLCBDUlRfSE9SSVpPTlRBTF9UT1RBTCwgRElTUExBWV9FTkQsIHBNb2RlUGFyYW0tPmhvcml6b250YWxfZGlzcGxheV9lbmQgLSAxKSk7CisKKyAgICAgICAgUE9LRTMyKENSVF9IT1JJWk9OVEFMX1NZTkMsCisgICAgICAgICAgICAgIEZJRUxEX1ZBTFVFKDAsIENSVF9IT1JJWk9OVEFMX1NZTkMsIFdJRFRILCBwTW9kZVBhcmFtLT5ob3Jpem9udGFsX3N5bmNfd2lkdGgpCisgICAgICAgICAgICB8IEZJRUxEX1ZBTFVFKDAsIENSVF9IT1JJWk9OVEFMX1NZTkMsIFNUQVJULCBwTW9kZVBhcmFtLT5ob3Jpem9udGFsX3N5bmNfc3RhcnQgLSAxKSk7CisKKyAgICAgICAgUE9LRTMyKENSVF9WRVJUSUNBTF9UT1RBTCwKKyAgICAgICAgICAgICAgRklFTERfVkFMVUUoMCwgQ1JUX1ZFUlRJQ0FMX1RPVEFMLCBUT1RBTCwgcE1vZGVQYXJhbS0+dmVydGljYWxfdG90YWwgLSAxKQorICAgICAgICAgICAgfCBGSUVMRF9WQUxVRSgwLCBDUlRfVkVSVElDQUxfVE9UQUwsIERJU1BMQVlfRU5ELCBwTW9kZVBhcmFtLT52ZXJ0aWNhbF9kaXNwbGF5X2VuZCAtIDEpKTsKKworICAgICAgICBQT0tFMzIoQ1JUX1ZFUlRJQ0FMX1NZTkMsCisgICAgICAgICAgICAgIEZJRUxEX1ZBTFVFKDAsIENSVF9WRVJUSUNBTF9TWU5DLCBIRUlHSFQsIHBNb2RlUGFyYW0tPnZlcnRpY2FsX3N5bmNfaGVpZ2h0KQorICAgICAgICAgICAgfCBGSUVMRF9WQUxVRSgwLCBDUlRfVkVSVElDQUxfU1lOQywgU1RBUlQsIHBNb2RlUGFyYW0tPnZlcnRpY2FsX3N5bmNfc3RhcnQgLSAxKSk7CisKKworCQl1bFRtcFZhbHVlID0gRklFTERfVkFMVUUoMCxDUlRfRElTUExBWV9DVFJMLFZTWU5DX1BIQVNFLHBNb2RlUGFyYW0tPnZlcnRpY2FsX3N5bmNfcG9sYXJpdHkpfAorCQkJCQkgIEZJRUxEX1ZBTFVFKDAsQ1JUX0RJU1BMQVlfQ1RSTCxIU1lOQ19QSEFTRSxwTW9kZVBhcmFtLT5ob3Jpem9udGFsX3N5bmNfcG9sYXJpdHkpfAorCQkJCQkgIEZJRUxEX1NFVCgwLENSVF9ESVNQTEFZX0NUUkwsVElNSU5HLEVOQUJMRSl8CisJCQkJCSAgRklFTERfU0VUKDAsQ1JUX0RJU1BMQVlfQ1RSTCxQTEFORSxFTkFCTEUpOworCisKKwkJaWYoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKXsKKwkJCWRpc3BsYXlDb250cm9sQWRqdXN0X1NNNzUwTEUocE1vZGVQYXJhbSx1bFRtcFZhbHVlKTsKKwkJfWVsc2V7CisJCQl1bFJlZyA9IFBFRUszMihDUlRfRElTUExBWV9DVFJMKQorCQkJCQkmIEZJRUxEX0NMRUFSKENSVF9ESVNQTEFZX0NUUkwsVlNZTkNfUEhBU0UpCisJCQkJCSYgRklFTERfQ0xFQVIoQ1JUX0RJU1BMQVlfQ1RSTCxIU1lOQ19QSEFTRSkKKwkJCQkJJiBGSUVMRF9DTEVBUihDUlRfRElTUExBWV9DVFJMLFRJTUlORykKKwkJCQkJJiBGSUVMRF9DTEVBUihDUlRfRElTUExBWV9DVFJMLFBMQU5FKTsKKworCQkJIFBPS0UzMihDUlRfRElTUExBWV9DVFJMLHVsVG1wVmFsdWV8dWxSZWcpOworCQl9CisKKwl9CisJZWxzZSBpZihwbGwtPmNsb2NrVHlwZSA9PSBQUklNQVJZX1BMTCkKKwl7CisJCXVuc2lnbmVkIGludCB1bFJlc2VydmVkQml0czsKKwkJUE9LRTMyKFBBTkVMX1BMTF9DVFJMLGZvcm1hdFBsbFJlZyhwbGwpKTsKKworICAgICAgICBQT0tFMzIoUEFORUxfSE9SSVpPTlRBTF9UT1RBTCwKKyAgICAgICAgICAgICAgRklFTERfVkFMVUUoMCwgUEFORUxfSE9SSVpPTlRBTF9UT1RBTCwgVE9UQUwsIHBNb2RlUGFyYW0tPmhvcml6b250YWxfdG90YWwgLSAxKQorICAgICAgICAgICAgfCBGSUVMRF9WQUxVRSgwLCBQQU5FTF9IT1JJWk9OVEFMX1RPVEFMLCBESVNQTEFZX0VORCwgcE1vZGVQYXJhbS0+aG9yaXpvbnRhbF9kaXNwbGF5X2VuZCAtIDEpKTsKKworICAgICAgICBQT0tFMzIoUEFORUxfSE9SSVpPTlRBTF9TWU5DLAorICAgICAgICAgICAgICBGSUVMRF9WQUxVRSgwLCBQQU5FTF9IT1JJWk9OVEFMX1NZTkMsIFdJRFRILCBwTW9kZVBhcmFtLT5ob3Jpem9udGFsX3N5bmNfd2lkdGgpCisgICAgICAgICAgICB8IEZJRUxEX1ZBTFVFKDAsIFBBTkVMX0hPUklaT05UQUxfU1lOQywgU1RBUlQsIHBNb2RlUGFyYW0tPmhvcml6b250YWxfc3luY19zdGFydCAtIDEpKTsKKworICAgICAgICBQT0tFMzIoUEFORUxfVkVSVElDQUxfVE9UQUwsCisgICAgICAgICAgICAgIEZJRUxEX1ZBTFVFKDAsIFBBTkVMX1ZFUlRJQ0FMX1RPVEFMLCBUT1RBTCwgcE1vZGVQYXJhbS0+dmVydGljYWxfdG90YWwgLSAxKQorICAgICAgICAgICAgfCBGSUVMRF9WQUxVRSgwLCBQQU5FTF9WRVJUSUNBTF9UT1RBTCwgRElTUExBWV9FTkQsIHBNb2RlUGFyYW0tPnZlcnRpY2FsX2Rpc3BsYXlfZW5kIC0gMSkpOworCisgICAgICAgIFBPS0UzMihQQU5FTF9WRVJUSUNBTF9TWU5DLAorICAgICAgICAgICAgICBGSUVMRF9WQUxVRSgwLCBQQU5FTF9WRVJUSUNBTF9TWU5DLCBIRUlHSFQsIHBNb2RlUGFyYW0tPnZlcnRpY2FsX3N5bmNfaGVpZ2h0KQorICAgICAgICAgICAgfCBGSUVMRF9WQUxVRSgwLCBQQU5FTF9WRVJUSUNBTF9TWU5DLCBTVEFSVCwgcE1vZGVQYXJhbS0+dmVydGljYWxfc3luY19zdGFydCAtIDEpKTsKKworCQl1bFRtcFZhbHVlID0gRklFTERfVkFMVUUoMCxQQU5FTF9ESVNQTEFZX0NUUkwsVlNZTkNfUEhBU0UscE1vZGVQYXJhbS0+dmVydGljYWxfc3luY19wb2xhcml0eSl8CisJCQkJCUZJRUxEX1ZBTFVFKDAsUEFORUxfRElTUExBWV9DVFJMLEhTWU5DX1BIQVNFLHBNb2RlUGFyYW0tPmhvcml6b250YWxfc3luY19wb2xhcml0eSl8CisJCQkJCUZJRUxEX1ZBTFVFKDAsUEFORUxfRElTUExBWV9DVFJMLENMT0NLX1BIQVNFLHBNb2RlUGFyYW0tPmNsb2NrX3BoYXNlX3BvbGFyaXR5KXwKKwkJCQkJRklFTERfU0VUKDAsUEFORUxfRElTUExBWV9DVFJMLFRJTUlORyxFTkFCTEUpfAorCQkJCQlGSUVMRF9TRVQoMCxQQU5FTF9ESVNQTEFZX0NUUkwsUExBTkUsRU5BQkxFKTsKKworICAgICAgICB1bFJlc2VydmVkQml0cyA9IEZJRUxEX1NFVCgwLCBQQU5FTF9ESVNQTEFZX0NUUkwsIFJFU0VSVkVEXzFfTUFTSywgRU5BQkxFKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERfU0VUKDAsIFBBTkVMX0RJU1BMQVlfQ1RSTCwgUkVTRVJWRURfMl9NQVNLLCBFTkFCTEUpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRF9TRVQoMCwgUEFORUxfRElTUExBWV9DVFJMLCBSRVNFUlZFRF8zX01BU0ssIEVOQUJMRSl8CisgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERfU0VUKDAsUEFORUxfRElTUExBWV9DVFJMLFZTWU5DLEFDVElWRV9MT1cpOworCisgICAgICAgIHVsUmVnID0gKFBFRUszMihQQU5FTF9ESVNQTEFZX0NUUkwpICYgfnVsUmVzZXJ2ZWRCaXRzKQorICAgICAgICAgICAgICAmIEZJRUxEX0NMRUFSKFBBTkVMX0RJU1BMQVlfQ1RSTCwgQ0xPQ0tfUEhBU0UpCisgICAgICAgICAgICAgICYgRklFTERfQ0xFQVIoUEFORUxfRElTUExBWV9DVFJMLCBWU1lOQ19QSEFTRSkKKyAgICAgICAgICAgICAgJiBGSUVMRF9DTEVBUihQQU5FTF9ESVNQTEFZX0NUUkwsIEhTWU5DX1BIQVNFKQorICAgICAgICAgICAgICAmIEZJRUxEX0NMRUFSKFBBTkVMX0RJU1BMQVlfQ1RSTCwgVElNSU5HKQorICAgICAgICAgICAgICAmIEZJRUxEX0NMRUFSKFBBTkVMX0RJU1BMQVlfQ1RSTCwgUExBTkUpOworCisKKwkJLyogTWF5IGEgaGFyZHdhcmUgYnVnIG9yIGp1c3QgbXkgdGVzdCBjaGlwIChub3QgY29uZmlybWVkKS4KKwkJKiBQQU5FTF9ESVNQTEFZX0NUUkwgcmVnaXN0ZXIgc2VlbXMgcmVxdWlyaW5nIGZldyB3cml0ZXMKKwkJKiBiZWZvcmUgYSB2YWx1ZSBjYW4gYmUgc3VjY2VzZnVsbHkgd3JpdHRlbiBpbi4KKwkJKiBBZGRlZCBzb21lIG1hc2tzIHRvIG1hc2sgb3V0IHRoZSByZXNlcnZlZCBiaXRzLgorCQkqIE5vdGU6IFRoaXMgcHJvYmxlbSBoYXBwZW5zIGJ5IGRlc2lnbi4gVGhlIGhhcmR3YXJlIHdpbGwgd2FpdCBmb3IgdGhlCisJCSogICAgICAgbmV4dCB2ZXJ0aWNhbCBzeW5jIHRvIHR1cm4gb24vb2ZmIHRoZSBwbGFuZS4KKwkJKi8KKworCQlQT0tFMzIoUEFORUxfRElTUExBWV9DVFJMLHVsVG1wVmFsdWV8dWxSZWcpOworI2lmIDEKKwkJd2hpbGUoKFBFRUszMihQQU5FTF9ESVNQTEFZX0NUUkwpICYgfnVsUmVzZXJ2ZWRCaXRzKSAhPSAodWxUbXBWYWx1ZXx1bFJlZykpCisJCXsKKwkJCWNudCsrOworCQkJaWYoY250ID4gMTAwMCkKKwkJCQlicmVhazsKKwkJCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwsdWxUbXBWYWx1ZXx1bFJlZyk7CisJCX0KKyNlbmRpZgorCX0KKwllbHNleworCQlyZXQgPSAtMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IGRkazc1MF9zZXRNb2RlVGltaW5nKG1vZGVfcGFyYW1ldGVyX3QgKiBwYXJtLGNsb2NrX3R5cGVfdCBjbG9jaykKK3sKKwlwbGxfdmFsdWVfdCBwbGw7CisJdW5zaWduZWQgaW50IHVpQWN0dWFsUGl4ZWxDbGs7CisJcGxsLmlucHV0RnJlcSA9IERFRkFVTFRfSU5QVVRfQ0xPQ0s7CisJcGxsLmNsb2NrVHlwZSA9IGNsb2NrOworCisJdWlBY3R1YWxQaXhlbENsayA9IGNhbGNQbGxWYWx1ZShwYXJtLT5waXhlbF9jbG9jaywmcGxsKTsKKwlpZihnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpeworCQkvKiBzZXQgZ3JhcGhpYyBtb2RlIHZpYSBJTyBtZXRob2QgKi8KKwkJb3V0Yl9wKDB4ODgsMHgzZDQpOworCQlvdXRiX3AoMHgwNiwweDNkNSk7CisJfQorCXByb2dyYW1Nb2RlUmVnaXN0ZXJzKHBhcm0sJnBsbCk7CisJcmV0dXJuIDA7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX21vZGUuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9tb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4ZGY5NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9tb2RlLmgKQEAgLTAsMCArMSw0MyBAQAorI2lmbmRlZiBEREs3NTBfTU9ERV9IX18KKyNkZWZpbmUgRERLNzUwX01PREVfSF9fCisKKyNpbmNsdWRlICJkZGs3NTBfY2hpcC5oIgorCit0eXBlZGVmIGVudW0gX3Nwb2xhcml0eV90Cit7CisgICAgUE9TID0gMCwgLyogcG9zaXRpdmUgKi8KKyAgICBORUcsIC8qIG5lZ2F0aXZlICovCit9CitzcG9sYXJpdHlfdDsKKworCit0eXBlZGVmIHN0cnVjdCBfbW9kZV9wYXJhbWV0ZXJfdAoreworICAgIC8qIEhvcml6b250YWwgdGltaW5nLiAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9yaXpvbnRhbF90b3RhbDsKKyAgICB1bnNpZ25lZCBsb25nIGhvcml6b250YWxfZGlzcGxheV9lbmQ7CisgICAgdW5zaWduZWQgbG9uZyBob3Jpem9udGFsX3N5bmNfc3RhcnQ7CisgICAgdW5zaWduZWQgbG9uZyBob3Jpem9udGFsX3N5bmNfd2lkdGg7CisgICAgc3BvbGFyaXR5X3QgaG9yaXpvbnRhbF9zeW5jX3BvbGFyaXR5OworCisgICAgLyogVmVydGljYWwgdGltaW5nLiAqLworICAgIHVuc2lnbmVkIGxvbmcgdmVydGljYWxfdG90YWw7CisgICAgdW5zaWduZWQgbG9uZyB2ZXJ0aWNhbF9kaXNwbGF5X2VuZDsKKyAgICB1bnNpZ25lZCBsb25nIHZlcnRpY2FsX3N5bmNfc3RhcnQ7CisgICAgdW5zaWduZWQgbG9uZyB2ZXJ0aWNhbF9zeW5jX2hlaWdodDsKKyAgICBzcG9sYXJpdHlfdCB2ZXJ0aWNhbF9zeW5jX3BvbGFyaXR5OworCisgICAgLyogUmVmcmVzaCB0aW1pbmcuICovCisgICAgdW5zaWduZWQgbG9uZyBwaXhlbF9jbG9jazsKKyAgICB1bnNpZ25lZCBsb25nIGhvcml6b250YWxfZnJlcXVlbmN5OworICAgIHVuc2lnbmVkIGxvbmcgdmVydGljYWxfZnJlcXVlbmN5OworCisgICAgLyogQ2xvY2sgUGhhc2UuIFRoaXMgY2xvY2sgcGhhc2Ugb25seSBhcHBsaWVzIHRvIFBhbmVsLiAqLworICAgIHNwb2xhcml0eV90IGNsb2NrX3BoYXNlX3BvbGFyaXR5OworfQorbW9kZV9wYXJhbWV0ZXJfdDsKKworaW50IGRkazc1MF9zZXRNb2RlVGltaW5nKG1vZGVfcGFyYW1ldGVyX3QgKixjbG9ja190eXBlX3QpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3Bvd2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmI5NzY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3Bvd2VyLmMKQEAgLTAsMCArMSwyMzkgQEAKKyNpbmNsdWRlICJkZGs3NTBfaGVscC5oIgorI2luY2x1ZGUgImRkazc1MF9yZWcuaCIKKyNpbmNsdWRlICJkZGs3NTBfcG93ZXIuaCIKKwordm9pZCBkZGs3NTBfc2V0RFBNUyhEUE1TX3Qgc3RhdGUpCit7CisJdW5zaWduZWQgaW50IHZhbHVlOworCWlmKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSl7CisJCXZhbHVlID0gUEVFSzMyKENSVF9ESVNQTEFZX0NUUkwpOworCQlQT0tFMzIoQ1JUX0RJU1BMQVlfQ1RSTCxGSUVMRF9WQUxVRSh2YWx1ZSxDUlRfRElTUExBWV9DVFJMLERQTVMsc3RhdGUpKTsKKwl9ZWxzZXsKKwkJdmFsdWUgPSBQRUVLMzIoU1lTVEVNX0NUUkwpOworCQl2YWx1ZT0gRklFTERfVkFMVUUodmFsdWUsU1lTVEVNX0NUUkwsRFBNUyxzdGF0ZSk7CisJCVBPS0UzMihTWVNURU1fQ1RSTCwgdmFsdWUpOworCX0KK30KKwordW5zaWduZWQgaW50IGdldFBvd2VyTW9kZSh2b2lkKQoreworCWlmKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKwkJcmV0dXJuIDA7CisgICAgcmV0dXJuIChGSUVMRF9HRVQoUEVFSzMyKFBPV0VSX01PREVfQ1RSTCksIFBPV0VSX01PREVfQ1RSTCwgTU9ERSkpOworfQorCisKKy8qCisgKiBTTTUweCBjYW4gb3BlcmF0ZSBpbiBvbmUgb2YgdGhyZWUgbW9kZXM6IDAsIDEgb3IgU2xlZXAuCisgKiBPbiBoYXJkd2FyZSByZXNldCwgcG93ZXIgbW9kZSAwIGlzIGRlZmF1bHQuCisgKi8KK3ZvaWQgc2V0UG93ZXJNb2RlKHVuc2lnbmVkIGludCBwb3dlck1vZGUpCit7CisgICAgdW5zaWduZWQgaW50IGNvbnRyb2xfdmFsdWUgPSAwOworCisgICAgY29udHJvbF92YWx1ZSA9IFBFRUszMihQT1dFUl9NT0RFX0NUUkwpOworCisJaWYoZ2V0Q2hpcFR5cGUoKSA9PSBTTTc1MExFKQorCQlyZXR1cm47CisKKyAgICBzd2l0Y2ggKHBvd2VyTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgUE9XRVJfTU9ERV9DVFJMX01PREVfTU9ERTA6CisgICAgICAgICAgICBjb250cm9sX3ZhbHVlID0gRklFTERfU0VUKGNvbnRyb2xfdmFsdWUsIFBPV0VSX01PREVfQ1RSTCwgTU9ERSwgTU9ERTApOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBQT1dFUl9NT0RFX0NUUkxfTU9ERV9NT0RFMToKKyAgICAgICAgICAgIGNvbnRyb2xfdmFsdWUgPSBGSUVMRF9TRVQoY29udHJvbF92YWx1ZSwgUE9XRVJfTU9ERV9DVFJMLCBNT0RFLCBNT0RFMSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBPV0VSX01PREVfQ1RSTF9NT0RFX1NMRUVQOgorICAgICAgICAgICAgY29udHJvbF92YWx1ZSA9IEZJRUxEX1NFVChjb250cm9sX3ZhbHVlLCBQT1dFUl9NT0RFX0NUUkwsIE1PREUsIFNMRUVQKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvKiBTZXQgdXAgb3RoZXIgZmllbGRzIGluIFBvd2VyIENvbnRyb2wgUmVnaXN0ZXIgKi8KKyAgICBpZiAocG93ZXJNb2RlID09IFBPV0VSX01PREVfQ1RSTF9NT0RFX1NMRUVQKQorICAgIHsKKyAgICAgICAgY29udHJvbF92YWx1ZSA9CisjaWZkZWYgVkFMSURBVElPTl9DSElQCisgICAgICAgICAgICBGSUVMRF9TRVQoICBjb250cm9sX3ZhbHVlLCBQT1dFUl9NT0RFX0NUUkwsIDMzNkNMSywgT0ZGKSB8CisjZW5kaWYKKyAgICAgICAgICAgIEZJRUxEX1NFVCggIGNvbnRyb2xfdmFsdWUsIFBPV0VSX01PREVfQ1RSTCwgT1NDX0lOUFVULCAgT0ZGKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29udHJvbF92YWx1ZSA9CisjaWZkZWYgVkFMSURBVElPTl9DSElQCisgICAgICAgICAgICBGSUVMRF9TRVQoICBjb250cm9sX3ZhbHVlLCBQT1dFUl9NT0RFX0NUUkwsIDMzNkNMSywgT04pIHwKKyNlbmRpZgorICAgICAgICAgICAgRklFTERfU0VUKCAgY29udHJvbF92YWx1ZSwgUE9XRVJfTU9ERV9DVFJMLCBPU0NfSU5QVVQsICBPTik7CisgICAgfQorCisgICAgLyogUHJvZ3JhbSBuZXcgcG93ZXIgbW9kZS4gKi8KKyAgICBQT0tFMzIoUE9XRVJfTU9ERV9DVFJMLCBjb250cm9sX3ZhbHVlKTsKK30KKwordm9pZCBzZXRDdXJyZW50R2F0ZSh1bnNpZ25lZCBpbnQgZ2F0ZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgZ2F0ZV9yZWc7CisgICAgdW5zaWduZWQgaW50IG1vZGU7CisKKyAgICAvKiBHZXQgY3VycmVudCBwb3dlciBtb2RlLiAqLworICAgIG1vZGUgPSBnZXRQb3dlck1vZGUoKTsKKworICAgIHN3aXRjaCAobW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgUE9XRVJfTU9ERV9DVFJMX01PREVfTU9ERTA6CisgICAgICAgICAgICBnYXRlX3JlZyA9IE1PREUwX0dBVEU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFBPV0VSX01PREVfQ1RSTF9NT0RFX01PREUxOgorICAgICAgICAgICAgZ2F0ZV9yZWcgPSBNT0RFMV9HQVRFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdhdGVfcmVnID0gTU9ERTBfR0FURTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBQT0tFMzIoZ2F0ZV9yZWcsIGdhdGUpOworfQorCisKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlL2Rpc2FibGUgdGhlIDJEIGVuZ2luZS4KKyAqLwordm9pZCBlbmFibGUyREVuZ2luZSh1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworICAgIHVpbnQzMl90IGdhdGU7CisKKyAgICBnYXRlID0gUEVFSzMyKENVUlJFTlRfR0FURSk7CisgICAgaWYgKGVuYWJsZSkKKyAgICB7CisgICAgICAgIGdhdGUgPSBGSUVMRF9TRVQoZ2F0ZSwgQ1VSUkVOVF9HQVRFLCBERSwgIE9OKTsKKyAgICAgICAgZ2F0ZSA9IEZJRUxEX1NFVChnYXRlLCBDVVJSRU5UX0dBVEUsIENTQywgT04pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgREUsICBPRkYpOworICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgQ1NDLCBPRkYpOworICAgIH0KKworICAgIHNldEN1cnJlbnRHYXRlKGdhdGUpOworfQorCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIHRoZSBaViBQb3J0LgorICovCit2b2lkIGVuYWJsZVpWUG9ydCh1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworICAgIHVpbnQzMl90IGdhdGU7CisKKyAgICAvKiBFbmFibGUgWlYgUG9ydCBHYXRlICovCisgICAgZ2F0ZSA9IFBFRUszMihDVVJSRU5UX0dBVEUpOworICAgIGlmIChlbmFibGUpCisgICAgeworICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgWlZQT1JULCBPTik7CisjaWYgMQorICAgICAgICAvKiBVc2luZyBTb2Z0d2FyZSBJMkMgKi8KKyAgICAgICAgZ2F0ZSA9IEZJRUxEX1NFVChnYXRlLCBDVVJSRU5UX0dBVEUsIEdQSU8sIE9OKTsKKyNlbHNlCisgICAgICAgIC8qIFVzaW5nIEhhcmR3YXJlIEkyQyAqLworICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgSTJDLCAgICBPTik7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogRGlzYWJsZSBaViBQb3J0IEdhdGUuIFRoZXJlIGlzIG5vIHdheSB0byBrbm93IHdoZXRoZXIgdGhlIEdQSU8gcGlucyBhcmUgYmVpbmcgdXNlZAorICAgICAgICAgICBvciBub3QuIFRoZXJlZm9yZSwgZG8gbm90IGRpc2FibGUgdGhlIEdQSU8gZ2F0ZS4gKi8KKyAgICAgICAgZ2F0ZSA9IEZJRUxEX1NFVChnYXRlLCBDVVJSRU5UX0dBVEUsIFpWUE9SVCwgT0ZGKTsKKyAgICB9CisKKyAgICBzZXRDdXJyZW50R2F0ZShnYXRlKTsKK30KKworCit2b2lkIGVuYWJsZVNTUCh1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworICAgIHVpbnQzMl90IGdhdGU7CisKKyAgICAvKiBFbmFibGUgU1NQIEdhdGUgKi8KKyAgICBnYXRlID0gUEVFSzMyKENVUlJFTlRfR0FURSk7CisgICAgaWYgKGVuYWJsZSkKKyAgICAgICAgZ2F0ZSA9IEZJRUxEX1NFVChnYXRlLCBDVVJSRU5UX0dBVEUsIFNTUCwgT04pOworICAgIGVsc2UKKyAgICAgICAgZ2F0ZSA9IEZJRUxEX1NFVChnYXRlLCBDVVJSRU5UX0dBVEUsIFNTUCwgT0ZGKTsKKworICAgIHNldEN1cnJlbnRHYXRlKGdhdGUpOworfQorCit2b2lkIGVuYWJsZURNQSh1bnNpZ25lZCBpbnQgZW5hYmxlKQoreworICAgIHVpbnQzMl90IGdhdGU7CisKKyAgICAvKiBFbmFibGUgRE1BIEdhdGUgKi8KKyAgICBnYXRlID0gUEVFSzMyKENVUlJFTlRfR0FURSk7CisgICAgaWYgKGVuYWJsZSkKKyAgICAgICAgZ2F0ZSA9IEZJRUxEX1NFVChnYXRlLCBDVVJSRU5UX0dBVEUsIERNQSwgT04pOworICAgIGVsc2UKKyAgICAgICAgZ2F0ZSA9IEZJRUxEX1NFVChnYXRlLCBDVVJSRU5UX0dBVEUsIERNQSwgT0ZGKTsKKworICAgIHNldEN1cnJlbnRHYXRlKGdhdGUpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBlbmFibGUvZGlzYWJsZSB0aGUgR1BJTyBFbmdpbmUKKyAqLwordm9pZCBlbmFibGVHUElPKHVuc2lnbmVkIGludCBlbmFibGUpCit7CisgICAgdWludDMyX3QgZ2F0ZTsKKworICAgIC8qIEVuYWJsZSBHUElPIEdhdGUgKi8KKyAgICBnYXRlID0gUEVFSzMyKENVUlJFTlRfR0FURSk7CisgICAgaWYgKGVuYWJsZSkKKyAgICAgICAgZ2F0ZSA9IEZJRUxEX1NFVChnYXRlLCBDVVJSRU5UX0dBVEUsIEdQSU8sIE9OKTsKKyAgICBlbHNlCisgICAgICAgIGdhdGUgPSBGSUVMRF9TRVQoZ2F0ZSwgQ1VSUkVOVF9HQVRFLCBHUElPLCBPRkYpOworCisgICAgc2V0Q3VycmVudEdhdGUoZ2F0ZSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIHRoZSBQV00gRW5naW5lCisgKi8KK3ZvaWQgZW5hYmxlUFdNKHVuc2lnbmVkIGludCBlbmFibGUpCit7CisgICAgdWludDMyX3QgZ2F0ZTsKKworICAgIC8qIEVuYWJsZSBQV00gR2F0ZSAqLworICAgIGdhdGUgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKTsKKyAgICBpZiAoZW5hYmxlKQorICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgUFdNLCBPTik7CisgICAgZWxzZQorICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgUFdNLCBPRkYpOworCisgICAgc2V0Q3VycmVudEdhdGUoZ2F0ZSk7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIHRoZSBJMkMgRW5naW5lCisgKi8KK3ZvaWQgZW5hYmxlSTJDKHVuc2lnbmVkIGludCBlbmFibGUpCit7CisgICAgdWludDMyX3QgZ2F0ZTsKKworICAgIC8qIEVuYWJsZSBJMkMgR2F0ZSAqLworICAgIGdhdGUgPSBQRUVLMzIoQ1VSUkVOVF9HQVRFKTsKKyAgICBpZiAoZW5hYmxlKQorICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgSTJDLCBPTik7CisgICAgZWxzZQorICAgICAgICBnYXRlID0gRklFTERfU0VUKGdhdGUsIENVUlJFTlRfR0FURSwgSTJDLCBPRkYpOworCisgICAgc2V0Q3VycmVudEdhdGUoZ2F0ZSk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3Bvd2VyLmggYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcG93ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWRjN2Y5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3Bvd2VyLmgKQEAgLTAsMCArMSw3MSBAQAorI2lmbmRlZiBEREs3NTBfUE9XRVJfSF9fCisjZGVmaW5lIERESzc1MF9QT1dFUl9IX18KKwordHlwZWRlZiBlbnVtIF9EUE1TX3QKK3sKKyAgICBjcnREUE1TX09OID0gMHgwLAorICAgIGNydERQTVNfU1RBTkRCWSA9IDB4MSwKKyAgICBjcnREUE1TX1NVU1BFTkQgPSAweDIsCisgICAgY3J0RFBNU19PRkYgPSAweDMsCit9CitEUE1TX3Q7CisKKyNkZWZpbmUgc2V0REFDKG9mZikgXAorCQl7CVwKKwkJUE9LRTMyKE1JU0NfQ1RSTCxGSUVMRF9WQUxVRShQRUVLMzIoTUlTQ19DVFJMKSwJXAorCQkJCQkJCQkJTUlTQ19DVFJMLAlcCisJCQkJCQkJCQlEQUNfUE9XRVIsCVwKKwkJCQkJCQkJCW9mZikpOwlcCisJCX0KKwordm9pZCBkZGs3NTBfc2V0RFBNUyhEUE1TX3QpOworCit1bnNpZ25lZCBpbnQgZ2V0UG93ZXJNb2RlKHZvaWQpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBjdXJyZW50IHBvd2VyIG1vZGUKKyAqLwordm9pZCBzZXRQb3dlck1vZGUodW5zaWduZWQgaW50IHBvd2VyTW9kZSk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgY3VycmVudCBnYXRlCisgKi8KK3ZvaWQgc2V0Q3VycmVudEdhdGUodW5zaWduZWQgaW50IGdhdGUpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBlbmFibGUvZGlzYWJsZSB0aGUgMkQgZW5naW5lLgorICovCit2b2lkIGVuYWJsZTJERW5naW5lKHVuc2lnbmVkIGludCBlbmFibGUpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBlbmFibGUvZGlzYWJsZSB0aGUgWlYgUG9ydAorICovCit2b2lkIGVuYWJsZVpWUG9ydCh1bnNpZ25lZCBpbnQgZW5hYmxlKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlL2Rpc2FibGUgdGhlIERNQSBFbmdpbmUKKyAqLwordm9pZCBlbmFibGVETUEodW5zaWduZWQgaW50IGVuYWJsZSk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIHRoZSBHUElPIEVuZ2luZQorICovCit2b2lkIGVuYWJsZUdQSU8odW5zaWduZWQgaW50IGVuYWJsZSk7CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZS9kaXNhYmxlIHRoZSBQV00gRW5naW5lCisgKi8KK3ZvaWQgZW5hYmxlUFdNKHVuc2lnbmVkIGludCBlbmFibGUpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBlbmFibGUvZGlzYWJsZSB0aGUgSTJDIEVuZ2luZQorICovCit2b2lkIGVuYWJsZUkyQyh1bnNpZ25lZCBpbnQgZW5hYmxlKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlL2Rpc2FibGUgdGhlIFNTUC4KKyAqLwordm9pZCBlbmFibGVTU1AodW5zaWduZWQgaW50IGVuYWJsZSk7CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcmVnLmggYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfcmVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxNmY5NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9yZWcuaApAQCAtMCwwICsxLDI2MTYgQEAKKyNpZm5kZWYgRERLNzUwX1JFR19IX18KKyNkZWZpbmUgRERLNzUwX1JFR19IX18KKworLyogTmV3IHJlZ2lzdGVyIGZvciBTTTc1MExFICovCisjZGVmaW5lIERFX1NUQVRFMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDA1NAorI2RlZmluZSBERV9TVEFURTFfREVfQUJPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIERFX1NUQVRFMV9ERV9BQk9SVF9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUQVRFMV9ERV9BQk9SVF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgREVfU1RBVEUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDU4CisjZGVmaW5lIERFX1NUQVRFMl9ERV9GSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgREVfU1RBVEUyX0RFX0ZJRk9fTk9URU1QVFkgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfU1RBVEUyX0RFX0ZJRk9fRU1QVFkgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfU1RBVEUyX0RFX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBERV9TVEFURTJfREVfU1RBVFVTX0lETEUgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVEFURTJfREVfU1RBVFVTX0JVU1kgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9TVEFURTJfREVfTUVNX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMToxCisjZGVmaW5lIERFX1NUQVRFMl9ERV9NRU1fRklGT19OT1RFTVBUWSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUQVRFMl9ERV9NRU1fRklGT19FTVBUWSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX1NUQVRFMl9ERV9SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKworCisKKyNkZWZpbmUgU1lTVEVNX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RQTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMAorI2RlZmluZSBTWVNURU1fQ1RSTF9EUE1TX1ZQSFAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9EUE1TX1ZQSE4gICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9EUE1TX1ZOSFAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBTWVNURU1fQ1RSTF9EUE1TX1ZOSE4gICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfQlVSU1QgICAgICAgICAgICAgICAgICAgICAgICAgMjk6MjkKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX0JVUlNUX09GRiAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX0JVUlNUX09OICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX01BU1RFUiAgICAgICAgICAgICAgICAgICAgICAgIDI1OjI1CisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9NQVNURVJfT0ZGICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9NQVNURVJfT04gICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX0xBVEVOQ1lfVElNRVIgICAgICAgICAgICAgICAgICAgICAyNDoyNAorI2RlZmluZSBTWVNURU1fQ1RSTF9MQVRFTkNZX1RJTUVSX09OICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9MQVRFTkNZX1RJTUVSX09GRiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9ERV9GSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM6MjMKKyNkZWZpbmUgU1lTVEVNX0NUUkxfREVfRklGT19OT1RFTVBUWSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfREVfRklGT19FTVBUWSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfREVfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgIDIyOjIyCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RFX1NUQVRVU19JRExFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RFX1NUQVRVU19CVVNZICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RFX01FTV9GSUZPICAgICAgICAgICAgICAgICAgICAgICAyMToyMQorI2RlZmluZSBTWVNURU1fQ1RSTF9ERV9NRU1fRklGT19OT1RFTVBUWSAgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9ERV9NRU1fRklGT19FTVBUWSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9DU0NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgMjA6MjAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfQ1NDX1NUQVRVU19JRExFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfQ1NDX1NUQVRVU19CVVNZICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfQ1JUX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgICAgIDE5OjE5CisjZGVmaW5lIFNZU1RFTV9DVFJMX0NSVF9WU1lOQ19JTkFDVElWRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX0NSVF9WU1lOQ19BQ1RJVkUgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BBTkVMX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgICAxODoxOAorI2RlZmluZSBTWVNURU1fQ1RSTF9QQU5FTF9WU1lOQ19JTkFDVElWRSAgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9QQU5FTF9WU1lOQ19BQ1RJVkUgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9DVVJSRU5UX0JVRkZFUiAgICAgICAgICAgICAgICAgICAgMTc6MTcKKyNkZWZpbmUgU1lTVEVNX0NUUkxfQ1VSUkVOVF9CVUZGRVJfTk9STUFMICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfQ1VSUkVOVF9CVUZGRVJfRkxJUF9QRU5ESU5HICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfRE1BX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgIDE2OjE2CisjZGVmaW5lIFNZU1RFTV9DVFJMX0RNQV9TVEFUVVNfSURMRSAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX0RNQV9TVEFUVVNfQlVTWSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9CVVJTVF9SRUFEICAgICAgICAgICAgICAgICAgICAxNToxNQorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfQlVSU1RfUkVBRF9PRkYgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfQlVSU1RfUkVBRF9PTiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9ERV9BQk9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTMKKyNkZWZpbmUgU1lTVEVNX0NUUkxfREVfQUJPUlRfT0ZGICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfREVfQUJPUlRfT04gICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX1NVQlNZU19JRF9MT0NLICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9TVUJTWVNfSURfTE9DS19PRkYgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9TVUJTWVNfSURfTE9DS19PTiAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSV9SRVRSWSAgICAgICAgICAgICAgICAgICAgICAgICA3OjcKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX1JFVFJZX09OICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX1JFVFJZX09GRiAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJX1NMQVZFX0JVUlNUX1JFQURfU0laRSAgICAgICAgIDU6NAorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfU0xBVkVfQlVSU1RfUkVBRF9TSVpFXzEgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfU0xBVkVfQlVSU1RfUkVBRF9TSVpFXzIgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfU0xBVkVfQlVSU1RfUkVBRF9TSVpFXzQgICAgICAgMgorI2RlZmluZSBTWVNURU1fQ1RSTF9QQ0lfU0xBVkVfQlVSU1RfUkVBRF9TSVpFXzggICAgICAgMworI2RlZmluZSBTWVNURU1fQ1RSTF9DUlRfVFJJU1RBVEUgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIFNZU1RFTV9DVFJMX0NSVF9UUklTVEFURV9PRkYgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX0NSVF9UUklTVEFURV9PTiAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BDSU1FTV9UUklTVEFURSAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJTUVNX1RSSVNUQVRFX09GRiAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1lTVEVNX0NUUkxfUENJTUVNX1RSSVNUQVRFX09OICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgU1lTVEVNX0NUUkxfTE9DQUxNRU1fVFJJU1RBVEUgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBTWVNURU1fQ1RSTF9MT0NBTE1FTV9UUklTVEFURV9PRkYgICAgICAgICAgICAgMAorI2RlZmluZSBTWVNURU1fQ1RSTF9MT0NBTE1FTV9UUklTVEFURV9PTiAgICAgICAgICAgICAgMQorI2RlZmluZSBTWVNURU1fQ1RSTF9QQU5FTF9UUklTVEFURSAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BBTkVMX1RSSVNUQVRFX09GRiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNZU1RFTV9DVFJMX1BBTkVMX1RSSVNUQVRFX09OICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgTUlTQ19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0CisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1JFUkVTSF9DT1VOVCAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9SRVJFU0hfQ09VTlRfMVJPVyAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9SRVJFU0hfQ09VTlRfM1JPVyAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9SRUZSRVNIX1RJTUUgICAgICAgICAgICAgICAgICAgMjY6MjUKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fUkVGUkVTSF9USU1FXzggICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fUkVGUkVTSF9USU1FXzE2ICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fUkVGUkVTSF9USU1FXzMyICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fUkVGUkVTSF9USU1FXzY0ICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUlTQ19DVFJMX0lOVF9PVVRQVVQgICAgICAgICAgICAgICAgICAgICAgICAgIDI0OjI0CisjZGVmaW5lIE1JU0NfQ1RSTF9JTlRfT1VUUFVUX05PUk1BTCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9JTlRfT1VUUFVUX0lOVkVSVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9QTExfQ0xLX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAyMzoyMworI2RlZmluZSBNSVNDX0NUUkxfUExMX0NMS19DT1VOVF9PRkYgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfUExMX0NMS19DT1VOVF9PTiAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfREFDX1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA6MjAKKyNkZWZpbmUgTUlTQ19DVFJMX0RBQ19QT1dFUl9PTiAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0RBQ19QT1dFUl9PRkYgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX0NMS19TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OjE2CisjZGVmaW5lIE1JU0NfQ1RSTF9DTEtfU0VMRUNUX09TQyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9DTEtfU0VMRUNUX1RFU1RDTEsgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX0NPTFVNTl9TSVpFICAgICAgICAgICAgICAgICAgICAxNToxNAorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9DT0xVTU5fU0laRV8yNTYgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9DT0xVTU5fU0laRV81MTIgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9DT0xVTU5fU0laRV8xMDI0ICAgICAgICAgICAgICAgMgorI2RlZmluZSBNSVNDX0NUUkxfTE9DQUxNRU1fU0laRSAgICAgICAgICAgICAgICAgICAgICAgMTM6MTIKKyNkZWZpbmUgTUlTQ19DVFJMX0xPQ0FMTUVNX1NJWkVfOE0gICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUlTQ19DVFJMX0xPQ0FMTUVNX1NJWkVfMTZNICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0xPQ0FMTUVNX1NJWkVfMzJNICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX0xPQ0FMTUVNX1NJWkVfNjRNICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fVFdUUiAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1RXVFJfMkNMSyAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1RXVFJfMUNMSyAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1RXUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9UV1JfM0NMSyAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9UV1JfMkNMSyAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9UUlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1RSUF8zQ0xLICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1RSUF80Q0xLICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX1RSRkMgICAgICAgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fVFJGQ18xMkNMSyAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fVFJGQ18xNENMSyAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fVFJBUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6NworI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9UUkFTXzdDTEsgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfRFJBTV9UUkFTXzhDTEsgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfTE9DQUxNRU1fUkVTRVQgICAgICAgICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIE1JU0NfQ1RSTF9MT0NBTE1FTV9SRVNFVF9SRVNFVCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9MT0NBTE1FTV9SRVNFVF9OT1JNQUwgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9MT0NBTE1FTV9TVEFURSAgICAgICAgICAgICAgICAgICAgICA1OjUKKyNkZWZpbmUgTUlTQ19DVFJMX0xPQ0FMTUVNX1NUQVRFX0FDVElWRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0xPQ0FMTUVNX1NUQVRFX0lOQUNUSVZFICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX0NQVV9DQVNfTEFURU5DWSAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBNSVNDX0NUUkxfQ1BVX0NBU19MQVRFTkNZXzJDTEsgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfQ1BVX0NBU19MQVRFTkNZXzNDTEsgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfRExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIE1JU0NfQ1RSTF9ETExfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9ETExfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JU0NfQ1RSTF9EUkFNX09VVFBVVCAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fT1VUUFVUX0xPVyAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTUlTQ19DVFJMX0RSQU1fT1VUUFVUX0hJR0ggICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTUlTQ19DVFJMX0xPQ0FMTUVNX0JVU19TSVpFICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBNSVNDX0NUUkxfTE9DQUxNRU1fQlVTX1NJWkVfMzIgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNSVNDX0NUUkxfTE9DQUxNRU1fQlVTX1NJWkVfNjQgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNSVNDX0NUUkxfRU1CRURERURfTE9DQUxNRU0gICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIE1JU0NfQ1RSTF9FTUJFRERFRF9MT0NBTE1FTV9PTiAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1JU0NfQ1RSTF9FTUJFRERFRF9MT0NBTE1FTV9PRkYgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgR1BJT19NVVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4CisjZGVmaW5lIEdQSU9fTVVYXzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBHUElPX01VWF8zMV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8zMV9JMkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8zMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA6MzAKKyNkZWZpbmUgR1BJT19NVVhfMzBfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMzBfSTJDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OjI5CisjZGVmaW5lIEdQSU9fTVVYXzI5X0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzI5X1NTUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODoyOAorI2RlZmluZSBHUElPX01VWF8yOF9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8yOF9TU1AxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8yNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgR1BJT19NVVhfMjdfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMjdfU1NQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIEdQSU9fTVVYXzI2X0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzI2X1NTUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNToyNQorI2RlZmluZSBHUElPX01VWF8yNV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8yNV9TU1AxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8yNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ6MjQKKyNkZWZpbmUgR1BJT19NVVhfMjRfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMjRfU1NQMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzOjIzCisjZGVmaW5lIEdQSU9fTVVYXzIzX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzIzX1NTUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjoyMgorI2RlZmluZSBHUElPX01VWF8yMl9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8yMl9TU1AwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8yMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE6MjEKKyNkZWZpbmUgR1BJT19NVVhfMjFfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMjFfU1NQMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOjIwCisjZGVmaW5lIEdQSU9fTVVYXzIwX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzIwX1NTUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOToxOQorI2RlZmluZSBHUElPX01VWF8xOV9HUElPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8xOV9QV00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8xOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg6MTgKKyNkZWZpbmUgR1BJT19NVVhfMThfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMThfUFdNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OjE3CisjZGVmaW5lIEdQSU9fTVVYXzE3X0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzE3X1BXTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjoxNgorI2RlZmluZSBHUElPX01VWF8xNl9HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8xNl9URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8xNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTUKKyNkZWZpbmUgR1BJT19NVVhfMTVfR1BJT19aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMTVfVEVTVF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0OjE0CisjZGVmaW5lIEdQSU9fTVVYXzE0X0dQSU9fWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzE0X1RFU1RfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMworI2RlZmluZSBHUElPX01VWF8xM19HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8xM19URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8xMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MTIKKyNkZWZpbmUgR1BJT19NVVhfMTJfR1BJT19aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMTJfVEVTVF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIEdQSU9fTVVYXzExX0dQSU9fWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzExX1RFU1RfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBHUElPX01VWF8xMF9HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8xMF9URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF85ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIEdQSU9fTVVYXzlfR1BJT19aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzlfVEVTVF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgR1BJT19NVVhfOF9HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfOF9URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6NworI2RlZmluZSBHUElPX01VWF83X0dQSU9fWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF83X1RFU1RfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIEdQSU9fTVVYXzZfR1BJT19aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzZfVEVTVF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OjUKKyNkZWZpbmUgR1BJT19NVVhfNV9HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfNV9URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBHUElPX01VWF80X0dQSU9fWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF80X1RFU1RfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIEdQSU9fTVVYXzNfR1BJT19aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzNfVEVTVF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fTVVYXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgR1BJT19NVVhfMl9HUElPX1pWUE9SVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19NVVhfMl9URVNUX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19NVVhfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBHUElPX01VWF8xX0dQSU9fWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX01VWF8xX1RFU1RfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX01VWF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIEdQSU9fTVVYXzBfR1BJT19aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fTVVYXzBfVEVTVF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDBDCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1JPVEFURSAgICAgICAgICAgICAgICAgICAyODoyOAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9ST1RBVEVfT0ZGICAgICAgICAgICAgICAgMAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9ST1RBVEVfT04gICAgICAgICAgICAgICAgMQorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9WR0EgICAgICAgICAgICAgICAgICAgICAgMjY6MjQKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVkdBX09GRiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzEgICAgICAgICAgIDEKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzIgICAgICAgICAgIDIKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzMgICAgICAgICAgIDMKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzQgICAgICAgICAgIDQKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzUgICAgICAgICAgIDUKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzYgICAgICAgICAgIDYKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVkdBX1BSSU9SSVRZXzcgICAgICAgICAgIDcKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fRE1BICAgICAgICAgICAgICAgICAgICAgIDIyOjIwCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0RNQV9PRkYgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV8xICAgICAgICAgICAxCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV8yICAgICAgICAgICAyCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV8zICAgICAgICAgICAzCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV80ICAgICAgICAgICA0CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV81ICAgICAgICAgICA1CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV82ICAgICAgICAgICA2CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0RNQV9QUklPUklUWV83ICAgICAgICAgICA3CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX1pWUE9SVDEgICAgICAgICAgICAgICAgICAxODoxNgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX09GRiAgICAgICAgICAgICAgMAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzEgICAgICAgMQorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzIgICAgICAgMgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzMgICAgICAgMworI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzQgICAgICAgNAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzUgICAgICAgNQorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzYgICAgICAgNgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQxX1BSSU9SSVRZXzcgICAgICAgNworI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9aVlBPUlQwICAgICAgICAgICAgICAgICAgMTQ6MTIKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9PRkYgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV8xICAgICAgIDEKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV8yICAgICAgIDIKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV8zICAgICAgIDMKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV80ICAgICAgIDQKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV81ICAgICAgIDUKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV82ICAgICAgIDYKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fWlZQT1JUMF9QUklPUklUWV83ICAgICAgIDcKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVklERU8gICAgICAgICAgICAgICAgICAgIDEwOjgKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVklERU9fT0ZGICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfMSAgICAgICAgIDEKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfMiAgICAgICAgIDIKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfMyAgICAgICAgIDMKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfNCAgICAgICAgIDQKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfNSAgICAgICAgIDUKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfNiAgICAgICAgIDYKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fVklERU9fUFJJT1JJVFlfNyAgICAgICAgIDcKKyNkZWZpbmUgTE9DQUxNRU1fQVJCSVRSQVRJT05fUEFORUwgICAgICAgICAgICAgICAgICAgIDY6NAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9QQU5FTF9PRkYgICAgICAgICAgICAgICAgMAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV8xICAgICAgICAgMQorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV8yICAgICAgICAgMgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV8zICAgICAgICAgMworI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV80ICAgICAgICAgNAorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV81ICAgICAgICAgNQorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV82ICAgICAgICAgNgorI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9QQU5FTF9QUklPUklUWV83ICAgICAgICAgNworI2RlZmluZSBMT0NBTE1FTV9BUkJJVFJBVElPTl9DUlQgICAgICAgICAgICAgICAgICAgICAgMjowCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0NSVF9PRkYgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV8xICAgICAgICAgICAxCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV8yICAgICAgICAgICAyCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV8zICAgICAgICAgICAzCisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV80ICAgICAgICAgICA0CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV81ICAgICAgICAgICA1CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV82ICAgICAgICAgICA2CisjZGVmaW5lIExPQ0FMTUVNX0FSQklUUkFUSU9OX0NSVF9QUklPUklUWV83ICAgICAgICAgICA3CisKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9ST1RBVEUgICAgICAgICAgICAgICAgICAgICAyODoyOAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fUk9UQVRFX09GRiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fUk9UQVRFX09OICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fVkdBICAgICAgICAgICAgICAgICAgICAgICAgMjY6MjQKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZHQV9PRkYgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZHQV9QUklPUklUWV8xICAgICAgICAgICAgIDEKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZHQV9QUklPUklUWV8yICAgICAgICAgICAgIDIKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZHQV9QUklPUklUWV8zICAgICAgICAgICAgIDMKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZHQV9QUklPUklUWV80ICAgICAgICAgICAgIDQKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZHQV9QUklPUklUWV81ICAgICAgICAgICAgIDUKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZHQV9QUklPUklUWV82ICAgICAgICAgICAgIDYKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZHQV9QUklPUklUWV83ICAgICAgICAgICAgIDcKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX0RNQSAgICAgICAgICAgICAgICAgICAgICAgIDIyOjIwCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9ETUFfT0ZGICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9ETUFfUFJJT1JJVFlfMSAgICAgICAgICAgICAxCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9ETUFfUFJJT1JJVFlfMiAgICAgICAgICAgICAyCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9ETUFfUFJJT1JJVFlfMyAgICAgICAgICAgICAzCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9ETUFfUFJJT1JJVFlfNCAgICAgICAgICAgICA0CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9ETUFfUFJJT1JJVFlfNSAgICAgICAgICAgICA1CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9ETUFfUFJJT1JJVFlfNiAgICAgICAgICAgICA2CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9ETUFfUFJJT1JJVFlfNyAgICAgICAgICAgICA3CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9aVlBPUlQxICAgICAgICAgICAgICAgICAgICAxODoxNgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMV9PRkYgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMV9QUklPUklUWV8xICAgICAgICAgMQorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMV9QUklPUklUWV8yICAgICAgICAgMgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMV9QUklPUklUWV8zICAgICAgICAgMworI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMV9QUklPUklUWV80ICAgICAgICAgNAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMV9QUklPUklUWV81ICAgICAgICAgNQorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMV9QUklPUklUWV82ICAgICAgICAgNgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMV9QUklPUklUWV83ICAgICAgICAgNworI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fWlZQT1JUMCAgICAgICAgICAgICAgICAgICAgMTQ6MTIKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1pWUE9SVDBfT0ZGICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1pWUE9SVDBfUFJJT1JJVFlfMSAgICAgICAgIDEKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1pWUE9SVDBfUFJJT1JJVFlfMiAgICAgICAgIDIKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1pWUE9SVDBfUFJJT1JJVFlfMyAgICAgICAgIDMKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1pWUE9SVDBfUFJJT1JJVFlfNCAgICAgICAgIDQKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1pWUE9SVDBfUFJJT1JJVFlfNSAgICAgICAgIDUKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1pWUE9SVDBfUFJJT1JJVFlfNiAgICAgICAgIDYKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1pWUE9SVDBfUFJJT1JJVFlfNyAgICAgICAgIDcKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZJREVPICAgICAgICAgICAgICAgICAgICAgIDEwOjgKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZJREVPX09GRiAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZJREVPX1BSSU9SSVRZXzEgICAgICAgICAgIDEKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZJREVPX1BSSU9SSVRZXzIgICAgICAgICAgIDIKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZJREVPX1BSSU9SSVRZXzMgICAgICAgICAgIDMKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZJREVPX1BSSU9SSVRZXzQgICAgICAgICAgIDQKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZJREVPX1BSSU9SSVRZXzUgICAgICAgICAgIDUKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZJREVPX1BSSU9SSVRZXzYgICAgICAgICAgIDYKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1ZJREVPX1BSSU9SSVRZXzcgICAgICAgICAgIDcKKyNkZWZpbmUgUENJTUVNX0FSQklUUkFUSU9OX1BBTkVMICAgICAgICAgICAgICAgICAgICAgIDY6NAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fUEFORUxfT0ZGICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fUEFORUxfUFJJT1JJVFlfMSAgICAgICAgICAgMQorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fUEFORUxfUFJJT1JJVFlfMiAgICAgICAgICAgMgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fUEFORUxfUFJJT1JJVFlfMyAgICAgICAgICAgMworI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fUEFORUxfUFJJT1JJVFlfNCAgICAgICAgICAgNAorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fUEFORUxfUFJJT1JJVFlfNSAgICAgICAgICAgNQorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fUEFORUxfUFJJT1JJVFlfNiAgICAgICAgICAgNgorI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fUEFORUxfUFJJT1JJVFlfNyAgICAgICAgICAgNworI2RlZmluZSBQQ0lNRU1fQVJCSVRSQVRJT05fQ1JUICAgICAgICAgICAgICAgICAgICAgICAgMjowCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9DUlRfT0ZGICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9DUlRfUFJJT1JJVFlfMSAgICAgICAgICAgICAxCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9DUlRfUFJJT1JJVFlfMiAgICAgICAgICAgICAyCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9DUlRfUFJJT1JJVFlfMyAgICAgICAgICAgICAzCisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9DUlRfUFJJT1JJVFlfNCAgICAgICAgICAgICA0CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9DUlRfUFJJT1JJVFlfNSAgICAgICAgICAgICA1CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9DUlRfUFJJT1JJVFlfNiAgICAgICAgICAgICA2CisjZGVmaW5lIFBDSU1FTV9BUkJJVFJBVElPTl9DUlRfUFJJT1JJVFlfNyAgICAgICAgICAgICA3CisKKyNkZWZpbmUgUkFXX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwCisjZGVmaW5lIFJBV19JTlRfWlZQT1JUMV9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICA0OjQKKyNkZWZpbmUgUkFXX0lOVF9aVlBPUlQxX1ZTWU5DX0lOQUNUSVZFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkFXX0lOVF9aVlBPUlQxX1ZTWU5DX0FDVElWRSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkFXX0lOVF9aVlBPUlQxX1ZTWU5DX0NMRUFSICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkFXX0lOVF9aVlBPUlQwX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBSQVdfSU5UX1pWUE9SVDBfVlNZTkNfSU5BQ1RJVkUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSQVdfSU5UX1pWUE9SVDBfVlNZTkNfQUNUSVZFICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSQVdfSU5UX1pWUE9SVDBfVlNZTkNfQ0xFQVIgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSQVdfSU5UX0NSVF9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIFJBV19JTlRfQ1JUX1ZTWU5DX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFJBV19JTlRfQ1JUX1ZTWU5DX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJBV19JTlRfQ1JUX1ZTWU5DX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFJBV19JTlRfUEFORUxfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgUkFXX0lOVF9QQU5FTF9WU1lOQ19JTkFDVElWRSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkFXX0lOVF9QQU5FTF9WU1lOQ19BQ1RJVkUgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkFXX0lOVF9QQU5FTF9WU1lOQ19DTEVBUiAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUkFXX0lOVF9WR0FfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6MAorI2RlZmluZSBSQVdfSU5UX1ZHQV9WU1lOQ19JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBSQVdfSU5UX1ZHQV9WU1lOQ19BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBSQVdfSU5UX1ZHQV9WU1lOQ19DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIElOVF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyNAorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8zMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMzFfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMzFfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOjMwCisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzMwX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzMwX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOToyOQorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8yOV9JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8yOV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8yOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg6MjgKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMjhfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMjhfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzI3X0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzI3X0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfR1BJTzI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8yNl9JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8yNl9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX0dQSU8yNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU6MjUKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMjVfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19HUElPMjVfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19JMkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOjEyCisjZGVmaW5lIElOVF9TVEFUVVNfSTJDX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfSTJDX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfUFdNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMToxMQorI2RlZmluZSBJTlRfU1RBVFVTX1BXTV9JTkFDVElWRSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX1BXTV9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX0RNQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgSU5UX1NUQVRVU19ETUExX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19ETUExX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19ETUEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk6OQorI2RlZmluZSBJTlRfU1RBVFVTX0RNQTBfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX0RNQTBfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX1BDSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODo4CisjZGVmaW5lIElOVF9TVEFUVVNfUENJX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfUENJX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfU1NQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjcKKyNkZWZpbmUgSU5UX1NUQVRVU19TU1AxX0lOQUNUSVZFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19TU1AxX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19TU1AwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY6NgorI2RlZmluZSBJTlRfU1RBVFVTX1NTUDBfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX1NTUDBfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTo1CisjZGVmaW5lIElOVF9TVEFUVVNfREVfSU5BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfREVfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfWlZQT1JUMV9WU1lOQyAgICAgICAgICAgICAgICAgICAgICA0OjQKKyNkZWZpbmUgSU5UX1NUQVRVU19aVlBPUlQxX1ZTWU5DX0lOQUNUSVZFICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19aVlBPUlQxX1ZTWU5DX0FDVElWRSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19aVlBPUlQwX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBJTlRfU1RBVFVTX1pWUE9SVDBfVlNZTkNfSU5BQ1RJVkUgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX1pWUE9SVDBfVlNZTkNfQUNUSVZFICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfU1RBVFVTX0NSVF9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIElOVF9TVEFUVVNfQ1JUX1ZTWU5DX0lOQUNUSVZFICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9TVEFUVVNfQ1JUX1ZTWU5DX0FDVElWRSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9TVEFUVVNfUEFORUxfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgSU5UX1NUQVRVU19QQU5FTF9WU1lOQ19JTkFDVElWRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX1NUQVRVU19QQU5FTF9WU1lOQ19BQ1RJVkUgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX1NUQVRVU19WR0FfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgIDA6MAorI2RlZmluZSBJTlRfU1RBVFVTX1ZHQV9WU1lOQ19JTkFDVElWRSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfU1RBVFVTX1ZHQV9WU1lOQ19BQ1RJVkUgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIElOVF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyOAorI2RlZmluZSBJTlRfTUFTS19HUElPMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzMxX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzMxX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOjMwCisjZGVmaW5lIElOVF9NQVNLX0dQSU8zMF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX0dQSU8zMF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX0dQSU8yOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOToyOQorI2RlZmluZSBJTlRfTUFTS19HUElPMjlfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19HUElPMjlfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19HUElPMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg6MjgKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzI4X0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzI4X0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIElOVF9NQVNLX0dQSU8yN19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX0dQSU8yN19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX0dQSU8yNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBJTlRfTUFTS19HUElPMjZfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19HUElPMjZfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19HUElPMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU6MjUKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzI1X0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfR1BJTzI1X0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfSTJDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOjEyCisjZGVmaW5lIElOVF9NQVNLX0kyQ19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX0kyQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX1BXTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMToxMQorI2RlZmluZSBJTlRfTUFTS19QV01fRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19QV01fRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19ETUExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgSU5UX01BU0tfRE1BMV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfRE1BMV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk6OQorI2RlZmluZSBJTlRfTUFTS19ETUFfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19ETUFfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19QQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODo4CisjZGVmaW5lIElOVF9NQVNLX1BDSV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX1BDSV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX1NTUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjcKKyNkZWZpbmUgSU5UX01BU0tfU1NQMV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfU1NQMV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfU1NQMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY6NgorI2RlZmluZSBJTlRfTUFTS19TU1AwX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19TU1AwX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19ERSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTo1CisjZGVmaW5lIElOVF9NQVNLX0RFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX0RFX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX1pWUE9SVDFfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICA0OjQKKyNkZWZpbmUgSU5UX01BU0tfWlZQT1JUMV9WU1lOQ19ESVNBQkxFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfWlZQT1JUMV9WU1lOQ19FTkFCTEUgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfWlZQT1JUMF9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBJTlRfTUFTS19aVlBPUlQwX1ZTWU5DX0RJU0FCTEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19aVlBPUlQwX1ZTWU5DX0VOQUJMRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJTlRfTUFTS19DUlRfVlNZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIElOVF9NQVNLX0NSVF9WU1lOQ19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElOVF9NQVNLX0NSVF9WU1lOQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVF9NQVNLX1BBTkVMX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgSU5UX01BU0tfUEFORUxfVlNZTkNfRElTQUJMRSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5UX01BU0tfUEFORUxfVlNZTkNfRU5BQkxFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSU5UX01BU0tfVkdBX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6MAorI2RlZmluZSBJTlRfTUFTS19WR0FfVlNZTkNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJTlRfTUFTS19WR0FfVlNZTkNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIENVUlJFTlRfR0FURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MAorI2RlZmluZSBDVVJSRU5UX0dBVEVfTUNMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTQKKyNpZmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAjZGVmaW5lIENVUlJFTlRfR0FURV9NQ0xLXzExMk1IWiAgICAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSBDVVJSRU5UX0dBVEVfTUNMS184NE1IWiAgICAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX01DTEtfNTZNSFogICAgICAgICAgICAgICAgICAgICAgIDIKKyAgICAjZGVmaW5lIENVUlJFTlRfR0FURV9NQ0xLXzQyTUhaICAgICAgICAgICAgICAgICAgICAgICAzCisjZWxzZQorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX01DTEtfRElWXzMgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lIENVUlJFTlRfR0FURV9NQ0xLX0RJVl80ICAgICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSBDVVJSRU5UX0dBVEVfTUNMS19ESVZfNiAgICAgICAgICAgICAgICAgICAgICAgMgorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX01DTEtfRElWXzggICAgICAgICAgICAgICAgICAgICAgIDMKKyNlbmRpZgorI2RlZmluZSBDVVJSRU5UX0dBVEVfTTJYQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTIKKyNpZmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAjZGVmaW5lIENVUlJFTlRfR0FURV9NMlhDTEtfMzM2TUhaICAgICAgICAgICAgICAgICAgICAwCisgICAgI2RlZmluZSBDVVJSRU5UX0dBVEVfTTJYQ0xLXzE2OE1IWiAgICAgICAgICAgICAgICAgICAgMQorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX00yWENMS18xMTJNSFogICAgICAgICAgICAgICAgICAgIDIKKyAgICAjZGVmaW5lIENVUlJFTlRfR0FURV9NMlhDTEtfODRNSFogICAgICAgICAgICAgICAgICAgICAzCisjZWxzZQorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX00yWENMS19ESVZfMSAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAjZGVmaW5lIENVUlJFTlRfR0FURV9NMlhDTEtfRElWXzIgICAgICAgICAgICAgICAgICAgICAxCisgICAgI2RlZmluZSBDVVJSRU5UX0dBVEVfTTJYQ0xLX0RJVl8zICAgICAgICAgICAgICAgICAgICAgMgorICAgICNkZWZpbmUgQ1VSUkVOVF9HQVRFX00yWENMS19ESVZfNCAgICAgICAgICAgICAgICAgICAgIDMKKyNlbmRpZgorI2RlZmluZSBDVVJSRU5UX0dBVEVfVkdBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX1ZHQV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX1ZHQV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX1BXTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk6OQorI2RlZmluZSBDVVJSRU5UX0dBVEVfUFdNX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDVVJSRU5UX0dBVEVfUFdNX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDVVJSRU5UX0dBVEVfSTJDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODo4CisjZGVmaW5lIENVUlJFTlRfR0FURV9JMkNfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENVUlJFTlRfR0FURV9JMkNfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENVUlJFTlRfR0FURV9TU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjcKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX1NTUF9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX1NTUF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY6NgorI2RlZmluZSBDVVJSRU5UX0dBVEVfR1BJT19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDVVJSRU5UX0dBVEVfR1BJT19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDVVJSRU5UX0dBVEVfWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgNTo1CisjZGVmaW5lIENVUlJFTlRfR0FURV9aVlBPUlRfT0ZGICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENVUlJFTlRfR0FURV9aVlBPUlRfT04gICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENVUlJFTlRfR0FURV9DU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OjQKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0NTQ19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0NTQ19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBDVVJSRU5UX0dBVEVfREVfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDVVJSRU5UX0dBVEVfREVfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDVVJSRU5UX0dBVEVfRElTUExBWSAgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIENVUlJFTlRfR0FURV9ESVNQTEFZX09GRiAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENVUlJFTlRfR0FURV9ESVNQTEFZX09OICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENVUlJFTlRfR0FURV9MT0NBTE1FTSAgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0xPQ0FMTUVNX09GRiAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0xPQ0FMTUVNX09OICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1VSUkVOVF9HQVRFX0RNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6MAorI2RlZmluZSBDVVJSRU5UX0dBVEVfRE1BX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDVVJSRU5UX0dBVEVfRE1BX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIE1PREUwX0dBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0NAorI2RlZmluZSBNT0RFMF9HQVRFX01DTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTQKKyNkZWZpbmUgTU9ERTBfR0FURV9NQ0xLXzExMk1IWiAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTBfR0FURV9NQ0xLXzg0TUhaICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTBfR0FURV9NQ0xLXzU2TUhaICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTU9ERTBfR0FURV9NQ0xLXzQyTUhaICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTU9ERTBfR0FURV9NMlhDTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOjEyCisjZGVmaW5lIE1PREUwX0dBVEVfTTJYQ0xLXzMzNk1IWiAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUwX0dBVEVfTTJYQ0xLXzE2OE1IWiAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUwX0dBVEVfTTJYQ0xLXzExMk1IWiAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIE1PREUwX0dBVEVfTTJYQ0xLXzg0TUhaICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIE1PREUwX0dBVEVfVkdBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBNT0RFMF9HQVRFX1ZHQV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMF9HQVRFX1ZHQV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMF9HQVRFX1BXTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIE1PREUwX0dBVEVfUFdNX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUwX0dBVEVfUFdNX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUwX0dBVEVfSTJDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgTU9ERTBfR0FURV9JMkNfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTBfR0FURV9JMkNfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTBfR0FURV9TU1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6NworI2RlZmluZSBNT0RFMF9HQVRFX1NTUF9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMF9HQVRFX1NTUF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMF9HQVRFX0dQSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIE1PREUwX0dBVEVfR1BJT19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUwX0dBVEVfR1BJT19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUwX0dBVEVfWlZQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OjUKKyNkZWZpbmUgTU9ERTBfR0FURV9aVlBPUlRfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTBfR0FURV9aVlBPUlRfT04gICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTBfR0FURV9DU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBNT0RFMF9HQVRFX0NTQ19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMF9HQVRFX0NTQ19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMF9HQVRFX0RFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIE1PREUwX0dBVEVfREVfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUwX0dBVEVfREVfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUwX0dBVEVfRElTUExBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgTU9ERTBfR0FURV9ESVNQTEFZX09GRiAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTBfR0FURV9ESVNQTEFZX09OICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTBfR0FURV9MT0NBTE1FTSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBNT0RFMF9HQVRFX0xPQ0FMTUVNX09GRiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMF9HQVRFX0xPQ0FMTUVNX09OICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMF9HQVRFX0RNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIE1PREUwX0dBVEVfRE1BX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUwX0dBVEVfRE1BX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgTU9ERTFfR0FURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQ4CisjZGVmaW5lIE1PREUxX0dBVEVfTUNMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNAorI2RlZmluZSBNT0RFMV9HQVRFX01DTEtfMTEyTUhaICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMV9HQVRFX01DTEtfODRNSFogICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMV9HQVRFX01DTEtfNTZNSFogICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBNT0RFMV9HQVRFX01DTEtfNDJNSFogICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBNT0RFMV9HQVRFX00yWENMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTIKKyNkZWZpbmUgTU9ERTFfR0FURV9NMlhDTEtfMzM2TUhaICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTFfR0FURV9NMlhDTEtfMTY4TUhaICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTFfR0FURV9NMlhDTEtfMTEyTUhaICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTU9ERTFfR0FURV9NMlhDTEtfODRNSFogICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTU9ERTFfR0FURV9WR0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOjEwCisjZGVmaW5lIE1PREUxX0dBVEVfVkdBX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUxX0dBVEVfVkdBX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUxX0dBVEVfUFdNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5OjkKKyNkZWZpbmUgTU9ERTFfR0FURV9QV01fT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTFfR0FURV9QV01fT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTFfR0FURV9JMkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg6OAorI2RlZmluZSBNT0RFMV9HQVRFX0kyQ19PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMV9HQVRFX0kyQ19PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMV9HQVRFX1NTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzo3CisjZGVmaW5lIE1PREUxX0dBVEVfU1NQX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUxX0dBVEVfU1NQX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUxX0dBVEVfR1BJTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OjYKKyNkZWZpbmUgTU9ERTFfR0FURV9HUElPX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTFfR0FURV9HUElPX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTFfR0FURV9aVlBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU6NQorI2RlZmluZSBNT0RFMV9HQVRFX1pWUE9SVF9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMV9HQVRFX1pWUE9SVF9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMV9HQVRFX0NTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDo0CisjZGVmaW5lIE1PREUxX0dBVEVfQ1NDX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUxX0dBVEVfQ1NDX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUxX0dBVEVfREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgTU9ERTFfR0FURV9ERV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTFfR0FURV9ERV9PTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTU9ERTFfR0FURV9ESVNQTEFZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBNT0RFMV9HQVRFX0RJU1BMQVlfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNT0RFMV9HQVRFX0RJU1BMQVlfT04gICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNT0RFMV9HQVRFX0xPQ0FMTUVNICAgICAgICAgICAgICAgICAgICAgICAgICAgMToxCisjZGVmaW5lIE1PREUxX0dBVEVfTE9DQUxNRU1fT0ZGICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1PREUxX0dBVEVfTE9DQUxNRU1fT04gICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1PREUxX0dBVEVfRE1BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgTU9ERTFfR0FURV9ETUFfT0ZGICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTU9ERTFfR0FURV9ETUFfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBQT1dFUl9NT0RFX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNEMKKyNpZmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAjZGVmaW5lIFBPV0VSX01PREVfQ1RSTF8zMzZDTEsgICAgICAgICAgICAgICAgICAgIDQ6NAorICAgICNkZWZpbmUgUE9XRVJfTU9ERV9DVFJMXzMzNkNMS19PRkYgICAgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgUE9XRVJfTU9ERV9DVFJMXzMzNkNMS19PTiAgICAgICAgICAgICAgICAgMQorI2VuZGlmCisjZGVmaW5lIFBPV0VSX01PREVfQ1RSTF9PU0NfSU5QVVQgICAgICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgUE9XRVJfTU9ERV9DVFJMX09TQ19JTlBVVF9PRkYgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUE9XRVJfTU9ERV9DVFJMX09TQ19JTlBVVF9PTiAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUE9XRVJfTU9ERV9DVFJMX0FDUEkgICAgICAgICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBQT1dFUl9NT0RFX0NUUkxfQUNQSV9PRkYgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQT1dFUl9NT0RFX0NUUkxfQUNQSV9PTiAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQT1dFUl9NT0RFX0NUUkxfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgICAgMTowCisjZGVmaW5lIFBPV0VSX01PREVfQ1RSTF9NT0RFX01PREUwICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBPV0VSX01PREVfQ1RSTF9NT0RFX01PREUxICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBPV0VSX01PREVfQ1RSTF9NT0RFX1NMRUVQICAgICAgICAgICAgICAgICAgICAyCisKKyNkZWZpbmUgUENJX01BU1RFUl9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDUwCisjZGVmaW5lIFBDSV9NQVNURVJfQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICA3OjAKKworI2RlZmluZSBERVZJQ0VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNTQKKyNkZWZpbmUgREVWSUNFX0lEX0RFVklDRV9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIERFVklDRV9JRF9SRVZJU0lPTl9JRCAgICAgICAgICAgICAgICAgICAgICAgICA3OjAKKworI2RlZmluZSBQTExfQ0xLX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNTgKKyNkZWZpbmUgUExMX0NMS19DT1VOVF9DT1VOVEVSICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBQQU5FTF9QTExfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNUMKKyNkZWZpbmUgUEFORUxfUExMX0NUUkxfQllQQVNTICAgICAgICAgICAgICAgICAgICAgICAgIDE4OjE4CisjZGVmaW5lIFBBTkVMX1BMTF9DVFJMX0JZUEFTU19PRkYgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX1BMTF9DVFJMX0JZUEFTU19PTiAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX1BMTF9DVFJMX1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAxNzoxNworI2RlZmluZSBQQU5FTF9QTExfQ1RSTF9QT1dFUl9PRkYgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9QTExfQ1RSTF9QT1dFUl9PTiAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9QTExfQ1RSTF9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTY6MTYKKyNkZWZpbmUgUEFORUxfUExMX0NUUkxfSU5QVVRfT1NDICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfUExMX0NUUkxfSU5QVVRfVEVTVENMSyAgICAgICAgICAgICAgICAgIDEKKyNpZmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAjZGVmaW5lIFBBTkVMX1BMTF9DVFJMX09EICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjE0CisjZWxzZQorICAgICNkZWZpbmUgUEFORUxfUExMX0NUUkxfUE9EICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTQKKyAgICAjZGVmaW5lIFBBTkVMX1BMTF9DVFJMX09EICAgICAgICAgICAgICAgICAgICAgICAgIDEzOjEyCisjZW5kaWYKKyNkZWZpbmUgUEFORUxfUExMX0NUUkxfTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjgKKyNkZWZpbmUgUEFORUxfUExMX0NUUkxfTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisjZGVmaW5lIENSVF9QTExfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA2MAorI2RlZmluZSBDUlRfUExMX0NUUkxfQllQQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg6MTgKKyNkZWZpbmUgQ1JUX1BMTF9DVFJMX0JZUEFTU19PRkYgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX1BMTF9DVFJMX0JZUEFTU19PTiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX1BMTF9DVFJMX1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OjE3CisjZGVmaW5lIENSVF9QTExfQ1RSTF9QT1dFUl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9QTExfQ1RSTF9QT1dFUl9PTiAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9QTExfQ1RSTF9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjoxNgorI2RlZmluZSBDUlRfUExMX0NUUkxfSU5QVVRfT1NDICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfUExMX0NUUkxfSU5QVVRfVEVTVENMSyAgICAgICAgICAgICAgICAgICAgMQorI2lmZGVmIFZBTElEQVRJT05fQ0hJUAorICAgICNkZWZpbmUgQ1JUX1BMTF9DVFJMX09EICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTQKKyNlbHNlCisgICAgI2RlZmluZSBDUlRfUExMX0NUUkxfUE9EICAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNAorICAgICNkZWZpbmUgQ1JUX1BMTF9DVFJMX09EICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTIKKyNlbmRpZgorI2RlZmluZSBDUlRfUExMX0NUUkxfTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE6OAorI2RlZmluZSBDUlRfUExMX0NUUkxfTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzowCisKKyNkZWZpbmUgVkdBX1BMTDBfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDY0CisjZGVmaW5lIFZHQV9QTEwwX0NUUkxfQllQQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAxODoxOAorI2RlZmluZSBWR0FfUExMMF9DVFJMX0JZUEFTU19PRkYgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWR0FfUExMMF9DVFJMX0JZUEFTU19PTiAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWR0FfUExMMF9DVFJMX1BPV0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc6MTcKKyNkZWZpbmUgVkdBX1BMTDBfQ1RSTF9QT1dFUl9PRkYgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVkdBX1BMTDBfQ1RSTF9QT1dFUl9PTiAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVkdBX1BMTDBfQ1RSTF9JTlBVVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OjE2CisjZGVmaW5lIFZHQV9QTEwwX0NUUkxfSU5QVVRfT1NDICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZHQV9QTEwwX0NUUkxfSU5QVVRfVEVTVENMSyAgICAgICAgICAgICAgICAgICAxCisjaWZkZWYgVkFMSURBVElPTl9DSElQCisgICAgI2RlZmluZSBWR0FfUExMMF9DVFJMX09EICAgICAgICAgICAgICAgICAgICAgICAgICAxNToxNAorI2Vsc2UKKyAgICAjZGVmaW5lIFZHQV9QTEwwX0NUUkxfUE9EICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjE0CisgICAgI2RlZmluZSBWR0FfUExMMF9DVFJMX09EICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMgorI2VuZGlmCisjZGVmaW5lIFZHQV9QTEwwX0NUUkxfTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTo4CisjZGVmaW5lIFZHQV9QTEwwX0NUUkxfTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjAKKworI2RlZmluZSBWR0FfUExMMV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNjgKKyNkZWZpbmUgVkdBX1BMTDFfQ1RSTF9CWVBBU1MgICAgICAgICAgICAgICAgICAgICAgICAgIDE4OjE4CisjZGVmaW5lIFZHQV9QTEwxX0NUUkxfQllQQVNTX09GRiAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZHQV9QTEwxX0NUUkxfQllQQVNTX09OICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZHQV9QTEwxX0NUUkxfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzoxNworI2RlZmluZSBWR0FfUExMMV9DVFJMX1BPV0VSX09GRiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWR0FfUExMMV9DVFJMX1BPV0VSX09OICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWR0FfUExMMV9DVFJMX0lOUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY6MTYKKyNkZWZpbmUgVkdBX1BMTDFfQ1RSTF9JTlBVVF9PU0MgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVkdBX1BMTDFfQ1RSTF9JTlBVVF9URVNUQ0xLICAgICAgICAgICAgICAgICAgIDEKKyNpZmRlZiBWQUxJREFUSU9OX0NISVAKKyAgICAjZGVmaW5lIFZHQV9QTEwxX0NUUkxfT0QgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjE0CisjZWxzZQorICAgICNkZWZpbmUgVkdBX1BMTDFfQ1RSTF9QT0QgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTQKKyAgICAjZGVmaW5lIFZHQV9QTEwxX0NUUkxfT0QgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOjEyCisjZW5kaWYKKyNkZWZpbmUgVkdBX1BMTDFfQ1RSTF9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjgKKyNkZWZpbmUgVkdBX1BMTDFfQ1RSTF9NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisjZGVmaW5lIFNDUkFUQ0hfREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA2YworCisjaWZuZGVmIFZBTElEQVRJT05fQ0hJUAorCisjZGVmaW5lIE1YQ0xLX1BMTF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA3MAorI2RlZmluZSBNWENMS19QTExfQ1RSTF9CWVBBU1MgICAgICAgICAgICAgICAgICAgICAgICAgMTg6MTgKKyNkZWZpbmUgTVhDTEtfUExMX0NUUkxfQllQQVNTX09GRiAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTVhDTEtfUExMX0NUUkxfQllQQVNTX09OICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgTVhDTEtfUExMX0NUUkxfUE9XRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OjE3CisjZGVmaW5lIE1YQ0xLX1BMTF9DVFJMX1BPV0VSX09GRiAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIE1YQ0xLX1BMTF9DVFJMX1BPV0VSX09OICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1YQ0xLX1BMTF9DVFJMX0lOUFVUICAgICAgICAgICAgICAgICAgICAgICAgICAxNjoxNgorI2RlZmluZSBNWENMS19QTExfQ1RSTF9JTlBVVF9PU0MgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBNWENMS19QTExfQ1RSTF9JTlBVVF9URVNUQ0xLICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBNWENMS19QTExfQ1RSTF9QT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTQKKyNkZWZpbmUgTVhDTEtfUExMX0NUUkxfT0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzOjEyCisjZGVmaW5lIE1YQ0xLX1BMTF9DVFJMX04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTo4CisjZGVmaW5lIE1YQ0xLX1BMTF9DVFJMX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjAKKworI2RlZmluZSBWR0FfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODgKKyNkZWZpbmUgVkdBX0NPTkZJR1VSQVRJT05fVVNFUl9ERUZJTkUgICAgICAgICAgICAgICAgIDU6NAorI2RlZmluZSBWR0FfQ09ORklHVVJBVElPTl9QTEwgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIFZHQV9DT05GSUdVUkFUSU9OX1BMTF9WR0EgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZHQV9DT05GSUdVUkFUSU9OX1BMTF9QQU5FTCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZHQV9DT05GSUdVUkFUSU9OX01PREUgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgVkdBX0NPTkZJR1VSQVRJT05fTU9ERV9URVhUICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVkdBX0NPTkZJR1VSQVRJT05fTU9ERV9HUkFQSElDICAgICAgICAgICAgICAgIDEKKworI2VuZGlmCisKKyNkZWZpbmUgR1BJT19EQVRBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAKKyNkZWZpbmUgR1BJT19EQVRBXzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgR1BJT19EQVRBXzMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA6MzAKKyNkZWZpbmUgR1BJT19EQVRBXzI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjk6MjkKKyNkZWZpbmUgR1BJT19EQVRBXzI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg6MjgKKyNkZWZpbmUgR1BJT19EQVRBXzI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgR1BJT19EQVRBXzI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgR1BJT19EQVRBXzI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU6MjUKKyNkZWZpbmUgR1BJT19EQVRBXzI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ6MjQKKyNkZWZpbmUgR1BJT19EQVRBXzIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM6MjMKKyNkZWZpbmUgR1BJT19EQVRBXzIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI6MjIKKyNkZWZpbmUgR1BJT19EQVRBXzIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE6MjEKKyNkZWZpbmUgR1BJT19EQVRBXzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA6MjAKKyNkZWZpbmUgR1BJT19EQVRBXzE5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk6MTkKKyNkZWZpbmUgR1BJT19EQVRBXzE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg6MTgKKyNkZWZpbmUgR1BJT19EQVRBXzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc6MTcKKyNkZWZpbmUgR1BJT19EQVRBXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY6MTYKKyNkZWZpbmUgR1BJT19EQVRBXzE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTUKKyNkZWZpbmUgR1BJT19EQVRBXzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ6MTQKKyNkZWZpbmUgR1BJT19EQVRBXzEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTMKKyNkZWZpbmUgR1BJT19EQVRBXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MTIKKyNkZWZpbmUgR1BJT19EQVRBXzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE6MTEKKyNkZWZpbmUgR1BJT19EQVRBXzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgR1BJT19EQVRBXzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIEdQSU9fREFUQV84ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg6OAorI2RlZmluZSBHUElPX0RBVEFfNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjcKKyNkZWZpbmUgR1BJT19EQVRBXzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIEdQSU9fREFUQV81ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU6NQorI2RlZmluZSBHUElPX0RBVEFfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OjQKKyNkZWZpbmUgR1BJT19EQVRBXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIEdQSU9fREFUQV8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBHUElPX0RBVEFfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgR1BJT19EQVRBXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDQKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8zMSAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8zMV9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzMxX09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMzAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOjMwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMzBfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8zMF9PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI5ICAgICAgICAgICAgICAgICAgICAgICAgICAyOToyOQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI5X0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjlfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yOCAgICAgICAgICAgICAgICAgICAgICAgICAgMjg6MjgKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yOF9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI4X09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjcgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjdfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yN19PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI2ICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI2X0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjZfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yNSAgICAgICAgICAgICAgICAgICAgICAgICAgMjU6MjUKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yNV9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzI1X09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjQgICAgICAgICAgICAgICAgICAgICAgICAgIDI0OjI0CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjRfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yNF9PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzIzICAgICAgICAgICAgICAgICAgICAgICAgICAyMzoyMworI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzIzX0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjNfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yMiAgICAgICAgICAgICAgICAgICAgICAgICAgMjI6MjIKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yMl9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzIyX09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjEgICAgICAgICAgICAgICAgICAgICAgICAgIDIxOjIxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjFfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yMV9PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzIwICAgICAgICAgICAgICAgICAgICAgICAgICAyMDoyMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzIwX0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMjBfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xOSAgICAgICAgICAgICAgICAgICAgICAgICAgMTk6MTkKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xOV9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE5X09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTggICAgICAgICAgICAgICAgICAgICAgICAgIDE4OjE4CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMThfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xOF9PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE3ICAgICAgICAgICAgICAgICAgICAgICAgICAxNzoxNworI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE3X0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTdfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xNiAgICAgICAgICAgICAgICAgICAgICAgICAgMTY6MTYKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xNl9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE2X09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTUgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjE1CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTVfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xNV9PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAxNDoxNAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzE0X0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTRfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xMyAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTMKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xM19JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzEzX09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTIgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOjEyCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTJfSU5QVVQgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xMl9PVVRQVVQgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzExICAgICAgICAgICAgICAgICAgICAgICAgICAxMToxMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzExX0lOUFVUICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMTFfT1VUUFVUICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xMF9JTlBVVCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzEwX09VVFBVVCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fOSAgICAgICAgICAgICAgICAgICAgICAgICAgIDk6OQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzlfSU5QVVQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fOV9PVVRQVVQgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl84ICAgICAgICAgICAgICAgICAgICAgICAgICAgODo4CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fOF9JTlBVVCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl84X09VVFBVVCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzcgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjcKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl83X0lOUFVUICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzdfT1VUUFVUICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDY6NgorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzZfSU5QVVQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fNl9PVVRQVVQgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl81ICAgICAgICAgICAgICAgICAgICAgICAgICAgNTo1CisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fNV9JTlBVVCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl81X09VVFBVVCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzQgICAgICAgICAgICAgICAgICAgICAgICAgICA0OjQKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl80X0lOUFVUICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzRfT1VUUFVUICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzNfSU5QVVQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fM19PVVRQVVQgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMl9JTlBVVCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8yX09VVFBVVCAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzEKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl8xX0lOUFVUICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzFfT1VUUFVUICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6MAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OXzBfSU5QVVQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fMF9PVVRQVVQgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwOAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzMxICAgICAgICAgICAgICAgICAyMjoyMgorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzMxX0VER0UgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMzFfTEVWRUwgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8zMCAgICAgICAgICAgICAgICAgMjE6MjEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8zMF9FREdFICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzMwX0xFVkVMICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMjkgICAgICAgICAgICAgICAgIDIwOjIwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMjlfRURHRSAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8yOV9MRVZFTCAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzI4ICAgICAgICAgICAgICAgICAxOToxOQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzI4X0VER0UgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMjhfTEVWRUwgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8yNyAgICAgICAgICAgICAgICAgMTg6MTgKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8yN19FREdFICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzI3X0xFVkVMICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMjYgICAgICAgICAgICAgICAgIDE3OjE3CisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMjZfRURHRSAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfVFJJR0dFUl8yNl9MRVZFTCAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzI1ICAgICAgICAgICAgICAgICAxNjoxNgorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9UUklHR0VSXzI1X0VER0UgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX1RSSUdHRVJfMjVfTEVWRUwgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzMxICAgICAgICAgICAgICAgICAgMTQ6MTQKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzMxX0xPVyAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMzFfSElHSCAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8zMCAgICAgICAgICAgICAgICAgIDEzOjEzCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8zMF9MT1cgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzMwX0hJR0ggICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMjkgICAgICAgICAgICAgICAgICAxMjoxMgorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMjlfTE9XICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8yOV9ISUdIICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzI4ICAgICAgICAgICAgICAgICAgMTE6MTEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzI4X0xPVyAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMjhfSElHSCAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8yNyAgICAgICAgICAgICAgICAgIDEwOjEwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8yN19MT1cgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzI3X0hJR0ggICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMjYgICAgICAgICAgICAgICAgICA5OjkKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfQUNUSVZFXzI2X0xPVyAgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMjZfSElHSCAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8yNSAgICAgICAgICAgICAgICAgIDg6OAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9BQ1RJVkVfMjVfTE9XICAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0FDVElWRV8yNV9ISUdIICAgICAgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzMxICAgICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8zMV9HUElPICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzMxX0lOVEVSUlVQVCAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMzAgICAgICAgICAgICAgICAgICA1OjUKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzMwX0dQSU8gICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMzBfSU5URVJSVVBUICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8yOSAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMjlfR1BJTyAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8yOV9JTlRFUlJVUFQgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzI4ICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8yOF9HUElPICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzI4X0lOVEVSUlVQVCAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMjcgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzI3X0dQSU8gICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMjdfSU5URVJSVVBUICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8yNiAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TRVRVUF9FTkFCTEVfMjZfR1BJTyAgICAgICAgICAgICAwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8yNl9JTlRFUlJVUFQgICAgICAgIDEKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzI1ICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NFVFVQX0VOQUJMRV8yNV9HUElPICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU0VUVVBfRU5BQkxFXzI1X0lOVEVSUlVQVCAgICAgICAgMQorCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDBDCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18zMSAgICAgICAgICAgICAgICAgICAgICAgIDIyOjIyCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18zMV9JTkFDVElWRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzMxX0FDVElWRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMzFfUkVTRVQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18zMCAgICAgICAgICAgICAgICAgICAgICAgIDIxOjIxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18zMF9JTkFDVElWRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzMwX0FDVElWRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMzBfUkVTRVQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yOSAgICAgICAgICAgICAgICAgICAgICAgIDIwOjIwCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yOV9JTkFDVElWRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI5X0FDVElWRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMjlfUkVTRVQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yOCAgICAgICAgICAgICAgICAgICAgICAgIDE5OjE5CisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yOF9JTkFDVElWRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI4X0FDVElWRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMjhfUkVTRVQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yNyAgICAgICAgICAgICAgICAgICAgICAgIDE4OjE4CisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yN19JTkFDVElWRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI3X0FDVElWRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMjdfUkVTRVQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yNiAgICAgICAgICAgICAgICAgICAgICAgIDE3OjE3CisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yNl9JTkFDVElWRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI2X0FDVElWRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMjZfUkVTRVQgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yNSAgICAgICAgICAgICAgICAgICAgICAgIDE2OjE2CisjZGVmaW5lIEdQSU9fSU5URVJSVVBUX1NUQVRVU18yNV9JTkFDVElWRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19JTlRFUlJVUFRfU1RBVFVTXzI1X0FDVElWRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0lOVEVSUlVQVF9TVEFUVVNfMjVfUkVTRVQgICAgICAgICAgICAgICAgICAxCisKKworI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1JFU0VSVkVEXzFfTUFTSyAgICAgICAgICAgIDMxOjMwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF8xX01BU0tfRElTQUJMRSAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF8xX01BU0tfRU5BQkxFICAgICAzCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAyOToyOAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfU0VMRUNUX1BBTkVMICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfU0VMRUNUX1ZHQSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfU0VMRUNUX0NSVCAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRlBFTiAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZQRU5fTE9XICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZQRU5fSElHSCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1ZCSUFTRU4gICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9WQklBU0VOX0xPVyAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9WQklBU0VOX0hJR0ggICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAyNToyNQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfREFUQV9ESVNBQkxFICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfREFUQV9FTkFCTEUgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRlBWRERFTiAgICAgICAgICAgICAgICAgICAgMjQ6MjQKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZQVkRERU5fTE9XICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZQVkRERU5fSElHSCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1JFU0VSVkVEXzJfTUFTSyAgICAgICAgICAgIDIzOjIwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF8yX01BU0tfRElTQUJMRSAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF8yX01BU0tfRU5BQkxFICAgICAxNQorCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9URlRfRElTUCAxOToxOAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVEZUX0RJU1BfMjQgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVEZUX0RJU1BfMzYgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVEZUX0RJU1BfMTggMgorCisKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0RVQUxfRElTUExBWSAgICAgICAgICAgICAgIDE5OjE5CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9EVUFMX0RJU1BMQVlfRElTQUJMRSAgICAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9EVUFMX0RJU1BMQVlfRU5BQkxFICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9ET1VCTEVfUElYRUwgICAgICAgICAgICAgICAxODoxOAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRE9VQkxFX1BJWEVMX0RJU0FCTEUgICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRE9VQkxFX1BJWEVMX0VOQUJMRSAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfRklGTyAgICAgICAgICAgICAgICAgICAgICAgMTc6MTYKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZJRk9fMSAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZJRk9fMyAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZJRk9fNyAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZJRk9fMTEgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1JFU0VSVkVEXzNfTUFTSyAgICAgICAgICAgIDE1OjE1CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF8zX01BU0tfRElTQUJMRSAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF8zX01BU0tfRU5BQkxFICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9DTE9DS19QSEFTRSAgICAgICAgICAgICAgICAxNDoxNAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfQ0xPQ0tfUEhBU0VfQUNUSVZFX0hJR0ggICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfQ0xPQ0tfUEhBU0VfQUNUSVZFX0xPVyAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVlNZTkNfUEhBU0UgICAgICAgICAgICAgICAgMTM6MTMKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1ZTWU5DX1BIQVNFX0FDVElWRV9ISUdIICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1ZTWU5DX1BIQVNFX0FDVElWRV9MT1cgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0hTWU5DX1BIQVNFICAgICAgICAgICAgICAgIDEyOjEyCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9IU1lOQ19QSEFTRV9BQ1RJVkVfSElHSCAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9IU1lOQ19QSEFTRV9BQ1RJVkVfTE9XICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9WU1lOQyAgICAgICAgICAgICAgICAgICAgICAxMToxMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVlNZTkNfQUNUSVZFX0hJR0ggICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVlNZTkNfQUNUSVZFX0xPVyAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfQ0FQVFVSRV9USU1JTkcgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0NBUFRVUkVfVElNSU5HX0RJU0FCTEUgICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0NBUFRVUkVfVElNSU5HX0VOQUJMRSAgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0NPTE9SX0tFWSAgICAgICAgICAgICAgICAgIDk6OQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfQ09MT1JfS0VZX0RJU0FCTEUgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfQ09MT1JfS0VZX0VOQUJMRSAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVElNSU5HICAgICAgICAgICAgICAgICAgICAgODo4CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9USU1JTkdfRElTQUJMRSAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9USU1JTkdfRU5BQkxFICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9WRVJUSUNBTF9QQU5fRElSICAgICAgICAgICA3OjcKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1ZFUlRJQ0FMX1BBTl9ESVJfRE9XTiAgICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1ZFUlRJQ0FMX1BBTl9ESVJfVVAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX1ZFUlRJQ0FMX1BBTiAgICAgICAgICAgICAgIDY6NgorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVkVSVElDQUxfUEFOX0RJU0FCTEUgICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfVkVSVElDQUxfUEFOX0VOQUJMRSAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfSE9SSVpPTlRBTF9QQU5fRElSICAgICAgICAgNTo1CisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9IT1JJWk9OVEFMX1BBTl9ESVJfUklHSFQgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9IT1JJWk9OVEFMX1BBTl9ESVJfTEVGVCAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9IT1JJWk9OVEFMX1BBTiAgICAgICAgICAgICA0OjQKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0hPUklaT05UQUxfUEFOX0RJU0FCTEUgICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0hPUklaT05UQUxfUEFOX0VOQUJMRSAgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0dBTU1BICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfR0FNTUFfRElTQUJMRSAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfR0FNTUFfRU5BQkxFICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9ESVNQTEFZX0NUUkxfUExBTkUgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9QTEFORV9ESVNBQkxFICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9QTEFORV9FTkFCTEUgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0RJU1BMQVlfQ1RSTF9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAxOjAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZPUk1BVF84ICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZPUk1BVF8xNiAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfRElTUExBWV9DVFJMX0ZPUk1BVF8zMiAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBQQU5FTF9QQU5fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDQKKyNkZWZpbmUgUEFORUxfUEFOX0NUUkxfVkVSVElDQUxfUEFOICAgICAgICAgICAgICAgICAgIDMxOjI0CisjZGVmaW5lIFBBTkVMX1BBTl9DVFJMX1ZFUlRJQ0FMX1ZTWU5DICAgICAgICAgICAgICAgICAyMToxNgorI2RlZmluZSBQQU5FTF9QQU5fQ1RSTF9IT1JJWk9OVEFMX1BBTiAgICAgICAgICAgICAgICAgMTU6OAorI2RlZmluZSBQQU5FTF9QQU5fQ1RSTF9IT1JJWk9OVEFMX1ZTWU5DICAgICAgICAgICAgICAgNTowCisKKyNkZWZpbmUgUEFORUxfQ09MT1JfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDA4CisjZGVmaW5lIFBBTkVMX0NPTE9SX0tFWV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBQQU5FTF9DT0xPUl9LRVlfVkFMVUUgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIFBBTkVMX0ZCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwQworI2RlZmluZSBQQU5FTF9GQl9BRERSRVNTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgUEFORUxfRkJfQUREUkVTU19TVEFUVVNfQ1VSUkVOVCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfRkJfQUREUkVTU19TVEFUVVNfUEVORElORyAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfRkJfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIFBBTkVMX0ZCX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0ZCX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0ZCX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgUEFORUxfRkJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDEwCisjZGVmaW5lIFBBTkVMX0ZCX1dJRFRIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAyOToxNgorI2RlZmluZSBQQU5FTF9GQl9XSURUSF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MAorCisjZGVmaW5lIFBBTkVMX1dJTkRPV19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAxNAorI2RlZmluZSBQQU5FTF9XSU5ET1dfV0lEVEhfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMjc6MTYKKyNkZWZpbmUgUEFORUxfV0lORE9XX1dJRFRIX1ggICAgICAgICAgICAgICAgICAgICAgICAgIDExOjAKKworI2RlZmluZSBQQU5FTF9XSU5ET1dfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMTgKKyNkZWZpbmUgUEFORUxfV0lORE9XX0hFSUdIVF9IRUlHSFQgICAgICAgICAgICAgICAgICAgIDI3OjE2CisjZGVmaW5lIFBBTkVMX1dJTkRPV19IRUlHSFRfWSAgICAgICAgICAgICAgICAgICAgICAgICAxMTowCisKKyNkZWZpbmUgUEFORUxfUExBTkVfVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDFDCisjZGVmaW5lIFBBTkVMX1BMQU5FX1RMX1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoxNgorI2RlZmluZSBQQU5FTF9QTEFORV9UTF9MRUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MAorCisjZGVmaW5lIFBBTkVMX1BMQU5FX0JSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAyMAorI2RlZmluZSBQQU5FTF9QTEFORV9CUl9CT1RUT00gICAgICAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgUEFORUxfUExBTkVfQlJfUklHSFQgICAgICAgICAgICAgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBQQU5FTF9IT1JJWk9OVEFMX1RPVEFMICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMjQKKyNkZWZpbmUgUEFORUxfSE9SSVpPTlRBTF9UT1RBTF9UT1RBTCAgICAgICAgICAgICAgICAgIDI3OjE2CisjZGVmaW5lIFBBTkVMX0hPUklaT05UQUxfVE9UQUxfRElTUExBWV9FTkQgICAgICAgICAgICAxMTowCisKKyNkZWZpbmUgUEFORUxfSE9SSVpPTlRBTF9TWU5DICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDI4CisjZGVmaW5lIFBBTkVMX0hPUklaT05UQUxfU1lOQ19XSURUSCAgICAgICAgICAgICAgICAgICAyMzoxNgorI2RlZmluZSBQQU5FTF9IT1JJWk9OVEFMX1NZTkNfU1RBUlQgICAgICAgICAgICAgICAgICAgMTE6MAorCisjZGVmaW5lIFBBTkVMX1ZFUlRJQ0FMX1RPVEFMICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAyQworI2RlZmluZSBQQU5FTF9WRVJUSUNBTF9UT1RBTF9UT1RBTCAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgUEFORUxfVkVSVElDQUxfVE9UQUxfRElTUExBWV9FTkQgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBQQU5FTF9WRVJUSUNBTF9TWU5DICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMzAKKyNkZWZpbmUgUEFORUxfVkVSVElDQUxfU1lOQ19IRUlHSFQgICAgICAgICAgICAgICAgICAgIDIxOjE2CisjZGVmaW5lIFBBTkVMX1ZFUlRJQ0FMX1NZTkNfU1RBUlQgICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgUEFORUxfQ1VSUkVOVF9MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDM0CisjZGVmaW5lIFBBTkVMX0NVUlJFTlRfTElORV9MSU5FICAgICAgICAgICAgICAgICAgICAgICAxMDowCisKKy8qIFZpZGVvIENvbnRyb2wgKi8KKworI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA0MAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfTElORV9CVUZGRVIgICAgICAgICAgICAgICAgICAxODoxOAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfTElORV9CVUZGRVJfRElTQUJMRSAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9MSU5FX0JVRkZFUl9FTkFCTEUgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgICAgMTc6MTYKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0ZJRk9fMSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfRklGT18zICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9GSUZPXzcgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0ZJRk9fMTEgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfQlVGRkVSICAgICAgICAgICAgICAgICAgICAgICAxNToxNQorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfQlVGRkVSXzAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9CVUZGRVJfMSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0NBUFRVUkUgICAgICAgICAgICAgICAgICAgICAgMTQ6MTQKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0NBUFRVUkVfRElTQUJMRSAgICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfQ0FQVFVSRV9FTkFCTEUgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9ET1VCTEVfQlVGRkVSICAgICAgICAgICAgICAgIDEzOjEzCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9ET1VCTEVfQlVGRkVSX0RJU0FCTEUgICAgICAgIDAKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0RPVUJMRV9CVUZGRVJfRU5BQkxFICAgICAgICAgMQorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfQllURV9TV0FQICAgICAgICAgICAgICAgICAgICAxMjoxMgorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfQllURV9TV0FQX0RJU0FCTEUgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9CWVRFX1NXQVBfRU5BQkxFICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX1ZFUlRJQ0FMX1NDQUxFICAgICAgICAgICAgICAgMTE6MTEKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX1ZFUlRJQ0FMX1NDQUxFX05PUk1BTCAgICAgICAgMAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfVkVSVElDQUxfU0NBTEVfSEFMRiAgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9IT1JJWk9OVEFMX1NDQUxFICAgICAgICAgICAgIDEwOjEwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9IT1JJWk9OVEFMX1NDQUxFX05PUk1BTCAgICAgIDAKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0hPUklaT05UQUxfU0NBTEVfSEFMRiAgICAgICAgMQorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfVkVSVElDQUxfTU9ERSAgICAgICAgICAgICAgICA5OjkKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX1ZFUlRJQ0FMX01PREVfUkVQTElDQVRFICAgICAgMAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfVkVSVElDQUxfTU9ERV9JTlRFUlBPTEFURSAgICAxCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9IT1JJWk9OVEFMX01PREUgICAgICAgICAgICAgIDg6OAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfSE9SSVpPTlRBTF9NT0RFX1JFUExJQ0FURSAgICAwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9IT1JJWk9OVEFMX01PREVfSU5URVJQT0xBVEUgIDEKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX1BJWEVMICAgICAgICAgICAgICAgICAgICAgICAgNzo0CisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9HQU1NQSAgICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfR0FNTUFfRElTQUJMRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9HQU1NQV9FTkFCTEUgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX1BMQU5FICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9QTEFORV9ESVNBQkxFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX1BMQU5FX0VOQUJMRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAxOjAKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0ZPUk1BVF84ICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19ESVNQTEFZX0NUUkxfRk9STUFUXzE2ICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0RJU1BMQVlfQ1RSTF9GT1JNQVRfMzIgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVklERU9fRElTUExBWV9DVFJMX0ZPUk1BVF9ZVVYgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIFZJREVPX0ZCXzBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA0NAorI2RlZmluZSBWSURFT19GQl8wX0FERFJFU1NfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgVklERU9fRkJfMF9BRERSRVNTX1NUQVRVU19DVVJSRU5UICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fRkJfMF9BRERSRVNTX1NUQVRVU19QRU5ESU5HICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRkJfMF9BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIFZJREVPX0ZCXzBfQUREUkVTU19FWFRfTE9DQUwgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0ZCXzBfQUREUkVTU19FWFRfRVhURVJOQUwgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0ZCXzBfQUREUkVTU19BRERSRVNTICAgICAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgVklERU9fRkJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDQ4CisjZGVmaW5lIFZJREVPX0ZCX1dJRFRIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAyOToxNgorI2RlZmluZSBWSURFT19GQl9XSURUSF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MAorCisjZGVmaW5lIFZJREVPX0ZCXzBfTEFTVF9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA0QworI2RlZmluZSBWSURFT19GQl8wX0xBU1RfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgVklERU9fRkJfMF9MQVNUX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fRkJfMF9MQVNUX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRkJfMF9MQVNUX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBWSURFT19QTEFORV9UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwNTAKKyNkZWZpbmUgVklERU9fUExBTkVfVExfVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjE2CisjZGVmaW5lIFZJREVPX1BMQU5FX1RMX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgVklERU9fUExBTkVfQlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDU0CisjZGVmaW5lIFZJREVPX1BMQU5FX0JSX0JPVFRPTSAgICAgICAgICAgICAgICAgICAgICAgICAyNjoxNgorI2RlZmluZSBWSURFT19QTEFORV9CUl9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MAorCisjZGVmaW5lIFZJREVPX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA1OAorI2RlZmluZSBWSURFT19TQ0FMRV9WRVJUSUNBTF9NT0RFICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgVklERU9fU0NBTEVfVkVSVElDQUxfTU9ERV9FWFBBTkQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fU0NBTEVfVkVSVElDQUxfTU9ERV9TSFJJTksgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fU0NBTEVfVkVSVElDQUxfU0NBTEUgICAgICAgICAgICAgICAgICAgIDI3OjE2CisjZGVmaW5lIFZJREVPX1NDQUxFX0hPUklaT05UQUxfTU9ERSAgICAgICAgICAgICAgICAgICAxNToxNQorI2RlZmluZSBWSURFT19TQ0FMRV9IT1JJWk9OVEFMX01PREVfRVhQQU5EICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19TQ0FMRV9IT1JJWk9OVEFMX01PREVfU0hSSU5LICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19TQ0FMRV9IT1JJWk9OVEFMX1NDQUxFICAgICAgICAgICAgICAgICAgMTE6MAorCisjZGVmaW5lIFZJREVPX0lOSVRJQUxfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA1QworI2RlZmluZSBWSURFT19JTklUSUFMX1NDQUxFX0ZCXzEgICAgICAgICAgICAgICAgICAgICAgMjc6MTYKKyNkZWZpbmUgVklERU9fSU5JVElBTF9TQ0FMRV9GQl8wICAgICAgICAgICAgICAgICAgICAgIDExOjAKKworI2RlZmluZSBWSURFT19ZVVZfQ09OU1RBTlRTICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwNjAKKyNkZWZpbmUgVklERU9fWVVWX0NPTlNUQU5UU19ZICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjI0CisjZGVmaW5lIFZJREVPX1lVVl9DT05TVEFOVFNfUiAgICAgICAgICAgICAgICAgICAgICAgICAyMzoxNgorI2RlZmluZSBWSURFT19ZVVZfQ09OU1RBTlRTX0cgICAgICAgICAgICAgICAgICAgICAgICAgMTU6OAorI2RlZmluZSBWSURFT19ZVVZfQ09OU1RBTlRTX0IgICAgICAgICAgICAgICAgICAgICAgICAgNzowCisKKyNkZWZpbmUgVklERU9fRkJfMV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDY0CisjZGVmaW5lIFZJREVPX0ZCXzFfQUREUkVTU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBWSURFT19GQl8xX0FERFJFU1NfU1RBVFVTX0NVUlJFTlQgICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19GQl8xX0FERFJFU1NfU1RBVFVTX1BFTkRJTkcgICAgICAgICAgICAgMQorI2RlZmluZSBWSURFT19GQl8xX0FERFJFU1NfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgVklERU9fRkJfMV9BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fRkJfMV9BRERSRVNTX0VYVF9FWFRFUk5BTCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fRkJfMV9BRERSRVNTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBWSURFT19GQl8xX0xBU1RfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwNjgKKyNkZWZpbmUgVklERU9fRkJfMV9MQVNUX0FERFJFU1NfRVhUICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIFZJREVPX0ZCXzFfTEFTVF9BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0ZCXzFfTEFTVF9BRERSRVNTX0VYVF9FWFRFUk5BTCAgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0ZCXzFfTEFTVF9BRERSRVNTX0FERFJFU1MgICAgICAgICAgICAgICAyNTowCisKKy8qIFZpZGVvIEFscGhhIENvbnRyb2wgKi8KKworI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA4MAorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfU0VMRUNUICAgICAgICAgICAgICAgICAyODoyOAorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfU0VMRUNUX1BFUl9QSVhFTCAgICAgICAwCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9TRUxFQ1RfQUxQSEEgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0FMUEhBICAgICAgICAgICAgICAgICAgMjc6MjQKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0ZJRk8gICAgICAgICAgICAgICAgICAgMTc6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0ZJRk9fMSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfRklGT18zICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9GSUZPXzcgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0ZJRk9fMTEgICAgICAgICAgICAgICAgMworI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfVkVSVF9TQ0FMRSAgICAgICAgICAgICAxMToxMQorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfVkVSVF9TQ0FMRV9OT1JNQUwgICAgICAwCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9WRVJUX1NDQUxFX0hBTEYgICAgICAgIDEKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0hPUlpfU0NBTEUgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0hPUlpfU0NBTEVfTk9STUFMICAgICAgMAorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfSE9SWl9TQ0FMRV9IQUxGICAgICAgICAxCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9WRVJUX01PREUgICAgICAgICAgICAgIDk6OQorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfVkVSVF9NT0RFX1JFUExJQ0FURSAgICAwCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9WRVJUX01PREVfSU5URVJQT0xBVEUgIDEKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0hPUlpfTU9ERSAgICAgICAgICAgICAgODo4CisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9IT1JaX01PREVfUkVQTElDQVRFICAgIDAKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0hPUlpfTU9ERV9JTlRFUlBPTEFURSAgMQorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfUElYRUwgICAgICAgICAgICAgICAgICA3OjQKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0NIUk9NQV9LRVkgICAgICAgICAgICAgMzozCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9DSFJPTUFfS0VZX0RJU0FCTEUgICAgIDAKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0NIUk9NQV9LRVlfRU5BQkxFICAgICAgMQorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfUExBTkUgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX1BMQU5FX0RJU0FCTEUgICAgICAgICAgMAorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfUExBTkVfRU5BQkxFICAgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9GT1JNQVQgICAgICAgICAgICAgICAgIDE6MAorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfRk9STUFUXzggICAgICAgICAgICAgICAwCisjZGVmaW5lIFZJREVPX0FMUEhBX0RJU1BMQVlfQ1RSTF9GT1JNQVRfMTYgICAgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fQUxQSEFfRElTUExBWV9DVFJMX0ZPUk1BVF9BTFBIQV80XzQgICAgICAgMgorI2RlZmluZSBWSURFT19BTFBIQV9ESVNQTEFZX0NUUkxfRk9STUFUX0FMUEhBXzRfNF80XzQgICAzCisKKyNkZWZpbmUgVklERU9fQUxQSEFfRkJfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDg0CisjZGVmaW5lIFZJREVPX0FMUEhBX0ZCX0FERFJFU1NfU1RBVFVTICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBWSURFT19BTFBIQV9GQl9BRERSRVNTX1NUQVRVU19DVVJSRU5UICAgICAgICAgMAorI2RlZmluZSBWSURFT19BTFBIQV9GQl9BRERSRVNTX1NUQVRVU19QRU5ESU5HICAgICAgICAgMQorI2RlZmluZSBWSURFT19BTFBIQV9GQl9BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgVklERU9fQUxQSEFfRkJfQUREUkVTU19FWFRfTE9DQUwgICAgICAgICAgICAgIDAKKyNkZWZpbmUgVklERU9fQUxQSEFfRkJfQUREUkVTU19FWFRfRVhURVJOQUwgICAgICAgICAgIDEKKyNkZWZpbmUgVklERU9fQUxQSEFfRkJfQUREUkVTU19BRERSRVNTICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBWSURFT19BTFBIQV9GQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwODgKKyNkZWZpbmUgVklERU9fQUxQSEFfRkJfV0lEVEhfV0lEVEggICAgICAgICAgICAgICAgICAgIDI5OjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0ZCX1dJRFRIX09GRlNFVCAgICAgICAgICAgICAgICAgICAxMzowCisKKyNkZWZpbmUgVklERU9fQUxQSEFfRkJfTEFTVF9BRERSRVNTICAgICAgICAgICAgICAgICAgIDB4MDgwMDhDCisjZGVmaW5lIFZJREVPX0FMUEhBX0ZCX0xBU1RfQUREUkVTU19FWFQgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBWSURFT19BTFBIQV9GQl9MQVNUX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgMAorI2RlZmluZSBWSURFT19BTFBIQV9GQl9MQVNUX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgMQorI2RlZmluZSBWSURFT19BTFBIQV9GQl9MQVNUX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIFZJREVPX0FMUEhBX1BMQU5FX1RMICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDA5MAorI2RlZmluZSBWSURFT19BTFBIQV9QTEFORV9UTF9UT1AgICAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfUExBTkVfVExfTEVGVCAgICAgICAgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBWSURFT19BTFBIQV9QTEFORV9CUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwOTQKKyNkZWZpbmUgVklERU9fQUxQSEFfUExBTkVfQlJfQk9UVE9NICAgICAgICAgICAgICAgICAgIDI2OjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX1BMQU5FX0JSX1JJR0hUICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgVklERU9fQUxQSEFfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDk4CisjZGVmaW5lIFZJREVPX0FMUEhBX1NDQUxFX1ZFUlRJQ0FMX01PREUgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBWSURFT19BTFBIQV9TQ0FMRV9WRVJUSUNBTF9NT0RFX0VYUEFORCAgICAgICAgMAorI2RlZmluZSBWSURFT19BTFBIQV9TQ0FMRV9WRVJUSUNBTF9NT0RFX1NIUklOSyAgICAgICAgMQorI2RlZmluZSBWSURFT19BTFBIQV9TQ0FMRV9WRVJUSUNBTF9TQ0FMRSAgICAgICAgICAgICAgMjc6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfU0NBTEVfSE9SSVpPTlRBTF9NT0RFICAgICAgICAgICAgIDE1OjE1CisjZGVmaW5lIFZJREVPX0FMUEhBX1NDQUxFX0hPUklaT05UQUxfTU9ERV9FWFBBTkQgICAgICAwCisjZGVmaW5lIFZJREVPX0FMUEhBX1NDQUxFX0hPUklaT05UQUxfTU9ERV9TSFJJTksgICAgICAxCisjZGVmaW5lIFZJREVPX0FMUEhBX1NDQUxFX0hPUklaT05UQUxfU0NBTEUgICAgICAgICAgICAxMTowCisKKyNkZWZpbmUgVklERU9fQUxQSEFfSU5JVElBTF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDlDCisjZGVmaW5lIFZJREVPX0FMUEhBX0lOSVRJQUxfU0NBTEVfVkVSVElDQUwgICAgICAgICAgICAyNzoxNgorI2RlZmluZSBWSURFT19BTFBIQV9JTklUSUFMX1NDQUxFX0hPUklaT05UQUwgICAgICAgICAgMTE6MAorCisjZGVmaW5lIFZJREVPX0FMUEhBX0NIUk9NQV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDBBMAorI2RlZmluZSBWSURFT19BTFBIQV9DSFJPTUFfS0VZX01BU0sgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfQ0hST01BX0tFWV9WQUxVRSAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMDEgICAgICAgICAgICAgICAgICAgMHgwODAwQTQKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzAxXzEgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8wMV8xX1JFRCAgICAgICAgICAgICAzMToyNworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMDFfMV9HUkVFTiAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzAxXzFfQkxVRSAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8wMV8wICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8wMV8wX1JFRCAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMDFfMF9HUkVFTiAgICAgICAgICAgMTA6NQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMDFfMF9CTFVFICAgICAgICAgICAgNDowCisKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzIzICAgICAgICAgICAgICAgICAgIDB4MDgwMEE4CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8yM18zICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMjNfM19SRUQgICAgICAgICAgICAgMzE6MjcKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzIzXzNfR1JFRU4gICAgICAgICAgIDI2OjIxCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF8yM18zX0JMVUUgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMjNfMiAgICAgICAgICAgICAgICAgMTU6MAorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfMjNfMl9SRUQgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzIzXzJfR1JFRU4gICAgICAgICAgIDEwOjUKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzIzXzJfQkxVRSAgICAgICAgICAgIDQ6MAorCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF80NSAgICAgICAgICAgICAgICAgICAweDA4MDBBQworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfNDVfNSAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzVfUkVEICAgICAgICAgICAgIDMxOjI3CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF80NV81X0dSRUVOICAgICAgICAgICAyNjoyMQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfNDVfNV9CTFVFICAgICAgICAgICAgMjA6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzQgICAgICAgICAgICAgICAgIDE1OjAKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzRfUkVEICAgICAgICAgICAgIDE1OjExCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF80NV80X0dSRUVOICAgICAgICAgICAxMDo1CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF80NV80X0JMVUUgICAgICAgICAgICA0OjAKKworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfNjcgICAgICAgICAgICAgICAgICAgMHgwODAwQjAKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzY3XzcgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF82N183X1JFRCAgICAgICAgICAgICAzMToyNworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfNjdfN19HUkVFTiAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzY3XzdfQkxVRSAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF82N182ICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF82N182X1JFRCAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfNjdfNl9HUkVFTiAgICAgICAgICAgMTA6NQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfNjdfNl9CTFVFICAgICAgICAgICAgNDowCisKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzg5ICAgICAgICAgICAgICAgICAgIDB4MDgwMEI0CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF84OV85ICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfODlfOV9SRUQgICAgICAgICAgICAgMzE6MjcKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzg5XzlfR1JFRU4gICAgICAgICAgIDI2OjIxCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF84OV85X0JMVUUgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfODlfOCAgICAgICAgICAgICAgICAgMTU6MAorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfODlfOF9SRUQgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzg5XzhfR1JFRU4gICAgICAgICAgIDEwOjUKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQXzg5XzhfQkxVRSAgICAgICAgICAgIDQ6MAorCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9BQiAgICAgICAgICAgICAgICAgICAweDA4MDBCOAorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfQUJfQiAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0JfUkVEICAgICAgICAgICAgIDMxOjI3CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9BQl9CX0dSRUVOICAgICAgICAgICAyNjoyMQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfQUJfQl9CTFVFICAgICAgICAgICAgMjA6MTYKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0EgICAgICAgICAgICAgICAgIDE1OjAKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0FfUkVEICAgICAgICAgICAgIDE1OjExCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9BQl9BX0dSRUVOICAgICAgICAgICAxMDo1CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9BQl9BX0JMVUUgICAgICAgICAgICA0OjAKKworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfQ0QgICAgICAgICAgICAgICAgICAgMHgwODAwQkMKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0NEX0QgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9DRF9EX1JFRCAgICAgICAgICAgICAzMToyNworI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfQ0RfRF9HUkVFTiAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0NEX0RfQkxVRSAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9DRF9DICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9DRF9DX1JFRCAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfQ0RfQ19HUkVFTiAgICAgICAgICAgMTA6NQorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfQ0RfQ19CTFVFICAgICAgICAgICAgNDowCisKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0VGICAgICAgICAgICAgICAgICAgIDB4MDgwMEMwCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9FRl9GICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfRUZfRl9SRUQgICAgICAgICAgICAgMzE6MjcKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0VGX0ZfR1JFRU4gICAgICAgICAgIDI2OjIxCisjZGVmaW5lIFZJREVPX0FMUEhBX0NPTE9SX0xPT0tVUF9FRl9GX0JMVUUgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfRUZfRSAgICAgICAgICAgICAgICAgMTU6MAorI2RlZmluZSBWSURFT19BTFBIQV9DT0xPUl9MT09LVVBfRUZfRV9SRUQgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0VGX0VfR1JFRU4gICAgICAgICAgIDEwOjUKKyNkZWZpbmUgVklERU9fQUxQSEFfQ09MT1JfTE9PS1VQX0VGX0VfQkxVRSAgICAgICAgICAgIDQ6MAorCisvKiBQYW5lbCBDdXJzb3IgQ29udHJvbCAqLworCisjZGVmaW5lIFBBTkVMX0hXQ19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDBGMAorI2RlZmluZSBQQU5FTF9IV0NfQUREUkVTU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgUEFORUxfSFdDX0FERFJFU1NfRU5BQkxFX0RJU0FCTEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEFORUxfSFdDX0FERFJFU1NfRU5BQkxFX0VOQUJMRSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgUEFORUxfSFdDX0FERFJFU1NfRVhUICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIFBBTkVMX0hXQ19BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0hXQ19BRERSRVNTX0VYVF9FWFRFUk5BTCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0hXQ19BRERSRVNTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgUEFORUxfSFdDX0xPQ0FUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMEY0CisjZGVmaW5lIFBBTkVMX0hXQ19MT0NBVElPTl9UT1AgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBQQU5FTF9IV0NfTE9DQVRJT05fVE9QX0lOU0lERSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQU5FTF9IV0NfTE9DQVRJT05fVE9QX09VVFNJREUgICAgICAgICAgICAgICAgMQorI2RlZmluZSBQQU5FTF9IV0NfTE9DQVRJT05fWSAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgUEFORUxfSFdDX0xPQ0FUSU9OX0xFRlQgICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIFBBTkVMX0hXQ19MT0NBVElPTl9MRUZUX0lOU0lERSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBBTkVMX0hXQ19MT0NBVElPTl9MRUZUX09VVFNJREUgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBBTkVMX0hXQ19MT0NBVElPTl9YICAgICAgICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgUEFORUxfSFdDX0NPTE9SXzEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMEY4CisjZGVmaW5lIFBBTkVMX0hXQ19DT0xPUl8xMl8yX1JHQjU2NSAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBQQU5FTF9IV0NfQ09MT1JfMTJfMV9SR0I1NjUgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIFBBTkVMX0hXQ19DT0xPUl8zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDBGQworI2RlZmluZSBQQU5FTF9IV0NfQ09MT1JfM19SR0I1NjUgICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisvKiBPbGQgRGVmaW5pdGlvbnMgKysrICovCisjZGVmaW5lIFBBTkVMX0hXQ19DT0xPUl8wMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDBGOAorI2RlZmluZSBQQU5FTF9IV0NfQ09MT1JfMDFfMV9SRUQgICAgICAgICAgICAgICAgICAgICAgMzE6MjcKKyNkZWZpbmUgUEFORUxfSFdDX0NPTE9SXzAxXzFfR1JFRU4gICAgICAgICAgICAgICAgICAgIDI2OjIxCisjZGVmaW5lIFBBTkVMX0hXQ19DT0xPUl8wMV8xX0JMVUUgICAgICAgICAgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBQQU5FTF9IV0NfQ09MT1JfMDFfMF9SRUQgICAgICAgICAgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgUEFORUxfSFdDX0NPTE9SXzAxXzBfR1JFRU4gICAgICAgICAgICAgICAgICAgIDEwOjUKKyNkZWZpbmUgUEFORUxfSFdDX0NPTE9SXzAxXzBfQkxVRSAgICAgICAgICAgICAgICAgICAgIDQ6MAorCisjZGVmaW5lIFBBTkVMX0hXQ19DT0xPUl8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDBGQworI2RlZmluZSBQQU5FTF9IV0NfQ09MT1JfMl9SRUQgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgUEFORUxfSFdDX0NPTE9SXzJfR1JFRU4gICAgICAgICAgICAgICAgICAgICAgIDEwOjUKKyNkZWZpbmUgUEFORUxfSFdDX0NPTE9SXzJfQkxVRSAgICAgICAgICAgICAgICAgICAgICAgIDQ6MAorLyogT2xkIERlZmluaXRpb25zIC0tLSAqLworCisvKiBBbHBoYSBDb250cm9sICovCisKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMTAwCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAyODoyOAorI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkxfU0VMRUNUX1BFUl9QSVhFTCAgICAgICAgICAgMAorI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkxfU0VMRUNUX0FMUEhBICAgICAgICAgICAgICAgMQorI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkxfQUxQSEEgICAgICAgICAgICAgICAgICAgICAgMjc6MjQKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX0ZJRk8gICAgICAgICAgICAgICAgICAgICAgIDE3OjE2CisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9GSUZPXzEgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9GSUZPXzMgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9GSUZPXzcgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9GSUZPXzExICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9QSVhFTCAgICAgICAgICAgICAgICAgICAgICA3OjQKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX0NIUk9NQV9LRVkgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkxfQ0hST01BX0tFWV9ESVNBQkxFICAgICAgICAgMAorI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkxfQ0hST01BX0tFWV9FTkFCTEUgICAgICAgICAgMQorI2RlZmluZSBBTFBIQV9ESVNQTEFZX0NUUkxfUExBTkUgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9QTEFORV9ESVNBQkxFICAgICAgICAgICAgICAwCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9QTEFORV9FTkFCTEUgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFMUEhBX0RJU1BMQVlfQ1RSTF9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAxOjAKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX0ZPUk1BVF8xNiAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX0ZPUk1BVF9BTFBIQV80XzQgICAgICAgICAgIDIKKyNkZWZpbmUgQUxQSEFfRElTUExBWV9DVFJMX0ZPUk1BVF9BTFBIQV80XzRfNF80ICAgICAgIDMKKworI2RlZmluZSBBTFBIQV9GQl9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxMDQKKyNkZWZpbmUgQUxQSEFfRkJfQUREUkVTU19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIEFMUEhBX0ZCX0FERFJFU1NfU1RBVFVTX0NVUlJFTlQgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFMUEhBX0ZCX0FERFJFU1NfU1RBVFVTX1BFTkRJTkcgICAgICAgICAgICAgICAxCisjZGVmaW5lIEFMUEhBX0ZCX0FERFJFU1NfRVhUICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBBTFBIQV9GQl9BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBBTFBIQV9GQl9BRERSRVNTX0VYVF9FWFRFUk5BTCAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBBTFBIQV9GQl9BRERSRVNTX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIEFMUEhBX0ZCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEwOAorI2RlZmluZSBBTFBIQV9GQl9XSURUSF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMjk6MTYKKyNkZWZpbmUgQUxQSEFfRkJfV0lEVEhfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgICAgIDEzOjAKKworI2RlZmluZSBBTFBIQV9QTEFORV9UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxMEMKKyNkZWZpbmUgQUxQSEFfUExBTkVfVExfVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjE2CisjZGVmaW5lIEFMUEhBX1BMQU5FX1RMX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgQUxQSEFfUExBTkVfQlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMTEwCisjZGVmaW5lIEFMUEhBX1BMQU5FX0JSX0JPVFRPTSAgICAgICAgICAgICAgICAgICAgICAgICAyNjoxNgorI2RlZmluZSBBTFBIQV9QTEFORV9CUl9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MAorCisjZGVmaW5lIEFMUEhBX0NIUk9NQV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDExNAorI2RlZmluZSBBTFBIQV9DSFJPTUFfS0VZX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgQUxQSEFfQ0hST01BX0tFWV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMDEgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxMTgKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzAxXzEgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8wMV8xX1JFRCAgICAgICAgICAgICAgICAgICAzMToyNworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMDFfMV9HUkVFTiAgICAgICAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzAxXzFfQkxVRSAgICAgICAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8wMV8wICAgICAgICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8wMV8wX1JFRCAgICAgICAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMDFfMF9HUkVFTiAgICAgICAgICAgICAgICAgMTA6NQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMDFfMF9CTFVFICAgICAgICAgICAgICAgICAgNDowCisKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzIzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMTFDCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8yM18zICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMjNfM19SRUQgICAgICAgICAgICAgICAgICAgMzE6MjcKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzIzXzNfR1JFRU4gICAgICAgICAgICAgICAgIDI2OjIxCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF8yM18zX0JMVUUgICAgICAgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMjNfMiAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfMjNfMl9SRUQgICAgICAgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzIzXzJfR1JFRU4gICAgICAgICAgICAgICAgIDEwOjUKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzIzXzJfQkxVRSAgICAgICAgICAgICAgICAgIDQ6MAorCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF80NSAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEyMAorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfNDVfNSAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzVfUkVEICAgICAgICAgICAgICAgICAgIDMxOjI3CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF80NV81X0dSRUVOICAgICAgICAgICAgICAgICAyNjoyMQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfNDVfNV9CTFVFICAgICAgICAgICAgICAgICAgMjA6MTYKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzQgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzQ1XzRfUkVEICAgICAgICAgICAgICAgICAgIDE1OjExCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF80NV80X0dSRUVOICAgICAgICAgICAgICAgICAxMDo1CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF80NV80X0JMVUUgICAgICAgICAgICAgICAgICA0OjAKKworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfNjcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxMjQKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzY3XzcgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF82N183X1JFRCAgICAgICAgICAgICAgICAgICAzMToyNworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfNjdfN19HUkVFTiAgICAgICAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzY3XzdfQkxVRSAgICAgICAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF82N182ICAgICAgICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF82N182X1JFRCAgICAgICAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfNjdfNl9HUkVFTiAgICAgICAgICAgICAgICAgMTA6NQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfNjdfNl9CTFVFICAgICAgICAgICAgICAgICAgNDowCisKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzg5ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMTI4CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF84OV85ICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfODlfOV9SRUQgICAgICAgICAgICAgICAgICAgMzE6MjcKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzg5XzlfR1JFRU4gICAgICAgICAgICAgICAgIDI2OjIxCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF84OV85X0JMVUUgICAgICAgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfODlfOCAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfODlfOF9SRUQgICAgICAgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzg5XzhfR1JFRU4gICAgICAgICAgICAgICAgIDEwOjUKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQXzg5XzhfQkxVRSAgICAgICAgICAgICAgICAgIDQ6MAorCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9BQiAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDEyQworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfQUJfQiAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0JfUkVEICAgICAgICAgICAgICAgICAgIDMxOjI3CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9BQl9CX0dSRUVOICAgICAgICAgICAgICAgICAyNjoyMQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfQUJfQl9CTFVFICAgICAgICAgICAgICAgICAgMjA6MTYKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0EgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0FCX0FfUkVEICAgICAgICAgICAgICAgICAgIDE1OjExCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9BQl9BX0dSRUVOICAgICAgICAgICAgICAgICAxMDo1CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9BQl9BX0JMVUUgICAgICAgICAgICAgICAgICA0OjAKKworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfQ0QgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxMzAKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0NEX0QgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9DRF9EX1JFRCAgICAgICAgICAgICAgICAgICAzMToyNworI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfQ0RfRF9HUkVFTiAgICAgICAgICAgICAgICAgMjY6MjEKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0NEX0RfQkxVRSAgICAgICAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9DRF9DICAgICAgICAgICAgICAgICAgICAgICAxNTowCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9DRF9DX1JFRCAgICAgICAgICAgICAgICAgICAxNToxMQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfQ0RfQ19HUkVFTiAgICAgICAgICAgICAgICAgMTA6NQorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfQ0RfQ19CTFVFICAgICAgICAgICAgICAgICAgNDowCisKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0VGICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMTM0CisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9FRl9GICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfRUZfRl9SRUQgICAgICAgICAgICAgICAgICAgMzE6MjcKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0VGX0ZfR1JFRU4gICAgICAgICAgICAgICAgIDI2OjIxCisjZGVmaW5lIEFMUEhBX0NPTE9SX0xPT0tVUF9FRl9GX0JMVUUgICAgICAgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfRUZfRSAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorI2RlZmluZSBBTFBIQV9DT0xPUl9MT09LVVBfRUZfRV9SRUQgICAgICAgICAgICAgICAgICAgMTU6MTEKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0VGX0VfR1JFRU4gICAgICAgICAgICAgICAgIDEwOjUKKyNkZWZpbmUgQUxQSEFfQ09MT1JfTE9PS1VQX0VGX0VfQkxVRSAgICAgICAgICAgICAgICAgIDQ6MAorCisvKiBDUlQgR3JhcGhpY3MgQ29udHJvbCAqLworCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIwMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1JFU0VSVkVEXzFfTUFTSyAgCQkJICAzMToyNworI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1JFU0VSVkVEXzFfTUFTS19ESVNBQkxFICAJCQkgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF8xX01BU0tfRU5BQkxFIAkJCSAgMHgxRgorCisvKiBTTTc1MExFIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9EUE1TICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjMwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRFBNU18wICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRFBNU18xICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRFBNU18yICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRFBNU18zICAgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0xLICAgICAgICAgICAgICAgICAgICAgICAgICAyOToyNworI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NMS19QTEwyNSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NMS19QTEw0MSAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NMS19QTEw2MiAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NMS19QTEw2NSAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NMS19QTEw3NCAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NMS19QTEw4MCAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NMS19QTEwxMDggICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NMS19SRVNFUlZFRCAgICAgICAgICAgICAgICAgNworI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1NISUZUX1ZHQV9EQUMgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9TSElGVF9WR0FfREFDX0RJU0FCTEUgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9TSElGVF9WR0FfREFDX0VOQUJMRSAgICAgICAgIDAKKworCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfMl9NQVNLIAkJCSAgMjU6MjQKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF8yX01BU0tfRU5BQkxFIAkJCSAgMworI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1JFU0VSVkVEXzJfTUFTS19ESVNBQkxFIAkJCSAgMAorCisvKiBTTTc1MExFIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9DUlRTRUxFQ1QgICAgICAgICAgICAgICAgICAgIDI1OjI1CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ1JUU0VMRUNUX1ZHQSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ1JUU0VMRUNUX0NSVCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkdCQklUICAgICAgICAgICAgICAgICAgICAgICAyNDoyNAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1JHQkJJVF8yNEJJVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1JHQkJJVF8xMkJJVCAgICAgICAgICAgICAgICAgMQorCisKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9SRVNFUlZFRF8zX01BU0sgCQkJICAxNToxNQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1JFU0VSVkVEXzNfTUFTS19ESVNBQkxFICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1JFU0VSVkVEXzNfTUFTS19FTkFCTEUgICAgICAgMQorCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfNF9NQVNLIAkJCSAgOTo5CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfNF9NQVNLX0RJU0FCTEUgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfNF9NQVNLX0VOQUJMRSAgICAgICAxCisKKyNpZm5kZWYgVkFMSURBVElPTl9DSElQCisgICAgI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1NISUZUX1ZHQV9EQUMgICAgICAgICAgICAyNjoyNgorICAgICNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9TSElGVF9WR0FfREFDX0RJU0FCTEUgICAgMQorICAgICNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9TSElGVF9WR0FfREFDX0VOQUJMRSAgICAgMAorICAgICNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9DRU5URVJJTkcgICAgICAgICAgICAgICAgMjQ6MjQKKyAgICAjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0VOVEVSSU5HX0RJU0FCTEUgICAgICAgIDAKKyAgICAjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfQ0VOVEVSSU5HX0VOQUJMRSAgICAgICAgIDEKKyNlbmRpZgorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0xPQ0tfVElNSU5HICAgICAgICAgICAgICAgICAgMjM6MjMKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9MT0NLX1RJTUlOR19ESVNBQkxFICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9MT0NLX1RJTUlOR19FTkFCTEUgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9FWFBBTlNJT04gICAgICAgICAgICAgICAgICAgIDIyOjIyCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRVhQQU5TSU9OX0RJU0FCTEUgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRVhQQU5TSU9OX0VOQUJMRSAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfVkVSVElDQUxfTU9ERSAgICAgICAgICAgICAgICAyMToyMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1ZFUlRJQ0FMX01PREVfUkVQTElDQVRFICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1ZFUlRJQ0FMX01PREVfSU5URVJQT0xBVEUgICAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0hPUklaT05UQUxfTU9ERSAgICAgICAgICAgICAgMjA6MjAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9IT1JJWk9OVEFMX01PREVfUkVQTElDQVRFICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9IT1JJWk9OVEFMX01PREVfSU5URVJQT0xBVEUgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9TRUxFQ1QgICAgICAgICAgICAgICAgICAgICAgIDE5OjE4CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfU0VMRUNUX1BBTkVMICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfU0VMRUNUX1ZHQSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfU0VMRUNUX0NSVCAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRklGTyAgICAgICAgICAgICAgICAgICAgICAgICAxNzoxNgorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0ZJRk9fMSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0ZJRk9fMyAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0ZJRk9fNyAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0ZJRk9fMTEgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0NMT0NLX1BIQVNFICAgICAgICAgICAgICAgICAgMTQ6MTQKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9DTE9DS19QSEFTRV9BQ1RJVkVfSElHSCAgICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9DTE9DS19QSEFTRV9BQ1RJVkVfTE9XICAgICAgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9WU1lOQ19QSEFTRSAgICAgICAgICAgICAgICAgIDEzOjEzCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfVlNZTkNfUEhBU0VfQUNUSVZFX0hJR0ggICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfVlNZTkNfUEhBU0VfQUNUSVZFX0xPVyAgICAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfSFNZTkNfUEhBU0UgICAgICAgICAgICAgICAgICAxMjoxMgorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0hTWU5DX1BIQVNFX0FDVElWRV9ISUdIICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0hTWU5DX1BIQVNFX0FDVElWRV9MT1cgICAgICAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0JMQU5LICAgICAgICAgICAgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9CTEFOS19PRkYgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9CTEFOS19PTiAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9USU1JTkcgICAgICAgICAgICAgICAgICAgICAgIDg6OAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1RJTUlOR19ESVNBQkxFICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1RJTUlOR19FTkFCTEUgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1BJWEVMICAgICAgICAgICAgICAgICAgICAgICAgNzo0CisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfR0FNTUEgICAgICAgICAgICAgICAgICAgICAgICAzOjMKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9HQU1NQV9ESVNBQkxFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9HQU1NQV9FTkFCTEUgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0RJU1BMQVlfQ1RSTF9QTEFORSAgICAgICAgICAgICAgICAgICAgICAgIDI6MgorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1BMQU5FX0RJU0FCTEUgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX1BMQU5FX0VOQUJMRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfRElTUExBWV9DVFJMX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgMTowCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRk9STUFUXzggICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRk9STUFUXzE2ICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfRk9STUFUXzMyICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIENSVF9ESVNQTEFZX0NUUkxfUkVTRVJWRURfQklUU19NQVNLICAgICAgICAgICAweEZGMDAwMjAwCisKKyNkZWZpbmUgQ1JUX0ZCX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjA0CisjZGVmaW5lIENSVF9GQl9BRERSRVNTX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBDUlRfRkJfQUREUkVTU19TVEFUVVNfQ1VSUkVOVCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfRkJfQUREUkVTU19TVEFUVVNfUEVORElORyAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfRkJfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgQ1JUX0ZCX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX0ZCX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0ZCX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBDUlRfRkJfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAyMDgKKyNkZWZpbmUgQ1JUX0ZCX1dJRFRIX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OjE2CisjZGVmaW5lIENSVF9GQl9XSURUSF9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzowCisKKyNkZWZpbmUgQ1JUX0hPUklaT05UQUxfVE9UQUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjBDCisjZGVmaW5lIENSVF9IT1JJWk9OVEFMX1RPVEFMX1RPVEFMICAgICAgICAgICAgICAgICAgICAyNzoxNgorI2RlZmluZSBDUlRfSE9SSVpPTlRBTF9UT1RBTF9ESVNQTEFZX0VORCAgICAgICAgICAgICAgMTE6MAorCisjZGVmaW5lIENSVF9IT1JJWk9OVEFMX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIxMAorI2RlZmluZSBDUlRfSE9SSVpPTlRBTF9TWU5DX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMjM6MTYKKyNkZWZpbmUgQ1JUX0hPUklaT05UQUxfU1lOQ19TVEFSVCAgICAgICAgICAgICAgICAgICAgIDExOjAKKworI2RlZmluZSBDUlRfVkVSVElDQUxfVE9UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAyMTQKKyNkZWZpbmUgQ1JUX1ZFUlRJQ0FMX1RPVEFMX1RPVEFMICAgICAgICAgICAgICAgICAgICAgIDI2OjE2CisjZGVmaW5lIENSVF9WRVJUSUNBTF9UT1RBTF9ESVNQTEFZX0VORCAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgQ1JUX1ZFUlRJQ0FMX1NZTkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjE4CisjZGVmaW5lIENSVF9WRVJUSUNBTF9TWU5DX0hFSUdIVCAgICAgICAgICAgICAgICAgICAgICAyMToxNgorI2RlZmluZSBDUlRfVkVSVElDQUxfU1lOQ19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgMTA6MAorCisjZGVmaW5lIENSVF9TSUdOQVRVUkVfQU5BTFlaRVIgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIxQworI2RlZmluZSBDUlRfU0lHTkFUVVJFX0FOQUxZWkVSX1NUQVRVUyAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgQ1JUX1NJR05BVFVSRV9BTkFMWVpFUl9FTkFCTEUgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBDUlRfU0lHTkFUVVJFX0FOQUxZWkVSX0VOQUJMRV9ESVNBQkxFICAgICAgICAgMAorI2RlZmluZSBDUlRfU0lHTkFUVVJFX0FOQUxZWkVSX0VOQUJMRV9FTkFCTEUgICAgICAgICAgMQorI2RlZmluZSBDUlRfU0lHTkFUVVJFX0FOQUxZWkVSX1JFU0VUICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIENSVF9TSUdOQVRVUkVfQU5BTFlaRVJfUkVTRVRfTk9STUFMICAgICAgICAgICAwCisjZGVmaW5lIENSVF9TSUdOQVRVUkVfQU5BTFlaRVJfUkVTRVRfUkVTRVQgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9TSUdOQVRVUkVfQU5BTFlaRVJfU09VUkNFICAgICAgICAgICAgICAgICAxOjAKKyNkZWZpbmUgQ1JUX1NJR05BVFVSRV9BTkFMWVpFUl9TT1VSQ0VfUkVEICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX1NJR05BVFVSRV9BTkFMWVpFUl9TT1VSQ0VfR1JFRU4gICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX1NJR05BVFVSRV9BTkFMWVpFUl9TT1VSQ0VfQkxVRSAgICAgICAgICAgIDIKKworI2RlZmluZSBDUlRfQ1VSUkVOVF9MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAyMjAKKyNkZWZpbmUgQ1JUX0NVUlJFTlRfTElORV9MSU5FICAgICAgICAgICAgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBDUlRfTU9OSVRPUl9ERVRFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAyMjQKKyNkZWZpbmUgQ1JUX01PTklUT1JfREVURUNUX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgIDI1OjI1CisjZGVmaW5lIENSVF9NT05JVE9SX0RFVEVDVF9WQUxVRV9ESVNBQkxFICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9NT05JVE9SX0RFVEVDVF9WQUxVRV9FTkFCTEUgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9NT05JVE9SX0RFVEVDVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAyNDoyNAorI2RlZmluZSBDUlRfTU9OSVRPUl9ERVRFQ1RfRU5BQkxFX0RJU0FCTEUgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfTU9OSVRPUl9ERVRFQ1RfRU5BQkxFX0VOQUJMRSAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfTU9OSVRPUl9ERVRFQ1RfUkVEICAgICAgICAgICAgICAgICAgICAgICAgMjM6MTYKKyNkZWZpbmUgQ1JUX01PTklUT1JfREVURUNUX0dSRUVOICAgICAgICAgICAgICAgICAgICAgIDE1OjgKKyNkZWZpbmUgQ1JUX01PTklUT1JfREVURUNUX0JMVUUgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisjZGVmaW5lIENSVF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIyOAorI2RlZmluZSBDUlRfU0NBTEVfVkVSVElDQUxfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgQ1JUX1NDQUxFX1ZFUlRJQ0FMX01PREVfRVhQQU5EICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX1NDQUxFX1ZFUlRJQ0FMX01PREVfU0hSSU5LICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX1NDQUxFX1ZFUlRJQ0FMX1NDQUxFICAgICAgICAgICAgICAgICAgICAgIDI3OjE2CisjZGVmaW5lIENSVF9TQ0FMRV9IT1JJWk9OVEFMX01PREUgICAgICAgICAgICAgICAgICAgICAxNToxNQorI2RlZmluZSBDUlRfU0NBTEVfSE9SSVpPTlRBTF9NT0RFX0VYUEFORCAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfU0NBTEVfSE9SSVpPTlRBTF9NT0RFX1NIUklOSyAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfU0NBTEVfSE9SSVpPTlRBTF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTE6MAorCisvKiBDUlQgQ3Vyc29yIENvbnRyb2wgKi8KKworI2RlZmluZSBDUlRfSFdDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAyMzAKKyNkZWZpbmUgQ1JUX0hXQ19BRERSRVNTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIENSVF9IV0NfQUREUkVTU19FTkFCTEVfRElTQUJMRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENSVF9IV0NfQUREUkVTU19FTkFCTEVfRU5BQkxFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENSVF9IV0NfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBDUlRfSFdDX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfSFdDX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfSFdDX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIENSVF9IV0NfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIzNAorI2RlZmluZSBDUlRfSFdDX0xPQ0FUSU9OX1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgQ1JUX0hXQ19MT0NBVElPTl9UT1BfSU5TSURFICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1JUX0hXQ19MT0NBVElPTl9UT1BfT1VUU0lERSAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1JUX0hXQ19MT0NBVElPTl9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjE2CisjZGVmaW5lIENSVF9IV0NfTE9DQVRJT05fTEVGVCAgICAgICAgICAgICAgICAgICAgICAgICAxMToxMQorI2RlZmluZSBDUlRfSFdDX0xPQ0FUSU9OX0xFRlRfSU5TSURFICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDUlRfSFdDX0xPQ0FUSU9OX0xFRlRfT1VUU0lERSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDUlRfSFdDX0xPQ0FUSU9OX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MAorCisjZGVmaW5lIENSVF9IV0NfQ09MT1JfMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIzOAorI2RlZmluZSBDUlRfSFdDX0NPTE9SXzEyXzJfUkdCNTY1ICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgQ1JUX0hXQ19DT0xPUl8xMl8xX1JHQjU2NSAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBDUlRfSFdDX0NPTE9SXzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAyM0MKKyNkZWZpbmUgQ1JUX0hXQ19DT0xPUl8zX1JHQjU2NSAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworLyogT2xkIERlZmluaXRpb25zICsrKy4gTmVlZCB0byBiZSByZW1vdmVkIGlmIG5vIGFwcGxpY2F0aW9uIHVzZSBpdC4gKi8KKyNpZiAwCisgICAgI2RlZmluZSBDUlRfSFdDX0NPTE9SXzAxICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIzOAorICAgICNkZWZpbmUgQ1JUX0hXQ19DT0xPUl8wMV8xX1JFRCAgICAgICAgICAgICAgICAgICAgMzE6MjcKKyAgICAjZGVmaW5lIENSVF9IV0NfQ09MT1JfMDFfMV9HUkVFTiAgICAgICAgICAgICAgICAgIDI2OjIxCisgICAgI2RlZmluZSBDUlRfSFdDX0NPTE9SXzAxXzFfQkxVRSAgICAgICAgICAgICAgICAgICAyMDoxNgorICAgICNkZWZpbmUgQ1JUX0hXQ19DT0xPUl8wMV8wX1JFRCAgICAgICAgICAgICAgICAgICAgMTU6MTEKKyAgICAjZGVmaW5lIENSVF9IV0NfQ09MT1JfMDFfMF9HUkVFTiAgICAgICAgICAgICAgICAgIDEwOjUKKyAgICAjZGVmaW5lIENSVF9IV0NfQ09MT1JfMDFfMF9CTFVFICAgICAgICAgICAgICAgICAgIDQ6MAorCisgICAgI2RlZmluZSBDUlRfSFdDX0NPTE9SXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDIzQworICAgICNkZWZpbmUgQ1JUX0hXQ19DT0xPUl8yX1JFRCAgICAgICAgICAgICAgICAgICAgICAgMTU6MTEKKyAgICAjZGVmaW5lIENSVF9IV0NfQ09MT1JfMl9HUkVFTiAgICAgICAgICAgICAgICAgICAgIDEwOjUKKyAgICAjZGVmaW5lIENSVF9IV0NfQ09MT1JfMl9CTFVFICAgICAgICAgICAgICAgICAgICAgIDQ6MAorI2VuZGlmCisvKiBPbGQgRGVmaW5pdGlvbnMgLS0tICovCisKKy8qIFRoaXMgdmVydGljYWwgZXhwYW5zaW9uIGJlbG93IHN0YXJ0IGF0IDB4MDgwMjQwIH4gMHgwODAyNjQgKi8KKyNkZWZpbmUgQ1JUX1ZFUlRJQ0FMX0VYUEFOU0lPTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMjQwCisjaWZuZGVmIFZBTElEQVRJT05fQ0hJUAorICAgICNkZWZpbmUgQ1JUX1ZFUlRJQ0FMX0NFTlRFUklOR19WQUxVRSAgICAgICAgICAgICAgMzE6MjQKKyNlbmRpZgorI2RlZmluZSBDUlRfVkVSVElDQUxfRVhQQU5TSU9OX0NPTVBBUkVfVkFMVUUgICAgICAgICAgMjM6MTYKKyNkZWZpbmUgQ1JUX1ZFUlRJQ0FMX0VYUEFOU0lPTl9MSU5FX0JVRkZFUiAgICAgICAgICAgIDE1OjEyCisjZGVmaW5lIENSVF9WRVJUSUNBTF9FWFBBTlNJT05fU0NBTEVfRkFDVE9SICAgICAgICAgICAxMTowCisKKy8qIFRoaXMgaG9yaXpvbnRhbCBleHBhbnNpb24gYmVsb3cgc3RhcnQgYXQgMHgwODAyNjggfiAweDA4MDI3QyAqLworI2RlZmluZSBDUlRfSE9SSVpPTlRBTF9FWFBBTlNJT04gICAgICAgICAgICAgICAgICAgICAgMHgwODAyNjgKKyNpZm5kZWYgVkFMSURBVElPTl9DSElQCisgICAgI2RlZmluZSBDUlRfSE9SSVpPTlRBTF9DRU5URVJJTkdfVkFMVUUgICAgICAgICAgICAzMToyNAorI2VuZGlmCisjZGVmaW5lIENSVF9IT1JJWk9OVEFMX0VYUEFOU0lPTl9DT01QQVJFX1ZBTFVFICAgICAgICAyMzoxNgorI2RlZmluZSBDUlRfSE9SSVpPTlRBTF9FWFBBTlNJT05fU0NBTEVfRkFDVE9SICAgICAgICAgMTE6MAorCisjaWZuZGVmIFZBTElEQVRJT05fQ0hJUAorICAgIC8qIEF1dG8gQ2VudGVyaW5nICovCisgICAgI2RlZmluZSBDUlRfQVVUT19DRU5URVJJTkdfVEwgICAgICAgICAgICAgICAgICAgICAweDA4MDI4MAorICAgICNkZWZpbmUgQ1JUX0FVVE9fQ0VOVEVSSU5HX1RMX1RPUCAgICAgICAgICAgICAgICAgMjY6MTYKKyAgICAjZGVmaW5lIENSVF9BVVRPX0NFTlRFUklOR19UTF9MRUZUICAgICAgICAgICAgICAgIDEwOjAKKworICAgICNkZWZpbmUgQ1JUX0FVVE9fQ0VOVEVSSU5HX0JSICAgICAgICAgICAgICAgICAgICAgMHgwODAyODQKKyAgICAjZGVmaW5lIENSVF9BVVRPX0NFTlRFUklOR19CUl9CT1RUT00gICAgICAgICAgICAgIDI2OjE2CisgICAgI2RlZmluZSBDUlRfQVVUT19DRU5URVJJTkdfQlJfUklHSFQgICAgICAgICAgICAgICAxMDowCisjZW5kaWYKKworLyogc203NTBsZSBuZXcgcmVnaXN0ZXIgdG8gY29udHJvbCBwYW5lbCBvdXRwdXQgKi8KKyNkZWZpbmUgRElTUExBWV9DT05UUk9MXzc1MExFIAkweDgwMjg4CisvKiBQYWxldHRlIFJBTSAqLworCisvKiBQYW5lbCBQYWxsZXRlIHJlZ2lzdGVyIHN0YXJ0cyBhdCAweDA4MDQwMCB+IDB4MDgwN0ZDICovCisjZGVmaW5lIFBBTkVMX1BBTEVUVEVfUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDQwMAorCisvKiBQYW5lbCBQYWxsZXRlIHJlZ2lzdGVyIHN0YXJ0cyBhdCAweDA4MEMwMCB+IDB4MDgwRkZDICovCisjZGVmaW5lIENSVF9QQUxFVFRFX1JBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MEMwMAorCisvKiAyRCByZWdpc3RlcnMKKyAqIG1vdmUgdGhlaXIgZGVmaW5hdGlvbiBpbnRvIGdlbmVyYWwgbHlueF9hY2NlbC5oIGZpbGUKKyAqIGJlY2F1c2UgYWxsIHNtaSBncmFwaGljIGNoaXAgc2hhcmUgdGhlIHNhbWUgZHJhd2luZyBlbmdpbmUKKyAqIHJlZ2lzdGVyIGZvcm1hdCAqLworI2lmIDAKKyNkZWZpbmUgREVfU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAKKyNkZWZpbmUgREVfU09VUkNFX1dSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgREVfU09VUkNFX1dSQVBfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TT1VSQ0VfV1JBUF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSB1c2VkIGluIGRpZmZlcmVudCBzZXR0aW5nCisgKi8KKworLyogVXNlIHRoZXNlIGRlZmluaXRpb25zIGluIFhZIGFkZHJlc3NpbmcgbW9kZSBvciBsaW5lYXIgYWRkcmVzc2luZyBtb2RlLiAqLworI2RlZmluZSBERV9TT1VSQ0VfWF9LMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoxNgorI2RlZmluZSBERV9TT1VSQ0VfWV9LMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTowCisKKy8qIFVzZSB0aGlzIGRlZmluaXRpb24gaW4gaG9zdCB3cml0ZSBtb2RlIGZvciBtb25vLiBUaGUgWV9LMiBpcyBub3QgdXNlZAorICAgaW4gaG9zdCB3cml0ZSBtb2RlLiAqLworI2RlZmluZSBERV9TT1VSQ0VfWF9LMV9NT05PICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDoxNgorCisvKiBVc2UgdGhlc2UgZGVmaW5pdGlvbnMgaW4gQnJlc2VuaGFtIGxpbmUgZHJhd2luZyBtb2RlLiAqLworI2RlZmluZSBERV9TT1VSQ0VfWF9LMV9MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOToxNgorI2RlZmluZSBERV9TT1VSQ0VfWV9LMl9MSU5FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzowCisKKyNkZWZpbmUgREVfREVTVElOQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDQKKyNkZWZpbmUgREVfREVTVElOQVRJT05fV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgREVfREVTVElOQVRJT05fV1JBUF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9ERVNUSU5BVElPTl9XUkFQX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAxCisjaWYgMQorICAgICNkZWZpbmUgREVfREVTVElOQVRJT05fWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoxNgorICAgICNkZWZpbmUgREVfREVTVElOQVRJT05fWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTowCisjZWxzZQorICAgICNkZWZpbmUgREVfREVTVElOQVRJT05fWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODoxNgorICAgICNkZWZpbmUgREVfREVTVElOQVRJT05fWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTowCisjZW5kaWYKKworI2RlZmluZSBERV9ESU1FTlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwOAorI2RlZmluZSBERV9ESU1FTlNJT05fWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODoxNgorI2RlZmluZSBERV9ESU1FTlNJT05fWV9FVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTowCisKKyNkZWZpbmUgREVfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMEMKKyNkZWZpbmUgREVfQ09OVFJPTF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgREVfQ09OVFJPTF9TVEFUVVNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1NUQVRVU19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfUEFUVEVSTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOjMwCisjZGVmaW5lIERFX0NPTlRST0xfUEFUVEVSTl9NT05PICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9QQVRURVJOX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1VQREFURV9ERVNUSU5BVElPTl9YICAgICAgICAgICAgICAgICAyOToyOQorI2RlZmluZSBERV9DT05UUk9MX1VQREFURV9ERVNUSU5BVElPTl9YX0RJU0FCTEUgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfVVBEQVRFX0RFU1RJTkFUSU9OX1hfRU5BQkxFICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9RVUlDS19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgMjg6MjgKKyNkZWZpbmUgREVfQ09OVFJPTF9RVUlDS19TVEFSVF9ESVNBQkxFICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1FVSUNLX1NUQVJUX0VOQUJMRSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfRElSRUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIERFX0NPTlRST0xfRElSRUNUSU9OX0xFRlRfVE9fUklHSFQgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9ESVJFQ1RJT05fUklHSFRfVE9fTEVGVCAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX01BSk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBERV9DT05UUk9MX01BSk9SX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfTUFKT1JfWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9TVEVQX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU6MjUKKyNkZWZpbmUgREVfQ09OVFJPTF9TVEVQX1hfUE9TSVRJVkUgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1NURVBfWF9ORUdBVElWRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfU1RFUF9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0OjI0CisjZGVmaW5lIERFX0NPTlRST0xfU1RFUF9ZX1BPU0lUSVZFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9TVEVQX1lfTkVHQVRJVkUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1NUUkVUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzoyMworI2RlZmluZSBERV9DT05UUk9MX1NUUkVUQ0hfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfU1RSRVRDSF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9IT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI6MjIKKyNkZWZpbmUgREVfQ09OVFJPTF9IT1NUX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX0hPU1RfTU9OTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfTEFTVF9QSVhFTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxOjIxCisjZGVmaW5lIERFX0NPTlRST0xfTEFTVF9QSVhFTF9PRkYgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9MQVNUX1BJWEVMX09OICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDoxNgorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfQklUQkxUICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9SRUNUQU5HTEVfRklMTCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0RFX1RJTEUgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfVFJBUEVaT0lEX0ZJTEwgICAgICAgICAgICAgICAzCisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9BTFBIQV9CTEVORCAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX1JMRV9TVFJJUCAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfU0hPUlRfU1RST0tFICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9MSU5FX0RSQVcgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0hPU1RfV1JJVEUgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfSE9TVF9SRUFEICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9IT1NUX1dSSVRFX0JPVFRPTV9VUCAgICAgICAgIDEwCisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9ST1RBVEUgICAgICAgICAgICAgICAgICAgICAgIDExCisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9GT05UICAgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9URVhUVVJFX0xPQUQgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIERFX0NPTlRST0xfUk9QX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjE1CisjZGVmaW5lIERFX0NPTlRST0xfUk9QX1NFTEVDVF9ST1AzICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1BfU0VMRUNUX1JPUDIgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1JPUDJfU09VUkNFICAgICAgICAgICAgICAgICAgICAgICAgICAxNDoxNAorI2RlZmluZSBERV9DT05UUk9MX1JPUDJfU09VUkNFX0JJVE1BUCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfUk9QMl9TT1VSQ0VfUEFUVEVSTiAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9NT05PX0RBVEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTIKKyNkZWZpbmUgREVfQ09OVFJPTF9NT05PX0RBVEFfTk9UX1BBQ0tFRCAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX01PTk9fREFUQV84X1BBQ0tFRCAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfTU9OT19EQVRBXzE2X1BBQ0tFRCAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgREVfQ09OVFJPTF9NT05PX0RBVEFfMzJfUEFDS0VEICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBERV9DT05UUk9MX1JFUEVBVF9ST1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAxMToxMQorI2RlZmluZSBERV9DT05UUk9MX1JFUEVBVF9ST1RBVEVfRElTQUJMRSAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfUkVQRUFUX1JPVEFURV9FTkFCTEUgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfTUFUQ0ggICAgICAgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfTUFUQ0hfT1BBUVVFICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9NQVRDSF9UUkFOU1BBUkVOVCAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX1NFTEVDVCAgICAgICAgICAgICAgICAgIDk6OQorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9TRUxFQ1RfU09VUkNFICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX1NFTEVDVF9ERVNUSU5BVElPTiAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1kgICAgICAgICAgICAgICAgICAgICAgICAgODo4CisjZGVmaW5lIERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX0RJU0FCTEUgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfRU5BQkxFICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1JPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjAKKworLyogUHNldWRvIGZpZWxkcy4gKi8KKworI2RlZmluZSBERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVIgICAgICAgICAgICAgICAgICAgICAyNzoyNAorI2RlZmluZSBERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfMjI1ICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl8xMzUgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzMxNSAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfNDUgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl8yNzAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzkwICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfMTgwICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl8wICAgICAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIERFX0NPTlRST0xfUk9UQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1OjI0CisjZGVmaW5lIERFX0NPTlRST0xfUk9UQVRJT05fMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1RBVElPTl8yNzAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1JPVEFUSU9OXzkwICAgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERFX0NPTlRST0xfUk9UQVRJT05fMTgwICAgICAgICAgICAgICAgICAgICAgICAgIDMKKworI2RlZmluZSBERV9QSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAxMAorI2RlZmluZSBERV9QSVRDSF9ERVNUSU5BVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODoxNgorI2RlZmluZSBERV9QSVRDSF9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjowCisKKyNkZWZpbmUgREVfRk9SRUdST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMTQKKyNkZWZpbmUgREVfRk9SRUdST1VORF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MAorCisjZGVmaW5lIERFX0JBQ0tHUk9VTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDE4CisjZGVmaW5lIERFX0JBQ0tHUk9VTkRfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjAKKworI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAxQworI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QQVRURVJOX1hZICAgICAgICAgICAgICAgICAgICAzMDozMAorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QQVRURVJOX1hZX05PUk1BTCAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BBVFRFUk5fWFlfT1ZFUldSSVRFICAgICAgICAgIDEKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfUEFUVEVSTl9ZICAgICAgICAgICAgICAgICAgICAgMjk6MjcKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfUEFUVEVSTl9YICAgICAgICAgICAgICAgICAgICAgMjU6MjMKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfUElYRUxfRk9STUFUICAgICAgICAgICAgICAgICAgMjE6MjAKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfUElYRUxfRk9STUFUXzggICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QSVhFTF9GT1JNQVRfMTYgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BJWEVMX0ZPUk1BVF8zMiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfQUREUkVTU0lORyAgICAgICAgICAgICAgICAgICAgMTk6MTYKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfQUREUkVTU0lOR19YWSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9BRERSRVNTSU5HX0xJTkVBUiAgICAgICAgICAgICAxNQorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9TT1VSQ0VfSEVJR0hUICAgICAgICAgICAgICAgICAxMTowCisKKyNkZWZpbmUgREVfQ09MT1JfQ09NUEFSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMjAKKyNkZWZpbmUgREVfQ09MT1JfQ09NUEFSRV9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgMjM6MAorCisjZGVmaW5lIERFX0NPTE9SX0NPTVBBUkVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDI0CisjZGVmaW5lIERFX0NPTE9SX0NPTVBBUkVfTUFTS19NQVNLUyAgICAgICAgICAgICAgICAgICAgIDIzOjAKKworI2RlZmluZSBERV9NQVNLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAyOAorI2RlZmluZSBERV9NQVNLU19CWVRFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBERV9NQVNLU19CSVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTowCisKKyNkZWZpbmUgREVfQ0xJUF9UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMkMKKyNkZWZpbmUgREVfQ0xJUF9UTF9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgREVfQ0xJUF9UTF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTMKKyNkZWZpbmUgREVfQ0xJUF9UTF9TVEFUVVNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DTElQX1RMX1NUQVRVU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NMSVBfVExfSU5ISUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOjEyCisjZGVmaW5lIERFX0NMSVBfVExfSU5ISUJJVF9PVVRTSURFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ0xJUF9UTF9JTkhJQklUX0lOU0lERSAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DTElQX1RMX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTowCisKKyNkZWZpbmUgREVfQ0xJUF9CUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMzAKKyNkZWZpbmUgREVfQ0xJUF9CUl9CT1RUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgREVfQ0xJUF9CUl9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MAorCisjZGVmaW5lIERFX01PTk9fUEFUVEVSTl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDM0CisjZGVmaW5lIERFX01PTk9fUEFUVEVSTl9MT1dfUEFUVEVSTiAgICAgICAgICAgICAgICAgICAgIDMxOjAKKworI2RlZmluZSBERV9NT05PX1BBVFRFUk5fSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAzOAorI2RlZmluZSBERV9NT05PX1BBVFRFUk5fSElHSF9QQVRURVJOICAgICAgICAgICAgICAgICAgICAzMTowCisKKyNkZWZpbmUgREVfV0lORE9XX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwM0MKKyNkZWZpbmUgREVfV0lORE9XX1dJRFRIX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgMjg6MTYKKyNkZWZpbmUgREVfV0lORE9XX1dJRFRIX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MAorCisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDQwCisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRV9FWFRfTE9DQUwgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFX0VYVF9FWFRFUk5BTCAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9XSU5ET1dfU09VUkNFX0JBU0VfQ1MgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBERV9XSU5ET1dfU09VUkNFX0JBU0VfQ1NfMCAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRV9DU18xICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDQ0CisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0VYVCAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0VYVF9MT0NBTCAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0VfRVhUX0VYVEVSTkFMICAgICAgICAgMQorI2RlZmluZSBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRV9DUyAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRV9DU18wICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0NTXzEgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIERFX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDQ4CisjZGVmaW5lIERFX0FMUEhBX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisjZGVmaW5lIERFX1dSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDRDCisjZGVmaW5lIERFX1dSQVBfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIERFX1dSQVBfWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBERV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDA1MAorI2RlZmluZSBERV9TVEFUVVNfQ1NDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgREVfU1RBVFVTX0NTQ19DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVEFUVVNfQ1NDX05PVF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUQVRVU19DU0NfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfU1RBVFVTXzJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIERFX1NUQVRVU18yRF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfU1RBVFVTXzJEX05PVF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVEFUVVNfMkRfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZW5kaWYKKy8qIENvbG9yIFNwYWNlIENvbnZlcnNpb24gcmVnaXN0ZXJzLiAqLworCisjZGVmaW5lIENTQ19ZX1NPVVJDRV9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMEM4CisjZGVmaW5lIENTQ19ZX1NPVVJDRV9CQVNFX0VYVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIENTQ19ZX1NPVVJDRV9CQVNFX0VYVF9MT0NBTCAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX0JBU0VfRVhUX0VYVEVSTkFMICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDU0NfWV9TT1VSQ0VfQkFTRV9DUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBDU0NfWV9TT1VSQ0VfQkFTRV9DU18wICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENTQ19ZX1NPVVJDRV9CQVNFX0NTXzEgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIENTQ19DT05TVEFOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMENDCisjZGVmaW5lIENTQ19DT05TVEFOVFNfWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjI0CisjZGVmaW5lIENTQ19DT05TVEFOVFNfUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzOjE2CisjZGVmaW5lIENTQ19DT05TVEFOVFNfRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjgKKyNkZWZpbmUgQ1NDX0NPTlNUQU5UU19CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzowCisKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwRDAKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX1hfSU5URUdFUiAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgQ1NDX1lfU09VUkNFX1hfRlJBQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgMTU6MworCisjZGVmaW5lIENTQ19ZX1NPVVJDRV9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMEQ0CisjZGVmaW5lIENTQ19ZX1NPVVJDRV9ZX0lOVEVHRVIgICAgICAgICAgICAgICAgICAgICAgICAgIDI3OjE2CisjZGVmaW5lIENTQ19ZX1NPVVJDRV9ZX0ZSQUNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjMKKworI2RlZmluZSBDU0NfVV9TT1VSQ0VfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDBEOAorI2RlZmluZSBDU0NfVV9TT1VSQ0VfQkFTRV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBDU0NfVV9TT1VSQ0VfQkFTRV9FWFRfTE9DQUwgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENTQ19VX1NPVVJDRV9CQVNFX0VYVF9FWFRFUk5BTCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1NDX1VfU09VUkNFX0JBU0VfQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgQ1NDX1VfU09VUkNFX0JBU0VfQ1NfMCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDU0NfVV9TT1VSQ0VfQkFTRV9DU18xICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENTQ19VX1NPVVJDRV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBDU0NfVl9TT1VSQ0VfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDBEQworI2RlZmluZSBDU0NfVl9TT1VSQ0VfQkFTRV9FWFQgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBDU0NfVl9TT1VSQ0VfQkFTRV9FWFRfTE9DQUwgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENTQ19WX1NPVVJDRV9CQVNFX0VYVF9FWFRFUk5BTCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ1NDX1ZfU09VUkNFX0JBU0VfQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgQ1NDX1ZfU09VUkNFX0JBU0VfQ1NfMCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDU0NfVl9TT1VSQ0VfQkFTRV9DU18xICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENTQ19WX1NPVVJDRV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBDU0NfU09VUkNFX0RJTUVOU0lPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDBFMAorI2RlZmluZSBDU0NfU09VUkNFX0RJTUVOU0lPTl9YICAgICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBDU0NfU09VUkNFX0RJTUVOU0lPTl9ZICAgICAgICAgICAgICAgICAgICAgICAgICAxNTowCisKKyNkZWZpbmUgQ1NDX1NPVVJDRV9QSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwRTQKKyNkZWZpbmUgQ1NDX1NPVVJDRV9QSVRDSF9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgQ1NDX1NPVVJDRV9QSVRDSF9VViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIENTQ19ERVNUSU5BVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMEU4CisjZGVmaW5lIENTQ19ERVNUSU5BVElPTl9XUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIENTQ19ERVNUSU5BVElPTl9XUkFQX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX1dSQVBfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDU0NfREVTVElOQVRJT05fWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzoxNgorI2RlZmluZSBDU0NfREVTVElOQVRJT05fWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTowCisKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX0RJTUVOU0lPTiAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwRUMKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX0RJTUVOU0lPTl9YICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX0RJTUVOU0lPTl9ZICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIENTQ19ERVNUSU5BVElPTl9QSVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMEYwCisjZGVmaW5lIENTQ19ERVNUSU5BVElPTl9QSVRDSF9YICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIENTQ19ERVNUSU5BVElPTl9QSVRDSF9ZICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBDU0NfU0NBTEVfRkFDVE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDBGNAorI2RlZmluZSBDU0NfU0NBTEVfRkFDVE9SX0hPUklaT05UQUwgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBDU0NfU0NBTEVfRkFDVE9SX1ZFUlRJQ0FMICAgICAgICAgICAgICAgICAgICAgICAxNTowCisKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX0JBU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwRjgKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX0JBU0VfRVhUICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX0JBU0VfRVhUX0xPQ0FMICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDU0NfREVTVElOQVRJT05fQkFTRV9FWFRfRVhURVJOQUwgICAgICAgICAgICAgICAxCisjZGVmaW5lIENTQ19ERVNUSU5BVElPTl9CQVNFX0NTICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIENTQ19ERVNUSU5BVElPTl9CQVNFX0NTXzAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1NDX0RFU1RJTkFUSU9OX0JBU0VfQ1NfMSAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBDU0NfREVTVElOQVRJT05fQkFTRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgQ1NDX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwRkMKKyNkZWZpbmUgQ1NDX0NPTlRST0xfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgQ1NDX0NPTlRST0xfU1RBVFVTX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBDU0NfQ09OVFJPTF9TVEFUVVNfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENTQ19DT05UUk9MX1NPVVJDRV9GT1JNQVQgICAgICAgICAgICAgICAgICAgICAgIDMwOjI4CisjZGVmaW5lIENTQ19DT05UUk9MX1NPVVJDRV9GT1JNQVRfWVVWNDIyICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1NDX0NPTlRST0xfU09VUkNFX0ZPUk1BVF9ZVVY0MjBJICAgICAgICAgICAgICAgMQorI2RlZmluZSBDU0NfQ09OVFJPTF9TT1VSQ0VfRk9STUFUX1lVVjQyMCAgICAgICAgICAgICAgICAyCisjZGVmaW5lIENTQ19DT05UUk9MX1NPVVJDRV9GT1JNQVRfWVZVOSAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ1NDX0NPTlRST0xfU09VUkNFX0ZPUk1BVF9JWVUxICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBDU0NfQ09OVFJPTF9TT1VSQ0VfRk9STUFUX0lZVTIgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIENTQ19DT05UUk9MX1NPVVJDRV9GT1JNQVRfUkdCNTY1ICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ1NDX0NPTlRST0xfU09VUkNFX0ZPUk1BVF9SR0I4ODg4ICAgICAgICAgICAgICAgNworI2RlZmluZSBDU0NfQ09OVFJPTF9ERVNUSU5BVElPTl9GT1JNQVQgICAgICAgICAgICAgICAgICAyNzoyNgorI2RlZmluZSBDU0NfQ09OVFJPTF9ERVNUSU5BVElPTl9GT1JNQVRfUkdCNTY1ICAgICAgICAgICAwCisjZGVmaW5lIENTQ19DT05UUk9MX0RFU1RJTkFUSU9OX0ZPUk1BVF9SR0I4ODg4ICAgICAgICAgIDEKKyNkZWZpbmUgQ1NDX0NPTlRST0xfSE9SSVpPTlRBTF9GSUxURVIgICAgICAgICAgICAgICAgICAgMjU6MjUKKyNkZWZpbmUgQ1NDX0NPTlRST0xfSE9SSVpPTlRBTF9GSUxURVJfRElTQUJMRSAgICAgICAgICAgMAorI2RlZmluZSBDU0NfQ09OVFJPTF9IT1JJWk9OVEFMX0ZJTFRFUl9FTkFCTEUgICAgICAgICAgICAxCisjZGVmaW5lIENTQ19DT05UUk9MX1ZFUlRJQ0FMX0ZJTFRFUiAgICAgICAgICAgICAgICAgICAgIDI0OjI0CisjZGVmaW5lIENTQ19DT05UUk9MX1ZFUlRJQ0FMX0ZJTFRFUl9ESVNBQkxFICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1NDX0NPTlRST0xfVkVSVElDQUxfRklMVEVSX0VOQUJMRSAgICAgICAgICAgICAgMQorI2RlZmluZSBDU0NfQ09OVFJPTF9CWVRFX09SREVSICAgICAgICAgICAgICAgICAgICAgICAgICAyMzoyMworI2RlZmluZSBDU0NfQ09OVFJPTF9CWVRFX09SREVSX1lVWVYgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIENTQ19DT05UUk9MX0JZVEVfT1JERVJfVVlWWSAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBERV9EQVRBX1BPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDExMDAwMAorCisjZGVmaW5lIEkyQ19CWVRFX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDQwCisjZGVmaW5lIEkyQ19CWVRFX0NPVU5UX0NPVU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6MAorCisjZGVmaW5lIEkyQ19DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDQxCisjZGVmaW5lIEkyQ19DVFJMX0lOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBJMkNfQ1RSTF9JTlRfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEkyQ19DVFJMX0lOVF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSTJDX0NUUkxfRElSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIEkyQ19DVFJMX0RJUl9XUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSTJDX0NUUkxfRElSX1JEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJMkNfQ1RSTF9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgSTJDX0NUUkxfQ1RSTF9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJMkNfQ1RSTF9DVFJMX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEkyQ19DVFJMX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBJMkNfQ1RSTF9NT0RFX1NUQU5EQVJEICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEkyQ19DVFJMX01PREVfRkFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSTJDX0NUUkxfRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIEkyQ19DVFJMX0VOX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSTJDX0NUUkxfRU5fRU5BQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEkyQ19TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDQyCisjZGVmaW5lIEkyQ19TVEFUVVNfVFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBJMkNfU1RBVFVTX1RYX1BST0dSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEkyQ19TVEFUVVNfVFhfQ09NUExFVEVEICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgSTJDX1RYX0RPTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBJMkNfU1RBVFVTX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgSTJDX1NUQVRVU19FUlJfTk9STUFMICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJMkNfU1RBVFVTX0VSUl9FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEkyQ19TVEFUVVNfRVJSX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSTJDX1NUQVRVU19BQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMToxCisjZGVmaW5lIEkyQ19TVEFUVVNfQUNLX1JFQ0VJVkVEICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSTJDX1NUQVRVU19BQ0tfTk9UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBJMkNfU1RBVFVTX0JTWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgSTJDX1NUQVRVU19CU1lfSURMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJMkNfU1RBVFVTX0JTWV9CVVNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKyNkZWZpbmUgSTJDX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwNDIKKyNkZWZpbmUgSTJDX1JFU0VUX0JVU19FUlJPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIEkyQ19SRVNFVF9CVVNfRVJST1JfQ0xFQVIgICAgICAgICAgICAgICAgICAgICAgIDAKKworI2RlZmluZSBJMkNfU0xBVkVfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDA0MworI2RlZmluZSBJMkNfU0xBVkVfQUREUkVTU19BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICA3OjEKKyNkZWZpbmUgSTJDX1NMQVZFX0FERFJFU1NfUlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIEkyQ19TTEFWRV9BRERSRVNTX1JXX1cgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSTJDX1NMQVZFX0FERFJFU1NfUldfUiAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIEkyQ19EQVRBMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDQ0CisjZGVmaW5lIEkyQ19EQVRBMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDQ1CisjZGVmaW5lIEkyQ19EQVRBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDQ2CisjZGVmaW5lIEkyQ19EQVRBMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDQ3CisjZGVmaW5lIEkyQ19EQVRBNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDQ4CisjZGVmaW5lIEkyQ19EQVRBNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDQ5CisjZGVmaW5lIEkyQ19EQVRBNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDRBCisjZGVmaW5lIEkyQ19EQVRBNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDRCCisjZGVmaW5lIEkyQ19EQVRBOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDRDCisjZGVmaW5lIEkyQ19EQVRBOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDRECisjZGVmaW5lIEkyQ19EQVRBMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDRFCisjZGVmaW5lIEkyQ19EQVRBMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDRGCisjZGVmaW5lIEkyQ19EQVRBMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDUwCisjZGVmaW5lIEkyQ19EQVRBMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDUxCisjZGVmaW5lIEkyQ19EQVRBMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDUyCisjZGVmaW5lIEkyQ19EQVRBMTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDUzCisKKworI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAwMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0ZJRUxEX0lOUFVUICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0ZJRUxEX0lOUFVUX0VWRU5fRklFTEQgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfRklFTERfSU5QVVRfT0REX0ZJRUxEICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9TQ0FOICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9TQ0FOX1BST0dSRVNTSVZFICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1NDQU5fSU5URVJMQUNFICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ1VSUkVOVF9CVUZGRVIgICAgICAgICAgICAgICAgIDI1OjI1CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ1VSUkVOVF9CVUZGRVJfMCAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DVVJSRU5UX0JVRkZFUl8xICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1ZFUlRJQ0FMX1NZTkMgICAgICAgICAgICAgICAgICAyNDoyNAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1ZFUlRJQ0FMX1NZTkNfSU5BQ1RJVkUgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVkVSVElDQUxfU1lOQ19BQ1RJVkUgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9BREogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk6MTkKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9BREpfTk9STUFMICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0FESl9ERUxBWSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfSEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4OjE4CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfSEFfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9IQV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1ZTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzoxNworI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1ZTS19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVlNLX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9IU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY6MTYKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9IU0tfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0hTS19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfRkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjE1CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfRkRfUklTSU5HICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9GRF9GQUxMSU5HICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1ZQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDoxNAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1ZQX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVlBfTE9XICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9IUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTMKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9IUF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0hQX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOjEyCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ1BfSElHSCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DUF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1VWUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMToxMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1VWU19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfVVZTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9CUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MTAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9CU19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0JTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk6OQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0NTXzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ1NfOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODo4CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ0ZfWVVWICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9DRl9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0ZTICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3OjcKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9GU19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0ZTX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfV0VBVkUgICAgICAgICAgICAgICAgICAgICAgICAgIDY6NgorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX1dFQVZFX0RJU0FCTEUgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfV0VBVkVfRU5BQkxFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9CT0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTo1CisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQk9CX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9CT0JfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OjQKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9EQl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0RCX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM6MworI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0NDX0NPTlRJTlVFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ0NfQ09ORElUSU9OICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9SR0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjoyCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfUkdCX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF9SR0JfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMXzY1NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ1RSTF82NTZfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMXzY1Nl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ0FQICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA6MAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DVFJMX0NBUF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0NUUkxfQ0FQX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDEKKworI2RlZmluZSBaVjBfQ0FQVFVSRV9DTElQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAwNAorI2RlZmluZSBaVjBfQ0FQVFVSRV9DTElQX1lDTElQX0VWRU5fRklFTEQgICAgICAgICAgICAgICAgMjU6MTYKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ0xJUF9ZQ0xJUCAgICAgICAgICAgICAgICAgICAgICAgICAgMjU6MTYKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQ0xJUF9YQ0xJUCAgICAgICAgICAgICAgICAgICAgICAgICAgOTowCisKKyNkZWZpbmUgWlYwX0NBUFRVUkVfU0laRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwMDgKKyNkZWZpbmUgWlYwX0NBUFRVUkVfU0laRV9IRUlHSFQgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MTYKKyNkZWZpbmUgWlYwX0NBUFRVUkVfU0laRV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMTA6MAorCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjBfQUREUkVTUyAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMDBDCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjBfQUREUkVTU19TVEFUVVMgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjBfQUREUkVTU19TVEFUVVNfQ1VSUkVOVCAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMF9BRERSRVNTX1NUQVRVU19QRU5ESU5HICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYwX0FERFJFU1NfRVhUICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYwX0FERFJFU1NfRVhUX0xPQ0FMICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjBfQUREUkVTU19FWFRfRVhURVJOQUwgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMF9BRERSRVNTX0NTICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMF9BRERSRVNTX0NTXzAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYwX0FERFJFU1NfQ1NfMSAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjBfQUREUkVTU19BRERSRVNTICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYxX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAxMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYxX0FERFJFU1NfU1RBVFVTICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYxX0FERFJFU1NfU1RBVFVTX0NVUlJFTlQgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjFfQUREUkVTU19TVEFUVVNfUEVORElORyAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMV9BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMV9BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYxX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgICAxCisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjFfQUREUkVTU19DUyAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIFpWMF9DQVBUVVJFX0JVRjFfQUREUkVTU19DU18wICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGMV9BRERSRVNTX0NTXzEgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUYxX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGX09GRlNFVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTAwMTQKKyNpZm5kZWYgVkFMSURBVElPTl9DSElQCisgICAgI2RlZmluZSBaVjBfQ0FQVFVSRV9CVUZfT0ZGU0VUX1lDTElQX09ERF9GSUVMRCAgICAgIDI1OjE2CisjZW5kaWYKKyNkZWZpbmUgWlYwX0NBUFRVUkVfQlVGX09GRlNFVF9PRkZTRVQgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIFpWMF9DQVBUVVJFX0ZJRk9fQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMDE4CisjZGVmaW5lIFpWMF9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPICAgICAgICAgICAgICAgICAgICAgIDI6MAorI2RlZmluZSBaVjBfQ0FQVFVSRV9GSUZPX0NUUkxfRklGT18wICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPXzEgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYwX0NBUFRVUkVfRklGT19DVFJMX0ZJRk9fMiAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBaVjBfQ0FQVFVSRV9GSUZPX0NUUkxfRklGT18zICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFpWMF9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPXzQgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgWlYwX0NBUFRVUkVfRklGT19DVFJMX0ZJRk9fNSAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBaVjBfQ0FQVFVSRV9GSUZPX0NUUkxfRklGT182ICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFpWMF9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPXzcgICAgICAgICAgICAgICAgICAgIDcKKworI2RlZmluZSBaVjBfQ0FQVFVSRV9ZUkdCX0NPTlNUICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5MDAxQworI2RlZmluZSBaVjBfQ0FQVFVSRV9ZUkdCX0NPTlNUX1kgICAgICAgICAgICAgICAgICAgICAgICAzMToyNAorI2RlZmluZSBaVjBfQ0FQVFVSRV9ZUkdCX0NPTlNUX1IgICAgICAgICAgICAgICAgICAgICAgICAyMzoxNgorI2RlZmluZSBaVjBfQ0FQVFVSRV9ZUkdCX0NPTlNUX0cgICAgICAgICAgICAgICAgICAgICAgICAxNTo4CisjZGVmaW5lIFpWMF9DQVBUVVJFX1lSR0JfQ09OU1RfQiAgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisjZGVmaW5lIFpWMF9DQVBUVVJFX0xJTkVfQ09NUCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkwMDIwCisjZGVmaW5lIFpWMF9DQVBUVVJFX0xJTkVfQ09NUF9MQyAgICAgICAgICAgICAgICAgICAgICAgIDEwOjAKKworLyogWlYxICovCisKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTgwMDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9GSUVMRF9JTlBVVCAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9GSUVMRF9JTlBVVF9FVkVOX0ZJRUxEICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0ZJRUxEX0lOUFVUX09ERF9GSUVMRCAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfU0NBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfU0NBTl9QUk9HUkVTU0lWRSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9TQ0FOX0lOVEVSTEFDRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NVUlJFTlRfQlVGRkVSICAgICAgICAgICAgICAgICAyNToyNQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NVUlJFTlRfQlVGRkVSXzAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQ1VSUkVOVF9CVUZGRVJfMSAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9WRVJUSUNBTF9TWU5DICAgICAgICAgICAgICAgICAgMjQ6MjQKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9WRVJUSUNBTF9TWU5DX0lOQUNUSVZFICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1ZFUlRJQ0FMX1NZTkNfQUNUSVZFICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfUEFORUwgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOjIwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfUEFORUxfRElTQUJMRSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9QQU5FTF9FTkFCTEUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0FESiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOToxOQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0FESl9OT1JNQUwgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQURKX0RFTEFZICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9IQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg6MTgKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9IQV9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0hBX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfVlNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OjE3CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfVlNLX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9WU0tfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0hTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjoxNgorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0hTS19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfSFNLX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9GRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTUKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9GRF9SSVNJTkcgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0ZEX0ZBTExJTkcgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfVlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0OjE0CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfVlBfSElHSCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9WUF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0hQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMworI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0hQX0hJR0ggICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfSFBfTE9XICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MTIKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DUF9ISUdIICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NQX0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfVVZTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfVVZTX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9VVlNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0JTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0JTX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQlNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQ1NfMTYgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DU184ICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NGICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DRl9ZVVYgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0NGX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfRlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6NworI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0ZTX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfRlNfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9XRUFWRSAgICAgICAgICAgICAgICAgICAgICAgICAgNjo2CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfV0VBVkVfRElTQUJMRSAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9XRUFWRV9FTkFCTEUgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0JPQiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OjUKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9CT0JfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0JPQl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfREIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ6NAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX0RCX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfREJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzozCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQ0NfQ09OVElOVUUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DQ19DT05ESVRJT04gICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1JHQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOjIKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9SR0JfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMX1JHQl9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfNjU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE6MQorI2RlZmluZSBaVjFfQ0FQVFVSRV9DVFJMXzY1Nl9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfNjU2X0VOQUJMRSAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NUUkxfQ0FQX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQ1RSTF9DQVBfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMQorCisjZGVmaW5lIFpWMV9DQVBUVVJFX0NMSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDk4MDA0CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NMSVBfWUNMSVAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1OjE2CisjZGVmaW5lIFpWMV9DQVBUVVJFX0NMSVBfWENMSVAgICAgICAgICAgICAgICAgICAgICAgICAgIDk6MAorCisjZGVmaW5lIFpWMV9DQVBUVVJFX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDk4MDA4CisjZGVmaW5lIFpWMV9DQVBUVVJFX1NJWkVfSEVJR0hUICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjE2CisjZGVmaW5lIFpWMV9DQVBUVVJFX1NJWkVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEwOjAKKworI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYwX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAweDA5ODAwQworI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYwX0FERFJFU1NfU1RBVFVTICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYwX0FERFJFU1NfU1RBVFVTX0NVUlJFTlQgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjBfQUREUkVTU19TVEFUVVNfUEVORElORyAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMF9BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMF9BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYwX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjBfQUREUkVTU19DUyAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjBfQUREUkVTU19DU18wICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMF9BRERSRVNTX0NTXzEgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYwX0FERFJFU1NfQUREUkVTUyAgICAgICAgICAgICAgICAyNTowCisKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTgwMTAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMV9BRERSRVNTX1NUQVRVUyAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMV9BRERSRVNTX1NUQVRVU19DVVJSRU5UICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYxX0FERFJFU1NfU1RBVFVTX1BFTkRJTkcgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjFfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjFfQUREUkVTU19FWFRfTE9DQUwgICAgICAgICAgICAgIDAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMV9BRERSRVNTX0VYVF9FWFRFUk5BTCAgICAgICAgICAgMQorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYxX0FERFJFU1NfQ1MgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBaVjFfQ0FQVFVSRV9CVUYxX0FERFJFU1NfQ1NfMCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRjFfQUREUkVTU19DU18xICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgWlYxX0NBUFRVUkVfQlVGMV9BRERSRVNTX0FERFJFU1MgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRl9PRkZTRVQgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDk4MDE0CisjZGVmaW5lIFpWMV9DQVBUVVJFX0JVRl9PRkZTRVRfT0ZGU0VUICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBaVjFfQ0FQVFVSRV9GSUZPX0NUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5ODAxOAorI2RlZmluZSBaVjFfQ0FQVFVSRV9GSUZPX0NUUkxfRklGTyAgICAgICAgICAgICAgICAgICAgICAyOjAKKyNkZWZpbmUgWlYxX0NBUFRVUkVfRklGT19DVFJMX0ZJRk9fMCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBaVjFfQ0FQVFVSRV9GSUZPX0NUUkxfRklGT18xICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFpWMV9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPXzIgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgWlYxX0NBUFRVUkVfRklGT19DVFJMX0ZJRk9fMyAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBaVjFfQ0FQVFVSRV9GSUZPX0NUUkxfRklGT180ICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFpWMV9DQVBUVVJFX0ZJRk9fQ1RSTF9GSUZPXzUgICAgICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgWlYxX0NBUFRVUkVfRklGT19DVFJMX0ZJRk9fNiAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBaVjFfQ0FQVFVSRV9GSUZPX0NUUkxfRklGT183ICAgICAgICAgICAgICAgICAgICA3CisKKyNkZWZpbmUgWlYxX0NBUFRVUkVfWVJHQl9DT05TVCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwOTgwMUMKKyNkZWZpbmUgWlYxX0NBUFRVUkVfWVJHQl9DT05TVF9ZICAgICAgICAgICAgICAgICAgICAgICAgMzE6MjQKKyNkZWZpbmUgWlYxX0NBUFRVUkVfWVJHQl9DT05TVF9SICAgICAgICAgICAgICAgICAgICAgICAgMjM6MTYKKyNkZWZpbmUgWlYxX0NBUFRVUkVfWVJHQl9DT05TVF9HICAgICAgICAgICAgICAgICAgICAgICAgMTU6OAorI2RlZmluZSBaVjFfQ0FQVFVSRV9ZUkdCX0NPTlNUX0IgICAgICAgICAgICAgICAgICAgICAgICA3OjAKKworI2RlZmluZSBETUFfMV9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBEMDAxMAorI2RlZmluZSBETUFfMV9TT1VSQ0VfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBETUFfMV9TT1VSQ0VfQUREUkVTU19FWFRfTE9DQUwgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERNQV8xX1NPVVJDRV9BRERSRVNTX0VYVF9FWFRFUk5BTCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRE1BXzFfU09VUkNFX0FERFJFU1NfQ1MgICAgICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgRE1BXzFfU09VUkNFX0FERFJFU1NfQ1NfMCAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBETUFfMV9TT1VSQ0VfQUREUkVTU19DU18xICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERNQV8xX1NPVVJDRV9BRERSRVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBETUFfMV9ERVNUSU5BVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBEMDAxNAorI2RlZmluZSBETUFfMV9ERVNUSU5BVElPTl9BRERSRVNTX0VYVCAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBETUFfMV9ERVNUSU5BVElPTl9BRERSRVNTX0VYVF9MT0NBTCAgICAgICAgICAgICAwCisjZGVmaW5lIERNQV8xX0RFU1RJTkFUSU9OX0FERFJFU1NfRVhUX0VYVEVSTkFMICAgICAgICAgIDEKKyNkZWZpbmUgRE1BXzFfREVTVElOQVRJT05fQUREUkVTU19DUyAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgRE1BXzFfREVTVElOQVRJT05fQUREUkVTU19DU18wICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBETUFfMV9ERVNUSU5BVElPTl9BRERSRVNTX0NTXzEgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERNQV8xX0RFU1RJTkFUSU9OX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBETUFfMV9TSVpFX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBEMDAxOAorI2RlZmluZSBETUFfMV9TSVpFX0NPTlRST0xfU1RBVFVTICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBETUFfMV9TSVpFX0NPTlRST0xfU1RBVFVTX0lETEUgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERNQV8xX1NJWkVfQ09OVFJPTF9TVEFUVVNfQUNUSVZFICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRE1BXzFfU0laRV9DT05UUk9MX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgMjM6MAorCisjZGVmaW5lIERNQV9BQk9SVF9JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEQwMDIwCisjZGVmaW5lIERNQV9BQk9SVF9JTlRFUlJVUFRfQUJPUlRfMSAgICAgICAgICAgICAgICAgICAgIDU6NQorI2RlZmluZSBETUFfQUJPUlRfSU5URVJSVVBUX0FCT1JUXzFfRU5BQkxFICAgICAgICAgICAgICAwCisjZGVmaW5lIERNQV9BQk9SVF9JTlRFUlJVUFRfQUJPUlRfMV9BQk9SVCAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRE1BX0FCT1JUX0lOVEVSUlVQVF9BQk9SVF8wICAgICAgICAgICAgICAgICAgICAgNDo0CisjZGVmaW5lIERNQV9BQk9SVF9JTlRFUlJVUFRfQUJPUlRfMF9FTkFCTEUgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRE1BX0FCT1JUX0lOVEVSUlVQVF9BQk9SVF8wX0FCT1JUICAgICAgICAgICAgICAgMQorI2RlZmluZSBETUFfQUJPUlRfSU5URVJSVVBUX0lOVF8xICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgRE1BX0FCT1JUX0lOVEVSUlVQVF9JTlRfMV9DTEVBUiAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBETUFfQUJPUlRfSU5URVJSVVBUX0lOVF8xX0ZJTklTSEVEICAgICAgICAgICAgICAxCisjZGVmaW5lIERNQV9BQk9SVF9JTlRFUlJVUFRfSU5UXzAgICAgICAgICAgICAgICAgICAgICAgIDA6MAorI2RlZmluZSBETUFfQUJPUlRfSU5URVJSVVBUX0lOVF8wX0NMRUFSICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERNQV9BQk9SVF9JTlRFUlJVUFRfSU5UXzBfRklOSVNIRUQgICAgICAgICAgICAgIDEKKworCisKKworCisvKiBEZWZhdWx0IGkyYyBDTEsgYW5kIERhdGEgR1BJTy4gVGhlc2UgYXJlIHRoZSBkZWZhdWx0IGkyYyBwaW5zICovCisjZGVmaW5lIERFRkFVTFRfSTJDX1NDTCAgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfSTJDX1NEQSAgICAgICAgICAgICAgICAgICAgIDMxCisKKworI2RlZmluZSBHUElPX0RBVEFfU003NTBMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAxOAorI2RlZmluZSBHUElPX0RBVEFfU003NTBMRV8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgR1BJT19EQVRBX1NNNzUwTEVfMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl9TTTc1MExFICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMUMKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl9TTTc1MExFXzEgICAgICAgICAgICAgICAgICAgMToxCisjZGVmaW5lIEdQSU9fREFUQV9ESVJFQ1RJT05fU003NTBMRV8xX0lOUFVUICAgICAgICAgICAgIDAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl9TTTc1MExFXzFfT1VUUFVUICAgICAgICAgICAgMQorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OX1NNNzUwTEVfMCAgICAgICAgICAgICAgICAgICAwOjAKKyNkZWZpbmUgR1BJT19EQVRBX0RJUkVDVElPTl9TTTc1MExFXzBfSU5QVVQgICAgICAgICAgICAgMAorI2RlZmluZSBHUElPX0RBVEFfRElSRUNUSU9OX1NNNzUwTEVfMF9PVVRQVVQgICAgICAgICAgICAxCisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc2lpMTY0LmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc2lpMTY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyMjRkNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zaWkxNjQuYwpAQCAtMCwwICsxLDQyNSBAQAorI2RlZmluZSBVU0VfRFZJQ0hJUAorI2lmZGVmIFVTRV9EVklDSElQCisKKyNpbmNsdWRlICJkZGs3NTBfc2lpMTY0LmgiCisjaW5jbHVkZSAiZGRrNzUwX2h3aTJjLmgiCisKKy8qIEkyQyBBZGRyZXNzIG9mIGVhY2ggU0lJMTY0IGNoaXAgKi8KKyNkZWZpbmUgU0lJMTY0X0kyQ19BRERSRVNTICAgICAgICAgICAgICAgICAgMHg3MAorCisvKiBEZWZpbmUgdGhpcyBkZWZpbml0aW9uIHRvIHVzZSBoYXJkd2FyZSBpMmMuICovCisjZGVmaW5lIFVTRV9IV19JMkMKKworI2lmZGVmIFVTRV9IV19JMkMKKyAgICAjZGVmaW5lIGkyY1dyaXRlUmVnIGh3STJDV3JpdGVSZWcKKyAgICAjZGVmaW5lIGkyY1JlYWRSZWcgIGh3STJDUmVhZFJlZworI2Vsc2UKKyAgICAjZGVmaW5lIGkyY1dyaXRlUmVnIHN3STJDV3JpdGVSZWcKKyAgICAjZGVmaW5lIGkyY1JlYWRSZWcgIHN3STJDUmVhZFJlZworI2VuZGlmCisKKy8qIFNJSTE2NCBWZW5kb3IgYW5kIERldmljZSBJRCAqLworI2RlZmluZSBTSUkxNjRfVkVORE9SX0lEICAgICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgU0lJMTY0X0RFVklDRV9JRCAgICAgICAgICAgICAgICAgICAgMHgwMDA2CisKKyNpZmRlZiBTSUkxNjRfRlVMTF9GVU5DVElPTlMKKy8qIE5hbWUgb2YgdGhlIERWSSBDb250cm9sbGVyIGNoaXAgKi8KK3N0YXRpYyBjaGFyICpnRHZpQ3RybENoaXBOYW1lID0gIlNpbGljb24gSW1hZ2UgU2lJIDE2NCI7CisjZW5kaWYKKworLyoKKyAqICBzaWkxNjRHZXRWZW5kb3JJRAorICogICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIHZlbmRvciBJRCBvZiB0aGUgRFZJIGNvbnRyb2xsZXIgY2hpcC4KKyAqCisgKiAgT3V0cHV0OgorICogICAgICBWZW5kb3IgSUQKKyAqLwordW5zaWduZWQgc2hvcnQgc2lpMTY0R2V0VmVuZG9ySUQodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCB2ZW5kb3JJRDsKKworICAgIHZlbmRvcklEID0gKCh1bnNpZ25lZCBzaG9ydCkgaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9WRU5ET1JfSURfSElHSCkgPDwgOCkgfAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9WRU5ET1JfSURfTE9XKTsKKworICAgIHJldHVybiB2ZW5kb3JJRDsKK30KKworLyoKKyAqICBzaWkxNjRHZXREZXZpY2VJRAorICogICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgdGhlIGRldmljZSBJRCBvZiB0aGUgRFZJIGNvbnRyb2xsZXIgY2hpcC4KKyAqCisgKiAgT3V0cHV0OgorICogICAgICBEZXZpY2UgSUQKKyAqLwordW5zaWduZWQgc2hvcnQgc2lpMTY0R2V0RGV2aWNlSUQodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBkZXZpY2VJRDsKKworICAgIGRldmljZUlEID0gKCh1bnNpZ25lZCBzaG9ydCkgaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9ERVZJQ0VfSURfSElHSCkgPDwgOCkgfAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBzaG9ydCkgaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9ERVZJQ0VfSURfTE9XKTsKKworICAgIHJldHVybiBkZXZpY2VJRDsKK30KKworCisKKy8qIERWSS5DIHdpbGwgaGFuZGxlIGFsbCBTaUkxNjQgY2hpcCBzdHVmZnMgYW5kIHRyeSBpdCBiZXN0IHRvIG1ha2UgY29kZSBtaW5pbWFsIGFuZCB1c2VmdWwgKi8KKworLyoKKyAqICBzaWkxNjRJbml0Q2hpcAorICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemUgYW5kIGRldGVjdCB0aGUgRFZJIGNvbnRyb2xsZXIgY2hpcC4KKyAqCisgKiAgSW5wdXQ6CisgKiAgICAgIGVkZ2VTZWxlY3QgICAgICAgICAgLSBFZGdlIFNlbGVjdDoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9IElucHV0IGRhdGEgaXMgZmFsbGluZyBlZGdlIGxhdGNoZWQgKGZhbGxpbmcgZWRnZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0Y2hlZCBmaXJzdCBpbiBkdWFsIGVkZ2UgbW9kZSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IElucHV0IGRhdGEgaXMgcmlzaW5nIGVkZ2UgbGF0Y2hlZCAocmlzaW5nIGVkZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoZWQgZmlyc3QgaW4gZHVhbCBlZGdlIG1vZGUpCisgKiAgICAgIGJ1c1NlbGVjdCAgICAgICAgICAgLSBJbnB1dCBCdXMgU2VsZWN0OgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0gSW5wdXQgZGF0YSBidXMgaXMgMTItYml0cyB3aWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBJbnB1dCBkYXRhIGJ1cyBpcyAyNC1iaXRzIHdpZGUKKyAqICAgICAgZHVhbEVkZ2VDbGtTZWxlY3QgICAtIER1YWwgRWRnZSBDbG9jayBTZWxlY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9IElucHV0IGRhdGEgaXMgc2luZ2xlIGVkZ2UgbGF0Y2hlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gSW5wdXQgZGF0YSBpcyBkdWFsIGVkZ2UgbGF0Y2hlZAorICogICAgICBoc3luY0VuYWJsZSAgICAgICAgIC0gSG9yaXpvbnRhbCBTeW5jIEVuYWJsZToKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9IEhTWU5DIGlucHV0IGlzIHRyYW5zbWl0dGVkIGFzIGZpeGVkIExPVworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gSFNZTkMgaW5wdXQgaXMgdHJhbnNtaXR0ZWQgYXMgaXMKKyAqICAgICAgdnN5bmNFbmFibGUgICAgICAgICAtIFZlcnRpY2FsIFN5bmMgRW5hYmxlOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0gVlNZTkMgaW5wdXQgaXMgdHJhbnNtaXR0ZWQgYXMgZml4ZWQgTE9XCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBWU1lOQyBpbnB1dCBpcyB0cmFuc21pdHRlZCBhcyBpcworICogICAgICBkZXNrZXdFbmFibGUgICAgICAgIC0gRGUtc2tld2luZyBFbmFibGU6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPSBEZS1za2V3IGRpc2FibGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBEZS1za2V3IGVuYWJsZWQKKyAqICAgICAgZGVza2V3U2V0dGluZyAgICAgICAtIERlLXNrZXdpbmcgU2V0dGluZyAoaW5jcmVtZW50IG9mIDI2MHBzZWMpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPSAxIHN0ZXAgLS0+IG1pbmltdW0gc2V0dXAgLyBtYXhpbXVtIGhvbGQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA9IDIgc3RlcAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyID0gMyBzdGVwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgPSA0IHN0ZXAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCA9IDUgc3RlcAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ID0gNiBzdGVwCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgPSA3IHN0ZXAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNyA9IDggc3RlcCAtLT4gbWF4aW11bSBzZXR1cCAvIG1pbmltdW0gaG9sZAorICogICAgICBjb250aW51b3VzU3luY0VuYWJsZS0gU1lOQyBDb250aW51b3VzOgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0gRGlzYWJsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxID0gRW5hYmxlCisgKiAgICAgIHBsbEZpbHRlckVuYWJsZSAgICAgLSBQTEwgRmlsdGVyIEVuYWJsZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwID0gRGlzYWJsZSBQTEwgRmlsdGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPSBFbmFibGUgUExMIEZpbHRlcgorICogICAgICBwbGxGaWx0ZXJWYWx1ZSAgICAgIC0gUExMIEZpbHRlciBjaGFyYWN0ZXJpc3RpY3M6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB+NyAocmVjb21tZW5kZWQgdmFsdWUgaXMgNCkKKyAqCisgKiAgT3V0cHV0OgorICogICAgICAwICAgLSBTdWNjZXNzCisgKiAgICAgLTEgICAtIEZhaWwuCisgKi8KK2xvbmcgc2lpMTY0SW5pdENoaXAoCisgICAgdW5zaWduZWQgY2hhciBlZGdlU2VsZWN0LAorICAgIHVuc2lnbmVkIGNoYXIgYnVzU2VsZWN0LAorICAgIHVuc2lnbmVkIGNoYXIgZHVhbEVkZ2VDbGtTZWxlY3QsCisgICAgdW5zaWduZWQgY2hhciBoc3luY0VuYWJsZSwKKyAgICB1bnNpZ25lZCBjaGFyIHZzeW5jRW5hYmxlLAorICAgIHVuc2lnbmVkIGNoYXIgZGVza2V3RW5hYmxlLAorICAgIHVuc2lnbmVkIGNoYXIgZGVza2V3U2V0dGluZywKKyAgICB1bnNpZ25lZCBjaGFyIGNvbnRpbnVvdXNTeW5jRW5hYmxlLAorICAgIHVuc2lnbmVkIGNoYXIgcGxsRmlsdGVyRW5hYmxlLAorICAgIHVuc2lnbmVkIGNoYXIgcGxsRmlsdGVyVmFsdWUKKykKK3sKKyAgICAvL3Vuc2lnbmVkIGNoYXIgdWNSZWdJbmRleCwgdWNSZWdWYWx1ZTsKKyAgICAvL3Vuc2lnbmVkIGNoYXIgdWNEZXZpY2VBZGRyZXNzLAorCXVuc2lnbmVkIGNoYXIgY29uZmlnOworICAgIC8vdW5zaWduZWQgbG9uZyBkZWxheUNvdW50OworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgaTJjIGJ1cyAqLworI2lmZGVmIFVTRV9IV19JMkMKKyAgICAvKiBVc2UgZmFzdCBtb2RlLiAqLworICAgIGh3STJDSW5pdCgxKTsKKyNlbHNlCisgICAgc3dJMkNJbml0KERFRkFVTFRfSTJDX1NDTCwgREVGQVVMVF9JMkNfU0RBKTsKKyNlbmRpZgorCisgICAgLyogQ2hlY2sgaWYgU0lJMTY0IENoaXAgZXhpc3RzICovCisgICAgaWYgKChzaWkxNjRHZXRWZW5kb3JJRCgpID09IFNJSTE2NF9WRU5ET1JfSUQpICYmIChzaWkxNjRHZXREZXZpY2VJRCgpID09IFNJSTE2NF9ERVZJQ0VfSUQpKQorICAgIHsKKworI2lmZGVmIERES0RFQlVHCisgICAgICAgIC8vc2lpMTY0UHJpbnRSZWdpc3RlclZhbHVlcygpOworI2VuZGlmCisgICAgICAgIC8qCisgICAgICAgICAqICBJbml0aWFsaXplIFNJSTE2NCBjb250cm9sbGVyIGNoaXAuCisgICAgICAgICAqLworCisgICAgICAgIC8qIFNlbGVjdCB0aGUgZWRnZSAqLworICAgICAgICBpZiAoZWRnZVNlbGVjdCA9PSAwKQorICAgICAgICAgICAgY29uZmlnID0gU0lJMTY0X0NPTkZJR1VSQVRJT05fTEFUQ0hfRkFMTElORzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29uZmlnID0gU0lJMTY0X0NPTkZJR1VSQVRJT05fTEFUQ0hfUklTSU5HOworCisgICAgICAgIC8qIFNlbGVjdCBidXMgd2lkZSAqLworICAgICAgICBpZiAoYnVzU2VsZWN0ID09IDApCisgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0NPTkZJR1VSQVRJT05fQlVTXzEyQklUUzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29uZmlnIHw9IFNJSTE2NF9DT05GSUdVUkFUSU9OX0JVU18yNEJJVFM7CisKKyAgICAgICAgLyogU2VsZWN0IER1YWwvU2luZ2xlIEVkZ2UgQ2xvY2sgKi8KKyAgICAgICAgaWYgKGR1YWxFZGdlQ2xrU2VsZWN0ID09IDApCisgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0NPTkZJR1VSQVRJT05fQ0xPQ0tfU0lOR0xFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0NPTkZJR1VSQVRJT05fQ0xPQ0tfRFVBTDsKKworICAgICAgICAvKiBTZWxlY3QgSFN5bmMgRW5hYmxlICovCisgICAgICAgIGlmIChoc3luY0VuYWJsZSA9PSAwKQorICAgICAgICAgICAgY29uZmlnIHw9IFNJSTE2NF9DT05GSUdVUkFUSU9OX0hTWU5DX0ZPUkNFX0xPVzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29uZmlnIHw9IFNJSTE2NF9DT05GSUdVUkFUSU9OX0hTWU5DX0FTX0lTOworCisgICAgICAgIC8qIFNlbGVjdCBWU3luYyBFbmFibGUgKi8KKyAgICAgICAgaWYgKHZzeW5jRW5hYmxlID09IDApCisgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0NPTkZJR1VSQVRJT05fVlNZTkNfRk9SQ0VfTE9XOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0NPTkZJR1VSQVRJT05fVlNZTkNfQVNfSVM7CisKKyAgICAgICAgaTJjV3JpdGVSZWcoU0lJMTY0X0kyQ19BRERSRVNTLCBTSUkxNjRfQ09ORklHVVJBVElPTiwgY29uZmlnKTsKKworICAgICAgICAvKiBEZS1za2V3IGVuYWJsZWQgd2l0aCBkZWZhdWx0IDExMWIgdmFsdWUuCisgICAgICAgICAgIFRoaXMgd2lsbCBmaXggc29tZSBhcnRpZmFjdHMgcHJvYmxlbSBpbiBzb21lIG1vZGUgb24gYm9hcmQgMi4yLgorICAgICAgICAgICBTb21laG93IHRoaXMgZml4IGRvZXMgbm90IGFmZmVjdCBib2FyZCAyLjEuCisgICAgICAgICAqLworICAgICAgICBpZiAoZGVza2V3RW5hYmxlID09IDApCisgICAgICAgICAgICBjb25maWcgPSBTSUkxNjRfREVTS0VXX0RJU0FCTEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbmZpZyA9IFNJSTE2NF9ERVNLRVdfRU5BQkxFOworCisgICAgICAgIHN3aXRjaCAoZGVza2V3U2V0dGluZykKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfREVTS0VXXzFfU1RFUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0RFU0tFV18yX1NURVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgY29uZmlnIHw9IFNJSTE2NF9ERVNLRVdfM19TVEVQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfREVTS0VXXzRfU1RFUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0RFU0tFV181X1NURVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgY29uZmlnIHw9IFNJSTE2NF9ERVNLRVdfNl9TVEVQOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfREVTS0VXXzdfU1RFUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X0RFU0tFV184X1NURVA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaTJjV3JpdGVSZWcoU0lJMTY0X0kyQ19BRERSRVNTLCBTSUkxNjRfREVTS0VXLCBjb25maWcpOworCisgICAgICAgIC8qIEVuYWJsZS9EaXNhYmxlIENvbnRpbnVvdXMgU3luYy4gKi8KKyAgICAgICAgaWYgKGNvbnRpbnVvdXNTeW5jRW5hYmxlID09IDApCisgICAgICAgICAgICBjb25maWcgPSBTSUkxNjRfUExMX0ZJTFRFUl9TWU5DX0NPTlRJTlVPVVNfRElTQUJMRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29uZmlnID0gU0lJMTY0X1BMTF9GSUxURVJfU1lOQ19DT05USU5VT1VTX0VOQUJMRTsKKworICAgICAgICAvKiBFbmFibGUvRGlzYWJsZSBQTEwgRmlsdGVyICovCisgICAgICAgIGlmIChwbGxGaWx0ZXJFbmFibGUgPT0gMCkKKyAgICAgICAgICAgIGNvbmZpZyB8PSBTSUkxNjRfUExMX0ZJTFRFUl9ESVNBQkxFOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb25maWcgfD0gU0lJMTY0X1BMTF9GSUxURVJfRU5BQkxFOworCisgICAgICAgIC8qIFNldCB0aGUgUExMIEZpbHRlciB2YWx1ZSAqLworICAgICAgICBjb25maWcgfD0gKChwbGxGaWx0ZXJWYWx1ZSAmIDB4MDcpIDw8IDEpOworCisgICAgICAgIGkyY1dyaXRlUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X1BMTCwgY29uZmlnKTsKKworICAgICAgICAvKiBSZWNvdmVyIGZyb20gUG93ZXIgRG93biBhbmQgZW5hYmxlIG91dHB1dC4gKi8KKyAgICAgICAgY29uZmlnID0gaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9DT05GSUdVUkFUSU9OKTsKKyAgICAgICAgY29uZmlnIHw9IFNJSTE2NF9DT05GSUdVUkFUSU9OX1BPV0VSX05PUk1BTDsKKyAgICAgICAgaTJjV3JpdGVSZWcoU0lJMTY0X0kyQ19BRERSRVNTLCBTSUkxNjRfQ09ORklHVVJBVElPTiwgY29uZmlnKTsKKworI2lmZGVmIERES0RFQlVHCisgICAgICAgIC8vc2lpMTY0UHJpbnRSZWdpc3RlclZhbHVlcygpOworI2VuZGlmCisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogUmV0dXJuIC0xIGlmIGluaXRpYWxpemF0aW9uIGZhaWxzLiAqLworICAgIHJldHVybiAoLTEpOworfQorCisKKworCisKKy8qIGJlbG93IHNpaTE2NCBmdW5jdGlvbiBpcyBub3QgbmVjY2Vzc2FyeSAqLworCisjaWZkZWYgU0lJMTY0X0ZVTExfRlVOQ1RJT05TCisKKy8qCisgKiAgc2lpMTY0UmVzZXRDaGlwCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gcmVzZXRzIHRoZSBEVkkgQ29udHJvbGxlciBDaGlwLgorICovCit2b2lkIHNpaTE2NFJlc2V0Q2hpcCh2b2lkKQoreworICAgIC8qIFBvd2VyIGRvd24gKi8KKyAgICBzaWkxNjRTZXRQb3dlcigwKTsKKyAgICBzaWkxNjRTZXRQb3dlcigxKTsKK30KKworCisvKgorICogc2lpMTY0R2V0Q2hpcFN0cmluZworICogICAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBjaGFyIHN0cmluZyBuYW1lIG9mIHRoZSBjdXJyZW50IERWSSBDb250cm9sbGVyIGNoaXAuCisgKiAgICAgIEl0J3MgY29udmVuaWVudCBmb3IgYXBwbGljYXRpb24gbmVlZCB0byBkaXNwbGF5IHRoZSBjaGlwIG5hbWUuCisgKi8KK2NoYXIgKnNpaTE2NEdldENoaXBTdHJpbmcodm9pZCkKK3sKKyAgICByZXR1cm4gZ0R2aUN0cmxDaGlwTmFtZTsKK30KKworCisvKgorICogIHNpaTE2NFNldFBvd2VyCisgKiAgICAgIFRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcG93ZXIgY29uZmlndXJhdGlvbiBvZiB0aGUgRFZJIENvbnRyb2xsZXIgQ2hpcC4KKyAqCisgKiAgSW5wdXQ6CisgKiAgICAgIHBvd2VyVXAgLSBGbGFnIHRvIHNldCB0aGUgcG93ZXIgZG93biBvciB1cAorICovCit2b2lkIHNpaTE2NFNldFBvd2VyKAorICAgIHVuc2lnbmVkIGNoYXIgcG93ZXJVcAorKQoreworICAgIHVuc2lnbmVkIGNoYXIgY29uZmlnOworCisgICAgY29uZmlnID0gaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9DT05GSUdVUkFUSU9OKTsKKyAgICBpZiAocG93ZXJVcCA9PSAxKQorICAgIHsKKyAgICAgICAgLyogUG93ZXIgdXAgdGhlIGNoaXAgKi8KKyAgICAgICAgY29uZmlnICY9IH5TSUkxNjRfQ09ORklHVVJBVElPTl9QT1dFUl9NQVNLOworICAgICAgICBjb25maWcgfD0gU0lJMTY0X0NPTkZJR1VSQVRJT05fUE9XRVJfTk9STUFMOworICAgICAgICBpMmNXcml0ZVJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9DT05GSUdVUkFUSU9OLCBjb25maWcpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBQb3dlciBkb3duIHRoZSBjaGlwICovCisgICAgICAgIGNvbmZpZyAmPSB+U0lJMTY0X0NPTkZJR1VSQVRJT05fUE9XRVJfTUFTSzsKKyAgICAgICAgY29uZmlnIHw9IFNJSTE2NF9DT05GSUdVUkFUSU9OX1BPV0VSX0RPV047CisgICAgICAgIGkyY1dyaXRlUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0NPTkZJR1VSQVRJT04sIGNvbmZpZyk7CisgICAgfQorfQorCisKKy8qCisgKiAgc2lpMTY0U2VsZWN0SG90UGx1Z0RldGVjdGlvbk1vZGUKKyAqICAgICAgVGhpcyBmdW5jdGlvbiBzZWxlY3RzIHRoZSBtb2RlIG9mIHRoZSBob3QgcGx1ZyBkZXRlY3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIHNpaTE2NFNlbGVjdEhvdFBsdWdEZXRlY3Rpb25Nb2RlKAorICAgIHNpaTE2NF9ob3RfcGx1Z19tb2RlX3QgaG90UGx1Z01vZGUKKykKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGRldGVjdFJlZzsKKworICAgIGRldGVjdFJlZyA9IGkyY1JlYWRSZWcoU0lJMTY0X0kyQ19BRERSRVNTLCBTSUkxNjRfREVURUNUKSAmIH5TSUkxNjRfREVURUNUX01PTklUT1JfU0VOU0VfT1VUUFVUX0ZMQUc7CisgICAgc3dpdGNoIChob3RQbHVnTW9kZSkKKyAgICB7CisgICAgICAgIGNhc2UgU0lJMTY0X0hPVFBMVUdfRElTQUJMRToKKyAgICAgICAgICAgIGRldGVjdFJlZyB8PSBTSUkxNjRfREVURUNUX01PTklUT1JfU0VOU0VfT1VUUFVUX0hJR0g7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTSUkxNjRfSE9UUExVR19VU0VfTURJOgorICAgICAgICAgICAgZGV0ZWN0UmVnICY9IH5TSUkxNjRfREVURUNUX0lOVEVSUlVQVF9NQVNLOworICAgICAgICAgICAgZGV0ZWN0UmVnIHw9IFNJSTE2NF9ERVRFQ1RfSU5URVJSVVBUX0JZX0hUUExHX1BJTjsKKyAgICAgICAgICAgIGRldGVjdFJlZyB8PSBTSUkxNjRfREVURUNUX01PTklUT1JfU0VOU0VfT1VUUFVUX01ESTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJSTE2NF9IT1RQTFVHX1VTRV9SU0VOOgorICAgICAgICAgICAgZGV0ZWN0UmVnIHw9IFNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TRU5TRV9PVVRQVVRfUlNFTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNJSTE2NF9IT1RQTFVHX1VTRV9IVFBMRzoKKyAgICAgICAgICAgIGRldGVjdFJlZyB8PSBTSUkxNjRfREVURUNUX01PTklUT1JfU0VOU0VfT1VUUFVUX0hUUExHOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaTJjV3JpdGVSZWcoU0lJMTY0X0kyQ19BRERSRVNTLCBTSUkxNjRfREVURUNULCBkZXRlY3RSZWcpOworfQorCisvKgorICogIHNpaTE2NEVuYWJsZUhvdFBsdWdEZXRlY3Rpb24KKyAqICAgICAgVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZSBIb3QgUGx1ZyBkZXRlY3Rpb24uCisgKgorICogIGVuYWJsZUhvdFBsdWcgICAtIEVuYWJsZSAoPTEpIC8gZGlzYWJsZSAoPTApIEhvdCBQbHVnIGRldGVjdGlvbgorICovCit2b2lkIHNpaTE2NEVuYWJsZUhvdFBsdWdEZXRlY3Rpb24oCisgICAgdW5zaWduZWQgY2hhciBlbmFibGVIb3RQbHVnCispCit7CisgICAgdW5zaWduZWQgY2hhciBkZXRlY3RSZWc7CisgICAgZGV0ZWN0UmVnID0gaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9ERVRFQ1QpOworCisgICAgLyogRGVwZW5kaW5nIG9uIGVhY2ggRFZJIGNvbnRyb2xsZXIsIG5lZWQgdG8gZW5hYmxlIHRoZSBob3QgcGx1ZyBiYXNlZCBvbiBlYWNoCisgICAgICAgaW5kaXZpZHVhbCBjaGlwIGRlc2lnbi4gKi8KKyAgICBpZiAoZW5hYmxlSG90UGx1ZyAhPSAwKQorICAgICAgICBzaWkxNjRTZWxlY3RIb3RQbHVnRGV0ZWN0aW9uTW9kZShTSUkxNjRfSE9UUExVR19VU0VfTURJKTsKKyAgICBlbHNlCisgICAgICAgIHNpaTE2NFNlbGVjdEhvdFBsdWdEZXRlY3Rpb25Nb2RlKFNJSTE2NF9IT1RQTFVHX0RJU0FCTEUpOworfQorCisvKgorICogIHNpaTE2NElzQ29ubmVjdGVkCisgKiAgICAgIENoZWNrIGlmIHRoZSBEVkkgTW9uaXRvciBpcyBjb25uZWN0ZWQuCisgKgorICogIE91dHB1dDoKKyAqICAgICAgMCAgIC0gTm90IENvbm5lY3RlZAorICogICAgICAxICAgLSBDb25uZWN0ZWQKKyAqLwordW5zaWduZWQgY2hhciBzaWkxNjRJc0Nvbm5lY3RlZCh2b2lkKQoreworICAgIHVuc2lnbmVkIGNoYXIgaG90UGx1Z1ZhbHVlOworCisgICAgaG90UGx1Z1ZhbHVlID0gaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9ERVRFQ1QpICYgU0lJMTY0X0RFVEVDVF9IT1RfUExVR19TVEFUVVNfTUFTSzsKKyAgICBpZiAoaG90UGx1Z1ZhbHVlID09IFNJSTE2NF9ERVRFQ1RfSE9UX1BMVUdfU1RBVFVTX09OKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisvKgorICogIHNpaTE2NENoZWNrSW50ZXJydXB0CisgKiAgICAgIENoZWNrcyBpZiBpbnRlcnJ1cHQgaGFzIG9jY3VyZWQuCisgKgorICogIE91dHB1dDoKKyAqICAgICAgMCAgIC0gTm8gaW50ZXJydXB0CisgKiAgICAgIDEgICAtIEludGVycnVwdCBvY2N1cnMKKyAqLwordW5zaWduZWQgY2hhciBzaWkxNjRDaGVja0ludGVycnVwdCh2b2lkKQoreworICAgIHVuc2lnbmVkIGNoYXIgZGV0ZWN0UmVnOworCisgICAgZGV0ZWN0UmVnID0gaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9ERVRFQ1QpICYgU0lJMTY0X0RFVEVDVF9NT05JVE9SX1NUQVRFX01BU0s7CisgICAgaWYgKGRldGVjdFJlZyA9PSBTSUkxNjRfREVURUNUX01PTklUT1JfU1RBVEVfQ0hBTkdFKQorICAgICAgICByZXR1cm4gMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCisvKgorICogIHNpaTE2NENsZWFySW50ZXJydXB0CisgKiAgICAgIENsZWFyIHRoZSBob3QgcGx1ZyBpbnRlcnJ1cHQuCisgKi8KK3ZvaWQgc2lpMTY0Q2xlYXJJbnRlcnJ1cHQodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGRldGVjdFJlZzsKKworICAgIC8qIENsZWFyIHRoZSBNREkgaW50ZXJydXB0ICovCisgICAgZGV0ZWN0UmVnID0gaTJjUmVhZFJlZyhTSUkxNjRfSTJDX0FERFJFU1MsIFNJSTE2NF9ERVRFQ1QpOworICAgIGkyY1dyaXRlUmVnKFNJSTE2NF9JMkNfQUREUkVTUywgU0lJMTY0X0RFVEVDVCwgZGV0ZWN0UmVnIHwgU0lJMTY0X0RFVEVDVF9NT05JVE9SX1NUQVRFX0NMRUFSKTsKK30KKworI2VuZGlmCisKKyNlbmRpZgorCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zaWkxNjQuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zaWkxNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjRjN2QzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvZGRrNzUwX3NpaTE2NC5oCkBAIC0wLDAgKzEsMTcyIEBACisjaWZuZGVmIERESzc1MF9TSUkxNjRfSF9fCisjZGVmaW5lIERESzc1MF9TSUkxNjRfSF9fCisKKyNkZWZpbmUgVVNFX0RWSUNISVAKKworLyogSG90IFBsdWcgZGV0ZWN0aW9uIG1vZGUgc3RydWN0dXJlICovCit0eXBlZGVmIGVudW0gX3NpaTE2NF9ob3RfcGx1Z19tb2RlX3QKK3sKKyAgICBTSUkxNjRfSE9UUExVR19ESVNBQkxFID0gMCwgICAgICAgICAvKiBEaXNhYmxlIEhvdCBQbHVnIG91dHB1dCBiaXQgKGFsd2F5cyBoaWdoKS4gKi8KKyAgICBTSUkxNjRfSE9UUExVR19VU0VfTURJLCAgICAgICAgICAgICAvKiBVc2UgTW9uaXRvciBEZXRlY3QgSW50ZXJydXB0IGJpdC4gKi8KKyAgICBTSUkxNjRfSE9UUExVR19VU0VfUlNFTiwgICAgICAgICAgICAvKiBVc2UgUmVjZWl2ZXIgU2Vuc2UgZGV0ZWN0IGJpdC4gKi8KKyAgICBTSUkxNjRfSE9UUExVR19VU0VfSFRQTEcgICAgICAgICAgICAvKiBVc2UgSG90IFBsdWcgZGV0ZWN0IGJpdC4gKi8KK30gc2lpMTY0X2hvdF9wbHVnX21vZGVfdDsKKworCisvKiBTaWxpY29uIEltYWdlIFNpSTE2NCBjaGlwIHByb3RvdHlwZSAqLworbG9uZyBzaWkxNjRJbml0Q2hpcCgKKyAgICB1bnNpZ25lZCBjaGFyIGVkZ2VTZWxlY3QsCisgICAgdW5zaWduZWQgY2hhciBidXNTZWxlY3QsCisgICAgdW5zaWduZWQgY2hhciBkdWFsRWRnZUNsa1NlbGVjdCwKKyAgICB1bnNpZ25lZCBjaGFyIGhzeW5jRW5hYmxlLAorICAgIHVuc2lnbmVkIGNoYXIgdnN5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBkZXNrZXdFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBkZXNrZXdTZXR0aW5nLAorICAgIHVuc2lnbmVkIGNoYXIgY29udGludW91c1N5bmNFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBwbGxGaWx0ZXJFbmFibGUsCisgICAgdW5zaWduZWQgY2hhciBwbGxGaWx0ZXJWYWx1ZQorKTsKKwordW5zaWduZWQgc2hvcnQgc2lpMTY0R2V0VmVuZG9ySUQodm9pZCk7Cit1bnNpZ25lZCBzaG9ydCBzaWkxNjRHZXREZXZpY2VJRCh2b2lkKTsKKworCisjaWZkZWYgU0lJMTY0X0ZVTExfRlVOQ1RJT05TCit2b2lkIHNpaTE2NFJlc2V0Q2hpcCh2b2lkKTsKK2NoYXIgKnNpaTE2NEdldENoaXBTdHJpbmcodm9pZCk7Cit2b2lkIHNpaTE2NFNldFBvd2VyKHVuc2lnbmVkIGNoYXIgcG93ZXJVcCk7Cit2b2lkIHNpaTE2NEVuYWJsZUhvdFBsdWdEZXRlY3Rpb24odW5zaWduZWQgY2hhciBlbmFibGVIb3RQbHVnKTsKK3Vuc2lnbmVkIGNoYXIgc2lpMTY0SXNDb25uZWN0ZWQodm9pZCk7Cit1bnNpZ25lZCBjaGFyIHNpaTE2NENoZWNrSW50ZXJydXB0KHZvaWQpOwordm9pZCBzaWkxNjRDbGVhckludGVycnVwdCh2b2lkKTsKKyNlbmRpZgorLyogYmVsb3cgcmVnaXN0ZXIgZGVmaW5pbmF0aW9uIGlzIHVzZWQgZm9yIFNpbGljb24gSW1hZ2UgU2lJMTY0IERWSSBjb250cm9sbGVyIGNoaXAgKi8KKy8qCisgKiBWZW5kb3IgSUQgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgU0lJMTY0X1ZFTkRPUl9JRF9MT1cgICAgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFNJSTE2NF9WRU5ET1JfSURfSElHSCAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorCisvKgorICogRGV2aWNlIElEIHJlZ2lzdGVycworICovCisjZGVmaW5lIFNJSTE2NF9ERVZJQ0VfSURfTE9XICAgICAgICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBTSUkxNjRfREVWSUNFX0lEX0hJR0ggICAgICAgICAgICAgICAgICAgICAgIDB4MDMKKworLyoKKyAqIERldmljZSBSZXZpc2lvbgorICovCisjZGVmaW5lIFNJSTE2NF9ERVZJQ0VfUkVWSVNJT04gICAgICAgICAgICAgICAgICAgICAgMHgwNAorCisvKgorICogRnJlcXVlbmN5IExpbWl0YXRpb24gcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgU0lJMTY0X0ZSRVFVRU5DWV9MSU1JVF9MT1cgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIFNJSTE2NF9GUkVRVUVOQ1lfTElNSVRfSElHSCAgICAgICAgICAgICAgICAgMHgwNworCisvKgorICogUG93ZXIgRG93biBhbmQgSW5wdXQgU2lnbmFsIENvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgU0lJMTY0X0NPTkZJR1VSQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAweDA4CisKKy8qIFBvd2VyIGRvd24gKFBEKSAqLworI2RlZmluZSBTSUkxNjRfQ09ORklHVVJBVElPTl9QT1dFUl9ET1dOICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0lJMTY0X0NPTkZJR1VSQVRJT05fUE9XRVJfTk9STUFMICAgICAgICAgICAweDAxCisjZGVmaW5lIFNJSTE2NF9DT05GSUdVUkFUSU9OX1BPV0VSX01BU0sgICAgICAgICAgICAgMHgwMQorCisvKiBJbnB1dCBFZGdlIExhdGNoIFNlbGVjdCAoRURHRSkgKi8KKyNkZWZpbmUgU0lJMTY0X0NPTkZJR1VSQVRJT05fTEFUQ0hfRkFMTElORyAgICAgICAgICAweDAwCisjZGVmaW5lIFNJSTE2NF9DT05GSUdVUkFUSU9OX0xBVENIX1JJU0lORyAgICAgICAgICAgMHgwMgorCisvKiBCdXMgU2VsZWN0IChCU0VMKSAqLworI2RlZmluZSBTSUkxNjRfQ09ORklHVVJBVElPTl9CVVNfMTJCSVRTICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0lJMTY0X0NPTkZJR1VSQVRJT05fQlVTXzI0QklUUyAgICAgICAgICAgICAweDA0CisKKy8qIER1YWwgRWRnZSBDbG9jayBTZWxlY3QgKERTRUwpICovCisjZGVmaW5lIFNJSTE2NF9DT05GSUdVUkFUSU9OX0NMT0NLX1NJTkdMRSAgICAgICAgICAgMHgwMAorI2RlZmluZSBTSUkxNjRfQ09ORklHVVJBVElPTl9DTE9DS19EVUFMICAgICAgICAgICAgIDB4MDgKKworLyogSG9yaXpvbnRhbCBTeW5jIEVuYWJsZSAoSEVOKSAqLworI2RlZmluZSBTSUkxNjRfQ09ORklHVVJBVElPTl9IU1lOQ19GT1JDRV9MT1cgICAgICAgIDB4MDAKKyNkZWZpbmUgU0lJMTY0X0NPTkZJR1VSQVRJT05fSFNZTkNfQVNfSVMgICAgICAgICAgICAweDEwCisKKy8qIFZlcnRpY2FsIFN5bmMgRW5hYmxlIChWRU4pICovCisjZGVmaW5lIFNJSTE2NF9DT05GSUdVUkFUSU9OX1ZTWU5DX0ZPUkNFX0xPVyAgICAgICAgMHgwMAorI2RlZmluZSBTSUkxNjRfQ09ORklHVVJBVElPTl9WU1lOQ19BU19JUyAgICAgICAgICAgIDB4MjAKKworLyoKKyAqIERldGVjdGlvbiByZWdpc3RlcnMKKyAqLworI2RlZmluZSBTSUkxNjRfREVURUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKworLyogTW9uaXRvciBEZXRlY3QgSW50ZXJydXB0IChNREkpICovCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TVEFURV9DSEFOR0UgICAgICAgICAgMHgwMAorI2RlZmluZSBTSUkxNjRfREVURUNUX01PTklUT1JfU1RBVEVfTk9fQ0hBTkdFICAgICAgIDB4MDEKKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9NT05JVE9SX1NUQVRFX0NMRUFSICAgICAgICAgICAweDAxCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TVEFURV9NQVNLICAgICAgICAgICAgMHgwMQorCisvKiBIb3QgUGx1ZyBkZXRlY3QgSW5wdXQgKEhUUExHKSAqLworI2RlZmluZSBTSUkxNjRfREVURUNUX0hPVF9QTFVHX1NUQVRVU19PRkYgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9IT1RfUExVR19TVEFUVVNfT04gICAgICAgICAgICAweDAyCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1RfSE9UX1BMVUdfU1RBVFVTX01BU0sgICAgICAgICAgMHgwMgorCisvKiBSZWNlaXZlciBTZW5zZSAoUlNFTikgKi8KKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9SRUNFSVZFUl9TRU5TRV9OT1RfREVURUNURUQgICAweDAwCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1RfUkVDRUlWRVJfU0VOU0VfREVURUNURUQgICAgICAgMHgwNAorCisvKiBJbnRlcnJ1cHQgR2VuZXJhdGlvbiBNZXRob2QgKFRTRUwpICovCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1RfSU5URVJSVVBUX0JZX1JTRU5fUElOICAgICAgICAgMHgwMAorI2RlZmluZSBTSUkxNjRfREVURUNUX0lOVEVSUlVQVF9CWV9IVFBMR19QSU4gICAgICAgIDB4MDgKKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9JTlRFUlJVUFRfTUFTSyAgICAgICAgICAgICAgICAweDA4CisKKy8qIE1vbml0b3IgU2Vuc2UgT3V0cHV0IChNU0VOKSAqLworI2RlZmluZSBTSUkxNjRfREVURUNUX01PTklUT1JfU0VOU0VfT1VUUFVUX0hJR0ggICAgIDB4MDAKKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9NT05JVE9SX1NFTlNFX09VVFBVVF9NREkgICAgICAweDEwCisjZGVmaW5lIFNJSTE2NF9ERVRFQ1RfTU9OSVRPUl9TRU5TRV9PVVRQVVRfUlNFTiAgICAgMHgyMAorI2RlZmluZSBTSUkxNjRfREVURUNUX01PTklUT1JfU0VOU0VfT1VUUFVUX0hUUExHICAgIDB4MzAKKyNkZWZpbmUgU0lJMTY0X0RFVEVDVF9NT05JVE9SX1NFTlNFX09VVFBVVF9GTEFHICAgICAweDMwCisKKy8qCisgKiBTa2V3aW5nIHJlZ2lzdGVycworICovCisjZGVmaW5lIFNJSTE2NF9ERVNLRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwQQorCisvKiBHZW5lcmFsIFB1cnBvc2UgSW5wdXQgKENUTFszOjFdKSAqLworI2RlZmluZSBTSUkxNjRfREVTS0VXX0dFTkVSQUxfUFVSUE9TRV9JTlBVVF9NQVNLICAgIDB4MEUKKworLyogRGUtc2tld2luZyBFbmFibGUgYml0IChES0VOKSAqLworI2RlZmluZSBTSUkxNjRfREVTS0VXX0RJU0FCTEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0lJMTY0X0RFU0tFV19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisKKy8qIERlLXNrZXdpbmcgU2V0dGluZyAoREtbMzoxXSkqLworI2RlZmluZSBTSUkxNjRfREVTS0VXXzFfU1RFUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0lJMTY0X0RFU0tFV18yX1NURVAgICAgICAgICAgICAgICAgICAgICAgICAweDIwCisjZGVmaW5lIFNJSTE2NF9ERVNLRVdfM19TVEVQICAgICAgICAgICAgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBTSUkxNjRfREVTS0VXXzRfU1RFUCAgICAgICAgICAgICAgICAgICAgICAgIDB4NjAKKyNkZWZpbmUgU0lJMTY0X0RFU0tFV181X1NURVAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lIFNJSTE2NF9ERVNLRVdfNl9TVEVQICAgICAgICAgICAgICAgICAgICAgICAgMHhBMAorI2RlZmluZSBTSUkxNjRfREVTS0VXXzdfU1RFUCAgICAgICAgICAgICAgICAgICAgICAgIDB4QzAKKyNkZWZpbmUgU0lJMTY0X0RFU0tFV184X1NURVAgICAgICAgICAgICAgICAgICAgICAgICAweEUwCisKKy8qCisgKiBVc2VyIENvbmZpZ3VyYXRpb24gRGF0YSByZWdpc3RlcnMgKENGRyA3OjApCisgKi8KKyNkZWZpbmUgU0lJMTY0X1VTRVJfQ09ORklHVVJBVElPTiAgICAgICAgICAgICAgICAgICAweDBCCisKKy8qCisgKiBQTEwgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgU0lJMTY0X1BMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBDCisKKy8qIFBMTCBGaWx0ZXIgVmFsdWUgKFBMTEYpICovCisjZGVmaW5lIFNJSTE2NF9QTExfRklMVEVSX1ZBTFVFX01BU0sgICAgICAgICAgICAgICAgMHgwRQorCisvKiBQTEwgRmlsdGVyIEVuYWJsZSAoUEZFTikgKi8KKyNkZWZpbmUgU0lJMTY0X1BMTF9GSUxURVJfRElTQUJMRSAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIFNJSTE2NF9QTExfRklMVEVSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgMHgwMQorCisvKiBTeW5jIENvbnRpbnVvdXMgKFNDTlQpICovCisjZGVmaW5lIFNJSTE2NF9QTExfRklMVEVSX1NZTkNfQ09OVElOVU9VU19ESVNBQkxFICAgMHgwMAorI2RlZmluZSBTSUkxNjRfUExMX0ZJTFRFUl9TWU5DX0NPTlRJTlVPVVNfRU5BQkxFICAgIDB4ODAKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc3dpMmMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zd2kyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMWIzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc3dpMmMuYwpAQCAtMCwwICsxLDUyMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDcgYnkgU2lsaWNvbiBNb3Rpb24sIEluYy4gKFNNSSkKKyoKKyogIEFsbCByaWdodHMgYXJlIHJlc2VydmVkLiBSZXByb2R1Y3Rpb24gb3IgaW4gcGFydCBpcyBwcm9oaWJpdGVkCisqICB3aXRob3V0IHRoZSB3cml0dGVuIGNvbnNlbnQgb2YgdGhlIGNvcHlyaWdodCBvd25lci4KKyoKKyogIHN3aTJjLmMgLS0tIFNNNzUwL1NNNzE4IERESworKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzb3VyY2UgY29kZSBmb3IgSTJDIHVzaW5nIHNvZnR3YXJlCisqICBpbXBsZW1lbnRhdGlvbi4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiZGRrNzUwX2hlbHAuaCIKKyNpbmNsdWRlICJkZGs3NTBfcmVnLmgiCisjaW5jbHVkZSAiZGRrNzUwX3N3aTJjLmgiCisjaW5jbHVkZSAiZGRrNzUwX3Bvd2VyLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEkyQyBTb2Z0d2FyZSBNYXN0ZXIgRHJpdmVyOgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBFYWNoIGkyYyBjeWNsZSBpcyBzcGxpdCBpbnRvIDQgc2VjdGlvbnMuIEVhY2ggb2YgdGhlc2Ugc2VjdGlvbiBtYXJrcworICogYSBwb2ludCBpbiB0aW1lIHdoZXJlIHRoZSBTQ0wgb3IgU0RBIG1heSBiZSBjaGFuZ2VkLgorICoKKyAqIDEgQ3ljbGUgPT0gfCAgU2VjdGlvbiBJLiB8ICBTZWN0aW9uIDIuIHwgIFNlY3Rpb24gMy4gfCAgU2VjdGlvbiA0LiB8CisgKiAgICAgICAgICAgICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKworICogICAgICAgICAgICB8IFNDTCBzZXQgTE9XIHxTQ0wgbm8gY2hhbmdlfCBTQ0wgc2V0IEhJR0h8U0NMIG5vIGNoYW5nZXwKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fXyBfX19fX19fX19fX19fCisgKiBTQ0wgPT0gWFhYWCBfX19fX19fX19fX19fIF9fX19fX19fX19fXyAvCisgKgorICogSS5lLiB0aGUgU0NMIG1heSBvbmx5IGJlIGNoYW5nZWQgaW4gc2VjdGlvbiAxLiBhbmQgc2VjdGlvbiAzLiB3aGlsZQorICogdGhlIFNEQSBtYXkgb25seSBiZSBjaGFuZ2VkIGluIHNlY3Rpb24gMi4gYW5kIHNlY3Rpb24gNC4gVGhlIHRhYmxlCisgKiBiZWxvdyBnaXZlcyB0aGUgY2hhbmdlcyBmb3IgdGhlc2UgMiBsaW5lcyBpbiB0aGUgdmFyaW9zIHNlY3Rpb25zLgorICoKKyAqIFNlY3Rpb24gY2hhbmdlcyBUYWJsZToKKyAqID09PT09PT09PT09PT09PT09PT09PT0KKyAqIGJsYW5rID0gbm8gY2hhbmdlLCBMID0gc2V0IGJpdCBMT1csIEggPSBzZXQgYml0IEhJR0gKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxLnwgMi58IDMufCA0LnwKKyAqICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKworICogICAgICAgICAgICAgICAgIFR4IFN0YXJ0ICAgU0RBIHwgICB8IEggfCAgIHwgTCB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0wgfCBMIHwgICB8IEggfCAgIHwKKyAqICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKworICogICAgICAgICAgICAgICAgIFR4IFN0b3AgICAgU0RBIHwgICB8IEwgfCAgIHwgSCB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0wgfCBMIHwgICB8IEggfCAgIHwKKyAqICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKworICogICAgICAgICAgICAgICAgIFR4IGJpdCBIICAgU0RBIHwgICB8IEggfCAgIHwgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0wgfCBMIHwgICB8IEggfCAgIHwKKyAqICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKworICogICAgICAgICAgICAgICAgIFR4IGJpdCBMICAgU0RBIHwgICB8IEwgfCAgIHwgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQ0wgfCBMIHwgICB8IEggfCAgIHwKKyAqICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdQSU8gcGlucyB1c2VkIGZvciB0aGlzIEkyQy4gSXQgcmFuZ2VzIGZyb20gMCB0byA2My4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGdfaTJjQ2xvY2tHUElPID0gREVGQVVMVF9JMkNfU0NMOworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ19pMmNEYXRhR1BJTyA9IERFRkFVTFRfSTJDX1NEQTsKKworLyoKKyAqICBCZWxvdyBpcyB0aGUgdmFyaWFibGUgZGVjbGFyYXRpb24gZm9yIHRoZSBHUElPIHBpbiByZWdpc3RlciB1c2FnZQorICogIGZvciB0aGUgaTJjIENsb2NrIGFuZCBpMmMgRGF0YS4KKyAqCisgKiAgTm90ZToKKyAqICAgICAgTm90aWNlIHRoYXQgdGhlIEdQSU8gdXNhZ2UgZm9yIHRoZSBpMmMgY2xvY2sgYW5kIGkyYyBEYXRhIGFyZQorICogICAgICBzZXBhcmF0ZWQuIFRoaXMgaXMgdG8gbWFrZSB0aGlzIGNvZGUgZmxleGlibGUgZW5vdWdoIHdoZW4KKyAqICAgICAgdHdvIHNlcGFyYXRlIEdQSU8gcGlucyBmb3IgdGhlIGNsb2NrIGFuZCBkYXRhIGFyZSBsb2NhdGVkCisgKiAgICAgIGluIHR3byBkaWZmZXJlbnQgR1BJTyByZWdpc3RlciBzZXQgKHdvcnN0IGNhc2UpLgorICovCisKKy8qIGkyYyBDbG9jayBHUElPIFJlZ2lzdGVyIHVzYWdlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnX2kyY0Nsa0dQSU9NdXhSZWcgPSBHUElPX01VWDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdfaTJjQ2xrR1BJT0RhdGFSZWcgPSBHUElPX0RBVEE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBnX2kyY0Nsa0dQSU9EYXRhRGlyUmVnID0gR1BJT19EQVRBX0RJUkVDVElPTjsKKworLyogaTJjIERhdGEgR1BJTyBSZWdpc3RlciB1c2FnZSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ19pMmNEYXRhR1BJT011eFJlZyA9IEdQSU9fTVVYOworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ19pMmNEYXRhR1BJT0RhdGFSZWcgPSBHUElPX0RBVEE7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBnX2kyY0RhdGFHUElPRGF0YURpclJlZyA9IEdQSU9fREFUQV9ESVJFQ1RJT047CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiBwdXRzIGEgZGVsYXkgYmV0d2VlbiBjb21tYW5kCisgKi8KK3N0YXRpYyB2b2lkIHN3STJDV2FpdCh2b2lkKQoreworCS8qIGZpbmQgYSBidWc6CisJICogcGVla0lPIG1ldGhvZCB3b3JrcyB3ZWxsIGJlZm9yZSBzdXNwZW5kL3Jlc3VtZQorCSAqIGJ1dCBhZnRlciBzdXNwZW5kLCBwZWVrSU8oMHgzY2UsMHg2MSkgJiAweDEwCisJICogYWx3YXlzIGJlIG5vbi16ZXJvLHdoaWNoIG1ha2VzIHRoZSB3aGlsZSBsb29wCisJICogbmV2ZXIgZmluaXNoLgorCSAqIHVzZSBub24tdWx0aW1hdGUgZm9yIGxvb3AgYmVsb3cgaXMgc2FmZQorCSAqICovCisjaWYgMAorICAgIC8qIENoYW5nZSB3YWl0IGFsZ29yaXRobSB0byB1c2UgUENJIGJ1cyBjbG9jaywKKyAgICAgICBpdCdzIG1vcmUgcmVsaWFibGUgdGhhbiBjb3VudGVyIGxvb3AgLi4KKyAgICAgICB3cml0ZSAweDYxIHRvIDB4M2NlIGFuZCByZWFkIGZyb20gMHgzY2YKKyAgICAgICAqLworCXdoaWxlKHBlZWtJTygweDNjZSwweDYxKSAmIDB4MTApOworI2Vsc2UKKyAgICBpbnQgaSwgVGVtcDsKKworICAgIGZvcihpPTA7IGk8NjAwOyBpKyspCisgICAgeworICAgICAgICBUZW1wID0gaTsKKyAgICAgICAgVGVtcCArPSBpOworICAgIH0KKyNlbmRpZgorfQorCisvKgorICogIFRoaXMgZnVuY3Rpb24gc2V0L3Jlc2V0IHRoZSBTQ0wgR1BJTyBwaW4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgdmFsdWUgICAgLSBCaXQgdmFsdWUgdG8gc2V0IHRvIHRoZSBTQ0wgb3IgU0RBICgwID0gbG93LCAxID0gaGlnaCkKKyAqCisgKiAgTm90ZXM6CisgKiAgICAgIFdoZW4gc2V0dGluZyBTQ0wgdG8gaGlnaCwganVzdCBzZXQgdGhlIEdQSU8gYXMgaW5wdXQgd2hlcmUgdGhlIHB1bGwgdXAKKyAqICAgICAgcmVzaXN0b3Igd2lsbCBwdWxsIHRoZSBzaWduYWwgdXAuIERvIG5vdCB1c2Ugc29mdHdhcmUgdG8gcHVsbCB1cCB0aGUKKyAqICAgICAgc2lnbmFsIGJlY2F1c2UgdGhlIGkyYyB3aWxsIGZhaWwgd2hlbiBvdGhlciBkZXZpY2UgdHJ5IHRvIGRyaXZlIHRoZQorICogICAgICBzaWduYWwgZHVlIHRvIFNNNTB4IHdpbGwgZHJpdmUgdGhlIHNpZ25hbCB0byBhbHdheXMgaGlnaC4KKyAqLwordm9pZCBzd0kyQ1NDTCh1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworICAgIHVuc2lnbmVkIGxvbmcgdWxHUElPRGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIHVsR1BJT0RpcmVjdGlvbjsKKworICAgIHVsR1BJT0RpcmVjdGlvbiA9IFBFRUszMihnX2kyY0Nsa0dQSU9EYXRhRGlyUmVnKTsKKyAgICBpZiAodmFsdWUpICAgICAgLyogSGlnaCAqLworICAgIHsKKyAgICAgICAgLyogU2V0IGRpcmVjdGlvbiBhcyBpbnB1dC4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgcHVsbCB0aGUgc2lnbmFsIHVwLiAqLworICAgICAgICB1bEdQSU9EaXJlY3Rpb24gJj0gfigxIDw8IGdfaTJjQ2xvY2tHUElPKTsKKyAgICAgICAgUE9LRTMyKGdfaTJjQ2xrR1BJT0RhdGFEaXJSZWcsIHVsR1BJT0RpcmVjdGlvbik7CisgICAgfQorICAgIGVsc2UgICAgICAgICAgICAvKiBMb3cgKi8KKyAgICB7CisgICAgICAgIC8qIFNldCB0aGUgc2lnbmFsIGRvd24gKi8KKyAgICAgICAgdWxHUElPRGF0YSA9IFBFRUszMihnX2kyY0Nsa0dQSU9EYXRhUmVnKTsKKyAgICAgICAgdWxHUElPRGF0YSAmPSB+KDEgPDwgZ19pMmNDbG9ja0dQSU8pOworICAgICAgICBQT0tFMzIoZ19pMmNDbGtHUElPRGF0YVJlZywgdWxHUElPRGF0YSk7CisKKyAgICAgICAgLyogU2V0IGRpcmVjdGlvbiBhcyBvdXRwdXQgKi8KKyAgICAgICAgdWxHUElPRGlyZWN0aW9uIHw9ICgxIDw8IGdfaTJjQ2xvY2tHUElPKTsKKyAgICAgICAgUE9LRTMyKGdfaTJjQ2xrR1BJT0RhdGFEaXJSZWcsIHVsR1BJT0RpcmVjdGlvbik7CisgICAgfQorfQorCisvKgorICogIFRoaXMgZnVuY3Rpb24gc2V0L3Jlc2V0IHRoZSBTREEgR1BJTyBwaW4KKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgdmFsdWUgICAgLSBCaXQgdmFsdWUgdG8gc2V0IHRvIHRoZSBTQ0wgb3IgU0RBICgwID0gbG93LCAxID0gaGlnaCkKKyAqCisgKiAgTm90ZXM6CisgKiAgICAgIFdoZW4gc2V0dGluZyBTQ0wgdG8gaGlnaCwganVzdCBzZXQgdGhlIEdQSU8gYXMgaW5wdXQgd2hlcmUgdGhlIHB1bGwgdXAKKyAqICAgICAgcmVzaXN0b3Igd2lsbCBwdWxsIHRoZSBzaWduYWwgdXAuIERvIG5vdCB1c2Ugc29mdHdhcmUgdG8gcHVsbCB1cCB0aGUKKyAqICAgICAgc2lnbmFsIGJlY2F1c2UgdGhlIGkyYyB3aWxsIGZhaWwgd2hlbiBvdGhlciBkZXZpY2UgdHJ5IHRvIGRyaXZlIHRoZQorICogICAgICBzaWduYWwgZHVlIHRvIFNNNTB4IHdpbGwgZHJpdmUgdGhlIHNpZ25hbCB0byBhbHdheXMgaGlnaC4KKyAqLwordm9pZCBzd0kyQ1NEQSh1bnNpZ25lZCBjaGFyIHZhbHVlKQoreworICAgIHVuc2lnbmVkIGxvbmcgdWxHUElPRGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIHVsR1BJT0RpcmVjdGlvbjsKKworICAgIHVsR1BJT0RpcmVjdGlvbiA9IFBFRUszMihnX2kyY0RhdGFHUElPRGF0YURpclJlZyk7CisgICAgaWYgKHZhbHVlKSAgICAgIC8qIEhpZ2ggKi8KKyAgICB7CisgICAgICAgIC8qIFNldCBkaXJlY3Rpb24gYXMgaW5wdXQuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IHB1bGwgdGhlIHNpZ25hbCB1cC4gKi8KKyAgICAgICAgdWxHUElPRGlyZWN0aW9uICY9IH4oMSA8PCBnX2kyY0RhdGFHUElPKTsKKyAgICAgICAgUE9LRTMyKGdfaTJjRGF0YUdQSU9EYXRhRGlyUmVnLCB1bEdQSU9EaXJlY3Rpb24pOworICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgLyogTG93ICovCisgICAgeworICAgICAgICAvKiBTZXQgdGhlIHNpZ25hbCBkb3duICovCisgICAgICAgIHVsR1BJT0RhdGEgPSBQRUVLMzIoZ19pMmNEYXRhR1BJT0RhdGFSZWcpOworICAgICAgICB1bEdQSU9EYXRhICY9IH4oMSA8PCBnX2kyY0RhdGFHUElPKTsKKyAgICAgICAgUE9LRTMyKGdfaTJjRGF0YUdQSU9EYXRhUmVnLCB1bEdQSU9EYXRhKTsKKworICAgICAgICAvKiBTZXQgZGlyZWN0aW9uIGFzIG91dHB1dCAqLworICAgICAgICB1bEdQSU9EaXJlY3Rpb24gfD0gKDEgPDwgZ19pMmNEYXRhR1BJTyk7CisgICAgICAgIFBPS0UzMihnX2kyY0RhdGFHUElPRGF0YURpclJlZywgdWxHUElPRGlyZWN0aW9uKTsKKyAgICB9Cit9CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiByZWFkIHRoZSBkYXRhIGZyb20gdGhlIFNEQSBHUElPIHBpbgorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIFRoZSBTREEgZGF0YSBiaXQgc2VudCBieSB0aGUgU2xhdmUKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgc3dJMkNSZWFkU0RBKHZvaWQpCit7CisgICAgdW5zaWduZWQgbG9uZyB1bEdQSU9EaXJlY3Rpb247CisgICAgdW5zaWduZWQgbG9uZyB1bEdQSU9EYXRhOworCisgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIGRpcmVjdGlvbiBpcyBpbnB1dCAoSGlnaCkgKi8KKyAgICB1bEdQSU9EaXJlY3Rpb24gPSBQRUVLMzIoZ19pMmNEYXRhR1BJT0RhdGFEaXJSZWcpOworICAgIGlmICgodWxHUElPRGlyZWN0aW9uICYgKDEgPDwgZ19pMmNEYXRhR1BJTykpICE9ICh+KDEgPDwgZ19pMmNEYXRhR1BJTykpKQorICAgIHsKKyAgICAgICAgdWxHUElPRGlyZWN0aW9uICY9IH4oMSA8PCBnX2kyY0RhdGFHUElPKTsKKyAgICAgICAgUE9LRTMyKGdfaTJjRGF0YUdQSU9EYXRhRGlyUmVnLCB1bEdQSU9EaXJlY3Rpb24pOworICAgIH0KKworICAgIC8qIE5vdyByZWFkIHRoZSBTREEgbGluZSAqLworICAgIHVsR1BJT0RhdGEgPSBQRUVLMzIoZ19pMmNEYXRhR1BJT0RhdGFSZWcpOworICAgIGlmICh1bEdQSU9EYXRhICYgKDEgPDwgZ19pMmNEYXRhR1BJTykpCisgICAgICAgIHJldHVybiAxOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiBzZW5kcyBBQ0sgc2lnbmFsCisgKi8KK3N0YXRpYyB2b2lkIHN3STJDQWNrKHZvaWQpCit7CisgICAgcmV0dXJuOyAgLyogU2luZ2xlIGJ5dGUgcmVhZCBpcyBvayB3aXRob3V0IGl0LiAqLworfQorCisvKgorICogIFRoaXMgZnVuY3Rpb24gc2VuZHMgdGhlIHN0YXJ0IGNvbW1hbmQgdG8gdGhlIHNsYXZlIGRldmljZQorICovCitzdGF0aWMgdm9pZCBzd0kyQ1N0YXJ0KHZvaWQpCit7CisgICAgLyogU3RhcnQgSTJDICovCisgICAgc3dJMkNTREEoMSk7CisgICAgc3dJMkNTQ0woMSk7CisgICAgc3dJMkNTREEoMCk7Cit9CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiBzZW5kcyB0aGUgc3RvcCBjb21tYW5kIHRvIHRoZSBzbGF2ZSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgc3dJMkNTdG9wKHZvaWQpCit7CisgICAgLyogU3RvcCB0aGUgSTJDICovCisgICAgc3dJMkNTQ0woMSk7CisgICAgc3dJMkNTREEoMCk7CisgICAgc3dJMkNTREEoMSk7Cit9CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgb25lIGJ5dGUgdG8gdGhlIHNsYXZlIGRldmljZQorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkYXRhICAgIC0gRGF0YSB0byBiZSB3cml0ZSB0byB0aGUgc2xhdmUgZGV2aWNlCisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgIDAgICAtIFN1Y2Nlc3MKKyAqICAgICAgLTEgICAtIEZhaWwgdG8gd3JpdGUgYnl0ZQorICovCitzdGF0aWMgbG9uZyBzd0kyQ1dyaXRlQnl0ZSh1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisgICAgdW5zaWduZWQgY2hhciB2YWx1ZSA9IGRhdGE7CisgICAgaW50IGk7CisKKyAgICAvKiBTZW5kaW5nIHRoZSBkYXRhIGJpdCBieSBiaXQgKi8KKyAgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgeworICAgICAgICAvKiBTZXQgU0NMIHRvIGxvdyAqLworICAgICAgICBzd0kyQ1NDTCgwKTsKKworICAgICAgICAvKiBTZW5kIGRhdGEgYml0ICovCisgICAgICAgIGlmICgodmFsdWUgJiAweDgwKSAhPSAwKQorICAgICAgICAgICAgc3dJMkNTREEoMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN3STJDU0RBKDApOworCisgICAgICAgIHN3STJDV2FpdCgpOworCisgICAgICAgIC8qIFRvZ2dsZSBjbGsgbGluZSB0byBvbmUgKi8KKyAgICAgICAgc3dJMkNTQ0woMSk7CisgICAgICAgIHN3STJDV2FpdCgpOworCisgICAgICAgIC8qIFNoaWZ0IGJ5dGUgdG8gYmUgc2VudCAqLworICAgICAgICB2YWx1ZSA9IHZhbHVlIDw8IDE7CisgICAgfQorCisgICAgLyogU2V0IHRoZSBTQ0wgTG93IGFuZCBTREEgSGlnaCAocHJlcGFyZSB0byBnZXQgaW5wdXQpICovCisgICAgc3dJMkNTQ0woMCk7CisgICAgc3dJMkNTREEoMSk7CisKKyAgICAvKiBTZXQgdGhlIFNDTCBIaWdoIGZvciBhY2sgKi8KKyAgICBzd0kyQ1dhaXQoKTsKKyAgICBzd0kyQ1NDTCgxKTsKKyAgICBzd0kyQ1dhaXQoKTsKKworICAgIC8qIFJlYWQgU0RBLCB1bnRpbCBTREE9PTAgKi8KKyAgICBmb3IoaT0wOyBpPDB4ZmY7IGkrKykKKyAgICB7CisgICAgICAgIGlmICghc3dJMkNSZWFkU0RBKCkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBzd0kyQ1NDTCgwKTsKKyAgICAgICAgc3dJMkNXYWl0KCk7CisgICAgICAgIHN3STJDU0NMKDEpOworICAgICAgICBzd0kyQ1dhaXQoKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIFNDTCBMb3cgYW5kIFNEQSBIaWdoICovCisgICAgc3dJMkNTQ0woMCk7CisgICAgc3dJMkNTREEoMSk7CisKKyAgICBpZiAoaTwweGZmKQorICAgICAgICByZXR1cm4gMDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHJlYWRzIG9uZSBieXRlIGZyb20gdGhlIHNsYXZlIGRldmljZQorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBhY2sgICAgLSBGbGFnIHRvIGluZGljYXRlIGVpdGhlciB0byBzZW5kIHRoZSBhY2tub3dsZWRnZQorICogICAgICAgICAgICBtZXNzYWdlIHRvIHRoZSBzbGF2ZSBkZXZpY2Ugb3Igbm90CisgKgorICogIFJldHVybiBWYWx1ZToKKyAqICAgICAgT25lIGJ5dGUgZGF0YSByZWFkIGZyb20gdGhlIFNsYXZlIGRldmljZQorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBzd0kyQ1JlYWRCeXRlKHVuc2lnbmVkIGNoYXIgYWNrKQoreworICAgIGludCBpOworICAgIHVuc2lnbmVkIGNoYXIgZGF0YSA9IDA7CisKKyAgICBmb3IoaT03OyBpPj0wOyBpLS0pCisgICAgeworICAgICAgICAvKiBTZXQgdGhlIFNDTCB0byBMb3cgYW5kIFNEQSB0byBIaWdoIChJbnB1dCkgKi8KKyAgICAgICAgc3dJMkNTQ0woMCk7CisgICAgICAgIHN3STJDU0RBKDEpOworICAgICAgICBzd0kyQ1dhaXQoKTsKKworICAgICAgICAvKiBTZXQgdGhlIFNDTCBIaWdoICovCisgICAgICAgIHN3STJDU0NMKDEpOworICAgICAgICBzd0kyQ1dhaXQoKTsKKworICAgICAgICAvKiBSZWFkIGRhdGEgYml0cyBmcm9tIFNEQSAqLworICAgICAgICBkYXRhIHw9IChzd0kyQ1JlYWRTREEoKSA8PCBpKTsKKyAgICB9CisKKyAgICBpZiAoYWNrKQorICAgICAgICBzd0kyQ0FjaygpOworCisgICAgLyogU2V0IHRoZSBTQ0wgTG93IGFuZCBTREEgSGlnaCAqLworICAgIHN3STJDU0NMKDApOworICAgIHN3STJDU0RBKDEpOworCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIEdQSU8gcG9ydCBmb3IgU1cgSTJDIGNvbW11bmljYXRpb24uCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgICAgaTJjQ2xrR1BJTyAgICAgIC0gVGhlIEdQSU8gcGluIHRvIGJlIHVzZWQgYXMgaTJjIFNDTAorICogICAgICBpMmNEYXRhR1BJTyAgICAgLSBUaGUgR1BJTyBwaW4gdG8gYmUgdXNlZCBhcyBpMmMgU0RBCisgKgorICogUmV0dXJuIFZhbHVlOgorICogICAgICAtMSAgIC0gRmFpbCB0byBpbml0aWFsaXplIHRoZSBpMmMKKyAqICAgICAgIDAgICAtIFN1Y2Nlc3MKKyAqLworc3RhdGljIGxvbmcgc3dJMkNJbml0X1NNNzUwTEUodW5zaWduZWQgY2hhciBpMmNDbGtHUElPLAorCQkJICAgICAgdW5zaWduZWQgY2hhciBpMmNEYXRhR1BJTykKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIEdQSU8gcGluIGZvciB0aGUgaTJjIENsb2NrIFJlZ2lzdGVyICovCisgICAgZ19pMmNDbGtHUElPRGF0YVJlZyA9IEdQSU9fREFUQV9TTTc1MExFOworICAgIGdfaTJjQ2xrR1BJT0RhdGFEaXJSZWcgPSBHUElPX0RBVEFfRElSRUNUSU9OX1NNNzUwTEU7CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBDbG9jayBHUElPIE9mZnNldCAqLworICAgIGdfaTJjQ2xvY2tHUElPID0gaTJjQ2xrR1BJTzsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIEdQSU8gcGluIGZvciB0aGUgaTJjIERhdGEgUmVnaXN0ZXIgKi8KKyAgICBnX2kyY0RhdGFHUElPRGF0YVJlZyA9IEdQSU9fREFUQV9TTTc1MExFOworICAgIGdfaTJjRGF0YUdQSU9EYXRhRGlyUmVnID0gR1BJT19EQVRBX0RJUkVDVElPTl9TTTc1MExFOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgRGF0YSBHUElPIE9mZnNldCAqLworICAgIGdfaTJjRGF0YUdQSU8gPSBpMmNEYXRhR1BJTzsKKworICAgIC8qIE5vdGUgdGhhdCBTTTc1MExFIGRvbid0IGhhdmUgR1BJTyBNVVggYW5kIHBvd2VyIGlzIGFsd2F5cyBvbiAqLworCisgICAgLyogQ2xlYXIgdGhlIGkyYyBsaW5lcy4gKi8KKyAgICBmb3IoaT0wOyBpPDk7IGkrKykKKyAgICAgICAgc3dJMkNTdG9wKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGkyYyBhdHRyaWJ1dGVzIGFuZCBidXMKKyAqCisgKiBQYXJhbWV0ZXJzOgorICogICAgICBpMmNDbGtHUElPICAgICAgLSBUaGUgR1BJTyBwaW4gdG8gYmUgdXNlZCBhcyBpMmMgU0NMCisgKiAgICAgIGkyY0RhdGFHUElPICAgICAtIFRoZSBHUElPIHBpbiB0byBiZSB1c2VkIGFzIGkyYyBTREEKKyAqCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgIC0xICAgLSBGYWlsIHRvIGluaXRpYWxpemUgdGhlIGkyYworICogICAgICAgMCAgIC0gU3VjY2VzcworICovCitsb25nIHN3STJDSW5pdCgKKyAgICB1bnNpZ25lZCBjaGFyIGkyY0Nsa0dQSU8sCisgICAgdW5zaWduZWQgY2hhciBpMmNEYXRhR1BJTworKQoreworICAgIGludCBpOworCisgICAgLyogUmV0dXJuIDAgaWYgdGhlIEdQSU8gcGlucyB0byBiZSB1c2VkIGlzIG91dCBvZiByYW5nZS4gVGhlIHJhbmdlIGlzIG9ubHkgZnJvbSBbMC4uNjNdICovCisgICAgaWYgKChpMmNDbGtHUElPID4gMzEpIHx8IChpMmNEYXRhR1BJTyA+IDMxKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGdldENoaXBUeXBlKCkgPT0gU003NTBMRSkKKyAgICAgICAgcmV0dXJuIHN3STJDSW5pdF9TTTc1MExFKGkyY0Nsa0dQSU8sIGkyY0RhdGFHUElPKTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIEdQSU8gcGluIGZvciB0aGUgaTJjIENsb2NrIFJlZ2lzdGVyICovCisgICAgZ19pMmNDbGtHUElPTXV4UmVnID0gR1BJT19NVVg7CisgICAgZ19pMmNDbGtHUElPRGF0YVJlZyA9IEdQSU9fREFUQTsKKyAgICBnX2kyY0Nsa0dQSU9EYXRhRGlyUmVnID0gR1BJT19EQVRBX0RJUkVDVElPTjsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIENsb2NrIEdQSU8gT2Zmc2V0ICovCisgICAgZ19pMmNDbG9ja0dQSU8gPSBpMmNDbGtHUElPOworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgR1BJTyBwaW4gZm9yIHRoZSBpMmMgRGF0YSBSZWdpc3RlciAqLworICAgIGdfaTJjRGF0YUdQSU9NdXhSZWcgPSBHUElPX01VWDsKKyAgICBnX2kyY0RhdGFHUElPRGF0YVJlZyA9IEdQSU9fREFUQTsKKyAgICBnX2kyY0RhdGFHUElPRGF0YURpclJlZyA9IEdQSU9fREFUQV9ESVJFQ1RJT047CisKKyAgICAvKiBJbml0aWFsaXplIHRoZSBEYXRhIEdQSU8gT2Zmc2V0ICovCisgICAgZ19pMmNEYXRhR1BJTyA9IGkyY0RhdGFHUElPOworCisgICAgLyogRW5hYmxlIHRoZSBHUElPIHBpbnMgZm9yIHRoZSBpMmMgQ2xvY2sgYW5kIERhdGEgKEdQSU8gTVVYKSAqLworICAgIFBPS0UzMihnX2kyY0Nsa0dQSU9NdXhSZWcsCisgICAgICAgICAgICAgICAgICAgICAgUEVFSzMyKGdfaTJjQ2xrR1BJT011eFJlZykgJiB+KDEgPDwgZ19pMmNDbG9ja0dQSU8pKTsKKyAgICBQT0tFMzIoZ19pMmNEYXRhR1BJT011eFJlZywKKyAgICAgICAgICAgICAgICAgICAgICBQRUVLMzIoZ19pMmNEYXRhR1BJT011eFJlZykgJiB+KDEgPDwgZ19pMmNEYXRhR1BJTykpOworCisgICAgLyogRW5hYmxlIEdQSU8gcG93ZXIgKi8KKyAgICBlbmFibGVHUElPKDEpOworCisgICAgLyogQ2xlYXIgdGhlIGkyYyBsaW5lcy4gKi8KKyAgICBmb3IoaT0wOyBpPDk7IGkrKykKKyAgICAgICAgc3dJMkNTdG9wKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHJlYWRzIHRoZSBzbGF2ZSBkZXZpY2UncyByZWdpc3RlcgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZpY2VBZGRyZXNzICAgLSBpMmMgU2xhdmUgZGV2aWNlIGFkZHJlc3Mgd2hpY2ggcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVhZCBmcm9tCisgKiAgICAgIHJlZ2lzdGVySW5kZXggICAtIFNsYXZlIGRldmljZSdzIHJlZ2lzdGVyIHRvIGJlIHJlYWQKKyAqCisgKiAgUmV0dXJuIFZhbHVlOgorICogICAgICBSZWdpc3RlciB2YWx1ZQorICovCit1bnNpZ25lZCBjaGFyIHN3STJDUmVhZFJlZygKKyAgICB1bnNpZ25lZCBjaGFyIGRldmljZUFkZHJlc3MsCisgICAgdW5zaWduZWQgY2hhciByZWdpc3RlckluZGV4CispCit7CisgICAgdW5zaWduZWQgY2hhciBkYXRhOworCisgICAgLyogU2VuZCB0aGUgU3RhcnQgc2lnbmFsICovCisgICAgc3dJMkNTdGFydCgpOworCisgICAgLyogU2VuZCB0aGUgZGV2aWNlIGFkZHJlc3MgKi8KKyAgICBzd0kyQ1dyaXRlQnl0ZShkZXZpY2VBZGRyZXNzKTsKKworICAgIC8qIFNlbmQgdGhlIHJlZ2lzdGVyIGluZGV4ICovCisgICAgc3dJMkNXcml0ZUJ5dGUocmVnaXN0ZXJJbmRleCk7CisKKyAgICAvKiBHZXQgdGhlIGJ1cyBhZ2FpbiBhbmQgZ2V0IHRoZSBkYXRhIGZyb20gdGhlIGRldmljZSByZWFkIGFkZHJlc3MgKi8KKyAgICBzd0kyQ1N0YXJ0KCk7CisgICAgc3dJMkNXcml0ZUJ5dGUoZGV2aWNlQWRkcmVzcyArIDEpOworICAgIGRhdGEgPSBzd0kyQ1JlYWRCeXRlKDEpOworCisgICAgLyogU3RvcCBzd0kyQyBhbmQgcmVsZWFzZSB0aGUgYnVzICovCisgICAgc3dJMkNTdG9wKCk7CisKKyAgICByZXR1cm4gZGF0YTsKK30KKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBhIHZhbHVlIHRvIHRoZSBzbGF2ZSBkZXZpY2UncyByZWdpc3RlcgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICBkZXZpY2VBZGRyZXNzICAgLSBpMmMgU2xhdmUgZGV2aWNlIGFkZHJlc3Mgd2hpY2ggcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgd3JpdHRlbgorICogICAgICByZWdpc3RlckluZGV4ICAgLSBTbGF2ZSBkZXZpY2UncyByZWdpc3RlciB0byBiZSB3cml0dGVuCisgKiAgICAgIGRhdGEgICAgICAgICAgICAtIERhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgcmVnaXN0ZXIKKyAqCisgKiAgUmVzdWx0OgorICogICAgICAgICAgMCAgIC0gU3VjY2VzcworICogICAgICAgICAtMSAgIC0gRmFpbAorICovCitsb25nIHN3STJDV3JpdGVSZWcoCisgICAgdW5zaWduZWQgY2hhciBkZXZpY2VBZGRyZXNzLAorICAgIHVuc2lnbmVkIGNoYXIgcmVnaXN0ZXJJbmRleCwKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGEKKykKK3sKKyAgICBsb25nIHJldHVyblZhbHVlID0gMDsKKworICAgIC8qIFNlbmQgdGhlIFN0YXJ0IHNpZ25hbCAqLworICAgIHN3STJDU3RhcnQoKTsKKworICAgIC8qIFNlbmQgdGhlIGRldmljZSBhZGRyZXNzIGFuZCByZWFkIHRoZSBkYXRhLiBBbGwgc2hvdWxkIHJldHVybiBzdWNjZXNzCisgICAgICAgaW4gb3JkZXIgZm9yIHRoZSB3cml0aW5nIHByb2Nlc3NlZCB0byBiZSBzdWNjZXNzZnVsCisgICAgICovCisgICAgaWYgKChzd0kyQ1dyaXRlQnl0ZShkZXZpY2VBZGRyZXNzKSAhPSAwKSB8fAorICAgICAgICAoc3dJMkNXcml0ZUJ5dGUocmVnaXN0ZXJJbmRleCkgIT0gMCkgfHwKKyAgICAgICAgKHN3STJDV3JpdGVCeXRlKGRhdGEpICE9IDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuVmFsdWUgPSAtMTsKKyAgICB9CisKKyAgICAvKiBTdG9wIGkyYyBhbmQgcmVsZWFzZSB0aGUgYnVzICovCisgICAgc3dJMkNTdG9wKCk7CisKKyAgICByZXR1cm4gcmV0dXJuVmFsdWU7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc3dpMmMuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL2Rkazc1MF9zd2kyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNTQ2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9kZGs3NTBfc3dpMmMuaApAQCAtMCwwICsxLDkyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBieSBTaWxpY29uIE1vdGlvbiwgSW5jLiAoU01JKQorKgorKiAgQWxsIHJpZ2h0cyBhcmUgcmVzZXJ2ZWQuIFJlcHJvZHVjdGlvbiBvciBpbiBwYXJ0IGlzIHByb2hpYml0ZWQKKyogIHdpdGhvdXQgdGhlIHdyaXR0ZW4gY29uc2VudCBvZiB0aGUgY29weXJpZ2h0IG93bmVyLgorKgorKiAgc3dpMmMuaCAtLS0gU003NTAvU003MTggRERLCisqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIGZvciBpMmMgdXNpbmcgc29mdHdhcmUKKyogIGltcGxlbWVudGF0aW9uLgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX1NXSTJDX0hfCisjZGVmaW5lIF9TV0kyQ19IXworCisvKiBEZWZhdWx0IGkyYyBDTEsgYW5kIERhdGEgR1BJTy4gVGhlc2UgYXJlIHRoZSBkZWZhdWx0IGkyYyBwaW5zICovCisjZGVmaW5lIERFRkFVTFRfSTJDX1NDTCAgICAgICAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfSTJDX1NEQSAgICAgICAgICAgICAgICAgICAgIDMxCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBpMmMgYXR0cmlidXRlcyBhbmQgYnVzCisgKgorICogUGFyYW1ldGVyczoKKyAqICAgICAgaTJjQ2xrR1BJTyAgLSBUaGUgR1BJTyBwaW4gdG8gYmUgdXNlZCBhcyBpMmMgU0NMCisgKiAgICAgIGkyY0RhdGFHUElPIC0gVGhlIEdQSU8gcGluIHRvIGJlIHVzZWQgYXMgaTJjIFNEQQorICoKKyAqIFJldHVybiBWYWx1ZToKKyAqICAgICAgLTEgICAtIEZhaWwgdG8gaW5pdGlhbGl6ZSB0aGUgaTJjCisgKiAgICAgICAwICAgLSBTdWNjZXNzCisgKi8KK2xvbmcgc3dJMkNJbml0KAorICAgIHVuc2lnbmVkIGNoYXIgaTJjQ2xrR1BJTywKKyAgICB1bnNpZ25lZCBjaGFyIGkyY0RhdGFHUElPCispOworCisvKgorICogIFRoaXMgZnVuY3Rpb24gcmVhZHMgdGhlIHNsYXZlIGRldmljZSdzIHJlZ2lzdGVyCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIGRldmljZUFkZHJlc3MgICAtIGkyYyBTbGF2ZSBkZXZpY2UgYWRkcmVzcyB3aGljaCByZWdpc3RlcgorICogICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZWFkIGZyb20KKyAqICAgICAgcmVnaXN0ZXJJbmRleCAgIC0gU2xhdmUgZGV2aWNlJ3MgcmVnaXN0ZXIgdG8gYmUgcmVhZAorICoKKyAqICBSZXR1cm4gVmFsdWU6CisgKiAgICAgIFJlZ2lzdGVyIHZhbHVlCisgKi8KK3Vuc2lnbmVkIGNoYXIgc3dJMkNSZWFkUmVnKAorICAgIHVuc2lnbmVkIGNoYXIgZGV2aWNlQWRkcmVzcywKKyAgICB1bnNpZ25lZCBjaGFyIHJlZ2lzdGVySW5kZXgKKyk7CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiB3cml0ZXMgYSB2YWx1ZSB0byB0aGUgc2xhdmUgZGV2aWNlJ3MgcmVnaXN0ZXIKKyAqCisgKiAgUGFyYW1ldGVyczoKKyAqICAgICAgZGV2aWNlQWRkcmVzcyAgIC0gaTJjIFNsYXZlIGRldmljZSBhZGRyZXNzIHdoaWNoIHJlZ2lzdGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHdyaXR0ZW4KKyAqICAgICAgcmVnaXN0ZXJJbmRleCAgIC0gU2xhdmUgZGV2aWNlJ3MgcmVnaXN0ZXIgdG8gYmUgd3JpdHRlbgorICogICAgICBkYXRhICAgICAgICAgICAgLSBEYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIHJlZ2lzdGVyCisgKgorICogIFJlc3VsdDoKKyAqICAgICAgICAgIDAgICAtIFN1Y2Nlc3MKKyAqICAgICAgICAgLTEgICAtIEZhaWwKKyAqLworbG9uZyBzd0kyQ1dyaXRlUmVnKAorICAgIHVuc2lnbmVkIGNoYXIgZGV2aWNlQWRkcmVzcywKKyAgICB1bnNpZ25lZCBjaGFyIHJlZ2lzdGVySW5kZXgsCisgICAgdW5zaWduZWQgY2hhciBkYXRhCispOworCisvKgorICogIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIHVzZWQgdG8gdG9nZ2xlIHRoZSBkYXRhIG9uIHRoZSBTQ0wgYW5kIFNEQSBJMkMgbGluZXMuCisgKiAgVGhlIHVzZWQgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgbm90IHJlY29tbWVuZGVkIHVubGVzcyBpdCBpcyBuZWNlc3NhcnkuCisgKi8KKworLyoKKyAqICBUaGlzIGZ1bmN0aW9uIHNldC9yZXNldCB0aGUgU0NMIEdQSU8gcGluCisgKgorICogIFBhcmFtZXRlcnM6CisgKiAgICAgIHZhbHVlCS0gQml0IHZhbHVlIHRvIHNldCB0byB0aGUgU0NMIG9yIFNEQSAoMCA9IGxvdywgMSA9IGhpZ2gpCisgKi8KK3ZvaWQgc3dJMkNTQ0wodW5zaWduZWQgY2hhciB2YWx1ZSk7CisKKy8qCisgKiAgVGhpcyBmdW5jdGlvbiBzZXQvcmVzZXQgdGhlIFNEQSBHUElPIHBpbgorICoKKyAqICBQYXJhbWV0ZXJzOgorICogICAgICB2YWx1ZQktIEJpdCB2YWx1ZSB0byBzZXQgdG8gdGhlIFNDTCBvciBTREEgKDAgPSBsb3csIDEgPSBoaWdoKQorICovCit2b2lkIHN3STJDU0RBKHVuc2lnbmVkIGNoYXIgdmFsdWUpOworCisjZW5kaWYgIC8qIF9TV0kyQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvbW9kZWRiLmggYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9tb2RlZGIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTI3NWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvbW9kZWRiLmgKQEAgLTAsMCArMSwyMjEgQEAKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgbW9kZWRiMltdID0geworICAgIHsKKwkvKiA2NDB4NDAwIEAgNzAgSHosIDMxLjUga0h6IGhzeW5jICovCisJTlVMTCwgNzAsIDY0MCwgNDAwLCAzOTcyMSwgNDAsIDI0LCAzOSwgOSwgOTYsIDIsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiA2NDB4NDgwIEAgNjAgSHosIDMxLjUga0h6IGhzeW5jICovCisJTlVMTCwgNjAsIDY0MCwgNDgwLCAzOTcyMSwgNDAsIDI0LCAzMiwgMTEsIDk2LCAyLAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogODAweDYwMCBAIDU2IEh6LCAzNS4xNSBrSHogaHN5bmMgKi8KKwlOVUxMLCA1NiwgODAwLCA2MDAsIDI3Nzc3LCAxMjgsIDI0LCAyMiwgMSwgNzIsIDIsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMDI0eDc2OCBAIDg3IEh6IGludGVybGFjZWQsIDM1LjUga0h6IGhzeW5jICovCisJTlVMTCwgODcsIDEwMjQsIDc2OCwgMjIyNzEsIDU2LCAyNCwgMzMsIDgsIDE2MCwgOCwKKwkwLCBGQl9WTU9ERV9JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDY0MHg0MDAgQCA4NSBIeiwgMzcuODYga0h6IGhzeW5jICovCisJTlVMTCwgODUsIDY0MCwgNDAwLCAzMTc0NiwgOTYsIDMyLCA0MSwgMSwgNjQsIDMsCisJRkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDY0MHg0ODAgQCA3MiBIeiwgMzYuNSBrSHogaHN5bmMgKi8KKwlOVUxMLCA3MiwgNjQwLCA0ODAsIDMxNzQ2LCAxNDQsIDQwLCAzMCwgOCwgNDAsIDMsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiA2NDB4NDgwIEAgNzUgSHosIDM3LjUwIGtIeiBoc3luYyAqLworCU5VTEwsIDc1LCA2NDAsIDQ4MCwgMzE3NDYsIDEyMCwgMTYsIDE2LCAxLCA2NCwgMywKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDgwMHg2MDAgQCA2MCBIeiwgMzcuOCBrSHogaHN5bmMgKi8KKwlOVUxMLCA2MCwgODAwLCA2MDAsIDI1MDAwLCA4OCwgNDAsIDIzLCAxLCAxMjgsIDQsCisJRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDY0MHg0ODAgQCA4NSBIeiwgNDMuMjcga0h6IGhzeW5jICovCisJTlVMTCwgODUsIDY0MCwgNDgwLCAyNzc3NywgODAsIDU2LCAyNSwgMSwgNTYsIDMsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMTUyeDg2NCBAIDg5IEh6IGludGVybGFjZWQsIDQ0IGtIeiBoc3luYyAqLworCU5VTEwsIDY5LCAxMTUyLCA4NjQsIDE1Mzg0LCA5NiwgMTYsIDExMCwgMSwgMjE2LCAxMCwKKwkwLCBGQl9WTU9ERV9JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDgwMHg2MDAgQCA3MiBIeiwgNDguMCBrSHogaHN5bmMgKi8KKwlOVUxMLCA3MiwgODAwLCA2MDAsIDIwMDAwLCA2NCwgNTYsIDIzLCAzNywgMTIwLCA2LAorCUZCX1NZTkNfSE9SX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMDI0eDc2OCBAIDYwIEh6LCA0OC40IGtIeiBoc3luYyAqLworCU5VTEwsIDYwLCAxMDI0LCA3NjgsIDE1Mzg0LCAxNjgsIDgsIDI5LCAzLCAxNDQsIDYsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiA2NDB4NDgwIEAgMTAwIEh6LCA1My4wMSBrSHogaHN5bmMgKi8KKwlOVUxMLCAxMDAsIDY0MCwgNDgwLCAyMTgzNCwgOTYsIDMyLCAzNiwgOCwgOTYsIDYsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMTUyeDg2NCBAIDYwIEh6LCA1My41IGtIeiBoc3luYyAqLworCU5VTEwsIDYwLCAxMTUyLCA4NjQsIDExMTIzLCAyMDgsIDY0LCAxNiwgNCwgMjU2LCA4LAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogODAweDYwMCBAIDg1IEh6LCA1NS44NCBrSHogaHN5bmMgKi8KKwlOVUxMLCA4NSwgODAwLCA2MDAsIDE2NDYwLCAxNjAsIDY0LCAzNiwgMTYsIDY0LCA1LAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogMTAyNHg3NjggQCA3MCBIeiwgNTYuNSBrSHogaHN5bmMgKi8KKwlOVUxMLCA3MCwgMTAyNCwgNzY4LCAxMzMzMywgMTQ0LCAyNCwgMjksIDMsIDEzNiwgNiwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworICAgICAgICAvKiAgMTI4MHg5NjAtNjAgVkVTQSAqLworICAgICAgICBOVUxMLCA2MCwgMTI4MCwgOTYwLCA5MjU5LCAzMTIsIDk2LCAzNiwgMSwgMTEyLCAzLAorICAgICAgICBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQsIEZCX01PREVfSVNfVkVTQQorICAgIH0sIHsKKyAgICAgICAgLyogIDEyODB4MTAyNC02MCBWRVNBICovCisgICAgICAgIE5VTEwsIDYwLCAxMjgwLCAxMDI0LCA5MjU5LCAyNDgsIDQ4LCAzOCwgMSwgMTEyLCAzLAorICAgICAgICBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCwgRkJfTU9ERV9JU19WRVNBCisgICAgfSwgeworCS8qIDEyODB4MTAyNCBAIDg3IEh6IGludGVybGFjZWQsIDUxIGtIeiBoc3luYyAqLworCU5VTEwsIDg3LCAxMjgwLCAxMDI0LCAxMjUwMCwgNTYsIDE2LCAxMjgsIDEsIDIxNiwgMTIsCisJMCwgRkJfVk1PREVfSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiA4MDB4NjAwIEAgMTAwIEh6LCA2NC4wMiBrSHogaHN5bmMgKi8KKwlOVUxMLCAxMDAsIDgwMCwgNjAwLCAxNDM1NywgMTYwLCA2NCwgMzAsIDQsIDY0LCA2LAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogMTAyNHg3NjggQCA3NiBIeiwgNjIuNSBrSHogaHN5bmMgKi8KKwlOVUxMLCA3NiwgMTAyNCwgNzY4LCAxMTc2NCwgMjA4LCA4LCAzNiwgMTYsIDEyMCwgMywKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDExNTJ4ODY0IEAgNzAgSHosIDYyLjQga0h6IGhzeW5jICovCisJTlVMTCwgNzAsIDExNTIsIDg2NCwgMTA4NjksIDEwNiwgNTYsIDIwLCAxLCAxNjAsIDEwLAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogMTI4MHgxMDI0IEAgNjEgSHosIDY0LjIga0h6IGhzeW5jICovCisJTlVMTCwgNjEsIDEyODAsIDEwMjQsIDkwOTAsIDIwMCwgNDgsIDI2LCAxLCAxODQsIDMsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxNDAweDEwNTAgQCA2MEh6LCA2My45IGtIeiBoc3luYyAqLworCU5VTEwsIDY4LCAxNDAwLCAxMDUwLCA5MjU5LCAxMzYsIDQwLCAxMywgMSwgMTEyLCAzLAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogMTQwMHgxMDUwIEAgNzUsMTA3IEh6LCA4MiwzOTIga0h6ICtoc3luYyArdnN5bmMqLworCU5VTEwsIDc1LCAxNDAwLCAxMDUwLCA5MjcxLCAxMjAsIDU2LCAxMywgMCwgMTEyLCAzLAorCUZCX1NZTkNfSE9SX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxNDAweDEwNTAgQCA2MCBIeiwgPyBrSHogK2hzeW5jICt2c3luYyovCisgICAgICAgIE5VTEwsIDYwLCAxNDAwLCAxMDUwLCA5MjU5LCAxMjgsIDQwLCAxMiwgMCwgMTEyLCAzLAorCUZCX1NZTkNfSE9SX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMDI0eDc2OCBAIDg1IEh6LCA3MC4yNCBrSHogaHN5bmMgKi8KKwlOVUxMLCA4NSwgMTAyNCwgNzY4LCAxMDExMSwgMTkyLCAzMiwgMzQsIDE0LCAxNjAsIDYsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMTUyeDg2NCBAIDc4IEh6LCA3MC44IGtIeiBoc3luYyAqLworCU5VTEwsIDc4LCAxMTUyLCA4NjQsIDkwOTAsIDIyOCwgODgsIDMyLCAwLCA4NCwgMTIsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMjgweDEwMjQgQCA3MCBIeiwgNzQuNTkga0h6IGhzeW5jICovCisJTlVMTCwgNzAsIDEyODAsIDEwMjQsIDc5MDUsIDIyNCwgMzIsIDI4LCA4LCAxNjAsIDgsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxNjAweDEyMDAgQCA2MEh6LCA3NS4wMCBrSHogaHN5bmMgKi8KKwlOVUxMLCA2MCwgMTYwMCwgMTIwMCwgNjE3MiwgMzA0LCA2NCwgNDYsIDEsIDE5MiwgMywKKwlGQl9TWU5DX0hPUl9ISUdIX0FDVHxGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogMTE1Mng4NjQgQCA4NCBIeiwgNzYuMCBrSHogaHN5bmMgKi8KKwlOVUxMLCA4NCwgMTE1MiwgODY0LCA3NDA3LCAxODQsIDMxMiwgMzIsIDAsIDEyOCwgMTIsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMjgweDEwMjQgQCA3NCBIeiwgNzguODUga0h6IGhzeW5jICovCisJTlVMTCwgNzQsIDEyODAsIDEwMjQsIDc0MDcsIDI1NiwgMzIsIDM0LCAzLCAxNDQsIDMsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMDI0eDc2OCBAIDEwMEh6LCA4MC4yMSBrSHogaHN5bmMgKi8KKwlOVUxMLCAxMDAsIDEwMjQsIDc2OCwgODY1OCwgMTkyLCAzMiwgMjEsIDMsIDE5MiwgMTAsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMjgweDEwMjQgQCA3NiBIeiwgODEuMTMga0h6IGhzeW5jICovCisJTlVMTCwgNzYsIDEyODAsIDEwMjQsIDc0MDcsIDI0OCwgMzIsIDM0LCAzLCAxMDQsIDMsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxNjAweDEyMDAgQCA3MCBIeiwgODcuNTAga0h6IGhzeW5jICovCisJTlVMTCwgNzAsIDE2MDAsIDEyMDAsIDUyOTEsIDMwNCwgNjQsIDQ2LCAxLCAxOTIsIDMsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxMTUyeDg2NCBAIDEwMCBIeiwgODkuNjIga0h6IGhzeW5jICovCisJTlVMTCwgMTAwLCAxMTUyLCA4NjQsIDcyNjQsIDIyNCwgMzIsIDE3LCAyLCAxMjgsIDE5LAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogMTI4MHgxMDI0IEAgODUgSHosIDkxLjE1IGtIeiBoc3luYyAqLworCU5VTEwsIDg1LCAxMjgwLCAxMDI0LCA2MzQ5LCAyMjQsIDY0LCA0NCwgMSwgMTYwLCAzLAorCUZCX1NZTkNfSE9SX0hJR0hfQUNUfEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxNjAweDEyMDAgQCA3NSBIeiwgOTMuNzUga0h6IGhzeW5jICovCisJTlVMTCwgNzUsIDE2MDAsIDEyMDAsIDQ5MzgsIDMwNCwgNjQsIDQ2LCAxLCAxOTIsIDMsCisJRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDE2MDB4MTIwMCBAIDg1IEh6LCAxMDUuNzcga0h6IGhzeW5jICovCisJTlVMTCwgODUsIDE2MDAsIDEyMDAsIDQ1NDUsIDI3MiwgMTYsIDM3LCA0LCAxOTIsIDMsCisJRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDEyODB4MTAyNCBAIDEwMCBIeiwgMTA3LjE2IGtIeiBoc3luYyAqLworCU5VTEwsIDEwMCwgMTI4MCwgMTAyNCwgNTUwMiwgMjU2LCAzMiwgMjYsIDcsIDEyOCwgMTUsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiAxODAweDE0NDAgQCA2NEh6LCA5Ni4xNSBrSHogaHN5bmMgICovCisJTlVMTCwgNjQsIDE4MDAsIDE0NDAsIDQzNDcsIDMwNCwgOTYsIDQ2LCAxLCAxOTIsIDMsCisJRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDE4MDB4MTQ0MCBAIDcwSHosIDEwNC41MiBrSHogaHN5bmMgICovCisJTlVMTCwgNzAsIDE4MDAsIDE0NDAsIDQwMDAsIDMwNCwgOTYsIDQ2LCAxLCAxOTIsIDMsCisJRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfU1lOQ19WRVJUX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECisgICAgfSwgeworCS8qIDUxMngzODQgQCA3OCBIeiwgMzEuNTAga0h6IGhzeW5jICovCisJTlVMTCwgNzgsIDUxMiwgMzg0LCA0OTYwMywgNDgsIDE2LCAxNiwgMSwgNjQsIDMsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAorICAgIH0sIHsKKwkvKiA1MTJ4Mzg0IEAgODUgSHosIDM0LjM4IGtIeiBoc3luYyAqLworCU5VTEwsIDg1LCA1MTIsIDM4NCwgNDU0NTQsIDQ4LCAxNiwgMTYsIDEsIDY0LCAzLAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKKyAgICB9LCB7CisJLyogMzIweDIwMCBAIDcwIEh6LCAzMS41IGtIeiBoc3luYywgODo1IGFzcGVjdCByYXRpbyAqLworCU5VTEwsIDcwLCAzMjAsIDIwMCwgNzk0NDAsIDE2LCAxNiwgMjAsIDQsIDQ4LCAxLAorCTAsIEZCX1ZNT0RFX0RPVUJMRQorICAgIH0sIHsKKwkvKiAzMjB4MjQwIEAgNjAgSHosIDMxLjUga0h6IGhzeW5jLCA0OjMgYXNwZWN0IHJhdGlvICovCisJTlVMTCwgNjAsIDMyMCwgMjQwLCA3OTQ0MCwgMTYsIDE2LCAxNiwgNSwgNDgsIDEsCisJMCwgRkJfVk1PREVfRE9VQkxFCisgICAgfSwgeworCS8qIDMyMHgyNDAgQCA3MiBIeiwgMzYuNSBrSHogaHN5bmMgKi8KKwlOVUxMLCA3MiwgMzIwLCAyNDAsIDYzNDkyLCAxNiwgMTYsIDE2LCA0LCA0OCwgMiwKKwkwLCBGQl9WTU9ERV9ET1VCTEUKKyAgICB9LCB7CisJLyogNDAweDMwMCBAIDU2IEh6LCAzNS4yIGtIeiBoc3luYywgNDozIGFzcGVjdCByYXRpbyAqLworCU5VTEwsIDU2LCA0MDAsIDMwMCwgNTU1NTUsIDY0LCAxNiwgMTAsIDEsIDMyLCAxLAorCTAsIEZCX1ZNT0RFX0RPVUJMRQorICAgIH0sIHsKKwkvKiA0MDB4MzAwIEAgNjAgSHosIDM3Ljgga0h6IGhzeW5jICovCisJTlVMTCwgNjAsIDQwMCwgMzAwLCA1MDAwMCwgNDgsIDE2LCAxMSwgMSwgNjQsIDIsCisJMCwgRkJfVk1PREVfRE9VQkxFCisgICAgfSwgeworCS8qIDQwMHgzMDAgQCA3MiBIeiwgNDguMCBrSHogaHN5bmMgKi8KKwlOVUxMLCA3MiwgNDAwLCAzMDAsIDQwMDAwLCAzMiwgMjQsIDExLCAxOSwgNjQsIDMsCisJMCwgRkJfVk1PREVfRE9VQkxFCisgICAgfSwgeworCS8qIDQ4MHgzMDAgQCA1NiBIeiwgMzUuMiBrSHogaHN5bmMsIDg6NSBhc3BlY3QgcmF0aW8gKi8KKwlOVUxMLCA1NiwgNDgwLCAzMDAsIDQ2MTc2LCA4MCwgMTYsIDEwLCAxLCA0MCwgMSwKKwkwLCBGQl9WTU9ERV9ET1VCTEUKKyAgICB9LCB7CisJLyogNDgweDMwMCBAIDYwIEh6LCAzNy44IGtIeiBoc3luYyAqLworCU5VTEwsIDYwLCA0ODAsIDMwMCwgNDE4NTgsIDU2LCAxNiwgMTEsIDEsIDgwLCAyLAorCTAsIEZCX1ZNT0RFX0RPVUJMRQorICAgIH0sIHsKKwkvKiA0ODB4MzAwIEAgNjMgSHosIDM5LjYga0h6IGhzeW5jICovCisJTlVMTCwgNjMsIDQ4MCwgMzAwLCA0MDAwMCwgNTYsIDE2LCAxMSwgMSwgODAsIDIsCisJMCwgRkJfVk1PREVfRE9VQkxFCisgICAgfSwgeworCS8qIDQ4MHgzMDAgQCA3MiBIeiwgNDguMCBrSHogaHN5bmMgKi8KKwlOVUxMLCA3MiwgNDgwLCAzMDAsIDMzMzg2LCA0MCwgMjQsIDExLCAxOSwgODAsIDMsCisJMCwgRkJfVk1PREVfRE9VQkxFCisgICAgfSwKK307CitzdGF0aWMgY29uc3QgaW50IG5tb2RlZGIyID0gc2l6ZW9mKG1vZGVkYjIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvcmVhZG1lIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvcmVhZG1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOWFmNzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9yZWFkbWUKQEAgLTAsMCArMSwzOCBAQAorSW50cm9kdWN0aW9uOgorCVNNNzUwIG9mIFNpbGljb24gTU90aW9uIGlzIHBjaSBleHByZXNzIGRpc3BsYXkgY29udHJvbGxlciBkZXZpY2UuCisJVGhlIFNNNzUwIGVtYmVkZGVkIGdyYXBoaWNzIGZlYXR1cmVzIGluY2x1ZGU6CisJLSBkdWFsIGRpc3BsYXkKKwktIDJEIGFjY2VsZXJhdGlvbgorCS0gMTZNQiBpbnRlZ3JhdGVkIHZpZGVvIG1lbW9yeQorCitBYm91dCB0aGUga2VybmVsIG1vZHVsZSBwYXJhbXRlciBvZiBkcml2ZXI6CisKKwlVc2UgMTI4MCw4YnBwIGluZGV4IGNvbG9yIGFuZCA2MCBoeiBtb2RlOgorCWluc21vZCAuL3NtNzUwZmIua28gZ19vcHRpb249IjEyODB4MTAyNC04QDYwIgorCisJRGlzYWJsZSBNVFJSLERpc2FibGUgMmQgYWNjZWxlcmF0aW9uLERpc2FibGUgaGFyZHdhcmUgY3Vyc29yLAorCWFuZCB1c2UgYSA4MDB4NjAwIG1vZGUgOgorCWluc21vZCAuL3NtNzUwZmIua28gZ19vcHRpb249Im5vYWNjZWw6bm9tdHJyOm5vaHdjOjgwMHg2MDAiCisKKwlkdWFsIGZyYW1lIGJ1ZmZlciBmb3IgZHJpdmVyIHdpdGggImR1YWwiIHBhcmFtZXRlcgorCWluc21vZCAuL3NtNzUwZmIua28gZ19vcHRpb249ImR1YWwsODAweDYwMDoxMDI0eDc2OCIKKwlpdCB3aWxsIGNyZWF0ZSBmYjAgYW5kIGZiMSAob3IgZmIxLGZiMiBpZiBmYjAgYWxyZWFkeSBleGlzdCkgdW5kZXIgL2RldgorCWFuZCB1c2VyIGNhbiB1c2UgY29uMmZiIHRvIGxpbmsgZmJYIGFuZCB0dHlYCisKKwlOb3RlczoKKwkxKSBpZiB5b3UgYnVpbGQgdGhlIGRyaXZlciB3aXRoIGJ1aWx0LWluIG1ldGhvZCwgdGhlIHBhcmFtdGVyCisJCXlvdSBlZGl0ZWQgaW4gdGhlIGdydWIgY29uZmlnIGZpbGUgd2lsbCBiZSBhbHNvIHRoZQorCQlzYW1lIGZvcm1hdCBhcyBhYm92ZSBtb2R1bGFyIG1ldGhvZCxidXQgYWRkaXRpb25hbHkgYWRkCisJCSJ2aWRlbz1zbTc1MGZiOiIKKwkJYWhlYWQgb2YgcGFyYW1ldGVycyxzbyxpdCBsb29rcyBsaWtlOgorCQl2aWRlbz1zbTc1MGZiOm5vYWNjZWwsMTI4MHgxMDI0QDYwLG90aGVycGFyYW0sZXRjLi4uCisJCWl0IGVxdWFsIHRvIG1vZHVsYXIgbWV0aG9kIHdpdGggYmVsb3cgY29tbWFuZDoKKwkJaW5zbW9kIC4vc203NTBmYi5rbyBnX29wdGlvbj0ibm9hY2NlbDoxMjgweDEwMjRANjA6b3RoZXJwYXJtOmV0Yy4uLiIKKworCTIpIGlmIHlvdSBwdXQgODAweDYwMCBpbnRvIHRoZSBwYXJhbXRlciB3aXRob3V0IGJwcCBhbmQKKwkJcmVmcmVzaCByYXRlLCBrZXJuZWwgZHJpdmVyIHdpbGwgZGVmYXVsdHkgdXNlIDE2YnBwIGFuZCA2MGh6CisKK0ltcG9ydGFudDoKKwlpZiB5b3UgaGF2ZSB2ZXNhZmIgZW5hYmxlZCBpbiB5b3VyIGNvbmZpZyB0aGVuIC9kZXYvZmIwIHdpbGwgYmUgY3JlYXRlZCBieSB2ZXNhZmIKKwlhbmQgdGhpcyBkcml2ZXIgd2lsbCB1c2UgZmIxLCBmYjIuIEluIHRoYXQgY2FzZSwgeW91IG5lZWQgdG8gY29uZmlndXJlIHlvdXIgWC1zZXJ2ZXIKKwl0byB1c2UgZmIxLiBBbm90aGVyIHNpbXBsZSBhbHRoZXJuYXRpdmUgaXMgdG8gZGlzYWJsZSB2ZXNhZmIgZnJvbSB5b3VyIGNvbmZpZy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjN2VhOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MC5jCkBAIC0wLDAgKzEsMTQwMyBAQAorI2luY2x1ZGU8bGludXgva2VybmVsLmg+CisjaW5jbHVkZTxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZTxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlPGxpbnV4L21tLmg+CisjaW5jbHVkZTxsaW51eC9zbGFiLmg+CisjaW5jbHVkZTxsaW51eC9kZWxheS5oPgorI2luY2x1ZGU8bGludXgvZmIuaD4KKyNpbmNsdWRlPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGU8bGludXgvaW5pdC5oPgorI2luY2x1ZGU8bGludXgvcGNpLmg+CisjaW5jbHVkZTxsaW51eC9tbV90eXBlcy5oPgorI2luY2x1ZGU8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGU8bGludXgvcGFnZW1hcC5oPgorI2luY2x1ZGU8bGludXgvc2NyZWVuX2luZm8uaD4KKyNpbmNsdWRlPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaWZkZWYgQ09ORklHX01UUlIKKyNpbmNsdWRlIDxhc20vbXRyci5oPgorI2VuZGlmCisjaW5jbHVkZSA8YXNtL2ZiLmg+CisjaW5jbHVkZSAic203NTAuaCIKKyNpbmNsdWRlICJzbTc1MF9ody5oIgorI2luY2x1ZGUgInNtNzUwX2FjY2VsLmgiCisjaW5jbHVkZSAic203NTBfY3Vyc29yLmgiCisKKyNpbmNsdWRlICJtb2RlZGIuaCIKKworaW50IHNtaV9pbmRlbnQgPSAwOworCisKKy8qCisgKiAjaWZkZWYgX19CSUdfRU5ESUFOCisgKiBzc2l6ZV90IGx5bnhmYl9vcHNfd3JpdGUoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisgKiBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisgKiBzc2l6ZV90IGx5bnhmYl9vcHNfcmVhZChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY2hhciBfX3VzZXIgKmJ1ZiwKKyAqIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKyAqICNlbmRpZgorICovCisKK3R5cGVkZWYgdm9pZCAoKlBST0NfU1BFQ19TRVRVUCkoc3RydWN0IGx5bnhfc2hhcmUqLCBjaGFyICopOwordHlwZWRlZiBpbnQgKCpQUk9DX1NQRUNfTUFQKShzdHJ1Y3QgbHlueF9zaGFyZSosIHN0cnVjdCBwY2lfZGV2Kik7Cit0eXBlZGVmIGludCAoKlBST0NfU1BFQ19JTklUSFcpKHN0cnVjdCBseW54X3NoYXJlKiwgc3RydWN0IHBjaV9kZXYqKTsKKworCisvKiBjb21tb24gdmFyIGZvciBhbGwgZGV2aWNlICovCitzdGF0aWMgaW50IGdfaHdjdXJzb3IgPSAxOworc3RhdGljIGludCBnX25vYWNjZWw7CisjaWZkZWYgQ09ORklHX01UUlIKK3N0YXRpYyBpbnQgZ19ub210cnI7CisjZW5kaWYKK3N0YXRpYyBjb25zdCBjaGFyICpnX2ZibW9kZVtdID0ge05VTEwsIE5VTEx9Oworc3RhdGljIGNvbnN0IGNoYXIgKmdfZGVmX2ZibW9kZSA9ICI4MDB4NjAwLTE2QDYwIjsKK3N0YXRpYyBjaGFyICpnX3NldHRpbmdzID0gTlVMTDsKK3N0YXRpYyBpbnQgZ19kdWFsdmlldzsKK3N0YXRpYyBjaGFyICpnX29wdGlvbiA9IE5VTEw7CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmYl92aWRlb21vZGUgbHlueDc1MF9leHRbXSA9IHsKKwkvKgkxMDI0eDYwMC02MCBWRVNBCVsxLjcxOjFdICovCisJe05VTEwsICA2MCwgMTAyNCwgNjAwLCAyMDQyMywgMTQ0LCAgNDAsIDE4LCAxLCAxMDQsIDMsCisJIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKKworCS8qCTEwMjR4NjAwLTcwIFZFU0EgKi8KKwl7TlVMTCwgIDcwLCAxMDI0LCA2MDAsIDE3MjExLCAxNTIsICA0OCwgMjEsIDEsIDEwNCwgMywKKwkgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJIEZCX1ZNT0RFX05PTklOVEVSTEFDRUR9LAorCisJLyoJMTAyNHg2MDAtNzUgVkVTQSAqLworCXtOVUxMLCAgNzUsIDEwMjQsIDYwMCwgMTU4MjIsIDE2MCwgIDU2LCAyMywgMSwgMTA0LCAzLAorCSBGQl9TWU5DX0hPUl9ISUdIX0FDVCB8IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCwKKwkgRkJfVk1PREVfTk9OSU5URVJMQUNFRH0sCisKKwkvKgkxMDI0eDYwMC04NSBWRVNBICovCisJe05VTEwsICA4NSwgMTAyNCwgNjAwLCAxMzczMCwgMTY4LCAgNTYsIDI2LCAxLCAxMTIsIDMsCisJIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKKworCS8qCTcyMHg0ODAJKi8KKwl7TlVMTCwgNjAsICA3MjAsICA0ODAsICAzNzQyNywgODgsICAgMTYsIDEzLCAxLCAgIDcyLCAgMywKKwkgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJIEZCX1ZNT0RFX05PTklOVEVSTEFDRUR9LAorCisJLyoJMTI4MHg3MjAJCVsxLjc4OjFdCSovCisJe05VTEwsIDYwLCAgMTI4MCwgIDcyMCwgIDEzNDI2LCAxNjIsIDg2LCAyMiwgMSwgIDEzNiwgMywKKwkgRkJfU1lOQ19IT1JfSElHSF9BQ1QgfCBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsCisJIEZCX1ZNT0RFX05PTklOVEVSTEFDRUR9LAorCisJLyoJMTI4MHg3NjhANjAgKi8KKwl7TlVMTCwgNjAsIDEyODAsIDc2OCwgMTI1NzksIDE5MiwgNjQsIDIwLCAzLCAxMjgsIDcsCisJIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKKworCXtOVUxMLCA2MCwgMTM2MCwgNzY4LCAxMTgwNCwgMjA4LCA2NCwgMjMsIDEsIDE0NCwgMywKKwkgRkJfU1lOQ19IT1JfSElHSF9BQ1R8RkJfVk1PREVfTk9OSU5URVJMQUNFRH0sCisKKwkvKgkxMzYwIHggNzY4CVsxLjc3MDgzOjFdCSovCisJe05VTEwsICA2MCwgMTM2MCwgNzY4LCAxMTgwNCwgMjA4LCAgNjQsIDIzLCAxLCAxNDQsIDMsCisJIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKKworCS8qCTEzNjggeCA3NjggICAgICBbMS43ODoxXQkqLworCXtOVUxMLCA2MCwgIDEzNjgsICA3NjgsICAxMTY0NywgMjE2LCA3MiwgMjMsIDEsICAxNDQsIDMsCisJIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKKworCS8qCTE0NDAgeCA5MDAJCVsxNjoxMF0JKi8KKwl7TlVMTCwgNjAsIDE0NDAsIDkwMCwgOTM5MiwgMjMyLCA4MCwgMjgsIDEsIDE1MiwgMywKKwkgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKKworCS8qCTE0NDB4OTYwCQlbMTU6MTBdCSovCisJe05VTEwsIDYwLCAxNDQwLCA5NjAsIDg3MzMsIDI0MCwgODgsIDMwLCAxLCAxNTIsIDMsCisJIEZCX1NZTkNfSE9SX0hJR0hfQUNUIHwgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKKworCS8qCTE5MjB4MTA4MAlbMTY6OV0JKi8KKwl7TlVMTCwgNjAsIDE5MjAsIDEwODAsIDY3MzQsIDE0OCwgODgsIDQxLCAxLCA0NCwgMywKKwkgRkJfU1lOQ19WRVJUX0hJR0hfQUNULAorCSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEfSwKK307CisKKworCisKKy8qIG5vIGhhcmR3YXJlIGN1cnNvciBzdXBwb3J0ZWQgdW5kZXIgdmVyc2lvbiAyLjYuMTAsIGtlcm5lbCBidWcgKi8KK3N0YXRpYyBpbnQgbHlueGZiX29wc19jdXJzb3Ioc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCBmYl9jdXJzb3IgKmZiY3Vyc29yKQoreworCXN0cnVjdCBseW54ZmJfcGFyICpwYXI7CisJc3RydWN0IGx5bnhmYl9jcnRjICpjcnRjOworCXN0cnVjdCBseW54X2N1cnNvciAqY3Vyc29yOworCisJcGFyID0gaW5mby0+cGFyOworCWNydGMgPSAmcGFyLT5jcnRjOworCWN1cnNvciA9ICZjcnRjLT5jdXJzb3I7CisKKwlpZiAoZmJjdXJzb3ItPmltYWdlLndpZHRoID4gY3Vyc29yLT5tYXhXIHx8CisJICAgZmJjdXJzb3ItPmltYWdlLmhlaWdodCA+IGN1cnNvci0+bWF4SCB8fAorCSAgIGZiY3Vyc29yLT5pbWFnZS5kZXB0aCA+IDEpIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwljdXJzb3ItPmRpc2FibGUoY3Vyc29yKTsKKwlpZiAoZmJjdXJzb3ItPnNldCAmIEZCX0NVUl9TRVRTSVpFKQorCQljdXJzb3ItPnNldFNpemUoY3Vyc29yLAorCQkJCWZiY3Vyc29yLT5pbWFnZS53aWR0aCwKKwkJCQlmYmN1cnNvci0+aW1hZ2UuaGVpZ2h0KTsKKworCWlmIChmYmN1cnNvci0+c2V0ICYgRkJfQ1VSX1NFVFBPUykKKwkJY3Vyc29yLT5zZXRQb3MoY3Vyc29yLAorCQkJICAgICAgIGZiY3Vyc29yLT5pbWFnZS5keCAtIGluZm8tPnZhci54b2Zmc2V0LAorCQkJICAgICAgIGZiY3Vyc29yLT5pbWFnZS5keSAtIGluZm8tPnZhci55b2Zmc2V0KTsKKworCWlmIChmYmN1cnNvci0+c2V0ICYgRkJfQ1VSX1NFVENNQVApIHsKKwkJLyogZ2V0IHRoZSAxNmJpdCBjb2xvciBvZiBrZXJuZWwgbWVhbnMgKi8KKwkJdTE2IGZnLCBiZzsKKworCQlmZyA9ICgoaW5mby0+Y21hcC5yZWRbZmJjdXJzb3ItPmltYWdlLmZnX2NvbG9yXSAmIDB4ZjgwMCkpfAorCQkgICAgICAoKGluZm8tPmNtYXAuZ3JlZW5bZmJjdXJzb3ItPmltYWdlLmZnX2NvbG9yXSAmIDB4ZmMwMCkgPj4gNSl8CisJCSAgICAgICgoaW5mby0+Y21hcC5ibHVlW2ZiY3Vyc29yLT5pbWFnZS5mZ19jb2xvcl0gJiAweGY4MDApID4+IDExKTsKKworCQliZyA9ICgoaW5mby0+Y21hcC5yZWRbZmJjdXJzb3ItPmltYWdlLmJnX2NvbG9yXSAmIDB4ZjgwMCkpfAorCQkgICAgICAoKGluZm8tPmNtYXAuZ3JlZW5bZmJjdXJzb3ItPmltYWdlLmJnX2NvbG9yXSAmIDB4ZmMwMCkgPj4gNSl8CisJCSAgICAgICgoaW5mby0+Y21hcC5ibHVlW2ZiY3Vyc29yLT5pbWFnZS5iZ19jb2xvcl0gJiAweGY4MDApID4+IDExKTsKKworCQljdXJzb3ItPnNldENvbG9yKGN1cnNvciwgZmcsIGJnKTsKKwl9CisKKworCWlmIChmYmN1cnNvci0+c2V0ICYgKEZCX0NVUl9TRVRTSEFQRSB8IEZCX0NVUl9TRVRJTUFHRSkpIHsKKwkJY3Vyc29yLT5zZXREYXRhKGN1cnNvciwKKwkJCQlmYmN1cnNvci0+cm9wLAorCQkJCWZiY3Vyc29yLT5pbWFnZS5kYXRhLAorCQkJCWZiY3Vyc29yLT5tYXNrKTsKKwl9CisKKwlpZiAoZmJjdXJzb3ItPmVuYWJsZSkKKwkJY3Vyc29yLT5lbmFibGUoY3Vyc29yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBseW54ZmJfb3BzX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVnaW9uKQoreworCXN0cnVjdCBseW54ZmJfcGFyICpwYXI7CisJc3RydWN0IGx5bnhfc2hhcmUgKnNoYXJlOworCXVuc2lnbmVkIGludCBiYXNlLCBwaXRjaCwgQnBwLCByb3A7CisJdTMyIGNvbG9yOworCisJaWYgKGluZm8tPnN0YXRlICE9IEZCSU5GT19TVEFURV9SVU5OSU5HKQorCQlyZXR1cm47CisKKwlwYXIgPSBpbmZvLT5wYXI7CisJc2hhcmUgPSBwYXItPnNoYXJlOworCisJLyogZWFjaCB0aW1lIDJkIGZ1bmN0aW9uIGJlZ2luIHRvIHdvcmssYmVsb3cgdGhyZWUgdmFyaWFibGUgYWx3YXlzIG5lZWQKKwkgKiBiZSBzZXQsIHNlZW1zIHdlIGNhbiBwdXQgdGhlbSB0b2dldGhlciBpbiBzb21lIHBsYWNlICAqLworCWJhc2UgPSBwYXItPmNydGMub1NjcmVlbjsKKwlwaXRjaCA9IGluZm8tPmZpeC5saW5lX2xlbmd0aDsKKwlCcHAgPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPj4gMzsKKworCWNvbG9yID0gKEJwcCA9PSAxKT9yZWdpb24tPmNvbG9yOigodTMyICopaW5mby0+cHNldWRvX3BhbGV0dGUpW3JlZ2lvbi0+Y29sb3JdOworCXJvcCA9IChyZWdpb24tPnJvcCAhPSBST1BfQ09QWSkgPyBIV19ST1AyX1hPUjpIV19ST1AyX0NPUFk7CisKKwkvKgorCSAqIElmIG5vdCB1c2Ugc3Bpbl9sb2NrLHN5c3RlbSB3aWxsIGRpZSBpZiB1c2VyIGxvYWQgZHJpdmVyCisJICogYW5kIGltbWVkaWF0bHkgdW5sb2FkIGRyaXZlciBmcmVxdWVudGx5IChkdWFsKQorCSAqLworCWlmIChzaGFyZS0+ZHVhbCkKKwkJc3Bpbl9sb2NrKCZzaGFyZS0+c2xvY2spOworCisJc2hhcmUtPmFjY2VsLmRlX2ZpbGxyZWN0KCZzaGFyZS0+YWNjZWwsCisJCQkJIGJhc2UsIHBpdGNoLCBCcHAsCisJCQkJIHJlZ2lvbi0+ZHgsIHJlZ2lvbi0+ZHksCisJCQkJIHJlZ2lvbi0+d2lkdGgsIHJlZ2lvbi0+aGVpZ2h0LAorCQkJCSBjb2xvciwgcm9wKTsKKwlpZiAoc2hhcmUtPmR1YWwpCisJCXNwaW5fdW5sb2NrKCZzaGFyZS0+c2xvY2spOworfQorCitzdGF0aWMgdm9pZCBseW54ZmJfb3BzX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLAorCQkJCWNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqcmVnaW9uKQoreworCXN0cnVjdCBseW54ZmJfcGFyICpwYXI7CisJc3RydWN0IGx5bnhfc2hhcmUgKnNoYXJlOworCXVuc2lnbmVkIGludCBiYXNlLCBwaXRjaCwgQnBwOworCisJcGFyID0gaW5mby0+cGFyOworCXNoYXJlID0gcGFyLT5zaGFyZTsKKworCS8qIGVhY2ggdGltZSAyZCBmdW5jdGlvbiBiZWdpbiB0byB3b3JrLGJlbG93IHRocmVlIHZhcmlhYmxlIGFsd2F5cyBuZWVkCisJICogYmUgc2V0LCBzZWVtcyB3ZSBjYW4gcHV0IHRoZW0gdG9nZXRoZXIgaW4gc29tZSBwbGFjZSAgKi8KKwliYXNlID0gcGFyLT5jcnRjLm9TY3JlZW47CisJcGl0Y2ggPSBpbmZvLT5maXgubGluZV9sZW5ndGg7CisJQnBwID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsID4+IDM7CisKKwkvKgorCSAqIElmIG5vdCB1c2Ugc3Bpbl9sb2NrLCBzeXN0ZW0gd2lsbCBkaWUgaWYgdXNlciBsb2FkIGRyaXZlcgorCSAqIGFuZCBpbW1lZGlhdGx5IHVubG9hZCBkcml2ZXIgZnJlcXVlbnRseSAoZHVhbCkKKwkgKi8KKwlpZiAoc2hhcmUtPmR1YWwpCisJCXNwaW5fbG9jaygmc2hhcmUtPnNsb2NrKTsKKworCXNoYXJlLT5hY2NlbC5kZV9jb3B5YXJlYSgmc2hhcmUtPmFjY2VsLAorCQkJCSBiYXNlLCBwaXRjaCwgcmVnaW9uLT5zeCwgcmVnaW9uLT5zeSwKKwkJCQkgYmFzZSwgcGl0Y2gsIEJwcCwgcmVnaW9uLT5keCwgcmVnaW9uLT5keSwKKwkJCQkgcmVnaW9uLT53aWR0aCwgcmVnaW9uLT5oZWlnaHQsIEhXX1JPUDJfQ09QWSk7CisJaWYgKHNoYXJlLT5kdWFsKQorCQlzcGluX3VubG9jaygmc2hhcmUtPnNsb2NrKTsKK30KKworc3RhdGljIHZvaWQgbHlueGZiX29wc19pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkJIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCit7CisJdW5zaWduZWQgaW50IGJhc2UsIHBpdGNoLCBCcHA7CisJdW5zaWduZWQgaW50IGZnY29sLCBiZ2NvbDsKKwlzdHJ1Y3QgbHlueGZiX3BhciAqcGFyOworCXN0cnVjdCBseW54X3NoYXJlICpzaGFyZTsKKworCXBhciA9IGluZm8tPnBhcjsKKwlzaGFyZSA9IHBhci0+c2hhcmU7CisJLyogZWFjaCB0aW1lIDJkIGZ1bmN0aW9uIGJlZ2luIHRvIHdvcmssYmVsb3cgdGhyZWUgdmFyaWFibGUgYWx3YXlzIG5lZWQKKwkgKiBiZSBzZXQsIHNlZW1zIHdlIGNhbiBwdXQgdGhlbSB0b2dldGhlciBpbiBzb21lIHBsYWNlICAqLworCWJhc2UgPSBwYXItPmNydGMub1NjcmVlbjsKKwlwaXRjaCA9IGluZm8tPmZpeC5saW5lX2xlbmd0aDsKKwlCcHAgPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwgPj4gMzsKKworCWlmIChpbWFnZS0+ZGVwdGggPT0gMSkgeworCQlpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfVFJVRUNPTE9SIHx8CisJCSAgICBpbmZvLT5maXgudmlzdWFsID09IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUikgeworCQkJZmdjb2wgPSAoKHUzMiAqKWluZm8tPnBzZXVkb19wYWxldHRlKVtpbWFnZS0+ZmdfY29sb3JdOworCQkJYmdjb2wgPSAoKHUzMiAqKWluZm8tPnBzZXVkb19wYWxldHRlKVtpbWFnZS0+YmdfY29sb3JdOworCQl9IGVsc2UgeworCQkJZmdjb2wgPSBpbWFnZS0+ZmdfY29sb3I7CisJCQliZ2NvbCA9IGltYWdlLT5iZ19jb2xvcjsKKwkJfQorCQlnb3RvIF9kb193b3JrOworCX0KKwlyZXR1cm47CitfZG9fd29yazoKKwkvKgorCSAqIElmIG5vdCB1c2Ugc3Bpbl9sb2NrLCBzeXN0ZW0gd2lsbCBkaWUgaWYgdXNlciBsb2FkIGRyaXZlcgorCSAqIGFuZCBpbW1lZGlhdGx5IHVubG9hZCBkcml2ZXIgZnJlcXVlbnRseSAoZHVhbCkKKwkgKi8KKwlpZiAoc2hhcmUtPmR1YWwpCisJCXNwaW5fbG9jaygmc2hhcmUtPnNsb2NrKTsKKworCXNoYXJlLT5hY2NlbC5kZV9pbWFnZWJsaXQoJnNoYXJlLT5hY2NlbCwKKwkJCQkgIGltYWdlLT5kYXRhLCBpbWFnZS0+d2lkdGg+PjMsIDAsCisJCQkJICBiYXNlLCBwaXRjaCwgQnBwLAorCQkJCSAgaW1hZ2UtPmR4LCBpbWFnZS0+ZHksCisJCQkJICBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQsCisJCQkJICBmZ2NvbCwgYmdjb2wsIEhXX1JPUDJfQ09QWSk7CisJaWYgKHNoYXJlLT5kdWFsKQorCQlzcGluX3VubG9jaygmc2hhcmUtPnNsb2NrKTsKK30KKworc3RhdGljIGludCBseW54ZmJfb3BzX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJCSAgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGM7CisJaW50IHJldDsKKworCisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IDA7CisJcGFyID0gaW5mby0+cGFyOworCWNydGMgPSAmcGFyLT5jcnRjOworCXJldCA9IGNydGMtPnByb2NfcGFuRGlzcGxheShjcnRjLCB2YXIsIGluZm8pOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBseW54ZmJfb3BzX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgbHlueF9zaGFyZSAqc2hhcmU7CisJc3RydWN0IGx5bnhmYl9jcnRjICpjcnRjOworCXN0cnVjdCBseW54ZmJfb3V0cHV0ICpvdXRwdXQ7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXI7CisJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvICpmaXg7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgbGluZV9sZW5ndGg7CisKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gMDsKKwlwYXIgPSBpbmZvLT5wYXI7CisJc2hhcmUgPSBwYXItPnNoYXJlOworCWNydGMgPSAmcGFyLT5jcnRjOworCW91dHB1dCA9ICZwYXItPm91dHB1dDsKKwl2YXIgPSAmaW5mby0+dmFyOworCWZpeCA9ICZpbmZvLT5maXg7CisKKwkvKiBmaXggc3RydWN0dXIgaXMgbm90IHNvIEZJWCAuLi4gKi8KKwlsaW5lX2xlbmd0aCA9IHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDg7CisJbGluZV9sZW5ndGggPSBQQURESU5HKGNydGMtPmxpbmVfcGFkLCBsaW5lX2xlbmd0aCk7CisJZml4LT5saW5lX2xlbmd0aCA9IGxpbmVfbGVuZ3RoOworCXByX2VycigiZml4LT5saW5lX2xlbmd0aCA9ICVkXG4iLCBmaXgtPmxpbmVfbGVuZ3RoKTsKKworCS8qIHZhci0+cmVkLGdyZWVuLGJsdWUsdHJhbnNwIGFyZSBuZWVkIHRvIGJlIHNldCBieSBkcml2ZXIKKwkgKiBhbmQgdGhlc2UgZGF0YSBzaG91bGQgYmUgc2V0IGJlZm9yZSBzZXRjb2xyZWcgcm91dGluZQorCSAqICovCisKKwlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDg6CisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCQl2YXItPnJlZC5vZmZzZXQgPSAwOworCQl2YXItPnJlZC5sZW5ndGggPSA4OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDA7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OworCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCQlicmVhazsKKwljYXNlIDE2OgorCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKKwkJdmFyLT5yZWQubGVuZ3RoID0gNTsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA1OworCQl2YXItPmdyZWVuLmxlbmd0aCA9IDY7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKKwkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKKwkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKKwkJZml4LT52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOworCQlicmVhazsKKwljYXNlIDI0OgorCWNhc2UgMzI6CisJCXZhci0+cmVkLm9mZnNldCA9IDE2OworCQl2YXItPnJlZC5sZW5ndGggPSA4OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OworCQlmaXgtPnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwl2YXItPmhlaWdodCA9IHZhci0+d2lkdGggPSAtMTsKKwl2YXItPmFjY2VsX2ZsYWdzID0gMDsvKkZCX0FDQ0VMRl9URVhUOyovCisKKwlpZiAocmV0KSB7CisJCXByX2VycigicGl4ZWwgYnBwIGZvcm1hdCBub3Qgc2F0aXNmaWVkXG4uIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldCA9IGNydGMtPnByb2Nfc2V0TW9kZShjcnRjLCB2YXIsIGZpeCk7CisJaWYgKCFyZXQpCisJCXJldCA9IG91dHB1dC0+cHJvY19zZXRNb2RlKG91dHB1dCwgdmFyLCBmaXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNoYW5fdG9fZmllbGQodW5zaWduZWQgaW50IGNoYW4sCisJCQkJCSBzdHJ1Y3QgZmJfYml0ZmllbGQgKmJmKQoreworCWNoYW4gJj0gMHhmZmZmOworCWNoYW4gPj49IDE2IC0gYmYtPmxlbmd0aDsKKwlyZXR1cm4gY2hhbiA8PCBiZi0+b2Zmc2V0OworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGx5bnhmYl9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzZykKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgbHlueF9zaGFyZSAqc2hhcmU7CisJaW50IHJldDsKKworCWlmIChtZXNnLmV2ZW50ID09IHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSAwOworCXNoYXJlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXN3aXRjaCAobWVzZy5ldmVudCkgeworCWNhc2UgUE1fRVZFTlRfRlJFRVpFOgorCWNhc2UgUE1fRVZFTlRfUFJFVEhBVzoKKwkJcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gbWVzZzsKKwkJcmV0dXJuIDA7CisJfQorCisJY29uc29sZV9sb2NrKCk7CisJaWYgKG1lc2cuZXZlbnQgJiBQTV9FVkVOVF9TTEVFUCkgeworCQlpbmZvID0gc2hhcmUtPmZiaW5mb1swXTsKKwkJaWYgKGluZm8pCisJCQkvKiAxIG1lYW5zIGRvIHN1c3BlbmQgKi8KKwkJCWZiX3NldF9zdXNwZW5kKGluZm8sIDEpOworCQlpbmZvID0gc2hhcmUtPmZiaW5mb1sxXTsKKwkJaWYgKGluZm8pCisJCQkvKiAxIG1lYW5zIGRvIHN1c3BlbmQgKi8KKwkJCWZiX3NldF9zdXNwZW5kKGluZm8sIDEpOworCisJCXJldCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoImVycm9yOiVkIG9jY3VycmVkIGluIHBjaV9zYXZlX3N0YXRlXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qIHNldCBjaGlwIHRvIHNsZWVwIG1vZGUgKi8KKwkJaWYgKHNoYXJlLT5zdXNwZW5kKQorCQkJKCpzaGFyZS0+c3VzcGVuZCkoc2hhcmUpOworCisJCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwkJcmV0ID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIG1lc2cpKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJlcnJvcjolZCBvY2N1cnJlZCBpbiBwY2lfc2V0X3Bvd2VyX3N0YXRlXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IG1lc2c7CisJY29uc29sZV91bmxvY2soKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGx5bnhmYl9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGZiX2luZm8gKmluZm87CisJc3RydWN0IGx5bnhfc2hhcmUgKnNoYXJlOworCisJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGM7CisJc3RydWN0IGx5bnhfY3Vyc29yICpjdXJzb3I7CisKKwlpbnQgcmV0OworCisKKwlyZXQgPSAwOworCXNoYXJlID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJY29uc29sZV9sb2NrKCk7CisKKwlyZXQgPSBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJaWYgKHJldCkgeworCQlwcl9lcnIoImVycm9yOiVkIG9jY3VyZWQgaW4gcGNpX3NldF9wb3dlcl9zdGF0ZVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKworCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgIT0gUE1fRVZFTlRfRlJFRVpFKSB7CisJCXBjaV9yZXN0b3JlX3N0YXRlKHBkZXYpOworCQlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJlcnJvcjolZCBvY2N1cmVkIGluIHBjaV9lbmFibGVfZGV2aWNlXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwl9CisJaWYgKHNoYXJlLT5yZXN1bWUpCisJCSgqc2hhcmUtPnJlc3VtZSkoc2hhcmUpOworCisJaHdfc203NTBfaW5pdGh3KHNoYXJlLCBwZGV2KTsKKworCisJaW5mbyA9IHNoYXJlLT5mYmluZm9bMF07CisKKwlpZiAoaW5mbykgeworCQlwYXIgPSBpbmZvLT5wYXI7CisJCWNydGMgPSAmcGFyLT5jcnRjOworCQljdXJzb3IgPSAmY3J0Yy0+Y3Vyc29yOworCQltZW1zZXRfaW8oY3Vyc29yLT52c3RhcnQsIDB4MCwgY3Vyc29yLT5zaXplKTsKKwkJbWVtc2V0X2lvKGNydGMtPnZTY3JlZW4sIDB4MCwgY3J0Yy0+dmlkbWVtX3NpemUpOworCQlseW54ZmJfb3BzX3NldF9wYXIoaW5mbyk7CisJCWZiX3NldF9zdXNwZW5kKGluZm8sIDApOworCX0KKworCWluZm8gPSBzaGFyZS0+ZmJpbmZvWzFdOworCisJaWYgKGluZm8pIHsKKwkJcGFyID0gaW5mby0+cGFyOworCQljcnRjID0gJnBhci0+Y3J0YzsKKwkJY3Vyc29yID0gJmNydGMtPmN1cnNvcjsKKwkJbWVtc2V0X2lvKGN1cnNvci0+dnN0YXJ0LCAweDAsIGN1cnNvci0+c2l6ZSk7CisJCW1lbXNldF9pbyhjcnRjLT52U2NyZWVuLCAweDAsIGNydGMtPnZpZG1lbV9zaXplKTsKKwkJbHlueGZiX29wc19zZXRfcGFyKGluZm8pOworCQlmYl9zZXRfc3VzcGVuZChpbmZvLCAwKTsKKwl9CisKKworCWNvbnNvbGVfdW5sb2NrKCk7CisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGx5bnhmYl9vcHNfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorCQkJCXN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBseW54ZmJfcGFyICpwYXI7CisJc3RydWN0IGx5bnhmYl9jcnRjICpjcnRjOworCXN0cnVjdCBseW54ZmJfb3V0cHV0ICpvdXRwdXQ7CisJc3RydWN0IGx5bnhfc2hhcmUgKnNoYXJlOworCWludCByZXQ7CisJcmVzb3VyY2Vfc2l6ZV90IHJlcXVlc3Q7CisKKworCXBhciA9IGluZm8tPnBhcjsKKwljcnRjID0gJnBhci0+Y3J0YzsKKwlvdXRwdXQgPSAmcGFyLT5vdXRwdXQ7CisJc2hhcmUgPSBwYXItPnNoYXJlOworCXJldCA9IDA7CisKKwlwcl9kZWJ1ZygiY2hlY2sgdmFyOiVkeCVkLSVkXG4iLAorCQkgdmFyLT54cmVzLAorCQkgdmFyLT55cmVzLAorCQkgdmFyLT5iaXRzX3Blcl9waXhlbCk7CisKKworCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgeworCWNhc2UgODoKKwljYXNlIDE2OgorCWNhc2UgMjQ6IC8qIHN1cHBvcnQgMjQgYnBwIGZvciBvbmx5IGx5bng3MTIvNzIyLzcyMCAqLworCWNhc2UgMzI6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiYnBwICVkIG5vdCBzdXBwb3J0ZWRcbiIsIHZhci0+Yml0c19wZXJfcGl4ZWwpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGV4aXQ7CisJfQorCisJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA4OgorCQlpbmZvLT5maXgudmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCQl2YXItPnJlZC5vZmZzZXQgPSAwOworCQl2YXItPnJlZC5sZW5ndGggPSA4OworCQl2YXItPmdyZWVuLm9mZnNldCA9IDA7CisJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKKwkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CisJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OworCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOworCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOworCQlicmVhazsKKwljYXNlIDE2OgorCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKKwkJdmFyLT5yZWQubGVuZ3RoID0gNTsKKwkJdmFyLT5ncmVlbi5vZmZzZXQgPSA1OworCQl2YXItPmdyZWVuLmxlbmd0aCA9IDY7CisJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOworCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKKwkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKKwkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKKwkJaW5mby0+Zml4LnZpc3VhbCA9IEZCX1ZJU1VBTF9UUlVFQ09MT1I7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJY2FzZSAzMjoKKwkJdmFyLT5yZWQub2Zmc2V0ID0gMTY7CisJCXZhci0+cmVkLmxlbmd0aCA9IDg7CisJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKKwkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OworCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKKwkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7CisJCWluZm8tPmZpeC52aXN1YWwgPSBGQl9WSVNVQUxfVFJVRUNPTE9SOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJdmFyLT5oZWlnaHQgPSB2YXItPndpZHRoID0gLTE7CisJdmFyLT5hY2NlbF9mbGFncyA9IDA7LyogRkJfQUNDRUxGX1RFWFQ7ICovCisKKwkvKiBjaGVjayBpZiBjdXJyZW50IGZiJ3MgdmlkZW8gbWVtb3J5IGJpZyBlbm91Z2h0IHRvIGhvbGQgdGhlIG9uc2NyZWVuKi8KKwlyZXF1ZXN0ID0gdmFyLT54cmVzX3ZpcnR1YWwgKiAodmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKTsKKwkvKiBkZWZhdWx0eSBjcnRjLT5jaGFubmVsIGdvIHdpdGggcGFyLT5pbmRleCAqLworCisJcmVxdWVzdCA9IFBBRERJTkcoY3J0Yy0+bGluZV9wYWQsIHJlcXVlc3QpOworCXJlcXVlc3QgPSByZXF1ZXN0ICogdmFyLT55cmVzX3ZpcnR1YWw7CisJaWYgKGNydGMtPnZpZG1lbV9zaXplIDwgcmVxdWVzdCkgeworCQlwcl9lcnIoIm5vdCBlbm91Z2ggdmlkZW8gbWVtb3J5IGZvciBtb2RlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0ID0gb3V0cHV0LT5wcm9jX2NoZWNrTW9kZShvdXRwdXQsIHZhcik7CisJaWYgKCFyZXQpCisJCXJldCA9IGNydGMtPnByb2NfY2hlY2tNb2RlKGNydGMsIHZhcik7CitleGl0OgorCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBseW54ZmJfb3BzX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywKKwkJCQl1bnNpZ25lZCByZWQsCisJCQkJdW5zaWduZWQgZ3JlZW4sCisJCQkJdW5zaWduZWQgYmx1ZSwKKwkJCQl1bnNpZ25lZCB0cmFuc3AsCisJCQkJc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisJc3RydWN0IGx5bnhmYl9wYXIgKnBhcjsKKwlzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGM7CisJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXI7CisJaW50IHJldDsKKworCXBhciA9IGluZm8tPnBhcjsKKwljcnRjID0gJnBhci0+Y3J0YzsKKwl2YXIgPSAmaW5mby0+dmFyOworCXJldCA9IDA7CisKKwlpZiAocmVnbm8gPiAyNTYpIHsKKwkJcHJfZXJyKCJyZWdubyA9ICVkXG4iLCByZWdubyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpbmZvLT52YXIuZ3JheXNjYWxlKQorCQlyZWQgPSBncmVlbiA9IGJsdWUgPSAocmVkICogNzcgKyBncmVlbiAqIDE1MSArIGJsdWUgKiAyOCkgPj4gODsKKworCWlmICh2YXItPmJpdHNfcGVyX3BpeGVsID09IDggJiYKKwkgICAgaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfUFNFVURPQ09MT1IpIHsKKwkJcmVkID4+PSA4OworCQlncmVlbiA+Pj0gODsKKwkJYmx1ZSA+Pj0gODsKKwkJcmV0ID0gY3J0Yy0+cHJvY19zZXRDb2xSZWcoY3J0YywgcmVnbm8sIHJlZCwgZ3JlZW4sIGJsdWUpOworCQlnb3RvIGV4aXQ7CisJfQorCisKKwlpZiAoaW5mby0+Zml4LnZpc3VhbCA9PSBGQl9WSVNVQUxfVFJVRUNPTE9SICYmIHJlZ25vIDwgMjU2KSB7CisJCXUzMiB2YWw7CisKKwkJaWYgKHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMTYgfHwKKwkJICAgIHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMzIgfHwKKwkJICAgIHZhci0+Yml0c19wZXJfcGl4ZWwgPT0gMjQpIHsKKwkJCXZhbCA9IGNoYW5fdG9fZmllbGQocmVkLCAmdmFyLT5yZWQpOworCQkJdmFsIHw9IGNoYW5fdG9fZmllbGQoZ3JlZW4sICZ2YXItPmdyZWVuKTsKKwkJCXZhbCB8PSBjaGFuX3RvX2ZpZWxkKGJsdWUsICZ2YXItPmJsdWUpOworCQkJcGFyLT5wc2V1ZG9fcGFsZXR0ZVtyZWdub10gPSB2YWw7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwlyZXQgPSAtRUlOVkFMOworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbHlueGZiX29wc19ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBseW54ZmJfcGFyICpwYXI7CisJc3RydWN0IGx5bnhmYl9vdXRwdXQgKm91dHB1dDsKKworCXByX2RlYnVnKCJibGFuayA9ICVkLlxuIiwgYmxhbmspOworCXBhciA9IGluZm8tPnBhcjsKKwlvdXRwdXQgPSAmcGFyLT5vdXRwdXQ7CisJcmV0dXJuIG91dHB1dC0+cHJvY19zZXRCTEFOSyhvdXRwdXQsIGJsYW5rKTsKK30KKworc3RhdGljIGludCBzbTc1MGZiX3NldF9kcnYoc3RydWN0IGx5bnhmYl9wYXIgKnBhcikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBseW54X3NoYXJlICpzaGFyZTsKKwlzdHJ1Y3Qgc203NTBfc2hhcmUgKnNwZWNfc2hhcmU7CisJc3RydWN0IGx5bnhmYl9vdXRwdXQgKm91dHB1dDsKKwlzdHJ1Y3QgbHlueGZiX2NydGMgKmNydGM7CisKKwlyZXQgPSAwOworCisJc2hhcmUgPSBwYXItPnNoYXJlOworCXNwZWNfc2hhcmUgPSBjb250YWluZXJfb2Yoc2hhcmUsIHN0cnVjdCBzbTc1MF9zaGFyZSwgc2hhcmUpOworCW91dHB1dCA9ICZwYXItPm91dHB1dDsKKwljcnRjID0gJnBhci0+Y3J0YzsKKworCWNydGMtPnZpZG1lbV9zaXplID0gKHNoYXJlLT5kdWFsKT9zaGFyZS0+dmlkbWVtX3NpemU+PjE6c2hhcmUtPnZpZG1lbV9zaXplOworCS8qIHNldHVwIGNydGMgYW5kIG91dHB1dCBtZW1iZXIgKi8KKwlzcGVjX3NoYXJlLT5od0N1cnNvciA9IGdfaHdjdXJzb3I7CisKKwljcnRjLT5wcm9jX3NldE1vZGUgPSBod19zbTc1MF9jcnRjX3NldE1vZGU7CisJY3J0Yy0+cHJvY19jaGVja01vZGUgPSBod19zbTc1MF9jcnRjX2NoZWNrTW9kZTsKKwljcnRjLT5wcm9jX3NldENvbFJlZyA9IGh3X3NtNzUwX3NldENvbFJlZzsKKwljcnRjLT5wcm9jX3BhbkRpc3BsYXkgPSBod19zbTc1MF9wYW5fZGlzcGxheTsKKwljcnRjLT5jbGVhciA9IGh3X3NtNzUwX2NydGNfY2xlYXI7CisJY3J0Yy0+bGluZV9wYWQgPSAxNjsKKwljcnRjLT54cGFuc3RlcCA9IDg7CisJY3J0Yy0+eXBhbnN0ZXAgPSAxOworCWNydGMtPnl3cmFwc3RlcCA9IDA7CisKKwlvdXRwdXQtPnByb2Nfc2V0TW9kZSA9IGh3X3NtNzUwX291dHB1dF9zZXRNb2RlOworCW91dHB1dC0+cHJvY19jaGVja01vZGUgPSBod19zbTc1MF9vdXRwdXRfY2hlY2tNb2RlOworCisJb3V0cHV0LT5wcm9jX3NldEJMQU5LID0gKHNoYXJlLT5yZXZpZCA9PSBTTTc1MExFX1JFVklTSU9OX0lEKT9od19zbTc1MGxlX3NldEJMQU5LOmh3X3NtNzUwX3NldEJMQU5LOworCW91dHB1dC0+Y2xlYXIgPSBod19zbTc1MF9vdXRwdXRfY2xlYXI7CisJLyogY2hpcCBzcGVjaWZpYyBwaGFzZSAqLworCXNoYXJlLT5hY2NlbC5kZV93YWl0ID0gKHNoYXJlLT5yZXZpZCA9PSBTTTc1MExFX1JFVklTSU9OX0lEKT9od19zbTc1MGxlX2RlV2FpdCA6IGh3X3NtNzUwX2RlV2FpdDsKKwlzd2l0Y2ggKHNwZWNfc2hhcmUtPnN0YXRlLmRhdGFmbG93KSB7CisJY2FzZSBzbTc1MF9zaW11bF9wcmk6CisJCW91dHB1dC0+cGF0aHMgPSBzbTc1MF9wbmM7CisJCWNydGMtPmNoYW5uZWwgPSBzbTc1MF9wcmltYXJ5OworCQljcnRjLT5vU2NyZWVuID0gMDsKKwkJY3J0Yy0+dlNjcmVlbiA9IHNoYXJlLT5wdk1lbTsKKwkJcHJfaW5mbygidXNlIHNpbXVsIHByaW1hcnkgbW9kZVxuIik7CisJCWJyZWFrOworCWNhc2Ugc203NTBfc2ltdWxfc2VjOgorCQlvdXRwdXQtPnBhdGhzID0gc203NTBfcG5jOworCQljcnRjLT5jaGFubmVsID0gc203NTBfc2Vjb25kYXJ5OworCQljcnRjLT5vU2NyZWVuID0gMDsKKwkJY3J0Yy0+dlNjcmVlbiA9IHNoYXJlLT5wdk1lbTsKKwkJYnJlYWs7CisJY2FzZSBzbTc1MF9kdWFsX25vcm1hbDoKKwkJaWYgKHBhci0+aW5kZXggPT0gMCkgeworCQkJb3V0cHV0LT5wYXRocyA9IHNtNzUwX3BhbmVsOworCQkJY3J0Yy0+Y2hhbm5lbCA9IHNtNzUwX3ByaW1hcnk7CisJCQljcnRjLT5vU2NyZWVuID0gMDsKKwkJCWNydGMtPnZTY3JlZW4gPSBzaGFyZS0+cHZNZW07CisJCX0gZWxzZSB7CisJCQlvdXRwdXQtPnBhdGhzID0gc203NTBfY3J0OworCQkJY3J0Yy0+Y2hhbm5lbCA9IHNtNzUwX3NlY29uZGFyeTsKKwkJCS8qIG5vdCBjb25zaWRlciBvZiBwYWRkaW5nIHN0dWZmcyBmb3Igb1NjcmVlbixuZWVkIGZpeCAqLworCQkJY3J0Yy0+b1NjcmVlbiA9IChzaGFyZS0+dmlkbWVtX3NpemUgPj4gMSk7CisJCQljcnRjLT52U2NyZWVuID0gc2hhcmUtPnB2TWVtICsgY3J0Yy0+b1NjcmVlbjsKKwkJfQorCQlicmVhazsKKwljYXNlIHNtNzUwX2R1YWxfc3dhcDoKKwkJaWYgKHBhci0+aW5kZXggPT0gMCkgeworCQkJb3V0cHV0LT5wYXRocyA9IHNtNzUwX3BhbmVsOworCQkJY3J0Yy0+Y2hhbm5lbCA9IHNtNzUwX3NlY29uZGFyeTsKKwkJCWNydGMtPm9TY3JlZW4gPSAwOworCQkJY3J0Yy0+dlNjcmVlbiA9IHNoYXJlLT5wdk1lbTsKKwkJfSBlbHNlIHsKKwkJCW91dHB1dC0+cGF0aHMgPSBzbTc1MF9jcnQ7CisJCQljcnRjLT5jaGFubmVsID0gc203NTBfcHJpbWFyeTsKKwkJCS8qIG5vdCBjb25zaWRlciBvZiBwYWRkaW5nIHN0dWZmcyBmb3Igb1NjcmVlbixuZWVkIGZpeCAqLworCQkJY3J0Yy0+b1NjcmVlbiA9IChzaGFyZS0+dmlkbWVtX3NpemUgPj4gMSk7CisJCQljcnRjLT52U2NyZWVuID0gc2hhcmUtPnB2TWVtICsgY3J0Yy0+b1NjcmVlbjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmJfb3BzIGx5bnhmYl9vcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmZiX2NoZWNrX3ZhciA9ICBseW54ZmJfb3BzX2NoZWNrX3ZhciwKKwkuZmJfc2V0X3BhciA9IGx5bnhmYl9vcHNfc2V0X3BhciwKKwkuZmJfc2V0Y29scmVnID0gbHlueGZiX29wc19zZXRjb2xyZWcsCisJLmZiX2JsYW5rID0gbHlueGZiX29wc19ibGFuaywKKwkuZmJfZmlsbHJlY3QgPSBjZmJfZmlsbHJlY3QsCisJLmZiX2ltYWdlYmxpdCA9IGNmYl9pbWFnZWJsaXQsCisJLmZiX2NvcHlhcmVhID0gY2ZiX2NvcHlhcmVhLAorCS8qIGN1cnNvciAqLworCS5mYl9jdXJzb3IgPSBseW54ZmJfb3BzX2N1cnNvciwKK307CisKKworc3RhdGljIGludCBseW54ZmJfc2V0X2ZiaW5mbyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IGluZGV4KQoreworCWludCBpOworCXN0cnVjdCBseW54ZmJfcGFyICpwYXI7CisJc3RydWN0IGx5bnhfc2hhcmUgKnNoYXJlOworCXN0cnVjdCBseW54ZmJfY3J0YyAqY3J0YzsKKwlzdHJ1Y3QgbHlueGZiX291dHB1dCAqb3V0cHV0OworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyOworCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4OworCisJY29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSAqcGRiW10gPSB7CisJCWx5bng3NTBfZXh0LCBOVUxMLCB2ZXNhX21vZGVzLAorCX07CisJaW50IGNkYltdID0ge0FSUkFZX1NJWkUobHlueDc1MF9leHQpLCAwLCBWRVNBX01PREVEQl9TSVpFfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbWRiX2Rlc2NbXSA9IHsKKwkJImRyaXZlciBwcmVwYXJlZCBtb2RlcyIsCisJCSJrZXJuZWwgcHJlcGFyZWQgZGVmYXVsdCBtb2RlZGIiLAorCQkia2VybmVsIEhFTFBFUlMgcHJlcGFyZWQgdmVzYV9tb2RlcyIsCisJfTsKKworCisJc3RhdGljIGNvbnN0IGNoYXIgKmZpeElkWzJdID0geworCQkic203NTBfZmIxIiwgInNtNzUwX2ZiMiIsCisJfTsKKworCWludCByZXQsIGxpbmVfbGVuZ3RoOworCisJcmV0ID0gMDsKKwlwYXIgPSAoc3RydWN0IGx5bnhmYl9wYXIgKilpbmZvLT5wYXI7CisJc2hhcmUgPSBwYXItPnNoYXJlOworCWNydGMgPSAmcGFyLT5jcnRjOworCW91dHB1dCA9ICZwYXItPm91dHB1dDsKKwl2YXIgPSAmaW5mby0+dmFyOworCWZpeCA9ICZpbmZvLT5maXg7CisKKwkvKiBzZXQgaW5kZXggKi8KKwlwYXItPmluZGV4ID0gaW5kZXg7CisJb3V0cHV0LT5jaGFubmVsID0gJmNydGMtPmNoYW5uZWw7CisJc203NTBmYl9zZXRfZHJ2KHBhcik7CisJbHlueGZiX29wcy5mYl9wYW5fZGlzcGxheSA9IGx5bnhmYl9vcHNfcGFuX2Rpc3BsYXk7CisKKworCS8qIHNldCBjdXJyZW50IGN1cnNvciB2YXJpYWJsZSBhbmQgcHJvYyBwb2ludGVyLAorCSAqIG11c3QgYmUgc2V0IGFmdGVyIGNydGMgbWVtYmVyIGluaXRpYWxpemVkICovCisJY3J0Yy0+Y3Vyc29yLm9mZnNldCA9IGNydGMtPm9TY3JlZW4gKyBjcnRjLT52aWRtZW1fc2l6ZSAtIDEwMjQ7CisJY3J0Yy0+Y3Vyc29yLm1taW8gPSBzaGFyZS0+cHZSZWcgKyAweDgwMGYwICsgKGludCljcnRjLT5jaGFubmVsICogMHgxNDA7CisKKwlwcl9pbmZvKCJjcnRjLT5jdXJzb3IubW1pbyA9ICVwXG4iLCBjcnRjLT5jdXJzb3IubW1pbyk7CisJY3J0Yy0+Y3Vyc29yLm1heEggPSBjcnRjLT5jdXJzb3IubWF4VyA9IDY0OworCWNydGMtPmN1cnNvci5zaXplID0gY3J0Yy0+Y3Vyc29yLm1heEgqY3J0Yy0+Y3Vyc29yLm1heFcqMi84OworCWNydGMtPmN1cnNvci5kaXNhYmxlID0gaHdfY3Vyc29yX2Rpc2FibGU7CisJY3J0Yy0+Y3Vyc29yLmVuYWJsZSA9IGh3X2N1cnNvcl9lbmFibGU7CisJY3J0Yy0+Y3Vyc29yLnNldENvbG9yID0gaHdfY3Vyc29yX3NldENvbG9yOworCWNydGMtPmN1cnNvci5zZXRQb3MgPSBod19jdXJzb3Jfc2V0UG9zOworCWNydGMtPmN1cnNvci5zZXRTaXplID0gaHdfY3Vyc29yX3NldFNpemU7CisJY3J0Yy0+Y3Vyc29yLnNldERhdGEgPSBod19jdXJzb3Jfc2V0RGF0YTsKKwljcnRjLT5jdXJzb3IudnN0YXJ0ID0gc2hhcmUtPnB2TWVtICsgY3J0Yy0+Y3Vyc29yLm9mZnNldDsKKworCisJY3J0Yy0+Y3Vyc29yLnNoYXJlID0gc2hhcmU7CisJCW1lbXNldF9pbyhjcnRjLT5jdXJzb3IudnN0YXJ0LCAwLCBjcnRjLT5jdXJzb3Iuc2l6ZSk7CisJaWYgKCFnX2h3Y3Vyc29yKSB7CisJCWx5bnhmYl9vcHMuZmJfY3Vyc29yID0gTlVMTDsKKwkJY3J0Yy0+Y3Vyc29yLmRpc2FibGUoJmNydGMtPmN1cnNvcik7CisJfQorCisKKwkvKiBzZXQgaW5mby0+ZmJvcHMsIG11c3QgYmUgc2V0IGJlZm9yZSBmYl9maW5kX21vZGUgKi8KKwlpZiAoIXNoYXJlLT5hY2NlbF9vZmYpIHsKKwkJLyogdXNlIDJkIGFjY2VsZXJhdGlvbiAqLworCQlseW54ZmJfb3BzLmZiX2ZpbGxyZWN0ID0gbHlueGZiX29wc19maWxscmVjdDsKKwkJbHlueGZiX29wcy5mYl9jb3B5YXJlYSA9IGx5bnhmYl9vcHNfY29weWFyZWE7CisJCWx5bnhmYl9vcHMuZmJfaW1hZ2VibGl0ID0gbHlueGZiX29wc19pbWFnZWJsaXQ7CisJfQorCWluZm8tPmZib3BzID0gJmx5bnhmYl9vcHM7CisKKwlpZiAoIWdfZmJtb2RlW2luZGV4XSkgeworCQlnX2ZibW9kZVtpbmRleF0gPSBnX2RlZl9mYm1vZGU7CisJCWlmIChpbmRleCkKKwkJCWdfZmJtb2RlW2luZGV4XSA9IGdfZmJtb2RlWzBdOworCX0KKworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCisJCXJldCA9IGZiX2ZpbmRfbW9kZSh2YXIsIGluZm8sIGdfZmJtb2RlW2luZGV4XSwKKwkJCQkgICBwZGJbaV0sIGNkYltpXSwgTlVMTCwgOCk7CisKKwkJaWYgKHJldCA9PSAxKSB7CisJCQlwcl9pbmZvKCJzdWNjZXNzISB1c2Ugc3BlY2lmaWVkIG1vZGU6JXMgaW4gJXNcbiIsCisJCQkJZ19mYm1vZGVbaW5kZXhdLAorCQkJCW1kYl9kZXNjW2ldKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHJldCA9PSAyKSB7CisJCQlwcl93YXJuKCJ1c2Ugc3BlY2lmaWVkIG1vZGU6JXMgaW4gJXMsd2l0aCBhbiBpZ25vcmVkIHJlZnJlc2ggcmF0ZVxuIiwKKwkJCQlnX2ZibW9kZVtpbmRleF0sCisJCQkJbWRiX2Rlc2NbaV0pOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAocmV0ID09IDMpIHsKKwkJCXByX3dhcm4oIndhbm5hIHVzZSBkZWZhdWx0IG1vZGVcbiIpOworCQkJLypicmVhazsqLworCQl9IGVsc2UgaWYgKHJldCA9PSA0KSB7CisJCQlwcl93YXJuKCJmYWxsIGJhY2sgdG8gYW55IHZhbGlkIG1vZGVcbiIpOworCQl9IGVsc2UgeworCQkJcHJfd2FybigicmV0ID0gJWQsZmJfZmluZF9tb2RlIGZhaWxlZCx3aXRoICVzXG4iLAorCQkJCXJldCwKKwkJCQltZGJfZGVzY1tpXSk7CisJCX0KKwl9CisKKwkvKiBzb21lIG1lbWJlciBvZiBpbmZvLT52YXIgaGFkIGJlZW4gc2V0IGJ5IGZiX2ZpbmRfbW9kZSAqLworCisJcHJfaW5mbygiTWVtYmVyIG9mIGluZm8tPnZhciBpcyA6XG5cCisJCXhyZXM9JWRcblwKKwkJeXJlcz0lZFxuXAorCQl4cmVzX3ZpcnR1YWw9JWRcblwKKwkJeXJlc192aXJ0dWFsPSVkXG5cCisJCXhvZmZzZXQ9JWRcblwKKwkJeW9mZnNldD0lZFxuXAorCQliaXRzX3Blcl9waXhlbD0lZFxuIFwKKwkJLi4uXG4iLAorCQl2YXItPnhyZXMsCisJCXZhci0+eXJlcywKKwkJdmFyLT54cmVzX3ZpcnR1YWwsCisJCXZhci0+eXJlc192aXJ0dWFsLAorCQl2YXItPnhvZmZzZXQsCisJCXZhci0+eW9mZnNldCwKKwkJdmFyLT5iaXRzX3Blcl9waXhlbCk7CisKKwkvKiBzZXQgcGFyICovCisJcGFyLT5pbmZvID0gaW5mbzsKKworCS8qIHNldCBpbmZvICovCisJbGluZV9sZW5ndGggPSBQQURESU5HKGNydGMtPmxpbmVfcGFkLAorCQkJICAgICAgKHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRzX3Blcl9waXhlbC84KSk7CisKKwlpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9ICZwYXItPnBzZXVkb19wYWxldHRlWzBdOworCWluZm8tPnNjcmVlbl9iYXNlID0gY3J0Yy0+dlNjcmVlbjsKKwlwcl9kZWJ1Zygic2NyZWVuX2Jhc2UgdmFkZHIgPSAlcFxuIiwgaW5mby0+c2NyZWVuX2Jhc2UpOworCWluZm8tPnNjcmVlbl9zaXplID0gbGluZV9sZW5ndGggKiB2YXItPnlyZXNfdmlydHVhbDsKKwlpbmZvLT5mbGFncyA9IEZCSU5GT19GTEFHX0RFRkFVTFR8MDsKKworCS8qIHNldCBpbmZvLT5maXggKi8KKwlmaXgtPnR5cGUgPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFM7CisJZml4LT50eXBlX2F1eCA9IDA7CisJZml4LT54cGFuc3RlcCA9IGNydGMtPnhwYW5zdGVwOworCWZpeC0+eXBhbnN0ZXAgPSBjcnRjLT55cGFuc3RlcDsKKwlmaXgtPnl3cmFwc3RlcCA9IGNydGMtPnl3cmFwc3RlcDsKKwlmaXgtPmFjY2VsID0gRkJfQUNDRUxfU01JOworCisJc3RybGNweShmaXgtPmlkLCBmaXhJZFtpbmRleF0sIHNpemVvZihmaXgtPmlkKSk7CisKKworCWZpeC0+c21lbV9zdGFydCA9IGNydGMtPm9TY3JlZW4gKyBzaGFyZS0+dmlkbWVtX3N0YXJ0OworCXByX2luZm8oImZpeC0+c21lbV9zdGFydCA9ICVseFxuIiwgZml4LT5zbWVtX3N0YXJ0KTsKKwkvKiBhY2NvcmRpbmcgdG8gbW1hcCBleHBlcmltZW50IGZyb20gdXNlciBzcGFjZSBhcHBsaWNhdGlvbiwKKwkgKiBmaXgtPm1taW9fbGVuIHNob3VsZCBub3QgbGFyZ2VyIHRoYW4gdmlydHVhbCBzaXplCisJICogKHhyZXNfdmlydHVhbCB4IHlyZXNfdmlydHVhbCB4IEJ5UFApCisJICogQmVsb3cgbGluZSBtYXliZSBidWdneSB3aGVuIHVzZXIgbW1hcCBmYiBkZXYgbm9kZSBhbmQgd3JpdGUKKwkgKiBkYXRhIGludG8gdGhlIGJvdW5kIG92ZXIgdmlydHVhbCBzaXplCisJICogKi8KKwlmaXgtPnNtZW1fbGVuID0gY3J0Yy0+dmlkbWVtX3NpemU7CisJcHJfaW5mbygiZml4LT5zbWVtX2xlbiA9ICV4XG4iLCBmaXgtPnNtZW1fbGVuKTsKKwlpbmZvLT5zY3JlZW5fc2l6ZSA9IGZpeC0+c21lbV9sZW47CisJZml4LT5saW5lX2xlbmd0aCA9IGxpbmVfbGVuZ3RoOworCWZpeC0+bW1pb19zdGFydCA9IHNoYXJlLT52aWRyZWdfc3RhcnQ7CisJcHJfaW5mbygiZml4LT5tbWlvX3N0YXJ0ID0gJWx4XG4iLCBmaXgtPm1taW9fc3RhcnQpOworCWZpeC0+bW1pb19sZW4gPSBzaGFyZS0+dmlkcmVnX3NpemU7CisJcHJfaW5mbygiZml4LT5tbWlvX2xlbiA9ICV4XG4iLCBmaXgtPm1taW9fbGVuKTsKKwlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKKwljYXNlIDg6CisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1BTRVVET0NPTE9SOworCQlicmVhazsKKwljYXNlIDE2OgorCWNhc2UgMzI6CisJCWZpeC0+dmlzdWFsID0gRkJfVklTVUFMX1RSVUVDT0xPUjsKKwkJYnJlYWs7CisJfQorCisJLyogc2V0IHZhciAqLworCXZhci0+YWN0aXZhdGUgPSBGQl9BQ1RJVkFURV9OT1c7CisJdmFyLT5hY2NlbF9mbGFncyA9IDA7CisJdmFyLT52bW9kZSA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQ7CisKKwlwcl9kZWJ1ZygiIzEgc2hvdyBpbmZvLT5jbWFwIDogXG5zdGFydD0lZCxsZW49JWQscmVkPSVwLGdyZWVuPSVwLGJsdWU9JXAsdHJhbnNwPSVwXG4iLAorCQkgaW5mby0+Y21hcC5zdGFydCwgaW5mby0+Y21hcC5sZW4sCisJCSBpbmZvLT5jbWFwLnJlZCwgaW5mby0+Y21hcC5ncmVlbiwgaW5mby0+Y21hcC5ibHVlLAorCQkgaW5mby0+Y21hcC50cmFuc3ApOworCisJcmV0ID0gZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxjYXRlIG1lbW9yeSBmb3IgY21hcC5cbiIpOworCQlnb3RvIGV4aXQ7CisJfQorCisJcHJfZGVidWcoIiMyIHNob3cgaW5mby0+Y21hcCA6XG5zdGFydD0lZCxsZW49JWQscmVkPSVwLGdyZWVuPSVwLGJsdWU9JXAsdHJhbnNwPSVwXG4iLAorCQkgaW5mby0+Y21hcC5zdGFydCwgaW5mby0+Y21hcC5sZW4sCisJCSBpbmZvLT5jbWFwLnJlZCwgaW5mby0+Y21hcC5ncmVlbiwgaW5mby0+Y21hcC5ibHVlLAorCQkgaW5mby0+Y21hcC50cmFuc3ApOworCitleGl0OgorCWx5bnhmYl9vcHNfY2hlY2tfdmFyKHZhciwgaW5mbyk7CisJcmV0dXJuIHJldDsKK30KKworLyoJY2hpcCBzcGVjaWZpYyBnX29wdGlvbiBjb25maWd1cmF0aW9uIHJvdXRpbmUgKi8KK3N0YXRpYyB2b2lkIHNtNzUwZmJfc2V0dXAoc3RydWN0IGx5bnhfc2hhcmUgKnNoYXJlLCBjaGFyICpzcmMpCit7CisJc3RydWN0IHNtNzUwX3NoYXJlICpzcGVjX3NoYXJlOworCWNoYXIgKm9wdDsKKyNpZmRlZiBDQVBfRVhQRU5TSU9OCisJY2hhciAqZXhwX3JlczsKKyNlbmRpZgorCWludCBzd2FwOworCisKKwlzcGVjX3NoYXJlID0gY29udGFpbmVyX29mKHNoYXJlLCBzdHJ1Y3Qgc203NTBfc2hhcmUsIHNoYXJlKTsKKyNpZmRlZiBDQVBfRVhQRU5TSUlPTgorCWV4cF9yZXMgPSBOVUxMOworI2VuZGlmCisJc3dhcCA9IDA7CisKKwlzcGVjX3NoYXJlLT5zdGF0ZS5pbml0UGFybS5jaGlwX2NsayA9IDA7CisJc3BlY19zaGFyZS0+c3RhdGUuaW5pdFBhcm0ubWVtX2NsayA9IDA7CisJc3BlY19zaGFyZS0+c3RhdGUuaW5pdFBhcm0ubWFzdGVyX2NsayA9IDA7CisJc3BlY19zaGFyZS0+c3RhdGUuaW5pdFBhcm0ucG93ZXJNb2RlID0gMDsKKwlzcGVjX3NoYXJlLT5zdGF0ZS5pbml0UGFybS5zZXRBbGxFbmdPZmYgPSAwOworCXNwZWNfc2hhcmUtPnN0YXRlLmluaXRQYXJtLnJlc2V0TWVtb3J5ID0gMTsKKworCS8qIGRlZmF1bHRseSB0dXJuIGdfaHdjdXJzb3Igb24gZm9yIGJvdGggdmlldyAqLworCWdfaHdjdXJzb3IgPSAzOworCisJaWYgKCFzcmMgfHwgISpzcmMpIHsKKwkJcHJfd2Fybigibm8gc3BlY2lmaWMgZ19vcHRpb24uXG4iKTsKKwkJZ290byBOT19QQVJBTTsKKwl9CisKKwl3aGlsZSAoKG9wdCA9IHN0cnNlcCgmc3JjLCAiOiIpKSAhPSBOVUxMICYmICpvcHQgIT0gMCkgeworCQlwcl9lcnIoIm9wdD0lc1xuIiwgb3B0KTsKKwkJcHJfZXJyKCJzcmM9JXNcbiIsIHNyYyk7CisKKwkJaWYgKCFzdHJuY21wKG9wdCwgInN3YXAiLCBzdHJsZW4oInN3YXAiKSkpCisJCQlzd2FwID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAibm9jcnQiLCBzdHJsZW4oIm5vY3J0IikpKQorCQkJc3BlY19zaGFyZS0+c3RhdGUubm9jcnQgPSAxOworCQllbHNlIGlmICghc3RybmNtcChvcHQsICIzNmJpdCIsIHN0cmxlbigiMzZiaXQiKSkpCisJCQlzcGVjX3NoYXJlLT5zdGF0ZS5wbmx0eXBlID0gc203NTBfZG91YmxlVEZUOworCQllbHNlIGlmICghc3RybmNtcChvcHQsICIxOGJpdCIsIHN0cmxlbigiMThiaXQiKSkpCisJCQlzcGVjX3NoYXJlLT5zdGF0ZS5wbmx0eXBlID0gc203NTBfZHVhbFRGVDsKKwkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAiMjRiaXQiLCBzdHJsZW4oIjI0Yml0IikpKQorCQkJc3BlY19zaGFyZS0+c3RhdGUucG5sdHlwZSA9IHNtNzUwXzI0VEZUOworI2lmZGVmIENBUF9FWFBBTlNJT04KKwkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAiZXhwOiIsIHN0cmxlbigiZXhwOiIpKSkKKwkJCWV4cF9yZXMgPSBvcHQgKyBzdHJsZW4oImV4cDoiKTsKKyNlbmRpZgorCQllbHNlIGlmICghc3RybmNtcChvcHQsICJub2h3YzAiLCBzdHJsZW4oIm5vaHdjMCIpKSkKKwkJCWdfaHdjdXJzb3IgJj0gfjB4MTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAibm9od2MxIiwgc3RybGVuKCJub2h3YzEiKSkpCisJCQlnX2h3Y3Vyc29yICY9IH4weDI7CisJCWVsc2UgaWYgKCFzdHJuY21wKG9wdCwgIm5vaHdjIiwgc3RybGVuKCJub2h3YyIpKSkKKwkJCWdfaHdjdXJzb3IgPSAwOworCQllbHNlIHsKKwkJCWlmICghZ19mYm1vZGVbMF0pIHsKKwkJCQlnX2ZibW9kZVswXSA9IG9wdDsKKwkJCQlwcl9pbmZvKCJmaW5kIGZibW9kZTAgOiAlc1xuIiwgZ19mYm1vZGVbMF0pOworCQkJfSBlbHNlIGlmICghZ19mYm1vZGVbMV0pIHsKKwkJCQlnX2ZibW9kZVsxXSA9IG9wdDsKKwkJCQlwcl9pbmZvKCJmaW5kIGZibW9kZTEgOiAlc1xuIiwgZ19mYm1vZGVbMV0pOworCQkJfSBlbHNlIHsKKwkJCQlwcl93YXJuKCJIb3cgbWFueSB2aWV3IHlvdSB3YW5uIHNldD9cbiIpOworCQkJfQorCQl9CisJfQorI2lmZGVmIENBUF9FWFBBTlNJT04KKwlpZiAoZ2V0RXhwUmVzKGV4cF9yZXMsCisJCSAgICAgICZzcGVjX3NoYXJlLT5zdGF0ZS54TENELAorCQkgICAgICAmc3BlY19zaGFyZS0+c3RhdGUueUxDRCkpIHsKKwkJLyogc2VlbXMgZXhwX3JlcyBpcyBub3QgdmFsaWQgKi8KKwkJc3BlY19zaGFyZS0+c3RhdGUueExDRCA9IHNwZWNfc2hhcmUtPnN0YXRlLnlMQ0QgPSAwOworCX0KKyNlbmRpZgorCitOT19QQVJBTToKKwlpZiAoc2hhcmUtPnJldmlkICE9IFNNNzUwTEVfUkVWSVNJT05fSUQpIHsKKwkJaWYgKHNoYXJlLT5kdWFsKSB7CisJCQlpZiAoc3dhcCkKKwkJCQlzcGVjX3NoYXJlLT5zdGF0ZS5kYXRhZmxvdyA9IHNtNzUwX2R1YWxfc3dhcDsKKwkJCWVsc2UKKwkJCQlzcGVjX3NoYXJlLT5zdGF0ZS5kYXRhZmxvdyA9IHNtNzUwX2R1YWxfbm9ybWFsOworCQl9IGVsc2UgeworCQkJaWYgKHN3YXApCisJCQkJc3BlY19zaGFyZS0+c3RhdGUuZGF0YWZsb3cgPSBzbTc1MF9zaW11bF9zZWM7CisJCQllbHNlCisJCQkJc3BlY19zaGFyZS0+c3RhdGUuZGF0YWZsb3cgPSBzbTc1MF9zaW11bF9wcmk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBTTTc1MExFIG9ubHkgaGF2ZSBvbmUgY3J0IGNoYW5uZWwgKi8KKwkJc3BlY19zaGFyZS0+c3RhdGUuZGF0YWZsb3cgPSBzbTc1MF9zaW11bF9zZWM7CisJCS8qIHNtNzUwbGUgZG8gbm90IGhhdmUgY29tcGxleCBhdHRyaWJ1dGVzICovCisJCXNwZWNfc2hhcmUtPnN0YXRlLm5vY3J0ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbHlueGZiX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqIGVudCkKK3sKKwlzdHJ1Y3QgZmJfaW5mbyAqaW5mb1tdID0ge05VTEwsIE5VTEx9OworCXN0cnVjdCBseW54X3NoYXJlICpzaGFyZSA9IE5VTEw7CisKKwlzdHJ1Y3Qgc203NTBfc2hhcmUgKnNwZWNfc2hhcmUgPSBOVUxMOworCXNpemVfdCBzcGVjX29mZnNldCA9IDA7CisJaW50IGZiaWR4OworCisKKwkvKiBlbmFibGUgZGV2aWNlICovCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCXByX2VycigiY2FuIG5vdCBlbmFibGUgZGV2aWNlLlxuIik7CisJCWdvdG8gZXJyX2VuYWJsZTsKKwl9CisKKwkvKiB0aG91Z2ggb2Zmc2V0IG9mIHNoYXJlIGluIHNtNzUwX3NoYXJlIGlzIDAsCisJICogd2UgdXNlIHRoaXMgbWFyY3JvIGFzIHRoZSBzYW1lICovCisJc3BlY19vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc203NTBfc2hhcmUsIHNoYXJlKTsKKworCXNwZWNfc2hhcmUgPSBremFsbG9jKHNpemVvZigqc3BlY19zaGFyZSksIEdGUF9LRVJORUwpOworCWlmICghc3BlY19zaGFyZSkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNoYXJlLlxuIik7CisJCWdvdG8gZXJyX3NoYXJlOworCX0KKworCS8qIHNldHRpbmcgc2hhcmUgc3RydWN0dXJlICovCisJc2hhcmUgPSAoc3RydWN0IGx5bnhfc2hhcmUgKikoJihzcGVjX3NoYXJlLT5zaGFyZSkpOworCXNoYXJlLT5mYmluZm9bMF0gPSBzaGFyZS0+ZmJpbmZvWzFdID0gTlVMTDsKKwlzaGFyZS0+ZGV2aWQgPSBwZGV2LT5kZXZpY2U7CisJc2hhcmUtPnJldmlkID0gcGRldi0+cmV2aXNpb247CisKKwlwcl9pbmZvKCJzaGFyZS0+cmV2aWQgPSAlMDJ4XG4iLCBzaGFyZS0+cmV2aWQpOworCXNoYXJlLT5wZGV2ID0gcGRldjsKKyNpZmRlZiBDT05GSUdfTVRSUgorCXNoYXJlLT5tdHJyX29mZiA9IGdfbm9tdHJyOworCXNoYXJlLT5tdHJyLnZyYW0gPSAwOworCXNoYXJlLT5tdHJyLnZyYW1fYWRkZWQgPSAwOworI2VuZGlmCisJc2hhcmUtPmFjY2VsX29mZiA9IGdfbm9hY2NlbDsKKwlzaGFyZS0+ZHVhbCA9IGdfZHVhbHZpZXc7CisJc3Bpbl9sb2NrX2luaXQoJnNoYXJlLT5zbG9jayk7CisKKwlpZiAoIXNoYXJlLT5hY2NlbF9vZmYpIHsKKwkJLyogaG9vayBkZUluaXQgYW5kIDJkIHJvdXRpbmVzLCBub3RlcyB0aGF0IGJlbG93IGh3X3h4eAorCQkgKiByb3V0aW5lIGNhbiB3b3JrIG9uIG1vc3Qgb2YgbHlueCBjaGlwcworCQkgKiBpZiBzb21lIGNoaXAgbmVlZCBzcGVjaWZpYyBmdW5jdGlvbiwKKwkJICogcGxlYXNlIGhvb2sgaXQgaW4gc21YWFhfc2V0X2RydiByb3V0aW5lICovCisJCXNoYXJlLT5hY2NlbC5kZV9pbml0ID0gaHdfZGVfaW5pdDsKKwkJc2hhcmUtPmFjY2VsLmRlX2ZpbGxyZWN0ID0gaHdfZmlsbHJlY3Q7CisJCXNoYXJlLT5hY2NlbC5kZV9jb3B5YXJlYSA9IGh3X2NvcHlhcmVhOworCQlzaGFyZS0+YWNjZWwuZGVfaW1hZ2VibGl0ID0gaHdfaW1hZ2VibGl0OworCQlwcl9pbmZvKCJlbmFibGUgMmQgYWNjZWxlcmF0aW9uXG4iKTsKKwl9IGVsc2UgeworCQlwcl9pbmZvKCJkaXNhYmxlIDJkIGFjY2VsZXJhdGlvblxuIik7CisJfQorCisJLyogY2FsbCBjaGlwIHNwZWNpZmljIHNldHVwIHJvdXRpbmUgICovCisJc203NTBmYl9zZXR1cChzaGFyZSwgZ19zZXR0aW5ncyk7CisKKwkvKiBjYWxsIGNoaXAgc3BlY2lmaWMgbW1hcCByb3V0aW5lICovCisJaWYgKGh3X3NtNzUwX21hcChzaGFyZSwgcGRldikpIHsKKwkJcHJfZXJyKCJNZW1vcnkgbWFwIGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX21hcDsKKwl9CisKKyNpZmRlZiBDT05GSUdfTVRSUgorCWlmICghc2hhcmUtPm10cnJfb2ZmKSB7CisJCXByX2luZm8oImVuYWJsZSBtdHJyXG4iKTsKKwkJc2hhcmUtPm10cnIudnJhbSA9IG10cnJfYWRkKHNoYXJlLT52aWRtZW1fc3RhcnQsCisJCQkJCSAgICBzaGFyZS0+dmlkbWVtX3NpemUsCisJCQkJCSAgICBNVFJSX1RZUEVfV1JDT01CLCAxKTsKKworCQlpZiAoc2hhcmUtPm10cnIudnJhbSA8IDApIHsKKwkJCS8qIGRvbid0IGJsb2NrIGRyaXZlciB3aXRoIHRoZSBmYWlsdXJlIG9mIE1UUlIgKi8KKwkJCXByX2VycigiVW5hYmxlIHRvIHNldHVwIE1UUlIuXG4iKTsKKwkJfSBlbHNlIHsKKwkJCXNoYXJlLT5tdHJyLnZyYW1fYWRkZWQgPSAxOworCQkJcHJfaW5mbygiTVRSUiBhZGRlZCBzdWNjZXNmdWxseVxuIik7CisJCX0KKwl9CisjZW5kaWYKKworCW1lbXNldF9pbyhzaGFyZS0+cHZNZW0sIDAsIHNoYXJlLT52aWRtZW1fc2l6ZSk7CisKKwlwcl9pbmZvKCJzbSUzeCBtbWlvIGFkZHJlc3MgPSAlcFxuIiwgc2hhcmUtPmRldmlkLCBzaGFyZS0+cHZSZWcpOworCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIHNoYXJlKTsKKworCS8qIGNhbGwgY2hpcEluaXQgcm91dGluZSAqLworCWh3X3NtNzUwX2luaXRodyhzaGFyZSwgcGRldik7CisKKwkvKiBhbGxvY2F0ZSBmcmFtZSBidWZmZXIgaW5mbyBzdHJ1Y3RvciBhY2NvcmRpbmcgdG8gZ19kdWFsdmlldyAqLworCWZiaWR4ID0gMDsKK0FMTE9DX0ZCOgorCWluZm9bZmJpZHhdID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBseW54ZmJfcGFyKSwgJnBkZXYtPmRldik7CisJaWYgKCFpbmZvW2ZiaWR4XSkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmcmFtZWJ1ZmZlciAjJWQuXG4iLCBmYmlkeCk7CisJCWlmIChmYmlkeCA9PSAwKQorCQkJZ290byBlcnJfaW5mbzBfYWxsb2M7CisJCWVsc2UKKwkJCWdvdG8gZXJyX2luZm8xX2FsbG9jOworCX0gZWxzZSB7CisJCXN0cnVjdCBseW54ZmJfcGFyICpwYXI7CisJCWludCBlcnJubzsKKworCQlwcl9pbmZvKCJmcmFtZWJ1ZmZlciAjJWQgYWxsb2Mgb2theVxuIiwgZmJpZHgpOworCQlzaGFyZS0+ZmJpbmZvW2ZiaWR4XSA9IGluZm9bZmJpZHhdOworCQlwYXIgPSBpbmZvW2ZiaWR4XS0+cGFyOworCQlwYXItPnNoYXJlID0gc2hhcmU7CisKKwkJLyogc2V0IGZiX2luZm8gc3RydWN0dXJlICovCisJCWlmIChseW54ZmJfc2V0X2ZiaW5mbyhpbmZvW2ZiaWR4XSwgZmJpZHgpKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byBpbml0aWFsIGZiX2luZm8gIyVkLlxuIiwgZmJpZHgpOworCQkJaWYgKGZiaWR4ID09IDApCisJCQkJZ290byBlcnJfaW5mbzBfc2V0OworCQkJZWxzZQorCQkJCWdvdG8gZXJyX2luZm8xX3NldDsKKwkJfQorCisJCS8qIHJlZ2lzdGVyIGZyYW1lIGJ1ZmZlciAqLworCQlwcl9pbmZvKCJSZWFkeSB0byByZWdpc3RlciBmcmFtZWJ1ZmZlciAjJWQuXG4iLCBmYmlkeCk7CisJCWVycm5vID0gcmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mb1tmYmlkeF0pOworCQlpZiAoZXJybm8gPCAwKSB7CisJCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBmYl9pbmZvICMlZC4gZXJyICVkXG4iLAorCQkJICAgICAgIGZiaWR4LAorCQkJICAgICAgIGVycm5vKTsKKwkJCWlmIChmYmlkeCA9PSAwKQorCQkJCWdvdG8gZXJyX3JlZ2lzdGVyMDsKKwkJCWVsc2UKKwkJCQlnb3RvIGVycl9yZWdpc3RlcjE7CisJCX0KKwkJcHJfaW5mbygiQWNjb21wbGlzaGVkIHJlZ2lzdGVyIGZyYW1lYnVmZmVyICMlZC5cbiIsIGZiaWR4KTsKKwl9CisKKwkvKiBubyBkdWFsIHZpZXcgYnkgZmFyICovCisJZmJpZHgrKzsKKwlpZiAoc2hhcmUtPmR1YWwgJiYgZmJpZHggPCAyKQorCQlnb3RvIEFMTE9DX0ZCOworCisJcmV0dXJuIDA7CisKK2Vycl9yZWdpc3RlcjE6CitlcnJfaW5mbzFfc2V0OgorCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mb1sxXSk7CitlcnJfaW5mbzFfYWxsb2M6CisJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvWzBdKTsKK2Vycl9yZWdpc3RlcjA6CitlcnJfaW5mbzBfc2V0OgorCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mb1swXSk7CitlcnJfaW5mbzBfYWxsb2M6CitlcnJfbWFwOgorCWtmcmVlKHNwZWNfc2hhcmUpOworZXJyX3NoYXJlOgorZXJyX2VuYWJsZToKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGx5bnhmYl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCBmYl9pbmZvICppbmZvOworCXN0cnVjdCBseW54X3NoYXJlICpzaGFyZTsKKwl2b2lkICpzcGVjX3NoYXJlOworCXN0cnVjdCBseW54ZmJfcGFyICpwYXI7CisJaW50IGNudDsKKworCWNudCA9IDI7CisJc2hhcmUgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwl3aGlsZSAoY250LS0gPiAwKSB7CisJCWluZm8gPSBzaGFyZS0+ZmJpbmZvW2NudF07CisJCWlmICghaW5mbykKKwkJCWNvbnRpbnVlOworCQlwYXIgPSBpbmZvLT5wYXI7CisKKwkJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKKwkJLyogY2xlYW4gY3J0YyAmIG91dHB1dCBhbGxvY2F0aW9ucyAqLworCQlwYXItPmNydGMuY2xlYXIoJnBhci0+Y3J0Yyk7CisJCXBhci0+b3V0cHV0LmNsZWFyKCZwYXItPm91dHB1dCk7CisJCS8qIHJlbGVhc2UgZnJhbWUgYnVmZmVyICovCisJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CisJfQorI2lmZGVmIENPTkZJR19NVFJSCisJaWYgKHNoYXJlLT5tdHJyLnZyYW1fYWRkZWQpCisJCW10cnJfZGVsKHNoYXJlLT5tdHJyLnZyYW0sCisJCQkgc2hhcmUtPnZpZG1lbV9zdGFydCwKKwkJCSBzaGFyZS0+dmlkbWVtX3NpemUpOworI2VuZGlmCisKKwlpb3VubWFwKHNoYXJlLT5wdlJlZyk7CisJaW91bm1hcChzaGFyZS0+cHZNZW0pOworCXNwZWNfc2hhcmUgPSBjb250YWluZXJfb2Yoc2hhcmUsIHN0cnVjdCBzbTc1MF9zaGFyZSwgc2hhcmUpOworCWtmcmVlKGdfc2V0dGluZ3MpOworCWtmcmVlKHNwZWNfc2hhcmUpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK30KKworc3RhdGljIGludCBfX2luaXQgbHlueGZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCit7CisJaW50IGxlbjsKKwljaGFyICpvcHQsICp0bXA7CisKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpIHsKKwkJcHJfd2Fybigibm8gb3B0aW9ucy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwcl9pbmZvKCJvcHRpb25zOiVzXG4iLCBvcHRpb25zKTsKKworCWxlbiA9IHN0cmxlbihvcHRpb25zKSArIDE7CisJZ19zZXR0aW5ncyA9IGt6YWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdfc2V0dGluZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJdG1wID0gZ19zZXR0aW5nczsKKworCS8qCU5vdGVzOgorCQljaGFyICogc3Ryc2VwKGNoYXIgKipzLGNvbnN0IGNoYXIgKiBjdCk7CisJCUBzOiB0aGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisJCUBjdCA6dGhlIGNoYXJhY3RlcnMgdG8gc2VhcmNoIGZvcgorCisJCXN0cnNlcCgpIHVwZGF0ZXMgQG9wdGlvbnMgdG8gcG9pbnRlciBhZnRlciB0aGUgZmlyc3QgZm91bmQgdG9rZW4KKwkJaXQgYWxzbyByZXR1cm5zIHRoZSBwb2ludGVyIGFoZWFkIHRoZSB0b2tlbi4KKwkJKi8KKwl3aGlsZSAoKG9wdCA9IHN0cnNlcCgmb3B0aW9ucywgIjoiKSkgIT0gTlVMTCkgeworCQkvKiBvcHRpb25zIHRoYXQgbWVhbiBmb3IgYW55IGx5bnggY2hpcHMgYXJlIGNvbmZpZ3VyZWQgaGVyZSAqLworCQlpZiAoIXN0cm5jbXAob3B0LCAibm9hY2NlbCIsIHN0cmxlbigibm9hY2NlbCIpKSkKKwkJCWdfbm9hY2NlbCA9IDE7CisjaWZkZWYgQ09ORklHX01UUlIKKwkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAibm9tdHJyIiwgc3RybGVuKCJub210cnIiKSkpCisJCQlnX25vbXRyciA9IDE7CisjZW5kaWYKKwkJZWxzZSBpZiAoIXN0cm5jbXAob3B0LCAiZHVhbCIsIHN0cmxlbigiZHVhbCIpKSkKKwkJCWdfZHVhbHZpZXcgPSAxOworCQllbHNlIHsKKwkJCXN0cmNhdCh0bXAsIG9wdCk7CisJCQl0bXAgKz0gc3RybGVuKG9wdCk7CisJCQlpZiAob3B0aW9ucyAhPSBOVUxMKQorCQkJCSp0bXArKyA9ICc6JzsKKwkJCWVsc2UKKwkJCQkqdG1wKysgPSAwOworCQl9CisJfQorCisJLyogbWlzYyBnX3NldHRpbmdzIGFyZSB0cmFuc3BvcnQgdG8gY2hpcCBzcGVjaWZpYyByb3V0aW5lcyAqLworCXByX2luZm8oInBhcmFtZXRlciBsZWZ0IGZvciBjaGlwIHNwZWNpZmljIGFuYWx5c2lzOiVzXG4iLCBnX3NldHRpbmdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHNtaV9wY2lfdGFibGVbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoMHgxMjZmLCAweDA3NTApLCB9LAorCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbWlfcGNpX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGx5bnhmYl9kcml2ZXIgPSB7CisJLm5hbWUgPQkJInNtNzUwZmIiLAorCS5pZF90YWJsZSA9CXNtaV9wY2lfdGFibGUsCisJLnByb2JlID0JbHlueGZiX3BjaV9wcm9iZSwKKwkucmVtb3ZlID0JbHlueGZiX3BjaV9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBseW54ZmJfc3VzcGVuZCwKKwkucmVzdW1lID0gbHlueGZiX3Jlc3VtZSwKKyNlbmRpZgorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBseW54ZmJfaW5pdCh2b2lkKQoreworCWNoYXIgKm9wdGlvbjsKKwlpbnQgcmV0OworCisjaWZkZWYgTU9EVUxFCisJb3B0aW9uID0gZ19vcHRpb247CisjZWxzZQorCWlmIChmYl9nZXRfb3B0aW9ucygic203NTBmYiIsICZvcHRpb24pKQorCQlyZXR1cm4gLUVOT0RFVjsKKyNlbmRpZgorCisJbHlueGZiX3NldHVwKG9wdGlvbik7CisJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmbHlueGZiX2RyaXZlcik7CisJcmV0dXJuIHJldDsKK30KK21vZHVsZV9pbml0KGx5bnhmYl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGx5bnhmYl9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZseW54ZmJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KGx5bnhmYl9leGl0KTsKKworbW9kdWxlX3BhcmFtKGdfb3B0aW9uLCBjaGFycCwgU19JUlVHTyk7CisKK01PRFVMRV9QQVJNX0RFU0MoZ19vcHRpb24sCisJCSAiXG5cdFx0Q29tbW9uIG9wdGlvbnM6XG4iCisJCSAiXHRcdG5vYWNjZWw6ZGlzYWJsZSAyZCBjYXBhYmlsaXRpZXNcbiIKKwkJICJcdFx0bm9tdHJyOmRpc2FibGUgTVRSUiBhdHRyaWJ1dGUgZm9yIHZpZGVvIG1lbW9yeVxuIgorCQkgIlx0XHRkdWFsdmlldzpkdWFsIGZyYW1lIGJ1ZmZlciBmZWF0dXJlIGVuYWJsZWRcbiIKKwkJICJcdFx0bm9od2M6ZGlzYWJsZSBoYXJkd2FyZSBjdXJzb3JcbiIKKwkJICJcdFx0VXN1YWwgZXhhbXBsZTpcbiIKKwkJICJcdFx0aW5zbW9kIC4vc203NTBmYi5rbyBnX29wdGlvbj1cIm5vYWNjZWwsbm9od2MsMTI4MHgxMDI0LThANjBcIlxuIgorCQkgKTsKKworTU9EVUxFX0FVVEhPUigibW9uayBsaXUgPG1vbmsubGl1QHNpbGljb25tb3Rpb24uY29tPiIpOworTU9EVUxFX0FVVEhPUigiU3VkaXAgTXVraGVyamVlIDxzdWRpcEB2ZWN0b3JpbmRpYS5vcmc+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZyYW1lIGJ1ZmZlciBkcml2ZXIgZm9yIFNNNzUwIGNoaXBzZXQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwLmggYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NDdkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MC5oCkBAIC0wLDAgKzEsMTg2IEBACisjaWZuZGVmIExZTlhEUlZfSF8KKyNkZWZpbmUgTFlOWERSVl9IXworCisKKworI2RlZmluZSBGQl9BQ0NFTF9TTUkgMHhhYgorLyogcGxlYXNlIHVzZSByZXZpc2lvbiBpZCB0byBkaXN0aW5ndWlzaCBzbTc1MGxlIGFuZCBzbTc1MCovCisjZGVmaW5lIFNQQ19TTTc1MCAJMAorCisvLyNkZWZpbmUgU1BDX1NNNzUwTEUgOAorCisjZGVmaW5lIE1CKHgpICgoeCk8PDIwKQorI2RlZmluZSBNSFooeCkgKCh4KSAqIDEwMDAwMDApCisvKiBhbGlnbiBzaG91bGQgYmUgMiw0LDgsMTYgKi8KKyNkZWZpbmUgUEFERElORyhhbGlnbixkYXRhKSAoKChkYXRhKSsoYWxpZ24pLTEpJih+KChhbGlnbikgLTEpKSkKK2V4dGVybiBpbnQgc21pX2luZGVudDsKKworCitzdHJ1Y3QgbHlueF9hY2NlbHsKKwkvKiBiYXNlIHZpcnR1YWwgYWRkcmVzcyBvZiBEUFIgcmVnaXN0ZXJzICovCisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBfX2lvbWVtICogZHByQmFzZTsKKwkvKiBiYXNlIHZpcnR1YWwgYWRkcmVzcyBvZiBkZSBkYXRhIHBvcnQgKi8KKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIF9faW9tZW0gKiBkcFBvcnRCYXNlOworCisJLyogZnVuY3Rpb24gZm9pbnRlcnMgKi8KKwl2b2lkICgqZGVfaW5pdCkoc3RydWN0IGx5bnhfYWNjZWwgKik7CisKKwlpbnQgKCpkZV93YWl0KSh2b2lkKTsvKiBzZWUgaWYgaGFyZHdhcmUgcmVhZHkgdG8gd29yayAqLworCisJaW50ICgqZGVfZmlsbHJlY3QpKHN0cnVjdCBseW54X2FjY2VsICosdTMyLHUzMix1MzIsCisJCQkJCQkJdTMyLHUzMix1MzIsdTMyLHUzMix1MzIpOworCisJaW50ICgqZGVfY29weWFyZWEpKHN0cnVjdCBseW54X2FjY2VsICosdTMyLHUzMix1MzIsdTMyLAorCQkJCQkJdTMyLHUzMix1MzIsdTMyLAorCQkJCQkJdTMyLHUzMix1MzIsdTMyKTsKKworCWludCAoKmRlX2ltYWdlYmxpdCkoc3RydWN0IGx5bnhfYWNjZWwgKixjb25zdCBjaGFyICosdTMyLHUzMix1MzIsCisJCQkJCQl1MzIsdTMyLHUzMix1MzIsdTMyLHUzMix1MzIsdTMyLHUzMik7CisKK307CisKKy8qIAlseW54X3NoYXJlIHN0YW5kcyBmb3IgYSBwcmVzZW50YXRpb24gb2YgdHdvIGZyYW1lIGJ1ZmZlcgorCXRoYXQgdXNlIG9uZSBzbWkgYWRhcHRvciAsIGl0IGlzIHNpbWlsYXIgdG8gYSBiYXNpYyBjbGFzcyBvZiBDKysKKyovCitzdHJ1Y3QgbHlueF9zaGFyZXsKKwkvKiBjb21tb24gbWVtYmVycyAqLworCXUxNiBkZXZpZDsKKwl1OCByZXZpZDsKKwlzdHJ1Y3QgcGNpX2RldiAqIHBkZXY7CisJc3RydWN0IGZiX2luZm8gKiBmYmluZm9bMl07CisJc3RydWN0IGx5bnhfYWNjZWwgYWNjZWw7CisJaW50IGFjY2VsX29mZjsKKwlpbnQgZHVhbDsKKyNpZmRlZiBDT05GSUdfTVRSUgorCQlpbnQgbXRycl9vZmY7CisJCXN0cnVjdHsKKwkJCWludCB2cmFtOworCQkJaW50IHZyYW1fYWRkZWQ7CisJCX1tdHJyOworI2VuZGlmCisJLyogYWxsIHNtaSBncmFwaGljIGFkYXB0b3IgZ290IGJlbG93IGF0dHJpYnV0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIHZpZG1lbV9zdGFydDsKKwl1bnNpZ25lZCBsb25nIHZpZHJlZ19zdGFydDsKKwlfX3UzMiB2aWRtZW1fc2l6ZTsKKwlfX3UzMiB2aWRyZWdfc2l6ZTsKKwl2b2lkIF9faW9tZW0gKiBwdlJlZzsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKiBwdk1lbTsKKwkvKiBsb2NrcyovCisJc3BpbmxvY2tfdCBzbG9jazsKKwkvKiBmdW5jdGlvbiBwb2ludGVycyAqLworCXZvaWQgKCpzdXNwZW5kKShzdHJ1Y3QgbHlueF9zaGFyZSopOworCXZvaWQgKCpyZXN1bWUpKHN0cnVjdCBseW54X3NoYXJlKik7Cit9OworCitzdHJ1Y3QgbHlueF9jdXJzb3J7CisJLyogY3Vyc29yIHdpZHRoICxoZWlnaHQgYW5kIHNpemUgKi8KKwlpbnQgdzsKKwlpbnQgaDsKKwlpbnQgc2l6ZTsKKwkvKiBoYXJkd2FyZSBsaW1pdGF0aW9uICovCisJaW50IG1heFc7CisJaW50IG1heEg7CisJLyogYmFzZSB2aXJ0dWFsIGFkZHJlc3MgYW5kIG9mZnNldCAgb2YgY3Vyc29yIGltYWdlICovCisJY2hhciBfX2lvbWVtICogdnN0YXJ0OworCWludCBvZmZzZXQ7CisJLyogbW1pbyBhZGRyIG9mIGh3IGN1cnNvciAqLworCXZvbGF0aWxlIGNoYXIgX19pb21lbSAqIG1taW87CisJLyogdGhlIGx5bnhfc2hhcmUgb2YgdGhpcyBhZGFwdG9yICovCisJc3RydWN0IGx5bnhfc2hhcmUgKiBzaGFyZTsKKwkvKiBwcm9jX3JvdXRpbmVzICovCisJdm9pZCAoKmVuYWJsZSkoc3RydWN0IGx5bnhfY3Vyc29yICopOworCXZvaWQgKCpkaXNhYmxlKShzdHJ1Y3QgbHlueF9jdXJzb3IgKik7CisJdm9pZCAoKnNldFNpemUpKHN0cnVjdCBseW54X2N1cnNvciAqLGludCxpbnQpOworCXZvaWQgKCpzZXRQb3MpKHN0cnVjdCBseW54X2N1cnNvciAqLGludCxpbnQpOworCXZvaWQgKCpzZXRDb2xvcikoc3RydWN0IGx5bnhfY3Vyc29yICosdTMyLHUzMik7CisJdm9pZCAoKnNldERhdGEpKHN0cnVjdCBseW54X2N1cnNvciAqLHUxNixjb25zdCB1OCosY29uc3QgdTgqKTsKK307CisKK3N0cnVjdCBseW54ZmJfY3J0Y3sKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKiB2Q3Vyc29yOy8vdmlydHVhbCBhZGRyZXNzIG9mIGN1cnNvcgorCXVuc2lnbmVkIGNoYXIgX19pb21lbSAqIHZTY3JlZW47Ly92aXJ0dWFsIGFkZHJlc3Mgb2Ygb25fc2NyZWVuCisJaW50IG9DdXJzb3I7Ly9jdXJzb3IgYWRkcmVzcyBvZmZzZXQgaW4gdmlkbWVtCisJaW50IG9TY3JlZW47Ly9vbnNjcmVlbiBhZGRyZXNzIG9mZnNldCBpbiB2aWRtZW0KKwlpbnQgY2hhbm5lbDsvKiB3aGljaCBjaGFubmVsIHRoaXMgY3J0YyBzdGFuZHMgZm9yKi8KKwlyZXNvdXJjZV9zaXplX3QgdmlkbWVtX3NpemU7LyogdGhpcyB2aWV3J3MgdmlkZW8gbWVtb3J5IG1heCBzaXplICovCisKKwkvKiBiZWxvdyBhdHRyaWJ1dGVzIGJlbG9uZyB0byBpbmZvLT5maXgsIHRoZWlyIHZhbHVlIGRlcGVuZHMgb24gc3BlY2lmaWMgYWRhcHRvciovCisJdTE2IGxpbmVfcGFkOy8qIHBhZGRpbmcgaW5mb3JtYXRpb246MCwxLDIsNCw4LDE2LC4uLiAqLworCXUxNiB4cGFuc3RlcDsKKwl1MTYgeXBhbnN0ZXA7CisJdTE2IHl3cmFwc3RlcDsKKworCXZvaWQgKiBwcml2OworCisJaW50KCpwcm9jX3NldE1vZGUpKHN0cnVjdCBseW54ZmJfY3J0YyosCisJCQkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8qLAorCQkJCQkJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvKik7CisKKwlpbnQoKnByb2NfY2hlY2tNb2RlKShzdHJ1Y3QgbHlueGZiX2NydGMqLHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyopOworCWludCgqcHJvY19zZXRDb2xSZWcpKHN0cnVjdCBseW54ZmJfY3J0YyosdXNob3J0LHVzaG9ydCx1c2hvcnQsdXNob3J0KTsKKwl2b2lkICgqY2xlYXIpKHN0cnVjdCBseW54ZmJfY3J0YyopOworICAgICAgICAvKiBwYW4gZGlzcGxheSAqLworCWludCAoKnByb2NfcGFuRGlzcGxheSkoc3RydWN0IGx5bnhmYl9jcnRjICosCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICosCisJCQkgICAgICAgY29uc3Qgc3RydWN0IGZiX2luZm8gKik7CisJLyogY3Vyc29yIGluZm9ybWF0aW9uICovCisJc3RydWN0IGx5bnhfY3Vyc29yIGN1cnNvcjsKK307CisKK3N0cnVjdCBseW54ZmJfb3V0cHV0eworCWludCBkcG1zOworCWludCBwYXRoczsKKwkvKiAJd2hpY2ggcGF0aHMocykgdGhpcyBvdXRwdXQgc3RhbmRzIGZvcixmb3Igc203NTA6CisJCXBhdGhzPTE6bWVhbnMgb3V0cHV0IGZvciBwYW5lbCBwYXRocworCQlwYXRocz0yOm1lYW5zIG91dHB1dCBmb3IgY3J0IHBhdGhzCisJCXBhdGhzPTM6bWVhbnMgb3V0cHV0IGZvciBib3RoIHBhbmVsIGFuZCBjcnQgcGF0aHMKKwkqLworCisJaW50ICogY2hhbm5lbDsKKwkvKiAJd2hpY2ggY2hhbm5lbCB0aGVzZSBvdXRwdXRzIGxpbmtlZCB3aXRoLGZvciBzbTc1MDoKKwkJKmNoYW5uZWw9MCBtZWFucyBwcmltYXJ5IGNoYW5uZWwKKwkJKmNoYW5uZWw9MSBtZWFucyBzZWNvbmRhcnkgY2hhbm5lbAorCQlvdXRwdXQtPmNoYW5uZWwgPT0+ICZjcnRjLT5jaGFubmVsCisJKi8KKwl2b2lkICogcHJpdjsKKworCWludCgqcHJvY19zZXRNb2RlKShzdHJ1Y3QgbHlueGZiX291dHB1dCosCisJCQkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8qLAorCQkJCQkJc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvKik7CisKKwlpbnQoKnByb2NfY2hlY2tNb2RlKShzdHJ1Y3QgbHlueGZiX291dHB1dCosc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKik7CisJaW50KCpwcm9jX3NldEJMQU5LKShzdHJ1Y3QgbHlueGZiX291dHB1dCosaW50KTsKKwl2b2lkICAoKmNsZWFyKShzdHJ1Y3QgbHlueGZiX291dHB1dCopOworfTsKKworc3RydWN0IGx5bnhmYl9wYXJ7CisJLyogZWl0aGVyIDAgb3IgMSBmb3IgZHVhbCBoZWFkIGFkYXB0b3IsMCBpcyB0aGUgb2xkZXIgb25lIHJlZ2lzdGVyZWQgKi8KKwlpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IHBzZXVkb19wYWxldHRlWzI1Nl07CisJc3RydWN0IGx5bnhmYl9jcnRjIGNydGM7CisJc3RydWN0IGx5bnhmYl9vdXRwdXQgb3V0cHV0OworCXN0cnVjdCBmYl9pbmZvICogaW5mbzsKKwlzdHJ1Y3QgbHlueF9zaGFyZSAqIHNoYXJlOworfTsKKworI2lmbmRlZiBvZmZzZXRvZgorI2RlZmluZSBvZmZzZXRvZihUWVBFLCBNRU1CRVIpICgoc2l6ZV90KSAmKChUWVBFICopMCktPk1FTUJFUikKKyNlbmRpZgorCisKKyNkZWZpbmUgUFNfVE9fSFoocHMpCVwKKwkJCSh7IAlcCisJCQl1bnNpZ25lZCBsb25nIGxvbmcgaHogPSAxMDAwKjEwMDAqMTAwMCoxMDAwVUxMOwlcCisJCQlkb19kaXYoaHoscHMpOwlcCisJCQkodW5zaWduZWQgbG9uZyloejt9KQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcHNfdG9faHoodW5zaWduZWQgaW50IHBzdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG51bWVyYXRvcj0xMDAwKjEwMDAqMTAwMCoxMDAwVUxMOworCS8qIDEwXjEyIC8gcGljb3NlY29uZCBwZXJpb2QgZ2l2ZXMgZnJlcXVlbmN5IGluIEh6ICovCisJZG9fZGl2KG51bWVyYXRvciwgcHN2YWx1ZSk7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKW51bWVyYXRvcjsKK30KKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2FjY2VsLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9hY2NlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YTM3MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9hY2NlbC5jCkBAIC0wLDAgKzEsNDM3IEBACisjaW5jbHVkZTxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGU8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGU8bGludXgvbW0uaD4KKyNpbmNsdWRlPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZTxsaW51eC9mYi5oPgorI2luY2x1ZGU8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZTxsaW51eC9pbml0Lmg+CisjaW5jbHVkZTxsaW51eC9wY2kuaD4KKyNpbmNsdWRlPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZTxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlPGxpbnV4L3NjcmVlbl9pbmZvLmg+CisKKyNpbmNsdWRlICJzbTc1MC5oIgorI2luY2x1ZGUgInNtNzUwX2FjY2VsLmgiCisjaW5jbHVkZSAic203NTBfaGVscC5oIgorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2RwcihzdHJ1Y3QgbHlueF9hY2NlbCAqIGFjY2VsLGludCBvZmZzZXQsdTMyIHJlZ1ZhbHVlKQoreworCXdyaXRlbChyZWdWYWx1ZSxhY2NlbC0+ZHByQmFzZSArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJlYWRfZHByKHN0cnVjdCBseW54X2FjY2VsICogYWNjZWwsaW50IG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZGwoYWNjZWwtPmRwckJhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfZHBQb3J0KHN0cnVjdCBseW54X2FjY2VsICogYWNjZWwsdTMyIGRhdGEpCit7CisJd3JpdGVsKGRhdGEsYWNjZWwtPmRwUG9ydEJhc2UpOworfQorCit2b2lkIGh3X2RlX2luaXQoc3RydWN0IGx5bnhfYWNjZWwgKiBhY2NlbCkKK3sKKwkvKiBzZXR1cCAyZCBlbmdpbmUgcmVnaXN0ZXJzICovCisJdTMyIHJlZyxjbHI7CisJCisJd3JpdGVfZHByKGFjY2VsLERFX01BU0tTLDB4RkZGRkZGRkYpOworCisJLyogZHByMWMgKi8KKwlyZWcgPSBGSUVMRF9TRVQoMCxERV9TVFJFVENIX0ZPUk1BVCxQQVRURVJOX1hZLE5PUk1BTCl8CisJCUZJRUxEX1ZBTFVFKDAsREVfU1RSRVRDSF9GT1JNQVQsUEFUVEVSTl9ZLDApfAorCQlGSUVMRF9WQUxVRSgwLERFX1NUUkVUQ0hfRk9STUFULFBBVFRFUk5fWCwwKXwKKwkJRklFTERfU0VUKDAsREVfU1RSRVRDSF9GT1JNQVQsQUREUkVTU0lORyxYWSl8CisJCUZJRUxEX1ZBTFVFKDAsREVfU1RSRVRDSF9GT1JNQVQsU09VUkNFX0hFSUdIVCwzKTsKKworCWNsciA9IEZJRUxEX0NMRUFSKERFX1NUUkVUQ0hfRk9STUFULFBBVFRFUk5fWFkpJgorCQlGSUVMRF9DTEVBUihERV9TVFJFVENIX0ZPUk1BVCxQQVRURVJOX1kpJgorCQlGSUVMRF9DTEVBUihERV9TVFJFVENIX0ZPUk1BVCxQQVRURVJOX1gpJgorCQlGSUVMRF9DTEVBUihERV9TVFJFVENIX0ZPUk1BVCxBRERSRVNTSU5HKSYKKwkJRklFTERfQ0xFQVIoREVfU1RSRVRDSF9GT1JNQVQsU09VUkNFX0hFSUdIVCk7CisKKwkvKiBERV9TVFJFVENIIGJwcCBmb3JtYXQgbmVlZCBiZSBpbml0aWxpemVkIGluIHNldE1vZGUgcm91dGluZSAqLworCXdyaXRlX2RwcihhY2NlbCxERV9TVFJFVENIX0ZPUk1BVCwocmVhZF9kcHIoYWNjZWwsREVfU1RSRVRDSF9GT1JNQVQpICYgY2xyKSB8IHJlZyk7CisKKwkvKiBkaXNhYmxlIGNsaXBwaW5nIGFuZCB0cmFuc3BhcmVudCAqLworCXdyaXRlX2RwcihhY2NlbCxERV9DTElQX1RMLDApOy8vZHByMmMKKwl3cml0ZV9kcHIoYWNjZWwsREVfQ0xJUF9CUiwwKTsvL2RwcjMwCisKKwl3cml0ZV9kcHIoYWNjZWwsREVfQ09MT1JfQ09NUEFSRV9NQVNLLDApOy8vZHByMjQKKwl3cml0ZV9kcHIoYWNjZWwsREVfQ09MT1JfQ09NUEFSRSwwKTsKKworCXJlZyA9IEZJRUxEX1NFVCgwLERFX0NPTlRST0wsVFJBTlNQQVJFTkNZLERJU0FCTEUpfAorCQlGSUVMRF9TRVQoMCxERV9DT05UUk9MLFRSQU5TUEFSRU5DWV9NQVRDSCxPUEFRVUUpfAorCQlGSUVMRF9TRVQoMCxERV9DT05UUk9MLFRSQU5TUEFSRU5DWV9TRUxFQ1QsU09VUkNFKTsKKworCWNsciA9IEZJRUxEX0NMRUFSKERFX0NPTlRST0wsVFJBTlNQQVJFTkNZKSYKKwkJRklFTERfQ0xFQVIoREVfQ09OVFJPTCxUUkFOU1BBUkVOQ1lfTUFUQ0gpJgorCQlGSUVMRF9DTEVBUihERV9DT05UUk9MLFRSQU5TUEFSRU5DWV9TRUxFQ1QpOworCisJLyogZHByMGMgKi8KKwl3cml0ZV9kcHIoYWNjZWwsREVfQ09OVFJPTCwocmVhZF9kcHIoYWNjZWwsREVfQ09OVFJPTCkmY2xyKXxyZWcpOworfQorCisvKiBzZXQyZGZvcm1hdCBvbmx5IGJlIGNhbGxlZCBmcm9tIHNldG1vZGUgZnVuY3Rpb25zCisgKiBidXQgaWYgeW91IG5lZWQgZHVhbCBmcmFtZWJ1ZmZlciBkcml2ZXIsbmVlZCBjYWxsIHNldDJkZm9ybWF0CisgKiBldmVyeSB0aW1lIHlvdSB1c2UgMmQgZnVuY3Rpb24gKi8KKwordm9pZCBod19zZXQyZGZvcm1hdChzdHJ1Y3QgbHlueF9hY2NlbCAqIGFjY2VsLGludCBmbXQpCit7CisJdTMyIHJlZzsKKwkKKwkvKiBmbXQ9MCwxLDIgZm9yIDgsMTYsMzIsYnBwIG9uIHNtNzE4Lzc1MC81MDIgKi8KKwlyZWcgPSByZWFkX2RwcihhY2NlbCxERV9TVFJFVENIX0ZPUk1BVCk7CisJcmVnID0gRklFTERfVkFMVUUocmVnLERFX1NUUkVUQ0hfRk9STUFULFBJWEVMX0ZPUk1BVCxmbXQpOworCXdyaXRlX2RwcihhY2NlbCxERV9TVFJFVENIX0ZPUk1BVCxyZWcpOworfQorCitpbnQgaHdfZmlsbHJlY3Qoc3RydWN0IGx5bnhfYWNjZWwgKiBhY2NlbCwKKwkJCQl1MzIgYmFzZSx1MzIgcGl0Y2gsdTMyIEJwcCwKKwkJCQl1MzIgeCx1MzIgeSx1MzIgd2lkdGgsdTMyIGhlaWdodCwKKwkJCQl1MzIgY29sb3IsdTMyIHJvcCkKK3sKKwl1MzIgZGVDdHJsOworCisJaWYoYWNjZWwtPmRlX3dhaXQoKSAhPSAwKQorCXsKKwkJLyogaW50IHRpbWUgd2FpdCBhbmQgYWx3YXlzIGJ1c3ksc2VlbXMgaGFyZHdhcmUKKwkJICogZ290IHNvbWV0aGluZyBlcnJvciAqLworCQlwcl9kZWJ1ZygiJXM6RGUgZW5naW5lIGFsd2F5cyBidXNzeVxuIixfX2Z1bmNfXyk7CisJCXJldHVybiAtMTsKKwl9CisKKwl3cml0ZV9kcHIoYWNjZWwsREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsYmFzZSk7Ly9kcHI0MAorCXdyaXRlX2RwcihhY2NlbCxERV9QSVRDSCwKKwkJCUZJRUxEX1ZBTFVFKDAsREVfUElUQ0gsREVTVElOQVRJT04scGl0Y2gvQnBwKXwKKwkJCUZJRUxEX1ZBTFVFKDAsREVfUElUQ0gsU09VUkNFLHBpdGNoL0JwcCkpOy8vZHByMTAKKworCXdyaXRlX2RwcihhY2NlbCxERV9XSU5ET1dfV0lEVEgsCisJCQlGSUVMRF9WQUxVRSgwLERFX1dJTkRPV19XSURUSCxERVNUSU5BVElPTixwaXRjaC9CcHApfAorCQkJRklFTERfVkFMVUUoMCxERV9XSU5ET1dfV0lEVEgsU09VUkNFLHBpdGNoL0JwcCkpOy8vZHByNDQKKworCXdyaXRlX2RwcihhY2NlbCxERV9GT1JFR1JPVU5ELGNvbG9yKTsvL0RQUjE0CisKKwl3cml0ZV9kcHIoYWNjZWwsREVfREVTVElOQVRJT04sCisJCQlGSUVMRF9TRVQoMCxERV9ERVNUSU5BVElPTixXUkFQLERJU0FCTEUpfAorCQkJRklFTERfVkFMVUUoMCxERV9ERVNUSU5BVElPTixYLHgpfAorCQkJRklFTERfVkFMVUUoMCxERV9ERVNUSU5BVElPTixZLHkpKTsvL2RwcjQKKworCXdyaXRlX2RwcihhY2NlbCxERV9ESU1FTlNJT04sCisJCQlGSUVMRF9WQUxVRSgwLERFX0RJTUVOU0lPTixYLHdpZHRoKXwKKwkJCUZJRUxEX1ZBTFVFKDAsREVfRElNRU5TSU9OLFlfRVQsaGVpZ2h0KSk7Ly9kcHI4CisKKwlkZUN0cmwgPQorCQlGSUVMRF9TRVQoMCxERV9DT05UUk9MLFNUQVRVUyxTVEFSVCl8CisJCUZJRUxEX1NFVCgwLERFX0NPTlRST0wsRElSRUNUSU9OLExFRlRfVE9fUklHSFQpfAorCQlGSUVMRF9TRVQoMCxERV9DT05UUk9MLExBU1RfUElYRUwsT04pfAorCQlGSUVMRF9TRVQoMCxERV9DT05UUk9MLENPTU1BTkQsUkVDVEFOR0xFX0ZJTEwpfAorCQlGSUVMRF9TRVQoMCxERV9DT05UUk9MLFJPUF9TRUxFQ1QsUk9QMil8CisJCUZJRUxEX1ZBTFVFKDAsREVfQ09OVFJPTCxST1Ascm9wKTsvL2RwcjB4YworCisJd3JpdGVfZHByKGFjY2VsLERFX0NPTlRST0wsZGVDdHJsKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGh3X2NvcHlhcmVhKAorc3RydWN0IGx5bnhfYWNjZWwgKiBhY2NlbCwKK3Vuc2lnbmVkIGludCBzQmFzZSwgIC8qIEFkZHJlc3Mgb2Ygc291cmNlOiBvZmZzZXQgaW4gZnJhbWUgYnVmZmVyICovCit1bnNpZ25lZCBpbnQgc1BpdGNoLCAvKiBQaXRjaCB2YWx1ZSBvZiBzb3VyY2Ugc3VyZmFjZSBpbiBCWVRFICovCit1bnNpZ25lZCBpbnQgc3gsCit1bnNpZ25lZCBpbnQgc3ksICAgICAvKiBTdGFydGluZyBjb29yZGluYXRlIG9mIHNvdXJjZSBzdXJmYWNlICovCit1bnNpZ25lZCBpbnQgZEJhc2UsICAvKiBBZGRyZXNzIG9mIGRlc3RpbmF0aW9uOiBvZmZzZXQgaW4gZnJhbWUgYnVmZmVyICovCit1bnNpZ25lZCBpbnQgZFBpdGNoLCAvKiBQaXRjaCB2YWx1ZSBvZiBkZXN0aW5hdGlvbiBzdXJmYWNlIGluIEJZVEUgKi8KK3Vuc2lnbmVkIGludCBCcHAsICAgIC8qIENvbG9yIGRlcHRoIG9mIGRlc3RpbmF0aW9uIHN1cmZhY2UgKi8KK3Vuc2lnbmVkIGludCBkeCwKK3Vuc2lnbmVkIGludCBkeSwgICAgIC8qIFN0YXJ0aW5nIGNvb3JkaW5hdGUgb2YgZGVzdGluYXRpb24gc3VyZmFjZSAqLwordW5zaWduZWQgaW50IHdpZHRoLAordW5zaWduZWQgaW50IGhlaWdodCwgLyogd2lkdGggYW5kIGhlaWdodCBvZiByZWN0YW5nbGUgaW4gcGl4ZWwgdmFsdWUgKi8KK3Vuc2lnbmVkIGludCByb3AyKSAgIC8qIFJPUCB2YWx1ZSAqLworeworICAgIHVuc2lnbmVkIGludCBuRGlyZWN0aW9uLCBkZV9jdHJsOworICAgIGludCBvcFNpZ247CisgICAgbkRpcmVjdGlvbiA9IExFRlRfVE9fUklHSFQ7CisJLyogRGlyZWN0aW9uIG9mIFJPUDIgb3BlcmF0aW9uOiAxID0gTGVmdCB0byBSaWdodCwgKC0xKSA9IFJpZ2h0IHRvIExlZnQgKi8KKyAgICBvcFNpZ24gPSAxOworICAgIGRlX2N0cmwgPSAwOworCisgICAgLyogSWYgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgdGhlIHNhbWUgc3VyZmFjZSwgbmVlZCB0byBjaGVjayBmb3Igb3ZlcmxheSBjYXNlcyAqLworICAgIGlmIChzQmFzZSA9PSBkQmFzZSAmJiBzUGl0Y2ggPT0gZFBpdGNoKQorICAgIHsKKyAgICAgICAgLyogRGV0ZXJtaW5lIGRpcmVjdGlvbiBvZiBvcGVyYXRpb24gKi8KKyAgICAgICAgaWYgKHN5IDwgZHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qICstLS0tLS0tLS0tKworICAgICAgICAgICAgICAgfFMgICAgICAgICB8CisgICAgICAgICAgICAgICB8ICAgKy0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICB8ICAgfCAgICAgIHwgICB8CisgICAgICAgICAgICAgICB8ICAgfCAgICAgIHwgICB8CisgICAgICAgICAgICAgICArLS0tfC0tLS0tLSsgICB8CisgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIER8CisgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0rICovCisKKyAgICAgICAgICAgIG5EaXJlY3Rpb24gPSBCT1RUT01fVE9fVE9QOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN5ID4gZHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qICstLS0tLS0tLS0tKworICAgICAgICAgICAgICAgfEQgICAgICAgICB8CisgICAgICAgICAgICAgICB8ICAgKy0tLS0tLS0tLS0rCisgICAgICAgICAgICAgICB8ICAgfCAgICAgIHwgICB8CisgICAgICAgICAgICAgICB8ICAgfCAgICAgIHwgICB8CisgICAgICAgICAgICAgICArLS0tfC0tLS0tLSsgICB8CisgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIFN8CisgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0rICovCisKKyAgICAgICAgICAgIG5EaXJlY3Rpb24gPSBUT1BfVE9fQk9UVE9NOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogc3kgPT0gZHkgKi8KKworICAgICAgICAgICAgaWYgKHN4IDw9IGR4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qICstLS0tLS0rLS0tKy0tLS0tLSsKKyAgICAgICAgICAgICAgICAgICB8UyAgICAgfCAgIHwgICAgIER8CisgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICB8ICAgICAgfAorICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgfCAgICAgIHwKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgIHwgICAgICB8CisgICAgICAgICAgICAgICAgICAgKy0tLS0tLSstLS0rLS0tLS0tKyAqLworCisgICAgICAgICAgICAgICAgbkRpcmVjdGlvbiA9IFJJR0hUX1RPX0xFRlQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogc3ggPiBkeCAqLworCisgICAgICAgICAgICAgICAgLyogKy0tLS0tLSstLS0rLS0tLS0tKworICAgICAgICAgICAgICAgICAgIHxEICAgICB8ICAgfCAgICAgU3wKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgfCAgIHwgICAgICB8CisgICAgICAgICAgICAgICAgICAgfCAgICAgIHwgICB8ICAgICAgfAorICAgICAgICAgICAgICAgICAgIHwgICAgICB8ICAgfCAgICAgIHwKKyAgICAgICAgICAgICAgICAgICArLS0tLS0tKy0tLSstLS0tLS0rICovCisKKyAgICAgICAgICAgICAgICBuRGlyZWN0aW9uID0gTEVGVF9UT19SSUdIVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgobkRpcmVjdGlvbiA9PSBCT1RUT01fVE9fVE9QKSB8fCAobkRpcmVjdGlvbiA9PSBSSUdIVF9UT19MRUZUKSkKKyAgICB7CisgICAgICAgIHN4ICs9IHdpZHRoIC0gMTsKKyAgICAgICAgc3kgKz0gaGVpZ2h0IC0gMTsKKyAgICAgICAgZHggKz0gd2lkdGggLSAxOworICAgICAgICBkeSArPSBoZWlnaHQgLSAxOworICAgICAgICBvcFNpZ24gPSAoLTEpOworICAgIH0KKworICAgIC8qIE5vdGU6CisgICAgICAgREVfRk9SRUdST1VORCBhcmUgREVfQkFDS0dST1VORCBhcmUgZG9uJ3QgY2FyZS4KKyAgICAgICBERV9DT0xPUl9DT01QQVJFIGFuZCBERV9DT0xPUl9DT01QQVJFX01BS1MgYXJlIHNldCBieSBzZXQgZGVTZXRUcmFuc3BhcmVuY3koKS4KKyAgICAqLworCisgICAgLyogMkQgU291cmNlIEJhc2UuCisgICAgICAgSXQgaXMgYW4gYWRkcmVzcyBvZmZzZXQgKDEyOCBiaXQgYWxpZ25lZCkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGZyYW1lIGJ1ZmZlci4KKyAgICAqLworICAgIHdyaXRlX2RwcihhY2NlbCxERV9XSU5ET1dfU09VUkNFX0JBU0UsIHNCYXNlKTsvL2RwcjQwCisKKyAgICAvKiAyRCBEZXN0aW5hdGlvbiBCYXNlLgorICAgICAgIEl0IGlzIGFuIGFkZHJlc3Mgb2Zmc2V0ICgxMjggYml0IGFsaWduZWQpIGZyb20gdGhlIGJlZ2lubmluZyBvZiBmcmFtZSBidWZmZXIuCisgICAgKi8KKyAgICB3cml0ZV9kcHIoYWNjZWwsREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0UsIGRCYXNlKTsvL2RwcjQ0CisKKyNpZiAwCisgICAgLyogUHJvZ3JhbSBwaXRjaCAoZGlzdGFuY2UgYmV0d2VlbiB0aGUgMXN0IHBvaW50cyBvZiB0d28gYWRqYWNlbnQgbGluZXMpLgorICAgICAgIE5vdGUgdGhhdCBpbnB1dCBwaXRjaCBpcyBCWVRFIHZhbHVlLCBidXQgdGhlIDJEIFBpdGNoIHJlZ2lzdGVyIHVzZXMKKyAgICAgICBwaXhlbCB2YWx1ZXMuIE5lZWQgQnl0ZSB0byBwaXhlbCBjb252ZXJ0aW9uLgorICAgICovCisJaWYoQnBwID09IDMpeworCQkJc3ggKj0gMzsKKwkJCWR4ICo9IDM7CisJCQl3aWR0aCAqPSAzOworCQl3cml0ZV9kcHIoYWNjZWwsREVfUElUQ0gsCisJCQkJRklFTERfVkFMVUUoMCwgREVfUElUQ0gsIERFU1RJTkFUSU9OLCBkUGl0Y2gpIHwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9QSVRDSCwgU09VUkNFLCAgICAgIHNQaXRjaCkpOy8vZHByMTAKKwl9CisJZWxzZQorI2VuZGlmCisJeworCQl3cml0ZV9kcHIoYWNjZWwsREVfUElUQ0gsCisJCQkJRklFTERfVkFMVUUoMCwgREVfUElUQ0gsIERFU1RJTkFUSU9OLCAoZFBpdGNoL0JwcCkpIHwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9QSVRDSCwgU09VUkNFLCAgICAgIChzUGl0Y2gvQnBwKSkpOy8vZHByMTAKKwl9CisKKyAgICAvKiBTY3JlZW4gV2luZG93IHdpZHRoIGluIFBpeGVscy4KKyAgICAgICAyRCBlbmdpbmUgdXNlcyB0aGlzIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgbGluZWFyIGFkZHJlc3MgaW4gZnJhbWUgYnVmZmVyIGZvciBhIGdpdmVuIHBvaW50LgorICAgICovCisgICAgd3JpdGVfZHByKGFjY2VsLERFX1dJTkRPV19XSURUSCwKKyAgICAgICAgRklFTERfVkFMVUUoMCwgREVfV0lORE9XX1dJRFRILCBERVNUSU5BVElPTiwgKGRQaXRjaC9CcHApKSB8CisgICAgICAgIEZJRUxEX1ZBTFVFKDAsIERFX1dJTkRPV19XSURUSCwgU09VUkNFLCAgICAgIChzUGl0Y2gvQnBwKSkpOy8vZHByM2MKKworCWlmIChhY2NlbC0+ZGVfd2FpdCgpICE9IDApeworCQlyZXR1cm4gLTE7CisJfQorCisgICAgeworCisgICAgICAgIHdyaXRlX2RwcihhY2NlbCxERV9TT1VSQ0UsCisgICAgICAgICAgICBGSUVMRF9TRVQgICgwLCBERV9TT1VSQ0UsIFdSQVAsIERJU0FCTEUpIHwKKyAgICAgICAgICAgIEZJRUxEX1ZBTFVFKDAsIERFX1NPVVJDRSwgWF9LMSwgc3gpICAgfAorICAgICAgICAgICAgRklFTERfVkFMVUUoMCwgREVfU09VUkNFLCBZX0syLCBzeSkpOy8vZHByMAorICAgICAgICB3cml0ZV9kcHIoYWNjZWwsREVfREVTVElOQVRJT04sCisgICAgICAgICAgICBGSUVMRF9TRVQgICgwLCBERV9ERVNUSU5BVElPTiwgV1JBUCwgRElTQUJMRSkgfAorICAgICAgICAgICAgRklFTERfVkFMVUUoMCwgREVfREVTVElOQVRJT04sIFgsICAgIGR4KSAgfAorICAgICAgICAgICAgRklFTERfVkFMVUUoMCwgREVfREVTVElOQVRJT04sIFksICAgIGR5KSk7Ly9kcHIwNAorICAgICAgICB3cml0ZV9kcHIoYWNjZWwsREVfRElNRU5TSU9OLAorICAgICAgICAgICAgRklFTERfVkFMVUUoMCwgREVfRElNRU5TSU9OLCBYLCAgICB3aWR0aCkgfAorICAgICAgICAgICAgRklFTERfVkFMVUUoMCwgREVfRElNRU5TSU9OLCBZX0VULCBoZWlnaHQpKTsvL2RwcjA4CisKKyAgICAgICAgZGVfY3RybCA9CisgICAgICAgICAgICBGSUVMRF9WQUxVRSgwLCBERV9DT05UUk9MLCBST1AsIHJvcDIpIHwKKyAgICAgICAgICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBST1BfU0VMRUNULCBST1AyKSB8CisgICAgICAgICAgICBGSUVMRF9TRVQoMCwgREVfQ09OVFJPTCwgQ09NTUFORCwgQklUQkxUKSB8CisgICAgICAgICAgICAoKG5EaXJlY3Rpb24gPT0gUklHSFRfVE9fTEVGVCkgPworICAgICAgICAgICAgRklFTERfU0VUKDAsIERFX0NPTlRST0wsIERJUkVDVElPTiwgUklHSFRfVE9fTEVGVCkKKyAgICAgICAgICAgIDogRklFTERfU0VUKDAsIERFX0NPTlRST0wsIERJUkVDVElPTiwgTEVGVF9UT19SSUdIVCkpIHwKKyAgICAgICAgICAgIEZJRUxEX1NFVCgwLCBERV9DT05UUk9MLCBTVEFUVVMsIFNUQVJUKTsKKwkJd3JpdGVfZHByKGFjY2VsLERFX0NPTlRST0wsZGVfY3RybCk7Ly9kcHIwYworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRlR2V0VHJhbnNwYXJlbmN5KHN0cnVjdCBseW54X2FjY2VsICogYWNjZWwpCit7CisgICAgdW5zaWduZWQgaW50IGRlX2N0cmw7CisKKyAgICBkZV9jdHJsID0gcmVhZF9kcHIoYWNjZWwsREVfQ09OVFJPTCk7CisKKyAgICBkZV9jdHJsICY9CisgICAgICAgIEZJRUxEX01BU0soREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfTUFUQ0gpIHwKKyAgICAgICAgRklFTERfTUFTSyhERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9TRUxFQ1QpfAorICAgICAgICBGSUVMRF9NQVNLKERFX0NPTlRST0xfVFJBTlNQQVJFTkNZKTsKKworICAgIHJldHVybiBkZV9jdHJsOworfQorCitpbnQgaHdfaW1hZ2VibGl0KHN0cnVjdCBseW54X2FjY2VsICphY2NlbCwKKwkJIGNvbnN0IGNoYXIgKnBTcmNidWYsIC8qIHBvaW50ZXIgdG8gc3RhcnQgb2Ygc291cmNlIGJ1ZmZlciBpbiBzeXN0ZW0gbWVtb3J5ICovCisJCSB1MzIgc3JjRGVsdGEsICAgICAgICAgIC8qIFBpdGNoIHZhbHVlIChpbiBieXRlcykgb2YgdGhlIHNvdXJjZSBidWZmZXIsICtpdmUgbWVhbnMgdG9wIGRvd24gYW5kIC1pdmUgbWVhbiBidXR0b24gdXAgKi8KKwkJIHUzMiBzdGFydEJpdCwgLyogTW9ubyBkYXRhIGNhbiBzdGFydCBhdCBhbnkgYml0IGluIGEgYnl0ZSwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMCB0byA3ICovCisJCSB1MzIgZEJhc2UsICAgIC8qIEFkZHJlc3Mgb2YgZGVzdGluYXRpb246IG9mZnNldCBpbiBmcmFtZSBidWZmZXIgKi8KKwkJIHUzMiBkUGl0Y2gsICAgLyogUGl0Y2ggdmFsdWUgb2YgZGVzdGluYXRpb24gc3VyZmFjZSBpbiBCWVRFICovCisJCSB1MzIgYnl0ZVBlclBpeGVsLCAgICAgIC8qIENvbG9yIGRlcHRoIG9mIGRlc3RpbmF0aW9uIHN1cmZhY2UgKi8KKwkJIHUzMiBkeCwKKwkJIHUzMiBkeSwgICAgICAgLyogU3RhcnRpbmcgY29vcmRpbmF0ZSBvZiBkZXN0aW5hdGlvbiBzdXJmYWNlICovCisJCSB1MzIgd2lkdGgsCisJCSB1MzIgaGVpZ2h0LCAgIC8qIHdpZHRoIGFuZCBoZWlnaHQgb2YgcmVjdGFuZ2UgaW4gcGl4ZWwgdmFsdWUgKi8KKwkJIHUzMiBmQ29sb3IsICAgLyogRm9yZWdyb3VuZCBjb2xvciAoY29ycmVzcG9uZGluZyB0byBhIDEgaW4gdGhlIG1vbm9jaHJvbWUgZGF0YSAqLworCQkgdTMyIGJDb2xvciwgICAvKiBCYWNrZ3JvdW5kIGNvbG9yIChjb3JyZXNwb25kaW5nIHRvIGEgMCBpbiB0aGUgbW9ub2Nocm9tZSBkYXRhICovCisJCSB1MzIgcm9wMikgICAgIC8qIFJPUCB2YWx1ZSAqLworeworICAgIHVuc2lnbmVkIGludCB1bEJ5dGVzUGVyU2NhbjsKKyAgICB1bnNpZ25lZCBpbnQgdWw0Qnl0ZXNQZXJTY2FuOworICAgIHVuc2lnbmVkIGludCB1bEJ5dGVzUmVtYWluOworICAgIHVuc2lnbmVkIGludCBkZV9jdHJsID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyIGFqUmVtYWluWzRdOworICAgIGludCBpLCBqOworCisgICAgc3RhcnRCaXQgJj0gNzsgLyogSnVzdCBtYWtlIHN1cmUgdGhlIHN0YXJ0IGJpdCBpcyB3aXRoaW4gbGVnYWwgcmFuZ2UgKi8KKyAgICB1bEJ5dGVzUGVyU2NhbiA9ICh3aWR0aCArIHN0YXJ0Qml0ICsgNykgLyA4OworICAgIHVsNEJ5dGVzUGVyU2NhbiA9IHVsQnl0ZXNQZXJTY2FuICYgfjM7CisgICAgdWxCeXRlc1JlbWFpbiA9IHVsQnl0ZXNQZXJTY2FuICYgMzsKKworCWlmKGFjY2VsLT5kZV93YWl0KCkgIT0gMCkKKyAgICB7CisvLwkJaW5mX21zZygiKioqIEltYWdlQmxpdCByZXR1cm4gLTEgKioqXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIDJEIFNvdXJjZSBCYXNlLgorICAgICAgIFVzZSAwIGZvciBIT1NUIEJsdC4KKyAgICAqLworICAgIHdyaXRlX2RwcihhY2NlbCxERV9XSU5ET1dfU09VUkNFX0JBU0UsIDApOworCisgICAgLyogMkQgRGVzdGluYXRpb24gQmFzZS4KKyAgICAgICBJdCBpcyBhbiBhZGRyZXNzIG9mZnNldCAoMTI4IGJpdCBhbGlnbmVkKSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZnJhbWUgYnVmZmVyLgorICAgICovCisgICAgd3JpdGVfZHByKGFjY2VsLERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFLCBkQmFzZSk7CisjaWYgMAorICAgIC8qIFByb2dyYW0gcGl0Y2ggKGRpc3RhbmNlIGJldHdlZW4gdGhlIDFzdCBwb2ludHMgb2YgdHdvIGFkamFjZW50IGxpbmVzKS4KKyAgICAgICBOb3RlIHRoYXQgaW5wdXQgcGl0Y2ggaXMgQllURSB2YWx1ZSwgYnV0IHRoZSAyRCBQaXRjaCByZWdpc3RlciB1c2VzCisgICAgICAgcGl4ZWwgdmFsdWVzLiBOZWVkIEJ5dGUgdG8gcGl4ZWwgY29udmVydGlvbi4KKyAgICAqLworCWlmKGJ5dGVQZXJQaXhlbCA9PSAzICl7CisJCWR4ICo9IDM7CisJCXdpZHRoICo9IDM7CisJCXN0YXJ0Qml0ICo9IDM7CisJCXdyaXRlX2RwcihhY2NlbCxERV9QSVRDSCwKKwkJCQlGSUVMRF9WQUxVRSgwLCBERV9QSVRDSCwgREVTVElOQVRJT04sIGRQaXRjaCkgfAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX1BJVENILCBTT1VSQ0UsICAgICAgZFBpdGNoKSk7Ly9kcHIxMAorCisJfQorCWVsc2UKKyNlbmRpZgorCXsKKwkJd3JpdGVfZHByKGFjY2VsLERFX1BJVENILAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX1BJVENILCBERVNUSU5BVElPTiwgZFBpdGNoL2J5dGVQZXJQaXhlbCkgfAorCQkJCUZJRUxEX1ZBTFVFKDAsIERFX1BJVENILCBTT1VSQ0UsICAgICAgZFBpdGNoL2J5dGVQZXJQaXhlbCkpOy8vZHByMTAKKwl9CisKKyAgICAvKiBTY3JlZW4gV2luZG93IHdpZHRoIGluIFBpeGVscy4KKyAgICAgICAyRCBlbmdpbmUgdXNlcyB0aGlzIHZhbHVlIHRvIGNhbGN1bGF0ZSB0aGUgbGluZWFyIGFkZHJlc3MgaW4gZnJhbWUgYnVmZmVyIGZvciBhIGdpdmVuIHBvaW50LgorICAgICovCisgICAgd3JpdGVfZHByKGFjY2VsLERFX1dJTkRPV19XSURUSCwKKyAgICAgICAgRklFTERfVkFMVUUoMCwgREVfV0lORE9XX1dJRFRILCBERVNUSU5BVElPTiwgKGRQaXRjaC9ieXRlUGVyUGl4ZWwpKSB8CisgICAgICAgIEZJRUxEX1ZBTFVFKDAsIERFX1dJTkRPV19XSURUSCwgU09VUkNFLCAgICAgIChkUGl0Y2gvYnl0ZVBlclBpeGVsKSkpOworCisgICAgLyogTm90ZTogRm9yIDJEIFNvdXJjZSBpbiBIb3N0IFdyaXRlLCBvbmx5IFhfSzFfTU9OTyBmaWVsZCBpcyBuZWVkZWQsIGFuZCBZX0syIGZpZWxkIGlzIG5vdCB1c2VkLgorICAgICAgICAgICAgIEZvciBtb25vIGJpdG1hcCwgdXNlIHN0YXJ0Qml0IGZvciBYX0sxLiAqLworICAgIHdyaXRlX2RwcihhY2NlbCxERV9TT1VSQ0UsCisgICAgICAgIEZJRUxEX1NFVCAgKDAsIERFX1NPVVJDRSwgV1JBUCwgRElTQUJMRSkgICAgICAgfAorICAgICAgICBGSUVMRF9WQUxVRSgwLCBERV9TT1VSQ0UsIFhfSzFfTU9OTywgc3RhcnRCaXQpKTsvL2RwcjAwCisKKyAgICB3cml0ZV9kcHIoYWNjZWwsREVfREVTVElOQVRJT04sCisgICAgICAgIEZJRUxEX1NFVCAgKDAsIERFX0RFU1RJTkFUSU9OLCBXUkFQLCBESVNBQkxFKSB8CisgICAgICAgIEZJRUxEX1ZBTFVFKDAsIERFX0RFU1RJTkFUSU9OLCBYLCAgICBkeCkgICAgfAorICAgICAgICBGSUVMRF9WQUxVRSgwLCBERV9ERVNUSU5BVElPTiwgWSwgICAgZHkpKTsvL2RwcjA0CisKKyAgICB3cml0ZV9kcHIoYWNjZWwsREVfRElNRU5TSU9OLAorICAgICAgICBGSUVMRF9WQUxVRSgwLCBERV9ESU1FTlNJT04sIFgsICAgIHdpZHRoKSB8CisgICAgICAgIEZJRUxEX1ZBTFVFKDAsIERFX0RJTUVOU0lPTiwgWV9FVCwgaGVpZ2h0KSk7Ly9kcHIwOAorCisgICAgd3JpdGVfZHByKGFjY2VsLERFX0ZPUkVHUk9VTkQsIGZDb2xvcik7CisgICAgd3JpdGVfZHByKGFjY2VsLERFX0JBQ0tHUk9VTkQsIGJDb2xvcik7CisKKwlkZV9jdHJsID0gRklFTERfVkFMVUUoMCwgREVfQ09OVFJPTCwgUk9QLCByb3AyKSAgICAgICAgIHwKKwkJRklFTERfU0VUKDAsIERFX0NPTlRST0wsIFJPUF9TRUxFQ1QsIFJPUDIpICAgIHwKKwkJRklFTERfU0VUKDAsIERFX0NPTlRST0wsIENPTU1BTkQsIEhPU1RfV1JJVEUpIHwKKwkJRklFTERfU0VUKDAsIERFX0NPTlRST0wsIEhPU1QsIE1PTk8pICAgICAgICAgIHwKKwkJRklFTERfU0VUKDAsIERFX0NPTlRST0wsIFNUQVRVUywgU1RBUlQpOworCisJd3JpdGVfZHByKGFjY2VsLERFX0NPTlRST0wsIGRlX2N0cmwgfCBkZUdldFRyYW5zcGFyZW5jeShhY2NlbCkpOworCisgICAgLyogV3JpdGUgTU9OTyBkYXRhIChsaW5lIGJ5IGxpbmUpIHRvIDJEIEVuZ2luZSBkYXRhIHBvcnQgKi8KKyAgICBmb3IgKGk9MDsgaTxoZWlnaHQ7IGkrKykKKyAgICB7CisgICAgICAgIC8qIEZvciBlYWNoIGxpbmUsIHNlbmQgdGhlIGRhdGEgaW4gY2h1bmtzIG9mIDQgYnl0ZXMgKi8KKyAgICAgICAgZm9yIChqPTA7IGo8KHVsNEJ5dGVzUGVyU2Nhbi80KTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICB3cml0ZV9kcFBvcnQoYWNjZWwsICoodW5zaWduZWQgaW50ICopKHBTcmNidWYgKyAoaiAqIDQpKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodWxCeXRlc1JlbWFpbikKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KGFqUmVtYWluLCBwU3JjYnVmK3VsNEJ5dGVzUGVyU2NhbiwgdWxCeXRlc1JlbWFpbik7CisgICAgICAgICAgICB3cml0ZV9kcFBvcnQoYWNjZWwsICoodW5zaWduZWQgaW50ICopYWpSZW1haW4pOworICAgICAgICB9CisKKyAgICAgICAgcFNyY2J1ZiArPSBzcmNEZWx0YTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfYWNjZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2FjY2VsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VlMGJkOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2FjY2VsLmgKQEAgLTAsMCArMSwyNzUgQEAKKyNpZm5kZWYgQUNDRUxfSF9fCisjZGVmaW5lIEFDQ0VMX0hfXworCisjZGVmaW5lIEhXX1JPUDJfQ09QWSAweGMKKyNkZWZpbmUgSFdfUk9QMl9YT1IgMHg2CisKKy8qIG5vdGVzOiBiZWxvdyBhZGRyZXNzIGFyZSB0aGUgb2Zmc2V0IHZhbHVlIGZyb20gZGVfYmFzZV9hZGRyZXNzICgweDEwMDAwMCkqLworCisvKiBmb3Igc203MTgvNzUwLzUwMiBkZV9iYXNlIGlzIGF0IG1tcmVnXzFtYiovCisjZGVmaW5lIERFX0JBU0VfQUREUl9UWVBFMSAJMHgxMDAwMDAKKy8qIGZvciBzbTcxMixkZV9iYXNlIGlzIGF0IG1tcmVnXzMya2IgKi8KKyNkZWZpbmUgREVfQkFTRV9BRERSX1RZUEUyICAweDgwMDAKKy8qIGZvciBzbTcyMixkZV9iYXNlIGlzIGF0IG1tcmVnXzAgKi8KKyNkZWZpbmUgREVfQkFTRV9BRERSX1RZUEUzIDAKKworLyogdHlwZTEgZGF0YSBwb3J0IGFkZHJlc3MgaXMgYXQgbW1yZWdfMHgxMTAwMDAqLworI2RlZmluZSBERV9QT1JUX0FERFJfVFlQRTEgMHgxMTAwMDAKKy8qIGZvciBzbTcxMixkYXRhIHBvcnQgYWRkcmVzcyBpcyBhdCBtbXJlZ18wICovCisjZGVmaW5lIERFX1BPUlRfQUREUl9UWVBFMiAweDEwMDAwMAorLyogZm9yIHNtNzIyLGRhdGEgcG9ydCBhZGRyZXNzIGlzIGF0IG1tcmVnXzFtYiAqLworI2RlZmluZSBERV9QT1JUX0FERFJfVFlQRTMgMHgxMDAwMDAKKworI2RlZmluZSBERV9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgREVfU09VUkNFX1dSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgREVfU09VUkNFX1dSQVBfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TT1VSQ0VfV1JBUF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX1NPVVJDRV9YX0sxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OjE2CisjZGVmaW5lIERFX1NPVVJDRV9ZX0syICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKyNkZWZpbmUgREVfU09VUkNFX1hfSzFfTU9OTyAJCQkJCQkJMjA6MTYKKworI2RlZmluZSBERV9ERVNUSU5BVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgREVfREVTVElOQVRJT05fV1JBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MzEKKyNkZWZpbmUgREVfREVTVElOQVRJT05fV1JBUF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9ERVNUSU5BVElPTl9XUkFQX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0RFU1RJTkFUSU9OX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OjE2CisjZGVmaW5lIERFX0RFU1RJTkFUSU9OX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBERV9ESU1FTlNJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgREVfRElNRU5TSU9OX1ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg6MTYKKyNkZWZpbmUgREVfRElNRU5TSU9OX1lfRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MAorCisjZGVmaW5lIERFX0NPTlRST0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QworI2RlZmluZSBERV9DT05UUk9MX1NUQVRVUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTozMQorI2RlZmluZSBERV9DT05UUk9MX1NUQVRVU19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfU1RBVFVTX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9QQVRURVJOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA6MzAKKyNkZWZpbmUgREVfQ09OVFJPTF9QQVRURVJOX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1BBVFRFUk5fQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfVVBEQVRFX0RFU1RJTkFUSU9OX1ggICAgICAgICAgICAgICAgIDI5OjI5CisjZGVmaW5lIERFX0NPTlRST0xfVVBEQVRFX0RFU1RJTkFUSU9OX1hfRElTQUJMRSAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9VUERBVEVfREVTVElOQVRJT05fWF9FTkFCTEUgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1FVSUNLX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAyODoyOAorI2RlZmluZSBERV9DT05UUk9MX1FVSUNLX1NUQVJUX0RJU0FCTEUgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfUVVJQ0tfU1RBUlRfRU5BQkxFICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9ESVJFQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgREVfQ09OVFJPTF9ESVJFQ1RJT05fTEVGVF9UT19SSUdIVCAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX0RJUkVDVElPTl9SSUdIVF9UT19MRUZUICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfTUFKT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI2OjI2CisjZGVmaW5lIERFX0NPTlRST0xfTUFKT1JfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9NQUpPUl9ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1NURVBfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNToyNQorI2RlZmluZSBERV9DT05UUk9MX1NURVBfWF9QT1NJVElWRSAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfU1RFUF9YX05FR0FUSVZFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9TVEVQX1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ6MjQKKyNkZWZpbmUgREVfQ09OVFJPTF9TVEVQX1lfUE9TSVRJVkUgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1NURVBfWV9ORUdBVElWRSAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfU1RSRVRDSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzOjIzCisjZGVmaW5lIERFX0NPTlRST0xfU1RSRVRDSF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9TVFJFVENIX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX0hPU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjoyMgorI2RlZmluZSBERV9DT05UUk9MX0hPU1RfQ09MT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfSE9TVF9NT05PICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9MQVNUX1BJWEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgMjE6MjEKKyNkZWZpbmUgREVfQ09OVFJPTF9MQVNUX1BJWEVMX09GRiAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX0xBU1RfUElYRUxfT04gICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOjE2CisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9CSVRCTFQgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX1JFQ1RBTkdMRV9GSUxMICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfREVfVElMRSAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9UUkFQRVpPSURfRklMTCAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0FMUEhBX0JMRU5EICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfUkxFX1NUUklQICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9TSE9SVF9TVFJPS0UgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0xJTkVfRFJBVyAgICAgICAgICAgICAgICAgICAgNworI2RlZmluZSBERV9DT05UUk9MX0NPTU1BTkRfSE9TVF9XUklURSAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIERFX0NPTlRST0xfQ09NTUFORF9IT1NUX1JFQUQgICAgICAgICAgICAgICAgICAgIDkKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0hPU1RfV1JJVEVfQk9UVE9NX1VQICAgICAgICAgMTAKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX1JPVEFURSAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX0ZPTlQgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNkZWZpbmUgREVfQ09OVFJPTF9DT01NQU5EX1RFWFRVUkVfTE9BRCAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1BfU0VMRUNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU6MTUKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1BfU0VMRUNUX1JPUDMgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1JPUF9TRUxFQ1RfUk9QMiAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfUk9QMl9TT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIDE0OjE0CisjZGVmaW5lIERFX0NPTlRST0xfUk9QMl9TT1VSQ0VfQklUTUFQICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1AyX1NPVVJDRV9QQVRURVJOICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX01PTk9fREFUQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzoxMgorI2RlZmluZSBERV9DT05UUk9MX01PTk9fREFUQV9OT1RfUEFDS0VEICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfTU9OT19EQVRBXzhfUEFDS0VEICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9NT05PX0RBVEFfMTZfUEFDS0VEICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBERV9DT05UUk9MX01PTk9fREFUQV8zMl9QQUNLRUQgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIERFX0NPTlRST0xfUkVQRUFUX1JPVEFURSAgICAgICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIERFX0NPTlRST0xfUkVQRUFUX1JPVEFURV9ESVNBQkxFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9SRVBFQVRfUk9UQVRFX0VOQUJMRSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9NQVRDSCAgICAgICAgICAgICAgICAgICAxMDoxMAorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9NQVRDSF9PUEFRVUUgICAgICAgICAgICAwCisjZGVmaW5lIERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX01BVENIX1RSQU5TUEFSRU5UICAgICAgIDEKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfU0VMRUNUICAgICAgICAgICAgICAgICAgOTo5CisjZGVmaW5lIERFX0NPTlRST0xfVFJBTlNQQVJFTkNZX1NFTEVDVF9TT1VSQ0UgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfU0VMRUNUX0RFU1RJTkFUSU9OICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWSAgICAgICAgICAgICAgICAgICAgICAgICA4OjgKKyNkZWZpbmUgREVfQ09OVFJPTF9UUkFOU1BBUkVOQ1lfRElTQUJMRSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1RSQU5TUEFSRU5DWV9FTkFCTEUgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfUk9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisvLyBQc2V1ZG8gZmllbGRzLgorCisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUiAgICAgICAgICAgICAgICAgICAgIDI3OjI0CisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl8yMjUgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzEzNSAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfMzE1ICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl80NSAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzI3MCAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBERV9DT05UUk9MX1NIT1JUX1NUUk9LRV9ESVJfOTAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIERFX0NPTlRST0xfU0hPUlRfU1RST0tFX0RJUl8xODAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgREVfQ09OVFJPTF9TSE9SVF9TVFJPS0VfRElSXzAgICAgICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1RBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU6MjQKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1RBVElPTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DT05UUk9MX1JPVEFUSU9OXzI3MCAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NPTlRST0xfUk9UQVRJT05fOTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgREVfQ09OVFJPTF9ST1RBVElPTl8xODAgICAgICAgICAgICAgICAgICAgICAgICAgMworCisjZGVmaW5lIERFX1BJVENIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwCisjZGVmaW5lIERFX1BJVENIX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OjE2CisjZGVmaW5lIERFX1BJVENIX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOjAKKworI2RlZmluZSBERV9GT1JFR1JPVU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxNAorI2RlZmluZSBERV9GT1JFR1JPVU5EX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTowCisKKyNkZWZpbmUgREVfQkFDS0dST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTgKKyNkZWZpbmUgREVfQkFDS0dST1VORF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MAorCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDFDCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BBVFRFUk5fWFkgICAgICAgICAgICAgICAgICAgIDMwOjMwCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BBVFRFUk5fWFlfTk9STUFMICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfUEFUVEVSTl9YWV9PVkVSV1JJVEUgICAgICAgICAgMQorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QQVRURVJOX1kgICAgICAgICAgICAgICAgICAgICAyOToyNworI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QQVRURVJOX1ggICAgICAgICAgICAgICAgICAgICAyNToyMworI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QSVhFTF9GT1JNQVQgICAgICAgICAgICAgICAgICAyMToyMAorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QSVhFTF9GT1JNQVRfOCAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUUkVUQ0hfRk9STUFUX1BJWEVMX0ZPUk1BVF8xNiAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfUElYRUxfRk9STUFUXzMyICAgICAgICAgICAgICAgMgorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9QSVhFTF9GT1JNQVRfMjQgICAgICAgICAgICAgICAzCisKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfQUREUkVTU0lORyAgICAgICAgICAgICAgICAgICAgMTk6MTYKKyNkZWZpbmUgREVfU1RSRVRDSF9GT1JNQVRfQUREUkVTU0lOR19YWSAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9BRERSRVNTSU5HX0xJTkVBUiAgICAgICAgICAgICAxNQorI2RlZmluZSBERV9TVFJFVENIX0ZPUk1BVF9TT1VSQ0VfSEVJR0hUICAgICAgICAgICAgICAgICAxMTowCisKKyNkZWZpbmUgREVfQ09MT1JfQ09NUEFSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAKKyNkZWZpbmUgREVfQ09MT1JfQ09NUEFSRV9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgMjM6MAorCisjZGVmaW5lIERFX0NPTE9SX0NPTVBBUkVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDI0CisjZGVmaW5lIERFX0NPTE9SX0NPTVBBUkVfTUFTS19NQVNLUyAgICAgICAgICAgICAgICAgICAgIDIzOjAKKworI2RlZmluZSBERV9NQVNLUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyOAorI2RlZmluZSBERV9NQVNLU19CWVRFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMToxNgorI2RlZmluZSBERV9NQVNLU19CSVRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTowCisKKyNkZWZpbmUgREVfQ0xJUF9UTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMkMKKyNkZWZpbmUgREVfQ0xJUF9UTF9UT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgREVfQ0xJUF9UTF9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM6MTMKKyNkZWZpbmUgREVfQ0xJUF9UTF9TVEFUVVNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9DTElQX1RMX1NUQVRVU19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIERFX0NMSVBfVExfSU5ISUJJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyOjEyCisjZGVmaW5lIERFX0NMSVBfVExfSU5ISUJJVF9PVVRTSURFICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfQ0xJUF9UTF9JTkhJQklUX0lOU0lERSAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9DTElQX1RMX0xFRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTowCisKKyNkZWZpbmUgREVfQ0xJUF9CUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMzAKKyNkZWZpbmUgREVfQ0xJUF9CUl9CT1RUT00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE6MTYKKyNkZWZpbmUgREVfQ0xJUF9CUl9SSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MAorCisjZGVmaW5lIERFX01PTk9fUEFUVEVSTl9MT1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDM0CisjZGVmaW5lIERFX01PTk9fUEFUVEVSTl9MT1dfUEFUVEVSTiAgICAgICAgICAgICAgICAgICAgIDMxOjAKKworI2RlZmluZSBERV9NT05PX1BBVFRFUk5fSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzOAorI2RlZmluZSBERV9NT05PX1BBVFRFUk5fSElHSF9QQVRURVJOICAgICAgICAgICAgICAgICAgICAzMTowCisKKyNkZWZpbmUgREVfV0lORE9XX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwM0MKKyNkZWZpbmUgREVfV0lORE9XX1dJRFRIX0RFU1RJTkFUSU9OICAgICAgICAgICAgICAgICAgICAgMjg6MTYKKyNkZWZpbmUgREVfV0lORE9XX1dJRFRIX1NPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTI6MAorCisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwCisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRV9FWFQgICAgICAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRV9FWFRfTE9DQUwgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFX0VYVF9FWFRFUk5BTCAgICAgICAgICAgICAgMQorI2RlZmluZSBERV9XSU5ET1dfU09VUkNFX0JBU0VfQ1MgICAgICAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBERV9XSU5ET1dfU09VUkNFX0JBU0VfQ1NfMCAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1dJTkRPV19TT1VSQ0VfQkFTRV9DU18xICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfV0lORE9XX1NPVVJDRV9CQVNFX0FERFJFU1MgICAgICAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQ0CisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0VYVCAgICAgICAgICAgICAgICAgIDI3OjI3CisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0VYVF9MT0NBTCAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0VfRVhUX0VYVEVSTkFMICAgICAgICAgMQorI2RlZmluZSBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRV9DUyAgICAgICAgICAgICAgICAgICAyNjoyNgorI2RlZmluZSBERV9XSU5ET1dfREVTVElOQVRJT05fQkFTRV9DU18wICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1dJTkRPV19ERVNUSU5BVElPTl9CQVNFX0NTXzEgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfV0lORE9XX0RFU1RJTkFUSU9OX0JBU0VfQUREUkVTUyAgICAgICAgICAgICAgMjU6MAorCisjZGVmaW5lIERFX0FMUEhBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQ4CisjZGVmaW5lIERFX0FMUEhBX1ZBTFVFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc6MAorCisjZGVmaW5lIERFX1dSQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDRDCisjZGVmaW5lIERFX1dSQVBfWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIERFX1dSQVBfWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBERV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA1MAorI2RlZmluZSBERV9TVEFUVVNfQ1NDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOjEKKyNkZWZpbmUgREVfU1RBVFVTX0NTQ19DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVEFUVVNfQ1NDX05PVF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIERFX1NUQVRVU19DU0NfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVfU1RBVFVTXzJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDowCisjZGVmaW5lIERFX1NUQVRVU18yRF9DTEVBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgREVfU1RBVFVTXzJEX05PVF9BQ1RJVkUgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBERV9TVEFUVVNfMkRfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKworCisvKiBibHQgZGlyZWN0aW9uICovCisjZGVmaW5lIFRPUF9UT19CT1RUT00gMAorI2RlZmluZSBMRUZUX1RPX1JJR0hUIDAKKyNkZWZpbmUgQk9UVE9NX1RPX1RPUCAxCisjZGVmaW5lIFJJR0hUX1RPX0xFRlQgMQorCit2b2lkIGh3X3NldDJkZm9ybWF0KHN0cnVjdCBseW54X2FjY2VsICogYWNjZWwsaW50IGZtdCk7CisKK3ZvaWQgaHdfZGVfaW5pdChzdHJ1Y3QgbHlueF9hY2NlbCAqIGFjY2VsKTsKKworaW50IGh3X2ZpbGxyZWN0KHN0cnVjdCBseW54X2FjY2VsICogYWNjZWwsCisJCQkJdTMyIGJhc2UsdTMyIHBpdGNoLHUzMiBCcHAsCisJCQkJdTMyIHgsdTMyIHksdTMyIHdpZHRoLHUzMiBoZWlnaHQsCisJCQkJdTMyIGNvbG9yLHUzMiByb3ApOworCitpbnQgaHdfY29weWFyZWEoCitzdHJ1Y3QgbHlueF9hY2NlbCAqIGFjY2VsLAordW5zaWduZWQgaW50IHNCYXNlLCAgLyogQWRkcmVzcyBvZiBzb3VyY2U6IG9mZnNldCBpbiBmcmFtZSBidWZmZXIgKi8KK3Vuc2lnbmVkIGludCBzUGl0Y2gsIC8qIFBpdGNoIHZhbHVlIG9mIHNvdXJjZSBzdXJmYWNlIGluIEJZVEUgKi8KK3Vuc2lnbmVkIGludCBzeCwKK3Vuc2lnbmVkIGludCBzeSwgICAgIC8qIFN0YXJ0aW5nIGNvb3JkaW5hdGUgb2Ygc291cmNlIHN1cmZhY2UgKi8KK3Vuc2lnbmVkIGludCBkQmFzZSwgIC8qIEFkZHJlc3Mgb2YgZGVzdGluYXRpb246IG9mZnNldCBpbiBmcmFtZSBidWZmZXIgKi8KK3Vuc2lnbmVkIGludCBkUGl0Y2gsIC8qIFBpdGNoIHZhbHVlIG9mIGRlc3RpbmF0aW9uIHN1cmZhY2UgaW4gQllURSAqLwordW5zaWduZWQgaW50IGJwcCwgICAgLyogQ29sb3IgZGVwdGggb2YgZGVzdGluYXRpb24gc3VyZmFjZSAqLwordW5zaWduZWQgaW50IGR4LAordW5zaWduZWQgaW50IGR5LCAgICAgLyogU3RhcnRpbmcgY29vcmRpbmF0ZSBvZiBkZXN0aW5hdGlvbiBzdXJmYWNlICovCit1bnNpZ25lZCBpbnQgd2lkdGgsCit1bnNpZ25lZCBpbnQgaGVpZ2h0LCAvKiB3aWR0aCBhbmQgaGVpZ2h0IG9mIHJlY3RhbmdsZSBpbiBwaXhlbCB2YWx1ZSAqLwordW5zaWduZWQgaW50IHJvcDIpOworCitpbnQgaHdfaW1hZ2VibGl0KHN0cnVjdCBseW54X2FjY2VsICphY2NlbCwKKwkJIGNvbnN0IGNoYXIgKnBTcmNidWYsIC8qIHBvaW50ZXIgdG8gc3RhcnQgb2Ygc291cmNlIGJ1ZmZlciBpbiBzeXN0ZW0gbWVtb3J5ICovCisJCSB1MzIgc3JjRGVsdGEsICAgICAgICAgIC8qIFBpdGNoIHZhbHVlIChpbiBieXRlcykgb2YgdGhlIHNvdXJjZSBidWZmZXIsICtpdmUgbWVhbnMgdG9wIGRvd24gYW5kIC1pdmUgbWVhbiBidXR0b24gdXAgKi8KKwkJIHUzMiBzdGFydEJpdCwgLyogTW9ubyBkYXRhIGNhbiBzdGFydCBhdCBhbnkgYml0IGluIGEgYnl0ZSwgdGhpcyB2YWx1ZSBzaG91bGQgYmUgMCB0byA3ICovCisJCSB1MzIgZEJhc2UsICAgIC8qIEFkZHJlc3Mgb2YgZGVzdGluYXRpb246IG9mZnNldCBpbiBmcmFtZSBidWZmZXIgKi8KKwkJIHUzMiBkUGl0Y2gsICAgLyogUGl0Y2ggdmFsdWUgb2YgZGVzdGluYXRpb24gc3VyZmFjZSBpbiBCWVRFICovCisJCSB1MzIgYnl0ZVBlclBpeGVsLCAgICAgIC8qIENvbG9yIGRlcHRoIG9mIGRlc3RpbmF0aW9uIHN1cmZhY2UgKi8KKwkJIHUzMiBkeCwKKwkJIHUzMiBkeSwgICAgICAgLyogU3RhcnRpbmcgY29vcmRpbmF0ZSBvZiBkZXN0aW5hdGlvbiBzdXJmYWNlICovCisJCSB1MzIgd2lkdGgsCisJCSB1MzIgaGVpZ2h0LCAgIC8qIHdpZHRoIGFuZCBoZWlnaHQgb2YgcmVjdGFuZ2UgaW4gcGl4ZWwgdmFsdWUgKi8KKwkJIHUzMiBmQ29sb3IsICAgLyogRm9yZWdyb3VuZCBjb2xvciAoY29ycmVzcG9uZGluZyB0byBhIDEgaW4gdGhlIG1vbm9jaHJvbWUgZGF0YSAqLworCQkgdTMyIGJDb2xvciwgICAvKiBCYWNrZ3JvdW5kIGNvbG9yIChjb3JyZXNwb25kaW5nIHRvIGEgMCBpbiB0aGUgbW9ub2Nocm9tZSBkYXRhICovCisJCSB1MzIgcm9wMik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2N1cnNvci5jIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfY3Vyc29yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkNWNiYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2N1cnNvci5jCkBAIC0wLDAgKzEsMjUxIEBACisjaW5jbHVkZTxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGU8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGU8bGludXgvbW0uaD4KKyNpbmNsdWRlPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZTxsaW51eC9mYi5oPgorI2luY2x1ZGU8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZTxsaW51eC9pbml0Lmg+CisjaW5jbHVkZTxsaW51eC9wY2kuaD4KKyNpbmNsdWRlPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25zb2xlLmg+CisjaW5jbHVkZTxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlPGxpbnV4L3NjcmVlbl9pbmZvLmg+CisKKyNpbmNsdWRlICJzbTc1MC5oIgorI2luY2x1ZGUgInNtNzUwX2hlbHAuaCIKKyNpbmNsdWRlICJzbTc1MF9jdXJzb3IuaCIKKworCisjZGVmaW5lIFBFRUszMihhZGRyKSBcCityZWFkbChjdXJzb3ItPm1taW8gKyAoYWRkcikpCisKKyNkZWZpbmUgUE9LRTMyKGFkZHIsZGF0YSkgXAord3JpdGVsKChkYXRhKSxjdXJzb3ItPm1taW8gKyAoYWRkcikpCisKKy8qIGN1cnNvciBjb250cm9sIGZvciB2b3lhZ2VyIGFuZCA3MTgvNzUwKi8KKyNkZWZpbmUgSFdDX0FERFJFU1MgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lIEhXQ19BRERSRVNTX0VOQUJMRSAgICAgICAgICAgICAgICAgIDMxOjMxCisjZGVmaW5lIEhXQ19BRERSRVNTX0VOQUJMRV9ESVNBQkxFICAgICAgICAgIDAKKyNkZWZpbmUgSFdDX0FERFJFU1NfRU5BQkxFX0VOQUJMRSAgICAgICAgICAgMQorI2RlZmluZSBIV0NfQUREUkVTU19FWFQgICAgICAgICAgICAgICAgICAgICAyNzoyNworI2RlZmluZSBIV0NfQUREUkVTU19FWFRfTE9DQUwgICAgICAgICAgICAgICAwCisjZGVmaW5lIEhXQ19BRERSRVNTX0VYVF9FWFRFUk5BTCAgICAgICAgICAgIDEKKyNkZWZpbmUgSFdDX0FERFJFU1NfQ1MgICAgICAgICAgICAgICAgICAgICAgMjY6MjYKKyNkZWZpbmUgSFdDX0FERFJFU1NfQ1NfMCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBIV0NfQUREUkVTU19DU18xICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEhXQ19BRERSRVNTX0FERFJFU1MgICAgICAgICAgICAgICAgIDI1OjAKKworI2RlZmluZSBIV0NfTE9DQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgSFdDX0xPQ0FUSU9OX1RPUCAgICAgICAgICAgICAgICAgICAgMjc6MjcKKyNkZWZpbmUgSFdDX0xPQ0FUSU9OX1RPUF9JTlNJREUgICAgICAgICAgICAgMAorI2RlZmluZSBIV0NfTE9DQVRJT05fVE9QX09VVFNJREUgICAgICAgICAgICAxCisjZGVmaW5lIEhXQ19MT0NBVElPTl9ZICAgICAgICAgICAgICAgICAgICAgIDI2OjE2CisjZGVmaW5lIEhXQ19MT0NBVElPTl9MRUZUICAgICAgICAgICAgICAgICAgIDExOjExCisjZGVmaW5lIEhXQ19MT0NBVElPTl9MRUZUX0lOU0lERSAgICAgICAgICAgIDAKKyNkZWZpbmUgSFdDX0xPQ0FUSU9OX0xFRlRfT1VUU0lERSAgICAgICAgICAgMQorI2RlZmluZSBIV0NfTE9DQVRJT05fWCAgICAgICAgICAgICAgICAgICAgICAxMDowCisKKyNkZWZpbmUgSFdDX0NPTE9SXzEyICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lIEhXQ19DT0xPUl8xMl8yX1JHQjU2NSAgICAgICAgICAgICAgIDMxOjE2CisjZGVmaW5lIEhXQ19DT0xPUl8xMl8xX1JHQjU2NSAgICAgICAgICAgICAgIDE1OjAKKworI2RlZmluZSBIV0NfQ09MT1JfMyAgICAgICAgICAgICAgICAgICAgICAgICAweEMKKyNkZWZpbmUgSFdDX0NPTE9SXzNfUkdCNTY1ICAgICAgICAgICAgICAgICAgMTU6MAorCisKKy8qIGh3X2N1cnNvcl94eHggd29ya3MgZm9yIHZveWFnZXIsNzE4IGFuZCA3NTAgKi8KK3ZvaWQgaHdfY3Vyc29yX2VuYWJsZShzdHJ1Y3QgbHlueF9jdXJzb3IgKiBjdXJzb3IpCit7CisJdTMyIHJlZzsKKwlyZWcgPSBGSUVMRF9WQUxVRSgwLEhXQ19BRERSRVNTLEFERFJFU1MsY3Vyc29yLT5vZmZzZXQpfAorCQkJRklFTERfU0VUKDAsSFdDX0FERFJFU1MsRVhULExPQ0FMKXwKKwkJCUZJRUxEX1NFVCgwLEhXQ19BRERSRVNTLEVOQUJMRSxFTkFCTEUpOworCVBPS0UzMihIV0NfQUREUkVTUyxyZWcpOworfQordm9pZCBod19jdXJzb3JfZGlzYWJsZShzdHJ1Y3QgbHlueF9jdXJzb3IgKiBjdXJzb3IpCit7CisJUE9LRTMyKEhXQ19BRERSRVNTLDApOworfQorCit2b2lkIGh3X2N1cnNvcl9zZXRTaXplKHN0cnVjdCBseW54X2N1cnNvciAqIGN1cnNvciwKKwkJCQkJCWludCB3LGludCBoKQoreworCWN1cnNvci0+dyA9IHc7CisJY3Vyc29yLT5oID0gaDsKK30KK3ZvaWQgaHdfY3Vyc29yX3NldFBvcyhzdHJ1Y3QgbHlueF9jdXJzb3IgKiBjdXJzb3IsCisJCQkJCQlpbnQgeCxpbnQgeSkKK3sKKwl1MzIgcmVnOworCXJlZyA9IEZJRUxEX1ZBTFVFKDAsSFdDX0xPQ0FUSU9OLFkseSl8CisJCQlGSUVMRF9WQUxVRSgwLEhXQ19MT0NBVElPTixYLHgpOworCVBPS0UzMihIV0NfTE9DQVRJT04scmVnKTsKK30KK3ZvaWQgaHdfY3Vyc29yX3NldENvbG9yKHN0cnVjdCBseW54X2N1cnNvciAqIGN1cnNvciwKKwkJCQkJCXUzMiBmZyx1MzIgYmcpCit7CisJUE9LRTMyKEhXQ19DT0xPUl8xMiwoZmc8PDE2KXwoYmcmMHhmZmZmKSk7CisJUE9LRTMyKEhXQ19DT0xPUl8zLDB4ZmZlMCk7Cit9CisKK3ZvaWQgaHdfY3Vyc29yX3NldERhdGEoc3RydWN0IGx5bnhfY3Vyc29yICogY3Vyc29yLAorCQkJdTE2IHJvcCxjb25zdCB1OCogcGNvbCxjb25zdCB1OCogcG1zaykKK3sKKwlpbnQgaSxqLGNvdW50LHBpdGNoLG9mZnNldDsKKwl1OCBjb2xvcixtYXNrLG9wcjsKKwl1MTYgZGF0YTsKKwl2b2lkIF9faW9tZW0gKnBidWZmZXIsICpwc3RhcnQ7CisKKwkvKiAgaW4gYnl0ZSovCisJcGl0Y2ggPSBjdXJzb3ItPncgPj4gMzsKKworCS8qIGluIGJ5dGUJKi8KKwljb3VudCA9IHBpdGNoICogY3Vyc29yLT5oOworCisJLyogaW4gYnl0ZSAqLworCW9mZnNldCA9IGN1cnNvci0+bWF4VyAqIDIgLyA4OworCisJZGF0YSA9IDA7CisJcHN0YXJ0ID0gY3Vyc29yLT52c3RhcnQ7CisJcGJ1ZmZlciA9IHBzdGFydDsKKworLyoKKwlpZihvZGQgJjEpeworCQlod19jdXJzb3Jfc2V0RGF0YTIoY3Vyc29yLHJvcCxwY29sLHBtc2spOworCX0KKwlvZGQrKzsKKwlpZihvZGQgPiAweGZmZmZmZmYwKQorCQlvZGQ9MDsKKyovCisKKwlmb3IoaT0wO2k8Y291bnQ7aSsrKQorCXsKKwkJY29sb3IgPSAqcGNvbCsrOworCQltYXNrID0gKnBtc2srKzsKKwkJZGF0YSA9IDA7CisKKwkJLyogZWl0aGVyIG1ldGhvZCBiZWxvdyB3b3JrcyB3ZWxsLAorCQkgKiBidXQgbWV0aG9kIDIgc2hvd3Mgbm8gbGFnCisJCSAqIGFuZCBtZXRob2QgMSBzZWVtcyBhIGJpdCB3cm9uZyovCisjaWYgMAorCQlpZihyb3AgPT0gUk9QX1hPUikKKwkJCW9wciA9IG1hc2sgXiBjb2xvcjsKKwkJZWxzZQorCQkJb3ByID0gbWFzayAmIGNvbG9yOworCisJCWZvcihqPTA7ajw4O2orKykKKwkJeworCisJCQlpZihvcHIgJiAoMHg4MCA+PiBqKSkKKwkJCXsJLy91c2UgZmcgY29sb3IsaWQgPSAyCisJCQkJZGF0YSB8PSAyIDw8IChqKjIpOworCQkJfWVsc2V7CisJCQkJLy91c2UgYmcgY29sb3IsaWQgPSAxCisJCQkJZGF0YSB8PSAxIDw8IChqKjIpOworCQkJfQorCQl9CisjZWxzZQorCQlmb3Ioaj0wO2o8ODtqKyspeworCQkJaWYobWFzayAmICgweDgwPj5qKSl7CisJCQkJaWYocm9wID09IFJPUF9YT1IpCisJCQkJCW9wciA9IG1hc2sgXiBjb2xvcjsKKwkJCQllbHNlCisJCQkJCW9wciA9IG1hc2sgJiBjb2xvcjsKKworCQkJCS8qIDIgc3RhbmRzIGZvciBmb3JlY29sb3IgYW5kIDEgZm9yIGJhY2tjb2xvciAqLworCQkJCWRhdGEgfD0gKChvcHIgJiAoMHg4MD4+aikpPzI6MSk8PChqKjIpOworCQkJfQorCQl9CisjZW5kaWYKKwkJaW93cml0ZTE2KGRhdGEsIHBidWZmZXIpOworCisJCS8qIGFzc3VtZSBwaXRjaCBpcyAxLDIsNCw4LC4uLiovCisjaWYgMAorCQlpZighKChpKzEpJihwaXRjaC0xKSkpICAgLyogYmVsb3cgbGluZSBlcXVhbCB0byBpcyBsaW5lICovCisjZWxzZQorCQlpZigoaSsxKSAlIHBpdGNoID09IDApCisjZW5kaWYKKwkJeworCQkJLyogbmVlZCBhIHJldHVybiAqLworCQkJcHN0YXJ0ICs9IG9mZnNldDsKKwkJCXBidWZmZXIgPSBwc3RhcnQ7CisJCX1lbHNleworCQkJcGJ1ZmZlciArPSBzaXplb2YodTE2KTsKKwkJfQorCisJfQorCisKK30KKworCit2b2lkIGh3X2N1cnNvcl9zZXREYXRhMihzdHJ1Y3QgbHlueF9jdXJzb3IgKiBjdXJzb3IsCisJCQl1MTYgcm9wLGNvbnN0IHU4KiBwY29sLGNvbnN0IHU4KiBwbXNrKQoreworCWludCBpLGosY291bnQscGl0Y2gsb2Zmc2V0OworCXU4IGNvbG9yLCBtYXNrOworCXUxNiBkYXRhOworCXZvaWQgX19pb21lbSAqcGJ1ZmZlciwgKnBzdGFydDsKKworCS8qICBpbiBieXRlKi8KKwlwaXRjaCA9IGN1cnNvci0+dyA+PiAzOworCisJLyogaW4gYnl0ZQkqLworCWNvdW50ID0gcGl0Y2ggKiBjdXJzb3ItPmg7CisKKwkvKiBpbiBieXRlICovCisJb2Zmc2V0ID0gY3Vyc29yLT5tYXhXICogMiAvIDg7CisKKwlkYXRhID0gMDsKKwlwc3RhcnQgPSBjdXJzb3ItPnZzdGFydDsKKwlwYnVmZmVyID0gcHN0YXJ0OworCisJZm9yKGk9MDtpPGNvdW50O2krKykKKwl7CisJCWNvbG9yID0gKnBjb2wrKzsKKwkJbWFzayA9ICpwbXNrKys7CisJCWRhdGEgPSAwOworCisJCS8qIGVpdGhlciBtZXRob2QgYmVsb3cgd29ya3Mgd2VsbCwgYnV0IG1ldGhvZCAyIHNob3dzIG5vIGxhZyAqLworI2lmIDAKKwkJaWYocm9wID09IFJPUF9YT1IpCisJCQlvcHIgPSBtYXNrIF4gY29sb3I7CisJCWVsc2UKKwkJCW9wciA9IG1hc2sgJiBjb2xvcjsKKworCQlmb3Ioaj0wO2o8ODtqKyspCisJCXsKKworCQkJaWYob3ByICYgKDB4ODAgPj4gaikpCisJCQl7CS8vdXNlIGZnIGNvbG9yLGlkID0gMgorCQkJCWRhdGEgfD0gMiA8PCAoaioyKTsKKwkJCX1lbHNleworCQkJCS8vdXNlIGJnIGNvbG9yLGlkID0gMQorCQkJCWRhdGEgfD0gMSA8PCAoaioyKTsKKwkJCX0KKwkJfQorI2Vsc2UKKwkJZm9yKGo9MDtqPDg7aisrKXsKKwkJCWlmKG1hc2sgJiAoMTw8aikpCisJCQkJZGF0YSB8PSAoKGNvbG9yICYgKDE8PGopKT8xOjIpPDwoaioyKTsKKwkJfQorI2VuZGlmCisJCWlvd3JpdGUxNihkYXRhLCBwYnVmZmVyKTsKKworCQkvKiBhc3N1bWUgcGl0Y2ggaXMgMSwyLDQsOCwuLi4qLworCQlpZighKGkmKHBpdGNoLTEpKSkKKwkJLy9pZigoaSsxKSAlIHBpdGNoID09IDApCisJCXsKKwkJCS8qIG5lZWQgYSByZXR1cm4gKi8KKwkJCXBzdGFydCArPSBvZmZzZXQ7CisJCQlwYnVmZmVyID0gcHN0YXJ0OworCQl9ZWxzZXsKKwkJCXBidWZmZXIgKz0gc2l6ZW9mKHUxNik7CisJCX0KKworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2N1cnNvci5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfY3Vyc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlZGUwNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2N1cnNvci5oCkBAIC0wLDAgKzEsMTcgQEAKKyNpZm5kZWYgTFlOWF9DVVJTT1JfSF9fCisjZGVmaW5lIExZTlhfQ1VSU09SX0hfXworCisvKiBod19jdXJzb3JfeHh4IHdvcmtzIGZvciB2b3lhZ2VyLDcxOCBhbmQgNzUwICovCit2b2lkIGh3X2N1cnNvcl9lbmFibGUoc3RydWN0IGx5bnhfY3Vyc29yICogY3Vyc29yKTsKK3ZvaWQgaHdfY3Vyc29yX2Rpc2FibGUoc3RydWN0IGx5bnhfY3Vyc29yICogY3Vyc29yKTsKK3ZvaWQgaHdfY3Vyc29yX3NldFNpemUoc3RydWN0IGx5bnhfY3Vyc29yICogY3Vyc29yLAorCQkJCQkJaW50IHcsaW50IGgpOwordm9pZCBod19jdXJzb3Jfc2V0UG9zKHN0cnVjdCBseW54X2N1cnNvciAqIGN1cnNvciwKKwkJCQkJCWludCB4LGludCB5KTsKK3ZvaWQgaHdfY3Vyc29yX3NldENvbG9yKHN0cnVjdCBseW54X2N1cnNvciAqIGN1cnNvciwKKwkJCQkJCXUzMiBmZyx1MzIgYmcpOwordm9pZCBod19jdXJzb3Jfc2V0RGF0YShzdHJ1Y3QgbHlueF9jdXJzb3IgKiBjdXJzb3IsCisJCQl1MTYgcm9wLGNvbnN0IHU4KiBkYXRhLGNvbnN0IHU4KiBtYXNrKTsKK3ZvaWQgaHdfY3Vyc29yX3NldERhdGEyKHN0cnVjdCBseW54X2N1cnNvciAqIGN1cnNvciwKKwkJCXUxNiByb3AsY29uc3QgdTgqIGRhdGEsY29uc3QgdTgqIG1hc2spOworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9oZWxwLmggYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9oZWxwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxMjhkMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2hlbHAuaApAQCAtMCwwICsxLDExMSBAQAorI2lmbmRlZiBMWU5YX0hFTFBfSF9fCisjZGVmaW5lIExZTlhfSEVMUF9IX18KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRCBNQUNST1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9MU0IoZikgICAgICAgICAgICAgKDAgPyBmKQorI2RlZmluZSBfTVNCKGYpICAgICAgICAgICAgICgxID8gZikKKyNkZWZpbmUgX0NPVU5UKGYpICAgICAgICAgICAoX01TQihmKSAtIF9MU0IoZikgKyAxKQorCisjZGVmaW5lIFJBV19NQVNLKGYpICAgICAgICAgKDB4RkZGRkZGRkYgPj4gKDMyIC0gX0NPVU5UKGYpKSkKKyNkZWZpbmUgR0VUX01BU0soZikgICAgICAgICAoUkFXX01BU0soZikgPDwgX0xTQihmKSkKKyNkZWZpbmUgR0VUX0ZJRUxEKGQsZikgICAgICAoKChkKSA+PiBfTFNCKGYpKSAmIFJBV19NQVNLKGYpKQorI2RlZmluZSBURVNUX0ZJRUxEKGQsZix2KSAgIChHRVRfRklFTEQoZCxmKSA9PSBmICMjIF8gIyMgdikKKyNkZWZpbmUgU0VUX0ZJRUxEKGQsZix2KSAgICAoKChkKSAmIH5HRVRfTUFTSyhmKSkgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoZiAjIyBfICMjIHYpICYgUkFXX01BU0soZikpIDw8IF9MU0IoZikpKQorI2RlZmluZSBTRVRfRklFTERWKGQsZix2KSAgICgoKGQpICYgfkdFVF9NQVNLKGYpKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh2KSAmIFJBV19NQVNLKGYpKSA8PCBfTFNCKGYpKSkKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vIEludGVybmFsIG1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBfRl9TVEFSVChmKSAgICAgICAgICAgICAoMCA/IGYpCisjZGVmaW5lIF9GX0VORChmKSAgICAgICAgICAgICAgICgxID8gZikKKyNkZWZpbmUgX0ZfU0laRShmKSAgICAgICAgICAgICAgKDEgKyBfRl9FTkQoZikgLSBfRl9TVEFSVChmKSkKKyNkZWZpbmUgX0ZfTUFTSyhmKSAgICAgICAgICAgICAgKCgoMSA8PCBfRl9TSVpFKGYpKSAtIDEpIDw8IF9GX1NUQVJUKGYpKQorI2RlZmluZSBfRl9OT1JNQUxJWkUodiwgZikgICAgICAoKCh2KSAmIF9GX01BU0soZikpID4+IF9GX1NUQVJUKGYpKQorI2RlZmluZSBfRl9ERU5PUk1BTElaRSh2LCBmKSAgICAoKCh2KSA8PCBfRl9TVEFSVChmKSkgJiBfRl9NQVNLKGYpKQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gR2xvYmFsIG1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIEZJRUxEX0dFVCh4LCByZWcsIGZpZWxkKSBcCisoIFwKKyAgICBfRl9OT1JNQUxJWkUoKHgpLCByZWcgIyMgXyAjIyBmaWVsZCkgXAorKQorCisjZGVmaW5lIEZJRUxEX1NFVCh4LCByZWcsIGZpZWxkLCB2YWx1ZSkgXAorKCBcCisgICAgKHggJiB+X0ZfTUFTSyhyZWcgIyMgXyAjIyBmaWVsZCkpIFwKKyAgICB8IF9GX0RFTk9STUFMSVpFKHJlZyAjIyBfICMjIGZpZWxkICMjIF8gIyMgdmFsdWUsIHJlZyAjIyBfICMjIGZpZWxkKSBcCispCisKKyNkZWZpbmUgRklFTERfVkFMVUUoeCwgcmVnLCBmaWVsZCwgdmFsdWUpIFwKKyggXAorICAgICh4ICYgfl9GX01BU0socmVnICMjIF8gIyMgZmllbGQpKSBcCisgICAgfCBfRl9ERU5PUk1BTElaRSh2YWx1ZSwgcmVnICMjIF8gIyMgZmllbGQpIFwKKykKKworI2RlZmluZSBGSUVMRF9DTEVBUihyZWcsIGZpZWxkKSBcCisoIFwKKyAgICB+IF9GX01BU0socmVnICMjIF8gIyMgZmllbGQpIFwKKykKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vIEZpZWxkIE1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBGSUVMRF9TVEFSVChmaWVsZCkgICAgICAgICAgICAgICgwID8gZmllbGQpCisjZGVmaW5lIEZJRUxEX0VORChmaWVsZCkgICAgICAgICAgICAgICAgKDEgPyBmaWVsZCkKKyNkZWZpbmUgRklFTERfU0laRShmaWVsZCkgICAgICAgICAgICAgICAoMSArIEZJRUxEX0VORChmaWVsZCkgLSBGSUVMRF9TVEFSVChmaWVsZCkpCisjZGVmaW5lIEZJRUxEX01BU0soZmllbGQpICAgICAgICAgICAgICAgKCgoMSA8PCAoRklFTERfU0laRShmaWVsZCktMSkpIHwgKCgxIDw8IChGSUVMRF9TSVpFKGZpZWxkKS0xKSkgLSAxKSkgPDwgRklFTERfU1RBUlQoZmllbGQpKQorI2RlZmluZSBGSUVMRF9OT1JNQUxJWkUocmVnLCBmaWVsZCkgICAgICgoKHJlZykgJiBGSUVMRF9NQVNLKGZpZWxkKSkgPj4gRklFTERfU1RBUlQoZmllbGQpKQorI2RlZmluZSBGSUVMRF9ERU5PUk1BTElaRShmaWVsZCwgdmFsdWUpICgoKHZhbHVlKSA8PCBGSUVMRF9TVEFSVChmaWVsZCkpICYgRklFTERfTUFTSyhmaWVsZCkpCisKKyNkZWZpbmUgRklFTERfSU5JVChyZWcsIGZpZWxkLCB2YWx1ZSkgICBGSUVMRF9ERU5PUk1BTElaRShyZWcgIyMgXyAjIyBmaWVsZCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyAjIyBfICMjIGZpZWxkICMjIF8gIyMgdmFsdWUpCisjZGVmaW5lIEZJRUxEX0lOSVRfVkFMKHJlZywgZmllbGQsIHZhbHVlKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJRUxEX0RFTk9STUFMSVpFKHJlZyAjIyBfICMjIGZpZWxkLCB2YWx1ZSkpCisjZGVmaW5lIEZJRUxEX1ZBTF9TRVQoeCwgciwgZiwgdikgICAgICAgeCA9IHggJiB+RklFTERfTUFTSyhyICMjIF8gIyMgZikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRklFTERfREVOT1JNQUxJWkUociAjIyBfICMjIGYsIHIgIyMgXyAjIyBmICMjIF8gIyMgdikKKworI2RlZmluZSBSR0IociwgZywgYikgXAorKCBcCisgICAgKHVuc2lnbmVkIGxvbmcpICgoKHIpIDw8IDE2KSB8ICgoZykgPDwgOCkgfCAoYikpIFwKKykKKworI2RlZmluZSBSR0IxNihyLCBnLCBiKSBcCisoIFwKKyAgICAodW5zaWduZWQgc2hvcnQpICgoKChyKSAmIDB4RjgpIDw8IDgpIHwgKCgoZykgJiAweEZDKSA8PCAzKSB8ICgoKGIpICYgMHhGOCkgPj4gMykpIFwKKykKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYWJzRGlmZih1bnNpZ25lZCBpbnQgYSx1bnNpZ25lZCBpbnQgYikKK3sKKwlpZihhPGIpCisJCXJldHVybiBiLWE7CisJZWxzZQorCQlyZXR1cm4gYS1iOworfQorCisvKiBuIC8gZCArIDEgLyAyID0gKDJuICsgZCkgLyAyZCAqLworI2RlZmluZSByb3VuZGVkRGl2KG51bSxkZW5vbSkJKCgyICogKG51bSkgKyAoZGVub20pKSAvICgyICogKGRlbm9tKSkpCisjZGVmaW5lIE1CKHgpICgoeCk8PDIwKQorI2RlZmluZSBLQih4KSAoKHgpPDwxMCkKKyNkZWZpbmUgTUh6KHgpICgoeCkgKiAxMDAwMDAwKQorCisKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zbTc1MGZiL3NtNzUwX2h3LmMgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9ody5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMGQwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9ody5jCkBAIC0wLDAgKzEsNjQyIEBACisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGU8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZTxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZTxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlPGxpbnV4L21tLmg+CisjaW5jbHVkZTxsaW51eC9zbGFiLmg+CisjaW5jbHVkZTxsaW51eC9kZWxheS5oPgorI2luY2x1ZGU8bGludXgvZmIuaD4KKyNpbmNsdWRlPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGU8bGludXgvaW5pdC5oPgorI2luY2x1ZGU8bGludXgvcGNpLmg+CisjaW5jbHVkZTxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZTxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2lmZGVmIENPTkZJR19NVFJSCisjaW5jbHVkZSA8YXNtL210cnIuaD4KKyNlbmRpZgorI2luY2x1ZGU8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZTxsaW51eC9zY3JlZW5faW5mby5oPgorCisjaW5jbHVkZSAic203NTAuaCIKKyNpbmNsdWRlICJzbTc1MF9ody5oIgorI2luY2x1ZGUgImRkazc1MC5oIgorI2luY2x1ZGUgInNtNzUwX2FjY2VsLmgiCisKK2ludCBod19zbTc1MF9tYXAoc3RydWN0IGx5bnhfc2hhcmUqIHNoYXJlLCBzdHJ1Y3QgcGNpX2RldiogcGRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzbTc1MF9zaGFyZSAqIHNwZWNfc2hhcmU7CisJCisKKwlzcGVjX3NoYXJlID0gY29udGFpbmVyX29mKHNoYXJlLCBzdHJ1Y3Qgc203NTBfc2hhcmUsc2hhcmUpOworCXJldCA9IDA7CisKKwlzaGFyZS0+dmlkcmVnX3N0YXJ0ICA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAxKTsKKwlzaGFyZS0+dmlkcmVnX3NpemUgPSBNQigyKTsKKworCXByX2luZm8oIm1taW8gcGh5QWRkciA9ICVseFxuIiwgc2hhcmUtPnZpZHJlZ19zdGFydCk7CisKKwkvKiByZXNlcnZlIHRoZSB2aWRyZWcgc3BhY2Ugb2Ygc21pIGFkYXB0b3IKKwkgKiBpZiB5b3UgZG8gdGhpcywgdSBuZWVkIHRvIGFkZCByZWxlYXNlIHJlZ2lvbiBjb2RlCisJICogaW4gbHlueGZiX3JlbW92ZSwgb3IgbWVtb3J5IHdpbGwgbm90IGJlIG1hcHBlZCBhZ2FpbgorCSAqIHN1Y2Nlc3NmdWxseQorCSAqICovCisKKwlpZigocmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsIDEsICJzbTc1MGZiIikpKQorCXsKKwkJcHJfZXJyKCJDYW4gbm90IHJlcXVlc3QgUENJIHJlZ2lvbnMuXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCS8qIG5vdyBtYXAgbW1pbyBhbmQgdmlkbWVtKi8KKwlzaGFyZS0+cHZSZWcgPSBpb3JlbWFwX25vY2FjaGUoc2hhcmUtPnZpZHJlZ19zdGFydCwgc2hhcmUtPnZpZHJlZ19zaXplKTsKKwlpZighc2hhcmUtPnB2UmVnKXsKKwkJcHJfZXJyKCJtbWlvIGZhaWxlZFxuIik7CisJCXJldCA9IC1FRkFVTFQ7CisJCWdvdG8gZXhpdDsKKwl9ZWxzZXsKKwkJcHJfaW5mbygibW1pbyB2aXJ0dWFsIGFkZHIgPSAlcFxuIiwgc2hhcmUtPnB2UmVnKTsKKwl9CisKKwkKKwlzaGFyZS0+YWNjZWwuZHByQmFzZSA9IHNoYXJlLT5wdlJlZyArIERFX0JBU0VfQUREUl9UWVBFMTsKKwlzaGFyZS0+YWNjZWwuZHBQb3J0QmFzZSA9IHNoYXJlLT5wdlJlZyArIERFX1BPUlRfQUREUl9UWVBFMTsKKworCWRkazc1MF9zZXRfbW1pbyhzaGFyZS0+cHZSZWcsc2hhcmUtPmRldmlkLCBzaGFyZS0+cmV2aWQpOworCisJc2hhcmUtPnZpZG1lbV9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChwZGV2LCAwKTsKKwkvKiBkb24ndCB1c2UgcGRldl9yZXNvdXJjZVt4XS5lbmQgLSByZXNvdXJjZVt4XS5zdGFydCB0bworCSAqIGNhbGN1bGF0ZSB0aGUgcmVzb3VyY2Ugc2l6ZSxpdHMgb25seSB0aGUgbWF4aW11bSBhdmFpbGFibGUKKwkgKiBzaXplIGJ1dCBub3QgdGhlIGFjdHVhbCBzaXplLHVzZQorCSAqIEBod19zbTc1MF9nZXRWTVNpemUgZnVuY3Rpb24gY2FuIGJlIHNhZmUuCisJICogKi8KKwlzaGFyZS0+dmlkbWVtX3NpemUgPSBod19zbTc1MF9nZXRWTVNpemUoc2hhcmUpOworCXByX2luZm8oInZpZGVvIG1lbW9yeSBwaHlBZGRyID0gJWx4LCBzaXplID0gJXUgYnl0ZXNcbiIsCisJc2hhcmUtPnZpZG1lbV9zdGFydCwgc2hhcmUtPnZpZG1lbV9zaXplKTsKKworCS8qIHJlc2VydmUgdGhlIHZpZG1lbSBzcGFjZSBvZiBzbWkgYWRhcHRvciAqLworI2lmIDAKKwlpZigocmV0ID0gcGNpX3JlcXVlc3RfcmVnaW9uKHBkZXYsMCxfbW9kdWxlTmFtZV8pKSkKKwl7CisJCXByX2VycigiQ2FuIG5vdCByZXF1ZXN0IFBDSSByZWdpb25zLlxuIik7CisJCWdvdG8gZXhpdDsKKwl9CisjZW5kaWYKKworCXNoYXJlLT5wdk1lbSA9IGlvcmVtYXAoc2hhcmUtPnZpZG1lbV9zdGFydCwKKwkJCQkJCQlzaGFyZS0+dmlkbWVtX3NpemUpOworCisJaWYoIXNoYXJlLT5wdk1lbSl7CisJCXByX2VycigiTWFwIHZpZGVvIG1lbW9yeSBmYWlsZWRcbiIpOworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIGV4aXQ7CisJfWVsc2V7CisJCXByX2luZm8oInZpZGVvIG1lbW9yeSB2YWRkciA9ICVwXG4iLCBzaGFyZS0+cHZNZW0pOworCX0KK2V4aXQ6CisJcmV0dXJuIHJldDsKK30KKworCisKK2ludCBod19zbTc1MF9pbml0aHcoc3RydWN0IGx5bnhfc2hhcmUqIHNoYXJlLCBzdHJ1Y3QgcGNpX2RldiAqIHBkZXYpCit7CisJc3RydWN0IHNtNzUwX3NoYXJlICogc3BlY19zaGFyZTsKKwlzdHJ1Y3QgaW5pdF9zdGF0dXMgKiBwYXJtOworCQorCXNwZWNfc2hhcmUgPSBjb250YWluZXJfb2Yoc2hhcmUsIHN0cnVjdCBzbTc1MF9zaGFyZSxzaGFyZSk7CisJcGFybSA9ICZzcGVjX3NoYXJlLT5zdGF0ZS5pbml0UGFybTsKKwlpZihwYXJtLT5jaGlwX2NsayA9PSAwKQorCQlwYXJtLT5jaGlwX2NsayA9IChnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpPworCQkJCQkJREVGQVVMVF9TTTc1MExFX0NISVBfQ0xPQ0sgOgorCQkJCQkJREVGQVVMVF9TTTc1MF9DSElQX0NMT0NLOworCisJaWYocGFybS0+bWVtX2NsayA9PSAwKQorCQlwYXJtLT5tZW1fY2xrID0gcGFybS0+Y2hpcF9jbGs7CisJaWYocGFybS0+bWFzdGVyX2NsayA9PSAwKQorCQlwYXJtLT5tYXN0ZXJfY2xrID0gcGFybS0+Y2hpcF9jbGsvMzsKKworCWRkazc1MF9pbml0SHcoKGluaXRjaGlwX3BhcmFtX3QgKikmc3BlY19zaGFyZS0+c3RhdGUuaW5pdFBhcm0pOworCS8qIGZvciBzbTcxOCxvcGVuIHBjaSBidXJzdCAqLworCWlmKHNoYXJlLT5kZXZpZCA9PSAweDcxOCl7CisJCVBPS0UzMihTWVNURU1fQ1RSTCwKKwkJCQlGSUVMRF9TRVQoUEVFSzMyKFNZU1RFTV9DVFJMKSwgU1lTVEVNX0NUUkwsIFBDSV9CVVJTVCwgT04pKTsKKwl9CisKKwkvKiBzbTc1MCB1c2Ugc2lpMTY0LCBpdCBjYW4gYmUgc2V0dXAgd2l0aCBkZWZhdWx0IHZhbHVlCisJICogYnkgb24gcG93ZXIsIHNvIGluaXREVklEaXNwIGNhbiBiZSBza2lwcGVkICovCisjaWYgMAorCWRkazc1MF9pbml0RFZJRGlzcCgpOworI2VuZGlmCisKKwlpZihnZXRDaGlwVHlwZSgpICE9IFNNNzUwTEUpCisJeworCQkvKiBkb2VzIHVzZXIgbmVlZCBDUlQgPyovCisJCWlmKHNwZWNfc2hhcmUtPnN0YXRlLm5vY3J0KXsKKwkJCVBPS0UzMihNSVNDX0NUUkwsCisJCQkJCUZJRUxEX1NFVChQRUVLMzIoTUlTQ19DVFJMKSwKKwkJCQkJTUlTQ19DVFJMLAorCQkJCQlEQUNfUE9XRVIsIE9GRikpOworCQkJLyogc2h1dCBvZmYgZHBtcyAqLworCQkJUE9LRTMyKFNZU1RFTV9DVFJMLAorCQkJCQlGSUVMRF9TRVQoUEVFSzMyKFNZU1RFTV9DVFJMKSwKKwkJCQkJU1lTVEVNX0NUUkwsCisJCQkJCURQTVMsIFZOSE4pKTsKKwkJfWVsc2V7CisJCQlQT0tFMzIoTUlTQ19DVFJMLAorCQkJCQlGSUVMRF9TRVQoUEVFSzMyKE1JU0NfQ1RSTCksCisJCQkJCU1JU0NfQ1RSTCwKKwkJCQkJREFDX1BPV0VSLCBPTikpOworCQkJLyogdHVybiBvbiBkcG1zICovCisJCQlQT0tFMzIoU1lTVEVNX0NUUkwsCisJCQkJCUZJRUxEX1NFVChQRUVLMzIoU1lTVEVNX0NUUkwpLAorCQkJCQlTWVNURU1fQ1RSTCwKKwkJCQkJRFBNUywgVlBIUCkpOworCQl9CisKKwkJc3dpdGNoIChzcGVjX3NoYXJlLT5zdGF0ZS5wbmx0eXBlKXsKKwkJCWNhc2Ugc203NTBfZG91YmxlVEZUOgorCQkJY2FzZSBzbTc1MF8yNFRGVDoKKwkJCWNhc2Ugc203NTBfZHVhbFRGVDoKKwkJCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwsCisJCQkJRklFTERfVkFMVUUoUEVFSzMyKFBBTkVMX0RJU1BMQVlfQ1RSTCksCisJCQkJCQkJUEFORUxfRElTUExBWV9DVFJMLAorCQkJCQkJCVRGVF9ESVNQLAorCQkJCQkJCXNwZWNfc2hhcmUtPnN0YXRlLnBubHR5cGUpKTsKKwkJCWJyZWFrOworCQl9CisJfWVsc2V7CisJCS8qIGZvciA3NTBMRSAsbm8gRFZJIGNoaXAgaW5pdGlsaXphdGlvbiBtYWtlcyBNb25pdG9yIG5vIHNpZ25hbCAqLworCQkvKiBTZXQgdXAgR1BJTyBmb3Igc29mdHdhcmUgSTJDIHRvIHByb2dyYW0gRFZJIGNoaXAgaW4gdGhlCisJCSAgIFhpbGlueCBTUDYwNSBib2FyZCwgaW4gb3JkZXIgdG8gaGF2ZSB2aWRlbyBzaWduYWwuCisJCSAqLworICAgICAgICBzd0kyQ0luaXQoMCwxKTsKKworCisgICAgICAgIC8qIEN1c3RvbWVyIG1heSBOT1QgdXNlIENINzMwMSBEVkkgY2hpcCwgd2hpY2ggaGFzIHRvIGJlCisgICAgICAgICAgIGluaXRpYWxpemVkIGRpZmZlcmVudGx5LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHN3STJDUmVhZFJlZygweGVjLCAweDRhKSA9PSAweDk1KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIHJlZ2lzdGVyIHZhbHVlcyBmb3IgQ0g3MzAxIGFyZSBmcm9tCisgICAgICAgICAgICAgICBDaHJvbnRlbCBhcHAgbm90ZSBhbmQgb3VyIGV4cGVyaW1lbnQuCisgICAgICAgICAgICAgKi8KKwkJCXByX2luZm8oInllcyxDSDczMDEgRFZJIGNoaXAgZm91bmRcbiIpOworICAgICAgICAgICAgc3dJMkNXcml0ZVJlZygweGVjLCAweDFkLCAweDE2KTsKKyAgICAgICAgICAgIHN3STJDV3JpdGVSZWcoMHhlYywgMHgyMSwgMHg5KTsKKyAgICAgICAgICAgIHN3STJDV3JpdGVSZWcoMHhlYywgMHg0OSwgMHhDMCk7CisJCQlwcl9pbmZvKCJva2F5LENINzMwMSBEVkkgY2hpcCBzZXR1cCBkb25lXG4iKTsKKyAgICAgICAgfQorCX0KKworCS8qIGluaXQgMmQgZW5naW5lICovCisJaWYoIXNoYXJlLT5hY2NlbF9vZmYpeworCQlod19zbTc1MF9pbml0QWNjZWwoc2hhcmUpOworLy8JCXNoYXJlLT5hY2NlbC5kZV93YWl0ID0gaHdfc203NTBfZGVXYWl0OworCX0KKworCXJldHVybiAwOworfQorCisKK3Jlc291cmNlX3NpemVfdCBod19zbTc1MF9nZXRWTVNpemUoc3RydWN0IGx5bnhfc2hhcmUgKiBzaGFyZSkKK3sKKwlyZXNvdXJjZV9zaXplX3QgcmV0OworCQorCXJldCA9IGRkazc1MF9nZXRWTVNpemUoKTsKKwlyZXR1cm4gcmV0OworfQorCisKKworaW50IGh3X3NtNzUwX291dHB1dF9jaGVja01vZGUoc3RydWN0IGx5bnhmYl9vdXRwdXQqIG91dHB1dCwgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKiB2YXIpCit7CisJCisJcmV0dXJuIDA7Cit9CisKKworaW50IGh3X3NtNzUwX291dHB1dF9zZXRNb2RlKHN0cnVjdCBseW54ZmJfb3V0cHV0KiBvdXRwdXQsCisJCQkJCQkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8qIHZhciwgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvKiBmaXgpCit7CisJaW50IHJldDsKKwlkaXNwX291dHB1dF90IGRpc3BTZXQ7CisJaW50IGNoYW5uZWw7CisJCisJcmV0ID0gMDsKKwlkaXNwU2V0ID0gMDsKKwljaGFubmVsID0gKm91dHB1dC0+Y2hhbm5lbDsKKworCisJaWYoZ2V0Q2hpcFR5cGUoKSAhPSBTTTc1MExFKXsKKwkJaWYoY2hhbm5lbCA9PSBzbTc1MF9wcmltYXJ5KXsKKwkJCXByX2luZm8oInByaW1hcnkgY2hhbm5lbFxuIik7CisJCQlpZihvdXRwdXQtPnBhdGhzICYgc203NTBfcGFuZWwpCisJCQkJZGlzcFNldCB8PSBkb19MQ0QxX1BSSTsKKwkJCWlmKG91dHB1dC0+cGF0aHMgJiBzbTc1MF9jcnQpCisJCQkJZGlzcFNldCB8PSBkb19DUlRfUFJJOworCisJCX1lbHNleworCQkJcHJfaW5mbygic2Vjb25kYXJ5IGNoYW5uZWxcbiIpOworCQkJaWYob3V0cHV0LT5wYXRocyAmIHNtNzUwX3BhbmVsKQorCQkJCWRpc3BTZXQgfD0gZG9fTENEMV9TRUM7CisJCQlpZihvdXRwdXQtPnBhdGhzICYgc203NTBfY3J0KQorCQkJCWRpc3BTZXQgfD0gZG9fQ1JUX1NFQzsKKworCQl9CisJCWRkazc1MF9zZXRMb2dpY2FsRGlzcE91dChkaXNwU2V0KTsKKwl9ZWxzZXsKKwkJLyoganVzdCBvcGVuIERJU1BMQVlfQ09OVFJPTF83NTBMRSByZWdpc3RlciBiaXQgMzowKi8KKwkJdTMyIHJlZzsKKwkJcmVnID0gUEVFSzMyKERJU1BMQVlfQ09OVFJPTF83NTBMRSk7CisJCXJlZyB8PSAweGY7CisJCVBPS0UzMihESVNQTEFZX0NPTlRST0xfNzUwTEUsIHJlZyk7CisJfQorCisJcHJfaW5mbygiZGRrIHNldGxvZ2ljZGlzcG91dCBkb25lIFxuIik7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBod19zbTc1MF9vdXRwdXRfY2xlYXIoc3RydWN0IGx5bnhmYl9vdXRwdXQqIG91dHB1dCkKK3sKKwkKKwlyZXR1cm47Cit9CisKK2ludCBod19zbTc1MF9jcnRjX2NoZWNrTW9kZShzdHJ1Y3QgbHlueGZiX2NydGMqIGNydGMsIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyogdmFyKQoreworCXN0cnVjdCBseW54X3NoYXJlICogc2hhcmU7CisJCisKKwlzaGFyZSA9IGNvbnRhaW5lcl9vZihjcnRjLCBzdHJ1Y3QgbHlueGZiX3BhcixjcnRjKS0+c2hhcmU7CisKKwlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpeworCQljYXNlIDg6CisJCWNhc2UgMTY6CisJCQlicmVhazsKKwkJY2FzZSAzMjoKKwkJCWlmIChzaGFyZS0+cmV2aWQgPT0gU003NTBMRV9SRVZJU0lPTl9JRCkgeworCQkJCXByX2RlYnVnKCI3NTBsZSBkbyBub3Qgc3VwcG9ydCAzMmJwcFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoKKwlzZXQgdGhlIGNvbnRyb2xsZXIncyBtb2RlIGZvciBAY3J0YyBjaGFyZ2VkIHdpdGggQHZhciBhbmQgQGZpeCBwYXJhbWV0ZXJzCisqLworaW50IGh3X3NtNzUwX2NydGNfc2V0TW9kZShzdHJ1Y3QgbHlueGZiX2NydGMqIGNydGMsCisJCQkJCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyogdmFyLAorCQkJCQkJCQlzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8qIGZpeCkKK3sKKwlpbnQgcmV0LGZtdDsKKwl1MzIgcmVnOworCW1vZGVfcGFyYW1ldGVyX3QgbW9kcGFybTsKKwljbG9ja190eXBlX3QgY2xvY2s7CisJc3RydWN0IGx5bnhfc2hhcmUgKiBzaGFyZTsKKwlzdHJ1Y3QgbHlueGZiX3BhciAqIHBhcjsKKworCQorCXJldCA9IDA7CisJcGFyID0gY29udGFpbmVyX29mKGNydGMsIHN0cnVjdCBseW54ZmJfcGFyLCBjcnRjKTsKKwlzaGFyZSA9IHBhci0+c2hhcmU7CisjaWYgMQorCWlmKCFzaGFyZS0+YWNjZWxfb2ZmKXsKKwkJLyogc2V0IDJkIGVuZ2luZSBwaXhlbCBmb3JtYXQgYWNjb3JkaW5nIHRvIG1vZGUgYnBwICovCisJCXN3aXRjaCh2YXItPmJpdHNfcGVyX3BpeGVsKXsKKwkJCWNhc2UgODoKKwkJCQlmbXQgPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSAxNjoKKwkJCQlmbXQgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAzMjoKKwkJCWRlZmF1bHQ6CisJCQkJZm10ID0gMjsKKwkJCQlicmVhazsKKwkJfQorCQlod19zZXQyZGZvcm1hdCgmc2hhcmUtPmFjY2VsLCBmbXQpOworCX0KKyNlbmRpZgorCisJLyogc2V0IHRpbWluZyAqLworLy8JbW9kcGFybS5waXhlbF9jbG9jayA9IFBTX1RPX0haKHZhci0+cGl4Y2xvY2spOworCW1vZHBhcm0ucGl4ZWxfY2xvY2sgPSBwc190b19oeih2YXItPnBpeGNsb2NrKTsKKwltb2RwYXJtLnZlcnRpY2FsX3N5bmNfcG9sYXJpdHkgPSAodmFyLT5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpID8gUE9TOk5FRzsKKwltb2RwYXJtLmhvcml6b250YWxfc3luY19wb2xhcml0eSA9ICh2YXItPnN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpID8gUE9TOk5FRzsKKwltb2RwYXJtLmNsb2NrX3BoYXNlX3BvbGFyaXR5ID0gKHZhci0+c3luYyYgRkJfU1lOQ19DT01QX0hJR0hfQUNUKSA/IFBPUzpORUc7CisJbW9kcGFybS5ob3Jpem9udGFsX2Rpc3BsYXlfZW5kID0gdmFyLT54cmVzOworCW1vZHBhcm0uaG9yaXpvbnRhbF9zeW5jX3dpZHRoID0gdmFyLT5oc3luY19sZW47CisJbW9kcGFybS5ob3Jpem9udGFsX3N5bmNfc3RhcnQgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbjsKKwltb2RwYXJtLmhvcml6b250YWxfdG90YWwgPSB2YXItPnhyZXMgKyB2YXItPmxlZnRfbWFyZ2luICsgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbjsKKwltb2RwYXJtLnZlcnRpY2FsX2Rpc3BsYXlfZW5kID0gdmFyLT55cmVzOworCW1vZHBhcm0udmVydGljYWxfc3luY19oZWlnaHQgPSB2YXItPnZzeW5jX2xlbjsKKwltb2RwYXJtLnZlcnRpY2FsX3N5bmNfc3RhcnQgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbjsKKwltb2RwYXJtLnZlcnRpY2FsX3RvdGFsID0gdmFyLT55cmVzICsgdmFyLT51cHBlcl9tYXJnaW4gKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuOworCisJLyogY2hvb3NlIHBsbCAqLworCWlmKGNydGMtPmNoYW5uZWwgIT0gc203NTBfc2Vjb25kYXJ5KQorCQljbG9jayA9IFBSSU1BUllfUExMOworCWVsc2UKKwkJY2xvY2sgPSBTRUNPTkRBUllfUExMOworCisJcHJfZGVidWcoIlJlcXVlc3QgcGl4ZWwgY2xvY2sgPSAlbHVcbiIsIG1vZHBhcm0ucGl4ZWxfY2xvY2spOworCXJldCA9IGRkazc1MF9zZXRNb2RlVGltaW5nKCZtb2RwYXJtLCBjbG9jayk7CisJaWYocmV0KXsKKwkJcHJfZXJyKCJTZXQgbW9kZSB0aW1pbmcgZmFpbGVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCWlmKGNydGMtPmNoYW5uZWwgIT0gc203NTBfc2Vjb25kYXJ5KXsKKwkJLyogc2V0IHBpdGNoLCBvZmZzZXQgLHdpZHRoLHN0YXJ0IGFkZHJlc3MgLGV0Yy4uLiAqLworCQlQT0tFMzIoUEFORUxfRkJfQUREUkVTUywKKwkJCUZJRUxEX1NFVCgwLCBQQU5FTF9GQl9BRERSRVNTLCBTVEFUVVMsIENVUlJFTlQpfAorCQkJRklFTERfU0VUKDAsIFBBTkVMX0ZCX0FERFJFU1MsIEVYVCwgTE9DQUwpfAorCQkJRklFTERfVkFMVUUoMCwgUEFORUxfRkJfQUREUkVTUywgQUREUkVTUywgY3J0Yy0+b1NjcmVlbikpOworCisJCXJlZyA9IHZhci0+eHJlcyAqICh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDMpOworCQkvKiBjcnRjLT5jaGFubmVsIGlzIG5vdCBlcXVhbCB0byBwYXItPmluZGV4IG9uIG51bWVyaWMsYmUgYXdhcmUgb2YgdGhhdCAqLworCQlyZWcgPSBQQURESU5HKGNydGMtPmxpbmVfcGFkLHJlZyk7CisKKwkJUE9LRTMyKFBBTkVMX0ZCX1dJRFRILAorCQkJRklFTERfVkFMVUUoMCwgUEFORUxfRkJfV0lEVEgsIFdJRFRILCByZWcpfAorCQkJRklFTERfVkFMVUUoMCwgUEFORUxfRkJfV0lEVEgsIE9GRlNFVCwgZml4LT5saW5lX2xlbmd0aCkpOworCisJCVBPS0UzMihQQU5FTF9XSU5ET1dfV0lEVEgsCisJCQlGSUVMRF9WQUxVRSgwLCBQQU5FTF9XSU5ET1dfV0lEVEgsIFdJRFRILCB2YXItPnhyZXMgLTEpfAorCQkJRklFTERfVkFMVUUoMCwgUEFORUxfV0lORE9XX1dJRFRILCBYLCB2YXItPnhvZmZzZXQpKTsKKworCQlQT0tFMzIoUEFORUxfV0lORE9XX0hFSUdIVCwKKwkJCUZJRUxEX1ZBTFVFKDAsIFBBTkVMX1dJTkRPV19IRUlHSFQsIEhFSUdIVCwgdmFyLT55cmVzX3ZpcnR1YWwgLSAxKXwKKwkJCUZJRUxEX1ZBTFVFKDAsIFBBTkVMX1dJTkRPV19IRUlHSFQsIFksIHZhci0+eW9mZnNldCkpOworCisJCVBPS0UzMihQQU5FTF9QTEFORV9UTCwgMCk7CisKKwkJUE9LRTMyKFBBTkVMX1BMQU5FX0JSLAorCQkJRklFTERfVkFMVUUoMCwgUEFORUxfUExBTkVfQlIsIEJPVFRPTSwgdmFyLT55cmVzIC0gMSl8CisJCQlGSUVMRF9WQUxVRSgwLCBQQU5FTF9QTEFORV9CUixSSUdIVCwgdmFyLT54cmVzIC0gMSkpOworCisJCS8qIHNldCBwaXhlbCBmb3JtYXQgKi8KKwkJcmVnID0gUEVFSzMyKFBBTkVMX0RJU1BMQVlfQ1RSTCk7CisJCVBPS0UzMihQQU5FTF9ESVNQTEFZX0NUUkwsCisJCQlGSUVMRF9WQUxVRShyZWcsCisJCQlQQU5FTF9ESVNQTEFZX0NUUkwsIEZPUk1BVCwKKwkJCSh2YXItPmJpdHNfcGVyX3BpeGVsID4+IDQpCisJCQkpKTsKKwl9ZWxzZXsKKwkJLyogbm90IGltcGxlbWVudGVkIG5vdyAqLworCQlQT0tFMzIoQ1JUX0ZCX0FERFJFU1MsIGNydGMtPm9TY3JlZW4pOworCQlyZWcgPSB2YXItPnhyZXMgKiAodmFyLT5iaXRzX3Blcl9waXhlbCA+PiAzKTsKKwkJLyogY3J0Yy0+Y2hhbm5lbCBpcyBub3QgZXF1YWwgdG8gcGFyLT5pbmRleCBvbiBudW1lcmljLGJlIGF3YXJlIG9mIHRoYXQgKi8KKwkJcmVnID0gUEFERElORyhjcnRjLT5saW5lX3BhZCwgcmVnKTsKKworCQlQT0tFMzIoQ1JUX0ZCX1dJRFRILAorCQkJRklFTERfVkFMVUUoMCwgQ1JUX0ZCX1dJRFRILCBXSURUSCwgcmVnKXwKKwkJCUZJRUxEX1ZBTFVFKDAsIENSVF9GQl9XSURUSCwgT0ZGU0VULCBmaXgtPmxpbmVfbGVuZ3RoKSk7CisKKwkJLyogU0VUIFBJWEVMIEZPUk1BVCAqLworCQlyZWcgPSBQRUVLMzIoQ1JUX0RJU1BMQVlfQ1RSTCk7CisJCXJlZyA9IEZJRUxEX1ZBTFVFKHJlZywgQ1JUX0RJU1BMQVlfQ1RSTCwgRk9STUFULCB2YXItPmJpdHNfcGVyX3BpeGVsID4+IDQpOworCQlQT0tFMzIoQ1JUX0RJU1BMQVlfQ1RSTCwgcmVnKTsKKworCX0KKworCitleGl0OgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgaHdfc203NTBfY3J0Y19jbGVhcihzdHJ1Y3QgbHlueGZiX2NydGMqIGNydGMpCit7CisJCisJcmV0dXJuOworfQorCitpbnQgaHdfc203NTBfc2V0Q29sUmVnKHN0cnVjdCBseW54ZmJfY3J0YyogY3J0YywgdXNob3J0IGluZGV4LAorCQkJCQkJCQl1c2hvcnQgcmVkLCB1c2hvcnQgZ3JlZW4sIHVzaG9ydCBibHVlKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgYWRkW109e1BBTkVMX1BBTEVUVEVfUkFNLENSVF9QQUxFVFRFX1JBTX07CisJUE9LRTMyKGFkZFtjcnRjLT5jaGFubmVsXSArIGluZGV4KjQsIChyZWQ8PDE2KXwoZ3JlZW48PDgpfGJsdWUpOworCXJldHVybiAwOworfQorCitpbnQgaHdfc203NTBsZV9zZXRCTEFOSyhzdHJ1Y3QgbHlueGZiX291dHB1dCAqIG91dHB1dCwgaW50IGJsYW5rKXsKKwlpbnQgZHBtcyxjcnRkYjsKKwkKKwlzd2l0Y2goYmxhbmspCisJeworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCisJCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKKyNlbHNlCisJCWNhc2UgVkVTQV9OT19CTEFOS0lORzoKKyNlbmRpZgorCQkJZHBtcyA9IENSVF9ESVNQTEFZX0NUUkxfRFBNU18wOworCQkJY3J0ZGIgPSBDUlRfRElTUExBWV9DVFJMX0JMQU5LX09GRjsKKwkJCWJyZWFrOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCisJCWNhc2UgRkJfQkxBTktfTk9STUFMOgorCQkJZHBtcyA9IENSVF9ESVNQTEFZX0NUUkxfRFBNU18wOworCQkJY3J0ZGIgPSBDUlRfRElTUExBWV9DVFJMX0JMQU5LX09OOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQorCQljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CisjZWxzZQorCQljYXNlIFZFU0FfVlNZTkNfU1VTUEVORDoKKyNlbmRpZgorCQkJZHBtcyA9IENSVF9ESVNQTEFZX0NUUkxfRFBNU18yOworCQkJY3J0ZGIgPSBDUlRfRElTUExBWV9DVFJMX0JMQU5LX09OOworCQkJYnJlYWs7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkKKwkJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgorI2Vsc2UKKwkJY2FzZSBWRVNBX0hTWU5DX1NVU1BFTkQ6CisjZW5kaWYKKwkJCWRwbXMgPSBDUlRfRElTUExBWV9DVFJMX0RQTVNfMTsKKwkJCWNydGRiID0gQ1JUX0RJU1BMQVlfQ1RSTF9CTEFOS19PTjsKKwkJCWJyZWFrOworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDYsMTApCisJCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgorI2Vsc2UKKwkJY2FzZSBWRVNBX1BPV0VSRE9XTjoKKyNlbmRpZgorCQkJZHBtcyA9IENSVF9ESVNQTEFZX0NUUkxfRFBNU18zOworCQkJY3J0ZGIgPSBDUlRfRElTUExBWV9DVFJMX0JMQU5LX09OOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZihvdXRwdXQtPnBhdGhzICYgc203NTBfY3J0KXsKKwkJUE9LRTMyKENSVF9ESVNQTEFZX0NUUkwsIEZJRUxEX1ZBTFVFKFBFRUszMihDUlRfRElTUExBWV9DVFJMKSwgQ1JUX0RJU1BMQVlfQ1RSTCwgRFBNUywgZHBtcykpOworCQlQT0tFMzIoQ1JUX0RJU1BMQVlfQ1RSTCwgRklFTERfVkFMVUUoUEVFSzMyKENSVF9ESVNQTEFZX0NUUkwpLCBDUlRfRElTUExBWV9DVFJMLCBCTEFOSywgY3J0ZGIpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBod19zbTc1MF9zZXRCTEFOSyhzdHJ1Y3QgbHlueGZiX291dHB1dCogb3V0cHV0LGludCBibGFuaykKK3sKKwl1bnNpZ25lZCBpbnQgZHBtcywgcHBzLCBjcnRkYjsKKwkKKwlkcG1zID0gcHBzID0gY3J0ZGIgPSAwOworCisJc3dpdGNoIChibGFuaykKKwl7CisjaWYgTElOVVhfVkVSU0lPTl9DT0RFID49IEtFUk5FTF9WRVJTSU9OKDIsNiwxMCkKKwkJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgorI2Vsc2UKKwkJY2FzZSBWRVNBX05PX0JMQU5LSU5HOgorI2VuZGlmCisJCQlwcl9pbmZvKCJmbGFnID0gRkJfQkxBTktfVU5CTEFOSyBcbiIpOworCQkJZHBtcyA9IFNZU1RFTV9DVFJMX0RQTVNfVlBIUDsKKwkJCXBwcyA9IFBBTkVMX0RJU1BMQVlfQ1RSTF9EQVRBX0VOQUJMRTsKKwkJCWNydGRiID0gQ1JUX0RJU1BMQVlfQ1RSTF9CTEFOS19PRkY7CisJCQlicmVhazsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQorCQljYXNlIEZCX0JMQU5LX05PUk1BTDoKKwkJCXByX2luZm8oImZsYWcgPSBGQl9CTEFOS19OT1JNQUwgXG4iKTsKKwkJCWRwbXMgPSBTWVNURU1fQ1RSTF9EUE1TX1ZQSFA7CisJCQlwcHMgPSBQQU5FTF9ESVNQTEFZX0NUUkxfREFUQV9ESVNBQkxFOworCQkJY3J0ZGIgPSBDUlRfRElTUExBWV9DVFJMX0JMQU5LX09OOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQorCQljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CisjZWxzZQorCQljYXNlIFZFU0FfVlNZTkNfU1VTUEVORDoKKyNlbmRpZgorCQkJZHBtcyA9IFNZU1RFTV9DVFJMX0RQTVNfVk5IUDsKKwkJCXBwcyA9IFBBTkVMX0RJU1BMQVlfQ1RSTF9EQVRBX0RJU0FCTEU7CisJCQljcnRkYiA9IENSVF9ESVNQTEFZX0NUUkxfQkxBTktfT047CisJCQlicmVhazsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQorCQljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6CisjZWxzZQorCQljYXNlIFZFU0FfSFNZTkNfU1VTUEVORDoKKyNlbmRpZgorCQkJZHBtcyA9IFNZU1RFTV9DVFJMX0RQTVNfVlBITjsKKwkJCXBwcyA9IFBBTkVMX0RJU1BMQVlfQ1RSTF9EQVRBX0RJU0FCTEU7CisJCQljcnRkYiA9IENSVF9ESVNQTEFZX0NUUkxfQkxBTktfT047CisJCQlicmVhazsKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDEwKQorCQljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjoKKyNlbHNlCisJCWNhc2UgVkVTQV9QT1dFUkRPV046CisjZW5kaWYKKwkJCWRwbXMgPSBTWVNURU1fQ1RSTF9EUE1TX1ZOSE47CisJCQlwcHMgPSBQQU5FTF9ESVNQTEFZX0NUUkxfREFUQV9ESVNBQkxFOworCQkJY3J0ZGIgPSBDUlRfRElTUExBWV9DVFJMX0JMQU5LX09OOworCQkJYnJlYWs7CisJfQorCisJaWYob3V0cHV0LT5wYXRocyAmIHNtNzUwX2NydCl7CisKKwkJUE9LRTMyKFNZU1RFTV9DVFJMLEZJRUxEX1ZBTFVFKFBFRUszMihTWVNURU1fQ1RSTCksIFNZU1RFTV9DVFJMLCBEUE1TLCBkcG1zKSk7CisJCVBPS0UzMihDUlRfRElTUExBWV9DVFJMLEZJRUxEX1ZBTFVFKFBFRUszMihDUlRfRElTUExBWV9DVFJMKSwgQ1JUX0RJU1BMQVlfQ1RSTCxCTEFOSywgY3J0ZGIpKTsKKwl9CisKKwlpZihvdXRwdXQtPnBhdGhzICYgc203NTBfcGFuZWwpeworCQlQT0tFMzIoUEFORUxfRElTUExBWV9DVFJMLCBGSUVMRF9WQUxVRShQRUVLMzIoUEFORUxfRElTUExBWV9DVFJMKSwgUEFORUxfRElTUExBWV9DVFJMLCBEQVRBLCBwcHMpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit2b2lkIGh3X3NtNzUwX2luaXRBY2NlbChzdHJ1Y3QgbHlueF9zaGFyZSAqIHNoYXJlKQoreworCXUzMiByZWc7CisJZW5hYmxlMkRFbmdpbmUoMSk7CisKKwlpZihnZXRDaGlwVHlwZSgpID09IFNNNzUwTEUpeworCQlyZWcgPSBQRUVLMzIoREVfU1RBVEUxKTsKKwkJcmVnID0gRklFTERfU0VUKHJlZywgREVfU1RBVEUxLCBERV9BQk9SVCxPTik7CisJCVBPS0UzMihERV9TVEFURTEscmVnKTsKKworCQlyZWcgPSBQRUVLMzIoREVfU1RBVEUxKTsKKwkJcmVnID0gRklFTERfU0VUKHJlZywgREVfU1RBVEUxLCBERV9BQk9SVCxPRkYpOworCQlQT0tFMzIoREVfU1RBVEUxLCByZWcpOworCisJfWVsc2V7CisJCS8qIGVuZ2luZSByZXNldCAqLworCQlyZWcgPSBQRUVLMzIoU1lTVEVNX0NUUkwpOworCSAgICByZWcgPSBGSUVMRF9TRVQocmVnLCBTWVNURU1fQ1RSTCwgREVfQUJPUlQsT04pOworCQlQT0tFMzIoU1lTVEVNX0NUUkwsIHJlZyk7CisKKwkJcmVnID0gUEVFSzMyKFNZU1RFTV9DVFJMKTsKKwkJcmVnID0gRklFTERfU0VUKHJlZywgU1lTVEVNX0NUUkwsIERFX0FCT1JULE9GRik7CisJCVBPS0UzMihTWVNURU1fQ1RSTCwgcmVnKTsKKwl9CisKKwkvKiBjYWxsIDJkIGluaXQgKi8KKwlzaGFyZS0+YWNjZWwuZGVfaW5pdCgmc2hhcmUtPmFjY2VsKTsKK30KKworaW50IGh3X3NtNzUwbGVfZGVXYWl0KHZvaWQpCit7CisJaW50IGk9MHgxMDAwMDAwMDsKKwl3aGlsZShpLS0peworCQl1bnNpZ25lZCBpbnQgZHdWYWwgPSBQRUVLMzIoREVfU1RBVEUyKTsKKwkJaWYoKEZJRUxEX0dFVChkd1ZhbCwgREVfU1RBVEUyLCBERV9TVEFUVVMpID09IERFX1NUQVRFMl9ERV9TVEFUVVNfSURMRSkgJiYKKwkJCShGSUVMRF9HRVQoZHdWYWwsIERFX1NUQVRFMiwgREVfRklGTykgID09IERFX1NUQVRFMl9ERV9GSUZPX0VNUFRZKSAmJgorCQkJKEZJRUxEX0dFVChkd1ZhbCwgREVfU1RBVEUyLCBERV9NRU1fRklGTykgPT0gREVfU1RBVEUyX0RFX01FTV9GSUZPX0VNUFRZKSkKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJLyogdGltZW91dCBlcnJvciAqLworCXJldHVybiAtMTsKK30KKworCitpbnQgaHdfc203NTBfZGVXYWl0KHZvaWQpCit7CisJaW50IGk9MHgxMDAwMDAwMDsKKwl3aGlsZShpLS0peworCQl1bnNpZ25lZCBpbnQgZHdWYWwgPSBQRUVLMzIoU1lTVEVNX0NUUkwpOworCQlpZigoRklFTERfR0VUKGR3VmFsLFNZU1RFTV9DVFJMLERFX1NUQVRVUykgPT0gU1lTVEVNX0NUUkxfREVfU1RBVFVTX0lETEUpICYmCisJCQkoRklFTERfR0VUKGR3VmFsLFNZU1RFTV9DVFJMLERFX0ZJRk8pICA9PSBTWVNURU1fQ1RSTF9ERV9GSUZPX0VNUFRZKSAmJgorCQkJKEZJRUxEX0dFVChkd1ZhbCxTWVNURU1fQ1RSTCxERV9NRU1fRklGTykgPT0gU1lTVEVNX0NUUkxfREVfTUVNX0ZJRk9fRU1QVFkpKQorCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwkvKiB0aW1lb3V0IGVycm9yICovCisJcmV0dXJuIC0xOworfQorCitpbnQgaHdfc203NTBfcGFuX2Rpc3BsYXkoc3RydWN0IGx5bnhmYl9jcnRjICpjcnRjLAorICAgICAgICBjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKyAgICAgICAgY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8pCit7CisgICAgdWludDMyX3QgdG90YWw7CisgICAgLy9jaGVjayBwYXJhbXMKKyAgICBpZiAoKHZhci0+eG9mZnNldCArIHZhci0+eHJlcyA+IHZhci0+eHJlc192aXJ0dWFsKSB8fAorICAgICAgICAgICAgKHZhci0+eW9mZnNldCArIHZhci0+eXJlcyA+IHZhci0+eXJlc192aXJ0dWFsKSkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICB0b3RhbCA9IHZhci0+eW9mZnNldCAqIGluZm8tPmZpeC5saW5lX2xlbmd0aCArCisgICAgICAgICgodmFyLT54b2Zmc2V0ICogdmFyLT5iaXRzX3Blcl9waXhlbCkgPj4gMyk7CisgICAgdG90YWwgKz0gY3J0Yy0+b1NjcmVlbjsKKyAgICBpZiAoY3J0Yy0+Y2hhbm5lbCA9PSBzbTc1MF9wcmltYXJ5KSB7CisgICAgICAgIFBPS0UzMihQQU5FTF9GQl9BRERSRVNTLAorICAgICAgICAgICAgICAgIEZJRUxEX1ZBTFVFKFBFRUszMihQQU5FTF9GQl9BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAgICAgUEFORUxfRkJfQUREUkVTUywgQUREUkVTUywgdG90YWwpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBQT0tFMzIoQ1JUX0ZCX0FERFJFU1MsCisgICAgICAgICAgICAgICAgRklFTERfVkFMVUUoUEVFSzMyKENSVF9GQl9BRERSRVNTKSwKKyAgICAgICAgICAgICAgICAgICAgQ1JUX0ZCX0FERFJFU1MsIEFERFJFU1MsIHRvdGFsKSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203NTBmYi9zbTc1MF9ody5oIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDViZTVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NtNzUwZmIvc203NTBfaHcuaApAQCAtMCwwICsxLDEwNCBAQAorI2lmbmRlZiBMWU5YX0hXNzUwX0hfXworI2RlZmluZSBMWU5YX0hXNzUwX0hfXworCisKKyNkZWZpbmUgREVGQVVMVF9TTTc1MF9DSElQX0NMT0NLIAkJMjkwCisjZGVmaW5lIERFRkFVTFRfU003NTBMRV9DSElQX0NMT0NLICAJMzMzCisjaWZuZGVmIFNNNzUwTEVfUkVWSVNJT05fSUQKKyNkZWZpbmUgU003NTBMRV9SRVZJU0lPTl9JRCAodW5zaWduZWQgY2hhcikweGZlCisjZW5kaWYKKworLy8jZGVmaW5lIERFRkFVTFRfTUVNX0NMT0NLCShERUZBVUxUX1NNNzUwX0NISVBfQ0xPQ0svMSkKKy8vI2RlZmluZSBERUZBVUxUX01BU1RFUl9DTE9DSwkoREVGQVVMVF9TTTc1MF9DSElQX0NMT0NLLzMpCisKKworZW51bSBzbTc1MF9wbmx0eXBleworCisJc203NTBfMjRURlQgPSAwLC8qIDI0Yml0IHRmdCAqLworCisJc203NTBfZHVhbFRGVCA9IDIsLyogZHVhbCAxOCBiaXQgdGZ0ICovCisKKwlzbTc1MF9kb3VibGVURlQgPSAxLC8qIDM2IGJpdCBkb3VibGUgcGl4ZWwgdGZ0ICovCit9OworCisvKiB2Z2EgY2hhbm5lbCBpcyBub3QgY29uY2VybmVkICAqLworZW51bSBzbTc1MF9kYXRhZmxvd3sKKwlzbTc1MF9zaW11bF9wcmksLyogcHJpbWFyeSA9PiBhbGwgaGVhZCAqLworCisJc203NTBfc2ltdWxfc2VjLC8qIHNlY29uZGFyeSA9PiBhbGwgaGVhZCAqLworCisJc203NTBfZHVhbF9ub3JtYWwsLyogCXByaW1hcnkgPT4gcGFuZWwgaGVhZCBhbmQgc2Vjb25kYXJ5ID0+IGNydCAqLworCisJc203NTBfZHVhbF9zd2FwLC8qIAlwcmltYXJ5ID0+IGNydCBoZWFkIGFuZCBzZWNvbmRhcnkgPT4gcGFuZWwgKi8KK307CisKKworZW51bSBzbTc1MF9jaGFubmVseworCXNtNzUwX3ByaW1hcnkgPSAwLAorCS8qIGVudW0gdmFsdWUgZXF1YWwgdG8gdGhlIHJlZ2lzdGVyIGZpbGVkIGRhdGEgKi8KKwlzbTc1MF9zZWNvbmRhcnkgPSAxLAorfTsKKworZW51bSBzbTc1MF9wYXRoeworCXNtNzUwX3BhbmVsID0gMSwKKwlzbTc1MF9jcnQgPSAyLAorCXNtNzUwX3BuYyA9IDMsLyogcGFuZWwgYW5kIGNydCAqLworfTsKKworc3RydWN0IGluaXRfc3RhdHVzeworCXVzaG9ydCBwb3dlck1vZGU7CisJLyogYmVsb3cgdGhyZWUgY2xvY2tzIGFyZSBpbiB1bml0IG9mIE1IWiovCisJdXNob3J0IGNoaXBfY2xrOworCXVzaG9ydCBtZW1fY2xrOworCXVzaG9ydCBtYXN0ZXJfY2xrOworCXVzaG9ydCBzZXRBbGxFbmdPZmY7CisJdXNob3J0IHJlc2V0TWVtb3J5OworfTsKKworc3RydWN0IHNtNzUwX3N0YXRleworCXN0cnVjdCBpbml0X3N0YXR1cyBpbml0UGFybTsKKwllbnVtIHNtNzUwX3BubHR5cGUgcG5sdHlwZTsKKwllbnVtIHNtNzUwX2RhdGFmbG93IGRhdGFmbG93OworCWludCBub2NydDsKKwlpbnQgeExDRDsKKwlpbnQgeUxDRDsKK307CisKKy8qIAlzbTc1MF9zaGFyZSBzdGFuZHMgZm9yIGEgcHJlc2VudGF0aW9uIG9mIHR3byBmcmFtZSBidWZmZXIKKwl0aGF0IHVzZSBvbmUgc203NTAgYWRhcHRvciwgaXQgaXMgc2ltaWxpYXIgdG8gdGhlIHN1cGVyIGNsYXNzIG9mIGx5bnhfc2hhcmUKKwlpbiBDKysKKyovCisKK3N0cnVjdCBzbTc1MF9zaGFyZXsKKwkvKiBpdCdzIGJldHRlciB0byBwdXQgbHlueF9zaGFyZSBzdHJ1Y3QgdG8gdGhlIGZpcnN0IHBsYWNlIG9mIHNtNzUwX3NoYXJlICovCisJc3RydWN0IGx5bnhfc2hhcmUgc2hhcmU7CisJc3RydWN0IHNtNzUwX3N0YXRlIHN0YXRlOworCWludCBod0N1cnNvcjsKKwkvKiAJMDogbm8gaGFyZHdhcmUgY3Vyc29yCisJCTE6IHByaW1hcnkgY3J0YyBodyBjdXJzb3IgZW5hYmxlZCwKKwkJMjogc2Vjb25kYXJ5IGNydGMgaHcgY3Vyc29yIGVuYWJsZWQKKwkJMzogYm90aCBjdHJjIGh3IGN1cnNvciBlbmFibGVkCisJKi8KK307CisKK2ludCBod19zbTc1MF9tYXAoc3RydWN0IGx5bnhfc2hhcmUqIHNoYXJlLHN0cnVjdCBwY2lfZGV2KiBwZGV2KTsKK2ludCBod19zbTc1MF9pbml0aHcoc3RydWN0IGx5bnhfc2hhcmUqLHN0cnVjdCBwY2lfZGV2ICopOwordm9pZCBod19zbTc1MF9pbml0QWNjZWwoc3RydWN0IGx5bnhfc2hhcmUgKik7CitpbnQgaHdfc203NTBfZGVXYWl0KHZvaWQpOworaW50IGh3X3NtNzUwbGVfZGVXYWl0KHZvaWQpOworCityZXNvdXJjZV9zaXplX3QgaHdfc203NTBfZ2V0Vk1TaXplKHN0cnVjdCBseW54X3NoYXJlICopOworaW50IGh3X3NtNzUwX291dHB1dF9jaGVja01vZGUoc3RydWN0IGx5bnhmYl9vdXRwdXQqLHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyopOworaW50IGh3X3NtNzUwX291dHB1dF9zZXRNb2RlKHN0cnVjdCBseW54ZmJfb3V0cHV0KixzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8qLHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyopOworaW50IGh3X3NtNzUwX2NydGNfY2hlY2tNb2RlKHN0cnVjdCBseW54ZmJfY3J0Yyosc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKik7CitpbnQgaHdfc203NTBfY3J0Y19zZXRNb2RlKHN0cnVjdCBseW54ZmJfY3J0Yyosc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKixzdHJ1Y3QgZmJfZml4X3NjcmVlbmluZm8qKTsKK2ludCBod19zbTc1MF9zZXRDb2xSZWcoc3RydWN0IGx5bnhmYl9jcnRjKix1c2hvcnQsdXNob3J0LHVzaG9ydCx1c2hvcnQpOworaW50IGh3X3NtNzUwX3NldEJMQU5LKHN0cnVjdCBseW54ZmJfb3V0cHV0KixpbnQpOworaW50IGh3X3NtNzUwbGVfc2V0QkxBTksoc3RydWN0IGx5bnhmYl9vdXRwdXQqLGludCk7Cit2b2lkIGh3X3NtNzUwX2NydGNfY2xlYXIoc3RydWN0IGx5bnhmYl9jcnRjKik7Cit2b2lkIGh3X3NtNzUwX291dHB1dF9jbGVhcihzdHJ1Y3QgbHlueGZiX291dHB1dCopOworaW50IGh3X3NtNzUwX3Bhbl9kaXNwbGF5KHN0cnVjdCBseW54ZmJfY3J0YyAqY3J0YywKKyAgICAgICAgY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisgICAgICAgIGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9zbTd4eC5oIGIvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvc203eHguaAppbmRleCA3Y2MxODk2Li5jNWQ2MjUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9zbTd4eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4LmgKQEAgLTExOSw3ICsxMTksNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIAkJCSBTTTcxMiBNb2RlIHRhYmxlLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdHJ1Y3QgTW9kZUluaXQgdmdhbW9kZVtdID0geworc3RhdGljIHN0cnVjdCBNb2RlSW5pdCB2Z2Ftb2RlW10gPSB7CiAJewogCSAvKiAgbW9kZSMwOiA2NDAgeCA0ODAgIDE2QnBwICA2MEh6ICovCiAJIDY0MCwgNDgwLCAxNiwgNjAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9zbTd4eGZiLmMgYi9kcml2ZXJzL3N0YWdpbmcvc203eHhmYi9zbTd4eGZiLmMKaW5kZXggZWJkOTUzNi4uNzdmNTFhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NtN3h4ZmIvc203eHhmYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zbTd4eGZiL3NtN3h4ZmIuYwpAQCAtMTEzLDEzICsxMTMsMTUgQEAKIAogc3RhdGljIHN0cnVjdCBzY3JlZW5faW5mbyBzbXRjX3Njcl9pbmZvOwogCitzdGF0aWMgY2hhciAqbW9kZV9vcHRpb247CisKIC8qIHByb2Nlc3MgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGdldCB2Z2EgcGFyYW1ldGVyICovCi1zdGF0aWMgaW50IF9faW5pdCBzbTd4eF92Z2Ffc2V0dXAoY2hhciAqb3B0aW9ucykKK3N0YXRpYyB2b2lkIF9faW5pdCBzbTd4eF92Z2Ffc2V0dXAoY2hhciAqb3B0aW9ucykKIHsKIAlpbnQgaTsKIAogCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm47CiAKIAlzbXRjX3Njcl9pbmZvLmxmYl93aWR0aCA9IDA7CiAJc210Y19zY3JfaW5mby5sZmJfaGVpZ2h0ID0gMDsKQEAgLTEzMywxMyArMTM1LDEwIEBACiAJCQlzbXRjX3Njcl9pbmZvLmxmYl9oZWlnaHQgPQogCQkJCQkJdmVzYV9tb2RlX3RhYmxlW2ldLmxmYl9oZWlnaHQ7CiAJCQlzbXRjX3Njcl9pbmZvLmxmYl9kZXB0aCAgPSB2ZXNhX21vZGVfdGFibGVbaV0ubGZiX2RlcHRoOwotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm47CiAJCX0KIAl9Ci0KLQlyZXR1cm4gLTE7CiB9Ci1fX3NldHVwKCJ2Z2E9Iiwgc203eHhfdmdhX3NldHVwKTsKIAogc3RhdGljIHZvaWQgc203MTJfc2V0cGFsZXR0ZShpbnQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCiAJCQkgICAgIHVuc2lnbmVkIGJsdWUsIHN0cnVjdCBmYl9pbmZvICppbmZvKQpAQCAtNzc3LDYgKzc3NiwxMiBAQAogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgMCwgInNtN3h4ZmIiKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgcmVzZXJ2ZSBmcmFtZWJ1ZmZlciByZWdpb25cbiIpOworCQlnb3RvIGZhaWxlZF9yZWdpb25zOworCX0KKwogCXNwcmludGYoc210Y2ZiX2ZpeC5pZCwgInNtJVhmYiIsIGVudC0+ZGV2aWNlKTsKIAogCXNmYiA9IHNtdGNfYWxsb2NfZmJfaW5mbyhwZGV2KTsKQEAgLTkwNiw2ICs5MTEsOSBAQAogCXNtdGNfZnJlZV9mYl9pbmZvKHNmYik7CiAKIGZhaWxlZF9mcmVlOgorCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKKworZmFpbGVkX3JlZ2lvbnM6CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTkyMyw2ICs5MzEsOCBAQAogCXswLH0KIH07CiAKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBzbXRjZmJfcGNpX3RhYmxlKTsKKwogc3RhdGljIHZvaWQgc210Y2ZiX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IHNtdGNmYl9pbmZvICpzZmI7CkBAIC05MzIsNiArOTQyLDggQEAKIAlzbXRjX3VubWFwX21taW8oc2ZiKTsKIAl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZzZmItPmZiKTsKIAlzbXRjX2ZyZWVfZmJfaW5mbyhzZmIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCAwKTsKKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiB9CiAKICNpZmRlZiBDT05GSUdfUE0KQEAgLTEwMTcsNyArMTAyOSwyOSBAQAogCS5kcml2ZXIucG0gID0gU003WFhfUE1fT1BTLAogfTsKIAotbW9kdWxlX3BjaV9kcml2ZXIoc210Y2ZiX2RyaXZlcik7CitzdGF0aWMgaW50IF9faW5pdCBzbTcxMmZiX2luaXQodm9pZCkKK3sKKyNpZm5kZWYgTU9EVUxFCisJY2hhciAqb3B0aW9uID0gTlVMTDsKKworCWlmIChmYl9nZXRfb3B0aW9ucygic203MTJmYiIsICZvcHRpb24pKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAob3B0aW9uICYmICpvcHRpb24pCisJCW1vZGVfb3B0aW9uID0gb3B0aW9uOworI2VuZGlmCisJc203eHhfdmdhX3NldHVwKG1vZGVfb3B0aW9uKTsKKworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZzbXRjZmJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc203MTJmYl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHNtNzEyZmJfZXhpdCh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmc210Y2ZiX2RyaXZlcik7Cit9CisKK21vZHVsZV9leGl0KHNtNzEyZmJfZXhpdCk7CiAKIE1PRFVMRV9BVVRIT1IoIlNpbGljb25tb3Rpb24gIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkZyYW1lYnVmZmVyIGRyaXZlciBmb3IgU01JIEdyYXBoaWMgQ2FyZHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2tvYmplY3RzLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9rb2JqZWN0cy5jCmluZGV4IDM3MDhiYzEuLjAyMTFkZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL2tvYmplY3RzLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAva29iamVjdHMuYwpAQCAtODQwLDEyICs4NDAsMTAgQEAKIHN0YXRpYyBzc2l6ZV90IG1lc3NhZ2Vfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKIAljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlzc2l6ZV90IHJldHZhbCA9IDA7CiAJc3RydWN0IG1zZ19ncm91cF90ICpncm91cCA9IHNwa19maW5kX21zZ19ncm91cChhdHRyLT5hdHRyLm5hbWUpOwogCiAJQlVHX09OKCFncm91cCk7Ci0JcmV0dmFsID0gbWVzc2FnZV9zdG9yZV9oZWxwZXIoYnVmLCBjb3VudCwgZ3JvdXApOwotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIG1lc3NhZ2Vfc3RvcmVfaGVscGVyKGJ1ZiwgY291bnQsIGdyb3VwKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL21haW4uYwppbmRleCBlOWYwYzE1Li5jOTU1OTc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvbWFpbi5jCkBAIC00MjMsNyArNDIzLDggQEAKIAlpZiAoc3BrX2JsZWVwcyAmIDEpCiAJCWJsZWVwKHNwa195KTsKIAlpZiAoKHNwa19ibGVlcHMgJiAyKSAmJiAobXNnX2lkIDwgZWRnZV9xdWlldCkpCi0JCXN5bnRoX3ByaW50ZigiJXNcbiIsIHNwa19tc2dfZ2V0KE1TR19FREdFX01TR1NfU1RBUlQgKyBtc2dfaWQgLSAxKSk7CisJCXN5bnRoX3ByaW50ZigiJXNcbiIsCisJCQlzcGtfbXNnX2dldChNU0dfRURHRV9NU0dTX1NUQVJUICsgbXNnX2lkIC0gMSkpOwogfQogCiBzdGF0aWMgdm9pZCBzcGVha19jaGFyKHVfY2hhciBjaCkKQEAgLTExMzEsNyArMTEzMiw4IEBACiAJaWYgKGluX2NvdW50ID4gMiAmJiByZXBfY291bnQgPiAyKSB7CiAJCWlmIChsYXN0X3R5cGUgJiBDSF9SUFQpIHsKIAkJCXN5bnRoX3ByaW50ZigiICIpOwotCQkJc3ludGhfcHJpbnRmKHNwa19tc2dfZ2V0KE1TR19SRVBFQVRfREVTQzIpLCArK3JlcF9jb3VudCk7CisJCQlzeW50aF9wcmludGYoc3BrX21zZ19nZXQoTVNHX1JFUEVBVF9ERVNDMiksCisJCQkJCSsrcmVwX2NvdW50KTsKIAkJCXN5bnRoX3ByaW50ZigiICIpOwogCQl9CiAJCXJlcF9jb3VudCA9IDA7CkBAIC0xNTI3LDcgKzE1MjksNyBAQAogCWludCBpLCBiaSwgaGk7CiAJaW50IHZjX251bSA9IHZjLT52Y19udW07CiAKLQliaSA9ICgodmMtPnZjX2F0dHIgJiAweDcwKSA+PiA0KTsKKwliaSA9ICh2Yy0+dmNfYXR0ciAmIDB4NzApID4+IDQ7CiAJaGkgPSBzcGVha3VwX2NvbnNvbGVbdmNfbnVtXS0+aHQuaGlnaHNpemVbYmldOwogCiAJaSA9IDA7CkBAIC0xODQ3LDcgKzE4NDksOCBAQAogCQkJd2luX3JpZ2h0ID0gc3BrX3g7CiAJCX0KIAkJc25wcmludGYoaW5mbywgc2l6ZW9mKGluZm8pLCBzcGtfbXNnX2dldChNU0dfV0lORE9XX0JPVU5EQVJZKSwKLQkJCSAod2luX3N0YXJ0KSA/IHNwa19tc2dfZ2V0KE1TR19FTkQpIDogc3BrX21zZ19nZXQoTVNHX1NUQVJUKSwKKwkJCSAod2luX3N0YXJ0KSA/CisJCQkJc3BrX21zZ19nZXQoTVNHX0VORCkgOiBzcGtfbXNnX2dldChNU0dfU1RBUlQpLAogCQkJIChpbnQpc3BrX3kgKyAxLCAoaW50KXNwa194ICsgMSk7CiAJfQogCXN5bnRoX3ByaW50ZigiJXNcbiIsIGluZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc2VyaWFsaW8uaCBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NlcmlhbGlvLmgKaW5kZXggMzE3YmI4NC4uMWIzOTkyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc2VyaWFsaW8uaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zZXJpYWxpby5oCkBAIC0zNCw2ICszNCw3IEBACiAjZGVmaW5lIFNQS19USU1FT1VUIDEwMAogI2RlZmluZSBCT1RIX0VNUFRZIChVQVJUX0xTUl9URU1UIHwgVUFSVF9MU1JfVEhSRSkKIAotI2RlZmluZSBzcGtfc2VyaWFsX3R4X2J1c3koKSAoKGluYihzcGVha3VwX2luZm8ucG9ydF90dHMgKyBVQVJUX0xTUikgJiBCT1RIX0VNUFRZKSAhPSBCT1RIX0VNUFRZKQorI2RlZmluZSBzcGtfc2VyaWFsX3R4X2J1c3koKSBcCisJKChpbmIoc3BlYWt1cF9pbmZvLnBvcnRfdHRzICsgVUFSVF9MU1IpICYgQk9USF9FTVBUWSkgIT0gQk9USF9FTVBUWSkKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwLmggYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwLmgKaW5kZXggODk4ZGNlNS4uYTdmNDk2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXAuaApAQCAtNjEsMTAgKzYxLDEyIEBACiBleHRlcm4gc3RydWN0IHN0X3Zhcl9oZWFkZXIgKnNwa192YXJfaGVhZGVyX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSk7CiBleHRlcm4gc3RydWN0IHB1bmNfdmFyX3QgKnNwa19nZXRfcHVuY192YXIoZW51bSB2YXJfaWRfdCB2YXJfaWQpOwogZXh0ZXJuIGludCBzcGtfc2V0X251bV92YXIoaW50IHZhbCwgc3RydWN0IHN0X3Zhcl9oZWFkZXIgKnZhciwgaW50IGhvdyk7Ci1leHRlcm4gaW50IHNwa19zZXRfc3RyaW5nX3Zhcihjb25zdCBjaGFyICpwYWdlLCBzdHJ1Y3Qgc3RfdmFyX2hlYWRlciAqdmFyLCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgc3BrX3NldF9zdHJpbmdfdmFyKGNvbnN0IGNoYXIgKnBhZ2UsIHN0cnVjdCBzdF92YXJfaGVhZGVyICp2YXIsCisJCQkJaW50IGxlbik7CiBleHRlcm4gaW50IHNwa19zZXRfbWFza19iaXRzKGNvbnN0IGNoYXIgKmlucHV0LCBjb25zdCBpbnQgd2hpY2gsIGNvbnN0IGludCBob3cpOwogZXh0ZXJuIHNwZWNpYWxfZnVuYyBzcGtfc3BlY2lhbF9oYW5kbGVyOwotZXh0ZXJuIGludCBzcGtfaGFuZGxlX2hlbHAoc3RydWN0IHZjX2RhdGEgKnZjLCB1X2NoYXIgdHlwZSwgdV9jaGFyIGNoLCB1X3Nob3J0IGtleSk7CitleHRlcm4gaW50IHNwa19oYW5kbGVfaGVscChzdHJ1Y3QgdmNfZGF0YSAqdmMsIHVfY2hhciB0eXBlLCB1X2NoYXIgY2gsCisJCQkJdV9zaG9ydCBrZXkpOwogZXh0ZXJuIGludCBzeW50aF9pbml0KGNoYXIgKm5hbWUpOwogZXh0ZXJuIHZvaWQgc3ludGhfcmVsZWFzZSh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hY250cGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfYWNudHBjLmMKaW5kZXggZjBiZmQ5ZS4uZjQxODg5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hY250cGMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2FjbnRwYy5jCkBAIC0zMTgsMTggKzMxOCw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJTZXQgdGhlIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAob3ZlcnJpZGUgcHJvYmluZykuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBhY250cGNfaW5pdCh2b2lkKQotewotCXJldHVybiBzeW50aF9hZGQoJnN5bnRoX2FjbnRwYyk7Ci19Cittb2R1bGVfc3BrX3N5bnRoKHN5bnRoX2FjbnRwYyk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBhY250cGNfZXhpdCh2b2lkKQotewotCXN5bnRoX3JlbW92ZSgmc3ludGhfYWNudHBjKTsKLX0KLQotbW9kdWxlX2luaXQoYWNudHBjX2luaXQpOwotbW9kdWxlX2V4aXQoYWNudHBjX2V4aXQpOwogTU9EVUxFX0FVVEhPUigiS2lyayBSZWlzZXIgPGtpcmtAYnJhaWxsZS51d28uY2E+Iik7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCb3Jvd3NraSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVha3VwIHN1cHBvcnQgZm9yIEFjY2VudCBQQyBzeW50aGVzaXplciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hY250c2EuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfYWNudHNhLmMKaW5kZXggM2YyYjU2OS4uYWYyNjkwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hY250c2EuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2FjbnRzYS5jCkBAIC0xNDMsMTggKzE0Myw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHNlciwgIlNldCB0aGUgc2VyaWFsIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAoMC1iYXNlZCkuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBhY250c2FfaW5pdCh2b2lkKQotewotCXJldHVybiBzeW50aF9hZGQoJnN5bnRoX2FjbnRzYSk7Ci19Cittb2R1bGVfc3BrX3N5bnRoKHN5bnRoX2FjbnRzYSk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBhY250c2FfZXhpdCh2b2lkKQotewotCXN5bnRoX3JlbW92ZSgmc3ludGhfYWNudHNhKTsKLX0KLQotbW9kdWxlX2luaXQoYWNudHNhX2luaXQpOwotbW9kdWxlX2V4aXQoYWNudHNhX2V4aXQpOwogTU9EVUxFX0FVVEhPUigiS2lyayBSZWlzZXIgPGtpcmtAYnJhaWxsZS51d28uY2E+Iik7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCb3Jvd3NraSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVha3VwIHN1cHBvcnQgZm9yIEFjY2VudCBTQSBzeW50aGVzaXplciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hcG9sbG8uYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfYXBvbGxvLmMKaW5kZXggNjc4YjI2My4uNTE3ODhmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hcG9sbG8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2Fwb2xsby5jCkBAIC0yMDcsMTggKzIwNyw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHNlciwgIlNldCB0aGUgc2VyaWFsIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAoMC1iYXNlZCkuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBhcG9sbG9faW5pdCh2b2lkKQotewotCXJldHVybiBzeW50aF9hZGQoJnN5bnRoX2Fwb2xsbyk7Ci19Cittb2R1bGVfc3BrX3N5bnRoKHN5bnRoX2Fwb2xsbyk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBhcG9sbG9fZXhpdCh2b2lkKQotewotCXN5bnRoX3JlbW92ZSgmc3ludGhfYXBvbGxvKTsKLX0KLQotbW9kdWxlX2luaXQoYXBvbGxvX2luaXQpOwotbW9kdWxlX2V4aXQoYXBvbGxvX2V4aXQpOwogTU9EVUxFX0FVVEhPUigiS2lyayBSZWlzZXIgPGtpcmtAYnJhaWxsZS51d28uY2E+Iik7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCb3Jvd3NraSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVha3VwIHN1cHBvcnQgZm9yIEFwb2xsbyBJSSBzeW50aGVzaXplciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hdWRwdHIuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfYXVkcHRyLmMKaW5kZXggNWNiYWVjOC4uZWE4OWUzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9hdWRwdHIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2F1ZHB0ci5jCkBAIC0xNzcsMTggKzE3Nyw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHNlciwgIlNldCB0aGUgc2VyaWFsIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAoMC1iYXNlZCkuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBhdWRwdHJfaW5pdCh2b2lkKQotewotCXJldHVybiBzeW50aF9hZGQoJnN5bnRoX2F1ZHB0cik7Ci19Cittb2R1bGVfc3BrX3N5bnRoKHN5bnRoX2F1ZHB0cik7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBhdWRwdHJfZXhpdCh2b2lkKQotewotCXN5bnRoX3JlbW92ZSgmc3ludGhfYXVkcHRyKTsKLX0KLQotbW9kdWxlX2luaXQoYXVkcHRyX2luaXQpOwotbW9kdWxlX2V4aXQoYXVkcHRyX2V4aXQpOwogTU9EVUxFX0FVVEhPUigiS2lyayBSZWlzZXIgPGtpcmtAYnJhaWxsZS51d28uY2E+Iik7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCb3Jvd3NraSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVha3VwIHN1cHBvcnQgZm9yIEF1ZGFwdGVyIHN5bnRoZXNpemVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2Jucy5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9ibnMuYwppbmRleCAyZjA3MDI4Li44MGY4MzU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2Jucy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfYm5zLmMKQEAgLTEyNywxOCArMTI3LDggQEAKIE1PRFVMRV9QQVJNX0RFU0Moc2VyLCAiU2V0IHRoZSBzZXJpYWwgcG9ydCBmb3IgdGhlIHN5bnRoZXNpemVyICgwLWJhc2VkKS4iKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IGJuc19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5bnRoX2FkZCgmc3ludGhfYm5zKTsKLX0KK21vZHVsZV9zcGtfc3ludGgoc3ludGhfYm5zKTsKIAotc3RhdGljIHZvaWQgX19leGl0IGJuc19leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF9ibnMpOwotfQotCi1tb2R1bGVfaW5pdChibnNfaW5pdCk7Ci1tb2R1bGVfZXhpdChibnNfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIFJlaXNlciA8a2lya0BicmFpbGxlLnV3by5jYT4iKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIEJvcm93c2tpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNwZWFrdXAgc3VwcG9ydCBmb3IgQnJhaWxsZSAnbiBTcGVhayBzeW50aGVzaXplcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjZXh0LmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2RlY2V4dC5jCmluZGV4IDU1NTAyOTAuLmUwYjVkYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjZXh0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWNleHQuYwpAQCAtMjA3LDEwICsyMDcsMTIgQEAKIAkJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGppZmZfbWF4KSkgewogCQkJCWlmICghaW5fZXNjYXBlKQogCQkJCQlzcGtfc2VyaWFsX291dChQUk9DU1BFRUNIKTsKLQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLCBmbGFncyk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywKKwkJCQkJCQlmbGFncyk7CiAJCQkJamlmZnlfZGVsdGFfdmFsID0gamlmZnlfZGVsdGEtPnUubi52YWx1ZTsKIAkJCQlkZWxheV90aW1lX3ZhbCA9IGRlbGF5X3RpbWUtPnUubi52YWx1ZTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssCisJCQkJCQkJZmxhZ3MpOwogCQkJCXNjaGVkdWxlX3RpbWVvdXQobXNlY3NfdG9famlmZmllcwogCQkJCQkJIChkZWxheV90aW1lX3ZhbCkpOwogCQkJCWppZmZfbWF4ID0gamlmZmllcyArIGppZmZ5X2RlbHRhX3ZhbDsKQEAgLTIzNCwxOCArMjM2LDggQEAKIE1PRFVMRV9QQVJNX0RFU0Moc2VyLCAiU2V0IHRoZSBzZXJpYWwgcG9ydCBmb3IgdGhlIHN5bnRoZXNpemVyICgwLWJhc2VkKS4iKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IGRlY2V4dF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5bnRoX2FkZCgmc3ludGhfZGVjZXh0KTsKLX0KK21vZHVsZV9zcGtfc3ludGgoc3ludGhfZGVjZXh0KTsKIAotc3RhdGljIHZvaWQgX19leGl0IGRlY2V4dF9leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF9kZWNleHQpOwotfQotCi1tb2R1bGVfaW5pdChkZWNleHRfaW5pdCk7Ci1tb2R1bGVfZXhpdChkZWNleHRfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIFJlaXNlciA8a2lya0BicmFpbGxlLnV3by5jYT4iKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIEJvcm93c2tpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNwZWFrdXAgc3VwcG9ydCBmb3IgREVDdGFsayBFeHRlcm5hbCBzeW50aGVzaXplcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjcGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjcGMuYwppbmRleCA3YzljNDMyLi40MzdlMTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2RlY3BjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWNwYy5jCkBAIC00MjMsMTAgKzQyMywxMiBAQAogCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgamlmZl9tYXgpKSB7CiAJCQkJaWYgKCFpbl9lc2NhcGUpCiAJCQkJCWR0X3NlbmRjaGFyKFBST0NTUEVFQ0gpOwotCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzcGVha3VwX2luZm8uc3BpbmxvY2ssIGZsYWdzKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BlYWt1cF9pbmZvLnNwaW5sb2NrLAorCQkJCQkJCWZsYWdzKTsKIAkJCQlqaWZmeV9kZWx0YV92YWwgPSBqaWZmeV9kZWx0YS0+dS5uLnZhbHVlOwogCQkJCWRlbGF5X3RpbWVfdmFsID0gZGVsYXlfdGltZS0+dS5uLnZhbHVlOwotCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywgZmxhZ3MpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwZWFrdXBfaW5mby5zcGlubG9jaywKKwkJCQkJCQlmbGFncyk7CiAJCQkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzCiAJCQkJCQkgKGRlbGF5X3RpbWVfdmFsKSk7CiAJCQkJamlmZl9tYXggPSBqaWZmaWVzICsgamlmZnlfZGVsdGFfdmFsOwpAQCAtNDkxLDE4ICs0OTMsOCBAQAogCiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBkZWNwY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5bnRoX2FkZCgmc3ludGhfZGVjX3BjKTsKLX0KK21vZHVsZV9zcGtfc3ludGgoc3ludGhfZGVjX3BjKTsKIAotc3RhdGljIHZvaWQgX19leGl0IGRlY3BjX2V4aXQodm9pZCkKLXsKLQlzeW50aF9yZW1vdmUoJnN5bnRoX2RlY19wYyk7Ci19Ci0KLW1vZHVsZV9pbml0KGRlY3BjX2luaXQpOwotbW9kdWxlX2V4aXQoZGVjcGNfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIFJlaXNlciA8a2lya0BicmFpbGxlLnV3by5jYT4iKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIEJvcm93c2tpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNwZWFrdXAgc3VwcG9ydCBmb3IgREVDdGFsayBQQyBzeW50aGVzaXplcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjdGxrLmMgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2RlY3Rsay5jCmluZGV4IDY5ZTdjMmIuLmI1YTIzZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZGVjdGxrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kZWN0bGsuYwpAQCAtMzA2LDE4ICszMDYsOCBAQAogTU9EVUxFX1BBUk1fREVTQyhzZXIsICJTZXQgdGhlIHNlcmlhbCBwb3J0IGZvciB0aGUgc3ludGhlc2l6ZXIgKDAtYmFzZWQpLiIpOwogTU9EVUxFX1BBUk1fREVTQyhzdGFydCwgIlN0YXJ0IHRoZSBzeW50aGVzaXplciBvbmNlIGl0IGlzIGxvYWRlZC4iKTsKIAotc3RhdGljIGludCBfX2luaXQgZGVjdGxrX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3ludGhfYWRkKCZzeW50aF9kZWN0bGspOwotfQorbW9kdWxlX3Nwa19zeW50aChzeW50aF9kZWN0bGspOwogCi1zdGF0aWMgdm9pZCBfX2V4aXQgZGVjdGxrX2V4aXQodm9pZCkKLXsKLQlzeW50aF9yZW1vdmUoJnN5bnRoX2RlY3Rsayk7Ci19Ci0KLW1vZHVsZV9pbml0KGRlY3Rsa19pbml0KTsKLW1vZHVsZV9leGl0KGRlY3Rsa19leGl0KTsKIE1PRFVMRV9BVVRIT1IoIktpcmsgUmVpc2VyIDxraXJrQGJyYWlsbGUudXdvLmNhPiIpOwogTU9EVUxFX0FVVEhPUigiRGF2aWQgQm9yb3dza2kiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3BlYWt1cCBzdXBwb3J0IGZvciBERUN0YWxrIEV4cHJlc3Mgc3ludGhlc2l6ZXJzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2R0bGsuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZHRsay5jCmluZGV4IDg5NTkyYzAuLjM0NWVmZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZHRsay5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZHRsay5jCkBAIC0zODgsMTggKzM4OCw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJTZXQgdGhlIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAob3ZlcnJpZGUgcHJvYmluZykuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBkdGxrX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3ludGhfYWRkKCZzeW50aF9kdGxrKTsKLX0KK21vZHVsZV9zcGtfc3ludGgoc3ludGhfZHRsayk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBkdGxrX2V4aXQodm9pZCkKLXsKLQlzeW50aF9yZW1vdmUoJnN5bnRoX2R0bGspOwotfQotCi1tb2R1bGVfaW5pdChkdGxrX2luaXQpOwotbW9kdWxlX2V4aXQoZHRsa19leGl0KTsKIE1PRFVMRV9BVVRIT1IoIktpcmsgUmVpc2VyIDxraXJrQGJyYWlsbGUudXdvLmNhPiIpOwogTU9EVUxFX0FVVEhPUigiRGF2aWQgQm9yb3dza2kiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3BlYWt1cCBzdXBwb3J0IGZvciBEb3VibGVUYWxrIFBDIHN5bnRoZXNpemVycyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kdW1teS5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9kdW1teS5jCmluZGV4IDM2MjM0MmEuLmY2NjgxMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfZHVtbXkuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2R1bW15LmMKQEAgLTEyOSwxOCArMTI5LDggQEAKIE1PRFVMRV9QQVJNX0RFU0Moc2VyLCAiU2V0IHRoZSBzZXJpYWwgcG9ydCBmb3IgdGhlIHN5bnRoZXNpemVyICgwLWJhc2VkKS4iKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IGR1bW15X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc3ludGhfYWRkKCZzeW50aF9kdW1teSk7Ci19Cittb2R1bGVfc3BrX3N5bnRoKHN5bnRoX2R1bW15KTsKIAotc3RhdGljIHZvaWQgX19leGl0IGR1bW15X2V4aXQodm9pZCkKLXsKLQlzeW50aF9yZW1vdmUoJnN5bnRoX2R1bW15KTsKLX0KLQotbW9kdWxlX2luaXQoZHVtbXlfaW5pdCk7Ci1tb2R1bGVfZXhpdChkdW1teV9leGl0KTsKIE1PRFVMRV9BVVRIT1IoIlNhbXVlbCBUaGliYXVsdCA8c2FtdWVsLnRoaWJhdWx0QGVucy1seW9uLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3BlYWt1cCBzdXBwb3J0IGZvciB0ZXh0IGNvbnNvbGUiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfa2V5cGMuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfa2V5cGMuYwppbmRleCBjZWYyMGZkLi42ZWEwMjczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX2tleXBjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9rZXlwYy5jCkBAIC0zMTksMTggKzMxOSw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJTZXQgdGhlIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAob3ZlcnJpZGUgcHJvYmluZykuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBrZXlwY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5bnRoX2FkZCgmc3ludGhfa2V5cGMpOwotfQorbW9kdWxlX3Nwa19zeW50aChzeW50aF9rZXlwYyk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBrZXlwY19leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF9rZXlwYyk7Ci19Ci0KLW1vZHVsZV9pbml0KGtleXBjX2luaXQpOwotbW9kdWxlX2V4aXQoa2V5cGNfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCb3Jvd3NraSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVha3VwIHN1cHBvcnQgZm9yIEtleW5vdGUgR29sZCBQQyBzeW50aGVzaXplcnMiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfbHRsay5jIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9sdGxrLmMKaW5kZXggMzc3YTZlMi4uY2M0ODA2YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9sdGxrLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9sdGxrLmMKQEAgLTE3NSwxOCArMTc1LDggQEAKIE1PRFVMRV9QQVJNX0RFU0Moc2VyLCAiU2V0IHRoZSBzZXJpYWwgcG9ydCBmb3IgdGhlIHN5bnRoZXNpemVyICgwLWJhc2VkKS4iKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IGx0bGtfaW5pdCh2b2lkKQotewotCXJldHVybiBzeW50aF9hZGQoJnN5bnRoX2x0bGspOwotfQorbW9kdWxlX3Nwa19zeW50aChzeW50aF9sdGxrKTsKIAotc3RhdGljIHZvaWQgX19leGl0IGx0bGtfZXhpdCh2b2lkKQotewotCXN5bnRoX3JlbW92ZSgmc3ludGhfbHRsayk7Ci19Ci0KLW1vZHVsZV9pbml0KGx0bGtfaW5pdCk7Ci1tb2R1bGVfZXhpdChsdGxrX2V4aXQpOwogTU9EVUxFX0FVVEhPUigiS2lyayBSZWlzZXIgPGtpcmtAYnJhaWxsZS51d28uY2E+Iik7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCb3Jvd3NraSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVha3VwIHN1cHBvcnQgZm9yIERvdWJsZVRhbGsgTFQvTGl0ZVRhbGsgc3ludGhlc2l6ZXJzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX3NvZnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfc29mdC5jCmluZGV4IGU2ZTkzZmIuLmZiMzFiYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfc29mdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfc29mdC5jCkBAIC0zNTAsMTkgKzM1MCw4IEBACiAKIE1PRFVMRV9QQVJNX0RFU0Moc3RhcnQsICJTdGFydCB0aGUgc3ludGhlc2l6ZXIgb25jZSBpdCBpcyBsb2FkZWQuIik7CiAKK21vZHVsZV9zcGtfc3ludGgoc3ludGhfc29mdCk7CiAKLXN0YXRpYyBpbnQgX19pbml0IHNvZnRfaW5pdCh2b2lkKQotewotCXJldHVybiBzeW50aF9hZGQoJnN5bnRoX3NvZnQpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc29mdF9leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF9zb2Z0KTsKLX0KLQotbW9kdWxlX2luaXQoc29mdF9pbml0KTsKLW1vZHVsZV9leGl0KHNvZnRfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIFJlaXNlciA8a2lya0BicmFpbGxlLnV3by5jYT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU3BlYWt1cCB1c2Vyc3BhY2Ugc29mdHdhcmUgc3ludGhlc2l6ZXIgc3VwcG9ydCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9zcGtvdXQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfc3Brb3V0LmMKaW5kZXggYmNjZGRmOC4uMTAwN2E2MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF9zcGtvdXQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX3Nwa291dC5jCkBAIC0xNDYsMTggKzE0Niw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHNlciwgIlNldCB0aGUgc2VyaWFsIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAoMC1iYXNlZCkuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCBzcGtvdXRfaW5pdCh2b2lkKQotewotCXJldHVybiBzeW50aF9hZGQoJnN5bnRoX3Nwa291dCk7Ci19Cittb2R1bGVfc3BrX3N5bnRoKHN5bnRoX3Nwa291dCk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBzcGtvdXRfZXhpdCh2b2lkKQotewotCXN5bnRoX3JlbW92ZSgmc3ludGhfc3Brb3V0KTsKLX0KLQotbW9kdWxlX2luaXQoc3Brb3V0X2luaXQpOwotbW9kdWxlX2V4aXQoc3Brb3V0X2V4aXQpOwogTU9EVUxFX0FVVEhPUigiS2lyayBSZWlzZXIgPGtpcmtAYnJhaWxsZS51d28uY2E+Iik7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBCb3Jvd3NraSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTcGVha3VwIHN1cHBvcnQgZm9yIFNwZWFrIE91dCBzeW50aGVzaXplcnMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfdHhwcnQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3NwZWFrdXBfdHhwcnQuYwppbmRleCBkYmU4NGIxLi42YzIxZTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGVha3VwX3R4cHJ0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BlYWt1cF90eHBydC5jCkBAIC0xMjcsMTggKzEyNyw4IEBACiBNT0RVTEVfUEFSTV9ERVNDKHNlciwgIlNldCB0aGUgc2VyaWFsIHBvcnQgZm9yIHRoZSBzeW50aGVzaXplciAoMC1iYXNlZCkuIik7CiBNT0RVTEVfUEFSTV9ERVNDKHN0YXJ0LCAiU3RhcnQgdGhlIHN5bnRoZXNpemVyIG9uY2UgaXQgaXMgbG9hZGVkLiIpOwogCi1zdGF0aWMgaW50IF9faW5pdCB0eHBydF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHN5bnRoX2FkZCgmc3ludGhfdHhwcnQpOwotfQorbW9kdWxlX3Nwa19zeW50aChzeW50aF90eHBydCk7CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCB0eHBydF9leGl0KHZvaWQpCi17Ci0Jc3ludGhfcmVtb3ZlKCZzeW50aF90eHBydCk7Ci19Ci0KLW1vZHVsZV9pbml0KHR4cHJ0X2luaXQpOwotbW9kdWxlX2V4aXQodHhwcnRfZXhpdCk7CiBNT0RVTEVfQVVUSE9SKCJLaXJrIFJlaXNlciA8a2lya0BicmFpbGxlLnV3by5jYT4iKTsKIE1PRFVMRV9BVVRIT1IoIkRhdmlkIEJvcm93c2tpIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlNwZWFrdXAgc3VwcG9ydCBmb3IgVHJhbnNwb3J0IHN5bnRoZXNpemVycyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3ByaXYuaCBiL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3Nwa19wcml2LmgKaW5kZXggNjM3YmE2Ny4uMWVmMzc5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3ByaXYuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvc3BlYWt1cC9zcGtfcHJpdi5oCkBAIC00NCwzNCArNDQsMzQgQEAKIAogI2RlZmluZSBLVF9TUEtVUCAxNQogCi1leHRlcm4gY29uc3Qgc3RydWN0IG9sZF9zZXJpYWxfcG9ydCAqc3BrX3NlcmlhbF9pbml0KGludCBpbmRleCk7Ci1leHRlcm4gdm9pZCBzcGtfc3RvcF9zZXJpYWxfaW50ZXJydXB0KHZvaWQpOwotZXh0ZXJuIGludCBzcGtfd2FpdF9mb3JfeG1pdHIodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgY2hhciBzcGtfc2VyaWFsX2luKHZvaWQpOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc3BrX3NlcmlhbF9pbl9ub3dhaXQodm9pZCk7Ci1leHRlcm4gaW50IHNwa19zZXJpYWxfb3V0KGNvbnN0IGNoYXIgY2gpOwotZXh0ZXJuIHZvaWQgc3BrX3NlcmlhbF9yZWxlYXNlKHZvaWQpOworY29uc3Qgc3RydWN0IG9sZF9zZXJpYWxfcG9ydCAqc3BrX3NlcmlhbF9pbml0KGludCBpbmRleCk7Cit2b2lkIHNwa19zdG9wX3NlcmlhbF9pbnRlcnJ1cHQodm9pZCk7CitpbnQgc3BrX3dhaXRfZm9yX3htaXRyKHZvaWQpOwordW5zaWduZWQgY2hhciBzcGtfc2VyaWFsX2luKHZvaWQpOwordW5zaWduZWQgY2hhciBzcGtfc2VyaWFsX2luX25vd2FpdCh2b2lkKTsKK2ludCBzcGtfc2VyaWFsX291dChjb25zdCBjaGFyIGNoKTsKK3ZvaWQgc3BrX3NlcmlhbF9yZWxlYXNlKHZvaWQpOwogCi1leHRlcm4gY2hhciBzeW50aF9idWZmZXJfZ2V0Yyh2b2lkKTsKLWV4dGVybiBjaGFyIHN5bnRoX2J1ZmZlcl9wZWVrKHZvaWQpOwotZXh0ZXJuIGludCBzeW50aF9idWZmZXJfZW1wdHkodm9pZCk7Ci1leHRlcm4gc3RydWN0IHZhcl90ICpzcGtfZ2V0X3ZhcihlbnVtIHZhcl9pZF90IHZhcl9pZCk7Ci1leHRlcm4gc3NpemVfdCBzcGtfdmFyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKLQljaGFyICpidWYpOwotZXh0ZXJuIHNzaXplX3Qgc3BrX3Zhcl9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK2NoYXIgc3ludGhfYnVmZmVyX2dldGModm9pZCk7CitjaGFyIHN5bnRoX2J1ZmZlcl9wZWVrKHZvaWQpOworaW50IHN5bnRoX2J1ZmZlcl9lbXB0eSh2b2lkKTsKK3N0cnVjdCB2YXJfdCAqc3BrX2dldF92YXIoZW51bSB2YXJfaWRfdCB2YXJfaWQpOworc3NpemVfdCBzcGtfdmFyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICBjaGFyICpidWYpOworc3NpemVfdCBzcGtfdmFyX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIAotZXh0ZXJuIGludCBzcGtfc2VyaWFsX3N5bnRoX3Byb2JlKHN0cnVjdCBzcGtfc3ludGggKnN5bnRoKTsKLWV4dGVybiBjb25zdCBjaGFyICpzcGtfc3ludGhfaW1tZWRpYXRlKHN0cnVjdCBzcGtfc3ludGggKnN5bnRoLCBjb25zdCBjaGFyICpidWZmKTsKLWV4dGVybiB2b2lkIHNwa19kb19jYXRjaF91cChzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7Ci1leHRlcm4gdm9pZCBzcGtfc3ludGhfZmx1c2goc3RydWN0IHNwa19zeW50aCAqc3ludGgpOwotZXh0ZXJuIGludCBzcGtfc3ludGhfaXNfYWxpdmVfbm9wKHN0cnVjdCBzcGtfc3ludGggKnN5bnRoKTsKLWV4dGVybiBpbnQgc3BrX3N5bnRoX2lzX2FsaXZlX3Jlc3RhcnQoc3RydWN0IHNwa19zeW50aCAqc3ludGgpOwotZXh0ZXJuIHZvaWQgc3ludGhfcHJpbnRmKGNvbnN0IGNoYXIgKmJ1ZiwgLi4uKTsKLWV4dGVybiBpbnQgc3ludGhfcmVxdWVzdF9yZWdpb24odV9sb25nLCB1X2xvbmcpOwotZXh0ZXJuIGludCBzeW50aF9yZWxlYXNlX3JlZ2lvbih1X2xvbmcsIHVfbG9uZyk7Ci1leHRlcm4gaW50IHN5bnRoX2FkZChzdHJ1Y3Qgc3BrX3N5bnRoICppbl9zeW50aCk7Ci1leHRlcm4gdm9pZCBzeW50aF9yZW1vdmUoc3RydWN0IHNwa19zeW50aCAqaW5fc3ludGgpOworaW50IHNwa19zZXJpYWxfc3ludGhfcHJvYmUoc3RydWN0IHNwa19zeW50aCAqc3ludGgpOworY29uc3QgY2hhciAqc3BrX3N5bnRoX2ltbWVkaWF0ZShzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCwgY29uc3QgY2hhciAqYnVmZik7Cit2b2lkIHNwa19kb19jYXRjaF91cChzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7Cit2b2lkIHNwa19zeW50aF9mbHVzaChzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7CitpbnQgc3BrX3N5bnRoX2lzX2FsaXZlX25vcChzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7CitpbnQgc3BrX3N5bnRoX2lzX2FsaXZlX3Jlc3RhcnQoc3RydWN0IHNwa19zeW50aCAqc3ludGgpOwordm9pZCBzeW50aF9wcmludGYoY29uc3QgY2hhciAqYnVmLCAuLi4pOworaW50IHN5bnRoX3JlcXVlc3RfcmVnaW9uKHVfbG9uZywgdV9sb25nKTsKK2ludCBzeW50aF9yZWxlYXNlX3JlZ2lvbih1X2xvbmcsIHVfbG9uZyk7CitpbnQgc3ludGhfYWRkKHN0cnVjdCBzcGtfc3ludGggKmluX3N5bnRoKTsKK3ZvaWQgc3ludGhfcmVtb3ZlKHN0cnVjdCBzcGtfc3ludGggKmluX3N5bnRoKTsKIAogZXh0ZXJuIHN0cnVjdCBzcGVha3VwX2luZm9fdCBzcGVha3VwX2luZm87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zcGVha3VwL3Nwa190eXBlcy5oIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3R5cGVzLmgKaW5kZXggOGM1NjVjOS4uZThmZjVkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3R5cGVzLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3NwZWFrdXAvc3BrX3R5cGVzLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIGZvciBpbmJfcCwgb3V0Yl9wLCBpbmIsIG91dGIsIGV0Yy4uLiAqLworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogCiBlbnVtIHZhcl90eXBlX3QgewogCVZBUl9OVU0gPSAwLApAQCAtMTY3LDcgKzE2OCw4IEBACiAJaW50ICpkZWZhdWx0X3ZvbDsKIAlpbnQgKCpwcm9iZSkoc3RydWN0IHNwa19zeW50aCAqc3ludGgpOwogCXZvaWQgKCpyZWxlYXNlKSh2b2lkKTsKLQljb25zdCBjaGFyICooKnN5bnRoX2ltbWVkaWF0ZSkoc3RydWN0IHNwa19zeW50aCAqc3ludGgsIGNvbnN0IGNoYXIgKmJ1ZmYpOworCWNvbnN0IGNoYXIgKigqc3ludGhfaW1tZWRpYXRlKShzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCwKKwkJCQkJY29uc3QgY2hhciAqYnVmZik7CiAJdm9pZCAoKmNhdGNoX3VwKShzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7CiAJdm9pZCAoKmZsdXNoKShzdHJ1Y3Qgc3BrX3N5bnRoICpzeW50aCk7CiAJaW50ICgqaXNfYWxpdmUpKHN0cnVjdCBzcGtfc3ludGggKnN5bnRoKTsKQEAgLTE3OSw2ICsxODEsMTYgQEAKIAlzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGF0dHJpYnV0ZXM7CiB9OwogCisvKioKKyAqIG1vZHVsZV9zcGtfc3ludGgoKSAtIEhlbHBlciBtYWNybyBmb3IgcmVnaXN0ZXJpbmcgYSBzcGVha3VwIGRyaXZlcgorICogQF9fc3BrX3N5bnRoOiBzcGtfc3ludGggc3RydWN0CisgKiBIZWxwZXIgbWFjcm8gZm9yIHNwZWFrdXAgZHJpdmVycyB3aGljaCBkbyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBpbiBtb2R1bGUKKyAqIGluaXQvZXhpdC4gVGhpcyBlbGltaW5hdGVzIGEgbG90IG9mIGJvaWxlcnBsYXRlLiBFYWNoIG1vZHVsZSBtYXkgb25seQorICogdXNlIHRoaXMgbWFjcm8gb25jZSwgYW5kIGNhbGxpbmcgaXQgcmVwbGFjZXMgbW9kdWxlX2luaXQoKSBhbmQgbW9kdWxlX2V4aXQoKQorICovCisjZGVmaW5lIG1vZHVsZV9zcGtfc3ludGgoX19zcGtfc3ludGgpIFwKKwltb2R1bGVfZHJpdmVyKF9fc3BrX3N5bnRoLCBzeW50aF9hZGQsIHN5bnRoX3JlbW92ZSkKKwogc3RydWN0IHNwZWFrdXBfaW5mb190IHsKIAlzcGlubG9ja190IHNwaW5sb2NrOwogCWludCBwb3J0X3R0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9zeW5hcHRpY3NfaTJjX3JtaTQuYyBiL2RyaXZlcnMvc3RhZ2luZy9zdGVfcm1pNC9zeW5hcHRpY3NfaTJjX3JtaTQuYwppbmRleCBmOTJhZTFkLi4wZjUyNGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvc3RlX3JtaTQvc3luYXB0aWNzX2kyY19ybWk0LmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3N0ZV9ybWk0L3N5bmFwdGljc19pMmNfcm1pNC5jCkBAIC0yMDksNyArMjA5LDcgQEAKIAkJdHhidWZbMV0JPSBwYWdlOwogCQlyZXR2YWwJPSBpMmNfbWFzdGVyX3NlbmQoaTJjLCB0eGJ1ZiwgUEFHRV9MRU4pOwogCQlpZiAocmV0dmFsICE9IFBBR0VfTEVOKQotCQkJZGV2X2VycigmaTJjLT5kZXYsICIlczpmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOworCQkJZGV2X2VycigmaTJjLT5kZXYsICJmYWlsZWQ6JWRcbiIsIHJldHZhbCk7CiAJCWVsc2UKIAkJCXBkYXRhLT5jdXJyZW50X3BhZ2UgPSBwYWdlOwogCX0gZWxzZQpAQCAtMjgzLDcgKzI4Myw3IEBACiAJcmV0dmFsCQk9IGkyY19tYXN0ZXJfc2VuZChwZGF0YS0+aTJjX2NsaWVudCwgdHhidWYsIDIpOwogCS8qIEFkZCBpbiByZXRyeSBvbiB3cml0ZXMgb25seSBpbiBjZXJ0YWluIGVycm9yIHJldHVybiB2YWx1ZXMgKi8KIAlpZiAocmV0dmFsICE9IDIpIHsKLQkJZGV2X2VycigmaTJjLT5kZXYsICIlczpmYWlsZWQ6JWRcbiIsIF9fZnVuY19fLCByZXR2YWwpOworCQlkZXZfZXJyKCZpMmMtPmRldiwgImZhaWxlZDolZFxuIiwgcmV0dmFsKTsKIAkJcmV0dmFsID0gLUVJTzsKIAl9IGVsc2UKIAkJcmV0dmFsID0gMTsKQEAgLTgzMCw4ICs4MzAsOCBAQAogCiAJLyogQ2hlY2sgaWYgdGhpcyBpcyBhIFN5bmFwdGljcyBkZXZpY2UgLSByZXBvcnQgaWYgbm90LiAqLwogCWlmIChwZGF0YS0+cm1pNF9tb2RfaW5mby5tYW51ZmFjdHVyZXJfaWQgIT0gMSkKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICIlczogbm9uLVN5bmFwdGljcyBtZmcgaWQ6JWRcbiIsCi0JCQlfX2Z1bmNfXywgcGRhdGEtPnJtaTRfbW9kX2luZm8ubWFudWZhY3R1cmVyX2lkKTsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJub24tU3luYXB0aWNzIG1mZyBpZDolZFxuIiwKKwkJCXBkYXRhLT5ybWk0X21vZF9pbmZvLm1hbnVmYWN0dXJlcl9pZCk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJmaSwgJnBkYXRhLT5ybWk0X21vZF9pbmZvLnN1cHBvcnRfZm5fbGlzdCwgbGluaykKIAkJZGF0YV9zb3VyY2VzICs9IHJmaS0+bnVtX29mX2RhdGFfc291cmNlczsKQEAgLTk5MCw4ICs5OTAsOCBAQAogCQkJCQlwbGF0Zm9ybWRhdGEtPmlycV90eXBlLAogCQkJCQlEUklWRVJfTkFNRSwgcm1pNF9kYXRhKTsKIAlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6VW5hYmxlIHRvIGdldCBhdHRuIGlycSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgY2xpZW50LT5pcnEpOworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlVuYWJsZSB0byBnZXQgYXR0biBpcnEgJWRcbiIsCisJCQljbGllbnQtPmlycSk7CiAJCWdvdG8gZXJyX3F1ZXJ5X2RldjsKIAl9CiAKQEAgLTExMTIsMTIgKzExMTIsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHN5bmFwdGljc19ybWk0X2Rldl9wbV9vcHMgPSB7Ci0JLnN1c3BlbmQgPSBzeW5hcHRpY3Nfcm1pNF9zdXNwZW5kLAotCS5yZXN1bWUgID0gc3luYXB0aWNzX3JtaTRfcmVzdW1lLAotfTsKICNlbmRpZgogCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoc3luYXB0aWNzX3JtaTRfZGV2X3BtX29wcywgc3luYXB0aWNzX3JtaTRfc3VzcGVuZCwKKwkJCSBzeW5hcHRpY3Nfcm1pNF9yZXN1bWUpOworCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgc3luYXB0aWNzX3JtaTRfaWRfdGFibGVbXSA9IHsKIAl7IERSSVZFUl9OQU1FLCAwIH0sCiAJeyB9LApAQCAtMTEyOCw5ICsxMTI3LDcgQEAKIAkuZHJpdmVyID0gewogCQkubmFtZQk9CURSSVZFUl9OQU1FLAogCQkub3duZXIJPQlUSElTX01PRFVMRSwKLSNpZmRlZiBDT05GSUdfUE0KIAkJLnBtCT0JJnN5bmFwdGljc19ybWk0X2Rldl9wbV9vcHMsCi0jZW5kaWYKIAl9LAogCS5wcm9iZQkJPQlzeW5hcHRpY3Nfcm1pNF9wcm9iZSwKIAkucmVtb3ZlCQk9CXN5bmFwdGljc19ybWk0X3JlbW92ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9pb2NoYW5uZWwuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscy9pb2NoYW5uZWwuaAppbmRleCBlYjdlZmU0Li4zYmQ3NTc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvY2hhbm5lbHMvaW9jaGFubmVsLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL2NoYW5uZWxzL2lvY2hhbm5lbC5oCkBAIC0zMzcsNyArMzM3LDcgQEAKICAgICAvKiBwZXJpcGhlcmFsIHR5cGUgb2YgMyAtIHByb2Nlc3NvciAqLwogICAgIC8qIHNwZWNpZmllcyBkZXZpY2UgY2FwYWJsZSwgYnV0IG5vdCBwcmVzZW50ICovCiAKLSNkZWZpbmUgREVWX0hJU1VQUE9SVCAweDEwOwkvKiBIaVN1cCA9IDE7IHNob3dzIHN1cHBvcnQgZm9yIHJlcG9ydCBsdW5zICovCisjZGVmaW5lIERFVl9ISVNVUFBPUlQgMHgxMAkvKiBIaVN1cCA9IDE7IHNob3dzIHN1cHBvcnQgZm9yIHJlcG9ydCBsdW5zICovCiAgICAgLyogbXVzdCBiZSByZXR1cm5lZCBmb3IgbHVuIDAuICovCiAKIC8qIE5PVEU6IExpbnV4IGNvZGUgYXNzdW1lcyBpbnF1aXJ5IGNvbnRhaW5zIDM2IGJ5dGVzLiBXaXRob3V0IGNoZWNraW5nIGxlbmd0aApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL3ZtY2FsbGludGVyZmFjZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlL3ZtY2FsbGludGVyZmFjZS5oCmluZGV4IDc4MzMzNzEuLjU5YTc0NTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS92bWNhbGxpbnRlcmZhY2UuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUvdm1jYWxsaW50ZXJmYWNlLmgKQEAgLTc5LDE4ICs3OSwxNSBAQAogI2RlZmluZSBJU1NVRV9JT19WTUNBTEwobWV0aG9kLCBwYXJhbSwgcmVzdWx0KSBcCiAJKHJlc3VsdCA9IHVuaXN5c192bWNhbGwobWV0aG9kLCAocGFyYW0pICYgMHhGRkZGRkZGRiwJXAogCQkJCShwYXJhbSkgPj4gMzIpKQotI2RlZmluZSBJU1NVRV9JT19FWFRFTkRFRF9WTUNBTEwobWV0aG9kLCBwYXJhbTEsIHBhcmFtMiwJXAotCQkJCSBwYXJhbTMsIHJlc3VsdCkJCQlcCi0JKHJlc3VsdCA9IHVuaXN5c19leHRlbmRlZF92bWNhbGwobWV0aG9kLCBwYXJhbTEsCVwKLQkJCQkJIHBhcmFtMiwgcGFyYW0zKSkKKyNkZWZpbmUgSVNTVUVfSU9fRVhURU5ERURfVk1DQUxMKG1ldGhvZCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMykgXAorCXVuaXN5c19leHRlbmRlZF92bWNhbGwobWV0aG9kLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKQogCiAgICAgLyogVGhlIGZvbGxvd2luZyB1c2VzIFZNQ0FMTF9QT1NUX0NPREVfTE9HRVZFTlQgaW50ZXJmYWNlIGJ1dCBpcyBjdXJyZW50bHkKICAgICAgKiBub3QgdXNlZCBtdWNoICovCiAjZGVmaW5lIElTU1VFX0lPX1ZNQ0FMTF9QT1NUQ09ERV9TRVZFUklUWShwb3N0Y29kZSwgc2V2ZXJpdHkpCQlcCiBkbyB7CQkJCQkJCQkJXAotCXUzMiBfdGVtcHJlc3VsdCA9IFZNQ0FMTF9TVUNDRVNTOwkJCQlcCiAJSVNTVUVfSU9fRVhURU5ERURfVk1DQUxMKFZNQ0FMTF9QT1NUX0NPREVfTE9HRVZFTlQsIHNldmVyaXR5LAlcCi0JCQkJIE1EU19BUFBPUywgcG9zdGNvZGUsIF90ZW1wcmVzdWx0KTsJXAorCQkJCSBNRFNfQVBQT1MsIHBvc3Rjb2RlKTsJCQlcCiB9IHdoaWxlICgwKQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS9wcm9jb2JqZWN0dHJlZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Byb2NvYmplY3R0cmVlLmgKaW5kZXggMTE3NDA1Ni4uODA5YzY3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Byb2NvYmplY3R0cmVlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Byb2NvYmplY3R0cmVlLmgKQEAgLTI2LDcgKzI2LDYgQEAKICNpZm5kZWYgX19QUk9DT0JKRUNUVFJFRV9IX18KICNkZWZpbmUgX19QUk9DT0JKRUNUVFJFRV9IX18KIAotI2luY2x1ZGUgInVuaWtsb2cuaCIKICNpbmNsdWRlICJ0aW1za21vZC5oIgogCiAvKiBUaGVzZSBhcmUgb3BhcXVlIHN0cnVjdHVyZXMgdG8gdXNlcnMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdGltc2ttb2QuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZC5oCmluZGV4IDQwMTlhMGQuLmNkZTI0OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS90aW1za21vZC5oCkBAIC00Niw3ICs0Niw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9mY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgpAQCAtNjgsMTUgKzY3LDYgQEAKICNkZWZpbmUgSE9TVEFERFJFU1MgdW5zaWduZWQgbG9uZyBsb25nCiAjZW5kaWYKIAotLyoqIFRyeSB0byBldmF1bGF0ZSB0aGUgcHJvdmlkZWQgZXhwcmVzc2lvbiwgYW5kIGRvIGEgUkVUSU5UKHgpIGlmZgotICogIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byA8IDAuCi0gKi8KLSNkZWZpbmUgQVNTRVJUKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlkbyB7IGlmICghKGNvbmQpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJSFVIRFJWKCJBU1NFUlQgZmFpbGVkIC0gJXMiLAkgICAgICAgXAotCQkJICAgICAgIF9fc3RyaW5naWZ5KGNvbmQpKTsJICAgICAgIFwKLQl9IHdoaWxlICgwKQotCiAjZGVmaW5lIHNpemVvZm1lbWJlcihUWVBFLCBNRU1CRVIpIChzaXplb2YoKChUWVBFICopMCktPk1FTUJFUikpCiAvKiogIkNvdmVyZWQgcXVvdGllbnQiIGZ1bmN0aW9uICovCiAjZGVmaW5lIENPVlEodiwgZCkgICgoKHYpICsgKGQpIC0gMSkgLyAoZCkpCkBAIC04NywxNCArNzcsOCBAQAogCQkodm9pZCAqKShwMikgPSBTV0FQUE9JTlRFUlNfVEVNUDsJXAogCX0gd2hpbGUgKDApCiAKLSNkZWZpbmUgUFJJTlRLRFJWKGZtdCwgYXJncy4uLikgTE9HSU5GKGZtdCwgIyMgYXJncykKLSNkZWZpbmUgVEJERFJWKGZtdCwgYXJncy4uLikgICAgTE9HRVJSKGZtdCwgIyMgYXJncykKLSNkZWZpbmUgSFVIRFJWKGZtdCwgYXJncy4uLikgICAgTE9HRVJSKGZtdCwgIyMgYXJncykKLSNkZWZpbmUgRVJSRFJWKGZtdCwgYXJncy4uLikgICAgTE9HRVJSKGZtdCwgIyMgYXJncykKICNkZWZpbmUgV0FSTkRSVihmbXQsIGFyZ3MuLi4pICAgTE9HV1JOKGZtdCwgIyMgYXJncykKICNkZWZpbmUgU0VDVVJFRFJWKGZtdCwgYXJncy4uLikgTE9HV1JOKGZtdCwgIyMgYXJncykKLSNkZWZpbmUgSU5GT0RSVihmbXQsIGFyZ3MuLi4pICAgTE9HSU5GKGZtdCwgIyMgYXJncykKLSNkZWZpbmUgREVCVUdEUlYoZm10LCBhcmdzLi4uKSAgREJHSU5GKGZtdCwgIyMgYXJncykKIAogI2RlZmluZSBQUklOVEtERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgTE9HSU5GREVWKGRldm5hbWUsIGZtdCwgIyMgYXJncykKICNkZWZpbmUgVEJEREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICAgIExPR0VSUkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCkBAIC0xMDUsNyArODksNiBAQAogI2RlZmluZSBTRUNVUkVERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgTE9HV1JOREVWKGRldm5hbWUsIGZtdCwgIyMgYXJncykKICNkZWZpbmUgSU5GT0RFVihkZXZuYW1lLCBmbXQsIGFyZ3MuLi4pICAgIExPR0lORkRFVihkZXZuYW1lLCBmbXQsICMjIGFyZ3MpCiAjZGVmaW5lIElORk9ERVZYKGRldm5vLCBmbXQsIGFyZ3MuLi4pICAgICBMT0dJTkZERVZYKGRldm5vLCBmbXQsICMjIGFyZ3MpCi0jZGVmaW5lIERFQlVHREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgICBEQkdJTkZERVYoZGV2bmFtZSwgZm10LCAjIyBhcmdzKQogCiAvKiogVmVyaWZpZXMgdGhlIGNvbnNpc3RlbmN5IG9mIHlvdXIgUFJJVkFURURFVklDRURBVEEgc3RydWN0dXJlIHVzaW5nCiAgKiAgY29udmVudGlvbmFsICJzaWduYXR1cmUiIGZpZWxkczoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXNxdWV1ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3F1ZXVlLmgKaW5kZXggMjViNjE4MS4uMDhiYTE2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3F1ZXVlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3F1ZXVlLmgKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgImxpbnV4L3ZlcnNpb24uaCIKICNpbmNsdWRlICJpb2NoYW5uZWwuaCIKLSNpbmNsdWRlICJ1bmlrbG9nLmgiCiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8bGludXgvdXVpZC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3RocmVhZC5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3Vpc3RocmVhZC5oCmluZGV4IGFhODZhZGUuLjUyYzNlYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXN0aHJlYWQuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdGhyZWFkLmgKQEAgLTI3LDcgKzI3LDYgQEAKIHN0cnVjdCB1aXN0aHJlYWRfaW5mbyB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCWludCBpZDsKLQlpbnQgc2hvdWxkX3N0b3A7CiAJc3RydWN0IGNvbXBsZXRpb24gaGFzX3N0b3BwZWQ7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUvdWlzdXRpbHMuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXN1dGlscy5oCmluZGV4IDc0MTQyMjAuLmM3ZDBiYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXN1dGlscy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91aXN1dGlscy5oCkBAIC02NSwxNyArNjUsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9saW5rOwkvKiBsaW5rcyBpbnRvIFJlcUhhbmRsZXJJbmZvX2xpc3QgKi8KIH07CiAKLXN0cnVjdCByZXFfaGFuZGxlcl9pbmZvICpyZXFfaGFuZGxlcl9hZGQodXVpZF9sZSBzd2l0Y2hfdXVpZCwKLQkJCQljb25zdCBjaGFyICpzd2l0Y2hfdHlwZV9uYW1lLAotCQkJCWludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKSwKLQkJCQl1bnNpZ25lZCBsb25nIG1pbl9jaGFubmVsX2J5dGVzLAotCQkJCWludCAoKnN2cl9jaGFubmVsX29rKSh1bnNpZ25lZCBsb25nCi0JCQkJCQkJIGNoYW5uZWxfYnl0ZXMpLAotCQkJCWludCAoKnN2cl9jaGFubmVsX2luaXQpKHZvaWQgKngsCi0JCQkJCQl1bnNpZ25lZCBjaGFyICpjbGllbnRfc3RyLAotCQkJCQkJdTMyIGNsaWVudF9zdHJfbGVuLCB1NjQgYnl0ZXMpKTsKIHN0cnVjdCByZXFfaGFuZGxlcl9pbmZvICpyZXFfaGFuZGxlcl9maW5kKHV1aWRfbGUgc3dpdGNoX3V1aWQpOwotaW50IHJlcV9oYW5kbGVyX2RlbCh1dWlkX2xlIHN3aXRjaF91dWlkKTsKIAogI2RlZmluZSB1aXNsaWJfaW9yZW1hcF9jYWNoZShhZGRyLCBzaXplKSBcCiAJZGJnX2lvcmVtYXBfY2FjaGUoYWRkciwgc2l6ZSwgX19GSUxFX18sIF9fTElORV9fKQpAQCAtMTE1LDE5ICsxMDUsNyBAQAogCiBpbnQgdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcihpbnQgdHlwZSwgdm9pZCAqZnB0ciwKIAkJCXN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmNoaXBzZXRfZHJpdmVyX2luZm8pOwotaW50IHVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXJfZXgodXVpZF9sZSBzd2l0Y2hfZ3VpZCwKLQkJCWNvbnN0IGNoYXIgKnN3aXRjaF90eXBlX25hbWUsCi0JCQlpbnQgKCpmcHRyKShzdHJ1Y3QgaW9fbXNncyAqKSwKLQkJCXVuc2lnbmVkIGxvbmcgbWluX2NoYW5uZWxfYnl0ZXMsCi0JCQlpbnQgKCpzdnJfY2hhbm5lbF9vaykodW5zaWduZWQgbG9uZwotCQkJCQkgICAgICBjaGFubmVsX2J5dGVzKSwKLQkJCWludCAoKnN2cl9jaGFubmVsX2luaXQpKHZvaWQgKngsCi0JCQkJCQl1bnNpZ25lZCBjaGFyICpjbGllbnRfc3RyLAotCQkJCQkJdTMyIGNsaWVudF9zdHJfbGVuLAotCQkJCQkJdTY0IGJ5dGVzKSwKLQkJCXN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmNoaXBzZXRfZHJpdmVyX2luZm8pOwogCi1pbnQgdWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KHV1aWRfbGUgc3dpdGNoX3V1aWQpOwogdW5zaWduZWQgY2hhciAqdXRpbF9tYXBfdmlydChzdHJ1Y3QgcGh5c19pbmZvICpzZyk7CiB2b2lkIHV0aWxfdW5tYXBfdmlydChzdHJ1Y3QgcGh5c19pbmZvICpzZyk7CiB1bnNpZ25lZCBjaGFyICp1dGlsX21hcF92aXJ0X2F0b21pYyhzdHJ1Y3QgcGh5c19pbmZvICpzZyk7CkBAIC0yMDYsMjEgKzE4NCwxMCBAQAogCQkJICAgICAgKHZvaWQgX19pb21lbSAqKWd1aWQsIHNpemVvZih1dWlkX2xlKSk7CiAJCWlmICh1dWlkX2xlX2NtcCh0bXBndWlkLCBOVUxMX1VVSURfTEUpICE9IDApCiAJCQlicmVhazsKLQkJTE9HRVJSKCJXYWl0aW5nIGZvciBub24tMCBHVUlEICh3aHk/Pz8pLi4uXG4iKTsKIAkJVUlTX1RIUkVBRF9XQUlUX1NFQyg1KTsKIAl9Ci0JTE9HRVJSKCJPSy4uLiBHVUlEIGlzIG5vbi0wIG5vd1xuIik7CiB9CiAKLS8qIENvcHlGcmFnc0luZm9Gcm9tU2tiIHJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIGFkZGVkIHRvIGZyYWdzIGFycmF5Ci0gKiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuCi0gKi8KLXVuc2lnbmVkIGludCB1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKHVuc2lnbmVkIGNoYXIgKmNhbGxpbmdfY3R4LAotCQkJCQkgICAgIHZvaWQgKnNrYl9pbiwKLQkJCQkJICAgICB1bnNpZ25lZCBpbnQgZmlyc3RmcmFnbGVuLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBmcmFnc19tYXgsCi0JCQkJCSAgICAgc3RydWN0IHBoeXNfaW5mbyBmcmFnc1tdKTsKLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKIGlzc3VlX3ZtY2FsbF9pb19jb250cm9sdm1fYWRkcih1NjQgKmNvbnRyb2xfYWRkciwgdTMyICpjb250cm9sX2J5dGVzKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3VuaWtsb2cuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvaW5jbHVkZS91bmlrbG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDFiZGIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlL3VuaWtsb2cuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKiB1bmlrbG9nLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgLSAyMDEzIFVOSVNZUyBDT1JQT1JBVElPTgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgotICogTk9OIElORlJJTkdFTUVOVC4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUKLSAqIGRldGFpbHMuCi0gKi8KLQotLyogVGhpcyBtb2R1bGUgY29udGFpbnMgbWFjcm9zIHRvIGFpZCBkZXZlbG9wZXJzIGluIGxvZ2dpbmcgbWVzc2FnZXMuCi0gKgotICogVGhpcyBtb2R1bGUgaXMgYWZmZWN0ZWQgYnkgdGhlIERFQlVHIGNvbXBpbGV0aW1lIG9wdGlvbi4KLSAqCi0gKi8KLSNpZm5kZWYgX19VTklLTE9HX0hfXwotI2RlZmluZSBfX1VOSUtMT0dfSF9fCi0KLSNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KLQotLyoKLSAqICMgREJHSU5GCi0gKgotICogXGJyaWVmIExvZyBkZWJ1ZyBpbmZvcm1hdGlvbmFsIG1lc3NhZ2UgLSBsb2cgYSBMT0dfSU5GTyBtZXNzYWdlIG9ubHkKLSAqICAgICAgICBpZiBERUJVRyBjb21waWxldGltZSBvcHRpb24gZW5hYmxlZAotICoKLSAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCi0gKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCi0gKiBccGFyYW0gZm10IHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBsb2cuCi0gKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZQotICogICAgICAgICAgICAgZm9ybWF0IHN0cmluZy4KLSAqIFxyZXR1cm4gbm90aGluZwotICoKLSAqIExvZyBhIG1lc3NhZ2UgYXQgdGhlIExPR19JTkZPIGxldmVsLCBidXQgb25seSBpZiBERUJVRyBpcyBlbmFibGVkLiAgSWYKLSAqIERFQlVHIGlzIGRpc2FibGVkLCB0aGlzIGV4cGFuZHMgdG8gYSBuby1vcC4KLSAqLwotCi0vKgotICogIyBEQkdWRVIKLSAqCi0gKiBcYnJpZWYgTG9nIGRlYnVnIHZlcmJvc2UgbWVzc2FnZSAtIGxvZyBhIExPR19ERUJVRyBtZXNzYWdlIG9ubHkgaWYKLSAqICAgICAgICBERUJVRyBjb21waWxldGltZSBvcHRpb24gZW5hYmxlZAotICoKLSAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCi0gKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCi0gKiBccGFyYW0gZm10IHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBsb2cuCi0gKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZQotICogICAgICAgICAgICAgZm9ybWF0IHN0cmluZy4KLSAqIFxyZXR1cm4gbm90aGluZwotICoKLSAqIExvZyBhIG1lc3NhZ2UgYXQgdGhlIExPR19ERUJVRyBsZXZlbCwgYnV0IG9ubHkgaWYgREVCVUcgaXMgZW5hYmxlZC4gIElmCi0gKiBERUJVRyBpcyBkaXNhYmxlZCwgdGhpcyBleHBhbmRzIHRvIGEgbm8tb3AuICBOb3RlIGFsc28gdGhhdCBMT0dfREVCVUcKLSAqIG1lc3NhZ2VzIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIGF0IHJ1bnRpbWUgYXMgd2VsbC4KLSAqLwotI2RlZmluZSBEQkdJTkZERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgICAgICAgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBEQkdWRVJERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSAgICAgICAgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBEQkdJTkYoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBEQkdWRVIoZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgICAgZG8geyB9IHdoaWxlICgwKQotCi0vKgotICogIyBMT0dJTkYKLSAqCi0gKiBcYnJpZWYgTG9nIGluZm9ybWF0aW9uYWwgbWVzc2FnZSAtIGxvZ3MgYSBtZXNzYWdlIGF0IHRoZSBMT0dfSU5GTyBsZXZlbAotICoKLSAqIFxwYXJhbSBkZXZuYW1lIHRoZSBkZXZpY2UgbmFtZSBvZiB0aGUgZGV2aWNlIHJlcG9ydGluZyB0aGlzIG1lc3NhZ2UsIG9yCi0gKiAgICAgICAgICAgICAgICBOVUxMIGlmIHRoaXMgbWVzc2FnZSBpcyBOT1QgZGV2aWNlLXJlbGF0ZWQuCi0gKiBccGFyYW0gZm10IHByaW50ZigpLXN0eWxlIGZvcm1hdCBzdHJpbmcgY29udGFpbmluZyB0aGUgbWVzc2FnZSB0byBsb2cuCi0gKiBccGFyYW0gYXJncyBPcHRpb25hbCBhcmd1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGFuZCBpbnNlcnRlZCBpbnRvIHRoZQotICogICAgICAgICAgICAgZm9ybWF0IHN0cmluZy4KLSAqIFxyZXR1cm4gbm90aGluZwotICoKLSAqIExvZ3MgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGF0IHRoZSBMT0dfSU5GTyBsZXZlbC4KLSAqLwotCi0jZGVmaW5lIExPR0lORihmbXQsIGFyZ3MuLi4pIHByX2luZm8oZm10LCAjIyBhcmdzKQotI2RlZmluZSBMT0dJTkZERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSBcCi0JcHJfaW5mbygiJXMgIiBmbXQsIGRldm5hbWUsICMjIGFyZ3MpCi0jZGVmaW5lIExPR0lORkRFVlgoZGV2bm8sIGZtdCwgYXJncy4uLikgXAotCXByX2luZm8oImRldiVkICIgZm10LCBkZXZubywgIyMgYXJncykKLSNkZWZpbmUgTE9HSU5GTkFNRSh2bmljLCBmbXQsIGFyZ3MuLi4pCQkJCVwKLQlkbyB7CQkJCQkJCQlcCi0JCWlmICh2bmljICE9IE5VTEwpIHsJCQkJCVwKLQkJCXByX2luZm8oIiVzICIgZm10LCB2bmljLT5uYW1lLCAjIyBhcmdzKTsJXAotCQl9IGVsc2UgewkJCQkJCVwKLQkJCXByX2luZm8oZm10LCAjIyBhcmdzKTsJCQkJXAotCQl9CQkJCQkJCVwKLQl9IHdoaWxlICgwKQotCi0vKgotICogIyBMT0dWRVIKLSAqCi0gKiBcYnJpZWYgTG9nIHZlcmJvc2UgbWVzc2FnZSAtIGxvZ3MgYSBtZXNzYWdlIGF0IHRoZSBMT0dfREVCVUcgbGV2ZWwsCi0gKiAgICAgICAgd2hpY2ggY2FuIGJlIGRpc2FibGVkIGF0IHJ1bnRpbWUKLSAqCi0gKiBccGFyYW0gZGV2bmFtZSB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGRldmljZSByZXBvcnRpbmcgdGhpcyBtZXNzYWdlLCBvcgotICogICAgICAgICAgICAgICAgTlVMTCBpZiB0aGlzIG1lc3NhZ2UgaXMgTk9UIGRldmljZS1yZWxhdGVkLgotICogXHBhcmFtIGZtdCBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gbG9nLgotICogXHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgZm9ybWF0Ci0gKiBccGFyYW0gc3RyaW5nLgotICogXHJldHVybiBub3RoaW5nCi0gKgotICogTG9ncyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYXQgdGhlIExPR19ERUJVRyBsZXZlbC4gIE5vdGUgYWxzbyB0aGF0Ci0gKiBMT0dfREVCVUcgbWVzc2FnZXMgY2FuIGJlIGVuYWJsZWQvZGlzYWJsZWQgYXQgcnVudGltZSBhcyB3ZWxsLgotICovCi0jZGVmaW5lIExPR1ZFUihmbXQsIGFyZ3MuLi4pIHByX2RlYnVnKGZtdCwgIyMgYXJncykKLSNkZWZpbmUgTE9HVkVSREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgXAotCXByX2RlYnVnKCIlcyAiIGZtdCwgZGV2bmFtZSwgIyMgYXJncykKLSNkZWZpbmUgTE9HVkVSTkFNRSh2bmljLCBmbXQsIGFyZ3MuLi4pCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAodm5pYyAhPSBOVUxMKSB7CQkJCQlcCi0JCQlwcl9kZWJ1ZygiJXMgIiBmbXQsIHZuaWMtPm5hbWUsICMjIGFyZ3MpOwlcCi0JCX0gZWxzZSB7CQkJCQkJXAotCQkJcHJfZGVidWcoZm10LCAjIyBhcmdzKTsJCQkJXAotCQl9CQkJCQkJCVwKLQl9IHdoaWxlICgwKQotCi0vKgotICogIyBMT0dFUlIKLSAqCi0gKiBcYnJpZWYgTG9nIGVycm9yIG1lc3NhZ2UgLSBsb2dzIGEgbWVzc2FnZSBhdCB0aGUgTE9HX0VSUiBsZXZlbCwKLSAqICAgICAgICBpbmNsdWRpbmcgc291cmNlIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uCi0gKgotICogXHBhcmFtIGRldm5hbWUgdGhlIGRldmljZSBuYW1lIG9mIHRoZSBkZXZpY2UgcmVwb3J0aW5nIHRoaXMgbWVzc2FnZSwgb3IKLSAqICAgICAgICAgICAgICAgIE5VTEwgaWYgdGhpcyBtZXNzYWdlIGlzIE5PVCBkZXZpY2UtcmVsYXRlZC4KLSAqIFxwYXJhbSBmbXQgcHJpbnRmKCktc3R5bGUgZm9ybWF0IHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGxvZy4KLSAqIFxwYXJhbSBhcmdzIE9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYW5kIGluc2VydGVkIGludG8gdGhlIGZvcm1hdAotICogXHBhcmFtIHN0cmluZy4KLSAqIFxyZXR1cm4gbm90aGluZwotICoKLSAqIExvZ3MgdGhlIHNwZWNpZmllZCBlcnJvciBtZXNzYWdlIGF0IHRoZSBMT0dfRVJSIGxldmVsLiAgSXQgd2lsbCBhbHNvCi0gKiBpbmNsdWRlIHRoZSBmaWxlLCBsaW5lIG51bWJlciwgYW5kIGZ1bmN0aW9uIG5hbWUgb2Ygd2hlcmUgdGhlIGVycm9yCi0gKiBvcmlnaW5hdGVkIGluIHRoZSBsb2cgbWVzc2FnZS4KLSAqLwotI2RlZmluZSBMT0dFUlIoZm10LCBhcmdzLi4uKSBwcl9lcnIoZm10LCAjIyBhcmdzKQotI2RlZmluZSBMT0dFUlJERVYoZGV2bmFtZSwgZm10LCBhcmdzLi4uKSBcCi0JcHJfZXJyKCIlcyAiIGZtdCwgZGV2bmFtZSwgIyMgYXJncykKLSNkZWZpbmUgTE9HRVJSREVWWChkZXZubywgZm10LCBhcmdzLi4uKSBcCi0JcHJfZXJyKCJkZXYlZCAiIGZtdCwgZGV2bm8sICMjIGFyZ3MpCi0jZGVmaW5lIExPR0VSUk5BTUUodm5pYywgZm10LCBhcmdzLi4uKQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAodm5pYyAhPSBOVUxMKSB7CQkJCQlcCi0JCQlwcl9lcnIoIiVzICIgZm10LCB2bmljLT5uYW1lLCAjIyBhcmdzKTsJXAotCQl9IGVsc2UgewkJCQkJCVwKLQkJCXByX2VycihmbXQsICMjIGFyZ3MpOwkJCQlcCi0JCX0JCQkJCQkJXAotCX0gd2hpbGUgKDApCi0jZGVmaW5lIExPR09SRFVNUEVSUihzZXFmaWxlLCBmbXQsIGFyZ3MuLi4pIGRvIHsJCVwKLQkJaWYgKHNlcWZpbGUpIHsJCQkJCVwKLQkJCXNlcV9wcmludGYoc2VxZmlsZSwgZm10LCAjIyBhcmdzKTsJXAotCQl9IGVsc2UgewkJCQkJXAotCQkJTE9HRVJSKGZtdCwgIyMgYXJncyk7CQkJXAotCQl9CQkJCQkJXAotCX0gd2hpbGUgKDApCi0KLS8qCi0gKiAjIExPR1dSTgotICoKLSAqIFxicmllZiBMb2cgd2FybmluZyBtZXNzYWdlIC0gTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIExPR19XQVJOSU5HIGxldmVsLAotICogICAgICAgIGluY2x1ZGluZyBzb3VyY2UgbGluZSBudW1iZXIgaW5mb3JtYXRpb24KLSAqCi0gKiBccGFyYW0gZGV2bmFtZSB0aGUgZGV2aWNlIG5hbWUgb2YgdGhlIGRldmljZSByZXBvcnRpbmcgdGhpcyBtZXNzYWdlLCBvcgotICogICAgICAgICAgICAgICAgTlVMTCBpZiB0aGlzIG1lc3NhZ2UgaXMgTk9UIGRldmljZS1yZWxhdGVkLgotICogXHBhcmFtIGZtdCBwcmludGYoKS1zdHlsZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgdG8gbG9nLgotICogXHBhcmFtIGFyZ3MgT3B0aW9uYWwgYXJndW1lbnRzIHRvIGJlIGZvcm1hdHRlZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgZm9ybWF0Ci0gKiBccGFyYW0gc3RyaW5nLgotICogXHJldHVybiBub3RoaW5nCi0gKgotICogTG9ncyB0aGUgc3BlY2lmaWVkIGVycm9yIG1lc3NhZ2UgYXQgdGhlIExPR19XQVJOSU5HIGxldmVsLiAgSXQgd2lsbCBhbHNvCi0gKiBpbmNsdWRlIHRoZSBmaWxlLCBsaW5lIG51bWJlciwgYW5kIGZ1bmN0aW9uIG5hbWUgb2Ygd2hlcmUgdGhlIGVycm9yCi0gKiBvcmlnaW5hdGVkIGluIHRoZSBsb2cgbWVzc2FnZS4KLSAqLwotI2RlZmluZSBMT0dXUk4oZm10LCBhcmdzLi4uKSBwcl93YXJuKGZtdCwgIyMgYXJncykKLSNkZWZpbmUgTE9HV1JOREVWKGRldm5hbWUsIGZtdCwgYXJncy4uLikgXAotCXByX3dhcm4oIiVzICIgZm10LCBkZXZuYW1lLCAjIyBhcmdzKQotI2RlZmluZSBMT0dXUk5OQU1FKHZuaWMsIGZtdCwgYXJncy4uLikgXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKHZuaWMgIT0gTlVMTCkgewkJCQkJXAotCQkJcHJfd2FybigiJXMgIiBmbXQsIHZuaWMtPm5hbWUsICMjIGFyZ3MpOwlcCi0JCX0gZWxzZSB7CQkJCQkJXAotCQkJcHJfd2FybihmbXQsICMjIGFyZ3MpOwkJCQlcCi0JCX0JCQkJCQkJXAotCX0gd2hpbGUgKDApCi0KLSNlbmRpZiAvKiBfX1VOSUtMT0dfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvS2NvbmZpZwppbmRleCBhNzEyZWI4Li5jMzlhMGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL0tjb25maWcKQEAgLTQsNyArNCw3IEBACiAKIGNvbmZpZyBVTklTWVNfVUlTTElCCiAJdHJpc3RhdGUgIlVuaXN5cyB1aXNsaWIgZHJpdmVyIgotCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVklTT1JDSElQU0VUICYmIEhBU19JT01FTQorCXNlbGVjdCBVTklTWVNfVklTT1JDSElQU0VUCiAJLS0taGVscC0tLQogCUlmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBlbmFibGUgdGhlIFVuaXN5cyB1aXNsaWIgZHJpdmVyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi9NYWtlZmlsZSBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL01ha2VmaWxlCmluZGV4IDA4ZTYyMGQuLjg2MGY0OTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL01ha2VmaWxlCkBAIC03LDggKzcsNiBAQAogdmlzb3J1aXNsaWIteSA6PSB1aXNsaWIubyB1aXNxdWV1ZS5vICB1aXN0aHJlYWQubyAgdWlzdXRpbHMubwogCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUKLWNjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY2hhbm5lbHMKIGNjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0Ci1jY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3NwYXJzdG9wZHJpdmVyCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2NvbW1vbi1zcGFyL2luY2x1ZGUKIGNjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvY29tbW9uLXNwYXIvaW5jbHVkZS9jaGFubmVscwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzbGliLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNsaWIuYwppbmRleCBhOWVlZGRlLi5mOTNkMGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNsaWIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNsaWIuYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlICJ1bmlrbG9nLmgiCiAjaW5jbHVkZSAiZGlhZ25vc3RpY3MvYXBwb3Nfc3Vic3lzdGVtcy5oIgogI2luY2x1ZGUgInVpc3V0aWxzLmgiCiAjaW5jbHVkZSAidmJ1c2NoYW5uZWwuaCIKQEAgLTEzMiwxNCArMTMxLDEwIEBACiB7CiAJdm9pZCBfX2lvbWVtICpjaCA9IHVpc2xpYl9pb3JlbWFwX2NhY2hlKGNoX2FkZHIsIGNoX2J5dGVzKTsKIAotCWlmICghY2gpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBlcnJvcjogaW9yZW1hcF9jYWNoZSBvZiBjaGFubmVsQWRkcjolTHggZm9yIGNoYW5uZWxCeXRlczolbGx1IGZhaWxlZCIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWNoX2FkZHIsCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWNoX2J5dGVzKTsKKwlpZiAoIWNoKQogCQlyZXR1cm4gTlVMTDsKLQl9CisKIAlpZiAoIVNQQVJfVkJVU19DSEFOTkVMX09LX0NMSUVOVChjaCkpIHsKLQkJRVJSRFJWKCIlcyBjaGFubmVsIGNhbm5vdCBiZSB1c2VkIiwgX19mdW5jX18pOwogCQl1aXNsaWJfaW91bm1hcChjaCk7CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTE1NCw4ICsxNDksNiBAQAogCXNpemVfdCBzaXplOwogCiAJaWYgKG1heF9idXNfY291bnQgPT0gYnVzX2xpc3RfY291bnQpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IG1heCBidXNlczolZCBhbHJlYWR5IGNyZWF0ZWRcbiIsCi0JCSAgICAgICBtYXhfYnVzX2NvdW50KTsKIAkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIG1heF9idXNfY291bnQsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9NQVhfQlVTRVM7CkBAIC0xNzIsNyArMTY1LDYgQEAKIAkgICAgKGRldl9jb3VudCAqIHNpemVvZihzdHJ1Y3QgZGV2aWNlX2luZm8gKikpOwogCWJ1cyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFidXMpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IGttYWxsb2MgZm9yIGJ1cyBmYWlsZWQuXG4iKTsKIAkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEOwpAQCAtMjA5LDggKzIwMSw2IEBACiAJCS8qIGZvdW5kIGEgYnVzIGFscmVhZHkgaW4gdGhlIGxpc3Qgd2l0aCBzYW1lIGJ1c19ubyAtCiAJCSAqIHJlamVjdCBhZGQKIAkJICovCi0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkOiBidXMgJWQgYWxyZWFkeSBleGlzdHMuXG4iLAotCQkgICAgICAgYnVzLT5idXNfbm8pOwogCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzLT5idXNfbm8sCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCWtmcmVlKGJ1cyk7CkBAIC0yMzQsMTQgKzIyNCwxMiBAQAogCQljbWQuYWRkX3ZidXMuYnVzX3V1aWQgPSBtc2ctPmNtZC5jcmVhdGVfYnVzLmJ1c19kYXRhX3R5cGVfdXVpZDsKIAkJY21kLmFkZF92YnVzLmluc3RhbmNlX3V1aWQgPSBtc2ctPmNtZC5jcmVhdGVfYnVzLmJ1c19pbnN0X3V1aWQ7CiAJCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYykgewotCQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CiAJCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzLT5idXNfbm8sCiAJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQkJa2ZyZWUoYnVzKTsKIAkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9GQUlMVVJFOwogCQl9CiAJCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYygmY21kKSkgewotCQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NSRUFURSBGYWlsZWQ6IHZpcnRwY2kgR1VFU1RfQUREX1ZCVVMgcmV0dXJuZWQgZXJyb3IuIik7CiAJCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzLT5idXNfbm8sCiAJCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQkJa2ZyZWUoYnVzKTsKQEAgLTI4NywxNyArMjc1LDEzIEBACiAJfQogCiAJaWYgKCFidXMpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiBmYWlsZWQgdG8gZmluZCBidXMgJWQuXG4iLAotCQkgICAgICAgYnVzX25vKTsKIAkJcmVhZF91bmxvY2soJmJ1c19saXN0X2xvY2spOwogCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOwogCX0KIAogCS8qIHZlcmlmeSB0aGF0IHRoaXMgYnVzIGhhcyBubyBkZXZpY2VzLiAqLwogCWZvciAoaSA9IDA7IGkgPCBidXMtPmRldmljZV9jb3VudDsgaSsrKSB7Ci0JCWlmIChidXMtPmRldmljZVtpXSAhPSBOVUxMKSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfREVTVFJPWSBGYWlsZWQ6IGRldmljZSAlaSBhdHRhY2hlZCB0byBidXMgJWQuIiwKLQkJCSAgICAgICBpLCBidXNfbm8pOworCQlpZiAoYnVzLT5kZXZpY2VbaV0pIHsKIAkJCXJlYWRfdW5sb2NrKCZidXNfbGlzdF9sb2NrKTsKIAkJCXJldHVybiBDT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfREVWSUNFX0FUVEFDSEVEOwogCQl9CkBAIC0zMTEsMTQgKzI5NSwxMSBAQAogCSAgIHdpdGggdGhpcyBidXMuICovCiAJY21kLm1zZ3R5cGUgPSBHVUVTVF9ERUxfVkJVUzsKIAljbWQuZGVsX3ZidXMuYnVzX25vID0gYnVzX25vOwotCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYykgewotCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfREVTVFJPWSBGYWlsZWQ6IHZpcnRwY2kgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQuIik7CisJaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKQogCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKLQl9Ci0JaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKCZjbWQpKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19ERVNUUk9ZIEZhaWxlZDogdmlydHBjaSBHVUVTVF9ERUxfVkJVUyByZXR1cm5lZCBlcnJvci4iKTsKKworCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYygmY21kKSkKIAkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOwotCX0KIAogCS8qIGZpbmFsbHksIHJlbW92ZSB0aGUgYnVzIGZyb20gdGhlIGxpc3QgKi8KIHJlbW92ZToKQEAgLTM1Nyw3ICszMzgsNiBAQAogCiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9BVE9NSUMpOwogCWlmICghZGV2KSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBrbWFsbG9jIGZvciBkZXYgZmFpbGVkLlxuIik7CiAJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0tNQUxMT0NfRkFJTEVEOwpAQCAtMzgxLDkgKzM2MSw2IEBACiAJCQkgKi8KIAkJCW1pbl9zaXplID0gcmVxX2hhbmRsZXItPm1pbl9jaGFubmVsX2J5dGVzOwogCQlpZiAobWluX3NpemUgPiBtc2ctPmNtZC5jcmVhdGVfZGV2aWNlLmNoYW5uZWxfYnl0ZXMpIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBjaGFubmVsIHNpemUgaXMgdG9vIHNtYWxsLCBjaGFubmVsIHNpemU6MHglbHgsIHJlcXVpcmVkIHNpemU6MHglbHgiLAotCQkJICAgICAgICh1bG9uZyltc2ctPmNtZC5jcmVhdGVfZGV2aWNlLmNoYW5uZWxfYnl0ZXMsCi0JCQkgICAgICAgKHVsb25nKW1pbl9zaXplKTsKIAkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sCiAJCQkJCSBidXNfbm8sIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1NJWkVfVE9PX1NNQUxMOwpAQCAtMzkzLDkgKzM3MCw2IEBACiAJCSAgICB1aXNsaWJfaW9yZW1hcF9jYWNoZShkZXYtPmNoYW5uZWxfYWRkciwKIAkJCQkJIG1zZy0+Y21kLmNyZWF0ZV9kZXZpY2UuY2hhbm5lbF9ieXRlcyk7CiAJCWlmICghZGV2LT5jaGFucHRyKSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogaW9yZW1hcF9jYWNoZSBvZiBjaGFubmVsQWRkcjolTHggZm9yIGNoYW5uZWxCeXRlczolbGx1IGZhaWxlZCIsCi0JCQkgICAgICAgZGV2LT5jaGFubmVsX2FkZHIsCi0JCQkgICAgICAgbXNnLT5jbWQuY3JlYXRlX2RldmljZS5jaGFubmVsX2J5dGVzKTsKIAkJCXJlc3VsdCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0lPUkVNQVBfRkFJTEVEOwogCQkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywKIAkJCQkJIGJ1c19ubywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKQEAgLTQxMSw4ICszODUsNiBAQAogCQkJY29udGludWU7CiAJCS8qIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIG51bWJlciBpcyB2YWxpZCAqLwogCQlpZiAoZGV2X25vID49IGJ1cy0+ZGV2aWNlX2NvdW50KSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogZGV2aWNlICglZCkgPj0gZGV2aWNlQ291bnQgKCVkKS4iLAotCQkJICAgICAgIGRldl9ubywgYnVzLT5kZXZpY2VfY291bnQpOwogCQkJcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfTUFYX0RFVklDRVM7CiAJCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2X25vLAogCQkJCQkgYnVzX25vLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwpAQCAtNDIxLDggKzM5Myw2IEBACiAJCX0KIAkJLyogbWFrZSBzdXJlIHRoaXMgZGV2aWNlIGlzIG5vdCBhbHJlYWR5IHNldCAqLwogCQlpZiAoYnVzLT5kZXZpY2VbZGV2X25vXSkgewotCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGRldmljZSAlZCBpcyBhbHJlYWR5IGV4aXN0cy4iLAotCQkJICAgICAgIGRldl9ubyk7CiAJCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywKIAkJCQkJIGRldl9ubywgYnVzX25vLAogCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKQEAgLTQ0NSw4ICs0MTUsNiBAQAogCQkJd2FpdF9mb3JfdmFsaWRfZ3VpZCgmKChzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIgX19pb21lbSAqKQogCQkJCQkgICAgKGRldi0+Y2hhbnB0cikpLT5jaHR5cGUpOwogCQkJaWYgKCFTUEFSX1ZIQkFfQ0hBTk5FTF9PS19DTElFTlQoZGV2LT5jaGFucHRyKSkgewotCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOltDTElFTlRdVkhCQSBkZXYgJWQgY2hhbiBpbnZhbGlkLiIsCi0JCQkJICAgICAgIGRldl9ubyk7CiAJCQkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsCiAJCQkJCQkgZGV2X25vLCBidXNfbm8sCiAJCQkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKQEAgLTQ2NCw4ICs0MzIsNiBAQAogCQkJd2FpdF9mb3JfdmFsaWRfZ3VpZCgmKChzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIgX19pb21lbSAqKQogCQkJCQkgICAgKGRldi0+Y2hhbnB0cikpLT5jaHR5cGUpOwogCQkJaWYgKCFTUEFSX1ZOSUNfQ0hBTk5FTF9PS19DTElFTlQoZGV2LT5jaGFucHRyKSkgewotCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBWTklDW0NMSUVOVF0gZGV2ICVkIGNoYW4gaW52YWxpZC4iLAotCQkJCSAgICAgICBkZXZfbm8pOwogCQkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLAogCQkJCQkJIGRldl9ubywgYnVzX25vLAogCQkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CkBAIC00NzksNyArNDQ1LDYgQEAKIAkJCWNtZC5hZGRfdm5pYy5pbnN0YW5jZV91dWlkID0gZGV2LT5pbnN0YW5jZV91dWlkOwogCQkJY21kLmFkZF92aGJhLmludHIgPSBkZXYtPmludHI7CiAJCX0gZWxzZSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogdW5rbm93biBjaGFubmVsVHlwZUd1aWQuXG4iKTsKIAkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sCiAJCQkJCSBidXNfbm8sIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9DSEFOTkVMX1RZUEVfVU5LTk9XTjsKQEAgLTQ4Nyw3ICs0NTIsNiBAQAogCQl9CiAKIAkJaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogdmlydHBjaSBjYWxsYmFjayBub3QgcmVnaXN0ZXJlZC4iKTsKIAkJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sCiAJCQkJCSBidXNfbm8sIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQlyZXN1bHQgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9WSVJUUENJX0RSSVZFUl9GQUlMVVJFOwpAQCAtNDk1LDcgKzQ1OSw2IEBACiAJCX0KIAogCQlpZiAoIXZpcnRfY29udHJvbF9jaGFuX2Z1bmMoJmNtZCkpIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiB2aXJ0cGNpIEdVRVNUX0FERF9bVkhCQXx8Vk5JQ10gcmV0dXJuZWQgZXJyb3IuIik7CiAJCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2X25vLAogCQkJCQkgYnVzX25vLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQkJcmVzdWx0ID0KQEAgLTUxMCw4ICs0NzMsNiBAQAogCX0KIAlyZWFkX3VubG9jaygmYnVzX2xpc3RfbG9jayk7CiAKLQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogZmFpbGVkIHRvIGZpbmQgYnVzICVkLiIsCi0JICAgICAgIGJ1c19ubyk7CiAJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLAogCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJcmVzdWx0ID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7CkBAIC01NDIsMTUgKzUwMywxMSBAQAogCQlpZiAoYnVzLT5idXNfbm8gPT0gYnVzX25vKSB7CiAJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KIAkJCWlmIChkZXZfbm8gPj0gYnVzLT5kZXZpY2VfY291bnQpIHsKLQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cGF1c2UgRmFpbGVkOiBkZXZpY2UoJWQpID49IGRldmljZUNvdW50KCVkKS4iLAotCQkJCSAgICAgICBkZXZfbm8sIGJ1cy0+ZGV2aWNlX2NvdW50KTsKIAkJCQlyZXR2YWwgPSBDT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKIAkJCX0gZWxzZSB7CiAJCQkJLyogbWFrZSBzdXJlIHRoaXMgZGV2aWNlIGV4aXN0cyAqLwogCQkJCWRldiA9IGJ1cy0+ZGV2aWNlW2Rldl9ub107CiAJCQkJaWYgKCFkZXYpIHsKLQkJCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOnBhdXNlIEZhaWxlZDogZGV2aWNlICVkIGRvZXMgbm90IGV4aXN0LiIsCi0JCQkJCSAgICAgICBkZXZfbm8pOwogCQkJCQlyZXR2YWwgPQogCQkJCQkgIENPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKIAkJCQl9CkBAIC01NTgsMTEgKzUxNSw5IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlpZiAoIWJ1cykgewotCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cGF1c2UgRmFpbGVkOiBidXMgJWQgZG9lcyBub3QgZXhpc3QiLAotCQkgICAgICAgYnVzX25vKTsKKwlpZiAoIWJ1cykKIAkJcmV0dmFsID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7Ci0JfQorCiAJcmVhZF91bmxvY2soJmJ1c19saXN0X2xvY2spOwogCWlmIChyZXR2YWwgPT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgewogCQkvKiB0aGUgbXNnIGlzIGJvdW5kIGZvciB2aXJ0cGNpOyBzZW5kCkBAIC01NzcsMTUgKzUzMiwxMSBAQAogCQkJY21kLm1zZ3R5cGUgPSBHVUVTVF9QQVVTRV9WTklDOwogCQkJY21kLnBhdXNlX3ZuaWMuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKIAkJfSBlbHNlIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpwYXVzZSBGYWlsZWQ6IHVua25vd24gY2hhbm5lbFR5cGVHdWlkLlxuIik7CiAJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfQ0hBTk5FTF9UWVBFX1VOS05PV047CiAJCX0KLQkJaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEUgRmFpbGVkOiB2aXJ0cGNpIGNhbGxiYWNrIG5vdCByZWdpc3RlcmVkLiIpOworCQlpZiAoIXZpcnRfY29udHJvbF9jaGFuX2Z1bmMpCiAJCQlyZXR1cm4gQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKLQkJfQogCQlpZiAoIXZpcnRfY29udHJvbF9jaGFuX2Z1bmMoJmNtZCkpIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpwYXVzZSBGYWlsZWQ6IHZpcnRwY2kgR1VFU1RfUEFVU0VfW1ZIQkF8fFZOSUNdIHJldHVybmVkIGVycm9yLiIpOwogCQkJcmV0dXJuCiAJCQkgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOwogCQl9CkBAIC02MDksMTUgKzU2MCwxMSBAQAogCQlpZiAoYnVzLT5idXNfbm8gPT0gYnVzX25vKSB7CiAJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KIAkJCWlmIChkZXZfbm8gPj0gYnVzLT5kZXZpY2VfY291bnQpIHsKLQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cmVzdW1lIEZhaWxlZDogZGV2aWNlKCVkKSA+PSBkZXZpY2VDb3VudCglZCkuIiwKLQkJCQkgICAgICAgZGV2X25vLCBidXMtPmRldmljZV9jb3VudCk7CiAJCQkJcmV0dmFsID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX0lOVkFMSUQ7CiAJCQl9IGVsc2UgewogCQkJCS8qIG1ha2Ugc3VyZSB0aGlzIGRldmljZSBleGlzdHMgKi8KIAkJCQlkZXYgPSBidXMtPmRldmljZVtkZXZfbm9dOwogCQkJCWlmICghZGV2KSB7Ci0JCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpyZXN1bWUgRmFpbGVkOiBkZXZpY2UgJWQgZG9lcyBub3QgZXhpc3QuIiwKLQkJCQkJICAgICAgIGRldl9ubyk7CiAJCQkJCXJldHZhbCA9CiAJCQkJCSAgQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOwogCQkJCX0KQEAgLTYyNiwxMSArNTczLDkgQEAKIAkJfQogCX0KIAotCWlmICghYnVzKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpyZXN1bWUgRmFpbGVkOiBidXMgJWQgZG9lcyBub3QgZXhpc3QiLAotCQkgICAgICAgYnVzX25vKTsKKwlpZiAoIWJ1cykKIAkJcmV0dmFsID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7Ci0JfQorCiAJcmVhZF91bmxvY2soJmJ1c19saXN0X2xvY2spOwogCS8qIHRoZSBtc2cgaXMgYm91bmQgZm9yIHZpcnRwY2k7IHNlbmQKIAkgKiBndWVzdF9tc2dzIHN0cnVjdCB0byBjYWxsYmFjawpAQCAtNjQ1LDE1ICs1OTAsMTEgQEAKIAkJCWNtZC5tc2d0eXBlID0gR1VFU1RfUkVTVU1FX1ZOSUM7CiAJCQljbWQucmVzdW1lX3ZuaWMuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKIAkJfSBlbHNlIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURTpyZXN1bWUgRmFpbGVkOiB1bmtub3duIGNoYW5uZWxUeXBlR3VpZC5cbiIpOwogCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfVFlQRV9VTktOT1dOOwogCQl9Ci0JCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYykgewotCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFIEZhaWxlZDogdmlydHBjaSBjYWxsYmFjayBub3QgcmVnaXN0ZXJlZC4iKTsKKwkJaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKQogCQkJcmV0dXJuIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0ZBSUxVUkU7Ci0JCX0KIAkJaWYgKCF2aXJ0X2NvbnRyb2xfY2hhbl9mdW5jKCZjbWQpKSB7Ci0JCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEU6cmVzdW1lIEZhaWxlZDogdmlydHBjaSBHVUVTVF9SRVNVTUVfW1ZIQkF8fFZOSUNdIHJldHVybmVkIGVycm9yLiIpOwogCQkJcmV0dXJuCiAJCQkgIENPTlRST0xWTV9SRVNQX0VSUk9SX1ZJUlRQQ0lfRFJJVkVSX0NBTExCQUNLX0VSUk9SOwogCQl9CkBAIC02NzMsMjEgKzYxNCwxNSBAQAogCWRldl9ubyA9IG1zZy0+Y21kLmRlc3Ryb3lfZGV2aWNlLmJ1c19ubzsKIAogCXJlYWRfbG9jaygmYnVzX2xpc3RfbG9jayk7Ci0JTE9HSU5GKCJkZXN0cm95X2RldmljZSBjYWxsZWQgZm9yIGJ1c19ubz0ldSwgZGV2X25vPSV1IiwgYnVzX25vLAotCSAgICAgICBkZXZfbm8pOwogCWZvciAoYnVzID0gYnVzX2xpc3Q7IGJ1czsgYnVzID0gYnVzLT5uZXh0KSB7CiAJCWlmIChidXMtPmJ1c19ubyA9PSBidXNfbm8pIHsKIAkJCS8qIG1ha2Ugc3VyZSB0aGUgZGV2aWNlIG51bWJlciBpcyB2YWxpZCAqLwogCQkJaWYgKGRldl9ubyA+PSBidXMtPmRldmljZV9jb3VudCkgewotCQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogZGV2aWNlKCVkKSA+PSBkZXZpY2VfY291bnQoJWQpLiIsCi0JCQkJICAgICAgIGRldl9ubywgYnVzLT5kZXZpY2VfY291bnQpOwogCQkJCXJldHZhbCA9IENPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOwogCQkJfSBlbHNlIHsKIAkJCQkvKiBtYWtlIHN1cmUgdGhpcyBkZXZpY2UgZXhpc3RzICovCiAJCQkJZGV2ID0gYnVzLT5kZXZpY2VbZGV2X25vXTsKIAkJCQlpZiAoIWRldikgewotCQkJCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSBGYWlsZWQ6IGRldmljZSAlZCBkb2VzIG5vdCBleGlzdC4iLAotCQkJCQkgICAgICAgZGV2X25vKTsKIAkJCQkJcmV0dmFsID0KIAkJCQkJICAgICBDT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7CiAJCQkJfQpAQCAtNjk2LDExICs2MzEsOCBAQAogCQl9CiAJfQogCi0JaWYgKCFidXMpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgRmFpbGVkOiBidXMgJWQgZG9lcyBub3QgZXhpc3QiLAotCQkgICAgICAgYnVzX25vKTsKKwlpZiAoIWJ1cykKIAkJcmV0dmFsID0gQ09OVFJPTFZNX1JFU1BfRVJST1JfQlVTX0lOVkFMSUQ7Ci0JfQogCXJlYWRfdW5sb2NrKCZidXNfbGlzdF9sb2NrKTsKIAlpZiAocmV0dmFsID09IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKIAkJLyogdGhlIG1zZyBpcyBib3VuZCBmb3IgdmlydHBjaTsgc2VuZApAQCAtNzE1LDE3ICs2NDcsMTQgQEAKIAkJCWNtZC5tc2d0eXBlID0gR1VFU1RfREVMX1ZOSUM7CiAJCQljbWQuZGVsX3ZuaWMuY2hhbnB0ciA9IGRldi0+Y2hhbnB0cjsKIAkJfSBlbHNlIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogdW5rbm93biBjaGFubmVsVHlwZUd1aWQuXG4iKTsKIAkJCXJldHVybgogCQkJICAgIENPTlRST0xWTV9SRVNQX0VSUk9SX0NIQU5ORUxfVFlQRV9VTktOT1dOOwogCQl9CiAJCWlmICghdmlydF9jb250cm9sX2NoYW5fZnVuYykgewotCQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgRmFpbGVkOiB2aXJ0cGNpIGNhbGxiYWNrIG5vdCByZWdpc3RlcmVkLiIpOwogCQkJcmV0dXJuCiAJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfRkFJTFVSRTsKIAkJfQogCQlpZiAoIXZpcnRfY29udHJvbF9jaGFuX2Z1bmMoJmNtZCkpIHsKLQkJCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogdmlydHBjaSBHVUVTVF9ERUxfW1ZIQkF8fFZOSUNdIHJldHVybmVkIGVycm9yLiIpOwogCQkJcmV0dXJuCiAJCQkgICAgQ09OVFJPTFZNX1JFU1BfRVJST1JfVklSVFBDSV9EUklWRVJfQ0FMTEJBQ0tfRVJST1I7CiAJCX0KQEAgLTczNCwxNSArNjYzLDExIEBACiAgKiBvbiB3aGljaCBhY2Nlc3NlcyB0aGUgY2hhbm5lbCBhbmQgeW91IHdpbGwgZ2V0IGEgInVuYWJsZSB0byBoYW5kbGUKICAqIGtlcm5lbCBwYWdpbmcgcmVxdWVzdCIKICAqLwotCQlpZiAoZGV2LT5wb2xsaW5nKSB7Ci0JCQlMT0dJTkYoImNhbGxpbmcgdWlzbGliX2Rpc2FibGVfY2hhbm5lbF9pbnRlcnJ1cHRzIik7CisJCWlmIChkZXYtPnBvbGxpbmcpCiAJCQl1aXNsaWJfZGlzYWJsZV9jaGFubmVsX2ludGVycnVwdHMoYnVzX25vLCBkZXZfbm8pOwotCQl9CiAJCS8qIHVubWFwIHRoZSBjaGFubmVsIG1lbW9yeSBmb3IgdGhlIGRldmljZS4gKi8KLQkJaWYgKCFtc2ctPmhkci5mbGFncy50ZXN0X21lc3NhZ2UpIHsKLQkJCUxPR0lORigiZGVzdHJveV9kZXZpY2UsIGRvaW5nIGlvdW5tYXAiKTsKKwkJaWYgKCFtc2ctPmhkci5mbGFncy50ZXN0X21lc3NhZ2UpCiAJCQl1aXNsaWJfaW91bm1hcChkZXYtPmNoYW5wdHIpOwotCQl9CiAJCWtmcmVlKGRldik7CiAJCWJ1cy0+ZGV2aWNlW2Rldl9ub10gPSBOVUxMOwogCX0KQEAgLTc4MCwxMCArNzA1LDggQEAKIAogCWluaXRfbXNnX2hlYWRlcigmbXNnLCBDT05UUk9MVk1fQlVTX0RFU1RST1ksIDAsIDApOwogCW1zZy5jbWQuZGVzdHJveV9idXMuYnVzX25vID0gYnVzX25vOwotCWlmIChkZXN0cm95X2J1cygmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7Ci0JCUxPR0VSUigiZGVzdHJveV9idXMgZmFpbGVkLiBidXNfbm89MHgleFxuIiwgYnVzX25vKTsKKwlpZiAoZGVzdHJveV9idXMoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJcmV0dXJuIDA7Ci0JfQogCXJldHVybiAxOwogfQogCkBAIC03OTQsMTEgKzcxNyw4IEBACiAJaW5pdF9tc2dfaGVhZGVyKCZtc2csIENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSwgMCwgMCk7CiAJbXNnLmNtZC5kZXN0cm95X2RldmljZS5idXNfbm8gPSBidXNfbm87CiAJbXNnLmNtZC5kZXN0cm95X2RldmljZS5kZXZfbm8gPSBkZXZfbm87Ci0JaWYgKGRlc3Ryb3lfZGV2aWNlKCZtc2csIE5VTEwpICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKLQkJTE9HRVJSKCJkZXN0cm95X2RldmljZSBmYWlsZWQuIGJ1c19ubz0weCV4IGRldl9ubz0weCV4XG4iLAotCQkgICAgICAgYnVzX25vLCBkZXZfbm8pOworCWlmIChkZXN0cm95X2RldmljZSgmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKQogCQlyZXR1cm4gMDsKLQl9CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTgwOCw3ICs3MjgsNiBAQAogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBtc2c7CiAKLQlMT0dJTkYoImVudGVyIGJ1c05vPTB4JXhcbiIsIGJ1c19ubyk7CiAJLyogc3RlcCAwOiBpbml0IHRoZSBjaGlwc2V0ICovCiAJUE9TVENPREVfTElOVVhfMyhDSElQU0VUX0lOSVRfRU5UUllfUEMsIGJ1c19ubywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKQEAgLTgyNCwxMSArNzQzLDggQEAKIAkJKi8KIAkJbXNnLmNtZC5pbml0X2NoaXBzZXQuYnVzX2NvdW50ID0gMjM7CiAJCW1zZy5jbWQuaW5pdF9jaGlwc2V0LnN3aXRjaF9jb3VudCA9IDA7Ci0JCWlmIChpbml0X2NoaXBzZXQoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgewotCQkJTE9HRVJSKCJpbml0X2NoaXBzZXQgZmFpbGVkLlxuIik7CisJCWlmIChpbml0X2NoaXBzZXQoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJCXJldHVybiAwOwotCQl9Ci0JCUxPR0lORigiY2hpcHNldCBpbml0aWFsaXplZFxuIik7CiAJCVBPU1RDT0RFX0xJTlVYXzMoQ0hJUFNFVF9JTklUX0VYSVRfUEMsIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJfQpAQCAtODQyLDcgKzc1OCw2IEBACiAJbXNnLmNtZC5jcmVhdGVfYnVzLmNoYW5uZWxfYWRkciA9IGNoYW5uZWxfYWRkcjsKIAltc2cuY21kLmNyZWF0ZV9idXMuY2hhbm5lbF9ieXRlcyA9IG5fY2hhbm5lbF9ieXRlczsKIAlpZiAoY3JlYXRlX2J1cygmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7Ci0JCUxPR0VSUigiY3JlYXRlX2J1cyBmYWlsZWQuXG4iKTsKIAkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIDA7CkBAIC04NzEsMTEgKzc4Niw4IEBACiAJbXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyA9IGRldl9ubzsKIAltc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUgPSBzZWdtZW50X3N0YXRlX3N0YW5kYnk7CiAJcmMgPSBwYXVzZV9kZXZpY2UoJm1zZyk7Ci0JaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKLQkJTE9HRVJSKCJWSEJBIHBhdXNlX2RldmljZSBmYWlsZWQuIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwKLQkJICAgICAgIGJ1c19ubywgZGV2X25vKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJcmV0dXJuIHJjOwotCX0KIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZoYmEpOwpAQCAtODkxLDExICs4MDMsOCBAQAogCW1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5kZXZfbm8gPSBkZXZfbm87CiAJbXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlID0gc2VnbWVudF9zdGF0ZV9ydW5uaW5nOwogCXJjID0gcmVzdW1lX2RldmljZSgmbXNnKTsKLQlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgewotCQlMT0dFUlIoIlZIQkEgcmVzdW1lX2RldmljZSBmYWlsZWQuIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwKLQkJICAgICAgIGJ1c19ubywgZGV2X25vKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJcmV0dXJuIHJjOwotCX0KIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X3Jlc3VtZV92aGJhKTsKQEAgLTkwOCw3ICs4MTcsNiBAQAogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBtc2c7CiAKLQlMT0dJTkYoIiBlbnRlciBidXNObz0weCV4IGRldk5vPTB4JXhcbiIsIGJ1c19ubywgZGV2X25vKTsKIAkvKiBjaGlwc2V0IGluaXQnZWQgd2l0aCBidXMgYnVzIGhhcyBiZWVuIHByZXZpb3VzbHkgY3JlYXRlZCAtCiAJKiBWZXJpZnkgaXQgc3RpbGwgZXhpc3RzIHN0ZXAgMjogY3JlYXRlIHRoZSBWSEJBIGRldmljZSBvbiB0aGUKIAkqIGJ1cwpAQCAtOTMyLDggKzg0MCw2IEBACiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGlycV9pbmZvKSk7CiAJbXNnLmNtZC5jcmVhdGVfZGV2aWNlLmNoYW5uZWxfYWRkciA9IHBoeXNfY2hhbl9hZGRyOwogCWlmIChjaGFuX2J5dGVzIDwgTUlOX0lPX0NIQU5ORUxfU0laRSkgewotCQlMT0dFUlIoIndyb25nIGNoYW5uZWwgc2l6ZS5jaGFuX2J5dGVzID0gMHgleCBJT19DSEFOTkVMX1NJWkU9IDB4JXhcbiIsCi0JCSAgICAgICBjaGFuX2J5dGVzLCAodW5zaWduZWQgaW50KU1JTl9JT19DSEFOTkVMX1NJWkUpOwogCQlQT1NUQ09ERV9MSU5VWF80KFZIQkFfQ1JFQVRFX0ZBSUxVUkVfUEMsIGNoYW5fYnl0ZXMsCiAJCQkJIE1JTl9JT19DSEFOTkVMX1NJWkUsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiAwOwpAQCAtOTQxLDcgKzg0Nyw2IEBACiAJbXNnLmNtZC5jcmVhdGVfZGV2aWNlLmNoYW5uZWxfYnl0ZXMgPSBjaGFuX2J5dGVzOwogCW1zZy5jbWQuY3JlYXRlX2RldmljZS5kYXRhX3R5cGVfdXVpZCA9IHNwYXJfdmhiYV9jaGFubmVsX3Byb3RvY29sX3V1aWQ7CiAJaWYgKGNyZWF0ZV9kZXZpY2UoJm1zZywgTlVMTCkgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgewotCQlMT0dFUlIoIlZIQkEgY3JlYXRlX2RldmljZSBmYWlsZWQuXG4iKTsKIAkJUE9TVENPREVfTElOVVhfNChWSEJBX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIDA7CkBAIC05NjcsNyArODcyLDYgQEAKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgbXNnOwogCi0JTE9HSU5GKCIgZW50ZXIgYnVzTm89MHgleCBkZXZObz0weCV4XG4iLCBidXNfbm8sIGRldl9ubyk7CiAJLyogY2hpcHNldCBpbml0J2VkIHdpdGggYnVzIGJ1cyBoYXMgYmVlbiBwcmV2aW91c2x5IGNyZWF0ZWQgLQogCSogVmVyaWZ5IGl0IHN0aWxsIGV4aXN0cyBzdGVwIDI6IGNyZWF0ZSB0aGUgVk5JQyBkZXZpY2Ugb24gdGhlCiAJKiBidXMKQEAgLTk5MSw4ICs4OTUsNiBAQAogCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcnFfaW5mbykpOwogCW1zZy5jbWQuY3JlYXRlX2RldmljZS5jaGFubmVsX2FkZHIgPSBwaHlzX2NoYW5fYWRkcjsKIAlpZiAoY2hhbl9ieXRlcyA8IE1JTl9JT19DSEFOTkVMX1NJWkUpIHsKLQkJTE9HRVJSKCJ3cm9uZyBjaGFubmVsIHNpemUuY2hhbl9ieXRlcyA9IDB4JXggSU9fQ0hBTk5FTF9TSVpFPSAweCV4XG4iLAotCQkgICAgICAgY2hhbl9ieXRlcywgKHVuc2lnbmVkIGludClNSU5fSU9fQ0hBTk5FTF9TSVpFKTsKIAkJUE9TVENPREVfTElOVVhfNChWTklDX0NSRUFURV9GQUlMVVJFX1BDLCBjaGFuX2J5dGVzLAogCQkJCSBNSU5fSU9fQ0hBTk5FTF9TSVpFLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyZXR1cm4gMDsKQEAgLTEwMDAsNyArOTAyLDYgQEAKIAltc2cuY21kLmNyZWF0ZV9kZXZpY2UuY2hhbm5lbF9ieXRlcyA9IGNoYW5fYnl0ZXM7CiAJbXNnLmNtZC5jcmVhdGVfZGV2aWNlLmRhdGFfdHlwZV91dWlkID0gc3Bhcl92bmljX2NoYW5uZWxfcHJvdG9jb2xfdXVpZDsKIAlpZiAoY3JlYXRlX2RldmljZSgmbXNnLCBOVUxMKSAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKSB7Ci0JCUxPR0VSUigiVk5JQyBjcmVhdGVfZGV2aWNlIGZhaWxlZC5cbiIpOwogCQlQT1NUQ09ERV9MSU5VWF80KFZOSUNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyZXR1cm4gMDsKQEAgLTEwMjMsMTEgKzkyNCw4IEBACiAJbXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyA9IGRldl9ubzsKIAltc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUgPSBzZWdtZW50X3N0YXRlX3N0YW5kYnk7CiAJcmMgPSBwYXVzZV9kZXZpY2UoJm1zZyk7Ci0JaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKLQkJTE9HRVJSKCJWTklDIHBhdXNlX2RldmljZSBmYWlsZWQuIGJ1c05vPTB4JXggZGV2Tm89MHgleFxuIiwKLQkJICAgICAgIGJ1c19ubywgZGV2X25vKTsKKwlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJcmV0dXJuIC0xOwotCX0KIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHVpc2xpYl9jbGllbnRfaW5qZWN0X3BhdXNlX3ZuaWMpOwpAQCAtMTA0MywxMSArOTQxLDggQEAKIAltc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID0gZGV2X25vOwogCW1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSA9IHNlZ21lbnRfc3RhdGVfcnVubmluZzsKIAlyYyA9IHJlc3VtZV9kZXZpY2UoJm1zZyk7Ci0JaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpIHsKLQkJTE9HRVJSKCJWTklDIHJlc3VtZV9kZXZpY2UgZmFpbGVkLiBidXNObz0weCV4IGRldk5vPTB4JXhcbiIsCi0JCSAgICAgICBidXNfbm8sIGRldl9ubyk7CisJaWYgKHJjICE9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpCiAJCXJldHVybiAtMTsKLQl9CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2xpZW50X2luamVjdF9yZXN1bWVfdm5pYyk7CkBAIC0xMDY5LDExICs5NjQsOCBAQAogCSovCiAJdm9pZCAqcCA9IGttZW1fY2FjaGVfYWxsb2MoY3VyX3Bvb2wsIEdGUF9BVE9NSUMgfCBfX0dGUF9OT1JFVFJZKTsKIAotCWlmIChwID09IE5VTEwpIHsKLQkJTE9HRVJSKCJ1aXNsaWJfbWFsbG9jIGZhaWxlZCB0byBhbGxvYyB1aXNjbWRyc3AgQCVzOiVkIiwKLQkJICAgICAgIGZuLCBsbik7CisJaWYgKCFwKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAJcmV0dXJuIHA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2FjaGVfYWxsb2MpOwpAQCAtMTA4MSwxMCArOTczLDggQEAKIHZvaWQKIHVpc2xpYl9jYWNoZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICpjdXJfcG9vbCwgdm9pZCAqcCwgY2hhciAqZm4sIGludCBsbikKIHsKLQlpZiAocCA9PSBOVUxMKSB7Ci0JCUxPR0VSUigidWlzbGliX2ZyZWUgTlVMTCBwb2ludGVyIEAlczolZCIsIGZuLCBsbik7CisJaWYgKCFwKQogCQlyZXR1cm47Ci0JfQogCWttZW1fY2FjaGVfZnJlZShjdXJfcG9vbCwgcCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1aXNsaWJfY2FjaGVfZnJlZSk7CkBAIC0xMTYyLDIwICsxMDUyLDE2IEBACiAJaW50IHJlbWFpbmluZ19ieXRlcyA9IFBST0NfUkVBRF9CVUZGRVJfU0laRTsKIAogLyogKnN0YXJ0ID0gYnVmOyAqLwotCWlmIChkZWJ1Z19idWYgPT0gTlVMTCkgewotCQlEQkdJTkYoImRlYnVnX2J1ZiA9PSBOVUxMOyBhbGxvY2F0aW5nIGJ1ZmZlci5cbi4iKTsKKwlpZiAoIWRlYnVnX2J1ZikgewogCQlkZWJ1Z19idWYgPSB2bWFsbG9jKFBST0NfUkVBRF9CVUZGRVJfU0laRSk7CiAKLQkJaWYgKGRlYnVnX2J1ZiA9PSBOVUxMKSB7Ci0JCQlMT0dFUlIoImZhaWxlZCB0byBhbGxvY2F0ZSBidWZmZXIgdG8gcHJvdmlkZSBwcm9jIGRhdGEuXG4iKTsKKwkJaWYgKCFkZWJ1Z19idWYpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCX0KIAogCXRlbXAgPSBkZWJ1Z19idWY7CiAKIAlpZiAoKCpvZmZzZXQgPT0gMCkgfHwgKCFkZWJ1Z19idWZfdmFsaWQpKSB7Ci0JCURCR0lORigiY2FsbGluZyBpbmZvX2RlYnVnZnNfcmVhZF9oZWxwZXIuXG4iKTsKIAkJLyogaWYgdGhlIHJlYWQgZmFpbHMsIHRoZW4gLTEgd2lsbCBiZSByZXR1cm5lZCAqLwogCQl0b3RhbF9ieXRlcyA9IGluZm9fZGVidWdmc19yZWFkX2hlbHBlcigmdGVtcCwgJnJlbWFpbmluZ19ieXRlcyk7CiAJCWRlYnVnX2J1Zl92YWxpZCA9IDE7CkBAIC0xMTk2LDE3ICsxMDgyLDkgQEAKIAlmb3IgKGJ1cyA9IGJ1c19saXN0OyBidXM7IGJ1cyA9IGJ1cy0+bmV4dCkgewogCQlpZiAoYnVzLT5idXNfbm8gPT0gYnVzX25vKSB7CiAJCQkvKiBtYWtlIHN1cmUgdGhlIGRldmljZSBudW1iZXIgaXMgdmFsaWQgKi8KLQkJCWlmIChkZXZfbm8gPj0gYnVzLT5kZXZpY2VfY291bnQpIHsKLQkJCQlMT0dFUlIoIiVzIGJhZCBidXNfbm8sIGRldl9ubz0lZCwlZCIsCi0JCQkJICAgICAgIF9fZnVuY19fLAotCQkJCSAgICAgICAoaW50KWJ1c19ubywgKGludClkZXZfbm8pOworCQkJaWYgKGRldl9ubyA+PSBidXMtPmRldmljZV9jb3VudCkKIAkJCQlicmVhazsKLQkJCX0KIAkJCWRldiA9IGJ1cy0+ZGV2aWNlW2Rldl9ub107Ci0JCQlpZiAoIWRldikKLQkJCQlMT0dFUlIoIiVzIGJhZCBidXNfbm8sIGRldl9ubz0lZCwlZCIsCi0JCQkJICAgICAgIF9fZnVuY19fLAotCQkJCSAgICAgICAoaW50KWJ1c19ubywgKGludClkZXZfbm8pOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xMjUzLDcgKzExMzEsNiBAQAogCQkJCXdhaXRfY3ljbGVzID0gKGN1cl9jeWNsZXMgLSBvbGRfY3ljbGVzKTsKIAkJfQogCX0KLQlMT0dJTkYoIndhaXRfY3ljbGVzPSVsbHUiLCB3YWl0X2N5Y2xlcyk7CiAJY3ljbGVzX2JlZm9yZV93YWl0ID0gd2FpdF9jeWNsZXM7CiAJaWRsZV9jeWNsZXMgPSAwOwogCXBvbGxfZGV2X3N0YXJ0ID0gMDsKQEAgLTEyODEsNyArMTE1OCw3IEBACiAJCQkJKiBSZXNjaGVkdWxlIHdvcmsgdG8gb2NjdXIgYXMgc29vbiBhcwogCQkJCSogcG9zc2libGUuICovCiAJCQkJaWRsZV9jeWNsZXMgPSAwOwotCQkJCWlmIChuZXdfdGFpbCA9PSBOVUxMKSB7CisJCQkJaWYgKCFuZXdfdGFpbCkgewogCQkJCQlkZXYtPmZpcnN0X2J1c3lfY250Kys7CiAJCQkJCWlmICghCiAJCQkJCSAgICAobGlzdF9pc19sYXN0CkBAIC0xMjk0LDEwICsxMTcxLDEwIEBACiAJCQkJCX0KIAkJCQl9CiAJCQl9Ci0JCQlpZiAoaW5jb21pbmdfdGkuc2hvdWxkX3N0b3ApCisJCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQogCQkJCWJyZWFrOwogCQl9Ci0JCWlmIChuZXdfdGFpbCAhPSBOVUxMKSB7CisJCWlmIChuZXdfdGFpbCkgewogCQkJdG90X21vdmVkX3RvX3RhaWxfY250Kys7CiAJCQlsaXN0X21vdmVfdGFpbChuZXdfdGFpbCwgJnBvbGxfZGV2X2NoYW4pOwogCQl9CkBAIC0xMzExLDEyICsxMTg4LDEwIEBACiAJCSogLSB0aGVyZSBpcyBubyBpbnB1dCB3YWl0aW5nIG9uIGFueSBvZiB0aGUgY2hhbm5lbHMKIAkJKiAtIHdlIGhhdmUgcmVjZWl2ZWQgYSBzaWduYWwgdG8gc3RvcCB0aGlzIHRocmVhZAogCQkqLwotCQlpZiAoaW5jb21pbmdfdGkuc2hvdWxkX3N0b3ApCisJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKLQkJaWYgKGVuX3NtYXJ0X3dha2V1cCA9PSAweEZGKSB7Ci0JCQlMT0dJTkYoImVuX3NtYXJ0X3dha2V1cCBzZXQgdG8gMHhmZiwgdG8gZm9yY2UgZXhpdGluZyBwcm9jZXNzX2luY29taW5nIik7CisJCWlmIChlbl9zbWFydF93YWtldXAgPT0gMHhGRikKIAkJCWJyZWFrOwotCQl9CiAJCS8qIHdhaXQgZm9yIFBPTExKSUZGSUVTX05PUk1BTCBqaWZmaWVzLCBvciB1bnRpbAogCQkqIHNvbWVvbmUgd2FrZXMgdXAgcG9sbF9kZXZfd2FrZV9xLAogCQkqIHdoaWNoZXZlciBjb21lcyBmaXJzdCBvbmx5IGRvIGEgd2FpdCB3aGVuIHdlIGhhdmUKQEAgLTEzMzUsNyArMTIxMCw2IEBACiAJCQlpZGxlX2N5Y2xlcyA9IGlkbGVfY3ljbGVzICsgZGVsdGFfY3ljbGVzOwogCQl9CiAJfQotCURCR0lORigiZXhpdGluZy5cbiIpOwogCWNvbXBsZXRlX2FuZF9leGl0KCZpbmNvbWluZ190aS5oYXNfc3RvcHBlZCwgMCk7CiB9CiAKQEAgLTEzNDYsNyArMTIyMCw2IEBACiAJCXJldHVybiBUUlVFOwogCWlmICghdWlzdGhyZWFkX3N0YXJ0KCZpbmNvbWluZ190aSwKIAkJCSAgICAgJnByb2Nlc3NfaW5jb21pbmcsIE5VTEwsICJkZXZfaW5jb21pbmciKSkgewotCQlMT0dFUlIoInVpc3RocmVhZF9zdGFydCBpbml0aWFsaXplX2luY29taW5nX3RocmVhZCAqKioqRkFJTEVEIik7CiAJCXJldHVybiBGQUxTRTsKIAl9CiAJaW5jb21pbmdfc3RhcnRlZCA9IFRSVUU7CkBAIC0xMzY3LDExICsxMjQwLDkgQEAKIAlzdHJ1Y3QgZGV2aWNlX2luZm8gKmRldjsKIAogCWRldiA9IGZpbmRfZGV2KGJ1c19ubywgZGV2X25vKTsKLQlpZiAoIWRldikgewotCQlMT0dFUlIoIiVzIGJ1c05vPSVkLCBkZXZObz0lZCIsIF9fZnVuY19fLCAoaW50KShidXNfbm8pLAotCQkgICAgICAgKGludCkoZGV2X25vKSk7CisJaWYgKCFkZXYpCiAJCXJldHVybjsKLQl9CisKIAlkb3duKCZwb2xsX2Rldl9sb2NrKTsKIAlpbml0aWFsaXplX2luY29taW5nX3RocmVhZCgpOwogCWRldi0+aW50ZXJydXB0ID0gaW50ZXJydXB0OwpAQCAtMTM5MiwxMSArMTI2Myw4IEBACiAJc3RydWN0IGRldmljZV9pbmZvICpkZXY7CiAKIAlkZXYgPSBmaW5kX2RldihidXNfbm8sIGRldl9ubyk7Ci0JaWYgKCFkZXYpIHsKLQkJTE9HRVJSKCIlcyBidXNObz0lZCwgZGV2Tm89JWQiLCBfX2Z1bmNfXywgKGludCkoYnVzX25vKSwKLQkJICAgICAgIChpbnQpKGRldl9ubykpOworCWlmICghZGV2KQogCQlyZXR1cm47Ci0JfQogCWRvd24oJnBvbGxfZGV2X2xvY2spOwogCWxpc3RfZGVsKCZkZXYtPmxpc3RfcG9sbGluZ19kZXZpY2VfY2hhbm5lbHMpOwogCWRldi0+cG9sbGluZyA9IEZBTFNFOwpAQCAtMTQ0NiwyNyArMTMxNCw2IEBACiAJaWYgKCF1bmlzeXNfc3Bhcl9wbGF0Zm9ybSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlMT0dJTkYoIk1PTklUT1JBUElTIik7Ci0KLQlMT0dJTkYoInNpemVvZihzdHJ1Y3QgdWlzY21kcnNwKTolbHUgYnl0ZXNcbiIsCi0JICAgICAgICh1bG9uZylzaXplb2Yoc3RydWN0IHVpc2NtZHJzcCkpOwotCUxPR0lORigic2l6ZW9mKHN0cnVjdCBwaHlzX2luZm8pOiVsdVxuIiwKLQkgICAgICAgKHVsb25nKXNpemVvZihzdHJ1Y3QgcGh5c19pbmZvKSk7Ci0JTE9HSU5GKCJzaXplb2YodWlzY21kcnNwX3Njc2kpOiVsdVxuIiwKLQkgICAgICAgKHVsb25nKXNpemVvZihzdHJ1Y3QgdWlzY21kcnNwX3Njc2kpKTsKLQlMT0dJTkYoInNpemVvZih1aXNjbWRyc3BfbmV0KTolbHVcbiIsCi0JICAgICAgICh1bG9uZylzaXplb2Yoc3RydWN0IHVpc2NtZHJzcF9uZXQpKTsKLQlMT0dJTkYoInNpemVvZihDT05UUk9MVk1fTUVTU0FHRSk6JWx1IGJ5dGVzXG4iLAotCSAgICAgICAodWxvbmcpc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSkpOwotCUxPR0lORigic2l6ZW9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sKTolbHUgYnl0ZXNcbiIsCi0JICAgICAgICh1bG9uZylzaXplb2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wpKTsKLQlMT0dJTkYoInNpemVvZihDSEFOTkVMX0hFQURFUik6JWx1IGJ5dGVzXG4iLAotCSAgICAgICAodWxvbmcpc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikpOwotCUxPR0lORigic2l6ZW9mKHN0cnVjdCBzcGFyX2lvX2NoYW5uZWxfcHJvdG9jb2wpOiVsdSBieXRlc1xuIiwKLQkgICAgICAgKHVsb25nKXNpemVvZihzdHJ1Y3Qgc3Bhcl9pb19jaGFubmVsX3Byb3RvY29sKSk7Ci0JTE9HSU5GKCJTSVpFT0ZfQ01EUlNQOiVsdSBieXRlc1xuIiwgU0laRU9GX0NNRFJTUCk7Ci0JTE9HSU5GKCJTSVpFT0ZfUFJPVE9DT0w6JWx1IGJ5dGVzXG4iLCBTSVpFT0ZfUFJPVE9DT0wpOwotCiAJLyogaW5pdGlhbGl6ZSBnbG9iYWwgcG9pbnRlcnMgdG8gTlVMTCAqLwogCWJ1c19saXN0ID0gTlVMTDsKIAlidXNfbGlzdF9jb3VudCA9IDA7CkBAIC0xNTE0LDggKzEzNjEsNiBAQAogCWRlYnVnZnNfcmVtb3ZlKGN5Y2xlc19iZWZvcmVfd2FpdF9kZWJ1Z2ZzX3JlYWQpOwogCWRlYnVnZnNfcmVtb3ZlKHBsYXRmb3JtbnVtYmVyX2RlYnVnZnNfcmVhZCk7CiAJZGVidWdmc19yZW1vdmUoZGlyX2RlYnVnZnMpOwotCi0JREJHSU5GKCJnb29kYnllLlxuIik7CiB9CiAKIG1vZHVsZV9pbml0KHVpc2xpYl9tb2RfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNxdWV1ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzcXVldWUuYwppbmRleCA3MWJiN2I2Li5kNDZkZDc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXNxdWV1ZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3F1ZXVlLmMKQEAgLTI5NSwxMiArMjk1LDEwIEBACiAJd2hpbGUgKCFkb19sb2NrZWRfY2xpZW50X2luc2VydChxdWV1ZWluZm8sIHdoaWNocXVldWUsIGNtZHJzcCwKIAkJCQkJKHNwaW5sb2NrX3QgKilpbnNlcnRsb2NrLAogCQkJCQljaGFubmVsX2lkKSkgewotCQlpZiAob2t0b3dhaXQgIT0gT0tfVE9fV0FJVCkgewotCQkJTE9HRVJSKCIqKioqRkFJTEVEIHZpc29yX3NpZ25hbF9pbnNlcnQgZmFpbGVkOyBjYW5ub3Qgd2FpdDsgaW5zZXJ0IGFib3J0ZWRcbiIpOworCQlpZiAob2t0b3dhaXQgIT0gT0tfVE9fV0FJVCkKIAkJCXJldHVybiAwOwkvKiBmYWlsZWQgdG8gcXVldWUgKi8KLQkJfQorCiAJCS8qIHRyeSBhZ2FpbiAqLwotCQlMT0dFUlIoIioqKipGQUlMRUQgdmlzb3Jfc2lnbmFsX2luc2VydCBmYWlsZWQ7IHdhaXRpbmcgdG8gdHJ5IGFnYWluXG4iKTsKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJc2NoZWR1bGVfdGltZW91dChtc2Vjc190b19qaWZmaWVzKDEwKSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzdGhyZWFkLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN0aHJlYWQuYwppbmRleCAyNWFkZjFhLi5kM2M5NzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN0aHJlYWQuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN0aHJlYWQuYwpAQCAtMjAsMTIgKzIwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KLSNpbmNsdWRlICJ1bmlrbG9nLmgiCiAjaW5jbHVkZSAidWlzdXRpbHMuaCIKICNpbmNsdWRlICJ1aXN0aHJlYWQuaCIKIAotI2RlZmluZSBLSUxMKGEsIGIsIGMpIGtpbGxfcGlkKGZpbmRfdnBpZChhKSwgYiwgYykKLQogLyogdGhpcyBpcyBzaG9ydGVyIHRoYW4gdXNpbmcgX19GSUxFX18gKGZ1bGwgcGF0aCBuYW1lKSBpbgogICogZGVidWcvaW5mby9lcnJvciBtZXNzYWdlcwogICovCkBAIC00MSwxNyArMzgsMTQgQEAKIHVpc3RocmVhZF9zdGFydChzdHJ1Y3QgdWlzdGhyZWFkX2luZm8gKnRocmluZm8sCiAJCWludCAoKnRocmVhZGZuKSh2b2lkICopLCB2b2lkICp0aHJjb250ZXh0LCBjaGFyICpuYW1lKQogewotCXRocmluZm8tPnNob3VsZF9zdG9wID0gMDsKIAkvKiB1c2VkIHRvIHN0b3AgdGhlIHRocmVhZCAqLwogCWluaXRfY29tcGxldGlvbigmdGhyaW5mby0+aGFzX3N0b3BwZWQpOwotCXRocmluZm8tPnRhc2sgPSBrdGhyZWFkX2NyZWF0ZSh0aHJlYWRmbiwgdGhyY29udGV4dCwgbmFtZSwgTlVMTCk7CisJdGhyaW5mby0+dGFzayA9IGt0aHJlYWRfcnVuKHRocmVhZGZuLCB0aHJjb250ZXh0LCBuYW1lKTsKIAlpZiAoSVNfRVJSKHRocmluZm8tPnRhc2spKSB7CiAJCXRocmluZm8tPmlkID0gMDsKIAkJcmV0dXJuIDA7CS8qIGZhaWx1cmUgKi8KIAl9CiAJdGhyaW5mby0+aWQgPSB0aHJpbmZvLT50YXNrLT5waWQ7Ci0Jd2FrZV91cF9wcm9jZXNzKHRocmluZm8tPnRhc2spOwotCUxPR0lORigic3RhcnRlZCB0aHJlYWQgcGlkOiVkXG4iLCB0aHJpbmZvLT5pZCk7CiAJcmV0dXJuIDE7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1aXN0aHJlYWRfc3RhcnQpOwpAQCAtNTksMjcgKzUzLDE3IEBACiB2b2lkCiB1aXN0aHJlYWRfc3RvcChzdHJ1Y3QgdWlzdGhyZWFkX2luZm8gKnRocmluZm8pCiB7Ci0JaW50IHJldDsKIAlpbnQgc3RvcHBlZCA9IDA7CiAKIAlpZiAodGhyaW5mby0+aWQgPT0gMCkKIAkJcmV0dXJuOwkJLyogdGhyZWFkIG5vdCBydW5uaW5nICovCiAKLQlMT0dJTkYoInVpc3RocmVhZF9zdG9wIHN0b3BwaW5nIGlkOiVkXG4iLCB0aHJpbmZvLT5pZCk7Ci0JdGhyaW5mby0+c2hvdWxkX3N0b3AgPSAxOwotCXJldCA9IEtJTEwodGhyaW5mby0+aWQsIFNJR0hVUCwgMSk7Ci0JaWYgKHJldCkgewotCQlMT0dFUlIoInVuYWJsZSB0byBzaWduYWwgdGhyZWFkICVkXG4iLCByZXQpOwotCX0gZWxzZSB7Ci0JCS8qIGdpdmUgdXAgaWYgdGhlIHRocmVhZCBoYXMgTk9UIGRpZWQgaW4gMSBtaW51dGUgKi8KLQkJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmdGhyaW5mby0+aGFzX3N0b3BwZWQsIDYwICogSFopKQotCQkJc3RvcHBlZCA9IDE7Ci0JCWVsc2UKLQkJCUxPR0VSUigidGltZWQgb3V0IHRyeWluZyB0byBzaWduYWwgdGhyZWFkXG4iKTsKLQl9Ci0JaWYgKHN0b3BwZWQpIHsKLQkJTE9HSU5GKCJ1aXN0aHJlYWRfc3RvcCBzdG9wcGVkIGlkOiVkXG4iLCB0aHJpbmZvLT5pZCk7CisJa3RocmVhZF9zdG9wKHRocmluZm8tPnRhc2spOworCS8qIGdpdmUgdXAgaWYgdGhlIHRocmVhZCBoYXMgTk9UIGRpZWQgaW4gMSBtaW51dGUgKi8KKwlpZiAod2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ0aHJpbmZvLT5oYXNfc3RvcHBlZCwgNjAgKiBIWikpCisJCXN0b3BwZWQgPSAxOworCisJaWYgKHN0b3BwZWQpCiAJCXRocmluZm8tPmlkID0gMDsKLQl9CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1aXN0aHJlYWRfc3RvcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN1dGlscy5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy91aXNsaWIvdWlzdXRpbHMuYwppbmRleCAzMTMxOGQyLi4yNmFiNzY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYi91aXN1dGlscy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdWlzbGliL3Vpc3V0aWxzLmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlIDxsaW51eC91dWlkLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgInVpc3V0aWxzLmgiCiAjaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgInZidXNoZWxwZXIuaCIKQEAgLTUzLDcgKzUyLDYgQEAKIAl2YV9saXN0IGFyZ3M7CiAJaW50IGxlbjsKIAotCURCR0lORigiYnVmZmVyID0gMHglcCA6ICpidWZmZXIgPSAweCVwLlxuIiwgYnVmZmVyLCAqYnVmZmVyKTsKIAl2YV9zdGFydChhcmdzLCBmb3JtYXQpOwogCWxlbiA9IHZzbnByaW50ZigqYnVmZmVyLCAqYnVmZmVyX3JlbWFpbmluZywgZm9ybWF0LCBhcmdzKTsKIAl2YV9lbmQoYXJncyk7CkBAIC02MSw3ICs1OSw2IEBACiAJCSpidWZmZXIgKz0gKmJ1ZmZlcl9yZW1haW5pbmc7CiAJCSp0b3RhbCArPSAqYnVmZmVyX3JlbWFpbmluZzsKIAkJKmJ1ZmZlcl9yZW1haW5pbmcgPSAwOwotCQlMT0dFUlIoImJ5dGVzIHJlbWFpbmluZyBpcyB0b28gc21hbGwhXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAkqYnVmZmVyX3JlbWFpbmluZyAtPSBsZW47CkBAIC03NSw4ICs3Miw2IEBACiB1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyKGludCB0eXBlLCB2b2lkICpmcHRyLAogCQkJICAgICBzdHJ1Y3QgdWx0cmFfdmJ1c19kZXZpY2VpbmZvICpjaGlwc2V0X2RyaXZlcl9pbmZvKQogewotCUxPR0lORigidHlwZSA9ICVkLCBmcHRyID0gMHglcC5cbiIsIHR5cGUsIGZwdHIpOwotCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSAyOgogCQlpZiAoZnB0cikgewpAQCAtOTEsNyArODYsNiBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCUxPR0VSUigiaW52YWxpZCB0eXBlICVkLlxuIiwgdHlwZSk7CiAJCXJldHVybiAwOwogCX0KIAlpZiAoY2hpcHNldF9kcml2ZXJfaW5mbykKQEAgLTEwMiw3MSArOTYsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcik7CiAKLWludAotdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcl9leCh1dWlkX2xlIHN3aXRjaF91dWlkLAotCQkJY29uc3QgY2hhciAqc3dpdGNoX3R5cGVfbmFtZSwKLQkJCWludCAoKmNvbnRyb2xmdW5jKShzdHJ1Y3QgaW9fbXNncyAqKSwKLQkJCXVuc2lnbmVkIGxvbmcgbWluX2NoYW5uZWxfYnl0ZXMsCi0JCQlpbnQgKCpzZXJ2ZXJfY2hhbm5lbF9vaykodW5zaWduZWQgbG9uZyBjaGFubmVsX2J5dGVzKSwKLQkJCWludCAoKnNlcnZlcl9jaGFubmVsX2luaXQpKHZvaWQgKngsCi0JCQkJCQl1bnNpZ25lZCBjaGFyICpjbGllbnRfc3RyLAotCQkJCQkJdTMyIGNsaWVudF9zdHJfbGVuLCB1NjQgYnl0ZXMpLAotCQkJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqY2hpcHNldF9kcml2ZXJfaW5mbykKLXsKLQlzdHJ1Y3QgcmVxX2hhbmRsZXJfaW5mbyAqcmVxX2hhbmRsZXI7Ci0KLQlMT0dJTkYoInR5cGU9JXBVTCwgY29udHJvbGZ1bmM9MHglcC5cbiIsCi0JICAgICAgICZzd2l0Y2hfdXVpZCwgY29udHJvbGZ1bmMpOwotCWlmICghY29udHJvbGZ1bmMpIHsKLQkJTE9HRVJSKCIlcFVMOiBjb250cm9sZnVuYyBtdXN0IGJlIHN1cHBsaWVkXG4iLCAmc3dpdGNoX3V1aWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCFzZXJ2ZXJfY2hhbm5lbF9vaykgewotCQlMT0dFUlIoIiVwVUw6IFNlcnZlcl9DaGFubmVsX09rIG11c3QgYmUgc3VwcGxpZWRcbiIsCi0JCQkJJnN3aXRjaF91dWlkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWlmICghc2VydmVyX2NoYW5uZWxfaW5pdCkgewotCQlMT0dFUlIoIiVwVUw6IFNlcnZlcl9DaGFubmVsX0luaXQgbXVzdCBiZSBzdXBwbGllZFxuIiwKLQkJCQkmc3dpdGNoX3V1aWQpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmVxX2hhbmRsZXIgPSByZXFfaGFuZGxlcl9hZGQoc3dpdGNoX3V1aWQsCi0JCQkJICAgICAgc3dpdGNoX3R5cGVfbmFtZSwKLQkJCQkgICAgICBjb250cm9sZnVuYywKLQkJCQkgICAgICBtaW5fY2hhbm5lbF9ieXRlcywKLQkJCQkgICAgICBzZXJ2ZXJfY2hhbm5lbF9vaywgc2VydmVyX2NoYW5uZWxfaW5pdCk7Ci0JaWYgKCFyZXFfaGFuZGxlcikgewotCQlMT0dFUlIoImZhaWxlZCB0byBhZGQgJXBVTCB0byBzZXJ2ZXIgbGlzdFxuIiwgJnN3aXRjaF91dWlkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JYXRvbWljX2luYygmdWlzdXRpbHNfcmVnaXN0ZXJlZF9zZXJ2aWNlcyk7Ci0JaWYgKGNoaXBzZXRfZHJpdmVyX2luZm8pIHsKLQkJYnVzX2RldmljZV9pbmZvX2luaXQoY2hpcHNldF9kcml2ZXJfaW5mbywgImNoaXBzZXQiLAotCQkJCSAgICAgInVpc2xpYiIsIFZFUlNJT04sIE5VTEwpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlMT0dFUlIoImZhaWxlZCB0byByZWdpc3RlciB0eXBlICVwVUwuXG4iLCAmc3dpdGNoX3V1aWQpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcl9leCk7Ci0KLWludAotdWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KHV1aWRfbGUgc3dpdGNoX3V1aWQpCi17Ci0JTE9HSU5GKCJ0eXBlPSVwVUwuXG4iLCAmc3dpdGNoX3V1aWQpOwotCWlmIChyZXFfaGFuZGxlcl9kZWwoc3dpdGNoX3V1aWQpIDwgMCkgewotCQlMT0dFUlIoImZhaWxlZCB0byByZW1vdmUgJXBVTCBmcm9tIHNlcnZlciBsaXN0XG4iLAotCQkgICAgICAgJnN3aXRjaF91dWlkKTsKLQkJcmV0dXJuIDA7Ci0JfQotCWF0b21pY19kZWMoJnVpc3V0aWxzX3JlZ2lzdGVyZWRfc2VydmljZXMpOwotCXJldHVybiAxOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodWlzY3RybF91bnJlZ2lzdGVyX3JlcV9oYW5kbGVyX2V4KTsKLQogLyoKICAqIHVuc2lnbmVkIGludCB1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKHVuc2lnbmVkIGNoYXIgKmNhbGxpbmdfY3R4LAogICoJCQkJCSAgICAgdm9pZCAqc2tiX2luLApAQCAtMTg1LDExNyArMTE0LDExIEBACiAgKgkJCQkJICAgIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgbnVtYmVyIG9mCiAgKgkJCQkJICAgIGVudHJpZXMgZmlsbGVkIGluIGZyYWdzCiAgKi8KLXVuc2lnbmVkIGludAotdWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYih1bnNpZ25lZCBjaGFyICpjYWxsaW5nX2N0eCwgdm9pZCAqc2tiX2luLAotCQkJCXVuc2lnbmVkIGludCBmaXJzdGZyYWdsZW4sCi0JCQkJdW5zaWduZWQgaW50IGZyYWdzX21heCwKLQkJCQlzdHJ1Y3QgcGh5c19pbmZvIGZyYWdzW10pCi17Ci0JdW5zaWduZWQgaW50IGNvdW50ID0gMCwgaWksIHNpemUsIG9mZnNldCA9IDAsIG51bWZyYWdzOwotCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfaW47Ci0KLQludW1mcmFncyA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7Ci0KLQl3aGlsZSAoZmlyc3RmcmFnbGVuKSB7Ci0JCWlmIChjb3VudCA9PSBmcmFnc19tYXgpIHsKLQkJCUxPR0VSUigiJXMgZnJhZ3MgYXJyYXkgdG9vIHNtYWxsOiBtYXg6JWQgY291bnQ6JWRcbiIsCi0JCQkgICAgICAgY2FsbGluZ19jdHgsIGZyYWdzX21heCwgY291bnQpOwotCQkJcmV0dXJuIC0xOwkvKiBmYWlsdXJlICovCi0JCX0KLQkJZnJhZ3NbY291bnRdLnBpX3BmbiA9Ci0JCSAgICBwYWdlX3RvX3Bmbih2aXJ0X3RvX3BhZ2Uoc2tiLT5kYXRhICsgb2Zmc2V0KSk7Ci0JCWZyYWdzW2NvdW50XS5waV9vZmYgPQotCQkgICAgKHVuc2lnbmVkIGxvbmcpKHNrYi0+ZGF0YSArIG9mZnNldCkgJiBQSV9QQUdFX01BU0s7Ci0JCXNpemUgPQotCQkgICAgbWluKGZpcnN0ZnJhZ2xlbiwKLQkJCSh1bnNpZ25lZCBpbnQpKFBJX1BBR0VfU0laRSAtIGZyYWdzW2NvdW50XS5waV9vZmYpKTsKLQkJLyogY2FuIHRha2Ugc21hbGxlc3Qgb2YgZmlyc3RmcmFnbGVuKHdoYXQncyBsZWZ0KSBPUgotCQkqIGJ5dGVzIGxlZnQgaW4gdGhlIHBhZ2UKLQkJKi8KLQkJZnJhZ3NbY291bnRdLnBpX2xlbiA9IHNpemU7Ci0JCWZpcnN0ZnJhZ2xlbiAtPSBzaXplOwotCQlvZmZzZXQgKz0gc2l6ZTsKLQkJY291bnQrKzsKLQl9Ci0JaWYgKCFudW1mcmFncykKLQkJZ290byBkb2xpc3Q7Ci0KLQlpZiAoKGNvdW50ICsgbnVtZnJhZ3MpID4gZnJhZ3NfbWF4KSB7Ci0JCUxPR0VSUigiKioqKiBGQUlMRUQgJXMgZnJhZ3MgYXJyYXkgdG9vIHNtYWxsOiBtYXg6JWQgY291bnQrbnJfZnJhZ3M6JWRcbiIsCi0JCSAgICAgICBjYWxsaW5nX2N0eCwgZnJhZ3NfbWF4LCBjb3VudCArIG51bWZyYWdzKTsKLQkJcmV0dXJuIC0xOwkvKiBmYWlsdXJlICovCi0JfQotCi0JZm9yIChpaSA9IDA7IGlpIDwgbnVtZnJhZ3M7IGlpKyspIHsKLQkJY291bnQgPSBhZGRfcGh5c2luZm9fZW50cmllcyhwYWdlX3RvX3BmbigKLQkJCQlza2JfZnJhZ19wYWdlKCZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2lpXSkpLAotCQkJCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2lpXS4KLQkJCQkJcGFnZV9vZmZzZXQsCi0JCQkJCXNrYl9zaGluZm8oc2tiKS0+ZnJhZ3NbaWldLgotCQkJCQlzaXplLCBjb3VudCwgZnJhZ3NfbWF4LAotCQkJCQlmcmFncyk7Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIGFkZCBwaHlzaW5mbyBlbnRyaWVzXG4iKTsKLQkJCXJldHVybiAtMTsJLyogZmFpbHVyZSAqLwotCQl9Ci0JfQotCi1kb2xpc3Q6IGlmIChza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiaW5saXN0OwotCQlpbnQgYzsKLQotCQlmb3IgKHNrYmlubGlzdCA9IHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0OyBza2Jpbmxpc3Q7Ci0JCSAgICAgc2tiaW5saXN0ID0gc2tiaW5saXN0LT5uZXh0KSB7Ci0JCQljID0gdWlzdXRpbF9jb3B5X2ZyYWdzaW5mb19mcm9tX3NrYigicmVjdXJzaXZlIiwKLQkJCQlza2Jpbmxpc3QsCi0JCQkJc2tiaW5saXN0LT5sZW4gLSBza2Jpbmxpc3QtPmRhdGFfbGVuLAotCQkJCWZyYWdzX21heCAtIGNvdW50LAotCQkJCSZmcmFnc1tjb3VudF0pOwotCQkJaWYgKGMgPT0gLTEpIHsKLQkJCQlMT0dFUlIoIioqKiogRkFJTEVEIHJlY3Vyc2l2ZSBjYWxsIGZhaWxlZFxuIik7Ci0JCQkJcmV0dXJuIC0xOwotCQkJfQotCQkJY291bnQgKz0gYzsKLQkJfQotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh1aXN1dGlsX2NvcHlfZnJhZ3NpbmZvX2Zyb21fc2tiKTsKIAogc3RhdGljIExJU1RfSEVBRChyZXFfaGFuZGxlcl9pbmZvX2xpc3QpOyAvKiBsaXN0IG9mIHN0cnVjdCByZXFfaGFuZGxlcl9pbmZvICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJlcV9oYW5kbGVyX2luZm9fbGlzdF9sb2NrKTsKIAogc3RydWN0IHJlcV9oYW5kbGVyX2luZm8gKgotcmVxX2hhbmRsZXJfYWRkKHV1aWRfbGUgc3dpdGNoX3V1aWQsCi0JICAgICAgY29uc3QgY2hhciAqc3dpdGNoX3R5cGVfbmFtZSwKLQkgICAgICBpbnQgKCpjb250cm9sZnVuYykoc3RydWN0IGlvX21zZ3MgKiksCi0JICAgICAgdW5zaWduZWQgbG9uZyBtaW5fY2hhbm5lbF9ieXRlcywKLQkgICAgICBpbnQgKCpzZXJ2ZXJfY2hhbm5lbF9vaykodW5zaWduZWQgbG9uZyBjaGFubmVsX2J5dGVzKSwKLQkgICAgICBpbnQgKCpzZXJ2ZXJfY2hhbm5lbF9pbml0KQotCSAgICAgICAodm9pZCAqeCwgdW5zaWduZWQgY2hhciAqY2xpZW50c3RyLCB1MzIgY2xpZW50c3RyX2xlbiwKLQkJdTY0IGJ5dGVzKSkKLXsKLQlzdHJ1Y3QgcmVxX2hhbmRsZXJfaW5mbyAqcmMgPSBOVUxMOwotCi0JcmMgPSBremFsbG9jKHNpemVvZigqcmMpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXJjKQotCQlyZXR1cm4gTlVMTDsKLQlyYy0+c3dpdGNoX3V1aWQgPSBzd2l0Y2hfdXVpZDsKLQlyYy0+Y29udHJvbGZ1bmMgPSBjb250cm9sZnVuYzsKLQlyYy0+bWluX2NoYW5uZWxfYnl0ZXMgPSBtaW5fY2hhbm5lbF9ieXRlczsKLQlyYy0+c2VydmVyX2NoYW5uZWxfb2sgPSBzZXJ2ZXJfY2hhbm5lbF9vazsKLQlyYy0+c2VydmVyX2NoYW5uZWxfaW5pdCA9IHNlcnZlcl9jaGFubmVsX2luaXQ7Ci0JaWYgKHN3aXRjaF90eXBlX25hbWUpCi0JCXN0cm5jcHkocmMtPnN3aXRjaF90eXBlX25hbWUsIHN3aXRjaF90eXBlX25hbWUsCi0JCQlzaXplb2YocmMtPnN3aXRjaF90eXBlX25hbWUpIC0gMSk7Ci0Jc3Bpbl9sb2NrKCZyZXFfaGFuZGxlcl9pbmZvX2xpc3RfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmcmMtPmxpc3RfbGluaywgJnJlcV9oYW5kbGVyX2luZm9fbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnJlcV9oYW5kbGVyX2luZm9fbGlzdF9sb2NrKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RydWN0IHJlcV9oYW5kbGVyX2luZm8gKgogcmVxX2hhbmRsZXJfZmluZCh1dWlkX2xlIHN3aXRjaF91dWlkKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmxlbHQsICp0bXA7CkBAIC0zMTIsMjMgKzEzNSwzIEBACiAJc3Bpbl91bmxvY2soJnJlcV9oYW5kbGVyX2luZm9fbGlzdF9sb2NrKTsKIAlyZXR1cm4gTlVMTDsKIH0KLQotaW50Ci1yZXFfaGFuZGxlcl9kZWwodXVpZF9sZSBzd2l0Y2hfdXVpZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsZWx0LCAqdG1wOwotCXN0cnVjdCByZXFfaGFuZGxlcl9pbmZvICplbnRyeSA9IE5VTEw7Ci0JaW50IHJjID0gLTE7Ci0KLQlzcGluX2xvY2soJnJlcV9oYW5kbGVyX2luZm9fbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUobGVsdCwgdG1wLCAmcmVxX2hhbmRsZXJfaW5mb19saXN0KSB7Ci0JCWVudHJ5ID0gbGlzdF9lbnRyeShsZWx0LCBzdHJ1Y3QgcmVxX2hhbmRsZXJfaW5mbywgbGlzdF9saW5rKTsKLQkJaWYgKHV1aWRfbGVfY21wKGVudHJ5LT5zd2l0Y2hfdXVpZCwgc3dpdGNoX3V1aWQpID09IDApIHsKLQkJCWxpc3RfZGVsKGxlbHQpOwotCQkJa2ZyZWUoZW50cnkpOwotCQkJcmMrKzsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmcmVxX2hhbmRsZXJfaW5mb19saXN0X2xvY2spOwotCXJldHVybiByYzsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWcKaW5kZXggOWFmOThmYy4uZGZhZGZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL0tjb25maWcKQEAgLTQsNyArNCwxMCBAQAogCiBjb25maWcgVU5JU1lTX1ZJUlRIQkEKIAl0cmlzdGF0ZSAiVW5pc3lzIHZpcnRoYmEgZHJpdmVyIgotCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBVTklTWVNfVklTT1JDSElQU0VUICYmIFVOSVNZU19VSVNMSUIgJiYgVU5JU1lTX1ZJUlRQQ0kgJiYgU0NTSQorCWRlcGVuZHMgb24gU0NTSQorCXNlbGVjdCBVTklTWVNfVklTT1JDSElQU0VUCisJc2VsZWN0IFVOSVNZU19VSVNMSUIKKwlzZWxlY3QgVU5JU1lTX1ZJUlRQQ0kKIAktLS1oZWxwLS0tCiAJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIHZpcnRoYmEgZHJpdmVyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvTWFrZWZpbGUgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvTWFrZWZpbGUKaW5kZXggYmE1NWFlMS4uYTRlNDAzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS9NYWtlZmlsZQpAQCAtNiw3ICs2LDYgQEAKIAogY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9pbmNsdWRlCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Vpc2xpYgotY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy90aW1za21vZAogY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQKIGNjZmxhZ3MteSArPSAtSWRyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaQogY2NmbGFncy15ICs9IC1JZHJpdmVycy9zdGFnaW5nL3VuaXN5cy9jb21tb24tc3Bhci9pbmNsdWRlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvdmlydGhiYS5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0aGJhL3ZpcnRoYmEuYwppbmRleCBlNmVjZWE1Li5kOTAwMWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRoYmEvdmlydGhiYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydGhiYS92aXJ0aGJhLmMKQEAgLTI2LDE0ICsyNiwxMSBAQAogICogd2hpY2ggc3RhcnQgd2l0aCBhbiA4IGRpZ2l0IHNlcXVlbmNlIG51bWJlciwgYSBjb2xvbiwgYW5kIHRoZW4KICAqIGxldHRlcnMgYWZ0ZXIgdGhhdCAqLwogCi0jdW5kZWYgREJHSU5GCi0KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpZmRlZiBDT05GSUdfTU9EVkVSU0lPTlMKICNpbmNsdWRlIDxjb25maWcvbW9kdmVyc2lvbnMuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKICNpbmNsdWRlICJ1aXN1dGlscy5oIgogI2luY2x1ZGUgInVpc3F1ZXVlLmgiCkBAIC0yNjEsMTEgKzI1OCw5IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdmhiYWluZm8tPnByaXZsb2NrLCBmbGFncyk7CiAJaW5zZXJ0X2xvY2F0aW9uID0gdmhiYWluZm8tPm5leHRpbnNlcnQ7Ci0Jd2hpbGUgKHZoYmFpbmZvLT5wZW5kaW5nW2luc2VydF9sb2NhdGlvbl0uc2VudCAhPSBOVUxMKSB7CisJd2hpbGUgKHZoYmFpbmZvLT5wZW5kaW5nW2luc2VydF9sb2NhdGlvbl0uc2VudCkgewogCQlpbnNlcnRfbG9jYXRpb24gPSAoaW5zZXJ0X2xvY2F0aW9uICsgMSkgJSBNQVhfUEVORElOR19SRVFVRVNUUzsKIAkJaWYgKGluc2VydF9sb2NhdGlvbiA9PSAoaW50KXZoYmFpbmZvLT5uZXh0aW5zZXJ0KSB7Ci0JCQlMT0dFUlIoIlF1ZXVlIHNob3VsZCBiZSBmdWxsLiBpbnNlcnRfbG9jYXRpb248PCVkPj4gIFVuYWJsZSB0byBmaW5kIG9wZW4gc2xvdCBmb3IgcGVuZGluZyBjb21tYW5kcy5cbiIsCi0JCQkgICAgIGluc2VydF9sb2NhdGlvbik7CiAJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKIAkJCXJldHVybiAtMTsKIAkJfQpAQCAtMjg2LDcgKzI4MSw2IEBACiAJaW50IGluc2VydF9sb2NhdGlvbiA9IGFkZF9zY3NpcGVuZGluZ19lbnRyeSh2aGJhaW5mbywgY21kdHlwZSwgbmV3KTsKIAogCXdoaWxlIChpbnNlcnRfbG9jYXRpb24gPT0gLTEpIHsKLQkJTE9HRVJSKCJGYWlsZWQgdG8gZmluZCBlbXB0eSBxdWV1ZSBzbG90LiAgV2FpdGluZyB0byB0cnkgYWdhaW5cbiIpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCQlzY2hlZHVsZV90aW1lb3V0KG1zZWNzX3RvX2ppZmZpZXMoMTApKTsKIAkJaW5zZXJ0X2xvY2F0aW9uID0gYWRkX3Njc2lwZW5kaW5nX2VudHJ5KHZoYmFpbmZvLCBjbWR0eXBlLCBuZXcpOwpAQCAtMzAxLDE2ICsyOTUsOCBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCAqc2VudCA9IE5VTEw7CiAKLQlpZiAoZGVsID49IE1BWF9QRU5ESU5HX1JFUVVFU1RTKSB7Ci0JCUxPR0VSUigiSW52YWxpZCBxdWV1ZSBwb3NpdGlvbiA8PCVsdT4+IGdpdmVuIHRvIGRlbGV0ZS4gTUFYX1BFTkRJTkdfUkVRVUVTVFMgPDwlZD4+XG4iLAotCQkgICAgICh1bnNpZ25lZCBsb25nKWRlbCwgTUFYX1BFTkRJTkdfUkVRVUVTVFMpOwotCX0gZWxzZSB7CisJaWYgKGRlbCA8IE1BWF9QRU5ESU5HX1JFUVVFU1RTKSB7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aGJhaW5mby0+cHJpdmxvY2ssIGZsYWdzKTsKLQotCQlpZiAodmhiYWluZm8tPnBlbmRpbmdbZGVsXS5zZW50ID09IE5VTEwpCi0JCQlMT0dFUlIoIkRlbGV0aW5nIGFscmVhZHkgY2xlYXJlZCBxdWV1ZSBlbnRyeSBhdCA8PCVsdT4+LlxuIiwKLQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpZGVsKTsKLQogCQlzZW50ID0gdmhiYWluZm8tPnBlbmRpbmdbZGVsXS5zZW50OwogCiAJCXZoYmFpbmZvLT5wZW5kaW5nW2RlbF0uY21kdHlwZSA9IDA7CkBAIC0zNTcsMTMgKzM0Myw3IEBACiAJCWVycm9yID0KIAkJICAgIHNjc2lfYWRkX2RldmljZShkYXItPnNob3N0LCBkYXItPmNoYW5uZWwsIGRhci0+aWQsCiAJCQkJICAgIGRhci0+bHVuKTsKLQkJaWYgKGVycm9yKQotCQkJTE9HRVJSKCJGYWlsZWQgc2NzaV9hZGRfZGV2aWNlOiBob3N0X25vPSVkW2NoYW49JWQ6aWQ9JWQ6bHVuPSVkXVxuIiwKLQkJCSAgICAgZGFyLT5zaG9zdC0+aG9zdF9ubywgZGFyLT5jaGFubmVsLCBkYXItPmlkLAotCQkJICAgICBkYXItPmx1bik7Ci0JfSBlbHNlCi0JCUxPR0VSUigiRmFpbGVkIHNjc2lfZGV2aWNlX2xvb2t1cDpbY2hhbj0lZDppZD0lZDpsdW49JWRdXG4iLAotCQkgICAgICAgZGFyLT5jaGFubmVsLCBkYXItPmlkLCBkYXItPmx1bik7CisJfQogCWtmcmVlKGRhcik7CiB9CiAKQEAgLTQwOCwxMCArMzg4LDYgQEAKIAkJZGFyLT5pZCA9IGNtZHJzcC0+ZGlza25vdGlmeS5pZDsKIAkJZGFyLT5sdW4gPSBjbWRyc3AtPmRpc2tub3RpZnkubHVuOwogCQlRVUVVRV9ESVNLQUREUkVNT1ZFKGRhcik7Ci0JfSBlbHNlIHsKLQkJTE9HRVJSKCJrbWFsbG9jIGZhaWxlZCBmb3IgZGFyLiBob3N0X25vPSVkW2NoYW49JWQ6aWQ9JWQ6bHVuPSVkXVxuIiwKLQkJICAgICBzaG9zdC0+aG9zdF9ubywgY21kcnNwLT5kaXNrbm90aWZ5LmNoYW5uZWwsCi0JCSAgICAgY21kcnNwLT5kaXNrbm90aWZ5LmlkLCBjbWRyc3AtPmRpc2tub3RpZnkubHVuKTsKIAl9CiB9CiAKQEAgLTQyNyw3ICs0MDMsNyBAQAogCXU2NCBtYXNrOwogCXVuc2lnbmVkIGxvbmcgbG9uZyByYzE7CiAKLQlpZiAodmlydGhiYWluZm8gPT0gTlVMTCkKKwlpZiAoIXZpcnRoYmFpbmZvKQogCQlyZXR1cm4gSVJRX05PTkU7CiAJdmlydGhiYWluZm8tPmludGVycnVwdHNfcmN2ZCsrOwogCWNoYW5uZWxfaGVhZGVyID0gdmlydGhiYWluZm8tPmNoaW5mby5xdWV1ZWluZm8tPmNoYW47CkBAIC00NjcsMTMgKzQ0Myw2IEBACiAJc3RydWN0IHNpZ25hbF9xdWV1ZV9oZWFkZXIgX19pb21lbSAqcHFoZHI7CiAJdTY0IG1hc2s7CiAKLQlMT0dWRVIoImVudGVyaW5nIHZpcnRoYmFfcHJvYmUuLi5cbiIpOwotCUxPR1ZFUigidmlydHBjaWRldiBidXNfbm88PCVkPj5kZXZObzw8JWQ+PiIsIHZpcnRwY2lkZXYtPmJ1c19ubywKLQkgICAgICAgdmlydHBjaWRldi0+ZGV2aWNlX25vKTsKLQotCUxPR0lORigiZW50ZXJpbmcgdmlydGhiYV9wcm9iZS4uLlxuIik7Ci0JTE9HSU5GKCJ2aXJ0cGNpZGV2IGJ1c19ubzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzX25vLAotCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2Vfbm8pOwogCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9QUk9CRV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJLyogY2FsbCBzY3NpX2hvc3RfYWxsb2MgdG8gcmVnaXN0ZXIgYSBzY3NpIGhvc3QgYWRhcHRlcgogCSAqIGluc3RhbmNlIC0gdGhpcyB2aXJ0aGJhIHRoYXQgaGFzIGp1c3QgYmVlbiBjcmVhdGVkIGlzIGFuCkBAIC00ODIsNyArNDUxLDYgQEAKIAkgKiBpbml0aWFsaXphdGlvbi4gIFRoZSBob3N0IGlzIG5vdCBwdWJsaXNoZWQgdG8gdGhlIHNjc2kKIAkgKiBtaWRsYXllciB1bnRpbCBzY3NpX2FkZF9ob3N0IGlzIGNhbGxlZC4KIAkgKi8KLQlEQkdJTkYoImNhbGxpbmcgc2NzaV9ob3N0X2FsbG9jLlxuIik7CiAKIAkvKiBhcmcgMiBwYXNzZWQgaW4gbGVuZ3RoIG9mIGV4dHJhIHNwYWNlIHdlIHdhbnQgYWxsb2NhdGVkCiAJICogd2l0aCBzY3NpX2hvc3Qgc3RydWN0IGZvciBvdXIgb3duIHVzZSBzY3NpX2hvc3RfYWxsb2MKQEAgLTQ5MCwxMiArNDU4LDkgQEAKIAkgKi8KIAlzY3NpaG9zdCA9IHNjc2lfaG9zdF9hbGxvYygmdmlydGhiYV9kcml2ZXJfdGVtcGxhdGUsCiAJCQkJICAgc2l6ZW9mKHN0cnVjdCB2aXJ0aGJhX2luZm8pKTsKLQlpZiAoc2NzaWhvc3QgPT0gTlVMTCkKKwlpZiAoIXNjc2lob3N0KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCURCR0lORigic2NzaWhvc3Q6IDB4JXAsIHNjc2lob3N0LT50aGlzX2lkOiAlZCwgaG9zdF9ubzogJWQuXG4iLAotCSAgICAgICBzY3NpaG9zdCwgc2NzaWhvc3QtPnRoaXNfaWQsIHNjc2lob3N0LT5ob3N0X25vKTsKLQogCXNjc2lob3N0LT50aGlzX2lkID0gVUlTX01BR0lDX1ZIQkE7CiAJLyogbGludXggdHJlYXRzIG1heC1jaGFubmVsIGRpZmZlcmVudGx5IHRoYW4gbWF4LWlkICYgbWF4LWx1bi4KIAkgKiBJbiB0aGUgbGF0dGVyIGNhc2VzLCB0aG9zZSB0d28gdmFsdWVzIHJlc3VsdCBpbiAwIHRvIG1heC0xCkBAIC01MDMsMTIgKzQ2OCw2IEBACiAJICogc2NhbiBpcyAwIHRvIG1heCAoaW5jbHVzaXZlKTsgc28gd2Ugd2lsbCBzdWJ0cmFjdCBvbmUgZnJvbQogCSAqIHRoZSBtYXgtY2hhbm5lbCB2YWx1ZS4KIAkgKi8KLQlMT0dJTkYoInZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9jaGFubmVsPSV1LCBtYXhfaWQ9JXUsIG1heF9sdW49JXUsIGNtZF9wZXJfbHVuPSV1LCBtYXhfaW9fc2l6ZT0ldVxuIiwKLQkgICAgICh1bnNpZ25lZCl2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfY2hhbm5lbCAtIDEsCi0JICAgICAodW5zaWduZWQpdmlydHBjaWRldi0+c2NzaS5tYXgubWF4X2lkLAotCSAgICAgKHVuc2lnbmVkKXZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9sdW4sCi0JICAgICAodW5zaWduZWQpdmlydHBjaWRldi0+c2NzaS5tYXguY21kX3Blcl9sdW4sCi0JICAgICAodW5zaWduZWQpdmlydHBjaWRldi0+c2NzaS5tYXgubWF4X2lvX3NpemUpOwogCXNjc2lob3N0LT5tYXhfY2hhbm5lbCA9ICh1bnNpZ25lZCl2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfY2hhbm5lbDsKIAlzY3NpaG9zdC0+bWF4X2lkID0gKHVuc2lnbmVkKXZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9pZDsKIAlzY3NpaG9zdC0+bWF4X2x1biA9ICh1bnNpZ25lZCl2aXJ0cGNpZGV2LT5zY3NpLm1heC5tYXhfbHVuOwpAQCAtNTE5LDE1ICs0NzgsNiBAQAogCSAgICAodW5zaWduZWQgc2hvcnQpKHZpcnRwY2lkZXYtPnNjc2kubWF4Lm1heF9pb19zaXplIC8gUEFHRV9TSVpFKTsKIAlpZiAoc2NzaWhvc3QtPnNnX3RhYmxlc2l6ZSA+IE1BWF9QSFlTX0lORk8pCiAJCXNjc2lob3N0LT5zZ190YWJsZXNpemUgPSBNQVhfUEhZU19JTkZPOwotCUxPR0lORigic2NzaWhvc3QtPm1heF9jaGFubmVsPSV1LCBtYXhfaWQ9JXUsIG1heF9sdW49JWxsdSwgY21kX3Blcl9sdW49JXUsIG1heF9zZWN0b3JzPSVodSwgc2dfdGFibGVzaXplPSVodVxuIiwKLQkgICAgIHNjc2lob3N0LT5tYXhfY2hhbm5lbCwgc2NzaWhvc3QtPm1heF9pZCwgc2NzaWhvc3QtPm1heF9sdW4sCi0JICAgICBzY3NpaG9zdC0+Y21kX3Blcl9sdW4sIHNjc2lob3N0LT5tYXhfc2VjdG9ycywKLQkgICAgIHNjc2lob3N0LT5zZ190YWJsZXNpemUpOwotCUxPR0lORigic2NzaWhvc3QtPmNhbl9xdWV1ZT0ldSwgc2NzaWhvc3QtPmNtZF9wZXJfbHVuPSV1LCBtYXhfc2VjdG9ycz0laHUsIHNnX3RhYmxlc2l6ZT0laHVcbiIsCi0JICAgICBzY3NpaG9zdC0+Y2FuX3F1ZXVlLCBzY3NpaG9zdC0+Y21kX3Blcl9sdW4sIHNjc2lob3N0LT5tYXhfc2VjdG9ycywKLQkgICAgIHNjc2lob3N0LT5zZ190YWJsZXNpemUpOwotCi0JREJHSU5GKCJjYWxsaW5nIHNjc2lfYWRkX2hvc3RcbiIpOwogCiAJLyogdGhpcyBjcmVhdGVzICJob3N0JWQiIGluIHN5c2ZzLiAgSWYgMm5kIGFyZ3VtZW50IGlzIE5VTEwsCiAJICogdGhlbiB0aGlzIGdlbmVyaWMgL3N5cy9kZXZpY2VzL3BsYXRmb3JtL2hvc3Q/ICBkZXZpY2UgaXMKQEAgLTUzOCw3ICs0ODgsNiBAQAogCSAqLwogCWVycm9yID0gc2NzaV9hZGRfaG9zdChzY3NpaG9zdCwgJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2KTsKIAlpZiAoZXJyb3IpIHsKLQkJTE9HRVJSKCJzY3NpX2FkZF9ob3N0ICoqKipGQUlMRUQgMHgleCAgVEJEIC0gUkVDT1ZFUlxuIiwgZXJyb3IpOwogCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfUFJPQkVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJLyogZGVjciByZWZjb3VudCBvbiBzY3NpaG9zdCB3aGljaCB3YXMgaW5jcmVtZW50ZWQgYnkKIAkJICogc2NzaV9hZGRfaG9zdCBzbyB0aGUgc2NzaV9ob3N0IGdldHMgZGVsZXRlZApAQCAtNTUwLDcgKzQ5OSw3IEBACiAJdmlydGhiYWluZm8gPSAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKXNjc2lob3N0LT5ob3N0ZGF0YTsKIAltZW1zZXQodmlydGhiYWluZm8sIDAsIHNpemVvZihzdHJ1Y3QgdmlydGhiYV9pbmZvKSk7CiAJZm9yIChpID0gMDsgaSA8IFZJUlRIQkFTT1BFTk1BWDsgaSsrKSB7Ci0JCWlmICh2aXJ0aGJhc19vcGVuW2ldLnZpcnRoYmFpbmZvID09IE5VTEwpIHsKKwkJaWYgKCF2aXJ0aGJhc19vcGVuW2ldLnZpcnRoYmFpbmZvKSB7CiAJCQl2aXJ0aGJhc19vcGVuW2ldLnZpcnRoYmFpbmZvID0gdmlydGhiYWluZm87CiAJCQlicmVhazsKIAkJfQpAQCAtNTYwLDkgKzUwOSw2IEBACiAJdmlydGhiYWluZm8tPnZpcnRwY2lkZXYgPSB2aXJ0cGNpZGV2OwogCXNwaW5fbG9ja19pbml0KCZ2aXJ0aGJhaW5mby0+Y2hpbmZvLmluc2VydGxvY2spOwogCi0JREJHSU5GKCJnZW5lcmljX2RldjogMHglcCwgcXVldWVpbmZvOiAweCVwLlxuIiwKLQkgICAgICAgJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LCAmdmlydHBjaWRldi0+cXVldWVpbmZvKTsKLQogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnZpcnRoYmFpbmZvLT5yc3BfcXVldWUpOwogCXNwaW5fbG9ja19pbml0KCZ2aXJ0aGJhaW5mby0+cHJpdmxvY2spOwogCW1lbXNldCgmdmlydGhiYWluZm8tPnBlbmRpbmcsIDAsIHNpemVvZih2aXJ0aGJhaW5mby0+cGVuZGluZykpOwpAQCAtNTg0LDggKzUzMCw2IEBACiAJICAgICAgIFVMVFJBX0lPX0NIQU5ORUxfSVNfUE9MTElORywKIAkgICAgICAgJnZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuLT5mZWF0dXJlcyk7CiAJLyogc3RhcnQgdGhyZWFkIHRoYXQgd2lsbCByZWNlaXZlIHNjc2ljbW5kIHJlc3BvbnNlcyAqLwotCURCR0lORigic3RhcnRpbmcgcnNwIHRocmVhZCAtLSBxdWV1ZWluZm86IDB4JXAsIHRocmVhZGluZm86IDB4JXAuXG4iLAotCSAgICAgICB2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mbywgJnZpcnRoYmFpbmZvLT5jaGluZm8udGhyZWFkaW5mbyk7CiAKIAljaGFubmVsX2hlYWRlciA9IHZpcnRoYmFpbmZvLT5jaGluZm8ucXVldWVpbmZvLT5jaGFuOwogCXBxaGRyID0gKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIF9faW9tZW0gKikKQEAgLTU5Niw3ICs1NDAsNiBAQAogCWlmICghdWlzdGhyZWFkX3N0YXJ0KCZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnRocmVhZGluZm8sCiAJCQkgICAgIHByb2Nlc3NfaW5jb21pbmdfcnNwcywKIAkJCSAgICAgdmlydGhiYWluZm8sICJ2aGJhX2luY29taW5nIikpIHsKLQkJTE9HRVJSKCJ1aXN0aHJlYWRfc3RhcnQgcnNwICoqKipGQUlMRURcbiIpOwogCQkvKiBkZWNyIHJlZmNvdW50IG9uIHNjc2lob3N0IHdoaWNoIHdhcyBpbmNyZW1lbnRlZCBieQogCQkgKiBzY3NpX2FkZF9ob3N0IHNvIHRoZSBzY3NpX2hvc3QgZ2V0cyBkZWxldGVkCiAJCSAqLwpAQCAtNjA0LDQyICs1NDcsMjYgQEAKIAkJc2NzaV9ob3N0X3B1dChzY3NpaG9zdCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlMT0dJTkYoInNlbmRJbnRlcnJ1cHRIYW5kbGU9MHglMTZsbFgiLAotCSAgICAgICB2aXJ0aGJhaW5mby0+aW50ci5zZW5kX2lycV9oYW5kbGUpOwotCUxPR0lORigicmVjdkludGVycnVwdEhhbmRsZT0weCUxNmxsWCIsCi0JICAgICAgIHZpcnRoYmFpbmZvLT5pbnRyLnJlY3ZfaXJxX2hhbmRsZSk7Ci0JTE9HSU5GKCJyZWN2SW50ZXJydXB0VmVjdG9yPTB4JThYIiwKLQkgICAgICAgdmlydGhiYWluZm8tPmludHIucmVjdl9pcnFfdmVjdG9yKTsKLQlMT0dJTkYoInJlY3ZJbnRlcnJ1cHRTaGFyZWQ9MHglMlgiLAotCSAgICAgICB2aXJ0aGJhaW5mby0+aW50ci5yZWN2X2lycV9zaGFyZWQpOwotCUxPR0lORigic2NzaWhvc3QuaG9zdHQtPm5hbWU9JXMiLCBzY3NpaG9zdC0+aG9zdHQtPm5hbWUpOwogCXZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yID0KIAkgICAgdmlydGhiYWluZm8tPmludHIucmVjdl9pcnFfaGFuZGxlICYgSU5URVJSVVBUX1ZFQ1RPUl9NQVNLOwogCXJzcCA9IHJlcXVlc3RfaXJxKHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yLCBoYW5kbGVyLCBJUlFGX1NIQVJFRCwKIAkJCSAgc2NzaWhvc3QtPmhvc3R0LT5uYW1lLCB2aXJ0aGJhaW5mbyk7CiAJaWYgKHJzcCAhPSAwKSB7Ci0JCUxPR0VSUigicmVxdWVzdF9pcnEoJWQpIHVpc2xpYl92aXJ0aGJhX0lTUiByZXF1ZXN0IGZhaWxlZCB3aXRoIHJzcD0lZFxuIiwKLQkJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yLCByc3ApOwogCQl2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciA9IC0xOwogCQlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfUFJPQkVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAl9IGVsc2UgewotCQl1NjQgX19pb21lbSAqRmVhdHVyZXNfYWRkciA9CisJCXU2NCBfX2lvbWVtICpmZWF0dXJlc19hZGRyID0KIAkJICAgICZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mby0+Y2hhbi0+ZmVhdHVyZXM7Ci0JCUxPR0VSUigicmVxdWVzdF9pcnEoJWQpIHVpc2xpYl92aXJ0aGJhX0lTUiByZXF1ZXN0IHN1Y2NlZWRlZFxuIiwKLQkJICAgICAgIHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yKTsKIAkJbWFzayA9IH4oVUxUUkFfSU9fQ0hBTk5FTF9JU19QT0xMSU5HIHwKIAkJCSBVTFRSQV9JT19EUklWRVJfRElTQUJMRVNfSU5UUyk7Ci0JCXVpc3F1ZXVlX2ludGVybG9ja2VkX2FuZChGZWF0dXJlc19hZGRyLCBtYXNrKTsKKwkJdWlzcXVldWVfaW50ZXJsb2NrZWRfYW5kKGZlYXR1cmVzX2FkZHIsIG1hc2spOwogCQltYXNrID0gVUxUUkFfSU9fRFJJVkVSX0VOQUJMRVNfSU5UUzsKLQkJdWlzcXVldWVfaW50ZXJsb2NrZWRfb3IoRmVhdHVyZXNfYWRkciwgbWFzayk7CisJCXVpc3F1ZXVlX2ludGVybG9ja2VkX29yKGZlYXR1cmVzX2FkZHIsIG1hc2spOwogCQlyc2x0cV93YWl0X3VzZWNzID0gNDAwMDAwMDsKIAl9CiAKLQlEQkdJTkYoImNhbGxpbmcgc2NzaV9zY2FuX2hvc3QuXG4iKTsKIAlzY3NpX3NjYW5faG9zdChzY3NpaG9zdCk7Ci0JREJHSU5GKCJyZXR1cm4gZnJvbSBzY3NpX3NjYW5faG9zdC5cbiIpOwogCi0JTE9HSU5GKCJ2aXJ0aGJhIGFkZGVkIHNjc2lob3N0OjB4JXBcbiIsIHNjc2lob3N0KTsKIAlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfUFJPQkVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJcmV0dXJuIDA7CiB9CkBAIC02NTEsMjggKzU3OCwxOCBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lob3N0ID0KIAkgICAgKHN0cnVjdCBTY3NpX0hvc3QgKil2aXJ0cGNpZGV2LT5zY3NpLnNjc2lob3N0OwogCi0JTE9HSU5GKCJ2aXJ0cGNpZGV2IGJ1c19ubzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzX25vLAotCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2Vfbm8pOwogCXZpcnRoYmFpbmZvID0gKHN0cnVjdCB2aXJ0aGJhX2luZm8gKilzY3NpaG9zdC0+aG9zdGRhdGE7CiAJaWYgKHZpcnRoYmFpbmZvLT5pbnRlcnJ1cHRfdmVjdG9yICE9IC0xKQogCQlmcmVlX2lycSh2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3ZlY3RvciwgdmlydGhiYWluZm8pOwotCUxPR0lORigiUmVtb3ZpbmcgdmlydHBjaWRldjogMHglcCwgdmlydGhiYWluZm86IDB4JXBcbiIsIHZpcnRwY2lkZXYsCi0JICAgICAgIHZpcnRoYmFpbmZvKTsKIAotCURCR0lORigicmVtb3Zpbmcgc2NzaWhvc3Q6IDB4JXAsIHNjc2lob3N0LT50aGlzX2lkOiAlZFxuIiwgc2NzaWhvc3QsCi0JICAgICAgIHNjc2lob3N0LT50aGlzX2lkKTsKIAlzY3NpX3JlbW92ZV9ob3N0KHNjc2lob3N0KTsKIAotCURCR0lORigic3RvcHBpbmcgdGhyZWFkLlxuIik7CiAJdWlzdGhyZWFkX3N0b3AoJnZpcnRoYmFpbmZvLT5jaGluZm8udGhyZWFkaW5mbyk7CiAKLQlEQkdJTkYoImNhbGxpbmcgc2NzaV9ob3N0X3B1dFxuIik7Ci0KIAkvKiBkZWNyIHJlZmNvdW50IG9uIHNjc2lob3N0IHdoaWNoIHdhcyBpbmNyZW1lbnRlZCBieQogCSAqIHNjc2lfYWRkX2hvc3Qgc28gdGhlIHNjc2lfaG9zdCBnZXRzIGRlbGV0ZWQKIAkgKi8KIAlzY3NpX2hvc3RfcHV0KHNjc2lob3N0KTsKLQlMT0dJTkYoInZpcnRoYmEgcmVtb3ZlZCBzY3NpX2hvc3QuXG4iKTsKIH0KIAogc3RhdGljIGludApAQCAtNjg2LDE5ICs2MDMsMTIgQEAKIAlpbnQgbm90aWZ5cmVzdWx0ID0gMHhmZmZmOwogCXdhaXRfcXVldWVfaGVhZF90IG5vdGlmeWV2ZW50OwogCi0JTE9HSU5GKCJ2RGlza01nbXQ6JWQgJWQ6JWQ6JWRcbiIsIHZkaXNrY21kdHlwZSwKLQkgICAgICAgdmRlc3QtPmNoYW5uZWwsIHZkZXN0LT5pZCwgdmRlc3QtPmx1bik7Ci0KLQlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpIHsKLQkJREJHSU5GKCJTZXJ2ZXIgaXMgZG93bi9jaGFuZ2luZyBzdGF0ZS4gUmV0dXJuaW5nIEZhaWx1cmUuXG4iKTsKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpCiAJCXJldHVybiBGQUlMRUQ7Ci0JfQogCiAJY21kcnNwID0ga3phbGxvYyhTSVpFT0ZfQ01EUlNQLCBHRlBfQVRPTUlDKTsKLQlpZiAoY21kcnNwID09IE5VTEwpIHsKLQkJTE9HRVJSKCJrbWFsbG9jIG9mIGNtZHJzcCBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIEZBSUxFRDsJLyogcmVqZWN0ICovCi0JfQorCWlmICghY21kcnNwKQorCQlyZXR1cm4gRkFJTEVEOyAgLyogcmVqZWN0ICovCiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZub3RpZnlldmVudCk7CiAKQEAgLTcyNywxMCArNjM3LDcgQEAKIAkJCQkJICAgICAmdmlydGhiYWluZm8tPmNoaW5mby5pbnNlcnRsb2NrLAogCQkJCQkgICAgIERPTlRfSVNTVUVfSU5URVJSVVBULCAodTY0KU5VTEwsCiAJCQkJCSAgICAgT0tfVE9fV0FJVCwgInZoYmEiKTsKLQlMT0dJTkYoIlZkaXNrTWdtdCB3YWl0aW5nIG9uIGV2ZW50IG5vdGlmeWV2ZW50PTB4JXBcbiIsCi0JICAgICAgIGNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeSk7CiAJd2FpdF9ldmVudChub3RpZnlldmVudCwgbm90aWZ5cmVzdWx0ICE9IDB4ZmZmZik7Ci0JTE9HSU5GKCJWZGlza01nbXQgY29tcGxldGU7IHJlc3VsdDolZFxuIiwgY21kcnNwLT52ZGlza21nbXQucmVzdWx0KTsKIAlrZnJlZShjbWRyc3ApOwogCXJldHVybiBTVUNDRVNTOwogfQpAQCAtNzQ5LDE5ICs2NTYsMTIgQEAKIAlpbnQgbm90aWZ5cmVzdWx0ID0gMHhmZmZmOwogCXdhaXRfcXVldWVfaGVhZF90IG5vdGlmeWV2ZW50OwogCi0JTE9HSU5GKCJUYXNrTWdtdDolZCAlZDolZDolbGx1XG4iLCB0YXNrdHlwZSwKLQkgICAgICAgc2NzaWRldi0+Y2hhbm5lbCwgc2NzaWRldi0+aWQsIHNjc2lkZXYtPmx1bik7Ci0KLQlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpIHsKLQkJREJHSU5GKCJTZXJ2ZXIgaXMgZG93bi9jaGFuZ2luZyBzdGF0ZS4gUmV0dXJuaW5nIEZhaWx1cmUuXG4iKTsKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpCiAJCXJldHVybiBGQUlMRUQ7Ci0JfQogCiAJY21kcnNwID0ga3phbGxvYyhTSVpFT0ZfQ01EUlNQLCBHRlBfQVRPTUlDKTsKLQlpZiAoY21kcnNwID09IE5VTEwpIHsKLQkJTE9HRVJSKCJrbWFsbG9jIG9mIGNtZHJzcCBmYWlsZWQuXG4iKTsKKwlpZiAoIWNtZHJzcCkKIAkJcmV0dXJuIEZBSUxFRDsJLyogcmVqZWN0ICovCi0JfQogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmbm90aWZ5ZXZlbnQpOwogCkBAIC03ODksMTAgKzY4OSw3IEBACiAJCQkJCSAgICAgJnZpcnRoYmFpbmZvLT5jaGluZm8uaW5zZXJ0bG9jaywKIAkJCQkJICAgICBET05UX0lTU1VFX0lOVEVSUlVQVCwgKHU2NClOVUxMLAogCQkJCQkgICAgIE9LX1RPX1dBSVQsICJ2aGJhIik7Ci0JTE9HSU5GKCJUYXNrTWdtdCB3YWl0aW5nIG9uIGV2ZW50IG5vdGlmeWV2ZW50PTB4JXBcbiIsCi0JICAgICAgIGNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeSk7CiAJd2FpdF9ldmVudChub3RpZnlldmVudCwgbm90aWZ5cmVzdWx0ICE9IDB4ZmZmZik7Ci0JTE9HSU5GKCJUYXNrTWdtdCBjb21wbGV0ZTsgcmVzdWx0OiVkXG4iLCBjbWRyc3AtPnNjc2l0YXNrbWdtdC5yZXN1bHQpOwogCWtmcmVlKGNtZHJzcCk7CiAJcmV0dXJuIFNVQ0NFU1M7CiB9CkBAIC04ODIsNyArNzc5LDYgQEAKIHZpcnRoYmFfaG9zdF9yZXNldF9oYW5kbGVyKHN0cnVjdCBzY3NpX2NtbmQgKnNjc2ljbWQpCiB7CiAJLyogaXNzdWUgVEFTS19NR01UX1RBUkdFVF9SRVNFVCBmb3IgZWFjaCB0YXJnZXQgb24gZWFjaCBidXMgZm9yIGhvc3QgKi8KLQlMT0dFUlIoInZpcnRoYmFfaG9zdF9yZXNldF9oYW5kbGVyIE5vdCB5ZXQgaW1wbGVtZW50ZWRcbiIpOwogCXJldHVybiBTVUNDRVNTOwogfQogCkBAIC04OTksNyArNzk1LDYgQEAKIHN0YXRpYyBpbnQKIHZpcnRoYmFfaW9jdGwoc3RydWN0IHNjc2lfZGV2aWNlICpkZXYsIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCiB7Ci0JREJHSU5GKCJJbiB2aXJ0aGJhX2lvY3RsOiBpb2N0bDogY21kPTB4JXhcbiIsIGNtZCk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTkyMywxNiArODE4LDExIEBACiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wgPSBOVUxMOwogCWludCBzZ19mYWlsZWQgPSAwOwogCi0JaWYgKHZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duIHx8IHZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7Ci0JCURCR0lORigiU2VydmVyIGlzIGRvd24vY2hhbmdpbmcgc3RhdGUuIFJldHVybmluZyBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1kuXG4iKTsKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmRvd24gfHwgdmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpCiAJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7Ci0JfQotCiAJY21kcnNwID0ga3phbGxvYyhTSVpFT0ZfQ01EUlNQLCBHRlBfQVRPTUlDKTsKLQlpZiAoY21kcnNwID09IE5VTEwpIHsKLQkJTE9HRVJSKCJrbWFsbG9jIG9mIGNtZHJzcCBmYWlsZWQuXG4iKTsKKwlpZiAoIWNtZHJzcCkKIAkJcmV0dXJuIDE7CS8qIHJlamVjdCB0aGUgY29tbWFuZCAqLwotCX0KIAogCS8qIG5vdyBzYXZpbmcgZXZlcnl0aGluZyB3ZSBuZWVkIGZyb20gc2NzaV9jbWQgaW50byBjbWRyc3AKIAkgKiBiZWZvcmUgd2UgcXVldWUgY21kcnNwIHNldCB0eXBlIHRvIGNvbW1hbmQgLSBhcyBvcHBvc2VkIHRvCkBAIC05NDcsNyArODM3LDYgQEAKIAlpZiAoaW5zZXJ0X2xvY2F0aW9uICE9IC0xKSB7CiAJCWNtZHJzcC0+c2NzaS5zY3NpY21kID0gKHZvaWQgKikodWludHB0cl90KWluc2VydF9sb2NhdGlvbjsKIAl9IGVsc2UgewotCQlMT0dFUlIoIlF1ZXVlIGlzIGZ1bGwuIFJldHVybmluZyBidXN5LlxuIik7CiAJCWtmcmVlKGNtZHJzcCk7CiAJCXJldHVybiBTQ1NJX01MUVVFVUVfREVWSUNFX0JVU1k7CiAJfQpAQCAtOTY4LDggKzg1Nyw2IEBACiAJCW1heF9idWZmX2xlbiA9IGNtZHJzcC0+c2NzaS5idWZmbGVuOwogCiAJaWYgKHNjc2lfc2dfY291bnQoc2NzaWNtZCkgPiBNQVhfUEhZU19JTkZPKSB7Ci0JCUxPR0VSUigic2NzaWNtZCB1c2Vfc2c6JWQgZ3JlYXRlciB0aGFuIE1BWDolZFxuIiwKLQkJICAgICAgIHNjc2lfc2dfY291bnQoc2NzaWNtZCksIE1BWF9QSFlTX0lORk8pOwogCQlkZWxfc2NzaXBlbmRpbmdfZW50cnkodmlydGhiYWluZm8sICh1aW50cHRyX3QpaW5zZXJ0X2xvY2F0aW9uKTsKIAkJa2ZyZWUoY21kcnNwKTsKIAkJcmV0dXJuIDE7CS8qIHJlamVjdCB0aGUgY29tbWFuZCAqLwpAQCAtOTgyLDExICs4NjksOCBAQAogCS8qIGNvbnZlcnQgYnVmZmVyIHRvIHBoeXMgaW5mb3JtYXRpb24gKi8KIAlpZiAoc2NzaV9zZ19jb3VudChzY3NpY21kKSA9PSAwKSB7CiAJCWlmIChzY3NpX2J1ZmZsZW4oc2NzaWNtZCkgPiAwKSB7Ci0JCQlMT0dFUlIoIioqKiogRkFJTEVEIE5vIHNjYXR0ZXIgbGlzdCBmb3IgYnVmZmxlbiA+IDBcbiIpOwogCQkJQlVHX09OKHNjc2lfc2dfY291bnQoc2NzaWNtZCkgPT0gMCk7CiAJCX0KLQkJREJHSU5GKCJObyBzZzsgYnVmZmVyOjB4JXAgYnVmZmxlbjolZFxuIiwKLQkJICAgICAgIHNjc2lfc2dsaXN0KHNjc2ljbWQpLCBzY3NpX2J1ZmZsZW4oc2NzaWNtZCkpOwogCX0gZWxzZSB7CiAJCS8qIGJ1ZmZlciBpcyBzY2F0dGVybGlzdCAtIGNvcHkgaXQgb3V0ICovCiAJCXNnbCA9IHNjc2lfc2dsaXN0KHNjc2ljbWQpOwpAQCAtOTk0LDIxICs4NzgsOSBAQAogCQlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBzY3NpX3NnX2NvdW50KHNjc2ljbWQpLCBpKSB7CiAJCQljbWRyc3AtPnNjc2kuZ3BpX2xpc3RbaV0uYWRkcmVzcyA9IHNnX3BoeXMoc2cpOwogCQkJY21kcnNwLT5zY3NpLmdwaV9saXN0W2ldLmxlbmd0aCA9IHNnLT5sZW5ndGg7Ci0JCQlpZiAoKGkgIT0gMCkgJiYgKHNnLT5vZmZzZXQgIT0gMCkpCi0JCQkJTE9HSU5GKCJPZmZzZXQgb24gYSBzZ19lbnRyeSBvdGhlciB0aGFuIHplcm8gPTw8JWQ+Pi5cbiIsCi0JCQkJICAgICAgIHNnLT5vZmZzZXQpOwogCQl9CiAKIAkJaWYgKHNnX2ZhaWxlZCkgewotCQkJTE9HRVJSKCJTdGFydCBzZ19saXN0IGR1bXAgKGVudHJpZXMgJWQsIGJ1ZmZsZW4gJWQpLi4uXG4iLAotCQkJICAgICAgIHNjc2lfc2dfY291bnQoc2NzaWNtZCksIGNtZHJzcC0+c2NzaS5idWZmbGVuKTsKLQkJCWZvcl9lYWNoX3NnKHNnbCwgc2csIHNjc2lfc2dfY291bnQoc2NzaWNtZCksIGkpIHsKLQkJCQlMT0dFUlIoIiAgIEVudHJ5KCVkKTogcGFnZS0+WzB4JXBdLCBwaHlzLT5bMHglTHhdLCBvZmYoJWQpLCBsZW4oJWQpXG4iLAotCQkJCSAgICAgICBpLCBzZ19wYWdlKHNnKSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzZ19waHlzKHNnKSwKLQkJCQkgICAgICAgc2ctPm9mZnNldCwgc2ctPmxlbmd0aCk7Ci0JCQl9Ci0JCQlMT0dFUlIoIkRvbmUgc2dfbGlzdCBkdW1wLlxuIik7CiAJCQkvKiBCVUcoKTsgKioqKiogRm9yIG5vdywgbGV0IGl0IGZhaWwgaW4gdWlzc2QKIAkJCSAqIGlmIGl0IGlzIGEgcHJvYmxlbSwgYXMgaXQgbWlnaHQganVzdAogCQkJICogd29yawpAQCAtMTAyNyw3ICs4OTksNiBAQAogCQkJCQkJICh1NjQpTlVMTCwgRE9OVF9XQUlULCAidmhiYSIpOwogCWlmIChpID09IDApIHsKIAkJLyogcXVldWUgbXVzdCBiZSBmdWxsIC0gYW5kIHdlIHNhaWQgZG9uJ3Qgd2FpdCAtIHJldHVybiBidXN5ICovCi0JCUxPR0VSUigidWlzcXVldWVfcHV0X2NtZHJzcF93aXRoX2xvY2sgKioqKkZBSUxFRFxuIik7CiAJCWtmcmVlKGNtZHJzcCk7CiAJCWRlbF9zY3NpcGVuZGluZ19lbnRyeSh2aXJ0aGJhaW5mbywgKHVpbnRwdHJfdClpbnNlcnRfbG9jYXRpb24pOwogCQlyZXR1cm4gU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOwpAQCAtMTA1MiwxMCArOTIzLDkgQEAKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzY3NpaG9zdCA9IChzdHJ1Y3QgU2NzaV9Ib3N0ICopc2NzaWRldi0+aG9zdDsKIAogCXZpcnRoYmFpbmZvID0gKHN0cnVjdCB2aXJ0aGJhX2luZm8gKilzY3NpaG9zdC0+aG9zdGRhdGE7Ci0JaWYgKCF2aXJ0aGJhaW5mbykgewotCQlMT0dFUlIoIkNvdWxkIG5vdCBmaW5kIHZpcnRoYmFfaW5mbyBmb3Igc2NzaWhvc3RcbiIpOworCWlmICghdmlydGhiYWluZm8pCiAJCXJldHVybiAwOwkvKiBldmVuIHRob3VnaCB3ZSBlcnJvcmVkLCB0cmVhdCBhcyBzdWNjZXNzICovCi0JfQorCiAJZm9yICh2ZGlzayA9ICZ2aXJ0aGJhaW5mby0+aGVhZDsgdmRpc2stPm5leHQ7IHZkaXNrID0gdmRpc2stPm5leHQpIHsKIAkJaWYgKHZkaXNrLT5uZXh0LT52YWxpZCAmJgogCQkgICAgKHZkaXNrLT5uZXh0LT5jaGFubmVsID09IHNjc2lkZXYtPmNoYW5uZWwpICYmCkBAIC0xMDY0LDEwICs5MzQsOCBAQAogCQkJcmV0dXJuIDA7CiAJfQogCXRtcHZkaXNrID0ga3phbGxvYyhzaXplb2YoKnRtcHZkaXNrKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0bXB2ZGlzaykgewkvKiBlcnJvciBhbGxvY2F0aW5nICovCi0JCUxPR0VSUigiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGlza1xuIik7CisJaWYgKCF0bXB2ZGlzaykKIAkJcmV0dXJuIDA7Ci0JfQogCiAJdG1wdmRpc2stPmNoYW5uZWwgPSBzY3NpZGV2LT5jaGFubmVsOwogCXRtcHZkaXNrLT5pZCA9IHNjc2lkZXYtPmlkOwpAQCAtMTA5NCw4ICs5NjIsNiBAQAogCXN0cnVjdCBTY3NpX0hvc3QgKnNjc2lob3N0ID0gKHN0cnVjdCBTY3NpX0hvc3QgKilzY3NpZGV2LT5ob3N0OwogCiAJdmlydGhiYWluZm8gPSAoc3RydWN0IHZpcnRoYmFfaW5mbyAqKXNjc2lob3N0LT5ob3N0ZGF0YTsKLQlpZiAoIXZpcnRoYmFpbmZvKQotCQlMT0dFUlIoIkNvdWxkIG5vdCBmaW5kIHZpcnRoYmFfaW5mbyBmb3Igc2NzaWhvc3RcbiIpOwogCWZvciAodmRpc2sgPSAmdmlydGhiYWluZm8tPmhlYWQ7IHZkaXNrLT5uZXh0OyB2ZGlzayA9IHZkaXNrLT5uZXh0KSB7CiAJCWlmICh2ZGlzay0+bmV4dC0+dmFsaWQgJiYKIAkJICAgICh2ZGlzay0+bmV4dC0+Y2hhbm5lbCA9PSBzY3NpZGV2LT5jaGFubmVsKSAmJgpAQCAtMTE0MCwxOSArMTAwNiw2IEBACiAKIAkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+ZXJyb3JfY291bnQpIDwgVklSVEhCQV9FUlJPUl9DT1VOVCkgewogCQkJYXRvbWljX2luYygmdmRpc2stPmVycm9yX2NvdW50KTsKLQkJCUxPR0VSUigiU0NTSUNNRCAqKioqRkFJTEVEIHNjc2ljbWQ6MHglcCBvcDoweCV4IDwlZDolZDolZDolbGx1PiAweCV4LTB4JXgtMHgleC0weCV4LTB4JXguXG4iLAotCQkJICAgICAgIHNjc2ljbWQsIGNtZHJzcC0+c2NzaS5jbW5kWzBdLAotCQkJICAgICAgIHNjc2lkZXYtPmhvc3QtPmhvc3Rfbm8sIHNjc2lkZXYtPmlkLAotCQkJICAgICAgIHNjc2lkZXYtPmNoYW5uZWwsIHNjc2lkZXYtPmx1biwKLQkJCSAgICAgICBjbWRyc3AtPnNjc2kubGludXhzdGF0LCBzZC0+dmFsaWQsIHNkLT5zZW5zZV9rZXksCi0JCQkgICAgICAgc2QtPmFkZGl0aW9uYWxfc2Vuc2VfY29kZSwKLQkJCSAgICAgICBzZC0+YWRkaXRpb25hbF9zZW5zZV9jb2RlX3F1YWxpZmllcik7Ci0JCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5lcnJvcl9jb3VudCkgPT0KLQkJCSAgICBWSVJUSEJBX0VSUk9SX0NPVU5UKSB7Ci0JCQkJTE9HRVJSKCJUaHJvdGxpbmcgU0NTSUNNRCBlcnJvcnMgZGlzayA8JWQ6JWQ6JWQ6JWxsdT5cbiIsCi0JCQkJICAgICAgIHNjc2lkZXYtPmhvc3QtPmhvc3Rfbm8sIHNjc2lkZXYtPmlkLAotCQkJCSAgICAgICBzY3NpZGV2LT5jaGFubmVsLCBzY3NpZGV2LT5sdW4pOwotCQkJfQogCQkJYXRvbWljX3NldCgmdmRpc2stPmlvc190aHJlc2hvbGQsIElPU19FUlJPUl9USFJFU0hPTEQpOwogCQl9CiAJfQpAQCAtMTE4OCw3ICsxMDQxLDYgQEAKIAogCQlpZiAoc2NzaV9zZ19jb3VudChzY3NpY21kKSA9PSAwKSB7CiAJCQlpZiAoc2NzaV9idWZmbGVuKHNjc2ljbWQpID4gMCkgewotCQkJCUxPR0VSUigiKioqKiBGQUlMRUQgTm8gc2NhdHRlciBsaXN0IGZvciBidWZmbGVuID4gMFxuIik7CiAJCQkJQlVHX09OKHNjc2lfc2dfY291bnQoc2NzaWNtZCkgPT0KIAkJCQkgICAgICAgMCk7CiAJCQl9CkBAIC0xMTk5LDggKzEwNTEsNiBAQAogCiAJCXNnID0gc2NzaV9zZ2xpc3Qoc2NzaWNtZCk7CiAJCWZvciAoaSA9IDA7IGkgPCBzY3NpX3NnX2NvdW50KHNjc2ljbWQpOyBpKyspIHsKLQkJCURCR1ZFUigiY29weWluZyBPVVQgT0YgYnVmIGludG8gMHglcCAlZFxuIiwKLQkJCSAgICAgICBzZ19wYWdlKHNnICsgaSksIHNnW2ldLmxlbmd0aCk7CiAJCQl0aGlzcGFnZV9vcmlnID0ga21hcF9hdG9taWMoc2dfcGFnZShzZyArIGkpKTsKIAkJCXRoaXNwYWdlID0gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpdGhpc3BhZ2Vfb3JpZyB8CiAJCQkJCSAgICAgc2dbaV0ub2Zmc2V0KTsKQEAgLTEyMTksNyArMTA2OSw2IEBACiAJCQlpZiAoYXRvbWljX3JlYWQoJnZkaXNrLT5pb3NfdGhyZXNob2xkKSA+IDApIHsKIAkJCQlhdG9taWNfZGVjKCZ2ZGlzay0+aW9zX3RocmVzaG9sZCk7CiAJCQkJaWYgKGF0b21pY19yZWFkKCZ2ZGlzay0+aW9zX3RocmVzaG9sZCkgPT0gMCkgewotCQkJCQlMT0dFUlIoIlJlc2V0dGluZyBlcnJvciBjb3VudCBmb3IgZGlza1xuIik7CiAJCQkJCWF0b21pY19zZXQoJnZkaXNrLT5lcnJvcl9jb3VudCwgMCk7CiAJCQkJfQogCQkJfQpAQCAtMTIzMCw4ICsxMDc5LDYgQEAKIHN0YXRpYyB2b2lkCiBjb21wbGV0ZV9zY3NpX2NvbW1hbmQoc3RydWN0IHVpc2NtZHJzcCAqY21kcnNwLCBzdHJ1Y3Qgc2NzaV9jbW5kICpzY3NpY21kKQogewotCURCR0lORigiY21kcnNwOiAweCVwLCBzY3Npc3RhdDoweCV4LlxuIiwgY21kcnNwLCBjbWRyc3AtPnNjc2kuc2NzaXN0YXQpOwotCiAJLyogdGFrZSB3aGF0IHdlIG5lZWQgb3V0IG9mIGNtZHJzcCBhbmQgY29tcGxldGUgdGhlIHNjc2ljbWQgKi8KIAlzY3NpY21kLT5yZXN1bHQgPSBjbWRyc3AtPnNjc2kubGludXhzdGF0OwogCWlmIChjbWRyc3AtPnNjc2kubGludXhzdGF0KQpAQCAtMTIzOSwxMCArMTA4Niw4IEBACiAJZWxzZQogCQlkb19zY3NpX25vbGludXhzdGF0KGNtZHJzcCwgc2NzaWNtZCk7CiAKLQlpZiAoc2NzaWNtZC0+c2NzaV9kb25lKSB7Ci0JCURCR1ZFUigiU2NzaV9ET05FXG4iKTsKKwlpZiAoc2NzaWNtZC0+c2NzaV9kb25lKQogCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7Ci0JfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQKQEAgLTEyNTIsNyArMTA5Nyw2IEBACiAJLyogd2FrZSB1cCB0aGUgZXJyb3IgaGFuZGxlciB0aGF0IGlzIHdhaXRpbmcgZm9yIHRoaXMgKi8KIAkqKGludCAqKWNtZHJzcC0+dmRpc2ttZ210Lm5vdGlmeXJlc3VsdCA9IGNtZHJzcC0+dmRpc2ttZ210LnJlc3VsdDsKIAl3YWtlX3VwX2FsbCgod2FpdF9xdWV1ZV9oZWFkX3QgKiljbWRyc3AtPnZkaXNrbWdtdC5ub3RpZnkpOwotCUxPR0lORigic2V0IG5vdGlmeSByZXN1bHQgdG8gJWRcbiIsIGNtZHJzcC0+dmRpc2ttZ210LnJlc3VsdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMTI2Myw3ICsxMTA3LDYgQEAKIAkqKGludCAqKWNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeXJlc3VsdCA9CiAJICAgIGNtZHJzcC0+c2NzaXRhc2ttZ210LnJlc3VsdDsKIAl3YWtlX3VwX2FsbCgod2FpdF9xdWV1ZV9oZWFkX3QgKiljbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnkpOwotCUxPR0lORigic2V0IG5vdGlmeSByZXN1bHQgdG8gJWRcbiIsIGNtZHJzcC0+c2NzaXRhc2ttZ210LnJlc3VsdCk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMzE5LDggKzExNjIsNyBAQAogCQkJCQkJICAgIGNtZHJzcC0+dmRpc2ttZ210LnNjc2ljbWQpKQogCQkJCWJyZWFrOwogCQkJY29tcGxldGVfdmRpc2ttZ210X2NvbW1hbmQoY21kcnNwKTsKLQkJfSBlbHNlCi0JCQlMT0dFUlIoIkludmFsaWQgY21kdHlwZSAlZFxuIiwgY21kcnNwLT5jbWR0eXBlKTsKKwkJfQogCQkvKiBjbWRyc3AgaXMgbm93IGF2YWlsYWJsZSBmb3IgcmV1c2UgKi8KIAl9CiB9CkBAIC0xMzQxLDEzICsxMTgzLDE0IEBACiAJVUlTX0RBRU1PTklaRSgidmhiYV9pbmNvbWluZyIpOwogCS8qIGFsbG9jIG9uY2UgYW5kIHJldXNlICovCiAJY21kcnNwID0ga21hbGxvYyhTWiwgR0ZQX0FUT01JQyk7Ci0JaWYgKGNtZHJzcCA9PSBOVUxMKSB7Ci0JCUxPR0VSUigicHJvY2Vzc19pbmNvbWluZ19yc3BzICoqKipGQUlMRUQgdG8gbWFsbG9jIC0gdGhyZWFkIGV4aXRpbmdcbiIpOworCWlmICghY21kcnNwKSB7CiAJCWNvbXBsZXRlX2FuZF9leGl0KCZkYy0+dGhyZWFkaW5mby5oYXNfc3RvcHBlZCwgMCk7CiAJCXJldHVybiAwOwogCX0KIAltYXNrID0gVUxUUkFfQ0hBTk5FTF9FTkFCTEVfSU5UUzsKIAl3aGlsZSAoMSkgeworCQlpZiAoa3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQkJYnJlYWs7CiAJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHZpcnRoYmFpbmZvLT5yc3BfcXVldWUsCiAJCQkgKGF0b21pY19yZWFkKCZ2aXJ0aGJhaW5mby0+aW50ZXJydXB0X3JjdmQpID09IDEpLAogCQkJCSAgICAgIHVzZWNzX3RvX2ppZmZpZXMocnNsdHFfd2FpdF91c2VjcykpOwpAQCAtMTM1NSwxMyArMTE5OCwxMCBAQAogCQkvKiBkcmFpbiBxdWV1ZSAqLwogCQlkcmFpbl9xdWV1ZSh2aXJ0aGJhaW5mbywgZGMsIGNtZHJzcCk7CiAJCXJjMSA9IHVpc3F1ZXVlX2ludGVybG9ja2VkX29yKHZpcnRoYmFpbmZvLT5mbGFnc19hZGRyLCBtYXNrKTsKLQkJaWYgKGRjLT50aHJlYWRpbmZvLnNob3VsZF9zdG9wKQotCQkJYnJlYWs7CiAJfQogCiAJa2ZyZWUoY21kcnNwKTsKIAotCURCR0lORigiZXhpdGluZyBwcm9jZXNzaW5nIGluY29taW5nIHJzcHMuXG4iKTsKIAljb21wbGV0ZV9hbmRfZXhpdCgmZGMtPnRocmVhZGluZm8uaGFzX3N0b3BwZWQsIDApOwogfQogCkBAIC0xMzg2LDcgKzEyMjYsNyBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWZvciAoaSA9IDA7IGkgPCBWSVJUSEJBU09QRU5NQVg7IGkrKykgewotCQlpZiAodmlydGhiYXNfb3BlbltpXS52aXJ0aGJhaW5mbyA9PSBOVUxMKQorCQlpZiAoIXZpcnRoYmFzX29wZW5baV0udmlydGhiYWluZm8pCiAJCQljb250aW51ZTsKIAogCQl2aXJ0aGJhaW5mbyA9IHZpcnRoYmFzX29wZW5baV0udmlydGhiYWluZm87CkBAIC0xNDM2LDIzICsxMjc2LDE3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJYnVmW2NvdW50XSA9ICdcMCc7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCkpIHsKLQkJTE9HRVJSKCJjb3B5X2Zyb21fdXNlciBmYWlsZWQuIGJ1Zjw8JS4qcz4+IGNvdW50PDwlbHU+PlxuIiwKLQkJICAgICAgIChpbnQpY291bnQsIGJ1ZiwgY291bnQpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIGJ1ZmZlciwgY291bnQpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl9CiAKIAlpID0ga3N0cnRvaW50KGJ1ZiwgMTAsICZuZXdfdmFsdWUpOwogCi0JaWYgKGkgIT0gMCkgewotCQlMT0dFUlIoIkZhaWxlZCB0byBzY2FuIHZhbHVlIGZvciBlbmFibGVfaW50cywgYnVmPDwlLipzPj4iLAotCQkgICAgICAgKGludCljb3VudCwgYnVmKTsKKwlpZiAoaSAhPSAwKQogCQlyZXR1cm4gLUVGQVVMVDsKLQl9CiAKIAkvKiBzZXQgYWxsIGNvdW50cyB0byBuZXdfdmFsdWUgdXN1YWxseSAwICovCiAJZm9yIChpID0gMDsgaSA8IFZJUlRIQkFTT1BFTk1BWDsgaSsrKSB7Ci0JCWlmICh2aXJ0aGJhc19vcGVuW2ldLnZpcnRoYmFpbmZvICE9IE5VTEwpIHsKKwkJaWYgKHZpcnRoYmFzX29wZW5baV0udmlydGhiYWluZm8pIHsKIAkJCXZpcnRoYmFpbmZvID0gdmlydGhiYXNfb3BlbltpXS52aXJ0aGJhaW5mbzsKIAkJCWZlYXR1cmVzX2FkZHIgPQogCQkJCSZ2aXJ0aGJhaW5mby0+Y2hpbmZvLnF1ZXVlaW5mby0+Y2hhbi0+ZmVhdHVyZXM7CkBAIC0xNDg0LDE3ICsxMzE4LDExIEBACiAJICAgIChzdHJ1Y3QgdmlydGhiYV9pbmZvICopKChzdHJ1Y3QgU2NzaV9Ib3N0ICopdmlydHBjaWRldi0+c2NzaS4KIAkJCQkgICAgIHNjc2lob3N0KS0+aG9zdGRhdGE7CiAKLQlEQkdJTkYoInZpcnRwY2lkZXYgYnVzX25vPDwlZD4+ZGV2Tm88PCVkPj4iLCB2aXJ0cGNpZGV2LT5idXNfbm8sCi0JICAgICAgIHZpcnRwY2lkZXYtPmRldmljZV9ubyk7Ci0KLQlpZiAoIXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duKSB7Ci0JCURCR0lORigiU2VydmVyIHVwIG1lc3NhZ2UgcmVjZWl2ZWQgd2hpbGUgc2VydmVyIGlzIGFscmVhZHkgdXAuXG4iKTsKKwlpZiAoIXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duKQogCQlyZXR1cm4gMTsKLQl9Ci0JaWYgKHZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7Ci0JCUxPR0VSUigiU2VydmVyIGFscmVhZHkgcHJvY2Vzc2luZyBjaGFuZ2Ugc3RhdGUgbWVzc2FnZVxuIik7CisKKwlpZiAodmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpCiAJCXJldHVybiAwOwotCX0KIAogCXZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlID0gdHJ1ZTsKIAkvKiBNdXN0IHRyYW5zaXRpb24gY2hhbm5lbCB0byBBVFRBQ0hFRCBzdGF0ZSBCRUZPUkUgd2UKQEAgLTE1MDgsNyArMTMzNiw2IEBACiAJaWYgKCF1aXN0aHJlYWRfc3RhcnQoJnZpcnRoYmFpbmZvLT5jaGluZm8udGhyZWFkaW5mbywKIAkJCSAgICAgcHJvY2Vzc19pbmNvbWluZ19yc3BzLAogCQkJICAgICB2aXJ0aGJhaW5mbywgInZoYmFfaW5jb21pbmciKSkgewotCQlMT0dFUlIoInVpc3RocmVhZF9zdGFydCByc3AgKioqKkZBSUxFRFxuIik7CiAJCXJldHVybiAwOwogCX0KIAl2aXJ0aGJhaW5mby0+c2VydmVyZG93biA9IGZhbHNlOwpAQCAtMTU0MywxOCArMTM3MCwxNiBAQAogCQlzd2l0Y2ggKHBlbmRpbmdkZWwtPmNtZHR5cGUpIHsKIAkJY2FzZSBDTURfU0NTSV9UWVBFOgogCQkJc2NzaWNtZCA9IChzdHJ1Y3Qgc2NzaV9jbW5kICopcGVuZGluZ2RlbC0+c2VudDsKLQkJCXNjc2ljbWQtPnJlc3VsdCA9IChESURfUkVTRVQgPDwgMTYpOworCQkJc2NzaWNtZC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OwogCQkJaWYgKHNjc2ljbWQtPnNjc2lfZG9uZSkKIAkJCQlzY3NpY21kLT5zY3NpX2RvbmUoc2NzaWNtZCk7CiAJCQlicmVhazsKIAkJY2FzZSBDTURfU0NTSVRBU0tNR01UX1RZUEU6CiAJCQljbWRyc3AgPSAoc3RydWN0IHVpc2NtZHJzcCAqKXBlbmRpbmdkZWwtPnNlbnQ7Ci0JCQlEQkdJTkYoImNtZHJzcD0weCV4LCBub3RpZnk9MHgleFxuIiwgY21kcnNwLAotCQkJICAgICAgIGNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeSk7Ci0JCQkqKGludCAqKWNtZHJzcC0+c2NzaXRhc2ttZ210Lm5vdGlmeXJlc3VsdCA9Ci0JCQkgICAgVEFTS19NR01UX0ZBSUxFRDsKIAkJCXdha2VfdXBfYWxsKCh3YWl0X3F1ZXVlX2hlYWRfdCAqKQogCQkJCSAgICBjbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnkpOworCQkJKihpbnQgKiljbWRyc3AtPnNjc2l0YXNrbWdtdC5ub3RpZnlyZXN1bHQgPQorCQkJCVRBU0tfTUdNVF9GQUlMRUQ7CiAJCQlicmVhazsKIAkJY2FzZSBDTURfVkRJU0tNR01UX1RZUEU6CiAJCQljbWRyc3AgPSAoc3RydWN0IHVpc2NtZHJzcCAqKXBlbmRpbmdkZWwtPnNlbnQ7CkBAIC0xNTY0LDkgKzEzODksNyBAQAogCQkJCSAgICBjbWRyc3AtPnZkaXNrbWdtdC5ub3RpZnkpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlpZiAocGVuZGluZ2RlbC0+c2VudCAhPSBOVUxMKQotCQkJCUxPR0VSUigiVW5rbm93biBjb21tYW5kIHR5cGU6IDB4JXguICBPbmx5IGZyZWVpbmcgbGlzdCBzdHJ1Y3R1cmUuXG4iLAotCQkJCSAgICAgcGVuZGluZ2RlbC0+Y21kdHlwZSk7CisJCQlicmVhazsKIAkJfQogCQlwZW5kaW5nZGVsLT5jbWR0eXBlID0gMDsKIAkJcGVuZGluZ2RlbC0+c2VudCA9IE5VTEw7CkBAIC0xNTc1LDggKzEzOTgsNiBAQAogCiAJdmlydHBjaWRldiA9IHZpcnRoYmFpbmZvLT52aXJ0cGNpZGV2OwogCi0JREJHSU5GKCJ2aXJ0cGNpZGV2IGJ1c19ubzw8JWQ+PmRldk5vPDwlZD4+IiwgdmlydHBjaWRldi0+YnVzX25vLAotCSAgICAgICB2aXJ0cGNpZGV2LT5kZXZpY2Vfbm8pOwogCXZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duID0gdHJ1ZTsKIAl2aXJ0aGJhaW5mby0+c2VydmVyY2hhbmdpbmdzdGF0ZSA9IGZhbHNlOwogCS8qIFJldHVybiB0aGUgU2VydmVyRG93biByZXNwb25zZSB0byBDb21tYW5kICovCkBAIC0xNTk0LDE5ICsxNDE1LDEyIEBACiAJICAgIChzdHJ1Y3QgdmlydGhiYV9pbmZvICopKChzdHJ1Y3QgU2NzaV9Ib3N0ICopdmlydHBjaWRldi0+c2NzaS4KIAkJCQkgICAgIHNjc2lob3N0KS0+aG9zdGRhdGE7CiAKLQlEQkdJTkYoInZpcnRoYmFfc2VydmVyZG93biIpOwotCURCR0lORigidmlydHBjaWRldiBidXNfbm88PCVkPj5kZXZObzw8JWQ+PiIsIHZpcnRwY2lkZXYtPmJ1c19ubywKLQkgICAgICAgdmlydHBjaWRldi0+ZGV2aWNlX25vKTsKLQogCWlmICghdmlydGhiYWluZm8tPnNlcnZlcmRvd24gJiYgIXZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlKSB7CiAJCXZpcnRoYmFpbmZvLT5zZXJ2ZXJjaGFuZ2luZ3N0YXRlID0gdHJ1ZTsKIAkJcXVldWVfd29yayh2aXJ0aGJhX3NlcnZlcmRvd25fd29ya3F1ZXVlLAogCQkJICAgJnZpcnRoYmFpbmZvLT5zZXJ2ZXJkb3duX2NvbXBsZXRpb24pOwogCX0gZWxzZSBpZiAodmlydGhiYWluZm8tPnNlcnZlcmNoYW5naW5nc3RhdGUpIHsKLQkJTE9HRVJSKCJTZXJ2ZXIgYWxyZWFkeSBwcm9jZXNzaW5nIGNoYW5nZSBzdGF0ZSBtZXNzYWdlXG4iKTsKIAkJc3RhdCA9IDA7Ci0JfSBlbHNlIHsKLQkJTE9HRVJSKCJTZXJ2ZXIgYWxyZWFkeSBkb3duLCBidXQgYW5vdGhlciBzZXJ2ZXIgZG93biBtZXNzYWdlIHJlY2VpdmVkLiIpOwogCX0KIAogCXJldHVybiBzdGF0OwpAQCAtMTYxOSw3ICsxNDMzLDYgQEAKIHN0YXRpYyBpbnQgX19pbml0CiB2aXJ0aGJhX3BhcnNlX2xpbmUoY2hhciAqc3RyKQogewotCURCR0lORigiSW4gdmlydGhiYV9wYXJzZV9saW5lICVzXG4iLCBzdHIpOwogCXJldHVybiAxOwogfQogCkBAIC0xNjI5LDE0ICsxNDQyLDEzIEBACiAJY2hhciAqbmV4dCA9IGxpbmU7CiAKIAlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKLQlpZiAobGluZSA9PSBOVUxMIHx8ICEqbGluZSkKKwlpZiAoIWxpbmUgfHwgISpsaW5lKQogCQlyZXR1cm47Ci0Jd2hpbGUgKChsaW5lID0gbmV4dCkgIT0gTlVMTCkgeworCXdoaWxlICgobGluZSA9IG5leHQpKSB7CiAJCW5leHQgPSBzdHJjaHIobGluZSwgJyAnKTsKLQkJaWYgKG5leHQgIT0gTlVMTCkKKwkJaWYgKG5leHQpCiAJCQkqbmV4dCsrID0gMDsKLQkJaWYgKCF2aXJ0aGJhX3BhcnNlX2xpbmUobGluZSkpCi0JCQlEQkdJTkYoIlVua25vd24gb3B0aW9uICclcydcbiIsIGxpbmUpOworCQl2aXJ0aGJhX3BhcnNlX2xpbmUobGluZSk7CiAJfQogCiAJUE9TVENPREVfTElOVVhfMihWSEJBX0NSRUFURV9FWElUX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKQEAgLTE2NTEsMTQgKzE0NjMsMTEgQEAKIAlpZiAoIXVuaXN5c19zcGFyX3BsYXRmb3JtKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCUxPR0lORigiRW50ZXJpbmcgdmlydGhiYV9tb2RfaW5pdC4uLlxuIik7Ci0KIAlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKIAl2aXJ0aGJhX3BhcnNlX29wdGlvbnModmlydGhiYV9vcHRpb25zKTsKIAogCWVycm9yID0gdmlydHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnZpcnRoYmFfZHJpdmVyKTsKIAlpZiAoZXJyb3IgPCAwKSB7Ci0JCUxPR0VSUigicmVnaXN0ZXIgKioqKkZBSUxFRCAweCV4XG4iLCBlcnJvcik7CiAJCVBPU1RDT0RFX0xJTlVYXzMoVkhCQV9DUkVBVEVfRkFJTFVSRV9QQywgZXJyb3IsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJfSBlbHNlIHsKQEAgLTE2ODEsOCArMTQ5MCw3IEBACiAJCS8qIEluaXRpYWxpemUgdGhlIHNlcnZlcmRvd24gd29ya3F1ZXVlICovCiAJCXZpcnRoYmFfc2VydmVyZG93bl93b3JrcXVldWUgPQogCQkgICAgY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInZpcnRoYmFfc2VydmVyZG93biIpOwotCQlpZiAodmlydGhiYV9zZXJ2ZXJkb3duX3dvcmtxdWV1ZSA9PSBOVUxMKSB7Ci0JCQlMT0dFUlIoIioqKiogRkFJTEVEIHZpcnRoYmFfc2VydmVyZG93bl93b3JrcXVldWUgY3JlYXRpb25cbiIpOworCQlpZiAoIXZpcnRoYmFfc2VydmVyZG93bl93b3JrcXVldWUpIHsKIAkJCVBPU1RDT0RFX0xJTlVYXzIoVkhCQV9DUkVBVEVfRkFJTFVSRV9QQywKIAkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQllcnJvciA9IC0xOwpAQCAtMTY5MCw3ICsxNDk4LDYgQEAKIAl9CiAKIAlQT1NUQ09ERV9MSU5VWF8yKFZIQkFfQ1JFQVRFX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwotCUxPR0lORigiTGVhdmluZyB2aXJ0aGJhX21vZF9pbml0XG4iKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTE3NDAsOCArMTU0Nyw2IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQKIHZpcnRoYmFfbW9kX2V4aXQodm9pZCkKIHsKLQlMT0dJTkYoImVudGVyaW5nIHZpcnRoYmFfbW9kX2V4aXQuLi5cbiIpOwotCiAJdmlydHBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdmlydGhiYV9kcml2ZXIpOwogCS8qIHVucmVnaXN0ZXIgaXMgZ29pbmcgdG8gY2FsbCB2aXJ0aGJhX3JlbW92ZSAqLwogCS8qIGRlc3Ryb3kgc2VydmVyZG93biBjb21wbGV0aW9uIHdvcmtxdWV1ZSAqLwpAQCAtMTc1MSw3ICsxNTU2LDYgQEAKIAl9CiAKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUodmlydGhiYV9kZWJ1Z2ZzX2Rpcik7Ci0JTE9HSU5GKCJMZWF2aW5nIHZpcnRoYmFfbW9kX2V4aXRcbiIpOwogfQogCiAvKiBzcGVjaWZ5IGZ1bmN0aW9uIHRvIGJlIHJ1biBhdCBtb2R1bGUgaW5zZXJ0aW9uIHRpbWUgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL0tjb25maWcKaW5kZXggZTU5ZWZjYi4uNmQxOTQ4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL0tjb25maWcKQEAgLTQsNyArNCw3IEBACiAKIGNvbmZpZyBVTklTWVNfVklSVFBDSQogCXRyaXN0YXRlICJVbmlzeXMgdmlydHBjaSBkcml2ZXIiCi0JZGVwZW5kcyBvbiBVTklTWVNTUEFSICYmIFVOSVNZU19VSVNMSUIKKwlzZWxlY3QgVU5JU1lTX1VJU0xJQgogCS0tLWhlbHAtLS0KIAlJZiB5b3Ugc2F5IFkgaGVyZSwgeW91IHdpbGwgZW5hYmxlIHRoZSBVbmlzeXMgdmlydHBjaSBkcml2ZXIuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS92aXJ0cGNpLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3ZpcnRwY2kvdmlydHBjaS5jCmluZGV4IDhmZGZkNmYuLmQ1YWQwMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlydHBjaS92aXJ0cGNpLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXJ0cGNpL3ZpcnRwY2kuYwpAQCAtMjEsNyArMjEsNiBAQAogI2lmZGVmIENPTkZJR19NT0RWRVJTSU9OUwogI2luY2x1ZGUgPGNvbmZpZy9tb2R2ZXJzaW9ucy5oPgogI2VuZGlmCi0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgImRpYWdub3N0aWNzL2FwcG9zX3N1YnN5c3RlbXMuaCIKICNpbmNsdWRlICJ1aXN1dGlscy5oIgogI2luY2x1ZGUgInZidXNjaGFubmVsLmgiCkBAIC0xODcsMTMgKzE4NiwxMSBAQAogewogCWludCBvZmY7CiAKLQlpZiAoIWNoYW4pIHsKLQkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHByZXNlbnQiKTsKKwlpZiAoIWNoYW4pCiAJCXJldHVybiAtMTsKLQl9CisKIAlvZmYgPSBzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSArIGNoYW4tPmhkcl9pbmZvLmNocF9pbmZvX29mZnNldDsKIAlpZiAoY2hhbi0+aGRyX2luZm8uY2hwX2luZm9fb2Zmc2V0ID09IDApIHsKLQkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHVzZWQsIGJlY2F1c2UgY2hwX2luZm9fb2Zmc2V0ID09IDAiKTsKIAkJcmV0dXJuIC0xOwogCX0KIAltZW1jcHkoKCh1OCAqKShjaGFuKSkgKyBvZmYsIGluZm8sIHNpemVvZigqaW5mbykpOwpAQCAtMjA2LDE1ICsyMDMsMTIgQEAKIHsKIAlpbnQgb2ZmOwogCi0JaWYgKCFjaGFuKSB7Ci0JCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCBwcmVzZW50Iik7CisJaWYgKCFjaGFuKQogCQlyZXR1cm4gLTE7Ci0JfQorCiAJb2ZmID0gc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikgKyBjaGFuLT5oZHJfaW5mby5idXNfaW5mb19vZmZzZXQ7Ci0JaWYgKGNoYW4tPmhkcl9pbmZvLmJ1c19pbmZvX29mZnNldCA9PSAwKSB7Ci0JCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCB1c2VkLCBiZWNhdXNlIGJ1c19pbmZvX29mZnNldCA9PSAwIik7CisJaWYgKGNoYW4tPmhkcl9pbmZvLmJ1c19pbmZvX29mZnNldCA9PSAwKQogCQlyZXR1cm4gLTE7Ci0JfQogCW1lbWNweSgoKHU4ICopKGNoYW4pKSArIG9mZiwgaW5mbywgc2l6ZW9mKCppbmZvKSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjgsMTggKzIyMiwxNiBAQAogewogCWludCBvZmY7CiAKLQlpZiAoIWNoYW4pIHsKLQkJTE9HRVJSKCJ2YnVzIGNoYW5uZWwgbm90IHByZXNlbnQiKTsKKwlpZiAoIWNoYW4pCiAJCXJldHVybiAtMTsKLQl9CisKIAlvZmYgPQogCSAgICAoc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikgKwogCSAgICAgY2hhbi0+aGRyX2luZm8uZGV2X2luZm9fb2Zmc2V0KSArCiAJICAgIChjaGFuLT5oZHJfaW5mby5kZXZpY2VfaW5mb19zdHJ1Y3RfYnl0ZXMgKiBkZXZpeCk7Ci0JaWYgKGNoYW4tPmhkcl9pbmZvLmRldl9pbmZvX29mZnNldCA9PSAwKSB7Ci0JCUxPR0VSUigidmJ1cyBjaGFubmVsIG5vdCB1c2VkLCBiZWNhdXNlIGRldl9pbmZvX29mZnNldCA9PSAwIik7CisJaWYgKGNoYW4tPmhkcl9pbmZvLmRldl9pbmZvX29mZnNldCA9PSAwKQogCQlyZXR1cm4gLTE7Ci0JfQorCiAJbWVtY3B5KCgodTggKikoY2hhbikpICsgb2ZmLCBpbmZvLCBzaXplb2YoKmluZm8pKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTI3MSw3ICsyNjMsNiBAQAogCSAqLwogCXJldCA9IGRldmljZV9yZWdpc3Rlcih2YnVzKTsKIAlpZiAocmV0KSB7Ci0JCUxPR0VSUigiZGV2aWNlX3JlZ2lzdGVyIEZBSUxFRDolZFxuIiwgcmV0KTsKIAkJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9GQUlMVVJFX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yNzksOCArMjcwLDYgQEAKIAkJCSAgICAmY2hpcHNldF9kcml2ZXJfaW5mbyk7CiAJd3JpdGVfdmJ1c19idXNfaW5mbyh2YnVzLT5wbGF0Zm9ybV9kYXRhIC8qIGNoYW5wdHIgKi8sCiAJCQkgICAgJmJ1c19kcml2ZXJfaW5mbyk7Ci0JTE9HSU5GKCJBZGRlZCB2YnVzICVkOyBkZXZpY2UgJXMgY3JlYXRlZCBzdWNjZXNzZnVsbHlcbiIsCi0JICAgICAgIGFkZHBhcmFtcy0+YnVzX25vLCBCVVNfSUQodmJ1cykpOwogCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJcmV0dXJuIDE7CiB9CkBAIC0zMTIsNyArMzAxLDYgQEAKIAlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKIAlpZiAoIVdBSVRfRk9SX0lPX0NIQU5ORUwKIAkgICAgKChzdHJ1Y3Qgc3Bhcl9pb19jaGFubmVsX3Byb3RvY29sIF9faW9tZW0gKilhZGRwYXJhbXMtPmNoYW5wdHIpKSB7Ci0JCUxPR0VSUigiVGltZWQgb3V0LiAgQ2hhbm5lbCBub3QgcmVhZHlcbiIpOwogCQlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiAwOwogCX0KQEAgLTMyMywxOSArMzExLDExIEBACiAJc3ByaW50ZihidXNpZCwgInZidXMlZCIsIGFkZHBhcmFtcy0+YnVzX25vKTsKIAl2YnVzID0gYnVzX2ZpbmRfZGV2aWNlKCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLAogCQkJICAgICAgICh2b2lkICopYnVzaWQsIG1hdGNoX2J1c2lkKTsKLQlpZiAoIXZidXMpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZidXMgJXNcbiIsIGJ1c2lkKTsKKwlpZiAoIXZidXMpCiAJCXJldHVybiAwOwotCX0KIAotCUxPR0lORigiQWRkaW5nIHZoYmEgd3dubjoleDoleCBjb25maWc6JWQtJWQtJWQtJWQgY2hhbnB0cjolcFxuIiwKLQkgICAgICAgc2NzaS53d25uLnd3bm4xLCBzY3NpLnd3bm4ud3dubjIsCi0JICAgICAgIHNjc2kubWF4Lm1heF9jaGFubmVsLCBzY3NpLm1heC5tYXhfaWQsIHNjc2kubWF4Lm1heF9sdW4sCi0JICAgICAgIHNjc2kubWF4LmNtZF9wZXJfbHVuLCBhZGRwYXJhbXMtPmNoYW5wdHIpOwogCWkgPSB2aXJ0cGNpX2RldmljZV9hZGQodmJ1cywgVklSVEhCQV9UWVBFLCBhZGRwYXJhbXMsICZzY3NpLCBOVUxMKTsKIAlpZiAoaSkgewotCQlMT0dJTkYoIkFkZGVkIHZoYmEgd3dubjoleDoleCBjaGFucHRyOiVwXG4iLCBzY3NpLnd3bm4ud3dubjEsCi0JCSAgICAgICBzY3NpLnd3bm4ud3dubjIsIGFkZHBhcmFtcy0+Y2hhbnB0cik7CiAJCVBPU1RDT0RFX0xJTlVYXzMoVlBDSV9DUkVBVEVfRVhJVF9QQywgaSwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJfQpAQCAtMzc1LDcgKzM1NSw2IEBACiAJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJaWYgKCFXQUlUX0ZPUl9JT19DSEFOTkVMCiAJICAgICgoc3RydWN0IHNwYXJfaW9fY2hhbm5lbF9wcm90b2NvbCBfX2lvbWVtICopYWRkcGFyYW1zLT5jaGFucHRyKSkgewotCQlMT0dFUlIoIlRpbWVkIG91dCwgY2hhbm5lbCBub3QgcmVhZHlcbiIpOwogCQlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiAwOwogCX0KQEAgLTM4NiwyMCArMzY1LDExIEBACiAJc3ByaW50ZihidXNpZCwgInZidXMlZCIsIGFkZHBhcmFtcy0+YnVzX25vKTsKIAl2YnVzID0gYnVzX2ZpbmRfZGV2aWNlKCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLAogCQkJICAgICAgICh2b2lkICopYnVzaWQsIG1hdGNoX2J1c2lkKTsKLQlpZiAoIXZidXMpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZidXMgJXNcbiIsIGJ1c2lkKTsKKwlpZiAoIXZidXMpCiAJCXJldHVybiAwOwotCX0KIAotCUxPR0lORigiQWRkaW5nIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCByY3ZidWZzOiVkIG10dTolZCBjaGFucHRyOiVwJXBVTFxuIiwKLQkgICAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwKLQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSwKLQkgICAgICAgbmV0Lm51bV9yY3ZfYnVmcywgbmV0Lm10dSwgYWRkcGFyYW1zLT5jaGFucHRyLCAmbmV0LnpvbmVfdXVpZCk7CiAJaSA9IHZpcnRwY2lfZGV2aWNlX2FkZCh2YnVzLCBWSVJUTklDX1RZUEUsIGFkZHBhcmFtcywgTlVMTCwgJm5ldCk7CiAJaWYgKGkpIHsKLQkJTE9HSU5GKCJBZGRlZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAotCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CiAJCVBPU1RDT0RFX0xJTlVYXzMoVlBDSV9DUkVBVEVfRVhJVF9QQywgaSwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJCXJldHVybiAxOwpAQCAtNDIwLDM0ICszOTAsMjQgQEAKIAlzcHJpbnRmKGJ1c2lkLCAidmJ1cyVkIiwgZGVscGFyYW1zLT5idXNfbm8pOwogCXZidXMgPSBidXNfZmluZF9kZXZpY2UoJnZpcnRwY2lfYnVzX3R5cGUsIE5VTEwsCiAJCQkgICAgICAgKHZvaWQgKilidXNpZCwgbWF0Y2hfYnVzaWQpOwotCWlmICghdmJ1cykgewotCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIGZpbmQgdmJ1cyAlc1xuIiwgYnVzaWQpOworCWlmICghdmJ1cykKIAkJcmV0dXJuIDA7Ci0JfQogCiAJLyogZW5zdXJlIHRoYXQgYnVzIGhhcyBubyBkZXZpY2VzPyAtLSBUQkQgKi8KLQlMT0dJTkYoIkRlbGV0aW5nICVzXG4iLCBCVVNfSUQodmJ1cykpOwotCWlmIChkZWxldGVfdmJ1c19kZXZpY2UodmJ1cywgTlVMTCkpCi0JCXJldHVybiAwOwkvKiBmYWlsdXJlICovCi0JTE9HSU5GKCJEZWxldGVkIHZidXMgJWRcbiIsIGRlbHBhcmFtcy0+YnVzX25vKTsKIAlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogZGVsZXRlX3ZidXNfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKnZidXMsIHZvaWQgKmRhdGEpCiB7Ci0JaW50IGNoZWNrZm9ycm9vdCA9IChkYXRhICE9IE5VTEwpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlOwogCi0JaWYgKChjaGVja2ZvcnJvb3QpICYmIG1hdGNoX2J1c2lkKHZidXMsICh2b2lkICopQlVTX0lEKGRldikpKSB7CisJaWYgKChkYXRhKSAmJiBtYXRjaF9idXNpZCh2YnVzLCAodm9pZCAqKUJVU19JRChkZXYpKSkgewogCQkvKiBza2lwIGl0IC0gZG9uJ3QgZGVsZXRlIHJvb3QgYnVzICovCi0JCUxPR0lORigic2tpcHBpbmcgcm9vdCBidXNcbiIpOwogCQlyZXR1cm4gMDsJLyogcHJldGVuZCBubyBlcnJvciAqLwogCX0KLQlMT0dJTkYoIkNhbGxpbmcgdW5yZWdpc3RlciBmb3IgJXNcbiIsIEJVU19JRCh2YnVzKSk7CiAJZGV2aWNlX3VucmVnaXN0ZXIodmJ1cyk7CiAJa2ZyZWUodmJ1cyk7Ci0JTE9HSU5GKCJWQnVzIHVucmVnaXN0ZXIgYW5kIGZyZWVkXG4iKTsKIAlyZXR1cm4gMDsJCS8qIG5vIGVycm9yICovCiB9CiAKQEAgLTQ2MSwxMiArNDIxLDggQEAKIAogCUdFVF9TQ1NJQURBUElORk9fRlJPTV9DSEFOUFRSKHBhdXNlcGFyYW1zLT5jaGFucHRyKTsKIAotCUxPR0lORigiUGF1c2luZyB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwgc2NzaS53d25uLnd3bm4yKTsKIAlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVyZG93bihOVUxMIC8qbm8gcGFyZW50IGJ1cyAqLywgVklSVEhCQV9UWVBFLAogCQkJCSAgICAgICZzY3NpLnd3bm4sIE5VTEwpOwotCWlmIChpKQotCQlMT0dJTkYoIlBhdXNlZCB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwKLQkJICAgICAgIHNjc2kud3dubi53d25uMik7CiAJcmV0dXJuIGk7CiB9CiAKQEAgLTQ4MCwxNiArNDM2LDggQEAKIAogCUdFVF9ORVRBREFQSU5GT19GUk9NX0NIQU5QVFIocGF1c2VwYXJhbXMtPmNoYW5wdHIpOwogCi0JTE9HSU5GKCJQYXVzaW5nIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkgICAgICAgbmV0Lm1hY19hZGRyWzBdLCBuZXQubWFjX2FkZHJbMV0sIG5ldC5tYWNfYWRkclsyXSwKLQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7CiAJaSA9IHZpcnRwY2lfZGV2aWNlX3NlcnZlcmRvd24oTlVMTCAvKm5vIHBhcmVudCBidXMgKi8sIFZJUlROSUNfVFlQRSwKIAkJCQkgICAgICBOVUxMLCBuZXQubWFjX2FkZHIpOwotCWlmIChpKSB7Ci0JCUxPR0lORigiIFBhdXNlZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAotCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7Ci0JfQogCXJldHVybiBpOwogfQogCkBAIC01MDMsMTIgKzQ1MSw4IEBACiAKIAlHRVRfU0NTSUFEQVBJTkZPX0ZST01fQ0hBTlBUUihyZXN1bWVwYXJhbXMtPmNoYW5wdHIpOwogCi0JTE9HSU5GKCJSZXN1bWluZyB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwgc2NzaS53d25uLnd3bm4yKTsKIAlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVydXAoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8sIFZJUlRIQkFfVFlQRSwKIAkJCQkgICAgJnNjc2kud3dubiwgTlVMTCk7Ci0JaWYgKGkpCi0JCUxPR0lORigiUmVzdW1lZCB2aGJhIHd3bm46JXg6JXhcbiIsIHNjc2kud3dubi53d25uMSwKLQkJICAgICAgIHNjc2kud3dubi53d25uMik7CiAJcmV0dXJuIGk7CiB9CiAKQEAgLTUyMywxNiArNDY3LDggQEAKIAogCUdFVF9ORVRBREFQSU5GT19GUk9NX0NIQU5QVFIocmVzdW1lcGFyYW1zLT5jaGFucHRyKTsKIAotCUxPR0lORigiUmVzdW1pbmcgdm5pYyBtYWNhZGRyOiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4XG4iLAotCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAotCSAgICAgICBuZXQubWFjX2FkZHJbM10sIG5ldC5tYWNfYWRkcls0XSwgbmV0Lm1hY19hZGRyWzVdKTsKIAlpID0gdmlydHBjaV9kZXZpY2Vfc2VydmVydXAoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8sIFZJUlROSUNfVFlQRSwKIAkJCQkgICAgTlVMTCwgbmV0Lm1hY19hZGRyKTsKLQlpZiAoaSkgewotCQlMT0dJTkYoIiBSZXN1bWVkIHZuaWMgbWFjYWRkcjolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeFxuIiwKLQkJICAgICAgIG5ldC5tYWNfYWRkclswXSwgbmV0Lm1hY19hZGRyWzFdLCBuZXQubWFjX2FkZHJbMl0sCi0JCSAgICAgICBuZXQubWFjX2FkZHJbM10sIG5ldC5tYWNfYWRkcls0XSwgbmV0Lm1hY19hZGRyWzVdKTsKLQl9CiAJcmV0dXJuIGk7CiB9CiAKQEAgLTU0NiwxMiArNDgyLDkgQEAKIAogCUdFVF9TQ1NJQURBUElORk9fRlJPTV9DSEFOUFRSKGRlbHBhcmFtcy0+Y2hhbnB0cik7CiAKLQlMT0dJTkYoIkRlbGV0aW5nIHZoYmEgd3dubjoleDoleFxuIiwgc2NzaS53d25uLnd3bm4xLCBzY3NpLnd3bm4ud3dubjIpOwogCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8sIFZJUlRIQkFfVFlQRSwKIAkJCSAgICAgICAmc2NzaS53d25uLCBOVUxMKTsKIAlpZiAoaSkgewotCQlMT0dJTkYoIkRlbGV0ZWQgdmhiYSB3d25uOiV4OiV4XG4iLCBzY3NpLnd3bm4ud3dubjEsCi0JCSAgICAgICBzY3NpLnd3bm4ud3dubjIpOwogCQlyZXR1cm4gMTsKIAl9CiAJcmV0dXJuIDA7CkBAIC01NjcsMjMgKzUwMCwxMyBAQAogCiAJR0VUX05FVEFEQVBJTkZPX0ZST01fQ0hBTlBUUihkZWxwYXJhbXMtPmNoYW5wdHIpOwogCi0JTE9HSU5GKCJEZWxldGluZyB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JICAgICAgIG5ldC5tYWNfYWRkclswXSwgbmV0Lm1hY19hZGRyWzFdLCBuZXQubWFjX2FkZHJbMl0sCi0JICAgICAgIG5ldC5tYWNfYWRkclszXSwgbmV0Lm1hY19hZGRyWzRdLCBuZXQubWFjX2FkZHJbNV0pOwogCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwoTlVMTCAvKm5vIHBhcmVudCBidXMgKi8sIFZJUlROSUNfVFlQRSwgTlVMTCwKIAkJCSAgICAgICBuZXQubWFjX2FkZHIpOwotCWlmIChpKSB7Ci0JCUxPR0lORigiRGVsZXRlZCB2bmljIG1hY2FkZHI6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnhcbiIsCi0JCSAgICAgICBuZXQubWFjX2FkZHJbMF0sIG5ldC5tYWNfYWRkclsxXSwgbmV0Lm1hY19hZGRyWzJdLAotCQkgICAgICAgbmV0Lm1hY19hZGRyWzNdLCBuZXQubWFjX2FkZHJbNF0sIG5ldC5tYWNfYWRkcls1XSk7Ci0JfQogCXJldHVybiBpOwogfQogCiAjZGVmaW5lIERFTEVURV9PTkVfVlBDSURFVih2cGNpZGV2KSB7IFwKLQlMT0dJTkYoImNhbGxpbmcgZGV2aWNlX3VucmVnaXN0ZXI6JXBcbiIsICZ2cGNpZGV2LT5nZW5lcmljX2Rldik7IFwKIAlkZXZpY2VfdW5yZWdpc3RlcigmdnBjaWRldi0+Z2VuZXJpY19kZXYpOyBcCi0JTE9HSU5GKCJEZWxldGVkICVwXG4iLCB2cGNpZGV2KTsgXAogCWtmcmVlKHZwY2lkZXYpOyBcCiB9CiAKQEAgLTYxMCwxMiArNTMzLDEwIEBACiAJCXRtcHZwY2lkZXYgPSBuZXh0dnBjaWRldjsKIAkJY291bnQrKzsKIAl9Ci0JTE9HSU5GKCJEZWxldGVkICVkIHZoYmFzL3ZuaWNzLlxuIiwgY291bnQpOwogCiAJLyogbm93IGRlbGV0ZSBlYWNoIHZidXMgKi8KLQlpZiAoYnVzX2Zvcl9lYWNoX2RldgotCSAgICAoJnZpcnRwY2lfYnVzX3R5cGUsIE5VTEwsICh2b2lkICopMSwgZGVsZXRlX3ZidXNfZGV2aWNlKSkKLQkJTE9HRVJSKCJkZWxldGUgb2YgYWxsIHZidXMgZmFpbGVkXG4iKTsKKwlidXNfZm9yX2VhY2hfZGV2KCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLCAodm9pZCAqKTEsCisJCQkgZGVsZXRlX3ZidXNfZGV2aWNlKTsKIH0KIAogLyogZGVsZXRlcyBhbGwgdm5pY3Mgb3IgdmhiYXMKQEAgLTYzMiwyNCArNTUzLDE0IEBACiAJc3ByaW50ZihidXNpZCwgInZidXMlZCIsIGRlbHBhcmFtcy0+YnVzX25vKTsKIAl2YnVzID0gYnVzX2ZpbmRfZGV2aWNlKCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLAogCQkJICAgICAgICh2b2lkICopYnVzaWQsIG1hdGNoX2J1c2lkKTsKLQlpZiAoIXZidXMpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZidXMgJXNcbiIsIGJ1c2lkKTsKKwlpZiAoIXZidXMpCiAJCXJldHVybiAwOwotCX0KIAotCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBkZWxldGUgYWxsIGRldmljZXM7IGRldnR5cGU6JWQgbm90IHZoYmE6JWQgb3Igdm5pYzolZFxuIiwKLQkJICAgICAgIGRldnR5cGUsIFZJUlRIQkFfVFlQRSwgVklSVE5JQ19UWVBFKTsKKwlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKQogCQlyZXR1cm4gMDsKLQl9CiAKLQlMT0dJTkYoIkRlbGV0aW5nIGFsbCAlcyBpbiB2YnVzICVzXG4iLAotCSAgICAgICBkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSA/ICJ2aGJhcyIgOiAidm5pY3MiLCBidXNpZCk7CiAJLyogZGVsZXRlIGFsbCB2aGJhcy92bmljcyAqLwogCWkgPSB2aXJ0cGNpX2RldmljZV9kZWwodmJ1cywgZGV2dHlwZSwgTlVMTCwgTlVMTCk7Ci0JaWYgKGkgPiAwKQotCQlMT0dJTkYoIkRlbGV0ZWQgJWQgJXNcbiIsIGksCi0JCSAgICAgICBkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSA/ICJ2aGJhcyIgOiAidm5pY3MiKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtNjg0LDcgKzU5NSw2IEBACiAJY2FzZSBHVUVTVF9SRVNVTUVfVk5JQzoKIAkJcmV0dXJuIHJlc3VtZV92bmljKCZtc2ctPnJlc3VtZV92bmljKTsKIAlkZWZhdWx0OgotCQlMT0dFUlIoImludmFsaWQgbWVzc2FnZSB0eXBlICVkLlxuIiwgbXNnLT5tc2d0eXBlKTsKIAkJcmV0dXJuIDA7CiAJfQogfQpAQCAtNzA4LDkgKzYxOCw2IEBACiAJCSAgICAgY29uc3Qgc3RydWN0IHZpcnRwY2lfZGV2ICpkZXYpCiB7CiAJd2hpbGUgKGlkcy0+dmVuZG9yIHx8IGlkcy0+c3VidmVuZG9yIHx8IGlkcy0+Y2xhc3NfbWFzaykgewotCQlEQkdJTkYoImlkcy0+dmVuZG9yOiV4IGRldi0+dmVuZG9yOiV4IGlkcy0+ZGV2aWNlOiV4IGRldi0+ZGV2aWNlOiV4XG4iLAotCQkgICAgICAgaWRzLT52ZW5kb3IsIGRldi0+dmVuZG9yLCBpZHMtPmRldmljZSwgZGV2LT5kZXZpY2UpOwotCiAJCWlmICgoaWRzLT52ZW5kb3IgPT0gZGV2LT52ZW5kb3IpICYmCiAJCSAgICAoaWRzLT5kZXZpY2UgPT0gZGV2LT5kZXZpY2UpKQogCQkJcmV0dXJuIGlkczsKQEAgLTczMSwyMCArNjM4LDE1IEBACiAJc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2aXJ0cGNpZHJ2ID0gZHJpdmVyX3RvX3ZpcnRwY2lfZHJpdmVyKGRydik7CiAJaW50IG1hdGNoID0gMDsKIAotCURCR0lORigiSW4gdmlydHBjaV9idXNfbWF0Y2ggZGV2LT5idXNfaWQ6JXMgZHJ2LT5uYW1lOiVzXG4iLAotCSAgICAgICBkZXYtPmJ1c19pZCwgZHJ2LT5uYW1lKTsKLQogCS8qIGNoZWNrIGlkcyBsaXN0IGZvciBhIG1hdGNoICovCiAJaWYgKHZpcnRwY2lfbWF0Y2hfZGV2aWNlKHZpcnRwY2lkcnYtPmlkX3RhYmxlLCB2aXJ0cGNpZGV2KSkKIAkJbWF0Y2ggPSAxOwogCi0JREJHSU5GKCJyZXR1cm5pbmcgbWF0Y2g6JWRcbiIsIG1hdGNoKTsKIAlyZXR1cm4gbWF0Y2g7CQkvKiAwIC0gbm8gbWF0Y2g7IDEgLSB5ZXMgaXQgbWF0Y2hlcyAqLwogfQogCiBzdGF0aWMgaW50IHZpcnRwY2lfdWV2ZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQogewotCURCR0lORigiSW4gdmlydHBjaV9ob3RwbHVnXG4iKTsKIAkvKiBhZGQgdmFyaWFibGVzIHRvIHRoZSBlbnZpcm9ubWVudCBwcmlvciB0byB0aGUgZ2VuZXJhdGlvbiBvZgogCSAqIGhvdHBsdWcgZXZlbnRzIHRvIHVzZXIgc3BhY2UKIAkgKi8KQEAgLTc2NiwyNCArNjY4LDE5IEBACiAJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyBkZXZfaW5mbzsKIAljb25zdCBjaGFyICpzdHlwZTsKIAotCWlmICghZGV2KSB7Ci0JCUxPR0VSUigiJXMgZGV2IGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJaWYgKCFkZXYpCiAJCXJldHVybjsKLQl9Ci0JaWYgKCF2aXJ0cGNpZHJ2KSB7Ci0JCUxPR0VSUigiJXMgZHJpdmVyIGlzIE5VTEwiLCBfX2Z1bmNfXyk7CisJaWYgKCF2aXJ0cGNpZHJ2KQogCQlyZXR1cm47Ci0JfQorCiAJdmJ1cyA9IGRldi0+cGFyZW50OwotCWlmICghdmJ1cykgewotCQlMT0dFUlIoIiVzIGRldiBoYXMgbm8gcGFyZW50IGJ1cyIsIF9fZnVuY19fKTsKKwlpZiAoIXZidXMpCiAJCXJldHVybjsKLQl9CisKIAljaGFuID0gdmJ1cy0+cGxhdGZvcm1fZGF0YTsKLQlpZiAoIWNoYW4pIHsKLQkJTE9HRVJSKCIlcyBkZXYgYnVzIGhhcyBubyBjaGFubmVsIiwgX19mdW5jX18pOworCWlmICghY2hhbikKIAkJcmV0dXJuOwotCX0KKwogCXN3aXRjaCAoZGV2X3R5cGUpIHsKIAljYXNlIFBDSV9ERVZJQ0VfSURfVklSVEhCQToKIAkJc3R5cGUgPSAidkhCQSI7CkBAIC04MjAsOCArNzE3LDYgQEAKIAljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQ7CiAJaW50IGVycm9yID0gMDsKIAotCUxPR0lORigiSW4gdmlydHBjaV9kZXZpY2VfcHJvYmUgZGV2OiVwIHZpcnRwY2lkZXY6JXAgdmlydHBjaWRydjolcFxuIiwKLQkgICAgICAgZGV2LCB2aXJ0cGNpZGV2LCB2aXJ0cGNpZHJ2KTsJLyogVkVSQk9TRS9ERUJVRyA/ICovCiAJUE9TVENPREVfTElOVVhfMihWUENJX1BST0JFX0VOVFJZX1BDLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKIAkvKiBzdGF0aWMgbWF0Y2ggYW5kIHN0YXRpYyBwcm9iZSB2cyBkeW5hbWljIG1hdGNoICYgZHluYW1pYwogCSAqIHByb2JlIC0gZG8gd2UgY2FyZT8uCkBAIC04NjYsOSArNzYxLDYgQEAKIAlzdHJ1Y3QgdmlydHBjaV9kZXYgKnZpcnRwY2lkZXYgPSBkZXZpY2VfdG9fdmlydHBjaV9kZXYoZGV2Xyk7CiAJc3RydWN0IHZpcnRwY2lfZHJpdmVyICp2aXJ0cGNpZHJ2ID0gdmlydHBjaWRldi0+bXlkcml2ZXI7CiAKLQlMT0dJTkYoIkluIHZpcnRwY2lfZGV2aWNlX3JlbW92ZSBidXNfaWQ6JXMgZGV2XzolcCB2aXJ0cGNpZGV2OiVwIGRldi0+ZHJpdmVyOiVwIGRyaXZlcm5hbWU6JXNcbiIsCi0JICAgICAgIEJVU19JRChkZXZfKSwgZGV2XywgdmlydHBjaWRldiwgZGV2Xy0+ZHJpdmVyLAotCSAgICAgICBkZXZfLT5kcml2ZXItPm5hbWUpOwkvKiBWRVJCT1NFL0RFQlVHICovCiAJaWYgKHZpcnRwY2lkcnYpIHsKIAkJLyogVEVNUDogYXNzdW1pbmcgd2UgaGF2ZSBvbmx5IG9uZSBzdWNoIGRyaXZlciBmb3Igbm93ICovCiAJCWlmICh2aXJ0cGNpZHJ2LT5yZW1vdmUpCkBAIC04NzYsMTAgKzc2OCw3IEBACiAJCXZpcnRwY2lkZXYtPm15ZHJpdmVyID0gTlVMTDsKIAl9CiAKLQlEQkdJTkYoImNhbGxpbmcgcHV0ZGV2aWNlXG4iKTsKIAlwdXRfZGV2aWNlKGRldl8pOwotCi0JREJHSU5GKCJMZWF2aW5nXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODg5LDExICs3NzgsNiBAQAogCiBzdGF0aWMgdm9pZCB2aXJ0cGNpX2J1c19yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQkvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUKLQkgKiBkZXZpY2UgaXMgcmVtb3ZlZAotCSAqLwotCURCR0lORigiSW4gdmlydHBjaV9idXNfcmVsZWFzZVxuIik7Ci0JLyogd2hhdCBlbHNlIGlzIHN1cHBvc2VkIHRvIGhhcHBlbiBoZXJlPyAqLwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05MTUsMTQgKzc5OSw5IEBACiAJc3RydWN0IHNwYXJfaW9fY2hhbm5lbF9wcm90b2NvbCBfX2lvbWVtICppb19jaGFuID0gTlVMTDsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAKLQlMT0dJTkYoInZpcnRwY2lfZGV2aWNlX2FkZCBwYXJlbnRidXM6JXAgY2hhbnB0cjolcFxuIiwgcGFyZW50YnVzLAotCSAgICAgICBhZGRwYXJhbXMtPmNoYW5wdHIpOwotCiAJUE9TVENPREVfTElOVVhfMihWUENJX0NSRUFURV9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKIAlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKSB7Ci0JCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gYWRkIGRldmljZTsgZGV2dHlwZTolZCBub3QgdmhiYTolZCBvciB2bmljOiVkXG4iLAotCQkgICAgICAgZGV2dHlwZSwgVklSVEhCQV9UWVBFLCBWSVJUTklDX1RZUEUpOwogCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldnR5cGUsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiAwOwpAQCAtOTMwLDggKzgwOSw3IEBACiAKIAkvKiBhZGQgYSBWaXJ0dWFsIERldmljZSAqLwogCXZpcnRwY2lkZXYgPSBremFsbG9jKHNpemVvZigqdmlydHBjaWRldiksIEdGUF9BVE9NSUMpOwotCWlmICh2aXJ0cGNpZGV2ID09IE5VTEwpIHsKLQkJTE9HRVJSKCJjYW4ndCBhZGQgZGV2aWNlIC0gbWFsbG9jIEZBTExFRFxuIik7CisJaWYgKCF2aXJ0cGNpZGV2KSB7CiAJCVBPU1RDT0RFX0xJTlVYXzIoTUFMTE9DX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybiAwOwogCX0KQEAgLTk5Myw3ICs4NzEsNiBAQAogCQkgKi8KIAkJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnZwY2lkZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAJCWtmcmVlKHZpcnRwY2lkZXYpOwotCQlMT0dFUlIoIioqKiogRkFJTEVEIHZoYmEvdm5pYyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbGlzdFxuIik7CiAJCVBPU1RDT0RFX0xJTlVYXzIoVlBDSV9DUkVBVEVfRkFJTFVSRV9QQywgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTAyNCw4ICs5MDEsNiBAQAogCSogbGlzdC4gT3RoZXJ3aXNlLCBhIGRldmljZV91bnJlZ2lzdGVyIGZyb20gdGhpcyBmdW5jdGlvbiBjYW4KIAkqIGNhdXNlIGEgInNjaGVkdWxpbmcgd2hpbGUgYXRvbWljIi4KIAkqLwotCURCR0lORigicmVnaXN0ZXJpbmcgZGV2aWNlOiVwIHdpdGggYnVzX2lkOiVzXG4iLAotCSAgICAgICAmdmlydHBjaWRldi0+Z2VuZXJpY19kZXYsIHZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2LmJ1c19pZCk7CiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ2aXJ0cGNpZGV2LT5nZW5lcmljX2Rldik7CiAJLyogTk9URTogVEhJUyBJUyBDQUxMSU5HIEhPVFBMVUcgdmlydHBjaV9ob3RwbHVnISEhCiAJICogVGhpcyBjYWxsIHRvIGRldmljZV9yZWdpc3RlciByZXN1bHRzIGluIHZpcnRwY2lfYnVzX21hdGNoCkBAIC0xMDM3LDcgKzkxMiw2IEBACiAJICogdmlydHBjaV9kZXZpY2VfcHJvYmUgaXMgc3VjY2Vzc2Z1bAogCSAqLwogCWlmIChyZXQpIHsKLQkJTE9HRVJSKCJkZXZpY2VfcmVnaXN0ZXIgcmV0dXJuZWQgJWRcbiIsIHJldCk7CiAJCWRldiA9ICZ2aXJ0cGNpZGV2LT5nZW5lcmljX2RldjsKIAkJU1BBUl9DSEFOTkVMX0NMSUVOVF9UUkFOU0lUSU9OKGFkZHBhcmFtcy0+Y2hhbnB0ciwKIAkJCQkJICAgICAgIEJVU19JRChkZXYpLApAQCAtMTA2MCwxMCArOTM0LDYgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JTE9HSU5GKCJBZGRlZCAlczolZDolZCAmdmlydHBjaWRldi0+Z2VuZXJpY19kZXY6JXBcbiIsCi0JICAgICAgIChkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSkgPyAidmlydGhiYSIgOiAidmlydG5pYyIsCi0JICAgICAgIGFkZHBhcmFtcy0+YnVzX25vLCBhZGRwYXJhbXMtPmRldmljZV9ubywKLQkgICAgICAgJnZpcnRwY2lkZXYtPmdlbmVyaWNfZGV2KTsKIAlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCXJldHVybiAxOwogfQpAQCAtMTA4MCwxMSArOTUwLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByYyA9IDA7CiAKLQlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKSB7Ci0JCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gcGF1c2UgZGV2aWNlOyBkZXZ0eXBlOiVkIG5vdCB2aGJhOiVkIG9yIHZuaWM6JWRcbiIsCi0JCSAgICAgICBkZXZ0eXBlLCBWSVJUSEJBX1RZUEUsIFZJUlROSUNfVFlQRSk7CisJaWYgKChkZXZ0eXBlICE9IFZJUlRIQkFfVFlQRSkgJiYgKGRldnR5cGUgIT0gVklSVE5JQ19UWVBFKSkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJLyogZmluZCB0aGUgdmhiYSBvciB2bmljIGluIHZpcnRwY2kgZGV2aWNlIGxpc3QgKi8KIAl3cml0ZV9sb2NrX2lycXNhdmUoJnZwY2lkZXZfbGlzdF9sb2NrLCBmbGFncyk7CkBAIC0xMTE5LDEwICs5ODYsOCBAQAogCX0KIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmdnBjaWRldl9saXN0X2xvY2ssIGZsYWdzKTsKIAotCWlmICghZm91bmQpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZoYmEvdm5pYyBpbiB0aGUgbGlzdFxuIik7CisJaWYgKCFmb3VuZCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTEzOSwxMSArMTAwNCw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmMgPSAwOwogCi0JaWYgKChkZXZ0eXBlICE9IFZJUlRIQkFfVFlQRSkgJiYgKGRldnR5cGUgIT0gVklSVE5JQ19UWVBFKSkgewotCQlMT0dFUlIoIioqKiogRkFJTEVEIHRvIHJlc3VtZSBkZXZpY2U7IGRldnR5cGU6JWQgbm90IHZoYmE6JWQgb3Igdm5pYzolZFxuIiwKLQkJICAgICAgIGRldnR5cGUsIFZJUlRIQkFfVFlQRSwgVklSVE5JQ19UWVBFKTsKKwlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKQogCQlyZXR1cm4gMDsKLQl9CisKIAogCS8qIGZpbmQgdGhlIHZoYmEgb3Igdm5pYyBpbiB2aXJ0cGNpIGRldmljZSBsaXN0ICovCiAJd3JpdGVfbG9ja19pcnFzYXZlKCZ2cGNpZGV2X2xpc3RfbG9jaywgZmxhZ3MpOwpAQCAtMTE4NywxMCArMTA1MCw4IEBACiAKIAl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmdnBjaWRldl9saXN0X2xvY2ssIGZsYWdzKTsKIAotCWlmICghZm91bmQpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZoYmEvdm5pYyBpbiB0aGUgbGlzdFxuIik7CisJaWYgKCFmb3VuZCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTIwOSwxNyArMTA3MCwxNCBAQAogCWNvbnRpbnVlOyBcCiB9CiAKLQlpZiAoKGRldnR5cGUgIT0gVklSVEhCQV9UWVBFKSAmJiAoZGV2dHlwZSAhPSBWSVJUTklDX1RZUEUpKSB7Ci0JCUxPR0VSUigiKioqKiBGQUlMRUQgdG8gZGVsZXRlIGRldmljZTsgZGV2dHlwZTolZCBub3QgdmhiYTolZCBvciB2bmljOiVkXG4iLAotCQkgICAgICAgZGV2dHlwZSwgVklSVEhCQV9UWVBFLCBWSVJUTklDX1RZUEUpOworCWlmICgoZGV2dHlwZSAhPSBWSVJUSEJBX1RZUEUpICYmIChkZXZ0eXBlICE9IFZJUlROSUNfVFlQRSkpCiAJCXJldHVybiAwOwotCX0KIAogCS8qIHNlZSBpZiB3ZSBhcmUgdG8gZGVsZXRlIGFsbCAtIE5PVEU6IGFsbCBpbXBsaWVzIHdlIGhhdmUgYQogCSAqIHZhbGlkIHBhcmVudGJ1cwogCSAqLwotCWFsbCA9ICgoZGV2dHlwZSA9PSBWSVJUSEJBX1RZUEUpICYmICh3d25uID09IE5VTEwpKSB8fAotCSAgICAoKGRldnR5cGUgPT0gVklSVE5JQ19UWVBFKSAmJiAobWFjYWRkciA9PSBOVUxMKSk7CisJYWxsID0gKChkZXZ0eXBlID09IFZJUlRIQkFfVFlQRSkgJiYgKCF3d25uKSkgfHwKKwkgICAgKChkZXZ0eXBlID09IFZJUlROSUNfVFlQRSkgJiYgKCFtYWNhZGRyKSk7CiAKIAkvKiBmaW5kIGFsbCB0aGUgdmhiYSBvciB2bmljIG9yIGJvdGggaW4gdmlydHBjaSBkZXZpY2UgbGlzdAogCSoga2VlcCBsaXN0IG9mIG9uZXMgd2UgYXJlIGRlbGV0aW5nIHNvIHdlIGNhbiBjYWxsCkBAIC0xMjgwLDEwICsxMTM4LDggQEAKIAl9CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJnZwY2lkZXZfbGlzdF9sb2NrLCBmbGFncyk7CiAKLQlpZiAoIWFsbCAmJiAoY291bnQgPT0gMCkpIHsKLQkJTE9HRVJSKCIqKioqIEZBSUxFRCB0byBmaW5kIHZoYmEvdm5pYyBpbiB0aGUgbGlzdFxuIik7CisJaWYgKCFhbGwgJiYgKGNvdW50ID09IDApKQogCQlyZXR1cm4gMDsKLQl9CiAKIAkvKiBub3cgZGVsZXRlIGVhY2ggb25lIGZyb20gZGVsZXRlIGxpc3QgKi8KIAl3aGlsZSAoZGVsbGlzdCkgewpAQCAtMTMwMyw3ICsxMTU5LDYgQEAKIAkvKiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSB0byB0aGUKIAkgKiBkZXZpY2UgaXMgcmVtb3ZlZAogCSAqLwotCUxPR0lORigiSW4gdmlydHBjaV9kZXZpY2VfcmVsZWFzZTolcCAtIE5PVCBZRVQgSU1QTEVNRU5URURcbiIsIGRldl8pOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzI0LDggKzExNzksNiBAQAogCXN0cnVjdCBkcml2ZXJfcHJpdmF0ZSAqZHByaXZhdGUgPSB0b19kcml2ZXIoa29iaik7CiAJc3RydWN0IGRldmljZV9kcml2ZXIgKmRyaXZlciA9IGRwcml2YXRlLT5kcml2ZXI7CiAKLQlEQkdJTkYoIkluIHZpcnRwY2lfZHJpdmVyX2F0dHJfc2hvdyBkcml2ZXItPm5hbWU6JXNcbiIsCWRyaXZlci0+bmFtZSk7Ci0KIAlpZiAoZGF0dHItPnNob3cpCiAJCXJldCA9IGRhdHRyLT5zaG93KGRyaXZlciwgYnVmKTsKIApAQCAtMTM0Miw4ICsxMTk1LDYgQEAKIAlzdHJ1Y3QgZHJpdmVyX3ByaXZhdGUgKmRwcml2YXRlID0gdG9fZHJpdmVyKGtvYmopOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcml2ZXIgPSBkcHJpdmF0ZS0+ZHJpdmVyOwogCi0JREJHSU5GKCJJbiB2aXJ0cGNpX2RyaXZlcl9hdHRyX3N0b3JlIGRyaXZlci0+bmFtZTolc1xuIiwgZHJpdmVyLT5uYW1lKTsKLQogCWlmIChkYXR0ci0+c3RvcmUpCiAJCXJldCA9IGRhdHRyLT5zdG9yZShkcml2ZXIsIGJ1ZiwgY291bnQpOwogCkBAIC0xMzU1LDEyICsxMjA2LDggQEAKIHsKIAlpbnQgcmVzdWx0ID0gMDsKIAotCURCR0lORigiSW4gdmlydHBjaV9yZWdpc3Rlcl9kcml2ZXJcbiIpOwotCi0JaWYgKGRydi0+aWRfdGFibGUgPT0gTlVMTCkgewotCQlMT0dFUlIoImlkX3RhYmxlIG1pc3NpbmdcbiIpOworCWlmICghZHJ2LT5pZF90YWJsZSkKIAkJcmV0dXJuIDE7Ci0JfQogCS8qIGluaXRpYWxpemUgY29yZSBkcml2ZXIgZmllbGRzIG5lZWRlZCB0byBjYWxsIGRyaXZlcl9yZWdpc3RlciAqLwogCWRydi0+Y29yZV9kcml2ZXIubmFtZSA9IGRydi0+bmFtZTsJLyogbmFtZSBvZiBkcml2ZXIgaW4gc3lzZnMgKi8KIAlkcnYtPmNvcmVfZHJpdmVyLmJ1cyA9ICZ2aXJ0cGNpX2J1c190eXBlOwkvKiB0eXBlIG9mIGJ1cyB0aGlzCkBAIC0xMzg5LDcgKzEyMzYsNiBAQAogCiB2b2lkIHZpcnRwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHZpcnRwY2lfZHJpdmVyICpkcnYpCiB7Ci0JREJHSU5GKCJJbiB2aXJ0cGNpX3VucmVnaXN0ZXJfZHJpdmVyIGRydjolcFxuIiwgZHJ2KTsKIAlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5jb3JlX2RyaXZlcik7CiAJLyogZHJpdmVyX3VucmVnaXN0ZXIgY2FsbHMgYnVzX3JlbW92ZV9kcml2ZXIKIAkgKiBidXNfcmVtb3ZlX2RyaXZlciBjYWxscyBkZXZpY2VfZGV0YWNoCkBAIC0xMzk5LDcgKzEyNDUsNiBAQAogCSAqIHZpcnRwY2lfZGV2aWNlX3JlbW92ZQogCSAqIHZpcnRwY2lfZGV2aWNlX3JlbW92ZSBjYWxscyB2aXJ0aGJhX3JlbW92ZQogCSAqLwotCURCR0lORigiTGVhdmluZ1xuIik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXJ0cGNpX3VucmVnaXN0ZXJfZHJpdmVyKTsKIApAQCAtMTQ0Miw5ICsxMjg3LDggQEAKIAlwcmludHBhcmFtLnN0cl9wb3MgPSAmc3RyX3BvczsKIAlwcmludHBhcmFtLmJ1ZiA9IHZidWY7CiAJcHJpbnRwYXJhbS5sZW4gPSAmbGVuOwotCWlmIChidXNfZm9yX2VhY2hfZGV2KCZ2aXJ0cGNpX2J1c190eXBlLCBOVUxMLAotCQkJICAgICAodm9pZCAqKSZwcmludHBhcmFtLCBwcmludF92YnVzKSkKLQkJTE9HRVJSKCJGYWlsZWQgdG8gZmluZCBidXNcbiIpOworCWJ1c19mb3JfZWFjaF9kZXYoJnZpcnRwY2lfYnVzX3R5cGUsIE5VTEwsICh2b2lkICopJnByaW50cGFyYW0sCisJCQkgcHJpbnRfdmJ1cyk7CiAKIAlzdHJfcG9zICs9IHNjbnByaW50Zih2YnVmICsgc3RyX3BvcywgbGVuIC0gc3RyX3BvcywKIAkJCSJcbiBWaXJ0dWFsIFBDSSBkZXZpY2VzXG4iKTsKQEAgLTE0NjQsMTUgKzEzMDgsMTAgQEAKIAkJCQkJdG1wdnBjaWRldi0+c2NzaS5tYXguY21kX3Blcl9sdW4pOwogCQl9IGVsc2UgewogCQkJc3RyX3BvcyArPSBzY25wcmludGYodmJ1ZiArIHN0cl9wb3MsIGxlbiAtIHN0cl9wb3MsCi0JCQkJCSJbJWQ6JWRdIFZOaWM6JTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMnggbnVtX3Jjdl9idWZzOiVkIG10dTolZCIsCisJCQkJCSJbJWQ6JWRdIFZOaWM6JXBNIG51bV9yY3ZfYnVmczolZCBtdHU6JWQiLAogCQkJCQl0bXB2cGNpZGV2LT5idXNfbm8sCiAJCQkJCXRtcHZwY2lkZXYtPmRldmljZV9ubywKLQkJCQkJdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyWzBdLAotCQkJCQl0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHJbMV0sCi0JCQkJCXRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkclsyXSwKLQkJCQkJdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyWzNdLAotCQkJCQl0bXB2cGNpZGV2LT5uZXQubWFjX2FkZHJbNF0sCi0JCQkJCXRtcHZwY2lkZXYtPm5ldC5tYWNfYWRkcls1XSwKKwkJCQkJdG1wdnBjaWRldi0+bmV0Lm1hY19hZGRyLAogCQkJCQl0bXB2cGNpZGV2LT5uZXQubnVtX3Jjdl9idWZzLAogCQkJCQl0bXB2cGNpZGV2LT5uZXQubXR1KTsKIAkJfQpAQCAtMTUwNyw1OCArMTM0Niw0NCBAQAogCSAqIGRyaXZlcnMgZGlyZWN0b3J5CiAJICovCiAJaWYgKHJldCkgewotCQlMT0dFUlIoImJ1c19yZWdpc3RlciAqKioqRkFJTEVEOiVkXG4iLCByZXQpOwogCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIHJldCwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JREJHSU5GKCJidXNfcmVnaXN0ZXIgc3VjY2Vzc2Z1bFxuIik7CiAJYnVzX2RldmljZV9pbmZvX2luaXQoJmJ1c19kcml2ZXJfaW5mbywgImNsaWVudGJ1cyIsICJ2aXJ0cGNpIiwKIAkJCSAgICAgVkVSU0lPTiwgTlVMTCk7CiAKIAkvKiBjcmVhdGUgYSByb290IGJ1cyB1c2VkIHRvIHBhcmVudCBhbGwgdGhlIHZpcnRwY2kgYnVzZXMuICovCiAJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlKTsKIAlpZiAocmV0KSB7Ci0JCUxPR0VSUigiZGV2aWNlX3JlZ2lzdGVyIEZBSUxFRDolZFxuIiwgcmV0KTsKIAkJYnVzX3VucmVnaXN0ZXIoJnZpcnRwY2lfYnVzX3R5cGUpOwogCQlQT1NUQ09ERV9MSU5VWF8zKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIHJldCwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuIHJldDsKIAl9Ci0JREJHSU5GKCJkZXZpY2VfcmVnaXN0ZXIgc3VjY2Vzc2Z1bCByZXQ6JXhcbiIsIHJldCk7CiAKIAlpZiAoIXVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIoMiwgKHZvaWQgKikmdmlydHBjaV9jdHJsY2hhbl9mdW5jLAogCQkJCQkgICZjaGlwc2V0X2RyaXZlcl9pbmZvKSkgewotCQlMT0dFUlIoInVpc2N0cmxfcmVnaXN0ZXJfcmVxX2hhbmRsZXIgKioqKkZBSUxFRC5cbiIpOwogCQlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0ZBSUxVUkVfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCWRldmljZV91bnJlZ2lzdGVyKCZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlKTsKIAkJYnVzX3VucmVnaXN0ZXIoJnZpcnRwY2lfYnVzX3R5cGUpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JTE9HSU5GKCJzdWNjZXNzZnVsbHkgcmVnaXN0ZXJlZCB2aXJ0cGNpX2N0cmxjaGFuX2Z1bmMgKDB4JXApIGFzIGNhbGxiYWNrLlxuIiwKLQkgICAgICAgKHZvaWQgKikmdmlydHBjaV9jdHJsY2hhbl9mdW5jKTsKIAkvKiBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnkgYW5kIGluZm8gZmlsZSBpbnNpZGUuICovCiAJdmlydHBjaV9kZWJ1Z2ZzX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigidmlydHBjaSIsIE5VTEwpOwogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImluZm8iLCBTX0lSVVNSLCB2aXJ0cGNpX2RlYnVnZnNfZGlyLAogCQkJICAgIE5VTEwsICZkZWJ1Z2ZzX2luZm9fZm9wcyk7Ci0JTE9HSU5GKCJMZWF2aW5nXG4iKTsKIAlQT1NUQ09ERV9MSU5VWF8yKFZQQ0lfQ1JFQVRFX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgdmlydHBjaV9tb2RfZXhpdCh2b2lkKQogewotCUxPR0lORigidmlydHBjaV9tb2RfZXhpdC4uLlxuIik7Ci0KIAkvKiB1bnJlZ2lzdGVyIHRoZSBjYWxsYmFjayBmdW5jdGlvbiAqLwotCWlmICghdWlzY3RybF9yZWdpc3Rlcl9yZXFfaGFuZGxlcigyLCBOVUxMLCBOVUxMKSkKLQkJTE9HRVJSKCJ1aXNjdHJsX3JlZ2lzdGVyX3JlcV9oYW5kbGVyICoqKipGQUlMRUQuXG4iKTsKLQogCWRldmljZV91bnJlZ2lzdGVyKCZ2aXJ0cGNpX3Jvb3RidXNfZGV2aWNlKTsKIAlidXNfdW5yZWdpc3RlcigmdmlydHBjaV9idXNfdHlwZSk7CiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHZpcnRwY2lfZGVidWdmc19kaXIpOwotCUxPR0lORigiTGVhdmluZ1xuIik7CiB9CiAKIG1vZHVsZV9pbml0KHZpcnRwY2lfbW9kX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvS2NvbmZpZyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL0tjb25maWcKaW5kZXggNDFjM2I0Yi4uOGQzMWJlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9LY29uZmlnCkBAIC00LDcgKzQsNyBAQAogCiBjb25maWcgVU5JU1lTX1ZJU09SQ0hBTk5FTAogCXRyaXN0YXRlICJVbmlzeXMgdmlzb3JjaGFubmVsIGRyaXZlciIKLQlkZXBlbmRzIG9uIFVOSVNZU1NQQVIgJiYgVU5JU1lTX1ZJU09SVVRJTAorCXNlbGVjdCBVTklTWVNfVklTT1JVVElMCiAJLS0taGVscC0tLQogCUlmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBlbmFibGUgdGhlIFVuaXN5cyB2aXNvcmNoYW5uZWwgZHJpdmVyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9nbG9iYWxzLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC9nbG9iYWxzLmgKaW5kZXggNTgxZWQ4My4uMGVkOGUxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvZ2xvYmFscy5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL2dsb2JhbHMuaApAQCAtMTgsNyArMTgsNiBAQAogI2lmbmRlZiBfX1ZJU09SQ0hBTk5FTF9HTE9CQUxTX0hfXwogI2RlZmluZSBfX1ZJU09SQ0hBTk5FTF9HTE9CQUxTX0hfXwogCi0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgInRpbXNrbW9kLmgiCiAjaW5jbHVkZSAibWVtcmVnaW9uLmgiCiAjaW5jbHVkZSAidmVyc2lvbi5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvdmlzb3JjaGFubmVsX2Z1bmNzLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfZnVuY3MuYwppbmRleCAwMTg4ZWY4Li43YTlhNzI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfZnVuY3MuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfZnVuY3MuYwpAQCAtNTgsOCArNTgsNyBAQAogCXZvaWQgKnJjID0gTlVMTDsKIAogCXAgPSBrbWFsbG9jKHNpemVvZigqcCksIEdGUF9LRVJORUx8X19HRlBfTk9SRVRSWSk7Ci0JaWYgKHAgPT0gTlVMTCkgewotCQlFUlJEUlYoImFsbG9jYXRpb24gZmFpbGVkOiAoc3RhdHVzPTApXG4iKTsKKwlpZiAoIXApIHsKIAkJcmMgPSBOVUxMOwogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtNjksNyArNjgsNyBAQAogCXNwaW5fbG9ja19pbml0KCZwLT5yZW1vdmVfbG9jayk7CiAKIAkvKiBwcmVwYXJlIGNoYW5faGRyIChhYnN0cmFjdGlvbiB0byByZWFkL3dyaXRlIGNoYW5uZWwgbWVtb3J5KSAqLwotCWlmIChwYXJlbnQgPT0gTlVMTCkKKwlpZiAoIXBhcmVudCkKIAkJcC0+bWVtcmVnaW9uID0KIAkJICAgIHZpc29yX21lbXJlZ2lvbl9jcmVhdGUocGh5c2FkZHIsCiAJCQkJCSAgIHNpemVvZihzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIpKTsKQEAgLTc3LDE0ICs3NiwxMiBAQAogCQlwLT5tZW1yZWdpb24gPQogCQkgICAgdmlzb3JfbWVtcmVnaW9uX2NyZWF0ZV9vdmVybGFwcGVkKHBhcmVudC0+bWVtcmVnaW9uLAogCQkJCW9mZiwgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikpOwotCWlmIChwLT5tZW1yZWdpb24gPT0gTlVMTCkgewotCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9jcmVhdGUgZmFpbGVkIGZhaWxlZDogKHN0YXR1cz0wKVxuIik7CisJaWYgKCFwLT5tZW1yZWdpb24pIHsKIAkJcmMgPSBOVUxMOwogCQlnb3RvIGNsZWFudXA7CiAJfQogCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChwLT5tZW1yZWdpb24sIDAsICZwLT5jaGFuX2hkciwKIAkJCQkgc2l6ZW9mKHN0cnVjdCBjaGFubmVsX2hlYWRlcikpIDwgMCkgewotCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZWFkIGZhaWxlZDogKHN0YXR1cz0wKVxuIik7CiAJCXJjID0gTlVMTDsKIAkJZ290byBjbGVhbnVwOwogCX0KQEAgLTk1LDcgKzkyLDYgQEAKIAkJLyogd2UgaGFkIGJldHRlciBiZSBhIENMSUVOVCBvZiB0aGlzIGNoYW5uZWwgKi8KIAkJZ3VpZCA9IHAtPmNoYW5faGRyLmNodHlwZTsKIAlpZiAodmlzb3JfbWVtcmVnaW9uX3Jlc2l6ZShwLT5tZW1yZWdpb24sIGNoYW5uZWxfYnl0ZXMpIDwgMCkgewotCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZXNpemUgZmFpbGVkOiAoc3RhdHVzPTApXG4iKTsKIAkJcmMgPSBOVUxMOwogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtMTA1LDggKzEwMSw4IEBACiAJcmMgPSBwOwogY2xlYW51cDoKIAotCWlmIChyYyA9PSBOVUxMKSB7Ci0JCWlmIChwICE9IE5VTEwpIHsKKwlpZiAoIXJjKSB7CisJCWlmICghcCkgewogCQkJdmlzb3JjaGFubmVsX2Rlc3Ryb3kocCk7CiAJCQlwID0gTlVMTDsKIAkJfQpAQCAtMTU0LDkgKzE1MCw5IEBACiB2b2lkCiB2aXNvcmNoYW5uZWxfZGVzdHJveShzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjaGFubmVsKQogewotCWlmIChjaGFubmVsID09IE5VTEwpCisJaWYgKCFjaGFubmVsKQogCQlyZXR1cm47Ci0JaWYgKGNoYW5uZWwtPm1lbXJlZ2lvbiAhPSBOVUxMKSB7CisJaWYgKGNoYW5uZWwtPm1lbXJlZ2lvbikgewogCQl2aXNvcl9tZW1yZWdpb25fZGVzdHJveShjaGFubmVsLT5tZW1yZWdpb24pOwogCQljaGFubmVsLT5tZW1yZWdpb24gPSBOVUxMOwogCX0KQEAgLTI1NiwxMCArMjUyLDkgQEAKIAlpbnQgd3JpdHRlbiA9IDA7CiAJdTggKmJ1ZiA9IHZtYWxsb2MoYnVmc2l6ZSk7CiAKLQlpZiAoYnVmID09IE5VTEwpIHsKLQkJRVJSRFJWKCIlcyBmYWlsZWQgbWVtb3J5IGFsbG9jYXRpb24iLCBfX2Z1bmNfXyk7CisJaWYgKCFidWYpCiAJCWdvdG8gY2xlYW51cDsKLQl9CisKIAltZW1zZXQoYnVmLCBjaCwgYnVmc2l6ZSk7CiAJd2hpbGUgKG5ieXRlcyA+IDApIHsKIAkJdWxvbmcgdGhpc2J5dGVzID0gYnVmc2l6ZTsKQEAgLTI3OSw3ICsyNzQsNyBAQAogCXJjID0gMDsKIAogY2xlYW51cDoKLQlpZiAoYnVmICE9IE5VTEwpIHsKKwlpZiAoYnVmKSB7CiAJCXZmcmVlKGJ1Zik7CiAJCWJ1ZiA9IE5VTEw7CiAJfQpAQCAtMzI0LDEwICszMTksOCBAQAogewogCUJPT0wgcmMgPSBGQUxTRTsKIAotCWlmIChjaGFubmVsLT5jaGFuX2hkci5jaF9zcGFjZV9vZmZzZXQgPCBzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSkgewotCQlFUlJEUlYoIm9DaGFubmVsU3BhY2UgdG9vIHNtYWxsOiAoc3RhdHVzPSVkKVxuIiwgcmMpOworCWlmIChjaGFubmVsLT5jaGFuX2hkci5jaF9zcGFjZV9vZmZzZXQgPCBzaXplb2Yoc3RydWN0IGNoYW5uZWxfaGVhZGVyKSkKIAkJZ290byBjbGVhbnVwOwotCX0KIAogCS8qIFJlYWQgdGhlIGFwcHJvcHJpYXRlIFNJR05BTF9RVUVVRV9IRUFERVIgaW50byBsb2NhbCBtZW1vcnkuICovCiAKQEAgLTMzNSwxMCArMzI4LDYgQEAKIAkJCQkgU0lHX1FVRVVFX09GRlNFVCgmY2hhbm5lbC0+Y2hhbl9oZHIsIHF1ZXVlKSwKIAkJCQkgc2lnX2hkciwKIAkJCQkgc2l6ZW9mKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyKSkgPCAwKSB7Ci0JCUVSUkRSVigicXVldWU9JWQgU0lHX1FVRVVFX09GRlNFVD0lZCIsCi0JCSAgICAgICBxdWV1ZSwgKGludClTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwgcXVldWUpKTsKLQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fcmVhZCBvZiBzaWduYWwgcXVldWUgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwKLQkJICAgICAgIHJjKTsKIAkJZ290byBjbGVhbnVwOwogCX0KIAlyYyA9IFRSVUU7CkBAIC0zNTgsMTUgKzM0NywxMSBAQAogCQlpZiAodmlzb3JfbWVtcmVnaW9uX3dyaXRlKGNoYW5uZWwtPm1lbXJlZ2lvbiwKIAkJCQkJICBzaWduYWxfZGF0YV9vZmZzZXQsCiAJCQkJCSAgZGF0YSwgc2lnX2hkci0+c2lnbmFsX3NpemUpIDwgMCkgewotCQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2Ygc2lnbmFsIGRhdGEgZmFpbGVkOiAoc3RhdHVzPSVkKVxuIiwKLQkJCSAgICAgICByYyk7CiAJCQlnb3RvIGNsZWFudXA7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAodmlzb3JfbWVtcmVnaW9uX3JlYWQoY2hhbm5lbC0+bWVtcmVnaW9uLCBzaWduYWxfZGF0YV9vZmZzZXQsCiAJCQkJCSBkYXRhLCBzaWdfaGRyLT5zaWduYWxfc2l6ZSkgPCAwKSB7Ci0JCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl9yZWFkIG9mIHNpZ25hbCBkYXRhIGZhaWxlZDogKHN0YXR1cz0lZClcbiIsCi0JCQkgICAgICAgcmMpOwogCQkJZ290byBjbGVhbnVwOwogCQl9CiAJfQpAQCAtNDA0LDggKzM4OSw2IEBACiAJCXB1bnNhZmVfc3FoLT5oZWFkID0gKnBoZWFkOwogCQlwdW5zYWZlX3NxaC0+dGFpbCA9ICpwdGFpbDsKIAotCQlFUlJEUlYoInNhZmVfc2lnX3F1ZXVlX3ZhbGlkYXRlOiBoZWFkID0gMHgleCwgdGFpbCA9IDB4JXgsIE1heFNsb3RzID0gMHgleCIsCi0JCSAgICAgICAqcGhlYWQsICpwdGFpbCwgcHNhZmVfc3FoLT5tYXhfc2xvdHMpOwogCQlyZXR1cm4gMDsKIAl9CiAJcmV0dXJuIDE7CkBAIC00MTYsMTUgKzM5OSwxMyBAQAogewogCXN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyIHNpZ19oZHI7CiAKLQlpZiAoIXNpZ19yZWFkX2hlYWRlcihjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIpKSB7CisJaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkKIAkJcmV0dXJuIEZBTFNFOwotCX0KIAlpZiAoc2lnX2hkci5oZWFkID09IHNpZ19oZHIudGFpbCkKIAkJcmV0dXJuIEZBTFNFOwkvKiBubyBzaWduYWxzIHRvIHJlbW92ZSAqLwogCiAJc2lnX2hkci50YWlsID0gKHNpZ19oZHIudGFpbCArIDEpICUgc2lnX2hkci5tYXhfc2xvdHM7CiAJaWYgKCFzaWdfcmVhZF9kYXRhKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgc2lnX2hkci50YWlsLCBtc2cpKSB7Ci0JCUVSUkRSVigic2lnX3JlYWRfZGF0YSBmYWlsZWRcbiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCXNpZ19oZHIubnVtX3JlY2VpdmVkKys7CkBAIC00MzMsMTQgKzQxNCwxMCBAQAogCSAqIHVwZGF0ZSBob3N0IG1lbW9yeS4KIAkgKi8KIAltYigpOyAvKiByZXF1aXJlZCBmb3IgY2hhbm5lbCBzeW5jaCAqLwotCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgdGFpbCkpIHsKLQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgVGFpbCBmYWlsZWRcbiIpOworCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgdGFpbCkpCiAJCXJldHVybiBGQUxTRTsKLQl9Ci0JaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBudW1fcmVjZWl2ZWQpKSB7Ci0JCUVSUkRSVigidmlzb3JfbWVtcmVnaW9uX3dyaXRlIG9mIE51bVNpZ25hbHNSZWNlaXZlZCBmYWlsZWRcbiIpOworCWlmICghU0lHX1dSSVRFX0ZJRUxEKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkciwgbnVtX3JlY2VpdmVkKSkKIAkJcmV0dXJuIEZBTFNFOwotCX0KIAlyZXR1cm4gVFJVRTsKIH0KIApAQCAtNDY2LDM1ICs0NDMsMzQgQEAKIHsKIAlzdHJ1Y3Qgc2lnbmFsX3F1ZXVlX2hlYWRlciBzaWdfaGRyOwogCi0JaWYgKCFzaWdfcmVhZF9oZWFkZXIoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyKSkgeworCWlmICghc2lnX3JlYWRfaGVhZGVyKGNoYW5uZWwsIHF1ZXVlLCAmc2lnX2hkcikpCiAJCXJldHVybiBGQUxTRTsKLQl9CiAKIAlzaWdfaGRyLmhlYWQgPSAoKHNpZ19oZHIuaGVhZCArIDEpICUgc2lnX2hkci5tYXhfc2xvdHMpOwogCWlmIChzaWdfaGRyLmhlYWQgPT0gc2lnX2hkci50YWlsKSB7CiAJCXNpZ19oZHIubnVtX292ZXJmbG93cysrOwotCQlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIG51bV9vdmVyZmxvd3MpKQotCQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fd3JpdGUgb2YgTnVtT3ZlcmZsb3dzIGZhaWxlZFxuIik7Ci0KKwkJdmlzb3JfbWVtcmVnaW9uX3dyaXRlKGNoYW5uZWwtPm1lbXJlZ2lvbiwKKwkJCQkgICAgICBTSUdfUVVFVUVfT0ZGU0VUKCZjaGFubmVsLT5jaGFuX2hkciwKKwkJCQkJCSAgICAgICBxdWV1ZSkgKworCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBzaWduYWxfcXVldWVfaGVhZGVyLAorCQkJCQkgICAgICAgbnVtX292ZXJmbG93cyksCisJCQkJICAgICAgJihzaWdfaGRyLm51bV9vdmVyZmxvd3MpLAorCQkJCSAgICAgIHNpemVvZihzaWdfaGRyLm51bV9vdmVyZmxvd3MpKTsKIAkJcmV0dXJuIEZBTFNFOwogCX0KIAotCWlmICghc2lnX3dyaXRlX2RhdGEoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBzaWdfaGRyLmhlYWQsIG1zZykpIHsKLQkJRVJSRFJWKCJzaWdfd3JpdGVfZGF0YSBmYWlsZWRcbiIpOworCWlmICghc2lnX3dyaXRlX2RhdGEoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBzaWdfaGRyLmhlYWQsIG1zZykpCiAJCXJldHVybiBGQUxTRTsKLQl9CisKIAlzaWdfaGRyLm51bV9zZW50Kys7CiAKIAkvKiBGb3IgZWFjaCBkYXRhIGZpZWxkIGluIFNJR05BTF9RVUVVRV9IRUFERVIgdGhhdCB3YXMgbW9kaWZpZWQsCiAJICogdXBkYXRlIGhvc3QgbWVtb3J5LgogCSAqLwogCW1iKCk7IC8qIHJlcXVpcmVkIGZvciBjaGFubmVsIHN5bmNoICovCi0JaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBoZWFkKSkgewotCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl93cml0ZSBvZiBIZWFkIGZhaWxlZFxuIik7CisJaWYgKCFTSUdfV1JJVEVfRklFTEQoY2hhbm5lbCwgcXVldWUsICZzaWdfaGRyLCBoZWFkKSkKIAkJcmV0dXJuIEZBTFNFOwotCX0KIAlpZiAoIVNJR19XUklURV9GSUVMRChjaGFubmVsLCBxdWV1ZSwgJnNpZ19oZHIsIG51bV9zZW50KSkgewotCQlFUlJEUlYoInZpc29yX21lbXJlZ2lvbl93cml0ZSBvZiBOdW1TaWduYWxzU2VudCBmYWlsZWRcbiIpOwogCQlyZXR1cm4gRkFMU0U7CiAJfQogCkBAIC01ODQsMTUgKzU2MCwxMiBAQAogCWludCBpID0gMDsKIAlpbnQgZXJyY29kZSA9IDA7CiAKLQlpZiAoY2hhbm5lbCA9PSBOVUxMKSB7Ci0JCUVSUkRSVigiJXMgbm8gY2hhbm5lbCIsIF9fZnVuY19fKTsKKwlpZiAoIWNoYW5uZWwpCiAJCXJldHVybjsKLQl9CiAJbWVtcmVnaW9uID0gY2hhbm5lbC0+bWVtcmVnaW9uOwotCWlmIChtZW1yZWdpb24gPT0gTlVMTCkgewotCQlFUlJEUlYoIiVzIG5vIG1lbXJlZ2lvbiIsIF9fZnVuY19fKTsKKwlpZiAoIW1lbXJlZ2lvbikKIAkJcmV0dXJuOwotCX0KKwogCWFkZHIgPSB2aXNvcl9tZW1yZWdpb25fZ2V0X3BoeXNhZGRyKG1lbXJlZ2lvbik7CiAJbmJ5dGVzX3JlZ2lvbiA9IHZpc29yX21lbXJlZ2lvbl9nZXRfbmJ5dGVzKG1lbXJlZ2lvbik7CiAJZXJyY29kZSA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW5uZWwsIG9mZiwKQEAgLTY3MiwxMSArNjQ1LDggQEAKIAkJZ290byBmbXRfZmFpbGVkOwogCiAJZXJyY29kZSA9IHZpc29yY2hhbm5lbF9yZWFkKGNoYW4sIG9mZiwgYnVmLCBsZW4pOwotCWlmIChlcnJjb2RlIDwgMCkgewotCQlFUlJEUlYoIiVzIGZhaWxlZCB0byByZWFkICVzIGZyb20gY2hhbm5lbCBlcnJjb2RlPSVkIiwKLQkJICAgICAgIHMsIF9fZnVuY19fLCBlcnJjb2RlKTsKKwlpZiAoZXJyY29kZSA8IDApCiAJCWdvdG8gcmVhZF9mYWlsZWQ7Ci0JfQogCXNlcV9wcmludGYoc2VxLCAiY2hhbm5lbCAlczpcbiIsIHMpOwogCXRidWYgPSBidWY7CiAJd2hpbGUgKGxlbiA+IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9tYWluLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hhbm5lbC92aXNvcmNoYW5uZWxfbWFpbi5jCmluZGV4IGY0YmUyZTYuLjc4N2Q0NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGFubmVsL3Zpc29yY2hhbm5lbF9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoYW5uZWwvdmlzb3JjaGFubmVsX21haW4uYwpAQCAtMzIsMTQgKzMyLDEyIEBACiAJaWYgKCF1bmlzeXNfc3Bhcl9wbGF0Zm9ybSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlJTkZPRFJWKCJkcml2ZXIgdmVyc2lvbiAlcyBsb2FkZWQiLCBWRVJTSU9OKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKIHZpc29yY2hhbm5lbF9leGl0KHZvaWQpCiB7Ci0JSU5GT0RSVigiZHJpdmVyIHVubG9hZGVkIik7CiB9CiAKIG1vZHVsZV9pbml0KHZpc29yY2hhbm5lbF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L0tjb25maWcgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9LY29uZmlnCmluZGV4IGU4NjgzNmYuLmIwM2JmYzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L0tjb25maWcKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvS2NvbmZpZwpAQCAtNCw3ICs0LDggQEAKIAogY29uZmlnIFVOSVNZU19WSVNPUkNISVBTRVQKIAl0cmlzdGF0ZSAiVW5pc3lzIHZpc29yY2hpcHNldCBkcml2ZXIiCi0JZGVwZW5kcyBvbiBVTklTWVNTUEFSICYmIFVOSVNZU19WSVNPUlVUSUwgJiYgVU5JU1lTX1ZJU09SQ0hBTk5FTCAmJiBIQVNfSU9NRU0KKwlzZWxlY3QgVU5JU1lTX1ZJU09SVVRJTAorCXNlbGVjdCBVTklTWVNfVklTT1JDSEFOTkVMCiAJLS0taGVscC0tLQogCUlmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBlbmFibGUgdGhlIFVuaXN5cyB2aXNvcmNoaXBzZXQgZHJpdmVyLgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxlLmMKaW5kZXggZTUxZmQ0ZS4uMjAzZGUwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuYwpAQCAtMzAsMTMgKzMwLDk3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2RldiBmaWxlX2NkZXY7CiBzdGF0aWMgc3RydWN0IHZpc29yY2hhbm5lbCAqKmZpbGVfY29udHJvbHZtX2NoYW5uZWw7Ci1zdGF0aWMgZGV2X3QgbWFqb3JkZXYgPSAtMTsgLyoqPCBpbmRpY2F0ZXMgbWFqb3IgbnVtIGZvciBkZXZpY2UgKi8KLXN0YXRpYyBCT09MIHJlZ2lzdGVyZWQgPSBGQUxTRTsKIAotc3RhdGljIGludCB2aXNvcmNoaXBzZXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IHZpc29yY2hpcHNldF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBpbnQgdmlzb3JjaGlwc2V0X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKLWxvbmcgdmlzb3JjaGlwc2V0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7Cit2b2lkCit2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKGRldl90IG1ham9yX2RldikKK3sKKwlpZiAoZmlsZV9jZGV2Lm9wcyAhPSBOVUxMKQorCQljZGV2X2RlbCgmZmlsZV9jZGV2KTsKKwlmaWxlX2NkZXYub3BzID0gTlVMTDsKKwl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24obWFqb3JfZGV2LCAxKTsKK30KKworc3RhdGljIGludAordmlzb3JjaGlwc2V0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgbWlub3JfbnVtYmVyID0gaW1pbm9yKGlub2RlKTsKKworCWlmIChtaW5vcl9udW1iZXIgIT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordmlzb3JjaGlwc2V0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Zpc29yY2hpcHNldF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwl1bG9uZyBwaHlzYWRkciA9IDA7CisJdWxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOworCUdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgYWRkciA9IDA7CisKKwkvKiBzdl9lbmFibGVfZGZwKCk7ICovCisJaWYgKG9mZnNldCAmIChQQUdFX1NJWkUgLSAxKSkKKwkJcmV0dXJuIC1FTlhJTzsJLyogbmVlZCBhbGlnbmVkIG9mZnNldHMgKi8KKworCXN3aXRjaCAob2Zmc2V0KSB7CisJY2FzZSBWSVNPUkNISVBTRVRfTU1BUF9DT05UUk9MQ0hBTk9GRlNFVDoKKwkJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKKwkJaWYgKCpmaWxlX2NvbnRyb2x2bV9jaGFubmVsID09IE5VTEwpIHsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwkJdmlzb3JjaGFubmVsX3JlYWQoKmZpbGVfY29udHJvbHZtX2NoYW5uZWwsCisJCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCQkgZ3BfY29udHJvbF9jaGFubmVsKSwKKwkJCSZhZGRyLCBzaXplb2YoYWRkcikpOworCQlpZiAoYWRkciA9PSAwKSB7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJCXBoeXNhZGRyID0gKHVsb25nKWFkZHI7CisJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCSAgICBwaHlzYWRkciA+PiBQQUdFX1NISUZULAorCQkJCSAgICB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkJICAgIC8qcGdwcm90X25vbmNhY2hlZCAqLworCQkJCSAgICAodm1hLT52bV9wYWdlX3Byb3QpKSkgeworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9TWVM7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgbG9uZyB2aXNvcmNoaXBzZXRfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCQkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJczY0IGFkanVzdG1lbnQ7CisJczY0IHZydGNfb2Zmc2V0OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFZNQ0FMTF9RVUVSWV9HVUVTVF9WSVJUVUFMX1RJTUVfT0ZGU0VUOgorCQkvKiBnZXQgdGhlIHBoeXNpY2FsIHJ0YyBvZmZzZXQgKi8KKwkJdnJ0Y19vZmZzZXQgPSBpc3N1ZV92bWNhbGxfcXVlcnlfZ3Vlc3RfdmlydHVhbF90aW1lX29mZnNldCgpOworCQlpZiAoY29weV90b191c2VyCisJCSAgICAoKHZvaWQgX191c2VyICopYXJnLCAmdnJ0Y19vZmZzZXQsIHNpemVvZih2cnRjX29mZnNldCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlyZXR1cm4gU1VDQ0VTUzsKKwljYXNlIFZNQ0FMTF9VUERBVEVfUEhZU0lDQUxfVElNRToKKwkJaWYgKGNvcHlfZnJvbV91c2VyCisJCSAgICAoJmFkanVzdG1lbnQsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKGFkanVzdG1lbnQpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcmV0dXJuIGlzc3VlX3ZtY2FsbF91cGRhdGVfcGh5c2ljYWxfdGltZShhZGp1c3RtZW50KTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9Cit9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpc29yY2hpcHNldF9mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLApAQCAtNTQsMTQ0ICsxMzgsMjMgQEAKIAlpbnQgcmMgPSAwOwogCiAJZmlsZV9jb250cm9sdm1fY2hhbm5lbCA9IGNvbnRyb2x2bV9jaGFubmVsOwotCW1ham9yZGV2ID0gbWFqb3JfZGV2OwogCWNkZXZfaW5pdCgmZmlsZV9jZGV2LCAmdmlzb3JjaGlwc2V0X2ZvcHMpOwogCWZpbGVfY2Rldi5vd25lciA9IFRISVNfTU9EVUxFOwotCWlmIChNQUpPUihtYWpvcmRldikgPT0gMCkgeworCWlmIChNQUpPUihtYWpvcl9kZXYpID09IDApIHsKKwkJcmMgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZtYWpvcl9kZXYsIDAsIDEsIE1ZRFJWTkFNRSk7CiAJCS8qIGR5bmFtaWMgbWFqb3IgZGV2aWNlIG51bWJlciByZWdpc3RyYXRpb24gcmVxdWlyZWQgKi8KLQkJaWYgKGFsbG9jX2NocmRldl9yZWdpb24oJm1ham9yZGV2LCAwLCAxLCBNWURSVk5BTUUpIDwgMCkgewotCQkJRVJSRFJWKCJVbmFibGUgdG8gYWxsb2NhdGUrcmVnaXN0ZXIgY2hhciBkZXZpY2UgJXMiLAotCQkJICAgICAgIE1ZRFJWTkFNRSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmVnaXN0ZXJlZCA9IFRSVUU7Ci0JCUlORk9EUlYoIk5ldyBtYWpvciBudW1iZXIgJWQgcmVnaXN0ZXJlZFxuIiwgTUFKT1IobWFqb3JkZXYpKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKIAl9IGVsc2UgewogCQkvKiBzdGF0aWMgbWFqb3IgZGV2aWNlIG51bWJlciByZWdpc3RyYXRpb24gcmVxdWlyZWQgKi8KLQkJaWYgKHJlZ2lzdGVyX2NocmRldl9yZWdpb24obWFqb3JkZXYsIDEsIE1ZRFJWTkFNRSkgPCAwKSB7Ci0JCQlFUlJEUlYoIlVuYWJsZSB0byByZWdpc3RlciBjaGFyIGRldmljZSAlcyIsIE1ZRFJWTkFNRSk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJcmVnaXN0ZXJlZCA9IFRSVUU7Ci0JCUlORk9EUlYoIlN0YXRpYyBtYWpvciBudW1iZXIgJWQgcmVnaXN0ZXJlZFxuIiwgTUFKT1IobWFqb3JkZXYpKTsKKwkJcmMgPSByZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKG1ham9yX2RldiwgMSwgTVlEUlZOQU1FKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKIAl9Ci0JcmMgPSBjZGV2X2FkZCgmZmlsZV9jZGV2LCBNS0RFVihNQUpPUihtYWpvcmRldiksIDApLCAxKTsKLQlpZiAocmMgIDwgMCkgewotCQlFUlJEUlYoImZhaWxlZCB0byBjcmVhdGUgY2hhciBkZXZpY2U6IChzdGF0dXM9JWQpXG4iLCByYyk7Ci0JCXJldHVybiAtMTsKKwlyYyA9IGNkZXZfYWRkKCZmaWxlX2NkZXYsIE1LREVWKE1BSk9SKG1ham9yX2RldiksIDApLCAxKTsKKwlpZiAocmMgPCAwKSB7CisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtYWpvcl9kZXYsIDEpOworCQlyZXR1cm4gcmM7CiAJfQotCUlORk9EUlYoIlJlZ2lzdGVyZWQgY2hhciBkZXZpY2UgZm9yICVzIChtYWpvcj0lZCkiLAotCQlNWURSVk5BTUUsIE1BSk9SKG1ham9yZGV2KSk7CiAJcmV0dXJuIDA7CiB9Ci0KLXZvaWQKLXZpc29yY2hpcHNldF9maWxlX2NsZWFudXAodm9pZCkKLXsKLQlpZiAoZmlsZV9jZGV2Lm9wcyAhPSBOVUxMKQotCQljZGV2X2RlbCgmZmlsZV9jZGV2KTsKLQlmaWxlX2NkZXYub3BzID0gTlVMTDsKLQlpZiAocmVnaXN0ZXJlZCkgewotCQlpZiAoTUFKT1IobWFqb3JkZXYpID49IDApIHsKLQkJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihtYWpvcmRldiwgMSk7Ci0JCQltYWpvcmRldiA9IE1LREVWKDAsIDApOwotCQl9Ci0JCXJlZ2lzdGVyZWQgPSBGQUxTRTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLXZpc29yY2hpcHNldF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXVuc2lnbmVkIG1pbm9yX251bWJlciA9IGltaW5vcihpbm9kZSk7Ci0KLQlERUJVR0RSVigiJXMiLCBfX2Z1bmNfXyk7Ci0JaWYgKG1pbm9yX251bWJlciAhPSAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci12aXNvcmNoaXBzZXRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlERUJVR0RSVigiJXMiLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLXZpc29yY2hpcHNldF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQl1bG9uZyBwaHlzYWRkciA9IDA7Ci0JdWxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwotCUdVRVNUX1BIWVNJQ0FMX0FERFJFU1MgYWRkciA9IDA7Ci0KLQkvKiBzdl9lbmFibGVfZGZwKCk7ICovCi0JREVCVUdEUlYoIiVzIiwgX19mdW5jX18pOwotCWlmIChvZmZzZXQgJiAoUEFHRV9TSVpFIC0gMSkpIHsKLQkJRVJSRFJWKCIlcyB2aXJ0dWFsIGFkZHJlc3MgTk9UIHBhZ2UtYWxpZ25lZCEiLCBfX2Z1bmNfXyk7Ci0JCXJldHVybiAtRU5YSU87CS8qIG5lZWQgYWxpZ25lZCBvZmZzZXRzICovCi0JfQotCXN3aXRjaCAob2Zmc2V0KSB7Ci0JY2FzZSBWSVNPUkNISVBTRVRfTU1BUF9DT05UUk9MQ0hBTk9GRlNFVDoKLQkJdm1hLT52bV9mbGFncyB8PSBWTV9JTzsKLQkJaWYgKCpmaWxlX2NvbnRyb2x2bV9jaGFubmVsID09IE5VTEwpIHsKLQkJCUVSUkRSVigiJXMgbm8gY29udHJvbHZtIGNoYW5uZWwgeWV0IiwgX19mdW5jX18pOwotCQkJcmV0dXJuIC1FTlhJTzsKLQkJfQotCQl2aXNvcmNoYW5uZWxfcmVhZCgqZmlsZV9jb250cm9sdm1fY2hhbm5lbCwKLQkJCW9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJCSBncF9jb250cm9sX2NoYW5uZWwpLAotCQkJJmFkZHIsIHNpemVvZihhZGRyKSk7Ci0JCWlmIChhZGRyID09IDApIHsKLQkJCUVSUkRSVigiJXMgY29udHJvbCBjaGFubmVsIGFkZHJlc3MgaXMgMCIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRU5YSU87Ci0JCX0KLQkJcGh5c2FkZHIgPSAodWxvbmcpYWRkcjsKLQkJREVCVUdEUlYoIm1hcHBpbmcgcGh5c2ljYWwgYWRkcmVzcyA9IDB4JWx4IiwgcGh5c2FkZHIpOwotCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKLQkJCQkgICAgcGh5c2FkZHIgPj4gUEFHRV9TSElGVCwKLQkJCQkgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAotCQkJCSAgICAvKnBncHJvdF9ub25jYWNoZWQgKi8KLQkJCQkgICAgKHZtYS0+dm1fcGFnZV9wcm90KSkpIHsKLQkJCUVSUkRSVigiJXMgcmVtYXBfcGZuX3JhbmdlIGZhaWxlZCIsIF9fZnVuY19fKTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRU5PU1lTOwotCX0KLQlERUJVR0RSVigiJXMgc3VjY2VzcyEiLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWxvbmcgdmlzb3JjaGlwc2V0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKLXsKLQlzNjQgYWRqdXN0bWVudDsKLQlzNjQgdnJ0Y19vZmZzZXQ7Ci0KLQlEQkdJTkYoImVudGVyZWQgdmlzb3JjaGlwc2V0X2lvY3RsLCBjbWQ9JWQiLCBjbWQpOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBWTUNBTExfUVVFUllfR1VFU1RfVklSVFVBTF9USU1FX09GRlNFVDoKLQkJLyogZ2V0IHRoZSBwaHlzaWNhbCBydGMgb2Zmc2V0ICovCi0JCXZydGNfb2Zmc2V0ID0gaXNzdWVfdm1jYWxsX3F1ZXJ5X2d1ZXN0X3ZpcnR1YWxfdGltZV9vZmZzZXQoKTsKLQkJaWYgKGNvcHlfdG9fdXNlcgotCQkgICAgKCh2b2lkIF9fdXNlciAqKWFyZywgJnZydGNfb2Zmc2V0LCBzaXplb2YodnJ0Y19vZmZzZXQpKSkgewotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0JCX0KLQkJREJHSU5GKCJpbnNkZSB2aXNvcmNoaXBzZXRfaW9jdGwsIGNtZD0lZCwgdnJ0Y19vZmZzZXQ9JWxsZCIsCi0JCSAgICAgICBjbWQsIHZydGNfb2Zmc2V0KTsKLQkJcmV0dXJuIFNVQ0NFU1M7Ci0JY2FzZSBWTUNBTExfVVBEQVRFX1BIWVNJQ0FMX1RJTUU6Ci0JCWlmIChjb3B5X2Zyb21fdXNlcgotCQkgICAgKCZhZGp1c3RtZW50LCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihhZGp1c3RtZW50KSkpIHsKLQkJCXJldHVybiAtRUZBVUxUOwotCQl9Ci0JCURCR0lORigiaW5zZGUgdmlzb3JjaGlwc2V0X2lvY3RsLCBjbWQ9JWQsIGFkanVzdG1lbnQ9JWxsZCIsIGNtZCwKLQkJICAgICAgIGFkanVzdG1lbnQpOwotCQlyZXR1cm4gaXNzdWVfdm1jYWxsX3VwZGF0ZV9waHlzaWNhbF90aW1lKGFkanVzdG1lbnQpOwotCWRlZmF1bHQ6Ci0JCUxPR0VSUigidmlzb3JjaGlwc2V0X2lvY3RsIHJlY2VpdmVkIGludmFsaWQgY29tbWFuZCIpOwotCQlyZXR1cm4gLUVGQVVMVDsKLQl9Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxlLmggYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9maWxlLmgKaW5kZXggZGM3YTE5NS4uNTFmNzY5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZmlsZS5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2ZpbGUuaApAQCAtMjIsNiArMjIsNiBAQAogCiBpbnQgdmlzb3JjaGlwc2V0X2ZpbGVfaW5pdChkZXZfdCBtYWpvckRldiwKIAkJCSAgIHN0cnVjdCB2aXNvcmNoYW5uZWwgKipwQ29udHJvbFZtX2NoYW5uZWwpOwotdm9pZCB2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKHZvaWQpOwordm9pZCB2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKGRldl90IG1ham9yX2Rldik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZ2xvYmFscy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvZ2xvYmFscy5oCmluZGV4IGExZDM1ZDQuLmY3NmU0OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L2dsb2JhbHMuaAorKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9nbG9iYWxzLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNpZm5kZWYgX19WSVNPUkNISVBTRVRfR0xPQkFMU19IX18KICNkZWZpbmUgX19WSVNPUkNISVBTRVRfR0xPQkFMU19IX18KIAotI2luY2x1ZGUgInVuaWtsb2cuaCIKICNpbmNsdWRlICJkaWFnbm9zdGljcy9hcHBvc19zdWJzeXN0ZW1zLmgiCiAjaW5jbHVkZSAidGltc2ttb2QuaCIKICNpbmNsdWRlICJ2aXNvcmNoaXBzZXQuaCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmMKaW5kZXggOWVkYmQzYi4uZDhhMmQ2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvcGFyc2VyLmMKQEAgLTI5LDkgKzI5LDkgQEAKICAqIGluY29taW5nIHBheWxvYWRzLiAgVGhpcyBzZXJ2ZXMgYXMgYSB0aHJvdHRsaW5nIG1lY2hhbmlzbS4KICAqLwogI2RlZmluZSBNQVhfQ09OVFJPTFZNX1BBWUxPQURfQllURVMgKDEwMjQqMTI4KQotc3RhdGljIHVsb25nIENvbnRyb2x2bV9QYXlsb2FkX0J5dGVzX0J1ZmZlcmVkOworc3RhdGljIHVsb25nIGNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkOwogCi1zdHJ1Y3QgUEFSU0VSX0NPTlRFWFRfVGFnIHsKK3N0cnVjdCBwYXJzZXJfY29udGV4dCB7CiAJdWxvbmcgYWxsb2NieXRlczsKIAl1bG9uZyBwYXJhbV9ieXRlczsKIAl1OCAqY3VycjsKQEAgLTQwLDQxICs0MCwzNiBAQAogCWNoYXIgZGF0YVswXTsKIH07CiAKLXN0YXRpYyBQQVJTRVJfQ09OVEVYVCAqCi1wYXJzZXJfaW5pdF9ndXRzKHU2NCBhZGRyLCB1MzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwKLQkJIEJPT0wgaGFzU3RhbmRhcmRQYXlsb2FkSGVhZGVyLCBCT09MICp0cnlBZ2FpbikKK3N0YXRpYyBzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKgorcGFyc2VyX2luaXRfZ3V0cyh1NjQgYWRkciwgdTMyIGJ5dGVzLCBCT09MIGxvY2FsLAorCQkgQk9PTCBzdGFuZGFyZF9wYXlsb2FkX2hlYWRlciwgQk9PTCAqcmV0cnkpCiB7Ci0JaW50IGFsbG9jYnl0ZXMgPSBzaXplb2YoUEFSU0VSX0NPTlRFWFQpICsgYnl0ZXM7Ci0JUEFSU0VSX0NPTlRFWFQgKnJjID0gTlVMTDsKLQlQQVJTRVJfQ09OVEVYVCAqY3R4ID0gTlVMTDsKKwlpbnQgYWxsb2NieXRlcyA9IHNpemVvZihzdHJ1Y3QgcGFyc2VyX2NvbnRleHQpICsgYnl0ZXM7CisJc3RydWN0IHBhcnNlcl9jb250ZXh0ICpyYyA9IE5VTEw7CisJc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHggPSBOVUxMOwogCXN0cnVjdCBtZW1yZWdpb24gKnJnbiA9IE5VTEw7CiAJc3RydWN0IHNwYXJfY29udHJvbHZtX3BhcmFtZXRlcnNfaGVhZGVyICpwaGRyID0gTlVMTDsKIAotCWlmICh0cnlBZ2FpbikKLQkJKnRyeUFnYWluID0gRkFMU0U7Ci0JaWYgKCFoYXNTdGFuZGFyZFBheWxvYWRIZWFkZXIpCisJaWYgKHJldHJ5KQorCQkqcmV0cnkgPSBGQUxTRTsKKwlpZiAoIXN0YW5kYXJkX3BheWxvYWRfaGVhZGVyKQogCQkvKiBhbGxvYyBhbmQgMCBleHRyYSBieXRlIHRvIGVuc3VyZSBwYXlsb2FkIGlzCiAJCSAqICdcMCctdGVybWluYXRlZAogCQkgKi8KIAkJYWxsb2NieXRlcysrOwotCWlmICgoQ29udHJvbHZtX1BheWxvYWRfQnl0ZXNfQnVmZmVyZWQgKyBieXRlcykKKwlpZiAoKGNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkICsgYnl0ZXMpCiAJICAgID4gTUFYX0NPTlRST0xWTV9QQVlMT0FEX0JZVEVTKSB7Ci0JCUVSUkRSVigiJXMgKCVzOiVkKSAtIHByZXZlbnRlZCBhbGxvY2F0aW9uIG9mICVkIGJ5dGVzIHRvIHByZXZlbnQgZXhjZWVkaW5nIHRocm90dGxpbmcgbWF4ICglZCkiLAotCQkgICAgICAgX19mdW5jX18sIF9fRklMRV9fLCBfX0xJTkVfXywgYWxsb2NieXRlcywKLQkJICAgICAgIE1BWF9DT05UUk9MVk1fUEFZTE9BRF9CWVRFUyk7Ci0JCWlmICh0cnlBZ2FpbikKLQkJCSp0cnlBZ2FpbiA9IFRSVUU7CisJCWlmIChyZXRyeSkKKwkJCSpyZXRyeSA9IFRSVUU7CiAJCXJjID0gTlVMTDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQogCWN0eCA9IGt6YWxsb2MoYWxsb2NieXRlcywgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKLQlpZiAoY3R4ID09IE5VTEwpIHsKLQkJRVJSRFJWKCIlcyAoJXM6JWQpIC0gZmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIiwKLQkJICAgICAgIF9fZnVuY19fLCBfX0ZJTEVfXywgX19MSU5FX18sIGFsbG9jYnl0ZXMpOwotCQlpZiAodHJ5QWdhaW4pCi0JCQkqdHJ5QWdhaW4gPSBUUlVFOworCWlmICghY3R4KSB7CisJCWlmIChyZXRyeSkKKwkJCSpyZXRyeSA9IFRSVUU7CiAJCXJjID0gTlVMTDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJY3R4LT5hbGxvY2J5dGVzID0gYWxsb2NieXRlczsKQEAgLTgyLDE1ICs3NywxMiBAQAogCWN0eC0+Y3VyciA9IE5VTEw7CiAJY3R4LT5ieXRlc19yZW1haW5pbmcgPSAwOwogCWN0eC0+Ynl0ZV9zdHJlYW0gPSBGQUxTRTsKLQlpZiAoaXNMb2NhbCkgeworCWlmIChsb2NhbCkgewogCQl2b2lkICpwOwogCiAJCWlmIChhZGRyID4gdmlydF90b19waHlzKGhpZ2hfbWVtb3J5IC0gMSkpIHsKLQkJCUVSUkRSVigiJXMgLSBiYWQgbG9jYWwgYWRkcmVzcyAoMHglLTE2LjE2THggZm9yICVsdSkiLAotCQkJICAgICAgIF9fZnVuY19fLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFkZHIsICh1bG9uZykgYnl0ZXMpOwogCQkJcmMgPSBOVUxMOwotCQkJZ290byBBd2F5OworCQkJZ290byBjbGVhbnVwOwogCQl9CiAJCXAgPSBfX3ZhKCh1bG9uZykgKGFkZHIpKTsKIAkJbWVtY3B5KGN0eC0+ZGF0YSwgcCwgYnl0ZXMpOwpAQCAtOTgsNTQgKzkwLDQyIEBACiAJCXJnbiA9IHZpc29yX21lbXJlZ2lvbl9jcmVhdGUoYWRkciwgYnl0ZXMpOwogCQlpZiAoIXJnbikgewogCQkJcmMgPSBOVUxMOwotCQkJZ290byBBd2F5OworCQkJZ290byBjbGVhbnVwOwogCQl9CiAJCWlmICh2aXNvcl9tZW1yZWdpb25fcmVhZChyZ24sIDAsIGN0eC0+ZGF0YSwgYnl0ZXMpIDwgMCkgewogCQkJcmMgPSBOVUxMOwotCQkJZ290byBBd2F5OworCQkJZ290byBjbGVhbnVwOwogCQl9CiAJfQotCWlmICghaGFzU3RhbmRhcmRQYXlsb2FkSGVhZGVyKSB7CisJaWYgKCFzdGFuZGFyZF9wYXlsb2FkX2hlYWRlcikgewogCQljdHgtPmJ5dGVfc3RyZWFtID0gVFJVRTsKIAkJcmMgPSBjdHg7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAlwaGRyID0gKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9wYXJhbWV0ZXJzX2hlYWRlciAqKShjdHgtPmRhdGEpOwogCWlmIChwaGRyLT50b3RhbF9sZW5ndGggIT0gYnl0ZXMpIHsKLQkJRVJSRFJWKCIlcyAtIGJhZCB0b3RhbCBsZW5ndGggJWx1IChzaG91bGQgYmUgJWx1KSIsCi0JCSAgICAgICBfX2Z1bmNfXywKLQkJICAgICAgICh1bG9uZykgKHBoZHItPnRvdGFsX2xlbmd0aCksICh1bG9uZykgKGJ5dGVzKSk7CiAJCXJjID0gTlVMTDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQogCWlmIChwaGRyLT50b3RhbF9sZW5ndGggPCBwaGRyLT5oZWFkZXJfbGVuZ3RoKSB7Ci0JCUVSUkRSVigiJXMgLSB0b3RhbCBsZW5ndGggPCBoZWFkZXIgbGVuZ3RoICglbHUgPCAlbHUpIiwKLQkJICAgICAgIF9fZnVuY19fLAotCQkgICAgICAgKHVsb25nKSAocGhkci0+dG90YWxfbGVuZ3RoKSwKLQkJICAgICAgICh1bG9uZykgKHBoZHItPmhlYWRlcl9sZW5ndGgpKTsKIAkJcmMgPSBOVUxMOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAJaWYgKHBoZHItPmhlYWRlcl9sZW5ndGggPAogCSAgICBzaXplb2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX3BhcmFtZXRlcnNfaGVhZGVyKSkgewotCQlFUlJEUlYoIiVzIC0gaGVhZGVyIGlzIHRvbyBzbWFsbCAoJWx1IDwgJWx1KSIsCi0JCSAgICAgICBfX2Z1bmNfXywKLQkJICAgICAgICh1bG9uZykgKHBoZHItPmhlYWRlcl9sZW5ndGgpLAotCQkgICAgICAgKHVsb25nKShzaXplb2YoCi0JCQkJc3RydWN0IHNwYXJfY29udHJvbHZtX3BhcmFtZXRlcnNfaGVhZGVyKSkpOwogCQlyYyA9IE5VTEw7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCXJjID0gY3R4OwotQXdheToKK2NsZWFudXA6CiAJaWYgKHJnbikgewogCQl2aXNvcl9tZW1yZWdpb25fZGVzdHJveShyZ24pOwogCQlyZ24gPSBOVUxMOwogCX0KLQlpZiAocmMpCi0JCUNvbnRyb2x2bV9QYXlsb2FkX0J5dGVzX0J1ZmZlcmVkICs9IGN0eC0+cGFyYW1fYnl0ZXM7Ci0JZWxzZSB7CisJaWYgKHJjKSB7CisJCWNvbnRyb2x2bV9wYXlsb2FkX2J5dGVzX2J1ZmZlcmVkICs9IGN0eC0+cGFyYW1fYnl0ZXM7CisJfSBlbHNlIHsKIAkJaWYgKGN0eCkgewogCQkJcGFyc2VyX2RvbmUoY3R4KTsKIAkJCWN0eCA9IE5VTEw7CkBAIC0xNTQsMTAgKzEzNCwxMCBAQAogCXJldHVybiByYzsKIH0KIAotUEFSU0VSX0NPTlRFWFQgKgotcGFyc2VyX2luaXQodTY0IGFkZHIsIHUzMiBieXRlcywgQk9PTCBpc0xvY2FsLCBCT09MICp0cnlBZ2FpbikKK3N0cnVjdCBwYXJzZXJfY29udGV4dCAqCitwYXJzZXJfaW5pdCh1NjQgYWRkciwgdTMyIGJ5dGVzLCBCT09MIGxvY2FsLCBCT09MICpyZXRyeSkKIHsKLQlyZXR1cm4gcGFyc2VyX2luaXRfZ3V0cyhhZGRyLCBieXRlcywgaXNMb2NhbCwgVFJVRSwgdHJ5QWdhaW4pOworCXJldHVybiBwYXJzZXJfaW5pdF9ndXRzKGFkZHIsIGJ5dGVzLCBsb2NhbCwgVFJVRSwgcmV0cnkpOwogfQogCiAvKiBDYWxsIHRoaXMgaW5zdGVhZCBvZiBwYXJzZXJfaW5pdCgpIGlmIHRoZSBwYXlsb2FkIGFyZWEgY29uc2lzdHMgb2YganVzdApAQCAtMTY1LDE2ICsxNDUsMTYgQEAKICAqIHN0cnVjdHVyZXMuICBBZnRlcndhcmRzLCB5b3UgY2FuIGNhbGwgcGFyc2VyX3NpbXBsZVN0cmluZ19nZXQoKSBvcgogICogcGFyc2VyX2J5dGVTdHJlYW1fZ2V0KCkgdG8gb2J0YWluIHRoZSBkYXRhLgogICovCi1QQVJTRVJfQ09OVEVYVCAqCi1wYXJzZXJfaW5pdF9ieXRlU3RyZWFtKHU2NCBhZGRyLCB1MzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwgQk9PTCAqdHJ5QWdhaW4pCitzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKgorcGFyc2VyX2luaXRfYnl0ZV9zdHJlYW0odTY0IGFkZHIsIHUzMiBieXRlcywgQk9PTCBsb2NhbCwgQk9PTCAqcmV0cnkpCiB7Ci0JcmV0dXJuIHBhcnNlcl9pbml0X2d1dHMoYWRkciwgYnl0ZXMsIGlzTG9jYWwsIEZBTFNFLCB0cnlBZ2Fpbik7CisJcmV0dXJuIHBhcnNlcl9pbml0X2d1dHMoYWRkciwgYnl0ZXMsIGxvY2FsLCBGQUxTRSwgcmV0cnkpOwogfQogCiAvKiBPYnRhaW4gJ1wwJy10ZXJtaW5hdGVkIGNvcHkgb2Ygc3RyaW5nIGluIHBheWxvYWQgYXJlYS4KICAqLwogY2hhciAqCi1wYXJzZXJfc2ltcGxlU3RyaW5nX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4KQorcGFyc2VyX3NpbXBsZVN0cmluZ19nZXQoc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHgpCiB7CiAJaWYgKCFjdHgtPmJ5dGVfc3RyZWFtKQogCQlyZXR1cm4gTlVMTDsKQEAgLTE4NSw0MCArMTY1LDMzIEBACiAKIC8qIE9idGFpbiBhIGNvcHkgb2YgdGhlIGJ1ZmZlciBpbiB0aGUgcGF5bG9hZCBhcmVhLgogICovCi12b2lkICoKLXBhcnNlcl9ieXRlU3RyZWFtX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4LCB1bG9uZyAqbmJ5dGVzKQordm9pZCAqcGFyc2VyX2J5dGVfc3RyZWFtX2dldChzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCwgdWxvbmcgKm5ieXRlcykKIHsKIAlpZiAoIWN0eC0+Ynl0ZV9zdHJlYW0pCiAJCXJldHVybiBOVUxMOwogCWlmIChuYnl0ZXMpCiAJCSpuYnl0ZXMgPSBjdHgtPnBhcmFtX2J5dGVzOwotCXJldHVybiAodm9pZCAqKSBjdHgtPmRhdGE7CisJcmV0dXJuICh2b2lkICopY3R4LT5kYXRhOwogfQogCiB1dWlkX2xlCi1wYXJzZXJfaWRfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpCitwYXJzZXJfaWRfZ2V0KHN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4KQogewogCXN0cnVjdCBzcGFyX2NvbnRyb2x2bV9wYXJhbWV0ZXJzX2hlYWRlciAqcGhkciA9IE5VTEw7CiAKLQlpZiAoY3R4ID09IE5VTEwpIHsKLQkJRVJSRFJWKCIlcyAoJXM6JWQpIC0gbm8gY29udGV4dCIsCi0JCSAgICAgICBfX2Z1bmNfXywgX19GSUxFX18sIF9fTElORV9fKTsKKwlpZiAoY3R4ID09IE5VTEwpCiAJCXJldHVybiBOVUxMX1VVSURfTEU7Ci0JfQogCXBoZHIgPSAoc3RydWN0IHNwYXJfY29udHJvbHZtX3BhcmFtZXRlcnNfaGVhZGVyICopKGN0eC0+ZGF0YSk7CiAJcmV0dXJuIHBoZHItPmlkOwogfQogCiB2b2lkCi1wYXJzZXJfcGFyYW1fc3RhcnQoUEFSU0VSX0NPTlRFWFQgKmN0eCwgUEFSU0VSX1dISUNIX1NUUklORyB3aGljaF9zdHJpbmcpCitwYXJzZXJfcGFyYW1fc3RhcnQoc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHgsIFBBUlNFUl9XSElDSF9TVFJJTkcgd2hpY2hfc3RyaW5nKQogewogCXN0cnVjdCBzcGFyX2NvbnRyb2x2bV9wYXJhbWV0ZXJzX2hlYWRlciAqcGhkciA9IE5VTEw7CiAKLQlpZiAoY3R4ID09IE5VTEwpIHsKLQkJRVJSRFJWKCIlcyAoJXM6JWQpIC0gbm8gY29udGV4dCIsCi0JCSAgICAgICBfX2Z1bmNfXywgX19GSUxFX18sIF9fTElORV9fKTsKKwlpZiAoY3R4ID09IE5VTEwpCiAJCWdvdG8gQXdheTsKLQl9CiAJcGhkciA9IChzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fcGFyYW1ldGVyc19oZWFkZXIgKikoY3R4LT5kYXRhKTsKIAlzd2l0Y2ggKHdoaWNoX3N0cmluZykgewogCWNhc2UgUEFSU0VSU1RSSU5HX0lOSVRJQVRPUjoKQEAgLTIzOCw3ICsyMTEsNiBAQAogCQljdHgtPmJ5dGVzX3JlbWFpbmluZyA9IHBoZHItPm5hbWVfbGVuZ3RoOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlFUlJEUlYoIiVzIC0gYmFkIHdoaWNoX3N0cmluZyAlZCIsIF9fZnVuY19fLCB3aGljaF9zdHJpbmcpOwogCQlicmVhazsKIAl9CiAKQEAgLTI0NywxMSArMjE5LDExIEBACiB9CiAKIHZvaWQKLXBhcnNlcl9kb25lKFBBUlNFUl9DT05URVhUICpjdHgpCitwYXJzZXJfZG9uZShzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCkKIHsKIAlpZiAoIWN0eCkKIAkJcmV0dXJuOwotCUNvbnRyb2x2bV9QYXlsb2FkX0J5dGVzX0J1ZmZlcmVkIC09IGN0eC0+cGFyYW1fYnl0ZXM7CisJY29udHJvbHZtX3BheWxvYWRfYnl0ZXNfYnVmZmVyZWQgLT0gY3R4LT5wYXJhbV9ieXRlczsKIAlrZnJlZShjdHgpOwogfQogCkBAIC0yOTAsNyArMjYyLDcgQEAKICAqICAgIHBhcmFtZXRlcgogICovCiB2b2lkICoKLXBhcnNlcl9wYXJhbV9nZXQoUEFSU0VSX0NPTlRFWFQgKmN0eCwgY2hhciAqbmFtLCBpbnQgbmFtZXNpemUpCitwYXJzZXJfcGFyYW1fZ2V0KHN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4LCBjaGFyICpuYW0sIGludCBuYW1lc2l6ZSkKIHsKIAl1OCAqcHNjYW4sICpwbmFtID0gbmFtOwogCXVsb25nIG5zY2FuOwpAQCAtMzIxLDI1ICsyOTMsMTggQEAKIAl9CiAKIAl3aGlsZSAoKnBzY2FuICE9ICc6JykgewotCQlpZiAobmFtZXNpemUgPD0gMCkgewotCQkJRVJSRFJWKCIlcyAtIG5hbWUgdG9vIGJpZyIsIF9fZnVuY19fKTsKKwkJaWYgKG5hbWVzaXplIDw9IDApCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQogCQkqcG5hbSA9IHRvdXBwZXIoKnBzY2FuKTsKIAkJcG5hbSsrOwogCQluYW1lc2l6ZS0tOwogCQlwc2NhbisrOwogCQluc2Nhbi0tOwotCQlpZiAobnNjYW4gPT0gMCkgewotCQkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IHBhcnNpbmcgbmFtZSIsCi0JCQkgICAgICAgX19mdW5jX18pOworCQlpZiAobnNjYW4gPT0gMCkKIAkJCXJldHVybiBOVUxMOwotCQl9CiAJfQotCWlmIChuYW1lc2l6ZSA8PSAwKSB7Ci0JCUVSUkRSVigiJXMgLSBuYW1lIHRvbyBiaWciLCBfX2Z1bmNfXyk7CisJaWYgKG5hbWVzaXplIDw9IDApCiAJCXJldHVybiBOVUxMOwotCX0KIAkqcG5hbSA9ICdcMCc7CiAJbmFtW3N0cmluZ19sZW5ndGhfbm9fdHJhaWwobmFtLCBzdHJsZW4obmFtKSldID0gJ1wwJzsKIApAQCAtMzUwLDI2ICszMTUsMTcgQEAKIAl3aGlsZSAoaXNzcGFjZSgqcHNjYW4pKSB7CiAJCXBzY2FuKys7CiAJCW5zY2FuLS07Ci0JCWlmIChuc2NhbiA9PSAwKSB7Ci0JCQlFUlJEUlYoIiVzIC0gdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgbG9va2luZyBmb3IgdmFsdWUiLAotCQkJICAgICAgIF9fZnVuY19fKTsKKwkJaWYgKG5zY2FuID09IDApCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQogCX0KLQlpZiAobnNjYW4gPT0gMCkgewotCQlFUlJEUlYoIiVzIC0gdW5leHBlY3RlZCBlbmQgb2YgaW5wdXQgbG9va2luZyBmb3IgdmFsdWUiLAotCQkgICAgICAgX19mdW5jX18pOworCWlmIChuc2NhbiA9PSAwKQogCQlyZXR1cm4gTlVMTDsKLQl9CiAJaWYgKCpwc2NhbiA9PSAnXCcnIHx8ICpwc2NhbiA9PSAnIicpIHsKIAkJY2xvc2luZ19xdW90ZSA9ICpwc2NhbjsKIAkJcHNjYW4rKzsKIAkJbnNjYW4tLTsKLQkJaWYgKG5zY2FuID09IDApIHsKLQkJCUVSUkRSVigiJXMgLSB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBhZnRlciAlYyIsCi0JCQkgICAgICAgX19mdW5jX18sIGNsb3NpbmdfcXVvdGUpOworCQlpZiAobnNjYW4gPT0gMCkKIAkJCXJldHVybiBOVUxMOwotCQl9CiAJfQogCiAJLyogbG9vayBmb3IgYSBzZXBhcmF0b3IgY2hhcmFjdGVyLCB0ZXJtaW5hdG9yIGNoYXJhY3Rlciwgb3IKQEAgLTM3NywxMCArMzMzLDggQEAKIAkgKi8KIAlmb3IgKGkgPSAwLCB2YWx1ZV9sZW5ndGggPSAtMTsgaSA8IG5zY2FuOyBpKyspIHsKIAkJaWYgKGNsb3NpbmdfcXVvdGUpIHsKLQkJCWlmIChwc2NhbltpXSA9PSAnXDAnKSB7Ci0JCQkJRVJSRFJWKCIlcyAtIHVuZXhwZWN0ZWQgZW5kIG9mIGlucHV0IHBhcnNpbmcgcXVvdGVkIHZhbHVlIiwgX19mdW5jX18pOworCQkJaWYgKHBzY2FuW2ldID09ICdcMCcpCiAJCQkJcmV0dXJuIE5VTEw7Ci0JCQl9CiAJCQlpZiAocHNjYW5baV0gPT0gY2xvc2luZ19xdW90ZSkgewogCQkJCXZhbHVlX2xlbmd0aCA9IGk7CiAJCQkJYnJlYWs7CkBAIC0zOTMsMTAgKzM0Nyw4IEBACiAJCX0KIAl9CiAJaWYgKHZhbHVlX2xlbmd0aCA8IDApIHsKLQkJaWYgKGNsb3NpbmdfcXVvdGUpIHsKLQkJCUVSUkRSVigiJXMgLSB1bmV4cGVjdGVkIGVuZCBvZiBpbnB1dCBwYXJzaW5nIHF1b3RlZCB2YWx1ZSIsIF9fZnVuY19fKTsKKwkJaWYgKGNsb3NpbmdfcXVvdGUpCiAJCQlyZXR1cm4gTlVMTDsKLQkJfQogCQl2YWx1ZV9sZW5ndGggPSBuc2NhbjsKIAl9CiAJb3JpZ192YWx1ZV9sZW5ndGggPSB2YWx1ZV9sZW5ndGg7CkBAIC00MzMsNyArMzg1LDYgQEAKIAkJCQlwc2NhbisrOwogCQkJCW5zY2FuLS07CiAJCQl9IGVsc2UgaWYgKCpwc2NhbiAhPSAnXDAnKSB7Ci0JCQkJRVJSRFJWKCIlcyAtIG1pc3Npbmcgc2VwYXJhdG9yIGFmdGVyIHF1b3RlZCBzdHJpbmciLCBfX2Z1bmNfXyk7CiAJCQkJa2ZyZWUodmFsdWUpOwogCQkJCXZhbHVlID0gTlVMTDsKIAkJCQlyZXR1cm4gTlVMTDsKQEAgLTQ0Niw3ICszOTcsNyBAQAogfQogCiB2b2lkICoKLXBhcnNlcl9zdHJpbmdfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpCitwYXJzZXJfc3RyaW5nX2dldChzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCkKIHsKIAl1OCAqcHNjYW47CiAJdWxvbmcgbnNjYW47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC9wYXJzZXIuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5oCmluZGV4IDlmYmUzYjUuLjJiOTAzZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3BhcnNlci5oCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlIDxsaW51eC91dWlkLmg+CiAKLSNpbmNsdWRlICJ1bmlrbG9nLmgiCiAjaW5jbHVkZSAidGltc2ttb2QuaCIKICNpbmNsdWRlICJjaGFubmVsLmgiCiAKQEAgLTMxLDE3ICszMCwxNyBAQAogCVBBUlNFUlNUUklOR19OQU1FLAogfSBQQVJTRVJfV0hJQ0hfU1RSSU5HOwogCi10eXBlZGVmIHN0cnVjdCBQQVJTRVJfQ09OVEVYVF9UYWcgUEFSU0VSX0NPTlRFWFQ7Ci0KLVBBUlNFUl9DT05URVhUICpwYXJzZXJfaW5pdCh1NjQgYWRkciwgdTMyIGJ5dGVzLCBCT09MIGlzTG9jYWwsIEJPT0wgKnRyeUFnYWluKTsKLVBBUlNFUl9DT05URVhUICpwYXJzZXJfaW5pdF9ieXRlU3RyZWFtKHU2NCBhZGRyLCB1MzIgYnl0ZXMsIEJPT0wgaXNMb2NhbCwKLQkJCQkgICAgICAgQk9PTCAqdHJ5QWdhaW4pOwotdm9pZCBwYXJzZXJfcGFyYW1fc3RhcnQoUEFSU0VSX0NPTlRFWFQgKmN0eCwgUEFSU0VSX1dISUNIX1NUUklORyB3aGljaF9zdHJpbmcpOwotdm9pZCAqcGFyc2VyX3BhcmFtX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4LCBjaGFyICpuYW0sIGludCBuYW1lc2l6ZSk7Ci12b2lkICpwYXJzZXJfc3RyaW5nX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4KTsKLXV1aWRfbGUgcGFyc2VyX2lkX2dldChQQVJTRVJfQ09OVEVYVCAqY3R4KTsKLWNoYXIgKnBhcnNlcl9zaW1wbGVTdHJpbmdfZ2V0KFBBUlNFUl9DT05URVhUICpjdHgpOwotdm9pZCAqcGFyc2VyX2J5dGVTdHJlYW1fZ2V0KFBBUlNFUl9DT05URVhUICpjdHgsIHVsb25nICpuYnl0ZXMpOwotdm9pZCBwYXJzZXJfZG9uZShQQVJTRVJfQ09OVEVYVCAqY3R4KTsKK3N0cnVjdCBwYXJzZXJfY29udGV4dCAqcGFyc2VyX2luaXQodTY0IGFkZHIsIHUzMiBieXRlcywgQk9PTCBpc0xvY2FsLAorCQkJCSAgIEJPT0wgKnRyeUFnYWluKTsKK3N0cnVjdCBwYXJzZXJfY29udGV4dCAqcGFyc2VyX2luaXRfYnl0ZV9zdHJlYW0odTY0IGFkZHIsIHUzMiBieXRlcywgQk9PTCBsb2NhbCwKKwkJCQkgICAgICAgQk9PTCAqcmV0cnkpOwordm9pZCBwYXJzZXJfcGFyYW1fc3RhcnQoc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHgsCisJCQlQQVJTRVJfV0hJQ0hfU1RSSU5HIHdoaWNoX3N0cmluZyk7Cit2b2lkICpwYXJzZXJfcGFyYW1fZ2V0KHN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4LCBjaGFyICpuYW0sIGludCBuYW1lc2l6ZSk7Cit2b2lkICpwYXJzZXJfc3RyaW5nX2dldChzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCk7Cit1dWlkX2xlIHBhcnNlcl9pZF9nZXQoc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHgpOworY2hhciAqcGFyc2VyX3NpbXBsZVN0cmluZ19nZXQoc3RydWN0IHBhcnNlcl9jb250ZXh0ICpjdHgpOwordm9pZCAqcGFyc2VyX2J5dGVfc3RyZWFtX2dldChzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKmN0eCwgdWxvbmcgKm5ieXRlcyk7Cit2b2lkIHBhcnNlcl9kb25lKHN0cnVjdCBwYXJzZXJfY29udGV4dCAqY3R4KTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29yY2hpcHNldC92aXNvcmNoaXBzZXQuaCBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldC5oCmluZGV4IDk4ZjNiYTQuLmJkNDZkZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldC5oCkBAIC0xMzMsNyArMTMzLDYgQEAKIAl1OCAqZGVzY3JpcHRpb247CS8qIFVURjggKi8KIAl1NjQgcmVzZXJ2ZWQxOwogCXUzMiByZXNlcnZlZDI7Ci0JTVlQUk9DT0JKRUNUICpwcm9jX29iamVjdDsKIAlzdHJ1Y3QgewogCQl1MzIgc2VydmVyOjE7CiAJCS8qIEFkZCBuZXcgZmllbGRzIGFib3ZlLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldF9tYWluLmMKaW5kZXggZjYwNmVlOS4uZjI2NjNkMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3JjaGlwc2V0L3Zpc29yY2hpcHNldF9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcmNoaXBzZXQvdmlzb3JjaGlwc2V0X21haW4uYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgInBlcmlvZGljX3dvcmsuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAicGFyc2VyLmgiCi0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgInVpc3V0aWxzLmgiCiAjaW5jbHVkZSAiY29udHJvbHZtY29tcGxldGlvbnN0YXR1cy5oIgogI2luY2x1ZGUgImd1ZXN0bGludXhkZWJ1Zy5oIgpAQCAtNDksOCArNDgsOCBAQAogKiBtZXNzYWdlLCB3ZSBzd2l0Y2ggYmFjayB0byBmYXN0IHBvbGxpbmcgbW9kZS4KICovCiAjZGVmaW5lIE1JTl9JRExFX1NFQ09ORFMgMTAKLXN0YXRpYyB1bG9uZyBQb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1Q7Ci1zdGF0aWMgdWxvbmcgTW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzOwkvKiB3aGVuIHdlIGdvdCBvdXIgbGFzdAorc3RhdGljIHVsb25nIHBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKK3N0YXRpYyB1bG9uZyBtb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXM7CS8qIHdoZW4gd2UgZ290IG91ciBsYXN0CiAJCQkJCQkgKiBjb250cm9sdm0gbWVzc2FnZSAqLwogc3RhdGljIGlubGluZSBjaGFyICoKIE5PTlVMTFNUUihjaGFyICpzKQpAQCAtNjYsODMgKzY1LDc0IEBACiAjZGVmaW5lIE1BWF9DSElQU0VUX0VWRU5UUyAyCiBzdGF0aWMgdTggY2hpcHNldF9ldmVudHNbTUFYX0NISVBTRVRfRVZFTlRTXSA9IHsgMCwgMCB9OwogCi1zdGF0aWMgc3RydWN0IGRlbGF5ZWRfd29yayBQZXJpb2RpY19jb250cm9sdm1fd29yazsKLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZTsKLXN0YXRpYyBERUZJTkVfU0VNQVBIT1JFKE5vdGlmaWVyTG9jayk7CitzdGF0aWMgc3RydWN0IGRlbGF5ZWRfd29yayBwZXJpb2RpY19jb250cm9sdm1fd29yazsKK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqcGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZTsKK3N0YXRpYyBERUZJTkVfU0VNQVBIT1JFKG5vdGlmaWVyX2xvY2spOwogCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIG1lc3NhZ2U7Ci0JdW5zaWduZWQgaW50IGNyYzsKLX0gTUVTU0FHRV9FTlZFTE9QRTsKLQotc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgZ19EaWFnTXNnSGRyOwotc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgZ19DaGlwU2V0TXNnSGRyOwotc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgZ19EZWxEdW1wTXNnSGRyOwotc3RhdGljIGNvbnN0IHV1aWRfbGUgVWx0cmFEaWFnUG9vbENoYW5uZWxQcm90b2NvbEd1aWQgPQorc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgZ19kaWFnX21zZ19oZHI7CitzdGF0aWMgc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciBnX2NoaXBzZXRfbXNnX2hkcjsKK3N0YXRpYyBzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyIGdfZGVsX2R1bXBfbXNnX2hkcjsKK3N0YXRpYyBjb25zdCB1dWlkX2xlIHNwYXJfZGlhZ19wb29sX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCA9CiAJU1BBUl9ESUFHX1BPT0xfQ0hBTk5FTF9QUk9UT0NPTF9VVUlEOwogLyogMHhmZmZmZmYgaXMgYW4gaW52YWxpZCBCdXMvRGV2aWNlIG51bWJlciAqLwotc3RhdGljIHVsb25nIGdfZGlhZ3Bvb2xCdXNObyA9IDB4ZmZmZmZmOwotc3RhdGljIHVsb25nIGdfZGlhZ3Bvb2xEZXZObyA9IDB4ZmZmZmZmOwotc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgZ19EZXZpY2VDaGFuZ2VTdGF0ZVBhY2tldDsKK3N0YXRpYyB1bG9uZyBnX2RpYWdwb29sX2J1c19ubyA9IDB4ZmZmZmZmOworc3RhdGljIHVsb25nIGdfZGlhZ3Bvb2xfZGV2X25vID0gMHhmZmZmZmY7CitzdGF0aWMgc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCBnX2RldmljZWNoYW5nZXN0YXRlX3BhY2tldDsKIAogLyogT25seSBWTklDIGFuZCBWSEJBIGNoYW5uZWxzIGFyZSBzZW50IHRvIHZpc29yY2xpZW50YnVzIChha2EKICAqICJ2aXNvcmhhY2tidXMiKQogICovCiAjZGVmaW5lIEZPUl9WSVNPUkhBQ0tCVVMoY2hhbm5lbF90eXBlX2d1aWQpIFwKIAkoKCh1dWlkX2xlX2NtcChjaGFubmVsX3R5cGVfZ3VpZCxcCi0JCSAgICAgICBzcGFyX3ZuaWNfY2hhbm5lbF9wcm90b2NvbF91dWlkKSA9PSAwKVwKLQl8fCAodXVpZF9sZV9jbXAoY2hhbm5lbF90eXBlX2d1aWQsXAorCQkgICAgICAgc3Bhcl92bmljX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCkgPT0gMCkgfHxcCisJKHV1aWRfbGVfY21wKGNoYW5uZWxfdHlwZV9ndWlkLFwKIAkJCXNwYXJfdmhiYV9jaGFubmVsX3Byb3RvY29sX3V1aWQpID09IDApKSkKICNkZWZpbmUgRk9SX1ZJU09SQlVTKGNoYW5uZWxfdHlwZV9ndWlkKSAoIShGT1JfVklTT1JIQUNLQlVTKGNoYW5uZWxfdHlwZV9ndWlkKSkpCiAKICNkZWZpbmUgaXNfZGlhZ3Bvb2xfY2hhbm5lbChjaGFubmVsX3R5cGVfZ3VpZCkgXAotCSAodXVpZF9sZV9jbXAoY2hhbm5lbF90eXBlX2d1aWQsIFVsdHJhRGlhZ1Bvb2xDaGFubmVsUHJvdG9jb2xHdWlkKSA9PSAwKQorCSh1dWlkX2xlX2NtcChjaGFubmVsX3R5cGVfZ3VpZCxcCisJCSAgICAgc3Bhcl9kaWFnX3Bvb2xfY2hhbm5lbF9wcm90b2NvbF91dWlkKSA9PSAwKQogCi1zdGF0aWMgTElTVF9IRUFEKEJ1c0luZm9MaXN0KTsKLXN0YXRpYyBMSVNUX0hFQUQoRGV2SW5mb0xpc3QpOworc3RhdGljIExJU1RfSEVBRChidXNfaW5mb19saXN0KTsKK3N0YXRpYyBMSVNUX0hFQUQoZGV2X2luZm9fbGlzdCk7CiAKLXN0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGFubmVsICpDb250cm9sVm1fY2hhbm5lbDsKK3N0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGFubmVsICpjb250cm9sdm1fY2hhbm5lbDsKIAotdHlwZWRlZiBzdHJ1Y3QgeworLyogTWFuYWdlcyB0aGUgcmVxdWVzdCBwYXlsb2FkIGluIHRoZSBjb250cm9sdm0gY2hhbm5lbCAqLworc3RhdGljIHN0cnVjdCBjb250cm9sdm1fcGF5bG9hZF9pbmZvIHsKIAl1OCBfX2lvbWVtICpwdHI7CS8qIHBvaW50ZXIgdG8gYmFzZSBhZGRyZXNzIG9mIHBheWxvYWQgcG9vbCAqLwogCXU2NCBvZmZzZXQ7CQkvKiBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgY29udHJvbHZtCiAJCQkJICogY2hhbm5lbCB0byBiZWdpbm5pbmcgb2YgcGF5bG9hZCAqIHBvb2wgKi8KIAl1MzIgYnl0ZXM7CQkvKiBudW1iZXIgb2YgYnl0ZXMgaW4gcGF5bG9hZCBwb29sICovCi19IENPTlRST0xWTV9QQVlMT0FEX0lORk87Cit9IGNvbnRyb2x2bV9wYXlsb2FkX2luZm87CiAKLS8qIE1hbmFnZXMgdGhlIHJlcXVlc3QgcGF5bG9hZCBpbiB0aGUgY29udHJvbHZtIGNoYW5uZWwgKi8KLXN0YXRpYyBDT05UUk9MVk1fUEFZTE9BRF9JTkZPIENvbnRyb2xWbV9wYXlsb2FkX2luZm87Ci0KLXN0YXRpYyBzdHJ1Y3QgY2hhbm5lbF9oZWFkZXIgKlRlc3RfVm5pY19jaGFubmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciBEdW1wY2FwdHVyZV9oZWFkZXI7Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciBHZXR0ZXh0ZHVtcF9oZWFkZXI7Ci0Jc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciBEdW1wY29tcGxldGVfaGVhZGVyOwotCUJPT0wgR2V0dGV4dGR1bXBfb3V0c3RhbmRpbmc7CisvKiBNYW5hZ2VzIHRoZSBpbmZvIGZvciBhIENPTlRST0xWTV9EVU1QX0NBUFRVUkVTVEFURSAvCisgKiBDT05UUk9MVk1fRFVNUF9HRVRURVhURFVNUCAvIENPTlRST0xWTV9EVU1QX0NPTVBMRVRFIGNvbnZlcnNhdGlvbi4KKyAqLworc3RhdGljIHN0cnVjdCBsaXZlZHVtcF9pbmZvIHsKKwlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyIGR1bXBjYXB0dXJlX2hlYWRlcjsKKwlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyIGdldHRleHRkdW1wX2hlYWRlcjsKKwlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyIGR1bXBjb21wbGV0ZV9oZWFkZXI7CisJQk9PTCBnZXR0ZXh0ZHVtcF9vdXRzdGFuZGluZzsKIAl1MzIgY3JjMzI7CiAJdWxvbmcgbGVuZ3RoOwogCWF0b21pY190IGJ1ZmZlcnNfaW5fdXNlOwogCXVsb25nIGRlc3RpbmF0aW9uOwotfSBMSVZFRFVNUF9JTkZPOwotLyogTWFuYWdlcyB0aGUgaW5mbyBmb3IgYSBDT05UUk9MVk1fRFVNUF9DQVBUVVJFU1RBVEUgLwotICogQ09OVFJPTFZNX0RVTVBfR0VUVEVYVERVTVAgLyBDT05UUk9MVk1fRFVNUF9DT01QTEVURSBjb252ZXJzYXRpb24uCi0gKi8KLXN0YXRpYyBMSVZFRFVNUF9JTkZPIExpdmVEdW1wX2luZm87Cit9IGxpdmVkdW1wX2luZm87CiAKIC8qIFRoZSBmb2xsb3dpbmcgZ2xvYmFscyBhcmUgdXNlZCB0byBoYW5kbGUgdGhlIHNjZW5hcmlvIHdoZXJlIHdlIGFyZSB1bmFibGUgdG8KICAqIG9mZmxvYWQgdGhlIHBheWxvYWQgZnJvbSBhIGNvbnRyb2x2bSBtZXNzYWdlIGR1ZSB0byBtZW1vcnkgcmVxdWlyZW1lbnRzLiAgSW4KICAqIHRoaXMgc2NlbmFyaW8sIHdlIHNpbXBseSBzdGFzaCB0aGUgY29udHJvbHZtIG1lc3NhZ2UsIHRoZW4gYXR0ZW1wdCB0bwogICogcHJvY2VzcyBpdCBhZ2FpbiB0aGUgbmV4dCB0aW1lIGNvbnRyb2x2bV9wZXJpb2RpY193b3JrKCkgcnVucy4KICAqLwotc3RhdGljIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBDb250cm9sVm1fUGVuZGluZ19Nc2c7Ci1zdGF0aWMgQk9PTCBDb250cm9sVm1fUGVuZGluZ19Nc2dfVmFsaWQgPSBGQUxTRTsKK3N0YXRpYyBzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgY29udHJvbHZtX3BlbmRpbmdfbXNnOworc3RhdGljIEJPT0wgY29udHJvbHZtX3BlbmRpbmdfbXNnX3ZhbGlkID0gRkFMU0U7CiAKIC8qIFBvb2wgb2Ygc3RydWN0IHB1dGZpbGVfYnVmZmVyX2VudHJ5LCBmb3Iga2VlcGluZyB0cmFjayBvZiBwZW5kaW5nIChpbmNvbWluZykKICAqIFRSQU5TTUlUX0ZJTEUgUHV0RmlsZSBwYXlsb2Fkcy4KICAqLwotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2w7Ci1zdGF0aWMgY29uc3QgY2hhciBQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2xfbmFtZVtdID0KK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqcHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sOworc3RhdGljIGNvbnN0IGNoYXIgcHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sX25hbWVbXSA9CiAJImNvbnRyb2x2bV9wdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wiOwogCiAvKiBUaGlzIGlkZW50aWZpZXMgYSBkYXRhIGJ1ZmZlciB0aGF0IGhhcyBiZWVuIHJlY2VpdmVkIHZpYSBhIGNvbnRyb2x2bSBtZXNzYWdlcwpAQCAtMTUwLDE0ICsxNDAsMTQgQEAKICAqLwogc3RydWN0IHB1dGZpbGVfYnVmZmVyX2VudHJ5IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CS8qIHB1dGZpbGVfYnVmZmVyX2VudHJ5IGxpc3QgKi8KLQlQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2N0eDsgLyogcG9pbnRzIHRvIGJ1ZmZlciBjb250YWluaW5nIGlucHV0IGRhdGEgKi8KKwlzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKnBhcnNlcl9jdHg7IC8qIHBvaW50cyB0byBpbnB1dCBkYXRhIGJ1ZmZlciAqLwogfTsKIAogLyogTGlzdCBvZiBzdHJ1Y3QgcHV0ZmlsZV9yZXF1ZXN0ICosIHZpYSBuZXh0X3B1dGZpbGVfcmVxdWVzdCBtZW1iZXIuCiAgKiBFYWNoIGVudHJ5IGluIHRoaXMgbGlzdCBpZGVudGlmaWVzIGFuIG91dHN0YW5kaW5nIFRSQU5TTUlUX0ZJTEUKICAqIGNvbnZlcnNhdGlvbi4KICAqLwotc3RhdGljIExJU1RfSEVBRChQdXRmaWxlX3JlcXVlc3RfbGlzdCk7CitzdGF0aWMgTElTVF9IRUFEKHB1dGZpbGVfcmVxdWVzdF9saXN0KTsKIAogLyogVGhpcyBkZXNjcmliZXMgYSBidWZmZXIgYW5kIGl0cyBjdXJyZW50IHN0YXRlIG9mIHRyYW5zZmVyIChlLmcuLCBob3cgbWFueQogICogYnl0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc3VwcGxpZWQgYXMgcHV0ZmlsZSBkYXRhLCBhbmQgaG93IG1hbnkgYnl0ZXMgYXJlCkBAIC0xNjUsNyArMTU1LDcgQEAKICAqLwogc3RydWN0IHB1dGZpbGVfYWN0aXZlX2J1ZmZlciB7CiAJLyogYSBwYXlsb2FkIGZyb20gYSBjb250cm9sdm0gbWVzc2FnZSwgY29udGFpbmluZyBhIGZpbGUgZGF0YSBidWZmZXIgKi8KLQlQQVJTRVJfQ09OVEVYVCAqcGFyc2VyX2N0eDsKKwlzdHJ1Y3QgcGFyc2VyX2NvbnRleHQgKnBhcnNlcl9jdHg7CiAJLyogcG9pbnRzIHdpdGhpbiBkYXRhIGFyZWEgb2YgcGFyc2VyX2N0eCB0byBuZXh0IGJ5dGUgb2YgZGF0YSAqLwogCXU4ICpwbmV4dDsKIAkvKiAjIGJ5dGVzIGxlZnQgZnJvbSA8cG5leHQ+IHRvIHRoZSBlbmQgb2YgdGhpcyBkYXRhIGJ1ZmZlciAqLwpAQCAtMjEzLDcgKzIwMyw3IEBACiAJaW50IGNvbXBsZXRpb25fc3RhdHVzOwogfTsKIAotc3RhdGljIGF0b21pY190IFZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSA9IEFUT01JQ19JTklUKDApOworc3RhdGljIGF0b21pY190IHZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSA9IEFUT01JQ19JTklUKDApOwogCiBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwpAQCAtMjIyLDIzICsyMTIsMjMgQEAKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgbXNnOwogfTsKIAotc3RhdGljIExJU1RfSEVBRChQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpOwotc3RhdGljIERFRklORV9TUElOTE9DSyhQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CS8qIGxvY2sgZm9yIGFib3ZlICovCitzdGF0aWMgTElTVF9IRUFEKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsJLyogbG9jayBmb3IgYWJvdmUgKi8KIHN0YXRpYyB2b2lkIHBhcmFob3RwbHVnX3Byb2Nlc3NfbGlzdCh2b2lkKTsKIAogLyogTWFuYWdlcyB0aGUgaW5mbyBmb3IgYSBDT05UUk9MVk1fRFVNUF9DQVBUVVJFU1RBVEUgLwogICogQ09OVFJPTFZNX1JFUE9SVEVWRU5ULgogICovCi1zdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzIEJ1c0Rldl9TZXJ2ZXJfTm90aWZpZXJzOwotc3RhdGljIHN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X25vdGlmaWVycyBCdXNEZXZfQ2xpZW50X05vdGlmaWVyczsKK3N0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9ub3RpZmllcnMgYnVzZGV2X3NlcnZlcl9ub3RpZmllcnM7CitzdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfbm90aWZpZXJzIGJ1c2Rldl9jbGllbnRfbm90aWZpZXJzOwogCi1zdGF0aWMgdm9pZCBidXNfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpOwotc3RhdGljIHZvaWQgYnVzX2Rlc3Ryb3lfcmVzcG9uc2UodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSk7Ci1zdGF0aWMgdm9pZCBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKLXN0YXRpYyB2b2lkIGRldmljZV9kZXN0cm95X3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKTsKLXN0YXRpYyB2b2lkIGRldmljZV9yZXN1bWVfcmVzcG9uc2UodWxvbmcgYnVzTm8sIHVsb25nIGRldk5vLCBpbnQgcmVzcG9uc2UpOworc3RhdGljIHZvaWQgYnVzX2NyZWF0ZV9yZXNwb25zZSh1bG9uZyBidXNfbm8sIGludCByZXNwb25zZSk7CitzdGF0aWMgdm9pZCBidXNfZGVzdHJveV9yZXNwb25zZSh1bG9uZyBidXNfbm8sIGludCByZXNwb25zZSk7CitzdGF0aWMgdm9pZCBkZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCBpbnQgcmVzcG9uc2UpOworc3RhdGljIHZvaWQgZGV2aWNlX2Rlc3Ryb3lfcmVzcG9uc2UodWxvbmcgYnVzX25vLCB1bG9uZyBkZXZfbm8sIGludCByZXNwb25zZSk7CitzdGF0aWMgdm9pZCBkZXZpY2VfcmVzdW1lX3Jlc3BvbnNlKHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCBpbnQgcmVzcG9uc2UpOwogCi1zdGF0aWMgc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfcmVzcG9uZGVycyBCdXNEZXZfUmVzcG9uZGVycyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9yZXNwb25kZXJzIGJ1c2Rldl9yZXNwb25kZXJzID0gewogCS5idXNfY3JlYXRlID0gYnVzX2NyZWF0ZV9yZXNwb25zZSwKIAkuYnVzX2Rlc3Ryb3kgPSBidXNfZGVzdHJveV9yZXNwb25zZSwKIAkuZGV2aWNlX2NyZWF0ZSA9IGRldmljZV9jcmVhdGVfcmVzcG9uc2UsCkBAIC0yNDgsNDkgKzIzOCw1NSBAQAogfTsKIAogLyogaW5mbyBmb3IgL2Rldi92aXNvcmNoaXBzZXQgKi8KLXN0YXRpYyBkZXZfdCBNYWpvckRldiA9IC0xOyAvKio8IGluZGljYXRlcyBtYWpvciBudW0gZm9yIGRldmljZSAqLworc3RhdGljIGRldl90IG1ham9yX2RldiA9IC0xOyAvKio8IGluZGljYXRlcyBtYWpvciBudW0gZm9yIGRldmljZSAqLwogCiAvKiBwcm90b3R5cGVzIGZvciBhdHRyaWJ1dGVzICovCiBzdGF0aWMgc3NpemVfdCB0b29sYWN0aW9uX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOworCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOwogc3RhdGljIHNzaXplX3QgdG9vbGFjdGlvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiBzdGF0aWMgREVWSUNFX0FUVFJfUlcodG9vbGFjdGlvbik7CiAKIHN0YXRpYyBzc2l6ZV90IGJvb3R0b3Rvb2xfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CisJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCBib290dG90b29sX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGNvdW50KTsKIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhib290dG90b29sKTsKIAogc3RhdGljIHNzaXplX3QgZXJyb3Jfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNoYXIgKmJ1Zik7CisJCQkgIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCBlcnJvcl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKKwkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhlcnJvcik7CiAKIHN0YXRpYyBzc2l6ZV90IHRleHRpZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JY2hhciAqYnVmKTsKKwkJCSAgIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCB0ZXh0aWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogc3RhdGljIERFVklDRV9BVFRSX1JXKHRleHRpZCk7CiAKIHN0YXRpYyBzc2l6ZV90IHJlbWFpbmluZ19zdGVwc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKTsKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1Zik7CiBzdGF0aWMgc3NpemVfdCByZW1haW5pbmdfc3RlcHNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhyZW1haW5pbmdfc3RlcHMpOwogCiBzdGF0aWMgc3NpemVfdCBjaGlwc2V0cmVhZHlfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiBzdGF0aWMgREVWSUNFX0FUVFJfV08oY2hpcHNldHJlYWR5KTsKIAogc3RhdGljIHNzaXplX3QgZGV2aWNlZGlzYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOworCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogc3RhdGljIERFVklDRV9BVFRSX1dPKGRldmljZWRpc2FibGVkKTsKIAogc3RhdGljIHNzaXplX3QgZGV2aWNlZW5hYmxlZF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpOwogc3RhdGljIERFVklDRV9BVFRSX1dPKGRldmljZWVuYWJsZWQpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmlzb3JjaGlwc2V0X2luc3RhbGxfYXR0cnNbXSA9IHsKQEAgLTMzNiw0NyArMzMyLDQ4IEBACiB9OwogCiAvKiAvc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0ICovCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlID0geworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugdmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZSA9IHsKIAkubmFtZSA9ICJ2aXNvcmNoaXBzZXQiLAogCS5pZCA9IC0xLAogCS5kZXYuZ3JvdXBzID0gdmlzb3JjaGlwc2V0X2Rldl9ncm91cHMsCiB9OwogCiAvKiBGdW5jdGlvbiBwcm90b3R5cGVzICovCi1zdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dIZHIsCitzdGF0aWMgdm9pZCBjb250cm9sdm1fcmVzcG9uZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLAogCQkJICAgICAgaW50IHJlc3BvbnNlKTsKIHN0YXRpYyB2b2lkIGNvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdCgKLQkJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UsCisJCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSwKIAkJZW51bSB1bHRyYV9jaGlwc2V0X2ZlYXR1cmUgZmVhdHVyZXMpOwogc3RhdGljIHZvaWQgY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKLQkJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UsCisJCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSwKIAkJc3RydWN0IHNwYXJfc2VnbWVudF9zdGF0ZSBzdGF0ZSk7CiAKIHN0YXRpYyBzc2l6ZV90IHRvb2xhY3Rpb25fc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgICAgICAgY2hhciAqYnVmKQogewotCXU4IHRvb2xBY3Rpb247CisJdTggdG9vbF9hY3Rpb247CiAKLQl2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwl2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKIAkJb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkgICB0b29sX2FjdGlvbiksICZ0b29sQWN0aW9uLCBzaXplb2YodTgpKTsKLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHRvb2xBY3Rpb24pOworCQkJIHRvb2xfYWN0aW9uKSwgJnRvb2xfYWN0aW9uLCBzaXplb2YodTgpKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHRvb2xfYWN0aW9uKTsKIH0KIAogc3RhdGljIHNzaXplX3QgdG9vbGFjdGlvbl9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JdTggdG9vbEFjdGlvbjsKKwl1OCB0b29sX2FjdGlvbjsKIAlpbnQgcmV0OwogCi0JaWYgKGtzdHJ0b3U4KGJ1ZiwgMTAsICZ0b29sQWN0aW9uKSAhPSAwKQorCWlmIChrc3RydG91OChidWYsIDEwLCAmdG9vbF9hY3Rpb24pICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlKENvbnRyb2xWbV9jaGFubmVsLAotCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwgdG9vbF9hY3Rpb24pLAotCQkmdG9vbEFjdGlvbiwgc2l6ZW9mKHU4KSk7CisJcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlKGNvbnRyb2x2bV9jaGFubmVsLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCSB0b29sX2FjdGlvbiksCisJCSZ0b29sX2FjdGlvbiwgc2l6ZW9mKHU4KSk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtMzg3LDE0ICszODQsMTQgQEAKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKIAkJCSAgICAgICBjaGFyICpidWYpCiB7Ci0Jc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24gZWZpU3BhckluZGljYXRpb247CisJc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24gZWZpX3NwYXJfaW5kaWNhdGlvbjsKIAotCXZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAotCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCWVmaV9zcGFyX2luZCksICZlZmlTcGFySW5kaWNhdGlvbiwKLQkJc2l6ZW9mKHN0cnVjdCBlZmlfc3Bhcl9pbmRpY2F0aW9uKSk7CisJdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJCSAgIGVmaV9zcGFyX2luZCksICZlZmlfc3Bhcl9pbmRpY2F0aW9uLAorCQkJICBzaXplb2Yoc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24pKTsKIAlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsCi0JCQllZmlTcGFySW5kaWNhdGlvbi5ib290X3RvX3Rvb2wpOworCQkJIGVmaV9zcGFyX2luZGljYXRpb24uYm9vdF90b190b29sKTsKIH0KIAogc3RhdGljIHNzaXplX3QgYm9vdHRvdG9vbF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCkBAIC00MDIsMTcgKzM5OSwxNiBAQAogCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWludCB2YWwsIHJldDsKLQlzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbiBlZmlTcGFySW5kaWNhdGlvbjsKKwlzdHJ1Y3QgZWZpX3NwYXJfaW5kaWNhdGlvbiBlZmlfc3Bhcl9pbmRpY2F0aW9uOwogCiAJaWYgKGtzdHJ0b2ludChidWYsIDEwLCAmdmFsKSAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVmaVNwYXJJbmRpY2F0aW9uLmJvb3RfdG9fdG9vbCA9IHZhbDsKLQlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUoQ29udHJvbFZtX2NoYW5uZWwsCisJZWZpX3NwYXJfaW5kaWNhdGlvbi5ib290X3RvX3Rvb2wgPSB2YWw7CisJcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlKGNvbnRyb2x2bV9jaGFubmVsLAogCQkJb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkJZWZpX3NwYXJfaW5kKSwKLQkJCSYoZWZpU3BhckluZGljYXRpb24pLAotCQlzaXplb2Yoc3RydWN0IGVmaV9zcGFyX2luZGljYXRpb24pKTsKKwkJCQkgZWZpX3NwYXJfaW5kKSwgJihlZmlfc3Bhcl9pbmRpY2F0aW9uKSwKKwkJCQkgc2l6ZW9mKHN0cnVjdCBlZmlfc3Bhcl9pbmRpY2F0aW9uKSk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNDIwLDE4ICs0MTYsMTkgQEAKIH0KIAogc3RhdGljIHNzaXplX3QgZXJyb3Jfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQljaGFyICpidWYpCisJCQkgIGNoYXIgKmJ1ZikKIHsKIAl1MzIgZXJyb3I7CiAKLQl2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwgb2Zmc2V0b2YoCi0JCXN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLCBpbnN0YWxsYXRpb25fZXJyb3IpLAotCQkmZXJyb3IsIHNpemVvZih1MzIpKTsKKwl2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKKwkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkJICAgaW5zdGFsbGF0aW9uX2Vycm9yKSwKKwkJCSAgJmVycm9yLCBzaXplb2YodTMyKSk7CiAJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVpXG4iLCBlcnJvcik7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGVycm9yX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdTMyIGVycm9yOwogCWludCByZXQ7CkBAIC00MzksMTE0ICs0MzYsODEgQEAKIAlpZiAoa3N0cnRvdTMyKGJ1ZiwgMTAsICZlcnJvcikgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUoQ29udHJvbFZtX2NoYW5uZWwsCi0JCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCQlpbnN0YWxsYXRpb25fZXJyb3IpLAotCQkJJmVycm9yLCBzaXplb2YodTMyKSk7CisJcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlKGNvbnRyb2x2bV9jaGFubmVsLAorCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKKwkJCSBpbnN0YWxsYXRpb25fZXJyb3IpLAorCQkmZXJyb3IsIHNpemVvZih1MzIpKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIHNzaXplX3QgdGV4dGlkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY2hhciAqYnVmKQorCQkJICAgY2hhciAqYnVmKQogewotCXUzMiB0ZXh0SWQ7CisJdTMyIHRleHRfaWQ7CiAKLQl2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwgb2Zmc2V0b2YoCi0JCXN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLCBpbnN0YWxsYXRpb25fdGV4dF9pZCksCi0JCSZ0ZXh0SWQsIHNpemVvZih1MzIpKTsKLQlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHRleHRJZCk7CisJdmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAorCQkJCSAgIGluc3RhbGxhdGlvbl90ZXh0X2lkKSwKKwkJCSAgJnRleHRfaWQsIHNpemVvZih1MzIpKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWlcbiIsIHRleHRfaWQpOwogfQogCiBzdGF0aWMgc3NpemVfdCB0ZXh0aWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JdTMyIHRleHRJZDsKKwl1MzIgdGV4dF9pZDsKIAlpbnQgcmV0OwogCi0JaWYgKGtzdHJ0b3UzMihidWYsIDEwLCAmdGV4dElkKSAhPSAwKQorCWlmIChrc3RydG91MzIoYnVmLCAxMCwgJnRleHRfaWQpICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmV0ID0gdmlzb3JjaGFubmVsX3dyaXRlKENvbnRyb2xWbV9jaGFubmVsLAotCQkJb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCi0JCQkJaW5zdGFsbGF0aW9uX3RleHRfaWQpLAotCQkJJnRleHRJZCwgc2l6ZW9mKHUzMikpOworCXJldCA9IHZpc29yY2hhbm5lbF93cml0ZShjb250cm9sdm1fY2hhbm5lbCwKKwkJb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgaW5zdGFsbGF0aW9uX3RleHRfaWQpLAorCQkmdGV4dF9pZCwgc2l6ZW9mKHUzMikpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAJcmV0dXJuIGNvdW50OwogfQogCi0KIHN0YXRpYyBzc2l6ZV90IHJlbWFpbmluZ19zdGVwc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewotCXUxNiByZW1haW5pbmdTdGVwczsKKwl1MTYgcmVtYWluaW5nX3N0ZXBzOwogCi0Jdmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCi0JCW9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAotCQkJaW5zdGFsbGF0aW9uX3JlbWFpbmluZ19zdGVwcyksCi0JCSZyZW1haW5pbmdTdGVwcywKLQkJc2l6ZW9mKHUxNikpOwotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlaHVcbiIsIHJlbWFpbmluZ1N0ZXBzKTsKKwl2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKKwkJCSAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkJICAgaW5zdGFsbGF0aW9uX3JlbWFpbmluZ19zdGVwcyksCisJCQkgICZyZW1haW5pbmdfc3RlcHMsIHNpemVvZih1MTYpKTsKKwlyZXR1cm4gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWh1XG4iLCByZW1haW5pbmdfc3RlcHMpOwogfQogCiBzdGF0aWMgc3NpemVfdCByZW1haW5pbmdfc3RlcHNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JdTE2IHJlbWFpbmluZ1N0ZXBzOworCXUxNiByZW1haW5pbmdfc3RlcHM7CiAJaW50IHJldDsKIAotCWlmIChrc3RydG91MTYoYnVmLCAxMCwgJnJlbWFpbmluZ1N0ZXBzKSAhPSAwKQorCWlmIChrc3RydG91MTYoYnVmLCAxMCwgJnJlbWFpbmluZ19zdGVwcykgIT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSB2aXNvcmNoYW5uZWxfd3JpdGUoQ29udHJvbFZtX2NoYW5uZWwsCi0JCQlvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKLQkJCQlpbnN0YWxsYXRpb25fcmVtYWluaW5nX3N0ZXBzKSwKLQkJCSZyZW1haW5pbmdTdGVwcywgc2l6ZW9mKHUxNikpOworCXJldCA9IHZpc29yY2hhbm5lbF93cml0ZShjb250cm9sdm1fY2hhbm5lbCwKKwkJb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCisJCQkgaW5zdGFsbGF0aW9uX3JlbWFpbmluZ19zdGVwcyksCisJCSZyZW1haW5pbmdfc3RlcHMsIHNpemVvZih1MTYpKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCXJldHVybiBjb3VudDsKIH0KIAotI2lmIDAKIHN0YXRpYyB2b2lkCi10ZXN0VW5pY29kZSh2b2lkKQotewotCXdjaGFyX3QgdW5pY29kZVN0cmluZ1tdID0geyAnYScsICdiJywgJ2MnLCAwIH07Ci0JY2hhciBzW3NpemVvZih1bmljb2RlU3RyaW5nKSAqIE5MU19NQVhfQ0hBUlNFVF9TSVpFXTsKLQl3Y2hhcl90IHVuaWNvZGUyWzk5XTsKLQotCS8qIE5PVEU6IEVpdGhlciBkdWUgdG8gYSBidWcsIG9yIGZlYXR1cmUgSSBkb24ndCB1bmRlcnN0YW5kLCB0aGUKLQkgKiAgICAgICBrZXJuZWwgdXRmOF9tYnN0b3djcygpIGFuZCB1dGZfd2NzdG9tYnMoKSBkbyBOT1QgY29weSB0aGUKLQkgKiAgICAgICB0cmFpbGVkIE5VTCBieXRlISEgICBSRUFMTFkhISEhISAgICBBcnJycmdnZ2doaGhoaAotCSAqLwotCi0JTE9HSU5GKCJzaXplb2Yod2NoYXJfdCkgPSAlZCIsIHNpemVvZih3Y2hhcl90KSk7Ci0JTE9HSU5GKCJ1dGY4X3djc3RvbWJzPSVkIiwKLQkgICAgICAgY2hycyA9IHV0Zjhfd2NzdG9tYnMocywgdW5pY29kZVN0cmluZywgc2l6ZW9mKHMpKSk7Ci0JaWYgKGNocnMgPj0gMCkKLQkJc1tjaHJzXSA9ICdcMCc7CS8qIEdSUlJSUlJSUiAqLwotCUxPR0lORigicz0nJXMnIiwgcyk7Ci0JTE9HSU5GKCJ1dGY4X21ic3Rvd2NzPSVkIiwgY2hycyA9IHV0ZjhfbWJzdG93Y3ModW5pY29kZTIsIHMsIDEwMCkpOwotCWlmIChjaHJzID49IDApCi0JCXVuaWNvZGUyW2NocnNdID0gMDsJLyogR1JSUlJSUlJSICovCi0JaWYgKG1lbWNtcCh1bmljb2RlU3RyaW5nLCB1bmljb2RlMiwgc2l6ZW9mKHVuaWNvZGVTdHJpbmcpKSA9PSAwKQotCQlMT0dJTkYoInN0cmluZ3MgbWF0Y2guLi4gZ29vZCIpOwotCWVsc2UKLQkJTE9HSU5GKCJzdHJpbmdzIGRpZCBub3QgbWF0Y2ghISIpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkCi1idXNJbmZvX2NsZWFyKHZvaWQgKnYpCitidXNfaW5mb19jbGVhcih2b2lkICp2KQogewogCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzX2luZm8gKnAgPSAoc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqKSAodik7CiAKLQlpZiAocC0+cHJvY19vYmplY3QpIHsKLQkJdmlzb3JfcHJvY19EZXN0cm95T2JqZWN0KHAtPnByb2Nfb2JqZWN0KTsKLQkJcC0+cHJvY19vYmplY3QgPSBOVUxMOwotCX0KIAlrZnJlZShwLT5uYW1lKTsKIAlwLT5uYW1lID0gTlVMTDsKIApAQCAtNTU4LDcgKzUyMiw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1kZXZJbmZvX2NsZWFyKHZvaWQgKnYpCitkZXZfaW5mb19jbGVhcih2b2lkICp2KQogewogCXN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKnAgPQogCQkJKHN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKikodik7CkBAIC01OTMsMjIgKzU1NywyMiBAQAogCQkJc3RydWN0IHZpc29yY2hpcHNldF9idXNkZXZfcmVzcG9uZGVycyAqcmVzcG9uZGVycywKIAkJCXN0cnVjdCB1bHRyYV92YnVzX2RldmljZWluZm8gKmRyaXZlcl9pbmZvKQogewotCWRvd24oJk5vdGlmaWVyTG9jayk7Ci0JaWYgKG5vdGlmaWVycyA9PSBOVUxMKSB7Ci0JCW1lbXNldCgmQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMsIDAsCi0JCSAgICAgICBzaXplb2YoQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMpKTsKKwlkb3duKCZub3RpZmllcl9sb2NrKTsKKwlpZiAoIW5vdGlmaWVycykgeworCQltZW1zZXQoJmJ1c2Rldl9zZXJ2ZXJfbm90aWZpZXJzLCAwLAorCQkgICAgICAgc2l6ZW9mKGJ1c2Rldl9zZXJ2ZXJfbm90aWZpZXJzKSk7CiAJCXNlcnZlcnJlZ2lzdGVyZWQgPSAwOwkvKiBjbGVhciBmbGFnICovCiAJfSBlbHNlIHsKLQkJQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMgPSAqbm90aWZpZXJzOworCQlidXNkZXZfc2VydmVyX25vdGlmaWVycyA9ICpub3RpZmllcnM7CiAJCXNlcnZlcnJlZ2lzdGVyZWQgPSAxOwkvKiBzZXQgZmxhZyAqLwogCX0KIAlpZiAocmVzcG9uZGVycykKLQkJKnJlc3BvbmRlcnMgPSBCdXNEZXZfUmVzcG9uZGVyczsKKwkJKnJlc3BvbmRlcnMgPSBidXNkZXZfcmVzcG9uZGVyczsKIAlpZiAoZHJpdmVyX2luZm8pCiAJCWJ1c19kZXZpY2VfaW5mb19pbml0KGRyaXZlcl9pbmZvLCAiY2hpcHNldCIsICJ2aXNvcmNoaXBzZXQiLAotCQkJCSAgIFZFUlNJT04sIE5VTEwpOworCQkJCSAgICAgVkVSU0lPTiwgTlVMTCk7CiAKLQl1cCgmTm90aWZpZXJMb2NrKTsKKwl1cCgmbm90aWZpZXJfbG9jayk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfcmVnaXN0ZXJfYnVzZGV2X3NlcnZlcik7CiAKQEAgLTYxOCwyMSArNTgyLDIxIEBACiAJCQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c2Rldl9yZXNwb25kZXJzICpyZXNwb25kZXJzLAogCQkJc3RydWN0IHVsdHJhX3ZidXNfZGV2aWNlaW5mbyAqZHJpdmVyX2luZm8pCiB7Ci0JZG93bigmTm90aWZpZXJMb2NrKTsKLQlpZiAobm90aWZpZXJzID09IE5VTEwpIHsKLQkJbWVtc2V0KCZCdXNEZXZfQ2xpZW50X05vdGlmaWVycywgMCwKLQkJICAgICAgIHNpemVvZihCdXNEZXZfQ2xpZW50X05vdGlmaWVycykpOworCWRvd24oJm5vdGlmaWVyX2xvY2spOworCWlmICghbm90aWZpZXJzKSB7CisJCW1lbXNldCgmYnVzZGV2X2NsaWVudF9ub3RpZmllcnMsIDAsCisJCSAgICAgICBzaXplb2YoYnVzZGV2X2NsaWVudF9ub3RpZmllcnMpKTsKIAkJY2xpZW50cmVnaXN0ZXJlZCA9IDA7CS8qIGNsZWFyIGZsYWcgKi8KIAl9IGVsc2UgewotCQlCdXNEZXZfQ2xpZW50X05vdGlmaWVycyA9ICpub3RpZmllcnM7CisJCWJ1c2Rldl9jbGllbnRfbm90aWZpZXJzID0gKm5vdGlmaWVyczsKIAkJY2xpZW50cmVnaXN0ZXJlZCA9IDE7CS8qIHNldCBmbGFnICovCiAJfQogCWlmIChyZXNwb25kZXJzKQotCQkqcmVzcG9uZGVycyA9IEJ1c0Rldl9SZXNwb25kZXJzOworCQkqcmVzcG9uZGVycyA9IGJ1c2Rldl9yZXNwb25kZXJzOwogCWlmIChkcml2ZXJfaW5mbykKIAkJYnVzX2RldmljZV9pbmZvX2luaXQoZHJpdmVyX2luZm8sICJjaGlwc2V0KGJvbHRzKSIsCiAJCQkJICAgICAidmlzb3JjaGlwc2V0IiwgVkVSU0lPTiwgTlVMTCk7Ci0JdXAoJk5vdGlmaWVyTG9jayk7CisJdXAoJm5vdGlmaWVyX2xvY2spOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X3JlZ2lzdGVyX2J1c2Rldl9jbGllbnQpOwogCkBAIC02NDIsMTQgKzYwNiwxNCBAQAogCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzX2luZm8gKmJpLCAqdG1wX2JpOwogCXN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKmRpLCAqdG1wX2RpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJpLCB0bXBfYmksICZCdXNJbmZvTGlzdCwgZW50cnkpIHsKLQkJYnVzSW5mb19jbGVhcihiaSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJpLCB0bXBfYmksICZidXNfaW5mb19saXN0LCBlbnRyeSkgeworCQlidXNfaW5mb19jbGVhcihiaSk7CiAJCWxpc3RfZGVsKCZiaS0+ZW50cnkpOwogCQlrZnJlZShiaSk7CiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRpLCB0bXBfZGksICZEZXZJbmZvTGlzdCwgZW50cnkpIHsKLQkJZGV2SW5mb19jbGVhcihkaSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRpLCB0bXBfZGksICZkZXZfaW5mb19saXN0LCBlbnRyeSkgeworCQlkZXZfaW5mb19jbGVhcihkaSk7CiAJCWxpc3RfZGVsKCZkaS0+ZW50cnkpOwogCQlrZnJlZShkaSk7CiAJfQpAQCAtNjY0LDkgKzYyOCw4IEBACiAKIAlQT1NUQ09ERV9MSU5VWF8yKENISVBTRVRfSU5JVF9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJaWYgKGNoaXBzZXRfaW5pdGVkKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0NISVBTRVRfSU5JVCBGYWlsZWQ6IEFscmVhZHkgRG9uZS4iKTsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAJY2hpcHNldF9pbml0ZWQgPSAxOwogCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwpAQCAtNjgxLDcgKzY0NCw3IEBACiAJICogZmVhdHVyZXMtYXdhcmUgZHJpdmVyLiAqLwogCWZlYXR1cmVzIHw9IFVMVFJBX0NISVBTRVRfRkVBVFVSRV9SRVBMWTsKIAotQXdheToKK2NsZWFudXA6CiAJaWYgKHJjIDwgMCkKIAkJY2xlYW51cF9jb250cm9sdm1fc3RydWN0dXJlcygpOwogCWlmIChpbm1zZy0+aGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQpAQCAtNjkwLDEwICs2NTMsMTAgQEAKIAogc3RhdGljIHZvaWQKIGNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnLAotCQkJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UpCisJCQlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLCBpbnQgcmVzcG9uc2UpCiB7CiAJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSkpOwotCW1lbWNweSgmbXNnLT5oZHIsIG1zZ0hkciwgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKKwltZW1jcHkoJm1zZy0+aGRyLCBtc2dfaGRyLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOwogCW1zZy0+aGRyLnBheWxvYWRfYnl0ZXMgPSAwOwogCW1zZy0+aGRyLnBheWxvYWRfdm1fb2Zmc2V0ID0gMDsKIAltc2ctPmhkci5wYXlsb2FkX21heF9ieXRlcyA9IDA7CkBAIC03MDQsNTkgKzY2Nyw1NCBAQAogfQogCiBzdGF0aWMgdm9pZAotY29udHJvbHZtX3Jlc3BvbmQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UpCitjb250cm9sdm1fcmVzcG9uZChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLCBpbnQgcmVzcG9uc2UpCiB7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIG91dG1zZzsKIAotCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZvdXRtc2csIG1zZ0hkciwgcmVzcG9uc2UpOworCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZvdXRtc2csIG1zZ19oZHIsIHJlc3BvbnNlKTsKIAkvKiBGb3IgRGlhZ1Bvb2wgY2hhbm5lbCBERVZJQ0VfQ0hBTkdFU1RBVEUsIHdlIG5lZWQgdG8gc2VuZAogCSogYmFjayB0aGUgZGV2aWNlQ2hhbmdlU3RhdGUgc3RydWN0dXJlIGluIHRoZSBwYWNrZXQuICovCi0JaWYgKG1zZ0hkci0+aWQgPT0gQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURQotCSAgICAmJiBnX0RldmljZUNoYW5nZVN0YXRlUGFja2V0LmRldmljZV9jaGFuZ2Vfc3RhdGUuYnVzX25vID09Ci0JICAgIGdfZGlhZ3Bvb2xCdXNObwotCSAgICAmJiBnX0RldmljZUNoYW5nZVN0YXRlUGFja2V0LmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID09Ci0JICAgIGdfZGlhZ3Bvb2xEZXZObykKLQkJb3V0bXNnLmNtZCA9IGdfRGV2aWNlQ2hhbmdlU3RhdGVQYWNrZXQ7Ci0JaWYgKG91dG1zZy5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpIHsKLQkJTE9HSU5GKCIlcyBjb250cm9sdm1fbXNnPTB4JXggcmVzcG9uc2U9JWQgZm9yIHRlc3QgbWVzc2FnZSIsCi0JCSAgICAgICBfX2Z1bmNfXywgb3V0bXNnLmhkci5pZCwgcmVzcG9uc2UpOworCWlmIChtc2dfaGRyLT5pZCA9PSBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFICYmCisJICAgIGdfZGV2aWNlY2hhbmdlc3RhdGVfcGFja2V0LmRldmljZV9jaGFuZ2Vfc3RhdGUuYnVzX25vID09CisJICAgIGdfZGlhZ3Bvb2xfYnVzX25vICYmCisJICAgIGdfZGV2aWNlY2hhbmdlc3RhdGVfcGFja2V0LmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID09CisJICAgIGdfZGlhZ3Bvb2xfZGV2X25vKQorCQlvdXRtc2cuY21kID0gZ19kZXZpY2VjaGFuZ2VzdGF0ZV9wYWNrZXQ7CisJaWYgKG91dG1zZy5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpCiAJCXJldHVybjsKLQl9Ci0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAorCisJaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KGNvbnRyb2x2bV9jaGFubmVsLAogCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKLQkJTE9HRVJSKCJzaWduYWxpbnNlcnQgZmFpbGVkISIpOwogCQlyZXR1cm47CiAJfQogfQogCiBzdGF0aWMgdm9pZAotY29udHJvbHZtX3Jlc3BvbmRfY2hpcHNldF9pbml0KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ0hkciwKK2NvbnRyb2x2bV9yZXNwb25kX2NoaXBzZXRfaW5pdChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLAogCQkJICAgICAgIGludCByZXNwb25zZSwKIAkJCSAgICAgICBlbnVtIHVsdHJhX2NoaXBzZXRfZmVhdHVyZSBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2Ugb3V0bXNnOwogCi0JY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnSGRyLCByZXNwb25zZSk7CisJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnX2hkciwgcmVzcG9uc2UpOwogCW91dG1zZy5jbWQuaW5pdF9jaGlwc2V0LmZlYXR1cmVzID0gZmVhdHVyZXM7Ci0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAorCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKIAkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7Ci0JCUxPR0VSUigic2lnbmFsaW5zZXJ0IGZhaWxlZCEiKTsKIAkJcmV0dXJuOwogCX0KIH0KIAogc3RhdGljIHZvaWQgY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKLQkJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UsCisJCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSwKIAkJc3RydWN0IHNwYXJfc2VnbWVudF9zdGF0ZSBzdGF0ZSkKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2Ugb3V0bXNnOwogCi0JY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnSGRyLCByZXNwb25zZSk7CisJY29udHJvbHZtX2luaXRfcmVzcG9uc2UoJm91dG1zZywgbXNnX2hkciwgcmVzcG9uc2UpOwogCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSA9IHN0YXRlOwogCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5mbGFncy5waHlzX2RldmljZSA9IDE7Ci0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAorCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKIAkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKSB7Ci0JCUxPR0VSUigic2lnbmFsaW5zZXJ0IGZhaWxlZCEiKTsKIAkJcmV0dXJuOwogCX0KIH0KQEAgLTc2NSw1NiArNzIzLDUwIEBACiB2aXNvcmNoaXBzZXRfc2F2ZV9tZXNzYWdlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnLAogCQkJICBlbnVtIGNyYXNoX29ial90eXBlIHR5cGUpCiB7Ci0JdTMyIGxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldDsKLQl1MTYgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQ7CisJdTMyIGNyYXNoX21zZ19vZmZzZXQ7CisJdTE2IGNyYXNoX21zZ19jb3VudDsKIAogCS8qIGdldCBzYXZlZCBtZXNzYWdlIGNvdW50ICovCi0JaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCWlmICh2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKIAkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAogCQkJCSAgICAgICBzYXZlZF9jcmFzaF9tZXNzYWdlX2NvdW50KSwKLQkJCSAgICAgICZsb2NhbFNhdmVkQ3Jhc2hNc2dDb3VudCwgc2l6ZW9mKHUxNikpIDwgMCkgewotCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBDb3VudCIpOworCQkJICAgICAgJmNyYXNoX21zZ19jb3VudCwgc2l6ZW9mKHUxNikpIDwgMCkgewogCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAobG9jYWxTYXZlZENyYXNoTXNnQ291bnQgIT0gQ09OVFJPTFZNX0NSQVNITVNHX01BWCkgewotCQlMT0dFUlIoIlNhdmVkIE1lc3NhZ2UgQ291bnQgaW5jb3JyZWN0ICVkIiwKLQkJICAgICAgIGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50KTsKKwlpZiAoY3Jhc2hfbXNnX2NvdW50ICE9IENPTlRST0xWTV9DUkFTSE1TR19NQVgpIHsKIAkJUE9TVENPREVfTElOVVhfMyhDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQywKLQkJCQkgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQsCisJCQkJIGNyYXNoX21zZ19jb3VudCwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGdldCBzYXZlZCBjcmFzaCBtZXNzYWdlIG9mZnNldCAqLwotCWlmICh2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCiAJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKIAkJCQkgICAgICAgc2F2ZWRfY3Jhc2hfbWVzc2FnZV9vZmZzZXQpLAotCQkJICAgICAgJmxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldCwgc2l6ZW9mKHUzMikpIDwgMCkgewotCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBPZmZzZXQiKTsKKwkJCSAgICAgICZjcmFzaF9tc2dfb2Zmc2V0LCBzaXplb2YodTMyKSkgPCAwKSB7CiAJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0NUUkxfUkRfRkFJTFVSRV9QQywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KIAogCWlmICh0eXBlID09IENSQVNIX0JVUykgewotCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKENvbnRyb2xWbV9jaGFubmVsLAotCQkJCSAgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQsCisJCWlmICh2aXNvcmNoYW5uZWxfd3JpdGUoY29udHJvbHZtX2NoYW5uZWwsCisJCQkJICAgICAgIGNyYXNoX21zZ19vZmZzZXQsCiAJCQkJICAgICAgIG1zZywKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSkpIDwgMCkgewotCQkJTE9HRVJSKCJTQVZFX01TR19CVVNfRkFJTFVSRTogRmFpbGVkIHRvIHdyaXRlIENyYXNoQ3JlYXRlQnVzTXNnISIpOwogCQkJUE9TVENPREVfTElOVVhfMihTQVZFX01TR19CVVNfRkFJTFVSRV9QQywKIAkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQlyZXR1cm47CiAJCX0KIAl9IGVsc2UgewotCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKENvbnRyb2xWbV9jaGFubmVsLAotCQkJCSAgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQgKworCQlpZiAodmlzb3JjaGFubmVsX3dyaXRlKGNvbnRyb2x2bV9jaGFubmVsLAorCQkJCSAgICAgICBjcmFzaF9tc2dfb2Zmc2V0ICsKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSksIG1zZywKIAkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSkpIDwgMCkgewotCQkJTE9HRVJSKCJTQVZFX01TR19ERVZfRkFJTFVSRTogRmFpbGVkIHRvIHdyaXRlIENyYXNoQ3JlYXRlRGV2TXNnISIpOwogCQkJUE9TVENPREVfTElOVVhfMihTQVZFX01TR19ERVZfRkFJTFVSRV9QQywKIAkJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCQlyZXR1cm47CkBAIC04MjQsMTM0ICs3NzYsMTE4IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfc2F2ZV9tZXNzYWdlKTsKIAogc3RhdGljIHZvaWQKLWJ1c19yZXNwb25kZXIoZW51bSBjb250cm9sdm1faWQgY21kSWQsIHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpCitidXNfcmVzcG9uZGVyKGVudW0gY29udHJvbHZtX2lkIGNtZF9pZCwgdWxvbmcgYnVzX25vLCBpbnQgcmVzcG9uc2UpCiB7CiAJc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqcCA9IE5VTEw7CiAJQk9PTCBuZWVkX2NsZWFyID0gRkFMU0U7CiAKLQlwID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKLQlpZiAoIXApIHsKLQkJTE9HRVJSKCJpbnRlcm5hbCBlcnJvciBidXNObz0lbHUiLCBidXNObyk7CisJcCA9IGZpbmRidXMoJmJ1c19pbmZvX2xpc3QsIGJ1c19ubyk7CisJaWYgKCFwKQogCQlyZXR1cm47Ci0JfQorCiAJaWYgKHJlc3BvbnNlIDwgMCkgewotCQlpZiAoKGNtZElkID09IENPTlRST0xWTV9CVVNfQ1JFQVRFKSAmJgorCQlpZiAoKGNtZF9pZCA9PSBDT05UUk9MVk1fQlVTX0NSRUFURSkgJiYKIAkJICAgIChyZXNwb25zZSAhPSAoLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORSkpKQogCQkJLyogdW5kbyB0aGUgcm93IHdlIGp1c3QgY3JlYXRlZC4uLiAqLwotCQkJZGVsYnVzZGV2aWNlcygmRGV2SW5mb0xpc3QsIGJ1c05vKTsKKwkJCWRlbGJ1c2RldmljZXMoJmRldl9pbmZvX2xpc3QsIGJ1c19ubyk7CiAJfSBlbHNlIHsKLQkJaWYgKGNtZElkID09IENPTlRST0xWTV9CVVNfQ1JFQVRFKQorCQlpZiAoY21kX2lkID09IENPTlRST0xWTV9CVVNfQ1JFQVRFKQogCQkJcC0+c3RhdGUuY3JlYXRlZCA9IDE7Ci0JCWlmIChjbWRJZCA9PSBDT05UUk9MVk1fQlVTX0RFU1RST1kpCisJCWlmIChjbWRfaWQgPT0gQ09OVFJPTFZNX0JVU19ERVNUUk9ZKQogCQkJbmVlZF9jbGVhciA9IFRSVUU7CiAJfQogCi0JaWYgKHAtPnBlbmRpbmdfbXNnX2hkci5pZCA9PSBDT05UUk9MVk1fSU5WQUxJRCkgewotCQlMT0dFUlIoImJ1c19yZXNwb25kZXIgbm8gcGVuZGluZyBtc2ciKTsKKwlpZiAocC0+cGVuZGluZ19tc2dfaGRyLmlkID09IENPTlRST0xWTV9JTlZBTElEKQogCQlyZXR1cm47CQkvKiBubyBjb250cm9sdm0gcmVzcG9uc2UgbmVlZGVkICovCi0JfQotCWlmIChwLT5wZW5kaW5nX21zZ19oZHIuaWQgIT0gKHUzMikgY21kSWQpIHsKLQkJTE9HRVJSKCJleHBlY3RlZD0lZCwgZm91bmQ9JWQiLCBjbWRJZCwgcC0+cGVuZGluZ19tc2dfaGRyLmlkKTsKKwlpZiAocC0+cGVuZGluZ19tc2dfaGRyLmlkICE9ICh1MzIpY21kX2lkKQogCQlyZXR1cm47Ci0JfQogCWNvbnRyb2x2bV9yZXNwb25kKCZwLT5wZW5kaW5nX21zZ19oZHIsIHJlc3BvbnNlKTsKIAlwLT5wZW5kaW5nX21zZ19oZHIuaWQgPSBDT05UUk9MVk1fSU5WQUxJRDsKIAlpZiAobmVlZF9jbGVhcikgewotCQlidXNJbmZvX2NsZWFyKHApOwotCQlkZWxidXNkZXZpY2VzKCZEZXZJbmZvTGlzdCwgYnVzTm8pOworCQlidXNfaW5mb19jbGVhcihwKTsKKwkJZGVsYnVzZGV2aWNlcygmZGV2X2luZm9fbGlzdCwgYnVzX25vKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkCi1kZXZpY2VfY2hhbmdlc3RhdGVfcmVzcG9uZGVyKGVudW0gY29udHJvbHZtX2lkIGNtZElkLAotCQkJICAgICB1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSwKLQkJCSAgICAgc3RydWN0IHNwYXJfc2VnbWVudF9zdGF0ZSByZXNwb25zZVN0YXRlKQorZGV2aWNlX2NoYW5nZXN0YXRlX3Jlc3BvbmRlcihlbnVtIGNvbnRyb2x2bV9pZCBjbWRfaWQsCisJCQkgICAgIHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCBpbnQgcmVzcG9uc2UsCisJCQkgICAgIHN0cnVjdCBzcGFyX3NlZ21lbnRfc3RhdGUgcmVzcG9uc2Vfc3RhdGUpCiB7CiAJc3RydWN0IHZpc29yY2hpcHNldF9kZXZpY2VfaW5mbyAqcCA9IE5VTEw7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIG91dG1zZzsKIAotCXAgPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKLQlpZiAoIXApIHsKLQkJTE9HRVJSKCJpbnRlcm5hbCBlcnJvcjsgYnVzTm89JWx1LCBkZXZObz0lbHUiLCBidXNObywgZGV2Tm8pOworCXAgPSBmaW5kZGV2aWNlKCZkZXZfaW5mb19saXN0LCBidXNfbm8sIGRldl9ubyk7CisJaWYgKCFwKQogCQlyZXR1cm47Ci0JfQotCWlmIChwLT5wZW5kaW5nX21zZ19oZHIuaWQgPT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKLQkJTE9HRVJSKCJkZXZpY2VfcmVzcG9uZGVyIG5vIHBlbmRpbmcgbXNnIik7CisJaWYgKHAtPnBlbmRpbmdfbXNnX2hkci5pZCA9PSBDT05UUk9MVk1fSU5WQUxJRCkKIAkJcmV0dXJuOwkJLyogbm8gY29udHJvbHZtIHJlc3BvbnNlIG5lZWRlZCAqLwotCX0KLQlpZiAocC0+cGVuZGluZ19tc2dfaGRyLmlkICE9IGNtZElkKSB7Ci0JCUxPR0VSUigiZXhwZWN0ZWQ9JWQsIGZvdW5kPSVkIiwgY21kSWQsIHAtPnBlbmRpbmdfbXNnX2hkci5pZCk7CisJaWYgKHAtPnBlbmRpbmdfbXNnX2hkci5pZCAhPSBjbWRfaWQpCiAJCXJldHVybjsKLQl9CiAKIAljb250cm9sdm1faW5pdF9yZXNwb25zZSgmb3V0bXNnLCAmcC0+cGVuZGluZ19tc2dfaGRyLCByZXNwb25zZSk7CiAKLQlvdXRtc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuYnVzX25vID0gYnVzTm87Ci0Jb3V0bXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyA9IGRldk5vOwotCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSA9IHJlc3BvbnNlU3RhdGU7CisJb3V0bXNnLmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubyA9IGJ1c19ubzsKKwlvdXRtc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vID0gZGV2X25vOworCW91dG1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSA9IHJlc3BvbnNlX3N0YXRlOwogCi0JaWYgKCF2aXNvcmNoYW5uZWxfc2lnbmFsaW5zZXJ0KENvbnRyb2xWbV9jaGFubmVsLAotCQkJCSAgICAgICBDT05UUk9MVk1fUVVFVUVfUkVRVUVTVCwgJm91dG1zZykpIHsKLQkJTE9HRVJSKCJzaWduYWxpbnNlcnQgZmFpbGVkISIpOworCWlmICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydChjb250cm9sdm1fY2hhbm5lbCwKKwkJCQkgICAgICAgQ09OVFJPTFZNX1FVRVVFX1JFUVVFU1QsICZvdXRtc2cpKQogCQlyZXR1cm47Ci0JfQogCiAJcC0+cGVuZGluZ19tc2dfaGRyLmlkID0gQ09OVFJPTFZNX0lOVkFMSUQ7CiB9CiAKIHN0YXRpYyB2b2lkCi1kZXZpY2VfcmVzcG9uZGVyKGVudW0gY29udHJvbHZtX2lkIGNtZElkLCB1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sCitkZXZpY2VfcmVzcG9uZGVyKGVudW0gY29udHJvbHZtX2lkIGNtZF9pZCwgdWxvbmcgYnVzX25vLCB1bG9uZyBkZXZfbm8sCiAJCSBpbnQgcmVzcG9uc2UpCiB7CiAJc3RydWN0IHZpc29yY2hpcHNldF9kZXZpY2VfaW5mbyAqcCA9IE5VTEw7CiAJQk9PTCBuZWVkX2NsZWFyID0gRkFMU0U7CiAKLQlwID0gZmluZGRldmljZSgmRGV2SW5mb0xpc3QsIGJ1c05vLCBkZXZObyk7Ci0JaWYgKCFwKSB7Ci0JCUxPR0VSUigiaW50ZXJuYWwgZXJyb3I7IGJ1c05vPSVsdSwgZGV2Tm89JWx1IiwgYnVzTm8sIGRldk5vKTsKKwlwID0gZmluZGRldmljZSgmZGV2X2luZm9fbGlzdCwgYnVzX25vLCBkZXZfbm8pOworCWlmICghcCkKIAkJcmV0dXJuOwotCX0KIAlpZiAocmVzcG9uc2UgPj0gMCkgewotCQlpZiAoY21kSWQgPT0gQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUpCisJCWlmIChjbWRfaWQgPT0gQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUpCiAJCQlwLT5zdGF0ZS5jcmVhdGVkID0gMTsKLQkJaWYgKGNtZElkID09IENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSkKKwkJaWYgKGNtZF9pZCA9PSBDT05UUk9MVk1fREVWSUNFX0RFU1RST1kpCiAJCQluZWVkX2NsZWFyID0gVFJVRTsKIAl9CiAKLQlpZiAocC0+cGVuZGluZ19tc2dfaGRyLmlkID09IENPTlRST0xWTV9JTlZBTElEKSB7Ci0JCUxPR0VSUigiZGV2aWNlX3Jlc3BvbmRlciBubyBwZW5kaW5nIG1zZyIpOworCWlmIChwLT5wZW5kaW5nX21zZ19oZHIuaWQgPT0gQ09OVFJPTFZNX0lOVkFMSUQpCiAJCXJldHVybjsJCS8qIG5vIGNvbnRyb2x2bSByZXNwb25zZSBuZWVkZWQgKi8KLQl9Ci0JaWYgKHAtPnBlbmRpbmdfbXNnX2hkci5pZCAhPSAodTMyKSBjbWRJZCkgewotCQlMT0dFUlIoImV4cGVjdGVkPSVkLCBmb3VuZD0lZCIsIGNtZElkLCBwLT5wZW5kaW5nX21zZ19oZHIuaWQpOworCisJaWYgKHAtPnBlbmRpbmdfbXNnX2hkci5pZCAhPSAodTMyKWNtZF9pZCkKIAkJcmV0dXJuOwotCX0KKwogCWNvbnRyb2x2bV9yZXNwb25kKCZwLT5wZW5kaW5nX21zZ19oZHIsIHJlc3BvbnNlKTsKIAlwLT5wZW5kaW5nX21zZ19oZHIuaWQgPSBDT05UUk9MVk1fSU5WQUxJRDsKIAlpZiAobmVlZF9jbGVhcikKLQkJZGV2SW5mb19jbGVhcihwKTsKKwkJZGV2X2luZm9fY2xlYXIocCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1idXNfZXBpbG9nKHUzMiBidXNObywKLQkgICB1MzIgY21kLCBzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dIZHIsCi0JICAgaW50IHJlc3BvbnNlLCBCT09MIG5lZWRSZXNwb25zZSkKK2J1c19lcGlsb2codTMyIGJ1c19ubywKKwkgICB1MzIgY21kLCBzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyLAorCSAgIGludCByZXNwb25zZSwgQk9PTCBuZWVkX3Jlc3BvbnNlKQogewogCUJPT0wgbm90aWZpZWQgPSBGQUxTRTsKIAotCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzX2luZm8gKnBCdXNJbmZvID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKKwlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpidXNfaW5mbyA9IGZpbmRidXMoJmJ1c19pbmZvX2xpc3QsCisJCQkJCQkJIGJ1c19ubyk7CiAKLQlpZiAoIXBCdXNJbmZvKSB7Ci0JCUxPR0VSUigiSFVIPyBiYWQgYnVzTm89JWQiLCBidXNObyk7CisJaWYgKCFidXNfaW5mbykKIAkJcmV0dXJuOwotCX0KLQlpZiAobmVlZFJlc3BvbnNlKSB7Ci0JCW1lbWNweSgmcEJ1c0luZm8tPnBlbmRpbmdfbXNnX2hkciwgbXNnSGRyLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKLQl9IGVsc2UKLQkJcEJ1c0luZm8tPnBlbmRpbmdfbXNnX2hkci5pZCA9IENPTlRST0xWTV9JTlZBTElEOwogCi0JZG93bigmTm90aWZpZXJMb2NrKTsKKwlpZiAobmVlZF9yZXNwb25zZSkgeworCQltZW1jcHkoJmJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHIsIG1zZ19oZHIsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOworCX0gZWxzZSB7CisJCWJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHIuaWQgPSBDT05UUk9MVk1fSU5WQUxJRDsKKwl9CisKKwlkb3duKCZub3RpZmllcl9sb2NrKTsKIAlpZiAocmVzcG9uc2UgPT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgewogCQlzd2l0Y2ggKGNtZCkgewogCQljYXNlIENPTlRST0xWTV9CVVNfQ1JFQVRFOgpAQCAtOTY1LDI0ICs5MDEsMjQgQEAKIAkJCSogZWl0aGVyIHNlcnZlciBvciBjbGllbnQgZGV2aWNlcwogCQkJKiAtIEJ1c0Rldl9DbGllbnQgY2FuIGhhbmRsZSBPTkxZIGNsaWVudAogCQkJKiBkZXZpY2VzICovCi0JCQlpZiAoQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMuYnVzX2NyZWF0ZSkgewotCQkJCSgqQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMuYnVzX2NyZWF0ZSkgKGJ1c05vKTsKKwkJCWlmIChidXNkZXZfc2VydmVyX25vdGlmaWVycy5idXNfY3JlYXRlKSB7CisJCQkJKCpidXNkZXZfc2VydmVyX25vdGlmaWVycy5idXNfY3JlYXRlKSAoYnVzX25vKTsKIAkJCQlub3RpZmllZCA9IFRSVUU7CiAJCQl9Ci0JCQlpZiAoKCFwQnVzSW5mby0+ZmxhZ3Muc2VydmVyKSAvKmNsaWVudCAqLyAmJgotCQkJICAgIEJ1c0Rldl9DbGllbnRfTm90aWZpZXJzLmJ1c19jcmVhdGUpIHsKLQkJCQkoKkJ1c0Rldl9DbGllbnRfTm90aWZpZXJzLmJ1c19jcmVhdGUpIChidXNObyk7CisJCQlpZiAoKCFidXNfaW5mby0+ZmxhZ3Muc2VydmVyKSAvKmNsaWVudCAqLyAmJgorCQkJICAgIGJ1c2Rldl9jbGllbnRfbm90aWZpZXJzLmJ1c19jcmVhdGUpIHsKKwkJCQkoKmJ1c2Rldl9jbGllbnRfbm90aWZpZXJzLmJ1c19jcmVhdGUpIChidXNfbm8pOwogCQkJCW5vdGlmaWVkID0gVFJVRTsKIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIENPTlRST0xWTV9CVVNfREVTVFJPWToKLQkJCWlmIChCdXNEZXZfU2VydmVyX05vdGlmaWVycy5idXNfZGVzdHJveSkgewotCQkJCSgqQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMuYnVzX2Rlc3Ryb3kpIChidXNObyk7CisJCQlpZiAoYnVzZGV2X3NlcnZlcl9ub3RpZmllcnMuYnVzX2Rlc3Ryb3kpIHsKKwkJCQkoKmJ1c2Rldl9zZXJ2ZXJfbm90aWZpZXJzLmJ1c19kZXN0cm95KSAoYnVzX25vKTsKIAkJCQlub3RpZmllZCA9IFRSVUU7CiAJCQl9Ci0JCQlpZiAoKCFwQnVzSW5mby0+ZmxhZ3Muc2VydmVyKSAvKmNsaWVudCAqLyAmJgotCQkJICAgIEJ1c0Rldl9DbGllbnRfTm90aWZpZXJzLmJ1c19kZXN0cm95KSB7Ci0JCQkJKCpCdXNEZXZfQ2xpZW50X05vdGlmaWVycy5idXNfZGVzdHJveSkgKGJ1c05vKTsKKwkJCWlmICgoIWJ1c19pbmZvLT5mbGFncy5zZXJ2ZXIpIC8qY2xpZW50ICovICYmCisJCQkgICAgYnVzZGV2X2NsaWVudF9ub3RpZmllcnMuYnVzX2Rlc3Ryb3kpIHsKKwkJCQkoKmJ1c2Rldl9jbGllbnRfbm90aWZpZXJzLmJ1c19kZXN0cm95KSAoYnVzX25vKTsKIAkJCQlub3RpZmllZCA9IFRSVUU7CiAJCQl9CiAJCQlicmVhazsKQEAgLTk5NSw0NSArOTMxLDQ1IEBACiAJCSAqLwogCQk7CiAJZWxzZQotCQlidXNfcmVzcG9uZGVyKGNtZCwgYnVzTm8sIHJlc3BvbnNlKTsKLQl1cCgmTm90aWZpZXJMb2NrKTsKKwkJYnVzX3Jlc3BvbmRlcihjbWQsIGJ1c19ubywgcmVzcG9uc2UpOworCXVwKCZub3RpZmllcl9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQKLWRldmljZV9lcGlsb2codTMyIGJ1c05vLCB1MzIgZGV2Tm8sIHN0cnVjdCBzcGFyX3NlZ21lbnRfc3RhdGUgc3RhdGUsIHUzMiBjbWQsCi0JICAgICAgc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyLCBpbnQgcmVzcG9uc2UsCi0JICAgICAgQk9PTCBuZWVkUmVzcG9uc2UsIEJPT0wgZm9yX3Zpc29yYnVzKQorZGV2aWNlX2VwaWxvZyh1MzIgYnVzX25vLCB1MzIgZGV2X25vLCBzdHJ1Y3Qgc3Bhcl9zZWdtZW50X3N0YXRlIHN0YXRlLCB1MzIgY21kLAorCSAgICAgIHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIsIGludCByZXNwb25zZSwKKwkgICAgICBCT09MIG5lZWRfcmVzcG9uc2UsIEJPT0wgZm9yX3Zpc29yYnVzKQogewogCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzZGV2X25vdGlmaWVycyAqbm90aWZpZXJzID0gTlVMTDsKIAlCT09MIG5vdGlmaWVkID0gRkFMU0U7CiAKLQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvICpwRGV2SW5mbyA9Ci0JCWZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOworCXN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKmRldl9pbmZvID0KKwkJZmluZGRldmljZSgmZGV2X2luZm9fbGlzdCwgYnVzX25vLCBkZXZfbm8pOwogCWNoYXIgKmVudnBbXSA9IHsKIAkJIlNQQVJTUF9ESUFHUE9PTF9QQVVTRURfU1RBVEUgPSAxIiwKIAkJTlVMTAogCX07CiAKLQlpZiAoIXBEZXZJbmZvKSB7Ci0JCUxPR0VSUigiSFVIPyBiYWQgYnVzTm89JWQsIGRldk5vPSVkIiwgYnVzTm8sIGRldk5vKTsKKwlpZiAoIWRldl9pbmZvKQogCQlyZXR1cm47Ci0JfQotCWlmIChmb3Jfdmlzb3JidXMpCi0JCW5vdGlmaWVycyA9ICZCdXNEZXZfU2VydmVyX05vdGlmaWVyczsKLQllbHNlCi0JCW5vdGlmaWVycyA9ICZCdXNEZXZfQ2xpZW50X05vdGlmaWVyczsKLQlpZiAobmVlZFJlc3BvbnNlKSB7Ci0JCW1lbWNweSgmcERldkluZm8tPnBlbmRpbmdfbXNnX2hkciwgbXNnSGRyLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKLQl9IGVsc2UKLQkJcERldkluZm8tPnBlbmRpbmdfbXNnX2hkci5pZCA9IENPTlRST0xWTV9JTlZBTElEOwogCi0JZG93bigmTm90aWZpZXJMb2NrKTsKKwlpZiAoZm9yX3Zpc29yYnVzKQorCQlub3RpZmllcnMgPSAmYnVzZGV2X3NlcnZlcl9ub3RpZmllcnM7CisJZWxzZQorCQlub3RpZmllcnMgPSAmYnVzZGV2X2NsaWVudF9ub3RpZmllcnM7CisJaWYgKG5lZWRfcmVzcG9uc2UpIHsKKwkJbWVtY3B5KCZkZXZfaW5mby0+cGVuZGluZ19tc2dfaGRyLCBtc2dfaGRyLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKKwl9IGVsc2UgeworCQlkZXZfaW5mby0+cGVuZGluZ19tc2dfaGRyLmlkID0gQ09OVFJPTFZNX0lOVkFMSUQ7CisJfQorCisJZG93bigmbm90aWZpZXJfbG9jayk7CiAJaWYgKHJlc3BvbnNlID49IDApIHsKIAkJc3dpdGNoIChjbWQpIHsKIAkJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NSRUFURToKIAkJCWlmIChub3RpZmllcnMtPmRldmljZV9jcmVhdGUpIHsKLQkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX2NyZWF0ZSkgKGJ1c05vLCBkZXZObyk7CisJCQkJKCpub3RpZmllcnMtPmRldmljZV9jcmVhdGUpIChidXNfbm8sIGRldl9ubyk7CiAJCQkJbm90aWZpZWQgPSBUUlVFOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xMDQzLDggKzk3OSw4IEBACiAJCQkgICAgc3RhdGUub3BlcmF0aW5nID09CiAJCQkJc2VnbWVudF9zdGF0ZV9ydW5uaW5nLm9wZXJhdGluZykgewogCQkJCWlmIChub3RpZmllcnMtPmRldmljZV9yZXN1bWUpIHsKLQkJCQkJKCpub3RpZmllcnMtPmRldmljZV9yZXN1bWUpIChidXNObywKLQkJCQkJCQkJICAgICBkZXZObyk7CisJCQkJCSgqbm90aWZpZXJzLT5kZXZpY2VfcmVzdW1lKSAoYnVzX25vLAorCQkJCQkJCQkgICAgIGRldl9ubyk7CiAJCQkJCW5vdGlmaWVkID0gVFJVRTsKIAkJCQl9CiAJCQl9CkBAIC0xMDU2LDggKzk5Miw4IEBACiAJCQkJICogd2hlcmUgc2VydmVyIGlzIGxvc3QKIAkJCQkgKi8KIAkJCQlpZiAobm90aWZpZXJzLT5kZXZpY2VfcGF1c2UpIHsKLQkJCQkJKCpub3RpZmllcnMtPmRldmljZV9wYXVzZSkgKGJ1c05vLAotCQkJCQkJCQkgICAgZGV2Tm8pOworCQkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX3BhdXNlKSAoYnVzX25vLAorCQkJCQkJCQkgICAgZGV2X25vKTsKIAkJCQkJbm90aWZpZWQgPSBUUlVFOwogCQkJCX0KIAkJCX0gZWxzZSBpZiAoc3RhdGUuYWxpdmUgPT0gc2VnbWVudF9zdGF0ZV9wYXVzZWQuYWxpdmUgJiYKQEAgLTEwNjYsMjIgKzEwMDIsMjAgQEAKIAkJCQkvKiB0aGlzIGlzIGxpdGUgcGF1c2Ugd2hlcmUgY2hhbm5lbCBpcwogCQkJCSAqIHN0aWxsIHZhbGlkIGp1c3QgJ3BhdXNlJyBvZiBpdAogCQkJCSAqLwotCQkJCWlmIChidXNObyA9PSBnX2RpYWdwb29sQnVzTm8KLQkJCQkgICAgJiYgZGV2Tm8gPT0gZ19kaWFncG9vbERldk5vKSB7Ci0JCQkJCUxPR0lORigiREVWSUNFX0NIQU5HRVNUQVRFKERpYWdwb29sQ2hhbm5lbCBidXNObz0lZCBkZXZObz0lZCBpcyBwYXVzaW5nLi4uKSIsCi0JCQkJCSAgICAgYnVzTm8sIGRldk5vKTsKKwkJCQlpZiAoYnVzX25vID09IGdfZGlhZ3Bvb2xfYnVzX25vICYmCisJCQkJICAgIGRldl9ubyA9PSBnX2RpYWdwb29sX2Rldl9ubykgewogCQkJCQkvKiB0aGlzIHdpbGwgdHJpZ2dlciB0aGUKIAkJCQkJICogZGlhZ19zaHV0ZG93bi5zaCBzY3JpcHQgaW4KIAkJCQkJICogdGhlIHZpc29yY2hpcHNldCBob3RwbHVnICovCiAJCQkJCWtvYmplY3RfdWV2ZW50X2VudgotCQkJCQkgICAgKCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi4KKwkJCQkJICAgICgmdmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYuCiAJCQkJCSAgICAga29iaiwgS09CSl9PTkxJTkUsIGVudnApOwogCQkJCX0KIAkJCX0KIAkJCWJyZWFrOwogCQljYXNlIENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWToKIAkJCWlmIChub3RpZmllcnMtPmRldmljZV9kZXN0cm95KSB7Ci0JCQkJKCpub3RpZmllcnMtPmRldmljZV9kZXN0cm95KSAoYnVzTm8sIGRldk5vKTsKKwkJCQkoKm5vdGlmaWVycy0+ZGV2aWNlX2Rlc3Ryb3kpIChidXNfbm8sIGRldl9ubyk7CiAJCQkJbm90aWZpZWQgPSBUUlVFOwogCQkJfQogCQkJYnJlYWs7CkBAIC0xMDk0LDYyICsxMDI4LDU3IEBACiAJCSAqLwogCQk7CiAJZWxzZQotCQlkZXZpY2VfcmVzcG9uZGVyKGNtZCwgYnVzTm8sIGRldk5vLCByZXNwb25zZSk7Ci0JdXAoJk5vdGlmaWVyTG9jayk7CisJCWRldmljZV9yZXNwb25kZXIoY21kLCBidXNfbm8sIGRldl9ubywgcmVzcG9uc2UpOworCXVwKCZub3RpZmllcl9sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQKIGJ1c19jcmVhdGUoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlICppbm1zZykKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfcGFja2V0ICpjbWQgPSAmaW5tc2ctPmNtZDsKLQl1bG9uZyBidXNObyA9IGNtZC0+Y3JlYXRlX2J1cy5idXNfbm87CisJdWxvbmcgYnVzX25vID0gY21kLT5jcmVhdGVfYnVzLmJ1c19ubzsKIAlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwotCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzX2luZm8gKnBCdXNJbmZvID0gTlVMTDsKKwlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpidXNfaW5mbyA9IE5VTEw7CiAKLQotCXBCdXNJbmZvID0gZmluZGJ1cygmQnVzSW5mb0xpc3QsIGJ1c05vKTsKLQlpZiAocEJ1c0luZm8gJiYgKHBCdXNJbmZvLT5zdGF0ZS5jcmVhdGVkID09IDEpKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkOiBidXMgJWx1IGFscmVhZHkgZXhpc3RzIiwKLQkJICAgICAgIGJ1c05vKTsKLQkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCWJ1c19pbmZvID0gZmluZGJ1cygmYnVzX2luZm9fbGlzdCwgYnVzX25vKTsKKwlpZiAoYnVzX2luZm8gJiYgKGJ1c19pbmZvLT5zdGF0ZS5jcmVhdGVkID09IDEpKSB7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9GQUlMVVJFX1BDLCBidXNfbm8sCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQotCXBCdXNJbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmIChwQnVzSW5mbyA9PSBOVUxMKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DUkVBVEUgRmFpbGVkOiBidXMgJWx1IGt6YWxsb2MgZmFpbGVkIiwKLQkJICAgICAgIGJ1c05vKTsKLQkJUE9TVENPREVfTElOVVhfMyhCVVNfQ1JFQVRFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCWJ1c19pbmZvID0ga3phbGxvYyhzaXplb2YoKmJ1c19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidXNfaW5mbykgeworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRkFJTFVSRV9QQywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9LTUFMTE9DX0ZBSUxFRDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQogCi0JSU5JVF9MSVNUX0hFQUQoJnBCdXNJbmZvLT5lbnRyeSk7Ci0JcEJ1c0luZm8tPmJ1c19ubyA9IGJ1c05vOwotCXBCdXNJbmZvLT5kZXZfbm8gPSBjbWQtPmNyZWF0ZV9idXMuZGV2X2NvdW50OworCUlOSVRfTElTVF9IRUFEKCZidXNfaW5mby0+ZW50cnkpOworCWJ1c19pbmZvLT5idXNfbm8gPSBidXNfbm87CisJYnVzX2luZm8tPmRldl9ubyA9IGNtZC0+Y3JlYXRlX2J1cy5kZXZfY291bnQ7CiAKLQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRU5UUllfUEMsIGJ1c05vLCBQT1NUQ09ERV9TRVZFUklUWV9JTkZPKTsKKwlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRU5UUllfUEMsIGJ1c19ubywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKIAlpZiAoaW5tc2ctPmhkci5mbGFncy50ZXN0X21lc3NhZ2UgPT0gMSkKLQkJcEJ1c0luZm8tPmNoYW5faW5mby5hZGRyX3R5cGUgPSBBRERSVFlQRV9MT0NBTFRFU1Q7CisJCWJ1c19pbmZvLT5jaGFuX2luZm8uYWRkcl90eXBlID0gQUREUlRZUEVfTE9DQUxURVNUOwogCWVsc2UKLQkJcEJ1c0luZm8tPmNoYW5faW5mby5hZGRyX3R5cGUgPSBBRERSVFlQRV9MT0NBTFBIWVNJQ0FMOworCQlidXNfaW5mby0+Y2hhbl9pbmZvLmFkZHJfdHlwZSA9IEFERFJUWVBFX0xPQ0FMUEhZU0lDQUw7CiAKLQlwQnVzSW5mby0+ZmxhZ3Muc2VydmVyID0gaW5tc2ctPmhkci5mbGFncy5zZXJ2ZXI7Ci0JcEJ1c0luZm8tPmNoYW5faW5mby5jaGFubmVsX2FkZHIgPSBjbWQtPmNyZWF0ZV9idXMuY2hhbm5lbF9hZGRyOwotCXBCdXNJbmZvLT5jaGFuX2luZm8ubl9jaGFubmVsX2J5dGVzID0gY21kLT5jcmVhdGVfYnVzLmNoYW5uZWxfYnl0ZXM7Ci0JcEJ1c0luZm8tPmNoYW5faW5mby5jaGFubmVsX3R5cGVfdXVpZCA9CisJYnVzX2luZm8tPmZsYWdzLnNlcnZlciA9IGlubXNnLT5oZHIuZmxhZ3Muc2VydmVyOworCWJ1c19pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF9hZGRyID0gY21kLT5jcmVhdGVfYnVzLmNoYW5uZWxfYWRkcjsKKwlidXNfaW5mby0+Y2hhbl9pbmZvLm5fY2hhbm5lbF9ieXRlcyA9IGNtZC0+Y3JlYXRlX2J1cy5jaGFubmVsX2J5dGVzOworCWJ1c19pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQgPQogCQkJY21kLT5jcmVhdGVfYnVzLmJ1c19kYXRhX3R5cGVfdXVpZDsKLQlwQnVzSW5mby0+Y2hhbl9pbmZvLmNoYW5uZWxfaW5zdF91dWlkID0gY21kLT5jcmVhdGVfYnVzLmJ1c19pbnN0X3V1aWQ7CisJYnVzX2luZm8tPmNoYW5faW5mby5jaGFubmVsX2luc3RfdXVpZCA9IGNtZC0+Y3JlYXRlX2J1cy5idXNfaW5zdF91dWlkOwogCi0JbGlzdF9hZGQoJnBCdXNJbmZvLT5lbnRyeSwgJkJ1c0luZm9MaXN0KTsKKwlsaXN0X2FkZCgmYnVzX2luZm8tPmVudHJ5LCAmYnVzX2luZm9fbGlzdCk7CiAKLQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DUkVBVEVfRVhJVF9QQywgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NSRUFURV9FWElUX1BDLCBidXNfbm8sIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCi1Bd2F5OgotCWJ1c19lcGlsb2coYnVzTm8sIENPTlRST0xWTV9CVVNfQ1JFQVRFLCAmaW5tc2ctPmhkciwKK2NsZWFudXA6CisJYnVzX2VwaWxvZyhidXNfbm8sIENPTlRST0xWTV9CVVNfQ1JFQVRFLCAmaW5tc2ctPmhkciwKIAkJICAgcmMsIGlubXNnLT5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQgPT0gMSk7CiB9CiAKQEAgLTExNTcsNzYgKzEwODYsNTggQEAKIGJ1c19kZXN0cm95KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2cpCiB7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCAqY21kID0gJmlubXNnLT5jbWQ7Ci0JdWxvbmcgYnVzTm8gPSBjbWQtPmRlc3Ryb3lfYnVzLmJ1c19ubzsKLQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpwQnVzSW5mbzsKKwl1bG9uZyBidXNfbm8gPSBjbWQtPmRlc3Ryb3lfYnVzLmJ1c19ubzsKKwlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpidXNfaW5mbzsKIAlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwogCi0JcEJ1c0luZm8gPSBmaW5kYnVzKCZCdXNJbmZvTGlzdCwgYnVzTm8pOwotCWlmICghcEJ1c0luZm8pIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0RFU1RST1kgRmFpbGVkOiBidXMgJWx1IGludmFsaWQiLCBidXNObyk7CisJYnVzX2luZm8gPSBmaW5kYnVzKCZidXNfaW5mb19saXN0LCBidXNfbm8pOworCWlmICghYnVzX2luZm8pCiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOwotCQlnb3RvIEF3YXk7Ci0JfQotCWlmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19ERVNUUk9ZIEZhaWxlZDogYnVzICVsdSBhbHJlYWR5IGRlc3Ryb3llZCIsCi0JCSAgICAgYnVzTm8pOworCWVsc2UgaWYgKGJ1c19pbmZvLT5zdGF0ZS5jcmVhdGVkID09IDApCiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0FMUkVBRFlfRE9ORTsKLQkJZ290byBBd2F5OwotCX0KIAotQXdheToKLQlidXNfZXBpbG9nKGJ1c05vLCBDT05UUk9MVk1fQlVTX0RFU1RST1ksICZpbm1zZy0+aGRyLAorCWJ1c19lcGlsb2coYnVzX25vLCBDT05UUk9MVk1fQlVTX0RFU1RST1ksICZpbm1zZy0+aGRyLAogCQkgICByYywgaW5tc2ctPmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCA9PSAxKTsKIH0KIAogc3RhdGljIHZvaWQKLWJ1c19jb25maWd1cmUoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlICppbm1zZywgUEFSU0VSX0NPTlRFWFQgKnBhcnNlcl9jdHgpCitidXNfY29uZmlndXJlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2csCisJICAgICAgc3RydWN0IHBhcnNlcl9jb250ZXh0ICpwYXJzZXJfY3R4KQogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgKmNtZCA9ICZpbm1zZy0+Y21kOwotCXVsb25nIGJ1c05vID0gY21kLT5jb25maWd1cmVfYnVzLmJ1c19ubzsKLQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpwQnVzSW5mbyA9IE5VTEw7CisJdWxvbmcgYnVzX25vID0gY21kLT5jb25maWd1cmVfYnVzLmJ1c19ubzsKKwlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2J1c19pbmZvICpidXNfaW5mbyA9IE5VTEw7CiAJaW50IHJjID0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUzsKIAljaGFyIHNbOTldOwogCi0JYnVzTm8gPSBjbWQtPmNvbmZpZ3VyZV9idXMuYnVzX25vOwotCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9FTlRSWV9QQywgYnVzTm8sIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOworCWJ1c19ubyA9IGNtZC0+Y29uZmlndXJlX2J1cy5idXNfbm87CisJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0VOVFJZX1BDLCBidXNfbm8sCisJCQkgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKLQlwQnVzSW5mbyA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNObyk7Ci0JaWYgKCFwQnVzSW5mbykgewotCQlMT0dFUlIoIkNPTlRST0xWTV9CVVNfQ09ORklHVVJFIEZhaWxlZDogYnVzICVsdSBpbnZhbGlkIiwKLQkJICAgICAgIGJ1c05vKTsKLQkJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCWJ1c19pbmZvID0gZmluZGJ1cygmYnVzX2luZm9fbGlzdCwgYnVzX25vKTsKKwlpZiAoIWJ1c19pbmZvKSB7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9GQUlMVVJFX1BDLCBidXNfbm8sCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOwotCQlnb3RvIEF3YXk7Ci0JfQotCWlmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0JVU19DT05GSUdVUkUgRmFpbGVkOiBJbnZhbGlkIGJ1cyAlbHUgLSBub3QgY3JlYXRlZCB5ZXQiLAotCQkgICAgIGJ1c05vKTsKLQkJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMsIGJ1c05vLAorCX0gZWxzZSBpZiAoYnVzX2luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMCkgeworCQlQT1NUQ09ERV9MSU5VWF8zKEJVU19DT05GSUdVUkVfRkFJTFVSRV9QQywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKLQkJZ290byBBd2F5OwotCX0KLQkvKiBUQkQgLSBhZGQgdGhpcyBjaGVjayB0byBvdGhlciBjb21tYW5kcyBhbHNvLi4uICovCi0JaWYgKHBCdXNJbmZvLT5wZW5kaW5nX21zZ19oZHIuaWQgIT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fQlVTX0NPTkZJR1VSRSBGYWlsZWQ6IGJ1cyAlbHUgTXNnSWQ9JXUgb3V0c3RhbmRpbmciLAotCQkgICAgIGJ1c05vLCAodWludCkgcEJ1c0luZm8tPnBlbmRpbmdfbXNnX2hkci5pZCk7Ci0JCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9GQUlMVVJFX1BDLCBidXNObywKKwl9IGVsc2UgaWYgKGJ1c19pbmZvLT5wZW5kaW5nX21zZ19oZHIuaWQgIT0gQ09OVFJPTFZNX0lOVkFMSUQpIHsKKwkJUE9TVENPREVfTElOVVhfMyhCVVNfQ09ORklHVVJFX0ZBSUxVUkVfUEMsIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfTUVTU0FHRV9JRF9JTlZBTElEX0ZPUl9DTElFTlQ7Ci0JCWdvdG8gQXdheTsKKwl9IGVsc2UgeworCQlidXNfaW5mby0+cGFydGl0aW9uX2hhbmRsZSA9IGNtZC0+Y29uZmlndXJlX2J1cy5ndWVzdF9oYW5kbGU7CisJCWJ1c19pbmZvLT5wYXJ0aXRpb25fdXVpZCA9IHBhcnNlcl9pZF9nZXQocGFyc2VyX2N0eCk7CisJCXBhcnNlcl9wYXJhbV9zdGFydChwYXJzZXJfY3R4LCBQQVJTRVJTVFJJTkdfTkFNRSk7CisJCWJ1c19pbmZvLT5uYW1lID0gcGFyc2VyX3N0cmluZ19nZXQocGFyc2VyX2N0eCk7CisKKwkJdmlzb3JjaGFubmVsX3V1aWRfaWQoJmJ1c19pbmZvLT5wYXJ0aXRpb25fdXVpZCwgcyk7CisJCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9FWElUX1BDLCBidXNfbm8sCisJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCX0KLQotCXBCdXNJbmZvLT5wYXJ0aXRpb25faGFuZGxlID0gY21kLT5jb25maWd1cmVfYnVzLmd1ZXN0X2hhbmRsZTsKLQlwQnVzSW5mby0+cGFydGl0aW9uX3V1aWQgPSBwYXJzZXJfaWRfZ2V0KHBhcnNlcl9jdHgpOwotCXBhcnNlcl9wYXJhbV9zdGFydChwYXJzZXJfY3R4LCBQQVJTRVJTVFJJTkdfTkFNRSk7Ci0JcEJ1c0luZm8tPm5hbWUgPSBwYXJzZXJfc3RyaW5nX2dldChwYXJzZXJfY3R4KTsKLQotCXZpc29yY2hhbm5lbF91dWlkX2lkKCZwQnVzSW5mby0+cGFydGl0aW9uX3V1aWQsIHMpOwotCVBPU1RDT0RFX0xJTlVYXzMoQlVTX0NPTkZJR1VSRV9FWElUX1BDLCBidXNObywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7Ci1Bd2F5OgotCWJ1c19lcGlsb2coYnVzTm8sIENPTlRST0xWTV9CVVNfQ09ORklHVVJFLCAmaW5tc2ctPmhkciwKKwlidXNfZXBpbG9nKGJ1c19ubywgQ09OVFJPTFZNX0JVU19DT05GSUdVUkUsICZpbm1zZy0+aGRyLAogCQkgICByYywgaW5tc2ctPmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCA9PSAxKTsKIH0KIApAQCAtMTIzNCwxOTEgKzExNDUsMTU4IEBACiBteV9kZXZpY2VfY3JlYXRlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqaW5tc2cpCiB7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCAqY21kID0gJmlubXNnLT5jbWQ7Ci0JdWxvbmcgYnVzTm8gPSBjbWQtPmNyZWF0ZV9kZXZpY2UuYnVzX25vOwotCXVsb25nIGRldk5vID0gY21kLT5jcmVhdGVfZGV2aWNlLmRldl9ubzsKLQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvICpwRGV2SW5mbyA9IE5VTEw7Ci0Jc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqcEJ1c0luZm8gPSBOVUxMOworCXVsb25nIGJ1c19ubyA9IGNtZC0+Y3JlYXRlX2RldmljZS5idXNfbm87CisJdWxvbmcgZGV2X25vID0gY21kLT5jcmVhdGVfZGV2aWNlLmRldl9ubzsKKwlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvICpkZXZfaW5mbyA9IE5VTEw7CisJc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqYnVzX2luZm8gPSBOVUxMOwogCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CiAKLQlwRGV2SW5mbyA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOwotCWlmIChwRGV2SW5mbyAmJiAocERldkluZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMSkpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGFscmVhZHkgZXhpc3RzIiwKLQkJICAgICBidXNObywgZGV2Tm8pOwotCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2Tm8sIGJ1c05vLAorCWRldl9pbmZvID0gZmluZGRldmljZSgmZGV2X2luZm9fbGlzdCwgYnVzX25vLCBkZXZfbm8pOworCWlmIChkZXZfaW5mbyAmJiAoZGV2X2luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMSkpIHsKKwkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9BTFJFQURZX0RPTkU7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KLQlwQnVzSW5mbyA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNObyk7Ci0JaWYgKCFwQnVzSW5mbykgewotCQlMT0dFUlIoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIEZhaWxlZDogSW52YWxpZCBidXMgJWx1IC0gb3V0IG9mIHJhbmdlIiwKLQkJICAgICBidXNObyk7Ci0JCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJYnVzX2luZm8gPSBmaW5kYnVzKCZidXNfaW5mb19saXN0LCBidXNfbm8pOworCWlmICghYnVzX2luZm8pIHsKKwkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9CVVNfSU5WQUxJRDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQotCWlmIChwQnVzSW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUgRmFpbGVkOiBJbnZhbGlkIGJ1cyAlbHUgLSBub3QgY3JlYXRlZCB5ZXQiLAotCQkgICAgIGJ1c05vKTsKLQkJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0ZBSUxVUkVfUEMsIGRldk5vLCBidXNObywKKwlpZiAoYnVzX2luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMCkgeworCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRkFJTFVSRV9QQywgZGV2X25vLCBidXNfbm8sCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0JVU19JTlZBTElEOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9Ci0JcERldkluZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBEZXZJbmZvID09IE5VTEwpIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NSRUFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGttYWxvYyBmYWlsZWQiLAotCQkgICAgIGJ1c05vLCBkZXZObyk7Ci0JCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJZGV2X2luZm8gPSBremFsbG9jKHNpemVvZigqZGV2X2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldl9pbmZvKSB7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NSRUFURV9GQUlMVVJFX1BDLCBkZXZfbm8sIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfS01BTExPQ19GQUlMRUQ7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAotCUlOSVRfTElTVF9IRUFEKCZwRGV2SW5mby0+ZW50cnkpOwotCXBEZXZJbmZvLT5idXNfbm8gPSBidXNObzsKLQlwRGV2SW5mby0+ZGV2X25vID0gZGV2Tm87Ci0JcERldkluZm8tPmRldl9pbnN0X3V1aWQgPSBjbWQtPmNyZWF0ZV9kZXZpY2UuZGV2X2luc3RfdXVpZDsKLQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRU5UUllfUEMsIGRldk5vLCBidXNObywKKwlJTklUX0xJU1RfSEVBRCgmZGV2X2luZm8tPmVudHJ5KTsKKwlkZXZfaW5mby0+YnVzX25vID0gYnVzX25vOworCWRldl9pbmZvLT5kZXZfbm8gPSBkZXZfbm87CisJZGV2X2luZm8tPmRldl9pbnN0X3V1aWQgPSBjbWQtPmNyZWF0ZV9kZXZpY2UuZGV2X2luc3RfdXVpZDsKKwlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DUkVBVEVfRU5UUllfUEMsIGRldl9ubywgYnVzX25vLAogCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCiAJaWYgKGlubXNnLT5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpCi0JCXBEZXZJbmZvLT5jaGFuX2luZm8uYWRkcl90eXBlID0gQUREUlRZUEVfTE9DQUxURVNUOworCQlkZXZfaW5mby0+Y2hhbl9pbmZvLmFkZHJfdHlwZSA9IEFERFJUWVBFX0xPQ0FMVEVTVDsKIAllbHNlCi0JCXBEZXZJbmZvLT5jaGFuX2luZm8uYWRkcl90eXBlID0gQUREUlRZUEVfTE9DQUxQSFlTSUNBTDsKLQlwRGV2SW5mby0+Y2hhbl9pbmZvLmNoYW5uZWxfYWRkciA9IGNtZC0+Y3JlYXRlX2RldmljZS5jaGFubmVsX2FkZHI7Ci0JcERldkluZm8tPmNoYW5faW5mby5uX2NoYW5uZWxfYnl0ZXMgPSBjbWQtPmNyZWF0ZV9kZXZpY2UuY2hhbm5lbF9ieXRlczsKLQlwRGV2SW5mby0+Y2hhbl9pbmZvLmNoYW5uZWxfdHlwZV91dWlkID0KKwkJZGV2X2luZm8tPmNoYW5faW5mby5hZGRyX3R5cGUgPSBBRERSVFlQRV9MT0NBTFBIWVNJQ0FMOworCWRldl9pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF9hZGRyID0gY21kLT5jcmVhdGVfZGV2aWNlLmNoYW5uZWxfYWRkcjsKKwlkZXZfaW5mby0+Y2hhbl9pbmZvLm5fY2hhbm5lbF9ieXRlcyA9IGNtZC0+Y3JlYXRlX2RldmljZS5jaGFubmVsX2J5dGVzOworCWRldl9pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQgPQogCQkJY21kLT5jcmVhdGVfZGV2aWNlLmRhdGFfdHlwZV91dWlkOwotCXBEZXZJbmZvLT5jaGFuX2luZm8uaW50ciA9IGNtZC0+Y3JlYXRlX2RldmljZS5pbnRyOwotCWxpc3RfYWRkKCZwRGV2SW5mby0+ZW50cnksICZEZXZJbmZvTGlzdCk7Ci0JUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0VYSVRfUEMsIGRldk5vLCBidXNObywKKwlkZXZfaW5mby0+Y2hhbl9pbmZvLmludHIgPSBjbWQtPmNyZWF0ZV9kZXZpY2UuaW50cjsKKwlsaXN0X2FkZCgmZGV2X2luZm8tPmVudHJ5LCAmZGV2X2luZm9fbGlzdCk7CisJUE9TVENPREVfTElOVVhfNChERVZJQ0VfQ1JFQVRFX0VYSVRfUEMsIGRldl9ubywgYnVzX25vLAogCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwotQXdheToKK2NsZWFudXA6CiAJLyogZ2V0IHRoZSBidXMgYW5kIGRldk5vIGZvciBEaWFnUG9vbCBjaGFubmVsICovCi0JaWYgKHBEZXZJbmZvICYmCi0JICAgIGlzX2RpYWdwb29sX2NoYW5uZWwocERldkluZm8tPmNoYW5faW5mby5jaGFubmVsX3R5cGVfdXVpZCkpIHsKLQkJZ19kaWFncG9vbEJ1c05vID0gYnVzTm87Ci0JCWdfZGlhZ3Bvb2xEZXZObyA9IGRldk5vOwotCQlMT0dJTkYoIkNPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFIGZvciBEaWFnUG9vbCBjaGFubmVsOiBidXNObz0lbHUsIGRldk5vPSVsdSIsCi0JCSAgICAgZ19kaWFncG9vbEJ1c05vLCBnX2RpYWdwb29sRGV2Tm8pOworCWlmIChkZXZfaW5mbyAmJgorCSAgICBpc19kaWFncG9vbF9jaGFubmVsKGRldl9pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQpKSB7CisJCWdfZGlhZ3Bvb2xfYnVzX25vID0gYnVzX25vOworCQlnX2RpYWdwb29sX2Rldl9ubyA9IGRldl9ubzsKIAl9Ci0JZGV2aWNlX2VwaWxvZyhidXNObywgZGV2Tm8sIHNlZ21lbnRfc3RhdGVfcnVubmluZywKKwlkZXZpY2VfZXBpbG9nKGJ1c19ubywgZGV2X25vLCBzZWdtZW50X3N0YXRlX3J1bm5pbmcsCiAJCSAgICAgIENPTlRST0xWTV9ERVZJQ0VfQ1JFQVRFLCAmaW5tc2ctPmhkciwgcmMsCiAJCSAgICAgIGlubXNnLT5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQgPT0gMSwKLQkJICAgICAgRk9SX1ZJU09SQlVTKHBEZXZJbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQpKTsKKwkJICAgICAgRk9SX1ZJU09SQlVTKGRldl9pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQpKTsKIH0KIAogc3RhdGljIHZvaWQKIG15X2RldmljZV9jaGFuZ2VzdGF0ZShzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKmlubXNnKQogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgKmNtZCA9ICZpbm1zZy0+Y21kOwotCXVsb25nIGJ1c05vID0gY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubzsKLQl1bG9uZyBkZXZObyA9IGNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5kZXZfbm87CisJdWxvbmcgYnVzX25vID0gY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubzsKKwl1bG9uZyBkZXZfbm8gPSBjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vOwogCXN0cnVjdCBzcGFyX3NlZ21lbnRfc3RhdGUgc3RhdGUgPSBjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGU7Ci0Jc3RydWN0IHZpc29yY2hpcHNldF9kZXZpY2VfaW5mbyAqcERldkluZm8gPSBOVUxMOworCXN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKmRldl9pbmZvID0gTlVMTDsKIAlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwogCi0JcERldkluZm8gPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzTm8sIGRldk5vKTsKLQlpZiAoIXBEZXZJbmZvKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSBGYWlsZWQ6IGJ1c05vPSVsdSwgZGV2Tm89JWx1IGludmFsaWQgKGRvZXNuJ3QgZXhpc3QpIiwKLQkJICAgICBidXNObywgZGV2Tm8pOwotCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DSEFOR0VTVEFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJZGV2X2luZm8gPSBmaW5kZGV2aWNlKCZkZXZfaW5mb19saXN0LCBidXNfbm8sIGRldl9ubyk7CisJaWYgKCFkZXZfaW5mbykgeworCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DSEFOR0VTVEFURV9GQUlMVVJFX1BDLCBkZXZfbm8sIGJ1c19ubywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX0lOVkFMSUQ7Ci0JCWdvdG8gQXdheTsKLQl9Ci0JaWYgKHBEZXZJbmZvLT5zdGF0ZS5jcmVhdGVkID09IDApIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFIEZhaWxlZDogYnVzTm89JWx1LCBkZXZObz0lbHUgaW52YWxpZCAobm90IGNyZWF0ZWQpIiwKLQkJICAgICBidXNObywgZGV2Tm8pOwotCQlQT1NUQ09ERV9MSU5VWF80KERFVklDRV9DSEFOR0VTVEFURV9GQUlMVVJFX1BDLCBkZXZObywgYnVzTm8sCisJfSBlbHNlIGlmIChkZXZfaW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7CisJCVBPU1RDT0RFX0xJTlVYXzQoREVWSUNFX0NIQU5HRVNUQVRFX0ZBSUxVUkVfUEMsIGRldl9ubywgYnVzX25vLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyYyA9IC1DT05UUk9MVk1fUkVTUF9FUlJPUl9ERVZJQ0VfSU5WQUxJRDsKIAl9Ci1Bd2F5OgotCWlmICgocmMgPj0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgJiYgcERldkluZm8pCi0JCWRldmljZV9lcGlsb2coYnVzTm8sIGRldk5vLCBzdGF0ZSwgQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwKLQkJCSAgICAgICZpbm1zZy0+aGRyLCByYywKKwlpZiAoKHJjID49IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpICYmIGRldl9pbmZvKQorCQlkZXZpY2VfZXBpbG9nKGJ1c19ubywgZGV2X25vLCBzdGF0ZSwKKwkJCSAgICAgIENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEUsICZpbm1zZy0+aGRyLCByYywKIAkJCSAgICAgIGlubXNnLT5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQgPT0gMSwKIAkJCSAgICAgIEZPUl9WSVNPUkJVUygKLQkJCQkJcERldkluZm8tPmNoYW5faW5mby5jaGFubmVsX3R5cGVfdXVpZCkpOworCQkJCQlkZXZfaW5mby0+Y2hhbl9pbmZvLmNoYW5uZWxfdHlwZV91dWlkKSk7CiB9CiAKIHN0YXRpYyB2b2lkCiBteV9kZXZpY2VfZGVzdHJveShzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKmlubXNnKQogewogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9wYWNrZXQgKmNtZCA9ICZpbm1zZy0+Y21kOwotCXVsb25nIGJ1c05vID0gY21kLT5kZXN0cm95X2RldmljZS5idXNfbm87Ci0JdWxvbmcgZGV2Tm8gPSBjbWQtPmRlc3Ryb3lfZGV2aWNlLmRldl9ubzsKLQlzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvICpwRGV2SW5mbyA9IE5VTEw7CisJdWxvbmcgYnVzX25vID0gY21kLT5kZXN0cm95X2RldmljZS5idXNfbm87CisJdWxvbmcgZGV2X25vID0gY21kLT5kZXN0cm95X2RldmljZS5kZXZfbm87CisJc3RydWN0IHZpc29yY2hpcHNldF9kZXZpY2VfaW5mbyAqZGV2X2luZm8gPSBOVUxMOwogCWludCByYyA9IENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CiAKLQlwRGV2SW5mbyA9IGZpbmRkZXZpY2UoJkRldkluZm9MaXN0LCBidXNObywgZGV2Tm8pOwotCWlmICghcERldkluZm8pIHsKLQkJTE9HRVJSKCJDT05UUk9MVk1fREVWSUNFX0RFU1RST1kgRmFpbGVkOiBidXNObz0lbHUsIGRldk5vPSVsdSBpbnZhbGlkIiwKLQkJICAgICBidXNObywgZGV2Tm8pOworCWRldl9pbmZvID0gZmluZGRldmljZSgmZGV2X2luZm9fbGlzdCwgYnVzX25vLCBkZXZfbm8pOworCWlmICghZGV2X2luZm8pCiAJCXJjID0gLUNPTlRST0xWTV9SRVNQX0VSUk9SX0RFVklDRV9JTlZBTElEOwotCQlnb3RvIEF3YXk7Ci0JfQotCWlmIChwRGV2SW5mby0+c3RhdGUuY3JlYXRlZCA9PSAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZIEZhaWxlZDogYnVzTm89JWx1LCBkZXZObz0lbHUgYWxyZWFkeSBkZXN0cm95ZWQiLAotCQkgICAgIGJ1c05vLCBkZXZObyk7CisJZWxzZSBpZiAoZGV2X2luZm8tPnN0YXRlLmNyZWF0ZWQgPT0gMCkKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfQUxSRUFEWV9ET05FOwotCX0KIAotQXdheToKLQlpZiAoKHJjID49IENPTlRST0xWTV9SRVNQX1NVQ0NFU1MpICYmIHBEZXZJbmZvKQotCQlkZXZpY2VfZXBpbG9nKGJ1c05vLCBkZXZObywgc2VnbWVudF9zdGF0ZV9ydW5uaW5nLAorCWlmICgocmMgPj0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykgJiYgZGV2X2luZm8pCisJCWRldmljZV9lcGlsb2coYnVzX25vLCBkZXZfbm8sIHNlZ21lbnRfc3RhdGVfcnVubmluZywKIAkJCSAgICAgIENPTlRST0xWTV9ERVZJQ0VfREVTVFJPWSwgJmlubXNnLT5oZHIsIHJjLAogCQkJICAgICAgaW5tc2ctPmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCA9PSAxLAogCQkJICAgICAgRk9SX1ZJU09SQlVTKAotCQkJCQlwRGV2SW5mby0+Y2hhbl9pbmZvLmNoYW5uZWxfdHlwZV91dWlkKSk7CisJCQkJCWRldl9pbmZvLT5jaGFuX2luZm8uY2hhbm5lbF90eXBlX3V1aWQpKTsKIH0KIAogLyogV2hlbiBwcm92aWRlZCB3aXRoIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjb250cm9sdm0gY2hhbm5lbAogICogKHBoeXNfYWRkciksIHRoZSBvZmZzZXQgdG8gdGhlIHBheWxvYWQgYXJlYSB3ZSBuZWVkIHRvIG1hbmFnZQogICogKG9mZnNldCksIGFuZCB0aGUgc2l6ZSBvZiB0aGlzIHBheWxvYWQgYXJlYSAoYnl0ZXMpLCBmaWxscyBpbiB0aGUKLSAqIENPTlRST0xWTV9QQVlMT0FEX0lORk8gc3RydWN0LiAgUmV0dXJucyBUUlVFIGZvciBzdWNjZXNzIG9yIEZBTFNFCisgKiBjb250cm9sdm1fcGF5bG9hZF9pbmZvIHN0cnVjdC4gIFJldHVybnMgVFJVRSBmb3Igc3VjY2VzcyBvciBGQUxTRQogICogZm9yIGZhaWx1cmUuCiAgKi8KIHN0YXRpYyBpbnQKIGluaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWRfaW5mbyhIT1NUQUREUkVTUyBwaHlzX2FkZHIsIHU2NCBvZmZzZXQsIHUzMiBieXRlcywKLQkJCQkgIENPTlRST0xWTV9QQVlMT0FEX0lORk8gKmluZm8pCisJCQkJICBzdHJ1Y3QgY29udHJvbHZtX3BheWxvYWRfaW5mbyAqaW5mbykKIHsKIAl1OCBfX2lvbWVtICpwYXlsb2FkID0gTlVMTDsKIAlpbnQgcmMgPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwogCi0JaWYgKGluZm8gPT0gTlVMTCkgewotCQlMT0dFUlIoIkhVSCA/IENPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkIDogUHJvZ3JhbW1lciBjaGVjayBhdCAlczolZCIsCi0JCSAgICAgX19GSUxFX18sIF9fTElORV9fKTsKKwlpZiAoIWluZm8pIHsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfUEFZTE9BRF9JTlZBTElEOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9Ci0JbWVtc2V0KGluZm8sIDAsIHNpemVvZihDT05UUk9MVk1fUEFZTE9BRF9JTkZPKSk7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3QgY29udHJvbHZtX3BheWxvYWRfaW5mbykpOwogCWlmICgob2Zmc2V0ID09IDApIHx8IChieXRlcyA9PSAwKSkgewotCQlMT0dFUlIoIkNPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkOiByZXF1ZXN0X3BheWxvYWRfb2Zmc2V0PSVsbHUgcmVxdWVzdF9wYXlsb2FkX2J5dGVzPSVsbHUhIiwKLQkJICAgICAodTY0KSBvZmZzZXQsICh1NjQpIGJ5dGVzKTsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfUEFZTE9BRF9JTlZBTElEOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAJcGF5bG9hZCA9IGlvcmVtYXBfY2FjaGUocGh5c19hZGRyICsgb2Zmc2V0LCBieXRlcyk7Ci0JaWYgKHBheWxvYWQgPT0gTlVMTCkgewotCQlMT0dFUlIoIkNPTlRST0xWTV9QQVlMT0FEX0lOSVQgRmFpbGVkOiBpb3JlbWFwX2NhY2hlICVsbHUgZm9yICVsbHUgYnl0ZXMgZmFpbGVkIiwKLQkJICAgICAodTY0KSBvZmZzZXQsICh1NjQpIGJ5dGVzKTsKKwlpZiAoIXBheWxvYWQpIHsKIAkJcmMgPSAtQ09OVFJPTFZNX1JFU1BfRVJST1JfSU9SRU1BUF9GQUlMRUQ7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KIAogCWluZm8tPm9mZnNldCA9IG9mZnNldDsKIAlpbmZvLT5ieXRlcyA9IGJ5dGVzOwogCWluZm8tPnB0ciA9IHBheWxvYWQ7Ci0JTE9HSU5GKCJvZmZzZXQ9JWxsdSwgYnl0ZXM9JWx1LCBwdHI9JXAiLAotCSAgICAgICAodTY0KSAoaW5mby0+b2Zmc2V0KSwgKHVsb25nKSAoaW5mby0+Ynl0ZXMpLCBpbmZvLT5wdHIpOwogCi1Bd2F5OgorY2xlYW51cDoKIAlpZiAocmMgPCAwKSB7Ci0JCWlmIChwYXlsb2FkICE9IE5VTEwpIHsKKwkJaWYgKHBheWxvYWQpIHsKIAkJCWlvdW5tYXAocGF5bG9hZCk7CiAJCQlwYXlsb2FkID0gTlVMTDsKIAkJfQpAQCAtMTQyNyw0MyArMTMwNSw0MSBAQAogfQogCiBzdGF0aWMgdm9pZAotZGVzdHJveV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKENPTlRST0xWTV9QQVlMT0FEX0lORk8gKmluZm8pCitkZXN0cm95X2NvbnRyb2x2bV9wYXlsb2FkX2luZm8oc3RydWN0IGNvbnRyb2x2bV9wYXlsb2FkX2luZm8gKmluZm8pCiB7Ci0JaWYgKGluZm8tPnB0ciAhPSBOVUxMKSB7CisJaWYgKGluZm8tPnB0cikgewogCQlpb3VubWFwKGluZm8tPnB0cik7CiAJCWluZm8tPnB0ciA9IE5VTEw7CiAJfQotCW1lbXNldChpbmZvLCAwLCBzaXplb2YoQ09OVFJPTFZNX1BBWUxPQURfSU5GTykpOworCW1lbXNldChpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9wYXlsb2FkX2luZm8pKTsKIH0KIAogc3RhdGljIHZvaWQKIGluaXRpYWxpemVfY29udHJvbHZtX3BheWxvYWQodm9pZCkKIHsKLQlIT1NUQUREUkVTUyBwaHlzX2FkZHIgPSB2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyKENvbnRyb2xWbV9jaGFubmVsKTsKLQl1NjQgcGF5bG9hZE9mZnNldCA9IDA7Ci0JdTMyIHBheWxvYWRCeXRlcyA9IDA7CisJSE9TVEFERFJFU1MgcGh5c19hZGRyID0gdmlzb3JjaGFubmVsX2dldF9waHlzYWRkcihjb250cm9sdm1fY2hhbm5lbCk7CisJdTY0IHBheWxvYWRfb2Zmc2V0ID0gMDsKKwl1MzIgcGF5bG9hZF9ieXRlcyA9IDA7CiAKLQlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKGNvbnRyb2x2bV9jaGFubmVsLAogCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCiAJCQkJICAgICAgIHJlcXVlc3RfcGF5bG9hZF9vZmZzZXQpLAotCQkJICAgICAgJnBheWxvYWRPZmZzZXQsIHNpemVvZihwYXlsb2FkT2Zmc2V0KSkgPCAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX1BBWUxPQURfSU5JVCBGYWlsZWQgdG8gcmVhZCBjb250cm9sdm0gY2hhbm5lbCEiKTsKKwkJCSAgICAgICZwYXlsb2FkX29mZnNldCwgc2l6ZW9mKHBheWxvYWRfb2Zmc2V0KSkgPCAwKSB7CiAJCVBPU1RDT0RFX0xJTlVYXzIoQ09OVFJPTFZNX0lOSVRfRkFJTFVSRV9QQywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCisJaWYgKHZpc29yY2hhbm5lbF9yZWFkKGNvbnRyb2x2bV9jaGFubmVsLAogCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wsCiAJCQkJICAgICAgIHJlcXVlc3RfcGF5bG9hZF9ieXRlcyksCi0JCQkgICAgICAmcGF5bG9hZEJ5dGVzLCBzaXplb2YocGF5bG9hZEJ5dGVzKSkgPCAwKSB7Ci0JCUxPR0VSUigiQ09OVFJPTFZNX1BBWUxPQURfSU5JVCBGYWlsZWQgdG8gcmVhZCBjb250cm9sdm0gY2hhbm5lbCEiKTsKKwkJCSAgICAgICZwYXlsb2FkX2J5dGVzLCBzaXplb2YocGF5bG9hZF9ieXRlcykpIDwgMCkgewogCQlQT1NUQ09ERV9MSU5VWF8yKENPTlRST0xWTV9JTklUX0ZBSUxVUkVfUEMsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybjsKIAl9CiAJaW5pdGlhbGl6ZV9jb250cm9sdm1fcGF5bG9hZF9pbmZvKHBoeXNfYWRkciwKLQkJCQkJICBwYXlsb2FkT2Zmc2V0LCBwYXlsb2FkQnl0ZXMsCi0JCQkJCSAgJkNvbnRyb2xWbV9wYXlsb2FkX2luZm8pOworCQkJCQkgIHBheWxvYWRfb2Zmc2V0LCBwYXlsb2FkX2J5dGVzLAorCQkJCQkgICZjb250cm9sdm1fcGF5bG9hZF9pbmZvKTsKIH0KIAogLyogIFNlbmQgQUNUSU9OPW9ubGluZSBmb3IgREVWUEFUSD0vc3lzL2RldmljZXMvcGxhdGZvcm0vdmlzb3JjaGlwc2V0LgpAQCAtMTQ3Miw3ICsxMzQ4LDcgQEAKIGludAogdmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkodm9pZCkKIHsKLQlrb2JqZWN0X3VldmVudCgmVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9PTkxJTkUpOworCWtvYmplY3RfdWV2ZW50KCZ2aXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX09OTElORSk7CiAJcmV0dXJuIENPTlRST0xWTV9SRVNQX1NVQ0NFU1M7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh2aXNvcmNoaXBzZXRfY2hpcHNldF9yZWFkeSk7CkBAIC0xNDg0LDcgKzEzNjAsNyBAQAogCWNoYXIgKmVudnBbXSA9IHsgZW52X3NlbGZ0ZXN0LCBOVUxMIH07CiAKIAlzcHJpbnRmKGVudl9zZWxmdGVzdCwgIlNQQVJTUF9TRUxGVEVTVD0lZCIsIDEpOwotCWtvYmplY3RfdWV2ZW50X2VudigmVmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9DSEFOR0UsCisJa29iamVjdF91ZXZlbnRfZW52KCZ2aXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX0NIQU5HRSwKIAkJCSAgIGVudnApOwogCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwogfQpAQCAtMTQ5Niw0OSArMTM3Miw0OCBAQAogaW50CiB2aXNvcmNoaXBzZXRfY2hpcHNldF9ub3RyZWFkeSh2b2lkKQogewotCWtvYmplY3RfdWV2ZW50KCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX09GRkxJTkUpOworCWtvYmplY3RfdWV2ZW50KCZ2aXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5rb2JqLCBLT0JKX09GRkxJTkUpOwogCXJldHVybiBDT05UUk9MVk1fUkVTUF9TVUNDRVNTOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkpOwogCiBzdGF0aWMgdm9pZAotY2hpcHNldF9yZWFkeShzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dIZHIpCitjaGlwc2V0X3JlYWR5KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIpCiB7CiAJaW50IHJjID0gdmlzb3JjaGlwc2V0X2NoaXBzZXRfcmVhZHkoKTsKIAogCWlmIChyYyAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKQogCQlyYyA9IC1yYzsKLQlpZiAobXNnSGRyLT5mbGFncy5yZXNwb25zZV9leHBlY3RlZCAmJiAhdmlzb3JjaGlwc2V0X2hvbGRjaGlwc2V0cmVhZHkpCi0JCWNvbnRyb2x2bV9yZXNwb25kKG1zZ0hkciwgcmMpOwotCWlmIChtc2dIZHItPmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkICYmIHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5KSB7CisJaWYgKG1zZ19oZHItPmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkICYmICF2aXNvcmNoaXBzZXRfaG9sZGNoaXBzZXRyZWFkeSkKKwkJY29udHJvbHZtX3Jlc3BvbmQobXNnX2hkciwgcmMpOworCWlmIChtc2dfaGRyLT5mbGFncy5yZXNwb25zZV9leHBlY3RlZCAmJiB2aXNvcmNoaXBzZXRfaG9sZGNoaXBzZXRyZWFkeSkgewogCQkvKiBTZW5kIENISVBTRVRfUkVBRFkgcmVzcG9uc2Ugd2hlbiBhbGwgbW9kdWxlcyBoYXZlIGJlZW4gbG9hZGVkCiAJCSAqIGFuZCBkaXNrcyBtb3VudGVkIGZvciB0aGUgcGFydGl0aW9uCiAJCSAqLwotCQlnX0NoaXBTZXRNc2dIZHIgPSAqbXNnSGRyOwotCQlMT0dJTkYoIkhvbGRpbmcgQ0hJUFNFVF9SRUFEWSByZXNwb25zZSIpOworCQlnX2NoaXBzZXRfbXNnX2hkciA9ICptc2dfaGRyOwogCX0KIH0KIAogc3RhdGljIHZvaWQKLWNoaXBzZXRfc2VsZnRlc3Qoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlciAqbXNnSGRyKQorY2hpcHNldF9zZWxmdGVzdChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dfaGRyKQogewogCWludCByYyA9IHZpc29yY2hpcHNldF9jaGlwc2V0X3NlbGZ0ZXN0KCk7CiAKIAlpZiAocmMgIT0gQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUykKIAkJcmMgPSAtcmM7Ci0JaWYgKG1zZ0hkci0+ZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCWNvbnRyb2x2bV9yZXNwb25kKG1zZ0hkciwgcmMpOworCWlmIChtc2dfaGRyLT5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKKwkJY29udHJvbHZtX3Jlc3BvbmQobXNnX2hkciwgcmMpOwogfQogCiBzdGF0aWMgdm9pZAotY2hpcHNldF9ub3RyZWFkeShzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyICptc2dIZHIpCitjaGlwc2V0X25vdHJlYWR5KHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIgKm1zZ19oZHIpCiB7CiAJaW50IHJjID0gdmlzb3JjaGlwc2V0X2NoaXBzZXRfbm90cmVhZHkoKTsKIAogCWlmIChyYyAhPSBDT05UUk9MVk1fUkVTUF9TVUNDRVNTKQogCQlyYyA9IC1yYzsKLQlpZiAobXNnSGRyLT5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKLQkJY29udHJvbHZtX3Jlc3BvbmQobXNnSGRyLCByYyk7CisJaWYgKG1zZ19oZHItPmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQorCQljb250cm9sdm1fcmVzcG9uZChtc2dfaGRyLCByYyk7CiB9CiAKIC8qIFRoaXMgaXMgeW91ciAib25lLXN0b3AiIHNob3AgZm9yIGdyYWJiaW5nIHRoZSBuZXh0IG1lc3NhZ2UgZnJvbSB0aGUKQEAgLTE1NDcsMTQgKzE0MjIsMTEgQEAKIHN0YXRpYyBCT09MCiByZWFkX2NvbnRyb2x2bV9ldmVudChzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgKm1zZykKIHsKLQlpZiAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShDb250cm9sVm1fY2hhbm5lbCwKKwlpZiAodmlzb3JjaGFubmVsX3NpZ25hbHJlbW92ZShjb250cm9sdm1fY2hhbm5lbCwKIAkJCQkgICAgICBDT05UUk9MVk1fUVVFVUVfRVZFTlQsIG1zZykpIHsKIAkJLyogZ290IGEgbWVzc2FnZSAqLwotCQlpZiAobXNnLT5oZHIuZmxhZ3MudGVzdF9tZXNzYWdlID09IDEpIHsKLQkJCUxPR0VSUigiaWdub3JpbmcgYmFkIENPTlRST0xWTV9RVUVVRV9FVkVOVCBtc2cgd2l0aCBjb250cm9sdm1fbXNnX2lkPTB4JXggYmVjYXVzZSBGbGFncy50ZXN0TWVzc2FnZSBpcyBub25zZW5zaWNhbCAoPTEpIiwKLQkJCSAgICAgICBtc2ctPmhkci5pZCk7CisJCWlmIChtc2ctPmhkci5mbGFncy50ZXN0X21lc3NhZ2UgPT0gMSkKIAkJCXJldHVybiBGQUxTRTsKLQkJfQogCQlyZXR1cm4gVFJVRTsKIAl9CiAJcmV0dXJuIEZBTFNFOwpAQCAtMTYwNCwxMCArMTQ3NiwxMCBAQAogc3RhdGljIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICoKIHBhcmFob3RwbHVnX3JlcXVlc3RfY3JlYXRlKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSAqbXNnKQogewotCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQotCSAgICBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCksCi0JCSAgICBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOwotCWlmIChyZXEgPT0gTlVMTCkKKwlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxOworCisJcmVxID0ga21hbGxvYyhzaXplb2YoKnJlcSksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAoIXJlcSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXEtPmlkID0gcGFyYWhvdHBsdWdfbmV4dF9pZCgpOwpAQCAtMTY1MiwxMyArMTUyNCw3IEBACiAJc3ByaW50ZihlbnZfZnVuYywgIlNQQVJfUEFSQUhPVFBMVUdfRlVOQ1RJT049JWQiLAogCQljbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vICYgMHg3KTsKIAotCUxPR0lORigicGFyYWhvdHBsdWdfcmVxdWVzdF9raWNrb2ZmOiBzdGF0ZT0lZCwgYmRmPSVkLyVkLyVkLCBpZD0ldVxuIiwKLQkgICAgICAgY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlLmFjdGl2ZSwKLQkgICAgICAgY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubywKLQkgICAgICAgY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmRldl9ubyA+PiAzLAotCSAgICAgICBjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vICYgNywgcmVxLT5pZCk7Ci0KLQlrb2JqZWN0X3VldmVudF9lbnYoJlZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmtvYmosIEtPQkpfQ0hBTkdFLAorCWtvYmplY3RfdWV2ZW50X2Vudigmdmlzb3JjaGlwc2V0X3BsYXRmb3JtX2RldmljZS5kZXYua29iaiwgS09CSl9DSEFOR0UsCiAJCQkgICBlbnZwKTsKIH0KIApAQCAtMTY3MiwyMyArMTUzOCwyNSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnBvcyA9IE5VTEw7CiAJc3RydWN0IGxpc3RfaGVhZCAqdG1wID0gTlVMTDsKIAotCXNwaW5fbG9jaygmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCXNwaW5fbG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHBvcywgdG1wLCAmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KSB7CiAJCXN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0ICpyZXEgPQogCQkgICAgbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBwYXJhaG90cGx1Z19yZXF1ZXN0LCBsaXN0KTsKLQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcmVxLT5leHBpcmF0aW9uKSkgewotCQkJbGlzdF9kZWwocG9zKTsKLQkJCWlmIChyZXEtPm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCi0JCQkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgKLQkJCQkJJnJlcS0+bXNnLmhkciwKLQkJCQkJQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCwKLQkJCQkJcmVxLT5tc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOwotCQkJcGFyYWhvdHBsdWdfcmVxdWVzdF9kZXN0cm95KHJlcSk7Ci0JCX0KKworCQlpZiAoIXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcmVxLT5leHBpcmF0aW9uKSkKKwkJCWNvbnRpbnVlOworCisJCWxpc3RfZGVsKHBvcyk7CisJCWlmIChyZXEtPm1zZy5oZHIuZmxhZ3MucmVzcG9uc2VfZXhwZWN0ZWQpCisJCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKAorCQkJCSZyZXEtPm1zZy5oZHIsCisJCQkJQ09OVFJPTFZNX1JFU1BfRVJST1JfREVWSUNFX1VERVZfVElNRU9VVCwKKwkJCQlyZXEtPm1zZy5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSk7CisJCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOwogCX0KIAotCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKIH0KIAogLyoKQEAgLTE3MDIsMTAgKzE1NzAsMTAgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwb3MgPSBOVUxMOwogCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCA9IE5VTEw7CiAKLQlzcGluX2xvY2soJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKKwlzcGluX2xvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKIAogCS8qIExvb2sgZm9yIGEgcmVxdWVzdCBtYXRjaGluZyAiaWQiLiAqLwotCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIHRtcCwgJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdCkgewogCQlzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCAqcmVxID0KIAkJICAgIGxpc3RfZW50cnkocG9zLCBzdHJ1Y3QgcGFyYWhvdHBsdWdfcmVxdWVzdCwgbGlzdCk7CiAJCWlmIChyZXEtPmlkID09IGlkKSB7CkBAIC0xNzEzLDcgKzE1ODEsNyBAQAogCQkJICogcmVzcG9uZC4KIAkJCSAqLwogCQkJbGlzdF9kZWwocG9zKTsKLQkJCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJCQlzcGluX3VubG9jaygmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOwogCQkJcmVxLT5tc2cuY21kLmRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUuYWN0aXZlID0gYWN0aXZlOwogCQkJaWYgKHJlcS0+bXNnLmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKIAkJCQljb250cm9sdm1fcmVzcG9uZF9waHlzZGV2X2NoYW5nZXN0YXRlKApAQCAtMTcyNCw3ICsxNTkyLDcgQEAKIAkJfQogCX0KIAotCXNwaW5fdW5sb2NrKCZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3RfbG9jayk7CisJc3Bpbl91bmxvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE3MzgsMTAgKzE2MDYsOCBAQAogCiAJcmVxID0gcGFyYWhvdHBsdWdfcmVxdWVzdF9jcmVhdGUoaW5tc2cpOwogCi0JaWYgKHJlcSA9PSBOVUxMKSB7Ci0JCUxPR0VSUigicGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlOiBjb3VsZG4ndCBhbGxvY2F0ZSByZXF1ZXN0Iik7CisJaWYgKCFyZXEpCiAJCXJldHVybjsKLQl9CiAKIAlpZiAoaW5tc2ctPmNtZC5kZXZpY2VfY2hhbmdlX3N0YXRlLnN0YXRlLmFjdGl2ZSkgewogCQkvKiBGb3IgZW5hYmxlIG1lc3NhZ2VzLCBqdXN0IHJlc3BvbmQgd2l0aCBzdWNjZXNzCkBAIC0xNzU1LDggKzE2MjEsOCBAQAogCQkqLwogCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYocmVxKTsKIAkJY29udHJvbHZtX3Jlc3BvbmRfcGh5c2Rldl9jaGFuZ2VzdGF0ZSgmaW5tc2ctPmhkciwKLQkJCQlDT05UUk9MVk1fUkVTUF9TVUNDRVNTLCBpbm1zZy0+Y21kLgotCQkJCWRldmljZV9jaGFuZ2Vfc3RhdGUuc3RhdGUpOworCQkJQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUywKKwkJCWlubXNnLT5jbWQuZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZSk7CiAJCXBhcmFob3RwbHVnX3JlcXVlc3RfZGVzdHJveShyZXEpOwogCX0gZWxzZSB7CiAJCS8qIEZvciBkaXNhYmxlIG1lc3NhZ2VzLCBhZGQgdGhlIHJlcXVlc3QgdG8gdGhlCkBAIC0xNzY0LDkgKzE2MzAsOSBAQAogCQkqIHdvbid0IGdldCByZXNwb25kZWQgdG8gdW50aWwgdGhlIHNjcmlwdCBoYXMKIAkJKiBpbmRpY2F0ZWQgaXQncyBkb25lLgogCQkqLwotCQlzcGluX2xvY2soJlBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmKHJlcS0+bGlzdCksICZQYXJhaG90cGx1Z19yZXF1ZXN0X2xpc3QpOwotCQlzcGluX3VubG9jaygmUGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0X2xvY2spOworCQlzcGluX2xvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmcGFyYWhvdHBsdWdfcmVxdWVzdF9saXN0KTsKKwkJc3Bpbl91bmxvY2soJnBhcmFob3RwbHVnX3JlcXVlc3RfbGlzdF9sb2NrKTsKIAogCQlwYXJhaG90cGx1Z19yZXF1ZXN0X2tpY2tvZmYocmVxKTsKIAl9CkBAIC0xNzg3LDEzNSArMTY1Myw5NCBAQAogaGFuZGxlX2NvbW1hbmQoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGlubXNnLCBIT1NUQUREUkVTUyBjaGFubmVsX2FkZHIpCiB7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX3BhY2tldCAqY21kID0gJmlubXNnLmNtZDsKLQl1NjQgcGFyYW1ldGVyc0FkZHIgPSAwOwotCXUzMiBwYXJhbWV0ZXJzQnl0ZXMgPSAwOwotCVBBUlNFUl9DT05URVhUICpwYXJzZXJfY3R4ID0gTlVMTDsKLQlCT09MIGlzTG9jYWxBZGRyID0gRkFMU0U7CisJdTY0IHBhcm1fYWRkciA9IDA7CisJdTMyIHBhcm1fYnl0ZXMgPSAwOworCXN0cnVjdCBwYXJzZXJfY29udGV4dCAqcGFyc2VyX2N0eCA9IE5VTEw7CisJYm9vbCBsb2NhbF9hZGRyID0gZmFsc2U7CiAJc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlIGFja21zZzsKIAogCS8qIGNyZWF0ZSBwYXJzaW5nIGNvbnRleHQgaWYgbmVjZXNzYXJ5ICovCi0JaXNMb2NhbEFkZHIgPSAoaW5tc2cuaGRyLmZsYWdzLnRlc3RfbWVzc2FnZSA9PSAxKTsKLQlpZiAoY2hhbm5lbF9hZGRyID09IDApIHsKLQkJTE9HRVJSKCJIVUg/IGNoYW5uZWxfYWRkciBpcyAwISIpOworCWxvY2FsX2FkZHIgPSAoaW5tc2cuaGRyLmZsYWdzLnRlc3RfbWVzc2FnZSA9PSAxKTsKKwlpZiAoY2hhbm5lbF9hZGRyID09IDApCiAJCXJldHVybiBUUlVFOwotCX0KLQlwYXJhbWV0ZXJzQWRkciA9IGNoYW5uZWxfYWRkciArIGlubXNnLmhkci5wYXlsb2FkX3ZtX29mZnNldDsKLQlwYXJhbWV0ZXJzQnl0ZXMgPSBpbm1zZy5oZHIucGF5bG9hZF9ieXRlczsKKwlwYXJtX2FkZHIgPSBjaGFubmVsX2FkZHIgKyBpbm1zZy5oZHIucGF5bG9hZF92bV9vZmZzZXQ7CisJcGFybV9ieXRlcyA9IGlubXNnLmhkci5wYXlsb2FkX2J5dGVzOwogCiAJLyogUGFyYW1ldGVyIGFuZCBjaGFubmVsIGFkZHJlc3NlcyB3aXRoaW4gdGVzdCBtZXNzYWdlcyBhY3R1YWxseSBsaWUKIAkgKiB3aXRoaW4gb3VyIE9TLWNvbnRyb2xsZWQgbWVtb3J5LiAgV2UgbmVlZCB0byBrbm93IHRoYXQsIGJlY2F1c2UgaXQKIAkgKiBtYWtlcyBhIGRpZmZlcmVuY2UgaW4gaG93IHdlIGNvbXB1dGUgdGhlIHZpcnR1YWwgYWRkcmVzcy4KIAkgKi8KLQlpZiAocGFyYW1ldGVyc0FkZHIgIT0gMCAmJiBwYXJhbWV0ZXJzQnl0ZXMgIT0gMCkgeworCWlmIChwYXJtX2FkZHIgIT0gMCAmJiBwYXJtX2J5dGVzICE9IDApIHsKIAkJQk9PTCByZXRyeSA9IEZBTFNFOwogCiAJCXBhcnNlcl9jdHggPQotCQkgICAgcGFyc2VyX2luaXRfYnl0ZVN0cmVhbShwYXJhbWV0ZXJzQWRkciwgcGFyYW1ldGVyc0J5dGVzLAotCQkJCQkgICBpc0xvY2FsQWRkciwgJnJldHJ5KTsKLQkJaWYgKCFwYXJzZXJfY3R4KSB7Ci0JCQlpZiAocmV0cnkpIHsKLQkJCQlMT0dXUk4oInRocm90dGxpbmcgdG8gY29weSBwYXlsb2FkIik7Ci0JCQkJcmV0dXJuIEZBTFNFOwotCQkJfQotCQkJTE9HV1JOKCJwYXJzaW5nIGZhaWxlZCIpOwotCQkJTE9HV1JOKCJpbm1zZy5oZHIuSWQ9MHglbHgiLCAodWxvbmcpIGlubXNnLmhkci5pZCk7Ci0JCQlMT0dXUk4oInBhcmFtZXRlcnNBZGRyPTB4JWxseCIsICh1NjQpIHBhcmFtZXRlcnNBZGRyKTsKLQkJCUxPR1dSTigicGFyYW1ldGVyc0J5dGVzPSVsdSIsICh1bG9uZykgcGFyYW1ldGVyc0J5dGVzKTsKLQkJCUxPR1dSTigiaXNMb2NhbEFkZHI9JWQiLCBpc0xvY2FsQWRkcik7Ci0JCX0KKwkJICAgIHBhcnNlcl9pbml0X2J5dGVfc3RyZWFtKHBhcm1fYWRkciwgcGFybV9ieXRlcywKKwkJCQkJICAgIGxvY2FsX2FkZHIsICZyZXRyeSk7CisJCWlmICghcGFyc2VyX2N0eCAmJiByZXRyeSkKKwkJCXJldHVybiBGQUxTRTsKIAl9CiAKLQlpZiAoIWlzTG9jYWxBZGRyKSB7CisJaWYgKCFsb2NhbF9hZGRyKSB7CiAJCWNvbnRyb2x2bV9pbml0X3Jlc3BvbnNlKCZhY2ttc2csICZpbm1zZy5oZHIsCiAJCQkJCUNPTlRST0xWTV9SRVNQX1NVQ0NFU1MpOwotCQlpZiAoKENvbnRyb2xWbV9jaGFubmVsKQotCQkgICAgJiYKLQkJICAgICghdmlzb3JjaGFubmVsX3NpZ25hbGluc2VydAotCQkgICAgIChDb250cm9sVm1fY2hhbm5lbCwgQ09OVFJPTFZNX1FVRVVFX0FDSywgJmFja21zZykpKQotCQkJTE9HV1JOKCJmYWlsZWQgdG8gc2VuZCBBQ0sgZmFpbGVkIik7CisJCWlmIChjb250cm9sdm1fY2hhbm5lbCkKKwkJCXZpc29yY2hhbm5lbF9zaWduYWxpbnNlcnQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkJCQkgIENPTlRST0xWTV9RVUVVRV9BQ0ssCisJCQkJCQkgICZhY2ttc2cpOwogCX0KIAlzd2l0Y2ggKGlubXNnLmhkci5pZCkgewogCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfSU5JVDoKLQkJTE9HSU5GKCJDSElQU0VUX0lOSVQoI2J1c3Nlcz0lbHUsI3N3aXRjaGVzPSVsdSkiLAotCQkgICAgICAgKHVsb25nKSBpbm1zZy5jbWQuaW5pdF9jaGlwc2V0LmJ1c19jb3VudCwKLQkJICAgICAgICh1bG9uZykgaW5tc2cuY21kLmluaXRfY2hpcHNldC5zd2l0Y2hfY291bnQpOwogCQljaGlwc2V0X2luaXQoJmlubXNnKTsKIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fQlVTX0NSRUFURToKLQkJTE9HSU5GKCJCVVNfQ1JFQVRFKCVsdSwjZGV2cz0lbHUpIiwKLQkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVfYnVzLmJ1c19ubywKLQkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVfYnVzLmRldl9jb3VudCk7CiAJCWJ1c19jcmVhdGUoJmlubXNnKTsKIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fQlVTX0RFU1RST1k6Ci0JCUxPR0lORigiQlVTX0RFU1RST1koJWx1KSIsICh1bG9uZykgY21kLT5kZXN0cm95X2J1cy5idXNfbm8pOwogCQlidXNfZGVzdHJveSgmaW5tc2cpOwogCQlicmVhazsKIAljYXNlIENPTlRST0xWTV9CVVNfQ09ORklHVVJFOgotCQlMT0dJTkYoIkJVU19DT05GSUdVUkUoJWx1KSIsICh1bG9uZykgY21kLT5jb25maWd1cmVfYnVzLmJ1c19ubyk7CiAJCWJ1c19jb25maWd1cmUoJmlubXNnLCBwYXJzZXJfY3R4KTsKIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NSRUFURToKLQkJTE9HSU5GKCJERVZJQ0VfQ1JFQVRFKCVsdSwlbHUpIiwKLQkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVfZGV2aWNlLmJ1c19ubywKLQkJICAgICAgICh1bG9uZykgY21kLT5jcmVhdGVfZGV2aWNlLmRldl9ubyk7CiAJCW15X2RldmljZV9jcmVhdGUoJmlubXNnKTsKIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fREVWSUNFX0NIQU5HRVNUQVRFOgogCQlpZiAoY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmZsYWdzLnBoeXNfZGV2aWNlKSB7Ci0JCQlMT0dJTkYoIkRFVklDRV9DSEFOR0VTVEFURSBmb3IgcGh5c2ljYWwgZGV2aWNlICglbHUsJWx1LCBhY3RpdmU9JWx1KSIsCi0JCQkgICAgICh1bG9uZykgY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubywKLQkJCSAgICAgKHVsb25nKSBjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vLAotCQkJICAgICAodWxvbmcpIGNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZS5hY3RpdmUpOwogCQkJcGFyYWhvdHBsdWdfcHJvY2Vzc19tZXNzYWdlKCZpbm1zZyk7CiAJCX0gZWxzZSB7Ci0JCQlMT0dJTkYoIkRFVklDRV9DSEFOR0VTVEFURSBmb3IgdmlydHVhbCBkZXZpY2UgKCVsdSwlbHUsIHN0YXRlLkFsaXZlPTB4JWx4KSIsCi0JCQkgICAgICh1bG9uZykgY21kLT5kZXZpY2VfY2hhbmdlX3N0YXRlLmJ1c19ubywKLQkJCSAgICAgKHVsb25nKSBjbWQtPmRldmljZV9jaGFuZ2Vfc3RhdGUuZGV2X25vLAotCQkJICAgICAodWxvbmcpIGNtZC0+ZGV2aWNlX2NoYW5nZV9zdGF0ZS5zdGF0ZS5hbGl2ZSk7CiAJCQkvKiBzYXZlIHRoZSBoZHIgYW5kIGNtZCBzdHJ1Y3R1cmVzIGZvciBsYXRlciB1c2UgKi8KIAkJCS8qIHdoZW4gc2VuZGluZyBiYWNrIHRoZSByZXNwb25zZSB0byBDb21tYW5kICovCiAJCQlteV9kZXZpY2VfY2hhbmdlc3RhdGUoJmlubXNnKTsKLQkJCWdfRGlhZ01zZ0hkciA9IGlubXNnLmhkcjsKLQkJCWdfRGV2aWNlQ2hhbmdlU3RhdGVQYWNrZXQgPSBpbm1zZy5jbWQ7CisJCQlnX2RpYWdfbXNnX2hkciA9IGlubXNnLmhkcjsKKwkJCWdfZGV2aWNlY2hhbmdlc3RhdGVfcGFja2V0ID0gaW5tc2cuY21kOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fREVWSUNFX0RFU1RST1k6Ci0JCUxPR0lORigiREVWSUNFX0RFU1RST1koJWx1LCVsdSkiLAotCQkgICAgICAgKHVsb25nKSBjbWQtPmRlc3Ryb3lfZGV2aWNlLmJ1c19ubywKLQkJICAgICAgICh1bG9uZykgY21kLT5kZXN0cm95X2RldmljZS5kZXZfbm8pOwogCQlteV9kZXZpY2VfZGVzdHJveSgmaW5tc2cpOwogCQlicmVhazsKIAljYXNlIENPTlRST0xWTV9ERVZJQ0VfQ09ORklHVVJFOgotCQlMT0dJTkYoIkRFVklDRV9DT05GSUdVUkUoJWx1LCVsdSkiLAotCQkgICAgICAgKHVsb25nKSBjbWQtPmNvbmZpZ3VyZV9kZXZpY2UuYnVzX25vLAotCQkgICAgICAgKHVsb25nKSBjbWQtPmNvbmZpZ3VyZV9kZXZpY2UuZGV2X25vKTsKIAkJLyogbm8gb3AgZm9yIG5vdywganVzdCBzZW5kIGEgcmVzcG9uZCB0aGF0IHdlIHBhc3NlZCAqLwogCQlpZiAoaW5tc2cuaGRyLmZsYWdzLnJlc3BvbnNlX2V4cGVjdGVkKQogCQkJY29udHJvbHZtX3Jlc3BvbmQoJmlubXNnLmhkciwgQ09OVFJPTFZNX1JFU1BfU1VDQ0VTUyk7CiAJCWJyZWFrOwogCWNhc2UgQ09OVFJPTFZNX0NISVBTRVRfUkVBRFk6Ci0JCUxPR0lORigiQ0hJUFNFVF9SRUFEWSIpOwogCQljaGlwc2V0X3JlYWR5KCZpbm1zZy5oZHIpOwogCQlicmVhazsKIAljYXNlIENPTlRST0xWTV9DSElQU0VUX1NFTEZURVNUOgotCQlMT0dJTkYoIkNISVBTRVRfU0VMRlRFU1QiKTsKIAkJY2hpcHNldF9zZWxmdGVzdCgmaW5tc2cuaGRyKTsKIAkJYnJlYWs7CiAJY2FzZSBDT05UUk9MVk1fQ0hJUFNFVF9TVE9QOgotCQlMT0dJTkYoIkNISVBTRVRfU1RPUCIpOwogCQljaGlwc2V0X25vdHJlYWR5KCZpbm1zZy5oZHIpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlMT0dFUlIoInVucmVjb2duaXplZCBjb250cm9sdm0gY21kPSVkIiwgKGludCkgaW5tc2cuaGRyLmlkKTsKIAkJaWYgKGlubXNnLmhkci5mbGFncy5yZXNwb25zZV9leHBlY3RlZCkKIAkJCWNvbnRyb2x2bV9yZXNwb25kKCZpbm1zZy5oZHIsCi0JCQkJCSAgLUNPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTik7CisJCQkJLUNPTlRST0xWTV9SRVNQX0VSUk9SX01FU1NBR0VfSURfVU5LTk9XTik7CiAJCWJyZWFrOwogCX0KIAotCWlmIChwYXJzZXJfY3R4ICE9IE5VTEwpIHsKKwlpZiAocGFyc2VyX2N0eCkgewogCQlwYXJzZXJfZG9uZShwYXJzZXJfY3R4KTsKIAkJcGFyc2VyX2N0eCA9IE5VTEw7CiAJfQpAQCAtMTkyNywxMiArMTc1Miw5IEBACiAJdTY0IGFkZHIgPSAwOwogCXUzMiBzaXplID0gMDsKIAotCWlmICghVk1DQUxMX1NVQ0NFU1NGVUwoaXNzdWVfdm1jYWxsX2lvX2NvbnRyb2x2bV9hZGRyKCZhZGRyLCAmc2l6ZSkpKSB7Ci0JCUVSUkRSVigiJXMgLSB2bWNhbGwgdG8gZGV0ZXJtaW5lIGNvbnRyb2x2bSBjaGFubmVsIGFkZHIgZmFpbGVkIiwKLQkJICAgICAgIF9fZnVuY19fKTsKKwlpZiAoIVZNQ0FMTF9TVUNDRVNTRlVMKGlzc3VlX3ZtY2FsbF9pb19jb250cm9sdm1fYWRkcigmYWRkciwgJnNpemUpKSkKIAkJcmV0dXJuIDA7Ci0JfQotCUlORk9EUlYoImNvbnRyb2x2bSBhZGRyPSVMeCIsIGFkZHIpOworCiAJcmV0dXJuIGFkZHI7CiB9CiAKQEAgLTE5NDAsNjkgKzE3NjIsNjMgQEAKIGNvbnRyb2x2bV9wZXJpb2RpY193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2UgaW5tc2c7Ci0JQk9PTCBnb3RBQ29tbWFuZCA9IEZBTFNFOworCUJPT0wgZ290X2NvbW1hbmQgPSBGQUxTRTsKIAlCT09MIGhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IEZBTFNFOwotCXN0YXRpYyB1NjQgUG9sbF9Db3VudDsKKwlzdGF0aWMgdTY0IHBvbGxfY291bnQ7CiAKIAkvKiBtYWtlIHN1cmUgdmlzb3JidXMgc2VydmVyIGlzIHJlZ2lzdGVyZWQgZm9yIGNvbnRyb2x2bSBjYWxsYmFja3MgKi8KIAlpZiAodmlzb3JjaGlwc2V0X3NlcnZlcnJlZ3dhaXQgJiYgIXNlcnZlcnJlZ2lzdGVyZWQpCi0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCS8qIG1ha2Ugc3VyZSB2aXNvcmNsaWVudGJ1cyBzZXJ2ZXIgaXMgcmVnc2l0ZXJlZCBmb3IgY29udHJvbHZtCiAJICogY2FsbGJhY2tzCiAJICovCiAJaWYgKHZpc29yY2hpcHNldF9jbGllbnRyZWd3YWl0ICYmICFjbGllbnRyZWdpc3RlcmVkKQotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAotCVBvbGxfQ291bnQrKzsKLQlpZiAoUG9sbF9Db3VudCA+PSAyNTApCisJcG9sbF9jb3VudCsrOworCWlmIChwb2xsX2NvdW50ID49IDI1MCkKIAkJOwkvKiBrZWVwIGdvaW5nICovCiAJZWxzZQotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAogCS8qIENoZWNrIGV2ZW50cyB0byBkZXRlcm1pbmUgaWYgcmVzcG9uc2UgdG8gQ0hJUFNFVF9SRUFEWQogCSAqIHNob3VsZCBiZSBzZW50CiAJICovCi0JaWYgKHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5Ci0JICAgICYmIChnX0NoaXBTZXRNc2dIZHIuaWQgIT0gQ09OVFJPTFZNX0lOVkFMSUQpKSB7CisJaWYgKHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5ICYmCisJICAgIChnX2NoaXBzZXRfbXNnX2hkci5pZCAhPSBDT05UUk9MVk1fSU5WQUxJRCkpIHsKIAkJaWYgKGNoZWNrX2NoaXBzZXRfZXZlbnRzKCkgPT0gMSkgewotCQkJTE9HSU5GKCJTZW5kaW5nIENISVBTRVRfUkVBRFkgcmVzcG9uc2UiKTsKLQkJCWNvbnRyb2x2bV9yZXNwb25kKCZnX0NoaXBTZXRNc2dIZHIsIDApOworCQkJY29udHJvbHZtX3Jlc3BvbmQoJmdfY2hpcHNldF9tc2dfaGRyLCAwKTsKIAkJCWNsZWFyX2NoaXBzZXRfZXZlbnRzKCk7Ci0JCQltZW1zZXQoJmdfQ2hpcFNldE1zZ0hkciwgMCwKKwkJCW1lbXNldCgmZ19jaGlwc2V0X21zZ19oZHIsIDAsCiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKIAkJfQogCX0KIAotCXdoaWxlICh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKENvbnRyb2xWbV9jaGFubmVsLAorCXdoaWxlICh2aXNvcmNoYW5uZWxfc2lnbmFscmVtb3ZlKGNvbnRyb2x2bV9jaGFubmVsLAogCQkJCQkgQ09OVFJPTFZNX1FVRVVFX1JFU1BPTlNFLAotCQkJCQkgJmlubXNnKSkgewotCQlpZiAoaW5tc2cuaGRyLnBheWxvYWRfbWF4X2J5dGVzICE9IDApIHsKLQkJCUxPR0VSUigiUGF5bG9hZCBvZiBzaXplICVsdSByZXR1cm5lZCBAJWx1IHdpdGggdW5leHBlY3RlZCBtZXNzYWdlIGlkICVkLiIsCi0JCQkgICAgICh1bG9uZykgaW5tc2cuaGRyLnBheWxvYWRfbWF4X2J5dGVzLAotCQkJICAgICAodWxvbmcpIGlubXNnLmhkci5wYXlsb2FkX3ZtX29mZnNldCwKLQkJCSAgICAgaW5tc2cuaGRyLmlkKTsKLQkJfQotCX0KLQlpZiAoIWdvdEFDb21tYW5kKSB7Ci0JCWlmIChDb250cm9sVm1fUGVuZGluZ19Nc2dfVmFsaWQpIHsKKwkJCQkJICZpbm1zZykpCisJCTsKKwlpZiAoIWdvdF9jb21tYW5kKSB7CisJCWlmIChjb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQpIHsKIAkJCS8qIHdlIHRocm90dGxlZCBwcm9jZXNzaW5nIG9mIGEgcHJpb3IKIAkJCSogbXNnLCBzbyB0cnkgdG8gcHJvY2VzcyBpdCBhZ2FpbgogCQkJKiByYXRoZXIgdGhhbiByZWFkaW5nIGEgbmV3IG9uZQogCQkJKi8KLQkJCWlubXNnID0gQ29udHJvbFZtX1BlbmRpbmdfTXNnOwotCQkJQ29udHJvbFZtX1BlbmRpbmdfTXNnX1ZhbGlkID0gRkFMU0U7Ci0JCQlnb3RBQ29tbWFuZCA9IFRSVUU7Ci0JCX0gZWxzZQotCQkJZ290QUNvbW1hbmQgPSByZWFkX2NvbnRyb2x2bV9ldmVudCgmaW5tc2cpOworCQkJaW5tc2cgPSBjb250cm9sdm1fcGVuZGluZ19tc2c7CisJCQljb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQgPSBGQUxTRTsKKwkJCWdvdF9jb21tYW5kID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWdvdF9jb21tYW5kID0gcmVhZF9jb250cm9sdm1fZXZlbnQoJmlubXNnKTsKKwkJfQogCX0KIAogCWhhbmRsZV9jb21tYW5kX2ZhaWxlZCA9IEZBTFNFOwotCXdoaWxlIChnb3RBQ29tbWFuZCAmJiAoIWhhbmRsZV9jb21tYW5kX2ZhaWxlZCkpIHsKLQkJTW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzID0gamlmZmllczsKKwl3aGlsZSAoZ290X2NvbW1hbmQgJiYgKCFoYW5kbGVfY29tbWFuZF9mYWlsZWQpKSB7CisJCW1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyA9IGppZmZpZXM7CiAJCWlmIChoYW5kbGVfY29tbWFuZChpbm1zZywKIAkJCQkgICB2aXNvcmNoYW5uZWxfZ2V0X3BoeXNhZGRyCi0JCQkJICAgKENvbnRyb2xWbV9jaGFubmVsKSkpCi0JCQlnb3RBQ29tbWFuZCA9IHJlYWRfY29udHJvbHZtX2V2ZW50KCZpbm1zZyk7CisJCQkJICAgKGNvbnRyb2x2bV9jaGFubmVsKSkpCisJCQlnb3RfY29tbWFuZCA9IHJlYWRfY29udHJvbHZtX2V2ZW50KCZpbm1zZyk7CiAJCWVsc2UgewogCQkJLyogdGhpcyBpcyBhIHNjZW5hcmlvIHdoZXJlIHRocm90dGxpbmcKIAkJCSogaXMgcmVxdWlyZWQsIGJ1dCBwcm9iYWJseSBOT1QgYW4KQEAgLTIwMTEsNTYgKzE4MjcsNTEgQEAKIAkJCSogcmVwcm9jZXNzIGl0IG9uIG91ciBuZXh0IGxvb3AKIAkJCSovCiAJCQloYW5kbGVfY29tbWFuZF9mYWlsZWQgPSBUUlVFOwotCQkJQ29udHJvbFZtX1BlbmRpbmdfTXNnID0gaW5tc2c7Ci0JCQlDb250cm9sVm1fUGVuZGluZ19Nc2dfVmFsaWQgPSBUUlVFOworCQkJY29udHJvbHZtX3BlbmRpbmdfbXNnID0gaW5tc2c7CisJCQljb250cm9sdm1fcGVuZGluZ19tc2dfdmFsaWQgPSBUUlVFOwogCQl9CiAJfQogCiAJLyogcGFyYWhvdHBsdWdfd29ya2VyICovCiAJcGFyYWhvdHBsdWdfcHJvY2Vzc19saXN0KCk7CiAKLUF3YXk6CitjbGVhbnVwOgogCiAJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKLQkJICAgICAgIE1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyArIChIWiAqIE1JTl9JRExFX1NFQ09ORFMpKSkgeworCQkgICAgICAgbW9zdF9yZWNlbnRfbWVzc2FnZV9qaWZmaWVzICsgKEhaICogTUlOX0lETEVfU0VDT05EUykpKSB7CiAJCS8qIGl0J3MgYmVlbiBsb25nZXIgdGhhbiBNSU5fSURMRV9TRUNPTkRTIHNpbmNlIHdlCiAJCSogcHJvY2Vzc2VkIG91ciBsYXN0IGNvbnRyb2x2bSBtZXNzYWdlOyBzbG93IGRvd24gdGhlCiAJCSogcG9sbGluZwogCQkqLwotCQlpZiAoUG9sbF9qaWZmaWVzICE9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVykgewotCQkJTE9HSU5GKCJzd2l0Y2hlZCB0byBzbG93IGNvbnRyb2x2bSBwb2xsaW5nIik7Ci0JCQlQb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1c7Ci0JCX0KKwkJaWYgKHBvbGxfamlmZmllcyAhPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1cpCisJCQlwb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1c7CiAJfSBlbHNlIHsKLQkJaWYgKFBvbGxfamlmZmllcyAhPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1QpIHsKLQkJCVBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKLQkJCUxPR0lORigic3dpdGNoZWQgdG8gZmFzdCBjb250cm9sdm0gcG9sbGluZyIpOwotCQl9CisJCWlmIChwb2xsX2ppZmZpZXMgIT0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUKQorCQkJcG9sbF9qaWZmaWVzID0gUE9MTEpJRkZJRVNfQ09OVFJPTFZNQ0hBTk5FTF9GQVNUOwogCX0KIAotCXF1ZXVlX2RlbGF5ZWRfd29yayhQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlLAotCQkJICAgJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBQb2xsX2ppZmZpZXMpOworCXF1ZXVlX2RlbGF5ZWRfd29yayhwZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlLAorCQkJICAgJnBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBwb2xsX2ppZmZpZXMpOwogfQogCiBzdGF0aWMgdm9pZAogc2V0dXBfY3Jhc2hfZGV2aWNlc193b3JrX3F1ZXVlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQotCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBsb2NhbENyYXNoQ3JlYXRlQnVzTXNnOwotCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBsb2NhbENyYXNoQ3JlYXRlRGV2TXNnOworCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBsb2NhbF9jcmFzaF9idXNfbXNnOworCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBsb2NhbF9jcmFzaF9kZXZfbXNnOwogCXN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSBtc2c7Ci0JdTMyIGxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldDsKLQl1MTYgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQ7CisJdTMyIGxvY2FsX2NyYXNoX21zZ19vZmZzZXQ7CisJdTE2IGxvY2FsX2NyYXNoX21zZ19jb3VudDsKIAogCS8qIG1ha2Ugc3VyZSB2aXNvcmJ1cyBzZXJ2ZXIgaXMgcmVnaXN0ZXJlZCBmb3IgY29udHJvbHZtIGNhbGxiYWNrcyAqLwogCWlmICh2aXNvcmNoaXBzZXRfc2VydmVycmVnd2FpdCAmJiAhc2VydmVycmVnaXN0ZXJlZCkKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAKIAkvKiBtYWtlIHN1cmUgdmlzb3JjbGllbnRidXMgc2VydmVyIGlzIHJlZ3NpdGVyZWQgZm9yIGNvbnRyb2x2bQogCSAqIGNhbGxiYWNrcwogCSAqLwogCWlmICh2aXNvcmNoaXBzZXRfY2xpZW50cmVnd2FpdCAmJiAhY2xpZW50cmVnaXN0ZXJlZCkKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAKIAlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKQEAgLTIwNzIsMTE4ICsxODgzLDEwOCBAQAogCWNoaXBzZXRfaW5pdCgmbXNnKTsKIAogCS8qIGdldCBzYXZlZCBtZXNzYWdlIGNvdW50ICovCi0JaWYgKHZpc29yY2hhbm5lbF9yZWFkKENvbnRyb2xWbV9jaGFubmVsLAorCWlmICh2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKIAkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBzcGFyX2NvbnRyb2x2bV9jaGFubmVsX3Byb3RvY29sLAogCQkJCSAgICAgICBzYXZlZF9jcmFzaF9tZXNzYWdlX2NvdW50KSwKLQkJCSAgICAgICZsb2NhbFNhdmVkQ3Jhc2hNc2dDb3VudCwgc2l6ZW9mKHUxNikpIDwgMCkgewotCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBDb3VudCIpOworCQkJICAgICAgJmxvY2FsX2NyYXNoX21zZ19jb3VudCwgc2l6ZW9mKHUxNikpIDwgMCkgewogCQlQT1NUQ09ERV9MSU5VWF8yKENSQVNIX0RFVl9DVFJMX1JEX0ZBSUxVUkVfUEMsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAobG9jYWxTYXZlZENyYXNoTXNnQ291bnQgIT0gQ09OVFJPTFZNX0NSQVNITVNHX01BWCkgewotCQlMT0dFUlIoIlNhdmVkIE1lc3NhZ2UgQ291bnQgaW5jb3JyZWN0ICVkIiwKLQkJICAgICAgIGxvY2FsU2F2ZWRDcmFzaE1zZ0NvdW50KTsKKwlpZiAobG9jYWxfY3Jhc2hfbXNnX2NvdW50ICE9IENPTlRST0xWTV9DUkFTSE1TR19NQVgpIHsKIAkJUE9TVENPREVfTElOVVhfMyhDUkFTSF9ERVZfQ09VTlRfRkFJTFVSRV9QQywKLQkJCQkgbG9jYWxTYXZlZENyYXNoTXNnQ291bnQsCisJCQkJIGxvY2FsX2NyYXNoX21zZ19jb3VudCwKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIGdldCBzYXZlZCBjcmFzaCBtZXNzYWdlIG9mZnNldCAqLwotCWlmICh2aXNvcmNoYW5uZWxfcmVhZChDb250cm9sVm1fY2hhbm5lbCwKKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCiAJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc3Bhcl9jb250cm9sdm1fY2hhbm5lbF9wcm90b2NvbCwKIAkJCQkgICAgICAgc2F2ZWRfY3Jhc2hfbWVzc2FnZV9vZmZzZXQpLAotCQkJICAgICAgJmxvY2FsU2F2ZWRDcmFzaE1zZ09mZnNldCwgc2l6ZW9mKHUzMikpIDwgMCkgewotCQlMT0dFUlIoImZhaWxlZCB0byBnZXQgU2F2ZWQgTWVzc2FnZSBPZmZzZXQiKTsKKwkJCSAgICAgICZsb2NhbF9jcmFzaF9tc2dfb2Zmc2V0LCBzaXplb2YodTMyKSkgPCAwKSB7CiAJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX0NUUkxfUkRfRkFJTFVSRV9QQywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIHJlYWQgY3JlYXRlIGRldmljZSBtZXNzYWdlIGZvciBzdG9yYWdlIGJ1cyBvZmZzZXQgKi8KLQlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCi0JCQkgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQsCi0JCQkgICAgICAmbG9jYWxDcmFzaENyZWF0ZUJ1c01zZywKKwlpZiAodmlzb3JjaGFubmVsX3JlYWQoY29udHJvbHZtX2NoYW5uZWwsCisJCQkgICAgICBsb2NhbF9jcmFzaF9tc2dfb2Zmc2V0LAorCQkJICAgICAgJmxvY2FsX2NyYXNoX2J1c19tc2csCiAJCQkgICAgICBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlKSkgPCAwKSB7Ci0JCUxPR0VSUigiQ1JBU0hfREVWX1JEX0JVU19GQUlVTFJFOiBGYWlsZWQgdG8gcmVhZCBDcmFzaENyZWF0ZUJ1c01zZyEiKTsKIAkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfUkRfQlVTX0ZBSVVMUkVfUEMsCiAJCQkJIFBPU1RDT0RFX1NFVkVSSVRZX0VSUik7CiAJCXJldHVybjsKIAl9CiAKIAkvKiByZWFkIGNyZWF0ZSBkZXZpY2UgbWVzc2FnZSBmb3Igc3RvcmFnZSBkZXZpY2UgKi8KLQlpZiAodmlzb3JjaGFubmVsX3JlYWQoQ29udHJvbFZtX2NoYW5uZWwsCi0JCQkgICAgICBsb2NhbFNhdmVkQ3Jhc2hNc2dPZmZzZXQgKworCWlmICh2aXNvcmNoYW5uZWxfcmVhZChjb250cm9sdm1fY2hhbm5lbCwKKwkJCSAgICAgIGxvY2FsX2NyYXNoX21zZ19vZmZzZXQgKwogCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSksCi0JCQkgICAgICAmbG9jYWxDcmFzaENyZWF0ZURldk1zZywKKwkJCSAgICAgICZsb2NhbF9jcmFzaF9kZXZfbXNnLAogCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZSkpIDwgMCkgewotCQlMT0dFUlIoIkNSQVNIX0RFVl9SRF9ERVZfRkFJVUxSRTogRmFpbGVkIHRvIHJlYWQgQ3Jhc2hDcmVhdGVEZXZNc2chIik7CiAJCVBPU1RDT0RFX0xJTlVYXzIoQ1JBU0hfREVWX1JEX0RFVl9GQUlVTFJFX1BDLAogCQkJCSBQT1NUQ09ERV9TRVZFUklUWV9FUlIpOwogCQlyZXR1cm47CiAJfQogCiAJLyogcmV1c2UgSU9WTSBjcmVhdGUgYnVzIG1lc3NhZ2UgKi8KLQlpZiAobG9jYWxDcmFzaENyZWF0ZUJ1c01zZy5jbWQuY3JlYXRlX2J1cy5jaGFubmVsX2FkZHIgIT0gMCkKLQkJYnVzX2NyZWF0ZSgmbG9jYWxDcmFzaENyZWF0ZUJ1c01zZyk7Ci0JZWxzZSB7Ci0JCUxPR0VSUigiQ3Jhc2hDcmVhdGVCdXNNc2cgaXMgbnVsbCwgbm8gZHVtcCB3aWxsIGJlIHRha2VuIik7CisJaWYgKGxvY2FsX2NyYXNoX2J1c19tc2cuY21kLmNyZWF0ZV9idXMuY2hhbm5lbF9hZGRyICE9IDApIHsKKwkJYnVzX2NyZWF0ZSgmbG9jYWxfY3Jhc2hfYnVzX21zZyk7CisJfSBlbHNlIHsKIAkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfQlVTX05VTExfRkFJTFVSRV9QQywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIHJldXNlIGNyZWF0ZSBkZXZpY2UgbWVzc2FnZSBmb3Igc3RvcmFnZSBkZXZpY2UgKi8KLQlpZiAobG9jYWxDcmFzaENyZWF0ZURldk1zZy5jbWQuY3JlYXRlX2RldmljZS5jaGFubmVsX2FkZHIgIT0gMCkKLQkJbXlfZGV2aWNlX2NyZWF0ZSgmbG9jYWxDcmFzaENyZWF0ZURldk1zZyk7Ci0JZWxzZSB7Ci0JCUxPR0VSUigiQ3Jhc2hDcmVhdGVEZXZNc2cgaXMgbnVsbCwgbm8gZHVtcCB3aWxsIGJlIHRha2VuIik7CisJaWYgKGxvY2FsX2NyYXNoX2Rldl9tc2cuY21kLmNyZWF0ZV9kZXZpY2UuY2hhbm5lbF9hZGRyICE9IDApIHsKKwkJbXlfZGV2aWNlX2NyZWF0ZSgmbG9jYWxfY3Jhc2hfZGV2X21zZyk7CisJfSBlbHNlIHsKIAkJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfREVWX05VTExfRkFJTFVSRV9QQywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAkJcmV0dXJuOwogCX0KLQlMT0dJTkYoIkJ1cyBhbmQgZGV2aWNlIHJlYWR5IGZvciBkdW1waW5nIik7CiAJUE9TVENPREVfTElOVVhfMihDUkFTSF9ERVZfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAJcmV0dXJuOwogCi1Bd2F5OgorY2xlYW51cDoKIAotCVBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfU0xPVzsKKwlwb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX1NMT1c7CiAKLQlxdWV1ZV9kZWxheWVkX3dvcmsoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSwKLQkJCSAgICZQZXJpb2RpY19jb250cm9sdm1fd29yaywgUG9sbF9qaWZmaWVzKTsKKwlxdWV1ZV9kZWxheWVkX3dvcmsocGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSwKKwkJCSAgICZwZXJpb2RpY19jb250cm9sdm1fd29yaywgcG9sbF9qaWZmaWVzKTsKIH0KIAogc3RhdGljIHZvaWQKLWJ1c19jcmVhdGVfcmVzcG9uc2UodWxvbmcgYnVzTm8sIGludCByZXNwb25zZSkKK2J1c19jcmVhdGVfcmVzcG9uc2UodWxvbmcgYnVzX25vLCBpbnQgcmVzcG9uc2UpCiB7Ci0JYnVzX3Jlc3BvbmRlcihDT05UUk9MVk1fQlVTX0NSRUFURSwgYnVzTm8sIHJlc3BvbnNlKTsKKwlidXNfcmVzcG9uZGVyKENPTlRST0xWTV9CVVNfQ1JFQVRFLCBidXNfbm8sIHJlc3BvbnNlKTsKIH0KIAogc3RhdGljIHZvaWQKLWJ1c19kZXN0cm95X3Jlc3BvbnNlKHVsb25nIGJ1c05vLCBpbnQgcmVzcG9uc2UpCitidXNfZGVzdHJveV9yZXNwb25zZSh1bG9uZyBidXNfbm8sIGludCByZXNwb25zZSkKIHsKLQlidXNfcmVzcG9uZGVyKENPTlRST0xWTV9CVVNfREVTVFJPWSwgYnVzTm8sIHJlc3BvbnNlKTsKKwlidXNfcmVzcG9uZGVyKENPTlRST0xWTV9CVVNfREVTVFJPWSwgYnVzX25vLCByZXNwb25zZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1kZXZpY2VfY3JlYXRlX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKQorZGV2aWNlX2NyZWF0ZV9yZXNwb25zZSh1bG9uZyBidXNfbm8sIHVsb25nIGRldl9ubywgaW50IHJlc3BvbnNlKQogewotCWRldmljZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIGJ1c05vLCBkZXZObywgcmVzcG9uc2UpOworCWRldmljZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DUkVBVEUsIGJ1c19ubywgZGV2X25vLCByZXNwb25zZSk7CiB9CiAKIHN0YXRpYyB2b2lkCi1kZXZpY2VfZGVzdHJveV9yZXNwb25zZSh1bG9uZyBidXNObywgdWxvbmcgZGV2Tm8sIGludCByZXNwb25zZSkKK2RldmljZV9kZXN0cm95X3Jlc3BvbnNlKHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCBpbnQgcmVzcG9uc2UpCiB7Ci0JZGV2aWNlX3Jlc3BvbmRlcihDT05UUk9MVk1fREVWSUNFX0RFU1RST1ksIGJ1c05vLCBkZXZObywgcmVzcG9uc2UpOworCWRldmljZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9ERVNUUk9ZLCBidXNfbm8sIGRldl9ubywgcmVzcG9uc2UpOwogfQogCiB2b2lkCiB2aXNvcmNoaXBzZXRfZGV2aWNlX3BhdXNlX3Jlc3BvbnNlKHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCBpbnQgcmVzcG9uc2UpCiB7Ci0KIAlkZXZpY2VfY2hhbmdlc3RhdGVfcmVzcG9uZGVyKENPTlRST0xWTV9ERVZJQ0VfQ0hBTkdFU1RBVEUsCiAJCQkJICAgICBidXNfbm8sIGRldl9ubywgcmVzcG9uc2UsCiAJCQkJICAgICBzZWdtZW50X3N0YXRlX3N0YW5kYnkpOwpAQCAtMjE5MSwyMiArMTk5MiwyMCBAQAogRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JjaGlwc2V0X2RldmljZV9wYXVzZV9yZXNwb25zZSk7CiAKIHN0YXRpYyB2b2lkCi1kZXZpY2VfcmVzdW1lX3Jlc3BvbnNlKHVsb25nIGJ1c05vLCB1bG9uZyBkZXZObywgaW50IHJlc3BvbnNlKQorZGV2aWNlX3Jlc3VtZV9yZXNwb25zZSh1bG9uZyBidXNfbm8sIHVsb25nIGRldl9ubywgaW50IHJlc3BvbnNlKQogewogCWRldmljZV9jaGFuZ2VzdGF0ZV9yZXNwb25kZXIoQ09OVFJPTFZNX0RFVklDRV9DSEFOR0VTVEFURSwKLQkJCQkgICAgIGJ1c05vLCBkZXZObywgcmVzcG9uc2UsCisJCQkJICAgICBidXNfbm8sIGRldl9ubywgcmVzcG9uc2UsCiAJCQkJICAgICBzZWdtZW50X3N0YXRlX3J1bm5pbmcpOwogfQogCiBCT09MCiB2aXNvcmNoaXBzZXRfZ2V0X2J1c19pbmZvKHVsb25nIGJ1c19ubywgc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqYnVzX2luZm8pCiB7Ci0Jdm9pZCAqcCA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNfbm8pOworCXZvaWQgKnAgPSBmaW5kYnVzKCZidXNfaW5mb19saXN0LCBidXNfbm8pOwogCi0JaWYgKCFwKSB7Ci0JCUxPR0VSUigiKCVsdSkgZmFpbGVkIiwgYnVzX25vKTsKKwlpZiAoIXApCiAJCXJldHVybiBGQUxTRTsKLQl9CiAJbWVtY3B5KGJ1c19pbmZvLCBwLCBzaXplb2Yoc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbykpOwogCXJldHVybiBUUlVFOwogfQpAQCAtMjIxNSwxMiArMjAxNCwxMCBAQAogQk9PTAogdmlzb3JjaGlwc2V0X3NldF9idXNfY29udGV4dCh1bG9uZyBidXNfbm8sIHZvaWQgKmNvbnRleHQpCiB7Ci0Jc3RydWN0IHZpc29yY2hpcHNldF9idXNfaW5mbyAqcCA9IGZpbmRidXMoJkJ1c0luZm9MaXN0LCBidXNfbm8pOworCXN0cnVjdCB2aXNvcmNoaXBzZXRfYnVzX2luZm8gKnAgPSBmaW5kYnVzKCZidXNfaW5mb19saXN0LCBidXNfbm8pOwogCi0JaWYgKCFwKSB7Ci0JCUxPR0VSUigiKCVsdSkgZmFpbGVkIiwgYnVzX25vKTsKKwlpZiAoIXApCiAJCXJldHVybiBGQUxTRTsKLQl9CiAJcC0+YnVzX2RyaXZlcl9jb250ZXh0ID0gY29udGV4dDsKIAlyZXR1cm4gVFJVRTsKIH0KQEAgLTIyMzAsMTIgKzIwMjcsMTAgQEAKIHZpc29yY2hpcHNldF9nZXRfZGV2aWNlX2luZm8odWxvbmcgYnVzX25vLCB1bG9uZyBkZXZfbm8sCiAJCQkgICAgIHN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKmRldl9pbmZvKQogewotCXZvaWQgKnAgPSBmaW5kZGV2aWNlKCZEZXZJbmZvTGlzdCwgYnVzX25vLCBkZXZfbm8pOworCXZvaWQgKnAgPSBmaW5kZGV2aWNlKCZkZXZfaW5mb19saXN0LCBidXNfbm8sIGRldl9ubyk7CiAKLQlpZiAoIXApIHsKLQkJTE9HRVJSKCIoJWx1LCVsdSkgZmFpbGVkIiwgYnVzX25vLCBkZXZfbm8pOworCWlmICghcCkKIAkJcmV0dXJuIEZBTFNFOwotCX0KIAltZW1jcHkoZGV2X2luZm8sIHAsIHNpemVvZihzdHJ1Y3Qgdmlzb3JjaGlwc2V0X2RldmljZV9pbmZvKSk7CiAJcmV0dXJuIFRSVUU7CiB9CkBAIC0yMjQ1LDEyICsyMDQwLDEwIEBACiB2aXNvcmNoaXBzZXRfc2V0X2RldmljZV9jb250ZXh0KHVsb25nIGJ1c19ubywgdWxvbmcgZGV2X25vLCB2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCB2aXNvcmNoaXBzZXRfZGV2aWNlX2luZm8gKnAgPQotCQkJZmluZGRldmljZSgmRGV2SW5mb0xpc3QsIGJ1c19ubywgZGV2X25vKTsKKwkJCWZpbmRkZXZpY2UoJmRldl9pbmZvX2xpc3QsIGJ1c19ubywgZGV2X25vKTsKIAotCWlmICghcCkgewotCQlMT0dFUlIoIiglbHUsJWx1KSBmYWlsZWQiLCBidXNfbm8sIGRldl9ubyk7CisJaWYgKCFwKQogCQlyZXR1cm4gRkFMU0U7Ci0JfQogCXAtPmJ1c19kcml2ZXJfY29udGV4dCA9IGNvbnRleHQ7CiAJcmV0dXJuIFRSVUU7CiB9CkBAIC0yMjc4LDExICsyMDcxLDEwIEBACiAJICovCiAJZ2ZwIHw9IF9fR0ZQX05PUkVUUlk7CiAJcCA9IGttZW1fY2FjaGVfYWxsb2MocG9vbCwgZ2ZwKTsKLQlpZiAoIXApIHsKLQkJTE9HRVJSKCJrbWVtX2NhY2hlX2FsbG9jIGZhaWxlZCBlYXJseSBAJXM6JWRcbiIsIGZuLCBsbik7CisJaWYgKCFwKQogCQlyZXR1cm4gTlVMTDsKLQl9Ci0JYXRvbWljX2luYygmVmlzb3JjaGlwc2V0X2NhY2hlX2J1ZmZlcnNfaW5fdXNlKTsKKworCWF0b21pY19pbmMoJnZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSk7CiAJcmV0dXJuIHA7CiB9CiAKQEAgLTIyOTEsMTYgKzIwODMsMTYgQEAKIHZvaWQKIHZpc29yY2hpcHNldF9jYWNoZV9mcmVlKHN0cnVjdCBrbWVtX2NhY2hlICpwb29sLCB2b2lkICpwLCBjaGFyICpmbiwgaW50IGxuKQogewotCWlmICghcCkgewotCQlMT0dFUlIoIk5VTEwgcG9pbnRlciBAJXM6JWRcbiIsIGZuLCBsbik7CisJaWYgKCFwKQogCQlyZXR1cm47Ci0JfQotCWF0b21pY19kZWMoJlZpc29yY2hpcHNldF9jYWNoZV9idWZmZXJzX2luX3VzZSk7CisKKwlhdG9taWNfZGVjKCZ2aXNvcmNoaXBzZXRfY2FjaGVfYnVmZmVyc19pbl91c2UpOwogCWttZW1fY2FjaGVfZnJlZShwb29sLCBwKTsKIH0KIAogc3RhdGljIHNzaXplX3QgY2hpcHNldHJlYWR5X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWNoYXIgbXNndHlwZVs2NF07CiAKQEAgLTIzMjIsNyArMjExNCw4IEBACiAgKiBhbmQgdGhlbiBwYXNzZWQgYmFjayB3aGVuIHRoZSBkZXZpY2UgaGFzIGJlZW4gcmVtb3ZlZC4KICAqLwogc3RhdGljIHNzaXplX3QgZGV2aWNlZGlzYWJsZWRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAotCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCXVpbnQgaWQ7CiAKQEAgLTIzMzgsNyArMjEzMSw4IEBACiAgKiBhbmQgdGhlbiBwYXNzZWQgYmFjayB3aGVuIHRoZSBkZXZpY2UgaGFzIGJlZW4gYnJvdWdodCBiYWNrIHVwLgogICovCiBzdGF0aWMgc3NpemVfdCBkZXZpY2VlbmFibGVkX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCisJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7CiAJdWludCBpZDsKIApAQCAtMjM1MywxMzMgKzIxNDcsMTAyIEBACiB2aXNvcmNoaXBzZXRfaW5pdCh2b2lkKQogewogCWludCByYyA9IDAsIHggPSAwOwotCWNoYXIgc1s2NF07CiAJSE9TVEFERFJFU1MgYWRkcjsKIAogCWlmICghdW5pc3lzX3NwYXJfcGxhdGZvcm0pCiAJCXJldHVybiAtRU5PREVWOwogCi0JTE9HSU5GKCJjaGlwc2V0IGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZCIsIFZFUlNJT04pOwotCS8qIHByb2Nlc3MgbW9kdWxlIG9wdGlvbnMgKi8KLQlQT1NUQ09ERV9MSU5VWF8yKERSSVZFUl9FTlRSWV9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7Ci0KLQlMT0dJTkYoIm9wdGlvbiAtIHRlc3R2bmljPSVkIiwgdmlzb3JjaGlwc2V0X3Rlc3R2bmljKTsKLQlMT0dJTkYoIm9wdGlvbiAtIHRlc3R2bmljY2xpZW50PSVkIiwgdmlzb3JjaGlwc2V0X3Rlc3R2bmljY2xpZW50KTsKLQlMT0dJTkYoIm9wdGlvbiAtIHRlc3Rtc2c9JWQiLCB2aXNvcmNoaXBzZXRfdGVzdG1zZyk7Ci0JTE9HSU5GKCJvcHRpb24gLSB0ZXN0dGVhcmRvd249JWQiLCB2aXNvcmNoaXBzZXRfdGVzdHRlYXJkb3duKTsKLQlMT0dJTkYoIm9wdGlvbiAtIG1ham9yPSVkIiwgdmlzb3JjaGlwc2V0X21ham9yKTsKLQlMT0dJTkYoIm9wdGlvbiAtIHNlcnZlcnJlZ3dhaXQ9JWQiLCB2aXNvcmNoaXBzZXRfc2VydmVycmVnd2FpdCk7Ci0JTE9HSU5GKCJvcHRpb24gLSBjbGllbnRyZWd3YWl0PSVkIiwgdmlzb3JjaGlwc2V0X2NsaWVudHJlZ3dhaXQpOwotCUxPR0lORigib3B0aW9uIC0gaG9sZGNoaXBzZXRyZWFkeT0lZCIsIHZpc29yY2hpcHNldF9ob2xkY2hpcHNldHJlYWR5KTsKLQotCW1lbXNldCgmQnVzRGV2X1NlcnZlcl9Ob3RpZmllcnMsIDAsIHNpemVvZihCdXNEZXZfU2VydmVyX05vdGlmaWVycykpOwotCW1lbXNldCgmQnVzRGV2X0NsaWVudF9Ob3RpZmllcnMsIDAsIHNpemVvZihCdXNEZXZfQ2xpZW50X05vdGlmaWVycykpOwotCW1lbXNldCgmQ29udHJvbFZtX3BheWxvYWRfaW5mbywgMCwgc2l6ZW9mKENvbnRyb2xWbV9wYXlsb2FkX2luZm8pKTsKLQltZW1zZXQoJkxpdmVEdW1wX2luZm8sIDAsIHNpemVvZihMaXZlRHVtcF9pbmZvKSk7Ci0JYXRvbWljX3NldCgmTGl2ZUR1bXBfaW5mby5idWZmZXJzX2luX3VzZSwgMCk7CisJbWVtc2V0KCZidXNkZXZfc2VydmVyX25vdGlmaWVycywgMCwgc2l6ZW9mKGJ1c2Rldl9zZXJ2ZXJfbm90aWZpZXJzKSk7CisJbWVtc2V0KCZidXNkZXZfY2xpZW50X25vdGlmaWVycywgMCwgc2l6ZW9mKGJ1c2Rldl9jbGllbnRfbm90aWZpZXJzKSk7CisJbWVtc2V0KCZjb250cm9sdm1fcGF5bG9hZF9pbmZvLCAwLCBzaXplb2YoY29udHJvbHZtX3BheWxvYWRfaW5mbykpOworCW1lbXNldCgmbGl2ZWR1bXBfaW5mbywgMCwgc2l6ZW9mKGxpdmVkdW1wX2luZm8pKTsKKwlhdG9taWNfc2V0KCZsaXZlZHVtcF9pbmZvLmJ1ZmZlcnNfaW5fdXNlLCAwKTsKIAogCWlmICh2aXNvcmNoaXBzZXRfdGVzdHZuaWMpIHsKLQkJRVJSRFJWKCJ0ZXN0dm5pYyBvcHRpb24gbm8gbG9uZ2VyIHN1cHBvcnRlZDogKHN0YXR1cyA9ICVkKVxuIiwKLQkJICAgICAgIHgpOwogCQlQT1NUQ09ERV9MSU5VWF8zKENISVBTRVRfSU5JVF9GQUlMVVJFX1BDLCB4LCBESUFHX1NFVkVSSVRZX0VSUik7CiAJCXJjID0geDsKLQkJZ290byBBd2F5OworCQlnb3RvIGNsZWFudXA7CiAJfQogCiAJYWRkciA9IGNvbnRyb2x2bV9nZXRfY2hhbm5lbF9hZGRyZXNzKCk7CiAJaWYgKGFkZHIgIT0gMCkgewotCQlDb250cm9sVm1fY2hhbm5lbCA9CisJCWNvbnRyb2x2bV9jaGFubmVsID0KIAkJICAgIHZpc29yY2hhbm5lbF9jcmVhdGVfd2l0aF9sb2NrCiAJCSAgICAoYWRkciwKIAkJICAgICBzaXplb2Yoc3RydWN0IHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2wpLAogCQkgICAgIHNwYXJfY29udHJvbHZtX2NoYW5uZWxfcHJvdG9jb2xfdXVpZCk7CiAJCWlmIChTUEFSX0NPTlRST0xWTV9DSEFOTkVMX09LX0NMSUVOVCgKLQkJCQl2aXNvcmNoYW5uZWxfZ2V0X2hlYWRlcihDb250cm9sVm1fY2hhbm5lbCkpKSB7Ci0JCQlMT0dJTkYoIkNoYW5uZWwgJXMgKENvbnRyb2xWbSkgZGlzY292ZXJlZCIsCi0JCQkgICAgICAgdmlzb3JjaGFubmVsX2lkKENvbnRyb2xWbV9jaGFubmVsLCBzKSk7CisJCQkJdmlzb3JjaGFubmVsX2dldF9oZWFkZXIoY29udHJvbHZtX2NoYW5uZWwpKSkgewogCQkJaW5pdGlhbGl6ZV9jb250cm9sdm1fcGF5bG9hZCgpOwogCQl9IGVsc2UgewotCQkJTE9HRVJSKCJjb250cm9sdm0gY2hhbm5lbCBpcyBpbnZhbGlkIik7Ci0JCQl2aXNvcmNoYW5uZWxfZGVzdHJveShDb250cm9sVm1fY2hhbm5lbCk7Ci0JCQlDb250cm9sVm1fY2hhbm5lbCA9IE5VTEw7CisJCQl2aXNvcmNoYW5uZWxfZGVzdHJveShjb250cm9sdm1fY2hhbm5lbCk7CisJCQljb250cm9sdm1fY2hhbm5lbCA9IE5VTEw7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCX0gZWxzZSB7Ci0JCUxPR0VSUigibm8gY29udHJvbHZtIGNoYW5uZWwgZGlzY292ZXJlZCIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlNYWpvckRldiA9IE1LREVWKHZpc29yY2hpcHNldF9tYWpvciwgMCk7Ci0JcmMgPSB2aXNvcmNoaXBzZXRfZmlsZV9pbml0KE1ham9yRGV2LCAmQ29udHJvbFZtX2NoYW5uZWwpOworCW1ham9yX2RldiA9IE1LREVWKHZpc29yY2hpcHNldF9tYWpvciwgMCk7CisJcmMgPSB2aXNvcmNoaXBzZXRfZmlsZV9pbml0KG1ham9yX2RldiwgJmNvbnRyb2x2bV9jaGFubmVsKTsKIAlpZiAocmMgPCAwKSB7Ci0JCUVSUkRSVigidmlzb3JjaGlwc2V0X2ZpbGVfaW5pdChNYWpvckRldiwgJkNvbnRyb2xWbV9jaGFubmVsKTogZXJyb3IgKHN0YXR1cz0lZClcbiIsIHJjKTsKIAkJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRkFJTFVSRV9QQywgRElBR19TRVZFUklUWV9FUlIpOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9CiAKLQltZW1zZXQoJmdfRGlhZ01zZ0hkciwgMCwgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKKwltZW1zZXQoJmdfZGlhZ19tc2dfaGRyLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOwogCi0JbWVtc2V0KCZnX0NoaXBTZXRNc2dIZHIsIDAsIHNpemVvZihzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyKSk7CisJbWVtc2V0KCZnX2NoaXBzZXRfbXNnX2hkciwgMCwgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKIAotCW1lbXNldCgmZ19EZWxEdW1wTXNnSGRyLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOworCW1lbXNldCgmZ19kZWxfZHVtcF9tc2dfaGRyLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOwogCi0JUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sID0KLQkgICAga21lbV9jYWNoZV9jcmVhdGUoUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sX25hbWUsCisJcHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sID0KKwkgICAga21lbV9jYWNoZV9jcmVhdGUocHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sX25hbWUsCiAJCQkgICAgICBzaXplb2Yoc3RydWN0IHB1dGZpbGVfYnVmZmVyX2VudHJ5KSwKIAkJCSAgICAgIDAsIFNMQUJfSFdDQUNIRV9BTElHTiwgTlVMTCk7Ci0JaWYgKCFQdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wpIHsKLQkJRVJSRFJWKCJmYWlsZWQgdG8gYWxsb2MgUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sOiAoc3RhdHVzPS0xKVxuIik7CisJaWYgKCFwdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wpIHsKIAkJUE9TVENPREVfTElOVVhfMihDSElQU0VUX0lOSVRfRkFJTFVSRV9QQywgRElBR19TRVZFUklUWV9FUlIpOwogCQlyYyA9IC0xOwotCQlnb3RvIEF3YXk7CisJCWdvdG8gY2xlYW51cDsKIAl9Ci0JaWYgKHZpc29yY2hpcHNldF9kaXNhYmxlX2NvbnRyb2x2bSkgewotCQlMT0dJTkYoInZpc29yY2hpcHNldF9pbml0OmNvbnRyb2x2bSBkaXNhYmxlZCIpOwotCX0gZWxzZSB7CisJaWYgKCF2aXNvcmNoaXBzZXRfZGlzYWJsZV9jb250cm9sdm0pIHsKIAkJLyogaWYgYm9vdGluZyBpbiBhIGNyYXNoIGtlcm5lbCAqLwogCQlpZiAodmlzb3JjaGlwc2V0X2NyYXNoX2tlcm5lbCkKLQkJCUlOSVRfREVMQVlFRF9XT1JLKCZQZXJpb2RpY19jb250cm9sdm1fd29yaywKKwkJCUlOSVRfREVMQVlFRF9XT1JLKCZwZXJpb2RpY19jb250cm9sdm1fd29yaywKIAkJCQkJICBzZXR1cF9jcmFzaF9kZXZpY2VzX3dvcmtfcXVldWUpOwogCQllbHNlCi0JCQlJTklUX0RFTEFZRURfV09SSygmUGVyaW9kaWNfY29udHJvbHZtX3dvcmssCisJCQlJTklUX0RFTEFZRURfV09SSygmcGVyaW9kaWNfY29udHJvbHZtX3dvcmssCiAJCQkJCSAgY29udHJvbHZtX3BlcmlvZGljX3dvcmspOwotCQlQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlID0KKwkJcGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSA9CiAJCSAgICBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgidmlzb3JjaGlwc2V0X2NvbnRyb2x2bSIpOwogCi0JCWlmIChQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlID09IE5VTEwpIHsKLQkJCUVSUkRSVigiY2Fubm90IGNyZWF0ZSBjb250cm9sdm0gd29ya3F1ZXVlOiAoc3RhdHVzPSVkKVxuIiwKLQkJCSAgICAgICAtRU5PTUVNKTsKKwkJaWYgKCFwZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlKSB7CiAJCQlQT1NUQ09ERV9MSU5VWF8yKENSRUFURV9XT1JLUVVFVUVfRkFJTEVEX1BDLAogCQkJCQkgRElBR19TRVZFUklUWV9FUlIpOwogCQkJcmMgPSAtRU5PTUVNOwotCQkJZ290byBBd2F5OworCQkJZ290byBjbGVhbnVwOwogCQl9Ci0JCU1vc3RfcmVjZW50X21lc3NhZ2VfamlmZmllcyA9IGppZmZpZXM7Ci0JCVBvbGxfamlmZmllcyA9IFBPTExKSUZGSUVTX0NPTlRST0xWTUNIQU5ORUxfRkFTVDsKLQkJcmMgPSBxdWV1ZV9kZWxheWVkX3dvcmsoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSwKLQkJCQkJJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBQb2xsX2ppZmZpZXMpOworCQltb3N0X3JlY2VudF9tZXNzYWdlX2ppZmZpZXMgPSBqaWZmaWVzOworCQlwb2xsX2ppZmZpZXMgPSBQT0xMSklGRklFU19DT05UUk9MVk1DSEFOTkVMX0ZBU1Q7CisJCXJjID0gcXVldWVfZGVsYXllZF93b3JrKHBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUsCisJCQkJCSZwZXJpb2RpY19jb250cm9sdm1fd29yaywgcG9sbF9qaWZmaWVzKTsKIAkJaWYgKHJjIDwgMCkgewotCQkJRVJSRFJWKCJxdWV1ZV9kZWxheWVkX3dvcmsoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSwgJlBlcmlvZGljX2NvbnRyb2x2bV93b3JrLCBQb2xsX2ppZmZpZXMpOiBlcnJvciAoc3RhdHVzPSVkKVxuIiwgcmMpOwogCQkJUE9TVENPREVfTElOVVhfMihRVUVVRV9ERUxBWUVEX1dPUktfUEMsCiAJCQkJCSBESUFHX1NFVkVSSVRZX0VSUik7Ci0JCQlnb3RvIEF3YXk7CisJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQogCX0KIAotCVZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmRldnQgPSBNYWpvckRldjsKLQlpZiAocGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZWaXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlKSA8IDApIHsKLQkJRVJSRFJWKCJwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIodmlzb3JjaGlwc2V0KSBmYWlsZWQ6IChzdGF0dXM9LTEpXG4iKTsKKwl2aXNvcmNoaXBzZXRfcGxhdGZvcm1fZGV2aWNlLmRldi5kZXZ0ID0gbWFqb3JfZGV2OworCWlmIChwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UpIDwgMCkgewogCQlQT1NUQ09ERV9MSU5VWF8yKERFVklDRV9SRUdJU1RFUl9GQUlMVVJFX1BDLCBESUFHX1NFVkVSSVRZX0VSUik7CiAJCXJjID0gLTE7Ci0JCWdvdG8gQXdheTsKKwkJZ290byBjbGVhbnVwOwogCX0KLQlMT0dJTkYoInZpc29yY2hpcHNldCBkZXZpY2UgY3JlYXRlZCIpOwogCVBPU1RDT0RFX0xJTlVYXzIoQ0hJUFNFVF9JTklUX1NVQ0NFU1NfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwogCXJjID0gMDsKLUF3YXk6CitjbGVhbnVwOgogCWlmIChyYykgewotCQlMT0dFUlIoInZpc29yY2hpcHNldF9pbml0IGZhaWxlZCIpOwogCQlQT1NUQ09ERV9MSU5VWF8zKENISVBTRVRfSU5JVF9GQUlMVVJFX1BDLCByYywKIAkJCQkgUE9TVENPREVfU0VWRVJJVFlfRVJSKTsKIAl9CkBAIC0yNDg5LDQwICsyMjUyLDM0IEBACiBzdGF0aWMgdm9pZAogdmlzb3JjaGlwc2V0X2V4aXQodm9pZCkKIHsKLQljaGFyIHNbOTldOwotCiAJUE9TVENPREVfTElOVVhfMihEUklWRVJfRVhJVF9QQywgUE9TVENPREVfU0VWRVJJVFlfSU5GTyk7CiAKIAlpZiAodmlzb3JjaGlwc2V0X2Rpc2FibGVfY29udHJvbHZtKSB7CiAJCTsKIAl9IGVsc2UgewotCQljYW5jZWxfZGVsYXllZF93b3JrKCZQZXJpb2RpY19jb250cm9sdm1fd29yayk7Ci0JCWZsdXNoX3dvcmtxdWV1ZShQZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlKTsKLQkJZGVzdHJveV93b3JrcXVldWUoUGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSk7Ci0JCVBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUgPSBOVUxMOwotCQlkZXN0cm95X2NvbnRyb2x2bV9wYXlsb2FkX2luZm8oJkNvbnRyb2xWbV9wYXlsb2FkX2luZm8pOworCQljYW5jZWxfZGVsYXllZF93b3JrKCZwZXJpb2RpY19jb250cm9sdm1fd29yayk7CisJCWZsdXNoX3dvcmtxdWV1ZShwZXJpb2RpY19jb250cm9sdm1fd29ya3F1ZXVlKTsKKwkJZGVzdHJveV93b3JrcXVldWUocGVyaW9kaWNfY29udHJvbHZtX3dvcmtxdWV1ZSk7CisJCXBlcmlvZGljX2NvbnRyb2x2bV93b3JrcXVldWUgPSBOVUxMOworCQlkZXN0cm95X2NvbnRyb2x2bV9wYXlsb2FkX2luZm8oJmNvbnRyb2x2bV9wYXlsb2FkX2luZm8pOwogCX0KLQlUZXN0X1ZuaWNfY2hhbm5lbCA9IE5VTEw7Ci0JaWYgKFB1dGZpbGVfYnVmZmVyX2xpc3RfcG9vbCkgewotCQlrbWVtX2NhY2hlX2Rlc3Ryb3koUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sKTsKLQkJUHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sID0gTlVMTDsKKwlpZiAocHV0ZmlsZV9idWZmZXJfbGlzdF9wb29sKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShwdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wpOworCQlwdXRmaWxlX2J1ZmZlcl9saXN0X3Bvb2wgPSBOVUxMOwogCX0KIAogCWNsZWFudXBfY29udHJvbHZtX3N0cnVjdHVyZXMoKTsKIAotCW1lbXNldCgmZ19EaWFnTXNnSGRyLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOworCW1lbXNldCgmZ19kaWFnX21zZ19oZHIsIDAsIHNpemVvZihzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyKSk7CiAKLQltZW1zZXQoJmdfQ2hpcFNldE1zZ0hkciwgMCwgc2l6ZW9mKHN0cnVjdCBjb250cm9sdm1fbWVzc2FnZV9oZWFkZXIpKTsKKwltZW1zZXQoJmdfY2hpcHNldF9tc2dfaGRyLCAwLCBzaXplb2Yoc3RydWN0IGNvbnRyb2x2bV9tZXNzYWdlX2hlYWRlcikpOwogCi0JbWVtc2V0KCZnX0RlbER1bXBNc2dIZHIsIDAsIHNpemVvZihzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyKSk7CisJbWVtc2V0KCZnX2RlbF9kdW1wX21zZ19oZHIsIDAsIHNpemVvZihzdHJ1Y3QgY29udHJvbHZtX21lc3NhZ2VfaGVhZGVyKSk7CiAKLQlMT0dJTkYoIkNoYW5uZWwgJXMgKENvbnRyb2xWbSkgZGlzY29ubmVjdGVkIiwKLQkgICAgICAgdmlzb3JjaGFubmVsX2lkKENvbnRyb2xWbV9jaGFubmVsLCBzKSk7Ci0Jdmlzb3JjaGFubmVsX2Rlc3Ryb3koQ29udHJvbFZtX2NoYW5uZWwpOworCXZpc29yY2hhbm5lbF9kZXN0cm95KGNvbnRyb2x2bV9jaGFubmVsKTsKIAotCXZpc29yY2hpcHNldF9maWxlX2NsZWFudXAoKTsKKwl2aXNvcmNoaXBzZXRfZmlsZV9jbGVhbnVwKHZpc29yY2hpcHNldF9wbGF0Zm9ybV9kZXZpY2UuZGV2LmRldnQpOwogCVBPU1RDT0RFX0xJTlVYXzIoRFJJVkVSX0VYSVRfUEMsIFBPU1RDT0RFX1NFVkVSSVRZX0lORk8pOwotCUxPR0lORigiY2hpcHNldCBkcml2ZXIgdW5sb2FkZWQiKTsKIH0KIAogbW9kdWxlX3BhcmFtX25hbWVkKHRlc3R2bmljLCB2aXNvcmNoaXBzZXRfdGVzdHZuaWMsIGludCwgU19JUlVHTyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvS2NvbmZpZwppbmRleCA3NGI0NzRlLi5iZTljMmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL0tjb25maWcKQEAgLTQsNyArNCw2IEBACiAKIGNvbmZpZyBVTklTWVNfVklTT1JVVElMCiAJdHJpc3RhdGUgIlVuaXN5cyB2aXNvcnV0aWwgZHJpdmVyIgotCWRlcGVuZHMgb24gVU5JU1lTU1BBUiAmJiBIQVNfSU9NRU0KIAktLS1oZWxwLS0tCiAJSWYgeW91IHNheSBZIGhlcmUsIHlvdSB3aWxsIGVuYWJsZSB0aGUgVW5pc3lzIHZpc29ydXRpbCBkcml2ZXIuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL01ha2VmaWxlIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvTWFrZWZpbGUKaW5kZXggZDg3MWJiYi4uZDlhYjVhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvTWFrZWZpbGUKQEAgLTQsNyArNCw2IEBACiAKIG9iai0kKENPTkZJR19VTklTWVNfVklTT1JVVElMKQkrPSB2aXNvcnV0aWwubwogCi12aXNvcnV0aWwteSA6PSBjaGFycXVldWUubyAgZWFzeXByb2MubyAgcGVyaW9kaWNfd29yay5vICBwcm9jb2JqZWN0dHJlZS5vICBcCi0JCW1lbXJlZ2lvbl9kaXJlY3QubyB2aXNvcmttb2R1dGlscy5vCit2aXNvcnV0aWwteSA6PSBjaGFycXVldWUubyAgcGVyaW9kaWNfd29yay5vICBtZW1yZWdpb25fZGlyZWN0Lm8gdmlzb3JrbW9kdXRpbHMubwogCiBjY2ZsYWdzLXkgKz0gLUlkcml2ZXJzL3N0YWdpbmcvdW5pc3lzL2luY2x1ZGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2NoYXJxdWV1ZS5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmMKaW5kZXggYWM3YWNiNy4uYzkxNzUyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmMKQEAgLTM2LDEzICszNiwxMSBAQAogc3RydWN0IGNoYXJxdWV1ZSAqdmlzb3JfY2hhcnF1ZXVlX2NyZWF0ZSh1bG9uZyBuc2xvdHMpCiB7CiAJaW50IGFsbG9jX3NpemUgPSBzaXplb2Yoc3RydWN0IGNoYXJxdWV1ZSkgKyBuc2xvdHMgKyAxOwotCXN0cnVjdCBjaGFycXVldWUgKmNxID0ga21hbGxvYyhhbGxvY19zaXplLCBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOworCXN0cnVjdCBjaGFycXVldWUgKmNxOwogCi0JaWYgKGNxID09IE5VTEwpIHsKLQkJRVJSRFJWKCJ2aXNvcl9jaGFycXVldWVfY3JlYXRlIGFsbG9jYXRpb24gZmFpbGVkIChhbGxvY19zaXplPSVkKSIsCi0JCSAgICAgICBhbGxvY19zaXplKTsKKwljcSA9IGttYWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0tFUk5FTHxfX0dGUF9OT1JFVFJZKTsKKwlpZiAoY3EgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCWNxLT5hbGxvY19zaXplID0gYWxsb2Nfc2l6ZTsKIAljcS0+bnNsb3RzID0gbnNsb3RzOwogCWNxLT5oZWFkID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2NoYXJxdWV1ZS5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmgKaW5kZXggNTZjMWY3OS4uZjQ2YTc3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvY2hhcnF1ZXVlLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNpZm5kZWYgX19DSEFSUVVFVUVfSF9fCiAjZGVmaW5lIF9fQ0hBUlFVRVVFX0hfXwogCi0jaW5jbHVkZSAidW5pa2xvZy5oIgogI2luY2x1ZGUgInRpbXNrbW9kLmgiCiAKIC8qIHN0cnVjdCBjaGFycXVldWUgaXMgYW4gb3BhcXVlIHN0cnVjdHVyZSB0byB1c2Vycy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGYxYWU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL2Vhc3lwcm9jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLS8qKiBAZmlsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiAgSGFuZGxlIHByb2Nmcy1zcGVjaWZpYyB0YXNrcy4KLSAqICBOb3RlIHRoYXQgdGhpcyBmaWxlIGRvZXMgbm90IGtub3cgYWJvdXQgYW55IG1vZHVsZS1zcGVjaWZpYyB0aGluZ3MsIG5vcgotICogIGRvZXMgaXQga25vdyBhbnl0aGluZyBhYm91dCB3aGF0IGluZm9ybWF0aW9uIHRvIHJldmVhbCBhcyBwYXJ0IG9mIHRoZSBwcm9jCi0gKiAgZW50cmllcy4gIFRoZSAyIGZ1bmN0aW9ucyB0aGF0IHRha2UgY2FyZSBvZiBkaXNwbGF5aW5nIGRldmljZSBhbmQKLSAqICBkcml2ZXIgc3BlY2lmaWMgaW5mb3JtYXRpb24gYXJlIHBhc3NlZCBhcyBwYXJhbWV0ZXJzIHRvCi0gKiAgdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlcigpLgotICoKLSAqICAgICAgdm9pZCBzaG93X2RldmljZV9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpwKTsKLSAqICAgICAgdm9pZCBzaG93X2RyaXZlcl9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxKTsKLSAqCi0gKiAgVGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gc2hvd19kZXZpY2VfaW5mbyBpcyBhY3R1YWxseSBhIHBvaW50ZXIgdG8gdGhlCi0gKiAgZGV2aWNlLXNwZWNpZmljIGluZm8gdG8gc2hvdy4gIEl0IGlzIHRoZSBjb250ZXh0IHRoYXQgd2FzIG9yaWdpbmFsbHkKLSAqICBwYXNzZWQgdG8gdmlzb3JfZWFzeXByb2NfSW5pdERldmljZSgpLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotCi0jaW5jbHVkZSAidW5pa2xvZy5oIgotI2luY2x1ZGUgInRpbXNrbW9kLmgiCi0jaW5jbHVkZSAiZWFzeXByb2MuaCIKLQotI2RlZmluZSBNWURSVk5BTUUgImVhc3lwcm9jIgotCi0KLQotLyoKLSAqICAgL3Byb2MvPFByb2NJZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jRGlyCi0gKiAgIC9wcm9jLzxQcm9jSWQ+L2RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgUHJvY0RyaXZlckRpcgotICogICAvcHJvYy88UHJvY0lkPi9kcml2ZXIvZGlhZyAgICAgICAgICAgICAgICAgIFByb2NEcml2ZXJEaWFnRmlsZQotICogICAvcHJvYy88UHJvY0lkPi9kZXZpY2UgICAgICAgICAgICAgICAgICAgICAgIFByb2NEZXZpY2VEaXIKLSAqICAgL3Byb2MvPFByb2NJZD4vZGV2aWNlLzAgICAgICAgICAgICAgICAgICAgICBwcm9jRGV2aWNleERpcgotICogICAvcHJvYy88UHJvY0lkPi9kZXZpY2UvMC9kaWFnICAgICAgICAgICAgICAgIHByb2NEZXZpY2V4RGlhZ0ZpbGUKLSAqLwotCi0KLXN0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfZGV2aWNlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci1zdGF0aWMgc3NpemVfdCBwcm9jX3dyaXRlX2RyaXZlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKLQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoKLQljcmVhdGVQcm9jRGlyKGNoYXIgKm5hbWUsIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50KQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcCA9IHByb2NfbWtkaXJfbW9kZShuYW1lLCBTX0lGRElSLCBwYXJlbnQpOwotCi0JaWYgKHAgPT0gTlVMTCkKLQkJRVJSRFJWKCJmYWlsZWQgdG8gY3JlYXRlIC9wcm9jIGRpcmVjdG9yeSAlcyIsIG5hbWUpOwotCXJldHVybiBwOwotfQotCi1zdGF0aWMgaW50IHNlcV9zaG93X2RyaXZlcihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLXN0YXRpYyBpbnQgcHJvY19vcGVuX2RyaXZlcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgc2VxX3Nob3dfZHJpdmVyLCBQREVfREFUQShpbm9kZSkpOwotfQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19mb3BzX2RyaXZlciA9IHsKLQkub3BlbiA9IHByb2Nfb3Blbl9kcml2ZXIsCi0JLnJlYWQgPSBzZXFfcmVhZCwKLQkud3JpdGUgPSBwcm9jX3dyaXRlX2RyaXZlciwKLQkubGxzZWVrID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHNlcV9zaG93X2RldmljZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLXN0YXRpYyBpbnQgc2VxX3Nob3dfZGV2aWNlX3Byb3BlcnR5KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwotc3RhdGljIGludCBwcm9jX29wZW5fZGV2aWNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZXFfc2hvd19kZXZpY2UsIFBERV9EQVRBKGlub2RlKSk7Ci19Ci1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX2ZvcHNfZGV2aWNlID0gewotCS5vcGVuID0gcHJvY19vcGVuX2RldmljZSwKLQkucmVhZCA9IHNlcV9yZWFkLAotCS53cml0ZSA9IHByb2Nfd3JpdGVfZGV2aWNlLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci1zdGF0aWMgaW50IHByb2Nfb3Blbl9kZXZpY2VfcHJvcGVydHkoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNlcV9zaG93X2RldmljZV9wcm9wZXJ0eSwgUERFX0RBVEEoaW5vZGUpKTsKLX0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2NfZm9wc19kZXZpY2VfcHJvcGVydHkgPSB7Ci0JLm9wZW4gPSBwcm9jX29wZW5fZGV2aWNlX3Byb3BlcnR5LAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotCi0KLXZvaWQgdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlcihzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkgICAgICAgY2hhciAqcHJvY0lkLAotCQkJICAgICAgIHZvaWQgKCpzaG93X2RyaXZlcl9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiksCi0JCQkgICAgICAgdm9pZCAoKnNob3dfZGV2aWNlX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqLAotCQkJCQkJCXZvaWQgKikpCi17Ci0JbWVtc2V0KHBkcml2ZXIsIDAsIHNpemVvZihzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8pKTsKLQlwZHJpdmVyLT5Qcm9jSWQgPSBwcm9jSWQ7Ci0JaWYgKHBkcml2ZXItPlByb2NJZCA9PSBOVUxMKQotCQlFUlJEUlYoIlByb2NJZCBjYW5ub3QgYmUgTlVMTCAodHJvdWJsZSBhaGVhZCkhIik7Ci0JcGRyaXZlci0+U2hvd19kcml2ZXJfaW5mbyA9IHNob3dfZHJpdmVyX2luZm87Ci0JcGRyaXZlci0+U2hvd19kZXZpY2VfaW5mbyA9IHNob3dfZGV2aWNlX2luZm87Ci0JaWYgKHBkcml2ZXItPlByb2NEaXIgPT0gTlVMTCkKLQkJcGRyaXZlci0+UHJvY0RpciA9IGNyZWF0ZVByb2NEaXIocGRyaXZlci0+UHJvY0lkLCBOVUxMKTsKLQlpZiAoKHBkcml2ZXItPlByb2NEaXIgIT0gTlVMTCkgJiYgKHBkcml2ZXItPlByb2NEcml2ZXJEaXIgPT0gTlVMTCkpCi0JCXBkcml2ZXItPlByb2NEcml2ZXJEaXIgPSBjcmVhdGVQcm9jRGlyKCJkcml2ZXIiLAotCQkJCQkJICAgICAgIHBkcml2ZXItPlByb2NEaXIpOwotCWlmICgocGRyaXZlci0+UHJvY0RpciAhPSBOVUxMKSAmJiAocGRyaXZlci0+UHJvY0RldmljZURpciA9PSBOVUxMKSkKLQkJcGRyaXZlci0+UHJvY0RldmljZURpciA9IGNyZWF0ZVByb2NEaXIoImRldmljZSIsCi0JCQkJCQkgICAgICAgcGRyaXZlci0+UHJvY0Rpcik7Ci0JaWYgKChwZHJpdmVyLT5Qcm9jRHJpdmVyRGlyICE9IE5VTEwpICYmCi0JICAgIChwZHJpdmVyLT5Qcm9jRHJpdmVyRGlhZ0ZpbGUgPT0gTlVMTCkpIHsKLQkJcGRyaXZlci0+UHJvY0RyaXZlckRpYWdGaWxlID0KLQkJCXByb2NfY3JlYXRlX2RhdGEoImRpYWciLCAwLAotCQkJCQkgcGRyaXZlci0+UHJvY0RyaXZlckRpciwKLQkJCQkJICZwcm9jX2ZvcHNfZHJpdmVyLCBwZHJpdmVyKTsKLQkJaWYgKHBkcml2ZXItPlByb2NEcml2ZXJEaWFnRmlsZSA9PSBOVUxMKQotCQkJRVJSRFJWKCJmYWlsZWQgdG8gcmVnaXN0ZXIgL3Byb2MvJXMvZHJpdmVyL2RpYWcgZW50cnkiLAotCQkJICAgICAgIHBkcml2ZXItPlByb2NJZCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfSW5pdERyaXZlcik7Ci0KLQotCi12b2lkIHZpc29yX2Vhc3lwcm9jX0luaXREcml2ZXJFeChzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkJIGNoYXIgKnByb2NJZCwKLQkJCQkgdm9pZCAoKnNob3dfZHJpdmVyX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqKSwKLQkJCQkgdm9pZCAoKnNob3dfZGV2aWNlX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqLAotCQkJCQkJCSAgdm9pZCAqKSwKLQkJCQkgdm9pZCAoKndyaXRlX2RyaXZlcl9pbmZvKShjaGFyICpidWYsCi0JCQkJCQkJICAgc2l6ZV90IGNvdW50LAotCQkJCQkJCSAgIGxvZmZfdCAqcHBvcyksCi0JCQkJIHZvaWQgKCp3cml0ZV9kZXZpY2VfaW5mbykoY2hhciAqYnVmLAotCQkJCQkJCSAgIHNpemVfdCBjb3VudCwKLQkJCQkJCQkgICBsb2ZmX3QgKnBwb3MsCi0JCQkJCQkJICAgdm9pZCAqcCkpCi17Ci0Jdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlcihwZHJpdmVyLCBwcm9jSWQsCi0JCQkJICBzaG93X2RyaXZlcl9pbmZvLCBzaG93X2RldmljZV9pbmZvKTsKLQlwZHJpdmVyLT5Xcml0ZV9kcml2ZXJfaW5mbyA9IHdyaXRlX2RyaXZlcl9pbmZvOwotCXBkcml2ZXItPldyaXRlX2RldmljZV9pbmZvID0gd3JpdGVfZGV2aWNlX2luZm87Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyRXgpOwotCi0KLQotdm9pZCB2aXNvcl9lYXN5cHJvY19EZUluaXREcml2ZXIoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyKQotewotCWlmIChwZHJpdmVyLT5Qcm9jRHJpdmVyRGlhZ0ZpbGUgIT0gTlVMTCkgewotCQlyZW1vdmVfcHJvY19lbnRyeSgiZGlhZyIsIHBkcml2ZXItPlByb2NEcml2ZXJEaXIpOwotCQlwZHJpdmVyLT5Qcm9jRHJpdmVyRGlhZ0ZpbGUgPSBOVUxMOwotCX0KLQlpZiAocGRyaXZlci0+UHJvY0RyaXZlckRpciAhPSBOVUxMKSB7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIiLCBwZHJpdmVyLT5Qcm9jRGlyKTsKLQkJcGRyaXZlci0+UHJvY0RyaXZlckRpciA9IE5VTEw7Ci0JfQotCWlmIChwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyICE9IE5VTEwpIHsKLQkJcmVtb3ZlX3Byb2NfZW50cnkoImRldmljZSIsIHBkcml2ZXItPlByb2NEaXIpOwotCQlwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyID0gTlVMTDsKLQl9Ci0JaWYgKHBkcml2ZXItPlByb2NEaXIgIT0gTlVMTCkgewotCQlyZW1vdmVfcHJvY19lbnRyeShwZHJpdmVyLT5Qcm9jSWQsIE5VTEwpOwotCQlwZHJpdmVyLT5Qcm9jRGlyID0gTlVMTDsKLQl9Ci0JcGRyaXZlci0+UHJvY0lkID0gTlVMTDsKLQlwZHJpdmVyLT5TaG93X2RyaXZlcl9pbmZvID0gTlVMTDsKLQlwZHJpdmVyLT5TaG93X2RldmljZV9pbmZvID0gTlVMTDsKLQlwZHJpdmVyLT5Xcml0ZV9kcml2ZXJfaW5mbyA9IE5VTEw7Ci0JcGRyaXZlci0+V3JpdGVfZGV2aWNlX2luZm8gPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfRGVJbml0RHJpdmVyKTsKLQotCi0KLXZvaWQgdmlzb3JfZWFzeXByb2NfSW5pdERldmljZShzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkgICAgICAgc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLCBpbnQgZGV2bm8sCi0JCQkgICAgICAgdm9pZCAqZGV2ZGF0YSkKLXsKLQlpZiAoKHBkcml2ZXItPlByb2NEZXZpY2VEaXIgIT0gTlVMTCkgJiYgKHAtPnByb2NEZXZpY2V4RGlyID09IE5VTEwpKSB7Ci0JCWNoYXIgc1syOV07Ci0KLQkJc3ByaW50ZihzLCAiJWQiLCBkZXZubyk7Ci0JCXAtPnByb2NEZXZpY2V4RGlyID0gY3JlYXRlUHJvY0RpcihzLCBwZHJpdmVyLT5Qcm9jRGV2aWNlRGlyKTsKLQkJcC0+ZGV2bm8gPSBkZXZubzsKLQl9Ci0JcC0+ZGV2ZGF0YSA9IGRldmRhdGE7Ci0JcC0+cGRyaXZlciA9IHBkcml2ZXI7Ci0JcC0+ZGV2bm8gPSBkZXZubzsKLQlpZiAoKHAtPnByb2NEZXZpY2V4RGlyICE9IE5VTEwpICYmIChwLT5wcm9jRGV2aWNleERpYWdGaWxlID09IE5VTEwpKSB7Ci0JCXAtPnByb2NEZXZpY2V4RGlhZ0ZpbGUgPQotCQkJcHJvY19jcmVhdGVfZGF0YSgiZGlhZyIsIDAsIHAtPnByb2NEZXZpY2V4RGlyLAotCQkJCQkgJnByb2NfZm9wc19kZXZpY2UsIHApOwotCQlpZiAocC0+cHJvY0RldmljZXhEaWFnRmlsZSA9PSBOVUxMKQotCQkJRVJSREVWWChkZXZubywgImZhaWxlZCB0byByZWdpc3RlciAvcHJvYy8lcy9kZXZpY2UvJWQvZGlhZyBlbnRyeSIsCi0JCQkJcGRyaXZlci0+UHJvY0lkLCBkZXZubwotCQkJICAgICAgICk7Ci0JfQotCW1lbXNldCgmKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvWzBdKSwgMCwKLQkgICAgICAgc2l6ZW9mKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvKSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9lYXN5cHJvY19Jbml0RGV2aWNlKTsKLQotCi0KLXZvaWQgdmlzb3JfZWFzeXByb2NfQ3JlYXRlRGV2aWNlUHJvcGVydHkoc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLAotCQkJCQkgdm9pZCAoKnNob3dfcHJvcGVydHlfaW5mbykKLQkJCQkJIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgdm9pZCAqKSwKLQkJCQkJIGNoYXIgKnByb3BlcnR5X25hbWUpCi17Ci0Jc2l6ZV90IGk7Ci0Jc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvICpweCA9IE5VTEw7Ci0KLQlpZiAocC0+cHJvY0RldmljZXhEaXIgPT0gTlVMTCkgewotCQlFUlJEUlYoInN0YXRlIGVycm9yIik7Ci0JCXJldHVybjsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm8pOyBpKyspIHsKLQkJaWYgKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvW2ldLnByb2NFbnRyeSA9PSBOVUxMKSB7Ci0JCQlweCA9ICYocC0+ZGV2aWNlX3Byb3BlcnR5X2luZm9baV0pOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCFweCkgewotCQlFUlJERVZYKHAtPmRldm5vLCAidG9vIG1hbnkgZGV2aWNlIHByb3BlcnRpZXMiKTsKLQkJcmV0dXJuOwotCX0KLQlweC0+ZGV2ZGF0YSA9IHAtPmRldmRhdGE7Ci0JcHgtPnBkcml2ZXIgPSBwLT5wZHJpdmVyOwotCXB4LT5wcm9jRW50cnkgPSBwcm9jX2NyZWF0ZV9kYXRhKHByb3BlcnR5X25hbWUsIDAsIHAtPnByb2NEZXZpY2V4RGlyLAotCQkJCQkgJnByb2NfZm9wc19kZXZpY2VfcHJvcGVydHksIHB4KTsKLQlpZiAoc3RybGVuKHByb3BlcnR5X25hbWUpKzEgPiBzaXplb2YocHgtPnByb3BlcnR5X25hbWUpKSB7Ci0JCUVSUkRFVlgocC0+ZGV2bm8sICJkZXZpY2UgcHJvcGVydHkgbmFtZSAlcyB0b28gbG9uZyIsCi0JCQlwcm9wZXJ0eV9uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQlzdHJjcHkocHgtPnByb3BlcnR5X25hbWUsIHByb3BlcnR5X25hbWUpOwotCWlmIChweC0+cHJvY0VudHJ5ID09IE5VTEwpIHsKLQkJRVJSREVWWChwLT5kZXZubywKLQkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgL3Byb2MvJXMvZGV2aWNlLyVkLyVzIGVudHJ5IiwKLQkJCXAtPnBkcml2ZXItPlByb2NJZCwgcC0+ZGV2bm8sIHByb3BlcnR5X25hbWUpOwotCQlyZXR1cm47Ci0JfQotCXB4LT5zaG93X2RldmljZV9wcm9wZXJ0eV9pbmZvID0gc2hvd19wcm9wZXJ0eV9pbmZvOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfQ3JlYXRlRGV2aWNlUHJvcGVydHkpOwotCi0KLQotdm9pZCB2aXNvcl9lYXN5cHJvY19EZUluaXREZXZpY2Uoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAotCQkJCSBzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKnAsIGludCBkZXZubykKLXsKLQlzaXplX3QgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHAtPmRldmljZV9wcm9wZXJ0eV9pbmZvKTsgaSsrKSB7Ci0JCWlmIChwLT5kZXZpY2VfcHJvcGVydHlfaW5mb1tpXS5wcm9jRW50cnkgIT0gTlVMTCkgewotCQkJc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvICpweCA9Ci0JCQkJJihwLT5kZXZpY2VfcHJvcGVydHlfaW5mb1tpXSk7Ci0JCQlyZW1vdmVfcHJvY19lbnRyeShweC0+cHJvcGVydHlfbmFtZSwgcC0+cHJvY0RldmljZXhEaXIpOwotCQkJcHgtPnByb2NFbnRyeSA9IE5VTEw7Ci0JCX0KLQl9Ci0JaWYgKHAtPnByb2NEZXZpY2V4RGlhZ0ZpbGUgIT0gTlVMTCkgewotCQlyZW1vdmVfcHJvY19lbnRyeSgiZGlhZyIsIHAtPnByb2NEZXZpY2V4RGlyKTsKLQkJcC0+cHJvY0RldmljZXhEaWFnRmlsZSA9IE5VTEw7Ci0JfQotCWlmIChwLT5wcm9jRGV2aWNleERpciAhPSBOVUxMKSB7Ci0JCWNoYXIgc1syOV07Ci0KLQkJc3ByaW50ZihzLCAiJWQiLCBkZXZubyk7Ci0JCXJlbW92ZV9wcm9jX2VudHJ5KHMsIHBkcml2ZXItPlByb2NEZXZpY2VEaXIpOwotCQlwLT5wcm9jRGV2aWNleERpciA9IE5VTEw7Ci0JfQotCXAtPmRldmRhdGEgPSBOVUxMOwotCXAtPnBkcml2ZXIgPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfZWFzeXByb2NfRGVJbml0RGV2aWNlKTsKLQotCi0KLXN0YXRpYyBpbnQgc2VxX3Nob3dfZHJpdmVyKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0Jc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwID0KLQkJKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqKShzZXEtPnByaXZhdGUpOwotCWlmICghcCkKLQkJcmV0dXJuIDA7Ci0JKCoocC0+U2hvd19kcml2ZXJfaW5mbykpKHNlcSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgaW50IHNlcV9zaG93X2RldmljZShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCA9Ci0JCShzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX2luZm8gKikoc2VxLT5wcml2YXRlKTsKLQlpZiAoKCFwKSB8fCAoIShwLT5wZHJpdmVyKSkpCi0JCXJldHVybiAwOwotCSgqKHAtPnBkcml2ZXItPlNob3dfZGV2aWNlX2luZm8pKShzZXEsIHAtPmRldmRhdGEpOwotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIGludCBzZXFfc2hvd19kZXZpY2VfcHJvcGVydHkoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKLXsKLQlzdHJ1Y3QgZWFzeXByb2NfZGV2aWNlX3Byb3BlcnR5X2luZm8gKnAgPQotCQkoc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvICopKHNlcS0+cHJpdmF0ZSk7Ci0JaWYgKCghcCkgfHwgKCEocC0+c2hvd19kZXZpY2VfcHJvcGVydHlfaW5mbykpKQotCQlyZXR1cm4gMDsKLQkoKihwLT5zaG93X2RldmljZV9wcm9wZXJ0eV9pbmZvKSkoc2VxLCBwLT5kZXZkYXRhKTsKLQlyZXR1cm4gMDsKLX0KLQotCi0KLXN0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfZHJpdmVyKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwID0gTlVMTDsKLQljaGFyIGxvY2FsX2J1ZlsyNTZdOwotCi0JaWYgKHNlcSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlwID0gKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqKShzZXEtPnByaXZhdGUpOwotCWlmICgoIXApIHx8ICghKHAtPldyaXRlX2RyaXZlcl9pbmZvKSkpCi0JCXJldHVybiAwOwotCWlmIChjb3VudCA+PSBzaXplb2YobG9jYWxfYnVmKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGxvY2FsX2J1ZiwgYnVmZmVyLCBjb3VudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCWxvY2FsX2J1Zltjb3VudF0gPSAnXDAnOyAgLyogYmUgZnJpZW5kbHkgKi8KLQkoKihwLT5Xcml0ZV9kcml2ZXJfaW5mbykpKGxvY2FsX2J1ZiwgY291bnQsIHBwb3MpOwotCXJldHVybiBjb3VudDsKLX0KLQotCi0KLXN0YXRpYyBzc2l6ZV90IHByb2Nfd3JpdGVfZGV2aWNlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAotCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSA9IChzdHJ1Y3Qgc2VxX2ZpbGUgKilmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwID0gTlVMTDsKLQljaGFyIGxvY2FsX2J1ZlsyNTZdOwotCi0JaWYgKHNlcSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlwID0gKHN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqKShzZXEtPnByaXZhdGUpOwotCWlmICgoIXApIHx8ICghKHAtPnBkcml2ZXIpKSB8fCAoIShwLT5wZHJpdmVyLT5Xcml0ZV9kZXZpY2VfaW5mbykpKQotCQlyZXR1cm4gMDsKLQlpZiAoY291bnQgPj0gc2l6ZW9mKGxvY2FsX2J1ZikpCi0JCXJldHVybiAtRU5PTUVNOwotCWlmIChjb3B5X2Zyb21fdXNlcihsb2NhbF9idWYsIGJ1ZmZlciwgY291bnQpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlsb2NhbF9idWZbY291bnRdID0gJ1wwJzsgIC8qIGJlIGZyaWVuZGx5ICovCi0JKCoocC0+cGRyaXZlci0+V3JpdGVfZGV2aWNlX2luZm8pKShsb2NhbF9idWYsIGNvdW50LCBwcG9zLCBwLT5kZXZkYXRhKTsKLQlyZXR1cm4gY291bnQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5oIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvZWFzeXByb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNlN2Q1ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9lYXN5cHJvYy5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyogZWFzeXByb2MuaAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCAtIDIwMTMgVU5JU1lTIENPUlBPUkFUSU9OCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Ci0gKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCi0gKiBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZQotICogZGV0YWlscy4KLSAqLwotCi0vKiogQGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogIFRoaXMgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2VzIG5lY2Vzc2FyeSBmb3IgYSBzaW1wbGUgL3Byb2MgZmlsZQotICogIGltcGxlbWVudGF0aW9uIGZvciBhIGRyaXZlci4KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKi8KLQotI2lmbmRlZiBfX0VBU1lQUk9DX0hfXwotI2RlZmluZSBfX0VBU1lQUk9DX0hfXwotCi0jaW5jbHVkZSAidGltc2ttb2QuaCIKLQotCi1zdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqUHJvY0RpcjsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKlByb2NEcml2ZXJEaXI7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRHJpdmVyRGlhZ0ZpbGU7Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpQcm9jRGV2aWNlRGlyOwotCWNoYXIgKlByb2NJZDsKLQl2b2lkICgqU2hvd19kZXZpY2VfaW5mbykoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnApOwotCXZvaWQgKCpTaG93X2RyaXZlcl9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSk7Ci0Jdm9pZCAoKldyaXRlX2RldmljZV9pbmZvKShjaGFyICpidWYsIHNpemVfdCBjb3VudCwKLQkJCQkgIGxvZmZfdCAqcHBvcywgdm9pZCAqcCk7Ci0Jdm9pZCAoKldyaXRlX2RyaXZlcl9pbmZvKShjaGFyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLX07Ci0KLS8qIHByb3BlcnR5IGlzIGEgZmlsZSB1bmRlciAvcHJvYy88eD4vZGV2aWNlLzx4Pi88cHJvcGVydHlfbmFtZT4gKi8KLXN0cnVjdCBlYXN5cHJvY19kZXZpY2VfcHJvcGVydHlfaW5mbyB7Ci0JY2hhciBwcm9wZXJ0eV9uYW1lWzI1XTsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NFbnRyeTsKLQlzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXI7Ci0Jdm9pZCAqZGV2ZGF0YTsKLQl2b2lkICgqc2hvd19kZXZpY2VfcHJvcGVydHlfaW5mbykoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnApOwotfTsKLQotc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvIHsKLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEZXZpY2V4RGlyOwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RldmljZXhEaWFnRmlsZTsKLQlzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXI7Ci0Jdm9pZCAqZGV2ZGF0YTsKLQlpbnQgZGV2bm87Ci0JLyogIGFsbG93IGZvciBhIG51bWJlciBvZiBjdXN0b20gcHJvcGVydGllcyBmb3IgZWFjaCBkZXZpY2U6ICovCi0Jc3RydWN0IGVhc3lwcm9jX2RldmljZV9wcm9wZXJ0eV9pbmZvIGRldmljZV9wcm9wZXJ0eV9pbmZvWzEwXTsKLX07Ci0KLXZvaWQgdmlzb3JfZWFzeXByb2NfSW5pdERldmljZShzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkgICAgICAgc3RydWN0IGVhc3lwcm9jX2RldmljZV9pbmZvICpwLCBpbnQgZGV2bm8sCi0JCQkgICAgICAgdm9pZCAqZGV2ZGF0YSk7Ci12b2lkIHZpc29yX2Vhc3lwcm9jX0RlSW5pdERldmljZShzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkJIHN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCwgaW50IGRldm5vKTsKLXZvaWQgdmlzb3JfZWFzeXByb2NfSW5pdERyaXZlcihzdHJ1Y3QgZWFzeXByb2NfZHJpdmVyX2luZm8gKnBkcml2ZXIsCi0JCQkgICAgICAgY2hhciAqcHJvY0lkLAotCQkJICAgICAgIHZvaWQgKCpzaG93X2RyaXZlcl9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiksCi0JCQkgICAgICAgdm9pZCAoKnNob3dfZGV2aWNlX2luZm8pKHN0cnVjdCBzZXFfZmlsZSAqLAotCQkJCQkJCXZvaWQgKikpOwotdm9pZCB2aXNvcl9lYXN5cHJvY19Jbml0RHJpdmVyRXgoc3RydWN0IGVhc3lwcm9jX2RyaXZlcl9pbmZvICpwZHJpdmVyLAotCQkJCSBjaGFyICpwcm9jSWQsCi0JCQkJIHZvaWQgKCpzaG93X2RyaXZlcl9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiksCi0JCQkJIHZvaWQgKCpzaG93X2RldmljZV9pbmZvKShzdHJ1Y3Qgc2VxX2ZpbGUgKiwKLQkJCQkJCQkgIHZvaWQgKiksCi0JCQkJIHZvaWQgKCpXcml0ZV9kcml2ZXJfaW5mbykoY2hhciAqYnVmLAotCQkJCQkJCSAgIHNpemVfdCBjb3VudCwKLQkJCQkJCQkgICBsb2ZmX3QgKnBwb3MpLAotCQkJCSB2b2lkICgqV3JpdGVfZGV2aWNlX2luZm8pKGNoYXIgKmJ1ZiwKLQkJCQkJCQkgICBzaXplX3QgY291bnQsCi0JCQkJCQkJICAgbG9mZl90ICpwcG9zLAotCQkJCQkJCSAgIHZvaWQgKnApKTsKLXZvaWQgdmlzb3JfZWFzeXByb2NfRGVJbml0RHJpdmVyKHN0cnVjdCBlYXN5cHJvY19kcml2ZXJfaW5mbyAqcGRyaXZlcik7Ci12b2lkIHZpc29yX2Vhc3lwcm9jX0NyZWF0ZURldmljZVByb3BlcnR5KHN0cnVjdCBlYXN5cHJvY19kZXZpY2VfaW5mbyAqcCwKLQkJCQkJIHZvaWQgKCpzaG93X3Byb3BlcnR5X2luZm8pCi0JCQkJCSAoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKiksCi0JCQkJCSBjaGFyICpwcm9wZXJ0eV9uYW1lKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9tZW1yZWdpb25fZGlyZWN0LmMgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9tZW1yZWdpb25fZGlyZWN0LmMKaW5kZXggMzM1MjJjYy4uZWI3NDIyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvbWVtcmVnaW9uX2RpcmVjdC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL21lbXJlZ2lvbl9kaXJlY3QuYwpAQCAtMjAsNyArMjAsNiBAQAogICogIGNoYW5uZWwgbWVtb3J5IChpbiBtYWluIG1lbW9yeSBvZiB0aGUgaG9zdCBzeXN0ZW0pIGZyb20gY29kZSBydW5uaW5nIGluCiAgKiAgYSB2aXJ0dWFsIHBhcnRpdGlvbi4KICAqLwotI2luY2x1ZGUgInVuaWtsb2cuaCIKICNpbmNsdWRlICJ0aW1za21vZC5oIgogI2luY2x1ZGUgIm1lbXJlZ2lvbi5oIgogCkBAIC00MSwxMiArNDAsMTIgQEAKIHZpc29yX21lbXJlZ2lvbl9jcmVhdGUoSE9TVEFERFJFU1MgcGh5c2FkZHIsIHVsb25nIG5ieXRlcykKIHsKIAlzdHJ1Y3QgbWVtcmVnaW9uICpyYyA9IE5VTEw7Ci0Jc3RydWN0IG1lbXJlZ2lvbiAqbWVtcmVnaW9uID0ga3phbGxvYyhzaXplb2YoKm1lbXJlZ2lvbiksCi0JCQkJCSAgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKLQlpZiAobWVtcmVnaW9uID09IE5VTEwpIHsKLQkJRVJSRFJWKCJ2aXNvcl9tZW1yZWdpb25fY3JlYXRlIGFsbG9jYXRpb24gZmFpbGVkIik7CisJc3RydWN0IG1lbXJlZ2lvbiAqbWVtcmVnaW9uOworCisJbWVtcmVnaW9uID0ga3phbGxvYyhzaXplb2YoKm1lbXJlZ2lvbiksIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKKwlpZiAobWVtcmVnaW9uID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCX0KKwogCW1lbXJlZ2lvbi0+cGh5c2FkZHIgPSBwaHlzYWRkcjsKIAltZW1yZWdpb24tPm5ieXRlcyA9IG5ieXRlczsKIAltZW1yZWdpb24tPm92ZXJsYXBwZWQgPSBGQUxTRTsKQEAgLTcwLDI1ICs2OSwxOSBAQAogewogCXN0cnVjdCBtZW1yZWdpb24gKm1lbXJlZ2lvbiA9IE5VTEw7CiAKLQlpZiAocGFyZW50ID09IE5VTEwpIHsKLQkJRVJSRFJWKCIlcyBwYXJlbnQgaXMgTlVMTCIsIF9fZnVuY19fKTsKKwlpZiAocGFyZW50ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwotCX0KLQlpZiAocGFyZW50LT5tYXBwZWQgPT0gTlVMTCkgewotCQlFUlJEUlYoIiVzIHBhcmVudCBpcyBub3QgbWFwcGVkISIsIF9fZnVuY19fKTsKKworCWlmIChwYXJlbnQtPm1hcHBlZCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQl9CisKIAlpZiAoKG9mZnNldCA+PSBwYXJlbnQtPm5ieXRlcykgfHwKLQkgICAgKChvZmZzZXQgKyBuYnl0ZXMpID49IHBhcmVudC0+bmJ5dGVzKSkgewotCQlFUlJEUlYoIiVzIHJhbmdlICglbHUsJWx1KSBvdXQgb2YgcGFyZW50IHJhbmdlIiwKLQkJICAgICAgIF9fZnVuY19fLCBvZmZzZXQsIG5ieXRlcyk7CisJICAgICgob2Zmc2V0ICsgbmJ5dGVzKSA+PSBwYXJlbnQtPm5ieXRlcykpCiAJCXJldHVybiBOVUxMOwotCX0KKwogCW1lbXJlZ2lvbiA9IGt6YWxsb2Moc2l6ZW9mKCptZW1yZWdpb24pLCBHRlBfS0VSTkVMfF9fR0ZQX05PUkVUUlkpOwotCWlmIChtZW1yZWdpb24gPT0gTlVMTCkgewotCQlFUlJEUlYoIiVzIGFsbG9jYXRpb24gZmFpbGVkIiwgX19mdW5jX18pOworCWlmIChtZW1yZWdpb24gPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJbWVtcmVnaW9uLT5waHlzYWRkciA9IHBhcmVudC0+cGh5c2FkZHIgKyBvZmZzZXQ7CiAJbWVtcmVnaW9uLT5uYnl0ZXMgPSBuYnl0ZXM7CkBAIC0xMDYsMTcgKzk5LDExIEBACiAJdWxvbmcgbmJ5dGVzID0gbWVtcmVnaW9uLT5uYnl0ZXM7CiAKIAltZW1yZWdpb24tPnJlcXVlc3RlZCA9IEZBTFNFOwotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHBoeXNhZGRyLCBuYnl0ZXMsIE1ZRFJWTkFNRSkpCi0JCUVSUkRSVigiY2Fubm90IHJlc2VydmUgY2hhbm5lbCBtZW1vcnkgQDB4JWx4IGZvciAweCVseC0tIG5vIGJpZyBkZWFsIiwKLQkJICAgICAgIHBoeXNhZGRyLCBuYnl0ZXMpOwotCWVsc2UKKwlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKHBoeXNhZGRyLCBuYnl0ZXMsIE1ZRFJWTkFNRSkpCiAJCW1lbXJlZ2lvbi0+cmVxdWVzdGVkID0gVFJVRTsKIAltZW1yZWdpb24tPm1hcHBlZCA9IGlvcmVtYXBfY2FjaGUocGh5c2FkZHIsIG5ieXRlcyk7Ci0JaWYgKG1lbXJlZ2lvbi0+bWFwcGVkID09IE5VTEwpIHsKLQkJRVJSRFJWKCJjYW5ub3QgaW9yZW1hcF9jYWNoZSBjaGFubmVsIG1lbW9yeSBAMHglbHggZm9yIDB4JWx4IiwKLQkJICAgICAgIHBoeXNhZGRyLCBuYnl0ZXMpOworCWlmICghbWVtcmVnaW9uLT5tYXBwZWQpCiAJCXJldHVybiBGQUxTRTsKLQl9CiAJcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTE4MCwxMCArMTY3LDkgQEAKIAkJICAgIHN0cnVjdCBtZW1yZWdpb24gKm1lbXJlZ2lvbiwgdWxvbmcgb2Zmc2V0LAogCQkgICAgdm9pZCAqbG9jYWwsIHVsb25nIG5ieXRlcykKIHsKLQlpZiAob2Zmc2V0ICsgbmJ5dGVzID4gbWVtcmVnaW9uLT5uYnl0ZXMpIHsKLQkJRVJSRFJWKCJtZW1yZWdpb25fcmVhZHdyaXRlIG9mZnNldCBvdXQgb2YgcmFuZ2UhISIpOworCWlmIChvZmZzZXQgKyBuYnl0ZXMgPiBtZW1yZWdpb24tPm5ieXRlcykKIAkJcmV0dXJuIC1FSU87Ci0JfQorCiAJaWYgKGlzX3dyaXRlKQogCQltZW1jcHlfdG9pbyhtZW1yZWdpb24tPm1hcHBlZCArIG9mZnNldCwgbG9jYWwsIG5ieXRlcyk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvcGVyaW9kaWNfd29yay5jIGIvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvcGVyaW9kaWNfd29yay5jCmluZGV4IDA5MDhiZjkuLmFiYmZiNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3BlcmlvZGljX3dvcmsuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC9wZXJpb2RpY193b3JrLmMKQEAgLTE5LDcgKzE5LDYgQEAKICAqICBIZWxwZXIgZnVuY3Rpb25zIHRvIHNjaGVkdWxlIHBlcmlvZGljIHdvcmsgaW4gTGludXgga2VybmVsIG1vZGUuCiAgKi8KIAotI2luY2x1ZGUgInVuaWtsb2cuaCIKICNpbmNsdWRlICJ0aW1za21vZC5oIgogI2luY2x1ZGUgInBlcmlvZGljX3dvcmsuaCIKIApAQCAtOTAsNyArODksNiBAQAogCQlnb3RvIHVubG9jazsKIAl9IGVsc2UgaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhwdy0+d29ya3F1ZXVlLCAmcHctPndvcmssCiAJCQkJICAgICAgcHctPmppZmZ5X2ludGVydmFsKSA8IDApIHsKLQkJRVJSREVWKHB3LT5kZXZuYW0sICJxdWV1ZV9kZWxheWVkX3dvcmsgZmFpbGVkISIpOwogCQlwdy0+aXNfc2NoZWR1bGVkID0gRkFMU0U7CiAJCXJjID0gRkFMU0U7CiAJCWdvdG8gdW5sb2NrOwpAQCAtMTE2LDE1ICsxMTQsMTIgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCWlmIChwdy0+d2FudF90b19zdG9wKSB7Ci0JCUVSUkRFVihwdy0+ZGV2bmFtLAotCQkgICAgICAgImRldl9zdGFydF9wZXJpb2RpY193b3JrIGZhaWxlZCEiKTsKIAkJcmMgPSBGQUxTRTsKIAkJZ290byB1bmxvY2s7CiAJfQogCUlOSVRfREVMQVlFRF9XT1JLKCZwdy0+d29yaywgJnBlcmlvZGljX3dvcmtfZnVuYyk7CiAJaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhwdy0+d29ya3F1ZXVlLCAmcHctPndvcmssCiAJCQkgICAgICAgcHctPmppZmZ5X2ludGVydmFsKSA8IDApIHsKLQkJRVJSREVWKHB3LT5kZXZuYW0sICIlcyBxdWV1ZV9kZWxheWVkX3dvcmsgZmFpbGVkISIsIF9fZnVuY19fKTsKIAkJcmMgPSBGQUxTRTsKIAkJZ290byB1bmxvY2s7CiAJfQpAQCAtMTgyLDcgKzE3Nyw3IEBACiAJCQkvKiBXZSBnZXQgaGVyZSBpZiB0aGUgZGVsYXllZCB3b3JrIHdhcyBwZW5kaW5nIGFzCiAJCQkgKiBkZWxheWVkIHdvcmssIGJ1dCB3YXMgTk9UIHJ1bi4KIAkJCSAqLwotCQkJQVNTRVJUKHB3LT5pc19zY2hlZHVsZWQpOworCQkJV0FSTl9PTighcHctPmlzX3NjaGVkdWxlZCk7CiAJCQlwdy0+aXNfc2NoZWR1bGVkID0gRkFMU0U7CiAJCX0gZWxzZSB7CiAJCQkvKiBJZiB3ZSBnZXQgaGVyZSwgZWl0aGVyIHRoZSBkZWxheWVkIHdvcms6CkBAIC0xOTcsMTQgKzE5Miw2IEBACiAJCX0KIAkJaWYgKHB3LT5pc19zY2hlZHVsZWQpIHsKIAkJCXdyaXRlX3VubG9jaygmcHctPmxvY2spOwotCQkJV0FSTkRFVihwdy0+ZGV2bmFtLAotCQkJCSJ3YWl0aW5nIGZvciBkZWxheWVkIHdvcmsuLi4iKTsKLQkJCS8qIFdlIHJlbHkgb24gdGhlIGRlbGF5ZWQgd29yayBmdW5jdGlvbiBydW5uaW5nIGhlcmUsCi0JCQkgKiBhbmQgZXZlbnR1YWxseSBjYWxsaW5nCi0JCQkgKiB2aXNvcl9wZXJpb2RpY193b3JrX25leHRwZXJpb2QoKSwKLQkJCSAqIHdoaWNoIHdpbGwgc2VlIHRoYXQgd2FudF90b19zdG9wIGlzIHNldCwgYW5kCi0JCQkgKiBzdWJzZXF1ZW50bHkgY2xlYXIgaXNfc2NoZWR1bGVkLgotCQkJICovCiAJCQlTTEVFUEpJRkZJRVMoMTApOwogCQkJd3JpdGVfbG9jaygmcHctPmxvY2spOwogCQl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvcHJvY29iamVjdHRyZWUuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Byb2NvYmplY3R0cmVlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMjc5Y2EuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvcHJvY29iamVjdHRyZWUuYworKysgL2Rldi9udWxsCkBAIC0xLDM1MyArMCwwIEBACi0vKiBwcm9jb2JqZWN0dHJlZS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIC0gMjAxMyBVTklTWVMgQ09SUE9SQVRJT04KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIEdPT0QgVElUTEUgb3IKLSAqIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlCi0gKiBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlICJwcm9jb2JqZWN0dHJlZS5oIgotCi0jZGVmaW5lIE1ZRFJWTkFNRSAicHJvY29iamVjdHRyZWUiCi0KLQotCi0vKiogVGhpcyBpcyBjb250ZXh0IGluZm8gdGhhdCB3ZSBzdGFzaCBpbiBlYWNoIC9wcm9jIGZpbGUgZW50cnksIHdoaWNoIHdlCi0gKiAgbmVlZCBpbiBvcmRlciB0byBjYWxsIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHN1cHBsaWVzIHRoZSAvcHJvYyByZWFkCi0gKiAgaW5mbyBmb3IgdGhhdCBmaWxlLgotICovCi1zdHJ1Y3QgcHJvY19kaXJfZW50cnlfY29udGV4dCB7Ci0Jdm9pZCAoKnNob3dfcHJvcGVydHkpKHN0cnVjdCBzZXFfZmlsZSAqLCB2b2lkICosIGludCk7Ci0JTVlQUk9DT0JKRUNUICpwcm9jT2JqZWN0OwotCWludCBwcm9wZXJ0eUluZGV4OwotCi19OwotCi0vKiogVGhpcyBkZXNjcmliZXMgdGhlIGF0dHJpYnV0ZXMgb2YgYSB0cmVlIHJvb3RlZCBhdAotICogIDxwcm9jRGlyUm9vdD4vPG5hbWVbMF0+LzxuYW1lWzFdPi8uLi4KLSAqICBQcm9wZXJ0aWVzIGZvciBlYWNoIG9iamVjdCBvZiB0aGlzIHR5cGUgd2lsbCBiZSBsb2NhdGVkIHVuZGVyCi0gKiAgPHByb2NEaXJSb290Pi88bmFtZVswXT4vPG5hbWVbMV0+Ly4uLi88b2JqZWN0TmFtZT4vPHByb3BlcnR5TmFtZT4uCi0gKi8KLXN0cnVjdCBNWVBST0NUWVBFX1RhZyB7Ci0JY29uc3QgY2hhciAqKm5hbWU7ICAvKio8IG5vZGUgbmFtZXMgZm9yIHRoaXMgdHlwZSwgZW5kaW5nIHdpdGggTlVMTCAqLwotCWludCBuTmFtZXM7ICAgICAgICAgLyoqPCBudW0gb2Ygbm9kZSBuYW1lcyBpbiA8bmFtZT4gKi8KLQotCS8qKiByb290IGRpciBmb3IgdGhpcyB0eXBlIHRyZWUgaW4gL3Byb2MgKi8KLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXJSb290OwotCi0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcHJvY0RpcnM7ICAvKio8IGZvciBlYWNoIG5vZGUgaW4gPG5hbWU+ICovCi0KLQkvKiogYm90dG9tIGRpciB3aGVyZSBvYmplY3RzIHdpbGwgYmUgcm9vdGVkOyBpLmUuLCB0aGlzIGlzCi0JICogIDxwcm9jRGlyUm9vdD4vPG5hbWVbMF0+LzxuYW1lWzFdPi8uLi4vLCB3aGljaCBpcyB0aGUgc2FtZSBhcyB0aGUKLQkgKiAgbGFzdCBlbnRyeSBpbiB0aGUgPHByb2NEaXJzPiBhcnJheS4gKi8KLQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXI7Ci0KLQkvKiogbmFtZSBmb3IgZWFjaCBwcm9wZXJ0eSB0aGF0IG9iamVjdHMgb2YgdGhpcyB0eXBlIGNhbiBoYXZlICovCi0JY29uc3QgY2hhciAqKnByb3BlcnR5TmFtZXM7Ci0KLQlpbnQgblByb3BlcnRpZXM7ICAgICAgIC8qKjwgbnVtIG9mIG5hbWVzIGluIDxwcm9wZXJ0eU5hbWVzPiAqLwotCi0JLyoqIENhbGwgdGhpcywgcGFzc2luZyBNWVBST0NPQkpFQ1QuY29udGV4dCBhbmQgdGhlIHByb3BlcnR5IGluZGV4Ci0JICogIHdoZW5ldmVyIHNvbWVvbmUgcmVhZHMgdGhlIHByb2MgZW50cnkgKi8KLQl2b2lkICgqc2hvd19wcm9wZXJ0eSkoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKiwgaW50KTsKLX07Ci0KLQotCi1zdHJ1Y3QgTVlQUk9DT0JKRUNUX1RhZyB7Ci0JTVlQUk9DVFlQRSAqdHlwZTsKLQotCS8qKiBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBkaXIgbm9kZSBpbiAvcHJvYyB1bmRlciB3aGljaCB0aGUKLQkgKiAgcHJvcGVydGllcyBvZiB0aGlzIG9iamVjdCB3aWxsIGFwcGVhciBhcyBmaWxlcy4gKi8KLQljaGFyICpuYW1lOwotCi0JaW50IG5hbWVzaXplOyAgIC8qKjwgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBmb3IgbmFtZSAqLwotCXZvaWQgKmNvbnRleHQ7ICAvKio8IHBhc3NlZCB0byBNWVBST0NUWVBFLnNob3dfcHJvcGVydHkgKi8KLQotCS8qKiA8dHlwZS5wcm9jRGlyUm9vdD4vPHR5cGUubmFtZVswXT4vPHR5cGUubmFtZVsxXT4vLi4uLzxuYW1lPiAqLwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY0RpcjsKLQotCS8qKiBhIHByb2MgZGlyIGVudHJ5IGZvciBlYWNoIG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvYmplY3Q7Ci0JICogIHByb3BlcnRpZXMgYXJlIGlkZW50aWZpZWQgaW4gTVlQUk9DVFlQRS5wcm9wZXJ0eU5hbWVzLCBzbyBlYWNoIG9mCi0JICogIHRoZSA8cHJvY0RpclByb3BlcnRpZXM+IGRlc2NyaWJlcyBhIHNpbmdsZSBmaWxlIGxpa2UKLQkgKiAgPHR5cGUucHJvY0RpclJvb3Q+Lzx0eXBlLm5hbWVbMF0+Lzx0eXBlLm5hbWVbMV0+Ly4uLgotCSAqICAgICAgICAgICAvPG5hbWU+Lzxwcm9wZXJ0eU5hbWU+Ci0JICovCi0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICoqcHJvY0RpclByb3BlcnRpZXM7Ci0KLQkvKiogdGhpcyBpcyBhIGhvbGRpbmcgYXJlYSBmb3IgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gdGhhdCBpcyBuZWVkZWQKLQkgKiAgdG8gcnVuIHRoZSAvcHJvYyBjYWxsYmFjayBmdW5jdGlvbiAqLwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeV9jb250ZXh0ICpwcm9jRGlyUHJvcGVydHlDb250ZXh0czsKLX07Ci0KLQotCi1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICoKLWNyZWF0ZVByb2NEaXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwID0gcHJvY19ta2Rpcl9tb2RlKG5hbWUsIFNfSUZESVIsIHBhcmVudCk7Ci0KLQlpZiAocCA9PSBOVUxMKQotCQlFUlJEUlYoImZhaWxlZCB0byBjcmVhdGUgL3Byb2MgZGlyZWN0b3J5ICVzIiwgbmFtZSk7Ci0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKgotY3JlYXRlUHJvY0ZpbGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwYXJlbnQsCi0JICAgICAgIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwID0gcHJvY19jcmVhdGVfZGF0YShuYW1lLCAwLCBwYXJlbnQsCi0JCQkJCQkgICAgZm9wcywgZGF0YSk7Ci0JaWYgKHAgPT0gTlVMTCkKLQkJRVJSRFJWKCJmYWlsZWQgdG8gY3JlYXRlIC9wcm9jIGZpbGUgJXMiLCBuYW1lKTsKLQlyZXR1cm4gcDsKLX0KLQotc3RhdGljIGludCBzZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLXN0YXRpYyBpbnQgcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBzZXFfc2hvdywgUERFX0RBVEEoaW5vZGUpKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJvY19mb3BzID0gewotCS5vcGVuID0gcHJvY19vcGVuLAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotCi0KLU1ZUFJPQ1RZUEUgKnZpc29yX3Byb2NfQ3JlYXRlVHlwZShzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NEaXJSb290LAotCQkJCSAgY29uc3QgY2hhciAqKm5hbWUsCi0JCQkJICBjb25zdCBjaGFyICoqcHJvcGVydHlOYW1lcywKLQkJCQkgIHZvaWQgKCpzaG93X3Byb3BlcnR5KShzdHJ1Y3Qgc2VxX2ZpbGUgKiwKLQkJCQkJCQl2b2lkICosIGludCkpCi17Ci0JaW50IGkgPSAwOwotCU1ZUFJPQ1RZUEUgKnJjID0gTlVMTCwgKnR5cGUgPSBOVUxMOwotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGFyZW50ID0gTlVMTDsKLQotCWlmIChwcm9jRGlyUm9vdCA9PSBOVUxMKSB7Ci0JCUVSUkRSVigicHJvY0RpclJvb3QgY2Fubm90IGJlIE5VTEwhXG4iKTsKLQkJZ290byBBd2F5OwotCX0KLQlpZiAobmFtZSA9PSBOVUxMIHx8IG5hbWVbMF0gPT0gTlVMTCkgewotCQlFUlJEUlYoIm5hbWUgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgbm9kZSBuYW1lIVxuIik7Ci0JCWdvdG8gQXdheTsKLQl9Ci0JdHlwZSA9IGt6YWxsb2Moc2l6ZW9mKE1ZUFJPQ1RZUEUpLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9SRVRSWSk7Ci0JaWYgKHR5cGUgPT0gTlVMTCkgewotCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOwotCQlnb3RvIEF3YXk7Ci0JfQotCXR5cGUtPm5hbWUgPSBuYW1lOwotCXR5cGUtPnByb3BlcnR5TmFtZXMgPSBwcm9wZXJ0eU5hbWVzOwotCXR5cGUtPm5Qcm9wZXJ0aWVzID0gMDsKLQl0eXBlLT5uTmFtZXMgPSAwOwotCXR5cGUtPnNob3dfcHJvcGVydHkgPSBzaG93X3Byb3BlcnR5OwotCXR5cGUtPnByb2NEaXJSb290ID0gcHJvY0RpclJvb3Q7Ci0JaWYgKHR5cGUtPnByb3BlcnR5TmFtZXMgIT0gTlVMTCkKLQkJd2hpbGUgKHR5cGUtPnByb3BlcnR5TmFtZXNbdHlwZS0+blByb3BlcnRpZXNdICE9IE5VTEwpCi0JCQl0eXBlLT5uUHJvcGVydGllcysrOwotCXdoaWxlICh0eXBlLT5uYW1lW3R5cGUtPm5OYW1lc10gIT0gTlVMTCkKLQkJdHlwZS0+bk5hbWVzKys7Ci0JdHlwZS0+cHJvY0RpcnMgPSBremFsbG9jKCh0eXBlLT5uTmFtZXMgKyAxKSAqCi0JCQkJIHNpemVvZihzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKiksCi0JCQkJIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKLQlpZiAodHlwZS0+cHJvY0RpcnMgPT0gTlVMTCkgewotCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOwotCQlnb3RvIEF3YXk7Ci0JfQotCXBhcmVudCA9IHByb2NEaXJSb290OwotCWZvciAoaSA9IDA7IGkgPCB0eXBlLT5uTmFtZXM7IGkrKykgewotCQl0eXBlLT5wcm9jRGlyc1tpXSA9IGNyZWF0ZVByb2NEaXIodHlwZS0+bmFtZVtpXSwgcGFyZW50KTsKLQkJaWYgKHR5cGUtPnByb2NEaXJzW2ldID09IE5VTEwpIHsKLQkJCXJjID0gTlVMTDsKLQkJCWdvdG8gQXdheTsKLQkJfQotCQlwYXJlbnQgPSB0eXBlLT5wcm9jRGlyc1tpXTsKLQl9Ci0JdHlwZS0+cHJvY0RpciA9IHR5cGUtPnByb2NEaXJzW3R5cGUtPm5OYW1lcy0xXTsKLQlyYyA9IHR5cGU7Ci1Bd2F5OgotCWlmIChyYyA9PSBOVUxMKSB7Ci0JCWlmICh0eXBlICE9IE5VTEwpIHsKLQkJCXZpc29yX3Byb2NfRGVzdHJveVR5cGUodHlwZSk7Ci0JCQl0eXBlID0gTlVMTDsKLQkJfQotCX0KLQlyZXR1cm4gcmM7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wcm9jX0NyZWF0ZVR5cGUpOwotCi0KLQotdm9pZCB2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKE1ZUFJPQ1RZUEUgKnR5cGUpCi17Ci0JaWYgKHR5cGUgPT0gTlVMTCkKLQkJcmV0dXJuOwotCWlmICh0eXBlLT5wcm9jRGlycyAhPSBOVUxMKSB7Ci0JCWludCBpID0gdHlwZS0+bk5hbWVzLTE7Ci0KLQkJd2hpbGUgKGkgPj0gMCkgewotCQkJaWYgKHR5cGUtPnByb2NEaXJzW2ldICE9IE5VTEwpIHsKLQkJCQlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBhcmVudCA9IE5VTEw7Ci0KLQkJCQlpZiAoaSA9PSAwKQotCQkJCQlwYXJlbnQgPSB0eXBlLT5wcm9jRGlyUm9vdDsKLQkJCQllbHNlCi0JCQkJCXBhcmVudCA9IHR5cGUtPnByb2NEaXJzW2ktMV07Ci0JCQkJcmVtb3ZlX3Byb2NfZW50cnkodHlwZS0+bmFtZVtpXSwgcGFyZW50KTsKLQkJCX0KLQkJCWktLTsKLQkJfQotCQlrZnJlZSh0eXBlLT5wcm9jRGlycyk7Ci0JCXR5cGUtPnByb2NEaXJzID0gTlVMTDsKLQl9Ci0Ja2ZyZWUodHlwZSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wcm9jX0Rlc3Ryb3lUeXBlKTsKLQotCi0KLU1ZUFJPQ09CSkVDVCAqdmlzb3JfcHJvY19DcmVhdGVPYmplY3QoTVlQUk9DVFlQRSAqdHlwZSwKLQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCB2b2lkICpjb250ZXh0KQotewotCU1ZUFJPQ09CSkVDVCAqb2JqID0gTlVMTCwgKnJjID0gTlVMTDsKLQlpbnQgaSA9IDA7Ci0KLQlpZiAodHlwZSA9PSBOVUxMKSB7Ci0JCUVSUkRSVigidHlwZSBjYW5ub3QgYmUgTlVMTFxuIik7Ci0JCWdvdG8gQXdheTsKLQl9Ci0Jb2JqID0ga3phbGxvYyhzaXplb2YoTVlQUk9DT0JKRUNUKSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmIChvYmogPT0gTlVMTCkgewotCQlFUlJEUlYoIm91dCBvZiBtZW1vcnlcbiIpOwotCQlnb3RvIEF3YXk7Ci0JfQotCW9iai0+dHlwZSA9IHR5cGU7Ci0Jb2JqLT5jb250ZXh0ID0gY29udGV4dDsKLQlpZiAobmFtZSA9PSBOVUxMKSB7Ci0JCW9iai0+bmFtZSA9IE5VTEw7Ci0JCW9iai0+cHJvY0RpciA9IHR5cGUtPnByb2NEaXI7Ci0JfSBlbHNlIHsKLQkJb2JqLT5uYW1lc2l6ZSA9IHN0cmxlbihuYW1lKSsxOwotCQlvYmotPm5hbWUgPSBrbWFsbG9jKG9iai0+bmFtZXNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1JFVFJZKTsKLQkJaWYgKG9iai0+bmFtZSA9PSBOVUxMKSB7Ci0JCQlvYmotPm5hbWVzaXplID0gMDsKLQkJCUVSUkRSVigib3V0IG9mIG1lbW9yeVxuIik7Ci0JCQlnb3RvIEF3YXk7Ci0JCX0KLQkJc3RyY3B5KG9iai0+bmFtZSwgbmFtZSk7Ci0JCW9iai0+cHJvY0RpciA9IGNyZWF0ZVByb2NEaXIob2JqLT5uYW1lLCB0eXBlLT5wcm9jRGlyKTsKLQkJaWYgKG9iai0+cHJvY0RpciA9PSBOVUxMKQotCQkJZ290byBBd2F5OwotCX0KLQlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzID0KLQkJa3phbGxvYygodHlwZS0+blByb3BlcnRpZXMgKyAxKSAqCi0JCQlzaXplb2Yoc3RydWN0IHByb2NfZGlyX2VudHJ5X2NvbnRleHQpLAotCQkJR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzID09IE5VTEwpIHsKLQkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKLQkJZ290byBBd2F5OwotCX0KLQlvYmotPnByb2NEaXJQcm9wZXJ0aWVzID0ga3phbGxvYygodHlwZS0+blByb3BlcnRpZXMgKyAxKSAqCi0JCQkJCSBzaXplb2Yoc3RydWN0IHByb2NfZGlyX2VudHJ5ICopLAotCQkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOwotCWlmIChvYmotPnByb2NEaXJQcm9wZXJ0aWVzID09IE5VTEwpIHsKLQkJRVJSRFJWKCJvdXQgb2YgbWVtb3J5XG4iKTsKLQkJZ290byBBd2F5OwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgdHlwZS0+blByb3BlcnRpZXM7IGkrKykgewotCQlvYmotPnByb2NEaXJQcm9wZXJ0eUNvbnRleHRzW2ldLnByb2NPYmplY3QgPSBvYmo7Ci0JCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHNbaV0ucHJvcGVydHlJbmRleCA9IGk7Ci0JCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHNbaV0uc2hvd19wcm9wZXJ0eSA9Ci0JCQl0eXBlLT5zaG93X3Byb3BlcnR5OwotCQlpZiAodHlwZS0+cHJvcGVydHlOYW1lc1tpXVswXSAhPSAnXDAnKSB7Ci0JCQkvKiBvbmx5IGNyZWF0ZSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBuYW1lcyAqLwotCQkJb2JqLT5wcm9jRGlyUHJvcGVydGllc1tpXSA9Ci0JCQkJY3JlYXRlUHJvY0ZpbGUodHlwZS0+cHJvcGVydHlOYW1lc1tpXSwKLQkJCQkJb2JqLT5wcm9jRGlyLCAmcHJvY19mb3BzLAotCQkJCQkmb2JqLT5wcm9jRGlyUHJvcGVydHlDb250ZXh0c1tpXSk7Ci0JCQlpZiAob2JqLT5wcm9jRGlyUHJvcGVydGllc1tpXSA9PSBOVUxMKSB7Ci0JCQkJcmMgPSBOVUxMOwotCQkJCWdvdG8gQXdheTsKLQkJCX0KLQkJfQotCX0KLQlyYyA9IG9iajsKLUF3YXk6Ci0JaWYgKHJjID09IE5VTEwpIHsKLQkJaWYgKG9iaiAhPSBOVUxMKSB7Ci0JCQl2aXNvcl9wcm9jX0Rlc3Ryb3lPYmplY3Qob2JqKTsKLQkJCW9iaiA9IE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIHJjOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodmlzb3JfcHJvY19DcmVhdGVPYmplY3QpOwotCi0KLQotdm9pZCB2aXNvcl9wcm9jX0Rlc3Ryb3lPYmplY3QoTVlQUk9DT0JKRUNUICpvYmopCi17Ci0JTVlQUk9DVFlQRSAqdHlwZSA9IE5VTEw7Ci0KLQlpZiAob2JqID09IE5VTEwpCi0JCXJldHVybjsKLQl0eXBlID0gb2JqLT50eXBlOwotCWlmICh0eXBlID09IE5VTEwpCi0JCXJldHVybjsKLQlpZiAob2JqLT5wcm9jRGlyUHJvcGVydGllcyAhPSBOVUxMKSB7Ci0JCWludCBpID0gMDsKLQotCQlmb3IgKGkgPSAwOyBpIDwgdHlwZS0+blByb3BlcnRpZXM7IGkrKykgewotCQkJaWYgKG9iai0+cHJvY0RpclByb3BlcnRpZXNbaV0gIT0gTlVMTCkgewotCQkJCXJlbW92ZV9wcm9jX2VudHJ5KHR5cGUtPnByb3BlcnR5TmFtZXNbaV0sCi0JCQkJCQkgIG9iai0+cHJvY0Rpcik7Ci0JCQkJb2JqLT5wcm9jRGlyUHJvcGVydGllc1tpXSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQkJa2ZyZWUob2JqLT5wcm9jRGlyUHJvcGVydGllcyk7Ci0JCW9iai0+cHJvY0RpclByb3BlcnRpZXMgPSBOVUxMOwotCX0KLQotCWtmcmVlKG9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHMpOwotCW9iai0+cHJvY0RpclByb3BlcnR5Q29udGV4dHMgPSBOVUxMOwotCi0JaWYgKG9iai0+cHJvY0RpciAhPSBOVUxMKSB7Ci0JCWlmIChvYmotPm5hbWUgIT0gTlVMTCkKLQkJCXJlbW92ZV9wcm9jX2VudHJ5KG9iai0+bmFtZSwgdHlwZS0+cHJvY0Rpcik7Ci0JCW9iai0+cHJvY0RpciA9IE5VTEw7Ci0JfQotCi0Ja2ZyZWUob2JqLT5uYW1lKTsKLQlvYmotPm5hbWUgPSBOVUxMOwotCWtmcmVlKG9iaik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh2aXNvcl9wcm9jX0Rlc3Ryb3lPYmplY3QpOwotCi0KLQotc3RhdGljIGludCBzZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeV9jb250ZXh0ICpjdHggPSBzZXEtPnByaXZhdGU7Ci0KLQlpZiAoY3R4ID09IE5VTEwpIHsKLQkJRVJSRFJWKCJJIGRvbid0IGhhdmUgYSBmcmVha2luJyBjbHVlLi4uIik7Ci0JCXJldHVybiAwOwotCX0KLQkoKmN0eC0+c2hvd19wcm9wZXJ0eSkoc2VxLCBjdHgtPnByb2NPYmplY3QtPmNvbnRleHQsCi0JCQkgICAgICBjdHgtPnByb3BlcnR5SW5kZXgpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvdmlzb3JrbW9kdXRpbHMuYyBiL2RyaXZlcnMvc3RhZ2luZy91bmlzeXMvdmlzb3J1dGlsL3Zpc29ya21vZHV0aWxzLmMKaW5kZXggNTU2ZTI2NC4uNjJmMGY3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VuaXN5cy92aXNvcnV0aWwvdmlzb3JrbW9kdXRpbHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdW5pc3lzL3Zpc29ydXRpbC92aXNvcmttb2R1dGlscy5jCkBAIC0xNSw3ICsxNSw2IEBACiAgKiBkZXRhaWxzLgogICovCiAKLSNpbmNsdWRlICJ1bmlrbG9nLmgiCiAjaW5jbHVkZSAidGltc2ttb2QuaCIKIAogI2RlZmluZSBNWURSVk5BTUUgInRpbXNrbW9kdXRpbHMiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3BpbzJfY29yZS5jIGIvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV9waW8yX2NvcmUuYwppbmRleCA4NGM1YTA3Li5lYWJiY2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3BpbzJfY29yZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfcGlvMl9jb3JlLmMKQEAgLTEzLDcgKzEzLDYgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV9waW8yX2dwaW8uYyBiL2RyaXZlcnMvc3RhZ2luZy92bWUvZGV2aWNlcy92bWVfcGlvMl9ncGlvLmMKaW5kZXggZGEzNGQ1NS4uNzc5MDFiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV9waW8yX2dwaW8uYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3BpbzJfZ3Bpby5jCkBAIC0xMSw3ICsxMSw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3ZtZS9kZXZpY2VzL3ZtZV91c2VyLmMgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYwppbmRleCA4YjFmNTMzLi4xOWJhNzQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdm1lL2RldmljZXMvdm1lX3VzZXIuYwpAQCAtMTcsNiArMTcsNyBAQAogCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CiAKKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KQEAgLTQxLDcgKzQyLDYgQEAKIAogI2luY2x1ZGUgInZtZV91c2VyLmgiCiAKLXN0YXRpYyBERUZJTkVfTVVURVgodm1lX3VzZXJfbXV0ZXgpOwogc3RhdGljIGNvbnN0IGNoYXIgZHJpdmVyX25hbWVbXSA9ICJ2bWVfdXNlciI7CiAKIHN0YXRpYyBpbnQgYnVzW1ZNRV9VU0VSX0JVU19NQVhdOwpAQCAtMTAwLDYgKzEwMCw3IEBACiAJc3RydWN0IGRldmljZSAqZGV2aWNlOwkvKiBTeXNmcyBkZXZpY2UgKi8KIAlzdHJ1Y3Qgdm1lX3Jlc291cmNlICpyZXNvdXJjZTsJLyogVk1FIHJlc291cmNlICovCiAJaW50IHVzZXJzOwkJLyogTnVtYmVyIG9mIGN1cnJlbnQgdXNlcnMgKi8KKwlpbnQgbW1hcF9jb3VudDsJCS8qIE51bWJlciBvZiBjdXJyZW50IG1tYXAncyAqLwogfTsKIHN0YXRpYyBzdHJ1Y3QgaW1hZ2VfZGVzYyBpbWFnZVtWTUVfREVWU107CiAKQEAgLTEzNSw2ICsxMzYsMTAgQEAKIAlsb2ZmX3QgKik7CiBzdGF0aWMgbG9mZl90IHZtZV91c2VyX2xsc2VlayhzdHJ1Y3QgZmlsZSAqLCBsb2ZmX3QsIGludCk7CiBzdGF0aWMgbG9uZyB2bWVfdXNlcl91bmxvY2tlZF9pb2N0bChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIGludCB2bWVfdXNlcl9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKK3N0YXRpYyB2b2lkIHZtZV91c2VyX3ZtX29wZW4oc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOworc3RhdGljIHZvaWQgdm1lX3VzZXJfdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogCiBzdGF0aWMgaW50IHZtZV91c2VyX21hdGNoKHN0cnVjdCB2bWVfZGV2ICopOwogc3RhdGljIGludCB2bWVfdXNlcl9wcm9iZShzdHJ1Y3Qgdm1lX2RldiAqKTsKQEAgLTE0OCw2ICsxNTMsMTcgQEAKIAkubGxzZWVrID0gdm1lX3VzZXJfbGxzZWVrLAogCS51bmxvY2tlZF9pb2N0bCA9IHZtZV91c2VyX3VubG9ja2VkX2lvY3RsLAogCS5jb21wYXRfaW9jdGwgPSB2bWVfdXNlcl91bmxvY2tlZF9pb2N0bCwKKwkubW1hcCA9IHZtZV91c2VyX21tYXAsCit9OworCitzdHJ1Y3Qgdm1lX3VzZXJfdm1hX3ByaXYgeworCXVuc2lnbmVkIGludCBtaW5vcjsKKwlhdG9taWNfdCByZWZjbnQ7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHZtZV91c2VyX3ZtX29wcyA9IHsKKwkub3BlbiA9IHZtZV91c2VyX3ZtX29wZW4sCisJLmNsb3NlID0gdm1lX3VzZXJfdm1fY2xvc2UsCiB9OwogCiAKQEAgLTQ4OSw2ICs1MDUsMTEgQEAKIAogCQljYXNlIFZNRV9TRVRfTUFTVEVSOgogCisJCQlpZiAoaW1hZ2VbbWlub3JdLm1tYXBfY291bnQgIT0gMCkgeworCQkJCXByX3dhcm4oIkNhbid0IGFkanVzdCBtYXBwZWQgd2luZG93XG4iKTsKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJfQorCiAJCQljb3BpZWQgPSBjb3B5X2Zyb21fdXNlcigmbWFzdGVyLCBhcmdwLCBzaXplb2YobWFzdGVyKSk7CiAJCQlpZiAoY29waWVkICE9IDApIHsKIAkJCQlwcl93YXJuKCJQYXJ0aWFsIGNvcHkgZnJvbSB1c2Vyc3BhY2VcbiIpOwpAQCAtNTU1LDE0ICs1NzYsNzkgQEAKIHZtZV91c2VyX3VubG9ja2VkX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKIHsKIAlpbnQgcmV0OworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpOworCXVuc2lnbmVkIGludCBtaW5vciA9IE1JTk9SKGlub2RlLT5pX3JkZXYpOwogCi0JbXV0ZXhfbG9jaygmdm1lX3VzZXJfbXV0ZXgpOwotCXJldCA9IHZtZV91c2VyX2lvY3RsKGZpbGVfaW5vZGUoZmlsZSksIGZpbGUsIGNtZCwgYXJnKTsKLQltdXRleF91bmxvY2soJnZtZV91c2VyX211dGV4KTsKKwltdXRleF9sb2NrKCZpbWFnZVttaW5vcl0ubXV0ZXgpOworCXJldCA9IHZtZV91c2VyX2lvY3RsKGlub2RlLCBmaWxlLCBjbWQsIGFyZyk7CisJbXV0ZXhfdW5sb2NrKCZpbWFnZVttaW5vcl0ubXV0ZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgdm1lX3VzZXJfdm1fb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgdm1lX3VzZXJfdm1hX3ByaXYgKnZtYV9wcml2ID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisKKwlhdG9taWNfaW5jKCZ2bWFfcHJpdi0+cmVmY250KTsKK30KKworc3RhdGljIHZvaWQgdm1lX3VzZXJfdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHZtZV91c2VyX3ZtYV9wcml2ICp2bWFfcHJpdiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBtaW5vciA9IHZtYV9wcml2LT5taW5vcjsKKworCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmdm1hX3ByaXYtPnJlZmNudCkpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmltYWdlW21pbm9yXS5tdXRleCk7CisJaW1hZ2VbbWlub3JdLm1tYXBfY291bnQtLTsKKwltdXRleF91bmxvY2soJmltYWdlW21pbm9yXS5tdXRleCk7CisKKwlrZnJlZSh2bWFfcHJpdik7Cit9CisKK3N0YXRpYyBpbnQgdm1lX3VzZXJfbWFzdGVyX21tYXAodW5zaWduZWQgaW50IG1pbm9yLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpbnQgZXJyOworCXN0cnVjdCB2bWVfdXNlcl92bWFfcHJpdiAqdm1hX3ByaXY7CisKKwltdXRleF9sb2NrKCZpbWFnZVttaW5vcl0ubXV0ZXgpOworCisJZXJyID0gdm1lX21hc3Rlcl9tbWFwKGltYWdlW21pbm9yXS5yZXNvdXJjZSwgdm1hKTsKKwlpZiAoZXJyKSB7CisJCW11dGV4X3VubG9jaygmaW1hZ2VbbWlub3JdLm11dGV4KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl2bWFfcHJpdiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2bWVfdXNlcl92bWFfcHJpdiksIEdGUF9LRVJORUwpOworCWlmICh2bWFfcHJpdiA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmaW1hZ2VbbWlub3JdLm11dGV4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJdm1hX3ByaXYtPm1pbm9yID0gbWlub3I7CisJYXRvbWljX3NldCgmdm1hX3ByaXYtPnJlZmNudCwgMSk7CisJdm1hLT52bV9vcHMgPSAmdm1lX3VzZXJfdm1fb3BzOworCXZtYS0+dm1fcHJpdmF0ZV9kYXRhID0gdm1hX3ByaXY7CisKKwlpbWFnZVttaW5vcl0ubW1hcF9jb3VudCsrOworCisJbXV0ZXhfdW5sb2NrKCZpbWFnZVttaW5vcl0ubXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdm1lX3VzZXJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gTUlOT1IoZmlsZV9pbm9kZShmaWxlKS0+aV9yZGV2KTsKKworCWlmICh0eXBlW21pbm9yXSA9PSBNQVNURVJfTUlOT1IpCisJCXJldHVybiB2bWVfdXNlcl9tYXN0ZXJfbW1hcChtaW5vciwgdm1hKTsKKworCXJldHVybiAtRU5PREVWOworfQorCiAKIC8qCiAgKiBVbmFsbG9jYXRlIGEgcHJldmlvdXNseSBhbGxvY2F0ZWQgYnVmZmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jhc2ViYW5kLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2Jhc2ViYW5kLmMKaW5kZXggNTY1YmExOC4uYjBlYTM4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9iYXNlYmFuZC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvYmFzZWJhbmQuYwpAQCAtMjAyMSwxNCArMjAyMSwyMCBAQAogCWlmIChieVJGVHlwZSA9PSBSRl9SRk1EMjk1OSkgewogCQlpZiAoYnlMb2NhbElEIDw9IFJFVl9JRF9WVDMyNTNfQTEpIHsKIAkJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M19JTklUX0ZPUl9SRk1EOyBpaSsrKQotCQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0luaXRUYWJfUkZNRFtpaV1bMF0sIGJ5VlQzMjUzSW5pdFRhYl9SRk1EW2lpXVsxXSk7CisJCQkJYlJlc3VsdCAmPSBCQmJXcml0ZUVtYmVkZGVkKHByaXYsCisJCQkJCWJ5VlQzMjUzSW5pdFRhYl9SRk1EW2lpXVswXSwKKwkJCQkJYnlWVDMyNTNJbml0VGFiX1JGTURbaWldWzFdKTsKIAogCQl9IGVsc2UgewogCQkJZm9yIChpaSA9IDA7IGlpIDwgQ0JfVlQzMjUzQjBfSU5JVF9GT1JfUkZNRDsgaWkrKykKLQkJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwgYnlWVDMyNTNCMF9SRk1EW2lpXVswXSwgYnlWVDMyNTNCMF9SRk1EW2lpXVsxXSk7CisJCQkJYlJlc3VsdCAmPSBCQmJXcml0ZUVtYmVkZGVkKHByaXYsCisJCQkJCWJ5VlQzMjUzQjBfUkZNRFtpaV1bMF0sCisJCQkJCWJ5VlQzMjUzQjBfUkZNRFtpaV1bMV0pOwogCiAJCQlmb3IgKGlpID0gMDsgaWkgPCBDQl9WVDMyNTNCMF9BR0NfRk9SX1JGTUQyOTU5OyBpaSsrKQotCQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX0FHQzRfUkZNRDI5NTlbaWldWzBdLCBieVZUMzI1M0IwX0FHQzRfUkZNRDI5NTlbaWldWzFdKTsKKwkJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQkJYnlWVDMyNTNCMF9BR0M0X1JGTUQyOTU5W2lpXVswXSwKKwkJCQkJYnlWVDMyNTNCMF9BR0M0X1JGTUQyOTU5W2lpXVsxXSk7CiAKIAkJCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfSVRSVE1TRVQsIDB4MjMpOwogCQkJTUFDdlJlZ0JpdHNPbihkd0lvQmFzZSwgTUFDX1JFR19QQVBFREVMQVksIEJJVCgwKSk7CkBAIC0yMDQzLDEwICsyMDQ5LDEzIEBACiAJCXByaXYtPmxkQm1UaHJlc2hvbGRbM10gPSAwOwogCX0gZWxzZSBpZiAoKGJ5UkZUeXBlID09IFJGX0FJUk9IQSkgfHwgKGJ5UkZUeXBlID09IFJGX0FMMjIzMFMpKSB7CiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0lOSVRfRk9SX0FJUk9IQTIyMzA7IGlpKyspCi0JCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwgYnlWVDMyNTNCMF9BSVJPSEEyMjMwW2lpXVswXSwgYnlWVDMyNTNCMF9BSVJPSEEyMjMwW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX0FJUk9IQTIyMzBbaWldWzBdLAorCQkJCWJ5VlQzMjUzQjBfQUlST0hBMjIzMFtpaV1bMV0pOwogCiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0FHQzsgaWkrKykKLQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CiAKIAkJcHJpdi0+YWJ5QkJWR0FbMF0gPSAweDFDOwogCQlwcml2LT5hYnlCQlZHQVsxXSA9IDB4MTA7CkBAIC0yMDU4LDEwICsyMDY3LDE0IEBACiAJCXByaXYtPmxkQm1UaHJlc2hvbGRbM10gPSAwOwogCX0gZWxzZSBpZiAoYnlSRlR5cGUgPT0gUkZfVVcyNDUxKSB7CiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0lOSVRfRk9SX1VXMjQ1MTsgaWkrKykKLQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX1VXMjQ1MVtpaV1bMF0sIGJ5VlQzMjUzQjBfVVcyNDUxW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX1VXMjQ1MVtpaV1bMF0sCisJCQkJYnlWVDMyNTNCMF9VVzI0NTFbaWldWzFdKTsKIAogCQlmb3IgKGlpID0gMDsgaWkgPCBDQl9WVDMyNTNCMF9BR0M7IGlpKyspCi0JCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwgYnlWVDMyNTNCMF9BR0NbaWldWzBdLCBieVZUMzI1M0IwX0FHQ1tpaV1bMV0pOworCQkJYlJlc3VsdCAmPSBCQmJXcml0ZUVtYmVkZGVkKHByaXYsCisJCQkJYnlWVDMyNTNCMF9BR0NbaWldWzBdLAorCQkJCWJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CiAKIAkJVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19JVFJUTVNFVCwgMHgyMyk7CiAJCU1BQ3ZSZWdCaXRzT24oZHdJb0Jhc2UsIE1BQ19SRUdfUEFQRURFTEFZLCBCSVQoMCkpOwpAQCAtMjA3Niw3ICsyMDg5LDkgQEAKIAkJcHJpdi0+bGRCbVRocmVzaG9sZFszXSA9IDA7CiAJfSBlbHNlIGlmIChieVJGVHlwZSA9PSBSRl9VVzI0NTIpIHsKIAkJZm9yIChpaSA9IDA7IGlpIDwgQ0JfVlQzMjUzQjBfSU5JVF9GT1JfVVcyNDUxOyBpaSsrKQotCQkJYlJlc3VsdCAmPSBCQmJXcml0ZUVtYmVkZGVkKHByaXYsIGJ5VlQzMjUzQjBfVVcyNDUxW2lpXVswXSwgYnlWVDMyNTNCMF9VVzI0NTFbaWldWzFdKTsKKwkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LAorCQkJCWJ5VlQzMjUzQjBfVVcyNDUxW2lpXVswXSwKKwkJCQlieVZUMzI1M0IwX1VXMjQ1MVtpaV1bMV0pOwogCiAJCS8qIEluaXQgQU5UIEIgc2VsZWN0LFRYIENvbmZpZyBDUjA5ID0gMHg2MS0+MHg0NSwgMHg0NS0+MHg0MShWQzEvVkMyIGRlZmluZSwgbWFrZSB0aGUgQU5UX0EsIEFOVF9CIGludmVydGVkKSAqLwogCQkvKmJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChkd0lvQmFzZSwweDA5LDB4NDEpOyovCkBAIC0yMDk3LDcgKzIxMTIsOCBAQAogCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwgMHhiMCwgMHg1OCk7CiAKIAkJZm9yIChpaSA9IDA7IGlpIDwgQ0JfVlQzMjUzQjBfQUdDOyBpaSsrKQotCQkJYlJlc3VsdCAmPSBCQmJXcml0ZUVtYmVkZGVkKHByaXYsIGJ5VlQzMjUzQjBfQUdDW2lpXVswXSwgYnlWVDMyNTNCMF9BR0NbaWldWzFdKTsKKwkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LAorCQkJCWJ5VlQzMjUzQjBfQUdDW2lpXVswXSwgYnlWVDMyNTNCMF9BR0NbaWldWzFdKTsKIAogCQlwcml2LT5hYnlCQlZHQVswXSA9IDB4MTQ7CiAJCXByaXYtPmFieUJCVkdBWzFdID0gMHgwQTsKQEAgLTIxMTEsMTAgKzIxMjcsMTMgQEAKIAogCX0gZWxzZSBpZiAoYnlSRlR5cGUgPT0gUkZfVlQzMjI2KSB7CiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0lOSVRfRk9SX0FJUk9IQTIyMzA7IGlpKyspCi0JCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwgYnlWVDMyNTNCMF9BSVJPSEEyMjMwW2lpXVswXSwgYnlWVDMyNTNCMF9BSVJPSEEyMjMwW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX0FJUk9IQTIyMzBbaWldWzBdLAorCQkJCWJ5VlQzMjUzQjBfQUlST0hBMjIzMFtpaV1bMV0pOwogCiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0FHQzsgaWkrKykKLQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CiAKIAkJcHJpdi0+YWJ5QkJWR0FbMF0gPSAweDFDOwogCQlwcml2LT5hYnlCQlZHQVsxXSA9IDB4MTA7CkBAIC0yMTI5LDcgKzIxNDgsOSBAQAogCQkvKiB7eyBSb2JlcnRZdTogMjAwNTAxMDQgKi8KIAl9IGVsc2UgaWYgKGJ5UkZUeXBlID09IFJGX0FJUk9IQTcyMzApIHsKIAkJZm9yIChpaSA9IDA7IGlpIDwgQ0JfVlQzMjUzQjBfSU5JVF9GT1JfQUlST0hBMjIzMDsgaWkrKykKLQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX0FJUk9IQTIyMzBbaWldWzBdLCBieVZUMzI1M0IwX0FJUk9IQTIyMzBbaWldWzFdKTsKKwkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LAorCQkJCWJ5VlQzMjUzQjBfQUlST0hBMjIzMFtpaV1bMF0sCisJCQkJYnlWVDMyNTNCMF9BSVJPSEEyMjMwW2lpXVsxXSk7CiAKIAogCQkvKiB7eyBSb2JlcnRZdToyMDA1MDIyMywgcmVxdWVzdCBieSBKZXJyeUNodW5nICovCkBAIC0yMTQyLDcgKzIxNjMsOCBAQAogCQkvKiB9fSAqLwogCiAJCWZvciAoaWkgPSAwOyBpaSA8IENCX1ZUMzI1M0IwX0FHQzsgaWkrKykKLQkJCWJSZXN1bHQgJj0gQkJiV3JpdGVFbWJlZGRlZChwcml2LCBieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CisJCQliUmVzdWx0ICY9IEJCYldyaXRlRW1iZWRkZWQocHJpdiwKKwkJCQlieVZUMzI1M0IwX0FHQ1tpaV1bMF0sIGJ5VlQzMjUzQjBfQUdDW2lpXVsxXSk7CiAKIAkJcHJpdi0+YWJ5QkJWR0FbMF0gPSAweDFDOwogCQlwcml2LT5hYnlCQlZHQVsxXSA9IDB4MTA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2NoYW5uZWwuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5jCmluZGV4IDNjMTc3MjUuLjdhNzE3ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvY2hhbm5lbC5jCkBAIC0xOTMsNyArMTkzLDggQEAKIAkvKiBjbGVhciBOQVYgKi8KIAlNQUN2UmVnQml0c09uKHBEZXZpY2UtPlBvcnRPZmZzZXQsIE1BQ19SRUdfTUFDQ1IsIE1BQ0NSX0NMUk5BVik7CiAKLQkvKiBUWF9QRSB3aWxsIHJlc2VydmUgMyB1cyBmb3IgTUFYMjgyOSBBIG1vZGUgb25seSwgaXQgaXMgZm9yIGJldHRlciBUWCB0aHJvdWdocHV0ICovCisJLyogVFhfUEUgd2lsbCByZXNlcnZlIDMgdXMgZm9yIE1BWDI4MjkgQSBtb2RlIG9ubHksCisJICAgaXQgaXMgZm9yIGJldHRlciBUWCB0aHJvdWdocHV0ICovCiAKIAlpZiAocERldmljZS0+YnlSRlR5cGUgPT0gUkZfQUlST0hBNzIzMCkKIAkJUkZiQUw3MjMwU2VsZWN0Q2hhbm5lbFBvc3RQcm9jZXNzKHBEZXZpY2UsIHBEZXZpY2UtPmJ5Q3VycmVudENoLApAQCAtMjE3LDkgKzIxOCwxMSBAQAogCQkvKiBzZXQgSFcgZGVmYXVsdCBwb3dlciByZWdpc3RlciAqLwogCQlNQUN2U2VsZWN0UGFnZTEocERldmljZS0+UG9ydE9mZnNldCk7CiAJCVJGYlNldFBvd2VyKHBEZXZpY2UsIFJBVEVfMU0sIHBEZXZpY2UtPmJ5Q3VycmVudENoKTsKLQkJVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1BXUkNDSywgcERldmljZS0+YnlDdXJQd3IpOworCQlWTlN2T3V0UG9ydEIocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfUFdSQ0NLLAorCQkJICAgICBwRGV2aWNlLT5ieUN1clB3cik7CiAJCVJGYlNldFBvd2VyKHBEZXZpY2UsIFJBVEVfNk0sIHBEZXZpY2UtPmJ5Q3VycmVudENoKTsKLQkJVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1BXUk9GRE0sIHBEZXZpY2UtPmJ5Q3VyUHdyKTsKKwkJVk5Tdk91dFBvcnRCKHBEZXZpY2UtPlBvcnRPZmZzZXQgKyBNQUNfUkVHX1BXUk9GRE0sCisJCQkgICAgIHBEZXZpY2UtPmJ5Q3VyUHdyKTsKIAkJTUFDdlNlbGVjdFBhZ2UwKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBEZXZpY2UtPmxvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZGV2aWNlX21haW4uYwppbmRleCA0MzI0MjgyLi40YmI0ZjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RldmljZV9tYWluLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kZXZpY2VfbWFpbi5jCkBAIC02NCw5ICs2NCw5IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgU3RhdGljIERlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLy8KLS8vIERlZmluZSBtb2R1bGUgb3B0aW9ucwotLy8KKy8qCisgKiBEZWZpbmUgbW9kdWxlIG9wdGlvbnMKKyAqLwogTU9EVUxFX0FVVEhPUigiVklBIE5ldHdvcmtpbmcgVGVjaG5vbG9naWVzLCBJbmMuLCA8bHluZG9uY2hlbkB2bnRlay5jb20udHc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlZJQSBOZXR3b3JraW5nIFNvbG9tb24tQS9CL0cgV2lyZWxlc3MgTEFOIEFkYXB0ZXIgRHJpdmVyIik7CkBAIC0xMjYsOSArMTI2LDkgQEAKIAogREVWSUNFX1BBUkFNKEJhc2ViYW5kVHlwZSwgImJhc2ViYW5kIHR5cGUiKTsKIAotLy8KLS8vIFN0YXRpYyB2YXJzIGRlZmluaXRpb25zCi0vLworLyoKKyAqIFN0YXRpYyB2YXJzIGRlZmluaXRpb25zCisgKi8KIHN0YXRpYyBDSElQX0lORk8gY2hpcF9pbmZvX3RhYmxlW10gPSB7CiAJeyBWVDMyNTMsICAgICAgICJWSUEgTmV0d29ya2luZyBTb2xvbW9uLUEvQi9HIFdpcmVsZXNzIExBTiBBZGFwdGVyICIsCiAJICAyNTYsIDEsICAgICBERVZJQ0VfRkxBR1NfSVBfQUxJR058REVWSUNFX0ZMQUdTX1RYX0FMSUdOIH0sCkBAIC0yMzEsOSArMjMxLDkgQEAKIAlwcl9kZWJ1ZygiIGJ5QkJUeXBlPSAlZFxuIiwgKGludClwRGV2aWNlLT5ieUJCVHlwZSk7CiB9CiAKLS8vCi0vLyBJbml0aWFsaXNhdGlvbiBvZiBNQUMgJiBCQlAgcmVnaXN0ZXJzCi0vLworLyoKKyAqIEluaXRpYWxpc2F0aW9uIG9mIE1BQyAmIEJCUCByZWdpc3RlcnMKKyAqLwogCiBzdGF0aWMgdm9pZCBkZXZpY2VfaW5pdF9yZWdpc3RlcnMoc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlKQogewpAQCAtMzMwLDE2ICszMzAsNiBAQAogCS8qIHpvbmV0eXBlIGluaXRpYWwgKi8KIAlwRGV2aWNlLT5ieU9yaWdpbmFsWm9uZXR5cGUgPSBwRGV2aWNlLT5hYnlFRVBST01bRUVQX09GU19aT05FVFlQRV07CiAKLQkvKiBHZXQgUkZUeXBlICovCi0JcERldmljZS0+YnlSRlR5cGUgPSBTUk9NYnlSZWFkRW1iZWRkZWQocERldmljZS0+UG9ydE9mZnNldCwgRUVQX09GU19SRlRZUEUpOwotCi0JLyogZm9yY2UgY2hhbmdlIFJldklEIGZvciBWVDMyNTMgZW11ICovCi0JaWYgKChwRGV2aWNlLT5ieVJGVHlwZSAmIFJGX0VNVSkgIT0gMCkKLQkJCXBEZXZpY2UtPmJ5UmV2SWQgPSAweDgwOwotCi0JcERldmljZS0+YnlSRlR5cGUgJj0gUkZfTUFTSzsKLQlwcl9kZWJ1ZygicERldmljZS0+YnlSRlR5cGUgPSAleFxuIiwgcERldmljZS0+YnlSRlR5cGUpOwotCiAJaWYgKCFwRGV2aWNlLT5iWm9uZVJlZ0V4aXN0KQogCQlwRGV2aWNlLT5ieVpvbmVUeXBlID0gcERldmljZS0+YWJ5RUVQUk9NW0VFUF9PRlNfWk9ORVRZUEVdOwogCkBAIC01NDAsMTIgKzUzMCwxMiBAQAogCXZvaWQgKnZpcl9wb29sOwogCiAJLyphbGxvY2F0ZSBhbGwgUkQvVEQgcmluZ3MgYSBzaW5nbGUgcG9vbCovCi0JdmlyX3Bvb2wgPSBwY2lfemFsbG9jX2NvbnNpc3RlbnQocERldmljZS0+cGNpZCwKKwl2aXJfcG9vbCA9IGRtYV96YWxsb2NfY29oZXJlbnQoJnBEZXZpY2UtPnBjaWQtPmRldiwKIAkJCQkJIHBEZXZpY2UtPnNPcHRzLm5SeERlc2NzMCAqIHNpemVvZihTUnhEZXNjKSArCiAJCQkJCSBwRGV2aWNlLT5zT3B0cy5uUnhEZXNjczEgKiBzaXplb2YoU1J4RGVzYykgKwogCQkJCQkgcERldmljZS0+c09wdHMublR4RGVzY3NbMF0gKiBzaXplb2YoU1R4RGVzYykgKwogCQkJCQkgcERldmljZS0+c09wdHMublR4RGVzY3NbMV0gKiBzaXplb2YoU1R4RGVzYyksCi0JCQkJCSAmcERldmljZS0+cG9vbF9kbWEpOworCQkJCQkgJnBEZXZpY2UtPnBvb2xfZG1hLCBHRlBfQVRPTUlDKTsKIAlpZiAodmlyX3Bvb2wgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwRGV2aWNlLT5wY2lkLT5kZXYsICJhbGxvY2F0ZSBkZXNjIGRtYSBtZW1vcnkgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtNTU5LDE2ICs1NDksMTcgQEAKIAlwRGV2aWNlLT5yZDFfcG9vbF9kbWEgPSBwRGV2aWNlLT5yZDBfcG9vbF9kbWEgKwogCQlwRGV2aWNlLT5zT3B0cy5uUnhEZXNjczAgKiBzaXplb2YoU1J4RGVzYyk7CiAKLQlwRGV2aWNlLT50eDBfYnVmcyA9IHBjaV96YWxsb2NfY29uc2lzdGVudChwRGV2aWNlLT5wY2lkLAorCXBEZXZpY2UtPnR4MF9idWZzID0gZG1hX3phbGxvY19jb2hlcmVudCgmcERldmljZS0+cGNpZC0+ZGV2LAogCQkJCQkJICBwRGV2aWNlLT5zT3B0cy5uVHhEZXNjc1swXSAqIFBLVF9CVUZfU1ogKwogCQkJCQkJICBwRGV2aWNlLT5zT3B0cy5uVHhEZXNjc1sxXSAqIFBLVF9CVUZfU1ogKwogCQkJCQkJICBDQl9CRUFDT05fQlVGX1NJWkUgKwogCQkJCQkJICBDQl9NQVhfQlVGX1NJWkUsCi0JCQkJCQkgICZwRGV2aWNlLT50eF9idWZzX2RtYTApOworCQkJCQkJICAmcERldmljZS0+dHhfYnVmc19kbWEwLAorCQkJCQkJICBHRlBfQVRPTUlDKTsKIAlpZiAocERldmljZS0+dHgwX2J1ZnMgPT0gTlVMTCkgewogCQlkZXZfZXJyKCZwRGV2aWNlLT5wY2lkLT5kZXYsICJhbGxvY2F0ZSBidWYgZG1hIG1lbW9yeSBmYWlsZWRcbiIpOwogCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQocERldmljZS0+cGNpZCwKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBEZXZpY2UtPnBjaWQtPmRldiwKIAkJCQkgICAgcERldmljZS0+c09wdHMublJ4RGVzY3MwICogc2l6ZW9mKFNSeERlc2MpICsKIAkJCQkgICAgcERldmljZS0+c09wdHMublJ4RGVzY3MxICogc2l6ZW9mKFNSeERlc2MpICsKIAkJCQkgICAgcERldmljZS0+c09wdHMublR4RGVzY3NbMF0gKiBzaXplb2YoU1R4RGVzYykgKwpAQCAtNTg0LDcgKzU3NSw3IEBACiAJcERldmljZS0+dGQxX3Bvb2xfZG1hID0gcERldmljZS0+dGQwX3Bvb2xfZG1hICsKIAkJcERldmljZS0+c09wdHMublR4RGVzY3NbMF0gKiBzaXplb2YoU1R4RGVzYyk7CiAKLQkvLyB2aXJfcG9vbDogcHZvaWQgdHlwZQorCS8qIHZpcl9wb29sOiBwdm9pZCB0eXBlICovCiAJcERldmljZS0+YXBURDBSaW5ncyA9IHZpcl9wb29sCiAJCSsgcERldmljZS0+c09wdHMublJ4RGVzY3MwICogc2l6ZW9mKFNSeERlc2MpCiAJCSsgcERldmljZS0+c09wdHMublJ4RGVzY3MxICogc2l6ZW9mKFNSeERlc2MpOwpAQCAtNjE0LDcgKzYwNSw3IEBACiAKIHN0YXRpYyB2b2lkIGRldmljZV9mcmVlX3JpbmdzKHN0cnVjdCB2bnRfcHJpdmF0ZSAqcERldmljZSkKIHsKLQlwY2lfZnJlZV9jb25zaXN0ZW50KHBEZXZpY2UtPnBjaWQsCisJZG1hX2ZyZWVfY29oZXJlbnQoJnBEZXZpY2UtPnBjaWQtPmRldiwKIAkJCSAgICBwRGV2aWNlLT5zT3B0cy5uUnhEZXNjczAgKiBzaXplb2YoU1J4RGVzYykgKwogCQkJICAgIHBEZXZpY2UtPnNPcHRzLm5SeERlc2NzMSAqIHNpemVvZihTUnhEZXNjKSArCiAJCQkgICAgcERldmljZS0+c09wdHMublR4RGVzY3NbMF0gKiBzaXplb2YoU1R4RGVzYykgKwpAQCAtNjI0LDcgKzYxNSw3IEBACiAJCSk7CiAKIAlpZiAocERldmljZS0+dHgwX2J1ZnMpCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQocERldmljZS0+cGNpZCwKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBEZXZpY2UtPnBjaWQtPmRldiwKIAkJCQkgICAgcERldmljZS0+c09wdHMublR4RGVzY3NbMF0gKiBQS1RfQlVGX1NaICsKIAkJCQkgICAgcERldmljZS0+c09wdHMublR4RGVzY3NbMV0gKiBQS1RfQlVGX1NaICsKIAkJCQkgICAgQ0JfQkVBQ09OX0JVRl9TSVpFICsKQEAgLTY4OSw4ICs2ODAsOCBAQAogCQlQU1J4RGVzYyAgICAgICAgcERlc2MgPSAmKHBEZXZpY2UtPmFSRDBSaW5nW2ldKTsKIAkJUERFVklDRV9SRF9JTkZPICBwUkRJbmZvID0gcERlc2MtPnBSREluZm87CiAKLQkJcGNpX3VubWFwX3NpbmdsZShwRGV2aWNlLT5wY2lkLCBwUkRJbmZvLT5za2JfZG1hLAotCQkJCSBwRGV2aWNlLT5yeF9idWZfc3osIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCWRtYV91bm1hcF9zaW5nbGUoJnBEZXZpY2UtPnBjaWQtPmRldiwgcFJESW5mby0+c2tiX2RtYSwKKwkJCQkgcERldmljZS0+cnhfYnVmX3N6LCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJCWRldl9rZnJlZV9za2IocFJESW5mby0+c2tiKTsKIApAQCAtNzA2LDggKzY5Nyw4IEBACiAJCVBTUnhEZXNjICAgICAgICBwRGVzYyA9ICYocERldmljZS0+YVJEMVJpbmdbaV0pOwogCQlQREVWSUNFX1JEX0lORk8gIHBSREluZm8gPSBwRGVzYy0+cFJESW5mbzsKIAotCQlwY2lfdW5tYXBfc2luZ2xlKHBEZXZpY2UtPnBjaWQsIHBSREluZm8tPnNrYl9kbWEsCi0JCQkJIHBEZXZpY2UtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJZG1hX3VubWFwX3NpbmdsZSgmcERldmljZS0+cGNpZC0+ZGV2LCBwUkRJbmZvLT5za2JfZG1hLAorCQkJCSBwRGV2aWNlLT5yeF9idWZfc3osIERNQV9GUk9NX0RFVklDRSk7CiAKIAkJZGV2X2tmcmVlX3NrYihwUkRJbmZvLT5za2IpOwogCkBAIC03NzUsOCArNzY2LDggQEAKIAkJUERFVklDRV9URF9JTkZPICBwVERJbmZvID0gcERlc2MtPnBUREluZm87CiAKIAkJaWYgKHBUREluZm8tPnNrYl9kbWEgJiYgKHBUREluZm8tPnNrYl9kbWEgIT0gcFRESW5mby0+YnVmX2RtYSkpCi0JCQlwY2lfdW5tYXBfc2luZ2xlKHBEZXZpY2UtPnBjaWQsIHBUREluZm8tPnNrYl9kbWEsCi0JCQkJCSBwVERJbmZvLT5za2ItPmxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJCQlkbWFfdW5tYXBfc2luZ2xlKCZwRGV2aWNlLT5wY2lkLT5kZXYsIHBUREluZm8tPnNrYl9kbWEsCisJCQkJCSBwVERJbmZvLT5za2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CiAKIAkJaWYgKHBUREluZm8tPnNrYikKIAkJCWRldl9rZnJlZV9za2IocFRESW5mby0+c2tiKTsKQEAgLTc5NCw4ICs3ODUsOCBAQAogCQlQREVWSUNFX1REX0lORk8gIHBUREluZm8gPSBwRGVzYy0+cFRESW5mbzsKIAogCQlpZiAocFRESW5mby0+c2tiX2RtYSAmJiAocFRESW5mby0+c2tiX2RtYSAhPSBwVERJbmZvLT5idWZfZG1hKSkKLQkJCXBjaV91bm1hcF9zaW5nbGUocERldmljZS0+cGNpZCwgcFRESW5mby0+c2tiX2RtYSwKLQkJCQkJIHBUREluZm8tPnNrYi0+bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJCWRtYV91bm1hcF9zaW5nbGUoJnBEZXZpY2UtPnBjaWQtPmRldiwgcFRESW5mby0+c2tiX2RtYSwKKwkJCQkJIHBUREluZm8tPnNrYi0+bGVuLCBETUFfVE9fREVWSUNFKTsKIAogCQlpZiAocFRESW5mby0+c2tiKQogCQkJZGV2X2tmcmVlX3NrYihwVERJbmZvLT5za2IpOwpAQCAtODQxLDkgKzgzMiw5IEBACiAJQVNTRVJUKHBSREluZm8tPnNrYik7CiAKIAlwUkRJbmZvLT5za2JfZG1hID0KLQkJcGNpX21hcF9zaW5nbGUocERldmljZS0+cGNpZCwKKwkJZG1hX21hcF9zaW5nbGUoJnBEZXZpY2UtPnBjaWQtPmRldiwKIAkJCSAgICAgICBza2JfcHV0KHBSREluZm8tPnNrYiwgc2tiX3RhaWxyb29tKHBSREluZm8tPnNrYikpLAotCQkJICAgICAgIHBEZXZpY2UtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCSAgICAgICBwRGV2aWNlLT5yeF9idWZfc3osIERNQV9GUk9NX0RFVklDRSk7CiAKIAkqKCh1bnNpZ25lZCBpbnQgKikmKHBSRC0+bV9yZDBSRDApKSA9IDA7IC8qIEZJWCBjYXN0ICovCiAKQEAgLTk0Myw3ICs5MzQsNyBAQAogCQlieVRzcjAgPSBwVEQtPm1fdGQwVEQwLmJ5VFNSMDsKIAkJYnlUc3IxID0gcFRELT5tX3RkMFREMC5ieVRTUjE7CiAKLQkJLy9Pbmx5IHRoZSBzdGF0dXMgb2YgZmlyc3QgVEQgaW4gdGhlIGNoYWluIGlzIGNvcnJlY3QKKwkJLyogT25seSB0aGUgc3RhdHVzIG9mIGZpcnN0IFREIGluIHRoZSBjaGFpbiBpcyBjb3JyZWN0ICovCiAJCWlmIChwVEQtPm1fdGQxVEQxLmJ5VENSICYgVENSX1NUUCkgewogCQkJaWYgKChwVEQtPnBUREluZm8tPmJ5RmxhZ3MgJiBURF9GTEFHU19ORVRJRl9TS0IpICE9IDApIHsKIApAQCAtOTkyLDEwICs5ODMsMTAgQEAKIAlQREVWSUNFX1REX0lORk8gIHBUREluZm8gPSBwRGVzYy0+cFRESW5mbzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcFRESW5mby0+c2tiOwogCi0JLy8gcHJlLWFsbG9jYXRlZCBidWZfZG1hIGNhbid0IGJlIHVubWFwcGVkLgorCS8qIHByZS1hbGxvY2F0ZWQgYnVmX2RtYSBjYW4ndCBiZSB1bm1hcHBlZC4gKi8KIAlpZiAocFRESW5mby0+c2tiX2RtYSAmJiAocFRESW5mby0+c2tiX2RtYSAhPSBwVERJbmZvLT5idWZfZG1hKSkgewotCQlwY2lfdW5tYXBfc2luZ2xlKHBEZXZpY2UtPnBjaWQsIHBUREluZm8tPnNrYl9kbWEsIHNrYi0+bGVuLAotCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJZG1hX3VubWFwX3NpbmdsZSgmcERldmljZS0+cGNpZC0+ZGV2LCBwVERJbmZvLT5za2JfZG1hLAorCQkJCSBza2ItPmxlbiwgRE1BX1RPX0RFVklDRSk7CiAJfQogCiAJaWYgKHBUREluZm8tPmJ5RmxhZ3MgJiBURF9GTEFHU19ORVRJRl9TS0IpCkBAIC0xMDg0LDcgKzEwNzUsNyBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBEZXZpY2UtPmxvY2ssIGZsYWdzKTsKIAotCS8vTWFrZSBzdXJlIGN1cnJlbnQgcGFnZSBpcyAwCisJLyogTWFrZSBzdXJlIGN1cnJlbnQgcGFnZSBpcyAwICovCiAJVk5TdkluUG9ydEIocERldmljZS0+UG9ydE9mZnNldCArIE1BQ19SRUdfUEFHRTFTRUwsICZieU9yZ1BhZ2VTZWwpOwogCWlmIChieU9yZ1BhZ2VTZWwgPT0gMSkKIAkJTUFDdlNlbGVjdFBhZ2UwKHBEZXZpY2UtPlBvcnRPZmZzZXQpOwpAQCAtMTA5MiwxMCArMTA4MywxMiBAQAogCQlieU9yZ1BhZ2VTZWwgPSAwOwogCiAJTUFDdlJlYWRNSUJDb3VudGVyKHBEZXZpY2UtPlBvcnRPZmZzZXQsICZkd01JQkNvdW50ZXIpOwotCS8vIFRCRC4uLi4KLQkvLyBNdXN0IGRvIHRoaXMgYWZ0ZXIgZG9pbmcgcngvdHgsIGNhdXNlIElTUiBiaXQgaXMgc2xvdwotCS8vIHRoYW4gUkQvVEQgd3JpdGUgYmFjawotCS8vIHVwZGF0ZSBJU1IgY291bnRlcgorCS8qCisJICogVEJELi4uLgorCSAqIE11c3QgZG8gdGhpcyBhZnRlciBkb2luZyByeC90eCwgY2F1c2UgSVNSIGJpdCBpcyBzbG93CisJICogdGhhbiBSRC9URCB3cml0ZSBiYWNrCisJICogdXBkYXRlIElTUiBjb3VudGVyCisJICovCiAJU1RBdlVwZGF0ZTgwMl8xMUNvdW50ZXIoJnBEZXZpY2UtPnM4MDJfMTFDb3VudGVyLCAmcERldmljZS0+c2NTdGF0aXN0aWMsIGR3TUlCQ291bnRlcik7CiAJd2hpbGUgKHBEZXZpY2UtPmR3SXNyICE9IDApIHsKIAkJU1RBdlVwZGF0ZUlzclN0YXRDb3VudGVyKCZwRGV2aWNlLT5zY1N0YXRpc3RpYywgcERldmljZS0+ZHdJc3IpOwpAQCAtMTE4NywxMiArMTE4MCwxNCBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJUFNUeERlc2MgaGVhZF90ZDsKLQl1MzIgZG1hX2lkeCA9IFRZUEVfQUMwRE1BOworCXUzMiBkbWFfaWR4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwogCi0JaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKQorCWlmIChpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKQorCQlkbWFfaWR4ID0gVFlQRV9BQzBETUE7CisJZWxzZQogCQlkbWFfaWR4ID0gVFlQRV9UWERNQTA7CiAKIAlpZiAoQVZBSUxfVEQocHJpdiwgZG1hX2lkeCkgPCAxKSB7CkBAIC0xMjA2LDYgKzEyMDEsOSBAQAogCiAJaGVhZF90ZC0+cFRESW5mby0+c2tiID0gc2tiOwogCisJaWYgKGRtYV9pZHggPT0gVFlQRV9BQzBETUEpCisJCWhlYWRfdGQtPnBUREluZm8tPmJ5RmxhZ3MgPSBURF9GTEFHU19ORVRJRl9TS0I7CisKIAlwcml2LT5pVERVc2VkW2RtYV9pZHhdKys7CiAKIAkvKiBUYWtlIG93bmVyc2hpcCAqLwpAQCAtMTIzNCwxMyArMTIzMiwxMCBAQAogCiAJaGVhZF90ZC0+YnVmZl9hZGRyID0gY3B1X3RvX2xlMzIoaGVhZF90ZC0+cFRESW5mby0+c2tiX2RtYSk7CiAKLQlpZiAoZG1hX2lkeCA9PSBUWVBFX0FDMERNQSkgewotCQloZWFkX3RkLT5wVERJbmZvLT5ieUZsYWdzID0gVERfRkxBR1NfTkVUSUZfU0tCOwotCisJaWYgKGhlYWRfdGQtPnBUREluZm8tPmJ5RmxhZ3MgJiBURF9GTEFHU19ORVRJRl9TS0IpCiAJCU1BQ3ZUcmFuc21pdEFDMChwcml2LT5Qb3J0T2Zmc2V0KTsKLQl9IGVsc2UgeworCWVsc2UKIAkJTUFDdlRyYW5zbWl0MChwcml2LT5Qb3J0T2Zmc2V0KTsKLQl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7CiAKQEAgLTE3NzgsNiArMTc3MywxMiBAQAogCU1BQ3ZJbml0aWFsaXplKHByaXYtPlBvcnRPZmZzZXQpOwogCU1BQ3ZSZWFkRXRoZXJBZGRyZXNzKHByaXYtPlBvcnRPZmZzZXQsIHByaXYtPmFieUN1cnJlbnROZXRBZGRyKTsKIAorCS8qIEdldCBSRlR5cGUgKi8KKwlwcml2LT5ieVJGVHlwZSA9IFNST01ieVJlYWRFbWJlZGRlZChwcml2LT5Qb3J0T2Zmc2V0LCBFRVBfT0ZTX1JGVFlQRSk7CisJcHJpdi0+YnlSRlR5cGUgJj0gUkZfTUFTSzsKKworCWRldl9kYmcoJnBjaWQtPmRldiwgIlJGIFR5cGUgPSAleFxuIiwgcHJpdi0+YnlSRlR5cGUpOworCiAJZGV2aWNlX2dldF9vcHRpb25zKHByaXYpOwogCWRldmljZV9zZXRfb3B0aW9ucyhwcml2KTsKIAkvKiBNYXNrIG91dCB0aGUgb3B0aW9ucyBjYW5ub3QgYmUgc2V0IHRvIHRoZSBjaGlwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RwYy5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9kcGMuYwppbmRleCAzYzViODdmLi5iMjVlZTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2RwYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvZHBjLmMKQEAgLTE0MCw4ICsxNDAsOCBAQAogCiAJc2tiID0gcmRfaW5mby0+c2tiOwogCi0JcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lkLCByZF9pbmZvLT5za2JfZG1hLAotCQkJIHByaXYtPnJ4X2J1Zl9zeiwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwlkbWFfdW5tYXBfc2luZ2xlKCZwcml2LT5wY2lkLT5kZXYsIHJkX2luZm8tPnNrYl9kbWEsCisJCQkgcHJpdi0+cnhfYnVmX3N6LCBETUFfRlJPTV9ERVZJQ0UpOwogCiAJZnJhbWVfc2l6ZSA9IGxlMTZfdG9fY3B1KGN1cnJfcmQtPm1fcmQxUkQxLndSZXFDb3VudCkKIAkJCS0gY3B1X3RvX2xlMTYoY3Vycl9yZC0+bV9yZDBSRDAud1Jlc0NvdW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L2tleS5oCmluZGV4IGMwMWQ0YWYuLjI2MWY4MTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUva2V5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9rZXkuaApAQCAtNjYsNCArNjYsNCBAQAogaW50IHZudF9zZXRfa2V5cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKIAkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7CiAKLSNlbmRpZiAvLyBfX0tFWV9IX18KKyNlbmRpZiAvKiBfX0tFWV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21hYy5jCmluZGV4IDM2NTNhMmIuLjgwNDhiMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWFjLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9tYWMuYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAgKi8KIHZvaWQgTUFDdlNldFNob3J0UmV0cnlMaW1pdCh2b2lkIF9faW9tZW0gKmR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyIGJ5UmV0cnlMaW1pdCkKIHsKLQkvLyBzZXQgU1JUCisJLyogc2V0IFNSVCAqLwogCVZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfU1JULCBieVJldHJ5TGltaXQpOwogfQogCkBAIC0xNjIsNyArMTYyLDcgQEAKICAqLwogdm9pZCBNQUN2U2V0TG9uZ1JldHJ5TGltaXQodm9pZCBfX2lvbWVtICpkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieVJldHJ5TGltaXQpCiB7Ci0JLy8gc2V0IExSVAorCS8qIHNldCBMUlQgKi8KIAlWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX0xSVCwgYnlSZXRyeUxpbWl0KTsKIH0KIApAQCAtMTg2LDcgKzE4Niw3IEBACiAKIAlBU1NFUlQoYnlMb29wYmFja01vZGUgPCAzKTsKIAlieUxvb3BiYWNrTW9kZSA8PD0gNjsKLQkvLyBzZXQgVENSCisJLyogc2V0IFRDUiAqLwogCVZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19URVNULCAmYnlPcmdWYWx1ZSk7CiAJYnlPcmdWYWx1ZSA9IGJ5T3JnVmFsdWUgJiAweDNGOwogCWJ5T3JnVmFsdWUgPSBieU9yZ1ZhbHVlIHwgYnlMb29wYmFja01vZGU7CkBAIC0yMTAsMTMgKzIxMCwxMyBAQAogewogCWludCAgICAgICAgIGlpOwogCi0JLy8gcmVhZCBwYWdlMCByZWdpc3RlcgorCS8qIHJlYWQgcGFnZTAgcmVnaXN0ZXIgKi8KIAlmb3IgKGlpID0gMDsgaWkgPCBNQUNfTUFYX0NPTlRFWFRfU0laRV9QQUdFMDsgaWkrKykKIAkJVk5TdkluUG9ydEIoKGR3SW9CYXNlICsgaWkpLCAocGJ5Q3h0QnVmICsgaWkpKTsKIAogCU1BQ3ZTZWxlY3RQYWdlMShkd0lvQmFzZSk7CiAKLQkvLyByZWFkIHBhZ2UxIHJlZ2lzdGVyCisJLyogcmVhZCBwYWdlMSByZWdpc3RlciAqLwogCWZvciAoaWkgPSAwOyBpaSA8IE1BQ19NQVhfQ09OVEVYVF9TSVpFX1BBR0UxOyBpaSsrKQogCQlWTlN2SW5Qb3J0QigoZHdJb0Jhc2UgKyBpaSksIChwYnlDeHRCdWYgKyBNQUNfTUFYX0NPTlRFWFRfU0laRV9QQUdFMCArIGlpKSk7CiAKQEAgLTI0MiwyNyArMjQyLDI3IEBACiAJaW50ICAgICAgICAgaWk7CiAKIAlNQUN2U2VsZWN0UGFnZTEoZHdJb0Jhc2UpOwotCS8vIHJlc3RvcmUgcGFnZTEKKwkvKiByZXN0b3JlIHBhZ2UxICovCiAJZm9yIChpaSA9IDA7IGlpIDwgTUFDX01BWF9DT05URVhUX1NJWkVfUEFHRTE7IGlpKyspCiAJCVZOU3ZPdXRQb3J0QigoZHdJb0Jhc2UgKyBpaSksICoocGJ5Q3h0QnVmICsgTUFDX01BWF9DT05URVhUX1NJWkVfUEFHRTAgKyBpaSkpOwogCiAJTUFDdlNlbGVjdFBhZ2UwKGR3SW9CYXNlKTsKIAotCS8vIHJlc3RvcmUgUkNSLFRDUixJTVIuLi4KKwkvKiByZXN0b3JlIFJDUixUQ1IsSU1SLi4uICovCiAJZm9yIChpaSA9IE1BQ19SRUdfUkNSOyBpaSA8IE1BQ19SRUdfSVNSOyBpaSsrKQogCQlWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBpaSwgKihwYnlDeHRCdWYgKyBpaSkpOwogCi0JLy8gcmVzdG9yZSBNQUMgQ29uZmlnLgorCS8qIHJlc3RvcmUgTUFDIENvbmZpZy4gKi8KIAlmb3IgKGlpID0gTUFDX1JFR19MUlQ7IGlpIDwgTUFDX1JFR19QQUdFMVNFTDsgaWkrKykKIAkJVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgaWksICoocGJ5Q3h0QnVmICsgaWkpKTsKIAogCVZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfQ0ZHLCAqKHBieUN4dEJ1ZiArIE1BQ19SRUdfQ0ZHKSk7CiAKLQkvLyByZXN0b3JlIFBTIENvbmZpZy4KKwkvKiByZXN0b3JlIFBTIENvbmZpZy4gKi8KIAlmb3IgKGlpID0gTUFDX1JFR19QU0NGRzsgaWkgPCBNQUNfUkVHX0JCUkVHQ1RMOyBpaSsrKQogCQlWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBpaSwgKihwYnlDeHRCdWYgKyBpaSkpOwogCi0JLy8gcmVzdG9yZSBDVVJSX1JYX0RFU0NfQUREUiwgQ1VSUl9UWF9ERVNDX0FERFIKKwkvKiByZXN0b3JlIENVUlJfUlhfREVTQ19BRERSLCBDVVJSX1RYX0RFU0NfQUREUiAqLwogCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfVFhETUFQVFIwLCAqKHVuc2lnbmVkIGxvbmcgKikocGJ5Q3h0QnVmICsgTUFDX1JFR19UWERNQVBUUjApKTsKIAlWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX0FDMERNQVBUUiwgKih1bnNpZ25lZCBsb25nICopKHBieUN4dEJ1ZiArIE1BQ19SRUdfQUMwRE1BUFRSKSk7CiAJVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19CQ05ETUFQVFIsICoodW5zaWduZWQgbG9uZyAqKShwYnlDeHRCdWYgKyBNQUNfUkVHX0JDTkRNQVBUUikpOwpAQCAtMjkwLDcgKzI5MCw3IEBACiAJdW5zaWduZWQgY2hhciBieURhdGE7CiAJdW5zaWduZWQgc2hvcnQgd3c7CiAKLQkvLyB0dXJuIG9uIEhPU1RDUl9TT0ZUUlNULCBqdXN0IHdyaXRlIDB4MDEgdG8gcmVzZXQKKwkvKiB0dXJuIG9uIEhPU1RDUl9TT0ZUUlNULCBqdXN0IHdyaXRlIDB4MDEgdG8gcmVzZXQgKi8KIAlWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX0hPU1RDUiwgMHgwMSk7CiAKIAlmb3IgKHd3ID0gMDsgd3cgPCBXX01BWF9USU1FT1VUOyB3dysrKSB7CkBAIC0zMjEsMTUgKzMyMSwxNSBAQAogCXVuc2lnbmVkIGNoYXIgYWJ5VG1wUmVnRGF0YVtNQUNfTUFYX0NPTlRFWFRfU0laRV9QQUdFMCtNQUNfTUFYX0NPTlRFWFRfU0laRV9QQUdFMV07CiAJYm9vbCBiUmV0VmFsOwogCi0JLy8gUEFUQ0guLi4uCi0JLy8gc2F2ZSBzb21lIGltcG9ydGFudCByZWdpc3RlcidzIHZhbHVlLCB0aGVuIGRvCi0JLy8gcmVzZXQsIHRoZW4gcmVzdG9yZSByZWdpc3RlcidzIHZhbHVlCi0KLQkvLyBzYXZlIE1BQyBjb250ZXh0CisJLyogUEFUQ0guLi4uCisJICogc2F2ZSBzb21lIGltcG9ydGFudCByZWdpc3RlcidzIHZhbHVlLCB0aGVuIGRvCisJICogcmVzZXQsIHRoZW4gcmVzdG9yZSByZWdpc3RlcidzIHZhbHVlCisJICovCisJLyogc2F2ZSBNQUMgY29udGV4dCAqLwogCU1BQ3ZTYXZlQ29udGV4dChkd0lvQmFzZSwgYWJ5VG1wUmVnRGF0YSk7Ci0JLy8gZG8gcmVzZXQKKwkvKiBkbyByZXNldCAqLwogCWJSZXRWYWwgPSBNQUNiU29mdHdhcmVSZXNldChkd0lvQmFzZSk7Ci0JLy8gcmVzdG9yZSBNQUMgY29udGV4dCwgZXhjZXB0IENSMAorCS8qIHJlc3RvcmUgTUFDIGNvbnRleHQsIGV4Y2VwdCBDUjAgKi8KIAlNQUN2UmVzdG9yZUNvbnRleHQoZHdJb0Jhc2UsIGFieVRtcFJlZ0RhdGEpOwogCiAJcmV0dXJuIGJSZXRWYWw7CkBAIC0zNTQsOSArMzU0LDkgQEAKIAl1bnNpZ25lZCBsb25nIGR3RGF0YTsKIAl1bnNpZ25lZCBjaGFyIGJ5RGF0YTsKIAotCS8vIHR1cm4gb2ZmIHdvdyB0ZW1wIGZvciB0dXJuIG9mZiBSeCBzYWZlbHkKKwkvKiB0dXJuIG9mZiB3b3cgdGVtcCBmb3IgdHVybiBvZmYgUnggc2FmZWx5ICovCiAKLQkvLyBDbGVhciBSWCBETUEwLDEKKwkvKiBDbGVhciBSWCBETUEwLDEgKi8KIAlWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1JYRE1BQ1RMMCwgRE1BQ1RMX0NMUlJVTik7CiAJVk5Tdk91dFBvcnREKGR3SW9CYXNlICsgTUFDX1JFR19SWERNQUNUTDEsIERNQUNUTF9DTFJSVU4pOwogCWZvciAod3cgPSAwOyB3dyA8IFdfTUFYX1RJTUVPVVQ7IHd3KyspIHsKQEAgLTM4MCw5ICszODAsOSBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JLy8gdHJ5IHRvIHNhZmUgc2h1dGRvd24gUlgKKwkvKiB0cnkgdG8gc2FmZSBzaHV0ZG93biBSWCAqLwogCU1BQ3ZSZWdCaXRzT2ZmKGR3SW9CYXNlLCBNQUNfUkVHX0hPU1RDUiwgSE9TVENSX1JYT04pOwotCS8vIFdfTUFYX1RJTUVPVVQgaXMgdGhlIHRpbWVvdXQgcGVyaW9kCisJLyogV19NQVhfVElNRU9VVCBpcyB0aGUgdGltZW91dCBwZXJpb2QgKi8KIAlmb3IgKHd3ID0gMDsgd3cgPCBXX01BWF9USU1FT1VUOyB3dysrKSB7CiAJCVZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19IT1NUQ1IsICZieURhdGEpOwogCQlpZiAoIShieURhdGEgJiBIT1NUQ1JfUlhPTlNUKSkKQEAgLTQxNSwxMCArNDE1LDEwIEBACiAJdW5zaWduZWQgbG9uZyBkd0RhdGE7CiAJdW5zaWduZWQgY2hhciBieURhdGE7CiAKLQkvLyBDbGVhciBUWCBETUEKLQkvL1R4MAorCS8qIENsZWFyIFRYIERNQSAqLworCS8qIFR4MCAqLwogCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfVFhETUFDVEwwLCBETUFDVExfQ0xSUlVOKTsKLQkvL0FDMAorCS8qIEFDMCAqLwogCVZOU3ZPdXRQb3J0RChkd0lvQmFzZSArIE1BQ19SRUdfQUMwRE1BQ1RMLCBETUFDVExfQ0xSUlVOKTsKIAogCWZvciAod3cgPSAwOyB3dyA8IFdfTUFYX1RJTUVPVVQ7IHd3KyspIHsKQEAgLTQ0MiwxMCArNDQyLDEwIEBACiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQkvLyB0cnkgdG8gc2FmZSBzaHV0ZG93biBUWAorCS8qIHRyeSB0byBzYWZlIHNodXRkb3duIFRYICovCiAJTUFDdlJlZ0JpdHNPZmYoZHdJb0Jhc2UsIE1BQ19SRUdfSE9TVENSLCBIT1NUQ1JfVFhPTik7CiAKLQkvLyBXX01BWF9USU1FT1VUIGlzIHRoZSB0aW1lb3V0IHBlcmlvZAorCS8qIFdfTUFYX1RJTUVPVVQgaXMgdGhlIHRpbWVvdXQgcGVyaW9kICovCiAJZm9yICh3dyA9IDA7IHd3IDwgV19NQVhfVElNRU9VVDsgd3crKykgewogCQlWTlN2SW5Qb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfSE9TVENSLCAmYnlEYXRhKTsKIAkJaWYgKCEoYnlEYXRhICYgSE9TVENSX1RYT05TVCkpCkBAIC01MDksMTAgKzUwOSwxMCBAQAogICovCiBib29sIE1BQ2JTaHV0ZG93bih2b2lkIF9faW9tZW0gKmR3SW9CYXNlKQogewotCS8vIGRpc2FibGUgTUFDIElNUgorCS8qIGRpc2FibGUgTUFDIElNUiAqLwogCU1BQ3ZJbnREaXNhYmxlKGR3SW9CYXNlKTsKIAlNQUN2U2V0TG9vcGJhY2tNb2RlKGR3SW9CYXNlLCBNQUNfTEJfSU5URVJOQUwpOwotCS8vIHN0b3AgdGhlIGFkYXB0ZXIKKwkvKiBzdG9wIHRoZSBhZGFwdGVyICovCiAJaWYgKCFNQUNiU2FmZVN0b3AoZHdJb0Jhc2UpKSB7CiAJCU1BQ3ZTZXRMb29wYmFja01vZGUoZHdJb0Jhc2UsIE1BQ19MQl9OT05FKTsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtNTM2LDE4ICs1MzYsMTggQEAKICAqLwogdm9pZCBNQUN2SW5pdGlhbGl6ZSh2b2lkIF9faW9tZW0gKmR3SW9CYXNlKQogewotCS8vIGNsZWFyIHN0aWNreSBiaXRzCisJLyogY2xlYXIgc3RpY2t5IGJpdHMgKi8KIAlNQUN2Q2xlYXJTdGNrRFMoZHdJb0Jhc2UpOwotCS8vIGRpc2FibGUgZm9yY2UgUE1FLWVuYWJsZQorCS8qIGRpc2FibGUgZm9yY2UgUE1FLWVuYWJsZSAqLwogCVZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfUE1DMSwgUE1FX09WUik7Ci0JLy8gb25seSAzMjUzIEEKKwkvKiBvbmx5IDMyNTMgQSAqLwogCi0JLy8gZG8gcmVzZXQKKwkvKiBkbyByZXNldCAqLwogCU1BQ2JTb2Z0d2FyZVJlc2V0KGR3SW9CYXNlKTsKIAotCS8vIHJlc2V0IFRTRiBjb3VudGVyCisJLyogcmVzZXQgVFNGIGNvdW50ZXIgKi8KIAlWTlN2T3V0UG9ydEIoZHdJb0Jhc2UgKyBNQUNfUkVHX1RGVENUTCwgVEZUQ1RMX1RTRkNOVFJTVCk7Ci0JLy8gZW5hYmxlIFRTRiBjb3VudGVyCisJLyogZW5hYmxlIFRTRiBjb3VudGVyICovCiAJVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19URlRDVEwsIFRGVENUTF9UU0ZDTlRSRU4pOwogfQogCkBAIC02NzgsNyArNjc4LDcgQEAKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKICAqLwotLy9UeERNQTEgPSBBQzBETUEKKy8qIFR4RE1BMSA9IEFDMERNQSAqLwogdm9pZCBNQUN2U2V0Q3VyckFDMERlc2NBZGRyRXgodm9pZCBfX2lvbWVtICpkd0lvQmFzZSwgdW5zaWduZWQgbG9uZyBkd0N1cnJEZXNjQWRkcikKIHsKIAl1bnNpZ25lZCBzaG9ydCB3dzsKQEAgLTczMyw3ICs3MzMsNyBAQAogCVZOU3ZPdXRQb3J0Qihkd0lvQmFzZSArIE1BQ19SRUdfVE1DVEwwLCAwKTsKIAlWTlN2T3V0UG9ydEQoZHdJb0Jhc2UgKyBNQUNfUkVHX1RNREFUQTAsIHVEZWxheSk7CiAJVk5Tdk91dFBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19UTUNUTDAsIChUTUNUTF9UTUQgfCBUTUNUTF9URSkpOwotCWZvciAoaWkgPSAwOyBpaSA8IDY2OyBpaSsrKSB7ICAvLyBhc3N1bWUgbWF4IFBDSSBjbG9jayBpcyA2Nk1oegorCWZvciAoaWkgPSAwOyBpaSA8IDY2OyBpaSsrKSB7ICAvKiBhc3N1bWUgbWF4IFBDSSBjbG9jayBpcyA2Nk1oeiAqLwogCQlmb3IgKHV1ID0gMDsgdXUgPCB1RGVsYXk7IHV1KyspIHsKIAkJCVZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19UTUNUTDAsICZieVZhbHVlKTsKIAkJCWlmICgoYnlWYWx1ZSA9PSAwKSB8fApAQCAtNzgwLDE0ICs3ODAsMTQgQEAKIHsKIAl1bnNpZ25lZCBjaGFyIGJ5T3JnVmFsdWU7CiAJdW5zaWduZWQgaW50IHd3OwotCS8vIFJlYWQgUFNDVEwKKwkvKiBSZWFkIFBTQ1RMICovCiAJaWYgKE1BQ2JJc1JlZ0JpdHNPZmYoZHdJb0Jhc2UsIE1BQ19SRUdfUFNDVEwsIFBTQ1RMX1BTKSkKIAkJcmV0dXJuIHRydWU7CiAKLQkvLyBEaXNhYmxlIFBTCisJLyogRGlzYWJsZSBQUyAqLwogCU1BQ3ZSZWdCaXRzT2ZmKGR3SW9CYXNlLCBNQUNfUkVHX1BTQ1RMLCBQU0NUTF9QU0VOKTsKIAotCS8vIENoZWNrIGlmIFN5bmNGbHVzaE9LCisJLyogQ2hlY2sgaWYgU3luY0ZsdXNoT0sgKi8KIAlmb3IgKHd3ID0gMDsgd3cgPCBXX01BWF9USU1FT1VUOyB3dysrKSB7CiAJCVZOU3ZJblBvcnRCKGR3SW9CYXNlICsgTUFDX1JFR19QU0NUTCwgJmJ5T3JnVmFsdWUpOwogCQlpZiAoYnlPcmdWYWx1ZSAmIFBTQ1RMX1dBS0VET05FKQpAQCAtODU5LDcgKzg1OSw3IEBACiAKIAl3T2Zmc2V0ICs9ICh1S2V5SWR4ICogNCk7CiAJZm9yIChpaSA9IDA7IGlpIDwgNDsgaWkrKykgewotCQkvLyBhbHdheXMgcHVzaCAxMjggYml0cworCQkvKiBhbHdheXMgcHVzaCAxMjggYml0cyAqLwogCQlwcl9kZWJ1ZygiMy4oJWQpIHdPZmZzZXQ6ICVkLCBEYXRhOiAlWFxuIiwKIAkJCSBpaSwgd09mZnNldCtpaSwgKnBkd0tleSk7CiAJCVZOU3ZPdXRQb3J0Vyhkd0lvQmFzZSArIE1BQ19SRUdfTUlTQ0ZGTkRFWCwgd09mZnNldCtpaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pYi5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9taWIuYwppbmRleCBkMmYzNTFkLi5kNTVjNzYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L21pYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvbWliLmMKQEAgLTYzLDUxICs2Myw1MSBAQAogCS8qKioqKioqKioqKioqKioqKioqKioqLwogCS8qIEFCTk9STUFMIGludGVycnVwdCAqLwogCS8qKioqKioqKioqKioqKioqKioqKioqLwotCS8vIG5vdCBhbnkgSU1SIGJpdCBpbnZva2UgaXJxCisJLyogbm90IGFueSBJTVIgYml0IGludm9rZSBpcnEgKi8KIAogCWlmIChkd0lzciA9PSAwKSB7CiAJCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JVbmtub3duKys7CiAJCXJldHVybjsKIAl9CiAKLS8vQWRkZWQgYnkgS3lsZQotCWlmIChkd0lzciAmIElTUl9UWERNQTApICAgICAgICAgICAgICAgLy8gSVNSLCBiaXQwCi0JCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JUeDBPSysrOyAgICAgICAgICAgICAvLyBUWERNQTAgc3VjY2Vzc2Z1bAorLyogQWRkZWQgYnkgS3lsZSAqLworCWlmIChkd0lzciAmIElTUl9UWERNQTApICAgICAgICAgICAgICAgLyogSVNSLCBiaXQwICovCisJCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JUeDBPSysrOyAgICAgICAgICAgICAvKiBUWERNQTAgc3VjY2Vzc2Z1bCAqLwogCi0JaWYgKGR3SXNyICYgSVNSX0FDMERNQSkgICAgICAgICAgICAgICAvLyBJU1IsIGJpdDEKLQkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzckFDMFR4T0srKzsgICAgICAgICAgIC8vIEFDMERNQSBzdWNjZXNzZnVsCisJaWYgKGR3SXNyICYgSVNSX0FDMERNQSkgICAgICAgICAgICAgICAvKiBJU1IsIGJpdDEgKi8KKwkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzckFDMFR4T0srKzsgICAgICAgICAgIC8qIEFDMERNQSBzdWNjZXNzZnVsICovCiAKLQlpZiAoZHdJc3IgJiBJU1JfQk5UWCkgICAgICAgICAgICAgICAgIC8vIElTUiwgYml0MgotCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyQmVhY29uVHhPSysrOyAgICAgICAgLy8gQmVhY29uVHggc3VjY2Vzc2Z1bAorCWlmIChkd0lzciAmIElTUl9CTlRYKSAgICAgICAgICAgICAgICAgLyogSVNSLCBiaXQyICovCisJCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JCZWFjb25UeE9LKys7ICAgICAgICAvKiBCZWFjb25UeCBzdWNjZXNzZnVsICovCiAKLQlpZiAoZHdJc3IgJiBJU1JfUlhETUEwKSAgICAgICAgICAgICAgIC8vIElTUiwgYml0MwotCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyUngwT0srKzsgICAgICAgICAgICAgLy8gUngwIHN1Y2Nlc3NmdWwKKwlpZiAoZHdJc3IgJiBJU1JfUlhETUEwKSAgICAgICAgICAgICAgIC8qIElTUiwgYml0MyAqLworCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyUngwT0srKzsgICAgICAgICAgICAgLyogUngwIHN1Y2Nlc3NmdWwgKi8KIAotCWlmIChkd0lzciAmIElTUl9UQlRUKSAgICAgICAgICAgICAgICAgLy8gSVNSLCBiaXQ0Ci0JCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JUQlRUSW50Kys7ICAgICAgICAgICAvLyBUQlRUIHN1Y2Nlc3NmdWwKKwlpZiAoZHdJc3IgJiBJU1JfVEJUVCkgICAgICAgICAgICAgICAgIC8qIElTUiwgYml0NCAqLworCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyVEJUVEludCsrOyAgICAgICAgICAgLyogVEJUVCBzdWNjZXNzZnVsICovCiAKLQlpZiAoZHdJc3IgJiBJU1JfU09GVFRJTUVSKSAgICAgICAgICAgIC8vIElTUiwgYml0NgorCWlmIChkd0lzciAmIElTUl9TT0ZUVElNRVIpICAgICAgICAgICAgLyogSVNSLCBiaXQ2ICovCiAJCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JTVElNRVJJbnQrKzsKIAotCWlmIChkd0lzciAmIElTUl9XQVRDSERPRykgICAgICAgICAgICAgLy8gSVNSLCBiaXQ3CisJaWYgKGR3SXNyICYgSVNSX1dBVENIRE9HKSAgICAgICAgICAgICAvKiBJU1IsIGJpdDcgKi8KIAkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzcldhdGNoRG9nKys7CiAKLQlpZiAoZHdJc3IgJiBJU1JfRkVUQUxFUlIpICAgICAgICAgICAgIC8vIElTUiwgYml0OAorCWlmIChkd0lzciAmIElTUl9GRVRBTEVSUikgICAgICAgICAgICAgLyogSVNSLCBiaXQ4ICovCiAJCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JVbnJlY292ZXJhYmxlRXJyb3IrKzsKIAotCWlmIChkd0lzciAmIElTUl9TT0ZUSU5UKSAgICAgICAgICAgICAgLy8gSVNSLCBiaXQ5Ci0JCXBTdGF0aXN0aWMtPklTUlN0YXQuZHdJc3JTb2Z0SW50ZXJydXB0Kys7ICAgICAvLyBzb2Z0d2FyZSBpbnRlcnJ1cHQKKwlpZiAoZHdJc3IgJiBJU1JfU09GVElOVCkgICAgICAgICAgICAgIC8qIElTUiwgYml0OSAqLworCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyU29mdEludGVycnVwdCsrOyAgICAgLyogc29mdHdhcmUgaW50ZXJydXB0ICovCiAKLQlpZiAoZHdJc3IgJiBJU1JfTUlCTkVBUkZVTEwpICAgICAgICAgIC8vIElTUiwgYml0MTAKKwlpZiAoZHdJc3IgJiBJU1JfTUlCTkVBUkZVTEwpICAgICAgICAgIC8qIElTUiwgYml0MTAgKi8KIAkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzck1JQk5lYXJmdWxsKys7CiAKLQlpZiAoZHdJc3IgJiBJU1JfUlhOT0JVRikgICAgICAgICAgICAgIC8vIElTUiwgYml0MTEKLQkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzclJ4Tm9CdWYrKzsgICAgICAgICAgIC8vIFJ4IE5vIEJ1ZmYKKwlpZiAoZHdJc3IgJiBJU1JfUlhOT0JVRikgICAgICAgICAgICAgIC8qIElTUiwgYml0MTEgKi8KKwkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzclJ4Tm9CdWYrKzsgICAgICAgICAgIC8qIFJ4IE5vIEJ1ZmYgKi8KIAotCWlmIChkd0lzciAmIElTUl9SWERNQTEpICAgICAgICAgICAgICAgLy8gSVNSLCBiaXQxMgotCQlwU3RhdGlzdGljLT5JU1JTdGF0LmR3SXNyUngxT0srKzsgICAgICAgICAgICAgLy8gUngxIHN1Y2Nlc3NmdWwKKwlpZiAoZHdJc3IgJiBJU1JfUlhETUExKSAgICAgICAgICAgICAgIC8qIElTUiwgYml0MTIgKi8KKwkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzclJ4MU9LKys7ICAgICAgICAgICAgIC8qIFJ4MSBzdWNjZXNzZnVsICovCiAKLQlpZiAoZHdJc3IgJiBJU1JfU09GVFRJTUVSMSkgICAgICAgICAgIC8vIElTUiwgYml0MjEKKwlpZiAoZHdJc3IgJiBJU1JfU09GVFRJTUVSMSkgICAgICAgICAgIC8qIElTUiwgYml0MjEgKi8KIAkJcFN0YXRpc3RpYy0+SVNSU3RhdC5kd0lzclNUSU1FUjFJbnQrKzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yZi5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9yZi5jCmluZGV4IDk0MWIyYWQuLjc2MjZmNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcmYuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3JmLmMKQEAgLTc5NCw2ICs3OTQsNyBAQAogCQlicmVhazsKIAljYXNlIFJBVEVfNk06CiAJY2FzZSBSQVRFXzlNOgorCWNhc2UgUkFURV8xMk06CiAJY2FzZSBSQVRFXzE4TToKIAkJYnlQd3IgPSBwcml2LT5hYnlPRkRNUHdyVGJsW3VDSF07CiAJCWlmIChwcml2LT5ieVJGVHlwZSA9PSBSRl9VVzI0NTIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3J4dHguYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5jCmluZGV4IDA3Y2UzZmQuLjc0Njg3NzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvcnh0eC5jCkBAIC02NCwyMSArNjQsMjEgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRnVuY3Rpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBTdGF0aWMgRGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIENSSVRJQ0FMX1BBQ0tFVF9MRU4gICAgICAyNTYgICAgLy8gaWYgcGFja2V0IHNpemUgPCAyNTYgLT4gaW4tZGlyZWN0IHNlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBwYWNrZXQgc2l6ZSA+PSAyNTYgLT4gZGlyZWN0IHNlbmQKKyNkZWZpbmUgQ1JJVElDQUxfUEFDS0VUX0xFTiAgICAgIDI1NiAgICAvKiBpZiBwYWNrZXQgc2l6ZSA8IDI1NiAtPiBpbi1kaXJlY3Qgc2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQgc2l6ZSA+PSAyNTYgLT4gZGlyZWN0IHNlbmQgKi8KIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdUaW1lU3RhbXBPZmZbMl1bTUFYX1JBVEVdID0gewotCXszODQsIDI4OCwgMjI2LCAyMDksIDU0LCA0MywgMzcsIDMxLCAyOCwgMjUsIDI0LCAyM30sIC8vIExvbmcgUHJlYW1ibGUKLQl7Mzg0LCAxOTIsIDEzMCwgMTEzLCA1NCwgNDMsIDM3LCAzMSwgMjgsIDI1LCAyNCwgMjN9LCAvLyBTaG9ydCBQcmVhbWJsZQorCXszODQsIDI4OCwgMjI2LCAyMDksIDU0LCA0MywgMzcsIDMxLCAyOCwgMjUsIDI0LCAyM30sIC8qIExvbmcgUHJlYW1ibGUgKi8KKwl7Mzg0LCAxOTIsIDEzMCwgMTEzLCA1NCwgNDMsIDM3LCAzMSwgMjgsIDI1LCAyNCwgMjN9LCAvKiBTaG9ydCBQcmVhbWJsZSAqLwogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHdGQl9PcHQwWzJdWzVdID0gewotCXtSQVRFXzEyTSwgUkFURV8xOE0sIFJBVEVfMjRNLCBSQVRFXzM2TSwgUkFURV80OE19LCAvLyBmYWxsYmFja19yYXRlMAotCXtSQVRFXzEyTSwgUkFURV8xMk0sIFJBVEVfMThNLCBSQVRFXzI0TSwgUkFURV8zNk19LCAvLyBmYWxsYmFja19yYXRlMQorCXtSQVRFXzEyTSwgUkFURV8xOE0sIFJBVEVfMjRNLCBSQVRFXzM2TSwgUkFURV80OE19LCAvKiBmYWxsYmFja19yYXRlMCAqLworCXtSQVRFXzEyTSwgUkFURV8xMk0sIFJBVEVfMThNLCBSQVRFXzI0TSwgUkFURV8zNk19LCAvKiBmYWxsYmFja19yYXRlMSAqLwogfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB3RkJfT3B0MVsyXVs1XSA9IHsKLQl7UkFURV8xMk0sIFJBVEVfMThNLCBSQVRFXzI0TSwgUkFURV8yNE0sIFJBVEVfMzZNfSwgLy8gZmFsbGJhY2tfcmF0ZTAKLQl7UkFURV82TSAsIFJBVEVfNk0sICBSQVRFXzEyTSwgUkFURV8xMk0sIFJBVEVfMThNfSwgLy8gZmFsbGJhY2tfcmF0ZTEKKwl7UkFURV8xMk0sIFJBVEVfMThNLCBSQVRFXzI0TSwgUkFURV8yNE0sIFJBVEVfMzZNfSwgLyogZmFsbGJhY2tfcmF0ZTAgKi8KKwl7UkFURV82TSAsIFJBVEVfNk0sICBSQVRFXzEyTSwgUkFURV8xMk0sIFJBVEVfMThNfSwgLyogZmFsbGJhY2tfcmF0ZTEgKi8KIH07CiAKICNkZWZpbmUgUlRTRFVSX0JCICAgICAgIDAKQEAgLTExNiw3ICsxMTYsNyBAQAogc192R2VuZXJhdGVUeFBhcmFtZXRlcigKIAlzdHJ1Y3Qgdm50X3ByaXZhdGUgKnBEZXZpY2UsCiAJdW5zaWduZWQgY2hhciBieVBrdFR5cGUsCi0Jdm9pZCAqcFR4QnVmSGVhZCwKKwlzdHJ1Y3Qgdm50X3R4X2ZpZm9faGVhZCAqLAogCXZvaWQgKnB2UnJ2VGltZSwKIAl2b2lkICpwdlJUUywKIAl2b2lkICpwdkNUUywKQEAgLTE3Niw5ICsxNzYsOSBAQAogCXVuc2lnbmVkIGludCB1RGF0YVRpbWUsIHVBY2tUaW1lOwogCiAJdURhdGFUaW1lID0gQkJ1R2V0RnJhbWVUaW1lKHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlLCBieVBrdFR5cGUsIGNiRnJhbWVMZW5ndGgsIHdSYXRlKTsKLQlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFCKSAvL2xsYixDQ0sgbW9kZQorCWlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUIpIC8qIGxsYixDQ0sgbW9kZSAqLwogCQl1QWNrVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgKHVuc2lnbmVkIHNob3J0KXBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKLQllbHNlIC8vMTFnIDIuNEcgT0ZETSBtb2RlICYgMTFhIDVHIE9GRE0gbW9kZQorCWVsc2UgLyogMTFnIDIuNEcgT0ZETSBtb2RlICYgMTFhIDVHIE9GRE0gbW9kZSAqLwogCQl1QWNrVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgKHVuc2lnbmVkIHNob3J0KXBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7CiAKIAlpZiAoYk5lZWRBY2spCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJCQkJCWZyYW1lX2xlbmd0aCwgcmF0ZSwgbmVlZF9hY2spKTsKIH0KIAotLy9ieUZyZXFUeXBlOiAwPT41R0haIDE9PjIuNEdIWgorLyogYnlGcmVxVHlwZTogMD0+NUdIWiAxPT4yLjRHSFogKi8KIHN0YXRpYwogX19sZTE2CiBzX3VHZXRSVFNDVFNSc3ZUaW1lKApAQCAtMjEwLDI5ICsyMTAsMjkgQEAKIAl1UnJ2VGltZSA9IHVSVFNUaW1lID0gdUNUU1RpbWUgPSB1QWNrVGltZSA9IHVEYXRhVGltZSA9IDA7CiAKIAl1RGF0YVRpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd0N1cnJlbnRSYXRlKTsKLQlpZiAoYnlSVFNSc3ZUeXBlID09IDApIHsgLy9SVFNUeFJydlRpbWVfYmIKKwlpZiAoYnlSVFNSc3ZUeXBlID09IDApIHsgLyogUlRTVHhScnZUaW1lX2JiICovCiAJCXVSVFNUaW1lID0gQkJ1R2V0RnJhbWVUaW1lKHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlLCBieVBrdFR5cGUsIDIwLCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSk7CiAJCXVDVFNUaW1lID0gdUFja1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKLQl9IGVsc2UgaWYgKGJ5UlRTUnN2VHlwZSA9PSAxKSB7IC8vUlRTVHhScnZUaW1lX2JhLCBvbmx5IGluIDIuNEdIWgorCX0gZWxzZSBpZiAoYnlSVFNSc3ZUeXBlID09IDEpIHsgLyogUlRTVHhScnZUaW1lX2JhLCBvbmx5IGluIDIuNEdIWiAqLwogCQl1UlRTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAyMCwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUpOwogCQl1Q1RTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUpOwogCQl1QWNrVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlKTsKLQl9IGVsc2UgaWYgKGJ5UlRTUnN2VHlwZSA9PSAyKSB7IC8vUlRTVHhScnZUaW1lX2FhCisJfSBlbHNlIGlmIChieVJUU1JzdlR5cGUgPT0gMikgeyAvKiBSVFNUeFJydlRpbWVfYWEgKi8KIAkJdVJUU1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMjAsIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7CiAJCXVDVFNUaW1lID0gdUFja1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7Ci0JfSBlbHNlIGlmIChieVJUU1JzdlR5cGUgPT0gMykgeyAvL0NUU1R4UnJ2VGltZV9iYSwgb25seSBpbiAyLjRHSFoKKwl9IGVsc2UgaWYgKGJ5UlRTUnN2VHlwZSA9PSAzKSB7IC8qIENUU1R4UnJ2VGltZV9iYSwgb25seSBpbiAyLjRHSFogKi8KIAkJdUNUU1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKIAkJdUFja1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7CiAJCXVScnZUaW1lID0gdUNUU1RpbWUgKyB1QWNrVGltZSArIHVEYXRhVGltZSArIDIqcERldmljZS0+dVNJRlM7CiAJCXJldHVybiBjcHVfdG9fbGUxNigodTE2KXVScnZUaW1lKTsKIAl9CiAKLQkvL1JUU1JydlRpbWUKKwkvKiBSVFNScnZUaW1lICovCiAJdVJydlRpbWUgPSB1UlRTVGltZSArIHVDVFNUaW1lICsgdUFja1RpbWUgKyB1RGF0YVRpbWUgKyAzKnBEZXZpY2UtPnVTSUZTOwogCXJldHVybiBjcHVfdG9fbGUxNigodTE2KXVScnZUaW1lKTsKIH0KIAotLy9ieUZyZXFUeXBlIDA6IDVHSHosIDE6Mi40R2h6CisvKiBieUZyZXFUeXBlIDA6IDVHSHosIDE6Mi40R2h6ICovCiBzdGF0aWMKIHVuc2lnbmVkIGludAogc191R2V0RGF0YUR1cmF0aW9uKApAQCAtMjQ4LDIyICsyNDgsMjIgQEAKIAl1bnNpZ25lZCBjaGFyIGJ5RkJPcHRpb24KICkKIHsKLQlib29sIGJMYXN0RnJhZyA9IDA7CisJYm9vbCBiTGFzdEZyYWcgPSBmYWxzZTsKIAl1bnNpZ25lZCBpbnQgdUFja1RpbWUgPSAwLCB1TmV4dFBrdFRpbWUgPSAwOwogCiAJaWYgKHVGcmFnSWR4ID09ICh1TUFDZnJhZ051bS0xKSkKLQkJYkxhc3RGcmFnID0gMTsKKwkJYkxhc3RGcmFnID0gdHJ1ZTsKIAogCXN3aXRjaCAoYnlEdXJUeXBlKSB7Ci0JY2FzZSBEQVRBRFVSX0I6ICAgIC8vREFUQURVUl9CCi0JCWlmICgoKHVNQUNmcmFnTnVtID09IDEpKSB8fCBiTGFzdEZyYWcpIHsvL05vbiBGcmFnIG9yIExhc3QgRnJhZworCWNhc2UgREFUQURVUl9COiAgICAvKiBEQVRBRFVSX0IgKi8KKwkJaWYgKCgodU1BQ2ZyYWdOdW0gPT0gMSkpIHx8IGJMYXN0RnJhZykgey8qIE5vbiBGcmFnIG9yIExhc3QgRnJhZyAqLwogCQkJaWYgKGJOZWVkQWNrKSB7CiAJCQkJdUFja1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKIAkJCQlyZXR1cm4gcERldmljZS0+dVNJRlMgKyB1QWNrVGltZTsKIAkJCX0gZWxzZSB7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCX0gZWxzZSB7Ly9GaXJzdCBGcmFnIG9yIE1pZCBGcmFnCisJCX0gZWxzZSB7LyogRmlyc3QgRnJhZyBvciBNaWQgRnJhZyAqLwogCQkJaWYgKHVGcmFnSWR4ID09ICh1TUFDZnJhZ051bS0yKSkKIAkJCQl1TmV4dFBrdFRpbWUgPSBzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkxhc3RGcmFnbWVudFNpemUsIHdSYXRlLCBiTmVlZEFjayk7CiAJCQllbHNlCkBAIC0yNzgsMTUgKzI3OCwxNSBAQAogCQl9CiAJCWJyZWFrOwogCi0JY2FzZSBEQVRBRFVSX0E6ICAgIC8vREFUQURVUl9BCi0JCWlmICgoKHVNQUNmcmFnTnVtID09IDEpKSB8fCBiTGFzdEZyYWcpIHsvL05vbiBGcmFnIG9yIExhc3QgRnJhZworCWNhc2UgREFUQURVUl9BOiAgICAvKiBEQVRBRFVSX0EgKi8KKwkJaWYgKCgodU1BQ2ZyYWdOdW0gPT0gMSkpIHx8IGJMYXN0RnJhZykgey8qIE5vbiBGcmFnIG9yIExhc3QgRnJhZyAqLwogCQkJaWYgKGJOZWVkQWNrKSB7CiAJCQkJdUFja1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7CiAJCQkJcmV0dXJuIHBEZXZpY2UtPnVTSUZTICsgdUFja1RpbWU7CiAJCQl9IGVsc2UgewogCQkJCXJldHVybiAwOwogCQkJfQotCQl9IGVsc2Ugey8vRmlyc3QgRnJhZyBvciBNaWQgRnJhZworCQl9IGVsc2Ugey8qIEZpcnN0IEZyYWcgb3IgTWlkIEZyYWcgKi8KIAkJCWlmICh1RnJhZ0lkeCA9PSAodU1BQ2ZyYWdOdW0tMikpCiAJCQkJdU5leHRQa3RUaW1lID0gc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JMYXN0RnJhZ21lbnRTaXplLCB3UmF0ZSwgYk5lZWRBY2spOwogCQkJZWxzZQpAQCAtMzAxLDE1ICszMDEsMTUgQEAKIAkJfQogCQlicmVhazsKIAotCWNhc2UgREFUQURVUl9BX0YwOiAgICAvL0RBVEFEVVJfQV9GMAotCQlpZiAoKCh1TUFDZnJhZ051bSA9PSAxKSkgfHwgYkxhc3RGcmFnKSB7Ly9Ob24gRnJhZyBvciBMYXN0IEZyYWcKKwljYXNlIERBVEFEVVJfQV9GMDogICAgLyogREFUQURVUl9BX0YwICovCisJCWlmICgoKHVNQUNmcmFnTnVtID09IDEpKSB8fCBiTGFzdEZyYWcpIHsvKiBOb24gRnJhZyBvciBMYXN0IEZyYWcgKi8KIAkJCWlmIChiTmVlZEFjaykgewogCQkJCXVBY2tUaW1lID0gQkJ1R2V0RnJhbWVUaW1lKHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlLCBieVBrdFR5cGUsIDE0LCBwRGV2aWNlLT5ieVRvcE9GRE1CYXNpY1JhdGUpOwogCQkJCXJldHVybiBwRGV2aWNlLT51U0lGUyArIHVBY2tUaW1lOwogCQkJfSBlbHNlIHsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KLQkJfSBlbHNlIHsgLy9GaXJzdCBGcmFnIG9yIE1pZCBGcmFnCisJCX0gZWxzZSB7IC8qIEZpcnN0IEZyYWcgb3IgTWlkIEZyYWcgKi8KIAkJCWlmIChieUZCT3B0aW9uID09IEFVVE9fRkJfMCkgewogCQkJCWlmICh3UmF0ZSA8IFJBVEVfMThNKQogCQkJCQl3UmF0ZSA9IFJBVEVfMThNOwpAQCAtMzIxLDcgKzMyMSw3IEBACiAJCQkJZWxzZQogCQkJCQl1TmV4dFBrdFRpbWUgPSBzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lTGVuZ3RoLCB3RkJfT3B0MFtGQl9SQVRFMF1bd1JhdGUtUkFURV8xOE1dLCBiTmVlZEFjayk7CiAKLQkJCX0gZWxzZSB7IC8vIChieUZCT3B0aW9uID09IEFVVE9fRkJfMSkKKwkJCX0gZWxzZSB7IC8qIChieUZCT3B0aW9uID09IEFVVE9fRkJfMSkgKi8KIAkJCQlpZiAod1JhdGUgPCBSQVRFXzE4TSkKIAkJCQkJd1JhdGUgPSBSQVRFXzE4TTsKIAkJCQllbHNlIGlmICh3UmF0ZSA+IFJBVEVfNTRNKQpAQCAtMzQzLDE1ICszNDMsMTUgQEAKIAkJfQogCQlicmVhazsKIAotCWNhc2UgREFUQURVUl9BX0YxOiAgICAvL0RBVEFEVVJfQV9GMQotCQlpZiAoKCh1TUFDZnJhZ051bSA9PSAxKSkgfHwgYkxhc3RGcmFnKSB7Ly9Ob24gRnJhZyBvciBMYXN0IEZyYWcKKwljYXNlIERBVEFEVVJfQV9GMTogICAgLyogREFUQURVUl9BX0YxICovCisJCWlmICgoKHVNQUNmcmFnTnVtID09IDEpKSB8fCBiTGFzdEZyYWcpIHsgLyogTm9uIEZyYWcgb3IgTGFzdCBGcmFnICovCiAJCQlpZiAoYk5lZWRBY2spIHsKIAkJCQl1QWNrVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlKTsKIAkJCQlyZXR1cm4gcERldmljZS0+dVNJRlMgKyB1QWNrVGltZTsKIAkJCX0gZWxzZSB7CiAJCQkJcmV0dXJuIDA7CiAJCQl9Ci0JCX0gZWxzZSB7IC8vRmlyc3QgRnJhZyBvciBNaWQgRnJhZworCQl9IGVsc2UgeyAvKiBGaXJzdCBGcmFnIG9yIE1pZCBGcmFnICovCiAJCQlpZiAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzApIHsKIAkJCQlpZiAod1JhdGUgPCBSQVRFXzE4TSkKIAkJCQkJd1JhdGUgPSBSQVRFXzE4TTsKQEAgLTM2Myw3ICszNjMsNyBAQAogCQkJCWVsc2UKIAkJCQkJdU5leHRQa3RUaW1lID0gc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd0ZCX09wdDBbRkJfUkFURTFdW3dSYXRlLVJBVEVfMThNXSwgYk5lZWRBY2spOwogCi0JCQl9IGVsc2UgeyAvLyAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzEpCisJCQl9IGVsc2UgeyAvKiAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzEpICovCiAJCQkJaWYgKHdSYXRlIDwgUkFURV8xOE0pCiAJCQkJCXdSYXRlID0gUkFURV8xOE07CiAJCQkJZWxzZSBpZiAod1JhdGUgPiBSQVRFXzU0TSkKQEAgLTM5MSw3ICszOTEsNyBAQAogCXJldHVybiAwOwogfQogCi0vL2J5RnJlcVR5cGU6IDA9PjVHSFogMT0+Mi40R0haCisvKiBieUZyZXFUeXBlOiAwPT41R0haIDE9PjIuNEdIWiAqLwogc3RhdGljCiBfX2xlMTYKIHNfdUdldFJUU0NUU0R1cmF0aW9uKApAQCAtNDA3LDI2ICs0MDcsMjYgQEAKIAl1bnNpZ25lZCBpbnQgdUNUU1RpbWUgPSAwLCB1RHVyVGltZSA9IDA7CiAKIAlzd2l0Y2ggKGJ5RHVyVHlwZSkgewotCWNhc2UgUlRTRFVSX0JCOiAgICAvL1JUU0R1cmF0aW9uX2JiCisJY2FzZSBSVFNEVVJfQkI6ICAgIC8qIFJUU0R1cmF0aW9uX2JiICovCiAJCXVDVFNUaW1lID0gQkJ1R2V0RnJhbWVUaW1lKHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlLCBieVBrdFR5cGUsIDE0LCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSk7CiAJCXVEdXJUaW1lID0gdUNUU1RpbWUgKyAyKnBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd1JhdGUsIGJOZWVkQWNrKTsKIAkJYnJlYWs7CiAKLQljYXNlIFJUU0RVUl9CQTogICAgLy9SVFNEdXJhdGlvbl9iYQorCWNhc2UgUlRTRFVSX0JBOiAgICAvKiBSVFNEdXJhdGlvbl9iYSAqLwogCQl1Q1RTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUpOwogCQl1RHVyVGltZSA9IHVDVFNUaW1lICsgMipwRGV2aWNlLT51U0lGUyArIHNfdUdldFR4UnN2VGltZShwRGV2aWNlLCBieVBrdFR5cGUsIGNiRnJhbWVMZW5ndGgsIHdSYXRlLCBiTmVlZEFjayk7CiAJCWJyZWFrOwogCi0JY2FzZSBSVFNEVVJfQUE6ICAgIC8vUlRTRHVyYXRpb25fYWEKKwljYXNlIFJUU0RVUl9BQTogICAgLyogUlRTRHVyYXRpb25fYWEgKi8KIAkJdUNUU1RpbWUgPSBCQnVHZXRGcmFtZVRpbWUocERldmljZS0+YnlQcmVhbWJsZVR5cGUsIGJ5UGt0VHlwZSwgMTQsIHBEZXZpY2UtPmJ5VG9wT0ZETUJhc2ljUmF0ZSk7CiAJCXVEdXJUaW1lID0gdUNUU1RpbWUgKyAyKnBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd1JhdGUsIGJOZWVkQWNrKTsKIAkJYnJlYWs7CiAKLQljYXNlIENUU0RVUl9CQTogICAgLy9DVFNEdXJhdGlvbl9iYQorCWNhc2UgQ1RTRFVSX0JBOiAgICAvKiBDVFNEdXJhdGlvbl9iYSAqLwogCQl1RHVyVGltZSA9IHBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd1JhdGUsIGJOZWVkQWNrKTsKIAkJYnJlYWs7CiAKLQljYXNlIFJUU0RVUl9CQV9GMDogLy9SVFNEdXJhdGlvbl9iYV9mMAorCWNhc2UgUlRTRFVSX0JBX0YwOiAvKiBSVFNEdXJhdGlvbl9iYV9mMCAqLwogCQl1Q1RTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUpOwogCQlpZiAoKGJ5RkJPcHRpb24gPT0gQVVUT19GQl8wKSAmJiAod1JhdGUgPj0gUkFURV8xOE0pICYmICh3UmF0ZSA8PSBSQVRFXzU0TSkpCiAJCQl1RHVyVGltZSA9IHVDVFNUaW1lICsgMiAqIHBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd0ZCX09wdDBbRkJfUkFURTBdW3dSYXRlLVJBVEVfMThNXSwgYk5lZWRBY2spOwpAQCAtNDM1LDcgKzQzNSw3IEBACiAKIAkJYnJlYWs7CiAKLQljYXNlIFJUU0RVUl9BQV9GMDogLy9SVFNEdXJhdGlvbl9hYV9mMAorCWNhc2UgUlRTRFVSX0FBX0YwOiAvKiBSVFNEdXJhdGlvbl9hYV9mMCAqLwogCQl1Q1RTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlKTsKIAkJaWYgKChieUZCT3B0aW9uID09IEFVVE9fRkJfMCkgJiYgKHdSYXRlID49IFJBVEVfMThNKSAmJiAod1JhdGUgPD0gUkFURV81NE0pKQogCQkJdUR1clRpbWUgPSB1Q1RTVGltZSArIDIqcERldmljZS0+dVNJRlMgKyBzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lTGVuZ3RoLCB3RkJfT3B0MFtGQl9SQVRFMF1bd1JhdGUtUkFURV8xOE1dLCBiTmVlZEFjayk7CkBAIC00NDQsNyArNDQ0LDcgQEAKIAogCQlicmVhazsKIAotCWNhc2UgUlRTRFVSX0JBX0YxOiAvL1JUU0R1cmF0aW9uX2JhX2YxCisJY2FzZSBSVFNEVVJfQkFfRjE6IC8qIFJUU0R1cmF0aW9uX2JhX2YxICovCiAJCXVDVFNUaW1lID0gQkJ1R2V0RnJhbWVUaW1lKHBEZXZpY2UtPmJ5UHJlYW1ibGVUeXBlLCBieVBrdFR5cGUsIDE0LCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSk7CiAJCWlmICgoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzApICYmICh3UmF0ZSA+PSBSQVRFXzE4TSkgJiYgKHdSYXRlIDw9IFJBVEVfNTRNKSkKIAkJCXVEdXJUaW1lID0gdUNUU1RpbWUgKyAyKnBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd0ZCX09wdDBbRkJfUkFURTFdW3dSYXRlLVJBVEVfMThNXSwgYk5lZWRBY2spOwpAQCAtNDUzLDcgKzQ1Myw3IEBACiAKIAkJYnJlYWs7CiAKLQljYXNlIFJUU0RVUl9BQV9GMTogLy9SVFNEdXJhdGlvbl9hYV9mMQorCWNhc2UgUlRTRFVSX0FBX0YxOiAvKiBSVFNEdXJhdGlvbl9hYV9mMSAqLwogCQl1Q1RTVGltZSA9IEJCdUdldEZyYW1lVGltZShwRGV2aWNlLT5ieVByZWFtYmxlVHlwZSwgYnlQa3RUeXBlLCAxNCwgcERldmljZS0+YnlUb3BPRkRNQmFzaWNSYXRlKTsKIAkJaWYgKChieUZCT3B0aW9uID09IEFVVE9fRkJfMCkgJiYgKHdSYXRlID49IFJBVEVfMThNKSAmJiAod1JhdGUgPD0gUkFURV81NE0pKQogCQkJdUR1clRpbWUgPSB1Q1RTVGltZSArIDIqcERldmljZS0+dVNJRlMgKyBzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lTGVuZ3RoLCB3RkJfT3B0MFtGQl9SQVRFMV1bd1JhdGUtUkFURV8xOE1dLCBiTmVlZEFjayk7CkBAIC00NjIsNyArNDYyLDcgQEAKIAogCQlicmVhazsKIAotCWNhc2UgQ1RTRFVSX0JBX0YwOiAvL0NUU0R1cmF0aW9uX2JhX2YwCisJY2FzZSBDVFNEVVJfQkFfRjA6IC8qIENUU0R1cmF0aW9uX2JhX2YwICovCiAJCWlmICgoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzApICYmICh3UmF0ZSA+PSBSQVRFXzE4TSkgJiYgKHdSYXRlIDw9IFJBVEVfNTRNKSkKIAkJCXVEdXJUaW1lID0gcERldmljZS0+dVNJRlMgKyBzX3VHZXRUeFJzdlRpbWUocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lTGVuZ3RoLCB3RkJfT3B0MFtGQl9SQVRFMF1bd1JhdGUtUkFURV8xOE1dLCBiTmVlZEFjayk7CiAJCWVsc2UgaWYgKChieUZCT3B0aW9uID09IEFVVE9fRkJfMSkgJiYgKHdSYXRlID49IFJBVEVfMThNKSAmJiAod1JhdGUgPD0gUkFURV81NE0pKQpAQCAtNDcwLDcgKzQ3MCw3IEBACiAKIAkJYnJlYWs7CiAKLQljYXNlIENUU0RVUl9CQV9GMTogLy9DVFNEdXJhdGlvbl9iYV9mMQorCWNhc2UgQ1RTRFVSX0JBX0YxOiAvKiBDVFNEdXJhdGlvbl9iYV9mMSAqLwogCQlpZiAoKGJ5RkJPcHRpb24gPT0gQVVUT19GQl8wKSAmJiAod1JhdGUgPj0gUkFURV8xOE0pICYmICh3UmF0ZSA8PSBSQVRFXzU0TSkpCiAJCQl1RHVyVGltZSA9IHBEZXZpY2UtPnVTSUZTICsgc191R2V0VHhSc3ZUaW1lKHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZUxlbmd0aCwgd0ZCX09wdDBbRkJfUkFURTFdW3dSYXRlLVJBVEVfMThNXSwgYk5lZWRBY2spOwogCQllbHNlIGlmICgoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCXzEpICYmICh3UmF0ZSA+PSBSQVRFXzE4TSkgJiYgKHdSYXRlIDw9IFJBVEVfNTRNKSkKQEAgLTU2NSw3ICs1NjUsNyBAQAogCQkJYnVmLT50aW1lX3N0YW1wX29mZl9iID0gdm50X3RpbWVfc3RhbXBfb2ZmKHBEZXZpY2UsIHBEZXZpY2UtPmJ5VG9wQ0NLQmFzaWNSYXRlKTsKIAogCQkJcmV0dXJuIGJ1Zi0+ZHVyYXRpb25fYTsKLQkJfSAvL2lmIChieUZCT3B0aW9uID09IEFVVE9fRkJfTk9ORSkKKwkJfSAvKiBpZiAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCX05PTkUpICovCiAJfSBlbHNlIGlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUEpIHsKIAkJaWYgKChieUZCT3B0aW9uICE9IEFVVE9fRkJfTk9ORSkpIHsKIAkJCS8qIEF1dG8gRmFsbGJhY2sgKi8KQEAgLTY1MSwxMyArNjUxLDEzIEBACiAJCXJldHVybjsKIAogCWlmIChiRGlzQ1JDKSB7Ci0JCS8vIFdoZW4gQ1JDRElTIGJpdCBpcyBvbiwgSC9XIGZvcmdvdCB0byBnZW5lcmF0ZSBGQ1MgZm9yIFJUUyBmcmFtZSwKLQkJLy8gaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjcmVhc2UgaXRzIGxlbmd0aCBieSA0LgorCQkvKiBXaGVuIENSQ0RJUyBiaXQgaXMgb24sIEgvVyBmb3Jnb3QgdG8gZ2VuZXJhdGUgRkNTIGZvciBSVFMgZnJhbWUsCisJCSBpbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byBkZWNyZWFzZSBpdHMgbGVuZ3RoIGJ5IDQuICovCiAJCXVSVFNGcmFtZUxlbiAtPSA0OwogCX0KIAotCS8vIE5vdGU6IFNvIGZhciBSVFNIZWFkIGRvc2VuJ3QgYXBwZWFyIGluIEFUSU0gJiBCZWFjb20gRE1BLCBzbyB3ZSBkb24ndCBuZWVkIHRvIHRha2UgdGhlbSBpbnRvIGFjY291bnQuCi0JLy8gICAgICAgT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIG1vZGlmeSBjb2RlcyBmb3IgdGhlbS4KKwkvKiBOb3RlOiBTbyBmYXIgUlRTSGVhZCBkb3Nlbid0IGFwcGVhciBpbiBBVElNICYgQmVhY29tIERNQSwgc28gd2UgZG9uJ3QgbmVlZCB0byB0YWtlIHRoZW0gaW50byBhY2NvdW50LgorCSAgICAgICBPdGhlcndpc2UsIHdlIG5lZWQgdG8gbW9kaWZ5IGNvZGVzIGZvciB0aGVtLiAqLwogCWlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdCIHx8IGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExR0EpIHsKIAkJaWYgKGJ5RkJPcHRpb24gPT0gQVVUT19GQl9OT05FKSB7CiAJCQlzdHJ1Y3Qgdm50X3J0c19nICpidWYgPSBwdlJUUzsKQEAgLTc0OCw3ICs3NDgsNyBAQAogCiAJCQlldGhlcl9hZGRyX2NvcHkoYnVmLT5kYXRhLnJhLCBoZHItPmFkZHIxKTsKIAkJCWV0aGVyX2FkZHJfY29weShidWYtPmRhdGEudGEsIGhkci0+YWRkcjIpOwotCQl9IC8vIGlmIChieUZCT3B0aW9uID09IEFVVE9fRkJfTk9ORSkKKwkJfSAvKiBpZiAoYnlGQk9wdGlvbiA9PSBBVVRPX0ZCX05PTkUpICovCiAJfSBlbHNlIGlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUEpIHsKIAkJaWYgKGJ5RkJPcHRpb24gPT0gQVVUT19GQl9OT05FKSB7CiAJCQlzdHJ1Y3Qgdm50X3J0c19hYiAqYnVmID0gcHZSVFM7CkBAIC04NDMsMTQgKzg0MywxNCBAQAogCQlyZXR1cm47CiAKIAlpZiAoYkRpc0NSQykgewotCQkvLyBXaGVuIENSQ0RJUyBiaXQgaXMgb24sIEgvVyBmb3Jnb3QgdG8gZ2VuZXJhdGUgRkNTIGZvciBDVFMgZnJhbWUsCi0JCS8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGRlY3JlYXNlIGl0cyBsZW5ndGggYnkgNC4KKwkJLyogV2hlbiBDUkNESVMgYml0IGlzIG9uLCBIL1cgZm9yZ290IHRvIGdlbmVyYXRlIEZDUyBmb3IgQ1RTIGZyYW1lLAorCQkgaW4gdGhpcyBjYXNlIHdlIG5lZWQgdG8gZGVjcmVhc2UgaXRzIGxlbmd0aCBieSA0LiAqLwogCQl1Q1RTRnJhbWVMZW4gLT0gNDsKIAl9CiAKIAlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7CiAJCWlmIChieUZCT3B0aW9uICE9IEFVVE9fRkJfTk9ORSAmJiB1RE1BSWR4ICE9IFRZUEVfQVRJTURNQSAmJiB1RE1BSWR4ICE9IFRZUEVfQkVBQ09ORE1BKSB7Ci0JCQkvLyBBdXRvIEZhbGwgYmFjaworCQkJLyogQXV0byBGYWxsIGJhY2sgKi8KIAkJCXN0cnVjdCB2bnRfY3RzX2ZiICpidWYgPSBwdkNUUzsKIAkJCS8qIEdldCBTaWduYWxGaWVsZCwgU2VydmljZUZpZWxkICYgTGVuZ3RoICovCiAJCQl2bnRfZ2V0X3BoeV9maWVsZChwRGV2aWNlLCB1Q1RTRnJhbWVMZW4sCkBAIC04ODgsNyArODg4LDcgQEAKIAogCQkJZXRoZXJfYWRkcl9jb3B5KGJ1Zi0+ZGF0YS5yYSwKIAkJCQkJcERldmljZS0+YWJ5Q3VycmVudE5ldEFkZHIpOwotCQl9IGVsc2UgeyAvL2lmIChieUZCT3B0aW9uICE9IEFVVE9fRkJfTk9ORSAmJiB1RE1BSWR4ICE9IFRZUEVfQVRJTURNQSAmJiB1RE1BSWR4ICE9IFRZUEVfQkVBQ09ORE1BKQorCQl9IGVsc2UgeyAvKiBpZiAoYnlGQk9wdGlvbiAhPSBBVVRPX0ZCX05PTkUgJiYgdURNQUlkeCAhPSBUWVBFX0FUSU1ETUEgJiYgdURNQUlkeCAhPSBUWVBFX0JFQUNPTkRNQSkgKi8KIAkJCXN0cnVjdCB2bnRfY3RzICpidWYgPSBwdkNUUzsKIAkJCS8qIEdldCBTaWduYWxGaWVsZCwgU2VydmljZUZpZWxkICYgTGVuZ3RoICovCiAJCQl2bnRfZ2V0X3BoeV9maWVsZChwRGV2aWNlLCB1Q1RTRnJhbWVMZW4sCkBAIC05MzcsMTQgKzkzNywxNCBAQAogICoKICAqIFJldHVybiBWYWx1ZTogbm9uZQogICoKLSAtKi8KLS8vIHVuc2lnbmVkIGludCBjYkZyYW1lU2l6ZSwvL0hkcitQYXlsb2FkK0ZDUworIC0KKyAqIHVuc2lnbmVkIGludCBjYkZyYW1lU2l6ZSwgSGRyK1BheWxvYWQrRkNTICovCiBzdGF0aWMKIHZvaWQKIHNfdkdlbmVyYXRlVHhQYXJhbWV0ZXIoCiAJc3RydWN0IHZudF9wcml2YXRlICpwRGV2aWNlLAogCXVuc2lnbmVkIGNoYXIgYnlQa3RUeXBlLAotCXZvaWQgKnBUeEJ1ZkhlYWQsCisJc3RydWN0IHZudF90eF9maWZvX2hlYWQgKnR4X2J1ZmZlcl9oZWFkLAogCXZvaWQgKnB2UnJ2VGltZSwKIAl2b2lkICpwdlJUUywKIAl2b2lkICpwdkNUUywKQEAgLTk1NSwyOSArOTU1LDI2IEBACiAJdW5zaWduZWQgc2hvcnQgd0N1cnJlbnRSYXRlCiApCiB7Ci0JdW5zaWduZWQgc2hvcnQgd0ZpZm9DdGw7CisJdTE2IGZpZm9fY3RsID0gbGUxNl90b19jcHUodHhfYnVmZmVyX2hlYWQtPmZpZm9fY3RsKTsKIAlib29sIGJEaXNDUkMgPSBmYWxzZTsKIAl1bnNpZ25lZCBjaGFyIGJ5RkJPcHRpb24gPSBBVVRPX0ZCX05PTkU7CiAKLQlQU1R4QnVmSGVhZCBwRmlmb0hlYWQgPSAoUFNUeEJ1ZkhlYWQpcFR4QnVmSGVhZDsKKwl0eF9idWZmZXJfaGVhZC0+Y3VycmVudF9yYXRlID0gY3B1X3RvX2xlMTYod0N1cnJlbnRSYXRlKTsKIAotCXBGaWZvSGVhZC0+d1Jlc2VydmVkID0gd0N1cnJlbnRSYXRlOwotCXdGaWZvQ3RsID0gcEZpZm9IZWFkLT53RklGT0N0bDsKLQotCWlmICh3Rmlmb0N0bCAmIEZJRk9DVExfQ1JDRElTKQorCWlmIChmaWZvX2N0bCAmIEZJRk9DVExfQ1JDRElTKQogCQliRGlzQ1JDID0gdHJ1ZTsKIAotCWlmICh3Rmlmb0N0bCAmIEZJRk9DVExfQVVUT19GQl8wKQorCWlmIChmaWZvX2N0bCAmIEZJRk9DVExfQVVUT19GQl8wKQogCQlieUZCT3B0aW9uID0gQVVUT19GQl8wOwotCWVsc2UgaWYgKHdGaWZvQ3RsICYgRklGT0NUTF9BVVRPX0ZCXzEpCisJZWxzZSBpZiAoZmlmb19jdGwgJiBGSUZPQ1RMX0FVVE9fRkJfMSkKIAkJYnlGQk9wdGlvbiA9IEFVVE9fRkJfMTsKIAogCWlmICghcHZScnZUaW1lKQogCQlyZXR1cm47CiAKIAlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7Ci0JCWlmIChwdlJUUyAhPSBOVUxMKSB7IC8vUlRTX25lZWQKLQkJCS8qIEZpbGwgUnN2VGltZSAqLworCQlpZiAocHZSVFMgIT0gTlVMTCkgeyAvKiBSVFNfbmVlZAorCQkJIEZpbGwgUnN2VGltZSAqLwogCQkJc3RydWN0IHZudF9ycnZfdGltZV9ydHMgKmJ1ZiA9IHB2UnJ2VGltZTsKIAogCQkJYnVmLT5ydHNfcnJ2X3RpbWVfYWEgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDIsIGJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7CkBAIC05ODcsNDAgKzk4NCw0MCBAQAogCQkJYnVmLT5ycnZfdGltZV9iID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsIFBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwgcERldmljZS0+YnlUb3BDQ0tCYXNpY1JhdGUsIGJOZWVkQUNLKTsKIAogCQkJc192RmlsbFJUU0hlYWQocERldmljZSwgYnlQa3RUeXBlLCBwdlJUUywgY2JGcmFtZVNpemUsIGJOZWVkQUNLLCBiRGlzQ1JDLCBwc0V0aEhlYWRlciwgd0N1cnJlbnRSYXRlLCBieUZCT3B0aW9uKTsKLQkJfSBlbHNlIHsvL1JUU19uZWVkbGVzcywgUENGIG1vZGUKKwkJfSBlbHNlIHsvKiBSVFNfbmVlZGxlc3MsIFBDRiBtb2RlICovCiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX2N0cyAqYnVmID0gcHZScnZUaW1lOwogCiAJCQlidWYtPnJydl90aW1lX2EgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwgYnlQa3RUeXBlLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSyk7CiAJCQlidWYtPnJydl90aW1lX2IgPSB2bnRfcnh0eF9yc3Z0aW1lX2xlMTYocERldmljZSwgUEtfVFlQRV8xMUIsIGNiRnJhbWVTaXplLCBwRGV2aWNlLT5ieVRvcENDS0Jhc2ljUmF0ZSwgYk5lZWRBQ0spOwogCQkJYnVmLT5jdHNfcnJ2X3RpbWVfYmEgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDMsIGJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7CiAKLQkJCS8vRmlsbCBDVFMKKwkJCS8qIEZpbGwgQ1RTICovCiAJCQlzX3ZGaWxsQ1RTSGVhZChwRGV2aWNlLCB1RE1BSWR4LCBieVBrdFR5cGUsIHB2Q1RTLCBjYkZyYW1lU2l6ZSwgYk5lZWRBQ0ssIGJEaXNDUkMsIHdDdXJyZW50UmF0ZSwgYnlGQk9wdGlvbik7CiAJCX0KIAl9IGVsc2UgaWYgKGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExQSkgewotCQlpZiAocHZSVFMgIT0gTlVMTCkgey8vUlRTX25lZWQsIG5vbiBQQ0YgbW9kZQorCQlpZiAocHZSVFMgIT0gTlVMTCkgey8qIFJUU19uZWVkLCBub24gUENGIG1vZGUgKi8KIAkJCXN0cnVjdCB2bnRfcnJ2X3RpbWVfYWIgKmJ1ZiA9IHB2UnJ2VGltZTsKIAogCQkJYnVmLT5ydHNfcnJ2X3RpbWUgPSBzX3VHZXRSVFNDVFNSc3ZUaW1lKHBEZXZpY2UsIDIsIGJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSk7CiAJCQlidWYtPnJydl90aW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsIGJ5UGt0VHlwZSwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spOwogCi0JCQkvL0ZpbGwgUlRTCisJCQkvKiBGaWxsIFJUUyAqLwogCQkJc192RmlsbFJUU0hlYWQocERldmljZSwgYnlQa3RUeXBlLCBwdlJUUywgY2JGcmFtZVNpemUsIGJOZWVkQUNLLCBiRGlzQ1JDLCBwc0V0aEhlYWRlciwgd0N1cnJlbnRSYXRlLCBieUZCT3B0aW9uKTsKLQkJfSBlbHNlIGlmIChwdlJUUyA9PSBOVUxMKSB7Ly9SVFNfbmVlZGxlc3MsIG5vbiBQQ0YgbW9kZQorCQl9IGVsc2UgaWYgKHB2UlRTID09IE5VTEwpIHsvKiBSVFNfbmVlZGxlc3MsIG5vbiBQQ0YgbW9kZSAqLwogCQkJc3RydWN0IHZudF9ycnZfdGltZV9hYiAqYnVmID0gcHZScnZUaW1lOwogCiAJCQlidWYtPnJydl90aW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsIFBLX1RZUEVfMTFBLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSyk7CiAJCX0KIAl9IGVsc2UgaWYgKGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExQikgewotCQlpZiAoKHB2UlRTICE9IE5VTEwpKSB7Ly9SVFNfbmVlZCwgbm9uIFBDRiBtb2RlCisJCWlmICgocHZSVFMgIT0gTlVMTCkpIHsvKiBSVFNfbmVlZCwgbm9uIFBDRiBtb2RlICovCiAJCQlzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiICpidWYgPSBwdlJydlRpbWU7CiAKIAkJCWJ1Zi0+cnRzX3Jydl90aW1lID0gc191R2V0UlRTQ1RTUnN2VGltZShwRGV2aWNlLCAwLCBieVBrdFR5cGUsIGNiRnJhbWVTaXplLCB3Q3VycmVudFJhdGUpOwogCQkJYnVmLT5ycnZfdGltZSA9IHZudF9yeHR4X3JzdnRpbWVfbGUxNihwRGV2aWNlLCBQS19UWVBFXzExQiwgY2JGcmFtZVNpemUsIHdDdXJyZW50UmF0ZSwgYk5lZWRBQ0spOwogCi0JCQkvL0ZpbGwgUlRTCisJCQkvKiBGaWxsIFJUUyAqLwogCQkJc192RmlsbFJUU0hlYWQocERldmljZSwgYnlQa3RUeXBlLCBwdlJUUywgY2JGcmFtZVNpemUsIGJOZWVkQUNLLCBiRGlzQ1JDLCBwc0V0aEhlYWRlciwgd0N1cnJlbnRSYXRlLCBieUZCT3B0aW9uKTsKLQkJfSBlbHNlIHsgLy9SVFNfbmVlZGxlc3MsIG5vbiBQQ0YgbW9kZQorCQl9IGVsc2UgeyAvKiBSVFNfbmVlZGxlc3MsIG5vbiBQQ0YgbW9kZSAqLwogCQkJc3RydWN0IHZudF9ycnZfdGltZV9hYiAqYnVmID0gcHZScnZUaW1lOwogCiAJCQlidWYtPnJydl90aW1lID0gdm50X3J4dHhfcnN2dGltZV9sZTE2KHBEZXZpY2UsIFBLX1RZUEVfMTFCLCBjYkZyYW1lU2l6ZSwgd0N1cnJlbnRSYXRlLCBiTmVlZEFDSyk7CkBAIC0xMDU4LDcgKzEwNTUsNyBAQAogCXZvaWQgKnB2UlRTOwogCXZvaWQgKnB2Q1RTOwogCXZvaWQgKnB2VHhEYXRhSGQ7Ci0JdW5zaWduZWQgc2hvcnQgd1R4QnVmU2l6ZTsgICAvLyBGRmluZm8gc2l6ZQorCXVuc2lnbmVkIHNob3J0IHdUeEJ1ZlNpemU7ICAgLyogRkZpbmZvIHNpemUgKi8KIAl1bnNpZ25lZCBjaGFyIGJ5RkJPcHRpb24gPSBBVVRPX0ZCX05PTkU7CiAKIAlwdlJydlRpbWUgPSBwTUlDSERSID0gcHZSVFMgPSBwdkNUUyA9IHB2VHhEYXRhSGQgPSBOVUxMOwpAQCAtMTA3NiwyNyArMTA3MywyNyBAQAogCQljYkZyYW1lU2l6ZSArPSBpbmZvLT5jb250cm9sLmh3X2tleS0+aWN2X2xlbjsKIAogCQlpZiAocERldmljZS0+YnlMb2NhbElEID4gUkVWX0lEX1ZUMzI1M19BMSkgewotCQkJLy9NQUMgSGVhZGVyIHNob3VsZCBiZSBwYWRkaW5nIDAgdG8gRFcgYWxpZ25tZW50LgorCQkJLyogTUFDIEhlYWRlciBzaG91bGQgYmUgcGFkZGluZyAwIHRvIERXIGFsaWdubWVudC4gKi8KIAkJCXVQYWRkaW5nID0gNCAtIChpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYihza2IpICUgNCk7CiAJCQl1UGFkZGluZyAlPSA0OwogCQl9CiAJfQogCi0JLy8KLQkvLyBVc2UgZm9yIEFVVE8gRkFMTCBCQUNLCi0JLy8KKwkvKgorCSogVXNlIGZvciBBVVRPIEZBTEwgQkFDSworCSovCiAJaWYgKGZpZm9fY3RsICYgRklGT0NUTF9BVVRPX0ZCXzApCiAJCWJ5RkJPcHRpb24gPSBBVVRPX0ZCXzA7CiAJZWxzZSBpZiAoZmlmb19jdGwgJiBGSUZPQ1RMX0FVVE9fRkJfMSkKIAkJYnlGQk9wdGlvbiA9IEFVVE9fRkJfMTsKIAotCS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vU2V0IFJydlRpbWUvUlRTL0NUUyBCdWZmZXIKKworCS8qIFNldCBScnZUaW1lL1JUUy9DVFMgQnVmZmVyICovCiAJd1R4QnVmU2l6ZSA9IHNpemVvZihTVHhCdWZIZWFkKTsKLQlpZiAoYnlQa3RUeXBlID09IFBLX1RZUEVfMTFHQiB8fCBieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdBKSB7Ly84MDIuMTFnIHBhY2tldAorCWlmIChieVBrdFR5cGUgPT0gUEtfVFlQRV8xMUdCIHx8IGJ5UGt0VHlwZSA9PSBQS19UWVBFXzExR0EpIHsvKiA4MDIuMTFnIHBhY2tldCAqLwogCiAJCWlmIChieUZCT3B0aW9uID09IEFVVE9fRkJfTk9ORSkgewotCQkJaWYgKGJSVFMgPT0gdHJ1ZSkgey8vUlRTX25lZWQKKwkJCWlmIChiUlRTID09IHRydWUpIHsvKiBSVFNfbmVlZCAqLwogCQkJCXB2UnJ2VGltZSA9ICh2b2lkICopKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUpOwogCQkJCXBNSUNIRFIgPSAoc3RydWN0IHZudF9taWNfaGRyICopKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9ydHMpKTsKIAkJCQlwdlJUUyA9ICh2b2lkICopKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9ydHMpICsgY2JNSUNIRFIpOwpAQCAtMTEwNiw3ICsxMTAzLDcgQEAKIAkJCQljYkhlYWRlckxlbmd0aCA9IHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9ydHMpICsKIAkJCQkJCQljYk1JQ0hEUiArIHNpemVvZihzdHJ1Y3Qgdm50X3J0c19nKSArCiAJCQkJCQkJc2l6ZW9mKHN0cnVjdCB2bnRfdHhfZGF0YWhlYWRfZyk7Ci0JCQl9IGVsc2UgeyAvL1JUU19uZWVkbGVzcworCQkJfSBlbHNlIHsgLyogUlRTX25lZWRsZXNzICovCiAJCQkJcHZScnZUaW1lID0gKHZvaWQgKikocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSk7CiAJCQkJcE1JQ0hEUiA9IChzdHJ1Y3Qgdm50X21pY19oZHIgKikgKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9jdHMpKTsKIAkJCQlwdlJUUyA9IE5VTEw7CkBAIC0xMTE3LDggKzExMTQsOCBAQAogCQkJCQkJCWNiTUlDSERSICsgc2l6ZW9mKHN0cnVjdCB2bnRfY3RzKSArIHNpemVvZihzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2cpOwogCQkJfQogCQl9IGVsc2UgewotCQkJLy8gQXV0byBGYWxsIEJhY2sKLQkJCWlmIChiUlRTID09IHRydWUpIHsvL1JUU19uZWVkCisJCQkvKiBBdXRvIEZhbGwgQmFjayAqLworCQkJaWYgKGJSVFMgPT0gdHJ1ZSkgey8qIFJUU19uZWVkICovCiAJCQkJcHZScnZUaW1lID0gKHZvaWQgKikocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSk7CiAJCQkJcE1JQ0hEUiA9IChzdHJ1Y3Qgdm50X21pY19oZHIgKikgKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9ydHMpKTsKIAkJCQlwdlJUUyA9ICh2b2lkICopIChwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplICsgc2l6ZW9mKHN0cnVjdCB2bnRfcnJ2X3RpbWVfcnRzKSArIGNiTUlDSERSKTsKQEAgLTExMjcsNyArMTEyNCw3IEBACiAJCQkJCWNiTUlDSERSICsgc2l6ZW9mKHN0cnVjdCB2bnRfcnRzX2dfZmIpKTsKIAkJCQljYkhlYWRlckxlbmd0aCA9IHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9ydHMpICsKIAkJCQkJY2JNSUNIRFIgKyBzaXplb2Yoc3RydWN0IHZudF9ydHNfZ19mYikgKyBzaXplb2Yoc3RydWN0IHZudF90eF9kYXRhaGVhZF9nX2ZiKTsKLQkJCX0gZWxzZSB7IC8vUlRTX25lZWRsZXNzCisJCQl9IGVsc2UgeyAvKiBSVFNfbmVlZGxlc3MgKi8KIAkJCQlwdlJydlRpbWUgPSAodm9pZCAqKShwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplKTsKIAkJCQlwTUlDSERSID0gKHN0cnVjdCB2bnRfbWljX2hkciAqKSAocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSArIHNpemVvZihzdHJ1Y3Qgdm50X3Jydl90aW1lX2N0cykpOwogCQkJCXB2UlRTID0gTlVMTDsKQEAgLTExMzcsOCArMTEzNCw4IEBACiAJCQkJY2JIZWFkZXJMZW5ndGggPSB3VHhCdWZTaXplICsgc2l6ZW9mKHN0cnVjdCB2bnRfcnJ2X3RpbWVfY3RzKSArCiAJCQkJCWNiTUlDSERSICsgc2l6ZW9mKHN0cnVjdCB2bnRfY3RzX2ZiKSArIHNpemVvZihzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2dfZmIpOwogCQkJfQotCQl9IC8vIEF1dG8gRmFsbCBCYWNrCi0JfSBlbHNlIHsvLzgwMi4xMWEvYiBwYWNrZXQKKwkJfSAvKiBBdXRvIEZhbGwgQmFjayAqLworCX0gZWxzZSB7LyogODAyLjExYS9iIHBhY2tldCAqLwogCiAJCWlmIChieUZCT3B0aW9uID09IEFVVE9fRkJfTk9ORSkgewogCQkJaWYgKGJSVFMgPT0gdHJ1ZSkgewpAQCAtMTE1MCw3ICsxMTQ3LDcgQEAKIAkJCQkJc2l6ZW9mKHN0cnVjdCB2bnRfcnJ2X3RpbWVfYWIpICsgY2JNSUNIRFIgKyBzaXplb2Yoc3RydWN0IHZudF9ydHNfYWIpKTsKIAkJCQljYkhlYWRlckxlbmd0aCA9IHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9hYikgKwogCQkJCQljYk1JQ0hEUiArIHNpemVvZihzdHJ1Y3Qgdm50X3J0c19hYikgKyBzaXplb2Yoc3RydWN0IHZudF90eF9kYXRhaGVhZF9hYik7Ci0JCQl9IGVsc2UgeyAvL1JUU19uZWVkbGVzcywgbmVlZCBNSUNIRFIKKwkJCX0gZWxzZSB7IC8qIFJUU19uZWVkbGVzcywgbmVlZCBNSUNIRFIgKi8KIAkJCQlwdlJydlRpbWUgPSAodm9pZCAqKShwYnlUeEJ1ZmZlckFkZHIgKyB3VHhCdWZTaXplKTsKIAkJCQlwTUlDSERSID0gKHN0cnVjdCB2bnRfbWljX2hkciAqKSAocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSArIHNpemVvZihzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiKSk7CiAJCQkJcHZSVFMgPSBOVUxMOwpAQCAtMTE2MCw4ICsxMTU3LDggQEAKIAkJCQkJY2JNSUNIRFIgKyBzaXplb2Yoc3RydWN0IHZudF90eF9kYXRhaGVhZF9hYik7CiAJCQl9CiAJCX0gZWxzZSB7Ci0JCQkvLyBBdXRvIEZhbGwgQmFjawotCQkJaWYgKGJSVFMgPT0gdHJ1ZSkgey8vUlRTX25lZWQKKwkJCS8qIEF1dG8gRmFsbCBCYWNrICovCisJCQlpZiAoYlJUUyA9PSB0cnVlKSB7IC8qIFJUU19uZWVkICovCiAJCQkJcHZScnZUaW1lID0gKHZvaWQgKikocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSk7CiAJCQkJcE1JQ0hEUiA9IChzdHJ1Y3Qgdm50X21pY19oZHIgKikgKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9hYikpOwogCQkJCXB2UlRTID0gKHZvaWQgKikocGJ5VHhCdWZmZXJBZGRyICsgd1R4QnVmU2l6ZSArIHNpemVvZihzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiKSArIGNiTUlDSERSKTsKQEAgLTExNzAsNyArMTE2Nyw3IEBACiAJCQkJCXNpemVvZihzdHJ1Y3Qgdm50X3Jydl90aW1lX2FiKSArIGNiTUlDSERSICsgc2l6ZW9mKHN0cnVjdCB2bnRfcnRzX2FfZmIpKTsKIAkJCQljYkhlYWRlckxlbmd0aCA9IHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9hYikgKwogCQkJCQljYk1JQ0hEUiArIHNpemVvZihzdHJ1Y3Qgdm50X3J0c19hX2ZiKSArIHNpemVvZihzdHJ1Y3Qgdm50X3R4X2RhdGFoZWFkX2FfZmIpOwotCQkJfSBlbHNlIHsgLy9SVFNfbmVlZGxlc3MKKwkJCX0gZWxzZSB7IC8qIFJUU19uZWVkbGVzcyAqLwogCQkJCXB2UnJ2VGltZSA9ICh2b2lkICopKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUpOwogCQkJCXBNSUNIRFIgPSAoc3RydWN0IHZudF9taWNfaGRyICopKHBieVR4QnVmZmVyQWRkciArIHdUeEJ1ZlNpemUgKyBzaXplb2Yoc3RydWN0IHZudF9ycnZfdGltZV9hYikpOwogCQkJCXB2UlRTID0gTlVMTDsKQEAgLTExNzksNyArMTE3Niw3IEBACiAJCQkJY2JIZWFkZXJMZW5ndGggPSB3VHhCdWZTaXplICsgc2l6ZW9mKHN0cnVjdCB2bnRfcnJ2X3RpbWVfYWIpICsKIAkJCQkJY2JNSUNIRFIgKyBzaXplb2Yoc3RydWN0IHZudF90eF9kYXRhaGVhZF9hX2ZiKTsKIAkJCX0KLQkJfSAvLyBBdXRvIEZhbGwgQmFjaworCQl9IC8qIEF1dG8gRmFsbCBCYWNrICovCiAJfQogCiAJdGRfaW5mby0+bWljX2hkciA9IHBNSUNIRFI7CkBAIC0xMzA4LDEwICsxMzA1LDE4IEBACiAJCQkgICAgcHJpdi0+aHctPmNvbmYuY2hhbmRlZi5jaGFuLT5od192YWx1ZSk7CiAJfQogCi0JaWYgKGN1cnJlbnRfcmF0ZSA+IFJBVEVfMTFNKQotCQlwa3RfdHlwZSA9ICh1OClwcml2LT5ieVBhY2tldFR5cGU7Ci0JZWxzZQorCWlmIChjdXJyZW50X3JhdGUgPiBSQVRFXzExTSkgeworCQlpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCQlwa3RfdHlwZSA9IFBLX1RZUEVfMTFBOworCQl9IGVsc2UgeworCQkJaWYgKHR4X3JhdGUtPmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCkKKwkJCQlwa3RfdHlwZSA9IFBLX1RZUEVfMTFHQjsKKwkJCWVsc2UKKwkJCQlwa3RfdHlwZSA9IFBLX1RZUEVfMTFHQTsKKwkJfQorCX0gZWxzZSB7CiAJCXBrdF90eXBlID0gUEtfVFlQRV8xMUI7CisJfQogCiAJLypTZXQgZmlmbyBjb250cm9scyAqLwogCWlmIChwa3RfdHlwZSA9PSBQS19UWVBFXzExQSkKQEAgLTE1MDUsOCArMTUxMCw2IEBACiBpbnQgdm50X2JlYWNvbl9lbmFibGUoc3RydWN0IHZudF9wcml2YXRlICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpjb25mKQogewotCWludCByZXQ7Ci0KIAlWTlN2T3V0UG9ydEIocHJpdi0+UG9ydE9mZnNldCArIE1BQ19SRUdfVEZUQ1RMLCBURlRDVExfVFNGQ05UUlNUKTsKIAogCVZOU3ZPdXRQb3J0Qihwcml2LT5Qb3J0T2Zmc2V0ICsgTUFDX1JFR19URlRDVEwsIFRGVENUTF9UU0ZDTlRSRU4pOwpAQCAtMTUxNSw3ICsxNTE4LDUgQEAKIAogCUNBUkRiU2V0QmVhY29uUGVyaW9kKHByaXYsIGNvbmYtPmJlYWNvbl9pbnQpOwogCi0JcmV0ID0gdm50X2JlYWNvbl9tYWtlKHByaXYsIHZpZik7Ci0KLQlyZXR1cm4gcmV0OworCXJldHVybiB2bnRfYmVhY29uX21ha2UocHJpdiwgdmlmKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvc3JvbS5oIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9zcm9tLmgKaW5kZXggN2QzZTNlZi4uNTMxYmYwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9zcm9tLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS9zcm9tLmgKQEAgLTI0LDcgKzI0LDYgQEAKICAqIEF1dGhvcjogSmVycnkgQ2hlbgogICoKICAqIERhdGU6IEphbiAyOSwgMjAwMwotICoKICAqLwogCiAjaWZuZGVmIF9fU1JPTV9IX18KQEAgLTM0LDU2ICszMyw1MCBAQAogCiAjZGVmaW5lIEVFUF9NQVhfQ09OVEVYVF9TSVpFICAgIDI1NgogCi0jZGVmaW5lIENCX0VFUFJPTV9SRUFEQllURV9XQUlUIDkwMCAgICAgLy91cworI2RlZmluZSBDQl9FRVBST01fUkVBREJZVEVfV0FJVCA5MDAgICAgIC8qIHVzICovCiAKICNkZWZpbmUgV19NQVhfSTJDUkVUUlkgICAgICAgICAgMHgwZmZmCiAKLS8vCi0vLyBDb250ZW50cyBpbiB0aGUgRUVQUk9NCi0vLwotI2RlZmluZSBFRVBfT0ZTX1BBUiAgICAgICAgIDB4MDAgICAgICAgIC8vIHBoeXNpY2FsIGFkZHJlc3MKKy8qIENvbnRlbnRzIGluIHRoZSBFRVBST00gKi8KKyNkZWZpbmUgRUVQX09GU19QQVIgICAgICAgICAweDAwICAgICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzICovCiAjZGVmaW5lIEVFUF9PRlNfQU5URU5OQSAgICAgMHgxNgogI2RlZmluZSBFRVBfT0ZTX1JBRElPQ1RMICAgIDB4MTcKLSNkZWZpbmUgRUVQX09GU19SRlRZUEUgICAgICAweDFCICAgICAgICAvLyBmb3Igc2VsZWN0IFJGCi0jZGVmaW5lIEVFUF9PRlNfTUlOQ0hBTk5FTCAgMHgxQyAgICAgICAgLy8gTWluIENoYW5uZWwgIwotI2RlZmluZSBFRVBfT0ZTX01BWENIQU5ORUwgIDB4MUQgICAgICAgIC8vIE1heCBDaGFubmVsICMKLSNkZWZpbmUgRUVQX09GU19TSUdOQVRVUkUgICAweDFFICAgICAgICAvLwotI2RlZmluZSBFRVBfT0ZTX1pPTkVUWVBFICAgIDB4MUYgICAgICAgIC8vCi0jZGVmaW5lIEVFUF9PRlNfUkZUQUJMRSAgICAgMHgyMCAgICAgICAgLy8gUkYgUE9XRVIgVEFCTEUKKyNkZWZpbmUgRUVQX09GU19SRlRZUEUgICAgICAweDFCICAgICAgICAvKiBmb3Igc2VsZWN0IFJGICovCisjZGVmaW5lIEVFUF9PRlNfTUlOQ0hBTk5FTCAgMHgxQyAgICAgICAgLyogTWluIENoYW5uZWwgIyAqLworI2RlZmluZSBFRVBfT0ZTX01BWENIQU5ORUwgIDB4MUQgICAgICAgIC8qIE1heCBDaGFubmVsICMgKi8KKyNkZWZpbmUgRUVQX09GU19TSUdOQVRVUkUgICAweDFFCisjZGVmaW5lIEVFUF9PRlNfWk9ORVRZUEUgICAgMHgxRgorI2RlZmluZSBFRVBfT0ZTX1JGVEFCTEUgICAgIDB4MjAgICAgICAgIC8qIFJGIFBPV0VSIFRBQkxFICovCiAjZGVmaW5lIEVFUF9PRlNfUFdSX0NDSyAgICAgMHgyMAogI2RlZmluZSBFRVBfT0ZTX1NFVFBUX0NDSyAgIDB4MjEKICNkZWZpbmUgRUVQX09GU19QV1JfT0ZETUcgICAweDIzCiAjZGVmaW5lIEVFUF9PRlNfU0VUUFRfT0ZETUcgMHgyNAotI2RlZmluZSBFRVBfT0ZTX1BXUl9GT1JNVUxBX09TVCAgMHgyNiAgIC8vCisjZGVmaW5lIEVFUF9PRlNfUFdSX0ZPUk1VTEFfT1NUICAweDI2CiAjZGVmaW5lIEVFUF9PRlNfTUFKT1JfVkVSIDB4MkUKICNkZWZpbmUgRUVQX09GU19NSU5PUl9WRVIgMHgyRgogI2RlZmluZSBFRVBfT0ZTX0NDS19QV1JfVEJMICAgICAweDMwCiAjZGVmaW5lIEVFUF9PRlNfQ0NLX1BXUl9kQm0gICAgIDB4M0YKICNkZWZpbmUgRUVQX09GU19PRkRNX1BXUl9UQkwgICAgMHg0MAogI2RlZmluZSBFRVBfT0ZTX09GRE1fUFdSX2RCbSAgICAweDRGCi0vL3t7IFJvYmVydFl1OiAyMDA0MTEyNAorLyp7eyBSb2JlcnRZdTogMjAwNDExMjQgKi8KICNkZWZpbmUgRUVQX09GU19TRVRQVF9PRkRNQSAgICAgICAgIDB4NEUKICNkZWZpbmUgRUVQX09GU19PRkRNQV9QV1JfVEJMICAgICAgIDB4NTAKLS8vfX0KKy8qfX0qLwogI2RlZmluZSBFRVBfT0ZTX09GRE1BX1BXUl9kQm0gICAgICAgMHhEMgogCi0vLy0tLS0tLS0tLS1uZWVkIHRvIHJlbW92ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLQotI2RlZmluZSBFRVBfT0ZTX0JCVEFCX0xFTiAgIDB4NzAgICAgICAgIC8vIEJCIFRhYmxlIExlbmd0aAotI2RlZmluZSBFRVBfT0ZTX0JCVEFCX0FEUiAgIDB4NzEgICAgICAgIC8vIEJCIFRhYmxlIE9mZnNldAotI2RlZmluZSBFRVBfT0ZTX0NIRUNLU1VNICAgIDB4RkYgICAgICAgIC8vIHJlc2VydmVkIGFyZWEgZm9yIGJhc2ViYW5kIDI4aCB+IDc4aAorLyotLS0tLS0tLS0tbmVlZCB0byByZW1vdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBFRVBfT0ZTX0JCVEFCX0xFTiAgIDB4NzAgICAgICAgIC8qIEJCIFRhYmxlIExlbmd0aCAqLworI2RlZmluZSBFRVBfT0ZTX0JCVEFCX0FEUiAgIDB4NzEgICAgICAgIC8qIEJCIFRhYmxlIE9mZnNldCAqLworI2RlZmluZSBFRVBfT0ZTX0NIRUNLU1VNICAgIDB4RkYgICAgICAgIC8qIHJlc2VydmVkIGFyZWEgZm9yIGJhc2ViYW5kIDI4aH43OGggKi8KIAotI2RlZmluZSBFRVBfSTJDX0RFVl9JRCAgICAgIDB4NTAgICAgICAgIC8vIEVFUFJPTSBkZXZpY2UgYWRkcmVzcyBvbiB0aGUgSTJDIGJ1cworI2RlZmluZSBFRVBfSTJDX0RFVl9JRCAgICAgIDB4NTAgICAgICAgIC8qIEVFUFJPTSBkZXZpY2UgYWRkcmVzcyBvbiBJMkMgYnVzICovCiAKLS8vCi0vLyBCaXRzIGluIEVFUF9PRlNfQU5URU5OQQotLy8KKy8qIEJpdHMgaW4gRUVQX09GU19BTlRFTk5BICovCiAjZGVmaW5lIEVFUF9BTlRFTk5BX01BSU4gICAgMHgwMQogI2RlZmluZSBFRVBfQU5URU5OQV9BVVggICAgIDB4MDIKICNkZWZpbmUgRUVQX0FOVElOViAgICAgICAgICAweDA0CiAKLS8vCi0vLyBCaXRzIGluIEVFUF9PRlNfUkFESU9DVEwKLS8vCisvKiBCaXRzIGluIEVFUF9PRlNfUkFESU9DVEwgKi8KICNkZWZpbmUgRUVQX1JBRElPQ1RMX0VOQUJMRSAweDgwCiAjZGVmaW5lIEVFUF9SQURJT0NUTF9JTlYgICAgMHgwMQogCkBAIC05NywxMCArOTAsMTIgQEAKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gIEV4cG9ydCBGdW5jdGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotdW5zaWduZWQgY2hhciBTUk9NYnlSZWFkRW1iZWRkZWQodm9pZCBfX2lvbWVtICpkd0lvQmFzZSwgdW5zaWduZWQgY2hhciBieUNvbnRudE9mZnNldCk7Cit1bnNpZ25lZCBjaGFyIFNST01ieVJlYWRFbWJlZGRlZCh2b2lkIF9faW9tZW0gKmR3SW9CYXNlLAorCQkJCSB1bnNpZ25lZCBjaGFyIGJ5Q29udG50T2Zmc2V0KTsKIAogdm9pZCBTUk9NdlJlYWRBbGxDb250ZW50cyh2b2lkIF9faW9tZW0gKmR3SW9CYXNlLCB1bnNpZ25lZCBjaGFyICpwYnlFZXByb21SZWdzKTsKIAotdm9pZCBTUk9NdlJlYWRFdGhlckFkZHJlc3Modm9pZCBfX2lvbWVtICpkd0lvQmFzZSwgdW5zaWduZWQgY2hhciAqcGJ5RXRoZXJBZGRyZXNzKTsKK3ZvaWQgU1JPTXZSZWFkRXRoZXJBZGRyZXNzKHZvaWQgX19pb21lbSAqZHdJb0Jhc2UsCisJCQkgICB1bnNpZ25lZCBjaGFyICpwYnlFdGhlckFkZHJlc3MpOwogCi0jZW5kaWYgLy8gX19FRVBST01fSF9fCisjZW5kaWYgLyogX19FRVBST01fSF9fKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdG1hY3JvLmggYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU1L3RtYWNyby5oCmluZGV4IDYwN2I3OGYuLjU5N2VmZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTUvdG1hY3JvLmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1NS90bWFjcm8uaApAQCAtNTUsNCArNTUsNCBAQAogI2RlZmluZSBNQUtFRFdPUkQobHcsIGh3KSAgICgodW5zaWduZWQgbG9uZykoKCh1bnNpZ25lZCBzaG9ydCkobHcpKSB8ICgoKHVuc2lnbmVkIGxvbmcpKCh1bnNpZ25lZCBzaG9ydCkoaHcpKSkgPDwgMTYpKSkKICNlbmRpZgogCi0jZW5kaWYgLy8gX19UTUFDUk9fSF9fCisjZW5kaWYgLyogX19UTUFDUk9fSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Zpcm13YXJlLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L2Zpcm13YXJlLmMKaW5kZXggYTE3NzY0NS4uZDQ0MGYyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9maXJtd2FyZS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvZmlybXdhcmUuYwpAQCAtNjEsNyArNjEsNyBAQAogCiAJYnVmZmVyID0ga21hbGxvYyhGSVJNV0FSRV9DSFVOS19TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWJ1ZmZlcikKLQkJZ290byBvdXQ7CisJCWdvdG8gZnJlZV9mdzsKIAogCWZvciAoaWkgPSAwOyBpaSA8IGZ3LT5zaXplOyBpaSArPSBGSVJNV0FSRV9DSFVOS19TSVpFKSB7CiAJCWxlbmd0aCA9IG1pbl90KGludCwgZnctPnNpemUgLSBpaSwgRklSTVdBUkVfQ0hVTktfU0laRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5jIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWMuYwppbmRleCBiYjM3ZTMzLi41ZGZhYzA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21hYy5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFjLmMKQEAgLTMwLDYgKzMwLDggQEAKICAqIFJldmlzaW9uIEhpc3Rvcnk6CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisKICNpbmNsdWRlICJkZXNjLmgiCiAjaW5jbHVkZSAibWFjLmgiCiAjaW5jbHVkZSAidXNicGlwZS5oIgpAQCAtMTI2LDcgKzEyOCw3IEBACiAJb2Zmc2V0ICs9IChlbnRyeV9pZHggKiBNSVNDRklGT19LRVlFTlRSWVNJWkUpOwogCiAJc2V0X2tleS51LndyaXRlLmtleV9jdGwgPSBjcHVfdG9fbGUxNihrZXlfY3RsKTsKLQltZW1jcHkoc2V0X2tleS51LndyaXRlLmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKKwlldGhlcl9hZGRyX2NvcHkoc2V0X2tleS51LndyaXRlLmFkZHIsIGFkZHIpOwogCiAJLyogc3dhcCBvdmVyIHN3YXBbMF0gYW5kIHN3YXBbMV0gdG8gZ2V0IGNvcnJlY3Qgd3JpdGUgb3JkZXIgKi8KIAlzd2FwKHNldF9rZXkudS5zd2FwWzBdLCBzZXRfa2V5LnUuc3dhcFsxXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L21haW5fdXNiLmMKaW5kZXggNzFhZGMxZi4uYWIzYWI4NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9tYWluX3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvbWFpbl91c2IuYwpAQCAtOTYzLDYgKzk2Myw3IEBACiAJaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCB2bnRfcHJpdmF0ZSksICZ2bnRfbWFjX29wcyk7CiAJaWYgKCFodykgewogCQlkZXZfZXJyKCZ1ZGV2LT5kZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgaWVlZTgwMjExX2h3XG4iKTsKKwkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9ub21lbTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcmYuYyBiL2RyaXZlcnMvc3RhZ2luZy92dDY2NTYvcmYuYwppbmRleCBjNDJjZGU1Li5jNDI4NmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3JmLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yZi5jCkBAIC02NDAsNiArNjQwLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBSQVRFXzZNOgogCWNhc2UgUkFURV85TToKKwljYXNlIFJBVEVfMTJNOgogCWNhc2UgUkFURV8xOE06CiAJY2FzZSBSQVRFXzI0TToKIAljYXNlIFJBVEVfMzZNOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3Z0NjY1Ni9yeHR4LmMgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYwppbmRleCAzM2JhZjI2Li5mNmMyY2Y4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdnQ2NjU2L3J4dHguYwpAQCAtNzU1LDkgKzc1NSw5IEBACiAJCWVsc2UKIAkJCW1pY19oZHItPmhsZW4gPSBjcHVfdG9fYmUxNigyMik7CiAKLQkJbWVtY3B5KG1pY19oZHItPmFkZHIxLCBoZHItPmFkZHIxLCBFVEhfQUxFTik7Ci0JCW1lbWNweShtaWNfaGRyLT5hZGRyMiwgaGRyLT5hZGRyMiwgRVRIX0FMRU4pOwotCQltZW1jcHkobWljX2hkci0+YWRkcjMsIGhkci0+YWRkcjMsIEVUSF9BTEVOKTsKKwkJZXRoZXJfYWRkcl9jb3B5KG1pY19oZHItPmFkZHIxLCBoZHItPmFkZHIxKTsKKwkJZXRoZXJfYWRkcl9jb3B5KG1pY19oZHItPmFkZHIyLCBoZHItPmFkZHIyKTsKKwkJZXRoZXJfYWRkcl9jb3B5KG1pY19oZHItPmFkZHIzLCBoZHItPmFkZHIzKTsKIAogCQltaWNfaGRyLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoCiAJCQlsZTE2X3RvX2NwdShoZHItPmZyYW1lX2NvbnRyb2wpICYgMHhjNzhmKTsKQEAgLTc2NSw3ICs3NjUsNyBAQAogCQkJCWxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpICYgMHhmKTsKIAogCQlpZiAoaWVlZTgwMjExX2hhc19hNChoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJbWVtY3B5KG1pY19oZHItPmFkZHI0LCBoZHItPmFkZHI0LCBFVEhfQUxFTik7CisJCQlldGhlcl9hZGRyX2NvcHkobWljX2hkci0+YWRkcjQsIGhkci0+YWRkcjQpOwogCiAKIAkJbWVtY3B5KGtleV9idWZmZXIsIHR4X2tleS0+a2V5LCBXTEFOX0tFWV9MRU5fQ0NNUCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmggYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4LmgKaW5kZXggOGYyMDkxMC4uOGRmZTQzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eC5oCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHguaApAQCAtMTIwNCwxOSArMTIwNCwxOSBAQAogI2RlZmluZSBXTEFOX0FDQ0VTU19ERU5ZCTMgICAvKiBEbyBub3QgYXV0aGVudGljYXRlICJkZW5pZWQiIHN0YXRpb25zLiAqLwogCiAvKiBYWFggVGhlc2UgYXJlIGdvaW5nIGF3YXkgQVNBUCAqLwotdHlwZWRlZiBzdHJ1Y3QgcHJpc20yc3RhX2F1dGhsaXN0IHsKK3N0cnVjdCBwcmlzbTJzdGFfYXV0aGxpc3QgewogCXVuc2lnbmVkIGludCBjbnQ7CiAJdTggYWRkcltXTEFOX0FVVEhfTUFYXVtFVEhfQUxFTl07CiAJdTggYXNzb2NbV0xBTl9BVVRIX01BWF07Ci19IHByaXNtMnN0YV9hdXRobGlzdF90OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgcHJpc20yc3RhX2FjY2Vzc2xpc3Qgeworc3RydWN0IHByaXNtMnN0YV9hY2Nlc3NsaXN0IHsKIAl1bnNpZ25lZCBpbnQgbW9kaWZ5OwogCXVuc2lnbmVkIGludCBjbnQ7CiAJdTggYWRkcltXTEFOX0FDQ0VTU19NQVhdW0VUSF9BTEVOXTsKIAl1bnNpZ25lZCBpbnQgY250MTsKIAl1OCBhZGRyMVtXTEFOX0FDQ0VTU19NQVhdW0VUSF9BTEVOXTsKLX0gcHJpc20yc3RhX2FjY2Vzc2xpc3RfdDsKK307CiAKIHR5cGVkZWYgc3RydWN0IGhmYTM4NHggewogCS8qIFVTQiBzdXBwb3J0IGRhdGEgKi8KQEAgLTEzNDgsMTAgKzEzNDgsMTAgQEAKIAogCWhmYTM4NHhfSW5mRnJhbWVfdCAqc2NhbnJlc3VsdHM7CiAKLQlwcmlzbTJzdGFfYXV0aGxpc3RfdCBhdXRobGlzdDsJLyogQXV0aGVudGljYXRlZCBzdGF0aW9uIGxpc3QuICovCi0JdW5zaWduZWQgaW50IGFjY2Vzc21vZGU7CS8qIEFjY2VzcyBtb2RlLiAqLwotCXByaXNtMnN0YV9hY2Nlc3NsaXN0X3QgYWxsb3c7CS8qIEFsbG93ZWQgc3RhdGlvbiBsaXN0LiAqLwotCXByaXNtMnN0YV9hY2Nlc3NsaXN0X3QgZGVueTsJLyogRGVuaWVkIHN0YXRpb24gbGlzdC4gKi8KKwlzdHJ1Y3QgcHJpc20yc3RhX2F1dGhsaXN0IGF1dGhsaXN0OwkvKiBBdXRoZW50aWNhdGVkIHN0YXRpb24gbGlzdC4gKi8KKwl1bnNpZ25lZCBpbnQgYWNjZXNzbW9kZTsJCS8qIEFjY2VzcyBtb2RlLiAqLworCXN0cnVjdCBwcmlzbTJzdGFfYWNjZXNzbGlzdCBhbGxvdzsJLyogQWxsb3dlZCBzdGF0aW9uIGxpc3QuICovCisJc3RydWN0IHByaXNtMnN0YV9hY2Nlc3NsaXN0IGRlbnk7CS8qIERlbmllZCBzdGF0aW9uIGxpc3QuICovCiAKIH0gaGZhMzg0eF90OwogCkBAIC0xNDEzLDcgKzE0MTMsOCBAQAogaW50IGhmYTM4NHhfZHJ2cl9zdG9wKGhmYTM4NHhfdCAqaHcpOwogaW50CiBoZmEzODR4X2RydnJfdHhmcmFtZShoZmEzODR4X3QgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIHVuaW9uIHA4MDIxMV9oZHIgKnA4MDIxMV9oZHIsIHN0cnVjdCBwODAyMTFfbWV0YXdlcCAqcDgwMjExX3dlcCk7CisJCSAgICAgdW5pb24gcDgwMjExX2hkciAqcDgwMjExX2hkciwKKwkJICAgICBzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgKnA4MDIxMV93ZXApOwogdm9pZCBoZmEzODR4X3R4X3RpbWVvdXQod2xhbmRldmljZV90ICp3bGFuZGV2KTsKIAogaW50IGhmYTM4NHhfY21kX2luaXRpYWxpemUoaGZhMzg0eF90ICpodyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvaGZhMzg0eF91c2IuYwppbmRleCAyOGNkMWM0Li5lMTA5YTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9oZmEzODR4X3VzYi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL2hmYTM4NHhfdXNiLmMKQEAgLTU1NywxNyArNTU3LDEzIEBACiAJSU5JVF9XT1JLKCZody0+bGlua19iaCwgcHJpc20yc3RhX3Byb2Nlc3NpbmdfZGVmZXIpOwogCUlOSVRfV09SSygmaHctPnVzYl93b3JrLCBoZmEzODR4X3VzYl9kZWZlcik7CiAKLQlpbml0X3RpbWVyKCZody0+dGhyb3R0bGUpOwotCWh3LT50aHJvdHRsZS5mdW5jdGlvbiA9IGhmYTM4NHhfdXNiX3Rocm90dGxlZm47Ci0JaHctPnRocm90dGxlLmRhdGEgPSAodW5zaWduZWQgbG9uZylodzsKKwlzZXR1cF90aW1lcigmaHctPnRocm90dGxlLCBoZmEzODR4X3VzYl90aHJvdHRsZWZuLCAodW5zaWduZWQgbG9uZylodyk7CiAKLQlpbml0X3RpbWVyKCZody0+cmVzcHRpbWVyKTsKLQlody0+cmVzcHRpbWVyLmZ1bmN0aW9uID0gaGZhMzg0eF91c2JjdGx4X3Jlc3B0aW1lcmZuOwotCWh3LT5yZXNwdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWh3OworCXNldHVwX3RpbWVyKCZody0+cmVzcHRpbWVyLCBoZmEzODR4X3VzYmN0bHhfcmVzcHRpbWVyZm4sCisJCSAgICAodW5zaWduZWQgbG9uZylodyk7CiAKLQlpbml0X3RpbWVyKCZody0+cmVxdGltZXIpOwotCWh3LT5yZXF0aW1lci5mdW5jdGlvbiA9IGhmYTM4NHhfdXNiY3RseF9yZXF0aW1lcmZuOwotCWh3LT5yZXF0aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaHc7CisJc2V0dXBfdGltZXIoJmh3LT5yZXF0aW1lciwgaGZhMzg0eF91c2JjdGx4X3JlcXRpbWVyZm4sCisJCSAgICAodW5zaWduZWQgbG9uZylodyk7CiAKIAl1c2JfaW5pdF91cmIoJmh3LT5yeF91cmIpOwogCXVzYl9pbml0X3VyYigmaHctPnR4X3VyYik7CkBAIC01NzcsOSArNTczLDggQEAKIAlody0+c3RhdGUgPSBIRkEzODR4X1NUQVRFX0lOSVQ7CiAKIAlJTklUX1dPUksoJmh3LT5jb21tc3F1YWxfYmgsIHByaXNtMnN0YV9jb21tc3F1YWxfZGVmZXIpOwotCWluaXRfdGltZXIoJmh3LT5jb21tc3F1YWxfdGltZXIpOwotCWh3LT5jb21tc3F1YWxfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWh3OwotCWh3LT5jb21tc3F1YWxfdGltZXIuZnVuY3Rpb24gPSBwcmlzbTJzdGFfY29tbXNxdWFsX3RpbWVyOworCXNldHVwX3RpbWVyKCZody0+Y29tbXNxdWFsX3RpbWVyLCBwcmlzbTJzdGFfY29tbXNxdWFsX3RpbWVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpaHcpOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTYyNCwxMSArNjE5LDEwIEBACiB7CiAJaGZhMzg0eF91c2JjdGx4X3QgKmN0bHg7CiAKLQljdGx4ID0ga21hbGxvYyhzaXplb2YoKmN0bHgpLCBpbl9pbnRlcnJ1cHQoKSA/IEdGUF9BVE9NSUMgOiBHRlBfS0VSTkVMKTsKLQlpZiAoY3RseCAhPSBOVUxMKSB7Ci0JCW1lbXNldChjdGx4LCAwLCBzaXplb2YoKmN0bHgpKTsKKwljdGx4ID0ga3phbGxvYyhzaXplb2YoKmN0bHgpLAorCQkgICAgICAgaW5faW50ZXJydXB0KCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCk7CisJaWYgKGN0bHggIT0gTlVMTCkKIAkJaW5pdF9jb21wbGV0aW9uKCZjdGx4LT5kb25lKTsKLQl9CiAKIAlyZXR1cm4gY3RseDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy93bGFuLW5nL3ByaXNtMm1pYi5jIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKaW5kZXggMDE2M2UwNi4uYjRhMTVlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20ybWliLmMKQEAgLTU4Miw4ICs1ODIsNiBAQAogCQkJCSAgICBzdHJ1Y3QgcDgwMjExbXNnX2RvdDExcmVxX21pYnNldCAqbXNnLAogCQkJCSAgICB2b2lkICpkYXRhKQogewotCWludCByZXN1bHQ7Ci0KIAlpZiAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfREVDUllQVCkgewogCQlpZiAod2xhbmRldi0+aG9zdHdlcCAmIEhPU1RXRVBfREVDUllQVCkKIAkJCW1pYi0+cGFybTIgfD0gSEZBMzg0eF9XRVBGTEFHU19ESVNBQkxFX1JYQ1JZUFQ7CkBAIC01OTEsOSArNTg5LDcgQEAKIAkJCW1pYi0+cGFybTIgfD0gSEZBMzg0eF9XRVBGTEFHU19ESVNBQkxFX1RYQ1JZUFQ7CiAJfQogCi0JcmVzdWx0ID0gcHJpc20ybWliX2ZsYWcobWliLCBpc2dldCwgd2xhbmRldiwgaHcsIG1zZywgZGF0YSk7Ci0KLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiBwcmlzbTJtaWJfZmxhZyhtaWIsIGlzZ2V0LCB3bGFuZGV2LCBodywgbXNnLCBkYXRhKTsKIH0KIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02MjgsMTEgKzYyNCw4IEBACiAJCQkJCXN0cnVjdCBwODAyMTFtc2dfZG90MTFyZXFfbWlic2V0ICptc2csCiAJCQkJCXZvaWQgKmRhdGEpCiB7Ci0JaW50IHJlc3VsdDsKIAotCXJlc3VsdCA9IHByaXNtMm1pYl9mbGFnKG1pYiwgaXNnZXQsIHdsYW5kZXYsIGh3LCBtc2csIGRhdGEpOwotCi0JcmV0dXJuIHJlc3VsdDsKKwlyZXR1cm4gcHJpc20ybWliX2ZsYWcobWliLCBpc2dldCwgd2xhbmRldiwgaHcsIG1zZywgZGF0YSk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3dsYW4tbmcvcHJpc20yc3RhLmMgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYwppbmRleCAxMGFkMjRhLi5kZGIyOTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvd2xhbi1uZy9wcmlzbTJzdGEuYwpAQCAtNTEsNyArNTEsNiBAQAogKi8KIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtNjAsNiArNTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2J5dGVvcmRlci9nZW5lcmljLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTI0Myw3ICsyNDMsNiBAQAogCQkJICAgICBzdHJ1Y3QgcDgwMjExX21ldGF3ZXAgKnA4MDIxMV93ZXApCiB7CiAJaGZhMzg0eF90ICpodyA9IChoZmEzODR4X3QgKikgd2xhbmRldi0+cHJpdjsKLQlpbnQgcmVzdWx0OwogCiAJLyogSWYgbmVjZXNzYXJ5LCBzZXQgdGhlIDgwMi4xMSBXRVAgYml0ICovCiAJaWYgKCh3bGFuZGV2LT5ob3N0d2VwICYgKEhPU1RXRVBfUFJJVkFDWUlOVk9LRUQgfCBIT1NUV0VQX0VOQ1JZUFQpKSA9PQpAQCAtMjUxLDkgKzI1MCw3IEBACiAJCXA4MDIxMV9oZHItPmEzLmZjIHw9IGNwdV90b19sZTE2KFdMQU5fU0VUX0ZDX0lTV0VQKDEpKTsKIAl9CiAKLQlyZXN1bHQgPSBoZmEzODR4X2RydnJfdHhmcmFtZShodywgc2tiLCBwODAyMTFfaGRyLCBwODAyMTFfd2VwKTsKLQotCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIGhmYTM4NHhfZHJ2cl90eGZyYW1lKGh3LCBza2IsIHA4MDIxMV9oZHIsIHA4MDIxMV93ZXApOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE1NDgsNyArMTU0NSw3IEBACiAJICoqIGF1dGhlbnRpY2F0aW9uLgogCSAqLwogCi0JbWVtY3B5KHJlYy5hZGRyZXNzLCBpbmYtPmluZm8uYXV0aHJlcS5zdGFfYWRkciwgRVRIX0FMRU4pOworCWV0aGVyX2FkZHJfY29weShyZWMuYWRkcmVzcywgaW5mLT5pbmZvLmF1dGhyZXEuc3RhX2FkZHIpOwogCXJlYy5zdGF0dXMgPSBQODAyMTFFTlVNX3N0YXR1c191bnNwZWNfZmFpbHVyZTsKIAogCS8qCkBAIC0xNjYxLDggKzE2NTgsOCBAQAogCQkJaWYgKGh3LT5hdXRobGlzdC5jbnQgPj0gV0xBTl9BVVRIX01BWCkgewogCQkJCXJlYy5zdGF0dXMgPSBQODAyMTFFTlVNX3N0YXR1c19hcF9mdWxsOwogCQkJfSBlbHNlIHsKLQkJCQltZW1jcHkoaHctPmF1dGhsaXN0LmFkZHJbaHctPmF1dGhsaXN0LmNudF0sCi0JCQkJICAgICAgIHJlYy5hZGRyZXNzLCBFVEhfQUxFTik7CisJCQkJZXRoZXJfYWRkcl9jb3B5KGh3LT5hdXRobGlzdC5hZGRyW2h3LT5hdXRobGlzdC5jbnRdLAorCQkJCQkJcmVjLmFkZHJlc3MpOwogCQkJCWh3LT5hdXRobGlzdC5jbnQrKzsKIAkJCQlhZGRlZCA9IDE7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcveGdpZmIvWEdJX21haW5fMjYuYyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jCmluZGV4IDkzNWM3MTQuLjc0ZTg4MjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi9YR0lfbWFpbl8yNi5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAogCXNyX2RhdGEgPSBYR0lfQ1JUMVRhYmxlW2luZGV4XS5DUls1XTsKIAotCUhERSA9IChYR0kzMzBfUmVmSW5kZXhbUmVmcmVzaFJhdGVUYWJsZUluZGV4XS5YUmVzID4+IDMpOworCUhERSA9IFhHSTMzMF9SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLlhSZXMgPj4gMzsKIAogCWNyX2RhdGEgPSBYR0lfQ1JUMVRhYmxlW2luZGV4XS5DUlszXTsKIApAQCAtMTAxMSw4ICsxMDExLDggQEAKIAkJCSAgICAgICBYR0liaW9zX21vZGVbeGdpZmJfaW5mby0+bW9kZV9pZHhdLm1vZGVfbm8pOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQkJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gKChpbmZvLT52YXIueHJlc192aXJ0dWFsCi0JCQkJKiBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpID4+IDYpOworCQlpbmZvLT5maXgubGluZV9sZW5ndGggPSAoaW5mby0+dmFyLnhyZXNfdmlydHVhbAorCQkJCSogaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKSA+PiA2OwogCiAJCXhnaWZiX3JlZ19zZXQoWEdJU1IsIElORF9TSVNfUEFTU1dPUkQsIFNJU19QQVNTV09SRCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zZXRtb2RlLmMgYi9kcml2ZXJzL3N0YWdpbmcveGdpZmIvdmJfc2V0bW9kZS5jCmluZGV4IDFmNmY2OTkuLmE0NzM5NWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy94Z2lmYi92Yl9zZXRtb2RlLmMKKysrIGIvZHJpdmVycy9zdGFnaW5nL3hnaWZiL3ZiX3NldG1vZGUuYwpAQCAtMzA4LDExICszMDgsMTEgQEAKIAkJZGF0YSB8PSBkYXRhMTsKIAkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QM2Q0LCAweDA1LCBkYXRhKTsKIAkJZGF0YSA9IHhnaWZiX3JlZ19nZXQocFZCSW5mby0+UDNjNCwgMHgwZSk7Ci0JCWRhdGEgPSBkYXRhID4+IDU7CisJCWRhdGEgPj49IDU7CiAJCWRhdGEgPSBkYXRhICsgMzsKIAkJaWYgKGRhdGEgPiA3KQogCQkJZGF0YSA9IGRhdGEgLSA3OwotCQlkYXRhID0gZGF0YSA8PCA1OworCQlkYXRhIDw8PSA1OwogCQl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlAzYzQsIDB4MGUsIH4weEUwLCBkYXRhKTsKIAl9CiB9CkBAIC0zNDcsNyArMzQ3LDcgQEAKIAogCWRhdGEgPSBwVkJJbmZvLT5UaW1pbmdWLmRhdGFbNl07CiAJZGF0YSAmPSAweDgwOwotCWRhdGEgPSBkYXRhID4+IDI7CisJZGF0YSA+Pj0gMjsKIAogCWkgPSBYR0kzMzBfRU1vZGVJRFRhYmxlW01vZGVJZEluZGV4XS5FeHRfTW9kZUZsYWc7CiAJaSAmPSBEb3VibGVTY2FuTW9kZTsKQEAgLTY5MywxOCArNjkzLDE4IEBACiAJdGVtcGJ4ID0gWEdJMzMwX01vZGVSZXNJbmZvW3Jlc2luZGV4XS5WVG90YWw7CiAKIAlpZiAobW9kZWZsYWcgJiBIYWxmRENMSykKLQkJdGVtcGF4ID0gdGVtcGF4ID4+IDE7CisJCXRlbXBheCA+Pj0gMTsKIAogCWlmIChtb2RlZmxhZyAmIEhhbGZEQ0xLKQotCQl0ZW1wYXggPSB0ZW1wYXggPDwgMTsKKwkJdGVtcGF4IDw8PSAxOwogCiAJdGVtcCA9IFhHSTMzMF9SZWZJbmRleFtSZWZyZXNoUmF0ZVRhYmxlSW5kZXhdLkV4dF9JbmZvRmxhZzsKIAogCWlmICh0ZW1wICYgSW50ZXJsYWNlTW9kZSkKLQkJdGVtcGJ4ID0gdGVtcGJ4ID4+IDE7CisJCXRlbXBieCA+Pj0gMTsKIAogCWlmIChtb2RlZmxhZyAmIERvdWJsZVNjYW5Nb2RlKQotCQl0ZW1wYnggPSB0ZW1wYnggPDwgMTsKKwkJdGVtcGJ4IDw8PSAxOwogCiAJdGVtcGN4ID0gODsKIApAQCAtNzIxLDcgKzcyMSw3IEBACiAJCQkodW5zaWduZWQgc2hvcnQpICgodGVtcGN4ICYgMHgwZmYwMCkgPj4gMTApKTsKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlAzZDQsIDB4MTIsICh1bnNpZ25lZCBzaG9ydCkgKHRlbXBieCAmIDB4ZmYpKTsKIAl0ZW1wYXggPSAwOwotCXRlbXBieCA9IHRlbXBieCA+PiA4OworCXRlbXBieCA+Pj0gODsKIAogCWlmICh0ZW1wYnggJiAweDAxKQogCQl0ZW1wYXggfD0gMHgwMjsKQEAgLTc1MCwxNCArNzUwLDE0IEBACiAKIAkvKiBHZXRPZmZzZXQgKi8KIAl0ZW1wID0gWEdJMzMwX0VNb2RlSURUYWJsZVtNb2RlSWRJbmRleF0uRXh0X01vZGVJbmZvOwotCXRlbXAgPSB0ZW1wID4+IDg7CisJdGVtcCA+Pj0gODsKIAl0ZW1wID0gWEdJMzMwX1NjcmVlbk9mZnNldFt0ZW1wXTsKIAogCXRlbXAyID0gWEdJMzMwX1JlZkluZGV4W1JlZnJlc2hSYXRlVGFibGVJbmRleF0uRXh0X0luZm9GbGFnOwogCXRlbXAyICY9IEludGVybGFjZU1vZGU7CiAKIAlpZiAodGVtcDIpCi0JCXRlbXAgPSB0ZW1wIDw8IDE7CisJCXRlbXAgPDw9IDE7CiAKIAl0ZW1wMiA9IHBWQkluZm8tPk1vZGVUeXBlIC0gTW9kZUVHQTsKIApAQCAtNzkyLDcgKzc5Miw3IEBACiAJLyogU2V0T2Zmc2V0ICovCiAJRGlzcGxheVVuaXQgPSB0ZW1wOwogCXRlbXAyID0gdGVtcDsKLQl0ZW1wID0gdGVtcCA+PiA4OyAvKiBhaCAqLworCXRlbXAgPj49IDg7IC8qIGFoICovCiAJdGVtcCAmPSAweDBGOwogCWkgPSB4Z2lmYl9yZWdfZ2V0KHBWQkluZm8tPlAzYzQsIDB4MEUpOwogCWkgJj0gMHhGMDsKQEAgLTgwOSw3ICs4MDksNyBAQAogCWlmICh0ZW1wMikKIAkJRGlzcGxheVVuaXQgPj49IDE7CiAKLQlEaXNwbGF5VW5pdCA9IERpc3BsYXlVbml0IDw8IDU7CisJRGlzcGxheVVuaXQgPDw9IDU7CiAJYWggPSAoRGlzcGxheVVuaXQgJiAweGZmMDApID4+IDg7CiAJYWwgPSBEaXNwbGF5VW5pdCAmIDB4MDBmZjsKIAlpZiAoYWwgPT0gMCkKQEAgLTkxMiw3ICs5MTIsNyBAQAogCQkJaW5kZXggPSBkYXRhOwogCQkJaW5kZXggJj0gMHhFMDsKIAkJCWRhdGEgJj0gMHgxRjsKLQkJCWRhdGEgPSBkYXRhIDw8IDE7CisJCQlkYXRhIDw8PSAxOwogCQkJZGF0YSArPSAxOwogCQkJZGF0YSB8PSBpbmRleDsKIAkJCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UDNjNCwgMHgyQywgZGF0YSk7CkBAIC0xMDExLDcgKzEwMTEsNyBAQAogCWRhdGEyID0gMDsKIAlkYXRhMiB8PSAweDAyOwogCWRhdGEzID0gcFZCSW5mby0+TW9kZVR5cGUgLSBNb2RlVkdBOwotCWRhdGEzID0gZGF0YTMgPDwgMjsKKwlkYXRhMyA8PD0gMjsKIAlkYXRhMiB8PSBkYXRhMzsKIAlkYXRhICY9IEludGVybGFjZU1vZGU7CiAKQEAgLTExMjYsNyArMTEyNiw3IEBACiAJCQkJZGF0YTIgKz0gMHgxNTsKIAogCQkJb3V0YihkYXRhMiwgcFZCSW5mby0+UDNjOSk7Ci0JCQlkYXRhID0gZGF0YSA+PiAyOworCQkJZGF0YSA+Pj0gMjsKIAkJfQogCX0KIApAQCAtMTE4NSwxMCArMTE4NSwxMCBAQAogCXlyZXMgPSBYR0kzMzBfTW9kZVJlc0luZm9bcmVzaW5kZXhdLlZUb3RhbDsKIAogCWlmIChtb2RlZmxhZyAmIEhhbGZEQ0xLKQotCQl4cmVzID0geHJlcyA8PCAxOworCQl4cmVzIDw8PSAxOwogCiAJaWYgKG1vZGVmbGFnICYgRG91YmxlU2Nhbk1vZGUpCi0JCXlyZXMgPSB5cmVzIDw8IDE7CisJCXlyZXMgPDw9IDE7CiAKIAlpZiAoeHJlcyA9PSA3MjApCiAJCXhyZXMgPSA2NDA7CkBAIC0xNDUwLDggKzE0NTAsOCBAQAogCiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MUEsIHRlbXBieCAmIDB4MDcpOwogCi0JdGVtcGN4ID0gdGVtcGN4ID4+IDM7Ci0JdGVtcGJ4ID0gdGVtcGJ4ID4+IDM7CisJdGVtcGN4ID4+PSAzOworCXRlbXBieCA+Pj0gMzsKIAogCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDFQb3J0LCAweDE2LAogCQkJKHVuc2lnbmVkIHNob3J0KSAodGVtcGJ4ICYgMHhmZikpOwpAQCAtMTQ3Myw5ICsxNDczLDkgQEAKIAkJdGVtcGN4IC09IHRlbXBheDsKIAogCXRlbXBheCA9IHRlbXBieCAmIDB4MDc7Ci0JdGVtcGF4ID0gdGVtcGF4ID4+IDU7Ci0JdGVtcGN4ID0gdGVtcGN4ID4+IDM7Ci0JdGVtcGJ4ID0gdGVtcGJ4ID4+IDM7CisJdGVtcGF4ID4+PSA1OworCXRlbXBjeCA+Pj0gMzsKKwl0ZW1wYnggPj49IDM7CiAKIAl0ZW1wY3ggJj0gMHgxZjsKIAl0ZW1wYXggfD0gdGVtcGN4OwpAQCAtMTYwMCw3ICsxNjAwLDcgQEAKIAl0ZW1wMSA9IHBWQkluZm8tPlZHQUhERSA8PCAxNjsKIAogCXRlbXAxIC89IHRlbXAzOwotCXRlbXAzID0gdGVtcDMgPDwgMTY7CisJdGVtcDMgPDw9IDE2OwogCXRlbXAxIC09IDE7CiAKIAl0ZW1wMyA9ICh0ZW1wMyAmIDB4ZmZmZjAwMDApICsgKHRlbXAxICYgMHhmZmZmKTsKQEAgLTE2MjIsMTAgKzE2MjIsMTAgQEAKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgyMSwKIAkJCSh1bnNpZ25lZCBzaG9ydCkgKHRlbXBieCAmIDB4ZmYpKTsKIAotCXRlbXAzID0gdGVtcDMgPj4gMTY7CisJdGVtcDMgPj49IDE2OwogCiAJaWYgKG1vZGVmbGFnICYgSGFsZkRDTEspCi0JCXRlbXAzID0gdGVtcDMgPj4gMTsKKwkJdGVtcDMgPj49IDE7CiAKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgyMiwKIAkJCSh1bnNpZ25lZCBzaG9ydCkgKCh0ZW1wMyA+PiA4KSAmIDB4ZmYpKTsKQEAgLTE5MDksNyArMTkwOSw3IEBACiAJdGVtcGJ4ID0gdGVtcGJ4IHwgdGVtcDsKIAl0ZW1wID0geGdpZmJfcmVnX2dldChwVkJJbmZvLT5QM2Q0LCAweDMxKTsKIAlwdXNoID0gdGVtcDsKLQlwdXNoID0gcHVzaCA8PCA4OworCXB1c2ggPDw9IDg7CiAJdGVtcGF4ID0gdGVtcCA8PCA4OwogCXRlbXBieCA9IHRlbXBieCB8IHRlbXBheDsKIAl0ZW1wID0gKFNldENSVDJUb0R1YWxFZGdlIHwgU2V0Q1JUMlRvWVBiUHI1MjU3NTAgfCBYR0lfU2V0Q1JUMlRvTENEQQpAQCAtMjEwNyw3ICsyMTA3LDcgQEAKIAkJCWlmIChwVkJJbmZvLT5WQkluZm8gJiBYR0lfU2V0Q1JUMlRvTENEQSkKIAkJCQl0ZW1wYXggJj0gMHgwRjsKIAkJCWVsc2UKLQkJCQl0ZW1wYXggPSB0ZW1wYXggPj4gNDsKKwkJCQl0ZW1wYXggPj49IDQ7CiAKIAkJCWlmICgocmVzaW5mbyA9PSA2KSB8fCAocmVzaW5mbyA9PSA5KSkgewogCQkJCWlmICh0ZW1wYXggPj0gMykKQEAgLTIxODIsNyArMjE4Miw3IEBACiAJdW5zaWduZWQgY2hhciBpID0gMDsKIAogCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJdWpSZXQgPSB1alJldCA8PCAxOworCQl1alJldCA8PD0gMTsKIAkJdWpSZXQgfD0gKHVqRGF0ZSA+PiBpKSAmIDE7CiAJfQogCkBAIC0yNDk0LDcgKzI0OTQsNyBAQAogCXRlbXBjeCA9ICh1bnNpZ25lZCBzaG9ydCkKIAkJCVhHSV9DUlQxVGFibGVbQ1JUMUluZGV4XS5DUlsxNF0gPDwgODsKIAl0ZW1wY3ggJj0gMHgwMTAwOwotCXRlbXBjeCA9IHRlbXBjeCA8PCAyOworCXRlbXBjeCA8PD0gMjsKIAl0ZW1wYnggfD0gdGVtcGN4OwogCXRlbXAxID0gKHVuc2lnbmVkIHNob3J0KSBYR0lfQ1JUMVRhYmxlW0NSVDFJbmRleF0uQ1JbOV07CiAKQEAgLTI3NDUsNyArMjc0NSw3IEBACiAJdGVtcCA9IFhHSTMzMF9TY3JlZW5PZmZzZXRbaW5kZXhdOwogCiAJaWYgKGluZm9mbGFnICYgSW50ZXJsYWNlTW9kZSkKLQkJdGVtcCA9IHRlbXAgPDwgMTsKKwkJdGVtcCA8PD0gMTsKIAogCWNvbG9yZGVwdGggPSBYR0lfR2V0Q29sb3JEZXB0aChNb2RlSWRJbmRleCk7CiAKQEAgLTI3NTQsNyArMjc1NCw3IEBACiAJCWNvbG9yZGVwdGggPSBDb2xvckRlcHRoW3RlbXBdOwogCQl0ZW1wID0gMHg2QjsKIAkJaWYgKGluZm9mbGFnICYgSW50ZXJsYWNlTW9kZSkKLQkJCXRlbXAgPSB0ZW1wIDw8IDE7CisJCQl0ZW1wIDw8PSAxOwogCX0KIAlyZXR1cm4gdGVtcCAqIGNvbG9yZGVwdGg7CiB9CkBAIC0yODI2LDcgKzI4MjYsNyBAQAogCQl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQxUG9ydCwgMHgwQSwgdGVtcCk7CiAJCXRlbXBjeCA9ICgocFZCSW5mby0+VkdBSFQgLSBwVkJJbmZvLT5WR0FIREUpIC8gMikgPj4gMjsKIAkJcHVzaGJ4ID0gcFZCSW5mby0+VkdBSERFIC8gMiArIDE2OwotCQl0ZW1wY3ggPSB0ZW1wY3ggPj4gMTsKKwkJdGVtcGN4ID4+PSAxOwogCQl0ZW1wYnggPSBwdXNoYnggKyB0ZW1wY3g7IC8qIGJ4IEJUVkdBQEhSUyAweDBCLDB4MEMgKi8KIAkJdGVtcGN4ICs9IHRlbXBieDsKIApAQCAtMjg2MSw3ICsyODYxLDcgQEAKIAkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MVBvcnQsIDB4MEEsIHRlbXApOwogCQl0ZW1wY3ggPSAocFZCSW5mby0+VkdBSFQgLSBwVkJJbmZvLT5WR0FIREUpID4+IDI7IC8qIGN4ICovCiAJCXB1c2hieCA9IHBWQkluZm8tPlZHQUhERSArIDE2OwotCQl0ZW1wY3ggPSB0ZW1wY3ggPj4gMTsKKwkJdGVtcGN4ID4+PSAxOwogCQl0ZW1wYnggPSBwdXNoYnggKyB0ZW1wY3g7IC8qIGJ4IEJUVkdBQEhSUyAweDBCLDB4MEMgKi8KIAkJdGVtcGN4ICs9IHRlbXBieDsKIApAQCAtMjk4MCw3ICsyOTgwLDcgQEAKIAl0ZW1wYXggPSBwVkJJbmZvLT5WR0FIREU7IC8qIDB4MDQgSG9yaXpvbnRhbCBEaXNwbGF5IEVuZCAqLwogCiAJaWYgKG1vZGVmbGFnICYgSGFsZkRDTEspCi0JCXRlbXBheCA9IHRlbXBheCA+PiAxOworCQl0ZW1wYXggPj49IDE7CiAKIAl0ZW1wYXggPSAodGVtcGF4IC8gdGVtcGN4KSAtIDE7CiAJdGVtcGJ4IHw9ICgodGVtcGF4ICYgMHgwMEZGKSA8PCA4KTsKQEAgLTMwMTUsNyArMzAxNSw3IEBACiAJCXRlbXBheCA9IHBWQkluZm8tPlZHQUhUOwogCiAJaWYgKG1vZGVmbGFnICYgSGFsZkRDTEspCi0JCXRlbXBheCA9IHRlbXBheCA+PiAxOworCQl0ZW1wYXggPj49IDE7CiAKIAl0ZW1wYXggPSAodGVtcGF4IC8gdGVtcGN4KSAtIDU7CiAJdGVtcGN4ID0gdGVtcGF4OyAvKiAyMDAzMDQwMSAweDA3IGhvcml6b250YWwgUmV0cmFjZSBTdGFydCAqLwpAQCAtMzE0MiwxMSArMzE0MiwxMSBAQAogCiAJdGVtcGF4ID0gcHVzaDE7CiAJdGVtcGF4IC09IHRlbXBieDsgLyogMHgwQyBWZXJ0aWNhbCBSZXRyYWNlIFN0YXJ0ICovCi0JdGVtcGF4ID0gdGVtcGF4ID4+IDI7CisJdGVtcGF4ID4+PSAyOwogCXB1c2gxID0gdGVtcGF4OyAvKiBwdXNoIGF4ICovCiAKIAlpZiAocmVzaW5mbyAhPSAweDA5KSB7Ci0JCXRlbXBheCA9IHRlbXBheCA8PCAxOworCQl0ZW1wYXggPDw9IDE7CiAJCXRlbXBieCArPSB0ZW1wYXg7CiAJfQogCkBAIC0zMTc5LDcgKzMxNzksNyBAQAogCQl9CiAJfQogCXRlbXBheCA9IHB1c2gxOwotCXRlbXBheCA9IHRlbXBheCA+PiAyOworCXRlbXBheCA+Pj0gMjsKIAl0ZW1wYXgrKzsKIAl0ZW1wYXggKz0gdGVtcGJ4OwogCXB1c2gxID0gdGVtcGF4OyAvKiBwdXNoIGF4ICovCkBAIC0zMzMyLDcgKzMzMzIsNyBAQAogCiAJaWYgKHBWQkluZm8tPlZERSA8PSB0ZW1wYXgpIHsKIAkJdGVtcGF4IC09IHBWQkluZm8tPlZERTsKLQkJdGVtcGF4ID0gdGVtcGF4ID4+IDI7CisJCXRlbXBheCA+Pj0gMjsKIAkJdGVtcGF4ID0gKHRlbXBheCAmIDB4MDBGRikgfCAoKHRlbXBheCAmIDB4MDBGRikgPDwgOCk7CiAJCXB1c2gxID0gdGVtcGF4OwogCQl0ZW1wID0gKHRlbXBheCAmIDB4RkYwMCkgPj4gODsKQEAgLTMzNzcsNyArMzM3Nyw3IEBACiAJdGVtcGN4ID0gcFZCSW5mby0+SFQ7CiAKIAlpZiAoWEdJX0lzTENERHVhbExpbmsocFZCSW5mbykpCi0JCXRlbXBjeCA9IHRlbXBjeCA+PiAxOworCQl0ZW1wY3ggPj49IDE7CiAKIAl0ZW1wY3ggLT0gMjsKIAl0ZW1wID0gdGVtcGN4ICYgMHgwMEZGOwpAQCAtMzM5NCw3ICszMzk0LDcgQEAKIAkJdGVtcGN4IC09IDQ7CiAKIAl0ZW1wID0gdGVtcGN4ICYgMHgwMEZGOwotCXRlbXAgPSB0ZW1wIDw8IDQ7CisJdGVtcCA8PD0gNDsKIAl4Z2lmYl9yZWdfYW5kX29yKHBWQkluZm8tPlBhcnQyUG9ydCwgMHgyMiwgMHgwRiwgdGVtcCk7CiAKIAl0ZW1wYnggPSBUaW1pbmdQb2ludFtqXSB8ICgoVGltaW5nUG9pbnRbaiArIDFdKSA8PCA4KTsKQEAgLTM0MDMsNyArMzQwMyw3IEBACiAJdGVtcCA9IHRlbXBieCAmIDB4MDBGRjsKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQyUG9ydCwgMHgyNCwgdGVtcCk7CiAJdGVtcCA9ICh0ZW1wYnggJiAweEZGMDApID4+IDg7Ci0JdGVtcCA9IHRlbXAgPDwgNDsKKwl0ZW1wIDw8PSA0OwogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDJQb3J0LCAweDI1LCAweDBGLCB0ZW1wKTsKIAogCXRlbXBieCA9IHB1c2gyOwpAQCAtMzQyOCw3ICszNDI4LDcgQEAKIAkJdGVtcGN4IC09IDQ7CiAKIAl0ZW1wID0gdGVtcGN4ICYgMHhGRjsKLQl0ZW1wID0gdGVtcCA8PCA0OworCXRlbXAgPDw9IDQ7CiAJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MkEsIDB4MEYsIHRlbXApOwogCiAJdGVtcGN4ID0gcHVzaDE7IC8qIHBvcCBjeCAqLwpAQCAtMzQzNiw3ICszNDM2LDcgQEAKIAl0ZW1wID0gVGltaW5nUG9pbnRbal0gfCAoKFRpbWluZ1BvaW50W2ogKyAxXSkgPDwgOCk7CiAJdGVtcGN4IC09IHRlbXA7CiAJdGVtcCA9IHRlbXBjeCAmIDB4MDBGRjsKLQl0ZW1wID0gdGVtcCA8PCA0OworCXRlbXAgPDw9IDQ7CiAJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MkQsIDB4MEYsIHRlbXApOwogCiAJdGVtcGN4IC09IDExOwpAQCAtMzQ2Miw5ICszNDYyLDkgQEAKIAkJICAgIChWQl9TSVMzMDFMViB8IFZCX1NJUzMwMkxWIHwgVkJfWEdJMzAxQykpIHsKIAkJCWlmICghKHBWQkluZm8tPlRWSW5mbyAmCiAJCQkgICAgKFRWU2V0WVBiUHI1MjVwIHwgVFZTZXRZUGJQcjc1MHApKSkKLQkJCQl0ZW1wYnggPSB0ZW1wYnggPj4gMTsKKwkJCQl0ZW1wYnggPj49IDE7CiAJCX0gZWxzZQotCQkJdGVtcGJ4ID0gdGVtcGJ4ID4+IDE7CisJCQl0ZW1wYnggPj49IDE7CiAJfQogCiAJdGVtcGJ4IC09IDI7CkBAIC0zNTE0LDcgKzM1MTQsNyBAQAogCQlpZiAocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvVFYpIHsKIAkJCWlmICghKHBWQkluZm8tPlRWSW5mbyAmIChUVlNldFlQYlByNTI1cAogCQkJCQl8IFRWU2V0WVBiUHI3NTBwKSkpCi0JCQkJdGVtcGJ4ID0gdGVtcGJ4ID4+IDE7CisJCQkJdGVtcGJ4ID4+PSAxOwogCQl9CiAKIAkJaWYgKHBWQkluZm8tPlZCVHlwZSAmIChWQl9TSVMzMDJMViB8IFZCX1hHSTMwMUMpKSB7CkBAIC0zNjI3LDcgKzM2MjcsNyBAQAogCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDJQb3J0LCAweDRjLCB0ZW1wKTsKIAogCXRlbXAgPSAoKHRlbXBjeCAmIDB4RkYwMCkgPj4gOCkgJiAweDAzOwotCXRlbXAgPSB0ZW1wIDw8IDI7CisJdGVtcCA8PD0gMjsKIAl0ZW1wIHw9ICgodGVtcGJ4ICYgMHhGRjAwKSA+PiA4KSAmIDB4MDM7CiAKIAlpZiAocFZCSW5mby0+VkJJbmZvICYgU2V0Q1JUMlRvWVBiUHI1MjU3NTApIHsKQEAgLTM2OTEsMTMgKzM2OTEsMTMgQEAKIAl0ZW1wYnggPSBwVkJJbmZvLT5IREU7IC8qIFJIQUNURT1IREUtMSAqLwogCiAJaWYgKFhHSV9Jc0xDRER1YWxMaW5rKHBWQkluZm8pKQotCQl0ZW1wYnggPSB0ZW1wYnggPj4gMTsKKwkJdGVtcGJ4ID4+PSAxOwogCiAJdGVtcGJ4IC09IDE7CiAJdGVtcCA9IHRlbXBieCAmIDB4MDBGRjsKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQyUG9ydCwgMHgyQywgdGVtcCk7CiAJdGVtcCA9ICh0ZW1wYnggJiAweEZGMDApID4+IDg7Ci0JdGVtcCA9IHRlbXAgPDwgNDsKKwl0ZW1wIDw8PSA0OwogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDJQb3J0LCAweDJCLCAweDBGLCB0ZW1wKTsKIAl0ZW1wID0gMHgwMTsKIApAQCAtMzcxMyw3ICszNzEzLDcgQEAKIAl0ZW1wID0gdGVtcGN4ICYgMHgwMEZGOyAvKiBSVlRWVD1WVC0xICovCiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MTksIHRlbXApOwogCXRlbXAgPSAodGVtcGN4ICYgMHhGRjAwKSA+PiA4OwotCXRlbXAgPSB0ZW1wIDw8IDU7CisJdGVtcCA8PD0gNTsKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQyUG9ydCwgMHgxQSwgdGVtcCk7CiAJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MDksIDB4RjAsIDB4MDApOwogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDJQb3J0LCAweDBBLCAweEYwLCAweDAwKTsKQEAgLTM3NzAsNyArMzc3MCw3IEBACiAJdGVtcGNoID0gKCh0ZW1wY3ggJiAweEZGMDApID4+IDgpICYgMHgwNzsKIAl0ZW1wYmggPSAoKHRlbXBieCAmIDB4RkYwMCkgPj4gOCkgJiAweDA3OwogCXRlbXBhaCA9IHRlbXBjaDsKLQl0ZW1wYWggPSB0ZW1wYWggPDwgMzsKKwl0ZW1wYWggPDw9IDM7CiAJdGVtcGFoIHw9IHRlbXBiaDsKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQyUG9ydCwgMHgwMiwgdGVtcGFoKTsKIApAQCAtMzc4Nyw3ICszNzg3LDcgQEAKIAl0ZW1wID0gdGVtcGJ4ICYgMHgwMEZGOyAvKiBSVFZBQ1RFRT1sY2R2cnMgKi8KIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQyUG9ydCwgMHgwNCwgdGVtcCk7CiAJdGVtcCA9ICh0ZW1wYnggJiAweEZGMDApID4+IDg7Ci0JdGVtcCA9IHRlbXAgPDwgNDsKKwl0ZW1wIDw8PSA0OwogCXRlbXAgfD0gKHRlbXBjeCAmIDB4MDAwRik7CiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MDEsIHRlbXApOwogCXRlbXBjeCA9IHB1c2hieDsKQEAgLTM3OTYsOSArMzc5Niw5IEBACiAJdGVtcGJ4ICY9IDB4MEZGRjsKIAogCWlmIChYR0lfSXNMQ0REdWFsTGluayhwVkJJbmZvKSkgewotCQl0ZW1wYXggPSB0ZW1wYXggPj4gMTsKLQkJdGVtcGJ4ID0gdGVtcGJ4ID4+IDE7Ci0JCXRlbXBjeCA9IHRlbXBjeCA+PiAxOworCQl0ZW1wYXggPj49IDE7CisJCXRlbXBieCA+Pj0gMTsKKwkJdGVtcGN4ID4+PSAxOwogCX0KIAogCWlmIChwVkJJbmZvLT5WQlR5cGUgJiBWQl9TSVMzMDJMVikKQEAgLTM4MjYsOSArMzgyNiw5IEBACiAJdGVtcGF4ID0gcFZCSW5mby0+SFQ7CiAJdGVtcGJ4ID0gcFZCSW5mby0+TENESFJTOwogCWlmIChYR0lfSXNMQ0REdWFsTGluayhwVkJJbmZvKSkgewotCQl0ZW1wYXggPSB0ZW1wYXggPj4gMTsKLQkJdGVtcGJ4ID0gdGVtcGJ4ID4+IDE7Ci0JCXRlbXBjeCA9IHRlbXBjeCA+PiAxOworCQl0ZW1wYXggPj49IDE7CisJCXRlbXBieCA+Pj0gMTsKKwkJdGVtcGN4ID4+PSAxOwogCX0KIAogCWlmIChwVkJJbmZvLT5WQlR5cGUgJiBWQl9TSVMzMDJMVikKQEAgLTM4NDMsNyArMzg0Myw3IEBACiAJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4MUMsIHRlbXApOwogCiAJdGVtcCA9ICh0ZW1wYnggJiAweEZGMDApID4+IDg7Ci0JdGVtcCA9IHRlbXAgPDwgNDsKKwl0ZW1wIDw8PSA0OwogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDJQb3J0LCAweDFELCB+MHgwRjAsIHRlbXApOwogCXRlbXAgPSB0ZW1wY3ggJiAweDAwRkY7IC8qIFJIU1lFWFAyUz1sY2RocmUgKi8KIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQyUG9ydCwgMHgyMSwgdGVtcCk7CkBAIC00MDQ0LDEwICs0MDQ0LDEwIEBACiAJdGVtcGJ4ID0gcFZCSW5mby0+VkdBSERFOwogCiAJaWYgKG1vZGVmbGFnICYgSGFsZkRDTEspCi0JCXRlbXBieCA9IHRlbXBieCA+PiAxOworCQl0ZW1wYnggPj49IDE7CiAKIAlpZiAoWEdJX0lzTENERHVhbExpbmsocFZCSW5mbykpCi0JCXRlbXBieCA9IHRlbXBieCA+PiAxOworCQl0ZW1wYnggPj49IDE7CiAKIAlpZiAodGVtcGN4ICYgU2V0Q1JUMlRvSGlWaXNpb24pIHsKIAkJdGVtcCA9IDA7CkBAIC00MTA3LDcgKzQxMDcsNyBAQAogCXhnaWZiX3JlZ19zZXQocFZCSW5mby0+UGFydDRQb3J0LCAweDFBLCB0ZW1wKTsKIAl0ZW1wYnggPSAodW5zaWduZWQgc2hvcnQpICh0ZW1wZWJ4ID4+IDE2KTsKIAl0ZW1wID0gdGVtcGJ4ICYgMHgwMEZGOwotCXRlbXAgPSB0ZW1wIDw8IDQ7CisJdGVtcCA8PD0gNDsKIAl0ZW1wIHw9ICgodGVtcGN4ICYgMHhGRjAwKSA+PiA4KTsKIAl4Z2lmYl9yZWdfc2V0KHBWQkluZm8tPlBhcnQ0UG9ydCwgMHgxOSwgdGVtcCk7CiAKQEAgLTQxMTgsMTAgKzQxMTgsMTAgQEAKIAkJeGdpZmJfcmVnX3NldChwVkJJbmZvLT5QYXJ0NFBvcnQsIDB4MUMsIHRlbXApOwogCQl0ZW1wYXggPSBwVkJJbmZvLT5WR0FIREU7CiAJCWlmIChtb2RlZmxhZyAmIEhhbGZEQ0xLKQotCQkJdGVtcGF4ID0gdGVtcGF4ID4+IDE7CisJCQl0ZW1wYXggPj49IDE7CiAKIAkJaWYgKFhHSV9Jc0xDRER1YWxMaW5rKHBWQkluZm8pKQotCQkJdGVtcGF4ID0gdGVtcGF4ID4+IDE7CisJCQl0ZW1wYXggPj49IDE7CiAKIAkJaWYgKHBWQkluZm8tPlZCSW5mbyAmIFNldENSVDJUb0xDRCkgewogCQkJaWYgKHRlbXBheCA+IDgwMCkKQEAgLTQxNjIsNyArNDE2Miw3IEBACiAJCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDRQb3J0LCAweDFGLCAweDAwQzAsIHRlbXApOwogCQl0ZW1wYnggPSBwVkJJbmZvLT5IVDsKIAkJaWYgKFhHSV9Jc0xDRER1YWxMaW5rKHBWQkluZm8pKQotCQkJdGVtcGJ4ID0gdGVtcGJ4ID4+IDE7CisJCQl0ZW1wYnggPj49IDE7CiAJCXRlbXBieCA9ICh0ZW1wYnggPj4gMSkgLSAyOwogCQl0ZW1wID0gKCh0ZW1wYnggJiAweDA3MDApID4+IDgpIDw8IDM7CiAJCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDRQb3J0LCAweDIxLCAweDAwQzAsIHRlbXApOwpAQCAtNDYyMiw3ICs0NjIyLDcgQEAKIAkJCXRlbXBibCA9IFhHSTMwMVRWRGVsYXk7CiAKIAkJCWlmIChwVkJJbmZvLT5WQkluZm8gJiBTZXRDUlQyVG9EdWFsRWRnZSkKLQkJCQl0ZW1wYmwgPSB0ZW1wYmwgPj4gNDsKKwkJCQl0ZW1wYmwgPj49IDQ7CiAJCQlpZiAocFZCSW5mby0+VkJJbmZvICYKIAkJCSAgICAoU2V0Q1JUMlRvTENEIHwgWEdJX1NldENSVDJUb0xDREEpKSB7CiAJCQkJdGVtcGJoID0gWEdJMzAxTENERGVsYXk7CkBAIC00Nzg1LDcgKzQ3ODUsNyBAQAogCXRlbXBieCA9IFhHSV9HZXRUVlB0ckluZGV4KHBWQkluZm8pOwogCXRlbXBieCAmPSAweEZFOwogCXRlbXBhaCA9IFRWQW50aUZsaWNrTGlzdFt0ZW1wYnhdOwotCXRlbXBhaCA9IHRlbXBhaCA8PCA0OworCXRlbXBhaCA8PD0gNDsKIAogCXhnaWZiX3JlZ19hbmRfb3IocFZCSW5mby0+UGFydDJQb3J0LCAweDBBLCAweDhGLCB0ZW1wYWgpOwogfQpAQCAtNDc5OSw3ICs0Nzk5LDcgQEAKIAl0ZW1wYnggPSBYR0lfR2V0VFZQdHJJbmRleChwVkJJbmZvKTsKIAl0ZW1wYnggJj0gMHhGRTsKIAl0ZW1wYWggPSBUVkVkZ2VMaXN0W3RlbXBieF07Ci0JdGVtcGFoID0gdGVtcGFoIDw8IDU7CisJdGVtcGFoIDw8PSA1OwogCiAJeGdpZmJfcmVnX2FuZF9vcihwVkJJbmZvLT5QYXJ0MlBvcnQsIDB4M0EsIDB4MUYsIHRlbXBhaCk7CiB9CkBAIC01MTAxLDcgKzUxMDEsNyBAQAogCXVuc2lnbmVkIHNob3J0IFJlZnJlc2hSYXRlVGFibGVJbmRleCwgaSwgaW5kZXgsIHRlbXA7CiAKIAlpbmRleCA9IHhnaWZiX3JlZ19nZXQocFZCSW5mby0+UDNkNCwgMHgzMyk7Ci0JaW5kZXggPSBpbmRleCA+PiBwVkJJbmZvLT5TZWxlY3RDUlQyUmF0ZTsKKwlpbmRleCA+Pj0gcFZCSW5mby0+U2VsZWN0Q1JUMlJhdGU7CiAJaW5kZXggJj0gMHgwRjsKIAogCWlmIChwVkJJbmZvLT5MQ0RJbmZvICYgTENETm9uRXhwYW5kaW5nKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0LmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYwppbmRleCA1MGJhZDU1Li43N2Q2NDI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYwpAQCAtMTE4MSw3ICsxMTgxLDcgQEAKIAkgKiB0cmFkaXRpb25hbCBpU0NTSSBibG9jayBJL08uCiAJICovCiAJaWYgKGlzY3NpdF9hbGxvY2F0ZV9pb3ZlY3MoY21kKSA8IDApIHsKLQkJcmV0dXJuIGlzY3NpdF9hZGRfcmVqZWN0X2NtZChjbWQsCisJCXJldHVybiBpc2NzaXRfcmVqZWN0X2NtZChjbWQsCiAJCQkJSVNDU0lfUkVBU09OX0JPT0tNQVJLX05PX1JFU09VUkNFUywgYnVmKTsKIAl9CiAJaW1tZWRfZGF0YSA9IGNtZC0+aW1tZWRpYXRlX2RhdGE7CkBAIC0zNDY4LDYgKzM0NjgsNyBAQAogCQkJCQkJdHBnX25wX2xpc3QpIHsKIAkJCQlzdHJ1Y3QgaXNjc2lfbnAgKm5wID0gdHBnX25wLT50cGdfbnA7CiAJCQkJYm9vbCBpbmFkZHJfYW55ID0gaXNjc2l0X2NoZWNrX2luYWRkcl9hbnkobnApOworCQkJCWNoYXIgKmZtdF9zdHI7CiAKIAkJCQlpZiAobnAtPm5wX25ldHdvcmtfdHJhbnNwb3J0ICE9IG5ldHdvcmtfdHJhbnNwb3J0KQogCQkJCQljb250aW51ZTsKQEAgLTM0OTUsOCArMzQ5NiwxMiBAQAogCQkJCQl9CiAJCQkJfQogCi0JCQkJbGVuID0gc3ByaW50ZihidWYsICJUYXJnZXRBZGRyZXNzPSIKLQkJCQkJIiVzOiVodSwlaHUiLAorCQkJCWlmIChucC0+bnBfc29ja2FkZHIuc3NfZmFtaWx5ID09IEFGX0lORVQ2KQorCQkJCQlmbXRfc3RyID0gIlRhcmdldEFkZHJlc3M9WyVzXTolaHUsJWh1IjsKKwkJCQllbHNlCisJCQkJCWZtdF9zdHIgPSAiVGFyZ2V0QWRkcmVzcz0lczolaHUsJWh1IjsKKworCQkJCWxlbiA9IHNwcmludGYoYnVmLCBmbXRfc3RyLAogCQkJCQlpbmFkZHJfYW55ID8gY29ubi0+bG9jYWxfaXAgOiBucC0+bnBfaXAsCiAJCQkJCW5wLT5ucF9wb3J0LAogCQkJCQl0cGctPnRwZ3QpOwpAQCAtNDI1NiwxMSArNDI2MSwxNyBAQAogCXByX2RlYnVnKCJDbG9zaW5nIGlTQ1NJIGNvbm5lY3Rpb24gQ0lEICVodSBvbiBTSUQ6IgogCQkiICV1XG4iLCBjb25uLT5jaWQsIHNlc3MtPnNpZCk7CiAJLyoKLQkgKiBBbHdheXMgdXAgY29ubl9sb2dvdXRfY29tcCBqdXN0IGluIGNhc2UgdGhlIFJYIFRocmVhZCBpcyBzbGVlcGluZwotCSAqIGFuZCB0aGUgbG9nb3V0IHJlc3BvbnNlIG5ldmVyIGdvdCBzZW50IGJlY2F1c2UgdGhlIGNvbm5lY3Rpb24KLQkgKiBmYWlsZWQuCisJICogQWx3YXlzIHVwIGNvbm5fbG9nb3V0X2NvbXAgZm9yIHRoZSB0cmFkaXRpb25hbCBUQ1AgY2FzZSBqdXN0IGluIGNhc2UKKwkgKiB0aGUgUlggVGhyZWFkIGluIGlzY3NpX3RhcmdldF9yeF9vcGNvZGUoKSBpcyBzbGVlcGluZyBhbmQgdGhlIGxvZ291dAorCSAqIHJlc3BvbnNlIG5ldmVyIGdvdCBzZW50IGJlY2F1c2UgdGhlIGNvbm5lY3Rpb24gZmFpbGVkLgorCSAqCisJICogSG93ZXZlciBmb3IgaXNlci10YXJnZXQsIGlzZXJ0X3dhaXQ0bG9nb3V0KCkgaXMgdXNpbmcgY29ubl9sb2dvdXRfY29tcAorCSAqIHRvIHNpZ25hbCBsb2dvdXQgcmVzcG9uc2UgVFggaW50ZXJydXB0IGNvbXBsZXRpb24uICBHbyBhaGVhZCBhbmQgc2tpcAorCSAqIHRoaXMgZm9yIGlzZXIgc2luY2UgaXNlcnRfcnhfb3Bjb2RlKCkgZG9lcyBub3Qgd2FpdCBvbiBsb2dvdXQgZmFpbHVyZSwKKwkgKiBhbmQgdG8gYXZvaWQgaXNjc2lfY29ubiBwb2ludGVyIGRlcmVmZXJlbmNlIGluIGlzZXItdGFyZ2V0IGNvZGUuCiAJICovCi0JY29tcGxldGUoJmNvbm4tPmNvbm5fbG9nb3V0X2NvbXApOworCWlmIChjb25uLT5jb25uX3RyYW5zcG9ydC0+dHJhbnNwb3J0X3R5cGUgPT0gSVNDU0lfVENQKQorCQljb21wbGV0ZSgmY29ubi0+Y29ubl9sb2dvdXRfY29tcCk7CiAKIAlpc2NzaV9yZWxlYXNlX3RocmVhZF9zZXQoY29ubik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9lcmwwLmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfZXJsMC5jCmluZGV4IDFjMTk3YmEuLmJkZDg3MzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9lcmwwLmMKKysrIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2VybDAuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPHRhcmdldC90YXJnZXRfY29yZV9mYWJyaWMuaD4KIAogI2luY2x1ZGUgPHRhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29yZS5oPgotI2luY2x1ZGUgPHRhcmdldC9pc2NzaS9pc2NzaV90cmFuc3BvcnQuaD4KICNpbmNsdWRlICJpc2NzaV90YXJnZXRfc2VxX3BkdV9saXN0LmgiCiAjaW5jbHVkZSAiaXNjc2lfdGFyZ2V0X3RxLmgiCiAjaW5jbHVkZSAiaXNjc2lfdGFyZ2V0X2VybDAuaCIKQEAgLTk0MCw4ICs5MzksNyBAQAogCiAJaWYgKGNvbm4tPmNvbm5fc3RhdGUgPT0gVEFSR19DT05OX1NUQVRFX0lOX0xPR09VVCkgewogCQlzcGluX3VubG9ja19iaCgmY29ubi0+c3RhdGVfbG9jayk7Ci0JCWlmIChjb25uLT5jb25uX3RyYW5zcG9ydC0+dHJhbnNwb3J0X3R5cGUgPT0gSVNDU0lfVENQKQotCQkJaXNjc2l0X2Nsb3NlX2Nvbm5lY3Rpb24oY29ubik7CisJCWlzY3NpdF9jbG9zZV9jb25uZWN0aW9uKGNvbm4pOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jIGIvZHJpdmVycy90YXJnZXQvbG9vcGJhY2svdGNtX2xvb3AuYwppbmRleCA2YjNjMzI5Li5jMzZiZDdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMKQEAgLTk1MywxMSArOTUzLDggQEAKIAkJdHJhbnNwb3J0X2ZyZWVfc2Vzc2lvbih0bF9uZXh1cy0+c2Vfc2Vzcyk7CiAJCWdvdG8gb3V0OwogCX0KLQkvKgotCSAqIE5vdywgcmVnaXN0ZXIgdGhlIFNBUyBJX1QgTmV4dXMgYXMgYWN0aXZlIHdpdGggdGhlIGNhbGwgdG8KLQkgKiB0cmFuc3BvcnRfcmVnaXN0ZXJfc2Vzc2lvbigpCi0JICovCi0JX190cmFuc3BvcnRfcmVnaXN0ZXJfc2Vzc2lvbihzZV90cGcsIHRsX25leHVzLT5zZV9zZXNzLT5zZV9ub2RlX2FjbCwKKwkvKiBOb3csIHJlZ2lzdGVyIHRoZSBTQVMgSV9UIE5leHVzIGFzIGFjdGl2ZS4gKi8KKwl0cmFuc3BvcnRfcmVnaXN0ZXJfc2Vzc2lvbihzZV90cGcsIHRsX25leHVzLT5zZV9zZXNzLT5zZV9ub2RlX2FjbCwKIAkJCXRsX25leHVzLT5zZV9zZXNzLCB0bF9uZXh1cyk7CiAJdGxfdHBnLT50bF9uZXh1cyA9IHRsX25leHVzOwogCXByX2RlYnVnKCJUQ01fTG9vcF9Db25maWdGUzogRXN0YWJsaXNoZWQgSV9UIE5leHVzIHRvIGVtdWxhdGVkIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZGV2aWNlLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYwppbmRleCA1OGY0OWZmLi43ZmFhNmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYwpAQCAtNjUwLDYgKzY1MCwxOCBAQAogCXJldHVybiBhbGlnbmVkX21heF9zZWN0b3JzOwogfQogCitib29sIHNlX2Rldl9jaGVja193Y2Uoc3RydWN0IHNlX2RldmljZSAqZGV2KQoreworCWJvb2wgd2NlID0gZmFsc2U7CisKKwlpZiAoZGV2LT50cmFuc3BvcnQtPmdldF93cml0ZV9jYWNoZSkKKwkJd2NlID0gZGV2LT50cmFuc3BvcnQtPmdldF93cml0ZV9jYWNoZShkZXYpOworCWVsc2UgaWYgKGRldi0+ZGV2X2F0dHJpYi5lbXVsYXRlX3dyaXRlX2NhY2hlID4gMCkKKwkJd2NlID0gdHJ1ZTsKKworCXJldHVybiB3Y2U7Cit9CisKIGludCBzZV9kZXZfc2V0X21heF91bm1hcF9sYmFfY291bnQoCiAJc3RydWN0IHNlX2RldmljZSAqZGV2LAogCXUzMiBtYXhfdW5tYXBfbGJhX2NvdW50KQpAQCAtNzY3LDYgKzc3OSwxNiBAQAogCQlwcl9lcnIoIklsbGVnYWwgdmFsdWUgJWRcbiIsIGZsYWcpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CisJaWYgKGZsYWcgJiYKKwkgICAgZGV2LT50cmFuc3BvcnQtPmdldF93cml0ZV9jYWNoZSkgeworCQlwcl93YXJuKCJlbXVsYXRlX2Z1YV93cml0ZSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGRldmljZSwgaWdub3JpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGRldi0+ZXhwb3J0X2NvdW50KSB7CisJCXByX2VycigiZW11bGF0ZV9mdWFfd3JpdGUgY2Fubm90IGJlIGNoYW5nZWQgd2l0aCBhY3RpdmUiCisJCSAgICAgICAiIGV4cG9ydHM6ICVkXG4iLCBkZXYtPmV4cG9ydF9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAlkZXYtPmRldl9hdHRyaWIuZW11bGF0ZV9mdWFfd3JpdGUgPSBmbGFnOwogCXByX2RlYnVnKCJkZXZbJXBdOiBTRSBEZXZpY2UgRm9yY2VkIFVuaXQgQWNjZXNzIFdSSVRFczogJWRcbiIsCiAJCQlkZXYsIGRldi0+ZGV2X2F0dHJpYi5lbXVsYXRlX2Z1YV93cml0ZSk7CkBAIC04MDEsNyArODIzLDExIEBACiAJCXByX2VycigiZW11bGF0ZV93cml0ZV9jYWNoZSBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIGRldmljZVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQorCWlmIChkZXYtPmV4cG9ydF9jb3VudCkgeworCQlwcl9lcnIoImVtdWxhdGVfd3JpdGVfY2FjaGUgY2Fubm90IGJlIGNoYW5nZWQgd2l0aCBhY3RpdmUiCisJCSAgICAgICAiIGV4cG9ydHM6ICVkXG4iLCBkZXYtPmV4cG9ydF9jb3VudCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAlkZXYtPmRldl9hdHRyaWIuZW11bGF0ZV93cml0ZV9jYWNoZSA9IGZsYWc7CiAJcHJfZGVidWcoImRldlslcF06IFNFIERldmljZSBXUklURV9DQUNIRV9FTVVMQVRJT04gZmxhZzogJWRcbiIsCiAJCQlkZXYsIGRldi0+ZGV2X2F0dHJpYi5lbXVsYXRlX3dyaXRlX2NhY2hlKTsKQEAgLTE1MzQsOCArMTU2MCw2IEBACiAJcmV0ID0gZGV2LT50cmFuc3BvcnQtPmNvbmZpZ3VyZV9kZXZpY2UoZGV2KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKLQlkZXYtPmRldl9mbGFncyB8PSBERl9DT05GSUdVUkVEOwotCiAJLyoKIAkgKiBYWFg6IHRoZXJlIGlzIG5vdCBtdWNoIHBvaW50IHRvIGhhdmUgdHdvIGRpZmZlcmVudCB2YWx1ZXMgaGVyZS4uCiAJICovCkBAIC0xNTk3LDYgKzE2MjEsOCBAQAogCWxpc3RfYWRkX3RhaWwoJmRldi0+Z19kZXZfbm9kZSwgJmdfZGV2aWNlX2xpc3QpOwogCW11dGV4X3VubG9jaygmZ19kZXZpY2VfbXV0ZXgpOwogCisJZGV2LT5kZXZfZmxhZ3MgfD0gREZfQ09ORklHVVJFRDsKKwogCXJldHVybiAwOwogCiBvdXRfZnJlZV9hbHVhOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHNjc2kuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3BzY3NpLmMKaW5kZXggMTA0NWRjZC4uZjZjOTU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHNjc2kuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wc2NzaS5jCkBAIC0xMTIxLDcgKzExMjEsNyBAQAogCXN0cnVjdCBwc2NzaV9kZXZfdmlydCAqcGR2ID0gUFNDU0lfREVWKGRldik7CiAJc3RydWN0IHNjc2lfZGV2aWNlICpzZCA9IHBkdi0+cGR2X3NkOwogCi0JcmV0dXJuIHNkLT50eXBlOworCXJldHVybiAoc2QpID8gc2QtPnR5cGUgOiBUWVBFX05PX0xVTjsKIH0KIAogc3RhdGljIHNlY3Rvcl90IHBzY3NpX2dldF9ibG9ja3Moc3RydWN0IHNlX2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfc2JjLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9zYmMuYwppbmRleCA5YTJmOWQzLi4zZTcyOTc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9zYmMuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9zYmMuYwpAQCAtNzA4LDggKzcwOCw3IEBACiAJCX0KIAl9CiAJaWYgKGNkYlsxXSAmIDB4OCkgewotCQlpZiAoIWRldi0+ZGV2X2F0dHJpYi5lbXVsYXRlX2Z1YV93cml0ZSB8fAotCQkgICAgIWRldi0+ZGV2X2F0dHJpYi5lbXVsYXRlX3dyaXRlX2NhY2hlKSB7CisJCWlmICghZGV2LT5kZXZfYXR0cmliLmVtdWxhdGVfZnVhX3dyaXRlIHx8ICFzZV9kZXZfY2hlY2tfd2NlKGRldikpIHsKIAkJCXByX2VycigiR290IENEQjogMHglMDJ4IHdpdGggRlVBIGJpdCBzZXQsIGJ1dCBkZXZpY2UiCiAJCQkgICAgICAgIiBkb2VzIG5vdCBhZHZlcnRpc2Ugc3VwcG9ydCBmb3IgRlVBIHdyaXRlXG4iLAogCQkJICAgICAgIGNkYlswXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9zcGMuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NwYy5jCmluZGV4IDQ2MGU5MzEuLjZjOGJkNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NwYy5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3NwYy5jCkBAIC00NTQsMTkgKzQ1NCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNwY19lbXVsYXRlX2V2cGRfODMpOwogCi1zdGF0aWMgYm9vbAotc3BjX2NoZWNrX2Rldl93Y2Uoc3RydWN0IHNlX2RldmljZSAqZGV2KQotewotCWJvb2wgd2NlID0gZmFsc2U7Ci0KLQlpZiAoZGV2LT50cmFuc3BvcnQtPmdldF93cml0ZV9jYWNoZSkKLQkJd2NlID0gZGV2LT50cmFuc3BvcnQtPmdldF93cml0ZV9jYWNoZShkZXYpOwotCWVsc2UgaWYgKGRldi0+ZGV2X2F0dHJpYi5lbXVsYXRlX3dyaXRlX2NhY2hlID4gMCkKLQkJd2NlID0gdHJ1ZTsKLQotCXJldHVybiB3Y2U7Ci19Ci0KIC8qIEV4dGVuZGVkIElOUVVJUlkgRGF0YSBWUEQgUGFnZSAqLwogc3RhdGljIHNlbnNlX3JlYXNvbl90CiBzcGNfZW11bGF0ZV9ldnBkXzg2KHN0cnVjdCBzZV9jbWQgKmNtZCwgdW5zaWduZWQgY2hhciAqYnVmKQpAQCAtNDkwLDcgKzQ3Nyw3IEBACiAJYnVmWzVdID0gMHgwNzsKIAogCS8qIElmIFdyaXRlQ2FjaGUgZW11bGF0aW9uIGlzIGVuYWJsZWQsIHNldCBWX1NVUCAqLwotCWlmIChzcGNfY2hlY2tfZGV2X3djZShkZXYpKQorCWlmIChzZV9kZXZfY2hlY2tfd2NlKGRldikpCiAJCWJ1Zls2XSA9IDB4MDE7CiAJLyogSWYgYW4gTEJBIG1hcCBpcyBwcmVzZW50IHNldCBSX1NVUCAqLwogCXNwaW5fbG9jaygmY21kLT5zZV9kZXYtPnQxMF9hbHVhLmxiYV9tYXBfbG9jayk7CkBAIC04OTcsNyArODg0LDcgQEAKIAlpZiAocGMgPT0gMSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoc3BjX2NoZWNrX2Rldl93Y2UoZGV2KSkKKwlpZiAoc2VfZGV2X2NoZWNrX3djZShkZXYpKQogCQlwWzJdID0gMHgwNDsgLyogV3JpdGUgQ2FjaGUgRW5hYmxlICovCiAJcFsxMl0gPSAweDIwOyAvKiBEaXNhYmxlZCBSZWFkIEFoZWFkICovCiAKQEAgLTEwMDksNyArOTk2LDcgQEAKIAkgICAgIChjbWQtPnNlX2RldmUtPmx1bl9mbGFncyAmIFRSQU5TUE9SVF9MVU5GTEFHU19SRUFEX09OTFkpKSkKIAkJc3BjX21vZGVzZW5zZV93cml0ZV9wcm90ZWN0KCZidWZbbGVuZ3RoXSwgdHlwZSk7CiAKLQlpZiAoKHNwY19jaGVja19kZXZfd2NlKGRldikpICYmCisJaWYgKChzZV9kZXZfY2hlY2tfd2NlKGRldikpICYmCiAJICAgIChkZXYtPmRldl9hdHRyaWIuZW11bGF0ZV9mdWFfd3JpdGUgPiAwKSkKIAkJc3BjX21vZGVzZW5zZV9kcG9mdWEoJmJ1ZltsZW5ndGhdLCB0eXBlKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwppbmRleCAwYWRjMGY2Li5hYzNjYmFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwpAQCAtMjM4OSw2ICsyMzg5LDEwIEBACiAJbGlzdF9hZGRfdGFpbCgmc2VfY21kLT5zZV9jbWRfbGlzdCwgJnNlX3Nlc3MtPnNlc3NfY21kX2xpc3QpOwogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlX3Nlc3MtPnNlc3NfY21kX2xvY2ssIGZsYWdzKTsKKworCWlmIChyZXQgJiYgYWNrX2tyZWYpCisJCXRhcmdldF9wdXRfc2Vzc19jbWQoc2Vfc2Vzcywgc2VfY21kKTsKKwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKHRhcmdldF9nZXRfc2Vzc19jbWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19pby5jIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19pby5jCmluZGV4IDk3YjQ4NmMuLjU4M2U3NTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfaW8uYworKysgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2lvLmMKQEAgLTM1OSw3ICszNTksNyBAQAogCQllcCA9IGZjX3NlcV9leGNoKHNlcSk7CiAJCWlmIChlcCkgewogCQkJbHBvcnQgPSBlcC0+bHA7Ci0JCQlpZiAobHBvcnQgJiYgKGVwLT54aWQgPD0gbHBvcnQtPmxyb194aWQpKQorCQkJaWYgKGxwb3J0ICYmIChlcC0+eGlkIDw9IGxwb3J0LT5scm9feGlkKSkgewogCQkJCS8qCiAJCQkJICogImRkcF9kb25lIiB0cmlnZ2VyIGludmFsaWRhdGlvbiBvZiBIVwogCQkJCSAqIHNwZWNpZmljIEREUCBjb250ZXh0CkBAIC0zNzQsNiArMzc0LDcgQEAKIAkJCQkgKiBpZGVudGlmaWVkIHVzaW5nIGVwLT54aWQpCiAJCQkJICovCiAJCQkJY21kLT53YXNfZGRwX3NldHVwID0gMDsKKwkJCX0KIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9zdC9zdF90aGVybWFsLmMgYi9kcml2ZXJzL3RoZXJtYWwvc3Qvc3RfdGhlcm1hbC5jCmluZGV4IGQxZWM1ODAuLjc2YzUxNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC9zdC9zdF90aGVybWFsLmMKKysrIGIvZHJpdmVycy90aGVybWFsL3N0L3N0X3RoZXJtYWwuYwpAQCAtMjUsNyArMjUsNyBAQAogICogRnVuY3Rpb24gdG8gYWxsb2NhdGUgcmVnZmllbGRzIHdoaWNoIGFyZSBjb21tb24KICAqIGJldHdlZW4gc3lzY2ZnIGFuZCBtZW1vcnkgbWFwcGVkIGJhc2VkIHNlbnNvcnMKICAqLwotaW50IHN0X3RoZXJtYWxfYWxsb2NfcmVnZmllbGRzKHN0cnVjdCBzdF90aGVybWFsX3NlbnNvciAqc2Vuc29yKQorc3RhdGljIGludCBzdF90aGVybWFsX2FsbG9jX3JlZ2ZpZWxkcyhzdHJ1Y3Qgc3RfdGhlcm1hbF9zZW5zb3IgKnNlbnNvcikKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBzZW5zb3ItPmRldjsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBzZW5zb3ItPnJlZ21hcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9zdC9zdF90aGVybWFsX21lbW1hcC5jIGIvZHJpdmVycy90aGVybWFsL3N0L3N0X3RoZXJtYWxfbWVtbWFwLmMKaW5kZXggMDY3YmZjZC4uZmMwYzllMSAxMDA2NDQKLS0tIGEvZHJpdmVycy90aGVybWFsL3N0L3N0X3RoZXJtYWxfbWVtbWFwLmMKKysrIGIvZHJpdmVycy90aGVybWFsL3N0L3N0X3RoZXJtYWxfbWVtbWFwLmMKQEAgLTE1Nyw3ICsxNTcsNyBAQAogfTsKIAogLyogQ29tcGF0aWJsZSBkZXZpY2UgZGF0YSBzdGloNDE2IG1wZSB0aGVybWFsIHNlbnNvciAqLwotY29uc3Qgc3RydWN0IHN0X3RoZXJtYWxfY29tcGF0X2RhdGEgc3RfNDE2bXBlX2NkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzdF90aGVybWFsX2NvbXBhdF9kYXRhIHN0XzQxNm1wZV9jZGF0YSA9IHsKIAkucmVnX2ZpZWxkcwkJPSBzdF9tbWFwX3RoZXJtYWxfcmVnZmllbGRzLAogCS5vcHMJCQk9ICZzdF9tbWFwX3NlbnNvcl9vcHMsCiAJLmNhbGlicmF0aW9uX3ZhbAk9IDE0LApAQCAtMTY2LDcgKzE2Niw3IEBACiB9OwogCiAvKiBDb21wYXRpYmxlIGRldmljZSBkYXRhIHN0aWg0MDcgdGhlcm1hbCBzZW5zb3IgKi8KLWNvbnN0IHN0cnVjdCBzdF90aGVybWFsX2NvbXBhdF9kYXRhIHN0XzQwN19jZGF0YSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3RfdGhlcm1hbF9jb21wYXRfZGF0YSBzdF80MDdfY2RhdGEgPSB7CiAJLnJlZ19maWVsZHMJCT0gc3RfbW1hcF90aGVybWFsX3JlZ2ZpZWxkcywKIAkub3BzCQkJPSAmc3RfbW1hcF9zZW5zb3Jfb3BzLAogCS5jYWxpYnJhdGlvbl92YWwJPSAxNiwKQEAgLTE3NCwxOSArMTc0LDE5IEBACiAJLmNyaXRfdGVtcAkJPSAxMjAsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzdF9tbWFwX3RoZXJtYWxfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHN0X21tYXBfdGhlcm1hbF9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQxNi1tcGUtdGhlcm1hbCIsIC5kYXRhID0gJnN0XzQxNm1wZV9jZGF0YSB9LAogCXsgLmNvbXBhdGlibGUgPSAic3Qsc3RpaDQwNy10aGVybWFsIiwgICAgIC5kYXRhID0gJnN0XzQwN19jZGF0YSB9LAogCXsgLyogc2VudGluZWwgKi8gfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN0X21tYXBfdGhlcm1hbF9vZl9tYXRjaCk7CiAKLWludCBzdF9tbWFwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHN0X21tYXBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlyZXR1cm4gc3RfdGhlcm1hbF9yZWdpc3RlcihwZGV2LCAgc3RfbW1hcF90aGVybWFsX29mX21hdGNoKTsKIH0KIAotaW50IHN0X21tYXBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHN0X21tYXBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJcmV0dXJuIHN0X3RoZXJtYWxfdW5yZWdpc3RlcihwZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGhlcm1hbC9zdC9zdF90aGVybWFsX3N5c2NmZy5jIGIvZHJpdmVycy90aGVybWFsL3N0L3N0X3RoZXJtYWxfc3lzY2ZnLmMKaW5kZXggMjZkMzZhMi4uM2RmNWI3ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC9zdC9zdF90aGVybWFsX3N5c2NmZy5jCisrKyBiL2RyaXZlcnMvdGhlcm1hbC9zdC9zdF90aGVybWFsX3N5c2NmZy5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIH07CiAKIC8qIENvbXBhdGlibGUgZGV2aWNlIGRhdGEgZm9yIHN0aWg0MTUgc2FzIHRoZXJtYWwgc2Vuc29yICovCi1jb25zdCBzdHJ1Y3Qgc3RfdGhlcm1hbF9jb21wYXRfZGF0YSBzdF80MTVzYXNfY2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHN0X3RoZXJtYWxfY29tcGF0X2RhdGEgc3RfNDE1c2FzX2NkYXRhID0gewogCS5zeXNfY29tcGF0CQk9ICJzdCxzdGloNDE1LWZyb250LXN5c2NmZyIsCiAJLnJlZ19maWVsZHMJCT0gc3RfNDE1c2FzX3JlZ2ZpZWxkcywKIAkub3BzCQkJPSAmc3Rfc3lzY2ZnX3NlbnNvcl9vcHMsCkBAIC0xMTQsNyArMTE0LDcgQEAKIH07CiAKIC8qIENvbXBhdGlibGUgZGV2aWNlIGRhdGEgZm9yIHN0aWg0MTUgbXBlIHRoZXJtYWwgc2Vuc29yICovCi1jb25zdCBzdHJ1Y3Qgc3RfdGhlcm1hbF9jb21wYXRfZGF0YSBzdF80MTVtcGVfY2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHN0X3RoZXJtYWxfY29tcGF0X2RhdGEgc3RfNDE1bXBlX2NkYXRhID0gewogCS5zeXNfY29tcGF0CQk9ICJzdCxzdGloNDE1LXN5c3RlbS1zeXNjZmciLAogCS5yZWdfZmllbGRzCQk9IHN0XzQxNW1wZV9yZWdmaWVsZHMsCiAJLm9wcwkJCT0gJnN0X3N5c2NmZ19zZW5zb3Jfb3BzLApAQCAtMTI0LDcgKzEyNCw3IEBACiB9OwogCiAvKiBDb21wYXRpYmxlIGRldmljZSBkYXRhIGZvciBzdGloNDE2IHNhcyB0aGVybWFsIHNlbnNvciAqLwotY29uc3Qgc3RydWN0IHN0X3RoZXJtYWxfY29tcGF0X2RhdGEgc3RfNDE2c2FzX2NkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBzdF90aGVybWFsX2NvbXBhdF9kYXRhIHN0XzQxNnNhc19jZGF0YSA9IHsKIAkuc3lzX2NvbXBhdAkJPSAic3Qsc3RpaDQxNi1mcm9udC1zeXNjZmciLAogCS5yZWdfZmllbGRzCQk9IHN0XzQxNnNhc19yZWdmaWVsZHMsCiAJLm9wcwkJCT0gJnN0X3N5c2NmZ19zZW5zb3Jfb3BzLApAQCAtMTM0LDcgKzEzNCw3IEBACiB9OwogCiAvKiBDb21wYXRpYmxlIGRldmljZSBkYXRhIGZvciBzdGlkMTI3IHRoZXJtYWwgc2Vuc29yICovCi1jb25zdCBzdHJ1Y3Qgc3RfdGhlcm1hbF9jb21wYXRfZGF0YSBzdF8xMjdfY2RhdGEgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHN0X3RoZXJtYWxfY29tcGF0X2RhdGEgc3RfMTI3X2NkYXRhID0gewogCS5zeXNfY29tcGF0CQk9ICJzdCxzdGlkMTI3LWNwdS1zeXNjZmciLAogCS5yZWdfZmllbGRzCQk9IHN0XzEyN19yZWdmaWVsZHMsCiAJLm9wcwkJCT0gJnN0X3N5c2NmZ19zZW5zb3Jfb3BzLApAQCAtMTQzLDcgKzE0Myw3IEBACiAJLmNyaXRfdGVtcAkJPSAxMjAsCiB9OwogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBzdF9zeXNjZmdfdGhlcm1hbF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3Rfc3lzY2ZnX3RoZXJtYWxfb2ZfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTUtc2FzLXRoZXJtYWwiLCAuZGF0YSA9ICZzdF80MTVzYXNfY2RhdGEgfSwKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTUtbXBlLXRoZXJtYWwiLCAuZGF0YSA9ICZzdF80MTVtcGVfY2RhdGEgfSwKIAl7IC5jb21wYXRpYmxlID0gInN0LHN0aWg0MTYtc2FzLXRoZXJtYWwiLCAuZGF0YSA9ICZzdF80MTZzYXNfY2RhdGEgfSwKQEAgLTE1MiwxMiArMTUyLDEyIEBACiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgc3Rfc3lzY2ZnX3RoZXJtYWxfb2ZfbWF0Y2gpOwogCi1pbnQgc3Rfc3lzY2ZnX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHN0X3N5c2NmZ19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXJldHVybiBzdF90aGVybWFsX3JlZ2lzdGVyKHBkZXYsIHN0X3N5c2NmZ190aGVybWFsX29mX21hdGNoKTsKIH0KIAotaW50IHN0X3N5c2NmZ19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgc3Rfc3lzY2ZnX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXJldHVybiBzdF90aGVybWFsX3VucmVnaXN0ZXIocGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9jb3JlLmMgYi9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9jb3JlLmMKaW5kZXggMTc0ZDNiYy4uNDEwOGRiNyAxMDA2NDQKLS0tIGEvZHJpdmVycy90aGVybWFsL3RoZXJtYWxfY29yZS5jCisrKyBiL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX2NvcmUuYwpAQCAtNDU4LDggKzQ1OCwxMCBAQAogCiAJcmV0ID0gdGhlcm1hbF96b25lX2dldF90ZW1wKHR6LCAmdGVtcCk7CiAJaWYgKHJldCkgewotCQlkZXZfd2FybigmdHotPmRldmljZSwgImZhaWxlZCB0byByZWFkIG91dCB0aGVybWFsIHpvbmUgJWRcbiIsCi0JCQkgdHotPmlkKTsKKwkJaWYgKHJldCAhPSAtRUFHQUlOKQorCQkJZGV2X3dhcm4oJnR6LT5kZXZpY2UsCisJCQkJICJmYWlsZWQgdG8gcmVhZCBvdXQgdGhlcm1hbCB6b25lICglZClcbiIsCisJCQkJIHJldCk7CiAJCXJldHVybjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L2dvbGRmaXNoLmMgYi9kcml2ZXJzL3R0eS9nb2xkZmlzaC5jCmluZGV4IDk2N2IyYzIuLjA2NTVmZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L2dvbGRmaXNoLmMKKysrIGIvZHJpdmVycy90dHkvZ29sZGZpc2guYwpAQCAtMjI5LDcgKzIyOSw2IEBACiB7CiAJc3RydWN0IGdvbGRmaXNoX3R0eSAqcXR0eTsKIAlpbnQgcmV0ID0gLUVJTlZBTDsKLQlpbnQgaTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJc3RydWN0IGRldmljZSAqdHR5ZGV2OwogCXZvaWQgX19pb21lbSAqYmFzZTsKQEAgLTI5Myw3ICsyOTIsNiBAQAogCW11dGV4X3VubG9jaygmZ29sZGZpc2hfdHR5X2xvY2spOwogCXJldHVybiAwOwogCi0JdHR5X3VucmVnaXN0ZXJfZGV2aWNlKGdvbGRmaXNoX3R0eV9kcml2ZXIsIGkpOwogZXJyX3R0eV9yZWdpc3Rlcl9kZXZpY2VfZmFpbGVkOgogCWZyZWVfaXJxKGlycSwgcGRldik7CiBlcnJfcmVxdWVzdF9pcnFfZmFpbGVkOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvaXB3aXJlbGVzcy9oYXJkd2FyZS5jIGIvZHJpdmVycy90dHkvaXB3aXJlbGVzcy9oYXJkd2FyZS5jCmluZGV4IDVjNzdlMWUuLmFkNzAzMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L2lwd2lyZWxlc3MvaGFyZHdhcmUuYworKysgYi9kcml2ZXJzL3R0eS9pcHdpcmVsZXNzL2hhcmR3YXJlLmMKQEAgLTE0NTUsNyArMTQ1NSw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAotCQlzZXRfUlRTKGh3LCBQUklPX1NFVFVQLCBjaGFubmVsX2lkeCwKKwkJcmV0ID0gc2V0X1JUUyhodywgUFJJT19TRVRVUCwgY2hhbm5lbF9pZHgsCiAJCQkoaHctPmNvbnRyb2xfbGluZXMgW2NoYW5uZWxfaWR4XSAmCiAJCQkgSVBXX0NPTlRST0xfTElORV9SVFMpICE9IDApOwogCQlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2R3LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2R3LmMKaW5kZXggMmFiMjI5ZC4uNmFlNWI4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsLzgyNTAvODI1MF9kdy5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZHcuYwpAQCAtMTE5LDcgKzExOSwxMCBAQAogCQkJZHc4MjUwX2ZvcmNlX2lkbGUocCk7CiAJCQl3cml0ZWIodmFsdWUsIHAtPm1lbWJhc2UgKyAoVUFSVF9MQ1IgPDwgcC0+cmVnc2hpZnQpKTsKIAkJfQotCQlkZXZfZXJyKHAtPmRldiwgIkNvdWxkbid0IHNldCBMQ1IgdG8gJWRcbiIsIHZhbHVlKTsKKwkJLyoKKwkJICogRklYTUU6IHRoaXMgZGVhZGxvY2tzIGlmIHBvcnQtPmxvY2sgaXMgYWxyZWFkeSBoZWxkCisJCSAqIGRldl9lcnIocC0+ZGV2LCAiQ291bGRuJ3Qgc2V0IExDUiB0byAlZFxuIiwgdmFsdWUpOworCQkgKi8KIAl9CiB9CiAKQEAgLTE2Myw3ICsxNjYsMTAgQEAKIAkJCV9fcmF3X3dyaXRlcSh2YWx1ZSAmIDB4ZmYsCiAJCQkJICAgICBwLT5tZW1iYXNlICsgKFVBUlRfTENSIDw8IHAtPnJlZ3NoaWZ0KSk7CiAJCX0KLQkJZGV2X2VycihwLT5kZXYsICJDb3VsZG4ndCBzZXQgTENSIHRvICVkXG4iLCB2YWx1ZSk7CisJCS8qCisJCSAqIEZJWE1FOiB0aGlzIGRlYWRsb2NrcyBpZiBwb3J0LT5sb2NrIGlzIGFscmVhZHkgaGVsZAorCQkgKiBkZXZfZXJyKHAtPmRldiwgIkNvdWxkbid0IHNldCBMQ1IgdG8gJWRcbiIsIHZhbHVlKTsKKwkJICovCiAJfQogfQogI2VuZGlmIC8qIENPTkZJR182NEJJVCAqLwpAQCAtMTg3LDcgKzE5MywxMCBAQAogCQkJZHc4MjUwX2ZvcmNlX2lkbGUocCk7CiAJCQl3cml0ZWwodmFsdWUsIHAtPm1lbWJhc2UgKyAoVUFSVF9MQ1IgPDwgcC0+cmVnc2hpZnQpKTsKIAkJfQotCQlkZXZfZXJyKHAtPmRldiwgIkNvdWxkbid0IHNldCBMQ1IgdG8gJWRcbiIsIHZhbHVlKTsKKwkJLyoKKwkJICogRklYTUU6IHRoaXMgZGVhZGxvY2tzIGlmIHBvcnQtPmxvY2sgaXMgYWxyZWFkeSBoZWxkCisJCSAqIGRldl9lcnIocC0+ZGV2LCAiQ291bGRuJ3Qgc2V0IExDUiB0byAlZFxuIiwgdmFsdWUpOworCQkgKi8KIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZmludGVrLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2ZpbnRlay5jCmluZGV4IDFlNjg5OWJjLi41ODE1ZTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvODI1MC84MjUwX2ZpbnRlay5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC84MjUwLzgyNTBfZmludGVrLmMKQEAgLTIzNCwxOCArMjM0LDcgQEAKIAkuaWRfdGFibGUJPSBmaW50ZWtfZGV2X3RhYmxlLAogfTsKIAotc3RhdGljIGludCBmaW50ZWtfODI1MF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBucF9yZWdpc3Rlcl9kcml2ZXIoJmZpbnRla184MjUwX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChmaW50ZWtfODI1MF9pbml0KTsKLQotc3RhdGljIHZvaWQgZmludGVrXzgyNTBfZXhpdCh2b2lkKQotewotCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmZmludGVrXzgyNTBfZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGZpbnRla184MjUwX2V4aXQpOwotCittb2R1bGVfcG5wX2RyaXZlcihmaW50ZWtfODI1MF9kcml2ZXIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJGaW50ZWsgRjgxMjE2NCBtb2R1bGUiKTsKIE1PRFVMRV9BVVRIT1IoIlJpY2FyZG8gUmliYWxkYSA8cmljYXJkby5yaWJhbGRhQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9mc2xfbHB1YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvZnNsX2xwdWFydC5jCmluZGV4IGIxODkzZjMuLjNhZDE0NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9mc2xfbHB1YXJ0LmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2ZzbF9scHVhcnQuYwpAQCAtOTIxLDYgKzkyMSw5IEBACiAJd3JpdGViKHZhbCB8IFVBUlRQRklGT19UWEZFIHwgVUFSVFBGSUZPX1JYRkUsCiAJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVFBGSUZPKTsKIAorCS8qIGV4cGxpY2l0bHkgY2xlYXIgUkRSRiAqLworCXJlYWRiKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQVJUU1IxKTsKKwogCS8qIGZsdXNoIFR4IGFuZCBSeCBGSUZPICovCiAJd3JpdGViKFVBUlRDRklGT19UWEZMVVNIIHwgVUFSVENGSUZPX1JYRkxVU0gsCiAJCQlzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUFSVENGSUZPKTsKQEAgLTEwNzYsNiArMTA3OSw4IEBACiAJc3BvcnQtPnR4Zmlmb19zaXplID0gMHgxIDw8ICgoKHRlbXAgPj4gVUFSVFBGSUZPX1RYU0laRV9PRkYpICYKIAkJVUFSVFBGSUZPX0ZJRk9TSVpFX01BU0spICsgMSk7CiAKKwlzcG9ydC0+cG9ydC5maWZvc2l6ZSA9IHNwb3J0LT50eGZpZm9fc2l6ZTsKKwogCXNwb3J0LT5yeGZpZm9fc2l6ZSA9IDB4MSA8PCAoKCh0ZW1wID4+IFVBUlRQRklGT19SWFNJWkVfT0ZGKSAmCiAJCVVBUlRQRklGT19GSUZPU0laRV9NQVNLKSArIDEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jIGIvZHJpdmVycy90dHkvc2VyaWFsL3NhbXN1bmcuYwppbmRleCBhZjgyMWE5Li5jZjA4ODc2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2Ftc3VuZy5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zYW1zdW5nLmMKQEAgLTk2Myw2ICs5NjMsNyBAQAogCQkJZnJlZV9pcnEob3VycG9ydC0+dHhfaXJxLCBvdXJwb3J0KTsKIAkJdHhfZW5hYmxlZChwb3J0KSA9IDA7CiAJCW91cnBvcnQtPnR4X2NsYWltZWQgPSAwOworCQlvdXJwb3J0LT50eF9tb2RlID0gMDsKIAl9CiAKIAlpZiAob3VycG9ydC0+cnhfY2xhaW1lZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc3lzcnEuYyBiL2RyaXZlcnMvdHR5L3N5c3JxLmMKaW5kZXggMjU5YTRkNS4uODQzZjJjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc3lzcnEuYworKysgYi9kcml2ZXJzL3R0eS9zeXNycS5jCkBAIC0yNzUsNiArMjc1LDcgQEAKIHN0YXRpYyB2b2lkIHN5c3JxX2hhbmRsZV9zaG93c3RhdGUoaW50IGtleSkKIHsKIAlzaG93X3N0YXRlKCk7CisJc2hvd193b3JrcXVldWVfc3RhdGUoKTsKIH0KIHN0YXRpYyBzdHJ1Y3Qgc3lzcnFfa2V5X29wIHN5c3JxX3Nob3dzdGF0ZV9vcCA9IHsKIAkuaGFuZGxlcgk9IHN5c3JxX2hhbmRsZV9zaG93c3RhdGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCmluZGV4IDJmMWUyYWEuLmQ4OTI2YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL01ha2VmaWxlCkBAIC01LDYgKzUsNyBAQAogIyBPYmplY3QgZmlsZXMgaW4gc3ViZGlyZWN0b3JpZXMKIAogb2JqLSQoQ09ORklHX1VTQikJCSs9IGNvcmUvCitvYmotJChDT05GSUdfVVNCX1NVUFBPUlQpCSs9IHBoeS8KIAogb2JqLSQoQ09ORklHX1VTQl9EV0MzKQkJKz0gZHdjMy8KIG9iai0kKENPTkZJR19VU0JfRFdDMikJCSs9IGR3YzIvCkBAIC00OCw3ICs0OSw2IEBACiBvYmotJChDT05GSUdfVVNCX1NFUklBTCkJKz0gc2VyaWFsLwogCiBvYmotJChDT05GSUdfVVNCKQkJKz0gbWlzYy8KLW9iai0kKENPTkZJR19VU0JfU1VQUE9SVCkJKz0gcGh5Lwogb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5US19EQkdQKQkrPSBlYXJseS8KIAogb2JqLSQoQ09ORklHX1VTQl9BVE0pCQkrPSBhdG0vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jIGIvZHJpdmVycy91c2IvYXRtL3VlYWdsZS1hdG0uYwppbmRleCA1YTQ1OTM3Li44ODg5OThhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9hdG0vdWVhZ2xlLWF0bS5jCisrKyBiL2RyaXZlcnMvdXNiL2F0bS91ZWFnbGUtYXRtLmMKQEAgLTk1Miw3ICs5NTIsNyBAQAogCWludCBpOwogCiAJLyogcmVsb2FkIGZpcm13YXJlIHdoZW4gcmVib290IHN0YXJ0IGFuZCBpdCdzIGxvYWRlZCBhbHJlYWR5ICovCi0JaWYgKG92bCA9PSAwICYmIHBhZ2VubyA9PSAwICYmIHNjLT5kc3BfZmlybSkgeworCWlmIChvdmwgPT0gMCAmJiBwYWdlbm8gPT0gMCkgewogCQlyZWxlYXNlX2Zpcm13YXJlKHNjLT5kc3BfZmlybSk7CiAJCXNjLT5kc3BfZmlybSA9IE5VTEw7CiAJfQpAQCAtMTA3NCw3ICsxMDc0LDcgQEAKIAl1ZWFfZGJnKElOU19UT19VU0JERVYoc2MpLCAic2VuZGluZyBEU1AgcGFnZSAldVxuIiwgcGFnZW5vKTsKIAogCS8qIHJlbG9hZCBmaXJtd2FyZSB3aGVuIHJlYm9vdCBzdGFydCBhbmQgaXQncyBsb2FkZWQgYWxyZWFkeSAqLwotCWlmIChwYWdlbm8gPT0gMCAmJiBzYy0+ZHNwX2Zpcm0pIHsKKwlpZiAocGFnZW5vID09IDApIHsKIAkJcmVsZWFzZV9maXJtd2FyZShzYy0+ZHNwX2Zpcm0pOwogCQlzYy0+ZHNwX2Zpcm0gPSBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2M2N3gwMC9jNjd4MDAtaGNkLmMgYi9kcml2ZXJzL3VzYi9jNjd4MDAvYzY3eDAwLWhjZC5jCmluZGV4IDIwZWM0ZWUuLmMyZDEzOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2M2N3gwMC9jNjd4MDAtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvYzY3eDAwL2M2N3gwMC1oY2QuYwpAQCAtMzQsNyArMzQsNyBAQAogCiBzdGF0aWMgX191OCBjNjd4MDBfaHViX2Rlc1tdID0gewogCTB4MDksCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCi0JMHgyOSwJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBIdWItZGVzY3JpcHRvciAqLworCVVTQl9EVF9IVUIsCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBIdWItZGVzY3JpcHRvciAqLwogCTB4MDIsCQkJLyogIF9fdTggIGJOYnJQb3J0czsgKi8KIAkweDAwLAkJCS8qIF9fdTE2ICB3SHViQ2hhcmFjdGVyaXN0aWNzOyAqLwogCTB4MDAsCQkJLyogICAocGVyLXBvcnQgT0MsIG5vIHBvd2VyIHN3aXRjaGluZykgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL0tjb25maWcgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9LY29uZmlnCmluZGV4IDc3YjQ3ZDguLjVjZTNmMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvS2NvbmZpZwpAQCAtMTAsNiArMTAsMTcgQEAKIAogaWYgVVNCX0NISVBJREVBCiAKK2NvbmZpZyBVU0JfQ0hJUElERUFfT0YKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gT0YKKwlkZWZhdWx0IFVTQl9DSElQSURFQQorCitjb25maWcgVVNCX0NISVBJREVBX1BDSQorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBQQ0kKKwlkZXBlbmRzIG9uIE5PUF9VU0JfWENFSVYKKwlkZWZhdWx0IFVTQl9DSElQSURFQQorCiBjb25maWcgVVNCX0NISVBJREVBX1VEQwogCWJvb2wgIkNoaXBJZGVhIGRldmljZSBjb250cm9sbGVyIgogCWRlcGVuZHMgb24gVVNCX0dBREdFVApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9NYWtlZmlsZQppbmRleCAxZmM4NmEyLi40ZGVjYjEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9NYWtlZmlsZQpAQCAtMTQsMTEgKzE0LDYgQEAKIG9iai0kKENPTkZJR19VU0JfQ0hJUElERUEpCSs9IGNpX2hkcmNfbXNtLm8KIG9iai0kKENPTkZJR19VU0JfQ0hJUElERUEpCSs9IGNpX2hkcmNfemV2aW8ubwogCi0jIFBDSSBkb2Vzbid0IHByb3ZpZGUgc3R1YnMsIG5lZWQgdG8gY2hlY2sKLWlmbmVxICgkKENPTkZJR19QQ0kpLCkKLQlvYmotJChDT05GSUdfVVNCX0NISVBJREVBKQkrPSBjaV9oZHJjX3BjaS5vCi1lbmRpZgorb2JqLSQoQ09ORklHX1VTQl9DSElQSURFQV9QQ0kpCSs9IGNpX2hkcmNfcGNpLm8KIAotaWZuZXEgKCQoQ09ORklHX09GKSwpCi0Jb2JqLSQoQ09ORklHX1VTQl9DSElQSURFQSkJKz0gdXNibWlzY19pbXgubyBjaV9oZHJjX2lteC5vCi1lbmRpZgorb2JqLSQoQ09ORklHX1VTQl9DSElQSURFQV9PRikJKz0gdXNibWlzY19pbXgubyBjaV9oZHJjX2lteC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9iaXRzLmggYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9iaXRzLmgKaW5kZXggY2E1N2UzZC4uM2NiOWJkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvYml0cy5oCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2JpdHMuaApAQCAtMTUsNiArMTUsMTYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3VzYi9laGNpX2RlZi5oPgogCisvKgorICogSUQKKyAqIEZvciAxLnggcmV2aXNpb24sIGJpdDI0IC0gYml0MzEgYXJlIHJlc2VydmVkCisgKiBGb3IgMi54IHJldmlzaW9uLCBiaXQyNSAtIGJpdDI4IGFyZSAweDIKKyAqLworI2RlZmluZSBUQUcJCSAgICAgICgweDFGIDw8IDE2KQorI2RlZmluZSBSRVZJU0lPTgkgICAgICAoMHhGIDw8IDIxKQorI2RlZmluZSBWRVJTSU9OCQkgICAgICAoMHhGIDw8IDI1KQorI2RlZmluZSBDSVZFUlNJT04JICAgICAgKDB4NyA8PCAyOSkKKwogLyogSENDUEFSQU1TICovCiAjZGVmaW5lIEhDQ1BBUkFNU19MRU4gICAgICAgICBCSVQoMTcpCiAKQEAgLTUzLDYgKzYzLDcgQEAKICNkZWZpbmUgUE9SVFNDX0hTUCAgICAgICAgICAgIEJJVCg5KQogI2RlZmluZSBQT1JUU0NfUFAgICAgICAgICAgICAgQklUKDEyKQogI2RlZmluZSBQT1JUU0NfUFRDICAgICAgICAgICAgKDB4MEZVTCA8PCAxNikKKyNkZWZpbmUgUE9SVFNDX1dLQ04gICAgICAgICAgIEJJVCgyMCkKICNkZWZpbmUgUE9SVFNDX1BIQ0QoZCkJICAgICAgKChkKSA/IEJJVCgyMikgOiBCSVQoMjMpKQogLyogUFRTIGFuZCBQVFcgZm9yIG5vbiBscG0gdmVyc2lvbiBvbmx5ICovCiAjZGVmaW5lIFBPUlRTQ19QRlNDICAgICAgICAgICBCSVQoMjQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaS5oIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2kuaAppbmRleCA2NTkxM2Q0Li42ZDYyMDBlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaS5oCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpLmgKQEAgLTI5LDYgKzI5LDE1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBSRUdJU1RFUlMKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIElkZW50aWZpY2F0aW9uIFJlZ2lzdGVycyAqLworI2RlZmluZSBJRF9JRAkJCQkweDAKKyNkZWZpbmUgSURfSFdHRU5FUkFMCQkJMHg0CisjZGVmaW5lIElEX0hXSE9TVAkJCTB4OAorI2RlZmluZSBJRF9IV0RFVklDRQkJCTB4YworI2RlZmluZSBJRF9IV1RYQlVGCQkJMHgxMAorI2RlZmluZSBJRF9IV1JYQlVGCQkJMHgxNAorI2RlZmluZSBJRF9TQlVTQ0ZHCQkJMHg5MAorCiAvKiByZWdpc3RlciBpbmRpY2VzICovCiBlbnVtIGNpX2h3X3JlZ3MgewogCUNBUF9DQVBMRU5HVEgsCkBAIC05Nyw2ICsxMDYsMTggQEAKIAlDSV9ST0xFX0VORCwKIH07CiAKK2VudW0gY2lfcmV2aXNpb24geworCUNJX1JFVklTSU9OXzFYID0gMTAsCS8qIFJldmlzaW9uIDEueCAqLworCUNJX1JFVklTSU9OXzIwID0gMjAsIC8qIFJldmlzaW9uIDIuMCAqLworCUNJX1JFVklTSU9OXzIxLCAvKiBSZXZpc2lvbiAyLjEgKi8KKwlDSV9SRVZJU0lPTl8yMiwgLyogUmV2aXNpb24gMi4yICovCisJQ0lfUkVWSVNJT05fMjMsIC8qIFJldmlzaW9uIDIuMyAqLworCUNJX1JFVklTSU9OXzI0LCAvKiBSZXZpc2lvbiAyLjQgKi8KKwlDSV9SRVZJU0lPTl8yNSwgLyogUmV2aXNpb24gMi41ICovCisJQ0lfUkVWSVNJT05fMjVfUExVUywgLyogUmV2aXNpb24gYWJvdmUgdGhhbiAyLjUgKi8KKwlDSV9SRVZJU0lPTl9VTktOT1dOID0gOTksIC8qIFVua25vd24gUmV2aXNpb24gKi8KK307CisKIC8qKgogICogc3RydWN0IGNpX3JvbGVfZHJpdmVyIC0gaG9zdC9nYWRnZXQgcm9sZSBkcml2ZXIKICAqIEBzdGFydDogc3RhcnQgdGhpcyByb2xlCkBAIC0xNDEsNyArMTYyLDEwIEBACiAgKiBAcm9sZTogY3VycmVudCByb2xlCiAgKiBAaXNfb3RnOiBpZiB0aGUgZGV2aWNlIGlzIG90Zy1jYXBhYmxlCiAgKiBAZnNtOiBvdGcgZmluaXRlIHN0YXRlIG1hY2hpbmUKLSAqIEBmc21fdGltZXI6IHBvaW50ZXIgdG8gdGltZXIgbGlzdCBvZiBvdGcgZnNtCisgKiBAb3RnX2ZzbV9ocnRpbWVyOiBocnRpbWVyIGZvciBvdGcgZnNtIHRpbWVycworICogQGhyX3RpbWVvdXRzOiB0aW1lIG91dCBsaXN0IGZvciBhY3RpdmUgb3RnIGZzbSB0aW1lcnMKKyAqIEBlbmFibGVkX290Z190aW1lcl9iaXRzOiBiaXRzIG9mIGVuYWJsZWQgb3RnIHRpbWVycworICogQG5leHRfb3RnX3RpbWVyOiBuZXh0IG5lYXJlc3QgZW5hYmxlZCB0aW1lciB0byBiZSBleHBpcmVkCiAgKiBAd29yazogd29yayBmb3Igcm9sZSBjaGFuZ2luZwogICogQHdxOiB3b3JrcXVldWUgdGhyZWFkCiAgKiBAcWhfcG9vbDogYWxsb2NhdGlvbiBwb29sIGZvciBxdWV1ZSBoZWFkcwpAQCAtMTY5LDYgKzE5MywxMCBAQAogICogQGJfc2Vzc192YWxpZF9ldmVudDogaW5kaWNhdGVzIHRoZXJlIGlzIGEgdmJ1cyBldmVudCwgYW5kIGhhbmRsZWQKICAqIGF0IGNpX290Z193b3JrCiAgKiBAaW14Mjhfd3JpdGVfZml4OiBGcmVlc2NhbGUgaW14MjggbmVlZHMgc3dwIGluc3RydWN0aW9uIGZvciB3cml0aW5nCisgKiBAc3VwcG9ydHNfcnVudGltZV9wbTogaWYgcnVudGltZSBwbSBpcyBzdXBwb3J0ZWQKKyAqIEBpbl9scG06IGlmIHRoZSBjb3JlIGluIGxvdyBwb3dlciBtb2RlCisgKiBAd2FrZXVwX2ludDogaWYgd2FrZXVwIGludGVycnVwdCBvY2N1cgorICogQHJldjogVGhlIHJldmlzaW9uIG51bWJlciBmb3IgY29udHJvbGxlcgogICovCiBzdHJ1Y3QgY2lfaGRyYyB7CiAJc3RydWN0IGRldmljZQkJCSpkZXY7CkBAIC0xODAsNyArMjA4LDEwIEBACiAJYm9vbAkJCQlpc19vdGc7CiAJc3RydWN0IHVzYl9vdGcJCQlvdGc7CiAJc3RydWN0IG90Z19mc20JCQlmc207Ci0Jc3RydWN0IGNpX290Z19mc21fdGltZXJfbGlzdAkqZnNtX3RpbWVyOworCXN0cnVjdCBocnRpbWVyCQkJb3RnX2ZzbV9ocnRpbWVyOworCWt0aW1lX3QJCQkJaHJfdGltZW91dHNbTlVNX09UR19GU01fVElNRVJTXTsKKwl1bnNpZ25lZAkJCWVuYWJsZWRfb3RnX3RpbWVyX2JpdHM7CisJZW51bSBvdGdfZnNtX3RpbWVyCQluZXh0X290Z190aW1lcjsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdvcms7CiAJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSp3cTsKIApAQCAtMjExLDYgKzI0MiwxMCBAQAogCWJvb2wJCQkJaWRfZXZlbnQ7CiAJYm9vbAkJCQliX3Nlc3NfdmFsaWRfZXZlbnQ7CiAJYm9vbAkJCQlpbXgyOF93cml0ZV9maXg7CisJYm9vbAkJCQlzdXBwb3J0c19ydW50aW1lX3BtOworCWJvb2wJCQkJaW5fbHBtOworCWJvb2wJCQkJd2FrZXVwX2ludDsKKwllbnVtIGNpX3JldmlzaW9uCQlyZXY7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjaV9yb2xlX2RyaXZlciAqY2lfcm9sZShzdHJ1Y3QgY2lfaGRyYyAqY2kpCkBAIC0yNDgsNiArMjgzLDM2IEBACiB9CiAKIC8qKgorICogaHdfcmVhZF9pZF9yZWc6IHJlYWRzIGZyb20gYSBpZGVudGlmaWNhdGlvbiByZWdpc3RlcgorICogQGNpOiB0aGUgY29udHJvbGxlcgorICogQG9mZnNldDogb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiBpZGVudGlmaWNhdGlvbiByZWdpc3RlcnMgcmVnaW9uCisgKiBAbWFzazogYml0ZmllbGQgbWFzaworICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyByZWdpc3RlciBjb250ZW50cworICovCitzdGF0aWMgaW5saW5lIHUzMiBod19yZWFkX2lkX3JlZyhzdHJ1Y3QgY2lfaGRyYyAqY2ksIHUzMiBvZmZzZXQsIHUzMiBtYXNrKQoreworCXJldHVybiBpb3JlYWQzMihjaS0+aHdfYmFuay5hYnMgKyBvZmZzZXQpICYgbWFzazsKK30KKworLyoqCisgKiBod193cml0ZV9pZF9yZWc6IHdyaXRlcyB0byBhIGlkZW50aWZpY2F0aW9uIHJlZ2lzdGVyCisgKiBAY2k6IHRoZSBjb250cm9sbGVyCisgKiBAb2Zmc2V0OiBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGlkZW50aWZpY2F0aW9uIHJlZ2lzdGVycyByZWdpb24KKyAqIEBtYXNrOiBiaXRmaWVsZCBtYXNrCisgKiBAZGF0YTogbmV3IHZhbHVlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBod193cml0ZV9pZF9yZWcoc3RydWN0IGNpX2hkcmMgKmNpLCB1MzIgb2Zmc2V0LAorCQkJICAgIHUzMiBtYXNrLCB1MzIgZGF0YSkKK3sKKwlpZiAofm1hc2spCisJCWRhdGEgPSAoaW9yZWFkMzIoY2ktPmh3X2JhbmsuYWJzICsgb2Zmc2V0KSAmIH5tYXNrKQorCQkJfCAoZGF0YSAmIG1hc2spOworCisJaW93cml0ZTMyKGRhdGEsIGNpLT5od19iYW5rLmFicyArIG9mZnNldCk7Cit9CisKKy8qKgogICogaHdfcmVhZDogcmVhZHMgZnJvbSBhIGh3IHJlZ2lzdGVyCiAgKiBAY2k6IHRoZSBjb250cm9sbGVyCiAgKiBAcmVnOiAgcmVnaXN0ZXIgaW5kZXgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5jCmluZGV4IDBmMDVkZTcuLjM4OWYwZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmMKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguYwpAQCAtMjMsMjIgKzIzLDQwIEBACiAjaW5jbHVkZSAiY2kuaCIKICNpbmNsdWRlICJjaV9oZHJjX2lteC5oIgogCi0jZGVmaW5lIENJX0hEUkNfSU1YX0lNWDI4X1dSSVRFX0ZJWCBCSVQoMCkKLQogc3RydWN0IGNpX2hkcmNfaW14X3BsYXRmb3JtX2ZsYWcgewogCXVuc2lnbmVkIGludCBmbGFnczsKKwlib29sIHJ1bnRpbWVfcG07CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNpX2hkcmNfaW14X3BsYXRmb3JtX2ZsYWcgaW14MjdfdXNiX2RhdGEgPSB7CiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNpX2hkcmNfaW14X3BsYXRmb3JtX2ZsYWcgaW14MjhfdXNiX2RhdGEgPSB7Ci0JLmZsYWdzID0gQ0lfSERSQ19JTVhfSU1YMjhfV1JJVEVfRklYLAorCS5mbGFncyA9IENJX0hEUkNfSU1YMjhfV1JJVEVfRklYIHwKKwkJQ0lfSERSQ19UVVJOX1ZCVVNfRUFSTFlfT04sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNpX2hkcmNfaW14X3BsYXRmb3JtX2ZsYWcgaW14NnFfdXNiX2RhdGEgPSB7CisJLmZsYWdzID0gQ0lfSERSQ19TVVBQT1JUU19SVU5USU1FX1BNIHwKKwkJQ0lfSERSQ19UVVJOX1ZCVVNfRUFSTFlfT04sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNpX2hkcmNfaW14X3BsYXRmb3JtX2ZsYWcgaW14NnNsX3VzYl9kYXRhID0geworCS5mbGFncyA9IENJX0hEUkNfU1VQUE9SVFNfUlVOVElNRV9QTSB8CisJCUNJX0hEUkNfVFVSTl9WQlVTX0VBUkxZX09OLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjaV9oZHJjX2lteF9wbGF0Zm9ybV9mbGFnIGlteDZzeF91c2JfZGF0YSA9IHsKKwkuZmxhZ3MgPSBDSV9IRFJDX1NVUFBPUlRTX1JVTlRJTUVfUE0gfAorCQlDSV9IRFJDX1RVUk5fVkJVU19FQVJMWV9PTiwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGNpX2hkcmNfaW14X2R0X2lkc1tdID0gewogCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDI4LXVzYiIsIC5kYXRhID0gJmlteDI4X3VzYl9kYXRhfSwKIAl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyNy11c2IiLCAuZGF0YSA9ICZpbXgyN191c2JfZGF0YX0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14NnEtdXNiIiwgLmRhdGEgPSAmaW14NnFfdXNiX2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDZzbC11c2IiLCAuZGF0YSA9ICZpbXg2c2xfdXNiX2RhdGF9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDZzeC11c2IiLCAuZGF0YSA9ICZpbXg2c2xfdXNiX2RhdGF9LAogCXsgLyogc2VudGluZWwgKi8gfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGNpX2hkcmNfaW14X2R0X2lkcyk7CkBAIC00OCw2ICs2Niw4IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY2lfcGRldjsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IGlteF91c2JtaXNjX2RhdGEgKnVzYm1pc2NfZGF0YTsKKwlib29sIHN1cHBvcnRzX3J1bnRpbWVfcG07CisJYm9vbCBpbl9scG07CiB9OwogCiAvKiBDb21tb24gZnVuY3Rpb25zIHNoYXJlZCBieSB1c2JtaXNjIGRyaXZlcnMgKi8KQEAgLTE0NSwyMSArMTY1LDE4IEBACiAJfQogCiAJcGRhdGEudXNiX3BoeSA9IGRhdGEtPnBoeTsKLQotCWlmIChpbXhfcGxhdGZvcm1fZmxhZy0+ZmxhZ3MgJiBDSV9IRFJDX0lNWF9JTVgyOF9XUklURV9GSVgpCi0JCXBkYXRhLmZsYWdzIHw9IENJX0hEUkNfSU1YMjhfV1JJVEVfRklYOworCXBkYXRhLmZsYWdzIHw9IGlteF9wbGF0Zm9ybV9mbGFnLT5mbGFnczsKKwlpZiAocGRhdGEuZmxhZ3MgJiBDSV9IRFJDX1NVUFBPUlRTX1JVTlRJTUVfUE0pCisJCWRhdGEtPnN1cHBvcnRzX3J1bnRpbWVfcG0gPSB0cnVlOwogCiAJcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudCgmcGRldi0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycl9jbGs7CiAKLQlpZiAoZGF0YS0+dXNibWlzY19kYXRhKSB7Ci0JCXJldCA9IGlteF91c2JtaXNjX2luaXQoZGF0YS0+dXNibWlzY19kYXRhKTsKLQkJaWYgKHJldCkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAidXNibWlzYyBpbml0IGZhaWxlZCwgcmV0PSVkXG4iLAotCQkJCQlyZXQpOwotCQkJZ290byBlcnJfY2xrOwotCQl9CisJcmV0ID0gaW14X3VzYm1pc2NfaW5pdChkYXRhLT51c2JtaXNjX2RhdGEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAidXNibWlzYyBpbml0IGZhaWxlZCwgcmV0PSVkXG4iLCByZXQpOworCQlnb3RvIGVycl9jbGs7CiAJfQogCiAJZGF0YS0+Y2lfcGRldiA9IGNpX2hkcmNfYWRkX2RldmljZSgmcGRldi0+ZGV2LApAQCAtMTczLDE5ICsxOTAsMjAgQEAKIAkJZ290byBlcnJfY2xrOwogCX0KIAotCWlmIChkYXRhLT51c2JtaXNjX2RhdGEpIHsKLQkJcmV0ID0gaW14X3VzYm1pc2NfaW5pdF9wb3N0KGRhdGEtPnVzYm1pc2NfZGF0YSk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgInVzYm1pc2MgcG9zdCBmYWlsZWQsIHJldD0lZFxuIiwKLQkJCQkJcmV0KTsKLQkJCWdvdG8gZGlzYWJsZV9kZXZpY2U7Ci0JCX0KKwlyZXQgPSBpbXhfdXNibWlzY19pbml0X3Bvc3QoZGF0YS0+dXNibWlzY19kYXRhKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInVzYm1pc2MgcG9zdCBmYWlsZWQsIHJldD0lZFxuIiwgcmV0KTsKKwkJZ290byBkaXNhYmxlX2RldmljZTsKIAl9CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKIAotCXBtX3J1bnRpbWVfbm9fY2FsbGJhY2tzKCZwZGV2LT5kZXYpOwotCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCWlmIChkYXRhLT5zdXBwb3J0c19ydW50aW1lX3BtKSB7CisJCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmcGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisJfQorCisJZGV2aWNlX3NldF93YWtldXBfY2FwYWJsZSgmcGRldi0+ZGV2LCB0cnVlKTsKIAogCXJldHVybiAwOwogCkBAIC0yMDAsMTQgKzIxOCwxOCBAQAogewogCXN0cnVjdCBjaV9oZHJjX2lteF9kYXRhICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKLQlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJaWYgKGRhdGEtPnN1cHBvcnRzX3J1bnRpbWVfcG0pIHsKKwkJcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnBkZXYtPmRldik7CisJfQogCWNpX2hkcmNfcmVtb3ZlX2RldmljZShkYXRhLT5jaV9wZGV2KTsKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoZGF0YS0+Y2xrKTsKIAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCisjaWZkZWYgQ09ORklHX1BNCiBzdGF0aWMgaW50IGlteF9jb250cm9sbGVyX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBjaV9oZHJjX2lteF9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CkBAIC0yMTUsNiArMjM3LDcgQEAKIAlkZXZfZGJnKGRldiwgImF0ICVzXG4iLCBfX2Z1bmNfXyk7CiAKIAljbGtfZGlzYWJsZV91bnByZXBhcmUoZGF0YS0+Y2xrKTsKKwlkYXRhLT5pbl9scG0gPSB0cnVlOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMjIsMjUgKzI0NSwxMDMgQEAKIHN0YXRpYyBpbnQgaW14X2NvbnRyb2xsZXJfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgY2lfaGRyY19pbXhfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQgPSAwOwogCiAJZGV2X2RiZyhkZXYsICJhdCAlc1xuIiwgX19mdW5jX18pOwogCi0JcmV0dXJuIGNsa19wcmVwYXJlX2VuYWJsZShkYXRhLT5jbGspOworCWlmICghZGF0YS0+aW5fbHBtKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYXRhLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkYXRhLT5pbl9scG0gPSBmYWxzZTsKKworCXJldCA9IGlteF91c2JtaXNjX3NldF93YWtldXAoZGF0YS0+dXNibWlzY19kYXRhLCBmYWxzZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInVzYm1pc2Mgc2V0X3dha2V1cCBmYWlsZWQsIHJldD0lZFxuIiwgcmV0KTsKKwkJZ290byBjbGtfZGlzYWJsZTsKKwl9CisKKwlyZXR1cm4gMDsKKworY2xrX2Rpc2FibGU6CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhdGEtPmNsayk7CisJcmV0dXJuIHJldDsKIH0KIAorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBjaV9oZHJjX2lteF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlpbnQgcmV0OworCisJc3RydWN0IGNpX2hkcmNfaW14X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChkYXRhLT5pbl9scG0pCisJCS8qIFRoZSBjb3JlJ3Mgc3VzcGVuZCBkb2Vzbid0IHJ1biAqLworCQlyZXR1cm4gMDsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKSB7CisJCXJldCA9IGlteF91c2JtaXNjX3NldF93YWtldXAoZGF0YS0+dXNibWlzY19kYXRhLCB0cnVlKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihkZXYsICJ1c2JtaXNjIHNldF93YWtldXAgZmFpbGVkLCByZXQ9JWRcbiIsCisJCQkJCXJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCiAJcmV0dXJuIGlteF9jb250cm9sbGVyX3N1c3BlbmQoZGV2KTsKIH0KIAogc3RhdGljIGludCBjaV9oZHJjX2lteF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBpbXhfY29udHJvbGxlcl9yZXN1bWUoZGV2KTsKKwlzdHJ1Y3QgY2lfaGRyY19pbXhfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBpbXhfY29udHJvbGxlcl9yZXN1bWUoZGV2KTsKKwlpZiAoIXJldCAmJiBkYXRhLT5zdXBwb3J0c19ydW50aW1lX3BtKSB7CisJCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCQlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwkJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogCitzdGF0aWMgaW50IGNpX2hkcmNfaW14X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNpX2hkcmNfaW14X2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgcmV0OworCisJaWYgKGRhdGEtPmluX2xwbSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXQgPSBpbXhfdXNibWlzY19zZXRfd2FrZXVwKGRhdGEtPnVzYm1pc2NfZGF0YSwgdHJ1ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInVzYm1pc2Mgc2V0X3dha2V1cCBmYWlsZWQsIHJldD0lZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gaW14X2NvbnRyb2xsZXJfc3VzcGVuZChkZXYpOworfQorCitzdGF0aWMgaW50IGNpX2hkcmNfaW14X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gaW14X2NvbnRyb2xsZXJfcmVzdW1lKGRldik7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGNpX2hkcmNfaW14X3BtX29wcyA9IHsKIAlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhjaV9oZHJjX2lteF9zdXNwZW5kLCBjaV9oZHJjX2lteF9yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKGNpX2hkcmNfaW14X3J1bnRpbWVfc3VzcGVuZCwKKwkJCWNpX2hkcmNfaW14X3J1bnRpbWVfcmVzdW1lLCBOVUxMKQogfTsKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNpX2hkcmNfaW14X2RyaXZlciA9IHsKIAkucHJvYmUgPSBjaV9oZHJjX2lteF9wcm9iZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmggYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX2lteC5oCmluZGV4IDRlZDgyOGYuLjYzNTcxN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfaW14LmgKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19pbXguaApAQCAtMjIsNSArMjIsNiBAQAogCiBpbnQgaW14X3VzYm1pc2NfaW5pdChzdHJ1Y3QgaW14X3VzYm1pc2NfZGF0YSAqKTsKIGludCBpbXhfdXNibWlzY19pbml0X3Bvc3Qoc3RydWN0IGlteF91c2JtaXNjX2RhdGEgKik7CitpbnQgaW14X3VzYm1pc2Nfc2V0X3dha2V1cChzdHJ1Y3QgaW14X3VzYm1pc2NfZGF0YSAqLCBib29sKTsKIAogI2VuZGlmIC8qIF9fRFJJVkVSX1VTQl9DSElQSURFQV9DSV9IRFJDX0lNWF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX3BjaS5jIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY19wY2kuYwppbmRleCA0ZGY2Njk0Li43NzNkMTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX3BjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfcGNpLmMKQEAgLTE2LDEwICsxNiwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2hpcGlkZWEuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvdXNiX3BoeV9nZW5lcmljLmg+CiAKIC8qIGRyaXZlciBuYW1lICovCiAjZGVmaW5lIFVEQ19EUklWRVJfTkFNRSAgICJjaV9oZHJjX3BjaSIKIAorc3RydWN0IGNpX2hkcmNfcGNpIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpjaTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCSpwaHk7Cit9OworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBQQ0kgYmxvY2sKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTUyLDcgKzU4LDcgQEAKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBjaV9oZHJjX3BsYXRmb3JtX2RhdGEgKnBsYXRkYXRhID0gKHZvaWQgKilpZC0+ZHJpdmVyX2RhdGE7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdF9jaTsKKwlzdHJ1Y3QgY2lfaGRyY19wY2kgKmNpOwogCXN0cnVjdCByZXNvdXJjZSByZXNbM107CiAJaW50IHJldHZhbCA9IDAsIG5yZXMgPSAyOwogCkBAIC02MSw2ICs2NywxMCBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKKwljaSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmNpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlyZXR2YWwgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGRldik7CiAJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKQEAgLTczLDYgKzgzLDExIEBACiAJcGNpX3NldF9tYXN0ZXIocGRldik7CiAJcGNpX3RyeV9zZXRfbXdpKHBkZXYpOwogCisJLyogcmVnaXN0ZXIgYSBub3AgUEhZICovCisJY2ktPnBoeSA9IHVzYl9waHlfZ2VuZXJpY19yZWdpc3RlcigpOworCWlmICghY2ktPnBoeSkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAltZW1zZXQocmVzLCAwLCBzaXplb2YocmVzKSk7CiAJcmVzWzBdLnN0YXJ0CT0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwogCXJlc1swXS5lbmQJPSBwY2lfcmVzb3VyY2VfZW5kKHBkZXYsIDApOwpAQCAtODAsMTMgKzk1LDE0IEBACiAJcmVzWzFdLnN0YXJ0CT0gcGRldi0+aXJxOwogCXJlc1sxXS5mbGFncwk9IElPUkVTT1VSQ0VfSVJROwogCi0JcGxhdF9jaSA9IGNpX2hkcmNfYWRkX2RldmljZSgmcGRldi0+ZGV2LCByZXMsIG5yZXMsIHBsYXRkYXRhKTsKLQlpZiAoSVNfRVJSKHBsYXRfY2kpKSB7CisJY2ktPmNpID0gY2lfaGRyY19hZGRfZGV2aWNlKCZwZGV2LT5kZXYsIHJlcywgbnJlcywgcGxhdGRhdGEpOworCWlmIChJU19FUlIoY2ktPmNpKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjaV9oZHJjX2FkZF9kZXZpY2UgZmFpbGVkIVxuIik7Ci0JCXJldHVybiBQVFJfRVJSKHBsYXRfY2kpOworCQl1c2JfcGh5X2dlbmVyaWNfdW5yZWdpc3RlcihjaS0+cGh5KTsKKwkJcmV0dXJuIFBUUl9FUlIoY2ktPmNpKTsKIAl9CiAKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgcGxhdF9jaSk7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGNpKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTAxLDkgKzExNywxMCBAQAogICovCiBzdGF0aWMgdm9pZCBjaV9oZHJjX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdF9jaSA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgY2lfaGRyY19wY2kgKmNpID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCi0JY2lfaGRyY19yZW1vdmVfZGV2aWNlKHBsYXRfY2kpOworCWNpX2hkcmNfcmVtb3ZlX2RldmljZShjaS0+Y2kpOworCXVzYl9waHlfZ2VuZXJpY191bnJlZ2lzdGVyKGNpLT5waHkpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfemV2aW8uYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NpX2hkcmNfemV2aW8uYwppbmRleCBkOTc2ZmMxLi4xMjY0ZGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jaV9oZHJjX3pldmlvLmMKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY2lfaGRyY196ZXZpby5jCkBAIC0xOCw3ICsxOCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgY2lfaGRyY19wbGF0Zm9ybV9kYXRhIGNpX2hkcmNfemV2aW9fcGxhdGRhdGEgPSB7CiAJLm5hbWUJCQk9ICJjaV9oZHJjX3pldmlvIiwKLQkuZmxhZ3MJCQk9IENJX0hEUkNfUkVHU19TSEFSRUQsCisJLmZsYWdzCQkJPSBDSV9IRFJDX1JFR1NfU0hBUkVEIHwgQ0lfSERSQ19GT1JDRV9GVUxMU1BFRUQsCiAJLmNhcG9mZnNldAkJPSBERUZfQ0FQT0ZGU0VULAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvY29yZS5jIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvY29yZS5jCmluZGV4IGE1N2RjODguLjc0ZmVhNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9jb3JlLmMKQEAgLTEzNyw2ICsxMzcsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGVudW0gY2lfcmV2aXNpb24gY2lfZ2V0X3JldmlzaW9uKHN0cnVjdCBjaV9oZHJjICpjaSkKK3sKKwlpbnQgdmVyID0gaHdfcmVhZF9pZF9yZWcoY2ksIElEX0lELCBWRVJTSU9OKSA+PiBfX2ZmcyhWRVJTSU9OKTsKKwllbnVtIGNpX3JldmlzaW9uIHJldiA9IENJX1JFVklTSU9OX1VOS05PV047CisKKwlpZiAodmVyID09IDB4MikgeworCQlyZXYgPSBod19yZWFkX2lkX3JlZyhjaSwgSURfSUQsIFJFVklTSU9OKQorCQkJPj4gX19mZnMoUkVWSVNJT04pOworCQlyZXYgKz0gQ0lfUkVWSVNJT05fMjA7CisJfSBlbHNlIGlmICh2ZXIgPT0gMHgwKSB7CisJCXJldiA9IENJX1JFVklTSU9OXzFYOworCX0KKworCXJldHVybiByZXY7Cit9CisKIC8qKgogICogaHdfcmVhZF9pbnRyX2VuYWJsZTogcmV0dXJucyBpbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyCiAgKgpAQCAtMjUxLDggKzI2NywxMSBAQAogCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHRzIHN0YXR1cyBiaXRzKi8KIAlod193cml0ZShjaSwgT1BfVVNCU1RTLCAweGZmZmZmZmZmLCAweGZmZmZmZmZmKTsKIAotCWRldl9kYmcoY2ktPmRldiwgIkNoaXBJZGVhIEhEUkMgZm91bmQsIGxwbTogJWQ7IGNhcDogJXAgb3A6ICVwXG4iLAotCQljaS0+aHdfYmFuay5scG0sIGNpLT5od19iYW5rLmNhcCwgY2ktPmh3X2Jhbmsub3ApOworCWNpLT5yZXYgPSBjaV9nZXRfcmV2aXNpb24oY2kpOworCisJZGV2X2RiZyhjaS0+ZGV2LAorCQkiQ2hpcElkZWEgSERSQyBmb3VuZCwgcmV2aXNpb246ICVkLCBscG06ICVkOyBjYXA6ICVwIG9wOiAlcFxuIiwKKwkJY2ktPnJldiwgY2ktPmh3X2JhbmsubHBtLCBjaS0+aHdfYmFuay5jYXAsIGNpLT5od19iYW5rLm9wKTsKIAogCS8qIHNldHVwIGxvY2sgbW9kZSA/ICovCiAKQEAgLTQ5MSw2ICs1MTAsMTMgQEAKIAlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKIAl1MzIgb3Rnc2MgPSAwOwogCisJaWYgKGNpLT5pbl9scG0pIHsKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CisJCWNpLT53YWtldXBfaW50ID0gdHJ1ZTsKKwkJcG1fcnVudGltZV9nZXQoY2ktPmRldik7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKIAlpZiAoY2ktPmlzX290ZykgewogCQlvdGdzYyA9IGh3X3JlYWRfb3Rnc2MoY2ksIH4wKTsKIAkJaWYgKGNpX290Z19pc19mc21fbW9kZShjaSkpIHsKQEAgLTY0Miw4ICs2NjgsMTIgQEAKIAkJY2ktPmlzX290ZyA9IChod19yZWFkKGNpLCBDQVBfRENDUEFSQU1TLAogCQkJCURDQ1BBUkFNU19EQyB8IERDQ1BBUkFNU19IQykKIAkJCQkJPT0gKERDQ1BBUkFNU19EQyB8IERDQ1BBUkFNU19IQykpOwotCWlmIChjaS0+aXNfb3RnKQorCWlmIChjaS0+aXNfb3RnKSB7CiAJCWRldl9kYmcoY2ktPmRldiwgIkl0IGlzIE9URyBjYXBhYmxlIGNvbnRyb2xsZXJcbiIpOworCQkvKiBEaXNhYmxlIGFuZCBjbGVhciBhbGwgT1RHIGlycSAqLworCQlod193cml0ZV9vdGdzYyhjaSwgT1RHU0NfSU5UX0VOX0JJVFMgfCBPVEdTQ19JTlRfU1RBVFVTX0JJVFMsCisJCQkJCQkJT1RHU0NfSU5UX1NUQVRVU19CSVRTKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgY2lfaGRyY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQpAQCAtNjczLDYgKzcwMyw4IEBACiAJY2ktPnBsYXRkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOwogCWNpLT5pbXgyOF93cml0ZV9maXggPSAhIShjaS0+cGxhdGRhdGEtPmZsYWdzICYKIAkJQ0lfSERSQ19JTVgyOF9XUklURV9GSVgpOworCWNpLT5zdXBwb3J0c19ydW50aW1lX3BtID0gISEoY2ktPnBsYXRkYXRhLT5mbGFncyAmCisJCUNJX0hEUkNfU1VQUE9SVFNfUlVOVElNRV9QTSk7CiAKIAlyZXQgPSBod19kZXZpY2VfaW5pdChjaSwgYmFzZSk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTc0MCw5ICs3NzIsNiBAQAogCX0KIAogCWlmIChjaS0+aXNfb3RnICYmIGNpLT5yb2xlc1tDSV9ST0xFX0dBREdFVF0pIHsKLQkJLyogRGlzYWJsZSBhbmQgY2xlYXIgYWxsIE9URyBpcnEgKi8KLQkJaHdfd3JpdGVfb3Rnc2MoY2ksIE9UR1NDX0lOVF9FTl9CSVRTIHwgT1RHU0NfSU5UX1NUQVRVU19CSVRTLAotCQkJCQkJCU9UR1NDX0lOVF9TVEFUVVNfQklUUyk7CiAJCXJldCA9IGNpX2hkcmNfb3RnX2luaXQoY2kpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKGRldiwgImluaXQgb3RnIGZhaWxzLCByZXQgPSAlZFxuIiwgcmV0KTsKQEAgLTc2OSwxMSArNzk4LDExIEBACiAJCQk6IENJX1JPTEVfR0FER0VUOwogCX0KIAotCS8qIG9ubHkgdXBkYXRlIHZidXMgc3RhdHVzIGZvciBwZXJpcGhlcmFsICovCi0JaWYgKGNpLT5yb2xlID09IENJX1JPTEVfR0FER0VUKQotCQljaV9oYW5kbGVfdmJ1c19jaGFuZ2UoY2kpOwotCiAJaWYgKCFjaV9vdGdfaXNfZnNtX21vZGUoY2kpKSB7CisJCS8qIG9ubHkgdXBkYXRlIHZidXMgc3RhdHVzIGZvciBwZXJpcGhlcmFsICovCisJCWlmIChjaS0+cm9sZSA9PSBDSV9ST0xFX0dBREdFVCkKKwkJCWNpX2hhbmRsZV92YnVzX2NoYW5nZShjaSk7CisKIAkJcmV0ID0gY2lfcm9sZV9zdGFydChjaSwgY2ktPnJvbGUpOwogCQlpZiAocmV0KSB7CiAJCQlkZXZfZXJyKGRldiwgImNhbid0IHN0YXJ0ICVzIHJvbGVcbiIsCkBAIC03ODgsOSArODE3LDE5IEBACiAJaWYgKHJldCkKIAkJZ290byBzdG9wOwogCisJaWYgKGNpLT5zdXBwb3J0c19ydW50aW1lX3BtKSB7CisJCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmcGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisJCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KCZwZGV2LT5kZXYsIDIwMDApOworCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGNpLT5kZXYpOworCQlwbV9ydW50aW1lX3VzZV9hdXRvc3VzcGVuZCgmcGRldi0+ZGV2KTsKKwl9CisKIAlpZiAoY2lfb3RnX2lzX2ZzbV9tb2RlKGNpKSkKIAkJY2lfaGRyY19vdGdfZnNtX3N0YXJ0KGNpKTsKIAorCWRldmljZV9zZXRfd2FrZXVwX2NhcGFibGUoJnBkZXYtPmRldiwgdHJ1ZSk7CisKIAlyZXQgPSBkYmdfY3JlYXRlX2ZpbGVzKGNpKTsKIAlpZiAoIXJldCkKIAkJcmV0dXJuIDA7CkBAIC04MDcsNiArODQ2LDEyIEBACiB7CiAJc3RydWN0IGNpX2hkcmMgKmNpID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAKKwlpZiAoY2ktPnN1cHBvcnRzX3J1bnRpbWVfcG0pIHsKKwkJcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKKwkJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9ub2lkbGUoJnBkZXYtPmRldik7CisJfQorCiAJZGJnX3JlbW92ZV9maWxlcyhjaSk7CiAJY2lfcm9sZV9kZXN0cm95KGNpKTsKIAljaV9oZHJjX2VudGVyX2xwbShjaSwgdHJ1ZSk7CkBAIC04MTUsMTMgKzg2MCw0MSBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQCisjaWZkZWYgQ09ORklHX1BNCisvKiBQcmVwYXJlIHdha2V1cCBieSBTUlAgYmVmb3JlIHN1c3BlbmQgKi8KK3N0YXRpYyB2b2lkIGNpX290Z19mc21fc3VzcGVuZF9mb3Jfc3JwKHN0cnVjdCBjaV9oZHJjICpjaSkKK3sKKwlpZiAoKGNpLT5mc20ub3RnLT5zdGF0ZSA9PSBPVEdfU1RBVEVfQV9JRExFKSAmJgorCQkJCSFod19yZWFkX290Z3NjKGNpLCBPVEdTQ19JRCkpIHsKKwkJaHdfd3JpdGUoY2ksIE9QX1BPUlRTQywgUE9SVFNDX1cxQ19CSVRTIHwgUE9SVFNDX1BQLAorCQkJCQkJCQlQT1JUU0NfUFApOworCQlod193cml0ZShjaSwgT1BfUE9SVFNDLCBQT1JUU0NfVzFDX0JJVFMgfCBQT1JUU0NfV0tDTiwKKwkJCQkJCQkJUE9SVFNDX1dLQ04pOworCX0KK30KKworLyogSGFuZGxlIFNSUCB3aGVuIHdha2V1cCBieSBkYXRhIHB1bHNlICovCitzdGF0aWMgdm9pZCBjaV9vdGdfZnNtX3dha2V1cF9ieV9zcnAoc3RydWN0IGNpX2hkcmMgKmNpKQoreworCWlmICgoY2ktPmZzbS5vdGctPnN0YXRlID09IE9UR19TVEFURV9BX0lETEUpICYmCisJCShjaS0+ZnNtLmFfYnVzX2Ryb3AgPT0gMSkgJiYgKGNpLT5mc20uYV9idXNfcmVxID09IDApKSB7CisJCWlmICghaHdfcmVhZF9vdGdzYyhjaSwgT1RHU0NfSUQpKSB7CisJCQljaS0+ZnNtLmFfc3JwX2RldCA9IDE7CisJCQljaS0+ZnNtLmFfYnVzX2Ryb3AgPSAwOworCQl9IGVsc2UgeworCQkJY2ktPmZzbS5pZCA9IDE7CisJCX0KKwkJY2lfb3RnX3F1ZXVlX3dvcmsoY2kpOworCX0KK30KKwogc3RhdGljIHZvaWQgY2lfY29udHJvbGxlcl9zdXNwZW5kKHN0cnVjdCBjaV9oZHJjICpjaSkKIHsKKwlkaXNhYmxlX2lycShjaS0+aXJxKTsKIAljaV9oZHJjX2VudGVyX2xwbShjaSwgdHJ1ZSk7Ci0KLQlpZiAoY2ktPnVzYl9waHkpCi0JCXVzYl9waHlfc2V0X3N1c3BlbmQoY2ktPnVzYl9waHksIDEpOworCXVzYl9waHlfc2V0X3N1c3BlbmQoY2ktPnVzYl9waHksIDEpOworCWNpLT5pbl9scG0gPSB0cnVlOworCWVuYWJsZV9pcnEoY2ktPmlycSk7CiB9CiAKIHN0YXRpYyBpbnQgY2lfY29udHJvbGxlcl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQpAQCAtODMwLDIzICs5MDMsNTkgQEAKIAogCWRldl9kYmcoZGV2LCAiYXQgJXNcbiIsIF9fZnVuY19fKTsKIAotCWNpX2hkcmNfZW50ZXJfbHBtKGNpLCBmYWxzZSk7CisJaWYgKCFjaS0+aW5fbHBtKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KIAorCWNpX2hkcmNfZW50ZXJfbHBtKGNpLCBmYWxzZSk7CiAJaWYgKGNpLT51c2JfcGh5KSB7CiAJCXVzYl9waHlfc2V0X3N1c3BlbmQoY2ktPnVzYl9waHksIDApOwogCQl1c2JfcGh5X3NldF93YWtldXAoY2ktPnVzYl9waHksIGZhbHNlKTsKIAkJaHdfd2FpdF9waHlfc3RhYmxlKCk7CiAJfQogCisJY2ktPmluX2xwbSA9IGZhbHNlOworCWlmIChjaS0+d2FrZXVwX2ludCkgeworCQljaS0+d2FrZXVwX2ludCA9IGZhbHNlOworCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGNpLT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChjaS0+ZGV2KTsKKwkJZW5hYmxlX2lycShjaS0+aXJxKTsKKwkJaWYgKGNpX290Z19pc19mc21fbW9kZShjaSkpCisJCQljaV9vdGdfZnNtX3dha2V1cF9ieV9zcnAoY2kpOworCX0KKwogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IGNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBjaV9oZHJjICpjaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJaWYgKGNpLT53cSkKIAkJZmx1c2hfd29ya3F1ZXVlKGNpLT53cSk7CisJLyoKKwkgKiBDb250cm9sbGVyIG5lZWRzIHRvIGJlIGFjdGl2ZSBkdXJpbmcgc3VzcGVuZCwgb3RoZXJ3aXNlIHRoZSBjb3JlCisJICogbWF5IHJ1biByZXN1bWUgd2hlbiB0aGUgcGFyZW50IGlzIGF0IHN1c3BlbmQgaWYgb3RoZXIgZHJpdmVyJ3MKKwkgKiBzdXNwZW5kIGZhaWxzLCBpdCBvY2N1cnMgYmVmb3JlIHBhcmVudCdzIHN1c3BlbmQgaGFzIG5vdCBzdGFydGVkLAorCSAqIGJ1dCB0aGUgY29yZSBzdXNwZW5kIGhhcyBmaW5pc2hlZC4KKwkgKi8KKwlpZiAoY2ktPmluX2xwbSkKKwkJcG1fcnVudGltZV9yZXN1bWUoZGV2KTsKKworCWlmIChjaS0+aW5fbHBtKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKSB7CisJCWlmIChjaV9vdGdfaXNfZnNtX21vZGUoY2kpKQorCQkJY2lfb3RnX2ZzbV9zdXNwZW5kX2Zvcl9zcnAoY2kpOworCisJCXVzYl9waHlfc2V0X3dha2V1cChjaS0+dXNiX3BoeSwgdHJ1ZSk7CisJCWVuYWJsZV9pcnFfd2FrZShjaS0+aXJxKTsKKwl9CiAKIAljaV9jb250cm9sbGVyX3N1c3BlbmQoY2kpOwogCkBAIC04NTUsMTMgKzk2NCw1NyBAQAogCiBzdGF0aWMgaW50IGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIGNpX2NvbnRyb2xsZXJfcmVzdW1lKGRldik7CisJc3RydWN0IGNpX2hkcmMgKmNpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpKQorCQlkaXNhYmxlX2lycV93YWtlKGNpLT5pcnEpOworCisJcmV0ID0gY2lfY29udHJvbGxlcl9yZXN1bWUoZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNpLT5zdXBwb3J0c19ydW50aW1lX3BtKSB7CisJCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCQlwbV9ydW50aW1lX3NldF9hY3RpdmUoZGV2KTsKKwkJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OwogfQogI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLwogCitzdGF0aWMgaW50IGNpX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNpX2hkcmMgKmNpID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlkZXZfZGJnKGRldiwgImF0ICVzXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoY2ktPmluX2xwbSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoY2lfb3RnX2lzX2ZzbV9tb2RlKGNpKSkKKwkJY2lfb3RnX2ZzbV9zdXNwZW5kX2Zvcl9zcnAoY2kpOworCisJdXNiX3BoeV9zZXRfd2FrZXVwKGNpLT51c2JfcGh5LCB0cnVlKTsKKwljaV9jb250cm9sbGVyX3N1c3BlbmQoY2kpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2lfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBjaV9jb250cm9sbGVyX3Jlc3VtZShkZXYpOworfQorCisjZW5kaWYgLyogQ09ORklHX1BNICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgY2lfcG1fb3BzID0gewogCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKGNpX3N1c3BlbmQsIGNpX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMoY2lfcnVudGltZV9zdXNwZW5kLCBjaV9ydW50aW1lX3Jlc3VtZSwgTlVMTCkKIH07CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNpX2hkcmNfZHJpdmVyID0gewogCS5wcm9iZQk9IGNpX2hkcmNfcHJvYmUsCiAJLnJlbW92ZQk9IGNpX2hkcmNfcmVtb3ZlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvZGVidWcuYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2RlYnVnLmMKaW5kZXggMjY4ZTQyMy4uZGZiMDVlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvZGVidWcuYworKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9kZWJ1Zy5jCkBAIC0zMzYsOCArMzM2LDggQEAKIAlzdHJ1Y3QgY2lfaGRyYyAqY2kgPSBzLT5wcml2YXRlOwogCXUzMiB0bXBfcmVnOwogCi0JaWYgKCFjaSkKLQkJcmV0dXJuIDA7CisJaWYgKCFjaSB8fCBjaS0+aW5fbHBtKQorCQlyZXR1cm4gLUVQRVJNOwogCiAJLyogLS0tLS0tIFJlZ2lzdGVycyAtLS0tLSAqLwogCXRtcF9yZWcgPSBod19yZWFkX2ludHJfZW5hYmxlKGNpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2hvc3QuYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL2hvc3QuYwppbmRleCA0ODczMWQwLi4yMWZlMWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvaG9zdC5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiaG9zdC5oIgogCiBzdGF0aWMgc3RydWN0IGhjX2RyaXZlciBfX3JlYWRfbW9zdGx5IGNpX2VoY2lfaGNfZHJpdmVyOworc3RhdGljIGludCAoKm9yaWdfYnVzX3N1c3BlbmQpKHN0cnVjdCB1c2JfaGNkICpoY2QpOwogCiBzdHJ1Y3QgZWhjaV9jaV9wcml2IHsKIAlzdHJ1Y3QgcmVndWxhdG9yICpyZWdfdmJ1czsKQEAgLTQzLDExICs0NCwxMCBAQAogCXN0cnVjdCBlaGNpX2hjZCAqZWhjaSA9IGhjZF90b19laGNpKGhjZCk7CiAJc3RydWN0IGVoY2lfY2lfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgZWhjaV9jaV9wcml2ICopZWhjaS0+cHJpdjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoY2QtPnNlbGYuY29udHJvbGxlcjsKLQlzdHJ1Y3QgY2lfaGRyYyAqY2kgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgcG9ydCA9IEhDU19OX1BPUlRTKGVoY2ktPmhjc19wYXJhbXMpOwogCi0JaWYgKHByaXYtPnJlZ192YnVzICYmICFjaV9vdGdfaXNfZnNtX21vZGUoY2kpKSB7CisJaWYgKHByaXYtPnJlZ192YnVzKSB7CiAJCWlmIChwb3J0ID4gMSkgewogCQkJZGV2X3dhcm4oZGV2LAogCQkJCSJOb3Qgc3VwcG9ydCBtdWx0aS1wb3J0IHJlZ3VsYXRvciBjb250cm9sXG4iKTsKQEAgLTExMywxMiArMTEzLDIzIEBACiAJcHJpdiA9IChzdHJ1Y3QgZWhjaV9jaV9wcml2ICopZWhjaS0+cHJpdjsKIAlwcml2LT5yZWdfdmJ1cyA9IE5VTEw7CiAKLQlpZiAoY2ktPnBsYXRkYXRhLT5yZWdfdmJ1cykKLQkJcHJpdi0+cmVnX3ZidXMgPSBjaS0+cGxhdGRhdGEtPnJlZ192YnVzOworCWlmIChjaS0+cGxhdGRhdGEtPnJlZ192YnVzICYmICFjaV9vdGdfaXNfZnNtX21vZGUoY2kpKSB7CisJCWlmIChjaS0+cGxhdGRhdGEtPmZsYWdzICYgQ0lfSERSQ19UVVJOX1ZCVVNfRUFSTFlfT04pIHsKKwkJCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoY2ktPnBsYXRkYXRhLT5yZWdfdmJ1cyk7CisJCQlpZiAocmV0KSB7CisJCQkJZGV2X2VycihjaS0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gZW5hYmxlIHZidXMgcmVndWxhdG9yLCByZXQ9JWRcbiIsCisJCQkJCQkJCQlyZXQpOworCQkJCWdvdG8gcHV0X2hjZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaXYtPnJlZ192YnVzID0gY2ktPnBsYXRkYXRhLT5yZWdfdmJ1czsKKwkJfQorCX0KIAogCXJldCA9IHVzYl9hZGRfaGNkKGhjZCwgMCwgMCk7CiAJaWYgKHJldCkgewotCQlnb3RvIHB1dF9oY2Q7CisJCWdvdG8gZGlzYWJsZV9yZWc7CiAJfSBlbHNlIHsKIAkJc3RydWN0IHVzYl9vdGcgKm90ZyA9ICZjaS0+b3RnOwogCkBAIC0xMzMsOCArMTQ0LDE1IEBACiAJaWYgKGNpLT5wbGF0ZGF0YS0+ZmxhZ3MgJiBDSV9IRFJDX0RJU0FCTEVfU1RSRUFNSU5HKQogCQlod193cml0ZShjaSwgT1BfVVNCTU9ERSwgVVNCTU9ERV9DSV9TRElTLCBVU0JNT0RFX0NJX1NESVMpOwogCisJaWYgKGNpLT5wbGF0ZGF0YS0+ZmxhZ3MgJiBDSV9IRFJDX0ZPUkNFX0ZVTExTUEVFRCkKKwkJaHdfd3JpdGUoY2ksIE9QX1BPUlRTQywgUE9SVFNDX1BGU0MsIFBPUlRTQ19QRlNDKTsKKwogCXJldHVybiByZXQ7CiAKK2Rpc2FibGVfcmVnOgorCWlmIChjaS0+cGxhdGRhdGEtPnJlZ192YnVzICYmICFjaV9vdGdfaXNfZnNtX21vZGUoY2kpICYmCisJCQkoY2ktPnBsYXRkYXRhLT5mbGFncyAmIENJX0hEUkNfVFVSTl9WQlVTX0VBUkxZX09OKSkKKwkJcmVndWxhdG9yX2Rpc2FibGUoY2ktPnBsYXRkYXRhLT5yZWdfdmJ1cyk7CiBwdXRfaGNkOgogCXVzYl9wdXRfaGNkKGhjZCk7CiAKQEAgLTE0OCw2ICsxNjYsOSBAQAogCWlmIChoY2QpIHsKIAkJdXNiX3JlbW92ZV9oY2QoaGNkKTsKIAkJdXNiX3B1dF9oY2QoaGNkKTsKKwkJaWYgKGNpLT5wbGF0ZGF0YS0+cmVnX3ZidXMgJiYgIWNpX290Z19pc19mc21fbW9kZShjaSkgJiYKKwkJCShjaS0+cGxhdGRhdGEtPmZsYWdzICYgQ0lfSERSQ19UVVJOX1ZCVVNfRUFSTFlfT04pKQorCQkJCXJlZ3VsYXRvcl9kaXNhYmxlKGNpLT5wbGF0ZGF0YS0+cmVnX3ZidXMpOwogCX0KIH0KIApAQCAtMTU4LDYgKzE3OSw0NyBAQAogCQlob3N0X3N0b3AoY2kpOwogfQogCitzdGF0aWMgaW50IGNpX2VoY2lfYnVzX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgZWhjaV9oY2QgKmVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOworCWludCBwb3J0OworCXUzMiB0bXA7CisKKwlpbnQgcmV0ID0gb3JpZ19idXNfc3VzcGVuZChoY2QpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBvcnQgPSBIQ1NfTl9QT1JUUyhlaGNpLT5oY3NfcGFyYW1zKTsKKwl3aGlsZSAocG9ydC0tKSB7CisJCXUzMiBfX2lvbWVtICpyZWcgPSAmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXNbcG9ydF07CisJCXUzMiBwb3J0c2MgPSBlaGNpX3JlYWRsKGVoY2ksIHJlZyk7CisKKwkJaWYgKHBvcnRzYyAmIFBPUlRfQ09OTkVDVCkgeworCQkJLyoKKwkJCSAqIEZvciBjaGlwaWRlYSwgdGhlIHJlc3VtZSBzaWduYWwgd2lsbCBiZSBlbmRlZAorCQkJICogYXV0b21hdGljYWxseSwgc28gZm9yIHJlbW90ZSB3YWtldXAgY2FzZSwgdGhlCisJCQkgKiB1c2JjbWQucnMgbWF5IG5vdCBiZSBzZXQgYmVmb3JlIHRoZSByZXN1bWUgaGFzCisJCQkgKiBlbmRlZCBpZiBvdGhlciByZXN1bWUgcGF0aHMgY29uc3VtZXMgdG9vIG11Y2gKKwkJCSAqIHRpbWUgKH4yNG1zKSwgaW4gdGhhdCBjYXNlLCB0aGUgU09GIHdpbGwgbm90CisJCQkgKiBzZW5kIG91dCB3aXRoaW4gM21zIGFmdGVyIHJlc3VtZSBlbmRzLCB0aGVuIHRoZQorCQkJICogaGlnaCBzcGVlZCBkZXZpY2Ugd2lsbCBlbnRlciBmdWxsIHNwZWVkIG1vZGUuCisJCQkgKi8KKworCQkJdG1wID0gZWhjaV9yZWFkbChlaGNpLCAmZWhjaS0+cmVncy0+Y29tbWFuZCk7CisJCQl0bXAgfD0gQ01EX1JVTjsKKwkJCWVoY2lfd3JpdGVsKGVoY2ksIHRtcCwgJmVoY2ktPnJlZ3MtPmNvbW1hbmQpOworCQkJLyoKKwkJCSAqIEl0IG5lZWRzIGEgc2hvcnQgZGVsYXkgYmV0d2VlbiBzZXQgUlMgYml0IGFuZCBQSENELgorCQkJICovCisJCQl1c2xlZXBfcmFuZ2UoMTUwLCAyMDApOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwogaW50IGNpX2hkcmNfaG9zdF9pbml0KHN0cnVjdCBjaV9oZHJjICpjaSkKIHsKIAlzdHJ1Y3QgY2lfcm9sZV9kcml2ZXIgKnJkcnY7CkBAIC0xNzYsNiArMjM4LDggQEAKIAljaS0+cm9sZXNbQ0lfUk9MRV9IT1NUXSA9IHJkcnY7CiAKIAllaGNpX2luaXRfZHJpdmVyKCZjaV9laGNpX2hjX2RyaXZlciwgJmVoY2lfY2lfb3ZlcnJpZGVzKTsKKwlvcmlnX2J1c19zdXNwZW5kID0gY2lfZWhjaV9oY19kcml2ZXIuYnVzX3N1c3BlbmQ7CisJY2lfZWhjaV9oY19kcml2ZXIuYnVzX3N1c3BlbmQgPSBjaV9laGNpX2J1c19zdXNwZW5kOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9vdGcuYyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL290Zy5jCmluZGV4IGEwNDhiMDguLmFkNmM4N2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL290Zy5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL290Zy5jCkBAIC05Niw2ICs5Niw3IEBACiAJCXJldHVybjsKIAl9CiAKKwlwbV9ydW50aW1lX2dldF9zeW5jKGNpLT5kZXYpOwogCWlmIChjaS0+aWRfZXZlbnQpIHsKIAkJY2ktPmlkX2V2ZW50ID0gZmFsc2U7CiAJCWNpX2hhbmRsZV9pZF9zd2l0Y2goY2kpOwpAQCAtMTA0LDYgKzEwNSw3IEBACiAJCWNpX2hhbmRsZV92YnVzX2NoYW5nZShjaSk7CiAJfSBlbHNlCiAJCWRldl9lcnIoY2ktPmRldiwgInVuZXhwZWN0ZWQgZXZlbnQgb2NjdXJzIGF0ICVzXG4iLCBfX2Z1bmNfXyk7CisJcG1fcnVudGltZV9wdXRfc3luYyhjaS0+ZGV2KTsKIAogCWVuYWJsZV9pcnEoY2ktPmlycSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9vdGdfZnNtLmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS9vdGdfZnNtLmMKaW5kZXggNTYyZTU4MS4uMDgzYWNmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2hpcGlkZWEvb3RnX2ZzbS5jCisrKyBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL290Z19mc20uYwpAQCAtMzAsMjIgKzMwLDYgQEAKICNpbmNsdWRlICJvdGcuaCIKICNpbmNsdWRlICJvdGdfZnNtLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgY2lfb3RnX2ZzbV90aW1lciAqb3RnX3RpbWVyX2luaXRpYWxpemVyCi0oc3RydWN0IGNpX2hkcmMgKmNpLCB2b2lkICgqZnVuY3Rpb24pKHZvaWQgKiwgdW5zaWduZWQgbG9uZyksCi0JCQl1bnNpZ25lZCBsb25nIGV4cGlyZXMsIHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgY2lfb3RnX2ZzbV90aW1lciAqdGltZXI7Ci0KLQl0aW1lciA9IGRldm1fa3phbGxvYyhjaS0+ZGV2LCBzaXplb2Yoc3RydWN0IGNpX290Z19mc21fdGltZXIpLAotCQkJCQkJCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXRpbWVyKQotCQlyZXR1cm4gTlVMTDsKLQl0aW1lci0+ZnVuY3Rpb24gPSBmdW5jdGlvbjsKLQl0aW1lci0+ZXhwaXJlcyA9IGV4cGlyZXM7Ci0JdGltZXItPmRhdGEgPSBkYXRhOwotCXJldHVybiB0aW1lcjsKLX0KLQogLyogQWRkIGZvciBvdGc6IGludGVyYWN0IHdpdGggdXNlciBzcGFjZSBhcHAgKi8KIHN0YXRpYyBzc2l6ZV90CiBnZXRfYV9idXNfcmVxKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKQEAgLTIwNCwyMjkgKzE4OCwyMjcgQEAKIH07CiAKIC8qCisgKiBLZWVwIHRoaXMgbGlzdCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aW1lcnMgaW5kZXhlZAorICogYnkgZW51bSBvdGdfZnNtX3RpbWVyIGluIGluY2x1ZGUvbGludXgvdXNiL290Zy1mc20uaAorICovCitzdGF0aWMgdW5zaWduZWQgb3RnX3RpbWVyX21zW10gPSB7CisJVEFfV0FJVF9WUklTRSwKKwlUQV9XQUlUX1ZGQUxMLAorCVRBX1dBSVRfQkNPTiwKKwlUQV9BSURMX0JESVMsCisJVEJfQVNFMF9CUlNULAorCVRBX0JJRExfQURJUywKKwlUQl9TRTBfU1JQLAorCVRCX1NSUF9GQUlMLAorCTAsCisJVEJfREFUQV9QTFMsCisJVEJfU1NFTkRfU1JQLAorfTsKKworLyoKICAqIEFkZCB0aW1lciB0byBhY3RpdmUgdGltZXIgbGlzdAogICovCi1zdGF0aWMgdm9pZCBjaV9vdGdfYWRkX3RpbWVyKHN0cnVjdCBjaV9oZHJjICpjaSwgZW51bSBjaV9vdGdfZnNtX3RpbWVyX2luZGV4IHQpCitzdGF0aWMgdm9pZCBjaV9vdGdfYWRkX3RpbWVyKHN0cnVjdCBjaV9oZHJjICpjaSwgZW51bSBvdGdfZnNtX3RpbWVyIHQpCiB7Ci0Jc3RydWN0IGNpX290Z19mc21fdGltZXIgKnRtcF90aW1lcjsKLQlzdHJ1Y3QgY2lfb3RnX2ZzbV90aW1lciAqdGltZXIgPSBjaS0+ZnNtX3RpbWVyLT50aW1lcl9saXN0W3RdOwotCXN0cnVjdCBsaXN0X2hlYWQgKmFjdGl2ZV90aW1lcnMgPSAmY2ktPmZzbV90aW1lci0+YWN0aXZlX3RpbWVyczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB0aW1lcl9zZWMsIHRpbWVyX25zZWM7CiAKLQlpZiAodCA+PSBOVU1fQ0lfT1RHX0ZTTV9USU1FUlMpCisJaWYgKHQgPj0gTlVNX09UR19GU01fVElNRVJTKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIENoZWNrIGlmIHRoZSB0aW1lciBpcyBhbHJlYWR5IGluIHRoZSBhY3RpdmUgbGlzdCwKLQkgKiBpZiBzbyB1cGRhdGUgdGltZXIgY291bnQKLQkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF90aW1lciwgYWN0aXZlX3RpbWVycywgbGlzdCkKLQkJaWYgKHRtcF90aW1lciA9PSB0aW1lcikgewotCQkJdGltZXItPmNvdW50ID0gdGltZXItPmV4cGlyZXM7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCXRpbWVyLT5jb3VudCA9IHRpbWVyLT5leHBpcmVzOwotCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5saXN0LCBhY3RpdmVfdGltZXJzKTsKLQotCS8qIEVuYWJsZSAxbXMgaXJxICovCi0JaWYgKCEoaHdfcmVhZF9vdGdzYyhjaSwgT1RHU0NfMU1TSUUpKSkKLQkJaHdfd3JpdGVfb3Rnc2MoY2ksIE9UR1NDXzFNU0lFLCBPVEdTQ18xTVNJRSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNpLT5sb2NrLCBmbGFncyk7CisJdGltZXJfc2VjID0gb3RnX3RpbWVyX21zW3RdIC8gTVNFQ19QRVJfU0VDOworCXRpbWVyX25zZWMgPSAob3RnX3RpbWVyX21zW3RdICUgTVNFQ19QRVJfU0VDKSAqIE5TRUNfUEVSX01TRUM7CisJY2ktPmhyX3RpbWVvdXRzW3RdID0ga3RpbWVfYWRkKGt0aW1lX2dldCgpLAorCQkJCWt0aW1lX3NldCh0aW1lcl9zZWMsIHRpbWVyX25zZWMpKTsKKwljaS0+ZW5hYmxlZF9vdGdfdGltZXJfYml0cyB8PSAoMSA8PCB0KTsKKwlpZiAoKGNpLT5uZXh0X290Z190aW1lciA9PSBOVU1fT1RHX0ZTTV9USU1FUlMpIHx8CisJCQkoY2ktPmhyX3RpbWVvdXRzW2NpLT5uZXh0X290Z190aW1lcl0udHY2NCA+CisJCQkJCQljaS0+aHJfdGltZW91dHNbdF0udHY2NCkpIHsKKwkJCWNpLT5uZXh0X290Z190aW1lciA9IHQ7CisJCQlocnRpbWVyX3N0YXJ0X3JhbmdlX25zKCZjaS0+b3RnX2ZzbV9ocnRpbWVyLAorCQkJCQljaS0+aHJfdGltZW91dHNbdF0sIE5TRUNfUEVSX01TRUMsCisJCQkJCQkJSFJUSU1FUl9NT0RFX0FCUyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNpLT5sb2NrLCBmbGFncyk7CiB9CiAKIC8qCiAgKiBSZW1vdmUgdGltZXIgZnJvbSBhY3RpdmUgdGltZXIgbGlzdAogICovCi1zdGF0aWMgdm9pZCBjaV9vdGdfZGVsX3RpbWVyKHN0cnVjdCBjaV9oZHJjICpjaSwgZW51bSBjaV9vdGdfZnNtX3RpbWVyX2luZGV4IHQpCitzdGF0aWMgdm9pZCBjaV9vdGdfZGVsX3RpbWVyKHN0cnVjdCBjaV9oZHJjICpjaSwgZW51bSBvdGdfZnNtX3RpbWVyIHQpCiB7Ci0Jc3RydWN0IGNpX290Z19mc21fdGltZXIgKnRtcF90aW1lciwgKmRlbF90bXA7Ci0Jc3RydWN0IGNpX290Z19mc21fdGltZXIgKnRpbWVyID0gY2ktPmZzbV90aW1lci0+dGltZXJfbGlzdFt0XTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICphY3RpdmVfdGltZXJzID0gJmNpLT5mc21fdGltZXItPmFjdGl2ZV90aW1lcnM7CisJdW5zaWduZWQgbG9uZyBmbGFncywgZW5hYmxlZF90aW1lcl9iaXRzOworCWVudW0gb3RnX2ZzbV90aW1lciBjdXJfdGltZXIsIG5leHRfdGltZXIgPSBOVU1fT1RHX0ZTTV9USU1FUlM7CiAKLQlpZiAodCA+PSBOVU1fQ0lfT1RHX0ZTTV9USU1FUlMpCisJaWYgKCh0ID49IE5VTV9PVEdfRlNNX1RJTUVSUykgfHwKKwkJCSEoY2ktPmVuYWJsZWRfb3RnX3RpbWVyX2JpdHMgJiAoMSA8PCB0KSkpCiAJCXJldHVybjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0bXBfdGltZXIsIGRlbF90bXAsIGFjdGl2ZV90aW1lcnMsIGxpc3QpCi0JCWlmICh0bXBfdGltZXIgPT0gdGltZXIpCi0JCQlsaXN0X2RlbCgmdGltZXItPmxpc3QpOwotCi0JLyogRGlzYWJsZSAxbXMgaXJxIGlmIHRoZXJlIGlzIG5vIGFueSBhY3RpdmUgdGltZXIgKi8KLQlpZiAobGlzdF9lbXB0eShhY3RpdmVfdGltZXJzKSkKLQkJaHdfd3JpdGVfb3Rnc2MoY2ksIE9UR1NDXzFNU0lFLCAwKTsKLX0KLQotLyoKLSAqIFJlZHVjZSB0aW1lciBjb3VudCBieSAxLCBhbmQgZmluZCB0aW1lb3V0IGNvbmRpdGlvbnMuCi0gKiBDYWxsZWQgYnkgb3RnIDFtcyB0aW1lciBpbnRlcnJ1cHQKLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2lfb3RnX3RpY2tfdGltZXIoc3RydWN0IGNpX2hkcmMgKmNpKQotewotCXN0cnVjdCBjaV9vdGdfZnNtX3RpbWVyICp0bXBfdGltZXIsICpkZWxfdG1wOwotCXN0cnVjdCBsaXN0X2hlYWQgKmFjdGl2ZV90aW1lcnMgPSAmY2ktPmZzbV90aW1lci0+YWN0aXZlX3RpbWVyczsKLQlpbnQgZXhwaXJlZCA9IDA7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodG1wX3RpbWVyLCBkZWxfdG1wLCBhY3RpdmVfdGltZXJzLCBsaXN0KSB7Ci0JCXRtcF90aW1lci0+Y291bnQtLTsKLQkJLyogY2hlY2sgaWYgdGltZXIgZXhwaXJlcyAqLwotCQlpZiAoIXRtcF90aW1lci0+Y291bnQpIHsKLQkJCWxpc3RfZGVsKCZ0bXBfdGltZXItPmxpc3QpOwotCQkJdG1wX3RpbWVyLT5mdW5jdGlvbihjaSwgdG1wX3RpbWVyLT5kYXRhKTsKLQkJCWV4cGlyZWQgPSAxOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaS0+bG9jaywgZmxhZ3MpOworCWNpLT5lbmFibGVkX290Z190aW1lcl9iaXRzICY9IH4oMSA8PCB0KTsKKwlpZiAoY2ktPm5leHRfb3RnX3RpbWVyID09IHQpIHsKKwkJaWYgKGNpLT5lbmFibGVkX290Z190aW1lcl9iaXRzID09IDApIHsKKwkJCS8qIE5vIGVuYWJsZWQgdGltZXJzIGFmdGVyIGRlbGV0ZSBpdCAqLworCQkJaHJ0aW1lcl9jYW5jZWwoJmNpLT5vdGdfZnNtX2hydGltZXIpOworCQkJY2ktPm5leHRfb3RnX3RpbWVyID0gTlVNX09UR19GU01fVElNRVJTOworCQl9IGVsc2UgeworCQkJLyogRmluZCB0aGUgbmV4dCB0aW1lciAqLworCQkJZW5hYmxlZF90aW1lcl9iaXRzID0gY2ktPmVuYWJsZWRfb3RnX3RpbWVyX2JpdHM7CisJCQlmb3JfZWFjaF9zZXRfYml0KGN1cl90aW1lciwgJmVuYWJsZWRfdGltZXJfYml0cywKKwkJCQkJCQlOVU1fT1RHX0ZTTV9USU1FUlMpIHsKKwkJCQlpZiAoKG5leHRfdGltZXIgPT0gTlVNX09UR19GU01fVElNRVJTKSB8fAorCQkJCQkoY2ktPmhyX3RpbWVvdXRzW25leHRfdGltZXJdLnR2NjQgPAorCQkJCQljaS0+aHJfdGltZW91dHNbY3VyX3RpbWVyXS50djY0KSkKKwkJCQkJbmV4dF90aW1lciA9IGN1cl90aW1lcjsKKwkJCX0KIAkJfQogCX0KLQotCS8qIGRpc2FibGUgMW1zIGlycSBpZiB0aGVyZSBpcyBubyBhbnkgdGltZXIgYWN0aXZlICovCi0JaWYgKChleHBpcmVkID09IDEpICYmIGxpc3RfZW1wdHkoYWN0aXZlX3RpbWVycykpCi0JCWh3X3dyaXRlX290Z3NjKGNpLCBPVEdTQ18xTVNJRSwgMCk7Ci0KLQlyZXR1cm4gZXhwaXJlZDsKLX0KLQotLyogVGhlIHRpbWVvdXQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gc2V0IHRpbWUgb3V0IGJpdCAqLwotc3RhdGljIHZvaWQgc2V0X3Rtb3V0KHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBpbmRpY2F0b3IpCi17Ci0JKihpbnQgKilpbmRpY2F0b3IgPSAxOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfdG1vdXRfYW5kX2ZzbSh2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgaW5kaWNhdG9yKQotewotCXN0cnVjdCBjaV9oZHJjICpjaSA9IChzdHJ1Y3QgY2lfaGRyYyAqKXB0cjsKLQotCXNldF90bW91dChjaSwgaW5kaWNhdG9yKTsKLQotCWNpX290Z19xdWV1ZV93b3JrKGNpKTsKLX0KLQotc3RhdGljIHZvaWQgYV93YWl0X3ZmYWxsX3Rtb3V0X2Z1bmModm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGluZGljYXRvcikKLXsKLQlzdHJ1Y3QgY2lfaGRyYyAqY2kgPSAoc3RydWN0IGNpX2hkcmMgKilwdHI7Ci0KLQlzZXRfdG1vdXQoY2ksIGluZGljYXRvcik7Ci0JLyogRGlzYWJsZSBwb3J0IHBvd2VyICovCi0JaHdfd3JpdGUoY2ksIE9QX1BPUlRTQywgUE9SVFNDX1cxQ19CSVRTIHwgUE9SVFNDX1BQLCAwKTsKLQkvKiBDbGVhciBleGlzdGluZyBEUCBpcnEgKi8KLQlod193cml0ZV9vdGdzYyhjaSwgT1RHU0NfRFBJUywgT1RHU0NfRFBJUyk7Ci0JLyogRW5hYmxlIGRhdGEgcHVsc2UgaXJxICovCi0JaHdfd3JpdGVfb3Rnc2MoY2ksIE9UR1NDX0RQSUUsIE9UR1NDX0RQSUUpOwotCWNpX290Z19xdWV1ZV93b3JrKGNpKTsKLX0KLQotc3RhdGljIHZvaWQgYl9hc2UwX2Jyc3RfdG1vdXRfZnVuYyh2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgaW5kaWNhdG9yKQotewotCXN0cnVjdCBjaV9oZHJjICpjaSA9IChzdHJ1Y3QgY2lfaGRyYyAqKXB0cjsKLQotCXNldF90bW91dChjaSwgaW5kaWNhdG9yKTsKLQlpZiAoIWh3X3JlYWRfb3Rnc2MoY2ksIE9UR1NDX0JTVikpCi0JCWNpLT5mc20uYl9zZXNzX3ZsZCA9IDA7Ci0KLQljaV9vdGdfcXVldWVfd29yayhjaSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGJfc3NlbmRfc3JwX3Rtb3V0X2Z1bmModm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGluZGljYXRvcikKLXsKLQlzdHJ1Y3QgY2lfaGRyYyAqY2kgPSAoc3RydWN0IGNpX2hkcmMgKilwdHI7Ci0KLQlzZXRfdG1vdXQoY2ksIGluZGljYXRvcik7Ci0KLQkvKiBvbmx5IHZidXMgZmFsbCBiZWxvdyBCX3Nlc3NfdmxkIGluIGJfaWRsZSBzdGF0ZSAqLwotCWlmIChjaS0+ZnNtLm90Zy0+c3RhdGUgPT0gT1RHX1NUQVRFX0JfSURMRSkKLQkJY2lfb3RnX3F1ZXVlX3dvcmsoY2kpOwotfQotCi1zdGF0aWMgdm9pZCBiX3Nlc3NfdmxkX3Rtb3V0X2Z1bmModm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGluZGljYXRvcikKLXsKLQlzdHJ1Y3QgY2lfaGRyYyAqY2kgPSAoc3RydWN0IGNpX2hkcmMgKilwdHI7Ci0KLQkvKiBDaGVjayBpZiBBIGRldGFjaGVkICovCi0JaWYgKCEoaHdfcmVhZF9vdGdzYyhjaSwgT1RHU0NfQlNWKSkpIHsKLQkJY2ktPmZzbS5iX3Nlc3NfdmxkID0gMDsKLQkJY2lfb3RnX2FkZF90aW1lcihjaSwgQl9TU0VORF9TUlApOwotCQljaV9vdGdfcXVldWVfd29yayhjaSk7CisJaWYgKG5leHRfdGltZXIgIT0gTlVNX09UR19GU01fVElNRVJTKSB7CisJCWNpLT5uZXh0X290Z190aW1lciA9IG5leHRfdGltZXI7CisJCWhydGltZXJfc3RhcnRfcmFuZ2VfbnMoJmNpLT5vdGdfZnNtX2hydGltZXIsCisJCQljaS0+aHJfdGltZW91dHNbbmV4dF90aW1lcl0sIE5TRUNfUEVSX01TRUMsCisJCQkJCQkJSFJUSU1FUl9NT0RFX0FCUyk7CiAJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNpLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIGJfZGF0YV9wdWxzZV9lbmQodm9pZCAqcHRyLCB1bnNpZ25lZCBsb25nIGluZGljYXRvcikKKy8qIE9URyBGU00gdGltZXIgaGFuZGxlcnMgKi8KK3N0YXRpYyBpbnQgYV93YWl0X3ZyaXNlX3Rtb3V0KHN0cnVjdCBjaV9oZHJjICpjaSkKIHsKLQlzdHJ1Y3QgY2lfaGRyYyAqY2kgPSAoc3RydWN0IGNpX2hkcmMgKilwdHI7CisJY2ktPmZzbS5hX3dhaXRfdnJpc2VfdG1vdXQgPSAxOworCXJldHVybiAwOworfQogCitzdGF0aWMgaW50IGFfd2FpdF92ZmFsbF90bW91dChzdHJ1Y3QgY2lfaGRyYyAqY2kpCit7CisJY2ktPmZzbS5hX3dhaXRfdmZhbGxfdG1vdXQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFfd2FpdF9iY29uX3Rtb3V0KHN0cnVjdCBjaV9oZHJjICpjaSkKK3sKKwljaS0+ZnNtLmFfd2FpdF9iY29uX3Rtb3V0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhX2FpZGxfYmRpc190bW91dChzdHJ1Y3QgY2lfaGRyYyAqY2kpCit7CisJY2ktPmZzbS5hX2FpZGxfYmRpc190bW91dCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYl9hc2UwX2Jyc3RfdG1vdXQoc3RydWN0IGNpX2hkcmMgKmNpKQoreworCWNpLT5mc20uYl9hc2UwX2Jyc3RfdG1vdXQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFfYmlkbF9hZGlzX3Rtb3V0KHN0cnVjdCBjaV9oZHJjICpjaSkKK3sKKwljaS0+ZnNtLmFfYmlkbF9hZGlzX3Rtb3V0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiX3NlMF9zcnBfdG1vdXQoc3RydWN0IGNpX2hkcmMgKmNpKQoreworCWNpLT5mc20uYl9zZTBfc3JwID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiX3NycF9mYWlsX3Rtb3V0KHN0cnVjdCBjaV9oZHJjICpjaSkKK3sKKwljaS0+ZnNtLmJfc3JwX2RvbmUgPSAxOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGJfZGF0YV9wbHNfdG1vdXQoc3RydWN0IGNpX2hkcmMgKmNpKQorewogCWNpLT5mc20uYl9zcnBfZG9uZSA9IDE7CiAJY2ktPmZzbS5iX2J1c19yZXEgPSAwOwogCWlmIChjaS0+ZnNtLnBvd2VyX3VwKQogCQljaS0+ZnNtLnBvd2VyX3VwID0gMDsKLQogCWh3X3dyaXRlX290Z3NjKGNpLCBPVEdTQ19IQUJBLCAwKTsKKwlwbV9ydW50aW1lX3B1dChjaS0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KIAotCWNpX290Z19xdWV1ZV93b3JrKGNpKTsKK3N0YXRpYyBpbnQgYl9zc2VuZF9zcnBfdG1vdXQoc3RydWN0IGNpX2hkcmMgKmNpKQoreworCWNpLT5mc20uYl9zc2VuZF9zcnAgPSAxOworCS8qIG9ubHkgdmJ1cyBmYWxsIGJlbG93IEJfc2Vzc192bGQgaW4gYl9pZGxlIHN0YXRlICovCisJaWYgKGNpLT5mc20ub3RnLT5zdGF0ZSA9PSBPVEdfU1RBVEVfQl9JRExFKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAxOworfQorCisvKgorICogS2VlcCB0aGlzIGxpc3QgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGltZXJzIGluZGV4ZWQKKyAqIGJ5IGVudW0gb3RnX2ZzbV90aW1lciBpbiBpbmNsdWRlL2xpbnV4L3VzYi9vdGctZnNtLmgKKyAqLworc3RhdGljIGludCAoKm90Z190aW1lcl9oYW5kbGVyc1tdKShzdHJ1Y3QgY2lfaGRyYyAqKSA9IHsKKwlhX3dhaXRfdnJpc2VfdG1vdXQsCS8qIEFfV0FJVF9WUklTRSAqLworCWFfd2FpdF92ZmFsbF90bW91dCwJLyogQV9XQUlUX1ZGQUxMICovCisJYV93YWl0X2Jjb25fdG1vdXQsCS8qIEFfV0FJVF9CQ09OICovCisJYV9haWRsX2JkaXNfdG1vdXQsCS8qIEFfQUlETF9CRElTICovCisJYl9hc2UwX2Jyc3RfdG1vdXQsCS8qIEJfQVNFMF9CUlNUICovCisJYV9iaWRsX2FkaXNfdG1vdXQsCS8qIEFfQklETF9BRElTICovCisJYl9zZTBfc3JwX3Rtb3V0LAkvKiBCX1NFMF9TUlAgKi8KKwliX3NycF9mYWlsX3Rtb3V0LAkvKiBCX1NSUF9GQUlMICovCisJTlVMTCwJCQkvKiBBX1dBSVRfRU5VTSAqLworCWJfZGF0YV9wbHNfdG1vdXQsCS8qIEJfREFUQV9QTFMgKi8KKwliX3NzZW5kX3NycF90bW91dCwJLyogQl9TU0VORF9TUlAgKi8KK307CisKKy8qCisgKiBFbmFibGUgdGhlIG5leHQgbmVhcmVzdCBlbmFibGVkIHRpbWVyIGlmIGhhdmUKKyAqLworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGNpX290Z19ocnRpbWVyX2Z1bmMoc3RydWN0IGhydGltZXIgKnQpCit7CisJc3RydWN0IGNpX2hkcmMgKmNpID0gY29udGFpbmVyX29mKHQsIHN0cnVjdCBjaV9oZHJjLCBvdGdfZnNtX2hydGltZXIpOworCWt0aW1lX3QJbm93LCAqdGltZW91dDsKKwl1bnNpZ25lZCBsb25nICAgZW5hYmxlZF90aW1lcl9iaXRzOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwllbnVtIG90Z19mc21fdGltZXIgY3VyX3RpbWVyLCBuZXh0X3RpbWVyID0gTlVNX09UR19GU01fVElNRVJTOworCWludCByZXQgPSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNpLT5sb2NrLCBmbGFncyk7CisJZW5hYmxlZF90aW1lcl9iaXRzID0gY2ktPmVuYWJsZWRfb3RnX3RpbWVyX2JpdHM7CisJY2ktPm5leHRfb3RnX3RpbWVyID0gTlVNX09UR19GU01fVElNRVJTOworCisJbm93ID0ga3RpbWVfZ2V0KCk7CisJZm9yX2VhY2hfc2V0X2JpdChjdXJfdGltZXIsICZlbmFibGVkX3RpbWVyX2JpdHMsIE5VTV9PVEdfRlNNX1RJTUVSUykgeworCQlpZiAobm93LnR2NjQgPj0gY2ktPmhyX3RpbWVvdXRzW2N1cl90aW1lcl0udHY2NCkgeworCQkJY2ktPmVuYWJsZWRfb3RnX3RpbWVyX2JpdHMgJj0gfigxIDw8IGN1cl90aW1lcik7CisJCQlpZiAob3RnX3RpbWVyX2hhbmRsZXJzW2N1cl90aW1lcl0pCisJCQkJcmV0ID0gb3RnX3RpbWVyX2hhbmRsZXJzW2N1cl90aW1lcl0oY2kpOworCQl9IGVsc2UgeworCQkJaWYgKChuZXh0X3RpbWVyID09IE5VTV9PVEdfRlNNX1RJTUVSUykgfHwKKwkJCQkoY2ktPmhyX3RpbWVvdXRzW2N1cl90aW1lcl0udHY2NCA8CisJCQkJCWNpLT5ocl90aW1lb3V0c1tuZXh0X3RpbWVyXS50djY0KSkKKwkJCQluZXh0X3RpbWVyID0gY3VyX3RpbWVyOworCQl9CisJfQorCS8qIEVuYWJsZSB0aGUgbmV4dCBuZWFyZXN0IHRpbWVyICovCisJaWYgKG5leHRfdGltZXIgPCBOVU1fT1RHX0ZTTV9USU1FUlMpIHsKKwkJdGltZW91dCA9ICZjaS0+aHJfdGltZW91dHNbbmV4dF90aW1lcl07CisJCWhydGltZXJfc3RhcnRfcmFuZ2VfbnMoJmNpLT5vdGdfZnNtX2hydGltZXIsICp0aW1lb3V0LAorCQkJCQlOU0VDX1BFUl9NU0VDLCBIUlRJTUVSX01PREVfQUJTKTsKKwkJY2ktPm5leHRfb3RnX3RpbWVyID0gbmV4dF90aW1lcjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2ktPmxvY2ssIGZsYWdzKTsKKworCWlmICghcmV0KQorCQljaV9vdGdfcXVldWVfd29yayhjaSk7CisKKwlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CiB9CiAKIC8qIEluaXRpYWxpemUgdGltZXJzICovCiBzdGF0aWMgaW50IGNpX290Z19pbml0X3RpbWVycyhzdHJ1Y3QgY2lfaGRyYyAqY2kpCiB7Ci0Jc3RydWN0IG90Z19mc20gKmZzbSA9ICZjaS0+ZnNtOwotCi0JLyogRlNNIHVzZWQgdGltZXJzICovCi0JY2ktPmZzbV90aW1lci0+dGltZXJfbGlzdFtBX1dBSVRfVlJJU0VdID0KLQkJb3RnX3RpbWVyX2luaXRpYWxpemVyKGNpLCAmc2V0X3Rtb3V0X2FuZF9mc20sIFRBX1dBSVRfVlJJU0UsCi0JCQkodW5zaWduZWQgbG9uZykmZnNtLT5hX3dhaXRfdnJpc2VfdG1vdXQpOwotCWlmIChjaS0+ZnNtX3RpbWVyLT50aW1lcl9saXN0W0FfV0FJVF9WUklTRV0gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljaS0+ZnNtX3RpbWVyLT50aW1lcl9saXN0W0FfV0FJVF9WRkFMTF0gPQotCQlvdGdfdGltZXJfaW5pdGlhbGl6ZXIoY2ksICZhX3dhaXRfdmZhbGxfdG1vdXRfZnVuYywKLQkJVEFfV0FJVF9WRkFMTCwgKHVuc2lnbmVkIGxvbmcpJmZzbS0+YV93YWl0X3ZmYWxsX3Rtb3V0KTsKLQlpZiAoY2ktPmZzbV90aW1lci0+dGltZXJfbGlzdFtBX1dBSVRfVkZBTExdID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2ktPmZzbV90aW1lci0+dGltZXJfbGlzdFtBX1dBSVRfQkNPTl0gPQotCQlvdGdfdGltZXJfaW5pdGlhbGl6ZXIoY2ksICZzZXRfdG1vdXRfYW5kX2ZzbSwgVEFfV0FJVF9CQ09OLAotCQkJCSh1bnNpZ25lZCBsb25nKSZmc20tPmFfd2FpdF9iY29uX3Rtb3V0KTsKLQlpZiAoY2ktPmZzbV90aW1lci0+dGltZXJfbGlzdFtBX1dBSVRfQkNPTl0gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljaS0+ZnNtX3RpbWVyLT50aW1lcl9saXN0W0FfQUlETF9CRElTXSA9Ci0JCW90Z190aW1lcl9pbml0aWFsaXplcihjaSwgJnNldF90bW91dF9hbmRfZnNtLCBUQV9BSURMX0JESVMsCi0JCQkJKHVuc2lnbmVkIGxvbmcpJmZzbS0+YV9haWRsX2JkaXNfdG1vdXQpOwotCWlmIChjaS0+ZnNtX3RpbWVyLT50aW1lcl9saXN0W0FfQUlETF9CRElTXSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNpLT5mc21fdGltZXItPnRpbWVyX2xpc3RbQV9CSURMX0FESVNdID0KLQkJb3RnX3RpbWVyX2luaXRpYWxpemVyKGNpLCAmc2V0X3Rtb3V0X2FuZF9mc20sIFRBX0JJRExfQURJUywKLQkJCQkodW5zaWduZWQgbG9uZykmZnNtLT5hX2JpZGxfYWRpc190bW91dCk7Ci0JaWYgKGNpLT5mc21fdGltZXItPnRpbWVyX2xpc3RbQV9CSURMX0FESVNdID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2ktPmZzbV90aW1lci0+dGltZXJfbGlzdFtCX0FTRTBfQlJTVF0gPQotCQlvdGdfdGltZXJfaW5pdGlhbGl6ZXIoY2ksICZiX2FzZTBfYnJzdF90bW91dF9mdW5jLCBUQl9BU0UwX0JSU1QsCi0JCQkJCSh1bnNpZ25lZCBsb25nKSZmc20tPmJfYXNlMF9icnN0X3Rtb3V0KTsKLQlpZiAoY2ktPmZzbV90aW1lci0+dGltZXJfbGlzdFtCX0FTRTBfQlJTVF0gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljaS0+ZnNtX3RpbWVyLT50aW1lcl9saXN0W0JfU0UwX1NSUF0gPQotCQlvdGdfdGltZXJfaW5pdGlhbGl6ZXIoY2ksICZzZXRfdG1vdXRfYW5kX2ZzbSwgVEJfU0UwX1NSUCwKLQkJCQkJKHVuc2lnbmVkIGxvbmcpJmZzbS0+Yl9zZTBfc3JwKTsKLQlpZiAoY2ktPmZzbV90aW1lci0+dGltZXJfbGlzdFtCX1NFMF9TUlBdID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2ktPmZzbV90aW1lci0+dGltZXJfbGlzdFtCX1NTRU5EX1NSUF0gPQotCQlvdGdfdGltZXJfaW5pdGlhbGl6ZXIoY2ksICZiX3NzZW5kX3NycF90bW91dF9mdW5jLCBUQl9TU0VORF9TUlAsCi0JCQkJCSh1bnNpZ25lZCBsb25nKSZmc20tPmJfc3NlbmRfc3JwKTsKLQlpZiAoY2ktPmZzbV90aW1lci0+dGltZXJfbGlzdFtCX1NTRU5EX1NSUF0gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljaS0+ZnNtX3RpbWVyLT50aW1lcl9saXN0W0JfU1JQX0ZBSUxdID0KLQkJb3RnX3RpbWVyX2luaXRpYWxpemVyKGNpLCAmc2V0X3Rtb3V0LCBUQl9TUlBfRkFJTCwKLQkJCQkodW5zaWduZWQgbG9uZykmZnNtLT5iX3NycF9kb25lKTsKLQlpZiAoY2ktPmZzbV90aW1lci0+dGltZXJfbGlzdFtCX1NSUF9GQUlMXSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWNpLT5mc21fdGltZXItPnRpbWVyX2xpc3RbQl9EQVRBX1BMU10gPQotCQlvdGdfdGltZXJfaW5pdGlhbGl6ZXIoY2ksICZiX2RhdGFfcHVsc2VfZW5kLCBUQl9EQVRBX1BMUywgMCk7Ci0JaWYgKGNpLT5mc21fdGltZXItPnRpbWVyX2xpc3RbQl9EQVRBX1BMU10gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljaS0+ZnNtX3RpbWVyLT50aW1lcl9saXN0W0JfU0VTU19WTERdID0Jb3RnX3RpbWVyX2luaXRpYWxpemVyKGNpLAotCQkJCQkmYl9zZXNzX3ZsZF90bW91dF9mdW5jLCBUQl9TRVNTX1ZMRCwgMCk7Ci0JaWYgKGNpLT5mc21fdGltZXItPnRpbWVyX2xpc3RbQl9TRVNTX1ZMRF0gPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07CisJaHJ0aW1lcl9pbml0KCZjaS0+b3RnX2ZzbV9ocnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9BQlMpOworCWNpLT5vdGdfZnNtX2hydGltZXIuZnVuY3Rpb24gPSBjaV9vdGdfaHJ0aW1lcl9mdW5jOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01MzAsNiArNTEyLDcgQEAKIAkvKiBIYXJkd2FyZSBBc3Npc3RhbnQgRGF0YSBwdWxzZSAqLwogCWh3X3dyaXRlX290Z3NjKGNpLCBPVEdTQ19IQURQLCBPVEdTQ19IQURQKTsKIAorCXBtX3J1bnRpbWVfZ2V0KGNpLT5kZXYpOwogCWNpX290Z19hZGRfdGltZXIoY2ksIEJfREFUQV9QTFMpOwogfQogCkBAIC01ODUsNiArNTY4LDcgQEAKIAkJY2ktPmZzbS5vdGctPnN0YXRlIDwgT1RHX1NUQVRFX0FfSURMRSkKIAkJcmV0dXJuIDA7CiAKKwlwbV9ydW50aW1lX2dldF9zeW5jKGNpLT5kZXYpOwogCWlmIChvdGdfc3RhdGVtYWNoaW5lKCZjaS0+ZnNtKSkgewogCQlpZiAoY2ktPmZzbS5vdGctPnN0YXRlID09IE9UR19TVEFURV9BX0lETEUpIHsKIAkJCS8qCkBAIC01OTYsOCArNTgwLDE1IEBACiAJCQkgKiBhX2lkbGUgdG8gYV93YWl0X3ZyaXNlIHdoZW4gcG93ZXIgdXAKIAkJCSAqLwogCQkJaWYgKChjaS0+ZnNtLmlkKSB8fCAoY2ktPmlkX2V2ZW50KSB8fAotCQkJCQkJKGNpLT5mc20ucG93ZXJfdXApKQorCQkJCQkJKGNpLT5mc20ucG93ZXJfdXApKSB7CiAJCQkJY2lfb3RnX3F1ZXVlX3dvcmsoY2kpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBFbmFibGUgZGF0YSBwdWxzZSBpcnEgKi8KKwkJCQlod193cml0ZShjaSwgT1BfUE9SVFNDLCBQT1JUU0NfVzFDX0JJVFMgfAorCQkJCQkJCQlQT1JUU0NfUFAsIDApOworCQkJCWh3X3dyaXRlX290Z3NjKGNpLCBPVEdTQ19EUElTLCBPVEdTQ19EUElTKTsKKwkJCQlod193cml0ZV9vdGdzYyhjaSwgT1RHU0NfRFBJRSwgT1RHU0NfRFBJRSk7CisJCQl9CiAJCQlpZiAoY2ktPmlkX2V2ZW50KQogCQkJCWNpLT5pZF9ldmVudCA9IGZhbHNlOwogCQl9IGVsc2UgaWYgKGNpLT5mc20ub3RnLT5zdGF0ZSA9PSBPVEdfU1RBVEVfQl9JRExFKSB7CkBAIC02MDksOCArNjAwLDEzIEBACiAJCQkJICovCiAJCQkJY2lfb3RnX3F1ZXVlX3dvcmsoY2kpOwogCQkJfQorCQl9IGVsc2UgaWYgKGNpLT5mc20ub3RnLT5zdGF0ZSA9PSBPVEdfU1RBVEVfQV9IT1NUKSB7CisJCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGNpLT5kZXYpOworCQkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoY2ktPmRldik7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KKwlwbV9ydW50aW1lX3B1dF9zeW5jKGNpLT5kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC02NTUsNyArNjUxLDYgQEAKIAkJCWZzbS0+YV9jb25uID0gMDsKIAkJCWZzbS0+Yl9idXNfcmVxID0gMDsKIAkJCWNpX290Z19xdWV1ZV93b3JrKGNpKTsKLQkJCWNpX290Z19hZGRfdGltZXIoY2ksIEJfU0VTU19WTEQpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgT1RHX1NUQVRFX0FfUEVSSVBIRVJBTDoKQEAgLTcyNSwxMSArNzIwLDcgQEAKIAlmc20tPmlkID0gKG90Z3NjICYgT1RHU0NfSUQpID8gMSA6IDA7CiAKIAlpZiAob3RnX2ludF9zcmMpIHsKLQkJaWYgKG90Z19pbnRfc3JjICYgT1RHU0NfMU1TSVMpIHsKLQkJCWh3X3dyaXRlX290Z3NjKGNpLCBPVEdTQ18xTVNJUywgT1RHU0NfMU1TSVMpOwotCQkJcmV0dmFsID0gY2lfb3RnX3RpY2tfdGltZXIoY2kpOwotCQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCQl9IGVsc2UgaWYgKG90Z19pbnRfc3JjICYgT1RHU0NfRFBJUykgeworCQlpZiAob3RnX2ludF9zcmMgJiBPVEdTQ19EUElTKSB7CiAJCQlod193cml0ZV9vdGdzYyhjaSwgT1RHU0NfRFBJUywgT1RHU0NfRFBJUyk7CiAJCQlmc20tPmFfc3JwX2RldCA9IDE7CiAJCQlmc20tPmFfYnVzX2Ryb3AgPSAwOwpAQCAtNzkzLDE3ICs3ODQsMTMgQEAKIAogCW11dGV4X2luaXQoJmNpLT5mc20ubG9jayk7CiAKLQljaS0+ZnNtX3RpbWVyID0gZGV2bV9remFsbG9jKGNpLT5kZXYsCi0JCQlzaXplb2Yoc3RydWN0IGNpX290Z19mc21fdGltZXJfbGlzdCksIEdGUF9LRVJORUwpOwotCWlmICghY2ktPmZzbV90aW1lcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlJTklUX0xJU1RfSEVBRCgmY2ktPmZzbV90aW1lci0+YWN0aXZlX3RpbWVycyk7CiAJcmV0dmFsID0gY2lfb3RnX2luaXRfdGltZXJzKGNpKTsKIAlpZiAocmV0dmFsKSB7CiAJCWRldl9lcnIoY2ktPmRldiwgIkNvdWxkbid0IGluaXQgT1RHIHRpbWVyc1xuIik7CiAJCXJldHVybiByZXR2YWw7CiAJfQorCWNpLT5lbmFibGVkX290Z190aW1lcl9iaXRzID0gMDsKKwljaS0+bmV4dF9vdGdfdGltZXIgPSBOVU1fT1RHX0ZTTV9USU1FUlM7CiAKIAlyZXR2YWwgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNpLT5kZXYtPmtvYmosICZpbnB1dHNfYXR0cl9ncm91cCk7CiAJaWYgKHJldHZhbCA8IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL290Z19mc20uaCBiL2RyaXZlcnMvdXNiL2NoaXBpZGVhL290Z19mc20uaAppbmRleCA5NGMwODVmLi4yNjg5Mzc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS9vdGdfZnNtLmgKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvb3RnX2ZzbS5oCkBAIC02MiwzMyArNjIsNiBAQAogLyogU1NFTkQgdGltZSBiZWZvcmUgU1JQICovCiAjZGVmaW5lIFRCX1NTRU5EX1NSUCAgICAgICAgICgxNTAwKQkvKiBtaW5pbXVtIDEuNSBzZWMsIHNlY3Rpb246NS4xLjIgKi8KIAotI2RlZmluZSBUQl9TRVNTX1ZMRCAgICAgICAgICAoMTAwMCkKLQotZW51bSBjaV9vdGdfZnNtX3RpbWVyX2luZGV4IHsKLQkvKgotCSAqIENJIHNwZWNpZmljIHRpbWVycywgc3RhcnQgZnJvbSB0aGUgZW5kCi0JICogb2Ygc3RhbmRhcmQgYW5kIGF1eGlsaWFyeSBPVEcgdGltZXJzCi0JICovCi0JQl9EQVRBX1BMUyA9IE5VTV9PVEdfRlNNX1RJTUVSUywKLQlCX1NTRU5EX1NSUCwKLQlCX1NFU1NfVkxELAotCi0JTlVNX0NJX09UR19GU01fVElNRVJTLAotfTsKLQotc3RydWN0IGNpX290Z19mc21fdGltZXIgewotCXVuc2lnbmVkIGxvbmcgZXhwaXJlczsgIC8qIE51bWJlciBvZiBjb3VudCBpbmNyZWFzZSB0byB0aW1lb3V0ICovCi0JdW5zaWduZWQgbG9uZyBjb3VudDsgICAgLyogVGljayBjb3VudGVyICovCi0Jdm9pZCAoKmZ1bmN0aW9uKSh2b2lkICosIHVuc2lnbmVkIGxvbmcpOyAgICAgICAgLyogVGltZW91dCBmdW5jdGlvbiAqLwotCXVuc2lnbmVkIGxvbmcgZGF0YTsgICAgIC8qIERhdGEgcGFzc2VkIHRvIGZ1bmN0aW9uICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotfTsKLQotc3RydWN0IGNpX290Z19mc21fdGltZXJfbGlzdCB7Ci0Jc3RydWN0IGNpX290Z19mc21fdGltZXIgKnRpbWVyX2xpc3RbTlVNX0NJX09UR19GU01fVElNRVJTXTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV90aW1lcnM7Ci19OwotCiAjaWZkZWYgQ09ORklHX1VTQl9PVEdfRlNNCiAKIGludCBjaV9oZHJjX290Z19mc21faW5pdChzdHJ1Y3QgY2lfaGRyYyAqY2kpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY2hpcGlkZWEvdWRjLmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS91ZGMuYwppbmRleCBmZjQ1MTA0Li43NjRmNjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jaGlwaWRlYS91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS91ZGMuYwpAQCAtODYsMTAgKzg2LDggQEAKIAkJLyogaW50ZXJydXB0LCBlcnJvciwgcG9ydCBjaGFuZ2UsIHJlc2V0LCBzbGVlcC9zdXNwZW5kICovCiAJCWh3X3dyaXRlKGNpLCBPUF9VU0JJTlRSLCB+MCwKIAkJCSAgICAgVVNCaV9VSXxVU0JpX1VFSXxVU0JpX1BDSXxVU0JpX1VSSXxVU0JpX1NMSSk7Ci0JCWh3X3dyaXRlKGNpLCBPUF9VU0JDTUQsIFVTQkNNRF9SUywgVVNCQ01EX1JTKTsKIAl9IGVsc2UgewogCQlod193cml0ZShjaSwgT1BfVVNCSU5UUiwgfjAsIDApOwotCQlod193cml0ZShjaSwgT1BfVVNCQ01ELCBVU0JDTURfUlMsIDApOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTUyMiw2ICs1MjAsMjAgQEAKIAlrZnJlZShwZW5kaW5nKTsKIH0KIAorc3RhdGljIGludCByZXByaW1lX2R0ZChzdHJ1Y3QgY2lfaGRyYyAqY2ksIHN0cnVjdCBjaV9od19lcCAqaHdlcCwKKwkJCQkJICAgc3RydWN0IHRkX25vZGUgKm5vZGUpCit7CisJaHdlcC0+cWgucHRyLT50ZC5uZXh0ID0gbm9kZS0+ZG1hOworCWh3ZXAtPnFoLnB0ci0+dGQudG9rZW4gJj0KKwkJY3B1X3RvX2xlMzIofihURF9TVEFUVVNfSEFMVEVEIHwgVERfU1RBVFVTX0FDVElWRSkpOworCisJLyogU3luY2hyb25pemUgYmVmb3JlIGVwIHByaW1lICovCisJd21iKCk7CisKKwlyZXR1cm4gaHdfZXBfcHJpbWUoY2ksIGh3ZXAtPm51bSwgaHdlcC0+ZGlyLAorCQkJCWh3ZXAtPnR5cGUgPT0gVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTCk7Cit9CisKIC8qKgogICogX2hhcmR3YXJlX2RlcXVldWU6IGhhbmRsZXMgYSByZXF1ZXN0IGF0IGhhcmR3YXJlIGxldmVsCiAgKiBAZ2FkZ2V0OiBnYWRnZXQKQEAgLTUzNSw2ICs1NDcsNyBAQAogCXN0cnVjdCB0ZF9ub2RlICpub2RlLCAqdG1wbm9kZTsKIAl1bnNpZ25lZCByZW1haW5pbmdfbGVuZ3RoOwogCXVuc2lnbmVkIGFjdHVhbCA9IGh3cmVxLT5yZXEubGVuZ3RoOworCXN0cnVjdCBjaV9oZHJjICpjaSA9IGh3ZXAtPmNpOwogCiAJaWYgKGh3cmVxLT5yZXEuc3RhdHVzICE9IC1FQUxSRUFEWSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01NDQsNiArNTU3LDExIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5vZGUsIHRtcG5vZGUsICZod3JlcS0+dGRzLCB0ZCkgewogCQl0bXB0b2tlbiA9IGxlMzJfdG9fY3B1KG5vZGUtPnB0ci0+dG9rZW4pOwogCQlpZiAoKFREX1NUQVRVU19BQ1RJVkUgJiB0bXB0b2tlbikgIT0gMCkgeworCQkJaW50IG4gPSBod19lcF9iaXQoaHdlcC0+bnVtLCBod2VwLT5kaXIpOworCisJCQlpZiAoY2ktPnJldiA9PSBDSV9SRVZJU0lPTl8yNCkKKwkJCQlpZiAoIWh3X3JlYWQoY2ksIE9QX0VORFBUU1RBVCwgQklUKG4pKSkKKwkJCQkJcmVwcmltZV9kdGQoY2ksIGh3ZXAsIG5vZGUpOwogCQkJaHdyZXEtPnJlcS5zdGF0dXMgPSAtRUFMUkVBRFk7CiAJCQlyZXR1cm4gLUVCVVNZOwogCQl9CkBAIC05MjksNiArOTQ3LDEzIEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAorc3RhdGljIGludCBvdGdfYV9hbHRfaG5wX3N1cHBvcnQoc3RydWN0IGNpX2hkcmMgKmNpKQoreworCWRldl93YXJuKCZjaS0+Z2FkZ2V0LmRldiwKKwkJImNvbm5lY3QgdGhlIGRldmljZSB0byBhbiBhbHRlcm5hdGUgcG9ydCBpZiB5b3Ugd2FudCBITlBcbiIpOworCXJldHVybiBpc3Jfc2V0dXBfc3RhdHVzX3BoYXNlKGNpKTsKK30KKwogLyoqCiAgKiBpc3Jfc2V0dXBfcGFja2V0X2hhbmRsZXI6IHNldHVwIHBhY2tldCBoYW5kbGVyCiAgKiBAY2k6IFVEQyBkZXNjcmlwdG9yCkBAIC0xMDYxLDYgKzEwODYsMTAgQEAKIAkJCQkJCQljaSk7CiAJCQkJfQogCQkJCWJyZWFrOworCQkJY2FzZSBVU0JfREVWSUNFX0FfQUxUX0hOUF9TVVBQT1JUOgorCQkJCWlmIChjaV9vdGdfaXNfZnNtX21vZGUoY2kpKQorCQkJCQllcnIgPSBvdGdfYV9hbHRfaG5wX3N1cHBvcnQoY2kpOworCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKIAkJCQlnb3RvIGRlbGVnYXRlOwogCQkJfQpAQCAtMTE1MSwxMCArMTE4MCwxMyBAQAogCiAJLyogb25seSBpbnRlcm5hbCBTVyBzaG91bGQgZW5hYmxlIGN0cmwgZW5kcHRzICovCiAKLQlod2VwLT5lcC5kZXNjID0gZGVzYzsKLQotCWlmICghbGlzdF9lbXB0eSgmaHdlcC0+cWgucXVldWUpKQorCWlmICghbGlzdF9lbXB0eSgmaHdlcC0+cWgucXVldWUpKSB7CiAJCWRldl93YXJuKGh3ZXAtPmNpLT5kZXYsICJlbmFibGluZyBhIG5vbi1lbXB0eSBlbmRwb2ludCFcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKGh3ZXAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlod2VwLT5lcC5kZXNjID0gZGVzYzsKIAogCWh3ZXAtPmRpciAgPSB1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpID8gVFggOiBSWDsKIAlod2VwLT5udW0gID0gdXNiX2VuZHBvaW50X251bShkZXNjKTsKQEAgLTE0NzQsNyArMTUwNiw5IEBACiAJCQlod19kZXZpY2VfcmVzZXQoY2kpOwogCQkJaHdfZGV2aWNlX3N0YXRlKGNpLCBjaS0+ZXAwb3V0LT5xaC5kbWEpOwogCQkJdXNiX2dhZGdldF9zZXRfc3RhdGUoX2dhZGdldCwgVVNCX1NUQVRFX1BPV0VSRUQpOworCQkJdXNiX3VkY192YnVzX2hhbmRsZXIoX2dhZGdldCwgdHJ1ZSk7CiAJCX0gZWxzZSB7CisJCQl1c2JfdWRjX3ZidXNfaGFuZGxlcihfZ2FkZ2V0LCBmYWxzZSk7CiAJCQlpZiAoY2ktPmRyaXZlcikKIAkJCQljaS0+ZHJpdmVyLT5kaXNjb25uZWN0KCZjaS0+Z2FkZ2V0KTsKIAkJCWh3X2RldmljZV9zdGF0ZShjaSwgMCk7CkBAIC0xNTQwLDEzICsxNTc0LDE2IEBACiB7CiAJc3RydWN0IGNpX2hkcmMgKmNpID0gY29udGFpbmVyX29mKF9nYWRnZXQsIHN0cnVjdCBjaV9oZHJjLCBnYWRnZXQpOwogCi0JaWYgKCFjaS0+dmJ1c19hY3RpdmUpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKKwkvKiBEYXRhKyBwdWxsdXAgY29udHJvbGxlZCBieSBPVEcgc3RhdGUgbWFjaGluZSBpbiBPVEcgZnNtIG1vZGUgKi8KKwlpZiAoY2lfb3RnX2lzX2ZzbV9tb2RlKGNpKSkKKwkJcmV0dXJuIDA7CiAKKwlwbV9ydW50aW1lX2dldF9zeW5jKCZjaS0+Z2FkZ2V0LmRldik7CiAJaWYgKGlzX29uKQogCQlod193cml0ZShjaSwgT1BfVVNCQ01ELCBVU0JDTURfUlMsIFVTQkNNRF9SUyk7CiAJZWxzZQogCQlod193cml0ZShjaSwgT1BfVVNCQ01ELCBVU0JDTURfUlMsIDApOworCXBtX3J1bnRpbWVfcHV0X3N5bmMoJmNpLT5nYWRnZXQuZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTY3Niw2ICsxNzEzLDcgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmNpLT5sb2NrLCBmbGFncyk7CiAJCWh3X2RldmljZV9yZXNldChjaSk7CiAJfSBlbHNlIHsKKwkJdXNiX3VkY192YnVzX2hhbmRsZXIoJmNpLT5nYWRnZXQsIGZhbHNlKTsKIAkJcG1fcnVudGltZV9wdXRfc3luYygmY2ktPmdhZGdldC5kZXYpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VzYm1pc2NfaW14LmMgYi9kcml2ZXJzL3VzYi9jaGlwaWRlYS91c2JtaXNjX2lteC5jCmluZGV4IGMzYzYyMjUuLjE0MDk0NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NoaXBpZGVhL3VzYm1pc2NfaW14LmMKKysrIGIvZHJpdmVycy91c2IvY2hpcGlkZWEvdXNibWlzY19pbXguYwpAQCAtMTEsNyArMTEsNiBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CkBAIC01Niw2ICs1NSwxOSBAQAogI2RlZmluZSBNWDUzX1VTQl9QTExfRElWXzI0X01IWgkJMHgwMQogCiAjZGVmaW5lIE1YNl9CTV9PVkVSX0NVUl9ESVMJCUJJVCg3KQorI2RlZmluZSBNWDZfQk1fV0FLRVVQX0VOQUJMRQkJQklUKDEwKQorI2RlZmluZSBNWDZfQk1fSURfV0FLRVVQCQlCSVQoMTYpCisjZGVmaW5lIE1YNl9CTV9WQlVTX1dBS0VVUAkJQklUKDE3KQorI2RlZmluZSBNWDZTWF9CTV9EUERNX1dBS0VVUF9FTgkJQklUKDI5KQorI2RlZmluZSBNWDZfQk1fV0FLRVVQX0lOVFIJCUJJVCgzMSkKKyNkZWZpbmUgTVg2X1VTQl9PVEcxX1BIWV9DVFJMCQkweDE4CisvKiBGb3IgaW14NmRxbCwgaXQgaXMgaG9zdC1vbmx5IGNvbnRyb2xsZXIsIGZvciBsYXRlciBpbXg2LCBpdCBpcyBvdGcncyAqLworI2RlZmluZSBNWDZfVVNCX09URzJfUEhZX0NUUkwJCTB4MWMKKyNkZWZpbmUgTVg2U1hfVVNCX1ZCVVNfV0FLRVVQX1NPVVJDRSh2KQkodiA8PCA4KQorI2RlZmluZSBNWDZTWF9VU0JfVkJVU19XQUtFVVBfU09VUkNFX1ZCVVMJTVg2U1hfVVNCX1ZCVVNfV0FLRVVQX1NPVVJDRSgwKQorI2RlZmluZSBNWDZTWF9VU0JfVkJVU19XQUtFVVBfU09VUkNFX0FWQUxJRAlNWDZTWF9VU0JfVkJVU19XQUtFVVBfU09VUkNFKDEpCisjZGVmaW5lIE1YNlNYX1VTQl9WQlVTX1dBS0VVUF9TT1VSQ0VfQlZBTElECU1YNlNYX1VTQl9WQlVTX1dBS0VVUF9TT1VSQ0UoMikKKyNkZWZpbmUgTVg2U1hfVVNCX1ZCVVNfV0FLRVVQX1NPVVJDRV9TRVNTX0VORAlNWDZTWF9VU0JfVkJVU19XQUtFVVBfU09VUkNFKDMpCiAKICNkZWZpbmUgVkY2MTBfT1ZFUl9DVVJfRElTCQlCSVQoNykKIApAQCAtNjQsMTIgKzc2LDEzIEBACiAJaW50ICgqaW5pdCkoc3RydWN0IGlteF91c2JtaXNjX2RhdGEgKmRhdGEpOwogCS8qIEl0J3MgY2FsbGVkIG9uY2UgYWZ0ZXIgYWRkaW5nIGEgdXNiIGRldmljZSAqLwogCWludCAoKnBvc3QpKHN0cnVjdCBpbXhfdXNibWlzY19kYXRhICpkYXRhKTsKKwkvKiBJdCdzIGNhbGxlZCB3aGVuIHdlIG5lZWQgdG8gZW5hYmxlL2Rpc2FibGUgdXNiIHdha2V1cCAqLworCWludCAoKnNldF93YWtldXApKHN0cnVjdCBpbXhfdXNibWlzY19kYXRhICpkYXRhLCBib29sIGVuYWJsZWQpOwogfTsKIAogc3RydWN0IGlteF91c2JtaXNjIHsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CiAJc3BpbmxvY2tfdCBsb2NrOwotCXN0cnVjdCBjbGsgKmNsazsKIAljb25zdCBzdHJ1Y3QgdXNibWlzY19vcHMgKm9wczsKIH07CiAKQEAgLTIwNCw2ICsyMTcsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB1c2JtaXNjX2lteDZxX3NldF93YWtldXAKKwkoc3RydWN0IGlteF91c2JtaXNjX2RhdGEgKmRhdGEsIGJvb2wgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgaW14X3VzYm1pc2MgKnVzYm1pc2MgPSBkZXZfZ2V0X2RydmRhdGEoZGF0YS0+ZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7CisJdTMyIHdha2V1cF9zZXR0aW5nID0gKE1YNl9CTV9XQUtFVVBfRU5BQkxFIHwKKwkJTVg2X0JNX1ZCVVNfV0FLRVVQIHwgTVg2X0JNX0lEX1dBS0VVUCk7CisJaW50IHJldCA9IDA7CisKKwlpZiAoZGF0YS0+aW5kZXggPiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1c2JtaXNjLT5sb2NrLCBmbGFncyk7CisJdmFsID0gcmVhZGwodXNibWlzYy0+YmFzZSArIGRhdGEtPmluZGV4ICogNCk7CisJaWYgKGVuYWJsZWQpIHsKKwkJdmFsIHw9IHdha2V1cF9zZXR0aW5nOworCQl3cml0ZWwodmFsLCB1c2JtaXNjLT5iYXNlICsgZGF0YS0+aW5kZXggKiA0KTsKKwl9IGVsc2UgeworCQlpZiAodmFsICYgTVg2X0JNX1dBS0VVUF9JTlRSKQorCQkJcHJfZGVidWcoIndha2V1cCBpbnQgYXQgY2lfaGRyYy4lZFxuIiwgZGF0YS0+aW5kZXgpOworCQl2YWwgJj0gfndha2V1cF9zZXR0aW5nOworCQl3cml0ZWwodmFsLCB1c2JtaXNjLT5iYXNlICsgZGF0YS0+aW5kZXggKiA0KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdXNibWlzYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCB1c2JtaXNjX2lteDZxX2luaXQoc3RydWN0IGlteF91c2JtaXNjX2RhdGEgKmRhdGEpCiB7CiAJc3RydWN0IGlteF91c2JtaXNjICp1c2JtaXNjID0gZGV2X2dldF9kcnZkYXRhKGRhdGEtPmRldik7CkBAIC0yMjEsNiArMjYzLDM2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVzYm1pc2MtPmxvY2ssIGZsYWdzKTsKIAl9CiAKKwl1c2JtaXNjX2lteDZxX3NldF93YWtldXAoZGF0YSwgZmFsc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNibWlzY19pbXg2c3hfaW5pdChzdHJ1Y3QgaW14X3VzYm1pc2NfZGF0YSAqZGF0YSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaW14X3VzYm1pc2MgKnVzYm1pc2MgPSBkZXZfZ2V0X2RydmRhdGEoZGF0YS0+ZGV2KTsKKwl1MzIgdmFsOworCisJdXNibWlzY19pbXg2cV9pbml0KGRhdGEpOworCisJaWYgKGRhdGEtPmluZGV4ID09IDAgfHwgZGF0YS0+aW5kZXggPT0gMSkgeworCQlyZWcgPSB1c2JtaXNjLT5iYXNlICsgTVg2X1VTQl9PVEcxX1BIWV9DVFJMICsgZGF0YS0+aW5kZXggKiA0OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdXNibWlzYy0+bG9jaywgZmxhZ3MpOworCQkvKiBTZXQgdmJ1cyB3YWtldXAgc291cmNlIGFzIGJ2YWxpZCAqLworCQl2YWwgPSByZWFkbChyZWcpOworCQl3cml0ZWwodmFsIHwgTVg2U1hfVVNCX1ZCVVNfV0FLRVVQX1NPVVJDRV9CVkFMSUQsIHJlZyk7CisJCS8qCisJCSAqIERpc2FibGUgZHAvZG0gd2FrZXVwIGluIGRldmljZSBtb2RlIHdoZW4gdmJ1cyBpcworCQkgKiBub3QgdGhlcmUuCisJCSAqLworCQl2YWwgPSByZWFkbCh1c2JtaXNjLT5iYXNlICsgZGF0YS0+aW5kZXggKiA0KTsKKwkJd3JpdGVsKHZhbCAmIH5NWDZTWF9CTV9EUERNX1dBS0VVUF9FTiwKKwkJCXVzYm1pc2MtPmJhc2UgKyBkYXRhLT5pbmRleCAqIDQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1c2JtaXNjLT5sb2NrLCBmbGFncyk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI1OCw2ICszMzAsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JtaXNjX29wcyBpbXg2cV91c2JtaXNjX29wcyA9IHsKKwkuc2V0X3dha2V1cCA9IHVzYm1pc2NfaW14NnFfc2V0X3dha2V1cCwKIAkuaW5pdCA9IHVzYm1pc2NfaW14NnFfaW5pdCwKIH07CiAKQEAgLTI2NSwxMCArMzM4LDE5IEBACiAJLmluaXQgPSB1c2JtaXNjX3ZmNjEwX2luaXQsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYm1pc2Nfb3BzIGlteDZzeF91c2JtaXNjX29wcyA9IHsKKwkuc2V0X3dha2V1cCA9IHVzYm1pc2NfaW14NnFfc2V0X3dha2V1cCwKKwkuaW5pdCA9IHVzYm1pc2NfaW14NnN4X2luaXQsCit9OworCiBpbnQgaW14X3VzYm1pc2NfaW5pdChzdHJ1Y3QgaW14X3VzYm1pc2NfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgaW14X3VzYm1pc2MgKnVzYm1pc2MgPSBkZXZfZ2V0X2RydmRhdGEoZGF0YS0+ZGV2KTsKKwlzdHJ1Y3QgaW14X3VzYm1pc2MgKnVzYm1pc2M7CiAKKwlpZiAoIWRhdGEpCisJCXJldHVybiAwOworCisJdXNibWlzYyA9IGRldl9nZXRfZHJ2ZGF0YShkYXRhLT5kZXYpOwogCWlmICghdXNibWlzYy0+b3BzLT5pbml0KQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gdXNibWlzYy0+b3BzLT5pbml0KGRhdGEpOwpAQCAtMjc3LDE0ICszNTksMzIgQEAKIAogaW50IGlteF91c2JtaXNjX2luaXRfcG9zdChzdHJ1Y3QgaW14X3VzYm1pc2NfZGF0YSAqZGF0YSkKIHsKLQlzdHJ1Y3QgaW14X3VzYm1pc2MgKnVzYm1pc2MgPSBkZXZfZ2V0X2RydmRhdGEoZGF0YS0+ZGV2KTsKKwlzdHJ1Y3QgaW14X3VzYm1pc2MgKnVzYm1pc2M7CiAKKwlpZiAoIWRhdGEpCisJCXJldHVybiAwOworCisJdXNibWlzYyA9IGRldl9nZXRfZHJ2ZGF0YShkYXRhLT5kZXYpOwogCWlmICghdXNibWlzYy0+b3BzLT5wb3N0KQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gdXNibWlzYy0+b3BzLT5wb3N0KGRhdGEpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaW14X3VzYm1pc2NfaW5pdF9wb3N0KTsKIAoraW50IGlteF91c2JtaXNjX3NldF93YWtldXAoc3RydWN0IGlteF91c2JtaXNjX2RhdGEgKmRhdGEsIGJvb2wgZW5hYmxlZCkKK3sKKwlzdHJ1Y3QgaW14X3VzYm1pc2MgKnVzYm1pc2M7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybiAwOworCisJdXNibWlzYyA9IGRldl9nZXRfZHJ2ZGF0YShkYXRhLT5kZXYpOworCWlmICghdXNibWlzYy0+b3BzLT5zZXRfd2FrZXVwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gdXNibWlzYy0+b3BzLT5zZXRfd2FrZXVwKGRhdGEsIGVuYWJsZWQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW14X3VzYm1pc2Nfc2V0X3dha2V1cCk7CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVzYm1pc2NfaW14X2R0X2lkc1tdID0gewogCXsKIAkJLmNvbXBhdGlibGUgPSAiZnNsLGlteDI1LXVzYm1pc2MiLApAQCAtMzE0LDYgKzQxNCwxMCBAQAogCQkuY29tcGF0aWJsZSA9ICJmc2wsdmY2MTAtdXNibWlzYyIsCiAJCS5kYXRhID0gJnZmNjEwX3VzYm1pc2Nfb3BzLAogCX0sCisJeworCQkuY29tcGF0aWJsZSA9ICJmc2wsaW14NnN4LXVzYm1pc2MiLAorCQkuZGF0YSA9ICZpbXg2c3hfdXNibWlzY19vcHMsCisJfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB1c2JtaXNjX2lteF9kdF9pZHMpOwpAQCAtMzIyLDcgKzQyNiw2IEBACiB7CiAJc3RydWN0IHJlc291cmNlCSpyZXM7CiAJc3RydWN0IGlteF91c2JtaXNjICpkYXRhOwotCWludCByZXQ7CiAJc3RydWN0IG9mX2RldmljZV9pZCAqdG1wX2RldjsKIAogCWRhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CkBAIC0zMzYsMjAgKzQzOSw2IEBACiAJaWYgKElTX0VSUihkYXRhLT5iYXNlKSkKIAkJcmV0dXJuIFBUUl9FUlIoZGF0YS0+YmFzZSk7CiAKLQlkYXRhLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7Ci0JaWYgKElTX0VSUihkYXRhLT5jbGspKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJmYWlsZWQgdG8gZ2V0IGNsb2NrLCBlcnI9JWxkXG4iLCBQVFJfRVJSKGRhdGEtPmNsaykpOwotCQlyZXR1cm4gUFRSX0VSUihkYXRhLT5jbGspOwotCX0KLQotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYXRhLT5jbGspOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LAotCQkJImNsa19wcmVwYXJlX2VuYWJsZSBmYWlsZWQsIGVycj0lZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAl0bXBfZGV2ID0gKHN0cnVjdCBvZl9kZXZpY2VfaWQgKikKIAkJb2ZfbWF0Y2hfZGV2aWNlKHVzYm1pc2NfaW14X2R0X2lkcywgJnBkZXYtPmRldik7CiAJZGF0YS0+b3BzID0gKGNvbnN0IHN0cnVjdCB1c2JtaXNjX29wcyAqKXRtcF9kZXYtPmRhdGE7CkBAIC0zNjAsOCArNDQ5LDYgQEAKIAogc3RhdGljIGludCB1c2JtaXNjX2lteF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgaW14X3VzYm1pc2MgKnVzYm1pc2MgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHVzYm1pc2MtPmNsayk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwppbmRleCA2ODM2MTc3Li4zZTE1YWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKKysrIGIvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCkBAIC0zNjAsNyArMzYwLDcgQEAKIAl9CiBleGl0OgogCXJldHZhbCA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7Ci0JaWYgKHJldHZhbCkKKwlpZiAocmV0dmFsICYmIHJldHZhbCAhPSAtRVBFUk0pCiAJCWRldl9lcnIoJmFjbS0+Y29udHJvbC0+ZGV2LCAiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQ6ICVkXG4iLAogCQkJCQkJCV9fZnVuY19fLCByZXR2YWwpOwogfQpAQCAtNDE3LDI1ICs0MTcsMzMgQEAKIAlzdHJ1Y3QgYWNtX3JiICpyYiA9IHVyYi0+Y29udGV4dDsKIAlzdHJ1Y3QgYWNtICphY20gPSByYi0+aW5zdGFuY2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CiAKIAlkZXZfdmRiZygmYWNtLT5kYXRhLT5kZXYsICIlcyAtIHVyYiAlZCwgbGVuICVkXG4iLCBfX2Z1bmNfXywKIAkJCQkJcmItPmluZGV4LCB1cmItPmFjdHVhbF9sZW5ndGgpOwotCXNldF9iaXQocmItPmluZGV4LCAmYWNtLT5yZWFkX3VyYnNfZnJlZSk7CiAKIAlpZiAoIWFjbS0+ZGV2KSB7CisJCXNldF9iaXQocmItPmluZGV4LCAmYWNtLT5yZWFkX3VyYnNfZnJlZSk7CiAJCWRldl9kYmcoJmFjbS0+ZGF0YS0+ZGV2LCAiJXMgLSBkaXNjb25uZWN0ZWRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmICh1cmItPnN0YXR1cykgeworCWlmIChzdGF0dXMpIHsKKwkJc2V0X2JpdChyYi0+aW5kZXgsICZhY20tPnJlYWRfdXJic19mcmVlKTsKIAkJZGV2X2RiZygmYWNtLT5kYXRhLT5kZXYsICIlcyAtIG5vbi16ZXJvIHVyYiBzdGF0dXM6ICVkXG4iLAotCQkJCQkJCV9fZnVuY19fLCB1cmItPnN0YXR1cyk7CisJCQkJCQkJX19mdW5jX18sIHN0YXR1cyk7CiAJCXJldHVybjsKIAl9CiAKIAl1c2JfbWFya19sYXN0X2J1c3koYWNtLT5kZXYpOwogCiAJYWNtX3Byb2Nlc3NfcmVhZF91cmIoYWNtLCB1cmIpOworCS8qCisJICogVW50aHJvdHRsZSBtYXkgcnVuIG9uIGFub3RoZXIgQ1BVIHdoaWNoIG5lZWRzIHRvIHNlZSBldmVudHMKKwkgKiBpbiB0aGUgc2FtZSBvcmRlci4gU3VibWlzc2lvbiBoYXMgYW4gaW1wbGljdCBiYXJyaWVyCisJICovCisJc21wX21iX19iZWZvcmVfYXRvbWljKCk7CisJc2V0X2JpdChyYi0+aW5kZXgsICZhY20tPnJlYWRfdXJic19mcmVlKTsKIAogCS8qIHRocm90dGxlIGRldmljZSBpZiByZXF1ZXN0ZWQgYnkgdHR5ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmFjbS0+cmVhZF9sb2NrLCBmbGFncyk7CkBAIC00NTQsMTMgKzQ2MiwxNCBAQAogCXN0cnVjdCBhY21fd2IgKndiID0gdXJiLT5jb250ZXh0OwogCXN0cnVjdCBhY20gKmFjbSA9IHdiLT5pbnN0YW5jZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGF0dXMgPSB1cmItPnN0YXR1czsKIAotCWlmICh1cmItPnN0YXR1cwl8fCAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCkpCisJaWYgKHN0YXR1cyB8fCAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IHVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCkpCiAJCWRldl92ZGJnKCZhY20tPmRhdGEtPmRldiwgIiVzIC0gbGVuICVkLyVkLCBzdGF0dXMgJWRcbiIsCiAJCQlfX2Z1bmNfXywKIAkJCXVyYi0+YWN0dWFsX2xlbmd0aCwKIAkJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKLQkJCXVyYi0+c3RhdHVzKTsKKwkJCXN0YXR1cyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYWNtLT53cml0ZV9sb2NrLCBmbGFncyk7CiAJYWNtX3dyaXRlX2RvbmUoYWNtLCB3Yik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtd2RtLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtd2RtLmMKaW5kZXggYTA1MWE3YS4uNjFlYTg3OSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLXdkbS5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy13ZG0uYwpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJY2FzZSBVU0JfQ0RDX05PVElGWV9SRVNQT05TRV9BVkFJTEFCTEU6CiAJCWRldl9kYmcoJmRlc2MtPmludGYtPmRldiwKIAkJCSJOT1RJRllfUkVTUE9OU0VfQVZBSUxBQkxFIHJlY2VpdmVkOiBpbmRleCAlZCBsZW4gJWQiLAotCQkJZHItPndJbmRleCwgZHItPndMZW5ndGgpOworCQkJbGUxNl90b19jcHUoZHItPndJbmRleCksIGxlMTZfdG9fY3B1KGRyLT53TGVuZ3RoKSk7CiAJCWJyZWFrOwogCiAJY2FzZSBVU0JfQ0RDX05PVElGWV9ORVRXT1JLX0NPTk5FQ1RJT046CkBAIC0yNjIsNyArMjYyLDkgQEAKIAkJY2xlYXJfYml0KFdETV9QT0xMX1JVTk5JTkcsICZkZXNjLT5mbGFncyk7CiAJCWRldl9lcnIoJmRlc2MtPmludGYtPmRldiwKIAkJCSJ1bmtub3duIG5vdGlmaWNhdGlvbiAlZCByZWNlaXZlZDogaW5kZXggJWQgbGVuICVkXG4iLAotCQkJZHItPmJOb3RpZmljYXRpb25UeXBlLCBkci0+d0luZGV4LCBkci0+d0xlbmd0aCk7CisJCQlkci0+Yk5vdGlmaWNhdGlvblR5cGUsCisJCQlsZTE2X3RvX2NwdShkci0+d0luZGV4KSwKKwkJCWxlMTZfdG9fY3B1KGRyLT53TGVuZ3RoKSk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTMzOSw3ICszNDEsNyBAQAogCWRlc2MtPndlcnIgPSAwOwogCXNwaW5fdW5sb2NrX2lycSgmZGVzYy0+aXVzcGluKTsKIAlpZiAod2UgPCAwKQotCQlyZXR1cm4gLUVJTzsKKwkJcmV0dXJuIHVzYl90cmFuc2xhdGVfZXJyb3JzKHdlKTsKIAogCWJ1ZiA9IGttYWxsb2MoY291bnQsIEdGUF9LRVJORUwpOwogCWlmICghYnVmKSB7CkBAIC0zNDksMzAgKzM1MSwyNSBAQAogCiAJciA9IGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBjb3VudCk7CiAJaWYgKHIgPiAwKSB7Ci0JCWtmcmVlKGJ1Zik7CiAJCXJ2ID0gLUVGQVVMVDsKLQkJZ290byBvdXRubDsKKwkJZ290byBvdXRfZnJlZV9tZW07CiAJfQogCiAJLyogY29uY3VycmVudCB3cml0ZXMgYW5kIGRpc2Nvbm5lY3QgKi8KIAlyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXNjLT53bG9jayk7CiAJcnYgPSAtRVJFU1RBUlRTWVM7Ci0JaWYgKHIpIHsKLQkJa2ZyZWUoYnVmKTsKLQkJZ290byBvdXRubDsKLQl9CisJaWYgKHIpCisJCWdvdG8gb3V0X2ZyZWVfbWVtOwogCiAJaWYgKHRlc3RfYml0KFdETV9ESVNDT05ORUNUSU5HLCAmZGVzYy0+ZmxhZ3MpKSB7Ci0JCWtmcmVlKGJ1Zik7CiAJCXJ2ID0gLUVOT0RFVjsKLQkJZ290byBvdXRucDsKKwkJZ290byBvdXRfZnJlZV9tZW1fbG9jazsKIAl9CiAKIAlyID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGRlc2MtPmludGYpOwogCWlmIChyIDwgMCkgewotCQlrZnJlZShidWYpOwogCQlydiA9IHVzYl90cmFuc2xhdGVfZXJyb3JzKHIpOwotCQlnb3RvIG91dG5wOworCQlnb3RvIG91dF9mcmVlX21lbV9sb2NrOwogCX0KIAogCWlmICghKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKQEAgLTM4Niw5ICszODMsOCBAQAogCQlyID0gLUVJTzsKIAogCWlmIChyIDwgMCkgewotCQlrZnJlZShidWYpOwogCQlydiA9IHI7Ci0JCWdvdG8gb3V0OworCQlnb3RvIG91dF9mcmVlX21lbV9wbTsKIAl9CiAKIAlyZXEgPSBkZXNjLT5vcnE7CkBAIC00MDgsMjggKzQwNCwzNSBAQAogCQkJICAgICBVU0JfUkVDSVBfSU5URVJGQUNFKTsKIAlyZXEtPmJSZXF1ZXN0ID0gVVNCX0NEQ19TRU5EX0VOQ0FQU1VMQVRFRF9DT01NQU5EOwogCXJlcS0+d1ZhbHVlID0gMDsKLQlyZXEtPndJbmRleCA9IGRlc2MtPmludW07CisJcmVxLT53SW5kZXggPSBkZXNjLT5pbnVtOyAvKiBhbHJlYWR5IGNvbnZlcnRlZCAqLwogCXJlcS0+d0xlbmd0aCA9IGNwdV90b19sZTE2KGNvdW50KTsKIAlzZXRfYml0KFdETV9JTl9VU0UsICZkZXNjLT5mbGFncyk7CiAJZGVzYy0+b3V0YnVmID0gYnVmOwogCiAJcnYgPSB1c2Jfc3VibWl0X3VyYihkZXNjLT5jb21tYW5kLCBHRlBfS0VSTkVMKTsKIAlpZiAocnYgPCAwKSB7Ci0JCWtmcmVlKGJ1Zik7CiAJCWRlc2MtPm91dGJ1ZiA9IE5VTEw7CiAJCWNsZWFyX2JpdChXRE1fSU5fVVNFLCAmZGVzYy0+ZmxhZ3MpOwogCQlkZXZfZXJyKCZkZXNjLT5pbnRmLT5kZXYsICJUeCBVUkIgZXJyb3I6ICVkXG4iLCBydik7CiAJCXJ2ID0gdXNiX3RyYW5zbGF0ZV9lcnJvcnMocnYpOworCQlnb3RvIG91dF9mcmVlX21lbV9wbTsKIAl9IGVsc2UgewogCQlkZXZfZGJnKCZkZXNjLT5pbnRmLT5kZXYsICJUeCBVUkIgaGFzIGJlZW4gc3VibWl0dGVkIGluZGV4PSVkIiwKLQkJCXJlcS0+d0luZGV4KTsKKwkJCWxlMTZfdG9fY3B1KHJlcS0+d0luZGV4KSk7CiAJfQotb3V0OgorCiAJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKGRlc2MtPmludGYpOwotb3V0bnA6CiAJbXV0ZXhfdW5sb2NrKCZkZXNjLT53bG9jayk7CiBvdXRubDoKIAlyZXR1cm4gcnYgPCAwID8gcnYgOiBjb3VudDsKKworb3V0X2ZyZWVfbWVtX3BtOgorCXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZShkZXNjLT5pbnRmKTsKK291dF9mcmVlX21lbV9sb2NrOgorCW11dGV4X3VubG9jaygmZGVzYy0+d2xvY2spOworb3V0X2ZyZWVfbWVtOgorCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJ2OwogfQogCiAvKgpAQCAtNTE5LDkgKzUyMiw5IEBACiAJCXNwaW5fbG9ja19pcnEoJmRlc2MtPml1c3Bpbik7CiAKIAkJaWYgKGRlc2MtPnJlcnIpIHsgLyogcmVhZCBjb21wbGV0ZWQsIGVycm9yIGhhcHBlbmVkICovCisJCQlydiA9IHVzYl90cmFuc2xhdGVfZXJyb3JzKGRlc2MtPnJlcnIpOwogCQkJZGVzYy0+cmVyciA9IDA7CiAJCQlzcGluX3VubG9ja19pcnEoJmRlc2MtPml1c3Bpbik7Ci0JCQlydiA9IC1FSU87CiAJCQlnb3RvIGVycjsKIAkJfQogCQkvKgpAQCAtODIwLDcgKzgyMyw3IEBACiAJZGVzYy0+aXJxLT5iUmVxdWVzdFR5cGUgPSAoVVNCX0RJUl9JTiB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSk7CiAJZGVzYy0+aXJxLT5iUmVxdWVzdCA9IFVTQl9DRENfR0VUX0VOQ0FQU1VMQVRFRF9SRVNQT05TRTsKIAlkZXNjLT5pcnEtPndWYWx1ZSA9IDA7Ci0JZGVzYy0+aXJxLT53SW5kZXggPSBkZXNjLT5pbnVtOworCWRlc2MtPmlycS0+d0luZGV4ID0gZGVzYy0+aW51bTsgLyogYWxyZWFkeSBjb252ZXJ0ZWQgKi8KIAlkZXNjLT5pcnEtPndMZW5ndGggPSBjcHVfdG9fbGUxNihkZXNjLT53TWF4Q29tbWFuZCk7CiAKIAl1c2JfZmlsbF9jb250cm9sX3VyYigKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvbW1vbi91c2Itb3RnLWZzbS5jIGIvZHJpdmVycy91c2IvY29tbW9uL3VzYi1vdGctZnNtLmMKaW5kZXggYzZiMzViNy4uNjFkNTM4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY29tbW9uL3VzYi1vdGctZnNtLmMKKysrIGIvZHJpdmVycy91c2IvY29tbW9uL3VzYi1vdGctZnNtLmMKQEAgLTE1MCw5ICsxNTAsOSBAQAogCQlicmVhazsKIAljYXNlIE9UR19TVEFURV9CX1BFUklQSEVSQUw6CiAJCW90Z19jaHJnX3ZidXMoZnNtLCAwKTsKLQkJb3RnX2xvY19jb25uKGZzbSwgMSk7CiAJCW90Z19sb2Nfc29mKGZzbSwgMCk7CiAJCW90Z19zZXRfcHJvdG9jb2woZnNtLCBQUk9UT19HQURHRVQpOworCQlvdGdfbG9jX2Nvbm4oZnNtLCAxKTsKIAkJYnJlYWs7CiAJY2FzZSBPVEdfU1RBVEVfQl9XQUlUX0FDT046CiAJCW90Z19jaHJnX3ZidXMoZnNtLCAwKTsKQEAgLTIxMywxMCArMjEzLDEwIEBACiAKIAkJYnJlYWs7CiAJY2FzZSBPVEdfU1RBVEVfQV9QRVJJUEhFUkFMOgotCQlvdGdfbG9jX2Nvbm4oZnNtLCAxKTsKIAkJb3RnX2xvY19zb2YoZnNtLCAwKTsKIAkJb3RnX3NldF9wcm90b2NvbChmc20sIFBST1RPX0dBREdFVCk7CiAJCW90Z19kcnZfdmJ1cyhmc20sIDEpOworCQlvdGdfbG9jX2Nvbm4oZnNtLCAxKTsKIAkJb3RnX2FkZF90aW1lcihmc20sIEFfQklETF9BRElTKTsKIAkJYnJlYWs7CiAJY2FzZSBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvY29yZS9kZXZpby5jIGIvZHJpdmVycy91c2IvY29yZS9kZXZpby5jCmluZGV4IDExNjM1NTMuLjRiMDQ0OGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvZGV2aW8uYworKysgYi9kcml2ZXJzL3VzYi9jb3JlL2RldmlvLmMKQEAgLTI0MDgsNyArMjQwOCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdXNiZGV2X25iID0gewotCS5ub3RpZmllcl9jYWxsID0gCXVzYmRldl9ub3RpZnksCisJLm5vdGlmaWVyX2NhbGwgPQl1c2JkZXZfbm90aWZ5LAogfTsKIAogc3RhdGljIHN0cnVjdCBjZGV2IHVzYl9kZXZpY2VfY2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMgYi9kcml2ZXJzL3VzYi9jb3JlL2h1Yi5jCmluZGV4IGQ3YzNkNWEuLjNiNzE1MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvaHViLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS9odWIuYwpAQCAtMzQwNiwxMCArMzQwNiwxMCBAQAogCWlmIChzdGF0dXMpIHsKIAkJZGV2X2RiZygmcG9ydF9kZXYtPmRldiwgImNhbid0IHJlc3VtZSwgc3RhdHVzICVkXG4iLCBzdGF0dXMpOwogCX0gZWxzZSB7Ci0JCS8qIGRyaXZlIHJlc3VtZSBmb3IgYXQgbGVhc3QgMjAgbXNlYyAqLworCQkvKiBkcml2ZSByZXN1bWUgZm9yIFVTQl9SRVNVTUVfVElNRU9VVCBtc2VjICovCiAJCWRldl9kYmcoJnVkZXYtPmRldiwgInVzYiAlc3Jlc3VtZVxuIiwKIAkJCQkoUE1TR19JU19BVVRPKG1zZykgPyAiYXV0by0iIDogIiIpKTsKLQkJbXNsZWVwKDI1KTsKKwkJbXNsZWVwKFVTQl9SRVNVTUVfVElNRU9VVCk7CiAKIAkJLyogVmlydHVhbCByb290IGh1YnMgY2FuIHRyaWdnZXIgb24gR0VUX1BPUlRfU1RBVFVTIHRvCiAJCSAqIHN0b3AgcmVzdW1lIHNpZ25hbGluZy4gIFRoZW4gZmluaXNoIHRoZSByZXN1bWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMgYi9kcml2ZXJzL3VzYi9jb3JlL3VzYi5jCmluZGV4IGIxZmI5YWUuLjhkNWIyZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2NvcmUvdXNiLmMKKysrIGIvZHJpdmVycy91c2IvY29yZS91c2IuYwpAQCAtNDksNiArNDksMjIgQEAKIAogc3RhdGljIGJvb2wgbm91c2I7CS8qIERpc2FibGUgVVNCIHdoZW4gYnVpbHQgaW50byBrZXJuZWwgaW1hZ2UgKi8KIAorLyogVG8gZGlzYWJsZSBVU0IsIGtlcm5lbCBjb21tYW5kIGxpbmUgaXMgJ25vdXNiJyBub3QgJ3VzYmNvcmUubm91c2InICovCisjaWZkZWYgTU9EVUxFCittb2R1bGVfcGFyYW0obm91c2IsIGJvb2wsIDA0NDQpOworI2Vsc2UKK2NvcmVfcGFyYW0obm91c2IsIG5vdXNiLCBib29sLCAwNDQ0KTsKKyNlbmRpZgorCisvKgorICogZm9yIGV4dGVybmFsIHJlYWQgYWNjZXNzIHRvIDxub3VzYj4KKyAqLworaW50IHVzYl9kaXNhYmxlZCh2b2lkKQoreworCXJldHVybiBub3VzYjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVzYl9kaXNhYmxlZCk7CisKICNpZmRlZglDT05GSUdfUE0KIHN0YXRpYyBpbnQgdXNiX2F1dG9zdXNwZW5kX2RlbGF5ID0gMjsJCS8qIERlZmF1bHQgZGVsYXkgdmFsdWUsCiAJCQkJCQkgKiBpbiBzZWNvbmRzICovCkBAIC05NjQsMjIgKzk4MCw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTCh1c2JfYnVmZmVyX3VubWFwX3NnKTsKICNlbmRpZgogCi0vKiBUbyBkaXNhYmxlIFVTQiwga2VybmVsIGNvbW1hbmQgbGluZSBpcyAnbm91c2InIG5vdCAndXNiY29yZS5ub3VzYicgKi8KLSNpZmRlZiBNT0RVTEUKLW1vZHVsZV9wYXJhbShub3VzYiwgYm9vbCwgMDQ0NCk7Ci0jZWxzZQotY29yZV9wYXJhbShub3VzYiwgbm91c2IsIGJvb2wsIDA0NDQpOwotI2VuZGlmCi0KLS8qCi0gKiBmb3IgZXh0ZXJuYWwgcmVhZCBhY2Nlc3MgdG8gPG5vdXNiPgotICovCi1pbnQgdXNiX2Rpc2FibGVkKHZvaWQpCi17Ci0JcmV0dXJuIG5vdXNiOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodXNiX2Rpc2FibGVkKTsKLQogLyoKICAqIE5vdGlmaWNhdGlvbnMgb2YgZGV2aWNlIGFuZCBpbnRlcmZhY2UgcmVnaXN0cmF0aW9uCiAgKi8KQEAgLTEwNDUsNyArMTA0NSw3IEBACiBzdGF0aWMgaW50IF9faW5pdCB1c2JfaW5pdCh2b2lkKQogewogCWludCByZXR2YWw7Ci0JaWYgKG5vdXNiKSB7CisJaWYgKHVzYl9kaXNhYmxlZCgpKSB7CiAJCXByX2luZm8oIiVzOiBVU0Igc3VwcG9ydCBkaXNhYmxlZFxuIiwgdXNiY29yZV9uYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTEwMiw3ICsxMTAyLDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCB1c2JfZXhpdCh2b2lkKQogewogCS8qIFRoaXMgd2lsbCBtYXR0ZXIgaWYgc2h1dGRvd24vcmVib290IGRvZXMgZXhpdGNhbGxzLiAqLwotCWlmIChub3VzYikKKwlpZiAodXNiX2Rpc2FibGVkKCkpCiAJCXJldHVybjsKIAogCXVzYl9kZXJlZ2lzdGVyX2RldmljZV9kcml2ZXIoJnVzYl9nZW5lcmljX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL0tjb25maWcgYi9kcml2ZXJzL3VzYi9kd2MyL0tjb25maWcKaW5kZXggNzZiOWJhNC4uMWJjYjM2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMi9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIvS2NvbmZpZwpAQCAtNTksMTEgKzU5LDEzIEBACiAKIGNvbmZpZyBVU0JfRFdDMl9QQ0kKIAl0cmlzdGF0ZSAiRFdDMiBQQ0kiCi0JZGVwZW5kcyBvbiBVU0JfRFdDMl9IT1NUICYmIFBDSQotCWRlZmF1bHQgVVNCX0RXQzJfSE9TVAorCWRlcGVuZHMgb24gUENJCisJZGVmYXVsdCBuCisJc2VsZWN0IFVTQl9EV0MyX1BMQVRGT1JNCisJc2VsZWN0IE5PUF9VU0JfWENFSVYKIAloZWxwCiAJICBUaGUgRGVzaWdud2FyZSBVU0IyLjAgUENJIGludGVyZmFjZSBtb2R1bGUgZm9yIGNvbnRyb2xsZXJzCi0JICBjb25uZWN0ZWQgdG8gYSBQQ0kgYnVzLiBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgaG9zdCBtb2RlLgorCSAgY29ubmVjdGVkIHRvIGEgUENJIGJ1cy4KIAogY29uZmlnIFVTQl9EV0MyX0RFQlVHCiAJYm9vbCAiRW5hYmxlIERlYnVnZ2luZyBNZXNzYWdlcyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9kd2MyL01ha2VmaWxlCmluZGV4IDhmNzUyNjcuLmYwN2I0MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvZHdjMi9NYWtlZmlsZQpAQCAtMTksMTAgKzE5LDggQEAKICMgbW9kZS4gVGhlIFBDSSBidXMgaW50ZXJmYWNlIG1vZHVsZSB3aWxsIGNhbGxlZCBkd2MyX3BjaS5rbyBhbmQgdGhlIHBsYXRmb3JtCiAjIGludGVyZmFjZSBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHdjMl9wbGF0Zm9ybS5rby4KIAotaWZuZXEgKCQoQ09ORklHX1VTQl9EV0MyX1BDSSksKQotCW9iai0kKENPTkZJR19VU0JfRFdDMikJCSs9IGR3YzJfcGNpLm8KLQlkd2MyX3BjaS15CQkJOj0gcGNpLm8KLWVuZGlmCitvYmotJChDT05GSUdfVVNCX0RXQzJfUENJKQkJKz0gZHdjMl9wY2kubworZHdjMl9wY2kteQkJCQk6PSBwY2kubwogCiBvYmotJChDT05GSUdfVVNCX0RXQzJfUExBVEZPUk0pCQkrPSBkd2MyX3BsYXRmb3JtLm8KIGR3YzJfcGxhdGZvcm0teQkJCQk6PSBwbGF0Zm9ybS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL2NvcmUuaCBiL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5oCmluZGV4IGY3NDMwNGIuLjgzNmMwMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5oCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIvY29yZS5oCkBAIC01OTMsNiArNTkzLDggQEAKIAlzdHJ1Y3QgZHdjMl9jb3JlX3BhcmFtcyAqY29yZV9wYXJhbXM7CiAJZW51bSB1c2Jfb3RnX3N0YXRlIG9wX3N0YXRlOwogCWVudW0gdXNiX2RyX21vZGUgZHJfbW9kZTsKKwl1bnNpZ25lZCBpbnQgaGNkX2VuYWJsZWQ6MTsKKwl1bnNpZ25lZCBpbnQgZ2FkZ2V0X2VuYWJsZWQ6MTsKIAogCXN0cnVjdCBwaHkgKnBoeTsKIAlzdHJ1Y3QgdXNiX3BoeSAqdXBoeTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZV9pbnRyLmMgYi9kcml2ZXJzL3VzYi9kd2MyL2NvcmVfaW50ci5jCmluZGV4IDAyZTNlMmQuLjZjZjA0NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvY29yZV9pbnRyLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMi9jb3JlX2ludHIuYwpAQCAtMzc3LDYgKzM3Nyw5IEBACiAJCWR3YzJfaXNfaG9zdF9tb2RlKGhzb3RnKSA/ICJIb3N0IiA6ICJEZXZpY2UiLAogCQlkd2MyX29wX3N0YXRlX3N0cihoc290ZykpOwogCisJaWYgKGhzb3RnLT5vcF9zdGF0ZSA9PSBPVEdfU1RBVEVfQV9IT1NUKQorCQlkd2MyX2hjZF9kaXNjb25uZWN0KGhzb3RnKTsKKwogCS8qIENoYW5nZSB0byBMMyAoT0ZGKSBzdGF0ZSAqLwogCWhzb3RnLT5seF9zdGF0ZSA9IERXQzJfTDM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvaGNkLmMgYi9kcml2ZXJzL3VzYi9kd2MyL2hjZC5jCmluZGV4IGM3OGM4NzQuLmZiYmJhYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvaGNkLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMi9oY2QuYwpAQCAtMjU3LDYgKzI1NywxNCBAQAogCQkgKi8KIAkJY2hhbm5lbC0+cWggPSBOVUxMOwogCX0KKwkvKiBBbGwgY2hhbm5lbHMgaGF2ZSBiZWVuIGZyZWVkLCBtYXJrIHRoZW0gYXZhaWxhYmxlICovCisJaWYgKGhzb3RnLT5jb3JlX3BhcmFtcy0+dWZyYW1lX3NjaGVkID4gMCkgeworCQloc290Zy0+YXZhaWxhYmxlX2hvc3RfY2hhbm5lbHMgPQorCQkJaHNvdGctPmNvcmVfcGFyYW1zLT5ob3N0X2NoYW5uZWxzOworCX0gZWxzZSB7CisJCWhzb3RnLT5ub25fcGVyaW9kaWNfY2hhbm5lbHMgPSAwOworCQloc290Zy0+cGVyaW9kaWNfY2hhbm5lbHMgPSAwOworCX0KIH0KIAogLyoqCkBAIC0xNTI3LDcgKzE1MzUsNyBAQAogCQkJaHBydDAgfD0gSFBSVDBfUkVTOwogCQkJd3JpdGVsKGhwcnQwLCBoc290Zy0+cmVncyArIEhQUlQwKTsKIAkJCWhwcnQwICY9IH5IUFJUMF9TVVNQOwotCQkJdXNsZWVwX3JhbmdlKDEwMDAwMCwgMTUwMDAwKTsKKwkJCW1zbGVlcChVU0JfUkVTVU1FX1RJTUVPVVQpOwogCiAJCQlocHJ0MCAmPSB+SFBSVDBfUkVTOwogCQkJd3JpdGVsKGhwcnQwLCBoc290Zy0+cmVncyArIEhQUlQwKTsKQEAgLTE2MDgsNyArMTYxNiw3IEBACiAJCWRldl9kYmcoaHNvdGctPmRldiwgIkdldEh1YkRlc2NyaXB0b3JcbiIpOwogCQlodWJfZGVzYyA9IChzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yICopYnVmOwogCQlodWJfZGVzYy0+YkRlc2NMZW5ndGggPSA5OwotCQlodWJfZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsKKwkJaHViX2Rlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9IVUI7CiAJCWh1Yl9kZXNjLT5iTmJyUG9ydHMgPSAxOwogCQlodWJfZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9CiAJCQljcHVfdG9fbGUxNihIVUJfQ0hBUl9DT01NT05fTFBTTSB8CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL3BjaS5jIGIvZHJpdmVycy91c2IvZHdjMi9wY2kuYwppbmRleCBhNGU3MjRiLi5hZTQxOTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MyL3BjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIvcGNpLmMKQEAgLTUwLDExMyArNTAsOTcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvY2gxMS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi91c2JfcGh5X2dlbmVyaWMuaD4KIAotI2luY2x1ZGUgImNvcmUuaCIKLSNpbmNsdWRlICJoY2QuaCIKLQotI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NZTk9QU1lTCQkweDE2YzMKICNkZWZpbmUgUENJX1BST0RVQ1RfSURfSEFQU19IU09URwkweGFiYzAKIAotc3RhdGljIGNvbnN0IGNoYXIgZHdjMl9kcml2ZXJfbmFtZVtdID0gImR3YzIiOworc3RhdGljIGNvbnN0IGNoYXIgZHdjMl9kcml2ZXJfbmFtZVtdID0gImR3YzItcGNpIjsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBkd2MyX2NvcmVfcGFyYW1zIGR3YzJfbW9kdWxlX3BhcmFtcyA9IHsKLQkub3RnX2NhcAkJCT0gLTEsCi0JLm90Z192ZXIJCQk9IC0xLAotCS5kbWFfZW5hYmxlCQkJPSAtMSwKLQkuZG1hX2Rlc2NfZW5hYmxlCQk9IDAsCi0JLnNwZWVkCQkJCT0gLTEsCi0JLmVuYWJsZV9keW5hbWljX2ZpZm8JCT0gLTEsCi0JLmVuX211bHRpcGxlX3R4X2ZpZm8JCT0gLTEsCi0JLmhvc3RfcnhfZmlmb19zaXplCQk9IDEwMjQsCi0JLmhvc3RfbnBlcmlvX3R4X2ZpZm9fc2l6ZQk9IDI1NiwKLQkuaG9zdF9wZXJpb190eF9maWZvX3NpemUJPSAxMDI0LAotCS5tYXhfdHJhbnNmZXJfc2l6ZQkJPSA2NTUzNSwKLQkubWF4X3BhY2tldF9jb3VudAkJPSA1MTEsCi0JLmhvc3RfY2hhbm5lbHMJCQk9IC0xLAotCS5waHlfdHlwZQkJCT0gLTEsCi0JLnBoeV91dG1pX3dpZHRoCQkJPSAtMSwKLQkucGh5X3VscGlfZGRyCQkJPSAtMSwKLQkucGh5X3VscGlfZXh0X3ZidXMJCT0gLTEsCi0JLmkyY19lbmFibGUJCQk9IC0xLAotCS51bHBpX2ZzX2xzCQkJPSAtMSwKLQkuaG9zdF9zdXBwb3J0X2ZzX2xzX2xvd19wb3dlcgk9IC0xLAotCS5ob3N0X2xzX2xvd19wb3dlcl9waHlfY2xrCT0gLTEsCi0JLnRzX2RsaW5lCQkJPSAtMSwKLQkucmVsb2FkX2N0bAkJCT0gLTEsCi0JLmFoYmNmZwkJCQk9IC0xLAotCS51ZnJhbWVfc2NoZWQJCQk9IC0xLAorc3RydWN0IGR3YzJfcGNpX2dsdWUgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmR3YzI7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGh5OwogfTsKIAotLyoqCi0gKiBkd2MyX2RyaXZlcl9yZW1vdmUoKSAtIENhbGxlZCB3aGVuIHRoZSBEV0Nfb3RnIGNvcmUgaXMgdW5yZWdpc3RlcmVkIHdpdGggdGhlCi0gKiBEV0Nfb3RnIGRyaXZlcgotICoKLSAqIEBkZXY6IEJ1cyBkZXZpY2UKLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgcm1tb2QgY29tbWFuZCBpcyBleGVjdXRlZC4gVGhlCi0gKiBkZXZpY2UgbWF5IG9yIG1heSBub3QgYmUgZWxlY3RyaWNhbGx5IHByZXNlbnQuIElmIGl0IGlzIHByZXNlbnQsIHRoZSBkcml2ZXIKLSAqIHN0b3BzIGRldmljZSBwcm9jZXNzaW5nLiBBbnkgcmVzb3VyY2VzIHVzZWQgb24gYmVoYWxmIG9mIHRoaXMgZGV2aWNlIGFyZQotICogZnJlZWQuCi0gKi8KLXN0YXRpYyB2b2lkIGR3YzJfZHJpdmVyX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgZHdjMl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2kpCiB7Ci0Jc3RydWN0IGR3YzJfaHNvdGcgKmhzb3RnID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGR3YzJfcGNpX2dsdWUgKmdsdWUgPSBwY2lfZ2V0X2RydmRhdGEocGNpKTsKIAotCWR3YzJfaGNkX3JlbW92ZShoc290Zyk7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZ2x1ZS0+ZHdjMik7CisJdXNiX3BoeV9nZW5lcmljX3VucmVnaXN0ZXIoZ2x1ZS0+cGh5KTsKKwlrZnJlZShnbHVlKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpLCBOVUxMKTsKIH0KIAotLyoqCi0gKiBkd2MyX2RyaXZlcl9wcm9iZSgpIC0gQ2FsbGVkIHdoZW4gdGhlIERXQ19vdGcgY29yZSBpcyBib3VuZCB0byB0aGUgRFdDX290ZwotICogZHJpdmVyCi0gKgotICogQGRldjogQnVzIGRldmljZQotICoKLSAqIFRoaXMgcm91dGluZSBjcmVhdGVzIHRoZSBkcml2ZXIgY29tcG9uZW50cyByZXF1aXJlZCB0byBjb250cm9sIHRoZSBkZXZpY2UKLSAqIChjb3JlLCBIQ0QsIGFuZCBQQ0QpIGFuZCBpbml0aWFsaXplcyB0aGUgZGV2aWNlLiBUaGUgZHJpdmVyIGNvbXBvbmVudHMgYXJlCi0gKiBzdG9yZWQgaW4gYSBkd2MyX2hzb3RnIHN0cnVjdHVyZS4gQSByZWZlcmVuY2UgdG8gdGhlIGR3YzJfaHNvdGcgaXMgc2F2ZWQKLSAqIGluIHRoZSBkZXZpY2UgcHJpdmF0ZSBkYXRhLiBUaGlzIGFsbG93cyB0aGUgZHJpdmVyIHRvIGFjY2VzcyB0aGUgZHdjMl9oc290ZwotICogc3RydWN0dXJlIG9uIHN1YnNlcXVlbnQgY2FsbHMgdG8gZHJpdmVyIG1ldGhvZHMgZm9yIHRoaXMgZGV2aWNlLgotICovCi1zdGF0aWMgaW50IGR3YzJfZHJpdmVyX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKK3N0YXRpYyBpbnQgZHdjMl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaSwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewotCXN0cnVjdCBkd2MyX2hzb3RnICpoc290ZzsKLQlpbnQgcmV0dmFsOworCXN0cnVjdCByZXNvdXJjZQkJcmVzWzJdOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJKmR3YzI7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGh5OworCWludAkJCXJldDsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2ID0gJnBjaS0+ZGV2OworCXN0cnVjdCBkd2MyX3BjaV9nbHVlCSpnbHVlOwogCi0JaHNvdGcgPSBkZXZtX2t6YWxsb2MoJmRldi0+ZGV2LCBzaXplb2YoKmhzb3RnKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFoc290ZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQloc290Zy0+ZGV2ID0gJmRldi0+ZGV2OwotCWhzb3RnLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZkZXYtPmRldiwgJmRldi0+cmVzb3VyY2VbMF0pOwotCWlmIChJU19FUlIoaHNvdGctPnJlZ3MpKQotCQlyZXR1cm4gUFRSX0VSUihoc290Zy0+cmVncyk7Ci0KLQlkZXZfZGJnKCZkZXYtPmRldiwgIm1hcHBlZCBQQSAlMDhseCB0byBWQSAlcFxuIiwKLQkJKHVuc2lnbmVkIGxvbmcpcGNpX3Jlc291cmNlX3N0YXJ0KGRldiwgMCksIGhzb3RnLT5yZWdzKTsKLQotCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXYpIDwgMCkKKwlyZXQgPSBwY2ltX2VuYWJsZV9kZXZpY2UocGNpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBwY2kgZGV2aWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlwY2lfc2V0X21hc3RlcihkZXYpOwotCi0JcmV0dmFsID0gZGV2bV9yZXF1ZXN0X2lycShoc290Zy0+ZGV2LCBkZXYtPmlycSwKLQkJCQkgIGR3YzJfaGFuZGxlX2NvbW1vbl9pbnRyLCBJUlFGX1NIQVJFRCwKLQkJCQkgIGRldl9uYW1lKGhzb3RnLT5kZXYpLCBoc290Zyk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQotCXNwaW5fbG9ja19pbml0KCZoc290Zy0+bG9jayk7Ci0JcmV0dmFsID0gZHdjMl9oY2RfaW5pdChoc290ZywgZGV2LT5pcnEsICZkd2MyX21vZHVsZV9wYXJhbXMpOwotCWlmIChyZXR2YWwpIHsKLQkJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7Ci0JCXJldHVybiByZXR2YWw7CiAJfQogCi0JcGNpX3NldF9kcnZkYXRhKGRldiwgaHNvdGcpOworCXBjaV9zZXRfbWFzdGVyKHBjaSk7CiAKLQlyZXR1cm4gcmV0dmFsOworCWR3YzIgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoImR3YzIiLCBQTEFURk9STV9ERVZJRF9BVVRPKTsKKwlpZiAoIWR3YzIpIHsKKwkJZGV2X2VycihkZXYsICJjb3VsZG4ndCBhbGxvY2F0ZSBkd2MyIGRldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldChyZXMsIDB4MDAsIHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpICogQVJSQVlfU0laRShyZXMpKTsKKworCXJlc1swXS5zdGFydAk9IHBjaV9yZXNvdXJjZV9zdGFydChwY2ksIDApOworCXJlc1swXS5lbmQJPSBwY2lfcmVzb3VyY2VfZW5kKHBjaSwgMCk7CisJcmVzWzBdLm5hbWUJPSAiZHdjMiI7CisJcmVzWzBdLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU07CisKKwlyZXNbMV0uc3RhcnQJPSBwY2ktPmlycTsKKwlyZXNbMV0ubmFtZQk9ICJkd2MyIjsKKwlyZXNbMV0uZmxhZ3MJPSBJT1JFU09VUkNFX0lSUTsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKGR3YzIsIHJlcywgQVJSQVlfU0laRShyZXMpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiY291bGRuJ3QgYWRkIHJlc291cmNlcyB0byBkd2MyIGRldmljZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZHdjMi0+ZGV2LnBhcmVudCA9IGRldjsKKworCXBoeSA9IHVzYl9waHlfZ2VuZXJpY19yZWdpc3RlcigpOworCWlmIChJU19FUlIocGh5KSkgeworCQlkZXZfZXJyKGRldiwgImVycm9yIHJlZ2lzdGVyaW5nIGdlbmVyaWMgUEhZICglbGQpXG4iLAorCQkJUFRSX0VSUihwaHkpKTsKKwkJcmV0dXJuIFBUUl9FUlIocGh5KTsKKwl9CisKKwlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKGR3YzIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgZHdjMiBkZXZpY2VcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlnbHVlID0ga3phbGxvYyhzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdsdWUpCisJCXJldHVybiAtRU5PTUVNOworCisJZ2x1ZS0+cGh5ID0gcGh5OworCWdsdWUtPmR3YzIgPSBkd2MyOworCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGdsdWUpOworCisJcmV0dXJuIDA7CitlcnI6CisJdXNiX3BoeV9nZW5lcmljX3VucmVnaXN0ZXIocGh5KTsKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGR3YzIpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBkd2MyX3BjaV9pZHNbXSA9IHsKQEAgLTE3NCw4ICsxNTgsOCBAQAogc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGR3YzJfcGNpX2RyaXZlciA9IHsKIAkubmFtZSA9IGR3YzJfZHJpdmVyX25hbWUsCiAJLmlkX3RhYmxlID0gZHdjMl9wY2lfaWRzLAotCS5wcm9iZSA9IGR3YzJfZHJpdmVyX3Byb2JlLAotCS5yZW1vdmUgPSBkd2MyX2RyaXZlcl9yZW1vdmUsCisJLnByb2JlID0gZHdjMl9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IGR3YzJfcGNpX3JlbW92ZSwKIH07CiAKIG1vZHVsZV9wY2lfZHJpdmVyKGR3YzJfcGNpX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL3BsYXRmb3JtLmMgYi9kcml2ZXJzL3VzYi9kd2MyL3BsYXRmb3JtLmMKaW5kZXggYWUwOTVmMC4uMTg1NjYzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMi9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzIvcGxhdGZvcm0uYwpAQCAtMTIxLDggKzEyMSwxMCBAQAogewogCXN0cnVjdCBkd2MyX2hzb3RnICpoc290ZyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CiAKLQlkd2MyX2hjZF9yZW1vdmUoaHNvdGcpOwotCXMzY19oc290Z19yZW1vdmUoaHNvdGcpOworCWlmIChoc290Zy0+aGNkX2VuYWJsZWQpCisJCWR3YzJfaGNkX3JlbW92ZShoc290Zyk7CisJaWYgKGhzb3RnLT5nYWRnZXRfZW5hYmxlZCkKKwkJczNjX2hzb3RnX3JlbW92ZShoc290Zyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIzNCwxMiArMjM2LDIzIEBACiAKIAlzcGluX2xvY2tfaW5pdCgmaHNvdGctPmxvY2spOwogCW11dGV4X2luaXQoJmhzb3RnLT5pbml0X211dGV4KTsKLQlyZXR2YWwgPSBkd2MyX2dhZGdldF9pbml0KGhzb3RnLCBpcnEpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7Ci0JcmV0dmFsID0gZHdjMl9oY2RfaW5pdChoc290ZywgaXJxLCBwYXJhbXMpOwotCWlmIChyZXR2YWwpCi0JCXJldHVybiByZXR2YWw7CisKKwlpZiAoaHNvdGctPmRyX21vZGUgIT0gVVNCX0RSX01PREVfSE9TVCkgeworCQlyZXR2YWwgPSBkd2MyX2dhZGdldF9pbml0KGhzb3RnLCBpcnEpOworCQlpZiAocmV0dmFsKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJaHNvdGctPmdhZGdldF9lbmFibGVkID0gMTsKKwl9CisKKwlpZiAoaHNvdGctPmRyX21vZGUgIT0gVVNCX0RSX01PREVfUEVSSVBIRVJBTCkgeworCQlyZXR2YWwgPSBkd2MyX2hjZF9pbml0KGhzb3RnLCBpcnEsIHBhcmFtcyk7CisJCWlmIChyZXR2YWwpIHsKKwkJCWlmIChoc290Zy0+Z2FkZ2V0X2VuYWJsZWQpCisJCQkJczNjX2hzb3RnX3JlbW92ZShoc290Zyk7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJCWhzb3RnLT5oY2RfZW5hYmxlZCA9IDE7CisJfQogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEoZGV2LCBoc290Zyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2R3YzMvS2NvbmZpZwppbmRleCBlZGJmOWM4Li44MjdjNGY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvZHdjMy9LY29uZmlnCkBAIC0xMDQsMTEgKzEwNCw0IEBACiAJaGVscAogCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgZGVidWdnaW5nIG1lc3NhZ2VzIG9uIERXQzMgRHJpdmVyLgogCi1jb25maWcgRFdDM19IT1NUX1VTQjNfTFBNX0VOQUJMRQotCWJvb2wgIkVuYWJsZSBVU0IzIExQTSBDYXBhYmlsaXR5IgotCWRlcGVuZHMgb24gVVNCX0RXQzNfSE9TVD15IHx8IFVTQl9EV0MzX0RVQUxfUk9MRT15Ci0JZGVmYXVsdCBuCi0JaGVscAotCSAgU2VsZWN0IHRoaXMgd2hlbiB5b3Ugd2FudCB0byBlbmFibGUgVVNCMyBMUE0gd2l0aCBkd2MzIHhoY2kgaG9zdC4KLQogZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5jIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmMKaW5kZXggOWYwZTIwOS4uMmJiYWIzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmMKQEAgLTc3NCwxNyArNzc0LDEzIEBACiAJICogc2luY2UgaXQgd2lsbCBiZSByZXF1ZXN0ZWQgYnkgdGhlIHhoY2ktcGxhdCBkcml2ZXIuCiAJICovCiAJcmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIHJlcyk7Ci0JaWYgKElTX0VSUihyZWdzKSkKLQkJcmV0dXJuIFBUUl9FUlIocmVncyk7CisJaWYgKElTX0VSUihyZWdzKSkgeworCQlyZXQgPSBQVFJfRVJSKHJlZ3MpOworCQlnb3RvIGVycjA7CisJfQogCiAJZHdjLT5yZWdzCT0gcmVnczsKIAlkd2MtPnJlZ3Nfc2l6ZQk9IHJlc291cmNlX3NpemUocmVzKTsKLQkvKgotCSAqIHJlc3RvcmUgcmVzLT5zdGFydCBiYWNrIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBzbyB0aGF0LAotCSAqIGluIGNhc2UgdGhlIHByb2JlIGlzIGRlZmVycmVkLCB3ZSBkb24ndCBlbmQgdXAgZ2V0dGluZyBlcnJvciBpbgotCSAqIHJlcXVlc3QgdGhlIG1lbW9yeSByZWdpb24gdGhlIG5leHQgdGltZSBwcm9iZSBpcyBjYWxsZWQuCi0JICovCi0JcmVzLT5zdGFydCAtPSBEV0MzX0dMT0JBTFNfUkVHU19TVEFSVDsKIAogCS8qIGRlZmF1bHQgdG8gaGlnaGVzdCBwb3NzaWJsZSB0aHJlc2hvbGQgKi8KIAlscG1fbnlldF90aHJlc2hvbGQgPSAweGZmOwpAQCAtODA4LDYgKzgwNCw4IEBACiAJCQkJInNucHMsaXMtdXRtaS1sMS1zdXNwZW5kIik7CiAJCW9mX3Byb3BlcnR5X3JlYWRfdTgobm9kZSwgInNucHMsaGlyZC10aHJlc2hvbGQiLAogCQkJCSZoaXJkX3RocmVzaG9sZCk7CisJCWR3Yy0+dXNiM19scG1fY2FwYWJsZSA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChub2RlLAorCQkJCSJzbnBzLHVzYjNfbHBtX2NhcGFibGUiKTsKIAogCQlkd2MtPm5lZWRzX2ZpZm9fcmVzaXplID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKG5vZGUsCiAJCQkJInR4LWZpZm8tcmVzaXplIik7CkBAIC04NDgsNiArODQ2LDcgQEAKIAkJCWhpcmRfdGhyZXNob2xkID0gcGRhdGEtPmhpcmRfdGhyZXNob2xkOwogCiAJCWR3Yy0+bmVlZHNfZmlmb19yZXNpemUgPSBwZGF0YS0+dHhfZmlmb19yZXNpemU7CisJCWR3Yy0+dXNiM19scG1fY2FwYWJsZSA9IHBkYXRhLT51c2IzX2xwbV9jYXBhYmxlOwogCQlkd2MtPmRyX21vZGUgPSBwZGF0YS0+ZHJfbW9kZTsKIAogCQlkd2MtPmRpc2FibGVfc2NyYW1ibGVfcXVpcmsgPSBwZGF0YS0+ZGlzYWJsZV9zY3JhbWJsZV9xdWlyazsKQEAgLTg3OCw3ICs4NzcsNyBAQAogCiAJcmV0ID0gZHdjM19jb3JlX2dldF9waHkoZHdjKTsKIAlpZiAocmV0KQotCQlyZXR1cm4gcmV0OworCQlnb3RvIGVycjA7CiAKIAlzcGluX2xvY2tfaW5pdCgmZHdjLT5sb2NrKTsKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkd2MpOwpAQCAtODk5LDcgKzg5OCw3IEBACiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGR3Yy0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIGV2ZW50IGJ1ZmZlcnNcbiIpOwogCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycjA7CisJCWdvdG8gZXJyMTsKIAl9CiAKIAlpZiAoSVNfRU5BQkxFRChDT05GSUdfVVNCX0RXQzNfSE9TVCkpCkBAIC05MTMsNjUgKzkxMiw4MSBAQAogCXJldCA9IGR3YzNfY29yZV9pbml0KGR3Yyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGNvcmVcbiIpOwotCQlnb3RvIGVycjA7CisJCWdvdG8gZXJyMTsKIAl9CiAKIAl1c2JfcGh5X3NldF9zdXNwZW5kKGR3Yy0+dXNiMl9waHksIDApOwogCXVzYl9waHlfc2V0X3N1c3BlbmQoZHdjLT51c2IzX3BoeSwgMCk7CiAJcmV0ID0gcGh5X3Bvd2VyX29uKGR3Yy0+dXNiMl9nZW5lcmljX3BoeSk7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyMTsKKwkJZ290byBlcnIyOwogCiAJcmV0ID0gcGh5X3Bvd2VyX29uKGR3Yy0+dXNiM19nZW5lcmljX3BoeSk7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX3VzYjJwaHlfcG93ZXI7CisJCWdvdG8gZXJyMzsKIAogCXJldCA9IGR3YzNfZXZlbnRfYnVmZmVyc19zZXR1cChkd2MpOwogCWlmIChyZXQpIHsKIAkJZGV2X2Vycihkd2MtPmRldiwgImZhaWxlZCB0byBzZXR1cCBldmVudCBidWZmZXJzXG4iKTsKLQkJZ290byBlcnJfdXNiM3BoeV9wb3dlcjsKKwkJZ290byBlcnI0OwogCX0KIAogCXJldCA9IGR3YzNfY29yZV9pbml0X21vZGUoZHdjKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycjI7CisJCWdvdG8gZXJyNTsKIAogCXJldCA9IGR3YzNfZGVidWdmc19pbml0KGR3Yyk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGRlYnVnZnNcbiIpOwotCQlnb3RvIGVycjM7CisJCWdvdG8gZXJyNjsKIAl9CiAKIAlwbV9ydW50aW1lX2FsbG93KGRldik7CiAKIAlyZXR1cm4gMDsKIAotZXJyMzoKK2VycjY6CiAJZHdjM19jb3JlX2V4aXRfbW9kZShkd2MpOwogCi1lcnIyOgorZXJyNToKIAlkd2MzX2V2ZW50X2J1ZmZlcnNfY2xlYW51cChkd2MpOwogCi1lcnJfdXNiM3BoeV9wb3dlcjoKK2VycjQ6CiAJcGh5X3Bvd2VyX29mZihkd2MtPnVzYjNfZ2VuZXJpY19waHkpOwogCi1lcnJfdXNiMnBoeV9wb3dlcjoKK2VycjM6CiAJcGh5X3Bvd2VyX29mZihkd2MtPnVzYjJfZ2VuZXJpY19waHkpOwogCi1lcnIxOgorZXJyMjoKIAl1c2JfcGh5X3NldF9zdXNwZW5kKGR3Yy0+dXNiMl9waHksIDEpOwogCXVzYl9waHlfc2V0X3N1c3BlbmQoZHdjLT51c2IzX3BoeSwgMSk7CiAJZHdjM19jb3JlX2V4aXQoZHdjKTsKIAotZXJyMDoKK2VycjE6CiAJZHdjM19mcmVlX2V2ZW50X2J1ZmZlcnMoZHdjKTsKIAorZXJyMDoKKwkvKgorCSAqIHJlc3RvcmUgcmVzLT5zdGFydCBiYWNrIHRvIGl0cyBvcmlnaW5hbCB2YWx1ZSBzbyB0aGF0LCBpbiBjYXNlIHRoZQorCSAqIHByb2JlIGlzIGRlZmVycmVkLCB3ZSBkb24ndCBlbmQgdXAgZ2V0dGluZyBlcnJvciBpbiByZXF1ZXN0IHRoZQorCSAqIG1lbW9yeSByZWdpb24gdGhlIG5leHQgdGltZSBwcm9iZSBpcyBjYWxsZWQuCisJICovCisJcmVzLT5zdGFydCAtPSBEV0MzX0dMT0JBTFNfUkVHU19TVEFSVDsKKwogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZHdjM19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgZHdjMwkqZHdjID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCisJLyoKKwkgKiByZXN0b3JlIHJlcy0+c3RhcnQgYmFjayB0byBpdHMgb3JpZ2luYWwgdmFsdWUgc28gdGhhdCwgaW4gY2FzZSB0aGUKKwkgKiBwcm9iZSBpcyBkZWZlcnJlZCwgd2UgZG9uJ3QgZW5kIHVwIGdldHRpbmcgZXJyb3IgaW4gcmVxdWVzdCB0aGUKKwkgKiBtZW1vcnkgcmVnaW9uIHRoZSBuZXh0IHRpbWUgcHJvYmUgaXMgY2FsbGVkLgorCSAqLworCXJlcy0+c3RhcnQgLT0gRFdDM19HTE9CQUxTX1JFR1NfU1RBUlQ7CiAKIAlkd2MzX2RlYnVnZnNfZXhpdChkd2MpOwogCWR3YzNfY29yZV9leGl0X21vZGUoZHdjKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvY29yZS5oIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmgKaW5kZXggZDIwMTkxMC4uZmRhYjcxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9jb3JlLmgKKysrIGIvZHJpdmVycy91c2IvZHdjMy9jb3JlLmgKQEAgLTY4OSw2ICs2ODksNyBAQAogICogQHNldHVwX3BhY2tldF9wZW5kaW5nOiB0cnVlIHdoZW4gdGhlcmUncyBhIFNldHVwIFBhY2tldCBpbiBGSUZPLiBXb3JrYXJvdW5kCiAgKiBAc3RhcnRfY29uZmlnX2lzc3VlZDogdHJ1ZSB3aGVuIFN0YXJ0Q29uZmlnIGNvbW1hbmQgaGFzIGJlZW4gaXNzdWVkCiAgKiBAdGhyZWVfc3RhZ2Vfc2V0dXA6IHNldCBpZiB3ZSBwZXJmb3JtIGEgdGhyZWUgcGhhc2Ugc2V0dXAKKyAqIEB1c2IzX2xwbV9jYXBhYmxlOiBzZXQgaWYgaGFkcndhcmUgc3VwcG9ydHMgTGluayBQb3dlciBNYW5hZ2VtZW50CiAgKiBAZGlzYWJsZV9zY3JhbWJsZV9xdWlyazogc2V0IGlmIHdlIGVuYWJsZSB0aGUgZGlzYWJsZSBzY3JhbWJsZSBxdWlyawogICogQHUyZXhpdF9sZnBzX3F1aXJrOiBzZXQgaWYgd2UgZW5hYmxlIHUyZXhpdCBsZnBzIHF1aXJrCiAgKiBAdTJzc19pbnAzX3F1aXJrOiBzZXQgaWYgd2UgZW5hYmxlIFAzIE9LIGZvciBVMi9TUyBJbmFjdGl2ZSBxdWlyawpAQCAtODEyLDYgKzgxMyw3IEBACiAJdW5zaWduZWQJCXNldHVwX3BhY2tldF9wZW5kaW5nOjE7CiAJdW5zaWduZWQJCXN0YXJ0X2NvbmZpZ19pc3N1ZWQ6MTsKIAl1bnNpZ25lZAkJdGhyZWVfc3RhZ2Vfc2V0dXA6MTsKKwl1bnNpZ25lZAkJdXNiM19scG1fY2FwYWJsZToxOwogCiAJdW5zaWduZWQJCWRpc2FibGVfc2NyYW1ibGVfcXVpcms6MTsKIAl1bnNpZ25lZAkJdTJleGl0X2xmcHNfcXVpcms6MTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1vbWFwLmMgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtb21hcC5jCmluZGV4IDUyZTBjNGUuLmVkYmE1MzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1vbWFwLmMKKysrIGIvZHJpdmVycy91c2IvZHdjMy9kd2MzLW9tYXAuYwpAQCAtMzI1LDE1ICszMjUsNiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGludCBkd2MzX29tYXBfcmVtb3ZlX2NvcmUoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpjKQotewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSB0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KTsKLQotCW9mX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIGR3YzNfb21hcF9lbmFibGVfaXJxcyhzdHJ1Y3QgZHdjM19vbWFwICpvbWFwKQogewogCXUzMgkJCXJlZzsKQEAgLTYwMCw3ICs1OTEsNyBAQAogCWlmIChvbWFwLT5leHRjb25faWRfZGV2LmVkZXYpCiAJCWV4dGNvbl91bnJlZ2lzdGVyX2ludGVyZXN0KCZvbWFwLT5leHRjb25faWRfZGV2KTsKIAlkd2MzX29tYXBfZGlzYWJsZV9pcnFzKG9tYXApOwotCWRldmljZV9mb3JfZWFjaF9jaGlsZCgmcGRldi0+ZGV2LCBOVUxMLCBkd2MzX29tYXBfcmVtb3ZlX2NvcmUpOworCW9mX3BsYXRmb3JtX2RlcG9wdWxhdGUob21hcC0+ZGV2KTsKIAlwbV9ydW50aW1lX3B1dF9zeW5jKCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9kd2MzLXBjaS5jIGIvZHJpdmVycy91c2IvZHdjMy9kd2MzLXBjaS5jCmluZGV4IDhkOTUwNTYuLmI3NzNmYjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2R3YzMvZHdjMy1wY2kuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2R3YzMtcGNpLmMKQEAgLTI0LDggKzI0LDYgQEAKIAogI2luY2x1ZGUgInBsYXRmb3JtX2RhdGEuaCIKIAotLyogRklYTUUgZGVmaW5lIHRoZXNlIGluIDxsaW51eC9wY2lfaWRzLmg+ICovCi0jZGVmaW5lIFBDSV9WRU5ET1JfSURfU1lOT1BTWVMJCTB4MTZjMwogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1NZTk9QU1lTX0hBUFNVU0IzCTB4YWJjZAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0JZVAkJMHgwZjM3CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfTVJGTEQJMHgxMTllCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jIGIvZHJpdmVycy91c2IvZHdjMy9nYWRnZXQuYwppbmRleCBhMDNhNDg1Li44OTQ2YzMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL2R3YzMvZ2FkZ2V0LmMKQEAgLTE4NTUsMzIgKzE4NTUsMjcgQEAKIAl1bnNpZ25lZCBpbnQJCWk7CiAJaW50CQkJcmV0OwogCisJcmVxID0gbmV4dF9yZXF1ZXN0KCZkZXAtPnJlcV9xdWV1ZWQpOworCWlmICghcmVxKSB7CisJCVdBUk5fT05fT05DRSgxKTsKKwkJcmV0dXJuIDE7CisJfQorCWkgPSAwOwogCWRvIHsKLQkJcmVxID0gbmV4dF9yZXF1ZXN0KCZkZXAtPnJlcV9xdWV1ZWQpOwotCQlpZiAoIXJlcSkgewotCQkJV0FSTl9PTl9PTkNFKDEpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJaSA9IDA7Ci0JCWRvIHsKLQkJCXNsb3QgPSByZXEtPnN0YXJ0X3Nsb3QgKyBpOwotCQkJaWYgKChzbG90ID09IERXQzNfVFJCX05VTSAtIDEpICYmCisJCXNsb3QgPSByZXEtPnN0YXJ0X3Nsb3QgKyBpOworCQlpZiAoKHNsb3QgPT0gRFdDM19UUkJfTlVNIC0gMSkgJiYKIAkJCQl1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlcC0+ZW5kcG9pbnQuZGVzYykpCi0JCQkJc2xvdCsrOwotCQkJc2xvdCAlPSBEV0MzX1RSQl9OVU07Ci0JCQl0cmIgPSAmZGVwLT50cmJfcG9vbFtzbG90XTsKKwkJCXNsb3QrKzsKKwkJc2xvdCAlPSBEV0MzX1RSQl9OVU07CisJCXRyYiA9ICZkZXAtPnRyYl9wb29sW3Nsb3RdOwogCi0JCQlyZXQgPSBfX2R3YzNfY2xlYW51cF9kb25lX3RyYnMoZHdjLCBkZXAsIHJlcSwgdHJiLAotCQkJCQlldmVudCwgc3RhdHVzKTsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCX13aGlsZSAoKytpIDwgcmVxLT5yZXF1ZXN0Lm51bV9tYXBwZWRfc2dzKTsKLQotCQlkd2MzX2dhZGdldF9naXZlYmFjayhkZXAsIHJlcSwgc3RhdHVzKTsKLQorCQlyZXQgPSBfX2R3YzNfY2xlYW51cF9kb25lX3RyYnMoZHdjLCBkZXAsIHJlcSwgdHJiLAorCQkJCWV2ZW50LCBzdGF0dXMpOwogCQlpZiAocmV0KQogCQkJYnJlYWs7Ci0JfSB3aGlsZSAoMSk7CisJfSB3aGlsZSAoKytpIDwgcmVxLT5yZXF1ZXN0Lm51bV9tYXBwZWRfc2dzKTsKKworCWR3YzNfZ2FkZ2V0X2dpdmViYWNrKGRlcCwgcmVxLCBzdGF0dXMpOwogCiAJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVwLT5lbmRwb2ludC5kZXNjKSAmJgogCQkJbGlzdF9lbXB0eSgmZGVwLT5yZXFfcXVldWVkKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9ob3N0LmMgYi9kcml2ZXJzL3VzYi9kd2MzL2hvc3QuYwppbmRleCAxMmJmZDNjLi5jNjc5ZjYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2hvc3QuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2hvc3QuYwpAQCAtNDksOSArNDksNyBAQAogCiAJbWVtc2V0KCZwZGF0YSwgMCwgc2l6ZW9mKHBkYXRhKSk7CiAKLSNpZmRlZiBDT05GSUdfRFdDM19IT1NUX1VTQjNfTFBNX0VOQUJMRQotCXBkYXRhLnVzYjNfbHBtX2NhcGFibGUgPSAxOwotI2VuZGlmCisJcGRhdGEudXNiM19scG1fY2FwYWJsZSA9IGR3Yy0+dXNiM19scG1fY2FwYWJsZTsKIAogCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YSh4aGNpLCAmcGRhdGEsIHNpemVvZihwZGF0YSkpOwogCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzMvcGxhdGZvcm1fZGF0YS5oIGIvZHJpdmVycy91c2IvZHdjMy9wbGF0Zm9ybV9kYXRhLmgKaW5kZXggYTNhM2I2ZC4uYTJiZDQ2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMy9wbGF0Zm9ybV9kYXRhLmgKKysrIGIvZHJpdmVycy91c2IvZHdjMy9wbGF0Zm9ybV9kYXRhLmgKQEAgLTI0LDYgKzI0LDcgQEAKIAllbnVtIHVzYl9kZXZpY2Vfc3BlZWQgbWF4aW11bV9zcGVlZDsKIAllbnVtIHVzYl9kcl9tb2RlIGRyX21vZGU7CiAJYm9vbCB0eF9maWZvX3Jlc2l6ZTsKKwlib29sIHVzYjNfbHBtX2NhcGFibGU7CiAKIAl1bnNpZ25lZCBpc191dG1pX2wxX3N1c3BlbmQ6MTsKIAl1OCBoaXJkX3RocmVzaG9sZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9LY29uZmlnIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKaW5kZXggYjQ1NGQwNS4uYmNmODNjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L0tjb25maWcKQEAgLTE5Niw2ICsxOTYsOSBAQAogY29uZmlnIFVTQl9GX0hJRAogCXRyaXN0YXRlCiAKK2NvbmZpZyBVU0JfRl9QUklOVEVSCisJdHJpc3RhdGUKKwogY2hvaWNlCiAJdHJpc3RhdGUgIlVTQiBHYWRnZXQgRHJpdmVycyIKIAlkZWZhdWx0IFVTQl9FVEgKQEAgLTQzNCw2ICs0MzcsMjAgQEAKIAkgIGRldmljZS4gSXQgcHJvdmlkZXMgYSB1c2Vyc3BhY2UgQVBJIHRvIHByb2Nlc3MgVVZDIGNvbnRyb2wgcmVxdWVzdHMKIAkgIGFuZCBzdHJlYW0gdmlkZW8gZGF0YSB0byB0aGUgaG9zdC4KIAorY29uZmlnIFVTQl9DT05GSUdGU19GX1BSSU5URVIKKwlib29sICJQcmludGVyIGZ1bmN0aW9uIgorCXNlbGVjdCBVU0JfRl9QUklOVEVSCisJZGVwZW5kcyBvbiBVU0JfQ09ORklHRlMKKwloZWxwCisJICBUaGUgUHJpbnRlciBmdW5jdGlvbiBjaGFubmVscyBkYXRhIGJldHdlZW4gdGhlIFVTQiBob3N0IGFuZCBhCisJICB1c2Vyc3BhY2UgcHJvZ3JhbSBkcml2aW5nIHRoZSBwcmludCBlbmdpbmUuIFRoZSB1c2VyIHNwYWNlCisJICBwcm9ncmFtIHJlYWRzIGFuZCB3cml0ZXMgdGhlIGRldmljZSBmaWxlIC9kZXYvZ19wcmludGVyPFg+IHRvCisJICByZWNlaXZlIG9yIHNlbmQgcHJpbnRlciBkYXRhLiBJdCBjYW4gdXNlIGlvY3RsIGNhbGxzIHRvCisJICB0aGUgZGV2aWNlIGZpbGUgdG8gZ2V0IG9yIHNldCBwcmludGVyIHN0YXR1cy4KKworCSAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBEb2N1bWVudGF0aW9uL3VzYi9nYWRnZXRfcHJpbnRlci50eHQKKwkgIHdoaWNoIGluY2x1ZGVzIHNhbXBsZSBjb2RlIGZvciBhY2Nlc3NpbmcgdGhlIGRldmljZSBmaWxlLgorCiBzb3VyY2UgImRyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvS2NvbmZpZyIKIAogZW5kY2hvaWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvY29tcG9zaXRlLmMKaW5kZXggMTNhZGZkMS4uNGUzNDQ3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2NvbXBvc2l0ZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9jb21wb3NpdGUuYwpAQCAtMTE2MSwxMSArMTE2MSwxMSBAQAogICogVGhpcyBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhIGRlZXAgY29weSBvZiB1c2JfZ2FkZ2V0X3N0cmluZ3MgYW5kIHVzYl9zdHJpbmcKICAqIGFuZCBhdHRhY2ggaXQgdG8gdGhlIGNkZXYuIFRoZSBhY3R1YWwgc3RyaW5nICh1c2Jfc3RyaW5nLnMpIHdpbGwgbm90IGJlCiAgKiBjb3BpZWQgYnV0IG9ubHkgYSByZWZlcmVuY2VkIHdpbGwgYmUgbWFkZS4gVGhlIHN0cnVjdCB1c2JfZ2FkZ2V0X3N0cmluZ3MKLSAqIGFycmF5IG1heSBjb250YWluIG11bHRpcGxlIGxhbmd1Z2VzIGFuZCBzaG91bGQgYmUgTlVMTCB0ZXJtaW5hdGVkLgorICogYXJyYXkgbWF5IGNvbnRhaW4gbXVsdGlwbGUgbGFuZ3VhZ2VzIGFuZCBzaG91bGQgYmUgTlVMTCB0ZXJtaW5hdGVkLgogICogVGhlIC0+bGFuZ3VhZ2UgcG9pbnRlciBvZiBlYWNoIHN0cnVjdCB1c2JfZ2FkZ2V0X3N0cmluZ3MgaGFzIHRvIGNvbnRhaW4gdGhlCiAgKiBzYW1lIGFtb3VudCBvZiBlbnRyaWVzLgogICogRm9yIGluc3RhbmNlOiBzcFswXSBpcyBlbi1VUywgc3BbMV0gaXMgZXMtRVMuIEl0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIGZpcnN0Ci0gKiB1c2Jfc3RyaW5nIGVudHJ5IG9mIGVzLUVTIGNvbnRhaW50cyB0aGUgdHJhbnNsYXRpb24gb2YgdGhlIGZpcnN0IHVzYl9zdHJpbmcKKyAqIHVzYl9zdHJpbmcgZW50cnkgb2YgZXMtRVMgY29udGFpbnMgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBmaXJzdCB1c2Jfc3RyaW5nCiAgKiBlbnRyeSBvZiBlbi1VUy4gVGhlcmVmb3JlIGJvdGggZW50cmllcyBiZWNvbWUgdGhlIHNhbWUgaWQgYXNzaWduLgogICovCiBzdHJ1Y3QgdXNiX3N0cmluZyAqdXNiX2dzdHJpbmdzX2F0dGFjaChzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYsCkBAIC0xNDcyLDYgKzE0NzIsMTMgQEAKIAlyZXEtPmxlbmd0aCA9IDA7CiAJZ2FkZ2V0LT5lcDAtPmRyaXZlcl9kYXRhID0gY2RldjsKIAorCS8qCisJICogRG9uJ3QgbGV0IG5vbi1zdGFuZGFyZCByZXF1ZXN0cyBtYXRjaCBhbnkgb2YgdGhlIGNhc2VzIGJlbG93CisJICogYnkgYWNjaWRlbnQuCisJICovCisJaWYgKChjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfVFlQRV9NQVNLKSAhPSBVU0JfVFlQRV9TVEFOREFSRCkKKwkJZ290byB1bmtub3duOworCiAJc3dpdGNoIChjdHJsLT5iUmVxdWVzdCkgewogCiAJLyogd2UgaGFuZGxlIGFsbCBzdGFuZGFyZCBVU0IgZGVzY3JpcHRvcnMgKi8KQEAgLTE3NTEsNiArMTc1OCwxMCBAQAogCQkgKiB0YWtlIHN1Y2ggcmVxdWVzdHMgdG9vLCBpZiB0aGF0J3MgZXZlciBuZWVkZWQ6ICB0byB3b3JrCiAJCSAqIGluIGNvbmZpZyAwLCBldGMuCiAJCSAqLworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZjZGV2LT5jb25maWctPmZ1bmN0aW9ucywgbGlzdCkKKwkJCWlmIChmLT5yZXFfbWF0Y2ggJiYgZi0+cmVxX21hdGNoKGYsIGN0cmwpKQorCQkJCWdvdG8gdHJ5X2Z1bl9zZXR1cDsKKwkJZiA9IE5VTEw7CiAJCXN3aXRjaCAoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spIHsKIAkJY2FzZSBVU0JfUkVDSVBfSU5URVJGQUNFOgogCQkJaWYgKCFjZGV2LT5jb25maWcgfHwgaW50ZiA+PSBNQVhfQ09ORklHX0lOVEVSRkFDRVMpCkBAIC0xNzY4LDcgKzE3NzksNyBAQAogCQkJCWYgPSBOVUxMOwogCQkJYnJlYWs7CiAJCX0KLQordHJ5X2Z1bl9zZXR1cDoKIAkJaWYgKGYgJiYgZi0+c2V0dXApCiAJCQl2YWx1ZSA9IGYtPnNldHVwKGYsIGN0cmwpOwogCQllbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9NYWtlZmlsZQppbmRleCBmNzFiMWFhLi5iZDdkZWY1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL01ha2VmaWxlCkBAIC00MiwzICs0Miw1IEBACiBvYmotJChDT05GSUdfVVNCX0ZfTUlESSkJKz0gdXNiX2ZfbWlkaS5vCiB1c2JfZl9oaWQteQkJCTo9IGZfaGlkLm8KIG9iai0kKENPTkZJR19VU0JfRl9ISUQpCQkrPSB1c2JfZl9oaWQubwordXNiX2ZfcHJpbnRlci15CQkJOj0gZl9wcmludGVyLm8KK29iai0kKENPTkZJR19VU0JfRl9QUklOVEVSKQkrPSB1c2JfZl9wcmludGVyLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2ZzLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9mcy5jCmluZGV4IDE3NWM5OTUuLjZiZGI1NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2ZzLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfZnMuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L3VzYi9jb21wb3NpdGUuaD4KQEAgLTY1NSw5ICs2NTYsMTAgQEAKIAkJdW51c2VfbW0oaW9fZGF0YS0+bW0pOwogCX0KIAotCWFpb19jb21wbGV0ZShpb19kYXRhLT5raW9jYiwgcmV0LCByZXQpOworCWlvX2RhdGEtPmtpb2NiLT5raV9jb21wbGV0ZShpb19kYXRhLT5raW9jYiwgcmV0LCByZXQpOwogCi0JaWYgKGlvX2RhdGEtPmZmcy0+ZmZzX2V2ZW50ZmQgJiYgIWlvX2RhdGEtPmtpb2NiLT5raV9ldmVudGZkKQorCWlmIChpb19kYXRhLT5mZnMtPmZmc19ldmVudGZkICYmCisJICAgICEoaW9fZGF0YS0+a2lvY2ItPmtpX2ZsYWdzICYgSU9DQl9FVkVOVEZEKSkKIAkJZXZlbnRmZF9zaWduYWwoaW9fZGF0YS0+ZmZzLT5mZnNfZXZlbnRmZCwgMSk7CiAKIAl1c2JfZXBfZnJlZV9yZXF1ZXN0KGlvX2RhdGEtPmVwLCBpb19kYXRhLT5yZXEpOwpAQCAtMTA1OSw4ICsxMDYxLDYgQEAKIAkubGxzZWVrID0Jbm9fbGxzZWVrLAogCiAJLm9wZW4gPQkJZmZzX2VwZmlsZV9vcGVuLAotCS53cml0ZSA9CW5ld19zeW5jX3dyaXRlLAotCS5yZWFkID0JCW5ld19zeW5jX3JlYWQsCiAJLndyaXRlX2l0ZXIgPQlmZnNfZXBmaWxlX3dyaXRlX2l0ZXIsCiAJLnJlYWRfaXRlciA9CWZmc19lcGZpbGVfcmVhZF9pdGVyLAogCS5yZWxlYXNlID0JZmZzX2VwZmlsZV9yZWxlYXNlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfaGlkLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9oaWQuYwppbmRleCBhMjYxMmZiLi4xM2RmYzk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9oaWQuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9oaWQuYwpAQCAtOTA4LDcgKzkwOCw2IEBACiAKIAkvKiBkaXNhYmxlL2ZyZWUgcmVxdWVzdCBhbmQgZW5kIHBvaW50ICovCiAJdXNiX2VwX2Rpc2FibGUoaGlkZy0+aW5fZXApOwotCXVzYl9lcF9kZXF1ZXVlKGhpZGctPmluX2VwLCBoaWRnLT5yZXEpOwogCWtmcmVlKGhpZGctPnJlcS0+YnVmKTsKIAl1c2JfZXBfZnJlZV9yZXF1ZXN0KGhpZGctPmluX2VwLCBoaWRnLT5yZXEpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9sb29wYmFjay5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbG9vcGJhY2suYwppbmRleCAyOThiNDYxLi4zOWY0OWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9sb29wYmFjay5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX2xvb3BiYWNrLmMKQEAgLTI4OSw4ICsyODksNyBAQAogCXN0cnVjdCB1c2JfY29tcG9zaXRlX2RldgkqY2RldjsKIAogCWNkZXYgPSBsb29wLT5mdW5jdGlvbi5jb25maWctPmNkZXY7Ci0JZGlzYWJsZV9lbmRwb2ludHMoY2RldiwgbG9vcC0+aW5fZXAsIGxvb3AtPm91dF9lcCwgTlVMTCwgTlVMTCwgTlVMTCwKLQkJCU5VTEwpOworCWRpc2FibGVfZW5kcG9pbnRzKGNkZXYsIGxvb3AtPmluX2VwLCBsb29wLT5vdXRfZXAsIE5VTEwsIE5VTEwpOwogCVZEQkcoY2RldiwgIiVzIGRpc2FibGVkXG4iLCBsb29wLT5mdW5jdGlvbi5uYW1lKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2ZfbWFzc19zdG9yYWdlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuYwppbmRleCA4MTE5MjljLi4zY2MxMDlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9tYXNzX3N0b3JhZ2UuYwpAQCAtMTA4NSw3ICsxMDg1LDcgQEAKIAlpZiAoIWN1cmx1bikgewkJLyogVW5zdXBwb3J0ZWQgTFVOcyBhcmUgb2theSAqLwogCQljb21tb24tPmJhZF9sdW5fb2theSA9IDE7CiAJCW1lbXNldChidWYsIDAsIDM2KTsKLQkJYnVmWzBdID0gMHg3ZjsJCS8qIFVuc3VwcG9ydGVkLCBubyBkZXZpY2UtdHlwZSAqLworCQlidWZbMF0gPSBUWVBFX05PX0xVTjsJLyogVW5zdXBwb3J0ZWQsIG5vIGRldmljZS10eXBlICovCiAJCWJ1Zls0XSA9IDMxOwkJLyogQWRkaXRpb25hbCBsZW5ndGggKi8KIAkJcmV0dXJuIDM2OwogCX0KQEAgLTI2MjQsMTMgKzI2MjQsMTAgQEAKIAlyZXR1cm4gZnNnX3N0b3JlX2ZpbGUoY3VybHVuLCBmaWxlc2VtLCBidWYsIGNvdW50KTsKIH0KIAotc3RhdGljIERFVklDRV9BVFRSX1JXKHJvKTsKIHN0YXRpYyBERVZJQ0VfQVRUUl9SVyhub2Z1YSk7Ci1zdGF0aWMgREVWSUNFX0FUVFJfUlcoZmlsZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBkZXZfYXR0cl9yb19jZHJvbSA9IF9fQVRUUl9STyhybyk7Ci1zdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHJfZmlsZV9ub25yZW1vdmFibGUgPSBfX0FUVFJfUk8oZmlsZSk7Ci0KKy8qIG1vZGUgd2lsIGJlIHNldCBpbiBmc2dfbHVuX2F0dHJfaXNfdmlzaWJsZSgpICovCitzdGF0aWMgREVWSUNFX0FUVFIocm8sIDAsIHJvX3Nob3csIHJvX3N0b3JlKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihmaWxlLCAwLCBmaWxlX3Nob3csIGZpbGVfc3RvcmUpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEZTRyBDT01NT04gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yNzQ1LDQwICsyNzQyLDEwIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChmc2dfY29tbW9uX3NldF9udW1fYnVmZmVycyk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmc2dfY29tbW9uX3JlbW92ZV9zeXNmcyhzdHJ1Y3QgZnNnX2x1biAqbHVuKQotewotCWRldmljZV9yZW1vdmVfZmlsZSgmbHVuLT5kZXYsICZkZXZfYXR0cl9ub2Z1YSk7Ci0JLyoKLQkgKiBkZXZpY2VfcmVtb3ZlX2ZpbGUoKSA9PgotCSAqCi0JICogaGVyZSB0aGUgYXR0ciAoZS5nLiBkZXZfYXR0cl9ybykgaXMgb25seSB1c2VkIHRvIGJlIHBhc3NlZCB0bzoKLQkgKgotCSAqCXN5c2ZzX3JlbW92ZV9maWxlKCkgPT4KLQkgKgotCSAqCWhlcmUgZS5nLiBib3RoIGRldl9hdHRyX3JvX2Nkcm9tIGFuZCBkZXZfYXR0cl9ybyBhcmUgaW4KLQkgKgl0aGUgc2FtZSBuYW1lc3BhY2UgYW5kCi0JICoJZnJvbSBoZXJlIG9ubHkgYXR0ci0+bmFtZSBpcyBwYXNzZWQgdG86Ci0JICoKLQkgKgkJc3lzZnNfaGFzaF9hbmRfcmVtb3ZlKCkKLQkgKgotCSAqCQlhdHRyLT5uYW1lIGlzIHRoZSBzYW1lIGZvciBkZXZfYXR0cl9yb19jZHJvbSBhbmQKLQkgKgkJZGV2X2F0dHJfcm8KLQkgKgkJYXR0ci0+bmFtZSBpcyB0aGUgc2FtZSBmb3IgZGV2X2F0dHJfZmlsZSBhbmQKLQkgKgkJZGV2X2F0dHJfZmlsZV9ub25yZW1vdmFibGUKLQkgKgotCSAqIHNvIHdlIGRvbid0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiByZW1vdmluZyBlLmcuIGRldl9hdHRyX3JvX2Nkcm9tCi0JICogYW5kIGRldl9hdHRyX3JvCi0JICovCi0JZGV2aWNlX3JlbW92ZV9maWxlKCZsdW4tPmRldiwgJmRldl9hdHRyX3JvKTsKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJmx1bi0+ZGV2LCAmZGV2X2F0dHJfZmlsZSk7Ci19Ci0KIHZvaWQgZnNnX2NvbW1vbl9yZW1vdmVfbHVuKHN0cnVjdCBmc2dfbHVuICpsdW4sIGJvb2wgc3lzZnMpCiB7Ci0JaWYgKHN5c2ZzKSB7Ci0JCWZzZ19jb21tb25fcmVtb3ZlX3N5c2ZzKGx1bik7CisJaWYgKHN5c2ZzKQogCQlkZXZpY2VfdW5yZWdpc3RlcigmbHVuLT5kZXYpOwotCX0KIAlmc2dfbHVuX2Nsb3NlKGx1bik7CiAJa2ZyZWUobHVuKTsKIH0KQEAgLTI4NzcsNDIgKzI4NDQsMzYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGZzZ19jb21tb25fc2V0X2NkZXYpOwogCi1zdGF0aWMgaW5saW5lIGludCBmc2dfY29tbW9uX2FkZF9zeXNmcyhzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLAotCQkJCSAgICAgICBzdHJ1Y3QgZnNnX2x1biAqbHVuKQorc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKmZzZ19sdW5fZGV2X2F0dHJzW10gPSB7CisJJmRldl9hdHRyX3JvLmF0dHIsCisJJmRldl9hdHRyX2ZpbGUuYXR0ciwKKwkmZGV2X2F0dHJfbm9mdWEuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgdW1vZGVfdCBmc2dfbHVuX2Rldl9pc192aXNpYmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJCSAgICAgIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsIGludCBpZHgpCiB7Ci0JaW50IHJjOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGtvYmpfdG9fZGV2KGtvYmopOworCXN0cnVjdCBmc2dfbHVuICpsdW4gPSBmc2dfbHVuX2Zyb21fZGV2KGRldik7CiAKLQlyYyA9IGRldmljZV9yZWdpc3RlcigmbHVuLT5kZXYpOwotCWlmIChyYykgewotCQlwdXRfZGV2aWNlKCZsdW4tPmRldik7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQlyYyA9IGRldmljZV9jcmVhdGVfZmlsZSgmbHVuLT5kZXYsCi0JCQkJbHVuLT5jZHJvbQotCQkJICAgICAgPyAmZGV2X2F0dHJfcm9fY2Ryb20KLQkJCSAgICAgIDogJmRldl9hdHRyX3JvKTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyb3I7Ci0JcmMgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJmx1bi0+ZGV2LAotCQkJCWx1bi0+cmVtb3ZhYmxlCi0JCQkgICAgICA/ICZkZXZfYXR0cl9maWxlCi0JCQkgICAgICA6ICZkZXZfYXR0cl9maWxlX25vbnJlbW92YWJsZSk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycm9yOwotCXJjID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZsdW4tPmRldiwgJmRldl9hdHRyX25vZnVhKTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXR1cm4gMDsKLQotZXJyb3I6Ci0JLyogcmVtb3Zpbmcgbm9uZXhpc3RlbnQgZmlsZXMgaXMgYSBuby1vcCAqLwotCWZzZ19jb21tb25fcmVtb3ZlX3N5c2ZzKGx1bik7Ci0JZGV2aWNlX3VucmVnaXN0ZXIoJmx1bi0+ZGV2KTsKLQlyZXR1cm4gcmM7CisJaWYgKGF0dHIgPT0gJmRldl9hdHRyX3JvLmF0dHIpCisJCXJldHVybiBsdW4tPmNkcm9tID8gU19JUlVHTyA6IChTX0lXVVNSIHwgU19JUlVHTyk7CisJaWYgKGF0dHIgPT0gJmRldl9hdHRyX2ZpbGUuYXR0cikKKwkJcmV0dXJuIGx1bi0+cmVtb3ZhYmxlID8gKFNfSVdVU1IgfCBTX0lSVUdPKSA6IFNfSVJVR087CisJcmV0dXJuIGF0dHItPm1vZGU7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGZzZ19sdW5fZGV2X2dyb3VwID0geworCS5hdHRycyA9IGZzZ19sdW5fZGV2X2F0dHJzLAorCS5pc192aXNpYmxlID0gZnNnX2x1bl9kZXZfaXNfdmlzaWJsZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpmc2dfbHVuX2Rldl9ncm91cHNbXSA9IHsKKwkmZnNnX2x1bl9kZXZfZ3JvdXAsCisJTlVMTAorfTsKKwogaW50IGZzZ19jb21tb25fY3JlYXRlX2x1bihzdHJ1Y3QgZnNnX2NvbW1vbiAqY29tbW9uLCBzdHJ1Y3QgZnNnX2x1bl9jb25maWcgKmNmZywKIAkJCSAgdW5zaWduZWQgaW50IGlkLCBjb25zdCBjaGFyICpuYW1lLAogCQkJICBjb25zdCBjaGFyICoqbmFtZV9wZngpCkBAIC0yOTQ5LDEzICsyOTEwLDE1IEBACiAJfSBlbHNlIHsKIAkJbHVuLT5kZXYucmVsZWFzZSA9IGZzZ19sdW5fcmVsZWFzZTsKIAkJbHVuLT5kZXYucGFyZW50ID0gJmNvbW1vbi0+Z2FkZ2V0LT5kZXY7CisJCWx1bi0+ZGV2Lmdyb3VwcyA9IGZzZ19sdW5fZGV2X2dyb3VwczsKIAkJZGV2X3NldF9kcnZkYXRhKCZsdW4tPmRldiwgJmNvbW1vbi0+ZmlsZXNlbSk7CiAJCWRldl9zZXRfbmFtZSgmbHVuLT5kZXYsICIlcyIsIG5hbWUpOwogCQlsdW4tPm5hbWUgPSBkZXZfbmFtZSgmbHVuLT5kZXYpOwogCi0JCXJjID0gZnNnX2NvbW1vbl9hZGRfc3lzZnMoY29tbW9uLCBsdW4pOworCQlyYyA9IGRldmljZV9yZWdpc3RlcigmbHVuLT5kZXYpOwogCQlpZiAocmMpIHsKIAkJCXByX2luZm8oImZhaWxlZCB0byByZWdpc3RlciBMVU4lZDogJWRcbiIsIGlkLCByYyk7CisJCQlwdXRfZGV2aWNlKCZsdW4tPmRldik7CiAJCQlnb3RvIGVycm9yX3N5c2ZzOwogCQl9CiAJfQpAQCAtMjk4OCwxMCArMjk1MSw4IEBACiAJcmV0dXJuIDA7CiAKIGVycm9yX2x1bjoKLQlpZiAoY29tbW9uLT5zeXNmcykgewotCQlmc2dfY29tbW9uX3JlbW92ZV9zeXNmcyhsdW4pOworCWlmIChjb21tb24tPnN5c2ZzKQogCQlkZXZpY2VfdW5yZWdpc3RlcigmbHVuLT5kZXYpOwotCX0KIAlmc2dfbHVuX2Nsb3NlKGx1bik7CiAJY29tbW9uLT5sdW5zW2lkXSA9IE5VTEw7CiBlcnJvcl9zeXNmczoKQEAgLTMwNzcsOCArMzAzOCw2IEBACiAJCQlzdHJ1Y3QgZnNnX2x1biAqbHVuID0gKmx1bl9pdDsKIAkJCWlmICghbHVuKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKGNvbW1vbi0+c3lzZnMpCi0JCQkJZnNnX2NvbW1vbl9yZW1vdmVfc3lzZnMobHVuKTsKIAkJCWZzZ19sdW5fY2xvc2UobHVuKTsKIAkJCWlmIChjb21tb24tPnN5c2ZzKQogCQkJCWRldmljZV91bnJlZ2lzdGVyKCZsdW4tPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9wcmludGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9wcmludGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxNzNkZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3ByaW50ZXIuYwpAQCAtMCwwICsxLDE0NzEgQEAKKy8qCisgKiBmX3ByaW50ZXIuYyAtIFVTQiBwcmludGVyIGZ1bmN0aW9uIGRyaXZlcgorICoKKyAqIENvcGllZCBmcm9tIGRyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvcHJpbnRlci5jLAorICogd2hpY2ggd2FzOgorICoKKyAqIHByaW50ZXIuYyAtLSBQcmludGVyIGdhZGdldCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSBEYXZpZCBCcm93bmVsbAorICogQ29weXJpZ2h0IChDKSAyMDA2IENyYWlnIFcuIE5hZGxlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9jb21wb3NpdGUuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2dfcHJpbnRlci5oPgorCisjaW5jbHVkZSAidV9wcmludGVyLmgiCisKKyNkZWZpbmUgUE5QX1NUUklOR19MRU4JCTEwMjQKKyNkZWZpbmUgUFJJTlRFUl9NSU5PUlMJCTQKKyNkZWZpbmUgR0VUX0RFVklDRV9JRAkJMAorI2RlZmluZSBHRVRfUE9SVF9TVEFUVVMJCTEKKyNkZWZpbmUgU09GVF9SRVNFVAkJMgorCitzdGF0aWMgaW50IG1ham9yLCBtaW5vcnM7CitzdGF0aWMgc3RydWN0IGNsYXNzICp1c2JfZ2FkZ2V0X2NsYXNzOworc3RhdGljIERFRklORV9JREEocHJpbnRlcl9pZGEpOworc3RhdGljIERFRklORV9NVVRFWChwcmludGVyX2lkYV9sb2NrKTsgLyogcHJvdGVjdHMgYWNjZXNzIGRvIHByaW50ZXJfaWRhICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0cnVjdCBwcmludGVyX2RldiB7CisJc3BpbmxvY2tfdAkJbG9jazsJCS8qIGxvY2sgdGhpcyBzdHJ1Y3R1cmUgKi8KKwkvKiBsb2NrIGJ1ZmZlciBsaXN0cyBkdXJpbmcgcmVhZC93cml0ZSBjYWxscyAqLworCXN0cnVjdCBtdXRleAkJbG9ja19wcmludGVyX2lvOworCXN0cnVjdCB1c2JfZ2FkZ2V0CSpnYWRnZXQ7CisJczgJCQlpbnRlcmZhY2U7CisJc3RydWN0IHVzYl9lcAkJKmluX2VwLCAqb3V0X2VwOworCisJc3RydWN0IGxpc3RfaGVhZAlyeF9yZXFzOwkvKiBMaXN0IG9mIGZyZWUgUlggc3RydWN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQJcnhfcmVxc19hY3RpdmU7CS8qIExpc3Qgb2YgQWN0aXZlIFJYIHhmZXJzICovCisJc3RydWN0IGxpc3RfaGVhZAlyeF9idWZmZXJzOwkvKiBMaXN0IG9mIGNvbXBsZXRlZCB4ZmVycyAqLworCS8qIHdhaXQgdW50aWwgdGhlcmUgaXMgZGF0YSB0byBiZSByZWFkLiAqLworCXdhaXRfcXVldWVfaGVhZF90CXJ4X3dhaXQ7CisJc3RydWN0IGxpc3RfaGVhZAl0eF9yZXFzOwkvKiBMaXN0IG9mIGZyZWUgVFggc3RydWN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQJdHhfcmVxc19hY3RpdmU7IC8qIExpc3Qgb2YgQWN0aXZlIFRYIHhmZXJzICovCisJLyogV2FpdCB1bnRpbCB0aGVyZSBhcmUgd3JpdGUgYnVmZmVycyBhdmFpbGFibGUgdG8gdXNlLiAqLworCXdhaXRfcXVldWVfaGVhZF90CXR4X3dhaXQ7CisJLyogV2FpdCB1bnRpbCBhbGwgd3JpdGUgYnVmZmVycyBoYXZlIGJlZW4gc2VudC4gKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdAl0eF9mbHVzaF93YWl0OworCXN0cnVjdCB1c2JfcmVxdWVzdAkqY3VycmVudF9yeF9yZXE7CisJc2l6ZV90CQkJY3VycmVudF9yeF9ieXRlczsKKwl1OAkJCSpjdXJyZW50X3J4X2J1ZjsKKwl1OAkJCXByaW50ZXJfc3RhdHVzOworCXU4CQkJcmVzZXRfcHJpbnRlcjsKKwlpbnQJCQltaW5vcjsKKwlzdHJ1Y3QgY2RldgkJcHJpbnRlcl9jZGV2OworCXU4CQkJcHJpbnRlcl9jZGV2X29wZW47CisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKKwl1bnNpZ25lZAkJcV9sZW47CisJY2hhcgkJCSpwbnBfc3RyaW5nOwkvKiBXZSBkb24ndCBvd24gbWVtb3J5ISAqLworCXN0cnVjdCB1c2JfZnVuY3Rpb24JZnVuY3Rpb247Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwcmludGVyX2RldiAqZnVuY190b19wcmludGVyKHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihmLCBzdHJ1Y3QgcHJpbnRlcl9kZXYsIGZ1bmN0aW9uKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyoKKyAqIERFU0NSSVBUT1JTIC4uLiBtb3N0IGFyZSBzdGF0aWMsIGJ1dCBzdHJpbmdzIGFuZCAoZnVsbCkgY29uZmlndXJhdGlvbgorICogZGVzY3JpcHRvcnMgYXJlIGJ1aWx0IG9uIGRlbWFuZC4KKyAqLworCisvKiBob2xkcyBvdXIgYmlnZ2VzdCBkZXNjcmlwdG9yICovCisjZGVmaW5lIFVTQl9ERVNDX0JVRlNJWkUJCTI1NgorI2RlZmluZSBVU0JfQlVGU0laRQkJCTgxOTIKKworc3RhdGljIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgaW50Zl9kZXNjID0geworCS5iTGVuZ3RoID0JCXNpemVvZihpbnRmX2Rlc2MpLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfSU5URVJGQUNFLAorCS5iTnVtRW5kcG9pbnRzID0JMiwKKwkuYkludGVyZmFjZUNsYXNzID0JVVNCX0NMQVNTX1BSSU5URVIsCisJLmJJbnRlcmZhY2VTdWJDbGFzcyA9CTEsCS8qIFByaW50ZXIgU3ViLUNsYXNzICovCisJLmJJbnRlcmZhY2VQcm90b2NvbCA9CTIsCS8qIEJpLURpcmVjdGlvbmFsICovCisJLmlJbnRlcmZhY2UgPQkJMAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBmc19lcF9pbl9kZXNjID0geworCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCisJLmJFbmRwb2ludEFkZHJlc3MgPQlVU0JfRElSX0lOLAorCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSworfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBmc19lcF9vdXRfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAorCS5iRW5kcG9pbnRBZGRyZXNzID0JVVNCX0RJUl9PVVQsCisJLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqZnNfcHJpbnRlcl9mdW5jdGlvbltdID0geworCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZpbnRmX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX2VwX2luX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX2VwX291dF9kZXNjLAorCU5VTEwKK307CisKKy8qCisgKiB1c2IgMi4wIGRldmljZXMgbmVlZCB0byBleHBvc2UgYm90aCBoaWdoIHNwZWVkIGFuZCBmdWxsIHNwZWVkCisgKiBkZXNjcmlwdG9ycywgdW5sZXNzIHRoZXkgb25seSBydW4gYXQgZnVsbCBzcGVlZC4KKyAqLworCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGhzX2VwX2luX2Rlc2MgPSB7CisJLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKKwkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCisJLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoNTEyKQorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBoc19lcF9vdXRfZGVzYyA9IHsKKwkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAorCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNig1MTIpCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9xdWFsaWZpZXJfZGVzY3JpcHRvciBkZXZfcXVhbGlmaWVyID0geworCS5iTGVuZ3RoID0JCXNpemVvZihkZXZfcXVhbGlmaWVyKSwKKwkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0RFVklDRV9RVUFMSUZJRVIsCisJLmJjZFVTQiA9CQljcHVfdG9fbGUxNigweDAyMDApLAorCS5iRGV2aWNlQ2xhc3MgPQkJVVNCX0NMQVNTX1BSSU5URVIsCisJLmJOdW1Db25maWd1cmF0aW9ucyA9CTEKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpoc19wcmludGVyX2Z1bmN0aW9uW10gPSB7CisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmludGZfZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfZXBfaW5fZGVzYywKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfZXBfb3V0X2Rlc2MsCisJTlVMTAorfTsKKworLyoKKyAqIEFkZGVkIGVuZHBvaW50IGRlc2NyaXB0b3JzIGZvciAzLjAgZGV2aWNlcworICovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3NfZXBfaW5fZGVzYyA9IHsKKwkuYkxlbmd0aCA9ICAgICAgICAgICAgICBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlID0gICAgICBVU0JfRFRfRU5EUE9JTlQsCisJLmJtQXR0cmlidXRlcyA9ICAgICAgICAgVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKKwkud01heFBhY2tldFNpemUgPSAgICAgICBjcHVfdG9fbGUxNigxMDI0KSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzc19lcF9pbl9jb21wX2Rlc2MgPSB7CisJLmJMZW5ndGggPSAgICAgICAgICAgICAgc2l6ZW9mKHNzX2VwX2luX2NvbXBfZGVzYyksCisJLmJEZXNjcmlwdG9yVHlwZSA9ICAgICAgVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCit9OworCitzdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIHNzX2VwX291dF9kZXNjID0geworCS5iTGVuZ3RoID0gICAgICAgICAgICAgIFVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUgPSAgICAgIFVTQl9EVF9FTkRQT0lOVCwKKwkuYm1BdHRyaWJ1dGVzID0gICAgICAgICBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAorCS53TWF4UGFja2V0U2l6ZSA9ICAgICAgIGNwdV90b19sZTE2KDEwMjQpLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX2VwX291dF9jb21wX2Rlc2MgPSB7CisJLmJMZW5ndGggPSAgICAgICAgICAgICAgc2l6ZW9mKHNzX2VwX291dF9jb21wX2Rlc2MpLAorCS5iRGVzY3JpcHRvclR5cGUgPSAgICAgIFVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAorfTsKKworc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKnNzX3ByaW50ZXJfZnVuY3Rpb25bXSA9IHsKKwkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaW50Zl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19lcF9pbl9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19lcF9pbl9jb21wX2Rlc2MsCisJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX2VwX291dF9kZXNjLAorCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19lcF9vdXRfY29tcF9kZXNjLAorCU5VTEwKK307CisKKy8qIG1heHBhY2tldCBhbmQgb3RoZXIgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWNzIHZhcnkgYnkgc3BlZWQuICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfZGVzYyhzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LAorCQkJCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmZzLAorCQkJCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmhzLAorCQkJCQlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKnNzKQoreworCXN3aXRjaCAoZ2FkZ2V0LT5zcGVlZCkgeworCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgorCQlyZXR1cm4gc3M7CisJY2FzZSBVU0JfU1BFRURfSElHSDoKKwkJcmV0dXJuIGhzOworCWRlZmF1bHQ6CisJCXJldHVybiBmczsKKwl9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX3JlcXVlc3QgKgorcHJpbnRlcl9yZXFfYWxsb2Moc3RydWN0IHVzYl9lcCAqZXAsIHVuc2lnbmVkIGxlbiwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOworCisJcmVxID0gdXNiX2VwX2FsbG9jX3JlcXVlc3QoZXAsIGdmcF9mbGFncyk7CisKKwlpZiAocmVxICE9IE5VTEwpIHsKKwkJcmVxLT5sZW5ndGggPSBsZW47CisJCXJlcS0+YnVmID0ga21hbGxvYyhsZW4sIGdmcF9mbGFncyk7CisJCWlmIChyZXEtPmJ1ZiA9PSBOVUxMKSB7CisJCQl1c2JfZXBfZnJlZV9yZXF1ZXN0KGVwLCByZXEpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVxOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRlcl9yZXFfZnJlZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCit7CisJaWYgKGVwICE9IE5VTEwgJiYgcmVxICE9IE5VTEwpIHsKKwkJa2ZyZWUocmVxLT5idWYpOworCQl1c2JfZXBfZnJlZV9yZXF1ZXN0KGVwLCByZXEpOworCX0KK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQgcnhfY29tcGxldGUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBwcmludGVyX2RldgkqZGV2ID0gZXAtPmRyaXZlcl9kYXRhOworCWludAkJCXN0YXR1cyA9IHJlcS0+c3RhdHVzOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsJLyogUmVtb2RlIGZyb20gQWN0aXZlIExpc3QgKi8KKworCXN3aXRjaCAoc3RhdHVzKSB7CisKKwkvKiBub3JtYWwgY29tcGxldGlvbiAqLworCWNhc2UgMDoKKwkJaWYgKHJlcS0+YWN0dWFsID4gMCkgeworCQkJbGlzdF9hZGRfdGFpbCgmcmVxLT5saXN0LCAmZGV2LT5yeF9idWZmZXJzKTsKKwkJCURCRyhkZXYsICJHX1ByaW50ZXIgOiByeCBsZW5ndGggJWRcbiIsIHJlcS0+YWN0dWFsKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOworCQl9CisJCWJyZWFrOworCisJLyogc29mdHdhcmUtZHJpdmVuIGludGVyZmFjZSBzaHV0ZG93biAqLworCWNhc2UgLUVDT05OUkVTRVQ6CQkvKiB1bmxpbmsgKi8KKwljYXNlIC1FU0hVVERPV046CQkvKiBkaXNjb25uZWN0IGV0YyAqLworCQlWREJHKGRldiwgInJ4IHNodXRkb3duLCBjb2RlICVkXG4iLCBzdGF0dXMpOworCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKKwkJYnJlYWs7CisKKwkvKiBmb3IgaGFyZHdhcmUgYXV0b21hZ2ljIChzdWNoIGFzIHB4YSkgKi8KKwljYXNlIC1FQ09OTkFCT1JURUQ6CQkvKiBlbmRwb2ludCByZXNldCAqLworCQlEQkcoZGV2LCAicnggJXMgcmVzZXRcbiIsIGVwLT5uYW1lKTsKKwkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CisJCWJyZWFrOworCisJLyogZGF0YSBvdmVycnVuICovCisJY2FzZSAtRU9WRVJGTE9XOgorCQkvKiBGQUxMVEhST1VHSCAqLworCisJZGVmYXVsdDoKKwkJREJHKGRldiwgInJ4IHN0YXR1cyAlZFxuIiwgc3RhdHVzKTsKKwkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CisJCWJyZWFrOworCX0KKworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5yeF93YWl0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgdHhfY29tcGxldGUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBwcmludGVyX2RldgkqZGV2ID0gZXAtPmRyaXZlcl9kYXRhOworCisJc3dpdGNoIChyZXEtPnN0YXR1cykgeworCWRlZmF1bHQ6CisJCVZEQkcoZGV2LCAidHggZXJyICVkXG4iLCByZXEtPnN0YXR1cyk7CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAtRUNPTk5SRVNFVDoJCS8qIHVubGluayAqLworCWNhc2UgLUVTSFVURE9XTjoJCS8qIGRpc2Nvbm5lY3QgZXRjICovCisJCWJyZWFrOworCWNhc2UgMDoKKwkJYnJlYWs7CisJfQorCisJc3Bpbl9sb2NrKCZkZXYtPmxvY2spOworCS8qIFRha2UgdGhlIHJlcXVlc3Qgc3RydWN0IG9mZiB0aGUgYWN0aXZlIGxpc3QgYW5kIHB1dCBpdCBvbiB0aGUKKwkgKiBmcmVlIGxpc3QuCisJICovCisJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKKwlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT50eF9yZXFzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+dHhfd2FpdCk7CisJaWYgKGxpa2VseShsaXN0X2VtcHR5KCZkZXYtPnR4X3JlcXNfYWN0aXZlKSkpCisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT50eF9mbHVzaF93YWl0KTsKKworCXNwaW5fdW5sb2NrKCZkZXYtPmxvY2spOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50CitwcmludGVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZkKQoreworCXN0cnVjdCBwcmludGVyX2RldgkqZGV2OworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWludAkJCXJldCA9IC1FQlVTWTsKKworCWRldiA9IGNvbnRhaW5lcl9vZihpbm9kZS0+aV9jZGV2LCBzdHJ1Y3QgcHJpbnRlcl9kZXYsIHByaW50ZXJfY2Rldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWRldi0+cHJpbnRlcl9jZGV2X29wZW4pIHsKKwkJZGV2LT5wcmludGVyX2NkZXZfb3BlbiA9IDE7CisJCWZkLT5wcml2YXRlX2RhdGEgPSBkZXY7CisJCXJldCA9IDA7CisJCS8qIENoYW5nZSB0aGUgcHJpbnRlciBzdGF0dXMgdG8gc2hvdyB0aGF0IGl0J3Mgb24tbGluZS4gKi8KKwkJZGV2LT5wcmludGVyX3N0YXR1cyB8PSBQUklOVEVSX1NFTEVDVEVEOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJREJHKGRldiwgInByaW50ZXJfb3BlbiByZXR1cm5lZCAleFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitwcmludGVyX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmZCkKK3sKKwlzdHJ1Y3QgcHJpbnRlcl9kZXYJKmRldiA9IGZkLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJZGV2LT5wcmludGVyX2NkZXZfb3BlbiA9IDA7CisJZmQtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJLyogQ2hhbmdlIHByaW50ZXIgc3RhdHVzIHRvIHNob3cgdGhhdCB0aGUgcHJpbnRlciBpcyBvZmYtbGluZS4gKi8KKwlkZXYtPnByaW50ZXJfc3RhdHVzICY9IH5QUklOVEVSX1NFTEVDVEVEOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJREJHKGRldiwgInByaW50ZXJfY2xvc2VcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIHR1cm5lZCBvZmYuICovCitzdGF0aWMgdm9pZAorc2V0dXBfcnhfcmVxcyhzdHJ1Y3QgcHJpbnRlcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgICAgICAgICAgICAgICpyZXE7CisKKwl3aGlsZSAobGlrZWx5KCFsaXN0X2VtcHR5KCZkZXYtPnJ4X3JlcXMpKSkgeworCQlpbnQgZXJyb3I7CisKKwkJcmVxID0gY29udGFpbmVyX29mKGRldi0+cnhfcmVxcy5uZXh0LAorCQkJCXN0cnVjdCB1c2JfcmVxdWVzdCwgbGlzdCk7CisJCWxpc3RfZGVsX2luaXQoJnJlcS0+bGlzdCk7CisKKwkJLyogVGhlIFVTQiBIb3N0IHNlbmRzIHVzIHdoYXRldmVyIGFtb3VudCBvZiBkYXRhIGl0IHdhbnRzIHRvCisJCSAqIHNvIHdlIGFsd2F5cyBzZXQgdGhlIGxlbmd0aCBmaWVsZCB0byB0aGUgZnVsbCBVU0JfQlVGU0laRS4KKwkJICogSWYgdGhlIGFtb3VudCBvZiBkYXRhIGlzIG1vcmUgdGhhbiB0aGUgcmVhZCgpIGNhbGxlciBhc2tlZAorCQkgKiBmb3IgaXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHJlcXVlc3QgYnVmZmVyIHVudGlsIGl0IGlzCisJCSAqIGFza2VkIGZvciBieSByZWFkKCkuCisJCSAqLworCQlyZXEtPmxlbmd0aCA9IFVTQl9CVUZTSVpFOworCQlyZXEtPmNvbXBsZXRlID0gcnhfY29tcGxldGU7CisKKwkJLyogaGVyZSwgd2UgdW5sb2NrLCBhbmQgb25seSB1bmxvY2ssIHRvIGF2b2lkIGRlYWRsb2NrLiAqLworCQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsKKwkJZXJyb3IgPSB1c2JfZXBfcXVldWUoZGV2LT5vdXRfZXAsIHJlcSwgR0ZQX0FUT01JQyk7CisJCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsKKwkJaWYgKGVycm9yKSB7CisJCQlEQkcoZGV2LCAicnggc3VibWl0IC0tPiAlZFxuIiwgZXJyb3IpOworCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CisJCQlicmVhazsKKwkJfQorCQkvKiBpZiB0aGUgcmVxIGlzIGVtcHR5LCB0aGVuIGFkZCBpdCBpbnRvIGRldi0+cnhfcmVxc19hY3RpdmUuICovCisJCWVsc2UgaWYgKGxpc3RfZW1wdHkoJnJlcS0+bGlzdCkpCisJCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzX2FjdGl2ZSk7CisJfQorfQorCitzdGF0aWMgc3NpemVfdAorcHJpbnRlcl9yZWFkKHN0cnVjdCBmaWxlICpmZCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwdHIpCit7CisJc3RydWN0IHByaW50ZXJfZGV2CQkqZGV2ID0gZmQtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nCQkJZmxhZ3M7CisJc2l6ZV90CQkJCXNpemU7CisJc2l6ZV90CQkJCWJ5dGVzX2NvcGllZDsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QJCSpyZXE7CisJLyogVGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgVVNCIHJ4IHJlcXVlc3QuICovCisJc3RydWN0IHVzYl9yZXF1ZXN0CQkqY3VycmVudF9yeF9yZXE7CisJLyogVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjdXJyZW50IHJ4IGJ1ZmZlci4gKi8KKwlzaXplX3QJCQkJY3VycmVudF9yeF9ieXRlczsKKwkvKiBUaGlzIGlzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCByeCBidWZmZXIuICovCisJdTgJCQkJKmN1cnJlbnRfcnhfYnVmOworCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURCRyhkZXYsICJwcmludGVyX3JlYWQgdHJ5aW5nIHRvIHJlYWQgJWQgYnl0ZXNcbiIsIChpbnQpbGVuKTsKKworCW11dGV4X2xvY2soJmRldi0+bG9ja19wcmludGVyX2lvKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBXZSB3aWxsIHVzZSB0aGlzIGZsYWcgbGF0ZXIgdG8gY2hlY2sgaWYgYSBwcmludGVyIHJlc2V0IGhhcHBlbmVkCisJICogYWZ0ZXIgd2UgdHVybiBpbnRlcnJ1cHRzIGJhY2sgb24uCisJICovCisJZGV2LT5yZXNldF9wcmludGVyID0gMDsKKworCXNldHVwX3J4X3JlcXMoZGV2KTsKKworCWJ5dGVzX2NvcGllZCA9IDA7CisJY3VycmVudF9yeF9yZXEgPSBkZXYtPmN1cnJlbnRfcnhfcmVxOworCWN1cnJlbnRfcnhfYnl0ZXMgPSBkZXYtPmN1cnJlbnRfcnhfYnl0ZXM7CisJY3VycmVudF9yeF9idWYgPSBkZXYtPmN1cnJlbnRfcnhfYnVmOworCWRldi0+Y3VycmVudF9yeF9yZXEgPSBOVUxMOworCWRldi0+Y3VycmVudF9yeF9ieXRlcyA9IDA7CisJZGV2LT5jdXJyZW50X3J4X2J1ZiA9IE5VTEw7CisKKwkvKiBDaGVjayBpZiB0aGVyZSBpcyBhbnkgZGF0YSBpbiB0aGUgcmVhZCBidWZmZXJzLiBQbGVhc2Ugbm90ZSB0aGF0CisJICogY3VycmVudF9yeF9ieXRlcyBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBjdXJyZW50IHJ4IGJ1ZmZlci4KKwkgKiBJZiBpdCBpcyB6ZXJvIHRoZW4gY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBvdGhlciByeF9idWZmZXJzIHRoYXQKKwkgKiBhcmUgb24gdGhlIGNvbXBsZXRlZCBsaXN0LiBXZSBhcmUgb25seSBvdXQgb2YgZGF0YSBpZiBhbGwgcngKKwkgKiBidWZmZXJzIGFyZSBlbXB0eS4KKwkgKi8KKwlpZiAoKGN1cnJlbnRfcnhfYnl0ZXMgPT0gMCkgJiYKKwkJCShsaWtlbHkobGlzdF9lbXB0eSgmZGV2LT5yeF9idWZmZXJzKSkpKSB7CisJCS8qIFR1cm4gaW50ZXJydXB0cyBiYWNrIG9uIGJlZm9yZSBzbGVlcGluZy4gKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwkJLyoKKwkJICogSWYgbm8gZGF0YSBpcyBhdmFpbGFibGUgY2hlY2sgaWYgdGhpcyBpcyBhIE5PTi1CbG9ja2luZworCQkgKiBjYWxsIG9yIG5vdC4KKwkJICovCisJCWlmIChmZC0+Zl9mbGFncyAmIChPX05PTkJMT0NLfE9fTkRFTEFZKSkgeworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCisJCS8qIFNsZWVwIHVudGlsIGRhdGEgaXMgYXZhaWxhYmxlICovCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPnJ4X3dhaXQsCisJCQkJKGxpa2VseSghbGlzdF9lbXB0eSgmZGV2LT5yeF9idWZmZXJzKSkpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCX0KKworCS8qIFdlIGhhdmUgZGF0YSB0byByZXR1cm4gdGhlbiBjb3B5IGl0IHRvIHRoZSBjYWxsZXIncyBidWZmZXIuKi8KKwl3aGlsZSAoKGN1cnJlbnRfcnhfYnl0ZXMgfHwgbGlrZWx5KCFsaXN0X2VtcHR5KCZkZXYtPnJ4X2J1ZmZlcnMpKSkKKwkJCSYmIGxlbikgeworCQlpZiAoY3VycmVudF9yeF9ieXRlcyA9PSAwKSB7CisJCQlyZXEgPSBjb250YWluZXJfb2YoZGV2LT5yeF9idWZmZXJzLm5leHQsCisJCQkJCXN0cnVjdCB1c2JfcmVxdWVzdCwgbGlzdCk7CisJCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOworCisJCQlpZiAocmVxLT5hY3R1YWwgJiYgcmVxLT5idWYpIHsKKwkJCQljdXJyZW50X3J4X3JlcSA9IHJlcTsKKwkJCQljdXJyZW50X3J4X2J5dGVzID0gcmVxLT5hY3R1YWw7CisJCQkJY3VycmVudF9yeF9idWYgPSByZXEtPmJ1ZjsKKwkJCX0gZWxzZSB7CisJCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvKiBEb24ndCBsZWF2ZSBpcnFzIG9mZiB3aGlsZSBkb2luZyBtZW1vcnkgY29waWVzICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJCWlmIChsZW4gPiBjdXJyZW50X3J4X2J5dGVzKQorCQkJc2l6ZSA9IGN1cnJlbnRfcnhfYnl0ZXM7CisJCWVsc2UKKwkJCXNpemUgPSBsZW47CisKKwkJc2l6ZSAtPSBjb3B5X3RvX3VzZXIoYnVmLCBjdXJyZW50X3J4X2J1Ziwgc2l6ZSk7CisJCWJ5dGVzX2NvcGllZCArPSBzaXplOworCQlsZW4gLT0gc2l6ZTsKKwkJYnVmICs9IHNpemU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJCS8qIFdlJ3ZlIGRpc2Nvbm5lY3RlZCBvciByZXNldCBzbyByZXR1cm4uICovCisJCWlmIChkZXYtPnJlc2V0X3ByaW50ZXIpIHsKKwkJCWxpc3RfYWRkKCZjdXJyZW50X3J4X3JlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwkJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrX3ByaW50ZXJfaW8pOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKworCQkvKiBJZiB3ZSBub3QgcmV0dXJuaW5nIGFsbCB0aGUgZGF0YSBsZWZ0IGluIHRoaXMgUlggcmVxdWVzdAorCQkgKiBidWZmZXIgdGhlbiBhZGp1c3QgdGhlIGFtb3VudCBvZiBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlci4KKwkJICogT3RoZXdpc2UgaWYgd2UgYXJlIGRvbmUgd2l0aCB0aGlzIFJYIHJlcXVlc3QgYnVmZmVyIHRoZW4KKwkJICogcmVxdWV1ZSBpdCB0byBnZXQgYW55IGluY29taW5nIGRhdGEgZnJvbSB0aGUgVVNCIGhvc3QuCisJCSAqLworCQlpZiAoc2l6ZSA8IGN1cnJlbnRfcnhfYnl0ZXMpIHsKKwkJCWN1cnJlbnRfcnhfYnl0ZXMgLT0gc2l6ZTsKKwkJCWN1cnJlbnRfcnhfYnVmICs9IHNpemU7CisJCX0gZWxzZSB7CisJCQlsaXN0X2FkZCgmY3VycmVudF9yeF9yZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOworCQkJY3VycmVudF9yeF9ieXRlcyA9IDA7CisJCQljdXJyZW50X3J4X2J1ZiA9IE5VTEw7CisJCQljdXJyZW50X3J4X3JlcSA9IE5VTEw7CisJCX0KKwl9CisKKwlkZXYtPmN1cnJlbnRfcnhfcmVxID0gY3VycmVudF9yeF9yZXE7CisJZGV2LT5jdXJyZW50X3J4X2J5dGVzID0gY3VycmVudF9yeF9ieXRlczsKKwlkZXYtPmN1cnJlbnRfcnhfYnVmID0gY3VycmVudF9yeF9idWY7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJmRldi0+bG9ja19wcmludGVyX2lvKTsKKworCURCRyhkZXYsICJwcmludGVyX3JlYWQgcmV0dXJuZWQgJWQgYnl0ZXNcbiIsIChpbnQpYnl0ZXNfY29waWVkKTsKKworCWlmIChieXRlc19jb3BpZWQpCisJCXJldHVybiBieXRlc19jb3BpZWQ7CisJZWxzZQorCQlyZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdGljIHNzaXplX3QKK3ByaW50ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZkLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnB0cikKK3sKKwlzdHJ1Y3QgcHJpbnRlcl9kZXYJKmRldiA9IGZkLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7CisJc2l6ZV90CQkJc2l6ZTsJLyogQW1vdW50IG9mIGRhdGEgaW4gYSBUWCByZXF1ZXN0LiAqLworCXNpemVfdAkJCWJ5dGVzX2NvcGllZCA9IDA7CisJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXE7CisKKwlEQkcoZGV2LCAicHJpbnRlcl93cml0ZSB0cnlpbmcgdG8gc2VuZCAlZCBieXRlc1xuIiwgKGludClsZW4pOworCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRldi0+bG9ja19wcmludGVyX2lvKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwkvKiBDaGVjayBpZiBhIHByaW50ZXIgcmVzZXQgaGFwcGVucyB3aGlsZSB3ZSBoYXZlIGludGVycnVwdHMgb24gKi8KKwlkZXYtPnJlc2V0X3ByaW50ZXIgPSAwOworCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IGF2YWlsYWJsZSB3cml0ZSBidWZmZXJzICovCisJaWYgKGxpa2VseShsaXN0X2VtcHR5KCZkZXYtPnR4X3JlcXMpKSkgeworCQkvKiBUdXJuIGludGVycnVwdHMgYmFjayBvbiBiZWZvcmUgc2xlZXBpbmcuICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJCS8qCisJCSAqIElmIHdyaXRlIGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSBjaGVjayBpZiB0aGlzIGlzCisJCSAqIGEgTk9OLUJsb2NraW5nIGNhbGwgb3Igbm90LgorCQkgKi8KKwkJaWYgKGZkLT5mX2ZsYWdzICYgKE9fTk9OQkxPQ0t8T19OREVMQVkpKSB7CisJCQltdXRleF91bmxvY2soJmRldi0+bG9ja19wcmludGVyX2lvKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisKKwkJLyogU2xlZXAgdW50aWwgYSB3cml0ZSBidWZmZXIgaXMgYXZhaWxhYmxlICovCisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPnR4X3dhaXQsCisJCQkJKGxpa2VseSghbGlzdF9lbXB0eSgmZGV2LT50eF9yZXFzKSkpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCX0KKworCXdoaWxlIChsaWtlbHkoIWxpc3RfZW1wdHkoJmRldi0+dHhfcmVxcykpICYmIGxlbikgeworCisJCWlmIChsZW4gPiBVU0JfQlVGU0laRSkKKwkJCXNpemUgPSBVU0JfQlVGU0laRTsKKwkJZWxzZQorCQkJc2l6ZSA9IGxlbjsKKworCQlyZXEgPSBjb250YWluZXJfb2YoZGV2LT50eF9yZXFzLm5leHQsIHN0cnVjdCB1c2JfcmVxdWVzdCwKKwkJCQlsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKKworCQlyZXEtPmNvbXBsZXRlID0gdHhfY29tcGxldGU7CisJCXJlcS0+bGVuZ3RoID0gc2l6ZTsKKworCQkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIHNlbmQgYSB6ZXJvIGxlbmd0aCBwYWNrZXQuICovCisJCWlmIChsZW4gPiBzaXplKQorCQkJLyogVGhleSB3aWxsIGJlIG1vcmUgVFggcmVxdWVzdHMgc28gbm8geWV0LiAqLworCQkJcmVxLT56ZXJvID0gMDsKKwkJZWxzZQorCQkJLyogSWYgdGhlIGRhdGEgYW1vdW50IGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZQorCQkJICogbWF4cGFja2V0IHNpemUgdGhlbiBzZW5kIGEgemVybyBsZW5ndGggcGFja2V0LgorCQkJICovCisJCQlyZXEtPnplcm8gPSAoKGxlbiAlIGRldi0+aW5fZXAtPm1heHBhY2tldCkgPT0gMCk7CisKKwkJLyogRG9uJ3QgbGVhdmUgaXJxcyBvZmYgd2hpbGUgZG9pbmcgbWVtb3J5IGNvcGllcyAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIocmVxLT5idWYsIGJ1Ziwgc2l6ZSkpIHsKKwkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnR4X3JlcXMpOworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7CisJCQlyZXR1cm4gYnl0ZXNfY29waWVkOworCQl9CisKKwkJYnl0ZXNfY29waWVkICs9IHNpemU7CisJCWxlbiAtPSBzaXplOworCQlidWYgKz0gc2l6ZTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwkJLyogV2UndmUgZGlzY29ubmVjdGVkIG9yIHJlc2V0IHNvIGZyZWUgdGhlIHJlcSBhbmQgYnVmZmVyICovCisJCWlmIChkZXYtPnJlc2V0X3ByaW50ZXIpIHsKKwkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnR4X3JlcXMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJCQltdXRleF91bmxvY2soJmRldi0+bG9ja19wcmludGVyX2lvKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisKKwkJaWYgKHVzYl9lcF9xdWV1ZShkZXYtPmluX2VwLCByZXEsIEdGUF9BVE9NSUMpKSB7CisJCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT50eF9yZXFzKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCisJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnR4X3JlcXNfYWN0aXZlKTsKKworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrX3ByaW50ZXJfaW8pOworCisJREJHKGRldiwgInByaW50ZXJfd3JpdGUgc2VudCAlZCBieXRlc1xuIiwgKGludClieXRlc19jb3BpZWQpOworCisJaWYgKGJ5dGVzX2NvcGllZCkKKwkJcmV0dXJuIGJ5dGVzX2NvcGllZDsKKwllbHNlCisJCXJldHVybiAtRUFHQUlOOworfQorCitzdGF0aWMgaW50CitwcmludGVyX2ZzeW5jKHN0cnVjdCBmaWxlICpmZCwgbG9mZl90IHN0YXJ0LCBsb2ZmX3QgZW5kLCBpbnQgZGF0YXN5bmMpCit7CisJc3RydWN0IHByaW50ZXJfZGV2CSpkZXYgPSBmZC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZkKTsKKwl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwlpbnQJCQl0eF9saXN0X2VtcHR5OworCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwl0eF9saXN0X2VtcHR5ID0gKGxpa2VseShsaXN0X2VtcHR5KCZkZXYtPnR4X3JlcXMpKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXR4X2xpc3RfZW1wdHkpIHsKKwkJLyogU2xlZXAgdW50aWwgYWxsIGRhdGEgaGFzIGJlZW4gc2VudCAqLworCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2LT50eF9mbHVzaF93YWl0LAorCQkJCShsaWtlbHkobGlzdF9lbXB0eSgmZGV2LT50eF9yZXFzX2FjdGl2ZSkpKSk7CisJfQorCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3ByaW50ZXJfcG9sbChzdHJ1Y3QgZmlsZSAqZmQsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHByaW50ZXJfZGV2CSpkZXYgPSBmZC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWludAkJCXN0YXR1cyA9IDA7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCXNldHVwX3J4X3JlcXMoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJmRldi0+bG9ja19wcmludGVyX2lvKTsKKworCXBvbGxfd2FpdChmZCwgJmRldi0+cnhfd2FpdCwgd2FpdCk7CisJcG9sbF93YWl0KGZkLCAmZGV2LT50eF93YWl0LCB3YWl0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAobGlrZWx5KCFsaXN0X2VtcHR5KCZkZXYtPnR4X3JlcXMpKSkKKwkJc3RhdHVzIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJaWYgKGxpa2VseShkZXYtPmN1cnJlbnRfcnhfYnl0ZXMpIHx8CisJCQlsaWtlbHkoIWxpc3RfZW1wdHkoJmRldi0+cnhfYnVmZmVycykpKQorCQlzdGF0dXMgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGxvbmcKK3ByaW50ZXJfaW9jdGwoc3RydWN0IGZpbGUgKmZkLCB1bnNpZ25lZCBpbnQgY29kZSwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHByaW50ZXJfZGV2CSpkZXYgPSBmZC0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWludAkJCXN0YXR1cyA9IDA7CisKKwlEQkcoZGV2LCAicHJpbnRlcl9pb2N0bDogY21kPTB4JTQuNHgsIGFyZz0lbHVcbiIsIGNvZGUsIGFyZyk7CisKKwkvKiBoYW5kbGUgaW9jdGxzICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwlzd2l0Y2ggKGNvZGUpIHsKKwljYXNlIEdBREdFVF9HRVRfUFJJTlRFUl9TVEFUVVM6CisJCXN0YXR1cyA9IChpbnQpZGV2LT5wcmludGVyX3N0YXR1czsKKwkJYnJlYWs7CisJY2FzZSBHQURHRVRfU0VUX1BSSU5URVJfU1RBVFVTOgorCQlkZXYtPnByaW50ZXJfc3RhdHVzID0gKHU4KWFyZzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogY291bGQgbm90IGhhbmRsZSBpb2N0bCAqLworCQlEQkcoZGV2LCAicHJpbnRlcl9pb2N0bDogRVJST1IgY21kPTB4JTQuNHhpcyBub3Qgc3VwcG9ydGVkXG4iLAorCQkJCWNvZGUpOworCQlzdGF0dXMgPSAtRU5PVFRZOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyogdXNlZCBhZnRlciBlbmRwb2ludCBjb25maWd1cmF0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcmludGVyX2lvX29wZXJhdGlvbnMgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm9wZW4gPQkJcHJpbnRlcl9vcGVuLAorCS5yZWFkID0JCXByaW50ZXJfcmVhZCwKKwkud3JpdGUgPQlwcmludGVyX3dyaXRlLAorCS5mc3luYyA9CXByaW50ZXJfZnN5bmMsCisJLnBvbGwgPQkJcHJpbnRlcl9wb2xsLAorCS51bmxvY2tlZF9pb2N0bCA9IHByaW50ZXJfaW9jdGwsCisJLnJlbGVhc2UgPQlwcmludGVyX2Nsb3NlLAorCS5sbHNlZWsgPQlub29wX2xsc2VlaywKK307CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQKK3NldF9wcmludGVyX2ludGVyZmFjZShzdHJ1Y3QgcHJpbnRlcl9kZXYgKmRldikKK3sKKwlpbnQJCQlyZXN1bHQgPSAwOworCisJZGV2LT5pbl9lcC0+ZGVzYyA9IGVwX2Rlc2MoZGV2LT5nYWRnZXQsICZmc19lcF9pbl9kZXNjLCAmaHNfZXBfaW5fZGVzYywKKwkJCQkmc3NfZXBfaW5fZGVzYyk7CisJZGV2LT5pbl9lcC0+ZHJpdmVyX2RhdGEgPSBkZXY7CisKKwlkZXYtPm91dF9lcC0+ZGVzYyA9IGVwX2Rlc2MoZGV2LT5nYWRnZXQsICZmc19lcF9vdXRfZGVzYywKKwkJCQkgICAgJmhzX2VwX291dF9kZXNjLCAmc3NfZXBfb3V0X2Rlc2MpOworCWRldi0+b3V0X2VwLT5kcml2ZXJfZGF0YSA9IGRldjsKKworCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUoZGV2LT5pbl9lcCk7CisJaWYgKHJlc3VsdCAhPSAwKSB7CisJCURCRyhkZXYsICJlbmFibGUgJXMgLS0+ICVkXG4iLCBkZXYtPmluX2VwLT5uYW1lLCByZXN1bHQpOworCQlnb3RvIGRvbmU7CisJfQorCisJcmVzdWx0ID0gdXNiX2VwX2VuYWJsZShkZXYtPm91dF9lcCk7CisJaWYgKHJlc3VsdCAhPSAwKSB7CisJCURCRyhkZXYsICJlbmFibGUgJXMgLS0+ICVkXG4iLCBkZXYtPmluX2VwLT5uYW1lLCByZXN1bHQpOworCQlnb3RvIGRvbmU7CisJfQorCitkb25lOgorCS8qIG9uIGVycm9yLCBkaXNhYmxlIGFueSBlbmRwb2ludHMgICovCisJaWYgKHJlc3VsdCAhPSAwKSB7CisJCSh2b2lkKSB1c2JfZXBfZGlzYWJsZShkZXYtPmluX2VwKTsKKwkJKHZvaWQpIHVzYl9lcF9kaXNhYmxlKGRldi0+b3V0X2VwKTsKKwkJZGV2LT5pbl9lcC0+ZGVzYyA9IE5VTEw7CisJCWRldi0+b3V0X2VwLT5kZXNjID0gTlVMTDsKKwl9CisKKwkvKiBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNsZWFudXAgb24gZXJyb3IgKi8KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBwcmludGVyX3Jlc2V0X2ludGVyZmFjZShzdHJ1Y3QgcHJpbnRlcl9kZXYgKmRldikKK3sKKwlpZiAoZGV2LT5pbnRlcmZhY2UgPCAwKQorCQlyZXR1cm47CisKKwlEQkcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCWlmIChkZXYtPmluX2VwLT5kZXNjKQorCQl1c2JfZXBfZGlzYWJsZShkZXYtPmluX2VwKTsKKworCWlmIChkZXYtPm91dF9lcC0+ZGVzYykKKwkJdXNiX2VwX2Rpc2FibGUoZGV2LT5vdXRfZXApOworCisJZGV2LT5pbl9lcC0+ZGVzYyA9IE5VTEw7CisJZGV2LT5vdXRfZXAtPmRlc2MgPSBOVUxMOworCWRldi0+aW50ZXJmYWNlID0gLTE7Cit9CisKKy8qIENoYW5nZSBvdXIgb3BlcmF0aW9uYWwgSW50ZXJmYWNlLiAqLworc3RhdGljIGludCBzZXRfaW50ZXJmYWNlKHN0cnVjdCBwcmludGVyX2RldiAqZGV2LCB1bnNpZ25lZCBudW1iZXIpCit7CisJaW50CQkJcmVzdWx0ID0gMDsKKworCS8qIEZyZWUgdGhlIGN1cnJlbnQgaW50ZXJmYWNlICovCisJcHJpbnRlcl9yZXNldF9pbnRlcmZhY2UoZGV2KTsKKworCXJlc3VsdCA9IHNldF9wcmludGVyX2ludGVyZmFjZShkZXYpOworCWlmIChyZXN1bHQpCisJCXByaW50ZXJfcmVzZXRfaW50ZXJmYWNlKGRldik7CisJZWxzZQorCQlkZXYtPmludGVyZmFjZSA9IG51bWJlcjsKKworCWlmICghcmVzdWx0KQorCQlJTkZPKGRldiwgIlVzaW5nIGludGVyZmFjZSAleFxuIiwgbnVtYmVyKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50ZXJfc29mdF9yZXNldChzdHJ1Y3QgcHJpbnRlcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcTsKKworCUlORk8oZGV2LCAiUmVjZWl2ZWQgUHJpbnRlciBSZXNldCBSZXF1ZXN0XG4iKTsKKworCWlmICh1c2JfZXBfZGlzYWJsZShkZXYtPmluX2VwKSkKKwkJREJHKGRldiwgIkZhaWxlZCB0byBkaXNhYmxlIFVTQiBpbl9lcFxuIik7CisJaWYgKHVzYl9lcF9kaXNhYmxlKGRldi0+b3V0X2VwKSkKKwkJREJHKGRldiwgIkZhaWxlZCB0byBkaXNhYmxlIFVTQiBvdXRfZXBcbiIpOworCisJaWYgKGRldi0+Y3VycmVudF9yeF9yZXEgIT0gTlVMTCkgeworCQlsaXN0X2FkZCgmZGV2LT5jdXJyZW50X3J4X3JlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CisJCWRldi0+Y3VycmVudF9yeF9yZXEgPSBOVUxMOworCX0KKwlkZXYtPmN1cnJlbnRfcnhfYnl0ZXMgPSAwOworCWRldi0+Y3VycmVudF9yeF9idWYgPSBOVUxMOworCWRldi0+cmVzZXRfcHJpbnRlciA9IDE7CisKKwl3aGlsZSAobGlrZWx5KCEobGlzdF9lbXB0eSgmZGV2LT5yeF9idWZmZXJzKSkpKSB7CisJCXJlcSA9IGNvbnRhaW5lcl9vZihkZXYtPnJ4X2J1ZmZlcnMubmV4dCwgc3RydWN0IHVzYl9yZXF1ZXN0LAorCQkJCWxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOworCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKKwl9CisKKwl3aGlsZSAobGlrZWx5KCEobGlzdF9lbXB0eSgmZGV2LT5yeF9yZXFzX2FjdGl2ZSkpKSkgeworCQlyZXEgPSBjb250YWluZXJfb2YoZGV2LT5yeF9idWZmZXJzLm5leHQsIHN0cnVjdCB1c2JfcmVxdWVzdCwKKwkJCQlsaXN0KTsKKwkJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKKwkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7CisJfQorCisJd2hpbGUgKGxpa2VseSghKGxpc3RfZW1wdHkoJmRldi0+dHhfcmVxc19hY3RpdmUpKSkpIHsKKwkJcmVxID0gY29udGFpbmVyX29mKGRldi0+dHhfcmVxc19hY3RpdmUubmV4dCwKKwkJCQlzdHJ1Y3QgdXNiX3JlcXVlc3QsIGxpc3QpOworCQlsaXN0X2RlbF9pbml0KCZyZXEtPmxpc3QpOworCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT50eF9yZXFzKTsKKwl9CisKKwlpZiAodXNiX2VwX2VuYWJsZShkZXYtPmluX2VwKSkKKwkJREJHKGRldiwgIkZhaWxlZCB0byBlbmFibGUgVVNCIGluX2VwXG4iKTsKKwlpZiAodXNiX2VwX2VuYWJsZShkZXYtPm91dF9lcCkpCisJCURCRyhkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFVTQiBvdXRfZXBcbiIpOworCisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnJ4X3dhaXQpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT50eF93YWl0KTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+dHhfZmx1c2hfd2FpdCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBib29sIGdwcmludGVyX3JlcV9tYXRjaChzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCit7CisJc3RydWN0IHByaW50ZXJfZGV2CSpkZXYgPSBmdW5jX3RvX3ByaW50ZXIoZik7CisJdTE2CQkJd19pbmRleCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7CisJdTE2CQkJd192YWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisJdTE2CQkJd19sZW5ndGggPSBsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKTsKKworCWlmICgoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spICE9IFVTQl9SRUNJUF9JTlRFUkZBQ0UgfHwKKwkgICAgKGN0cmwtPmJSZXF1ZXN0VHlwZSAmIFVTQl9UWVBFX01BU0spICE9IFVTQl9UWVBFX0NMQVNTKQorCQlyZXR1cm4gZmFsc2U7CisKKwlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0KSB7CisJY2FzZSBHRVRfREVWSUNFX0lEOgorCQl3X2luZGV4ID4+PSA4OworCQlpZiAod19sZW5ndGggPD0gUE5QX1NUUklOR19MRU4gJiYKKwkJICAgIChVU0JfRElSX0lOICYgY3RybC0+YlJlcXVlc3RUeXBlKSkKKwkJCWJyZWFrOworCQlyZXR1cm4gZmFsc2U7CisJY2FzZSBHRVRfUE9SVF9TVEFUVVM6CisJCWlmICghd192YWx1ZSAmJiB3X2xlbmd0aCA9PSAxICYmCisJCSAgICAoVVNCX0RJUl9JTiAmIGN0cmwtPmJSZXF1ZXN0VHlwZSkpCisJCQlicmVhazsKKwkJcmV0dXJuIGZhbHNlOworCWNhc2UgU09GVF9SRVNFVDoKKwkJaWYgKCF3X3ZhbHVlICYmICF3X2xlbmd0aCAmJgorCQkgICAhKFVTQl9ESVJfSU4gJiBjdHJsLT5iUmVxdWVzdFR5cGUpKQorCQkJYnJlYWs7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHdfaW5kZXggPT0gZGV2LT5pbnRlcmZhY2U7Cit9CisKKy8qCisgKiBUaGUgc2V0dXAoKSBjYWxsYmFjayBpbXBsZW1lbnRzIGFsbCB0aGUgZXAwIGZ1bmN0aW9uYWxpdHkgdGhhdCdzIG5vdAorICogaGFuZGxlZCBsb3dlciBkb3duLgorICovCitzdGF0aWMgaW50IHByaW50ZXJfZnVuY19zZXR1cChzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmLAorCQljb25zdCBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQoreworCXN0cnVjdCBwcmludGVyX2RldiAqZGV2ID0gZnVuY190b19wcmludGVyKGYpOworCXN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiA9IGYtPmNvbmZpZy0+Y2RldjsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcSA9IGNkZXYtPnJlcTsKKwlpbnQJCQl2YWx1ZSA9IC1FT1BOT1RTVVBQOworCXUxNgkJCXdJbmRleCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7CisJdTE2CQkJd1ZhbHVlID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKKwl1MTYJCQl3TGVuZ3RoID0gbGUxNl90b19jcHUoY3RybC0+d0xlbmd0aCk7CisKKwlEQkcoZGV2LCAiY3RybCByZXElMDJ4LiUwMnggdiUwNHggaSUwNHggbCVkXG4iLAorCQljdHJsLT5iUmVxdWVzdFR5cGUsIGN0cmwtPmJSZXF1ZXN0LCB3VmFsdWUsIHdJbmRleCwgd0xlbmd0aCk7CisKKwlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0VHlwZSZVU0JfVFlQRV9NQVNLKSB7CisJY2FzZSBVU0JfVFlQRV9DTEFTUzoKKwkJc3dpdGNoIChjdHJsLT5iUmVxdWVzdCkgeworCQljYXNlIEdFVF9ERVZJQ0VfSUQ6IC8qIEdldCB0aGUgSUVFRS0xMjg0IFBOUCBTdHJpbmcgKi8KKwkJCS8qIE9ubHkgb25lIHByaW50ZXIgaW50ZXJmYWNlIGlzIHN1cHBvcnRlZC4gKi8KKwkJCWlmICgod0luZGV4Pj44KSAhPSBkZXYtPmludGVyZmFjZSkKKwkJCQlicmVhazsKKworCQkJdmFsdWUgPSAoZGV2LT5wbnBfc3RyaW5nWzBdIDw8IDgpIHwgZGV2LT5wbnBfc3RyaW5nWzFdOworCQkJbWVtY3B5KHJlcS0+YnVmLCBkZXYtPnBucF9zdHJpbmcsIHZhbHVlKTsKKwkJCURCRyhkZXYsICIxMjg0IFBOUCBTdHJpbmc6ICV4ICVzXG4iLCB2YWx1ZSwKKwkJCQkJJmRldi0+cG5wX3N0cmluZ1syXSk7CisJCQlicmVhazsKKworCQljYXNlIEdFVF9QT1JUX1NUQVRVUzogLyogR2V0IFBvcnQgU3RhdHVzICovCisJCQkvKiBPbmx5IG9uZSBwcmludGVyIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQuICovCisJCQlpZiAod0luZGV4ICE9IGRldi0+aW50ZXJmYWNlKQorCQkJCWJyZWFrOworCisJCQkqKHU4ICopcmVxLT5idWYgPSBkZXYtPnByaW50ZXJfc3RhdHVzOworCQkJdmFsdWUgPSBtaW5fdCh1MTYsIHdMZW5ndGgsIDEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT0ZUX1JFU0VUOiAvKiBTb2Z0IFJlc2V0ICovCisJCQkvKiBPbmx5IG9uZSBwcmludGVyIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQuICovCisJCQlpZiAod0luZGV4ICE9IGRldi0+aW50ZXJmYWNlKQorCQkJCWJyZWFrOworCisJCQlwcmludGVyX3NvZnRfcmVzZXQoZGV2KTsKKworCQkJdmFsdWUgPSAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWdvdG8gdW5rbm93bjsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6Cit1bmtub3duOgorCQlWREJHKGRldiwKKwkJCSJ1bmtub3duIGN0cmwgcmVxJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwlZFxuIiwKKwkJCWN0cmwtPmJSZXF1ZXN0VHlwZSwgY3RybC0+YlJlcXVlc3QsCisJCQl3VmFsdWUsIHdJbmRleCwgd0xlbmd0aCk7CisJCWJyZWFrOworCX0KKwkvKiBob3N0IGVpdGhlciBzdGFsbHMgKHZhbHVlIDwgMCkgb3IgcmVwb3J0cyBzdWNjZXNzICovCisJaWYgKHZhbHVlID49IDApIHsKKwkJcmVxLT5sZW5ndGggPSB2YWx1ZTsKKwkJcmVxLT56ZXJvID0gdmFsdWUgPCB3TGVuZ3RoOworCQl2YWx1ZSA9IHVzYl9lcF9xdWV1ZShjZGV2LT5nYWRnZXQtPmVwMCwgcmVxLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHZhbHVlIDwgMCkgeworCQkJRVJST1IoZGV2LCAiJXM6JWQgRXJyb3IhXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQkJcmVxLT5zdGF0dXMgPSAwOworCQl9CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGludCBwcmludGVyX2Z1bmNfYmluZChzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gKmMsCisJCXN0cnVjdCB1c2JfZnVuY3Rpb24gKmYpCit7CisJc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCA9IGMtPmNkZXYtPmdhZGdldDsKKwlzdHJ1Y3QgcHJpbnRlcl9kZXYgKmRldiA9IGZ1bmNfdG9fcHJpbnRlcihmKTsKKwlzdHJ1Y3QgZGV2aWNlICpwZGV2OworCXN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiA9IGMtPmNkZXY7CisJc3RydWN0IHVzYl9lcCAqaW5fZXA7CisJc3RydWN0IHVzYl9lcCAqb3V0X2VwID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcTsKKwlkZXZfdCBkZXZ0OworCWludCBpZDsKKwlpbnQgcmV0OworCXUzMiBpOworCisJaWQgPSB1c2JfaW50ZXJmYWNlX2lkKGMsIGYpOworCWlmIChpZCA8IDApCisJCXJldHVybiBpZDsKKwlpbnRmX2Rlc2MuYkludGVyZmFjZU51bWJlciA9IGlkOworCisJLyogZmluaXNoIGhvb2t1cCB0byBsb3dlciBsYXllciAuLi4gKi8KKwlkZXYtPmdhZGdldCA9IGdhZGdldDsKKworCS8qIGFsbCB3ZSByZWFsbHkgbmVlZCBpcyBidWxrIElOL09VVCAqLworCWluX2VwID0gdXNiX2VwX2F1dG9jb25maWcoY2Rldi0+Z2FkZ2V0LCAmZnNfZXBfaW5fZGVzYyk7CisJaWYgKCFpbl9lcCkgeworYXV0b2NvbmZfZmFpbDoKKwkJZGV2X2VycigmY2Rldi0+Z2FkZ2V0LT5kZXYsICJjYW4ndCBhdXRvY29uZmlndXJlIG9uICVzXG4iLAorCQkJY2Rldi0+Z2FkZ2V0LT5uYW1lKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWluX2VwLT5kcml2ZXJfZGF0YSA9IGluX2VwOwkvKiBjbGFpbSAqLworCisJb3V0X2VwID0gdXNiX2VwX2F1dG9jb25maWcoY2Rldi0+Z2FkZ2V0LCAmZnNfZXBfb3V0X2Rlc2MpOworCWlmICghb3V0X2VwKQorCQlnb3RvIGF1dG9jb25mX2ZhaWw7CisJb3V0X2VwLT5kcml2ZXJfZGF0YSA9IG91dF9lcDsJLyogY2xhaW0gKi8KKworCS8qIGFzc3VtZXMgdGhhdCBhbGwgZW5kcG9pbnRzIGFyZSBkdWFsLXNwZWVkICovCisJaHNfZXBfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0gZnNfZXBfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCWhzX2VwX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPSBmc19lcF9vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOworCXNzX2VwX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9IGZzX2VwX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKwlzc19lcF9vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0gZnNfZXBfb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKKworCXJldCA9IHVzYl9hc3NpZ25fZGVzY3JpcHRvcnMoZiwgZnNfcHJpbnRlcl9mdW5jdGlvbiwKKwkJCWhzX3ByaW50ZXJfZnVuY3Rpb24sIHNzX3ByaW50ZXJfZnVuY3Rpb24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlkZXYtPmluX2VwID0gaW5fZXA7CisJZGV2LT5vdXRfZXAgPSBvdXRfZXA7CisKKwlyZXQgPSAtRU5PTUVNOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPnFfbGVuOyBpKyspIHsKKwkJcmVxID0gcHJpbnRlcl9yZXFfYWxsb2MoZGV2LT5pbl9lcCwgVVNCX0JVRlNJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoIXJlcSkKKwkJCWdvdG8gZmFpbF90eF9yZXFzOworCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT50eF9yZXFzKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5xX2xlbjsgaSsrKSB7CisJCXJlcSA9IHByaW50ZXJfcmVxX2FsbG9jKGRldi0+b3V0X2VwLCBVU0JfQlVGU0laRSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcmVxKQorCQkJZ290byBmYWlsX3J4X3JlcXM7CisJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOworCX0KKworCS8qIFNldHVwIHRoZSBzeXNmcyBmaWxlcyBmb3IgdGhlIHByaW50ZXIgZ2FkZ2V0LiAqLworCWRldnQgPSBNS0RFVihtYWpvciwgZGV2LT5taW5vcik7CisJcGRldiA9IGRldmljZV9jcmVhdGUodXNiX2dhZGdldF9jbGFzcywgTlVMTCwgZGV2dCwKKwkJCQkgIE5VTEwsICJnX3ByaW50ZXIlZCIsIGRldi0+bWlub3IpOworCWlmIChJU19FUlIocGRldikpIHsKKwkJRVJST1IoZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2U6IGdfcHJpbnRlclxuIik7CisJCXJldCA9IFBUUl9FUlIocGRldik7CisJCWdvdG8gZmFpbF9yeF9yZXFzOworCX0KKworCS8qCisJICogUmVnaXN0ZXIgYSBjaGFyYWN0ZXIgZGV2aWNlIGFzIGFuIGludGVyZmFjZSB0byBhIHVzZXIgbW9kZQorCSAqIHByb2dyYW0gdGhhdCBoYW5kbGVzIHRoZSBwcmludGVyIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkuCisJICovCisJY2Rldl9pbml0KCZkZXYtPnByaW50ZXJfY2RldiwgJnByaW50ZXJfaW9fb3BlcmF0aW9ucyk7CisJZGV2LT5wcmludGVyX2NkZXYub3duZXIgPSBUSElTX01PRFVMRTsKKwlyZXQgPSBjZGV2X2FkZCgmZGV2LT5wcmludGVyX2NkZXYsIGRldnQsIDEpOworCWlmIChyZXQpIHsKKwkJRVJST1IoZGV2LCAiRmFpbGVkIHRvIG9wZW4gY2hhciBkZXZpY2VcbiIpOworCQlnb3RvIGZhaWxfY2Rldl9hZGQ7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxfY2Rldl9hZGQ6CisJZGV2aWNlX2Rlc3Ryb3kodXNiX2dhZGdldF9jbGFzcywgZGV2dCk7CisKK2ZhaWxfcnhfcmVxczoKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+cnhfcmVxcykpIHsKKwkJcmVxID0gY29udGFpbmVyX29mKGRldi0+cnhfcmVxcy5uZXh0LCBzdHJ1Y3QgdXNiX3JlcXVlc3QsIGxpc3QpOworCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwkJcHJpbnRlcl9yZXFfZnJlZShkZXYtPm91dF9lcCwgcmVxKTsKKwl9CisKK2ZhaWxfdHhfcmVxczoKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+dHhfcmVxcykpIHsKKwkJcmVxID0gY29udGFpbmVyX29mKGRldi0+dHhfcmVxcy5uZXh0LCBzdHJ1Y3QgdXNiX3JlcXVlc3QsIGxpc3QpOworCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwkJcHJpbnRlcl9yZXFfZnJlZShkZXYtPmluX2VwLCByZXEpOworCX0KKworCXJldHVybiByZXQ7CisKK30KKworc3RhdGljIGludCBwcmludGVyX2Z1bmNfc2V0X2FsdChzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmLAorCQl1bnNpZ25lZCBpbnRmLCB1bnNpZ25lZCBhbHQpCit7CisJc3RydWN0IHByaW50ZXJfZGV2ICpkZXYgPSBmdW5jX3RvX3ByaW50ZXIoZik7CisJaW50IHJldCA9IC1FTk9UU1VQUDsKKworCWlmICghYWx0KQorCQlyZXQgPSBzZXRfaW50ZXJmYWNlKGRldiwgaW50Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwcmludGVyX2Z1bmNfZGlzYWJsZShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQoreworCXN0cnVjdCBwcmludGVyX2RldiAqZGV2ID0gZnVuY190b19wcmludGVyKGYpOworCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCisJREJHKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJcHJpbnRlcl9yZXNldF9pbnRlcmZhY2UoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZl9wcmludGVyX29wdHMKKyp0b19mX3ByaW50ZXJfb3B0cyhzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih0b19jb25maWdfZ3JvdXAoaXRlbSksIHN0cnVjdCBmX3ByaW50ZXJfb3B0cywKKwkJCSAgICBmdW5jX2luc3QuZ3JvdXApOworfQorCitDT05GSUdGU19BVFRSX1NUUlVDVChmX3ByaW50ZXJfb3B0cyk7CitDT05GSUdGU19BVFRSX09QUyhmX3ByaW50ZXJfb3B0cyk7CisKK3N0YXRpYyB2b2lkIHByaW50ZXJfYXR0cl9yZWxlYXNlKHN0cnVjdCBjb25maWdfaXRlbSAqaXRlbSkKK3sKKwlzdHJ1Y3QgZl9wcmludGVyX29wdHMgKm9wdHMgPSB0b19mX3ByaW50ZXJfb3B0cyhpdGVtKTsKKworCXVzYl9wdXRfZnVuY3Rpb25faW5zdGFuY2UoJm9wdHMtPmZ1bmNfaW5zdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uZmlnZnNfaXRlbV9vcGVyYXRpb25zIHByaW50ZXJfaXRlbV9vcHMgPSB7CisJLnJlbGVhc2UJPSBwcmludGVyX2F0dHJfcmVsZWFzZSwKKwkuc2hvd19hdHRyaWJ1dGUJPSBmX3ByaW50ZXJfb3B0c19hdHRyX3Nob3csCisJLnN0b3JlX2F0dHJpYnV0ZSA9IGZfcHJpbnRlcl9vcHRzX2F0dHJfc3RvcmUsCit9OworCitzdGF0aWMgc3NpemVfdCBmX3ByaW50ZXJfb3B0c19wbnBfc3RyaW5nX3Nob3coc3RydWN0IGZfcHJpbnRlcl9vcHRzICpvcHRzLAorCQkJCQkgICAgICBjaGFyICpwYWdlKQoreworCWludCByZXN1bHQ7CisKKwltdXRleF9sb2NrKCZvcHRzLT5sb2NrKTsKKwlyZXN1bHQgPSBzdHJsY3B5KHBhZ2UsIG9wdHMtPnBucF9zdHJpbmcgKyAyLCBQTlBfU1RSSU5HX0xFTiAtIDIpOworCW11dGV4X3VubG9jaygmb3B0cy0+bG9jayk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3NpemVfdCBmX3ByaW50ZXJfb3B0c19wbnBfc3RyaW5nX3N0b3JlKHN0cnVjdCBmX3ByaW50ZXJfb3B0cyAqb3B0cywKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBsZW4pCit7CisJaW50IHJlc3VsdCwgbDsKKworCW11dGV4X2xvY2soJm9wdHMtPmxvY2spOworCXJlc3VsdCA9IHN0cmxjcHkob3B0cy0+cG5wX3N0cmluZyArIDIsIHBhZ2UsIFBOUF9TVFJJTkdfTEVOIC0gMik7CisJbCA9IHN0cmxlbihvcHRzLT5wbnBfc3RyaW5nICsgMikgKyAyOworCW9wdHMtPnBucF9zdHJpbmdbMF0gPSAobCA+PiA4KSAmIDB4RkY7CisJb3B0cy0+cG5wX3N0cmluZ1sxXSA9IGwgJiAweEZGOworCW11dGV4X3VubG9jaygmb3B0cy0+bG9jayk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3RydWN0IGZfcHJpbnRlcl9vcHRzX2F0dHJpYnV0ZSBmX3ByaW50ZXJfb3B0c19wbnBfc3RyaW5nID0KKwlfX0NPTkZJR0ZTX0FUVFIocG5wX3N0cmluZywgU19JUlVHTyB8IFNfSVdVU1IsCisJCQlmX3ByaW50ZXJfb3B0c19wbnBfc3RyaW5nX3Nob3csCisJCQlmX3ByaW50ZXJfb3B0c19wbnBfc3RyaW5nX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgZl9wcmludGVyX29wdHNfcV9sZW5fc2hvdyhzdHJ1Y3QgZl9wcmludGVyX29wdHMgKm9wdHMsCisJCQkJCSBjaGFyICpwYWdlKQoreworCWludCByZXN1bHQ7CisKKwltdXRleF9sb2NrKCZvcHRzLT5sb2NrKTsKKwlyZXN1bHQgPSBzcHJpbnRmKHBhZ2UsICIlZFxuIiwgb3B0cy0+cV9sZW4pOworCW11dGV4X3VubG9jaygmb3B0cy0+bG9jayk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3NpemVfdCBmX3ByaW50ZXJfb3B0c19xX2xlbl9zdG9yZShzdHJ1Y3QgZl9wcmludGVyX29wdHMgKm9wdHMsCisJCQkJCSAgY29uc3QgY2hhciAqcGFnZSwgc2l6ZV90IGxlbikKK3sKKwlpbnQgcmV0OworCXUxNiBudW07CisKKwltdXRleF9sb2NrKCZvcHRzLT5sb2NrKTsKKwlpZiAob3B0cy0+cmVmY250KSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlbmQ7CisJfQorCisJcmV0ID0ga3N0cnRvdTE2KHBhZ2UsIDAsICZudW0pOworCWlmIChyZXQpCisJCWdvdG8gZW5kOworCisJb3B0cy0+cV9sZW4gPSAodW5zaWduZWQpbnVtOworCXJldCA9IGxlbjsKK2VuZDoKKwltdXRleF91bmxvY2soJm9wdHMtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZl9wcmludGVyX29wdHNfYXR0cmlidXRlIGZfcHJpbnRlcl9vcHRzX3FfbGVuID0KKwlfX0NPTkZJR0ZTX0FUVFIocV9sZW4sIFNfSVJVR08gfCBTX0lXVVNSLCBmX3ByaW50ZXJfb3B0c19xX2xlbl9zaG93LAorCQkJZl9wcmludGVyX29wdHNfcV9sZW5fc3RvcmUpOworCitzdGF0aWMgc3RydWN0IGNvbmZpZ2ZzX2F0dHJpYnV0ZSAqcHJpbnRlcl9hdHRyc1tdID0geworCSZmX3ByaW50ZXJfb3B0c19wbnBfc3RyaW5nLmF0dHIsCisJJmZfcHJpbnRlcl9vcHRzX3FfbGVuLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgY29uZmlnX2l0ZW1fdHlwZSBwcmludGVyX2Z1bmNfdHlwZSA9IHsKKwkuY3RfaXRlbV9vcHMJPSAmcHJpbnRlcl9pdGVtX29wcywKKwkuY3RfYXR0cnMJPSBwcmludGVyX2F0dHJzLAorCS5jdF9vd25lcgk9IFRISVNfTU9EVUxFLAorfTsKKworc3RhdGljIGlubGluZSBpbnQgZ3ByaW50ZXJfZ2V0X21pbm9yKHZvaWQpCit7CisJcmV0dXJuIGlkYV9zaW1wbGVfZ2V0KCZwcmludGVyX2lkYSwgMCwgMCwgR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncHJpbnRlcl9wdXRfbWlub3IoaW50IG1pbm9yKQoreworCWlkYV9zaW1wbGVfcmVtb3ZlKCZwcmludGVyX2lkYSwgbWlub3IpOworfQorCitzdGF0aWMgaW50IGdwcmludGVyX3NldHVwKGludCk7CitzdGF0aWMgdm9pZCBncHJpbnRlcl9jbGVhbnVwKHZvaWQpOworCitzdGF0aWMgdm9pZCBncHJpbnRlcl9mcmVlX2luc3Qoc3RydWN0IHVzYl9mdW5jdGlvbl9pbnN0YW5jZSAqZikKK3sKKwlzdHJ1Y3QgZl9wcmludGVyX29wdHMgKm9wdHM7CisKKwlvcHRzID0gY29udGFpbmVyX29mKGYsIHN0cnVjdCBmX3ByaW50ZXJfb3B0cywgZnVuY19pbnN0KTsKKworCW11dGV4X2xvY2soJnByaW50ZXJfaWRhX2xvY2spOworCisJZ3ByaW50ZXJfcHV0X21pbm9yKG9wdHMtPm1pbm9yKTsKKwlpZiAoaWRyX2lzX2VtcHR5KCZwcmludGVyX2lkYS5pZHIpKQorCQlncHJpbnRlcl9jbGVhbnVwKCk7CisKKwltdXRleF91bmxvY2soJnByaW50ZXJfaWRhX2xvY2spOworCisJa2ZyZWUob3B0cyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2Z1bmN0aW9uX2luc3RhbmNlICpncHJpbnRlcl9hbGxvY19pbnN0KHZvaWQpCit7CisJc3RydWN0IGZfcHJpbnRlcl9vcHRzICpvcHRzOworCXN0cnVjdCB1c2JfZnVuY3Rpb25faW5zdGFuY2UgKnJldDsKKwlpbnQgc3RhdHVzID0gMDsKKworCW9wdHMgPSBremFsbG9jKHNpemVvZigqb3B0cyksIEdGUF9LRVJORUwpOworCWlmICghb3B0cykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwltdXRleF9pbml0KCZvcHRzLT5sb2NrKTsKKwlvcHRzLT5mdW5jX2luc3QuZnJlZV9mdW5jX2luc3QgPSBncHJpbnRlcl9mcmVlX2luc3Q7CisJcmV0ID0gJm9wdHMtPmZ1bmNfaW5zdDsKKworCW11dGV4X2xvY2soJnByaW50ZXJfaWRhX2xvY2spOworCisJaWYgKGlkcl9pc19lbXB0eSgmcHJpbnRlcl9pZGEuaWRyKSkgeworCQlzdGF0dXMgPSBncHJpbnRlcl9zZXR1cChQUklOVEVSX01JTk9SUyk7CisJCWlmIChzdGF0dXMpIHsKKwkJCXJldCA9IEVSUl9QVFIoc3RhdHVzKTsKKwkJCWtmcmVlKG9wdHMpOworCQkJZ290byB1bmxvY2s7CisJCX0KKwl9CisKKwlvcHRzLT5taW5vciA9IGdwcmludGVyX2dldF9taW5vcigpOworCWlmIChvcHRzLT5taW5vciA8IDApIHsKKwkJcmV0ID0gRVJSX1BUUihvcHRzLT5taW5vcik7CisJCWtmcmVlKG9wdHMpOworCQlpZiAoaWRyX2lzX2VtcHR5KCZwcmludGVyX2lkYS5pZHIpKQorCQkJZ3ByaW50ZXJfY2xlYW51cCgpOworCQlnb3RvIHVubG9jazsKKwl9CisJY29uZmlnX2dyb3VwX2luaXRfdHlwZV9uYW1lKCZvcHRzLT5mdW5jX2luc3QuZ3JvdXAsICIiLAorCQkJCSAgICAmcHJpbnRlcl9mdW5jX3R5cGUpOworCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZwcmludGVyX2lkYV9sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBncHJpbnRlcl9mcmVlKHN0cnVjdCB1c2JfZnVuY3Rpb24gKmYpCit7CisJc3RydWN0IHByaW50ZXJfZGV2ICpkZXYgPSBmdW5jX3RvX3ByaW50ZXIoZik7CisJc3RydWN0IGZfcHJpbnRlcl9vcHRzICpvcHRzOworCisJb3B0cyA9IGNvbnRhaW5lcl9vZihmLT5maSwgc3RydWN0IGZfcHJpbnRlcl9vcHRzLCBmdW5jX2luc3QpOworCWtmcmVlKGRldik7CisJbXV0ZXhfbG9jaygmb3B0cy0+bG9jayk7CisJLS1vcHRzLT5yZWZjbnQ7CisJbXV0ZXhfdW5sb2NrKCZvcHRzLT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRlcl9mdW5jX3VuYmluZChzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gKmMsCisJCXN0cnVjdCB1c2JfZnVuY3Rpb24gKmYpCit7CisJc3RydWN0IHByaW50ZXJfZGV2CSpkZXY7CisJc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXE7CisKKwlkZXYgPSBmdW5jX3RvX3ByaW50ZXIoZik7CisKKwlkZXZpY2VfZGVzdHJveSh1c2JfZ2FkZ2V0X2NsYXNzLCBNS0RFVihtYWpvciwgZGV2LT5taW5vcikpOworCisJLyogUmVtb3ZlIENoYXJhY3RlciBEZXZpY2UgKi8KKwljZGV2X2RlbCgmZGV2LT5wcmludGVyX2NkZXYpOworCisJLyogd2UgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBkaXNjb25uZWN0ZWQgLi4uIG5vIGkvbyBtYXkgYmUgYWN0aXZlICovCisJV0FSTl9PTighbGlzdF9lbXB0eSgmZGV2LT50eF9yZXFzX2FjdGl2ZSkpOworCVdBUk5fT04oIWxpc3RfZW1wdHkoJmRldi0+cnhfcmVxc19hY3RpdmUpKTsKKworCS8qIEZyZWUgYWxsIG1lbW9yeSBmb3IgdGhpcyBkcml2ZXIuICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXYtPnR4X3JlcXMpKSB7CisJCXJlcSA9IGNvbnRhaW5lcl9vZihkZXYtPnR4X3JlcXMubmV4dCwgc3RydWN0IHVzYl9yZXF1ZXN0LAorCQkJCWxpc3QpOworCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwkJcHJpbnRlcl9yZXFfZnJlZShkZXYtPmluX2VwLCByZXEpOworCX0KKworCWlmIChkZXYtPmN1cnJlbnRfcnhfcmVxICE9IE5VTEwpCisJCXByaW50ZXJfcmVxX2ZyZWUoZGV2LT5vdXRfZXAsIGRldi0+Y3VycmVudF9yeF9yZXEpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXYtPnJ4X3JlcXMpKSB7CisJCXJlcSA9IGNvbnRhaW5lcl9vZihkZXYtPnJ4X3JlcXMubmV4dCwKKwkJCQlzdHJ1Y3QgdXNiX3JlcXVlc3QsIGxpc3QpOworCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwkJcHJpbnRlcl9yZXFfZnJlZShkZXYtPm91dF9lcCwgcmVxKTsKKwl9CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+cnhfYnVmZmVycykpIHsKKwkJcmVxID0gY29udGFpbmVyX29mKGRldi0+cnhfYnVmZmVycy5uZXh0LAorCQkJCXN0cnVjdCB1c2JfcmVxdWVzdCwgbGlzdCk7CisJCWxpc3RfZGVsKCZyZXEtPmxpc3QpOworCQlwcmludGVyX3JlcV9mcmVlKGRldi0+b3V0X2VwLCByZXEpOworCX0KKwl1c2JfZnJlZV9hbGxfZGVzY3JpcHRvcnMoZik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpncHJpbnRlcl9hbGxvYyhzdHJ1Y3QgdXNiX2Z1bmN0aW9uX2luc3RhbmNlICpmaSkKK3sKKwlzdHJ1Y3QgcHJpbnRlcl9kZXYJKmRldjsKKwlzdHJ1Y3QgZl9wcmludGVyX29wdHMJKm9wdHM7CisKKwlvcHRzID0gY29udGFpbmVyX29mKGZpLCBzdHJ1Y3QgZl9wcmludGVyX29wdHMsIGZ1bmNfaW5zdCk7CisKKwltdXRleF9sb2NrKCZvcHRzLT5sb2NrKTsKKwlpZiAob3B0cy0+bWlub3IgPj0gbWlub3JzKSB7CisJCW11dGV4X3VubG9jaygmb3B0cy0+bG9jayk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCX0KKworCWRldiA9IGt6YWxsb2Moc2l6ZW9mKCpkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikgeworCQltdXRleF91bmxvY2soJm9wdHMtPmxvY2spOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwkrK29wdHMtPnJlZmNudDsKKwlkZXYtPm1pbm9yID0gb3B0cy0+bWlub3I7CisJZGV2LT5wbnBfc3RyaW5nID0gb3B0cy0+cG5wX3N0cmluZzsKKwlkZXYtPnFfbGVuID0gb3B0cy0+cV9sZW47CisJbXV0ZXhfdW5sb2NrKCZvcHRzLT5sb2NrKTsKKworCWRldi0+ZnVuY3Rpb24ubmFtZSA9ICJwcmludGVyIjsKKwlkZXYtPmZ1bmN0aW9uLmJpbmQgPSBwcmludGVyX2Z1bmNfYmluZDsKKwlkZXYtPmZ1bmN0aW9uLnNldHVwID0gcHJpbnRlcl9mdW5jX3NldHVwOworCWRldi0+ZnVuY3Rpb24udW5iaW5kID0gcHJpbnRlcl9mdW5jX3VuYmluZDsKKwlkZXYtPmZ1bmN0aW9uLnNldF9hbHQgPSBwcmludGVyX2Z1bmNfc2V0X2FsdDsKKwlkZXYtPmZ1bmN0aW9uLmRpc2FibGUgPSBwcmludGVyX2Z1bmNfZGlzYWJsZTsKKwlkZXYtPmZ1bmN0aW9uLnJlcV9tYXRjaCA9IGdwcmludGVyX3JlcV9tYXRjaDsKKwlkZXYtPmZ1bmN0aW9uLmZyZWVfZnVuYyA9IGdwcmludGVyX2ZyZWU7CisKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT50eF9yZXFzKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5yeF9yZXFzKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT5yeF9idWZmZXJzKTsKKwlJTklUX0xJU1RfSEVBRCgmZGV2LT50eF9yZXFzX2FjdGl2ZSk7CisJSU5JVF9MSVNUX0hFQUQoJmRldi0+cnhfcmVxc19hY3RpdmUpOworCisJc3Bpbl9sb2NrX2luaXQoJmRldi0+bG9jayk7CisJbXV0ZXhfaW5pdCgmZGV2LT5sb2NrX3ByaW50ZXJfaW8pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+cnhfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT50eF93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnR4X2ZsdXNoX3dhaXQpOworCisJZGV2LT5pbnRlcmZhY2UgPSAtMTsKKwlkZXYtPnByaW50ZXJfY2Rldl9vcGVuID0gMDsKKwlkZXYtPnByaW50ZXJfc3RhdHVzID0gUFJJTlRFUl9OT1RfRVJST1I7CisJZGV2LT5jdXJyZW50X3J4X3JlcSA9IE5VTEw7CisJZGV2LT5jdXJyZW50X3J4X2J5dGVzID0gMDsKKwlkZXYtPmN1cnJlbnRfcnhfYnVmID0gTlVMTDsKKworCXJldHVybiAmZGV2LT5mdW5jdGlvbjsKK30KKworREVDTEFSRV9VU0JfRlVOQ1RJT05fSU5JVChwcmludGVyLCBncHJpbnRlcl9hbGxvY19pbnN0LCBncHJpbnRlcl9hbGxvYyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJDcmFpZyBOYWRsZXIiKTsKKworc3RhdGljIGludCBncHJpbnRlcl9zZXR1cChpbnQgY291bnQpCit7CisJaW50IHN0YXR1czsKKwlkZXZfdCBkZXZ0OworCisJdXNiX2dhZGdldF9jbGFzcyA9IGNsYXNzX2NyZWF0ZShUSElTX01PRFVMRSwgInVzYl9wcmludGVyX2dhZGdldCIpOworCWlmIChJU19FUlIodXNiX2dhZGdldF9jbGFzcykpIHsKKwkJc3RhdHVzID0gUFRSX0VSUih1c2JfZ2FkZ2V0X2NsYXNzKTsKKwkJdXNiX2dhZGdldF9jbGFzcyA9IE5VTEw7CisJCXByX2VycigidW5hYmxlIHRvIGNyZWF0ZSB1c2JfZ2FkZ2V0IGNsYXNzICVkXG4iLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXN0YXR1cyA9IGFsbG9jX2NocmRldl9yZWdpb24oJmRldnQsIDAsIGNvdW50LCAiVVNCIHByaW50ZXIgZ2FkZ2V0Iik7CisJaWYgKHN0YXR1cykgeworCQlwcl9lcnIoImFsbG9jX2NocmRldl9yZWdpb24gJWRcbiIsIHN0YXR1cyk7CisJCWNsYXNzX2Rlc3Ryb3kodXNiX2dhZGdldF9jbGFzcyk7CisJCXVzYl9nYWRnZXRfY2xhc3MgPSBOVUxMOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCW1ham9yID0gTUFKT1IoZGV2dCk7CisJbWlub3JzID0gY291bnQ7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBncHJpbnRlcl9jbGVhbnVwKHZvaWQpCit7CisJaWYgKG1ham9yKSB7CisJCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihtYWpvciwgMCksIG1pbm9ycyk7CisJCW1ham9yID0gbWlub3JzID0gMDsKKwl9CisJY2xhc3NfZGVzdHJveSh1c2JfZ2FkZ2V0X2NsYXNzKTsKKwl1c2JfZ2FkZ2V0X2NsYXNzID0gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3NvdXJjZXNpbmsuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9mX3NvdXJjZXNpbmsuYwppbmRleCBlM2RhZTQ3Li4zYTVhZTk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZl9zb3VyY2VzaW5rLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2Zfc291cmNlc2luay5jCkBAIC0yMywxNSArMjMsNiBAQAogI2luY2x1ZGUgImdhZGdldF9jaGlwcy5oIgogI2luY2x1ZGUgInVfZi5oIgogCi0jZGVmaW5lIFVTQl9NU19UT19TU19JTlRFUlZBTCh4KSBVU0JfTVNfVE9fSFNfSU5URVJWQUwoeCkKLQotZW51bSBlcHR5cGUgewotCUVQX0NPTlRST0wgPSAwLAotCUVQX0JVTEssCi0JRVBfSVNPQywKLQlFUF9JTlRFUlJVUFQsCi19OwotCiAvKgogICogU09VUkNFL1NJTksgRlVOQ1RJT04gLi4uIGEgcHJpbWFyeSB0ZXN0aW5nIHZlaGljbGUgZm9yIFVTQiBwZXJpcGhlcmFsCiAgKiBjb250cm9sbGVyIGRyaXZlcnMuCkBAIC02NCw4ICs1NSw2IEBACiAJc3RydWN0IHVzYl9lcAkJKm91dF9lcDsKIAlzdHJ1Y3QgdXNiX2VwCQkqaXNvX2luX2VwOwogCXN0cnVjdCB1c2JfZXAJCSppc29fb3V0X2VwOwotCXN0cnVjdCB1c2JfZXAJCSppbnRfaW5fZXA7Ci0Jc3RydWN0IHVzYl9lcAkJKmludF9vdXRfZXA7CiAJaW50CQkJY3VyX2FsdDsKIH07CiAKQEAgLTc5LDEwICs2OCw2IEBACiBzdGF0aWMgdW5zaWduZWQgaXNvY19tYXhwYWNrZXQ7CiBzdGF0aWMgdW5zaWduZWQgaXNvY19tdWx0Owogc3RhdGljIHVuc2lnbmVkIGlzb2NfbWF4YnVyc3Q7Ci1zdGF0aWMgdW5zaWduZWQgaW50X2ludGVydmFsOyAvKiBJbiBtcyAqLwotc3RhdGljIHVuc2lnbmVkIGludF9tYXhwYWNrZXQ7Ci1zdGF0aWMgdW5zaWduZWQgaW50X211bHQ7Ci1zdGF0aWMgdW5zaWduZWQgaW50X21heGJ1cnN0Owogc3RhdGljIHVuc2lnbmVkIGJ1ZmxlbjsKIAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KQEAgLTEwNywxNiArOTIsNiBAQAogCS8qIC5pSW50ZXJmYWNlCQk9IERZTkFNSUMgKi8KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIHNvdXJjZV9zaW5rX2ludGZfYWx0MiA9IHsKLQkuYkxlbmd0aCA9CQlVU0JfRFRfSU5URVJGQUNFX1NJWkUsCi0JLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9JTlRFUkZBQ0UsCi0KLQkuYkFsdGVybmF0ZVNldHRpbmcgPQkyLAotCS5iTnVtRW5kcG9pbnRzID0JMiwKLQkuYkludGVyZmFjZUNsYXNzID0JVVNCX0NMQVNTX1ZFTkRPUl9TUEVDLAotCS8qIC5pSW50ZXJmYWNlCQk9IERZTkFNSUMgKi8KLX07Ci0KIC8qIGZ1bGwgc3BlZWQgc3VwcG9ydDogKi8KIAogc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBmc19zb3VyY2VfZGVzYyA9IHsKQEAgLTE1NSwyNiArMTMwLDYgQEAKIAkuYkludGVydmFsID0JCTQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGZzX2ludF9zb3VyY2VfZGVzYyA9IHsKLQkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKLQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAotCi0JLmJFbmRwb2ludEFkZHJlc3MgPQlVU0JfRElSX0lOLAotCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfSU5ULAotCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDY0KSwKLQkuYkludGVydmFsID0JCUdaRVJPX0lOVF9JTlRFUlZBTCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgZnNfaW50X3NpbmtfZGVzYyA9IHsKLQkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKLQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAotCi0JLmJFbmRwb2ludEFkZHJlc3MgPQlVU0JfRElSX09VVCwKLQkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKLQkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNig2NCksCi0JLmJJbnRlcnZhbCA9CQlHWkVST19JTlRfSU5URVJWQUwsCi19OwotCiBzdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqZnNfc291cmNlX3NpbmtfZGVzY3NbXSA9IHsKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc291cmNlX3NpbmtfaW50Zl9hbHQwLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19zaW5rX2Rlc2MsCkBAIC0xODUsMTAgKzE0MCw2IEBACiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX3NvdXJjZV9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19pc29fc2lua19kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZmc19pc29fc291cmNlX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNvdXJjZV9zaW5rX2ludGZfYWx0MiwKLSNkZWZpbmUgRlNfQUxUX0lGQ18yX09GRlNFVAk4Ci0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX2ludF9zaW5rX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmZzX2ludF9zb3VyY2VfZGVzYywKIAlOVUxMLAogfTsKIApAQCAtMjI4LDI0ICsxNzksNiBAQAogCS5iSW50ZXJ2YWwgPQkJNCwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgaHNfaW50X3NvdXJjZV9kZXNjID0gewotCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCi0KLQkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKLQkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNigxMDI0KSwKLQkuYkludGVydmFsID0JCVVTQl9NU19UT19IU19JTlRFUlZBTChHWkVST19JTlRfSU5URVJWQUwpLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBoc19pbnRfc2lua19kZXNjID0gewotCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCi0KLQkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKLQkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNigxMDI0KSwKLQkuYkludGVydmFsID0JCVVTQl9NU19UT19IU19JTlRFUlZBTChHWkVST19JTlRfSU5URVJWQUwpLAotfTsKLQogc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKmhzX3NvdXJjZV9zaW5rX2Rlc2NzW10gPSB7CiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNvdXJjZV9zaW5rX2ludGZfYWx0MCwKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfc291cmNlX2Rlc2MsCkBAIC0yNTYsMTAgKzE4OSw2IEBACiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX3NpbmtfZGVzYywKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmaHNfaXNvX3NvdXJjZV9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoc19pc29fc2lua19kZXNjLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzb3VyY2Vfc2lua19pbnRmX2FsdDIsCi0jZGVmaW5lIEhTX0FMVF9JRkNfMl9PRkZTRVQJOAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZoc19pbnRfc291cmNlX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX2ludF9zaW5rX2Rlc2MsCiAJTlVMTCwKIH07CiAKQEAgLTMzNSw0MiArMjY0LDYgQEAKIAkud0J5dGVzUGVySW50ZXJ2YWwgPQljcHVfdG9fbGUxNigxMDI0KSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3NfaW50X3NvdXJjZV9kZXNjID0gewotCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCi0KLQkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKLQkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNigxMDI0KSwKLQkuYkludGVydmFsID0JCVVTQl9NU19UT19TU19JTlRFUlZBTChHWkVST19JTlRfSU5URVJWQUwpLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9yIHNzX2ludF9zb3VyY2VfY29tcF9kZXNjID0gewotCS5iTGVuZ3RoID0JCVVTQl9EVF9TU19FUF9DT01QX1NJWkUsCi0JLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAotCi0JLmJNYXhCdXJzdCA9CQkwLAotCS5ibUF0dHJpYnV0ZXMgPQkJMCwKLQkud0J5dGVzUGVySW50ZXJ2YWwgPQljcHVfdG9fbGUxNigxMDI0KSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3Igc3NfaW50X3NpbmtfZGVzYyA9IHsKLQkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKLQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAotCi0JLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCi0JLndNYXhQYWNrZXRTaXplID0JY3B1X3RvX2xlMTYoMTAyNCksCi0JLmJJbnRlcnZhbCA9CQlVU0JfTVNfVE9fU1NfSU5URVJWQUwoR1pFUk9fSU5UX0lOVEVSVkFMKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzc19pbnRfc2lua19jb21wX2Rlc2MgPSB7Ci0JLmJMZW5ndGggPQkJVVNCX0RUX1NTX0VQX0NPTVBfU0laRSwKLQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX1NTX0VORFBPSU5UX0NPTVAsCi0KLQkuYk1heEJ1cnN0ID0JCTAsCi0JLmJtQXR0cmlidXRlcyA9CQkwLAotCS53Qnl0ZXNQZXJJbnRlcnZhbCA9CWNwdV90b19sZTE2KDEwMjQpLAotfTsKLQogc3RhdGljIHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKnNzX3NvdXJjZV9zaW5rX2Rlc2NzW10gPSB7CiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNvdXJjZV9zaW5rX2ludGZfYWx0MCwKIAkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3Nfc291cmNlX2Rlc2MsCkBAIC0zODcsMTIgKzI4MCw2IEBACiAJKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX2lzb19zb3VyY2VfY29tcF9kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19pc29fc2lua19kZXNjLAogCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19pc29fc2lua19jb21wX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNvdXJjZV9zaW5rX2ludGZfYWx0MiwKLSNkZWZpbmUgU1NfQUxUX0lGQ18yX09GRlNFVAkxNAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19pbnRfc291cmNlX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJnNzX2ludF9zb3VyY2VfY29tcF9kZXNjLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19pbnRfc2lua19kZXNjLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19pbnRfc2lua19jb21wX2Rlc2MsCiAJTlVMTCwKIH07CiAKQEAgLTQxNCwyMSArMzAxLDYgQEAKIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgY29uc3QgY2hhciAqZ2V0X2VwX3N0cmluZyhlbnVtIGVwdHlwZSBlcF90eXBlKQotewotCXN3aXRjaCAoZXBfdHlwZSkgewotCWNhc2UgRVBfSVNPQzoKLQkJcmV0dXJuICJJU09DLSI7Ci0JY2FzZSBFUF9JTlRFUlJVUFQ6Ci0JCXJldHVybiAiSU5URVJSVVBULSI7Ci0JY2FzZSBFUF9DT05UUk9MOgotCQlyZXR1cm4gIkNUUkwtIjsKLQljYXNlIEVQX0JVTEs6Ci0JCXJldHVybiAiQlVMSy0iOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAiVU5LTk9XTi0iOwotCX0KLX0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnNzX2FsbG9jX2VwX3JlcShzdHJ1Y3QgdXNiX2VwICplcCwgaW50IGxlbikKIHsKQEAgLTQ1Niw4ICszMjgsNyBAQAogCiB2b2lkIGRpc2FibGVfZW5kcG9pbnRzKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiwKIAkJc3RydWN0IHVzYl9lcCAqaW4sIHN0cnVjdCB1c2JfZXAgKm91dCwKLQkJc3RydWN0IHVzYl9lcCAqaXNvX2luLCBzdHJ1Y3QgdXNiX2VwICppc29fb3V0LAotCQlzdHJ1Y3QgdXNiX2VwICppbnRfaW4sIHN0cnVjdCB1c2JfZXAgKmludF9vdXQpCisJCXN0cnVjdCB1c2JfZXAgKmlzb19pbiwgc3RydWN0IHVzYl9lcCAqaXNvX291dCkKIHsKIAlkaXNhYmxlX2VwKGNkZXYsIGluKTsKIAlkaXNhYmxlX2VwKGNkZXYsIG91dCk7CkBAIC00NjUsMTAgKzMzNiw2IEBACiAJCWRpc2FibGVfZXAoY2RldiwgaXNvX2luKTsKIAlpZiAoaXNvX291dCkKIAkJZGlzYWJsZV9lcChjZGV2LCBpc29fb3V0KTsKLQlpZiAoaW50X2luKQotCQlkaXNhYmxlX2VwKGNkZXYsIGludF9pbik7Ci0JaWYgKGludF9vdXQpCi0JCWRpc2FibGVfZXAoY2RldiwgaW50X291dCk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTQ4NSw3ICszNTIsNiBAQAogCQlyZXR1cm4gaWQ7CiAJc291cmNlX3NpbmtfaW50Zl9hbHQwLmJJbnRlcmZhY2VOdW1iZXIgPSBpZDsKIAlzb3VyY2Vfc2lua19pbnRmX2FsdDEuYkludGVyZmFjZU51bWJlciA9IGlkOwotCXNvdXJjZV9zaW5rX2ludGZfYWx0Mi5iSW50ZXJmYWNlTnVtYmVyID0gaWQ7CiAKIAkvKiBhbGxvY2F0ZSBidWxrIGVuZHBvaW50cyAqLwogCXNzLT5pbl9lcCA9IHVzYl9lcF9hdXRvY29uZmlnKGNkZXYtPmdhZGdldCwgJmZzX3NvdXJjZV9kZXNjKTsKQEAgLTU0Niw1NSArNDEyLDE0IEBACiAJaWYgKGlzb2NfbWF4cGFja2V0ID4gMTAyNCkKIAkJaXNvY19tYXhwYWNrZXQgPSAxMDI0OwogCi0JLyogc2FuaXR5IGNoZWNrIHRoZSBpbnRlcnJ1cHQgbW9kdWxlIHBhcmFtZXRlcnMgKi8KLQlpZiAoaW50X2ludGVydmFsIDwgMSkKLQkJaW50X2ludGVydmFsID0gMTsKLQlpZiAoaW50X2ludGVydmFsID4gNDA5NikKLQkJaW50X2ludGVydmFsID0gNDA5NjsKLQlpZiAoaW50X211bHQgPiAyKQotCQlpbnRfbXVsdCA9IDI7Ci0JaWYgKGludF9tYXhidXJzdCA+IDE1KQotCQlpbnRfbWF4YnVyc3QgPSAxNTsKLQotCS8qIGZpbGwgaW4gdGhlIEZTIGludGVycnVwdCBkZXNjcmlwdG9ycyBmcm9tIHRoZSBtb2R1bGUgcGFyYW1ldGVycyAqLwotCWZzX2ludF9zb3VyY2VfZGVzYy53TWF4UGFja2V0U2l6ZSA9IGludF9tYXhwYWNrZXQgPiA2NCA/Ci0JCQkJCQk2NCA6IGludF9tYXhwYWNrZXQ7Ci0JZnNfaW50X3NvdXJjZV9kZXNjLmJJbnRlcnZhbCA9IGludF9pbnRlcnZhbCA+IDI1NSA/Ci0JCQkJCQkyNTUgOiBpbnRfaW50ZXJ2YWw7Ci0JZnNfaW50X3NpbmtfZGVzYy53TWF4UGFja2V0U2l6ZSA9IGludF9tYXhwYWNrZXQgPiA2NCA/Ci0JCQkJCQk2NCA6IGludF9tYXhwYWNrZXQ7Ci0JZnNfaW50X3NpbmtfZGVzYy5iSW50ZXJ2YWwgPSBpbnRfaW50ZXJ2YWwgPiAyNTUgPwotCQkJCQkJMjU1IDogaW50X2ludGVydmFsOwotCi0JLyogYWxsb2NhdGUgaW50IGVuZHBvaW50cyAqLwotCXNzLT5pbnRfaW5fZXAgPSB1c2JfZXBfYXV0b2NvbmZpZyhjZGV2LT5nYWRnZXQsICZmc19pbnRfc291cmNlX2Rlc2MpOwotCWlmICghc3MtPmludF9pbl9lcCkKLQkJZ290byBub19pbnQ7Ci0Jc3MtPmludF9pbl9lcC0+ZHJpdmVyX2RhdGEgPSBjZGV2OwkvKiBjbGFpbSAqLwotCi0Jc3MtPmludF9vdXRfZXAgPSB1c2JfZXBfYXV0b2NvbmZpZyhjZGV2LT5nYWRnZXQsICZmc19pbnRfc2lua19kZXNjKTsKLQlpZiAoc3MtPmludF9vdXRfZXApIHsKLQkJc3MtPmludF9vdXRfZXAtPmRyaXZlcl9kYXRhID0gY2RldjsJLyogY2xhaW0gKi8KLQl9IGVsc2UgewotCQlzcy0+aW50X2luX2VwLT5kcml2ZXJfZGF0YSA9IE5VTEw7Ci0JCXNzLT5pbnRfaW5fZXAgPSBOVUxMOwotbm9faW50OgotCQlmc19zb3VyY2Vfc2lua19kZXNjc1tGU19BTFRfSUZDXzJfT0ZGU0VUXSA9IE5VTEw7Ci0JCWhzX3NvdXJjZV9zaW5rX2Rlc2NzW0hTX0FMVF9JRkNfMl9PRkZTRVRdID0gTlVMTDsKLQkJc3Nfc291cmNlX3NpbmtfZGVzY3NbU1NfQUxUX0lGQ18yX09GRlNFVF0gPSBOVUxMOwotCX0KLQotCWlmIChpbnRfbWF4cGFja2V0ID4gMTAyNCkKLQkJaW50X21heHBhY2tldCA9IDEwMjQ7Ci0KIAkvKiBzdXBwb3J0IGhpZ2ggc3BlZWQgaGFyZHdhcmUgKi8KIAloc19zb3VyY2VfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0gZnNfc291cmNlX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKIAloc19zaW5rX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9IGZzX3NpbmtfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwogCiAJLyoKLQkgKiBGaWxsIGluIHRoZSBIUyBpc29jIGFuZCBpbnRlcnJ1cHQgZGVzY3JpcHRvcnMgZnJvbSB0aGUgbW9kdWxlCi0JICogcGFyYW1ldGVycy4gV2UgYXNzdW1lIHRoYXQgdGhlIHVzZXIga25vd3Mgd2hhdCB0aGV5IGFyZSBkb2luZyBhbmQKLQkgKiB3b24ndCBnaXZlIHBhcmFtZXRlcnMgdGhhdCB0aGVpciBVREMgZG9lc24ndCBzdXBwb3J0LgorCSAqIEZpbGwgaW4gdGhlIEhTIGlzb2MgZGVzY3JpcHRvcnMgZnJvbSB0aGUgbW9kdWxlIHBhcmFtZXRlcnMuCisJICogV2UgYXNzdW1lIHRoYXQgdGhlIHVzZXIga25vd3Mgd2hhdCB0aGV5IGFyZSBkb2luZyBhbmQgd29uJ3QKKwkgKiBnaXZlIHBhcmFtZXRlcnMgdGhhdCB0aGVpciBVREMgZG9lc24ndCBzdXBwb3J0LgogCSAqLwogCWhzX2lzb19zb3VyY2VfZGVzYy53TWF4UGFja2V0U2l6ZSA9IGlzb2NfbWF4cGFja2V0OwogCWhzX2lzb19zb3VyY2VfZGVzYy53TWF4UGFja2V0U2l6ZSB8PSBpc29jX211bHQgPDwgMTE7CkBAIC02MDcsMTcgKzQzMiw2IEBACiAJaHNfaXNvX3NpbmtfZGVzYy5iSW50ZXJ2YWwgPSBpc29jX2ludGVydmFsOwogCWhzX2lzb19zaW5rX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9IGZzX2lzb19zaW5rX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKIAotCWhzX2ludF9zb3VyY2VfZGVzYy53TWF4UGFja2V0U2l6ZSA9IGludF9tYXhwYWNrZXQ7Ci0JaHNfaW50X3NvdXJjZV9kZXNjLndNYXhQYWNrZXRTaXplIHw9IGludF9tdWx0IDw8IDExOwotCWhzX2ludF9zb3VyY2VfZGVzYy5iSW50ZXJ2YWwgPSBVU0JfTVNfVE9fSFNfSU5URVJWQUwoaW50X2ludGVydmFsKTsKLQloc19pbnRfc291cmNlX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9Ci0JCWZzX2ludF9zb3VyY2VfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwotCi0JaHNfaW50X3NpbmtfZGVzYy53TWF4UGFja2V0U2l6ZSA9IGludF9tYXhwYWNrZXQ7Ci0JaHNfaW50X3NpbmtfZGVzYy53TWF4UGFja2V0U2l6ZSB8PSBpbnRfbXVsdCA8PCAxMTsKLQloc19pbnRfc2lua19kZXNjLmJJbnRlcnZhbCA9IFVTQl9NU19UT19IU19JTlRFUlZBTChpbnRfaW50ZXJ2YWwpOwotCWhzX2ludF9zaW5rX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9IGZzX2ludF9zaW5rX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKLQogCS8qIHN1cHBvcnQgc3VwZXIgc3BlZWQgaGFyZHdhcmUgKi8KIAlzc19zb3VyY2VfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0KIAkJZnNfc291cmNlX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKQEAgLTYyNSw5ICs0MzksOSBAQAogCQlmc19zaW5rX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKIAogCS8qCi0JICogRmlsbCBpbiB0aGUgU1MgaXNvYyBhbmQgaW50ZXJydXB0IGRlc2NyaXB0b3JzIGZyb20gdGhlIG1vZHVsZQotCSAqIHBhcmFtZXRlcnMuIFdlIGFzc3VtZSB0aGF0IHRoZSB1c2VyIGtub3dzIHdoYXQgdGhleSBhcmUgZG9pbmcgYW5kCi0JICogd29uJ3QgZ2l2ZSBwYXJhbWV0ZXJzIHRoYXQgdGhlaXIgVURDIGRvZXNuJ3Qgc3VwcG9ydC4KKwkgKiBGaWxsIGluIHRoZSBTUyBpc29jIGRlc2NyaXB0b3JzIGZyb20gdGhlIG1vZHVsZSBwYXJhbWV0ZXJzLgorCSAqIFdlIGFzc3VtZSB0aGF0IHRoZSB1c2VyIGtub3dzIHdoYXQgdGhleSBhcmUgZG9pbmcgYW5kIHdvbid0CisJICogZ2l2ZSBwYXJhbWV0ZXJzIHRoYXQgdGhlaXIgVURDIGRvZXNuJ3Qgc3VwcG9ydC4KIAkgKi8KIAlzc19pc29fc291cmNlX2Rlc2Mud01heFBhY2tldFNpemUgPSBpc29jX21heHBhY2tldDsKIAlzc19pc29fc291cmNlX2Rlc2MuYkludGVydmFsID0gaXNvY19pbnRlcnZhbDsKQEAgLTY0NiwzNyArNDYwLDE3IEBACiAJCWlzb2NfbWF4cGFja2V0ICogKGlzb2NfbXVsdCArIDEpICogKGlzb2NfbWF4YnVyc3QgKyAxKTsKIAlzc19pc29fc2lua19kZXNjLmJFbmRwb2ludEFkZHJlc3MgPSBmc19pc29fc2lua19kZXNjLmJFbmRwb2ludEFkZHJlc3M7CiAKLQlzc19pbnRfc291cmNlX2Rlc2Mud01heFBhY2tldFNpemUgPSBpbnRfbWF4cGFja2V0OwotCXNzX2ludF9zb3VyY2VfZGVzYy5iSW50ZXJ2YWwgPSBVU0JfTVNfVE9fU1NfSU5URVJWQUwoaW50X2ludGVydmFsKTsKLQlzc19pbnRfc291cmNlX2NvbXBfZGVzYy5ibUF0dHJpYnV0ZXMgPSBpbnRfbXVsdDsKLQlzc19pbnRfc291cmNlX2NvbXBfZGVzYy5iTWF4QnVyc3QgPSBpbnRfbWF4YnVyc3Q7Ci0Jc3NfaW50X3NvdXJjZV9jb21wX2Rlc2Mud0J5dGVzUGVySW50ZXJ2YWwgPQotCQlpbnRfbWF4cGFja2V0ICogKGludF9tdWx0ICsgMSkgKiAoaW50X21heGJ1cnN0ICsgMSk7Ci0Jc3NfaW50X3NvdXJjZV9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPQotCQlmc19pbnRfc291cmNlX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKLQotCXNzX2ludF9zaW5rX2Rlc2Mud01heFBhY2tldFNpemUgPSBpbnRfbWF4cGFja2V0OwotCXNzX2ludF9zaW5rX2Rlc2MuYkludGVydmFsID0gVVNCX01TX1RPX1NTX0lOVEVSVkFMKGludF9pbnRlcnZhbCk7Ci0Jc3NfaW50X3NpbmtfY29tcF9kZXNjLmJtQXR0cmlidXRlcyA9IGludF9tdWx0OwotCXNzX2ludF9zaW5rX2NvbXBfZGVzYy5iTWF4QnVyc3QgPSBpbnRfbWF4YnVyc3Q7Ci0Jc3NfaW50X3NpbmtfY29tcF9kZXNjLndCeXRlc1BlckludGVydmFsID0KLQkJaW50X21heHBhY2tldCAqIChpbnRfbXVsdCArIDEpICogKGludF9tYXhidXJzdCArIDEpOwotCXNzX2ludF9zaW5rX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9IGZzX2ludF9zaW5rX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKLQogCXJldCA9IHVzYl9hc3NpZ25fZGVzY3JpcHRvcnMoZiwgZnNfc291cmNlX3NpbmtfZGVzY3MsCiAJCQloc19zb3VyY2Vfc2lua19kZXNjcywgc3Nfc291cmNlX3NpbmtfZGVzY3MpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlEQkcoY2RldiwgIiVzIHNwZWVkICVzOiBJTi8lcywgT1VULyVzLCBJU08tSU4vJXMsIElTTy1PVVQvJXMsICIKLQkJCSJJTlQtSU4vJXMsIElOVC1PVVQvJXNcbiIsCisJREJHKGNkZXYsICIlcyBzcGVlZCAlczogSU4vJXMsIE9VVC8lcywgSVNPLUlOLyVzLCBJU08tT1VULyVzXG4iLAogCSAgICAoZ2FkZ2V0X2lzX3N1cGVyc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSA/ICJzdXBlciIgOgogCSAgICAgKGdhZGdldF9pc19kdWFsc3BlZWQoYy0+Y2Rldi0+Z2FkZ2V0KSA/ICJkdWFsIiA6ICJmdWxsIikpLAogCQkJZi0+bmFtZSwgc3MtPmluX2VwLT5uYW1lLCBzcy0+b3V0X2VwLT5uYW1lLAogCQkJc3MtPmlzb19pbl9lcCA/IHNzLT5pc29faW5fZXAtPm5hbWUgOiAiPG5vbmU+IiwKLQkJCXNzLT5pc29fb3V0X2VwID8gc3MtPmlzb19vdXRfZXAtPm5hbWUgOiAiPG5vbmU+IiwKLQkJCXNzLT5pbnRfaW5fZXAgPyBzcy0+aW50X2luX2VwLT5uYW1lIDogIjxub25lPiIsCi0JCQlzcy0+aW50X291dF9lcCA/IHNzLT5pbnRfb3V0X2VwLT5uYW1lIDogIjxub25lPiIpOworCQkJc3MtPmlzb19vdXRfZXAgPyBzcy0+aXNvX291dF9lcC0+bmFtZSA6ICI8bm9uZT4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtODA3LDE1ICs2MDEsMTQgQEAKIH0KIAogc3RhdGljIGludCBzb3VyY2Vfc2lua19zdGFydF9lcChzdHJ1Y3QgZl9zb3VyY2VzaW5rICpzcywgYm9vbCBpc19pbiwKLQkJZW51bSBlcHR5cGUgZXBfdHlwZSwgaW50IHNwZWVkKQorCQlib29sIGlzX2lzbywgaW50IHNwZWVkKQogewogCXN0cnVjdCB1c2JfZXAJCSplcDsKIAlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcTsKIAlpbnQJCQlpLCBzaXplLCBzdGF0dXM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXN3aXRjaCAoZXBfdHlwZSkgewotCQljYXNlIEVQX0lTT0M6CisJCWlmIChpc19pc28pIHsKIAkJCXN3aXRjaCAoc3BlZWQpIHsKIAkJCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgogCQkJCXNpemUgPSBpc29jX21heHBhY2tldCAqIChpc29jX211bHQgKyAxKSAqCkBAIC04MzEsMjggKzYyNCw5IEBACiAJCQl9CiAJCQllcCA9IGlzX2luID8gc3MtPmlzb19pbl9lcCA6IHNzLT5pc29fb3V0X2VwOwogCQkJcmVxID0gc3NfYWxsb2NfZXBfcmVxKGVwLCBzaXplKTsKLQkJCWJyZWFrOwotCQljYXNlIEVQX0lOVEVSUlVQVDoKLQkJCXN3aXRjaCAoc3BlZWQpIHsKLQkJCWNhc2UgVVNCX1NQRUVEX1NVUEVSOgotCQkJCXNpemUgPSBpbnRfbWF4cGFja2V0ICogKGludF9tdWx0ICsgMSkgKgotCQkJCQkJKGludF9tYXhidXJzdCArIDEpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBVU0JfU1BFRURfSElHSDoKLQkJCQlzaXplID0gaW50X21heHBhY2tldCAqIChpbnRfbXVsdCArIDEpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlzaXplID0gaW50X21heHBhY2tldCA+IDEwMjMgPwotCQkJCQkJMTAyMyA6IGludF9tYXhwYWNrZXQ7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllcCA9IGlzX2luID8gc3MtPmludF9pbl9lcCA6IHNzLT5pbnRfb3V0X2VwOwotCQkJcmVxID0gc3NfYWxsb2NfZXBfcmVxKGVwLCBzaXplKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgorCQl9IGVsc2UgewogCQkJZXAgPSBpc19pbiA/IHNzLT5pbl9lcCA6IHNzLT5vdXRfZXA7CiAJCQlyZXEgPSBzc19hbGxvY19lcF9yZXEoZXAsIDApOwotCQkJYnJlYWs7CiAJCX0KIAogCQlpZiAoIXJlcSkKQEAgLTg3MCwxMiArNjQ0LDEyIEBACiAKIAkJCWNkZXYgPSBzcy0+ZnVuY3Rpb24uY29uZmlnLT5jZGV2OwogCQkJRVJST1IoY2RldiwgInN0YXJ0ICVzJXMgJXMgLS0+ICVkXG4iLAotCQkJCWdldF9lcF9zdHJpbmcoZXBfdHlwZSksIGlzX2luID8gIklOIiA6ICJPVVQiLAotCQkJCWVwLT5uYW1lLCBzdGF0dXMpOworCQkJICAgICAgaXNfaXNvID8gIklTTy0iIDogIiIsIGlzX2luID8gIklOIiA6ICJPVVQiLAorCQkJICAgICAgZXAtPm5hbWUsIHN0YXR1cyk7CiAJCQlmcmVlX2VwX3JlcShlcCwgcmVxKTsKIAkJfQogCi0JCWlmICghKGVwX3R5cGUgPT0gRVBfSVNPQykpCisJCWlmICghaXNfaXNvKQogCQkJYnJlYWs7CiAJfQogCkBAIC04ODgsNyArNjYyLDcgQEAKIAogCWNkZXYgPSBzcy0+ZnVuY3Rpb24uY29uZmlnLT5jZGV2OwogCWRpc2FibGVfZW5kcG9pbnRzKGNkZXYsIHNzLT5pbl9lcCwgc3MtPm91dF9lcCwgc3MtPmlzb19pbl9lcCwKLQkJCXNzLT5pc29fb3V0X2VwLCBzcy0+aW50X2luX2VwLCBzcy0+aW50X291dF9lcCk7CisJCQlzcy0+aXNvX291dF9lcCk7CiAJVkRCRyhjZGV2LCAiJXMgZGlzYWJsZWRcbiIsIHNzLT5mdW5jdGlvbi5uYW1lKTsKIH0KIApAQCAtOTAwLDYyICs2NzQsNiBAQAogCWludAkJCQkJc3BlZWQgPSBjZGV2LT5nYWRnZXQtPnNwZWVkOwogCXN0cnVjdCB1c2JfZXAJCQkJKmVwOwogCi0JaWYgKGFsdCA9PSAyKSB7Ci0JCS8qIENvbmZpZ3VyZSBmb3IgcGVyaW9kaWMgaW50ZXJydXB0IGVuZHBvaW50ICovCi0JCWVwID0gc3MtPmludF9pbl9lcDsKLQkJaWYgKGVwKSB7Ci0JCQlyZXN1bHQgPSBjb25maWdfZXBfYnlfc3BlZWQoY2Rldi0+Z2FkZ2V0LAotCQkJCQkmKHNzLT5mdW5jdGlvbiksIGVwKTsKLQkJCWlmIChyZXN1bHQpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQotCQkJcmVzdWx0ID0gdXNiX2VwX2VuYWJsZShlcCk7Ci0JCQlpZiAocmVzdWx0IDwgMCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCi0JCQllcC0+ZHJpdmVyX2RhdGEgPSBzczsKLQkJCXJlc3VsdCA9IHNvdXJjZV9zaW5rX3N0YXJ0X2VwKHNzLCB0cnVlLCBFUF9JTlRFUlJVUFQsCi0JCQkJCXNwZWVkKTsKLQkJCWlmIChyZXN1bHQgPCAwKSB7Ci1mYWlsMToKLQkJCQllcCA9IHNzLT5pbnRfaW5fZXA7Ci0JCQkJaWYgKGVwKSB7Ci0JCQkJCXVzYl9lcF9kaXNhYmxlKGVwKTsKLQkJCQkJZXAtPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIG9uZSBpbnRlcnJ1cHQgZW5kcG9pbnQgcmVhZHMgKHNpbmtzKSBhbnl0aGluZyBPVVQgKGZyb20gdGhlCi0JCSAqIGhvc3QpCi0JCSAqLwotCQllcCA9IHNzLT5pbnRfb3V0X2VwOwotCQlpZiAoZXApIHsKLQkJCXJlc3VsdCA9IGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsCi0JCQkJCSYoc3MtPmZ1bmN0aW9uKSwgZXApOwotCQkJaWYgKHJlc3VsdCkKLQkJCQlnb3RvIGZhaWwxOwotCi0JCQlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlKGVwKTsKLQkJCWlmIChyZXN1bHQgPCAwKQotCQkJCWdvdG8gZmFpbDE7Ci0KLQkJCWVwLT5kcml2ZXJfZGF0YSA9IHNzOwotCQkJcmVzdWx0ID0gc291cmNlX3Npbmtfc3RhcnRfZXAoc3MsIGZhbHNlLCBFUF9JTlRFUlJVUFQsCi0JCQkJCXNwZWVkKTsKLQkJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJZXAgPSBzcy0+aW50X291dF9lcDsKLQkJCQl1c2JfZXBfZGlzYWJsZShlcCk7Ci0JCQkJZXAtPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJCQlnb3RvIGZhaWwxOwotCQkJfQotCQl9Ci0KLQkJZ290byBvdXQ7Ci0JfQotCiAJLyogb25lIGJ1bGsgZW5kcG9pbnQgd3JpdGVzIChzb3VyY2VzKSB6ZXJvZXMgSU4gKHRvIHRoZSBob3N0KSAqLwogCWVwID0gc3MtPmluX2VwOwogCXJlc3VsdCA9IGNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsICYoc3MtPmZ1bmN0aW9uKSwgZXApOwpAQCAtOTY2LDcgKzY4NCw3IEBACiAJCXJldHVybiByZXN1bHQ7CiAJZXAtPmRyaXZlcl9kYXRhID0gc3M7CiAKLQlyZXN1bHQgPSBzb3VyY2Vfc2lua19zdGFydF9lcChzcywgdHJ1ZSwgRVBfQlVMSywgc3BlZWQpOworCXJlc3VsdCA9IHNvdXJjZV9zaW5rX3N0YXJ0X2VwKHNzLCB0cnVlLCBmYWxzZSwgc3BlZWQpOwogCWlmIChyZXN1bHQgPCAwKSB7CiBmYWlsOgogCQllcCA9IHNzLT5pbl9lcDsKQEAgLTk4NSw3ICs3MDMsNyBAQAogCQlnb3RvIGZhaWw7CiAJZXAtPmRyaXZlcl9kYXRhID0gc3M7CiAKLQlyZXN1bHQgPSBzb3VyY2Vfc2lua19zdGFydF9lcChzcywgZmFsc2UsIEVQX0JVTEssIHNwZWVkKTsKKwlyZXN1bHQgPSBzb3VyY2Vfc2lua19zdGFydF9lcChzcywgZmFsc2UsIGZhbHNlLCBzcGVlZCk7CiAJaWYgKHJlc3VsdCA8IDApIHsKIGZhaWwyOgogCQllcCA9IHNzLT5vdXRfZXA7CkBAIC0xMDA4LDcgKzcyNiw3IEBACiAJCQlnb3RvIGZhaWwyOwogCQllcC0+ZHJpdmVyX2RhdGEgPSBzczsKIAotCQlyZXN1bHQgPSBzb3VyY2Vfc2lua19zdGFydF9lcChzcywgdHJ1ZSwgRVBfSVNPQywgc3BlZWQpOworCQlyZXN1bHQgPSBzb3VyY2Vfc2lua19zdGFydF9lcChzcywgdHJ1ZSwgdHJ1ZSwgc3BlZWQpOwogCQlpZiAocmVzdWx0IDwgMCkgewogZmFpbDM6CiAJCQllcCA9IHNzLT5pc29faW5fZXA7CkBAIC0xMDMxLDE0ICs3NDksMTMgQEAKIAkJCWdvdG8gZmFpbDM7CiAJCWVwLT5kcml2ZXJfZGF0YSA9IHNzOwogCi0JCXJlc3VsdCA9IHNvdXJjZV9zaW5rX3N0YXJ0X2VwKHNzLCBmYWxzZSwgRVBfSVNPQywgc3BlZWQpOworCQlyZXN1bHQgPSBzb3VyY2Vfc2lua19zdGFydF9lcChzcywgZmFsc2UsIHRydWUsIHNwZWVkKTsKIAkJaWYgKHJlc3VsdCA8IDApIHsKIAkJCXVzYl9lcF9kaXNhYmxlKGVwKTsKIAkJCWVwLT5kcml2ZXJfZGF0YSA9IE5VTEw7CiAJCQlnb3RvIGZhaWwzOwogCQl9CiAJfQotCiBvdXQ6CiAJc3MtPmN1cl9hbHQgPSBhbHQ7CiAKQEAgLTEwNTQsOCArNzcxLDYgQEAKIAogCWlmIChzcy0+aW5fZXAtPmRyaXZlcl9kYXRhKQogCQlkaXNhYmxlX3NvdXJjZV9zaW5rKHNzKTsKLQllbHNlIGlmIChhbHQgPT0gMiAmJiBzcy0+aW50X2luX2VwLT5kcml2ZXJfZGF0YSkKLQkJZGlzYWJsZV9zb3VyY2Vfc2luayhzcyk7CiAJcmV0dXJuIGVuYWJsZV9zb3VyY2Vfc2luayhjZGV2LCBzcywgYWx0KTsKIH0KIApAQCAtMTE2OCwxMCArODgzLDYgQEAKIAlpc29jX21heHBhY2tldCA9IHNzX29wdHMtPmlzb2NfbWF4cGFja2V0OwogCWlzb2NfbXVsdCA9IHNzX29wdHMtPmlzb2NfbXVsdDsKIAlpc29jX21heGJ1cnN0ID0gc3Nfb3B0cy0+aXNvY19tYXhidXJzdDsKLQlpbnRfaW50ZXJ2YWwgPSBzc19vcHRzLT5pbnRfaW50ZXJ2YWw7Ci0JaW50X21heHBhY2tldCA9IHNzX29wdHMtPmludF9tYXhwYWNrZXQ7Ci0JaW50X211bHQgPSBzc19vcHRzLT5pbnRfbXVsdDsKLQlpbnRfbWF4YnVyc3QgPSBzc19vcHRzLT5pbnRfbWF4YnVyc3Q7CiAJYnVmbGVuID0gc3Nfb3B0cy0+YnVsa19idWZsZW47CiAKIAlzcy0+ZnVuY3Rpb24ubmFtZSA9ICJzb3VyY2Uvc2luayI7CkBAIC0xNDY4LDE4MiArMTE3OSw2IEBACiAJCQlmX3NzX29wdHNfYnVsa19idWZsZW5fc2hvdywKIAkJCWZfc3Nfb3B0c19idWxrX2J1Zmxlbl9zdG9yZSk7CiAKLXN0YXRpYyBzc2l6ZV90IGZfc3Nfb3B0c19pbnRfaW50ZXJ2YWxfc2hvdyhzdHJ1Y3QgZl9zc19vcHRzICpvcHRzLCBjaGFyICpwYWdlKQotewotCWludCByZXN1bHQ7Ci0KLQltdXRleF9sb2NrKCZvcHRzLT5sb2NrKTsKLQlyZXN1bHQgPSBzcHJpbnRmKHBhZ2UsICIldSIsIG9wdHMtPmludF9pbnRlcnZhbCk7Ci0JbXV0ZXhfdW5sb2NrKCZvcHRzLT5sb2NrKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGZfc3Nfb3B0c19pbnRfaW50ZXJ2YWxfc3RvcmUoc3RydWN0IGZfc3Nfb3B0cyAqb3B0cywKLQkJCQkgICAgICAgY29uc3QgY2hhciAqcGFnZSwgc2l6ZV90IGxlbikKLXsKLQlpbnQgcmV0OwotCXUzMiBudW07Ci0KLQltdXRleF9sb2NrKCZvcHRzLT5sb2NrKTsKLQlpZiAob3B0cy0+cmVmY250KSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlbmQ7Ci0JfQotCi0JcmV0ID0ga3N0cnRvdTMyKHBhZ2UsIDAsICZudW0pOwotCWlmIChyZXQpCi0JCWdvdG8gZW5kOwotCi0JaWYgKG51bSA+IDQwOTYpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0Jb3B0cy0+aW50X2ludGVydmFsID0gbnVtOwotCXJldCA9IGxlbjsKLWVuZDoKLQltdXRleF91bmxvY2soJm9wdHMtPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZl9zc19vcHRzX2F0dHJpYnV0ZSBmX3NzX29wdHNfaW50X2ludGVydmFsID0KLQlfX0NPTkZJR0ZTX0FUVFIoaW50X2ludGVydmFsLCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCWZfc3Nfb3B0c19pbnRfaW50ZXJ2YWxfc2hvdywKLQkJCWZfc3Nfb3B0c19pbnRfaW50ZXJ2YWxfc3RvcmUpOwotCi1zdGF0aWMgc3NpemVfdCBmX3NzX29wdHNfaW50X21heHBhY2tldF9zaG93KHN0cnVjdCBmX3NzX29wdHMgKm9wdHMsIGNoYXIgKnBhZ2UpCi17Ci0JaW50IHJlc3VsdDsKLQotCW11dGV4X2xvY2soJm9wdHMtPmxvY2spOwotCXJlc3VsdCA9IHNwcmludGYocGFnZSwgIiV1Iiwgb3B0cy0+aW50X21heHBhY2tldCk7Ci0JbXV0ZXhfdW5sb2NrKCZvcHRzLT5sb2NrKTsKLQotCXJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGZfc3Nfb3B0c19pbnRfbWF4cGFja2V0X3N0b3JlKHN0cnVjdCBmX3NzX29wdHMgKm9wdHMsCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBsZW4pCi17Ci0JaW50IHJldDsKLQl1MTYgbnVtOwotCi0JbXV0ZXhfbG9jaygmb3B0cy0+bG9jayk7Ci0JaWYgKG9wdHMtPnJlZmNudCkgewotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gZW5kOwotCX0KLQotCXJldCA9IGtzdHJ0b3UxNihwYWdlLCAwLCAmbnVtKTsKLQlpZiAocmV0KQotCQlnb3RvIGVuZDsKLQotCWlmIChudW0gPiAxMDI0KSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZW5kOwotCX0KLQotCW9wdHMtPmludF9tYXhwYWNrZXQgPSBudW07Ci0JcmV0ID0gbGVuOwotZW5kOgotCW11dGV4X3VubG9jaygmb3B0cy0+bG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBmX3NzX29wdHNfYXR0cmlidXRlIGZfc3Nfb3B0c19pbnRfbWF4cGFja2V0ID0KLQlfX0NPTkZJR0ZTX0FUVFIoaW50X21heHBhY2tldCwgU19JUlVHTyB8IFNfSVdVU1IsCi0JCQlmX3NzX29wdHNfaW50X21heHBhY2tldF9zaG93LAotCQkJZl9zc19vcHRzX2ludF9tYXhwYWNrZXRfc3RvcmUpOwotCi1zdGF0aWMgc3NpemVfdCBmX3NzX29wdHNfaW50X211bHRfc2hvdyhzdHJ1Y3QgZl9zc19vcHRzICpvcHRzLCBjaGFyICpwYWdlKQotewotCWludCByZXN1bHQ7Ci0KLQltdXRleF9sb2NrKCZvcHRzLT5sb2NrKTsKLQlyZXN1bHQgPSBzcHJpbnRmKHBhZ2UsICIldSIsIG9wdHMtPmludF9tdWx0KTsKLQltdXRleF91bmxvY2soJm9wdHMtPmxvY2spOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHNzaXplX3QgZl9zc19vcHRzX2ludF9tdWx0X3N0b3JlKHN0cnVjdCBmX3NzX29wdHMgKm9wdHMsCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBsZW4pCi17Ci0JaW50IHJldDsKLQl1OCBudW07Ci0KLQltdXRleF9sb2NrKCZvcHRzLT5sb2NrKTsKLQlpZiAob3B0cy0+cmVmY250KSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlbmQ7Ci0JfQotCi0JcmV0ID0ga3N0cnRvdTgocGFnZSwgMCwgJm51bSk7Ci0JaWYgKHJldCkKLQkJZ290byBlbmQ7Ci0KLQlpZiAobnVtID4gMikgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVuZDsKLQl9Ci0KLQlvcHRzLT5pbnRfbXVsdCA9IG51bTsKLQlyZXQgPSBsZW47Ci1lbmQ6Ci0JbXV0ZXhfdW5sb2NrKCZvcHRzLT5sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGZfc3Nfb3B0c19hdHRyaWJ1dGUgZl9zc19vcHRzX2ludF9tdWx0ID0KLQlfX0NPTkZJR0ZTX0FUVFIoaW50X211bHQsIFNfSVJVR08gfCBTX0lXVVNSLAotCQkJZl9zc19vcHRzX2ludF9tdWx0X3Nob3csCi0JCQlmX3NzX29wdHNfaW50X211bHRfc3RvcmUpOwotCi1zdGF0aWMgc3NpemVfdCBmX3NzX29wdHNfaW50X21heGJ1cnN0X3Nob3coc3RydWN0IGZfc3Nfb3B0cyAqb3B0cywgY2hhciAqcGFnZSkKLXsKLQlpbnQgcmVzdWx0OwotCi0JbXV0ZXhfbG9jaygmb3B0cy0+bG9jayk7Ci0JcmVzdWx0ID0gc3ByaW50ZihwYWdlLCAiJXUiLCBvcHRzLT5pbnRfbWF4YnVyc3QpOwotCW11dGV4X3VubG9jaygmb3B0cy0+bG9jayk7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgc3NpemVfdCBmX3NzX29wdHNfaW50X21heGJ1cnN0X3N0b3JlKHN0cnVjdCBmX3NzX29wdHMgKm9wdHMsCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKnBhZ2UsIHNpemVfdCBsZW4pCi17Ci0JaW50IHJldDsKLQl1OCBudW07Ci0KLQltdXRleF9sb2NrKCZvcHRzLT5sb2NrKTsKLQlpZiAob3B0cy0+cmVmY250KSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBlbmQ7Ci0JfQotCi0JcmV0ID0ga3N0cnRvdTgocGFnZSwgMCwgJm51bSk7Ci0JaWYgKHJldCkKLQkJZ290byBlbmQ7Ci0KLQlpZiAobnVtID4gMTUpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlbmQ7Ci0JfQotCi0Jb3B0cy0+aW50X21heGJ1cnN0ID0gbnVtOwotCXJldCA9IGxlbjsKLWVuZDoKLQltdXRleF91bmxvY2soJm9wdHMtPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZl9zc19vcHRzX2F0dHJpYnV0ZSBmX3NzX29wdHNfaW50X21heGJ1cnN0ID0KLQlfX0NPTkZJR0ZTX0FUVFIoaW50X21heGJ1cnN0LCBTX0lSVUdPIHwgU19JV1VTUiwKLQkJCWZfc3Nfb3B0c19pbnRfbWF4YnVyc3Rfc2hvdywKLQkJCWZfc3Nfb3B0c19pbnRfbWF4YnVyc3Rfc3RvcmUpOwotCiBzdGF0aWMgc3RydWN0IGNvbmZpZ2ZzX2F0dHJpYnV0ZSAqc3NfYXR0cnNbXSA9IHsKIAkmZl9zc19vcHRzX3BhdHRlcm4uYXR0ciwKIAkmZl9zc19vcHRzX2lzb2NfaW50ZXJ2YWwuYXR0ciwKQEAgLTE2NTEsMTAgKzExODYsNiBAQAogCSZmX3NzX29wdHNfaXNvY19tdWx0LmF0dHIsCiAJJmZfc3Nfb3B0c19pc29jX21heGJ1cnN0LmF0dHIsCiAJJmZfc3Nfb3B0c19idWxrX2J1Zmxlbi5hdHRyLAotCSZmX3NzX29wdHNfaW50X2ludGVydmFsLmF0dHIsCi0JJmZfc3Nfb3B0c19pbnRfbWF4cGFja2V0LmF0dHIsCi0JJmZfc3Nfb3B0c19pbnRfbXVsdC5hdHRyLAotCSZmX3NzX29wdHNfaW50X21heGJ1cnN0LmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTE2ODQsOCArMTIxNSw2IEBACiAJc3Nfb3B0cy0+aXNvY19pbnRlcnZhbCA9IEdaRVJPX0lTT0NfSU5URVJWQUw7CiAJc3Nfb3B0cy0+aXNvY19tYXhwYWNrZXQgPSBHWkVST19JU09DX01BWFBBQ0tFVDsKIAlzc19vcHRzLT5idWxrX2J1ZmxlbiA9IEdaRVJPX0JVTEtfQlVGTEVOOwotCXNzX29wdHMtPmludF9pbnRlcnZhbCA9IEdaRVJPX0lOVF9JTlRFUlZBTDsKLQlzc19vcHRzLT5pbnRfbWF4cGFja2V0ID0gR1pFUk9fSU5UX01BWFBBQ0tFVDsKIAogCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmc3Nfb3B0cy0+ZnVuY19pbnN0Lmdyb3VwLCAiIiwKIAkJCQkgICAgJnNzX2Z1bmNfdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZ196ZXJvLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vZ196ZXJvLmgKaW5kZXggMmNlMjhiOS4uMTVmMTgwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL2dfemVyby5oCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mdW5jdGlvbi9nX3plcm8uaApAQCAtMTAsOCArMTAsNiBAQAogI2RlZmluZSBHWkVST19RTEVOCQkzMgogI2RlZmluZSBHWkVST19JU09DX0lOVEVSVkFMCTQKICNkZWZpbmUgR1pFUk9fSVNPQ19NQVhQQUNLRVQJMTAyNAotI2RlZmluZSBHWkVST19JTlRfSU5URVJWQUwJMSAvKiBEZWZhdWx0IGludGVycnVwdCBpbnRlcnZhbCA9IDEgbXMgKi8KLSNkZWZpbmUgR1pFUk9fSU5UX01BWFBBQ0tFVAkxMDI0CiAKIHN0cnVjdCB1c2JfemVyb19vcHRpb25zIHsKIAl1bnNpZ25lZCBwYXR0ZXJuOwpAQCAtMTksMTAgKzE3LDYgQEAKIAl1bnNpZ25lZCBpc29jX21heHBhY2tldDsKIAl1bnNpZ25lZCBpc29jX211bHQ7CiAJdW5zaWduZWQgaXNvY19tYXhidXJzdDsKLQl1bnNpZ25lZCBpbnRfaW50ZXJ2YWw7IC8qIEluIG1zICovCi0JdW5zaWduZWQgaW50X21heHBhY2tldDsKLQl1bnNpZ25lZCBpbnRfbXVsdDsKLQl1bnNpZ25lZCBpbnRfbWF4YnVyc3Q7CiAJdW5zaWduZWQgYnVsa19idWZsZW47CiAJdW5zaWduZWQgcWxlbjsKIH07CkBAIC0zNCwxMCArMjgsNiBAQAogCXVuc2lnbmVkIGlzb2NfbWF4cGFja2V0OwogCXVuc2lnbmVkIGlzb2NfbXVsdDsKIAl1bnNpZ25lZCBpc29jX21heGJ1cnN0OwotCXVuc2lnbmVkIGludF9pbnRlcnZhbDsgLyogSW4gbXMgKi8KLQl1bnNpZ25lZCBpbnRfbWF4cGFja2V0OwotCXVuc2lnbmVkIGludF9tdWx0OwotCXVuc2lnbmVkIGludF9tYXhidXJzdDsKIAl1bnNpZ25lZCBidWxrX2J1ZmxlbjsKIAogCS8qCkBAIC03Miw3ICs2Miw2IEBACiB2b2lkIGZyZWVfZXBfcmVxKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSk7CiB2b2lkIGRpc2FibGVfZW5kcG9pbnRzKHN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiwKIAkJc3RydWN0IHVzYl9lcCAqaW4sIHN0cnVjdCB1c2JfZXAgKm91dCwKLQkJc3RydWN0IHVzYl9lcCAqaXNvX2luLCBzdHJ1Y3QgdXNiX2VwICppc29fb3V0LAotCQlzdHJ1Y3QgdXNiX2VwICppbnRfaW4sIHN0cnVjdCB1c2JfZXAgKmludF9vdXQpOworCQlzdHJ1Y3QgdXNiX2VwICppc29faW4sIHN0cnVjdCB1c2JfZXAgKmlzb19vdXQpOwogCiAjZW5kaWYgLyogX19HX1pFUk9fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3VfcHJpbnRlci5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3VfcHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMmM0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9wcmludGVyLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIHVfcHJpbnRlci5oCisgKgorICogVXRpbGl0eSBkZWZpbml0aW9ucyBmb3IgdGhlIHByaW50ZXIgZnVuY3Rpb24KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tCisgKgorICogQXV0aG9yOiBBbmRyemVqIFBpZXRyYXNpZXdpY3ogPGFuZHJ6ZWoucEBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgVV9QUklOVEVSX0gKKyNkZWZpbmUgVV9QUklOVEVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3VzYi9jb21wb3NpdGUuaD4KKworI2RlZmluZSBQTlBfU1RSSU5HX0xFTgkJCTEwMjQKKworc3RydWN0IGZfcHJpbnRlcl9vcHRzIHsKKwlzdHJ1Y3QgdXNiX2Z1bmN0aW9uX2luc3RhbmNlCWZ1bmNfaW5zdDsKKwlpbnQJCQkJbWlub3I7CisJY2hhcgkJCQlwbnBfc3RyaW5nW1BOUF9TVFJJTkdfTEVOXTsKKwl1bnNpZ25lZAkJCXFfbGVuOworCisJLyoKKwkgKiBQcm90ZWN0IHRoZSBkYXRhIGZyb20gY29uY3VycmVudCBhY2Nlc3MgYnkgcmVhZC93cml0ZQorCSAqIGFuZCBjcmVhdGUgc3ltbGluay9yZW1vdmUgc3ltbGluaworCSAqLworCXN0cnVjdCBtdXRleAkJCWxvY2s7CisJaW50CQkJCXJlZmNudDsKK307CisKKyNlbmRpZiAvKiBVX1BSSU5URVJfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2Z1bmN0aW9uL3Vfc2VyaWFsLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9zZXJpYWwuYwppbmRleCA0OTEwODJhLi44OTE3OWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9zZXJpYWwuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnVuY3Rpb24vdV9zZXJpYWwuYwpAQCAtOTEyLDcgKzkxMiw3IEBACiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAlpbnQJCXN0YXR1czsKIAotCXByX3ZkZWJ1ZygiZ3NfcHV0X2NoYXI6ICglZCwlcCkgY2hhcj0weCV4LCBjYWxsZWQgZnJvbSAlcGZcbiIsCisJcHJfdmRlYnVnKCJnc19wdXRfY2hhcjogKCVkLCVwKSBjaGFyPTB4JXgsIGNhbGxlZCBmcm9tICVwc1xuIiwKIAkJcG9ydC0+cG9ydF9udW0sIHR0eSwgY2gsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+cG9ydF9sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L0tjb25maWcKaW5kZXggMTEzYzg3ZS4uZDVhNzEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvS2NvbmZpZwpAQCAtMzAxLDYgKzMwMSw3IEBACiBjb25maWcgVVNCX0dfUFJJTlRFUgogCXRyaXN0YXRlICJQcmludGVyIEdhZGdldCIKIAlzZWxlY3QgVVNCX0xJQkNPTVBPU0lURQorCXNlbGVjdCBVU0JfRl9QUklOVEVSCiAJaGVscAogCSAgVGhlIFByaW50ZXIgR2FkZ2V0IGNoYW5uZWxzIGRhdGEgYmV0d2VlbiB0aGUgVVNCIGhvc3QgYW5kIGEKIAkgIHVzZXJzcGFjZSBwcm9ncmFtIGRyaXZpbmcgdGhlIHByaW50IGVuZ2luZS4gVGhlIHVzZXIgc3BhY2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvaW5vZGUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvaW5vZGUuYwppbmRleCAyMDBmOWE1Li42YWY1OGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L2lub2RlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9pbm9kZS5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPGxpbnV4L21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgpAQCAtNDY5LDcgKzQ3MCw3IEBACiAJCXJldCA9IC1FRkFVTFQ7CiAKIAkvKiBjb21wbGV0aW5nIHRoZSBpb2NiIGNhbiBkcm9wIHRoZSBjdHggYW5kIG1tLCBkb24ndCB0b3VjaCBtbSBhZnRlciAqLwotCWFpb19jb21wbGV0ZShpb2NiLCByZXQsIHJldCk7CisJaW9jYi0+a2lfY29tcGxldGUoaW9jYiwgcmV0LCByZXQpOwogCiAJa2ZyZWUocHJpdi0+YnVmKTsKIAlrZnJlZShwcml2LT50b19mcmVlKTsKQEAgLTQ5Nyw3ICs0OTgsOCBAQAogCQlrZnJlZShwcml2KTsKIAkJaW9jYi0+cHJpdmF0ZSA9IE5VTEw7CiAJCS8qIGFpb19jb21wbGV0ZSgpIHJlcG9ydHMgYnl0ZXMtdHJhbnNmZXJyZWQgX2FuZF8gZmF1bHRzICovCi0JCWFpb19jb21wbGV0ZShpb2NiLCByZXEtPmFjdHVhbCA/IHJlcS0+YWN0dWFsIDogcmVxLT5zdGF0dXMsCisKKwkJaW9jYi0+a2lfY29tcGxldGUoaW9jYiwgcmVxLT5hY3R1YWwgPyByZXEtPmFjdHVhbCA6IHJlcS0+c3RhdHVzLAogCQkJCXJlcS0+c3RhdHVzKTsKIAl9IGVsc2UgewogCQkvKiBlcF9jb3B5X3RvX3VzZXIoKSB3b24ndCByZXBvcnQgYm90aDsgd2UgaGlkZSBzb21lIGZhdWx0cyAqLwpAQCAtNjk3LDggKzY5OSw2IEBACiAJLm9wZW4gPQkJZXBfb3BlbiwKIAkucmVsZWFzZSA9CWVwX3JlbGVhc2UsCiAJLmxsc2VlayA9CW5vX2xsc2VlaywKLQkucmVhZCA9CQluZXdfc3luY19yZWFkLAotCS53cml0ZSA9CW5ld19zeW5jX3dyaXRlLAogCS51bmxvY2tlZF9pb2N0bCA9IGVwX2lvY3RsLAogCS5yZWFkX2l0ZXIgPQllcF9yZWFkX2l0ZXIsCiAJLndyaXRlX2l0ZXIgPQllcF93cml0ZV9pdGVyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS9wcmludGVyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L3ByaW50ZXIuYwppbmRleCA5MDU0NTk4Li5kNWI2ZWU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L3ByaW50ZXIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L3ByaW50ZXIuYwpAQCAtMTIsMjkgKzEyLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcG9sbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KLSNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+Ci0KICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgogCiAjaW5jbHVkZSA8bGludXgvdXNiL2NoOS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9jb21wb3NpdGUuaD4KQEAgLTQ2LDUwICsyNCwxMiBAQAogVVNCX0dBREdFVF9DT01QT1NJVEVfT1BUSU9OUygpOwogCiAjZGVmaW5lIERSSVZFUl9ERVNDCQkiUHJpbnRlciBHYWRnZXQiCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMjAwNyBPQ1QgMDYiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMjAxNSBGRUIgMTciCiAKLXN0YXRpYyBERUZJTkVfTVVURVgocHJpbnRlcl9tdXRleCk7CiBzdGF0aWMgY29uc3QgY2hhciBzaG9ydG5hbWUgW10gPSAicHJpbnRlciI7CiBzdGF0aWMgY29uc3QgY2hhciBkcml2ZXJfZGVzYyBbXSA9IERSSVZFUl9ERVNDOwogCi1zdGF0aWMgZGV2X3QgZ19wcmludGVyX2Rldm5vOwotCi1zdGF0aWMgc3RydWN0IGNsYXNzICp1c2JfZ2FkZ2V0X2NsYXNzOwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdHJ1Y3QgcHJpbnRlcl9kZXYgewotCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBsb2NrIHRoaXMgc3RydWN0dXJlICovCi0JLyogbG9jayBidWZmZXIgbGlzdHMgZHVyaW5nIHJlYWQvd3JpdGUgY2FsbHMgKi8KLQlzdHJ1Y3QgbXV0ZXgJCWxvY2tfcHJpbnRlcl9pbzsKLQlzdHJ1Y3QgdXNiX2dhZGdldAkqZ2FkZ2V0OwotCXM4CQkJaW50ZXJmYWNlOwotCXN0cnVjdCB1c2JfZXAJCSppbl9lcCwgKm91dF9lcDsKLQotCXN0cnVjdCBsaXN0X2hlYWQJcnhfcmVxczsJLyogTGlzdCBvZiBmcmVlIFJYIHN0cnVjdHMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXJ4X3JlcXNfYWN0aXZlOwkvKiBMaXN0IG9mIEFjdGl2ZSBSWCB4ZmVycyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcnhfYnVmZmVyczsJLyogTGlzdCBvZiBjb21wbGV0ZWQgeGZlcnMgKi8KLQkvKiB3YWl0IHVudGlsIHRoZXJlIGlzIGRhdGEgdG8gYmUgcmVhZC4gKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAlyeF93YWl0OwotCXN0cnVjdCBsaXN0X2hlYWQJdHhfcmVxczsJLyogTGlzdCBvZiBmcmVlIFRYIHN0cnVjdHMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCXR4X3JlcXNfYWN0aXZlOyAvKiBMaXN0IG9mIEFjdGl2ZSBUWCB4ZmVycyAqLwotCS8qIFdhaXQgdW50aWwgdGhlcmUgYXJlIHdyaXRlIGJ1ZmZlcnMgYXZhaWxhYmxlIHRvIHVzZS4gKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdAl0eF93YWl0OwotCS8qIFdhaXQgdW50aWwgYWxsIHdyaXRlIGJ1ZmZlcnMgaGF2ZSBiZWVuIHNlbnQuICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QJdHhfZmx1c2hfd2FpdDsKLQlzdHJ1Y3QgdXNiX3JlcXVlc3QJKmN1cnJlbnRfcnhfcmVxOwotCXNpemVfdAkJCWN1cnJlbnRfcnhfYnl0ZXM7Ci0JdTgJCQkqY3VycmVudF9yeF9idWY7Ci0JdTgJCQlwcmludGVyX3N0YXR1czsKLQl1OAkJCXJlc2V0X3ByaW50ZXI7Ci0Jc3RydWN0IGNkZXYJCXByaW50ZXJfY2RldjsKLQlzdHJ1Y3QgZGV2aWNlCQkqcGRldjsKLQl1OAkJCXByaW50ZXJfY2Rldl9vcGVuOwotCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7Ci0Jc3RydWN0IHVzYl9mdW5jdGlvbglmdW5jdGlvbjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcHJpbnRlcl9kZXYgdXNiX3ByaW50ZXJfZ2FkZ2V0OworI2luY2x1ZGUgInVfcHJpbnRlci5oIgogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogCkBAIC0xMjAsNiArNjAsOSBAQAogCiAjZGVmaW5lIFFMRU4JcWxlbgogCitzdGF0aWMgc3RydWN0IHVzYl9mdW5jdGlvbl9pbnN0YW5jZSAqZmlfcHJpbnRlcjsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmX3ByaW50ZXI7CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qCkBAIC0xMjcsMTAgKzcwLDYgQEAKICAqIGRlc2NyaXB0b3JzIGFyZSBidWlsdCBvbiBkZW1hbmQuCiAgKi8KIAotLyogaG9sZHMgb3VyIGJpZ2dlc3QgZGVzY3JpcHRvciAqLwotI2RlZmluZSBVU0JfREVTQ19CVUZTSVpFCQkyNTYKLSNkZWZpbmUgVVNCX0JVRlNJWkUJCQk4MTkyCi0KIHN0YXRpYyBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIGRldmljZV9kZXNjID0gewogCS5iTGVuZ3RoID0JCXNpemVvZiBkZXZpY2VfZGVzYywKIAkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0RFVklDRSwKQEAgLTE0MywxMDggKzgyLDYgQEAKIAkuYk51bUNvbmZpZ3VyYXRpb25zID0JMQogfTsKIAotc3RhdGljIHN0cnVjdCB1c2JfaW50ZXJmYWNlX2Rlc2NyaXB0b3IgaW50Zl9kZXNjID0gewotCS5iTGVuZ3RoID0JCXNpemVvZiBpbnRmX2Rlc2MsCi0JLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9JTlRFUkZBQ0UsCi0JLmJOdW1FbmRwb2ludHMgPQkyLAotCS5iSW50ZXJmYWNlQ2xhc3MgPQlVU0JfQ0xBU1NfUFJJTlRFUiwKLQkuYkludGVyZmFjZVN1YkNsYXNzID0JMSwJLyogUHJpbnRlciBTdWItQ2xhc3MgKi8KLQkuYkludGVyZmFjZVByb3RvY29sID0JMiwJLyogQmktRGlyZWN0aW9uYWwgKi8KLQkuaUludGVyZmFjZSA9CQkwCi19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGZzX2VwX2luX2Rlc2MgPSB7Ci0JLmJMZW5ndGggPQkJVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0JLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9FTkRQT0lOVCwKLQkuYkVuZHBvaW50QWRkcmVzcyA9CVVTQl9ESVJfSU4sCi0JLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLCi19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGZzX2VwX291dF9kZXNjID0gewotCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCi0JLmJFbmRwb2ludEFkZHJlc3MgPQlVU0JfRElSX09VVCwKLQkuYm1BdHRyaWJ1dGVzID0JCVVTQl9FTkRQT0lOVF9YRkVSX0JVTEsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpmc19wcmludGVyX2Z1bmN0aW9uW10gPSB7Ci0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmludGZfZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNfZXBfaW5fZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmZnNfZXBfb3V0X2Rlc2MsCi0JTlVMTAotfTsKLQotLyoKLSAqIHVzYiAyLjAgZGV2aWNlcyBuZWVkIHRvIGV4cG9zZSBib3RoIGhpZ2ggc3BlZWQgYW5kIGZ1bGwgc3BlZWQKLSAqIGRlc2NyaXB0b3JzLCB1bmxlc3MgdGhleSBvbmx5IHJ1biBhdCBmdWxsIHNwZWVkLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgaHNfZXBfaW5fZGVzYyA9IHsKLQkuYkxlbmd0aCA9CQlVU0JfRFRfRU5EUE9JTlRfU0laRSwKLQkuYkRlc2NyaXB0b3JUeXBlID0JVVNCX0RUX0VORFBPSU5ULAotCS5ibUF0dHJpYnV0ZXMgPQkJVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKLQkud01heFBhY2tldFNpemUgPQljcHVfdG9fbGUxNig1MTIpCi19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIGhzX2VwX291dF9kZXNjID0gewotCS5iTGVuZ3RoID0JCVVTQl9EVF9FTkRQT0lOVF9TSVpFLAotCS5iRGVzY3JpcHRvclR5cGUgPQlVU0JfRFRfRU5EUE9JTlQsCi0JLmJtQXR0cmlidXRlcyA9CQlVU0JfRU5EUE9JTlRfWEZFUl9CVUxLLAotCS53TWF4UGFja2V0U2l6ZSA9CWNwdV90b19sZTE2KDUxMikKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX3F1YWxpZmllcl9kZXNjcmlwdG9yIGRldl9xdWFsaWZpZXIgPSB7Ci0JLmJMZW5ndGggPQkJc2l6ZW9mIGRldl9xdWFsaWZpZXIsCi0JLmJEZXNjcmlwdG9yVHlwZSA9CVVTQl9EVF9ERVZJQ0VfUVVBTElGSUVSLAotCS5iY2RVU0IgPQkJY3B1X3RvX2xlMTYoMHgwMjAwKSwKLQkuYkRldmljZUNsYXNzID0JCVVTQl9DTEFTU19QUklOVEVSLAotCS5iTnVtQ29uZmlndXJhdGlvbnMgPQkxCi19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqaHNfcHJpbnRlcl9mdW5jdGlvbltdID0gewotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZpbnRmX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX2VwX2luX2Rlc2MsCi0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmhzX2VwX291dF9kZXNjLAotCU5VTEwKLX07Ci0KLS8qCi0gKiBBZGRlZCBlbmRwb2ludCBkZXNjcmlwdG9ycyBmb3IgMy4wIGRldmljZXMKLSAqLwotCi1zdGF0aWMgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yIHNzX2VwX2luX2Rlc2MgPSB7Ci0JLmJMZW5ndGggPSAgICAgICAgICAgICAgVVNCX0RUX0VORFBPSU5UX1NJWkUsCi0JLmJEZXNjcmlwdG9yVHlwZSA9ICAgICAgVVNCX0RUX0VORFBPSU5ULAotCS5ibUF0dHJpYnV0ZXMgPSAgICAgICAgIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEssCi0JLndNYXhQYWNrZXRTaXplID0gICAgICAgY3B1X3RvX2xlMTYoMTAyNCksCi19OwotCi1zdGF0aWMgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3Igc3NfZXBfaW5fY29tcF9kZXNjID0gewotCS5iTGVuZ3RoID0gICAgICAgICAgICAgIHNpemVvZihzc19lcF9pbl9jb21wX2Rlc2MpLAotCS5iRGVzY3JpcHRvclR5cGUgPSAgICAgIFVTQl9EVF9TU19FTkRQT0lOVF9DT01QLAotfTsKLQotc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBzc19lcF9vdXRfZGVzYyA9IHsKLQkuYkxlbmd0aCA9ICAgICAgICAgICAgICBVU0JfRFRfRU5EUE9JTlRfU0laRSwKLQkuYkRlc2NyaXB0b3JUeXBlID0gICAgICBVU0JfRFRfRU5EUE9JTlQsCi0JLmJtQXR0cmlidXRlcyA9ICAgICAgICAgVVNCX0VORFBPSU5UX1hGRVJfQlVMSywKLQkud01heFBhY2tldFNpemUgPSAgICAgICBjcHVfdG9fbGUxNigxMDI0KSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciBzc19lcF9vdXRfY29tcF9kZXNjID0gewotCS5iTGVuZ3RoID0gICAgICAgICAgICAgIHNpemVvZihzc19lcF9vdXRfY29tcF9kZXNjKSwKLQkuYkRlc2NyaXB0b3JUeXBlID0gICAgICBVU0JfRFRfU1NfRU5EUE9JTlRfQ09NUCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICpzc19wcmludGVyX2Z1bmN0aW9uW10gPSB7Ci0JKHN0cnVjdCB1c2JfZGVzY3JpcHRvcl9oZWFkZXIgKikgJmludGZfZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfZXBfaW5fZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfZXBfaW5fY29tcF9kZXNjLAotCShzdHJ1Y3QgdXNiX2Rlc2NyaXB0b3JfaGVhZGVyICopICZzc19lcF9vdXRfZGVzYywKLQkoc3RydWN0IHVzYl9kZXNjcmlwdG9yX2hlYWRlciAqKSAmc3NfZXBfb3V0X2NvbXBfZGVzYywKLQlOVUxMCi19OwotCiBzdGF0aWMgc3RydWN0IHVzYl9vdGdfZGVzY3JpcHRvciBvdGdfZGVzY3JpcHRvciA9IHsKIAkuYkxlbmd0aCA9ICAgICAgICAgICAgICBzaXplb2Ygb3RnX2Rlc2NyaXB0b3IsCiAJLmJEZXNjcmlwdG9yVHlwZSA9ICAgICAgVVNCX0RUX09URywKQEAgLTI1NiwyOSArOTMsMTMgQEAKIAlOVUxMLAogfTsKIAotLyogbWF4cGFja2V0IGFuZCBvdGhlciB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MgdmFyeSBieSBzcGVlZC4gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcF9kZXNjKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsCi0JCQkJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZnMsCi0JCQkJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqaHMsCi0JCQkJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqc3MpCi17Ci0Jc3dpdGNoIChnYWRnZXQtPnNwZWVkKSB7Ci0JY2FzZSBVU0JfU1BFRURfU1VQRVI6Ci0JCXJldHVybiBzczsKLQljYXNlIFVTQl9TUEVFRF9ISUdIOgotCQlyZXR1cm4gaHM7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGZzOwotCX0KLX0KLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAogLyogZGVzY3JpcHRvcnMgdGhhdCBhcmUgYnVpbHQgb24tZGVtYW5kICovCiAKIHN0YXRpYyBjaGFyCQkJCXByb2R1Y3RfZGVzYyBbNDBdID0gRFJJVkVSX0RFU0M7CiBzdGF0aWMgY2hhcgkJCQlzZXJpYWxfbnVtIFs0MF0gPSAiMSI7Ci1zdGF0aWMgY2hhcgkJCQlwbnBfc3RyaW5nIFsxMDI0XSA9CitzdGF0aWMgY2hhcgkJCQlwbnBfc3RyaW5nW1BOUF9TVFJJTkdfTEVOXSA9CiAJIlhYTUZHOmxpbnV4O01ETDpnX3ByaW50ZXI7Q0xTOlBSSU5URVI7U046MTsiOwogCiAvKiBzdGF0aWMgc3RyaW5ncywgaW4gVVRGLTggKi8KQEAgLTI5OSw5MjEgKzEyMCwxOSBAQAogCU5VTEwsCiB9OwogCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgc3RydWN0IHVzYl9yZXF1ZXN0ICoKLXByaW50ZXJfcmVxX2FsbG9jKHN0cnVjdCB1c2JfZXAgKmVwLCB1bnNpZ25lZCBsZW4sIGdmcF90IGdmcF9mbGFncykKLXsKLQlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcTsKLQotCXJlcSA9IHVzYl9lcF9hbGxvY19yZXF1ZXN0KGVwLCBnZnBfZmxhZ3MpOwotCi0JaWYgKHJlcSAhPSBOVUxMKSB7Ci0JCXJlcS0+bGVuZ3RoID0gbGVuOwotCQlyZXEtPmJ1ZiA9IGttYWxsb2MobGVuLCBnZnBfZmxhZ3MpOwotCQlpZiAocmVxLT5idWYgPT0gTlVMTCkgewotCQkJdXNiX2VwX2ZyZWVfcmVxdWVzdChlcCwgcmVxKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJlcTsKLX0KLQotc3RhdGljIHZvaWQKLXByaW50ZXJfcmVxX2ZyZWUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQotewotCWlmIChlcCAhPSBOVUxMICYmIHJlcSAhPSBOVUxMKSB7Ci0JCWtmcmVlKHJlcS0+YnVmKTsKLQkJdXNiX2VwX2ZyZWVfcmVxdWVzdChlcCwgcmVxKTsKLQl9Ci19Ci0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIHJ4X2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgcHJpbnRlcl9kZXYJKmRldiA9IGVwLT5kcml2ZXJfZGF0YTsKLQlpbnQJCQlzdGF0dXMgPSByZXEtPnN0YXR1czsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQotCWxpc3RfZGVsX2luaXQoJnJlcS0+bGlzdCk7CS8qIFJlbW9kZSBmcm9tIEFjdGl2ZSBMaXN0ICovCi0KLQlzd2l0Y2ggKHN0YXR1cykgewotCi0JLyogbm9ybWFsIGNvbXBsZXRpb24gKi8KLQljYXNlIDA6Ci0JCWlmIChyZXEtPmFjdHVhbCA+IDApIHsKLQkJCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwgJmRldi0+cnhfYnVmZmVycyk7Ci0JCQlEQkcoZGV2LCAiR19QcmludGVyIDogcnggbGVuZ3RoICVkXG4iLCByZXEtPmFjdHVhbCk7Ci0JCX0gZWxzZSB7Ci0JCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKLQkJfQotCQlicmVhazsKLQotCS8qIHNvZnR3YXJlLWRyaXZlbiBpbnRlcmZhY2Ugc2h1dGRvd24gKi8KLQljYXNlIC1FQ09OTlJFU0VUOgkJLyogdW5saW5rICovCi0JY2FzZSAtRVNIVVRET1dOOgkJLyogZGlzY29ubmVjdCBldGMgKi8KLQkJVkRCRyhkZXYsICJyeCBzaHV0ZG93biwgY29kZSAlZFxuIiwgc3RhdHVzKTsKLQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7Ci0JCWJyZWFrOwotCi0JLyogZm9yIGhhcmR3YXJlIGF1dG9tYWdpYyAoc3VjaCBhcyBweGEpICovCi0JY2FzZSAtRUNPTk5BQk9SVEVEOgkJLyogZW5kcG9pbnQgcmVzZXQgKi8KLQkJREJHKGRldiwgInJ4ICVzIHJlc2V0XG4iLCBlcC0+bmFtZSk7Ci0JCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwotCQlicmVhazsKLQotCS8qIGRhdGEgb3ZlcnJ1biAqLwotCWNhc2UgLUVPVkVSRkxPVzoKLQkJLyogRkFMTFRIUk9VR0ggKi8KLQotCWRlZmF1bHQ6Ci0JCURCRyhkZXYsICJyeCBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7Ci0JCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwotCQlicmVhazsKLQl9Ci0KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+cnhfd2FpdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHR4X2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgcHJpbnRlcl9kZXYJKmRldiA9IGVwLT5kcml2ZXJfZGF0YTsKLQotCXN3aXRjaCAocmVxLT5zdGF0dXMpIHsKLQlkZWZhdWx0OgotCQlWREJHKGRldiwgInR4IGVyciAlZFxuIiwgcmVxLT5zdGF0dXMpOwotCQkvKiBGQUxMVEhST1VHSCAqLwotCWNhc2UgLUVDT05OUkVTRVQ6CQkvKiB1bmxpbmsgKi8KLQljYXNlIC1FU0hVVERPV046CQkvKiBkaXNjb25uZWN0IGV0YyAqLwotCQlicmVhazsKLQljYXNlIDA6Ci0JCWJyZWFrOwotCX0KLQotCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsKLQkvKiBUYWtlIHRoZSByZXF1ZXN0IHN0cnVjdCBvZmYgdGhlIGFjdGl2ZSBsaXN0IGFuZCBwdXQgaXQgb24gdGhlCi0JICogZnJlZSBsaXN0LgotCSAqLwotCWxpc3RfZGVsX2luaXQoJnJlcS0+bGlzdCk7Ci0JbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+dHhfcmVxcyk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnR4X3dhaXQpOwotCWlmIChsaWtlbHkobGlzdF9lbXB0eSgmZGV2LT50eF9yZXFzX2FjdGl2ZSkpKQotCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+dHhfZmx1c2hfd2FpdCk7Ci0KLQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsKLX0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIGludAotcHJpbnRlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmZCkKLXsKLQlzdHJ1Y3QgcHJpbnRlcl9kZXYJKmRldjsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQlpbnQJCQlyZXQgPSAtRUJVU1k7Ci0KLQltdXRleF9sb2NrKCZwcmludGVyX211dGV4KTsKLQlkZXYgPSBjb250YWluZXJfb2YoaW5vZGUtPmlfY2Rldiwgc3RydWN0IHByaW50ZXJfZGV2LCBwcmludGVyX2NkZXYpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCFkZXYtPnByaW50ZXJfY2Rldl9vcGVuKSB7Ci0JCWRldi0+cHJpbnRlcl9jZGV2X29wZW4gPSAxOwotCQlmZC0+cHJpdmF0ZV9kYXRhID0gZGV2OwotCQlyZXQgPSAwOwotCQkvKiBDaGFuZ2UgdGhlIHByaW50ZXIgc3RhdHVzIHRvIHNob3cgdGhhdCBpdCdzIG9uLWxpbmUuICovCi0JCWRldi0+cHJpbnRlcl9zdGF0dXMgfD0gUFJJTlRFUl9TRUxFQ1RFRDsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQotCURCRyhkZXYsICJwcmludGVyX29wZW4gcmV0dXJuZWQgJXhcbiIsIHJldCk7Ci0JbXV0ZXhfdW5sb2NrKCZwcmludGVyX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50Ci1wcmludGVyX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmZCkKLXsKLQlzdHJ1Y3QgcHJpbnRlcl9kZXYJKmRldiA9IGZkLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0JZGV2LT5wcmludGVyX2NkZXZfb3BlbiA9IDA7Ci0JZmQtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0JLyogQ2hhbmdlIHByaW50ZXIgc3RhdHVzIHRvIHNob3cgdGhhdCB0aGUgcHJpbnRlciBpcyBvZmYtbGluZS4gKi8KLQlkZXYtPnByaW50ZXJfc3RhdHVzICY9IH5QUklOVEVSX1NFTEVDVEVEOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCi0JREJHKGRldiwgInByaW50ZXJfY2xvc2VcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIHR1cm5lZCBvZmYuICovCi1zdGF0aWMgdm9pZAotc2V0dXBfcnhfcmVxcyhzdHJ1Y3QgcHJpbnRlcl9kZXYgKmRldikKLXsKLQlzdHJ1Y3QgdXNiX3JlcXVlc3QgICAgICAgICAgICAgICpyZXE7Ci0KLQl3aGlsZSAobGlrZWx5KCFsaXN0X2VtcHR5KCZkZXYtPnJ4X3JlcXMpKSkgewotCQlpbnQgZXJyb3I7Ci0KLQkJcmVxID0gY29udGFpbmVyX29mKGRldi0+cnhfcmVxcy5uZXh0LAotCQkJCXN0cnVjdCB1c2JfcmVxdWVzdCwgbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnJlcS0+bGlzdCk7Ci0KLQkJLyogVGhlIFVTQiBIb3N0IHNlbmRzIHVzIHdoYXRldmVyIGFtb3VudCBvZiBkYXRhIGl0IHdhbnRzIHRvCi0JCSAqIHNvIHdlIGFsd2F5cyBzZXQgdGhlIGxlbmd0aCBmaWVsZCB0byB0aGUgZnVsbCBVU0JfQlVGU0laRS4KLQkJICogSWYgdGhlIGFtb3VudCBvZiBkYXRhIGlzIG1vcmUgdGhhbiB0aGUgcmVhZCgpIGNhbGxlciBhc2tlZAotCQkgKiBmb3IgaXQgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHJlcXVlc3QgYnVmZmVyIHVudGlsIGl0IGlzCi0JCSAqIGFza2VkIGZvciBieSByZWFkKCkuCi0JCSAqLwotCQlyZXEtPmxlbmd0aCA9IFVTQl9CVUZTSVpFOwotCQlyZXEtPmNvbXBsZXRlID0gcnhfY29tcGxldGU7Ci0KLQkJLyogaGVyZSwgd2UgdW5sb2NrLCBhbmQgb25seSB1bmxvY2ssIHRvIGF2b2lkIGRlYWRsb2NrLiAqLwotCQlzcGluX3VubG9jaygmZGV2LT5sb2NrKTsKLQkJZXJyb3IgPSB1c2JfZXBfcXVldWUoZGV2LT5vdXRfZXAsIHJlcSwgR0ZQX0FUT01JQyk7Ci0JCXNwaW5fbG9jaygmZGV2LT5sb2NrKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlEQkcoZGV2LCAicnggc3VibWl0IC0tPiAlZFxuIiwgZXJyb3IpOwotCQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBpZiB0aGUgcmVxIGlzIGVtcHR5LCB0aGVuIGFkZCBpdCBpbnRvIGRldi0+cnhfcmVxc19hY3RpdmUuICovCi0JCWVsc2UgaWYgKGxpc3RfZW1wdHkoJnJlcS0+bGlzdCkpIHsKLQkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXNfYWN0aXZlKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHNzaXplX3QKLXByaW50ZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmQsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHRyKQotewotCXN0cnVjdCBwcmludGVyX2RldgkJKmRldiA9IGZkLT5wcml2YXRlX2RhdGE7Ci0JdW5zaWduZWQgbG9uZwkJCWZsYWdzOwotCXNpemVfdAkJCQlzaXplOwotCXNpemVfdAkJCQlieXRlc19jb3BpZWQ7Ci0Jc3RydWN0IHVzYl9yZXF1ZXN0CQkqcmVxOwotCS8qIFRoaXMgaXMgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IFVTQiByeCByZXF1ZXN0LiAqLwotCXN0cnVjdCB1c2JfcmVxdWVzdAkJKmN1cnJlbnRfcnhfcmVxOwotCS8qIFRoaXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgY3VycmVudCByeCBidWZmZXIuICovCi0Jc2l6ZV90CQkJCWN1cnJlbnRfcnhfYnl0ZXM7Ci0JLyogVGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcnggYnVmZmVyLiAqLwotCXU4CQkJCSpjdXJyZW50X3J4X2J1ZjsKLQotCWlmIChsZW4gPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlEQkcoZGV2LCAicHJpbnRlcl9yZWFkIHRyeWluZyB0byByZWFkICVkIGJ5dGVzXG4iLCAoaW50KWxlbik7Ci0KLQltdXRleF9sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCi0JLyogV2Ugd2lsbCB1c2UgdGhpcyBmbGFnIGxhdGVyIHRvIGNoZWNrIGlmIGEgcHJpbnRlciByZXNldCBoYXBwZW5lZAotCSAqIGFmdGVyIHdlIHR1cm4gaW50ZXJydXB0cyBiYWNrIG9uLgotCSAqLwotCWRldi0+cmVzZXRfcHJpbnRlciA9IDA7Ci0KLQlzZXR1cF9yeF9yZXFzKGRldik7Ci0KLQlieXRlc19jb3BpZWQgPSAwOwotCWN1cnJlbnRfcnhfcmVxID0gZGV2LT5jdXJyZW50X3J4X3JlcTsKLQljdXJyZW50X3J4X2J5dGVzID0gZGV2LT5jdXJyZW50X3J4X2J5dGVzOwotCWN1cnJlbnRfcnhfYnVmID0gZGV2LT5jdXJyZW50X3J4X2J1ZjsKLQlkZXYtPmN1cnJlbnRfcnhfcmVxID0gTlVMTDsKLQlkZXYtPmN1cnJlbnRfcnhfYnl0ZXMgPSAwOwotCWRldi0+Y3VycmVudF9yeF9idWYgPSBOVUxMOwotCi0JLyogQ2hlY2sgaWYgdGhlcmUgaXMgYW55IGRhdGEgaW4gdGhlIHJlYWQgYnVmZmVycy4gUGxlYXNlIG5vdGUgdGhhdAotCSAqIGN1cnJlbnRfcnhfYnl0ZXMgaXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgY3VycmVudCByeCBidWZmZXIuCi0JICogSWYgaXQgaXMgemVybyB0aGVuIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgcnhfYnVmZmVycyB0aGF0Ci0JICogYXJlIG9uIHRoZSBjb21wbGV0ZWQgbGlzdC4gV2UgYXJlIG9ubHkgb3V0IG9mIGRhdGEgaWYgYWxsIHJ4Ci0JICogYnVmZmVycyBhcmUgZW1wdHkuCi0JICovCi0JaWYgKChjdXJyZW50X3J4X2J5dGVzID09IDApICYmCi0JCQkobGlrZWx5KGxpc3RfZW1wdHkoJmRldi0+cnhfYnVmZmVycykpKSkgewotCQkvKiBUdXJuIGludGVycnVwdHMgYmFjayBvbiBiZWZvcmUgc2xlZXBpbmcuICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCi0JCS8qCi0JCSAqIElmIG5vIGRhdGEgaXMgYXZhaWxhYmxlIGNoZWNrIGlmIHRoaXMgaXMgYSBOT04tQmxvY2tpbmcKLQkJICogY2FsbCBvciBub3QuCi0JCSAqLwotCQlpZiAoZmQtPmZfZmxhZ3MgJiAoT19OT05CTE9DS3xPX05ERUxBWSkpIHsKLQkJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrX3ByaW50ZXJfaW8pOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQotCQkvKiBTbGVlcCB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZSAqLwotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2LT5yeF93YWl0LAotCQkJCShsaWtlbHkoIWxpc3RfZW1wdHkoJmRldi0+cnhfYnVmZmVycykpKSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQkvKiBXZSBoYXZlIGRhdGEgdG8gcmV0dXJuIHRoZW4gY29weSBpdCB0byB0aGUgY2FsbGVyJ3MgYnVmZmVyLiovCi0Jd2hpbGUgKChjdXJyZW50X3J4X2J5dGVzIHx8IGxpa2VseSghbGlzdF9lbXB0eSgmZGV2LT5yeF9idWZmZXJzKSkpCi0JCQkmJiBsZW4pIHsKLQkJaWYgKGN1cnJlbnRfcnhfYnl0ZXMgPT0gMCkgewotCQkJcmVxID0gY29udGFpbmVyX29mKGRldi0+cnhfYnVmZmVycy5uZXh0LAotCQkJCQlzdHJ1Y3QgdXNiX3JlcXVlc3QsIGxpc3QpOwotCQkJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKLQotCQkJaWYgKHJlcS0+YWN0dWFsICYmIHJlcS0+YnVmKSB7Ci0JCQkJY3VycmVudF9yeF9yZXEgPSByZXE7Ci0JCQkJY3VycmVudF9yeF9ieXRlcyA9IHJlcS0+YWN0dWFsOwotCQkJCWN1cnJlbnRfcnhfYnVmID0gcmVxLT5idWY7Ci0JCQl9IGVsc2UgewotCQkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQl9Ci0KLQkJLyogRG9uJ3QgbGVhdmUgaXJxcyBvZmYgd2hpbGUgZG9pbmcgbWVtb3J5IGNvcGllcyAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAobGVuID4gY3VycmVudF9yeF9ieXRlcykKLQkJCXNpemUgPSBjdXJyZW50X3J4X2J5dGVzOwotCQllbHNlCi0JCQlzaXplID0gbGVuOwotCi0JCXNpemUgLT0gY29weV90b191c2VyKGJ1ZiwgY3VycmVudF9yeF9idWYsIHNpemUpOwotCQlieXRlc19jb3BpZWQgKz0gc2l6ZTsKLQkJbGVuIC09IHNpemU7Ci0JCWJ1ZiArPSBzaXplOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQotCQkvKiBXZSd2ZSBkaXNjb25uZWN0ZWQgb3IgcmVzZXQgc28gcmV0dXJuLiAqLwotCQlpZiAoZGV2LT5yZXNldF9wcmludGVyKSB7Ci0JCQlsaXN0X2FkZCgmY3VycmVudF9yeF9yZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0JCQltdXRleF91bmxvY2soJmRldi0+bG9ja19wcmludGVyX2lvKTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0KLQkJLyogSWYgd2Ugbm90IHJldHVybmluZyBhbGwgdGhlIGRhdGEgbGVmdCBpbiB0aGlzIFJYIHJlcXVlc3QKLQkJICogYnVmZmVyIHRoZW4gYWRqdXN0IHRoZSBhbW91bnQgb2YgZGF0YSBsZWZ0IGluIHRoZSBidWZmZXIuCi0JCSAqIE90aGV3aXNlIGlmIHdlIGFyZSBkb25lIHdpdGggdGhpcyBSWCByZXF1ZXN0IGJ1ZmZlciB0aGVuCi0JCSAqIHJlcXVldWUgaXQgdG8gZ2V0IGFueSBpbmNvbWluZyBkYXRhIGZyb20gdGhlIFVTQiBob3N0LgotCQkgKi8KLQkJaWYgKHNpemUgPCBjdXJyZW50X3J4X2J5dGVzKSB7Ci0JCQljdXJyZW50X3J4X2J5dGVzIC09IHNpemU7Ci0JCQljdXJyZW50X3J4X2J1ZiArPSBzaXplOwotCQl9IGVsc2UgewotCQkJbGlzdF9hZGQoJmN1cnJlbnRfcnhfcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKLQkJCWN1cnJlbnRfcnhfYnl0ZXMgPSAwOwotCQkJY3VycmVudF9yeF9idWYgPSBOVUxMOwotCQkJY3VycmVudF9yeF9yZXEgPSBOVUxMOwotCQl9Ci0JfQotCi0JZGV2LT5jdXJyZW50X3J4X3JlcSA9IGN1cnJlbnRfcnhfcmVxOwotCWRldi0+Y3VycmVudF9yeF9ieXRlcyA9IGN1cnJlbnRfcnhfYnl0ZXM7Ci0JZGV2LT5jdXJyZW50X3J4X2J1ZiA9IGN1cnJlbnRfcnhfYnVmOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7Ci0KLQlEQkcoZGV2LCAicHJpbnRlcl9yZWFkIHJldHVybmVkICVkIGJ5dGVzXG4iLCAoaW50KWJ5dGVzX2NvcGllZCk7Ci0KLQlpZiAoYnl0ZXNfY29waWVkKQotCQlyZXR1cm4gYnl0ZXNfY29waWVkOwotCWVsc2UKLQkJcmV0dXJuIC1FQUdBSU47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90Ci1wcmludGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmZCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwdHIpCi17Ci0Jc3RydWN0IHByaW50ZXJfZGV2CSpkZXYgPSBmZC0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCXNpemVfdAkJCXNpemU7CS8qIEFtb3VudCBvZiBkYXRhIGluIGEgVFggcmVxdWVzdC4gKi8KLQlzaXplX3QJCQlieXRlc19jb3BpZWQgPSAwOwotCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOwotCi0JREJHKGRldiwgInByaW50ZXJfd3JpdGUgdHJ5aW5nIHRvIHNlbmQgJWQgYnl0ZXNcbiIsIChpbnQpbGVuKTsKLQotCWlmIChsZW4gPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQ2hlY2sgaWYgYSBwcmludGVyIHJlc2V0IGhhcHBlbnMgd2hpbGUgd2UgaGF2ZSBpbnRlcnJ1cHRzIG9uICovCi0JZGV2LT5yZXNldF9wcmludGVyID0gMDsKLQotCS8qIENoZWNrIGlmIHRoZXJlIGlzIGFueSBhdmFpbGFibGUgd3JpdGUgYnVmZmVycyAqLwotCWlmIChsaWtlbHkobGlzdF9lbXB0eSgmZGV2LT50eF9yZXFzKSkpIHsKLQkJLyogVHVybiBpbnRlcnJ1cHRzIGJhY2sgb24gYmVmb3JlIHNsZWVwaW5nLiAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQotCQkvKgotCQkgKiBJZiB3cml0ZSBidWZmZXJzIGFyZSBhdmFpbGFibGUgY2hlY2sgaWYgdGhpcyBpcwotCQkgKiBhIE5PTi1CbG9ja2luZyBjYWxsIG9yIG5vdC4KLQkJICovCi0JCWlmIChmZC0+Zl9mbGFncyAmIChPX05PTkJMT0NLfE9fTkRFTEFZKSkgewotCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCi0JCS8qIFNsZWVwIHVudGlsIGEgd3JpdGUgYnVmZmVyIGlzIGF2YWlsYWJsZSAqLwotCQl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoZGV2LT50eF93YWl0LAotCQkJCShsaWtlbHkoIWxpc3RfZW1wdHkoJmRldi0+dHhfcmVxcykpKSk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQl3aGlsZSAobGlrZWx5KCFsaXN0X2VtcHR5KCZkZXYtPnR4X3JlcXMpKSAmJiBsZW4pIHsKLQotCQlpZiAobGVuID4gVVNCX0JVRlNJWkUpCi0JCQlzaXplID0gVVNCX0JVRlNJWkU7Ci0JCWVsc2UKLQkJCXNpemUgPSBsZW47Ci0KLQkJcmVxID0gY29udGFpbmVyX29mKGRldi0+dHhfcmVxcy5uZXh0LCBzdHJ1Y3QgdXNiX3JlcXVlc3QsCi0JCQkJbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnJlcS0+bGlzdCk7Ci0KLQkJcmVxLT5jb21wbGV0ZSA9IHR4X2NvbXBsZXRlOwotCQlyZXEtPmxlbmd0aCA9IHNpemU7Ci0KLQkJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBzZW5kIGEgemVybyBsZW5ndGggcGFja2V0LiAqLwotCQlpZiAobGVuID4gc2l6ZSkKLQkJCS8qIFRoZXkgd2lsbCBiZSBtb3JlIFRYIHJlcXVlc3RzIHNvIG5vIHlldC4gKi8KLQkJCXJlcS0+emVybyA9IDA7Ci0JCWVsc2UKLQkJCS8qIElmIHRoZSBkYXRhIGFtb3VudCBpcyBub3QgYSBtdWx0cGxlIG9mIHRoZQotCQkJICogbWF4cGFja2V0IHNpemUgdGhlbiBzZW5kIGEgemVybyBsZW5ndGggcGFja2V0LgotCQkJICovCi0JCQlyZXEtPnplcm8gPSAoKGxlbiAlIGRldi0+aW5fZXAtPm1heHBhY2tldCkgPT0gMCk7Ci0KLQkJLyogRG9uJ3QgbGVhdmUgaXJxcyBvZmYgd2hpbGUgZG9pbmcgbWVtb3J5IGNvcGllcyAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAoY29weV9mcm9tX3VzZXIocmVxLT5idWYsIGJ1Ziwgc2l6ZSkpIHsKLQkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnR4X3JlcXMpOwotCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7Ci0JCQlyZXR1cm4gYnl0ZXNfY29waWVkOwotCQl9Ci0KLQkJYnl0ZXNfY29waWVkICs9IHNpemU7Ci0JCWxlbiAtPSBzaXplOwotCQlidWYgKz0gc2l6ZTsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0KLQkJLyogV2UndmUgZGlzY29ubmVjdGVkIG9yIHJlc2V0IHNvIGZyZWUgdGhlIHJlcSBhbmQgYnVmZmVyICovCi0JCWlmIChkZXYtPnJlc2V0X3ByaW50ZXIpIHsKLQkJCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnR4X3JlcXMpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0JCQltdXRleF91bmxvY2soJmRldi0+bG9ja19wcmludGVyX2lvKTsKLQkJCXJldHVybiAtRUFHQUlOOwotCQl9Ci0KLQkJaWYgKHVzYl9lcF9xdWV1ZShkZXYtPmluX2VwLCByZXEsIEdGUF9BVE9NSUMpKSB7Ci0JCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT50eF9yZXFzKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7Ci0JCQlyZXR1cm4gLUVBR0FJTjsKLQkJfQotCi0JCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnR4X3JlcXNfYWN0aXZlKTsKLQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrX3ByaW50ZXJfaW8pOwotCi0JREJHKGRldiwgInByaW50ZXJfd3JpdGUgc2VudCAlZCBieXRlc1xuIiwgKGludClieXRlc19jb3BpZWQpOwotCi0JaWYgKGJ5dGVzX2NvcGllZCkgewotCQlyZXR1cm4gYnl0ZXNfY29waWVkOwotCX0gZWxzZSB7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLX0KLQotc3RhdGljIGludAotcHJpbnRlcl9mc3luYyhzdHJ1Y3QgZmlsZSAqZmQsIGxvZmZfdCBzdGFydCwgbG9mZl90IGVuZCwgaW50IGRhdGFzeW5jKQotewotCXN0cnVjdCBwcmludGVyX2RldgkqZGV2ID0gZmQtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmZCk7Ci0JdW5zaWduZWQgbG9uZwkJZmxhZ3M7Ci0JaW50CQkJdHhfbGlzdF9lbXB0eTsKLQotCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0JdHhfbGlzdF9lbXB0eSA9IChsaWtlbHkobGlzdF9lbXB0eSgmZGV2LT50eF9yZXFzKSkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCF0eF9saXN0X2VtcHR5KSB7Ci0JCS8qIFNsZWVwIHVudGlsIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQgKi8KLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGRldi0+dHhfZmx1c2hfd2FpdCwKLQkJCQkobGlrZWx5KGxpc3RfZW1wdHkoJmRldi0+dHhfcmVxc19hY3RpdmUpKSkpOwotCX0KLQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1wcmludGVyX3BvbGwoc3RydWN0IGZpbGUgKmZkLCBwb2xsX3RhYmxlICp3YWl0KQotewotCXN0cnVjdCBwcmludGVyX2RldgkqZGV2ID0gZmQtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQlpbnQJCQlzdGF0dXMgPSAwOwotCi0JbXV0ZXhfbG9jaygmZGV2LT5sb2NrX3ByaW50ZXJfaW8pOwotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQlzZXR1cF9yeF9yZXFzKGRldik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2tfcHJpbnRlcl9pbyk7Ci0KLQlwb2xsX3dhaXQoZmQsICZkZXYtPnJ4X3dhaXQsIHdhaXQpOwotCXBvbGxfd2FpdChmZCwgJmRldi0+dHhfd2FpdCwgd2FpdCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0JaWYgKGxpa2VseSghbGlzdF9lbXB0eSgmZGV2LT50eF9yZXFzKSkpCi0JCXN0YXR1cyB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKLQotCWlmIChsaWtlbHkoZGV2LT5jdXJyZW50X3J4X2J5dGVzKSB8fAotCQkJbGlrZWx5KCFsaXN0X2VtcHR5KCZkZXYtPnJ4X2J1ZmZlcnMpKSkKLQkJc3RhdHVzIHw9IFBPTExJTiB8IFBPTExSRE5PUk07Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXRpYyBsb25nCi1wcmludGVyX2lvY3RsKHN0cnVjdCBmaWxlICpmZCwgdW5zaWduZWQgaW50IGNvZGUsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBwcmludGVyX2RldgkqZGV2ID0gZmQtPnByaXZhdGVfZGF0YTsKLQl1bnNpZ25lZCBsb25nCQlmbGFnczsKLQlpbnQJCQlzdGF0dXMgPSAwOwotCi0JREJHKGRldiwgInByaW50ZXJfaW9jdGw6IGNtZD0weCU0LjR4LCBhcmc9JWx1XG4iLCBjb2RlLCBhcmcpOwotCi0JLyogaGFuZGxlIGlvY3RscyAqLwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCi0Jc3dpdGNoIChjb2RlKSB7Ci0JY2FzZSBHQURHRVRfR0VUX1BSSU5URVJfU1RBVFVTOgotCQlzdGF0dXMgPSAoaW50KWRldi0+cHJpbnRlcl9zdGF0dXM7Ci0JCWJyZWFrOwotCWNhc2UgR0FER0VUX1NFVF9QUklOVEVSX1NUQVRVUzoKLQkJZGV2LT5wcmludGVyX3N0YXR1cyA9ICh1OClhcmc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGNvdWxkIG5vdCBoYW5kbGUgaW9jdGwgKi8KLQkJREJHKGRldiwgInByaW50ZXJfaW9jdGw6IEVSUk9SIGNtZD0weCU0LjR4aXMgbm90IHN1cHBvcnRlZFxuIiwKLQkJCQljb2RlKTsKLQkJc3RhdHVzID0gLUVOT1RUWTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiBzdGF0dXM7Ci19Ci0KLS8qIHVzZWQgYWZ0ZXIgZW5kcG9pbnQgY29uZmlndXJhdGlvbiAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcHJpbnRlcl9pb19vcGVyYXRpb25zID0gewotCS5vd25lciA9CVRISVNfTU9EVUxFLAotCS5vcGVuID0JCXByaW50ZXJfb3BlbiwKLQkucmVhZCA9CQlwcmludGVyX3JlYWQsCi0JLndyaXRlID0JcHJpbnRlcl93cml0ZSwKLQkuZnN5bmMgPQlwcmludGVyX2ZzeW5jLAotCS5wb2xsID0JCXByaW50ZXJfcG9sbCwKLQkudW5sb2NrZWRfaW9jdGwgPSBwcmludGVyX2lvY3RsLAotCS5yZWxlYXNlID0JcHJpbnRlcl9jbG9zZSwKLQkubGxzZWVrID0Jbm9vcF9sbHNlZWssCi19OwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgaW50Ci1zZXRfcHJpbnRlcl9pbnRlcmZhY2Uoc3RydWN0IHByaW50ZXJfZGV2ICpkZXYpCi17Ci0JaW50CQkJcmVzdWx0ID0gMDsKLQotCWRldi0+aW5fZXAtPmRlc2MgPSBlcF9kZXNjKGRldi0+Z2FkZ2V0LCAmZnNfZXBfaW5fZGVzYywgJmhzX2VwX2luX2Rlc2MsCi0JCQkJJnNzX2VwX2luX2Rlc2MpOwotCWRldi0+aW5fZXAtPmRyaXZlcl9kYXRhID0gZGV2OwotCi0JZGV2LT5vdXRfZXAtPmRlc2MgPSBlcF9kZXNjKGRldi0+Z2FkZ2V0LCAmZnNfZXBfb3V0X2Rlc2MsCi0JCQkJICAgICZoc19lcF9vdXRfZGVzYywgJnNzX2VwX291dF9kZXNjKTsKLQlkZXYtPm91dF9lcC0+ZHJpdmVyX2RhdGEgPSBkZXY7Ci0KLQlyZXN1bHQgPSB1c2JfZXBfZW5hYmxlKGRldi0+aW5fZXApOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQlEQkcoZGV2LCAiZW5hYmxlICVzIC0tPiAlZFxuIiwgZGV2LT5pbl9lcC0+bmFtZSwgcmVzdWx0KTsKLQkJZ290byBkb25lOwotCX0KLQotCXJlc3VsdCA9IHVzYl9lcF9lbmFibGUoZGV2LT5vdXRfZXApOwotCWlmIChyZXN1bHQgIT0gMCkgewotCQlEQkcoZGV2LCAiZW5hYmxlICVzIC0tPiAlZFxuIiwgZGV2LT5pbl9lcC0+bmFtZSwgcmVzdWx0KTsKLQkJZ290byBkb25lOwotCX0KLQotZG9uZToKLQkvKiBvbiBlcnJvciwgZGlzYWJsZSBhbnkgZW5kcG9pbnRzICAqLwotCWlmIChyZXN1bHQgIT0gMCkgewotCQkodm9pZCkgdXNiX2VwX2Rpc2FibGUoZGV2LT5pbl9lcCk7Ci0JCSh2b2lkKSB1c2JfZXBfZGlzYWJsZShkZXYtPm91dF9lcCk7Ci0JCWRldi0+aW5fZXAtPmRlc2MgPSBOVUxMOwotCQlkZXYtPm91dF9lcC0+ZGVzYyA9IE5VTEw7Ci0JfQotCi0JLyogY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbGVhbnVwIG9uIGVycm9yICovCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRlcl9yZXNldF9pbnRlcmZhY2Uoc3RydWN0IHByaW50ZXJfZGV2ICpkZXYpCi17Ci0JaWYgKGRldi0+aW50ZXJmYWNlIDwgMCkKLQkJcmV0dXJuOwotCi0JREJHKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlpZiAoZGV2LT5pbl9lcC0+ZGVzYykKLQkJdXNiX2VwX2Rpc2FibGUoZGV2LT5pbl9lcCk7Ci0KLQlpZiAoZGV2LT5vdXRfZXAtPmRlc2MpCi0JCXVzYl9lcF9kaXNhYmxlKGRldi0+b3V0X2VwKTsKLQotCWRldi0+aW5fZXAtPmRlc2MgPSBOVUxMOwotCWRldi0+b3V0X2VwLT5kZXNjID0gTlVMTDsKLQlkZXYtPmludGVyZmFjZSA9IC0xOwotfQotCi0vKiBDaGFuZ2Ugb3VyIG9wZXJhdGlvbmFsIEludGVyZmFjZS4gKi8KLXN0YXRpYyBpbnQgc2V0X2ludGVyZmFjZShzdHJ1Y3QgcHJpbnRlcl9kZXYgKmRldiwgdW5zaWduZWQgbnVtYmVyKQotewotCWludAkJCXJlc3VsdCA9IDA7Ci0KLQkvKiBGcmVlIHRoZSBjdXJyZW50IGludGVyZmFjZSAqLwotCXByaW50ZXJfcmVzZXRfaW50ZXJmYWNlKGRldik7Ci0KLQlyZXN1bHQgPSBzZXRfcHJpbnRlcl9pbnRlcmZhY2UoZGV2KTsKLQlpZiAocmVzdWx0KQotCQlwcmludGVyX3Jlc2V0X2ludGVyZmFjZShkZXYpOwotCWVsc2UKLQkJZGV2LT5pbnRlcmZhY2UgPSBudW1iZXI7Ci0KLQlpZiAoIXJlc3VsdCkKLQkJSU5GTyhkZXYsICJVc2luZyBpbnRlcmZhY2UgJXhcbiIsIG51bWJlcik7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBwcmludGVyX3NvZnRfcmVzZXQoc3RydWN0IHByaW50ZXJfZGV2ICpkZXYpCi17Ci0Jc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXE7Ci0KLQlJTkZPKGRldiwgIlJlY2VpdmVkIFByaW50ZXIgUmVzZXQgUmVxdWVzdFxuIik7Ci0KLQlpZiAodXNiX2VwX2Rpc2FibGUoZGV2LT5pbl9lcCkpCi0JCURCRyhkZXYsICJGYWlsZWQgdG8gZGlzYWJsZSBVU0IgaW5fZXBcbiIpOwotCWlmICh1c2JfZXBfZGlzYWJsZShkZXYtPm91dF9lcCkpCi0JCURCRyhkZXYsICJGYWlsZWQgdG8gZGlzYWJsZSBVU0Igb3V0X2VwXG4iKTsKLQotCWlmIChkZXYtPmN1cnJlbnRfcnhfcmVxICE9IE5VTEwpIHsKLQkJbGlzdF9hZGQoJmRldi0+Y3VycmVudF9yeF9yZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwotCQlkZXYtPmN1cnJlbnRfcnhfcmVxID0gTlVMTDsKLQl9Ci0JZGV2LT5jdXJyZW50X3J4X2J5dGVzID0gMDsKLQlkZXYtPmN1cnJlbnRfcnhfYnVmID0gTlVMTDsKLQlkZXYtPnJlc2V0X3ByaW50ZXIgPSAxOwotCi0Jd2hpbGUgKGxpa2VseSghKGxpc3RfZW1wdHkoJmRldi0+cnhfYnVmZmVycykpKSkgewotCQlyZXEgPSBjb250YWluZXJfb2YoZGV2LT5yeF9idWZmZXJzLm5leHQsIHN0cnVjdCB1c2JfcmVxdWVzdCwKLQkJCQlsaXN0KTsKLQkJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKLQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+cnhfcmVxcyk7Ci0JfQotCi0Jd2hpbGUgKGxpa2VseSghKGxpc3RfZW1wdHkoJmRldi0+cnhfcmVxc19hY3RpdmUpKSkpIHsKLQkJcmVxID0gY29udGFpbmVyX29mKGRldi0+cnhfYnVmZmVycy5uZXh0LCBzdHJ1Y3QgdXNiX3JlcXVlc3QsCi0JCQkJbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnJlcS0+bGlzdCk7Ci0JCWxpc3RfYWRkKCZyZXEtPmxpc3QsICZkZXYtPnJ4X3JlcXMpOwotCX0KLQotCXdoaWxlIChsaWtlbHkoIShsaXN0X2VtcHR5KCZkZXYtPnR4X3JlcXNfYWN0aXZlKSkpKSB7Ci0JCXJlcSA9IGNvbnRhaW5lcl9vZihkZXYtPnR4X3JlcXNfYWN0aXZlLm5leHQsCi0JCQkJc3RydWN0IHVzYl9yZXF1ZXN0LCBsaXN0KTsKLQkJbGlzdF9kZWxfaW5pdCgmcmVxLT5saXN0KTsKLQkJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJmRldi0+dHhfcmVxcyk7Ci0JfQotCi0JaWYgKHVzYl9lcF9lbmFibGUoZGV2LT5pbl9lcCkpCi0JCURCRyhkZXYsICJGYWlsZWQgdG8gZW5hYmxlIFVTQiBpbl9lcFxuIik7Ci0JaWYgKHVzYl9lcF9lbmFibGUoZGV2LT5vdXRfZXApKQotCQlEQkcoZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBVU0Igb3V0X2VwXG4iKTsKLQotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGV2LT5yeF93YWl0KTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+dHhfd2FpdCk7Ci0Jd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYtPnR4X2ZsdXNoX3dhaXQpOwotfQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKgotICogVGhlIHNldHVwKCkgY2FsbGJhY2sgaW1wbGVtZW50cyBhbGwgdGhlIGVwMCBmdW5jdGlvbmFsaXR5IHRoYXQncyBub3QKLSAqIGhhbmRsZWQgbG93ZXIgZG93bi4KLSAqLwotc3RhdGljIGludCBwcmludGVyX2Z1bmNfc2V0dXAoc3RydWN0IHVzYl9mdW5jdGlvbiAqZiwKLQkJY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKLXsKLQlzdHJ1Y3QgcHJpbnRlcl9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihmLCBzdHJ1Y3QgcHJpbnRlcl9kZXYsIGZ1bmN0aW9uKTsKLQlzdHJ1Y3QgdXNiX2NvbXBvc2l0ZV9kZXYgKmNkZXYgPSBmLT5jb25maWctPmNkZXY7Ci0Jc3RydWN0IHVzYl9yZXF1ZXN0CSpyZXEgPSBjZGV2LT5yZXE7Ci0JaW50CQkJdmFsdWUgPSAtRU9QTk9UU1VQUDsKLQl1MTYJCQl3SW5kZXggPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOwotCXUxNgkJCXdWYWx1ZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7Ci0JdTE2CQkJd0xlbmd0aCA9IGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpOwotCi0JREJHKGRldiwgImN0cmwgcmVxJTAyeC4lMDJ4IHYlMDR4IGklMDR4IGwlZFxuIiwKLQkJY3RybC0+YlJlcXVlc3RUeXBlLCBjdHJsLT5iUmVxdWVzdCwgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGgpOwotCi0Jc3dpdGNoIChjdHJsLT5iUmVxdWVzdFR5cGUmVVNCX1RZUEVfTUFTSykgewotCWNhc2UgVVNCX1RZUEVfQ0xBU1M6Ci0JCXN3aXRjaCAoY3RybC0+YlJlcXVlc3QpIHsKLQkJY2FzZSAwOiAvKiBHZXQgdGhlIElFRUUtMTI4NCBQTlAgU3RyaW5nICovCi0JCQkvKiBPbmx5IG9uZSBwcmludGVyIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQuICovCi0JCQlpZiAoKHdJbmRleD4+OCkgIT0gZGV2LT5pbnRlcmZhY2UpCi0JCQkJYnJlYWs7Ci0KLQkJCXZhbHVlID0gKHBucF9zdHJpbmdbMF08PDgpfHBucF9zdHJpbmdbMV07Ci0JCQltZW1jcHkocmVxLT5idWYsIHBucF9zdHJpbmcsIHZhbHVlKTsKLQkJCURCRyhkZXYsICIxMjg0IFBOUCBTdHJpbmc6ICV4ICVzXG4iLCB2YWx1ZSwKLQkJCQkJJnBucF9zdHJpbmdbMl0pOwotCQkJYnJlYWs7Ci0KLQkJY2FzZSAxOiAvKiBHZXQgUG9ydCBTdGF0dXMgKi8KLQkJCS8qIE9ubHkgb25lIHByaW50ZXIgaW50ZXJmYWNlIGlzIHN1cHBvcnRlZC4gKi8KLQkJCWlmICh3SW5kZXggIT0gZGV2LT5pbnRlcmZhY2UpCi0JCQkJYnJlYWs7Ci0KLQkJCSoodTggKilyZXEtPmJ1ZiA9IGRldi0+cHJpbnRlcl9zdGF0dXM7Ci0JCQl2YWx1ZSA9IG1pbih3TGVuZ3RoLCAodTE2KSAxKTsKLQkJCWJyZWFrOwotCi0JCWNhc2UgMjogLyogU29mdCBSZXNldCAqLwotCQkJLyogT25seSBvbmUgcHJpbnRlciBpbnRlcmZhY2UgaXMgc3VwcG9ydGVkLiAqLwotCQkJaWYgKHdJbmRleCAhPSBkZXYtPmludGVyZmFjZSkKLQkJCQlicmVhazsKLQotCQkJcHJpbnRlcl9zb2Z0X3Jlc2V0KGRldik7Ci0KLQkJCXZhbHVlID0gMDsKLQkJCWJyZWFrOwotCi0JCWRlZmF1bHQ6Ci0JCQlnb3RvIHVua25vd247Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotdW5rbm93bjoKLQkJVkRCRyhkZXYsCi0JCQkidW5rbm93biBjdHJsIHJlcSUwMnguJTAyeCB2JTA0eCBpJTA0eCBsJWRcbiIsCi0JCQljdHJsLT5iUmVxdWVzdFR5cGUsIGN0cmwtPmJSZXF1ZXN0LAotCQkJd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGgpOwotCQlicmVhazsKLQl9Ci0JLyogaG9zdCBlaXRoZXIgc3RhbGxzICh2YWx1ZSA8IDApIG9yIHJlcG9ydHMgc3VjY2VzcyAqLwotCXJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgcHJpbnRlcl9mdW5jX2JpbmQoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjLAotCQlzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQotewotCXN0cnVjdCBwcmludGVyX2RldiAqZGV2ID0gY29udGFpbmVyX29mKGYsIHN0cnVjdCBwcmludGVyX2RldiwgZnVuY3Rpb24pOwotCXN0cnVjdCB1c2JfY29tcG9zaXRlX2RldiAqY2RldiA9IGMtPmNkZXY7Ci0Jc3RydWN0IHVzYl9lcCAqaW5fZXA7Ci0Jc3RydWN0IHVzYl9lcCAqb3V0X2VwID0gTlVMTDsKLQlpbnQgaWQ7Ci0JaW50IHJldDsKLQotCWlkID0gdXNiX2ludGVyZmFjZV9pZChjLCBmKTsKLQlpZiAoaWQgPCAwKQotCQlyZXR1cm4gaWQ7Ci0JaW50Zl9kZXNjLmJJbnRlcmZhY2VOdW1iZXIgPSBpZDsKLQotCS8qIGFsbCB3ZSByZWFsbHkgbmVlZCBpcyBidWxrIElOL09VVCAqLwotCWluX2VwID0gdXNiX2VwX2F1dG9jb25maWcoY2Rldi0+Z2FkZ2V0LCAmZnNfZXBfaW5fZGVzYyk7Ci0JaWYgKCFpbl9lcCkgewotYXV0b2NvbmZfZmFpbDoKLQkJZGV2X2VycigmY2Rldi0+Z2FkZ2V0LT5kZXYsICJjYW4ndCBhdXRvY29uZmlndXJlIG9uICVzXG4iLAotCQkJY2Rldi0+Z2FkZ2V0LT5uYW1lKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCWluX2VwLT5kcml2ZXJfZGF0YSA9IGluX2VwOwkvKiBjbGFpbSAqLwotCi0Jb3V0X2VwID0gdXNiX2VwX2F1dG9jb25maWcoY2Rldi0+Z2FkZ2V0LCAmZnNfZXBfb3V0X2Rlc2MpOwotCWlmICghb3V0X2VwKQotCQlnb3RvIGF1dG9jb25mX2ZhaWw7Ci0Jb3V0X2VwLT5kcml2ZXJfZGF0YSA9IG91dF9lcDsJLyogY2xhaW0gKi8KLQotCS8qIGFzc3VtZXMgdGhhdCBhbGwgZW5kcG9pbnRzIGFyZSBkdWFsLXNwZWVkICovCi0JaHNfZXBfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0gZnNfZXBfaW5fZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwotCWhzX2VwX291dF9kZXNjLmJFbmRwb2ludEFkZHJlc3MgPSBmc19lcF9vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzOwotCXNzX2VwX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzcyA9IGZzX2VwX2luX2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKLQlzc19lcF9vdXRfZGVzYy5iRW5kcG9pbnRBZGRyZXNzID0gZnNfZXBfb3V0X2Rlc2MuYkVuZHBvaW50QWRkcmVzczsKLQotCXJldCA9IHVzYl9hc3NpZ25fZGVzY3JpcHRvcnMoZiwgZnNfcHJpbnRlcl9mdW5jdGlvbiwKLQkJCWhzX3ByaW50ZXJfZnVuY3Rpb24sIHNzX3ByaW50ZXJfZnVuY3Rpb24pOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlkZXYtPmluX2VwID0gaW5fZXA7Ci0JZGV2LT5vdXRfZXAgPSBvdXRfZXA7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50ZXJfZnVuY191bmJpbmQoc3RydWN0IHVzYl9jb25maWd1cmF0aW9uICpjLAotCQlzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQotewotCXVzYl9mcmVlX2FsbF9kZXNjcmlwdG9ycyhmKTsKLX0KLQotc3RhdGljIGludCBwcmludGVyX2Z1bmNfc2V0X2FsdChzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmLAotCQl1bnNpZ25lZCBpbnRmLCB1bnNpZ25lZCBhbHQpCi17Ci0Jc3RydWN0IHByaW50ZXJfZGV2ICpkZXYgPSBjb250YWluZXJfb2YoZiwgc3RydWN0IHByaW50ZXJfZGV2LCBmdW5jdGlvbik7Ci0JaW50IHJldCA9IC1FTk9UU1VQUDsKLQotCWlmICghYWx0KQotCQlyZXQgPSBzZXRfaW50ZXJmYWNlKGRldiwgaW50Zik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBwcmludGVyX2Z1bmNfZGlzYWJsZShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICpmKQotewotCXN0cnVjdCBwcmludGVyX2RldiAqZGV2ID0gY29udGFpbmVyX29mKGYsIHN0cnVjdCBwcmludGVyX2RldiwgZnVuY3Rpb24pOwotCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwotCi0JREJHKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7Ci0JcHJpbnRlcl9yZXNldF9pbnRlcmZhY2UoZGV2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRlcl9jZmdfdW5iaW5kKHN0cnVjdCB1c2JfY29uZmlndXJhdGlvbiAqYykKLXsKLQlzdHJ1Y3QgcHJpbnRlcl9kZXYJKmRldjsKLQlzdHJ1Y3QgdXNiX3JlcXVlc3QJKnJlcTsKLQotCWRldiA9ICZ1c2JfcHJpbnRlcl9nYWRnZXQ7Ci0KLQlEQkcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKLQotCS8qIFJlbW92ZSBzeXNmcyBmaWxlcyAqLwotCWRldmljZV9kZXN0cm95KHVzYl9nYWRnZXRfY2xhc3MsIGdfcHJpbnRlcl9kZXZubyk7Ci0KLQkvKiBSZW1vdmUgQ2hhcmFjdGVyIERldmljZSAqLwotCWNkZXZfZGVsKCZkZXYtPnByaW50ZXJfY2Rldik7Ci0KLQkvKiB3ZSBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIGRpc2Nvbm5lY3RlZCAuLi4gbm8gaS9vIG1heSBiZSBhY3RpdmUgKi8KLQlXQVJOX09OKCFsaXN0X2VtcHR5KCZkZXYtPnR4X3JlcXNfYWN0aXZlKSk7Ci0JV0FSTl9PTighbGlzdF9lbXB0eSgmZGV2LT5yeF9yZXFzX2FjdGl2ZSkpOwotCi0JLyogRnJlZSBhbGwgbWVtb3J5IGZvciB0aGlzIGRyaXZlci4gKi8KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+dHhfcmVxcykpIHsKLQkJcmVxID0gY29udGFpbmVyX29mKGRldi0+dHhfcmVxcy5uZXh0LCBzdHJ1Y3QgdXNiX3JlcXVlc3QsCi0JCQkJbGlzdCk7Ci0JCWxpc3RfZGVsKCZyZXEtPmxpc3QpOwotCQlwcmludGVyX3JlcV9mcmVlKGRldi0+aW5fZXAsIHJlcSk7Ci0JfQotCi0JaWYgKGRldi0+Y3VycmVudF9yeF9yZXEgIT0gTlVMTCkKLQkJcHJpbnRlcl9yZXFfZnJlZShkZXYtPm91dF9lcCwgZGV2LT5jdXJyZW50X3J4X3JlcSk7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+cnhfcmVxcykpIHsKLQkJcmVxID0gY29udGFpbmVyX29mKGRldi0+cnhfcmVxcy5uZXh0LAotCQkJCXN0cnVjdCB1c2JfcmVxdWVzdCwgbGlzdCk7Ci0JCWxpc3RfZGVsKCZyZXEtPmxpc3QpOwotCQlwcmludGVyX3JlcV9mcmVlKGRldi0+b3V0X2VwLCByZXEpOwotCX0KLQotCXdoaWxlICghbGlzdF9lbXB0eSgmZGV2LT5yeF9idWZmZXJzKSkgewotCQlyZXEgPSBjb250YWluZXJfb2YoZGV2LT5yeF9idWZmZXJzLm5leHQsCi0JCQkJc3RydWN0IHVzYl9yZXF1ZXN0LCBsaXN0KTsKLQkJbGlzdF9kZWwoJnJlcS0+bGlzdCk7Ci0JCXByaW50ZXJfcmVxX2ZyZWUoZGV2LT5vdXRfZXAsIHJlcSk7Ci0JfQotfQotCiBzdGF0aWMgc3RydWN0IHVzYl9jb25maWd1cmF0aW9uIHByaW50ZXJfY2ZnX2RyaXZlciA9IHsKIAkubGFiZWwJCQk9ICJwcmludGVyIiwKLQkudW5iaW5kCQkJPSBwcmludGVyX2NmZ191bmJpbmQsCiAJLmJDb25maWd1cmF0aW9uVmFsdWUJPSAxLAogCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0NPTkZJR19BVFRfT05FIHwgVVNCX0NPTkZJR19BVFRfU0VMRlBPV0VSLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcHJpbnRlcl9iaW5kX2NvbmZpZyhzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gKmMpCitzdGF0aWMgaW50IF9faW5pdCBwcmludGVyX2RvX2NvbmZpZyhzdHJ1Y3QgdXNiX2NvbmZpZ3VyYXRpb24gKmMpCiB7CiAJc3RydWN0IHVzYl9nYWRnZXQJKmdhZGdldCA9IGMtPmNkZXYtPmdhZGdldDsKLQlzdHJ1Y3QgcHJpbnRlcl9kZXYJKmRldjsKLQlpbnQJCQlzdGF0dXMgPSAtRU5PTUVNOwotCXNpemVfdAkJCWxlbjsKLQl1MzIJCQlpOwotCXN0cnVjdCB1c2JfcmVxdWVzdAkqcmVxOworCWludAkJCXN0YXR1cyA9IDA7CiAKIAl1c2JfZXBfYXV0b2NvbmZpZ19yZXNldChnYWRnZXQpOwogCi0JZGV2ID0gJnVzYl9wcmludGVyX2dhZGdldDsKLQotCWRldi0+ZnVuY3Rpb24ubmFtZSA9IHNob3J0bmFtZTsKLQlkZXYtPmZ1bmN0aW9uLmJpbmQgPSBwcmludGVyX2Z1bmNfYmluZDsKLQlkZXYtPmZ1bmN0aW9uLnNldHVwID0gcHJpbnRlcl9mdW5jX3NldHVwOwotCWRldi0+ZnVuY3Rpb24udW5iaW5kID0gcHJpbnRlcl9mdW5jX3VuYmluZDsKLQlkZXYtPmZ1bmN0aW9uLnNldF9hbHQgPSBwcmludGVyX2Z1bmNfc2V0X2FsdDsKLQlkZXYtPmZ1bmN0aW9uLmRpc2FibGUgPSBwcmludGVyX2Z1bmNfZGlzYWJsZTsKLQotCXN0YXR1cyA9IHVzYl9hZGRfZnVuY3Rpb24oYywgJmRldi0+ZnVuY3Rpb24pOwotCWlmIChzdGF0dXMpCi0JCXJldHVybiBzdGF0dXM7Ci0KLQkvKiBTZXR1cCB0aGUgc3lzZnMgZmlsZXMgZm9yIHRoZSBwcmludGVyIGdhZGdldC4gKi8KLQlkZXYtPnBkZXYgPSBkZXZpY2VfY3JlYXRlKHVzYl9nYWRnZXRfY2xhc3MsIE5VTEwsIGdfcHJpbnRlcl9kZXZubywKLQkJCQkgIE5VTEwsICJnX3ByaW50ZXIiKTsKLQlpZiAoSVNfRVJSKGRldi0+cGRldikpIHsKLQkJRVJST1IoZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2U6IGdfcHJpbnRlclxuIik7Ci0JCXN0YXR1cyA9IFBUUl9FUlIoZGV2LT5wZGV2KTsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qCi0JICogUmVnaXN0ZXIgYSBjaGFyYWN0ZXIgZGV2aWNlIGFzIGFuIGludGVyZmFjZSB0byBhIHVzZXIgbW9kZQotCSAqIHByb2dyYW0gdGhhdCBoYW5kbGVzIHRoZSBwcmludGVyIHNwZWNpZmljIGZ1bmN0aW9uYWxpdHkuCi0JICovCi0JY2Rldl9pbml0KCZkZXYtPnByaW50ZXJfY2RldiwgJnByaW50ZXJfaW9fb3BlcmF0aW9ucyk7Ci0JZGV2LT5wcmludGVyX2NkZXYub3duZXIgPSBUSElTX01PRFVMRTsKLQlzdGF0dXMgPSBjZGV2X2FkZCgmZGV2LT5wcmludGVyX2NkZXYsIGdfcHJpbnRlcl9kZXZubywgMSk7Ci0JaWYgKHN0YXR1cykgewotCQlFUlJPUihkZXYsICJGYWlsZWQgdG8gb3BlbiBjaGFyIGRldmljZVxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQlpZiAoaVBOUHN0cmluZykKLQkJc3RybGNweSgmcG5wX3N0cmluZ1syXSwgaVBOUHN0cmluZywgKHNpemVvZiBwbnBfc3RyaW5nKS0yKTsKLQotCWxlbiA9IHN0cmxlbihwbnBfc3RyaW5nKTsKLQlwbnBfc3RyaW5nWzBdID0gKGxlbiA+PiA4KSAmIDB4RkY7Ci0JcG5wX3N0cmluZ1sxXSA9IGxlbiAmIDB4RkY7Ci0KIAl1c2JfZ2FkZ2V0X3NldF9zZWxmcG93ZXJlZChnYWRnZXQpOwogCiAJaWYgKGdhZGdldF9pc19vdGcoZ2FkZ2V0KSkgewpAQCAtMTIyMiw4NiArMTQxLDY0IEBACiAJCXByaW50ZXJfY2ZnX2RyaXZlci5ibUF0dHJpYnV0ZXMgfD0gVVNCX0NPTkZJR19BVFRfV0FLRVVQOwogCX0KIAotCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2spOwotCW11dGV4X2luaXQoJmRldi0+bG9ja19wcmludGVyX2lvKTsKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT50eF9yZXFzKTsKLQlJTklUX0xJU1RfSEVBRCgmZGV2LT50eF9yZXFzX2FjdGl2ZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+cnhfcmVxcyk7Ci0JSU5JVF9MSVNUX0hFQUQoJmRldi0+cnhfcmVxc19hY3RpdmUpOwotCUlOSVRfTElTVF9IRUFEKCZkZXYtPnJ4X2J1ZmZlcnMpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+cnhfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT50eF93YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPnR4X2ZsdXNoX3dhaXQpOworCWZfcHJpbnRlciA9IHVzYl9nZXRfZnVuY3Rpb24oZmlfcHJpbnRlcik7CisJaWYgKElTX0VSUihmX3ByaW50ZXIpKQorCQlyZXR1cm4gUFRSX0VSUihmX3ByaW50ZXIpOwogCi0JZGV2LT5pbnRlcmZhY2UgPSAtMTsKLQlkZXYtPnByaW50ZXJfY2Rldl9vcGVuID0gMDsKLQlkZXYtPnByaW50ZXJfc3RhdHVzID0gUFJJTlRFUl9OT1RfRVJST1I7Ci0JZGV2LT5jdXJyZW50X3J4X3JlcSA9IE5VTEw7Ci0JZGV2LT5jdXJyZW50X3J4X2J5dGVzID0gMDsKLQlkZXYtPmN1cnJlbnRfcnhfYnVmID0gTlVMTDsKKwlzdGF0dXMgPSB1c2JfYWRkX2Z1bmN0aW9uKGMsIGZfcHJpbnRlcik7CisJaWYgKHN0YXR1cyA8IDApCisJCXVzYl9wdXRfZnVuY3Rpb24oZl9wcmludGVyKTsKIAotCWZvciAoaSA9IDA7IGkgPCBRTEVOOyBpKyspIHsKLQkJcmVxID0gcHJpbnRlcl9yZXFfYWxsb2MoZGV2LT5pbl9lcCwgVVNCX0JVRlNJWkUsIEdGUF9LRVJORUwpOwotCQlpZiAoIXJlcSkgewotCQkJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZXYtPnR4X3JlcXMpKSB7Ci0JCQkJcmVxID0gY29udGFpbmVyX29mKGRldi0+dHhfcmVxcy5uZXh0LAotCQkJCQkJc3RydWN0IHVzYl9yZXF1ZXN0LCBsaXN0KTsKLQkJCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKLQkJCQlwcmludGVyX3JlcV9mcmVlKGRldi0+aW5fZXAsIHJlcSk7Ci0JCQl9Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT50eF9yZXFzKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUUxFTjsgaSsrKSB7Ci0JCXJlcSA9IHByaW50ZXJfcmVxX2FsbG9jKGRldi0+b3V0X2VwLCBVU0JfQlVGU0laRSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcmVxKSB7Ci0JCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmRldi0+cnhfcmVxcykpIHsKLQkJCQlyZXEgPSBjb250YWluZXJfb2YoZGV2LT5yeF9yZXFzLm5leHQsCi0JCQkJCQlzdHJ1Y3QgdXNiX3JlcXVlc3QsIGxpc3QpOwotCQkJCWxpc3RfZGVsKCZyZXEtPmxpc3QpOwotCQkJCXByaW50ZXJfcmVxX2ZyZWUoZGV2LT5vdXRfZXAsIHJlcSk7Ci0JCQl9Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlsaXN0X2FkZCgmcmVxLT5saXN0LCAmZGV2LT5yeF9yZXFzKTsKLQl9Ci0KLQkvKiBmaW5pc2ggaG9va3VwIHRvIGxvd2VyIGxheWVyIC4uLiAqLwotCWRldi0+Z2FkZ2V0ID0gZ2FkZ2V0OwotCi0JSU5GTyhkZXYsICIlcywgdmVyc2lvbjogIiBEUklWRVJfVkVSU0lPTiAiXG4iLCBkcml2ZXJfZGVzYyk7Ci0JcmV0dXJuIDA7Ci0KLWZhaWw6Ci0JcHJpbnRlcl9jZmdfdW5iaW5kKGMpOwogCXJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgcHJpbnRlcl91bmJpbmQoc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2KQotewotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCBwcmludGVyX2JpbmQoc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2KQogewotCWludCByZXQ7CisJc3RydWN0IGZfcHJpbnRlcl9vcHRzICpvcHRzOworCWludCByZXQsIGxlbjsKKworCWZpX3ByaW50ZXIgPSB1c2JfZ2V0X2Z1bmN0aW9uX2luc3RhbmNlKCJwcmludGVyIik7CisJaWYgKElTX0VSUihmaV9wcmludGVyKSkKKwkJcmV0dXJuIFBUUl9FUlIoZmlfcHJpbnRlcik7CisKKwlpZiAoaVBOUHN0cmluZykKKwkJc3RybGNweSgmcG5wX3N0cmluZ1syXSwgaVBOUHN0cmluZywgUE5QX1NUUklOR19MRU4gLSAyKTsKKworCWxlbiA9IHN0cmxlbihwbnBfc3RyaW5nKTsKKwlwbnBfc3RyaW5nWzBdID0gKGxlbiA+PiA4KSAmIDB4RkY7CisJcG5wX3N0cmluZ1sxXSA9IGxlbiAmIDB4RkY7CisKKwlvcHRzID0gY29udGFpbmVyX29mKGZpX3ByaW50ZXIsIHN0cnVjdCBmX3ByaW50ZXJfb3B0cywgZnVuY19pbnN0KTsKKwlvcHRzLT5taW5vciA9IDA7CisJbWVtY3B5KG9wdHMtPnBucF9zdHJpbmcsIHBucF9zdHJpbmcsIFBOUF9TVFJJTkdfTEVOKTsKKwlvcHRzLT5xX2xlbiA9IFFMRU47CiAKIAlyZXQgPSB1c2Jfc3RyaW5nX2lkc190YWIoY2Rldiwgc3RyaW5ncyk7Ci0JaWYgKHJldCA8IDApCisJaWYgKHJldCA8IDApIHsKKwkJdXNiX3B1dF9mdW5jdGlvbl9pbnN0YW5jZShmaV9wcmludGVyKTsKIAkJcmV0dXJuIHJldDsKKwl9CiAJZGV2aWNlX2Rlc2MuaU1hbnVmYWN0dXJlciA9IHN0cmluZ3NbVVNCX0dBREdFVF9NQU5VRkFDVFVSRVJfSURYXS5pZDsKIAlkZXZpY2VfZGVzYy5pUHJvZHVjdCA9IHN0cmluZ3NbVVNCX0dBREdFVF9QUk9EVUNUX0lEWF0uaWQ7CiAJZGV2aWNlX2Rlc2MuaVNlcmlhbE51bWJlciA9IHN0cmluZ3NbVVNCX0dBREdFVF9TRVJJQUxfSURYXS5pZDsKIAotCXJldCA9IHVzYl9hZGRfY29uZmlnKGNkZXYsICZwcmludGVyX2NmZ19kcml2ZXIsIHByaW50ZXJfYmluZF9jb25maWcpOwotCWlmIChyZXQpCisJcmV0ID0gdXNiX2FkZF9jb25maWcoY2RldiwgJnByaW50ZXJfY2ZnX2RyaXZlciwgcHJpbnRlcl9kb19jb25maWcpOworCWlmIChyZXQpIHsKKwkJdXNiX3B1dF9mdW5jdGlvbl9pbnN0YW5jZShmaV9wcmludGVyKTsKIAkJcmV0dXJuIHJldDsKKwl9CiAJdXNiX2NvbXBvc2l0ZV9vdmVyd3JpdGVfb3B0aW9ucyhjZGV2LCAmY292ZXJ3cml0ZSk7CiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBfX2V4aXQgcHJpbnRlcl91bmJpbmQoc3RydWN0IHVzYl9jb21wb3NpdGVfZGV2ICpjZGV2KQoreworCXVzYl9wdXRfZnVuY3Rpb24oZl9wcmludGVyKTsKKwl1c2JfcHV0X2Z1bmN0aW9uX2luc3RhbmNlKGZpX3ByaW50ZXIpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBfX3JlZmRhdGEgc3RydWN0IHVzYl9jb21wb3NpdGVfZHJpdmVyIHByaW50ZXJfZHJpdmVyID0gewogCS5uYW1lICAgICAgICAgICA9IHNob3J0bmFtZSwKIAkuZGV2ICAgICAgICAgICAgPSAmZGV2aWNlX2Rlc2MsCkBAIC0xMzExLDQ3ICsyMDgsNyBAQAogCS51bmJpbmQJCT0gcHJpbnRlcl91bmJpbmQsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdAotaW5pdCh2b2lkKQotewotCWludCBzdGF0dXM7Ci0KLQl1c2JfZ2FkZ2V0X2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCAidXNiX3ByaW50ZXJfZ2FkZ2V0Iik7Ci0JaWYgKElTX0VSUih1c2JfZ2FkZ2V0X2NsYXNzKSkgewotCQlzdGF0dXMgPSBQVFJfRVJSKHVzYl9nYWRnZXRfY2xhc3MpOwotCQlwcl9lcnIoInVuYWJsZSB0byBjcmVhdGUgdXNiX2dhZGdldCBjbGFzcyAlZFxuIiwgc3RhdHVzKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlzdGF0dXMgPSBhbGxvY19jaHJkZXZfcmVnaW9uKCZnX3ByaW50ZXJfZGV2bm8sIDAsIDEsCi0JCQkiVVNCIHByaW50ZXIgZ2FkZ2V0Iik7Ci0JaWYgKHN0YXR1cykgewotCQlwcl9lcnIoImFsbG9jX2NocmRldl9yZWdpb24gJWRcbiIsIHN0YXR1cyk7Ci0JCWNsYXNzX2Rlc3Ryb3kodXNiX2dhZGdldF9jbGFzcyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0Jc3RhdHVzID0gdXNiX2NvbXBvc2l0ZV9wcm9iZSgmcHJpbnRlcl9kcml2ZXIpOwotCWlmIChzdGF0dXMpIHsKLQkJY2xhc3NfZGVzdHJveSh1c2JfZ2FkZ2V0X2NsYXNzKTsKLQkJdW5yZWdpc3Rlcl9jaHJkZXZfcmVnaW9uKGdfcHJpbnRlcl9kZXZubywgMSk7Ci0JCXByX2VycigidXNiX2dhZGdldF9wcm9iZV9kcml2ZXIgJXhcbiIsIHN0YXR1cyk7Ci0JfQotCi0JcmV0dXJuIHN0YXR1czsKLX0KLW1vZHVsZV9pbml0KGluaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQKLWNsZWFudXAodm9pZCkKLXsKLQltdXRleF9sb2NrKCZ1c2JfcHJpbnRlcl9nYWRnZXQubG9ja19wcmludGVyX2lvKTsKLQl1c2JfY29tcG9zaXRlX3VucmVnaXN0ZXIoJnByaW50ZXJfZHJpdmVyKTsKLQl1bnJlZ2lzdGVyX2NocmRldl9yZWdpb24oZ19wcmludGVyX2Rldm5vLCAxKTsKLQljbGFzc19kZXN0cm95KHVzYl9nYWRnZXRfY2xhc3MpOwotCW11dGV4X3VubG9jaygmdXNiX3ByaW50ZXJfZ2FkZ2V0LmxvY2tfcHJpbnRlcl9pbyk7Ci19Ci1tb2R1bGVfZXhpdChjbGVhbnVwKTsKK21vZHVsZV91c2JfY29tcG9zaXRlX2RyaXZlcihwcmludGVyX2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfQVVUSE9SKCJDcmFpZyBOYWRsZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvdGNtX3VzYl9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9sZWdhY3kvdGNtX3VzYl9nYWRnZXQuYwppbmRleCAzYTQ5NDE2Li42ZTBhMDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L3RjbV91c2JfZ2FkZ2V0LmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS90Y21fdXNiX2dhZGdldC5jCkBAIC0xNzQwLDEwICsxNzQwLDkgQEAKIAkJZ290byBlcnJfc2Vzc2lvbjsKIAl9CiAJLyoKLQkgKiBOb3cgcmVnaXN0ZXIgdGhlIFRDTSB2SG9zdCB2aXJ0dWFsIElfVCBOZXh1cyBhcyBhY3RpdmUgd2l0aCB0aGUKLQkgKiBjYWxsIHRvIF9fdHJhbnNwb3J0X3JlZ2lzdGVyX3Nlc3Npb24oKQorCSAqIE5vdyByZWdpc3RlciB0aGUgVENNIHZIb3N0IHZpcnR1YWwgSV9UIE5leHVzIGFzIGFjdGl2ZS4KIAkgKi8KLQlfX3RyYW5zcG9ydF9yZWdpc3Rlcl9zZXNzaW9uKHNlX3RwZywgdHZfbmV4dXMtPnR2bl9zZV9zZXNzLT5zZV9ub2RlX2FjbCwKKwl0cmFuc3BvcnRfcmVnaXN0ZXJfc2Vzc2lvbihzZV90cGcsIHR2X25leHVzLT50dm5fc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wsCiAJCQl0dl9uZXh1cy0+dHZuX3NlX3Nlc3MsIHR2X25leHVzKTsKIAl0cGctPnRwZ19uZXh1cyA9IHR2X25leHVzOwogCW11dGV4X3VubG9jaygmdHBnLT50cGdfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2xlZ2FjeS96ZXJvLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L3plcm8uYwppbmRleCBmZjk3YWM5Li41ZWU5NTE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L3plcm8uYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbGVnYWN5L3plcm8uYwpAQCAtNjgsOCArNjgsNiBAQAogCS5pc29jX21heHBhY2tldCA9IEdaRVJPX0lTT0NfTUFYUEFDS0VULAogCS5idWxrX2J1ZmxlbiA9IEdaRVJPX0JVTEtfQlVGTEVOLAogCS5xbGVuID0gR1pFUk9fUUxFTiwKLQkuaW50X2ludGVydmFsID0gR1pFUk9fSU5UX0lOVEVSVkFMLAotCS5pbnRfbWF4cGFja2V0ID0gR1pFUk9fSU5UX01BWFBBQ0tFVCwKIH07CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yNjgsMjEgKzI2Niw2IEBACiAJCVNfSVJVR098U19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKGlzb2NfbWF4YnVyc3QsICIwIC0gMTUgKHNzIG9ubHkpIik7CiAKLW1vZHVsZV9wYXJhbV9uYW1lZChpbnRfaW50ZXJ2YWwsIGd6ZXJvX29wdGlvbnMuaW50X2ludGVydmFsLCB1aW50LAotCQlTX0lSVUdPfFNfSVdVU1IpOwotTU9EVUxFX1BBUk1fREVTQyhpbnRfaW50ZXJ2YWwsICIxIC0gMTYiKTsKLQotbW9kdWxlX3BhcmFtX25hbWVkKGludF9tYXhwYWNrZXQsIGd6ZXJvX29wdGlvbnMuaW50X21heHBhY2tldCwgdWludCwKLQkJU19JUlVHT3xTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0MoaW50X21heHBhY2tldCwgIjAgLSAxMDIzIChmcyksIDAgLSAxMDI0IChocy9zcykiKTsKLQotbW9kdWxlX3BhcmFtX25hbWVkKGludF9tdWx0LCBnemVyb19vcHRpb25zLmludF9tdWx0LCB1aW50LCBTX0lSVUdPfFNfSVdVU1IpOwotTU9EVUxFX1BBUk1fREVTQyhpbnRfbXVsdCwgIjAgLSAyIChocy9zcyBvbmx5KSIpOwotCi1tb2R1bGVfcGFyYW1fbmFtZWQoaW50X21heGJ1cnN0LCBnemVyb19vcHRpb25zLmludF9tYXhidXJzdCwgdWludCwKLQkJU19JUlVHT3xTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0MoaW50X21heGJ1cnN0LCAiMCAtIDE1IChzcyBvbmx5KSIpOwotCiBzdGF0aWMgc3RydWN0IHVzYl9mdW5jdGlvbiAqZnVuY19sYjsKIHN0YXRpYyBzdHJ1Y3QgdXNiX2Z1bmN0aW9uX2luc3RhbmNlICpmdW5jX2luc3RfbGI7CiAKQEAgLTMxOCwxMCArMzAxLDYgQEAKIAlzc19vcHRzLT5pc29jX21heHBhY2tldCA9IGd6ZXJvX29wdGlvbnMuaXNvY19tYXhwYWNrZXQ7CiAJc3Nfb3B0cy0+aXNvY19tdWx0ID0gZ3plcm9fb3B0aW9ucy5pc29jX211bHQ7CiAJc3Nfb3B0cy0+aXNvY19tYXhidXJzdCA9IGd6ZXJvX29wdGlvbnMuaXNvY19tYXhidXJzdDsKLQlzc19vcHRzLT5pbnRfaW50ZXJ2YWwgPSBnemVyb19vcHRpb25zLmludF9pbnRlcnZhbDsKLQlzc19vcHRzLT5pbnRfbWF4cGFja2V0ID0gZ3plcm9fb3B0aW9ucy5pbnRfbWF4cGFja2V0OwotCXNzX29wdHMtPmludF9tdWx0ID0gZ3plcm9fb3B0aW9ucy5pbnRfbXVsdDsKLQlzc19vcHRzLT5pbnRfbWF4YnVyc3QgPSBnemVyb19vcHRpb25zLmludF9tYXhidXJzdDsKIAlzc19vcHRzLT5idWxrX2J1ZmxlbiA9IGd6ZXJvX29wdGlvbnMuYnVsa19idWZsZW47CiAKIAlmdW5jX3NzID0gdXNiX2dldF9mdW5jdGlvbihmdW5jX2luc3Rfc3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hdG1lbF91c2JhX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hdG1lbF91c2JhX3VkYy5jCmluZGV4IGQ3OWNiMzUuLjRjMDE5NTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXRtZWxfdXNiYV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2F0bWVsX3VzYmFfdWRjLmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAJc3Bpbl9sb2NrX2lycSgmdWRjLT5sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgaW5vZGUtPmlfc2l6ZSAvIDQ7IGkrKykKLQkJZGF0YVtpXSA9IF9fcmF3X3JlYWRsKHVkYy0+cmVncyArIGkgKiA0KTsKKwkJZGF0YVtpXSA9IHVzYmFfaW9fcmVhZGwodWRjLT5yZWdzICsgaSAqIDQpOwogCXNwaW5fdW5sb2NrX2lycSgmdWRjLT5sb2NrKTsKIAogCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRhdGE7CkBAIC0xMjQ5LDcgKzEyNDksNyBAQAogCQlpZiAoY3JxLT53TGVuZ3RoICE9IGNwdV90b19sZTE2KHNpemVvZihzdGF0dXMpKSkKIAkJCWdvdG8gc3RhbGw7CiAJCWVwLT5zdGF0ZSA9IERBVEFfU1RBR0VfSU47Ci0JCV9fcmF3X3dyaXRldyhzdGF0dXMsIGVwLT5maWZvKTsKKwkJdXNiYV9pb193cml0ZXcoc3RhdHVzLCBlcC0+Zmlmbyk7CiAJCXVzYmFfZXBfd3JpdGVsKGVwLCBTRVRfU1RBLCBVU0JBX1RYX1BLX1JEWSk7CiAJCWJyZWFrOwogCX0KQEAgLTE3MzksNyArMTczOSw3MiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIGlycXJldHVybl90IHVzYmFfdmJ1c19pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCitzdGF0aWMgaW50IHN0YXJ0X2Nsb2NrKHN0cnVjdCB1c2JhX3VkYyAqdWRjKQoreworCWludCByZXQ7CisKKwlpZiAodWRjLT5jbG9ja2VkKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSh1ZGMtPnBjbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHVkYy0+aGNsayk7CisJaWYgKHJldCkgeworCQljbGtfZGlzYWJsZV91bnByZXBhcmUodWRjLT5wY2xrKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl1ZGMtPmNsb2NrZWQgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2Nsb2NrKHN0cnVjdCB1c2JhX3VkYyAqdWRjKQoreworCWlmICghdWRjLT5jbG9ja2VkKQorCQlyZXR1cm47CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUodWRjLT5oY2xrKTsKKwljbGtfZGlzYWJsZV91bnByZXBhcmUodWRjLT5wY2xrKTsKKworCXVkYy0+Y2xvY2tlZCA9IGZhbHNlOworfQorCitzdGF0aWMgaW50IHVzYmFfc3RhcnQoc3RydWN0IHVzYmFfdWRjICp1ZGMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJcmV0ID0gc3RhcnRfY2xvY2sodWRjKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCXRvZ2dsZV9iaWFzKHVkYywgMSk7CisJdXNiYV93cml0ZWwodWRjLCBDVFJMLCBVU0JBX0VOQUJMRV9NQVNLKTsKKwl1c2JhX2ludF9lbmJfc2V0KHVkYywgVVNCQV9FTkRfT0ZfUkVTRVQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVzYmFfc3RvcChzdHJ1Y3QgdXNiYV91ZGMgKnVkYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCXVkYy0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJcmVzZXRfYWxsX2VuZHBvaW50cyh1ZGMpOworCisJLyogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgRFAgcHVsbHVwICovCisJdG9nZ2xlX2JpYXModWRjLCAwKTsKKwl1c2JhX3dyaXRlbCh1ZGMsIENUUkwsIFVTQkFfRElTQUJMRV9NQVNLKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXN0b3BfY2xvY2sodWRjKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHVzYmFfdmJ1c19pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmRldmlkKQogewogCXN0cnVjdCB1c2JhX3VkYyAqdWRjID0gZGV2aWQ7CiAJaW50IHZidXM7CkBAIC0xNzQ3LDM1ICsxODEyLDIyIEBACiAJLyogZGVib3VuY2UgKi8KIAl1ZGVsYXkoMTApOwogCi0Jc3Bpbl9sb2NrKCZ1ZGMtPmxvY2spOwotCi0JLyogTWF5IGhhcHBlbiBpZiBWYnVzIHBpbiB0b2dnbGVzIGR1cmluZyBwcm9iZSgpICovCi0JaWYgKCF1ZGMtPmRyaXZlcikKLQkJZ290byBvdXQ7CisJbXV0ZXhfbG9jaygmdWRjLT52YnVzX211dGV4KTsKIAogCXZidXMgPSB2YnVzX2lzX3ByZXNlbnQodWRjKTsKIAlpZiAodmJ1cyAhPSB1ZGMtPnZidXNfcHJldikgewogCQlpZiAodmJ1cykgewotCQkJdG9nZ2xlX2JpYXModWRjLCAxKTsKLQkJCXVzYmFfd3JpdGVsKHVkYywgQ1RSTCwgVVNCQV9FTkFCTEVfTUFTSyk7Ci0JCQl1c2JhX2ludF9lbmJfc2V0KHVkYywgVVNCQV9FTkRfT0ZfUkVTRVQpOworCQkJdXNiYV9zdGFydCh1ZGMpOwogCQl9IGVsc2UgewotCQkJdWRjLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKLQkJCXJlc2V0X2FsbF9lbmRwb2ludHModWRjKTsKLQkJCXRvZ2dsZV9iaWFzKHVkYywgMCk7Ci0JCQl1c2JhX3dyaXRlbCh1ZGMsIENUUkwsIFVTQkFfRElTQUJMRV9NQVNLKTsKLQkJCWlmICh1ZGMtPmRyaXZlci0+ZGlzY29ubmVjdCkgewotCQkJCXNwaW5fdW5sb2NrKCZ1ZGMtPmxvY2spOworCQkJdXNiYV9zdG9wKHVkYyk7CisKKwkJCWlmICh1ZGMtPmRyaXZlci0+ZGlzY29ubmVjdCkKIAkJCQl1ZGMtPmRyaXZlci0+ZGlzY29ubmVjdCgmdWRjLT5nYWRnZXQpOwotCQkJCXNwaW5fbG9jaygmdWRjLT5sb2NrKTsKLQkJCX0KIAkJfQogCQl1ZGMtPnZidXNfcHJldiA9IHZidXM7CiAJfQogCi1vdXQ6Ci0Jc3Bpbl91bmxvY2soJnVkYy0+bG9jayk7Ci0KKwltdXRleF91bmxvY2soJnVkYy0+dmJ1c19tdXRleCk7CiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC0xNzg3LDU1ICsxODM5LDQ3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKLQogCXVkYy0+ZGV2c3RhdHVzID0gMSA8PCBVU0JfREVWSUNFX1NFTEZfUE9XRVJFRDsKIAl1ZGMtPmRyaXZlciA9IGRyaXZlcjsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAotCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZSh1ZGMtPnBjbGspOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHVkYy0+aGNsayk7Ci0JaWYgKHJldCkgewotCQljbGtfZGlzYWJsZV91bnByZXBhcmUodWRjLT5wY2xrKTsKLQkJcmV0dXJuIHJldDsKLQl9CisJbXV0ZXhfbG9jaygmdWRjLT52YnVzX211dGV4KTsKIAotCXVkYy0+dmJ1c19wcmV2ID0gMDsKIAlpZiAoZ3Bpb19pc192YWxpZCh1ZGMtPnZidXNfcGluKSkKIAkJZW5hYmxlX2lycShncGlvX3RvX2lycSh1ZGMtPnZidXNfcGluKSk7CiAKIAkvKiBJZiBWYnVzIGlzIHByZXNlbnQsIGVuYWJsZSB0aGUgY29udHJvbGxlciBhbmQgd2FpdCBmb3IgcmVzZXQgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdWRjLT5sb2NrLCBmbGFncyk7Ci0JaWYgKHZidXNfaXNfcHJlc2VudCh1ZGMpICYmIHVkYy0+dmJ1c19wcmV2ID09IDApIHsKLQkJdG9nZ2xlX2JpYXModWRjLCAxKTsKLQkJdXNiYV93cml0ZWwodWRjLCBDVFJMLCBVU0JBX0VOQUJMRV9NQVNLKTsKLQkJdXNiYV9pbnRfZW5iX3NldCh1ZGMsIFVTQkFfRU5EX09GX1JFU0VUKTsKKwl1ZGMtPnZidXNfcHJldiA9IHZidXNfaXNfcHJlc2VudCh1ZGMpOworCWlmICh1ZGMtPnZidXNfcHJldikgeworCQlyZXQgPSB1c2JhX3N0YXJ0KHVkYyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKIAl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjLT5sb2NrLCBmbGFncyk7CiAKKwltdXRleF91bmxvY2soJnVkYy0+dmJ1c19tdXRleCk7CiAJcmV0dXJuIDA7CisKK2VycjoKKwlpZiAoZ3Bpb19pc192YWxpZCh1ZGMtPnZidXNfcGluKSkKKwkJZGlzYWJsZV9pcnEoZ3Bpb190b19pcnEodWRjLT52YnVzX3BpbikpOworCisJbXV0ZXhfdW5sb2NrKCZ1ZGMtPnZidXNfbXV0ZXgpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCXVkYy0+ZGV2c3RhdHVzICY9IH4oMSA8PCBVU0JfREVWSUNFX1NFTEZfUE9XRVJFRCk7CisJdWRjLT5kcml2ZXIgPSBOVUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXRtZWxfdXNiYV9zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCiB7CiAJc3RydWN0IHVzYmFfdWRjICp1ZGMgPSBjb250YWluZXJfb2YoZ2FkZ2V0LCBzdHJ1Y3QgdXNiYV91ZGMsIGdhZGdldCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChncGlvX2lzX3ZhbGlkKHVkYy0+dmJ1c19waW4pKQogCQlkaXNhYmxlX2lycShncGlvX3RvX2lycSh1ZGMtPnZidXNfcGluKSk7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdWRjLT5sb2NrLCBmbGFncyk7Ci0JdWRjLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKLQlyZXNldF9hbGxfZW5kcG9pbnRzKHVkYyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWRjLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBUaGlzIHdpbGwgYWxzbyBkaXNhYmxlIHRoZSBEUCBwdWxsdXAgKi8KLQl0b2dnbGVfYmlhcyh1ZGMsIDApOwotCXVzYmFfd3JpdGVsKHVkYywgQ1RSTCwgVVNCQV9ESVNBQkxFX01BU0spOwotCi0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHVkYy0+aGNsayk7Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHVkYy0+cGNsayk7CisJdXNiYV9zdG9wKHVkYyk7CiAKIAl1ZGMtPmRyaXZlciA9IE5VTEw7CiAKQEAgLTIwNTcsNiArMjEwMSw3IEBACiAJCXJldHVybiBQVFJfRVJSKGhjbGspOwogCiAJc3Bpbl9sb2NrX2luaXQoJnVkYy0+bG9jayk7CisJbXV0ZXhfaW5pdCgmdWRjLT52YnVzX211dGV4KTsKIAl1ZGMtPnBkZXYgPSBwZGV2OwogCXVkYy0+cGNsayA9IHBjbGs7CiAJdWRjLT5oY2xrID0gaGNsazsKQEAgLTIxMTEsMTcgKzIxNTYsMTcgQEAKIAogCWlmIChncGlvX2lzX3ZhbGlkKHVkYy0+dmJ1c19waW4pKSB7CiAJCWlmICghZGV2bV9ncGlvX3JlcXVlc3QoJnBkZXYtPmRldiwgdWRjLT52YnVzX3BpbiwgImF0bWVsX3VzYmFfdWRjIikpIHsKLQkJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwKLQkJCQkJZ3Bpb190b19pcnEodWRjLT52YnVzX3BpbiksCi0JCQkJCXVzYmFfdmJ1c19pcnEsIDAsCisJCQlpcnFfc2V0X3N0YXR1c19mbGFncyhncGlvX3RvX2lycSh1ZGMtPnZidXNfcGluKSwKKwkJCQkJSVJRX05PQVVUT0VOKTsKKwkJCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoJnBkZXYtPmRldiwKKwkJCQkJZ3Bpb190b19pcnEodWRjLT52YnVzX3BpbiksIE5VTEwsCisJCQkJCXVzYmFfdmJ1c19pcnFfdGhyZWFkLCBJUlFGX09ORVNIT1QsCiAJCQkJCSJhdG1lbF91c2JhX3VkYyIsIHVkYyk7CiAJCQlpZiAocmV0KSB7CiAJCQkJdWRjLT52YnVzX3BpbiA9IC1FTk9ERVY7CiAJCQkJZGV2X3dhcm4oJnVkYy0+cGRldi0+ZGV2LAogCQkJCQkgImZhaWxlZCB0byByZXF1ZXN0IHZidXMgaXJxOyAiCiAJCQkJCSAiYXNzdW1pbmcgYWx3YXlzIG9uXG4iKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGlzYWJsZV9pcnEoZ3Bpb190b19pcnEodWRjLT52YnVzX3BpbikpOwogCQkJfQogCQl9IGVsc2UgewogCQkJLyogZ3Bpb19yZXF1ZXN0IGZhaWwgc28gdXNlIC1FSU5WQUwgZm9yIGdwaW9faXNfdmFsaWQgKi8KQEAgLTIxMzIsNiArMjE3Nyw3IEBACiAJcmV0ID0gdXNiX2FkZF9nYWRnZXRfdWRjKCZwZGV2LT5kZXYsICZ1ZGMtPmdhZGdldCk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKKwlkZXZpY2VfaW5pdF93YWtldXAoJnBkZXYtPmRldiwgMSk7CiAKIAl1c2JhX2luaXRfZGVidWdmcyh1ZGMpOwogCWZvciAoaSA9IDE7IGkgPCB1ZGMtPm51bV9lcDsgaSsrKQpAQCAtMjE0Nyw2ICsyMTkzLDcgQEAKIAogCXVkYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCisJZGV2aWNlX2luaXRfd2FrZXVwKCZwZGV2LT5kZXYsIDApOwogCXVzYl9kZWxfZ2FkZ2V0X3VkYygmdWRjLT5nYWRnZXQpOwogCiAJZm9yIChpID0gMTsgaSA8IHVkYy0+bnVtX2VwOyBpKyspCkBAIC0yMTU2LDEwICsyMjAzLDY1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgdXNiYV91ZGNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHVzYmFfdWRjICp1ZGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCS8qIE5vdCBzdGFydGVkICovCisJaWYgKCF1ZGMtPmRyaXZlcikKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZ1ZGMtPnZidXNfbXV0ZXgpOworCisJaWYgKCFkZXZpY2VfbWF5X3dha2V1cChkZXYpKSB7CisJCXVzYmFfc3RvcCh1ZGMpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIERldmljZSBtYXkgd2FrZSB1cC4gV2Ugc3RheSBjbG9ja2VkIGlmIHdlIGZhaWxlZAorCSAqIHRvIHJlcXVlc3QgdmJ1cyBpcnEsIGFzc3VtaW5nIGFsd2F5cyBvbi4KKwkgKi8KKwlpZiAoZ3Bpb19pc192YWxpZCh1ZGMtPnZidXNfcGluKSkgeworCQl1c2JhX3N0b3AodWRjKTsKKwkJZW5hYmxlX2lycV93YWtlKGdwaW9fdG9faXJxKHVkYy0+dmJ1c19waW4pKTsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJnVkYy0+dmJ1c19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXNiYV91ZGNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdXNiYV91ZGMgKnVkYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJLyogTm90IHN0YXJ0ZWQgKi8KKwlpZiAoIXVkYy0+ZHJpdmVyKQorCQlyZXR1cm4gMDsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChkZXYpICYmIGdwaW9faXNfdmFsaWQodWRjLT52YnVzX3BpbikpCisJCWRpc2FibGVfaXJxX3dha2UoZ3Bpb190b19pcnEodWRjLT52YnVzX3BpbikpOworCisJLyogSWYgVmJ1cyBpcyBwcmVzZW50LCBlbmFibGUgdGhlIGNvbnRyb2xsZXIgYW5kIHdhaXQgZm9yIHJlc2V0ICovCisJbXV0ZXhfbG9jaygmdWRjLT52YnVzX211dGV4KTsKKwl1ZGMtPnZidXNfcHJldiA9IHZidXNfaXNfcHJlc2VudCh1ZGMpOworCWlmICh1ZGMtPnZidXNfcHJldikKKwkJdXNiYV9zdGFydCh1ZGMpOworCW11dGV4X3VubG9jaygmdWRjLT52YnVzX211dGV4KTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyh1c2JhX3VkY19wbV9vcHMsIHVzYmFfdWRjX3N1c3BlbmQsIHVzYmFfdWRjX3Jlc3VtZSk7CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHVkY19kcml2ZXIgPSB7CiAJLnJlbW92ZQkJPSBfX2V4aXRfcCh1c2JhX3VkY19yZW1vdmUpLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQkJPSAiYXRtZWxfdXNiYV91ZGMiLAorCQkucG0JCT0gJnVzYmFfdWRjX3BtX29wcywKIAkJLm9mX21hdGNoX3RhYmxlCT0gb2ZfbWF0Y2hfcHRyKGF0bWVsX3VkY19kdF9pZHMpLAogCX0sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hdG1lbF91c2JhX3VkYy5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hdG1lbF91c2JhX3VkYy5oCmluZGV4IDQ5N2NkMTguLmVhNDQ4YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXRtZWxfdXNiYV91ZGMuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2F0bWVsX3VzYmFfdWRjLmgKQEAgLTE5MSwxOCArMTkxLDI4IEBACiAJIHwgVVNCQV9CRihuYW1lLCB2YWx1ZSkpCiAKIC8qIFJlZ2lzdGVyIGFjY2VzcyBtYWNyb3MgKi8KKyNpZmRlZiBDT05GSUdfQVZSMzIKKyNkZWZpbmUgdXNiYV9pb19yZWFkbAlfX3Jhd19yZWFkbAorI2RlZmluZSB1c2JhX2lvX3dyaXRlbAlfX3Jhd193cml0ZWwKKyNkZWZpbmUgdXNiYV9pb193cml0ZXcJX19yYXdfd3JpdGV3CisjZWxzZQorI2RlZmluZSB1c2JhX2lvX3JlYWRsCXJlYWRsX3JlbGF4ZWQKKyNkZWZpbmUgdXNiYV9pb193cml0ZWwJd3JpdGVsX3JlbGF4ZWQKKyNkZWZpbmUgdXNiYV9pb193cml0ZXcJd3JpdGV3X3JlbGF4ZWQKKyNlbmRpZgorCiAjZGVmaW5lIHVzYmFfcmVhZGwodWRjLCByZWcpCQkJCQlcCi0JX19yYXdfcmVhZGwoKHVkYyktPnJlZ3MgKyBVU0JBXyMjcmVnKQorCXVzYmFfaW9fcmVhZGwoKHVkYyktPnJlZ3MgKyBVU0JBXyMjcmVnKQogI2RlZmluZSB1c2JhX3dyaXRlbCh1ZGMsIHJlZywgdmFsdWUpCQkJCVwKLQlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKHVkYyktPnJlZ3MgKyBVU0JBXyMjcmVnKQorCXVzYmFfaW9fd3JpdGVsKCh2YWx1ZSksICh1ZGMpLT5yZWdzICsgVVNCQV8jI3JlZykKICNkZWZpbmUgdXNiYV9lcF9yZWFkbChlcCwgcmVnKQkJCQkJXAotCV9fcmF3X3JlYWRsKChlcCktPmVwX3JlZ3MgKyBVU0JBX0VQVF8jI3JlZykKKwl1c2JhX2lvX3JlYWRsKChlcCktPmVwX3JlZ3MgKyBVU0JBX0VQVF8jI3JlZykKICNkZWZpbmUgdXNiYV9lcF93cml0ZWwoZXAsIHJlZywgdmFsdWUpCQkJCVwKLQlfX3Jhd193cml0ZWwoKHZhbHVlKSwgKGVwKS0+ZXBfcmVncyArIFVTQkFfRVBUXyMjcmVnKQorCXVzYmFfaW9fd3JpdGVsKCh2YWx1ZSksIChlcCktPmVwX3JlZ3MgKyBVU0JBX0VQVF8jI3JlZykKICNkZWZpbmUgdXNiYV9kbWFfcmVhZGwoZXAsIHJlZykJCQkJCVwKLQlfX3Jhd19yZWFkbCgoZXApLT5kbWFfcmVncyArIFVTQkFfRE1BXyMjcmVnKQorCXVzYmFfaW9fcmVhZGwoKGVwKS0+ZG1hX3JlZ3MgKyBVU0JBX0RNQV8jI3JlZykKICNkZWZpbmUgdXNiYV9kbWFfd3JpdGVsKGVwLCByZWcsIHZhbHVlKQkJCQlcCi0JX19yYXdfd3JpdGVsKCh2YWx1ZSksIChlcCktPmRtYV9yZWdzICsgVVNCQV9ETUFfIyNyZWcpCisJdXNiYV9pb193cml0ZWwoKHZhbHVlKSwgKGVwKS0+ZG1hX3JlZ3MgKyBVU0JBX0RNQV8jI3JlZykKIAogLyogQ2FsY3VsYXRlIGJhc2UgYWRkcmVzcyBmb3IgYSBnaXZlbiBlbmRwb2ludCBvciBETUEgY29udHJvbGxlciAqLwogI2RlZmluZSBVU0JBX0VQVF9CQVNFKHgpCSgweDEwMCArICh4KSAqIDB4MjApCkBAIC0zMTMsNiArMzIzLDkgQEAKIAkvKiBQcm90ZWN0IGh3IHJlZ2lzdGVycyBmcm9tIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9ucyAqLwogCXNwaW5sb2NrX3QgbG9jazsKIAorCS8qIE11dGV4IHRvIHByZXZlbnQgY29uY3VycmVudCBzdGFydCBvciBzdG9wICovCisJc3RydWN0IG11dGV4IHZidXNfbXV0ZXg7CisKIAl2b2lkIF9faW9tZW0gKnJlZ3M7CiAJdm9pZCBfX2lvbWVtICpmaWZvOwogCkBAIC0zMjgsNiArMzQxLDcgQEAKIAlzdHJ1Y3QgY2xrICpoY2xrOwogCXN0cnVjdCB1c2JhX2VwICp1c2JhX2VwOwogCWJvb2wgYmlhc19wdWxzZV9uZWVkZWQ7CisJYm9vbCBjbG9ja2VkOwogCiAJdTE2IGRldnN0YXR1czsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9kdW1teV9oY2QuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvZHVtbXlfaGNkLmMKaW5kZXggOGRkYTQ4NC4uMTgxMTEyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9kdW1teV9oY2QuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2R1bW15X2hjZC5jCkBAIC0xOTIzLDcgKzE5MjMsNyBAQAogc3NfaHViX2Rlc2NyaXB0b3Ioc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzYykKIHsKIAltZW1zZXQoZGVzYywgMCwgc2l6ZW9mICpkZXNjKTsKLQlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSAweDJhOworCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9TU19IVUI7CiAJZGVzYy0+YkRlc2NMZW5ndGggPSAxMjsKIAlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzID0gY3B1X3RvX2xlMTYoCiAJCQlIVUJfQ0hBUl9JTkRWX1BPUlRfTFBTTSB8CkBAIC0xOTM2LDcgKzE5MzYsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGh1Yl9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2MpCiB7CiAJbWVtc2V0KGRlc2MsIDAsIHNpemVvZiAqZGVzYyk7Ci0JZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsKKwlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSFVCOwogCWRlc2MtPmJEZXNjTGVuZ3RoID0gOTsKIAlkZXNjLT53SHViQ2hhcmFjdGVyaXN0aWNzID0gY3B1X3RvX2xlMTYoCiAJCQlIVUJfQ0hBUl9JTkRWX1BPUlRfTFBTTSB8CkBAIC0yNjMxLDcgKzI2MzEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChtb2RfZGF0YS5udW0gPCAxIHx8IG1vZF9kYXRhLm51bSA+IE1BWF9OVU1fVURDKSB7Ci0JCXByX2VycigiTnVtYmVyIG9mIGVtdWxhdGVkIFVEQyBtdXN0IGJlIGluIHJhbmdlIG9mIDHigKYlZFxuIiwKKwkJcHJfZXJyKCJOdW1iZXIgb2YgZW11bGF0ZWQgVURDIG11c3QgYmUgaW4gcmFuZ2Ugb2YgMS4uLiVkXG4iLAogCQkJCU1BWF9OVU1fVURDKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9nb2t1X3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9nb2t1X3VkYy5jCmluZGV4IDViOTE3NmUuLjllOGQ4NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvZ29rdV91ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2dva3VfdWRjLmMKQEAgLTEwMjQsMzUgKzEwMjQsNzkgQEAKIHN0YXRpYyB2b2lkIGR1bXBfaW50bWFzayhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGNvbnN0IGNoYXIgKmxhYmVsLCB1MzIgbWFzaykKIHsKIAkvKiBpbnRfc3RhdHVzIGlzIHRoZSBzYW1lIGZvcm1hdCAuLi4gKi8KLQlzZXFfcHJpbnRmKG0sCi0JCSIlcyAlMDVYID0iIEZPVVJCSVRTIEVJR0hUQklUUyBFSUdIVEJJVFMgIlxuIiwKLQkJbGFiZWwsIG1hc2ssCi0JCShtYXNrICYgSU5UX1BXUkRFVEVDVCkgPyAiIHBvd2VyIiA6ICIiLAotCQkobWFzayAmIElOVF9TWVNFUlJPUikgPyAiIHN5cyIgOiAiIiwKLQkJKG1hc2sgJiBJTlRfTVNUUkRFTkQpID8gIiBpbi1kbWEiIDogIiIsCi0JCShtYXNrICYgSU5UX01TVFdSVE1PVVQpID8gIiB3cnRtbyIgOiAiIiwKKwlzZXFfcHJpbnRmKG0sICIlcyAlMDVYID0iIEZPVVJCSVRTIEVJR0hUQklUUyBFSUdIVEJJVFMgIlxuIiwKKwkJICAgbGFiZWwsIG1hc2ssCisJCSAgIChtYXNrICYgSU5UX1BXUkRFVEVDVCkgPyAiIHBvd2VyIiA6ICIiLAorCQkgICAobWFzayAmIElOVF9TWVNFUlJPUikgPyAiIHN5cyIgOiAiIiwKKwkJICAgKG1hc2sgJiBJTlRfTVNUUkRFTkQpID8gIiBpbi1kbWEiIDogIiIsCisJCSAgIChtYXNrICYgSU5UX01TVFdSVE1PVVQpID8gIiB3cnRtbyIgOiAiIiwKIAotCQkobWFzayAmIElOVF9NU1RXUkVORCkgPyAiIG91dC1kbWEiIDogIiIsCi0JCShtYXNrICYgSU5UX01TVFdSU0VUKSA/ICIgd3JzZXQiIDogIiIsCi0JCShtYXNrICYgSU5UX0VSUikgPyAiIGVyciIgOiAiIiwKLQkJKG1hc2sgJiBJTlRfU09GKSA/ICIgc29mIiA6ICIiLAorCQkgICAobWFzayAmIElOVF9NU1RXUkVORCkgPyAiIG91dC1kbWEiIDogIiIsCisJCSAgIChtYXNrICYgSU5UX01TVFdSU0VUKSA/ICIgd3JzZXQiIDogIiIsCisJCSAgIChtYXNrICYgSU5UX0VSUikgPyAiIGVyciIgOiAiIiwKKwkJICAgKG1hc2sgJiBJTlRfU09GKSA/ICIgc29mIiA6ICIiLAogCi0JCShtYXNrICYgSU5UX0VQM05BSykgPyAiIGVwM25hayIgOiAiIiwKLQkJKG1hc2sgJiBJTlRfRVAyTkFLKSA/ICIgZXAybmFrIiA6ICIiLAotCQkobWFzayAmIElOVF9FUDFOQUspID8gIiBlcDFuYWsiIDogIiIsCi0JCShtYXNrICYgSU5UX0VQM0RBVEFTRVQpID8gIiBlcDMiIDogIiIsCisJCSAgIChtYXNrICYgSU5UX0VQM05BSykgPyAiIGVwM25hayIgOiAiIiwKKwkJICAgKG1hc2sgJiBJTlRfRVAyTkFLKSA/ICIgZXAybmFrIiA6ICIiLAorCQkgICAobWFzayAmIElOVF9FUDFOQUspID8gIiBlcDFuYWsiIDogIiIsCisJCSAgIChtYXNrICYgSU5UX0VQM0RBVEFTRVQpID8gIiBlcDMiIDogIiIsCiAKLQkJKG1hc2sgJiBJTlRfRVAyREFUQVNFVCkgPyAiIGVwMiIgOiAiIiwKLQkJKG1hc2sgJiBJTlRfRVAxREFUQVNFVCkgPyAiIGVwMSIgOiAiIiwKLQkJKG1hc2sgJiBJTlRfU1RBVFVTTkFLKSA/ICIgZXAwc25hayIgOiAiIiwKLQkJKG1hc2sgJiBJTlRfU1RBVFVTKSA/ICIgZXAwc3RhdHVzIiA6ICIiLAorCQkgICAobWFzayAmIElOVF9FUDJEQVRBU0VUKSA/ICIgZXAyIiA6ICIiLAorCQkgICAobWFzayAmIElOVF9FUDFEQVRBU0VUKSA/ICIgZXAxIiA6ICIiLAorCQkgICAobWFzayAmIElOVF9TVEFUVVNOQUspID8gIiBlcDBzbmFrIiA6ICIiLAorCQkgICAobWFzayAmIElOVF9TVEFUVVMpID8gIiBlcDBzdGF0dXMiIDogIiIsCiAKLQkJKG1hc2sgJiBJTlRfU0VUVVApID8gIiBzZXR1cCIgOiAiIiwKLQkJKG1hc2sgJiBJTlRfRU5EUE9JTlQwKSA/ICIgZXAwIiA6ICIiLAotCQkobWFzayAmIElOVF9VU0JSRVNFVCkgPyAiIHJlc2V0IiA6ICIiLAotCQkobWFzayAmIElOVF9TVVNQRU5EKSA/ICIgc3VzcGVuZCIgOiAiIik7CisJCSAgIChtYXNrICYgSU5UX1NFVFVQKSA/ICIgc2V0dXAiIDogIiIsCisJCSAgIChtYXNrICYgSU5UX0VORFBPSU5UMCkgPyAiIGVwMCIgOiAiIiwKKwkJICAgKG1hc2sgJiBJTlRfVVNCUkVTRVQpID8gIiByZXNldCIgOiAiIiwKKwkJICAgKG1hc2sgJiBJTlRfU1VTUEVORCkgPyAiIHN1c3BlbmQiIDogIiIpOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqdWRjX2VwX3N0YXRlKGVudW0gZXAwc3RhdGUgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgRVAwX0RJU0NPTk5FQ1Q6CisJCXJldHVybiAiZXAwX2Rpc2Nvbm5lY3QiOworCWNhc2UgRVAwX0lETEU6CisJCXJldHVybiAiZXAwX2lkbGUiOworCWNhc2UgRVAwX0lOOgorCQlyZXR1cm4gImVwMF9pbiI7CisJY2FzZSBFUDBfT1VUOgorCQlyZXR1cm4gImVwMF9vdXQiOworCWNhc2UgRVAwX1NUQVRVUzoKKwkJcmV0dXJuICJlcDBfc3RhdHVzIjsKKwljYXNlIEVQMF9TVEFMTDoKKwkJcmV0dXJuICJlcDBfc3RhbGwiOworCWNhc2UgRVAwX1NVU1BFTkQ6CisJCXJldHVybiAiZXAwX3N1c3BlbmQiOworCX0KKworCXJldHVybiAiZXAwXz8iOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdWRjX2VwX3N0YXR1cyh1MzIgc3RhdHVzKQoreworCXN3aXRjaCAoc3RhdHVzICYgRVB4U1RBVFVTX0VQX01BU0spIHsKKwljYXNlIEVQeFNUQVRVU19FUF9SRUFEWToKKwkJcmV0dXJuICJyZWFkeSI7CisJY2FzZSBFUHhTVEFUVVNfRVBfREFUQUlOOgorCQlyZXR1cm4gInBhY2tldCI7CisJY2FzZSBFUHhTVEFUVVNfRVBfRlVMTDoKKwkJcmV0dXJuICJmdWxsIjsKKwljYXNlIEVQeFNUQVRVU19FUF9UWF9FUlI6CS8qIGhvc3Qgd2lsbCByZXRyeSAqLworCQlyZXR1cm4gInR4X2VyciI7CisJY2FzZSBFUHhTVEFUVVNfRVBfUlhfRVJSOgorCQlyZXR1cm4gInJ4X2VyciI7CisJY2FzZSBFUHhTVEFUVVNfRVBfQlVTWToJCS8qIGVwMCBvbmx5ICovCisJCXJldHVybiAiYnVzeSI7CisJY2FzZSBFUHhTVEFUVVNfRVBfU1RBTEw6CisJCXJldHVybiAic3RhbGwiOworCWNhc2UgRVB4U1RBVFVTX0VQX0lOVkFMSUQ6CS8qIHRoZXNlICJjYW4ndCBoYXBwZW4iICovCisJCXJldHVybiAiaW52YWxpZCI7CisJfQorCisJcmV0dXJuICI/IjsKK30KIAogc3RhdGljIGludCB1ZGNfcHJvY19yZWFkKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKQEAgLTEwNjgsMjkgKzExMTIsMTggQEAKIAl0bXAgPSByZWFkbCgmcmVncy0+cG93ZXJfZGV0ZWN0KTsKIAlpc191c2JfY29ubmVjdGVkID0gdG1wICYgUFdfREVURUNUOwogCXNlcV9wcmludGYobSwKLQkJIiVzIC0gJXNcbiIKLQkJIiVzIHZlcnNpb246ICVzICVzXG4iCi0JCSJHYWRnZXQgZHJpdmVyOiAlc1xuIgotCQkiSG9zdCAlcywgJXNcbiIKLQkJIlxuIiwKLQkJcGNpX25hbWUoZGV2LT5wZGV2KSwgZHJpdmVyX2Rlc2MsCi0JCWRyaXZlcl9uYW1lLCBEUklWRVJfVkVSU0lPTiwgZG1hc3RyKCksCi0JCWRldi0+ZHJpdmVyID8gZGV2LT5kcml2ZXItPmRyaXZlci5uYW1lIDogIihub25lKSIsCi0JCWlzX3VzYl9jb25uZWN0ZWQKLQkJCT8gKCh0bXAgJiBQV19QVUxMVVApID8gImZ1bGwgc3BlZWQiIDogInBvd2VyZWQiKQotCQkJOiAiZGlzY29ubmVjdGVkIiwKLQkJKHtjb25zdCBjaGFyICpzdGF0ZTsKLQkJc3dpdGNoKGRldi0+ZXAwc3RhdGUpewotCQljYXNlIEVQMF9ESVNDT05ORUNUOglzdGF0ZSA9ICJlcDBfZGlzY29ubmVjdCI7IGJyZWFrOwotCQljYXNlIEVQMF9JRExFOgkJc3RhdGUgPSAiZXAwX2lkbGUiOyBicmVhazsKLQkJY2FzZSBFUDBfSU46CQlzdGF0ZSA9ICJlcDBfaW4iOyBicmVhazsKLQkJY2FzZSBFUDBfT1VUOgkJc3RhdGUgPSAiZXAwX291dCI7IGJyZWFrOwotCQljYXNlIEVQMF9TVEFUVVM6CXN0YXRlID0gImVwMF9zdGF0dXMiOyBicmVhazsKLQkJY2FzZSBFUDBfU1RBTEw6CQlzdGF0ZSA9ICJlcDBfc3RhbGwiOyBicmVhazsKLQkJY2FzZSBFUDBfU1VTUEVORDoJc3RhdGUgPSAiZXAwX3N1c3BlbmQiOyBicmVhazsKLQkJZGVmYXVsdDoJCXN0YXRlID0gImVwMF8/IjsgYnJlYWs7Ci0JCX0gc3RhdGU7IH0pCi0JCSk7CisJCSAgICIlcyAtICVzXG4iCisJCSAgICIlcyB2ZXJzaW9uOiAlcyAlc1xuIgorCQkgICAiR2FkZ2V0IGRyaXZlcjogJXNcbiIKKwkJICAgIkhvc3QgJXMsICVzXG4iCisJCSAgICJcbiIsCisJCSAgIHBjaV9uYW1lKGRldi0+cGRldiksIGRyaXZlcl9kZXNjLAorCQkgICBkcml2ZXJfbmFtZSwgRFJJVkVSX1ZFUlNJT04sIGRtYXN0cigpLAorCQkgICBkZXYtPmRyaXZlciA/IGRldi0+ZHJpdmVyLT5kcml2ZXIubmFtZSA6ICIobm9uZSkiLAorCQkgICBpc191c2JfY29ubmVjdGVkCisJCQkgICA/ICgodG1wICYgUFdfUFVMTFVQKSA/ICJmdWxsIHNwZWVkIiA6ICJwb3dlcmVkIikKKwkJCSAgIDogImRpc2Nvbm5lY3RlZCIsCisJCSAgIHVkY19lcF9zdGF0ZShkZXYtPmVwMHN0YXRlKSk7CiAKIAlkdW1wX2ludG1hc2sobSwgImludF9zdGF0dXMiLCByZWFkbCgmcmVncy0+aW50X3N0YXR1cykpOwogCWR1bXBfaW50bWFzayhtLCAiaW50X2VuYWJsZSIsIHJlYWRsKCZyZWdzLT5pbnRfZW5hYmxlKSk7CkBAIC0xMDk5LDMxICsxMTMyLDMwIEBACiAJCWdvdG8gZG9uZTsKIAogCS8qIHJlZ2lzdGVycyBmb3IgKGFjdGl2ZSkgZGV2aWNlIGFuZCBlcDAgKi8KLQlpZiAoc2VxX3ByaW50ZihtLCAiXG5pcnFzICVsdVxuZGF0YXNldCAlMDJ4ICIKLQkJCSJzaW5nbGUuYmNzICUwMnguJTAyeCBzdGF0ZSAleCBhZGRyICV1XG4iLAotCQkJZGV2LT5pcnFzLCByZWFkbCgmcmVncy0+RGF0YVNldCksCi0JCQlyZWFkbCgmcmVncy0+RVB4U2luZ2xlKSwgcmVhZGwoJnJlZ3MtPkVQeEJDUyksCi0JCQlyZWFkbCgmcmVncy0+VXNiU3RhdGUpLAotCQkJcmVhZGwoJnJlZ3MtPmFkZHJlc3MpKSA8IDApCisJc2VxX3ByaW50ZihtLCAiXG5pcnFzICVsdVxuZGF0YXNldCAlMDJ4IHNpbmdsZS5iY3MgJTAyeC4lMDJ4IHN0YXRlICV4IGFkZHIgJXVcbiIsCisJCSAgIGRldi0+aXJxcywgcmVhZGwoJnJlZ3MtPkRhdGFTZXQpLAorCQkgICByZWFkbCgmcmVncy0+RVB4U2luZ2xlKSwgcmVhZGwoJnJlZ3MtPkVQeEJDUyksCisJCSAgIHJlYWRsKCZyZWdzLT5Vc2JTdGF0ZSksCisJCSAgIHJlYWRsKCZyZWdzLT5hZGRyZXNzKSk7CisJaWYgKHNlcV9oYXNfb3ZlcmZsb3dlZChtKSkKIAkJZ290byBkb25lOwogCiAJdG1wID0gcmVhZGwoJnJlZ3MtPmRtYV9tYXN0ZXIpOwotCWlmIChzZXFfcHJpbnRmKG0sCi0JCSJkbWEgJTAzWCA9IiBFSUdIVEJJVFMgIiVzICVzXG4iLCB0bXAsCi0JCSh0bXAgJiBNU1RfRU9QQl9ESVMpID8gIiBlb3BiLSIgOiAiIiwKLQkJKHRtcCAmIE1TVF9FT1BCX0VOQSkgPyAiIGVvcGIrIiA6ICIiLAotCQkodG1wICYgTVNUX1RJTUVPVVRfRElTKSA/ICIgdG1vLSIgOiAiIiwKLQkJKHRtcCAmIE1TVF9USU1FT1VUX0VOQSkgPyAiIHRtbysiIDogIiIsCisJc2VxX3ByaW50ZihtLCAiZG1hICUwM1ggPSIgRUlHSFRCSVRTICIlcyAlc1xuIiwKKwkJICAgdG1wLAorCQkgICAodG1wICYgTVNUX0VPUEJfRElTKSA/ICIgZW9wYi0iIDogIiIsCisJCSAgICh0bXAgJiBNU1RfRU9QQl9FTkEpID8gIiBlb3BiKyIgOiAiIiwKKwkJICAgKHRtcCAmIE1TVF9USU1FT1VUX0RJUykgPyAiIHRtby0iIDogIiIsCisJCSAgICh0bXAgJiBNU1RfVElNRU9VVF9FTkEpID8gIiB0bW8rIiA6ICIiLAogCi0JCSh0bXAgJiBNU1RfUkRfRU9QQikgPyAiIGVvcGIiIDogIiIsCi0JCSh0bXAgJiBNU1RfUkRfUkVTRVQpID8gIiBpbl9yZXNldCIgOiAiIiwKLQkJKHRtcCAmIE1TVF9XUl9SRVNFVCkgPyAiIG91dF9yZXNldCIgOiAiIiwKLQkJKHRtcCAmIE1TVF9SRF9FTkEpID8gIiBJTiIgOiAiIiwKKwkJICAgKHRtcCAmIE1TVF9SRF9FT1BCKSA/ICIgZW9wYiIgOiAiIiwKKwkJICAgKHRtcCAmIE1TVF9SRF9SRVNFVCkgPyAiIGluX3Jlc2V0IiA6ICIiLAorCQkgICAodG1wICYgTVNUX1dSX1JFU0VUKSA/ICIgb3V0X3Jlc2V0IiA6ICIiLAorCQkgICAodG1wICYgTVNUX1JEX0VOQSkgPyAiIElOIiA6ICIiLAogCi0JCSh0bXAgJiBNU1RfV1JfRU5BKSA/ICIgT1VUIiA6ICIiLAotCQkodG1wICYgTVNUX0NPTk5FQ1RJT04pCi0JCQk/ICJlcDFpbi9lcDJvdXQiCi0JCQk6ICJlcDFvdXQvZXAyaW4iKSA8IDApCisJCSAgICh0bXAgJiBNU1RfV1JfRU5BKSA/ICIgT1VUIiA6ICIiLAorCQkgICAodG1wICYgTVNUX0NPTk5FQ1RJT04pID8gImVwMWluL2VwMm91dCIgOiAiZXAxb3V0L2VwMmluIik7CisJaWYgKHNlcV9oYXNfb3ZlcmZsb3dlZChtKSkKIAkJZ290byBkb25lOwogCiAJLyogZHVtcCBlbmRwb2ludCBxdWV1ZXMgKi8KQEAgLTExMzUsNDQgKzExNjcsMjMgQEAKIAkJCWNvbnRpbnVlOwogCiAJCXRtcCA9IHJlYWRsKGVwLT5yZWdfc3RhdHVzKTsKLQkJaWYgKHNlcV9wcmludGYobSwKLQkJCSIlcyAlcyBtYXggJXUgJXMsIGlycXMgJWx1LCAiCi0JCQkic3RhdHVzICUwMnggKCVzKSAiIEZPVVJCSVRTICJcbiIsCi0JCQllcC0+ZXAubmFtZSwKLQkJCWVwLT5pc19pbiA/ICJpbiIgOiAib3V0IiwKLQkJCWVwLT5lcC5tYXhwYWNrZXQsCi0JCQllcC0+ZG1hID8gImRtYSIgOiAicGlvIiwKLQkJCWVwLT5pcnFzLAotCQkJdG1wLCAoeyBjaGFyICpzOwotCQkJc3dpdGNoICh0bXAgJiBFUHhTVEFUVVNfRVBfTUFTSykgewotCQkJY2FzZSBFUHhTVEFUVVNfRVBfUkVBRFk6Ci0JCQkJcyA9ICJyZWFkeSI7IGJyZWFrOwotCQkJY2FzZSBFUHhTVEFUVVNfRVBfREFUQUlOOgotCQkJCXMgPSAicGFja2V0IjsgYnJlYWs7Ci0JCQljYXNlIEVQeFNUQVRVU19FUF9GVUxMOgotCQkJCXMgPSAiZnVsbCI7IGJyZWFrOwotCQkJY2FzZSBFUHhTVEFUVVNfRVBfVFhfRVJSOgkvLyBob3N0IHdpbGwgcmV0cnkKLQkJCQlzID0gInR4X2VyciI7IGJyZWFrOwotCQkJY2FzZSBFUHhTVEFUVVNfRVBfUlhfRVJSOgotCQkJCXMgPSAicnhfZXJyIjsgYnJlYWs7Ci0JCQljYXNlIEVQeFNUQVRVU19FUF9CVVNZOgkJLyogZXAwIG9ubHkgKi8KLQkJCQlzID0gImJ1c3kiOyBicmVhazsKLQkJCWNhc2UgRVB4U1RBVFVTX0VQX1NUQUxMOgotCQkJCXMgPSAic3RhbGwiOyBicmVhazsKLQkJCWNhc2UgRVB4U1RBVFVTX0VQX0lOVkFMSUQ6CS8vIHRoZXNlICJjYW4ndCBoYXBwZW4iCi0JCQkJcyA9ICJpbnZhbGlkIjsgYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCXMgPSAiPyI7IGJyZWFrOwotCQkJfSBzOyB9KSwKLQkJCSh0bXAgJiBFUHhTVEFUVVNfVE9HR0xFKSA/ICJkYXRhMSIgOiAiZGF0YTAiLAotCQkJKHRtcCAmIEVQeFNUQVRVU19TVVNQRU5EKSA/ICIgc3VzcGVuZCIgOiAiIiwKLQkJCSh0bXAgJiBFUHhTVEFUVVNfRklGT19ESVNBQkxFKSA/ICIgZGlzYWJsZSIgOiAiIiwKLQkJCSh0bXAgJiBFUHhTVEFUVVNfU1RBR0VfRVJST1IpID8gIiBlcDBzdGF0IiA6ICIiCi0JCQkpIDwgMCkKKwkJc2VxX3ByaW50ZihtLCAiJXMgJXMgbWF4ICV1ICVzLCBpcnFzICVsdSwgc3RhdHVzICUwMnggKCVzKSAiIEZPVVJCSVRTICJcbiIsCisJCQkgICBlcC0+ZXAubmFtZSwKKwkJCSAgIGVwLT5pc19pbiA/ICJpbiIgOiAib3V0IiwKKwkJCSAgIGVwLT5lcC5tYXhwYWNrZXQsCisJCQkgICBlcC0+ZG1hID8gImRtYSIgOiAicGlvIiwKKwkJCSAgIGVwLT5pcnFzLAorCQkJICAgdG1wLCB1ZGNfZXBfc3RhdHVzKHRtcCksCisJCQkgICAodG1wICYgRVB4U1RBVFVTX1RPR0dMRSkgPyAiZGF0YTEiIDogImRhdGEwIiwKKwkJCSAgICh0bXAgJiBFUHhTVEFUVVNfU1VTUEVORCkgPyAiIHN1c3BlbmQiIDogIiIsCisJCQkgICAodG1wICYgRVB4U1RBVFVTX0ZJRk9fRElTQUJMRSkgPyAiIGRpc2FibGUiIDogIiIsCisJCQkgICAodG1wICYgRVB4U1RBVFVTX1NUQUdFX0VSUk9SKSA/ICIgZXAwc3RhdCIgOiAiIik7CisJCWlmIChzZXFfaGFzX292ZXJmbG93ZWQobSkpCiAJCQlnb3RvIGRvbmU7CiAKIAkJaWYgKGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsKLQkJCWlmIChzZXFfcHV0cyhtLCAiXHQobm90aGluZyBxdWV1ZWQpXG4iKSA8IDApCisJCQlzZXFfcHV0cyhtLCAiXHQobm90aGluZyBxdWV1ZWQpXG4iKTsKKwkJCWlmIChzZXFfaGFzX292ZXJmbG93ZWQobSkpCiAJCQkJZ290byBkb25lOwogCQkJY29udGludWU7CiAJCX0KQEAgLTExODcsMTAgKzExOTgsMTAgQEAKIAkJCX0gZWxzZQogCQkJCXRtcCA9IHJlcS0+cmVxLmFjdHVhbDsKIAotCQkJaWYgKHNlcV9wcmludGYobSwKLQkJCQkiXHRyZXEgJXAgbGVuICV1LyV1IGJ1ZiAlcFxuIiwKLQkJCQkmcmVxLT5yZXEsIHRtcCwgcmVxLT5yZXEubGVuZ3RoLAotCQkJCXJlcS0+cmVxLmJ1ZikgPCAwKQorCQkJc2VxX3ByaW50ZihtLCAiXHRyZXEgJXAgbGVuICV1LyV1IGJ1ZiAlcFxuIiwKKwkJCQkgICAmcmVxLT5yZXEsIHRtcCwgcmVxLT5yZXEubGVuZ3RoLAorCQkJCSAgIHJlcS0+cmVxLmJ1Zik7CisJCQlpZiAoc2VxX2hhc19vdmVyZmxvd2VkKG0pKQogCQkJCWdvdG8gZG9uZTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvbHBjMzJ4eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvbHBjMzJ4eF91ZGMuYwppbmRleCAyN2ZkNDEzLi4zYjZhNzg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2xwYzMyeHhfdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9scGMzMnh4X3VkYy5jCkBAIC0xODAzLDIzICsxODAzLDE0IEBACiAJcmVxID0gY29udGFpbmVyX29mKF9yZXEsIHN0cnVjdCBscGMzMnh4X3JlcXVlc3QsIHJlcSk7CiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbHBjMzJ4eF9lcCwgZXApOwogCi0JaWYgKCFfcmVxIHx8ICFfcmVxLT5jb21wbGV0ZSB8fCAhX3JlcS0+YnVmIHx8CisJaWYgKCFfZXAgfHwgIV9yZXEgfHwgIV9yZXEtPmNvbXBsZXRlIHx8ICFfcmVxLT5idWYgfHwKIAkgICAgIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXVkYyA9IGVwLT51ZGM7CiAKLQlpZiAoIV9lcCkgewotCQlkZXZfZGJnKHVkYy0+ZGV2LCAiaW52YWxpZCBlcFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCi0JaWYgKCghdWRjKSB8fCAoIXVkYy0+ZHJpdmVyKSB8fAotCSAgICAodWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pKSB7Ci0JCWRldl9kYmcodWRjLT5kZXYsICJpbnZhbGlkIGRldmljZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KKwlpZiAodWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pCisJCXJldHVybiAtRVBJUEU7CiAKIAlpZiAoZXAtPmxlcCkgewogCQlzdHJ1Y3QgbHBjMzJ4eF91c2JkX2RkX2dhZCAqZGQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL25ldDIyODAuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvbmV0MjI4MC5jCmluZGV4IGQyYzBiZjYuLjk4NzFiOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvbmV0MjI4MC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvbmV0MjI4MC5jCkBAIC04MCw2ICs4MCwxMyBAQAogCSJlcC1lIiwgImVwLWYiLCAiZXAtZyIsICJlcC1oIiwKIH07CiAKKy8qIEVuZHBvaW50IG5hbWVzIGZvciB1c2IzMzgwIGFkdmFuY2UgbW9kZSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGVwX25hbWVfYWR2W10gPSB7CisJZXAwbmFtZSwKKwkiZXAxaW4iLCAiZXAyb3V0IiwgImVwM2luIiwgImVwNG91dCIsCisJImVwMW91dCIsICJlcDJpbiIsICJlcDNvdXQiLCAiZXA0aW4iLAorfTsKKwogLyogbW9kZSAwID09IGVwLXthLGIsYyxkfSAxSyBmaWZvIGVhY2gKICAqIG1vZGUgMSA9PSBlcC17YSxifSAySyBmaWZvIGVhY2gsIGVwLXtjLGR9IHVuYXZhaWxhYmxlCiAgKiBtb2RlIDIgPT0gZXAtYSAySyBmaWZvLCBlcC17YixjfSAxSyBlYWNoLCBlcC1kIHVuYXZhaWxhYmxlCkBAIC0xMzgsMzEgKzE0NSw0NCBAQAogCXUzMgkJCW1heCwgdG1wOwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCXN0YXRpYyBjb25zdCB1MzIgZXBfa2V5WzldID0geyAxLCAwLCAxLCAwLCAxLCAxLCAwLCAxLCAwIH07CisJaW50IHJldCA9IDA7CiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuZXQyMjgwX2VwLCBlcCk7CiAJaWYgKCFfZXAgfHwgIWRlc2MgfHwgZXAtPmRlc2MgfHwgX2VwLT5uYW1lID09IGVwMG5hbWUgfHwKLQkJCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQpCisJCQlkZXNjLT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKSB7CisJCXByX2VycigiJXM6IGZhaWxlZCBhdCBsaW5lPSVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJZGV2ID0gZXAtPmRldjsKLQlpZiAoIWRldi0+ZHJpdmVyIHx8IGRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQotCQlyZXR1cm4gLUVTSFVURE9XTjsKKwlpZiAoIWRldi0+ZHJpdmVyIHx8IGRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSB7CisJCXJldCA9IC1FU0hVVERPV047CisJCWdvdG8gcHJpbnRfZXJyOworCX0KIAogCS8qIGVycmF0dW0gMDExOSB3b3JrYXJvdW5kIHRpZXMgdXAgYW4gZW5kcG9pbnQgbnVtYmVyICovCi0JaWYgKChkZXNjLT5iRW5kcG9pbnRBZGRyZXNzICYgMHgwZikgPT0gRVBfRE9OVFVTRSkKLQkJcmV0dXJuIC1FRE9NOworCWlmICgoZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmIDB4MGYpID09IEVQX0RPTlRVU0UpIHsKKwkJcmV0ID0gLUVET007CisJCWdvdG8gcHJpbnRfZXJyOworCX0KIAogCWlmIChkZXYtPnF1aXJrcyAmIFBMWF9TVVBFUlNQRUVEKSB7Ci0JCWlmICgoZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmIDB4MGYpID49IDB4MGMpCi0JCQlyZXR1cm4gLUVET007CisJCWlmICgoZGVzYy0+YkVuZHBvaW50QWRkcmVzcyAmIDB4MGYpID49IDB4MGMpIHsKKwkJCXJldCA9IC1FRE9NOworCQkJZ290byBwcmludF9lcnI7CisJCX0KIAkJZXAtPmlzX2luID0gISF1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpOwotCQlpZiAoZGV2LT5lbmhhbmNlZF9tb2RlICYmIGVwLT5pc19pbiAmJiBlcF9rZXlbZXAtPm51bV0pCi0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGRldi0+ZW5oYW5jZWRfbW9kZSAmJiBlcC0+aXNfaW4gJiYgZXBfa2V5W2VwLT5udW1dKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBwcmludF9lcnI7CisJCX0KIAl9CiAKIAkvKiBzYW5pdHkgY2hlY2sgZXAtZS9lcC1mIHNpbmNlIHRoZWlyIGZpZm9zIGFyZSBzbWFsbCAqLwogCW1heCA9IHVzYl9lbmRwb2ludF9tYXhwKGRlc2MpICYgMHgxZmZmOwotCWlmIChlcC0+bnVtID4gNCAmJiBtYXggPiA2NCAmJiAoZGV2LT5xdWlya3MgJiBQTFhfTEVHQUNZKSkKLQkJcmV0dXJuIC1FUkFOR0U7CisJaWYgKGVwLT5udW0gPiA0ICYmIG1heCA+IDY0ICYmIChkZXYtPnF1aXJrcyAmIFBMWF9MRUdBQ1kpKSB7CisJCXJldCA9IC1FUkFOR0U7CisJCWdvdG8gcHJpbnRfZXJyOworCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKIAlfZXAtPm1heHBhY2tldCA9IG1heCAmIDB4N2ZmOwpAQCAtMTkyLDcgKzIxMiw4IEBACiAJCSAgICAoZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0ggJiYgbWF4ICE9IDUxMikgfHwKIAkJICAgIChkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfRlVMTCAmJiBtYXggPiA2NCkpIHsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuIC1FUkFOR0U7CisJCQlyZXQgPSAtRVJBTkdFOworCQkJZ290byBwcmludF9lcnI7CiAJCX0KIAl9CiAJZXAtPmlzX2lzbyA9ICh0bXAgPT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQyk7CkBAIC0yNzEsNyArMjkyLDExIEBACiAKIAkvKiBwY2kgd3JpdGVzIG1heSBzdGlsbCBiZSBwb3N0ZWQgKi8KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OworCitwcmludF9lcnI6CisJZGV2X2VycigmZXAtPmRldi0+cGRldi0+ZGV2LCAiJXM6IGVycm9yPSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGhhbmRzaGFrZSh1MzIgX19pb21lbSAqcHRyLCB1MzIgbWFzaywgdTMyIGRvbmUsIGludCB1c2VjKQpAQCAtNDI2LDkgKzQ1MSwxMCBAQAogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbmV0MjI4MF9lcCwgZXApOwotCWlmICghX2VwIHx8ICFlcC0+ZGVzYyB8fCBfZXAtPm5hbWUgPT0gZXAwbmFtZSkKKwlpZiAoIV9lcCB8fCAhZXAtPmRlc2MgfHwgX2VwLT5uYW1lID09IGVwMG5hbWUpIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBlcD0lcCBvciBlcC0+ZGVzY1xuIiwgX19mdW5jX18sIF9lcCk7CiAJCXJldHVybiAtRUlOVkFMOwotCisJfQogCXNwaW5fbG9ja19pcnFzYXZlKCZlcC0+ZGV2LT5sb2NrLCBmbGFncyk7CiAJbnVrZShlcCk7CiAKQEAgLTQ1OCw4ICs0ODQsMTAgQEAKIAlzdHJ1Y3QgbmV0MjI4MF9lcAkqZXA7CiAJc3RydWN0IG5ldDIyODBfcmVxdWVzdAkqcmVxOwogCi0JaWYgKCFfZXApCisJaWYgKCFfZXApIHsKKwkJcHJfZXJyKCIlczogSW52YWxpZCBlcFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gTlVMTDsKKwl9CiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbmV0MjI4MF9lcCwgZXApOwogCiAJcmVxID0ga3phbGxvYyhzaXplb2YoKnJlcSksIGdmcF9mbGFncyk7CkBAIC00OTEsOCArNTE5LDExIEBACiAJc3RydWN0IG5ldDIyODBfcmVxdWVzdAkqcmVxOwogCiAJZXAgPSBjb250YWluZXJfb2YoX2VwLCBzdHJ1Y3QgbmV0MjI4MF9lcCwgZXApOwotCWlmICghX2VwIHx8ICFfcmVxKQorCWlmICghX2VwIHx8ICFfcmVxKSB7CisJCWRldl9lcnIoJmVwLT5kZXYtPnBkZXYtPmRldiwgIiVzOiBJbmF2bGlkIGVwPSVwIG9yIHJlcT0lcFxuIiwKKwkJCQkJCQlfX2Z1bmNfXywgX2VwLCBfcmVxKTsKIAkJcmV0dXJuOworCX0KIAogCXJlcSA9IGNvbnRhaW5lcl9vZihfcmVxLCBzdHJ1Y3QgbmV0MjI4MF9yZXF1ZXN0LCByZXEpOwogCVdBUk5fT04oIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKTsKQEAgLTg5NiwzNSArOTI3LDQ0IEBACiAJc3RydWN0IG5ldDIyODBfZXAJKmVwOwogCXN0cnVjdCBuZXQyMjgwCQkqZGV2OwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOworCWludCByZXQgPSAwOwogCiAJLyogd2UgYWx3YXlzIHJlcXVpcmUgYSBjcHUtdmlldyBidWZmZXIsIHNvIHRoYXQgd2UgY2FuCiAJICogYWx3YXlzIHVzZSBwaW8gKGFzIGZhbGxiYWNrIG9yIHdoYXRldmVyKS4KIAkgKi8KKwllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuZXQyMjgwX2VwLCBlcCk7CisJaWYgKCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+bnVtICE9IDApKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgZXA9JXAgb3IgZXAtPmRlc2NcbiIsIF9fZnVuY19fLCBfZXApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAJcmVxID0gY29udGFpbmVyX29mKF9yZXEsIHN0cnVjdCBuZXQyMjgwX3JlcXVlc3QsIHJlcSk7CiAJaWYgKCFfcmVxIHx8ICFfcmVxLT5jb21wbGV0ZSB8fCAhX3JlcS0+YnVmIHx8Ci0JCQkJIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoX3JlcS0+bGVuZ3RoID4gKH4wICYgRE1BX0JZVEVfQ09VTlRfTUFTSykpCi0JCXJldHVybiAtRURPTTsKLQllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuZXQyMjgwX2VwLCBlcCk7Ci0JaWYgKCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+bnVtICE9IDApKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkhbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSkpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBwcmludF9lcnI7CisJfQorCWlmIChfcmVxLT5sZW5ndGggPiAofjAgJiBETUFfQllURV9DT1VOVF9NQVNLKSkgeworCQlyZXQgPSAtRURPTTsKKwkJZ290byBwcmludF9lcnI7CisJfQogCWRldiA9IGVwLT5kZXY7Ci0JaWYgKCFkZXYtPmRyaXZlciB8fCBkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikKLQkJcmV0dXJuIC1FU0hVVERPV047CisJaWYgKCFkZXYtPmRyaXZlciB8fCBkZXYtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgeworCQlyZXQgPSAtRVNIVVRET1dOOworCQlnb3RvIHByaW50X2VycjsKKwl9CiAKIAkvKiBGSVhNRSBpbXBsZW1lbnQgUElPIGZhbGxiYWNrIGZvciBaTFBzIHdpdGggRE1BICovCi0JaWYgKGVwLT5kbWEgJiYgX3JlcS0+bGVuZ3RoID09IDApCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoZXAtPmRtYSAmJiBfcmVxLT5sZW5ndGggPT0gMCkgeworCQlyZXQgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBwcmludF9lcnI7CisJfQogCiAJLyogc2V0IHVwIGRtYSBtYXBwaW5nIGluIGNhc2UgdGhlIGNhbGxlciBkaWRuJ3QgKi8KIAlpZiAoZXAtPmRtYSkgewotCQlpbnQgcmV0OwotCiAJCXJldCA9IHVzYl9nYWRnZXRfbWFwX3JlcXVlc3QoJmRldi0+Z2FkZ2V0LCBfcmVxLAogCQkJCWVwLT5pc19pbik7CiAJCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBwcmludF9lcnI7CiAJfQogCiAJZXBfdmRiZyhkZXYsICIlcyBxdWV1ZSByZXEgJXAsIGxlbiAlZCBidWYgJXBcbiIsCkBAIC0xMDEzLDcgKzEwNTMsMTEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmxvY2ssIGZsYWdzKTsKIAogCS8qIHBjaSB3cml0ZXMgbWF5IHN0aWxsIGJlIHBvc3RlZCAqLwotCXJldHVybiAwOworCXJldHVybiByZXQ7CisKK3ByaW50X2VycjoKKwlkZXZfZXJyKCZlcC0+ZGV2LT5wZGV2LT5kZXYsICIlczogZXJyb3I9JWRcbiIsIF9fZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtMTEzNCw4ICsxMTc4LDExIEBACiAJaW50CQkJc3RvcHBlZDsKIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IG5ldDIyODBfZXAsIGVwKTsKLQlpZiAoIV9lcCB8fCAoIWVwLT5kZXNjICYmIGVwLT5udW0gIT0gMCkgfHwgIV9yZXEpCisJaWYgKCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+bnVtICE9IDApIHx8ICFfcmVxKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgZXA9JXAgb3IgZXAtPmRlc2Mgb3IgcmVxPSVwXG4iLAorCQkJCQkJX19mdW5jX18sIF9lcCwgX3JlcSk7CiAJCXJldHVybiAtRUlOVkFMOworCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZlcC0+ZGV2LT5sb2NrLCBmbGFncyk7CiAJc3RvcHBlZCA9IGVwLT5zdG9wcGVkOwpAQCAtMTE1Nyw2ICsxMjA0LDggQEAKIAl9CiAJaWYgKCZyZXEtPnJlcSAhPSBfcmVxKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwLT5kZXYtPmxvY2ssIGZsYWdzKTsKKwkJZGV2X2VycigmZXAtPmRldi0+cGRldi0+ZGV2LCAiJXM6IFJlcXVlc3QgbWlzbWF0Y2hcbiIsCisJCQkJCQkJCV9fZnVuY19fKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMjE0LDIwICsxMjYzLDI4IEBACiAJaW50CQkJcmV0dmFsID0gMDsKIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IG5ldDIyODBfZXAsIGVwKTsKLQlpZiAoIV9lcCB8fCAoIWVwLT5kZXNjICYmIGVwLT5udW0gIT0gMCkpCisJaWYgKCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+bnVtICE9IDApKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgZXA9JXAgb3IgZXAtPmRlc2NcbiIsIF9fZnVuY19fLCBfZXApOwogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIWVwLT5kZXYtPmRyaXZlciB8fCBlcC0+ZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pCi0JCXJldHVybiAtRVNIVVRET1dOOworCX0KKwlpZiAoIWVwLT5kZXYtPmRyaXZlciB8fCBlcC0+ZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKKwkJcmV0dmFsID0gLUVTSFVURE9XTjsKKwkJZ290byBwcmludF9lcnI7CisJfQogCWlmIChlcC0+ZGVzYyAvKiBub3QgZXAwICovICYmIChlcC0+ZGVzYy0+Ym1BdHRyaWJ1dGVzICYgMHgwMykKLQkJCQkJCT09IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0MpCi0JCXJldHVybiAtRUlOVkFMOworCQkJCQkJPT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIHByaW50X2VycjsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZXAtPmRldi0+bG9jaywgZmxhZ3MpOwotCWlmICghbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkKKwlpZiAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsKIAkJcmV0dmFsID0gLUVBR0FJTjsKLQllbHNlIGlmIChlcC0+aXNfaW4gJiYgdmFsdWUgJiYgbmV0MjI4MF9maWZvX3N0YXR1cyhfZXApICE9IDApCisJCWdvdG8gcHJpbnRfdW5sb2NrOworCX0gZWxzZSBpZiAoZXAtPmlzX2luICYmIHZhbHVlICYmIG5ldDIyODBfZmlmb19zdGF0dXMoX2VwKSAhPSAwKSB7CiAJCXJldHZhbCA9IC1FQUdBSU47Ci0JZWxzZSB7CisJCWdvdG8gcHJpbnRfdW5sb2NrOworCX0gZWxzZSB7CiAJCWVwX3ZkYmcoZXAtPmRldiwgIiVzICVzICVzXG4iLCBfZXAtPm5hbWUsCiAJCQkJdmFsdWUgPyAic2V0IiA6ICJjbGVhciIsCiAJCQkJd2VkZ2VkID8gIndlZGdlIiA6ICJoYWx0Iik7CkBAIC0xMjUxLDYgKzEzMDgsMTIgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlcC0+ZGV2LT5sb2NrLCBmbGFncyk7CiAKIAlyZXR1cm4gcmV0dmFsOworCitwcmludF91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXAtPmRldi0+bG9jaywgZmxhZ3MpOworcHJpbnRfZXJyOgorCWRldl9lcnIoJmVwLT5kZXYtPnBkZXYtPmRldiwgIiVzOiBlcnJvcj0lZFxuIiwgX19mdW5jX18sIHJldHZhbCk7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIGludCBuZXQyMjgwX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKl9lcCwgaW50IHZhbHVlKQpAQCAtMTI2MCw4ICsxMzIzLDEwIEBACiAKIHN0YXRpYyBpbnQgbmV0MjI4MF9zZXRfd2VkZ2Uoc3RydWN0IHVzYl9lcCAqX2VwKQogewotCWlmICghX2VwIHx8IF9lcC0+bmFtZSA9PSBlcDBuYW1lKQorCWlmICghX2VwIHx8IF9lcC0+bmFtZSA9PSBlcDBuYW1lKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgZXA9JXAgb3IgZXAwXG4iLCBfX2Z1bmNfXywgX2VwKTsKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCXJldHVybiBuZXQyMjgwX3NldF9oYWx0X2FuZF93ZWRnZShfZXAsIDEsIDEpOwogfQogCkBAIC0xMjcxLDE0ICsxMzM2LDIyIEBACiAJdTMyCQkJYXZhaWw7CiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBuZXQyMjgwX2VwLCBlcCk7Ci0JaWYgKCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+bnVtICE9IDApKQorCWlmICghX2VwIHx8ICghZXAtPmRlc2MgJiYgZXAtPm51bSAhPSAwKSkgeworCQlwcl9lcnIoIiVzOiBJbnZhbGlkIGVwPSVwIG9yIGVwLT5kZXNjXG4iLCBfX2Z1bmNfXywgX2VwKTsKIAkJcmV0dXJuIC1FTk9ERVY7Ci0JaWYgKCFlcC0+ZGV2LT5kcml2ZXIgfHwgZXAtPmRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQorCX0KKwlpZiAoIWVwLT5kZXYtPmRyaXZlciB8fCBlcC0+ZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKKwkJZGV2X2VycigmZXAtPmRldi0+cGRldi0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIGRyaXZlcj0lcCBvciBzcGVlZD0lZFxuIiwKKwkJCV9fZnVuY19fLCBlcC0+ZGV2LT5kcml2ZXIsIGVwLT5kZXYtPmdhZGdldC5zcGVlZCk7CiAJCXJldHVybiAtRVNIVVRET1dOOworCX0KIAogCWF2YWlsID0gcmVhZGwoJmVwLT5yZWdzLT5lcF9hdmFpbCkgJiAoQklUKDEyKSAtIDEpOwotCWlmIChhdmFpbCA+IGVwLT5maWZvX3NpemUpCisJaWYgKGF2YWlsID4gZXAtPmZpZm9fc2l6ZSkgeworCQlkZXZfZXJyKCZlcC0+ZGV2LT5wZGV2LT5kZXYsICIlczogRmlmbyBvdmVyZmxvd1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVPVkVSRkxPVzsKKwl9CiAJaWYgKGVwLT5pc19pbikKIAkJYXZhaWwgPSBlcC0+Zmlmb19zaXplIC0gYXZhaWw7CiAJcmV0dXJuIGF2YWlsOwpAQCAtMTI4OSwxMCArMTM2MiwxNiBAQAogCXN0cnVjdCBuZXQyMjgwX2VwCSplcDsKIAogCWVwID0gY29udGFpbmVyX29mKF9lcCwgc3RydWN0IG5ldDIyODBfZXAsIGVwKTsKLQlpZiAoIV9lcCB8fCAoIWVwLT5kZXNjICYmIGVwLT5udW0gIT0gMCkpCisJaWYgKCFfZXAgfHwgKCFlcC0+ZGVzYyAmJiBlcC0+bnVtICE9IDApKSB7CisJCXByX2VycigiJXM6IEludmFsaWQgZXA9JXAgb3IgZXAtPmRlc2NcbiIsIF9fZnVuY19fLCBfZXApOwogCQlyZXR1cm47Ci0JaWYgKCFlcC0+ZGV2LT5kcml2ZXIgfHwgZXAtPmRldi0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQorCX0KKwlpZiAoIWVwLT5kZXYtPmRyaXZlciB8fCBlcC0+ZGV2LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKKwkJZGV2X2VycigmZXAtPmRldi0+cGRldi0+ZGV2LAorCQkJIiVzOiBJbnZhbGlkIGRyaXZlcj0lcCBvciBzcGVlZD0lZFxuIiwKKwkJCV9fZnVuY19fLCBlcC0+ZGV2LT5kcml2ZXIsIGVwLT5kZXYtPmdhZGdldC5zcGVlZCk7CiAJCXJldHVybjsKKwl9CiAKIAl3cml0ZWwoQklUKEZJRk9fRkxVU0gpLCAmZXAtPnJlZ3MtPmVwX3N0YXQpOwogCSh2b2lkKSByZWFkbCgmZXAtPnJlZ3MtPmVwX3JzcCk7CkBAIC0xOTc3LDcgKzIwNTYsNyBAQAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm5fZXA7IGkrKykgewogCQlzdHJ1Y3QgbmV0MjI4MF9lcCAqZXAgPSAmZGV2LT5lcFtpXTsKIAotCQllcC0+ZXAubmFtZSA9IGVwX25hbWVbaV07CisJCWVwLT5lcC5uYW1lID0gZGV2LT5lbmhhbmNlZF9tb2RlID8gZXBfbmFtZV9hZHZbaV0gOiBlcF9uYW1lW2ldOwogCQllcC0+ZGV2ID0gZGV2OwogCQllcC0+bnVtID0gaTsKIApAQCAtMTk4OSwxMSArMjA2OCw5IEBACiAJCQllcC0+cmVncyA9IChzdHJ1Y3QgbmV0MjI4MF9lcF9yZWdzIF9faW9tZW0gKikKIAkJCQkoKCh2b2lkIF9faW9tZW0gKikmZGV2LT5lcHJlZ3NbbmVbaV1dKSArCiAJCQkJZXBfcmVnX2FkZHJbaV0pOwotCQkJZXAtPmZpZm9yZWdzID0gJmRldi0+Zmlmb3JlZ3NbaV07CiAJCX0gZWxzZSB7CiAJCQllcC0+Y2ZnID0gJmRldi0+ZXByZWdzW2ldOwogCQkJZXAtPnJlZ3MgPSAmZGV2LT5lcHJlZ3NbaV07Ci0JCQllcC0+Zmlmb3JlZ3MgPSAmZGV2LT5maWZvcmVnc1tpXTsKIAkJfQogCiAJCWVwLT5maWZvX3NpemUgPSAoaSAhPSAwKSA/IDIwNDggOiA1MTI7CkBAIC0yMTg2LDcgKzIyNjMsNiBAQAogCQlkZXYtPmVwW2ldLmlycXMgPSAwOwogCiAJLyogaG9vayB1cCB0aGUgZHJpdmVyIC4uLiAqLwotCWRldi0+c29mdGNvbm5lY3QgPSAxOwogCWRyaXZlci0+ZHJpdmVyLmJ1cyA9IE5VTEw7CiAJZGV2LT5kcml2ZXIgPSBkcml2ZXI7CiAKQEAgLTMwNTIsNiArMzEyOCw4IEBACiAJCUJJVChQQ0lfUkVUUllfQUJPUlRfSU5URVJSVVBUKSkKIAogc3RhdGljIHZvaWQgaGFuZGxlX3N0YXQxX2lycXMoc3RydWN0IG5ldDIyODAgKmRldiwgdTMyIHN0YXQpCitfX3JlbGVhc2VzKGRldi0+bG9jaykKK19fYWNxdWlyZXMoZGV2LT5sb2NrKQogewogCXN0cnVjdCBuZXQyMjgwX2VwCSplcDsKIAl1MzIJCQl0bXAsIG51bSwgbWFzaywgc2NyYXRjaDsKQEAgLTMzNzMsOCArMzQ1MSw2IEBACiAJCXUzMiB1c2JzdGF0OwogCQlkZXYtPnVzYl9leHQgPSAoc3RydWN0IHVzYjMzOHhfdXNiX2V4dF9yZWdzIF9faW9tZW0gKikKIAkJCQkJCQkoYmFzZSArIDB4MDBiNCk7Ci0JCWRldi0+Zmlmb3JlZ3MgPSAoc3RydWN0IHVzYjMzOHhfZmlmb19yZWdzIF9faW9tZW0gKikKLQkJCQkJCQkoYmFzZSArIDB4MDUwMCk7CiAJCWRldi0+bGxyZWdzID0gKHN0cnVjdCB1c2IzMzh4X2xsX3JlZ3MgX19pb21lbSAqKQogCQkJCQkJCShiYXNlICsgMHgwNzAwKTsKIAkJZGV2LT5sbF9sZnBzX3JlZ3MgPSAoc3RydWN0IHVzYjMzOHhfbGxfbGZwc19yZWdzIF9faW9tZW0gKikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvbmV0MjI4MC5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9uZXQyMjgwLmgKaW5kZXggYWM4ZDVhMi4uNGRmZjYwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9uZXQyMjgwLmgKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9uZXQyMjgwLmgKQEAgLTk2LDcgKzk2LDYgQEAKIAlzdHJ1Y3QgbmV0MjI4MF9lcF9yZWdzCQkJX19pb21lbSAqcmVnczsKIAlzdHJ1Y3QgbmV0MjI4MF9kbWFfcmVncwkJCV9faW9tZW0gKmRtYTsKIAlzdHJ1Y3QgbmV0MjI4MF9kbWEJCQkqZHVtbXk7Ci0Jc3RydWN0IHVzYjMzOHhfZmlmb19yZWdzIF9faW9tZW0gKmZpZm9yZWdzOwogCWRtYV9hZGRyX3QJCQkJdGRfZG1hOwkvKiBvZiBkdW1teSAqLwogCXN0cnVjdCBuZXQyMjgwCQkJCSpkZXY7CiAJdW5zaWduZWQgbG9uZwkJCQlpcnFzOwpAQCAtMTgxLDcgKzE4MCw2IEBACiAJc3RydWN0IG5ldDIyODBfZG1hX3JlZ3MJCV9faW9tZW0gKmRtYTsKIAlzdHJ1Y3QgbmV0MjI4MF9kZXBfcmVncwkJX19pb21lbSAqZGVwOwogCXN0cnVjdCBuZXQyMjgwX2VwX3JlZ3MJCV9faW9tZW0gKmVwcmVnczsKLQlzdHJ1Y3QgdXNiMzM4eF9maWZvX3JlZ3MJX19pb21lbSAqZmlmb3JlZ3M7CiAJc3RydWN0IHVzYjMzOHhfbGxfcmVncwkJX19pb21lbSAqbGxyZWdzOwogCXN0cnVjdCB1c2IzMzh4X2xsX2xmcHNfcmVncwlfX2lvbWVtICpsbF9sZnBzX3JlZ3M7CiAJc3RydWN0IHVzYjMzOHhfbGxfdHNuX3JlZ3MJX19pb21lbSAqbGxfdHNuX3JlZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3B4YTI3eF91ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvcHhhMjd4X3VkYy5jCmluZGV4IDZhODU1ZmMuLmI1MTIyNmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvcHhhMjd4X3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvcHhhMjd4X3VkYy5jCkBAIC05Myw1MCArOTMsNDYgQEAKIHN0YXRpYyBpbnQgc3RhdGVfZGJnX3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQogewogCXN0cnVjdCBweGFfdWRjICp1ZGMgPSBzLT5wcml2YXRlOwotCWludCBwb3MgPSAwLCByZXQ7CiAJdTMyIHRtcDsKIAotCXJldCA9IC1FTk9ERVY7CiAJaWYgKCF1ZGMtPmRyaXZlcikKLQkJZ290byBvdXQ7CisJCXJldHVybiAtRU5PREVWOwogCiAJLyogYmFzaWMgZGV2aWNlIHN0YXR1cyAqLwotCXBvcyArPSBzZXFfcHJpbnRmKHMsIERSSVZFUl9ERVNDICJcbiIKLQkJCSAiJXMgdmVyc2lvbjogJXNcbkdhZGdldCBkcml2ZXI6ICVzXG4iLAotCQkJIGRyaXZlcl9uYW1lLCBEUklWRVJfVkVSU0lPTiwKLQkJCSB1ZGMtPmRyaXZlciA/IHVkYy0+ZHJpdmVyLT5kcml2ZXIubmFtZSA6ICIobm9uZSkiKTsKKwlzZXFfcHJpbnRmKHMsIERSSVZFUl9ERVNDICJcbiIKKwkJICAgIiVzIHZlcnNpb246ICVzXG4iCisJCSAgICJHYWRnZXQgZHJpdmVyOiAlc1xuIiwKKwkJICAgZHJpdmVyX25hbWUsIERSSVZFUl9WRVJTSU9OLAorCQkgICB1ZGMtPmRyaXZlciA/IHVkYy0+ZHJpdmVyLT5kcml2ZXIubmFtZSA6ICIobm9uZSkiKTsKIAogCXRtcCA9IHVkY19yZWFkbCh1ZGMsIFVEQ0NSKTsKLQlwb3MgKz0gc2VxX3ByaW50ZihzLAotCQkJICJ1ZGNjcj0weCUweCglcyVzJXMlcyVzJXMlcyVzJXMlcyksICIKLQkJCSAiY29uPSVkLGludGVyPSVkLGFsdGludGVyPSVkXG4iLCB0bXAsCi0JCQkgKHRtcCAmIFVEQ0NSX09FTikgPyAiIG9lbiI6IiIsCi0JCQkgKHRtcCAmIFVEQ0NSX0FBTFRITlApID8gIiBhYWx0aG5wIjoiIiwKLQkJCSAodG1wICYgVURDQ1JfQUhOUCkgPyAiIHJlbSIgOiAiIiwKLQkJCSAodG1wICYgVURDQ1JfQkhOUCkgPyAiIHJzdGlyIiA6ICIiLAotCQkJICh0bXAgJiBVRENDUl9EV1JFKSA/ICIgZHdyZSIgOiAiIiwKLQkJCSAodG1wICYgVURDQ1JfU01BQykgPyAiIHNtYWMiIDogIiIsCi0JCQkgKHRtcCAmIFVEQ0NSX0VNQ0UpID8gIiBlbWNlIiA6ICIiLAotCQkJICh0bXAgJiBVRENDUl9VRFIpID8gIiB1ZHIiIDogIiIsCi0JCQkgKHRtcCAmIFVEQ0NSX1VEQSkgPyAiIHVkYSIgOiAiIiwKLQkJCSAodG1wICYgVURDQ1JfVURFKSA/ICIgdWRlIiA6ICIiLAotCQkJICh0bXAgJiBVRENDUl9BQ04pID4+IFVEQ0NSX0FDTl9TLAotCQkJICh0bXAgJiBVRENDUl9BSU4pID4+IFVEQ0NSX0FJTl9TLAotCQkJICh0bXAgJiBVRENDUl9BQUlTTikgPj4gVURDQ1JfQUFJU05fUyk7CisJc2VxX3ByaW50ZihzLAorCQkgICAidWRjY3I9MHglMHgoJXMlcyVzJXMlcyVzJXMlcyVzJXMpLCBjb249JWQsaW50ZXI9JWQsYWx0aW50ZXI9JWRcbiIsCisJCSAgIHRtcCwKKwkJICAgKHRtcCAmIFVEQ0NSX09FTikgPyAiIG9lbiI6IiIsCisJCSAgICh0bXAgJiBVRENDUl9BQUxUSE5QKSA/ICIgYWFsdGhucCI6IiIsCisJCSAgICh0bXAgJiBVRENDUl9BSE5QKSA/ICIgcmVtIiA6ICIiLAorCQkgICAodG1wICYgVURDQ1JfQkhOUCkgPyAiIHJzdGlyIiA6ICIiLAorCQkgICAodG1wICYgVURDQ1JfRFdSRSkgPyAiIGR3cmUiIDogIiIsCisJCSAgICh0bXAgJiBVRENDUl9TTUFDKSA/ICIgc21hYyIgOiAiIiwKKwkJICAgKHRtcCAmIFVEQ0NSX0VNQ0UpID8gIiBlbWNlIiA6ICIiLAorCQkgICAodG1wICYgVURDQ1JfVURSKSA/ICIgdWRyIiA6ICIiLAorCQkgICAodG1wICYgVURDQ1JfVURBKSA/ICIgdWRhIiA6ICIiLAorCQkgICAodG1wICYgVURDQ1JfVURFKSA/ICIgdWRlIiA6ICIiLAorCQkgICAodG1wICYgVURDQ1JfQUNOKSA+PiBVRENDUl9BQ05fUywKKwkJICAgKHRtcCAmIFVEQ0NSX0FJTikgPj4gVURDQ1JfQUlOX1MsCisJCSAgICh0bXAgJiBVRENDUl9BQUlTTikgPj4gVURDQ1JfQUFJU05fUyk7CiAJLyogcmVnaXN0ZXJzIGZvciBkZXZpY2UgYW5kIGVwMCAqLwotCXBvcyArPSBzZXFfcHJpbnRmKHMsICJ1ZGNpY3IwPTB4JTA4eCB1ZGNpY3IxPTB4JTA4eFxuIiwKLQkJCXVkY19yZWFkbCh1ZGMsIFVEQ0lDUjApLCB1ZGNfcmVhZGwodWRjLCBVRENJQ1IxKSk7Ci0JcG9zICs9IHNlcV9wcmludGYocywgInVkY2lzcjA9MHglMDh4IHVkY2lzcjE9MHglMDh4XG4iLAotCQkJdWRjX3JlYWRsKHVkYywgVURDSVNSMCksIHVkY19yZWFkbCh1ZGMsIFVEQ0lTUjEpKTsKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAidWRjZm5yPSVkXG4iLCB1ZGNfcmVhZGwodWRjLCBVRENGTlIpKTsKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiaXJxczogcmVzZXQ9JWx1LCBzdXNwZW5kPSVsdSwgcmVzdW1lPSVsdSwgIgotCQkJInJlY29uZmlnPSVsdVxuIiwKLQkJCXVkYy0+c3RhdHMuaXJxc19yZXNldCwgdWRjLT5zdGF0cy5pcnFzX3N1c3BlbmQsCi0JCQl1ZGMtPnN0YXRzLmlycXNfcmVzdW1lLCB1ZGMtPnN0YXRzLmlycXNfcmVjb25maWcpOworCXNlcV9wcmludGYocywgInVkY2ljcjA9MHglMDh4IHVkY2ljcjE9MHglMDh4XG4iLAorCQkgICB1ZGNfcmVhZGwodWRjLCBVRENJQ1IwKSwgdWRjX3JlYWRsKHVkYywgVURDSUNSMSkpOworCXNlcV9wcmludGYocywgInVkY2lzcjA9MHglMDh4IHVkY2lzcjE9MHglMDh4XG4iLAorCQkgICB1ZGNfcmVhZGwodWRjLCBVRENJU1IwKSwgdWRjX3JlYWRsKHVkYywgVURDSVNSMSkpOworCXNlcV9wcmludGYocywgInVkY2Zucj0lZFxuIiwgdWRjX3JlYWRsKHVkYywgVURDRk5SKSk7CisJc2VxX3ByaW50ZihzLCAiaXJxczogcmVzZXQ9JWx1LCBzdXNwZW5kPSVsdSwgcmVzdW1lPSVsdSwgcmVjb25maWc9JWx1XG4iLAorCQkgICB1ZGMtPnN0YXRzLmlycXNfcmVzZXQsIHVkYy0+c3RhdHMuaXJxc19zdXNwZW5kLAorCQkgICB1ZGMtPnN0YXRzLmlycXNfcmVzdW1lLCB1ZGMtPnN0YXRzLmlycXNfcmVjb25maWcpOwogCi0JcmV0ID0gMDsKLW91dDoKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHF1ZXVlc19kYmdfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCkBAIC0xNDQsNzUgKzE0MCw2NyBAQAogCXN0cnVjdCBweGFfdWRjICp1ZGMgPSBzLT5wcml2YXRlOwogCXN0cnVjdCBweGFfZXAgKmVwOwogCXN0cnVjdCBweGEyN3hfcmVxdWVzdCAqcmVxOwotCWludCBwb3MgPSAwLCBpLCBtYXhwa3QsIHJldDsKKwlpbnQgaSwgbWF4cGt0OwogCi0JcmV0ID0gLUVOT0RFVjsKIAlpZiAoIXVkYy0+ZHJpdmVyKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBkdW1wIGVuZHBvaW50IHF1ZXVlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBOUl9QWEFfRU5EUE9JTlRTOyBpKyspIHsKIAkJZXAgPSAmdWRjLT5weGFfZXBbaV07CiAJCW1heHBrdCA9IGVwLT5maWZvX3NpemU7Ci0JCXBvcyArPSBzZXFfcHJpbnRmKHMsICAiJS0xMnMgbWF4X3BrdD0lZCAlc1xuIiwKLQkJCQlFUE5BTUUoZXApLCBtYXhwa3QsICJwaW8iKTsKKwkJc2VxX3ByaW50ZihzLCAgIiUtMTJzIG1heF9wa3Q9JWQgJXNcbiIsCisJCQkgICBFUE5BTUUoZXApLCBtYXhwa3QsICJwaW8iKTsKIAogCQlpZiAobGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgewotCQkJcG9zICs9IHNlcV9wcmludGYocywgIlx0KG5vdGhpbmcgcXVldWVkKVxuIik7CisJCQlzZXFfcHV0cyhzLCAiXHQobm90aGluZyBxdWV1ZWQpXG4iKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZlcC0+cXVldWUsIHF1ZXVlKSB7Ci0JCQlwb3MgKz0gc2VxX3ByaW50ZihzLCAgIlx0cmVxICVwIGxlbiAlZC8lZCBidWYgJXBcbiIsCi0JCQkJCSZyZXEtPnJlcSwgcmVxLT5yZXEuYWN0dWFsLAotCQkJCQlyZXEtPnJlcS5sZW5ndGgsIHJlcS0+cmVxLmJ1Zik7CisJCQlzZXFfcHJpbnRmKHMsICAiXHRyZXEgJXAgbGVuICVkLyVkIGJ1ZiAlcFxuIiwKKwkJCQkgICAmcmVxLT5yZXEsIHJlcS0+cmVxLmFjdHVhbCwKKwkJCQkgICByZXEtPnJlcS5sZW5ndGgsIHJlcS0+cmVxLmJ1Zik7CiAJCX0KIAl9CiAKLQlyZXQgPSAwOwotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZXBzX2RiZ19zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKIHsKIAlzdHJ1Y3QgcHhhX3VkYyAqdWRjID0gcy0+cHJpdmF0ZTsKIAlzdHJ1Y3QgcHhhX2VwICplcDsKLQlpbnQgcG9zID0gMCwgaSwgcmV0OworCWludCBpOwogCXUzMiB0bXA7CiAKLQlyZXQgPSAtRU5PREVWOwogCWlmICghdWRjLT5kcml2ZXIpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVOT0RFVjsKIAogCWVwID0gJnVkYy0+cHhhX2VwWzBdOwogCXRtcCA9IHVkY19lcF9yZWFkbChlcCwgVURDQ1NSKTsKLQlwb3MgKz0gc2VxX3ByaW50ZihzLCAidWRjY3NyMD0weCUwM3goJXMlcyVzJXMlcyVzJXMpXG4iLCB0bXAsCi0JCQkgKHRtcCAmIFVEQ0NTUjBfU0EpID8gIiBzYSIgOiAiIiwKLQkJCSAodG1wICYgVURDQ1NSMF9STkUpID8gIiBybmUiIDogIiIsCi0JCQkgKHRtcCAmIFVEQ0NTUjBfRlNUKSA/ICIgZnN0IiA6ICIiLAotCQkJICh0bXAgJiBVRENDU1IwX1NTVCkgPyAiIHNzdCIgOiAiIiwKLQkJCSAodG1wICYgVURDQ1NSMF9ETUUpID8gIiBkbWUiIDogIiIsCi0JCQkgKHRtcCAmIFVEQ0NTUjBfSVBSKSA/ICIgaXByIiA6ICIiLAotCQkJICh0bXAgJiBVRENDU1IwX09QQykgPyAiIG9wYyIgOiAiIik7CisJc2VxX3ByaW50ZihzLCAidWRjY3NyMD0weCUwM3goJXMlcyVzJXMlcyVzJXMpXG4iLAorCQkgICB0bXAsCisJCSAgICh0bXAgJiBVRENDU1IwX1NBKSA/ICIgc2EiIDogIiIsCisJCSAgICh0bXAgJiBVRENDU1IwX1JORSkgPyAiIHJuZSIgOiAiIiwKKwkJICAgKHRtcCAmIFVEQ0NTUjBfRlNUKSA/ICIgZnN0IiA6ICIiLAorCQkgICAodG1wICYgVURDQ1NSMF9TU1QpID8gIiBzc3QiIDogIiIsCisJCSAgICh0bXAgJiBVRENDU1IwX0RNRSkgPyAiIGRtZSIgOiAiIiwKKwkJICAgKHRtcCAmIFVEQ0NTUjBfSVBSKSA/ICIgaXByIiA6ICIiLAorCQkgICAodG1wICYgVURDQ1NSMF9PUEMpID8gIiBvcGMiIDogIiIpOwogCWZvciAoaSA9IDA7IGkgPCBOUl9QWEFfRU5EUE9JTlRTOyBpKyspIHsKIAkJZXAgPSAmdWRjLT5weGFfZXBbaV07CiAJCXRtcCA9IGk/IHVkY19lcF9yZWFkbChlcCwgVURDQ1IpIDogdWRjX3JlYWRsKHVkYywgVURDQ1IpOwotCQlwb3MgKz0gc2VxX3ByaW50ZihzLCAiJS0xMnM6ICIKLQkJCQkiSU4gJWx1KCVsdSByZXFzKSwgT1VUICVsdSglbHUgcmVxcyksICIKLQkJCQkiaXJxcz0lbHUsIHVkY2NyPTB4JTA4eCwgdWRjY3NyPTB4JTAzeCwgIgotCQkJCSJ1ZGNiY3I9JWRcbiIsCi0JCQkJRVBOQU1FKGVwKSwKLQkJCQllcC0+c3RhdHMuaW5fYnl0ZXMsIGVwLT5zdGF0cy5pbl9vcHMsCi0JCQkJZXAtPnN0YXRzLm91dF9ieXRlcywgZXAtPnN0YXRzLm91dF9vcHMsCi0JCQkJZXAtPnN0YXRzLmlycXMsCi0JCQkJdG1wLCB1ZGNfZXBfcmVhZGwoZXAsIFVEQ0NTUiksCi0JCQkJdWRjX2VwX3JlYWRsKGVwLCBVRENCQ1IpKTsKKwkJc2VxX3ByaW50ZihzLCAiJS0xMnM6IElOICVsdSglbHUgcmVxcyksIE9VVCAlbHUoJWx1IHJlcXMpLCBpcnFzPSVsdSwgdWRjY3I9MHglMDh4LCB1ZGNjc3I9MHglMDN4LCB1ZGNiY3I9JWRcbiIsCisJCQkgICBFUE5BTUUoZXApLAorCQkJICAgZXAtPnN0YXRzLmluX2J5dGVzLCBlcC0+c3RhdHMuaW5fb3BzLAorCQkJICAgZXAtPnN0YXRzLm91dF9ieXRlcywgZXAtPnN0YXRzLm91dF9vcHMsCisJCQkgICBlcC0+c3RhdHMuaXJxcywKKwkJCSAgIHRtcCwgdWRjX2VwX3JlYWRsKGVwLCBVRENDU1IpLAorCQkJICAgdWRjX2VwX3JlYWRsKGVwLCBVRENCQ1IpKTsKIAl9CiAKLQlyZXQgPSAwOwotb3V0OgotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZXBzX2RiZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQpAQCAtMjM5OSw3ICsyMzg3LDcgQEAKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19PRikKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHVkY19weGFfZHRfaWRzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB1ZGNfcHhhX2R0X2lkc1tdID0gewogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxweGEyNzAtdWRjIiB9LAogCXt9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy91ZGMtY29yZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy91ZGMtY29yZS5jCmluZGV4IDVhODFjYjAuLmQ2OWMzNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvdWRjLWNvcmUuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3VkYy1jb3JlLmMKQEAgLTM1LDYgKzM1LDggQEAKICAqIEBkZXYgLSB0aGUgY2hpbGQgZGV2aWNlIHRvIHRoZSBhY3R1YWwgY29udHJvbGxlcgogICogQGdhZGdldCAtIHRoZSBnYWRnZXQuIEZvciB1c2UgYnkgdGhlIGNsYXNzIGNvZGUKICAqIEBsaXN0IC0gZm9yIHVzZSBieSB0aGUgdWRjIGNsYXNzIGRyaXZlcgorICogQHZidXMgLSBmb3IgdWRjcyB3aG8gY2FyZSBhYm91dCB2YnVzIHN0YXR1cywgdGhpcyB2YWx1ZSBpcyByZWFsIHZidXMgc3RhdHVzOworICogZm9yIHVkY3Mgd2hvIGRvIG5vdCBjYXJlIGFib3V0IHZidXMgc3RhdHVzLCB0aGlzIHZhbHVlIGlzIGFsd2F5cyB0cnVlCiAgKgogICogVGhpcyByZXByZXNlbnRzIHRoZSBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSB3aGljaCBpcyB1c2VkIGJ5IHRoZSBVREMtY2xhc3MKICAqIHRvIGhvbGQgaW5mb3JtYXRpb24gYWJvdXQgdWRjIGRyaXZlciBhbmQgZ2FkZ2V0IHRvZ2V0aGVyLgpAQCAtNDQsNiArNDYsNyBAQAogCXN0cnVjdCB1c2JfZ2FkZ2V0CQkqZ2FkZ2V0OwogCXN0cnVjdCBkZXZpY2UJCQlkZXY7CiAJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKKwlib29sCQkJCXZidXM7CiB9OwogCiBzdGF0aWMgc3RydWN0IGNsYXNzICp1ZGNfY2xhc3M7CkBAIC0xMjgsMjEgKzEzMSwxMSBAQAogCiBzdGF0aWMgdm9pZCB1c2JfZ2FkZ2V0X3N0YXRlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCB1c2JfZ2FkZ2V0CSpnYWRnZXQgPSB3b3JrX3RvX2dhZGdldCh3b3JrKTsKLQlzdHJ1Y3QgdXNiX3VkYwkJKnVkYyA9IE5VTEw7CisJc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCA9IHdvcmtfdG9fZ2FkZ2V0KHdvcmspOworCXN0cnVjdCB1c2JfdWRjICp1ZGMgPSBnYWRnZXQtPnVkYzsKIAotCW11dGV4X2xvY2soJnVkY19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVkYywgJnVkY19saXN0LCBsaXN0KQotCQlpZiAodWRjLT5nYWRnZXQgPT0gZ2FkZ2V0KQotCQkJZ290byBmb3VuZDsKLQltdXRleF91bmxvY2soJnVkY19sb2NrKTsKLQotCXJldHVybjsKLQotZm91bmQ6Ci0JbXV0ZXhfdW5sb2NrKCZ1ZGNfbG9jayk7Ci0KLQlzeXNmc19ub3RpZnkoJnVkYy0+ZGV2LmtvYmosIE5VTEwsICJzdGF0ZSIpOworCWlmICh1ZGMpCisJCXN5c2ZzX25vdGlmeSgmdWRjLT5kZXYua29iaiwgTlVMTCwgInN0YXRlIik7CiB9CiAKIHZvaWQgdXNiX2dhZGdldF9zZXRfc3RhdGUoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwKQEAgLTE1NSw2ICsxNDgsMzQgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCitzdGF0aWMgdm9pZCB1c2JfdWRjX2Nvbm5lY3RfY29udHJvbChzdHJ1Y3QgdXNiX3VkYyAqdWRjKQoreworCWlmICh1ZGMtPnZidXMpCisJCXVzYl9nYWRnZXRfY29ubmVjdCh1ZGMtPmdhZGdldCk7CisJZWxzZQorCQl1c2JfZ2FkZ2V0X2Rpc2Nvbm5lY3QodWRjLT5nYWRnZXQpOworfQorCisvKioKKyAqIHVzYl91ZGNfdmJ1c19oYW5kbGVyIC0gdXBkYXRlcyB0aGUgdWRjIGNvcmUgdmJ1cyBzdGF0dXMsIGFuZCB0cnkgdG8KKyAqIGNvbm5lY3Qgb3IgZGlzY29ubmVjdCBnYWRnZXQKKyAqIEBnYWRnZXQ6IFRoZSBnYWRnZXQgd2hpY2ggdmJ1cyBjaGFuZ2Ugb2NjdXJzCisgKiBAc3RhdHVzOiBUaGUgdmJ1cyBzdGF0dXMKKyAqCisgKiBUaGUgdWRjIGRyaXZlciBjYWxscyBpdCB3aGVuIGl0IHdhbnRzIHRvIGNvbm5lY3Qgb3IgZGlzY29ubmVjdCBnYWRnZXQKKyAqIGFjY29yZGluZyB0byB2YnVzIHN0YXR1cy4KKyAqLwordm9pZCB1c2JfdWRjX3ZidXNfaGFuZGxlcihzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBib29sIHN0YXR1cykKK3sKKwlzdHJ1Y3QgdXNiX3VkYyAqdWRjID0gZ2FkZ2V0LT51ZGM7CisKKwlpZiAodWRjKSB7CisJCXVkYy0+dmJ1cyA9IHN0YXR1czsKKwkJdXNiX3VkY19jb25uZWN0X2NvbnRyb2wodWRjKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2JfdWRjX3ZidXNfaGFuZGxlcik7CisKIC8qKgogICogdXNiX2dhZGdldF91ZGNfcmVzZXQgLSBub3RpZmllcyB0aGUgdWRjIGNvcmUgdGhhdCBidXMgcmVzZXQgb2NjdXJzCiAgKiBAZ2FkZ2V0OiBUaGUgZ2FkZ2V0IHdoaWNoIGJ1cyByZXNldCBvY2N1cnMKQEAgLTI3OCw2ICsyOTksNyBAQAogCQlnb3RvIGVycjM7CiAKIAl1ZGMtPmdhZGdldCA9IGdhZGdldDsKKwlnYWRnZXQtPnVkYyA9IHVkYzsKIAogCW11dGV4X2xvY2soJnVkY19sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZ1ZGMtPmxpc3QsICZ1ZGNfbGlzdCk7CkBAIC0yODcsNiArMzA5LDcgQEAKIAkJZ290byBlcnI0OwogCiAJdXNiX2dhZGdldF9zZXRfc3RhdGUoZ2FkZ2V0LCBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpOworCXVkYy0+dmJ1cyA9IHRydWU7CiAKIAltdXRleF91bmxvY2soJnVkY19sb2NrKTsKIApAQCAtMzQ4LDIxICszNzEsMTQgQEAKICAqLwogdm9pZCB1c2JfZGVsX2dhZGdldF91ZGMoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKIHsKLQlzdHJ1Y3QgdXNiX3VkYwkJKnVkYyA9IE5VTEw7CisJc3RydWN0IHVzYl91ZGMgKnVkYyA9IGdhZGdldC0+dWRjOwogCi0JbXV0ZXhfbG9jaygmdWRjX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkodWRjLCAmdWRjX2xpc3QsIGxpc3QpCi0JCWlmICh1ZGMtPmdhZGdldCA9PSBnYWRnZXQpCi0JCQlnb3RvIGZvdW5kOworCWlmICghdWRjKQorCQlyZXR1cm47CiAKLQlkZXZfZXJyKGdhZGdldC0+ZGV2LnBhcmVudCwgImdhZGdldCBub3QgcmVnaXN0ZXJlZC5cbiIpOwotCW11dGV4X3VubG9jaygmdWRjX2xvY2spOwotCi0JcmV0dXJuOwotCi1mb3VuZDoKIAlkZXZfdmRiZyhnYWRnZXQtPmRldi5wYXJlbnQsICJ1bnJlZ2lzdGVyaW5nIGdhZGdldFxuIik7CiAKKwltdXRleF9sb2NrKCZ1ZGNfbG9jayk7CiAJbGlzdF9kZWwoJnVkYy0+bGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZ1ZGNfbG9jayk7CiAKQEAgLTM5Nyw3ICs0MTMsNyBAQAogCQlkcml2ZXItPnVuYmluZCh1ZGMtPmdhZGdldCk7CiAJCWdvdG8gZXJyMTsKIAl9Ci0JdXNiX2dhZGdldF9jb25uZWN0KHVkYy0+Z2FkZ2V0KTsKKwl1c2JfdWRjX2Nvbm5lY3RfY29udHJvbCh1ZGMpOwogCiAJa29iamVjdF91ZXZlbnQoJnVkYy0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2hvc3QvS2NvbmZpZwppbmRleCA1YWQ2MGU0Li4xOTdhNmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvaG9zdC9LY29uZmlnCkBAIC0xOTgsNyArMTk4LDcgQEAKIAogY29uZmlnIFVTQl9FSENJX01TTQogCXRyaXN0YXRlICJTdXBwb3J0IGZvciBRdWFsY29tbSBRU0QvTVNNIG9uLWNoaXAgRUhDSSBVU0IgY29udHJvbGxlciIKLQlkZXBlbmRzIG9uIEFSQ0hfTVNNIHx8IEFSQ0hfUUNPTQorCWRlcGVuZHMgb24gQVJDSF9RQ09NCiAJc2VsZWN0IFVTQl9FSENJX1JPT1RfSFVCX1RUCiAJLS0taGVscC0tLQogCSAgRW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgVVNCIEhvc3QgY29udHJvbGxlciBwcmVzZW50IG9uIHRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWF0bWVsLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXRtZWwuYwppbmRleCA2NjNmNzkwLi5iZTA5NjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXRtZWwuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktYXRtZWwuYwpAQCAtMzQsNyArMzQsNiBAQAogCiBzdHJ1Y3QgYXRtZWxfZWhjaV9wcml2IHsKIAlzdHJ1Y3QgY2xrICppY2xrOwotCXN0cnVjdCBjbGsgKmZjbGs7CiAJc3RydWN0IGNsayAqdWNsazsKIAlib29sIGNsb2NrZWQ7CiB9OwpAQCAtNTEsMTIgKzUwLDkgQEAKIHsKIAlpZiAoYXRtZWxfZWhjaS0+Y2xvY2tlZCkKIAkJcmV0dXJuOwotCWlmIChJU19FTkFCTEVEKENPTkZJR19DT01NT05fQ0xLKSkgewotCQljbGtfc2V0X3JhdGUoYXRtZWxfZWhjaS0+dWNsaywgNDgwMDAwMDApOwotCQljbGtfcHJlcGFyZV9lbmFibGUoYXRtZWxfZWhjaS0+dWNsayk7Ci0JfQorCisJY2xrX3ByZXBhcmVfZW5hYmxlKGF0bWVsX2VoY2ktPnVjbGspOwogCWNsa19wcmVwYXJlX2VuYWJsZShhdG1lbF9laGNpLT5pY2xrKTsKLQljbGtfcHJlcGFyZV9lbmFibGUoYXRtZWxfZWhjaS0+ZmNsayk7CiAJYXRtZWxfZWhjaS0+Y2xvY2tlZCA9IHRydWU7CiB9CiAKQEAgLTY0LDEwICs2MCw5IEBACiB7CiAJaWYgKCFhdG1lbF9laGNpLT5jbG9ja2VkKQogCQlyZXR1cm47Ci0JY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGF0bWVsX2VoY2ktPmZjbGspOworCiAJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGF0bWVsX2VoY2ktPmljbGspOwotCWlmIChJU19FTkFCTEVEKENPTkZJR19DT01NT05fQ0xLKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGF0bWVsX2VoY2ktPnVjbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShhdG1lbF9laGNpLT51Y2xrKTsKIAlhdG1lbF9laGNpLT5jbG9ja2VkID0gZmFsc2U7CiB9CiAKQEAgLTE0NiwyMCArMTQxLDEzIEBACiAJCXJldHZhbCA9IC1FTk9FTlQ7CiAJCWdvdG8gZmFpbF9yZXF1ZXN0X3Jlc291cmNlOwogCX0KLQlhdG1lbF9laGNpLT5mY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJ1aHBjayIpOwotCWlmIChJU19FUlIoYXRtZWxfZWhjaS0+ZmNsaykpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgZ2V0dGluZyBmdW5jdGlvbiBjbG9ja1xuIik7Ci0JCXJldHZhbCA9IC1FTk9FTlQ7CisKKwlhdG1lbF9laGNpLT51Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJ1c2JfY2xrIik7CisJaWYgKElTX0VSUihhdG1lbF9laGNpLT51Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHVjbGtcbiIpOworCQlyZXR2YWwgPSBQVFJfRVJSKGF0bWVsX2VoY2ktPnVjbGspOwogCQlnb3RvIGZhaWxfcmVxdWVzdF9yZXNvdXJjZTsKIAl9Ci0JaWYgKElTX0VOQUJMRUQoQ09ORklHX0NPTU1PTl9DTEspKSB7Ci0JCWF0bWVsX2VoY2ktPnVjbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgInVzYl9jbGsiKTsKLQkJaWYgKElTX0VSUihhdG1lbF9laGNpLT51Y2xrKSkgewotCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCB1Y2xrXG4iKTsKLQkJCXJldHZhbCA9IFBUUl9FUlIoYXRtZWxfZWhjaS0+dWNsayk7Ci0JCQlnb3RvIGZhaWxfcmVxdWVzdF9yZXNvdXJjZTsKLQkJfQotCX0KIAogCWVoY2kgPSBoY2RfdG9fZWhjaShoY2QpOwogCS8qIHJlZ2lzdGVycyBzdGFydCBhdCBvZmZzZXQgMHgwICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaGNkLmMKaW5kZXggODVlNTZkMS4uZjRkODhkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1oY2QuYwpAQCAtNzkyLDEyICs3OTIsMTIgQEAKIAkJCQkJZWhjaS0+cmVzZXRfZG9uZVtpXSA9PSAwKSkKIAkJCQljb250aW51ZTsKIAotCQkJLyogc3RhcnQgMjAgbXNlYyByZXN1bWUgc2lnbmFsaW5nIGZyb20gdGhpcyBwb3J0LAotCQkJICogYW5kIG1ha2UgaHViX3dxIGNvbGxlY3QgUE9SVF9TVEFUX0NfU1VTUEVORCB0bwotCQkJICogc3RvcCB0aGF0IHNpZ25hbGluZy4gIFVzZSA1IG1zIGV4dHJhIGZvciBzYWZldHksCi0JCQkgKiBsaWtlIHVzYl9wb3J0X3Jlc3VtZSgpIGRvZXMuCisJCQkvKiBzdGFydCBVU0JfUkVTVU1FX1RJTUVPVVQgbXNlYyByZXN1bWUgc2lnbmFsaW5nIGZyb20KKwkJCSAqIHRoaXMgcG9ydCwgYW5kIG1ha2UgaHViX3dxIGNvbGxlY3QKKwkJCSAqIFBPUlRfU1RBVF9DX1NVU1BFTkQgdG8gc3RvcCB0aGF0IHNpZ25hbGluZy4KIAkJCSAqLwotCQkJZWhjaS0+cmVzZXRfZG9uZVtpXSA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDI1KTsKKwkJCWVoY2ktPnJlc2V0X2RvbmVbaV0gPSBqaWZmaWVzICsKKwkJCQltc2Vjc190b19qaWZmaWVzKFVTQl9SRVNVTUVfVElNRU9VVCk7CiAJCQlzZXRfYml0KGksICZlaGNpLT5yZXN1bWluZ19wb3J0cyk7CiAJCQllaGNpX2RiZyAoZWhjaSwgInBvcnQgJWQgcmVtb3RlIHdha2V1cFxuIiwgaSArIDEpOwogCQkJdXNiX2hjZF9zdGFydF9wb3J0X3Jlc3VtZSgmaGNkLT5zZWxmLCBpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1odWIuYwppbmRleCA4N2NmODZmLi42OTIwODQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLWh1Yi5jCkBAIC00NzEsMTAgKzQ3MSwxMyBAQAogCQllaGNpX3dyaXRlbChlaGNpLCB0ZW1wLCAmZWhjaS0+cmVncy0+cG9ydF9zdGF0dXMgW2ldKTsKIAl9CiAKLQkvKiBtc2xlZXAgZm9yIDIwbXMgb25seSBpZiBjb2RlIGlzIHRyeWluZyB0byByZXN1bWUgcG9ydCAqLworCS8qCisJICogbXNsZWVwIGZvciBVU0JfUkVTVU1FX1RJTUVPVVQgbXMgb25seSBpZiBjb2RlIGlzIHRyeWluZyB0byByZXN1bWUKKwkgKiBwb3J0CisJICovCiAJaWYgKHJlc3VtZV9uZWVkZWQpIHsKIAkJc3Bpbl91bmxvY2tfaXJxKCZlaGNpLT5sb2NrKTsKLQkJbXNsZWVwKDIwKTsKKwkJbXNsZWVwKFVTQl9SRVNVTUVfVElNRU9VVCk7CiAJCXNwaW5fbG9ja19pcnEoJmVoY2ktPmxvY2spOwogCQlpZiAoZWhjaS0+c2h1dGRvd24pCiAJCQlnb3RvIHNodXRkb3duOwpAQCAtNjg4LDcgKzY5MSw3IEBACiAJaW50CQlwb3J0cyA9IEhDU19OX1BPUlRTIChlaGNpLT5oY3NfcGFyYW1zKTsKIAl1MTYJCXRlbXA7CiAKLQlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSAweDI5OworCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9IVUI7CiAJZGVzYy0+YlB3ck9uMlB3ckdvb2QgPSAxMDsJLyogZWhjaSAxLjAsIDIuMy45IHNheXMgMjBtcyBtYXggKi8KIAlkZXNjLT5iSHViQ29udHJDdXJyZW50ID0gMDsKIApAQCAtOTQyLDcgKzk0NSw3IEBACiAJCQl0ZW1wICY9IH5QT1JUX1dBS0VfQklUUzsKIAkJCWVoY2lfd3JpdGVsKGVoY2ksIHRlbXAgfCBQT1JUX1JFU1VNRSwgc3RhdHVzX3JlZyk7CiAJCQllaGNpLT5yZXNldF9kb25lW3dJbmRleF0gPSBqaWZmaWVzCi0JCQkJCSsgbXNlY3NfdG9famlmZmllcygyMCk7CisJCQkJCSsgbXNlY3NfdG9famlmZmllcyhVU0JfUkVTVU1FX1RJTUVPVVQpOwogCQkJc2V0X2JpdCh3SW5kZXgsICZlaGNpLT5yZXN1bWluZ19wb3J0cyk7CiAJCQl1c2JfaGNkX3N0YXJ0X3BvcnRfcmVzdW1lKCZoY2QtPnNlbGYsIHdJbmRleCk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1vcmlvbi5jIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLW9yaW9uLmMKaW5kZXggZjZlYWZlYy4uYmZjYmI5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9laGNpLW9yaW9uLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9laGNpLW9yaW9uLmMKQEAgLTI5LDcgKzI5LDEzIEBACiAjZGVmaW5lIHdybChvZmYsIHZhbCkJd3JpdGVsX3JlbGF4ZWQoKHZhbCksIGhjZC0+cmVncyArIChvZmYpKQogCiAjZGVmaW5lIFVTQl9DTUQJCQkweDE0MAorI2RlZmluZSAgIFVTQl9DTURfUlVOCQlCSVQoMCkKKyNkZWZpbmUgICBVU0JfQ01EX1JFU0VUCQlCSVQoMSkKICNkZWZpbmUgVVNCX01PREUJCTB4MWE4CisjZGVmaW5lICAgVVNCX01PREVfTUFTSwkJR0VOTUFTSygxLCAwKQorI2RlZmluZSAgIFVTQl9NT0RFX0RFVklDRQkweDIKKyNkZWZpbmUgICBVU0JfTU9ERV9IT1NUCQkweDMKKyNkZWZpbmUgICBVU0JfTU9ERV9TRElTCQlCSVQoNCkKICNkZWZpbmUgVVNCX0NBVVNFCQkweDMxMAogI2RlZmluZSBVU0JfTUFTSwkJMHgzMTQKICNkZWZpbmUgVVNCX1dJTkRPV19DVFJMKGkpCSgweDMyMCArICgoaSkgPDwgNCkpCkBAIC02OSw4ICs3NSw4IEBACiAJLyoKIAkgKiBSZXNldCBjb250cm9sbGVyCiAJICovCi0Jd3JsKFVTQl9DTUQsIHJkbChVU0JfQ01EKSB8IDB4Mik7Ci0Jd2hpbGUgKHJkbChVU0JfQ01EKSAmIDB4Mik7CisJd3JsKFVTQl9DTUQsIHJkbChVU0JfQ01EKSB8IFVTQl9DTURfUkVTRVQpOworCXdoaWxlIChyZGwoVVNCX0NNRCkgJiBVU0JfQ01EX1JFU0VUKTsKIAogCS8qCiAJICogR0wjIFVTQi0xMDogU2V0IElQRyBmb3Igbm9uIHN0YXJ0IG9mIGZyYW1lIHBhY2tldHMKQEAgLTExMiwxNiArMTE4LDE2IEBACiAJLyoKIAkgKiBTdG9wIGFuZCByZXNldCBjb250cm9sbGVyCiAJICovCi0Jd3JsKFVTQl9DTUQsIHJkbChVU0JfQ01EKSAmIH4weDEpOwotCXdybChVU0JfQ01ELCByZGwoVVNCX0NNRCkgfCAweDIpOwotCXdoaWxlIChyZGwoVVNCX0NNRCkgJiAweDIpOworCXdybChVU0JfQ01ELCByZGwoVVNCX0NNRCkgJiB+VVNCX0NNRF9SVU4pOworCXdybChVU0JfQ01ELCByZGwoVVNCX0NNRCkgfCBVU0JfQ01EX1JFU0VUKTsKKwl3aGlsZSAocmRsKFVTQl9DTUQpICYgVVNCX0NNRF9SRVNFVCk7CiAKIAkvKgogCSAqIEdMIyBVU0ItNSBTdHJlYW1pbmcgZGlzYWJsZSBSRUdfVVNCX01PREVbNF09MQogCSAqIFRCRDogVGhpcyBuZWVkIHRvIGJlIGRvbmUgYWZ0ZXIgZWFjaCByZXNldCEKIAkgKiBHTCMgVVNCLTQgU2V0dXAgVVNCIEhvc3QgbW9kZQogCSAqLwotCXdybChVU0JfTU9ERSwgMHgxMyk7CisJd3JsKFVTQl9NT0RFLCBVU0JfTU9ERV9TRElTIHwgVVNCX01PREVfSE9TVCk7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktaHViLmMgYi9kcml2ZXJzL3VzYi9ob3N0L2ZoY2ktaHViLmMKaW5kZXggNzAxMTZhNi4uM2JhY2RkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9maGNpLWh1Yi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZmhjaS1odWIuYwpAQCAtMzAsNyArMzAsNyBAQAogLyogdmlydHVhbCByb290IGh1YiBzcGVjaWZpYyBkZXNjcmlwdG9yICovCiBzdGF0aWMgdTggcm9vdF9odWJfZGVzW10gPSB7CiAJMHgwOSwgLyogYmxlbmd0aCAqLwotCTB4MjksIC8qIGJEZXNjcmlwdG9yVHlwZTtodWItZGVzY3JpcHRvciAqLworCVVTQl9EVF9IVUIsIC8qIGJEZXNjcmlwdG9yVHlwZTtodWItZGVzY3JpcHRvciAqLwogCTB4MDEsIC8qIGJOYnJQb3J0cyAqLwogCUhVQl9DSEFSX0lORFZfUE9SVF9MUFNNIHwgSFVCX0NIQVJfTk9fT0NQTSwgLyogd0h1YkNoYXJhY3RlcmlzdGljcyAqLwogCTB4MDAsIC8qIHBlci1wb3J0IHBvd2VyLCBubyBvdmVyY3VycmVudCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9mb3RnMjEwLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9mb3RnMjEwLWhjZC5jCmluZGV4IDQ3NWIyMWYuLjAwMGVkODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZm90ZzIxMC1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2ZvdGcyMTAtaGNkLmMKQEAgLTE1MDksNyArMTUwOSw3IEBACiAJaW50CQlwb3J0cyA9IEhDU19OX1BPUlRTKGZvdGcyMTAtPmhjc19wYXJhbXMpOwogCXUxNgkJdGVtcDsKIAotCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CisJZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0hVQjsKIAlkZXNjLT5iUHdyT24yUHdyR29vZCA9IDEwOwkvKiBmb3RnMjEwIDEuMCwgMi4zLjkgc2F5cyAyMG1zIG1heCAqLwogCWRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOwogCkBAIC0xNTk1LDcgKzE1OTUsNyBAQAogCQkJLyogcmVzdW1lIHNpZ25hbGluZyBmb3IgMjAgbXNlYyAqLwogCQkJZm90ZzIxMF93cml0ZWwoZm90ZzIxMCwgdGVtcCB8IFBPUlRfUkVTVU1FLCBzdGF0dXNfcmVnKTsKIAkJCWZvdGcyMTAtPnJlc2V0X2RvbmVbd0luZGV4XSA9IGppZmZpZXMKLQkJCQkJKyBtc2Vjc190b19qaWZmaWVzKDIwKTsKKwkJCQkJKyBtc2Vjc190b19qaWZmaWVzKFVTQl9SRVNVTUVfVElNRU9VVCk7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfU1VTUEVORDoKIAkJCWNsZWFyX2JpdCh3SW5kZXgsICZmb3RnMjEwLT5wb3J0X2Nfc3VzcGVuZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2Z1c2JoMjAwLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9mdXNiaDIwMC1oY2QuYwppbmRleCBhODNlZWZlLi4wMGU0OTJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L2Z1c2JoMjAwLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZnVzYmgyMDAtaGNkLmMKQEAgLTE0NjcsNyArMTQ2Nyw3IEBACiAJaW50CQlwb3J0cyA9IEhDU19OX1BPUlRTIChmdXNiaDIwMC0+aGNzX3BhcmFtcyk7CiAJdTE2CQl0ZW1wOwogCi0JZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsKKwlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSFVCOwogCWRlc2MtPmJQd3JPbjJQd3JHb29kID0gMTA7CS8qIGZ1c2JoMjAwIDEuMCwgMi4zLjkgc2F5cyAyMG1zIG1heCAqLwogCWRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOwogCkBAIC0xNTUwLDEwICsxNTUwLDkgQEAKIAkJCWlmICgodGVtcCAmIFBPUlRfUEUpID09IDApCiAJCQkJZ290byBlcnJvcjsKIAotCQkJLyogcmVzdW1lIHNpZ25hbGluZyBmb3IgMjAgbXNlYyAqLwogCQkJZnVzYmgyMDBfd3JpdGVsKGZ1c2JoMjAwLCB0ZW1wIHwgUE9SVF9SRVNVTUUsIHN0YXR1c19yZWcpOwogCQkJZnVzYmgyMDAtPnJlc2V0X2RvbmVbd0luZGV4XSA9IGppZmZpZXMKLQkJCQkJKyBtc2Vjc190b19qaWZmaWVzKDIwKTsKKwkJCQkJKyBtc2Vjc190b19qaWZmaWVzKFVTQl9SRVNVTUVfVElNRU9VVCk7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfU1VTUEVORDoKIAkJCWNsZWFyX2JpdCh3SW5kZXgsICZmdXNiaDIwMC0+cG9ydF9jX3N1c3BlbmQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pbXgyMS1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaW14MjEtaGNkLmMKaW5kZXggNmEyYWQ1NS4uZjU0MjA0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9pbXgyMS1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lteDIxLWhjZC5jCkBAIC0xNDc0LDcgKzE0NzQsNyBAQAogCQkJICAgICAgc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzYykKIHsKIAlzdHJ1Y3QgaW14MjEgKmlteDIxID0gaGNkX3RvX2lteDIxKGhjZCk7Ci0JZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsJLyogSFVCIGRlc2NyaXB0b3IgKi8KKwlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSFVCOyAvKiBIVUIgZGVzY3JpcHRvciAqLwogCWRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOwogCiAJZGVzYy0+Yk5iclBvcnRzID0gcmVhZGwoaW14MjEtPnJlZ3MgKyBVU0JIX1JPT1RIVUJBKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMTZ4LWhjZC5jCmluZGV4IDExM2QwY2MuLjEzMTgxZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTE2eC1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDExNngtaGNkLmMKQEAgLTk0Myw3ICs5NDMsNyBAQAogewogCXUzMiByZWcgPSBpc3AxMTZ4LT5yaGRlc2NhOwogCi0JZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsKKwlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSFVCOwogCWRlc2MtPmJEZXNjTGVuZ3RoID0gOTsKIAlkZXNjLT5iSHViQ29udHJDdXJyZW50ID0gMDsKIAlkZXNjLT5iTmJyUG9ydHMgPSAodTgpIChyZWcgJiAweDMpOwpAQCAtMTQ5MCw3ICsxNDkwLDcgQEAKIAlzcGluX3VubG9ja19pcnEoJmlzcDExNngtPmxvY2spOwogCiAJaGNkLT5zdGF0ZSA9IEhDX1NUQVRFX1JFU1VNSU5HOwotCW1zbGVlcCgyMCk7CisJbXNsZWVwKFVTQl9SRVNVTUVfVElNRU9VVCk7CiAKIAkvKiBHbyBvcGVyYXRpb25hbCAqLwogCXNwaW5fbG9ja19pcnEoJmlzcDExNngtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9pc3AxMzYyLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9pc3AxMzYyLWhjZC5jCmluZGV4IGIzMmFiNjAuLjZjZjgyZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTM2Mi1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L2lzcDEzNjItaGNkLmMKQEAgLTE1MzgsNyArMTUzOCw3IEBACiAKIAlEQkcoMywgIiVzOiBlbnRlclxuIiwgX19mdW5jX18pOwogCi0JZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsKKwlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSFVCOwogCWRlc2MtPmJEZXNjTGVuZ3RoID0gOTsKIAlkZXNjLT5iSHViQ29udHJDdXJyZW50ID0gMDsKIAlkZXNjLT5iTmJyUG9ydHMgPSByZWcgJiAweDM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L21heDM0MjEtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L21heDM0MjEtaGNkLmMKaW5kZXggYTk4ODMzYy4uZmMxZmQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9tYXgzNDIxLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvbWF4MzQyMS1oY2QuYwpAQCAtMTY1OSw3ICsxNjU5LDcgQEAKIAkvKgogCSAqIFNlZSBUYWJsZSAxMS0xMzogSHViIERlc2NyaXB0b3IgaW4gVVNCIDIuMCBzcGVjLgogCSAqLwotCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CS8qIGh1YiBkZXNjcmlwdG9yICovCisJZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0hVQjsgLyogaHViIGRlc2NyaXB0b3IgKi8KIAlkZXNjLT5iRGVzY0xlbmd0aCA9IDk7CiAJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9IGNwdV90b19sZTE2KEhVQl9DSEFSX0lORFZfUE9SVF9MUFNNIHwKIAkJCQkJCUhVQl9DSEFSX0NPTU1PTl9PQ1BNKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMgYi9kcml2ZXJzL3VzYi9ob3N0L29oY2ktYXQ5MS5jCmluZGV4IDdjY2U4NWEuLjE1ZGYwMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb2hjaS1hdDkxLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWF0OTEuYwpAQCAtMzksNyArMzksNiBAQAogc3RydWN0IG9oY2lfYXQ5MV9wcml2IHsKIAlzdHJ1Y3QgY2xrICppY2xrOwogCXN0cnVjdCBjbGsgKmZjbGs7Ci0Jc3RydWN0IGNsayAqdWNsazsKIAlzdHJ1Y3QgY2xrICpoY2xrOwogCWJvb2wgY2xvY2tlZDsKIAlib29sIHdha2V1cDsJCS8qIFNhdmVkIHdha2UtdXAgc3RhdGUgZm9yIHJlc3VtZSAqLwpAQCAtNjQsMTAgKzYzLDggQEAKIHsKIAlpZiAob2hjaV9hdDkxLT5jbG9ja2VkKQogCQlyZXR1cm47Ci0JaWYgKElTX0VOQUJMRUQoQ09ORklHX0NPTU1PTl9DTEspKSB7Ci0JCWNsa19zZXRfcmF0ZShvaGNpX2F0OTEtPnVjbGssIDQ4MDAwMDAwKTsKLQkJY2xrX3ByZXBhcmVfZW5hYmxlKG9oY2lfYXQ5MS0+dWNsayk7Ci0JfQorCisJY2xrX3NldF9yYXRlKG9oY2lfYXQ5MS0+ZmNsaywgNDgwMDAwMDApOwogCWNsa19wcmVwYXJlX2VuYWJsZShvaGNpX2F0OTEtPmhjbGspOwogCWNsa19wcmVwYXJlX2VuYWJsZShvaGNpX2F0OTEtPmljbGspOwogCWNsa19wcmVwYXJlX2VuYWJsZShvaGNpX2F0OTEtPmZjbGspOwpAQCAtNzgsMTEgKzc1LDEwIEBACiB7CiAJaWYgKCFvaGNpX2F0OTEtPmNsb2NrZWQpCiAJCXJldHVybjsKKwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShvaGNpX2F0OTEtPmZjbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShvaGNpX2F0OTEtPmljbGspOwogCWNsa19kaXNhYmxlX3VucHJlcGFyZShvaGNpX2F0OTEtPmhjbGspOwotCWlmIChJU19FTkFCTEVEKENPTkZJR19DT01NT05fQ0xLKSkKLQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG9oY2lfYXQ5MS0+dWNsayk7CiAJb2hjaV9hdDkxLT5jbG9ja2VkID0gZmFsc2U7CiB9CiAKQEAgLTE5MSwxNCArMTg3LDYgQEAKIAkJcmV0dmFsID0gUFRSX0VSUihvaGNpX2F0OTEtPmhjbGspOwogCQlnb3RvIGVycjsKIAl9Ci0JaWYgKElTX0VOQUJMRUQoQ09ORklHX0NPTU1PTl9DTEspKSB7Ci0JCW9oY2lfYXQ5MS0+dWNsayA9IGRldm1fY2xrX2dldChkZXYsICJ1c2JfY2xrIik7Ci0JCWlmIChJU19FUlIob2hjaV9hdDkxLT51Y2xrKSkgewotCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHVjbGtcbiIpOwotCQkJcmV0dmFsID0gUFRSX0VSUihvaGNpX2F0OTEtPnVjbGspOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9CiAKIAlib2FyZCA9IGhjZC0+c2VsZi5jb250cm9sbGVyLT5wbGF0Zm9ybV9kYXRhOwogCW9oY2kgPSBoY2RfdG9fb2hjaShoY2QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jCmluZGV4IGZlMmFlZGQuLmVkNjc4YzE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L29oY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9vaGNpLWh1Yi5jCkBAIC01MzYsNyArNTM2LDcgQEAKIAl1MzIJCXJoID0gcm9vdGh1Yl9hIChvaGNpKTsKIAl1MTYJCXRlbXA7CiAKLQlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSAweDI5OworCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9IVUI7CiAJZGVzYy0+YlB3ck9uMlB3ckdvb2QgPSAocmggJiBSSF9BX1BPVFBHVCkgPj4gMjQ7CiAJZGVzYy0+Ykh1YkNvbnRyQ3VycmVudCA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAtaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L294dTIxMGhwLWhjZC5jCmluZGV4IGVmN2VmYjIuLjYzNTJmNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3Qvb3h1MjEwaHAtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC9veHUyMTBocC1oY2QuYwpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAJaW50IHBvcnRzID0gSENTX05fUE9SVFMob3h1LT5oY3NfcGFyYW1zKTsKIAl1MTYgdGVtcDsKIAotCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CisJZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0hVQjsKIAlkZXNjLT5iUHdyT24yUHdyR29vZCA9IDEwOwkvKiBveHUgMS4wLCAyLjMuOSBzYXlzIDIwbXMgbWF4ICovCiAJZGVzYy0+Ykh1YkNvbnRyQ3VycmVudCA9IDA7CiAKQEAgLTI1MDAsMTEgKzI1MDAsMTIgQEAKIAkJCQkJfHwgb3h1LT5yZXNldF9kb25lW2ldICE9IDApCiAJCQkJY29udGludWU7CiAKLQkJCS8qIHN0YXJ0IDIwIG1zZWMgcmVzdW1lIHNpZ25hbGluZyBmcm9tIHRoaXMgcG9ydCwKLQkJCSAqIGFuZCBtYWtlIGh1Yl93cSBjb2xsZWN0IFBPUlRfU1RBVF9DX1NVU1BFTkQgdG8KKwkJCS8qIHN0YXJ0IFVTQl9SRVNVTUVfVElNRU9VVCByZXN1bWUgc2lnbmFsaW5nIGZyb20gdGhpcworCQkJICogcG9ydCwgYW5kIG1ha2UgaHViX3dxIGNvbGxlY3QgUE9SVF9TVEFUX0NfU1VTUEVORCB0bwogCQkJICogc3RvcCB0aGF0IHNpZ25hbGluZy4KIAkJCSAqLwotCQkJb3h1LT5yZXNldF9kb25lW2ldID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOworCQkJb3h1LT5yZXNldF9kb25lW2ldID0gamlmZmllcyArCisJCQkJbXNlY3NfdG9famlmZmllcyhVU0JfUkVTVU1FX1RJTUVPVVQpOwogCQkJb3h1X2RiZyhveHUsICJwb3J0ICVkIHJlbW90ZSB3YWtldXBcbiIsIGkgKyAxKTsKIAkJCW1vZF90aW1lcigmaGNkLT5yaF90aW1lciwgb3h1LT5yZXNldF9kb25lW2ldKTsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYyBiL2RyaXZlcnMvdXNiL2hvc3QvcjhhNjY1OTctaGNkLmMKaW5kZXggYmRjODJmZS4uNGNiZDA2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC9yOGE2NjU5Ny1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3I4YTY2NTk3LWhjZC5jCkBAIC0yMTM2LDcgKzIxMzYsNyBAQAogc3RhdGljIHZvaWQgcjhhNjY1OTdfaHViX2Rlc2NyaXB0b3Ioc3RydWN0IHI4YTY2NTk3ICpyOGE2NjU5NywKIAkJCQkgICAgc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzYykKIHsKLQlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSAweDI5OworCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9IVUI7CiAJZGVzYy0+Ykh1YkNvbnRyQ3VycmVudCA9IDA7CiAJZGVzYy0+Yk5iclBvcnRzID0gcjhhNjY1OTctPm1heF9yb290X2h1YjsKIAlkZXNjLT5iRGVzY0xlbmd0aCA9IDk7CkBAIC0yMzAxLDcgKzIzMDEsNyBAQAogCQlyaC0+cG9ydCAmPSB+VVNCX1BPUlRfU1RBVF9TVVNQRU5EOwogCQlyaC0+cG9ydCB8PSBVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCA8PCAxNjsKIAkJcjhhNjY1OTdfbWRmeShyOGE2NjU5NywgUkVTVU1FLCBSRVNVTUUgfCBVQUNULCBkdnN0Y3RyX3JlZyk7Ci0JCW1zbGVlcCg1MCk7CisJCW1zbGVlcChVU0JfUkVTVU1FX1RJTUVPVVQpOwogCQlyOGE2NjU5N19tZGZ5KHI4YTY2NTk3LCBVQUNULCBSRVNVTUUgfCBVQUNULCBkdnN0Y3RyX3JlZyk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC9zbDgxMS1oY2QuYwppbmRleCA0ZjRiYTFlLi5mZDJhMTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3NsODExLWhjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvc2w4MTEtaGNkLmMKQEAgLTEwOTEsNyArMTA5MSw3IEBACiApIHsKIAl1MTYJCXRlbXAgPSAwOwogCi0JZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsKKwlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSFVCOwogCWRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOwogCiAJZGVzYy0+Yk5iclBvcnRzID0gMTsKQEAgLTEyNTksNyArMTI1OSw3IEBACiAJCQlzbDgxMV93cml0ZShzbDgxMSwgU0wxMUhfQ1RMUkVHMSwgc2w4MTEtPmN0cmwxKTsKIAogCQkJbW9kX3RpbWVyKCZzbDgxMS0+dGltZXIsIGppZmZpZXMKLQkJCQkJKyBtc2Vjc190b19qaWZmaWVzKDIwKSk7CisJCQkJCSsgbXNlY3NfdG9famlmZmllcyhVU0JfUkVTVU1FX1RJTUVPVVQpKTsKIAkJCWJyZWFrOwogCQljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6CiAJCQlwb3J0X3Bvd2VyKHNsODExLCAwKTsKQEAgLTE4MDksNyArMTgwOSw2IEBACiAJLnJlc3VtZSA9CXNsODExaF9yZXN1bWUsCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPQkoY2hhciAqKSBoY2RfbmFtZSwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiBFWFBPUlRfU1lNQk9MKHNsODExaF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC91MTMyLWhjZC5jIGIvZHJpdmVycy91c2IvaG9zdC91MTMyLWhjZC5jCmluZGV4IGFkOTdlOGEuLmQ1MTY4NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvdTEzMi1oY2QuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3UxMzItaGNkLmMKQEAgLTI1ODQsNyArMjU4NCw3IEBACiAJcmV0dmFsID0gdTEzMl9yZWFkX3BjaW1lbSh1MTMyLCByb290aHViLmEsICZyaF9hKTsKIAlpZiAocmV0dmFsKQogCQlyZXR1cm4gcmV0dmFsOwotCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CisJZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0hVQjsKIAlkZXNjLT5iUHdyT24yUHdyR29vZCA9IChyaF9hICYgUkhfQV9QT1RQR1QpID4+IDI0OwogCWRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOwogCWRlc2MtPmJOYnJQb3J0cyA9IHUxMzItPm51bV9wb3J0czsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1odWIuYyBiL2RyaXZlcnMvdXNiL2hvc3QvdWhjaS1odWIuYwppbmRleCAxOWJhNWVhLi5lY2U5ZTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3VoY2ktaHViLmMKKysrIGIvZHJpdmVycy91c2IvaG9zdC91aGNpLWh1Yi5jCkBAIC0xNSw3ICsxNSw3IEBACiBzdGF0aWMgY29uc3QgX191OCByb290X2h1Yl9odWJfZGVzW10gPQogewogCTB4MDksCQkJLyogIF9fdTggIGJMZW5ndGg7ICovCi0JMHgyOSwJCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBIdWItZGVzY3JpcHRvciAqLworCVVTQl9EVF9IVUIsCQkvKiAgX191OCAgYkRlc2NyaXB0b3JUeXBlOyBIdWItZGVzY3JpcHRvciAqLwogCTB4MDIsCQkJLyogIF9fdTggIGJOYnJQb3J0czsgKi8KIAlIVUJfQ0hBUl9OT19MUFNNIHwJLyogX191MTYgIHdIdWJDaGFyYWN0ZXJpc3RpY3M7ICovCiAJCUhVQl9DSEFSX0lORFZfUE9SVF9PQ1BNLCAvKiAocGVyLXBvcnQgT0MsIG5vIHBvd2VyIHN3aXRjaGluZykgKi8KQEAgLTE2Niw3ICsxNjYsNyBAQAogCQkJCS8qIFBvcnQgcmVjZWl2ZWQgYSB3YWtldXAgcmVxdWVzdCAqLwogCQkJCXNldF9iaXQocG9ydCwgJnVoY2ktPnJlc3VtaW5nX3BvcnRzKTsKIAkJCQl1aGNpLT5wb3J0c190aW1lb3V0ID0gamlmZmllcyArCi0JCQkJCQltc2Vjc190b19qaWZmaWVzKDI1KTsKKwkJCQkJbXNlY3NfdG9famlmZmllcyhVU0JfUkVTVU1FX1RJTUVPVVQpOwogCQkJCXVzYl9oY2Rfc3RhcnRfcG9ydF9yZXN1bWUoCiAJCQkJCQkmdWhjaV90b19oY2QodWhjaSktPnNlbGYsIHBvcnQpOwogCkBAIC0zMzgsNyArMzM4LDggQEAKIAkJCXVoY2lfZmluaXNoX3N1c3BlbmQodWhjaSwgcG9ydCwgcG9ydF9hZGRyKTsKIAogCQkJLyogVVNCIHYyLjAgNy4xLjcuNSAqLwotCQkJdWhjaS0+cG9ydHNfdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDUwKTsKKwkJCXVoY2ktPnBvcnRzX3RpbWVvdXQgPSBqaWZmaWVzICsKKwkJCQltc2Vjc190b19qaWZmaWVzKFVTQl9SRVNVTUVfVElNRU9VVCk7CiAJCQlicmVhazsKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgogCQkJLyogVUhDSSBoYXMgbm8gcG93ZXIgc3dpdGNoaW5nICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaGNkLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvaGNkLmMKaW5kZXggZDdiMzYzYS4uNDM2MjZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC93aGNpL2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9oY2QuYwpAQCAtMzEzLDggKzMxMyw3IEBACiAJdXdiX3JjX3B1dCh3dXNiaGMtPnV3Yl9yYyk7CiBlcnJvcjoKIAl3aGNfY2xlYW5fdXAod2hjKTsKLQlpZiAodXNiX2hjZCkKLQkJdXNiX3B1dF9oY2QodXNiX2hjZCk7CisJdXNiX3B1dF9oY2QodXNiX2hjZCk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLWh1Yi5jCmluZGV4IGE3ODY1YzQuLjA4MjdkN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1odWIuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktaHViLmMKQEAgLTM4Nyw2ICszODcsMTAgQEAKIAkJc3RhdHVzID0gUE9SVF9QTEM7CiAJCXBvcnRfY2hhbmdlX2JpdCA9ICJsaW5rIHN0YXRlIjsKIAkJYnJlYWs7CisJY2FzZSBVU0JfUE9SVF9GRUFUX0NfUE9SVF9DT05GSUdfRVJST1I6CisJCXN0YXR1cyA9IFBPUlRfQ0VDOworCQlwb3J0X2NoYW5nZV9iaXQgPSAiY29uZmlnIGVycm9yIjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbiAqLwogCQlyZXR1cm47CkBAIC01ODgsNiArNTkyLDggQEAKIAkJCXN0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX0NfTElOS19TVEFURSA8PCAxNjsKIAkJaWYgKChyYXdfcG9ydF9zdGF0dXMgJiBQT1JUX1dSQykpCiAJCQlzdGF0dXMgfD0gVVNCX1BPUlRfU1RBVF9DX0JIX1JFU0VUIDw8IDE2OworCQlpZiAoKHJhd19wb3J0X3N0YXR1cyAmIFBPUlRfQ0VDKSkKKwkJCXN0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX0NfQ09ORklHX0VSUk9SIDw8IDE2OwogCX0KIAogCWlmIChoY2QtPnNwZWVkICE9IEhDRF9VU0IzKSB7CkBAIC0xMDA1LDYgKzEwMTEsNyBAQAogCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19PVkVSX0NVUlJFTlQ6CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX0VOQUJMRToKIAkJY2FzZSBVU0JfUE9SVF9GRUFUX0NfUE9SVF9MSU5LX1NUQVRFOgorCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19QT1JUX0NPTkZJR19FUlJPUjoKIAkJCXhoY2lfY2xlYXJfcG9ydF9jaGFuZ2VfYml0KHhoY2ksIHdWYWx1ZSwgd0luZGV4LAogCQkJCQlwb3J0X2FycmF5W3dJbmRleF0sIHRlbXApOwogCQkJYnJlYWs7CkBAIC0xMDY5LDcgKzEwNzYsNyBAQAogCSAqLwogCXN0YXR1cyA9IGJ1c19zdGF0ZS0+cmVzdW1pbmdfcG9ydHM7CiAKLQltYXNrID0gUE9SVF9DU0MgfCBQT1JUX1BFQyB8IFBPUlRfT0NDIHwgUE9SVF9QTEMgfCBQT1JUX1dSQzsKKwltYXNrID0gUE9SVF9DU0MgfCBQT1JUX1BFQyB8IFBPUlRfT0NDIHwgUE9SVF9QTEMgfCBQT1JUX1dSQyB8IFBPUlRfQ0VDOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKIAkvKiBGb3IgZWFjaCBwb3J0LCBkaWQgYW55dGhpbmcgY2hhbmdlPyAgSWYgc28sIHNldCB0aGF0IGJpdCBpbiBidWYuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGNpLmMKaW5kZXggZmQ1M2M5ZS4uMmFmMzJlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wY2kuYwpAQCAtMTE1LDYgKzExNSw3IEBACiAJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMKSB7CiAJCXhoY2ktPnF1aXJrcyB8PSBYSENJX0xQTV9TVVBQT1JUOwogCQl4aGNpLT5xdWlya3MgfD0gWEhDSV9JTlRFTF9IT1NUOworCQl4aGNpLT5xdWlya3MgfD0gWEhDSV9BVk9JRF9CRUk7CiAJfQogCWlmIChwZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JTlRFTCAmJgogCQkJcGRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfSU5URUxfUEFOVEhFUlBPSU5UX1hIQ0kpIHsKQEAgLTEzMCw3ICsxMzEsNiBAQAogCQkgKiBQUFQgY2hpcHNldHMuCiAJCSAqLwogCQl4aGNpLT5xdWlya3MgfD0gWEhDSV9TUFVSSU9VU19SRUJPT1Q7Ci0JCXhoY2ktPnF1aXJrcyB8PSBYSENJX0FWT0lEX0JFSTsKIAl9CiAJaWYgKHBkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0lOVEVMICYmCiAJCXBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVMX0xZTlhQT0lOVF9MUF9YSENJKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGxhdC5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXBsYXQuYwppbmRleCAwZTExZDYxLi43ODNlODE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcGxhdC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1wbGF0LmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiL3hoY2lfcGRyaXZlci5oPgogCkBAIC0xNTUsMTIgKzE1NiwyNyBAQAogCWlmIChIQ0NfTUFYX1BTQSh4aGNpLT5oY2NfcGFyYW1zKSA+PSA0KQogCQl4aGNpLT5zaGFyZWRfaGNkLT5jYW5fZG9fc3RyZWFtcyA9IDE7CiAKKwloY2QtPnVzYl9waHkgPSBkZXZtX3VzYl9nZXRfcGh5X2J5X3BoYW5kbGUoJnBkZXYtPmRldiwgInVzYi1waHkiLCAwKTsKKwlpZiAoSVNfRVJSKGhjZC0+dXNiX3BoeSkpIHsKKwkJcmV0ID0gUFRSX0VSUihoY2QtPnVzYl9waHkpOworCQlpZiAocmV0ID09IC1FUFJPQkVfREVGRVIpCisJCQlnb3RvIHB1dF91c2IzX2hjZDsKKwkJaGNkLT51c2JfcGh5ID0gTlVMTDsKKwl9IGVsc2UgeworCQlyZXQgPSB1c2JfcGh5X2luaXQoaGNkLT51c2JfcGh5KTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gcHV0X3VzYjNfaGNkOworCX0KKwogCXJldCA9IHVzYl9hZGRfaGNkKHhoY2ktPnNoYXJlZF9oY2QsIGlycSwgSVJRRl9TSEFSRUQpOwogCWlmIChyZXQpCi0JCWdvdG8gcHV0X3VzYjNfaGNkOworCQlnb3RvIGRpc2FibGVfdXNiX3BoeTsKIAogCXJldHVybiAwOwogCitkaXNhYmxlX3VzYl9waHk6CisJdXNiX3BoeV9zaHV0ZG93bihoY2QtPnVzYl9waHkpOworCiBwdXRfdXNiM19oY2Q6CiAJdXNiX3B1dF9oY2QoeGhjaS0+c2hhcmVkX2hjZCk7CiAKQEAgLTE4NCw2ICsyMDAsNyBAQAogCXN0cnVjdCBjbGsgKmNsayA9IHhoY2ktPmNsazsKIAogCXVzYl9yZW1vdmVfaGNkKHhoY2ktPnNoYXJlZF9oY2QpOworCXVzYl9waHlfc2h1dGRvd24oaGNkLT51c2JfcGh5KTsKIAl1c2JfcHV0X2hjZCh4aGNpLT5zaGFyZWRfaGNkKTsKIAogCXVzYl9yZW1vdmVfaGNkKGhjZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXJpbmcuYwppbmRleCA1ZmI2NmRiLi5mNTM5N2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2ktcmluZy5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS1yaW5nLmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogCiAJCQkvKiBUb2dnbGUgdGhlIGN5Y2xlIGJpdCBhZnRlciB0aGUgbGFzdCByaW5nIHNlZ21lbnQuICovCiAJCQlpZiAobGFzdF90cmJfb25fbGFzdF9zZWcoeGhjaSwgcmluZywgcmluZy0+ZW5xX3NlZywgbmV4dCkpIHsKLQkJCQlyaW5nLT5jeWNsZV9zdGF0ZSA9IChyaW5nLT5jeWNsZV9zdGF0ZSA/IDAgOiAxKTsKKwkJCQlyaW5nLT5jeWNsZV9zdGF0ZSBePSAxOwogCQkJfQogCQl9CiAJCXJpbmctPmVucV9zZWcgPSByaW5nLT5lbnFfc2VnLT5uZXh0OwpAQCAtMTU3NCw3ICsxNTc0LDcgQEAKIAkJfSBlbHNlIHsKIAkJCXhoY2lfZGJnKHhoY2ksICJyZXN1bWUgSFMgcG9ydCAlZFxuIiwgcG9ydF9pZCk7CiAJCQlidXNfc3RhdGUtPnJlc3VtZV9kb25lW2Zha2VkX3BvcnRfaW5kZXhdID0gamlmZmllcyArCi0JCQkJbXNlY3NfdG9famlmZmllcygyMCk7CisJCQkJbXNlY3NfdG9famlmZmllcyhVU0JfUkVTVU1FX1RJTUVPVVQpOwogCQkJc2V0X2JpdChmYWtlZF9wb3J0X2luZGV4LCAmYnVzX3N0YXRlLT5yZXN1bWluZ19wb3J0cyk7CiAJCQltb2RfdGltZXIoJmhjZC0+cmhfdGltZXIsCiAJCQkJICBidXNfc3RhdGUtPnJlc3VtZV9kb25lW2Zha2VkX3BvcnRfaW5kZXhdKTsKQEAgLTE3MjksNyArMTcyOSw3IEBACiAJaWYgKCFjb21tYW5kKQogCQlyZXR1cm47CiAKLQllcC0+ZXBfc3RhdGUgfD0gRVBfSEFMVEVEIHwgRVBfUkVDRU5UTFlfSEFMVEVEOworCWVwLT5lcF9zdGF0ZSB8PSBFUF9IQUxURUQ7CiAJZXAtPnN0b3BwZWRfc3RyZWFtID0gc3RyZWFtX2lkOwogCiAJeGhjaV9xdWV1ZV9yZXNldF9lcCh4aGNpLCBjb21tYW5kLCBzbG90X2lkLCBlcF9pbmRleCk7CkBAIC0yODA5LDcgKzI4MDksNyBAQAogCiAJCQkvKiBUb2dnbGUgdGhlIGN5Y2xlIGJpdCBhZnRlciB0aGUgbGFzdCByaW5nIHNlZ21lbnQuICovCiAJCQlpZiAobGFzdF90cmJfb25fbGFzdF9zZWcoeGhjaSwgcmluZywgcmluZy0+ZW5xX3NlZywgbmV4dCkpIHsKLQkJCQlyaW5nLT5jeWNsZV9zdGF0ZSA9IChyaW5nLT5jeWNsZV9zdGF0ZSA/IDAgOiAxKTsKKwkJCQlyaW5nLT5jeWNsZV9zdGF0ZSBePSAxOwogCQkJfQogCQkJcmluZy0+ZW5xX3NlZyA9IHJpbmctPmVucV9zZWctPm5leHQ7CiAJCQlyaW5nLT5lbnF1ZXVlID0gcmluZy0+ZW5xX3NlZy0+dHJiczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS10cmFjZS5oIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXRyYWNlLmgKaW5kZXggZGRlMzk1OS4uNTljMDU2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC94aGNpLXRyYWNlLmgKKysrIGIvZHJpdmVycy91c2IvaG9zdC94aGNpLXRyYWNlLmgKQEAgLTE0LDYgKzE0LDEzIEBACiAjdW5kZWYgVFJBQ0VfU1lTVEVNCiAjZGVmaW5lIFRSQUNFX1NZU1RFTSB4aGNpLWhjZAogCisvKgorICogVGhlIFRSQUNFX1NZU1RFTV9WQVIgZGVmYXVsdHMgdG8gVFJBQ0VfU1lTVEVNLCBidXQgbXVzdCBiZSBhCisgKiBsZWdpdGltYXRlIEMgdmFyaWFibGUuIEl0IGlzIG5vdCBleHBvcnRlZCB0byB1c2VyIHNwYWNlLgorICovCisjdW5kZWYgVFJBQ0VfU1lTVEVNX1ZBUgorI2RlZmluZSBUUkFDRV9TWVNURU1fVkFSIHhoY2lfaGNkCisKICNpZiAhZGVmaW5lZChfX1hIQ0lfVFJBQ0VfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKICNkZWZpbmUgX19YSENJX1RSQUNFX0gKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC94aGNpLmMgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwppbmRleCBiMDZkMWE1Li5lYzhhYzE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYwpAQCAtMTMzOCwxMiArMTMzOCw2IEBACiAJCWdvdG8gZXhpdDsKIAl9CiAKLQkvKiBSZWplY3QgdXJiIGlmIGVuZHBvaW50IGlzIGluIHNvZnQgcmVzZXQsIHF1ZXVlIG11c3Qgc3RheSBlbXB0eSAqLwotCWlmICh4aGNpLT5kZXZzW3Nsb3RfaWRdLT5lcHNbZXBfaW5kZXhdLmVwX3N0YXRlICYgRVBfQ09ORklHX1BFTkRJTkcpIHsKLQkJeGhjaV93YXJuKHhoY2ksICJDYW4ndCBlbnF1ZXVlIFVSQiB3aGlsZSBlcCBpcyBpbiBzb2Z0IHJlc2V0XG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KIAlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYygmdXJiLT5lcC0+ZGVzYykpCiAJCXNpemUgPSB1cmItPm51bWJlcl9vZl9wYWNrZXRzOwogCWVsc2UKQEAgLTI5NTQsMzYgKzI5NDgsMjMgQEAKIAl9CiB9CiAKLS8qIENhbGxlZCBhZnRlciBjbGVhcmluZyBhIGhhbHRlZCBkZXZpY2UuIFVTQiBjb3JlIHNob3VsZCBoYXZlIHNlbnQgdGhlIGNvbnRyb2wKKy8qIENhbGxlZCB3aGVuIGNsZWFyaW5nIGhhbHRlZCBkZXZpY2UuIFRoZSBjb3JlIHNob3VsZCBoYXZlIHNlbnQgdGhlIGNvbnRyb2wKICAqIG1lc3NhZ2UgdG8gY2xlYXIgdGhlIGRldmljZSBoYWx0IGNvbmRpdGlvbi4gVGhlIGhvc3Qgc2lkZSBvZiB0aGUgaGFsdCBzaG91bGQKLSAqIGFscmVhZHkgYmUgY2xlYXJlZCB3aXRoIGEgcmVzZXQgZW5kcG9pbnQgY29tbWFuZCBpc3N1ZWQgaW1tZWRpYXRlbHkgd2hlbiB0aGUKLSAqIFNUQUxMIHR4IGV2ZW50IHdhcyByZWNlaXZlZC4KKyAqIGFscmVhZHkgYmUgY2xlYXJlZCB3aXRoIGEgcmVzZXQgZW5kcG9pbnQgY29tbWFuZCBpc3N1ZWQgd2hlbiB0aGUgU1RBTEwgdHgKKyAqIGV2ZW50IHdhcyByZWNlaXZlZC4KKyAqCisgKiBDb250ZXh0OiBpbl9pbnRlcnJ1cHQKICAqLwogCiB2b2lkIHhoY2lfZW5kcG9pbnRfcmVzZXQoc3RydWN0IHVzYl9oY2QgKmhjZCwKIAkJc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCkKIHsKIAlzdHJ1Y3QgeGhjaV9oY2QgKnhoY2k7Ci0Jc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7Ci0Jc3RydWN0IHhoY2lfdmlydF9kZXZpY2UgKnZpcnRfZGV2OwotCXN0cnVjdCB4aGNpX3ZpcnRfZXAgKnZpcnRfZXA7Ci0Jc3RydWN0IHhoY2lfaW5wdXRfY29udHJvbF9jdHggKmN0cmxfY3R4OwotCXN0cnVjdCB4aGNpX2NvbW1hbmQgKmNvbW1hbmQ7Ci0JdW5zaWduZWQgaW50IGVwX2luZGV4LCBlcF9zdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBlcF9mbGFnOwogCiAJeGhjaSA9IGhjZF90b194aGNpKGhjZCk7Ci0JdWRldiA9IChzdHJ1Y3QgdXNiX2RldmljZSAqKSBlcC0+aGNwcml2OwotCWlmICghZXAtPmhjcHJpdikKLQkJcmV0dXJuOwotCXZpcnRfZGV2ID0geGhjaS0+ZGV2c1t1ZGV2LT5zbG90X2lkXTsKLQllcF9pbmRleCA9IHhoY2lfZ2V0X2VuZHBvaW50X2luZGV4KCZlcC0+ZGVzYyk7Ci0JdmlydF9lcCA9ICZ2aXJ0X2Rldi0+ZXBzW2VwX2luZGV4XTsKLQllcF9zdGF0ZSA9IHZpcnRfZXAtPmVwX3N0YXRlOwogCiAJLyoKLQkgKiBJbXBsZW1lbnQgdGhlIGNvbmZpZyBlcCBjb21tYW5kIGluIHhoY2kgNC42LjggYWRkaXRpb25hbCBub3RlOgorCSAqIFdlIG1pZ2h0IG5lZWQgdG8gaW1wbGVtZW50IHRoZSBjb25maWcgZXAgY21kIGluIHhoY2kgNC44LjEgbm90ZToKIAkgKiBUaGUgUmVzZXQgRW5kcG9pbnQgQ29tbWFuZCBtYXkgb25seSBiZSBpc3N1ZWQgdG8gZW5kcG9pbnRzIGluIHRoZQogCSAqIEhhbHRlZCBzdGF0ZS4gSWYgc29mdHdhcmUgd2lzaGVzIHJlc2V0IHRoZSBEYXRhIFRvZ2dsZSBvciBTZXF1ZW5jZQogCSAqIE51bWJlciBvZiBhbiBlbmRwb2ludCB0aGF0IGlzbid0IGluIHRoZSBIYWx0ZWQgc3RhdGUsIHRoZW4gc29mdHdhcmUKQEAgLTI5OTEsNzIgKzI5NzIsOSBAQAogCSAqIGZvciB0aGUgdGFyZ2V0IGVuZHBvaW50LiB0aGF0IGlzIGluIHRoZSBTdG9wcGVkIHN0YXRlLgogCSAqLwogCi0JaWYgKGVwX3N0YXRlICYgU0VUX0RFUV9QRU5ESU5HIHx8IGVwX3N0YXRlICYgRVBfUkVDRU5UTFlfSEFMVEVEKSB7Ci0JCXZpcnRfZXAtPmVwX3N0YXRlICY9IH5FUF9SRUNFTlRMWV9IQUxURUQ7Ci0JCXhoY2lfZGJnKHhoY2ksICJlcCByZWNlbnRseSBoYWx0ZWQsIG5vIHRvZ2dsZSByZXNldCBuZWVkZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogT25seSBpbnRlcnJ1cHQgYW5kIGJ1bGsgZXAncyB1c2UgRGF0YSB0b2dnbGUsIFVTQjIgc3BlYyA1LjUuNC0+ICovCi0JaWYgKHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woJmVwLT5kZXNjKSB8fAotCSAgICB1c2JfZW5kcG9pbnRfeGZlcl9pc29jKCZlcC0+ZGVzYykpCi0JCXJldHVybjsKLQotCWVwX2ZsYWcgPSB4aGNpX2dldF9lbmRwb2ludF9mbGFnKCZlcC0+ZGVzYyk7Ci0KLQlpZiAoZXBfZmxhZyA9PSBTTE9UX0ZMQUcgfHwgZXBfZmxhZyA9PSBFUDBfRkxBRykKLQkJcmV0dXJuOwotCi0JY29tbWFuZCA9IHhoY2lfYWxsb2NfY29tbWFuZCh4aGNpLCB0cnVlLCB0cnVlLCBHRlBfTk9XQUlUKTsKLQlpZiAoIWNvbW1hbmQpIHsKLQkJeGhjaV9lcnIoeGhjaSwgIkNvdWxkIG5vdCBhbGxvY2F0ZSB4SENJIGNvbW1hbmQgc3RydWN0dXJlLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmeGhjaS0+bG9jaywgZmxhZ3MpOwotCi0JLyogYmxvY2sgcmluZ2luZyBlcCBkb29yYmVsbCAqLwotCXZpcnRfZXAtPmVwX3N0YXRlIHw9IEVQX0NPTkZJR19QRU5ESU5HOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgZW5kcG9pbnQgcmluZyBpcyBlbXB0eSBiZWZvcmUgcmVzZXR0aW5nIHRoZSB0b2dnbGUvc2VxLgotCSAqIERyaXZlciBpcyByZXF1aXJlZCB0byBzeW5jaHJvbm91c2x5IGNhbmNlbCBhbGwgdHJhbnNmZXIgcmVxdWVzdC4KLQkgKgotCSAqIHhoY2kgNC42LjYgc2F5cyB3ZSBjYW4gaXNzdWUgYSBjb25maWd1cmUgZW5kcG9pbnQgY29tbWFuZCBvbiBhCi0JICogcnVubmluZyBlbmRwb2ludCByaW5nIGFzIGxvbmcgYXMgaXQncyBpZGxlIChxdWV1ZSBlbXB0eSkKLQkgKi8KLQotCWlmICghbGlzdF9lbXB0eSgmdmlydF9lcC0+cmluZy0+dGRfbGlzdCkpIHsKLQkJZGV2X2VycigmdWRldi0+ZGV2LCAiRVAgbm90IGVtcHR5LCByZWZ1c2UgcmVzZXRcbiIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4aGNpLT5sb2NrLCBmbGFncyk7Ci0JCWdvdG8gY2xlYW51cDsKLQl9Ci0KLQl4aGNpX2RiZyh4aGNpLCAiUmVzZXQgdG9nZ2xlL3NlcSBmb3Igc2xvdCAlZCwgZXBfaW5kZXg6ICVkXG4iLAotCQkgdWRldi0+c2xvdF9pZCwgZXBfaW5kZXgpOwotCi0JY3RybF9jdHggPSB4aGNpX2dldF9pbnB1dF9jb250cm9sX2N0eChjb21tYW5kLT5pbl9jdHgpOwotCWlmICghY3RybF9jdHgpIHsKLQkJeGhjaV9lcnIoeGhjaSwgIkNvdWxkIG5vdCBnZXQgaW5wdXQgY29udGV4dCwgYmFkIHR5cGUuIHZpcnRfZGV2OiAlcCwgaW5fY3R4ICVwXG4iLAotCQkJIHZpcnRfZGV2LCB2aXJ0X2Rldi0+aW5fY3R4KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeGhjaS0+bG9jaywgZmxhZ3MpOwotCQlnb3RvIGNsZWFudXA7Ci0JfQotCXhoY2lfc2V0dXBfaW5wdXRfY3R4X2Zvcl9jb25maWdfZXAoeGhjaSwgY29tbWFuZC0+aW5fY3R4LAotCQkJCQkgICB2aXJ0X2Rldi0+b3V0X2N0eCwgY3RybF9jdHgsCi0JCQkJCSAgIGVwX2ZsYWcsIGVwX2ZsYWcpOwotCXhoY2lfZW5kcG9pbnRfY29weSh4aGNpLCBjb21tYW5kLT5pbl9jdHgsIHZpcnRfZGV2LT5vdXRfY3R4LCBlcF9pbmRleCk7Ci0KLQl4aGNpX3F1ZXVlX2NvbmZpZ3VyZV9lbmRwb2ludCh4aGNpLCBjb21tYW5kLCBjb21tYW5kLT5pbl9jdHgtPmRtYSwKLQkJCQkgICAgIHVkZXYtPnNsb3RfaWQsIGZhbHNlKTsKLQl4aGNpX3JpbmdfY21kX2RiKHhoY2kpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhoY2ktPmxvY2ssIGZsYWdzKTsKLQotCXdhaXRfZm9yX2NvbXBsZXRpb24oY29tbWFuZC0+Y29tcGxldGlvbik7Ci0KLWNsZWFudXA6Ci0JdmlydF9lcC0+ZXBfc3RhdGUgJj0gfkVQX0NPTkZJR19QRU5ESU5HOwotCXhoY2lfZnJlZV9jb21tYW5kKHhoY2ksIGNvbW1hbmQpOworCS8qIEZvciBub3cganVzdCBwcmludCBkZWJ1ZyB0byBmb2xsb3cgdGhlIHNpdHVhdGlvbiAqLworCXhoY2lfZGJnKHhoY2ksICJFbmRwb2ludCAweCV4IGVwIHJlc2V0IGNhbGxiYWNrIGNhbGxlZFxuIiwKKwkJIGVwLT5kZXNjLmJFbmRwb2ludEFkZHJlc3MpOwogfQogCiBzdGF0aWMgaW50IHhoY2lfY2hlY2tfc3RyZWFtc19lbmRwb2ludChzdHJ1Y3QgeGhjaV9oY2QgKnhoY2ksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuaCBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCmluZGV4IDI2NWFiMTcuLjhlNDIxYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5oCkBAIC04NjUsOCArODY1LDYgQEAKICNkZWZpbmUgRVBfSEFTX1NUUkVBTVMJCSgxIDw8IDQpCiAvKiBUcmFuc2l0aW9uaW5nIHRoZSBlbmRwb2ludCB0byBub3QgdXNpbmcgc3RyZWFtcywgZG9uJ3QgZW5xdWV1ZSBVUkJzICovCiAjZGVmaW5lIEVQX0dFVFRJTkdfTk9fU1RSRUFNUwkoMSA8PCA1KQotI2RlZmluZSBFUF9SRUNFTlRMWV9IQUxURUQJKDEgPDwgNikKLSNkZWZpbmUgRVBfQ09ORklHX1BFTkRJTkcJKDEgPDwgNykKIAkvKiAtLS0tICBSZWxhdGVkIHRvIFVSQiBjYW5jZWxsYXRpb24gLS0tLSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJY2FuY2VsbGVkX3RkX2xpc3Q7CiAJc3RydWN0IHhoY2lfdGQJCSpzdG9wcGVkX3RkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaW1hZ2UvbWRjODAwLmMgYi9kcml2ZXJzL3VzYi9pbWFnZS9tZGM4MDAuYwppbmRleCBhNjI4NjVhLi41Y2YyNjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pbWFnZS9tZGM4MDAuYworKysgYi9kcml2ZXJzL3VzYi9pbWFnZS9tZGM4MDAuYwpAQCAtMzQ3LDcgKzM0Nyw4IEBACiB7CiAJbWRjODAwLT5jYW1lcmFfcmVxdWVzdF9yZWFkeT0xK21vZGU7CiAKLQl3YWl0X2V2ZW50X3RpbWVvdXQobWRjODAwLT5pcnFfd2FpdCwgbWRjODAwLT5pcnFfd29rZW4sIG1zZWMqSFovMTAwMCk7CisJd2FpdF9ldmVudF90aW1lb3V0KG1kYzgwMC0+aXJxX3dhaXQsIG1kYzgwMC0+aXJxX3dva2VuLAorCQkJICAgbXNlY3NfdG9famlmZmllcyhtc2VjKSk7CiAJbWRjODAwLT5pcnFfd29rZW4gPSAwOwogCiAJaWYgKG1kYzgwMC0+Y2FtZXJhX3JlcXVlc3RfcmVhZHk+MCkKQEAgLTc0Myw4ICs3NDQsOSBAQAogCQkJCQltdXRleF91bmxvY2soJm1kYzgwMC0+aW9fbG9jayk7CiAJCQkJCXJldHVybiBsZW4tbGVmdDsKIAkJCQl9Ci0JCQkJd2FpdF9ldmVudF90aW1lb3V0KG1kYzgwMC0+ZG93bmxvYWRfd2FpdCwgbWRjODAwLT5kb3dubG9hZGVkLAotCQkJCQkJCQkJCVRPX0RPV05MT0FEX0dFVF9SRUFEWSpIWi8xMDAwKTsKKwkJCQl3YWl0X2V2ZW50X3RpbWVvdXQobWRjODAwLT5kb3dubG9hZF93YWl0LAorCQkJCSAgICAgbWRjODAwLT5kb3dubG9hZGVkLAorCQkJCSAgICAgbXNlY3NfdG9famlmZmllcyhUT19ET1dOTE9BRF9HRVRfUkVBRFkpKTsKIAkJCQltZGM4MDAtPmRvd25sb2FkZWQgPSAwOwogCQkJCWlmIChtZGM4MDAtPmRvd25sb2FkX3VyYi0+c3RhdHVzICE9IDApCiAJCQkJewpAQCAtODY3LDcgKzg2OSw4IEBACiAJCQkJbXV0ZXhfdW5sb2NrKCZtZGM4MDAtPmlvX2xvY2spOwogCQkJCXJldHVybiAtRUlPOwogCQkJfQotCQkJd2FpdF9ldmVudF90aW1lb3V0KG1kYzgwMC0+d3JpdGVfd2FpdCwgbWRjODAwLT53cml0dGVuLCBUT19XUklURV9HRVRfUkVBRFkqSFovMTAwMCk7CisJCQl3YWl0X2V2ZW50X3RpbWVvdXQobWRjODAwLT53cml0ZV93YWl0LCBtZGM4MDAtPndyaXR0ZW4sCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoVE9fV1JJVEVfR0VUX1JFQURZKSk7CiAJCQltZGM4MDAtPndyaXR0ZW4gPSAwOwogCQkJaWYgKG1kYzgwMC0+c3RhdGUgPT0gV09SS0lORykKIAkJCXsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lzcDE3NjAvaXNwMTc2MC1jb3JlLmMgYi9kcml2ZXJzL3VzYi9pc3AxNzYwL2lzcDE3NjAtY29yZS5jCmluZGV4IGI5ODI3NTUuLmJmYTQwMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2lzcDE3NjAvaXNwMTc2MC1jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvaXNwMTc2MC9pc3AxNzYwLWNvcmUuYwpAQCAtMTUxLDggKzE1MSw3IEBACiAJfQogCiAJaWYgKElTX0VOQUJMRUQoQ09ORklHX1VTQl9JU1AxNzYxX1VEQykgJiYgIXVkY19kaXNhYmxlZCkgewotCQlyZXQgPSBpc3AxNzYwX3VkY19yZWdpc3Rlcihpc3AsIGlycSwgaXJxZmxhZ3MgfCBJUlFGX1NIQVJFRCB8Ci0JCQkJCSAgIElSUUZfRElTQUJMRUQpOworCQlyZXQgPSBpc3AxNzYwX3VkY19yZWdpc3Rlcihpc3AsIGlycSwgaXJxZmxhZ3MpOwogCQlpZiAocmV0IDwgMCkgewogCQkJaXNwMTc2MF9oY2RfdW5yZWdpc3RlcigmaXNwLT5oY2QpOwogCQkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2lzcDE3NjAvaXNwMTc2MC1oY2QuYyBiL2RyaXZlcnMvdXNiL2lzcDE3NjAvaXNwMTc2MC1oY2QuYwppbmRleCAzY2I5OGIxLi5hYzMxZDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9pc3AxNzYwL2lzcDE3NjAtaGNkLmMKKysrIGIvZHJpdmVycy91c2IvaXNwMTc2MC9pc3AxNzYwLWhjZC5jCkBAIC0xNzU4LDcgKzE3NTgsNyBAQAogCWludCBwb3J0cyA9IEhDU19OX1BPUlRTKHByaXYtPmhjc19wYXJhbXMpOwogCXUxNiB0ZW1wOwogCi0JZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsKKwlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSFVCOwogCS8qIHByaXYgMS4wLCAyLjMuOSBzYXlzIDIwbXMgbWF4ICovCiAJZGVzYy0+YlB3ck9uMlB3ckdvb2QgPSAxMDsKIAlkZXNjLT5iSHViQ29udHJDdXJyZW50ID0gMDsKQEAgLTE4NjksNyArMTg2OSw3IEBACiAJCQkJcmVnX3dyaXRlMzIoaGNkLT5yZWdzLCBIQ19QT1JUU0MxLAogCQkJCQkJCXRlbXAgfCBQT1JUX1JFU1VNRSk7CiAJCQkJcHJpdi0+cmVzZXRfZG9uZSA9IGppZmZpZXMgKwotCQkJCQltc2Vjc190b19qaWZmaWVzKDIwKTsKKwkJCQkJbXNlY3NfdG9famlmZmllcyhVU0JfUkVTVU1FX1RJTUVPVVQpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9pc3AxNzYwL2lzcDE3NjAtdWRjLmMgYi9kcml2ZXJzL3VzYi9pc3AxNzYwL2lzcDE3NjAtdWRjLmMKaW5kZXggOTYxMmQ3OS4uM2ZjNGZlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaXNwMTc2MC9pc3AxNzYwLXVkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2lzcDE3NjAvaXNwMTc2MC11ZGMuYwpAQCAtMTE5MSw2ICsxMTkxLDcgQEAKIAkJCSAgICAgc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IGlzcDE3NjBfdWRjICp1ZGMgPSBnYWRnZXRfdG9fdWRjKGdhZGdldCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCS8qIFRoZSBoYXJkd2FyZSBkb2Vzbid0IHN1cHBvcnQgbG93IHNwZWVkLiAqLwogCWlmIChkcml2ZXItPm1heF9zcGVlZCA8IFVTQl9TUEVFRF9GVUxMKSB7CkBAIC0xMTk4LDE3ICsxMTk5LDE3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNwaW5fbG9jaygmdWRjLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWRjLT5sb2NrLCBmbGFncyk7CiAKIAlpZiAodWRjLT5kcml2ZXIpIHsKIAkJZGV2X2Vycih1ZGMtPmlzcC0+ZGV2LCAiVURDIGFscmVhZHkgaGFzIGEgZ2FkZ2V0IGRyaXZlclxuIik7Ci0JCXNwaW5fdW5sb2NrKCZ1ZGMtPmxvY2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAl1ZGMtPmRyaXZlciA9IGRyaXZlcjsKIAotCXNwaW5fdW5sb2NrKCZ1ZGMtPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCiAJZGV2X2RiZyh1ZGMtPmlzcC0+ZGV2LCAic3RhcnRpbmcgVURDIHdpdGggZHJpdmVyICVzXG4iLAogCQlkcml2ZXItPmZ1bmN0aW9uKTsKQEAgLTEyMzIsNiArMTIzMyw3IEBACiBzdGF0aWMgaW50IGlzcDE3NjBfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKIHsKIAlzdHJ1Y3QgaXNwMTc2MF91ZGMgKnVkYyA9IGdhZGdldF90b191ZGMoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGV2X2RiZyh1ZGMtPmlzcC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKIApAQCAtMTIzOSw5ICsxMjQxLDkgQEAKIAogCWlzcDE3NjBfdWRjX3dyaXRlKHVkYywgRENfTU9ERSwgMCk7CiAKLQlzcGluX2xvY2soJnVkYy0+bG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkYy0+bG9jaywgZmxhZ3MpOwogCXVkYy0+ZHJpdmVyID0gTlVMTDsKLQlzcGluX3VubG9jaygmdWRjLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1ZGMtPmxvY2ssIGZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTQxMSw3ICsxNDEzLDcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWYgKGNoaXBpZCAhPSAweDAwMDExNTgyKSB7CisJaWYgKGNoaXBpZCAhPSAweDAwMDExNTgyICYmIGNoaXBpZCAhPSAweDAwMTU4MjEwKSB7CiAJCWRldl9lcnIodWRjLT5pc3AtPmRldiwgInVkYzogaW52YWxpZCBjaGlwIElEIDB4JTA4eFxuIiwgY2hpcGlkKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTQ1MSw4ICsxNDUzLDggQEAKIAogCXNwcmludGYodWRjLT5pcnFuYW1lLCAiJXMgKHVkYykiLCBkZXZuYW1lKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgaXNwMTc2MF91ZGNfaXJxLCBJUlFGX1NIQVJFRCB8IElSUUZfRElTQUJMRUQgfAotCQkJICBpcnFmbGFncywgdWRjLT5pcnFuYW1lLCB1ZGMpOworCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgaXNwMTc2MF91ZGNfaXJxLCBJUlFGX1NIQVJFRCB8IGlycWZsYWdzLAorCQkJICB1ZGMtPmlycW5hbWUsIHVkYyk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyb3I7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL21pc2MvS2NvbmZpZwppbmRleCA3NmQ3NzIwLi5mN2E3ZmMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvbWlzYy9LY29uZmlnCkBAIC0yNTUsMyArMjU1LDE2IEBACiAJICBUaGlzIGRyaXZlciBpcyBmb3IgZ2VuZXJhdGluZyBzcGVjaWZpYyB0cmFmZmljIGZvciBTdXBlciBTcGVlZCBMaW5rCiAJICBMYXllciBUZXN0IERldmljZS4gU2F5IFkgb25seSB3aGVuIHlvdSB3YW50IHRvIGNvbmR1Y3QgVVNCIFN1cGVyIFNwZWVkCiAJICBMaW5rIExheWVyIFRlc3QgZm9yIGhvc3QgY29udHJvbGxlcnMuCisKK2NvbmZpZyBVU0JfQ0hBT1NLRVkKKwl0cmlzdGF0ZSAiQ2hhb3NLZXkgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgZHJpdmVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBIV19SQU5ET00KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgYW4gQWx0dXNNZXRydW0gQ2hhb3NLZXkgdG8KKwkgIHlvdXIgY29tcHV0ZXIncyBVU0IgcG9ydC4gVGhlIENoYW9zS2V5IGlzIGEgaGFyZHdhcmUgcmFuZG9tCisJICBudW1iZXIgZ2VuZXJhdG9yIHdoaWNoIGhvb2tzIGludG8gdGhlIGtlcm5lbCBlbnRyb3B5IHBvb2wgdG8KKwkgIGVuc3VyZSBhIGxhcmdlIHN1cHBseSBvZiBlbnRyb3B5IGZvciAvZGV2L3JhbmRvbSBhbmQKKwkgIC9kZXYvdXJhbmRvbSBhbmQgYWxzbyBwcm92aWRlcyBkaXJlY3QgYWNjZXNzIHZpYSAvZGV2L2NoYW9za2V5WAorCisJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKKwkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjaGFvc2tleS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9taXNjL01ha2VmaWxlCmluZGV4IDY1YjA0MDIuLjQ1ZmQ0YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvbWlzYy9NYWtlZmlsZQpAQCAtMjUsNiArMjUsNyBAQAogb2JqLSQoQ09ORklHX1VTQl9TRVZTRUcpCQkrPSB1c2JzZXZzZWcubwogb2JqLSQoQ09ORklHX1VTQl9ZVVJFWCkJCQkrPSB5dXJleC5vCiBvYmotJChDT05GSUdfVVNCX0hTSUNfVVNCMzUwMykJCSs9IHVzYjM1MDMubworb2JqLSQoQ09ORklHX1VTQl9DSEFPU0tFWSkJCSs9IGNoYW9za2V5Lm8KIAogb2JqLSQoQ09ORklHX1VTQl9TSVNVU0JWR0EpCQkrPSBzaXN1c2J2Z2EvCiBvYmotJChDT05GSUdfVVNCX0xJTktfTEFZRVJfVEVTVCkJKz0gbHZzdGVzdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jIGIvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYwppbmRleCBiM2QyNDVlLi5hMGEzODI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMKQEAgLTMyOSw3ICszMjksNyBAQAogCQkJCQlwZGF0YS0+dXJiZGF0YSwgcGRhdGEtPnVyYi0+dHJhbnNmZXJfZG1hKTsKIAkJCXVzYl9mcmVlX3VyYihwZGF0YS0+dXJiKTsKIAkJfQotCQlpZiAocGRhdGEtPmJkICYmICFJU19FUlIocGRhdGEtPmJkKSkKKwkJaWYgKCFJU19FUlIocGRhdGEtPmJkKSkKIAkJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihwZGF0YS0+YmQpOwogCQlrZnJlZShwZGF0YS0+bXNnZGF0YSk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy9jaGFvc2tleS5jIGIvZHJpdmVycy91c2IvbWlzYy9jaGFvc2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDVkMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9taXNjL2NoYW9za2V5LmMKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisgKiBjaGFvc2tleSAtIGRyaXZlciBmb3IgQ2hhb3NLZXkgZGV2aWNlIGZyb20gQWx0dXMgTWV0cnVtLgorICoKKyAqIFRoaXMgZGV2aWNlIHByb3ZpZGVzIHRydWUgcmFuZG9tIG51bWJlcnMgdXNpbmcgYSBub2lzZSBzb3VyY2UgYmFzZWQKKyAqIG9uIGEgcmV2ZXJzZS1iaWFzZWQgcC1uIGp1bmN0aW9uIGluIGF2YWxhbmNoZSBicmVha2Rvd24uIE1vcmUKKyAqIGRldGFpbHMgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9jaGFvc2tleS5vcmcKKyAqCisgKiBUaGUgZHJpdmVyIGNvbm5lY3RzIHRvIHRoZSBrZXJuZWwgaGFyZHdhcmUgUk5HIGludGVyZmFjZSB0byBwcm92aWRlCisgKiBlbnRyb3B5IGZvciAvZGV2L3JhbmRvbSBhbmQgb3RoZXIga2VybmVsIGFjdGl2aXRpZXMuIEl0IGFsc28gb2ZmZXJzCisgKiBhIHNlcGFyYXRlIC9kZXYvIGVudHJ5IHRvIGFsbG93IGZvciBkaXJlY3QgYWNjZXNzIHRvIHRoZSByYW5kb20KKyAqIGJpdCBzdHJlYW0uCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTUgS2VpdGggUGFja2FyZCA8a2VpdGhwQGtlaXRocC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgkgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9od19yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIGNoYW9za2V5X2RyaXZlcjsKK3N0YXRpYyBzdHJ1Y3QgdXNiX2NsYXNzX2RyaXZlciBjaGFvc2tleV9jbGFzczsKK3N0YXRpYyBpbnQgY2hhb3NrZXlfcm5nX3JlYWQoc3RydWN0IGh3cm5nICpybmcsIHZvaWQgKmRhdGEsCisJCQkgICAgIHNpemVfdCBtYXgsIGJvb2wgd2FpdCk7CisKKyNkZWZpbmUgdXNiX2RiZyh1c2JfaWYsIGZvcm1hdCwgYXJnLi4uKSBcCisJZGV2X2RiZygmKHVzYl9pZiktPmRldiwgZm9ybWF0LCAjIyBhcmcpCisKKyNkZWZpbmUgdXNiX2Vycih1c2JfaWYsIGZvcm1hdCwgYXJnLi4uKSBcCisJZGV2X2VycigmKHVzYl9pZiktPmRldiwgZm9ybWF0LCAjIyBhcmcpCisKKy8qIFZlcnNpb24gSW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JInYwLjEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IJIktlaXRoIFBhY2thcmQsIGtlaXRocEBrZWl0aHAuY29tIgorI2RlZmluZSBEUklWRVJfREVTQwkiQWx0dXMgTWV0cnVtIENoYW9zS2V5IGRyaXZlciIKKyNkZWZpbmUgRFJJVkVSX1NIT1JUCSJjaGFvc2tleSIKKworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgQ0hBT1NLRVlfVkVORE9SX0lECTB4MWQ1MAkvKiBPcGVuTW9rbyAqLworI2RlZmluZSBDSEFPU0tFWV9QUk9EVUNUX0lECTB4NjBjNgkvKiBDaGFvc0tleSAqLworCisjZGVmaW5lIENIQU9TS0VZX0JVRl9MRU4JNjQJLyogbWF4IHNpemUgb2YgVVNCIGZ1bGwgc3BlZWQgcGFja2V0ICovCisKKyNkZWZpbmUgTkFLX1RJTUVPVVQgKEhaKQkJLyogc3RhbGwvd2FpdCB0aW1lb3V0IGZvciBkZXZpY2UgKi8KKworI2lmZGVmIENPTkZJR19VU0JfRFlOQU1JQ19NSU5PUlMKKyNkZWZpbmUgVVNCX0NIQU9TS0VZX01JTk9SX0JBU0UgMAorI2Vsc2UKKworLyogSU9XQVJSSU9SX01JTk9SX0JBU0UgKyAxNiwgbm90IG9mZmljaWFsIHlldCAqLworI2RlZmluZSBVU0JfQ0hBT1NLRVlfTUlOT1JfQkFTRSAyMjQKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgY2hhb3NrZXlfdGFibGVbXSA9IHsKKwl7IFVTQl9ERVZJQ0UoQ0hBT1NLRVlfVkVORE9SX0lELCBDSEFPU0tFWV9QUk9EVUNUX0lEKSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgY2hhb3NrZXlfdGFibGUpOworCisvKiBEcml2ZXItbG9jYWwgc3BlY2lmaWMgc3R1ZmYgKi8KK3N0cnVjdCBjaGFvc2tleSB7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKwljaGFyIGluX2VwOworCXN0cnVjdCBtdXRleCBsb2NrOworCXN0cnVjdCBtdXRleCBybmdfbG9jazsKKwlpbnQgb3BlbjsJCQkvKiBvcGVuIGNvdW50ICovCisJaW50IHByZXNlbnQ7CQkJLyogZGV2aWNlIG5vdCBkaXNjb25uZWN0ZWQgKi8KKwlpbnQgc2l6ZTsJCQkvKiBzaXplIG9mIGJ1ZiAqLworCWludCB2YWxpZDsJCQkvKiBieXRlcyBvZiBidWYgcmVhZCAqLworCWludCB1c2VkOwkJCS8qIGJ5dGVzIG9mIGJ1ZiBjb25zdW1lZCAqLworCWNoYXIgKm5hbWU7CQkJLyogcHJvZHVjdCArIHNlcmlhbCAqLworCXN0cnVjdCBod3JuZyBod3JuZzsJCS8qIEVtYmVkZGVkIHN0cnVjdCBmb3IgaHdybmcgKi8KKwlpbnQgaHdybmdfcmVnaXN0ZXJlZDsJCS8qIHJlZ2lzdGVyZWQgd2l0aCBod3JuZyBBUEkgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3E7CS8qIGZvciB0aW1lb3V0cyAqLworCWNoYXIgKmJ1ZjsKK307CisKK3N0YXRpYyB2b2lkIGNoYW9za2V5X2ZyZWUoc3RydWN0IGNoYW9za2V5ICpkZXYpCit7CisJdXNiX2RiZyhkZXYtPmludGVyZmFjZSwgImZyZWUiKTsKKwlrZnJlZShkZXYtPm5hbWUpOworCWtmcmVlKGRldi0+YnVmKTsKKwlrZnJlZShkZXYpOworfQorCitzdGF0aWMgaW50IGNoYW9za2V5X3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQkgIGNvbnN0IHN0cnVjdCB1c2JfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoaW50ZXJmYWNlKTsKKwlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHRzZXR0aW5nID0gaW50ZXJmYWNlLT5jdXJfYWx0c2V0dGluZzsKKwlpbnQgaTsKKwlpbnQgaW5fZXAgPSAtMTsKKwlzdHJ1Y3QgY2hhb3NrZXkgKmRldjsKKwlpbnQgcmVzdWx0OworCWludCBzaXplOworCisJdXNiX2RiZyhpbnRlcmZhY2UsICJwcm9iZSAlcy0lcyIsIHVkZXYtPnByb2R1Y3QsIHVkZXYtPnNlcmlhbCk7CisKKwkvKiBGaW5kIHRoZSBmaXJzdCBidWxrIElOIGVuZHBvaW50IGFuZCBpdHMgcGFja2V0IHNpemUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzOyBpKyspIHsKKwkJaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX2luKCZhbHRzZXR0aW5nLT5lbmRwb2ludFtpXS5kZXNjKSkgeworCQkJaW5fZXAgPSB1c2JfZW5kcG9pbnRfbnVtKCZhbHRzZXR0aW5nLT5lbmRwb2ludFtpXS5kZXNjKTsKKwkJCXNpemUgPSB1c2JfZW5kcG9pbnRfbWF4cCgmYWx0c2V0dGluZy0+ZW5kcG9pbnRbaV0uZGVzYyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFZhbGlkYXRlIGVuZHBvaW50IGFuZCBzaXplICovCisJaWYgKGluX2VwID09IC0xKSB7CisJCXVzYl9kYmcoaW50ZXJmYWNlLCAibm8gSU4gZW5kcG9pbnQgZm91bmQiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChzaXplIDw9IDApIHsKKwkJdXNiX2RiZyhpbnRlcmZhY2UsICJpbnZhbGlkIHNpemUgKCVkKSIsIHNpemUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoc2l6ZSA+IENIQU9TS0VZX0JVRl9MRU4pIHsKKwkJdXNiX2RiZyhpbnRlcmZhY2UsICJzaXplIHJlZHVjZWQgZnJvbSAlZCB0byAlZFxuIiwKKwkJCXNpemUsIENIQU9TS0VZX0JVRl9MRU4pOworCQlzaXplID0gQ0hBT1NLRVlfQlVGX0xFTjsKKwl9CisKKwkvKiBMb29rcyBnb29kLCBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSAqLworCisJZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNoYW9za2V5KSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2LT5idWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCisJaWYgKGRldi0+YnVmID09IE5VTEwpIHsKKwkJa2ZyZWUoZGV2KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogQ29uc3RydWN0IGEgbmFtZSB1c2luZyB0aGUgcHJvZHVjdCBhbmQgc2VyaWFsIHZhbHVlcy4gRWFjaAorCSAqIGRldmljZSBuZWVkcyBhIHVuaXF1ZSBuYW1lIGZvciB0aGUgaHdybmcgY29kZQorCSAqLworCisJaWYgKHVkZXYtPnByb2R1Y3QgJiYgdWRldi0+c2VyaWFsKSB7CisJCWRldi0+bmFtZSA9IGttYWxsb2Moc3RybGVuKHVkZXYtPnByb2R1Y3QpICsgMSArCisJCQkJICAgIHN0cmxlbih1ZGV2LT5zZXJpYWwpICsgMSwgR0ZQX0tFUk5FTCk7CisJCWlmIChkZXYtPm5hbWUgPT0gTlVMTCkgeworCQkJa2ZyZWUoZGV2LT5idWYpOworCQkJa2ZyZWUoZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJc3RyY3B5KGRldi0+bmFtZSwgdWRldi0+cHJvZHVjdCk7CisJCXN0cmNhdChkZXYtPm5hbWUsICItIik7CisJCXN0cmNhdChkZXYtPm5hbWUsIHVkZXYtPnNlcmlhbCk7CisJfQorCisJZGV2LT5pbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisKKwlkZXYtPmluX2VwID0gaW5fZXA7CisKKwlkZXYtPnNpemUgPSBzaXplOworCWRldi0+cHJlc2VudCA9IDE7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndhaXRfcSk7CisKKwltdXRleF9pbml0KCZkZXYtPmxvY2spOworCW11dGV4X2luaXQoJmRldi0+cm5nX2xvY2spOworCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGRldik7CisKKwlyZXN1bHQgPSB1c2JfcmVnaXN0ZXJfZGV2KGludGVyZmFjZSwgJmNoYW9za2V5X2NsYXNzKTsKKwlpZiAocmVzdWx0KSB7CisJCXVzYl9lcnIoaW50ZXJmYWNlLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1pbm9yIG51bWJlci4iKTsKKwkJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIE5VTEwpOworCQljaGFvc2tleV9mcmVlKGRldik7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJZGV2LT5od3JuZy5uYW1lID0gZGV2LT5uYW1lID8gZGV2LT5uYW1lIDogY2hhb3NrZXlfZHJpdmVyLm5hbWU7CisJZGV2LT5od3JuZy5yZWFkID0gY2hhb3NrZXlfcm5nX3JlYWQ7CisKKwkvKiBTZXQgdGhlICdxdWFsaXR5JyBtZXRyaWMuICBRdWFsaXR5IGlzIG1lYXN1cmVkIGluIHVuaXRzIG9mCisJICogMS8xMDI0J3Mgb2YgYSBiaXQgKCJtaWxscyIpLiBUaGlzIHNob3VsZCBiZSBzZXQgdG8gMTAyNCwKKwkgKiBidXQgdGhlcmUgaXMgYSBidWcgaW4gdGhlIGh3cm5nIGNvcmUgd2hpY2ggbWFza3MgaXQgd2l0aAorCSAqIDEwMjMuCisJICoKKwkgKiBUaGUgcGF0Y2ggdGhhdCBoYXMgYmVlbiBtZXJnZWQgdG8gdGhlIGNyeXB0byBkZXZlbG9wbWVudAorCSAqIHRyZWUgZm9yIHRoYXQgYnVnIGxpbWl0cyB0aGUgdmFsdWUgdG8gMTAyNCBhdCBtb3N0LCBzbyBieQorCSAqIHNldHRpbmcgdGhpcyB0byAxMDI0ICsgMTAyMywgd2UgZ2V0IDEwMjMgYmVmb3JlIHRoZSBmaXggaXMKKwkgKiBtZXJnZWQgYW5kIDEwMjQgYWZ0ZXJ3YXJkcy4gV2UnbGwgcGF0Y2ggdGhpcyBkcml2ZXIgb25jZQorCSAqIGJvdGggYml0cyBvZiBjb2RlIGFyZSBpbiB0aGUgc2FtZSB0cmVlLgorCSAqLworCWRldi0+aHdybmcucXVhbGl0eSA9IDEwMjQgKyAxMDIzOworCisJZGV2LT5od3JuZ19yZWdpc3RlcmVkID0gKGh3cm5nX3JlZ2lzdGVyKCZkZXYtPmh3cm5nKSA9PSAwKTsKKwlpZiAoIWRldi0+aHdybmdfcmVnaXN0ZXJlZCkKKwkJdXNiX2VycihpbnRlcmZhY2UsICJVbmFibGUgdG8gcmVnaXN0ZXIgd2l0aCBod3JuZyIpOworCisJdXNiX2VuYWJsZV9hdXRvc3VzcGVuZCh1ZGV2KTsKKworCXVzYl9kYmcoaW50ZXJmYWNlLCAiY2hhb3NrZXkgcHJvYmUgc3VjY2Vzcywgc2l6ZSAlZCIsIGRldi0+c2l6ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoYW9za2V5X2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlzdHJ1Y3QgY2hhb3NrZXkJKmRldjsKKworCXVzYl9kYmcoaW50ZXJmYWNlLCAiZGlzY29ubmVjdCIpOworCWRldiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50ZXJmYWNlKTsKKwlpZiAoIWRldikgeworCQl1c2JfZGJnKGludGVyZmFjZSwgImRpc2Nvbm5lY3QgZmFpbGVkIC0gbm8gZGV2Iik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZGV2LT5od3JuZ19yZWdpc3RlcmVkKQorCQlod3JuZ191bnJlZ2lzdGVyKCZkZXYtPmh3cm5nKTsKKworCXVzYl9kZXJlZ2lzdGVyX2RldihpbnRlcmZhY2UsICZjaGFvc2tleV9jbGFzcyk7CisKKwl1c2Jfc2V0X2ludGZkYXRhKGludGVyZmFjZSwgTlVMTCk7CisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKworCWRldi0+cHJlc2VudCA9IDA7CisKKwlpZiAoIWRldi0+b3BlbikgeworCQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJCWNoYW9za2V5X2ZyZWUoZGV2KTsKKwl9IGVsc2UKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCisJdXNiX2RiZyhpbnRlcmZhY2UsICJkaXNjb25uZWN0IGRvbmUiKTsKK30KKworc3RhdGljIGludCBjaGFvc2tleV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjaGFvc2tleSAqZGV2OworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2U7CisKKwkvKiBnZXQgdGhlIGludGVyZmFjZSBmcm9tIG1pbm9yIG51bWJlciBhbmQgZHJpdmVyIGluZm9ybWF0aW9uICovCisJaW50ZXJmYWNlID0gdXNiX2ZpbmRfaW50ZXJmYWNlKCZjaGFvc2tleV9kcml2ZXIsIGltaW5vcihpbm9kZSkpOworCWlmICghaW50ZXJmYWNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXVzYl9kYmcoaW50ZXJmYWNlLCAib3BlbiIpOworCisJZGV2ID0gdXNiX2dldF9pbnRmZGF0YShpbnRlcmZhY2UpOworCWlmICghZGV2KSB7CisJCXVzYl9kYmcoaW50ZXJmYWNlLCAib3BlbiAoZGV2KSIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXY7CisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwkrK2Rldi0+b3BlbjsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisKKwl1c2JfZGJnKGludGVyZmFjZSwgIm9wZW4gc3VjY2VzcyIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoYW9za2V5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNoYW9za2V5ICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGVyZmFjZTsKKworCWlmIChkZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpbnRlcmZhY2UgPSBkZXYtPmludGVyZmFjZTsKKworCXVzYl9kYmcoaW50ZXJmYWNlLCAicmVsZWFzZSIpOworCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKworCXVzYl9kYmcoaW50ZXJmYWNlLCAib3BlbiBjb3VudCBhdCByZWxlYXNlIGlzICVkIiwgZGV2LT5vcGVuKTsKKworCWlmIChkZXYtPm9wZW4gPD0gMCkgeworCQl1c2JfZGJnKGludGVyZmFjZSwgImludmFsaWQgb3BlbiBjb3VudCAoJWQpIiwgZGV2LT5vcGVuKTsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwktLWRldi0+b3BlbjsKKworCWlmICghZGV2LT5wcmVzZW50KSB7CisJCWlmIChkZXYtPm9wZW4gPT0gMCkgeworCQkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCQkJY2hhb3NrZXlfZnJlZShkZXYpOworCQl9IGVsc2UKKwkJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwl9IGVsc2UKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCisJdXNiX2RiZyhpbnRlcmZhY2UsICJyZWxlYXNlIHN1Y2Nlc3MiKTsKKwlyZXR1cm4gMDsKK30KKworLyogRmlsbCB0aGUgYnVmZmVyLiBDYWxsZWQgd2l0aCBkZXYtPmxvY2sgaGVsZAorICovCitzdGF0aWMgaW50IF9jaGFvc2tleV9maWxsKHN0cnVjdCBjaGFvc2tleSAqZGV2KQoreworCURFRklORV9XQUlUKHdhaXQpOworCWludCByZXN1bHQ7CisJaW50IHRoaXNfcmVhZDsKKwlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldiA9IGludGVyZmFjZV90b191c2JkZXYoZGV2LT5pbnRlcmZhY2UpOworCisJdXNiX2RiZyhkZXYtPmludGVyZmFjZSwgImZpbGwiKTsKKworCS8qIFJldHVybiBpbW1lZGlhdGVseSBpZiBzb21lb25lIGNhbGxlZCBiZWZvcmUgdGhlIGJ1ZmZlciB3YXMKKwkgKiBlbXB0eSAqLworCWlmIChkZXYtPnZhbGlkICE9IGRldi0+dXNlZCkgeworCQl1c2JfZGJnKGRldi0+aW50ZXJmYWNlLCAibm90IGVtcHR5IHlldCAodmFsaWQgJWQgdXNlZCAlZCkiLAorCQkJZGV2LT52YWxpZCwgZGV2LT51c2VkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQmFpbCBpZiB0aGUgZGV2aWNlIGhhcyBiZWVuIHJlbW92ZWQgKi8KKwlpZiAoIWRldi0+cHJlc2VudCkgeworCQl1c2JfZGJnKGRldi0+aW50ZXJmYWNlLCAiZGV2aWNlIG5vdCBwcmVzZW50Iik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIE1ha2Ugc3VyZSB0aGUgZGV2aWNlIGlzIGF3YWtlICovCisJcmVzdWx0ID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKGRldi0+aW50ZXJmYWNlKTsKKwlpZiAocmVzdWx0KSB7CisJCXVzYl9kYmcoZGV2LT5pbnRlcmZhY2UsICJ3YWtldXAgZmFpbGVkIChyZXN1bHQgJWQpIiwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlyZXN1bHQgPSB1c2JfYnVsa19tc2codWRldiwKKwkJCSAgICAgIHVzYl9yY3ZidWxrcGlwZSh1ZGV2LCBkZXYtPmluX2VwKSwKKwkJCSAgICAgIGRldi0+YnVmLCBkZXYtPnNpemUsICZ0aGlzX3JlYWQsCisJCQkgICAgICBOQUtfVElNRU9VVCk7CisKKwkvKiBMZXQgdGhlIGRldmljZSBnbyBiYWNrIHRvIHNsZWVwIGV2ZW50dWFsbHkgKi8KKwl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2UoZGV2LT5pbnRlcmZhY2UpOworCisJaWYgKHJlc3VsdCA9PSAwKSB7CisJCWRldi0+dmFsaWQgPSB0aGlzX3JlYWQ7CisJCWRldi0+dXNlZCA9IDA7CisJfQorCisJdXNiX2RiZyhkZXYtPmludGVyZmFjZSwgImJ1bGtfbXNnIHJlc3VsdCAlZCB0aGlzX3JlYWQgJWQiLAorCQlyZXN1bHQsIHRoaXNfcmVhZCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgc3NpemVfdCBjaGFvc2tleV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJICAgICBzaXplX3QgY291bnQsCisJCQkgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgY2hhb3NrZXkgKmRldjsKKwlzc2l6ZV90IHJlYWRfY291bnQgPSAwOworCWludCB0aGlzX3RpbWU7CisJaW50IHJlc3VsdCA9IDA7CisJdW5zaWduZWQgbG9uZyByZW1haW47CisKKwlkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoZGV2ID09IE5VTEwgfHwgIWRldi0+cHJlc2VudCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl1c2JfZGJnKGRldi0+aW50ZXJmYWNlLCAicmVhZCAlenUiLCBjb3VudCk7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisKKwkJLyogR3JhYiB0aGUgcm5nX2xvY2sgYnJpZWZseSB0byBlbnN1cmUgdGhhdCB0aGUgaHdybmcgaW50ZXJmYWNlCisJCSAqIGdldHMgcHJpb3JpdHkgb3ZlciBvdGhlciB1c2VyIGFjY2VzcworCQkgKi8KKwkJcmVzdWx0ID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZkZXYtPnJuZ19sb2NrKTsKKwkJaWYgKHJlc3VsdCkKKwkJCWdvdG8gYmFpbDsKKwkJbXV0ZXhfdW5sb2NrKCZkZXYtPnJuZ19sb2NrKTsKKworCQlyZXN1bHQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmRldi0+bG9jayk7CisJCWlmIChyZXN1bHQpCisJCQlnb3RvIGJhaWw7CisJCWlmIChkZXYtPnZhbGlkID09IGRldi0+dXNlZCkgeworCQkJcmVzdWx0ID0gX2NoYW9za2V5X2ZpbGwoZGV2KTsKKwkJCWlmIChyZXN1bHQpIHsKKwkJCQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJCQkJZ290byBiYWlsOworCQkJfQorCisJCQkvKiBSZWFkIHJldHVybmVkIHplcm8gYnl0ZXMgKi8KKwkJCWlmIChkZXYtPnVzZWQgPT0gZGV2LT52YWxpZCkgeworCQkJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwkJCQlnb3RvIGJhaWw7CisJCQl9CisJCX0KKworCQl0aGlzX3RpbWUgPSBkZXYtPnZhbGlkIC0gZGV2LT51c2VkOworCQlpZiAodGhpc190aW1lID4gY291bnQpCisJCQl0aGlzX3RpbWUgPSBjb3VudDsKKworCQlyZW1haW4gPSBjb3B5X3RvX3VzZXIoYnVmZmVyLCBkZXYtPmJ1ZiArIGRldi0+dXNlZCwgdGhpc190aW1lKTsKKwkJaWYgKHJlbWFpbikgeworCQkJcmVzdWx0ID0gLUVGQVVMVDsKKworCQkJLyogQ29uc3VtZSB0aGUgYnl0ZXMgdGhhdCB3ZXJlIGNvcGllZCBzbyB3ZSBkb24ndCBsZWFrCisJCQkgKiBkYXRhIHRvIHVzZXIgc3BhY2UKKwkJCSAqLworCQkJZGV2LT51c2VkICs9IHRoaXNfdGltZSAtIHJlbWFpbjsKKwkJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCisJCWNvdW50IC09IHRoaXNfdGltZTsKKwkJcmVhZF9jb3VudCArPSB0aGlzX3RpbWU7CisJCWJ1ZmZlciArPSB0aGlzX3RpbWU7CisJCWRldi0+dXNlZCArPSB0aGlzX3RpbWU7CisJCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKwl9CitiYWlsOgorCWlmIChyZWFkX2NvdW50KSB7CisJCXVzYl9kYmcoZGV2LT5pbnRlcmZhY2UsICJyZWFkICV6dSBieXRlcyIsIHJlYWRfY291bnQpOworCQlyZXR1cm4gcmVhZF9jb3VudDsKKwl9CisJdXNiX2RiZyhkZXYtPmludGVyZmFjZSwgImVtcHR5IHJlYWQsIHJlc3VsdCAlZCIsIHJlc3VsdCk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCBjaGFvc2tleV9ybmdfcmVhZChzdHJ1Y3QgaHdybmcgKnJuZywgdm9pZCAqZGF0YSwKKwkJCSAgICAgc2l6ZV90IG1heCwgYm9vbCB3YWl0KQoreworCXN0cnVjdCBjaGFvc2tleSAqZGV2ID0gY29udGFpbmVyX29mKHJuZywgc3RydWN0IGNoYW9za2V5LCBod3JuZyk7CisJaW50IHRoaXNfdGltZTsKKworCXVzYl9kYmcoZGV2LT5pbnRlcmZhY2UsICJybmdfcmVhZCBtYXggJXp1IHdhaXQgJWQiLCBtYXgsIHdhaXQpOworCisJaWYgKCFkZXYtPnByZXNlbnQpIHsKKwkJdXNiX2RiZyhkZXYtPmludGVyZmFjZSwgImRldmljZSBub3QgcHJlc2VudCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBIb2xkIHRoZSBybmdfbG9jayB1bnRpbCB3ZSBhY3F1aXJlIHRoZSBkZXZpY2UgbG9jayBzbyB0aGF0CisJICogdGhpcyBvcGVyYXRpb24gZ2V0cyBwcmlvcml0eSBvdmVyIG90aGVyIHVzZXIgYWNjZXNzIHRvIHRoZQorCSAqIGRldmljZQorCSAqLworCW11dGV4X2xvY2soJmRldi0+cm5nX2xvY2spOworCisJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKworCW11dGV4X3VubG9jaygmZGV2LT5ybmdfbG9jayk7CisKKwkvKiBUcnkgdG8gZmlsbCB0aGUgYnVmZmVyIGlmIGVtcHR5LiBJdCBkb2Vzbid0IGFjdHVhbGx5IG1hdHRlcgorCSAqIGlmIF9jaGFvc2tleV9maWxsIHdvcmtzOyB3ZSdsbCBqdXN0IHJldHVybiB6ZXJvIGJ5dGVzIGFzCisJICogdGhlIGJ1ZmZlciB3aWxsIHN0aWxsIGJlIGVtcHR5CisJICovCisJaWYgKGRldi0+dmFsaWQgPT0gZGV2LT51c2VkKQorCQkodm9pZCkgX2NoYW9za2V5X2ZpbGwoZGV2KTsKKworCXRoaXNfdGltZSA9IGRldi0+dmFsaWQgLSBkZXYtPnVzZWQ7CisJaWYgKHRoaXNfdGltZSA+IG1heCkKKwkJdGhpc190aW1lID0gbWF4OworCisJbWVtY3B5KGRhdGEsIGRldi0+YnVmLCB0aGlzX3RpbWUpOworCisJZGV2LT51c2VkICs9IHRoaXNfdGltZTsKKworCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKKworCXVzYl9kYmcoZGV2LT5pbnRlcmZhY2UsICJybmdfcmVhZCB0aGlzX3RpbWUgJWRcbiIsIHRoaXNfdGltZSk7CisJcmV0dXJuIHRoaXNfdGltZTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBjaGFvc2tleV9zdXNwZW5kKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UsCisJCQkgICAgcG1fbWVzc2FnZV90IG1lc3NhZ2UpCit7CisJdXNiX2RiZyhpbnRlcmZhY2UsICJzdXNwZW5kIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hhb3NrZXlfcmVzdW1lKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJdXNiX2RiZyhpbnRlcmZhY2UsICJyZXN1bWUiKTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGNoYW9za2V5X3N1c3BlbmQgTlVMTAorI2RlZmluZSBjaGFvc2tleV9yZXN1bWUgTlVMTAorI2VuZGlmCisKKy8qIGZpbGUgb3BlcmF0aW9uIHBvaW50ZXJzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaGFvc2tleV9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5yZWFkID0gY2hhb3NrZXlfcmVhZCwKKwkub3BlbiA9IGNoYW9za2V5X29wZW4sCisJLnJlbGVhc2UgPSBjaGFvc2tleV9yZWxlYXNlLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKKy8qIGNsYXNzIGRyaXZlciBpbmZvcm1hdGlvbiAqLworc3RhdGljIHN0cnVjdCB1c2JfY2xhc3NfZHJpdmVyIGNoYW9za2V5X2NsYXNzID0geworCS5uYW1lID0gImNoYW9za2V5JWQiLAorCS5mb3BzID0gJmNoYW9za2V5X2ZvcHMsCisJLm1pbm9yX2Jhc2UgPSBVU0JfQ0hBT1NLRVlfTUlOT1JfQkFTRSwKK307CisKKy8qIHVzYiBzcGVjaWZpYyBvYmplY3QgbmVlZGVkIHRvIHJlZ2lzdGVyIHRoaXMgZHJpdmVyIHdpdGggdGhlIHVzYiBzdWJzeXN0ZW0gKi8KK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciBjaGFvc2tleV9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUklWRVJfU0hPUlQsCisJLnByb2JlID0gY2hhb3NrZXlfcHJvYmUsCisJLmRpc2Nvbm5lY3QgPSBjaGFvc2tleV9kaXNjb25uZWN0LAorCS5zdXNwZW5kID0gY2hhb3NrZXlfc3VzcGVuZCwKKwkucmVzdW1lID0gY2hhb3NrZXlfcmVzdW1lLAorCS5yZXNldF9yZXN1bWUgPSBjaGFvc2tleV9yZXN1bWUsCisJLmlkX3RhYmxlID0gY2hhb3NrZXlfdGFibGUsCisJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKK307CisKK21vZHVsZV91c2JfZHJpdmVyKGNoYW9za2V5X2RyaXZlcik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMgYi9kcml2ZXJzL3VzYi9taXNjL2xlZ291c2J0b3dlci5jCmluZGV4IDk3Y2Q5ZTIuLjc3NzFiZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MvbGVnb3VzYnRvd2VyLmMKKysrIGIvZHJpdmVycy91c2IvbWlzYy9sZWdvdXNidG93ZXIuYwpAQCAtNTc0LDcgKzU3NCw3IEBACiAJfQogCiAJaWYgKHJlYWRfdGltZW91dCkgewotCQl0aW1lb3V0ID0gamlmZmllcyArIHJlYWRfdGltZW91dCAqIEhaIC8gMTAwMDsKKwkJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHJlYWRfdGltZW91dCk7CiAJfQogCiAJLyogd2FpdCBmb3IgZGF0YSAqLwpAQCAtNTkyLDcgKzU5Miw3IEBACiAJCS8qIHJlc2V0IHJlYWQgdGltZW91dCBkdXJpbmcgcmVhZCBvciB3cml0ZSBhY3Rpdml0eSAqLwogCQlpZiAocmVhZF90aW1lb3V0CiAJCSAgICAmJiAoZGV2LT5yZWFkX2J1ZmZlcl9sZW5ndGggfHwgZGV2LT5pbnRlcnJ1cHRfb3V0X2J1c3kpKSB7Ci0JCQl0aW1lb3V0ID0gamlmZmllcyArIHJlYWRfdGltZW91dCAqIEhaIC8gMTAwMDsKKwkJCXRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhyZWFkX3RpbWVvdXQpOwogCQl9CiAJCS8qIGNoZWNrIGZvciByZWFkIHRpbWVvdXQgKi8KIAkJaWYgKHJlYWRfdGltZW91dCAmJiB0aW1lX2FmdGVyIChqaWZmaWVzLCB0aW1lb3V0KSkgewpAQCAtODMxLDcgKzgzMSw3IEBACiAJZGV2LT5yZWFkX2J1ZmZlcl9sZW5ndGggPSAwOwogCWRldi0+cmVhZF9wYWNrZXRfbGVuZ3RoID0gMDsKIAlzcGluX2xvY2tfaW5pdCAoJmRldi0+cmVhZF9idWZmZXJfbG9jayk7Ci0JZGV2LT5wYWNrZXRfdGltZW91dF9qaWZmaWVzID0gcGFja2V0X3RpbWVvdXQgKiBIWiAvIDEwMDA7CisJZGV2LT5wYWNrZXRfdGltZW91dF9qaWZmaWVzID0gbXNlY3NfdG9famlmZmllcyhwYWNrZXRfdGltZW91dCk7CiAJZGV2LT5yZWFkX2xhc3RfYXJyaXZhbCA9IGppZmZpZXM7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkICgmZGV2LT5yZWFkX3dhaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy91c2IzNTAzLmMgYi9kcml2ZXJzL3VzYi9taXNjL3VzYjM1MDMuYwppbmRleCAyNThkMmY1Li42NGZmNWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL3VzYjM1MDMuYworKysgYi9kcml2ZXJzL3VzYi9taXNjL3VzYjM1MDMuYwpAQCAtMTg2LDggKzE4NiwzMSBAQAogCQlodWItPm1vZGUJCT0gcGRhdGEtPmluaXRpYWxfbW9kZTsKIAl9IGVsc2UgaWYgKG5wKSB7CiAJCXN0cnVjdCBjbGsgKmNsazsKKwkJdTMyIHJhdGUgPSAwOwogCQlodWItPnBvcnRfb2ZmX21hc2sgPSAwOwogCisJCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyZWZjbGstZnJlcXVlbmN5IiwgJnJhdGUpKSB7CisJCQlzd2l0Y2ggKHJhdGUpIHsKKwkJCWNhc2UgMzg0MDAwMDA6CisJCQljYXNlIDI2MDAwMDAwOgorCQkJY2FzZSAxOTIwMDAwMDoKKwkJCWNhc2UgMTIwMDAwMDA6CisJCQkJaHViLT5zZWNvbmRhcnlfcmVmX2NsayA9IDA7CisJCQkJYnJlYWs7CisJCQljYXNlIDI0MDAwMDAwOgorCQkJY2FzZSAyNzAwMDAwMDoKKwkJCWNhc2UgMjUwMDAwMDA6CisJCQljYXNlIDUwMDAwMDAwOgorCQkJCWh1Yi0+c2Vjb25kYXJ5X3JlZl9jbGsgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkZXZfZXJyKGRldiwKKwkJCQkJInVuc3VwcG9ydGVkIHJlZmVyZW5jZSBjbG9jayByYXRlICglZClcbiIsCisJCQkJCShpbnQpIHJhdGUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisKIAkJY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInJlZmNsayIpOwogCQlpZiAoSVNfRVJSKGNsaykgJiYgUFRSX0VSUihjbGspICE9IC1FTk9FTlQpIHsKIAkJCWRldl9lcnIoZGV2LCAidW5hYmxlIHRvIHJlcXVlc3QgcmVmY2xrICglbGQpXG4iLApAQCAtMTk2LDMxICsyMTksOSBAQAogCQl9CiAKIAkJaWYgKCFJU19FUlIoY2xrKSkgewotCQkJdTMyIHJhdGUgPSAwOwogCQkJaHViLT5jbGsgPSBjbGs7CiAKLQkJCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJyZWZjbGstZnJlcXVlbmN5IiwKLQkJCQkJCSAmcmF0ZSkpIHsKLQotCQkJCXN3aXRjaCAocmF0ZSkgewotCQkJCWNhc2UgMzg0MDAwMDA6Ci0JCQkJY2FzZSAyNjAwMDAwMDoKLQkJCQljYXNlIDE5MjAwMDAwOgotCQkJCWNhc2UgMTIwMDAwMDA6Ci0JCQkJCWh1Yi0+c2Vjb25kYXJ5X3JlZl9jbGsgPSAwOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDI0MDAwMDAwOgotCQkJCWNhc2UgMjcwMDAwMDA6Ci0JCQkJY2FzZSAyNTAwMDAwMDoKLQkJCQljYXNlIDUwMDAwMDAwOgotCQkJCQlodWItPnNlY29uZGFyeV9yZWZfY2xrID0gMTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJZGV2X2VycihkZXYsCi0JCQkJCQkidW5zdXBwb3J0ZWQgcmVmZXJlbmNlIGNsb2NrIHJhdGUgKCVkKVxuIiwKLQkJCQkJCShpbnQpIHJhdGUpOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9CisJCQlpZiAocmF0ZSAhPSAwKSB7CiAJCQkJZXJyID0gY2xrX3NldF9yYXRlKGh1Yi0+Y2xrLCByYXRlKTsKIAkJCQlpZiAoZXJyKSB7CiAJCQkJCWRldl9lcnIoZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnIGIvZHJpdmVycy91c2IvbXVzYi9LY29uZmlnCmluZGV4IDE0ZTE2MjguLjM5ZGI4YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9tdXNiL0tjb25maWcKQEAgLTc5LDcgKzc5LDggQEAKIAogY29uZmlnIFVTQl9NVVNCX09NQVAyUExVUwogCXRyaXN0YXRlICJPTUFQMjQzMCBhbmQgb253YXJkcyIKLQlkZXBlbmRzIG9uIEFSQ0hfT01BUDJQTFVTICYmIFVTQiAmJiBPTUFQX0NPTlRST0xfUEhZCisJZGVwZW5kcyBvbiBBUkNIX09NQVAyUExVUyAmJiBVU0IKKwlkZXBlbmRzIG9uIE9NQVBfQ09OVFJPTF9QSFkgfHwgIU9NQVBfQ09OVFJPTF9QSFkKIAlzZWxlY3QgR0VORVJJQ19QSFkKIAogY29uZmlnIFVTQl9NVVNCX0FNMzVYCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwppbmRleCAwNjc5MjBmLi4zNzg5YjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKQEAgLTk5LDYgKzk5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAKICNpbmNsdWRlICJtdXNiX2NvcmUuaCIKIApAQCAtNTA3LDcgKzUwOCw4IEBACiAJbXVzYi0+cG9ydDFfc3RhdHVzICY9IH4oVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gPDwgMTYpOwogfQogCi1zdGF0aWMgdm9pZCBtdXNiX2dlbmVyaWNfZGlzYWJsZShzdHJ1Y3QgbXVzYiAqbXVzYik7CitzdGF0aWMgdm9pZCBtdXNiX3JlY292ZXJfZnJvbV9iYWJibGUoc3RydWN0IG11c2IgKm11c2IpOworCiAvKgogICogSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSB0byByZWNvcmQgVVNCICJnbG9iYWwiIGludGVycnVwdHMuCiAgKiBTaW5jZSB0aGVzZSBkbyBub3QgaGFwcGVuIG9mdGVuIGFuZCBzaWduaWZ5IHRoaW5ncyBvZgpAQCAtNTM0LDM1ICs1MzYsMjEgQEAKIAkgKi8KIAlpZiAoaW50X3VzYiAmIE1VU0JfSU5UUl9SRVNVTUUpIHsKIAkJaGFuZGxlZCA9IElSUV9IQU5ETEVEOwotCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJSRVNVTUUgKCVzKVxuIiwgdXNiX290Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpKTsKKwkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiUkVTVU1FICglcylcbiIsCisJCQkJdXNiX290Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpKTsKIAogCQlpZiAoZGV2Y3RsICYgTVVTQl9ERVZDVExfSE0pIHsKLQkJCXZvaWQgX19pb21lbSAqbWJhc2UgPSBtdXNiLT5tcmVnczsKLQkJCXU4IHBvd2VyOwotCiAJCQlzd2l0Y2ggKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlKSB7CiAJCQljYXNlIE9UR19TVEFURV9BX1NVU1BFTkQ6CiAJCQkJLyogcmVtb3RlIHdha2V1cD8gIGxhdGVyLCBHZXRQb3J0U3RhdHVzCiAJCQkJICogd2lsbCBzdG9wIFJFU1VNRSBzaWduYWxpbmcKIAkJCQkgKi8KIAotCQkJCXBvd2VyID0gbXVzYl9yZWFkYihtdXNiLT5tcmVncywgTVVTQl9QT1dFUik7Ci0JCQkJaWYgKHBvd2VyICYgTVVTQl9QT1dFUl9TVVNQRU5ETSkgewotCQkJCQkvKiBzcHVyaW91cyAqLwotCQkJCQltdXNiLT5pbnRfdXNiICY9IH5NVVNCX0lOVFJfU1VTUEVORDsKLQkJCQkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiU3B1cmlvdXMgU1VTUEVORE1cbiIpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlwb3dlciAmPSB+TVVTQl9QT1dFUl9TVVNQRU5ETTsKLQkJCQltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9QT1dFUiwKLQkJCQkJCXBvd2VyIHwgTVVTQl9QT1dFUl9SRVNVTUUpOwotCiAJCQkJbXVzYi0+cG9ydDFfc3RhdHVzIHw9CiAJCQkJCQkoVVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQgPDwgMTYpCiAJCQkJCQl8IE1VU0JfUE9SVF9TVEFUX1JFU1VNRTsKIAkJCQltdXNiLT5yaF90aW1lciA9IGppZmZpZXMKLQkJCQkJCSArIG1zZWNzX3RvX2ppZmZpZXMoMjApOworCQkJCQkrIG1zZWNzX3RvX2ppZmZpZXMoVVNCX1JFU1VNRV9USU1FT1VUKTsKIAkJCQltdXNiLT5uZWVkX2ZpbmlzaF9yZXN1bWUgPSAxOwogCiAJCQkJbXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQV9IT1NUOwpAQCAtNzc1LDEwICs3NjMsNiBAQAogCiAJCW11c2ItPmVwMF9zdGFnZSA9IE1VU0JfRVAwX1NUQVJUOwogCi0JCS8qIGZsdXNoIGVuZHBvaW50cyB3aGVuIHRyYW5zaXRpb25pbmcgZnJvbSBEZXZpY2UgTW9kZSAqLwotCQlpZiAoaXNfcGVyaXBoZXJhbF9hY3RpdmUobXVzYikpIHsKLQkJCS8qIFJFVklTSVQgSE5QOyBqdXN0IGZvcmNlIGRpc2Nvbm5lY3QgKi8KLQkJfQogCQltdXNiLT5pbnRydHhlID0gbXVzYi0+ZXBtYXNrOwogCQltdXNiX3dyaXRldyhtdXNiLT5tcmVncywgTVVTQl9JTlRSVFhFLCBtdXNiLT5pbnRydHhlKTsKIAkJbXVzYi0+aW50cnJ4ZSA9IG11c2ItPmVwbWFzayAmIDB4ZmZmZTsKQEAgLTg3OSwyMCArODYzLDE5IEBACiAJICovCiAJaWYgKGludF91c2IgJiBNVVNCX0lOVFJfUkVTRVQpIHsKIAkJaGFuZGxlZCA9IElSUV9IQU5ETEVEOwotCQlpZiAoKGRldmN0bCAmIE1VU0JfREVWQ1RMX0hNKSAhPSAwKSB7CisJCWlmIChkZXZjdGwgJiBNVVNCX0RFVkNUTF9ITSkgewogCQkJLyoKLQkJCSAqIExvb2tzIGxpa2Ugbm9uLUhTIEJBQkJMRSBjYW4gYmUgaWdub3JlZCwgYnV0Ci0JCQkgKiBIUyBCQUJCTEUgaXMgYW4gZXJyb3IgY29uZGl0aW9uLiBGb3IgSFMgdGhlIHNvbHV0aW9uCi0JCQkgKiBpcyB0byBhdm9pZCBiYWJibGUgaW4gdGhlIGZpcnN0IHBsYWNlIGFuZCBmaXggd2hhdAotCQkJICogY2F1c2VkIEJBQkJMRS4gV2hlbiBIUyBCQUJCTEUgaGFwcGVucyB3ZSBjYW4gb25seQotCQkJICogc3RvcCB0aGUgc2Vzc2lvbi4KKwkJCSAqIFdoZW4gQkFCQkxFIGhhcHBlbnMgd2hhdCB3ZSBjYW4gZGVwZW5kcyBvbiB3aGljaAorCQkJICogcGxhdGZvcm0gTVVTQiBpcyBydW5uaW5nLCBiZWNhdXNlIHNvbWUgcGxhdGZvcm1zCisJCQkgKiBpbXBsZW1lbnRlZCBwcm9wcmlldGFyeSBtZWFucyBmb3IgJ3JlY292ZXJpbmcnIGZyb20KKwkJCSAqIEJhYmJsZSBjb25kaXRpb25zLiBPbmUgc3VjaCBwbGF0Zm9ybSBpcyBBTTMzNXguIEluCisJCQkgKiBtb3N0IGNhc2VzLCBob3dldmVyLCB0aGUgb25seSB0aGluZyB3ZSBjYW4gZG8gaXMKKwkJCSAqIGRyb3AgdGhlIHNlc3Npb24uCiAJCQkgKi8KLQkJCWlmIChkZXZjdGwgJiAoTVVTQl9ERVZDVExfRlNERVYgfCBNVVNCX0RFVkNUTF9MU0RFVikpCi0JCQkJZGV2X2RiZyhtdXNiLT5jb250cm9sbGVyLCAiQkFCQkxFIGRldmN0bDogJTAyeFxuIiwgZGV2Y3RsKTsKLQkJCWVsc2UgewotCQkJCUVSUigiU3RvcHBpbmcgaG9zdCBzZXNzaW9uIC0tIGJhYmJsZVxuIik7Ci0JCQkJbXVzYl93cml0ZWIobXVzYi0+bXJlZ3MsIE1VU0JfREVWQ1RMLCAwKTsKLQkJCX0KKwkJCWRldl9lcnIobXVzYi0+Y29udHJvbGxlciwgIkJhYmJsZVxuIik7CisKKwkJCWlmIChpc19ob3N0X2FjdGl2ZShtdXNiKSkKKwkJCQltdXNiX3JlY292ZXJfZnJvbV9iYWJibGUobXVzYik7CiAJCX0gZWxzZSB7CiAJCQlkZXZfZGJnKG11c2ItPmNvbnRyb2xsZXIsICJCVVMgUkVTRVQgYXMgJXNcbiIsCiAJCQkJdXNiX290Z19zdGF0ZV9zdHJpbmcobXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUpKTsKQEAgLTkzMSwxMyArOTE0LDYgQEAKIAkJfQogCX0KIAotCS8qIGhhbmRsZSBiYWJibGUgY29uZGl0aW9uICovCi0JaWYgKGludF91c2IgJiBNVVNCX0lOVFJfQkFCQkxFICYmIGlzX2hvc3RfYWN0aXZlKG11c2IpKSB7Ci0JCW11c2JfZ2VuZXJpY19kaXNhYmxlKG11c2IpOwotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJm11c2ItPnJlY292ZXJfd29yaywKLQkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwotCX0KLQogI2lmIDAKIC8qIFJFVklTSVQgLi4uIHRoaXMgd291bGQgYmUgZm9yIG11bHRpcGxleGluZyBwZXJpb2RpYyBlbmRwb2ludHMsIG9yCiAgKiBzdXBwb3J0aW5nIHRyYW5zZmVyIHBoYXNpbmcgdG8gcHJldmVudCBleGNlZWRpbmcgSVNPIGJhbmR3aWR0aApAQCAtOTkwLDcgKzk2Niw3IEBACiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKLXN0YXRpYyB2b2lkIG11c2JfZ2VuZXJpY19kaXNhYmxlKHN0cnVjdCBtdXNiICptdXNiKQorc3RhdGljIHZvaWQgbXVzYl9kaXNhYmxlX2ludGVycnVwdHMoc3RydWN0IG11c2IgKm11c2IpCiB7CiAJdm9pZCBfX2lvbWVtCSptYmFzZSA9IG11c2ItPm1yZWdzOwogCXUxNgl0ZW1wOwpAQCAtMTAwMiwxNCArOTc4LDMzIEBACiAJbXVzYi0+aW50cnJ4ZSA9IDA7CiAJbXVzYl93cml0ZXcobWJhc2UsIE1VU0JfSU5UUlJYRSwgMCk7CiAKLQkvKiBvZmYgKi8KLQltdXNiX3dyaXRlYihtYmFzZSwgTVVTQl9ERVZDVEwsIDApOwotCiAJLyogIGZsdXNoIHBlbmRpbmcgaW50ZXJydXB0cyAqLwogCXRlbXAgPSBtdXNiX3JlYWRiKG1iYXNlLCBNVVNCX0lOVFJVU0IpOwogCXRlbXAgPSBtdXNiX3JlYWR3KG1iYXNlLCBNVVNCX0lOVFJUWCk7CiAJdGVtcCA9IG11c2JfcmVhZHcobWJhc2UsIE1VU0JfSU5UUlJYKTsKK30KIAorc3RhdGljIHZvaWQgbXVzYl9lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKKwl2b2lkIF9faW9tZW0gICAgKnJlZ3MgPSBtdXNiLT5tcmVnczsKKworCS8qICBTZXQgSU5UIGVuYWJsZSByZWdpc3RlcnMsIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJbXVzYi0+aW50cnR4ZSA9IG11c2ItPmVwbWFzazsKKwltdXNiX3dyaXRldyhyZWdzLCBNVVNCX0lOVFJUWEUsIG11c2ItPmludHJ0eGUpOworCW11c2ItPmludHJyeGUgPSBtdXNiLT5lcG1hc2sgJiAweGZmZmU7CisJbXVzYl93cml0ZXcocmVncywgTVVTQl9JTlRSUlhFLCBtdXNiLT5pbnRycnhlKTsKKwltdXNiX3dyaXRlYihyZWdzLCBNVVNCX0lOVFJVU0JFLCAweGY3KTsKKworfQorCitzdGF0aWMgdm9pZCBtdXNiX2dlbmVyaWNfZGlzYWJsZShzdHJ1Y3QgbXVzYiAqbXVzYikKK3sKKwl2b2lkIF9faW9tZW0JKm1iYXNlID0gbXVzYi0+bXJlZ3M7CisKKwltdXNiX2Rpc2FibGVfaW50ZXJydXB0cyhtdXNiKTsKKworCS8qIG9mZiAqLworCW11c2Jfd3JpdGViKG1iYXNlLCBNVVNCX0RFVkNUTCwgMCk7CiB9CiAKIC8qCkBAIC0xMDIyLDEzICsxMDE3LDcgQEAKIAogCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgIjw9PSBkZXZjdGwgJTAyeFxuIiwgZGV2Y3RsKTsKIAotCS8qICBTZXQgSU5UIGVuYWJsZSByZWdpc3RlcnMsIGVuYWJsZSBpbnRlcnJ1cHRzICovCi0JbXVzYi0+aW50cnR4ZSA9IG11c2ItPmVwbWFzazsKLQltdXNiX3dyaXRldyhyZWdzLCBNVVNCX0lOVFJUWEUsIG11c2ItPmludHJ0eGUpOwotCW11c2ItPmludHJyeGUgPSBtdXNiLT5lcG1hc2sgJiAweGZmZmU7Ci0JbXVzYl93cml0ZXcocmVncywgTVVTQl9JTlRSUlhFLCBtdXNiLT5pbnRycnhlKTsKLQltdXNiX3dyaXRlYihyZWdzLCBNVVNCX0lOVFJVU0JFLCAweGY3KTsKLQorCW11c2JfZW5hYmxlX2ludGVycnVwdHMobXVzYik7CiAJbXVzYl93cml0ZWIocmVncywgTVVTQl9URVNUTU9ERSwgMCk7CiAKIAkvKiBwdXQgaW50byBiYXNpYyBoaWdoc3BlZWQgbW9kZSBhbmQgc3RhcnQgc2Vzc2lvbiAqLwpAQCAtMTU4Nyw5ICsxNTc2LDEyIEBACiBpcnFyZXR1cm5fdCBtdXNiX2ludGVycnVwdChzdHJ1Y3QgbXVzYiAqbXVzYikKIHsKIAlpcnFyZXR1cm5fdAlyZXR2YWwgPSBJUlFfTk9ORTsKKwl1bnNpZ25lZCBsb25nCXN0YXR1czsKKwl1bnNpZ25lZCBsb25nCWVwbnVtOwogCXU4CQlkZXZjdGw7Ci0JaW50CQllcF9udW07Ci0JdTMyCQlyZWc7CisKKwlpZiAoIW11c2ItPmludF91c2IgJiYgIW11c2ItPmludF90eCAmJiAhbXVzYi0+aW50X3J4KQorCQlyZXR1cm4gSVJRX05PTkU7CiAKIAlkZXZjdGwgPSBtdXNiX3JlYWRiKG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCk7CiAKQEAgLTE1OTcsNTYgKzE1ODksNTcgQEAKIAkJaXNfaG9zdF9hY3RpdmUobXVzYikgPyAiaG9zdCIgOiAicGVyaXBoZXJhbCIsCiAJCW11c2ItPmludF91c2IsIG11c2ItPmludF90eCwgbXVzYi0+aW50X3J4KTsKIAotCS8qIHRoZSBjb3JlIGNhbiBpbnRlcnJ1cHQgdXMgZm9yIG11bHRpcGxlIHJlYXNvbnM7IGRvY3MgaGF2ZQotCSAqIGEgZ2VuZXJpYyBpbnRlcnJ1cHQgZmxvd2NoYXJ0IHRvIGZvbGxvdworCS8qKgorCSAqIEFjY29yZGluZyB0byBNZW50b3IgR3JhcGhpY3MnIGRvY3VtZW50YXRpb24sIGZsb3djaGFydCBvbiBwYWdlIDk4LAorCSAqIElSUSBzaG91bGQgYmUgaGFuZGxlZCBhcyBmb2xsb3dzOgorCSAqCisJICogLiBSZXN1bWUgSVJRCisJICogLiBTZXNzaW9uIFJlcXVlc3QgSVJRCisJICogLiBWQlVTIEVycm9yIElSUQorCSAqIC4gU3VzcGVuZCBJUlEKKwkgKiAuIENvbm5lY3QgSVJRCisJICogLiBEaXNjb25uZWN0IElSUQorCSAqIC4gUmVzZXQvQmFiYmxlIElSUQorCSAqIC4gU09GIElSUSAod2UncmUgbm90IHVzaW5nIHRoaXMgb25lKQorCSAqIC4gRW5kcG9pbnQgMCBJUlEKKwkgKiAuIFRYIEVuZHBvaW50cworCSAqIC4gUlggRW5kcG9pbnRzCisJICoKKwkgKiBXZSB3aWxsIGJlIGZvbGxvd2luZyB0aGF0IGZsb3djaGFydCBpbiBvcmRlciB0byBhdm9pZCBhbnkgcHJvYmxlbXMKKwkgKiB0aGF0IG1pZ2h0IGFyaXNlIHdpdGggaW50ZXJuYWwgRmluaXRlIFN0YXRlIE1hY2hpbmUuCiAJICovCisKIAlpZiAobXVzYi0+aW50X3VzYikKLQkJcmV0dmFsIHw9IG11c2Jfc3RhZ2UwX2lycShtdXNiLCBtdXNiLT5pbnRfdXNiLAotCQkJCWRldmN0bCk7CisJCXJldHZhbCB8PSBtdXNiX3N0YWdlMF9pcnEobXVzYiwgbXVzYi0+aW50X3VzYiwgZGV2Y3RsKTsKIAotCS8qICJzdGFnZSAxIiBpcyBoYW5kbGluZyBlbmRwb2ludCBpcnFzICovCi0KLQkvKiBoYW5kbGUgZW5kcG9pbnQgMCBmaXJzdCAqLwogCWlmIChtdXNiLT5pbnRfdHggJiAxKSB7CiAJCWlmIChpc19ob3N0X2FjdGl2ZShtdXNiKSkKIAkJCXJldHZhbCB8PSBtdXNiX2hfZXAwX2lycShtdXNiKTsKIAkJZWxzZQogCQkJcmV0dmFsIHw9IG11c2JfZ19lcDBfaXJxKG11c2IpOworCisJCS8qIHdlIGhhdmUganVzdCBoYW5kbGVkIGVuZHBvaW50IDAgSVJRLCBjbGVhciBpdCAqLworCQltdXNiLT5pbnRfdHggJj0gfkJJVCgwKTsKIAl9CiAKLQkvKiBSWCBvbiBlbmRwb2ludHMgMS0xNSAqLwotCXJlZyA9IG11c2ItPmludF9yeCA+PiAxOwotCWVwX251bSA9IDE7Ci0Jd2hpbGUgKHJlZykgewotCQlpZiAocmVnICYgMSkgewotCQkJLyogbXVzYl9lcF9zZWxlY3QobXVzYi0+bXJlZ3MsIGVwX251bSk7ICovCi0JCQkvKiBSRVZJU0lUIGp1c3QgcmV0dmFsID0gZXAtPnJ4X2lycSguLi4pICovCi0JCQlyZXR2YWwgPSBJUlFfSEFORExFRDsKLQkJCWlmIChpc19ob3N0X2FjdGl2ZShtdXNiKSkKLQkJCQltdXNiX2hvc3RfcngobXVzYiwgZXBfbnVtKTsKLQkJCWVsc2UKLQkJCQltdXNiX2dfcngobXVzYiwgZXBfbnVtKTsKLQkJfQorCXN0YXR1cyA9IG11c2ItPmludF90eDsKIAotCQlyZWcgPj49IDE7Ci0JCWVwX251bSsrOworCWZvcl9lYWNoX3NldF9iaXQoZXBudW0sICZzdGF0dXMsIDE2KSB7CisJCXJldHZhbCA9IElSUV9IQU5ETEVEOworCQlpZiAoaXNfaG9zdF9hY3RpdmUobXVzYikpCisJCQltdXNiX2hvc3RfdHgobXVzYiwgZXBudW0pOworCQllbHNlCisJCQltdXNiX2dfdHgobXVzYiwgZXBudW0pOwogCX0KIAotCS8qIFRYIG9uIGVuZHBvaW50cyAxLTE1ICovCi0JcmVnID0gbXVzYi0+aW50X3R4ID4+IDE7Ci0JZXBfbnVtID0gMTsKLQl3aGlsZSAocmVnKSB7Ci0JCWlmIChyZWcgJiAxKSB7Ci0JCQkvKiBtdXNiX2VwX3NlbGVjdChtdXNiLT5tcmVncywgZXBfbnVtKTsgKi8KLQkJCS8qIFJFVklTSVQganVzdCByZXR2YWwgfD0gZXAtPnR4X2lycSguLi4pICovCi0JCQlyZXR2YWwgPSBJUlFfSEFORExFRDsKLQkJCWlmIChpc19ob3N0X2FjdGl2ZShtdXNiKSkKLQkJCQltdXNiX2hvc3RfdHgobXVzYiwgZXBfbnVtKTsKLQkJCWVsc2UKLQkJCQltdXNiX2dfdHgobXVzYiwgZXBfbnVtKTsKLQkJfQotCQlyZWcgPj49IDE7Ci0JCWVwX251bSsrOworCXN0YXR1cyA9IG11c2ItPmludF9yeDsKKworCWZvcl9lYWNoX3NldF9iaXQoZXBudW0sICZzdGF0dXMsIDE2KSB7CisJCXJldHZhbCA9IElSUV9IQU5ETEVEOworCQlpZiAoaXNfaG9zdF9hY3RpdmUobXVzYikpCisJCQltdXNiX2hvc3RfcngobXVzYiwgZXBudW0pOworCQllbHNlCisJCQltdXNiX2dfcngobXVzYiwgZXBudW0pOwogCX0KIAogCXJldHVybiByZXR2YWw7CkBAIC0xODI1LDMzICsxODE4LDQ0IEBACiAJfQogfQogCi0vKiBSZWNvdmVyIGZyb20gYmFiYmxlIGludGVycnVwdCBjb25kaXRpb25zICovCi1zdGF0aWMgdm9pZCBtdXNiX3JlY292ZXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCitzdGF0aWMgdm9pZCBtdXNiX3JlY292ZXJfZnJvbV9iYWJibGUoc3RydWN0IG11c2IgKm11c2IpCiB7Ci0Jc3RydWN0IG11c2IgKm11c2IgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IG11c2IsIHJlY292ZXJfd29yay53b3JrKTsKLQlpbnQgc3RhdHVzLCByZXQ7CisJaW50IHJldDsKKwl1OCBkZXZjdGw7CiAKLQlyZXQgID0gbXVzYl9wbGF0Zm9ybV9yZXNldChtdXNiKTsKLQlpZiAocmV0KQorCW11c2JfZGlzYWJsZV9pbnRlcnJ1cHRzKG11c2IpOworCisJLyoKKwkgKiB3YWl0IGF0IGxlYXN0IDMyMCBjeWNsZXMgb2YgNjBNSHogY2xvY2suIFRoYXQncyA1LjN1cywgd2Ugd2lsbCBnaXZlCisJICogaXQgc29tZSBzbGFjayBhbmQgd2FpdCBmb3IgMTB1cy4KKwkgKi8KKwl1ZGVsYXkoMTApOworCisJcmV0ICA9IG11c2JfcGxhdGZvcm1fcmVjb3ZlcihtdXNiKTsKKwlpZiAocmV0KSB7CisJCW11c2JfZW5hYmxlX2ludGVycnVwdHMobXVzYik7CiAJCXJldHVybjsKKwl9CiAKLQl1c2JfcGh5X3ZidXNfb2ZmKG11c2ItPnhjZWl2KTsKLQl1c2xlZXBfcmFuZ2UoMTAwLCAyMDApOworCS8qIGRyb3Agc2Vzc2lvbiBiaXQgKi8KKwlkZXZjdGwgPSBtdXNiX3JlYWRiKG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCk7CisJZGV2Y3RsICY9IH5NVVNCX0RFVkNUTF9TRVNTSU9OOworCW11c2Jfd3JpdGViKG11c2ItPm1yZWdzLCBNVVNCX0RFVkNUTCwgZGV2Y3RsKTsKIAotCXVzYl9waHlfdmJ1c19vbihtdXNiLT54Y2Vpdik7Ci0JdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKKwkvKiB0ZWxsIHVzYmNvcmUgYWJvdXQgaXQgKi8KKwltdXNiX3Jvb3RfZGlzY29ubmVjdChtdXNiKTsKIAogCS8qCiAJICogV2hlbiBhIGJhYmJsZSBjb25kaXRpb24gb2NjdXJzLCB0aGUgbXVzYiBjb250cm9sbGVyCiAJICogcmVtb3ZlcyB0aGUgc2Vzc2lvbiBiaXQgYW5kIHRoZSBlbmRwb2ludCBjb25maWcgaXMgbG9zdC4KIAkgKi8KIAlpZiAobXVzYi0+ZHluX2ZpZm8pCi0JCXN0YXR1cyA9IGVwX2NvbmZpZ19mcm9tX3RhYmxlKG11c2IpOworCQlyZXQgPSBlcF9jb25maWdfZnJvbV90YWJsZShtdXNiKTsKIAllbHNlCi0JCXN0YXR1cyA9IGVwX2NvbmZpZ19mcm9tX2h3KG11c2IpOworCQlyZXQgPSBlcF9jb25maWdfZnJvbV9odyhtdXNiKTsKIAotCS8qIHN0YXJ0IHRoZSBzZXNzaW9uIGFnYWluICovCi0JaWYgKHN0YXR1cyA9PSAwKQorCS8qIHJlc3RhcnQgc2Vzc2lvbiAqLworCWlmIChyZXQgPT0gMCkKIAkJbXVzYl9zdGFydChtdXNiKTsKIH0KIApAQCAtMjA4Nyw3ICsyMDkxLDYgQEAKIAogCS8qIEluaXQgSVJRIHdvcmtxdWV1ZSBiZWZvcmUgcmVxdWVzdF9pcnEgKi8KIAlJTklUX1dPUksoJm11c2ItPmlycV93b3JrLCBtdXNiX2lycV93b3JrKTsKLQlJTklUX0RFTEFZRURfV09SSygmbXVzYi0+cmVjb3Zlcl93b3JrLCBtdXNiX3JlY292ZXJfd29yayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJm11c2ItPmRlYXNzZXJ0X3Jlc2V0X3dvcmssIG11c2JfZGVhc3NlcnRfcmVzZXQpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZtdXNiLT5maW5pc2hfcmVzdW1lX3dvcmssIG11c2JfaG9zdF9maW5pc2hfcmVzdW1lKTsKIApAQCAtMjE4Myw3ICsyMTg2LDYgQEAKIAogZmFpbDM6CiAJY2FuY2VsX3dvcmtfc3luYygmbXVzYi0+aXJxX3dvcmspOwotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbXVzYi0+cmVjb3Zlcl93b3JrKTsKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJm11c2ItPmZpbmlzaF9yZXN1bWVfd29yayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZtdXNiLT5kZWFzc2VydF9yZXNldF93b3JrKTsKIAlpZiAobXVzYi0+ZG1hX2NvbnRyb2xsZXIpCkBAIC0yMjQ5LDcgKzIyNTEsNiBAQAogCQlkbWFfY29udHJvbGxlcl9kZXN0cm95KG11c2ItPmRtYV9jb250cm9sbGVyKTsKIAogCWNhbmNlbF93b3JrX3N5bmMoJm11c2ItPmlycV93b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJm11c2ItPnJlY292ZXJfd29yayk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZtdXNiLT5maW5pc2hfcmVzdW1lX3dvcmspOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbXVzYi0+ZGVhc3NlcnRfcmVzZXRfd29yayk7CiAJbXVzYl9mcmVlKG11c2IpOwpAQCAtMjQ2Myw3ICsyNDY0LDcgQEAKIAlpZiAobXVzYi0+bmVlZF9maW5pc2hfcmVzdW1lKSB7CiAJCW11c2ItPm5lZWRfZmluaXNoX3Jlc3VtZSA9IDA7CiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmbXVzYi0+ZmluaXNoX3Jlc3VtZV93b3JrLAotCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMjApKTsKKwkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKFVTQl9SRVNVTUVfVElNRU9VVCkpOwogCX0KIAogCS8qCkBAIC0yNTA2LDcgKzI1MDcsNyBAQAogCWlmIChtdXNiLT5uZWVkX2ZpbmlzaF9yZXN1bWUpIHsKIAkJbXVzYi0+bmVlZF9maW5pc2hfcmVzdW1lID0gMDsKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZtdXNiLT5maW5pc2hfcmVzdW1lX3dvcmssCi0JCQkJbXNlY3NfdG9famlmZmllcygyMCkpOworCQkJCW1zZWNzX3RvX2ppZmZpZXMoVVNCX1JFU1VNRV9USU1FT1VUKSk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuaAppbmRleCA1ZTY1OTU4Li4zODc3MjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5oCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmgKQEAgLTE2MCw3ICsxNjAsOCBAQAogICogQGluaXQ6CXR1cm5zIG9uIGNsb2Nrcywgc2V0cyB1cCBwbGF0Zm9ybS1zcGVjaWZpYyByZWdpc3RlcnMsIGV0YwogICogQGV4aXQ6CXVuZG9lcyBAaW5pdAogICogQHNldF9tb2RlOglmb3JjZWZ1bGx5IGNoYW5nZXMgb3BlcmF0aW5nIG1vZGUKLSAqIEB0cnlfaWxkZToJdHJpZXMgdG8gaWRsZSB0aGUgSVAKKyAqIEB0cnlfaWRsZToJdHJpZXMgdG8gaWRsZSB0aGUgSVAKKyAqIEByZWNvdmVyOglwbGF0Zm9ybS1zcGVjaWZpYyBiYWJibGUgcmVjb3ZlcnkKICAqIEB2YnVzX3N0YXR1czogcmV0dXJucyB2YnVzIHN0YXR1cyBpZiBwb3NzaWJsZQogICogQHNldF92YnVzOglmb3JjZXMgdmJ1cyBzdGF0dXMKICAqIEBhZGp1c3RfY2hhbm5lbF9wYXJhbXM6IHByZSBjaGVjayBmb3Igc3RhbmRhcmQgZG1hIGNoYW5uZWxfcHJvZ3JhbSBmdW5jCkBAIC0xOTYsNyArMTk3LDcgQEAKIAl2b2lkCSgqd3JpdGVfZmlmbykoc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwLCB1MTYgbGVuLCBjb25zdCB1OCAqYnVmKTsKIAlpbnQJKCpzZXRfbW9kZSkoc3RydWN0IG11c2IgKm11c2IsIHU4IG1vZGUpOwogCXZvaWQJKCp0cnlfaWRsZSkoc3RydWN0IG11c2IgKm11c2IsIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7Ci0JaW50CSgqcmVzZXQpKHN0cnVjdCBtdXNiICptdXNiKTsKKwlpbnQJKCpyZWNvdmVyKShzdHJ1Y3QgbXVzYiAqbXVzYik7CiAKIAlpbnQJKCp2YnVzX3N0YXR1cykoc3RydWN0IG11c2IgKm11c2IpOwogCXZvaWQJKCpzZXRfdmJ1cykoc3RydWN0IG11c2IgKm11c2IsIGludCBvbik7CkBAIC0zMDAsNyArMzAxLDYgQEAKIAogCWlycXJldHVybl90CQkoKmlzcikoaW50LCB2b2lkICopOwogCXN0cnVjdCB3b3JrX3N0cnVjdAlpcnFfd29yazsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrCXJlY292ZXJfd29yazsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCWRlYXNzZXJ0X3Jlc2V0X3dvcms7CiAJc3RydWN0IGRlbGF5ZWRfd29yawlmaW5pc2hfcmVzdW1lX3dvcms7CiAJdTE2CQkJaHd2ZXJzOwpAQCAtNTU4LDEyICs1NTgsMTIgQEAKIAkJbXVzYi0+b3BzLT50cnlfaWRsZShtdXNiLCB0aW1lb3V0KTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgIG11c2JfcGxhdGZvcm1fcmVzZXQoc3RydWN0IG11c2IgKm11c2IpCitzdGF0aWMgaW5saW5lIGludCAgbXVzYl9wbGF0Zm9ybV9yZWNvdmVyKHN0cnVjdCBtdXNiICptdXNiKQogewotCWlmICghbXVzYi0+b3BzLT5yZXNldCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFtdXNiLT5vcHMtPnJlY292ZXIpCisJCXJldHVybiAwOwogCi0JcmV0dXJuIG11c2ItPm9wcy0+cmVzZXQobXVzYik7CisJcmV0dXJuIG11c2ItPm9wcy0+cmVjb3ZlcihtdXNiKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbXVzYl9wbGF0Zm9ybV9nZXRfdmJ1c19zdGF0dXMoc3RydWN0IG11c2IgKm11c2IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfY3BwaTQxLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY3BwaTQxLmMKaW5kZXggYmU4NDU2Mi4uOGJkOGM1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NwcGk0MS5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jcHBpNDEuYwpAQCAtMjI1LDEwICsyMjUsMTIgQEAKIAlzdHJ1Y3QgZG1hX2NoYW5uZWwgKmNoYW5uZWwgPSBwcml2YXRlX2RhdGE7CiAJc3RydWN0IGNwcGk0MV9kbWFfY2hhbm5lbCAqY3BwaTQxX2NoYW5uZWwgPSBjaGFubmVsLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IG11c2JfaHdfZXAgKmh3X2VwID0gY3BwaTQxX2NoYW5uZWwtPmh3X2VwOworCXN0cnVjdCBjcHBpNDFfZG1hX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7CiAJc3RydWN0IG11c2IgKm11c2IgPSBod19lcC0+bXVzYjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBkbWFfdHhfc3RhdGUgdHhzdGF0ZTsKIAl1MzIgdHJhbnNmZXJyZWQ7CisJaW50IGlzX2hzID0gMDsKIAlib29sIGVtcHR5OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKQEAgLTI0OCw2MSArMjUwLDU5IEBACiAJCQl0cmFuc2ZlcnJlZCA8IGNwcGk0MV9jaGFubmVsLT5wYWNrZXRfc3opCiAJCWNwcGk0MV9jaGFubmVsLT5wcm9nX2xlbiA9IDA7CiAKLQllbXB0eSA9IG11c2JfaXNfdHhfZmlmb19lbXB0eShod19lcCk7Ci0JaWYgKGVtcHR5KSB7CisJaWYgKGNwcGk0MV9jaGFubmVsLT5pc190eCkKKwkJZW1wdHkgPSBtdXNiX2lzX3R4X2ZpZm9fZW1wdHkoaHdfZXApOworCisJaWYgKCFjcHBpNDFfY2hhbm5lbC0+aXNfdHggfHwgZW1wdHkpIHsKIAkJY3BwaTQxX3RyYW5zX2RvbmUoY3BwaTQxX2NoYW5uZWwpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIE9uIEFNMzM1eCBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IHRoZSBUWCBpbnRlcnJ1cHQgZmlyZXMKKwkgKiB0b28gZWFybHkgdGhhdCBtZWFucyB0aGUgVFhGSUZPIGlzIG5vdCB5ZXQgZW1wdHkgYnV0IHRoZSBETUEKKwkgKiBlbmdpbmUgc2F5cyB0aGF0IGl0IGlzIGRvbmUgd2l0aCB0aGUgdHJhbnNmZXIuIFdlIGRvbid0CisJICogcmVjZWl2ZSBhIEZJRk8gZW1wdHkgaW50ZXJydXB0IHNvIHRoZSBvbmx5IHRoaW5nIHdlIGNhbiBkbyBpcworCSAqIHRvIHBvbGwgZm9yIHRoZSBiaXQuIE9uIEhTIGl0IHVzdWFsbHkgdGFrZXMgMnVzLCBvbiBGUyBhcm91bmQKKwkgKiAxMTB1cyAtIDE1MHVzIGRlcGVuZGluZyBvbiB0aGUgdHJhbnNmZXIgc2l6ZS4KKwkgKiBXZSBzcGluIG9uIEhTIChubyBsb25nZXIgdGhhbiB0aGFuIDI1dXMgYW5kIHNldHVwIGEgdGltZXIgb24KKwkgKiBGUyB0byBjaGVjayBmb3IgdGhlIGJpdCBhbmQgY29tcGxldGUgdGhlIHRyYW5zZmVyLgorCSAqLworCWNvbnRyb2xsZXIgPSBjcHBpNDFfY2hhbm5lbC0+Y29udHJvbGxlcjsKKworCWlmIChpc19ob3N0X2FjdGl2ZShtdXNiKSkgeworCQlpZiAobXVzYi0+cG9ydDFfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEKQorCQkJaXNfaHMgPSAxOwogCX0gZWxzZSB7Ci0JCXN0cnVjdCBjcHBpNDFfZG1hX2NvbnRyb2xsZXIgKmNvbnRyb2xsZXI7Ci0JCWludCBpc19ocyA9IDA7Ci0JCS8qCi0JCSAqIE9uIEFNMzM1eCBpdCBoYXMgYmVlbiBvYnNlcnZlZCB0aGF0IHRoZSBUWCBpbnRlcnJ1cHQgZmlyZXMKLQkJICogdG9vIGVhcmx5IHRoYXQgbWVhbnMgdGhlIFRYRklGTyBpcyBub3QgeWV0IGVtcHR5IGJ1dCB0aGUgRE1BCi0JCSAqIGVuZ2luZSBzYXlzIHRoYXQgaXQgaXMgZG9uZSB3aXRoIHRoZSB0cmFuc2Zlci4gV2UgZG9uJ3QKLQkJICogcmVjZWl2ZSBhIEZJRk8gZW1wdHkgaW50ZXJydXB0IHNvIHRoZSBvbmx5IHRoaW5nIHdlIGNhbiBkbyBpcwotCQkgKiB0byBwb2xsIGZvciB0aGUgYml0LiBPbiBIUyBpdCB1c3VhbGx5IHRha2VzIDJ1cywgb24gRlMgYXJvdW5kCi0JCSAqIDExMHVzIC0gMTUwdXMgZGVwZW5kaW5nIG9uIHRoZSB0cmFuc2ZlciBzaXplLgotCQkgKiBXZSBzcGluIG9uIEhTIChubyBsb25nZXIgdGhhbiB0aGFuIDI1dXMgYW5kIHNldHVwIGEgdGltZXIgb24KLQkJICogRlMgdG8gY2hlY2sgZm9yIHRoZSBiaXQgYW5kIGNvbXBsZXRlIHRoZSB0cmFuc2Zlci4KLQkJICovCi0JCWNvbnRyb2xsZXIgPSBjcHBpNDFfY2hhbm5lbC0+Y29udHJvbGxlcjsKKwkJaWYgKG11c2ItPmcuc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisJCQlpc19ocyA9IDE7CisJfQorCWlmIChpc19ocykgeworCQl1bnNpZ25lZCB3YWl0ID0gMjU7CiAKLQkJaWYgKGlzX2hvc3RfYWN0aXZlKG11c2IpKSB7Ci0JCQlpZiAobXVzYi0+cG9ydDFfc3RhdHVzICYgVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEKQotCQkJCWlzX2hzID0gMTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtdXNiLT5nLnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQotCQkJCWlzX2hzID0gMTsKLQkJfQotCQlpZiAoaXNfaHMpIHsKLQkJCXVuc2lnbmVkIHdhaXQgPSAyNTsKLQotCQkJZG8gewotCQkJCWVtcHR5ID0gbXVzYl9pc190eF9maWZvX2VtcHR5KGh3X2VwKTsKLQkJCQlpZiAoZW1wdHkpCi0JCQkJCWJyZWFrOwotCQkJCXdhaXQtLTsKLQkJCQlpZiAoIXdhaXQpCi0JCQkJCWJyZWFrOwotCQkJCXVkZWxheSgxKTsKLQkJCX0gd2hpbGUgKDEpOwotCisJCWRvIHsKIAkJCWVtcHR5ID0gbXVzYl9pc190eF9maWZvX2VtcHR5KGh3X2VwKTsKIAkJCWlmIChlbXB0eSkgewogCQkJCWNwcGk0MV90cmFuc19kb25lKGNwcGk0MV9jaGFubmVsKTsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQkJfQotCQlsaXN0X2FkZF90YWlsKCZjcHBpNDFfY2hhbm5lbC0+dHhfY2hlY2ssCi0JCQkJJmNvbnRyb2xsZXItPmVhcmx5X3R4X2xpc3QpOwotCQlpZiAoIWhydGltZXJfaXNfcXVldWVkKCZjb250cm9sbGVyLT5lYXJseV90eCkpIHsKLQkJCXVuc2lnbmVkIGxvbmcgdXNlY3MgPSBjcHBpNDFfY2hhbm5lbC0+dG90YWxfbGVuIC8gMTA7CisJCQl3YWl0LS07CisJCQlpZiAoIXdhaXQpCisJCQkJYnJlYWs7CisJCQljcHVfcmVsYXgoKTsKKwkJfSB3aGlsZSAoMSk7CisJfQorCWxpc3RfYWRkX3RhaWwoJmNwcGk0MV9jaGFubmVsLT50eF9jaGVjaywKKwkJCSZjb250cm9sbGVyLT5lYXJseV90eF9saXN0KTsKKwlpZiAoIWhydGltZXJfaXNfcXVldWVkKCZjb250cm9sbGVyLT5lYXJseV90eCkpIHsKKwkJdW5zaWduZWQgbG9uZyB1c2VjcyA9IGNwcGk0MV9jaGFubmVsLT50b3RhbF9sZW4gLyAxMDsKIAotCQkJaHJ0aW1lcl9zdGFydF9yYW5nZV9ucygmY29udHJvbGxlci0+ZWFybHlfdHgsCisJCWhydGltZXJfc3RhcnRfcmFuZ2VfbnMoJmNvbnRyb2xsZXItPmVhcmx5X3R4LAogCQkJCWt0aW1lX3NldCgwLCB1c2VjcyAqIE5TRUNfUEVSX1VTRUMpLAogCQkJCTIwICogTlNFQ19QRVJfVVNFQywKIAkJCQlIUlRJTUVSX01PREVfUkVMKTsKLQkJfQogCX0KKwogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kc3BzLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZHNwcy5jCmluZGV4IGE5MDBjOTguLjY1ZDkzMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9kc3BzLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2RzcHMuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAJdW5zaWduZWQJaWRkaWc6NTsKIAl1bnNpZ25lZAlpZGRpZ19tdXg6NTsKIAkvKiBtaXNjZWxsYW5lb3VzIHN0dWZmICovCi0JdTgJCXBvbGxfc2Vjb25kczsKKwl1bnNpZ25lZAlwb2xsX3RpbWVvdXQ7CiB9OwogCiAvKgpAQCAtMjI1LDkgKzIyNSw4IEBACiAKIAlkc3BzX3dyaXRlbChyZWdfYmFzZSwgd3JwLT5lcGludHJfc2V0LCBlcG1hc2spOwogCWRzcHNfd3JpdGVsKHJlZ19iYXNlLCB3cnAtPmNvcmVpbnRyX3NldCwgY29yZW1hc2spOwotCS8qIEZvcmNlIHRoZSBEUlZWQlVTIElSUSBzbyB3ZSBjYW4gc3RhcnQgcG9sbGluZyBmb3IgSUQgY2hhbmdlLiAqLwotCWRzcHNfd3JpdGVsKHJlZ19iYXNlLCB3cnAtPmNvcmVpbnRyX3NldCwKLQkJICAgICgxIDw8IHdycC0+ZHJ2dmJ1cykgPDwgd3JwLT51c2Jfc2hpZnQpOworCS8qIHN0YXJ0IHBvbGxpbmcgZm9yIElEIGNoYW5nZS4gKi8KKwltb2RfdGltZXIoJmdsdWUtPnRpbWVyLCBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh3cnAtPnBvbGxfdGltZW91dCkpOwogCWRzcHNfbXVzYl90cnlfaWRsZShtdXNiLCAwKTsKIH0KIApAQCAtMjg1LDcgKzI4NCw4IEBACiAJCX0KIAkJaWYgKCEoZGV2Y3RsICYgTVVTQl9ERVZDVExfU0VTU0lPTikgJiYgIXNraXBfc2Vzc2lvbikKIAkJCWRzcHNfd3JpdGViKG1yZWdzLCBNVVNCX0RFVkNUTCwgTVVTQl9ERVZDVExfU0VTU0lPTik7Ci0JCW1vZF90aW1lcigmZ2x1ZS0+dGltZXIsIGppZmZpZXMgKyB3cnAtPnBvbGxfc2Vjb25kcyAqIEhaKTsKKwkJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgamlmZmllcyArCisJCQkJbXNlY3NfdG9famlmZmllcyh3cnAtPnBvbGxfdGltZW91dCkpOwogCQlicmVhazsKIAljYXNlIE9UR19TVEFURV9BX1dBSVRfVkZBTEw6CiAJCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX0FfV0FJVF9WUklTRTsKQEAgLTMzMCwyOCArMzMwLDYgQEAKIAogCWRldl9kYmcobXVzYi0+Y29udHJvbGxlciwgInVzYmludHIgKCV4KSBlcGludHIoJXgpXG4iLAogCQkJdXNiaW50ciwgZXBpbnRyKTsKLQkvKgotCSAqIERSVlZCVVMgSVJRcyBhcmUgdGhlIG9ubHkgcHJveHkgd2UgaGF2ZSAoYSB2ZXJ5IHBvb3Igb25lISkgZm9yCi0JICogRFNQUyBJUCdzIG1pc3NpbmcgSUQgY2hhbmdlIElSUS4gIFdlIG5lZWQgYW4gSUQgY2hhbmdlIElSUSB0bwotCSAqIHN3aXRjaCBhcHByb3ByaWF0ZWx5IGJldHdlZW4gaGFsdmVzIG9mIHRoZSBPVEcgc3RhdGUgbWFjaGluZS4KLQkgKiBNYW5hZ2luZyBERVZDVEwuU0VTU0lPTiBwZXIgTWVudG9yIGRvY3MgcmVxdWlyZXMgdGhhdCB3ZSBrbm93IGl0cwotCSAqIHZhbHVlIGJ1dCBERVZDVEwuQkRFVklDRSBpcyBpbnZhbGlkIHdpdGhvdXQgREVWQ1RMLlNFU1NJT04gc2V0LgotCSAqIEFsc28sIERSVlZCVVMgcHVsc2VzIGZvciBTUlAgKGJ1dCBub3QgYXQgNVYpIC4uLgotCSAqLwotCWlmIChpc19ob3N0X2FjdGl2ZShtdXNiKSAmJiB1c2JpbnRyICYgTVVTQl9JTlRSX0JBQkJMRSkgewotCQlwcl9pbmZvKCJDQVVUSU9OOiBtdXNiOiBCYWJibGUgSW50ZXJydXB0IE9jY3VycmVkXG4iKTsKLQotCQkvKgotCQkgKiBXaGVuIGEgYmFiYmxlIGNvbmRpdGlvbiBvY2N1cnMsIHRoZSBtdXNiIGNvbnRyb2xsZXIgcmVtb3ZlcwotCQkgKiB0aGUgc2Vzc2lvbiBhbmQgaXMgbm8gbG9uZ2VyIGluIGhvc3QgbW9kZS4gSGVuY2UsIGFsbAotCQkgKiBkZXZpY2VzIGNvbm5lY3RlZCB0byBpdHMgcm9vdCBodWIgZ2V0IGRpc2Nvbm5lY3RlZC4KLQkJICoKLQkJICogSGFuZCB0aGlzIGVycm9yIGRvd24gdG8gdGhlIG11c2IgY29yZSBpc3IsIHNvIGl0IGNhbgotCQkgKiByZWNvdmVyLgotCQkgKi8KLQkJbXVzYi0+aW50X3VzYiA9IE1VU0JfSU5UUl9CQUJCTEUgfCBNVVNCX0lOVFJfRElTQ09OTkVDVDsKLQkJbXVzYi0+aW50X3R4ID0gbXVzYi0+aW50X3J4ID0gMDsKLQl9CiAKIAlpZiAodXNiaW50ciAmICgoMSA8PCB3cnAtPmRydnZidXMpIDw8IHdycC0+dXNiX3NoaWZ0KSkgewogCQlpbnQgZHJ2dmJ1cyA9IGRzcHNfcmVhZGwocmVnX2Jhc2UsIHdycC0+c3RhdHVzKTsKQEAgLTM3NCw4ICszNTIsOCBAQAogCQkJICovCiAJCQltdXNiLT5pbnRfdXNiICY9IH5NVVNCX0lOVFJfVkJVU0VSUk9SOwogCQkJbXVzYi0+eGNlaXYtPm90Zy0+c3RhdGUgPSBPVEdfU1RBVEVfQV9XQUlUX1ZGQUxMOwotCQkJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwKLQkJCQkJamlmZmllcyArIHdycC0+cG9sbF9zZWNvbmRzICogSFopOworCQkJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgamlmZmllcyArCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMod3JwLT5wb2xsX3RpbWVvdXQpKTsKIAkJCVdBUk5JTkcoIlZCVVMgZXJyb3Igd29ya2Fyb3VuZCAoZGVsYXkgY29taW5nKVxuIik7CiAJCX0gZWxzZSBpZiAoZHJ2dmJ1cykgewogCQkJTVVTQl9IU1RfTU9ERShtdXNiKTsKQEAgLTQwNCw3ICszODIsOCBAQAogCS8qIFBvbGwgZm9yIElEIGNoYW5nZSBpbiBPVEcgcG9ydCBtb2RlICovCiAJaWYgKG11c2ItPnhjZWl2LT5vdGctPnN0YXRlID09IE9UR19TVEFURV9CX0lETEUgJiYKIAkJCW11c2ItPnBvcnRfbW9kZSA9PSBNVVNCX1BPUlRfTU9ERV9EVUFMX1JPTEUpCi0JCW1vZF90aW1lcigmZ2x1ZS0+dGltZXIsIGppZmZpZXMgKyB3cnAtPnBvbGxfc2Vjb25kcyAqIEhaKTsKKwkJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgamlmZmllcyArCisJCQkJbXNlY3NfdG9famlmZmllcyh3cnAtPnBvbGxfdGltZW91dCkpOwogb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIApAQCAtNDUzLDcgKzQzMiw3IEBACiAJbXVzYi0+Y3RybF9iYXNlID0gcmVnX2Jhc2U7CiAKIAkvKiBOT1AgZHJpdmVyIG5lZWRzIGNoYW5nZSBpZiBzdXBwb3J0aW5nIGR1YWwgaW5zdGFuY2UgKi8KLQltdXNiLT54Y2VpdiA9IGRldm1fdXNiX2dldF9waHlfYnlfcGhhbmRsZShkZXYsICJwaHlzIiwgMCk7CisJbXVzYi0+eGNlaXYgPSBkZXZtX3VzYl9nZXRfcGh5X2J5X3BoYW5kbGUoZGV2LT5wYXJlbnQsICJwaHlzIiwgMCk7CiAJaWYgKElTX0VSUihtdXNiLT54Y2VpdikpCiAJCXJldHVybiBQVFJfRVJSKG11c2ItPnhjZWl2KTsKIApAQCAtNDk3LDcgKzQ3Niw3IEBACiAJICogbG9naWMgZW5hYmxlZC4KIAkgKi8KIAl2YWwgPSBkc3BzX3JlYWRiKG11c2ItPm1yZWdzLCBNVVNCX0JBQkJMRV9DVEwpOwotCWlmICh2YWwgPT0gTVVTQl9CQUJCTEVfUkNWX0RJU0FCTEUpIHsKKwlpZiAodmFsICYgTVVTQl9CQUJCTEVfUkNWX0RJU0FCTEUpIHsKIAkJZ2x1ZS0+c3dfYmFiYmxlX2VuYWJsZWQgPSB0cnVlOwogCQl2YWwgfD0gTVVTQl9CQUJCTEVfU1dfU0VTU0lPTl9DVFJMOwogCQlkc3BzX3dyaXRlYihtdXNiLT5tcmVncywgTVVTQl9CQUJCTEVfQ1RMLCB2YWwpOwpAQCAtNTcxLDcgKzU1MCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBib29sICBzd19iYWJibGVfY29udHJvbChzdHJ1Y3QgbXVzYiAqbXVzYikKK3N0YXRpYyBib29sIGRzcHNfc3dfYmFiYmxlX2NvbnRyb2woc3RydWN0IG11c2IgKm11c2IpCiB7CiAJdTggYmFiYmxlX2N0bDsKIAlib29sIHNlc3Npb25fcmVzdGFydCA9ICBmYWxzZTsKQEAgLTYyMiwzNyArNjAxLDM2IEBACiAJcmV0dXJuIHNlc3Npb25fcmVzdGFydDsKIH0KIAotc3RhdGljIGludCBkc3BzX211c2JfcmVzZXQoc3RydWN0IG11c2IgKm11c2IpCitzdGF0aWMgaW50IGRzcHNfbXVzYl9yZWNvdmVyKHN0cnVjdCBtdXNiICptdXNiKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IG11c2ItPmNvbnRyb2xsZXI7CiAJc3RydWN0IGRzcHNfZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0JY29uc3Qgc3RydWN0IGRzcHNfbXVzYl93cmFwcGVyICp3cnAgPSBnbHVlLT53cnA7Ci0JaW50IHNlc3Npb25fcmVzdGFydCA9IDAsIGVycm9yOworCWludCBzZXNzaW9uX3Jlc3RhcnQgPSAwOwogCiAJaWYgKGdsdWUtPnN3X2JhYmJsZV9lbmFibGVkKQotCQlzZXNzaW9uX3Jlc3RhcnQgPSBzd19iYWJibGVfY29udHJvbChtdXNiKTsKLQkvKgotCSAqIEluIGNhc2Ugb2YgbmV3IHNpbGljb24gdmVyc2lvbiBiYWJibGUgY29uZGl0aW9uIGNhbiBiZSByZWNvdmVyZWQKLQkgKiB3aXRob3V0IHJlc2V0dGluZyB0aGUgTVVTQi4gQnV0IGZvciBvbGRlciBzaWxpY29uIHZlcnNpb25zLCBNVVNCCi0JICogcmVzZXQgaXMgbmVlZGVkCi0JICovCi0JaWYgKHNlc3Npb25fcmVzdGFydCB8fCAhZ2x1ZS0+c3dfYmFiYmxlX2VuYWJsZWQpIHsKLQkJZGV2X2luZm8obXVzYi0+Y29udHJvbGxlciwgIlJlc3RhcnRpbmcgTVVTQiB0byByZWNvdmVyIGZyb20gQmFiYmxlXG4iKTsKLQkJZHNwc193cml0ZWwobXVzYi0+Y3RybF9iYXNlLCB3cnAtPmNvbnRyb2wsICgxIDw8IHdycC0+cmVzZXQpKTsKLQkJdXNsZWVwX3JhbmdlKDEwMCwgMjAwKTsKLQkJdXNiX3BoeV9zaHV0ZG93bihtdXNiLT54Y2Vpdik7Ci0JCWVycm9yID0gcGh5X3Bvd2VyX29mZihtdXNiLT5waHkpOwotCQlpZiAoZXJyb3IpCi0JCQlkZXZfZXJyKGRldiwgInBoeSBzaHV0ZG93biBmYWlsZWQ6ICVpXG4iLCBlcnJvcik7Ci0JCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7Ci0JCXVzYl9waHlfaW5pdChtdXNiLT54Y2Vpdik7Ci0JCWVycm9yID0gcGh5X3Bvd2VyX29uKG11c2ItPnBoeSk7Ci0JCWlmIChlcnJvcikKLQkJCWRldl9lcnIoZGV2LCAicGh5IHBvd2VydXAgZmFpbGVkOiAlaVxuIiwgZXJyb3IpOworCQlzZXNzaW9uX3Jlc3RhcnQgPSBkc3BzX3N3X2JhYmJsZV9jb250cm9sKG11c2IpOworCWVsc2UKIAkJc2Vzc2lvbl9yZXN0YXJ0ID0gMTsKKworCXJldHVybiBzZXNzaW9uX3Jlc3RhcnQgPyAwIDogLUVQSVBFOworfQorCisvKiBTaW1pbGFyIHRvIGFtMzV4LCBkbTgxeHggc3VwcG9ydCBvbmx5IDMyLWJpdCByZWFkIG9wZXJhdGlvbiAqLworc3RhdGljIHZvaWQgZHNwc19yZWFkX2ZpZm8zMihzdHJ1Y3QgbXVzYl9od19lcCAqaHdfZXAsIHUxNiBsZW4sIHU4ICpkc3QpCit7CisJdm9pZCBfX2lvbWVtICpmaWZvID0gaHdfZXAtPmZpZm87CisKKwlpZiAobGVuID49IDQpIHsKKwkJaW9yZWFkMzJfcmVwKGZpZm8sIGRzdCwgbGVuID4+IDIpOworCQlkc3QgKz0gbGVuICYgfjB4MDM7CisJCWxlbiAmPSAweDAzOwogCX0KIAotCXJldHVybiAhc2Vzc2lvbl9yZXN0YXJ0OworCS8qIFJlYWQgYW55IHJlbWFpbmluZyAxIHRvIDMgYnl0ZXMgKi8KKwlpZiAobGVuID4gMCkgeworCQl1MzIgdmFsID0gbXVzYl9yZWFkbChmaWZvLCAwKTsKKwkJbWVtY3B5KGRzdCwgJnZhbCwgbGVuKTsKKwl9CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbXVzYl9wbGF0Zm9ybV9vcHMgZHNwc19vcHMgPSB7CkBAIC02NjUsNyArNjQzLDcgQEAKIAogCS50cnlfaWRsZQk9IGRzcHNfbXVzYl90cnlfaWRsZSwKIAkuc2V0X21vZGUJPSBkc3BzX211c2Jfc2V0X21vZGUsCi0JLnJlc2V0CQk9IGRzcHNfbXVzYl9yZXNldCwKKwkucmVjb3Zlcgk9IGRzcHNfbXVzYl9yZWNvdmVyLAogfTsKIAogc3RhdGljIHU2NCBtdXNiX2RtYW1hc2sgPSBETUFfQklUX01BU0soMzIpOwpAQCAtNzM3LDcgKzcxNSw2IEBACiAJbXVzYi0+ZGV2LnBhcmVudAkJPSBkZXY7CiAJbXVzYi0+ZGV2LmRtYV9tYXNrCQk9ICZtdXNiX2RtYW1hc2s7CiAJbXVzYi0+ZGV2LmNvaGVyZW50X2RtYV9tYXNrCT0gbXVzYl9kbWFtYXNrOwotCW11c2ItPmRldi5vZl9ub2RlCQk9IG9mX25vZGVfZ2V0KGRuKTsKIAogCWdsdWUtPm11c2IgPSBtdXNiOwogCkBAIC04MDIsNiArNzc5LDkgQEAKIAl9CiAJd3JwID0gbWF0Y2gtPmRhdGE7CiAKKwlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocGRldi0+ZGV2Lm9mX25vZGUsICJ0aSxtdXNiLWRtODE2IikpCisJCWRzcHNfb3BzLnJlYWRfZmlmbyA9IGRzcHNfcmVhZF9maWZvMzI7CisKIAkvKiBhbGxvY2F0ZSBnbHVlICovCiAJZ2x1ZSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdsdWUpCkBAIC04NzMsMTIgKzg1MywxNCBAQAogCS5yeGVwX3NoaWZ0CQk9IDE2LAogCS5yeGVwX21hc2sJCT0gMHhmZmZlLAogCS5yeGVwX2JpdG1hcAkJPSAoMHhmZmZlIDw8IDE2KSwKLQkucG9sbF9zZWNvbmRzCQk9IDIsCisJLnBvbGxfdGltZW91dAkJPSAyMDAwLCAvKiBtcyAqLwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXVzYl9kc3BzX29mX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJ0aSxtdXNiLWFtMzN4eCIsCi0JCS5kYXRhID0gKHZvaWQgKikgJmFtMzN4eF9kcml2ZXJfZGF0YSwgfSwKKwkJLmRhdGEgPSAmYW0zM3h4X2RyaXZlcl9kYXRhLCB9LAorCXsgLmNvbXBhdGlibGUgPSAidGksbXVzYi1kbTgxNiIsCisJCS5kYXRhID0gJmFtMzN4eF9kcml2ZXJfZGF0YSwgfSwKIAl7ICB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG11c2JfZHNwc19vZl9tYXRjaCk7CkBAIC05MjksNyArOTExLDggQEAKIAlkc3BzX3dyaXRlbChtYmFzZSwgd3JwLT5yeF9tb2RlLCBnbHVlLT5jb250ZXh0LnJ4X21vZGUpOwogCWlmIChtdXNiLT54Y2Vpdi0+b3RnLT5zdGF0ZSA9PSBPVEdfU1RBVEVfQl9JRExFICYmCiAJICAgIG11c2ItPnBvcnRfbW9kZSA9PSBNVVNCX1BPUlRfTU9ERV9EVUFMX1JPTEUpCi0JCW1vZF90aW1lcigmZ2x1ZS0+dGltZXIsIGppZmZpZXMgKyB3cnAtPnBvbGxfc2Vjb25kcyAqIEhaKTsKKwkJbW9kX3RpbWVyKCZnbHVlLT50aW1lciwgamlmZmllcyArCisJCQkJbXNlY3NfdG9famlmZmllcyh3cnAtPnBvbGxfdGltZW91dCkpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKaW5kZXggYjJkOTA0MC4uNGM0ODFjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYwpAQCAtMTg3Niw0NCArMTg3Niw2IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIHZvaWQgc3RvcF9hY3Rpdml0eShzdHJ1Y3QgbXVzYiAqbXVzYiwgc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCi17Ci0JaW50CQkJaTsKLQlzdHJ1Y3QgbXVzYl9od19lcAkqaHdfZXA7Ci0KLQkvKiBkb24ndCBkaXNjb25uZWN0IGlmIGl0J3Mgbm90IGNvbm5lY3RlZCAqLwotCWlmIChtdXNiLT5nLnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQotCQlkcml2ZXIgPSBOVUxMOwotCWVsc2UKLQkJbXVzYi0+Zy5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOwotCi0JLyogZGVhY3RpdmF0ZSB0aGUgaGFyZHdhcmUgKi8KLQlpZiAobXVzYi0+c29mdGNvbm5lY3QpIHsKLQkJbXVzYi0+c29mdGNvbm5lY3QgPSAwOwotCQltdXNiX3B1bGx1cChtdXNiLCAwKTsKLQl9Ci0JbXVzYl9zdG9wKG11c2IpOwotCi0JLyoga2lsbGluZyBhbnkgb3V0c3RhbmRpbmcgcmVxdWVzdHMgd2lsbCBxdWllc2NlIHRoZSBkcml2ZXI7Ci0JICogdGhlbiByZXBvcnQgZGlzY29ubmVjdAotCSAqLwotCWlmIChkcml2ZXIpIHsKLQkJZm9yIChpID0gMCwgaHdfZXAgPSBtdXNiLT5lbmRwb2ludHM7Ci0JCQkJaSA8IG11c2ItPm5yX2VuZHBvaW50czsKLQkJCQlpKyssIGh3X2VwKyspIHsKLQkJCW11c2JfZXBfc2VsZWN0KG11c2ItPm1yZWdzLCBpKTsKLQkJCWlmIChod19lcC0+aXNfc2hhcmVkX2ZpZm8gLyogfHwgIWVwbnVtICovKSB7Ci0JCQkJbnVrZSgmaHdfZXAtPmVwX2luLCAtRVNIVVRET1dOKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGh3X2VwLT5tYXhfcGFja2V0X3N6X3R4KQotCQkJCQludWtlKCZod19lcC0+ZXBfaW4sIC1FU0hVVERPV04pOwotCQkJCWlmIChod19lcC0+bWF4X3BhY2tldF9zel9yeCkKLQkJCQkJbnVrZSgmaHdfZXAtPmVwX291dCwgLUVTSFVURE9XTik7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KIC8qCiAgKiBVbnJlZ2lzdGVyIHRoZSBnYWRnZXQgZHJpdmVyLiBVc2VkIGJ5IGdhZGdldCBkcml2ZXJzIHdoZW4KICAqIHVucmVnaXN0ZXJpbmcgdGhlbXNlbHZlcyBmcm9tIHRoZSBjb250cm9sbGVyLgpAQCAtMTk0MCw3ICsxOTAyLDcgQEAKIAkodm9pZCkgbXVzYl9nYWRnZXRfdmJ1c19kcmF3KCZtdXNiLT5nLCAwKTsKIAogCW11c2ItPnhjZWl2LT5vdGctPnN0YXRlID0gT1RHX1NUQVRFX1VOREVGSU5FRDsKLQlzdG9wX2FjdGl2aXR5KG11c2IsIE5VTEwpOworCW11c2Jfc3RvcChtdXNiKTsKIAlvdGdfc2V0X3BlcmlwaGVyYWwobXVzYi0+eGNlaXYtPm90ZywgTlVMTCk7CiAKIAltdXNiLT5pc19hY3RpdmUgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX3ZpcnRodWIuYyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl92aXJ0aHViLmMKaW5kZXggMjk0ZTE1OS4uODZjNGI1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX3ZpcnRodWIuYworKysgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfdmlydGh1Yi5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIAkJLyogbGF0ZXIsIEdldFBvcnRTdGF0dXMgd2lsbCBzdG9wIFJFU1VNRSBzaWduYWxpbmcgKi8KIAkJbXVzYi0+cG9ydDFfc3RhdHVzIHw9IE1VU0JfUE9SVF9TVEFUX1JFU1VNRTsKIAkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZtdXNiLT5maW5pc2hfcmVzdW1lX3dvcmssCi0JCQkJICAgICAgbXNlY3NfdG9famlmZmllcygyMCkpOworCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoVVNCX1JFU1VNRV9USU1FT1VUKSk7CiAJfQogfQogCkBAIC0zNDUsNyArMzQ1LDcgQEAKIAkJc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciAqZGVzYyA9ICh2b2lkICopYnVmOwogCiAJCWRlc2MtPmJEZXNjTGVuZ3RoID0gOTsKLQkJZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gMHgyOTsKKwkJZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0hVQjsKIAkJZGVzYy0+Yk5iclBvcnRzID0gMTsKIAkJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9IGNwdV90b19sZTE2KAogCQkJSFVCX0NIQVJfSU5EVl9QT1JUX0xQU00gLyogcGVyLXBvcnQgcG93ZXIgc3dpdGNoaW5nICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL3BoeS9LY29uZmlnCmluZGV4IDUyZDNkNTguLjIxNzU2NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL3BoeS9LY29uZmlnCkBAIC0xMzksNyArMTM5LDcgQEAKIAogY29uZmlnIFVTQl9NU01fT1RHCiAJdHJpc3RhdGUgIlF1YWxjb21tIG9uLWNoaXAgVVNCIE9URyBjb250cm9sbGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiAoVVNCIHx8IFVTQl9HQURHRVQpICYmIChBUkNIX01TTSB8fCBBUkNIX1FDT00gfHwgQ09NUElMRV9URVNUKQorCWRlcGVuZHMgb24gKFVTQiB8fCBVU0JfR0FER0VUKSAmJiAoQVJDSF9RQ09NIHx8IENPTVBJTEVfVEVTVCkKIAlkZXBlbmRzIG9uIFJFU0VUX0NPTlRST0xMRVIKIAlzZWxlY3QgVVNCX1BIWQogCWhlbHAKQEAgLTIwMiwxMyArMjAyLDEzIEBACiBjb25maWcgVVNCX1VMUEkKIAlib29sICJHZW5lcmljIFVMUEkgVHJhbnNjZWl2ZXIgRHJpdmVyIgogCWRlcGVuZHMgb24gQVJNIHx8IEFSTTY0CisJc2VsZWN0IFVTQl9VTFBJX1ZJRVdQT1JUCiAJaGVscAogCSAgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBVTFBJIGNvbm5lY3RlZCBVU0IgT1RHIHRyYW5zY2VpdmVycyB3aGljaAogCSAgYXJlIGxpa2VseSBmb3VuZCBvbiBlbWJlZGRlZCBib2FyZHMuCiAKIGNvbmZpZyBVU0JfVUxQSV9WSUVXUE9SVAogCWJvb2wKLQlkZXBlbmRzIG9uIFVTQl9VTFBJCiAJaGVscAogCSAgUHJvdmlkZXMgcmVhZC93cml0ZSBvcGVyYXRpb25zIHRvIHRoZSBVTFBJIHBoeSByZWdpc3RlciBzZXQgZm9yCiAJICBjb250cm9sbGVycyB3aXRoIGEgdmlld3BvcnQgcmVnaXN0ZXIgKGUuZy4gQ2hpcGlkZWEvQVJDIGNvbnRyb2xsZXJzKS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3BoeS9vZi5jIGIvZHJpdmVycy91c2IvcGh5L29mLmMKaW5kZXggN2VhMDE1NC4uNjZmZmE4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcGh5L29mLmMKKysrIGIvZHJpdmVycy91c2IvcGh5L29mLmMKQEAgLTI3LDcgKzI3LDcgQEAKICAqIEBucDoJUG9pbnRlciB0byB0aGUgZ2l2ZW4gZGV2aWNlX25vZGUKICAqCiAgKiBUaGUgZnVuY3Rpb24gZ2V0cyBwaHkgaW50ZXJmYWNlIHN0cmluZyBmcm9tIHByb3BlcnR5ICdwaHlfdHlwZScsCi0gKiBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGlnIGVudW0gdXNiX3BoeV9pbnRlcmZhY2UKKyAqIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGVudW0gdXNiX3BoeV9pbnRlcmZhY2UKICAqLwogZW51bSB1c2JfcGh5X2ludGVyZmFjZSBvZl91c2JfZ2V0X3BoeV9tb2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LWFiODUwMC11c2IuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktYWI4NTAwLXVzYi5jCmluZGV4IDBiMWJkMjMuLjcyMjVkNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktYWI4NTAwLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3BoeS9waHktYWI4NTAwLXVzYi5jCkBAIC0yNzcsNyArMjc3LDcgQEAKIAkJCWRldl9lcnIoYWItPmRldiwgIkZhaWxlZCB0byBzZXQgdGhlIFZpbnRjb3JlIHRvIDEuM1YsIHJldD0lZFxuIiwKIAkJCQkJcmV0KTsKIAotCQlyZXQgPSByZWd1bGF0b3Jfc2V0X29wdGltdW1fbW9kZShhYi0+dl91bHBpLCAyODAwMCk7CisJCXJldCA9IHJlZ3VsYXRvcl9zZXRfbG9hZChhYi0+dl91bHBpLCAyODAwMCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZGV2X2VycihhYi0+ZGV2LCAiRmFpbGVkIHRvIHNldCBvcHRpbXVtIG1vZGUgKHJldD0lZClcbiIsCiAJCQkJCXJldCk7CkBAIC0zMTcsNyArMzE3LDcgQEAKIAkJCQkJCWFiLT5zYXZlZF92X3VscGksIHJldCk7CiAJCX0KIAotCQlyZXQgPSByZWd1bGF0b3Jfc2V0X29wdGltdW1fbW9kZShhYi0+dl91bHBpLCAwKTsKKwkJcmV0ID0gcmVndWxhdG9yX3NldF9sb2FkKGFiLT52X3VscGksIDApOwogCQlpZiAocmV0IDwgMCkKIAkJCWRldl9lcnIoYWItPmRldiwgIkZhaWxlZCB0byBzZXQgb3B0aW11bSBtb2RlIChyZXQ9JWQpXG4iLAogCQkJCQlyZXQpOwpAQCAtODkzLDcgKzg5Myw3IEBACiAKIC8qCiAgKiBEaXNjb25uZWN0aW9uIFNlcXVlbmNlOgotICogICAxLiBEaXNjb25lY3QgSW50ZXJydXB0CisgKiAgIDEuIERpc2Nvbm5lY3QgSW50ZXJydXB0CiAgKiAgIDIuIERpc2FibGUgcmVndWxhdG9ycwogICogICAzLiBEaXNhYmxlIEFCIGNsb2NrCiAgKiAgIDQuIERpc2FibGUgdGhlIFBoeQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS1hbTMzNXgtY29udHJvbC5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS1hbTMzNXgtY29udHJvbC5jCmluZGV4IDQwM2ZhYjcuLjdiMzAzNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktYW0zMzV4LWNvbnRyb2wuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LWFtMzM1eC1jb250cm9sLmMKQEAgLTEyNiw2ICsxMjYsOSBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWRldiA9IGJ1c19maW5kX2RldmljZSgmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsIG5vZGUsIG1hdGNoKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIE5VTEw7CisKIAljdHJsX3VzYiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCWlmICghY3RybF91c2IpCiAJCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS1nZW5lcmljLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LWdlbmVyaWMuYwppbmRleCA3MGJlNTBiLi5kZWVlNjhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LWdlbmVyaWMuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LWdlbmVyaWMuYwpAQCAtNjIsMTQgKzYyLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG5vcF9yZXNldF9zZXQoc3RydWN0IHVzYl9waHlfZ2VuZXJpYyAqbm9wLCBpbnQgYXNzZXJ0ZWQpCitzdGF0aWMgdm9pZCBub3BfcmVzZXQoc3RydWN0IHVzYl9waHlfZ2VuZXJpYyAqbm9wKQogewogCWlmICghbm9wLT5ncGlvZF9yZXNldCkKIAkJcmV0dXJuOwogCi0JZ3Bpb2RfZGlyZWN0aW9uX291dHB1dChub3AtPmdwaW9kX3Jlc2V0LCAhYXNzZXJ0ZWQpOworCWdwaW9kX3NldF92YWx1ZShub3AtPmdwaW9kX3Jlc2V0LCAxKTsKIAl1c2xlZXBfcmFuZ2UoMTAwMDAsIDIwMDAwKTsKLQlncGlvZF9zZXRfdmFsdWUobm9wLT5ncGlvZF9yZXNldCwgYXNzZXJ0ZWQpOworCWdwaW9kX3NldF92YWx1ZShub3AtPmdwaW9kX3Jlc2V0LCAwKTsKIH0KIAogLyogaW50ZXJmYWNlIHRvIHJlZ3VsYXRvciBmcmFtZXdvcmsgKi8KQEAgLTE1MSw4ICsxNTEsNyBAQAogCWlmICghSVNfRVJSKG5vcC0+Y2xrKSkKIAkJY2xrX3ByZXBhcmVfZW5hYmxlKG5vcC0+Y2xrKTsKIAotCS8qIERlLWFzc2VydCBSRVNFVCAqLwotCW5vcF9yZXNldF9zZXQobm9wLCAwKTsKKwlub3BfcmVzZXQobm9wKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTYyLDggKzE2MSw3IEBACiB7CiAJc3RydWN0IHVzYl9waHlfZ2VuZXJpYyAqbm9wID0gZGV2X2dldF9kcnZkYXRhKHBoeS0+ZGV2KTsKIAotCS8qIEFzc2VydCBSRVNFVCAqLwotCW5vcF9yZXNldF9zZXQobm9wLCAxKTsKKwlncGlvZF9zZXRfdmFsdWUobm9wLT5ncGlvZF9yZXNldCwgMSk7CiAKIAlpZiAoIUlTX0VSUihub3AtPmNsaykpCiAJCWNsa19kaXNhYmxlX3VucHJlcGFyZShub3AtPmNsayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9waHkvcGh5LW1zbS11c2IuYyBiL2RyaXZlcnMvdXNiL3BoeS9waHktbXNtLXVzYi5jCmluZGV4IDAwMGZkODkuLmM5MTU2YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHktbXNtLXVzYi5jCisrKyBiL2RyaXZlcnMvdXNiL3BoeS9waHktbXNtLXVzYi5jCkBAIC0xNDIsMjcgKzE0MiwyMiBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKG9uKSB7Ci0JCXJldCA9IHJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2RlKG1vdGctPnYxcDgsCi0JCQkJVVNCX1BIWV8xUDhfSFBNX0xPQUQpOworCQlyZXQgPSByZWd1bGF0b3Jfc2V0X2xvYWQobW90Zy0+djFwOCwgVVNCX1BIWV8xUDhfSFBNX0xPQUQpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcHJfZXJyKCJDb3VsZCBub3Qgc2V0IEhQTSBmb3IgdjFwOFxuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0JCXJldCA9IHJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2RlKG1vdGctPnYzcDMsCi0JCQkJVVNCX1BIWV8zUDNfSFBNX0xPQUQpOworCQlyZXQgPSByZWd1bGF0b3Jfc2V0X2xvYWQobW90Zy0+djNwMywgVVNCX1BIWV8zUDNfSFBNX0xPQUQpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcHJfZXJyKCJDb3VsZCBub3Qgc2V0IEhQTSBmb3IgdjNwM1xuIik7Ci0JCQlyZWd1bGF0b3Jfc2V0X29wdGltdW1fbW9kZShtb3RnLT52MXA4LAotCQkJCVVTQl9QSFlfMVA4X0xQTV9MT0FEKTsKKwkJCXJlZ3VsYXRvcl9zZXRfbG9hZChtb3RnLT52MXA4LCBVU0JfUEhZXzFQOF9MUE1fTE9BRCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfSBlbHNlIHsKLQkJcmV0ID0gcmVndWxhdG9yX3NldF9vcHRpbXVtX21vZGUobW90Zy0+djFwOCwKLQkJCQlVU0JfUEhZXzFQOF9MUE1fTE9BRCk7CisJCXJldCA9IHJlZ3VsYXRvcl9zZXRfbG9hZChtb3RnLT52MXA4LCBVU0JfUEhZXzFQOF9MUE1fTE9BRCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcHJfZXJyKCJDb3VsZCBub3Qgc2V0IExQTSBmb3IgdjFwOFxuIik7Ci0JCXJldCA9IHJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2RlKG1vdGctPnYzcDMsCi0JCQkJVVNCX1BIWV8zUDNfTFBNX0xPQUQpOworCQlyZXQgPSByZWd1bGF0b3Jfc2V0X2xvYWQobW90Zy0+djNwMywgVVNCX1BIWV8zUDNfTFBNX0xPQUQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXByX2VycigiQ291bGQgbm90IHNldCBMUE0gZm9yIHYzcDNcbiIpOwogCX0KQEAgLTI2Myw5ICsyNTgsNyBAQAogewogCWludCByZXQ7CiAKLQlpZiAobW90Zy0+cGRhdGEtPmxpbmtfY2xrX3Jlc2V0KQotCQlyZXQgPSBtb3RnLT5wZGF0YS0+bGlua19jbGtfcmVzZXQobW90Zy0+Y2xrLCBhc3NlcnQpOwotCWVsc2UgaWYgKGFzc2VydCkKKwlpZiAoYXNzZXJ0KQogCQlyZXQgPSByZXNldF9jb250cm9sX2Fzc2VydChtb3RnLT5saW5rX3JzdCk7CiAJZWxzZQogCQlyZXQgPSByZXNldF9jb250cm9sX2RlYXNzZXJ0KG1vdGctPmxpbmtfcnN0KTsKQEAgLTI4MSw5ICsyNzQsNyBAQAogewogCWludCByZXQgPSAwOwogCi0JaWYgKG1vdGctPnBkYXRhLT5waHlfY2xrX3Jlc2V0KQotCQlyZXQgPSBtb3RnLT5wZGF0YS0+cGh5X2Nsa19yZXNldChtb3RnLT5waHlfcmVzZXRfY2xrKTsKLQllbHNlIGlmIChtb3RnLT5waHlfcnN0KQorCWlmIChtb3RnLT5waHlfcnN0KQogCQlyZXQgPSByZXNldF9jb250cm9sX3Jlc2V0KG1vdGctPnBoeV9yc3QpOwogCiAJaWYgKHJldCkKQEAgLTE1NTEsMTYgKzE1NDIsNiBAQAogCXBoeSA9ICZtb3RnLT5waHk7CiAJcGh5LT5kZXYgPSAmcGRldi0+ZGV2OwogCi0JaWYgKG1vdGctPnBkYXRhLT5waHlfY2xrX3Jlc2V0KSB7Ci0JCW1vdGctPnBoeV9yZXNldF9jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwKLQkJCQkJICAgbnAgPyAicGh5IiA6ICJ1c2JfcGh5X2NsayIpOwotCi0JCWlmIChJU19FUlIobW90Zy0+cGh5X3Jlc2V0X2NsaykpIHsKLQkJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgdXNiX3BoeV9jbGtcbiIpOwotCQkJcmV0dXJuIFBUUl9FUlIobW90Zy0+cGh5X3Jlc2V0X2Nsayk7Ci0JCX0KLQl9Ci0KIAltb3RnLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgbnAgPyAiY29yZSIgOiAidXNiX2hzX2NsayIpOwogCWlmIChJU19FUlIobW90Zy0+Y2xrKSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IHVzYl9oc19jbGtcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS1yY2FyLWdlbjItdXNiLmMgYi9kcml2ZXJzL3VzYi9waHkvcGh5LXJjYXItZ2VuMi11c2IuYwppbmRleCBmODM4MDg0Li5mODE4MDBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9waHkvcGh5LXJjYXItZ2VuMi11c2IuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LXJjYXItZ2VuMi11c2IuYwpAQCAtNDcsNyArNDcsNyBAQAogCiAvKiBVU0IgR2VuZXJhbCBzdGF0dXMgcmVnaXN0ZXIgKi8KICNkZWZpbmUgVVNCSFNfVUdTVFNfUkVHCQkJMHg4OAotI2RlZmluZSBVU0JIU19VR1NUU19MT0NLCQkoMyA8PCA4KQorI2RlZmluZSBVU0JIU19VR1NUU19MT0NLCQkoMSA8PCA4KQogCiAvKiBFbmFibGUgVVNCSFMgaW50ZXJuYWwgcGh5ICovCiBzdGF0aWMgaW50IF9fcmNhcl9nZW4yX3VzYmhzX3BoeV9lbmFibGUodm9pZCBfX2lvbWVtICpiYXNlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcGh5L3BoeS5jIGIvZHJpdmVycy91c2IvcGh5L3BoeS5jCmluZGV4IDJmOTczNWIuLmQxY2Q2YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3BoeS9waHkuYworKysgYi9kcml2ZXJzL3VzYi9waHkvcGh5LmMKQEAgLTgxLDcgKzgxLDkgQEAKIAogc3RhdGljIGludCBkZXZtX3VzYl9waHlfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMsIHZvaWQgKm1hdGNoX2RhdGEpCiB7Ci0JcmV0dXJuIHJlcyA9PSBtYXRjaF9kYXRhOworCXN0cnVjdCB1c2JfcGh5ICoqcGh5ID0gcmVzOworCisJcmV0dXJuICpwaHkgPT0gbWF0Y2hfZGF0YTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2NvbW1vbi5jIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9jb21tb24uYwppbmRleCA0Y2Y3N2QzLi4wZjdlODUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvY29tbW9uLmMKQEAgLTI3Niw2ICsyNzYsMTYgQEAKIH0KIAogLyoKKyAqCQlpbnRlcnJ1cHQgZnVuY3Rpb25zCisgKi8KK3ZvaWQgdXNiaHNfeHh4c3RzX2NsZWFyKHN0cnVjdCB1c2Joc19wcml2ICpwcml2LCB1MTYgc3RzX3JlZywgdTE2IGJpdCkKK3sKKwl1MTYgcGlwZV9tYXNrID0gKHUxNilHRU5NQVNLKHVzYmhzX2dldF9kcGFyYW0ocHJpdiwgcGlwZV9zaXplKSwgMCk7CisKKwl1c2Joc193cml0ZShwcml2LCBzdHNfcmVnLCB+KDEgPDwgYml0KSAmIHBpcGVfbWFzayk7Cit9CisKKy8qCiAgKgkJbG9jYWwgZnVuY3Rpb25zCiAgKi8KIHN0YXRpYyB2b2lkIHVzYmhzY19zZXRfYnVzd2FpdChzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdikKQEAgLTQ4Nyw2ICs0OTcsMTUgQEAKIAlpZiAoZ3BpbyA+IDApCiAJCWRwYXJhbS0+ZW5hYmxlX2dwaW8gPSBncGlvOwogCisJc3dpdGNoIChkcGFyYW0tPnR5cGUpIHsKKwljYXNlIFVTQkhTX1RZUEVfUjhBNzc5MDoKKwljYXNlIFVTQkhTX1RZUEVfUjhBNzc5MToKKwkJZHBhcmFtLT5oYXNfdXNiX2RtYWMgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKIAlyZXR1cm4gaW5mbzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9jb21tb24uaCBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvY29tbW9uLmgKaW5kZXggZmM5NmU5Mi4uOGM1ZmMxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9jb21tb24uaAorKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2NvbW1vbi5oCkBAIC0xOTMsNiArMTkzLDcgQEAKICNkZWZpbmUgVFlQRV9CVUxLCSgxIDw8IDE0KQogI2RlZmluZSBUWVBFX0lOVAkoMiA8PCAxNCkKICNkZWZpbmUgVFlQRV9JU08JKDMgPDwgMTQpCisjZGVmaW5lIEJGUkUJCSgxIDw8IDEwKQkvKiBCUkRZIEludGVycnVwdCBPcGVyYXRpb24gU3BlYy4gKi8KICNkZWZpbmUgREJMQgkJKDEgPDwgOSkJLyogRG91YmxlIEJ1ZmZlciBNb2RlICovCiAjZGVmaW5lIFNIVE5BSwkJKDEgPDwgNykJLyogUGlwZSBEaXNhYmxlIGluIFRyYW5zZmVyIEVuZCAqLwogI2RlZmluZSBESVJfT1VUCQkoMSA8PCA0KQkvKiBUcmFuc2ZlciBEaXJlY3Rpb24gKi8KQEAgLTIxNiw2ICsyMTcsNyBAQAogI2RlZmluZQlBQ0xSTQkJKDEgPDwgOSkJLyogQnVmZmVyIEF1dG8tQ2xlYXIgTW9kZSAqLwogI2RlZmluZSBTUUNMUgkJKDEgPDwgOCkJLyogVG9nZ2xlIEJpdCBDbGVhciAqLwogI2RlZmluZSBTUVNFVAkJKDEgPDwgNykJLyogVG9nZ2xlIEJpdCBTZXQgKi8KKyNkZWZpbmUgU1FNT04JCSgxIDw8IDYpCS8qIFRvZ2dsZSBCaXQgQ2hlY2sgKi8KICNkZWZpbmUgUEJVU1kJCSgxIDw8IDUpCS8qIFBpcGUgQnVzeSAqLwogI2RlZmluZSBQSURfTUFTSwkoMHgzKQkJLyogUmVzcG9uc2UgUElEICovCiAjZGVmaW5lICBQSURfTkFLCTAKQEAgLTMyNCw2ICszMjYsMTEgQEAKIAkJCSAgIHUxNiBodWJwb3J0LCB1MTYgc3BlZWQpOwogCiAvKgorICogaW50ZXJydXB0IGZ1bmN0aW9ucworICovCit2b2lkIHVzYmhzX3h4eHN0c19jbGVhcihzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiwgdTE2IHN0c19yZWcsIHUxNiBiaXQpOworCisvKgogICogZGF0YQogICovCiBzdHJ1Y3QgdXNiaHNfcHJpdiAqdXNiaHNfcGRldl90b19wcml2KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9maWZvLmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2ZpZm8uYwppbmRleCBkODkxYmZmLi44NTk3Y2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2ZpZm8uYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2ZpZm8uYwpAQCAtODEzLDcgKzgxMyw4IEBACiAJZGVzYy0+Y2FsbGJhY2sJCT0gdXNiaHNmX2RtYV9jb21wbGV0ZTsKIAlkZXNjLT5jYWxsYmFja19wYXJhbQk9IHBpcGU7CiAKLQlpZiAoZG1hZW5naW5lX3N1Ym1pdChkZXNjKSA8IDApIHsKKwlwa3QtPmNvb2tpZSA9IGRtYWVuZ2luZV9zdWJtaXQoZGVzYyk7CisJaWYgKHBrdC0+Y29va2llIDwgMCkgewogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBzdWJtaXQgZG1hIGRlc2NyaXB0b3JcbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtODIyLDEwICs4MjMsMTAgQEAKIAkJZmlmby0+bmFtZSwgdXNiaHNfcGlwZV9udW1iZXIocGlwZSksIHBrdC0+bGVuZ3RoLCBwa3QtPnplcm8pOwogCiAJdXNiaHNfcGlwZV9ydW5uaW5nKHBpcGUsIDEpOwotCXVzYmhzX3BpcGVfc2V0X3RyYW5zX2NvdW50X2lmX2J1bGsocGlwZSwgcGt0LT50cmFucyk7Ci0JdXNiaHNfcGlwZV9lbmFibGUocGlwZSk7CiAJdXNiaHNmX2RtYV9zdGFydChwaXBlLCBmaWZvKTsKKwl1c2Joc19waXBlX3NldF90cmFuc19jb3VudF9pZl9idWxrKHBpcGUsIHBrdC0+dHJhbnMpOwogCWRtYV9hc3luY19pc3N1ZV9wZW5kaW5nKGNoYW4pOworCXVzYmhzX3BpcGVfZW5hYmxlKHBpcGUpOwogfQogCiAvKgpAQCAtODM4LDYgKzgzOSw3IEBACiAJc3RydWN0IHVzYmhzX2ZpZm8gKmZpZm87CiAJaW50IGxlbiA9IHBrdC0+bGVuZ3RoIC0gcGt0LT5hY3R1YWw7CiAJaW50IHJldDsKKwl1aW50cHRyX3QgYWxpZ25fbWFzazsKIAogCWlmICh1c2Joc19waXBlX2lzX2J1c3kocGlwZSkpCiAJCXJldHVybiAwOwpAQCAtODQ3LDEwICs4NDksMTQgQEAKIAkgICAgdXNiaHNfcGlwZV9pc19kY3AocGlwZSkpCiAJCWdvdG8gdXNiaHNmX3Bpb19wcmVwYXJlX3B1c2g7CiAKLQlpZiAobGVuICYgMHg3KSAvKiA4Ynl0ZSBhbGlnbm1lbnQgKi8KKwkvKiBjaGVjayBkYXRhIGxlbmd0aCBpZiB0aGlzIGRyaXZlciBkb24ndCB1c2UgVVNCLURNQUMgKi8KKwlpZiAoIXVzYmhzX2dldF9kcGFyYW0ocHJpdiwgaGFzX3VzYl9kbWFjKSAmJiBsZW4gJiAweDcpCiAJCWdvdG8gdXNiaHNmX3Bpb19wcmVwYXJlX3B1c2g7CiAKLQlpZiAoKHVpbnRwdHJfdCkocGt0LT5idWYgKyBwa3QtPmFjdHVhbCkgJiAweDcpIC8qIDhieXRlIGFsaWdubWVudCAqLworCS8qIGNoZWNrIGJ1ZmZlciBhbGlnbm1lbnQgKi8KKwlhbGlnbl9tYXNrID0gdXNiaHNfZ2V0X2RwYXJhbShwcml2LCBoYXNfdXNiX2RtYWMpID8KKwkJCQkJVVNCSFNfVVNCX0RNQUNfWEZFUl9TSVpFIC0gMSA6IDB4NzsKKwlpZiAoKHVpbnRwdHJfdCkocGt0LT5idWYgKyBwa3QtPmFjdHVhbCkgJiBhbGlnbl9tYXNrKQogCQlnb3RvIHVzYmhzZl9waW9fcHJlcGFyZV9wdXNoOwogCiAJLyogcmV0dXJuIGF0IHRoaXMgdGltZSBpZiB0aGUgcGlwZSBpcyBydW5uaW5nICovCkBAIC05MjQsNyArOTMwLDg1IEBACiAvKgogICoJCURNQSBwb3AgaGFuZGxlcgogICovCi1zdGF0aWMgaW50IHVzYmhzZl9kbWFfdHJ5X3BvcChzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QsIGludCAqaXNfZG9uZSkKKworc3RhdGljIGludCB1c2Joc2ZfZG1hX3ByZXBhcmVfcG9wX3dpdGhfcnhfaXJxKHN0cnVjdCB1c2Joc19wa3QgKnBrdCwKKwkJCQkJICAgICAgaW50ICppc19kb25lKQoreworCXJldHVybiB1c2Joc2ZfcHJlcGFyZV9wb3AocGt0LCBpc19kb25lKTsKK30KKworc3RhdGljIGludCB1c2Joc2ZfZG1hX3ByZXBhcmVfcG9wX3dpdGhfdXNiX2RtYWMoc3RydWN0IHVzYmhzX3BrdCAqcGt0LAorCQkJCQkJaW50ICppc19kb25lKQoreworCXN0cnVjdCB1c2Joc19waXBlICpwaXBlID0gcGt0LT5waXBlOworCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNfcGlwZV90b19wcml2KHBpcGUpOworCXN0cnVjdCB1c2Joc19maWZvICpmaWZvOworCWludCByZXQ7CisKKwlpZiAodXNiaHNfcGlwZV9pc19idXN5KHBpcGUpKQorCQlyZXR1cm4gMDsKKworCS8qIHVzZSBQSU8gaWYgcGFja2V0IGlzIGxlc3MgdGhhbiBwaW9fZG1hX2JvcmRlciBvciBwaXBlIGlzIERDUCAqLworCWlmICgocGt0LT5sZW5ndGggPCB1c2Joc19nZXRfZHBhcmFtKHByaXYsIHBpb19kbWFfYm9yZGVyKSkgfHwKKwkgICAgdXNiaHNfcGlwZV9pc19kY3AocGlwZSkpCisJCWdvdG8gdXNiaHNmX3Bpb19wcmVwYXJlX3BvcDsKKworCWZpZm8gPSB1c2Joc2ZfZ2V0X2RtYV9maWZvKHByaXYsIHBrdCk7CisJaWYgKCFmaWZvKQorCQlnb3RvIHVzYmhzZl9waW9fcHJlcGFyZV9wb3A7CisKKwlpZiAoKHVpbnRwdHJfdClwa3QtPmJ1ZiAmIChVU0JIU19VU0JfRE1BQ19YRkVSX1NJWkUgLSAxKSkKKwkJZ290byB1c2Joc2ZfcGlvX3ByZXBhcmVfcG9wOworCisJdXNiaHNfcGlwZV9jb25maWdfY2hhbmdlX2JmcmUocGlwZSwgMSk7CisKKwlyZXQgPSB1c2Joc2ZfZmlmb19zZWxlY3QocGlwZSwgZmlmbywgMCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdXNiaHNmX3Bpb19wcmVwYXJlX3BvcDsKKworCWlmICh1c2Joc2ZfZG1hX21hcChwa3QpIDwgMCkKKwkJZ290byB1c2Joc2ZfcGlvX3ByZXBhcmVfcG9wX3Vuc2VsZWN0OworCisJLyogRE1BICovCisKKwkvKgorCSAqIHVzYmhzX2ZpZm9fZG1hX3BvcF9oYW5kbGVyIDo6IHByZXBhcmUKKwkgKiBlbmFibGVkIGlycSB0byBjb21lIGhlcmUuCisJICogYnV0IGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgZm9yIERNQS4gZGlzYWJsZSBpdC4KKwkgKi8KKwl1c2Joc2ZfcnhfaXJxX2N0cmwocGlwZSwgMCk7CisKKwlwa3QtPnRyYW5zID0gcGt0LT5sZW5ndGg7CisKKwlJTklUX1dPUksoJnBrdC0+d29yaywgeGZlcl93b3JrKTsKKwlzY2hlZHVsZV93b3JrKCZwa3QtPndvcmspOworCisJcmV0dXJuIDA7CisKK3VzYmhzZl9waW9fcHJlcGFyZV9wb3BfdW5zZWxlY3Q6CisJdXNiaHNmX2ZpZm9fdW5zZWxlY3QocGlwZSwgZmlmbyk7Cit1c2Joc2ZfcGlvX3ByZXBhcmVfcG9wOgorCisJLyoKKwkgKiBjaGFuZ2UgaGFuZGxlciB0byBQSU8KKwkgKi8KKwlwa3QtPmhhbmRsZXIgPSAmdXNiaHNfZmlmb19waW9fcG9wX2hhbmRsZXI7CisJdXNiaHNfcGlwZV9jb25maWdfY2hhbmdlX2JmcmUocGlwZSwgMCk7CisKKwlyZXR1cm4gcGt0LT5oYW5kbGVyLT5wcmVwYXJlKHBrdCwgaXNfZG9uZSk7Cit9CisKK3N0YXRpYyBpbnQgdXNiaHNmX2RtYV9wcmVwYXJlX3BvcChzdHJ1Y3QgdXNiaHNfcGt0ICpwa3QsIGludCAqaXNfZG9uZSkKK3sKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzX3BpcGVfdG9fcHJpdihwa3QtPnBpcGUpOworCisJaWYgKHVzYmhzX2dldF9kcGFyYW0ocHJpdiwgaGFzX3VzYl9kbWFjKSkKKwkJcmV0dXJuIHVzYmhzZl9kbWFfcHJlcGFyZV9wb3Bfd2l0aF91c2JfZG1hYyhwa3QsIGlzX2RvbmUpOworCWVsc2UKKwkJcmV0dXJuIHVzYmhzZl9kbWFfcHJlcGFyZV9wb3Bfd2l0aF9yeF9pcnEocGt0LCBpc19kb25lKTsKK30KKworc3RhdGljIGludCB1c2Joc2ZfZG1hX3RyeV9wb3Bfd2l0aF9yeF9pcnEoc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgKmlzX2RvbmUpCiB7CiAJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSBwa3QtPnBpcGU7CiAJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGlwZSk7CkBAIC05OTMsNyArMTA3NywxNiBAQAogCXJldHVybiBwa3QtPmhhbmRsZXItPnRyeV9ydW4ocGt0LCBpc19kb25lKTsKIH0KIAotc3RhdGljIGludCB1c2Joc2ZfZG1hX3BvcF9kb25lKHN0cnVjdCB1c2Joc19wa3QgKnBrdCwgaW50ICppc19kb25lKQorc3RhdGljIGludCB1c2Joc2ZfZG1hX3RyeV9wb3Aoc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgKmlzX2RvbmUpCit7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGt0LT5waXBlKTsKKworCUJVR19PTih1c2Joc19nZXRfZHBhcmFtKHByaXYsIGhhc191c2JfZG1hYykpOworCisJcmV0dXJuIHVzYmhzZl9kbWFfdHJ5X3BvcF93aXRoX3J4X2lycShwa3QsIGlzX2RvbmUpOworfQorCitzdGF0aWMgaW50IHVzYmhzZl9kbWFfcG9wX2RvbmVfd2l0aF9yeF9pcnEoc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgKmlzX2RvbmUpCiB7CiAJc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSBwa3QtPnBpcGU7CiAJaW50IG1heHAgPSB1c2Joc19waXBlX2dldF9tYXhwYWNrZXQocGlwZSk7CkBAIC0xMDE3LDggKzExMTAsNjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHNpemVfdCB1c2Joc19kbWFfY2FsY19yZWNlaXZlZF9zaXplKHN0cnVjdCB1c2Joc19wa3QgKnBrdCwKKwkJCQkJICAgc3RydWN0IGRtYV9jaGFuICpjaGFuLCBpbnQgZHRsbikKK3sKKwlzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSA9IHBrdC0+cGlwZTsKKwlzdHJ1Y3QgZG1hX3R4X3N0YXRlIHN0YXRlOworCXNpemVfdCByZWNlaXZlZF9zaXplOworCWludCBtYXhwID0gdXNiaHNfcGlwZV9nZXRfbWF4cGFja2V0KHBpcGUpOworCisJZG1hZW5naW5lX3R4X3N0YXR1cyhjaGFuLCBwa3QtPmNvb2tpZSwgJnN0YXRlKTsKKwlyZWNlaXZlZF9zaXplID0gcGt0LT5sZW5ndGggLSBzdGF0ZS5yZXNpZHVlOworCisJaWYgKGR0bG4pIHsKKwkJcmVjZWl2ZWRfc2l6ZSAtPSBVU0JIU19VU0JfRE1BQ19YRkVSX1NJWkU7CisJCXJlY2VpdmVkX3NpemUgJj0gfihtYXhwIC0gMSk7CisJCXJlY2VpdmVkX3NpemUgKz0gZHRsbjsKKwl9CisKKwlyZXR1cm4gcmVjZWl2ZWRfc2l6ZTsKK30KKworc3RhdGljIGludCB1c2Joc2ZfZG1hX3BvcF9kb25lX3dpdGhfdXNiX2RtYWMoc3RydWN0IHVzYmhzX3BrdCAqcGt0LAorCQkJCQkgICAgIGludCAqaXNfZG9uZSkKK3sKKwlzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSA9IHBrdC0+cGlwZTsKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzX3BpcGVfdG9fcHJpdihwaXBlKTsKKwlzdHJ1Y3QgdXNiaHNfZmlmbyAqZmlmbyA9IHVzYmhzX3BpcGVfdG9fZmlmbyhwaXBlKTsKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSB1c2Joc2ZfZG1hX2NoYW5fZ2V0KGZpZm8sIHBrdCk7CisJaW50IHJjdl9sZW47CisKKwkvKgorCSAqIFNpbmNlIHRoZSBkcml2ZXIgZGlzYWJsZXMgcnhfaXJxIGluIERNQSBtb2RlLCB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKwkgKiBjYW5ub3QgdGhlIEJSRFlTVFMuIFNvLCB0aGUgZnVuY3Rpb24gY2xlYXJzIGl0IGhlcmUgYmVjYXVzZSB0aGUKKwkgKiBkcml2ZXIgbWF5IHVzZSBQSU8gbW9kZSBuZXh0IHRpbWUuCisJICovCisJdXNiaHNfeHh4c3RzX2NsZWFyKHByaXYsIEJSRFlTVFMsIHVzYmhzX3BpcGVfbnVtYmVyKHBpcGUpKTsKKworCXJjdl9sZW4gPSB1c2Joc2ZfZmlmb19yY3ZfbGVuKHByaXYsIGZpZm8pOworCXVzYmhzZl9maWZvX2NsZWFyKHBpcGUsIGZpZm8pOworCXBrdC0+YWN0dWFsID0gdXNiaHNfZG1hX2NhbGNfcmVjZWl2ZWRfc2l6ZShwa3QsIGNoYW4sIHJjdl9sZW4pOworCisJdXNiaHNmX2RtYV9zdG9wKHBpcGUsIGZpZm8pOworCXVzYmhzZl9kbWFfdW5tYXAocGt0KTsKKwl1c2Joc2ZfZmlmb191bnNlbGVjdChwaXBlLCBwaXBlLT5maWZvKTsKKworCS8qIFRoZSBkcml2ZXIgY2FuIGFzc3VtZSB0aGUgcnggdHJhbnNhY3Rpb24gaXMgYWx3YXlzICJkb25lIiAqLworCSppc19kb25lID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVzYmhzZl9kbWFfcG9wX2RvbmUoc3RydWN0IHVzYmhzX3BrdCAqcGt0LCBpbnQgKmlzX2RvbmUpCit7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGt0LT5waXBlKTsKKworCWlmICh1c2Joc19nZXRfZHBhcmFtKHByaXYsIGhhc191c2JfZG1hYykpCisJCXJldHVybiB1c2Joc2ZfZG1hX3BvcF9kb25lX3dpdGhfdXNiX2RtYWMocGt0LCBpc19kb25lKTsKKwllbHNlCisJCXJldHVybiB1c2Joc2ZfZG1hX3BvcF9kb25lX3dpdGhfcnhfaXJxKHBrdCwgaXNfZG9uZSk7Cit9CisKIHN0cnVjdCB1c2Joc19wa3RfaGFuZGxlIHVzYmhzX2ZpZm9fZG1hX3BvcF9oYW5kbGVyID0gewotCS5wcmVwYXJlCT0gdXNiaHNmX3ByZXBhcmVfcG9wLAorCS5wcmVwYXJlCT0gdXNiaHNmX2RtYV9wcmVwYXJlX3BvcCwKIAkudHJ5X3J1bgk9IHVzYmhzZl9kbWFfdHJ5X3BvcCwKIAkuZG1hX2RvbmUJPSB1c2Joc2ZfZG1hX3BvcF9kb25lCiB9OwpAQCAtMTA2OSwyMyArMTIyMiwyOSBAQAogCQkJCQkgICAgJmZpZm8tPnJ4X3NsYXZlKTsKIH0KIAotc3RhdGljIHZvaWQgdXNiaHNmX2RtYV9pbml0X2R0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHVzYmhzX2ZpZm8gKmZpZm8pCitzdGF0aWMgdm9pZCB1c2Joc2ZfZG1hX2luaXRfZHQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdXNiaHNfZmlmbyAqZmlmbywKKwkJCSAgICAgICBpbnQgY2hhbm5lbCkKIHsKLQlmaWZvLT50eF9jaGFuID0gZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbF9yZWFzb24oZGV2LCAidHgiKTsKKwljaGFyIG5hbWVbMTZdOworCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAidHglZCIsIGNoYW5uZWwpOworCWZpZm8tPnR4X2NoYW4gPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsX3JlYXNvbihkZXYsIG5hbWUpOwogCWlmIChJU19FUlIoZmlmby0+dHhfY2hhbikpCiAJCWZpZm8tPnR4X2NoYW4gPSBOVUxMOwotCWZpZm8tPnJ4X2NoYW4gPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsX3JlYXNvbihkZXYsICJyeCIpOworCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAicnglZCIsIGNoYW5uZWwpOworCWZpZm8tPnJ4X2NoYW4gPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsX3JlYXNvbihkZXYsIG5hbWUpOwogCWlmIChJU19FUlIoZmlmby0+cnhfY2hhbikpCiAJCWZpZm8tPnJ4X2NoYW4gPSBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCB1c2Joc2ZfZG1hX2luaXQoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IHVzYmhzX2ZpZm8gKmZpZm8pCitzdGF0aWMgdm9pZCB1c2Joc2ZfZG1hX2luaXQoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYsIHN0cnVjdCB1c2Joc19maWZvICpmaWZvLAorCQkJICAgIGludCBjaGFubmVsKQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVzYmhzX3ByaXZfdG9fZGV2KHByaXYpOwogCiAJaWYgKGRldi0+b2Zfbm9kZSkKLQkJdXNiaHNmX2RtYV9pbml0X2R0KGRldiwgZmlmbyk7CisJCXVzYmhzZl9kbWFfaW5pdF9kdChkZXYsIGZpZm8sIGNoYW5uZWwpOwogCWVsc2UKIAkJdXNiaHNmX2RtYV9pbml0X3BkZXYoZmlmbyk7CiAKQEAgLTEyMzEsNyArMTM5MCw3IEBACiAJCQl1c2Joc19nZXRfZHBhcmFtKHByaXYsIGQjI2NoYW5uZWwjI190eF9pZCk7CVwKIAlmaWZvLT5yeF9zbGF2ZS5zaGRtYV9zbGF2ZS5zbGF2ZV9pZCA9CQkJCVwKIAkJCXVzYmhzX2dldF9kcGFyYW0ocHJpdiwgZCMjY2hhbm5lbCMjX3J4X2lkKTsJXAotCXVzYmhzZl9kbWFfaW5pdChwcml2LCBmaWZvKTsJCQkJCVwKKwl1c2Joc2ZfZG1hX2luaXQocHJpdiwgZmlmbywgY2hhbm5lbCk7CQkJCVwKIH0gd2hpbGUgKDApCiAKICNkZWZpbmUgVVNCSFNfREZJRk9fSU5JVChwcml2LCBmaWZvLCBjaGFubmVsKQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2ZpZm8uaCBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvZmlmby5oCmluZGV4IGYwNzAzN2MxLi4wNGQzZjhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2ZpZm8uaAorKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL2ZpZm8uaApAQCAtNTgsNiArNTgsNyBAQAogCQkgICAgIHN0cnVjdCB1c2Joc19wa3QgKnBrdCk7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJZG1hX2FkZHJfdCBkbWE7CisJZG1hX2Nvb2tpZV90IGNvb2tpZTsKIAl2b2lkICpidWY7CiAJaW50IGxlbmd0aDsKIAlpbnQgdHJhbnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2dhZGdldC5jCmluZGV4IGUwMzg0YWYuLmRjMmFhMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2dhZGdldC5jCkBAIC0xMTksMTggKzExOSwzNCBAQAogLyoKICAqCQlxdWV1ZSBwdXNoL3BvcAogICovCitzdGF0aWMgdm9pZCBfX3VzYmhzZ19xdWV1ZV9wb3Aoc3RydWN0IHVzYmhzZ191ZXAgKnVlcCwKKwkJCSAgICAgICBzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QgKnVyZXEsCisJCQkgICAgICAgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgdXNiaHNnX2dwcml2ICpncHJpdiA9IHVzYmhzZ191ZXBfdG9fZ3ByaXYodWVwKTsKKwlzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSA9IHVzYmhzZ191ZXBfdG9fcGlwZSh1ZXApOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVzYmhzZ19ncHJpdl90b19kZXYoZ3ByaXYpOworCXN0cnVjdCB1c2Joc19wcml2ICpwcml2ID0gdXNiaHNnX2dwcml2X3RvX3ByaXYoZ3ByaXYpOworCisJZGV2X2RiZyhkZXYsICJwaXBlICVkIDogcXVldWUgcG9wXG4iLCB1c2Joc19waXBlX251bWJlcihwaXBlKSk7CisKKwl1cmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOworCXNwaW5fdW5sb2NrKHVzYmhzX3ByaXZfdG9fbG9jayhwcml2KSk7CisJdXNiX2dhZGdldF9naXZlYmFja19yZXF1ZXN0KCZ1ZXAtPmVwLCAmdXJlcS0+cmVxKTsKKwlzcGluX2xvY2sodXNiaHNfcHJpdl90b19sb2NrKHByaXYpKTsKK30KKwogc3RhdGljIHZvaWQgdXNiaHNnX3F1ZXVlX3BvcChzdHJ1Y3QgdXNiaHNnX3VlcCAqdWVwLAogCQkJICAgICBzdHJ1Y3QgdXNiaHNnX3JlcXVlc3QgKnVyZXEsCiAJCQkgICAgIGludCBzdGF0dXMpCiB7CiAJc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfdWVwX3RvX2dwcml2KHVlcCk7Ci0Jc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUgPSB1c2Joc2dfdWVwX3RvX3BpcGUodWVwKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSB1c2Joc2dfZ3ByaXZfdG9fZGV2KGdwcml2KTsKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzZ19ncHJpdl90b19wcml2KGdwcml2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JZGV2X2RiZyhkZXYsICJwaXBlICVkIDogcXVldWUgcG9wXG4iLCB1c2Joc19waXBlX251bWJlcihwaXBlKSk7Ci0KLQl1cmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOwotCXVzYl9nYWRnZXRfZ2l2ZWJhY2tfcmVxdWVzdCgmdWVwLT5lcCwgJnVyZXEtPnJlcSk7CisJdXNiaHNfbG9jayhwcml2LCBmbGFncyk7CisJX191c2Joc2dfcXVldWVfcG9wKHVlcCwgdXJlcSwgc3RhdHVzKTsKKwl1c2Joc191bmxvY2socHJpdiwgZmxhZ3MpOwogfQogCiBzdGF0aWMgdm9pZCB1c2Joc2dfcXVldWVfZG9uZShzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiwgc3RydWN0IHVzYmhzX3BrdCAqcGt0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfaG9zdC5jIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfaG9zdC5jCmluZGV4IDk2ZWVhZDYuLmJkMDUwMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2hvc3QuYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9ob3N0LmMKQEAgLTEyMjksNyArMTIyOSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBHZXRIdWJEZXNjcmlwdG9yOgotCQlkZXNjLT5iRGVzY3JpcHRvclR5cGUJCT0gMHgyOTsKKwkJZGVzYy0+YkRlc2NyaXB0b3JUeXBlCQk9IFVTQl9EVF9IVUI7CiAJCWRlc2MtPmJIdWJDb250ckN1cnJlbnQJCT0gMDsKIAkJZGVzYy0+Yk5iclBvcnRzCQkJPSByb290aHViX2lkOwogCQlkZXNjLT5iRGVzY0xlbmd0aAkJPSA5OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9waXBlLmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3BpcGUuYwppbmRleCAwMDdmNDVhLi40ZjljMzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3BpcGUuYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3BpcGUuYwpAQCAtODQsNiArODQsMTcgQEAKIAkJdXNiaHNfYnNldChwcml2LCBwaXBlX3JlZywgbWFzaywgdmFsKTsKIH0KIAorc3RhdGljIHUxNiBfX3VzYmhzcF9waXBlX3h4eF9nZXQoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsCisJCQkJIHUxNiBkY3BfcmVnLCB1MTYgcGlwZV9yZWcpCit7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc19waXBlX3RvX3ByaXYocGlwZSk7CisKKwlpZiAodXNiaHNfcGlwZV9pc19kY3AocGlwZSkpCisJCXJldHVybiB1c2Joc19yZWFkKHByaXYsIGRjcF9yZWcpOworCWVsc2UKKwkJcmV0dXJuIHVzYmhzX3JlYWQocHJpdiwgcGlwZV9yZWcpOworfQorCiAvKgogICoJCURDUENGRy9QSVBFQ0ZHIGZ1bmN0aW9ucwogICovCkBAIC05Miw2ICsxMDMsMTEgQEAKIAlfX3VzYmhzcF9waXBlX3h4eF9zZXQocGlwZSwgRENQQ0ZHLCBQSVBFQ0ZHLCBtYXNrLCB2YWwpOwogfQogCitzdGF0aWMgdTE2IHVzYmhzcF9waXBlX2NmZ19nZXQoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUpCit7CisJcmV0dXJuIF9fdXNiaHNwX3BpcGVfeHh4X2dldChwaXBlLCBEQ1BDRkcsIFBJUEVDRkcpOworfQorCiAvKgogICoJCVBJUEVuVFJOL1BJUEVuVFJFIGZ1bmN0aW9ucwogICovCkBAIC02MTYsNiArNjMyLDExIEBACiAJdXNiaHNwX3BpcGVjdHJsX3NldChwaXBlLCBtYXNrLCB2YWwpOwogfQogCitzdGF0aWMgaW50IHVzYmhzX3BpcGVfZ2V0X2RhdGFfc2VxdWVuY2Uoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUpCit7CisJcmV0dXJuICEhKHVzYmhzcF9waXBlY3RybF9nZXQocGlwZSkgJiBTUU1PTik7Cit9CisKIHZvaWQgdXNiaHNfcGlwZV9jbGVhcihzdHJ1Y3QgdXNiaHNfcGlwZSAqcGlwZSkKIHsKIAlpZiAodXNiaHNfcGlwZV9pc19kY3AocGlwZSkpIHsKQEAgLTYyNiw2ICs2NDcsMjQgQEAKIAl9CiB9CiAKK3ZvaWQgdXNiaHNfcGlwZV9jb25maWdfY2hhbmdlX2JmcmUoc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsIGludCBlbmFibGUpCit7CisJaW50IHNlcXVlbmNlOworCisJaWYgKHVzYmhzX3BpcGVfaXNfZGNwKHBpcGUpKQorCQlyZXR1cm47CisKKwl1c2Joc3BfcGlwZV9zZWxlY3QocGlwZSk7CisJLyogY2hlY2sgaWYgdGhlIGRyaXZlciBuZWVkcyB0byBjaGFuZ2UgdGhlIEJGUkUgdmFsdWUgKi8KKwlpZiAoIShlbmFibGUgXiAhISh1c2Joc3BfcGlwZV9jZmdfZ2V0KHBpcGUpICYgQkZSRSkpKQorCQlyZXR1cm47CisKKwlzZXF1ZW5jZSA9IHVzYmhzX3BpcGVfZ2V0X2RhdGFfc2VxdWVuY2UocGlwZSk7CisJdXNiaHNwX3BpcGVfY2ZnX3NldChwaXBlLCBCRlJFLCBlbmFibGUgPyBCRlJFIDogMCk7CisJdXNiaHNfcGlwZV9jbGVhcihwaXBlKTsKKwl1c2Joc19waXBlX2RhdGFfc2VxdWVuY2UocGlwZSwgc2VxdWVuY2UpOworfQorCiBzdGF0aWMgc3RydWN0IHVzYmhzX3BpcGUgKnVzYmhzcF9nZXRfcGlwZShzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiwgdTMyIHR5cGUpCiB7CiAJc3RydWN0IHVzYmhzX3BpcGUgKnBvcywgKnBpcGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL3BpcGUuaCBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvcGlwZS5oCmluZGV4IGQyNGEwNTkuLmIwYmM3YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvcGlwZS5oCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvcGlwZS5oCkBAIC05Nyw2ICs5Nyw3IEBACiB2b2lkIHVzYmhzX3BpcGVfc2VsZWN0X2ZpZm8oc3RydWN0IHVzYmhzX3BpcGUgKnBpcGUsIHN0cnVjdCB1c2Joc19maWZvICpmaWZvKTsKIHZvaWQgdXNiaHNfcGlwZV9jb25maWdfdXBkYXRlKHN0cnVjdCB1c2Joc19waXBlICpwaXBlLCB1MTYgZGV2c2VsLAogCQkJICAgICAgdTE2IGVwbnVtLCB1MTYgbWF4cCk7Cit2b2lkIHVzYmhzX3BpcGVfY29uZmlnX2NoYW5nZV9iZnJlKHN0cnVjdCB1c2Joc19waXBlICpwaXBlLCBpbnQgZW5hYmxlKTsKIAogI2RlZmluZSB1c2Joc19waXBlX3NlcXVlbmNlX2RhdGEwKHBpcGUpCXVzYmhzX3BpcGVfZGF0YV9zZXF1ZW5jZShwaXBlLCAwKQogI2RlZmluZSB1c2Joc19waXBlX3NlcXVlbmNlX2RhdGExKHBpcGUpCXVzYmhzX3BpcGVfZGF0YV9zZXF1ZW5jZShwaXBlLCAxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2NoMzQxLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY2gzNDEuYwppbmRleCBlZGU0ZjVmLi5jNzM4MDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwvY2gzNDEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvY2gzNDEuYwpAQCAtMzI1LDcgKzMyNSw2IEBACiAJaWYgKHIpIHsKIAkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgLSBmYWlsZWQgdG8gc3VibWl0IGludGVycnVwdCB1cmI6ICVkXG4iLAogCQkJX19mdW5jX18sIHIpOwotCQljaDM0MV9jbG9zZShwb3J0KTsKIAkJZ290byBvdXQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZjgxMjMyLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZjgxMjMyLmMKaW5kZXggYzVkYzIzMy4uOTcyZjVhNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Y4MTIzMi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mODEyMzIuYwpAQCAtMTksMTAgKzE5LDExIEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi9zZXJpYWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfcmVnLmg+CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBpZF90YWJsZVtdID0gewogCXsgVVNCX0RFVklDRSgweDE5MzQsIDB4MDcwNikgfSwKQEAgLTMwLDM3ICszMSwyMTggQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgaWRfdGFibGUpOwogCi0jZGVmaW5lIENPTlRST0xfRFRSCQkJMHgwMQotI2RlZmluZSBDT05UUk9MX1JUUwkJCTB4MDIKKy8qIE1heGltdW0gYmF1ZHJhdGUgZm9yIEY4MTIzMiAqLworI2RlZmluZSBGODEyMzJfTUFYX0JBVURSQVRFCQkxMTUyMDAKIAotI2RlZmluZSBVQVJUX1NUQVRFCQkJMHgwOAotI2RlZmluZSBVQVJUX1NUQVRFX1RSQU5TSUVOVF9NQVNLCTB4NzQKLSNkZWZpbmUgVUFSVF9EQ0QJCQkweDAxCi0jZGVmaW5lIFVBUlRfRFNSCQkJMHgwMgotI2RlZmluZSBVQVJUX0JSRUFLX0VSUk9SCQkweDA0Ci0jZGVmaW5lIFVBUlRfUklORwkJCTB4MDgKLSNkZWZpbmUgVUFSVF9GUkFNRV9FUlJPUgkJMHgxMAotI2RlZmluZSBVQVJUX1BBUklUWV9FUlJPUgkJMHgyMAotI2RlZmluZSBVQVJUX09WRVJSVU5fRVJST1IJCTB4NDAKLSNkZWZpbmUgVUFSVF9DVFMJCQkweDgwCisvKiBVU0IgQ29udHJvbCBFUCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgRjgxMjMyX1JFR0lTVEVSX1JFUVVFU1QJCTB4YTAKKyNkZWZpbmUgRjgxMjMyX0dFVF9SRUdJU1RFUgkJMHhjMAorI2RlZmluZSBGODEyMzJfU0VUX1JFR0lTVEVSCQkweDQwCisKKyNkZWZpbmUgU0VSSUFMX0JBU0VfQUREUkVTUwkJMHgwMTIwCisjZGVmaW5lIFJFQ0VJVkVfQlVGRkVSX1JFR0lTVEVSCQkoMHgwMCArIFNFUklBTF9CQVNFX0FERFJFU1MpCisjZGVmaW5lIElOVEVSUlVQVF9FTkFCTEVfUkVHSVNURVIJKDB4MDEgKyBTRVJJQUxfQkFTRV9BRERSRVNTKQorI2RlZmluZSBGSUZPX0NPTlRST0xfUkVHSVNURVIJCSgweDAyICsgU0VSSUFMX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgTElORV9DT05UUk9MX1JFR0lTVEVSCQkoMHgwMyArIFNFUklBTF9CQVNFX0FERFJFU1MpCisjZGVmaW5lIE1PREVNX0NPTlRST0xfUkVHSVNURVIJCSgweDA0ICsgU0VSSUFMX0JBU0VfQUREUkVTUykKKyNkZWZpbmUgTU9ERU1fU1RBVFVTX1JFR0lTVEVSCQkoMHgwNiArIFNFUklBTF9CQVNFX0FERFJFU1MpCiAKIHN0cnVjdCBmODEyMzJfcHJpdmF0ZSB7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXU4IGxpbmVfY29udHJvbDsKLQl1OCBsaW5lX3N0YXR1czsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwl1OCBtb2RlbV9jb250cm9sOworCXU4IG1vZGVtX3N0YXR1czsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgaW50ZXJydXB0X3dvcms7CisJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydDsKIH07CiAKK3N0YXRpYyBpbnQgY2FsY19iYXVkX2Rpdmlzb3Ioc3BlZWRfdCBiYXVkcmF0ZSkKK3sKKwlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QoRjgxMjMyX01BWF9CQVVEUkFURSwgYmF1ZHJhdGUpOworfQorCitzdGF0aWMgaW50IGY4MTIzMl9nZXRfcmVnaXN0ZXIoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwgdTE2IHJlZywgdTggKnZhbCkKK3sKKwlpbnQgc3RhdHVzOworCXU4ICp0bXA7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCisJdG1wID0ga21hbGxvYyhzaXplb2YoKnZhbCksIEdGUF9LRVJORUwpOworCWlmICghdG1wKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhkZXYsCisJCQkJdXNiX3JjdmN0cmxwaXBlKGRldiwgMCksCisJCQkJRjgxMjMyX1JFR0lTVEVSX1JFUVVFU1QsCisJCQkJRjgxMjMyX0dFVF9SRUdJU1RFUiwKKwkJCQlyZWcsCisJCQkJMCwKKwkJCQl0bXAsCisJCQkJc2l6ZW9mKCp2YWwpLAorCQkJCVVTQl9DVFJMX0dFVF9USU1FT1VUKTsKKwlpZiAoc3RhdHVzICE9IHNpemVvZigqdmFsKSkgeworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyBmYWlsZWQgc3RhdHVzOiAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlzdGF0dXMgPSB1c2JfdHJhbnNsYXRlX2Vycm9ycyhzdGF0dXMpOworCQllbHNlCisJCQlzdGF0dXMgPSAtRUlPOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IDA7CisJCSp2YWwgPSAqdG1wOworCX0KKworCWtmcmVlKHRtcCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBmODEyMzJfc2V0X3JlZ2lzdGVyKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHUxNiByZWcsIHU4IHZhbCkKK3sKKwlpbnQgc3RhdHVzOworCXU4ICp0bXA7CisJc3RydWN0IHVzYl9kZXZpY2UgKmRldiA9IHBvcnQtPnNlcmlhbC0+ZGV2OworCisJdG1wID0ga21hbGxvYyhzaXplb2YodmFsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0bXApCisJCXJldHVybiAtRU5PTUVNOworCisJKnRtcCA9IHZhbDsKKworCXN0YXR1cyA9IHVzYl9jb250cm9sX21zZyhkZXYsCisJCQkJdXNiX3NuZGN0cmxwaXBlKGRldiwgMCksCisJCQkJRjgxMjMyX1JFR0lTVEVSX1JFUVVFU1QsCisJCQkJRjgxMjMyX1NFVF9SRUdJU1RFUiwKKwkJCQlyZWcsCisJCQkJMCwKKwkJCQl0bXAsCisJCQkJc2l6ZW9mKHZhbCksCisJCQkJVVNCX0NUUkxfU0VUX1RJTUVPVVQpOworCWlmIChzdGF0dXMgIT0gc2l6ZW9mKHZhbCkpIHsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgZmFpbGVkIHN0YXR1czogJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCisJCWlmIChzdGF0dXMgPCAwKQorCQkJc3RhdHVzID0gdXNiX3RyYW5zbGF0ZV9lcnJvcnMoc3RhdHVzKTsKKwkJZWxzZQorCQkJc3RhdHVzID0gLUVJTzsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSAwOworCX0KKworCWtmcmVlKHRtcCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgZjgxMjMyX3JlYWRfbXNyKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQpCit7CisJaW50IHN0YXR1czsKKwl1OCBjdXJyZW50X21zcjsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5OworCXN0cnVjdCBmODEyMzJfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCXN0YXR1cyA9IGY4MTIzMl9nZXRfcmVnaXN0ZXIocG9ydCwgTU9ERU1fU1RBVFVTX1JFR0lTVEVSLAorCQkJJmN1cnJlbnRfbXNyKTsKKwlpZiAoc3RhdHVzKSB7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIGZhaWwsIHN0YXR1czogJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpOworCQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCQlyZXR1cm47CisJfQorCisJaWYgKCEoY3VycmVudF9tc3IgJiBVQVJUX01TUl9BTllfREVMVEEpKSB7CisJCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisJCXJldHVybjsKKwl9CisKKwlwcml2LT5tb2RlbV9zdGF0dXMgPSBjdXJyZW50X21zcjsKKworCWlmIChjdXJyZW50X21zciAmIFVBUlRfTVNSX0RDVFMpCisJCXBvcnQtPmljb3VudC5jdHMrKzsKKwlpZiAoY3VycmVudF9tc3IgJiBVQVJUX01TUl9ERFNSKQorCQlwb3J0LT5pY291bnQuZHNyKys7CisJaWYgKGN1cnJlbnRfbXNyICYgVUFSVF9NU1JfVEVSSSkKKwkJcG9ydC0+aWNvdW50LnJuZysrOworCWlmIChjdXJyZW50X21zciAmIFVBUlRfTVNSX0REQ0QpIHsKKwkJcG9ydC0+aWNvdW50LmRjZCsrOworCQl0dHkgPSB0dHlfcG9ydF90dHlfZ2V0KCZwb3J0LT5wb3J0KTsKKwkJaWYgKHR0eSkgeworCQkJdXNiX3NlcmlhbF9oYW5kbGVfZGNkX2NoYW5nZShwb3J0LCB0dHksCisJCQkJCWN1cnJlbnRfbXNyICYgVUFSVF9NU1JfRENEKTsKKworCQkJdHR5X2tyZWZfcHV0KHR0eSk7CisJCX0KKwl9CisKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBvcnQtPnBvcnQuZGVsdGFfbXNyX3dhaXQpOworCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZjgxMjMyX3NldF9tY3RybChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisJdTggdmFsOworCWludCBzdGF0dXM7CisJc3RydWN0IGY4MTIzMl9wcml2YXRlICpwcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCisJaWYgKCgoc2V0IHwgY2xlYXIpICYgKFRJT0NNX0RUUiB8IFRJT0NNX1JUUykpID09IDApCisJCXJldHVybiAwOwkvKiBubyBjaGFuZ2UgKi8KKworCS8qICdzZXQnIHRha2VzIHByZWNlZGVuY2Ugb3ZlciAnY2xlYXInICovCisJY2xlYXIgJj0gfnNldDsKKworCS8qIGZvcmNlIGVuYWJsZSBpbnRlcnJ1cHQgd2l0aCBPVVQyICovCisJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisJdmFsID0gVUFSVF9NQ1JfT1VUMiB8IHByaXYtPm1vZGVtX2NvbnRyb2w7CisKKwlpZiAoY2xlYXIgJiBUSU9DTV9EVFIpCisJCXZhbCAmPSB+VUFSVF9NQ1JfRFRSOworCisJaWYgKGNsZWFyICYgVElPQ01fUlRTKQorCQl2YWwgJj0gflVBUlRfTUNSX1JUUzsKKworCWlmIChzZXQgJiBUSU9DTV9EVFIpCisJCXZhbCB8PSBVQVJUX01DUl9EVFI7CisKKwlpZiAoc2V0ICYgVElPQ01fUlRTKQorCQl2YWwgfD0gVUFSVF9NQ1JfUlRTOworCisJZGV2X2RiZygmcG9ydC0+ZGV2LCAiJXMgbmV3OiUwMnggb2xkOiUwMnhcbiIsIF9fZnVuY19fLAorCQkJdmFsLCBwcml2LT5tb2RlbV9jb250cm9sKTsKKworCXN0YXR1cyA9IGY4MTIzMl9zZXRfcmVnaXN0ZXIocG9ydCwgTU9ERU1fQ09OVFJPTF9SRUdJU1RFUiwgdmFsKTsKKwlpZiAoc3RhdHVzKSB7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIHNldCBNQ1Igc3RhdHVzIDwgMFxuIiwgX19mdW5jX18pOworCQltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXByaXYtPm1vZGVtX2NvbnRyb2wgPSB2YWw7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBmODEyMzJfdXBkYXRlX2xpbmVfc3RhdHVzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsCiAJCQkJICAgICAgdW5zaWduZWQgY2hhciAqZGF0YSwKLQkJCQkgICAgICB1bnNpZ25lZCBpbnQgYWN0dWFsX2xlbmd0aCkKKwkJCQkgICAgICBzaXplX3QgYWN0dWFsX2xlbmd0aCkKIHsKLQkvKgotCSAqIEZJWE1FOiBVcGRhdGUgcG9ydC0+aWNvdW50LCBhbmQgY2FsbAotCSAqCi0JICoJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcG9ydC0+cG9ydC5kZWx0YV9tc3Jfd2FpdCk7Ci0JICoKLQkgKgkgIG9uIE1TUiBjaGFuZ2VzLgotCSAqLworCXN0cnVjdCBmODEyMzJfcHJpdmF0ZSAqcHJpdiA9IHVzYl9nZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0KTsKKworCWlmICghYWN0dWFsX2xlbmd0aCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChkYXRhWzBdICYgMHgwNykgeworCWNhc2UgMHgwMDogLyogbXNyIGNoYW5nZSAqLworCQlkZXZfZGJnKCZwb3J0LT5kZXYsICJJSVI6IE1TUiBDaGFuZ2U6ICUwMnhcbiIsIGRhdGFbMF0pOworCQlzY2hlZHVsZV93b3JrKCZwcml2LT5pbnRlcnJ1cHRfd29yayk7CisJCWJyZWFrOworCWNhc2UgMHgwMjogLyogdHgtZW1wdHkgKi8KKwkJYnJlYWs7CisJY2FzZSAweDA0OiAvKiByeCBkYXRhIGF2YWlsYWJsZSAqLworCQlicmVhazsKKwljYXNlIDB4MDY6IC8qIGxzciBjaGFuZ2UgKi8KKwkJLyogd2UgY2FuIGZvcmdldCBpdC4gdGhlIExTUiB3aWxsIHJlYWQgZnJvbSBidWxrLWluICovCisJCWRldl9kYmcoJnBvcnQtPmRldiwgIklJUjogTFNSIENoYW5nZTogJTAyeFxuIiwgZGF0YVswXSk7CisJCWJyZWFrOworCX0KIH0KIAogc3RhdGljIHZvaWQgZjgxMjMyX3JlYWRfaW50X2NhbGxiYWNrKHN0cnVjdCB1cmIgKnVyYikKQEAgLTEwNCw1NSArMjg2LDU1IEBACiBzdGF0aWMgdm9pZCBmODEyMzJfcHJvY2Vzc19yZWFkX3VyYihzdHJ1Y3QgdXJiICp1cmIpCiB7CiAJc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCA9IHVyYi0+Y29udGV4dDsKLQlzdHJ1Y3QgZjgxMjMyX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7CiAJdW5zaWduZWQgY2hhciAqZGF0YSA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyOwotCWNoYXIgdHR5X2ZsYWcgPSBUVFlfTk9STUFMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggbGluZV9zdGF0dXM7Ci0JaW50IGk7CisJY2hhciB0dHlfZmxhZzsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1OCBsc3I7CiAKLQkvKiB1cGRhdGUgbGluZSBzdGF0dXMgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWxpbmVfc3RhdHVzID0gcHJpdi0+bGluZV9zdGF0dXM7Ci0JcHJpdi0+bGluZV9zdGF0dXMgJj0gflVBUlRfU1RBVEVfVFJBTlNJRU5UX01BU0s7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCF1cmItPmFjdHVhbF9sZW5ndGgpCisJLyoKKwkgKiBXaGVuIG9wZW5pbmcgdGhlIHBvcnQgd2UgZ2V0IGEgMS1ieXRlIHBhY2tldCB3aXRoIHRoZSBjdXJyZW50IExTUiwKKwkgKiB3aGljaCB3ZSBkaXNjYXJkLgorCSAqLworCWlmICgodXJiLT5hY3R1YWxfbGVuZ3RoIDwgMikgfHwgKHVyYi0+YWN0dWFsX2xlbmd0aCAlIDIpKQogCQlyZXR1cm47CiAKLQkvKiBicmVhayB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgcGFyaXR5LCAqLwotCS8qIHdoaWNoIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBmcmFtaW5nIGVycm9ycyAqLwotCWlmIChsaW5lX3N0YXR1cyAmIFVBUlRfQlJFQUtfRVJST1IpCi0JCXR0eV9mbGFnID0gVFRZX0JSRUFLOwotCWVsc2UgaWYgKGxpbmVfc3RhdHVzICYgVUFSVF9QQVJJVFlfRVJST1IpCi0JCXR0eV9mbGFnID0gVFRZX1BBUklUWTsKLQllbHNlIGlmIChsaW5lX3N0YXR1cyAmIFVBUlRfRlJBTUVfRVJST1IpCi0JCXR0eV9mbGFnID0gVFRZX0ZSQU1FOwotCWRldl9kYmcoJnBvcnQtPmRldiwgIiVzIC0gdHR5X2ZsYWcgPSAlZFxuIiwgX19mdW5jX18sIHR0eV9mbGFnKTsKKwkvKiBidWxrLWluIGRhdGE6IFtMU1IoMUJ5dGUpK0RBVEEoMUJ5dGUpXVtMU1IoMUJ5dGUpK0RBVEEoMUJ5dGUpXS4uLiAqLwogCi0JLyogb3ZlcnJ1biBpcyBzcGVjaWFsLCBub3QgYXNzb2NpYXRlZCB3aXRoIGEgY2hhciAqLwotCWlmIChsaW5lX3N0YXR1cyAmIFVBUlRfT1ZFUlJVTl9FUlJPUikKLQkJdHR5X2luc2VydF9mbGlwX2NoYXIoJnBvcnQtPnBvcnQsIDAsIFRUWV9PVkVSUlVOKTsKKwlmb3IgKGkgPSAwOyBpIDwgdXJiLT5hY3R1YWxfbGVuZ3RoOyBpICs9IDIpIHsKKwkJdHR5X2ZsYWcgPSBUVFlfTk9STUFMOworCQlsc3IgPSBkYXRhW2ldOwogCi0JaWYgKHBvcnQtPnBvcnQuY29uc29sZSAmJiBwb3J0LT5zeXNycSkgewotCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5hY3R1YWxfbGVuZ3RoOyArK2kpCi0JCQlpZiAoIXVzYl9zZXJpYWxfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgZGF0YVtpXSkpCi0JCQkJdHR5X2luc2VydF9mbGlwX2NoYXIoJnBvcnQtPnBvcnQsIGRhdGFbaV0sCi0JCQkJCQl0dHlfZmxhZyk7Ci0JfSBlbHNlIHsKLQkJdHR5X2luc2VydF9mbGlwX3N0cmluZ19maXhlZF9mbGFnKCZwb3J0LT5wb3J0LCBkYXRhLCB0dHlfZmxhZywKLQkJCQkJCQl1cmItPmFjdHVhbF9sZW5ndGgpOworCQlpZiAobHNyICYgVUFSVF9MU1JfQlJLX0VSUk9SX0JJVFMpIHsKKwkJCWlmIChsc3IgJiBVQVJUX0xTUl9CSSkgeworCQkJCXR0eV9mbGFnID0gVFRZX0JSRUFLOworCQkJCXBvcnQtPmljb3VudC5icmsrKzsKKwkJCQl1c2Jfc2VyaWFsX2hhbmRsZV9icmVhayhwb3J0KTsKKwkJCX0gZWxzZSBpZiAobHNyICYgVUFSVF9MU1JfUEUpIHsKKwkJCQl0dHlfZmxhZyA9IFRUWV9QQVJJVFk7CisJCQkJcG9ydC0+aWNvdW50LnBhcml0eSsrOworCQkJfSBlbHNlIGlmIChsc3IgJiBVQVJUX0xTUl9GRSkgeworCQkJCXR0eV9mbGFnID0gVFRZX0ZSQU1FOworCQkJCXBvcnQtPmljb3VudC5mcmFtZSsrOworCQkJfQorCisJCQlpZiAobHNyICYgVUFSVF9MU1JfT0UpIHsKKwkJCQlwb3J0LT5pY291bnQub3ZlcnJ1bisrOworCQkJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKCZwb3J0LT5wb3J0LCAwLAorCQkJCQkJVFRZX09WRVJSVU4pOworCQkJfQorCQl9CisKKwkJaWYgKHBvcnQtPnBvcnQuY29uc29sZSAmJiBwb3J0LT5zeXNycSkgeworCQkJaWYgKHVzYl9zZXJpYWxfaGFuZGxlX3N5c3JxX2NoYXIocG9ydCwgZGF0YVtpICsgMV0pKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJdHR5X2luc2VydF9mbGlwX2NoYXIoJnBvcnQtPnBvcnQsIGRhdGFbaSArIDFdLCB0dHlfZmxhZyk7CiAJfQogCiAJdHR5X2ZsaXBfYnVmZmVyX3B1c2goJnBvcnQtPnBvcnQpOwogfQogCi1zdGF0aWMgaW50IHNldF9jb250cm9sX2xpbmVzKHN0cnVjdCB1c2JfZGV2aWNlICpkZXYsIHU4IHZhbHVlKQotewotCS8qIEZJWE1FIC0gU3R1YmJlZCBvdXQgZm9yIG5vdyAqLwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBmODEyMzJfYnJlYWtfY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIGludCBicmVha19zdGF0ZSkKIHsKIAkvKiBGSVhNRSAtIFN0dWJiZWQgb3V0IGZvciBub3cgKi8KQEAgLTE2NCwzNyArMzQ2LDE5OCBAQAogCSAqLwogfQogCitzdGF0aWMgdm9pZCBmODEyMzJfc2V0X2JhdWRyYXRlKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIHNwZWVkX3QgYmF1ZHJhdGUpCit7CisJdTggbGNyOworCWludCBkaXZpc29yOworCWludCBzdGF0dXMgPSAwOworCisJZGl2aXNvciA9IGNhbGNfYmF1ZF9kaXZpc29yKGJhdWRyYXRlKTsKKworCXN0YXR1cyA9IGY4MTIzMl9nZXRfcmVnaXN0ZXIocG9ydCwgTElORV9DT05UUk9MX1JFR0lTVEVSLAorCQkJICZsY3IpOyAvKiBnZXQgTENSICovCisJaWYgKHN0YXR1cykgeworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyBmYWlsZWQgdG8gZ2V0IExDUjogJWRcbiIsCisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCXN0YXR1cyA9IGY4MTIzMl9zZXRfcmVnaXN0ZXIocG9ydCwgTElORV9DT05UUk9MX1JFR0lTVEVSLAorCQkJIGxjciB8IFVBUlRfTENSX0RMQUIpOyAvKiBFbmFibGUgRExBQiAqLworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgZmFpbGVkIHRvIHNldCBETEFCOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm47CisJfQorCisJc3RhdHVzID0gZjgxMjMyX3NldF9yZWdpc3Rlcihwb3J0LCBSRUNFSVZFX0JVRkZFUl9SRUdJU1RFUiwKKwkJCSBkaXZpc29yICYgMHgwMGZmKTsgLyogbG93ICovCisJaWYgKHN0YXR1cykgeworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyBmYWlsZWQgdG8gc2V0IGJhdWRyYXRlIE1TQjogJWRcbiIsCisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwkJZ290byByZWFwcGx5X2xjcjsKKwl9CisKKwlzdGF0dXMgPSBmODEyMzJfc2V0X3JlZ2lzdGVyKHBvcnQsIElOVEVSUlVQVF9FTkFCTEVfUkVHSVNURVIsCisJCQkgKGRpdmlzb3IgJiAweGZmMDApID4+IDgpOyAvKiBoaWdoICovCisJaWYgKHN0YXR1cykgeworCQlkZXZfZXJyKCZwb3J0LT5kZXYsICIlcyBmYWlsZWQgdG8gc2V0IGJhdWRyYXRlIExTQjogJWRcbiIsCisJCQlfX2Z1bmNfXywgc3RhdHVzKTsKKwl9CisKK3JlYXBwbHlfbGNyOgorCXN0YXR1cyA9IGY4MTIzMl9zZXRfcmVnaXN0ZXIocG9ydCwgTElORV9DT05UUk9MX1JFR0lTVEVSLAorCQkJbGNyICYgflVBUlRfTENSX0RMQUIpOworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgZmFpbGVkIHRvIHNldCBETEFCOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMpOworCX0KK30KKworc3RhdGljIGludCBmODEyMzJfcG9ydF9lbmFibGUoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKK3sKKwl1OCB2YWw7CisJaW50IHN0YXR1czsKKworCS8qIGZpZm8gb24sIHRyaWdnZXI4LCBjbGVhciBUWC9SWCovCisJdmFsID0gVUFSVF9GQ1JfVFJJR0dFUl84IHwgVUFSVF9GQ1JfRU5BQkxFX0ZJRk8gfCBVQVJUX0ZDUl9DTEVBUl9SQ1ZSIHwKKwkJCVVBUlRfRkNSX0NMRUFSX1hNSVQ7CisKKwlzdGF0dXMgPSBmODEyMzJfc2V0X3JlZ2lzdGVyKHBvcnQsIEZJRk9fQ09OVFJPTF9SRUdJU1RFUiwgdmFsKTsKKwlpZiAoc3RhdHVzKSB7CisJCWRldl9lcnIoJnBvcnQtPmRldiwgIiVzIGZhaWxlZCB0byBzZXQgRkNSOiAlZFxuIiwKKwkJCV9fZnVuY19fLCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIE1TUiBJbnRlcnJ1cHQgb25seSwgTFNSIHdpbGwgcmVhZCBmcm9tIEJ1bGstaW4gb2RkIGJ5dGUgKi8KKwlzdGF0dXMgPSBmODEyMzJfc2V0X3JlZ2lzdGVyKHBvcnQsIElOVEVSUlVQVF9FTkFCTEVfUkVHSVNURVIsCisJCQlVQVJUX0lFUl9NU0kpOworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgZmFpbGVkIHRvIHNldCBJRVI6ICVkXG4iLAorCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZjgxMjMyX3BvcnRfZGlzYWJsZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBmODEyMzJfc2V0X3JlZ2lzdGVyKHBvcnQsIElOVEVSUlVQVF9FTkFCTEVfUkVHSVNURVIsIDApOworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgZmFpbGVkIHRvIHNldCBJRVI6ICVkXG4iLAorCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGY4MTIzMl9zZXRfdGVybWlvcyhzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0LCBzdHJ1Y3Qga3Rlcm1pb3MgKm9sZF90ZXJtaW9zKQogewotCS8qIEZJWE1FIC0gU3R1YmJlZCBvdXQgZm9yIG5vdyAqLworCXU4IG5ld19sY3IgPSAwOworCWludCBzdGF0dXMgPSAwOworCXNwZWVkX3QgYmF1ZHJhdGU7CiAKIAkvKiBEb24ndCBjaGFuZ2UgYW55dGhpbmcgaWYgbm90aGluZyBoYXMgY2hhbmdlZCAqLwogCWlmIChvbGRfdGVybWlvcyAmJiAhdHR5X3Rlcm1pb3NfaHdfY2hhbmdlKCZ0dHktPnRlcm1pb3MsIG9sZF90ZXJtaW9zKSkKIAkJcmV0dXJuOwogCi0JLyogRG8gdGhlIHJlYWwgd29yayBoZXJlLi4uICovCi0JaWYgKG9sZF90ZXJtaW9zKQotCQl0dHlfdGVybWlvc19jb3B5X2h3KCZ0dHktPnRlcm1pb3MsIG9sZF90ZXJtaW9zKTsKKwlpZiAoQ19CQVVEKHR0eSkgPT0gQjApCisJCWY4MTIzMl9zZXRfbWN0cmwocG9ydCwgMCwgVElPQ01fRFRSIHwgVElPQ01fUlRTKTsKKwllbHNlIGlmIChvbGRfdGVybWlvcyAmJiAob2xkX3Rlcm1pb3MtPmNfY2ZsYWcgJiBDQkFVRCkgPT0gQjApCisJCWY4MTIzMl9zZXRfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTLCAwKTsKKworCWJhdWRyYXRlID0gdHR5X2dldF9iYXVkX3JhdGUodHR5KTsKKwlpZiAoYmF1ZHJhdGUgPiAwKSB7CisJCWlmIChiYXVkcmF0ZSA+IEY4MTIzMl9NQVhfQkFVRFJBVEUpIHsKKwkJCWJhdWRyYXRlID0gRjgxMjMyX01BWF9CQVVEUkFURTsKKwkJCXR0eV9lbmNvZGVfYmF1ZF9yYXRlKHR0eSwgYmF1ZHJhdGUsIGJhdWRyYXRlKTsKKwkJfQorCQlmODEyMzJfc2V0X2JhdWRyYXRlKHBvcnQsIGJhdWRyYXRlKTsKKwl9CisKKwlpZiAoQ19QQVJFTkIodHR5KSkgeworCQluZXdfbGNyIHw9IFVBUlRfTENSX1BBUklUWTsKKworCQlpZiAoIUNfUEFST0REKHR0eSkpCisJCQluZXdfbGNyIHw9IFVBUlRfTENSX0VQQVI7CisKKwkJaWYgKENfQ01TUEFSKHR0eSkpCisJCQluZXdfbGNyIHw9IFVBUlRfTENSX1NQQVI7CisJfQorCisJaWYgKENfQ1NUT1BCKHR0eSkpCisJCW5ld19sY3IgfD0gVUFSVF9MQ1JfU1RPUDsKKworCXN3aXRjaCAoQ19DU0laRSh0dHkpKSB7CisJY2FzZSBDUzU6CisJCW5ld19sY3IgfD0gVUFSVF9MQ1JfV0xFTjU7CisJCWJyZWFrOworCWNhc2UgQ1M2OgorCQluZXdfbGNyIHw9IFVBUlRfTENSX1dMRU42OworCQlicmVhazsKKwljYXNlIENTNzoKKwkJbmV3X2xjciB8PSBVQVJUX0xDUl9XTEVONzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwljYXNlIENTODoKKwkJbmV3X2xjciB8PSBVQVJUX0xDUl9XTEVOODsKKwkJYnJlYWs7CisJfQorCisJc3RhdHVzID0gZjgxMjMyX3NldF9yZWdpc3Rlcihwb3J0LCBMSU5FX0NPTlRST0xfUkVHSVNURVIsIG5ld19sY3IpOworCWlmIChzdGF0dXMpIHsKKwkJZGV2X2VycigmcG9ydC0+ZGV2LCAiJXMgZmFpbGVkIHRvIHNldCBMQ1I6ICVkXG4iLAorCQkJX19mdW5jX18sIHN0YXR1cyk7CisJfQogfQogCiBzdGF0aWMgaW50IGY4MTIzMl90aW9jbWdldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewotCS8qIEZJWE1FIC0gU3R1YmJlZCBvdXQgZm9yIG5vdyAqLwotCXJldHVybiAwOworCWludCByOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCXN0cnVjdCBmODEyMzJfcHJpdmF0ZSAqcG9ydF9wcml2ID0gdXNiX2dldF9zZXJpYWxfcG9ydF9kYXRhKHBvcnQpOworCXU4IG1jciwgbXNyOworCisJLyogZm9yY2UgZ2V0IGN1cnJlbnQgTVNSIGNoYW5nZWQgc3RhdGUgKi8KKwlmODEyMzJfcmVhZF9tc3IocG9ydCk7CisKKwltdXRleF9sb2NrKCZwb3J0X3ByaXYtPmxvY2spOworCW1jciA9IHBvcnRfcHJpdi0+bW9kZW1fY29udHJvbDsKKwltc3IgPSBwb3J0X3ByaXYtPm1vZGVtX3N0YXR1czsKKwltdXRleF91bmxvY2soJnBvcnRfcHJpdi0+bG9jayk7CisKKwlyID0gKG1jciAmIFVBUlRfTUNSX0RUUiA/IFRJT0NNX0RUUiA6IDApIHwKKwkJKG1jciAmIFVBUlRfTUNSX1JUUyA/IFRJT0NNX1JUUyA6IDApIHwKKwkJKG1zciAmIFVBUlRfTVNSX0NUUyA/IFRJT0NNX0NUUyA6IDApIHwKKwkJKG1zciAmIFVBUlRfTVNSX0RDRCA/IFRJT0NNX0NBUiA6IDApIHwKKwkJKG1zciAmIFVBUlRfTVNSX1JJID8gVElPQ01fUkkgOiAwKSB8CisJCShtc3IgJiBVQVJUX01TUl9EU1IgPyBUSU9DTV9EU1IgOiAwKTsKKworCXJldHVybiByOwogfQogCiBzdGF0aWMgaW50IGY4MTIzMl90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAogCQkJdW5zaWduZWQgaW50IHNldCwgdW5zaWduZWQgaW50IGNsZWFyKQogewotCS8qIEZJWE1FIC0gU3R1YmJlZCBvdXQgZm9yIG5vdyAqLwotCXJldHVybiAwOworCXN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQgPSB0dHktPmRyaXZlcl9kYXRhOworCisJcmV0dXJuIGY4MTIzMl9zZXRfbWN0cmwocG9ydCwgc2V0LCBjbGVhcik7CiB9CiAKIHN0YXRpYyBpbnQgZjgxMjMyX29wZW4oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKIAlpbnQgcmVzdWx0OwogCisJcmVzdWx0ID0gZjgxMjMyX3BvcnRfZW5hYmxlKHBvcnQpOworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKIAkvKiBTZXR1cCB0ZXJtaW9zICovCiAJaWYgKHR0eSkKIAkJZjgxMjMyX3NldF90ZXJtaW9zKHR0eSwgcG9ydCwgTlVMTCk7CkBAIC0yMTcsNTkgKzU2MCw3MyBAQAogCiBzdGF0aWMgdm9pZCBmODEyMzJfY2xvc2Uoc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCkKIHsKKwlmODEyMzJfcG9ydF9kaXNhYmxlKHBvcnQpOwogCXVzYl9zZXJpYWxfZ2VuZXJpY19jbG9zZShwb3J0KTsKIAl1c2Jfa2lsbF91cmIocG9ydC0+aW50ZXJydXB0X2luX3VyYik7CiB9CiAKIHN0YXRpYyB2b2lkIGY4MTIzMl9kdHJfcnRzKHN0cnVjdCB1c2Jfc2VyaWFsX3BvcnQgKnBvcnQsIGludCBvbikKIHsKLQlzdHJ1Y3QgZjgxMjMyX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCBjb250cm9sOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkvKiBDaGFuZ2UgRFRSIGFuZCBSVFMgKi8KIAlpZiAob24pCi0JCXByaXYtPmxpbmVfY29udHJvbCB8PSAoQ09OVFJPTF9EVFIgfCBDT05UUk9MX1JUUyk7CisJCWY4MTIzMl9zZXRfbWN0cmwocG9ydCwgVElPQ01fRFRSIHwgVElPQ01fUlRTLCAwKTsKIAllbHNlCi0JCXByaXYtPmxpbmVfY29udHJvbCAmPSB+KENPTlRST0xfRFRSIHwgQ09OVFJPTF9SVFMpOwotCWNvbnRyb2wgPSBwcml2LT5saW5lX2NvbnRyb2w7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXNldF9jb250cm9sX2xpbmVzKHBvcnQtPnNlcmlhbC0+ZGV2LCBjb250cm9sKTsKKwkJZjgxMjMyX3NldF9tY3RybChwb3J0LCAwLCBUSU9DTV9EVFIgfCBUSU9DTV9SVFMpOwogfQogCiBzdGF0aWMgaW50IGY4MTIzMl9jYXJyaWVyX3JhaXNlZChzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogeworCXU4IG1zcjsKIAlzdHJ1Y3QgZjgxMjMyX3ByaXZhdGUgKnByaXYgPSB1c2JfZ2V0X3NlcmlhbF9wb3J0X2RhdGEocG9ydCk7Ci0JaWYgKHByaXYtPmxpbmVfc3RhdHVzICYgVUFSVF9EQ0QpCisKKwltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKwltc3IgPSBwcml2LT5tb2RlbV9zdGF0dXM7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCWlmIChtc3IgJiBVQVJUX01TUl9EQ0QpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGY4MTIzMl9nZXRfc2VyaWFsX2luZm8oc3RydWN0IHVzYl9zZXJpYWxfcG9ydCAqcG9ydCwKKwkJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc2VyOworCisJbWVtc2V0KCZzZXIsIDAsIHNpemVvZihzZXIpKTsKKworCXNlci50eXBlID0gUE9SVF8xNjU1MEE7CisJc2VyLmxpbmUgPSBwb3J0LT5taW5vcjsKKwlzZXIucG9ydCA9IHBvcnQtPnBvcnRfbnVtYmVyOworCXNlci5iYXVkX2Jhc2UgPSBGODEyMzJfTUFYX0JBVURSQVRFOworCisJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZzZXIsIHNpemVvZihzZXIpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmODEyMzJfaW9jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwKIAkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQogewotCXN0cnVjdCBzZXJpYWxfc3RydWN0IHNlcjsKIAlzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0ID0gdHR5LT5kcml2ZXJfZGF0YTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBUSU9DR1NFUklBTDoKLQkJbWVtc2V0KCZzZXIsIDAsIHNpemVvZiBzZXIpOwotCQlzZXIudHlwZSA9IFBPUlRfMTY2NTQ7Ci0JCXNlci5saW5lID0gcG9ydC0+bWlub3I7Ci0JCXNlci5wb3J0ID0gcG9ydC0+cG9ydF9udW1iZXI7Ci0JCXNlci5iYXVkX2Jhc2UgPSA0NjA4MDA7Ci0KLQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZzZXIsIHNpemVvZiBzZXIpKQotCQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQkJcmV0dXJuIDA7CisJCXJldHVybiBmODEyMzJfZ2V0X3NlcmlhbF9pbmZvKHBvcnQsIGFyZyk7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCXJldHVybiAtRU5PSU9DVExDTUQ7CiB9CiAKK3N0YXRpYyB2b2lkICBmODEyMzJfaW50ZXJydXB0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBmODEyMzJfcHJpdmF0ZSAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZjgxMjMyX3ByaXZhdGUsIGludGVycnVwdF93b3JrKTsKKworCWY4MTIzMl9yZWFkX21zcihwcml2LT5wb3J0KTsKK30KKwogc3RhdGljIGludCBmODEyMzJfcG9ydF9wcm9iZShzdHJ1Y3QgdXNiX3NlcmlhbF9wb3J0ICpwb3J0KQogewogCXN0cnVjdCBmODEyMzJfcHJpdmF0ZSAqcHJpdjsKQEAgLTI3OCwxMSArNjM1LDEzIEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKKwltdXRleF9pbml0KCZwcml2LT5sb2NrKTsKKwlJTklUX1dPUksoJnByaXYtPmludGVycnVwdF93b3JrLCAgZjgxMjMyX2ludGVycnVwdF93b3JrKTsKIAogCXVzYl9zZXRfc2VyaWFsX3BvcnRfZGF0YShwb3J0LCBwcml2KTsKIAogCXBvcnQtPnBvcnQuZHJhaW5fZGVsYXkgPSAyNTY7CisJcHJpdi0+cG9ydCA9IHBvcnQ7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMwOCw3ICs2NjcsNyBAQAogCS5idWxrX291dF9zaXplID0JMjU2LAogCS5vcGVuID0JCQlmODEyMzJfb3BlbiwKIAkuY2xvc2UgPQkJZjgxMjMyX2Nsb3NlLAotCS5kdHJfcnRzID0gCQlmODEyMzJfZHRyX3J0cywKKwkuZHRyX3J0cyA9CQlmODEyMzJfZHRyX3J0cywKIAkuY2Fycmllcl9yYWlzZWQgPQlmODEyMzJfY2Fycmllcl9yYWlzZWQsCiAJLmlvY3RsID0JCWY4MTIzMl9pb2N0bCwKIAkuYnJlYWtfY3RsID0JCWY4MTIzMl9icmVha19jdGwsCkBAIC0zMzAsNSArNjg5LDYgQEAKIG1vZHVsZV91c2Jfc2VyaWFsX2RyaXZlcihzZXJpYWxfZHJpdmVycywgaWRfdGFibGUpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIkZpbnRlayBGODEyMzIgVVNCIHRvIHNlcmlhbCBhZGFwdG9yIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZyIpOworTU9EVUxFX0FVVEhPUigiR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZz4iKTsKK01PRFVMRV9BVVRIT1IoIlBldGVyIEhvbmcgPHBldGVyX2hvbmdAZmludGVrLmNvbS50dz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKaW5kZXggMzA4NmRlYy4uOGViNjhhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKKysrIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvLmMKQEAgLTYwNCw2ICs2MDQsNyBAQAogCQkuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJmZ0ZGlfanRhZ19xdWlyayB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9OVF9PUklPTkxYTV9QSUQpLAogCQkuZHJpdmVyX2luZm8gPSAoa2VybmVsX3Vsb25nX3QpJmZ0ZGlfanRhZ19xdWlyayB9LAorCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9TWU5BUFNFX1NTMjAwX1BJRCkgfSwKIAkvKgogCSAqIEVMViBkZXZpY2VzOgogCSAqLwpAQCAtMTg4Myw4ICsxODg0LDEyIEBACiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYgPSBzZXJpYWwtPmRldjsKIAotCWlmICgodWRldi0+bWFudWZhY3R1cmVyICYmICFzdHJjbXAodWRldi0+bWFudWZhY3R1cmVyLCAiQ0FMQU8gU3lzdGVtcyIpKSB8fAotCSAgICAodWRldi0+cHJvZHVjdCAmJiAhc3RyY21wKHVkZXYtPnByb2R1Y3QsICJCZWFnbGVCb25lL1hEUzEwMFYyIikpKQorCWlmICh1ZGV2LT5tYW51ZmFjdHVyZXIgJiYgIXN0cmNtcCh1ZGV2LT5tYW51ZmFjdHVyZXIsICJDQUxBTyBTeXN0ZW1zIikpCisJCXJldHVybiBmdGRpX2p0YWdfcHJvYmUoc2VyaWFsKTsKKworCWlmICh1ZGV2LT5wcm9kdWN0ICYmCisJCSghc3RyY21wKHVkZXYtPnByb2R1Y3QsICJCZWFnbGVCb25lL1hEUzEwMFYyIikgfHwKKwkJICFzdHJjbXAodWRldi0+cHJvZHVjdCwgIlNOQVAgQ29ubmVjdCBFMTAiKSkpCiAJCXJldHVybiBmdGRpX2p0YWdfcHJvYmUoc2VyaWFsKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvX2lkcy5oIGIvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvX2lkcy5oCmluZGV4IDU2YjFiNTUuLjRlNGY0NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaAorKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmgKQEAgLTU2MSw2ICs1NjEsMTIgQEAKICAqLwogI2RlZmluZSBGVERJX05UX09SSU9OTFhNX1BJRAkweDdjOTAJLyogT3Jpb25MWG0gU3Vic3RhdGlvbiBBdXRvbWF0aW9uIFBsYXRmb3JtICovCiAKKy8qCisgKiBTeW5hcHNlIFdpcmVsZXNzIHByb2R1Y3QgaWRzIChGVERJX1ZJRCkKKyAqIGh0dHA6Ly93d3cuc3luYXBzZS13aXJlbGVzcy5jb20KKyAqLworI2RlZmluZSBGVERJX1NZTkFQU0VfU1MyMDBfUElEIDB4OTA5MCAvKiBTUzIwMCAtIFNOQVAgU3RpY2sgMjAwICovCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyoqIHRoaXJkLXBhcnR5IFZJRC9QSUQgY29tYm9zICoqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc2VyaWFsL2tleXNwYW5fcGRhLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbl9wZGEuYwppbmRleCBkZDk3ZDhiLi40ZjdlMDcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbl9wZGEuYworKysgYi9kcml2ZXJzL3VzYi9zZXJpYWwva2V5c3Bhbl9wZGEuYwpAQCAtNjEsNiArNjEsNyBAQAogLyogRm9yIFhpcmNvbSBQR1NEQjkgYW5kIG9sZGVyIEVudHJlZ2EgdmVyc2lvbiBvZiB0aGUgc2FtZSBkZXZpY2UgKi8KICNkZWZpbmUgWElSQ09NX1ZFTkRPUl9JRAkJMHgwODVhCiAjZGVmaW5lIFhJUkNPTV9GQUtFX0lECQkJMHg4MDI3CisjZGVmaW5lIFhJUkNPTV9GQUtFX0lEXzIJCTB4ODAyNSAvKiAiUEdNRkhVQiIgc2VyaWFsICovCiAjZGVmaW5lIEVOVFJFR0FfVkVORE9SX0lECQkweDE2NDUKICNkZWZpbmUgRU5UUkVHQV9GQUtFX0lECQkJMHg4MDkzCiAKQEAgLTcwLDYgKzcxLDcgQEAKICNlbmRpZgogI2lmZGVmIFhJUkNPTQogCXsgVVNCX0RFVklDRShYSVJDT01fVkVORE9SX0lELCBYSVJDT01fRkFLRV9JRCkgfSwKKwl7IFVTQl9ERVZJQ0UoWElSQ09NX1ZFTkRPUl9JRCwgWElSQ09NX0ZBS0VfSURfMikgfSwKIAl7IFVTQl9ERVZJQ0UoRU5UUkVHQV9WRU5ET1JfSUQsIEVOVFJFR0FfRkFLRV9JRCkgfSwKICNlbmRpZgogCXsgVVNCX0RFVklDRShLRVlTUEFOX1ZFTkRPUl9JRCwgS0VZU1BBTl9QREFfSUQpIH0sCkBAIC05Myw2ICs5NSw3IEBACiAjaWZkZWYgWElSQ09NCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgaWRfdGFibGVfZmFrZV94aXJjb21bXSA9IHsKIAl7IFVTQl9ERVZJQ0UoWElSQ09NX1ZFTkRPUl9JRCwgWElSQ09NX0ZBS0VfSUQpIH0sCisJeyBVU0JfREVWSUNFKFhJUkNPTV9WRU5ET1JfSUQsIFhJUkNPTV9GQUtFX0lEXzIpIH0sCiAJeyBVU0JfREVWSUNFKEVOVFJFR0FfVkVORE9SX0lELCBFTlRSRUdBX0ZBS0VfSUQpIH0sCiAJeyB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9hbGF1ZGEuYyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvYWxhdWRhLmMKaW5kZXggNjJjMmQ5ZC4uNGI1NWFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc3RvcmFnZS9hbGF1ZGEuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2FsYXVkYS5jCkBAIC0yMDcsNyArMjA3LDggQEAKIAl7IDAsfQogfTsKIAotc3RhdGljIHN0cnVjdCBhbGF1ZGFfY2FyZF9pbmZvICphbGF1ZGFfY2FyZF9maW5kX2lkKHVuc2lnbmVkIGNoYXIgaWQpIHsKK3N0YXRpYyBzdHJ1Y3QgYWxhdWRhX2NhcmRfaW5mbyAqYWxhdWRhX2NhcmRfZmluZF9pZCh1bnNpZ25lZCBjaGFyIGlkKQorewogCWludCBpOwogCiAJZm9yIChpID0gMDsgYWxhdWRhX2NhcmRfaWRzW2ldLmlkICE9IDA7IGkrKykKQEAgLTIyMyw3ICsyMjQsOCBAQAogc3RhdGljIHVuc2lnbmVkIGNoYXIgcGFyaXR5WzI1Nl07CiBzdGF0aWMgdW5zaWduZWQgY2hhciBlY2MyWzI1Nl07CiAKLXN0YXRpYyB2b2lkIG5hbmRfaW5pdF9lY2Modm9pZCkgeworc3RhdGljIHZvaWQgbmFuZF9pbml0X2VjYyh2b2lkKQorewogCWludCBpLCBqLCBhOwogCiAJcGFyaXR5WzBdID0gMDsKQEAgLTI0Nyw3ICsyNDksOCBAQAogfQogCiAvKiBjb21wdXRlIDMtYnl0ZSBlY2Mgb24gMjU2IGJ5dGVzICovCi1zdGF0aWMgdm9pZCBuYW5kX2NvbXB1dGVfZWNjKHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmVjYykgeworc3RhdGljIHZvaWQgbmFuZF9jb21wdXRlX2VjYyh1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBjaGFyICplY2MpCit7CiAJaW50IGksIGosIGE7CiAJdW5zaWduZWQgY2hhciBwYXIgPSAwLCBiaXQsIGJpdHNbOF0gPSB7MH07CiAKQEAgLTI3MCwxMSArMjczLDEzIEBACiAJZWNjWzJdID0gZWNjMltwYXJdOwogfQogCi1zdGF0aWMgaW50IG5hbmRfY29tcGFyZV9lY2ModW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgY2hhciAqZWNjKSB7CitzdGF0aWMgaW50IG5hbmRfY29tcGFyZV9lY2ModW5zaWduZWQgY2hhciAqZGF0YSwgdW5zaWduZWQgY2hhciAqZWNjKQorewogCXJldHVybiAoZGF0YVswXSA9PSBlY2NbMF0gJiYgZGF0YVsxXSA9PSBlY2NbMV0gJiYgZGF0YVsyXSA9PSBlY2NbMl0pOwogfQogCi1zdGF0aWMgdm9pZCBuYW5kX3N0b3JlX2VjYyh1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBjaGFyICplY2MpIHsKK3N0YXRpYyB2b2lkIG5hbmRfc3RvcmVfZWNjKHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGNoYXIgKmVjYykKK3sKIAltZW1jcHkoZGF0YSwgZWNjLCAzKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivc3RvcmFnZS9jeXByZXNzX2F0YWNiLmMgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2N5cHJlc3NfYXRhY2IuYwppbmRleCA4NTE0YTJkLi5iMzQ2NmQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2N5cHJlc3NfYXRhY2IuYworKysgYi9kcml2ZXJzL3VzYi9zdG9yYWdlL2N5cHJlc3NfYXRhY2IuYwpAQCAtOTYsMTMgKzk2LDEzIEBACiAJaWYgKHNhdmVfY21uZFsxXSA+PiA1KSAvKiBNVUxUSVBMRV9DT1VOVCAqLwogCQlnb3RvIGludmFsaWRfZmxkOwogCS8qIGNoZWNrIHByb3RvY29sICovCi0Jc3dpdGNoKChzYXZlX2NtbmRbMV0gPj4gMSkgJiAweGYpIHsKLQkJY2FzZSAzOiAvKm5vIERBVEEgKi8KLQkJY2FzZSA0OiAvKiBQSU8gaW4gKi8KLQkJY2FzZSA1OiAvKiBQSU8gb3V0ICovCi0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWdvdG8gaW52YWxpZF9mbGQ7CisJc3dpdGNoICgoc2F2ZV9jbW5kWzFdID4+IDEpICYgMHhmKSB7CisJY2FzZSAzOiAvKm5vIERBVEEgKi8KKwljYXNlIDQ6IC8qIFBJTyBpbiAqLworCWNhc2UgNTogLyogUElPIG91dCAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGludmFsaWRfZmxkOwogCX0KIAogCS8qIGZpcnN0IGJ1aWxkIHRoZSBBVEFDQiBjb21tYW5kICovCkBAIC0xMzIsOCArMTMyLDcgQEAKIAkJCQkJfHwgc2F2ZV9jbW5kWzExXSkKIAkJCQlnb3RvIGludmFsaWRfZmxkOwogCQl9Ci0JfQotCWVsc2UgeyAvKiBBVEExMiAqLworCX0gZWxzZSB7IC8qIEFUQTEyICovCiAJCXNyYi0+Y21uZFsgNl0gPSBzYXZlX2NtbmRbM107IC8qIGZlYXR1cmVzICovCiAJCXNyYi0+Y21uZFsgN10gPSBzYXZlX2NtbmRbNF07IC8qIHNlY3RvciBjb3VudCAqLwogCQlzcmItPmNtbmRbIDhdID0gc2F2ZV9jbW5kWzVdOyAvKiBsYmEgbG93ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2lzZDIwMC5jIGIvZHJpdmVycy91c2Ivc3RvcmFnZS9pc2QyMDAuYwppbmRleCA1OTlkOGJmLi4wNzYxNzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL2lzZDIwMC5jCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvaXNkMjAwLmMKQEAgLTczNyw3ICs3MzcsNyBAQAogCQkgICAgIGluZm8tPkNvbmZpZ0RhdGEuQVRBRXh0cmFDb25maWcgJiBBVEFDRkdFX0NPTkZfREVTQzIpOwogCXVzYl9zdG9yX2RiZyh1cywgIiAgICAgIFNraXAgRGV2aWNlIEJvb3Q6IDB4JXhcbiIsCiAJCSAgICAgaW5mby0+Q29uZmlnRGF0YS5BVEFFeHRyYUNvbmZpZyAmIEFUQUNGR0VfU0tJUF9CT09UKTsKLQl1c2Jfc3Rvcl9kYmcodXMsICIgICAgICBBVEEgMyBTdGF0ZSBTdXBzZW5kOiAweCV4XG4iLAorCXVzYl9zdG9yX2RiZyh1cywgIiAgICAgIEFUQSAzIFN0YXRlIFN1c3BlbmQ6IDB4JXhcbiIsCiAJCSAgICAgaW5mby0+Q29uZmlnRGF0YS5BVEFFeHRyYUNvbmZpZyAmIEFUQUNGR0VfU1RBVEVfU1VTUEVORCk7CiAJdXNiX3N0b3JfZGJnKHVzLCAiICAgICAgRGVzY3JpcHRvciBPdmVycmlkZTogMHgleFxuIiwKIAkJICAgICBpbmZvLT5Db25maWdEYXRhLkFUQUV4dHJhQ29uZmlnICYgQVRBQ0ZHRV9ERVNDX09WRVJSSURFKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF91YXMuaCBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF91YXMuaAppbmRleCA4MjU3MDQyLi5jODVlYTUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfdWFzLmgKKysrIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX3Vhcy5oCkBAIC0xMTMsNiArMTEzLDEzIEBACiAJCVVTQl9TQ19ERVZJQ0UsIFVTQl9QUl9ERVZJQ0UsIE5VTEwsCiAJCVVTX0ZMX05PX0FUQV8xWCksCiAKKy8qIFJlcG9ydGVkLWJ5OiBCZW5qYW1pbiBUaXNzb2lyZXMgPGJlbmphbWluLnRpc3NvaXJlc0ByZWRoYXQuY29tPiAqLworVU5VU1VBTF9ERVYoMHgxM2ZkLCAweDM5NDAsIDB4MDAwMCwgMHg5OTk5LAorCQkiSW5pdGlvIENvcnBvcmF0aW9uIiwKKwkJIiIsCisJCVVTQl9TQ19ERVZJQ0UsIFVTQl9QUl9ERVZJQ0UsIE5VTEwsCisJCVVTX0ZMX05PX0FUQV8xWCksCisKIC8qIFJlcG9ydGVkLWJ5OiBUb20gQXJpbGQgTmFlc3MgPHRhbmFlc3NAZ21haWwuY29tPiAqLwogVU5VU1VBTF9ERVYoMHgxNTJkLCAweDA1MzksIDB4MDAwMCwgMHg5OTk5LAogCQkiSk1pY3JvbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi91c2JpcC92aGNpX2hjZC5jIGIvZHJpdmVycy91c2IvdXNiaXAvdmhjaV9oY2QuYwppbmRleCAxMWY2ZjYxLi5lOWVmMWVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi91c2JpcC92aGNpX2hjZC5jCisrKyBiL2RyaXZlcnMvdXNiL3VzYmlwL3ZoY2lfaGNkLmMKQEAgLTIxNiw3ICsyMTYsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGh1Yl9kZXNjcmlwdG9yKHN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2MpCiB7CiAJbWVtc2V0KGRlc2MsIDAsIHNpemVvZigqZGVzYykpOwotCWRlc2MtPmJEZXNjcmlwdG9yVHlwZSA9IDB4Mjk7CisJZGVzYy0+YkRlc2NyaXB0b3JUeXBlID0gVVNCX0RUX0hVQjsKIAlkZXNjLT5iRGVzY0xlbmd0aCA9IDk7CiAJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoCiAJCUhVQl9DSEFSX0lORFZfUE9SVF9MUFNNIHwgSFVCX0NIQVJfQ09NTU9OX09DUE0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvcmguYyBiL2RyaXZlcnMvdXNiL3d1c2Jjb3JlL3JoLmMKaW5kZXggYWE1YWY4MS4uYTA4MmZlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivd3VzYmNvcmUvcmguYworKysgYi9kcml2ZXJzL3VzYi93dXNiY29yZS9yaC5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAlpZiAod0xlbmd0aCA8IGxlbmd0aCkKIAkJcmV0dXJuIC1FTk9TUEM7CiAJZGVzY3ItPmJEZXNjTGVuZ3RoID0gNyArIDIgKiB0ZW1wOwotCWRlc2NyLT5iRGVzY3JpcHRvclR5cGUgPSAweDI5OwkvKiBIVUIgdHlwZSAqLworCWRlc2NyLT5iRGVzY3JpcHRvclR5cGUgPSBVU0JfRFRfSFVCOyAvKiBIVUIgdHlwZSAqLwogCWRlc2NyLT5iTmJyUG9ydHMgPSB3dXNiaGMtPnBvcnRzX21heDsKIAlkZXNjci0+d0h1YkNoYXJhY3RlcmlzdGljcyA9IGNwdV90b19sZTE2KAogCQlIVUJfQ0hBUl9DT01NT05fTFBTTQkvKiBBbGwgcG9ydHMgcG93ZXIgYXQgb25jZSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2IvdW1jLWJ1cy5jIGIvZHJpdmVycy91d2IvdW1jLWJ1cy5jCmluZGV4IDg4YTI5MGYuLmM4NTcxNDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL3VtYy1idXMuYworKysgYi9kcml2ZXJzL3V3Yi91bWMtYnVzLmMKQEAgLTE2MywzOCArMTYzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1bWNfZGV2aWNlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCi17Ci0Jc3RydWN0IHVtY19kZXYgKnVtYzsKLQlzdHJ1Y3QgdW1jX2RyaXZlciAqdW1jX2RyaXZlcjsKLQlpbnQgZXJyID0gMDsKLQotCXVtYyA9IHRvX3VtY19kZXYoZGV2KTsKLQotCWlmIChkZXYtPmRyaXZlcikgewotCQl1bWNfZHJpdmVyID0gdG9fdW1jX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JCWlmICh1bWNfZHJpdmVyLT5zdXNwZW5kKQotCQkJZXJyID0gdW1jX2RyaXZlci0+c3VzcGVuZCh1bWMsIHN0YXRlKTsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCB1bWNfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IHVtY19kZXYgKnVtYzsKLQlzdHJ1Y3QgdW1jX2RyaXZlciAqdW1jX2RyaXZlcjsKLQlpbnQgZXJyID0gMDsKLQotCXVtYyA9IHRvX3VtY19kZXYoZGV2KTsKLQotCWlmIChkZXYtPmRyaXZlcikgewotCQl1bWNfZHJpdmVyID0gdG9fdW1jX2RyaXZlcihkZXYtPmRyaXZlcik7Ci0JCWlmICh1bWNfZHJpdmVyLT5yZXN1bWUpCi0JCQllcnIgPSB1bWNfZHJpdmVyLT5yZXN1bWUodW1jKTsKLQl9Ci0JcmV0dXJuIGVycjsKLX0KLQogc3RhdGljIHNzaXplX3QgY2FwYWJpbGl0eV9pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAlzdHJ1Y3QgdW1jX2RldiAqdW1jID0gdG9fdW1jX2RldihkZXYpOwpAQCAtMjIzLDggKzE5MSw2IEBACiAJLm1hdGNoCQk9IHVtY19idXNfbWF0Y2gsCiAJLnByb2JlCQk9IHVtY19kZXZpY2VfcHJvYmUsCiAJLnJlbW92ZQkJPSB1bWNfZGV2aWNlX3JlbW92ZSwKLQkuc3VzcGVuZCAgICAgICAgPSB1bWNfZGV2aWNlX3N1c3BlbmQsCi0JLnJlc3VtZSAgICAgICAgID0gdW1jX2RldmljZV9yZXN1bWUsCiAJLmRldl9ncm91cHMJPSB1bWNfZGV2X2dyb3VwcywKIH07CiBFWFBPUlRfU1lNQk9MX0dQTCh1bWNfYnVzX3R5cGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91d2Ivd2hjaS5jIGIvZHJpdmVycy91d2Ivd2hjaS5jCmluZGV4IDQ2YjdjZmMuLmMzZWUzOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXdiL3doY2kuYworKysgYi9kcml2ZXJzL3V3Yi93aGNpLmMKQEAgLTEzMyw4ICsxMzMsNyBAQAogewogCXN0cnVjdCB1bWNfZGV2ICp1bWMgPSBjYXJkLT5kZXZzW25dOwogCi0JaWYgKHVtYyAhPSBOVUxMKQotCQl1bWNfZGV2aWNlX3VucmVnaXN0ZXIodW1jKTsKKwl1bWNfZGV2aWNlX3VucmVnaXN0ZXIodW1jKTsKIH0KIAogc3RhdGljIGludCB3aGNpX25fY2FwcyhzdHJ1Y3QgcGNpX2RldiAqcGNpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL0tjb25maWcgYi9kcml2ZXJzL3ZmaW8vS2NvbmZpZwppbmRleCAxNGUyN2FiLi43ZDA5MmRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vS2NvbmZpZworKysgYi9kcml2ZXJzL3ZmaW8vS2NvbmZpZwpAQCAtMTMsNiArMTMsMTEgQEAKIAlkZXBlbmRzIG9uIEVFSCAmJiBWRklPX0lPTU1VX1NQQVBSX1RDRQogCWRlZmF1bHQgbgogCitjb25maWcgVkZJT19WSVJRRkQKKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gVkZJTyAmJiBFVkVOVEZECisJZGVmYXVsdCBuCisKIG1lbnVjb25maWcgVkZJTwogCXRyaXN0YXRlICJWRklPIE5vbi1Qcml2aWxlZ2VkIHVzZXJzcGFjZSBkcml2ZXIgZnJhbWV3b3JrIgogCWRlcGVuZHMgb24gSU9NTVVfQVBJCkBAIC0yNywzICszMiw0IEBACiAJICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBOLgogCiBzb3VyY2UgImRyaXZlcnMvdmZpby9wY2kvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy92ZmlvL3BsYXRmb3JtL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8vTWFrZWZpbGUgYi9kcml2ZXJzL3ZmaW8vTWFrZWZpbGUKaW5kZXggMGIwMzViMS4uN2I4YTMxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmZpby9NYWtlZmlsZQpAQCAtMSw1ICsxLDkgQEAKK3ZmaW9fdmlycWZkLXkgOj0gdmlycWZkLm8KKwogb2JqLSQoQ09ORklHX1ZGSU8pICs9IHZmaW8ubworb2JqLSQoQ09ORklHX1ZGSU9fVklSUUZEKSArPSB2ZmlvX3ZpcnFmZC5vCiBvYmotJChDT05GSUdfVkZJT19JT01NVV9UWVBFMSkgKz0gdmZpb19pb21tdV90eXBlMS5vCiBvYmotJChDT05GSUdfVkZJT19JT01NVV9TUEFQUl9UQ0UpICs9IHZmaW9faW9tbXVfc3BhcHJfdGNlLm8KIG9iai0kKENPTkZJR19WRklPX1NQQVBSX0VFSCkgKz0gdmZpb19zcGFwcl9lZWgubwogb2JqLSQoQ09ORklHX1ZGSU9fUENJKSArPSBwY2kvCitvYmotJChDT05GSUdfVkZJT19QTEFURk9STSkgKz0gcGxhdGZvcm0vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8vcGNpL0tjb25maWcgYi9kcml2ZXJzL3ZmaW8vcGNpL0tjb25maWcKaW5kZXggYzZiYjVkYS4uNTc5ZDgzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL3BjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmZpby9wY2kvS2NvbmZpZwpAQCAtMSw2ICsxLDcgQEAKIGNvbmZpZyBWRklPX1BDSQogCXRyaXN0YXRlICJWRklPIHN1cHBvcnQgZm9yIFBDSSBkZXZpY2VzIgogCWRlcGVuZHMgb24gVkZJTyAmJiBQQ0kgJiYgRVZFTlRGRAorCXNlbGVjdCBWRklPX1ZJUlFGRAogCWhlbHAKIAkgIFN1cHBvcnQgZm9yIHRoZSBQQ0kgVkZJTyBidXMgZHJpdmVyLiAgVGhpcyBpcyByZXF1aXJlZCB0byBtYWtlCiAJICB1c2Ugb2YgUENJIGRyaXZlcnMgdXNpbmcgdGhlIFZGSU8gZnJhbWV3b3JrLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaS5jIGIvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaS5jCmluZGV4IGY4YTE4NjMuLjY5ZmFiMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2kuYworKysgYi9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpLmMKQEAgLTExLDYgKzExLDggQEAKICAqIEF1dGhvcjogVG9tIEx5b24sIHB1Z3NAY2lzY28uY29tCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXZlbnRmZC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KQEAgLTI1LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC92ZmlvLmg+CisjaW5jbHVkZSA8bGludXgvdmdhYXJiLmg+CiAKICNpbmNsdWRlICJ2ZmlvX3BjaV9wcml2YXRlLmgiCiAKQEAgLTMyLDEzICszNSw4MSBAQAogI2RlZmluZSBEUklWRVJfQVVUSE9SICAgIkFsZXggV2lsbGlhbXNvbiA8YWxleC53aWxsaWFtc29uQHJlZGhhdC5jb20+IgogI2RlZmluZSBEUklWRVJfREVTQyAgICAgIlZGSU8gUENJIC0gVXNlciBMZXZlbCBtZXRhLWRyaXZlciIKIAorc3RhdGljIGNoYXIgaWRzWzEwMjRdIF9faW5pdGRhdGE7Cittb2R1bGVfcGFyYW1fc3RyaW5nKGlkcywgaWRzLCBzaXplb2YoaWRzKSwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkcywgIkluaXRpYWwgUENJIElEcyB0byBhZGQgdG8gdGhlIHZmaW8gZHJpdmVyLCBmb3JtYXQgaXMgXCJ2ZW5kb3I6ZGV2aWNlWzpzdWJ2ZW5kb3JbOnN1YmRldmljZVs6Y2xhc3NbOmNsYXNzX21hc2tdXV1dXCIgYW5kIG11bHRpcGxlIGNvbW1hIHNlcGFyYXRlZCBlbnRyaWVzIGNhbiBiZSBzcGVjaWZpZWQiKTsKKwogc3RhdGljIGJvb2wgbm9pbnR4bWFzazsKIG1vZHVsZV9wYXJhbV9uYW1lZChub2ludHhtYXNrLCBub2ludHhtYXNrLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CiBNT0RVTEVfUEFSTV9ERVNDKG5vaW50eG1hc2ssCiAJCSAgIkRpc2FibGUgc3VwcG9ydCBmb3IgUENJIDIuMyBzdHlsZSBJTlR4IG1hc2tpbmcuICBJZiB0aGlzIHJlc29sdmVzIHByb2JsZW1zIGZvciBzcGVjaWZpYyBkZXZpY2VzLCByZXBvcnQgbHNwY2kgLXZ2dnh4eCB0byBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnIHNvIHRoZSBkZXZpY2UgY2FuIGJlIGZpeGVkIGF1dG9tYXRpY2FsbHkgdmlhIHRoZSBicm9rZW5faW50eF9tYXNraW5nIGZsYWcuIik7CiAKKyNpZmRlZiBDT05GSUdfVkZJT19QQ0lfVkdBCitzdGF0aWMgYm9vbCBkaXNhYmxlX3ZnYTsKK21vZHVsZV9wYXJhbShkaXNhYmxlX3ZnYSwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfdmdhLCAiRGlzYWJsZSBWR0EgcmVzb3VyY2UgYWNjZXNzIHRocm91Z2ggdmZpby1wY2kiKTsKKyNlbmRpZgorCitzdGF0aWMgYm9vbCBkaXNhYmxlX2lkbGVfZDM7Cittb2R1bGVfcGFyYW0oZGlzYWJsZV9pZGxlX2QzLCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfaWRsZV9kMywKKwkJICJEaXNhYmxlIHVzaW5nIHRoZSBQQ0kgRDMgbG93IHBvd2VyIHN0YXRlIGZvciBpZGxlLCB1bnVzZWQgZGV2aWNlcyIpOworCiBzdGF0aWMgREVGSU5FX01VVEVYKGRyaXZlcl9sb2NrKTsKIAorc3RhdGljIGlubGluZSBib29sIHZmaW9fdmdhX2Rpc2FibGVkKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1ZGSU9fUENJX1ZHQQorCXJldHVybiBkaXNhYmxlX3ZnYTsKKyNlbHNlCisJcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworLyoKKyAqIE91ciBWR0EgYXJiaXRlciBwYXJ0aWNpcGF0aW9uIGlzIGxpbWl0ZWQgc2luY2Ugd2UgZG9uJ3Qga25vdyBhbnl0aGluZworICogYWJvdXQgdGhlIGRldmljZSBpdHNlbGYuICBIb3dldmVyLCBpZiB0aGUgZGV2aWNlIGlzIHRoZSBvbmx5IFZHQSBkZXZpY2UKKyAqIGRvd25zdHJlYW0gb2YgYSBicmlkZ2UgYW5kIFZGSU8gVkdBIHN1cHBvcnQgaXMgZGlzYWJsZWQsIHRoZW4gd2UgY2FuCisgKiBzYWZlbHkgcmV0dXJuIGxlZ2FjeSBWR0EgSU8gYW5kIG1lbW9yeSBhcyBub3QgZGVjb2RlZCBzaW5jZSB0aGUgdXNlcgorICogaGFzIG5vIHdheSB0byBnZXQgdG8gaXQgYW5kIHJvdXRpbmcgY2FuIGJlIGRpc2FibGVkIGV4dGVybmFsbHkgYXQgdGhlCisgKiBicmlkZ2UuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmZpb19wY2lfc2V0X3ZnYV9kZWNvZGUodm9pZCAqb3BhcXVlLCBib29sIHNpbmdsZV92Z2EpCit7CisJc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiA9IG9wYXF1ZTsKKwlzdHJ1Y3QgcGNpX2RldiAqdG1wID0gTlVMTCwgKnBkZXYgPSB2ZGV2LT5wZGV2OworCXVuc2lnbmVkIGNoYXIgbWF4X2J1c25yOworCXVuc2lnbmVkIGludCBkZWNvZGVzOworCisJaWYgKHNpbmdsZV92Z2EgfHwgIXZmaW9fdmdhX2Rpc2FibGVkKCkgfHwgcGNpX2lzX3Jvb3RfYnVzKHBkZXYtPmJ1cykpCisJCXJldHVybiBWR0FfUlNSQ19OT1JNQUxfSU8gfCBWR0FfUlNSQ19OT1JNQUxfTUVNIHwKKwkJICAgICAgIFZHQV9SU1JDX0xFR0FDWV9JTyB8IFZHQV9SU1JDX0xFR0FDWV9NRU07CisKKwltYXhfYnVzbnIgPSBwY2lfYnVzX21heF9idXNucihwZGV2LT5idXMpOworCWRlY29kZXMgPSBWR0FfUlNSQ19OT1JNQUxfSU8gfCBWR0FfUlNSQ19OT1JNQUxfTUVNOworCisJd2hpbGUgKCh0bXAgPSBwY2lfZ2V0X2NsYXNzKFBDSV9DTEFTU19ESVNQTEFZX1ZHQSA8PCA4LCB0bXApKSAhPSBOVUxMKSB7CisJCWlmICh0bXAgPT0gcGRldiB8fAorCQkgICAgcGNpX2RvbWFpbl9ucih0bXAtPmJ1cykgIT0gcGNpX2RvbWFpbl9ucihwZGV2LT5idXMpIHx8CisJCSAgICBwY2lfaXNfcm9vdF9idXModG1wLT5idXMpKQorCQkJY29udGludWU7CisKKwkJaWYgKHRtcC0+YnVzLT5udW1iZXIgPj0gcGRldi0+YnVzLT5udW1iZXIgJiYKKwkJICAgIHRtcC0+YnVzLT5udW1iZXIgPD0gbWF4X2J1c25yKSB7CisJCQlwY2lfZGV2X3B1dCh0bXApOworCQkJZGVjb2RlcyB8PSBWR0FfUlNSQ19MRUdBQ1lfSU8gfCBWR0FfUlNSQ19MRUdBQ1lfTUVNOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZGVjb2RlczsKK30KKworc3RhdGljIGlubGluZSBib29sIHZmaW9fcGNpX2lzX3ZnYShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlyZXR1cm4gKHBkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19ESVNQTEFZX1ZHQTsKK30KKwogc3RhdGljIHZvaWQgdmZpb19wY2lfdHJ5X2J1c19yZXNldChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KTsKIAogc3RhdGljIGludCB2ZmlvX3BjaV9lbmFibGUoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldikKQEAgLTQ4LDYgKzExOSw4IEBACiAJdTE2IGNtZDsKIAl1OCBtc2l4X3BvczsKIAorCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwogCS8qIERvbid0IGFsbG93IG91ciBpbml0aWFsIHNhdmVkIHN0YXRlIHRvIGluY2x1ZGUgYnVzbWFzdGVyICovCiAJcGNpX2NsZWFyX21hc3RlcihwZGV2KTsKIApAQCAtOTMsMTAgKzE2Niw4IEBACiAJfSBlbHNlCiAJCXZkZXYtPm1zaXhfYmFyID0gMHhGRjsKIAotI2lmZGVmIENPTkZJR19WRklPX1BDSV9WR0EKLQlpZiAoKHBkZXYtPmNsYXNzID4+IDgpID09IFBDSV9DTEFTU19ESVNQTEFZX1ZHQSkKKwlpZiAoIXZmaW9fdmdhX2Rpc2FibGVkKCkgJiYgdmZpb19wY2lfaXNfdmdhKHBkZXYpKQogCQl2ZGV2LT5oYXNfdmdhID0gdHJ1ZTsKLSNlbmRpZgogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTMsMjAgKzIyNCwxNyBAQAogCSAqIFRyeSB0byByZXNldCB0aGUgZGV2aWNlLiAgVGhlIHN1Y2Nlc3Mgb2YgdGhpcyBpcyBkZXBlbmRlbnQgb24KIAkgKiBiZWluZyBhYmxlIHRvIGxvY2sgdGhlIGRldmljZSwgd2hpY2ggaXMgbm90IGFsd2F5cyBwb3NzaWJsZS4KIAkgKi8KLQlpZiAodmRldi0+cmVzZXRfd29ya3MpIHsKLQkJaW50IHJldCA9IHBjaV90cnlfcmVzZXRfZnVuY3Rpb24ocGRldik7Ci0JCWlmIChyZXQpCi0JCQlwcl93YXJuKCIlczogRmFpbGVkIHRvIHJlc2V0IGRldmljZSAlcyAoJWQpXG4iLAotCQkJCV9fZnVuY19fLCBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgcmV0KTsKLQkJZWxzZQotCQkJdmRldi0+bmVlZHNfcmVzZXQgPSBmYWxzZTsKLQl9CisJaWYgKHZkZXYtPnJlc2V0X3dvcmtzICYmICFwY2lfdHJ5X3Jlc2V0X2Z1bmN0aW9uKHBkZXYpKQorCQl2ZGV2LT5uZWVkc19yZXNldCA9IGZhbHNlOwogCiAJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CiBvdXQ6CiAJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwogCiAJdmZpb19wY2lfdHJ5X2J1c19yZXNldCh2ZGV2KTsKKworCWlmICghZGlzYWJsZV9pZGxlX2QzKQorCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZmaW9fcGNpX3JlbGVhc2Uodm9pZCAqZGV2aWNlX2RhdGEpCkBAIC04ODUsNiArOTUzLDI3IEBACiAJaWYgKHJldCkgewogCQlpb21tdV9ncm91cF9wdXQoZ3JvdXApOwogCQlrZnJlZSh2ZGV2KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAodmZpb19wY2lfaXNfdmdhKHBkZXYpKSB7CisJCXZnYV9jbGllbnRfcmVnaXN0ZXIocGRldiwgdmRldiwgTlVMTCwgdmZpb19wY2lfc2V0X3ZnYV9kZWNvZGUpOworCQl2Z2Ffc2V0X2xlZ2FjeV9kZWNvZGluZyhwZGV2LAorCQkJCQl2ZmlvX3BjaV9zZXRfdmdhX2RlY29kZSh2ZGV2LCBmYWxzZSkpOworCX0KKworCWlmICghZGlzYWJsZV9pZGxlX2QzKSB7CisJCS8qCisJCSAqIHBjaS1jb3JlIHNldHMgdGhlIGRldmljZSBwb3dlciBzdGF0ZSB0byBhbiB1bmtub3duIHZhbHVlIGF0CisJCSAqIGJvb3R1cCBhbmQgYWZ0ZXIgYmVpbmcgcmVtb3ZlZCBmcm9tIGEgZHJpdmVyLiAgVGhlIG9ubHkKKwkJICogdHJhbnNpdGlvbiBpdCBhbGxvd3MgZnJvbSB0aGlzIHVua25vd24gc3RhdGUgaXMgdG8gRDAsIHdoaWNoCisJCSAqIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gYSBkcml2ZXIgY2FsbHMgcGNpX2VuYWJsZV9kZXZpY2UoKS4KKwkJICogV2UncmUgbm90IHJlYWR5IHRvIGVuYWJsZSB0aGUgZGV2aWNlIHlldCwgYnV0IHdlIGRvIHdhbnQgdG8KKwkJICogYmUgYWJsZSB0byBnZXQgdG8gRDMuICBUaGVyZWZvcmUgZmlyc3QgZG8gYSBEMCB0cmFuc2l0aW9uCisJCSAqIGJlZm9yZSBnb2luZyB0byBEMy4KKwkJICovCisJCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgUENJX0QwKTsKKwkJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDNob3QpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC04OTUsMTAgKzk4NCwyMSBAQAogCXN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXY7CiAKIAl2ZGV2ID0gdmZpb19kZWxfZ3JvdXBfZGV2KCZwZGV2LT5kZXYpOwotCWlmICh2ZGV2KSB7Ci0JCWlvbW11X2dyb3VwX3B1dChwZGV2LT5kZXYuaW9tbXVfZ3JvdXApOwotCQlrZnJlZSh2ZGV2KTsKKwlpZiAoIXZkZXYpCisJCXJldHVybjsKKworCWlvbW11X2dyb3VwX3B1dChwZGV2LT5kZXYuaW9tbXVfZ3JvdXApOworCWtmcmVlKHZkZXYpOworCisJaWYgKHZmaW9fcGNpX2lzX3ZnYShwZGV2KSkgeworCQl2Z2FfY2xpZW50X3JlZ2lzdGVyKHBkZXYsIE5VTEwsIE5VTEwsIE5VTEwpOworCQl2Z2Ffc2V0X2xlZ2FjeV9kZWNvZGluZyhwZGV2LAorCQkJCVZHQV9SU1JDX05PUk1BTF9JTyB8IFZHQV9SU1JDX05PUk1BTF9NRU0gfAorCQkJCVZHQV9SU1JDX0xFR0FDWV9JTyB8IFZHQV9SU1JDX0xFR0FDWV9NRU0pOwogCX0KKworCWlmICghZGlzYWJsZV9pZGxlX2QzKQorCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CiB9CiAKIHN0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IHZmaW9fcGNpX2Flcl9lcnJfZGV0ZWN0ZWQoc3RydWN0IHBjaV9kZXYgKnBkZXYsCkBAIC0xMDE3LDEwICsxMTE3LDEzIEBACiAKIHB1dF9kZXZzOgogCWZvciAoaSA9IDA7IGkgPCBkZXZzLmN1cl9pbmRleDsgaSsrKSB7Ci0JCWlmICghcmV0KSB7Ci0JCQl0bXAgPSB2ZmlvX2RldmljZV9kYXRhKGRldnMuZGV2aWNlc1tpXSk7CisJCXRtcCA9IHZmaW9fZGV2aWNlX2RhdGEoZGV2cy5kZXZpY2VzW2ldKTsKKwkJaWYgKCFyZXQpCiAJCQl0bXAtPm5lZWRzX3Jlc2V0ID0gZmFsc2U7Ci0JCX0KKworCQlpZiAoIXRtcC0+cmVmY250ICYmICFkaXNhYmxlX2lkbGVfZDMpCisJCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHRtcC0+cGRldiwgUENJX0QzaG90KTsKKwogCQl2ZmlvX2RldmljZV9wdXQoZGV2cy5kZXZpY2VzW2ldKTsKIAl9CiAKQEAgLTEwMzAsMTAgKzExMzMsNTAgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCB2ZmlvX3BjaV9jbGVhbnVwKHZvaWQpCiB7CiAJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2ZmlvX3BjaV9kcml2ZXIpOwotCXZmaW9fcGNpX3ZpcnFmZF9leGl0KCk7CiAJdmZpb19wY2lfdW5pbml0X3Blcm1fYml0cygpOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQgdmZpb19wY2lfZmlsbF9pZHModm9pZCkKK3sKKwljaGFyICpwLCAqaWQ7CisJaW50IHJjOworCisJLyogbm8gaWRzIHBhc3NlZCBhY3R1YWxseSAqLworCWlmIChpZHNbMF0gPT0gJ1wwJykKKwkJcmV0dXJuOworCisJLyogYWRkIGlkcyBzcGVjaWZpZWQgaW4gdGhlIG1vZHVsZSBwYXJhbWV0ZXIgKi8KKwlwID0gaWRzOworCXdoaWxlICgoaWQgPSBzdHJzZXAoJnAsICIsIikpKSB7CisJCXVuc2lnbmVkIGludCB2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJCXN1YmRldmljZSA9IFBDSV9BTllfSUQsIGNsYXNzID0gMCwgY2xhc3NfbWFzayA9IDA7CisJCWludCBmaWVsZHM7CisKKwkJaWYgKCFzdHJsZW4oaWQpKQorCQkJY29udGludWU7CisKKwkJZmllbGRzID0gc3NjYW5mKGlkLCAiJXg6JXg6JXg6JXg6JXg6JXgiLAorCQkJCSZ2ZW5kb3IsICZkZXZpY2UsICZzdWJ2ZW5kb3IsICZzdWJkZXZpY2UsCisJCQkJJmNsYXNzLCAmY2xhc3NfbWFzayk7CisKKwkJaWYgKGZpZWxkcyA8IDIpIHsKKwkJCXByX3dhcm4oImludmFsaWQgaWQgc3RyaW5nIFwiJXNcIlxuIiwgaWQpOworCQkJY29udGludWU7CisJCX0KKworCQlyYyA9IHBjaV9hZGRfZHluaWQoJnZmaW9fcGNpX2RyaXZlciwgdmVuZG9yLCBkZXZpY2UsCisJCQkJICAgc3VidmVuZG9yLCBzdWJkZXZpY2UsIGNsYXNzLCBjbGFzc19tYXNrLCAwKTsKKwkJaWYgKHJjKQorCQkJcHJfd2FybigiZmFpbGVkIHRvIGFkZCBkeW5hbWljIGlkIFslMDRoeDolMDRoeFslMDRoeDolMDRoeF1dIGNsYXNzICUjMDh4LyUwOHggKCVkKVxuIiwKKwkJCQl2ZW5kb3IsIGRldmljZSwgc3VidmVuZG9yLCBzdWJkZXZpY2UsCisJCQkJY2xhc3MsIGNsYXNzX21hc2ssIHJjKTsKKwkJZWxzZQorCQkJcHJfaW5mbygiYWRkIFslMDRoeDolMDRoeFslMDRoeDolMDRoeF1dIGNsYXNzICUjMDh4LyUwOHhcbiIsCisJCQkJdmVuZG9yLCBkZXZpY2UsIHN1YnZlbmRvciwgc3ViZGV2aWNlLAorCQkJCWNsYXNzLCBjbGFzc19tYXNrKTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHZmaW9fcGNpX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwpAQCAtMTA0MywyMSArMTE4NiwxNiBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQkvKiBTdGFydCB0aGUgdmlycWZkIGNsZWFudXAgaGFuZGxlciAqLwotCXJldCA9IHZmaW9fcGNpX3ZpcnFmZF9pbml0KCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfdmlycWZkOwotCiAJLyogUmVnaXN0ZXIgYW5kIHNjYW4gZm9yIGRldmljZXMgKi8KIAlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZ2ZmlvX3BjaV9kcml2ZXIpOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2RyaXZlcjsKIAorCXZmaW9fcGNpX2ZpbGxfaWRzKCk7CisKIAlyZXR1cm4gMDsKIAogb3V0X2RyaXZlcjoKLQl2ZmlvX3BjaV92aXJxZmRfZXhpdCgpOwotb3V0X3ZpcnFmZDoKIAl2ZmlvX3BjaV91bmluaXRfcGVybV9iaXRzKCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2lfaW50cnMuYyBiL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2lfaW50cnMuYwppbmRleCAyMDI3YTI3Li4xZjU3N2I0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZmaW8vcGNpL3ZmaW9fcGNpX2ludHJzLmMKKysrIGIvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9pbnRycy5jCkBAIC0xOSwyMzAgKzE5LDE5IEBACiAjaW5jbHVkZSA8bGludXgvbXNpLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC92ZmlvLmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgInZmaW9fcGNpX3ByaXZhdGUuaCIKIAogLyoKLSAqIElSUWZkIC0gZ2VuZXJpYwotICovCi1zdHJ1Y3QgdmlycWZkIHsKLQlzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlCSp2ZGV2OwotCXN0cnVjdCBldmVudGZkX2N0eAkqZXZlbnRmZDsKLQlpbnQJCQkoKmhhbmRsZXIpKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKiwgdm9pZCAqKTsKLQl2b2lkCQkJKCp0aHJlYWQpKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKiwgdm9pZCAqKTsKLQl2b2lkCQkJKmRhdGE7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CWluamVjdDsKLQl3YWl0X3F1ZXVlX3QJCXdhaXQ7Ci0JcG9sbF90YWJsZQkJcHQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CXNodXRkb3duOwotCXN0cnVjdCB2aXJxZmQJCSoqcHZpcnFmZDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdmZpb19pcnFmZF9jbGVhbnVwX3dxOwotCi1pbnQgX19pbml0IHZmaW9fcGNpX3ZpcnFmZF9pbml0KHZvaWQpCi17Ci0JdmZpb19pcnFmZF9jbGVhbnVwX3dxID0KLQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInZmaW8taXJxZmQtY2xlYW51cCIpOwotCWlmICghdmZpb19pcnFmZF9jbGVhbnVwX3dxKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIHZmaW9fcGNpX3ZpcnFmZF9leGl0KHZvaWQpCi17Ci0JZGVzdHJveV93b3JrcXVldWUodmZpb19pcnFmZF9jbGVhbnVwX3dxKTsKLX0KLQotc3RhdGljIHZvaWQgdmlycWZkX2RlYWN0aXZhdGUoc3RydWN0IHZpcnFmZCAqdmlycWZkKQotewotCXF1ZXVlX3dvcmsodmZpb19pcnFmZF9jbGVhbnVwX3dxLCAmdmlycWZkLT5zaHV0ZG93bik7Ci19Ci0KLXN0YXRpYyBpbnQgdmlycWZkX3dha2V1cCh3YWl0X3F1ZXVlX3QgKndhaXQsIHVuc2lnbmVkIG1vZGUsIGludCBzeW5jLCB2b2lkICprZXkpCi17Ci0Jc3RydWN0IHZpcnFmZCAqdmlycWZkID0gY29udGFpbmVyX29mKHdhaXQsIHN0cnVjdCB2aXJxZmQsIHdhaXQpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAodW5zaWduZWQgbG9uZylrZXk7Ci0KLQlpZiAoZmxhZ3MgJiBQT0xMSU4pIHsKLQkJLyogQW4gZXZlbnQgaGFzIGJlZW4gc2lnbmFsZWQsIGNhbGwgZnVuY3Rpb24gKi8KLQkJaWYgKCghdmlycWZkLT5oYW5kbGVyIHx8Ci0JCSAgICAgdmlycWZkLT5oYW5kbGVyKHZpcnFmZC0+dmRldiwgdmlycWZkLT5kYXRhKSkgJiYKLQkJICAgIHZpcnFmZC0+dGhyZWFkKQotCQkJc2NoZWR1bGVfd29yaygmdmlycWZkLT5pbmplY3QpOwotCX0KLQotCWlmIChmbGFncyAmIFBPTExIVVApIHsKLQkJdW5zaWduZWQgbG9uZyBmbGFnczsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnZpcnFmZC0+dmRldi0+aXJxbG9jaywgZmxhZ3MpOwotCi0JCS8qCi0JCSAqIFRoZSBldmVudGZkIGlzIGNsb3NpbmcsIGlmIHRoZSB2aXJxZmQgaGFzIG5vdCB5ZXQgYmVlbgotCQkgKiBxdWV1ZWQgZm9yIHJlbGVhc2UsIGFzIGRldGVybWluZWQgYnkgdGVzdGluZyB3aGV0aGVyIHRoZQotCQkgKiB2ZGV2IHBvaW50ZXIgdG8gaXQgaXMgc3RpbGwgdmFsaWQsIHF1ZXVlIGl0IG5vdy4gIEFzCi0JCSAqIHdpdGgga3ZtIGlycWZkcywgd2Uga25vdyB3ZSB3b24ndCByYWNlIGFnYWluc3QgdGhlIHZpcnFmZAotCQkgKiBnb2luZyBhd2F5IGJlY2F1c2Ugd2UgaG9sZCB3cWgtPmxvY2sgdG8gZ2V0IGhlcmUuCi0JCSAqLwotCQlpZiAoKih2aXJxZmQtPnB2aXJxZmQpID09IHZpcnFmZCkgewotCQkJKih2aXJxZmQtPnB2aXJxZmQpID0gTlVMTDsKLQkJCXZpcnFmZF9kZWFjdGl2YXRlKHZpcnFmZCk7Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aXJxZmQtPnZkZXYtPmlycWxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdmlycWZkX3B0YWJsZV9xdWV1ZV9wcm9jKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgKndxaCwgcG9sbF90YWJsZSAqcHQpCi17Ci0Jc3RydWN0IHZpcnFmZCAqdmlycWZkID0gY29udGFpbmVyX29mKHB0LCBzdHJ1Y3QgdmlycWZkLCBwdCk7Ci0JYWRkX3dhaXRfcXVldWUod3FoLCAmdmlycWZkLT53YWl0KTsKLX0KLQotc3RhdGljIHZvaWQgdmlycWZkX3NodXRkb3duKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgdmlycWZkICp2aXJxZmQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZpcnFmZCwgc2h1dGRvd24pOwotCXU2NCBjbnQ7Ci0KLQlldmVudGZkX2N0eF9yZW1vdmVfd2FpdF9xdWV1ZSh2aXJxZmQtPmV2ZW50ZmQsICZ2aXJxZmQtPndhaXQsICZjbnQpOwotCWZsdXNoX3dvcmsoJnZpcnFmZC0+aW5qZWN0KTsKLQlldmVudGZkX2N0eF9wdXQodmlycWZkLT5ldmVudGZkKTsKLQotCWtmcmVlKHZpcnFmZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpcnFmZF9pbmplY3Qoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCB2aXJxZmQgKnZpcnFmZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdmlycWZkLCBpbmplY3QpOwotCWlmICh2aXJxZmQtPnRocmVhZCkKLQkJdmlycWZkLT50aHJlYWQodmlycWZkLT52ZGV2LCB2aXJxZmQtPmRhdGEpOwotfQotCi1zdGF0aWMgaW50IHZpcnFmZF9lbmFibGUoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwKLQkJCSBpbnQgKCpoYW5kbGVyKShzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICosIHZvaWQgKiksCi0JCQkgdm9pZCAoKnRocmVhZCkoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqLCB2b2lkICopLAotCQkJIHZvaWQgKmRhdGEsIHN0cnVjdCB2aXJxZmQgKipwdmlycWZkLCBpbnQgZmQpCi17Ci0Jc3RydWN0IGZkIGlycWZkOwotCXN0cnVjdCBldmVudGZkX2N0eCAqY3R4OwotCXN0cnVjdCB2aXJxZmQgKnZpcnFmZDsKLQlpbnQgcmV0ID0gMDsKLQl1bnNpZ25lZCBpbnQgZXZlbnRzOwotCi0JdmlycWZkID0ga3phbGxvYyhzaXplb2YoKnZpcnFmZCksIEdGUF9LRVJORUwpOwotCWlmICghdmlycWZkKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXZpcnFmZC0+cHZpcnFmZCA9IHB2aXJxZmQ7Ci0JdmlycWZkLT52ZGV2ID0gdmRldjsKLQl2aXJxZmQtPmhhbmRsZXIgPSBoYW5kbGVyOwotCXZpcnFmZC0+dGhyZWFkID0gdGhyZWFkOwotCXZpcnFmZC0+ZGF0YSA9IGRhdGE7Ci0KLQlJTklUX1dPUksoJnZpcnFmZC0+c2h1dGRvd24sIHZpcnFmZF9zaHV0ZG93bik7Ci0JSU5JVF9XT1JLKCZ2aXJxZmQtPmluamVjdCwgdmlycWZkX2luamVjdCk7Ci0KLQlpcnFmZCA9IGZkZ2V0KGZkKTsKLQlpZiAoIWlycWZkLmZpbGUpIHsKLQkJcmV0ID0gLUVCQURGOwotCQlnb3RvIGVycl9mZDsKLQl9Ci0KLQljdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGlycWZkLmZpbGUpOwotCWlmIChJU19FUlIoY3R4KSkgewotCQlyZXQgPSBQVFJfRVJSKGN0eCk7Ci0JCWdvdG8gZXJyX2N0eDsKLQl9Ci0KLQl2aXJxZmQtPmV2ZW50ZmQgPSBjdHg7Ci0KLQkvKgotCSAqIHZpcnFmZHMgY2FuIGJlIHJlbGVhc2VkIGJ5IGNsb3NpbmcgdGhlIGV2ZW50ZmQgb3IgZGlyZWN0bHkKLQkgKiB0aHJvdWdoIGlvY3RsLiAgVGhlc2UgYXJlIGJvdGggZG9uZSB0aHJvdWdoIGEgd29ya3F1ZXVlLCBzbwotCSAqIHdlIHVwZGF0ZSB0aGUgcG9pbnRlciB0byB0aGUgdmlycWZkIHVuZGVyIGxvY2sgdG8gYXZvaWQKLQkgKiBwdXNoaW5nIG11bHRpcGxlIGpvYnMgdG8gcmVsZWFzZSB0aGUgc2FtZSB2aXJxZmQuCi0JICovCi0Jc3Bpbl9sb2NrX2lycSgmdmRldi0+aXJxbG9jayk7Ci0KLQlpZiAoKnB2aXJxZmQpIHsKLQkJc3Bpbl91bmxvY2tfaXJxKCZ2ZGV2LT5pcnFsb2NrKTsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVycl9idXN5OwotCX0KLQkqcHZpcnFmZCA9IHZpcnFmZDsKLQotCXNwaW5fdW5sb2NrX2lycSgmdmRldi0+aXJxbG9jayk7Ci0KLQkvKgotCSAqIEluc3RhbGwgb3VyIG93biBjdXN0b20gd2FrZS11cCBoYW5kbGluZyBzbyB3ZSBhcmUgbm90aWZpZWQgdmlhCi0JICogYSBjYWxsYmFjayB3aGVuZXZlciBzb21lb25lIHNpZ25hbHMgdGhlIHVuZGVybHlpbmcgZXZlbnRmZC4KLQkgKi8KLQlpbml0X3dhaXRxdWV1ZV9mdW5jX2VudHJ5KCZ2aXJxZmQtPndhaXQsIHZpcnFmZF93YWtldXApOwotCWluaXRfcG9sbF9mdW5jcHRyKCZ2aXJxZmQtPnB0LCB2aXJxZmRfcHRhYmxlX3F1ZXVlX3Byb2MpOwotCi0JZXZlbnRzID0gaXJxZmQuZmlsZS0+Zl9vcC0+cG9sbChpcnFmZC5maWxlLCAmdmlycWZkLT5wdCk7Ci0KLQkvKgotCSAqIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBldmVudCBhbHJlYWR5IHBlbmRpbmcgb24gdGhlIGV2ZW50ZmQKLQkgKiBiZWZvcmUgd2UgcmVnaXN0ZXJlZCBhbmQgdHJpZ2dlciBpdCBhcyBpZiB3ZSBkaWRuJ3QgbWlzcyBpdC4KLQkgKi8KLQlpZiAoZXZlbnRzICYgUE9MTElOKSB7Ci0JCWlmICgoIWhhbmRsZXIgfHwgaGFuZGxlcih2ZGV2LCBkYXRhKSkgJiYgdGhyZWFkKQotCQkJc2NoZWR1bGVfd29yaygmdmlycWZkLT5pbmplY3QpOwotCX0KLQotCS8qCi0JICogRG8gbm90IGRyb3AgdGhlIGZpbGUgdW50aWwgdGhlIGlycWZkIGlzIGZ1bGx5IGluaXRpYWxpemVkLAotCSAqIG90aGVyd2lzZSB3ZSBtaWdodCByYWNlIGFnYWluc3QgdGhlIFBPTExIVVAuCi0JICovCi0JZmRwdXQoaXJxZmQpOwotCi0JcmV0dXJuIDA7Ci1lcnJfYnVzeToKLQlldmVudGZkX2N0eF9wdXQoY3R4KTsKLWVycl9jdHg6Ci0JZmRwdXQoaXJxZmQpOwotZXJyX2ZkOgotCWtmcmVlKHZpcnFmZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCB2aXJxZmRfZGlzYWJsZShzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2LAotCQkJICAgc3RydWN0IHZpcnFmZCAqKnB2aXJxZmQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZGV2LT5pcnFsb2NrLCBmbGFncyk7Ci0KLQlpZiAoKnB2aXJxZmQpIHsKLQkJdmlycWZkX2RlYWN0aXZhdGUoKnB2aXJxZmQpOwotCQkqcHZpcnFmZCA9IE5VTEw7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmRldi0+aXJxbG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBCbG9jayB1bnRpbCB3ZSBrbm93IGFsbCBvdXRzdGFuZGluZyBzaHV0ZG93biBqb2JzIGhhdmUgY29tcGxldGVkLgotCSAqIEV2ZW4gaWYgd2UgZG9uJ3QgcXVldWUgdGhlIGpvYiwgZmx1c2ggdGhlIHdxIHRvIGJlIHN1cmUgaXQncwotCSAqIGJlZW4gcmVsZWFzZWQuCi0JICovCi0JZmx1c2hfd29ya3F1ZXVlKHZmaW9faXJxZmRfY2xlYW51cF93cSk7Ci19Ci0KLS8qCiAgKiBJTlR4CiAgKi8KLXN0YXRpYyB2b2lkIHZmaW9fc2VuZF9pbnR4X2V2ZW50ZmQoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldiwgdm9pZCAqdW51c2VkKQorc3RhdGljIHZvaWQgdmZpb19zZW5kX2ludHhfZXZlbnRmZCh2b2lkICpvcGFxdWUsIHZvaWQgKnVudXNlZCkKIHsKKwlzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2ID0gb3BhcXVlOworCiAJaWYgKGxpa2VseShpc19pbnR4KHZkZXYpICYmICF2ZGV2LT52aXJxX2Rpc2FibGVkKSkKIAkJZXZlbnRmZF9zaWduYWwodmRldi0+Y3R4WzBdLnRyaWdnZXIsIDEpOwogfQpAQCAtMjg1LDkgKzc0LDkgQEAKICAqIGEgc2lnbmFsIGlzIG5lY2Vzc2FyeSwgd2hpY2ggY2FuIHRoZW4gYmUgaGFuZGxlZCB2aWEgYSB3b3JrIHF1ZXVlCiAgKiBvciBkaXJlY3RseSBkZXBlbmRpbmcgb24gdGhlIGNhbGxlci4KICAqLwotc3RhdGljIGludCB2ZmlvX3BjaV9pbnR4X3VubWFza19oYW5kbGVyKHN0cnVjdCB2ZmlvX3BjaV9kZXZpY2UgKnZkZXYsCi0JCQkJCXZvaWQgKnVudXNlZCkKK3N0YXRpYyBpbnQgdmZpb19wY2lfaW50eF91bm1hc2tfaGFuZGxlcih2b2lkICpvcGFxdWUsIHZvaWQgKnVudXNlZCkKIHsKKwlzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2ID0gb3BhcXVlOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdmRldi0+cGRldjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAwOwpAQCAtNDQwLDggKzIyOSw4IEBACiBzdGF0aWMgdm9pZCB2ZmlvX2ludHhfZGlzYWJsZShzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KQogewogCXZmaW9faW50eF9zZXRfc2lnbmFsKHZkZXYsIC0xKTsKLQl2aXJxZmRfZGlzYWJsZSh2ZGV2LCAmdmRldi0+Y3R4WzBdLnVubWFzayk7Ci0JdmlycWZkX2Rpc2FibGUodmRldiwgJnZkZXYtPmN0eFswXS5tYXNrKTsKKwl2ZmlvX3ZpcnFmZF9kaXNhYmxlKCZ2ZGV2LT5jdHhbMF0udW5tYXNrKTsKKwl2ZmlvX3ZpcnFmZF9kaXNhYmxlKCZ2ZGV2LT5jdHhbMF0ubWFzayk7CiAJdmRldi0+aXJxX3R5cGUgPSBWRklPX1BDSV9OVU1fSVJRUzsKIAl2ZGV2LT5udW1fY3R4ID0gMDsKIAlrZnJlZSh2ZGV2LT5jdHgpOwpAQCAtNjA1LDggKzM5NCw4IEBACiAJdmZpb19tc2lfc2V0X2Jsb2NrKHZkZXYsIDAsIHZkZXYtPm51bV9jdHgsIE5VTEwsIG1zaXgpOwogCiAJZm9yIChpID0gMDsgaSA8IHZkZXYtPm51bV9jdHg7IGkrKykgewotCQl2aXJxZmRfZGlzYWJsZSh2ZGV2LCAmdmRldi0+Y3R4W2ldLnVubWFzayk7Ci0JCXZpcnFmZF9kaXNhYmxlKHZkZXYsICZ2ZGV2LT5jdHhbaV0ubWFzayk7CisJCXZmaW9fdmlycWZkX2Rpc2FibGUoJnZkZXYtPmN0eFtpXS51bm1hc2spOworCQl2ZmlvX3ZpcnFmZF9kaXNhYmxlKCZ2ZGV2LT5jdHhbaV0ubWFzayk7CiAJfQogCiAJaWYgKG1zaXgpIHsKQEAgLTYzOSwxMSArNDI4LDEyIEBACiAJfSBlbHNlIGlmIChmbGFncyAmIFZGSU9fSVJRX1NFVF9EQVRBX0VWRU5URkQpIHsKIAkJaW50MzJfdCBmZCA9ICooaW50MzJfdCAqKWRhdGE7CiAJCWlmIChmZCA+PSAwKQotCQkJcmV0dXJuIHZpcnFmZF9lbmFibGUodmRldiwgdmZpb19wY2lfaW50eF91bm1hc2tfaGFuZGxlciwKLQkJCQkJICAgICB2ZmlvX3NlbmRfaW50eF9ldmVudGZkLCBOVUxMLAotCQkJCQkgICAgICZ2ZGV2LT5jdHhbMF0udW5tYXNrLCBmZCk7CisJCQlyZXR1cm4gdmZpb192aXJxZmRfZW5hYmxlKCh2b2lkICopIHZkZXYsCisJCQkJCQkgIHZmaW9fcGNpX2ludHhfdW5tYXNrX2hhbmRsZXIsCisJCQkJCQkgIHZmaW9fc2VuZF9pbnR4X2V2ZW50ZmQsIE5VTEwsCisJCQkJCQkgICZ2ZGV2LT5jdHhbMF0udW5tYXNrLCBmZCk7CiAKLQkJdmlycWZkX2Rpc2FibGUodmRldiwgJnZkZXYtPmN0eFswXS51bm1hc2spOworCQl2ZmlvX3ZpcnFmZF9kaXNhYmxlKCZ2ZGV2LT5jdHhbMF0udW5tYXNrKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmZpby9wY2kvdmZpb19wY2lfcHJpdmF0ZS5oIGIvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9wcml2YXRlLmgKaW5kZXggYzlmOWIzMi4uYWUwZTFiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9wcml2YXRlLmgKKysrIGIvZHJpdmVycy92ZmlvL3BjaS92ZmlvX3BjaV9wcml2YXRlLmgKQEAgLTg3LDkgKzg3LDYgQEAKIGV4dGVybiBpbnQgdmZpb19wY2lfaW5pdF9wZXJtX2JpdHModm9pZCk7CiBleHRlcm4gdm9pZCB2ZmlvX3BjaV91bmluaXRfcGVybV9iaXRzKHZvaWQpOwogCi1leHRlcm4gaW50IHZmaW9fcGNpX3ZpcnFmZF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQgdmZpb19wY2lfdmlycWZkX2V4aXQodm9pZCk7Ci0KIGV4dGVybiBpbnQgdmZpb19jb25maWdfaW5pdChzdHJ1Y3QgdmZpb19wY2lfZGV2aWNlICp2ZGV2KTsKIGV4dGVybiB2b2lkIHZmaW9fY29uZmlnX2ZyZWUoc3RydWN0IHZmaW9fcGNpX2RldmljZSAqdmRldik7CiAjZW5kaWYgLyogVkZJT19QQ0lfUFJJVkFURV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vS2NvbmZpZyBiL2RyaXZlcnMvdmZpby9wbGF0Zm9ybS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDQwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vS2NvbmZpZwpAQCAtMCwwICsxLDIwIEBACitjb25maWcgVkZJT19QTEFURk9STQorCXRyaXN0YXRlICJWRklPIHN1cHBvcnQgZm9yIHBsYXRmb3JtIGRldmljZXMiCisJZGVwZW5kcyBvbiBWRklPICYmIEVWRU5URkQgJiYgQVJNCisJc2VsZWN0IFZGSU9fVklSUUZECisJaGVscAorCSAgU3VwcG9ydCBmb3IgcGxhdGZvcm0gZGV2aWNlcyB3aXRoIFZGSU8uIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZQorCSAgdXNlIG9mIHBsYXRmb3JtIGRldmljZXMgcHJlc2VudCBvbiB0aGUgc3lzdGVtIHVzaW5nIHRoZSBWRklPCisJICBmcmFtZXdvcmsuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCisKK2NvbmZpZyBWRklPX0FNQkEKKwl0cmlzdGF0ZSAiVkZJTyBzdXBwb3J0IGZvciBBTUJBIGRldmljZXMiCisJZGVwZW5kcyBvbiBWRklPX1BMQVRGT1JNICYmIEFSTV9BTUJBCisJaGVscAorCSAgU3VwcG9ydCBmb3IgQVJNIEFNQkEgZGV2aWNlcyB3aXRoIFZGSU8uIFRoaXMgaXMgcmVxdWlyZWQgdG8gbWFrZQorCSAgdXNlIG9mIEFSTSBBTUJBIGRldmljZXMgcHJlc2VudCBvbiB0aGUgc3lzdGVtIHVzaW5nIHRoZSBWRklPCisJICBmcmFtZXdvcmsuCisKKwkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vTWFrZWZpbGUgYi9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkZTE0NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmZpby9wbGF0Zm9ybS9NYWtlZmlsZQpAQCAtMCwwICsxLDggQEAKKwordmZpby1wbGF0Zm9ybS15IDo9IHZmaW9fcGxhdGZvcm0ubyB2ZmlvX3BsYXRmb3JtX2NvbW1vbi5vIHZmaW9fcGxhdGZvcm1faXJxLm8KKworb2JqLSQoQ09ORklHX1ZGSU9fUExBVEZPUk0pICs9IHZmaW8tcGxhdGZvcm0ubworCit2ZmlvLWFtYmEteSA6PSB2ZmlvX2FtYmEubworCitvYmotJChDT05GSUdfVkZJT19BTUJBKSArPSB2ZmlvLWFtYmEubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3BsYXRmb3JtL3ZmaW9fYW1iYS5jIGIvZHJpdmVycy92ZmlvL3BsYXRmb3JtL3ZmaW9fYW1iYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDMzMWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vdmZpb19hbWJhLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgLSBWaXJ0dWFsIE9wZW4gU3lzdGVtcworICogQXV0aG9yOiBBbnRvbmlvcyBNb3Rha2lzIDxhLm1vdGFraXNAdmlydHVhbG9wZW5zeXN0ZW1zLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLCBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZmaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorCisjaW5jbHVkZSAidmZpb19wbGF0Zm9ybV9wcml2YXRlLmgiCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gICIwLjEwIgorI2RlZmluZSBEUklWRVJfQVVUSE9SICAgIkFudG9uaW9zIE1vdGFraXMgPGEubW90YWtpc0B2aXJ0dWFsb3BlbnN5c3RlbXMuY29tPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgICAgICJWRklPIGZvciBBTUJBIGRldmljZXMgLSBVc2VyIExldmVsIG1ldGEtZHJpdmVyIgorCisvKiBwcm9iaW5nIGRldmljZXMgZnJvbSB0aGUgQU1CQSBidXMgKi8KKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqZ2V0X2FtYmFfcmVzb3VyY2Uoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2LAorCQkJCQkgIGludCBpKQoreworCXN0cnVjdCBhbWJhX2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1iYV9kZXZpY2UgKikgdmRldi0+b3BhcXVlOworCisJaWYgKGkgPT0gMCkKKwkJcmV0dXJuICZhZGV2LT5yZXM7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBnZXRfYW1iYV9pcnEoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2LCBpbnQgaSkKK3sKKwlzdHJ1Y3QgYW1iYV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtYmFfZGV2aWNlICopIHZkZXYtPm9wYXF1ZTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChpIDwgQU1CQV9OUl9JUlFTKQorCQlyZXQgPSBhZGV2LT5pcnFbaV07CisKKwkvKiB6ZXJvIGlzIGFuIHVuc2V0IElSUSBmb3IgQU1CQSBkZXZpY2VzICovCisJcmV0dXJuIHJldCA/IHJldCA6IC1FTlhJTzsKK30KKworc3RhdGljIGludCB2ZmlvX2FtYmFfcHJvYmUoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2LCBjb25zdCBzdHJ1Y3QgYW1iYV9pZCAqaWQpCit7CisJc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2OworCWludCByZXQ7CisKKwl2ZGV2ID0ga3phbGxvYyhzaXplb2YoKnZkZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZkZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJdmRldi0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAidmZpby1hbWJhLSUwOHgiLCBhZGV2LT5wZXJpcGhpZCk7CisJaWYgKCF2ZGV2LT5uYW1lKSB7CisJCWtmcmVlKHZkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2ZGV2LT5vcGFxdWUgPSAodm9pZCAqKSBhZGV2OworCXZkZXYtPmZsYWdzID0gVkZJT19ERVZJQ0VfRkxBR1NfQU1CQTsKKwl2ZGV2LT5nZXRfcmVzb3VyY2UgPSBnZXRfYW1iYV9yZXNvdXJjZTsKKwl2ZGV2LT5nZXRfaXJxID0gZ2V0X2FtYmFfaXJxOworCisJcmV0ID0gdmZpb19wbGF0Zm9ybV9wcm9iZV9jb21tb24odmRldiwgJmFkZXYtPmRldik7CisJaWYgKHJldCkgeworCQlrZnJlZSh2ZGV2LT5uYW1lKTsKKwkJa2ZyZWUodmRldik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2ZmlvX2FtYmFfcmVtb3ZlKHN0cnVjdCBhbWJhX2RldmljZSAqYWRldikKK3sKKwlzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXY7CisKKwl2ZGV2ID0gdmZpb19wbGF0Zm9ybV9yZW1vdmVfY29tbW9uKCZhZGV2LT5kZXYpOworCWlmICh2ZGV2KSB7CisJCWtmcmVlKHZkZXYtPm5hbWUpOworCQlrZnJlZSh2ZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYW1iYV9pZCBwbDMzMF9pZHNbXSA9IHsKKwl7IDAsIDAgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYW1iYSwgcGwzMzBfaWRzKTsKKworc3RhdGljIHN0cnVjdCBhbWJhX2RyaXZlciB2ZmlvX2FtYmFfZHJpdmVyID0geworCS5wcm9iZSA9IHZmaW9fYW1iYV9wcm9iZSwKKwkucmVtb3ZlID0gdmZpb19hbWJhX3JlbW92ZSwKKwkuaWRfdGFibGUgPSBwbDMzMF9pZHMsCisJLmRydiA9IHsKKwkJLm5hbWUgPSAidmZpby1hbWJhIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK21vZHVsZV9hbWJhX2RyaXZlcih2ZmlvX2FtYmFfZHJpdmVyKTsKKworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKK01PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vdmZpb19wbGF0Zm9ybS5jIGIvZHJpdmVycy92ZmlvL3BsYXRmb3JtL3ZmaW9fcGxhdGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWY2NDVjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92ZmlvL3BsYXRmb3JtL3ZmaW9fcGxhdGZvcm0uYwpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyAtIFZpcnR1YWwgT3BlbiBTeXN0ZW1zCisgKiBBdXRob3I6IEFudG9uaW9zIE1vdGFraXMgPGEubW90YWtpc0B2aXJ0dWFsb3BlbnN5c3RlbXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdmZpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSAidmZpb19wbGF0Zm9ybV9wcml2YXRlLmgiCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gICIwLjEwIgorI2RlZmluZSBEUklWRVJfQVVUSE9SICAgIkFudG9uaW9zIE1vdGFraXMgPGEubW90YWtpc0B2aXJ0dWFsb3BlbnN5c3RlbXMuY29tPiIKKyNkZWZpbmUgRFJJVkVSX0RFU0MgICAgICJWRklPIGZvciBwbGF0Zm9ybSBkZXZpY2VzIC0gVXNlciBMZXZlbCBtZXRhLWRyaXZlciIKKworLyogcHJvYmluZyBkZXZpY2VzIGZyb20gdGhlIGxpbnV4IHBsYXRmb3JtIGJ1cyAqLworCitzdGF0aWMgc3RydWN0IHJlc291cmNlICpnZXRfcGxhdGZvcm1fcmVzb3VyY2Uoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2LAorCQkJCQkgICAgICBpbnQgbnVtKQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICopIHZkZXYtPm9wYXF1ZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9yZXNvdXJjZXM7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKKworCQlpZiAocmVzb3VyY2VfdHlwZShyKSAmIChJT1JFU09VUkNFX01FTXxJT1JFU09VUkNFX0lPKSkgeworCQkJaWYgKCFudW0pCisJCQkJcmV0dXJuIHI7CisKKwkJCW51bS0tOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGdldF9wbGF0Zm9ybV9pcnEoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2LCBpbnQgaSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKikgdmRldi0+b3BhcXVlOworCisJcmV0dXJuIHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7Cit9CisKK3N0YXRpYyBpbnQgdmZpb19wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZmlvX3BsYXRmb3JtX2RldmljZSAqdmRldjsKKwlpbnQgcmV0OworCisJdmRldiA9IGt6YWxsb2Moc2l6ZW9mKCp2ZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2ZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXZkZXYtPm9wYXF1ZSA9ICh2b2lkICopIHBkZXY7CisJdmRldi0+bmFtZSA9IHBkZXYtPm5hbWU7CisJdmRldi0+ZmxhZ3MgPSBWRklPX0RFVklDRV9GTEFHU19QTEFURk9STTsKKwl2ZGV2LT5nZXRfcmVzb3VyY2UgPSBnZXRfcGxhdGZvcm1fcmVzb3VyY2U7CisJdmRldi0+Z2V0X2lycSA9IGdldF9wbGF0Zm9ybV9pcnE7CisKKwlyZXQgPSB2ZmlvX3BsYXRmb3JtX3Byb2JlX2NvbW1vbih2ZGV2LCAmcGRldi0+ZGV2KTsKKwlpZiAocmV0KQorCQlrZnJlZSh2ZGV2KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmZpb19wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXY7CisKKwl2ZGV2ID0gdmZpb19wbGF0Zm9ybV9yZW1vdmVfY29tbW9uKCZwZGV2LT5kZXYpOworCWlmICh2ZGV2KSB7CisJCWtmcmVlKHZkZXYpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdmZpb19wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHZmaW9fcGxhdGZvcm1fcHJvYmUsCisJLnJlbW92ZQkJPSB2ZmlvX3BsYXRmb3JtX3JlbW92ZSwKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJ2ZmlvLXBsYXRmb3JtIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodmZpb19wbGF0Zm9ybV9kcml2ZXIpOworCitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmZpby9wbGF0Zm9ybS92ZmlvX3BsYXRmb3JtX2NvbW1vbi5jIGIvZHJpdmVycy92ZmlvL3BsYXRmb3JtL3ZmaW9fcGxhdGZvcm1fY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjZmY3YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmZpby9wbGF0Zm9ybS92ZmlvX3BsYXRmb3JtX2NvbW1vbi5jCkBAIC0wLDAgKzEsNTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIC0gVmlydHVhbCBPcGVuIFN5c3RlbXMKKyAqIEF1dGhvcjogQW50b25pb3MgTW90YWtpcyA8YS5tb3Rha2lzQHZpcnR1YWxvcGVuc3lzdGVtcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvbW11Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdmZpby5oPgorCisjaW5jbHVkZSAidmZpb19wbGF0Zm9ybV9wcml2YXRlLmgiCisKK3N0YXRpYyBERUZJTkVfTVVURVgoZHJpdmVyX2xvY2spOworCitzdGF0aWMgaW50IHZmaW9fcGxhdGZvcm1fcmVnaW9uc19pbml0KHN0cnVjdCB2ZmlvX3BsYXRmb3JtX2RldmljZSAqdmRldikKK3sKKwlpbnQgY250ID0gMCwgaTsKKworCXdoaWxlICh2ZGV2LT5nZXRfcmVzb3VyY2UodmRldiwgY250KSkKKwkJY250Kys7CisKKwl2ZGV2LT5yZWdpb25zID0ga2NhbGxvYyhjbnQsIHNpemVvZihzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9yZWdpb24pLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghdmRldi0+cmVnaW9ucykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgY250OyAgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0KKwkJCXZkZXYtPmdldF9yZXNvdXJjZSh2ZGV2LCBpKTsKKworCQlpZiAoIXJlcykKKwkJCWdvdG8gZXJyOworCisJCXZkZXYtPnJlZ2lvbnNbaV0uYWRkciA9IHJlcy0+c3RhcnQ7CisJCXZkZXYtPnJlZ2lvbnNbaV0uc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKwkJdmRldi0+cmVnaW9uc1tpXS5mbGFncyA9IDA7CisKKwkJc3dpdGNoIChyZXNvdXJjZV90eXBlKHJlcykpIHsKKwkJY2FzZSBJT1JFU09VUkNFX01FTToKKwkJCXZkZXYtPnJlZ2lvbnNbaV0udHlwZSA9IFZGSU9fUExBVEZPUk1fUkVHSU9OX1RZUEVfTU1JTzsKKwkJCXZkZXYtPnJlZ2lvbnNbaV0uZmxhZ3MgfD0gVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQ7CisJCQlpZiAoIShyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9SRUFET05MWSkpCisJCQkJdmRldi0+cmVnaW9uc1tpXS5mbGFncyB8PQorCQkJCQlWRklPX1JFR0lPTl9JTkZPX0ZMQUdfV1JJVEU7CisKKwkJCS8qCisJCQkgKiBPbmx5IHJlZ2lvbnMgYWRkcmVzc2VkIHdpdGggUEFHRSBncmFudWxhcml0eSBtYXkgYmUKKwkJCSAqIE1NQVBlZCBzZWN1cmVseS4KKwkJCSAqLworCQkJaWYgKCEodmRldi0+cmVnaW9uc1tpXS5hZGRyICYgflBBR0VfTUFTSykgJiYKKwkJCQkJISh2ZGV2LT5yZWdpb25zW2ldLnNpemUgJiB+UEFHRV9NQVNLKSkKKwkJCQl2ZGV2LT5yZWdpb25zW2ldLmZsYWdzIHw9CisJCQkJCVZGSU9fUkVHSU9OX0lORk9fRkxBR19NTUFQOworCisJCQlicmVhazsKKwkJY2FzZSBJT1JFU09VUkNFX0lPOgorCQkJdmRldi0+cmVnaW9uc1tpXS50eXBlID0gVkZJT19QTEFURk9STV9SRUdJT05fVFlQRV9QSU87CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJdmRldi0+bnVtX3JlZ2lvbnMgPSBjbnQ7CisKKwlyZXR1cm4gMDsKK2VycjoKKwlrZnJlZSh2ZGV2LT5yZWdpb25zKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgdmZpb19wbGF0Zm9ybV9yZWdpb25zX2NsZWFudXAoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHZkZXYtPm51bV9yZWdpb25zOyBpKyspCisJCWlvdW5tYXAodmRldi0+cmVnaW9uc1tpXS5pb2FkZHIpOworCisJdmRldi0+bnVtX3JlZ2lvbnMgPSAwOworCWtmcmVlKHZkZXYtPnJlZ2lvbnMpOworfQorCitzdGF0aWMgdm9pZCB2ZmlvX3BsYXRmb3JtX3JlbGVhc2Uodm9pZCAqZGV2aWNlX2RhdGEpCit7CisJc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2ID0gZGV2aWNlX2RhdGE7CisKKwltdXRleF9sb2NrKCZkcml2ZXJfbG9jayk7CisKKwlpZiAoISgtLXZkZXYtPnJlZmNudCkpIHsKKwkJdmZpb19wbGF0Zm9ybV9yZWdpb25zX2NsZWFudXAodmRldik7CisJCXZmaW9fcGxhdGZvcm1faXJxX2NsZWFudXAodmRldik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZkcml2ZXJfbG9jayk7CisKKwltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIGludCB2ZmlvX3BsYXRmb3JtX29wZW4odm9pZCAqZGV2aWNlX2RhdGEpCit7CisJc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2ID0gZGV2aWNlX2RhdGE7CisJaW50IHJldDsKKworCWlmICghdHJ5X21vZHVsZV9nZXQoVEhJU19NT0RVTEUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW11dGV4X2xvY2soJmRyaXZlcl9sb2NrKTsKKworCWlmICghdmRldi0+cmVmY250KSB7CisJCXJldCA9IHZmaW9fcGxhdGZvcm1fcmVnaW9uc19pbml0KHZkZXYpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfcmVnOworCisJCXJldCA9IHZmaW9fcGxhdGZvcm1faXJxX2luaXQodmRldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9pcnE7CisJfQorCisJdmRldi0+cmVmY250Kys7CisKKwltdXRleF91bmxvY2soJmRyaXZlcl9sb2NrKTsKKwlyZXR1cm4gMDsKKworZXJyX2lycToKKwl2ZmlvX3BsYXRmb3JtX3JlZ2lvbnNfY2xlYW51cCh2ZGV2KTsKK2Vycl9yZWc6CisJbXV0ZXhfdW5sb2NrKCZkcml2ZXJfbG9jayk7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGxvbmcgdmZpb19wbGF0Zm9ybV9pb2N0bCh2b2lkICpkZXZpY2VfZGF0YSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYgPSBkZXZpY2VfZGF0YTsKKwl1bnNpZ25lZCBsb25nIG1pbnN6OworCisJaWYgKGNtZCA9PSBWRklPX0RFVklDRV9HRVRfSU5GTykgeworCQlzdHJ1Y3QgdmZpb19kZXZpY2VfaW5mbyBpbmZvOworCisJCW1pbnN6ID0gb2Zmc2V0b2ZlbmQoc3RydWN0IHZmaW9fZGV2aWNlX2luZm8sIG51bV9pcnFzKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sICh2b2lkIF9fdXNlciAqKWFyZywgbWluc3opKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGluZm8uYXJnc3ogPCBtaW5zeikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWluZm8uZmxhZ3MgPSB2ZGV2LT5mbGFnczsKKwkJaW5mby5udW1fcmVnaW9ucyA9IHZkZXYtPm51bV9yZWdpb25zOworCQlpbmZvLm51bV9pcnFzID0gdmRldi0+bnVtX2lycXM7CisKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBtaW5zeik7CisKKwl9IGVsc2UgaWYgKGNtZCA9PSBWRklPX0RFVklDRV9HRVRfUkVHSU9OX0lORk8pIHsKKwkJc3RydWN0IHZmaW9fcmVnaW9uX2luZm8gaW5mbzsKKworCQltaW5zeiA9IG9mZnNldG9mZW5kKHN0cnVjdCB2ZmlvX3JlZ2lvbl9pbmZvLCBvZmZzZXQpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgX191c2VyICopYXJnLCBtaW5zeikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaW5mby5hcmdzeiA8IG1pbnN6KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGluZm8uaW5kZXggPj0gdmRldi0+bnVtX3JlZ2lvbnMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBtYXAgb2Zmc2V0IHRvIHRoZSBwaHlzaWNhbCBhZGRyZXNzICAqLworCQlpbmZvLm9mZnNldCA9IFZGSU9fUExBVEZPUk1fSU5ERVhfVE9fT0ZGU0VUKGluZm8uaW5kZXgpOworCQlpbmZvLnNpemUgPSB2ZGV2LT5yZWdpb25zW2luZm8uaW5kZXhdLnNpemU7CisJCWluZm8uZmxhZ3MgPSB2ZGV2LT5yZWdpb25zW2luZm8uaW5kZXhdLmZsYWdzOworCisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgbWluc3opOworCisJfSBlbHNlIGlmIChjbWQgPT0gVkZJT19ERVZJQ0VfR0VUX0lSUV9JTkZPKSB7CisJCXN0cnVjdCB2ZmlvX2lycV9pbmZvIGluZm87CisKKwkJbWluc3ogPSBvZmZzZXRvZmVuZChzdHJ1Y3QgdmZpb19pcnFfaW5mbywgY291bnQpOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgKHZvaWQgX191c2VyICopYXJnLCBtaW5zeikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaW5mby5hcmdzeiA8IG1pbnN6KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGluZm8uaW5kZXggPj0gdmRldi0+bnVtX2lycXMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpbmZvLmZsYWdzID0gdmRldi0+aXJxc1tpbmZvLmluZGV4XS5mbGFnczsKKwkJaW5mby5jb3VudCA9IHZkZXYtPmlycXNbaW5mby5pbmRleF0uY291bnQ7CisKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBtaW5zeik7CisKKwl9IGVsc2UgaWYgKGNtZCA9PSBWRklPX0RFVklDRV9TRVRfSVJRUykgeworCQlzdHJ1Y3QgdmZpb19pcnFfc2V0IGhkcjsKKwkJdTggKmRhdGEgPSBOVUxMOworCQlpbnQgcmV0ID0gMDsKKworCQltaW5zeiA9IG9mZnNldG9mZW5kKHN0cnVjdCB2ZmlvX2lycV9zZXQsIGNvdW50KTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmhkciwgKHZvaWQgX191c2VyICopYXJnLCBtaW5zeikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoaGRyLmFyZ3N6IDwgbWluc3opCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoaGRyLmluZGV4ID49IHZkZXYtPm51bV9pcnFzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGhkci5mbGFncyAmIH4oVkZJT19JUlFfU0VUX0RBVEFfVFlQRV9NQVNLIHwKKwkJCQkgIFZGSU9fSVJRX1NFVF9BQ1RJT05fVFlQRV9NQVNLKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICghKGhkci5mbGFncyAmIFZGSU9fSVJRX1NFVF9EQVRBX05PTkUpKSB7CisJCQlzaXplX3Qgc2l6ZTsKKworCQkJaWYgKGhkci5mbGFncyAmIFZGSU9fSVJRX1NFVF9EQVRBX0JPT0wpCisJCQkJc2l6ZSA9IHNpemVvZih1aW50OF90KTsKKwkJCWVsc2UgaWYgKGhkci5mbGFncyAmIFZGSU9fSVJRX1NFVF9EQVRBX0VWRU5URkQpCisJCQkJc2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKGhkci5hcmdzeiAtIG1pbnN6IDwgc2l6ZSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJZGF0YSA9IG1lbWR1cF91c2VyKCh2b2lkIF9fdXNlciAqKShhcmcgKyBtaW5zeiksIHNpemUpOworCQkJaWYgKElTX0VSUihkYXRhKSkKKwkJCQlyZXR1cm4gUFRSX0VSUihkYXRhKTsKKwkJfQorCisJCW11dGV4X2xvY2soJnZkZXYtPmlnYXRlKTsKKworCQlyZXQgPSB2ZmlvX3BsYXRmb3JtX3NldF9pcnFzX2lvY3RsKHZkZXYsIGhkci5mbGFncywgaGRyLmluZGV4LAorCQkJCQkJICAgaGRyLnN0YXJ0LCBoZHIuY291bnQsIGRhdGEpOworCQltdXRleF91bmxvY2soJnZkZXYtPmlnYXRlKTsKKwkJa2ZyZWUoZGF0YSk7CisKKwkJcmV0dXJuIHJldDsKKworCX0gZWxzZSBpZiAoY21kID09IFZGSU9fREVWSUNFX1JFU0VUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAtRU5PVFRZOworfQorCitzdGF0aWMgc3NpemVfdCB2ZmlvX3BsYXRmb3JtX3JlYWRfbW1pbyhzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9yZWdpb24gcmVnLAorCQkJCSAgICAgICBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkJICAgICAgIGxvZmZfdCBvZmYpCit7CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCisJaWYgKCFyZWcuaW9hZGRyKSB7CisJCXJlZy5pb2FkZHIgPQorCQkJaW9yZW1hcF9ub2NhY2hlKHJlZy5hZGRyLCByZWcuc2l6ZSk7CisKKwkJaWYgKCFyZWcuaW9hZGRyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJd2hpbGUgKGNvdW50KSB7CisJCXNpemVfdCBmaWxsZWQ7CisKKwkJaWYgKGNvdW50ID49IDQgJiYgIShvZmYgJSA0KSkgeworCQkJdTMyIHZhbDsKKworCQkJdmFsID0gaW9yZWFkMzIocmVnLmlvYWRkciArIG9mZik7CisJCQlpZiAoY29weV90b191c2VyKGJ1ZiwgJnZhbCwgNCkpCisJCQkJZ290byBlcnI7CisKKwkJCWZpbGxlZCA9IDQ7CisJCX0gZWxzZSBpZiAoY291bnQgPj0gMiAmJiAhKG9mZiAlIDIpKSB7CisJCQl1MTYgdmFsOworCisJCQl2YWwgPSBpb3JlYWQxNihyZWcuaW9hZGRyICsgb2ZmKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmdmFsLCAyKSkKKwkJCQlnb3RvIGVycjsKKworCQkJZmlsbGVkID0gMjsKKwkJfSBlbHNlIHsKKwkJCXU4IHZhbDsKKworCQkJdmFsID0gaW9yZWFkOChyZWcuaW9hZGRyICsgb2ZmKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCAmdmFsLCAxKSkKKwkJCQlnb3RvIGVycjsKKworCQkJZmlsbGVkID0gMTsKKwkJfQorCisKKwkJY291bnQgLT0gZmlsbGVkOworCQlkb25lICs9IGZpbGxlZDsKKwkJb2ZmICs9IGZpbGxlZDsKKwkJYnVmICs9IGZpbGxlZDsKKwl9CisKKwlyZXR1cm4gZG9uZTsKK2VycjoKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworc3RhdGljIHNzaXplX3QgdmZpb19wbGF0Zm9ybV9yZWFkKHZvaWQgKmRldmljZV9kYXRhLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2ID0gZGV2aWNlX2RhdGE7CisJdW5zaWduZWQgaW50IGluZGV4ID0gVkZJT19QTEFURk9STV9PRkZTRVRfVE9fSU5ERVgoKnBwb3MpOworCWxvZmZfdCBvZmYgPSAqcHBvcyAmIFZGSU9fUExBVEZPUk1fT0ZGU0VUX01BU0s7CisKKwlpZiAoaW5kZXggPj0gdmRldi0+bnVtX3JlZ2lvbnMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEodmRldi0+cmVnaW9uc1tpbmRleF0uZmxhZ3MgJiBWRklPX1JFR0lPTl9JTkZPX0ZMQUdfUkVBRCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHZkZXYtPnJlZ2lvbnNbaW5kZXhdLnR5cGUgJiBWRklPX1BMQVRGT1JNX1JFR0lPTl9UWVBFX01NSU8pCisJCXJldHVybiB2ZmlvX3BsYXRmb3JtX3JlYWRfbW1pbyh2ZGV2LT5yZWdpb25zW2luZGV4XSwKKwkJCQkJCQlidWYsIGNvdW50LCBvZmYpOworCWVsc2UgaWYgKHZkZXYtPnJlZ2lvbnNbaW5kZXhdLnR5cGUgJiBWRklPX1BMQVRGT1JNX1JFR0lPTl9UWVBFX1BJTykKKwkJcmV0dXJuIC1FSU5WQUw7IC8qIG5vdCBpbXBsZW1lbnRlZCAqLworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZmaW9fcGxhdGZvcm1fd3JpdGVfbW1pbyhzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9yZWdpb24gcmVnLAorCQkJCQljb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkJCWxvZmZfdCBvZmYpCit7CisJdW5zaWduZWQgaW50IGRvbmUgPSAwOworCisJaWYgKCFyZWcuaW9hZGRyKSB7CisJCXJlZy5pb2FkZHIgPQorCQkJaW9yZW1hcF9ub2NhY2hlKHJlZy5hZGRyLCByZWcuc2l6ZSk7CisKKwkJaWYgKCFyZWcuaW9hZGRyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJd2hpbGUgKGNvdW50KSB7CisJCXNpemVfdCBmaWxsZWQ7CisKKwkJaWYgKGNvdW50ID49IDQgJiYgIShvZmYgJSA0KSkgeworCQkJdTMyIHZhbDsKKworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ2YWwsIGJ1ZiwgNCkpCisJCQkJZ290byBlcnI7CisJCQlpb3dyaXRlMzIodmFsLCByZWcuaW9hZGRyICsgb2ZmKTsKKworCQkJZmlsbGVkID0gNDsKKwkJfSBlbHNlIGlmIChjb3VudCA+PSAyICYmICEob2ZmICUgMikpIHsKKwkJCXUxNiB2YWw7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBidWYsIDIpKQorCQkJCWdvdG8gZXJyOworCQkJaW93cml0ZTE2KHZhbCwgcmVnLmlvYWRkciArIG9mZik7CisKKwkJCWZpbGxlZCA9IDI7CisJCX0gZWxzZSB7CisJCQl1OCB2YWw7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBidWYsIDEpKQorCQkJCWdvdG8gZXJyOworCQkJaW93cml0ZTgodmFsLCByZWcuaW9hZGRyICsgb2ZmKTsKKworCQkJZmlsbGVkID0gMTsKKwkJfQorCisJCWNvdW50IC09IGZpbGxlZDsKKwkJZG9uZSArPSBmaWxsZWQ7CisJCW9mZiArPSBmaWxsZWQ7CisJCWJ1ZiArPSBmaWxsZWQ7CisJfQorCisJcmV0dXJuIGRvbmU7CitlcnI6CisJcmV0dXJuIC1FRkFVTFQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZmaW9fcGxhdGZvcm1fd3JpdGUodm9pZCAqZGV2aWNlX2RhdGEsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2ID0gZGV2aWNlX2RhdGE7CisJdW5zaWduZWQgaW50IGluZGV4ID0gVkZJT19QTEFURk9STV9PRkZTRVRfVE9fSU5ERVgoKnBwb3MpOworCWxvZmZfdCBvZmYgPSAqcHBvcyAmIFZGSU9fUExBVEZPUk1fT0ZGU0VUX01BU0s7CisKKwlpZiAoaW5kZXggPj0gdmRldi0+bnVtX3JlZ2lvbnMpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEodmRldi0+cmVnaW9uc1tpbmRleF0uZmxhZ3MgJiBWRklPX1JFR0lPTl9JTkZPX0ZMQUdfV1JJVEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2ZGV2LT5yZWdpb25zW2luZGV4XS50eXBlICYgVkZJT19QTEFURk9STV9SRUdJT05fVFlQRV9NTUlPKQorCQlyZXR1cm4gdmZpb19wbGF0Zm9ybV93cml0ZV9tbWlvKHZkZXYtPnJlZ2lvbnNbaW5kZXhdLAorCQkJCQkJCWJ1ZiwgY291bnQsIG9mZik7CisJZWxzZSBpZiAodmRldi0+cmVnaW9uc1tpbmRleF0udHlwZSAmIFZGSU9fUExBVEZPUk1fUkVHSU9OX1RZUEVfUElPKQorCQlyZXR1cm4gLUVJTlZBTDsgLyogbm90IGltcGxlbWVudGVkICovCisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2ZmlvX3BsYXRmb3JtX21tYXBfbW1pbyhzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9yZWdpb24gcmVnaW9uLAorCQkJCSAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXU2NCByZXFfbGVuLCBwZ29mZiwgcmVxX3N0YXJ0OworCisJcmVxX2xlbiA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlwZ29mZiA9IHZtYS0+dm1fcGdvZmYgJgorCQkoKDFVIDw8IChWRklPX1BMQVRGT1JNX09GRlNFVF9TSElGVCAtIFBBR0VfU0hJRlQpKSAtIDEpOworCXJlcV9zdGFydCA9IHBnb2ZmIDw8IFBBR0VfU0hJRlQ7CisKKwlpZiAocmVnaW9uLnNpemUgPCBQQUdFX1NJWkUgfHwgcmVxX3N0YXJ0ICsgcmVxX2xlbiA+IHJlZ2lvbi5zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZtYS0+dm1fcGFnZV9wcm90ID0gcGdwcm90X25vbmNhY2hlZCh2bWEtPnZtX3BhZ2VfcHJvdCk7CisJdm1hLT52bV9wZ29mZiA9IChyZWdpb24uYWRkciA+PiBQQUdFX1NISUZUKSArIHBnb2ZmOworCisJcmV0dXJuIHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYsCisJCQkgICAgICAgcmVxX2xlbiwgdm1hLT52bV9wYWdlX3Byb3QpOworfQorCitzdGF0aWMgaW50IHZmaW9fcGxhdGZvcm1fbW1hcCh2b2lkICpkZXZpY2VfZGF0YSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2ID0gZGV2aWNlX2RhdGE7CisJdW5zaWduZWQgaW50IGluZGV4OworCisJaW5kZXggPSB2bWEtPnZtX3Bnb2ZmID4+IChWRklPX1BMQVRGT1JNX09GRlNFVF9TSElGVCAtIFBBR0VfU0hJRlQpOworCisJaWYgKHZtYS0+dm1fZW5kIDwgdm1hLT52bV9zdGFydCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpbmRleCA+PSB2ZGV2LT5udW1fcmVnaW9ucykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZtYS0+dm1fc3RhcnQgJiB+UEFHRV9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodm1hLT52bV9lbmQgJiB+UEFHRV9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKHZkZXYtPnJlZ2lvbnNbaW5kZXhdLmZsYWdzICYgVkZJT19SRUdJT05fSU5GT19GTEFHX01NQVApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKHZkZXYtPnJlZ2lvbnNbaW5kZXhdLmZsYWdzICYgVkZJT19SRUdJT05fSU5GT19GTEFHX1JFQUQpCisJCQkmJiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKHZkZXYtPnJlZ2lvbnNbaW5kZXhdLmZsYWdzICYgVkZJT19SRUdJT05fSU5GT19GTEFHX1dSSVRFKQorCQkJJiYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSB2ZGV2OworCisJaWYgKHZkZXYtPnJlZ2lvbnNbaW5kZXhdLnR5cGUgJiBWRklPX1BMQVRGT1JNX1JFR0lPTl9UWVBFX01NSU8pCisJCXJldHVybiB2ZmlvX3BsYXRmb3JtX21tYXBfbW1pbyh2ZGV2LT5yZWdpb25zW2luZGV4XSwgdm1hKTsKKworCWVsc2UgaWYgKHZkZXYtPnJlZ2lvbnNbaW5kZXhdLnR5cGUgJiBWRklPX1BMQVRGT1JNX1JFR0lPTl9UWVBFX1BJTykKKwkJcmV0dXJuIC1FSU5WQUw7IC8qIG5vdCBpbXBsZW1lbnRlZCAqLworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmZpb19kZXZpY2Vfb3BzIHZmaW9fcGxhdGZvcm1fb3BzID0geworCS5uYW1lCQk9ICJ2ZmlvLXBsYXRmb3JtIiwKKwkub3BlbgkJPSB2ZmlvX3BsYXRmb3JtX29wZW4sCisJLnJlbGVhc2UJPSB2ZmlvX3BsYXRmb3JtX3JlbGVhc2UsCisJLmlvY3RsCQk9IHZmaW9fcGxhdGZvcm1faW9jdGwsCisJLnJlYWQJCT0gdmZpb19wbGF0Zm9ybV9yZWFkLAorCS53cml0ZQkJPSB2ZmlvX3BsYXRmb3JtX3dyaXRlLAorCS5tbWFwCQk9IHZmaW9fcGxhdGZvcm1fbW1hcCwKK307CisKK2ludCB2ZmlvX3BsYXRmb3JtX3Byb2JlX2NvbW1vbihzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYsCisJCQkgICAgICAgc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpb21tdV9ncm91cCAqZ3JvdXA7CisJaW50IHJldDsKKworCWlmICghdmRldikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlncm91cCA9IGlvbW11X2dyb3VwX2dldChkZXYpOworCWlmICghZ3JvdXApIHsKKwkJcHJfZXJyKCJWRklPOiBObyBJT01NVSBncm91cCBmb3IgZGV2aWNlICVzXG4iLCB2ZGV2LT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gdmZpb19hZGRfZ3JvdXBfZGV2KGRldiwgJnZmaW9fcGxhdGZvcm1fb3BzLCB2ZGV2KTsKKwlpZiAocmV0KSB7CisJCWlvbW11X2dyb3VwX3B1dChncm91cCk7CisJCXJldHVybiByZXQ7CisJfQorCisJbXV0ZXhfaW5pdCgmdmRldi0+aWdhdGUpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2ZmlvX3BsYXRmb3JtX3Byb2JlX2NvbW1vbik7CisKK3N0cnVjdCB2ZmlvX3BsYXRmb3JtX2RldmljZSAqdmZpb19wbGF0Zm9ybV9yZW1vdmVfY29tbW9uKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXY7CisKKwl2ZGV2ID0gdmZpb19kZWxfZ3JvdXBfZGV2KGRldik7CisJaWYgKHZkZXYpCisJCWlvbW11X2dyb3VwX3B1dChkZXYtPmlvbW11X2dyb3VwKTsKKworCXJldHVybiB2ZGV2OworfQorRVhQT1JUX1NZTUJPTF9HUEwodmZpb19wbGF0Zm9ybV9yZW1vdmVfY29tbW9uKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmZpby9wbGF0Zm9ybS92ZmlvX3BsYXRmb3JtX2lycS5jIGIvZHJpdmVycy92ZmlvL3BsYXRmb3JtL3ZmaW9fcGxhdGZvcm1faXJxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiYmE1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmZpby9wbGF0Zm9ybS92ZmlvX3BsYXRmb3JtX2lycS5jCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogVkZJTyBwbGF0Zm9ybSBkZXZpY2VzIGludGVycnVwdCBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyAtIFZpcnR1YWwgT3BlbiBTeXN0ZW1zCisgKiBBdXRob3I6IEFudG9uaW9zIE1vdGFraXMgPGEubW90YWtpc0B2aXJ0dWFsb3BlbnN5c3RlbXMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9ldmVudGZkLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdmZpby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorCisjaW5jbHVkZSAidmZpb19wbGF0Zm9ybV9wcml2YXRlLmgiCisKK3N0YXRpYyB2b2lkIHZmaW9fcGxhdGZvcm1fbWFzayhzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9pcnEgKmlycV9jdHgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfY3R4LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWlycV9jdHgtPm1hc2tlZCkgeworCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxX2N0eC0+aHdpcnEpOworCQlpcnFfY3R4LT5tYXNrZWQgPSB0cnVlOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jdHgtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB2ZmlvX3BsYXRmb3JtX21hc2tfaGFuZGxlcih2b2lkICpvcGFxdWUsIHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9pcnEgKmlycV9jdHggPSBvcGFxdWU7CisKKwl2ZmlvX3BsYXRmb3JtX21hc2soaXJxX2N0eCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZmlvX3BsYXRmb3JtX3NldF9pcnFfbWFzayhzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYsCisJCQkJICAgICAgdW5zaWduZWQgaW5kZXgsIHVuc2lnbmVkIHN0YXJ0LAorCQkJCSAgICAgIHVuc2lnbmVkIGNvdW50LCB1aW50MzJfdCBmbGFncywKKwkJCQkgICAgICB2b2lkICpkYXRhKQoreworCWlmIChzdGFydCAhPSAwIHx8IGNvdW50ICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEodmRldi0+aXJxc1tpbmRleF0uZmxhZ3MgJiBWRklPX0lSUV9JTkZPX01BU0tBQkxFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZmxhZ3MgJiBWRklPX0lSUV9TRVRfREFUQV9FVkVOVEZEKSB7CisJCWludDMyX3QgZmQgPSAqKGludDMyX3QgKilkYXRhOworCisJCWlmIChmZCA+PSAwKQorCQkJcmV0dXJuIHZmaW9fdmlycWZkX2VuYWJsZSgodm9pZCAqKSAmdmRldi0+aXJxc1tpbmRleF0sCisJCQkJCQkgIHZmaW9fcGxhdGZvcm1fbWFza19oYW5kbGVyLAorCQkJCQkJICBOVUxMLCBOVUxMLAorCQkJCQkJICAmdmRldi0+aXJxc1tpbmRleF0ubWFzaywgZmQpOworCisJCXZmaW9fdmlycWZkX2Rpc2FibGUoJnZkZXYtPmlycXNbaW5kZXhdLm1hc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZmxhZ3MgJiBWRklPX0lSUV9TRVRfREFUQV9OT05FKSB7CisJCXZmaW9fcGxhdGZvcm1fbWFzaygmdmRldi0+aXJxc1tpbmRleF0pOworCisJfSBlbHNlIGlmIChmbGFncyAmIFZGSU9fSVJRX1NFVF9EQVRBX0JPT0wpIHsKKwkJdWludDhfdCBtYXNrID0gKih1aW50OF90ICopZGF0YTsKKworCQlpZiAobWFzaykKKwkJCXZmaW9fcGxhdGZvcm1fbWFzaygmdmRldi0+aXJxc1tpbmRleF0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2ZmlvX3BsYXRmb3JtX3VubWFzayhzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9pcnEgKmlycV9jdHgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfY3R4LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaXJxX2N0eC0+bWFza2VkKSB7CisJCWVuYWJsZV9pcnEoaXJxX2N0eC0+aHdpcnEpOworCQlpcnFfY3R4LT5tYXNrZWQgPSBmYWxzZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfY3R4LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdmZpb19wbGF0Zm9ybV91bm1hc2tfaGFuZGxlcih2b2lkICpvcGFxdWUsIHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9pcnEgKmlycV9jdHggPSBvcGFxdWU7CisKKwl2ZmlvX3BsYXRmb3JtX3VubWFzayhpcnFfY3R4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZmaW9fcGxhdGZvcm1fc2V0X2lycV91bm1hc2soc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2LAorCQkJCQl1bnNpZ25lZCBpbmRleCwgdW5zaWduZWQgc3RhcnQsCisJCQkJCXVuc2lnbmVkIGNvdW50LCB1aW50MzJfdCBmbGFncywKKwkJCQkJdm9pZCAqZGF0YSkKK3sKKwlpZiAoc3RhcnQgIT0gMCB8fCBjb3VudCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKHZkZXYtPmlycXNbaW5kZXhdLmZsYWdzICYgVkZJT19JUlFfSU5GT19NQVNLQUJMRSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZsYWdzICYgVkZJT19JUlFfU0VUX0RBVEFfRVZFTlRGRCkgeworCQlpbnQzMl90IGZkID0gKihpbnQzMl90ICopZGF0YTsKKworCQlpZiAoZmQgPj0gMCkKKwkJCXJldHVybiB2ZmlvX3ZpcnFmZF9lbmFibGUoKHZvaWQgKikgJnZkZXYtPmlycXNbaW5kZXhdLAorCQkJCQkJICB2ZmlvX3BsYXRmb3JtX3VubWFza19oYW5kbGVyLAorCQkJCQkJICBOVUxMLCBOVUxMLAorCQkJCQkJICAmdmRldi0+aXJxc1tpbmRleF0udW5tYXNrLAorCQkJCQkJICBmZCk7CisKKwkJdmZpb192aXJxZmRfZGlzYWJsZSgmdmRldi0+aXJxc1tpbmRleF0udW5tYXNrKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGZsYWdzICYgVkZJT19JUlFfU0VUX0RBVEFfTk9ORSkgeworCQl2ZmlvX3BsYXRmb3JtX3VubWFzaygmdmRldi0+aXJxc1tpbmRleF0pOworCisJfSBlbHNlIGlmIChmbGFncyAmIFZGSU9fSVJRX1NFVF9EQVRBX0JPT0wpIHsKKwkJdWludDhfdCB1bm1hc2sgPSAqKHVpbnQ4X3QgKilkYXRhOworCisJCWlmICh1bm1hc2spCisJCQl2ZmlvX3BsYXRmb3JtX3VubWFzaygmdmRldi0+aXJxc1tpbmRleF0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdmZpb19hdXRvbWFza2VkX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9pcnEgKmlycV9jdHggPSBkZXZfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gSVJRX05PTkU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXJxX2N0eC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFpcnFfY3R4LT5tYXNrZWQpIHsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwkJLyogYXV0b21hc2sgbWFza2FibGUgaW50ZXJydXB0cyAqLworCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxX2N0eC0+aHdpcnEpOworCQlpcnFfY3R4LT5tYXNrZWQgPSB0cnVlOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlycV9jdHgtPmxvY2ssIGZsYWdzKTsKKworCWlmIChyZXQgPT0gSVJRX0hBTkRMRUQpCisJCWV2ZW50ZmRfc2lnbmFsKGlycV9jdHgtPnRyaWdnZXIsIDEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZmaW9faXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCB2ZmlvX3BsYXRmb3JtX2lycSAqaXJxX2N0eCA9IGRldl9pZDsKKworCWV2ZW50ZmRfc2lnbmFsKGlycV9jdHgtPnRyaWdnZXIsIDEpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHZmaW9fc2V0X3RyaWdnZXIoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2LCBpbnQgaW5kZXgsCisJCQkgICAgaW50IGZkLCBpcnFfaGFuZGxlcl90IGhhbmRsZXIpCit7CisJc3RydWN0IHZmaW9fcGxhdGZvcm1faXJxICppcnEgPSAmdmRldi0+aXJxc1tpbmRleF07CisJc3RydWN0IGV2ZW50ZmRfY3R4ICp0cmlnZ2VyOworCWludCByZXQ7CisKKwlpZiAoaXJxLT50cmlnZ2VyKSB7CisJCWZyZWVfaXJxKGlycS0+aHdpcnEsIGlycSk7CisJCWtmcmVlKGlycS0+bmFtZSk7CisJCWV2ZW50ZmRfY3R4X3B1dChpcnEtPnRyaWdnZXIpOworCQlpcnEtPnRyaWdnZXIgPSBOVUxMOworCX0KKworCWlmIChmZCA8IDApIC8qIERpc2FibGUgb25seSAqLworCQlyZXR1cm4gMDsKKworCWlycS0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAidmZpby1pcnFbJWRdKCVzKSIsCisJCQkJCQlpcnEtPmh3aXJxLCB2ZGV2LT5uYW1lKTsKKwlpZiAoIWlycS0+bmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cmlnZ2VyID0gZXZlbnRmZF9jdHhfZmRnZXQoZmQpOworCWlmIChJU19FUlIodHJpZ2dlcikpIHsKKwkJa2ZyZWUoaXJxLT5uYW1lKTsKKwkJcmV0dXJuIFBUUl9FUlIodHJpZ2dlcik7CisJfQorCisJaXJxLT50cmlnZ2VyID0gdHJpZ2dlcjsKKworCWlycV9zZXRfc3RhdHVzX2ZsYWdzKGlycS0+aHdpcnEsIElSUV9OT0FVVE9FTik7CisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLT5od2lycSwgaGFuZGxlciwgMCwgaXJxLT5uYW1lLCBpcnEpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoaXJxLT5uYW1lKTsKKwkJZXZlbnRmZF9jdHhfcHV0KHRyaWdnZXIpOworCQlpcnEtPnRyaWdnZXIgPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghaXJxLT5tYXNrZWQpCisJCWVuYWJsZV9pcnEoaXJxLT5od2lycSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2ZmlvX3BsYXRmb3JtX3NldF9pcnFfdHJpZ2dlcihzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYsCisJCQkJCSB1bnNpZ25lZCBpbmRleCwgdW5zaWduZWQgc3RhcnQsCisJCQkJCSB1bnNpZ25lZCBjb3VudCwgdWludDMyX3QgZmxhZ3MsCisJCQkJCSB2b2lkICpkYXRhKQoreworCXN0cnVjdCB2ZmlvX3BsYXRmb3JtX2lycSAqaXJxID0gJnZkZXYtPmlycXNbaW5kZXhdOworCWlycV9oYW5kbGVyX3QgaGFuZGxlcjsKKworCWlmICh2ZGV2LT5pcnFzW2luZGV4XS5mbGFncyAmIFZGSU9fSVJRX0lORk9fQVVUT01BU0tFRCkKKwkJaGFuZGxlciA9IHZmaW9fYXV0b21hc2tlZF9pcnFfaGFuZGxlcjsKKwllbHNlCisJCWhhbmRsZXIgPSB2ZmlvX2lycV9oYW5kbGVyOworCisJaWYgKCFjb3VudCAmJiAoZmxhZ3MgJiBWRklPX0lSUV9TRVRfREFUQV9OT05FKSkKKwkJcmV0dXJuIHZmaW9fc2V0X3RyaWdnZXIodmRldiwgaW5kZXgsIC0xLCBoYW5kbGVyKTsKKworCWlmIChzdGFydCAhPSAwIHx8IGNvdW50ICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZsYWdzICYgVkZJT19JUlFfU0VUX0RBVEFfRVZFTlRGRCkgeworCQlpbnQzMl90IGZkID0gKihpbnQzMl90ICopZGF0YTsKKworCQlyZXR1cm4gdmZpb19zZXRfdHJpZ2dlcih2ZGV2LCBpbmRleCwgZmQsIGhhbmRsZXIpOworCX0KKworCWlmIChmbGFncyAmIFZGSU9fSVJRX1NFVF9EQVRBX05PTkUpIHsKKwkJaGFuZGxlcihpcnEtPmh3aXJxLCBpcnEpOworCisJfSBlbHNlIGlmIChmbGFncyAmIFZGSU9fSVJRX1NFVF9EQVRBX0JPT0wpIHsKKwkJdWludDhfdCB0cmlnZ2VyID0gKih1aW50OF90ICopZGF0YTsKKworCQlpZiAodHJpZ2dlcikKKwkJCWhhbmRsZXIoaXJxLT5od2lycSwgaXJxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IHZmaW9fcGxhdGZvcm1fc2V0X2lycXNfaW9jdGwoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2LAorCQkJCSB1aW50MzJfdCBmbGFncywgdW5zaWduZWQgaW5kZXgsIHVuc2lnbmVkIHN0YXJ0LAorCQkJCSB1bnNpZ25lZCBjb3VudCwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgKCpmdW5jKShzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYsIHVuc2lnbmVkIGluZGV4LAorCQkgICAgdW5zaWduZWQgc3RhcnQsIHVuc2lnbmVkIGNvdW50LCB1aW50MzJfdCBmbGFncywKKwkJICAgIHZvaWQgKmRhdGEpID0gTlVMTDsKKworCXN3aXRjaCAoZmxhZ3MgJiBWRklPX0lSUV9TRVRfQUNUSU9OX1RZUEVfTUFTSykgeworCWNhc2UgVkZJT19JUlFfU0VUX0FDVElPTl9NQVNLOgorCQlmdW5jID0gdmZpb19wbGF0Zm9ybV9zZXRfaXJxX21hc2s7CisJCWJyZWFrOworCWNhc2UgVkZJT19JUlFfU0VUX0FDVElPTl9VTk1BU0s6CisJCWZ1bmMgPSB2ZmlvX3BsYXRmb3JtX3NldF9pcnFfdW5tYXNrOworCQlicmVhazsKKwljYXNlIFZGSU9fSVJRX1NFVF9BQ1RJT05fVFJJR0dFUjoKKwkJZnVuYyA9IHZmaW9fcGxhdGZvcm1fc2V0X2lycV90cmlnZ2VyOworCQlicmVhazsKKwl9CisKKwlpZiAoIWZ1bmMpCisJCXJldHVybiAtRU5PVFRZOworCisJcmV0dXJuIGZ1bmModmRldiwgaW5kZXgsIHN0YXJ0LCBjb3VudCwgZmxhZ3MsIGRhdGEpOworfQorCitpbnQgdmZpb19wbGF0Zm9ybV9pcnFfaW5pdChzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYpCit7CisJaW50IGNudCA9IDAsIGk7CisKKwl3aGlsZSAodmRldi0+Z2V0X2lycSh2ZGV2LCBjbnQpID49IDApCisJCWNudCsrOworCisJdmRldi0+aXJxcyA9IGtjYWxsb2MoY250LCBzaXplb2Yoc3RydWN0IHZmaW9fcGxhdGZvcm1faXJxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2ZGV2LT5pcnFzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQlpbnQgaHdpcnEgPSB2ZGV2LT5nZXRfaXJxKHZkZXYsIGkpOworCisJCWlmIChod2lycSA8IDApCisJCQlnb3RvIGVycjsKKworCQlzcGluX2xvY2tfaW5pdCgmdmRldi0+aXJxc1tpXS5sb2NrKTsKKworCQl2ZGV2LT5pcnFzW2ldLmZsYWdzID0gVkZJT19JUlFfSU5GT19FVkVOVEZEOworCisJCWlmIChpcnFfZ2V0X3RyaWdnZXJfdHlwZShod2lycSkgJiBJUlFfVFlQRV9MRVZFTF9NQVNLKQorCQkJdmRldi0+aXJxc1tpXS5mbGFncyB8PSBWRklPX0lSUV9JTkZPX01BU0tBQkxFCisJCQkJCQl8IFZGSU9fSVJRX0lORk9fQVVUT01BU0tFRDsKKworCQl2ZGV2LT5pcnFzW2ldLmNvdW50ID0gMTsKKwkJdmRldi0+aXJxc1tpXS5od2lycSA9IGh3aXJxOworCQl2ZGV2LT5pcnFzW2ldLm1hc2tlZCA9IGZhbHNlOworCX0KKworCXZkZXYtPm51bV9pcnFzID0gY250OworCisJcmV0dXJuIDA7CitlcnI6CisJa2ZyZWUodmRldi0+aXJxcyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3ZvaWQgdmZpb19wbGF0Zm9ybV9pcnFfY2xlYW51cChzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmRldi0+bnVtX2lycXM7IGkrKykKKwkJdmZpb19zZXRfdHJpZ2dlcih2ZGV2LCBpLCAtMSwgTlVMTCk7CisKKwl2ZGV2LT5udW1faXJxcyA9IDA7CisJa2ZyZWUodmRldi0+aXJxcyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vdmZpb19wbGF0Zm9ybV9wcml2YXRlLmggYi9kcml2ZXJzL3ZmaW8vcGxhdGZvcm0vdmZpb19wbGF0Zm9ybV9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzMWUwNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdmZpby9wbGF0Zm9ybS92ZmlvX3BsYXRmb3JtX3ByaXZhdGUuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIC0gVmlydHVhbCBPcGVuIFN5c3RlbXMKKyAqIEF1dGhvcjogQW50b25pb3MgTW90YWtpcyA8YS5tb3Rha2lzQHZpcnR1YWxvcGVuc3lzdGVtcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMiwgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBWRklPX1BMQVRGT1JNX1BSSVZBVEVfSAorI2RlZmluZSBWRklPX1BMQVRGT1JNX1BSSVZBVEVfSAorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2RlZmluZSBWRklPX1BMQVRGT1JNX09GRlNFVF9TSElGVCAgIDQwCisjZGVmaW5lIFZGSU9fUExBVEZPUk1fT0ZGU0VUX01BU0sgKCgodTY0KSgxKSA8PCBWRklPX1BMQVRGT1JNX09GRlNFVF9TSElGVCkgLSAxKQorCisjZGVmaW5lIFZGSU9fUExBVEZPUk1fT0ZGU0VUX1RPX0lOREVYKG9mZikJXAorCShvZmYgPj4gVkZJT19QTEFURk9STV9PRkZTRVRfU0hJRlQpCisKKyNkZWZpbmUgVkZJT19QTEFURk9STV9JTkRFWF9UT19PRkZTRVQoaW5kZXgpCVwKKwkoKHU2NCkoaW5kZXgpIDw8IFZGSU9fUExBVEZPUk1fT0ZGU0VUX1NISUZUKQorCitzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9pcnEgeworCXUzMgkJCWZsYWdzOworCXUzMgkJCWNvdW50OworCWludAkJCWh3aXJxOworCWNoYXIJCQkqbmFtZTsKKwlzdHJ1Y3QgZXZlbnRmZF9jdHgJKnRyaWdnZXI7CisJYm9vbAkJCW1hc2tlZDsKKwlzcGlubG9ja190CQlsb2NrOworCXN0cnVjdCB2aXJxZmQJCSp1bm1hc2s7CisJc3RydWN0IHZpcnFmZAkJKm1hc2s7Cit9OworCitzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9yZWdpb24geworCXU2NAkJCWFkZHI7CisJcmVzb3VyY2Vfc2l6ZV90CQlzaXplOworCXUzMgkJCWZsYWdzOworCXUzMgkJCXR5cGU7CisjZGVmaW5lIFZGSU9fUExBVEZPUk1fUkVHSU9OX1RZUEVfTU1JTwkxCisjZGVmaW5lIFZGSU9fUExBVEZPUk1fUkVHSU9OX1RZUEVfUElPCTIKKwl2b2lkIF9faW9tZW0JCSppb2FkZHI7Cit9OworCitzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgeworCXN0cnVjdCB2ZmlvX3BsYXRmb3JtX3JlZ2lvbgkqcmVnaW9uczsKKwl1MzIJCQkJbnVtX3JlZ2lvbnM7CisJc3RydWN0IHZmaW9fcGxhdGZvcm1faXJxCSppcnFzOworCXUzMgkJCQludW1faXJxczsKKwlpbnQJCQkJcmVmY250OworCXN0cnVjdCBtdXRleAkJCWlnYXRlOworCisJLyoKKwkgKiBUaGVzZSBmaWVsZHMgc2hvdWxkIGJlIGZpbGxlZCBieSB0aGUgYnVzIHNwZWNpZmljIGJpbmRlcgorCSAqLworCXZvaWQJCSpvcGFxdWU7CisJY29uc3QgY2hhcgkqbmFtZTsKKwl1aW50MzJfdAlmbGFnczsKKwkvKiBjYWxsYmFja3MgdG8gZGlzY292ZXIgZGV2aWNlIHJlc291cmNlcyAqLworCXN0cnVjdCByZXNvdXJjZSoKKwkJKCpnZXRfcmVzb3VyY2UpKHN0cnVjdCB2ZmlvX3BsYXRmb3JtX2RldmljZSAqdmRldiwgaW50IGkpOworCWludAkoKmdldF9pcnEpKHN0cnVjdCB2ZmlvX3BsYXRmb3JtX2RldmljZSAqdmRldiwgaW50IGkpOworfTsKKworZXh0ZXJuIGludCB2ZmlvX3BsYXRmb3JtX3Byb2JlX2NvbW1vbihzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYsCisJCQkJICAgICAgc3RydWN0IGRldmljZSAqZGV2KTsKK2V4dGVybiBzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZmaW9fcGxhdGZvcm1fcmVtb3ZlX2NvbW1vbgorCQkJCSAgICAgKHN0cnVjdCBkZXZpY2UgKmRldik7CisKK2V4dGVybiBpbnQgdmZpb19wbGF0Zm9ybV9pcnFfaW5pdChzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYpOworZXh0ZXJuIHZvaWQgdmZpb19wbGF0Zm9ybV9pcnFfY2xlYW51cChzdHJ1Y3QgdmZpb19wbGF0Zm9ybV9kZXZpY2UgKnZkZXYpOworCitleHRlcm4gaW50IHZmaW9fcGxhdGZvcm1fc2V0X2lycXNfaW9jdGwoc3RydWN0IHZmaW9fcGxhdGZvcm1fZGV2aWNlICp2ZGV2LAorCQkJCQl1aW50MzJfdCBmbGFncywgdW5zaWduZWQgaW5kZXgsCisJCQkJCXVuc2lnbmVkIHN0YXJ0LCB1bnNpZ25lZCBjb3VudCwKKwkJCQkJdm9pZCAqZGF0YSk7CisKKyNlbmRpZiAvKiBWRklPX1BMQVRGT1JNX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3ZmaW8uYyBiL2RyaXZlcnMvdmZpby92ZmlvLmMKaW5kZXggNGNkZTg1NS4uMGQzMzY2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy92ZmlvL3ZmaW8uYworKysgYi9kcml2ZXJzL3ZmaW8vdmZpby5jCkBAIC0yMzQsMjIgKzIzNCwyMSBAQAogCiAJbXV0ZXhfbG9jaygmdmZpby5ncm91cF9sb2NrKTsKIAotCW1pbm9yID0gdmZpb19hbGxvY19ncm91cF9taW5vcihncm91cCk7Ci0JaWYgKG1pbm9yIDwgMCkgewotCQl2ZmlvX2dyb3VwX3VubG9ja19hbmRfZnJlZShncm91cCk7Ci0JCXJldHVybiBFUlJfUFRSKG1pbm9yKTsKLQl9Ci0KIAkvKiBEaWQgd2UgcmFjZSBjcmVhdGluZyB0aGlzIGdyb3VwPyAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmdmZpby5ncm91cF9saXN0LCB2ZmlvX25leHQpIHsKIAkJaWYgKHRtcC0+aW9tbXVfZ3JvdXAgPT0gaW9tbXVfZ3JvdXApIHsKIAkJCXZmaW9fZ3JvdXBfZ2V0KHRtcCk7Ci0JCQl2ZmlvX2ZyZWVfZ3JvdXBfbWlub3IobWlub3IpOwogCQkJdmZpb19ncm91cF91bmxvY2tfYW5kX2ZyZWUoZ3JvdXApOwogCQkJcmV0dXJuIHRtcDsKIAkJfQogCX0KIAorCW1pbm9yID0gdmZpb19hbGxvY19ncm91cF9taW5vcihncm91cCk7CisJaWYgKG1pbm9yIDwgMCkgeworCQl2ZmlvX2dyb3VwX3VubG9ja19hbmRfZnJlZShncm91cCk7CisJCXJldHVybiBFUlJfUFRSKG1pbm9yKTsKKwl9CisKIAlkZXYgPSBkZXZpY2VfY3JlYXRlKHZmaW8uY2xhc3MsIE5VTEwsCiAJCQkgICAgTUtERVYoTUFKT1IodmZpby5ncm91cF9kZXZ0KSwgbWlub3IpLAogCQkJICAgIGdyb3VwLCAiJWQiLCBpb21tdV9ncm91cF9pZChpb21tdV9ncm91cCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92ZmlvL3ZpcnFmZC5jIGIvZHJpdmVycy92ZmlvL3ZpcnFmZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Yzg5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZmaW8vdmlycWZkLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBWRklPIGdlbmVyaWMgZXZlbnRmZCBjb2RlIGZvciBJUlFGRCBzdXBwb3J0LgorICogRGVyaXZlZCBmcm9tIGRyaXZlcnMvdmZpby9wY2kvdmZpb19wY2lfaW50cnMuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogICAgIEF1dGhvcjogQWxleCBXaWxsaWFtc29uIDxhbGV4LndpbGxpYW1zb25AcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC92ZmlvLmg+CisjaW5jbHVkZSA8bGludXgvZXZlbnRmZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gICIwLjEiCisjZGVmaW5lIERSSVZFUl9BVVRIT1IgICAiQWxleCBXaWxsaWFtc29uIDxhbGV4LndpbGxpYW1zb25AcmVkaGF0LmNvbT4iCisjZGVmaW5lIERSSVZFUl9ERVNDICAgICAiSVJRRkQgc3VwcG9ydCBmb3IgVkZJTyBidXMgZHJpdmVycyIKKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp2ZmlvX2lycWZkX2NsZWFudXBfd3E7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHZpcnFmZF9sb2NrKTsKKworc3RhdGljIGludCBfX2luaXQgdmZpb192aXJxZmRfaW5pdCh2b2lkKQoreworCXZmaW9faXJxZmRfY2xlYW51cF93cSA9CisJCWNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJ2ZmlvLWlycWZkLWNsZWFudXAiKTsKKwlpZiAoIXZmaW9faXJxZmRfY2xlYW51cF93cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHZmaW9fdmlycWZkX2V4aXQodm9pZCkKK3sKKwlkZXN0cm95X3dvcmtxdWV1ZSh2ZmlvX2lycWZkX2NsZWFudXBfd3EpOworfQorCitzdGF0aWMgdm9pZCB2aXJxZmRfZGVhY3RpdmF0ZShzdHJ1Y3QgdmlycWZkICp2aXJxZmQpCit7CisJcXVldWVfd29yayh2ZmlvX2lycWZkX2NsZWFudXBfd3EsICZ2aXJxZmQtPnNodXRkb3duKTsKK30KKworc3RhdGljIGludCB2aXJxZmRfd2FrZXVwKHdhaXRfcXVldWVfdCAqd2FpdCwgdW5zaWduZWQgbW9kZSwgaW50IHN5bmMsIHZvaWQgKmtleSkKK3sKKwlzdHJ1Y3QgdmlycWZkICp2aXJxZmQgPSBjb250YWluZXJfb2Yod2FpdCwgc3RydWN0IHZpcnFmZCwgd2FpdCk7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9ICh1bnNpZ25lZCBsb25nKWtleTsKKworCWlmIChmbGFncyAmIFBPTExJTikgeworCQkvKiBBbiBldmVudCBoYXMgYmVlbiBzaWduYWxlZCwgY2FsbCBmdW5jdGlvbiAqLworCQlpZiAoKCF2aXJxZmQtPmhhbmRsZXIgfHwKKwkJICAgICB2aXJxZmQtPmhhbmRsZXIodmlycWZkLT5vcGFxdWUsIHZpcnFmZC0+ZGF0YSkpICYmCisJCSAgICB2aXJxZmQtPnRocmVhZCkKKwkJCXNjaGVkdWxlX3dvcmsoJnZpcnFmZC0+aW5qZWN0KTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBQT0xMSFVQKSB7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ2aXJxZmRfbG9jaywgZmxhZ3MpOworCisJCS8qCisJCSAqIFRoZSBldmVudGZkIGlzIGNsb3NpbmcsIGlmIHRoZSB2aXJxZmQgaGFzIG5vdCB5ZXQgYmVlbgorCQkgKiBxdWV1ZWQgZm9yIHJlbGVhc2UsIGFzIGRldGVybWluZWQgYnkgdGVzdGluZyB3aGV0aGVyIHRoZQorCQkgKiB2aXJxZmQgcG9pbnRlciB0byBpdCBpcyBzdGlsbCB2YWxpZCwgcXVldWUgaXQgbm93LiAgQXMKKwkJICogd2l0aCBrdm0gaXJxZmRzLCB3ZSBrbm93IHdlIHdvbid0IHJhY2UgYWdhaW5zdCB0aGUgdmlycWZkCisJCSAqIGdvaW5nIGF3YXkgYmVjYXVzZSB3ZSBob2xkIHRoZSBsb2NrIHRvIGdldCBoZXJlLgorCQkgKi8KKwkJaWYgKCoodmlycWZkLT5wdmlycWZkKSA9PSB2aXJxZmQpIHsKKwkJCSoodmlycWZkLT5wdmlycWZkKSA9IE5VTEw7CisJCQl2aXJxZmRfZGVhY3RpdmF0ZSh2aXJxZmQpOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmlycWZkX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmlycWZkX3B0YWJsZV9xdWV1ZV9wcm9jKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgKndxaCwgcG9sbF90YWJsZSAqcHQpCit7CisJc3RydWN0IHZpcnFmZCAqdmlycWZkID0gY29udGFpbmVyX29mKHB0LCBzdHJ1Y3QgdmlycWZkLCBwdCk7CisJYWRkX3dhaXRfcXVldWUod3FoLCAmdmlycWZkLT53YWl0KTsKK30KKworc3RhdGljIHZvaWQgdmlycWZkX3NodXRkb3duKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdmlycWZkICp2aXJxZmQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHZpcnFmZCwgc2h1dGRvd24pOworCXU2NCBjbnQ7CisKKwlldmVudGZkX2N0eF9yZW1vdmVfd2FpdF9xdWV1ZSh2aXJxZmQtPmV2ZW50ZmQsICZ2aXJxZmQtPndhaXQsICZjbnQpOworCWZsdXNoX3dvcmsoJnZpcnFmZC0+aW5qZWN0KTsKKwlldmVudGZkX2N0eF9wdXQodmlycWZkLT5ldmVudGZkKTsKKworCWtmcmVlKHZpcnFmZCk7Cit9CisKK3N0YXRpYyB2b2lkIHZpcnFmZF9pbmplY3Qoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCB2aXJxZmQgKnZpcnFmZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgdmlycWZkLCBpbmplY3QpOworCWlmICh2aXJxZmQtPnRocmVhZCkKKwkJdmlycWZkLT50aHJlYWQodmlycWZkLT5vcGFxdWUsIHZpcnFmZC0+ZGF0YSk7Cit9CisKK2ludCB2ZmlvX3ZpcnFmZF9lbmFibGUodm9pZCAqb3BhcXVlLAorCQkgICAgICAgaW50ICgqaGFuZGxlcikodm9pZCAqLCB2b2lkICopLAorCQkgICAgICAgdm9pZCAoKnRocmVhZCkodm9pZCAqLCB2b2lkICopLAorCQkgICAgICAgdm9pZCAqZGF0YSwgc3RydWN0IHZpcnFmZCAqKnB2aXJxZmQsIGludCBmZCkKK3sKKwlzdHJ1Y3QgZmQgaXJxZmQ7CisJc3RydWN0IGV2ZW50ZmRfY3R4ICpjdHg7CisJc3RydWN0IHZpcnFmZCAqdmlycWZkOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGludCBldmVudHM7CisKKwl2aXJxZmQgPSBremFsbG9jKHNpemVvZigqdmlycWZkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2aXJxZmQpCisJCXJldHVybiAtRU5PTUVNOworCisJdmlycWZkLT5wdmlycWZkID0gcHZpcnFmZDsKKwl2aXJxZmQtPm9wYXF1ZSA9IG9wYXF1ZTsKKwl2aXJxZmQtPmhhbmRsZXIgPSBoYW5kbGVyOworCXZpcnFmZC0+dGhyZWFkID0gdGhyZWFkOworCXZpcnFmZC0+ZGF0YSA9IGRhdGE7CisKKwlJTklUX1dPUksoJnZpcnFmZC0+c2h1dGRvd24sIHZpcnFmZF9zaHV0ZG93bik7CisJSU5JVF9XT1JLKCZ2aXJxZmQtPmluamVjdCwgdmlycWZkX2luamVjdCk7CisKKwlpcnFmZCA9IGZkZ2V0KGZkKTsKKwlpZiAoIWlycWZkLmZpbGUpIHsKKwkJcmV0ID0gLUVCQURGOworCQlnb3RvIGVycl9mZDsKKwl9CisKKwljdHggPSBldmVudGZkX2N0eF9maWxlZ2V0KGlycWZkLmZpbGUpOworCWlmIChJU19FUlIoY3R4KSkgeworCQlyZXQgPSBQVFJfRVJSKGN0eCk7CisJCWdvdG8gZXJyX2N0eDsKKwl9CisKKwl2aXJxZmQtPmV2ZW50ZmQgPSBjdHg7CisKKwkvKgorCSAqIHZpcnFmZHMgY2FuIGJlIHJlbGVhc2VkIGJ5IGNsb3NpbmcgdGhlIGV2ZW50ZmQgb3IgZGlyZWN0bHkKKwkgKiB0aHJvdWdoIGlvY3RsLiAgVGhlc2UgYXJlIGJvdGggZG9uZSB0aHJvdWdoIGEgd29ya3F1ZXVlLCBzbworCSAqIHdlIHVwZGF0ZSB0aGUgcG9pbnRlciB0byB0aGUgdmlycWZkIHVuZGVyIGxvY2sgdG8gYXZvaWQKKwkgKiBwdXNoaW5nIG11bHRpcGxlIGpvYnMgdG8gcmVsZWFzZSB0aGUgc2FtZSB2aXJxZmQuCisJICovCisJc3Bpbl9sb2NrX2lycSgmdmlycWZkX2xvY2spOworCisJaWYgKCpwdmlycWZkKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmdmlycWZkX2xvY2spOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX2J1c3k7CisJfQorCSpwdmlycWZkID0gdmlycWZkOworCisJc3Bpbl91bmxvY2tfaXJxKCZ2aXJxZmRfbG9jayk7CisKKwkvKgorCSAqIEluc3RhbGwgb3VyIG93biBjdXN0b20gd2FrZS11cCBoYW5kbGluZyBzbyB3ZSBhcmUgbm90aWZpZWQgdmlhCisJICogYSBjYWxsYmFjayB3aGVuZXZlciBzb21lb25lIHNpZ25hbHMgdGhlIHVuZGVybHlpbmcgZXZlbnRmZC4KKwkgKi8KKwlpbml0X3dhaXRxdWV1ZV9mdW5jX2VudHJ5KCZ2aXJxZmQtPndhaXQsIHZpcnFmZF93YWtldXApOworCWluaXRfcG9sbF9mdW5jcHRyKCZ2aXJxZmQtPnB0LCB2aXJxZmRfcHRhYmxlX3F1ZXVlX3Byb2MpOworCisJZXZlbnRzID0gaXJxZmQuZmlsZS0+Zl9vcC0+cG9sbChpcnFmZC5maWxlLCAmdmlycWZkLT5wdCk7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBldmVudCBhbHJlYWR5IHBlbmRpbmcgb24gdGhlIGV2ZW50ZmQKKwkgKiBiZWZvcmUgd2UgcmVnaXN0ZXJlZCBhbmQgdHJpZ2dlciBpdCBhcyBpZiB3ZSBkaWRuJ3QgbWlzcyBpdC4KKwkgKi8KKwlpZiAoZXZlbnRzICYgUE9MTElOKSB7CisJCWlmICgoIWhhbmRsZXIgfHwgaGFuZGxlcihvcGFxdWUsIGRhdGEpKSAmJiB0aHJlYWQpCisJCQlzY2hlZHVsZV93b3JrKCZ2aXJxZmQtPmluamVjdCk7CisJfQorCisJLyoKKwkgKiBEbyBub3QgZHJvcCB0aGUgZmlsZSB1bnRpbCB0aGUgaXJxZmQgaXMgZnVsbHkgaW5pdGlhbGl6ZWQsCisJICogb3RoZXJ3aXNlIHdlIG1pZ2h0IHJhY2UgYWdhaW5zdCB0aGUgUE9MTEhVUC4KKwkgKi8KKwlmZHB1dChpcnFmZCk7CisKKwlyZXR1cm4gMDsKK2Vycl9idXN5OgorCWV2ZW50ZmRfY3R4X3B1dChjdHgpOworZXJyX2N0eDoKKwlmZHB1dChpcnFmZCk7CitlcnJfZmQ6CisJa2ZyZWUodmlycWZkKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2ZmlvX3ZpcnFmZF9lbmFibGUpOworCit2b2lkIHZmaW9fdmlycWZkX2Rpc2FibGUoc3RydWN0IHZpcnFmZCAqKnB2aXJxZmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aXJxZmRfbG9jaywgZmxhZ3MpOworCisJaWYgKCpwdmlycWZkKSB7CisJCXZpcnFmZF9kZWFjdGl2YXRlKCpwdmlycWZkKTsKKwkJKnB2aXJxZmQgPSBOVUxMOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZpcnFmZF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIEJsb2NrIHVudGlsIHdlIGtub3cgYWxsIG91dHN0YW5kaW5nIHNodXRkb3duIGpvYnMgaGF2ZSBjb21wbGV0ZWQuCisJICogRXZlbiBpZiB3ZSBkb24ndCBxdWV1ZSB0aGUgam9iLCBmbHVzaCB0aGUgd3EgdG8gYmUgc3VyZSBpdCdzCisJICogYmVlbiByZWxlYXNlZC4KKwkgKi8KKwlmbHVzaF93b3JrcXVldWUodmZpb19pcnFmZF9jbGVhbnVwX3dxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZmaW9fdmlycWZkX2Rpc2FibGUpOworCittb2R1bGVfaW5pdCh2ZmlvX3ZpcnFmZF9pbml0KTsKK21vZHVsZV9leGl0KHZmaW9fdmlycWZkX2V4aXQpOworCitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3QvbmV0LmMgYi9kcml2ZXJzL3Zob3N0L25ldC5jCmluZGV4IDJiYmZjMjUuLjdkMTM3YTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmhvc3QvbmV0LmMKKysrIGIvZHJpdmVycy92aG9zdC9uZXQuYwpAQCAtMzU3LDEzICszNTcsMTMgQEAKIAkJaW92X2l0ZXJfaW5pdCgmbXNnLm1zZ19pdGVyLCBXUklURSwgdnEtPmlvdiwgb3V0LCBsZW4pOwogCQlpb3ZfaXRlcl9hZHZhbmNlKCZtc2cubXNnX2l0ZXIsIGhkcl9zaXplKTsKIAkJLyogU2FuaXR5IGNoZWNrICovCi0JCWlmICghaW92X2l0ZXJfY291bnQoJm1zZy5tc2dfaXRlcikpIHsKKwkJaWYgKCFtc2dfZGF0YV9sZWZ0KCZtc2cpKSB7CiAJCQl2cV9lcnIodnEsICJVbmV4cGVjdGVkIGhlYWRlciBsZW4gZm9yIFRYOiAiCiAJCQkgICAgICAgIiV6ZCBleHBlY3RlZCAlemRcbiIsCiAJCQkgICAgICAgbGVuLCBoZHJfc2l6ZSk7CiAJCQlicmVhazsKIAkJfQotCQlsZW4gPSBpb3ZfaXRlcl9jb3VudCgmbXNnLm1zZ19pdGVyKTsKKwkJbGVuID0gbXNnX2RhdGFfbGVmdCgmbXNnKTsKIAogCQl6Y29weV91c2VkID0gemNvcHkgJiYgbGVuID49IFZIT1NUX0dPT0RDT1BZX0xFTgogCQkJCSAgICYmIChudnEtPnVwZW5kX2lkeCArIDEpICUgVUlPX01BWElPViAhPQpAQCAtMzkwLDcgKzM5MCw3IEBACiAJCQl1YnVmcyA9IE5VTEw7CiAJCX0KIAkJLyogVE9ETzogQ2hlY2sgc3BlY2lmaWMgZXJyb3IgYW5kIGJvbWIgb3V0IHVubGVzcyBFTk9CVUZTPyAqLwotCQllcnIgPSBzb2NrLT5vcHMtPnNlbmRtc2coTlVMTCwgc29jaywgJm1zZywgbGVuKTsKKwkJZXJyID0gc29jay0+b3BzLT5zZW5kbXNnKHNvY2ssICZtc2csIGxlbik7CiAJCWlmICh1bmxpa2VseShlcnIgPCAwKSkgewogCQkJaWYgKHpjb3B5X3VzZWQpIHsKIAkJCQl2aG9zdF9uZXRfdWJ1Zl9wdXQodWJ1ZnMpOwpAQCAtNTY2LDcgKzU2Niw3IEBACiAJCS8qIE9uIG92ZXJydW4sIHRydW5jYXRlIGFuZCBkaXNjYXJkICovCiAJCWlmICh1bmxpa2VseShoZWFkY291bnQgPiBVSU9fTUFYSU9WKSkgewogCQkJaW92X2l0ZXJfaW5pdCgmbXNnLm1zZ19pdGVyLCBSRUFELCB2cS0+aW92LCAxLCAxKTsKLQkJCWVyciA9IHNvY2stPm9wcy0+cmVjdm1zZyhOVUxMLCBzb2NrLCAmbXNnLAorCQkJZXJyID0gc29jay0+b3BzLT5yZWN2bXNnKHNvY2ssICZtc2csCiAJCQkJCQkgMSwgTVNHX0RPTlRXQUlUIHwgTVNHX1RSVU5DKTsKIAkJCXByX2RlYnVnKCJEaXNjYXJkZWQgcnggcGFja2V0OiBsZW4gJXpkXG4iLCBzb2NrX2xlbik7CiAJCQljb250aW51ZTsKQEAgLTU5Miw3ICs1OTIsNyBAQAogCQkJICovCiAJCQlpb3ZfaXRlcl9hZHZhbmNlKCZtc2cubXNnX2l0ZXIsIHZob3N0X2hsZW4pOwogCQl9Ci0JCWVyciA9IHNvY2stPm9wcy0+cmVjdm1zZyhOVUxMLCBzb2NrLCAmbXNnLAorCQllcnIgPSBzb2NrLT5vcHMtPnJlY3Ztc2coc29jaywgJm1zZywKIAkJCQkJIHNvY2tfbGVuLCBNU0dfRE9OVFdBSVQgfCBNU0dfVFJVTkMpOwogCQkvKiBVc2Vyc3BhY2UgbWlnaHQgaGF2ZSBjb25zdW1lZCB0aGUgcGFja2V0IG1lYW53aGlsZToKIAkJICogaXQncyBub3Qgc3VwcG9zZWQgdG8gZG8gdGhpcyB1c3VhbGx5LCBidXQgbWlnaHQgYmUgaGFyZApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC9zY3NpLmMgYi9kcml2ZXJzL3Zob3N0L3Njc2kuYwppbmRleCA4ZDRmM2YxLi43MWRmMjQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Zob3N0L3Njc2kuYworKysgYi9kcml2ZXJzL3Zob3N0L3Njc2kuYwpAQCAtMTk1NiwxMCArMTk1Niw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAkvKgotCSAqIE5vdyByZWdpc3RlciB0aGUgVENNIHZob3N0IHZpcnR1YWwgSV9UIE5leHVzIGFzIGFjdGl2ZSB3aXRoIHRoZQotCSAqIGNhbGwgdG8gX190cmFuc3BvcnRfcmVnaXN0ZXJfc2Vzc2lvbigpCisJICogTm93IHJlZ2lzdGVyIHRoZSBUQ00gdmhvc3QgdmlydHVhbCBJX1QgTmV4dXMgYXMgYWN0aXZlLgogCSAqLwotCV9fdHJhbnNwb3J0X3JlZ2lzdGVyX3Nlc3Npb24oc2VfdHBnLCB0dl9uZXh1cy0+dHZuX3NlX3Nlc3MtPnNlX25vZGVfYWNsLAorCXRyYW5zcG9ydF9yZWdpc3Rlcl9zZXNzaW9uKHNlX3RwZywgdHZfbmV4dXMtPnR2bl9zZV9zZXNzLT5zZV9ub2RlX2FjbCwKIAkJCXR2X25leHVzLT50dm5fc2Vfc2VzcywgdHZfbmV4dXMpOwogCXRwZy0+dHBnX25leHVzID0gdHZfbmV4dXM7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0Lzg4cG04NjB4X2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC84OHBtODYweF9ibC5jCmluZGV4IDlhMjM2OTguLjJkYTU4NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0Lzg4cG04NjB4X2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvODhwbTg2MHhfYmwuYwpAQCAtMTY4LDEwICsxNjgsNyBAQAogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnByb290LCAqbnA7CiAJaW50IGlzZXQgPSAwOwogCi0JbnByb290ID0gb2Zfbm9kZV9nZXQocGRldi0+ZGV2LnBhcmVudC0+b2Zfbm9kZSk7Ci0JaWYgKCFucHJvb3QpCi0JCXJldHVybiAtRU5PREVWOwotCW5wcm9vdCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKG5wcm9vdCwgImJhY2tsaWdodHMiKTsKKwlucHJvb3QgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShwZGV2LT5kZXYucGFyZW50LT5vZl9ub2RlLCAiYmFja2xpZ2h0cyIpOwogCWlmICghbnByb290KSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBmaW5kIGJhY2tsaWdodHMgbm9kZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKaW5kZXggZWZiMDkwNC4uMmQ5OTIzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCkBAIC00MDgsNiArNDA4LDE2IEBACiAJICBJZiB5b3UgaGF2ZSBhIFBhbmRvcmEgY29uc29sZSwgc2F5IFkgdG8gZW5hYmxlIHRoZQogCSAgYmFja2xpZ2h0IGRyaXZlci4KIAorY29uZmlnIEJBQ0tMSUdIVF9TS1k4MTQ1MgorCXRyaXN0YXRlICJCYWNrbGlnaHQgZHJpdmVyIGZvciBTS1k4MTQ1MiIKKwlkZXBlbmRzIG9uIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UgJiYgTUZEX1NLWTgxNDUyCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBTa3l3b3JrcyBTS1k4MTQ1Miwgc2F5IFkgdG8gZW5hYmxlIHRoZQorCSAgYmFja2xpZ2h0IGRyaXZlci4KKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgc2t5ODE0NTItYmFja2xpZ2h0CisKIGNvbmZpZyBCQUNLTElHSFRfVFBTNjUyMTcKIAl0cmlzdGF0ZSAiVFBTNjUyMTcgQmFja2xpZ2h0IgogCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBNRkRfVFBTNjUyMTcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUKaW5kZXggZmNkNTBiNzMuLmQ2NzA3M2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCkBAIC01MCw2ICs1MCw3IEBACiBvYmotJChDT05GSUdfQkFDS0xJR0hUX1BDRjUwNjMzKQkrPSBwY2Y1MDYzMy1iYWNrbGlnaHQubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9QV00pCQkrPSBwd21fYmwubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9TQUhBUkEpCQkrPSBrYjM4ODZfYmwubworb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9TS1k4MTQ1MikJKz0gc2t5ODE0NTItYmFja2xpZ2h0Lm8KIG9iai0kKENPTkZJR19CQUNLTElHSFRfVE9TQSkJCSs9IHRvc2FfYmwubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9UUFM2NTIxNykJKz0gdHBzNjUyMTdfYmwubwogb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9XTTgzMVgpCQkrPSB3bTgzMXhfYmwubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZGE5MDUyX2JsLmMgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9kYTkwNTJfYmwuYwppbmRleCBkNGJkNzRiZC4uYjE5NDNlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZGE5MDUyX2JsLmMKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvZGE5MDUyX2JsLmMKQEAgLTE2NSw2ICsxNjUsNyBAQAogCQkubmFtZQkJPSAiZGE5MDUyLXdsZWQzIiwKIAkJLmRyaXZlcl9kYXRhCT0gREE5MDUyX1RZUEVfV0xFRDMsCiAJfSwKKwl7IH0sCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBkYTkwNTJfd2xlZF9kcml2ZXIgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9za3k4MTQ1Mi1iYWNrbGlnaHQuYyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3NreTgxNDUyLWJhY2tsaWdodC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MmZhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9za3k4MTQ1Mi1iYWNrbGlnaHQuYwpAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqIHNreTgxNDUyLWJhY2tsaWdodC5jCVNLWTgxNDUyIGJhY2tsaWdodCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBTa3l3b3JrcyBTb2x1dGlvbnMgSW5jLgorICogQXV0aG9yIDogR3l1bmdvaCBZb28gPGphY2sueW9vQHNreXdvcmtzaW5jLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9za3k4MTQ1Mi1iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKy8qIHJlZ2lzdGVycyAqLworI2RlZmluZSBTS1k4MTQ1Ml9SRUcwCTB4MDAKKyNkZWZpbmUgU0tZODE0NTJfUkVHMQkweDAxCisjZGVmaW5lIFNLWTgxNDUyX1JFRzIJMHgwMgorI2RlZmluZSBTS1k4MTQ1Ml9SRUc0CTB4MDQKKyNkZWZpbmUgU0tZODE0NTJfUkVHNQkweDA1CisKKy8qIGJpdCBtYXNrICovCisjZGVmaW5lIFNLWTgxNDUyX0NTCTB4RkYKKyNkZWZpbmUgU0tZODE0NTJfRU4JMHgzRgorI2RlZmluZSBTS1k4MTQ1Ml9JR1BXCTB4MjAKKyNkZWZpbmUgU0tZODE0NTJfUFdNTUQJMHgxMAorI2RlZmluZSBTS1k4MTQ1Ml9QSEFTRQkweDA4CisjZGVmaW5lIFNLWTgxNDUyX0lMSU0JMHgwNAorI2RlZmluZSBTS1k4MTQ1Ml9WU0hSVAkweDAzCisjZGVmaW5lIFNLWTgxNDUyX09DUAkweDgwCisjZGVmaW5lIFNLWTgxNDUyX09UTVAJMHg0MAorI2RlZmluZSBTS1k4MTQ1Ml9TSFJUCTB4M0YKKyNkZWZpbmUgU0tZODE0NTJfT1BOCTB4M0YKKworI2RlZmluZSBTS1k4MTQ1Ml9ERUZBVUxUX05BTUUgImxjZC1iYWNrbGlnaHQiCisjZGVmaW5lIFNLWTgxNDUyX01BWF9CUklHSFRORVNTCShTS1k4MTQ1Ml9DUyArIDEpCisKKyNkZWZpbmUgQ1RaKGIpIF9fYnVpbHRpbl9jdHooYikKKworc3RhdGljIGludCBza3k4MTQ1Ml9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKK3sKKwljb25zdCBzdHJ1Y3Qgc2t5ODE0NTJfYmxfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQkJZGV2X2dldF9wbGF0ZGF0YShiZC0+ZGV2LnBhcmVudCk7CisJY29uc3QgdW5zaWduZWQgaW50IGJyaWdodG5lc3MgPSAodW5zaWduZWQgaW50KWJkLT5wcm9wcy5icmlnaHRuZXNzOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGJsX2dldF9kYXRhKGJkKTsKKwlpbnQgcmV0OworCisJaWYgKGJyaWdodG5lc3MgPiAwKSB7CisJCXJldCA9IHJlZ21hcF93cml0ZShyZWdtYXAsIFNLWTgxNDUyX1JFRzAsIGJyaWdodG5lc3MgLSAxKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXR1cm4gcmVnbWFwX3VwZGF0ZV9iaXRzKHJlZ21hcCwgU0tZODE0NTJfUkVHMSwgU0tZODE0NTJfRU4sCisJCQkJCXBkYXRhLT5lbmFibGUgPDwgQ1RaKFNLWTgxNDUyX0VOKSk7CisJfQorCisJcmV0dXJuIHJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIFNLWTgxNDUyX1JFRzEsIFNLWTgxNDUyX0VOLCAwKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBiYWNrbGlnaHRfb3BzIHNreTgxNDUyX2JsX29wcyA9IHsKKwkudXBkYXRlX3N0YXR1cyA9IHNreTgxNDUyX2JsX3VwZGF0ZV9zdGF0dXMsCit9OworCitzdGF0aWMgc3NpemVfdCBza3k4MTQ1Ml9ibF9zdG9yZV9lbmFibGUoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gYmxfZ2V0X2RhdGEodG9fYmFja2xpZ2h0X2RldmljZShkZXYpKTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG91bChidWYsIDE2LCAmdmFsdWUpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhyZWdtYXAsIFNLWTgxNDUyX1JFRzEsIFNLWTgxNDUyX0VOLAorCQkJCQl2YWx1ZSA8PCBDVFooU0tZODE0NTJfRU4pKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNreTgxNDUyX2JsX3Nob3dfb3Blbl9zaG9ydChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwID0gYmxfZ2V0X2RhdGEodG9fYmFja2xpZ2h0X2RldmljZShkZXYpKTsKKwl1bnNpZ25lZCBpbnQgcmVnLCB2YWx1ZSA9IDA7CisJY2hhciB0bXBbM107CisJaW50IGksIHJldDsKKworCXJlZyA9ICFzdHJjbXAoYXR0ci0+YXR0ci5uYW1lLCAib3BlbiIpID8gU0tZODE0NTJfUkVHNSA6IFNLWTgxNDUyX1JFRzQ7CisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCByZWcsICZ2YWx1ZSk7CisJaWYgKElTX0VSUl9WQUxVRShyZXQpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHZhbHVlICYgU0tZODE0NTJfU0hSVCkgeworCQkqYnVmID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworCQkJaWYgKHZhbHVlICYgMHgwMSkgeworCQkJCXNwcmludGYodG1wLCAiJWQgIiwgaSArIDEpOworCQkJCXN0cmNhdChidWYsIHRtcCk7CisJCQl9CisJCQl2YWx1ZSA+Pj0gMTsKKwkJfQorCQlzdHJjYXQoYnVmLCAiXG4iKTsKKwl9IGVsc2UgeworCQlzdHJjcHkoYnVmLCAibm9uZVxuIik7CisJfQorCisJcmV0dXJuIHN0cmxlbihidWYpOworfQorCitzdGF0aWMgc3NpemVfdCBza3k4MTQ1Ml9ibF9zaG93X2ZhdWx0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXAgPSBibF9nZXRfZGF0YSh0b19iYWNrbGlnaHRfZGV2aWNlKGRldikpOworCXVuc2lnbmVkIGludCB2YWx1ZSA9IDA7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgU0tZODE0NTJfUkVHNCwgJnZhbHVlKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCXJldHVybiByZXQ7CisKKwkqYnVmID0gMDsKKworCWlmICh2YWx1ZSAmIFNLWTgxNDUyX09DUCkKKwkJc3RyY2F0KGJ1ZiwgIm92ZXItY3VycmVudCAiKTsKKworCWlmICh2YWx1ZSAmIFNLWTgxNDUyX09UTVApCisJCXN0cmNhdChidWYsICJvdmVyLXRlbXBlcmF0dXJlIik7CisKKwlzdHJjYXQoYnVmLCAiXG4iKTsKKwlyZXR1cm4gc3RybGVuKGJ1Zik7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihlbmFibGUsIFNfSVdHUlAgfCBTX0lXVVNSLCBOVUxMLCBza3k4MTQ1Ml9ibF9zdG9yZV9lbmFibGUpOworc3RhdGljIERFVklDRV9BVFRSKG9wZW4sIFNfSVJVR08sIHNreTgxNDUyX2JsX3Nob3dfb3Blbl9zaG9ydCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoc2hvcnQsIFNfSVJVR08sIHNreTgxNDUyX2JsX3Nob3dfb3Blbl9zaG9ydCwgTlVMTCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZmF1bHQsIFNfSVJVR08sIHNreTgxNDUyX2JsX3Nob3dfZmF1bHQsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2t5ODE0NTJfYmxfYXR0cmlidXRlW10gPSB7CisJJmRldl9hdHRyX2VuYWJsZS5hdHRyLAorCSZkZXZfYXR0cl9vcGVuLmF0dHIsCisJJmRldl9hdHRyX3Nob3J0LmF0dHIsCisJJmRldl9hdHRyX2ZhdWx0LmF0dHIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgc2t5ODE0NTJfYmxfYXR0cl9ncm91cCA9IHsKKwkuYXR0cnMgPSBza3k4MTQ1Ml9ibF9hdHRyaWJ1dGUsCit9OworCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgc3RydWN0IHNreTgxNDUyX2JsX3BsYXRmb3JtX2RhdGEgKnNreTgxNDUyX2JsX3BhcnNlX2R0KAorCQkJCQkJCXN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gb2Zfbm9kZV9nZXQoZGV2LT5vZl9ub2RlKTsKKwlzdHJ1Y3Qgc2t5ODE0NTJfYmxfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJaW50IG51bV9lbnRyeTsKKwl1bnNpZ25lZCBpbnQgc291cmNlc1s2XTsKKwlpbnQgcmV0OworCisJaWYgKCFucCkgeworCQlkZXZfZXJyKGRldiwgImJhY2tsaWdodCBub2RlIG5vdCBmb3VuZC5cbiIpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CisJfQorCisJcGRhdGEgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwZGF0YSkgeworCQlvZl9ub2RlX3B1dChucCk7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKworCW9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAibmFtZSIsICZwZGF0YS0+bmFtZSk7CisJcGRhdGEtPmlnbm9yZV9wd20gPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJza3l3b3JrcyxpZ25vcmUtcHdtIik7CisJcGRhdGEtPmRwd21fbW9kZSA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInNreXdvcmtzLGRwd20tbW9kZSIpOworCXBkYXRhLT5waGFzZV9zaGlmdCA9IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgInNreXdvcmtzLHBoYXNlLXNoaWZ0Iik7CisJcGRhdGEtPmdwaW9fZW5hYmxlID0gb2ZfZ2V0X2dwaW8obnAsIDApOworCisJcmV0ID0gb2ZfcHJvcGVydHlfY291bnRfdTMyX2VsZW1zKG5wLCAibGVkLXNvdXJjZXMiKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJcGRhdGEtPmVuYWJsZSA9IFNLWTgxNDUyX0VOID4+IENUWihTS1k4MTQ1Ml9FTik7CisJfSBlbHNlIHsKKwkJbnVtX2VudHJ5ID0gcmV0OworCQlpZiAobnVtX2VudHJ5ID4gNikKKwkJCW51bV9lbnRyeSA9IDY7CisKKwkJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkobnAsICJsZWQtc291cmNlcyIsIHNvdXJjZXMsCisJCQkJCW51bV9lbnRyeSk7CisJCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQkJZGV2X2VycihkZXYsICJsZWQtc291cmNlcyBub2RlIGlzIGludmFsaWQuXG4iKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQl9CisKKwkJcGRhdGEtPmVuYWJsZSA9IDA7CisJCXdoaWxlICgtLW51bV9lbnRyeSkKKwkJCXBkYXRhLT5lbmFibGUgfD0gKDEgPDwgc291cmNlc1tudW1fZW50cnldKTsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwKKwkJCSJza3l3b3JrcyxzaG9ydC1kZXRlY3Rpb24tdGhyZXNob2xkLXZvbHQiLAorCQkJJnBkYXRhLT5zaG9ydF9kZXRlY3Rpb25fdGhyZXNob2xkKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpCisJCXBkYXRhLT5zaG9ydF9kZXRlY3Rpb25fdGhyZXNob2xkID0gNzsKKworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAic2t5d29ya3MsY3VycmVudC1saW1pdC1tQSIsCisJCQkmcGRhdGEtPmJvb3N0X2N1cnJlbnRfbGltaXQpOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJcGRhdGEtPmJvb3N0X2N1cnJlbnRfbGltaXQgPSAyNzUwOworCisJb2Zfbm9kZV9wdXQobnApOworCXJldHVybiBwZGF0YTsKK30KKyNlbHNlCitzdGF0aWMgc3RydWN0IHNreTgxNDUyX2JsX3BsYXRmb3JtX2RhdGEgKnNreTgxNDUyX2JsX3BhcnNlX2R0KAorCQkJCQkJCXN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNreTgxNDUyX2JsX2luaXRfZGV2aWNlKHN0cnVjdCByZWdtYXAgKnJlZ21hcCwKKwkJc3RydWN0IHNreTgxNDUyX2JsX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKworCXZhbHVlID0gcGRhdGEtPmlnbm9yZV9wd20gPyBTS1k4MTQ1Ml9JR1BXIDogMDsKKwl2YWx1ZSB8PSBwZGF0YS0+ZHB3bV9tb2RlID8gU0tZODE0NTJfUFdNTUQgOiAwOworCXZhbHVlIHw9IHBkYXRhLT5waGFzZV9zaGlmdCA/IDAgOiBTS1k4MTQ1Ml9QSEFTRTsKKworCWlmIChwZGF0YS0+Ym9vc3RfY3VycmVudF9saW1pdCA9PSAyMzAwKQorCQl2YWx1ZSB8PSBTS1k4MTQ1Ml9JTElNOworCWVsc2UgaWYgKHBkYXRhLT5ib29zdF9jdXJyZW50X2xpbWl0ICE9IDI3NTApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHBkYXRhLT5zaG9ydF9kZXRlY3Rpb25fdGhyZXNob2xkIDwgNCB8fAorCQkJCXBkYXRhLT5zaG9ydF9kZXRlY3Rpb25fdGhyZXNob2xkID4gNykKKwkJcmV0dXJuIC1FSU5WQUw7CisJdmFsdWUgfD0gKDcgLSBwZGF0YS0+c2hvcnRfZGV0ZWN0aW9uX3RocmVzaG9sZCkgPDwgQ1RaKFNLWTgxNDUyX1ZTSFJUKTsKKworCXJldHVybiByZWdtYXBfd3JpdGUocmVnbWFwLCBTS1k4MTQ1Ml9SRUcyLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbnQgc2t5ODE0NTJfYmxfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCByZWdtYXAgKnJlZ21hcCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7CisJc3RydWN0IHNreTgxNDUyX2JsX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKKwlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJvcHM7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgcmV0OworCisJaWYgKCFwZGF0YSkgeworCQlwZGF0YSA9IHNreTgxNDUyX2JsX3BhcnNlX2R0KGRldik7CisJCWlmIChJU19FUlIocGRhdGEpKQorCQkJcmV0dXJuIFBUUl9FUlIocGRhdGEpOworCX0KKworCWlmIChncGlvX2lzX3ZhbGlkKHBkYXRhLT5ncGlvX2VuYWJsZSkpIHsKKwkJcmV0ID0gZGV2bV9ncGlvX3JlcXVlc3Rfb25lKGRldiwgcGRhdGEtPmdwaW9fZW5hYmxlLAorCQkJCQlHUElPRl9PVVRfSU5JVF9ISUdILCAic2t5ODE0NTItZW4iKTsKKwkJaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7CisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXF1ZXN0IEdQSU8uIGVycj0lZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXQgPSBza3k4MTQ1Ml9ibF9pbml0X2RldmljZShyZWdtYXAsIHBkYXRhKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJldCkpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gZXJyPSVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1lbXNldCgmcHJvcHMsIDAsIHNpemVvZihwcm9wcykpOworCXByb3BzLm1heF9icmlnaHRuZXNzID0gU0tZODE0NTJfTUFYX0JSSUdIVE5FU1MsCisJbmFtZSA9IHBkYXRhLT5uYW1lID8gcGRhdGEtPm5hbWUgOiBTS1k4MTQ1Ml9ERUZBVUxUX05BTUU7CisJYmQgPSBkZXZtX2JhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoZGV2LCBuYW1lLCBkZXYsIHJlZ21hcCwKKwkJCQkJCSZza3k4MTQ1Ml9ibF9vcHMsICZwcm9wcyk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIuIGVycj0lbGRcbiIsIFBUUl9FUlIoYmQpKTsKKwkJcmV0dXJuIFBUUl9FUlIoYmQpOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGJkKTsKKworCXJldCAgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmJkLT5kZXYua29iaiwgJnNreTgxNDUyX2JsX2F0dHJfZ3JvdXApOworCWlmIChJU19FUlJfVkFMVUUocmV0KSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgYXR0cmlidXRlLiBlcnI9JWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBza3k4MTQ1Ml9ibF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwljb25zdCBzdHJ1Y3Qgc2t5ODE0NTJfYmxfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPQorCQkJCQkJZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXN5c2ZzX3JlbW92ZV9ncm91cCgmYmQtPmRldi5rb2JqLCAmc2t5ODE0NTJfYmxfYXR0cl9ncm91cCk7CisKKwliZC0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19VTkJMQU5LOworCWJkLT5wcm9wcy5icmlnaHRuZXNzID0gMDsKKwliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhiZCk7CisKKwlpZiAoZ3Bpb19pc192YWxpZChwZGF0YS0+Z3Bpb19lbmFibGUpKQorCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChwZGF0YS0+Z3Bpb19lbmFibGUsIDApOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHNreTgxNDUyX2JsX29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJza3l3b3Jrcyxza3k4MTQ1Mi1iYWNrbGlnaHQiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNreTgxNDUyX2JsX29mX21hdGNoKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBza3k4MTQ1Ml9ibF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAic2t5ODE0NTItYmFja2xpZ2h0IiwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHNreTgxNDUyX2JsX29mX21hdGNoKSwKKwl9LAorCS5wcm9iZSA9IHNreTgxNDUyX2JsX3Byb2JlLAorCS5yZW1vdmUgPSBza3k4MTQ1Ml9ibF9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNreTgxNDUyX2JsX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU2t5d29ya3MgU0tZODE0NTIgYmFja2xpZ2h0IGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiR3l1bmdvaCBZb28gPGphY2sueW9vQHNreXdvcmtzaW5jLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19iYWxsb29uLmMgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fYmFsbG9vbi5jCmluZGV4IDA0MTMxNTcuLjZhMzU2ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19iYWxsb29uLmMKKysrIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX2JhbGxvb24uYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2JhbGxvb25fY29tcGFjdGlvbi5oPgogI2luY2x1ZGUgPGxpbnV4L29vbS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KIAogLyoKICAqIEJhbGxvb24gZGV2aWNlIHdvcmtzIGluIDRLIHBhZ2UgdW5pdHMuICBTbyBlYWNoIHBhZ2UgaXMgcG9pbnRlZCB0byBieQpAQCAtMzM0LDE3ICszMzUsMjUgQEAKIHN0YXRpYyBpbnQgYmFsbG9vbih2b2lkICpfdmJhbGxvb24pCiB7CiAJc3RydWN0IHZpcnRpb19iYWxsb29uICp2YiA9IF92YmFsbG9vbjsKKwlERUZJTkVfV0FJVF9GVU5DKHdhaXQsIHdva2VuX3dha2VfZnVuY3Rpb24pOwogCiAJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXM2NCBkaWZmOwogCiAJCXRyeV90b19mcmVlemUoKTsKLQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHZiLT5jb25maWdfY2hhbmdlLAotCQkJCQkgKGRpZmYgPSB0b3dhcmRzX3RhcmdldCh2YikpICE9IDAKLQkJCQkJIHx8IHZiLT5uZWVkX3N0YXRzX3VwZGF0ZQotCQkJCQkgfHwga3RocmVhZF9zaG91bGRfc3RvcCgpCi0JCQkJCSB8fCBmcmVlemluZyhjdXJyZW50KSk7CisKKwkJYWRkX3dhaXRfcXVldWUoJnZiLT5jb25maWdfY2hhbmdlLCAmd2FpdCk7CisJCWZvciAoOzspIHsKKwkJCWlmICgoZGlmZiA9IHRvd2FyZHNfdGFyZ2V0KHZiKSkgIT0gMCB8fAorCQkJICAgIHZiLT5uZWVkX3N0YXRzX3VwZGF0ZSB8fAorCQkJICAgIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fAorCQkJICAgIGZyZWV6aW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJd2FpdF93b2tlbigmd2FpdCwgVEFTS19JTlRFUlJVUFRJQkxFLCBNQVhfU0NIRURVTEVfVElNRU9VVCk7CisJCX0KKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnZiLT5jb25maWdfY2hhbmdlLCAmd2FpdCk7CisKIAkJaWYgKHZiLT5uZWVkX3N0YXRzX3VwZGF0ZSkKIAkJCXN0YXRzX2hhbmRsZV9yZXF1ZXN0KHZiKTsKIAkJaWYgKGRpZmYgPiAwKQpAQCAtNDk5LDYgKzUwOCw4IEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X29vbV9ub3RpZnk7CiAKKwl2aXJ0aW9fZGV2aWNlX3JlYWR5KHZkZXYpOworCiAJdmItPnRocmVhZCA9IGt0aHJlYWRfcnVuKGJhbGxvb24sIHZiLCAidmJhbGxvb24iKTsKIAlpZiAoSVNfRVJSKHZiLT50aHJlYWQpKSB7CiAJCWVyciA9IFBUUl9FUlIodmItPnRocmVhZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fbW1pby5jIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX21taW8uYwppbmRleCBjYWQ1Njk4Li42MDEwZDdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fbW1pby5jCisrKyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19tbWlvLmMKQEAgLTE1NiwyMiArMTU2LDk1IEBACiAJCSAgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuKQogewogCXN0cnVjdCB2aXJ0aW9fbW1pb19kZXZpY2UgKnZtX2RldiA9IHRvX3ZpcnRpb19tbWlvX2RldmljZSh2ZGV2KTsKLQl1OCAqcHRyID0gYnVmOwotCWludCBpOworCXZvaWQgX19pb21lbSAqYmFzZSA9IHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0NPTkZJRzsKKwl1OCBiOworCV9fbGUxNiB3OworCV9fbGUzMiBsOwogCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQlwdHJbaV0gPSByZWFkYih2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19DT05GSUcgKyBvZmZzZXQgKyBpKTsKKwlpZiAodm1fZGV2LT52ZXJzaW9uID09IDEpIHsKKwkJdTggKnB0ciA9IGJ1ZjsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJcHRyW2ldID0gcmVhZGIoYmFzZSArIG9mZnNldCArIGkpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChsZW4pIHsKKwljYXNlIDE6CisJCWIgPSByZWFkYihiYXNlICsgb2Zmc2V0KTsKKwkJbWVtY3B5KGJ1ZiwgJmIsIHNpemVvZiBiKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl3ID0gY3B1X3RvX2xlMTYocmVhZHcoYmFzZSArIG9mZnNldCkpOworCQltZW1jcHkoYnVmLCAmdywgc2l6ZW9mIHcpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWwgPSBjcHVfdG9fbGUzMihyZWFkbChiYXNlICsgb2Zmc2V0KSk7CisJCW1lbWNweShidWYsICZsLCBzaXplb2YgbCk7CisJCWJyZWFrOworCWNhc2UgODoKKwkJbCA9IGNwdV90b19sZTMyKHJlYWRsKGJhc2UgKyBvZmZzZXQpKTsKKwkJbWVtY3B5KGJ1ZiwgJmwsIHNpemVvZiBsKTsKKwkJbCA9IGNwdV90b19sZTMyKGlvcmVhZDMyKGJhc2UgKyBvZmZzZXQgKyBzaXplb2YgbCkpOworCQltZW1jcHkoYnVmICsgc2l6ZW9mIGwsICZsLCBzaXplb2YgbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KIH0KIAogc3RhdGljIHZvaWQgdm1fc2V0KHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2LCB1bnNpZ25lZCBvZmZzZXQsCiAJCSAgIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgbGVuKQogewogCXN0cnVjdCB2aXJ0aW9fbW1pb19kZXZpY2UgKnZtX2RldiA9IHRvX3ZpcnRpb19tbWlvX2RldmljZSh2ZGV2KTsKLQljb25zdCB1OCAqcHRyID0gYnVmOwotCWludCBpOworCXZvaWQgX19pb21lbSAqYmFzZSA9IHZtX2Rldi0+YmFzZSArIFZJUlRJT19NTUlPX0NPTkZJRzsKKwl1OCBiOworCV9fbGUxNiB3OworCV9fbGUzMiBsOwogCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotCQl3cml0ZWIocHRyW2ldLCB2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19DT05GSUcgKyBvZmZzZXQgKyBpKTsKKwlpZiAodm1fZGV2LT52ZXJzaW9uID09IDEpIHsKKwkJY29uc3QgdTggKnB0ciA9IGJ1ZjsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJd3JpdGViKHB0cltpXSwgYmFzZSArIG9mZnNldCArIGkpOworCisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJbWVtY3B5KCZiLCBidWYsIHNpemVvZiBiKTsKKwkJd3JpdGViKGIsIGJhc2UgKyBvZmZzZXQpOworCQlicmVhazsKKwljYXNlIDI6CisJCW1lbWNweSgmdywgYnVmLCBzaXplb2Ygdyk7CisJCXdyaXRldyhsZTE2X3RvX2NwdSh3KSwgYmFzZSArIG9mZnNldCk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJbWVtY3B5KCZsLCBidWYsIHNpemVvZiBsKTsKKwkJd3JpdGVsKGxlMzJfdG9fY3B1KGwpLCBiYXNlICsgb2Zmc2V0KTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQltZW1jcHkoJmwsIGJ1Ziwgc2l6ZW9mIGwpOworCQl3cml0ZWwobGUzMl90b19jcHUobCksIGJhc2UgKyBvZmZzZXQpOworCQltZW1jcHkoJmwsIGJ1ZiArIHNpemVvZiBsLCBzaXplb2YgbCk7CisJCXdyaXRlbChsZTMyX3RvX2NwdShsKSwgYmFzZSArIG9mZnNldCArIHNpemVvZiBsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgdTMyIHZtX2dlbmVyYXRpb24oc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCit7CisJc3RydWN0IHZpcnRpb19tbWlvX2RldmljZSAqdm1fZGV2ID0gdG9fdmlydGlvX21taW9fZGV2aWNlKHZkZXYpOworCisJaWYgKHZtX2Rldi0+dmVyc2lvbiA9PSAxKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiByZWFkbCh2bV9kZXYtPmJhc2UgKyBWSVJUSU9fTU1JT19DT05GSUdfR0VORVJBVElPTik7CiB9CiAKIHN0YXRpYyB1OCB2bV9nZXRfc3RhdHVzKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQpAQCAtNDQwLDYgKzUxMyw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHZpcnRpb19jb25maWdfb3BzIHZpcnRpb19tbWlvX2NvbmZpZ19vcHMgPSB7CiAJLmdldAkJPSB2bV9nZXQsCiAJLnNldAkJPSB2bV9zZXQsCisJLmdlbmVyYXRpb24JPSB2bV9nZW5lcmF0aW9uLAogCS5nZXRfc3RhdHVzCT0gdm1fZ2V0X3N0YXR1cywKIAkuc2V0X3N0YXR1cwk9IHZtX3NldF9zdGF0dXMsCiAJLnJlc2V0CQk9IHZtX3Jlc2V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvYnJpZGdlcy92bWVfdHNpMTQ4LmMgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwppbmRleCBlMDdjZmE4Li44OTVjMmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYworKysgYi9kcml2ZXJzL3ZtZS9icmlkZ2VzL3ZtZV90c2kxNDguYwpAQCAtNTg3LDExICs1ODcsNiBAQAogCQlncmFudWxhcml0eSA9IDB4MTAwMDA7CiAJCWFkZHIgfD0gVFNJMTQ4X0xDU1JfSVRBVF9BU19BNjQ7CiAJCWJyZWFrOwotCWNhc2UgVk1FX0NSQ1NSOgotCWNhc2UgVk1FX1VTRVIxOgotCWNhc2UgVk1FX1VTRVIyOgotCWNhc2UgVk1FX1VTRVIzOgotCWNhc2UgVk1FX1VTRVI0OgogCWRlZmF1bHQ6CiAJCWRldl9lcnIodHNpMTQ4X2JyaWRnZS0+cGFyZW50LCAiSW52YWxpZCBhZGRyZXNzIHNwYWNlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNDcxLDcgKzI0NjYsOCBAQAogCQltYXN0ZXJfaW1hZ2UtPmxvY2tlZCA9IDA7CiAJCW1hc3Rlcl9pbWFnZS0+bnVtYmVyID0gaTsKIAkJbWFzdGVyX2ltYWdlLT5hZGRyZXNzX2F0dHIgPSBWTUVfQTE2IHwgVk1FX0EyNCB8IFZNRV9BMzIgfAotCQkJVk1FX0E2NDsKKwkJCVZNRV9BNjQgfCBWTUVfQ1JDU1IgfCBWTUVfVVNFUjEgfCBWTUVfVVNFUjIgfAorCQkJVk1FX1VTRVIzIHwgVk1FX1VTRVI0OwogCQltYXN0ZXJfaW1hZ2UtPmN5Y2xlX2F0dHIgPSBWTUVfU0NUIHwgVk1FX0JMVCB8IFZNRV9NQkxUIHwKIAkJCVZNRV8yZVZNRSB8IFZNRV8yZVNTVCB8IFZNRV8yZVNTVEIgfCBWTUVfMmVTU1QxNjAgfAogCQkJVk1FXzJlU1NUMjY3IHwgVk1FXzJlU1NUMzIwIHwgVk1FX1NVUEVSIHwgVk1FX1VTRVIgfApAQCAtMjUwMCw4ICsyNDk2LDcgQEAKIAkJc2xhdmVfaW1hZ2UtPmxvY2tlZCA9IDA7CiAJCXNsYXZlX2ltYWdlLT5udW1iZXIgPSBpOwogCQlzbGF2ZV9pbWFnZS0+YWRkcmVzc19hdHRyID0gVk1FX0ExNiB8IFZNRV9BMjQgfCBWTUVfQTMyIHwKLQkJCVZNRV9BNjQgfCBWTUVfQ1JDU1IgfCBWTUVfVVNFUjEgfCBWTUVfVVNFUjIgfAotCQkJVk1FX1VTRVIzIHwgVk1FX1VTRVI0OworCQkJVk1FX0E2NDsKIAkJc2xhdmVfaW1hZ2UtPmN5Y2xlX2F0dHIgPSBWTUVfU0NUIHwgVk1FX0JMVCB8IFZNRV9NQkxUIHwKIAkJCVZNRV8yZVZNRSB8IFZNRV8yZVNTVCB8IFZNRV8yZVNTVEIgfCBWTUVfMmVTU1QxNjAgfAogCQkJVk1FXzJlU1NUMjY3IHwgVk1FXzJlU1NUMzIwIHwgVk1FX1NVUEVSIHwgVk1FX1VTRVIgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy92bWUvdm1lLmMgYi9kcml2ZXJzL3ZtZS92bWUuYwppbmRleCBkOTVmYjg0Li42YmFiMmM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZtZS92bWUuYworKysgYi9kcml2ZXJzL3ZtZS92bWUuYwpAQCAtNjA5LDYgKzYwOSwzMiBAQAogfQogRVhQT1JUX1NZTUJPTCh2bWVfbWFzdGVyX3Jtdyk7CiAKK2ludCB2bWVfbWFzdGVyX21tYXAoc3RydWN0IHZtZV9yZXNvdXJjZSAqcmVzb3VyY2UsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICppbWFnZTsKKwlwaHlzX2FkZHJfdCBwaHlzX2FkZHI7CisJdW5zaWduZWQgbG9uZyB2bWFfc2l6ZTsKKworCWlmIChyZXNvdXJjZS0+dHlwZSAhPSBWTUVfTUFTVEVSKSB7CisJCXByX2VycigiTm90IGEgbWFzdGVyIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW1hZ2UgPSBsaXN0X2VudHJ5KHJlc291cmNlLT5lbnRyeSwgc3RydWN0IHZtZV9tYXN0ZXJfcmVzb3VyY2UsIGxpc3QpOworCXBoeXNfYWRkciA9IGltYWdlLT5idXNfcmVzb3VyY2Uuc3RhcnQgKyAodm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKTsKKwl2bWFfc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworCWlmIChwaHlzX2FkZHIgKyB2bWFfc2l6ZSA+IGltYWdlLT5idXNfcmVzb3VyY2UuZW5kICsgMSkgeworCQlwcl9lcnIoIk1hcCBzaXplIGNhbm5vdCBleGNlZWQgdGhlIHdpbmRvdyBzaXplXG4iKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJdm1hLT52bV9wYWdlX3Byb3QgPSBwZ3Byb3Rfbm9uY2FjaGVkKHZtYS0+dm1fcGFnZV9wcm90KTsKKworCXJldHVybiB2bV9pb21hcF9tZW1vcnkodm1hLCBwaHlzX2FkZHIsIHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCk7Cit9CitFWFBPUlRfU1lNQk9MKHZtZV9tYXN0ZXJfbW1hcCk7CisKIHZvaWQgdm1lX21hc3Rlcl9mcmVlKHN0cnVjdCB2bWVfcmVzb3VyY2UgKnJlc291cmNlKQogewogCXN0cnVjdCB2bWVfbWFzdGVyX3Jlc291cmNlICptYXN0ZXJfaW1hZ2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2RpYWcyODhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2RpYWcyODhfd2R0LmMKaW5kZXggNDI5NDk0Yi4uYTlhNTIxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9kaWFnMjg4X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvZGlhZzI4OF93ZHQuYwpAQCAtMTI1LDkgKzEyNSw3IEBACiAJCXJldCA9IF9fZGlhZzI4OF92bShmdW5jLCBkZXYtPnRpbWVvdXQsIGViY19jbWQsIGxlbik7CiAJCVdBUk5fT04ocmV0ICE9IDApOwogCQlrZnJlZShlYmNfY21kKTsKLQl9Ci0KLQlpZiAoTUFDSElORV9JU19MUEFSKSB7CisJfSBlbHNlIHsKIAkJcmV0ID0gX19kaWFnMjg4X2xwYXIoV0RUX0ZVTkNfSU5JVCwKIAkJCQkgICAgIGRldi0+dGltZW91dCwgTFBBUldEVF9SRVNUQVJUKTsKIAl9CkBAIC0xMzYsNyArMTM0LDYgQEAKIAkJcHJfZXJyKCJUaGUgd2F0Y2hkb2cgY2Fubm90IGJlIGFjdGl2YXRlZFxuIik7CiAJCXJldHVybiByZXQ7CiAJfQotCXByX2luZm8oIlRoZSB3YXRjaGRvZyB3YXMgYWN0aXZhdGVkXG4iKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ1LDcgKzE0Miw2IEBACiAJaW50IHJldDsKIAogCXJldCA9IF9fZGlhZzI4OChXRFRfRlVOQ19DQU5DRUwsIDAsIDAsIDApOwotCXByX2luZm8oIlRoZSB3YXRjaGRvZyB3YXMgZGVhY3RpdmF0ZWRcbiIpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3NywxMCArMTczLDkgQEAKIAkJcmV0ID0gX19kaWFnMjg4X3ZtKGZ1bmMsIGRldi0+dGltZW91dCwgZWJjX2NtZCwgbGVuKTsKIAkJV0FSTl9PTihyZXQgIT0gMCk7CiAJCWtmcmVlKGViY19jbWQpOwotCX0KLQotCWlmIChNQUNISU5FX0lTX0xQQVIpCisJfSBlbHNlIHsKIAkJcmV0ID0gX19kaWFnMjg4X2xwYXIoV0RUX0ZVTkNfQ0hBTkdFLCBkZXYtPnRpbWVvdXQsIDApOworCX0KIAogCWlmIChyZXQpCiAJCXByX2VycigiVGhlIHdhdGNoZG9nIHRpbWVyIGNhbm5vdCBiZSBzdGFydGVkIG9yIHJlc2V0XG4iKTsKQEAgLTIwMiw3ICsxOTcsNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB3YXRjaGRvZ19pbmZvIHdkdF9pbmZvID0gewotCS5vcHRpb25zID0gV0RJT0ZfU0VUVElNRU9VVCB8IFdESU9GX01BR0lDQ0xPU0UsCisJLm9wdGlvbnMgPSBXRElPRl9TRVRUSU1FT1VUIHwgV0RJT0ZfS0VFUEFMSVZFUElORyB8IFdESU9GX01BR0lDQ0xPU0UsCiAJLmZpcm13YXJlX3ZlcnNpb24gPSAwLAogCS5pZGVudGl0eSA9ICJ6IFdhdGNoZG9nIiwKIH07CkBAIC0yNzMsMjEgKzI2OCwxNiBAQAogCXdhdGNoZG9nX3NldF9ub3dheW91dCgmd2R0X2Rldiwgbm93YXlvdXRfaW5mbyk7CiAKIAlpZiAoTUFDSElORV9JU19WTSkgewotCQlwcl9pbmZvKCJUaGUgd2F0Y2hkb2cgZGV2aWNlIGRyaXZlciBkZXRlY3RlZCBhIHovVk0gZW52aXJvbm1lbnRcbiIpOwogCQlpZiAoX19kaWFnMjg4X3ZtKFdEVF9GVU5DX0lOSVQsIDE1LAogCQkJCSBlYmNfYmVnaW4sIHNpemVvZihlYmNfYmVnaW4pKSAhPSAwKSB7CiAJCQlwcl9lcnIoIlRoZSB3YXRjaGRvZyBjYW5ub3QgYmUgaW5pdGlhbGl6ZWRcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQl9IGVsc2UgaWYgKE1BQ0hJTkVfSVNfTFBBUikgewotCQlwcl9pbmZvKCJUaGUgd2F0Y2hkb2cgZGV2aWNlIGRyaXZlciBkZXRlY3RlZCBhbiBMUEFSIGVudmlyb25tZW50XG4iKTsKKwl9IGVsc2UgewogCQlpZiAoX19kaWFnMjg4X2xwYXIoV0RUX0ZVTkNfSU5JVCwgMzAsIExQQVJXRFRfUkVTVEFSVCkpIHsKIAkJCXByX2VycigiVGhlIHdhdGNoZG9nIGNhbm5vdCBiZSBpbml0aWFsaXplZFxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCX0gZWxzZSB7Ci0JCXByX2VycigiTGludXggcnVucyBpbiBhbiBlbnZpcm9ubWVudCB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGRpYWcyODggd2F0Y2hkb2dcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlpZiAoX19kaWFnMjg4X2xwYXIoV0RUX0ZVTkNfQ0FOQ0VMLCAwLCAwKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jCmluZGV4IDA1ZWUwYmYuLjNjM2ZkNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvaVRDT193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMKQEAgLTUxLDYgKzUxLDcgQEAKICNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuMTEiCiAKIC8qIEluY2x1ZGVzICovCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgkJCS8qIEZvciBBQ1BJIHN1cHBvcnQgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JCS8qIEZvciBtb2R1bGUgc3BlY2lmaWMgaXRlbXMgKi8KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgkJLyogRm9yIG5ldyBtb2R1bGVwYXJhbSdzICovCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JCS8qIEZvciBzdGFuZGFyZCB0eXBlcyAobGlrZSBzaXplX3QpICovCkBAIC0xMDMsNiArMTA0LDggQEAKIAlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXY7CiAJLyogdGhlIFBDSS1kZXZpY2UgKi8KIAlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwkvKiB3aGV0aGVyIG9yIG5vdCB0aGUgd2F0Y2hkb2cgaGFzIGJlZW4gc3VzcGVuZGVkICovCisJYm9vbCBzdXNwZW5kZWQ7CiB9IGlUQ09fd2R0X3ByaXZhdGU7CiAKIC8qIG1vZHVsZSBwYXJhbWV0ZXJzICovCkBAIC01NzEsMTIgKzU3NCw2MCBAQAogCWlUQ09fd2R0X3N0b3AoTlVMTCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKy8qCisgKiBTdXNwZW5kLXRvLWlkbGUgcmVxdWlyZXMgdGhpcywgYmVjYXVzZSBpdCBzdG9wcyB0aGUgdGlja3MgYW5kIHRpbWVrZWVwaW5nLCBzbworICogdGhlIHdhdGNoZG9nIGNhbm5vdCBiZSBwaW5nZWQgd2hpbGUgaW4gdGhhdCBzdGF0ZS4gIEluIEFDUEkgc2xlZXAgc3RhdGVzIHRoZQorICogd2F0Y2hkb2cgaXMgc3RvcHBlZCBieSB0aGUgcGxhdGZvcm0gZmlybXdhcmUuCisgKi8KKworI2lmZGVmIENPTkZJR19BQ1BJCitzdGF0aWMgaW5saW5lIGJvb2wgbmVlZF9zdXNwZW5kKHZvaWQpCit7CisJcmV0dXJuIGFjcGlfdGFyZ2V0X3N5c3RlbV9zdGF0ZSgpID09IEFDUElfU1RBVEVfUzA7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBib29sIG5lZWRfc3VzcGVuZCh2b2lkKSB7IHJldHVybiB0cnVlOyB9CisjZW5kaWYKKworc3RhdGljIGludCBpVENPX3dkdF9zdXNwZW5kX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlUQ09fd2R0X3ByaXZhdGUuc3VzcGVuZGVkID0gZmFsc2U7CisJaWYgKHdhdGNoZG9nX2FjdGl2ZSgmaVRDT193ZHRfd2F0Y2hkb2dfZGV2KSAmJiBuZWVkX3N1c3BlbmQoKSkgeworCQlyZXQgPSBpVENPX3dkdF9zdG9wKCZpVENPX3dkdF93YXRjaGRvZ19kZXYpOworCQlpZiAoIXJldCkKKwkJCWlUQ09fd2R0X3ByaXZhdGUuc3VzcGVuZGVkID0gdHJ1ZTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpVENPX3dkdF9yZXN1bWVfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmIChpVENPX3dkdF9wcml2YXRlLnN1c3BlbmRlZCkKKwkJaVRDT193ZHRfc3RhcnQoJmlUQ09fd2R0X3dhdGNoZG9nX2Rldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIGlUQ09fd2R0X3BtID0geworCS5zdXNwZW5kX25vaXJxID0gaVRDT193ZHRfc3VzcGVuZF9ub2lycSwKKwkucmVzdW1lX25vaXJxID0gaVRDT193ZHRfcmVzdW1lX25vaXJxLAorfTsKKworI2RlZmluZSBJVENPX1dEVF9QTV9PUFMJKCZpVENPX3dkdF9wbSkKKyNlbHNlCisjZGVmaW5lIElUQ09fV0RUX1BNX09QUwlOVUxMCisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlUQ09fd2R0X2RyaXZlciA9IHsKIAkucHJvYmUgICAgICAgICAgPSBpVENPX3dkdF9wcm9iZSwKIAkucmVtb3ZlICAgICAgICAgPSBpVENPX3dkdF9yZW1vdmUsCiAJLnNodXRkb3duICAgICAgID0gaVRDT193ZHRfc2h1dGRvd24sCiAJLmRyaXZlciAgICAgICAgID0gewogCQkubmFtZSAgID0gRFJWX05BTUUsCisJCS5wbSAgICAgPSBJVENPX1dEVF9QTV9PUFMsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaW1ncGRjX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9pbWdwZGNfd2R0LmMKaW5kZXggYzhkZWY2OC4uMGRlYWE0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9pbWdwZGNfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9pbWdwZGNfd2R0LmMKQEAgLTQyLDEwICs0MiwxMCBAQAogI2RlZmluZSBQRENfV0RUX01JTl9USU1FT1VUCQkxCiAjZGVmaW5lIFBEQ19XRFRfREVGX1RJTUVPVVQJCTY0CiAKLXN0YXRpYyBpbnQgaGVhcnRiZWF0Oworc3RhdGljIGludCBoZWFydGJlYXQgPSBQRENfV0RUX0RFRl9USU1FT1VUOwogbW9kdWxlX3BhcmFtKGhlYXJ0YmVhdCwgaW50LCAwKTsKLU1PRFVMRV9QQVJNX0RFU0MoaGVhcnRiZWF0LCAiV2F0Y2hkb2cgaGVhcnRiZWF0cyBpbiBzZWNvbmRzLiAiCi0JIihkZWZhdWx0ID0gIiBfX01PRFVMRV9TVFJJTkcoUERDX1dEVF9ERUZfVElNRU9VVCkgIikiKTsKK01PRFVMRV9QQVJNX0RFU0MoaGVhcnRiZWF0LCAiV2F0Y2hkb2cgaGVhcnRiZWF0cyBpbiBzZWNvbmRzICIKKwkiKGRlZmF1bHQ9IiBfX01PRFVMRV9TVFJJTkcoUERDX1dEVF9ERUZfVElNRU9VVCkgIikiKTsKIAogc3RhdGljIGJvb2wgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKIG1vZHVsZV9wYXJhbShub3dheW91dCwgYm9vbCwgMCk7CkBAIC0xOTEsNiArMTkxLDcgQEAKIAlwZGNfd2R0LT53ZHRfZGV2Lm9wcyA9ICZwZGNfd2R0X29wczsKIAlwZGNfd2R0LT53ZHRfZGV2Lm1heF90aW1lb3V0ID0gMSA8PCBQRENfV0RUX0NPTkZJR19ERUxBWV9NQVNLOwogCXBkY193ZHQtPndkdF9kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKKwl3YXRjaGRvZ19zZXRfZHJ2ZGF0YSgmcGRjX3dkdC0+d2R0X2RldiwgcGRjX3dkdCk7CiAKIAlyZXQgPSB3YXRjaGRvZ19pbml0X3RpbWVvdXQoJnBkY193ZHQtPndkdF9kZXYsIGhlYXJ0YmVhdCwgJnBkZXYtPmRldik7CiAJaWYgKHJldCA8IDApIHsKQEAgLTIzMiw3ICsyMzMsNiBAQAogCXdhdGNoZG9nX3NldF9ub3dheW91dCgmcGRjX3dkdC0+d2R0X2Rldiwgbm93YXlvdXQpOwogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcGRjX3dkdCk7Ci0Jd2F0Y2hkb2dfc2V0X2RydmRhdGEoJnBkY193ZHQtPndkdF9kZXYsIHBkY193ZHQpOwogCiAJcmV0ID0gd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKCZwZGNfd2R0LT53ZHRfZGV2KTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9tdGtfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL210a193ZHQuYwppbmRleCBhODdmNmRmLi45MzhiOTg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL210a193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL210a193ZHQuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJdTMyIHJlZzsKIAlzdHJ1Y3QgbXRrX3dkdF9kZXYgKm10a193ZHQgPSB3YXRjaGRvZ19nZXRfZHJ2ZGF0YSh3ZHRfZGV2KTsKIAl2b2lkIF9faW9tZW0gKndkdF9iYXNlID0gbXRrX3dkdC0+d2R0X2Jhc2U7Ci0JdTMyIHJldDsKKwlpbnQgcmV0OwogCiAJcmV0ID0gbXRrX3dkdF9zZXRfdGltZW91dCh3ZHRfZGV2LCB3ZHRfZGV2LT50aW1lb3V0KTsKIAlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL0tjb25maWcgYi9kcml2ZXJzL3hlbi9LY29uZmlnCmluZGV4IGI4MTI0NjIuLjk0ZDk2ODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL0tjb25maWcKKysrIGIvZHJpdmVycy94ZW4vS2NvbmZpZwpAQCAtNTUsNiArNTUsMjMgQEAKIAogCSAgSW4gdGhhdCBjYXNlIHN0ZXAgMyBzaG91bGQgYmUgb21pdHRlZC4KIAorY29uZmlnIFhFTl9CQUxMT09OX01FTU9SWV9IT1RQTFVHX0xJTUlUCisJaW50ICJIb3RwbHVnZ2VkIG1lbW9yeSBsaW1pdCAoaW4gR2lCKSBmb3IgYSBQViBndWVzdCIKKwlkZWZhdWx0IDUxMiBpZiBYODZfNjQKKwlkZWZhdWx0IDQgaWYgWDg2XzMyCisJcmFuZ2UgMCA2NCBpZiBYODZfMzIKKwlkZXBlbmRzIG9uIFhFTl9IQVZFX1BWTU1VCisJZGVwZW5kcyBvbiBYRU5fQkFMTE9PTl9NRU1PUllfSE9UUExVRworCWhlbHAKKwkgIE1heG1pdW0gYW1vdW50IG9mIG1lbW9yeSAoaW4gR2lCKSB0aGF0IGEgUFYgZ3Vlc3QgY2FuIGJlCisJICBleHBhbmRlZCB0byB3aGVuIHVzaW5nIG1lbW9yeSBob3RwbHVnLgorCisJICBBIFBWIGd1ZXN0IGNhbiBoYXZlIG1vcmUgbWVtb3J5IHRoYW4gdGhpcyBsaW1pdCBpZiBpcworCSAgc3RhcnRlZCB3aXRoIGEgbGFyZ2VyIG1heGltdW0uCisKKwkgIFRoaXMgdmFsdWUgaXMgdXNlZCB0byBhbGxvY2F0ZSBlbm91Z2ggc3BhY2UgaW4gaW50ZXJuYWwKKwkgIHRhYmxlcyBuZWVkZWQgZm9yIHBoeXNpY2FsIG1lbW9yeSBhZG1pbmlzdHJhdGlvbi4KKwogY29uZmlnIFhFTl9TQ1JVQl9QQUdFUwogCWJvb2wgIlNjcnViIHBhZ2VzIGJlZm9yZSByZXR1cm5pbmcgdGhlbSB0byBzeXN0ZW0iCiAJZGVwZW5kcyBvbiBYRU5fQkFMTE9PTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vYmFsbG9vbi5jIGIvZHJpdmVycy94ZW4vYmFsbG9vbi5jCmluZGV4IDBiNTJkOTIuLmZkOTMzNjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL2JhbGxvb24uYworKysgYi9kcml2ZXJzL3hlbi9iYWxsb29uLmMKQEAgLTIyOSw2ICsyMjksMjkgQEAKIAliYWxsb29uX2hvdHBsdWcgPSByb3VuZF91cChiYWxsb29uX2hvdHBsdWcsIFBBR0VTX1BFUl9TRUNUSU9OKTsKIAluaWQgPSBtZW1vcnlfYWRkX3BoeXNhZGRyX3RvX25pZChob3RwbHVnX3N0YXJ0X3BhZGRyKTsKIAorI2lmZGVmIENPTkZJR19YRU5fSEFWRV9QVk1NVQorICAgICAgICAvKgorICAgICAgICAgKiBhZGRfbWVtb3J5KCkgd2lsbCBidWlsZCBwYWdlIHRhYmxlcyBmb3IgdGhlIG5ldyBtZW1vcnkgc28KKyAgICAgICAgICogdGhlIHAybSBtdXN0IGNvbnRhaW4gaW52YWxpZCBlbnRyaWVzIHNvIHRoZSBjb3JyZWN0CisgICAgICAgICAqIG5vbi1wcmVzZW50IFBURXMgd2lsbCBiZSB3cml0dGVuLgorICAgICAgICAgKgorICAgICAgICAgKiBJZiBhIGZhaWx1cmUgb2NjdXJzLCB0aGUgb3JpZ2luYWwgKGlkZW50aXR5KSBwMm0gZW50cmllcworICAgICAgICAgKiBhcmUgbm90IHJlc3RvcmVkIHNpbmNlIHRoaXMgcmVnaW9uIGlzIG5vdyBrbm93biBub3QgdG8KKyAgICAgICAgICogY29uZmxpY3Qgd2l0aCBhbnkgZGV2aWNlcy4KKyAgICAgICAgICovIAorCWlmICgheGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkpIHsKKwkJdW5zaWduZWQgbG9uZyBwZm4sIGk7CisKKwkJcGZuID0gUEZOX0RPV04oaG90cGx1Z19zdGFydF9wYWRkcik7CisJCWZvciAoaSA9IDA7IGkgPCBiYWxsb29uX2hvdHBsdWc7IGkrKykgeworCQkJaWYgKCFzZXRfcGh5c190b19tYWNoaW5lKHBmbiArIGksIElOVkFMSURfUDJNX0VOVFJZKSkgeworCQkJCXByX3dhcm4oInNldF9waHlzX3RvX21hY2hpbmUoKSBmYWlsZWQsIG5vIG1lbW9yeSBhZGRlZFxuIik7CisJCQkJcmV0dXJuIEJQX0VDQU5DRUxFRDsKKwkJCX0KKyAgICAgICAgICAgICAgICB9CisJfQorI2VuZGlmCisKIAlyYyA9IGFkZF9tZW1vcnkobmlkLCBob3RwbHVnX3N0YXJ0X3BhZGRyLCBiYWxsb29uX2hvdHBsdWcgPDwgUEFHRV9TSElGVCk7CiAKIAlpZiAocmMpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3RtZW0uYyBiL2RyaXZlcnMveGVuL3RtZW0uYwppbmRleCA4YTY1NDIzLi5jNDIxMWEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi90bWVtLmMKKysrIGIvZHJpdmVycy94ZW4vdG1lbS5jCkBAIC0zOTcsMTMgKzM5NywxNSBAQAogI2lmZGVmIENPTkZJR19DTEVBTkNBQ0hFCiAJQlVHX09OKHNpemVvZihzdHJ1Y3QgY2xlYW5jYWNoZV9maWxla2V5KSAhPSBzaXplb2Yoc3RydWN0IHRtZW1fb2lkKSk7CiAJaWYgKHRtZW1fZW5hYmxlZCAmJiBjbGVhbmNhY2hlKSB7Ci0JCWNoYXIgKnMgPSAiIjsKLQkJc3RydWN0IGNsZWFuY2FjaGVfb3BzICpvbGRfb3BzID0KLQkJCWNsZWFuY2FjaGVfcmVnaXN0ZXJfb3BzKCZ0bWVtX2NsZWFuY2FjaGVfb3BzKTsKLQkJaWYgKG9sZF9vcHMpCi0JCQlzID0gIiAoV0FSTklORzogY2xlYW5jYWNoZV9vcHMgb3ZlcnJpZGRlbikiOwotCQlwcl9pbmZvKCJjbGVhbmNhY2hlIGVuYWJsZWQsIFJBTSBwcm92aWRlZCBieSBYZW4gVHJhbnNjZW5kZW50IE1lbW9yeSVzXG4iLAotCQkJcyk7CisJCWludCBlcnI7CisKKwkJZXJyID0gY2xlYW5jYWNoZV9yZWdpc3Rlcl9vcHMoJnRtZW1fY2xlYW5jYWNoZV9vcHMpOworCQlpZiAoZXJyKQorCQkJcHJfd2FybigieGVuLXRtZW06IGZhaWxlZCB0byBlbmFibGUgY2xlYW5jYWNoZTogJWRcbiIsCisJCQkJZXJyKTsKKwkJZWxzZQorCQkJcHJfaW5mbygiY2xlYW5jYWNoZSBlbmFibGVkLCBSQU0gcHJvdmlkZWQgYnkgIgorCQkJCSJYZW4gVHJhbnNjZW5kZW50IE1lbW9yeVxuIik7CiAJfQogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1hFTl9TRUxGQkFMTE9PTklORwpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4veGVuLXNjc2liYWNrLmMgYi9kcml2ZXJzL3hlbi94ZW4tc2NzaWJhY2suYwppbmRleCA5ZmFjYTZhLi40MmJkNTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW4tc2NzaWJhY2suYworKysgYi9kcml2ZXJzL3hlbi94ZW4tc2NzaWJhY2suYwpAQCAtMTY1OSwxMSArMTY1OSw4IEBACiAJCQkgbmFtZSk7CiAJCWdvdG8gb3V0OwogCX0KLQkvKgotCSAqIE5vdyByZWdpc3RlciB0aGUgVENNIHB2c2NzaSB2aXJ0dWFsIElfVCBOZXh1cyBhcyBhY3RpdmUgd2l0aCB0aGUKLQkgKiBjYWxsIHRvIF9fdHJhbnNwb3J0X3JlZ2lzdGVyX3Nlc3Npb24oKQotCSAqLwotCV9fdHJhbnNwb3J0X3JlZ2lzdGVyX3Nlc3Npb24oc2VfdHBnLCB0dl9uZXh1cy0+dHZuX3NlX3Nlc3MtPnNlX25vZGVfYWNsLAorCS8qIE5vdyByZWdpc3RlciB0aGUgVENNIHB2c2NzaSB2aXJ0dWFsIElfVCBOZXh1cyBhcyBhY3RpdmUuICovCisJdHJhbnNwb3J0X3JlZ2lzdGVyX3Nlc3Npb24oc2VfdHBnLCB0dl9uZXh1cy0+dHZuX3NlX3Nlc3MtPnNlX25vZGVfYWNsLAogCQkJdHZfbmV4dXMtPnR2bl9zZV9zZXNzLCB0dl9uZXh1cyk7CiAJdHBnLT50cGdfbmV4dXMgPSB0dl9uZXh1czsKIApkaWZmIC0tZ2l0IGEvZnMvOXAvdjlmc192ZnMuaCBiL2ZzLzlwL3Y5ZnNfdmZzLmgKaW5kZXggYjgzZWJmYi4uNWEwZGI2ZCAxMDA2NDQKLS0tIGEvZnMvOXAvdjlmc192ZnMuaAorKysgYi9mcy85cC92OWZzX3Zmcy5oCkBAIC02OCwxNCArNjgsMTAgQEAKIHZvaWQgdjlmc19pbm9kZTJzdGF0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwOV93c3RhdCAqc3RhdCk7CiBpbnQgdjlmc191ZmxhZ3Myb21vZGUoaW50IHVmbGFncywgaW50IGV4dGVuZGVkKTsKIAotc3NpemVfdCB2OWZzX2ZpbGVfcmVhZG4oc3RydWN0IGZpbGUgKiwgY2hhciAqLCBjaGFyIF9fdXNlciAqLCB1MzIsIHU2NCk7Ci1zc2l6ZV90IHY5ZnNfZmlkX3JlYWRuKHN0cnVjdCBwOV9maWQgKiwgY2hhciAqLCBjaGFyIF9fdXNlciAqLCB1MzIsIHU2NCk7CiB2b2lkIHY5ZnNfYmxhbmtfd3N0YXQoc3RydWN0IHA5X3dzdGF0ICp3c3RhdCk7CiBpbnQgdjlmc192ZnNfc2V0YXR0cl9kb3RsKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGlhdHRyICopOwogaW50IHY5ZnNfZmlsZV9mc3luY19kb3RsKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCiAJCQkgaW50IGRhdGFzeW5jKTsKLXNzaXplX3Qgdjlmc19maWxlX3dyaXRlX2ludGVybmFsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgcDlfZmlkICosCi0JCQkJIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICosIGludCk7CiBpbnQgdjlmc19yZWZyZXNoX2lub2RlKHN0cnVjdCBwOV9maWQgKmZpZCwgc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgdjlmc19yZWZyZXNoX2lub2RlX2RvdGwoc3RydWN0IHA5X2ZpZCAqZmlkLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIHN0YXRpYyBpbmxpbmUgdm9pZCB2OWZzX2ludmFsaWRhdGVfaW5vZGVfYXR0cihzdHJ1Y3QgaW5vZGUgKmlub2RlKQpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2FkZHIuYyBiL2ZzLzlwL3Zmc19hZGRyLmMKaW5kZXggZWIxNGUwNS4uMmUzOGY5YSAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2FkZHIuYworKysgYi9mcy85cC92ZnNfYWRkci5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bmV0LzlwLzlwLmg+CiAjaW5jbHVkZSA8bmV0LzlwL2NsaWVudC5oPgogCkBAIC01MSwxMiArNTEsMTEgQEAKICAqLwogc3RhdGljIGludCB2OWZzX2ZpZF9yZWFkcGFnZShzdHJ1Y3QgcDlfZmlkICpmaWQsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCWludCByZXR2YWw7Ci0JbG9mZl90IG9mZnNldDsKLQljaGFyICpidWZmZXI7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjID0gey5idl9wYWdlID0gcGFnZSwgLmJ2X2xlbiA9IFBBR0VfU0laRX07CisJc3RydWN0IGlvdl9pdGVyIHRvOworCWludCByZXR2YWwsIGVycjsKIAotCWlub2RlID0gcGFnZS0+bWFwcGluZy0+aG9zdDsKIAlwOV9kZWJ1ZyhQOV9ERUJVR19WRlMsICJcbiIpOwogCiAJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKQEAgLTY1LDE2ICs2NCwxNiBAQAogCWlmIChyZXR2YWwgPT0gMCkKIAkJcmV0dXJuIHJldHZhbDsKIAotCWJ1ZmZlciA9IGttYXAocGFnZSk7Ci0Jb2Zmc2V0ID0gcGFnZV9vZmZzZXQocGFnZSk7CisJaW92X2l0ZXJfYnZlYygmdG8sIElURVJfQlZFQyB8IFJFQUQsICZidmVjLCAxLCBQQUdFX1NJWkUpOwogCi0JcmV0dmFsID0gdjlmc19maWRfcmVhZG4oZmlkLCBidWZmZXIsIE5VTEwsIFBBR0VfQ0FDSEVfU0laRSwgb2Zmc2V0KTsKLQlpZiAocmV0dmFsIDwgMCkgeworCXJldHZhbCA9IHA5X2NsaWVudF9yZWFkKGZpZCwgcGFnZV9vZmZzZXQocGFnZSksICZ0bywgJmVycik7CisJaWYgKGVycikgewogCQl2OWZzX3VuY2FjaGVfcGFnZShpbm9kZSwgcGFnZSk7CisJCXJldHZhbCA9IGVycjsKIAkJZ290byBkb25lOwogCX0KIAotCW1lbXNldChidWZmZXIgKyByZXR2YWwsIDAsIFBBR0VfQ0FDSEVfU0laRSAtIHJldHZhbCk7CisJemVyb191c2VyKHBhZ2UsIHJldHZhbCwgUEFHRV9TSVpFIC0gcmV0dmFsKTsKIAlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CiAKQEAgLTgyLDcgKzgxLDYgQEAKIAlyZXR2YWwgPSAwOwogCiBkb25lOgotCWt1bm1hcChwYWdlKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpAQCAtMTYxLDQxICsxNTksMzIgQEAKIAogc3RhdGljIGludCB2OWZzX3Zmc193cml0ZXBhZ2VfbG9ja2VkKHN0cnVjdCBwYWdlICpwYWdlKQogewotCWNoYXIgKmJ1ZmZlcjsKLQlpbnQgcmV0dmFsLCBsZW47Ci0JbG9mZl90IG9mZnNldCwgc2l6ZTsKLQltbV9zZWdtZW50X3Qgb2xkX2ZzOwotCXN0cnVjdCB2OWZzX2lub2RlICp2OWlub2RlOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYWdlLT5tYXBwaW5nLT5ob3N0OworCXN0cnVjdCB2OWZzX2lub2RlICp2OWlub2RlID0gVjlGU19JKGlub2RlKTsKKwlsb2ZmX3Qgc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwlzdHJ1Y3QgaW92X2l0ZXIgZnJvbTsKKwlzdHJ1Y3QgYmlvX3ZlYyBidmVjOworCWludCBlcnIsIGxlbjsKIAotCXY5aW5vZGUgPSBWOUZTX0koaW5vZGUpOwotCXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJaWYgKHBhZ2UtPmluZGV4ID09IHNpemUgPj4gUEFHRV9DQUNIRV9TSElGVCkKIAkJbGVuID0gc2l6ZSAmIH5QQUdFX0NBQ0hFX01BU0s7CiAJZWxzZQogCQlsZW4gPSBQQUdFX0NBQ0hFX1NJWkU7CiAKLQlzZXRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJYnZlYy5idl9wYWdlID0gcGFnZTsKKwlidmVjLmJ2X29mZnNldCA9IDA7CisJYnZlYy5idl9sZW4gPSBsZW47CisJaW92X2l0ZXJfYnZlYygmZnJvbSwgSVRFUl9CVkVDIHwgV1JJVEUsICZidmVjLCAxLCBsZW4pOwogCi0JYnVmZmVyID0ga21hcChwYWdlKTsKLQlvZmZzZXQgPSBwYWdlX29mZnNldChwYWdlKTsKLQotCW9sZF9mcyA9IGdldF9mcygpOwotCXNldF9mcyhnZXRfZHMoKSk7CiAJLyogV2Ugc2hvdWxkIGhhdmUgd3JpdGViYWNrX2ZpZCBhbHdheXMgc2V0ICovCiAJQlVHX09OKCF2OWlub2RlLT53cml0ZWJhY2tfZmlkKTsKIAotCXJldHZhbCA9IHY5ZnNfZmlsZV93cml0ZV9pbnRlcm5hbChpbm9kZSwKLQkJCQkJICB2OWlub2RlLT53cml0ZWJhY2tfZmlkLAotCQkJCQkgIChfX2ZvcmNlIGNvbnN0IGNoYXIgX191c2VyICopYnVmZmVyLAotCQkJCQkgIGxlbiwgJm9mZnNldCwgMCk7Ci0JaWYgKHJldHZhbCA+IDApCi0JCXJldHZhbCA9IDA7CisJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCi0Jc2V0X2ZzKG9sZF9mcyk7Ci0Ja3VubWFwKHBhZ2UpOworCXA5X2NsaWVudF93cml0ZSh2OWlub2RlLT53cml0ZWJhY2tfZmlkLCBwYWdlX29mZnNldChwYWdlKSwgJmZyb20sICZlcnIpOworCiAJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwotCXJldHVybiByZXR2YWw7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCB2OWZzX3Zmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQpAQCAtMjYxLDE2ICsyNTAsMjEgQEAKIHN0YXRpYyBzc2l6ZV90CiB2OWZzX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICppdGVyLCBsb2ZmX3QgcG9zKQogewotCS8qCi0JICogRklYTUUKLQkgKiBOb3cgdGhhdCB3ZSBkbyBjYWNoaW5nIHdpdGggY2FjaGUgbW9kZSBlbmFibGVkLCBXZSBuZWVkCi0JICogdG8gc3VwcG9ydCBkaXJlY3QgSU8KLQkgKi8KLQlwOV9kZWJ1ZyhQOV9ERUJVR19WRlMsICJ2OWZzX2RpcmVjdF9JTzogdjlmc19kaXJlY3RfSU8gKCVwRCkgb2ZmL25vKCVsbGQvJWx1KSBFSU5WQUxcbiIsCi0JCSBpb2NiLT5raV9maWxwLAotCQkgKGxvbmcgbG9uZylwb3MsIGl0ZXItPm5yX3NlZ3MpOwotCi0JcmV0dXJuIC1FSU5WQUw7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXNzaXplX3QgbjsKKwlpbnQgZXJyID0gMDsKKwlpZiAocncgJiBXUklURSkgeworCQluID0gcDlfY2xpZW50X3dyaXRlKGZpbGUtPnByaXZhdGVfZGF0YSwgcG9zLCBpdGVyLCAmZXJyKTsKKwkJaWYgKG4pIHsKKwkJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpOworCQkJbG9mZl90IGlfc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwkJCWlmIChwb3MgKyBuID4gaV9zaXplKQorCQkJCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgcG9zICsgbiAtIGlfc2l6ZSk7CisJCX0KKwl9IGVsc2UgeworCQluID0gcDlfY2xpZW50X3JlYWQoZmlsZS0+cHJpdmF0ZV9kYXRhLCBwb3MsIGl0ZXIsICZlcnIpOworCX0KKwlyZXR1cm4gbiA/IG4gOiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgdjlmc193cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCmRpZmYgLS1naXQgYS9mcy85cC92ZnNfZGlyLmMgYi9mcy85cC92ZnNfZGlyLmMKaW5kZXggNGYxMTUxMC4uNzZjM2IxYSAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2Rpci5jCisrKyBiL2ZzLzlwL3Zmc19kaXIuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bmV0LzlwLzlwLmg+CiAjaW5jbHVkZSA8bmV0LzlwL2NsaWVudC5oPgogCkBAIC0xMTUsNiArMTE2LDcgQEAKIAlpbnQgYnVmbGVuOwogCWludCByZWNsZW4gPSAwOwogCXN0cnVjdCBwOV9yZGlyICpyZGlyOworCXN0cnVjdCBrdmVjIGt2ZWM7CiAKIAlwOV9kZWJ1ZyhQOV9ERUJVR19WRlMsICJuYW1lICVwRFxuIiwgZmlsZSk7CiAJZmlkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwpAQCAtMTI0LDE2ICsxMjYsMjEgQEAKIAlyZGlyID0gdjlmc19hbGxvY19yZGlyX2J1ZihmaWxlLCBidWZsZW4pOwogCWlmICghcmRpcikKIAkJcmV0dXJuIC1FTk9NRU07CisJa3ZlYy5pb3ZfYmFzZSA9IHJkaXItPmJ1ZjsKKwlrdmVjLmlvdl9sZW4gPSBidWZsZW47CiAKIAl3aGlsZSAoMSkgewogCQlpZiAocmRpci0+dGFpbCA9PSByZGlyLT5oZWFkKSB7Ci0JCQllcnIgPSB2OWZzX2ZpbGVfcmVhZG4oZmlsZSwgcmRpci0+YnVmLCBOVUxMLAotCQkJCQkJCWJ1ZmxlbiwgY3R4LT5wb3MpOwotCQkJaWYgKGVyciA8PSAwKQorCQkJc3RydWN0IGlvdl9pdGVyIHRvOworCQkJaW50IG47CisJCQlpb3ZfaXRlcl9rdmVjKCZ0bywgUkVBRCB8IElURVJfS1ZFQywgJmt2ZWMsIDEsIGJ1Zmxlbik7CisJCQluID0gcDlfY2xpZW50X3JlYWQoZmlsZS0+cHJpdmF0ZV9kYXRhLCBjdHgtPnBvcywgJnRvLAorCQkJCQkgICAmZXJyKTsKKwkJCWlmIChlcnIpCiAJCQkJcmV0dXJuIGVycjsKIAogCQkJcmRpci0+aGVhZCA9IDA7Ci0JCQlyZGlyLT50YWlsID0gZXJyOworCQkJcmRpci0+dGFpbCA9IG47CiAJCX0KIAkJd2hpbGUgKHJkaXItPmhlYWQgPCByZGlyLT50YWlsKSB7CiAJCQlwOXN0YXRfaW5pdCgmc3QpOwpkaWZmIC0tZ2l0IGEvZnMvOXAvdmZzX2ZpbGUuYyBiL2ZzLzlwL3Zmc19maWxlLmMKaW5kZXggYjQwMTMzNy4uZDdmY2I3NyAxMDA2NDQKLS0tIGEvZnMvOXAvdmZzX2ZpbGUuYworKysgYi9mcy85cC92ZnNfZmlsZS5jCkBAIC0zNiw2ICszNiw4IEBACiAjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPG5ldC85cC85cC5oPgogI2luY2x1ZGUgPG5ldC85cC9jbGllbnQuaD4KIApAQCAtMjg1LDYgKzI4Nyw3IEBACiAJCQlmbC0+ZmxfZW5kID0gZ2xvY2suc3RhcnQgKyBnbG9jay5sZW5ndGggLSAxOwogCQlmbC0+ZmxfcGlkID0gZ2xvY2sucHJvY19pZDsKIAl9CisJa2ZyZWUoZ2xvY2suY2xpZW50X2lkKTsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0zNjQsNjMgKzM2Nyw2IEBACiB9CiAKIC8qKgotICogdjlmc19maWRfcmVhZG4gLSByZWFkIGZyb20gYSBmaWQKLSAqIEBmaWQ6IGZpZCB0byByZWFkCi0gKiBAZGF0YTogZGF0YSBidWZmZXIgdG8gcmVhZCBkYXRhIGludG8KLSAqIEB1ZGF0YTogdXNlciBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgaW50bwotICogQGNvdW50OiBzaXplIG9mIGJ1ZmZlcgotICogQG9mZnNldDogb2Zmc2V0IGF0IHdoaWNoIHRvIHJlYWQgZGF0YQotICoKLSAqLwotc3NpemVfdAotdjlmc19maWRfcmVhZG4oc3RydWN0IHA5X2ZpZCAqZmlkLCBjaGFyICpkYXRhLCBjaGFyIF9fdXNlciAqdWRhdGEsIHUzMiBjb3VudCwKLQkgICAgICAgdTY0IG9mZnNldCkKLXsKLQlpbnQgbiwgdG90YWwsIHNpemU7Ci0KLQlwOV9kZWJ1ZyhQOV9ERUJVR19WRlMsICJmaWQgJWQgb2Zmc2V0ICVsbHUgY291bnQgJWRcbiIsCi0JCSBmaWQtPmZpZCwgKGxvbmcgbG9uZyB1bnNpZ25lZClvZmZzZXQsIGNvdW50KTsKLQluID0gMDsKLQl0b3RhbCA9IDA7Ci0Jc2l6ZSA9IGZpZC0+aW91bml0ID8gZmlkLT5pb3VuaXQgOiBmaWQtPmNsbnQtPm1zaXplIC0gUDlfSU9IRFJTWjsKLQlkbyB7Ci0JCW4gPSBwOV9jbGllbnRfcmVhZChmaWQsIGRhdGEsIHVkYXRhLCBvZmZzZXQsIGNvdW50KTsKLQkJaWYgKG4gPD0gMCkKLQkJCWJyZWFrOwotCi0JCWlmIChkYXRhKQotCQkJZGF0YSArPSBuOwotCQlpZiAodWRhdGEpCi0JCQl1ZGF0YSArPSBuOwotCi0JCW9mZnNldCArPSBuOwotCQljb3VudCAtPSBuOwotCQl0b3RhbCArPSBuOwotCX0gd2hpbGUgKGNvdW50ID4gMCAmJiBuID09IHNpemUpOwotCi0JaWYgKG4gPCAwKQotCQl0b3RhbCA9IG47Ci0KLQlyZXR1cm4gdG90YWw7Ci19Ci0KLS8qKgotICogdjlmc19maWxlX3JlYWRuIC0gcmVhZCBmcm9tIGEgZmlsZQotICogQGZpbHA6IGZpbGUgcG9pbnRlciB0byByZWFkCi0gKiBAZGF0YTogZGF0YSBidWZmZXIgdG8gcmVhZCBkYXRhIGludG8KLSAqIEB1ZGF0YTogdXNlciBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgaW50bwotICogQGNvdW50OiBzaXplIG9mIGJ1ZmZlcgotICogQG9mZnNldDogb2Zmc2V0IGF0IHdoaWNoIHRvIHJlYWQgZGF0YQotICoKLSAqLwotc3NpemVfdAotdjlmc19maWxlX3JlYWRuKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyICpkYXRhLCBjaGFyIF9fdXNlciAqdWRhdGEsIHUzMiBjb3VudCwKLQkgICAgICAgdTY0IG9mZnNldCkKLXsKLQlyZXR1cm4gdjlmc19maWRfcmVhZG4oZmlscC0+cHJpdmF0ZV9kYXRhLCBkYXRhLCB1ZGF0YSwgY291bnQsIG9mZnNldCk7Ci19Ci0KLS8qKgogICogdjlmc19maWxlX3JlYWQgLSByZWFkIGZyb20gYSBmaWxlCiAgKiBAZmlscDogZmlsZSBwb2ludGVyIHRvIHJlYWQKICAqIEB1ZGF0YTogdXNlciBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgaW50bwpAQCAtNDMwLDY5ICszNzYsMjIgQEAKICAqLwogCiBzdGF0aWMgc3NpemVfdAotdjlmc19maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1ZGF0YSwgc2l6ZV90IGNvdW50LAotCSAgICAgICBsb2ZmX3QgKiBvZmZzZXQpCit2OWZzX2ZpbGVfcmVhZF9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKLQlpbnQgcmV0OwotCXN0cnVjdCBwOV9maWQgKmZpZDsKLQlzaXplX3Qgc2l6ZTsKKwlzdHJ1Y3QgcDlfZmlkICpmaWQgPSBpb2NiLT5raV9maWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldCwgZXJyOwogCi0JcDlfZGVidWcoUDlfREVCVUdfVkZTLCAiY291bnQgJXp1IG9mZnNldCAlbGxkXG4iLCBjb3VudCwgKm9mZnNldCk7Ci0JZmlkID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXA5X2RlYnVnKFA5X0RFQlVHX1ZGUywgImNvdW50ICV6dSBvZmZzZXQgJWxsZFxuIiwKKwkJIGlvdl9pdGVyX2NvdW50KHRvKSwgaW9jYi0+a2lfcG9zKTsKIAotCXNpemUgPSBmaWQtPmlvdW5pdCA/IGZpZC0+aW91bml0IDogZmlkLT5jbG50LT5tc2l6ZSAtIFA5X0lPSERSU1o7Ci0JaWYgKGNvdW50ID4gc2l6ZSkKLQkJcmV0ID0gdjlmc19maWxlX3JlYWRuKGZpbHAsIE5VTEwsIHVkYXRhLCBjb3VudCwgKm9mZnNldCk7Ci0JZWxzZQotCQlyZXQgPSBwOV9jbGllbnRfcmVhZChmaWQsIE5VTEwsIHVkYXRhLCAqb2Zmc2V0LCBjb3VudCk7CisJcmV0ID0gcDlfY2xpZW50X3JlYWQoZmlkLCBpb2NiLT5raV9wb3MsIHRvLCAmZXJyKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIGVycjsKIAotCWlmIChyZXQgPiAwKQotCQkqb2Zmc2V0ICs9IHJldDsKLQorCWlvY2ItPmtpX3BvcyArPSByZXQ7CiAJcmV0dXJuIHJldDsKIH0KIAotc3NpemVfdAotdjlmc19maWxlX3dyaXRlX2ludGVybmFsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBwOV9maWQgKmZpZCwKLQkJCSBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwgc2l6ZV90IGNvdW50LAotCQkJIGxvZmZfdCAqb2Zmc2V0LCBpbnQgaW52YWxpZGF0ZSkKLXsKLQlpbnQgbjsKLQlsb2ZmX3QgaV9zaXplOwotCXNpemVfdCB0b3RhbCA9IDA7Ci0JbG9mZl90IG9yaWdpbiA9ICpvZmZzZXQ7Ci0JdW5zaWduZWQgbG9uZyBwZ19zdGFydCwgcGdfZW5kOwotCi0JcDlfZGVidWcoUDlfREVCVUdfVkZTLCAiZGF0YSAlcCBjb3VudCAlZCBvZmZzZXQgJXhcbiIsCi0JCSBkYXRhLCAoaW50KWNvdW50LCAoaW50KSpvZmZzZXQpOwotCi0JZG8gewotCQluID0gcDlfY2xpZW50X3dyaXRlKGZpZCwgTlVMTCwgZGF0YSt0b3RhbCwgb3JpZ2luK3RvdGFsLCBjb3VudCk7Ci0JCWlmIChuIDw9IDApCi0JCQlicmVhazsKLQkJY291bnQgLT0gbjsKLQkJdG90YWwgKz0gbjsKLQl9IHdoaWxlIChjb3VudCA+IDApOwotCi0JaWYgKGludmFsaWRhdGUgJiYgKHRvdGFsID4gMCkpIHsKLQkJcGdfc3RhcnQgPSBvcmlnaW4gPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJcGdfZW5kID0gKG9yaWdpbiArIHRvdGFsIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJaWYgKGlub2RlLT5pX21hcHBpbmcgJiYgaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlcykKLQkJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsCi0JCQkJCQkgICAgICBwZ19zdGFydCwgcGdfZW5kKTsKLQkJKm9mZnNldCArPSB0b3RhbDsKLQkJaV9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOwotCQlpZiAoKm9mZnNldCA+IGlfc2l6ZSkgewotCQkJaW5vZGVfYWRkX2J5dGVzKGlub2RlLCAqb2Zmc2V0IC0gaV9zaXplKTsKLQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgKm9mZnNldCk7Ci0JCX0KLQl9Ci0JaWYgKG4gPCAwKQotCQlyZXR1cm4gbjsKLQotCXJldHVybiB0b3RhbDsKLX0KLQogLyoqCiAgKiB2OWZzX2ZpbGVfd3JpdGUgLSB3cml0ZSB0byBhIGZpbGUKICAqIEBmaWxwOiBmaWxlIHBvaW50ZXIgdG8gd3JpdGUKQEAgLTUwMiwzNSArNDAxLDQ1IEBACiAgKgogICovCiBzdGF0aWMgc3NpemVfdAotdjlmc19maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqIGRhdGEsCi0JCXNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZzZXQpCit2OWZzX2ZpbGVfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3NpemVfdCByZXR2YWwgPSAwOwotCWxvZmZfdCBvcmlnaW4gPSAqb2Zmc2V0OworCWxvZmZfdCBvcmlnaW4gPSBpb2NiLT5raV9wb3M7CisJc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQoZnJvbSk7CisJaW50IGVyciA9IDA7CiAKLQotCXJldHZhbCA9IGdlbmVyaWNfd3JpdGVfY2hlY2tzKGZpbHAsICZvcmlnaW4sICZjb3VudCwgMCk7CisJcmV0dmFsID0gZ2VuZXJpY193cml0ZV9jaGVja3MoZmlsZSwgJm9yaWdpbiwgJmNvdW50LCAwKTsKIAlpZiAocmV0dmFsKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJldHZhbDsKIAotCXJldHZhbCA9IC1FSU5WQUw7Ci0JaWYgKChzc2l6ZV90KSBjb3VudCA8IDApCi0JCWdvdG8gb3V0OwotCXJldHZhbCA9IDA7CisJaW92X2l0ZXJfdHJ1bmNhdGUoZnJvbSwgY291bnQpOworCiAJaWYgKCFjb3VudCkKLQkJZ290byBvdXQ7CisJCXJldHVybiAwOwogCi0JcmV0dmFsID0gdjlmc19maWxlX3dyaXRlX2ludGVybmFsKGZpbGVfaW5vZGUoZmlscCksCi0JCQkJCWZpbHAtPnByaXZhdGVfZGF0YSwKLQkJCQkJZGF0YSwgY291bnQsICZvcmlnaW4sIDEpOwotCS8qIHVwZGF0ZSBvZmZzZXQgb24gc3VjY2Vzc2Z1bCB3cml0ZSAqLwotCWlmIChyZXR2YWwgPiAwKQotCQkqb2Zmc2V0ID0gb3JpZ2luOwotb3V0OgotCXJldHVybiByZXR2YWw7CisJcmV0dmFsID0gcDlfY2xpZW50X3dyaXRlKGZpbGUtPnByaXZhdGVfZGF0YSwgb3JpZ2luLCBmcm9tLCAmZXJyKTsKKwlpZiAocmV0dmFsID4gMCkgeworCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShmaWxlKTsKKwkJbG9mZl90IGlfc2l6ZTsKKwkJdW5zaWduZWQgbG9uZyBwZ19zdGFydCwgcGdfZW5kOworCQlwZ19zdGFydCA9IG9yaWdpbiA+PiBQQUdFX0NBQ0hFX1NISUZUOworCQlwZ19lbmQgPSAob3JpZ2luICsgcmV0dmFsIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJaWYgKGlub2RlLT5pX21hcHBpbmcgJiYgaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlcykKKwkJCWludmFsaWRhdGVfaW5vZGVfcGFnZXMyX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsCisJCQkJCQkgICAgICBwZ19zdGFydCwgcGdfZW5kKTsKKwkJb3JpZ2luICs9IHJldHZhbDsKKwkJaV9zaXplID0gaV9zaXplX3JlYWQoaW5vZGUpOworCQlpb2NiLT5raV9wb3MgPSBvcmlnaW47CisJCWlmIChvcmlnaW4gPiBpX3NpemUpIHsKKwkJCWlub2RlX2FkZF9ieXRlcyhpbm9kZSwgb3JpZ2luIC0gaV9zaXplKTsKKwkJCWlfc2l6ZV93cml0ZShpbm9kZSwgb3JpZ2luKTsKKwkJfQorCQlyZXR1cm4gcmV0dmFsOworCX0KKwlyZXR1cm4gZXJyOwogfQogCi0KIHN0YXRpYyBpbnQgdjlmc19maWxlX2ZzeW5jKHN0cnVjdCBmaWxlICpmaWxwLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQsCiAJCQkgICBpbnQgZGF0YXN5bmMpCiB7CkBAIC02NTcsNDQgKzU2Niw2IEBACiAJcmV0dXJuIFZNX0ZBVUxUX05PUEFHRTsKIH0KIAotc3RhdGljIHNzaXplX3QKLXY5ZnNfZGlyZWN0X3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1ZGF0YSwgc2l6ZV90IGNvdW50LAotCQkgbG9mZl90ICpvZmZzZXRwKQotewotCWxvZmZfdCBzaXplLCBvZmZzZXQ7Ci0Jc3RydWN0IGlub2RlICppbm9kZTsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKLQotCW9mZnNldCA9ICpvZmZzZXRwOwotCW1hcHBpbmcgPSBmaWxwLT5mX21hcHBpbmc7Ci0JaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwotCWlmICghY291bnQpCi0JCXJldHVybiAwOwotCXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JaWYgKG9mZnNldCA8IHNpemUpCi0JCWZpbGVtYXBfd3JpdGVfYW5kX3dhaXRfcmFuZ2UobWFwcGluZywgb2Zmc2V0LAotCQkJCQkgICAgIG9mZnNldCArIGNvdW50IC0gMSk7Ci0KLQlyZXR1cm4gdjlmc19maWxlX3JlYWQoZmlscCwgdWRhdGEsIGNvdW50LCBvZmZzZXRwKTsKLX0KLQotLyoqCi0gKiB2OWZzX2NhY2hlZF9maWxlX3JlYWQgLSByZWFkIGZyb20gYSBmaWxlCi0gKiBAZmlscDogZmlsZSBwb2ludGVyIHRvIHJlYWQKLSAqIEBkYXRhOiB1c2VyIGRhdGEgYnVmZmVyIHRvIHJlYWQgZGF0YSBpbnRvCi0gKiBAY291bnQ6IHNpemUgb2YgYnVmZmVyCi0gKiBAb2Zmc2V0OiBvZmZzZXQgYXQgd2hpY2ggdG8gcmVhZCBkYXRhCi0gKgotICovCi1zdGF0aWMgc3NpemVfdAotdjlmc19jYWNoZWRfZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqZGF0YSwgc2l6ZV90IGNvdW50LAotCQkgICAgICBsb2ZmX3QgKm9mZnNldCkKLXsKLQlpZiAoZmlscC0+Zl9mbGFncyAmIE9fRElSRUNUKQotCQlyZXR1cm4gdjlmc19kaXJlY3RfcmVhZChmaWxwLCBkYXRhLCBjb3VudCwgb2Zmc2V0KTsKLQlyZXR1cm4gbmV3X3N5bmNfcmVhZChmaWxwLCBkYXRhLCBjb3VudCwgb2Zmc2V0KTsKLX0KLQogLyoqCiAgKiB2OWZzX21tYXBfZmlsZV9yZWFkIC0gcmVhZCBmcm9tIGEgZmlsZQogICogQGZpbHA6IGZpbGUgcG9pbnRlciB0byByZWFkCkBAIC03MDQsODQgKzU3NSwxMiBAQAogICoKICAqLwogc3RhdGljIHNzaXplX3QKLXY5ZnNfbW1hcF9maWxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpkYXRhLCBzaXplX3QgY291bnQsCi0JCSAgICAgIGxvZmZfdCAqb2Zmc2V0KQordjlmc19tbWFwX2ZpbGVfcmVhZF9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKIAkvKiBUT0RPOiBDaGVjayBpZiB0aGVyZSBhcmUgZGlydHkgcGFnZXMgKi8KLQlyZXR1cm4gdjlmc19maWxlX3JlYWQoZmlscCwgZGF0YSwgY291bnQsIG9mZnNldCk7CisJcmV0dXJuIHY5ZnNfZmlsZV9yZWFkX2l0ZXIoaW9jYiwgdG8pOwogfQogCi1zdGF0aWMgc3NpemVfdAotdjlmc19kaXJlY3Rfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICogZGF0YSwKLQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2Zmc2V0cCkKLXsKLQlsb2ZmX3Qgb2Zmc2V0OwotCXNzaXplX3QgcmV0dmFsOwotCXN0cnVjdCBpbm9kZSAqaW5vZGU7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7Ci0KLQlvZmZzZXQgPSAqb2Zmc2V0cDsKLQltYXBwaW5nID0gZmlscC0+Zl9tYXBwaW5nOwotCWlub2RlID0gbWFwcGluZy0+aG9zdDsKLQlpZiAoIWNvdW50KQotCQlyZXR1cm4gMDsKLQotCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQlyZXR2YWwgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKG1hcHBpbmcsIG9mZnNldCwKLQkJCQkJICAgICAgb2Zmc2V0ICsgY291bnQgLSAxKTsKLQlpZiAocmV0dmFsKQotCQlnb3RvIGVycl9vdXQ7Ci0JLyoKLQkgKiBBZnRlciBhIHdyaXRlIHdlIHdhbnQgYnVmZmVyZWQgcmVhZHMgdG8gYmUgc3VyZSB0byBnbyB0byBkaXNrIHRvIGdldAotCSAqIHRoZSBuZXcgZGF0YS4gIFdlIGludmFsaWRhdGUgY2xlYW4gY2FjaGVkIHBhZ2UgZnJvbSB0aGUgcmVnaW9uIHdlJ3JlCi0JICogYWJvdXQgdG8gd3JpdGUuICBXZSBkbyB0aGlzICpiZWZvcmUqIHRoZSB3cml0ZSBzbyB0aGF0IGlmIHdlIGZhaWwKLQkgKiBoZXJlIHdlIGZhbGwgYmFjayB0byBidWZmZXJlZCB3cml0ZQotCSAqLwotCWlmIChtYXBwaW5nLT5ucnBhZ2VzKSB7Ci0JCXBnb2ZmX3QgcGdfc3RhcnQgPSBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQkJcGdvZmZfdCBwZ19lbmQgICA9IChvZmZzZXQgKyBjb3VudCAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0KLQkJcmV0dmFsID0gaW52YWxpZGF0ZV9pbm9kZV9wYWdlczJfcmFuZ2UobWFwcGluZywKLQkJCQkJCQlwZ19zdGFydCwgcGdfZW5kKTsKLQkJLyoKLQkJICogSWYgYSBwYWdlIGNhbiBub3QgYmUgaW52YWxpZGF0ZWQsIGZhbGwgYmFjawotCQkgKiB0byBidWZmZXJlZCB3cml0ZS4KLQkJICovCi0JCWlmIChyZXR2YWwpIHsKLQkJCWlmIChyZXR2YWwgPT0gLUVCVVNZKQotCQkJCWdvdG8gYnVmZl93cml0ZTsKLQkJCWdvdG8gZXJyX291dDsKLQkJfQotCX0KLQlyZXR2YWwgPSB2OWZzX2ZpbGVfd3JpdGUoZmlscCwgZGF0YSwgY291bnQsIG9mZnNldHApOwotZXJyX291dDoKLQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKLQlyZXR1cm4gcmV0dmFsOwotCi1idWZmX3dyaXRlOgotCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCXJldHVybiBuZXdfc3luY193cml0ZShmaWxwLCBkYXRhLCBjb3VudCwgb2Zmc2V0cCk7Ci19Ci0KLS8qKgotICogdjlmc19jYWNoZWRfZmlsZV93cml0ZSAtIHdyaXRlIHRvIGEgZmlsZQotICogQGZpbHA6IGZpbGUgcG9pbnRlciB0byB3cml0ZQotICogQGRhdGE6IGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgZnJvbQotICogQGNvdW50OiBzaXplIG9mIGJ1ZmZlcgotICogQG9mZnNldDogb2Zmc2V0IGF0IHdoaWNoIHRvIHdyaXRlIGRhdGEKLSAqCi0gKi8KLXN0YXRpYyBzc2l6ZV90Ci12OWZzX2NhY2hlZF9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqIGRhdGEsCi0JCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2Zmc2V0KQotewotCi0JaWYgKGZpbHAtPmZfZmxhZ3MgJiBPX0RJUkVDVCkKLQkJcmV0dXJuIHY5ZnNfZGlyZWN0X3dyaXRlKGZpbHAsIGRhdGEsIGNvdW50LCBvZmZzZXQpOwotCXJldHVybiBuZXdfc3luY193cml0ZShmaWxwLCBkYXRhLCBjb3VudCwgb2Zmc2V0KTsKLX0KLQotCiAvKioKICAqIHY5ZnNfbW1hcF9maWxlX3dyaXRlIC0gd3JpdGUgdG8gYSBmaWxlCiAgKiBAZmlscDogZmlsZSBwb2ludGVyIHRvIHdyaXRlCkBAIC03OTEsMTQgKzU5MCwxMyBAQAogICoKICAqLwogc3RhdGljIHNzaXplX3QKLXY5ZnNfbW1hcF9maWxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqZGF0YSwKLQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZzZXQpCit2OWZzX21tYXBfZmlsZV93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCS8qCiAJICogVE9ETzogaW52YWxpZGF0ZSBtbWFwcyBvbiBmaWxwJ3MgaW5vZGUgYmV0d2VlbgogCSAqIG9mZnNldCBhbmQgb2Zmc2V0K2NvdW50CiAJICovCi0JcmV0dXJuIHY5ZnNfZmlsZV93cml0ZShmaWxwLCBkYXRhLCBjb3VudCwgb2Zmc2V0KTsKKwlyZXR1cm4gdjlmc19maWxlX3dyaXRlX2l0ZXIoaW9jYiwgZnJvbSk7CiB9CiAKIHN0YXRpYyB2b2lkIHY5ZnNfbW1hcF92bV9jbG9zZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKQEAgLTg0Myw4ICs2NDEsNiBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHY5ZnNfY2FjaGVkX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZCA9IHY5ZnNfY2FjaGVkX2ZpbGVfcmVhZCwKLQkud3JpdGUgPSB2OWZzX2NhY2hlZF9maWxlX3dyaXRlLAogCS5yZWFkX2l0ZXIgPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyID0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm9wZW4gPSB2OWZzX2ZpbGVfb3BlbiwKQEAgLTg1Niw4ICs2NTIsNiBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHY5ZnNfY2FjaGVkX2ZpbGVfb3BlcmF0aW9uc19kb3RsID0gewogCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkID0gdjlmc19jYWNoZWRfZmlsZV9yZWFkLAotCS53cml0ZSA9IHY5ZnNfY2FjaGVkX2ZpbGVfd3JpdGUsCiAJLnJlYWRfaXRlciA9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCiAJLndyaXRlX2l0ZXIgPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkub3BlbiA9IHY5ZnNfZmlsZV9vcGVuLApAQCAtODcwLDggKzY2NCw4IEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdjlmc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQgPSB2OWZzX2ZpbGVfcmVhZCwKLQkud3JpdGUgPSB2OWZzX2ZpbGVfd3JpdGUsCisJLnJlYWRfaXRlciA9IHY5ZnNfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIgPSB2OWZzX2ZpbGVfd3JpdGVfaXRlciwKIAkub3BlbiA9IHY5ZnNfZmlsZV9vcGVuLAogCS5yZWxlYXNlID0gdjlmc19kaXJfcmVsZWFzZSwKIAkubG9jayA9IHY5ZnNfZmlsZV9sb2NrLApAQCAtODgxLDggKzY3NSw4IEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdjlmc19maWxlX29wZXJhdGlvbnNfZG90bCA9IHsKIAkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZCA9IHY5ZnNfZmlsZV9yZWFkLAotCS53cml0ZSA9IHY5ZnNfZmlsZV93cml0ZSwKKwkucmVhZF9pdGVyID0gdjlmc19maWxlX3JlYWRfaXRlciwKKwkud3JpdGVfaXRlciA9IHY5ZnNfZmlsZV93cml0ZV9pdGVyLAogCS5vcGVuID0gdjlmc19maWxlX29wZW4sCiAJLnJlbGVhc2UgPSB2OWZzX2Rpcl9yZWxlYXNlLAogCS5sb2NrID0gdjlmc19maWxlX2xvY2tfZG90bCwKQEAgLTg5Myw4ICs2ODcsOCBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHY5ZnNfbW1hcF9maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQgPSB2OWZzX21tYXBfZmlsZV9yZWFkLAotCS53cml0ZSA9IHY5ZnNfbW1hcF9maWxlX3dyaXRlLAorCS5yZWFkX2l0ZXIgPSB2OWZzX21tYXBfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIgPSB2OWZzX21tYXBfZmlsZV93cml0ZV9pdGVyLAogCS5vcGVuID0gdjlmc19maWxlX29wZW4sCiAJLnJlbGVhc2UgPSB2OWZzX2Rpcl9yZWxlYXNlLAogCS5sb2NrID0gdjlmc19maWxlX2xvY2ssCkBAIC05MDQsOCArNjk4LDggQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2OWZzX21tYXBfZmlsZV9vcGVyYXRpb25zX2RvdGwgPSB7CiAJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQgPSB2OWZzX21tYXBfZmlsZV9yZWFkLAotCS53cml0ZSA9IHY5ZnNfbW1hcF9maWxlX3dyaXRlLAorCS5yZWFkX2l0ZXIgPSB2OWZzX21tYXBfZmlsZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIgPSB2OWZzX21tYXBfZmlsZV93cml0ZV9pdGVyLAogCS5vcGVuID0gdjlmc19maWxlX29wZW4sCiAJLnJlbGVhc2UgPSB2OWZzX2Rpcl9yZWxlYXNlLAogCS5sb2NrID0gdjlmc19maWxlX2xvY2tfZG90bCwKZGlmZiAtLWdpdCBhL2ZzLzlwL3hhdHRyLmMgYi9mcy85cC94YXR0ci5jCmluZGV4IGY5NWUwMWUuLjBjZjQ0YjYgMTAwNjQ0Ci0tLSBhL2ZzLzlwL3hhdHRyLmMKKysrIGIvZnMvOXAveGF0dHIuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxuZXQvOXAvOXAuaD4KICNpbmNsdWRlIDxuZXQvOXAvY2xpZW50Lmg+CiAKQEAgLTI1LDUwICsyNiwzNCBAQAogCQkJICAgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUpCiB7CiAJc3NpemVfdCByZXR2YWw7Ci0JaW50IG1zaXplLCByZWFkX2NvdW50OwotCXU2NCBvZmZzZXQgPSAwLCBhdHRyX3NpemU7CisJdTY0IGF0dHJfc2l6ZTsKIAlzdHJ1Y3QgcDlfZmlkICphdHRyX2ZpZDsKKwlzdHJ1Y3Qga3ZlYyBrdmVjID0gey5pb3ZfYmFzZSA9IGJ1ZmZlciwgLmlvdl9sZW4gPSBidWZmZXJfc2l6ZX07CisJc3RydWN0IGlvdl9pdGVyIHRvOworCWludCBlcnI7CisKKwlpb3ZfaXRlcl9rdmVjKCZ0bywgUkVBRCB8IElURVJfS1ZFQywgJmt2ZWMsIDEsIGJ1ZmZlcl9zaXplKTsKIAogCWF0dHJfZmlkID0gcDlfY2xpZW50X3hhdHRyd2FsayhmaWQsIG5hbWUsICZhdHRyX3NpemUpOwogCWlmIChJU19FUlIoYXR0cl9maWQpKSB7CiAJCXJldHZhbCA9IFBUUl9FUlIoYXR0cl9maWQpOwogCQlwOV9kZWJ1ZyhQOV9ERUJVR19WRlMsICJwOV9jbGllbnRfYXR0cndhbGsgZmFpbGVkICV6ZFxuIiwKIAkJCSByZXR2YWwpOwotCQlhdHRyX2ZpZCA9IE5VTEw7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCWlmICghYnVmZmVyX3NpemUpIHsKLQkJLyogcmVxdWVzdCB0byBnZXQgdGhlIGF0dHJfc2l6ZSAqLwotCQlyZXR2YWwgPSBhdHRyX3NpemU7Ci0JCWdvdG8gZXJyb3I7CisJCXJldHVybiByZXR2YWw7CiAJfQogCWlmIChhdHRyX3NpemUgPiBidWZmZXJfc2l6ZSkgewotCQlyZXR2YWwgPSAtRVJBTkdFOwotCQlnb3RvIGVycm9yOwotCX0KLQltc2l6ZSA9IGF0dHJfZmlkLT5jbG50LT5tc2l6ZTsKLQl3aGlsZSAoYXR0cl9zaXplKSB7Ci0JCWlmIChhdHRyX3NpemUgPiAobXNpemUgLSBQOV9JT0hEUlNaKSkKLQkJCXJlYWRfY291bnQgPSBtc2l6ZSAtIFA5X0lPSERSU1o7CisJCWlmICghYnVmZmVyX3NpemUpIC8qIHJlcXVlc3QgdG8gZ2V0IHRoZSBhdHRyX3NpemUgKi8KKwkJCXJldHZhbCA9IGF0dHJfc2l6ZTsKIAkJZWxzZQotCQkJcmVhZF9jb3VudCA9IGF0dHJfc2l6ZTsKLQkJcmVhZF9jb3VudCA9IHA5X2NsaWVudF9yZWFkKGF0dHJfZmlkLCAoKGNoYXIgKilidWZmZXIpK29mZnNldCwKLQkJCQkJTlVMTCwgb2Zmc2V0LCByZWFkX2NvdW50KTsKLQkJaWYgKHJlYWRfY291bnQgPCAwKSB7Ci0JCQkvKiBlcnJvciBpbiB4YXR0ciByZWFkICovCi0JCQlyZXR2YWwgPSByZWFkX2NvdW50OwotCQkJZ290byBlcnJvcjsKLQkJfQotCQlvZmZzZXQgKz0gcmVhZF9jb3VudDsKLQkJYXR0cl9zaXplIC09IHJlYWRfY291bnQ7CisJCQlyZXR2YWwgPSAtRVJBTkdFOworCX0gZWxzZSB7CisJCWlvdl9pdGVyX3RydW5jYXRlKCZ0bywgYXR0cl9zaXplKTsKKwkJcmV0dmFsID0gcDlfY2xpZW50X3JlYWQoYXR0cl9maWQsIDAsICZ0bywgJmVycik7CisJCWlmIChlcnIpCisJCQlyZXR2YWwgPSBlcnI7CiAJfQotCS8qIFRvdGFsIHJlYWQgeGF0dHIgYnl0ZXMgKi8KLQlyZXR2YWwgPSBvZmZzZXQ7Ci1lcnJvcjoKLQlpZiAoYXR0cl9maWQpCi0JCXA5X2NsaWVudF9jbHVuayhhdHRyX2ZpZCk7CisJcDlfY2xpZW50X2NsdW5rKGF0dHJfZmlkKTsKIAlyZXR1cm4gcmV0dmFsOwotCiB9CiAKIApAQCAtMTIwLDggKzEwNSwxMSBAQAogaW50IHY5ZnNfZmlkX3hhdHRyX3NldChzdHJ1Y3QgcDlfZmlkICpmaWQsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3QgdmFsdWVfbGVuLCBpbnQgZmxhZ3MpCiB7Ci0JdTY0IG9mZnNldCA9IDA7Ci0JaW50IHJldHZhbCwgbXNpemUsIHdyaXRlX2NvdW50OworCXN0cnVjdCBrdmVjIGt2ZWMgPSB7Lmlvdl9iYXNlID0gKHZvaWQgKil2YWx1ZSwgLmlvdl9sZW4gPSB2YWx1ZV9sZW59OworCXN0cnVjdCBpb3ZfaXRlciBmcm9tOworCWludCByZXR2YWw7CisKKwlpb3ZfaXRlcl9rdmVjKCZmcm9tLCBXUklURSB8IElURVJfS1ZFQywgJmt2ZWMsIDEsIHZhbHVlX2xlbik7CiAKIAlwOV9kZWJ1ZyhQOV9ERUJVR19WRlMsICJuYW1lID0gJXMgdmFsdWVfbGVuID0gJXp1IGZsYWdzID0gJWRcbiIsCiAJCSBuYW1lLCB2YWx1ZV9sZW4sIGZsYWdzKTsKQEAgLTEzNSwyOSArMTIzLDExIEBACiAJICogT24gc3VjY2VzcyBmaWQgcG9pbnRzIHRvIHhhdHRyCiAJICovCiAJcmV0dmFsID0gcDlfY2xpZW50X3hhdHRyY3JlYXRlKGZpZCwgbmFtZSwgdmFsdWVfbGVuLCBmbGFncyk7Ci0JaWYgKHJldHZhbCA8IDApIHsKKwlpZiAocmV0dmFsIDwgMCkKIAkJcDlfZGVidWcoUDlfREVCVUdfVkZTLCAicDlfY2xpZW50X3hhdHRyY3JlYXRlIGZhaWxlZCAlZFxuIiwKIAkJCSByZXR2YWwpOwotCQlnb3RvIGVycjsKLQl9Ci0JbXNpemUgPSBmaWQtPmNsbnQtPm1zaXplOwotCXdoaWxlICh2YWx1ZV9sZW4pIHsKLQkJaWYgKHZhbHVlX2xlbiA+IChtc2l6ZSAtIFA5X0lPSERSU1opKQotCQkJd3JpdGVfY291bnQgPSBtc2l6ZSAtIFA5X0lPSERSU1o7Ci0JCWVsc2UKLQkJCXdyaXRlX2NvdW50ID0gdmFsdWVfbGVuOwotCQl3cml0ZV9jb3VudCA9IHA5X2NsaWVudF93cml0ZShmaWQsICgoY2hhciAqKXZhbHVlKStvZmZzZXQsCi0JCQkJCU5VTEwsIG9mZnNldCwgd3JpdGVfY291bnQpOwotCQlpZiAod3JpdGVfY291bnQgPCAwKSB7Ci0JCQkvKiBlcnJvciBpbiB4YXR0ciB3cml0ZSAqLwotCQkJcmV0dmFsID0gd3JpdGVfY291bnQ7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlvZmZzZXQgKz0gd3JpdGVfY291bnQ7Ci0JCXZhbHVlX2xlbiAtPSB3cml0ZV9jb3VudDsKLQl9Ci0JcmV0dmFsID0gMDsKLWVycjoKKwllbHNlCisJCXA5X2NsaWVudF93cml0ZShmaWQsIDAsICZmcm9tLCAmcmV0dmFsKTsKIAlwOV9jbGllbnRfY2x1bmsoZmlkKTsKIAlyZXR1cm4gcmV0dmFsOwogfQpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZy5iaW5mbXQgYi9mcy9LY29uZmlnLmJpbmZtdAppbmRleCAyNzBjNDgxLi4yZDBjYmJkIDEwMDY0NAotLS0gYS9mcy9LY29uZmlnLmJpbmZtdAorKysgYi9mcy9LY29uZmlnLmJpbmZtdApAQCAtMjcsOSArMjcsNiBAQAogCWJvb2wKIAlkZXBlbmRzIG9uIENPTVBBVCAmJiBCSU5GTVRfRUxGCiAKLWNvbmZpZyBBUkNIX0JJTkZNVF9FTEZfUkFORE9NSVpFX1BJRQotCWJvb2wKLQogY29uZmlnIEFSQ0hfQklORk1UX0VMRl9TVEFURQogCWJvb2wKIApkaWZmIC0tZ2l0IGEvZnMvTWFrZWZpbGUgYi9mcy9NYWtlZmlsZQppbmRleCBhODhhYzQ4Li5jYjkyZmQ0IDEwMDY0NAotLS0gYS9mcy9NYWtlZmlsZQorKysgYi9mcy9NYWtlZmlsZQpAQCAtMTE4LDYgKzExOCw3IEBACiBvYmotJChDT05GSUdfSFBQRlMpCQkrPSBocHBmcy8KIG9iai0kKENPTkZJR19DQUNIRUZJTEVTKQkrPSBjYWNoZWZpbGVzLwogb2JqLSQoQ09ORklHX0RFQlVHX0ZTKQkJKz0gZGVidWdmcy8KK29iai0kKENPTkZJR19UUkFDSU5HKQkJKz0gdHJhY2Vmcy8KIG9iai0kKENPTkZJR19PQ0ZTMl9GUykJCSs9IG9jZnMyLwogb2JqLSQoQ09ORklHX0JUUkZTX0ZTKQkJKz0gYnRyZnMvCiBvYmotJChDT05GSUdfR0ZTMl9GUykgICAgICAgICAgICs9IGdmczIvCmRpZmYgLS1naXQgYS9mcy9hZGZzL2ZpbGUuYyBiL2ZzL2FkZnMvZmlsZS5jCmluZGV4IDA3YzllZGMuLjQ2YzBkNTYgMTAwNjQ0Ci0tLSBhL2ZzL2FkZnMvZmlsZS5jCisrKyBiL2ZzL2FkZnMvZmlsZS5jCkBAIC0yMywxMSArMjMsOSBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFkZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAogCS5mc3luYwkJPSBnZW5lcmljX2ZpbGVfZnN5bmMsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLAogfTsKZGlmZiAtLWdpdCBhL2ZzL2FmZnMvZmlsZS5jIGIvZnMvYWZmcy9maWxlLmMKaW5kZXggZDI0NjhiZi4uN2MxYTNkNCAxMDA2NDQKLS0tIGEvZnMvYWZmcy9maWxlLmMKKysrIGIvZnMvYWZmcy9maWxlLmMKQEAgLTEyLDcgKzEyLDcgQEAKICAqICBhZmZzIHJlZ3VsYXIgZmlsZSBoYW5kbGluZyBwcmltaXRpdmVzCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgImFmZnMuaCIKIAogc3RhdGljIHN0cnVjdCBidWZmZXJfaGVhZCAqYWZmc19nZXRfZXh0YmxvY2tfc2xvdyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1MzIgZXh0KTsKQEAgLTY5OSw4ICs2OTksMTAgQEAKIAlib2ZmID0gdG1wICUgYnNpemU7CiAJaWYgKGJvZmYpIHsKIAkJYmggPSBhZmZzX2JyZWFkX2lubyhpbm9kZSwgYmlkeCwgMCk7Ci0JCWlmIChJU19FUlIoYmgpKQotCQkJcmV0dXJuIFBUUl9FUlIoYmgpOworCQlpZiAoSVNfRVJSKGJoKSkgeworCQkJd3JpdHRlbiA9IFBUUl9FUlIoYmgpOworCQkJZ290byBlcnJfZmlyc3RfYmg7CisJCX0KIAkJdG1wID0gbWluKGJzaXplIC0gYm9mZiwgdG8gLSBmcm9tKTsKIAkJQlVHX09OKGJvZmYgKyB0bXAgPiBic2l6ZSB8fCB0bXAgPiBic2l6ZSk7CiAJCW1lbWNweShBRkZTX0RBVEEoYmgpICsgYm9mZiwgZGF0YSArIGZyb20sIHRtcCk7CkBAIC03MTIsMTQgKzcxNCwxNiBAQAogCQliaWR4Kys7CiAJfSBlbHNlIGlmIChiaWR4KSB7CiAJCWJoID0gYWZmc19icmVhZF9pbm8oaW5vZGUsIGJpZHggLSAxLCAwKTsKLQkJaWYgKElTX0VSUihiaCkpCi0JCQlyZXR1cm4gUFRSX0VSUihiaCk7CisJCWlmIChJU19FUlIoYmgpKSB7CisJCQl3cml0dGVuID0gUFRSX0VSUihiaCk7CisJCQlnb3RvIGVycl9maXJzdF9iaDsKKwkJfQogCX0KIAl3aGlsZSAoZnJvbSArIGJzaXplIDw9IHRvKSB7CiAJCXByZXZfYmggPSBiaDsKIAkJYmggPSBhZmZzX2dldGVtcHR5YmxrX2lubyhpbm9kZSwgYmlkeCk7CiAJCWlmIChJU19FUlIoYmgpKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIGVycl9iaDsKIAkJbWVtY3B5KEFGRlNfREFUQShiaCksIGRhdGEgKyBmcm9tLCBic2l6ZSk7CiAJCWlmIChidWZmZXJfbmV3KGJoKSkgewogCQkJQUZGU19EQVRBX0hFQUQoYmgpLT5wdHlwZSA9IGNwdV90b19iZTMyKFRfREFUQSk7CkBAIC03NTEsNyArNzU1LDcgQEAKIAkJcHJldl9iaCA9IGJoOwogCQliaCA9IGFmZnNfYnJlYWRfaW5vKGlub2RlLCBiaWR4LCAxKTsKIAkJaWYgKElTX0VSUihiaCkpCi0JCQlnb3RvIG91dDsKKwkJCWdvdG8gZXJyX2JoOwogCQl0bXAgPSBtaW4oYnNpemUsIHRvIC0gZnJvbSk7CiAJCUJVR19PTih0bXAgPiBic2l6ZSk7CiAJCW1lbWNweShBRkZTX0RBVEEoYmgpLCBkYXRhICsgZnJvbSwgdG1wKTsKQEAgLTc5MCwxMiArNzk0LDEzIEBACiAJaWYgKHRtcCA+IGlub2RlLT5pX3NpemUpCiAJCWlub2RlLT5pX3NpemUgPSBBRkZTX0koaW5vZGUpLT5tbXVfcHJpdmF0ZSA9IHRtcDsKIAorZXJyX2ZpcnN0X2JoOgogCXVubG9ja19wYWdlKHBhZ2UpOwogCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAogCXJldHVybiB3cml0dGVuOwogCi1vdXQ6CitlcnJfYmg6CiAJYmggPSBwcmV2X2JoOwogCWlmICghd3JpdHRlbikKIAkJd3JpdHRlbiA9IFBUUl9FUlIoYmgpOwpAQCAtOTY0LDkgKzk2OSw3IEBACiB9CiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFmZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAogCS5vcGVuCQk9IGFmZnNfZmlsZV9vcGVuLApkaWZmIC0tZ2l0IGEvZnMvYWZzL2ZpbGUuYyBiL2ZzL2Fmcy9maWxlLmMKaW5kZXggOTMyY2UwNy4uOTk5YmMzYyAxMDA2NDQKLS0tIGEvZnMvYWZzL2ZpbGUuYworKysgYi9mcy9hZnMvZmlsZS5jCkBAIC0zMSw4ICszMSw2IEBACiAJLm9wZW4JCT0gYWZzX29wZW4sCiAJLnJlbGVhc2UJPSBhZnNfcmVsZWFzZSwKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCiAJLndyaXRlX2l0ZXIJPSBhZnNfZmlsZV93cml0ZSwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfcmVhZG9ubHlfbW1hcCwKZGlmZiAtLWdpdCBhL2ZzL2Fmcy9taXNjLmMgYi9mcy9hZnMvbWlzYy5jCmluZGV4IDBkZDRkYWYuLjkxZWExYWEgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9taXNjLmMKKysrIGIvZnMvYWZzL21pc2MuYwpAQCAtMjIsOSArMjIsMTIgQEAKIGludCBhZnNfYWJvcnRfdG9fZXJyb3IodTMyIGFib3J0X2NvZGUpCiB7CiAJc3dpdGNoIChhYm9ydF9jb2RlKSB7CisJLyogbG93IGVycm5vIGNvZGVzIGluc2VydGVkIGludG8gYWJvcnQgbmFtZXNwYWNlICovCiAJY2FzZSAxMzoJCXJldHVybiAtRUFDQ0VTOwogCWNhc2UgMjc6CQlyZXR1cm4gLUVGQklHOwogCWNhc2UgMzA6CQlyZXR1cm4gLUVST0ZTOworCisJLyogVklDRSAic3BlY2lhbCBlcnJvciIgY29kZXM7IDEwMSAtIDExMSAqLwogCWNhc2UgVlNBTFZBR0U6CQlyZXR1cm4gLUVJTzsKIAljYXNlIFZOT1ZOT0RFOgkJcmV0dXJuIC1FTk9FTlQ7CiAJY2FzZSBWTk9WT0w6CQlyZXR1cm4gLUVOT01FRElVTTsKQEAgLTM2LDExICszOSwxOCBAQAogCWNhc2UgVk9WRVJRVU9UQToJcmV0dXJuIC1FRFFVT1Q7CiAJY2FzZSBWQlVTWToJCXJldHVybiAtRUJVU1k7CiAJY2FzZSBWTU9WRUQ6CQlyZXR1cm4gLUVOWElPOwotCWNhc2UgMHgyZjZkZjBhOgkJcmV0dXJuIC1FV09VTERCTE9DSzsKKworCS8qIFVuaWZpZWQgQUZTIGVycm9yIHRhYmxlOyBFVCAidWFlIiA9PSAweDJmNmRmMDAgKi8KKwljYXNlIDB4MmY2ZGYwMDoJCXJldHVybiAtRVBFUk07CisJY2FzZSAweDJmNmRmMDE6CQlyZXR1cm4gLUVOT0VOVDsKKwljYXNlIDB4MmY2ZGYwNDoJCXJldHVybiAtRUlPOworCWNhc2UgMHgyZjZkZjBhOgkJcmV0dXJuIC1FQUdBSU47CisJY2FzZSAweDJmNmRmMGI6CQlyZXR1cm4gLUVOT01FTTsKIAljYXNlIDB4MmY2ZGYwYzoJCXJldHVybiAtRUFDQ0VTOwogCWNhc2UgMHgyZjZkZjBmOgkJcmV0dXJuIC1FQlVTWTsKIAljYXNlIDB4MmY2ZGYxMDoJCXJldHVybiAtRUVYSVNUOwogCWNhc2UgMHgyZjZkZjExOgkJcmV0dXJuIC1FWERFVjsKKwljYXNlIDB4MmY2ZGYxMjoJCXJldHVybiAtRU5PREVWOwogCWNhc2UgMHgyZjZkZjEzOgkJcmV0dXJuIC1FTk9URElSOwogCWNhc2UgMHgyZjZkZjE0OgkJcmV0dXJuIC1FSVNESVI7CiAJY2FzZSAweDJmNmRmMTU6CQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU0LDggKzY0LDEyIEBACiAJY2FzZSAweDJmNmRmMjM6CQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKIAljYXNlIDB4MmY2ZGYyNDoJCXJldHVybiAtRU5PTENLOwogCWNhc2UgMHgyZjZkZjI2OgkJcmV0dXJuIC1FTk9URU1QVFk7CisJY2FzZSAweDJmNmRmMjg6CQlyZXR1cm4gLUVXT1VMREJMT0NLOworCWNhc2UgMHgyZjZkZjY5OgkJcmV0dXJuIC1FTk9UQ09OTjsKKwljYXNlIDB4MmY2ZGY2YzoJCXJldHVybiAtRVRJTUVET1VUOwogCWNhc2UgMHgyZjZkZjc4OgkJcmV0dXJuIC1FRFFVT1Q7CiAKKwkvKiBSWEtBRCBhYm9ydCBjb2RlczsgZnJvbSBpbmNsdWRlL3J4cnBjL3BhY2tldC5oLiAgRVQgIlJYSyIgPT0gMHgxMjYwQjAwICovCiAJY2FzZSBSWEtBRElOQ09OU0lTVEVOQ1k6IHJldHVybiAtRVBST1RPOwogCWNhc2UgUlhLQURQQUNLRVRTSE9SVDoJcmV0dXJuIC1FUFJPVE87CiAJY2FzZSBSWEtBRExFVkVMRkFJTDoJcmV0dXJuIC1FS0VZUkVKRUNURUQ7CmRpZmYgLS1naXQgYS9mcy9hZnMvcnhycGMuYyBiL2ZzL2Fmcy9yeHJwYy5jCmluZGV4IGRiYzczMmUuLjNhNTdhMWIgMTAwNjQ0Ci0tLSBhL2ZzL2Fmcy9yeHJwYy5jCisrKyBiL2ZzL2Fmcy9yeHJwYy5jCkBAIC03NzAsMTUgKzc3MCwxMiBAQAogdm9pZCBhZnNfc2VuZF9lbXB0eV9yZXBseShzdHJ1Y3QgYWZzX2NhbGwgKmNhbGwpCiB7CiAJc3RydWN0IG1zZ2hkciBtc2c7Ci0Jc3RydWN0IGt2ZWMgaW92WzFdOwogCiAJX2VudGVyKCIiKTsKIAotCWlvdlswXS5pb3ZfYmFzZQkJPSBOVUxMOwotCWlvdlswXS5pb3ZfbGVuCQk9IDA7CiAJbXNnLm1zZ19uYW1lCQk9IE5VTEw7CiAJbXNnLm1zZ19uYW1lbGVuCQk9IDA7Ci0JaW92X2l0ZXJfa3ZlYygmbXNnLm1zZ19pdGVyLCBXUklURSB8IElURVJfS1ZFQywgaW92LCAwLCAwKTsJLyogV1RGPyAqLworCWlvdl9pdGVyX2t2ZWMoJm1zZy5tc2dfaXRlciwgV1JJVEUgfCBJVEVSX0tWRUMsIE5VTEwsIDAsIDApOwogCW1zZy5tc2dfY29udHJvbAkJPSBOVUxMOwogCW1zZy5tc2dfY29udHJvbGxlbgk9IDA7CiAJbXNnLm1zZ19mbGFncwkJPSAwOwpkaWZmIC0tZ2l0IGEvZnMvYWZzL3dyaXRlLmMgYi9mcy9hZnMvd3JpdGUuYwppbmRleCBjMTNjYjA4Li4wNzE0YWJjIDEwMDY0NAotLS0gYS9mcy9hZnMvd3JpdGUuYworKysgYi9mcy9hZnMvd3JpdGUuYwpAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogc3RhdGljIGludCBhZnNfd3JpdGVfYmFja19mcm9tX2xvY2tlZF9wYWdlKHN0cnVjdCBhZnNfd3JpdGViYWNrICp3YiwKZGlmZiAtLWdpdCBhL2ZzL2Fpby5jIGIvZnMvYWlvLmMKaW5kZXggZjhlNTJhMS4uNTc4NWM0YiAxMDA2NDQKLS0tIGEvZnMvYWlvLmMKKysrIGIvZnMvYWlvLmMKQEAgLTE1MSw2ICsxNTEsMzggQEAKIAl1bnNpZ25lZAkJaWQ7CiB9OwogCisvKgorICogV2UgdXNlIGtpX2NhbmNlbCA9PSBLSU9DQl9DQU5DRUxMRUQgdG8gaW5kaWNhdGUgdGhhdCBhIGtpb2NiIGhhcyBiZWVuIGVpdGhlcgorICogY2FuY2VsbGVkIG9yIGNvbXBsZXRlZCAodGhpcyBtYWtlcyBhIGNlcnRhaW4gYW1vdW50IG9mIHNlbnNlIGJlY2F1c2UKKyAqIHN1Y2Nlc3NmdWwgY2FuY2VsbGF0aW9uIC0gaW9fY2FuY2VsKCkgLSBkb2VzIGRlbGl2ZXIgdGhlIGNvbXBsZXRpb24gdG8KKyAqIHVzZXJzcGFjZSkuCisgKgorICogQW5kIHNpbmNlIG1vc3QgdGhpbmdzIGRvbid0IGltcGxlbWVudCBraW9jYiBjYW5jZWxsYXRpb24gYW5kIHdlJ2QgcmVhbGx5IGxpa2UKKyAqIGtpb2NiIGNvbXBsZXRpb24gdG8gYmUgbG9ja2xlc3Mgd2hlbiBwb3NzaWJsZSwgd2UgdXNlIGtpX2NhbmNlbCB0bworICogc3luY2hyb25pemUgY2FuY2VsbGF0aW9uIGFuZCBjb21wbGV0aW9uIC0gd2Ugb25seSBzZXQgaXQgdG8gS0lPQ0JfQ0FOQ0VMTEVECisgKiB3aXRoIHhjaGcoKSBvciBjbXB4Y2hnKCksIHNlZSBiYXRjaF9jb21wbGV0ZV9haW8oKSBhbmQga2lvY2JfY2FuY2VsKCkuCisgKi8KKyNkZWZpbmUgS0lPQ0JfQ0FOQ0VMTEVECQkoKHZvaWQgKikgKH4wVUxMKSkKKworc3RydWN0IGFpb19raW9jYiB7CisJc3RydWN0IGtpb2NiCQljb21tb247CisKKwlzdHJ1Y3Qga2lvY3R4CQkqa2lfY3R4OworCWtpb2NiX2NhbmNlbF9mbgkJKmtpX2NhbmNlbDsKKworCXN0cnVjdCBpb2NiIF9fdXNlcgkqa2lfdXNlcl9pb2NiOwkvKiB1c2VyJ3MgYWlvY2IgKi8KKwlfX3U2NAkJCWtpX3VzZXJfZGF0YTsJLyogdXNlcidzIGRhdGEgZm9yIGNvbXBsZXRpb24gKi8KKworCXN0cnVjdCBsaXN0X2hlYWQJa2lfbGlzdDsJLyogdGhlIGFpbyBjb3JlIHVzZXMgdGhpcworCQkJCQkJICogZm9yIGNhbmNlbGxhdGlvbiAqLworCisJLyoKKwkgKiBJZiB0aGUgYWlvX3Jlc2ZkIGZpZWxkIG9mIHRoZSB1c2Vyc3BhY2UgaW9jYiBpcyBub3QgemVybywKKwkgKiB0aGlzIGlzIHRoZSB1bmRlcmx5aW5nIGV2ZW50ZmQgY29udGV4dCB0byBkZWxpdmVyIGV2ZW50cyB0by4KKwkgKi8KKwlzdHJ1Y3QgZXZlbnRmZF9jdHgJKmtpX2V2ZW50ZmQ7Cit9OworCiAvKi0tLS0tLSBzeXNjdGwgdmFyaWFibGVzLS0tLSovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFpb19ucl9sb2NrKTsKIHVuc2lnbmVkIGxvbmcgYWlvX25yOwkJLyogY3VycmVudCBzeXN0ZW0gd2lkZSBudW1iZXIgb2YgYWlvIHJlcXVlc3RzICovCkBAIC0yMjAsNyArMjUyLDcgQEAKIAlpZiAoSVNfRVJSKGFpb19tbnQpKQogCQlwYW5pYygiRmFpbGVkIHRvIGNyZWF0ZSBhaW8gZnMgbW91bnQuIik7CiAKLQlraW9jYl9jYWNoZXAgPSBLTUVNX0NBQ0hFKGtpb2NiLCBTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQyk7CisJa2lvY2JfY2FjaGVwID0gS01FTV9DQUNIRShhaW9fa2lvY2IsIFNMQUJfSFdDQUNIRV9BTElHTnxTTEFCX1BBTklDKTsKIAlraW9jdHhfY2FjaGVwID0gS01FTV9DQUNIRShraW9jdHgsU0xBQl9IV0NBQ0hFX0FMSUdOfFNMQUJfUEFOSUMpOwogCiAJcHJfZGVidWcoInNpemVvZihzdHJ1Y3QgcGFnZSkgPSAlenVcbiIsIHNpemVvZihzdHJ1Y3QgcGFnZSkpOwpAQCAtMjc4LDExICszMTAsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYWlvX3JpbmdfcmVtYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQorc3RhdGljIGludCBhaW9fcmluZ19yZW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOwogCXN0cnVjdCBraW9jdHhfdGFibGUgKnRhYmxlOwotCWludCBpOworCWludCBpLCByZXMgPSAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrKCZtbS0+aW9jdHhfbG9jayk7CiAJcmN1X3JlYWRfbG9jaygpOwpAQCAtMjkyLDEzICszMjQsMTcgQEAKIAogCQljdHggPSB0YWJsZS0+dGFibGVbaV07CiAJCWlmIChjdHggJiYgY3R4LT5haW9fcmluZ19maWxlID09IGZpbGUpIHsKLQkJCWN0eC0+dXNlcl9pZCA9IGN0eC0+bW1hcF9iYXNlID0gdm1hLT52bV9zdGFydDsKKwkJCWlmICghYXRvbWljX3JlYWQoJmN0eC0+ZGVhZCkpIHsKKwkJCQljdHgtPnVzZXJfaWQgPSBjdHgtPm1tYXBfYmFzZSA9IHZtYS0+dm1fc3RhcnQ7CisJCQkJcmVzID0gMDsKKwkJCX0KIAkJCWJyZWFrOwogCQl9CiAJfQogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJc3Bpbl91bmxvY2soJm1tLT5pb2N0eF9sb2NrKTsKKwlyZXR1cm4gcmVzOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhaW9fcmluZ19mb3BzID0gewpAQCAtNDgwLDggKzUxNiw5IEBACiAjZGVmaW5lIEFJT19FVkVOVFNfRklSU1RfUEFHRQkoKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgYWlvX3JpbmcpKSAvIHNpemVvZihzdHJ1Y3QgaW9fZXZlbnQpKQogI2RlZmluZSBBSU9fRVZFTlRTX09GRlNFVAkoQUlPX0VWRU5UU19QRVJfUEFHRSAtIEFJT19FVkVOVFNfRklSU1RfUEFHRSkKIAotdm9pZCBraW9jYl9zZXRfY2FuY2VsX2ZuKHN0cnVjdCBraW9jYiAqcmVxLCBraW9jYl9jYW5jZWxfZm4gKmNhbmNlbCkKK3ZvaWQga2lvY2Jfc2V0X2NhbmNlbF9mbihzdHJ1Y3Qga2lvY2IgKmlvY2IsIGtpb2NiX2NhbmNlbF9mbiAqY2FuY2VsKQogeworCXN0cnVjdCBhaW9fa2lvY2IgKnJlcSA9IGNvbnRhaW5lcl9vZihpb2NiLCBzdHJ1Y3QgYWlvX2tpb2NiLCBjb21tb24pOwogCXN0cnVjdCBraW9jdHggKmN0eCA9IHJlcS0+a2lfY3R4OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTQ5Niw3ICs1MzMsNyBAQAogfQogRVhQT1JUX1NZTUJPTChraW9jYl9zZXRfY2FuY2VsX2ZuKTsKIAotc3RhdGljIGludCBraW9jYl9jYW5jZWwoc3RydWN0IGtpb2NiICpraW9jYikKK3N0YXRpYyBpbnQga2lvY2JfY2FuY2VsKHN0cnVjdCBhaW9fa2lvY2IgKmtpb2NiKQogewogCWtpb2NiX2NhbmNlbF9mbiAqb2xkLCAqY2FuY2VsOwogCkBAIC01MTQsNyArNTUxLDcgQEAKIAkJY2FuY2VsID0gY21weGNoZygma2lvY2ItPmtpX2NhbmNlbCwgb2xkLCBLSU9DQl9DQU5DRUxMRUQpOwogCX0gd2hpbGUgKGNhbmNlbCAhPSBvbGQpOwogCi0JcmV0dXJuIGNhbmNlbChraW9jYik7CisJcmV0dXJuIGNhbmNlbCgma2lvY2ItPmNvbW1vbik7CiB9CiAKIHN0YXRpYyB2b2lkIGZyZWVfaW9jdHgoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNTUwLDEzICs1ODcsMTMgQEAKIHN0YXRpYyB2b2lkIGZyZWVfaW9jdHhfdXNlcnMoc3RydWN0IHBlcmNwdV9yZWYgKnJlZikKIHsKIAlzdHJ1Y3Qga2lvY3R4ICpjdHggPSBjb250YWluZXJfb2YocmVmLCBzdHJ1Y3Qga2lvY3R4LCB1c2Vycyk7Ci0Jc3RydWN0IGtpb2NiICpyZXE7CisJc3RydWN0IGFpb19raW9jYiAqcmVxOwogCiAJc3Bpbl9sb2NrX2lycSgmY3R4LT5jdHhfbG9jayk7CiAKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmN0eC0+YWN0aXZlX3JlcXMpKSB7CiAJCXJlcSA9IGxpc3RfZmlyc3RfZW50cnkoJmN0eC0+YWN0aXZlX3JlcXMsCi0JCQkJICAgICAgIHN0cnVjdCBraW9jYiwga2lfbGlzdCk7CisJCQkJICAgICAgIHN0cnVjdCBhaW9fa2lvY2IsIGtpX2xpc3QpOwogCiAJCWxpc3RfZGVsX2luaXQoJnJlcS0+a2lfbGlzdCk7CiAJCWtpb2NiX2NhbmNlbChyZXEpOwpAQCAtNjU1LDggKzY5Miw3IEBACiAJbnJfZXZlbnRzICo9IDI7CiAKIAkvKiBQcmV2ZW50IG92ZXJmbG93cyAqLwotCWlmICgobnJfZXZlbnRzID4gKDB4MTAwMDAwMDBVIC8gc2l6ZW9mKHN0cnVjdCBpb19ldmVudCkpKSB8fAotCSAgICAobnJfZXZlbnRzID4gKDB4MTAwMDAwMDBVIC8gc2l6ZW9mKHN0cnVjdCBraW9jYikpKSkgeworCWlmIChucl9ldmVudHMgPiAoMHgxMDAwMDAwMFUgLyBzaXplb2Yoc3RydWN0IGlvX2V2ZW50KSkpIHsKIAkJcHJfZGVidWcoIkVOT01FTTogbnJfZXZlbnRzIHRvbyBoaWdoXG4iKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQpAQCAtNzI3LDYgKzc2Myw5IEBACiBlcnJfY2xlYW51cDoKIAlhaW9fbnJfc3ViKGN0eC0+bWF4X3JlcXMpOwogZXJyX2N0eDoKKwlhdG9taWNfc2V0KCZjdHgtPmRlYWQsIDEpOworCWlmIChjdHgtPm1tYXBfc2l6ZSkKKwkJdm1fbXVubWFwKGN0eC0+bW1hcF9iYXNlLCBjdHgtPm1tYXBfc2l6ZSk7CiAJYWlvX2ZyZWVfcmluZyhjdHgpOwogZXJyOgogCW11dGV4X3VubG9jaygmY3R4LT5yaW5nX2xvY2spOwpAQCAtNzQ4LDExICs3ODcsMTIgQEAKIHsKIAlzdHJ1Y3Qga2lvY3R4X3RhYmxlICp0YWJsZTsKIAotCWlmIChhdG9taWNfeGNoZygmY3R4LT5kZWFkLCAxKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQogCXNwaW5fbG9jaygmbW0tPmlvY3R4X2xvY2spOworCWlmIChhdG9taWNfeGNoZygmY3R4LT5kZWFkLCAxKSkgeworCQlzcGluX3VubG9jaygmbW0tPmlvY3R4X2xvY2spOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAl0YWJsZSA9IHJjdV9kZXJlZmVyZW5jZV9yYXcobW0tPmlvY3R4X3RhYmxlKTsKIAlXQVJOX09OKGN0eCAhPSB0YWJsZS0+dGFibGVbY3R4LT5pZF0pOwogCXRhYmxlLT50YWJsZVtjdHgtPmlkXSA9IE5VTEw7CkBAIC03NzgsMjIgKzgxOCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIHdhaXRfb25fc3luY19raW9jYjoKLSAqCVdhaXRzIG9uIHRoZSBnaXZlbiBzeW5jIGtpb2NiIHRvIGNvbXBsZXRlLgotICovCi1zc2l6ZV90IHdhaXRfb25fc3luY19raW9jYihzdHJ1Y3Qga2lvY2IgKnJlcSkKLXsKLQl3aGlsZSAoIXJlcS0+a2lfY3R4KSB7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHJlcS0+a2lfY3R4KQotCQkJYnJlYWs7Ci0JCWlvX3NjaGVkdWxlKCk7Ci0JfQotCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQlyZXR1cm4gcmVxLT5raV91c2VyX2RhdGE7Ci19Ci1FWFBPUlRfU1lNQk9MKHdhaXRfb25fc3luY19raW9jYik7Ci0KIC8qCiAgKiBleGl0X2FpbzogY2FsbGVkIHdoZW4gdGhlIGxhc3QgdXNlciBvZiBtbSBnb2VzIGF3YXkuICBBdCB0aGlzIHBvaW50LCB0aGVyZSBpcwogICogbm8gd2F5IGZvciBhbnkgbmV3IHJlcXVlc3RzIHRvIGJlIHN1Ym1pdGVkIG9yIGFueSBvZiB0aGUgaW9fKiBzeXNjYWxscyB0byBiZQpAQCAtOTQ4LDkgKzk3Miw5IEBACiAgKglBbGxvY2F0ZSBhIHNsb3QgZm9yIGFuIGFpbyByZXF1ZXN0LgogICogUmV0dXJucyBOVUxMIGlmIG5vIHJlcXVlc3RzIGFyZSBmcmVlLgogICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBraW9jYiAqYWlvX2dldF9yZXEoc3RydWN0IGtpb2N0eCAqY3R4KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYWlvX2tpb2NiICphaW9fZ2V0X3JlcShzdHJ1Y3Qga2lvY3R4ICpjdHgpCiB7Ci0Jc3RydWN0IGtpb2NiICpyZXE7CisJc3RydWN0IGFpb19raW9jYiAqcmVxOwogCiAJaWYgKCFnZXRfcmVxc19hdmFpbGFibGUoY3R4KSkgewogCQl1c2VyX3JlZmlsbF9yZXFzX2F2YWlsYWJsZShjdHgpOwpAQCAtOTcxLDEwICs5OTUsMTAgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQga2lvY2JfZnJlZShzdHJ1Y3Qga2lvY2IgKnJlcSkKK3N0YXRpYyB2b2lkIGtpb2NiX2ZyZWUoc3RydWN0IGFpb19raW9jYiAqcmVxKQogewotCWlmIChyZXEtPmtpX2ZpbHApCi0JCWZwdXQocmVxLT5raV9maWxwKTsKKwlpZiAocmVxLT5jb21tb24ua2lfZmlscCkKKwkJZnB1dChyZXEtPmNvbW1vbi5raV9maWxwKTsKIAlpZiAocmVxLT5raV9ldmVudGZkICE9IE5VTEwpCiAJCWV2ZW50ZmRfY3R4X3B1dChyZXEtPmtpX2V2ZW50ZmQpOwogCWttZW1fY2FjaGVfZnJlZShraW9jYl9jYWNoZXAsIHJlcSk7CkBAIC0xMDEwLDggKzEwMzQsOSBAQAogLyogYWlvX2NvbXBsZXRlCiAgKglDYWxsZWQgd2hlbiB0aGUgaW8gcmVxdWVzdCBvbiB0aGUgZ2l2ZW4gaW9jYiBpcyBjb21wbGV0ZS4KICAqLwotdm9pZCBhaW9fY29tcGxldGUoc3RydWN0IGtpb2NiICppb2NiLCBsb25nIHJlcywgbG9uZyByZXMyKQorc3RhdGljIHZvaWQgYWlvX2NvbXBsZXRlKHN0cnVjdCBraW9jYiAqa2lvY2IsIGxvbmcgcmVzLCBsb25nIHJlczIpCiB7CisJc3RydWN0IGFpb19raW9jYiAqaW9jYiA9IGNvbnRhaW5lcl9vZihraW9jYiwgc3RydWN0IGFpb19raW9jYiwgY29tbW9uKTsKIAlzdHJ1Y3Qga2lvY3R4CSpjdHggPSBpb2NiLT5raV9jdHg7CiAJc3RydWN0IGFpb19yaW5nCSpyaW5nOwogCXN0cnVjdCBpb19ldmVudAkqZXZfcGFnZSwgKmV2ZW50OwpAQCAtMTAyNSwxMyArMTA1MCw3IEBACiAJICogICAgcmVmLCBubyBvdGhlciBwYXRocyBoYXZlIGEgd2F5IHRvIGdldCBhbm90aGVyIHJlZgogCSAqICAtIHRoZSBzeW5jIHRhc2sgaGVscGZ1bGx5IGxlZnQgYSByZWZlcmVuY2UgdG8gaXRzZWxmIGluIHRoZSBpb2NiCiAJICovCi0JaWYgKGlzX3N5bmNfa2lvY2IoaW9jYikpIHsKLQkJaW9jYi0+a2lfdXNlcl9kYXRhID0gcmVzOwotCQlzbXBfd21iKCk7Ci0JCWlvY2ItPmtpX2N0eCA9IEVSUl9QVFIoLUVYREVWKTsKLQkJd2FrZV91cF9wcm9jZXNzKGlvY2ItPmtpX29iai50c2spOwotCQlyZXR1cm47Ci0JfQorCUJVR19PTihpc19zeW5jX2tpb2NiKGtpb2NiKSk7CiAKIAlpZiAoaW9jYi0+a2lfbGlzdC5uZXh0KSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xMDU3LDcgKzEwNzYsNyBAQAogCWV2X3BhZ2UgPSBrbWFwX2F0b21pYyhjdHgtPnJpbmdfcGFnZXNbcG9zIC8gQUlPX0VWRU5UU19QRVJfUEFHRV0pOwogCWV2ZW50ID0gZXZfcGFnZSArIHBvcyAlIEFJT19FVkVOVFNfUEVSX1BBR0U7CiAKLQlldmVudC0+b2JqID0gKHU2NCkodW5zaWduZWQgbG9uZylpb2NiLT5raV9vYmoudXNlcjsKKwlldmVudC0+b2JqID0gKHU2NCkodW5zaWduZWQgbG9uZylpb2NiLT5raV91c2VyX2lvY2I7CiAJZXZlbnQtPmRhdGEgPSBpb2NiLT5raV91c2VyX2RhdGE7CiAJZXZlbnQtPnJlcyA9IHJlczsKIAlldmVudC0+cmVzMiA9IHJlczI7CkBAIC0xMDY2LDcgKzEwODUsNyBAQAogCWZsdXNoX2RjYWNoZV9wYWdlKGN0eC0+cmluZ19wYWdlc1twb3MgLyBBSU9fRVZFTlRTX1BFUl9QQUdFXSk7CiAKIAlwcl9kZWJ1ZygiJXBbJXVdOiAlcDogJXAgJUx4ICVseCAlbHhcbiIsCi0JCSBjdHgsIHRhaWwsIGlvY2IsIGlvY2ItPmtpX29iai51c2VyLCBpb2NiLT5raV91c2VyX2RhdGEsCisJCSBjdHgsIHRhaWwsIGlvY2IsIGlvY2ItPmtpX3VzZXJfaW9jYiwgaW9jYi0+a2lfdXNlcl9kYXRhLAogCQkgcmVzLCByZXMyKTsKIAogCS8qIGFmdGVyIGZsYWdnaW5nIHRoZSByZXF1ZXN0IGFzIGRvbmUsIHdlCkBAIC0xMTEzLDcgKzExMzIsNiBAQAogCiAJcGVyY3B1X3JlZl9wdXQoJmN0eC0+cmVxcyk7CiB9Ci1FWFBPUlRfU1lNQk9MKGFpb19jb21wbGV0ZSk7CiAKIC8qIGFpb19yZWFkX2V2ZW50c19yaW5nCiAgKglQdWxsIGFuIGV2ZW50IG9mZiBvZiB0aGUgaW9jdHgncyBldmVudCByaW5nLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mCkBAIC0xMzM3LDUwICsxMzU1LDIxIEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXR5cGVkZWYgc3NpemVfdCAoYWlvX3J3X29wKShzdHJ1Y3Qga2lvY2IgKiwgY29uc3Qgc3RydWN0IGlvdmVjICosCi0JCQkgICAgdW5zaWduZWQgbG9uZywgbG9mZl90KTsKIHR5cGVkZWYgc3NpemVfdCAocndfaXRlcl9vcCkoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKIAotc3RhdGljIHNzaXplX3QgYWlvX3NldHVwX3ZlY3RvcmVkX3J3KHN0cnVjdCBraW9jYiAqa2lvY2IsCi0JCQkJICAgICBpbnQgcncsIGNoYXIgX191c2VyICpidWYsCi0JCQkJICAgICB1bnNpZ25lZCBsb25nICpucl9zZWdzLAotCQkJCSAgICAgc3RydWN0IGlvdmVjICoqaW92ZWMsCi0JCQkJICAgICBib29sIGNvbXBhdCkKK3N0YXRpYyBpbnQgYWlvX3NldHVwX3ZlY3RvcmVkX3J3KGludCBydywgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJCQkgc3RydWN0IGlvdmVjICoqaW92ZWMsCisJCQkJIGJvb2wgY29tcGF0LAorCQkJCSBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIpCiB7Ci0Jc3NpemVfdCByZXQ7Ci0KLQkqbnJfc2VncyA9IGtpb2NiLT5raV9uYnl0ZXM7Ci0KICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJaWYgKGNvbXBhdCkKLQkJcmV0ID0gY29tcGF0X3J3X2NvcHlfY2hlY2tfdXZlY3RvcihydywKKwkJcmV0dXJuIGNvbXBhdF9pbXBvcnRfaW92ZWMocncsCiAJCQkJKHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICopYnVmLAotCQkJCSpucl9zZWdzLCBVSU9fRkFTVElPViwgKmlvdmVjLCBpb3ZlYyk7Ci0JZWxzZQorCQkJCWxlbiwgVUlPX0ZBU1RJT1YsIGlvdmVjLCBpdGVyKTsKICNlbmRpZgotCQlyZXQgPSByd19jb3B5X2NoZWNrX3V2ZWN0b3IocncsCi0JCQkJKHN0cnVjdCBpb3ZlYyBfX3VzZXIgKilidWYsCi0JCQkJKm5yX3NlZ3MsIFVJT19GQVNUSU9WLCAqaW92ZWMsIGlvdmVjKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIGtpX25ieXRlcyBub3cgcmVmbGVjdCBieXRlcyBpbnN0ZWFkIG9mIHNlZ3MgKi8KLQlraW9jYi0+a2lfbmJ5dGVzID0gcmV0OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3NpemVfdCBhaW9fc2V0dXBfc2luZ2xlX3ZlY3RvcihzdHJ1Y3Qga2lvY2IgKmtpb2NiLAotCQkJCSAgICAgICBpbnQgcncsIGNoYXIgX191c2VyICpidWYsCi0JCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgKm5yX3NlZ3MsCi0JCQkJICAgICAgIHN0cnVjdCBpb3ZlYyAqaW92ZWMpCi17Ci0JaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soIXJ3LCBidWYsIGtpb2NiLT5raV9uYnl0ZXMpKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlpb3ZlYy0+aW92X2Jhc2UgPSBidWY7Ci0JaW92ZWMtPmlvdl9sZW4gPSBraW9jYi0+a2lfbmJ5dGVzOwotCSpucl9zZWdzID0gMTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gaW1wb3J0X2lvdmVjKHJ3LCAoc3RydWN0IGlvdmVjIF9fdXNlciAqKWJ1ZiwKKwkJCQlsZW4sIFVJT19GQVNUSU9WLCBpb3ZlYywgaXRlcik7CiB9CiAKIC8qCkBAIC0xMzg4LDE0ICsxMzc3LDEyIEBACiAgKglQZXJmb3JtcyB0aGUgaW5pdGlhbCBjaGVja3MgYW5kIGlvIHN1Ym1pc3Npb24uCiAgKi8KIHN0YXRpYyBzc2l6ZV90IGFpb19ydW5faW9jYihzdHJ1Y3Qga2lvY2IgKnJlcSwgdW5zaWduZWQgb3Bjb2RlLAotCQkJICAgIGNoYXIgX191c2VyICpidWYsIGJvb2wgY29tcGF0KQorCQkJICAgIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGJvb2wgY29tcGF0KQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gcmVxLT5raV9maWxwOwogCXNzaXplX3QgcmV0OwotCXVuc2lnbmVkIGxvbmcgbnJfc2VnczsKIAlpbnQgcnc7CiAJZm1vZGVfdCBtb2RlOwotCWFpb19yd19vcCAqcndfb3A7CiAJcndfaXRlcl9vcCAqaXRlcl9vcDsKIAlzdHJ1Y3QgaW92ZWMgaW5saW5lX3ZlY3NbVUlPX0ZBU1RJT1ZdLCAqaW92ZWMgPSBpbmxpbmVfdmVjczsKIAlzdHJ1Y3QgaW92X2l0ZXIgaXRlcjsKQEAgLTE0MDUsNyArMTM5Miw2IEBACiAJY2FzZSBJT0NCX0NNRF9QUkVBRFY6CiAJCW1vZGUJPSBGTU9ERV9SRUFEOwogCQlydwk9IFJFQUQ7Ci0JCXJ3X29wCT0gZmlsZS0+Zl9vcC0+YWlvX3JlYWQ7CiAJCWl0ZXJfb3AJPSBmaWxlLT5mX29wLT5yZWFkX2l0ZXI7CiAJCWdvdG8gcndfY29tbW9uOwogCkBAIC0xNDEzLDUxICsxMzk5LDQwIEBACiAJY2FzZSBJT0NCX0NNRF9QV1JJVEVWOgogCQltb2RlCT0gRk1PREVfV1JJVEU7CiAJCXJ3CT0gV1JJVEU7Ci0JCXJ3X29wCT0gZmlsZS0+Zl9vcC0+YWlvX3dyaXRlOwogCQlpdGVyX29wCT0gZmlsZS0+Zl9vcC0+d3JpdGVfaXRlcjsKIAkJZ290byByd19jb21tb247CiByd19jb21tb246CiAJCWlmICh1bmxpa2VseSghKGZpbGUtPmZfbW9kZSAmIG1vZGUpKSkKIAkJCXJldHVybiAtRUJBREY7CiAKLQkJaWYgKCFyd19vcCAmJiAhaXRlcl9vcCkKKwkJaWYgKCFpdGVyX29wKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJcmV0ID0gKG9wY29kZSA9PSBJT0NCX0NNRF9QUkVBRFYgfHwKLQkJICAgICAgIG9wY29kZSA9PSBJT0NCX0NNRF9QV1JJVEVWKQotCQkJPyBhaW9fc2V0dXBfdmVjdG9yZWRfcncocmVxLCBydywgYnVmLCAmbnJfc2VncywKLQkJCQkJCSZpb3ZlYywgY29tcGF0KQotCQkJOiBhaW9fc2V0dXBfc2luZ2xlX3ZlY3RvcihyZXEsIHJ3LCBidWYsICZucl9zZWdzLAotCQkJCQkJICBpb3ZlYyk7CisJCWlmIChvcGNvZGUgPT0gSU9DQl9DTURfUFJFQURWIHx8IG9wY29kZSA9PSBJT0NCX0NNRF9QV1JJVEVWKQorCQkJcmV0ID0gYWlvX3NldHVwX3ZlY3RvcmVkX3J3KHJ3LCBidWYsIGxlbiwKKwkJCQkJCSZpb3ZlYywgY29tcGF0LCAmaXRlcik7CisJCWVsc2UgeworCQkJcmV0ID0gaW1wb3J0X3NpbmdsZV9yYW5nZShydywgYnVmLCBsZW4sIGlvdmVjLCAmaXRlcik7CisJCQlpb3ZlYyA9IE5VTEw7CisJCX0KIAkJaWYgKCFyZXQpCi0JCQlyZXQgPSByd192ZXJpZnlfYXJlYShydywgZmlsZSwgJnJlcS0+a2lfcG9zLCByZXEtPmtpX25ieXRlcyk7CisJCQlyZXQgPSByd192ZXJpZnlfYXJlYShydywgZmlsZSwgJnJlcS0+a2lfcG9zLAorCQkJCQkgICAgIGlvdl9pdGVyX2NvdW50KCZpdGVyKSk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlpZiAoaW92ZWMgIT0gaW5saW5lX3ZlY3MpCi0JCQkJa2ZyZWUoaW92ZWMpOworCQkJa2ZyZWUoaW92ZWMpOwogCQkJcmV0dXJuIHJldDsKIAkJfQogCi0JCXJlcS0+a2lfbmJ5dGVzID0gcmV0OwotCi0JCS8qIFhYWDogbW92ZS9raWxsIC0gcndfdmVyaWZ5X2FyZWEoKT8gKi8KLQkJLyogVGhpcyBtYXRjaGVzIHRoZSBwcmVhZCgpL3B3cml0ZSgpIGxvZ2ljICovCi0JCWlmIChyZXEtPmtpX3BvcyA8IDApIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlicmVhazsKLQkJfQorCQlsZW4gPSByZXQ7CiAKIAkJaWYgKHJ3ID09IFdSSVRFKQogCQkJZmlsZV9zdGFydF93cml0ZShmaWxlKTsKIAotCQlpZiAoaXRlcl9vcCkgewotCQkJaW92X2l0ZXJfaW5pdCgmaXRlciwgcncsIGlvdmVjLCBucl9zZWdzLCByZXEtPmtpX25ieXRlcyk7Ci0JCQlyZXQgPSBpdGVyX29wKHJlcSwgJml0ZXIpOwotCQl9IGVsc2UgewotCQkJcmV0ID0gcndfb3AocmVxLCBpb3ZlYywgbnJfc2VncywgcmVxLT5raV9wb3MpOwotCQl9CisJCXJldCA9IGl0ZXJfb3AocmVxLCAmaXRlcik7CiAKIAkJaWYgKHJ3ID09IFdSSVRFKQogCQkJZmlsZV9lbmRfd3JpdGUoZmlsZSk7CisJCWtmcmVlKGlvdmVjKTsKIAkJYnJlYWs7CiAKIAljYXNlIElPQ0JfQ01EX0ZEU1lOQzoKQEAgLTE0NzksOSArMTQ1NCw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChpb3ZlYyAhPSBpbmxpbmVfdmVjcykKLQkJa2ZyZWUoaW92ZWMpOwotCiAJaWYgKHJldCAhPSAtRUlPQ0JRVUVVRUQpIHsKIAkJLyoKIAkJICogVGhlcmUncyBubyBlYXN5IHdheSB0byByZXN0YXJ0IHRoZSBzeXNjYWxsIHNpbmNlIG90aGVyIEFJTydzCkBAIC0xNTAwLDcgKzE0NzIsNyBAQAogc3RhdGljIGludCBpb19zdWJtaXRfb25lKHN0cnVjdCBraW9jdHggKmN0eCwgc3RydWN0IGlvY2IgX191c2VyICp1c2VyX2lvY2IsCiAJCQkgc3RydWN0IGlvY2IgKmlvY2IsIGJvb2wgY29tcGF0KQogewotCXN0cnVjdCBraW9jYiAqcmVxOworCXN0cnVjdCBhaW9fa2lvY2IgKnJlcTsKIAlzc2l6ZV90IHJldDsKIAogCS8qIGVuZm9yY2UgZm9yd2FyZHMgY29tcGF0aWJpbGl0eSBvbiB1c2VycyAqLwpAQCAtMTUyMywxMSArMTQ5NSwxNCBAQAogCWlmICh1bmxpa2VseSghcmVxKSkKIAkJcmV0dXJuIC1FQUdBSU47CiAKLQlyZXEtPmtpX2ZpbHAgPSBmZ2V0KGlvY2ItPmFpb19maWxkZXMpOwotCWlmICh1bmxpa2VseSghcmVxLT5raV9maWxwKSkgeworCXJlcS0+Y29tbW9uLmtpX2ZpbHAgPSBmZ2V0KGlvY2ItPmFpb19maWxkZXMpOworCWlmICh1bmxpa2VseSghcmVxLT5jb21tb24ua2lfZmlscCkpIHsKIAkJcmV0ID0gLUVCQURGOwogCQlnb3RvIG91dF9wdXRfcmVxOwogCX0KKwlyZXEtPmNvbW1vbi5raV9wb3MgPSBpb2NiLT5haW9fb2Zmc2V0OworCXJlcS0+Y29tbW9uLmtpX2NvbXBsZXRlID0gYWlvX2NvbXBsZXRlOworCXJlcS0+Y29tbW9uLmtpX2ZsYWdzID0gMDsKIAogCWlmIChpb2NiLT5haW9fZmxhZ3MgJiBJT0NCX0ZMQUdfUkVTRkQpIHsKIAkJLyoKQEAgLTE1NDIsNiArMTUxNyw4IEBACiAJCQlyZXEtPmtpX2V2ZW50ZmQgPSBOVUxMOwogCQkJZ290byBvdXRfcHV0X3JlcTsKIAkJfQorCisJCXJlcS0+Y29tbW9uLmtpX2ZsYWdzIHw9IElPQ0JfRVZFTlRGRDsKIAl9CiAKIAlyZXQgPSBwdXRfdXNlcihLSU9DQl9LRVksICZ1c2VyX2lvY2ItPmFpb19rZXkpOwpAQCAtMTU1MCwxMyArMTUyNywxMiBAQAogCQlnb3RvIG91dF9wdXRfcmVxOwogCX0KIAotCXJlcS0+a2lfb2JqLnVzZXIgPSB1c2VyX2lvY2I7CisJcmVxLT5raV91c2VyX2lvY2IgPSB1c2VyX2lvY2I7CiAJcmVxLT5raV91c2VyX2RhdGEgPSBpb2NiLT5haW9fZGF0YTsKLQlyZXEtPmtpX3BvcyA9IGlvY2ItPmFpb19vZmZzZXQ7Ci0JcmVxLT5raV9uYnl0ZXMgPSBpb2NiLT5haW9fbmJ5dGVzOwogCi0JcmV0ID0gYWlvX3J1bl9pb2NiKHJlcSwgaW9jYi0+YWlvX2xpb19vcGNvZGUsCisJcmV0ID0gYWlvX3J1bl9pb2NiKCZyZXEtPmNvbW1vbiwgaW9jYi0+YWlvX2xpb19vcGNvZGUsCiAJCQkgICAoY2hhciBfX3VzZXIgKikodW5zaWduZWQgbG9uZylpb2NiLT5haW9fYnVmLAorCQkJICAgaW9jYi0+YWlvX25ieXRlcywKIAkJCSAgIGNvbXBhdCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfcHV0X3JlcTsKQEAgLTE2NDMsMTAgKzE2MTksMTAgQEAKIC8qIGxvb2t1cF9raW9jYgogICoJRmluZHMgYSBnaXZlbiBpb2NiIGZvciBjYW5jZWxsYXRpb24uCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qga2lvY2IgKmxvb2t1cF9raW9jYihzdHJ1Y3Qga2lvY3R4ICpjdHgsIHN0cnVjdCBpb2NiIF9fdXNlciAqaW9jYiwKLQkJCQkgIHUzMiBrZXkpCitzdGF0aWMgc3RydWN0IGFpb19raW9jYiAqCitsb29rdXBfa2lvY2Ioc3RydWN0IGtpb2N0eCAqY3R4LCBzdHJ1Y3QgaW9jYiBfX3VzZXIgKmlvY2IsIHUzMiBrZXkpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcG9zOworCXN0cnVjdCBhaW9fa2lvY2IgKmtpb2NiOwogCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKCZjdHgtPmN0eF9sb2NrKTsKIApAQCAtMTY1NCw5ICsxNjMwLDggQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKiBUT0RPOiB1c2UgYSBoYXNoIG9yIGFycmF5LCB0aGlzIHN1Y2tzLiAqLwotCWxpc3RfZm9yX2VhY2gocG9zLCAmY3R4LT5hY3RpdmVfcmVxcykgewotCQlzdHJ1Y3Qga2lvY2IgKmtpb2NiID0gbGlzdF9raW9jYihwb3MpOwotCQlpZiAoa2lvY2ItPmtpX29iai51c2VyID09IGlvY2IpCisJbGlzdF9mb3JfZWFjaF9lbnRyeShraW9jYiwgJmN0eC0+YWN0aXZlX3JlcXMsIGtpX2xpc3QpIHsKKwkJaWYgKGtpb2NiLT5raV91c2VyX2lvY2IgPT0gaW9jYikKIAkJCXJldHVybiBraW9jYjsKIAl9CiAJcmV0dXJuIE5VTEw7CkBAIC0xNjc2LDcgKzE2NTEsNyBAQAogCQlzdHJ1Y3QgaW9fZXZlbnQgX191c2VyICosIHJlc3VsdCkKIHsKIAlzdHJ1Y3Qga2lvY3R4ICpjdHg7Ci0Jc3RydWN0IGtpb2NiICpraW9jYjsKKwlzdHJ1Y3QgYWlvX2tpb2NiICpraW9jYjsKIAl1MzIga2V5OwogCWludCByZXQ7CiAKZGlmZiAtLWdpdCBhL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaCBiL2ZzL2F1dG9mczQvYXV0b2ZzX2kuaAppbmRleCA4ZTk4Y2Y5Li5kMTBlNjE5IDEwMDY0NAotLS0gYS9mcy9hdXRvZnM0L2F1dG9mc19pLmgKKysrIGIvZnMvYXV0b2ZzNC9hdXRvZnNfaS5oCkBAIC0yMTMsNyArMjEzLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgYXV0b2ZzX3ByZXBhcmVfcGlwZShzdHJ1Y3QgZmlsZSAqcGlwZSkKIHsKLQlpZiAoIXBpcGUtPmZfb3AtPndyaXRlKQorCWlmICghKHBpcGUtPmZfbW9kZSAmIEZNT0RFX0NBTl9XUklURSkpCiAJCXJldHVybiAtRUlOVkFMOwogCWlmICghU19JU0ZJRk8oZmlsZV9pbm9kZShwaXBlKS0+aV9tb2RlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9mcy9hdXRvZnM0L3dhaXRxLmMgYi9mcy9hdXRvZnM0L3dhaXRxLmMKaW5kZXggMTE2ZmQzOC4uMmFkMDVhYiAxMDA2NDQKLS0tIGEvZnMvYXV0b2ZzNC93YWl0cS5jCisrKyBiL2ZzL2F1dG9mczQvd2FpdHEuYwpAQCAtNzAsNyArNzAsNyBAQAogCiAJbXV0ZXhfbG9jaygmc2JpLT5waXBlX211dGV4KTsKIAl3aGlsZSAoYnl0ZXMgJiYKLQkgICAgICAgKHdyID0gZmlsZS0+Zl9vcC0+d3JpdGUoZmlsZSxkYXRhLGJ5dGVzLCZmaWxlLT5mX3BvcykpID4gMCkgeworCSAgICAgICAod3IgPSBfX3Zmc193cml0ZShmaWxlLGRhdGEsYnl0ZXMsJmZpbGUtPmZfcG9zKSkgPiAwKSB7CiAJCWRhdGEgKz0gd3I7CiAJCWJ5dGVzIC09IHdyOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2Jmcy9maWxlLmMgYi9mcy9iZnMvZmlsZS5jCmluZGV4IGU3Zjg4YWMuLjk3ZjFiNTEgMTAwNjQ0Ci0tLSBhL2ZzL2Jmcy9maWxlLmMKKysrIGIvZnMvYmZzL2ZpbGUuYwpAQCAtMjMsOSArMjMsNyBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJmc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlayAJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCiAJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLApkaWZmIC0tZ2l0IGEvZnMvYmZzL2lub2RlLmMgYi9mcy9iZnMvaW5vZGUuYwppbmRleCA5MGJjMDc5Li5mZGNiNGQ2IDEwMDY0NAotLS0gYS9mcy9iZnMvaW5vZGUuYworKysgYi9mcy9iZnMvaW5vZGUuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJiZnMuaCIKIApkaWZmIC0tZ2l0IGEvZnMvYmluZm10X2VsZi5jIGIvZnMvYmluZm10X2VsZi5jCmluZGV4IDk5NTk4NmIuLjI0MWVmNjggMTAwNjQ0Ci0tLSBhL2ZzL2JpbmZtdF9lbGYuYworKysgYi9mcy9iaW5mbXRfZWxmLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2VsZi5oPgorI2luY2x1ZGUgPGxpbnV4L2VsZi1yYW5kb21pemUuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvY29yZWR1bXAuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtODYyLDYgKzg2Myw3IEBACiAJICAgIGkgPCBsb2MtPmVsZl9leC5lX3BobnVtOyBpKyssIGVsZl9wcG50KyspIHsKIAkJaW50IGVsZl9wcm90ID0gMCwgZWxmX2ZsYWdzOwogCQl1bnNpZ25lZCBsb25nIGssIHZhZGRyOworCQl1bnNpZ25lZCBsb25nIHRvdGFsX3NpemUgPSAwOwogCiAJCWlmIChlbGZfcHBudC0+cF90eXBlICE9IFBUX0xPQUQpCiAJCQljb250aW51ZTsKQEAgLTkwOSwyNSArOTExLDIwIEBACiAJCQkgKiBkZWZhdWx0IG1tYXAgYmFzZSwgYXMgd2VsbCBhcyB3aGF0ZXZlciBwcm9ncmFtIHRoZXkKIAkJCSAqIG1pZ2h0IHRyeSB0byBleGVjLiAgVGhpcyBpcyBiZWNhdXNlIHRoZSBicmsgd2lsbAogCQkJICogZm9sbG93IHRoZSBsb2FkZXIsIGFuZCBpcyBub3QgbW92YWJsZS4gICovCi0jaWZkZWYgQ09ORklHX0FSQ0hfQklORk1UX0VMRl9SQU5ET01JWkVfUElFCi0JCQkvKiBNZW1vcnkgcmFuZG9taXphdGlvbiBtaWdodCBoYXZlIGJlZW4gc3dpdGNoZWQgb2ZmCi0JCQkgKiBpbiBydW50aW1lIHZpYSBzeXNjdGwgb3IgZXhwbGljaXQgc2V0dGluZyBvZgotCQkJICogcGVyc29uYWxpdHkgZmxhZ3MuCi0JCQkgKiBJZiB0aGF0IGlzIHRoZSBjYXNlLCByZXRhaW4gdGhlIG9yaWdpbmFsIG5vbi16ZXJvCi0JCQkgKiBsb2FkX2JpYXMgdmFsdWUgaW4gb3JkZXIgdG8gZXN0YWJsaXNoIHByb3BlcgotCQkJICogbm9uLXJhbmRvbWl6ZWQgbWFwcGluZ3MuCi0JCQkgKi8KKwkJCWxvYWRfYmlhcyA9IEVMRl9FVF9EWU5fQkFTRSAtIHZhZGRyOwogCQkJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKQotCQkJCWxvYWRfYmlhcyA9IDA7Ci0JCQllbHNlCi0JCQkJbG9hZF9iaWFzID0gRUxGX1BBR0VTVEFSVChFTEZfRVRfRFlOX0JBU0UgLSB2YWRkcik7Ci0jZWxzZQotCQkJbG9hZF9iaWFzID0gRUxGX1BBR0VTVEFSVChFTEZfRVRfRFlOX0JBU0UgLSB2YWRkcik7Ci0jZW5kaWYKKwkJCQlsb2FkX2JpYXMgKz0gYXJjaF9tbWFwX3JuZCgpOworCQkJbG9hZF9iaWFzID0gRUxGX1BBR0VTVEFSVChsb2FkX2JpYXMpOworCQkJdG90YWxfc2l6ZSA9IHRvdGFsX21hcHBpbmdfc2l6ZShlbGZfcGhkYXRhLAorCQkJCQkJCWxvYy0+ZWxmX2V4LmVfcGhudW0pOworCQkJaWYgKCF0b3RhbF9zaXplKSB7CisJCQkJZXJyb3IgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0X2ZyZWVfZGVudHJ5OworCQkJfQogCQl9CiAKIAkJZXJyb3IgPSBlbGZfbWFwKGJwcm0tPmZpbGUsIGxvYWRfYmlhcyArIHZhZGRyLCBlbGZfcHBudCwKLQkJCQllbGZfcHJvdCwgZWxmX2ZsYWdzLCAwKTsKKwkJCQllbGZfcHJvdCwgZWxmX2ZsYWdzLCB0b3RhbF9zaXplKTsKIAkJaWYgKEJBRF9BRERSKGVycm9yKSkgewogCQkJcmV0dmFsID0gSVNfRVJSKCh2b2lkICopZXJyb3IpID8KIAkJCQlQVFJfRVJSKCh2b2lkKillcnJvcikgOiAtRUlOVkFMOwpAQCAtMTA1MywxNSArMTA1MCwxMyBAQAogCWN1cnJlbnQtPm1tLT5lbmRfZGF0YSA9IGVuZF9kYXRhOwogCWN1cnJlbnQtPm1tLT5zdGFydF9zdGFjayA9IGJwcm0tPnA7CiAKLSNpZmRlZiBhcmNoX3JhbmRvbWl6ZV9icmsKIAlpZiAoKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKSAmJiAocmFuZG9taXplX3ZhX3NwYWNlID4gMSkpIHsKIAkJY3VycmVudC0+bW0tPmJyayA9IGN1cnJlbnQtPm1tLT5zdGFydF9icmsgPQogCQkJYXJjaF9yYW5kb21pemVfYnJrKGN1cnJlbnQtPm1tKTsKLSNpZmRlZiBDT05GSUdfQ09NUEFUX0JSSworI2lmZGVmIGNvbXBhdF9icmtfcmFuZG9taXplZAogCQljdXJyZW50LT5icmtfcmFuZG9taXplZCA9IDE7CiAjZW5kaWYKIAl9Ci0jZW5kaWYKIAogCWlmIChjdXJyZW50LT5wZXJzb25hbGl0eSAmIE1NQVBfUEFHRV9aRVJPKSB7CiAJCS8qIFdoeSB0aGlzLCB5b3UgYXNrPz8/ICBXZWxsIFNWcjQgbWFwcyBwYWdlIDAgYXMgcmVhZC1vbmx5LApkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYwppbmRleCA5NzUyNjZiLi5iNWU4Nzg5IDEwMDY0NAotLS0gYS9mcy9ibG9ja19kZXYuYworKysgYi9mcy9ibG9ja19kZXYuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogI2luY2x1ZGUgPGxpbnV4L2NsZWFuY2FjaGUuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKQEAgLTE2NjAsOCArMTY1OSw2IEBACiAJLm9wZW4JCT0gYmxrZGV2X29wZW4sCiAJLnJlbGVhc2UJPSBibGtkZXZfY2xvc2UsCiAJLmxsc2VlawkJPSBibG9ja19sbHNlZWssCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlcgk9IGJsa2Rldl9yZWFkX2l0ZXIsCiAJLndyaXRlX2l0ZXIJPSBibGtkZXZfd3JpdGVfaXRlciwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2N0cmVlLmggYi9mcy9idHJmcy9jdHJlZS5oCmluZGV4IDg0YzNiMDAuLmY5Yzg5Y2EgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2N0cmVlLmgKKysrIGIvZnMvYnRyZnMvY3RyZWUuaApAQCAtMzM4Nyw2ICszMzg3LDggQEAKIAogaW50IGJ0cmZzX3dyaXRlX2RpcnR5X2Jsb2NrX2dyb3VwcyhzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQkgICAgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QpOworaW50IGJ0cmZzX3NldHVwX3NwYWNlX2NhY2hlKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAorCQkJICAgIHN0cnVjdCBidHJmc19yb290ICpyb290KTsKIGludCBidHJmc19leHRlbnRfcmVhZG9ubHkoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCBieXRlbnIpOwogaW50IGJ0cmZzX2ZyZWVfYmxvY2tfZ3JvdXBzKHN0cnVjdCBidHJmc19mc19pbmZvICppbmZvKTsKIGludCBidHJmc19yZWFkX2Jsb2NrX2dyb3VwcyhzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCk7CkBAIC0zOTA5LDYgKzM5MTEsOSBAQAogCQkJCSAgICBsb2ZmX3QgYWN0dWFsX2xlbiwgdTY0ICphbGxvY19oaW50KTsKIGludCBidHJmc19pbm9kZV9jaGVja19lcnJvcnMoc3RydWN0IGlub2RlICppbm9kZSk7CiBleHRlcm4gY29uc3Qgc3RydWN0IGRlbnRyeV9vcGVyYXRpb25zIGJ0cmZzX2RlbnRyeV9vcGVyYXRpb25zOworI2lmZGVmIENPTkZJR19CVFJGU19GU19SVU5fU0FOSVRZX1RFU1RTCit2b2lkIGJ0cmZzX3Rlc3RfaW5vZGVfc2V0X29wcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKKyNlbmRpZgogCiAvKiBpb2N0bC5jICovCiBsb25nIGJ0cmZzX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9kaXNrLWlvLmMgYi9mcy9idHJmcy9kaXNrLWlvLmMKaW5kZXggZjc5ZjM4NS4uNjM5ZjI2NiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZGlzay1pby5jCisrKyBiL2ZzL2J0cmZzL2Rpc2staW8uYwpAQCAtMzkyMSw3ICszOTIxLDcgQEAKIAl9CiAJaWYgKGJ0cmZzX3N1cGVyX3N5c19hcnJheV9zaXplKHNiKSA8IHNpemVvZihzdHJ1Y3QgYnRyZnNfZGlza19rZXkpCiAJCQkrIHNpemVvZihzdHJ1Y3QgYnRyZnNfY2h1bmspKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQlRSRlM6IHN5c3RlbSBjaHVuayBhcnJheSB0b28gc21hbGwgJXUgPCAlbHVcbiIsCisJCXByaW50ayhLRVJOX0VSUiAiQlRSRlM6IHN5c3RlbSBjaHVuayBhcnJheSB0b28gc21hbGwgJXUgPCAlenVcbiIsCiAJCQkJYnRyZnNfc3VwZXJfc3lzX2FycmF5X3NpemUoc2IpLAogCQkJCXNpemVvZihzdHJ1Y3QgYnRyZnNfZGlza19rZXkpCiAJCQkJKyBzaXplb2Yoc3RydWN0IGJ0cmZzX2NodW5rKSk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnQtdHJlZS5jIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwppbmRleCA2ZjA4MDQ1Li44YjM1M2FkIDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnQtdHJlZS5jCisrKyBiL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKQEAgLTMzMjUsNiArMzMyNSwzMiBAQAogCXJldHVybiByZXQ7CiB9CiAKK2ludCBidHJmc19zZXR1cF9zcGFjZV9jYWNoZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgYnRyZnNfYmxvY2tfZ3JvdXBfY2FjaGUgKmNhY2hlLCAqdG1wOworCXN0cnVjdCBidHJmc190cmFuc2FjdGlvbiAqY3VyX3RyYW5zID0gdHJhbnMtPnRyYW5zYWN0aW9uOworCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOworCisJaWYgKGxpc3RfZW1wdHkoJmN1cl90cmFucy0+ZGlydHlfYmdzKSB8fAorCSAgICAhYnRyZnNfdGVzdF9vcHQocm9vdCwgU1BBQ0VfQ0FDSEUpKQorCQlyZXR1cm4gMDsKKworCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIENvdWxkIGFkZCBuZXcgYmxvY2sgZ3JvdXBzLCB1c2UgX3NhZmUganVzdCBpbiBjYXNlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNhY2hlLCB0bXAsICZjdXJfdHJhbnMtPmRpcnR5X2JncywKKwkJCQkgZGlydHlfbGlzdCkgeworCQlpZiAoY2FjaGUtPmRpc2tfY2FjaGVfc3RhdGUgPT0gQlRSRlNfRENfQ0xFQVIpCisJCQljYWNoZV9zYXZlX3NldHVwKGNhY2hlLCB0cmFucywgcGF0aCk7CisJfQorCisJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCXJldHVybiAwOworfQorCiBpbnQgYnRyZnNfd3JpdGVfZGlydHlfYmxvY2tfZ3JvdXBzKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkJCSAgIHN0cnVjdCBidHJmc19yb290ICpyb290KQogewpAQCAtNTExMCw3ICs1MTM2LDExIEBACiAJbnVtX2J5dGVzID0gQUxJR04obnVtX2J5dGVzLCByb290LT5zZWN0b3JzaXplKTsKIAogCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOwotCUJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzKys7CisJbnJfZXh0ZW50cyA9ICh1bnNpZ25lZClkaXY2NF91NjQobnVtX2J5dGVzICsKKwkJCQkJIEJUUkZTX01BWF9FWFRFTlRfU0laRSAtIDEsCisJCQkJCSBCVFJGU19NQVhfRVhURU5UX1NJWkUpOworCUJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzICs9IG5yX2V4dGVudHM7CisJbnJfZXh0ZW50cyA9IDA7CiAKIAlpZiAoQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMgPgogCSAgICBCVFJGU19JKGlub2RlKS0+cmVzZXJ2ZWRfZXh0ZW50cykKQEAgLTUyNTUsNiArNTI4NSw5IEBACiAJaWYgKGRyb3BwZWQgPiAwKQogCQl0b19mcmVlICs9IGJ0cmZzX2NhbGNfdHJhbnNfbWV0YWRhdGFfc2l6ZShyb290LCBkcm9wcGVkKTsKIAorCWlmIChidHJmc190ZXN0X2lzX2R1bW15X3Jvb3Qocm9vdCkpCisJCXJldHVybjsKKwogCXRyYWNlX2J0cmZzX3NwYWNlX3Jlc2VydmF0aW9uKHJvb3QtPmZzX2luZm8sICJkZWxhbGxvYyIsCiAJCQkJICAgICAgYnRyZnNfaW5vKGlub2RlKSwgdG9fZnJlZSwgMCk7CiAJaWYgKHJvb3QtPmZzX2luZm8tPnF1b3RhX2VuYWJsZWQpIHsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudF9pby5jIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmMKaW5kZXggYzcyMzNmZi4uZDY4OGNmZSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50X2lvLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50X2lvLmMKQEAgLTQ5NjgsNiArNDk2OCwxMiBAQAogCiAJCS8qIFNob3VsZCBiZSBzYWZlIHRvIHJlbGVhc2Ugb3VyIHBhZ2VzIGF0IHRoaXMgcG9pbnQgKi8KIAkJYnRyZnNfcmVsZWFzZV9leHRlbnRfYnVmZmVyX3BhZ2UoZWIpOworI2lmZGVmIENPTkZJR19CVFJGU19GU19SVU5fU0FOSVRZX1RFU1RTCisJCWlmICh1bmxpa2VseSh0ZXN0X2JpdChFWFRFTlRfQlVGRkVSX0RVTU1ZLCAmZWItPmJmbGFncykpKSB7CisJCQlfX2ZyZWVfZXh0ZW50X2J1ZmZlcihlYik7CisJCQlyZXR1cm4gMTsKKwkJfQorI2VuZGlmCiAJCWNhbGxfcmN1KCZlYi0+cmN1X2hlYWQsIGJ0cmZzX3JlbGVhc2VfZXh0ZW50X2J1ZmZlcl9yY3UpOwogCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9maWxlLmMgYi9mcy9idHJmcy9maWxlLmMKaW5kZXggMzA5ODJiYi4uY2RjODAxYyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZmlsZS5jCisrKyBiL2ZzL2J0cmZzL2ZpbGUuYwpAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2JhY2tpbmctZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9mYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+CkBAIC0zMiw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2J0cmZzLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSAiY3RyZWUuaCIKICNpbmNsdWRlICJkaXNrLWlvLmgiCiAjaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKQEAgLTI4MDYsOCArMjgwNiw2IEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYnRyZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gYnRyZnNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlciAgICAgID0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiAJLndyaXRlX2l0ZXIJPSBidHJmc19maWxlX3dyaXRlX2l0ZXIsCmRpZmYgLS1naXQgYS9mcy9idHJmcy9pbm9kZS5jIGIvZnMvYnRyZnMvaW5vZGUuYwppbmRleCBkYTgyOGNmLi42ODYzMzFmIDEwMDY0NAotLS0gYS9mcy9idHJmcy9pbm9kZS5jCisrKyBiL2ZzL2J0cmZzL2lub2RlLmMKQEAgLTMyLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0ZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9iaXRfc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC94YXR0ci5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvc2l4X2FjbC5oPgpAQCAtNDMsNiArNDIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2J0cmZzLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvcG9zaXhfYWNsX3hhdHRyLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSAiY3RyZWUuaCIKICNpbmNsdWRlICJkaXNrLWlvLmgiCiAjaW5jbHVkZSAidHJhbnNhY3Rpb24uaCIKQEAgLTEwOCw2ICsxMDgsMTMgQEAKIAogc3RhdGljIGludCBidHJmc19kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIAorI2lmZGVmIENPTkZJR19CVFJGU19GU19SVU5fU0FOSVRZX1RFU1RTCit2b2lkIGJ0cmZzX3Rlc3RfaW5vZGVfc2V0X29wcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCUJUUkZTX0koaW5vZGUpLT5pb190cmVlLm9wcyA9ICZidHJmc19leHRlbnRfaW9fb3BzOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgYnRyZnNfaW5pdF9pbm9kZV9zZWN1cml0eShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKIAkJCQkgICAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsICBzdHJ1Y3QgaW5vZGUgKmRpciwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBxc3RyICpxc3RyKQpAQCAtMTU0MiwzMCArMTU0OSwxNyBAQAogCQl1NjQgbmV3X3NpemU7CiAKIAkJLyoKLQkJICogV2UgbmVlZCB0aGUgbGFyZ2VzdCBzaXplIG9mIHRoZSByZW1haW5pbmcgZXh0ZW50IHRvIHNlZSBpZiB3ZQotCQkgKiBuZWVkIHRvIGFkZCBhIG5ldyBvdXRzdGFuZGluZyBleHRlbnQuICBUaGluayBvZiB0aGUgZm9sbG93aW5nCi0JCSAqIGNhc2UKLQkJICoKLQkJICogW01FQVhfRVhURU5UX1NJWkV4MiAtIDRrXVs0a10KLQkJICoKLQkJICogVGhlIG5ld19zaXplIHdvdWxkIGp1c3QgYmUgNGsgYW5kIHdlJ2QgdGhpbmsgd2UgaGFkIGVub3VnaAotCQkgKiBvdXRzdGFuZGluZyBleHRlbnRzIGZvciB0aGlzIGlmIHdlIG9ubHkgdG9vayBvbmUgc2lkZSBvZiB0aGUKLQkJICogc3BsaXQsIHNhbWUgZ29lcyBmb3IgdGhlIG90aGVyIGRpcmVjdGlvbi4gIFdlIG5lZWQgdG8gc2VlIGlmCi0JCSAqIHRoZSBsYXJnZXIgc2l6ZSBzdGlsbCBpcyB0aGUgc2FtZSBhbW91bnQgb2YgZXh0ZW50cyBhcyB0aGUKLQkJICogb3JpZ2luYWwgc2l6ZSwgYmVjYXVzZSBpZiBpdCBpcyB3ZSBuZWVkIHRvIGFkZCBhIG5ldwotCQkgKiBvdXRzdGFuZGluZyBleHRlbnQuICBCdXQgaWYgd2Ugc3BsaXQgdXAgYW5kIHRoZSBsYXJnZXIgc2l6ZQotCQkgKiBpcyBsZXNzIHRoYW4gdGhlIG9yaWdpbmFsIHRoZW4gd2UgYXJlIGdvb2QgdG8gZ28gc2luY2Ugd2UndmUKLQkJICogYWxyZWFkeSBhY2NvdW50ZWQgZm9yIHRoZSBleHRyYSBleHRlbnQgaW4gb3VyIG9yaWdpbmFsCi0JCSAqIGFjY291bnRpbmcuCisJCSAqIFNlZSB0aGUgZXhwbGFuYXRpb24gaW4gYnRyZnNfbWVyZ2VfZXh0ZW50X2hvb2ssIHRoZSBzYW1lCisJCSAqIGFwcGxpZXMgaGVyZSwganVzdCBpbiByZXZlcnNlLgogCQkgKi8KIAkJbmV3X3NpemUgPSBvcmlnLT5lbmQgLSBzcGxpdCArIDE7Ci0JCWlmICgoc3BsaXQgLSBvcmlnLT5zdGFydCkgPiBuZXdfc2l6ZSkKLQkJCW5ld19zaXplID0gc3BsaXQgLSBvcmlnLT5zdGFydDsKLQotCQludW1fZXh0ZW50cyA9IGRpdjY0X3U2NChzaXplICsgQlRSRlNfTUFYX0VYVEVOVF9TSVpFIC0gMSwKKwkJbnVtX2V4dGVudHMgPSBkaXY2NF91NjQobmV3X3NpemUgKyBCVFJGU19NQVhfRVhURU5UX1NJWkUgLSAxLAogCQkJCQlCVFJGU19NQVhfRVhURU5UX1NJWkUpOwotCQlpZiAoZGl2NjRfdTY0KG5ld19zaXplICsgQlRSRlNfTUFYX0VYVEVOVF9TSVpFIC0gMSwKLQkJCSAgICAgIEJUUkZTX01BWF9FWFRFTlRfU0laRSkgPCBudW1fZXh0ZW50cykKKwkJbmV3X3NpemUgPSBzcGxpdCAtIG9yaWctPnN0YXJ0OworCQludW1fZXh0ZW50cyArPSBkaXY2NF91NjQobmV3X3NpemUgKyBCVFJGU19NQVhfRVhURU5UX1NJWkUgLSAxLAorCQkJCQlCVFJGU19NQVhfRVhURU5UX1NJWkUpOworCQlpZiAoZGl2NjRfdTY0KHNpemUgKyBCVFJGU19NQVhfRVhURU5UX1NJWkUgLSAxLAorCQkJICAgICAgQlRSRlNfTUFYX0VYVEVOVF9TSVpFKSA+PSBudW1fZXh0ZW50cykKIAkJCXJldHVybjsKIAl9CiAKQEAgLTE1OTEsOCArMTU4NSwxMCBAQAogCWlmICghKG90aGVyLT5zdGF0ZSAmIEVYVEVOVF9ERUxBTExPQykpCiAJCXJldHVybjsKIAotCW9sZF9zaXplID0gb3RoZXItPmVuZCAtIG90aGVyLT5zdGFydCArIDE7Ci0JbmV3X3NpemUgPSBvbGRfc2l6ZSArIChuZXctPmVuZCAtIG5ldy0+c3RhcnQgKyAxKTsKKwlpZiAobmV3LT5zdGFydCA+IG90aGVyLT5zdGFydCkKKwkJbmV3X3NpemUgPSBuZXctPmVuZCAtIG90aGVyLT5zdGFydCArIDE7CisJZWxzZQorCQluZXdfc2l6ZSA9IG90aGVyLT5lbmQgLSBuZXctPnN0YXJ0ICsgMTsKIAogCS8qIHdlJ3JlIG5vdCBiaWdnZXIgdGhhbiB0aGUgbWF4LCB1bnJlc2VydmUgdGhlIHNwYWNlIGFuZCBnbyAqLwogCWlmIChuZXdfc2l6ZSA8PSBCVFJGU19NQVhfRVhURU5UX1NJWkUpIHsKQEAgLTE2MDMsMTMgKzE1OTksMzIgQEAKIAl9CiAKIAkvKgotCSAqIElmIHdlIGdyZXcgYnkgYW5vdGhlciBtYXhfZXh0ZW50LCBqdXN0IHJldHVybiwgd2Ugd2FudCB0byBrZWVwIHRoYXQKLQkgKiByZXNlcnZlZCBhbW91bnQuCisJICogV2UgaGF2ZSB0byBhZGQgdXAgZWl0aGVyIHNpZGUgdG8gZmlndXJlIG91dCBob3cgbWFueSBleHRlbnRzIHdlcmUKKwkgKiBhY2NvdW50ZWQgZm9yIGJlZm9yZSB3ZSBtZXJnZWQgaW50byBvbmUgYmlnIGV4dGVudC4gIElmIHRoZSBudW1iZXIgb2YKKwkgKiBleHRlbnRzIHdlIGFjY291bnRlZCBmb3IgaXMgPD0gdGhlIGFtb3VudCB3ZSBuZWVkIGZvciB0aGUgbmV3IHJhbmdlCisJICogdGhlbiB3ZSBjYW4gcmV0dXJuLCBvdGhlcndpc2UgZHJvcC4gIFRoaW5rIG9mIGl0IGxpa2UgdGhpcworCSAqCisJICogWyA0a11bTUFYX1NJWkVdCisJICoKKwkgKiBTbyB3ZSd2ZSBncm93biB0aGUgZXh0ZW50IGJ5IGEgTUFYX1NJWkUgZXh0ZW50LCB0aGlzIHdvdWxkIG1lYW4gd2UKKwkgKiBuZWVkIDIgb3V0c3RhbmRpbmcgZXh0ZW50cywgb24gb25lIHNpZGUgd2UgaGF2ZSAxIGFuZCB0aGUgb3RoZXIgc2lkZQorCSAqIHdlIGhhdmUgMSBzbyB0aGV5IGFyZSA9PSBhbmQgd2UgY2FuIHJldHVybi4gIEJ1dCBpbiB0aGlzIGNhc2UKKwkgKgorCSAqIFtNQVhfU0laRSs0a11bTUFYX1NJWkUrNGtdCisJICoKKwkgKiBFYWNoIHJhbmdlIG9uIHRoZWlyIG93biBhY2NvdW50cyBmb3IgMiBleHRlbnRzLCBidXQgbWVyZ2VkIHRvZ2V0aGVyCisJICogdGhleSBhcmUgb25seSAzIGV4dGVudHMgd29ydGggb2YgYWNjb3VudGluZywgc28gd2UgbmVlZCB0byBkcm9wIGluCisJICogdGhpcyBjYXNlLgogCSAqLworCW9sZF9zaXplID0gb3RoZXItPmVuZCAtIG90aGVyLT5zdGFydCArIDE7CiAJbnVtX2V4dGVudHMgPSBkaXY2NF91NjQob2xkX3NpemUgKyBCVFJGU19NQVhfRVhURU5UX1NJWkUgLSAxLAogCQkJCUJUUkZTX01BWF9FWFRFTlRfU0laRSk7CisJb2xkX3NpemUgPSBuZXctPmVuZCAtIG5ldy0+c3RhcnQgKyAxOworCW51bV9leHRlbnRzICs9IGRpdjY0X3U2NChvbGRfc2l6ZSArIEJUUkZTX01BWF9FWFRFTlRfU0laRSAtIDEsCisJCQkJIEJUUkZTX01BWF9FWFRFTlRfU0laRSk7CisKIAlpZiAoZGl2NjRfdTY0KG5ld19zaXplICsgQlRSRlNfTUFYX0VYVEVOVF9TSVpFIC0gMSwKLQkJICAgICAgQlRSRlNfTUFYX0VYVEVOVF9TSVpFKSA+IG51bV9leHRlbnRzKQorCQkgICAgICBCVFJGU19NQVhfRVhURU5UX1NJWkUpID49IG51bV9leHRlbnRzKQogCQlyZXR1cm47CiAKIAlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKQEAgLTE2ODYsNiArMTcwMSwxMCBAQAogCQkJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKIAkJfQogCisJCS8qIEZvciBzYW5pdHkgdGVzdHMgKi8KKwkJaWYgKGJ0cmZzX3Rlc3RfaXNfZHVtbXlfcm9vdChyb290KSkKKwkJCXJldHVybjsKKwogCQlfX3BlcmNwdV9jb3VudGVyX2FkZCgmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfYnl0ZXMsIGxlbiwKIAkJCQkgICAgIHJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2JhdGNoKTsKIAkJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CkBAIC0xNzQxLDYgKzE3NjAsMTAgQEAKIAkJICAgIHJvb3QgIT0gcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290KQogCQkJYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9tZXRhZGF0YShpbm9kZSwgbGVuKTsKIAorCQkvKiBGb3Igc2FuaXR5IHRlc3RzLiAqLworCQlpZiAoYnRyZnNfdGVzdF9pc19kdW1teV9yb290KHJvb3QpKQorCQkJcmV0dXJuOworCiAJCWlmIChyb290LT5yb290X2tleS5vYmplY3RpZCAhPSBCVFJGU19EQVRBX1JFTE9DX1RSRUVfT0JKRUNUSUQKIAkJICAgICYmIGRvX2xpc3QgJiYgIShzdGF0ZS0+c3RhdGUgJiBFWFRFTlRfTk9SRVNFUlZFKSkKIAkJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgbGVuKTsKQEAgLTcyMTMsNyArNzIzNiw3IEBACiAJdTY0IHN0YXJ0ID0gaWJsb2NrIDw8IGlub2RlLT5pX2Jsa2JpdHM7CiAJdTY0IGxvY2tzdGFydCwgbG9ja2VuZDsKIAl1NjQgbGVuID0gYmhfcmVzdWx0LT5iX3NpemU7Ci0JdTY0IG9yaWdfbGVuID0gbGVuOworCXU2NCAqb3V0c3RhbmRpbmdfZXh0ZW50cyA9IE5VTEw7CiAJaW50IHVubG9ja19iaXRzID0gRVhURU5UX0xPQ0tFRDsKIAlpbnQgcmV0ID0gMDsKIApAQCAtNzIyNSw2ICs3MjQ4LDE2IEBACiAJbG9ja3N0YXJ0ID0gc3RhcnQ7CiAJbG9ja2VuZCA9IHN0YXJ0ICsgbGVuIC0gMTsKIAorCWlmIChjdXJyZW50LT5qb3VybmFsX2luZm8pIHsKKwkJLyoKKwkJICogTmVlZCB0byBwdWxsIG91ciBvdXRzdGFuZGluZyBleHRlbnRzIGFuZCBzZXQgam91cm5hbF9pbmZvIHRvIE5VTEwgc28KKwkJICogdGhhdCBhbnl0aGluZyB0aGF0IG5lZWRzIHRvIGNoZWNrIGlmIHRoZXJlJ3MgYSB0cmFuc2N0aW9uIGRvZXNuJ3QgZ2V0CisJCSAqIGNvbmZ1c2VkLgorCQkgKi8KKwkJb3V0c3RhbmRpbmdfZXh0ZW50cyA9IGN1cnJlbnQtPmpvdXJuYWxfaW5mbzsKKwkJY3VycmVudC0+am91cm5hbF9pbmZvID0gTlVMTDsKKwl9CisKIAkvKgogCSAqIElmIHRoaXMgZXJyb3JzIG91dCBpdCdzIGJlY2F1c2Ugd2UgY291bGRuJ3QgaW52YWxpZGF0ZSBwYWdlY2FjaGUgZm9yCiAJICogdGhpcyByYW5nZSBhbmQgd2UgbmVlZCB0byBmYWxsYmFjayB0byBidWZmZXJlZC4KQEAgLTczNDgsMTEgKzczODEsMjAgQEAKIAkJaWYgKHN0YXJ0ICsgbGVuID4gaV9zaXplX3JlYWQoaW5vZGUpKQogCQkJaV9zaXplX3dyaXRlKGlub2RlLCBzdGFydCArIGxlbik7CiAKLQkJaWYgKGxlbiA8IG9yaWdfbGVuKSB7CisJCS8qCisJCSAqIElmIHdlIGhhdmUgYW4gb3V0c3RhbmRpbmdfZXh0ZW50cyBjb3VudCBzdGlsbCBzZXQgdGhlbiB3ZSdyZQorCQkgKiB3aXRoaW4gb3VyIHJlc2VydmF0aW9uLCBvdGhlcndpc2Ugd2UgbmVlZCB0byBhZGp1c3Qgb3VyIGlub2RlCisJCSAqIGNvdW50ZXIgYXBwcm9wcmlhdGVseS4KKwkJICovCisJCWlmICgqb3V0c3RhbmRpbmdfZXh0ZW50cykgeworCQkJKCpvdXRzdGFuZGluZ19leHRlbnRzKS0tOworCQl9IGVsc2UgewogCQkJc3Bpbl9sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CiAJCQlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cysrOwogCQkJc3Bpbl91bmxvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKIAkJfQorCisJCWN1cnJlbnQtPmpvdXJuYWxfaW5mbyA9IG91dHN0YW5kaW5nX2V4dGVudHM7CiAJCWJ0cmZzX2ZyZWVfcmVzZXJ2ZWRfZGF0YV9zcGFjZShpbm9kZSwgbGVuKTsKIAl9CiAKQEAgLTczNzYsNiArNzQxOCw4IEBACiB1bmxvY2tfZXJyOgogCWNsZWFyX2V4dGVudF9iaXQoJkJUUkZTX0koaW5vZGUpLT5pb190cmVlLCBsb2Nrc3RhcnQsIGxvY2tlbmQsCiAJCQkgdW5sb2NrX2JpdHMsIDEsIDAsICZjYWNoZWRfc3RhdGUsIEdGUF9OT0ZTKTsKKwlpZiAob3V0c3RhbmRpbmdfZXh0ZW50cykKKwkJY3VycmVudC0+am91cm5hbF9pbmZvID0gb3V0c3RhbmRpbmdfZXh0ZW50czsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04MDc1LDYgKzgxMTksNyBAQAogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OworCXU2NCBvdXRzdGFuZGluZ19leHRlbnRzID0gMDsKIAlzaXplX3QgY291bnQgPSAwOwogCWludCBmbGFncyA9IDA7CiAJYm9vbCB3YWtldXAgPSB0cnVlOwpAQCAtODExMiw2ICs4MTU3LDE2IEBACiAJCXJldCA9IGJ0cmZzX2RlbGFsbG9jX3Jlc2VydmVfc3BhY2UoaW5vZGUsIGNvdW50KTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0OworCQlvdXRzdGFuZGluZ19leHRlbnRzID0gZGl2NjRfdTY0KGNvdW50ICsKKwkJCQkJCUJUUkZTX01BWF9FWFRFTlRfU0laRSAtIDEsCisJCQkJCQlCVFJGU19NQVhfRVhURU5UX1NJWkUpOworCisJCS8qCisJCSAqIFdlIG5lZWQgdG8ga25vdyBob3cgbWFueSBleHRlbnRzIHdlIHJlc2VydmVkIHNvIHRoYXQgd2UgY2FuCisJCSAqIGRvIHRoZSBhY2NvdW50aW5nIHByb3Blcmx5IGlmIHdlIGdvIG92ZXIgdGhlIG51bWJlciB3ZQorCQkgKiBvcmlnaW5hbGx5IGNhbGN1bGF0ZWQuICBBYnVzZSBjdXJyZW50LT5qb3VybmFsX2luZm8gZm9yIHRoaXMuCisJCSAqLworCQljdXJyZW50LT5qb3VybmFsX2luZm8gPSAmb3V0c3RhbmRpbmdfZXh0ZW50czsKIAl9IGVsc2UgaWYgKHRlc3RfYml0KEJUUkZTX0lOT0RFX1JFQURESU9fTkVFRF9MT0NLLAogCQkJCSAgICAgJkJUUkZTX0koaW5vZGUpLT5ydW50aW1lX2ZsYWdzKSkgewogCQlpbm9kZV9kaW9fZG9uZShpbm9kZSk7CkBAIC04MTI0LDYgKzgxNzksNyBAQAogCQkJaXRlciwgb2Zmc2V0LCBidHJmc19nZXRfYmxvY2tzX2RpcmVjdCwgTlVMTCwKIAkJCWJ0cmZzX3N1Ym1pdF9kaXJlY3QsIGZsYWdzKTsKIAlpZiAocncgJiBXUklURSkgeworCQljdXJyZW50LT5qb3VybmFsX2luZm8gPSBOVUxMOwogCQlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVJT0NCUVVFVUVEKQogCQkJYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9zcGFjZShpbm9kZSwgY291bnQpOwogCQllbHNlIGlmIChyZXQgPj0gMCAmJiAoc2l6ZV90KXJldCA8IGNvdW50KQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcWdyb3VwLmMgYi9mcy9idHJmcy9xZ3JvdXAuYwppbmRleCA5NzE1OWE4Li4wNThjNzllIDEwMDY0NAotLS0gYS9mcy9idHJmcy9xZ3JvdXAuYworKysgYi9mcy9idHJmcy9xZ3JvdXAuYwpAQCAtMTI1OSw3ICsxMjU5LDcgQEAKIAlpZiAob3BlcjEtPnNlcSA8IG9wZXIyLT5zZXEpCiAJCXJldHVybiAtMTsKIAlpZiAob3BlcjEtPnNlcSA+IG9wZXIyLT5zZXEpCi0JCXJldHVybiAtMTsKKwkJcmV0dXJuIDE7CiAJaWYgKG9wZXIxLT5yZWZfcm9vdCA8IG9wZXIyLT5yZWZfcm9vdCkKIAkJcmV0dXJuIC0xOwogCWlmIChvcGVyMS0+cmVmX3Jvb3QgPiBvcGVyMi0+cmVmX3Jvb3QpCmRpZmYgLS1naXQgYS9mcy9idHJmcy90ZXN0cy9pbm9kZS10ZXN0cy5jIGIvZnMvYnRyZnMvdGVzdHMvaW5vZGUtdGVzdHMuYwppbmRleCBhMTE2YjU1Li4wNTRmYzBkIDEwMDY0NAotLS0gYS9mcy9idHJmcy90ZXN0cy9pbm9kZS10ZXN0cy5jCisrKyBiL2ZzL2J0cmZzL3Rlc3RzL2lub2RlLXRlc3RzLmMKQEAgLTkxMSw2ICs5MTEsMTk3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCB0ZXN0X2V4dGVudF9hY2NvdW50aW5nKHZvaWQpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IE5VTEw7CisJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBOVUxMOworCWludCByZXQgPSAtRU5PTUVNOworCisJaW5vZGUgPSBidHJmc19uZXdfdGVzdF9pbm9kZSgpOworCWlmICghaW5vZGUpIHsKKwkJdGVzdF9tc2coIkNvdWxkbid0IGFsbG9jYXRlIGlub2RlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyb290ID0gYnRyZnNfYWxsb2NfZHVtbXlfcm9vdCgpOworCWlmIChJU19FUlIocm9vdCkpIHsKKwkJdGVzdF9tc2coIkNvdWxkbid0IGFsbG9jYXRlIHJvb3RcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlyb290LT5mc19pbmZvID0gYnRyZnNfYWxsb2NfZHVtbXlfZnNfaW5mbygpOworCWlmICghcm9vdC0+ZnNfaW5mbykgeworCQl0ZXN0X21zZygiQ291bGRuJ3QgYWxsb2NhdGUgZHVtbXkgZnMgaW5mb1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCUJUUkZTX0koaW5vZGUpLT5yb290ID0gcm9vdDsKKwlidHJmc190ZXN0X2lub2RlX3NldF9vcHMoaW5vZGUpOworCisJLyogW0JUUkZTX01BWF9FWFRFTlRfU0laRV0gKi8KKwlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cysrOworCXJldCA9IGJ0cmZzX3NldF9leHRlbnRfZGVsYWxsb2MoaW5vZGUsIDAsIEJUUkZTX01BWF9FWFRFTlRfU0laRSAtIDEsCisJCQkJCU5VTEwpOworCWlmIChyZXQpIHsKKwkJdGVzdF9tc2coImJ0cmZzX3NldF9leHRlbnRfZGVsYWxsb2MgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMgIT0gMSkgeworCQlyZXQgPSAtRUlOVkFMOworCQl0ZXN0X21zZygiTWlzY291bnQsIHdhbnRlZCAxLCBnb3QgJXVcbiIsCisJCQkgQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBbQlRSRlNfTUFYX0VYVEVOVF9TSVpFXVs0a10gKi8KKwlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cysrOworCXJldCA9IGJ0cmZzX3NldF9leHRlbnRfZGVsYWxsb2MoaW5vZGUsIEJUUkZTX01BWF9FWFRFTlRfU0laRSwKKwkJCQkJQlRSRlNfTUFYX0VYVEVOVF9TSVpFICsgNDA5NSwgTlVMTCk7CisJaWYgKHJldCkgeworCQl0ZXN0X21zZygiYnRyZnNfc2V0X2V4dGVudF9kZWxhbGxvYyByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyAhPSAyKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCXRlc3RfbXNnKCJNaXNjb3VudCwgd2FudGVkIDIsIGdvdCAldVxuIiwKKwkJCSBCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFtCVFJGU19NQVhfRVhURU5UX1NJWkUvMl1bNEsgSE9MRV1bdGhlIHJlc3RdICovCisJcmV0ID0gY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCisJCQkgICAgICAgQlRSRlNfTUFYX0VYVEVOVF9TSVpFID4+IDEsCisJCQkgICAgICAgKEJUUkZTX01BWF9FWFRFTlRfU0laRSA+PiAxKSArIDQwOTUsCisJCQkgICAgICAgRVhURU5UX0RFTEFMTE9DIHwgRVhURU5UX0RJUlRZIHwKKwkJCSAgICAgICBFWFRFTlRfVVBUT0RBVEUgfCBFWFRFTlRfRE9fQUNDT1VOVElORywgMCwgMCwKKwkJCSAgICAgICBOVUxMLCBHRlBfTk9GUyk7CisJaWYgKHJldCkgeworCQl0ZXN0X21zZygiY2xlYXJfZXh0ZW50X2JpdCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyAhPSAyKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCXRlc3RfbXNnKCJNaXNjb3VudCwgd2FudGVkIDIsIGdvdCAldVxuIiwKKwkJCSBCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFtCVFJGU19NQVhfRVhURU5UX1NJWkVdWzRLXSAqLworCUJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzKys7CisJcmV0ID0gYnRyZnNfc2V0X2V4dGVudF9kZWxhbGxvYyhpbm9kZSwgQlRSRlNfTUFYX0VYVEVOVF9TSVpFID4+IDEsCisJCQkJCShCVFJGU19NQVhfRVhURU5UX1NJWkUgPj4gMSkgKyA0MDk1LAorCQkJCQlOVUxMKTsKKwlpZiAocmV0KSB7CisJCXRlc3RfbXNnKCJidHJmc19zZXRfZXh0ZW50X2RlbGFsbG9jIHJldHVybmVkICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJaWYgKEJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzICE9IDIpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJdGVzdF9tc2coIk1pc2NvdW50LCB3YW50ZWQgMiwgZ290ICV1XG4iLAorCQkJIEJUUkZTX0koaW5vZGUpLT5vdXRzdGFuZGluZ19leHRlbnRzKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBbQlRSRlNfTUFYX0VYVEVOVF9TSVpFKzRLXVs0SyBIT0xFXVtCVFJGU19NQVhfRVhURU5UX1NJWkUrNEtdCisJICoKKwkgKiBJJ20gYXJ0aWZpY2lhbGx5IGFkZGluZyAyIHRvIG91dHN0YW5kaW5nX2V4dGVudHMgYmVjYXVzZSBpbiB0aGUKKwkgKiBidWZmZXJlZCBJTyBjYXNlIHdlJ2QgYWRkIHRoaW5ncyB1cCBhcyB3ZSBnbywgYnV0IEkgZG9uJ3QgZmVlbCBsaWtlCisJICogZG9pbmcgdGhhdCBoZXJlLCB0aGlzIGlzbid0IHRoZSBpbnRlcmVzdGluZyBjYXNlIHdlIHdhbnQgdG8gdGVzdC4KKwkgKi8KKwlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyArPSAyOworCXJldCA9IGJ0cmZzX3NldF9leHRlbnRfZGVsYWxsb2MoaW5vZGUsIEJUUkZTX01BWF9FWFRFTlRfU0laRSArIDgxOTIsCisJCQkJCShCVFJGU19NQVhfRVhURU5UX1NJWkUgPDwgMSkgKyAxMjI4NywKKwkJCQkJTlVMTCk7CisJaWYgKHJldCkgeworCQl0ZXN0X21zZygiYnRyZnNfc2V0X2V4dGVudF9kZWxhbGxvYyByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyAhPSA0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCXRlc3RfbXNnKCJNaXNjb3VudCwgd2FudGVkIDQsIGdvdCAldVxuIiwKKwkJCSBCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFtCVFJGU19NQVhfRVhURU5UX1NJWkUrNGtdWzRrXVtCVFJGU19NQVhfRVhURU5UX1NJWkUrNGtdICovCisJQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMrKzsKKwlyZXQgPSBidHJmc19zZXRfZXh0ZW50X2RlbGFsbG9jKGlub2RlLCBCVFJGU19NQVhfRVhURU5UX1NJWkUrNDA5NiwKKwkJCQkJQlRSRlNfTUFYX0VYVEVOVF9TSVpFKzgxOTEsIE5VTEwpOworCWlmIChyZXQpIHsKKwkJdGVzdF9tc2coImJ0cmZzX3NldF9leHRlbnRfZGVsYWxsb2MgcmV0dXJuZWQgJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMgIT0gMykgeworCQlyZXQgPSAtRUlOVkFMOworCQl0ZXN0X21zZygiTWlzY291bnQsIHdhbnRlZCAzLCBnb3QgJXVcbiIsCisJCQkgQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBbQlRSRlNfTUFYX0VYVEVOVF9TSVpFKzRrXVs0SyBIT0xFXVtCVFJGU19NQVhfRVhURU5UX1NJWkUrNGtdICovCisJcmV0ID0gY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsCisJCQkgICAgICAgQlRSRlNfTUFYX0VYVEVOVF9TSVpFKzQwOTYsCisJCQkgICAgICAgQlRSRlNfTUFYX0VYVEVOVF9TSVpFKzgxOTEsCisJCQkgICAgICAgRVhURU5UX0RJUlRZIHwgRVhURU5UX0RFTEFMTE9DIHwKKwkJCSAgICAgICBFWFRFTlRfRE9fQUNDT1VOVElORyB8IEVYVEVOVF9VUFRPREFURSwgMCwgMCwKKwkJCSAgICAgICBOVUxMLCBHRlBfTk9GUyk7CisJaWYgKHJldCkgeworCQl0ZXN0X21zZygiY2xlYXJfZXh0ZW50X2JpdCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyAhPSA0KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCXRlc3RfbXNnKCJNaXNjb3VudCwgd2FudGVkIDQsIGdvdCAldVxuIiwKKwkJCSBCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogUmVmaWxsIHRoZSBob2xlIGFnYWluIGp1c3QgZm9yIGdvb2QgbWVhc3VyZSwgYmVjYXVzZSBJIHRob3VnaHQgaXQKKwkgKiBtaWdodCBmYWlsIGFuZCBJJ2QgcmF0aGVyIHNhdGlzZnkgbXkgcGFyYW5vaWEgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cysrOworCXJldCA9IGJ0cmZzX3NldF9leHRlbnRfZGVsYWxsb2MoaW5vZGUsIEJUUkZTX01BWF9FWFRFTlRfU0laRSs0MDk2LAorCQkJCQlCVFJGU19NQVhfRVhURU5UX1NJWkUrODE5MSwgTlVMTCk7CisJaWYgKHJldCkgeworCQl0ZXN0X21zZygiYnRyZnNfc2V0X2V4dGVudF9kZWxhbGxvYyByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyAhPSAzKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCXRlc3RfbXNnKCJNaXNjb3VudCwgd2FudGVkIDMsIGdvdCAldVxuIiwKKwkJCSBCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEVtcHR5ICovCisJcmV0ID0gY2xlYXJfZXh0ZW50X2JpdCgmQlRSRlNfSShpbm9kZSktPmlvX3RyZWUsIDAsICh1NjQpLTEsCisJCQkgICAgICAgRVhURU5UX0RJUlRZIHwgRVhURU5UX0RFTEFMTE9DIHwKKwkJCSAgICAgICBFWFRFTlRfRE9fQUNDT1VOVElORyB8IEVYVEVOVF9VUFRPREFURSwgMCwgMCwKKwkJCSAgICAgICBOVUxMLCBHRlBfTk9GUyk7CisJaWYgKHJldCkgeworCQl0ZXN0X21zZygiY2xlYXJfZXh0ZW50X2JpdCByZXR1cm5lZCAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cykgeworCQlyZXQgPSAtRUlOVkFMOworCQl0ZXN0X21zZygiTWlzY291bnQsIHdhbnRlZCAwLCBnb3QgJXVcbiIsCisJCQkgQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMpOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0gMDsKK291dDoKKwlpZiAocmV0KQorCQljbGVhcl9leHRlbnRfYml0KCZCVFJGU19JKGlub2RlKS0+aW9fdHJlZSwgMCwgKHU2NCktMSwKKwkJCQkgRVhURU5UX0RJUlRZIHwgRVhURU5UX0RFTEFMTE9DIHwKKwkJCQkgRVhURU5UX0RPX0FDQ09VTlRJTkcgfCBFWFRFTlRfVVBUT0RBVEUsIDAsIDAsCisJCQkJIE5VTEwsIEdGUF9OT0ZTKTsKKwlpcHV0KGlub2RlKTsKKwlidHJmc19mcmVlX2R1bW15X3Jvb3Qocm9vdCk7CisJcmV0dXJuIHJldDsKK30KKwogaW50IGJ0cmZzX3Rlc3RfaW5vZGVzKHZvaWQpCiB7CiAJaW50IHJldDsKQEAgLTkyNCw1ICsxMTE1LDkgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCXRlc3RfbXNnKCJSdW5uaW5nIGhvbGUgZmlyc3QgYnRyZnNfZ2V0X2V4dGVudCB0ZXN0XG4iKTsKLQlyZXR1cm4gdGVzdF9ob2xlX2ZpcnN0KCk7CisJcmV0ID0gdGVzdF9ob2xlX2ZpcnN0KCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwl0ZXN0X21zZygiUnVubmluZyBvdXRzdGFuZGluZ19leHRlbnRzIHRlc3RzXG4iKTsKKwlyZXR1cm4gdGVzdF9leHRlbnRfYWNjb3VudGluZygpOwogfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYyBiL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKaW5kZXggODhlNTFhZC4uOGJlNDI3OCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYworKysgYi9mcy9idHJmcy90cmFuc2FjdGlvbi5jCkBAIC0xMDIzLDE3ICsxMDIzLDEzIEBACiAJdTY0IG9sZF9yb290X2J5dGVucjsKIAl1NjQgb2xkX3Jvb3RfdXNlZDsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqdHJlZV9yb290ID0gcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290OwotCWJvb2wgZXh0ZW50X3Jvb3QgPSAocm9vdC0+b2JqZWN0aWQgPT0gQlRSRlNfRVhURU5UX1RSRUVfT0JKRUNUSUQpOwogCiAJb2xkX3Jvb3RfdXNlZCA9IGJ0cmZzX3Jvb3RfdXNlZCgmcm9vdC0+cm9vdF9pdGVtKTsKLQlidHJmc193cml0ZV9kaXJ0eV9ibG9ja19ncm91cHModHJhbnMsIHJvb3QpOwogCiAJd2hpbGUgKDEpIHsKIAkJb2xkX3Jvb3RfYnl0ZW5yID0gYnRyZnNfcm9vdF9ieXRlbnIoJnJvb3QtPnJvb3RfaXRlbSk7CiAJCWlmIChvbGRfcm9vdF9ieXRlbnIgPT0gcm9vdC0+bm9kZS0+c3RhcnQgJiYKLQkJICAgIG9sZF9yb290X3VzZWQgPT0gYnRyZnNfcm9vdF91c2VkKCZyb290LT5yb290X2l0ZW0pICYmCi0JCSAgICAoIWV4dGVudF9yb290IHx8Ci0JCSAgICAgbGlzdF9lbXB0eSgmdHJhbnMtPnRyYW5zYWN0aW9uLT5kaXJ0eV9iZ3MpKSkKKwkJICAgIG9sZF9yb290X3VzZWQgPT0gYnRyZnNfcm9vdF91c2VkKCZyb290LT5yb290X2l0ZW0pKQogCQkJYnJlYWs7CiAKIAkJYnRyZnNfc2V0X3Jvb3Rfbm9kZSgmcm9vdC0+cm9vdF9pdGVtLCByb290LT5ub2RlKTsKQEAgLTEwNDQsMTQgKzEwNDAsNiBAQAogCQkJcmV0dXJuIHJldDsKIAogCQlvbGRfcm9vdF91c2VkID0gYnRyZnNfcm9vdF91c2VkKCZyb290LT5yb290X2l0ZW0pOwotCQlpZiAoZXh0ZW50X3Jvb3QpIHsKLQkJCXJldCA9IGJ0cmZzX3dyaXRlX2RpcnR5X2Jsb2NrX2dyb3Vwcyh0cmFucywgcm9vdCk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJcmV0ID0gYnRyZnNfcnVuX2RlbGF5ZWRfcmVmcyh0cmFucywgcm9vdCwgKHVuc2lnbmVkIGxvbmcpLTEpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTEwNjgsNiArMTA1Niw3IEBACiAJCQkJCSBzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisJc3RydWN0IGxpc3RfaGVhZCAqZGlydHlfYmdzID0gJnRyYW5zLT50cmFuc2FjdGlvbi0+ZGlydHlfYmdzOwogCXN0cnVjdCBsaXN0X2hlYWQgKm5leHQ7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmViOwogCWludCByZXQ7CkBAIC0xMDk1LDExICsxMDg0LDE1IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAorCXJldCA9IGJ0cmZzX3NldHVwX3NwYWNlX2NhY2hlKHRyYW5zLCByb290KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJLyogcnVuX3Fncm91cHMgbWlnaHQgaGF2ZSBhZGRlZCBzb21lIG1vcmUgcmVmcyAqLwogCXJldCA9IGJ0cmZzX3J1bl9kZWxheWVkX3JlZnModHJhbnMsIHJvb3QsICh1bnNpZ25lZCBsb25nKS0xKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCithZ2FpbjoKIAl3aGlsZSAoIWxpc3RfZW1wdHkoJmZzX2luZm8tPmRpcnR5X2Nvd29ubHlfcm9vdHMpKSB7CiAJCW5leHQgPSBmc19pbmZvLT5kaXJ0eV9jb3dvbmx5X3Jvb3RzLm5leHQ7CiAJCWxpc3RfZGVsX2luaXQobmV4dCk7CkBAIC0xMTEyLDggKzExMDUsMjMgQEAKIAkJcmV0ID0gdXBkYXRlX2Nvd29ubHlfcm9vdCh0cmFucywgcm9vdCk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBidHJmc19ydW5fZGVsYXllZF9yZWZzKHRyYW5zLCByb290LCAodW5zaWduZWQgbG9uZyktMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAorCXdoaWxlICghbGlzdF9lbXB0eShkaXJ0eV9iZ3MpKSB7CisJCXJldCA9IGJ0cmZzX3dyaXRlX2RpcnR5X2Jsb2NrX2dyb3Vwcyh0cmFucywgcm9vdCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlyZXQgPSBidHJmc19ydW5fZGVsYXllZF9yZWZzKHRyYW5zLCByb290LCAodW5zaWduZWQgbG9uZyktMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghbGlzdF9lbXB0eSgmZnNfaW5mby0+ZGlydHlfY293b25seV9yb290cykpCisJCWdvdG8gYWdhaW47CisKIAlsaXN0X2FkZF90YWlsKCZmc19pbmZvLT5leHRlbnRfcm9vdC0+ZGlydHlfbGlzdCwKIAkJICAgICAgJnRyYW5zLT50cmFuc2FjdGlvbi0+c3dpdGNoX2NvbW1pdHMpOwogCWJ0cmZzX2FmdGVyX2Rldl9yZXBsYWNlX2NvbW1pdChmc19pbmZvKTsKQEAgLTE4MTEsNiArMTgxOSw5IEBACiAKIAkJd2FpdF9mb3JfY29tbWl0KHJvb3QsIGN1cl90cmFucyk7CiAKKwkJaWYgKHVubGlrZWx5KGN1cl90cmFucy0+YWJvcnRlZCkpCisJCQlyZXQgPSBjdXJfdHJhbnMtPmFib3J0ZWQ7CisKIAkJYnRyZnNfcHV0X3RyYW5zYWN0aW9uKGN1cl90cmFucyk7CiAKIAkJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2ZzL2J1ZmZlci5jIGIvZnMvYnVmZmVyLmMKaW5kZXggMjA4MDVkYi4uYzdhNTYwMiAxMDA2NDQKLS0tIGEvZnMvYnVmZmVyLmMKKysrIGIvZnMvYnVmZmVyLmMKQEAgLTMyNDMsOCArMzI0Myw4IEBACiAJICogdG8gc3luY2hyb25pc2UgYWdhaW5zdCBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnMgYW5kIHByZXZlbnQgdGhlCiAJICogZGlydHkgYml0IGZyb20gYmVpbmcgbG9zdC4KIAkgKi8KLQlpZiAocmV0KQotCQljYW5jZWxfZGlydHlfcGFnZShwYWdlLCBQQUdFX0NBQ0hFX1NJWkUpOworCWlmIChyZXQgJiYgVGVzdENsZWFyUGFnZURpcnR5KHBhZ2UpKQorCQlhY2NvdW50X3BhZ2VfY2xlYW5lZChwYWdlLCBtYXBwaW5nKTsKIAlzcGluX3VubG9jaygmbWFwcGluZy0+cHJpdmF0ZV9sb2NrKTsKIG91dDoKIAlpZiAoYnVmZmVyc190b19mcmVlKSB7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2ZpbGUuYyBiL2ZzL2NlcGgvZmlsZS5jCmluZGV4IGQ1MzMwNzUuLjU2MjM3ZWEgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvZmlsZS5jCisrKyBiL2ZzL2NlcGgvZmlsZS5jCkBAIC03LDcgKzcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9mYWxsb2MuaD4KIAogI2luY2x1ZGUgInN1cGVyLmgiCkBAIC04MDgsNyArODA3LDcgQEAKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlscCA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGNlcGhfZmlsZV9pbmZvICpmaSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzaXplX3QgbGVuID0gaW9jYi0+a2lfbmJ5dGVzOworCXNpemVfdCBsZW4gPSBpb3ZfaXRlcl9jb3VudCh0byk7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlscCk7CiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKIAlzdHJ1Y3QgcGFnZSAqcGlubmVkX3BhZ2UgPSBOVUxMOwpAQCAtMTMzMiw4ICsxMzMxLDYgQEAKIAkub3BlbiA9IGNlcGhfb3BlbiwKIAkucmVsZWFzZSA9IGNlcGhfcmVsZWFzZSwKIAkubGxzZWVrID0gY2VwaF9sbHNlZWssCi0JLnJlYWQgPSBuZXdfc3luY19yZWFkLAotCS53cml0ZSA9IG5ld19zeW5jX3dyaXRlLAogCS5yZWFkX2l0ZXIgPSBjZXBoX3JlYWRfaXRlciwKIAkud3JpdGVfaXRlciA9IGNlcGhfd3JpdGVfaXRlciwKIAkubW1hcCA9IGNlcGhfbW1hcCwKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwppbmRleCA0YWM3NDQ1Li5hYTBkYzI1IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCkBAIC0xLDYgKzEsOSBAQAogLyoKICAqICAgZnMvY2lmcy9jaWZzZW5jcnlwdC5jCiAgKgorICogICBFbmNyeXB0aW9uIGFuZCBoYXNoaW5nIG9wZXJhdGlvbnMgcmVsYXRpbmcgdG8gTlRMTSwgTlRMTXYyLiAgU2VlIE1TLU5MTVAKKyAqICAgZm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24KKyAqCiAgKiAgIENvcHlyaWdodCAoQykgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyAgQ29ycC4sIDIwMDUsMjAxMwogICogICBBdXRob3Iocyk6IFN0ZXZlIEZyZW5jaCAoc2ZyZW5jaEB1cy5pYm0uY29tKQogICoKQEAgLTUxNSw3ICs1MTgsOCBAQAogCQkJCSBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gcmM7CiAJCX0KLQl9IGVsc2UgaWYgKHNlcy0+c2VydmVyTmFtZSkgeworCX0gZWxzZSB7CisJCS8qIFdlIHVzZSBzZXMtPnNlcnZlck5hbWUgaWYgbm8gZG9tYWluIG5hbWUgYXZhaWxhYmxlICovCiAJCWxlbiA9IHN0cmxlbihzZXMtPnNlcnZlck5hbWUpOwogCiAJCXNlcnZlciA9IGttYWxsb2MoMiArIChsZW4gKiAyKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2NpZnNmcy5jIGIvZnMvY2lmcy9jaWZzZnMuYwppbmRleCBkNzJmZTM3Li5lYWFiNGIyIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNmcy5jCisrKyBiL2ZzL2NpZnMvY2lmc2ZzLmMKQEAgLTkwNiw4ICs5MDYsNiBAQAogfTsKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaWZzX2ZpbGVfb3BzID0gewotCS5yZWFkID0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUgPSBuZXdfc3luY193cml0ZSwKIAkucmVhZF9pdGVyID0gY2lmc19sb29zZV9yZWFkX2l0ZXIsCiAJLndyaXRlX2l0ZXIgPSBjaWZzX2ZpbGVfd3JpdGVfaXRlciwKIAkub3BlbiA9IGNpZnNfb3BlbiwKQEAgLTkyNiw4ICs5MjQsNiBAQAogfTsKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaWZzX2ZpbGVfc3RyaWN0X29wcyA9IHsKLQkucmVhZCA9IG5ld19zeW5jX3JlYWQsCi0JLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlciA9IGNpZnNfc3RyaWN0X3JlYWR2LAogCS53cml0ZV9pdGVyID0gY2lmc19zdHJpY3Rfd3JpdGV2LAogCS5vcGVuID0gY2lmc19vcGVuLApAQCAtOTQ3LDggKzk0Myw2IEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2lmc19maWxlX2RpcmVjdF9vcHMgPSB7CiAJLyogQkIgcmVldmFsdWF0ZSB3aGV0aGVyIHRoZXkgY2FuIGJlIGRvbmUgd2l0aCBkaXJlY3Rpbywgbm8gY2FjaGUgKi8KLQkucmVhZCA9IG5ld19zeW5jX3JlYWQsCi0JLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlciA9IGNpZnNfdXNlcl9yZWFkdiwKIAkud3JpdGVfaXRlciA9IGNpZnNfdXNlcl93cml0ZXYsCiAJLm9wZW4gPSBjaWZzX29wZW4sCkBAIC05NjcsOCArOTYxLDYgQEAKIH07CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2lmc19maWxlX25vYnJsX29wcyA9IHsKLQkucmVhZCA9IG5ld19zeW5jX3JlYWQsCi0JLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlciA9IGNpZnNfbG9vc2VfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyID0gY2lmc19maWxlX3dyaXRlX2l0ZXIsCiAJLm9wZW4gPSBjaWZzX29wZW4sCkBAIC05ODYsOCArOTc4LDYgQEAKIH07CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2lmc19maWxlX3N0cmljdF9ub2JybF9vcHMgPSB7Ci0JLnJlYWQgPSBuZXdfc3luY19yZWFkLAotCS53cml0ZSA9IG5ld19zeW5jX3dyaXRlLAogCS5yZWFkX2l0ZXIgPSBjaWZzX3N0cmljdF9yZWFkdiwKIAkud3JpdGVfaXRlciA9IGNpZnNfc3RyaWN0X3dyaXRldiwKIAkub3BlbiA9IGNpZnNfb3BlbiwKQEAgLTEwMDYsOCArOTk2LDYgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjaWZzX2ZpbGVfZGlyZWN0X25vYnJsX29wcyA9IHsKIAkvKiBCQiByZWV2YWx1YXRlIHdoZXRoZXIgdGhleSBjYW4gYmUgZG9uZSB3aXRoIGRpcmVjdGlvLCBubyBjYWNoZSAqLwotCS5yZWFkID0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUgPSBuZXdfc3luY193cml0ZSwKIAkucmVhZF9pdGVyID0gY2lmc191c2VyX3JlYWR2LAogCS53cml0ZV9pdGVyID0gY2lmc191c2VyX3dyaXRldiwKIAkub3BlbiA9IGNpZnNfb3BlbiwKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY29ubmVjdC5jIGIvZnMvY2lmcy9jb25uZWN0LmMKaW5kZXggZDNhYTk5OS4uZjNiZmUwOCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jb25uZWN0LmMKKysrIGIvZnMvY2lmcy9jb25uZWN0LmMKQEAgLTc3Myw4ICs3NzMsNyBAQAogCiAJbGVuZ3RoID0gYXRvbWljX2RlY19yZXR1cm4oJnRjcFNlc0FsbG9jQ291bnQpOwogCWlmIChsZW5ndGggPiAwKQotCQltZW1wb29sX3Jlc2l6ZShjaWZzX3JlcV9wb29scCwgbGVuZ3RoICsgY2lmc19taW5fcmN2LAotCQkJCUdGUF9LRVJORUwpOworCQltZW1wb29sX3Jlc2l6ZShjaWZzX3JlcV9wb29scCwgbGVuZ3RoICsgY2lmc19taW5fcmN2KTsKIH0KIAogc3RhdGljIGludApAQCAtODQ4LDggKzg0Nyw3IEBACiAKIAlsZW5ndGggPSBhdG9taWNfaW5jX3JldHVybigmdGNwU2VzQWxsb2NDb3VudCk7CiAJaWYgKGxlbmd0aCA+IDEpCi0JCW1lbXBvb2xfcmVzaXplKGNpZnNfcmVxX3Bvb2xwLCBsZW5ndGggKyBjaWZzX21pbl9yY3YsCi0JCQkJR0ZQX0tFUk5FTCk7CisJCW1lbXBvb2xfcmVzaXplKGNpZnNfcmVxX3Bvb2xwLCBsZW5ndGggKyBjaWZzX21pbl9yY3YpOwogCiAJc2V0X2ZyZWV6YWJsZSgpOwogCXdoaWxlIChzZXJ2ZXItPnRjcFN0YXR1cyAhPSBDaWZzRXhpdGluZykgewpAQCAtMTU5OSw2ICsxNTk3LDggQEAKIAkJCQlwcl93YXJuKCJDSUZTOiB1c2VybmFtZSB0b28gbG9uZ1xuIik7CiAJCQkJZ290byBjaWZzX3BhcnNlX21vdW50X2VycjsKIAkJCX0KKworCQkJa2ZyZWUodm9sLT51c2VybmFtZSk7CiAJCQl2b2wtPnVzZXJuYW1lID0ga3N0cmR1cChzdHJpbmcsIEdGUF9LRVJORUwpOwogCQkJaWYgKCF2b2wtPnVzZXJuYW1lKQogCQkJCWdvdG8gY2lmc19wYXJzZV9tb3VudF9lcnI7CkBAIC0xNzAwLDYgKzE3MDAsNyBAQAogCQkJCWdvdG8gY2lmc19wYXJzZV9tb3VudF9lcnI7CiAJCQl9CiAKKwkJCWtmcmVlKHZvbC0+ZG9tYWlubmFtZSk7CiAJCQl2b2wtPmRvbWFpbm5hbWUgPSBrc3RyZHVwKHN0cmluZywgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoIXZvbC0+ZG9tYWlubmFtZSkgewogCQkJCXByX3dhcm4oIkNJRlM6IG5vIG1lbW9yeSBmb3IgZG9tYWlubmFtZVxuIik7CkBAIC0xNzMxLDYgKzE3MzIsNyBAQAogCQkJfQogCiAJCQkgaWYgKHN0cm5jYXNlY21wKHN0cmluZywgImRlZmF1bHQiLCA3KSAhPSAwKSB7CisJCQkJa2ZyZWUodm9sLT5pb2NoYXJzZXQpOwogCQkJCXZvbC0+aW9jaGFyc2V0ID0ga3N0cmR1cChzdHJpbmcsCiAJCQkJCQkJIEdGUF9LRVJORUwpOwogCQkJCWlmICghdm9sLT5pb2NoYXJzZXQpIHsKQEAgLTI5MTMsOCArMjkxNSw3IEBACiAJCSAqIGNhbGxpbmcgbmFtZSBlbmRzIGluIG51bGwgKGJ5dGUgMTYpIGZyb20gb2xkIHNtYgogCQkgKiBjb252ZW50aW9uLgogCQkgKi8KLQkJaWYgKHNlcnZlci0+d29ya3N0YXRpb25fUkZDMTAwMV9uYW1lICYmCi0JCSAgICBzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZVswXSAhPSAwKQorCQlpZiAoc2VydmVyLT53b3Jrc3RhdGlvbl9SRkMxMDAxX25hbWVbMF0gIT0gMCkKIAkJCXJmYzEwMDJtYW5nbGUoc2VzX2luaXRfYnVmLT50cmFpbGVyLgogCQkJCSAgICAgIHNlc3Npb25fcmVxLmNhbGxpbmdfbmFtZSwKIAkJCQkgICAgICBzZXJ2ZXItPndvcmtzdGF0aW9uX1JGQzEwMDFfbmFtZSwKQEAgLTM2OTIsNiArMzY5MywxMiBAQAogI2VuZGlmIC8qIENJRlNfV0VBS19QV19IQVNIICovCiAJCXJjID0gU01CTlRlbmNyeXB0KHRjb24tPnBhc3N3b3JkLCBzZXMtPnNlcnZlci0+Y3J5cHRrZXksCiAJCQkJCWJjY19wdHIsIG5sc19jb2RlcGFnZSk7CisJCWlmIChyYykgeworCQkJY2lmc19kYmcoRllJLCAiJXMgQ2FuJ3QgZ2VuZXJhdGUgTlRMTSByc3AuIEVycm9yOiAlZFxuIiwKKwkJCQkgX19mdW5jX18sIHJjKTsKKwkJCWNpZnNfYnVmX3JlbGVhc2Uoc21iX2J1ZmZlcik7CisJCQlyZXR1cm4gcmM7CisJCX0KIAogCQliY2NfcHRyICs9IENJRlNfQVVUSF9SRVNQX1NJWkU7CiAJCWlmIChzZXMtPmNhcGFiaWxpdGllcyAmIENBUF9VTklDT0RFKSB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IGE5NGIzZTYuLmNhMzBjMzkgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC0xODIzLDYgKzE4MjMsNyBAQAogCQkJY2lmc0ZpbGVJbmZvX3B1dChpbnZfZmlsZSk7CiAJCQlzcGluX2xvY2soJmNpZnNfZmlsZV9saXN0X2xvY2spOwogCQkJKytyZWZpbmQ7CisJCQlpbnZfZmlsZSA9IE5VTEw7CiAJCQlnb3RvIHJlZmluZF93cml0YWJsZTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvaW5vZGUuYyBiL2ZzL2NpZnMvaW5vZGUuYwppbmRleCAyZDRmMzcyLi4zZTEyNmQ3IDEwMDY0NAotLS0gYS9mcy9jaWZzL2lub2RlLmMKKysrIGIvZnMvY2lmcy9pbm9kZS5jCkBAIC03NzEsNiArNzcxLDggQEAKIAkJCQljaWZzX2J1Zl9yZWxlYXNlKHNyY2hpbmYtPm50d3JrX2J1Zl9zdGFydCk7CiAJCQl9CiAJCQlrZnJlZShzcmNoaW5mKTsKKwkJCWlmIChyYykKKwkJCQlnb3RvIGNnaWlfZXhpdDsKIAl9IGVsc2UKIAkJZ290byBjZ2lpX2V4aXQ7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvc21iMm1pc2MuYyBiL2ZzL2NpZnMvc21iMm1pc2MuYwppbmRleCA2ODlmMDM1Li4yMmRmZGYxIDEwMDY0NAotLS0gYS9mcy9jaWZzL3NtYjJtaXNjLmMKKysrIGIvZnMvY2lmcy9zbWIybWlzYy5jCkBAIC0zMjIsNyArMzIyLDcgQEAKIAogCS8qIHJldHVybiBwb2ludGVyIHRvIGJlZ2lubmluZyBvZiBkYXRhIGFyZWEsIGllIG9mZnNldCBmcm9tIFNNQiBzdGFydCAqLwogCWlmICgoKm9mZiAhPSAwKSAmJiAoKmxlbiAhPSAwKSkKLQkJcmV0dXJuIGhkci0+UHJvdG9jb2xJZCArICpvZmY7CisJCXJldHVybiAoY2hhciAqKSgmaGRyLT5Qcm90b2NvbElkWzBdKSArICpvZmY7CiAJZWxzZQogCQlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvc21iMm9wcy5jIGIvZnMvY2lmcy9zbWIyb3BzLmMKaW5kZXggOTZiNWQ0MC4uZWFiMDVlMSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9zbWIyb3BzLmMKKysrIGIvZnMvY2lmcy9zbWIyb3BzLmMKQEAgLTY4NCw3ICs2ODQsOCBAQAogCiAJCQkvKiBObyBuZWVkIHRvIGNoYW5nZSBNYXhDaHVua3Mgc2luY2UgYWxyZWFkeSBzZXQgdG8gMSAqLwogCQkJY2h1bmtfc2l6ZXNfdXBkYXRlZCA9IHRydWU7Ci0JCX0KKwkJfSBlbHNlCisJCQlnb3RvIGNjaHVua19vdXQ7CiAJfQogCiBjY2h1bmtfb3V0OgpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9zbWIycGR1LmMgYi9mcy9jaWZzL3NtYjJwZHUuYwppbmRleCAzNDE3MzQwLi42NWNkN2E4IDEwMDY0NAotLS0gYS9mcy9jaWZzL3NtYjJwZHUuYworKysgYi9mcy9jaWZzL3NtYjJwZHUuYwpAQCAtMTIxOCw3ICsxMjE4LDcgQEAKIAlzdHJ1Y3Qgc21iMl9pb2N0bF9yZXEgKnJlcTsKIAlzdHJ1Y3Qgc21iMl9pb2N0bF9yc3AgKnJzcDsKIAlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXI7Ci0Jc3RydWN0IGNpZnNfc2VzICpzZXMgPSB0Y29uLT5zZXM7CisJc3RydWN0IGNpZnNfc2VzICpzZXM7CiAJc3RydWN0IGt2ZWMgaW92WzJdOwogCWludCByZXNwX2J1ZnR5cGU7CiAJaW50IG51bV9pb3ZlY3M7CkBAIC0xMjMzLDYgKzEyMzMsMTEgQEAKIAlpZiAocGxlbikKIAkJKnBsZW4gPSAwOwogCisJaWYgKHRjb24pCisJCXNlcyA9IHRjb24tPnNlczsKKwllbHNlCisJCXJldHVybiAtRUlPOworCiAJaWYgKHNlcyAmJiAoc2VzLT5zZXJ2ZXIpKQogCQlzZXJ2ZXIgPSBzZXMtPnNlcnZlcjsKIAllbHNlCkBAIC0xMjk2LDE0ICsxMzAxLDEyIEBACiAJcnNwID0gKHN0cnVjdCBzbWIyX2lvY3RsX3JzcCAqKWlvdlswXS5pb3ZfYmFzZTsKIAogCWlmICgocmMgIT0gMCkgJiYgKHJjICE9IC1FSU5WQUwpKSB7Ci0JCWlmICh0Y29uKQotCQkJY2lmc19zdGF0c19mYWlsX2luYyh0Y29uLCBTTUIyX0lPQ1RMX0hFKTsKKwkJY2lmc19zdGF0c19mYWlsX2luYyh0Y29uLCBTTUIyX0lPQ1RMX0hFKTsKIAkJZ290byBpb2N0bF9leGl0OwogCX0gZWxzZSBpZiAocmMgPT0gLUVJTlZBTCkgewogCQlpZiAoKG9wY29kZSAhPSBGU0NUTF9TUlZfQ09QWUNIVU5LX1dSSVRFKSAmJgogCQkgICAgKG9wY29kZSAhPSBGU0NUTF9TUlZfQ09QWUNIVU5LKSkgewotCQkJaWYgKHRjb24pCi0JCQkJY2lmc19zdGF0c19mYWlsX2luYyh0Y29uLCBTTUIyX0lPQ1RMX0hFKTsKKwkJCWNpZnNfc3RhdHNfZmFpbF9pbmModGNvbiwgU01CMl9JT0NUTF9IRSk7CiAJCQlnb3RvIGlvY3RsX2V4aXQ7CiAJCX0KIAl9CkBAIC0xNjI5LDcgKzE2MzIsNyBAQAogCiAJcmMgPSBTZW5kUmVjZWl2ZTIoeGlkLCBzZXMsIGlvdiwgMSwgJnJlc3BfYnVmdHlwZSwgMCk7CiAKLQlpZiAoKHJjICE9IDApICYmIHRjb24pCisJaWYgKHJjICE9IDApCiAJCWNpZnNfc3RhdHNfZmFpbF9pbmModGNvbiwgU01CMl9GTFVTSF9IRSk7CiAKIAlmcmVlX3JzcF9idWYocmVzcF9idWZ0eXBlLCBpb3ZbMF0uaW92X2Jhc2UpOwpAQCAtMjExNCw3ICsyMTE3LDcgQEAKIAlzdHJ1Y3Qga3ZlYyBpb3ZbMl07CiAJaW50IHJjID0gMDsKIAlpbnQgbGVuOwotCWludCByZXNwX2J1ZnR5cGU7CisJaW50IHJlc3BfYnVmdHlwZSA9IENJRlNfTk9fQlVGRkVSOwogCXVuc2lnbmVkIGNoYXIgKmJ1ZnB0cjsKIAlzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXI7CiAJc3RydWN0IGNpZnNfc2VzICpzZXMgPSB0Y29uLT5zZXM7CmRpZmYgLS1naXQgYS9mcy9jb2RhL2ZpbGUuYyBiL2ZzL2NvZGEvZmlsZS5jCmluZGV4IGQyNDRkNzQuLjFkYTM4MDUgMTAwNjQ0Ci0tLSBhL2ZzL2NvZGEvZmlsZS5jCisrKyBiL2ZzL2NvZGEvZmlsZS5jCkBAIC0yNywxOSArMjcsMTQgQEAKICNpbmNsdWRlICJjb2RhX2ludC5oIgogCiBzdGF0aWMgc3NpemVfdAotY29kYV9maWxlX3JlYWQoc3RydWN0IGZpbGUgKmNvZGFfZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCitjb2RhX2ZpbGVfcmVhZF9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKLQlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaTsKLQlzdHJ1Y3QgZmlsZSAqaG9zdF9maWxlOworCXN0cnVjdCBmaWxlICpjb2RhX2ZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBjb2RhX2ZpbGVfaW5mbyAqY2ZpID0gQ09EQV9GVE9DKGNvZGFfZmlsZSk7CiAKLQljZmkgPSBDT0RBX0ZUT0MoY29kYV9maWxlKTsKIAlCVUdfT04oIWNmaSB8fCBjZmktPmNmaV9tYWdpYyAhPSBDT0RBX01BR0lDKTsKLQlob3N0X2ZpbGUgPSBjZmktPmNmaV9jb250YWluZXI7CiAKLQlpZiAoIWhvc3RfZmlsZS0+Zl9vcC0+cmVhZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gaG9zdF9maWxlLT5mX29wLT5yZWFkKGhvc3RfZmlsZSwgYnVmLCBjb3VudCwgcHBvcyk7CisJcmV0dXJuIHZmc19pdGVyX3JlYWQoY2ZpLT5jZmlfY29udGFpbmVyLCB0bywgJmlvY2ItPmtpX3Bvcyk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC02NCwzMiArNTksMjUgQEAKIH0KIAogc3RhdGljIHNzaXplX3QKLWNvZGFfZmlsZV93cml0ZShzdHJ1Y3QgZmlsZSAqY29kYV9maWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK2NvZGFfZmlsZV93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmhvc3RfaW5vZGUsICpjb2RhX2lub2RlID0gZmlsZV9pbm9kZShjb2RhX2ZpbGUpOwotCXN0cnVjdCBjb2RhX2ZpbGVfaW5mbyAqY2ZpOworCXN0cnVjdCBmaWxlICpjb2RhX2ZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZSAqY29kYV9pbm9kZSA9IGZpbGVfaW5vZGUoY29kYV9maWxlKTsKKwlzdHJ1Y3QgY29kYV9maWxlX2luZm8gKmNmaSA9IENPREFfRlRPQyhjb2RhX2ZpbGUpOwogCXN0cnVjdCBmaWxlICpob3N0X2ZpbGU7CiAJc3NpemVfdCByZXQ7CiAKLQljZmkgPSBDT0RBX0ZUT0MoY29kYV9maWxlKTsKIAlCVUdfT04oIWNmaSB8fCBjZmktPmNmaV9tYWdpYyAhPSBDT0RBX01BR0lDKTsKKwogCWhvc3RfZmlsZSA9IGNmaS0+Y2ZpX2NvbnRhaW5lcjsKLQotCWlmICghaG9zdF9maWxlLT5mX29wLT53cml0ZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlob3N0X2lub2RlID0gZmlsZV9pbm9kZShob3N0X2ZpbGUpOwogCWZpbGVfc3RhcnRfd3JpdGUoaG9zdF9maWxlKTsKIAltdXRleF9sb2NrKCZjb2RhX2lub2RlLT5pX211dGV4KTsKLQotCXJldCA9IGhvc3RfZmlsZS0+Zl9vcC0+d3JpdGUoaG9zdF9maWxlLCBidWYsIGNvdW50LCBwcG9zKTsKLQotCWNvZGFfaW5vZGUtPmlfc2l6ZSA9IGhvc3RfaW5vZGUtPmlfc2l6ZTsKKwlyZXQgPSB2ZnNfaXRlcl93cml0ZShjZmktPmNmaV9jb250YWluZXIsIHRvLCAmaW9jYi0+a2lfcG9zKTsKKwljb2RhX2lub2RlLT5pX3NpemUgPSBmaWxlX2lub2RlKGhvc3RfZmlsZSktPmlfc2l6ZTsKIAljb2RhX2lub2RlLT5pX2Jsb2NrcyA9IChjb2RhX2lub2RlLT5pX3NpemUgKyA1MTEpID4+IDk7CiAJY29kYV9pbm9kZS0+aV9tdGltZSA9IGNvZGFfaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUVfU0VDOwogCW11dGV4X3VubG9jaygmY29kYV9pbm9kZS0+aV9tdXRleCk7CiAJZmlsZV9lbmRfd3JpdGUoaG9zdF9maWxlKTsKLQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTIzMSw4ICsyMTksOCBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNvZGFfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBjb2RhX2ZpbGVfcmVhZCwKLQkud3JpdGUJCT0gY29kYV9maWxlX3dyaXRlLAorCS5yZWFkX2l0ZXIJPSBjb2RhX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZV9pdGVyCT0gY29kYV9maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gY29kYV9maWxlX21tYXAsCiAJLm9wZW4JCT0gY29kYV9vcGVuLAogCS5yZWxlYXNlCT0gY29kYV9yZWxlYXNlLApkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2lvY3RsLmMgYi9mcy9jb21wYXRfaW9jdGwuYwppbmRleCBhZmVjNjQ1Li42YjhlMmYwIDEwMDY0NAotLS0gYS9mcy9jb21wYXRfaW9jdGwuYworKysgYi9mcy9jb21wYXRfaW9jdGwuYwpAQCAtNTcwLDYgKzU3MCw3IEBACiAjZGVmaW5lIEJORVBDT05OREVMCV9JT1coJ0InLCAyMDEsIGludCkKICNkZWZpbmUgQk5FUEdFVENPTk5MSVNUCV9JT1IoJ0InLCAyMTAsIGludCkKICNkZWZpbmUgQk5FUEdFVENPTk5JTkZPCV9JT1IoJ0InLCAyMTEsIGludCkKKyNkZWZpbmUgQk5FUEdFVFNVUFBGRUFUCV9JT1IoJ0InLCAyMTIsIGludCkKIAogI2RlZmluZSBDTVRQQ09OTkFERAlfSU9XKCdDJywgMjAwLCBpbnQpCiAjZGVmaW5lIENNVFBDT05OREVMCV9JT1coJ0MnLCAyMDEsIGludCkKQEAgLTEyNDcsNiArMTI0OCw3IEBACiBDT01QQVRJQkxFX0lPQ1RMKEJORVBDT05OREVMKQogQ09NUEFUSUJMRV9JT0NUTChCTkVQR0VUQ09OTkxJU1QpCiBDT01QQVRJQkxFX0lPQ1RMKEJORVBHRVRDT05OSU5GTykKK0NPTVBBVElCTEVfSU9DVEwoQk5FUEdFVFNVUFBGRUFUKQogQ09NUEFUSUJMRV9JT0NUTChDTVRQQ09OTkFERCkKIENPTVBBVElCTEVfSU9DVEwoQ01UUENPTk5ERUwpCiBDT01QQVRJQkxFX0lPQ1RMKENNVFBHRVRDT05OTElTVCkKZGlmZiAtLWdpdCBhL2ZzL2NvcmVkdW1wLmMgYi9mcy9jb3JlZHVtcC5jCmluZGV4IGYzMTk5MjYuLmJiYmUxMzkgMTAwNjQ0Ci0tLSBhL2ZzL2NvcmVkdW1wLmMKKysrIGIvZnMvY29yZWR1bXAuYwpAQCAtNjU3LDcgKzY1Nyw3IEBACiAJCSAqLwogCQlpZiAoIXVpZF9lcShpbm9kZS0+aV91aWQsIGN1cnJlbnRfZnN1aWQoKSkpCiAJCQlnb3RvIGNsb3NlX2ZhaWw7Ci0JCWlmICghY3BybS5maWxlLT5mX29wLT53cml0ZSkKKwkJaWYgKCEoY3BybS5maWxlLT5mX21vZGUgJiBGTU9ERV9DQU5fV1JJVEUpKQogCQkJZ290byBjbG9zZV9mYWlsOwogCQlpZiAoZG9fdHJ1bmNhdGUoY3BybS5maWxlLT5mX3BhdGguZGVudHJ5LCAwLCAwLCBjcHJtLmZpbGUpKQogCQkJZ290byBjbG9zZV9mYWlsOwpkaWZmIC0tZ2l0IGEvZnMvZGF4LmMgYi9mcy9kYXguYwppbmRleCBlZDE2MTllLi5kMGJkMWY0IDEwMDY0NAotLS0gYS9mcy9kYXguYworKysgYi9mcy9kYXguYwpAQCAtNDY0LDYgKzQ2NCwyMyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoZGF4X2ZhdWx0KTsKIAogLyoqCisgKiBkYXhfcGZuX21rd3JpdGUgLSBoYW5kbGUgZmlyc3Qgd3JpdGUgdG8gREFYIHBhZ2UKKyAqIEB2bWE6IFRoZSB2aXJ0dWFsIG1lbW9yeSBhcmVhIHdoZXJlIHRoZSBmYXVsdCBvY2N1cnJlZAorICogQHZtZjogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBmYXVsdAorICoKKyAqLworaW50IGRheF9wZm5fbWt3cml0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGZpbGVfaW5vZGUodm1hLT52bV9maWxlKS0+aV9zYjsKKworCXNiX3N0YXJ0X3BhZ2VmYXVsdChzYik7CisJZmlsZV91cGRhdGVfdGltZSh2bWEtPnZtX2ZpbGUpOworCXNiX2VuZF9wYWdlZmF1bHQoc2IpOworCXJldHVybiBWTV9GQVVMVF9OT1BBR0U7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkYXhfcGZuX21rd3JpdGUpOworCisvKioKICAqIGRheF96ZXJvX3BhZ2VfcmFuZ2UgLSB6ZXJvIGEgcmFuZ2Ugd2l0aGluIGEgcGFnZSBvZiBhIERBWCBmaWxlCiAgKiBAaW5vZGU6IFRoZSBmaWxlIGJlaW5nIHRydW5jYXRlZAogICogQGZyb206IFRoZSBmaWxlIG9mZnNldCB0aGF0IGlzIGJlaW5nIHRydW5jYXRlZCB0bwpkaWZmIC0tZ2l0IGEvZnMvZGNhY2hlLmMgYi9mcy9kY2FjaGUuYwppbmRleCBjNzFlMzczLi5kOTk3MzZhIDEwMDY0NAotLS0gYS9mcy9kY2FjaGUuYworKysgYi9mcy9kY2FjaGUuYwpAQCAtMjY5MCw3ICsyNjkwLDcgQEAKIAkJc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgZGVudHJ5ICphbGlhcykKIHsKIAlzdHJ1Y3QgbXV0ZXggKm0xID0gTlVMTCwgKm0yID0gTlVMTDsKLQlpbnQgcmV0ID0gLUVCVVNZOworCWludCByZXQgPSAtRVNUQUxFOwogCiAJLyogSWYgYWxpYXMgYW5kIGRlbnRyeSBzaGFyZSBhIHBhcmVudCwgdGhlbiBubyBleHRyYSBsb2NrcyByZXF1aXJlZCAqLwogCWlmIChhbGlhcy0+ZF9wYXJlbnQgPT0gZGVudHJ5LT5kX3BhcmVudCkKZGlmZiAtLWdpdCBhL2ZzL2RlYnVnZnMvaW5vZGUuYyBiL2ZzL2RlYnVnZnMvaW5vZGUuYwppbmRleCA5NjQwMGFiLi42MWU3MmQ0IDEwMDY0NAotLS0gYS9mcy9kZWJ1Z2ZzL2lub2RlLmMKKysrIGIvZnMvZGVidWdmcy9pbm9kZS5jCkBAIC0yNTQsNiArMjU0LDkgQEAKIAogCXByX2RlYnVnKCJkZWJ1Z2ZzOiBjcmVhdGluZyBmaWxlICclcydcbiIsbmFtZSk7CiAKKwlpZiAoSVNfRVJSKHBhcmVudCkpCisJCXJldHVybiBwYXJlbnQ7CisKIAllcnJvciA9IHNpbXBsZV9waW5fZnMoJmRlYnVnX2ZzX3R5cGUsICZkZWJ1Z2ZzX21vdW50LAogCQkJICAgICAgJmRlYnVnZnNfbW91bnRfY291bnQpOwogCWlmIChlcnJvcikKZGlmZiAtLWdpdCBhL2ZzL2RpcmVjdC1pby5jIGIvZnMvZGlyZWN0LWlvLmMKaW5kZXggZTE4MWI2Yi4uNmZiMDBlMyAxMDA2NDQKLS0tIGEvZnMvZGlyZWN0LWlvLmMKKysrIGIvZnMvZGlyZWN0LWlvLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogCiAvKgogICogSG93IG1hbnkgdXNlciBwYWdlcyB0byBtYXAgaW4gb25lIGNhbGwgdG8gZ2V0X3VzZXJfcGFnZXMoKS4gIFRoaXMgZGV0ZXJtaW5lcwpAQCAtMjY1LDcgKzI2NCw3IEBACiAJCQkJcmV0ID0gZXJyOwogCQl9CiAKLQkJYWlvX2NvbXBsZXRlKGRpby0+aW9jYiwgcmV0LCAwKTsKKwkJZGlvLT5pb2NiLT5raV9jb21wbGV0ZShkaW8tPmlvY2IsIHJldCwgMCk7CiAJfQogCiAJa21lbV9jYWNoZV9mcmVlKGRpb19jYWNoZSwgZGlvKTsKQEAgLTEwNTYsNyArMTA1NSw3IEBACiAJICogb3BlcmF0aW9uLiAgQUlPIGNhbiBpZiBpdCB3YXMgYSBicm9rZW4gb3BlcmF0aW9uIGRlc2NyaWJlZCBhYm92ZSBvcgogCSAqIGluIGZhY3QgaWYgYWxsIHRoZSBiaW9zIHJhY2UgdG8gY29tcGxldGUgYmVmb3JlIHdlIGdldCBoZXJlLiAgSW4KIAkgKiB0aGF0IGNhc2UgZGlvX2NvbXBsZXRlKCkgdHJhbnNsYXRlcyB0aGUgRUlPQ0JRVUVVRUQgaW50byB0aGUgcHJvcGVyCi0JICogcmV0dXJuIGNvZGUgdGhhdCB0aGUgY2FsbGVyIHdpbGwgaGFuZCB0byBhaW9fY29tcGxldGUoKS4KKwkgKiByZXR1cm4gY29kZSB0aGF0IHRoZSBjYWxsZXIgd2lsbCBoYW5kIHRvIC0+Y29tcGxldGUoKS4KIAkgKgogCSAqIFRoaXMgaXMgbWFuYWdlZCBieSB0aGUgYmlvX2xvY2sgaW5zdGVhZCBvZiBiZWluZyBhbiBhdG9taWNfdCBzbyB0aGF0CiAJICogY29tcGxldGlvbiBwYXRocyBjYW4gZHJvcCB0aGVpciByZWYgYW5kIHVzZSB0aGUgcmVtYWluaW5nIGNvdW50IHRvCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9maWxlLmMgYi9mcy9lY3J5cHRmcy9maWxlLmMKaW5kZXggZmQzOWJhZC4uYTY1Nzg2ZSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvZmlsZS5jCisrKyBiL2ZzL2VjcnlwdGZzL2ZpbGUuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnNfc3RhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlICJlY3J5cHRmc19rZXJuZWwuaCIKIAogLyoqCkBAIC01MiwxMiArNTEsNiBAQAogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAogCXJjID0gZ2VuZXJpY19maWxlX3JlYWRfaXRlcihpb2NiLCB0byk7Ci0JLyoKLQkgKiBFdmVuIHRob3VnaCB0aGlzIGlzIGEgYXN5bmMgaW50ZXJmYWNlLCB3ZSBuZWVkIHRvIHdhaXQKLQkgKiBmb3IgSU8gdG8gZmluaXNoIHRvIHVwZGF0ZSBhdGltZQotCSAqLwotCWlmICgtRUlPQ0JRVUVVRUQgPT0gcmMpCi0JCXJjID0gd2FpdF9vbl9zeW5jX2tpb2NiKGlvY2IpOwogCWlmIChyYyA+PSAwKSB7CiAJCXBhdGggPSBlY3J5cHRmc19kZW50cnlfdG9fbG93ZXJfcGF0aChmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAkJdG91Y2hfYXRpbWUocGF0aCk7CkBAIC0zNjUsOSArMzU4LDcgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlY3J5cHRmc19tYWluX2ZvcHMgPSB7CiAJLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQgPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIgPSBlY3J5cHRmc19yZWFkX3VwZGF0ZV9hdGltZSwKLQkud3JpdGUgPSBuZXdfc3luY193cml0ZSwKIAkud3JpdGVfaXRlciA9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5pdGVyYXRlID0gZWNyeXB0ZnNfcmVhZGRpciwKIAkudW5sb2NrZWRfaW9jdGwgPSBlY3J5cHRmc191bmxvY2tlZF9pb2N0bCwKZGlmZiAtLWdpdCBhL2ZzL2V4b2ZzL2ZpbGUuYyBiL2ZzL2V4b2ZzL2ZpbGUuYwppbmRleCAxYTM3NmI0Li45MDZkZTY2IDEwMDY0NAotLS0gYS9mcy9leG9mcy9maWxlLmMKKysrIGIvZnMvZXhvZnMvZmlsZS5jCkBAIC02Nyw4ICs2Nyw2IEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXhvZnNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKIAkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLApkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9leHQyLmggYi9mcy9leHQyL2V4dDIuaAppbmRleCA2NzhmOWFiLi44ZDE1ZmViIDEwMDY0NAotLS0gYS9mcy9leHQyL2V4dDIuaAorKysgYi9mcy9leHQyL2V4dDIuaApAQCAtNzkzLDcgKzc5Myw2IEBACiAJCSAgICAgIGludCBkYXRhc3luYyk7CiBleHRlcm4gY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0Ml9maWxlX2lub2RlX29wZXJhdGlvbnM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQyX2ZpbGVfb3BlcmF0aW9uczsKLWV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4dDJfZGF4X2ZpbGVfb3BlcmF0aW9uczsKIAogLyogaW5vZGUuYyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBhZGRyZXNzX3NwYWNlX29wZXJhdGlvbnMgZXh0Ml9hb3BzOwpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9maWxlLmMgYi9mcy9leHQyL2ZpbGUuYwppbmRleCBlMzE3MDE3Li4zYTBhNmM2IDEwMDY0NAotLS0gYS9mcy9leHQyL2ZpbGUuYworKysgYi9mcy9leHQyL2ZpbGUuYwpAQCAtMzksNiArMzksNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBleHQyX2RheF92bV9vcHMgPSB7CiAJLmZhdWx0CQk9IGV4dDJfZGF4X2ZhdWx0LAogCS5wYWdlX21rd3JpdGUJPSBleHQyX2RheF9ta3dyaXRlLAorCS5wZm5fbWt3cml0ZQk9IGRheF9wZm5fbWt3cml0ZSwKIH07CiAKIHN0YXRpYyBpbnQgZXh0Ml9maWxlX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQpAQCAtOTIsOCArOTMsNiBAQAogICovCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4dDJfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKIAkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS51bmxvY2tlZF9pb2N0bCA9IGV4dDJfaW9jdGwsCkBAIC0xMDgsMjQgKzEwNyw2IEBACiAJLnNwbGljZV93cml0ZQk9IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUsCiB9OwogCi0jaWZkZWYgQ09ORklHX0ZTX0RBWAotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQyX2RheF9maWxlX29wZXJhdGlvbnMgPSB7Ci0JLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAotCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAotCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCi0JLnVubG9ja2VkX2lvY3RsID0gZXh0Ml9pb2N0bCwKLSNpZmRlZiBDT05GSUdfQ09NUEFUCi0JLmNvbXBhdF9pb2N0bAk9IGV4dDJfY29tcGF0X2lvY3RsLAotI2VuZGlmCi0JLm1tYXAJCT0gZXh0Ml9maWxlX21tYXAsCi0JLm9wZW4JCT0gZHF1b3RfZmlsZV9vcGVuLAotCS5yZWxlYXNlCT0gZXh0Ml9yZWxlYXNlX2ZpbGUsCi0JLmZzeW5jCQk9IGV4dDJfZnN5bmMsCi19OwotI2VuZGlmCi0KIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGV4dDJfZmlsZV9pbm9kZV9vcGVyYXRpb25zID0gewogI2lmZGVmIENPTkZJR19FWFQyX0ZTX1hBVFRSCiAJLnNldHhhdHRyCT0gZ2VuZXJpY19zZXR4YXR0ciwKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvaW5vZGUuYyBiL2ZzL2V4dDIvaW5vZGUuYwppbmRleCA2NDM0YmMwLi5iMjllYjY3IDEwMDY0NAotLS0gYS9mcy9leHQyL2lub2RlLmMKKysrIGIvZnMvZXh0Mi9pbm9kZS5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9maWVtYXAuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgImV4dDIuaCIKICNpbmNsdWRlICJhY2wuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgpAQCAtMTM4OCwxMCArMTM4OCw3IEBACiAKIAlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkgewogCQlpbm9kZS0+aV9vcCA9ICZleHQyX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKLQkJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBEQVgpKSB7Ci0JCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX2FvcHM7Ci0JCQlpbm9kZS0+aV9mb3AgPSAmZXh0Ml9kYXhfZmlsZV9vcGVyYXRpb25zOwotCQl9IGVsc2UgaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT0JIKSkgeworCQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKSB7CiAJCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX25vYmhfYW9wczsKIAkJCWlub2RlLT5pX2ZvcCA9ICZleHQyX2ZpbGVfb3BlcmF0aW9uczsKIAkJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvbmFtZWkuYyBiL2ZzL2V4dDIvbmFtZWkuYwppbmRleCAxNDhmNmUzLi5jZTQyMjkzIDEwMDY0NAotLS0gYS9mcy9leHQyL25hbWVpLmMKKysrIGIvZnMvZXh0Mi9uYW1laS5jCkBAIC0xMDQsMTAgKzEwNCw3IEBACiAJCXJldHVybiBQVFJfRVJSKGlub2RlKTsKIAogCWlub2RlLT5pX29wID0gJmV4dDJfZmlsZV9pbm9kZV9vcGVyYXRpb25zOwotCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgREFYKSkgewotCQlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZleHQyX2FvcHM7Ci0JCWlub2RlLT5pX2ZvcCA9ICZleHQyX2RheF9maWxlX29wZXJhdGlvbnM7Ci0JfSBlbHNlIGlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkpIHsKKwlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PQkgpKSB7CiAJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmV4dDJfbm9iaF9hb3BzOwogCQlpbm9kZS0+aV9mb3AgPSAmZXh0Ml9maWxlX29wZXJhdGlvbnM7CiAJfSBlbHNlIHsKQEAgLTEyNSwxMCArMTIyLDcgQEAKIAkJcmV0dXJuIFBUUl9FUlIoaW5vZGUpOwogCiAJaW5vZGUtPmlfb3AgPSAmZXh0Ml9maWxlX2lub2RlX29wZXJhdGlvbnM7Ci0JaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBEQVgpKSB7Ci0JCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmV4dDJfYW9wczsKLQkJaW5vZGUtPmlfZm9wID0gJmV4dDJfZGF4X2ZpbGVfb3BlcmF0aW9uczsKLQl9IGVsc2UgaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBOT0JIKSkgeworCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgTk9CSCkpIHsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmZXh0Ml9ub2JoX2FvcHM7CiAJCWlub2RlLT5pX2ZvcCA9ICZleHQyX2ZpbGVfb3BlcmF0aW9uczsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvZnMvZXh0My9maWxlLmMgYi9mcy9leHQzL2ZpbGUuYwppbmRleCBhMDYyZmExLi4zYjhmNjUwIDEwMDY0NAotLS0gYS9mcy9leHQzL2ZpbGUuYworKysgYi9mcy9leHQzL2ZpbGUuYwpAQCAtNTAsOCArNTAsNiBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4dDNfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKIAkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS51bmxvY2tlZF9pb2N0bAk9IGV4dDNfaW9jdGwsCmRpZmYgLS1naXQgYS9mcy9leHQzL2lub2RlLmMgYi9mcy9leHQzL2lub2RlLmMKaW5kZXggMmM2Y2NjNC4uZGIwN2ZmYiAxMDA2NDQKLS0tIGEvZnMvZXh0My9pbm9kZS5jCisrKyBiL2ZzL2V4dDMvaW5vZGUuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlICJleHQzLmgiCiAjaW5jbHVkZSAieGF0dHIuaCIKICNpbmNsdWRlICJhY2wuaCIKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvZXh0NC5oIGIvZnMvZXh0NC9leHQ0LmgKaW5kZXggZjYzYzNkNS4uOGEzOTgxZSAxMDA2NDQKLS0tIGEvZnMvZXh0NC9leHQ0LmgKKysrIGIvZnMvZXh0NC9leHQ0LmgKQEAgLTI1OTMsNyArMjU5Myw2IEBACiAvKiBmaWxlLmMgKi8KIGV4dGVybiBjb25zdCBzdHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQ0X2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV4dDRfZmlsZV9vcGVyYXRpb25zOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXh0NF9kYXhfZmlsZV9vcGVyYXRpb25zOwogZXh0ZXJuIGxvZmZfdCBleHQ0X2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbik7CiAKIC8qIGlubGluZS5jICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L2ZpbGUuYyBiL2ZzL2V4dDQvZmlsZS5jCmluZGV4IDMzYTA5ZGEuLjdhNmRlZmMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZmlsZS5jCisrKyBiL2ZzL2V4dDQvZmlsZS5jCkBAIC0yMyw5ICsyMyw5IEBACiAjaW5jbHVkZSA8bGludXgvamJkMi5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CiAjaW5jbHVkZSA8bGludXgvcGF0aC5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZXZlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgImV4dDQuaCIKICNpbmNsdWRlICJleHQ0X2piZDIuaCIKICNpbmNsdWRlICJ4YXR0ci5oIgpAQCAtMjA2LDYgKzIwNiw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IGV4dDRfZGF4X3ZtX29wcyA9IHsKIAkuZmF1bHQJCT0gZXh0NF9kYXhfZmF1bHQsCiAJLnBhZ2VfbWt3cml0ZQk9IGV4dDRfZGF4X21rd3JpdGUsCisJLnBmbl9ta3dyaXRlCT0gZGF4X3Bmbl9ta3dyaXRlLAogfTsKICNlbHNlCiAjZGVmaW5lIGV4dDRfZGF4X3ZtX29wcwlleHQ0X2ZpbGVfdm1fb3BzCkBAIC02MDcsOCArNjA4LDYgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQ0X2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGV4dDRfbGxzZWVrLAotCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyCT0gZXh0NF9maWxlX3dyaXRlX2l0ZXIsCiAJLnVubG9ja2VkX2lvY3RsID0gZXh0NF9pb2N0bCwKQEAgLTYyNCwyNiArNjIzLDYgQEAKIAkuZmFsbG9jYXRlCT0gZXh0NF9mYWxsb2NhdGUsCiB9OwogCi0jaWZkZWYgQ09ORklHX0ZTX0RBWAotY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBleHQ0X2RheF9maWxlX29wZXJhdGlvbnMgPSB7Ci0JLmxsc2VlawkJPSBleHQ0X2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKLQkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKLQkud3JpdGVfaXRlcgk9IGV4dDRfZmlsZV93cml0ZV9pdGVyLAotCS51bmxvY2tlZF9pb2N0bCA9IGV4dDRfaW9jdGwsCi0jaWZkZWYgQ09ORklHX0NPTVBBVAotCS5jb21wYXRfaW9jdGwJPSBleHQ0X2NvbXBhdF9pb2N0bCwKLSNlbmRpZgotCS5tbWFwCQk9IGV4dDRfZmlsZV9tbWFwLAotCS5vcGVuCQk9IGV4dDRfZmlsZV9vcGVuLAotCS5yZWxlYXNlCT0gZXh0NF9yZWxlYXNlX2ZpbGUsCi0JLmZzeW5jCQk9IGV4dDRfc3luY19maWxlLAotCS8qIFNwbGljZSBub3QgeWV0IHN1cHBvcnRlZCB3aXRoIERBWCAqLwotCS5mYWxsb2NhdGUJPSBleHQ0X2ZhbGxvY2F0ZSwKLX07Ci0jZW5kaWYKLQogY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgZXh0NF9maWxlX2lub2RlX29wZXJhdGlvbnMgPSB7CiAJLnNldGF0dHIJPSBleHQ0X3NldGF0dHIsCiAJLmdldGF0dHIJPSBleHQ0X2dldGF0dHIsCmRpZmYgLS1naXQgYS9mcy9leHQ0L2luZGlyZWN0LmMgYi9mcy9leHQ0L2luZGlyZWN0LmMKaW5kZXggNDVmZTkyNC4uNzQwYzc4NyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbmRpcmVjdC5jCisrKyBiL2ZzL2V4dDQvaW5kaXJlY3QuYwpAQCAtMjAsOSArMjAsOSBAQAogICoJKHNjdEByZWRoYXQuY29tKSwgMTk5MywgMTk5OAogICovCiAKLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlICJleHQ0X2piZDIuaCIKICNpbmNsdWRlICJ0cnVuY2F0ZS5oIgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2V4dDQuaD4KIApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pbm9kZS5jIGIvZnMvZXh0NC9pbm9kZS5jCmluZGV4IDVjYjlhMjEuLjAzNWI3YTAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW5vZGUuYworKysgYi9mcy9leHQ0L2lub2RlLmMKQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcmF0ZWxpbWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlICJleHQ0X2piZDIuaCIKQEAgLTQwOTEsMTAgKzQwOTAsNyBAQAogCiAJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpIHsKIAkJaW5vZGUtPmlfb3AgPSAmZXh0NF9maWxlX2lub2RlX29wZXJhdGlvbnM7Ci0JCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgREFYKSkKLQkJCWlub2RlLT5pX2ZvcCA9ICZleHQ0X2RheF9maWxlX29wZXJhdGlvbnM7Ci0JCWVsc2UKLQkJCWlub2RlLT5pX2ZvcCA9ICZleHQ0X2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmV4dDRfZmlsZV9vcGVyYXRpb25zOwogCQlleHQ0X3NldF9hb3BzKGlub2RlKTsKIAl9IGVsc2UgaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKIAkJaW5vZGUtPmlfb3AgPSAmZXh0NF9kaXJfaW5vZGVfb3BlcmF0aW9uczsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbmFtZWkuYyBiL2ZzL2V4dDQvbmFtZWkuYwppbmRleCAyOGZlNzFhLi4yMjkxOTIzIDEwMDY0NAotLS0gYS9mcy9leHQ0L25hbWVpLmMKKysrIGIvZnMvZXh0NC9uYW1laS5jCkBAIC0yMjM1LDEwICsyMjM1LDcgQEAKIAllcnIgPSBQVFJfRVJSKGlub2RlKTsKIAlpZiAoIUlTX0VSUihpbm9kZSkpIHsKIAkJaW5vZGUtPmlfb3AgPSAmZXh0NF9maWxlX2lub2RlX29wZXJhdGlvbnM7Ci0JCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgREFYKSkKLQkJCWlub2RlLT5pX2ZvcCA9ICZleHQ0X2RheF9maWxlX29wZXJhdGlvbnM7Ci0JCWVsc2UKLQkJCWlub2RlLT5pX2ZvcCA9ICZleHQ0X2ZpbGVfb3BlcmF0aW9uczsKKwkJaW5vZGUtPmlfZm9wID0gJmV4dDRfZmlsZV9vcGVyYXRpb25zOwogCQlleHQ0X3NldF9hb3BzKGlub2RlKTsKIAkJZXJyID0gZXh0NF9hZGRfbm9uZGlyKGhhbmRsZSwgZGVudHJ5LCBpbm9kZSk7CiAJCWlmICghZXJyICYmIElTX0RJUlNZTkMoZGlyKSkKQEAgLTIzMDIsMTAgKzIyOTksNyBAQAogCWVyciA9IFBUUl9FUlIoaW5vZGUpOwogCWlmICghSVNfRVJSKGlub2RlKSkgewogCQlpbm9kZS0+aV9vcCA9ICZleHQ0X2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKLQkJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBEQVgpKQotCQkJaW5vZGUtPmlfZm9wID0gJmV4dDRfZGF4X2ZpbGVfb3BlcmF0aW9uczsKLQkJZWxzZQotCQkJaW5vZGUtPmlfZm9wID0gJmV4dDRfZmlsZV9vcGVyYXRpb25zOworCQlpbm9kZS0+aV9mb3AgPSAmZXh0NF9maWxlX29wZXJhdGlvbnM7CiAJCWV4dDRfc2V0X2FvcHMoaW5vZGUpOwogCQlkX3RtcGZpbGUoZGVudHJ5LCBpbm9kZSk7CiAJCWVyciA9IGV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcGFnZS1pby5jIGIvZnMvZXh0NC9wYWdlLWlvLmMKaW5kZXggYjI0YTI1NC4uNDY0OTg0MiAxMDA2NDQKLS0tIGEvZnMvZXh0NC9wYWdlLWlvLmMKKysrIGIvZnMvZXh0NC9wYWdlLWlvLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+CiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9uYW1laS5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9kYXRhLmMgYi9mcy9mMmZzL2RhdGEuYwppbmRleCA5ODVlZDAyLi40OTdmODUxIDEwMDY0NAotLS0gYS9mcy9mMmZzL2RhdGEuYworKysgYi9mcy9mMmZzL2RhdGEuYwpAQCAtMTIsMTIgKzEyLDEyIEBACiAjaW5jbHVkZSA8bGludXgvZjJmc19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1ZmZlcl9oZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgogI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAKICNpbmNsdWRlICJmMmZzLmgiCiAjaW5jbHVkZSAibm9kZS5oIgpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9maWxlLmMgYi9mcy9mMmZzL2ZpbGUuYwppbmRleCA5OGRhYzI3Li5kZjZhMDU5IDEwMDY0NAotLS0gYS9mcy9mMmZzL2ZpbGUuYworKysgYi9mcy9mMmZzL2ZpbGUuYwpAQCAtMTEwNCw4ICsxMTA0LDYgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmMmZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGYyZnNfbGxzZWVrLAotCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm9wZW4JCT0gZ2VuZXJpY19maWxlX29wZW4sCmRpZmYgLS1naXQgYS9mcy9mYXQvZmlsZS5jIGIvZnMvZmF0L2ZpbGUuYwppbmRleCA4NDI5YzY4Li4xZTk4ZDMzIDEwMDY0NAotLS0gYS9mcy9mYXQvZmlsZS5jCisrKyBiL2ZzL2ZhdC9maWxlLmMKQEAgLTE3MCw4ICsxNzAsNiBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZhdF9maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCmRpZmYgLS1naXQgYS9mcy9mYXQvaW5vZGUuYyBiL2ZzL2ZhdC9pbm9kZS5jCmluZGV4IDQ5N2M3YzUuLjg1MjEyMDcgMTAwNjQ0Ci0tLSBhL2ZzL2ZhdC9pbm9kZS5jCisrKyBiL2ZzL2ZhdC9pbm9kZS5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgvdmZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CmRpZmYgLS1naXQgYS9mcy9maWxlX3RhYmxlLmMgYi9mcy9maWxlX3RhYmxlLmMKaW5kZXggM2Y4NTQxMS4uMjk0MTc0ZCAxMDA2NDQKLS0tIGEvZnMvZmlsZV90YWJsZS5jCisrKyBiL2ZzL2ZpbGVfdGFibGUuYwpAQCAtMTY4LDEwICsxNjgsMTAgQEAKIAlmaWxlLT5mX2lub2RlID0gcGF0aC0+ZGVudHJ5LT5kX2lub2RlOwogCWZpbGUtPmZfbWFwcGluZyA9IHBhdGgtPmRlbnRyeS0+ZF9pbm9kZS0+aV9tYXBwaW5nOwogCWlmICgobW9kZSAmIEZNT0RFX1JFQUQpICYmCi0JICAgICBsaWtlbHkoZm9wLT5yZWFkIHx8IGZvcC0+YWlvX3JlYWQgfHwgZm9wLT5yZWFkX2l0ZXIpKQorCSAgICAgbGlrZWx5KGZvcC0+cmVhZCB8fCBmb3AtPnJlYWRfaXRlcikpCiAJCW1vZGUgfD0gRk1PREVfQ0FOX1JFQUQ7CiAJaWYgKChtb2RlICYgRk1PREVfV1JJVEUpICYmCi0JICAgICBsaWtlbHkoZm9wLT53cml0ZSB8fCBmb3AtPmFpb193cml0ZSB8fCBmb3AtPndyaXRlX2l0ZXIpKQorCSAgICAgbGlrZWx5KGZvcC0+d3JpdGUgfHwgZm9wLT53cml0ZV9pdGVyKSkKIAkJbW9kZSB8PSBGTU9ERV9DQU5fV1JJVEU7CiAJZmlsZS0+Zl9tb2RlID0gbW9kZTsKIAlmaWxlLT5mX29wID0gZm9wOwpkaWZmIC0tZ2l0IGEvZnMvZnMtd3JpdGViYWNrLmMgYi9mcy9mcy13cml0ZWJhY2suYwppbmRleCBlOTA3MDUyLi4zMmE4YmJkIDEwMDY0NAotLS0gYS9mcy9mcy13cml0ZWJhY2suYworKysgYi9mcy9mcy13cml0ZWJhY2suYwpAQCAtNTMsNiArNTMsMTggQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiAqZG9uZTsJLyogc2V0IGlmIHRoZSBjYWxsZXIgd2FpdHMgKi8KIH07CiAKKy8qCisgKiBJZiBhbiBpbm9kZSBpcyBjb25zdGFudGx5IGhhdmluZyBpdHMgcGFnZXMgZGlydGllZCwgYnV0IHRoZW4gdGhlCisgKiB1cGRhdGVzIHN0b3AgZGlydHl0aW1lX2V4cGlyZV9pbnRlcnZhbCBzZWNvbmRzIGluIHRoZSBwYXN0LCBpdCdzCisgKiBwb3NzaWJsZSBmb3IgdGhlIHdvcnN0IGNhc2UgdGltZSBiZXR3ZWVuIHdoZW4gYW4gaW5vZGUgaGFzIGl0cworICogdGltZXN0YW1wcyB1cGRhdGVkIGFuZCB3aGVuIHRoZXkgZmluYWxseSBnZXQgd3JpdHRlbiBvdXQgdG8gYmUgdHdvCisgKiBkaXJ0eXRpbWVfZXhwaXJlX2ludGVydmFscy4gIFdlIHNldCB0aGUgZGVmYXVsdCB0byAxMiBob3VycyAoaW4KKyAqIHNlY29uZHMpLCB3aGljaCBtZWFucyBtb3N0IG9mIHRoZSB0aW1lIGlub2RlcyB3aWxsIGhhdmUgdGhlaXIKKyAqIHRpbWVzdGFtcHMgd3JpdHRlbiB0byBkaXNrIGFmdGVyIDEyIGhvdXJzLCBidXQgaW4gdGhlIHdvcnN0IGNhc2UgYQorICogZmV3IGlub2RlcyBtaWdodCBub3QgdGhlaXIgdGltZXN0YW1wcyB1cGRhdGVkIGZvciAyNCBob3Vycy4KKyAqLwordW5zaWduZWQgaW50IGRpcnR5dGltZV9leHBpcmVfaW50ZXJ2YWwgPSAxMiAqIDYwICogNjA7CisKIC8qKgogICogd3JpdGViYWNrX2luX3Byb2dyZXNzIC0gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgaXMgd3JpdGViYWNrIGluIHByb2dyZXNzCiAgKiBAYmRpOiB0aGUgZGV2aWNlJ3MgYmFja2luZ19kZXZfaW5mbyBzdHJ1Y3R1cmUuCkBAIC0yNzUsOCArMjg3LDggQEAKIAogCWlmICgoZmxhZ3MgJiBFWFBJUkVfRElSVFlfQVRJTUUpID09IDApCiAJCW9sZGVyX3RoYW5fdGhpcyA9IHdvcmstPm9sZGVyX3RoYW5fdGhpczsKLQllbHNlIGlmICgod29yay0+cmVhc29uID09IFdCX1JFQVNPTl9TWU5DKSA9PSAwKSB7Ci0JCWV4cGlyZV90aW1lID0gamlmZmllcyAtIChIWiAqIDg2NDAwKTsKKwllbHNlIGlmICghd29yay0+Zm9yX3N5bmMpIHsKKwkJZXhwaXJlX3RpbWUgPSBqaWZmaWVzIC0gKGRpcnR5dGltZV9leHBpcmVfaW50ZXJ2YWwgKiBIWik7CiAJCW9sZGVyX3RoYW5fdGhpcyA9ICZleHBpcmVfdGltZTsKIAl9CiAJd2hpbGUgKCFsaXN0X2VtcHR5KGRlbGF5aW5nX3F1ZXVlKSkgewpAQCAtNDU4LDYgKzQ3MCw3IEBACiAJCSAqLwogCQlyZWRpcnR5X3RhaWwoaW5vZGUsIHdiKTsKIAl9IGVsc2UgaWYgKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9USU1FKSB7CisJCWlub2RlLT5kaXJ0aWVkX3doZW4gPSBqaWZmaWVzOwogCQlsaXN0X21vdmUoJmlub2RlLT5pX3diX2xpc3QsICZ3Yi0+Yl9kaXJ0eV90aW1lKTsKIAl9IGVsc2UgewogCQkvKiBUaGUgaW5vZGUgaXMgY2xlYW4uIFJlbW92ZSBmcm9tIHdyaXRlYmFjayBsaXN0cy4gKi8KQEAgLTUwNSwxMiArNTE4LDE3IEBACiAJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAogCWRpcnR5ID0gaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZOwotCWlmICgoKGRpcnR5ICYgKElfRElSVFlfU1lOQyB8IElfRElSVFlfREFUQVNZTkMpKSAmJgotCSAgICAgKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9USU1FKSkgfHwKLQkgICAgKGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9USU1FX0VYUElSRUQpKSB7Ci0JCWRpcnR5IHw9IElfRElSVFlfVElNRSB8IElfRElSVFlfVElNRV9FWFBJUkVEOwotCQl0cmFjZV93cml0ZWJhY2tfbGF6eXRpbWUoaW5vZGUpOwotCX0KKwlpZiAoaW5vZGUtPmlfc3RhdGUgJiBJX0RJUlRZX1RJTUUpIHsKKwkJaWYgKChkaXJ0eSAmIChJX0RJUlRZX1NZTkMgfCBJX0RJUlRZX0RBVEFTWU5DKSkgfHwKKwkJICAgIHVubGlrZWx5KGlub2RlLT5pX3N0YXRlICYgSV9ESVJUWV9USU1FX0VYUElSRUQpIHx8CisJCSAgICB1bmxpa2VseSh0aW1lX2FmdGVyKGppZmZpZXMsCisJCQkJCShpbm9kZS0+ZGlydGllZF90aW1lX3doZW4gKworCQkJCQkgZGlydHl0aW1lX2V4cGlyZV9pbnRlcnZhbCAqIEhaKSkpKSB7CisJCQlkaXJ0eSB8PSBJX0RJUlRZX1RJTUUgfCBJX0RJUlRZX1RJTUVfRVhQSVJFRDsKKwkJCXRyYWNlX3dyaXRlYmFja19sYXp5dGltZShpbm9kZSk7CisJCX0KKwl9IGVsc2UKKwkJaW5vZGUtPmlfc3RhdGUgJj0gfklfRElSVFlfVElNRV9FWFBJUkVEOwogCWlub2RlLT5pX3N0YXRlICY9IH5kaXJ0eTsKIAogCS8qCkBAIC0xMTMxLDYgKzExNDksNTYgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAorLyoKKyAqIFdha2UgdXAgYmRpJ3MgcGVyaW9kaWNhbGx5IHRvIG1ha2Ugc3VyZSBkaXJ0eXRpbWUgaW5vZGVzIGdldHMKKyAqIHdyaXR0ZW4gYmFjayBwZXJpb2RpY2FsbHkuICBXZSBkZWxpYmVyYXRlbHkgZG8gKm5vdCogY2hlY2sgdGhlCisgKiBiX2RpcnR5dGltZSBsaXN0IGluIHdiX2hhc19kaXJ0eV9pbygpLCBzaW5jZSB0aGlzIHdvdWxkIGNhdXNlIHRoZQorICoga2VybmVsIHRvIGJlIGNvbnN0YW50bHkgd2FraW5nIHVwIG9uY2UgdGhlcmUgYXJlIGFueSBkaXJ0eXRpbWUKKyAqIGlub2RlcyBvbiB0aGUgc3lzdGVtLiAgU28gaW5zdGVhZCB3ZSBkZWZpbmUgYSBzZXBhcmF0ZSBkZWxheWVkIHdvcmsKKyAqIGZ1bmN0aW9uIHdoaWNoIGdldHMgY2FsbGVkIG11Y2ggbW9yZSByYXJlbHkuICAoQnkgZGVmYXVsdCwgb25seQorICogb25jZSBldmVyeSAxMiBob3Vycy4pCisgKgorICogSWYgdGhlcmUgaXMgYW55IG90aGVyIHdyaXRlIGFjdGl2aXR5IGdvaW5nIG9uIGluIHRoZSBmaWxlIHN5c3RlbSwKKyAqIHRoaXMgZnVuY3Rpb24gd29uJ3QgYmUgbmVjZXNzYXJ5LiAgQnV0IGlmIHRoZSBvbmx5IHRoaW5nIHRoYXQgaGFzCisgKiBoYXBwZW5lZCBvbiB0aGUgZmlsZSBzeXN0ZW0gaXMgYSBkaXJ0eXRpbWUgaW5vZGUgY2F1c2VkIGJ5IGFuIGF0aW1lCisgKiB1cGRhdGUsIHdlIG5lZWQgdGhpcyBpbmZyYXN0cnVjdHVyZSBiZWxvdyB0byBtYWtlIHN1cmUgdGhhdCBpbm9kZQorICogZXZlbnR1YWxseSBnZXRzIHB1c2hlZCBvdXQgdG8gZGlzay4KKyAqLworc3RhdGljIHZvaWQgd2FrZXVwX2RpcnR5dGltZV93cml0ZWJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3KTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhkaXJ0eXRpbWVfd29yaywgd2FrZXVwX2RpcnR5dGltZV93cml0ZWJhY2spOworCitzdGF0aWMgdm9pZCB3YWtldXBfZGlydHl0aW1lX3dyaXRlYmFjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCit7CisJc3RydWN0IGJhY2tpbmdfZGV2X2luZm8gKmJkaTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShiZGksICZiZGlfbGlzdCwgYmRpX2xpc3QpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmJkaS0+d2IuYl9kaXJ0eV90aW1lKSkKKwkJCWNvbnRpbnVlOworCQliZGlfd2FrZXVwX3RocmVhZChiZGkpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRpcnR5dGltZV93b3JrLCBkaXJ0eXRpbWVfZXhwaXJlX2ludGVydmFsICogSFopOworfQorCitzdGF0aWMgaW50IF9faW5pdCBzdGFydF9kaXJ0eXRpbWVfd3JpdGViYWNrKHZvaWQpCit7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZkaXJ0eXRpbWVfd29yaywgZGlydHl0aW1lX2V4cGlyZV9pbnRlcnZhbCAqIEhaKTsKKwlyZXR1cm4gMDsKK30KK19faW5pdGNhbGwoc3RhcnRfZGlydHl0aW1lX3dyaXRlYmFjayk7CisKK2ludCBkaXJ0eXRpbWVfaW50ZXJ2YWxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkJICAgICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaWYgKHJldCA9PSAwICYmIHdyaXRlKQorCQltb2RfZGVsYXllZF93b3JrKHN5c3RlbV93cSwgJmRpcnR5dGltZV93b3JrLCAwKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgbm9pbmxpbmUgdm9pZCBibG9ja19kdW1wX19fbWFya19pbm9kZV9kaXJ0eShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWlmIChpbm9kZS0+aV9pbm8gfHwgc3RyY21wKGlub2RlLT5pX3NiLT5zX2lkLCAiYmRldiIpKSB7CkBAIC0xMjY5LDggKzEzMzcsMTMgQEAKIAkJCX0KIAogCQkJaW5vZGUtPmRpcnRpZWRfd2hlbiA9IGppZmZpZXM7Ci0JCQlsaXN0X21vdmUoJmlub2RlLT5pX3diX2xpc3QsIGRpcnR5dGltZSA/Ci0JCQkJICAmYmRpLT53Yi5iX2RpcnR5X3RpbWUgOiAmYmRpLT53Yi5iX2RpcnR5KTsKKwkJCWlmIChkaXJ0eXRpbWUpCisJCQkJaW5vZGUtPmRpcnRpZWRfdGltZV93aGVuID0gamlmZmllczsKKwkJCWlmIChpbm9kZS0+aV9zdGF0ZSAmIChJX0RJUlRZX0lOT0RFIHwgSV9ESVJUWV9QQUdFUykpCisJCQkJbGlzdF9tb3ZlKCZpbm9kZS0+aV93Yl9saXN0LCAmYmRpLT53Yi5iX2RpcnR5KTsKKwkJCWVsc2UKKwkJCQlsaXN0X21vdmUoJmlub2RlLT5pX3diX2xpc3QsCisJCQkJCSAgJmJkaS0+d2IuYl9kaXJ0eV90aW1lKTsKIAkJCXNwaW5fdW5sb2NrKCZiZGktPndiLmxpc3RfbG9jayk7CiAJCQl0cmFjZV93cml0ZWJhY2tfZGlydHlfaW5vZGVfZW5xdWV1ZShpbm9kZSk7CiAKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvY3VzZS5jIGIvZnMvZnVzZS9jdXNlLmMKaW5kZXggMjhkMGM3YS4uZTViYmY3NCAxMDA2NDQKLS0tIGEvZnMvZnVzZS9jdXNlLmMKKysrIGIvZnMvZnVzZS9jdXNlLmMKQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZGV2X3QuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpAQCAtNDgsNiArNDcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAKICNpbmNsdWRlICJmdXNlX2kuaCIKIApAQCAtODgsMzIgKzg4LDIzIEBACiAgKiBGVVNFIGZpbGUuCiAgKi8KIAotc3RhdGljIHNzaXplX3QgY3VzZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsCi0JCQkgbG9mZl90ICpwcG9zKQorc3RhdGljIHNzaXplX3QgY3VzZV9yZWFkX2l0ZXIoc3RydWN0IGtpb2NiICpraW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKKwlzdHJ1Y3QgZnVzZV9pb19wcml2IGlvID0geyAuYXN5bmMgPSAwLCAuZmlsZSA9IGtpb2NiLT5raV9maWxwIH07CiAJbG9mZl90IHBvcyA9IDA7Ci0Jc3RydWN0IGlvdmVjIGlvdiA9IHsgLmlvdl9iYXNlID0gYnVmLCAuaW92X2xlbiA9IGNvdW50IH07Ci0Jc3RydWN0IGZ1c2VfaW9fcHJpdiBpbyA9IHsgLmFzeW5jID0gMCwgLmZpbGUgPSBmaWxlIH07Ci0Jc3RydWN0IGlvdl9pdGVyIGlpOwotCWlvdl9pdGVyX2luaXQoJmlpLCBSRUFELCAmaW92LCAxLCBjb3VudCk7CiAKLQlyZXR1cm4gZnVzZV9kaXJlY3RfaW8oJmlvLCAmaWksICZwb3MsIEZVU0VfRElPX0NVU0UpOworCXJldHVybiBmdXNlX2RpcmVjdF9pbygmaW8sIHRvLCAmcG9zLCBGVVNFX0RJT19DVVNFKTsKIH0KIAotc3RhdGljIHNzaXplX3QgY3VzZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgc3NpemVfdCBjdXNlX3dyaXRlX2l0ZXIoc3RydWN0IGtpb2NiICpraW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogeworCXN0cnVjdCBmdXNlX2lvX3ByaXYgaW8gPSB7IC5hc3luYyA9IDAsIC5maWxlID0ga2lvY2ItPmtpX2ZpbHAgfTsKIAlsb2ZmX3QgcG9zID0gMDsKLQlzdHJ1Y3QgaW92ZWMgaW92ID0geyAuaW92X2Jhc2UgPSAodm9pZCBfX3VzZXIgKilidWYsIC5pb3ZfbGVuID0gY291bnQgfTsKLQlzdHJ1Y3QgZnVzZV9pb19wcml2IGlvID0geyAuYXN5bmMgPSAwLCAuZmlsZSA9IGZpbGUgfTsKLQlzdHJ1Y3QgaW92X2l0ZXIgaWk7Ci0JaW92X2l0ZXJfaW5pdCgmaWksIFdSSVRFLCAmaW92LCAxLCBjb3VudCk7Ci0KIAkvKgogCSAqIE5vIGxvY2tpbmcgb3IgZ2VuZXJpY193cml0ZV9jaGVja3MoKSwgdGhlIHNlcnZlciBpcwogCSAqIHJlc3BvbnNpYmxlIGZvciBsb2NraW5nIGFuZCBzYW5pdHkgY2hlY2tzLgogCSAqLwotCXJldHVybiBmdXNlX2RpcmVjdF9pbygmaW8sICZpaSwgJnBvcywKKwlyZXR1cm4gZnVzZV9kaXJlY3RfaW8oJmlvLCBmcm9tLCAmcG9zLAogCQkJICAgICAgRlVTRV9ESU9fV1JJVEUgfCBGVVNFX0RJT19DVVNFKTsKIH0KIApAQCAtMTg2LDggKzE3Nyw4IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGN1c2VfZnJvbnRlbmRfZm9wcyA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAotCS5yZWFkCQkJPSBjdXNlX3JlYWQsCi0JLndyaXRlCQkJPSBjdXNlX3dyaXRlLAorCS5yZWFkX2l0ZXIJCT0gY3VzZV9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIJCT0gY3VzZV93cml0ZV9pdGVyLAogCS5vcGVuCQkJPSBjdXNlX29wZW4sCiAJLnJlbGVhc2UJCT0gY3VzZV9yZWxlYXNlLAogCS51bmxvY2tlZF9pb2N0bAkJPSBjdXNlX2ZpbGVfaW9jdGwsCmRpZmYgLS1naXQgYS9mcy9mdXNlL2Rldi5jIGIvZnMvZnVzZS9kZXYuYwppbmRleCBlZDE5YTdkLi5jOGI2OGFiIDEwMDY0NAotLS0gYS9mcy9mdXNlL2Rldi5jCisrKyBiL2ZzL2Z1c2UvZGV2LmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9waXBlX2ZzX2kuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvc3BsaWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAKIE1PRFVMRV9BTElBU19NSVNDREVWKEZVU0VfTUlOT1IpOwogTU9EVUxFX0FMSUFTKCJkZXZuYW1lOmZ1c2UiKTsKQEAgLTcxMSwyOCArNzEwLDI2IEBACiAJc3RydWN0IGZ1c2VfY29ubiAqZmM7CiAJaW50IHdyaXRlOwogCXN0cnVjdCBmdXNlX3JlcSAqcmVxOwotCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92OworCXN0cnVjdCBpb3ZfaXRlciAqaXRlcjsKIAlzdHJ1Y3QgcGlwZV9idWZmZXIgKnBpcGVidWZzOwogCXN0cnVjdCBwaXBlX2J1ZmZlciAqY3VycmJ1ZjsKIAlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlOwogCXVuc2lnbmVkIGxvbmcgbnJfc2VnczsKLQl1bnNpZ25lZCBsb25nIHNlZ2xlbjsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CiAJc3RydWN0IHBhZ2UgKnBnOwogCXVuc2lnbmVkIGxlbjsKIAl1bnNpZ25lZCBvZmZzZXQ7CiAJdW5zaWduZWQgbW92ZV9wYWdlczoxOwogfTsKIAotc3RhdGljIHZvaWQgZnVzZV9jb3B5X2luaXQoc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsIHN0cnVjdCBmdXNlX2Nvbm4gKmZjLAorc3RhdGljIHZvaWQgZnVzZV9jb3B5X2luaXQoc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MsCisJCQkgICBzdHJ1Y3QgZnVzZV9jb25uICpmYywKIAkJCSAgIGludCB3cml0ZSwKLQkJCSAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCisJCQkgICBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIpCiB7CiAJbWVtc2V0KGNzLCAwLCBzaXplb2YoKmNzKSk7CiAJY3MtPmZjID0gZmM7CiAJY3MtPndyaXRlID0gd3JpdGU7Ci0JY3MtPmlvdiA9IGlvdjsKLQljcy0+bnJfc2VncyA9IG5yX3NlZ3M7CisJY3MtPml0ZXIgPSBpdGVyOwogfQogCiAvKiBVbm1hcCBhbmQgcHV0IHByZXZpb3VzIHBhZ2Ugb2YgdXNlcnNwYWNlIGJ1ZmZlciAqLwpAQCAtODAwLDIyICs3OTcsMTYgQEAKIAkJCWNzLT5ucl9zZWdzKys7CiAJCX0KIAl9IGVsc2UgewotCQlpZiAoIWNzLT5zZWdsZW4pIHsKLQkJCUJVR19PTighY3MtPm5yX3NlZ3MpOwotCQkJY3MtPnNlZ2xlbiA9IGNzLT5pb3ZbMF0uaW92X2xlbjsKLQkJCWNzLT5hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGNzLT5pb3ZbMF0uaW92X2Jhc2U7Ci0JCQljcy0+aW92Kys7Ci0JCQljcy0+bnJfc2Vncy0tOwotCQl9Ci0JCWVyciA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoY3MtPmFkZHIsIDEsIGNzLT53cml0ZSwgJnBhZ2UpOworCQlzaXplX3Qgb2ZmOworCQllcnIgPSBpb3ZfaXRlcl9nZXRfcGFnZXMoY3MtPml0ZXIsICZwYWdlLCBQQUdFX1NJWkUsIDEsICZvZmYpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7Ci0JCUJVR19PTihlcnIgIT0gMSk7CisJCUJVR19PTighZXJyKTsKKwkJY3MtPmxlbiA9IGVycjsKKwkJY3MtPm9mZnNldCA9IG9mZjsKIAkJY3MtPnBnID0gcGFnZTsKLQkJY3MtPm9mZnNldCA9IGNzLT5hZGRyICUgUEFHRV9TSVpFOwotCQljcy0+bGVuID0gbWluKFBBR0VfU0laRSAtIGNzLT5vZmZzZXQsIGNzLT5zZWdsZW4pOwotCQljcy0+c2VnbGVuIC09IGNzLT5sZW47Ci0JCWNzLT5hZGRyICs9IGNzLT5sZW47CisJCWNzLT5vZmZzZXQgPSBvZmY7CisJCWlvdl9pdGVyX2FkdmFuY2UoY3MtPml0ZXIsIGVycik7CiAJfQogCiAJcmV0dXJuIGxvY2tfcmVxdWVzdChjcy0+ZmMsIGNzLT5yZXEpOwpAQCAtODkwLDggKzg4MSw4IEBACiAKIAluZXdwYWdlID0gYnVmLT5wYWdlOwogCi0JaWYgKFdBUk5fT04oIVBhZ2VVcHRvZGF0ZShuZXdwYWdlKSkpCi0JCXJldHVybiAtRUlPOworCWlmICghUGFnZVVwdG9kYXRlKG5ld3BhZ2UpKQorCQlTZXRQYWdlVXB0b2RhdGUobmV3cGFnZSk7CiAKIAlDbGVhclBhZ2VNYXBwZWRUb0Rpc2sobmV3cGFnZSk7CiAKQEAgLTEzNTMsOCArMTM0NCwxOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzc2l6ZV90IGZ1c2VfZGV2X3JlYWQoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK3N0YXRpYyBpbnQgZnVzZV9kZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwkvKgorCSAqIFRoZSBmdXNlIGRldmljZSdzIGZpbGUncyBwcml2YXRlX2RhdGEgaXMgdXNlZCB0byBob2xkCisJICogdGhlIGZ1c2VfY29ubihlY3Rpb24pIHdoZW4gaXQgaXMgbW91bnRlZCwgYW5kIGlzIHVzZWQgdG8KKwkgKiBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGZpbGUgaGFzIGJlZW4gbW91bnRlZCBhbHJlYWR5LgorCSAqLworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGV2X3JlYWQoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKnRvKQogewogCXN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgY3M7CiAJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwpAQCAtMTM2Miw5ICsxMzYzLDEyIEBACiAJaWYgKCFmYykKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWZ1c2VfY29weV9pbml0KCZjcywgZmMsIDEsIGlvdiwgbnJfc2Vncyk7CisJaWYgKCFpdGVyX2lzX2lvdmVjKHRvKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gZnVzZV9kZXZfZG9fcmVhZChmYywgZmlsZSwgJmNzLCBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2VncykpOworCWZ1c2VfY29weV9pbml0KCZjcywgZmMsIDEsIHRvKTsKKworCXJldHVybiBmdXNlX2Rldl9kb19yZWFkKGZjLCBmaWxlLCAmY3MsIGlvdl9pdGVyX2NvdW50KHRvKSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGZ1c2VfZGV2X3NwbGljZV9yZWFkKHN0cnVjdCBmaWxlICppbiwgbG9mZl90ICpwcG9zLApAQCAtMTM4NCw3ICsxMzg4LDcgQEAKIAlpZiAoIWJ1ZnMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZnVzZV9jb3B5X2luaXQoJmNzLCBmYywgMSwgTlVMTCwgMCk7CisJZnVzZV9jb3B5X2luaXQoJmNzLCBmYywgMSwgTlVMTCk7CiAJY3MucGlwZWJ1ZnMgPSBidWZzOwogCWNzLnBpcGUgPSBwaXBlOwogCXJldCA9IGZ1c2VfZGV2X2RvX3JlYWQoZmMsIGluLCAmY3MsIGxlbik7CkBAIC0xNzk3LDYgKzE4MDEsOSBAQAogc3RhdGljIGludCBmdXNlX25vdGlmeShzdHJ1Y3QgZnVzZV9jb25uICpmYywgZW51bSBmdXNlX25vdGlmeV9jb2RlIGNvZGUsCiAJCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwgc3RydWN0IGZ1c2VfY29weV9zdGF0ZSAqY3MpCiB7CisJLyogRG9uJ3QgdHJ5IHRvIG1vdmUgcGFnZXMgKHlldCkgKi8KKwljcy0+bW92ZV9wYWdlcyA9IDA7CisKIAlzd2l0Y2ggKGNvZGUpIHsKIAljYXNlIEZVU0VfTk9USUZZX1BPTEw6CiAJCXJldHVybiBmdXNlX25vdGlmeV9wb2xsKGZjLCBzaXplLCBjcyk7CkBAIC0xOTU3LDE3ICsxOTY0LDE5IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHNzaXplX3QgZnVzZV9kZXZfd3JpdGUoc3RydWN0IGtpb2NiICppb2NiLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90IHBvcykKK3N0YXRpYyBzc2l6ZV90IGZ1c2VfZGV2X3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCXN0cnVjdCBmdXNlX2NvcHlfc3RhdGUgY3M7CiAJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBmdXNlX2dldF9jb25uKGlvY2ItPmtpX2ZpbHApOwogCWlmICghZmMpCiAJCXJldHVybiAtRVBFUk07CiAKLQlmdXNlX2NvcHlfaW5pdCgmY3MsIGZjLCAwLCBpb3YsIG5yX3NlZ3MpOworCWlmICghaXRlcl9pc19pb3ZlYyhmcm9tKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gZnVzZV9kZXZfZG9fd3JpdGUoZmMsICZjcywgaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpKTsKKwlmdXNlX2NvcHlfaW5pdCgmY3MsIGZjLCAwLCBmcm9tKTsKKworCXJldHVybiBmdXNlX2Rldl9kb193cml0ZShmYywgJmNzLCBpb3ZfaXRlcl9jb3VudChmcm9tKSk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGZ1c2VfZGV2X3NwbGljZV93cml0ZShzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLApAQCAtMjAzMCw4ICsyMDM5LDkgQEAKIAl9CiAJcGlwZV91bmxvY2socGlwZSk7CiAKLQlmdXNlX2NvcHlfaW5pdCgmY3MsIGZjLCAwLCBOVUxMLCBuYnVmKTsKKwlmdXNlX2NvcHlfaW5pdCgmY3MsIGZjLCAwLCBOVUxMKTsKIAljcy5waXBlYnVmcyA9IGJ1ZnM7CisJY3MubnJfc2VncyA9IG5idWY7CiAJY3MucGlwZSA9IHBpcGU7CiAKIAlpZiAoZmxhZ3MgJiBTUExJQ0VfRl9NT1ZFKQpAQCAtMjIxNywxMiArMjIyNywxMSBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGV2X29wZXJhdGlvbnMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IGZ1c2VfZGV2X29wZW4sCiAJLmxsc2VlawkJPSBub19sbHNlZWssCi0JLnJlYWQJCT0gZG9fc3luY19yZWFkLAotCS5haW9fcmVhZAk9IGZ1c2VfZGV2X3JlYWQsCisJLnJlYWRfaXRlcgk9IGZ1c2VfZGV2X3JlYWQsCiAJLnNwbGljZV9yZWFkCT0gZnVzZV9kZXZfc3BsaWNlX3JlYWQsCi0JLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCi0JLmFpb193cml0ZQk9IGZ1c2VfZGV2X3dyaXRlLAorCS53cml0ZV9pdGVyCT0gZnVzZV9kZXZfd3JpdGUsCiAJLnNwbGljZV93cml0ZQk9IGZ1c2VfZGV2X3NwbGljZV93cml0ZSwKIAkucG9sbAkJPSBmdXNlX2Rldl9wb2xsLAogCS5yZWxlYXNlCT0gZnVzZV9kZXZfcmVsZWFzZSwKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZmlsZS5jIGIvZnMvZnVzZS9maWxlLmMKaW5kZXggYzAxZWMzYi4uZTFhZmRkNyAxMDA2NDQKLS0tIGEvZnMvZnVzZS9maWxlLmMKKysrIGIvZnMvZnVzZS9maWxlLmMKQEAgLTE1LDggKzE1LDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgvZmFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ1c2VfZGlyZWN0X2lvX2ZpbGVfb3BlcmF0aW9uczsKIApAQCAtNTI4LDYgKzUyOCwxNyBAQAogCX0KIH0KIAorc3RhdGljIHNzaXplX3QgZnVzZV9nZXRfcmVzX2J5X2lvKHN0cnVjdCBmdXNlX2lvX3ByaXYgKmlvKQoreworCWlmIChpby0+ZXJyKQorCQlyZXR1cm4gaW8tPmVycjsKKworCWlmIChpby0+Ynl0ZXMgPj0gMCAmJiBpby0+d3JpdGUpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIGlvLT5ieXRlcyA8IDAgPyBpby0+c2l6ZSA6IGlvLT5ieXRlczsKK30KKwogLyoqCiAgKiBJbiBjYXNlIG9mIHNob3J0IHJlYWQsIHRoZSBjYWxsZXIgc2V0cyAncG9zJyB0byB0aGUgcG9zaXRpb24gb2YKICAqIGFjdHVhbCBlbmQgb2YgZnVzZSByZXF1ZXN0IGluIElPIHJlcXVlc3QuIE90aGVyd2lzZSwgaWYgYnl0ZXNfcmVxdWVzdGVkCkBAIC01NDYsNiArNTU3LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZnVzZV9haW9fY29tcGxldGUoc3RydWN0IGZ1c2VfaW9fcHJpdiAqaW8sIGludCBlcnIsIHNzaXplX3QgcG9zKQogeworCWJvb2wgaXNfc3luYyA9IGlzX3N5bmNfa2lvY2IoaW8tPmlvY2IpOwogCWludCBsZWZ0OwogCiAJc3Bpbl9sb2NrKCZpby0+bG9jayk7CkBAIC01NTUsMzAgKzU2NywyNCBAQAogCQlpby0+Ynl0ZXMgPSBwb3M7CiAKIAlsZWZ0ID0gLS1pby0+cmVxczsKKwlpZiAoIWxlZnQgJiYgaXNfc3luYykKKwkJY29tcGxldGUoaW8tPmRvbmUpOwogCXNwaW5fdW5sb2NrKCZpby0+bG9jayk7CiAKLQlpZiAoIWxlZnQpIHsKLQkJbG9uZyByZXM7CisJaWYgKCFsZWZ0ICYmICFpc19zeW5jKSB7CisJCXNzaXplX3QgcmVzID0gZnVzZV9nZXRfcmVzX2J5X2lvKGlvKTsKIAotCQlpZiAoaW8tPmVycikKLQkJCXJlcyA9IGlvLT5lcnI7Ci0JCWVsc2UgaWYgKGlvLT5ieXRlcyA+PSAwICYmIGlvLT53cml0ZSkKLQkJCXJlcyA9IC1FSU87Ci0JCWVsc2UgewotCQkJcmVzID0gaW8tPmJ5dGVzIDwgMCA/IGlvLT5zaXplIDogaW8tPmJ5dGVzOworCQlpZiAocmVzID49IDApIHsKKwkJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGlvLT5pb2NiLT5raV9maWxwKTsKKwkJCXN0cnVjdCBmdXNlX2Nvbm4gKmZjID0gZ2V0X2Z1c2VfY29ubihpbm9kZSk7CisJCQlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShpbm9kZSk7CiAKLQkJCWlmICghaXNfc3luY19raW9jYihpby0+aW9jYikpIHsKLQkJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZV9pbm9kZShpby0+aW9jYi0+a2lfZmlscCk7Ci0JCQkJc3RydWN0IGZ1c2VfY29ubiAqZmMgPSBnZXRfZnVzZV9jb25uKGlub2RlKTsKLQkJCQlzdHJ1Y3QgZnVzZV9pbm9kZSAqZmkgPSBnZXRfZnVzZV9pbm9kZShpbm9kZSk7Ci0KLQkJCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKLQkJCQlmaS0+YXR0cl92ZXJzaW9uID0gKytmYy0+YXR0cl92ZXJzaW9uOwotCQkJCXNwaW5fdW5sb2NrKCZmYy0+bG9jayk7Ci0JCQl9CisJCQlzcGluX2xvY2soJmZjLT5sb2NrKTsKKwkJCWZpLT5hdHRyX3ZlcnNpb24gPSArK2ZjLT5hdHRyX3ZlcnNpb247CisJCQlzcGluX3VubG9jaygmZmMtPmxvY2spOwogCQl9CiAKLQkJYWlvX2NvbXBsZXRlKGlvLT5pb2NiLCByZXMsIDApOworCQlpby0+aW9jYi0+a2lfY29tcGxldGUoaW8tPmlvY2IsIHJlcywgMCk7CiAJCWtmcmVlKGlvKTsKIAl9CiB9CkBAIC0xMzk1LDU1ICsxNDAxLDMzIEBACiAJcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIHNzaXplX3QgZnVzZV9kaXJlY3RfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorc3RhdGljIHNzaXplX3QgZnVzZV9kaXJlY3RfcmVhZF9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICp0bykKIHsKLQlzdHJ1Y3QgZnVzZV9pb19wcml2IGlvID0geyAuYXN5bmMgPSAwLCAuZmlsZSA9IGZpbGUgfTsKLQlzdHJ1Y3QgaW92ZWMgaW92ID0geyAuaW92X2Jhc2UgPSBidWYsIC5pb3ZfbGVuID0gY291bnQgfTsKLQlzdHJ1Y3QgaW92X2l0ZXIgaWk7Ci0JaW92X2l0ZXJfaW5pdCgmaWksIFJFQUQsICZpb3YsIDEsIGNvdW50KTsKLQlyZXR1cm4gX19mdXNlX2RpcmVjdF9yZWFkKCZpbywgJmlpLCBwcG9zKTsKKwlzdHJ1Y3QgZnVzZV9pb19wcml2IGlvID0geyAuYXN5bmMgPSAwLCAuZmlsZSA9IGlvY2ItPmtpX2ZpbHAgfTsKKwlyZXR1cm4gX19mdXNlX2RpcmVjdF9yZWFkKCZpbywgdG8sICZpb2NiLT5raV9wb3MpOwogfQogCi1zdGF0aWMgc3NpemVfdCBfX2Z1c2VfZGlyZWN0X3dyaXRlKHN0cnVjdCBmdXNlX2lvX3ByaXYgKmlvLAotCQkJCSAgIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKLQkJCQkgICBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgc3NpemVfdCBmdXNlX2RpcmVjdF93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewotCXN0cnVjdCBmaWxlICpmaWxlID0gaW8tPmZpbGU7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpOwotCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwotCXNzaXplX3QgcmVzOwotCi0KLQlyZXMgPSBnZW5lcmljX3dyaXRlX2NoZWNrcyhmaWxlLCBwcG9zLCAmY291bnQsIDApOwotCWlmICghcmVzKSB7Ci0JCWlvdl9pdGVyX3RydW5jYXRlKGl0ZXIsIGNvdW50KTsKLQkJcmVzID0gZnVzZV9kaXJlY3RfaW8oaW8sIGl0ZXIsIHBwb3MsIEZVU0VfRElPX1dSSVRFKTsKLQl9Ci0KLQlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7Ci0KLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgc3NpemVfdCBmdXNlX2RpcmVjdF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGlvdmVjIGlvdiA9IHsgLmlvdl9iYXNlID0gKHZvaWQgX191c2VyICopYnVmLCAuaW92X2xlbiA9IGNvdW50IH07Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7Ci0Jc3NpemVfdCByZXM7CiAJc3RydWN0IGZ1c2VfaW9fcHJpdiBpbyA9IHsgLmFzeW5jID0gMCwgLmZpbGUgPSBmaWxlIH07Ci0Jc3RydWN0IGlvdl9pdGVyIGlpOwotCWlvdl9pdGVyX2luaXQoJmlpLCBXUklURSwgJmlvdiwgMSwgY291bnQpOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOworCXNzaXplX3QgcmVzOwogCiAJaWYgKGlzX2JhZF9pbm9kZShpbm9kZSkpCiAJCXJldHVybiAtRUlPOwogCiAJLyogRG9uJ3QgYWxsb3cgcGFyYWxsZWwgd3JpdGVzIHRvIHRoZSBzYW1lIGZpbGUgKi8KIAltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JcmVzID0gX19mdXNlX2RpcmVjdF93cml0ZSgmaW8sICZpaSwgcHBvcyk7CisJcmVzID0gZ2VuZXJpY193cml0ZV9jaGVja3MoZmlsZSwgJmlvY2ItPmtpX3BvcywgJmNvdW50LCAwKTsKKwlpZiAoIXJlcykgeworCQlpb3ZfaXRlcl90cnVuY2F0ZShmcm9tLCBjb3VudCk7CisJCXJlcyA9IGZ1c2VfZGlyZWN0X2lvKCZpbywgZnJvbSwgJmlvY2ItPmtpX3BvcywgRlVTRV9ESU9fV1JJVEUpOworCX0KKwlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7CiAJaWYgKHJlcyA+IDApCi0JCWZ1c2Vfd3JpdGVfdXBkYXRlX3NpemUoaW5vZGUsICpwcG9zKTsKKwkJZnVzZV93cml0ZV91cGRhdGVfc2l6ZShpbm9kZSwgaW9jYi0+a2lfcG9zKTsKIAltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKIAogCXJldHVybiByZXM7CkBAIC0yODAxLDYgKzI3ODUsNyBAQAogZnVzZV9kaXJlY3RfSU8oaW50IHJ3LCBzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqaXRlciwKIAkJCWxvZmZfdCBvZmZzZXQpCiB7CisJREVDTEFSRV9DT01QTEVUSU9OX09OU1RBQ0sod2FpdCk7CiAJc3NpemVfdCByZXQgPSAwOwogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3QgZnVzZV9maWxlICpmZiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKQEAgLTI4NTIsMTAgKzI4MzcsMjAgQEAKIAlpZiAoIWlzX3N5bmNfa2lvY2IoaW9jYikgJiYgKG9mZnNldCArIGNvdW50ID4gaV9zaXplKSAmJiBydyA9PSBXUklURSkKIAkJaW8tPmFzeW5jID0gZmFsc2U7CiAKLQlpZiAocncgPT0gV1JJVEUpCi0JCXJldCA9IF9fZnVzZV9kaXJlY3Rfd3JpdGUoaW8sIGl0ZXIsICZwb3MpOwotCWVsc2UKKwlpZiAoaW8tPmFzeW5jICYmIGlzX3N5bmNfa2lvY2IoaW9jYikpCisJCWlvLT5kb25lID0gJndhaXQ7CisKKwlpZiAocncgPT0gV1JJVEUpIHsKKwkJcmV0ID0gZ2VuZXJpY193cml0ZV9jaGVja3MoZmlsZSwgJnBvcywgJmNvdW50LCAwKTsKKwkJaWYgKCFyZXQpIHsKKwkJCWlvdl9pdGVyX3RydW5jYXRlKGl0ZXIsIGNvdW50KTsKKwkJCXJldCA9IGZ1c2VfZGlyZWN0X2lvKGlvLCBpdGVyLCAmcG9zLCBGVVNFX0RJT19XUklURSk7CisJCX0KKworCQlmdXNlX2ludmFsaWRhdGVfYXR0cihpbm9kZSk7CisJfSBlbHNlIHsKIAkJcmV0ID0gX19mdXNlX2RpcmVjdF9yZWFkKGlvLCBpdGVyLCAmcG9zKTsKKwl9CiAKIAlpZiAoaW8tPmFzeW5jKSB7CiAJCWZ1c2VfYWlvX2NvbXBsZXRlKGlvLCByZXQgPCAwID8gcmV0IDogMCwgLTEpOwpAQCAtMjg2NCwxMSArMjg1OSwxMiBAQAogCQlpZiAoIWlzX3N5bmNfa2lvY2IoaW9jYikpCiAJCQlyZXR1cm4gLUVJT0NCUVVFVUVEOwogCi0JCXJldCA9IHdhaXRfb25fc3luY19raW9jYihpb2NiKTsKLQl9IGVsc2UgewotCQlrZnJlZShpbyk7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXQpOworCQlyZXQgPSBmdXNlX2dldF9yZXNfYnlfaW8oaW8pOwogCX0KIAorCWtmcmVlKGlvKTsKKwogCWlmIChydyA9PSBXUklURSkgewogCQlpZiAocmV0ID4gMCkKIAkJCWZ1c2Vfd3JpdGVfdXBkYXRlX3NpemUoaW5vZGUsIHBvcyk7CkBAIC0yOTU3LDkgKzI5NTMsNyBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdXNlX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGZ1c2VfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKIAkucmVhZF9pdGVyCT0gZnVzZV9maWxlX3JlYWRfaXRlciwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLndyaXRlX2l0ZXIJPSBmdXNlX2ZpbGVfd3JpdGVfaXRlciwKIAkubW1hcAkJPSBmdXNlX2ZpbGVfbW1hcCwKIAkub3BlbgkJPSBmdXNlX29wZW4sCkBAIC0yOTc3LDggKzI5NzEsOCBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmdXNlX2RpcmVjdF9pb19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBmdXNlX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IGZ1c2VfZGlyZWN0X3JlYWQsCi0JLndyaXRlCQk9IGZ1c2VfZGlyZWN0X3dyaXRlLAorCS5yZWFkX2l0ZXIJPSBmdXNlX2RpcmVjdF9yZWFkX2l0ZXIsCisJLndyaXRlX2l0ZXIJPSBmdXNlX2RpcmVjdF93cml0ZV9pdGVyLAogCS5tbWFwCQk9IGZ1c2VfZGlyZWN0X21tYXAsCiAJLm9wZW4JCT0gZnVzZV9vcGVuLAogCS5mbHVzaAkJPSBmdXNlX2ZsdXNoLApkaWZmIC0tZ2l0IGEvZnMvZnVzZS9mdXNlX2kuaCBiL2ZzL2Z1c2UvZnVzZV9pLmgKaW5kZXggMWNkZmIwNy4uNzM1NGRjMSAxMDA2NDQKLS0tIGEvZnMvZnVzZS9mdXNlX2kuaAorKysgYi9mcy9mdXNlL2Z1c2VfaS5oCkBAIC0yNjMsNiArMjYzLDcgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBraW9jYiAqaW9jYjsKIAlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiAqZG9uZTsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9hY2wuYyBiL2ZzL2dmczIvYWNsLmMKaW5kZXggN2IzMTQzMC4uMWJlM2IwNiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hY2wuYworKysgYi9mcy9nZnMyL2FjbC5jCkBAIC0xMTAsMTEgKzExMCw3IEBACiAJZXJyb3IgPSBfX2dmczJfeGF0dHJfc2V0KGlub2RlLCBuYW1lLCBkYXRhLCBsZW4sIDAsIEdGUzJfRUFUWVBFX1NZUyk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKLQotCWlmIChhY2wpCi0JCXNldF9jYWNoZWRfYWNsKGlub2RlLCB0eXBlLCBhY2wpOwotCWVsc2UKLQkJZm9yZ2V0X2NhY2hlZF9hY2woaW5vZGUsIHR5cGUpOworCXNldF9jYWNoZWRfYWNsKGlub2RlLCB0eXBlLCBhY2wpOwogb3V0OgogCWtmcmVlKGRhdGEpOwogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2ZzL2dmczIvYW9wcy5jIGIvZnMvZ2ZzMi9hb3BzLmMKaW5kZXggNGFkNGY5NC4uYTZlNjk5MCAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hb3BzLmMKKysrIGIvZnMvZ2ZzMi9hb3BzLmMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvZ2ZzMl9vbmRpc2suaD4KICNpbmNsdWRlIDxsaW51eC9iYWNraW5nLWRldi5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy93cml0ZWJhY2suaD4KIAogI2luY2x1ZGUgImdmczIuaCIKQEAgLTY3MSwxMiArNjcxLDEyIEBACiAKIAlpZiAoYWxsb2NfcmVxdWlyZWQpIHsKIAkJc3RydWN0IGdmczJfYWxsb2NfcGFybXMgYXAgPSB7IC5hZmxhZ3MgPSAwLCB9OwotCQllcnJvciA9IGdmczJfcXVvdGFfbG9ja19jaGVjayhpcCk7CisJCXJlcXVlc3RlZCA9IGRhdGFfYmxvY2tzICsgaW5kX2Jsb2NrczsKKwkJYXAudGFyZ2V0ID0gcmVxdWVzdGVkOworCQllcnJvciA9IGdmczJfcXVvdGFfbG9ja19jaGVjayhpcCwgJmFwKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXRfdW5sb2NrOwogCi0JCXJlcXVlc3RlZCA9IGRhdGFfYmxvY2tzICsgaW5kX2Jsb2NrczsKLQkJYXAudGFyZ2V0ID0gcmVxdWVzdGVkOwogCQllcnJvciA9IGdmczJfaW5wbGFjZV9yZXNlcnZlKGlwLCAmYXApOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9xdW5sb2NrOwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9ibWFwLmMgYi9mcy9nZnMyL2JtYXAuYwppbmRleCBmMGI5NDVhLi42MTI5NmVjIDEwMDY0NAotLS0gYS9mcy9nZnMyL2JtYXAuYworKysgYi9mcy9nZnMyL2JtYXAuYwpAQCAtMTIyNCw3ICsxMjI0LDcgQEAKIAogCWlmIChnZnMyX2lzX3N0dWZmZWQoaXApICYmCiAJICAgIChzaXplID4gKHNkcC0+c2Rfc2Iuc2JfYnNpemUgLSBzaXplb2Yoc3RydWN0IGdmczJfZGlub2RlKSkpKSB7Ci0JCWVycm9yID0gZ2ZzMl9xdW90YV9sb2NrX2NoZWNrKGlwKTsKKwkJZXJyb3IgPSBnZnMyX3F1b3RhX2xvY2tfY2hlY2soaXAsICZhcCk7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9maWxlLmMgYi9mcy9nZnMyL2ZpbGUuYwppbmRleCAzZTMyYmI4Li4yMDdlYjRhIDEwMDY0NAotLS0gYS9mcy9nZnMyL2ZpbGUuYworKysgYi9mcy9nZnMyL2ZpbGUuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvZGxtLmg+CiAjaW5jbHVkZSA8bGludXgvZGxtX3Bsb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgImdmczIuaCIKQEAgLTQyOSwxMSArNDI4LDExIEBACiAJaWYgKHJldCkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JcmV0ID0gZ2ZzMl9xdW90YV9sb2NrX2NoZWNrKGlwKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF91bmxvY2s7CiAJZ2ZzMl93cml0ZV9jYWxjX3Jlc2VydihpcCwgUEFHRV9DQUNIRV9TSVpFLCAmZGF0YV9ibG9ja3MsICZpbmRfYmxvY2tzKTsKIAlhcC50YXJnZXQgPSBkYXRhX2Jsb2NrcyArIGluZF9ibG9ja3M7CisJcmV0ID0gZ2ZzMl9xdW90YV9sb2NrX2NoZWNrKGlwLCAmYXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VubG9jazsKIAlyZXQgPSBnZnMyX2lucGxhY2VfcmVzZXJ2ZShpcCwgJmFwKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9xdW90YV91bmxvY2s7CkBAIC03NjUsMjIgKzc2NCwzMCBAQAogCWJyZWxzZShkaWJoKTsKIAlyZXR1cm4gZXJyb3I7CiB9Ci0KLXN0YXRpYyB2b2lkIGNhbGNfbWF4X3Jlc2VydihzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIGxvZmZfdCBtYXgsIGxvZmZfdCAqbGVuLAotCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YV9ibG9ja3MsIHVuc2lnbmVkIGludCAqaW5kX2Jsb2NrcykKKy8qKgorICogY2FsY19tYXhfcmVzZXJ2KCkgLSBSZXZlcnNlIG9mIHdyaXRlX2NhbGNfcmVzZXJ2LiBHaXZlbiBhIG51bWJlciBvZgorICogICAgICAgICAgICAgICAgICAgICBibG9ja3MsIGRldGVybWluZSBob3cgbWFueSBieXRlcyBjYW4gYmUgd3JpdHRlbi4KKyAqIEBpcDogICAgICAgICAgVGhlIGlub2RlIGluIHF1ZXN0aW9uLgorICogQGxlbjogICAgICAgICBNYXggY2FwIG9mIGJ5dGVzLiBXaGF0IHdlIHJldHVybiBpbiAqbGVuIG11c3QgYmUgPD0gdGhpcy4KKyAqIEBkYXRhX2Jsb2NrczogQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgZGF0YSBibG9ja3MgbmVlZGVkCisgKiBAaW5kX2Jsb2NrczogIENvbXB1dGUgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGluZGlyZWN0IGJsb2NrcyBuZWVkZWQKKyAqIEBtYXhfYmxvY2tzOiAgVGhlIHRvdGFsIGJsb2NrcyBhdmFpbGFibGUgdG8gd29yayB3aXRoLgorICoKKyAqIFJldHVybnM6IHZvaWQsIGJ1dCBAbGVuLCBAZGF0YV9ibG9ja3MgYW5kIEBpbmRfYmxvY2tzIGFyZSBmaWxsZWQgaW4uCisgKi8KK3N0YXRpYyB2b2lkIGNhbGNfbWF4X3Jlc2VydihzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIGxvZmZfdCAqbGVuLAorCQkJICAgIHVuc2lnbmVkIGludCAqZGF0YV9ibG9ja3MsIHVuc2lnbmVkIGludCAqaW5kX2Jsb2NrcywKKwkJCSAgICB1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcykKIHsKKwlsb2ZmX3QgbWF4ID0gKmxlbjsKIAljb25zdCBzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKLQl1bnNpZ25lZCBpbnQgbWF4X2Jsb2NrcyA9IGlwLT5pX3JnZC0+cmRfZnJlZV9jbG9uZTsKIAl1bnNpZ25lZCBpbnQgdG1wLCBtYXhfZGF0YSA9IG1heF9ibG9ja3MgLSAzICogKHNkcC0+c2RfbWF4X2hlaWdodCAtIDEpOwogCiAJZm9yICh0bXAgPSBtYXhfZGF0YTsgdG1wID4gc2RwLT5zZF9kaXB0cnM7KSB7CiAJCXRtcCA9IERJVl9ST1VORF9VUCh0bXAsIHNkcC0+c2RfaW5wdHJzKTsKIAkJbWF4X2RhdGEgLT0gdG1wOwogCX0KLQkvKiBUaGlzIGNhbGN1bGF0aW9uIGlzbid0IHRoZSBleGFjdCByZXZlcnNlIG9mIGdmczJfd3JpdGVfY2FsY19yZXNlcnZlLAotCSAgIHNvIGl0IG1pZ2h0IGVuZCB1cCB3aXRoIGZld2VyIGRhdGEgYmxvY2tzICovCi0JaWYgKG1heF9kYXRhIDw9ICpkYXRhX2Jsb2NrcykKLQkJcmV0dXJuOworCiAJKmRhdGFfYmxvY2tzID0gbWF4X2RhdGE7CiAJKmluZF9ibG9ja3MgPSBtYXhfYmxvY2tzIC0gbWF4X2RhdGE7CiAJKmxlbiA9ICgobG9mZl90KW1heF9kYXRhIC0gMykgPDwgc2RwLT5zZF9zYi5zYl9ic2l6ZV9zaGlmdDsKQEAgLTc5Nyw3ICs4MDQsNyBAQAogCXN0cnVjdCBnZnMyX2lub2RlICppcCA9IEdGUzJfSShpbm9kZSk7CiAJc3RydWN0IGdmczJfYWxsb2NfcGFybXMgYXAgPSB7IC5hZmxhZ3MgPSAwLCB9OwogCXVuc2lnbmVkIGludCBkYXRhX2Jsb2NrcyA9IDAsIGluZF9ibG9ja3MgPSAwLCByYmxvY2tzOwotCWxvZmZfdCBieXRlcywgbWF4X2J5dGVzOworCWxvZmZfdCBieXRlcywgbWF4X2J5dGVzLCBtYXhfYmxrcyA9IFVJTlRfTUFYOwogCWludCBlcnJvcjsKIAljb25zdCBsb2ZmX3QgcG9zID0gb2Zmc2V0OwogCWNvbnN0IGxvZmZfdCBjb3VudCA9IGxlbjsKQEAgLTgxOSw2ICs4MjYsOSBAQAogCiAJZ2ZzMl9zaXplX2hpbnQoZmlsZSwgb2Zmc2V0LCBsZW4pOwogCisJZ2ZzMl93cml0ZV9jYWxjX3Jlc2VydihpcCwgUEFHRV9TSVpFLCAmZGF0YV9ibG9ja3MsICZpbmRfYmxvY2tzKTsKKwlhcC5taW5fdGFyZ2V0ID0gZGF0YV9ibG9ja3MgKyBpbmRfYmxvY2tzOworCiAJd2hpbGUgKGxlbiA+IDApIHsKIAkJaWYgKGxlbiA8IGJ5dGVzKQogCQkJYnl0ZXMgPSBsZW47CkBAIC04MjcsMjcgKzgzNyw0MSBAQAogCQkJb2Zmc2V0ICs9IGJ5dGVzOwogCQkJY29udGludWU7CiAJCX0KLQkJZXJyb3IgPSBnZnMyX3F1b3RhX2xvY2tfY2hlY2soaXApOworCisJCS8qIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGhvdyBtYW55IGJ5dGVzIHdlIGNhbiBhY3R1YWxseQorCQkgKiBmYWxsb2NhdGUgd2l0aG91dCBleGNlZWRpbmcgcXVvdGEgb3IgZ29pbmcgb3ZlciB0aGUKKwkJICogZW5kIG9mIHRoZSBmcy4gV2Ugc3RhcnQgb2ZmIG9wdGltaXN0aWNhbGx5IGJ5IGFzc3VtaW5nCisJCSAqIHdlIGNhbiB3cml0ZSBtYXhfYnl0ZXMgKi8KKwkJbWF4X2J5dGVzID0gKGxlbiA+IG1heF9jaHVua19zaXplKSA/IG1heF9jaHVua19zaXplIDogbGVuOworCisJCS8qIFNpbmNlIG1heF9ieXRlcyBpcyBtb3N0IGxpa2VseSBhIHRoZW9yZXRpY2FsIG1heCwgd2UKKwkJICogY2FsY3VsYXRlIGEgbW9yZSByZWFsaXN0aWMgJ2J5dGVzJyB0byBzZXJ2ZSBhcyBhIGdvb2QKKwkJICogc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgbWF5IGJlIGFibGUKKwkJICogdG8gd3JpdGUgKi8KKwkJZ2ZzMl93cml0ZV9jYWxjX3Jlc2VydihpcCwgYnl0ZXMsICZkYXRhX2Jsb2NrcywgJmluZF9ibG9ja3MpOworCQlhcC50YXJnZXQgPSBkYXRhX2Jsb2NrcyArIGluZF9ibG9ja3M7CisKKwkJZXJyb3IgPSBnZnMyX3F1b3RhX2xvY2tfY2hlY2soaXAsICZhcCk7CiAJCWlmIChlcnJvcikKIAkJCXJldHVybiBlcnJvcjsKLXJldHJ5OgotCQlnZnMyX3dyaXRlX2NhbGNfcmVzZXJ2KGlwLCBieXRlcywgJmRhdGFfYmxvY2tzLCAmaW5kX2Jsb2Nrcyk7CisJCS8qIGFwLmFsbG93ZWQgdGVsbHMgdXMgaG93IG1hbnkgYmxvY2tzIHF1b3RhIHdpbGwgYWxsb3cKKwkJICogdXMgdG8gd3JpdGUuIENoZWNrIGlmIHRoaXMgcmVkdWNlcyBtYXhfYmxrcyAqLworCQlpZiAoYXAuYWxsb3dlZCAmJiBhcC5hbGxvd2VkIDwgbWF4X2Jsa3MpCisJCQltYXhfYmxrcyA9IGFwLmFsbG93ZWQ7CiAKLQkJYXAudGFyZ2V0ID0gZGF0YV9ibG9ja3MgKyBpbmRfYmxvY2tzOwogCQllcnJvciA9IGdmczJfaW5wbGFjZV9yZXNlcnZlKGlwLCAmYXApOwotCQlpZiAoZXJyb3IpIHsKLQkJCWlmIChlcnJvciA9PSAtRU5PU1BDICYmIGJ5dGVzID4gc2RwLT5zZF9zYi5zYl9ic2l6ZSkgewotCQkJCWJ5dGVzID4+PSAxOwotCQkJCWJ5dGVzICY9IGJzaXplX21hc2s7Ci0JCQkJaWYgKGJ5dGVzID09IDApCi0JCQkJCWJ5dGVzID0gc2RwLT5zZF9zYi5zYl9ic2l6ZTsKLQkJCQlnb3RvIHJldHJ5OwotCQkJfQorCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9xdW5sb2NrOwotCQl9Ci0JCW1heF9ieXRlcyA9IGJ5dGVzOwotCQljYWxjX21heF9yZXNlcnYoaXAsIChsZW4gPiBtYXhfY2h1bmtfc2l6ZSk/IG1heF9jaHVua19zaXplOiBsZW4sCi0JCQkJJm1heF9ieXRlcywgJmRhdGFfYmxvY2tzLCAmaW5kX2Jsb2Nrcyk7CisKKwkJLyogY2hlY2sgaWYgdGhlIHNlbGVjdGVkIHJncnAgbGltaXRzIG91ciBtYXhfYmxrcyBmdXJ0aGVyICovCisJCWlmIChhcC5hbGxvd2VkICYmIGFwLmFsbG93ZWQgPCBtYXhfYmxrcykKKwkJCW1heF9ibGtzID0gYXAuYWxsb3dlZDsKKworCQkvKiBBbG1vc3QgZG9uZS4gQ2FsY3VsYXRlIGJ5dGVzIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdXNpbmcKKwkJICogbWF4X2Jsa3MuIFdlIGFsc28gcmVjb21wdXRlIG1heF9ieXRlcywgZGF0YV9ibG9ja3MgYW5kCisJCSAqIGluZF9ibG9ja3MgKi8KKwkJY2FsY19tYXhfcmVzZXJ2KGlwLCAmbWF4X2J5dGVzLCAmZGF0YV9ibG9ja3MsCisJCQkJJmluZF9ibG9ja3MsIG1heF9ibGtzKTsKIAogCQlyYmxvY2tzID0gUkVTX0RJTk9ERSArIGluZF9ibG9ja3MgKyBSRVNfU1RBVEZTICsgUkVTX1FVT1RBICsKIAkJCSAgUkVTX1JHX0hEUiArIGdmczJfcmdfYmxvY2tzKGlwLCBkYXRhX2Jsb2NrcyArIGluZF9ibG9ja3MpOwpAQCAtOTMxLDYgKzk1NSwyMiBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGdmczJfZmlsZV9zcGxpY2Vfd3JpdGUoc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSwKKwkJCQkgICAgICBzdHJ1Y3QgZmlsZSAqb3V0LCBsb2ZmX3QgKnBwb3MsCisJCQkJICAgICAgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAgPSBHRlMyX0kob3V0LT5mX21hcHBpbmctPmhvc3QpOworCisJZXJyb3IgPSBnZnMyX3JzX2FsbG9jKGlwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiAoc3NpemVfdCllcnJvcjsKKworCWdmczJfc2l6ZV9oaW50KG91dCwgKnBwb3MsIGxlbik7CisKKwlyZXR1cm4gaXRlcl9maWxlX3NwbGljZV93cml0ZShwaXBlLCBvdXQsIHBwb3MsIGxlbiwgZmxhZ3MpOworfQorCiAjaWZkZWYgQ09ORklHX0dGUzJfRlNfTE9DS0lOR19ETE0KIAogLyoqCkBAIC0xMDY1LDkgKzExMDUsNyBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdmczJfZmlsZV9mb3BzID0gewogCS5sbHNlZWsJCT0gZ2ZzMl9sbHNlZWssCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKIAkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLndyaXRlX2l0ZXIJPSBnZnMyX2ZpbGVfd3JpdGVfaXRlciwKIAkudW5sb2NrZWRfaW9jdGwJPSBnZnMyX2lvY3RsLAogCS5tbWFwCQk9IGdmczJfbW1hcCwKQEAgLTEwNzcsNyArMTExNSw3IEBACiAJLmxvY2sJCT0gZ2ZzMl9sb2NrLAogCS5mbG9jawkJPSBnZnMyX2Zsb2NrLAogCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKLQkuc3BsaWNlX3dyaXRlCT0gaXRlcl9maWxlX3NwbGljZV93cml0ZSwKKwkuc3BsaWNlX3dyaXRlCT0gZ2ZzMl9maWxlX3NwbGljZV93cml0ZSwKIAkuc2V0bGVhc2UJPSBzaW1wbGVfbm9zZXRsZWFzZSwKIAkuZmFsbG9jYXRlCT0gZ2ZzMl9mYWxsb2NhdGUsCiB9OwpAQCAtMTA5Nyw5ICsxMTM1LDcgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBnZnMyX2ZpbGVfZm9wc19ub2xvY2sgPSB7CiAJLmxsc2VlawkJPSBnZnMyX2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkud3JpdGVfaXRlcgk9IGdmczJfZmlsZV93cml0ZV9pdGVyLAogCS51bmxvY2tlZF9pb2N0bAk9IGdmczJfaW9jdGwsCiAJLm1tYXAJCT0gZ2ZzMl9tbWFwLApAQCAtMTEwNyw3ICsxMTQzLDcgQEAKIAkucmVsZWFzZQk9IGdmczJfcmVsZWFzZSwKIAkuZnN5bmMJCT0gZ2ZzMl9mc3luYywKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCi0JLnNwbGljZV93cml0ZQk9IGl0ZXJfZmlsZV9zcGxpY2Vfd3JpdGUsCisJLnNwbGljZV93cml0ZQk9IGdmczJfZmlsZV9zcGxpY2Vfd3JpdGUsCiAJLnNldGxlYXNlCT0gZ2VuZXJpY19zZXRsZWFzZSwKIAkuZmFsbG9jYXRlCT0gZ2ZzMl9mYWxsb2NhdGUsCiB9OwpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9nbG9jay5jIGIvZnMvZ2ZzMi9nbG9jay5jCmluZGV4IGY0MmRmZmIuLjBmYTgwNjIgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvZ2xvY2suYworKysgYi9mcy9nZnMyL2dsb2NrLmMKQEAgLTIwNDcsMzQgKzIwNDcsNDEgQEAKIAogaW50IGdmczJfY3JlYXRlX2RlYnVnZnNfZmlsZShzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCkKIHsKLQlzZHAtPmRlYnVnZnNfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKHNkcC0+c2RfdGFibGVfbmFtZSwgZ2ZzMl9yb290KTsKLQlpZiAoIXNkcC0+ZGVidWdmc19kaXIpCi0JCXJldHVybiAtRU5PTUVNOwotCXNkcC0+ZGVidWdmc19kZW50cnlfZ2xvY2tzID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZ2xvY2tzIiwKLQkJCQkJCQkgU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJCQkJIHNkcC0+ZGVidWdmc19kaXIsIHNkcCwKLQkJCQkJCQkgJmdmczJfZ2xvY2tzX2ZvcHMpOwotCWlmICghc2RwLT5kZWJ1Z2ZzX2RlbnRyeV9nbG9ja3MpCi0JCWdvdG8gZmFpbDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50OwogCi0Jc2RwLT5kZWJ1Z2ZzX2RlbnRyeV9nbHN0YXRzID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZ2xzdGF0cyIsCi0JCQkJCQkJU19JRlJFRyB8IFNfSVJVR08sCi0JCQkJCQkJc2RwLT5kZWJ1Z2ZzX2Rpciwgc2RwLAotCQkJCQkJCSZnZnMyX2dsc3RhdHNfZm9wcyk7Ci0JaWYgKCFzZHAtPmRlYnVnZnNfZGVudHJ5X2dsc3RhdHMpCisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2RpcihzZHAtPnNkX3RhYmxlX25hbWUsIGdmczJfcm9vdCk7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnQpKQogCQlnb3RvIGZhaWw7CisJc2RwLT5kZWJ1Z2ZzX2RpciA9IGRlbnQ7CiAKLQlzZHAtPmRlYnVnZnNfZGVudHJ5X3Nic3RhdHMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzYnN0YXRzIiwKLQkJCQkJCQlTX0lGUkVHIHwgU19JUlVHTywKLQkJCQkJCQlzZHAtPmRlYnVnZnNfZGlyLCBzZHAsCi0JCQkJCQkJJmdmczJfc2JzdGF0c19mb3BzKTsKLQlpZiAoIXNkcC0+ZGVidWdmc19kZW50cnlfc2JzdGF0cykKKwlkZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZ2xvY2tzIiwKKwkJCQkgICBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBzZHAtPmRlYnVnZnNfZGlyLCBzZHAsCisJCQkJICAgJmdmczJfZ2xvY2tzX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKIAkJZ290byBmYWlsOworCXNkcC0+ZGVidWdmc19kZW50cnlfZ2xvY2tzID0gZGVudDsKKworCWRlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJnbHN0YXRzIiwKKwkJCQkgICBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQkgICBzZHAtPmRlYnVnZnNfZGlyLCBzZHAsCisJCQkJICAgJmdmczJfZ2xzdGF0c19mb3BzKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudCkpCisJCWdvdG8gZmFpbDsKKwlzZHAtPmRlYnVnZnNfZGVudHJ5X2dsc3RhdHMgPSBkZW50OworCisJZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInNic3RhdHMiLAorCQkJCSAgIFNfSUZSRUcgfCBTX0lSVUdPLAorCQkJCSAgIHNkcC0+ZGVidWdmc19kaXIsIHNkcCwKKwkJCQkgICAmZ2ZzMl9zYnN0YXRzX2ZvcHMpOworCWlmIChJU19FUlJfT1JfTlVMTChkZW50KSkKKwkJZ290byBmYWlsOworCXNkcC0+ZGVidWdmc19kZW50cnlfc2JzdGF0cyA9IGRlbnQ7CiAKIAlyZXR1cm4gMDsKIGZhaWw6CiAJZ2ZzMl9kZWxldGVfZGVidWdmc19maWxlKHNkcCk7Ci0JcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIGRlbnQgPyBQVFJfRVJSKGRlbnQpIDogLUVOT01FTTsKIH0KIAogdm9pZCBnZnMyX2RlbGV0ZV9kZWJ1Z2ZzX2ZpbGUoc3RydWN0IGdmczJfc2JkICpzZHApCkBAIC0yMTAwLDYgKzIxMDcsOCBAQAogaW50IGdmczJfcmVnaXN0ZXJfZGVidWdmcyh2b2lkKQogewogCWdmczJfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZ2ZzMiIsIE5VTEwpOworCWlmIChJU19FUlIoZ2ZzMl9yb290KSkKKwkJcmV0dXJuIFBUUl9FUlIoZ2ZzMl9yb290KTsKIAlyZXR1cm4gZ2ZzMl9yb290ID8gMCA6IC1FTk9NRU07CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2dmczIvaW5jb3JlLmggYi9mcy9nZnMyL2luY29yZS5oCmluZGV4IDdhMmRiYmMuLjU4Yjc1YWIgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5jb3JlLmgKKysrIGIvZnMvZ2ZzMi9pbmNvcmUuaApAQCAtMzAxLDggKzMwMSwxMCBAQAogICogdG8gdGhlIGFsbG9jYXRpb24gY29kZS4KICAqLwogc3RydWN0IGdmczJfYWxsb2NfcGFybXMgewotCXUzMiB0YXJnZXQ7CisJdTY0IHRhcmdldDsKKwl1MzIgbWluX3RhcmdldDsKIAl1MzIgYWZsYWdzOworCXU2NCBhbGxvd2VkOwogfTsKIAogZW51bSB7CmRpZmYgLS1naXQgYS9mcy9nZnMyL2lub2RlLmMgYi9mcy9nZnMyL2lub2RlLmMKaW5kZXggNzNjNzIyNTMuLjA4YmM4NGQgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvaW5vZGUuYworKysgYi9mcy9nZnMyL2lub2RlLmMKQEAgLTM4Miw3ICszODIsNyBAQAogCXN0cnVjdCBnZnMyX2FsbG9jX3Bhcm1zIGFwID0geyAudGFyZ2V0ID0gKmRibG9ja3MsIC5hZmxhZ3MgPSBmbGFncywgfTsKIAlpbnQgZXJyb3I7CiAKLQllcnJvciA9IGdmczJfcXVvdGFfbG9ja19jaGVjayhpcCk7CisJZXJyb3IgPSBnZnMyX3F1b3RhX2xvY2tfY2hlY2soaXAsICZhcCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIApAQCAtNTI1LDcgKzUyNSw3IEBACiAJaW50IGVycm9yOwogCiAJaWYgKGRhLT5ucl9ibG9ja3MpIHsKLQkJZXJyb3IgPSBnZnMyX3F1b3RhX2xvY2tfY2hlY2soZGlwKTsKKwkJZXJyb3IgPSBnZnMyX3F1b3RhX2xvY2tfY2hlY2soZGlwLCAmYXApOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGZhaWxfcXVvdGFfbG9ja3M7CiAKQEAgLTk1Myw3ICs5NTMsNyBAQAogCiAJaWYgKGRhLm5yX2Jsb2NrcykgewogCQlzdHJ1Y3QgZ2ZzMl9hbGxvY19wYXJtcyBhcCA9IHsgLnRhcmdldCA9IGRhLm5yX2Jsb2NrcywgfTsKLQkJZXJyb3IgPSBnZnMyX3F1b3RhX2xvY2tfY2hlY2soZGlwKTsKKwkJZXJyb3IgPSBnZnMyX3F1b3RhX2xvY2tfY2hlY2soZGlwLCAmYXApOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIG91dF9ndW5sb2NrOwogCkBAIC0xNDcwLDcgKzE0NzAsNyBAQAogCiAJaWYgKGRhLm5yX2Jsb2NrcykgewogCQlzdHJ1Y3QgZ2ZzMl9hbGxvY19wYXJtcyBhcCA9IHsgLnRhcmdldCA9IGRhLm5yX2Jsb2NrcywgfTsKLQkJZXJyb3IgPSBnZnMyX3F1b3RhX2xvY2tfY2hlY2sobmRpcCk7CisJCWVycm9yID0gZ2ZzMl9xdW90YV9sb2NrX2NoZWNrKG5kaXAsICZhcCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2d1bmxvY2s7CiAKQEAgLTE2NjksNiArMTY2OSw3IEBACiAJa3VpZF90IG91aWQsIG51aWQ7CiAJa2dpZF90IG9naWQsIG5naWQ7CiAJaW50IGVycm9yOworCXN0cnVjdCBnZnMyX2FsbG9jX3Bhcm1zIGFwOwogCiAJb3VpZCA9IGlub2RlLT5pX3VpZDsKIAlvZ2lkID0gaW5vZGUtPmlfZ2lkOwpAQCAtMTY5Niw5ICsxNjk3LDExIEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDsKIAorCWFwLnRhcmdldCA9IGdmczJfZ2V0X2lub2RlX2Jsb2NrcygmaXAtPmlfaW5vZGUpOworCiAJaWYgKCF1aWRfZXEob3VpZCwgTk9fVUlEX1FVT1RBX0NIQU5HRSkgfHwKIAkgICAgIWdpZF9lcShvZ2lkLCBOT19HSURfUVVPVEFfQ0hBTkdFKSkgewotCQllcnJvciA9IGdmczJfcXVvdGFfY2hlY2soaXAsIG51aWQsIG5naWQpOworCQllcnJvciA9IGdmczJfcXVvdGFfY2hlY2soaXAsIG51aWQsIG5naWQsICZhcCk7CiAJCWlmIChlcnJvcikKIAkJCWdvdG8gb3V0X2d1bmxvY2tfcTsKIAl9CkBAIC0xNzEzLDkgKzE3MTYsOCBAQAogCiAJaWYgKCF1aWRfZXEob3VpZCwgTk9fVUlEX1FVT1RBX0NIQU5HRSkgfHwKIAkgICAgIWdpZF9lcShvZ2lkLCBOT19HSURfUVVPVEFfQ0hBTkdFKSkgewotCQl1NjQgYmxvY2tzID0gZ2ZzMl9nZXRfaW5vZGVfYmxvY2tzKCZpcC0+aV9pbm9kZSk7Ci0JCWdmczJfcXVvdGFfY2hhbmdlKGlwLCAtYmxvY2tzLCBvdWlkLCBvZ2lkKTsKLQkJZ2ZzMl9xdW90YV9jaGFuZ2UoaXAsIGJsb2NrcywgbnVpZCwgbmdpZCk7CisJCWdmczJfcXVvdGFfY2hhbmdlKGlwLCAtYXAudGFyZ2V0LCBvdWlkLCBvZ2lkKTsKKwkJZ2ZzMl9xdW90YV9jaGFuZ2UoaXAsIGFwLnRhcmdldCwgbnVpZCwgbmdpZCk7CiAJfQogCiBvdXRfZW5kX3RyYW5zOgpkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9xdW90YS5jIGIvZnMvZ2ZzMi9xdW90YS5jCmluZGV4IDNhYTE3ZDQuLjVjMjdlNDggMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcXVvdGEuYworKysgYi9mcy9nZnMyL3F1b3RhLmMKQEAgLTkyMyw2ICs5MjMsOSBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChRREZfUkVGUkVTSCwgJnFkLT5xZF9mbGFncykpCisJCWZvcmNlX3JlZnJlc2ggPSBGT1JDRTsKKwogCXFkLT5xZF9xYiA9ICooc3RydWN0IGdmczJfcXVvdGFfbHZiICopcWQtPnFkX2dsLT5nbF9sa3NiLnNiX2x2YnB0cjsKIAogCWlmIChmb3JjZV9yZWZyZXNoIHx8IHFkLT5xZF9xYi5xYl9tYWdpYyAhPSBjcHVfdG9fYmUzMihHRlMyX01BR0lDKSkgewpAQCAtOTc0LDExICs5NzcsOCBAQAogCSAgICAgc2l6ZW9mKHN0cnVjdCBnZnMyX3F1b3RhX2RhdGEgKiksIHNvcnRfcWQsIE5VTEwpOwogCiAJZm9yICh4ID0gMDsgeCA8IGlwLT5pX3Jlcy0+cnNfcWFfcWRfbnVtOyB4KyspIHsKLQkJaW50IGZvcmNlID0gTk9fRk9SQ0U7CiAJCXFkID0gaXAtPmlfcmVzLT5yc19xYV9xZFt4XTsKLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChRREZfUkVGUkVTSCwgJnFkLT5xZF9mbGFncykpCi0JCQlmb3JjZSA9IEZPUkNFOwotCQllcnJvciA9IGRvX2dsb2NrKHFkLCBmb3JjZSwgJmlwLT5pX3Jlcy0+cnNfcWFfcWRfZ2hzW3hdKTsKKwkJZXJyb3IgPSBkb19nbG9jayhxZCwgTk9fRk9SQ0UsICZpcC0+aV9yZXMtPnJzX3FhX3FkX2doc1t4XSk7CiAJCWlmIChlcnJvcikKIAkJCWJyZWFrOwogCX0KQEAgLTEwOTQsMTQgKzEwOTQsMzMgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGdmczJfcXVvdGFfY2hlY2soc3RydWN0IGdmczJfaW5vZGUgKmlwLCBrdWlkX3QgdWlkLCBrZ2lkX3QgZ2lkKQorLyoqCisgKiBnZnMyX3F1b3RhX2NoZWNrIC0gY2hlY2sgaWYgYWxsb2NhdGluZyBuZXcgYmxvY2tzIHdpbGwgZXhjZWVkIHF1b3RhCisgKiBAaXA6ICBUaGUgaW5vZGUgZm9yIHdoaWNoIHRoaXMgY2hlY2sgaXMgYmVpbmcgcGVyZm9ybWVkCisgKiBAdWlkOiBUaGUgdWlkIHRvIGNoZWNrIGFnYWluc3QKKyAqIEBnaWQ6IFRoZSBnaWQgdG8gY2hlY2sgYWdhaW5zdAorICogQGFwOiAgVGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4gYXAtPnRhcmdldCBjb250YWlucyB0aGUgcmVxdWVzdGVkCisgKiAgICAgICBibG9ja3MuIGFwLT5taW5fdGFyZ2V0LCBpZiBzZXQsIGNvbnRhaW5zIHRoZSBtaW5pbXVtIGJsa3MKKyAqICAgICAgIHJlcXVlc3RlZC4KKyAqCisgKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MuCisgKiAgICAgICAgICAgICAgICAgIG1pbl9yZXEgPSBhcC0+bWluX3RhcmdldCA/IGFwLT5taW5fdGFyZ2V0IDogYXAtPnRhcmdldDsKKyAqICAgICAgICAgICAgICAgICAgcXVvdGEgbXVzdCBhbGxvdyBhdGxlYXN0IG1pbl9yZXEgYmxrcyBmb3Igc3VjY2VzcyBhbmQKKyAqICAgICAgICAgICAgICAgICAgYXAtPmFsbG93ZWQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgYmxvY2tzIGFsbG93ZWQKKyAqCisgKiAgICAgICAgICAtRURRVU9UIG90aGVyd2lzZSwgcXVvdGEgdmlvbGF0aW9uLiBhcC0+YWxsb3dlZCBpcyBzZXQgdG8gbnVtYmVyCisgKiAgICAgICAgICAgICAgICAgIG9mIGJsb2NrcyBhdmFpbGFibGUuCisgKi8KK2ludCBnZnMyX3F1b3RhX2NoZWNrKHN0cnVjdCBnZnMyX2lub2RlICppcCwga3VpZF90IHVpZCwga2dpZF90IGdpZCwKKwkJICAgICBzdHJ1Y3QgZ2ZzMl9hbGxvY19wYXJtcyAqYXApCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7CiAJc3RydWN0IGdmczJfcXVvdGFfZGF0YSAqcWQ7Ci0JczY0IHZhbHVlOworCXM2NCB2YWx1ZSwgd2FybiwgbGltaXQ7CiAJdW5zaWduZWQgaW50IHg7CiAJaW50IGVycm9yID0gMDsKIAorCWFwLT5hbGxvd2VkID0gVUlOVF9NQVg7IC8qIEFzc3VtZSB3ZSBhcmUgcGVybWl0dGVkIGEgd2hvbGUgbG90ICovCiAJaWYgKCF0ZXN0X2JpdChHSUZfUURfTE9DS0VELCAmaXAtPmlfZmxhZ3MpKQogCQlyZXR1cm4gMDsKIApAQCAtMTExNSwzMCArMTEzNCwzNyBAQAogCQkgICAgICBxaWRfZXEocWQtPnFkX2lkLCBtYWtlX2txaWRfZ2lkKGdpZCkpKSkKIAkJCWNvbnRpbnVlOwogCisJCXdhcm4gPSAoczY0KWJlNjRfdG9fY3B1KHFkLT5xZF9xYi5xYl93YXJuKTsKKwkJbGltaXQgPSAoczY0KWJlNjRfdG9fY3B1KHFkLT5xZF9xYi5xYl9saW1pdCk7CiAJCXZhbHVlID0gKHM2NCliZTY0X3RvX2NwdShxZC0+cWRfcWIucWJfdmFsdWUpOwogCQlzcGluX2xvY2soJnFkX2xvY2spOwogCQl2YWx1ZSArPSBxZC0+cWRfY2hhbmdlOwogCQlzcGluX3VubG9jaygmcWRfbG9jayk7CiAKLQkJaWYgKGJlNjRfdG9fY3B1KHFkLT5xZF9xYi5xYl9saW1pdCkgJiYgKHM2NCliZTY0X3RvX2NwdShxZC0+cWRfcWIucWJfbGltaXQpIDwgdmFsdWUpIHsKLQkJCXByaW50X21lc3NhZ2UocWQsICJleGNlZWRlZCIpOwotCQkJcXVvdGFfc2VuZF93YXJuaW5nKHFkLT5xZF9pZCwKLQkJCQkJICAgc2RwLT5zZF92ZnMtPnNfZGV2LCBRVU9UQV9OTF9CSEFSRFdBUk4pOwotCi0JCQllcnJvciA9IC1FRFFVT1Q7Ci0JCQlicmVhazsKLQkJfSBlbHNlIGlmIChiZTY0X3RvX2NwdShxZC0+cWRfcWIucWJfd2FybikgJiYKLQkJCSAgIChzNjQpYmU2NF90b19jcHUocWQtPnFkX3FiLnFiX3dhcm4pIDwgdmFsdWUgJiYKKwkJaWYgKGxpbWl0ID4gMCAmJiAobGltaXQgLSB2YWx1ZSkgPCBhcC0+YWxsb3dlZCkKKwkJCWFwLT5hbGxvd2VkID0gbGltaXQgLSB2YWx1ZTsKKwkJLyogSWYgd2UgY2FuJ3QgbWVldCB0aGUgdGFyZ2V0ICovCisJCWlmIChsaW1pdCAmJiBsaW1pdCA8ICh2YWx1ZSArIChzNjQpYXAtPnRhcmdldCkpIHsKKwkJCS8qIElmIG5vIG1pbl90YXJnZXQgc3BlY2lmaWVkIG9yIHdlIGRvbid0IG1lZXQKKwkJCSAqIG1pbl90YXJnZXQsIHJldHVybiAtRURRVU9UICovCisJCQlpZiAoIWFwLT5taW5fdGFyZ2V0IHx8IGFwLT5taW5fdGFyZ2V0ID4gYXAtPmFsbG93ZWQpIHsKKwkJCQlwcmludF9tZXNzYWdlKHFkLCAiZXhjZWVkZWQiKTsKKwkJCQlxdW90YV9zZW5kX3dhcm5pbmcocWQtPnFkX2lkLAorCQkJCQkJICAgc2RwLT5zZF92ZnMtPnNfZGV2LAorCQkJCQkJICAgUVVPVEFfTkxfQkhBUkRXQVJOKTsKKwkJCQllcnJvciA9IC1FRFFVT1Q7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAod2FybiAmJiB3YXJuIDwgdmFsdWUgJiYKIAkJCSAgIHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcWQtPnFkX2xhc3Rfd2FybiArCi0JCQkJCSBnZnMyX3R1bmVfZ2V0KHNkcCwKLQkJCQkJCWd0X3F1b3RhX3dhcm5fcGVyaW9kKSAqIEhaKSkgeworCQkJCQkgZ2ZzMl90dW5lX2dldChzZHAsIGd0X3F1b3RhX3dhcm5fcGVyaW9kKQorCQkJCQkgKiBIWikpIHsKIAkJCXF1b3RhX3NlbmRfd2FybmluZyhxZC0+cWRfaWQsCiAJCQkJCSAgIHNkcC0+c2RfdmZzLT5zX2RldiwgUVVPVEFfTkxfQlNPRlRXQVJOKTsKIAkJCWVycm9yID0gcHJpbnRfbWVzc2FnZShxZCwgIndhcm5pbmciKTsKIAkJCXFkLT5xZF9sYXN0X3dhcm4gPSBqaWZmaWVzOwogCQl9CiAJfQotCiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9mcy9nZnMyL3F1b3RhLmggYi9mcy9nZnMyL3F1b3RhLmgKaW5kZXggNTVkNTA2ZS4uYWQwNGIzYSAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9xdW90YS5oCisrKyBiL2ZzL2dmczIvcXVvdGEuaApAQCAtMjQsNyArMjQsOCBAQAogZXh0ZXJuIGludCBnZnMyX3F1b3RhX2xvY2soc3RydWN0IGdmczJfaW5vZGUgKmlwLCBrdWlkX3QgdWlkLCBrZ2lkX3QgZ2lkKTsKIGV4dGVybiB2b2lkIGdmczJfcXVvdGFfdW5sb2NrKHN0cnVjdCBnZnMyX2lub2RlICppcCk7CiAKLWV4dGVybiBpbnQgZ2ZzMl9xdW90YV9jaGVjayhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIGt1aWRfdCB1aWQsIGtnaWRfdCBnaWQpOworZXh0ZXJuIGludCBnZnMyX3F1b3RhX2NoZWNrKHN0cnVjdCBnZnMyX2lub2RlICppcCwga3VpZF90IHVpZCwga2dpZF90IGdpZCwKKwkJCSAgICBzdHJ1Y3QgZ2ZzMl9hbGxvY19wYXJtcyAqYXApOwogZXh0ZXJuIHZvaWQgZ2ZzMl9xdW90YV9jaGFuZ2Uoc3RydWN0IGdmczJfaW5vZGUgKmlwLCBzNjQgY2hhbmdlLAogCQkJICAgICAga3VpZF90IHVpZCwga2dpZF90IGdpZCk7CiAKQEAgLTM3LDcgKzM4LDggQEAKIAogZXh0ZXJuIHZvaWQgZ2ZzMl93YWtlX3VwX3N0YXRmcyhzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGdmczJfcXVvdGFfbG9ja19jaGVjayhzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApCitzdGF0aWMgaW5saW5lIGludCBnZnMyX3F1b3RhX2xvY2tfY2hlY2soc3RydWN0IGdmczJfaW5vZGUgKmlwLAorCQkJCQlzdHJ1Y3QgZ2ZzMl9hbGxvY19wYXJtcyAqYXApCiB7CiAJc3RydWN0IGdmczJfc2JkICpzZHAgPSBHRlMyX1NCKCZpcC0+aV9pbm9kZSk7CiAJaW50IHJldDsKQEAgLTQ4LDcgKzUwLDcgQEAKIAkJcmV0dXJuIHJldDsKIAlpZiAoc2RwLT5zZF9hcmdzLmFyX3F1b3RhICE9IEdGUzJfUVVPVEFfT04pCiAJCXJldHVybiAwOwotCXJldCA9IGdmczJfcXVvdGFfY2hlY2soaXAsIGlwLT5pX2lub2RlLmlfdWlkLCBpcC0+aV9pbm9kZS5pX2dpZCk7CisJcmV0ID0gZ2ZzMl9xdW90YV9jaGVjayhpcCwgaXAtPmlfaW5vZGUuaV91aWQsIGlwLT5pX2lub2RlLmlfZ2lkLCBhcCk7CiAJaWYgKHJldCkKIAkJZ2ZzMl9xdW90YV91bmxvY2soaXApOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9mcy9nZnMyL3JncnAuYyBiL2ZzL2dmczIvcmdycC5jCmluZGV4IDkxNTAyMDcuLjZhZjIzOTYgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcmdycC5jCisrKyBiL2ZzL2dmczIvcmdycC5jCkBAIC0xOTQ2LDEwICsxOTQ2LDE4IEBACiAgKiBAaXA6IHRoZSBpbm9kZSB0byByZXNlcnZlIHNwYWNlIGZvcgogICogQGFwOiB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzCiAgKgotICogUmV0dXJuczogZXJybm8KKyAqIFdlIHRyeSBvdXIgYmVzdCB0byBmaW5kIGFuIHJncnAgdGhhdCBoYXMgYXQgbGVhc3QgYXAtPnRhcmdldCBibG9ja3MKKyAqIGF2YWlsYWJsZS4gQWZ0ZXIgYSBjb3VwbGUgb2YgcGFzc2VzIChsb29wcyA9PSAyKSwgdGhlIHByb3NwZWN0cyBvZiBmaW5kaW5nCisgKiBzdWNoIGFuIHJncnAgZGltaW5pc2guIEF0IHRoaXMgc3RhZ2UsIHdlIHJldHVybiB0aGUgZmlyc3QgcmdycCB0aGF0IGhhcworICogYXRsZWFzdCBhcC0+bWluX3RhcmdldCBibG9ja3MgYXZhaWxhYmxlLiBFaXRoZXIgd2F5LCB3ZSBzZXQgYXAtPmFsbG93ZWQgdG8KKyAqIHRoZSBudW1iZXIgb2YgYmxvY2tzIGF2YWlsYWJsZSBpbiB0aGUgY2hvc2VuIHJncnAuCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLAorICogICAgICAgICAgLUVOT01FTSBpZiBhIHN1aXRhYmxlIHJncnAgY2FuJ3QgYmUgZm91bmQKKyAqICAgICAgICAgIGVycm5vIG90aGVyd2lzZQogICovCiAKLWludCBnZnMyX2lucGxhY2VfcmVzZXJ2ZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIGNvbnN0IHN0cnVjdCBnZnMyX2FsbG9jX3Bhcm1zICphcCkKK2ludCBnZnMyX2lucGxhY2VfcmVzZXJ2ZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXAsIHN0cnVjdCBnZnMyX2FsbG9jX3Bhcm1zICphcCkKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmlwLT5pX2lub2RlKTsKIAlzdHJ1Y3QgZ2ZzMl9yZ3JwZCAqYmVnaW4gPSBOVUxMOwpAQCAtMjAxMiw3ICsyMDIwLDcgQEAKIAkJLyogU2tpcCB1bnVzZWFibGUgcmVzb3VyY2UgZ3JvdXBzICovCiAJCWlmICgocnMtPnJzX3JibS5yZ2QtPnJkX2ZsYWdzICYgKEdGUzJfUkdGX05PQUxMT0MgfAogCQkJCQkJIEdGUzJfUkRGX0VSUk9SKSkgfHwKLQkJICAgIChhcC0+dGFyZ2V0ID4gcnMtPnJzX3JibS5yZ2QtPnJkX2V4dGZhaWxfcHQpKQorCQkgICAgKGxvb3BzID09IDAgJiYgYXAtPnRhcmdldCA+IHJzLT5yc19yYm0ucmdkLT5yZF9leHRmYWlsX3B0KSkKIAkJCWdvdG8gc2tpcF9yZ3JwOwogCiAJCWlmIChzZHAtPnNkX2FyZ3MuYXJfcmdycGx2YikKQEAgLTIwMjcsMTEgKzIwMzUsMTMgQEAKIAkJCWdvdG8gY2hlY2tfcmdycDsKIAogCQkvKiBJZiByZ3JwIGhhcyBlbm91Z2ggZnJlZSBzcGFjZSwgdXNlIGl0ICovCi0JCWlmIChycy0+cnNfcmJtLnJnZC0+cmRfZnJlZV9jbG9uZSA+PSBhcC0+dGFyZ2V0KSB7CisJCWlmIChycy0+cnNfcmJtLnJnZC0+cmRfZnJlZV9jbG9uZSA+PSBhcC0+dGFyZ2V0IHx8CisJCSAgICAobG9vcHMgPT0gMiAmJiBhcC0+bWluX3RhcmdldCAmJgorCQkgICAgIHJzLT5yc19yYm0ucmdkLT5yZF9mcmVlX2Nsb25lID49IGFwLT5taW5fdGFyZ2V0KSkgewogCQkJaXAtPmlfcmdkID0gcnMtPnJzX3JibS5yZ2Q7CisJCQlhcC0+YWxsb3dlZCA9IGlwLT5pX3JnZC0+cmRfZnJlZV9jbG9uZTsKIAkJCXJldHVybiAwOwogCQl9Ci0KIGNoZWNrX3JncnA6CiAJCS8qIENoZWNrIGZvciB1bmxpbmtlZCBpbm9kZXMgd2hpY2ggY2FuIGJlIHJlY2xhaW1lZCAqLwogCQlpZiAocnMtPnJzX3JibS5yZ2QtPnJkX2ZsYWdzICYgR0ZTMl9SREZfQ0hFQ0spCmRpZmYgLS1naXQgYS9mcy9nZnMyL3JncnAuaCBiL2ZzL2dmczIvcmdycC5oCmluZGV4IGIxMDRmNGEuLjY4OTcyZWMgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIvcmdycC5oCisrKyBiL2ZzL2dmczIvcmdycC5oCkBAIC00MSw3ICs0MSw4IEBACiBleHRlcm4gc3RydWN0IGdmczJfYWxsb2MgKmdmczJfYWxsb2NfZ2V0KHN0cnVjdCBnZnMyX2lub2RlICppcCk7CiAKICNkZWZpbmUgR0ZTMl9BRl9PUkxPViAxCi1leHRlcm4gaW50IGdmczJfaW5wbGFjZV9yZXNlcnZlKHN0cnVjdCBnZnMyX2lub2RlICppcCwgY29uc3Qgc3RydWN0IGdmczJfYWxsb2NfcGFybXMgKmFwKTsKK2V4dGVybiBpbnQgZ2ZzMl9pbnBsYWNlX3Jlc2VydmUoc3RydWN0IGdmczJfaW5vZGUgKmlwLAorCQkJCXN0cnVjdCBnZnMyX2FsbG9jX3Bhcm1zICphcCk7CiBleHRlcm4gdm9pZCBnZnMyX2lucGxhY2VfcmVsZWFzZShzdHJ1Y3QgZ2ZzMl9pbm9kZSAqaXApOwogCiBleHRlcm4gaW50IGdmczJfYWxsb2NfYmxvY2tzKHN0cnVjdCBnZnMyX2lub2RlICppcCwgdTY0ICpibiwgdW5zaWduZWQgaW50ICpuLApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi94YXR0ci5jIGIvZnMvZ2ZzMi94YXR0ci5jCmluZGV4IDBiODFmNzguLmZkMjYwY2UgMTAwNjQ0Ci0tLSBhL2ZzL2dmczIveGF0dHIuYworKysgYi9mcy9nZnMyL3hhdHRyLmMKQEAgLTczMiw3ICs3MzIsNyBAQAogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCi0JZXJyb3IgPSBnZnMyX3F1b3RhX2xvY2tfY2hlY2soaXApOworCWVycm9yID0gZ2ZzMl9xdW90YV9sb2NrX2NoZWNrKGlwLCAmYXApOwogCWlmIChlcnJvcikKIAkJcmV0dXJuIGVycm9yOwogCmRpZmYgLS1naXQgYS9mcy9oZnMvaW5vZGUuYyBiL2ZzL2hmcy9pbm9kZS5jCmluZGV4IGQwOTI5YmMuLjkzMzcwNjUgMTAwNjQ0Ci0tLSBhL2ZzL2hmcy9pbm9kZS5jCisrKyBiL2ZzL2hmcy9pbm9kZS5jCkBAIC0xNCw3ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KIAogI2luY2x1ZGUgImhmc19mcy5oIgogI2luY2x1ZGUgImJ0cmVlLmgiCkBAIC02NzQsOSArNjc0LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKIAkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfbW1hcCwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2JyZWMuYyBiL2ZzL2hmc3BsdXMvYnJlYy5jCmluZGV4IDZlNTYwZDUuLjc1NGZkZjggMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvYnJlYy5jCisrKyBiL2ZzL2hmc3BsdXMvYnJlYy5jCkBAIC0xMzEsMTMgKzEzMSwxNiBAQAogCWhmc19ibm9kZV93cml0ZShub2RlLCBlbnRyeSwgZGF0YV9vZmYgKyBrZXlfbGVuLCBlbnRyeV9sZW4pOwogCWhmc19ibm9kZV9kdW1wKG5vZGUpOwogCi0JaWYgKG5ld19ub2RlKSB7Ci0JCS8qIHVwZGF0ZSBwYXJlbnQga2V5IGlmIHdlIGluc2VydGVkIGEga2V5Ci0JCSAqIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgbm9kZQotCQkgKi8KLQkJaWYgKCFyZWMgJiYgbmV3X25vZGUgIT0gbm9kZSkKLQkJCWhmc19icmVjX3VwZGF0ZV9wYXJlbnQoZmQpOworCS8qCisJICogdXBkYXRlIHBhcmVudCBrZXkgaWYgd2UgaW5zZXJ0ZWQgYSBrZXkKKwkgKiBhdCB0aGUgc3RhcnQgb2YgdGhlIG5vZGUgYW5kIGl0IGlzIG5vdCB0aGUgbmV3IG5vZGUKKwkgKi8KKwlpZiAoIXJlYyAmJiBuZXdfbm9kZSAhPSBub2RlKSB7CisJCWhmc19ibm9kZV9yZWFkX2tleShub2RlLCBmZC0+c2VhcmNoX2tleSwgZGF0YV9vZmYgKyBzaXplKTsKKwkJaGZzX2JyZWNfdXBkYXRlX3BhcmVudChmZCk7CisJfQogCisJaWYgKG5ld19ub2RlKSB7CiAJCWhmc19ibm9kZV9wdXQoZmQtPmJub2RlKTsKIAkJaWYgKCFuZXdfbm9kZS0+cGFyZW50KSB7CiAJCQloZnNfYnRyZWVfaW5jX2hlaWdodCh0cmVlKTsKQEAgLTE2OCw5ICsxNzEsNiBAQAogCQlnb3RvIGFnYWluOwogCX0KIAotCWlmICghcmVjKQotCQloZnNfYnJlY191cGRhdGVfcGFyZW50KGZkKTsKLQogCXJldHVybiAwOwogfQogCkBAIC0zNzAsNiArMzcwLDggQEAKIAlpZiAoSVNfRVJSKHBhcmVudCkpCiAJCXJldHVybiBQVFJfRVJSKHBhcmVudCk7CiAJX19oZnNfYnJlY19maW5kKHBhcmVudCwgZmQsIGhmc19maW5kX3JlY19ieV9rZXkpOworCWlmIChmZC0+cmVjb3JkIDwgMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJaGZzX2Jub2RlX2R1bXAocGFyZW50KTsKIAlyZWMgPSBmZC0+cmVjb3JkOwogCmRpZmYgLS1naXQgYS9mcy9oZnNwbHVzL2lub2RlLmMgYi9mcy9oZnNwbHVzL2lub2RlLmMKaW5kZXggMGNmNzg2Zi4uNWY4NmNhZGIgMTAwNjQ0Ci0tLSBhL2ZzL2hmc3BsdXMvaW5vZGUuYworKysgYi9mcy9oZnNwbHVzL2lub2RlLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbXBhZ2UuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogCiAjaW5jbHVkZSAiaGZzcGx1c19mcy5oIgogI2luY2x1ZGUgImhmc3BsdXNfcmF3LmgiCkBAIC0zNDEsOSArMzQxLDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGZzcGx1c19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCiAJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCiAJLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkLApkaWZmIC0tZ2l0IGEvZnMvaG9zdGZzL2hvc3Rmcy5oIGIvZnMvaG9zdGZzL2hvc3Rmcy5oCmluZGV4IDRmY2Q0MGQuLjkxZTE5ZjkgMTAwNjQ0Ci0tLSBhL2ZzL2hvc3Rmcy9ob3N0ZnMuaAorKysgYi9mcy9ob3N0ZnMvaG9zdGZzLmgKQEAgLTY2LDcgKzY2LDggQEAKIGV4dGVybiBpbnQgYWNjZXNzX2ZpbGUoY2hhciAqcGF0aCwgaW50IHIsIGludCB3LCBpbnQgeCk7CiBleHRlcm4gaW50IG9wZW5fZmlsZShjaGFyICpwYXRoLCBpbnQgciwgaW50IHcsIGludCBhcHBlbmQpOwogZXh0ZXJuIHZvaWQgKm9wZW5fZGlyKGNoYXIgKnBhdGgsIGludCAqZXJyX291dCk7Ci1leHRlcm4gY2hhciAqcmVhZF9kaXIodm9pZCAqc3RyZWFtLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBvcywKK2V4dGVybiB2b2lkIHNlZWtfZGlyKHZvaWQgKnN0cmVhbSwgdW5zaWduZWQgbG9uZyBsb25nIHBvcyk7CitleHRlcm4gY2hhciAqcmVhZF9kaXIodm9pZCAqc3RyZWFtLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBvc19vdXQsCiAJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqaW5vX291dCwgaW50ICpsZW5fb3V0LAogCQkgICAgICB1bnNpZ25lZCBpbnQgKnR5cGVfb3V0KTsKIGV4dGVybiB2b2lkIGNsb3NlX2ZpbGUodm9pZCAqc3RyZWFtKTsKQEAgLTc3LDggKzc4LDcgQEAKIAkJICAgICAgaW50IGxlbik7CiBleHRlcm4gaW50IGxzZWVrX2ZpbGUoaW50IGZkLCBsb25nIGxvbmcgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKIGV4dGVybiBpbnQgZnN5bmNfZmlsZShpbnQgZmQsIGludCBkYXRhc3luYyk7Ci1leHRlcm4gaW50IGZpbGVfY3JlYXRlKGNoYXIgKm5hbWUsIGludCB1ciwgaW50IHV3LCBpbnQgdXgsIGludCBnciwKLQkJICAgICAgIGludCBndywgaW50IGd4LCBpbnQgb3IsIGludCBvdywgaW50IG94KTsKK2V4dGVybiBpbnQgZmlsZV9jcmVhdGUoY2hhciAqbmFtZSwgaW50IG1vZGUpOwogZXh0ZXJuIGludCBzZXRfYXR0cihjb25zdCBjaGFyICpmaWxlLCBzdHJ1Y3QgaG9zdGZzX2lhdHRyICphdHRycywgaW50IGZkKTsKIGV4dGVybiBpbnQgbWFrZV9zeW1saW5rKGNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvKTsKIGV4dGVybiBpbnQgdW5saW5rX2ZpbGUoY29uc3QgY2hhciAqZmlsZSk7CmRpZmYgLS1naXQgYS9mcy9ob3N0ZnMvaG9zdGZzX2tlcm4uYyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCmluZGV4IGZkNjJjYWUuLmI4M2EwMzQgMTAwNjQ0Ci0tLSBhL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCisrKyBiL2ZzL2hvc3Rmcy9ob3N0ZnNfa2Vybi5jCkBAIC0yNCw2ICsyNCw3IEBACiAJaW50IGZkOwogCWZtb2RlX3QgbW9kZTsKIAlzdHJ1Y3QgaW5vZGUgdmZzX2lub2RlOworCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaG9zdGZzX2lub2RlX2luZm8gKkhPU1RGU19JKHN0cnVjdCBpbm9kZSAqaW5vZGUpCkBAIC05MiwxNiArOTMsMjIgQEAKIAkJX19wdXRuYW1lKG5hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CisKKwkvKgorCSAqIFRoaXMgZnVuY3Rpb24gcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgZGVudHJ5X3BhdGhfcmF3KCkgd2lsbCBwbGFjZQorCSAqIHRoZSBwYXRoIG5hbWUgYXQgdGhlIGVuZCBvZiB0aGUgcHJvdmlkZWQgYnVmZmVyLgorCSAqLworCUJVR19PTihwICsgc3RybGVuKHApICsgMSAhPSBuYW1lICsgUEFUSF9NQVgpOworCiAJc3RybGNweShuYW1lLCByb290LCBQQVRIX01BWCk7CiAJaWYgKGxlbiA+IHAgLSBuYW1lKSB7CiAJCV9fcHV0bmFtZShuYW1lKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWlmIChwID4gbmFtZSArIGxlbikgewotCQljaGFyICpzID0gbmFtZSArIGxlbjsKLQkJd2hpbGUgKCgqcysrID0gKnArKykgIT0gJ1wwJykKLQkJCTsKLQl9CisKKwlpZiAocCA+IG5hbWUgKyBsZW4pCisJCXN0cmNweShuYW1lICsgbGVuLCBwKTsKKwogCXJldHVybiBuYW1lOwogfQogCkBAIC0xMzUsMjEgKzE0MiwxOSBAQAogCWludCBsZW4sIG47CiAJY2hhciAqbmFtZSwgKnJlc29sdmVkLCAqZW5kOwogCi0JbGVuID0gNjQ7Ci0Jd2hpbGUgKDEpIHsKKwluYW1lID0gX19nZXRuYW1lKCk7CisJaWYgKCFuYW1lKSB7CiAJCW4gPSAtRU5PTUVNOwotCQluYW1lID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJZ290byBvdXQ7Ci0KLQkJbiA9IGhvc3Rmc19kb19yZWFkbGluayhsaW5rLCBuYW1lLCBsZW4pOwotCQlpZiAobiA8IGxlbikKLQkJCWJyZWFrOwotCQlsZW4gKj0gMjsKLQkJa2ZyZWUobmFtZSk7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQorCisJbiA9IGhvc3Rmc19kb19yZWFkbGluayhsaW5rLCBuYW1lLCBQQVRIX01BWCk7CiAJaWYgKG4gPCAwKQogCQlnb3RvIG91dF9mcmVlOworCWVsc2UgaWYgKG4gPT0gUEFUSF9NQVgpIHsKKwkJbiA9IC1FMkJJRzsKKwkJZ290byBvdXRfZnJlZTsKKwl9CiAKIAlpZiAoKm5hbWUgPT0gJy8nKQogCQlyZXR1cm4gbmFtZTsKQEAgLTE2OCwxMyArMTczLDEyIEBACiAJfQogCiAJc3ByaW50ZihyZXNvbHZlZCwgIiVzJXMiLCBsaW5rLCBuYW1lKTsKLQlrZnJlZShuYW1lKTsKKwlfX3B1dG5hbWUobmFtZSk7CiAJa2ZyZWUobGluayk7CiAJcmV0dXJuIHJlc29sdmVkOwogCiAgb3V0X2ZyZWU6Ci0Ja2ZyZWUobmFtZSk7Ci0gb3V0OgorCV9fcHV0bmFtZShuYW1lKTsKIAlyZXR1cm4gRVJSX1BUUihuKTsKIH0KIApAQCAtMjI1LDYgKzIyOSw3IEBACiAJaGktPmZkID0gLTE7CiAJaGktPm1vZGUgPSAwOwogCWlub2RlX2luaXRfb25jZSgmaGktPnZmc19pbm9kZSk7CisJbXV0ZXhfaW5pdCgmaGktPm9wZW5fbXV0ZXgpOwogCXJldHVybiAmaGktPnZmc19pbm9kZTsKIH0KIApAQCAtMjU3LDYgKzI2Miw5IEBACiAJaWYgKHN0cmxlbihyb290X3BhdGgpID4gb2Zmc2V0KQogCQlzZXFfcHJpbnRmKHNlcSwgIiwlcyIsIHJvb3RfcGF0aCArIG9mZnNldCk7CiAKKwlpZiAoYXBwZW5kKQorCQlzZXFfcHV0cyhzZXEsICIsYXBwZW5kIik7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjg0LDYgKzI5Miw3IEBACiAJaWYgKGRpciA9PSBOVUxMKQogCQlyZXR1cm4gLWVycm9yOwogCW5leHQgPSBjdHgtPnBvczsKKwlzZWVrX2RpcihkaXIsIG5leHQpOwogCXdoaWxlICgobmFtZSA9IHJlYWRfZGlyKGRpciwgJm5leHQsICZpbm8sICZsZW4sICZ0eXBlKSkgIT0gTlVMTCkgewogCQlpZiAoIWRpcl9lbWl0KGN0eCwgbmFtZSwgbGVuLCBpbm8sIHR5cGUpKQogCQkJYnJlYWs7CkBAIC0yOTMsMTMgKzMwMiwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhvc3Rmc19maWxlX29wZW4oc3RydWN0IGlub2RlICppbm8sIHN0cnVjdCBmaWxlICpmaWxlKQorc3RhdGljIGludCBob3N0ZnNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlubywgc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0Jc3RhdGljIERFRklORV9NVVRFWChvcGVuX211dGV4KTsKIAljaGFyICpuYW1lOwotCWZtb2RlX3QgbW9kZSA9IDA7CisJZm1vZGVfdCBtb2RlOwogCWludCBlcnI7Ci0JaW50IHIgPSAwLCB3ID0gMCwgZmQ7CisJaW50IHIsIHcsIGZkOwogCiAJbW9kZSA9IGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOwogCWlmICgobW9kZSAmIEhPU1RGU19JKGlubyktPm1vZGUpID09IG1vZGUpCkBAIC0zMDgsMTIgKzMxNiwxMiBAQAogCW1vZGUgfD0gSE9TVEZTX0koaW5vKS0+bW9kZTsKIAogcmV0cnk6CisJciA9IHcgPSAwOworCiAJaWYgKG1vZGUgJiBGTU9ERV9SRUFEKQogCQlyID0gMTsKIAlpZiAobW9kZSAmIEZNT0RFX1dSSVRFKQotCQl3ID0gMTsKLQlpZiAodykKLQkJciA9IDE7CisJCXIgPSB3ID0gMTsKIAogCW5hbWUgPSBkZW50cnlfbmFtZShmaWxlLT5mX3BhdGguZGVudHJ5KTsKIAlpZiAobmFtZSA9PSBOVUxMKQpAQCAtMzI0LDE1ICszMzIsMTYgQEAKIAlpZiAoZmQgPCAwKQogCQlyZXR1cm4gZmQ7CiAKLQltdXRleF9sb2NrKCZvcGVuX211dGV4KTsKKwltdXRleF9sb2NrKCZIT1NURlNfSShpbm8pLT5vcGVuX211dGV4KTsKIAkvKiBzb21lYm9keSBlbHNlIGhhZCBoYW5kbGVkIGl0IGZpcnN0PyAqLwogCWlmICgobW9kZSAmIEhPU1RGU19JKGlubyktPm1vZGUpID09IG1vZGUpIHsKLQkJbXV0ZXhfdW5sb2NrKCZvcGVuX211dGV4KTsKKwkJbXV0ZXhfdW5sb2NrKCZIT1NURlNfSShpbm8pLT5vcGVuX211dGV4KTsKKwkJY2xvc2VfZmlsZSgmZmQpOwogCQlyZXR1cm4gMDsKIAl9CiAJaWYgKChtb2RlIHwgSE9TVEZTX0koaW5vKS0+bW9kZSkgIT0gbW9kZSkgewogCQltb2RlIHw9IEhPU1RGU19JKGlubyktPm1vZGU7Ci0JCW11dGV4X3VubG9jaygmb3Blbl9tdXRleCk7CisJCW11dGV4X3VubG9jaygmSE9TVEZTX0koaW5vKS0+b3Blbl9tdXRleCk7CiAJCWNsb3NlX2ZpbGUoJmZkKTsKIAkJZ290byByZXRyeTsKIAl9CkBAIC0zNDIsMTIgKzM1MSwxMiBAQAogCQllcnIgPSByZXBsYWNlX2ZpbGUoZmQsIEhPU1RGU19JKGlubyktPmZkKTsKIAkJY2xvc2VfZmlsZSgmZmQpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJbXV0ZXhfdW5sb2NrKCZvcGVuX211dGV4KTsKKwkJCW11dGV4X3VubG9jaygmSE9TVEZTX0koaW5vKS0+b3Blbl9tdXRleCk7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQogCUhPU1RGU19JKGlubyktPm1vZGUgPSBtb2RlOwotCW11dGV4X3VubG9jaygmb3Blbl9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZIT1NURlNfSShpbm8pLT5vcGVuX211dGV4KTsKIAogCXJldHVybiAwOwogfQpAQCAtMzc4LDEzICszODcsMTEgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG9zdGZzX2ZpbGVfZm9wcyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiAJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCiAJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCi0JLm9wZW4JCT0gaG9zdGZzX2ZpbGVfb3BlbiwKKwkub3BlbgkJPSBob3N0ZnNfb3BlbiwKIAkucmVsZWFzZQk9IGhvc3Rmc19maWxlX3JlbGVhc2UsCiAJLmZzeW5jCQk9IGhvc3Rmc19mc3luYywKIH07CkBAIC0zOTMsNiArNDAwLDggQEAKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLml0ZXJhdGUJPSBob3N0ZnNfcmVhZGRpciwKIAkucmVhZAkJPSBnZW5lcmljX3JlYWRfZGlyLAorCS5vcGVuCQk9IGhvc3Rmc19vcGVuLAorCS5mc3luYwkJPSBob3N0ZnNfZnN5bmMsCiB9OwogCiBzdGF0aWMgaW50IGhvc3Rmc193cml0ZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQpAQCAtNDAwLDcgKzQwOSw3IEBACiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwogCWNoYXIgKmJ1ZmZlcjsKLQl1bnNpZ25lZCBsb25nIGxvbmcgYmFzZTsKKwlsb2ZmX3QgYmFzZSA9IHBhZ2Vfb2Zmc2V0KHBhZ2UpOwogCWludCBjb3VudCA9IFBBR0VfQ0FDSEVfU0laRTsKIAlpbnQgZW5kX2luZGV4ID0gaW5vZGUtPmlfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWludCBlcnI7CkBAIC00MDksNyArNDE4LDYgQEAKIAkJY291bnQgPSBpbm9kZS0+aV9zaXplICYgKFBBR0VfQ0FDSEVfU0laRS0xKTsKIAogCWJ1ZmZlciA9IGttYXAocGFnZSk7Ci0JYmFzZSA9ICgodW5zaWduZWQgbG9uZyBsb25nKSBwYWdlLT5pbmRleCkgPDwgUEFHRV9DQUNIRV9TSElGVDsKIAogCWVyciA9IHdyaXRlX2ZpbGUoSE9TVEZTX0koaW5vZGUpLT5mZCwgJmJhc2UsIGJ1ZmZlciwgY291bnQpOwogCWlmIChlcnIgIT0gY291bnQpIHsKQEAgLTQzNCwyNiArNDQyLDI5IEBACiBzdGF0aWMgaW50IGhvc3Rmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJY2hhciAqYnVmZmVyOwotCWxvbmcgbG9uZyBzdGFydDsKLQlpbnQgZXJyID0gMDsKKwlsb2ZmX3Qgc3RhcnQgPSBwYWdlX29mZnNldChwYWdlKTsKKwlpbnQgYnl0ZXNfcmVhZCwgcmV0ID0gMDsKIAotCXN0YXJ0ID0gKGxvbmcgbG9uZykgcGFnZS0+aW5kZXggPDwgUEFHRV9DQUNIRV9TSElGVDsKIAlidWZmZXIgPSBrbWFwKHBhZ2UpOwotCWVyciA9IHJlYWRfZmlsZShGSUxFX0hPU1RGU19JKGZpbGUpLT5mZCwgJnN0YXJ0LCBidWZmZXIsCisJYnl0ZXNfcmVhZCA9IHJlYWRfZmlsZShGSUxFX0hPU1RGU19JKGZpbGUpLT5mZCwgJnN0YXJ0LCBidWZmZXIsCiAJCQlQQUdFX0NBQ0hFX1NJWkUpOwotCWlmIChlcnIgPCAwKQorCWlmIChieXRlc19yZWFkIDwgMCkgeworCQlDbGVhclBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJU2V0UGFnZUVycm9yKHBhZ2UpOworCQlyZXQgPSBieXRlc19yZWFkOwogCQlnb3RvIG91dDsKKwl9CiAKLQltZW1zZXQoJmJ1ZmZlcltlcnJdLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBlcnIpOworCW1lbXNldChidWZmZXIgKyBieXRlc19yZWFkLCAwLCBQQUdFX0NBQ0hFX1NJWkUgLSBieXRlc19yZWFkKTsKIAotCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOworCUNsZWFyUGFnZUVycm9yKHBhZ2UpOwogCVNldFBhZ2VVcHRvZGF0ZShwYWdlKTsKLQlpZiAoUGFnZUVycm9yKHBhZ2UpKSBDbGVhclBhZ2VFcnJvcihwYWdlKTsKLQllcnIgPSAwOworCiAgb3V0OgorCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCWt1bm1hcChwYWdlKTsKIAl1bmxvY2tfcGFnZShwYWdlKTsKLQlyZXR1cm4gZXJyOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaG9zdGZzX3dyaXRlX2JlZ2luKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKQEAgLTUzMCwxMSArNTQxLDEzIEBACiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm8sIHN0Lm1vZGUgJiBTX0lGTVQsIHJkZXYpOwogCQlpbm8tPmlfb3AgPSAmaG9zdGZzX2lvcHM7CiAJCWJyZWFrOwotCi0JZGVmYXVsdDoKKwljYXNlIFNfSUZSRUc6CiAJCWluby0+aV9vcCA9ICZob3N0ZnNfaW9wczsKIAkJaW5vLT5pX2ZvcCA9ICZob3N0ZnNfZmlsZV9mb3BzOwogCQlpbm8tPmlfbWFwcGluZy0+YV9vcHMgPSAmaG9zdGZzX2FvcHM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlPOwogCX0KIAogCWluby0+aV9pbm8gPSBzdC5pbm87CkBAIC01NjgsMTAgKzU4MSw3IEBACiAJaWYgKG5hbWUgPT0gTlVMTCkKIAkJZ290byBvdXRfcHV0OwogCi0JZmQgPSBmaWxlX2NyZWF0ZShuYW1lLAotCQkJIG1vZGUgJiBTX0lSVVNSLCBtb2RlICYgU19JV1VTUiwgbW9kZSAmIFNfSVhVU1IsCi0JCQkgbW9kZSAmIFNfSVJHUlAsIG1vZGUgJiBTX0lXR1JQLCBtb2RlICYgU19JWEdSUCwKLQkJCSBtb2RlICYgU19JUk9USCwgbW9kZSAmIFNfSVdPVEgsIG1vZGUgJiBTX0lYT1RIKTsKKwlmZCA9IGZpbGVfY3JlYXRlKG5hbWUsIG1vZGUgJiBTX0lGTVQpOwogCWlmIChmZCA8IDApCiAJCWVycm9yID0gZmQ7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZnMvaG9zdGZzL2hvc3Rmc191c2VyLmMgYi9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYwppbmRleCA5NzY1ZGFiLi45YzFlMGYwIDEwMDY0NAotLS0gYS9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYworKysgYi9mcy9ob3N0ZnMvaG9zdGZzX3VzZXIuYwpAQCAtOTcsMjEgKzk3LDI3IEBACiAJcmV0dXJuIGRpcjsKIH0KIAotY2hhciAqcmVhZF9kaXIodm9pZCAqc3RyZWFtLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBvcywKK3ZvaWQgc2Vla19kaXIodm9pZCAqc3RyZWFtLCB1bnNpZ25lZCBsb25nIGxvbmcgcG9zKQoreworCURJUiAqZGlyID0gc3RyZWFtOworCisJc2Vla2RpcihkaXIsIHBvcyk7Cit9CisKK2NoYXIgKnJlYWRfZGlyKHZvaWQgKnN0cmVhbSwgdW5zaWduZWQgbG9uZyBsb25nICpwb3Nfb3V0LAogCSAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgKmlub19vdXQsIGludCAqbGVuX291dCwKIAkgICAgICAgdW5zaWduZWQgaW50ICp0eXBlX291dCkKIHsKIAlESVIgKmRpciA9IHN0cmVhbTsKIAlzdHJ1Y3QgZGlyZW50ICplbnQ7CiAKLQlzZWVrZGlyKGRpciwgKnBvcyk7CiAJZW50ID0gcmVhZGRpcihkaXIpOwogCWlmIChlbnQgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJKmxlbl9vdXQgPSBzdHJsZW4oZW50LT5kX25hbWUpOwogCSppbm9fb3V0ID0gZW50LT5kX2lubzsKIAkqdHlwZV9vdXQgPSBlbnQtPmRfdHlwZTsKLQkqcG9zID0gdGVsbGRpcihkaXIpOworCSpwb3Nfb3V0ID0gZW50LT5kX29mZjsKIAlyZXR1cm4gZW50LT5kX25hbWU7CiB9CiAKQEAgLTE3NSwyMSArMTgxLDEwIEBACiAJY2xvc2VkaXIoc3RyZWFtKTsKIH0KIAotaW50IGZpbGVfY3JlYXRlKGNoYXIgKm5hbWUsIGludCB1ciwgaW50IHV3LCBpbnQgdXgsIGludCBnciwKLQkJaW50IGd3LCBpbnQgZ3gsIGludCBvciwgaW50IG93LCBpbnQgb3gpCitpbnQgZmlsZV9jcmVhdGUoY2hhciAqbmFtZSwgaW50IG1vZGUpCiB7Ci0JaW50IG1vZGUsIGZkOworCWludCBmZDsKIAotCW1vZGUgPSAwOwotCW1vZGUgfD0gdXIgPyBTX0lSVVNSIDogMDsKLQltb2RlIHw9IHV3ID8gU19JV1VTUiA6IDA7Ci0JbW9kZSB8PSB1eCA/IFNfSVhVU1IgOiAwOwotCW1vZGUgfD0gZ3IgPyBTX0lSR1JQIDogMDsKLQltb2RlIHw9IGd3ID8gU19JV0dSUCA6IDA7Ci0JbW9kZSB8PSBneCA/IFNfSVhHUlAgOiAwOwotCW1vZGUgfD0gb3IgPyBTX0lST1RIIDogMDsKLQltb2RlIHw9IG93ID8gU19JV09USCA6IDA7Ci0JbW9kZSB8PSBveCA/IFNfSVhPVEggOiAwOwogCWZkID0gb3BlbjY0KG5hbWUsIE9fQ1JFQVQgfCBPX1JEV1IsIG1vZGUpOwogCWlmIChmZCA8IDApCiAJCXJldHVybiAtZXJybm87CmRpZmYgLS1naXQgYS9mcy9ocGZzL2ZpbGUuYyBiL2ZzL2hwZnMvZmlsZS5jCmluZGV4IDdmNTRlNWYuLjZkOGNmZTkgMTAwNjQ0Ci0tLSBhL2ZzL2hwZnMvZmlsZS5jCisrKyBiL2ZzL2hwZnMvZmlsZS5jCkBAIC0xOTcsOSArMTk3LDcgQEAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaHBmc19maWxlX29wcyA9CiB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCiAJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCiAJLnJlbGVhc2UJPSBocGZzX2ZpbGVfcmVsZWFzZSwKZGlmZiAtLWdpdCBhL2ZzL2h1Z2V0bGJmcy9pbm9kZS5jIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKaW5kZXggYzI3NGFjYS4uMjY0MGQ4OCAxMDA2NDQKLS0tIGEvZnMvaHVnZXRsYmZzL2lub2RlLmMKKysrIGIvZnMvaHVnZXRsYmZzL2lub2RlLmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CiAjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIApAQCAtNDcsOSArNDgsMTAgQEAKIAlrdWlkX3QgICB1aWQ7CiAJa2dpZF90ICAgZ2lkOwogCXVtb2RlX3QgbW9kZTsKLQlsb25nCW5yX2Jsb2NrczsKKwlsb25nCW1heF9ocGFnZXM7CiAJbG9uZwlucl9pbm9kZXM7CiAJc3RydWN0IGhzdGF0ZSAqaHN0YXRlOworCWxvbmcgICAgbWluX2hwYWdlczsKIH07CiAKIHN0cnVjdCBodWdldGxiZnNfaW5vZGVfaW5mbyB7CkBAIC02Nyw3ICs2OSw3IEBACiBlbnVtIHsKIAlPcHRfc2l6ZSwgT3B0X25yX2lub2RlcywKIAlPcHRfbW9kZSwgT3B0X3VpZCwgT3B0X2dpZCwKLQlPcHRfcGFnZXNpemUsCisJT3B0X3BhZ2VzaXplLCBPcHRfbWluX3NpemUsCiAJT3B0X2VyciwKIH07CiAKQEAgLTc4LDYgKzgwLDcgQEAKIAl7T3B0X3VpZCwJInVpZD0ldSJ9LAogCXtPcHRfZ2lkLAkiZ2lkPSV1In0sCiAJe09wdF9wYWdlc2l6ZSwJInBhZ2VzaXplPSVzIn0sCisJe09wdF9taW5fc2l6ZSwJIm1pbl9zaXplPSVzIn0sCiAJe09wdF9lcnIsCU5VTEx9LAogfTsKIApAQCAtMTc5LDQyICsxODIsMzMgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW50CitzdGF0aWMgc2l6ZV90CiBodWdldGxiZnNfcmVhZF9hY3RvcihzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0JCQljaGFyIF9fdXNlciAqYnVmLCB1bnNpZ25lZCBsb25nIGNvdW50LAotCQkJdW5zaWduZWQgbG9uZyBzaXplKQorCQkJc3RydWN0IGlvdl9pdGVyICp0bywgdW5zaWduZWQgbG9uZyBzaXplKQogewotCWNoYXIgKmthZGRyOwotCXVuc2lnbmVkIGxvbmcgbGVmdCwgY29waWVkID0gMDsKKwlzaXplX3QgY29waWVkID0gMDsKIAlpbnQgaSwgY2h1bmtzaXplOwogCi0JaWYgKHNpemUgPiBjb3VudCkKLQkJc2l6ZSA9IGNvdW50OwotCiAJLyogRmluZCB3aGljaCA0ayBjaHVuayBhbmQgb2Zmc2V0IHdpdGggaW4gdGhhdCBjaHVuayAqLwogCWkgPSBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKIAlvZmZzZXQgPSBvZmZzZXQgJiB+UEFHRV9DQUNIRV9NQVNLOwogCiAJd2hpbGUgKHNpemUpIHsKKwkJc2l6ZV90IG47CiAJCWNodW5rc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAkJaWYgKG9mZnNldCkKIAkJCWNodW5rc2l6ZSAtPSBvZmZzZXQ7CiAJCWlmIChjaHVua3NpemUgPiBzaXplKQogCQkJY2h1bmtzaXplID0gc2l6ZTsKLQkJa2FkZHIgPSBrbWFwKCZwYWdlW2ldKTsKLQkJbGVmdCA9IF9fY29weV90b191c2VyKGJ1Ziwga2FkZHIgKyBvZmZzZXQsIGNodW5rc2l6ZSk7Ci0JCWt1bm1hcCgmcGFnZVtpXSk7Ci0JCWlmIChsZWZ0KSB7Ci0JCQljb3BpZWQgKz0gKGNodW5rc2l6ZSAtIGxlZnQpOwotCQkJYnJlYWs7Ci0JCX0KKwkJbiA9IGNvcHlfcGFnZV90b19pdGVyKCZwYWdlW2ldLCBvZmZzZXQsIGNodW5rc2l6ZSwgdG8pOworCQljb3BpZWQgKz0gbjsKKwkJaWYgKG4gIT0gY2h1bmtzaXplKQorCQkJcmV0dXJuIGNvcGllZDsKIAkJb2Zmc2V0ID0gMDsKIAkJc2l6ZSAtPSBjaHVua3NpemU7Ci0JCWJ1ZiArPSBjaHVua3NpemU7Ci0JCWNvcGllZCArPSBjaHVua3NpemU7CiAJCWkrKzsKIAl9Ci0JcmV0dXJuIGNvcGllZCA/IGNvcGllZCA6IC1FRkFVTFQ7CisJcmV0dXJuIGNvcGllZDsKIH0KIAogLyoKQEAgLTIyMiwzOSArMjE2LDM0IEBACiAgKiBkYXRhLiBJdHMgKnZlcnkqIHNpbWlsYXIgdG8gZG9fZ2VuZXJpY19tYXBwaW5nX3JlYWQoKSwgd2UgY2FuJ3QgdXNlIHRoYXQKICAqIHNpbmNlIGl0IGhhcyBQQUdFX0NBQ0hFX1NJWkUgYXNzdW1wdGlvbnMuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IGh1Z2V0bGJmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICAgICAgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQorc3RhdGljIHNzaXplX3QgaHVnZXRsYmZzX3JlYWRfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqdG8pCiB7Ci0Jc3RydWN0IGhzdGF0ZSAqaCA9IGhzdGF0ZV9maWxlKGZpbHApOwotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlscC0+Zl9tYXBwaW5nOworCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKKwlzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX2ZpbGUoZmlsZSk7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7Ci0JdW5zaWduZWQgbG9uZyBpbmRleCA9ICpwcG9zID4+IGh1Z2VfcGFnZV9zaGlmdChoKTsKLQl1bnNpZ25lZCBsb25nIG9mZnNldCA9ICpwcG9zICYgfmh1Z2VfcGFnZV9tYXNrKGgpOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBpb2NiLT5raV9wb3MgPj4gaHVnZV9wYWdlX3NoaWZ0KGgpOworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gaW9jYi0+a2lfcG9zICYgfmh1Z2VfcGFnZV9tYXNrKGgpOwogCXVuc2lnbmVkIGxvbmcgZW5kX2luZGV4OwogCWxvZmZfdCBpc2l6ZTsKIAlzc2l6ZV90IHJldHZhbCA9IDA7CiAKLQkvKiB2YWxpZGF0ZSBsZW5ndGggKi8KLQlpZiAobGVuID09IDApCi0JCWdvdG8gb3V0OwotCi0JZm9yICg7OykgeworCXdoaWxlIChpb3ZfaXRlcl9jb3VudCh0bykpIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JCXVuc2lnbmVkIGxvbmcgbnIsIHJldDsKLQkJaW50IHJhOworCQlzaXplX3QgbnIsIGNvcGllZDsKIAogCQkvKiBuciBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBmcm9tIHRoaXMgcGFnZSAqLwogCQluciA9IGh1Z2VfcGFnZV9zaXplKGgpOwogCQlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAkJaWYgKCFpc2l6ZSkKLQkJCWdvdG8gb3V0OworCQkJYnJlYWs7CiAJCWVuZF9pbmRleCA9IChpc2l6ZSAtIDEpID4+IGh1Z2VfcGFnZV9zaGlmdChoKTsKLQkJaWYgKGluZGV4ID49IGVuZF9pbmRleCkgewotCQkJaWYgKGluZGV4ID4gZW5kX2luZGV4KQotCQkJCWdvdG8gb3V0OworCQlpZiAoaW5kZXggPiBlbmRfaW5kZXgpCisJCQlicmVhazsKKwkJaWYgKGluZGV4ID09IGVuZF9pbmRleCkgewogCQkJbnIgPSAoKGlzaXplIC0gMSkgJiB+aHVnZV9wYWdlX21hc2soaCkpICsgMTsKIAkJCWlmIChuciA8PSBvZmZzZXQpCi0JCQkJZ290byBvdXQ7CisJCQkJYnJlYWs7CiAJCX0KIAkJbnIgPSBuciAtIG9mZnNldDsKIApAQCAtMjY1LDM5ICsyNTQsMjcgQEAKIAkJCSAqIFdlIGhhdmUgYSBIT0xFLCB6ZXJvIG91dCB0aGUgdXNlci1idWZmZXIgZm9yIHRoZQogCQkJICogbGVuZ3RoIG9mIHRoZSBob2xlIG9yIHJlcXVlc3QuCiAJCQkgKi8KLQkJCXJldCA9IGxlbiA8IG5yID8gbGVuIDogbnI7Ci0JCQlpZiAoY2xlYXJfdXNlcihidWYsIHJldCkpCi0JCQkJcmEgPSAtRUZBVUxUOwotCQkJZWxzZQotCQkJCXJhID0gMDsKKwkJCWNvcGllZCA9IGlvdl9pdGVyX3plcm8obnIsIHRvKTsKIAkJfSBlbHNlIHsKIAkJCXVubG9ja19wYWdlKHBhZ2UpOwogCiAJCQkvKgogCQkJICogV2UgaGF2ZSB0aGUgcGFnZSwgY29weSBpdCB0byB1c2VyIHNwYWNlIGJ1ZmZlci4KIAkJCSAqLwotCQkJcmEgPSBodWdldGxiZnNfcmVhZF9hY3RvcihwYWdlLCBvZmZzZXQsIGJ1ZiwgbGVuLCBucik7Ci0JCQlyZXQgPSByYTsKKwkJCWNvcGllZCA9IGh1Z2V0bGJmc19yZWFkX2FjdG9yKHBhZ2UsIG9mZnNldCwgdG8sIG5yKTsKIAkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJfQotCQlpZiAocmEgPCAwKSB7Ci0JCQlpZiAocmV0dmFsID09IDApCi0JCQkJcmV0dmFsID0gcmE7Ci0JCQlnb3RvIG91dDsKKwkJb2Zmc2V0ICs9IGNvcGllZDsKKwkJcmV0dmFsICs9IGNvcGllZDsKKwkJaWYgKGNvcGllZCAhPSBuciAmJiBpb3ZfaXRlcl9jb3VudCh0bykpIHsKKwkJCWlmICghcmV0dmFsKQorCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQlicmVhazsKIAkJfQotCi0JCW9mZnNldCArPSByZXQ7Ci0JCXJldHZhbCArPSByZXQ7Ci0JCWxlbiAtPSByZXQ7CiAJCWluZGV4ICs9IG9mZnNldCA+PiBodWdlX3BhZ2Vfc2hpZnQoaCk7CiAJCW9mZnNldCAmPSB+aHVnZV9wYWdlX21hc2soaCk7Ci0KLQkJLyogc2hvcnQgcmVhZCBvciBubyBtb3JlIHdvcmsgKi8KLQkJaWYgKChyZXQgIT0gbnIpIHx8IChsZW4gPT0gMCkpCi0JCQlicmVhazsKIAl9Ci1vdXQ6Ci0JKnBwb3MgPSAoKGxvZmZfdClpbmRleCA8PCBodWdlX3BhZ2Vfc2hpZnQoaCkpICsgb2Zmc2V0OworCWlvY2ItPmtpX3BvcyA9ICgobG9mZl90KWluZGV4IDw8IGh1Z2VfcGFnZV9zaGlmdChoKSkgKyBvZmZzZXQ7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMzE5LDcgKzI5Niw3IEBACiAKIHN0YXRpYyB2b2lkIHRydW5jYXRlX2h1Z2VfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQljYW5jZWxfZGlydHlfcGFnZShwYWdlLCAvKiBObyBJTyBhY2NvdW50aW5nIGZvciBodWdlIHBhZ2VzPyAqLzApOworCUNsZWFyUGFnZURpcnR5KHBhZ2UpOwogCUNsZWFyUGFnZVVwdG9kYXRlKHBhZ2UpOwogCWRlbGV0ZV9mcm9tX3BhZ2VfY2FjaGUocGFnZSk7CiB9CkBAIC03MjEsNyArNjk4LDcgQEAKIH0KIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBodWdldGxiZnNfZmlsZV9vcGVyYXRpb25zID0gewotCS5yZWFkCQkJPSBodWdldGxiZnNfcmVhZCwKKwkucmVhZF9pdGVyCQk9IGh1Z2V0bGJmc19yZWFkX2l0ZXIsCiAJLm1tYXAJCQk9IGh1Z2V0bGJmc19maWxlX21tYXAsCiAJLmZzeW5jCQkJPSBub29wX2ZzeW5jLAogCS5nZXRfdW5tYXBwZWRfYXJlYQk9IGh1Z2V0bGJfZ2V0X3VubWFwcGVkX2FyZWEsCkBAIC03NTQsMTQgKzczMSwzOCBAQAogCS5zaG93X29wdGlvbnMJPSBnZW5lcmljX3Nob3dfb3B0aW9ucywKIH07CiAKK2VudW0geyBOT19TSVpFLCBTSVpFX1NURCwgU0laRV9QRVJDRU5UIH07CisKKy8qCisgKiBDb252ZXJ0IHNpemUgb3B0aW9uIHBhc3NlZCBmcm9tIGNvbW1hbmQgbGluZSB0byBudW1iZXIgb2YgaHVnZSBwYWdlcworICogaW4gdGhlIHBvb2wgc3BlY2lmaWVkIGJ5IGhzdGF0ZS4gIFNpemUgb3B0aW9uIGNvdWxkIGJlIGluIGJ5dGVzCisgKiAodmFsX3R5cGUgPT0gU0laRV9TVEQpIG9yIHBlcmNlbnRhZ2Ugb2YgdGhlIHBvb2wgKHZhbF90eXBlID09IFNJWkVfUEVSQ0VOVCkuCisgKi8KK3N0YXRpYyBsb25nIGxvbmcKK2h1Z2V0bGJmc19zaXplX3RvX2hwYWdlcyhzdHJ1Y3QgaHN0YXRlICpoLCB1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZV9vcHQsCisJCQkJCQkJCWludCB2YWxfdHlwZSkKK3sKKwlpZiAodmFsX3R5cGUgPT0gTk9fU0laRSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHZhbF90eXBlID09IFNJWkVfUEVSQ0VOVCkgeworCQlzaXplX29wdCA8PD0gaHVnZV9wYWdlX3NoaWZ0KGgpOworCQlzaXplX29wdCAqPSBoLT5tYXhfaHVnZV9wYWdlczsKKwkJZG9fZGl2KHNpemVfb3B0LCAxMDApOworCX0KKworCXNpemVfb3B0ID4+PSBodWdlX3BhZ2Vfc2hpZnQoaCk7CisJcmV0dXJuIHNpemVfb3B0OworfQorCiBzdGF0aWMgaW50CiBodWdldGxiZnNfcGFyc2Vfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBzdHJ1Y3QgaHVnZXRsYmZzX2NvbmZpZyAqcGNvbmZpZykKIHsKIAljaGFyICpwLCAqcmVzdDsKIAlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CiAJaW50IG9wdGlvbjsKLQl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSA9IDA7Ci0JZW51bSB7IE5PX1NJWkUsIFNJWkVfU1RELCBTSVpFX1BFUkNFTlQgfSBzZXRzaXplID0gTk9fU0laRTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWF4X3NpemVfb3B0ID0gMCwgbWluX3NpemVfb3B0ID0gMDsKKwlpbnQgbWF4X3ZhbF90eXBlID0gTk9fU0laRSwgbWluX3ZhbF90eXBlID0gTk9fU0laRTsKIAogCWlmICghb3B0aW9ucykKIAkJcmV0dXJuIDA7CkBAIC03OTksMTAgKzgwMCwxMCBAQAogCQkJLyogbWVtcGFyc2UoKSB3aWxsIGFjY2VwdCBhIEsvTS9HIHdpdGhvdXQgYSBkaWdpdCAqLwogCQkJaWYgKCFpc2RpZ2l0KCphcmdzWzBdLmZyb20pKQogCQkJCWdvdG8gYmFkX3ZhbDsKLQkJCXNpemUgPSBtZW1wYXJzZShhcmdzWzBdLmZyb20sICZyZXN0KTsKLQkJCXNldHNpemUgPSBTSVpFX1NURDsKKwkJCW1heF9zaXplX29wdCA9IG1lbXBhcnNlKGFyZ3NbMF0uZnJvbSwgJnJlc3QpOworCQkJbWF4X3ZhbF90eXBlID0gU0laRV9TVEQ7CiAJCQlpZiAoKnJlc3QgPT0gJyUnKQotCQkJCXNldHNpemUgPSBTSVpFX1BFUkNFTlQ7CisJCQkJbWF4X3ZhbF90eXBlID0gU0laRV9QRVJDRU5UOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtODI1LDYgKzgyNiwxNyBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQljYXNlIE9wdF9taW5fc2l6ZTogeworCQkJLyogbWVtcGFyc2UoKSB3aWxsIGFjY2VwdCBhIEsvTS9HIHdpdGhvdXQgYSBkaWdpdCAqLworCQkJaWYgKCFpc2RpZ2l0KCphcmdzWzBdLmZyb20pKQorCQkJCWdvdG8gYmFkX3ZhbDsKKwkJCW1pbl9zaXplX29wdCA9IG1lbXBhcnNlKGFyZ3NbMF0uZnJvbSwgJnJlc3QpOworCQkJbWluX3ZhbF90eXBlID0gU0laRV9TVEQ7CisJCQlpZiAoKnJlc3QgPT0gJyUnKQorCQkJCW1pbl92YWxfdHlwZSA9IFNJWkVfUEVSQ0VOVDsKKwkJCWJyZWFrOworCQl9CisKIAkJZGVmYXVsdDoKIAkJCXByX2VycigiQmFkIG1vdW50IG9wdGlvbjogXCIlc1wiXG4iLCBwKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtODMyLDE1ICs4NDQsMjIgQEAKIAkJfQogCX0KIAotCS8qIERvIHNpemUgYWZ0ZXIgaHN0YXRlIGlzIHNldCB1cCAqLwotCWlmIChzZXRzaXplID4gTk9fU0laRSkgewotCQlzdHJ1Y3QgaHN0YXRlICpoID0gcGNvbmZpZy0+aHN0YXRlOwotCQlpZiAoc2V0c2l6ZSA9PSBTSVpFX1BFUkNFTlQpIHsKLQkJCXNpemUgPDw9IGh1Z2VfcGFnZV9zaGlmdChoKTsKLQkJCXNpemUgKj0gaC0+bWF4X2h1Z2VfcGFnZXM7Ci0JCQlkb19kaXYoc2l6ZSwgMTAwKTsKLQkJfQotCQlwY29uZmlnLT5ucl9ibG9ja3MgPSAoc2l6ZSA+PiBodWdlX3BhZ2Vfc2hpZnQoaCkpOworCS8qCisJICogVXNlIGh1Z2UgcGFnZSBwb29sIHNpemUgKGluIGhzdGF0ZSkgdG8gY29udmVydCB0aGUgc2l6ZQorCSAqIG9wdGlvbnMgdG8gbnVtYmVyIG9mIGh1Z2UgcGFnZXMuICBJZiBOT19TSVpFLCAtMSBpcyByZXR1cm5lZC4KKwkgKi8KKwlwY29uZmlnLT5tYXhfaHBhZ2VzID0gaHVnZXRsYmZzX3NpemVfdG9faHBhZ2VzKHBjb25maWctPmhzdGF0ZSwKKwkJCQkJCW1heF9zaXplX29wdCwgbWF4X3ZhbF90eXBlKTsKKwlwY29uZmlnLT5taW5faHBhZ2VzID0gaHVnZXRsYmZzX3NpemVfdG9faHBhZ2VzKHBjb25maWctPmhzdGF0ZSwKKwkJCQkJCW1pbl9zaXplX29wdCwgbWluX3ZhbF90eXBlKTsKKworCS8qCisJICogSWYgbWF4X3NpemUgd2FzIHNwZWNpZmllZCwgdGhlbiBtaW5fc2l6ZSBtdXN0IGJlIHNtYWxsZXIKKwkgKi8KKwlpZiAobWF4X3ZhbF90eXBlID4gTk9fU0laRSAmJgorCSAgICBwY29uZmlnLT5taW5faHBhZ2VzID4gcGNvbmZpZy0+bWF4X2hwYWdlcykgeworCQlwcl9lcnIoIm1pbmltdW0gc2l6ZSBjYW4gbm90IGJlIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIHNpemVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTg1OSwxMiArODc4LDEzIEBACiAKIAlzYXZlX21vdW50X29wdGlvbnMoc2IsIGRhdGEpOwogCi0JY29uZmlnLm5yX2Jsb2NrcyA9IC0xOyAvKiBObyBsaW1pdCBvbiBzaXplIGJ5IGRlZmF1bHQgKi8KKwljb25maWcubWF4X2hwYWdlcyA9IC0xOyAvKiBObyBsaW1pdCBvbiBzaXplIGJ5IGRlZmF1bHQgKi8KIAljb25maWcubnJfaW5vZGVzID0gLTE7IC8qIE5vIGxpbWl0IG9uIG51bWJlciBvZiBpbm9kZXMgYnkgZGVmYXVsdCAqLwogCWNvbmZpZy51aWQgPSBjdXJyZW50X2ZzdWlkKCk7CiAJY29uZmlnLmdpZCA9IGN1cnJlbnRfZnNnaWQoKTsKIAljb25maWcubW9kZSA9IDA3NTU7CiAJY29uZmlnLmhzdGF0ZSA9ICZkZWZhdWx0X2hzdGF0ZTsKKwljb25maWcubWluX2hwYWdlcyA9IC0xOyAvKiBObyBkZWZhdWx0IG1pbmltdW0gc2l6ZSAqLwogCXJldCA9IGh1Z2V0bGJmc19wYXJzZV9vcHRpb25zKGRhdGEsICZjb25maWcpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CkBAIC04NzgsOCArODk4LDE1IEBACiAJc2JpbmZvLT5tYXhfaW5vZGVzID0gY29uZmlnLm5yX2lub2RlczsKIAlzYmluZm8tPmZyZWVfaW5vZGVzID0gY29uZmlnLm5yX2lub2RlczsKIAlzYmluZm8tPnNwb29sID0gTlVMTDsKLQlpZiAoY29uZmlnLm5yX2Jsb2NrcyAhPSAtMSkgewotCQlzYmluZm8tPnNwb29sID0gaHVnZXBhZ2VfbmV3X3N1YnBvb2woY29uZmlnLm5yX2Jsb2Nrcyk7CisJLyoKKwkgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzdWJwb29sIGlmIG1heGltdW0gb3IgbWluaW11bSBzaXplIGlzCisJICogc3BlY2lmaWVkLiAgQW55IG5lZWRlZCByZXNlcnZhdGlvbnMgKGZvciBtaW5pbWltIHNpemUpIGFyZSB0YWtlbgorCSAqIHRha2VuIHdoZW4gdGhlIHN1YnBvb2wgaXMgY3JlYXRlZC4KKwkgKi8KKwlpZiAoY29uZmlnLm1heF9ocGFnZXMgIT0gLTEgfHwgY29uZmlnLm1pbl9ocGFnZXMgIT0gLTEpIHsKKwkJc2JpbmZvLT5zcG9vbCA9IGh1Z2VwYWdlX25ld19zdWJwb29sKGNvbmZpZy5oc3RhdGUsCisJCQkJCQkJY29uZmlnLm1heF9ocGFnZXMsCisJCQkJCQkJY29uZmlnLm1pbl9ocGFnZXMpOwogCQlpZiAoIXNiaW5mby0+c3Bvb2wpCiAJCQlnb3RvIG91dF9mcmVlOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2ZpbGUuYyBiL2ZzL2pmZnMyL2ZpbGUuYwppbmRleCA2NDk4OWNhLi5mNTA5ZjYyIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9maWxlLmMKKysrIGIvZnMvamZmczIvZmlsZS5jCkBAIC01MSw5ICs1MSw3IEBACiB7CiAJLmxsc2VlayA9CWdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLm9wZW4gPQkJZ2VuZXJpY19maWxlX29wZW4sCi0gCS5yZWFkID0JCW5ld19zeW5jX3JlYWQsCiAgCS5yZWFkX2l0ZXIgPQlnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAotIAkud3JpdGUgPQluZXdfc3luY193cml0ZSwKICAJLndyaXRlX2l0ZXIgPQlnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkudW5sb2NrZWRfaW9jdGw9amZmczJfaW9jdGwsCiAJLm1tYXAgPQkJZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAsCmRpZmYgLS1naXQgYS9mcy9qZmZzMi94YXR0ci5jIGIvZnMvamZmczIveGF0dHIuYwppbmRleCBkNzI4MTdhLi43NjJjN2EzIDEwMDY0NAotLS0gYS9mcy9qZmZzMi94YXR0ci5jCisrKyBiL2ZzL2pmZnMyL3hhdHRyLmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogCS8qIHVuY2hlY2tlZCB4ZGF0dW0gaXMgY2hhaW5lZCB3aXRoIGMtPnhhdHRyX3VuY2hlY2tlZCAqLwogCWxpc3RfZGVsX2luaXQoJnhkLT54aW5kZXgpOwogCi0JZGJnX3hhdHRyKCJzdWNjZXNzIG9uIHZlcmZ5aW5nIHhkYXR1bSAoeGlkPSV1LCB2ZXJzaW9uPSV1KVxuIiwKKwlkYmdfeGF0dHIoInN1Y2Nlc3Mgb24gdmVyaWZ5aW5nIHhkYXR1bSAoeGlkPSV1LCB2ZXJzaW9uPSV1KVxuIiwKIAkJICB4ZC0+eGlkLCB4ZC0+dmVyc2lvbik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL2pmcy9maWxlLmMgYi9mcy9qZnMvZmlsZS5jCmluZGV4IDEwODE1ZjguLmFlNDY3ODggMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9maWxlLmMKKysrIGIvZnMvamZzL2ZpbGUuYwpAQCAtMTUxLDggKzE1MSw2IEBACiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGpmc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLm9wZW4JCT0gamZzX29wZW4sCiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCmRpZmYgLS1naXQgYS9mcy9qZnMvaW5vZGUuYyBiL2ZzL2pmcy9pbm9kZS5jCmluZGV4IGJkM2RmMWMuLjMxOTdhZWQgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9pbm9kZS5jCisrKyBiL2ZzL2pmcy9pbm9kZS5jCkBAIC0yMiw4ICsyMiw4IEBACiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcXVvdGFvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlICJqZnNfaW5jb3JlLmgiCiAjaW5jbHVkZSAiamZzX2lub2RlLmgiCiAjaW5jbHVkZSAiamZzX2ZpbHN5cy5oIgpkaWZmIC0tZ2l0IGEvZnMvamZzL2pmc19tZXRhcGFnZS5jIGIvZnMvamZzL2pmc19tZXRhcGFnZS5jCmluZGV4IDQ5YmE3ZmYuLjE2YTA5MjIgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuYworKysgYi9mcy9qZnMvamZzX21ldGFwYWdlLmMKQEAgLTE4MywzMCArMTgzLDIzIEBACiAKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vKQotewotCXN0cnVjdCBtZXRhcGFnZSAqbXAgPSAoc3RydWN0IG1ldGFwYWdlICopZm9vOwotCi0JbXAtPmxpZCA9IDA7Ci0JbXAtPmxzbiA9IDA7Ci0JbXAtPmZsYWcgPSAwOwotCW1wLT5kYXRhID0gTlVMTDsKLQltcC0+Y2xzbiA9IDA7Ci0JbXAtPmxvZyA9IE5VTEw7Ci0Jc2V0X2JpdChNRVRBX2ZyZWUsICZtcC0+ZmxhZyk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmbXAtPndhaXQpOwotfQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtZXRhcGFnZSAqYWxsb2NfbWV0YXBhZ2UoZ2ZwX3QgZ2ZwX21hc2spCiB7Ci0JcmV0dXJuIG1lbXBvb2xfYWxsb2MobWV0YXBhZ2VfbWVtcG9vbCwgZ2ZwX21hc2spOworCXN0cnVjdCBtZXRhcGFnZSAqbXAgPSBtZW1wb29sX2FsbG9jKG1ldGFwYWdlX21lbXBvb2wsIGdmcF9tYXNrKTsKKworCWlmIChtcCkgeworCQltcC0+bGlkID0gMDsKKwkJbXAtPmxzbiA9IDA7CisJCW1wLT5kYXRhID0gTlVMTDsKKwkJbXAtPmNsc24gPSAwOworCQltcC0+bG9nID0gTlVMTDsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmbXAtPndhaXQpOworCX0KKwlyZXR1cm4gbXA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX21ldGFwYWdlKHN0cnVjdCBtZXRhcGFnZSAqbXApCiB7Ci0JbXAtPmZsYWcgPSAwOwotCXNldF9iaXQoTUVUQV9mcmVlLCAmbXAtPmZsYWcpOwotCiAJbWVtcG9vbF9mcmVlKG1wLCBtZXRhcGFnZV9tZW1wb29sKTsKIH0KIApAQCAtMjE2LDcgKzIwOSw3IEBACiAJICogQWxsb2NhdGUgdGhlIG1ldGFwYWdlIHN0cnVjdHVyZXMKIAkgKi8KIAltZXRhcGFnZV9jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJqZnNfbXAiLCBzaXplb2Yoc3RydWN0IG1ldGFwYWdlKSwKLQkJCQkJICAgMCwgMCwgaW5pdF9vbmNlKTsKKwkJCQkJICAgMCwgMCwgTlVMTCk7CiAJaWYgKG1ldGFwYWdlX2NhY2hlID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9mcy9qZnMvamZzX21ldGFwYWdlLmggYi9mcy9qZnMvamZzX21ldGFwYWdlLmgKaW5kZXggYTc4YmVkYS4uMzM3ZTllNSAxMDA2NDQKLS0tIGEvZnMvamZzL2pmc19tZXRhcGFnZS5oCisrKyBiL2ZzL2pmcy9qZnNfbWV0YXBhZ2UuaApAQCAtNDgsNyArNDgsNiBAQAogCiAvKiBtZXRhcGFnZSBmbGFnICovCiAjZGVmaW5lIE1FVEFfbG9ja2VkCTAKLSNkZWZpbmUgTUVUQV9mcmVlCTEKICNkZWZpbmUgTUVUQV9kaXJ0eQkyCiAjZGVmaW5lIE1FVEFfc3luYwkzCiAjZGVmaW5lIE1FVEFfZGlzY2FyZAk0CmRpZmYgLS1naXQgYS9mcy9qZnMvc3VwZXIuYyBiL2ZzL2pmcy9zdXBlci5jCmluZGV4IDVkMzBjNTYuLjRjZDk3OTggMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9zdXBlci5jCisrKyBiL2ZzL2pmcy9zdXBlci5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAl2YWYuZm10ID0gZm10OwogCXZhZi52YSA9ICZhcmdzOwogCi0JcHJfZXJyKCJFUlJPUjogKGRldmljZSAlcyk6ICVwZjogJXBWXG4iLAorCXByX2VycigiRVJST1I6IChkZXZpY2UgJXMpOiAlcHM6ICVwVlxuIiwKIAkgICAgICAgc2ItPnNfaWQsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSwgJnZhZik7CiAKIAl2YV9lbmQoYXJncyk7CmRpZmYgLS1naXQgYS9mcy9rZXJuZnMvZmlsZS5jIGIvZnMva2VybmZzL2ZpbGUuYwppbmRleCBiNjg0ZThhLi4yYmFjYjk5IDEwMDY0NAotLS0gYS9mcy9rZXJuZnMvZmlsZS5jCisrKyBiL2ZzL2tlcm5mcy9maWxlLmMKQEAgLTIwNyw2ICsyMDcsNyBAQAogCQlnb3RvIG91dF9mcmVlOwogCX0KIAorCW9mLT5ldmVudCA9IGF0b21pY19yZWFkKCZvZi0+a24tPmF0dHIub3Blbi0+ZXZlbnQpOwogCW9wcyA9IGtlcm5mc19vcHMob2YtPmtuKTsKIAlpZiAob3BzLT5yZWFkKQogCQlsZW4gPSBvcHMtPnJlYWQob2YsIGJ1ZiwgbGVuLCAqcHBvcyk7CmRpZmYgLS1naXQgYS9mcy9sb2Nrcy5jIGIvZnMvbG9ja3MuYwppbmRleCA1MjhmZWRmLi41MmI3ODBmIDEwMDY0NAotLS0gYS9mcy9sb2Nrcy5jCisrKyBiL2ZzL2xvY2tzLmMKQEAgLTIwMywxMSArMjAzLDExIEBACiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmZpbGVsb2NrX2NhY2hlIF9fcmVhZF9tb3N0bHk7CiAKIHN0YXRpYyBzdHJ1Y3QgZmlsZV9sb2NrX2NvbnRleHQgKgotbG9ja3NfZ2V0X2xvY2tfY29udGV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlKQorbG9ja3NfZ2V0X2xvY2tfY29udGV4dChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAlzdHJ1Y3QgZmlsZV9sb2NrX2NvbnRleHQgKm5ldzsKIAotCWlmIChsaWtlbHkoaW5vZGUtPmlfZmxjdHgpKQorCWlmIChsaWtlbHkoaW5vZGUtPmlfZmxjdHgpIHx8IHR5cGUgPT0gRl9VTkxDSykKIAkJZ290byBvdXQ7CiAKIAluZXcgPSBrbWVtX2NhY2hlX2FsbG9jKGZsY3R4X2NhY2hlLCBHRlBfS0VSTkVMKTsKQEAgLTIyMywxNCArMjIzLDcgQEAKIAkgKiBBc3NpZ24gdGhlIHBvaW50ZXIgaWYgaXQncyBub3QgYWxyZWFkeSBhc3NpZ25lZC4gSWYgaXQgaXMsIHRoZW4KIAkgKiBmcmVlIHRoZSBjb250ZXh0IHdlIGp1c3QgYWxsb2NhdGVkLgogCSAqLwotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0JaWYgKGxpa2VseSghaW5vZGUtPmlfZmxjdHgpKSB7Ci0JCWlub2RlLT5pX2ZsY3R4ID0gbmV3OwotCQluZXcgPSBOVUxMOwotCX0KLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7Ci0KLQlpZiAobmV3KQorCWlmIChjbXB4Y2hnKCZpbm9kZS0+aV9mbGN0eCwgTlVMTCwgbmV3KSkKIAkJa21lbV9jYWNoZV9mcmVlKGZsY3R4X2NhY2hlLCBuZXcpOwogb3V0OgogCXJldHVybiBpbm9kZS0+aV9mbGN0eDsKQEAgLTI3Niw4ICsyNjksMTAgQEAKIAl9CiAKIAlpZiAoZmwtPmZsX2xtb3BzKSB7Ci0JCWlmIChmbC0+ZmxfbG1vcHMtPmxtX3B1dF9vd25lcikKLQkJCWZsLT5mbF9sbW9wcy0+bG1fcHV0X293bmVyKGZsKTsKKwkJaWYgKGZsLT5mbF9sbW9wcy0+bG1fcHV0X293bmVyKSB7CisJCQlmbC0+ZmxfbG1vcHMtPmxtX3B1dF9vd25lcihmbC0+Zmxfb3duZXIpOworCQkJZmwtPmZsX293bmVyID0gTlVMTDsKKwkJfQogCQlmbC0+ZmxfbG1vcHMgPSBOVUxMOwogCX0KIH0KQEAgLTMzMyw3ICszMjgsNyBAQAogCiAJaWYgKGZsLT5mbF9sbW9wcykgewogCQlpZiAoZmwtPmZsX2xtb3BzLT5sbV9nZXRfb3duZXIpCi0JCQlmbC0+ZmxfbG1vcHMtPmxtX2dldF9vd25lcihuZXcsIGZsKTsKKwkJCWZsLT5mbF9sbW9wcy0+bG1fZ2V0X293bmVyKGZsLT5mbF9vd25lcik7CiAJfQogfQogRVhQT1JUX1NZTUJPTChsb2Nrc19jb3B5X2NvbmZsb2NrKTsKQEAgLTU5MiwxMSArNTg3LDE1IEBACiAKIHN0YXRpYyB2b2lkIGxvY2tzX2luc2VydF9nbG9iYWxfYmxvY2tlZChzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIpCiB7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYmxvY2tlZF9sb2NrX2xvY2spOworCiAJaGFzaF9hZGQoYmxvY2tlZF9oYXNoLCAmd2FpdGVyLT5mbF9saW5rLCBwb3NpeF9vd25lcl9rZXkod2FpdGVyKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGxvY2tzX2RlbGV0ZV9nbG9iYWxfYmxvY2tlZChzdHJ1Y3QgZmlsZV9sb2NrICp3YWl0ZXIpCiB7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmYmxvY2tlZF9sb2NrX2xvY2spOworCiAJaGFzaF9kZWwoJndhaXRlci0+ZmxfbGluayk7CiB9CiAKQEAgLTczMCw3ICs3MjksNyBAQAogCS8qIFBPU0lYIGxvY2tzIG93bmVkIGJ5IHRoZSBzYW1lIHByb2Nlc3MgZG8gbm90IGNvbmZsaWN0IHdpdGgKIAkgKiBlYWNoIG90aGVyLgogCSAqLwotCWlmICghSVNfUE9TSVgoc3lzX2ZsKSB8fCBwb3NpeF9zYW1lX293bmVyKGNhbGxlcl9mbCwgc3lzX2ZsKSkKKwlpZiAocG9zaXhfc2FtZV9vd25lcihjYWxsZXJfZmwsIHN5c19mbCkpCiAJCXJldHVybiAoMCk7CiAKIAkvKiBDaGVjayB3aGV0aGVyIHRoZXkgb3ZlcmxhcCAqLwpAQCAtNzQ4LDcgKzc0Nyw3IEBACiAJLyogRkxPQ0sgbG9ja3MgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIGZpbHAgZG8gbm90IGNvbmZsaWN0IHdpdGgKIAkgKiBlYWNoIG90aGVyLgogCSAqLwotCWlmICghSVNfRkxPQ0soc3lzX2ZsKSB8fCAoY2FsbGVyX2ZsLT5mbF9maWxlID09IHN5c19mbC0+ZmxfZmlsZSkpCisJaWYgKGNhbGxlcl9mbC0+ZmxfZmlsZSA9PSBzeXNfZmwtPmZsX2ZpbGUpCiAJCXJldHVybiAoMCk7CiAJaWYgKChjYWxsZXJfZmwtPmZsX3R5cGUgJiBMT0NLX01BTkQpIHx8IChzeXNfZmwtPmZsX3R5cGUgJiBMT0NLX01BTkQpKQogCQlyZXR1cm4gMDsKQEAgLTgzOCw2ICs4MzcsOCBAQAogewogCWludCBpID0gMDsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmJsb2NrZWRfbG9ja19sb2NrKTsKKwogCS8qCiAJICogVGhpcyBkZWFkbG9jayBkZXRlY3RvciBjYW4ndCByZWFzb25hYmx5IGRldGVjdCBkZWFkbG9ja3Mgd2l0aAogCSAqIEZMX09GRExDSyBsb2Nrcywgc2luY2UgdGhleSBhcmVuJ3Qgb3duZWQgYnkgYSBwcm9jZXNzLCBwZXItc2UuCkBAIC04NzEsOSArODcyLDEyIEBACiAJYm9vbCBmb3VuZCA9IGZhbHNlOwogCUxJU1RfSEVBRChkaXNwb3NlKTsKIAotCWN0eCA9IGxvY2tzX2dldF9sb2NrX2NvbnRleHQoaW5vZGUpOwotCWlmICghY3R4KQotCQlyZXR1cm4gLUVOT01FTTsKKwljdHggPSBsb2Nrc19nZXRfbG9ja19jb250ZXh0KGlub2RlLCByZXF1ZXN0LT5mbF90eXBlKTsKKwlpZiAoIWN0eCkgeworCQlpZiAocmVxdWVzdC0+ZmxfdHlwZSAhPSBGX1VOTENLKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiAocmVxdWVzdC0+ZmxfZmxhZ3MgJiBGTF9FWElTVFMpID8gLUVOT0VOVCA6IDA7CisJfQogCiAJaWYgKCEocmVxdWVzdC0+ZmxfZmxhZ3MgJiBGTF9BQ0NFU1MpICYmIChyZXF1ZXN0LT5mbF90eXBlICE9IEZfVU5MQ0spKSB7CiAJCW5ld19mbCA9IGxvY2tzX2FsbG9jX2xvY2soKTsKQEAgLTkzOSw5ICs5NDMsOSBAQAogCWJvb2wgYWRkZWQgPSBmYWxzZTsKIAlMSVNUX0hFQUQoZGlzcG9zZSk7CiAKLQljdHggPSBsb2Nrc19nZXRfbG9ja19jb250ZXh0KGlub2RlKTsKKwljdHggPSBsb2Nrc19nZXRfbG9ja19jb250ZXh0KGlub2RlLCByZXF1ZXN0LT5mbF90eXBlKTsKIAlpZiAoIWN0eCkKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiAocmVxdWVzdC0+ZmxfdHlwZSA9PSBGX1VOTENLKSA/IDAgOiAtRU5PTUVNOwogCiAJLyoKIAkgKiBXZSBtYXkgbmVlZCB0d28gZmlsZV9sb2NrIHN0cnVjdHVyZXMgZm9yIHRoaXMgb3BlcmF0aW9uLApAQCAtOTY0LDggKzk2OCw2IEBACiAJICovCiAJaWYgKHJlcXVlc3QtPmZsX3R5cGUgIT0gRl9VTkxDSykgewogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZsLCAmY3R4LT5mbGNfcG9zaXgsIGZsX2xpc3QpIHsKLQkJCWlmICghSVNfUE9TSVgoZmwpKQotCQkJCWNvbnRpbnVlOwogCQkJaWYgKCFwb3NpeF9sb2Nrc19jb25mbGljdChyZXF1ZXN0LCBmbCkpCiAJCQkJY29udGludWU7CiAJCQlpZiAoY29uZmxvY2spCkBAIC0xMzg4LDkgKzEzOTAsOCBAQAogaW50IF9fYnJlYWtfbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgdW5zaWduZWQgaW50IG1vZGUsIHVuc2lnbmVkIGludCB0eXBlKQogewogCWludCBlcnJvciA9IDA7Ci0Jc3RydWN0IGZpbGVfbG9jayAqbmV3X2ZsOwogCXN0cnVjdCBmaWxlX2xvY2tfY29udGV4dCAqY3R4ID0gaW5vZGUtPmlfZmxjdHg7Ci0Jc3RydWN0IGZpbGVfbG9jayAqZmw7CisJc3RydWN0IGZpbGVfbG9jayAqbmV3X2ZsLCAqZmwsICp0bXA7CiAJdW5zaWduZWQgbG9uZyBicmVha190aW1lOwogCWludCB3YW50X3dyaXRlID0gKG1vZGUgJiBPX0FDQ01PREUpICE9IE9fUkRPTkxZOwogCUxJU1RfSEVBRChkaXNwb3NlKTsKQEAgLTE0MjAsNyArMTQyMSw3IEBACiAJCQlicmVha190aW1lKys7CS8qIHNvIHRoYXQgMCBtZWFucyBubyBicmVhayB0aW1lICovCiAJfQogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShmbCwgJmN0eC0+ZmxjX2xlYXNlLCBmbF9saXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZsLCB0bXAsICZjdHgtPmZsY19sZWFzZSwgZmxfbGlzdCkgewogCQlpZiAoIWxlYXNlc19jb25mbGljdChmbCwgbmV3X2ZsKSkKIAkJCWNvbnRpbnVlOwogCQlpZiAod2FudF93cml0ZSkgewpAQCAtMTYwNiw3ICsxNjA3LDggQEAKIAlsZWFzZSA9ICpmbHA7CiAJdHJhY2VfZ2VuZXJpY19hZGRfbGVhc2UoaW5vZGUsIGxlYXNlKTsKIAotCWN0eCA9IGxvY2tzX2dldF9sb2NrX2NvbnRleHQoaW5vZGUpOworCS8qIE5vdGUgdGhhdCBhcmcgaXMgbmV2ZXIgRl9VTkxDSyBoZXJlICovCisJY3R4ID0gbG9ja3NfZ2V0X2xvY2tfY29udGV4dChpbm9kZSwgYXJnKTsKIAlpZiAoIWN0eCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTI1NTYsMTUgKzI1NTgsMTAgQEAKIAkJCSAgICAgICA6IChmbC0+ZmxfdHlwZSA9PSBGX1dSTENLKSA/ICJXUklURSIgOiAiUkVBRCAiKTsKIAl9CiAJaWYgKGlub2RlKSB7Ci0jaWZkZWYgV0VfQ0FOX0JSRUFLX0xTTEtfTk9XCi0JCXNlcV9wcmludGYoZiwgIiVkICVzOiVsZCAiLCBmbF9waWQsCi0JCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubyk7Ci0jZWxzZQotCQkvKiB1c2Vyc3BhY2UgcmVsaWVzIG9uIHRoaXMgcmVwcmVzZW50YXRpb24gb2YgZGV2X3QgOy0oICovCisJCS8qIHVzZXJzcGFjZSByZWxpZXMgb24gdGhpcyByZXByZXNlbnRhdGlvbiBvZiBkZXZfdCAqLwogCQlzZXFfcHJpbnRmKGYsICIlZCAlMDJ4OiUwMng6JWxkICIsIGZsX3BpZCwKIAkJCQlNQUpPUihpbm9kZS0+aV9zYi0+c19kZXYpLAogCQkJCU1JTk9SKGlub2RlLT5pX3NiLT5zX2RldiksIGlub2RlLT5pX2lubyk7Ci0jZW5kaWYKIAl9IGVsc2UgewogCQlzZXFfcHJpbnRmKGYsICIlZCA8bm9uZT46MCAiLCBmbF9waWQpOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2xvZ2ZzL2ZpbGUuYyBiL2ZzL2xvZ2ZzL2ZpbGUuYwppbmRleCA4NTM4NzUyLi5iMmMxM2Y3IDEwMDY0NAotLS0gYS9mcy9sb2dmcy9maWxlLmMKKysrIGIvZnMvbG9nZnMvZmlsZS5jCkBAIC0yNzEsOCArMjcxLDYgQEAKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX3JlYWRvbmx5X21tYXAsCiAJLm9wZW4JCT0gZ2VuZXJpY19maWxlX29wZW4sCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiB9OwogCiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGxvZ2ZzX3JlZ19hb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMvbWluaXgvZmlsZS5jIGIvZnMvbWluaXgvZmlsZS5jCmluZGV4IGE5NjdkZTAuLjZkNjNlMjcgMTAwNjQ0Ci0tLSBhL2ZzL21pbml4L2ZpbGUuYworKysgYi9mcy9taW5peC9maWxlLmMKQEAgLTE0LDkgKzE0LDcgQEAKICAqLwogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtaW5peF9maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCiAJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCiAJLmZzeW5jCQk9IGdlbmVyaWNfZmlsZV9mc3luYywKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IGM4MzE0NWEuLjc2ZmI3NmEgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMTE5LDE1ICsxMTksMTQgQEAKICAqIFBBVEhfTUFYIGluY2x1ZGVzIHRoZSBudWwgdGVybWluYXRvciAtLVJSLgogICovCiAKLSNkZWZpbmUgRU1CRURERURfTkFNRV9NQVgJKFBBVEhfTUFYIC0gc2l6ZW9mKHN0cnVjdCBmaWxlbmFtZSkpCisjZGVmaW5lIEVNQkVEREVEX05BTUVfTUFYCShQQVRIX01BWCAtIG9mZnNldG9mKHN0cnVjdCBmaWxlbmFtZSwgaW5hbWUpKQogCiBzdHJ1Y3QgZmlsZW5hbWUgKgogZ2V0bmFtZV9mbGFncyhjb25zdCBjaGFyIF9fdXNlciAqZmlsZW5hbWUsIGludCBmbGFncywgaW50ICplbXB0eSkKIHsKLQlzdHJ1Y3QgZmlsZW5hbWUgKnJlc3VsdCwgKmVycjsKLQlpbnQgbGVuOwotCWxvbmcgbWF4OworCXN0cnVjdCBmaWxlbmFtZSAqcmVzdWx0OwogCWNoYXIgKmtuYW1lOworCWludCBsZW47CiAKIAlyZXN1bHQgPSBhdWRpdF9yZXVzZW5hbWUoZmlsZW5hbWUpOwogCWlmIChyZXN1bHQpCkBAIC0xMzYsMjIgKzEzNSwxOCBAQAogCXJlc3VsdCA9IF9fZ2V0bmFtZSgpOwogCWlmICh1bmxpa2VseSghcmVzdWx0KSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JcmVzdWx0LT5yZWZjbnQgPSAxOwogCiAJLyoKIAkgKiBGaXJzdCwgdHJ5IHRvIGVtYmVkIHRoZSBzdHJ1Y3QgZmlsZW5hbWUgaW5zaWRlIHRoZSBuYW1lc19jYWNoZQogCSAqIGFsbG9jYXRpb24KIAkgKi8KLQlrbmFtZSA9IChjaGFyICopcmVzdWx0ICsgc2l6ZW9mKCpyZXN1bHQpOworCWtuYW1lID0gKGNoYXIgKilyZXN1bHQtPmluYW1lOwogCXJlc3VsdC0+bmFtZSA9IGtuYW1lOwotCXJlc3VsdC0+c2VwYXJhdGUgPSBmYWxzZTsKLQltYXggPSBFTUJFRERFRF9OQU1FX01BWDsKIAotcmVjb3B5OgotCWxlbiA9IHN0cm5jcHlfZnJvbV91c2VyKGtuYW1lLCBmaWxlbmFtZSwgbWF4KTsKKwlsZW4gPSBzdHJuY3B5X2Zyb21fdXNlcihrbmFtZSwgZmlsZW5hbWUsIEVNQkVEREVEX05BTUVfTUFYKTsKIAlpZiAodW5saWtlbHkobGVuIDwgMCkpIHsKLQkJZXJyID0gRVJSX1BUUihsZW4pOwotCQlnb3RvIGVycm9yOworCQlfX3B1dG5hbWUocmVzdWx0KTsKKwkJcmV0dXJuIEVSUl9QVFIobGVuKTsKIAl9CiAKIAkvKgpAQCAtMTYwLDQzICsxNTUsNDkgQEAKIAkgKiBuYW1lc19jYWNoZSBhbGxvY2F0aW9uIGZvciB0aGUgcGF0aG5hbWUsIGFuZCByZS1kbyB0aGUgY29weSBmcm9tCiAJICogdXNlcmxhbmQuCiAJICovCi0JaWYgKGxlbiA9PSBFTUJFRERFRF9OQU1FX01BWCAmJiBtYXggPT0gRU1CRURERURfTkFNRV9NQVgpIHsKKwlpZiAodW5saWtlbHkobGVuID09IEVNQkVEREVEX05BTUVfTUFYKSkgeworCQljb25zdCBzaXplX3Qgc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBmaWxlbmFtZSwgaW5hbWVbMV0pOwogCQlrbmFtZSA9IChjaGFyICopcmVzdWx0OwogCi0JCXJlc3VsdCA9IGt6YWxsb2Moc2l6ZW9mKCpyZXN1bHQpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFyZXN1bHQpIHsKLQkJCWVyciA9IEVSUl9QVFIoLUVOT01FTSk7Ci0JCQlyZXN1bHQgPSAoc3RydWN0IGZpbGVuYW1lICopa25hbWU7Ci0JCQlnb3RvIGVycm9yOworCQkvKgorCQkgKiBzaXplIGlzIGNob3NlbiB0aGF0IHdheSB3ZSB0byBndWFyYW50ZWUgdGhhdAorCQkgKiByZXN1bHQtPmluYW1lWzBdIGlzIHdpdGhpbiB0aGUgc2FtZSBvYmplY3QgYW5kIHRoYXQKKwkJICoga25hbWUgY2FuJ3QgYmUgZXF1YWwgdG8gcmVzdWx0LT5pbmFtZSwgbm8gbWF0dGVyIHdoYXQuCisJCSAqLworCQlyZXN1bHQgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAodW5saWtlbHkoIXJlc3VsdCkpIHsKKwkJCV9fcHV0bmFtZShrbmFtZSk7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAkJfQogCQlyZXN1bHQtPm5hbWUgPSBrbmFtZTsKLQkJcmVzdWx0LT5zZXBhcmF0ZSA9IHRydWU7Ci0JCXJlc3VsdC0+cmVmY250ID0gMTsKLQkJbWF4ID0gUEFUSF9NQVg7Ci0JCWdvdG8gcmVjb3B5OworCQlsZW4gPSBzdHJuY3B5X2Zyb21fdXNlcihrbmFtZSwgZmlsZW5hbWUsIFBBVEhfTUFYKTsKKwkJaWYgKHVubGlrZWx5KGxlbiA8IDApKSB7CisJCQlfX3B1dG5hbWUoa25hbWUpOworCQkJa2ZyZWUocmVzdWx0KTsKKwkJCXJldHVybiBFUlJfUFRSKGxlbik7CisJCX0KKwkJaWYgKHVubGlrZWx5KGxlbiA9PSBQQVRIX01BWCkpIHsKKwkJCV9fcHV0bmFtZShrbmFtZSk7CisJCQlrZnJlZShyZXN1bHQpOworCQkJcmV0dXJuIEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7CisJCX0KIAl9CiAKKwlyZXN1bHQtPnJlZmNudCA9IDE7CiAJLyogVGhlIGVtcHR5IHBhdGggaXMgc3BlY2lhbC4gKi8KIAlpZiAodW5saWtlbHkoIWxlbikpIHsKIAkJaWYgKGVtcHR5KQogCQkJKmVtcHR5ID0gMTsKLQkJZXJyID0gRVJSX1BUUigtRU5PRU5UKTsKLQkJaWYgKCEoZmxhZ3MgJiBMT09LVVBfRU1QVFkpKQotCQkJZ290byBlcnJvcjsKKwkJaWYgKCEoZmxhZ3MgJiBMT09LVVBfRU1QVFkpKSB7CisJCQlwdXRuYW1lKHJlc3VsdCk7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwkJfQogCX0KIAotCWVyciA9IEVSUl9QVFIoLUVOQU1FVE9PTE9ORyk7Ci0JaWYgKHVubGlrZWx5KGxlbiA+PSBQQVRIX01BWCkpCi0JCWdvdG8gZXJyb3I7Ci0KIAlyZXN1bHQtPnVwdHIgPSBmaWxlbmFtZTsKIAlyZXN1bHQtPmFuYW1lID0gTlVMTDsKIAlhdWRpdF9nZXRuYW1lKHJlc3VsdCk7CiAJcmV0dXJuIHJlc3VsdDsKLQotZXJyb3I6Ci0JcHV0bmFtZShyZXN1bHQpOwotCXJldHVybiBlcnI7CiB9CiAKIHN0cnVjdCBmaWxlbmFtZSAqCkBAIC0yMTYsOCArMjE3LDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKIAlpZiAobGVuIDw9IEVNQkVEREVEX05BTUVfTUFYKSB7Ci0JCXJlc3VsdC0+bmFtZSA9IChjaGFyICopKHJlc3VsdCkgKyBzaXplb2YoKnJlc3VsdCk7Ci0JCXJlc3VsdC0+c2VwYXJhdGUgPSBmYWxzZTsKKwkJcmVzdWx0LT5uYW1lID0gKGNoYXIgKilyZXN1bHQtPmluYW1lOwogCX0gZWxzZSBpZiAobGVuIDw9IFBBVEhfTUFYKSB7CiAJCXN0cnVjdCBmaWxlbmFtZSAqdG1wOwogCkBAIC0yMjcsNyArMjI3LDYgQEAKIAkJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCQl9CiAJCXRtcC0+bmFtZSA9IChjaGFyICopcmVzdWx0OwotCQl0bXAtPnNlcGFyYXRlID0gdHJ1ZTsKIAkJcmVzdWx0ID0gdG1wOwogCX0gZWxzZSB7CiAJCV9fcHV0bmFtZShyZXN1bHQpOwpAQCAtMjQ5LDcgKzI0OCw3IEBACiAJaWYgKC0tbmFtZS0+cmVmY250ID4gMCkKIAkJcmV0dXJuOwogCi0JaWYgKG5hbWUtPnNlcGFyYXRlKSB7CisJaWYgKG5hbWUtPm5hbWUgIT0gbmFtZS0+aW5hbWUpIHsKIAkJX19wdXRuYW1lKG5hbWUtPm5hbWUpOwogCQlrZnJlZShuYW1lKTsKIAl9IGVsc2UKQEAgLTE4NTEsMTAgKzE4NTAsMTEgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHBhdGhfaW5pdChpbnQgZGZkLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCitzdGF0aWMgaW50IHBhdGhfaW5pdChpbnQgZGZkLCBjb25zdCBzdHJ1Y3QgZmlsZW5hbWUgKm5hbWUsIHVuc2lnbmVkIGludCBmbGFncywKIAkJICAgICBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKIAlpbnQgcmV0dmFsID0gMDsKKwljb25zdCBjaGFyICpzID0gbmFtZS0+bmFtZTsKIAogCW5kLT5sYXN0X3R5cGUgPSBMQVNUX1JPT1Q7IC8qIGlmIHRoZXJlIGFyZSBvbmx5IHNsYXNoZXMuLi4gKi8KIAluZC0+ZmxhZ3MgPSBmbGFncyB8IExPT0tVUF9KVU1QRUQgfCBMT09LVVBfUEFSRU5UOwpAQCAtMTg2Myw3ICsxODYzLDcgQEAKIAlpZiAoZmxhZ3MgJiBMT09LVVBfUk9PVCkgewogCQlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gbmQtPnJvb3QuZGVudHJ5OwogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcm9vdC0+ZF9pbm9kZTsKLQkJaWYgKCpuYW1lKSB7CisJCWlmICgqcykgewogCQkJaWYgKCFkX2Nhbl9sb29rdXAocm9vdCkpCiAJCQkJcmV0dXJuIC1FTk9URElSOwogCQkJcmV0dmFsID0gaW5vZGVfcGVybWlzc2lvbihpbm9kZSwgTUFZX0VYRUMpOwpAQCAtMTg4NSw3ICsxODg1LDcgQEAKIAluZC0+cm9vdC5tbnQgPSBOVUxMOwogCiAJbmQtPm1fc2VxID0gcmVhZF9zZXFiZWdpbigmbW91bnRfbG9jayk7Ci0JaWYgKCpuYW1lPT0nLycpIHsKKwlpZiAoKnMgPT0gJy8nKSB7CiAJCWlmIChmbGFncyAmIExPT0tVUF9SQ1UpIHsKIAkJCXJjdV9yZWFkX2xvY2soKTsKIAkJCW5kLT5zZXEgPSBzZXRfcm9vdF9yY3UobmQpOwpAQCAtMTkxOSw3ICsxOTE5LDcgQEAKIAogCQlkZW50cnkgPSBmLmZpbGUtPmZfcGF0aC5kZW50cnk7CiAKLQkJaWYgKCpuYW1lKSB7CisJCWlmICgqcykgewogCQkJaWYgKCFkX2Nhbl9sb29rdXAoZGVudHJ5KSkgewogCQkJCWZkcHV0KGYpOwogCQkJCXJldHVybiAtRU5PVERJUjsKQEAgLTE5NDksNyArMTk0OSw3IEBACiAJcmV0dXJuIC1FQ0hJTEQ7CiBkb25lOgogCWN1cnJlbnQtPnRvdGFsX2xpbmtfY291bnQgPSAwOwotCXJldHVybiBsaW5rX3BhdGhfd2FsayhuYW1lLCBuZCk7CisJcmV0dXJuIGxpbmtfcGF0aF93YWxrKHMsIG5kKTsKIH0KIAogc3RhdGljIHZvaWQgcGF0aF9jbGVhbnVwKHN0cnVjdCBuYW1laWRhdGEgKm5kKQpAQCAtMTk3Miw3ICsxOTcyLDcgQEAKIH0KIAogLyogUmV0dXJucyAwIGFuZCBuZCB3aWxsIGJlIHZhbGlkIG9uIHN1Y2Nlc3M7IFJldHVucyBlcnJvciwgb3RoZXJ3aXNlLiAqLwotc3RhdGljIGludCBwYXRoX2xvb2t1cGF0KGludCBkZmQsIGNvbnN0IGNoYXIgKm5hbWUsCitzdGF0aWMgaW50IHBhdGhfbG9va3VwYXQoaW50IGRmZCwgY29uc3Qgc3RydWN0IGZpbGVuYW1lICpuYW1lLAogCQkJCXVuc2lnbmVkIGludCBmbGFncywgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CiAJc3RydWN0IHBhdGggcGF0aDsKQEAgLTIwMjcsMzEgKzIwMjcsMTcgQEAKIHN0YXRpYyBpbnQgZmlsZW5hbWVfbG9va3VwKGludCBkZmQsIHN0cnVjdCBmaWxlbmFtZSAqbmFtZSwKIAkJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewotCWludCByZXR2YWwgPSBwYXRoX2xvb2t1cGF0KGRmZCwgbmFtZS0+bmFtZSwgZmxhZ3MgfCBMT09LVVBfUkNVLCBuZCk7CisJaW50IHJldHZhbCA9IHBhdGhfbG9va3VwYXQoZGZkLCBuYW1lLCBmbGFncyB8IExPT0tVUF9SQ1UsIG5kKTsKIAlpZiAodW5saWtlbHkocmV0dmFsID09IC1FQ0hJTEQpKQotCQlyZXR2YWwgPSBwYXRoX2xvb2t1cGF0KGRmZCwgbmFtZS0+bmFtZSwgZmxhZ3MsIG5kKTsKKwkJcmV0dmFsID0gcGF0aF9sb29rdXBhdChkZmQsIG5hbWUsIGZsYWdzLCBuZCk7CiAJaWYgKHVubGlrZWx5KHJldHZhbCA9PSAtRVNUQUxFKSkKLQkJcmV0dmFsID0gcGF0aF9sb29rdXBhdChkZmQsIG5hbWUtPm5hbWUsCi0JCQkJCQlmbGFncyB8IExPT0tVUF9SRVZBTCwgbmQpOworCQlyZXR2YWwgPSBwYXRoX2xvb2t1cGF0KGRmZCwgbmFtZSwgZmxhZ3MgfCBMT09LVVBfUkVWQUwsIG5kKTsKIAogCWlmIChsaWtlbHkoIXJldHZhbCkpCiAJCWF1ZGl0X2lub2RlKG5hbWUsIG5kLT5wYXRoLmRlbnRyeSwgZmxhZ3MgJiBMT09LVVBfUEFSRU5UKTsKIAlyZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IGRvX3BhdGhfbG9va3VwKGludCBkZmQsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKLXsKLQlzdHJ1Y3QgZmlsZW5hbWUgKmZpbGVuYW1lID0gZ2V0bmFtZV9rZXJuZWwobmFtZSk7Ci0JaW50IHJldHZhbCA9IFBUUl9FUlIoZmlsZW5hbWUpOwotCi0JaWYgKCFJU19FUlIoZmlsZW5hbWUpKSB7Ci0JCXJldHZhbCA9IGZpbGVuYW1lX2xvb2t1cChkZmQsIGZpbGVuYW1lLCBmbGFncywgbmQpOwotCQlwdXRuYW1lKGZpbGVuYW1lKTsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQogLyogZG9lcyBsb29rdXAsIHJldHVybnMgdGhlIG9iamVjdCB3aXRoIHBhcmVudCBsb2NrZWQgKi8KIHN0cnVjdCBkZW50cnkgKmtlcm5fcGF0aF9sb2NrZWQoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHBhdGggKnBhdGgpCiB7CkBAIC0yMDg5LDkgKzIwNzUsMTUgQEAKIGludCBrZXJuX3BhdGgoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGZsYWdzLCBzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKIAlzdHJ1Y3QgbmFtZWlkYXRhIG5kOwotCWludCByZXMgPSBkb19wYXRoX2xvb2t1cChBVF9GRENXRCwgbmFtZSwgZmxhZ3MsICZuZCk7Ci0JaWYgKCFyZXMpCi0JCSpwYXRoID0gbmQucGF0aDsKKwlzdHJ1Y3QgZmlsZW5hbWUgKmZpbGVuYW1lID0gZ2V0bmFtZV9rZXJuZWwobmFtZSk7CisJaW50IHJlcyA9IFBUUl9FUlIoZmlsZW5hbWUpOworCisJaWYgKCFJU19FUlIoZmlsZW5hbWUpKSB7CisJCXJlcyA9IGZpbGVuYW1lX2xvb2t1cChBVF9GRENXRCwgZmlsZW5hbWUsIGZsYWdzLCAmbmQpOworCQlwdXRuYW1lKGZpbGVuYW1lKTsKKwkJaWYgKCFyZXMpCisJCQkqcGF0aCA9IG5kLnBhdGg7CisJfQogCXJldHVybiByZXM7CiB9CiBFWFBPUlRfU1lNQk9MKGtlcm5fcGF0aCk7CkBAIC0yMTA4LDE1ICsyMTAwLDIyIEBACiAJCSAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCSAgICBzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKLQlzdHJ1Y3QgbmFtZWlkYXRhIG5kOwotCWludCBlcnI7Ci0JbmQucm9vdC5kZW50cnkgPSBkZW50cnk7Ci0JbmQucm9vdC5tbnQgPSBtbnQ7CisJc3RydWN0IGZpbGVuYW1lICpmaWxlbmFtZSA9IGdldG5hbWVfa2VybmVsKG5hbWUpOworCWludCBlcnIgPSBQVFJfRVJSKGZpbGVuYW1lKTsKKwogCUJVR19PTihmbGFncyAmIExPT0tVUF9QQVJFTlQpOwotCS8qIHRoZSBmaXJzdCBhcmd1bWVudCBvZiBkb19wYXRoX2xvb2t1cCgpIGlzIGlnbm9yZWQgd2l0aCBMT09LVVBfUk9PVCAqLwotCWVyciA9IGRvX3BhdGhfbG9va3VwKEFUX0ZEQ1dELCBuYW1lLCBmbGFncyB8IExPT0tVUF9ST09ULCAmbmQpOwotCWlmICghZXJyKQotCQkqcGF0aCA9IG5kLnBhdGg7CisKKwkvKiB0aGUgZmlyc3QgYXJndW1lbnQgb2YgZmlsZW5hbWVfbG9va3VwKCkgaXMgaWdub3JlZCB3aXRoIExPT0tVUF9ST09UICovCisJaWYgKCFJU19FUlIoZmlsZW5hbWUpKSB7CisJCXN0cnVjdCBuYW1laWRhdGEgbmQ7CisJCW5kLnJvb3QuZGVudHJ5ID0gZGVudHJ5OworCQluZC5yb290Lm1udCA9IG1udDsKKwkJZXJyID0gZmlsZW5hbWVfbG9va3VwKEFUX0ZEQ1dELCBmaWxlbmFtZSwKKwkJCQkgICAgICBmbGFncyB8IExPT0tVUF9ST09ULCAmbmQpOworCQlpZiAoIWVycikKKwkJCSpwYXRoID0gbmQucGF0aDsKKwkJcHV0bmFtZShmaWxlbmFtZSk7CisJfQogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MKHZmc19wYXRoX2xvb2t1cCk7CkBAIC0yMTM4LDkgKzIxMzcsNyBAQAogICogQGxlbjoJbWF4aW11bSBsZW5ndGggQGxlbiBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgdG8KICAqCiAgKiBOb3RlIHRoYXQgdGhpcyByb3V0aW5lIGlzIHB1cmVseSBhIGhlbHBlciBmb3IgZmlsZXN5c3RlbSB1c2FnZSBhbmQgc2hvdWxkCi0gKiBub3QgYmUgY2FsbGVkIGJ5IGdlbmVyaWMgY29kZS4gIEFsc28gbm90ZSB0aGF0IGJ5IHVzaW5nIHRoaXMgZnVuY3Rpb24gdGhlCi0gKiBuYW1laWRhdGEgYXJndW1lbnQgaXMgcGFzc2VkIHRvIHRoZSBmaWxlc3lzdGVtIG1ldGhvZHMgYW5kIGEgZmlsZXN5c3RlbQotICogdXNpbmcgdGhpcyBoZWxwZXIgbmVlZHMgdG8gYmUgcHJlcGFyZWQgZm9yIHRoYXQuCisgKiBub3QgYmUgY2FsbGVkIGJ5IGdlbmVyaWMgY29kZS4KICAqLwogc3RydWN0IGRlbnRyeSAqbG9va3VwX29uZV9sZW4oY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqYmFzZSwgaW50IGxlbikKIHsKQEAgLTIzNDEsNyArMjMzOCw4IEBACiAgKiBSZXR1cm5zIDAgYW5kICJwYXRoIiB3aWxsIGJlIHZhbGlkIG9uIHN1Y2Nlc3M7IFJldHVybnMgZXJyb3Igb3RoZXJ3aXNlLgogICovCiBzdGF0aWMgaW50Ci1wYXRoX21vdW50cG9pbnQoaW50IGRmZCwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHBhdGggKnBhdGgsIHVuc2lnbmVkIGludCBmbGFncykKK3BhdGhfbW91bnRwb2ludChpbnQgZGZkLCBjb25zdCBzdHJ1Y3QgZmlsZW5hbWUgKm5hbWUsIHN0cnVjdCBwYXRoICpwYXRoLAorCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IG5hbWVpZGF0YSBuZDsKIAlpbnQgZXJyOwpAQCAtMjM3MCwyMCArMjM2OCwyMCBAQAogfQogCiBzdGF0aWMgaW50Ci1maWxlbmFtZV9tb3VudHBvaW50KGludCBkZmQsIHN0cnVjdCBmaWxlbmFtZSAqcywgc3RydWN0IHBhdGggKnBhdGgsCitmaWxlbmFtZV9tb3VudHBvaW50KGludCBkZmQsIHN0cnVjdCBmaWxlbmFtZSAqbmFtZSwgc3RydWN0IHBhdGggKnBhdGgsCiAJCQl1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJaW50IGVycm9yOwotCWlmIChJU19FUlIocykpCi0JCXJldHVybiBQVFJfRVJSKHMpOwotCWVycm9yID0gcGF0aF9tb3VudHBvaW50KGRmZCwgcy0+bmFtZSwgcGF0aCwgZmxhZ3MgfCBMT09LVVBfUkNVKTsKKwlpZiAoSVNfRVJSKG5hbWUpKQorCQlyZXR1cm4gUFRSX0VSUihuYW1lKTsKKwllcnJvciA9IHBhdGhfbW91bnRwb2ludChkZmQsIG5hbWUsIHBhdGgsIGZsYWdzIHwgTE9PS1VQX1JDVSk7CiAJaWYgKHVubGlrZWx5KGVycm9yID09IC1FQ0hJTEQpKQotCQllcnJvciA9IHBhdGhfbW91bnRwb2ludChkZmQsIHMtPm5hbWUsIHBhdGgsIGZsYWdzKTsKKwkJZXJyb3IgPSBwYXRoX21vdW50cG9pbnQoZGZkLCBuYW1lLCBwYXRoLCBmbGFncyk7CiAJaWYgKHVubGlrZWx5KGVycm9yID09IC1FU1RBTEUpKQotCQllcnJvciA9IHBhdGhfbW91bnRwb2ludChkZmQsIHMtPm5hbWUsIHBhdGgsIGZsYWdzIHwgTE9PS1VQX1JFVkFMKTsKKwkJZXJyb3IgPSBwYXRoX21vdW50cG9pbnQoZGZkLCBuYW1lLCBwYXRoLCBmbGFncyB8IExPT0tVUF9SRVZBTCk7CiAJaWYgKGxpa2VseSghZXJyb3IpKQotCQlhdWRpdF9pbm9kZShzLCBwYXRoLT5kZW50cnksIDApOwotCXB1dG5hbWUocyk7CisJCWF1ZGl0X2lub2RlKG5hbWUsIHBhdGgtPmRlbnRyeSwgMCk7CisJcHV0bmFtZShuYW1lKTsKIAlyZXR1cm4gZXJyb3I7CiB9CiAKQEAgLTMxNTYsNyArMzE1NCw3IEBACiAJc3RhdGljIGNvbnN0IHN0cnVjdCBxc3RyIG5hbWUgPSBRU1RSX0lOSVQoIi8iLCAxKTsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnksICpjaGlsZDsKIAlzdHJ1Y3QgaW5vZGUgKmRpcjsKLQlpbnQgZXJyb3IgPSBwYXRoX2xvb2t1cGF0KGRmZCwgcGF0aG5hbWUtPm5hbWUsCisJaW50IGVycm9yID0gcGF0aF9sb29rdXBhdChkZmQsIHBhdGhuYW1lLAogCQkJCSAgZmxhZ3MgfCBMT09LVVBfRElSRUNUT1JZLCBuZCk7CiAJaWYgKHVubGlrZWx5KGVycm9yKSkKIAkJcmV0dXJuIGVycm9yOwpAQCAtMzIyOSw3ICszMjI3LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZXJyb3IgPSBwYXRoX2luaXQoZGZkLCBwYXRobmFtZS0+bmFtZSwgZmxhZ3MsIG5kKTsKKwllcnJvciA9IHBhdGhfaW5pdChkZmQsIHBhdGhuYW1lLCBmbGFncywgbmQpOwogCWlmICh1bmxpa2VseShlcnJvcikpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9maWxlLmMgYi9mcy9uY3Bmcy9maWxlLmMKaW5kZXggMWRkNzAwNy4uNDc5YmY4ZCAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvZmlsZS5jCisrKyBiL2ZzL25jcGZzL2ZpbGUuYwpAQCAtOTgsMzAgKzk4LDI0IEBACiB9CiAKIHN0YXRpYyBzc2l6ZV90Ci1uY3BfZmlsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK25jcF9maWxlX3JlYWRfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqdG8pCiB7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlX2lub2RlKGZpbGUpOwogCXNpemVfdCBhbHJlYWR5X3JlYWQgPSAwOwotCW9mZl90IHBvczsKKwlvZmZfdCBwb3MgPSBpb2NiLT5raV9wb3M7CiAJc2l6ZV90IGJ1ZnNpemU7CiAJaW50IGVycm9yOwotCXZvaWQqIGZyZWVwYWdlOworCXZvaWQgKmZyZWVwYWdlOwogCXNpemVfdCBmcmVlbGVuOwogCiAJbmNwX2RiZygxLCAiZW50ZXIgJXBEMlxuIiwgZmlsZSk7CiAKLQlwb3MgPSAqcHBvczsKLQotCWlmICgoc3NpemVfdCkgY291bnQgPCAwKSB7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAoIWNvdW50KQorCWlmICghaW92X2l0ZXJfY291bnQodG8pKQogCQlyZXR1cm4gMDsKIAlpZiAocG9zID4gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMpCiAJCXJldHVybiAwOwotCWlmIChwb3MgKyBjb3VudCA+IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7Ci0JCWNvdW50ID0gaW5vZGUtPmlfc2ItPnNfbWF4Ynl0ZXMgLSBwb3M7Ci0JfQorCWlvdl9pdGVyX3RydW5jYXRlKHRvLCBpbm9kZS0+aV9zYi0+c19tYXhieXRlcyAtIHBvcyk7CiAKIAllcnJvciA9IG5jcF9tYWtlX29wZW4oaW5vZGUsIE9fUkRPTkxZKTsKIAlpZiAoZXJyb3IpIHsKQEAgLTEzOCwzMSArMTMyLDI5IEBACiAJCWdvdG8gb3V0cmVsOwogCWVycm9yID0gMDsKIAkvKiBGaXJzdCByZWFkIGluIGFzIG11Y2ggYXMgcG9zc2libGUgZm9yIGVhY2ggYnVmc2l6ZS4gKi8KLQl3aGlsZSAoYWxyZWFkeV9yZWFkIDwgY291bnQpIHsKKwl3aGlsZSAoaW92X2l0ZXJfY291bnQodG8pKSB7CiAJCWludCByZWFkX3RoaXNfdGltZTsKLQkJc2l6ZV90IHRvX3JlYWQgPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCXNpemVfdCB0b19yZWFkID0gbWluX3Qoc2l6ZV90LAogCQkJCSAgICAgYnVmc2l6ZSAtIChwb3MgJSBidWZzaXplKSwKLQkJCQkgICAgIGNvdW50IC0gYWxyZWFkeV9yZWFkKTsKKwkJCQkgICAgIGlvdl9pdGVyX2NvdW50KHRvKSk7CiAKIAkJZXJyb3IgPSBuY3BfcmVhZF9ib3VuY2UoTkNQX1NFUlZFUihpbm9kZSksCiAJCQkgCU5DUF9GSU5GTyhpbm9kZSktPmZpbGVfaGFuZGxlLAotCQkJCXBvcywgdG9fcmVhZCwgYnVmLCAmcmVhZF90aGlzX3RpbWUsIAorCQkJCXBvcywgdG9fcmVhZCwgdG8sICZyZWFkX3RoaXNfdGltZSwgCiAJCQkJZnJlZXBhZ2UsIGZyZWVsZW4pOwogCQlpZiAoZXJyb3IpIHsKIAkJCWVycm9yID0gLUVJTzsJLyogTlcgZXJybm8gLT4gTGludXggZXJybm8gKi8KIAkJCWJyZWFrOwogCQl9CiAJCXBvcyArPSByZWFkX3RoaXNfdGltZTsKLQkJYnVmICs9IHJlYWRfdGhpc190aW1lOwogCQlhbHJlYWR5X3JlYWQgKz0gcmVhZF90aGlzX3RpbWU7CiAKLQkJaWYgKHJlYWRfdGhpc190aW1lICE9IHRvX3JlYWQpIHsKKwkJaWYgKHJlYWRfdGhpc190aW1lICE9IHRvX3JlYWQpCiAJCQlicmVhazsKLQkJfQogCX0KIAl2ZnJlZShmcmVlcGFnZSk7CiAKLQkqcHBvcyA9IHBvczsKKwlpb2NiLT5raV9wb3MgPSBwb3M7CiAKIAlmaWxlX2FjY2Vzc2VkKGZpbGUpOwogCkBAIC0xNzMsNDIgKzE2NSwyNiBAQAogfQogCiBzdGF0aWMgc3NpemVfdAotbmNwX2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorbmNwX2ZpbGVfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7CiAJc2l6ZV90IGFscmVhZHlfd3JpdHRlbiA9IDA7Ci0Jb2ZmX3QgcG9zOworCWxvZmZfdCBwb3MgPSBpb2NiLT5raV9wb3M7CisJc2l6ZV90IGNvdW50ID0gaW92X2l0ZXJfY291bnQoZnJvbSk7CiAJc2l6ZV90IGJ1ZnNpemU7CiAJaW50IGVycm5vOwotCXZvaWQqIGJvdW5jZWJ1ZmZlcjsKKwl2b2lkICpib3VuY2VidWZmZXI7CiAKIAluY3BfZGJnKDEsICJlbnRlciAlcEQyXG4iLCBmaWxlKTsKLQlpZiAoKHNzaXplX3QpIGNvdW50IDwgMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcG9zID0gKnBwb3M7Ci0JaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX0FQUEVORCkgewotCQlwb3MgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JfQotCi0JaWYgKHBvcyArIGNvdW50ID4gTUFYX05PTl9MRlMgJiYgIShmaWxlLT5mX2ZsYWdzJk9fTEFSR0VGSUxFKSkgewotCQlpZiAocG9zID49IE1BWF9OT05fTEZTKSB7Ci0JCQlyZXR1cm4gLUVGQklHOwotCQl9Ci0JCWlmIChjb3VudCA+IE1BWF9OT05fTEZTIC0gKHUzMilwb3MpIHsKLQkJCWNvdW50ID0gTUFYX05PTl9MRlMgLSAodTMyKXBvczsKLQkJfQotCX0KLQlpZiAocG9zID49IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKSB7Ci0JCWlmIChjb3VudCB8fCBwb3MgPiBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykgewotCQkJcmV0dXJuIC1FRkJJRzsKLQkJfQotCX0KLQlpZiAocG9zICsgY291bnQgPiBpbm9kZS0+aV9zYi0+c19tYXhieXRlcykgewotCQljb3VudCA9IGlub2RlLT5pX3NiLT5zX21heGJ5dGVzIC0gcG9zOwotCX0KKwllcnJubyA9IGdlbmVyaWNfd3JpdGVfY2hlY2tzKGZpbGUsICZwb3MsICZjb3VudCwgMCk7CisJaWYgKGVycm5vKQorCQlyZXR1cm4gZXJybm87CisJaW92X2l0ZXJfdHJ1bmNhdGUoZnJvbSwgY291bnQpOwogCQogCWlmICghY291bnQpCiAJCXJldHVybiAwOworCiAJZXJybm8gPSBuY3BfbWFrZV9vcGVuKGlub2RlLCBPX1dST05MWSk7CiAJaWYgKGVycm5vKSB7CiAJCW5jcF9kYmcoMSwgIm9wZW4gZmFpbGVkLCBlcnJvcj0lZFxuIiwgZXJybm8pOwpAQCAtMjE2LDggKzE5Miw2IEBACiAJfQogCWJ1ZnNpemUgPSBOQ1BfU0VSVkVSKGlub2RlKS0+YnVmZmVyX3NpemU7CiAKLQlhbHJlYWR5X3dyaXR0ZW4gPSAwOwotCiAJZXJybm8gPSBmaWxlX3VwZGF0ZV90aW1lKGZpbGUpOwogCWlmIChlcnJubykKIAkJZ290byBvdXRyZWw7CkBAIC0yMjcsMTMgKzIwMSwxMyBAQAogCQllcnJubyA9IC1FSU87CS8qIC1FTk9NRU0gKi8KIAkJZ290byBvdXRyZWw7CiAJfQotCXdoaWxlIChhbHJlYWR5X3dyaXR0ZW4gPCBjb3VudCkgeworCXdoaWxlIChpb3ZfaXRlcl9jb3VudChmcm9tKSkgewogCQlpbnQgd3JpdHRlbl90aGlzX3RpbWU7Ci0JCXNpemVfdCB0b193cml0ZSA9IG1pbl90KHVuc2lnbmVkIGludCwKLQkJCQkgICAgICBidWZzaXplIC0gKHBvcyAlIGJ1ZnNpemUpLAotCQkJCSAgICAgIGNvdW50IC0gYWxyZWFkeV93cml0dGVuKTsKKwkJc2l6ZV90IHRvX3dyaXRlID0gbWluX3Qoc2l6ZV90LAorCQkJCSAgICAgIGJ1ZnNpemUgLSAoKG9mZl90KXBvcyAlIGJ1ZnNpemUpLAorCQkJCSAgICAgIGlvdl9pdGVyX2NvdW50KGZyb20pKTsKIAotCQlpZiAoY29weV9mcm9tX3VzZXIoYm91bmNlYnVmZmVyLCBidWYsIHRvX3dyaXRlKSkgeworCQlpZiAoY29weV9mcm9tX2l0ZXIoYm91bmNlYnVmZmVyLCB0b193cml0ZSwgZnJvbSkgIT0gdG9fd3JpdGUpIHsKIAkJCWVycm5vID0gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9CkBAIC0yNDQsMTYgKzIxOCwxNCBAQAogCQkJYnJlYWs7CiAJCX0KIAkJcG9zICs9IHdyaXR0ZW5fdGhpc190aW1lOwotCQlidWYgKz0gd3JpdHRlbl90aGlzX3RpbWU7CiAJCWFscmVhZHlfd3JpdHRlbiArPSB3cml0dGVuX3RoaXNfdGltZTsKIAotCQlpZiAod3JpdHRlbl90aGlzX3RpbWUgIT0gdG9fd3JpdGUpIHsKKwkJaWYgKHdyaXR0ZW5fdGhpc190aW1lICE9IHRvX3dyaXRlKQogCQkJYnJlYWs7Ci0JCX0KIAl9CiAJdmZyZWUoYm91bmNlYnVmZmVyKTsKIAotCSpwcG9zID0gcG9zOworCWlvY2ItPmtpX3BvcyA9IHBvczsKIAogCWlmIChwb3MgPiBpX3NpemVfcmVhZChpbm9kZSkpIHsKIAkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwpAQCAtMjc3LDggKzI0OSw4IEBACiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5jcF9maWxlX29wZXJhdGlvbnMgPQogewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBuY3BfZmlsZV9yZWFkLAotCS53cml0ZQkJPSBuY3BfZmlsZV93cml0ZSwKKwkucmVhZF9pdGVyCT0gbmNwX2ZpbGVfcmVhZF9pdGVyLAorCS53cml0ZV9pdGVyCT0gbmNwX2ZpbGVfd3JpdGVfaXRlciwKIAkudW5sb2NrZWRfaW9jdGwJPSBuY3BfaW9jdGwsCiAjaWZkZWYgQ09ORklHX0NPTVBBVAogCS5jb21wYXRfaW9jdGwJPSBuY3BfY29tcGF0X2lvY3RsLApkaWZmIC0tZ2l0IGEvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5jIGIvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5jCmluZGV4IDQ4MjM4NzUuLjJiNTAyYTAgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuYworKysgYi9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmMKQEAgLTEwMDEsOCArMTAwMSw4IEBACiAgKi8KIGludAogbmNwX3JlYWRfYm91bmNlKHN0cnVjdCBuY3Bfc2VydmVyICpzZXJ2ZXIsIGNvbnN0IGNoYXIgKmZpbGVfaWQsCi0JIF9fdTMyIG9mZnNldCwgX191MTYgdG9fcmVhZCwgY2hhciBfX3VzZXIgKnRhcmdldCwgaW50ICpieXRlc19yZWFkLAotCSB2b2lkKiBib3VuY2UsIF9fdTMyIGJ1ZnNpemUpCisJIF9fdTMyIG9mZnNldCwgX191MTYgdG9fcmVhZCwgc3RydWN0IGlvdl9pdGVyICp0bywKKwkgaW50ICpieXRlc19yZWFkLCB2b2lkICpib3VuY2UsIF9fdTMyIGJ1ZnNpemUpCiB7CiAJaW50IHJlc3VsdDsKIApAQCAtMTAyNSw3ICsxMDI1LDcgQEAKIAkJCSAgICAgICAgIChvZmZzZXQgJiAxKTsKIAkJCSpieXRlc19yZWFkID0gbGVuOwogCQkJcmVzdWx0ID0gMDsKLQkJCWlmIChjb3B5X3RvX3VzZXIodGFyZ2V0LCBzb3VyY2UsIGxlbikpCisJCQlpZiAoY29weV90b19pdGVyKHNvdXJjZSwgbGVuLCB0bykgIT0gbGVuKQogCQkJCXJlc3VsdCA9IC1FRkFVTFQ7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmggYi9mcy9uY3Bmcy9uY3BsaWJfa2VybmVsLmgKaW5kZXggMjUwZTQ0My4uNTIzM2ZiYyAxMDA2NDQKLS0tIGEvZnMvbmNwZnMvbmNwbGliX2tlcm5lbC5oCisrKyBiL2ZzL25jcGZzL25jcGxpYl9rZXJuZWwuaApAQCAtNTMsNyArNTMsNyBAQAogCXJldHVybiBzaXplb2Yoc3RydWN0IG5jcF9yZXBseV9oZWFkZXIpICsgMiArIDIgKyBzaXplICsgODsKIH07CiBpbnQgbmNwX3JlYWRfYm91bmNlKHN0cnVjdCBuY3Bfc2VydmVyICosIGNvbnN0IGNoYXIgKiwgX191MzIsIF9fdTE2LCAKLQkJY2hhciBfX3VzZXIgKiwgaW50ICosIHZvaWQqIGJvdW5jZSwgX191MzIgYm91bmNlbGVuKTsKKwkJc3RydWN0IGlvdl9pdGVyICosIGludCAqLCB2b2lkICpib3VuY2UsIF9fdTMyIGJvdW5jZWxlbik7CiBpbnQgbmNwX3JlYWRfa2VybmVsKHN0cnVjdCBuY3Bfc2VydmVyICosIGNvbnN0IGNoYXIgKiwgX191MzIsIF9fdTE2LCAKIAkJY2hhciAqLCBpbnQgKik7CiBpbnQgbmNwX3dyaXRlX2tlcm5lbChzdHJ1Y3QgbmNwX3NlcnZlciAqLCBjb25zdCBjaGFyICosIF9fdTMyLCBfX3UxNiwKZGlmZiAtLWdpdCBhL2ZzL25mcy9LY29uZmlnIGIvZnMvbmZzL0tjb25maWcKaW5kZXggYzdhYmMxMC4uZjMxZmQwZCAxMDA2NDQKLS0tIGEvZnMvbmZzL0tjb25maWcKKysrIGIvZnMvbmZzL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgTkZTX0ZTCiAJdHJpc3RhdGUgIk5GUyBjbGllbnQgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIElORVQgJiYgRklMRV9MT0NLSU5HCisJZGVwZW5kcyBvbiBJTkVUICYmIEZJTEVfTE9DS0lORyAmJiBNVUxUSVVTRVIKIAlzZWxlY3QgTE9DS0QKIAlzZWxlY3QgU1VOUlBDCiAJc2VsZWN0IE5GU19BQ0xfU1VQUE9SVCBpZiBORlNfVjNfQUNMCmRpZmYgLS1naXQgYS9mcy9uZnMvZGlyZWN0LmMgYi9mcy9uZnMvZGlyZWN0LmMKaW5kZXggZTkwN2M4Yy4uYzM5MjlmYiAxMDA2NDQKLS0tIGEvZnMvbmZzL2RpcmVjdC5jCisrKyBiL2ZzL25mcy9kaXJlY3QuYwpAQCAtMjY1LDcgKzI2NSw3IEBACiAKIAlyZXR1cm4gLUVJTlZBTDsKICNlbHNlCi0JVk1fQlVHX09OKGlvY2ItPmtpX25ieXRlcyAhPSBQQUdFX1NJWkUpOworCVZNX0JVR19PTihpb3ZfaXRlcl9jb3VudChpdGVyKSAhPSBQQUdFX1NJWkUpOwogCiAJaWYgKHJ3ID09IFJFQUQpCiAJCXJldHVybiBuZnNfZmlsZV9kaXJlY3RfcmVhZChpb2NiLCBpdGVyLCBwb3MpOwpAQCAtMzkzLDcgKzM5Myw3IEBACiAJCWxvbmcgcmVzID0gKGxvbmcpIGRyZXEtPmVycm9yOwogCQlpZiAoIXJlcykKIAkJCXJlcyA9IChsb25nKSBkcmVxLT5jb3VudDsKLQkJYWlvX2NvbXBsZXRlKGRyZXEtPmlvY2IsIHJlcywgMCk7CisJCWRyZXEtPmlvY2ItPmtpX2NvbXBsZXRlKGRyZXEtPmlvY2IsIHJlcywgMCk7CiAJfQogCiAJY29tcGxldGVfYWxsKCZkcmVxLT5jb21wbGV0aW9uKTsKZGlmZiAtLWdpdCBhL2ZzL25mcy9maWxlLmMgYi9mcy9uZnMvZmlsZS5jCmluZGV4IGU2NzlkMjQuLmY2YTNhZGUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9maWxlLmMKKysrIGIvZnMvbmZzL2ZpbGUuYwpAQCAtMjYsNyArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L25mc19tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KIApAQCAtOTI3LDggKzkyNiw2IEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbmZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IG5mc19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkucmVhZF9pdGVyCT0gbmZzX2ZpbGVfcmVhZCwKIAkud3JpdGVfaXRlcgk9IG5mc19maWxlX3dyaXRlLAogCS5tbWFwCQk9IG5mc19maWxlX21tYXAsCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNGZpbGUuYyBiL2ZzL25mcy9uZnM0ZmlsZS5jCmluZGV4IDhiNDYzODkuLjAxODFjZGUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0ZmlsZS5jCisrKyBiL2ZzL25mcy9uZnM0ZmlsZS5jCkBAIC0xNzAsOCArMTcwLDYgQEAKICNlbHNlCiAJLmxsc2VlawkJPSBuZnNfZmlsZV9sbHNlZWssCiAjZW5kaWYKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkucmVhZF9pdGVyCT0gbmZzX2ZpbGVfcmVhZCwKIAkud3JpdGVfaXRlcgk9IG5mc19maWxlX3dyaXRlLAogCS5tbWFwCQk9IG5mc19maWxlX21tYXAsCmRpZmYgLS1naXQgYS9mcy9uZnMvd3JpdGUuYyBiL2ZzL25mcy93cml0ZS5jCmluZGV4IDg0OWVkNzguLjc1OTkzMTAgMTAwNjQ0Ci0tLSBhL2ZzL25mcy93cml0ZS5jCisrKyBiL2ZzL25mcy93cml0ZS5jCkBAIC0xODc2LDExICsxODc2LDYgQEAKIAkJICogcmVxdWVzdCBmcm9tIHRoZSBpbm9kZSAvIHBhZ2VfcHJpdmF0ZSBwb2ludGVyIGFuZAogCQkgKiByZWxlYXNlIGl0ICovCiAJCW5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdChyZXEpOwotCQkvKgotCQkgKiBJbiBjYXNlIG5mc19pbm9kZV9yZW1vdmVfcmVxdWVzdCBoYXMgbWFya2VkIHRoZQotCQkgKiBwYWdlIGFzIGJlaW5nIGRpcnR5Ci0JCSAqLwotCQljYW5jZWxfZGlydHlfcGFnZShwYWdlLCBQQUdFX0NBQ0hFX1NJWkUpOwogCQluZnNfdW5sb2NrX2FuZF9yZWxlYXNlX3JlcXVlc3QocmVxKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL25mc2QvS2NvbmZpZyBiL2ZzL25mc2QvS2NvbmZpZwppbmRleCA2ODNiZjcxLi5mYzJkMTA4IDEwMDY0NAotLS0gYS9mcy9uZnNkL0tjb25maWcKKysrIGIvZnMvbmZzZC9LY29uZmlnCkBAIC02LDYgKzYsNyBAQAogCXNlbGVjdCBTVU5SUEMKIAlzZWxlY3QgRVhQT1JURlMKIAlzZWxlY3QgTkZTX0FDTF9TVVBQT1JUIGlmIE5GU0RfVjJfQUNMCisJZGVwZW5kcyBvbiBNVUxUSVVTRVIKIAloZWxwCiAJICBDaG9vc2UgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGFsbG93IG90aGVyIGNvbXB1dGVycyB0byBhY2Nlc3MKIAkgIGZpbGVzIHJlc2lkaW5nIG9uIHRoaXMgc3lzdGVtIHVzaW5nIFN1bidzIE5ldHdvcmsgRmlsZSBTeXN0ZW0KZGlmZiAtLWdpdCBhL2ZzL25mc2QvYmxvY2tsYXlvdXQuYyBiL2ZzL25mc2QvYmxvY2tsYXlvdXQuYwppbmRleCBjZGJjNzhjLi4wM2Q2NDdiIDEwMDY0NAotLS0gYS9mcy9uZnNkL2Jsb2NrbGF5b3V0LmMKKysrIGIvZnMvbmZzZC9ibG9ja2xheW91dC5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIAlzZWctPm9mZnNldCA9IGlvbWFwLm9mZnNldDsKIAlzZWctPmxlbmd0aCA9IGlvbWFwLmxlbmd0aDsKIAotCWRwcmludGsoIkdFVDogJWxsZDolbGxkICVkXG4iLCBiZXgtPmZvZmYsIGJleC0+bGVuLCBiZXgtPmVzKTsKKwlkcHJpbnRrKCJHRVQ6IDB4JWxseDoweCVsbHggJWRcbiIsIGJleC0+Zm9mZiwgYmV4LT5sZW4sIGJleC0+ZXMpOwogCXJldHVybiAwOwogCiBvdXRfZXJyb3I6CmRpZmYgLS1naXQgYS9mcy9uZnNkL2Jsb2NrbGF5b3V0eGRyLmMgYi9mcy9uZnNkL2Jsb2NrbGF5b3V0eGRyLmMKaW5kZXggOWRhODlmZC4uOWFhMjc5NiAxMDA2NDQKLS0tIGEvZnMvbmZzZC9ibG9ja2xheW91dHhkci5jCisrKyBiL2ZzL25mc2QvYmxvY2tsYXlvdXR4ZHIuYwpAQCAtMTIyLDE5ICsxMjIsMTkgQEAKIAogCQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmYmV4LmZvZmYpOwogCQlpZiAoYmV4LmZvZmYgJiAoYmxvY2tfc2l6ZSAtIDEpKSB7Ci0JCQlkcHJpbnRrKCIlczogdW5hbGlnbmVkIG9mZnNldCAlbGxkXG4iLAorCQkJZHByaW50aygiJXM6IHVuYWxpZ25lZCBvZmZzZXQgMHglbGx4XG4iLAogCQkJCV9fZnVuY19fLCBiZXguZm9mZik7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAkJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmJleC5sZW4pOwogCQlpZiAoYmV4LmxlbiAmIChibG9ja19zaXplIC0gMSkpIHsKLQkJCWRwcmludGsoIiVzOiB1bmFsaWduZWQgbGVuZ3RoICVsbGRcbiIsCisJCQlkcHJpbnRrKCIlczogdW5hbGlnbmVkIGxlbmd0aCAweCVsbHhcbiIsCiAJCQkJX19mdW5jX18sIGJleC5mb2ZmKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmYmV4LnNvZmYpOwogCQlpZiAoYmV4LnNvZmYgJiAoYmxvY2tfc2l6ZSAtIDEpKSB7Ci0JCQlkcHJpbnRrKCIlczogdW5hbGlnbmVkIGRpc2sgb2Zmc2V0ICVsbGRcbiIsCisJCQlkcHJpbnRrKCIlczogdW5hbGlnbmVkIGRpc2sgb2Zmc2V0IDB4JWxseFxuIiwKIAkJCQlfX2Z1bmNfXywgYmV4LnNvZmYpOwogCQkJZ290byBmYWlsOwogCQl9CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRsYXlvdXRzLmMgYi9mcy9uZnNkL25mczRsYXlvdXRzLmMKaW5kZXggM2MxYmZhMS4uNjkwNDIxMyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0bGF5b3V0cy5jCisrKyBiL2ZzL25mc2QvbmZzNGxheW91dHMuYwpAQCAtMTE4LDcgKzExOCw3IEBACiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGV4cC0+ZXhfcGF0aC5tbnQtPm1udF9zYjsKIAotCWlmIChleHAtPmV4X2ZsYWdzICYgTkZTRVhQX05PUE5GUykKKwlpZiAoIShleHAtPmV4X2ZsYWdzICYgTkZTRVhQX1BORlMpKQogCQlyZXR1cm47CiAKIAlpZiAoc2ItPnNfZXhwb3J0X29wLT5nZXRfdXVpZCAmJgpAQCAtNDQwLDE1ICs0NDAsMTQgQEAKIAkJCWxpc3RfbW92ZV90YWlsKCZscC0+bG9fcGVyc3RhdGUsIHJlYXBsaXN0KTsKIAkJCXJldHVybjsKIAkJfQotCQllbmQgPSBzZWctPm9mZnNldDsKKwkJbG8tPm9mZnNldCA9IGxheW91dF9lbmQoc2VnKTsKIAl9IGVsc2UgewogCQkvKiByZXRhaW4gdGhlIHdob2xlIGxheW91dCBzZWdtZW50IG9uIGEgc3BsaXQuICovCiAJCWlmIChsYXlvdXRfZW5kKHNlZykgPCBlbmQpIHsKIAkJCWRwcmludGsoIiVzOiBzcGxpdCBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm47CiAJCX0KLQotCQlsby0+b2Zmc2V0ID0gbGF5b3V0X2VuZChzZWcpOworCQllbmQgPSBzZWctPm9mZnNldDsKIAl9CiAKIAlsYXlvdXRfdXBkYXRlX2xlbihsbywgZW5kKTsKQEAgLTUxMyw2ICs1MTIsOSBAQAogCiAJc3Bpbl9sb2NrKCZjbHAtPmNsX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShscywgbiwgJmNscC0+Y2xfbG9fc3RhdGVzLCBsc19wZXJjbG50KSB7CisJCWlmIChscy0+bHNfbGF5b3V0X3R5cGUgIT0gbHJwLT5scl9sYXlvdXRfdHlwZSkKKwkJCWNvbnRpbnVlOworCiAJCWlmIChscnAtPmxyX3JldHVybl90eXBlID09IFJFVFVSTl9GU0lEICYmCiAJCSAgICAhZmhfZnNpZF9tYXRjaCgmbHMtPmxzX3N0aWQuc2NfZmlsZS0+ZmlfZmhhbmRsZSwKIAkJCQkgICAmY3N0YXRlLT5jdXJyZW50X2ZoLmZoX2hhbmRsZSkpCkBAIC01ODcsNyArNTg5LDcgQEAKIAogCXJwY19udG9wKChzdHJ1Y3Qgc29ja2FkZHIgKikmY2xwLT5jbF9hZGRyLCBhZGRyX3N0ciwgc2l6ZW9mKGFkZHJfc3RyKSk7CiAKLQluZnNkNF9jYl9sYXlvdXRfZmFpbChscyk7CisJdHJhY2VfbGF5b3V0X3JlY2FsbF9mYWlsKCZscy0+bHNfc3RpZC5zY19zdGF0ZWlkKTsKIAogCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJIm5mc2Q6IGNsaWVudCAlcyBmYWlsZWQgdG8gcmVzcG9uZCB0byBsYXlvdXQgcmVjYWxsLiAiCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRwcm9jLmMgYi9mcy9uZnNkL25mczRwcm9jLmMKaW5kZXggZDMwYmVhOC4uOTJiOWQ5NyAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0cHJvYy5jCisrKyBiL2ZzL25mc2QvbmZzNHByb2MuYwpAQCAtMTIzNyw4ICsxMjM3LDggQEAKIAkJbmZzZXJyID0gb3BzLT5wcm9jX2dldGRldmljZWluZm8oZXhwLT5leF9wYXRoLm1udC0+bW50X3NiLCBnZHApOwogCiAJZ2RwLT5nZF9ub3RpZnlfdHlwZXMgJj0gb3BzLT5ub3RpZnlfdHlwZXM7Ci0JZXhwX3B1dChleHApOwogb3V0OgorCWV4cF9wdXQoZXhwKTsKIAlyZXR1cm4gbmZzZXJyOwogfQogCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRzdGF0ZS5jIGIvZnMvbmZzZC9uZnM0c3RhdGUuYwppbmRleCBkMmYyYzM3Li4zMjZhNTQ1IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRzdGF0ZS5jCisrKyBiL2ZzL25mc2QvbmZzNHN0YXRlLmMKQEAgLTMyMjEsNyArMzIyMSw3IEBACiAJfSBlbHNlCiAJCW5mczRfZnJlZV9vcGVub3duZXIoJm9vLT5vb19vd25lcik7CiAJc3Bpbl91bmxvY2soJmNscC0+Y2xfbG9jayk7Ci0JcmV0dXJuIG9vOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIGluaXRfb3Blbl9zdGF0ZWlkKHN0cnVjdCBuZnM0X29sX3N0YXRlaWQgKnN0cCwgc3RydWN0IG5mczRfZmlsZSAqZnAsIHN0cnVjdCBuZnNkNF9vcGVuICpvcGVuKSB7CkBAIC00OTMyLDIwICs0OTMyLDIyIEBACiAJCWxvY2stPmZsX2VuZCA9IE9GRlNFVF9NQVg7CiB9CiAKLXN0YXRpYyB2b2lkIG5mc2Q0X2ZsX2dldF9vd25lcihzdHJ1Y3QgZmlsZV9sb2NrICpkc3QsIHN0cnVjdCBmaWxlX2xvY2sgKnNyYykKK3N0YXRpYyBmbF9vd25lcl90CituZnNkNF9mbF9nZXRfb3duZXIoZmxfb3duZXJfdCBvd25lcikKIHsKLQlzdHJ1Y3QgbmZzNF9sb2Nrb3duZXIgKmxvID0gKHN0cnVjdCBuZnM0X2xvY2tvd25lciAqKXNyYy0+Zmxfb3duZXI7Ci0JZHN0LT5mbF9vd25lciA9IChmbF9vd25lcl90KWxvY2tvd25lcihuZnM0X2dldF9zdGF0ZW93bmVyKCZsby0+bG9fb3duZXIpKTsKKwlzdHJ1Y3QgbmZzNF9sb2Nrb3duZXIgKmxvID0gKHN0cnVjdCBuZnM0X2xvY2tvd25lciAqKW93bmVyOworCisJbmZzNF9nZXRfc3RhdGVvd25lcigmbG8tPmxvX293bmVyKTsKKwlyZXR1cm4gb3duZXI7CiB9CiAKLXN0YXRpYyB2b2lkIG5mc2Q0X2ZsX3B1dF9vd25lcihzdHJ1Y3QgZmlsZV9sb2NrICpmbCkKK3N0YXRpYyB2b2lkCituZnNkNF9mbF9wdXRfb3duZXIoZmxfb3duZXJfdCBvd25lcikKIHsKLQlzdHJ1Y3QgbmZzNF9sb2Nrb3duZXIgKmxvID0gKHN0cnVjdCBuZnM0X2xvY2tvd25lciAqKWZsLT5mbF9vd25lcjsKKwlzdHJ1Y3QgbmZzNF9sb2Nrb3duZXIgKmxvID0gKHN0cnVjdCBuZnM0X2xvY2tvd25lciAqKW93bmVyOwogCi0JaWYgKGxvKSB7CisJaWYgKGxvKQogCQluZnM0X3B1dF9zdGF0ZW93bmVyKCZsby0+bG9fb3duZXIpOwotCQlmbC0+Zmxfb3duZXIgPSBOVUxMOwotCX0KIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBsb2NrX21hbmFnZXJfb3BlcmF0aW9ucyBuZnNkX3Bvc2l4X21uZ19vcHMgID0gewpAQCAtNTA2Miw3ICs1MDY0LDcgQEAKIAl9IGVsc2UKIAkJbmZzNF9mcmVlX2xvY2tvd25lcigmbG8tPmxvX293bmVyKTsKIAlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKLQlyZXR1cm4gbG87CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2ZzL25mc2QvbmZzNHhkci5jIGIvZnMvbmZzZC9uZnM0eGRyLmMKaW5kZXggZGY1ZTY2Yy4uNWZiN2U3OCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnM0eGRyLmMKKysrIGIvZnMvbmZzZC9uZnM0eGRyLmMKQEAgLTE1NjIsNyArMTU2MiwxMSBAQAogCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZsZ3AtPmxnX3NlZy5vZmZzZXQpOwogCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZsZ3AtPmxnX3NlZy5sZW5ndGgpOwogCXAgPSB4ZHJfZGVjb2RlX2h5cGVyKHAsICZsZ3AtPmxnX21pbmxlbmd0aCk7Ci0JbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJmxncC0+bGdfc2lkKTsKKworCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZsZ3AtPmxnX3NpZCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwogCVJFQURfQlVGKDQpOwogCWxncC0+bGdfbWF4Y291bnQgPSBiZTMyX3RvX2NwdXAocCsrKTsKIApAQCAtMTU4MCw3ICsxNTg0LDExIEBACiAJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmxjcC0+bGNfc2VnLm9mZnNldCk7CiAJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmxjcC0+bGNfc2VnLmxlbmd0aCk7CiAJbGNwLT5sY19yZWNsYWltID0gYmUzMl90b19jcHVwKHArKyk7Ci0JbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJmxjcC0+bGNfc2lkKTsKKworCXN0YXR1cyA9IG5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZsY3AtPmxjX3NpZCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKwogCVJFQURfQlVGKDQpOwogCWxjcC0+bGNfbmV3b2Zmc2V0ID0gYmUzMl90b19jcHVwKHArKyk7CiAJaWYgKGxjcC0+bGNfbmV3b2Zmc2V0KSB7CkBAIC0xNjI4LDcgKzE2MzYsMTEgQEAKIAkJUkVBRF9CVUYoMTYpOwogCQlwID0geGRyX2RlY29kZV9oeXBlcihwLCAmbHJwLT5scl9zZWcub2Zmc2V0KTsKIAkJcCA9IHhkcl9kZWNvZGVfaHlwZXIocCwgJmxycC0+bHJfc2VnLmxlbmd0aCk7Ci0JCW5mc2Q0X2RlY29kZV9zdGF0ZWlkKGFyZ3AsICZscnAtPmxyX3NpZCk7CisKKwkJc3RhdHVzID0gbmZzZDRfZGVjb2RlX3N0YXRlaWQoYXJncCwgJmxycC0+bHJfc2lkKTsKKwkJaWYgKHN0YXR1cykKKwkJCXJldHVybiBzdGF0dXM7CisKIAkJUkVBRF9CVUYoNCk7CiAJCWxycC0+bHJmX2JvZHlfbGVuID0gYmUzMl90b19jcHVwKHArKyk7CiAJCWlmIChscnAtPmxyZl9ib2R5X2xlbiA+IDApIHsKQEAgLTQxMjMsNyArNDEzNSw3IEBACiAJCXJldHVybiBuZnNlcnJfcmVzb3VyY2U7CiAJKnArKyA9IGNwdV90b19iZTMyKGxycC0+bHJzX3ByZXNlbnQpOwogCWlmIChscnAtPmxyc19wcmVzZW50KQotCQluZnNkNF9lbmNvZGVfc3RhdGVpZCh4ZHIsICZscnAtPmxyX3NpZCk7CisJCXJldHVybiBuZnNkNF9lbmNvZGVfc3RhdGVpZCh4ZHIsICZscnAtPmxyX3NpZCk7CiAJcmV0dXJuIG5mc19vazsKIH0KICNlbmRpZiAvKiBDT05GSUdfTkZTRF9QTkZTICovCmRpZmYgLS1naXQgYS9mcy9uZnNkL25mc2NhY2hlLmMgYi9mcy9uZnNkL25mc2NhY2hlLmMKaW5kZXggODNhOTY5NC4uNDZlYzkzNCAxMDA2NDQKLS0tIGEvZnMvbmZzZC9uZnNjYWNoZS5jCisrKyBiL2ZzL25mc2QvbmZzY2FjaGUuYwpAQCAtMTY1LDEzICsxNjUsMTcgQEAKIHsKIAl1bnNpZ25lZCBpbnQgaGFzaHNpemU7CiAJdW5zaWduZWQgaW50IGk7CisJaW50IHN0YXR1cyA9IDA7CiAKIAltYXhfZHJjX2VudHJpZXMgPSBuZnNkX2NhY2hlX3NpemVfbGltaXQoKTsKIAlhdG9taWNfc2V0KCZudW1fZHJjX2VudHJpZXMsIDApOwogCWhhc2hzaXplID0gbmZzZF9oYXNoc2l6ZShtYXhfZHJjX2VudHJpZXMpOwogCW1hc2tiaXRzID0gaWxvZzIoaGFzaHNpemUpOwogCi0JcmVnaXN0ZXJfc2hyaW5rZXIoJm5mc2RfcmVwbHlfY2FjaGVfc2hyaW5rZXIpOworCXN0YXR1cyA9IHJlZ2lzdGVyX3Nocmlua2VyKCZuZnNkX3JlcGx5X2NhY2hlX3Nocmlua2VyKTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCiAJZHJjX3NsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZSgibmZzZF9kcmMiLCBzaXplb2Yoc3RydWN0IHN2Y19jYWNoZXJlcCksCiAJCQkJCTAsIDAsIE5VTEwpOwogCWlmICghZHJjX3NsYWIpCmRpZmYgLS1naXQgYS9mcy9uaWxmczIvZmlsZS5jIGIvZnMvbmlsZnMyL2ZpbGUuYwppbmRleCBhOGM3MjhhLi41NDU3NWUzIDEwMDY0NAotLS0gYS9mcy9uaWxmczIvZmlsZS5jCisrKyBiL2ZzL25pbGZzMi9maWxlLmMKQEAgLTE0Myw4ICsxNDMsNiBAQAogICovCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5pbGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCiAJLndyaXRlX2l0ZXIJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkudW5sb2NrZWRfaW9jdGwJPSBuaWxmc19pb2N0bCwKZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9pbm9kZS5jIGIvZnMvbmlsZnMyL2lub2RlLmMKaW5kZXggOGI1OTY5NS4uYWI0OTg3YiAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2lub2RlLmMKKysrIGIvZnMvbmlsZnMyL2lub2RlLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlICJuaWxmcy5oIgogI2luY2x1ZGUgImJ0bm9kZS5oIgogI2luY2x1ZGUgInNlZ21lbnQuaCIKZGlmZiAtLWdpdCBhL2ZzL250ZnMvTWFrZWZpbGUgYi9mcy9udGZzL01ha2VmaWxlCmluZGV4IDM2YWU1MjkuLjJmZjI2M2UgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMvTWFrZWZpbGUKKysrIGIvZnMvbnRmcy9NYWtlZmlsZQpAQCAtOCw3ICs4LDcgQEAKIAogbnRmcy0kKENPTkZJR19OVEZTX1JXKSArPSBiaXRtYXAubyBsY25hbGxvYy5vIGxvZ2ZpbGUubyBxdW90YS5vIHVzbmpybmwubwogCi1jY2ZsYWdzLXkgOj0gLUROVEZTX1ZFUlNJT049XCIyLjEuMzFcIgorY2NmbGFncy15IDo9IC1ETlRGU19WRVJTSU9OPVwiMi4xLjMyXCIKIGNjZmxhZ3MtJChDT05GSUdfTlRGU19ERUJVRykJKz0gLURERUJVRwogY2NmbGFncy0kKENPTkZJR19OVEZTX1JXKQkrPSAtRE5URlNfUlcKIApkaWZmIC0tZ2l0IGEvZnMvbnRmcy9maWxlLmMgYi9mcy9udGZzL2ZpbGUuYwppbmRleCAxZGE5YjJkLi44NDBlOTVlIDEwMDY0NAotLS0gYS9mcy9udGZzL2ZpbGUuYworKysgYi9mcy9udGZzL2ZpbGUuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBmaWxlLmMgLSBOVEZTIGtlcm5lbCBmaWxlIG9wZXJhdGlvbnMuICBQYXJ0IG9mIHRoZSBMaW51eC1OVEZTIHByb2plY3QuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMTQgQW50b24gQWx0YXBhcm1ha292IGFuZCBUdXhlcmEgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMTUgQW50b24gQWx0YXBhcm1ha292IGFuZCBUdXhlcmEgSW5jLgogICoKICAqIFRoaXMgcHJvZ3JhbS9pbmNsdWRlIGZpbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bGludXgvd3JpdGViYWNrLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CkBAIC0zMjksNjIgKzMyOCwxNjggQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKioKLSAqIG50ZnNfZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUgLQotICoKLSAqIEZhdWx0IGEgbnVtYmVyIG9mIHVzZXJzcGFjZSBwYWdlcyBpbnRvIHBhZ2V0YWJsZXMuCi0gKgotICogVW5saWtlIGluY2x1ZGUvbGludXgvcGFnZW1hcC5oOjpmYXVsdF9pbl9wYWdlc19yZWFkYWJsZSgpLCB0aGlzIG9uZSBjb3BlcwotICogd2l0aCBtb3JlIHRoYW4gdHdvIHVzZXJzcGFjZSBwYWdlcyBhcyB3ZWxsIGFzIGhhbmRsaW5nIHRoZSBzaW5nbGUgcGFnZSBjYXNlCi0gKiBlbGVnYW50bHkuCi0gKgotICogSWYgeW91IGZpbmQgdGhpcyBkaWZmaWN1bHQgdG8gdW5kZXJzdGFuZCwgdGhlbiB0aGluayBvZiB0aGUgd2hpbGUgbG9vcCBiZWluZwotICogdGhlIGZvbGxvd2luZyBjb2RlLCBleGNlcHQgdGhhdCB3ZSBkbyB3aXRob3V0IHRoZSBpbnRlZ2VyIHZhcmlhYmxlIHJldDoKLSAqCi0gKglkbyB7Ci0gKgkJcmV0ID0gX19nZXRfdXNlcihjLCB1YWRkcik7Ci0gKgkJdWFkZHIgKz0gUEFHRV9TSVpFOwotICoJfSB3aGlsZSAoIXJldCAmJiB1YWRkciA8IGVuZCk7Ci0gKgotICogTm90ZSwgdGhlIGZpbmFsIF9fZ2V0X3VzZXIoKSBtYXkgd2VsbCBydW4gb3V0LW9mLWJvdW5kcyBvZiB0aGUgdXNlciBidWZmZXIsCi0gKiBidXQgX25vdF8gb3V0LW9mLWJvdW5kcyBvZiB0aGUgcGFnZSB0aGUgdXNlciBidWZmZXIgYmVsb25ncyB0bywgYW5kIHNpbmNlCi0gKiB0aGlzIGlzIG9ubHkgYSByZWFkIGFuZCBub3QgYSB3cml0ZSwgYW5kIHNpbmNlIGl0IGlzIHN0aWxsIGluIHRoZSBzYW1lIHBhZ2UsCi0gKiBpdCBzaG91bGQgbm90IG1hdHRlciBhbmQgdGhpcyBtYWtlcyB0aGUgY29kZSBtdWNoIHNpbXBsZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBudGZzX2ZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKGNvbnN0IGNoYXIgX191c2VyICp1YWRkciwKLQkJaW50IGJ5dGVzKQorc3RhdGljIHNzaXplX3QgbnRmc19wcmVwYXJlX2ZpbGVfZm9yX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBsb2ZmX3QgKnBwb3MsCisJCXNpemVfdCAqY291bnQpCiB7Ci0JY29uc3QgY2hhciBfX3VzZXIgKmVuZDsKLQl2b2xhdGlsZSBjaGFyIGM7CisJbG9mZl90IHBvczsKKwlzNjQgZW5kLCBsbDsKKwlzc2l6ZV90IGVycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbm9kZSAqdmkgPSBmaWxlX2lub2RlKGZpbGUpOworCW50ZnNfaW5vZGUgKmJhc2VfbmksICpuaSA9IE5URlNfSSh2aSk7CisJbnRmc192b2x1bWUgKnZvbCA9IG5pLT52b2w7CiAKLQkvKiBTZXQgQGVuZCB0byB0aGUgZmlyc3QgYnl0ZSBvdXRzaWRlIHRoZSBsYXN0IHBhZ2Ugd2UgY2FyZSBhYm91dC4gKi8KLQllbmQgPSAoY29uc3QgY2hhciBfX3VzZXIqKVBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpdWFkZHIgKyBieXRlcyk7Ci0KLQl3aGlsZSAoIV9fZ2V0X3VzZXIoYywgdWFkZHIpICYmICh1YWRkciArPSBQQUdFX1NJWkUsIHVhZGRyIDwgZW5kKSkKLQkJOwotfQotCi0vKioKLSAqIG50ZnNfZmF1bHRfaW5fcGFnZXNfcmVhZGFibGVfaW92ZWMgLQotICoKLSAqIFNhbWUgYXMgbnRmc19mYXVsdF9pbl9wYWdlc19yZWFkYWJsZSgpIGJ1dCBvcGVyYXRlcyBvbiBhbiBhcnJheSBvZiBpb3ZlY3MuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBudGZzX2ZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlX2lvdmVjKGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQlzaXplX3QgaW92X29mcywgaW50IGJ5dGVzKQotewotCWRvIHsKLQkJY29uc3QgY2hhciBfX3VzZXIgKmJ1ZjsKLQkJdW5zaWduZWQgbGVuOwotCi0JCWJ1ZiA9IGlvdi0+aW92X2Jhc2UgKyBpb3Zfb2ZzOwotCQlsZW4gPSBpb3YtPmlvdl9sZW4gLSBpb3Zfb2ZzOwotCQlpZiAobGVuID4gYnl0ZXMpCi0JCQlsZW4gPSBieXRlczsKLQkJbnRmc19mYXVsdF9pbl9wYWdlc19yZWFkYWJsZShidWYsIGxlbik7Ci0JCWJ5dGVzIC09IGxlbjsKLQkJaW92Kys7Ci0JCWlvdl9vZnMgPSAwOwotCX0gd2hpbGUgKGJ5dGVzKTsKKwludGZzX2RlYnVnKCJFbnRlcmluZyBmb3IgaV9pbm8gMHglbHgsIGF0dHJpYnV0ZSB0eXBlIDB4JXgsIHBvcyAiCisJCQkiMHglbGx4LCBjb3VudCAweCVseC4iLCB2aS0+aV9pbm8sCisJCQkodW5zaWduZWQpbGUzMl90b19jcHUobmktPnR5cGUpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykqcHBvcywgKHVuc2lnbmVkIGxvbmcpKmNvdW50KTsKKwkvKiBXZSBjYW4gd3JpdGUgYmFjayB0aGlzIHF1ZXVlIGluIHBhZ2UgcmVjbGFpbS4gKi8KKwljdXJyZW50LT5iYWNraW5nX2Rldl9pbmZvID0gaW5vZGVfdG9fYmRpKHZpKTsKKwllcnIgPSBnZW5lcmljX3dyaXRlX2NoZWNrcyhmaWxlLCBwcG9zLCBjb3VudCwgU19JU0JMSyh2aS0+aV9tb2RlKSk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCWdvdG8gb3V0OworCS8qCisJICogQWxsIGNoZWNrcyBoYXZlIHBhc3NlZC4gIEJlZm9yZSB3ZSBzdGFydCBkb2luZyBhbnkgd3JpdGluZyB3ZSB3YW50CisJICogdG8gYWJvcnQgYW55IHRvdGFsbHkgaWxsZWdhbCB3cml0ZXMuCisJICovCisJQlVHX09OKE5Jbm9Nc3RQcm90ZWN0ZWQobmkpKTsKKwlCVUdfT04obmktPnR5cGUgIT0gQVRfREFUQSk7CisJLyogSWYgZmlsZSBpcyBlbmNyeXB0ZWQsIGRlbnkgYWNjZXNzLCBqdXN0IGxpa2UgTlQ0LiAqLworCWlmIChOSW5vRW5jcnlwdGVkKG5pKSkgeworCQkvKiBPbmx5ICREQVRBIGF0dHJpYnV0ZXMgY2FuIGJlIGVuY3J5cHRlZC4gKi8KKwkJLyoKKwkJICogUmVtaW5kZXIgZm9yIGxhdGVyOiBFbmNyeXB0ZWQgZmlsZXMgYXJlIF9hbHdheXNfCisJCSAqIG5vbi1yZXNpZGVudCBzbyB0aGF0IHRoZSBjb250ZW50IGNhbiBhbHdheXMgYmUgZW5jcnlwdGVkLgorCQkgKi8KKwkJbnRmc19kZWJ1ZygiRGVueWluZyB3cml0ZSBhY2Nlc3MgdG8gZW5jcnlwdGVkIGZpbGUuIik7CisJCWVyciA9IC1FQUNDRVM7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoTklub0NvbXByZXNzZWQobmkpKSB7CisJCS8qIE9ubHkgdW5uYW1lZCAkREFUQSBhdHRyaWJ1dGUgY2FuIGJlIGNvbXByZXNzZWQuICovCisJCUJVR19PTihuaS0+bmFtZV9sZW4pOworCQkvKgorCQkgKiBSZW1pbmRlciBmb3IgbGF0ZXI6IElmIHJlc2lkZW50LCB0aGUgZGF0YSBpcyBub3QgYWN0dWFsbHkKKwkJICogY29tcHJlc3NlZC4gIE9ubHkgb24gdGhlIHN3aXRjaCB0byBub24tcmVzaWRlbnQgZG9lcworCQkgKiBjb21wcmVzc2lvbiBraWNrIGluLiAgVGhpcyBpcyBpbiBjb250cmFzdCB0byBlbmNyeXB0ZWQgZmlsZXMKKwkJICogKHNlZSBhYm92ZSkuCisJCSAqLworCQludGZzX2Vycm9yKHZpLT5pX3NiLCAiV3JpdGluZyB0byBjb21wcmVzc2VkIGZpbGVzIGlzIG5vdCAiCisJCQkJImltcGxlbWVudGVkIHlldC4gIFNvcnJ5LiIpOworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBvdXQ7CisJfQorCWlmICgqY291bnQgPT0gMCkKKwkJZ290byBvdXQ7CisJYmFzZV9uaSA9IG5pOworCWlmIChOSW5vQXR0cihuaSkpCisJCWJhc2VfbmkgPSBuaS0+ZXh0LmJhc2VfbnRmc19pbm87CisJZXJyID0gZmlsZV9yZW1vdmVfc3VpZChmaWxlKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJZ290byBvdXQ7CisJLyoKKwkgKiBPdXIgLT51cGRhdGVfdGltZSBtZXRob2QgYWx3YXlzIHN1Y2NlZWRzIHRodXMgZmlsZV91cGRhdGVfdGltZSgpCisJICogY2Fubm90IGZhaWwgZWl0aGVyIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybiBjb2RlLgorCSAqLworCWZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7CisJcG9zID0gKnBwb3M7CisJLyogVGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIGxhc3QgY2x1c3RlciBiZWluZyB3cml0dGVuIHRvLiAqLworCWVuZCA9IChwb3MgKyAqY291bnQgKyB2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrKSAmCisJCQl+KHU2NCl2b2wtPmNsdXN0ZXJfc2l6ZV9tYXNrOworCS8qCisJICogSWYgdGhlIHdyaXRlIGdvZXMgYmV5b25kIHRoZSBhbGxvY2F0ZWQgc2l6ZSwgZXh0ZW5kIHRoZSBhbGxvY2F0aW9uCisJICogdG8gY292ZXIgdGhlIHdob2xlIG9mIHRoZSB3cml0ZSwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBjbHVzdGVyLgorCSAqLworCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJbGwgPSBuaS0+YWxsb2NhdGVkX3NpemU7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOworCWlmIChlbmQgPiBsbCkgeworCQkvKgorCQkgKiBFeHRlbmQgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBjaGFuZ2luZyB0aGUgZGF0YSBzaXplLgorCQkgKgorCQkgKiBOb3RlIHdlIGVuc3VyZSB0aGUgYWxsb2NhdGlvbiBpcyBiaWcgZW5vdWdoIHRvIGF0IGxlYXN0CisJCSAqIHdyaXRlIHNvbWUgZGF0YSBidXQgd2UgZG8gbm90IHJlcXVpcmUgdGhlIGFsbG9jYXRpb24gdG8gYmUKKwkJICogY29tcGxldGUsIGkuZS4gaXQgbWF5IGJlIHBhcnRpYWwuCisJCSAqLworCQlsbCA9IG50ZnNfYXR0cl9leHRlbmRfYWxsb2NhdGlvbihuaSwgZW5kLCAtMSwgcG9zKTsKKwkJaWYgKGxpa2VseShsbCA+PSAwKSkgeworCQkJQlVHX09OKHBvcyA+PSBsbCk7CisJCQkvKiBJZiB0aGUgZXh0ZW5zaW9uIHdhcyBwYXJ0aWFsIHRydW5jYXRlIHRoZSB3cml0ZS4gKi8KKwkJCWlmIChlbmQgPiBsbCkgeworCQkJCW50ZnNfZGVidWcoIlRydW5jYXRpbmcgd3JpdGUgdG8gaW5vZGUgMHglbHgsICIKKwkJCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4LCBiZWNhdXNlICIKKwkJCQkJCSJ0aGUgYWxsb2NhdGlvbiB3YXMgb25seSAiCisJCQkJCQkicGFydGlhbGx5IGV4dGVuZGVkLiIsCisJCQkJCQl2aS0+aV9pbm8sICh1bnNpZ25lZCkKKwkJCQkJCWxlMzJfdG9fY3B1KG5pLT50eXBlKSk7CisJCQkJKmNvdW50ID0gbGwgLSBwb3M7CisJCQl9CisJCX0gZWxzZSB7CisJCQllcnIgPSBsbDsKKwkJCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJCQlsbCA9IG5pLT5hbGxvY2F0ZWRfc2l6ZTsKKwkJCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKKwkJCS8qIFBlcmZvcm0gYSBwYXJ0aWFsIHdyaXRlIGlmIHBvc3NpYmxlIG9yIGZhaWwuICovCisJCQlpZiAocG9zIDwgbGwpIHsKKwkJCQludGZzX2RlYnVnKCJUcnVuY2F0aW5nIHdyaXRlIHRvIGlub2RlIDB4JWx4ICIKKwkJCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4LCBiZWNhdXNlICIKKwkJCQkJCSJleHRlbmRpbmcgdGhlIGFsbG9jYXRpb24gIgorCQkJCQkJImZhaWxlZCAoZXJyb3IgJWQpLiIsCisJCQkJCQl2aS0+aV9pbm8sICh1bnNpZ25lZCkKKwkJCQkJCWxlMzJfdG9fY3B1KG5pLT50eXBlKSwKKwkJCQkJCShpbnQpLWVycik7CisJCQkJKmNvdW50ID0gbGwgLSBwb3M7CisJCQl9IGVsc2UgeworCQkJCWlmIChlcnIgIT0gLUVOT1NQQykKKwkJCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkNhbm5vdCBwZXJmb3JtICIKKwkJCQkJCQkid3JpdGUgdG8gaW5vZGUgIgorCQkJCQkJCSIweCVseCwgYXR0cmlidXRlICIKKwkJCQkJCQkidHlwZSAweCV4LCBiZWNhdXNlICIKKwkJCQkJCQkiZXh0ZW5kaW5nIHRoZSAiCisJCQkJCQkJImFsbG9jYXRpb24gZmFpbGVkICIKKwkJCQkJCQkiKGVycm9yICVsZCkuIiwKKwkJCQkJCQl2aS0+aV9pbm8sICh1bnNpZ25lZCkKKwkJCQkJCQlsZTMyX3RvX2NwdShuaS0+dHlwZSksCisJCQkJCQkJKGxvbmcpLWVycik7CisJCQkJZWxzZQorCQkJCQludGZzX2RlYnVnKCJDYW5ub3QgcGVyZm9ybSB3cml0ZSB0byAiCisJCQkJCQkJImlub2RlIDB4JWx4LCAiCisJCQkJCQkJImF0dHJpYnV0ZSB0eXBlIDB4JXgsICIKKwkJCQkJCQkiYmVjYXVzZSB0aGVyZSBpcyBub3QgIgorCQkJCQkJCSJzcGFjZSBsZWZ0LiIsCisJCQkJCQkJdmktPmlfaW5vLCAodW5zaWduZWQpCisJCQkJCQkJbGUzMl90b19jcHUobmktPnR5cGUpKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKwkvKgorCSAqIElmIHRoZSB3cml0ZSBzdGFydHMgYmV5b25kIHRoZSBpbml0aWFsaXplZCBzaXplLCBleHRlbmQgaXQgdXAgdG8gdGhlCisJICogYmVnaW5uaW5nIG9mIHRoZSB3cml0ZSBhbmQgaW5pdGlhbGl6ZSBhbGwgbm9uLXNwYXJzZSBzcGFjZSBiZXR3ZWVuCisJICogdGhlIG9sZCBpbml0aWFsaXplZCBzaXplIGFuZCB0aGUgbmV3IG9uZS4gIFRoaXMgYXV0b21hdGljYWxseSBhbHNvCisJICogaW5jcmVtZW50cyB0aGUgdmZzIGlub2RlLT5pX3NpemUgdG8ga2VlcCBpdCBhYm92ZSBvciBlcXVhbCB0byB0aGUKKwkgKiBpbml0aWFsaXplZF9zaXplLgorCSAqLworCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJbGwgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7CisJaWYgKHBvcyA+IGxsKSB7CisJCS8qCisJCSAqIFdhaXQgZm9yIG9uZ29pbmcgZGlyZWN0IGkvbyB0byBjb21wbGV0ZSBiZWZvcmUgcHJvY2VlZGluZy4KKwkJICogTmV3IGRpcmVjdCBpL28gY2Fubm90IHN0YXJ0IGFzIHdlIGhvbGQgaV9tdXRleC4KKwkJICovCisJCWlub2RlX2Rpb193YWl0KHZpKTsKKwkJZXJyID0gbnRmc19hdHRyX2V4dGVuZF9pbml0aWFsaXplZChuaSwgcG9zKTsKKwkJaWYgKHVubGlrZWx5KGVyciA8IDApKQorCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIkNhbm5vdCBwZXJmb3JtIHdyaXRlIHRvIGlub2RlICIKKwkJCQkJIjB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBiZWNhdXNlICIKKwkJCQkJImV4dGVuZGluZyB0aGUgaW5pdGlhbGl6ZWQgc2l6ZSAiCisJCQkJCSJmYWlsZWQgKGVycm9yICVkKS4iLCB2aS0+aV9pbm8sCisJCQkJCSh1bnNpZ25lZClsZTMyX3RvX2NwdShuaS0+dHlwZSksCisJCQkJCShpbnQpLWVycik7CisJfQorb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIC8qKgpAQCAtNDIxLDggKzUyNiw4IEBACiAJCQkJCWdvdG8gZXJyX291dDsKIAkJCQl9CiAJCQl9Ci0JCQllcnIgPSBhZGRfdG9fcGFnZV9jYWNoZV9scnUoKmNhY2hlZF9wYWdlLCBtYXBwaW5nLCBpbmRleCwKLQkJCQkJR0ZQX0tFUk5FTCk7CisJCQllcnIgPSBhZGRfdG9fcGFnZV9jYWNoZV9scnUoKmNhY2hlZF9wYWdlLCBtYXBwaW5nLAorCQkJCQlpbmRleCwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAodW5saWtlbHkoZXJyKSkgewogCQkJCWlmIChlcnIgPT0gLUVFWElTVCkKIAkJCQkJY29udGludWU7CkBAIC0xMjY4LDE4MCArMTM3Myw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotLyoKLSAqIENvcHkgYXMgbXVjaCBhcyB3ZSBjYW4gaW50byB0aGUgcGFnZXMgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoCi0gKiB3ZXJlIHN1Y2Nlc3NmdWxseSBjb3BpZWQuICBJZiBhIGZhdWx0IGlzIGVuY291bnRlcmVkIHRoZW4gY2xlYXIgdGhlIHBhZ2VzCi0gKiBvdXQgdG8gKG9mcyArIGJ5dGVzKSBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2hpY2ggd2VyZSBjb3BpZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IG50ZnNfY29weV9mcm9tX3VzZXIoc3RydWN0IHBhZ2UgKipwYWdlcywKLQkJdW5zaWduZWQgbnJfcGFnZXMsIHVuc2lnbmVkIG9mcywgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKLQkJc2l6ZV90IGJ5dGVzKQotewotCXN0cnVjdCBwYWdlICoqbGFzdF9wYWdlID0gcGFnZXMgKyBucl9wYWdlczsKLQljaGFyICphZGRyOwotCXNpemVfdCB0b3RhbCA9IDA7Ci0JdW5zaWduZWQgbGVuOwotCWludCBsZWZ0OwotCi0JZG8gewotCQlsZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZnM7Ci0JCWlmIChsZW4gPiBieXRlcykKLQkJCWxlbiA9IGJ5dGVzOwotCQlhZGRyID0ga21hcF9hdG9taWMoKnBhZ2VzKTsKLQkJbGVmdCA9IF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoYWRkciArIG9mcywgYnVmLCBsZW4pOwotCQlrdW5tYXBfYXRvbWljKGFkZHIpOwotCQlpZiAodW5saWtlbHkobGVmdCkpIHsKLQkJCS8qIERvIGl0IHRoZSBzbG93IHdheS4gKi8KLQkJCWFkZHIgPSBrbWFwKCpwYWdlcyk7Ci0JCQlsZWZ0ID0gX19jb3B5X2Zyb21fdXNlcihhZGRyICsgb2ZzLCBidWYsIGxlbik7Ci0JCQlrdW5tYXAoKnBhZ2VzKTsKLQkJCWlmICh1bmxpa2VseShsZWZ0KSkKLQkJCQlnb3RvIGVycl9vdXQ7Ci0JCX0KLQkJdG90YWwgKz0gbGVuOwotCQlieXRlcyAtPSBsZW47Ci0JCWlmICghYnl0ZXMpCi0JCQlicmVhazsKLQkJYnVmICs9IGxlbjsKLQkJb2ZzID0gMDsKLQl9IHdoaWxlICgrK3BhZ2VzIDwgbGFzdF9wYWdlKTsKLW91dDoKLQlyZXR1cm4gdG90YWw7Ci1lcnJfb3V0OgotCXRvdGFsICs9IGxlbiAtIGxlZnQ7Ci0JLyogWmVybyB0aGUgcmVzdCBvZiB0aGUgdGFyZ2V0IGxpa2UgX19jb3B5X2Zyb21fdXNlcigpLiAqLwotCXdoaWxlICgrK3BhZ2VzIDwgbGFzdF9wYWdlKSB7Ci0JCWJ5dGVzIC09IGxlbjsKLQkJaWYgKCFieXRlcykKLQkJCWJyZWFrOwotCQlsZW4gPSBQQUdFX0NBQ0hFX1NJWkU7Ci0JCWlmIChsZW4gPiBieXRlcykKLQkJCWxlbiA9IGJ5dGVzOwotCQl6ZXJvX3VzZXIoKnBhZ2VzLCAwLCBsZW4pOwotCX0KLQlnb3RvIG91dDsKLX0KLQotc3RhdGljIHNpemVfdCBfX250ZnNfY29weV9mcm9tX3VzZXJfaW92ZWNfaW5hdG9taWMoY2hhciAqdmFkZHIsCi0JCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBzaXplX3QgaW92X29mcywgc2l6ZV90IGJ5dGVzKQotewotCXNpemVfdCB0b3RhbCA9IDA7Ci0KLQl3aGlsZSAoMSkgewotCQljb25zdCBjaGFyIF9fdXNlciAqYnVmID0gaW92LT5pb3ZfYmFzZSArIGlvdl9vZnM7Ci0JCXVuc2lnbmVkIGxlbjsKLQkJc2l6ZV90IGxlZnQ7Ci0KLQkJbGVuID0gaW92LT5pb3ZfbGVuIC0gaW92X29mczsKLQkJaWYgKGxlbiA+IGJ5dGVzKQotCQkJbGVuID0gYnl0ZXM7Ci0JCWxlZnQgPSBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKHZhZGRyLCBidWYsIGxlbik7Ci0JCXRvdGFsICs9IGxlbjsKLQkJYnl0ZXMgLT0gbGVuOwotCQl2YWRkciArPSBsZW47Ci0JCWlmICh1bmxpa2VseShsZWZ0KSkgewotCQkJdG90YWwgLT0gbGVmdDsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmICghYnl0ZXMpCi0JCQlicmVhazsKLQkJaW92Kys7Ci0JCWlvdl9vZnMgPSAwOwotCX0KLQlyZXR1cm4gdG90YWw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBudGZzX3NldF9uZXh0X2lvdmVjKGNvbnN0IHN0cnVjdCBpb3ZlYyAqKmlvdnAsCi0JCXNpemVfdCAqaW92X29mc3AsIHNpemVfdCBieXRlcykKLXsKLQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiA9ICppb3ZwOwotCXNpemVfdCBpb3Zfb2ZzID0gKmlvdl9vZnNwOwotCi0Jd2hpbGUgKGJ5dGVzKSB7Ci0JCXVuc2lnbmVkIGxlbjsKLQotCQlsZW4gPSBpb3YtPmlvdl9sZW4gLSBpb3Zfb2ZzOwotCQlpZiAobGVuID4gYnl0ZXMpCi0JCQlsZW4gPSBieXRlczsKLQkJYnl0ZXMgLT0gbGVuOwotCQlpb3Zfb2ZzICs9IGxlbjsKLQkJaWYgKGlvdi0+aW92X2xlbiA9PSBpb3Zfb2ZzKSB7Ci0JCQlpb3YrKzsKLQkJCWlvdl9vZnMgPSAwOwotCQl9Ci0JfQotCSppb3ZwID0gaW92OwotCSppb3Zfb2ZzcCA9IGlvdl9vZnM7Ci19Ci0KLS8qCi0gKiBUaGlzIGhhcyB0aGUgc2FtZSBzaWRlLWVmZmVjdHMgYW5kIHJldHVybiB2YWx1ZSBhcyBudGZzX2NvcHlfZnJvbV91c2VyKCkuCi0gKiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IG9uIGEgZmF1bHQgd2UgbmVlZCB0byBtZW1zZXQgdGhlIHJlbWFpbmRlciBvZiB0aGUKLSAqIHBhZ2VzIChvdXQgdG8gb2Zmc2V0ICsgYnl0ZXMpLCB0byBlbXVsYXRlIG50ZnNfY29weV9mcm9tX3VzZXIoKSdzCi0gKiBzaW5nbGUtc2VnbWVudCBiZWhhdmlvdXIuCi0gKgotICogV2UgY2FsbCB0aGUgc2FtZSBoZWxwZXIgKF9fbnRmc19jb3B5X2Zyb21fdXNlcl9pb3ZlY19pbmF0b21pYygpKSBib3RoIHdoZW4KLSAqIGF0b21pYyBhbmQgd2hlbiBub3QgYXRvbWljLiAgVGhpcyBpcyBvayBiZWNhdXNlIGl0IGNhbGxzCi0gKiBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCkgYW5kIGl0IGlzIG9rIHRvIGNhbGwgdGhpcyB3aGVuIG5vbi1hdG9taWMuICBJbgotICogZmFjdCwgdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoKSBhbmQKLSAqIF9fY29weV9mcm9tX3VzZXIoKSBpcyB0aGF0IHRoZSBsYXR0ZXIgY2FsbHMgbWlnaHRfc2xlZXAoKSBhbmQgdGhlIGZvcm1lcgotICogc2hvdWxkIG5vdCB6ZXJvIHRoZSB0YWlsIG9mIHRoZSBidWZmZXIgb24gZXJyb3IuICBBbmQgb24gbWFueSBhcmNoaXRlY3R1cmVzCi0gKiBfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljKCkgaXMganVzdCBkZWZpbmVkIHRvIF9fY29weV9mcm9tX3VzZXIoKSBzbyBpdAotICogbWFrZXMgbm8gZGlmZmVyZW5jZSBhdCBhbGwgb24gdGhvc2UgYXJjaGl0ZWN0dXJlcy4KLSAqLwotc3RhdGljIGlubGluZSBzaXplX3QgbnRmc19jb3B5X2Zyb21fdXNlcl9pb3ZlYyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAotCQl1bnNpZ25lZCBucl9wYWdlcywgdW5zaWduZWQgb2ZzLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKippb3YsCi0JCXNpemVfdCAqaW92X29mcywgc2l6ZV90IGJ5dGVzKQotewotCXN0cnVjdCBwYWdlICoqbGFzdF9wYWdlID0gcGFnZXMgKyBucl9wYWdlczsKLQljaGFyICphZGRyOwotCXNpemVfdCBjb3BpZWQsIGxlbiwgdG90YWwgPSAwOwotCi0JZG8gewotCQlsZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLSBvZnM7Ci0JCWlmIChsZW4gPiBieXRlcykKLQkJCWxlbiA9IGJ5dGVzOwotCQlhZGRyID0ga21hcF9hdG9taWMoKnBhZ2VzKTsKLQkJY29waWVkID0gX19udGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjX2luYXRvbWljKGFkZHIgKyBvZnMsCi0JCQkJKmlvdiwgKmlvdl9vZnMsIGxlbik7Ci0JCWt1bm1hcF9hdG9taWMoYWRkcik7Ci0JCWlmICh1bmxpa2VseShjb3BpZWQgIT0gbGVuKSkgewotCQkJLyogRG8gaXQgdGhlIHNsb3cgd2F5LiAqLwotCQkJYWRkciA9IGttYXAoKnBhZ2VzKTsKLQkJCWNvcGllZCA9IF9fbnRmc19jb3B5X2Zyb21fdXNlcl9pb3ZlY19pbmF0b21pYyhhZGRyICsKLQkJCQkJb2ZzLCAqaW92LCAqaW92X29mcywgbGVuKTsKLQkJCWlmICh1bmxpa2VseShjb3BpZWQgIT0gbGVuKSkKLQkJCQlnb3RvIGVycl9vdXQ7Ci0JCQlrdW5tYXAoKnBhZ2VzKTsKLQkJfQotCQl0b3RhbCArPSBsZW47Ci0JCW50ZnNfc2V0X25leHRfaW92ZWMoaW92LCBpb3Zfb2ZzLCBsZW4pOwotCQlieXRlcyAtPSBsZW47Ci0JCWlmICghYnl0ZXMpCi0JCQlicmVhazsKLQkJb2ZzID0gMDsKLQl9IHdoaWxlICgrK3BhZ2VzIDwgbGFzdF9wYWdlKTsKLW91dDoKLQlyZXR1cm4gdG90YWw7Ci1lcnJfb3V0OgotCUJVR19PTihjb3BpZWQgPiBsZW4pOwotCS8qIFplcm8gdGhlIHJlc3Qgb2YgdGhlIHRhcmdldCBsaWtlIF9fY29weV9mcm9tX3VzZXIoKS4gKi8KLQltZW1zZXQoYWRkciArIG9mcyArIGNvcGllZCwgMCwgbGVuIC0gY29waWVkKTsKLQlrdW5tYXAoKnBhZ2VzKTsKLQl0b3RhbCArPSBjb3BpZWQ7Ci0JbnRmc19zZXRfbmV4dF9pb3ZlYyhpb3YsIGlvdl9vZnMsIGNvcGllZCk7Ci0Jd2hpbGUgKCsrcGFnZXMgPCBsYXN0X3BhZ2UpIHsKLQkJYnl0ZXMgLT0gbGVuOwotCQlpZiAoIWJ5dGVzKQotCQkJYnJlYWs7Ci0JCWxlbiA9IFBBR0VfQ0FDSEVfU0laRTsKLQkJaWYgKGxlbiA+IGJ5dGVzKQotCQkJbGVuID0gYnl0ZXM7Ci0JCXplcm9fdXNlcigqcGFnZXMsIDAsIGxlbik7Ci0JfQotCWdvdG8gb3V0OwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgbnRmc19mbHVzaF9kY2FjaGVfcGFnZXMoc3RydWN0IHBhZ2UgKipwYWdlcywKIAkJdW5zaWduZWQgbnJfcGFnZXMpCiB7CkBAIC0xNzYyLDg2ICsxNjkzLDgzIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgbnRmc193cml0ZV9mYWlsZWQoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsIGxvZmZfdCB0bykKKy8qCisgKiBDb3B5IGFzIG11Y2ggYXMgd2UgY2FuIGludG8gdGhlIHBhZ2VzIGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3aGljaAorICogd2VyZSBzdWNjZXNzZnVsbHkgY29waWVkLiAgSWYgYSBmYXVsdCBpcyBlbmNvdW50ZXJlZCB0aGVuIGNsZWFyIHRoZSBwYWdlcworICogb3V0IHRvIChvZnMgKyBieXRlcykgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIHdlcmUgY29waWVkLgorICovCitzdGF0aWMgc2l6ZV90IG50ZnNfY29weV9mcm9tX3VzZXJfaXRlcihzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBucl9wYWdlcywKKwkJdW5zaWduZWQgb2ZzLCBzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcykKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKKwlzdHJ1Y3QgcGFnZSAqKmxhc3RfcGFnZSA9IHBhZ2VzICsgbnJfcGFnZXM7CisJc2l6ZV90IHRvdGFsID0gMDsKKwlzdHJ1Y3QgaW92X2l0ZXIgZGF0YSA9ICppOworCXVuc2lnbmVkIGxlbiwgY29waWVkOwogCi0JaWYgKHRvID4gaW5vZGUtPmlfc2l6ZSkgewotCQl0cnVuY2F0ZV9wYWdlY2FjaGUoaW5vZGUsIGlub2RlLT5pX3NpemUpOwotCQludGZzX3RydW5jYXRlX3Zmcyhpbm9kZSk7Ci0JfQorCWRvIHsKKwkJbGVuID0gUEFHRV9DQUNIRV9TSVpFIC0gb2ZzOworCQlpZiAobGVuID4gYnl0ZXMpCisJCQlsZW4gPSBieXRlczsKKwkJY29waWVkID0gaW92X2l0ZXJfY29weV9mcm9tX3VzZXJfYXRvbWljKCpwYWdlcywgJmRhdGEsIG9mcywKKwkJCQlsZW4pOworCQl0b3RhbCArPSBjb3BpZWQ7CisJCWJ5dGVzIC09IGNvcGllZDsKKwkJaWYgKCFieXRlcykKKwkJCWJyZWFrOworCQlpb3ZfaXRlcl9hZHZhbmNlKCZkYXRhLCBjb3BpZWQpOworCQlpZiAoY29waWVkIDwgbGVuKQorCQkJZ290byBlcnI7CisJCW9mcyA9IDA7CisJfSB3aGlsZSAoKytwYWdlcyA8IGxhc3RfcGFnZSk7CitvdXQ6CisJcmV0dXJuIHRvdGFsOworZXJyOgorCS8qIFplcm8gdGhlIHJlc3Qgb2YgdGhlIHRhcmdldCBsaWtlIF9fY29weV9mcm9tX3VzZXIoKS4gKi8KKwlsZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLSBjb3BpZWQ7CisJZG8geworCQlpZiAobGVuID4gYnl0ZXMpCisJCQlsZW4gPSBieXRlczsKKwkJemVyb191c2VyKCpwYWdlcywgY29waWVkLCBsZW4pOworCQlieXRlcyAtPSBsZW47CisJCWNvcGllZCA9IDA7CisJCWxlbiA9IFBBR0VfQ0FDSEVfU0laRTsKKwl9IHdoaWxlICgrK3BhZ2VzIDwgbGFzdF9wYWdlKTsKKwlnb3RvIG91dDsKIH0KIAogLyoqCi0gKiBudGZzX2ZpbGVfYnVmZmVyZWRfd3JpdGUgLQotICoKLSAqIExvY2tpbmc6IFRoZSB2ZnMgaXMgaG9sZGluZyAtPmlfbXV0ZXggb24gdGhlIGlub2RlLgorICogbnRmc19wZXJmb3JtX3dyaXRlIC0gcGVyZm9ybSBidWZmZXJlZCB3cml0ZSB0byBhIGZpbGUKKyAqIEBmaWxlOglmaWxlIHRvIHdyaXRlIHRvCisgKiBAaToJCWlvdl9pdGVyIHdpdGggZGF0YSB0byB3cml0ZQorICogQHBvczoJYnl0ZSBvZmZzZXQgaW4gZmlsZSBhdCB3aGljaCB0byBiZWdpbiB3cml0aW5nIHRvCiAgKi8KLXN0YXRpYyBzc2l6ZV90IG50ZnNfZmlsZV9idWZmZXJlZF93cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsCi0JCWxvZmZfdCBwb3MsIGxvZmZfdCAqcHBvcywgc2l6ZV90IGNvdW50KQorc3RhdGljIHNzaXplX3QgbnRmc19wZXJmb3JtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgaW92X2l0ZXIgKmksCisJCWxvZmZfdCBwb3MpCiB7Ci0Jc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gZmlsZS0+Zl9tYXBwaW5nOwogCXN0cnVjdCBpbm9kZSAqdmkgPSBtYXBwaW5nLT5ob3N0OwogCW50ZnNfaW5vZGUgKm5pID0gTlRGU19JKHZpKTsKIAludGZzX3ZvbHVtZSAqdm9sID0gbmktPnZvbDsKIAlzdHJ1Y3QgcGFnZSAqcGFnZXNbTlRGU19NQVhfUEFHRVNfUEVSX0NMVVNURVJdOwogCXN0cnVjdCBwYWdlICpjYWNoZWRfcGFnZSA9IE5VTEw7Ci0JY2hhciBfX3VzZXIgKmJ1ZiA9IE5VTEw7Ci0JczY0IGVuZCwgbGw7CiAJVkNOIGxhc3RfdmNuOwogCUxDTiBsY247Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzaXplX3QgYnl0ZXMsIGlvdl9vZnMgPSAwOwkvKiBPZmZzZXQgaW4gdGhlIGN1cnJlbnQgaW92ZWMuICovCi0Jc3NpemVfdCBzdGF0dXMsIHdyaXR0ZW47CisJc2l6ZV90IGJ5dGVzOworCXNzaXplX3Qgc3RhdHVzLCB3cml0dGVuID0gMDsKIAl1bnNpZ25lZCBucl9wYWdlczsKLQlpbnQgZXJyOwogCi0JbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlfaW5vIDB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCAiCi0JCQkicG9zIDB4JWxseCwgY291bnQgMHglbHguIiwKLQkJCXZpLT5pX2lubywgKHVuc2lnbmVkKWxlMzJfdG9fY3B1KG5pLT50eXBlKSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcG9zLCAodW5zaWduZWQgbG9uZyljb3VudCk7Ci0JaWYgKHVubGlrZWx5KCFjb3VudCkpCi0JCXJldHVybiAwOwotCUJVR19PTihOSW5vTXN0UHJvdGVjdGVkKG5pKSk7Ci0JLyoKLQkgKiBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBhbiBpbmRleCByb290IGFuZCBpdCBpcyBlbmNyeXB0ZWQgb3IKLQkgKiBjb21wcmVzc2VkLCB3ZSBjYW5ub3Qgd3JpdGUgdG8gaXQgeWV0LiAgTm90ZSB3ZSBuZWVkIHRvIGNoZWNrIGZvcgotCSAqIEFUX0lOREVYX0FMTE9DQVRJT04gc2luY2UgdGhpcyBpcyB0aGUgdHlwZSBvZiBib3RoIGRpcmVjdG9yeSBhbmQKLQkgKiBpbmRleCBpbm9kZXMuCi0JICovCi0JaWYgKG5pLT50eXBlICE9IEFUX0lOREVYX0FMTE9DQVRJT04pIHsKLQkJLyogSWYgZmlsZSBpcyBlbmNyeXB0ZWQsIGRlbnkgYWNjZXNzLCBqdXN0IGxpa2UgTlQ0LiAqLwotCQlpZiAoTklub0VuY3J5cHRlZChuaSkpIHsKLQkJCS8qCi0JCQkgKiBSZW1pbmRlciBmb3IgbGF0ZXI6IEVuY3J5cHRlZCBmaWxlcyBhcmUgX2Fsd2F5c18KLQkJCSAqIG5vbi1yZXNpZGVudCBzbyB0aGF0IHRoZSBjb250ZW50IGNhbiBhbHdheXMgYmUKLQkJCSAqIGVuY3J5cHRlZC4KLQkJCSAqLwotCQkJbnRmc19kZWJ1ZygiRGVueWluZyB3cml0ZSBhY2Nlc3MgdG8gZW5jcnlwdGVkIGZpbGUuIik7Ci0JCQlyZXR1cm4gLUVBQ0NFUzsKLQkJfQotCQlpZiAoTklub0NvbXByZXNzZWQobmkpKSB7Ci0JCQkvKiBPbmx5IHVubmFtZWQgJERBVEEgYXR0cmlidXRlIGNhbiBiZSBjb21wcmVzc2VkLiAqLwotCQkJQlVHX09OKG5pLT50eXBlICE9IEFUX0RBVEEpOwotCQkJQlVHX09OKG5pLT5uYW1lX2xlbik7Ci0JCQkvKgotCQkJICogUmVtaW5kZXIgZm9yIGxhdGVyOiBJZiByZXNpZGVudCwgdGhlIGRhdGEgaXMgbm90Ci0JCQkgKiBhY3R1YWxseSBjb21wcmVzc2VkLiAgT25seSBvbiB0aGUgc3dpdGNoIHRvIG5vbi0KLQkJCSAqIHJlc2lkZW50IGRvZXMgY29tcHJlc3Npb24ga2ljayBpbi4gIFRoaXMgaXMgaW4KLQkJCSAqIGNvbnRyYXN0IHRvIGVuY3J5cHRlZCBmaWxlcyAoc2VlIGFib3ZlKS4KLQkJCSAqLwotCQkJbnRmc19lcnJvcih2aS0+aV9zYiwgIldyaXRpbmcgdG8gY29tcHJlc3NlZCBmaWxlcyBpcyAiCi0JCQkJCSJub3QgaW1wbGVtZW50ZWQgeWV0LiAgU29ycnkuIik7Ci0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCX0KLQl9CisJbnRmc19kZWJ1ZygiRW50ZXJpbmcgZm9yIGlfaW5vIDB4JWx4LCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBwb3MgIgorCQkJIjB4JWxseCwgY291bnQgMHglbHguIiwgdmktPmlfaW5vLAorCQkJKHVuc2lnbmVkKWxlMzJfdG9fY3B1KG5pLT50eXBlKSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcG9zLAorCQkJKHVuc2lnbmVkIGxvbmcpaW92X2l0ZXJfY291bnQoaSkpOwogCS8qCiAJICogSWYgYSBwcmV2aW91cyBudGZzX3RydW5jYXRlKCkgZmFpbGVkLCByZXBlYXQgaXQgYW5kIGFib3J0IGlmIGl0CiAJICogZmFpbHMgYWdhaW4uCiAJICovCiAJaWYgKHVubGlrZWx5KE5Jbm9UcnVuY2F0ZUZhaWxlZChuaSkpKSB7CisJCWludCBlcnI7CisKIAkJaW5vZGVfZGlvX3dhaXQodmkpOwogCQllcnIgPSBudGZzX3RydW5jYXRlKHZpKTsKIAkJaWYgKGVyciB8fCBOSW5vVHJ1bmNhdGVGYWlsZWQobmkpKSB7CkBAIC0xODU1LDgxICsxNzgzLDYgQEAKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9Ci0JLyogVGhlIGZpcnN0IGJ5dGUgYWZ0ZXIgdGhlIHdyaXRlLiAqLwotCWVuZCA9IHBvcyArIGNvdW50OwotCS8qCi0JICogSWYgdGhlIHdyaXRlIGdvZXMgYmV5b25kIHRoZSBhbGxvY2F0ZWQgc2l6ZSwgZXh0ZW5kIHRoZSBhbGxvY2F0aW9uCi0JICogdG8gY292ZXIgdGhlIHdob2xlIG9mIHRoZSB3cml0ZSwgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBjbHVzdGVyLgotCSAqLwotCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7Ci0JbGwgPSBuaS0+YWxsb2NhdGVkX3NpemU7Ci0JcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOwotCWlmIChlbmQgPiBsbCkgewotCQkvKiBFeHRlbmQgdGhlIGFsbG9jYXRpb24gd2l0aG91dCBjaGFuZ2luZyB0aGUgZGF0YSBzaXplLiAqLwotCQlsbCA9IG50ZnNfYXR0cl9leHRlbmRfYWxsb2NhdGlvbihuaSwgZW5kLCAtMSwgcG9zKTsKLQkJaWYgKGxpa2VseShsbCA+PSAwKSkgewotCQkJQlVHX09OKHBvcyA+PSBsbCk7Ci0JCQkvKiBJZiB0aGUgZXh0ZW5zaW9uIHdhcyBwYXJ0aWFsIHRydW5jYXRlIHRoZSB3cml0ZS4gKi8KLQkJCWlmIChlbmQgPiBsbCkgewotCQkJCW50ZnNfZGVidWcoIlRydW5jYXRpbmcgd3JpdGUgdG8gaW5vZGUgMHglbHgsICIKLQkJCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4LCBiZWNhdXNlICIKLQkJCQkJCSJ0aGUgYWxsb2NhdGlvbiB3YXMgb25seSAiCi0JCQkJCQkicGFydGlhbGx5IGV4dGVuZGVkLiIsCi0JCQkJCQl2aS0+aV9pbm8sICh1bnNpZ25lZCkKLQkJCQkJCWxlMzJfdG9fY3B1KG5pLT50eXBlKSk7Ci0JCQkJZW5kID0gbGw7Ci0JCQkJY291bnQgPSBsbCAtIHBvczsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWVyciA9IGxsOwotCQkJcmVhZF9sb2NrX2lycXNhdmUoJm5pLT5zaXplX2xvY2ssIGZsYWdzKTsKLQkJCWxsID0gbmktPmFsbG9jYXRlZF9zaXplOwotCQkJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmbmktPnNpemVfbG9jaywgZmxhZ3MpOwotCQkJLyogUGVyZm9ybSBhIHBhcnRpYWwgd3JpdGUgaWYgcG9zc2libGUgb3IgZmFpbC4gKi8KLQkJCWlmIChwb3MgPCBsbCkgewotCQkJCW50ZnNfZGVidWcoIlRydW5jYXRpbmcgd3JpdGUgdG8gaW5vZGUgMHglbHgsICIKLQkJCQkJCSJhdHRyaWJ1dGUgdHlwZSAweCV4LCBiZWNhdXNlICIKLQkJCQkJCSJleHRlbmRpbmcgdGhlIGFsbG9jYXRpb24gIgotCQkJCQkJImZhaWxlZCAoZXJyb3IgY29kZSAlaSkuIiwKLQkJCQkJCXZpLT5pX2lubywgKHVuc2lnbmVkKQotCQkJCQkJbGUzMl90b19jcHUobmktPnR5cGUpLCBlcnIpOwotCQkJCWVuZCA9IGxsOwotCQkJCWNvdW50ID0gbGwgLSBwb3M7Ci0JCQl9IGVsc2UgewotCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNhbm5vdCBwZXJmb3JtIHdyaXRlIHRvICIKLQkJCQkJCSJpbm9kZSAweCVseCwgYXR0cmlidXRlIHR5cGUgIgotCQkJCQkJIjB4JXgsIGJlY2F1c2UgZXh0ZW5kaW5nIHRoZSAiCi0JCQkJCQkiYWxsb2NhdGlvbiBmYWlsZWQgKGVycm9yICIKLQkJCQkJCSJjb2RlICVpKS4iLCB2aS0+aV9pbm8sCi0JCQkJCQkodW5zaWduZWQpCi0JCQkJCQlsZTMyX3RvX2NwdShuaS0+dHlwZSksIGVycik7Ci0JCQkJcmV0dXJuIGVycjsKLQkJCX0KLQkJfQotCX0KLQl3cml0dGVuID0gMDsKLQkvKgotCSAqIElmIHRoZSB3cml0ZSBzdGFydHMgYmV5b25kIHRoZSBpbml0aWFsaXplZCBzaXplLCBleHRlbmQgaXQgdXAgdG8gdGhlCi0JICogYmVnaW5uaW5nIG9mIHRoZSB3cml0ZSBhbmQgaW5pdGlhbGl6ZSBhbGwgbm9uLXNwYXJzZSBzcGFjZSBiZXR3ZWVuCi0JICogdGhlIG9sZCBpbml0aWFsaXplZCBzaXplIGFuZCB0aGUgbmV3IG9uZS4gIFRoaXMgYXV0b21hdGljYWxseSBhbHNvCi0JICogaW5jcmVtZW50cyB0aGUgdmZzIGlub2RlLT5pX3NpemUgdG8ga2VlcCBpdCBhYm92ZSBvciBlcXVhbCB0byB0aGUKLQkgKiBpbml0aWFsaXplZF9zaXplLgotCSAqLwotCXJlYWRfbG9ja19pcnFzYXZlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7Ci0JbGwgPSBuaS0+aW5pdGlhbGl6ZWRfc2l6ZTsKLQlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZuaS0+c2l6ZV9sb2NrLCBmbGFncyk7Ci0JaWYgKHBvcyA+IGxsKSB7Ci0JCWVyciA9IG50ZnNfYXR0cl9leHRlbmRfaW5pdGlhbGl6ZWQobmksIHBvcyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQludGZzX2Vycm9yKHZvbC0+c2IsICJDYW5ub3QgcGVyZm9ybSB3cml0ZSB0byBpbm9kZSAiCi0JCQkJCSIweCVseCwgYXR0cmlidXRlIHR5cGUgMHgleCwgYmVjYXVzZSAiCi0JCQkJCSJleHRlbmRpbmcgdGhlIGluaXRpYWxpemVkIHNpemUgIgotCQkJCQkiZmFpbGVkIChlcnJvciBjb2RlICVpKS4iLCB2aS0+aV9pbm8sCi0JCQkJCSh1bnNpZ25lZClsZTMyX3RvX2NwdShuaS0+dHlwZSksIGVycik7Ci0JCQlzdGF0dXMgPSBlcnI7Ci0JCQlnb3RvIGVycl9vdXQ7Ci0JCX0KLQl9CiAJLyoKIAkgKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBwYWdlcyBwZXIgY2x1c3RlciBmb3Igbm9uLXJlc2lkZW50CiAJICogYXR0cmlidXRlcy4KQEAgLTE5MzcsMTAgKzE3OTAsNyBAQAogCW5yX3BhZ2VzID0gMTsKIAlpZiAodm9sLT5jbHVzdGVyX3NpemUgPiBQQUdFX0NBQ0hFX1NJWkUgJiYgTklub05vblJlc2lkZW50KG5pKSkKIAkJbnJfcGFnZXMgPSB2b2wtPmNsdXN0ZXJfc2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCS8qIEZpbmFsbHksIHBlcmZvcm0gdGhlIGFjdHVhbCB3cml0ZS4gKi8KIAlsYXN0X3ZjbiA9IC0xOwotCWlmIChsaWtlbHkobnJfc2VncyA9PSAxKSkKLQkJYnVmID0gaW92LT5pb3ZfYmFzZTsKIAlkbyB7CiAJCVZDTiB2Y247CiAJCXBnb2ZmX3QgaWR4LCBzdGFydF9pZHg7CkBAIC0xOTY1LDEwICsxODE1LDEwIEBACiAJCQkJCQl2b2wtPmNsdXN0ZXJfc2l6ZV9iaXRzLCBmYWxzZSk7CiAJCQkJdXBfcmVhZCgmbmktPnJ1bmxpc3QubG9jayk7CiAJCQkJaWYgKHVubGlrZWx5KGxjbiA8IExDTl9IT0xFKSkgewotCQkJCQlzdGF0dXMgPSAtRUlPOwogCQkJCQlpZiAobGNuID09IExDTl9FTk9NRU0pCiAJCQkJCQlzdGF0dXMgPSAtRU5PTUVNOwotCQkJCQllbHNlCisJCQkJCWVsc2UgeworCQkJCQkJc3RhdHVzID0gLUVJTzsKIAkJCQkJCW50ZnNfZXJyb3Iodm9sLT5zYiwgIkNhbm5vdCAiCiAJCQkJCQkJInBlcmZvcm0gd3JpdGUgdG8gIgogCQkJCQkJCSJpbm9kZSAweCVseCwgIgpAQCAtMTk3Nyw2ICsxODI3LDcgQEAKIAkJCQkJCQkiaXMgY29ycnVwdC4iLAogCQkJCQkJCXZpLT5pX2lubywgKHVuc2lnbmVkKQogCQkJCQkJCWxlMzJfdG9fY3B1KG5pLT50eXBlKSk7CisJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWlmIChsY24gPT0gTENOX0hPTEUpIHsKQEAgLTE5ODksOCArMTg0MCw5IEBACiAJCQkJfQogCQkJfQogCQl9Ci0JCWlmIChieXRlcyA+IGNvdW50KQotCQkJYnl0ZXMgPSBjb3VudDsKKwkJaWYgKGJ5dGVzID4gaW92X2l0ZXJfY291bnQoaSkpCisJCQlieXRlcyA9IGlvdl9pdGVyX2NvdW50KGkpOworYWdhaW46CiAJCS8qCiAJCSAqIEJyaW5nIGluIHRoZSB1c2VyIHBhZ2UocykgdGhhdCB3ZSB3aWxsIGNvcHkgZnJvbSBfZmlyc3RfLgogCQkgKiBPdGhlcndpc2UgdGhlcmUgaXMgYSBuYXN0eSBkZWFkbG9jayBvbiBjb3B5aW5nIGZyb20gdGhlIHNhbWUKQEAgLTE5OTksMTAgKzE4NTEsMTAgQEAKIAkJICogcGFnZXMgYmVpbmcgc3dhcHBlZCBvdXQgYmV0d2VlbiB1cyBicmluZ2luZyB0aGVtIGludG8gbWVtb3J5CiAJCSAqIGFuZCBkb2luZyB0aGUgYWN0dWFsIGNvcHlpbmcuCiAJCSAqLwotCQlpZiAobGlrZWx5KG5yX3NlZ3MgPT0gMSkpCi0JCQludGZzX2ZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlKGJ1ZiwgYnl0ZXMpOwotCQllbHNlCi0JCQludGZzX2ZhdWx0X2luX3BhZ2VzX3JlYWRhYmxlX2lvdmVjKGlvdiwgaW92X29mcywgYnl0ZXMpOworCQlpZiAodW5saWtlbHkoaW92X2l0ZXJfZmF1bHRfaW5fbXVsdGlwYWdlc19yZWFkYWJsZShpLCBieXRlcykpKSB7CisJCQlzdGF0dXMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KIAkJLyogR2V0IGFuZCBsb2NrIEBkb19wYWdlcyBzdGFydGluZyBhdCBpbmRleCBAc3RhcnRfaWR4LiAqLwogCQlzdGF0dXMgPSBfX250ZnNfZ3JhYl9jYWNoZV9wYWdlcyhtYXBwaW5nLCBzdGFydF9pZHgsIGRvX3BhZ2VzLAogCQkJCXBhZ2VzLCAmY2FjaGVkX3BhZ2UpOwpAQCAtMjAxOCw1NiArMTg3MCw1NyBAQAogCQkJc3RhdHVzID0gbnRmc19wcmVwYXJlX3BhZ2VzX2Zvcl9ub25fcmVzaWRlbnRfd3JpdGUoCiAJCQkJCXBhZ2VzLCBkb19wYWdlcywgcG9zLCBieXRlcyk7CiAJCQlpZiAodW5saWtlbHkoc3RhdHVzKSkgewotCQkJCWxvZmZfdCBpX3NpemU7Ci0KIAkJCQlkbyB7CiAJCQkJCXVubG9ja19wYWdlKHBhZ2VzWy0tZG9fcGFnZXNdKTsKIAkJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2VzW2RvX3BhZ2VzXSk7CiAJCQkJfSB3aGlsZSAoZG9fcGFnZXMpOwotCQkJCS8qCi0JCQkJICogVGhlIHdyaXRlIHByZXBhcmF0aW9uIG1heSBoYXZlIGluc3RhbnRpYXRlZAotCQkJCSAqIGFsbG9jYXRlZCBzcGFjZSBvdXRzaWRlIGlfc2l6ZS4gIFRyaW0gdGhpcwotCQkJCSAqIG9mZiBhZ2Fpbi4gIFdlIGNhbiBpZ25vcmUgYW55IGVycm9ycyBpbiB0aGlzCi0JCQkJICogY2FzZSBhcyB3ZSB3aWxsIGp1c3QgYmUgd2Fpc3RpbmcgYSBiaXQgb2YKLQkJCQkgKiBhbGxvY2F0ZWQgc3BhY2UsIHdoaWNoIGlzIG5vdCBhIGRpc2FzdGVyLgotCQkJCSAqLwotCQkJCWlfc2l6ZSA9IGlfc2l6ZV9yZWFkKHZpKTsKLQkJCQlpZiAocG9zICsgYnl0ZXMgPiBpX3NpemUpIHsKLQkJCQkJbnRmc193cml0ZV9mYWlsZWQobWFwcGluZywgcG9zICsgYnl0ZXMpOwotCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KIAkJfQogCQl1ID0gKHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUKSAtIHBhZ2VzWzBdLT5pbmRleDsKLQkJaWYgKGxpa2VseShucl9zZWdzID09IDEpKSB7Ci0JCQljb3BpZWQgPSBudGZzX2NvcHlfZnJvbV91c2VyKHBhZ2VzICsgdSwgZG9fcGFnZXMgLSB1LAotCQkJCQlvZnMsIGJ1ZiwgYnl0ZXMpOwotCQkJYnVmICs9IGNvcGllZDsKLQkJfSBlbHNlCi0JCQljb3BpZWQgPSBudGZzX2NvcHlfZnJvbV91c2VyX2lvdmVjKHBhZ2VzICsgdSwKLQkJCQkJZG9fcGFnZXMgLSB1LCBvZnMsICZpb3YsICZpb3Zfb2ZzLAotCQkJCQlieXRlcyk7CisJCWNvcGllZCA9IG50ZnNfY29weV9mcm9tX3VzZXJfaXRlcihwYWdlcyArIHUsIGRvX3BhZ2VzIC0gdSwgb2ZzLAorCQkJCQlpLCBieXRlcyk7CiAJCW50ZnNfZmx1c2hfZGNhY2hlX3BhZ2VzKHBhZ2VzICsgdSwgZG9fcGFnZXMgLSB1KTsKLQkJc3RhdHVzID0gbnRmc19jb21taXRfcGFnZXNfYWZ0ZXJfd3JpdGUocGFnZXMsIGRvX3BhZ2VzLCBwb3MsCi0JCQkJYnl0ZXMpOwotCQlpZiAobGlrZWx5KCFzdGF0dXMpKSB7Ci0JCQl3cml0dGVuICs9IGNvcGllZDsKLQkJCWNvdW50IC09IGNvcGllZDsKLQkJCXBvcyArPSBjb3BpZWQ7Ci0JCQlpZiAodW5saWtlbHkoY29waWVkICE9IGJ5dGVzKSkKLQkJCQlzdGF0dXMgPSAtRUZBVUxUOworCQlzdGF0dXMgPSAwOworCQlpZiAobGlrZWx5KGNvcGllZCA9PSBieXRlcykpIHsKKwkJCXN0YXR1cyA9IG50ZnNfY29tbWl0X3BhZ2VzX2FmdGVyX3dyaXRlKHBhZ2VzLCBkb19wYWdlcywKKwkJCQkJcG9zLCBieXRlcyk7CisJCQlpZiAoIXN0YXR1cykKKwkJCQlzdGF0dXMgPSBieXRlczsKIAkJfQogCQlkbyB7CiAJCQl1bmxvY2tfcGFnZShwYWdlc1stLWRvX3BhZ2VzXSk7CiAJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZXNbZG9fcGFnZXNdKTsKIAkJfSB3aGlsZSAoZG9fcGFnZXMpOwotCQlpZiAodW5saWtlbHkoc3RhdHVzKSkKKwkJaWYgKHVubGlrZWx5KHN0YXR1cyA8IDApKQogCQkJYnJlYWs7Ci0JCWJhbGFuY2VfZGlydHlfcGFnZXNfcmF0ZWxpbWl0ZWQobWFwcGluZyk7CisJCWNvcGllZCA9IHN0YXR1czsKIAkJY29uZF9yZXNjaGVkKCk7Ci0JfSB3aGlsZSAoY291bnQpOwotZXJyX291dDoKLQkqcHBvcyA9IHBvczsKKwkJaWYgKHVubGlrZWx5KCFjb3BpZWQpKSB7CisJCQlzaXplX3Qgc2M7CisKKwkJCS8qCisJCQkgKiBXZSBmYWlsZWQgdG8gY29weSBhbnl0aGluZy4gIEZhbGwgYmFjayB0byBzaW5nbGUKKwkJCSAqIHNlZ21lbnQgbGVuZ3RoIHdyaXRlLgorCQkJICoKKwkJCSAqIFRoaXMgaXMgbmVlZGVkIHRvIGF2b2lkIHBvc3NpYmxlIGxpdmVsb2NrIGluIHRoZQorCQkJICogY2FzZSB0aGF0IGFsbCBzZWdtZW50cyBpbiB0aGUgaW92IGNhbm5vdCBiZSBjb3BpZWQKKwkJCSAqIGF0IG9uY2Ugd2l0aG91dCBhIHBhZ2VmYXVsdC4KKwkJCSAqLworCQkJc2MgPSBpb3ZfaXRlcl9zaW5nbGVfc2VnX2NvdW50KGkpOworCQkJaWYgKGJ5dGVzID4gc2MpCisJCQkJYnl0ZXMgPSBzYzsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJaW92X2l0ZXJfYWR2YW5jZShpLCBjb3BpZWQpOworCQlwb3MgKz0gY29waWVkOworCQl3cml0dGVuICs9IGNvcGllZDsKKwkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZChtYXBwaW5nKTsKKwkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlzdGF0dXMgPSAtRUlOVFI7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKGlvdl9pdGVyX2NvdW50KGkpKTsKIAlpZiAoY2FjaGVkX3BhZ2UpCiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShjYWNoZWRfcGFnZSk7CiAJbnRmc19kZWJ1ZygiRG9uZS4gIFJldHVybmluZyAlcyAod3JpdHRlbiAweCVseCwgc3RhdHVzICVsaSkuIiwKQEAgLTIwNzcsNTkgKzE5MzAsNTYgQEAKIH0KIAogLyoqCi0gKiBudGZzX2ZpbGVfYWlvX3dyaXRlX25vbG9jayAtCisgKiBudGZzX2ZpbGVfd3JpdGVfaXRlcl9ub2xvY2sgLSB3cml0ZSBkYXRhIHRvIGEgZmlsZQorICogQGlvY2I6CUlPIHN0YXRlIHN0cnVjdHVyZSAoZmlsZSwgb2Zmc2V0LCBldGMuKQorICogQGZyb206CWlvdl9pdGVyIHdpdGggZGF0YSB0byB3cml0ZQorICoKKyAqIEJhc2ljYWxseSB0aGUgc2FtZSBhcyBfX2dlbmVyaWNfZmlsZV93cml0ZV9pdGVyKCkgZXhjZXB0IHRoYXQgaXQgZW5kcworICogdXAgY2FsbGluZyBudGZzX3BlcmZvcm1fd3JpdGUoKSBpbnN0ZWFkIG9mIGdlbmVyaWNfcGVyZm9ybV93cml0ZSgpIGFuZCB0aGF0CisgKiBPX0RJUkVDVCBpcyBub3QgaW1wbGVtZW50ZWQuCiAgKi8KLXN0YXRpYyBzc2l6ZV90IG50ZnNfZmlsZV9haW9fd3JpdGVfbm9sb2NrKHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHVuc2lnbmVkIGxvbmcgbnJfc2VncywgbG9mZl90ICpwcG9zKQorc3RhdGljIHNzaXplX3QgbnRmc19maWxlX3dyaXRlX2l0ZXJfbm9sb2NrKHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJc3RydWN0IGlvdl9pdGVyICpmcm9tKQogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGZpbGUtPmZfbWFwcGluZzsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbWFwcGluZy0+aG9zdDsKLQlsb2ZmX3QgcG9zOwotCXNpemVfdCBjb3VudDsJCS8qIGFmdGVyIGZpbGUgbGltaXQgY2hlY2tzICovCi0Jc3NpemVfdCB3cml0dGVuLCBlcnI7CisJbG9mZl90IHBvcyA9IGlvY2ItPmtpX3BvczsKKwlzc2l6ZV90IHdyaXR0ZW4gPSAwOworCXNzaXplX3QgZXJyOworCXNpemVfdCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOwogCi0JY291bnQgPSBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7Ci0JcG9zID0gKnBwb3M7Ci0JLyogV2UgY2FuIHdyaXRlIGJhY2sgdGhpcyBxdWV1ZSBpbiBwYWdlIHJlY2xhaW0uICovCi0JY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IGlub2RlX3RvX2JkaShpbm9kZSk7Ci0Jd3JpdHRlbiA9IDA7Ci0JZXJyID0gZ2VuZXJpY193cml0ZV9jaGVja3MoZmlsZSwgJnBvcywgJmNvdW50LCBTX0lTQkxLKGlub2RlLT5pX21vZGUpKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQlpZiAoIWNvdW50KQotCQlnb3RvIG91dDsKLQllcnIgPSBmaWxlX3JlbW92ZV9zdWlkKGZpbGUpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCWVyciA9IGZpbGVfdXBkYXRlX3RpbWUoZmlsZSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0Jd3JpdHRlbiA9IG50ZnNfZmlsZV9idWZmZXJlZF93cml0ZShpb2NiLCBpb3YsIG5yX3NlZ3MsIHBvcywgcHBvcywKLQkJCWNvdW50KTsKLW91dDoKKwllcnIgPSBudGZzX3ByZXBhcmVfZmlsZV9mb3Jfd3JpdGUoZmlsZSwgJnBvcywgJmNvdW50KTsKKwlpZiAoY291bnQgJiYgIWVycikgeworCQlpb3ZfaXRlcl90cnVuY2F0ZShmcm9tLCBjb3VudCk7CisJCXdyaXR0ZW4gPSBudGZzX3BlcmZvcm1fd3JpdGUoZmlsZSwgZnJvbSwgcG9zKTsKKwkJaWYgKGxpa2VseSh3cml0dGVuID49IDApKQorCQkJaW9jYi0+a2lfcG9zID0gcG9zICsgd3JpdHRlbjsKKwl9CiAJY3VycmVudC0+YmFja2luZ19kZXZfaW5mbyA9IE5VTEw7CiAJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogZXJyOwogfQogCiAvKioKLSAqIG50ZnNfZmlsZV9haW9fd3JpdGUgLQorICogbnRmc19maWxlX3dyaXRlX2l0ZXIgLSBzaW1wbGUgd3JhcHBlciBmb3IgbnRmc19maWxlX3dyaXRlX2l0ZXJfbm9sb2NrKCkKKyAqIEBpb2NiOglJTyBzdGF0ZSBzdHJ1Y3R1cmUKKyAqIEBmcm9tOglpb3ZfaXRlciB3aXRoIGRhdGEgdG8gd3JpdGUKKyAqCisgKiBCYXNpY2FsbHkgdGhlIHNhbWUgYXMgZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIoKSBleGNlcHQgdGhhdCBpdCBlbmRzIHVwCisgKiBjYWxsaW5nIG50ZnNfZmlsZV93cml0ZV9pdGVyX25vbG9jaygpIGluc3RlYWQgb2YKKyAqIF9fZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIoKS4KICAqLwotc3RhdGljIHNzaXplX3QgbnRmc19maWxlX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpCitzdGF0aWMgc3NpemVfdCBudGZzX2ZpbGVfd3JpdGVfaXRlcihzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSkKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBmaWxlLT5mX21hcHBpbmc7Ci0Jc3RydWN0IGlub2RlICppbm9kZSA9IG1hcHBpbmctPmhvc3Q7CisJc3RydWN0IGlub2RlICp2aSA9IGZpbGVfaW5vZGUoZmlsZSk7CiAJc3NpemVfdCByZXQ7CiAKLQlCVUdfT04oaW9jYi0+a2lfcG9zICE9IHBvcyk7Ci0KLQltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7Ci0JcmV0ID0gbnRmc19maWxlX2Fpb193cml0ZV9ub2xvY2soaW9jYiwgaW92LCBucl9zZWdzLCAmaW9jYi0+a2lfcG9zKTsKLQltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwltdXRleF9sb2NrKCZ2aS0+aV9tdXRleCk7CisJcmV0ID0gbnRmc19maWxlX3dyaXRlX2l0ZXJfbm9sb2NrKGlvY2IsIGZyb20pOworCW11dGV4X3VubG9jaygmdmktPmlfbXV0ZXgpOwogCWlmIChyZXQgPiAwKSB7Ci0JCWludCBlcnIgPSBnZW5lcmljX3dyaXRlX3N5bmMoZmlsZSwgaW9jYi0+a2lfcG9zIC0gcmV0LCByZXQpOworCQlzc2l6ZV90IGVycjsKKworCQllcnIgPSBnZW5lcmljX3dyaXRlX3N5bmMoZmlsZSwgaW9jYi0+a2lfcG9zIC0gcmV0LCByZXQpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldCA9IGVycjsKIAl9CkBAIC0yMTk3LDM3ICsyMDQ3LDE1IEBACiAjZW5kaWYgLyogTlRGU19SVyAqLwogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG50ZnNfZmlsZV9vcHMgPSB7Ci0JLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkgLyogU2VlayBpbnNpZGUgZmlsZS4gKi8KLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAkgLyogUmVhZCBmcm9tIGZpbGUuICovCi0JLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsIC8qIEFzeW5jIHJlYWQgZnJvbSBmaWxlLiAqLworCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKKwkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKICNpZmRlZiBOVEZTX1JXCi0JLndyaXRlCQk9IGRvX3N5bmNfd3JpdGUsCSAvKiBXcml0ZSB0byBmaWxlLiAqLwotCS5haW9fd3JpdGUJPSBudGZzX2ZpbGVfYWlvX3dyaXRlLAkgLyogQXN5bmMgd3JpdGUgdG8gZmlsZS4gKi8KLQkvKi5yZWxlYXNlCT0gLCovCQkJIC8qIExhc3QgZmlsZSBpcyBjbG9zZWQuICBTZWUKLQkJCQkJCSAgICBmcy9leHQyL2ZpbGUuYzo6Ci0JCQkJCQkgICAgZXh0Ml9yZWxlYXNlX2ZpbGUoKSBmb3IKLQkJCQkJCSAgICBob3cgdG8gdXNlIHRoaXMgdG8gZGlzY2FyZAotCQkJCQkJICAgIHByZWFsbG9jYXRlZCBzcGFjZSBmb3IKLQkJCQkJCSAgICB3cml0ZSBvcGVuZWQgZmlsZXMuICovCi0JLmZzeW5jCQk9IG50ZnNfZmlsZV9mc3luYywJIC8qIFN5bmMgYSBmaWxlIHRvIGRpc2suICovCi0JLyouYWlvX2ZzeW5jCT0gLCovCQkJIC8qIFN5bmMgYWxsIG91dHN0YW5kaW5nIGFzeW5jCi0JCQkJCQkgICAgaS9vIG9wZXJhdGlvbnMgb24gYQotCQkJCQkJICAgIGtpb2NiLiAqLworCS53cml0ZV9pdGVyCT0gbnRmc19maWxlX3dyaXRlX2l0ZXIsCisJLmZzeW5jCQk9IG50ZnNfZmlsZV9mc3luYywKICNlbmRpZiAvKiBOVEZTX1JXICovCi0JLyouaW9jdGwJPSAsKi8JCQkgLyogUGVyZm9ybSBmdW5jdGlvbiBvbiB0aGUKLQkJCQkJCSAgICBtb3VudGVkIGZpbGVzeXN0ZW0uICovCi0JLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCSAvKiBNbWFwIGZpbGUuICovCi0JLm9wZW4JCT0gbnRmc19maWxlX29wZW4sCSAvKiBPcGVuIGZpbGUuICovCi0JLnNwbGljZV9yZWFkCT0gZ2VuZXJpY19maWxlX3NwbGljZV9yZWFkIC8qIFplcm8tY29weSBkYXRhIHNlbmQgd2l0aAotCQkJCQkJICAgIHRoZSBkYXRhIHNvdXJjZSBiZWluZyBvbgotCQkJCQkJICAgIHRoZSBudGZzIHBhcnRpdGlvbi4gIFdlIGRvCi0JCQkJCQkgICAgbm90IG5lZWQgdG8gY2FyZSBhYm91dCB0aGUKLQkJCQkJCSAgICBkYXRhIGRlc3RpbmF0aW9uLiAqLwotCS8qLnNlbmRwYWdlCT0gLCovCQkJIC8qIFplcm8tY29weSBkYXRhIHNlbmQgd2l0aAotCQkJCQkJICAgIHRoZSBkYXRhIGRlc3RpbmF0aW9uIGJlaW5nCi0JCQkJCQkgICAgb24gdGhlIG50ZnMgcGFydGl0aW9uLiAgV2UKLQkJCQkJCSAgICBkbyBub3QgbmVlZCB0byBjYXJlIGFib3V0Ci0JCQkJCQkgICAgdGhlIGRhdGEgc291cmNlLiAqLworCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAorCS5vcGVuCQk9IG50ZnNfZmlsZV9vcGVuLAorCS5zcGxpY2VfcmVhZAk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKIH07CiAKIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIG50ZnNfZmlsZV9pbm9kZV9vcHMgPSB7CmRpZmYgLS1naXQgYS9mcy9udGZzL2lub2RlLmMgYi9mcy9udGZzL2lub2RlLmMKaW5kZXggODk4Yjk5NC4uMWQwYzIxZCAxMDA2NDQKLS0tIGEvZnMvbnRmcy9pbm9kZS5jCisrKyBiL2ZzL250ZnMvaW5vZGUuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KIAogI2luY2x1ZGUgImFvcHMuaCIKICNpbmNsdWRlICJhdHRyaWIuaCIKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FsbG9jLmMgYi9mcy9vY2ZzMi9hbGxvYy5jCmluZGV4IDA0NDE1OGIuLjJkN2Y3NmUgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FsbG9jLmMKKysrIGIvZnMvb2NmczIvYWxsb2MuYwpAQCAtMzM3MCw3ICszMzcwLDcgQEAKIAkJcmV0ID0gb2NmczJfZ2V0X3JpZ2h0X3BhdGgoZXQsIGxlZnRfcGF0aCwgJnJpZ2h0X3BhdGgpOwogCQlpZiAocmV0KSB7CiAJCQltbG9nX2Vycm5vKHJldCk7Ci0JCQlnb3RvIG91dDsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAogCQlyaWdodF9lbCA9IHBhdGhfbGVhZl9lbChyaWdodF9wYXRoKTsKQEAgLTM0NTMsOCArMzQ1Myw3IEBACiAJCQkJCSAgIHN1YnRyZWVfaW5kZXgpOwogCX0KIG91dDoKLQlpZiAocmlnaHRfcGF0aCkKLQkJb2NmczJfZnJlZV9wYXRoKHJpZ2h0X3BhdGgpOworCW9jZnMyX2ZyZWVfcGF0aChyaWdodF9wYXRoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zNTM2LDcgKzM1MzUsNyBAQAogCQlyZXQgPSBvY2ZzMl9nZXRfbGVmdF9wYXRoKGV0LCByaWdodF9wYXRoLCAmbGVmdF9wYXRoKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXQ7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAKIAkJbGVmdF9lbCA9IHBhdGhfbGVhZl9lbChsZWZ0X3BhdGgpOwpAQCAtMzY0Nyw4ICszNjQ2LDcgQEAKIAkJCQkJCSAgIHJpZ2h0X3BhdGgsIHN1YnRyZWVfaW5kZXgpOwogCX0KIG91dDoKLQlpZiAobGVmdF9wYXRoKQotCQlvY2ZzMl9mcmVlX3BhdGgobGVmdF9wYXRoKTsKKwlvY2ZzMl9mcmVlX3BhdGgobGVmdF9wYXRoKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MzM0LDE3ICs0MzMyLDE3IEBACiAJfSBlbHNlIGlmIChwYXRoLT5wX3RyZWVfZGVwdGggPiAwKSB7CiAJCXN0YXR1cyA9IG9jZnMyX2ZpbmRfY3Bvc19mb3JfbGVmdF9sZWFmKHNiLCBwYXRoLCAmbGVmdF9jcG9zKTsKIAkJaWYgKHN0YXR1cykKLQkJCWdvdG8gb3V0OworCQkJZ290byBleGl0OwogCiAJCWlmIChsZWZ0X2Nwb3MgIT0gMCkgewogCQkJbGVmdF9wYXRoID0gb2NmczJfbmV3X3BhdGhfZnJvbV9wYXRoKHBhdGgpOwogCQkJaWYgKCFsZWZ0X3BhdGgpCi0JCQkJZ290byBvdXQ7CisJCQkJZ290byBleGl0OwogCiAJCQlzdGF0dXMgPSBvY2ZzMl9maW5kX3BhdGgoZXQtPmV0X2NpLCBsZWZ0X3BhdGgsCiAJCQkJCQkgbGVmdF9jcG9zKTsKIAkJCWlmIChzdGF0dXMpCi0JCQkJZ290byBvdXQ7CisJCQkJZ290byBmcmVlX2xlZnRfcGF0aDsKIAogCQkJbmV3X2VsID0gcGF0aF9sZWFmX2VsKGxlZnRfcGF0aCk7CiAKQEAgLTQzNjEsNyArNDM1OSw3IEBACiAJCQkJCSAgICBsZTE2X3RvX2NwdShuZXdfZWwtPmxfbmV4dF9mcmVlX3JlYyksCiAJCQkJCSAgICBsZTE2X3RvX2NwdShuZXdfZWwtPmxfY291bnQpKTsKIAkJCQlzdGF0dXMgPSAtRUlOVkFMOwotCQkJCWdvdG8gb3V0OworCQkJCWdvdG8gZnJlZV9sZWZ0X3BhdGg7CiAJCQl9CiAJCQlyZWMgPSAmbmV3X2VsLT5sX3JlY3NbCiAJCQkJbGUxNl90b19jcHUobmV3X2VsLT5sX25leHRfZnJlZV9yZWMpIC0gMV07CkBAIC00Mzg4LDE4ICs0Mzg2LDE4IEBACiAJCSBwYXRoLT5wX3RyZWVfZGVwdGggPiAwKSB7CiAJCXN0YXR1cyA9IG9jZnMyX2ZpbmRfY3Bvc19mb3JfcmlnaHRfbGVhZihzYiwgcGF0aCwgJnJpZ2h0X2Nwb3MpOwogCQlpZiAoc3RhdHVzKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIGZyZWVfbGVmdF9wYXRoOwogCiAJCWlmIChyaWdodF9jcG9zID09IDApCi0JCQlnb3RvIG91dDsKKwkJCWdvdG8gZnJlZV9sZWZ0X3BhdGg7CiAKIAkJcmlnaHRfcGF0aCA9IG9jZnMyX25ld19wYXRoX2Zyb21fcGF0aChwYXRoKTsKIAkJaWYgKCFyaWdodF9wYXRoKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIGZyZWVfbGVmdF9wYXRoOwogCiAJCXN0YXR1cyA9IG9jZnMyX2ZpbmRfcGF0aChldC0+ZXRfY2ksIHJpZ2h0X3BhdGgsIHJpZ2h0X2Nwb3MpOwogCQlpZiAoc3RhdHVzKQotCQkJZ290byBvdXQ7CisJCQlnb3RvIGZyZWVfcmlnaHRfcGF0aDsKIAogCQluZXdfZWwgPSBwYXRoX2xlYWZfZWwocmlnaHRfcGF0aCk7CiAJCXJlYyA9ICZuZXdfZWwtPmxfcmVjc1swXTsKQEAgLTQ0MTMsNyArNDQxMSw3IEBACiAJCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KGViLT5oX2Jsa25vKSwKIAkJCQkJICAgIGxlMTZfdG9fY3B1KG5ld19lbC0+bF9uZXh0X2ZyZWVfcmVjKSk7CiAJCQkJc3RhdHVzID0gLUVJTlZBTDsKLQkJCQlnb3RvIG91dDsKKwkJCQlnb3RvIGZyZWVfcmlnaHRfcGF0aDsKIAkJCX0KIAkJCXJlYyA9ICZuZXdfZWwtPmxfcmVjc1sxXTsKIAkJfQpAQCAtNDQzMCwxMiArNDQyOCwxMSBAQAogCQkJcmV0ID0gY29udGlnX3R5cGU7CiAJfQogCi1vdXQ6Ci0JaWYgKGxlZnRfcGF0aCkKLQkJb2NmczJfZnJlZV9wYXRoKGxlZnRfcGF0aCk7Ci0JaWYgKHJpZ2h0X3BhdGgpCi0JCW9jZnMyX2ZyZWVfcGF0aChyaWdodF9wYXRoKTsKLQorZnJlZV9yaWdodF9wYXRoOgorCW9jZnMyX2ZyZWVfcGF0aChyaWdodF9wYXRoKTsKK2ZyZWVfbGVmdF9wYXRoOgorCW9jZnMyX2ZyZWVfcGF0aChsZWZ0X3BhdGgpOworZXhpdDoKIAlyZXR1cm4gcmV0OwogfQogCkBAIC02ODU4LDEzICs2ODU1LDEzIEBACiAJCWlmIChwYWdlcyA9PSBOVUxMKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXQ7CisJCQlyZXR1cm4gcmV0OwogCQl9CiAKIAkJcmV0ID0gb2NmczJfcmVzZXJ2ZV9jbHVzdGVycyhvc2IsIDEsICZkYXRhX2FjKTsKIAkJaWYgKHJldCkgewogCQkJbWxvZ19lcnJubyhyZXQpOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIGZyZWVfcGFnZXM7CiAJCX0KIAl9CiAKQEAgLTY5OTYsOSArNjk5Myw4IEBACiBvdXQ6CiAJaWYgKGRhdGFfYWMpCiAJCW9jZnMyX2ZyZWVfYWxsb2NfY29udGV4dChkYXRhX2FjKTsKLQlpZiAocGFnZXMpCi0JCWtmcmVlKHBhZ2VzKTsKLQorZnJlZV9wYWdlczoKKwlrZnJlZShwYWdlcyk7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvYW9wcy5jIGIvZnMvb2NmczIvYW9wcy5jCmluZGV4IDQ0ZGIxODAuLjhkMmJjODQgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2FvcHMuYworKysgYi9mcy9vY2ZzMi9hb3BzLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAKICNpbmNsdWRlIDxjbHVzdGVyL21hc2tsb2cuaD4KIApAQCAtNjYzLDYgKzY2NCwxMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBvY2ZzMl9kaXJlY3RfSU9femVyb19leHRlbmQoc3RydWN0IG9jZnMyX3N1cGVyICpvc2IsCisJCXN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBvZmZzZXQsCisJCXU2NCB6ZXJvX2xlbiwgaW50IGNsdXN0ZXJfYWxpZ24pCit7CisJdTMyIHBfY3BvcyA9IDA7CisJdTMyIHZfY3BvcyA9IG9jZnMyX2J5dGVzX3RvX2NsdXN0ZXJzKG9zYi0+c2IsIGlfc2l6ZV9yZWFkKGlub2RlKSk7CisJdW5zaWduZWQgaW50IG51bV9jbHVzdGVycyA9IDA7CisJdW5zaWduZWQgaW50IGV4dF9mbGFncyA9IDA7CisJaW50IHJldCA9IDA7CisKKwlpZiAob2Zmc2V0IDw9IGlfc2l6ZV9yZWFkKGlub2RlKSB8fCBjbHVzdGVyX2FsaWduKQorCQlyZXR1cm4gMDsKKworCXJldCA9IG9jZnMyX2dldF9jbHVzdGVycyhpbm9kZSwgdl9jcG9zLCAmcF9jcG9zLCAmbnVtX2NsdXN0ZXJzLAorCQkJJmV4dF9mbGFncyk7CisJaWYgKHJldCA8IDApIHsKKwkJbWxvZ19lcnJubyhyZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChwX2Nwb3MgJiYgIShleHRfZmxhZ3MgJiBPQ0ZTMl9FWFRfVU5XUklUVEVOKSkgeworCQl1NjQgcyA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwkJc2VjdG9yX3Qgc2VjdG9yID0gKHBfY3BvcyA8PCAob3NiLT5zX2NsdXN0ZXJzaXplX2JpdHMgLSA5KSkgKworCQkJKGRvX2RpdihzLCBvc2ItPnNfY2x1c3RlcnNpemUpID4+IDkpOworCisJCXJldCA9IGJsa2Rldl9pc3N1ZV96ZXJvb3V0KG9zYi0+c2ItPnNfYmRldiwgc2VjdG9yLAorCQkJCXplcm9fbGVuID4+IDksIEdGUF9OT0ZTLCBmYWxzZSk7CisJCWlmIChyZXQgPCAwKQorCQkJbWxvZ19lcnJubyhyZXQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb2NmczJfZGlyZWN0X0lPX2V4dGVuZF9ub19ob2xlcyhzdHJ1Y3Qgb2NmczJfc3VwZXIgKm9zYiwKKwkJc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IG9mZnNldCkKK3sKKwl1NjQgemVyb19zdGFydCwgemVyb19sZW4sIHRvdGFsX3plcm9fbGVuOworCXUzMiBwX2Nwb3MgPSAwLCBjbHVzdGVyc190b19hZGQ7CisJdTMyIHZfY3BvcyA9IG9jZnMyX2J5dGVzX3RvX2NsdXN0ZXJzKG9zYi0+c2IsIGlfc2l6ZV9yZWFkKGlub2RlKSk7CisJdW5zaWduZWQgaW50IG51bV9jbHVzdGVycyA9IDA7CisJdW5zaWduZWQgaW50IGV4dF9mbGFncyA9IDA7CisJdTMyIHNpemVfZGl2LCBvZmZzZXRfZGl2OworCWludCByZXQgPSAwOworCisJeworCQl1NjQgbyA9IG9mZnNldDsKKwkJdTY0IHMgPSBpX3NpemVfcmVhZChpbm9kZSk7CisKKwkJb2Zmc2V0X2RpdiA9IGRvX2RpdihvLCBvc2ItPnNfY2x1c3RlcnNpemUpOworCQlzaXplX2RpdiA9IGRvX2RpdihzLCBvc2ItPnNfY2x1c3RlcnNpemUpOworCX0KKworCWlmIChvZmZzZXQgPD0gaV9zaXplX3JlYWQoaW5vZGUpKQorCQlyZXR1cm4gMDsKKworCWNsdXN0ZXJzX3RvX2FkZCA9IG9jZnMyX2J5dGVzX3RvX2NsdXN0ZXJzKGlub2RlLT5pX3NiLCBvZmZzZXQpIC0KKwkJb2NmczJfYnl0ZXNfdG9fY2x1c3RlcnMoaW5vZGUtPmlfc2IsIGlfc2l6ZV9yZWFkKGlub2RlKSk7CisJdG90YWxfemVyb19sZW4gPSBvZmZzZXQgLSBpX3NpemVfcmVhZChpbm9kZSk7CisJaWYgKGNsdXN0ZXJzX3RvX2FkZCkKKwkJdG90YWxfemVyb19sZW4gLT0gb2Zmc2V0X2RpdjsKKworCS8qIEFsbG9jYXRlIGNsdXN0ZXJzIHRvIGZpbGwgb3V0IGhvbGVzLCBhbmQgdGhpcyBpcyBvbmx5IG5lZWRlZAorCSAqIHdoZW4gd2UgYWRkIG1vcmUgdGhhbiBvbmUgY2x1c3RlcnMuIE90aGVyd2lzZSB0aGUgY2x1c3RlciB3aWxsCisJICogYmUgYWxsb2NhdGVkIGR1cmluZyBkaXJlY3QgSU8gKi8KKwlpZiAoY2x1c3RlcnNfdG9fYWRkID4gMSkgeworCQlyZXQgPSBvY2ZzMl9leHRlbmRfYWxsb2NhdGlvbihpbm9kZSwKKwkJCQlPQ0ZTMl9JKGlub2RlKS0+aXBfY2x1c3RlcnMsCisJCQkJY2x1c3RlcnNfdG9fYWRkIC0gMSwgMCk7CisJCWlmIChyZXQpIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJd2hpbGUgKHRvdGFsX3plcm9fbGVuKSB7CisJCXJldCA9IG9jZnMyX2dldF9jbHVzdGVycyhpbm9kZSwgdl9jcG9zLCAmcF9jcG9zLCAmbnVtX2NsdXN0ZXJzLAorCQkJCSZleHRfZmxhZ3MpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWxvZ19lcnJubyhyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKworCQl6ZXJvX3N0YXJ0ID0gb2NmczJfY2x1c3RlcnNfdG9fYnl0ZXMob3NiLT5zYiwgcF9jcG9zKSArCisJCQlzaXplX2RpdjsKKwkJemVyb19sZW4gPSBvY2ZzMl9jbHVzdGVyc190b19ieXRlcyhvc2ItPnNiLCBudW1fY2x1c3RlcnMpIC0KKwkJCXNpemVfZGl2OworCQl6ZXJvX2xlbiA9IG1pbih0b3RhbF96ZXJvX2xlbiwgemVyb19sZW4pOworCisJCWlmIChwX2Nwb3MgJiYgIShleHRfZmxhZ3MgJiBPQ0ZTMl9FWFRfVU5XUklUVEVOKSkgeworCQkJcmV0ID0gYmxrZGV2X2lzc3VlX3plcm9vdXQob3NiLT5zYi0+c19iZGV2LAorCQkJCQl6ZXJvX3N0YXJ0ID4+IDksIHplcm9fbGVuID4+IDksCisJCQkJCUdGUF9OT0ZTLCBmYWxzZSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCisJCXRvdGFsX3plcm9fbGVuIC09IHplcm9fbGVuOworCQl2X2Nwb3MgKz0gb2NmczJfYnl0ZXNfdG9fY2x1c3RlcnMob3NiLT5zYiwgemVyb19sZW4gKyBzaXplX2Rpdik7CisKKwkJLyogT25seSBhdCBmaXJzdCBpdGVyYXRpb24gY2FuIGJlIGNsdXN0ZXIgbm90IGFsaWduZWQuCisJCSAqIFNvIHNldCBzaXplX2RpdiB0byAwIGZvciB0aGUgcmVzdCAqLworCQlzaXplX2RpdiA9IDA7CisJfQorCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHNzaXplX3Qgb2NmczJfZGlyZWN0X0lPX3dyaXRlKHN0cnVjdCBraW9jYiAqaW9jYiwKIAkJc3RydWN0IGlvdl9pdGVyICppdGVyLAogCQlsb2ZmX3Qgb2Zmc2V0KQpAQCAtNjc3LDggKzc4OSw4IEBACiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpkaV9iaCA9IE5VTEw7CiAJc2l6ZV90IGNvdW50ID0gaXRlci0+Y291bnQ7CiAJam91cm5hbF90ICpqb3VybmFsID0gb3NiLT5qb3VybmFsLT5qX2pvdXJuYWw7Ci0JdTMyIHplcm9fbGVuOwotCWludCBjbHVzdGVyX2FsaWduOworCXU2NCB6ZXJvX2xlbl9oZWFkLCB6ZXJvX2xlbl90YWlsOworCWludCBjbHVzdGVyX2FsaWduX2hlYWQsIGNsdXN0ZXJfYWxpZ25fdGFpbDsKIAlsb2ZmX3QgZmluYWxfc2l6ZSA9IG9mZnNldCArIGNvdW50OwogCWludCBhcHBlbmRfd3JpdGUgPSBvZmZzZXQgPj0gaV9zaXplX3JlYWQoaW5vZGUpID8gMSA6IDA7CiAJdW5zaWduZWQgaW50IG51bV9jbHVzdGVycyA9IDA7CkBAIC02ODYsOSArNzk4LDE2IEBACiAKIAl7CiAJCXU2NCBvID0gb2Zmc2V0OworCQl1NjQgcyA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKIAotCQl6ZXJvX2xlbiA9IGRvX2RpdihvLCAxIDw8IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzKTsKLQkJY2x1c3Rlcl9hbGlnbiA9ICF6ZXJvX2xlbjsKKwkJemVyb19sZW5faGVhZCA9IGRvX2RpdihvLCAxIDw8IG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzKTsKKwkJY2x1c3Rlcl9hbGlnbl9oZWFkID0gIXplcm9fbGVuX2hlYWQ7CisKKwkJemVyb19sZW5fdGFpbCA9IG9zYi0+c19jbHVzdGVyc2l6ZSAtCisJCQlkb19kaXYocywgb3NiLT5zX2NsdXN0ZXJzaXplKTsKKwkJaWYgKChvZmZzZXQgLSBpX3NpemVfcmVhZChpbm9kZSkpIDwgemVyb19sZW5fdGFpbCkKKwkJCXplcm9fbGVuX3RhaWwgPSBvZmZzZXQgLSBpX3NpemVfcmVhZChpbm9kZSk7CisJCWNsdXN0ZXJfYWxpZ25fdGFpbCA9ICF6ZXJvX2xlbl90YWlsOwogCX0KIAogCS8qCkBAIC03MDYsMjEgKzgyNSwyMyBAQAogCX0KIAogCWlmIChhcHBlbmRfd3JpdGUpIHsKLQkJcmV0ID0gb2NmczJfaW5vZGVfbG9jayhpbm9kZSwgJmRpX2JoLCAxKTsKKwkJcmV0ID0gb2NmczJfaW5vZGVfbG9jayhpbm9kZSwgTlVMTCwgMSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlnb3RvIGNsZWFuX29ycGhhbjsKIAkJfQogCisJCS8qIHplcm9pbmcgb3V0IHRoZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBjbHVzdGVyIHRhaWwKKwkJICogdGhhdCBidXQgbm90IHplcm9lZCAqLwogCQlpZiAob2NmczJfc3BhcnNlX2FsbG9jKE9DRlMyX1NCKGlub2RlLT5pX3NiKSkpCi0JCQlyZXQgPSBvY2ZzMl96ZXJvX2V4dGVuZChpbm9kZSwgZGlfYmgsIG9mZnNldCk7CisJCQlyZXQgPSBvY2ZzMl9kaXJlY3RfSU9femVyb19leHRlbmQob3NiLCBpbm9kZSwgb2Zmc2V0LAorCQkJCQl6ZXJvX2xlbl90YWlsLCBjbHVzdGVyX2FsaWduX3RhaWwpOwogCQllbHNlCi0JCQlyZXQgPSBvY2ZzMl9leHRlbmRfbm9faG9sZXMoaW5vZGUsIGRpX2JoLCBvZmZzZXQsCisJCQlyZXQgPSBvY2ZzMl9kaXJlY3RfSU9fZXh0ZW5kX25vX2hvbGVzKG9zYiwgaW5vZGUsCiAJCQkJCW9mZnNldCk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CiAJCQlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIDEpOwotCQkJYnJlbHNlKGRpX2JoKTsKIAkJCWdvdG8gY2xlYW5fb3JwaGFuOwogCQl9CiAKQEAgLTcyOCwxMyArODQ5LDEwIEBACiAJCWlmIChpc19vdmVyd3JpdGUgPCAwKSB7CiAJCQltbG9nX2Vycm5vKGlzX292ZXJ3cml0ZSk7CiAJCQlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIDEpOwotCQkJYnJlbHNlKGRpX2JoKTsKIAkJCWdvdG8gY2xlYW5fb3JwaGFuOwogCQl9CiAKIAkJb2NmczJfaW5vZGVfdW5sb2NrKGlub2RlLCAxKTsKLQkJYnJlbHNlKGRpX2JoKTsKLQkJZGlfYmggPSBOVUxMOwogCX0KIAogCXdyaXR0ZW4gPSBfX2Jsb2NrZGV2X2RpcmVjdF9JTyhXUklURSwgaW9jYiwgaW5vZGUsIGlub2RlLT5pX3NiLT5zX2JkZXYsCkBAIC03NzEsMTUgKzg4OSwyMyBAQAogCQkJaWYgKHJldCA8IDApCiAJCQkJbWxvZ19lcnJubyhyZXQpOwogCQl9Ci0JfSBlbHNlIGlmICh3cml0dGVuIDwgMCAmJiBhcHBlbmRfd3JpdGUgJiYgIWlzX292ZXJ3cml0ZSAmJgotCQkJIWNsdXN0ZXJfYWxpZ24pIHsKKwl9IGVsc2UgaWYgKHdyaXR0ZW4gPiAwICYmIGFwcGVuZF93cml0ZSAmJiAhaXNfb3ZlcndyaXRlICYmCisJCQkhY2x1c3Rlcl9hbGlnbl9oZWFkKSB7CisJCS8qIHplcm9pbmcgb3V0IHRoZSBhbGxvY2F0ZWQgY2x1c3RlciBoZWFkICovCiAJCXUzMiBwX2Nwb3MgPSAwOwogCQl1MzIgdl9jcG9zID0gb2NmczJfYnl0ZXNfdG9fY2x1c3RlcnMob3NiLT5zYiwgb2Zmc2V0KTsKIAorCQlyZXQgPSBvY2ZzMl9pbm9kZV9sb2NrKGlub2RlLCBOVUxMLCAwKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCW1sb2dfZXJybm8ocmV0KTsKKwkJCWdvdG8gY2xlYW5fb3JwaGFuOworCQl9CisKIAkJcmV0ID0gb2NmczJfZ2V0X2NsdXN0ZXJzKGlub2RlLCB2X2Nwb3MsICZwX2Nwb3MsCiAJCQkJJm51bV9jbHVzdGVycywgJmV4dF9mbGFncyk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQltbG9nX2Vycm5vKHJldCk7CisJCQlvY2ZzMl9pbm9kZV91bmxvY2soaW5vZGUsIDApOwogCQkJZ290byBjbGVhbl9vcnBoYW47CiAJCX0KIApAQCAtNzg3LDkgKzkxMywxMSBAQAogCiAJCXJldCA9IGJsa2Rldl9pc3N1ZV96ZXJvb3V0KG9zYi0+c2ItPnNfYmRldiwKIAkJCQlwX2Nwb3MgPDwgKG9zYi0+c19jbHVzdGVyc2l6ZV9iaXRzIC0gOSksCi0JCQkJemVyb19sZW4gPj4gOSwgR0ZQX0tFUk5FTCwgZmFsc2UpOworCQkJCXplcm9fbGVuX2hlYWQgPj4gOSwgR0ZQX05PRlMsIGZhbHNlKTsKIAkJaWYgKHJldCA8IDApCiAJCQltbG9nX2Vycm5vKHJldCk7CisKKwkJb2NmczJfaW5vZGVfdW5sb2NrKGlub2RlLCAwKTsKIAl9CiAKIGNsZWFuX29ycGhhbjoKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FvcHMuaCBiL2ZzL29jZnMyL2FvcHMuaAppbmRleCA2Y2FlMTU1Li5kZDU5NTk5IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9hb3BzLmgKKysrIGIvZnMvb2NmczIvYW9wcy5oCkBAIC0yMiw3ICsyMiw3IEBACiAjaWZuZGVmIE9DRlMyX0FPUFNfSAogI2RlZmluZSBPQ0ZTMl9BT1BTX0gKIAotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAKIGhhbmRsZV90ICpvY2ZzMl9zdGFydF93YWxrX3BhZ2VfdHJhbnMoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJCQkgc3RydWN0IHBhZ2UgKnBhZ2UsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jIGIvZnMvb2NmczIvY2x1c3Rlci9oZWFydGJlYXQuYwppbmRleCAxNmVmZjQ1Li44ZTE5YjlkIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL2hlYXJ0YmVhdC5jCisrKyBiL2ZzL29jZnMyL2NsdXN0ZXIvaGVhcnRiZWF0LmMKQEAgLTEzMTIsNyArMTMxMiw5IEBACiAJaW50IHJldCA9IC1FTk9NRU07CiAKIAlvMmhiX2RlYnVnX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihPMkhCX0RFQlVHX0RJUiwgTlVMTCk7Ci0JaWYgKCFvMmhiX2RlYnVnX2RpcikgeworCWlmIChJU19FUlJfT1JfTlVMTChvMmhiX2RlYnVnX2RpcikpIHsKKwkJcmV0ID0gbzJoYl9kZWJ1Z19kaXIgPworCQkJUFRSX0VSUihvMmhiX2RlYnVnX2RpcikgOiAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gYmFpbDsKIAl9CkBAIC0xMzI1LDcgKzEzMjcsOSBAQAogCQkJCQkJIHNpemVvZihvMmhiX2xpdmVfbm9kZV9iaXRtYXApLAogCQkJCQkJIE8yTk1fTUFYX05PREVTLAogCQkJCQkJIG8yaGJfbGl2ZV9ub2RlX2JpdG1hcCk7Ci0JaWYgKCFvMmhiX2RlYnVnX2xpdmVub2RlcykgeworCWlmIChJU19FUlJfT1JfTlVMTChvMmhiX2RlYnVnX2xpdmVub2RlcykpIHsKKwkJcmV0ID0gbzJoYl9kZWJ1Z19saXZlbm9kZXMgPworCQkJUFRSX0VSUihvMmhiX2RlYnVnX2xpdmVub2RlcykgOiAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gYmFpbDsKIAl9CkBAIC0xMzM4LDcgKzEzNDIsOSBAQAogCQkJCQkJICAgc2l6ZW9mKG8yaGJfbGl2ZV9yZWdpb25fYml0bWFwKSwKIAkJCQkJCSAgIE8yTk1fTUFYX1JFR0lPTlMsCiAJCQkJCQkgICBvMmhiX2xpdmVfcmVnaW9uX2JpdG1hcCk7Ci0JaWYgKCFvMmhiX2RlYnVnX2xpdmVyZWdpb25zKSB7CisJaWYgKElTX0VSUl9PUl9OVUxMKG8yaGJfZGVidWdfbGl2ZXJlZ2lvbnMpKSB7CisJCXJldCA9IG8yaGJfZGVidWdfbGl2ZXJlZ2lvbnMgPworCQkJUFRSX0VSUihvMmhiX2RlYnVnX2xpdmVyZWdpb25zKSA6IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBiYWlsOwogCX0KQEAgLTEzNTIsNyArMTM1OCw5IEBACiAJCQkJCSAgc2l6ZW9mKG8yaGJfcXVvcnVtX3JlZ2lvbl9iaXRtYXApLAogCQkJCQkgIE8yTk1fTUFYX1JFR0lPTlMsCiAJCQkJCSAgbzJoYl9xdW9ydW1fcmVnaW9uX2JpdG1hcCk7Ci0JaWYgKCFvMmhiX2RlYnVnX3F1b3J1bXJlZ2lvbnMpIHsKKwlpZiAoSVNfRVJSX09SX05VTEwobzJoYl9kZWJ1Z19xdW9ydW1yZWdpb25zKSkgeworCQlyZXQgPSBvMmhiX2RlYnVnX3F1b3J1bXJlZ2lvbnMgPworCQkJUFRSX0VSUihvMmhiX2RlYnVnX3F1b3J1bXJlZ2lvbnMpIDogLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIGJhaWw7CiAJfQpAQCAtMTM2Niw3ICsxMzc0LDkgQEAKIAkJCQkJICBzaXplb2YobzJoYl9mYWlsZWRfcmVnaW9uX2JpdG1hcCksCiAJCQkJCSAgTzJOTV9NQVhfUkVHSU9OUywKIAkJCQkJICBvMmhiX2ZhaWxlZF9yZWdpb25fYml0bWFwKTsKLQlpZiAoIW8yaGJfZGVidWdfZmFpbGVkcmVnaW9ucykgeworCWlmIChJU19FUlJfT1JfTlVMTChvMmhiX2RlYnVnX2ZhaWxlZHJlZ2lvbnMpKSB7CisJCXJldCA9IG8yaGJfZGVidWdfZmFpbGVkcmVnaW9ucyA/CisJCQlQVFJfRVJSKG8yaGJfZGVidWdfZmFpbGVkcmVnaW9ucykgOiAtRU5PTUVNOwogCQltbG9nX2Vycm5vKHJldCk7CiAJCWdvdG8gYmFpbDsKIAl9CkBAIC0yMDAwLDcgKzIwMTAsOCBAQAogCiAJcmVnLT5ocl9kZWJ1Z19kaXIgPQogCQlkZWJ1Z2ZzX2NyZWF0ZV9kaXIoY29uZmlnX2l0ZW1fbmFtZSgmcmVnLT5ocl9pdGVtKSwgZGlyKTsKLQlpZiAoIXJlZy0+aHJfZGVidWdfZGlyKSB7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlZy0+aHJfZGVidWdfZGlyKSkgeworCQlyZXQgPSByZWctPmhyX2RlYnVnX2RpciA/IFBUUl9FUlIocmVnLT5ocl9kZWJ1Z19kaXIpIDogLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIGJhaWw7CiAJfQpAQCAtMjAxMyw3ICsyMDI0LDkgQEAKIAkJCQkJICBPMkhCX0RCX1RZUEVfUkVHSU9OX0xJVkVOT0RFUywKIAkJCQkJICBzaXplb2YocmVnLT5ocl9saXZlX25vZGVfYml0bWFwKSwKIAkJCQkJICBPMk5NX01BWF9OT0RFUywgcmVnKTsKLQlpZiAoIXJlZy0+aHJfZGVidWdfbGl2ZW5vZGVzKSB7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlZy0+aHJfZGVidWdfbGl2ZW5vZGVzKSkgeworCQlyZXQgPSByZWctPmhyX2RlYnVnX2xpdmVub2RlcyA/CisJCQlQVFJfRVJSKHJlZy0+aHJfZGVidWdfbGl2ZW5vZGVzKSA6IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBiYWlsOwogCX0KQEAgLTIwMjUsNyArMjAzOCw5IEBACiAJCQkJCSAgc2l6ZW9mKCoocmVnLT5ocl9kYl9yZWdudW0pKSwKIAkJCQkJICBPMkhCX0RCX1RZUEVfUkVHSU9OX05VTUJFUiwKIAkJCQkJICAwLCBPMk5NX01BWF9OT0RFUywgcmVnKTsKLQlpZiAoIXJlZy0+aHJfZGVidWdfcmVnbnVtKSB7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlZy0+aHJfZGVidWdfcmVnbnVtKSkgeworCQlyZXQgPSByZWctPmhyX2RlYnVnX3JlZ251bSA/CisJCQlQVFJfRVJSKHJlZy0+aHJfZGVidWdfcmVnbnVtKSA6IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBiYWlsOwogCX0KQEAgLTIwMzcsNyArMjA1Miw5IEBACiAJCQkJCSAgc2l6ZW9mKCoocmVnLT5ocl9kYl9lbGFwc2VkX3RpbWUpKSwKIAkJCQkJICBPMkhCX0RCX1RZUEVfUkVHSU9OX0VMQVBTRURfVElNRSwKIAkJCQkJICAwLCAwLCByZWcpOwotCWlmICghcmVnLT5ocl9kZWJ1Z19lbGFwc2VkX3RpbWUpIHsKKwlpZiAoSVNfRVJSX09SX05VTEwocmVnLT5ocl9kZWJ1Z19lbGFwc2VkX3RpbWUpKSB7CisJCXJldCA9IHJlZy0+aHJfZGVidWdfZWxhcHNlZF90aW1lID8KKwkJCVBUUl9FUlIocmVnLT5ocl9kZWJ1Z19lbGFwc2VkX3RpbWUpIDogLUVOT01FTTsKIAkJbWxvZ19lcnJubyhyZXQpOwogCQlnb3RvIGJhaWw7CiAJfQpAQCAtMjA0OSwxMyArMjA2NiwxNiBAQAogCQkJCQkgIHNpemVvZigqKHJlZy0+aHJfZGJfcGlubmVkKSksCiAJCQkJCSAgTzJIQl9EQl9UWVBFX1JFR0lPTl9QSU5ORUQsCiAJCQkJCSAgMCwgMCwgcmVnKTsKLQlpZiAoIXJlZy0+aHJfZGVidWdfcGlubmVkKSB7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlZy0+aHJfZGVidWdfcGlubmVkKSkgeworCQlyZXQgPSByZWctPmhyX2RlYnVnX3Bpbm5lZCA/CisJCQlQVFJfRVJSKHJlZy0+aHJfZGVidWdfcGlubmVkKSA6IC1FTk9NRU07CiAJCW1sb2dfZXJybm8ocmV0KTsKIAkJZ290byBiYWlsOwogCX0KIAotCXJldCA9IDA7CisJcmV0dXJuIDA7CiBiYWlsOgorCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShyZWctPmhyX2RlYnVnX2Rpcik7CiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvY2x1c3Rlci9tYXNrbG9nLmggYi9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuaAppbmRleCAyMjYwZmI5Li43ZmRjMjVhIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuaAorKysgYi9mcy9vY2ZzMi9jbHVzdGVyL21hc2tsb2cuaApAQCAtMTk2LDEzICsxOTYsMTQgQEAKIAl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIG1sb2dfZXJybm8oc3QpIGRvIHsJCQkJCQlcCisjZGVmaW5lIG1sb2dfZXJybm8oc3QpICh7CQkJCQkJXAogCWludCBfc3QgPSAoc3QpOwkJCQkJCQlcCiAJaWYgKF9zdCAhPSAtRVJFU1RBUlRTWVMgJiYgX3N0ICE9IC1FSU5UUiAmJgkJCVwKIAkgICAgX3N0ICE9IEFPUF9UUlVOQ0FURURfUEFHRSAmJiBfc3QgIT0gLUVOT1NQQyAmJgkJXAogCSAgICBfc3QgIT0gLUVEUVVPVCkJCQkJCQlcCiAJCW1sb2coTUxfRVJST1IsICJzdGF0dXMgPSAlbGxkXG4iLCAobG9uZyBsb25nKV9zdCk7CVwKLX0gd2hpbGUgKDApCisJX3N0OwkJCQkJCQkJXAorfSkKIAogI2RlZmluZSBtbG9nX2J1Z19vbl9tc2coY29uZCwgZm10LCBhcmdzLi4uKSBkbyB7CQkJXAogCWlmIChjb25kKSB7CQkJCQkJCVwKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2Rpci5jIGIvZnMvb2NmczIvZGlyLmMKaW5kZXggYjA4MDUwYi4uY2NkNGRjZiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZGlyLmMKKysrIGIvZnMvb2NmczIvZGlyLmMKQEAgLTE4LDcgKzE4LDcgQEAKICAqCiAgKiAgIGxpbnV4L2ZzL21pbml4L2Rpci5jCiAgKgotICogICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXggVG9ydmFsZHMKKyAqICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCkBAIC0yMDQ3LDIyICsyMDQ3LDE5IEBACiAJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICAgaW50IG5hbWVsZW4pCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3Qgb2NmczJfZGlyX2xvb2t1cF9yZXN1bHQgbG9va3VwID0geyBOVUxMLCB9OwogCiAJdHJhY2Vfb2NmczJfY2hlY2tfZGlyX2Zvcl9lbnRyeSgKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZylPQ0ZTMl9JKGRpciktPmlwX2Jsa25vLCBuYW1lbGVuLCBuYW1lKTsKIAotCXJldCA9IC1FRVhJU1Q7Ci0JaWYgKG9jZnMyX2ZpbmRfZW50cnkobmFtZSwgbmFtZWxlbiwgZGlyLCAmbG9va3VwKSA9PSAwKQotCQlnb3RvIGJhaWw7CisJaWYgKG9jZnMyX2ZpbmRfZW50cnkobmFtZSwgbmFtZWxlbiwgZGlyLCAmbG9va3VwKSA9PSAwKSB7CisJCXJldCA9IC1FRVhJU1Q7CisJCW1sb2dfZXJybm8ocmV0KTsKKwl9CiAKLQlyZXQgPSAwOwotYmFpbDoKIAlvY2ZzMl9mcmVlX2Rpcl9sb29rdXBfcmVzdWx0KCZsb29rdXApOwogCi0JaWYgKHJldCkKLQkJbWxvZ19lcnJubyhyZXQpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2RsbWdsdWUuYyBiL2ZzL29jZnMyL2RsbWdsdWUuYwppbmRleCAxMTg0OWE0Li45NTZlZGY2IDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9kbG1nbHVlLmMKKysrIGIvZnMvb2NmczIvZGxtZ2x1ZS5jCkBAIC0xMzkxLDYgKzEzOTEsMTEgQEAKIAlpbnQgbm9xdWV1ZV9hdHRlbXB0ZWQgPSAwOwogCWludCBkbG1fbG9ja2VkID0gMDsKIAorCWlmICghKGxvY2tyZXMtPmxfZmxhZ3MgJiBPQ0ZTMl9MT0NLX0lOSVRJQUxJWkVEKSkgeworCQltbG9nX2Vycm5vKC1FSU5WQUwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlvY2ZzMl9pbml0X21hc2tfd2FpdGVyKCZtdyk7CiAKIAlpZiAobG9ja3Jlcy0+bF9vcHMtPmZsYWdzICYgTE9DS19UWVBFX1VTRVNfTFZCKQpAQCAtMjk1NCw3ICsyOTU5LDcgQEAKIAkJCQkJCQkgb3NiLT5vc2JfZGVidWdfcm9vdCwKIAkJCQkJCQkgb3NiLAogCQkJCQkJCSAmb2NmczJfZGxtX2RlYnVnX2ZvcHMpOwotCWlmICghZGxtX2RlYnVnLT5kX2xvY2tpbmdfc3RhdGUpIHsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGxtX2RlYnVnLT5kX2xvY2tpbmdfc3RhdGUpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCW1sb2coTUxfRVJST1IsCiAJCSAgICAgIlVuYWJsZSB0byBjcmVhdGUgbG9ja2luZyBzdGF0ZSBkZWJ1Z2ZzIGZpbGUuXG4iKTsKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2V4cG9ydC5jIGIvZnMvb2NmczIvZXhwb3J0LmMKaW5kZXggMjk2NTExNi4uNTQwZGM0YiAxMDA2NDQKLS0tIGEvZnMvb2NmczIvZXhwb3J0LmMKKysrIGIvZnMvb2NmczIvZXhwb3J0LmMKQEAgLTgyLDcgKzgyLDYgQEAKIAl9CiAKIAlzdGF0dXMgPSBvY2ZzMl90ZXN0X2lub2RlX2JpdChvc2IsIGJsa25vLCAmc2V0KTsKLQl0cmFjZV9vY2ZzMl9nZXRfZGVudHJ5X3Rlc3RfYml0KHN0YXR1cywgc2V0KTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlpZiAoc3RhdHVzID09IC1FSU5WQUwpIHsKIAkJCS8qCkBAIC05Niw2ICs5NSw3IEBACiAJCWdvdG8gdW5sb2NrX25mc19zeW5jOwogCX0KIAorCXRyYWNlX29jZnMyX2dldF9kZW50cnlfdGVzdF9iaXQoc3RhdHVzLCBzZXQpOwogCS8qIElmIHRoZSBpbm9kZSBhbGxvY2F0b3IgYml0IGlzIGNsZWFyLCB0aGlzIGlub2RlIG11c3QgYmUgc3RhbGUgKi8KIAlpZiAoIXNldCkgewogCQlzdGF0dXMgPSAtRVNUQUxFOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvZmlsZS5jIGIvZnMvb2NmczIvZmlsZS5jCmluZGV4IDQ2ZTBkNGUuLjhjNDhlOTggMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL2ZpbGUuYworKysgYi9mcy9vY2ZzMi9maWxlLmMKQEAgLTIyODAsNyArMjI4MCw3IEBACiAJCWZpbGUtPmZfcGF0aC5kZW50cnktPmRfbmFtZS5uYW1lLAogCQkodW5zaWduZWQgaW50KWZyb20tPm5yX3NlZ3MpOwkvKiBHUlJSUlIgKi8KIAotCWlmIChpb2NiLT5raV9uYnl0ZXMgPT0gMCkKKwlpZiAoY291bnQgPT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlhcHBlbmRpbmcgPSBmaWxlLT5mX2ZsYWdzICYgT19BUFBFTkQgPyAxIDogMDsKQEAgLTIzMzAsOCArMjMzMCw3IEBACiAJfQogCiAJY2FuX2RvX2RpcmVjdCA9IGRpcmVjdF9pbzsKLQlyZXQgPSBvY2ZzMl9wcmVwYXJlX2lub2RlX2Zvcl93cml0ZShmaWxlLCBwcG9zLAotCQkJCQkgICAgaW9jYi0+a2lfbmJ5dGVzLCBhcHBlbmRpbmcsCisJcmV0ID0gb2NmczJfcHJlcGFyZV9pbm9kZV9mb3Jfd3JpdGUoZmlsZSwgcHBvcywgY291bnQsIGFwcGVuZGluZywKIAkJCQkJICAgICZjYW5fZG9fZGlyZWN0LCAmaGFzX3JlZmNvdW50KTsKIAlpZiAocmV0IDwgMCkgewogCQltbG9nX2Vycm5vKHJldCk7CkBAIC0yMzM5LDggKzIzMzgsNyBAQAogCX0KIAogCWlmIChkaXJlY3RfaW8gJiYgIWlzX3N5bmNfa2lvY2IoaW9jYikpCi0JCXVuYWxpZ25lZF9kaW8gPSBvY2ZzMl9pc19pb191bmFsaWduZWQoaW5vZGUsIGlvY2ItPmtpX25ieXRlcywKLQkJCQkJCSAgICAgICpwcG9zKTsKKwkJdW5hbGlnbmVkX2RpbyA9IG9jZnMyX2lzX2lvX3VuYWxpZ25lZChpbm9kZSwgY291bnQsICpwcG9zKTsKIAogCS8qCiAJICogV2UgY2FuJ3QgY29tcGxldGUgdGhlIGRpcmVjdCBJL08gYXMgcmVxdWVzdGVkLCBmYWxsIGJhY2sgdG8KQEAgLTIzOTQsNyArMjM5Miw2IEBACiAJCS8qCiAJCSAqIGZvciBjb21wbGV0aW5nIHRoZSByZXN0IG9mIHRoZSByZXF1ZXN0LgogCQkgKi8KLQkJKnBwb3MgKz0gd3JpdHRlbjsKIAkJY291bnQgLT0gd3JpdHRlbjsKIAkJd3JpdHRlbl9idWZmZXJlZCA9IGdlbmVyaWNfcGVyZm9ybV93cml0ZShmaWxlLCBmcm9tLCAqcHBvcyk7CiAJCS8qCkBAIC0yNDA5LDcgKzI0MDYsNiBAQAogCQkJZ290byBvdXRfZGlvOwogCQl9CiAKLQkJaW9jYi0+a2lfcG9zID0gKnBwb3MgKyB3cml0dGVuX2J1ZmZlcmVkOwogCQkvKiBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZSBwYWdlIGNhY2hlIHBhZ2VzIGFyZSB3cml0dGVuIHRvCiAJCSAqIGRpc2sgYW5kIGludmFsaWRhdGVkIHRvIHByZXNlcnZlIHRoZSBleHBlY3RlZCBPX0RJUkVDVAogCQkgKiBzZW1hbnRpY3MuCkBAIC0yNDE4LDYgKzI0MTQsNyBAQAogCQlyZXQgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGZpbGUtPmZfbWFwcGluZywgKnBwb3MsCiAJCQkJZW5kYnl0ZSk7CiAJCWlmIChyZXQgPT0gMCkgeworCQkJaW9jYi0+a2lfcG9zID0gKnBwb3MgKyB3cml0dGVuX2J1ZmZlcmVkOwogCQkJd3JpdHRlbiArPSB3cml0dGVuX2J1ZmZlcmVkOwogCQkJaW52YWxpZGF0ZV9tYXBwaW5nX3BhZ2VzKG1hcHBpbmcsCiAJCQkJCSpwcG9zID4+IFBBR0VfQ0FDSEVfU0hJRlQsCkBAIC0yNDQwLDEwICsyNDM3LDE0IEBACiAJLyogYnVmZmVyZWQgYWlvIHdvdWxkbid0IGhhdmUgcHJvcGVyIGxvY2sgY292ZXJhZ2UgdG9kYXkgKi8KIAlCVUdfT04ocmV0ID09IC1FSU9DQlFVRVVFRCAmJiAhKGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkpOwogCisJaWYgKHVubGlrZWx5KHdyaXR0ZW4gPD0gMCkpCisJCWdvdG8gbm9fc3luYzsKKwogCWlmICgoKGZpbGUtPmZfZmxhZ3MgJiBPX0RTWU5DKSAmJiAhZGlyZWN0X2lvKSB8fCBJU19TWU5DKGlub2RlKSB8fAogCSAgICAoKGZpbGUtPmZfZmxhZ3MgJiBPX0RJUkVDVCkgJiYgIWRpcmVjdF9pbykpIHsKLQkJcmV0ID0gZmlsZW1hcF9mZGF0YXdyaXRlX3JhbmdlKGZpbGUtPmZfbWFwcGluZywgKnBwb3MsCi0JCQkJCSAgICAgICAqcHBvcyArIGNvdW50IC0gMSk7CisJCXJldCA9IGZpbGVtYXBfZmRhdGF3cml0ZV9yYW5nZShmaWxlLT5mX21hcHBpbmcsCisJCQkJCSAgICAgICBpb2NiLT5raV9wb3MgLSB3cml0dGVuLAorCQkJCQkgICAgICAgaW9jYi0+a2lfcG9zIC0gMSk7CiAJCWlmIChyZXQgPCAwKQogCQkJd3JpdHRlbiA9IHJldDsKIApAQCAtMjQ1NCwxMCArMjQ1NSwxMiBAQAogCQl9CiAKIAkJaWYgKCFyZXQpCi0JCQlyZXQgPSBmaWxlbWFwX2ZkYXRhd2FpdF9yYW5nZShmaWxlLT5mX21hcHBpbmcsICpwcG9zLAotCQkJCQkJICAgICAgKnBwb3MgKyBjb3VudCAtIDEpOworCQkJcmV0ID0gZmlsZW1hcF9mZGF0YXdhaXRfcmFuZ2UoZmlsZS0+Zl9tYXBwaW5nLAorCQkJCQkJICAgICAgaW9jYi0+a2lfcG9zIC0gd3JpdHRlbiwKKwkJCQkJCSAgICAgIGlvY2ItPmtpX3BvcyAtIDEpOwogCX0KIAorbm9fc3luYzoKIAkvKgogCSAqIGRlZXAgaW4gZ19mX2Ffd19uKCktPm9jZnMyX2RpcmVjdF9JTyB3ZSBwYXNzIGluIGEgb2NmczJfZGlvX2VuZF9pbwogCSAqIGZ1bmN0aW9uIHBvaW50ZXIgd2hpY2ggaXMgY2FsbGVkIHdoZW4gb19kaXJlY3QgaW8gY29tcGxldGVzIHNvIHRoYXQKQEAgLTI2NzgsOCArMjY4MSw2IEBACiAgKi8KIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZm9wcyA9IHsKIAkubGxzZWVrCQk9IG9jZnMyX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS5tbWFwCQk9IG9jZnMyX21tYXAsCiAJLmZzeW5jCQk9IG9jZnMyX3N5bmNfZmlsZSwKIAkucmVsZWFzZQk9IG9jZnMyX2ZpbGVfcmVsZWFzZSwKQEAgLTI3MjYsOCArMjcyNyw2IEBACiAgKi8KIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb2NmczJfZm9wc19ub19wbG9ja3MgPSB7CiAJLmxsc2VlawkJPSBvY2ZzMl9maWxlX2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkubW1hcAkJPSBvY2ZzMl9tbWFwLAogCS5mc3luYwkJPSBvY2ZzMl9zeW5jX2ZpbGUsCiAJLnJlbGVhc2UJPSBvY2ZzMl9maWxlX3JlbGVhc2UsCmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9pbm9kZS5jIGIvZnMvb2NmczIvaW5vZGUuYwppbmRleCAzMDI1YzBkLi5iZTcxY2EwIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9pbm9kZS5jCisrKyBiL2ZzL29jZnMyL2lub2RlLmMKQEAgLTYyNCw3ICs2MjQsNyBAQAogCQlvY2ZzMl9nZXRfc3lzdGVtX2ZpbGVfaW5vZGUob3NiLCBJTk9ERV9BTExPQ19TWVNURU1fSU5PREUsCiAJCQkJCSAgICBsZTE2X3RvX2NwdShkaS0+aV9zdWJhbGxvY19zbG90KSk7CiAJaWYgKCFpbm9kZV9hbGxvY19pbm9kZSkgewotCQlzdGF0dXMgPSAtRUVYSVNUOworCQlzdGF0dXMgPSAtRU5PRU5UOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gYmFpbDsKIAl9CkBAIC03NDIsNyArNzQyLDcgQEAKIAkJCQkJCQkgICAgICAgT1JQSEFOX0RJUl9TWVNURU1fSU5PREUsCiAJCQkJCQkJICAgICAgIG9ycGhhbmVkX3Nsb3QpOwogCQlpZiAoIW9ycGhhbl9kaXJfaW5vZGUpIHsKLQkJCXN0YXR1cyA9IC1FRVhJU1Q7CisJCQlzdGF0dXMgPSAtRU5PRU5UOwogCQkJbWxvZ19lcnJubyhzdGF0dXMpOwogCQkJZ290byBiYWlsOwogCQl9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMgYi9mcy9vY2ZzMi9sb2NhbGFsbG9jLmMKaW5kZXggMDQ0MDEzNC4uODU3YmJiYyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvbG9jYWxhbGxvYy5jCisrKyBiL2ZzL29jZnMyL2xvY2FsYWxsb2MuYwpAQCAtNjY2LDcgKzY2Niw3IEBACiAJaWYgKGxlMzJfdG9fY3B1KGFsbG9jLT5pZDEuYml0bWFwMS5pX3VzZWQpICE9CiAJICAgIG9jZnMyX2xvY2FsX2FsbG9jX2NvdW50X2JpdHMoYWxsb2MpKSB7CiAJCW9jZnMyX2Vycm9yKG9zYi0+c2IsICJsb2NhbCBhbGxvYyBpbm9kZSAlbGx1IHNheXMgaXQgaGFzICIKLQkJCSAgICAiJXUgZnJlZSBiaXRzLCBidXQgYSBjb3VudCBzaG93cyAldSIsCisJCQkgICAgIiV1IHVzZWQgYml0cywgYnV0IGEgY291bnQgc2hvd3MgJXUiLAogCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoYWxsb2MtPmlfYmxrbm8pLAogCQkJICAgIGxlMzJfdG9fY3B1KGFsbG9jLT5pZDEuYml0bWFwMS5pX3VzZWQpLAogCQkJICAgIG9jZnMyX2xvY2FsX2FsbG9jX2NvdW50X2JpdHMoYWxsb2MpKTsKQEAgLTgzOSw3ICs4MzksNyBAQAogCQkJCSAgICAgdTMyICpudW1iaXRzLAogCQkJCSAgICAgc3RydWN0IG9jZnMyX2FsbG9jX3Jlc2VydmF0aW9uICpyZXN2KQogewotCWludCBudW1mb3VuZCwgYml0b2ZmLCBsZWZ0LCBzdGFydG9mZiwgbGFzdHplcm87CisJaW50IG51bWZvdW5kID0gMCwgYml0b2ZmLCBsZWZ0LCBzdGFydG9mZiwgbGFzdHplcm87CiAJaW50IGxvY2FsX3Jlc3YgPSAwOwogCXN0cnVjdCBvY2ZzMl9hbGxvY19yZXNlcnZhdGlvbiByOwogCXZvaWQgKmJpdG1hcCA9IE5VTEw7CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9uYW1laS5jIGIvZnMvb2NmczIvbmFtZWkuYwppbmRleCBiNWMzYTVlLi4wOWY5MGNiIDEwMDY0NAotLS0gYS9mcy9vY2ZzMi9uYW1laS5jCisrKyBiL2ZzL29jZnMyL25hbWVpLmMKQEAgLTIzMjIsMTAgKzIzMjIsMTAgQEAKIAogCXRyYWNlX29jZnMyX29ycGhhbl9kZWwoCiAJICAgICAodW5zaWduZWQgbG9uZyBsb25nKU9DRlMyX0kob3JwaGFuX2Rpcl9pbm9kZSktPmlwX2Jsa25vLAotCSAgICAgbmFtZSwgbmFtZWxlbik7CisJICAgICBuYW1lLCBzdHJsZW4obmFtZSkpOwogCiAJLyogZmluZCBpdCdzIHNwb3QgaW4gdGhlIG9ycGhhbiBkaXJlY3RvcnkgKi8KLQlzdGF0dXMgPSBvY2ZzMl9maW5kX2VudHJ5KG5hbWUsIG5hbWVsZW4sIG9ycGhhbl9kaXJfaW5vZGUsCisJc3RhdHVzID0gb2NmczJfZmluZF9lbnRyeShuYW1lLCBzdHJsZW4obmFtZSksIG9ycGhhbl9kaXJfaW5vZGUsCiAJCQkJICAmbG9va3VwKTsKIAlpZiAoc3RhdHVzKSB7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKQEAgLTI4MDgsNyArMjgwOCw3IEBACiAJCQkJCQkgICAgICAgT1JQSEFOX0RJUl9TWVNURU1fSU5PREUsCiAJCQkJCQkgICAgICAgb3NiLT5zbG90X251bSk7CiAJaWYgKCFvcnBoYW5fZGlyX2lub2RlKSB7Ci0JCXN0YXR1cyA9IC1FRVhJU1Q7CisJCXN0YXR1cyA9IC1FTk9FTlQ7CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBsZWF2ZTsKIAl9CmRpZmYgLS1naXQgYS9mcy9vY2ZzMi9yZWZjb3VudHRyZWUuYyBiL2ZzL29jZnMyL3JlZmNvdW50dHJlZS5jCmluZGV4IGVlNTQxZjkuLmRmM2E1MDAgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3JlZmNvdW50dHJlZS5jCisrKyBiL2ZzL29jZnMyL3JlZmNvdW50dHJlZS5jCkBAIC00Mjc2LDcgKzQyNzYsNyBAQAogCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZShkaXIsICZtb2RlLCAmZGVmYXVsdF9hY2wsICZhY2wpOwogCWlmIChlcnJvcikgewogCQltbG9nX2Vycm5vKGVycm9yKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiBlcnJvcjsKIAl9CiAKIAllcnJvciA9IG9jZnMyX2NyZWF0ZV9pbm9kZV9pbl9vcnBoYW4oZGlyLCBtb2RlLApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc2xvdF9tYXAuYyBiL2ZzL29jZnMyL3Nsb3RfbWFwLmMKaW5kZXggZDU0OTNlMy4uZTc4YTIwMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc2xvdF9tYXAuYworKysgYi9mcy9vY2ZzMi9zbG90X21hcC5jCkBAIC00MjcsNyArNDI3LDcgQEAKIAlpZiAoIXNpKSB7CiAJCXN0YXR1cyA9IC1FTk9NRU07CiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKLQkJZ290byBiYWlsOworCQlyZXR1cm4gc3RhdHVzOwogCX0KIAogCXNpLT5zaV9leHRlbmRlZCA9IG9jZnMyX3VzZXNfZXh0ZW5kZWRfc2xvdF9tYXAob3NiKTsKQEAgLTQ1Miw3ICs0NTIsNyBAQAogCiAJb3NiLT5zbG90X2luZm8gPSAoc3RydWN0IG9jZnMyX3Nsb3RfaW5mbyAqKXNpOwogYmFpbDoKLQlpZiAoc3RhdHVzIDwgMCAmJiBzaSkKKwlpZiAoc3RhdHVzIDwgMCkKIAkJX19vY2ZzMl9mcmVlX3Nsb3RfaW5mbyhzaSk7CiAKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3RhY2tfbzJjYi5jIGIvZnMvb2NmczIvc3RhY2tfbzJjYi5jCmluZGV4IDE3MjRkNDMuLjIyMGNhZTcgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N0YWNrX28yY2IuYworKysgYi9mcy9vY2ZzMi9zdGFja19vMmNiLmMKQEAgLTI5NSw3ICsyOTUsNyBAQAogCQlzZXRfYml0KG5vZGVfbnVtLCBuZXRtYXApOwogCQlpZiAoIW1lbWNtcChoYm1hcCwgbmV0bWFwLCBzaXplb2YoaGJtYXApKSkKIAkJCXJldHVybiAwOwotCQlpZiAoaSA8IE8yQ0JfTUFQX1NUQUJJTElaRV9DT1VOVCkKKwkJaWYgKGkgPCBPMkNCX01BUF9TVEFCSUxJWkVfQ09VTlQgLSAxKQogCQkJbXNsZWVwKDEwMDApOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3RhY2tfdXNlci5jIGIvZnMvb2NmczIvc3RhY2tfdXNlci5jCmluZGV4IDcyMGFhMzguLjI3NjhlYjEgMTAwNjQ0Ci0tLSBhL2ZzL29jZnMyL3N0YWNrX3VzZXIuYworKysgYi9mcy9vY2ZzMi9zdGFja191c2VyLmMKQEAgLTEwMDQsMTAgKzEwMDQsOCBAQAogCUJVR19PTihjb25uID09IE5VTEwpOwogCiAJbGMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb2NmczJfbGl2ZV9jb25uZWN0aW9uKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFsYykgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoIWxjKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmxjLT5vY193YWl0KTsKIAlpbml0X2NvbXBsZXRpb24oJmxjLT5vY19zeW5jX3dhaXQpOwpAQCAtMTA2Myw3ICsxMDYxLDcgQEAKIAl9CiAKIG91dDoKLQlpZiAocmMgJiYgbGMpCisJaWYgKHJjKQogCQlrZnJlZShsYyk7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3ViYWxsb2MuYyBiL2ZzL29jZnMyL3N1YmFsbG9jLmMKaW5kZXggMGNiODg5YS4uNDQ3OTAyOSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3ViYWxsb2MuYworKysgYi9mcy9vY2ZzMi9zdWJhbGxvYy5jCkBAIC0yNDk5LDYgKzI0OTksOCBAQAogCQkJCQkgYWxsb2NfYmgsIE9DRlMyX0pPVVJOQUxfQUNDRVNTX1dSSVRFKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQltbG9nX2Vycm5vKHN0YXR1cyk7CisJCW9jZnMyX2Jsb2NrX2dyb3VwX3NldF9iaXRzKGhhbmRsZSwgYWxsb2NfaW5vZGUsIGdyb3VwLCBncm91cF9iaCwKKwkJCQlzdGFydF9iaXQsIGNvdW50KTsKIAkJZ290byBiYWlsOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvb2NmczIvc3VwZXIuYyBiL2ZzL29jZnMyL3N1cGVyLmMKaW5kZXggMjY2NzUxOC4uODM3ZGRjZSAxMDA2NDQKLS0tIGEvZnMvb2NmczIvc3VwZXIuYworKysgYi9mcy9vY2ZzMi9zdXBlci5jCkBAIC0xMTEyLDcgKzExMTIsNyBAQAogCiAJb3NiLT5vc2JfZGVidWdfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2Rpcihvc2ItPnV1aWRfc3RyLAogCQkJCQkJIG9jZnMyX2RlYnVnZnNfcm9vdCk7Ci0JaWYgKCFvc2ItPm9zYl9kZWJ1Z19yb290KSB7CisJaWYgKElTX0VSUl9PUl9OVUxMKG9zYi0+b3NiX2RlYnVnX3Jvb3QpKSB7CiAJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCW1sb2coTUxfRVJST1IsICJVbmFibGUgdG8gY3JlYXRlIHBlci1tb3VudCBkZWJ1Z2ZzIHJvb3QuXG4iKTsKIAkJZ290byByZWFkX3N1cGVyX2Vycm9yOwpAQCAtMTEyMiw3ICsxMTIyLDcgQEAKIAkJCQkJICAgIG9zYi0+b3NiX2RlYnVnX3Jvb3QsCiAJCQkJCSAgICBvc2IsCiAJCQkJCSAgICAmb2NmczJfb3NiX2RlYnVnX2ZvcHMpOwotCWlmICghb3NiLT5vc2JfY3R4dCkgeworCWlmIChJU19FUlJfT1JfTlVMTChvc2ItPm9zYl9jdHh0KSkgewogCQlzdGF0dXMgPSAtRUlOVkFMOwogCQltbG9nX2Vycm5vKHN0YXR1cyk7CiAJCWdvdG8gcmVhZF9zdXBlcl9lcnJvcjsKQEAgLTE2MDYsOCArMTYwNiw5IEBACiAJfQogCiAJb2NmczJfZGVidWdmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJvY2ZzMiIsIE5VTEwpOwotCWlmICghb2NmczJfZGVidWdmc19yb290KSB7Ci0JCXN0YXR1cyA9IC1FTk9NRU07CisJaWYgKElTX0VSUl9PUl9OVUxMKG9jZnMyX2RlYnVnZnNfcm9vdCkpIHsKKwkJc3RhdHVzID0gb2NmczJfZGVidWdmc19yb290ID8KKwkJCVBUUl9FUlIob2NmczJfZGVidWdmc19yb290KSA6IC1FTk9NRU07CiAJCW1sb2coTUxfRVJST1IsICJVbmFibGUgdG8gY3JlYXRlIG9jZnMyIGRlYnVnZnMgcm9vdC5cbiIpOwogCQlnb3RvIG91dDQ7CiAJfQpAQCAtMjA2OSw2ICsyMDcwLDggQEAKIAljYml0cyA9IGxlMzJfdG9fY3B1KGRpLT5pZDIuaV9zdXBlci5zX2NsdXN0ZXJzaXplX2JpdHMpOwogCWJiaXRzID0gbGUzMl90b19jcHUoZGktPmlkMi5pX3N1cGVyLnNfYmxvY2tzaXplX2JpdHMpOwogCXNiLT5zX21heGJ5dGVzID0gb2NmczJfbWF4X2ZpbGVfb2Zmc2V0KGJiaXRzLCBjYml0cyk7CisJbWVtY3B5KHNiLT5zX3V1aWQsIGRpLT5pZDIuaV9zdXBlci5zX3V1aWQsCisJICAgICAgIHNpemVvZihkaS0+aWQyLmlfc3VwZXIuc191dWlkKSk7CiAKIAlvc2ItPm9zYl9keF9tYXNrID0gKDEgPDwgKGNiaXRzIC0gYmJpdHMpKSAtIDE7CiAKQEAgLTIzMzMsNyArMjMzNiw3IEBACiAJCW1sb2dfZXJybm8oc3RhdHVzKTsKIAkJZ290byBiYWlsOwogCX0KLQljbGVhbmNhY2hlX2luaXRfc2hhcmVkX2ZzKChjaGFyICopJmRpLT5pZDIuaV9zdXBlci5zX3V1aWQsIHNiKTsKKwljbGVhbmNhY2hlX2luaXRfc2hhcmVkX2ZzKHNiKTsKIAogYmFpbDoKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMjU2MywyMiArMjU2NiwyMiBAQAogCW9jZnMyX3NldF9yb19mbGFnKG9zYiwgMCk7CiB9CiAKLXN0YXRpYyBjaGFyIGVycm9yX2J1ZlsxMDI0XTsKLQotdm9pZCBfX29jZnMyX2Vycm9yKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCi0JCSAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAotCQkgICBjb25zdCBjaGFyICpmbXQsIC4uLikKK3ZvaWQgX19vY2ZzMl9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBjb25zdCBjaGFyICpmdW5jdGlvbiwKKwkJICBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXZzbnByaW50ZihlcnJvcl9idWYsIHNpemVvZihlcnJvcl9idWYpLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKKwl2YWYuZm10ID0gZm10OworCXZhZi52YSA9ICZhcmdzOwogCiAJLyogTm90IHVzaW5nIG1sb2cgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gc2hvdyB0aGUgYWN0dWFsCiAJICogZnVuY3Rpb24gdGhlIGVycm9yIGNhbWUgZnJvbS4gKi8KLQlwcmludGsoS0VSTl9DUklUICJPQ0ZTMjogRVJST1IgKGRldmljZSAlcyk6ICVzOiAlc1xuIiwKLQkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCBlcnJvcl9idWYpOworCXByaW50ayhLRVJOX0NSSVQgIk9DRlMyOiBFUlJPUiAoZGV2aWNlICVzKTogJXM6ICVwVlxuIiwKKwkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCAmdmFmKTsKKworCXZhX2VuZChhcmdzKTsKIAogCW9jZnMyX2hhbmRsZV9lcnJvcihzYik7CiB9CkBAIC0yNTg2LDE4ICsyNTg5LDIxIEBACiAvKiBIYW5kbGUgY3JpdGljYWwgZXJyb3JzLiBUaGlzIGlzIGludGVudGlvbmFsbHkgbW9yZSBkcmFzdGljIHRoYW4KICAqIG9jZnMyX2hhbmRsZV9lcnJvciwgc28gd2Ugb25seSB1c2UgZm9yIHRoaW5ncyBsaWtlIGpvdXJuYWwgZXJyb3JzLAogICogZXRjLiAqLwotdm9pZCBfX29jZnMyX2Fib3J0KHN0cnVjdCBzdXBlcl9ibG9jayogc2IsCi0JCSAgIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAordm9pZCBfX29jZnMyX2Fib3J0KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNvbnN0IGNoYXIgKmZ1bmN0aW9uLAogCQkgICBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKKwlzdHJ1Y3QgdmFfZm9ybWF0IHZhZjsKIAl2YV9saXN0IGFyZ3M7CiAKIAl2YV9zdGFydChhcmdzLCBmbXQpOwotCXZzbnByaW50ZihlcnJvcl9idWYsIHNpemVvZihlcnJvcl9idWYpLCBmbXQsIGFyZ3MpOwotCXZhX2VuZChhcmdzKTsKIAotCXByaW50ayhLRVJOX0NSSVQgIk9DRlMyOiBhYm9ydCAoZGV2aWNlICVzKTogJXM6ICVzXG4iLAotCSAgICAgICBzYi0+c19pZCwgZnVuY3Rpb24sIGVycm9yX2J1Zik7CisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKworCXByaW50ayhLRVJOX0NSSVQgIk9DRlMyOiBhYm9ydCAoZGV2aWNlICVzKTogJXM6ICVwVlxuIiwKKwkgICAgICAgc2ItPnNfaWQsIGZ1bmN0aW9uLCAmdmFmKTsKKworCXZhX2VuZChhcmdzKTsKIAogCS8qIFdlIGRvbid0IGhhdmUgdGhlIGNsdXN0ZXIgc3VwcG9ydCB5ZXQgdG8gZ28gc3RyYWlnaHQgdG8KIAkgKiBoYXJkIHJlYWRvbmx5IGluIGhlcmUuIFVudGlsIHRoZW4sIHdlIHdhbnQgdG8ga2VlcApkaWZmIC0tZ2l0IGEvZnMvb2NmczIveGF0dHIuYyBiL2ZzL29jZnMyL3hhdHRyLmMKaW5kZXggODViMTkwZC4uNGNhNzUzMyAxMDA2NDQKLS0tIGEvZnMvb2NmczIveGF0dHIuYworKysgYi9mcy9vY2ZzMi94YXR0ci5jCkBAIC0xMjM4LDYgKzEyMzgsMTAgQEAKIAkJCQkJCQkJaSwKIAkJCQkJCQkJJmJsb2NrX29mZiwKIAkJCQkJCQkJJm5hbWVfb2Zmc2V0KTsKKwkJCWlmIChyZXQpIHsKKwkJCQltbG9nX2Vycm5vKHJldCk7CisJCQkJZ290byBjbGVhbnVwOworCQkJfQogCQkJeHMtPmJhc2UgPSBidWNrZXRfYmxvY2soeHMtPmJ1Y2tldCwgYmxvY2tfb2ZmKTsKIAkJfQogCQlpZiAob2NmczJfeGF0dHJfaXNfbG9jYWwoeHMtPmhlcmUpKSB7CkBAIC01NjY1LDYgKzU2NjksMTAgQEAKIAogCQlyZXQgPSBvY2ZzMl9nZXRfeGF0dHJfdHJlZV92YWx1ZV9yb290KGlub2RlLT5pX3NiLCBidWNrZXQsCiAJCQkJCQkgICAgICBpLCAmeHYsIE5VTEwpOworCQlpZiAocmV0KSB7CisJCQltbG9nX2Vycm5vKHJldCk7CisJCQlicmVhazsKKwkJfQogCiAJCXJldCA9IG9jZnMyX2xvY2tfeGF0dHJfcmVtb3ZlX2FsbG9jYXRvcnMoaW5vZGUsIHh2LAogCQkJCQkJCSBhcmdzLT5yZWZfY2ksCmRpZmYgLS1naXQgYS9mcy9vbWZzL2ZpbGUuYyBiL2ZzL29tZnMvZmlsZS5jCmluZGV4IDkwMmU4ODUuLmY5OTNiZTcgMTAwNjQ0Ci0tLSBhL2ZzL29tZnMvZmlsZS5jCisrKyBiL2ZzL29tZnMvZmlsZS5jCkBAIC0zMzcsOCArMzM3LDYgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvbWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZCA9IG5ld19zeW5jX3JlYWQsCi0JLndyaXRlID0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlciA9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCiAJLndyaXRlX2l0ZXIgPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkubW1hcCA9IGdlbmVyaWNfZmlsZV9tbWFwLApkaWZmIC0tZ2l0IGEvZnMvb3Blbi5jIGIvZnMvb3Blbi5jCmluZGV4IDMzZjljYmYuLjY3OTZmMDQgMTAwNjQ0Ci0tLSBhL2ZzL29wZW4uYworKysgYi9mcy9vcGVuLmMKQEAgLTU3MCw2ICs1NzAsNyBAQAogCXVpZCA9IG1ha2Vfa3VpZChjdXJyZW50X3VzZXJfbnMoKSwgdXNlcik7CiAJZ2lkID0gbWFrZV9rZ2lkKGN1cnJlbnRfdXNlcl9ucygpLCBncm91cCk7CiAKK3JldHJ5X2RlbGVnOgogCW5ld2F0dHJzLmlhX3ZhbGlkID0gIEFUVFJfQ1RJTUU7CiAJaWYgKHVzZXIgIT0gKHVpZF90KSAtMSkgewogCQlpZiAoIXVpZF92YWxpZCh1aWQpKQpAQCAtNTg2LDcgKzU4Nyw2IEBACiAJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQluZXdhdHRycy5pYV92YWxpZCB8PQogCQkJQVRUUl9LSUxMX1NVSUQgfCBBVFRSX0tJTExfU0dJRCB8IEFUVFJfS0lMTF9QUklWOwotcmV0cnlfZGVsZWc6CiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWVycm9yID0gc2VjdXJpdHlfcGF0aF9jaG93bihwYXRoLCB1aWQsIGdpZCk7CiAJaWYgKCFlcnJvcikKQEAgLTczNCwxMCArNzM0LDEwIEBACiAJaWYgKChmLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkgPT0gRk1PREVfUkVBRCkKIAkJaV9yZWFkY291bnRfaW5jKGlub2RlKTsKIAlpZiAoKGYtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmCi0JICAgICBsaWtlbHkoZi0+Zl9vcC0+cmVhZCB8fCBmLT5mX29wLT5haW9fcmVhZCB8fCBmLT5mX29wLT5yZWFkX2l0ZXIpKQorCSAgICAgbGlrZWx5KGYtPmZfb3AtPnJlYWQgfHwgZi0+Zl9vcC0+cmVhZF9pdGVyKSkKIAkJZi0+Zl9tb2RlIHw9IEZNT0RFX0NBTl9SRUFEOwogCWlmICgoZi0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmCi0JICAgICBsaWtlbHkoZi0+Zl9vcC0+d3JpdGUgfHwgZi0+Zl9vcC0+YWlvX3dyaXRlIHx8IGYtPmZfb3AtPndyaXRlX2l0ZXIpKQorCSAgICAgbGlrZWx5KGYtPmZfb3AtPndyaXRlIHx8IGYtPmZfb3AtPndyaXRlX2l0ZXIpKQogCQlmLT5mX21vZGUgfD0gRk1PREVfQ0FOX1dSSVRFOwogCiAJZi0+Zl9mbGFncyAmPSB+KE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX05PQ1RUWSB8IE9fVFJVTkMpOwpAQCAtOTg4LDkgKzk4OCw2IEBACiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAJaWYgKGZsYWdzICYgT19DUkVBVCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JaWYgKCFmaWxlbmFtZSAmJiAoZmxhZ3MgJiBPX0RJUkVDVE9SWSkpCi0JCWlmICghZGVudHJ5LT5kX2lub2RlLT5pX29wLT5sb29rdXApCi0JCQlyZXR1cm4gRVJSX1BUUigtRU5PVERJUik7CiAJcmV0dXJuIGRvX2ZpbGVfb3Blbl9yb290KGRlbnRyeSwgbW50LCBmaWxlbmFtZSwgJm9wKTsKIH0KIEVYUE9SVF9TWU1CT0woZmlsZV9vcGVuX3Jvb3QpOwpkaWZmIC0tZ2l0IGEvZnMvb3ZlcmxheWZzL3N1cGVyLmMgYi9mcy9vdmVybGF5ZnMvc3VwZXIuYwppbmRleCBiOTA5NTJmLi41ZjBkMTk5IDEwMDY0NAotLS0gYS9mcy9vdmVybGF5ZnMvc3VwZXIuYworKysgYi9mcy9vdmVybGF5ZnMvc3VwZXIuYwpAQCAtNTI5LDggKzUyOSw3IEBACiB7CiAJc3RydWN0IG92bF9mcyAqdWZzID0gc2ItPnNfZnNfaW5mbzsKIAotCWlmICghKCpmbGFncyAmIE1TX1JET05MWSkgJiYKLQkgICAgKCF1ZnMtPnVwcGVyX21udCB8fCAodWZzLT51cHBlcl9tbnQtPm1udF9zYi0+c19mbGFncyAmIE1TX1JET05MWSkpKQorCWlmICghKCpmbGFncyAmIE1TX1JET05MWSkgJiYgIXVmcy0+dXBwZXJfbW50KQogCQlyZXR1cm4gLUVST0ZTOwogCiAJcmV0dXJuIDA7CkBAIC02MTUsOSArNjE0LDE5IEBACiAJCQlicmVhazsKIAogCQlkZWZhdWx0OgorCQkJcHJfZXJyKCJvdmVybGF5ZnM6IHVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiIG9yIG1pc3NpbmcgdmFsdWVcbiIsIHApOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CisKKwkvKiBXb3JrZGlyIGlzIHVzZWxlc3MgaW4gbm9uLXVwcGVyIG1vdW50ICovCisJaWYgKCFjb25maWctPnVwcGVyZGlyICYmIGNvbmZpZy0+d29ya2RpcikgeworCQlwcl9pbmZvKCJvdmVybGF5ZnM6IG9wdGlvbiBcIndvcmtkaXI9JXNcIiBpcyB1c2VsZXNzIGluIGEgbm9uLXVwcGVyIG1vdW50LCBpZ25vcmVcbiIsCisJCQljb25maWctPndvcmtkaXIpOworCQlrZnJlZShjb25maWctPndvcmtkaXIpOworCQljb25maWctPndvcmtkaXIgPSBOVUxMOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC04MzcsNyArODQ2LDYgQEAKIAogCXNiLT5zX3N0YWNrX2RlcHRoID0gMDsKIAlpZiAodWZzLT5jb25maWcudXBwZXJkaXIpIHsKLQkJLyogRklYTUU6IHdvcmtkaXIgaXMgbm90IG5lZWRlZCBmb3IgYSBSL08gbW91bnQgKi8KIAkJaWYgKCF1ZnMtPmNvbmZpZy53b3JrZGlyKSB7CiAJCQlwcl9lcnIoIm92ZXJsYXlmczogbWlzc2luZyAnd29ya2RpcidcbiIpOwogCQkJZ290byBvdXRfZnJlZV9jb25maWc7CkBAIC04NDcsNiArODU1LDEzIEBACiAJCWlmIChlcnIpCiAJCQlnb3RvIG91dF9mcmVlX2NvbmZpZzsKIAorCQkvKiBVcHBlciBmcyBzaG91bGQgbm90IGJlIHIvbyAqLworCQlpZiAodXBwZXJwYXRoLm1udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSB7CisJCQlwcl9lcnIoIm92ZXJsYXlmczogdXBwZXIgZnMgaXMgci9vLCB0cnkgbXVsdGktbG93ZXIgbGF5ZXJzIG1vdW50XG4iKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9wdXRfdXBwZXJwYXRoOworCQl9CisKIAkJZXJyID0gb3ZsX21vdW50X2Rpcih1ZnMtPmNvbmZpZy53b3JrZGlyLCAmd29ya3BhdGgpOwogCQlpZiAoZXJyKQogCQkJZ290byBvdXRfcHV0X3VwcGVycGF0aDsKQEAgLTg2OSw4ICs4ODQsMTQgQEAKIAogCWVyciA9IC1FSU5WQUw7CiAJc3RhY2tsZW4gPSBvdmxfc3BsaXRfbG93ZXJkaXJzKGxvd2VydG1wKTsKLQlpZiAoc3RhY2tsZW4gPiBPVkxfTUFYX1NUQUNLKQorCWlmIChzdGFja2xlbiA+IE9WTF9NQVhfU1RBQ0spIHsKKwkJcHJfZXJyKCJvdmVybGF5ZnM6IHRvbyBtYW55IGxvd2VyIGRpcmVjdHJpZXMsIGxpbWl0IGlzICVkXG4iLAorCQkgICAgICAgT1ZMX01BWF9TVEFDSyk7CiAJCWdvdG8gb3V0X2ZyZWVfbG93ZXJ0bXA7CisJfSBlbHNlIGlmICghdWZzLT5jb25maWcudXBwZXJkaXIgJiYgc3RhY2tsZW4gPT0gMSkgeworCQlwcl9lcnIoIm92ZXJsYXlmczogYXQgbGVhc3QgMiBsb3dlcmRpciBhcmUgbmVlZGVkIHdoaWxlIHVwcGVyZGlyIG5vbmV4aXN0ZW50XG4iKTsKKwkJZ290byBvdXRfZnJlZV9sb3dlcnRtcDsKKwl9CiAKIAlzdGFjayA9IGtjYWxsb2Moc3RhY2tsZW4sIHNpemVvZihzdHJ1Y3QgcGF0aCksIEdGUF9LRVJORUwpOwogCWlmICghc3RhY2spCkBAIC05MzIsOCArOTUzLDggQEAKIAkJdWZzLT5udW1sb3dlcisrOwogCX0KIAotCS8qIElmIHRoZSB1cHBlciBmcyBpcyByL28gb3Igbm9uZXhpc3RlbnQsIHdlIG1hcmsgb3ZlcmxheWZzIHIvbyB0b28gKi8KLQlpZiAoIXVmcy0+dXBwZXJfbW50IHx8ICh1ZnMtPnVwcGVyX21udC0+bW50X3NiLT5zX2ZsYWdzICYgTVNfUkRPTkxZKSkKKwkvKiBJZiB0aGUgdXBwZXIgZnMgaXMgbm9uZXhpc3RlbnQsIHdlIG1hcmsgb3ZlcmxheWZzIHIvbyB0b28gKi8KKwlpZiAoIXVmcy0+dXBwZXJfbW50KQogCQlzYi0+c19mbGFncyB8PSBNU19SRE9OTFk7CiAKIAlzYi0+c19kX29wID0gJm92bF9kZW50cnlfb3BlcmF0aW9uczsKZGlmZiAtLWdpdCBhL2ZzL3BpcGUuYyBiL2ZzL3BpcGUuYwppbmRleCAyMTk4MWU1Li44MjJkYTViIDEwMDY0NAotLS0gYS9mcy9waXBlLmMKKysrIGIvZnMvcGlwZS5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvYXVkaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pb2N0bHMuaD4KQEAgLTk0Nyw5ICs5NDYsNyBAQAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwaXBlZmlmb19mb3BzID0gewogCS5vcGVuCQk9IGZpZm9fb3BlbiwKIAkubGxzZWVrCQk9IG5vX2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIJPSBwaXBlX3JlYWQsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS53cml0ZV9pdGVyCT0gcGlwZV93cml0ZSwKIAkucG9sbAkJPSBwaXBlX3BvbGwsCiAJLnVubG9ja2VkX2lvY3RsCT0gcGlwZV9pb2N0bCwKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYXJyYXkuYyBiL2ZzL3Byb2MvYXJyYXkuYwppbmRleCAxMjk1YTAwLi5mZDAyYTllIDEwMDY0NAotLS0gYS9mcy9wcm9jL2FycmF5LmMKKysrIGIvZnMvcHJvYy9hcnJheS5jCkBAIC05OSw4ICs5OSw4IEBACiAJYnVmID0gbS0+YnVmICsgbS0+Y291bnQ7CiAKIAkvKiBJZ25vcmUgZXJyb3IgZm9yIG5vdyAqLwotCXN0cmluZ19lc2NhcGVfc3RyKHRjb21tLCAmYnVmLCBtLT5zaXplIC0gbS0+Y291bnQsCi0JCQkgIEVTQ0FQRV9TUEFDRSB8IEVTQ0FQRV9TUEVDSUFMLCAiXG5cXCIpOworCWJ1ZiArPSBzdHJpbmdfZXNjYXBlX3N0cih0Y29tbSwgYnVmLCBtLT5zaXplIC0gbS0+Y291bnQsCisJCQkJIEVTQ0FQRV9TUEFDRSB8IEVTQ0FQRV9TUEVDSUFMLCAiXG5cXCIpOwogCiAJbS0+Y291bnQgPSBidWYgLSBtLT5idWY7CiAJc2VxX3B1dGMobSwgJ1xuJyk7CkBAIC0xODgsNiArMTg4LDI0IEBACiAJCQkgICBmcm9tX2tnaWRfbXVuZ2VkKHVzZXJfbnMsIEdST1VQX0FUKGdyb3VwX2luZm8sIGcpKSk7CiAJcHV0X2NyZWQoY3JlZCk7CiAKKyNpZmRlZiBDT05GSUdfUElEX05TCisJc2VxX3B1dHMobSwgIlxuTlN0Z2lkOiIpOworCWZvciAoZyA9IG5zLT5sZXZlbDsgZyA8PSBwaWQtPmxldmVsOyBnKyspCisJCXNlcV9wcmludGYobSwgIlx0JWQiLAorCQkJdGFza190Z2lkX25yX25zKHAsIHBpZC0+bnVtYmVyc1tnXS5ucykpOworCXNlcV9wdXRzKG0sICJcbk5TcGlkOiIpOworCWZvciAoZyA9IG5zLT5sZXZlbDsgZyA8PSBwaWQtPmxldmVsOyBnKyspCisJCXNlcV9wcmludGYobSwgIlx0JWQiLAorCQkJdGFza19waWRfbnJfbnMocCwgcGlkLT5udW1iZXJzW2ddLm5zKSk7CisJc2VxX3B1dHMobSwgIlxuTlNwZ2lkOiIpOworCWZvciAoZyA9IG5zLT5sZXZlbDsgZyA8PSBwaWQtPmxldmVsOyBnKyspCisJCXNlcV9wcmludGYobSwgIlx0JWQiLAorCQkJdGFza19wZ3JwX25yX25zKHAsIHBpZC0+bnVtYmVyc1tnXS5ucykpOworCXNlcV9wdXRzKG0sICJcbk5Tc2lkOiIpOworCWZvciAoZyA9IG5zLT5sZXZlbDsgZyA8PSBwaWQtPmxldmVsOyBnKyspCisJCXNlcV9wcmludGYobSwgIlx0JWQiLAorCQkJdGFza19zZXNzaW9uX25yX25zKHAsIHBpZC0+bnVtYmVyc1tnXS5ucykpOworI2VuZGlmCiAJc2VxX3B1dGMobSwgJ1xuJyk7CiB9CiAKQEAgLTYxNCw3ICs2MzIsOSBAQAogCXBpZF90IHBpZDsKIAogCXBpZCA9IHBpZF9ucl9ucyh2LCBpbm9kZS0+aV9zYi0+c19mc19pbmZvKTsKLQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsICIlZCAiLCBwaWQpOworCXNlcV9wcmludGYoc2VxLCAiJWQgIiwgcGlkKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCAqY2hpbGRyZW5fc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcykKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvYmFzZS5jIGIvZnMvcHJvYy9iYXNlLmMKaW5kZXggM2YzZDdhZS4uN2EzYjgyZiAxMDA2NDQKLS0tIGEvZnMvcHJvYy9iYXNlLmMKKysrIGIvZnMvcHJvYy9iYXNlLmMKQEAgLTIzOCwxMyArMjM4LDE1IEBACiAKIAl3Y2hhbiA9IGdldF93Y2hhbih0YXNrKTsKIAotCWlmIChsb29rdXBfc3ltYm9sX25hbWUod2NoYW4sIHN5bW5hbWUpIDwgMCkKKwlpZiAobG9va3VwX3N5bWJvbF9uYW1lKHdjaGFuLCBzeW1uYW1lKSA8IDApIHsKIAkJaWYgKCFwdHJhY2VfbWF5X2FjY2Vzcyh0YXNrLCBQVFJBQ0VfTU9ERV9SRUFEKSkKIAkJCXJldHVybiAwOwotCQllbHNlCi0JCQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWx1Iiwgd2NoYW4pOwotCWVsc2UKLQkJcmV0dXJuIHNlcV9wcmludGYobSwgIiVzIiwgc3ltbmFtZSk7CisJCXNlcV9wcmludGYobSwgIiVsdSIsIHdjaGFuKTsKKwl9IGVsc2UgeworCQlzZXFfcHJpbnRmKG0sICIlcyIsIHN5bW5hbWUpOworCX0KKworCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19LQUxMU1lNUyAqLwogCkBAIC0zMDksMTAgKzMxMSwxMiBAQAogc3RhdGljIGludCBwcm9jX3BpZF9zY2hlZHN0YXQoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMsCiAJCQkgICAgICBzdHJ1Y3QgcGlkICpwaWQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJWxsdSAlbGx1ICVsdVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdGFzay0+c2Uuc3VtX2V4ZWNfcnVudGltZSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdGFzay0+c2NoZWRfaW5mby5ydW5fZGVsYXksCi0JCQl0YXNrLT5zY2hlZF9pbmZvLnBjb3VudCk7CisJc2VxX3ByaW50ZihtLCAiJWxsdSAlbGx1ICVsdVxuIiwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0YXNrLT5zZS5zdW1fZXhlY19ydW50aW1lLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXRhc2stPnNjaGVkX2luZm8ucnVuX2RlbGF5LAorCQkgICB0YXNrLT5zY2hlZF9pbmZvLnBjb3VudCk7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCkBAIC0zODcsNyArMzkxLDkgQEAKIAkJcG9pbnRzID0gb29tX2JhZG5lc3ModGFzaywgTlVMTCwgTlVMTCwgdG90YWxwYWdlcykgKgogCQkJCQkJMTAwMCAvIHRvdGFscGFnZXM7CiAJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOwotCXJldHVybiBzZXFfcHJpbnRmKG0sICIlbHVcbiIsIHBvaW50cyk7CisJc2VxX3ByaW50ZihtLCAiJWx1XG4iLCBwb2ludHMpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0cnVjdCBsaW1pdF9uYW1lcyB7CkBAIC00MzIsMTUgKzQzOCwxNSBAQAogCSAqIHByaW50IHRoZSBmaWxlIGhlYWRlcgogCSAqLwogICAgICAgIHNlcV9wcmludGYobSwgIiUtMjVzICUtMjBzICUtMjBzICUtMTBzXG4iLAotCQkJIkxpbWl0IiwgIlNvZnQgTGltaXQiLCAiSGFyZCBMaW1pdCIsICJVbml0cyIpOworCQkgICJMaW1pdCIsICJTb2Z0IExpbWl0IiwgIkhhcmQgTGltaXQiLCAiVW5pdHMiKTsKIAogCWZvciAoaSA9IDA7IGkgPCBSTElNX05MSU1JVFM7IGkrKykgewogCQlpZiAocmxpbVtpXS5ybGltX2N1ciA9PSBSTElNX0lORklOSVRZKQogCQkJc2VxX3ByaW50ZihtLCAiJS0yNXMgJS0yMHMgIiwKLQkJCQkJIGxuYW1lc1tpXS5uYW1lLCAidW5saW1pdGVkIik7CisJCQkJICAgbG5hbWVzW2ldLm5hbWUsICJ1bmxpbWl0ZWQiKTsKIAkJZWxzZQogCQkJc2VxX3ByaW50ZihtLCAiJS0yNXMgJS0yMGx1ICIsCi0JCQkJCSBsbmFtZXNbaV0ubmFtZSwgcmxpbVtpXS5ybGltX2N1cik7CisJCQkJICAgbG5hbWVzW2ldLm5hbWUsIHJsaW1baV0ucmxpbV9jdXIpOwogCiAJCWlmIChybGltW2ldLnJsaW1fbWF4ID09IFJMSU1fSU5GSU5JVFkpCiAJCQlzZXFfcHJpbnRmKG0sICIlLTIwcyAiLCAidW5saW1pdGVkIik7CkBAIC00NjIsNyArNDY4LDkgQEAKIHsKIAlsb25nIG5yOwogCXVuc2lnbmVkIGxvbmcgYXJnc1s2XSwgc3AsIHBjOwotCWludCByZXMgPSBsb2NrX3RyYWNlKHRhc2spOworCWludCByZXM7CisKKwlyZXMgPSBsb2NrX3RyYWNlKHRhc2spOwogCWlmIChyZXMpCiAJCXJldHVybiByZXM7CiAKQEAgLTQ3Nyw3ICs0ODUsOCBAQAogCQkgICAgICAgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgYXJnc1szXSwgYXJnc1s0XSwgYXJnc1s1XSwKIAkJICAgICAgIHNwLCBwYyk7CiAJdW5sb2NrX3RyYWNlKHRhc2spOwotCXJldHVybiByZXM7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSyAqLwogCkBAIC0yMDAyLDEyICsyMDExLDEzIEBACiAJbm90aWZ5ID0gdGltZXItPml0X3NpZ2V2X25vdGlmeTsKIAogCXNlcV9wcmludGYobSwgIklEOiAlZFxuIiwgdGltZXItPml0X2lkKTsKLQlzZXFfcHJpbnRmKG0sICJzaWduYWw6ICVkLyVwXG4iLCB0aW1lci0+c2lncS0+aW5mby5zaV9zaWdubywKLQkJCXRpbWVyLT5zaWdxLT5pbmZvLnNpX3ZhbHVlLnNpdmFsX3B0cik7CisJc2VxX3ByaW50ZihtLCAic2lnbmFsOiAlZC8lcFxuIiwKKwkJICAgdGltZXItPnNpZ3EtPmluZm8uc2lfc2lnbm8sCisJCSAgIHRpbWVyLT5zaWdxLT5pbmZvLnNpX3ZhbHVlLnNpdmFsX3B0cik7CiAJc2VxX3ByaW50ZihtLCAibm90aWZ5OiAlcy8lcy4lZFxuIiwKLQkJbnN0cltub3RpZnkgJiB+U0lHRVZfVEhSRUFEX0lEXSwKLQkJKG5vdGlmeSAmIFNJR0VWX1RIUkVBRF9JRCkgPyAidGlkIiA6ICJwaWQiLAotCQlwaWRfbnJfbnModGltZXItPml0X3BpZCwgdHAtPm5zKSk7CisJCSAgIG5zdHJbbm90aWZ5ICYgflNJR0VWX1RIUkVBRF9JRF0sCisJCSAgIChub3RpZnkgJiBTSUdFVl9USFJFQURfSUQpID8gInRpZCIgOiAicGlkIiwKKwkJICAgcGlkX25yX25zKHRpbWVyLT5pdF9waWQsIHRwLT5ucykpOwogCXNlcV9wcmludGYobSwgIkNsb2NrSUQ6ICVkXG4iLCB0aW1lci0+aXRfY2xvY2spOwogCiAJcmV0dXJuIDA7CkBAIC0yMzUyLDIxICsyMzYyLDIzIEBACiAKIAkJdW5sb2NrX3Rhc2tfc2lnaGFuZCh0YXNrLCAmZmxhZ3MpOwogCX0KLQlyZXN1bHQgPSBzZXFfcHJpbnRmKG0sCi0JCQkicmNoYXI6ICVsbHVcbiIKLQkJCSJ3Y2hhcjogJWxsdVxuIgotCQkJInN5c2NyOiAlbGx1XG4iCi0JCQkic3lzY3c6ICVsbHVcbiIKLQkJCSJyZWFkX2J5dGVzOiAlbGx1XG4iCi0JCQkid3JpdGVfYnl0ZXM6ICVsbHVcbiIKLQkJCSJjYW5jZWxsZWRfd3JpdGVfYnl0ZXM6ICVsbHVcbiIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKWFjY3QucmNoYXIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKWFjY3Qud2NoYXIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKWFjY3Quc3lzY3IsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKWFjY3Quc3lzY3csCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKWFjY3QucmVhZF9ieXRlcywKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYWNjdC53cml0ZV9ieXRlcywKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYWNjdC5jYW5jZWxsZWRfd3JpdGVfYnl0ZXMpOworCXNlcV9wcmludGYobSwKKwkJICAgInJjaGFyOiAlbGx1XG4iCisJCSAgICJ3Y2hhcjogJWxsdVxuIgorCQkgICAic3lzY3I6ICVsbHVcbiIKKwkJICAgInN5c2N3OiAlbGx1XG4iCisJCSAgICJyZWFkX2J5dGVzOiAlbGx1XG4iCisJCSAgICJ3cml0ZV9ieXRlczogJWxsdVxuIgorCQkgICAiY2FuY2VsbGVkX3dyaXRlX2J5dGVzOiAlbGx1XG4iLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWFjY3QucmNoYXIsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWNjdC53Y2hhciwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhY2N0LnN5c2NyLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWFjY3Quc3lzY3csCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWNjdC5yZWFkX2J5dGVzLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWFjY3Qud3JpdGVfYnl0ZXMsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWNjdC5jYW5jZWxsZWRfd3JpdGVfYnl0ZXMpOworCXJlc3VsdCA9IDA7CisKIG91dF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZ0YXNrLT5zaWduYWwtPmNyZWRfZ3VhcmRfbXV0ZXgpOwogCXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9mcy9wcm9jL3Rhc2tfbW11LmMgYi9mcy9wcm9jL3Rhc2tfbW11LmMKaW5kZXggOTU2Yjc1ZC4uNmRlZTY4ZCAxMDA2NDQKLS0tIGEvZnMvcHJvYy90YXNrX21tdS5jCisrKyBiL2ZzL3Byb2MvdGFza19tbXUuYwpAQCAtMTMyNSw2ICsxMzI1LDkgQEAKIAogc3RhdGljIGludCBwYWdlbWFwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CisJLyogZG8gbm90IGRpc2Nsb3NlIHBoeXNpY2FsIGFkZHJlc3NlczogYXR0YWNrIHZlY3RvciAqLworCWlmICghY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJcmV0dXJuIC1FUEVSTTsKIAlwcl93YXJuX29uY2UoIkJpdHMgNTUtNjAgb2YgL3Byb2MvUElEL3BhZ2VtYXAgZW50cmllcyBhcmUgYWJvdXQgIgogCQkJInRvIHN0b3AgYmVpbmcgcGFnZS1zaGlmdCBzb21lIHRpbWUgc29vbi4gU2VlIHRoZSAiCiAJCQkibGludXgvRG9jdW1lbnRhdGlvbi92bS9wYWdlbWFwLnR4dCBmb3IgZGV0YWlscy5cbiIpOwpkaWZmIC0tZ2l0IGEvZnMvcHN0b3JlL3JhbS5jIGIvZnMvcHN0b3JlL3JhbS5jCmluZGV4IDM5ZDEzNzMuLjQ0YTU0OWIgMTAwNjQ0Ci0tLSBhL2ZzL3BzdG9yZS9yYW0uYworKysgYi9mcy9wc3RvcmUvcmFtLmMKQEAgLTUzOSw2ICs1MzksOSBAQAogCW1lbV9hZGRyZXNzID0gcGRhdGEtPm1lbV9hZGRyZXNzOwogCXJlY29yZF9zaXplID0gcGRhdGEtPnJlY29yZF9zaXplOwogCWR1bXBfb29wcyA9IHBkYXRhLT5kdW1wX29vcHM7CisJcmFtb29wc19jb25zb2xlX3NpemUgPSBwZGF0YS0+Y29uc29sZV9zaXplOworCXJhbW9vcHNfcG1zZ19zaXplID0gcGRhdGEtPnBtc2dfc2l6ZTsKKwlyYW1vb3BzX2Z0cmFjZV9zaXplID0gcGRhdGEtPmZ0cmFjZV9zaXplOwogCiAJcHJfaW5mbygiYXR0YWNoZWQgMHglbHhAMHglbGx4LCBlY2M6ICVkLyVkXG4iLAogCQljeHQtPnNpemUsICh1bnNpZ25lZCBsb25nIGxvbmcpY3h0LT5waHlzX2FkZHIsCmRpZmYgLS1naXQgYS9mcy9yYW1mcy9maWxlLW1tdS5jIGIvZnMvcmFtZnMvZmlsZS1tbXUuYwppbmRleCA0ZjU2ZGU4Li4xODNhMjEyIDEwMDY0NAotLS0gYS9mcy9yYW1mcy9maWxlLW1tdS5jCisrKyBiL2ZzL3JhbWZzL2ZpbGUtbW11LmMKQEAgLTMxLDkgKzMxLDcgQEAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJhbWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAogCS5mc3luYwkJPSBub29wX2ZzeW5jLApkaWZmIC0tZ2l0IGEvZnMvcmFtZnMvZmlsZS1ub21tdS5jIGIvZnMvcmFtZnMvZmlsZS1ub21tdS5jCmluZGV4IGY2YWI0MWIuLjBiMzhiZWYgMTAwNjQ0Ci0tLSBhL2ZzL3JhbWZzL2ZpbGUtbm9tbXUuYworKysgYi9mcy9yYW1mcy9maWxlLW5vbW11LmMKQEAgLTQ0LDkgKzQ0LDcgQEAKIAkubW1hcF9jYXBhYmlsaXRpZXMJPSByYW1mc19tbWFwX2NhcGFiaWxpdGllcywKIAkubW1hcAkJCT0gcmFtZnNfbm9tbXVfbW1hcCwKIAkuZ2V0X3VubWFwcGVkX2FyZWEJPSByYW1mc19ub21tdV9nZXRfdW5tYXBwZWRfYXJlYSwKLQkucmVhZAkJCT0gbmV3X3N5bmNfcmVhZCwKIAkucmVhZF9pdGVyCQk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCi0JLndyaXRlCQkJPSBuZXdfc3luY193cml0ZSwKIAkud3JpdGVfaXRlcgkJPSBnZW5lcmljX2ZpbGVfd3JpdGVfaXRlciwKIAkuZnN5bmMJCQk9IG5vb3BfZnN5bmMsCiAJLnNwbGljZV9yZWFkCQk9IGdlbmVyaWNfZmlsZV9zcGxpY2VfcmVhZCwKZGlmZiAtLWdpdCBhL2ZzL3JlYWRfd3JpdGUuYyBiL2ZzL3JlYWRfd3JpdGUuYwppbmRleCA4ZTFiNjg3Li40NWQ1ODNjIDEwMDY0NAotLS0gYS9mcy9yZWFkX3dyaXRlLmMKKysrIGIvZnMvcmVhZF93cml0ZS5jCkBAIC05LDcgKzksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L2Zzbm90aWZ5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KQEAgLTIzLDEzICsyMiwxMCBAQAogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAogdHlwZWRlZiBzc2l6ZV90ICgqaW9fZm5fdCkoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7Ci10eXBlZGVmIHNzaXplX3QgKCppb3ZfZm5fdCkoc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLAotCQl1bnNpZ25lZCBsb25nLCBsb2ZmX3QpOwogdHlwZWRlZiBzc2l6ZV90ICgqaXRlcl9mbl90KShzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IGlvdl9pdGVyICopOwogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGdlbmVyaWNfcm9fZm9wcyA9IHsKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKIAkucmVhZF9pdGVyCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKIAkubW1hcAkJPSBnZW5lcmljX2ZpbGVfcmVhZG9ubHlfbW1hcCwKIAkuc3BsaWNlX3JlYWQJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCkBAIC0zNDMsMTMgKzMzOSwxMCBAQAogCiAJaW5pdF9zeW5jX2tpb2NiKCZraW9jYiwgZmlsZSk7CiAJa2lvY2Iua2lfcG9zID0gKnBwb3M7Ci0Ja2lvY2Iua2lfbmJ5dGVzID0gaW92X2l0ZXJfY291bnQoaXRlcik7CiAKIAlpdGVyLT50eXBlIHw9IFJFQUQ7CiAJcmV0ID0gZmlsZS0+Zl9vcC0+cmVhZF9pdGVyKCZraW9jYiwgaXRlcik7Ci0JaWYgKHJldCA9PSAtRUlPQ0JRVUVVRUQpCi0JCXJldCA9IHdhaXRfb25fc3luY19raW9jYigma2lvY2IpOwotCisJQlVHX09OKHJldCA9PSAtRUlPQ0JRVUVVRUQpOwogCWlmIChyZXQgPiAwKQogCQkqcHBvcyA9IGtpb2NiLmtpX3BvczsKIAlyZXR1cm4gcmV0OwpAQCAtMzY2LDEzICszNTksMTAgQEAKIAogCWluaXRfc3luY19raW9jYigma2lvY2IsIGZpbGUpOwogCWtpb2NiLmtpX3BvcyA9ICpwcG9zOwotCWtpb2NiLmtpX25ieXRlcyA9IGlvdl9pdGVyX2NvdW50KGl0ZXIpOwogCiAJaXRlci0+dHlwZSB8PSBXUklURTsKIAlyZXQgPSBmaWxlLT5mX29wLT53cml0ZV9pdGVyKCZraW9jYiwgaXRlcik7Ci0JaWYgKHJldCA9PSAtRUlPQ0JRVUVVRUQpCi0JCXJldCA9IHdhaXRfb25fc3luY19raW9jYigma2lvY2IpOwotCisJQlVHX09OKHJldCA9PSAtRUlPQ0JRVUVVRUQpOwogCWlmIChyZXQgPiAwKQogCQkqcHBvcyA9IGtpb2NiLmtpX3BvczsKIAlyZXR1cm4gcmV0OwpAQCAtNDE4LDI2ICs0MDgsNyBAQAogCXJldHVybiBjb3VudCA+IE1BWF9SV19DT1VOVCA/IE1BWF9SV19DT1VOVCA6IGNvdW50OwogfQogCi1zc2l6ZV90IGRvX3N5bmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpb3ZlYyBpb3YgPSB7IC5pb3ZfYmFzZSA9IGJ1ZiwgLmlvdl9sZW4gPSBsZW4gfTsKLQlzdHJ1Y3Qga2lvY2Iga2lvY2I7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBmaWxwKTsKLQlraW9jYi5raV9wb3MgPSAqcHBvczsKLQlraW9jYi5raV9uYnl0ZXMgPSBsZW47Ci0KLQlyZXQgPSBmaWxwLT5mX29wLT5haW9fcmVhZCgma2lvY2IsICZpb3YsIDEsIGtpb2NiLmtpX3Bvcyk7Ci0JaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCi0JCXJldCA9IHdhaXRfb25fc3luY19raW9jYigma2lvY2IpOwotCSpwcG9zID0ga2lvY2Iua2lfcG9zOwotCXJldHVybiByZXQ7Ci19Ci0KLUVYUE9SVF9TWU1CT0woZG9fc3luY19yZWFkKTsKLQotc3NpemVfdCBuZXdfc3luY19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgc3NpemVfdCBuZXdfc3luY19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGlvdmVjIGlvdiA9IHsgLmlvdl9iYXNlID0gYnVmLCAuaW92X2xlbiA9IGxlbiB9OwogCXN0cnVjdCBraW9jYiBraW9jYjsKQEAgLTQ0NiwzNCArNDE3LDI1IEBACiAKIAlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBmaWxwKTsKIAlraW9jYi5raV9wb3MgPSAqcHBvczsKLQlraW9jYi5raV9uYnl0ZXMgPSBsZW47CiAJaW92X2l0ZXJfaW5pdCgmaXRlciwgUkVBRCwgJmlvdiwgMSwgbGVuKTsKIAogCXJldCA9IGZpbHAtPmZfb3AtPnJlYWRfaXRlcigma2lvY2IsICZpdGVyKTsKLQlpZiAoLUVJT0NCUVVFVUVEID09IHJldCkKLQkJcmV0ID0gd2FpdF9vbl9zeW5jX2tpb2NiKCZraW9jYik7CisJQlVHX09OKHJldCA9PSAtRUlPQ0JRVUVVRUQpOwogCSpwcG9zID0ga2lvY2Iua2lfcG9zOwogCXJldHVybiByZXQ7CiB9CiAKLUVYUE9SVF9TWU1CT0wobmV3X3N5bmNfcmVhZCk7Ci0KIHNzaXplX3QgX192ZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LAogCQkgICBsb2ZmX3QgKnBvcykKIHsKLQlzc2l6ZV90IHJldDsKLQogCWlmIChmaWxlLT5mX29wLT5yZWFkKQotCQlyZXQgPSBmaWxlLT5mX29wLT5yZWFkKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7Ci0JZWxzZSBpZiAoZmlsZS0+Zl9vcC0+YWlvX3JlYWQpCi0JCXJldCA9IGRvX3N5bmNfcmVhZChmaWxlLCBidWYsIGNvdW50LCBwb3MpOworCQlyZXR1cm4gZmlsZS0+Zl9vcC0+cmVhZChmaWxlLCBidWYsIGNvdW50LCBwb3MpOwogCWVsc2UgaWYgKGZpbGUtPmZfb3AtPnJlYWRfaXRlcikKLQkJcmV0ID0gbmV3X3N5bmNfcmVhZChmaWxlLCBidWYsIGNvdW50LCBwb3MpOworCQlyZXR1cm4gbmV3X3N5bmNfcmVhZChmaWxlLCBidWYsIGNvdW50LCBwb3MpOwogCWVsc2UKLQkJcmV0ID0gLUVJTlZBTDsKLQotCXJldHVybiByZXQ7CisJCXJldHVybiAtRUlOVkFMOwogfQorRVhQT1JUX1NZTUJPTChfX3Zmc19yZWFkKTsKIAogc3NpemVfdCB2ZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKIHsKQEAgLTUwMiwyNiArNDY0LDcgQEAKIAogRVhQT1JUX1NZTUJPTCh2ZnNfcmVhZCk7CiAKLXNzaXplX3QgZG9fc3luY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpb3ZlYyBpb3YgPSB7IC5pb3ZfYmFzZSA9ICh2b2lkIF9fdXNlciAqKWJ1ZiwgLmlvdl9sZW4gPSBsZW4gfTsKLQlzdHJ1Y3Qga2lvY2Iga2lvY2I7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBmaWxwKTsKLQlraW9jYi5raV9wb3MgPSAqcHBvczsKLQlraW9jYi5raV9uYnl0ZXMgPSBsZW47Ci0KLQlyZXQgPSBmaWxwLT5mX29wLT5haW9fd3JpdGUoJmtpb2NiLCAmaW92LCAxLCBraW9jYi5raV9wb3MpOwotCWlmICgtRUlPQ0JRVUVVRUQgPT0gcmV0KQotCQlyZXQgPSB3YWl0X29uX3N5bmNfa2lvY2IoJmtpb2NiKTsKLQkqcHBvcyA9IGtpb2NiLmtpX3BvczsKLQlyZXR1cm4gcmV0OwotfQotCi1FWFBPUlRfU1lNQk9MKGRvX3N5bmNfd3JpdGUpOwotCi1zc2l6ZV90IG5ld19zeW5jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCitzdGF0aWMgc3NpemVfdCBuZXdfc3luY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBpb3ZlYyBpb3YgPSB7IC5pb3ZfYmFzZSA9ICh2b2lkIF9fdXNlciAqKWJ1ZiwgLmlvdl9sZW4gPSBsZW4gfTsKIAlzdHJ1Y3Qga2lvY2Iga2lvY2I7CkBAIC01MzAsMTcgKzQ3MywyNSBAQAogCiAJaW5pdF9zeW5jX2tpb2NiKCZraW9jYiwgZmlscCk7CiAJa2lvY2Iua2lfcG9zID0gKnBwb3M7Ci0Ja2lvY2Iua2lfbmJ5dGVzID0gbGVuOwogCWlvdl9pdGVyX2luaXQoJml0ZXIsIFdSSVRFLCAmaW92LCAxLCBsZW4pOwogCiAJcmV0ID0gZmlscC0+Zl9vcC0+d3JpdGVfaXRlcigma2lvY2IsICZpdGVyKTsKLQlpZiAoLUVJT0NCUVVFVUVEID09IHJldCkKLQkJcmV0ID0gd2FpdF9vbl9zeW5jX2tpb2NiKCZraW9jYik7CisJQlVHX09OKHJldCA9PSAtRUlPQ0JRVUVVRUQpOwogCSpwcG9zID0ga2lvY2Iua2lfcG9zOwogCXJldHVybiByZXQ7CiB9CiAKLUVYUE9SVF9TWU1CT0wobmV3X3N5bmNfd3JpdGUpOworc3NpemVfdCBfX3Zmc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnAsIHNpemVfdCBjb3VudCwKKwkJICAgIGxvZmZfdCAqcG9zKQoreworCWlmIChmaWxlLT5mX29wLT53cml0ZSkKKwkJcmV0dXJuIGZpbGUtPmZfb3AtPndyaXRlKGZpbGUsIHAsIGNvdW50LCBwb3MpOworCWVsc2UgaWYgKGZpbGUtPmZfb3AtPndyaXRlX2l0ZXIpCisJCXJldHVybiBuZXdfc3luY193cml0ZShmaWxlLCBwLCBjb3VudCwgcG9zKTsKKwllbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTChfX3Zmc193cml0ZSk7CiAKIHNzaXplX3QgX19rZXJuZWxfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykKIHsKQEAgLTU1NiwxMiArNTA3LDcgQEAKIAlwID0gKF9fZm9yY2UgY29uc3QgY2hhciBfX3VzZXIgKilidWY7CiAJaWYgKGNvdW50ID4gTUFYX1JXX0NPVU5UKQogCQljb3VudCA9ICBNQVhfUldfQ09VTlQ7Ci0JaWYgKGZpbGUtPmZfb3AtPndyaXRlKQotCQlyZXQgPSBmaWxlLT5mX29wLT53cml0ZShmaWxlLCBwLCBjb3VudCwgcG9zKTsKLQllbHNlIGlmIChmaWxlLT5mX29wLT5haW9fd3JpdGUpCi0JCXJldCA9IGRvX3N5bmNfd3JpdGUoZmlsZSwgcCwgY291bnQsIHBvcyk7Ci0JZWxzZQotCQlyZXQgPSBuZXdfc3luY193cml0ZShmaWxlLCBwLCBjb3VudCwgcG9zKTsKKwlyZXQgPSBfX3Zmc193cml0ZShmaWxlLCBwLCBjb3VudCwgcG9zKTsKIAlzZXRfZnMob2xkX2ZzKTsKIAlpZiAocmV0ID4gMCkgewogCQlmc25vdGlmeV9tb2RpZnkoZmlsZSk7CkBAIC01ODgsMTIgKzUzNCw3IEBACiAJaWYgKHJldCA+PSAwKSB7CiAJCWNvdW50ID0gcmV0OwogCQlmaWxlX3N0YXJ0X3dyaXRlKGZpbGUpOwotCQlpZiAoZmlsZS0+Zl9vcC0+d3JpdGUpCi0JCQlyZXQgPSBmaWxlLT5mX29wLT53cml0ZShmaWxlLCBidWYsIGNvdW50LCBwb3MpOwotCQllbHNlIGlmIChmaWxlLT5mX29wLT5haW9fd3JpdGUpCi0JCQlyZXQgPSBkb19zeW5jX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7Ci0JCWVsc2UKLQkJCXJldCA9IG5ld19zeW5jX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7CisJCXJldCA9IF9fdmZzX3dyaXRlKGZpbGUsIGJ1ZiwgY291bnQsIHBvcyk7CiAJCWlmIChyZXQgPiAwKSB7CiAJCQlmc25vdGlmeV9tb2RpZnkoZmlsZSk7CiAJCQlhZGRfd2NoYXIoY3VycmVudCwgcmV0KTsKQEAgLTcxMCw2MCArNjUxLDMyIEBACiB9CiBFWFBPUlRfU1lNQk9MKGlvdl9zaG9ydGVuKTsKIAotc3RhdGljIHNzaXplX3QgZG9faXRlcl9yZWFkdl93cml0ZXYoc3RydWN0IGZpbGUgKmZpbHAsIGludCBydywgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsCi0JCXVuc2lnbmVkIGxvbmcgbnJfc2Vncywgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zLCBpdGVyX2ZuX3QgZm4pCi17Ci0Jc3RydWN0IGtpb2NiIGtpb2NiOwotCXN0cnVjdCBpb3ZfaXRlciBpdGVyOwotCXNzaXplX3QgcmV0OwotCi0JaW5pdF9zeW5jX2tpb2NiKCZraW9jYiwgZmlscCk7Ci0Ja2lvY2Iua2lfcG9zID0gKnBwb3M7Ci0Ja2lvY2Iua2lfbmJ5dGVzID0gbGVuOwotCi0JaW92X2l0ZXJfaW5pdCgmaXRlciwgcncsIGlvdiwgbnJfc2VncywgbGVuKTsKLQlyZXQgPSBmbigma2lvY2IsICZpdGVyKTsKLQlpZiAocmV0ID09IC1FSU9DQlFVRVVFRCkKLQkJcmV0ID0gd2FpdF9vbl9zeW5jX2tpb2NiKCZraW9jYik7Ci0JKnBwb3MgPSBraW9jYi5raV9wb3M7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgZG9fc3luY19yZWFkdl93cml0ZXYoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcywgaW92X2ZuX3QgZm4pCitzdGF0aWMgc3NpemVfdCBkb19pdGVyX3JlYWR2X3dyaXRldihzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGlvdl9pdGVyICppdGVyLAorCQlsb2ZmX3QgKnBwb3MsIGl0ZXJfZm5fdCBmbikKIHsKIAlzdHJ1Y3Qga2lvY2Iga2lvY2I7CiAJc3NpemVfdCByZXQ7CiAKIAlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBmaWxwKTsKIAlraW9jYi5raV9wb3MgPSAqcHBvczsKLQlraW9jYi5raV9uYnl0ZXMgPSBsZW47CiAKLQlyZXQgPSBmbigma2lvY2IsIGlvdiwgbnJfc2Vncywga2lvY2Iua2lfcG9zKTsKLQlpZiAocmV0ID09IC1FSU9DQlFVRVVFRCkKLQkJcmV0ID0gd2FpdF9vbl9zeW5jX2tpb2NiKCZraW9jYik7CisJcmV0ID0gZm4oJmtpb2NiLCBpdGVyKTsKKwlCVUdfT04ocmV0ID09IC1FSU9DQlFVRVVFRCk7CiAJKnBwb3MgPSBraW9jYi5raV9wb3M7CiAJcmV0dXJuIHJldDsKIH0KIAogLyogRG8gaXQgYnkgaGFuZCwgd2l0aCBmaWxlLW9wcyAqLwotc3RhdGljIHNzaXplX3QgZG9fbG9vcF9yZWFkdl93cml0ZXYoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBpb3ZlYyAqaW92LAotCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCAqcHBvcywgaW9fZm5fdCBmbikKK3N0YXRpYyBzc2l6ZV90IGRvX2xvb3BfcmVhZHZfd3JpdGV2KHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3QgaW92X2l0ZXIgKml0ZXIsCisJCWxvZmZfdCAqcHBvcywgaW9fZm5fdCBmbikKIHsKLQlzdHJ1Y3QgaW92ZWMgKnZlY3RvciA9IGlvdjsKIAlzc2l6ZV90IHJldCA9IDA7CiAKLQl3aGlsZSAobnJfc2VncyA+IDApIHsKLQkJdm9pZCBfX3VzZXIgKmJhc2U7Ci0JCXNpemVfdCBsZW47CisJd2hpbGUgKGlvdl9pdGVyX2NvdW50KGl0ZXIpKSB7CisJCXN0cnVjdCBpb3ZlYyBpb3ZlYyA9IGlvdl9pdGVyX2lvdmVjKGl0ZXIpOwogCQlzc2l6ZV90IG5yOwogCi0JCWJhc2UgPSB2ZWN0b3ItPmlvdl9iYXNlOwotCQlsZW4gPSB2ZWN0b3ItPmlvdl9sZW47Ci0JCXZlY3RvcisrOwotCQlucl9zZWdzLS07Ci0KLQkJbnIgPSBmbihmaWxwLCBiYXNlLCBsZW4sIHBwb3MpOworCQluciA9IGZuKGZpbHAsIGlvdmVjLmlvdl9iYXNlLCBpb3ZlYy5pb3ZfbGVuLCBwcG9zKTsKIAogCQlpZiAobnIgPCAwKSB7CiAJCQlpZiAoIXJldCkKQEAgLTc3MSw4ICs2ODQsOSBAQAogCQkJYnJlYWs7CiAJCX0KIAkJcmV0ICs9IG5yOwotCQlpZiAobnIgIT0gbGVuKQorCQlpZiAobnIgIT0gaW92ZWMuaW92X2xlbikKIAkJCWJyZWFrOworCQlpb3ZfaXRlcl9hZHZhbmNlKGl0ZXIsIG5yKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtODYzLDQ4ICs3NzcsNDIgQEAKIAlzaXplX3QgdG90X2xlbjsKIAlzdHJ1Y3QgaW92ZWMgaW92c3RhY2tbVUlPX0ZBU1RJT1ZdOwogCXN0cnVjdCBpb3ZlYyAqaW92ID0gaW92c3RhY2s7CisJc3RydWN0IGlvdl9pdGVyIGl0ZXI7CiAJc3NpemVfdCByZXQ7CiAJaW9fZm5fdCBmbjsKLQlpb3ZfZm5fdCBmbnY7CiAJaXRlcl9mbl90IGl0ZXJfZm47CiAKLQlyZXQgPSByd19jb3B5X2NoZWNrX3V2ZWN0b3IodHlwZSwgdXZlY3RvciwgbnJfc2VncywKLQkJCQkgICAgQVJSQVlfU0laRShpb3ZzdGFjayksIGlvdnN0YWNrLCAmaW92KTsKLQlpZiAocmV0IDw9IDApCi0JCWdvdG8gb3V0OworCXJldCA9IGltcG9ydF9pb3ZlYyh0eXBlLCB1dmVjdG9yLCBucl9zZWdzLAorCQkJICAgQVJSQVlfU0laRShpb3ZzdGFjayksICZpb3YsICZpdGVyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKIAotCXRvdF9sZW4gPSByZXQ7CisJdG90X2xlbiA9IGlvdl9pdGVyX2NvdW50KCZpdGVyKTsKKwlpZiAoIXRvdF9sZW4pCisJCWdvdG8gb3V0OwogCXJldCA9IHJ3X3ZlcmlmeV9hcmVhKHR5cGUsIGZpbGUsIHBvcywgdG90X2xlbik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JZm52ID0gTlVMTDsKIAlpZiAodHlwZSA9PSBSRUFEKSB7CiAJCWZuID0gZmlsZS0+Zl9vcC0+cmVhZDsKLQkJZm52ID0gZmlsZS0+Zl9vcC0+YWlvX3JlYWQ7CiAJCWl0ZXJfZm4gPSBmaWxlLT5mX29wLT5yZWFkX2l0ZXI7CiAJfSBlbHNlIHsKIAkJZm4gPSAoaW9fZm5fdClmaWxlLT5mX29wLT53cml0ZTsKLQkJZm52ID0gZmlsZS0+Zl9vcC0+YWlvX3dyaXRlOwogCQlpdGVyX2ZuID0gZmlsZS0+Zl9vcC0+d3JpdGVfaXRlcjsKIAkJZmlsZV9zdGFydF93cml0ZShmaWxlKTsKIAl9CiAKIAlpZiAoaXRlcl9mbikKLQkJcmV0ID0gZG9faXRlcl9yZWFkdl93cml0ZXYoZmlsZSwgdHlwZSwgaW92LCBucl9zZWdzLCB0b3RfbGVuLAotCQkJCQkJcG9zLCBpdGVyX2ZuKTsKLQllbHNlIGlmIChmbnYpCi0JCXJldCA9IGRvX3N5bmNfcmVhZHZfd3JpdGV2KGZpbGUsIGlvdiwgbnJfc2VncywgdG90X2xlbiwKLQkJCQkJCXBvcywgZm52KTsKKwkJcmV0ID0gZG9faXRlcl9yZWFkdl93cml0ZXYoZmlsZSwgJml0ZXIsIHBvcywgaXRlcl9mbik7CiAJZWxzZQotCQlyZXQgPSBkb19sb29wX3JlYWR2X3dyaXRldihmaWxlLCBpb3YsIG5yX3NlZ3MsIHBvcywgZm4pOworCQlyZXQgPSBkb19sb29wX3JlYWR2X3dyaXRldihmaWxlLCAmaXRlciwgcG9zLCBmbik7CiAKIAlpZiAodHlwZSAhPSBSRUFEKQogCQlmaWxlX2VuZF93cml0ZShmaWxlKTsKIAogb3V0OgotCWlmIChpb3YgIT0gaW92c3RhY2spCi0JCWtmcmVlKGlvdik7CisJa2ZyZWUoaW92KTsKIAlpZiAoKHJldCArICh0eXBlID09IFJFQUQpKSA+IDApIHsKIAkJaWYgKHR5cGUgPT0gUkVBRCkKIAkJCWZzbm90aWZ5X2FjY2VzcyhmaWxlKTsKQEAgLTEwNDMsNDggKzk1MSw0MiBAQAogCWNvbXBhdF9zc2l6ZV90IHRvdF9sZW47CiAJc3RydWN0IGlvdmVjIGlvdnN0YWNrW1VJT19GQVNUSU9WXTsKIAlzdHJ1Y3QgaW92ZWMgKmlvdiA9IGlvdnN0YWNrOworCXN0cnVjdCBpb3ZfaXRlciBpdGVyOwogCXNzaXplX3QgcmV0OwogCWlvX2ZuX3QgZm47Ci0JaW92X2ZuX3QgZm52OwogCWl0ZXJfZm5fdCBpdGVyX2ZuOwogCi0JcmV0ID0gY29tcGF0X3J3X2NvcHlfY2hlY2tfdXZlY3Rvcih0eXBlLCB1dmVjdG9yLCBucl9zZWdzLAotCQkJCQkgICAgICAgVUlPX0ZBU1RJT1YsIGlvdnN0YWNrLCAmaW92KTsKLQlpZiAocmV0IDw9IDApCi0JCWdvdG8gb3V0OworCXJldCA9IGNvbXBhdF9pbXBvcnRfaW92ZWModHlwZSwgdXZlY3RvciwgbnJfc2VncywKKwkJCQkgIFVJT19GQVNUSU9WLCAmaW92LCAmaXRlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLQl0b3RfbGVuID0gcmV0OworCXRvdF9sZW4gPSBpb3ZfaXRlcl9jb3VudCgmaXRlcik7CisJaWYgKCF0b3RfbGVuKQorCQlnb3RvIG91dDsKIAlyZXQgPSByd192ZXJpZnlfYXJlYSh0eXBlLCBmaWxlLCBwb3MsIHRvdF9sZW4pOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCWZudiA9IE5VTEw7CiAJaWYgKHR5cGUgPT0gUkVBRCkgewogCQlmbiA9IGZpbGUtPmZfb3AtPnJlYWQ7Ci0JCWZudiA9IGZpbGUtPmZfb3AtPmFpb19yZWFkOwogCQlpdGVyX2ZuID0gZmlsZS0+Zl9vcC0+cmVhZF9pdGVyOwogCX0gZWxzZSB7CiAJCWZuID0gKGlvX2ZuX3QpZmlsZS0+Zl9vcC0+d3JpdGU7Ci0JCWZudiA9IGZpbGUtPmZfb3AtPmFpb193cml0ZTsKIAkJaXRlcl9mbiA9IGZpbGUtPmZfb3AtPndyaXRlX2l0ZXI7CiAJCWZpbGVfc3RhcnRfd3JpdGUoZmlsZSk7CiAJfQogCiAJaWYgKGl0ZXJfZm4pCi0JCXJldCA9IGRvX2l0ZXJfcmVhZHZfd3JpdGV2KGZpbGUsIHR5cGUsIGlvdiwgbnJfc2VncywgdG90X2xlbiwKLQkJCQkJCXBvcywgaXRlcl9mbik7Ci0JZWxzZSBpZiAoZm52KQotCQlyZXQgPSBkb19zeW5jX3JlYWR2X3dyaXRldihmaWxlLCBpb3YsIG5yX3NlZ3MsIHRvdF9sZW4sCi0JCQkJCQlwb3MsIGZudik7CisJCXJldCA9IGRvX2l0ZXJfcmVhZHZfd3JpdGV2KGZpbGUsICZpdGVyLCBwb3MsIGl0ZXJfZm4pOwogCWVsc2UKLQkJcmV0ID0gZG9fbG9vcF9yZWFkdl93cml0ZXYoZmlsZSwgaW92LCBucl9zZWdzLCBwb3MsIGZuKTsKKwkJcmV0ID0gZG9fbG9vcF9yZWFkdl93cml0ZXYoZmlsZSwgJml0ZXIsIHBvcywgZm4pOwogCiAJaWYgKHR5cGUgIT0gUkVBRCkKIAkJZmlsZV9lbmRfd3JpdGUoZmlsZSk7CiAKIG91dDoKLQlpZiAoaW92ICE9IGlvdnN0YWNrKQotCQlrZnJlZShpb3YpOworCWtmcmVlKGlvdik7CiAJaWYgKChyZXQgKyAodHlwZSA9PSBSRUFEKSkgPiAwKSB7CiAJCWlmICh0eXBlID09IFJFQUQpCiAJCQlmc25vdGlmeV9hY2Nlc3MoZmlsZSk7CmRpZmYgLS1naXQgYS9mcy9yZWlzZXJmcy9maWxlLmMgYi9mcy9yZWlzZXJmcy9maWxlLmMKaW5kZXggNzUxZGQzZi4uOTZhMWJjZiAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMvZmlsZS5jCisrKyBiL2ZzL3JlaXNlcmZzL2ZpbGUuYwpAQCAtMjQzLDggKzI0Myw2IEBACiB9CiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcmVpc2VyZnNfZmlsZV9vcGVyYXRpb25zID0gewotCS5yZWFkID0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUgPSBuZXdfc3luY193cml0ZSwKIAkudW5sb2NrZWRfaW9jdGwgPSByZWlzZXJmc19pb2N0bCwKICNpZmRlZiBDT05GSUdfQ09NUEFUCiAJLmNvbXBhdF9pb2N0bCA9IHJlaXNlcmZzX2NvbXBhdF9pb2N0bCwKZGlmZiAtLWdpdCBhL2ZzL3JlaXNlcmZzL2lub2RlLmMgYi9mcy9yZWlzZXJmcy9pbm9kZS5jCmluZGV4IGU3MjQwMWUuLjkzMTJiNzggMTAwNjQ0Ci0tLSBhL2ZzL3JlaXNlcmZzL2lub2RlLmMKKysrIGIvZnMvcmVpc2VyZnMvaW5vZGUuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogCiBpbnQgcmVpc2VyZnNfY29tbWl0X3dyaXRlKHN0cnVjdCBmaWxlICpmLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCSAgdW5zaWduZWQgZnJvbSwgdW5zaWduZWQgdG8pOwpkaWZmIC0tZ2l0IGEvZnMvcm9tZnMvbW1hcC1ub21tdS5jIGIvZnMvcm9tZnMvbW1hcC1ub21tdS5jCmluZGV4IDdkYTllMjEuLjExMThhMGQgMTAwNjQ0Ci0tLSBhL2ZzL3JvbWZzL21tYXAtbm9tbXUuYworKysgYi9mcy9yb21mcy9tbWFwLW5vbW11LmMKQEAgLTgxLDcgKzgxLDYgQEAKIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByb21mc19yb19mb3BzID0gewogCS5sbHNlZWsJCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCi0JLnJlYWQJCQk9IG5ld19zeW5jX3JlYWQsCiAJLnJlYWRfaXRlcgkJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAogCS5zcGxpY2VfcmVhZAkJPSBnZW5lcmljX2ZpbGVfc3BsaWNlX3JlYWQsCiAJLm1tYXAJCQk9IHJvbWZzX21tYXAsCmRpZmYgLS1naXQgYS9mcy9zcGxpY2UuYyBiL2ZzL3NwbGljZS5jCmluZGV4IDc5NjhkYTkuLjQ3NjAyNGIgMTAwNjQ0Ci0tLSBhL2ZzL3NwbGljZS5jCisrKyBiL2ZzL3NwbGljZS5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogLyoKQEAgLTUyNCw2ICs1MjMsOSBAQAogCWxvZmZfdCBpc2l6ZSwgbGVmdDsKIAlpbnQgcmV0OwogCisJaWYgKElTX0RBWChpbi0+Zl9tYXBwaW5nLT5ob3N0KSkKKwkJcmV0dXJuIGRlZmF1bHRfZmlsZV9zcGxpY2VfcmVhZChpbiwgcHBvcywgcGlwZSwgbGVuLCBmbGFncyk7CisKIAlpc2l6ZSA9IGlfc2l6ZV9yZWFkKGluLT5mX21hcHBpbmctPmhvc3QpOwogCWlmICh1bmxpa2VseSgqcHBvcyA+PSBpc2l6ZSkpCiAJCXJldHVybiAwOwpAQCAtMTUzNCwzNCArMTUzNiwyOSBAQAogCXN0cnVjdCBpb3ZlYyBpb3ZzdGFja1tVSU9fRkFTVElPVl07CiAJc3RydWN0IGlvdmVjICppb3YgPSBpb3ZzdGFjazsKIAlzdHJ1Y3QgaW92X2l0ZXIgaXRlcjsKLQlzc2l6ZV90IGNvdW50OwogCiAJcGlwZSA9IGdldF9waXBlX2luZm8oZmlsZSk7CiAJaWYgKCFwaXBlKQogCQlyZXR1cm4gLUVCQURGOwogCi0JcmV0ID0gcndfY29weV9jaGVja191dmVjdG9yKFJFQUQsIHVpb3YsIG5yX3NlZ3MsCi0JCQkJICAgIEFSUkFZX1NJWkUoaW92c3RhY2spLCBpb3ZzdGFjaywgJmlvdik7Ci0JaWYgKHJldCA8PSAwKQotCQlnb3RvIG91dDsKKwlyZXQgPSBpbXBvcnRfaW92ZWMoUkVBRCwgdWlvdiwgbnJfc2VncywKKwkJCSAgIEFSUkFZX1NJWkUoaW92c3RhY2spLCAmaW92LCAmaXRlcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKLQljb3VudCA9IHJldDsKLQlpb3ZfaXRlcl9pbml0KCZpdGVyLCBSRUFELCBpb3YsIG5yX3NlZ3MsIGNvdW50KTsKLQorCXNkLnRvdGFsX2xlbiA9IGlvdl9pdGVyX2NvdW50KCZpdGVyKTsKIAlzZC5sZW4gPSAwOwotCXNkLnRvdGFsX2xlbiA9IGNvdW50OwogCXNkLmZsYWdzID0gZmxhZ3M7CiAJc2QudS5kYXRhID0gJml0ZXI7CiAJc2QucG9zID0gMDsKIAotCXBpcGVfbG9jayhwaXBlKTsKLQlyZXQgPSBfX3NwbGljZV9mcm9tX3BpcGUocGlwZSwgJnNkLCBwaXBlX3RvX3VzZXIpOwotCXBpcGVfdW5sb2NrKHBpcGUpOworCWlmIChzZC50b3RhbF9sZW4pIHsKKwkJcGlwZV9sb2NrKHBpcGUpOworCQlyZXQgPSBfX3NwbGljZV9mcm9tX3BpcGUocGlwZSwgJnNkLCBwaXBlX3RvX3VzZXIpOworCQlwaXBlX3VubG9jayhwaXBlKTsKKwl9CiAKLW91dDoKLQlpZiAoaW92ICE9IGlvdnN0YWNrKQotCQlrZnJlZShpb3YpOwotCisJa2ZyZWUoaW92KTsKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9mcy9zdGF0LmMgYi9mcy9zdGF0LmMKaW5kZXggYWUwYzNjZS4uMTk2MzZhZiAxMDA2NDQKLS0tIGEvZnMvc3RhdC5jCisrKyBiL2ZzL3N0YXQuYwpAQCAtNjYsNyArNjYsNyBAQAogewogCWludCByZXR2YWw7CiAKLQlyZXR2YWwgPSBzZWN1cml0eV9pbm9kZV9nZXRhdHRyKHBhdGgtPm1udCwgcGF0aC0+ZGVudHJ5KTsKKwlyZXR2YWwgPSBzZWN1cml0eV9pbm9kZV9nZXRhdHRyKHBhdGgpOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAJcmV0dXJuIHZmc19nZXRhdHRyX25vc2VjKHBhdGgsIHN0YXQpOwpkaWZmIC0tZ2l0IGEvZnMvc3VwZXIuYyBiL2ZzL3N1cGVyLmMKaW5kZXggMmI3ZGM5MC4uOTI4YzIwZiAxMDA2NDQKLS0tIGEvZnMvc3VwZXIuYworKysgYi9mcy9zdXBlci5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIAlzLT5zX21heGJ5dGVzID0gTUFYX05PTl9MRlM7CiAJcy0+c19vcCA9ICZkZWZhdWx0X29wOwogCXMtPnNfdGltZV9ncmFuID0gMTAwMDAwMDAwMDsKLQlzLT5jbGVhbmNhY2hlX3Bvb2xpZCA9IC0xOworCXMtPmNsZWFuY2FjaGVfcG9vbGlkID0gQ0xFQU5DQUNIRV9OT19QT09MOwogCiAJcy0+c19zaHJpbmsuc2Vla3MgPSBERUZBVUxUX1NFRUtTOwogCXMtPnNfc2hyaW5rLnNjYW5fb2JqZWN0cyA9IHN1cGVyX2NhY2hlX3NjYW47CmRpZmYgLS1naXQgYS9mcy9zeXNmcy9ncm91cC5jIGIvZnMvc3lzZnMvZ3JvdXAuYwppbmRleCAyNTU0ZDg4Li5iNDAwYzA0IDEwMDY0NAotLS0gYS9mcy9zeXNmcy9ncm91cC5jCisrKyBiL2ZzL3N5c2ZzL2dyb3VwLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAogCWlmIChncnAtPmF0dHJzKSB7CiAJCWZvciAoaSA9IDAsIGF0dHIgPSBncnAtPmF0dHJzOyAqYXR0ciAmJiAhZXJyb3I7IGkrKywgYXR0cisrKSB7Ci0JCQl1bW9kZV90IG1vZGUgPSAwOworCQkJdW1vZGVfdCBtb2RlID0gKCphdHRyKS0+bW9kZTsKIAogCQkJLyoKIAkJCSAqIEluIHVwZGF0ZSBtb2RlLCB3ZSdyZSBjaGFuZ2luZyB0aGUgcGVybWlzc2lvbnMgb3IKQEAgLTU1LDkgKzU1LDE0IEBACiAJCQkJaWYgKCFtb2RlKQogCQkJCQljb250aW51ZTsKIAkJCX0KKworCQkJV0FSTihtb2RlICYgfihTWVNGU19QUkVBTExPQyB8IDA2NjQpLAorCQkJICAgICAiQXR0cmlidXRlICVzOiBJbnZhbGlkIHBlcm1pc3Npb25zIDAlb1xuIiwKKwkJCSAgICAgKCphdHRyKS0+bmFtZSwgbW9kZSk7CisKKwkJCW1vZGUgJj0gU1lTRlNfUFJFQUxMT0MgfCAwNjY0OwogCQkJZXJyb3IgPSBzeXNmc19hZGRfZmlsZV9tb2RlX25zKHBhcmVudCwgKmF0dHIsIGZhbHNlLAotCQkJCQkJICAgICAgICgqYXR0ciktPm1vZGUgfCBtb2RlLAotCQkJCQkJICAgICAgIE5VTEwpOworCQkJCQkJICAgICAgIG1vZGUsIE5VTEwpOwogCQkJaWYgKHVubGlrZWx5KGVycm9yKSkKIAkJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvc3lzdi9maWxlLmMgYi9mcy9zeXN2L2ZpbGUuYwppbmRleCBiMDA4MTFjLi5hNDhlMzA0IDEwMDY0NAotLS0gYS9mcy9zeXN2L2ZpbGUuYworKysgYi9mcy9zeXN2L2ZpbGUuYwpAQCAtMjEsOSArMjEsNyBAQAogICovCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN5c3ZfZmlsZV9vcGVyYXRpb25zID0gewogCS5sbHNlZWsJCT0gZ2VuZXJpY19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIJPSBnZW5lcmljX2ZpbGVfcmVhZF9pdGVyLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkud3JpdGVfaXRlcgk9IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyLAogCS5tbWFwCQk9IGdlbmVyaWNfZmlsZV9tbWFwLAogCS5mc3luYwkJPSBnZW5lcmljX2ZpbGVfZnN5bmMsCmRpZmYgLS1naXQgYS9mcy90cmFjZWZzL01ha2VmaWxlIGIvZnMvdHJhY2Vmcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmZhMzViCi0tLSAvZGV2L251bGwKKysrIGIvZnMvdHJhY2Vmcy9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK3RyYWNlZnMtb2Jqcwk6PSBpbm9kZS5vCisKK29iai0kKENPTkZJR19UUkFDSU5HKQkrPSB0cmFjZWZzLm8KKwpkaWZmIC0tZ2l0IGEvZnMvdHJhY2Vmcy9pbm9kZS5jIGIvZnMvdHJhY2Vmcy9pbm9kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MmJkZjMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy90cmFjZWZzL2lub2RlLmMKQEAgLTAsMCArMSw2NTAgQEAKKy8qCisgKiAgaW5vZGUuYyAtIHBhcnQgb2YgdHJhY2VmcywgYSBwc2V1ZG8gZmlsZSBzeXN0ZW0gZm9yIGFjdGl2YXRpbmcgdHJhY2luZworICoKKyAqIEJhc2VkIG9uIGRlYnVnZnMgYnk6IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CisgKgorICogIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0IEluYywgYXV0aG9yOiBTdGV2ZW4gUm9zdGVkdCA8c3Jvc3RlZHRAcmVkaGF0LmNvbT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKgkyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIHRyYWNlZnMgaXMgdGhlIGZpbGUgc3lzdGVtIHRoYXQgaXMgdXNlZCBieSB0aGUgdHJhY2luZyBpbmZyYXN0cnVjdHVyZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWZzLmg+CisjaW5jbHVkZSA8bGludXgvZnNub3RpZnkuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgorI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjZGVmaW5lIFRSQUNFRlNfREVGQVVMVF9NT0RFCTA3MDAKKworc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqdHJhY2Vmc19tb3VudDsKK3N0YXRpYyBpbnQgdHJhY2Vmc19tb3VudF9jb3VudDsKK3N0YXRpYyBib29sIHRyYWNlZnNfcmVnaXN0ZXJlZDsKKworc3RhdGljIHNzaXplX3QgZGVmYXVsdF9yZWFkX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBkZWZhdWx0X3dyaXRlX2ZpbGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjZWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKKwkucmVhZCA9CQlkZWZhdWx0X3JlYWRfZmlsZSwKKwkud3JpdGUgPQlkZWZhdWx0X3dyaXRlX2ZpbGUsCisJLm9wZW4gPQkJc2ltcGxlX29wZW4sCisJLmxsc2VlayA9CW5vb3BfbGxzZWVrLAorfTsKKworc3RhdGljIHN0cnVjdCB0cmFjZWZzX2Rpcl9vcHMgeworCWludCAoKm1rZGlyKShjb25zdCBjaGFyICpuYW1lKTsKKwlpbnQgKCpybWRpcikoY29uc3QgY2hhciAqbmFtZSk7Cit9IHRyYWNlZnNfb3BzOworCitzdGF0aWMgY2hhciAqZ2V0X2RuYW1lKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwljb25zdCBjaGFyICpkbmFtZTsKKwljaGFyICpuYW1lOworCWludCBsZW4gPSBkZW50cnktPmRfbmFtZS5sZW47CisKKwlkbmFtZSA9IGRlbnRyeS0+ZF9uYW1lLm5hbWU7CisJbmFtZSA9IGttYWxsb2MobGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gTlVMTDsKKwltZW1jcHkobmFtZSwgZG5hbWUsIGxlbik7CisJbmFtZVtsZW5dID0gMDsKKwlyZXR1cm4gbmFtZTsKK30KKworc3RhdGljIGludCB0cmFjZWZzX3N5c2NhbGxfbWtkaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCB1bW9kZV90IG1vZGUpCit7CisJY2hhciAqbmFtZTsKKwlpbnQgcmV0OworCisJbmFtZSA9IGdldF9kbmFtZShkZW50cnkpOworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFRoZSBta2RpciBjYWxsIGNhbiBjYWxsIHRoZSBnZW5lcmljIGZ1bmN0aW9ucyB0aGF0IGNyZWF0ZQorCSAqIHRoZSBmaWxlcyB3aXRoaW4gdGhlIHRyYWNlZnMgc3lzdGVtLiBJdCBpcyB1cCB0byB0aGUgaW5kaXZpZHVhbAorCSAqIG1rZGlyIHJvdXRpbmUgdG8gaGFuZGxlIHJhY2VzLgorCSAqLworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCXJldCA9IHRyYWNlZnNfb3BzLm1rZGlyKG5hbWUpOworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKKworCWtmcmVlKG5hbWUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0cmFjZWZzX3N5c2NhbGxfcm1kaXIoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCWNoYXIgKm5hbWU7CisJaW50IHJldDsKKworCW5hbWUgPSBnZXRfZG5hbWUoZGVudHJ5KTsKKwlpZiAoIW5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBUaGUgcm1kaXIgY2FsbCBjYW4gY2FsbCB0aGUgZ2VuZXJpYyBmdW5jdGlvbnMgdGhhdCBjcmVhdGUKKwkgKiB0aGUgZmlsZXMgd2l0aGluIHRoZSB0cmFjZWZzIHN5c3RlbS4gSXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwKKwkgKiBybWRpciByb3V0aW5lIHRvIGhhbmRsZSByYWNlcy4KKwkgKiBUaGlzIHRpbWUgd2UgbmVlZCB0byB1bmxvY2sgbm90IG9ubHkgdGhlIHBhcmVudCAoaW5vZGUpIGJ1dAorCSAqIGFsc28gdGhlIGRpcmVjdG9yeSB0aGF0IGlzIGJlaW5nIGRlbGV0ZWQuCisJICovCisJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJcmV0ID0gdHJhY2Vmc19vcHMucm1kaXIobmFtZSk7CisKKwltdXRleF9sb2NrX25lc3RlZCgmaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfUEFSRU5UKTsKKwltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOworCisJa2ZyZWUobmFtZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgdHJhY2Vmc19kaXJfaW5vZGVfb3BlcmF0aW9ucyA9IHsKKwkubG9va3VwCQk9IHNpbXBsZV9sb29rdXAsCisJLm1rZGlyCQk9IHRyYWNlZnNfc3lzY2FsbF9ta2RpciwKKwkucm1kaXIJCT0gdHJhY2Vmc19zeXNjYWxsX3JtZGlyLAorfTsKKworc3RhdGljIHN0cnVjdCBpbm9kZSAqdHJhY2Vmc19nZXRfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gbmV3X2lub2RlKHNiKTsKKwlpZiAoaW5vZGUpIHsKKwkJaW5vZGUtPmlfaW5vID0gZ2V0X25leHRfaW5vKCk7CisJCWlub2RlLT5pX2F0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRTsKKwl9CisJcmV0dXJuIGlub2RlOworfQorCitzdHJ1Y3QgdHJhY2Vmc19tb3VudF9vcHRzIHsKKwlrdWlkX3QgdWlkOworCWtnaWRfdCBnaWQ7CisJdW1vZGVfdCBtb2RlOworfTsKKworZW51bSB7CisJT3B0X3VpZCwKKwlPcHRfZ2lkLAorCU9wdF9tb2RlLAorCU9wdF9lcnIKK307CisKK3N0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKKwl7T3B0X3VpZCwgInVpZD0ldSJ9LAorCXtPcHRfZ2lkLCAiZ2lkPSV1In0sCisJe09wdF9tb2RlLCAibW9kZT0lbyJ9LAorCXtPcHRfZXJyLCBOVUxMfQorfTsKKworc3RydWN0IHRyYWNlZnNfZnNfaW5mbyB7CisJc3RydWN0IHRyYWNlZnNfbW91bnRfb3B0cyBtb3VudF9vcHRzOworfTsKKworc3RhdGljIGludCB0cmFjZWZzX3BhcnNlX29wdGlvbnMoY2hhciAqZGF0YSwgc3RydWN0IHRyYWNlZnNfbW91bnRfb3B0cyAqb3B0cykKK3sKKwlzdWJzdHJpbmdfdCBhcmdzW01BWF9PUFRfQVJHU107CisJaW50IG9wdGlvbjsKKwlpbnQgdG9rZW47CisJa3VpZF90IHVpZDsKKwlrZ2lkX3QgZ2lkOworCWNoYXIgKnA7CisKKwlvcHRzLT5tb2RlID0gVFJBQ0VGU19ERUZBVUxUX01PREU7CisKKwl3aGlsZSAoKHAgPSBzdHJzZXAoJmRhdGEsICIsIikpICE9IE5VTEwpIHsKKwkJaWYgKCEqcCkKKwkJCWNvbnRpbnVlOworCisJCXRva2VuID0gbWF0Y2hfdG9rZW4ocCwgdG9rZW5zLCBhcmdzKTsKKwkJc3dpdGNoICh0b2tlbikgeworCQljYXNlIE9wdF91aWQ6CisJCQlpZiAobWF0Y2hfaW50KCZhcmdzWzBdLCAmb3B0aW9uKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXVpZCA9IG1ha2Vfa3VpZChjdXJyZW50X3VzZXJfbnMoKSwgb3B0aW9uKTsKKwkJCWlmICghdWlkX3ZhbGlkKHVpZCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlvcHRzLT51aWQgPSB1aWQ7CisJCQlicmVhazsKKwkJY2FzZSBPcHRfZ2lkOgorCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlnaWQgPSBtYWtlX2tnaWQoY3VycmVudF91c2VyX25zKCksIG9wdGlvbik7CisJCQlpZiAoIWdpZF92YWxpZChnaWQpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJb3B0cy0+Z2lkID0gZ2lkOworCQkJYnJlYWs7CisJCWNhc2UgT3B0X21vZGU6CisJCQlpZiAobWF0Y2hfb2N0YWwoJmFyZ3NbMF0sICZvcHRpb24pKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJb3B0cy0+bW9kZSA9IG9wdGlvbiAmIFNfSUFMTFVHTzsKKwkJCWJyZWFrOworCQkvKgorCQkgKiBXZSBtaWdodCBsaWtlIHRvIHJlcG9ydCBiYWQgbW91bnQgb3B0aW9ucyBoZXJlOworCQkgKiBidXQgdHJhZGl0aW9uYWxseSB0cmFjZWZzIGhhcyBpZ25vcmVkIGFsbCBtb3VudCBvcHRpb25zCisJCSAqLworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHJhY2Vmc19hcHBseV9vcHRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCit7CisJc3RydWN0IHRyYWNlZnNfZnNfaW5mbyAqZnNpID0gc2ItPnNfZnNfaW5mbzsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gc2ItPnNfcm9vdC0+ZF9pbm9kZTsKKwlzdHJ1Y3QgdHJhY2Vmc19tb3VudF9vcHRzICpvcHRzID0gJmZzaS0+bW91bnRfb3B0czsKKworCWlub2RlLT5pX21vZGUgJj0gflNfSUFMTFVHTzsKKwlpbm9kZS0+aV9tb2RlIHw9IG9wdHMtPm1vZGU7CisKKwlpbm9kZS0+aV91aWQgPSBvcHRzLT51aWQ7CisJaW5vZGUtPmlfZ2lkID0gb3B0cy0+Z2lkOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHJhY2Vmc19yZW1vdW50KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGludCAqZmxhZ3MsIGNoYXIgKmRhdGEpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgdHJhY2Vmc19mc19pbmZvICpmc2kgPSBzYi0+c19mc19pbmZvOworCisJc3luY19maWxlc3lzdGVtKHNiKTsKKwllcnIgPSB0cmFjZWZzX3BhcnNlX29wdGlvbnMoZGF0YSwgJmZzaS0+bW91bnRfb3B0cyk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCisJdHJhY2Vmc19hcHBseV9vcHRpb25zKHNiKTsKKworZmFpbDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRyYWNlZnNfc2hvd19vcHRpb25zKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGRlbnRyeSAqcm9vdCkKK3sKKwlzdHJ1Y3QgdHJhY2Vmc19mc19pbmZvICpmc2kgPSByb290LT5kX3NiLT5zX2ZzX2luZm87CisJc3RydWN0IHRyYWNlZnNfbW91bnRfb3B0cyAqb3B0cyA9ICZmc2ktPm1vdW50X29wdHM7CisKKwlpZiAoIXVpZF9lcShvcHRzLT51aWQsIEdMT0JBTF9ST09UX1VJRCkpCisJCXNlcV9wcmludGYobSwgIix1aWQ9JXUiLAorCQkJICAgZnJvbV9rdWlkX211bmdlZCgmaW5pdF91c2VyX25zLCBvcHRzLT51aWQpKTsKKwlpZiAoIWdpZF9lcShvcHRzLT5naWQsIEdMT0JBTF9ST09UX0dJRCkpCisJCXNlcV9wcmludGYobSwgIixnaWQ9JXUiLAorCQkJICAgZnJvbV9rZ2lkX211bmdlZCgmaW5pdF91c2VyX25zLCBvcHRzLT5naWQpKTsKKwlpZiAob3B0cy0+bW9kZSAhPSBUUkFDRUZTX0RFRkFVTFRfTU9ERSkKKwkJc2VxX3ByaW50ZihtLCAiLG1vZGU9JW8iLCBvcHRzLT5tb2RlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHN1cGVyX29wZXJhdGlvbnMgdHJhY2Vmc19zdXBlcl9vcGVyYXRpb25zID0geworCS5zdGF0ZnMJCT0gc2ltcGxlX3N0YXRmcywKKwkucmVtb3VudF9mcwk9IHRyYWNlZnNfcmVtb3VudCwKKwkuc2hvd19vcHRpb25zCT0gdHJhY2Vmc19zaG93X29wdGlvbnMsCit9OworCitzdGF0aWMgaW50IHRyYWNlX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKK3sKKwlzdGF0aWMgc3RydWN0IHRyZWVfZGVzY3IgdHJhY2VfZmlsZXNbXSA9IHt7IiJ9fTsKKwlzdHJ1Y3QgdHJhY2Vmc19mc19pbmZvICpmc2k7CisJaW50IGVycjsKKworCXNhdmVfbW91bnRfb3B0aW9ucyhzYiwgZGF0YSk7CisKKwlmc2kgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhY2Vmc19mc19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJc2ItPnNfZnNfaW5mbyA9IGZzaTsKKwlpZiAoIWZzaSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJZXJyID0gdHJhY2Vmc19wYXJzZV9vcHRpb25zKGRhdGEsICZmc2ktPm1vdW50X29wdHMpOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKworCWVyciAgPSAgc2ltcGxlX2ZpbGxfc3VwZXIoc2IsIFRSQUNFRlNfTUFHSUMsIHRyYWNlX2ZpbGVzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw7CisKKwlzYi0+c19vcCA9ICZ0cmFjZWZzX3N1cGVyX29wZXJhdGlvbnM7CisKKwl0cmFjZWZzX2FwcGx5X29wdGlvbnMoc2IpOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJa2ZyZWUoZnNpKTsKKwlzYi0+c19mc19pbmZvID0gTlVMTDsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqdHJhY2VfbW91bnQoc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgKmZzX3R5cGUsCisJCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmRldl9uYW1lLAorCQkJdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gbW91bnRfc2luZ2xlKGZzX3R5cGUsIGZsYWdzLCBkYXRhLCB0cmFjZV9maWxsX3N1cGVyKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHRyYWNlX2ZzX3R5cGUgPSB7CisJLm93bmVyID0JVEhJU19NT0RVTEUsCisJLm5hbWUgPQkJInRyYWNlZnMiLAorCS5tb3VudCA9CXRyYWNlX21vdW50LAorCS5raWxsX3NiID0Ja2lsbF9saXR0ZXJfc3VwZXIsCit9OworTU9EVUxFX0FMSUFTX0ZTKCJ0cmFjZWZzIik7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpzdGFydF9jcmVhdGluZyhjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpCit7CisJc3RydWN0IGRlbnRyeSAqZGVudHJ5OworCWludCBlcnJvcjsKKworCXByX2RlYnVnKCJ0cmFjZWZzOiBjcmVhdGluZyBmaWxlICclcydcbiIsbmFtZSk7CisKKwllcnJvciA9IHNpbXBsZV9waW5fZnMoJnRyYWNlX2ZzX3R5cGUsICZ0cmFjZWZzX21vdW50LAorCQkJICAgICAgJnRyYWNlZnNfbW91bnRfY291bnQpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOworCisJLyogSWYgdGhlIHBhcmVudCBpcyBub3Qgc3BlY2lmaWVkLCB3ZSBjcmVhdGUgaXQgaW4gdGhlIHJvb3QuCisJICogV2UgbmVlZCB0aGUgcm9vdCBkZW50cnkgdG8gZG8gdGhpcywgd2hpY2ggaXMgaW4gdGhlIHN1cGVyCisJICogYmxvY2suIEEgcG9pbnRlciB0byB0aGF0IGlzIGluIHRoZSBzdHJ1Y3QgdmZzbW91bnQgdGhhdCB3ZQorCSAqIGhhdmUgYXJvdW5kLgorCSAqLworCWlmICghcGFyZW50KQorCQlwYXJlbnQgPSB0cmFjZWZzX21vdW50LT5tbnRfcm9vdDsKKworCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CisJZGVudHJ5ID0gbG9va3VwX29uZV9sZW4obmFtZSwgcGFyZW50LCBzdHJsZW4obmFtZSkpOworCWlmICghSVNfRVJSKGRlbnRyeSkgJiYgZGVudHJ5LT5kX2lub2RlKSB7CisJCWRwdXQoZGVudHJ5KTsKKwkJZGVudHJ5ID0gRVJSX1BUUigtRUVYSVNUKTsKKwl9CisJaWYgKElTX0VSUihkZW50cnkpKQorCQltdXRleF91bmxvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CisJcmV0dXJuIGRlbnRyeTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmZhaWxlZF9jcmVhdGluZyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKKwlkcHV0KGRlbnRyeSk7CisJc2ltcGxlX3JlbGVhc2VfZnMoJnRyYWNlZnNfbW91bnQsICZ0cmFjZWZzX21vdW50X2NvdW50KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmVuZF9jcmVhdGluZyhzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKKwlyZXR1cm4gZGVudHJ5OworfQorCisvKioKKyAqIHRyYWNlZnNfY3JlYXRlX2ZpbGUgLSBjcmVhdGUgYSBmaWxlIGluIHRoZSB0cmFjZWZzIGZpbGVzeXN0ZW0KKyAqIEBuYW1lOiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUuCisgKiBAbW9kZTogdGhlIHBlcm1pc3Npb24gdGhhdCB0aGUgZmlsZSBzaG91bGQgaGF2ZS4KKyAqIEBwYXJlbnQ6IGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlbnRyeSBmb3IgdGhpcyBmaWxlLiAgVGhpcyBzaG91bGQgYmUgYQorICogICAgICAgICAgZGlyZWN0b3J5IGRlbnRyeSBpZiBzZXQuICBJZiB0aGlzIHBhcmFtZXRlciBpcyBOVUxMLCB0aGVuIHRoZQorICogICAgICAgICAgZmlsZSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIHRyYWNlZnMgZmlsZXN5c3RlbS4KKyAqIEBkYXRhOiBhIHBvaW50ZXIgdG8gc29tZXRoaW5nIHRoYXQgdGhlIGNhbGxlciB3aWxsIHdhbnQgdG8gZ2V0IHRvIGxhdGVyCisgKiAgICAgICAgb24uICBUaGUgaW5vZGUuaV9wcml2YXRlIHBvaW50ZXIgd2lsbCBwb2ludCB0byB0aGlzIHZhbHVlIG9uCisgKiAgICAgICAgdGhlIG9wZW4oKSBjYWxsLgorICogQGZvcHM6IGEgcG9pbnRlciB0byBhIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IKKyAqICAgICAgICB0aGlzIGZpbGUuCisgKgorICogVGhpcyBpcyB0aGUgYmFzaWMgImNyZWF0ZSBhIGZpbGUiIGZ1bmN0aW9uIGZvciB0cmFjZWZzLiAgSXQgYWxsb3dzIGZvciBhCisgKiB3aWRlIHJhbmdlIG9mIGZsZXhpYmlsaXR5IGluIGNyZWF0aW5nIGEgZmlsZSwgb3IgYSBkaXJlY3RvcnkgKGlmIHlvdSB3YW50CisgKiB0byBjcmVhdGUgYSBkaXJlY3RvcnksIHRoZSB0cmFjZWZzX2NyZWF0ZV9kaXIoKSBmdW5jdGlvbiBpcworICogcmVjb21tZW5kZWQgdG8gYmUgdXNlZCBpbnN0ZWFkLikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byBhIGRlbnRyeSBpZiBpdCBzdWNjZWVkcy4gIFRoaXMKKyAqIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gdGhlIHRyYWNlZnNfcmVtb3ZlKCkgZnVuY3Rpb24gd2hlbiB0aGUgZmlsZSBpcworICogdG8gYmUgcmVtb3ZlZCAobm8gYXV0b21hdGljIGNsZWFudXAgaGFwcGVucyBpZiB5b3VyIG1vZHVsZSBpcyB1bmxvYWRlZCwKKyAqIHlvdSBhcmUgcmVzcG9uc2libGUgaGVyZS4pICBJZiBhbiBlcnJvciBvY2N1cnMsICVOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogSWYgdHJhY2VmcyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgLSVFTk9ERVYgd2lsbCBiZQorICogcmV0dXJuZWQuCisgKi8KK3N0cnVjdCBkZW50cnkgKnRyYWNlZnNfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgdW1vZGVfdCBtb2RlLAorCQkJCSAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdm9pZCAqZGF0YSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKQoreworCXN0cnVjdCBkZW50cnkgKmRlbnRyeTsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCisJaWYgKCEobW9kZSAmIFNfSUZNVCkpCisJCW1vZGUgfD0gU19JRlJFRzsKKwlCVUdfT04oIVNfSVNSRUcobW9kZSkpOworCWRlbnRyeSA9IHN0YXJ0X2NyZWF0aW5nKG5hbWUsIHBhcmVudCk7CisKKwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCXJldHVybiBOVUxMOworCisJaW5vZGUgPSB0cmFjZWZzX2dldF9pbm9kZShkZW50cnktPmRfc2IpOworCWlmICh1bmxpa2VseSghaW5vZGUpKQorCQlyZXR1cm4gZmFpbGVkX2NyZWF0aW5nKGRlbnRyeSk7CisKKwlpbm9kZS0+aV9tb2RlID0gbW9kZTsKKwlpbm9kZS0+aV9mb3AgPSBmb3BzID8gZm9wcyA6ICZ0cmFjZWZzX2ZpbGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9wcml2YXRlID0gZGF0YTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCWZzbm90aWZ5X2NyZWF0ZShkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLCBkZW50cnkpOworCXJldHVybiBlbmRfY3JlYXRpbmcoZGVudHJ5KTsKK30KKworc3RhdGljIHN0cnVjdCBkZW50cnkgKl9fY3JlYXRlX2Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCisJCQkJICAgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgKm9wcykKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBzdGFydF9jcmVhdGluZyhuYW1lLCBwYXJlbnQpOworCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisKKwlpZiAoSVNfRVJSKGRlbnRyeSkpCisJCXJldHVybiBOVUxMOworCisJaW5vZGUgPSB0cmFjZWZzX2dldF9pbm9kZShkZW50cnktPmRfc2IpOworCWlmICh1bmxpa2VseSghaW5vZGUpKQorCQlyZXR1cm4gZmFpbGVkX2NyZWF0aW5nKGRlbnRyeSk7CisKKwlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiB8IFNfSVJXWFUgfCBTX0lSVUdPIHwgU19JWFVHTzsKKwlpbm9kZS0+aV9vcCA9IG9wczsKKwlpbm9kZS0+aV9mb3AgPSAmc2ltcGxlX2Rpcl9vcGVyYXRpb25zOworCisJLyogZGlyZWN0b3J5IGlub2RlcyBzdGFydCBvZmYgd2l0aCBpX25saW5rID09IDIgKGZvciAiLiIgZW50cnkpICovCisJaW5jX25saW5rKGlub2RlKTsKKwlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOworCWluY19ubGluayhkZW50cnktPmRfcGFyZW50LT5kX2lub2RlKTsKKwlmc25vdGlmeV9ta2RpcihkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLCBkZW50cnkpOworCXJldHVybiBlbmRfY3JlYXRpbmcoZGVudHJ5KTsKK30KKworLyoqCisgKiB0cmFjZWZzX2NyZWF0ZV9kaXIgLSBjcmVhdGUgYSBkaXJlY3RvcnkgaW4gdGhlIHRyYWNlZnMgZmlsZXN5c3RlbQorICogQG5hbWU6IGEgcG9pbnRlciB0byBhIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdG8KKyAqICAgICAgICBjcmVhdGUuCisgKiBAcGFyZW50OiBhIHBvaW50ZXIgdG8gdGhlIHBhcmVudCBkZW50cnkgZm9yIHRoaXMgZmlsZS4gIFRoaXMgc2hvdWxkIGJlIGEKKyAqICAgICAgICAgIGRpcmVjdG9yeSBkZW50cnkgaWYgc2V0LiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgTlVMTCwgdGhlbiB0aGUKKyAqICAgICAgICAgIGRpcmVjdG9yeSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIHRyYWNlZnMgZmlsZXN5c3RlbS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBkaXJlY3RvcnkgaW4gdHJhY2VmcyB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIGEgZGVudHJ5IGlmIGl0IHN1Y2NlZWRzLiAgVGhpcworICogcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byB0aGUgdHJhY2Vmc19yZW1vdmUoKSBmdW5jdGlvbiB3aGVuIHRoZSBmaWxlIGlzCisgKiB0byBiZSByZW1vdmVkLiBJZiBhbiBlcnJvciBvY2N1cnMsICVOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCisgKgorICogSWYgdHJhY2luZyBpcyBub3QgZW5hYmxlZCBpbiB0aGUga2VybmVsLCB0aGUgdmFsdWUgLSVFTk9ERVYgd2lsbCBiZQorICogcmV0dXJuZWQuCisgKi8KK3N0cnVjdCBkZW50cnkgKnRyYWNlZnNfY3JlYXRlX2Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQpCit7CisJcmV0dXJuIF9fY3JlYXRlX2RpcihuYW1lLCBwYXJlbnQsICZzaW1wbGVfZGlyX2lub2RlX29wZXJhdGlvbnMpOworfQorCisvKioKKyAqIHRyYWNlZnNfY3JlYXRlX2luc3RhbmNlX2RpciAtIGNyZWF0ZSB0aGUgdHJhY2luZyBpbnN0YW5jZXMgZGlyZWN0b3J5CisgKiBAbmFtZTogVGhlIG5hbWUgb2YgdGhlIGluc3RhbmNlcyBkaXJlY3RvcnkgdG8gY3JlYXRlCisgKiBAcGFyZW50OiBUaGUgcGFyZW50IGRpcmVjdG9yeSB0aGF0IHRoZSBpbnN0YW5jZXMgZGlyZWN0b3J5IHdpbGwgZXhpc3QKKyAqIEBta2RpcjogVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIG1rZGlyIGlzIHBlcmZvcm1lZC4KKyAqIEBybWRpcjogVGhlIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBhIHJtZGlyIGlzIHBlcmZvcm1lZC4KKyAqCisgKiBPbmx5IG9uZSBpbnN0YW5jZXMgZGlyZWN0b3J5IGlzIGFsbG93ZWQuCisgKgorICogVGhlIGluc3RhbmNlcyBkaXJlY3RvcnkgaXMgc3BlY2lhbCBhcyBpdCBhbGxvd3MgZm9yIG1rZGlyIGFuZCBybWRpciB0bworICogdG8gYmUgZG9uZSBieSB1c2Vyc3BhY2UuIFdoZW4gYSBta2RpciBvciBybWRpciBpcyBwZXJmb3JtZWQsIHRoZSBpbm9kZQorICogbG9ja3MgYXJlIHJlbGVhc2VkIGFuZCB0aGUgbWV0aGhvZHMgcGFzc2VkIGluIChAbWtkaXIgYW5kIEBybWRpcikgYXJlCisgKiBjYWxsZWQgd2l0aG91dCBsb2NrcyBhbmQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGJlaW5nIGNyZWF0ZWQKKyAqIHdpdGhpbiB0aGUgaW5zdGFuY2VzIGRpcmVjdG9yeS4KKyAqCisgKiBSZXR1cm5zIHRoZSBkZW50cnkgb2YgdGhlIGluc3RhbmNlcyBkaXJlY3RvcnkuCisgKi8KK3N0cnVjdCBkZW50cnkgKnRyYWNlZnNfY3JlYXRlX2luc3RhbmNlX2Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCisJCQkJCSAgaW50ICgqbWtkaXIpKGNvbnN0IGNoYXIgKm5hbWUpLAorCQkJCQkgIGludCAoKnJtZGlyKShjb25zdCBjaGFyICpuYW1lKSkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnk7CisKKwkvKiBPbmx5IGFsbG93IG9uZSBpbnN0YW5jZSBvZiB0aGUgaW5zdGFuY2VzIGRpcmVjdG9yeS4gKi8KKwlpZiAoV0FSTl9PTih0cmFjZWZzX29wcy5ta2RpciB8fCB0cmFjZWZzX29wcy5ybWRpcikpCisJCXJldHVybiBOVUxMOworCisJZGVudHJ5ID0gX19jcmVhdGVfZGlyKG5hbWUsIHBhcmVudCwgJnRyYWNlZnNfZGlyX2lub2RlX29wZXJhdGlvbnMpOworCWlmICghZGVudHJ5KQorCQlyZXR1cm4gTlVMTDsKKworCXRyYWNlZnNfb3BzLm1rZGlyID0gbWtkaXI7CisJdHJhY2Vmc19vcHMucm1kaXIgPSBybWRpcjsKKworCXJldHVybiBkZW50cnk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRyYWNlZnNfcG9zaXRpdmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXJldHVybiBkZW50cnktPmRfaW5vZGUgJiYgIWRfdW5oYXNoZWQoZGVudHJ5KTsKK30KKworc3RhdGljIGludCBfX3RyYWNlZnNfcmVtb3ZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGRlbnRyeSAqcGFyZW50KQoreworCWludCByZXQgPSAwOworCisJaWYgKHRyYWNlZnNfcG9zaXRpdmUoZGVudHJ5KSkgeworCQlpZiAoZGVudHJ5LT5kX2lub2RlKSB7CisJCQlkZ2V0KGRlbnRyeSk7CisJCQlzd2l0Y2ggKGRlbnRyeS0+ZF9pbm9kZS0+aV9tb2RlICYgU19JRk1UKSB7CisJCQljYXNlIFNfSUZESVI6CisJCQkJcmV0ID0gc2ltcGxlX3JtZGlyKHBhcmVudC0+ZF9pbm9kZSwgZGVudHJ5KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJc2ltcGxlX3VubGluayhwYXJlbnQtPmRfaW5vZGUsIGRlbnRyeSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIXJldCkKKwkJCQlkX2RlbGV0ZShkZW50cnkpOworCQkJZHB1dChkZW50cnkpOworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdHJhY2Vmc19yZW1vdmUgLSByZW1vdmVzIGEgZmlsZSBvciBkaXJlY3RvcnkgZnJvbSB0aGUgdHJhY2VmcyBmaWxlc3lzdGVtCisgKiBAZGVudHJ5OiBhIHBvaW50ZXIgdG8gYSB0aGUgZGVudHJ5IG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSB0byBiZQorICogICAgICAgICAgcmVtb3ZlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgYSBmaWxlIG9yIGRpcmVjdG9yeSBpbiB0cmFjZWZzIHRoYXQgd2FzIHByZXZpb3VzbHkKKyAqIGNyZWF0ZWQgd2l0aCBhIGNhbGwgdG8gYW5vdGhlciB0cmFjZWZzIGZ1bmN0aW9uIChsaWtlCisgKiB0cmFjZWZzX2NyZWF0ZV9maWxlKCkgb3IgdmFyaWFudHMgdGhlcmVvZi4pCisgKi8KK3ZvaWQgdHJhY2Vmc19yZW1vdmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoreworCXN0cnVjdCBkZW50cnkgKnBhcmVudDsKKwlpbnQgcmV0OworCisJaWYgKElTX0VSUl9PUl9OVUxMKGRlbnRyeSkpCisJCXJldHVybjsKKworCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7CisJaWYgKCFwYXJlbnQgfHwgIXBhcmVudC0+ZF9pbm9kZSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKKwlyZXQgPSBfX3RyYWNlZnNfcmVtb3ZlKGRlbnRyeSwgcGFyZW50KTsKKwltdXRleF91bmxvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CisJaWYgKCFyZXQpCisJCXNpbXBsZV9yZWxlYXNlX2ZzKCZ0cmFjZWZzX21vdW50LCAmdHJhY2Vmc19tb3VudF9jb3VudCk7Cit9CisKKy8qKgorICogdHJhY2Vmc19yZW1vdmVfcmVjdXJzaXZlIC0gcmVjdXJzaXZlbHkgcmVtb3ZlcyBhIGRpcmVjdG9yeQorICogQGRlbnRyeTogYSBwb2ludGVyIHRvIGEgdGhlIGRlbnRyeSBvZiB0aGUgZGlyZWN0b3J5IHRvIGJlIHJlbW92ZWQuCisgKgorICogVGhpcyBmdW5jdGlvbiByZWN1cnNpdmVseSByZW1vdmVzIGEgZGlyZWN0b3J5IHRyZWUgaW4gdHJhY2VmcyB0aGF0CisgKiB3YXMgcHJldmlvdXNseSBjcmVhdGVkIHdpdGggYSBjYWxsIHRvIGFub3RoZXIgdHJhY2VmcyBmdW5jdGlvbgorICogKGxpa2UgdHJhY2Vmc19jcmVhdGVfZmlsZSgpIG9yIHZhcmlhbnRzIHRoZXJlb2YuKQorICovCit2b2lkIHRyYWNlZnNfcmVtb3ZlX3JlY3Vyc2l2ZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJc3RydWN0IGRlbnRyeSAqY2hpbGQsICpwYXJlbnQ7CisKKwlpZiAoSVNfRVJSX09SX05VTEwoZGVudHJ5KSkKKwkJcmV0dXJuOworCisJcGFyZW50ID0gZGVudHJ5LT5kX3BhcmVudDsKKwlpZiAoIXBhcmVudCB8fCAhcGFyZW50LT5kX2lub2RlKQorCQlyZXR1cm47CisKKwlwYXJlbnQgPSBkZW50cnk7CisgZG93bjoKKwltdXRleF9sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOworIGxvb3A6CisJLyoKKwkgKiBUaGUgcGFyZW50LT5kX3N1YmRpcnMgaXMgcHJvdGVjdGVkIGJ5IHRoZSBkX2xvY2suIE91dHNpZGUgdGhhdAorCSAqIGxvY2ssIHRoZSBjaGlsZCBjYW4gYmUgdW5saW5rZWQgYW5kIHNldCB0byBiZSBmcmVlZCB3aGljaCBjYW4KKwkgKiB1c2UgdGhlIGRfdS5kX2NoaWxkIGFzIHRoZSByY3UgaGVhZCBhbmQgY29ycnVwdCB0aGlzIGxpc3QuCisJICovCisJc3Bpbl9sb2NrKCZwYXJlbnQtPmRfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJnBhcmVudC0+ZF9zdWJkaXJzLCBkX2NoaWxkKSB7CisJCWlmICghdHJhY2Vmc19wb3NpdGl2ZShjaGlsZCkpCisJCQljb250aW51ZTsKKworCQkvKiBwZXJoYXBzIHNpbXBsZV9lbXB0eShjaGlsZCkgbWFrZXMgbW9yZSBzZW5zZSAqLworCQlpZiAoIWxpc3RfZW1wdHkoJmNoaWxkLT5kX3N1YmRpcnMpKSB7CisJCQlzcGluX3VubG9jaygmcGFyZW50LT5kX2xvY2spOworCQkJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOworCQkJcGFyZW50ID0gY2hpbGQ7CisJCQlnb3RvIGRvd247CisJCX0KKworCQlzcGluX3VubG9jaygmcGFyZW50LT5kX2xvY2spOworCisJCWlmICghX190cmFjZWZzX3JlbW92ZShjaGlsZCwgcGFyZW50KSkKKwkJCXNpbXBsZV9yZWxlYXNlX2ZzKCZ0cmFjZWZzX21vdW50LCAmdHJhY2Vmc19tb3VudF9jb3VudCk7CisKKwkJLyoKKwkJICogVGhlIHBhcmVudC0+ZF9sb2NrIHByb3RlY3RzIGFnYWlzdCBjaGlsZCBmcm9tIHVubGlua2luZworCQkgKiBmcm9tIGRfc3ViZGlycy4gV2hlbiByZWxlYXNpbmcgdGhlIHBhcmVudC0+ZF9sb2NrIHdlIGNhbgorCQkgKiBubyBsb25nZXIgdHJ1c3QgdGhhdCB0aGUgbmV4dCBwb2ludGVyIGlzIHZhbGlkLgorCQkgKiBSZXN0YXJ0IHRoZSBsb29wLiBXZSdsbCBza2lwIHRoaXMgb25lIHdpdGggdGhlCisJCSAqIHRyYWNlZnNfcG9zaXRpdmUoKSBjaGVjay4KKwkJICovCisJCWdvdG8gbG9vcDsKKwl9CisJc3Bpbl91bmxvY2soJnBhcmVudC0+ZF9sb2NrKTsKKworCW11dGV4X3VubG9jaygmcGFyZW50LT5kX2lub2RlLT5pX211dGV4KTsKKwljaGlsZCA9IHBhcmVudDsKKwlwYXJlbnQgPSBwYXJlbnQtPmRfcGFyZW50OworCW11dGV4X2xvY2soJnBhcmVudC0+ZF9pbm9kZS0+aV9tdXRleCk7CisKKwlpZiAoY2hpbGQgIT0gZGVudHJ5KQorCQkvKiBnbyB1cCAqLworCQlnb3RvIGxvb3A7CisKKwlpZiAoIV9fdHJhY2Vmc19yZW1vdmUoY2hpbGQsIHBhcmVudCkpCisJCXNpbXBsZV9yZWxlYXNlX2ZzKCZ0cmFjZWZzX21vdW50LCAmdHJhY2Vmc19tb3VudF9jb3VudCk7CisJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmRfaW5vZGUtPmlfbXV0ZXgpOworfQorCisvKioKKyAqIHRyYWNlZnNfaW5pdGlhbGl6ZWQgLSBUZWxscyB3aGV0aGVyIHRyYWNlZnMgaGFzIGJlZW4gcmVnaXN0ZXJlZAorICovCitib29sIHRyYWNlZnNfaW5pdGlhbGl6ZWQodm9pZCkKK3sKKwlyZXR1cm4gdHJhY2Vmc19yZWdpc3RlcmVkOworfQorCitzdGF0aWMgc3RydWN0IGtvYmplY3QgKnRyYWNlX2tvYmo7CisKK3N0YXRpYyBpbnQgX19pbml0IHRyYWNlZnNfaW5pdCh2b2lkKQoreworCWludCByZXR2YWw7CisKKwl0cmFjZV9rb2JqID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgidHJhY2luZyIsIGtlcm5lbF9rb2JqKTsKKwlpZiAoIXRyYWNlX2tvYmopCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dmFsID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdHJhY2VfZnNfdHlwZSk7CisJaWYgKCFyZXR2YWwpCisJCXRyYWNlZnNfcmVnaXN0ZXJlZCA9IHRydWU7CisKKwlyZXR1cm4gcmV0dmFsOworfQorY29yZV9pbml0Y2FsbCh0cmFjZWZzX2luaXQpOwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvYnVkZ2V0LmMgYi9mcy91Ymlmcy9idWRnZXQuYwppbmRleCBlYjk5N2U5Li4xMWExMWIzIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9idWRnZXQuYworKysgYi9mcy91Ymlmcy9idWRnZXQuYwpAQCAtNTA5LDcgKzUwOSw3IEBACiAJCQljLT5iaS5ub3NwYWNlX3JwID0gMTsKIAkJc21wX3dtYigpOwogCX0gZWxzZQotCQl1Ymlmc19lcnIoImNhbm5vdCBidWRnZXQgc3BhY2UsIGVycm9yICVkIiwgZXJyKTsKKwkJdWJpZnNfZXJyKGMsICJjYW5ub3QgYnVkZ2V0IHNwYWNlLCBlcnJvciAlZCIsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvY29tbWl0LmMgYi9mcy91Ymlmcy9jb21taXQuYwppbmRleCAyNmI2OWIyLi42M2Y1NjYxIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9jb21taXQuYworKysgYi9mcy91Ymlmcy9jb21taXQuYwpAQCAtMjI1LDcgKzIyNSw3IEBACiBvdXRfdXA6CiAJdXBfd3JpdGUoJmMtPmNvbW1pdF9zZW0pOwogb3V0OgotCXViaWZzX2VycigiY29tbWl0IGZhaWxlZCwgZXJyb3IgJWQiLCBlcnIpOworCXViaWZzX2VycihjLCAiY29tbWl0IGZhaWxlZCwgZXJyb3IgJWQiLCBlcnIpOwogCXNwaW5fbG9jaygmYy0+Y3NfbG9jayk7CiAJYy0+Y210X3N0YXRlID0gQ09NTUlUX0JST0tFTjsKIAl3YWtlX3VwKCZjLT5jbXRfd3EpOwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJaW50IGVycjsKIAlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IGluZm87CiAKLQl1Ymlmc19tc2coImJhY2tncm91bmQgdGhyZWFkIFwiJXNcIiBzdGFydGVkLCBQSUQgJWQiLAorCXViaWZzX21zZyhjLCAiYmFja2dyb3VuZCB0aHJlYWQgXCIlc1wiIHN0YXJ0ZWQsIFBJRCAlZCIsCiAJCSAgYy0+Ymd0X25hbWUsIGN1cnJlbnQtPnBpZCk7CiAJc2V0X2ZyZWV6YWJsZSgpOwogCkBAIC0zMjQsNyArMzI0LDcgQEAKIAkJY29uZF9yZXNjaGVkKCk7CiAJfQogCi0JdWJpZnNfbXNnKCJiYWNrZ3JvdW5kIHRocmVhZCBcIiVzXCIgc3RvcHMiLCBjLT5iZ3RfbmFtZSk7CisJdWJpZnNfbXNnKGMsICJiYWNrZ3JvdW5kIHRocmVhZCBcIiVzXCIgc3RvcHMiLCBjLT5iZ3RfbmFtZSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTcxMiwxMyArNzEyLDEzIEBACiAJcmV0dXJuIDA7CiAKIG91dF9kdW1wOgotCXViaWZzX2VycigiZHVtcGluZyBpbmRleCBub2RlIChpaXA9JWQpIiwgaS0+aWlwKTsKKwl1Ymlmc19lcnIoYywgImR1bXBpbmcgaW5kZXggbm9kZSAoaWlwPSVkKSIsIGktPmlpcCk7CiAJdWJpZnNfZHVtcF9ub2RlKGMsIGlkeCk7CiAJbGlzdF9kZWwoJmktPmxpc3QpOwogCWtmcmVlKGkpOwogCWlmICghbGlzdF9lbXB0eSgmbGlzdCkpIHsKIAkJaSA9IGxpc3RfZW50cnkobGlzdC5wcmV2LCBzdHJ1Y3QgaWR4X25vZGUsIGxpc3QpOwotCQl1Ymlmc19lcnIoImR1bXBpbmcgcGFyZW50IGluZGV4IG5vZGUiKTsKKwkJdWJpZnNfZXJyKGMsICJkdW1waW5nIHBhcmVudCBpbmRleCBub2RlIik7CiAJCXViaWZzX2R1bXBfbm9kZShjLCAmaS0+aWR4KTsKIAl9CiBvdXRfZnJlZToKQEAgLTcyNyw3ICs3MjcsNyBAQAogCQlsaXN0X2RlbCgmaS0+bGlzdCk7CiAJCWtmcmVlKGkpOwogCX0KLQl1Ymlmc19lcnIoImZhaWxlZCwgZXJyb3IgJWQiLCBlcnIpOworCXViaWZzX2VycihjLCAiZmFpbGVkLCBlcnJvciAlZCIsIGVycik7CiAJaWYgKGVyciA+IDApCiAJCWVyciA9IC1FSU5WQUw7CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2NvbXByZXNzLmMgYi9mcy91Ymlmcy9jb21wcmVzcy5jCmluZGV4IDJiZmEwOTUuLjU2NWNiNTYgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2NvbXByZXNzLmMKKysrIGIvZnMvdWJpZnMvY29tcHJlc3MuYwpAQCAtOTIsOCArOTIsOCBAQAogICogTm90ZSwgaWYgdGhlIGlucHV0IGJ1ZmZlciB3YXMgbm90IGNvbXByZXNzZWQsIGl0IGlzIGNvcGllZCB0byB0aGUgb3V0cHV0CiAgKiBidWZmZXIgYW5kICVVQklGU19DT01QUl9OT05FIGlzIHJldHVybmVkIGluIEBjb21wcl90eXBlLgogICovCi12b2lkIHViaWZzX2NvbXByZXNzKGNvbnN0IHZvaWQgKmluX2J1ZiwgaW50IGluX2xlbiwgdm9pZCAqb3V0X2J1ZiwgaW50ICpvdXRfbGVuLAotCQkgICAgaW50ICpjb21wcl90eXBlKQordm9pZCB1Ymlmc19jb21wcmVzcyhjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgY29uc3Qgdm9pZCAqaW5fYnVmLAorCQkgICAgaW50IGluX2xlbiwgdm9pZCAqb3V0X2J1ZiwgaW50ICpvdXRfbGVuLCBpbnQgKmNvbXByX3R5cGUpCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgdWJpZnNfY29tcHJlc3NvciAqY29tcHIgPSB1Ymlmc19jb21wcmVzc29yc1sqY29tcHJfdHlwZV07CkBAIC0xMTIsOSArMTEyLDkgQEAKIAlpZiAoY29tcHItPmNvbXBfbXV0ZXgpCiAJCW11dGV4X3VubG9jayhjb21wci0+Y29tcF9tdXRleCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJdWJpZnNfd2FybigiY2Fubm90IGNvbXByZXNzICVkIGJ5dGVzLCBjb21wcmVzc29yICVzLCBlcnJvciAlZCwgbGVhdmUgZGF0YSB1bmNvbXByZXNzZWQiLAorCQl1Ymlmc193YXJuKGMsICJjYW5ub3QgY29tcHJlc3MgJWQgYnl0ZXMsIGNvbXByZXNzb3IgJXMsIGVycm9yICVkLCBsZWF2ZSBkYXRhIHVuY29tcHJlc3NlZCIsCiAJCQkgICBpbl9sZW4sIGNvbXByLT5uYW1lLCBlcnIpOwotCQkgZ290byBub19jb21wcjsKKwkJZ290byBub19jb21wcjsKIAl9CiAKIAkvKgpAQCAtMTQ0LDIxICsxNDQsMjEgQEAKICAqIFRoZSBsZW5ndGggb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIGlzIHJldHVybmVkIGluIEBvdXRfbGVuLiBUaGlzIGZ1bmN0aW9ucwogICogcmV0dXJucyAlMCBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCi1pbnQgdWJpZnNfZGVjb21wcmVzcyhjb25zdCB2b2lkICppbl9idWYsIGludCBpbl9sZW4sIHZvaWQgKm91dF9idWYsCi0JCSAgICAgaW50ICpvdXRfbGVuLCBpbnQgY29tcHJfdHlwZSkKK2ludCB1Ymlmc19kZWNvbXByZXNzKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCB2b2lkICppbl9idWYsCisJCSAgICAgaW50IGluX2xlbiwgdm9pZCAqb3V0X2J1ZiwgaW50ICpvdXRfbGVuLCBpbnQgY29tcHJfdHlwZSkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCB1Ymlmc19jb21wcmVzc29yICpjb21wcjsKIAogCWlmICh1bmxpa2VseShjb21wcl90eXBlIDwgMCB8fCBjb21wcl90eXBlID49IFVCSUZTX0NPTVBSX1RZUEVTX0NOVCkpIHsKLQkJdWJpZnNfZXJyKCJpbnZhbGlkIGNvbXByZXNzaW9uIHR5cGUgJWQiLCBjb21wcl90eXBlKTsKKwkJdWJpZnNfZXJyKGMsICJpbnZhbGlkIGNvbXByZXNzaW9uIHR5cGUgJWQiLCBjb21wcl90eXBlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJY29tcHIgPSB1Ymlmc19jb21wcmVzc29yc1tjb21wcl90eXBlXTsKIAogCWlmICh1bmxpa2VseSghY29tcHItPmNhcGlfbmFtZSkpIHsKLQkJdWJpZnNfZXJyKCIlcyBjb21wcmVzc2lvbiBpcyBub3QgY29tcGlsZWQgaW4iLCBjb21wci0+bmFtZSk7CisJCXViaWZzX2VycihjLCAiJXMgY29tcHJlc3Npb24gaXMgbm90IGNvbXBpbGVkIGluIiwgY29tcHItPm5hbWUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3NSw3ICsxNzUsNyBAQAogCWlmIChjb21wci0+ZGVjb21wX211dGV4KQogCQltdXRleF91bmxvY2soY29tcHItPmRlY29tcF9tdXRleCk7CiAJaWYgKGVycikKLQkJdWJpZnNfZXJyKCJjYW5ub3QgZGVjb21wcmVzcyAlZCBieXRlcywgY29tcHJlc3NvciAlcywgZXJyb3IgJWQiLAorCQl1Ymlmc19lcnIoYywgImNhbm5vdCBkZWNvbXByZXNzICVkIGJ5dGVzLCBjb21wcmVzc29yICVzLCBlcnJvciAlZCIsCiAJCQkgIGluX2xlbiwgY29tcHItPm5hbWUsIGVycik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTkzLDggKzE5Myw4IEBACiAJaWYgKGNvbXByLT5jYXBpX25hbWUpIHsKIAkJY29tcHItPmNjID0gY3J5cHRvX2FsbG9jX2NvbXAoY29tcHItPmNhcGlfbmFtZSwgMCwgMCk7CiAJCWlmIChJU19FUlIoY29tcHItPmNjKSkgewotCQkJdWJpZnNfZXJyKCJjYW5ub3QgaW5pdGlhbGl6ZSBjb21wcmVzc29yICVzLCBlcnJvciAlbGQiLAotCQkJCSAgY29tcHItPm5hbWUsIFBUUl9FUlIoY29tcHItPmNjKSk7CisJCQlwcl9lcnIoIlVCSUZTIGVycm9yIChwaWQgJWQpOiBjYW5ub3QgaW5pdGlhbGl6ZSBjb21wcmVzc29yICVzLCBlcnJvciAlbGQiLAorCQkJICAgICAgIGN1cnJlbnQtPnBpZCwgY29tcHItPm5hbWUsIFBUUl9FUlIoY29tcHItPmNjKSk7CiAJCQlyZXR1cm4gUFRSX0VSUihjb21wci0+Y2MpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvZGVidWcuYyBiL2ZzL3ViaWZzL2RlYnVnLmMKaW5kZXggNGNmYjNlOC4uNGM0NmE5OCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvZGVidWcuYworKysgYi9mcy91Ymlmcy9kZWJ1Zy5jCkBAIC03NDYsNyArNzQ2LDcgQEAKIAlmb3IgKGxudW0gPSBjLT5tYWluX2ZpcnN0OyBsbnVtIDwgYy0+bGViX2NudDsgbG51bSsrKSB7CiAJCWVyciA9IHViaWZzX3JlYWRfb25lX2xwKGMsIGxudW0sICZscCk7CiAJCWlmIChlcnIpIHsKLQkJCXViaWZzX2VycigiY2Fubm90IHJlYWQgbHByb3BzIGZvciBMRUIgJWQiLCBsbnVtKTsKKwkJCXViaWZzX2VycihjLCAiY2Fubm90IHJlYWQgbHByb3BzIGZvciBMRUIgJWQiLCBsbnVtKTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTgxOSwxMyArODE5LDEzIEBACiAKIAlidWYgPSBfX3ZtYWxsb2MoYy0+bGViX3NpemUsIEdGUF9OT0ZTLCBQQUdFX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKLQkJdWJpZnNfZXJyKCJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBkdW1waW5nIExFQiAlZCIsIGxudW0pOworCQl1Ymlmc19lcnIoYywgImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGR1bXBpbmcgTEVCICVkIiwgbG51bSk7CiAJCXJldHVybjsKIAl9CiAKIAlzbGViID0gdWJpZnNfc2NhbihjLCBsbnVtLCAwLCBidWYsIDApOwogCWlmIChJU19FUlIoc2xlYikpIHsKLQkJdWJpZnNfZXJyKCJzY2FuIGVycm9yICVkIiwgKGludClQVFJfRVJSKHNsZWIpKTsKKwkJdWJpZnNfZXJyKGMsICJzY2FuIGVycm9yICVkIiwgKGludClQVFJfRVJSKHNsZWIpKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xMDMyLDcgKzEwMzIsNyBAQAogCXNwaW5fdW5sb2NrKCZjLT5zcGFjZV9sb2NrKTsKIAogCWlmIChmcmVlICE9IGQtPnNhdmVkX2ZyZWUpIHsKLQkJdWJpZnNfZXJyKCJmcmVlIHNwYWNlIGNoYW5nZWQgZnJvbSAlbGxkIHRvICVsbGQiLAorCQl1Ymlmc19lcnIoYywgImZyZWUgc3BhY2UgY2hhbmdlZCBmcm9tICVsbGQgdG8gJWxsZCIsCiAJCQkgIGQtPnNhdmVkX2ZyZWUsIGZyZWUpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMDQwLDE1ICsxMDQwLDE1IEBACiAJcmV0dXJuIDA7CiAKIG91dDoKLQl1Ymlmc19tc2coInNhdmVkIGxwcm9wcyBzdGF0aXN0aWNzIGR1bXAiKTsKKwl1Ymlmc19tc2coYywgInNhdmVkIGxwcm9wcyBzdGF0aXN0aWNzIGR1bXAiKTsKIAl1Ymlmc19kdW1wX2xzdGF0cygmZC0+c2F2ZWRfbHN0KTsKLQl1Ymlmc19tc2coInNhdmVkIGJ1ZGdldGluZyBpbmZvIGR1bXAiKTsKKwl1Ymlmc19tc2coYywgInNhdmVkIGJ1ZGdldGluZyBpbmZvIGR1bXAiKTsKIAl1Ymlmc19kdW1wX2J1ZGcoYywgJmQtPnNhdmVkX2JpKTsKLQl1Ymlmc19tc2coInNhdmVkIGlkeF9nY19jbnQgJWQiLCBkLT5zYXZlZF9pZHhfZ2NfY250KTsKLQl1Ymlmc19tc2coImN1cnJlbnQgbHByb3BzIHN0YXRpc3RpY3MgZHVtcCIpOworCXViaWZzX21zZyhjLCAic2F2ZWQgaWR4X2djX2NudCAlZCIsIGQtPnNhdmVkX2lkeF9nY19jbnQpOworCXViaWZzX21zZyhjLCAiY3VycmVudCBscHJvcHMgc3RhdGlzdGljcyBkdW1wIik7CiAJdWJpZnNfZ2V0X2xwX3N0YXRzKGMsICZsc3QpOwogCXViaWZzX2R1bXBfbHN0YXRzKCZsc3QpOwotCXViaWZzX21zZygiY3VycmVudCBidWRnZXRpbmcgaW5mbyBkdW1wIik7CisJdWJpZnNfbXNnKGMsICJjdXJyZW50IGJ1ZGdldGluZyBpbmZvIGR1bXAiKTsKIAl1Ymlmc19kdW1wX2J1ZGcoYywgJmMtPmJpKTsKIAlkdW1wX3N0YWNrKCk7CiAJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDc3LDkgKzEwNzcsOSBAQAogCW11dGV4X2xvY2soJnVpLT51aV9tdXRleCk7CiAJc3Bpbl9sb2NrKCZ1aS0+dWlfbG9jayk7CiAJaWYgKHVpLT51aV9zaXplICE9IHVpLT5zeW5jZWRfaV9zaXplICYmICF1aS0+ZGlydHkpIHsKLQkJdWJpZnNfZXJyKCJ1aV9zaXplIGlzICVsbGQsIHN5bmNlZF9pX3NpemUgaXMgJWxsZCwgYnV0IGlub2RlIGlzIGNsZWFuIiwKKwkJdWJpZnNfZXJyKGMsICJ1aV9zaXplIGlzICVsbGQsIHN5bmNlZF9pX3NpemUgaXMgJWxsZCwgYnV0IGlub2RlIGlzIGNsZWFuIiwKIAkJCSAgdWktPnVpX3NpemUsIHVpLT5zeW5jZWRfaV9zaXplKTsKLQkJdWJpZnNfZXJyKCJpX2lubyAlbHUsIGlfbW9kZSAlI3gsIGlfc2l6ZSAlbGxkIiwgaW5vZGUtPmlfaW5vLAorCQl1Ymlmc19lcnIoYywgImlfaW5vICVsdSwgaV9tb2RlICUjeCwgaV9zaXplICVsbGQiLCBpbm9kZS0+aV9pbm8sCiAJCQkgIGlub2RlLT5pX21vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSk7CiAJCWR1bXBfc3RhY2soKTsKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTExNDAsNyArMTE0MCw3IEBACiAJa2ZyZWUocGRlbnQpOwogCiAJaWYgKGlfc2l6ZV9yZWFkKGRpcikgIT0gc2l6ZSkgewotCQl1Ymlmc19lcnIoImRpcmVjdG9yeSBpbm9kZSAlbHUgaGFzIHNpemUgJWxsdSwgYnV0IGNhbGN1bGF0ZWQgc2l6ZSBpcyAlbGx1IiwKKwkJdWJpZnNfZXJyKGMsICJkaXJlY3RvcnkgaW5vZGUgJWx1IGhhcyBzaXplICVsbHUsIGJ1dCBjYWxjdWxhdGVkIHNpemUgaXMgJWxsdSIsCiAJCQkgIGRpci0+aV9pbm8sICh1bnNpZ25lZCBsb25nIGxvbmcpaV9zaXplX3JlYWQoZGlyKSwKIAkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaXplKTsKIAkJdWJpZnNfZHVtcF9pbm9kZShjLCBkaXIpOwpAQCAtMTE0OCw3ICsxMTQ4LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChkaXItPmlfbmxpbmsgIT0gbmxpbmspIHsKLQkJdWJpZnNfZXJyKCJkaXJlY3RvcnkgaW5vZGUgJWx1IGhhcyBubGluayAldSwgYnV0IGNhbGN1bGF0ZWQgbmxpbmsgaXMgJXUiLAorCQl1Ymlmc19lcnIoYywgImRpcmVjdG9yeSBpbm9kZSAlbHUgaGFzIG5saW5rICV1LCBidXQgY2FsY3VsYXRlZCBubGluayBpcyAldSIsCiAJCQkgIGRpci0+aV9pbm8sIGRpci0+aV9ubGluaywgbmxpbmspOwogCQl1Ymlmc19kdW1wX2lub2RlKGMsIGRpcik7CiAJCWR1bXBfc3RhY2soKTsKQEAgLTEyMDcsMTAgKzEyMDcsMTAgQEAKIAllcnIgPSAxOwogCWtleV9yZWFkKGMsICZkZW50MS0+a2V5LCAma2V5KTsKIAlpZiAoa2V5c19jbXAoYywgJnpicjEtPmtleSwgJmtleSkpIHsKLQkJdWJpZnNfZXJyKCIxc3QgZW50cnkgYXQgJWQ6JWQgaGFzIGtleSAlcyIsIHpicjEtPmxudW0sCisJCXViaWZzX2VycihjLCAiMXN0IGVudHJ5IGF0ICVkOiVkIGhhcyBrZXkgJXMiLCB6YnIxLT5sbnVtLAogCQkJICB6YnIxLT5vZmZzLCBkYmdfc25wcmludGZfa2V5KGMsICZrZXksIGtleV9idWYsCiAJCQkJCQkgICAgICAgREJHX0tFWV9CVUZfTEVOKSk7Ci0JCXViaWZzX2VycigiYnV0IGl0IHNob3VsZCBoYXZlIGtleSAlcyBhY2NvcmRpbmcgdG8gdG5jIiwKKwkJdWJpZnNfZXJyKGMsICJidXQgaXQgc2hvdWxkIGhhdmUga2V5ICVzIGFjY29yZGluZyB0byB0bmMiLAogCQkJICBkYmdfc25wcmludGZfa2V5KGMsICZ6YnIxLT5rZXksIGtleV9idWYsCiAJCQkJCSAgIERCR19LRVlfQlVGX0xFTikpOwogCQl1Ymlmc19kdW1wX25vZGUoYywgZGVudDEpOwpAQCAtMTIxOSwxMCArMTIxOSwxMCBAQAogCiAJa2V5X3JlYWQoYywgJmRlbnQyLT5rZXksICZrZXkpOwogCWlmIChrZXlzX2NtcChjLCAmemJyMi0+a2V5LCAma2V5KSkgewotCQl1Ymlmc19lcnIoIjJuZCBlbnRyeSBhdCAlZDolZCBoYXMga2V5ICVzIiwgemJyMS0+bG51bSwKKwkJdWJpZnNfZXJyKGMsICIybmQgZW50cnkgYXQgJWQ6JWQgaGFzIGtleSAlcyIsIHpicjEtPmxudW0sCiAJCQkgIHpicjEtPm9mZnMsIGRiZ19zbnByaW50Zl9rZXkoYywgJmtleSwga2V5X2J1ZiwKIAkJCQkJCSAgICAgICBEQkdfS0VZX0JVRl9MRU4pKTsKLQkJdWJpZnNfZXJyKCJidXQgaXQgc2hvdWxkIGhhdmUga2V5ICVzIGFjY29yZGluZyB0byB0bmMiLAorCQl1Ymlmc19lcnIoYywgImJ1dCBpdCBzaG91bGQgaGF2ZSBrZXkgJXMgYWNjb3JkaW5nIHRvIHRuYyIsCiAJCQkgIGRiZ19zbnByaW50Zl9rZXkoYywgJnpicjItPmtleSwga2V5X2J1ZiwKIAkJCQkJICAgREJHX0tFWV9CVUZfTEVOKSk7CiAJCXViaWZzX2R1bXBfbm9kZShjLCBkZW50Mik7CkBAIC0xMjM4LDE0ICsxMjM4LDE0IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCWlmIChjbXAgPT0gMCAmJiBubGVuMSA9PSBubGVuMikKLQkJdWJpZnNfZXJyKCIyIHhlbnQvZGVudCBub2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUiKTsKKwkJdWJpZnNfZXJyKGMsICIyIHhlbnQvZGVudCBub2RlcyB3aXRoIHRoZSBzYW1lIG5hbWUiKTsKIAllbHNlCi0JCXViaWZzX2VycigiYmFkIG9yZGVyIG9mIGNvbGxpZGluZyBrZXkgJXMiLAorCQl1Ymlmc19lcnIoYywgImJhZCBvcmRlciBvZiBjb2xsaWRpbmcga2V5ICVzIiwKIAkJCSAgZGJnX3NucHJpbnRmX2tleShjLCAma2V5LCBrZXlfYnVmLCBEQkdfS0VZX0JVRl9MRU4pKTsKIAotCXViaWZzX21zZygiZmlyc3Qgbm9kZSBhdCAlZDolZFxuIiwgemJyMS0+bG51bSwgemJyMS0+b2Zmcyk7CisJdWJpZnNfbXNnKGMsICJmaXJzdCBub2RlIGF0ICVkOiVkXG4iLCB6YnIxLT5sbnVtLCB6YnIxLT5vZmZzKTsKIAl1Ymlmc19kdW1wX25vZGUoYywgZGVudDEpOwotCXViaWZzX21zZygic2Vjb25kIG5vZGUgYXQgJWQ6JWRcbiIsIHpicjItPmxudW0sIHpicjItPm9mZnMpOworCXViaWZzX21zZyhjLCAic2Vjb25kIG5vZGUgYXQgJWQ6JWRcbiIsIHpicjItPmxudW0sIHpicjItPm9mZnMpOwogCXViaWZzX2R1bXBfbm9kZShjLCBkZW50Mik7CiAKIG91dF9mcmVlOgpAQCAtMTQ0NywxMSArMTQ0NywxMSBAQAogCXJldHVybiAwOwogCiBvdXQ6Ci0JdWJpZnNfZXJyKCJmYWlsZWQsIGVycm9yICVkIiwgZXJyKTsKLQl1Ymlmc19tc2coImR1bXAgb2YgdGhlIHpub2RlIik7CisJdWJpZnNfZXJyKGMsICJmYWlsZWQsIGVycm9yICVkIiwgZXJyKTsKKwl1Ymlmc19tc2coYywgImR1bXAgb2YgdGhlIHpub2RlIik7CiAJdWJpZnNfZHVtcF96bm9kZShjLCB6bm9kZSk7CiAJaWYgKHpwKSB7Ci0JCXViaWZzX21zZygiZHVtcCBvZiB0aGUgcGFyZW50IHpub2RlIik7CisJCXViaWZzX21zZyhjLCAiZHVtcCBvZiB0aGUgcGFyZW50IHpub2RlIik7CiAJCXViaWZzX2R1bXBfem5vZGUoYywgenApOwogCX0KIAlkdW1wX3N0YWNrKCk7CkBAIC0xNTE4LDkgKzE1MTgsOSBAQAogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJCWlmIChlcnIpIHsKLQkJCQl1Ymlmc19tc2coImZpcnN0IHpub2RlIik7CisJCQkJdWJpZnNfbXNnKGMsICJmaXJzdCB6bm9kZSIpOwogCQkJCXViaWZzX2R1bXBfem5vZGUoYywgcHJldik7Ci0JCQkJdWJpZnNfbXNnKCJzZWNvbmQgem5vZGUiKTsKKwkJCQl1Ymlmc19tc2coYywgInNlY29uZCB6bm9kZSIpOwogCQkJCXViaWZzX2R1bXBfem5vZGUoYywgem5vZGUpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQpAQCAtMTUyOSwxMyArMTUyOSwxMyBAQAogCiAJaWYgKGV4dHJhKSB7CiAJCWlmIChjbGVhbl9jbnQgIT0gYXRvbWljX2xvbmdfcmVhZCgmYy0+Y2xlYW5fem5fY250KSkgewotCQkJdWJpZnNfZXJyKCJpbmNvcnJlY3QgY2xlYW5fem5fY250ICVsZCwgY2FsY3VsYXRlZCAlbGQiLAorCQkJdWJpZnNfZXJyKGMsICJpbmNvcnJlY3QgY2xlYW5fem5fY250ICVsZCwgY2FsY3VsYXRlZCAlbGQiLAogCQkJCSAgYXRvbWljX2xvbmdfcmVhZCgmYy0+Y2xlYW5fem5fY250KSwKIAkJCQkgIGNsZWFuX2NudCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAoZGlydHlfY250ICE9IGF0b21pY19sb25nX3JlYWQoJmMtPmRpcnR5X3puX2NudCkpIHsKLQkJCXViaWZzX2VycigiaW5jb3JyZWN0IGRpcnR5X3puX2NudCAlbGQsIGNhbGN1bGF0ZWQgJWxkIiwKKwkJCXViaWZzX2VycihjLCAiaW5jb3JyZWN0IGRpcnR5X3puX2NudCAlbGQsIGNhbGN1bGF0ZWQgJWxkIiwKIAkJCQkgIGF0b21pY19sb25nX3JlYWQoJmMtPmRpcnR5X3puX2NudCksCiAJCQkJICBkaXJ0eV9jbnQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjA4LDcgKzE2MDgsNyBAQAogCQlpZiAoem5vZGVfY2IpIHsKIAkJCWVyciA9IHpub2RlX2NiKGMsIHpub2RlLCBwcml2KTsKIAkJCWlmIChlcnIpIHsKLQkJCQl1Ymlmc19lcnIoInpub2RlIGNoZWNraW5nIGZ1bmN0aW9uIHJldHVybmVkIGVycm9yICVkIiwKKwkJCQl1Ymlmc19lcnIoYywgInpub2RlIGNoZWNraW5nIGZ1bmN0aW9uIHJldHVybmVkIGVycm9yICVkIiwKIAkJCQkJICBlcnIpOwogCQkJCXViaWZzX2R1bXBfem5vZGUoYywgem5vZGUpOwogCQkJCWdvdG8gb3V0X2R1bXA7CkBAIC0xNjE5LDcgKzE2MTksNyBAQAogCQkJCXpiciA9ICZ6bm9kZS0+emJyYW5jaFtpZHhdOwogCQkJCWVyciA9IGxlYWZfY2IoYywgemJyLCBwcml2KTsKIAkJCQlpZiAoZXJyKSB7Ci0JCQkJCXViaWZzX2VycigibGVhZiBjaGVja2luZyBmdW5jdGlvbiByZXR1cm5lZCBlcnJvciAlZCwgZm9yIGxlYWYgYXQgTEVCICVkOiVkIiwKKwkJCQkJdWJpZnNfZXJyKGMsICJsZWFmIGNoZWNraW5nIGZ1bmN0aW9uIHJldHVybmVkIGVycm9yICVkLCBmb3IgbGVhZiBhdCBMRUIgJWQ6JWQiLAogCQkJCQkJICBlcnIsIHpici0+bG51bSwgemJyLT5vZmZzKTsKIAkJCQkJZ290byBvdXRfZHVtcDsKIAkJCQl9CkBAIC0xNjc1LDcgKzE2NzUsNyBAQAogCQl6YnIgPSAmem5vZGUtPnBhcmVudC0+emJyYW5jaFt6bm9kZS0+aWlwXTsKIAllbHNlCiAJCXpiciA9ICZjLT56cm9vdDsKLQl1Ymlmc19tc2coImR1bXAgb2Ygem5vZGUgYXQgTEVCICVkOiVkIiwgemJyLT5sbnVtLCB6YnItPm9mZnMpOworCXViaWZzX21zZyhjLCAiZHVtcCBvZiB6bm9kZSBhdCBMRUIgJWQ6JWQiLCB6YnItPmxudW0sIHpici0+b2Zmcyk7CiAJdWJpZnNfZHVtcF96bm9kZShjLCB6bm9kZSk7CiBvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmYy0+dG5jX211dGV4KTsKQEAgLTE3MjIsMTIgKzE3MjIsMTIgQEAKIAogCWVyciA9IGRiZ193YWxrX2luZGV4KGMsIE5VTEwsIGFkZF9zaXplLCAmY2FsYyk7CiAJaWYgKGVycikgewotCQl1Ymlmc19lcnIoImVycm9yICVkIHdoaWxlIHdhbGtpbmcgdGhlIGluZGV4IiwgZXJyKTsKKwkJdWJpZnNfZXJyKGMsICJlcnJvciAlZCB3aGlsZSB3YWxraW5nIHRoZSBpbmRleCIsIGVycik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKGNhbGMgIT0gaWR4X3NpemUpIHsKLQkJdWJpZnNfZXJyKCJpbmRleCBzaXplIGNoZWNrIGZhaWxlZDogY2FsY3VsYXRlZCBzaXplIGlzICVsbGQsIHNob3VsZCBiZSAlbGxkIiwKKwkJdWJpZnNfZXJyKGMsICJpbmRleCBzaXplIGNoZWNrIGZhaWxlZDogY2FsY3VsYXRlZCBzaXplIGlzICVsbGQsIHNob3VsZCBiZSAlbGxkIiwKIAkJCSAgY2FsYywgaWR4X3NpemUpOwogCQlkdW1wX3N0YWNrKCk7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTgxNCw3ICsxODE0LDcgQEAKIAl9CiAKIAlpZiAoaW51bSA+IGMtPmhpZ2hlc3RfaW51bSkgewotCQl1Ymlmc19lcnIoInRvbyBoaWdoIGlub2RlIG51bWJlciwgbWF4LiBpcyAlbHUiLAorCQl1Ymlmc19lcnIoYywgInRvbyBoaWdoIGlub2RlIG51bWJlciwgbWF4LiBpcyAlbHUiLAogCQkJICAodW5zaWduZWQgbG9uZyljLT5oaWdoZXN0X2ludW0pOwogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CkBAIC0xOTIxLDE3ICsxOTIxLDE3IEBACiAJaW5vX2tleV9pbml0KGMsICZrZXksIGludW0pOwogCWVyciA9IHViaWZzX2xvb2t1cF9sZXZlbDAoYywgJmtleSwgJnpub2RlLCAmbik7CiAJaWYgKCFlcnIpIHsKLQkJdWJpZnNfZXJyKCJpbm9kZSAlbHUgbm90IGZvdW5kIGluIGluZGV4IiwgKHVuc2lnbmVkIGxvbmcpaW51bSk7CisJCXViaWZzX2VycihjLCAiaW5vZGUgJWx1IG5vdCBmb3VuZCBpbiBpbmRleCIsICh1bnNpZ25lZCBsb25nKWludW0pOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIAl9IGVsc2UgaWYgKGVyciA8IDApIHsKLQkJdWJpZnNfZXJyKCJlcnJvciAlZCB3aGlsZSBsb29raW5nIHVwIGlub2RlICVsdSIsCisJCXViaWZzX2VycihjLCAiZXJyb3IgJWQgd2hpbGUgbG9va2luZyB1cCBpbm9kZSAlbHUiLAogCQkJICBlcnIsICh1bnNpZ25lZCBsb25nKWludW0pOwogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCX0KIAogCXpiciA9ICZ6bm9kZS0+emJyYW5jaFtuXTsKIAlpZiAoemJyLT5sZW4gPCBVQklGU19JTk9fTk9ERV9TWikgewotCQl1Ymlmc19lcnIoImJhZCBub2RlICVsdSBub2RlIGxlbmd0aCAlZCIsCisJCXViaWZzX2VycihjLCAiYmFkIG5vZGUgJWx1IG5vZGUgbGVuZ3RoICVkIiwKIAkJCSAgKHVuc2lnbmVkIGxvbmcpaW51bSwgemJyLT5sZW4pOwogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAl9CkBAIC0xOTQyLDcgKzE5NDIsNyBAQAogCiAJZXJyID0gdWJpZnNfdG5jX3JlYWRfbm9kZShjLCB6YnIsIGlubyk7CiAJaWYgKGVycikgewotCQl1Ymlmc19lcnIoImNhbm5vdCByZWFkIGlub2RlIG5vZGUgYXQgTEVCICVkOiVkLCBlcnJvciAlZCIsCisJCXViaWZzX2VycihjLCAiY2Fubm90IHJlYWQgaW5vZGUgbm9kZSBhdCBMRUIgJWQ6JWQsIGVycm9yICVkIiwKIAkJCSAgemJyLT5sbnVtLCB6YnItPm9mZnMsIGVycik7CiAJCWtmcmVlKGlubyk7CiAJCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0xOTUxLDcgKzE5NTEsNyBAQAogCWZzY2tpID0gYWRkX2lub2RlKGMsIGZzY2tkLCBpbm8pOwogCWtmcmVlKGlubyk7CiAJaWYgKElTX0VSUihmc2NraSkpIHsKLQkJdWJpZnNfZXJyKCJlcnJvciAlbGQgd2hpbGUgYWRkaW5nIGlub2RlICVsdSBub2RlIiwKKwkJdWJpZnNfZXJyKGMsICJlcnJvciAlbGQgd2hpbGUgYWRkaW5nIGlub2RlICVsdSBub2RlIiwKIAkJCSAgUFRSX0VSUihmc2NraSksICh1bnNpZ25lZCBsb25nKWludW0pOwogCQlyZXR1cm4gZnNja2k7CiAJfQpAQCAtMTk4NSw3ICsxOTg1LDcgQEAKIAlzdHJ1Y3QgZnNja19pbm9kZSAqZnNja2k7CiAKIAlpZiAoemJyLT5sZW4gPCBVQklGU19DSF9TWikgewotCQl1Ymlmc19lcnIoImJhZCBsZWFmIGxlbmd0aCAlZCAoTEVCICVkOiVkKSIsCisJCXViaWZzX2VycihjLCAiYmFkIGxlYWYgbGVuZ3RoICVkIChMRUIgJWQ6JWQpIiwKIAkJCSAgemJyLT5sZW4sIHpici0+bG51bSwgemJyLT5vZmZzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTk5Niw3ICsxOTk2LDcgQEAKIAogCWVyciA9IHViaWZzX3RuY19yZWFkX25vZGUoYywgemJyLCBub2RlKTsKIAlpZiAoZXJyKSB7Ci0JCXViaWZzX2VycigiY2Fubm90IHJlYWQgbGVhZiBub2RlIGF0IExFQiAlZDolZCwgZXJyb3IgJWQiLAorCQl1Ymlmc19lcnIoYywgImNhbm5vdCByZWFkIGxlYWYgbm9kZSBhdCBMRUIgJWQ6JWQsIGVycm9yICVkIiwKIAkJCSAgemJyLT5sbnVtLCB6YnItPm9mZnMsIGVycik7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQpAQCAtMjAwNiw3ICsyMDA2LDcgQEAKIAkJZnNja2kgPSBhZGRfaW5vZGUoYywgcHJpdiwgbm9kZSk7CiAJCWlmIChJU19FUlIoZnNja2kpKSB7CiAJCQllcnIgPSBQVFJfRVJSKGZzY2tpKTsKLQkJCXViaWZzX2VycigiZXJyb3IgJWQgd2hpbGUgYWRkaW5nIGlub2RlIG5vZGUiLCBlcnIpOworCQkJdWJpZnNfZXJyKGMsICJlcnJvciAlZCB3aGlsZSBhZGRpbmcgaW5vZGUgbm9kZSIsIGVycik7CiAJCQlnb3RvIG91dF9kdW1wOwogCQl9CiAJCWdvdG8gb3V0OwpAQCAtMjAxNCw3ICsyMDE0LDcgQEAKIAogCWlmICh0eXBlICE9IFVCSUZTX0RFTlRfS0VZICYmIHR5cGUgIT0gVUJJRlNfWEVOVF9LRVkgJiYKIAkgICAgdHlwZSAhPSBVQklGU19EQVRBX0tFWSkgewotCQl1Ymlmc19lcnIoInVuZXhwZWN0ZWQgbm9kZSB0eXBlICVkIGF0IExFQiAlZDolZCIsCisJCXViaWZzX2VycihjLCAidW5leHBlY3RlZCBub2RlIHR5cGUgJWQgYXQgTEVCICVkOiVkIiwKIAkJCSAgdHlwZSwgemJyLT5sbnVtLCB6YnItPm9mZnMpOwogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9mcmVlOwpAQCAtMjAyMiw3ICsyMDIyLDcgQEAKIAogCWNoID0gbm9kZTsKIAlpZiAobGU2NF90b19jcHUoY2gtPnNxbnVtKSA+IGMtPm1heF9zcW51bSkgewotCQl1Ymlmc19lcnIoInRvbyBoaWdoIHNlcXVlbmNlIG51bWJlciwgbWF4LiBpcyAlbGx1IiwKKwkJdWJpZnNfZXJyKGMsICJ0b28gaGlnaCBzZXF1ZW5jZSBudW1iZXIsIG1heC4gaXMgJWxsdSIsCiAJCQkgIGMtPm1heF9zcW51bSk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2R1bXA7CkBAIC0yMDQyLDcgKzIwNDIsNyBAQAogCQlmc2NraSA9IHJlYWRfYWRkX2lub2RlKGMsIHByaXYsIGludW0pOwogCQlpZiAoSVNfRVJSKGZzY2tpKSkgewogCQkJZXJyID0gUFRSX0VSUihmc2NraSk7Ci0JCQl1Ymlmc19lcnIoImVycm9yICVkIHdoaWxlIHByb2Nlc3NpbmcgZGF0YSBub2RlIGFuZCB0cnlpbmcgdG8gZmluZCBpbm9kZSBub2RlICVsdSIsCisJCQl1Ymlmc19lcnIoYywgImVycm9yICVkIHdoaWxlIHByb2Nlc3NpbmcgZGF0YSBub2RlIGFuZCB0cnlpbmcgdG8gZmluZCBpbm9kZSBub2RlICVsdSIsCiAJCQkJICBlcnIsICh1bnNpZ25lZCBsb25nKWludW0pOwogCQkJZ290byBvdXRfZHVtcDsKIAkJfQpAQCAtMjA1Miw3ICsyMDUyLDcgQEAKIAkJYmxrX29mZnMgPDw9IFVCSUZTX0JMT0NLX1NISUZUOwogCQlibGtfb2ZmcyArPSBsZTMyX3RvX2NwdShkbi0+c2l6ZSk7CiAJCWlmIChibGtfb2ZmcyA+IGZzY2tpLT5zaXplKSB7Ci0JCQl1Ymlmc19lcnIoImRhdGEgbm9kZSBhdCBMRUIgJWQ6JWQgaXMgbm90IHdpdGhpbiBpbm9kZSBzaXplICVsbGQiLAorCQkJdWJpZnNfZXJyKGMsICJkYXRhIG5vZGUgYXQgTEVCICVkOiVkIGlzIG5vdCB3aXRoaW4gaW5vZGUgc2l6ZSAlbGxkIiwKIAkJCQkgIHpici0+bG51bSwgemJyLT5vZmZzLCBmc2NraS0+c2l6ZSk7CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBvdXRfZHVtcDsKQEAgLTIwNzYsNyArMjA3Niw3IEBACiAJCWZzY2tpID0gcmVhZF9hZGRfaW5vZGUoYywgcHJpdiwgaW51bSk7CiAJCWlmIChJU19FUlIoZnNja2kpKSB7CiAJCQllcnIgPSBQVFJfRVJSKGZzY2tpKTsKLQkJCXViaWZzX2VycigiZXJyb3IgJWQgd2hpbGUgcHJvY2Vzc2luZyBlbnRyeSBub2RlIGFuZCB0cnlpbmcgdG8gZmluZCBpbm9kZSBub2RlICVsdSIsCisJCQl1Ymlmc19lcnIoYywgImVycm9yICVkIHdoaWxlIHByb2Nlc3NpbmcgZW50cnkgbm9kZSBhbmQgdHJ5aW5nIHRvIGZpbmQgaW5vZGUgbm9kZSAlbHUiLAogCQkJCSAgZXJyLCAodW5zaWduZWQgbG9uZylpbnVtKTsKIAkJCWdvdG8gb3V0X2R1bXA7CiAJCX0KQEAgLTIwODgsNyArMjA4OCw3IEBACiAJCWZzY2tpMSA9IHJlYWRfYWRkX2lub2RlKGMsIHByaXYsIGludW0pOwogCQlpZiAoSVNfRVJSKGZzY2tpMSkpIHsKIAkJCWVyciA9IFBUUl9FUlIoZnNja2kxKTsKLQkJCXViaWZzX2VycigiZXJyb3IgJWQgd2hpbGUgcHJvY2Vzc2luZyBlbnRyeSBub2RlIGFuZCB0cnlpbmcgdG8gZmluZCBwYXJlbnQgaW5vZGUgbm9kZSAlbHUiLAorCQkJdWJpZnNfZXJyKGMsICJlcnJvciAlZCB3aGlsZSBwcm9jZXNzaW5nIGVudHJ5IG5vZGUgYW5kIHRyeWluZyB0byBmaW5kIHBhcmVudCBpbm9kZSBub2RlICVsdSIsCiAJCQkJICBlcnIsICh1bnNpZ25lZCBsb25nKWludW0pOwogCQkJZ290byBvdXRfZHVtcDsKIAkJfQpAQCAtMjExMSw3ICsyMTExLDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0X2R1bXA6Ci0JdWJpZnNfbXNnKCJkdW1wIG9mIG5vZGUgYXQgTEVCICVkOiVkIiwgemJyLT5sbnVtLCB6YnItPm9mZnMpOworCXViaWZzX21zZyhjLCAiZHVtcCBvZiBub2RlIGF0IExFQiAlZDolZCIsIHpici0+bG51bSwgemJyLT5vZmZzKTsKIAl1Ymlmc19kdW1wX25vZGUoYywgbm9kZSk7CiBvdXRfZnJlZToKIAlrZnJlZShub2RlKTsKQEAgLTIxNjIsNTIgKzIxNjIsNTIgQEAKIAkJCSAqLwogCQkJaWYgKGZzY2tpLT5pbnVtICE9IFVCSUZTX1JPT1RfSU5PICYmCiAJCQkgICAgZnNja2ktPnJlZmVyZW5jZXMgIT0gMSkgewotCQkJCXViaWZzX2VycigiZGlyZWN0b3J5IGlub2RlICVsdSBoYXMgJWQgZGlyZW50cmllcyB3aGljaCByZWZlciBpdCwgYnV0IHNob3VsZCBiZSAxIiwKKwkJCQl1Ymlmc19lcnIoYywgImRpcmVjdG9yeSBpbm9kZSAlbHUgaGFzICVkIGRpcmVudHJpZXMgd2hpY2ggcmVmZXIgaXQsIGJ1dCBzaG91bGQgYmUgMSIsCiAJCQkJCSAgKHVuc2lnbmVkIGxvbmcpZnNja2ktPmludW0sCiAJCQkJCSAgZnNja2ktPnJlZmVyZW5jZXMpOwogCQkJCWdvdG8gb3V0X2R1bXA7CiAJCQl9CiAJCQlpZiAoZnNja2ktPmludW0gPT0gVUJJRlNfUk9PVF9JTk8gJiYKIAkJCSAgICBmc2NraS0+cmVmZXJlbmNlcyAhPSAwKSB7Ci0JCQkJdWJpZnNfZXJyKCJyb290IGlub2RlICVsdSBoYXMgbm9uLXplcm8gKCVkKSBkaXJlbnRyaWVzIHdoaWNoIHJlZmVyIGl0IiwKKwkJCQl1Ymlmc19lcnIoYywgInJvb3QgaW5vZGUgJWx1IGhhcyBub24temVybyAoJWQpIGRpcmVudHJpZXMgd2hpY2ggcmVmZXIgaXQiLAogCQkJCQkgICh1bnNpZ25lZCBsb25nKWZzY2tpLT5pbnVtLAogCQkJCQkgIGZzY2tpLT5yZWZlcmVuY2VzKTsKIAkJCQlnb3RvIG91dF9kdW1wOwogCQkJfQogCQkJaWYgKGZzY2tpLT5jYWxjX3N6ICE9IGZzY2tpLT5zaXplKSB7Ci0JCQkJdWJpZnNfZXJyKCJkaXJlY3RvcnkgaW5vZGUgJWx1IHNpemUgaXMgJWxsZCwgYnV0IGNhbGN1bGF0ZWQgc2l6ZSBpcyAlbGxkIiwKKwkJCQl1Ymlmc19lcnIoYywgImRpcmVjdG9yeSBpbm9kZSAlbHUgc2l6ZSBpcyAlbGxkLCBidXQgY2FsY3VsYXRlZCBzaXplIGlzICVsbGQiLAogCQkJCQkgICh1bnNpZ25lZCBsb25nKWZzY2tpLT5pbnVtLAogCQkJCQkgIGZzY2tpLT5zaXplLCBmc2NraS0+Y2FsY19zeik7CiAJCQkJZ290byBvdXRfZHVtcDsKIAkJCX0KIAkJCWlmIChmc2NraS0+Y2FsY19jbnQgIT0gZnNja2ktPm5saW5rKSB7Ci0JCQkJdWJpZnNfZXJyKCJkaXJlY3RvcnkgaW5vZGUgJWx1IG5saW5rIGlzICVkLCBidXQgY2FsY3VsYXRlZCBubGluayBpcyAlZCIsCisJCQkJdWJpZnNfZXJyKGMsICJkaXJlY3RvcnkgaW5vZGUgJWx1IG5saW5rIGlzICVkLCBidXQgY2FsY3VsYXRlZCBubGluayBpcyAlZCIsCiAJCQkJCSAgKHVuc2lnbmVkIGxvbmcpZnNja2ktPmludW0sCiAJCQkJCSAgZnNja2ktPm5saW5rLCBmc2NraS0+Y2FsY19jbnQpOwogCQkJCWdvdG8gb3V0X2R1bXA7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoZnNja2ktPnJlZmVyZW5jZXMgIT0gZnNja2ktPm5saW5rKSB7Ci0JCQkJdWJpZnNfZXJyKCJpbm9kZSAlbHUgbmxpbmsgaXMgJWQsIGJ1dCBjYWxjdWxhdGVkIG5saW5rIGlzICVkIiwKKwkJCQl1Ymlmc19lcnIoYywgImlub2RlICVsdSBubGluayBpcyAlZCwgYnV0IGNhbGN1bGF0ZWQgbmxpbmsgaXMgJWQiLAogCQkJCQkgICh1bnNpZ25lZCBsb25nKWZzY2tpLT5pbnVtLAogCQkJCQkgIGZzY2tpLT5ubGluaywgZnNja2ktPnJlZmVyZW5jZXMpOwogCQkJCWdvdG8gb3V0X2R1bXA7CiAJCQl9CiAJCX0KIAkJaWYgKGZzY2tpLT54YXR0cl9zeiAhPSBmc2NraS0+Y2FsY194c3opIHsKLQkJCXViaWZzX2VycigiaW5vZGUgJWx1IGhhcyB4YXR0ciBzaXplICV1LCBidXQgY2FsY3VsYXRlZCBzaXplIGlzICVsbGQiLAorCQkJdWJpZnNfZXJyKGMsICJpbm9kZSAlbHUgaGFzIHhhdHRyIHNpemUgJXUsIGJ1dCBjYWxjdWxhdGVkIHNpemUgaXMgJWxsZCIsCiAJCQkJICAodW5zaWduZWQgbG9uZylmc2NraS0+aW51bSwgZnNja2ktPnhhdHRyX3N6LAogCQkJCSAgZnNja2ktPmNhbGNfeHN6KTsKIAkJCWdvdG8gb3V0X2R1bXA7CiAJCX0KIAkJaWYgKGZzY2tpLT54YXR0cl9jbnQgIT0gZnNja2ktPmNhbGNfeGNudCkgewotCQkJdWJpZnNfZXJyKCJpbm9kZSAlbHUgaGFzICV1IHhhdHRycywgYnV0IGNhbGN1bGF0ZWQgY291bnQgaXMgJWxsZCIsCisJCQl1Ymlmc19lcnIoYywgImlub2RlICVsdSBoYXMgJXUgeGF0dHJzLCBidXQgY2FsY3VsYXRlZCBjb3VudCBpcyAlbGxkIiwKIAkJCQkgICh1bnNpZ25lZCBsb25nKWZzY2tpLT5pbnVtLAogCQkJCSAgZnNja2ktPnhhdHRyX2NudCwgZnNja2ktPmNhbGNfeGNudCk7CiAJCQlnb3RvIG91dF9kdW1wOwogCQl9CiAJCWlmIChmc2NraS0+eGF0dHJfbm1zICE9IGZzY2tpLT5jYWxjX3hubXMpIHsKLQkJCXViaWZzX2VycigiaW5vZGUgJWx1IGhhcyB4YXR0ciBuYW1lcycgc2l6ZSAldSwgYnV0IGNhbGN1bGF0ZWQgbmFtZXMnIHNpemUgaXMgJWxsZCIsCisJCQl1Ymlmc19lcnIoYywgImlub2RlICVsdSBoYXMgeGF0dHIgbmFtZXMnIHNpemUgJXUsIGJ1dCBjYWxjdWxhdGVkIG5hbWVzJyBzaXplIGlzICVsbGQiLAogCQkJCSAgKHVuc2lnbmVkIGxvbmcpZnNja2ktPmludW0sIGZzY2tpLT54YXR0cl9ubXMsCiAJCQkJICBmc2NraS0+Y2FsY194bm1zKTsKIAkJCWdvdG8gb3V0X2R1bXA7CkBAIC0yMjIxLDExICsyMjIxLDExIEBACiAJaW5vX2tleV9pbml0KGMsICZrZXksIGZzY2tpLT5pbnVtKTsKIAllcnIgPSB1Ymlmc19sb29rdXBfbGV2ZWwwKGMsICZrZXksICZ6bm9kZSwgJm4pOwogCWlmICghZXJyKSB7Ci0JCXViaWZzX2VycigiaW5vZGUgJWx1IG5vdCBmb3VuZCBpbiBpbmRleCIsCisJCXViaWZzX2VycihjLCAiaW5vZGUgJWx1IG5vdCBmb3VuZCBpbiBpbmRleCIsCiAJCQkgICh1bnNpZ25lZCBsb25nKWZzY2tpLT5pbnVtKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfSBlbHNlIGlmIChlcnIgPCAwKSB7Ci0JCXViaWZzX2VycigiZXJyb3IgJWQgd2hpbGUgbG9va2luZyB1cCBpbm9kZSAlbHUiLAorCQl1Ymlmc19lcnIoYywgImVycm9yICVkIHdoaWxlIGxvb2tpbmcgdXAgaW5vZGUgJWx1IiwKIAkJCSAgZXJyLCAodW5zaWduZWQgbG9uZylmc2NraS0+aW51bSk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMjIzNywxMyArMjIzNywxMyBAQAogCiAJZXJyID0gdWJpZnNfdG5jX3JlYWRfbm9kZShjLCB6YnIsIGlubyk7CiAJaWYgKGVycikgewotCQl1Ymlmc19lcnIoImNhbm5vdCByZWFkIGlub2RlIG5vZGUgYXQgTEVCICVkOiVkLCBlcnJvciAlZCIsCisJCXViaWZzX2VycihjLCAiY2Fubm90IHJlYWQgaW5vZGUgbm9kZSBhdCBMRUIgJWQ6JWQsIGVycm9yICVkIiwKIAkJCSAgemJyLT5sbnVtLCB6YnItPm9mZnMsIGVycik7CiAJCWtmcmVlKGlubyk7CiAJCXJldHVybiBlcnI7CiAJfQogCi0JdWJpZnNfbXNnKCJkdW1wIG9mIHRoZSBpbm9kZSAlbHUgc2l0dGluZyBpbiBMRUIgJWQ6JWQiLAorCXViaWZzX21zZyhjLCAiZHVtcCBvZiB0aGUgaW5vZGUgJWx1IHNpdHRpbmcgaW4gTEVCICVkOiVkIiwKIAkJICAodW5zaWduZWQgbG9uZylmc2NraS0+aW51bSwgemJyLT5sbnVtLCB6YnItPm9mZnMpOwogCXViaWZzX2R1bXBfbm9kZShjLCBpbm8pOwogCWtmcmVlKGlubyk7CkBAIC0yMjg0LDcgKzIyODQsNyBAQAogCXJldHVybiAwOwogCiBvdXRfZnJlZToKLQl1Ymlmc19lcnIoImZpbGUtc3lzdGVtIGNoZWNrIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJyKTsKKwl1Ymlmc19lcnIoYywgImZpbGUtc3lzdGVtIGNoZWNrIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJyKTsKIAlkdW1wX3N0YWNrKCk7CiAJZnJlZV9pbm9kZXMoJmZzY2tkKTsKIAlyZXR1cm4gZXJyOwpAQCAtMjMxNSwxMiArMjMxNSwxMiBAQAogCQlzYiA9IGNvbnRhaW5lcl9vZihjdXItPm5leHQsIHN0cnVjdCB1Ymlmc19zY2FuX25vZGUsIGxpc3QpOwogCiAJCWlmIChzYS0+dHlwZSAhPSBVQklGU19EQVRBX05PREUpIHsKLQkJCXViaWZzX2VycigiYmFkIG5vZGUgdHlwZSAlZCIsIHNhLT50eXBlKTsKKwkJCXViaWZzX2VycihjLCAiYmFkIG5vZGUgdHlwZSAlZCIsIHNhLT50eXBlKTsKIAkJCXViaWZzX2R1bXBfbm9kZShjLCBzYS0+bm9kZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAoc2ItPnR5cGUgIT0gVUJJRlNfREFUQV9OT0RFKSB7Ci0JCQl1Ymlmc19lcnIoImJhZCBub2RlIHR5cGUgJWQiLCBzYi0+dHlwZSk7CisJCQl1Ymlmc19lcnIoYywgImJhZCBub2RlIHR5cGUgJWQiLCBzYi0+dHlwZSk7CiAJCQl1Ymlmc19kdW1wX25vZGUoYywgc2ItPm5vZGUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTIzMzEsNyArMjMzMSw3IEBACiAJCWlmIChpbnVtYSA8IGludW1iKQogCQkJY29udGludWU7CiAJCWlmIChpbnVtYSA+IGludW1iKSB7Ci0JCQl1Ymlmc19lcnIoImxhcmdlciBpbnVtICVsdSBnb2VzIGJlZm9yZSBpbnVtICVsdSIsCisJCQl1Ymlmc19lcnIoYywgImxhcmdlciBpbnVtICVsdSBnb2VzIGJlZm9yZSBpbnVtICVsdSIsCiAJCQkJICAodW5zaWduZWQgbG9uZylpbnVtYSwgKHVuc2lnbmVkIGxvbmcpaW51bWIpOwogCQkJZ290byBlcnJvcl9kdW1wOwogCQl9CkBAIC0yMzQwLDExICsyMzQwLDExIEBACiAJCWJsa2IgPSBrZXlfYmxvY2soYywgJnNiLT5rZXkpOwogCiAJCWlmIChibGthID4gYmxrYikgewotCQkJdWJpZnNfZXJyKCJsYXJnZXIgYmxvY2sgJXUgZ29lcyBiZWZvcmUgJXUiLCBibGthLCBibGtiKTsKKwkJCXViaWZzX2VycihjLCAibGFyZ2VyIGJsb2NrICV1IGdvZXMgYmVmb3JlICV1IiwgYmxrYSwgYmxrYik7CiAJCQlnb3RvIGVycm9yX2R1bXA7CiAJCX0KIAkJaWYgKGJsa2EgPT0gYmxrYikgewotCQkJdWJpZnNfZXJyKCJ0d28gZGF0YSBub2RlcyBmb3IgdGhlIHNhbWUgYmxvY2siKTsKKwkJCXViaWZzX2VycihjLCAidHdvIGRhdGEgbm9kZXMgZm9yIHRoZSBzYW1lIGJsb2NrIik7CiAJCQlnb3RvIGVycm9yX2R1bXA7CiAJCX0KIAl9CkBAIC0yMzgzLDE5ICsyMzgzLDE5IEBACiAKIAkJaWYgKHNhLT50eXBlICE9IFVCSUZTX0lOT19OT0RFICYmIHNhLT50eXBlICE9IFVCSUZTX0RFTlRfTk9ERSAmJgogCQkgICAgc2EtPnR5cGUgIT0gVUJJRlNfWEVOVF9OT0RFKSB7Ci0JCQl1Ymlmc19lcnIoImJhZCBub2RlIHR5cGUgJWQiLCBzYS0+dHlwZSk7CisJCQl1Ymlmc19lcnIoYywgImJhZCBub2RlIHR5cGUgJWQiLCBzYS0+dHlwZSk7CiAJCQl1Ymlmc19kdW1wX25vZGUoYywgc2EtPm5vZGUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJaWYgKHNhLT50eXBlICE9IFVCSUZTX0lOT19OT0RFICYmIHNhLT50eXBlICE9IFVCSUZTX0RFTlRfTk9ERSAmJgogCQkgICAgc2EtPnR5cGUgIT0gVUJJRlNfWEVOVF9OT0RFKSB7Ci0JCQl1Ymlmc19lcnIoImJhZCBub2RlIHR5cGUgJWQiLCBzYi0+dHlwZSk7CisJCQl1Ymlmc19lcnIoYywgImJhZCBub2RlIHR5cGUgJWQiLCBzYi0+dHlwZSk7CiAJCQl1Ymlmc19kdW1wX25vZGUoYywgc2ItPm5vZGUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAogCQlpZiAoc2EtPnR5cGUgIT0gVUJJRlNfSU5PX05PREUgJiYgc2ItPnR5cGUgPT0gVUJJRlNfSU5PX05PREUpIHsKLQkJCXViaWZzX2Vycigibm9uLWlub2RlIG5vZGUgZ29lcyBiZWZvcmUgaW5vZGUgbm9kZSIpOworCQkJdWJpZnNfZXJyKGMsICJub24taW5vZGUgbm9kZSBnb2VzIGJlZm9yZSBpbm9kZSBub2RlIik7CiAJCQlnb3RvIGVycm9yX2R1bXA7CiAJCX0KIApAQCAtMjQwNSw3ICsyNDA1LDcgQEAKIAkJaWYgKHNhLT50eXBlID09IFVCSUZTX0lOT19OT0RFICYmIHNiLT50eXBlID09IFVCSUZTX0lOT19OT0RFKSB7CiAJCQkvKiBJbm9kZSBub2RlcyBhcmUgc29ydGVkIGluIGRlc2NlbmRpbmcgc2l6ZSBvcmRlciAqLwogCQkJaWYgKHNhLT5sZW4gPCBzYi0+bGVuKSB7Ci0JCQkJdWJpZnNfZXJyKCJzbWFsbGVyIGlub2RlIG5vZGUgZ29lcyBmaXJzdCIpOworCQkJCXViaWZzX2VycihjLCAic21hbGxlciBpbm9kZSBub2RlIGdvZXMgZmlyc3QiKTsKIAkJCQlnb3RvIGVycm9yX2R1bXA7CiAJCQl9CiAJCQljb250aW51ZTsKQEAgLTI0MjEsNyArMjQyMSw3IEBACiAJCWlmIChpbnVtYSA8IGludW1iKQogCQkJY29udGludWU7CiAJCWlmIChpbnVtYSA+IGludW1iKSB7Ci0JCQl1Ymlmc19lcnIoImxhcmdlciBpbnVtICVsdSBnb2VzIGJlZm9yZSBpbnVtICVsdSIsCisJCQl1Ymlmc19lcnIoYywgImxhcmdlciBpbnVtICVsdSBnb2VzIGJlZm9yZSBpbnVtICVsdSIsCiAJCQkJICAodW5zaWduZWQgbG9uZylpbnVtYSwgKHVuc2lnbmVkIGxvbmcpaW51bWIpOwogCQkJZ290byBlcnJvcl9kdW1wOwogCQl9CkBAIC0yNDMwLDcgKzI0MzAsNyBAQAogCQloYXNoYiA9IGtleV9ibG9jayhjLCAmc2ItPmtleSk7CiAKIAkJaWYgKGhhc2hhID4gaGFzaGIpIHsKLQkJCXViaWZzX2VycigibGFyZ2VyIGhhc2ggJXUgZ29lcyBiZWZvcmUgJXUiLAorCQkJdWJpZnNfZXJyKGMsICJsYXJnZXIgaGFzaCAldSBnb2VzIGJlZm9yZSAldSIsCiAJCQkJICBoYXNoYSwgaGFzaGIpOwogCQkJZ290byBlcnJvcl9kdW1wOwogCQl9CkBAIC0yNDM5LDkgKzI0MzksOSBAQAogCXJldHVybiAwOwogCiBlcnJvcl9kdW1wOgotCXViaWZzX21zZygiZHVtcGluZyBmaXJzdCBub2RlIik7CisJdWJpZnNfbXNnKGMsICJkdW1waW5nIGZpcnN0IG5vZGUiKTsKIAl1Ymlmc19kdW1wX25vZGUoYywgc2EtPm5vZGUpOwotCXViaWZzX21zZygiZHVtcGluZyBzZWNvbmQgbm9kZSIpOworCXViaWZzX21zZyhjLCAiZHVtcGluZyBzZWNvbmQgbm9kZSIpOwogCXViaWZzX2R1bXBfbm9kZShjLCBzYi0+bm9kZSk7CiAJcmV0dXJuIC1FSU5WQUw7CiAJcmV0dXJuIDA7CkBAIC0yNDcwLDEzICsyNDcwLDEzIEBACiAJCQkJZGVsYXkgPSBwcmFuZG9tX3UzMigpICUgNjAwMDA7CiAJCQkJZC0+cGNfdGltZW91dCA9IGppZmZpZXM7CiAJCQkJZC0+cGNfdGltZW91dCArPSBtc2Vjc190b19qaWZmaWVzKGRlbGF5KTsKLQkJCQl1Ymlmc193YXJuKCJmYWlsaW5nIGFmdGVyICVsdW1zIiwgZGVsYXkpOworCQkJCXViaWZzX3dhcm4oYywgImZhaWxpbmcgYWZ0ZXIgJWx1bXMiLCBkZWxheSk7CiAJCQl9IGVsc2UgewogCQkJCWQtPnBjX2RlbGF5ID0gMjsKIAkJCQlkZWxheSA9IHByYW5kb21fdTMyKCkgJSAxMDAwMDsKIAkJCQkvKiBGYWlsIHdpdGhpbiAxMDAwMCBvcGVyYXRpb25zICovCiAJCQkJZC0+cGNfY250X21heCA9IGRlbGF5OwotCQkJCXViaWZzX3dhcm4oImZhaWxpbmcgYWZ0ZXIgJWx1IGNhbGxzIiwgZGVsYXkpOworCQkJCXViaWZzX3dhcm4oYywgImZhaWxpbmcgYWZ0ZXIgJWx1IGNhbGxzIiwgZGVsYXkpOwogCQkJfQogCQl9CiAKQEAgLTI0OTQsNTUgKzI0OTQsNTUgQEAKIAkJCXJldHVybiAwOwogCQlpZiAoY2hhbmNlKDE5LCAyMCkpCiAJCQlyZXR1cm4gMDsKLQkJdWJpZnNfd2FybigiZmFpbGluZyBpbiBzdXBlciBibG9jayBMRUIgJWQiLCBsbnVtKTsKKwkJdWJpZnNfd2FybihjLCAiZmFpbGluZyBpbiBzdXBlciBibG9jayBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKGxudW0gPT0gVUJJRlNfTVNUX0xOVU0gfHwgbG51bSA9PSBVQklGU19NU1RfTE5VTSArIDEpIHsKIAkJaWYgKGNoYW5jZSgxOSwgMjApKQogCQkJcmV0dXJuIDA7Ci0JCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gbWFzdGVyIExFQiAlZCIsIGxudW0pOworCQl1Ymlmc193YXJuKGMsICJmYWlsaW5nIGluIG1hc3RlciBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKGxudW0gPj0gVUJJRlNfTE9HX0xOVU0gJiYgbG51bSA8PSBjLT5sb2dfbGFzdCkgewogCQlpZiAod3JpdGUgJiYgY2hhbmNlKDk5LCAxMDApKQogCQkJcmV0dXJuIDA7CiAJCWlmIChjaGFuY2UoMzk5LCA0MDApKQogCQkJcmV0dXJuIDA7Ci0JCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gbG9nIExFQiAlZCIsIGxudW0pOworCQl1Ymlmc193YXJuKGMsICJmYWlsaW5nIGluIGxvZyBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKGxudW0gPj0gYy0+bHB0X2ZpcnN0ICYmIGxudW0gPD0gYy0+bHB0X2xhc3QpIHsKIAkJaWYgKHdyaXRlICYmIGNoYW5jZSg3LCA4KSkKIAkJCXJldHVybiAwOwogCQlpZiAoY2hhbmNlKDE5LCAyMCkpCiAJCQlyZXR1cm4gMDsKLQkJdWJpZnNfd2FybigiZmFpbGluZyBpbiBMUFQgTEVCICVkIiwgbG51bSk7CisJCXViaWZzX3dhcm4oYywgImZhaWxpbmcgaW4gTFBUIExFQiAlZCIsIGxudW0pOwogCX0gZWxzZSBpZiAobG51bSA+PSBjLT5vcnBoX2ZpcnN0ICYmIGxudW0gPD0gYy0+b3JwaF9sYXN0KSB7CiAJCWlmICh3cml0ZSAmJiBjaGFuY2UoMSwgMikpCiAJCQlyZXR1cm4gMDsKIAkJaWYgKGNoYW5jZSg5LCAxMCkpCiAJCQlyZXR1cm4gMDsKLQkJdWJpZnNfd2FybigiZmFpbGluZyBpbiBvcnBoYW4gTEVCICVkIiwgbG51bSk7CisJCXViaWZzX3dhcm4oYywgImZhaWxpbmcgaW4gb3JwaGFuIExFQiAlZCIsIGxudW0pOwogCX0gZWxzZSBpZiAobG51bSA9PSBjLT5paGVhZF9sbnVtKSB7CiAJCWlmIChjaGFuY2UoOTksIDEwMCkpCiAJCQlyZXR1cm4gMDsKLQkJdWJpZnNfd2FybigiZmFpbGluZyBpbiBpbmRleCBoZWFkIExFQiAlZCIsIGxudW0pOworCQl1Ymlmc193YXJuKGMsICJmYWlsaW5nIGluIGluZGV4IGhlYWQgTEVCICVkIiwgbG51bSk7CiAJfSBlbHNlIGlmIChjLT5qaGVhZHMgJiYgbG51bSA9PSBjLT5qaGVhZHNbR0NIRF0ud2J1Zi5sbnVtKSB7CiAJCWlmIChjaGFuY2UoOSwgMTApKQogCQkJcmV0dXJuIDA7Ci0JCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gR0MgaGVhZCBMRUIgJWQiLCBsbnVtKTsKKwkJdWJpZnNfd2FybihjLCAiZmFpbGluZyBpbiBHQyBoZWFkIExFQiAlZCIsIGxudW0pOwogCX0gZWxzZSBpZiAod3JpdGUgJiYgIVJCX0VNUFRZX1JPT1QoJmMtPmJ1ZHMpICYmCiAJCSAgICF1Ymlmc19zZWFyY2hfYnVkKGMsIGxudW0pKSB7CiAJCWlmIChjaGFuY2UoMTksIDIwKSkKIAkJCXJldHVybiAwOwotCQl1Ymlmc193YXJuKCJmYWlsaW5nIGluIG5vbi1idWQgTEVCICVkIiwgbG51bSk7CisJCXViaWZzX3dhcm4oYywgImZhaWxpbmcgaW4gbm9uLWJ1ZCBMRUIgJWQiLCBsbnVtKTsKIAl9IGVsc2UgaWYgKGMtPmNtdF9zdGF0ZSA9PSBDT01NSVRfUlVOTklOR19CQUNLR1JPVU5EIHx8CiAJCSAgIGMtPmNtdF9zdGF0ZSA9PSBDT01NSVRfUlVOTklOR19SRVFVSVJFRCkgewogCQlpZiAoY2hhbmNlKDk5OSwgMTAwMCkpCiAJCQlyZXR1cm4gMDsKLQkJdWJpZnNfd2FybigiZmFpbGluZyBpbiBidWQgTEVCICVkIGNvbW1pdCBydW5uaW5nIiwgbG51bSk7CisJCXViaWZzX3dhcm4oYywgImZhaWxpbmcgaW4gYnVkIExFQiAlZCBjb21taXQgcnVubmluZyIsIGxudW0pOwogCX0gZWxzZSB7CiAJCWlmIChjaGFuY2UoOTk5OSwgMTAwMDApKQogCQkJcmV0dXJuIDA7Ci0JCXViaWZzX3dhcm4oImZhaWxpbmcgaW4gYnVkIExFQiAlZCBjb21taXQgbm90IHJ1bm5pbmciLCBsbnVtKTsKKwkJdWJpZnNfd2FybihjLCAiZmFpbGluZyBpbiBidWQgTEVCICVkIGNvbW1pdCBub3QgcnVubmluZyIsIGxudW0pOwogCX0KIAogCWQtPnBjX2hhcHBlbmVkID0gMTsKLQl1Ymlmc193YXJuKCI9PT09PT09PT09IFBvd2VyIGN1dCBlbXVsYXRlZCA9PT09PT09PT09Iik7CisJdWJpZnNfd2FybihjLCAiPT09PT09PT09PSBQb3dlciBjdXQgZW11bGF0ZWQgPT09PT09PT09PSIpOwogCWR1bXBfc3RhY2soKTsKIAlyZXR1cm4gMTsKIH0KQEAgLTI1NTcsNyArMjU1Nyw3IEBACiAJLyogQ29ycnVwdGlvbiBzcGFuIG1heCB0byBlbmQgb2Ygd3JpdGUgdW5pdCAqLwogCXRvID0gbWluKGxlbiwgQUxJR04oZnJvbSArIDEsIGMtPm1heF93cml0ZV9zaXplKSk7CiAKLQl1Ymlmc193YXJuKCJmaWxsZWQgYnl0ZXMgJXUtJXUgd2l0aCAlcyIsIGZyb20sIHRvIC0gMSwKKwl1Ymlmc193YXJuKGMsICJmaWxsZWQgYnl0ZXMgJXUtJXUgd2l0aCAlcyIsIGZyb20sIHRvIC0gMSwKIAkJICAgZmZzID8gIjB4RkZzIiA6ICJyYW5kb20gZGF0YSIpOwogCiAJaWYgKGZmcykKQEAgLTI1NzksNyArMjU3OSw3IEBACiAJZmFpbGluZyA9IHBvd2VyX2N1dF9lbXVsYXRlZChjLCBsbnVtLCAxKTsKIAlpZiAoZmFpbGluZykgewogCQlsZW4gPSBjb3JydXB0X2RhdGEoYywgYnVmLCBsZW4pOwotCQl1Ymlmc193YXJuKCJhY3R1YWxseSB3cml0ZSAlZCBieXRlcyB0byBMRUIgJWQ6JWQgKHRoZSBidWZmZXIgd2FzIGNvcnJ1cHRlZCkiLAorCQl1Ymlmc193YXJuKGMsICJhY3R1YWxseSB3cml0ZSAlZCBieXRlcyB0byBMRUIgJWQ6JWQgKHRoZSBidWZmZXIgd2FzIGNvcnJ1cHRlZCkiLAogCQkJICAgbGVuLCBsbnVtLCBvZmZzKTsKIAl9CiAJZXJyID0gdWJpX2xlYl93cml0ZShjLT51YmksIGxudW0sIGJ1Ziwgb2ZmcywgbGVuKTsKQEAgLTI5MDksNyArMjkwOSw3IEBACiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGQtPmRmc19kaXIpOwogb3V0OgogCWVyciA9IGRlbnQgPyBQVFJfRVJSKGRlbnQpIDogLUVOT0RFVjsKLQl1Ymlmc19lcnIoImNhbm5vdCBjcmVhdGUgXCIlc1wiIGRlYnVnZnMgZmlsZSBvciBkaXJlY3RvcnksIGVycm9yICVkXG4iLAorCXViaWZzX2VycihjLCAiY2Fubm90IGNyZWF0ZSBcIiVzXCIgZGVidWdmcyBmaWxlIG9yIGRpcmVjdG9yeSwgZXJyb3IgJWRcbiIsCiAJCSAgZm5hbWUsIGVycik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTMwNjMsOCArMzA2Myw4IEBACiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRmc19yb290ZGlyKTsKIG91dDoKIAllcnIgPSBkZW50ID8gUFRSX0VSUihkZW50KSA6IC1FTk9ERVY7Ci0JdWJpZnNfZXJyKCJjYW5ub3QgY3JlYXRlIFwiJXNcIiBkZWJ1Z2ZzIGZpbGUgb3IgZGlyZWN0b3J5LCBlcnJvciAlZFxuIiwKLQkJICBmbmFtZSwgZXJyKTsKKwlwcl9lcnIoIlVCSUZTIGVycm9yIChwaWQgJWQpOiBjYW5ub3QgY3JlYXRlIFwiJXNcIiBkZWJ1Z2ZzIGZpbGUgb3IgZGlyZWN0b3J5LCBlcnJvciAlZFxuIiwKKwkgICAgICAgY3VycmVudC0+cGlkLCBmbmFtZSwgZXJyKTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9mcy91Ymlmcy9kaXIuYyBiL2ZzL3ViaWZzL2Rpci5jCmluZGV4IDBmYTZjODAuLjAyZDFlZTcgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2Rpci5jCisrKyBiL2ZzL3ViaWZzL2Rpci5jCkBAIC0xNDYsMTIgKzE0NiwxMiBAQAogCWlmIChjLT5oaWdoZXN0X2ludW0gPj0gSU5VTV9XQVJOX1dBVEVSTUFSSykgewogCQlpZiAoYy0+aGlnaGVzdF9pbnVtID49IElOVU1fV0FURVJNQVJLKSB7CiAJCQlzcGluX3VubG9jaygmYy0+Y250X2xvY2spOwotCQkJdWJpZnNfZXJyKCJvdXQgb2YgaW5vZGUgbnVtYmVycyIpOworCQkJdWJpZnNfZXJyKGMsICJvdXQgb2YgaW5vZGUgbnVtYmVycyIpOwogCQkJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCQkJaXB1dChpbm9kZSk7CiAJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAkJfQotCQl1Ymlmc193YXJuKCJydW5uaW5nIG91dCBvZiBpbm9kZSBudW1iZXJzIChjdXJyZW50ICVsdSwgbWF4ICVkKSIsCisJCXViaWZzX3dhcm4oYywgInJ1bm5pbmcgb3V0IG9mIGlub2RlIG51bWJlcnMgKGN1cnJlbnQgJWx1LCBtYXggJXUpIiwKIAkJCSAgICh1bnNpZ25lZCBsb25nKWMtPmhpZ2hlc3RfaW51bSwgSU5VTV9XQVRFUk1BUkspOwogCX0KIApAQCAtMjIyLDcgKzIyMiw3IEBACiAJCSAqIGNoZWNraW5nLgogCQkgKi8KIAkJZXJyID0gUFRSX0VSUihpbm9kZSk7Ci0JCXViaWZzX2VycigiZGVhZCBkaXJlY3RvcnkgZW50cnkgJyVwZCcsIGVycm9yICVkIiwKKwkJdWJpZnNfZXJyKGMsICJkZWFkIGRpcmVjdG9yeSBlbnRyeSAnJXBkJywgZXJyb3IgJWQiLAogCQkJICBkZW50cnksIGVycik7CiAJCXViaWZzX3JvX21vZGUoYywgZXJyKTsKIAkJZ290byBvdXQ7CkBAIC0yNzIsNyArMjcyLDcgQEAKIAogCWVyciA9IHViaWZzX2luaXRfc2VjdXJpdHkoZGlyLCBpbm9kZSwgJmRlbnRyeS0+ZF9uYW1lKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF9jYW5jZWw7CisJCWdvdG8gb3V0X2lub2RlOwogCiAJbXV0ZXhfbG9jaygmZGlyX3VpLT51aV9tdXRleCk7CiAJZGlyLT5pX3NpemUgKz0gc3pfY2hhbmdlOwpAQCAtMjkyLDExICsyOTIsMTIgQEAKIAlkaXItPmlfc2l6ZSAtPSBzel9jaGFuZ2U7CiAJZGlyX3VpLT51aV9zaXplID0gZGlyLT5pX3NpemU7CiAJbXV0ZXhfdW5sb2NrKCZkaXJfdWktPnVpX211dGV4KTsKK291dF9pbm9kZToKIAltYWtlX2JhZF9pbm9kZShpbm9kZSk7CiAJaXB1dChpbm9kZSk7CiBvdXRfYnVkZzoKIAl1Ymlmc19yZWxlYXNlX2J1ZGdldChjLCAmcmVxKTsKLQl1Ymlmc19lcnIoImNhbm5vdCBjcmVhdGUgcmVndWxhciBmaWxlLCBlcnJvciAlZCIsIGVycik7CisJdWJpZnNfZXJyKGMsICJjYW5ub3QgY3JlYXRlIHJlZ3VsYXIgZmlsZSwgZXJyb3IgJWQiLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTQ0OSw3ICs0NTAsNyBAQAogCiBvdXQ6CiAJaWYgKGVyciAhPSAtRU5PRU5UKSB7Ci0JCXViaWZzX2VycigiY2Fubm90IGZpbmQgbmV4dCBkaXJlbnRyeSwgZXJyb3IgJWQiLCBlcnIpOworCQl1Ymlmc19lcnIoYywgImNhbm5vdCBmaW5kIG5leHQgZGlyZW50cnksIGVycm9yICVkIiwgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTczMiw3ICs3MzMsNyBAQAogCiAJZXJyID0gdWJpZnNfaW5pdF9zZWN1cml0eShkaXIsIGlub2RlLCAmZGVudHJ5LT5kX25hbWUpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X2NhbmNlbDsKKwkJZ290byBvdXRfaW5vZGU7CiAKIAltdXRleF9sb2NrKCZkaXJfdWktPnVpX211dGV4KTsKIAlpbnNlcnRfaW5vZGVfaGFzaChpbm9kZSk7CkBAIC03NDMsNyArNzQ0LDcgQEAKIAlkaXItPmlfbXRpbWUgPSBkaXItPmlfY3RpbWUgPSBpbm9kZS0+aV9jdGltZTsKIAllcnIgPSB1Ymlmc19qbmxfdXBkYXRlKGMsIGRpciwgJmRlbnRyeS0+ZF9uYW1lLCBpbm9kZSwgMCwgMCk7CiAJaWYgKGVycikgewotCQl1Ymlmc19lcnIoImNhbm5vdCBjcmVhdGUgZGlyZWN0b3J5LCBlcnJvciAlZCIsIGVycik7CisJCXViaWZzX2VycihjLCAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnksIGVycm9yICVkIiwgZXJyKTsKIAkJZ290byBvdXRfY2FuY2VsOwogCX0KIAltdXRleF91bmxvY2soJmRpcl91aS0+dWlfbXV0ZXgpOwpAQCAtNzU3LDYgKzc1OCw3IEBACiAJZGlyX3VpLT51aV9zaXplID0gZGlyLT5pX3NpemU7CiAJZHJvcF9ubGluayhkaXIpOwogCW11dGV4X3VubG9jaygmZGlyX3VpLT51aV9tdXRleCk7CitvdXRfaW5vZGU6CiAJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCWlwdXQoaW5vZGUpOwogb3V0X2J1ZGc6CkBAIC04MTYsNyArODE4LDcgQEAKIAogCWVyciA9IHViaWZzX2luaXRfc2VjdXJpdHkoZGlyLCBpbm9kZSwgJmRlbnRyeS0+ZF9uYW1lKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF9jYW5jZWw7CisJCWdvdG8gb3V0X2lub2RlOwogCiAJbXV0ZXhfbG9jaygmZGlyX3VpLT51aV9tdXRleCk7CiAJZGlyLT5pX3NpemUgKz0gc3pfY2hhbmdlOwpAQCAtODM2LDYgKzgzOCw3IEBACiAJZGlyLT5pX3NpemUgLT0gc3pfY2hhbmdlOwogCWRpcl91aS0+dWlfc2l6ZSA9IGRpci0+aV9zaXplOwogCW11dGV4X3VubG9jaygmZGlyX3VpLT51aV9tdXRleCk7CitvdXRfaW5vZGU6CiAJbWFrZV9iYWRfaW5vZGUoaW5vZGUpOwogCWlwdXQoaW5vZGUpOwogb3V0X2J1ZGc6CkBAIC04OTYsNyArODk5LDcgQEAKIAogCWVyciA9IHViaWZzX2luaXRfc2VjdXJpdHkoZGlyLCBpbm9kZSwgJmRlbnRyeS0+ZF9uYW1lKTsKIAlpZiAoZXJyKQotCQlnb3RvIG91dF9jYW5jZWw7CisJCWdvdG8gb3V0X2lub2RlOwogCiAJbXV0ZXhfbG9jaygmZGlyX3VpLT51aV9tdXRleCk7CiAJZGlyLT5pX3NpemUgKz0gc3pfY2hhbmdlOwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvZmlsZS5jIGIvZnMvdWJpZnMvZmlsZS5jCmluZGV4IGU2MjdjMGEuLjNiYTNmZWYgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2ZpbGUuYworKysgYi9mcy91Ymlmcy9maWxlLmMKQEAgLTUwLDcgKzUwLDYgQEAKICAqLwogCiAjaW5jbHVkZSAidWJpZnMuaCIKLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtODAsNyArNzksNyBAQAogCiAJZGxlbiA9IGxlMzJfdG9fY3B1KGRuLT5jaC5sZW4pIC0gVUJJRlNfREFUQV9OT0RFX1NaOwogCW91dF9sZW4gPSBVQklGU19CTE9DS19TSVpFOwotCWVyciA9IHViaWZzX2RlY29tcHJlc3MoJmRuLT5kYXRhLCBkbGVuLCBhZGRyLCAmb3V0X2xlbiwKKwllcnIgPSB1Ymlmc19kZWNvbXByZXNzKGMsICZkbi0+ZGF0YSwgZGxlbiwgYWRkciwgJm91dF9sZW4sCiAJCQkgICAgICAgbGUxNl90b19jcHUoZG4tPmNvbXByX3R5cGUpKTsKIAlpZiAoZXJyIHx8IGxlbiAhPSBvdXRfbGVuKQogCQlnb3RvIGR1bXA7CkBAIC05Niw3ICs5NSw3IEBACiAJcmV0dXJuIDA7CiAKIGR1bXA6Ci0JdWJpZnNfZXJyKCJiYWQgZGF0YSBub2RlIChibG9jayAldSwgaW5vZGUgJWx1KSIsCisJdWJpZnNfZXJyKGMsICJiYWQgZGF0YSBub2RlIChibG9jayAldSwgaW5vZGUgJWx1KSIsCiAJCSAgYmxvY2ssIGlub2RlLT5pX2lubyk7CiAJdWJpZnNfZHVtcF9ub2RlKGMsIGRuKTsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTE2MSwxMyArMTYwLDE0IEBACiAJCWFkZHIgKz0gVUJJRlNfQkxPQ0tfU0laRTsKIAl9CiAJaWYgKGVycikgeworCQlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IGlub2RlLT5pX3NiLT5zX2ZzX2luZm87CiAJCWlmIChlcnIgPT0gLUVOT0VOVCkgewogCQkJLyogTm90IGZvdW5kLCBzbyBpdCBtdXN0IGJlIGEgaG9sZSAqLwogCQkJU2V0UGFnZUNoZWNrZWQocGFnZSk7CiAJCQlkYmdfZ2VuKCJob2xlIik7CiAJCQlnb3RvIG91dF9mcmVlOwogCQl9Ci0JCXViaWZzX2VycigiY2Fubm90IHJlYWQgcGFnZSAlbHUgb2YgaW5vZGUgJWx1LCBlcnJvciAlZCIsCisJCXViaWZzX2VycihjLCAiY2Fubm90IHJlYWQgcGFnZSAlbHUgb2YgaW5vZGUgJWx1LCBlcnJvciAlZCIsCiAJCQkgIHBhZ2UtPmluZGV4LCBpbm9kZS0+aV9pbm8sIGVycik7CiAJCWdvdG8gZXJyb3I7CiAJfQpAQCAtNjUwLDcgKzY1MCw3IEBACiAKIAkJCWRsZW4gPSBsZTMyX3RvX2NwdShkbi0+Y2gubGVuKSAtIFVCSUZTX0RBVEFfTk9ERV9TWjsKIAkJCW91dF9sZW4gPSBVQklGU19CTE9DS19TSVpFOwotCQkJZXJyID0gdWJpZnNfZGVjb21wcmVzcygmZG4tPmRhdGEsIGRsZW4sIGFkZHIsICZvdXRfbGVuLAorCQkJZXJyID0gdWJpZnNfZGVjb21wcmVzcyhjLCAmZG4tPmRhdGEsIGRsZW4sIGFkZHIsICZvdXRfbGVuLAogCQkJCQkgICAgICAgbGUxNl90b19jcHUoZG4tPmNvbXByX3R5cGUpKTsKIAkJCWlmIChlcnIgfHwgbGVuICE9IG91dF9sZW4pCiAJCQkJZ290byBvdXRfZXJyOwpAQCAtNjk4LDcgKzY5OCw3IEBACiAJU2V0UGFnZUVycm9yKHBhZ2UpOwogCWZsdXNoX2RjYWNoZV9wYWdlKHBhZ2UpOwogCWt1bm1hcChwYWdlKTsKLQl1Ymlmc19lcnIoImJhZCBkYXRhIG5vZGUgKGJsb2NrICV1LCBpbm9kZSAlbHUpIiwKKwl1Ymlmc19lcnIoYywgImJhZCBkYXRhIG5vZGUgKGJsb2NrICV1LCBpbm9kZSAlbHUpIiwKIAkJICBwYWdlX2Jsb2NrLCBpbm9kZS0+aV9pbm8pOwogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtODAyLDcgKzgwMiw3IEBACiAJcmV0dXJuIHJldDsKIAogb3V0X3dhcm46Ci0JdWJpZnNfd2FybigiaWdub3JpbmcgZXJyb3IgJWQgYW5kIHNraXBwaW5nIGJ1bGstcmVhZCIsIGVycik7CisJdWJpZnNfd2FybihjLCAiaWdub3JpbmcgZXJyb3IgJWQgYW5kIHNraXBwaW5nIGJ1bGstcmVhZCIsIGVycik7CiAJZ290byBvdXRfZnJlZTsKIAogb3V0X2J1X29mZjoKQEAgLTkzMCw3ICs5MzAsNyBAQAogCX0KIAlpZiAoZXJyKSB7CiAJCVNldFBhZ2VFcnJvcihwYWdlKTsKLQkJdWJpZnNfZXJyKCJjYW5ub3Qgd3JpdGUgcGFnZSAlbHUgb2YgaW5vZGUgJWx1LCBlcnJvciAlZCIsCisJCXViaWZzX2VycihjLCAiY2Fubm90IHdyaXRlIHBhZ2UgJWx1IG9mIGlub2RlICVsdSwgZXJyb3IgJWQiLAogCQkJICBwYWdlLT5pbmRleCwgaW5vZGUtPmlfaW5vLCBlcnIpOwogCQl1Ymlmc19yb19tb2RlKGMsIGVycik7CiAJfQpAQCAtMTQ4NSw3ICsxNDg1LDcgQEAKIAllcnIgPSB1Ymlmc19idWRnZXRfc3BhY2UoYywgJnJlcSk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJaWYgKGVyciA9PSAtRU5PU1BDKQotCQkJdWJpZnNfd2Fybigib3V0IG9mIHNwYWNlIGZvciBtbWFwcGVkIGZpbGUgKGlub2RlIG51bWJlciAlbHUpIiwKKwkJCXViaWZzX3dhcm4oYywgIm91dCBvZiBzcGFjZSBmb3IgbW1hcHBlZCBmaWxlIChpbm9kZSBudW1iZXIgJWx1KSIsCiAJCQkJICAgaW5vZGUtPmlfaW5vKTsKIAkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKIAl9CkBAIC0xNTgxLDggKzE1ODEsNiBAQAogCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHViaWZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrICAgICAgICAgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkICAgICAgICAgICA9IG5ld19zeW5jX3JlYWQsCi0JLndyaXRlICAgICAgICAgID0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlciAgICAgID0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKIAkud3JpdGVfaXRlciAgICAgPSB1Ymlmc193cml0ZV9pdGVyLAogCS5tbWFwICAgICAgICAgICA9IHViaWZzX2ZpbGVfbW1hcCwKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2lvLmMgYi9mcy91Ymlmcy9pby5jCmluZGV4IGZiMDhiMGMuLjk3YmU0MTIgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2lvLmMKKysrIGIvZnMvdWJpZnMvaW8uYwpAQCAtODUsNyArODUsNyBAQAogCQljLT5yb19lcnJvciA9IDE7CiAJCWMtPm5vX2Noa19kYXRhX2NyYyA9IDA7CiAJCWMtPnZmc19zYi0+c19mbGFncyB8PSBNU19SRE9OTFk7Ci0JCXViaWZzX3dhcm4oInN3aXRjaGVkIHRvIHJlYWQtb25seSBtb2RlLCBlcnJvciAlZCIsIGVycik7CisJCXViaWZzX3dhcm4oYywgInN3aXRjaGVkIHRvIHJlYWQtb25seSBtb2RlLCBlcnJvciAlZCIsIGVycik7CiAJCWR1bXBfc3RhY2soKTsKIAl9CiB9CkBAIC0xMDcsNyArMTA3LDcgQEAKIAkgKiBAZXZlbl9lYmFkbXNnIGlzIHRydWUuCiAJICovCiAJaWYgKGVyciAmJiAoZXJyICE9IC1FQkFETVNHIHx8IGV2ZW5fZWJhZG1zZykpIHsKLQkJdWJpZnNfZXJyKCJyZWFkaW5nICVkIGJ5dGVzIGZyb20gTEVCICVkOiVkIGZhaWxlZCwgZXJyb3IgJWQiLAorCQl1Ymlmc19lcnIoYywgInJlYWRpbmcgJWQgYnl0ZXMgZnJvbSBMRUIgJWQ6JWQgZmFpbGVkLCBlcnJvciAlZCIsCiAJCQkgIGxlbiwgbG51bSwgb2ZmcywgZXJyKTsKIAkJZHVtcF9zdGFjaygpOwogCX0KQEAgLTEyNyw3ICsxMjcsNyBAQAogCWVsc2UKIAkJZXJyID0gZGJnX2xlYl93cml0ZShjLCBsbnVtLCBidWYsIG9mZnMsIGxlbik7CiAJaWYgKGVycikgewotCQl1Ymlmc19lcnIoIndyaXRpbmcgJWQgYnl0ZXMgdG8gTEVCICVkOiVkIGZhaWxlZCwgZXJyb3IgJWQiLAorCQl1Ymlmc19lcnIoYywgIndyaXRpbmcgJWQgYnl0ZXMgdG8gTEVCICVkOiVkIGZhaWxlZCwgZXJyb3IgJWQiLAogCQkJICBsZW4sIGxudW0sIG9mZnMsIGVycik7CiAJCXViaWZzX3JvX21vZGUoYywgZXJyKTsKIAkJZHVtcF9zdGFjaygpOwpAQCAtMTQ3LDcgKzE0Nyw3IEBACiAJZWxzZQogCQllcnIgPSBkYmdfbGViX2NoYW5nZShjLCBsbnVtLCBidWYsIGxlbik7CiAJaWYgKGVycikgewotCQl1Ymlmc19lcnIoImNoYW5naW5nICVkIGJ5dGVzIGluIExFQiAlZCBmYWlsZWQsIGVycm9yICVkIiwKKwkJdWJpZnNfZXJyKGMsICJjaGFuZ2luZyAlZCBieXRlcyBpbiBMRUIgJWQgZmFpbGVkLCBlcnJvciAlZCIsCiAJCQkgIGxlbiwgbG51bSwgZXJyKTsKIAkJdWJpZnNfcm9fbW9kZShjLCBlcnIpOwogCQlkdW1wX3N0YWNrKCk7CkBAIC0xNjcsNyArMTY3LDcgQEAKIAllbHNlCiAJCWVyciA9IGRiZ19sZWJfdW5tYXAoYywgbG51bSk7CiAJaWYgKGVycikgewotCQl1Ymlmc19lcnIoInVubWFwIExFQiAlZCBmYWlsZWQsIGVycm9yICVkIiwgbG51bSwgZXJyKTsKKwkJdWJpZnNfZXJyKGMsICJ1bm1hcCBMRUIgJWQgZmFpbGVkLCBlcnJvciAlZCIsIGxudW0sIGVycik7CiAJCXViaWZzX3JvX21vZGUoYywgZXJyKTsKIAkJZHVtcF9zdGFjaygpOwogCX0KQEAgLTE4Niw3ICsxODYsNyBAQAogCWVsc2UKIAkJZXJyID0gZGJnX2xlYl9tYXAoYywgbG51bSk7CiAJaWYgKGVycikgewotCQl1Ymlmc19lcnIoIm1hcHBpbmcgTEVCICVkIGZhaWxlZCwgZXJyb3IgJWQiLCBsbnVtLCBlcnIpOworCQl1Ymlmc19lcnIoYywgIm1hcHBpbmcgTEVCICVkIGZhaWxlZCwgZXJyb3IgJWQiLCBsbnVtLCBlcnIpOwogCQl1Ymlmc19yb19tb2RlKGMsIGVycik7CiAJCWR1bXBfc3RhY2soKTsKIAl9CkBAIC0xOTksNyArMTk5LDcgQEAKIAogCWVyciA9IHViaV9pc19tYXBwZWQoYy0+dWJpLCBsbnVtKTsKIAlpZiAoZXJyIDwgMCkgewotCQl1Ymlmc19lcnIoInViaV9pc19tYXBwZWQgZmFpbGVkIGZvciBMRUIgJWQsIGVycm9yICVkIiwKKwkJdWJpZnNfZXJyKGMsICJ1YmlfaXNfbWFwcGVkIGZhaWxlZCBmb3IgTEVCICVkLCBlcnJvciAlZCIsCiAJCQkgIGxudW0sIGVycik7CiAJCWR1bXBfc3RhY2soKTsKIAl9CkBAIC0yNDcsNyArMjQ3LDcgQEAKIAltYWdpYyA9IGxlMzJfdG9fY3B1KGNoLT5tYWdpYyk7CiAJaWYgKG1hZ2ljICE9IFVCSUZTX05PREVfTUFHSUMpIHsKIAkJaWYgKCFxdWlldCkKLQkJCXViaWZzX2VycigiYmFkIG1hZ2ljICUjMDh4LCBleHBlY3RlZCAlIzA4eCIsCisJCQl1Ymlmc19lcnIoYywgImJhZCBtYWdpYyAlIzA4eCwgZXhwZWN0ZWQgJSMwOHgiLAogCQkJCSAgbWFnaWMsIFVCSUZTX05PREVfTUFHSUMpOwogCQllcnIgPSAtRVVDTEVBTjsKIAkJZ290byBvdXQ7CkBAIC0yNTYsNyArMjU2LDcgQEAKIAl0eXBlID0gY2gtPm5vZGVfdHlwZTsKIAlpZiAodHlwZSA8IDAgfHwgdHlwZSA+PSBVQklGU19OT0RFX1RZUEVTX0NOVCkgewogCQlpZiAoIXF1aWV0KQotCQkJdWJpZnNfZXJyKCJiYWQgbm9kZSB0eXBlICVkIiwgdHlwZSk7CisJCQl1Ymlmc19lcnIoYywgImJhZCBub2RlIHR5cGUgJWQiLCB0eXBlKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0yNzksNyArMjc5LDcgQEAKIAlub2RlX2NyYyA9IGxlMzJfdG9fY3B1KGNoLT5jcmMpOwogCWlmIChjcmMgIT0gbm9kZV9jcmMpIHsKIAkJaWYgKCFxdWlldCkKLQkJCXViaWZzX2VycigiYmFkIENSQzogY2FsY3VsYXRlZCAlIzA4eCwgcmVhZCAlIzA4eCIsCisJCQl1Ymlmc19lcnIoYywgImJhZCBDUkM6IGNhbGN1bGF0ZWQgJSMwOHgsIHJlYWQgJSMwOHgiLAogCQkJCSAgY3JjLCBub2RlX2NyYyk7CiAJCWVyciA9IC1FVUNMRUFOOwogCQlnb3RvIG91dDsKQEAgLTI4OSwxMCArMjg5LDEwIEBACiAKIG91dF9sZW46CiAJaWYgKCFxdWlldCkKLQkJdWJpZnNfZXJyKCJiYWQgbm9kZSBsZW5ndGggJWQiLCBub2RlX2xlbik7CisJCXViaWZzX2VycihjLCAiYmFkIG5vZGUgbGVuZ3RoICVkIiwgbm9kZV9sZW4pOwogb3V0OgogCWlmICghcXVpZXQpIHsKLQkJdWJpZnNfZXJyKCJiYWQgbm9kZSBhdCBMRUIgJWQ6JWQiLCBsbnVtLCBvZmZzKTsKKwkJdWJpZnNfZXJyKGMsICJiYWQgbm9kZSBhdCBMRUIgJWQ6JWQiLCBsbnVtLCBvZmZzKTsKIAkJdWJpZnNfZHVtcF9ub2RlKGMsIGJ1Zik7CiAJCWR1bXBfc3RhY2soKTsKIAl9CkBAIC0zNTUsMTEgKzM1NSwxMSBAQAogCiAJaWYgKHVubGlrZWx5KHNxbnVtID49IFNRTlVNX1dBUk5fV0FURVJNQVJLKSkgewogCQlpZiAoc3FudW0gPj0gU1FOVU1fV0FURVJNQVJLKSB7Ci0JCQl1Ymlmc19lcnIoInNlcXVlbmNlIG51bWJlciBvdmVyZmxvdyAlbGx1LCBlbmQgb2YgbGlmZSIsCisJCQl1Ymlmc19lcnIoYywgInNlcXVlbmNlIG51bWJlciBvdmVyZmxvdyAlbGx1LCBlbmQgb2YgbGlmZSIsCiAJCQkJICBzcW51bSk7CiAJCQl1Ymlmc19yb19tb2RlKGMsIC1FSU5WQUwpOwogCQl9Ci0JCXViaWZzX3dhcm4oInJ1bm5pbmcgb3V0IG9mIHNlcXVlbmNlIG51bWJlcnMsIGVuZCBvZiBsaWZlIHNvb24iKTsKKwkJdWJpZnNfd2FybihjLCAicnVubmluZyBvdXQgb2Ygc2VxdWVuY2UgbnVtYmVycywgZW5kIG9mIGxpZmUgc29vbiIpOwogCX0KIAogCXJldHVybiBzcW51bTsKQEAgLTYzNiw3ICs2MzYsNyBAQAogCQllcnIgPSB1Ymlmc193YnVmX3N5bmNfbm9sb2NrKHdidWYpOwogCQltdXRleF91bmxvY2soJndidWYtPmlvX211dGV4KTsKIAkJaWYgKGVycikgewotCQkJdWJpZnNfZXJyKCJjYW5ub3Qgc3luYyB3cml0ZS1idWZmZXIsIGVycm9yICVkIiwgZXJyKTsKKwkJCXViaWZzX2VycihjLCAiY2Fubm90IHN5bmMgd3JpdGUtYnVmZmVyLCBlcnJvciAlZCIsIGVycik7CiAJCQl1Ymlmc19yb19tb2RlKGMsIGVycik7CiAJCQlnb3RvIG91dF90aW1lcnM7CiAJCX0KQEAgLTgzMyw3ICs4MzMsNyBAQAogCXJldHVybiAwOwogCiBvdXQ6Ci0JdWJpZnNfZXJyKCJjYW5ub3Qgd3JpdGUgJWQgYnl0ZXMgdG8gTEVCICVkOiVkLCBlcnJvciAlZCIsCisJdWJpZnNfZXJyKGMsICJjYW5ub3Qgd3JpdGUgJWQgYnl0ZXMgdG8gTEVCICVkOiVkLCBlcnJvciAlZCIsCiAJCSAgbGVuLCB3YnVmLT5sbnVtLCB3YnVmLT5vZmZzLCBlcnIpOwogCXViaWZzX2R1bXBfbm9kZShjLCBidWYpOwogCWR1bXBfc3RhY2soKTsKQEAgLTkzMiwyNyArOTMyLDI3IEBACiAJfQogCiAJaWYgKHR5cGUgIT0gY2gtPm5vZGVfdHlwZSkgewotCQl1Ymlmc19lcnIoImJhZCBub2RlIHR5cGUgKCVkIGJ1dCBleHBlY3RlZCAlZCkiLAorCQl1Ymlmc19lcnIoYywgImJhZCBub2RlIHR5cGUgKCVkIGJ1dCBleHBlY3RlZCAlZCkiLAogCQkJICBjaC0+bm9kZV90eXBlLCB0eXBlKTsKIAkJZ290byBvdXQ7CiAJfQogCiAJZXJyID0gdWJpZnNfY2hlY2tfbm9kZShjLCBidWYsIGxudW0sIG9mZnMsIDAsIDApOwogCWlmIChlcnIpIHsKLQkJdWJpZnNfZXJyKCJleHBlY3RlZCBub2RlIHR5cGUgJWQiLCB0eXBlKTsKKwkJdWJpZnNfZXJyKGMsICJleHBlY3RlZCBub2RlIHR5cGUgJWQiLCB0eXBlKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKIAlybGVuID0gbGUzMl90b19jcHUoY2gtPmxlbik7CiAJaWYgKHJsZW4gIT0gbGVuKSB7Ci0JCXViaWZzX2VycigiYmFkIG5vZGUgbGVuZ3RoICVkLCBleHBlY3RlZCAlZCIsIHJsZW4sIGxlbik7CisJCXViaWZzX2VycihjLCAiYmFkIG5vZGUgbGVuZ3RoICVkLCBleHBlY3RlZCAlZCIsIHJsZW4sIGxlbik7CiAJCWdvdG8gb3V0OwogCX0KIAogCXJldHVybiAwOwogCiBvdXQ6Ci0JdWJpZnNfZXJyKCJiYWQgbm9kZSBhdCBMRUIgJWQ6JWQiLCBsbnVtLCBvZmZzKTsKKwl1Ymlmc19lcnIoYywgImJhZCBub2RlIGF0IExFQiAlZDolZCIsIGxudW0sIG9mZnMpOwogCXViaWZzX2R1bXBfbm9kZShjLCBidWYpOwogCWR1bXBfc3RhY2soKTsKIAlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2lvY3RsLmMgYi9mcy91Ymlmcy9pb2N0bC5jCmluZGV4IDY0OGIxNDMuLjNjN2IyOWQgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2lvY3RsLmMKKysrIGIvZnMvdWJpZnMvaW9jdGwuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJcmV0dXJuIGVycjsKIAogb3V0X3VubG9jazoKLQl1Ymlmc19lcnIoImNhbid0IG1vZGlmeSBpbm9kZSAlbHUgYXR0cmlidXRlcyIsIGlub2RlLT5pX2lubyk7CisJdWJpZnNfZXJyKGMsICJjYW4ndCBtb2RpZnkgaW5vZGUgJWx1IGF0dHJpYnV0ZXMiLCBpbm9kZS0+aV9pbm8pOwogCW11dGV4X3VubG9jaygmdWktPnVpX211dGV4KTsKIAl1Ymlmc19yZWxlYXNlX2J1ZGdldChjLCAmcmVxKTsKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvam91cm5hbC5jIGIvZnMvdWJpZnMvam91cm5hbC5jCmluZGV4IGY2YWMzZjIuLjkwYWUxYTggMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2pvdXJuYWwuYworKysgYi9mcy91Ymlmcy9qb3VybmFsLmMKQEAgLTM2MywxMSArMzYzLDExIEBACiAJCSAqIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIHRoZSBqb3VybmFsIHNpemUgbGltaXRhdGlvbnMKIAkJICogYXJlIHRvbyB0b3VnaC4KIAkJICovCi0JCXViaWZzX2Vycigic3R1Y2sgaW4gc3BhY2UgYWxsb2NhdGlvbiIpOworCQl1Ymlmc19lcnIoYywgInN0dWNrIGluIHNwYWNlIGFsbG9jYXRpb24iKTsKIAkJZXJyID0gLUVOT1NQQzsKIAkJZ290byBvdXQ7CiAJfSBlbHNlIGlmIChjbXRfcmV0cmllcyA+IDMyKQotCQl1Ymlmc193YXJuKCJ0b28gbWFueSBzcGFjZSBhbGxvY2F0aW9uIHJlLXRyaWVzICglZCkiLAorCQl1Ymlmc193YXJuKGMsICJ0b28gbWFueSBzcGFjZSBhbGxvY2F0aW9uIHJlLXRyaWVzICglZCkiLAogCQkJICAgY210X3JldHJpZXMpOwogCiAJZGJnX2pubCgiLUVBR0FJTiwgY29tbWl0IGFuZCByZXRyeSAocmV0cmllZCAlZCB0aW1lcykiLApAQCAtMzgwLDcgKzM4MCw3IEBACiAJZ290byBhZ2FpbjsKIAogb3V0OgotCXViaWZzX2VycigiY2Fubm90IHJlc2VydmUgJWQgYnl0ZXMgaW4gamhlYWQgJWQsIGVycm9yICVkIiwKKwl1Ymlmc19lcnIoYywgImNhbm5vdCByZXNlcnZlICVkIGJ5dGVzIGluIGpoZWFkICVkLCBlcnJvciAlZCIsCiAJCSAgbGVuLCBqaGVhZCwgZXJyKTsKIAlpZiAoZXJyID09IC1FTk9TUEMpIHsKIAkJLyogVGhpcyBhcmUgc29tZSBidWRnZXRpbmcgcHJvYmxlbXMsIHByaW50IHVzZWZ1bCBpbmZvcm1hdGlvbiAqLwpAQCAtNzMxLDcgKzczMSw3IEBACiAJCWNvbXByX3R5cGUgPSB1aS0+Y29tcHJfdHlwZTsKIAogCW91dF9sZW4gPSBkbGVuIC0gVUJJRlNfREFUQV9OT0RFX1NaOwotCXViaWZzX2NvbXByZXNzKGJ1ZiwgbGVuLCAmZGF0YS0+ZGF0YSwgJm91dF9sZW4sICZjb21wcl90eXBlKTsKKwl1Ymlmc19jb21wcmVzcyhjLCBidWYsIGxlbiwgJmRhdGEtPmRhdGEsICZvdXRfbGVuLCAmY29tcHJfdHlwZSk7CiAJdWJpZnNfYXNzZXJ0KG91dF9sZW4gPD0gVUJJRlNfQkxPQ0tfU0laRSk7CiAKIAlkbGVuID0gVUJJRlNfREFUQV9OT0RFX1NaICsgb3V0X2xlbjsKQEAgLTExMDAsNyArMTEwMCw4IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBhbiBpbm9kZSBpcyB0cnVuY2F0ZWQgYW5kIHRoZSBsYXN0IGRhdGEgbm9kZSBvZgogICogdGhlIGlub2RlIGhhcyB0byBiZSByZS1jb21wcmVzc2VkIGFuZCByZS13cml0dGVuLgogICovCi1zdGF0aWMgaW50IHJlY29tcF9kYXRhX25vZGUoc3RydWN0IHViaWZzX2RhdGFfbm9kZSAqZG4sIGludCAqbmV3X2xlbikKK3N0YXRpYyBpbnQgcmVjb21wX2RhdGFfbm9kZShjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywKKwkJCSAgICBzdHJ1Y3QgdWJpZnNfZGF0YV9ub2RlICpkbiwgaW50ICpuZXdfbGVuKQogewogCXZvaWQgKmJ1ZjsKIAlpbnQgZXJyLCBsZW4sIGNvbXByX3R5cGUsIG91dF9sZW47CkBAIC0xMTEyLDExICsxMTEzLDExIEBACiAKIAlsZW4gPSBsZTMyX3RvX2NwdShkbi0+Y2gubGVuKSAtIFVCSUZTX0RBVEFfTk9ERV9TWjsKIAljb21wcl90eXBlID0gbGUxNl90b19jcHUoZG4tPmNvbXByX3R5cGUpOwotCWVyciA9IHViaWZzX2RlY29tcHJlc3MoJmRuLT5kYXRhLCBsZW4sIGJ1ZiwgJm91dF9sZW4sIGNvbXByX3R5cGUpOworCWVyciA9IHViaWZzX2RlY29tcHJlc3MoYywgJmRuLT5kYXRhLCBsZW4sIGJ1ZiwgJm91dF9sZW4sIGNvbXByX3R5cGUpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCi0JdWJpZnNfY29tcHJlc3MoYnVmLCAqbmV3X2xlbiwgJmRuLT5kYXRhLCAmb3V0X2xlbiwgJmNvbXByX3R5cGUpOworCXViaWZzX2NvbXByZXNzKGMsIGJ1ZiwgKm5ld19sZW4sICZkbi0+ZGF0YSwgJm91dF9sZW4sICZjb21wcl90eXBlKTsKIAl1Ymlmc19hc3NlcnQob3V0X2xlbiA8PSBVQklGU19CTE9DS19TSVpFKTsKIAlkbi0+Y29tcHJfdHlwZSA9IGNwdV90b19sZTE2KGNvbXByX3R5cGUpOwogCWRuLT5zaXplID0gY3B1X3RvX2xlMzIoKm5ld19sZW4pOwpAQCAtMTE5MSw3ICsxMTkyLDcgQEAKIAkJCQlpbnQgY29tcHJfdHlwZSA9IGxlMTZfdG9fY3B1KGRuLT5jb21wcl90eXBlKTsKIAogCQkJCWlmIChjb21wcl90eXBlICE9IFVCSUZTX0NPTVBSX05PTkUpIHsKLQkJCQkJZXJyID0gcmVjb21wX2RhdGFfbm9kZShkbiwgJmRsZW4pOworCQkJCQllcnIgPSByZWNvbXBfZGF0YV9ub2RlKGMsIGRuLCAmZGxlbik7CiAJCQkJCWlmIChlcnIpCiAJCQkJCQlnb3RvIG91dF9mcmVlOwogCQkJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9sb2cuYyBiL2ZzL3ViaWZzL2xvZy5jCmluZGV4IGMxNDYyOGYuLjhjNzk1ZTYgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2xvZy5jCisrKyBiL2ZzL3ViaWZzL2xvZy5jCkBAIC02OTYsNyArNjk2LDcgQEAKIAlkZXN0cm95X2RvbmVfdHJlZSgmZG9uZV90cmVlKTsKIAl2ZnJlZShidWYpOwogCWlmICh3cml0ZV9sbnVtID09IGMtPmxoZWFkX2xudW0pIHsKLQkJdWJpZnNfZXJyKCJsb2cgaXMgdG9vIGZ1bGwiKTsKKwkJdWJpZnNfZXJyKGMsICJsb2cgaXMgdG9vIGZ1bGwiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qIFVubWFwIHJlbWFpbmluZyBMRUJzICovCkBAIC03NDMsNyArNzQzLDcgQEAKIAkJCWJ1ZF9ieXRlcyArPSBjLT5sZWJfc2l6ZSAtIGJ1ZC0+c3RhcnQ7CiAKIAlpZiAoYy0+YnVkX2J5dGVzICE9IGJ1ZF9ieXRlcykgewotCQl1Ymlmc19lcnIoImJhZCBidWRfYnl0ZXMgJWxsZCwgY2FsY3VsYXRlZCAlbGxkIiwKKwkJdWJpZnNfZXJyKGMsICJiYWQgYnVkX2J5dGVzICVsbGQsIGNhbGN1bGF0ZWQgJWxsZCIsCiAJCQkgIGMtPmJ1ZF9ieXRlcywgYnVkX2J5dGVzKTsKIAkJZXJyID0gLUVJTlZBTDsKIAl9CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9scHJvcHMuYyBiL2ZzL3ViaWZzL2xwcm9wcy5jCmluZGV4IDQ2MTkwYTcuLmEwMDExYWEgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2xwcm9wcy5jCisrKyBiL2ZzL3ViaWZzL2xwcm9wcy5jCkBAIC02ODIsNyArNjgyLDcgQEAKIG91dDoKIAl1Ymlmc19yZWxlYXNlX2xwcm9wcyhjKTsKIAlpZiAoZXJyKQotCQl1Ymlmc19lcnIoImNhbm5vdCBjaGFuZ2UgcHJvcGVydGllcyBvZiBMRUIgJWQsIGVycm9yICVkIiwKKwkJdWJpZnNfZXJyKGMsICJjYW5ub3QgY2hhbmdlIHByb3BlcnRpZXMgb2YgTEVCICVkLCBlcnJvciAlZCIsCiAJCQkgIGxudW0sIGVycik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTcyMSw3ICs3MjEsNyBAQAogb3V0OgogCXViaWZzX3JlbGVhc2VfbHByb3BzKGMpOwogCWlmIChlcnIpCi0JCXViaWZzX2VycigiY2Fubm90IHVwZGF0ZSBwcm9wZXJ0aWVzIG9mIExFQiAlZCwgZXJyb3IgJWQiLAorCQl1Ymlmc19lcnIoYywgImNhbm5vdCB1cGRhdGUgcHJvcGVydGllcyBvZiBMRUIgJWQsIGVycm9yICVkIiwKIAkJCSAgbG51bSwgZXJyKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtNzQ2LDcgKzc0Niw3IEBACiAJbHBwID0gdWJpZnNfbHB0X2xvb2t1cChjLCBsbnVtKTsKIAlpZiAoSVNfRVJSKGxwcCkpIHsKIAkJZXJyID0gUFRSX0VSUihscHApOwotCQl1Ymlmc19lcnIoImNhbm5vdCByZWFkIHByb3BlcnRpZXMgb2YgTEVCICVkLCBlcnJvciAlZCIsCisJCXViaWZzX2VycihjLCAiY2Fubm90IHJlYWQgcHJvcGVydGllcyBvZiBMRUIgJWQsIGVycm9yICVkIiwKIAkJCSAgbG51bSwgZXJyKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtODczLDEzICs4NzMsMTMgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkobHByb3BzLCAmYy0+ZW1wdHlfbGlzdCwgbGlzdCkgewogCQlpZiAobHByb3BzLT5mcmVlICE9IGMtPmxlYl9zaXplKSB7Ci0JCQl1Ymlmc19lcnIoIm5vbi1lbXB0eSBMRUIgJWQgb24gZW1wdHkgbGlzdCAoZnJlZSAlZCBkaXJ0eSAlZCBmbGFncyAlZCkiLAorCQkJdWJpZnNfZXJyKGMsICJub24tZW1wdHkgTEVCICVkIG9uIGVtcHR5IGxpc3QgKGZyZWUgJWQgZGlydHkgJWQgZmxhZ3MgJWQpIiwKIAkJCQkgIGxwcm9wcy0+bG51bSwgbHByb3BzLT5mcmVlLCBscHJvcHMtPmRpcnR5LAogCQkJCSAgbHByb3BzLT5mbGFncyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAobHByb3BzLT5mbGFncyAmIExQUk9QU19UQUtFTikgewotCQkJdWJpZnNfZXJyKCJ0YWtlbiBMRUIgJWQgb24gZW1wdHkgbGlzdCAoZnJlZSAlZCBkaXJ0eSAlZCBmbGFncyAlZCkiLAorCQkJdWJpZnNfZXJyKGMsICJ0YWtlbiBMRUIgJWQgb24gZW1wdHkgbGlzdCAoZnJlZSAlZCBkaXJ0eSAlZCBmbGFncyAlZCkiLAogCQkJCSAgbHByb3BzLT5sbnVtLCBscHJvcHMtPmZyZWUsIGxwcm9wcy0+ZGlydHksCiAJCQkJICBscHJvcHMtPmZsYWdzKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtODg5LDEzICs4ODksMTMgQEAKIAlpID0gMDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxwcm9wcywgJmMtPmZyZWVhYmxlX2xpc3QsIGxpc3QpIHsKIAkJaWYgKGxwcm9wcy0+ZnJlZSArIGxwcm9wcy0+ZGlydHkgIT0gYy0+bGViX3NpemUpIHsKLQkJCXViaWZzX2Vycigibm9uLWZyZWVhYmxlIExFQiAlZCBvbiBmcmVlYWJsZSBsaXN0IChmcmVlICVkIGRpcnR5ICVkIGZsYWdzICVkKSIsCisJCQl1Ymlmc19lcnIoYywgIm5vbi1mcmVlYWJsZSBMRUIgJWQgb24gZnJlZWFibGUgbGlzdCAoZnJlZSAlZCBkaXJ0eSAlZCBmbGFncyAlZCkiLAogCQkJCSAgbHByb3BzLT5sbnVtLCBscHJvcHMtPmZyZWUsIGxwcm9wcy0+ZGlydHksCiAJCQkJICBscHJvcHMtPmZsYWdzKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChscHJvcHMtPmZsYWdzICYgTFBST1BTX1RBS0VOKSB7Ci0JCQl1Ymlmc19lcnIoInRha2VuIExFQiAlZCBvbiBmcmVlYWJsZSBsaXN0IChmcmVlICVkIGRpcnR5ICVkIGZsYWdzICVkKSIsCisJCQl1Ymlmc19lcnIoYywgInRha2VuIExFQiAlZCBvbiBmcmVlYWJsZSBsaXN0IChmcmVlICVkIGRpcnR5ICVkIGZsYWdzICVkKSIsCiAJCQkJICBscHJvcHMtPmxudW0sIGxwcm9wcy0+ZnJlZSwgbHByb3BzLT5kaXJ0eSwKIAkJCQkgIGxwcm9wcy0+ZmxhZ3MpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC05MDMsNyArOTAzLDcgQEAKIAkJaSArPSAxOwogCX0KIAlpZiAoaSAhPSBjLT5mcmVlYWJsZV9jbnQpIHsKLQkJdWJpZnNfZXJyKCJmcmVlYWJsZSBsaXN0IGNvdW50ICVkIGV4cGVjdGVkICVkIiwgaSwKKwkJdWJpZnNfZXJyKGMsICJmcmVlYWJsZSBsaXN0IGNvdW50ICVkIGV4cGVjdGVkICVkIiwgaSwKIAkJCSAgYy0+ZnJlZWFibGVfY250KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTEyLDI2ICs5MTIsMjYgQEAKIAlsaXN0X2Zvcl9lYWNoKHBvcywgJmMtPmlkeF9nYykKIAkJaSArPSAxOwogCWlmIChpICE9IGMtPmlkeF9nY19jbnQpIHsKLQkJdWJpZnNfZXJyKCJpZHhfZ2MgbGlzdCBjb3VudCAlZCBleHBlY3RlZCAlZCIsIGksCisJCXViaWZzX2VycihjLCAiaWR4X2djIGxpc3QgY291bnQgJWQgZXhwZWN0ZWQgJWQiLCBpLAogCQkJICBjLT5pZHhfZ2NfY250KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShscHJvcHMsICZjLT5mcmRpX2lkeF9saXN0LCBsaXN0KSB7CiAJCWlmIChscHJvcHMtPmZyZWUgKyBscHJvcHMtPmRpcnR5ICE9IGMtPmxlYl9zaXplKSB7Ci0JCQl1Ymlmc19lcnIoIm5vbi1mcmVlYWJsZSBMRUIgJWQgb24gZnJkaV9pZHggbGlzdCAoZnJlZSAlZCBkaXJ0eSAlZCBmbGFncyAlZCkiLAorCQkJdWJpZnNfZXJyKGMsICJub24tZnJlZWFibGUgTEVCICVkIG9uIGZyZGlfaWR4IGxpc3QgKGZyZWUgJWQgZGlydHkgJWQgZmxhZ3MgJWQpIiwKIAkJCQkgIGxwcm9wcy0+bG51bSwgbHByb3BzLT5mcmVlLCBscHJvcHMtPmRpcnR5LAogCQkJCSAgbHByb3BzLT5mbGFncyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQlpZiAobHByb3BzLT5mbGFncyAmIExQUk9QU19UQUtFTikgewotCQkJdWJpZnNfZXJyKCJ0YWtlbiBMRUIgJWQgb24gZnJkaV9pZHggbGlzdCAoZnJlZSAlZCBkaXJ0eSAlZCBmbGFncyAlZCkiLAorCQkJdWJpZnNfZXJyKGMsICJ0YWtlbiBMRUIgJWQgb24gZnJkaV9pZHggbGlzdCAoZnJlZSAlZCBkaXJ0eSAlZCBmbGFncyAlZCkiLAogCQkJCSAgbHByb3BzLT5sbnVtLCBscHJvcHMtPmZyZWUsIGxwcm9wcy0+ZGlydHksCiAJCQkJICBscHJvcHMtPmZsYWdzKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmICghKGxwcm9wcy0+ZmxhZ3MgJiBMUFJPUFNfSU5ERVgpKSB7Ci0JCQl1Ymlmc19lcnIoIm5vbi1pbmRleCBMRUIgJWQgb24gZnJkaV9pZHggbGlzdCAoZnJlZSAlZCBkaXJ0eSAlZCBmbGFncyAlZCkiLAorCQkJdWJpZnNfZXJyKGMsICJub24taW5kZXggTEVCICVkIG9uIGZyZGlfaWR4IGxpc3QgKGZyZWUgJWQgZGlydHkgJWQgZmxhZ3MgJWQpIiwKIAkJCQkgIGxwcm9wcy0+bG51bSwgbHByb3BzLT5mcmVlLCBscHJvcHMtPmRpcnR5LAogCQkJCSAgbHByb3BzLT5mbGFncyk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk0NCwxNSArOTQ0LDE1IEBACiAJCWZvciAoaSA9IDA7IGkgPCBoZWFwLT5jbnQ7IGkrKykgewogCQkJbHByb3BzID0gaGVhcC0+YXJyW2ldOwogCQkJaWYgKCFscHJvcHMpIHsKLQkJCQl1Ymlmc19lcnIoIm51bGwgcHRyIGluIExQVCBoZWFwIGNhdCAlZCIsIGNhdCk7CisJCQkJdWJpZnNfZXJyKGMsICJudWxsIHB0ciBpbiBMUFQgaGVhcCBjYXQgJWQiLCBjYXQpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJaWYgKGxwcm9wcy0+aHBvcyAhPSBpKSB7Ci0JCQkJdWJpZnNfZXJyKCJiYWQgcHRyIGluIExQVCBoZWFwIGNhdCAlZCIsIGNhdCk7CisJCQkJdWJpZnNfZXJyKGMsICJiYWQgcHRyIGluIExQVCBoZWFwIGNhdCAlZCIsIGNhdCk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlpZiAobHByb3BzLT5mbGFncyAmIExQUk9QU19UQUtFTikgewotCQkJCXViaWZzX2VycigidGFrZW4gTEVCIGluIExQVCBoZWFwIGNhdCAlZCIsIGNhdCk7CisJCQkJdWJpZnNfZXJyKGMsICJ0YWtlbiBMRUIgaW4gTFBUIGhlYXAgY2F0ICVkIiwgY2F0KTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfQpAQCAtOTg4LDcgKzk4OCw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCQlpZiAobHByb3BzICE9IGxwKSB7Ci0JCQl1Ymlmc19lcnIoImxwcm9wcyAlenggbHAgJXp4IGxwcm9wcy0+bG51bSAlZCBscC0+bG51bSAlZCIsCisJCQl1Ymlmc19lcnIoYywgImxwcm9wcyAlenggbHAgJXp4IGxwcm9wcy0+bG51bSAlZCBscC0+bG51bSAlZCIsCiAJCQkJICAoc2l6ZV90KWxwcm9wcywgKHNpemVfdClscCwgbHByb3BzLT5sbnVtLAogCQkJCSAgbHAtPmxudW0pOwogCQkJZXJyID0gNDsKQEAgLTEwMDgsNyArMTAwOCw3IEBACiAJfQogb3V0OgogCWlmIChlcnIpIHsKLQkJdWJpZnNfZXJyKCJmYWlsZWQgY2F0ICVkIGhwb3MgJWQgZXJyICVkIiwgY2F0LCBpLCBlcnIpOworCQl1Ymlmc19lcnIoYywgImZhaWxlZCBjYXQgJWQgaHBvcyAlZCBlcnIgJWQiLCBjYXQsIGksIGVycik7CiAJCWR1bXBfc3RhY2soKTsKIAkJdWJpZnNfZHVtcF9oZWFwKGMsIGhlYXAsIGNhdCk7CiAJfQpAQCAtMTAzOSw3ICsxMDM5LDcgQEAKIAlpZiAoY2F0ICE9IExQUk9QU19VTkNBVCkgewogCQljYXQgPSB1Ymlmc19jYXRlZ29yaXplX2xwcm9wcyhjLCBscCk7CiAJCWlmIChjYXQgIT0gKGxwLT5mbGFncyAmIExQUk9QU19DQVRfTUFTSykpIHsKLQkJCXViaWZzX2VycigiYmFkIExFQiBjYXRlZ29yeSAlZCBleHBlY3RlZCAlZCIsCisJCQl1Ymlmc19lcnIoYywgImJhZCBMRUIgY2F0ZWdvcnkgJWQgZXhwZWN0ZWQgJWQiLAogCQkJCSAgKGxwLT5mbGFncyAmIExQUk9QU19DQVRfTUFTSyksIGNhdCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtMTA3NCw3ICsxMDc0LDcgQEAKIAkJCQl9CiAJCQl9CiAJCQlpZiAoIWZvdW5kKSB7Ci0JCQkJdWJpZnNfZXJyKCJiYWQgTFBUIGxpc3QgKGNhdGVnb3J5ICVkKSIsIGNhdCk7CisJCQkJdWJpZnNfZXJyKGMsICJiYWQgTFBUIGxpc3QgKGNhdGVnb3J5ICVkKSIsIGNhdCk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCX0KQEAgLTEwODYsNyArMTA4Niw3IEBACiAKIAkJaWYgKChscC0+aHBvcyAhPSAtMSAmJiBoZWFwLT5hcnJbbHAtPmhwb3NdLT5sbnVtICE9IGxudW0pIHx8CiAJCSAgICBscCAhPSBoZWFwLT5hcnJbbHAtPmhwb3NdKSB7Ci0JCQl1Ymlmc19lcnIoImJhZCBMUFQgaGVhcCAoY2F0ZWdvcnkgJWQpIiwgY2F0KTsKKwkJCXViaWZzX2VycihjLCAiYmFkIExQVCBoZWFwIChjYXRlZ29yeSAlZCkiLCBjYXQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0xMTMzLDcgKzExMzMsNyBAQAogCQkJaXNfaWR4ID0gKHNub2QtPnR5cGUgPT0gVUJJRlNfSURYX05PREUpID8gMSA6IDA7CiAKIAkJaWYgKGlzX2lkeCAmJiBzbm9kLT50eXBlICE9IFVCSUZTX0lEWF9OT0RFKSB7Ci0JCQl1Ymlmc19lcnIoImluZGV4aW5nIG5vZGUgaW4gZGF0YSBMRUIgJWQ6JWQiLAorCQkJdWJpZnNfZXJyKGMsICJpbmRleGluZyBub2RlIGluIGRhdGEgTEVCICVkOiVkIiwKIAkJCQkgIGxudW0sIHNub2QtPm9mZnMpOwogCQkJZ290byBvdXRfZGVzdHJveTsKIAkJfQpAQCAtMTE1OSw3ICsxMTU5LDcgQEAKIAogCWlmIChmcmVlID4gYy0+bGViX3NpemUgfHwgZnJlZSA8IDAgfHwgZGlydHkgPiBjLT5sZWJfc2l6ZSB8fAogCSAgICBkaXJ0eSA8IDApIHsKLQkJdWJpZnNfZXJyKCJiYWQgY2FsY3VsYXRlZCBhY2NvdW50aW5nIGZvciBMRUIgJWQ6IGZyZWUgJWQsIGRpcnR5ICVkIiwKKwkJdWJpZnNfZXJyKGMsICJiYWQgY2FsY3VsYXRlZCBhY2NvdW50aW5nIGZvciBMRUIgJWQ6IGZyZWUgJWQsIGRpcnR5ICVkIiwKIAkJCSAgbG51bSwgZnJlZSwgZGlydHkpOwogCQlnb3RvIG91dF9kZXN0cm95OwogCX0KQEAgLTEyMDYsMTMgKzEyMDYsMTMgQEAKIAkJCS8qIEZyZWUgYnV0IG5vdCB1bm1hcHBlZCBMRUIsIGl0J3MgZmluZSAqLwogCQkJaXNfaWR4ID0gMDsKIAkJZWxzZSB7Ci0JCQl1Ymlmc19lcnIoImluZGV4aW5nIG5vZGUgd2l0aG91dCBpbmRleGluZyBmbGFnIik7CisJCQl1Ymlmc19lcnIoYywgImluZGV4aW5nIG5vZGUgd2l0aG91dCBpbmRleGluZyBmbGFnIik7CiAJCQlnb3RvIG91dF9wcmludDsKIAkJfQogCX0KIAogCWlmICghaXNfaWR4ICYmIChscC0+ZmxhZ3MgJiBMUFJPUFNfSU5ERVgpKSB7Ci0JCXViaWZzX2VycigiZGF0YSBub2RlIHdpdGggaW5kZXhpbmcgZmxhZyIpOworCQl1Ymlmc19lcnIoYywgImRhdGEgbm9kZSB3aXRoIGluZGV4aW5nIGZsYWciKTsKIAkJZ290byBvdXRfcHJpbnQ7CiAJfQogCkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogCXJldHVybiBMUFRfU0NBTl9DT05USU5VRTsKIAogb3V0X3ByaW50OgotCXViaWZzX2VycigiYmFkIGFjY291bnRpbmcgb2YgTEVCICVkOiBmcmVlICVkLCBkaXJ0eSAlZCBmbGFncyAlI3gsIHNob3VsZCBiZSBmcmVlICVkLCBkaXJ0eSAlZCIsCisJdWJpZnNfZXJyKGMsICJiYWQgYWNjb3VudGluZyBvZiBMRUIgJWQ6IGZyZWUgJWQsIGRpcnR5ICVkIGZsYWdzICUjeCwgc2hvdWxkIGJlIGZyZWUgJWQsIGRpcnR5ICVkIiwKIAkJICBsbnVtLCBscC0+ZnJlZSwgbHAtPmRpcnR5LCBscC0+ZmxhZ3MsIGZyZWUsIGRpcnR5KTsKIAl1Ymlmc19kdW1wX2xlYihjLCBsbnVtKTsKIG91dF9kZXN0cm95OgpAQCAtMTI5MywxMSArMTI5MywxMSBAQAogCSAgICBsc3QudG90YWxfZnJlZSAhPSBjLT5sc3QudG90YWxfZnJlZSB8fAogCSAgICBsc3QudG90YWxfZGlydHkgIT0gYy0+bHN0LnRvdGFsX2RpcnR5IHx8CiAJICAgIGxzdC50b3RhbF91c2VkICE9IGMtPmxzdC50b3RhbF91c2VkKSB7Ci0JCXViaWZzX2VycigiYmFkIG92ZXJhbGwgYWNjb3VudGluZyIpOwotCQl1Ymlmc19lcnIoImNhbGN1bGF0ZWQ6IGVtcHR5X2xlYnMgJWQsIGlkeF9sZWJzICVkLCB0b3RhbF9mcmVlICVsbGQsIHRvdGFsX2RpcnR5ICVsbGQsIHRvdGFsX3VzZWQgJWxsZCIsCisJCXViaWZzX2VycihjLCAiYmFkIG92ZXJhbGwgYWNjb3VudGluZyIpOworCQl1Ymlmc19lcnIoYywgImNhbGN1bGF0ZWQ6IGVtcHR5X2xlYnMgJWQsIGlkeF9sZWJzICVkLCB0b3RhbF9mcmVlICVsbGQsIHRvdGFsX2RpcnR5ICVsbGQsIHRvdGFsX3VzZWQgJWxsZCIsCiAJCQkgIGxzdC5lbXB0eV9sZWJzLCBsc3QuaWR4X2xlYnMsIGxzdC50b3RhbF9mcmVlLAogCQkJICBsc3QudG90YWxfZGlydHksIGxzdC50b3RhbF91c2VkKTsKLQkJdWJpZnNfZXJyKCJyZWFkIGZyb20gbHByb3BzOiBlbXB0eV9sZWJzICVkLCBpZHhfbGVicyAlZCwgdG90YWxfZnJlZSAlbGxkLCB0b3RhbF9kaXJ0eSAlbGxkLCB0b3RhbF91c2VkICVsbGQiLAorCQl1Ymlmc19lcnIoYywgInJlYWQgZnJvbSBscHJvcHM6IGVtcHR5X2xlYnMgJWQsIGlkeF9sZWJzICVkLCB0b3RhbF9mcmVlICVsbGQsIHRvdGFsX2RpcnR5ICVsbGQsIHRvdGFsX3VzZWQgJWxsZCIsCiAJCQkgIGMtPmxzdC5lbXB0eV9sZWJzLCBjLT5sc3QuaWR4X2xlYnMsIGMtPmxzdC50b3RhbF9mcmVlLAogCQkJICBjLT5sc3QudG90YWxfZGlydHksIGMtPmxzdC50b3RhbF91c2VkKTsKIAkJZXJyID0gLUVJTlZBTDsKQEAgLTEzMDYsMTAgKzEzMDYsMTAgQEAKIAogCWlmIChsc3QudG90YWxfZGVhZCAhPSBjLT5sc3QudG90YWxfZGVhZCB8fAogCSAgICBsc3QudG90YWxfZGFyayAhPSBjLT5sc3QudG90YWxfZGFyaykgewotCQl1Ymlmc19lcnIoImJhZCBkZWFkL2Rhcmsgc3BhY2UgYWNjb3VudGluZyIpOwotCQl1Ymlmc19lcnIoImNhbGN1bGF0ZWQ6IHRvdGFsX2RlYWQgJWxsZCwgdG90YWxfZGFyayAlbGxkIiwKKwkJdWJpZnNfZXJyKGMsICJiYWQgZGVhZC9kYXJrIHNwYWNlIGFjY291bnRpbmciKTsKKwkJdWJpZnNfZXJyKGMsICJjYWxjdWxhdGVkOiB0b3RhbF9kZWFkICVsbGQsIHRvdGFsX2RhcmsgJWxsZCIsCiAJCQkgIGxzdC50b3RhbF9kZWFkLCBsc3QudG90YWxfZGFyayk7Ci0JCXViaWZzX2VycigicmVhZCBmcm9tIGxwcm9wczogdG90YWxfZGVhZCAlbGxkLCB0b3RhbF9kYXJrICVsbGQiLAorCQl1Ymlmc19lcnIoYywgInJlYWQgZnJvbSBscHJvcHM6IHRvdGFsX2RlYWQgJWxsZCwgdG90YWxfZGFyayAlbGxkIiwKIAkJCSAgYy0+bHN0LnRvdGFsX2RlYWQsIGMtPmxzdC50b3RhbF9kYXJrKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9scHQuYyBiL2ZzL3ViaWZzL2xwdC5jCmluZGV4IDQyMWJkMGEuLmRjOWYyN2UgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL2xwdC5jCisrKyBiL2ZzL3ViaWZzL2xwdC5jCkBAIC0xNDUsMTMgKzE0NSwxMyBAQAogCXN6ID0gYy0+bHB0X3N6ICogMjsgLyogTXVzdCBoYXZlIGF0IGxlYXN0IDIgdGltZXMgdGhlIHNpemUgKi8KIAlsZWJzX25lZWRlZCA9IGRpdl91NjQoc3ogKyBjLT5sZWJfc2l6ZSAtIDEsIGMtPmxlYl9zaXplKTsKIAlpZiAobGVic19uZWVkZWQgPiBjLT5scHRfbGVicykgewotCQl1Ymlmc19lcnIoInRvbyBmZXcgTFBUIExFQnMiKTsKKwkJdWJpZnNfZXJyKGMsICJ0b28gZmV3IExQVCBMRUJzIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCS8qIFZlcmlmeSB0aGF0IGx0YWIgZml0cyBpbiBhIHNpbmdsZSBMRUIgKHNpbmNlIGx0YWIgaXMgYSBzaW5nbGUgbm9kZSAqLwogCWlmIChjLT5sdGFiX3N6ID4gYy0+bGViX3NpemUpIHsKLQkJdWJpZnNfZXJyKCJMUFQgbHRhYiB0b28gYmlnIik7CisJCXViaWZzX2VycihjLCAiTFBUIGx0YWIgdG9vIGJpZyIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTIxMyw3ICsyMTMsNyBAQAogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKGMtPmx0YWJfc3ogPiBjLT5sZWJfc2l6ZSkgewotCQkJdWJpZnNfZXJyKCJMUFQgbHRhYiB0b28gYmlnIik7CisJCQl1Ymlmc19lcnIoYywgIkxQVCBsdGFiIHRvbyBiaWciKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCSptYWluX2xlYnMgPSBjLT5tYWluX2xlYnM7CkBAIC05MTEsNyArOTExLDcgQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgJTAgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KLXN0YXRpYyBpbnQgY2hlY2tfbHB0X2NyYyh2b2lkICpidWYsIGludCBsZW4pCitzdGF0aWMgaW50IGNoZWNrX2xwdF9jcmMoY29uc3Qgc3RydWN0IHViaWZzX2luZm8gKmMsIHZvaWQgKmJ1ZiwgaW50IGxlbikKIHsKIAlpbnQgcG9zID0gMDsKIAl1aW50OF90ICphZGRyID0gYnVmOwpAQCAtOTIxLDggKzkyMSw4IEBACiAJY2FsY19jcmMgPSBjcmMxNigtMSwgYnVmICsgVUJJRlNfTFBUX0NSQ19CWVRFUywKIAkJCSBsZW4gLSBVQklGU19MUFRfQ1JDX0JZVEVTKTsKIAlpZiAoY3JjICE9IGNhbGNfY3JjKSB7Ci0JCXViaWZzX2VycigiaW52YWxpZCBjcmMgaW4gTFBUIG5vZGU6IGNyYyAlaHggY2FsYyAlaHgiLCBjcmMsCi0JCQkgIGNhbGNfY3JjKTsKKwkJdWJpZnNfZXJyKGMsICJpbnZhbGlkIGNyYyBpbiBMUFQgbm9kZTogY3JjICVoeCBjYWxjICVoeCIsCisJCQkgIGNyYywgY2FsY19jcmMpOwogCQlkdW1wX3N0YWNrKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTkzOCwxNCArOTM4LDE1IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiByZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgogICovCi1zdGF0aWMgaW50IGNoZWNrX2xwdF90eXBlKHVpbnQ4X3QgKiphZGRyLCBpbnQgKnBvcywgaW50IHR5cGUpCitzdGF0aWMgaW50IGNoZWNrX2xwdF90eXBlKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCB1aW50OF90ICoqYWRkciwKKwkJCSAgaW50ICpwb3MsIGludCB0eXBlKQogewogCWludCBub2RlX3R5cGU7CiAKIAlub2RlX3R5cGUgPSB1Ymlmc191bnBhY2tfYml0cyhhZGRyLCBwb3MsIFVCSUZTX0xQVF9UWVBFX0JJVFMpOwogCWlmIChub2RlX3R5cGUgIT0gdHlwZSkgewotCQl1Ymlmc19lcnIoImludmFsaWQgdHlwZSAoJWQpIGluIExQVCBub2RlIHR5cGUgJWQiLCBub2RlX3R5cGUsCi0JCQkgIHR5cGUpOworCQl1Ymlmc19lcnIoYywgImludmFsaWQgdHlwZSAoJWQpIGluIExQVCBub2RlIHR5cGUgJWQiLAorCQkJICBub2RlX3R5cGUsIHR5cGUpOwogCQlkdW1wX3N0YWNrKCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTk2Niw3ICs5NjcsNyBAQAogCXVpbnQ4X3QgKmFkZHIgPSBidWYgKyBVQklGU19MUFRfQ1JDX0JZVEVTOwogCWludCBpLCBwb3MgPSAwLCBlcnI7CiAKLQllcnIgPSBjaGVja19scHRfdHlwZSgmYWRkciwgJnBvcywgVUJJRlNfTFBUX1BOT0RFKTsKKwllcnIgPSBjaGVja19scHRfdHlwZShjLCAmYWRkciwgJnBvcywgVUJJRlNfTFBUX1BOT0RFKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCWlmIChjLT5iaWdfbHB0KQpAQCAtOTg1LDcgKzk4Niw3IEBACiAJCQlscHJvcHMtPmZsYWdzID0gMDsKIAkJbHByb3BzLT5mbGFncyB8PSB1Ymlmc19jYXRlZ29yaXplX2xwcm9wcyhjLCBscHJvcHMpOwogCX0KLQllcnIgPSBjaGVja19scHRfY3JjKGJ1ZiwgYy0+cG5vZGVfc3opOworCWVyciA9IGNoZWNrX2xwdF9jcmMoYywgYnVmLCBjLT5wbm9kZV9zeik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTAwMyw3ICsxMDA0LDcgQEAKIAl1aW50OF90ICphZGRyID0gYnVmICsgVUJJRlNfTFBUX0NSQ19CWVRFUzsKIAlpbnQgaSwgcG9zID0gMCwgZXJyOwogCi0JZXJyID0gY2hlY2tfbHB0X3R5cGUoJmFkZHIsICZwb3MsIFVCSUZTX0xQVF9OTk9ERSk7CisJZXJyID0gY2hlY2tfbHB0X3R5cGUoYywgJmFkZHIsICZwb3MsIFVCSUZTX0xQVF9OTk9ERSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAlpZiAoYy0+YmlnX2xwdCkKQEAgLTEwMTksNyArMTAyMCw3IEBACiAJCW5ub2RlLT5uYnJhbmNoW2ldLm9mZnMgPSB1Ymlmc191bnBhY2tfYml0cygmYWRkciwgJnBvcywKIAkJCQkJCSAgICAgYy0+bHB0X29mZnNfYml0cyk7CiAJfQotCWVyciA9IGNoZWNrX2xwdF9jcmMoYnVmLCBjLT5ubm9kZV9zeik7CisJZXJyID0gY2hlY2tfbHB0X2NyYyhjLCBidWYsIGMtPm5ub2RlX3N6KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xMDM1LDcgKzEwMzYsNyBAQAogCXVpbnQ4X3QgKmFkZHIgPSBidWYgKyBVQklGU19MUFRfQ1JDX0JZVEVTOwogCWludCBpLCBwb3MgPSAwLCBlcnI7CiAKLQllcnIgPSBjaGVja19scHRfdHlwZSgmYWRkciwgJnBvcywgVUJJRlNfTFBUX0xUQUIpOworCWVyciA9IGNoZWNrX2xwdF90eXBlKGMsICZhZGRyLCAmcG9zLCBVQklGU19MUFRfTFRBQik7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAlmb3IgKGkgPSAwOyBpIDwgYy0+bHB0X2xlYnM7IGkrKykgewpAQCAtMTA1MSw3ICsxMDUyLDcgQEAKIAkJYy0+bHRhYltpXS50Z2MgPSAwOwogCQljLT5sdGFiW2ldLmNtdCA9IDA7CiAJfQotCWVyciA9IGNoZWNrX2xwdF9jcmMoYnVmLCBjLT5sdGFiX3N6KTsKKwllcnIgPSBjaGVja19scHRfY3JjKGMsIGJ1ZiwgYy0+bHRhYl9zeik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTA2Nyw3ICsxMDY4LDcgQEAKIAl1aW50OF90ICphZGRyID0gYnVmICsgVUJJRlNfTFBUX0NSQ19CWVRFUzsKIAlpbnQgaSwgcG9zID0gMCwgZXJyOwogCi0JZXJyID0gY2hlY2tfbHB0X3R5cGUoJmFkZHIsICZwb3MsIFVCSUZTX0xQVF9MU0FWRSk7CisJZXJyID0gY2hlY2tfbHB0X3R5cGUoYywgJmFkZHIsICZwb3MsIFVCSUZTX0xQVF9MU0FWRSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAlmb3IgKGkgPSAwOyBpIDwgYy0+bHNhdmVfY250OyBpKyspIHsKQEAgLTEwNzcsNyArMTA3OCw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYy0+bHNhdmVbaV0gPSBsbnVtOwogCX0KLQllcnIgPSBjaGVja19scHRfY3JjKGJ1ZiwgYy0+bHNhdmVfc3opOworCWVyciA9IGNoZWNrX2xwdF9jcmMoYywgYnVmLCBjLT5sc2F2ZV9zeik7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTI0Myw3ICsxMjQ0LDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0OgotCXViaWZzX2VycigiZXJyb3IgJWQgcmVhZGluZyBubm9kZSBhdCAlZDolZCIsIGVyciwgbG51bSwgb2Zmcyk7CisJdWJpZnNfZXJyKGMsICJlcnJvciAlZCByZWFkaW5nIG5ub2RlIGF0ICVkOiVkIiwgZXJyLCBsbnVtLCBvZmZzKTsKIAlkdW1wX3N0YWNrKCk7CiAJa2ZyZWUobm5vZGUpOwogCXJldHVybiBlcnI7CkBAIC0xMzA4LDEwICsxMzA5LDEwIEBACiAJcmV0dXJuIDA7CiAKIG91dDoKLQl1Ymlmc19lcnIoImVycm9yICVkIHJlYWRpbmcgcG5vZGUgYXQgJWQ6JWQiLCBlcnIsIGxudW0sIG9mZnMpOworCXViaWZzX2VycihjLCAiZXJyb3IgJWQgcmVhZGluZyBwbm9kZSBhdCAlZDolZCIsIGVyciwgbG51bSwgb2Zmcyk7CiAJdWJpZnNfZHVtcF9wbm9kZShjLCBwbm9kZSwgcGFyZW50LCBpaXApOwogCWR1bXBfc3RhY2soKTsKLQl1Ymlmc19lcnIoImNhbGMgbnVtOiAlZCIsIGNhbGNfcG5vZGVfbnVtX2Zyb21fcGFyZW50KGMsIHBhcmVudCwgaWlwKSk7CisJdWJpZnNfZXJyKGMsICJjYWxjIG51bTogJWQiLCBjYWxjX3Bub2RlX251bV9mcm9tX3BhcmVudChjLCBwYXJlbnQsIGlpcCkpOwogCWtmcmVlKHBub2RlKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjA5NSw3ICsyMDk2LDcgQEAKIAlpbnQgaTsKIAogCWlmIChwbm9kZS0+bnVtICE9IGNvbCkgewotCQl1Ymlmc19lcnIoInBub2RlIG51bSAlZCBleHBlY3RlZCAlZCBwYXJlbnQgbnVtICVkIGlpcCAlZCIsCisJCXViaWZzX2VycihjLCAicG5vZGUgbnVtICVkIGV4cGVjdGVkICVkIHBhcmVudCBudW0gJWQgaWlwICVkIiwKIAkJCSAgcG5vZGUtPm51bSwgY29sLCBwbm9kZS0+cGFyZW50LT5udW0sIHBub2RlLT5paXApOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yMTEwLDEzICsyMTExLDEzIEBACiAJCWlmIChsbnVtID49IGMtPmxlYl9jbnQpCiAJCQljb250aW51ZTsKIAkJaWYgKGxwcm9wcy0+bG51bSAhPSBsbnVtKSB7Ci0JCQl1Ymlmc19lcnIoImJhZCBMRUIgbnVtYmVyICVkIGV4cGVjdGVkICVkIiwKKwkJCXViaWZzX2VycihjLCAiYmFkIExFQiBudW1iZXIgJWQgZXhwZWN0ZWQgJWQiLAogCQkJCSAgbHByb3BzLT5sbnVtLCBsbnVtKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChscHJvcHMtPmZsYWdzICYgTFBST1BTX1RBS0VOKSB7CiAJCQlpZiAoY2F0ICE9IExQUk9QU19VTkNBVCkgewotCQkJCXViaWZzX2VycigiTEVCICVkIHRha2VuIGJ1dCBub3QgdW5jYXQgJWQiLAorCQkJCXViaWZzX2VycihjLCAiTEVCICVkIHRha2VuIGJ1dCBub3QgdW5jYXQgJWQiLAogCQkJCQkgIGxwcm9wcy0+bG51bSwgY2F0KTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KQEAgLTIxMjksNyArMjEzMCw3IEBACiAJCQljYXNlIExQUk9QU19GUkRJX0lEWDoKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6Ci0JCQkJdWJpZnNfZXJyKCJMRUIgJWQgaW5kZXggYnV0IGNhdCAlZCIsCisJCQkJdWJpZnNfZXJyKGMsICJMRUIgJWQgaW5kZXggYnV0IGNhdCAlZCIsCiAJCQkJCSAgbHByb3BzLT5sbnVtLCBjYXQpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQpAQCAtMjE0Miw3ICsyMTQzLDcgQEAKIAkJCWNhc2UgTFBST1BTX0ZSRUVBQkxFOgogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQl1Ymlmc19lcnIoIkxFQiAlZCBub3QgaW5kZXggYnV0IGNhdCAlZCIsCisJCQkJdWJpZnNfZXJyKGMsICJMRUIgJWQgbm90IGluZGV4IGJ1dCBjYXQgJWQiLAogCQkJCQkgIGxwcm9wcy0+bG51bSwgY2F0KTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KQEAgLTIxODMsMTQgKzIxODQsMTQgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWlmICghZm91bmQpIHsKLQkJCXViaWZzX2VycigiTEVCICVkIGNhdCAlZCBub3QgZm91bmQgaW4gY2F0IGhlYXAvbGlzdCIsCisJCQl1Ymlmc19lcnIoYywgIkxFQiAlZCBjYXQgJWQgbm90IGZvdW5kIGluIGNhdCBoZWFwL2xpc3QiLAogCQkJCSAgbHByb3BzLT5sbnVtLCBjYXQpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJc3dpdGNoIChjYXQpIHsKIAkJY2FzZSBMUFJPUFNfRU1QVFk6CiAJCQlpZiAobHByb3BzLT5mcmVlICE9IGMtPmxlYl9zaXplKSB7Ci0JCQkJdWJpZnNfZXJyKCJMRUIgJWQgY2F0ICVkIGZyZWUgJWQgZGlydHkgJWQiLAorCQkJCXViaWZzX2VycihjLCAiTEVCICVkIGNhdCAlZCBmcmVlICVkIGRpcnR5ICVkIiwKIAkJCQkJICBscHJvcHMtPmxudW0sIGNhdCwgbHByb3BzLT5mcmVlLAogCQkJCQkgIGxwcm9wcy0+ZGlydHkpOwogCQkJCXJldHVybiAtRUlOVkFMOwpAQCAtMjE5OSw3ICsyMjAwLDcgQEAKIAkJY2FzZSBMUFJPUFNfRlJFRUFCTEU6CiAJCWNhc2UgTFBST1BTX0ZSRElfSURYOgogCQkJaWYgKGxwcm9wcy0+ZnJlZSArIGxwcm9wcy0+ZGlydHkgIT0gYy0+bGViX3NpemUpIHsKLQkJCQl1Ymlmc19lcnIoIkxFQiAlZCBjYXQgJWQgZnJlZSAlZCBkaXJ0eSAlZCIsCisJCQkJdWJpZnNfZXJyKGMsICJMRUIgJWQgY2F0ICVkIGZyZWUgJWQgZGlydHkgJWQiLAogCQkJCQkgIGxwcm9wcy0+bG51bSwgY2F0LCBscHJvcHMtPmZyZWUsCiAJCQkJCSAgbHByb3BzLT5kaXJ0eSk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMjM2LDcgKzIyMzcsNyBAQAogCQkJLyogY25vZGUgaXMgYSBubm9kZSAqLwogCQkJbnVtID0gY2FsY19ubm9kZV9udW0ocm93LCBjb2wpOwogCQkJaWYgKGNub2RlLT5udW0gIT0gbnVtKSB7Ci0JCQkJdWJpZnNfZXJyKCJubm9kZSBudW0gJWQgZXhwZWN0ZWQgJWQgcGFyZW50IG51bSAlZCBpaXAgJWQiLAorCQkJCXViaWZzX2VycihjLCAibm5vZGUgbnVtICVkIGV4cGVjdGVkICVkIHBhcmVudCBudW0gJWQgaWlwICVkIiwKIAkJCQkJICBjbm9kZS0+bnVtLCBudW0sCiAJCQkJCSAgKG5ub2RlID8gbm5vZGUtPm51bSA6IDApLCBjbm9kZS0+aWlwKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL2xwdF9jb21taXQuYyBiL2ZzL3ViaWZzL2xwdF9jb21taXQuYwppbmRleCBkOWMwMjkyLi5jZTg5YmRjIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9scHRfY29tbWl0LmMKKysrIGIvZnMvdWJpZnMvbHB0X2NvbW1pdC5jCkBAIC0zMTksNyArMzE5LDcgQEAKIAlyZXR1cm4gMDsKIAogbm9fc3BhY2U6Ci0JdWJpZnNfZXJyKCJMUFQgb3V0IG9mIHNwYWNlIGF0IExFQiAlZDolZCBuZWVkaW5nICVkLCBkb25lX2x0YWIgJWQsIGRvbmVfbHNhdmUgJWQiLAorCXViaWZzX2VycihjLCAiTFBUIG91dCBvZiBzcGFjZSBhdCBMRUIgJWQ6JWQgbmVlZGluZyAlZCwgZG9uZV9sdGFiICVkLCBkb25lX2xzYXZlICVkIiwKIAkJICBsbnVtLCBvZmZzLCBsZW4sIGRvbmVfbHRhYiwgZG9uZV9sc2F2ZSk7CiAJdWJpZnNfZHVtcF9scHRfaW5mbyhjKTsKIAl1Ymlmc19kdW1wX2xwdF9sZWJzKGMpOwpAQCAtNTQzLDcgKzU0Myw3IEBACiAJcmV0dXJuIDA7CiAKIG5vX3NwYWNlOgotCXViaWZzX2VycigiTFBUIG91dCBvZiBzcGFjZSBtaXNtYXRjaCBhdCBMRUIgJWQ6JWQgbmVlZGluZyAlZCwgZG9uZV9sdGFiICVkLCBkb25lX2xzYXZlICVkIiwKKwl1Ymlmc19lcnIoYywgIkxQVCBvdXQgb2Ygc3BhY2UgbWlzbWF0Y2ggYXQgTEVCICVkOiVkIG5lZWRpbmcgJWQsIGRvbmVfbHRhYiAlZCwgZG9uZV9sc2F2ZSAlZCIsCiAJCSAgbG51bSwgb2ZmcywgbGVuLCBkb25lX2x0YWIsIGRvbmVfbHNhdmUpOwogCXViaWZzX2R1bXBfbHB0X2luZm8oYyk7CiAJdWJpZnNfZHVtcF9scHRfbGVicyhjKTsKQEAgLTE2MzgsNyArMTYzOCw3IEBACiAKIAlidWYgPSBwID0gX192bWFsbG9jKGMtPmxlYl9zaXplLCBHRlBfTk9GUywgUEFHRV9LRVJORUwpOwogCWlmICghYnVmKSB7Ci0JCXViaWZzX2VycigiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgbHRhYiBjaGVja2luZyIpOworCQl1Ymlmc19lcnIoYywgImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGx0YWIgY2hlY2tpbmciKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xNjYwLDE4ICsxNjYwLDE4IEBACiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlpZiAoIWRiZ19pc19hbGxfZmYocCwgbGVuKSkgewotCQkJCXViaWZzX2VycigiaW52YWxpZCBlbXB0eSBzcGFjZSBpbiBMRUIgJWQgYXQgJWQiLAorCQkJCXViaWZzX2VycihjLCAiaW52YWxpZCBlbXB0eSBzcGFjZSBpbiBMRUIgJWQgYXQgJWQiLAogCQkJCQkgIGxudW0sIGMtPmxlYl9zaXplIC0gbGVuKTsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJfQogCQkJaSA9IGxudW0gLSBjLT5scHRfZmlyc3Q7CiAJCQlpZiAobGVuICE9IGMtPmx0YWJbaV0uZnJlZSkgewotCQkJCXViaWZzX2VycigiaW52YWxpZCBmcmVlIHNwYWNlIGluIExFQiAlZCAoZnJlZSAlZCwgZXhwZWN0ZWQgJWQpIiwKKwkJCQl1Ymlmc19lcnIoYywgImludmFsaWQgZnJlZSBzcGFjZSBpbiBMRUIgJWQgKGZyZWUgJWQsIGV4cGVjdGVkICVkKSIsCiAJCQkJCSAgbG51bSwgbGVuLCBjLT5sdGFiW2ldLmZyZWUpOwogCQkJCWVyciA9IC1FSU5WQUw7CiAJCQl9CiAJCQlpZiAoZGlydHkgIT0gYy0+bHRhYltpXS5kaXJ0eSkgewotCQkJCXViaWZzX2VycigiaW52YWxpZCBkaXJ0eSBzcGFjZSBpbiBMRUIgJWQgKGRpcnR5ICVkLCBleHBlY3RlZCAlZCkiLAorCQkJCXViaWZzX2VycihjLCAiaW52YWxpZCBkaXJ0eSBzcGFjZSBpbiBMRUIgJWQgKGRpcnR5ICVkLCBleHBlY3RlZCAlZCkiLAogCQkJCQkgIGxudW0sIGRpcnR5LCBjLT5sdGFiW2ldLmRpcnR5KTsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJfQpAQCAtMTcyNSw3ICsxNzI1LDcgQEAKIAlmb3IgKGxudW0gPSBjLT5scHRfZmlyc3Q7IGxudW0gPD0gYy0+bHB0X2xhc3Q7IGxudW0rKykgewogCQllcnIgPSBkYmdfY2hlY2tfbHRhYl9sbnVtKGMsIGxudW0pOwogCQlpZiAoZXJyKSB7Ci0JCQl1Ymlmc19lcnIoImZhaWxlZCBhdCBMRUIgJWQiLCBsbnVtKTsKKwkJCXViaWZzX2VycihjLCAiZmFpbGVkIGF0IExFQiAlZCIsIGxudW0pOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCX0KQEAgLTE3NTcsNyArMTc1Nyw3IEBACiAJCQlmcmVlICs9IGMtPmxlYl9zaXplOwogCX0KIAlpZiAoZnJlZSA8IGMtPmxwdF9zeikgewotCQl1Ymlmc19lcnIoIkxQVCBzcGFjZSBlcnJvcjogZnJlZSAlbGxkIGxwdF9zeiAlbGxkIiwKKwkJdWJpZnNfZXJyKGMsICJMUFQgc3BhY2UgZXJyb3I6IGZyZWUgJWxsZCBscHRfc3ogJWxsZCIsCiAJCQkgIGZyZWUsIGMtPmxwdF9zeik7CiAJCXViaWZzX2R1bXBfbHB0X2luZm8oYyk7CiAJCXViaWZzX2R1bXBfbHB0X2xlYnMoYyk7CkBAIC0xNzk3LDEyICsxNzk3LDEyIEBACiAJCWQtPmNoa19scHRfbGVicyA9IDA7CiAJCWQtPmNoa19scHRfd2FzdGFnZSA9IDA7CiAJCWlmIChjLT5kaXJ0eV9wbl9jbnQgPiBjLT5wbm9kZV9jbnQpIHsKLQkJCXViaWZzX2VycigiZGlydHkgcG5vZGVzICVkIGV4Y2VlZCBtYXggJWQiLAorCQkJdWJpZnNfZXJyKGMsICJkaXJ0eSBwbm9kZXMgJWQgZXhjZWVkIG1heCAlZCIsCiAJCQkJICBjLT5kaXJ0eV9wbl9jbnQsIGMtPnBub2RlX2NudCk7CiAJCQllcnIgPSAtRUlOVkFMOwogCQl9CiAJCWlmIChjLT5kaXJ0eV9ubl9jbnQgPiBjLT5ubm9kZV9jbnQpIHsKLQkJCXViaWZzX2VycigiZGlydHkgbm5vZGVzICVkIGV4Y2VlZCBtYXggJWQiLAorCQkJdWJpZnNfZXJyKGMsICJkaXJ0eSBubm9kZXMgJWQgZXhjZWVkIG1heCAlZCIsCiAJCQkJICBjLT5kaXJ0eV9ubl9jbnQsIGMtPm5ub2RlX2NudCk7CiAJCQllcnIgPSAtRUlOVkFMOwogCQl9CkBAIC0xODIwLDIyICsxODIwLDIyIEBACiAJCWNoa19scHRfc3ogKj0gZC0+Y2hrX2xwdF9sZWJzOwogCQljaGtfbHB0X3N6ICs9IGxlbiAtIGMtPm5oZWFkX29mZnM7CiAJCWlmIChkLT5jaGtfbHB0X3N6ICE9IGNoa19scHRfc3opIHsKLQkJCXViaWZzX2VycigiTFBUIHdyb3RlICVsbGQgYnV0IHNwYWNlIHVzZWQgd2FzICVsbGQiLAorCQkJdWJpZnNfZXJyKGMsICJMUFQgd3JvdGUgJWxsZCBidXQgc3BhY2UgdXNlZCB3YXMgJWxsZCIsCiAJCQkJICBkLT5jaGtfbHB0X3N6LCBjaGtfbHB0X3N6KTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCX0KIAkJaWYgKGQtPmNoa19scHRfc3ogPiBjLT5scHRfc3opIHsKLQkJCXViaWZzX2VycigiTFBUIHdyb3RlICVsbGQgYnV0IGxwdF9zeiBpcyAlbGxkIiwKKwkJCXViaWZzX2VycihjLCAiTFBUIHdyb3RlICVsbGQgYnV0IGxwdF9zeiBpcyAlbGxkIiwKIAkJCQkgIGQtPmNoa19scHRfc3osIGMtPmxwdF9zeik7CiAJCQllcnIgPSAtRUlOVkFMOwogCQl9CiAJCWlmIChkLT5jaGtfbHB0X3N6MiAmJiBkLT5jaGtfbHB0X3N6ICE9IGQtPmNoa19scHRfc3oyKSB7Ci0JCQl1Ymlmc19lcnIoIkxQVCBsYXlvdXQgc2l6ZSAlbGxkIGJ1dCB3cm90ZSAlbGxkIiwKKwkJCXViaWZzX2VycihjLCAiTFBUIGxheW91dCBzaXplICVsbGQgYnV0IHdyb3RlICVsbGQiLAogCQkJCSAgZC0+Y2hrX2xwdF9zeiwgZC0+Y2hrX2xwdF9zejIpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJfQogCQlpZiAoZC0+Y2hrX2xwdF9zejIgJiYgZC0+bmV3X25oZWFkX29mZnMgIT0gbGVuKSB7Ci0JCQl1Ymlmc19lcnIoIkxQVCBuZXcgbmhlYWQgb2ZmczogZXhwZWN0ZWQgJWQgd2FzICVkIiwKKwkJCXViaWZzX2VycihjLCAiTFBUIG5ldyBuaGVhZCBvZmZzOiBleHBlY3RlZCAlZCB3YXMgJWQiLAogCQkJCSAgZC0+bmV3X25oZWFkX29mZnMsIGxlbik7CiAJCQllcnIgPSAtRUlOVkFMOwogCQl9CkBAIC0xODQ1LDcgKzE4NDUsNyBAQAogCQlpZiAoYy0+YmlnX2xwdCkKIAkJCWxwdF9zeiArPSBjLT5sc2F2ZV9zejsKIAkJaWYgKGQtPmNoa19scHRfc3ogLSBkLT5jaGtfbHB0X3dhc3RhZ2UgPiBscHRfc3opIHsKLQkJCXViaWZzX2VycigiTFBUIGNoa19scHRfc3ogJWxsZCArIHdhc3RlICVsbGQgZXhjZWVkcyAlbGxkIiwKKwkJCXViaWZzX2VycihjLCAiTFBUIGNoa19scHRfc3ogJWxsZCArIHdhc3RlICVsbGQgZXhjZWVkcyAlbGxkIiwKIAkJCQkgIGQtPmNoa19scHRfc3osIGQtPmNoa19scHRfd2FzdGFnZSwgbHB0X3N6KTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCX0KQEAgLTE4ODcsNyArMTg4Nyw3IEBACiAJcHJfZXJyKCIocGlkICVkKSBzdGFydCBkdW1waW5nIExFQiAlZFxuIiwgY3VycmVudC0+cGlkLCBsbnVtKTsKIAlidWYgPSBwID0gX192bWFsbG9jKGMtPmxlYl9zaXplLCBHRlBfTk9GUywgUEFHRV9LRVJORUwpOwogCWlmICghYnVmKSB7Ci0JCXViaWZzX2VycigiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSB0byBkdW1wIExQVCIpOworCQl1Ymlmc19lcnIoYywgImNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgdG8gZHVtcCBMUFQiKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTk2Miw3ICsxOTYyLDcgQEAKIAkJCXByX2VycigiTEVCICVkOiVkLCBsc2F2ZSBsZW5cbiIsIGxudW0sIG9mZnMpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQl1Ymlmc19lcnIoIkxQVCBub2RlIHR5cGUgJWQgbm90IHJlY29nbml6ZWQiLCBub2RlX3R5cGUpOworCQkJdWJpZnNfZXJyKGMsICJMUFQgbm9kZSB0eXBlICVkIG5vdCByZWNvZ25pemVkIiwgbm9kZV90eXBlKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL21hc3Rlci5jIGIvZnMvdWJpZnMvbWFzdGVyLmMKaW5kZXggMWE0YmI5ZS4uYzZhNWUzOSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvbWFzdGVyLmMKKysrIGIvZnMvdWJpZnMvbWFzdGVyLmMKQEAgLTgyLDcgKzgyLDcgQEAKIAlyZXR1cm4gLUVVQ0xFQU47CiAKIG91dF9kdW1wOgotCXViaWZzX2VycigidW5leHBlY3RlZCBub2RlIHR5cGUgJWQgbWFzdGVyIExFQiAlZDolZCIsCisJdWJpZnNfZXJyKGMsICJ1bmV4cGVjdGVkIG5vZGUgdHlwZSAlZCBtYXN0ZXIgTEVCICVkOiVkIiwKIAkJICBzbm9kLT50eXBlLCBsbnVtLCBzbm9kLT5vZmZzKTsKIAl1Ymlmc19zY2FuX2Rlc3Ryb3koc2xlYik7CiAJcmV0dXJuIC1FSU5WQUw7CkBAIC0yNDAsNyArMjQwLDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0OgotCXViaWZzX2VycigiYmFkIG1hc3RlciBub2RlIGF0IG9mZnNldCAlZCBlcnJvciAlZCIsIGMtPm1zdF9vZmZzLCBlcnIpOworCXViaWZzX2VycihjLCAiYmFkIG1hc3RlciBub2RlIGF0IG9mZnNldCAlZCBlcnJvciAlZCIsIGMtPm1zdF9vZmZzLCBlcnIpOwogCXViaWZzX2R1bXBfbm9kZShjLCBjLT5tc3Rfbm9kZSk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CkBAIC0zMTYsNyArMzE2LDcgQEAKIAogCQlpZiAoYy0+bGViX2NudCA8IG9sZF9sZWJfY250IHx8CiAJCSAgICBjLT5sZWJfY250IDwgVUJJRlNfTUlOX0xFQl9DTlQpIHsKLQkJCXViaWZzX2VycigiYmFkIGxlYl9jbnQgb24gbWFzdGVyIG5vZGUiKTsKKwkJCXViaWZzX2VycihjLCAiYmFkIGxlYl9jbnQgb24gbWFzdGVyIG5vZGUiKTsKIAkJCXViaWZzX2R1bXBfbm9kZShjLCBjLT5tc3Rfbm9kZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvb3JwaGFuLmMgYi9mcy91Ymlmcy9vcnBoYW4uYwppbmRleCA0NDA5ZjQ4Li5jYWYyZDEyIDEwMDY0NAotLS0gYS9mcy91Ymlmcy9vcnBoYW4uYworKysgYi9mcy91Ymlmcy9vcnBoYW4uYwpAQCAtODgsNyArODgsNyBAQAogCQllbHNlIGlmIChpbnVtID4gby0+aW51bSkKIAkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CiAJCWVsc2UgewotCQkJdWJpZnNfZXJyKCJvcnBoYW5lZCB0d2ljZSIpOworCQkJdWJpZnNfZXJyKGMsICJvcnBoYW5lZCB0d2ljZSIpOwogCQkJc3Bpbl91bmxvY2soJmMtPm9ycGhhbl9sb2NrKTsKIAkJCWtmcmVlKG9ycGhhbik7CiAJCQlyZXR1cm4gMDsKQEAgLTE1NSw3ICsxNTUsNyBAQAogCQl9CiAJfQogCXNwaW5fdW5sb2NrKCZjLT5vcnBoYW5fbG9jayk7Ci0JdWJpZnNfZXJyKCJtaXNzaW5nIG9ycGhhbiBpbm8gJWx1IiwgKHVuc2lnbmVkIGxvbmcpaW51bSk7CisJdWJpZnNfZXJyKGMsICJtaXNzaW5nIG9ycGhhbiBpbm8gJWx1IiwgKHVuc2lnbmVkIGxvbmcpaW51bSk7CiAJZHVtcF9zdGFjaygpOwogfQogCkBAIC0yODcsNyArMjg3LDcgQEAKIAkJCSAqIFdlIGxpbWl0IHRoZSBudW1iZXIgb2Ygb3JwaGFucyBzbyB0aGF0IHRoaXMgc2hvdWxkCiAJCQkgKiBuZXZlciBoYXBwZW4uCiAJCQkgKi8KLQkJCXViaWZzX2Vycigib3V0IG9mIHNwYWNlIGluIG9ycGhhbiBhcmVhIik7CisJCQl1Ymlmc19lcnIoYywgIm91dCBvZiBzcGFjZSBpbiBvcnBoYW4gYXJlYSIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0zOTcsNyArMzk3LDcgQEAKIAkJICogV2UgbGltaXQgdGhlIG51bWJlciBvZiBvcnBoYW5zIHNvIHRoYXQgdGhpcyBzaG91bGQKIAkJICogbmV2ZXIgaGFwcGVuLgogCQkgKi8KLQkJdWJpZnNfZXJyKCJvdXQgb2Ygc3BhY2UgaW4gb3JwaGFuIGFyZWEiKTsKKwkJdWJpZnNfZXJyKGMsICJvdXQgb2Ygc3BhY2UgaW4gb3JwaGFuIGFyZWEiKTsKIAkJZXJyID0gLUVJTlZBTDsKIAl9CiAJc3Bpbl91bmxvY2soJmMtPm9ycGhhbl9sb2NrKTsKQEAgLTU2OSw3ICs1NjksNyBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzbm9kLCAmc2xlYi0+bm9kZXMsIGxpc3QpIHsKIAkJaWYgKHNub2QtPnR5cGUgIT0gVUJJRlNfT1JQSF9OT0RFKSB7Ci0JCQl1Ymlmc19lcnIoImludmFsaWQgbm9kZSB0eXBlICVkIGluIG9ycGhhbiBhcmVhIGF0ICVkOiVkIiwKKwkJCXViaWZzX2VycihjLCAiaW52YWxpZCBub2RlIHR5cGUgJWQgaW4gb3JwaGFuIGFyZWEgYXQgJWQ6JWQiLAogCQkJCSAgc25vZC0+dHlwZSwgc2xlYi0+bG51bSwgc25vZC0+b2Zmcyk7CiAJCQl1Ymlmc19kdW1wX25vZGUoYywgc25vZC0+bm9kZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU5Niw3ICs1OTYsNyBAQAogCQkJICogbnVtYmVyLiBUaGF0IG1ha2VzIHRoaXMgb3JwaGFuIG5vZGUsIG91dCBvZiBkYXRlLgogCQkJICovCiAJCQlpZiAoIWZpcnN0KSB7Ci0JCQkJdWJpZnNfZXJyKCJvdXQgb2Ygb3JkZXIgY29tbWl0IG51bWJlciAlbGx1IGluIG9ycGhhbiBub2RlIGF0ICVkOiVkIiwKKwkJCQl1Ymlmc19lcnIoYywgIm91dCBvZiBvcmRlciBjb21taXQgbnVtYmVyICVsbHUgaW4gb3JwaGFuIG5vZGUgYXQgJWQ6JWQiLAogCQkJCQkgIGNtdF9ubywgc2xlYi0+bG51bSwgc25vZC0+b2Zmcyk7CiAJCQkJdWJpZnNfZHVtcF9ub2RlKGMsIHNub2QtPm5vZGUpOwogCQkJCXJldHVybiAtRUlOVkFMOwpAQCAtODMxLDIwICs4MzEsMjAgQEAKIAlpZiAoaW51bSAhPSBjaS0+bGFzdF9pbm8pIHsKIAkJLyogTG93ZXN0IG5vZGUgdHlwZSBpcyB0aGUgaW5vZGUgbm9kZSwgc28gaXQgY29tZXMgZmlyc3QgKi8KIAkJaWYgKGtleV90eXBlKGMsICZ6YnItPmtleSkgIT0gVUJJRlNfSU5PX0tFWSkKLQkJCXViaWZzX2VycigiZm91bmQgb3JwaGFuIG5vZGUgaW5vICVsdSwgdHlwZSAlZCIsCisJCQl1Ymlmc19lcnIoYywgImZvdW5kIG9ycGhhbiBub2RlIGlubyAlbHUsIHR5cGUgJWQiLAogCQkJCSAgKHVuc2lnbmVkIGxvbmcpaW51bSwga2V5X3R5cGUoYywgJnpici0+a2V5KSk7CiAJCWNpLT5sYXN0X2lubyA9IGludW07CiAJCWNpLT50b3RfaW5vcyArPSAxOwogCQllcnIgPSB1Ymlmc190bmNfcmVhZF9ub2RlKGMsIHpiciwgY2ktPm5vZGUpOwogCQlpZiAoZXJyKSB7Ci0JCQl1Ymlmc19lcnIoIm5vZGUgcmVhZCBmYWlsZWQsIGVycm9yICVkIiwgZXJyKTsKKwkJCXViaWZzX2VycihjLCAibm9kZSByZWFkIGZhaWxlZCwgZXJyb3IgJWQiLCBlcnIpOwogCQkJcmV0dXJuIGVycjsKIAkJfQogCQlpZiAoY2ktPm5vZGUtPm5saW5rID09IDApCiAJCQkvKiBNdXN0IGJlIHJlY29yZGVkIGFzIGFuIG9ycGhhbiAqLwogCQkJaWYgKCFkYmdfZmluZF9jaGVja19vcnBoYW4oJmNpLT5yb290LCBpbnVtKSAmJgogCQkJICAgICFkYmdfZmluZF9vcnBoYW4oYywgaW51bSkpIHsKLQkJCQl1Ymlmc19lcnIoIm1pc3Npbmcgb3JwaGFuLCBpbm8gJWx1IiwKKwkJCQl1Ymlmc19lcnIoYywgIm1pc3Npbmcgb3JwaGFuLCBpbm8gJWx1IiwKIAkJCQkJICAodW5zaWduZWQgbG9uZylpbnVtKTsKIAkJCQljaS0+bWlzc2luZyArPSAxOwogCQkJfQpAQCAtODg3LDcgKzg4Nyw3IEBACiAKIAlidWYgPSBfX3ZtYWxsb2MoYy0+bGViX3NpemUsIEdGUF9OT0ZTLCBQQUdFX0tFUk5FTCk7CiAJaWYgKCFidWYpIHsKLQkJdWJpZnNfZXJyKCJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IHRvIGNoZWNrIG9ycGhhbnMiKTsKKwkJdWJpZnNfZXJyKGMsICJjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IHRvIGNoZWNrIG9ycGhhbnMiKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC05MjUsNyArOTI1LDcgQEAKIAljaS5yb290ID0gUkJfUk9PVDsKIAljaS5ub2RlID0ga21hbGxvYyhVQklGU19NQVhfSU5PX05PREVfU1osIEdGUF9OT0ZTKTsKIAlpZiAoIWNpLm5vZGUpIHsKLQkJdWJpZnNfZXJyKCJvdXQgb2YgbWVtb3J5Iik7CisJCXViaWZzX2VycihjLCAib3V0IG9mIG1lbW9yeSIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTkzNSwxMiArOTM1LDEyIEBACiAKIAllcnIgPSBkYmdfd2Fsa19pbmRleChjLCAmZGJnX29ycGhhbl9jaGVjaywgTlVMTCwgJmNpKTsKIAlpZiAoZXJyKSB7Ci0JCXViaWZzX2VycigiY2Fubm90IHNjYW4gVE5DLCBlcnJvciAlZCIsIGVycik7CisJCXViaWZzX2VycihjLCAiY2Fubm90IHNjYW4gVE5DLCBlcnJvciAlZCIsIGVycik7CiAJCWdvdG8gb3V0OwogCX0KIAogCWlmIChjaS5taXNzaW5nKSB7Ci0JCXViaWZzX2VycigiJWx1IG1pc3Npbmcgb3JwaGFuKHMpIiwgY2kubWlzc2luZyk7CisJCXViaWZzX2VycihjLCAiJWx1IG1pc3Npbmcgb3JwaGFuKHMpIiwgY2kubWlzc2luZyk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3JlY292ZXJ5LmMgYi9mcy91Ymlmcy9yZWNvdmVyeS5jCmluZGV4IGM2NDA5MzguLjY5NWZjNzEgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3JlY292ZXJ5LmMKKysrIGIvZnMvdWJpZnMvcmVjb3ZlcnkuYwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJCW1zdCA9IG1zdDI7CiAJfQogCi0JdWJpZnNfbXNnKCJyZWNvdmVyZWQgbWFzdGVyIG5vZGUgZnJvbSBMRUIgJWQiLAorCXViaWZzX21zZyhjLCAicmVjb3ZlcmVkIG1hc3RlciBub2RlIGZyb20gTEVCICVkIiwKIAkJICAobXN0ID09IG1zdDEgPyBVQklGU19NU1RfTE5VTSA6IFVCSUZTX01TVF9MTlVNICsgMSkpOwogCiAJbWVtY3B5KGMtPm1zdF9ub2RlLCBtc3QsIFVCSUZTX01TVF9OT0RFX1NaKTsKQEAgLTM2MCwxMyArMzYwLDEzIEBACiBvdXRfZXJyOgogCWVyciA9IC1FSU5WQUw7CiBvdXRfZnJlZToKLQl1Ymlmc19lcnIoImZhaWxlZCB0byByZWNvdmVyIG1hc3RlciBub2RlIik7CisJdWJpZnNfZXJyKGMsICJmYWlsZWQgdG8gcmVjb3ZlciBtYXN0ZXIgbm9kZSIpOwogCWlmIChtc3QxKSB7Ci0JCXViaWZzX2VycigiZHVtcGluZyBmaXJzdCBtYXN0ZXIgbm9kZSIpOworCQl1Ymlmc19lcnIoYywgImR1bXBpbmcgZmlyc3QgbWFzdGVyIG5vZGUiKTsKIAkJdWJpZnNfZHVtcF9ub2RlKGMsIG1zdDEpOwogCX0KIAlpZiAobXN0MikgewotCQl1Ymlmc19lcnIoImR1bXBpbmcgc2Vjb25kIG1hc3RlciBub2RlIik7CisJCXViaWZzX2VycihjLCAiZHVtcGluZyBzZWNvbmQgbWFzdGVyIG5vZGUiKTsKIAkJdWJpZnNfZHVtcF9ub2RlKGMsIG1zdDIpOwogCX0KIAl2ZnJlZShidWYyKTsKQEAgLTY4Miw3ICs2ODIsNyBAQAogCQkJCSAgcmV0LCBsbnVtLCBvZmZzKTsKIAkJCWJyZWFrOwogCQl9IGVsc2UgewotCQkJdWJpZnNfZXJyKCJ1bmV4cGVjdGVkIHJldHVybiB2YWx1ZSAlZCIsIHJldCk7CisJCQl1Ymlmc19lcnIoYywgInVuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlICVkIiwgcmV0KTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycm9yOwogCQl9CkBAIC03MDIsNyArNzAyLDcgQEAKIAkJCSAqIFNlZSBoZWFkZXIgY29tbWVudCBmb3IgdGhpcyBmaWxlIGZvciBtb3JlCiAJCQkgKiBleHBsYW5hdGlvbnMgYWJvdXQgdGhlIHJlYXNvbnMgd2UgaGF2ZSB0aGlzIGNoZWNrLgogCQkJICovCi0JCQl1Ymlmc19lcnIoImNvcnJ1cHQgZW1wdHkgc3BhY2UgTEVCICVkOiVkLCBjb3JydXB0aW9uIHN0YXJ0cyBhdCAlZCIsCisJCQl1Ymlmc19lcnIoYywgImNvcnJ1cHQgZW1wdHkgc3BhY2UgTEVCICVkOiVkLCBjb3JydXB0aW9uIHN0YXJ0cyBhdCAlZCIsCiAJCQkJICBsbnVtLCBvZmZzLCBjb3JydXB0aW9uKTsKIAkJCS8qIE1ha2Ugc3VyZSB3ZSBkdW1wIGludGVyZXN0aW5nIG5vbi0weEZGIGRhdGEgKi8KIAkJCW9mZnMgKz0gY29ycnVwdGlvbjsKQEAgLTc4OCwxMyArNzg4LDEzIEBACiAKIGNvcnJ1cHRlZF9yZXNjYW46CiAJLyogUmUtc2NhbiB0aGUgY29ycnVwdGVkIGRhdGEgd2l0aCB2ZXJib3NlIG1lc3NhZ2VzICovCi0JdWJpZnNfZXJyKCJjb3JydXB0aW9uICVkIiwgcmV0KTsKKwl1Ymlmc19lcnIoYywgImNvcnJ1cHRpb24gJWQiLCByZXQpOwogCXViaWZzX3NjYW5fYV9ub2RlKGMsIGJ1ZiwgbGVuLCBsbnVtLCBvZmZzLCAxKTsKIGNvcnJ1cHRlZDoKIAl1Ymlmc19zY2FubmVkX2NvcnJ1cHRpb24oYywgbG51bSwgb2ZmcywgYnVmKTsKIAllcnIgPSAtRVVDTEVBTjsKIGVycm9yOgotCXViaWZzX2VycigiTEVCICVkIHNjYW5uaW5nIGZhaWxlZCIsIGxudW0pOworCXViaWZzX2VycihjLCAiTEVCICVkIHNjYW5uaW5nIGZhaWxlZCIsIGxudW0pOwogCXViaWZzX3NjYW5fZGVzdHJveShzbGViKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQpAQCAtODI2LDE1ICs4MjYsMTUgQEAKIAkJZ290byBvdXRfZnJlZTsKIAlyZXQgPSB1Ymlmc19zY2FuX2Ffbm9kZShjLCBjc19ub2RlLCBVQklGU19DU19OT0RFX1NaLCBsbnVtLCBvZmZzLCAwKTsKIAlpZiAocmV0ICE9IFNDQU5ORURfQV9OT0RFKSB7Ci0JCXViaWZzX2VycigiTm90IGEgdmFsaWQgbm9kZSIpOworCQl1Ymlmc19lcnIoYywgIk5vdCBhIHZhbGlkIG5vZGUiKTsKIAkJZ290byBvdXRfZXJyOwogCX0KIAlpZiAoY3Nfbm9kZS0+Y2gubm9kZV90eXBlICE9IFVCSUZTX0NTX05PREUpIHsKLQkJdWJpZnNfZXJyKCJOb2RlIGEgQ1Mgbm9kZSwgdHlwZSBpcyAlZCIsIGNzX25vZGUtPmNoLm5vZGVfdHlwZSk7CisJCXViaWZzX2VycihjLCAiTm9kZSBhIENTIG5vZGUsIHR5cGUgaXMgJWQiLCBjc19ub2RlLT5jaC5ub2RlX3R5cGUpOwogCQlnb3RvIG91dF9lcnI7CiAJfQogCWlmIChsZTY0X3RvX2NwdShjc19ub2RlLT5jbXRfbm8pICE9IGMtPmNtdF9ubykgewotCQl1Ymlmc19lcnIoIkNTIG5vZGUgY210X25vICVsbHUgIT0gY3VycmVudCBjbXRfbm8gJWxsdSIsCisJCXViaWZzX2VycihjLCAiQ1Mgbm9kZSBjbXRfbm8gJWxsdSAhPSBjdXJyZW50IGNtdF9ubyAlbGx1IiwKIAkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShjc19ub2RlLT5jbXRfbm8pLAogCQkJICBjLT5jbXRfbm8pOwogCQlnb3RvIG91dF9lcnI7CkBAIC04NDcsNyArODQ3LDcgQEAKIG91dF9lcnI6CiAJZXJyID0gLUVJTlZBTDsKIG91dF9mcmVlOgotCXViaWZzX2VycigiZmFpbGVkIHRvIGdldCBDUyBzcW51bSIpOworCXViaWZzX2VycihjLCAiZmFpbGVkIHRvIGdldCBDUyBzcW51bSIpOwogCWtmcmVlKGNzX25vZGUpOwogCXJldHVybiBlcnI7CiB9CkBAIC04OTksNyArODk5LDcgQEAKIAkJCQl9CiAJCQl9CiAJCQlpZiAoc25vZC0+c3FudW0gPiBjc19zcW51bSkgewotCQkJCXViaWZzX2VycigidW5yZWNvdmVyYWJsZSBsb2cgY29ycnVwdGlvbiBpbiBMRUIgJWQiLAorCQkJCXViaWZzX2VycihjLCAidW5yZWNvdmVyYWJsZSBsb2cgY29ycnVwdGlvbiBpbiBMRUIgJWQiLAogCQkJCQkgIGxudW0pOwogCQkJCXViaWZzX3NjYW5fZGVzdHJveShzbGViKTsKIAkJCQlyZXR1cm4gRVJSX1BUUigtRVVDTEVBTik7CkBAIC05NzUsMTEgKzk3NSw4IEBACiAJCXJldHVybiBlcnI7CiAKIAlkYmdfcmN2cnkoImNoZWNraW5nIExQVCBoZWFkIGF0ICVkOiVkIiwgYy0+bmhlYWRfbG51bSwgYy0+bmhlYWRfb2Zmcyk7Ci0JZXJyID0gcmVjb3Zlcl9oZWFkKGMsIGMtPm5oZWFkX2xudW0sIGMtPm5oZWFkX29mZnMsIHNidWYpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmVjb3Zlcl9oZWFkKGMsIGMtPm5oZWFkX2xudW0sIGMtPm5oZWFkX29mZnMsIHNidWYpOwogfQogCiAvKioKQEAgLTEwMDQsMTAgKzEwMDEsNyBAQAogCiAJaWYgKGxlbiA9PSAwKSB7CiAJCS8qIE5vdGhpbmcgdG8gcmVhZCwganVzdCB1bm1hcCBpdCAqLwotCQllcnIgPSB1Ymlmc19sZWJfdW5tYXAoYywgbG51bSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHViaWZzX2xlYl91bm1hcChjLCBsbnVtKTsKIAl9CiAKIAllcnIgPSB1Ymlmc19sZWJfcmVhZChjLCBsbnVtLCBidWYsIG9mZnMsIGxlbiwgMCk7CkBAIC0xMDQzLDcgKzEwMzcsNyBAQAogCQl9CiAKIAkJaWYgKHJldCA9PSBTQ0FOTkVEX0VNUFRZX1NQQUNFKSB7Ci0JCQl1Ymlmc19lcnIoInVuZXhwZWN0ZWQgZW1wdHkgc3BhY2UgYXQgJWQ6JWQiLAorCQkJdWJpZnNfZXJyKGMsICJ1bmV4cGVjdGVkIGVtcHR5IHNwYWNlIGF0ICVkOiVkIiwKIAkJCQkgIGxudW0sIG9mZnMpOwogCQkJcmV0dXJuIC1FVUNMRUFOOwogCQl9CkBAIC0xMTM3LDcgKzExMzEsNyBAQAogCSAqLwogCWxudW0gPSB1Ymlmc19maW5kX2ZyZWVfbGViX2Zvcl9pZHgoYyk7CiAJaWYgKGxudW0gPCAwKSB7Ci0JCXViaWZzX2VycigiY291bGQgbm90IGZpbmQgYW4gZW1wdHkgTEVCIik7CisJCXViaWZzX2VycihjLCAiY291bGQgbm90IGZpbmQgYW4gZW1wdHkgTEVCIik7CiAJCXViaWZzX2R1bXBfbHByb3BzKGMpOwogCQl1Ymlmc19kdW1wX2J1ZGcoYywgJmMtPmJpKTsKIAkJcmV0dXJuIGxudW07CkBAIC0xMjE3LDcgKzEyMTEsNyBAQAogCX0KIAltdXRleF91bmxvY2soJndidWYtPmlvX211dGV4KTsKIAlpZiAoZXJyIDwgMCkgewotCQl1Ymlmc19lcnIoIkdDIGZhaWxlZCwgZXJyb3IgJWQiLCBlcnIpOworCQl1Ymlmc19lcnIoYywgIkdDIGZhaWxlZCwgZXJyb3IgJWQiLCBlcnIpOwogCQlpZiAoZXJyID09IC1FQUdBSU4pCiAJCQllcnIgPSAtRUlOVkFMOwogCQlyZXR1cm4gZXJyOwpAQCAtMTQ2NCw3ICsxNDU4LDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0OgotCXViaWZzX3dhcm4oImlub2RlICVsdSBmYWlsZWQgdG8gZml4IHNpemUgJWxsZCAtPiAlbGxkIGVycm9yICVkIiwKKwl1Ymlmc193YXJuKGMsICJpbm9kZSAlbHUgZmFpbGVkIHRvIGZpeCBzaXplICVsbGQgLT4gJWxsZCBlcnJvciAlZCIsCiAJCSAgICh1bnNpZ25lZCBsb25nKWUtPmludW0sIGUtPmlfc2l6ZSwgZS0+ZF9zaXplLCBlcnIpOwogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy91Ymlmcy9yZXBsYXkuYyBiL2ZzL3ViaWZzL3JlcGxheS5jCmluZGV4IDliNDBhMWMuLjNjYTQ1NDAgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3JlcGxheS5jCisrKyBiL2ZzL3ViaWZzL3JlcGxheS5jCkBAIC00NTgsMTMgKzQ1OCwxMyBAQAogCSAgICBubGVuID4gVUJJRlNfTUFYX05MRU4gfHwgZGVudC0+bmFtZVtubGVuXSAhPSAwIHx8CiAJICAgIHN0cm5sZW4oZGVudC0+bmFtZSwgbmxlbikgIT0gbmxlbiB8fAogCSAgICBsZTY0X3RvX2NwdShkZW50LT5pbnVtKSA+IE1BWF9JTlVNKSB7Ci0JCXViaWZzX2VycigiYmFkICVzIG5vZGUiLCBrZXlfdHlwZSA9PSBVQklGU19ERU5UX0tFWSA/CisJCXViaWZzX2VycihjLCAiYmFkICVzIG5vZGUiLCBrZXlfdHlwZSA9PSBVQklGU19ERU5UX0tFWSA/CiAJCQkgICJkaXJlY3RvcnkgZW50cnkiIDogImV4dGVuZGVkIGF0dHJpYnV0ZSBlbnRyeSIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoa2V5X3R5cGUgIT0gVUJJRlNfREVOVF9LRVkgJiYga2V5X3R5cGUgIT0gVUJJRlNfWEVOVF9LRVkpIHsKLQkJdWJpZnNfZXJyKCJiYWQga2V5IHR5cGUgJWQiLCBrZXlfdHlwZSk7CisJCXViaWZzX2VycihjLCAiYmFkIGtleSB0eXBlICVkIiwga2V5X3R5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTU4OSw3ICs1ODksNyBAQAogCQljb25kX3Jlc2NoZWQoKTsKIAogCQlpZiAoc25vZC0+c3FudW0gPj0gU1FOVU1fV0FURVJNQVJLKSB7Ci0JCQl1Ymlmc19lcnIoImZpbGUgc3lzdGVtJ3MgbGlmZSBlbmRlZCIpOworCQkJdWJpZnNfZXJyKGMsICJmaWxlIHN5c3RlbSdzIGxpZmUgZW5kZWQiKTsKIAkJCWdvdG8gb3V0X2R1bXA7CiAJCX0KIApAQCAtNjQ3LDcgKzY0Nyw3IEBACiAJCQlpZiAob2xkX3NpemUgPCAwIHx8IG9sZF9zaXplID4gYy0+bWF4X2lub2RlX3N6IHx8CiAJCQkgICAgbmV3X3NpemUgPCAwIHx8IG5ld19zaXplID4gYy0+bWF4X2lub2RlX3N6IHx8CiAJCQkgICAgb2xkX3NpemUgPD0gbmV3X3NpemUpIHsKLQkJCQl1Ymlmc19lcnIoImJhZCB0cnVuY2F0aW9uIG5vZGUiKTsKKwkJCQl1Ymlmc19lcnIoYywgImJhZCB0cnVuY2F0aW9uIG5vZGUiKTsKIAkJCQlnb3RvIG91dF9kdW1wOwogCQkJfQogCkBAIC02NjIsNyArNjYyLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWRlZmF1bHQ6Ci0JCQl1Ymlmc19lcnIoInVuZXhwZWN0ZWQgbm9kZSB0eXBlICVkIGluIGJ1ZCBMRUIgJWQ6JWQiLAorCQkJdWJpZnNfZXJyKGMsICJ1bmV4cGVjdGVkIG5vZGUgdHlwZSAlZCBpbiBidWQgTEVCICVkOiVkIiwKIAkJCQkgIHNub2QtPnR5cGUsIGxudW0sIHNub2QtPm9mZnMpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0X2R1bXA7CkBAIC02ODUsNyArNjg1LDcgQEAKIAlyZXR1cm4gZXJyOwogCiBvdXRfZHVtcDoKLQl1Ymlmc19lcnIoImJhZCBub2RlIGlzIGF0IExFQiAlZDolZCIsIGxudW0sIHNub2QtPm9mZnMpOworCXViaWZzX2VycihjLCAiYmFkIG5vZGUgaXMgYXQgTEVCICVkOiVkIiwgbG51bSwgc25vZC0+b2Zmcyk7CiAJdWJpZnNfZHVtcF9ub2RlKGMsIHNub2QtPm5vZGUpOwogCXViaWZzX3NjYW5fZGVzdHJveShzbGViKTsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTgwNSw3ICs4MDUsNyBAQAogCWlmIChidWQpIHsKIAkJaWYgKGJ1ZC0+amhlYWQgPT0gamhlYWQgJiYgYnVkLT5zdGFydCA8PSBvZmZzKQogCQkJcmV0dXJuIDE7Ci0JCXViaWZzX2VycigiYnVkIGF0IExFQiAlZDolZCB3YXMgYWxyZWFkeSByZWZlcnJlZCIsIGxudW0sIG9mZnMpOworCQl1Ymlmc19lcnIoYywgImJ1ZCBhdCBMRUIgJWQ6JWQgd2FzIGFscmVhZHkgcmVmZXJyZWQiLCBsbnVtLCBvZmZzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC04NjEsMTIgKzg2MSwxMiBAQAogCQkgKiBudW1iZXJzLgogCQkgKi8KIAkJaWYgKHNub2QtPnR5cGUgIT0gVUJJRlNfQ1NfTk9ERSkgewotCQkJdWJpZnNfZXJyKCJmaXJzdCBsb2cgbm9kZSBhdCBMRUIgJWQ6JWQgaXMgbm90IENTIG5vZGUiLAorCQkJdWJpZnNfZXJyKGMsICJmaXJzdCBsb2cgbm9kZSBhdCBMRUIgJWQ6JWQgaXMgbm90IENTIG5vZGUiLAogCQkJCSAgbG51bSwgb2Zmcyk7CiAJCQlnb3RvIG91dF9kdW1wOwogCQl9CiAJCWlmIChsZTY0X3RvX2NwdShub2RlLT5jbXRfbm8pICE9IGMtPmNtdF9ubykgewotCQkJdWJpZnNfZXJyKCJmaXJzdCBDUyBub2RlIGF0IExFQiAlZDolZCBoYXMgd3JvbmcgY29tbWl0IG51bWJlciAlbGx1IGV4cGVjdGVkICVsbHUiLAorCQkJdWJpZnNfZXJyKGMsICJmaXJzdCBDUyBub2RlIGF0IExFQiAlZDolZCBoYXMgd3JvbmcgY29tbWl0IG51bWJlciAlbGx1IGV4cGVjdGVkICVsbHUiLAogCQkJCSAgbG51bSwgb2ZmcywKIAkJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUobm9kZS0+Y210X25vKSwKIAkJCQkgIGMtPmNtdF9ubyk7CkBAIC04OTEsNyArODkxLDcgQEAKIAogCS8qIE1ha2Ugc3VyZSB0aGUgZmlyc3Qgbm9kZSBzaXRzIGF0IG9mZnNldCB6ZXJvIG9mIHRoZSBMRUIgKi8KIAlpZiAoc25vZC0+b2ZmcyAhPSAwKSB7Ci0JCXViaWZzX2VycigiZmlyc3Qgbm9kZSBpcyBub3QgYXQgemVybyBvZmZzZXQiKTsKKwkJdWJpZnNfZXJyKGMsICJmaXJzdCBub2RlIGlzIG5vdCBhdCB6ZXJvIG9mZnNldCIpOwogCQlnb3RvIG91dF9kdW1wOwogCX0KIApAQCAtODk5LDEyICs4OTksMTIgQEAKIAkJY29uZF9yZXNjaGVkKCk7CiAKIAkJaWYgKHNub2QtPnNxbnVtID49IFNRTlVNX1dBVEVSTUFSSykgewotCQkJdWJpZnNfZXJyKCJmaWxlIHN5c3RlbSdzIGxpZmUgZW5kZWQiKTsKKwkJCXViaWZzX2VycihjLCAiZmlsZSBzeXN0ZW0ncyBsaWZlIGVuZGVkIik7CiAJCQlnb3RvIG91dF9kdW1wOwogCQl9CiAKIAkJaWYgKHNub2QtPnNxbnVtIDwgYy0+Y3Nfc3FudW0pIHsKLQkJCXViaWZzX2VycigiYmFkIHNxbnVtICVsbHUsIGNvbW1pdCBzcW51bSAlbGx1IiwKKwkJCXViaWZzX2VycihjLCAiYmFkIHNxbnVtICVsbHUsIGNvbW1pdCBzcW51bSAlbGx1IiwKIAkJCQkgIHNub2QtPnNxbnVtLCBjLT5jc19zcW51bSk7CiAJCQlnb3RvIG91dF9kdW1wOwogCQl9CkBAIC05MzQsMTIgKzkzNCwxMiBAQAogCQljYXNlIFVCSUZTX0NTX05PREU6CiAJCQkvKiBNYWtlIHN1cmUgaXQgc2l0cyBhdCB0aGUgYmVnaW5uaW5nIG9mIExFQiAqLwogCQkJaWYgKHNub2QtPm9mZnMgIT0gMCkgewotCQkJCXViaWZzX2VycigidW5leHBlY3RlZCBub2RlIGluIGxvZyIpOworCQkJCXViaWZzX2VycihjLCAidW5leHBlY3RlZCBub2RlIGluIGxvZyIpOwogCQkJCWdvdG8gb3V0X2R1bXA7CiAJCQl9CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXViaWZzX2VycigidW5leHBlY3RlZCBub2RlIGluIGxvZyIpOworCQkJdWJpZnNfZXJyKGMsICJ1bmV4cGVjdGVkIG5vZGUgaW4gbG9nIik7CiAJCQlnb3RvIG91dF9kdW1wOwogCQl9CiAJfQpAQCAtOTU1LDcgKzk1NSw3IEBACiAJcmV0dXJuIGVycjsKIAogb3V0X2R1bXA6Ci0JdWJpZnNfZXJyKCJsb2cgZXJyb3IgZGV0ZWN0ZWQgd2hpbGUgcmVwbGF5aW5nIHRoZSBsb2cgYXQgTEVCICVkOiVkIiwKKwl1Ymlmc19lcnIoYywgImxvZyBlcnJvciBkZXRlY3RlZCB3aGlsZSByZXBsYXlpbmcgdGhlIGxvZyBhdCBMRUIgJWQ6JWQiLAogCQkgIGxudW0sIG9mZnMgKyBzbm9kLT5vZmZzKTsKIAl1Ymlmc19kdW1wX25vZGUoYywgc25vZC0+bm9kZSk7CiAJdWJpZnNfc2Nhbl9kZXN0cm95KHNsZWIpOwpAQCAtMTAxNyw3ICsxMDE3LDcgQEAKIAkJcmV0dXJuIGZyZWU7IC8qIEVycm9yIGNvZGUgKi8KIAogCWlmIChjLT5paGVhZF9vZmZzICE9IGMtPmxlYl9zaXplIC0gZnJlZSkgewotCQl1Ymlmc19lcnIoImJhZCBpbmRleCBoZWFkIExFQiAlZDolZCIsIGMtPmloZWFkX2xudW0sCisJCXViaWZzX2VycihjLCAiYmFkIGluZGV4IGhlYWQgTEVCICVkOiVkIiwgYy0+aWhlYWRfbG51bSwKIAkJCSAgYy0+aWhlYWRfb2Zmcyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEwNDAsNyArMTA0MCw3IEBACiAJCQkgKiBzb21ldGluZyB3ZW50IHdyb25nIGFuZCB3ZSBjYW5ub3QgcHJvY2VlZCBtb3VudGluZwogCQkJICogdGhlIGZpbGUtc3lzdGVtLgogCQkJICovCi0JCQl1Ymlmc19lcnIoIm5vIFVCSUZTIG5vZGVzIGZvdW5kIGF0IHRoZSBsb2cgaGVhZCBMRUIgJWQ6JWQsIHBvc3NpYmx5IGNvcnJ1cHRlZCIsCisJCQl1Ymlmc19lcnIoYywgIm5vIFVCSUZTIG5vZGVzIGZvdW5kIGF0IHRoZSBsb2cgaGVhZCBMRUIgJWQ6JWQsIHBvc3NpYmx5IGNvcnJ1cHRlZCIsCiAJCQkJICBsbnVtLCAwKTsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3NiLmMgYi9mcy91Ymlmcy9zYi5jCmluZGV4IDc5YzZkYmIuLmY0ZmJjN2IgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3NiLmMKKysrIGIvZnMvdWJpZnMvc2IuYwpAQCAtMzM1LDcgKzMzNSw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXViaWZzX21zZygiZGVmYXVsdCBmaWxlLXN5c3RlbSBjcmVhdGVkIik7CisJdWJpZnNfbXNnKGMsICJkZWZhdWx0IGZpbGUtc3lzdGVtIGNyZWF0ZWQiKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzY1LDEzICszNjUsMTMgQEAKIAl9CiAKIAlpZiAobGUzMl90b19jcHUoc3VwLT5taW5faW9fc2l6ZSkgIT0gYy0+bWluX2lvX3NpemUpIHsKLQkJdWJpZnNfZXJyKCJtaW4uIEkvTyB1bml0IG1pc21hdGNoOiAlZCBpbiBzdXBlcmJsb2NrLCAlZCByZWFsIiwKKwkJdWJpZnNfZXJyKGMsICJtaW4uIEkvTyB1bml0IG1pc21hdGNoOiAlZCBpbiBzdXBlcmJsb2NrLCAlZCByZWFsIiwKIAkJCSAgbGUzMl90b19jcHUoc3VwLT5taW5faW9fc2l6ZSksIGMtPm1pbl9pb19zaXplKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCiAJaWYgKGxlMzJfdG9fY3B1KHN1cC0+bGViX3NpemUpICE9IGMtPmxlYl9zaXplKSB7Ci0JCXViaWZzX2VycigiTEVCIHNpemUgbWlzbWF0Y2g6ICVkIGluIHN1cGVyYmxvY2ssICVkIHJlYWwiLAorCQl1Ymlmc19lcnIoYywgIkxFQiBzaXplIG1pc21hdGNoOiAlZCBpbiBzdXBlcmJsb2NrLCAlZCByZWFsIiwKIAkJCSAgbGUzMl90b19jcHUoc3VwLT5sZWJfc2l6ZSksIGMtPmxlYl9zaXplKTsKIAkJZ290byBmYWlsZWQ7CiAJfQpAQCAtMzkzLDMzICszOTMsMzMgQEAKIAltaW5fbGViX2NudCArPSBjLT5scHRfbGVicyArIGMtPm9ycGhfbGVicyArIGMtPmpoZWFkX2NudCArIDY7CiAKIAlpZiAoYy0+bGViX2NudCA8IG1pbl9sZWJfY250IHx8IGMtPmxlYl9jbnQgPiBjLT52aS5zaXplKSB7Ci0JCXViaWZzX2VycigiYmFkIExFQiBjb3VudDogJWQgaW4gc3VwZXJibG9jaywgJWQgb24gVUJJIHZvbHVtZSwgJWQgbWluaW11bSByZXF1aXJlZCIsCisJCXViaWZzX2VycihjLCAiYmFkIExFQiBjb3VudDogJWQgaW4gc3VwZXJibG9jaywgJWQgb24gVUJJIHZvbHVtZSwgJWQgbWluaW11bSByZXF1aXJlZCIsCiAJCQkgIGMtPmxlYl9jbnQsIGMtPnZpLnNpemUsIG1pbl9sZWJfY250KTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCiAJaWYgKGMtPm1heF9sZWJfY250IDwgYy0+bGViX2NudCkgewotCQl1Ymlmc19lcnIoIm1heC4gTEVCIGNvdW50ICVkIGxlc3MgdGhhbiBMRUIgY291bnQgJWQiLAorCQl1Ymlmc19lcnIoYywgIm1heC4gTEVCIGNvdW50ICVkIGxlc3MgdGhhbiBMRUIgY291bnQgJWQiLAogCQkJICBjLT5tYXhfbGViX2NudCwgYy0+bGViX2NudCk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAogCWlmIChjLT5tYWluX2xlYnMgPCBVQklGU19NSU5fTUFJTl9MRUJTKSB7Ci0JCXViaWZzX2VycigidG9vIGZldyBtYWluIExFQnMgY291bnQgJWQsIG11c3QgYmUgYXQgbGVhc3QgJWQiLAorCQl1Ymlmc19lcnIoYywgInRvbyBmZXcgbWFpbiBMRUJzIGNvdW50ICVkLCBtdXN0IGJlIGF0IGxlYXN0ICVkIiwKIAkJCSAgYy0+bWFpbl9sZWJzLCBVQklGU19NSU5fTUFJTl9MRUJTKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCiAJbWF4X2J5dGVzID0gKGxvbmcgbG9uZyljLT5sZWJfc2l6ZSAqIFVCSUZTX01JTl9CVURfTEVCUzsKIAlpZiAoYy0+bWF4X2J1ZF9ieXRlcyA8IG1heF9ieXRlcykgewotCQl1Ymlmc19lcnIoInRvbyBzbWFsbCBqb3VybmFsICglbGxkIGJ5dGVzKSwgbXVzdCBiZSBhdCBsZWFzdCAlbGxkIGJ5dGVzIiwKKwkJdWJpZnNfZXJyKGMsICJ0b28gc21hbGwgam91cm5hbCAoJWxsZCBieXRlcyksIG11c3QgYmUgYXQgbGVhc3QgJWxsZCBieXRlcyIsCiAJCQkgIGMtPm1heF9idWRfYnl0ZXMsIG1heF9ieXRlcyk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAogCW1heF9ieXRlcyA9IChsb25nIGxvbmcpYy0+bGViX3NpemUgKiBjLT5tYWluX2xlYnM7CiAJaWYgKGMtPm1heF9idWRfYnl0ZXMgPiBtYXhfYnl0ZXMpIHsKLQkJdWJpZnNfZXJyKCJ0b28gbGFyZ2Ugam91cm5hbCBzaXplICglbGxkIGJ5dGVzKSwgb25seSAlbGxkIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgbWFpbiBhcmVhIiwKKwkJdWJpZnNfZXJyKGMsICJ0b28gbGFyZ2Ugam91cm5hbCBzaXplICglbGxkIGJ5dGVzKSwgb25seSAlbGxkIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgbWFpbiBhcmVhIiwKIAkJCSAgYy0+bWF4X2J1ZF9ieXRlcywgbWF4X2J5dGVzKTsKIAkJZ290byBmYWlsZWQ7CiAJfQpAQCAtNDY4LDcgKzQ2OCw3IEBACiAJcmV0dXJuIDA7CiAKIGZhaWxlZDoKLQl1Ymlmc19lcnIoImJhZCBzdXBlcmJsb2NrLCBlcnJvciAlZCIsIGVycik7CisJdWJpZnNfZXJyKGMsICJiYWQgc3VwZXJibG9jaywgZXJyb3IgJWQiLCBlcnIpOwogCXViaWZzX2R1bXBfbm9kZShjLCBzdXApOwogCXJldHVybiAtRUlOVkFMOwogfQpAQCAtNTQ5LDEyICs1NDksMTIgQEAKIAkJdWJpZnNfYXNzZXJ0KCFjLT5yb19tZWRpYSB8fCBjLT5yb19tb3VudCk7CiAJCWlmICghYy0+cm9fbW91bnQgfHwKIAkJICAgIGMtPnJvX2NvbXBhdF92ZXJzaW9uID4gVUJJRlNfUk9fQ09NUEFUX1ZFUlNJT04pIHsKLQkJCXViaWZzX2Vycigib24tZmxhc2ggZm9ybWF0IHZlcnNpb24gaXMgdyVkL3IlZCwgYnV0IHNvZnR3YXJlIG9ubHkgc3VwcG9ydHMgdXAgdG8gdmVyc2lvbiB3JWQvciVkIiwKKwkJCXViaWZzX2VycihjLCAib24tZmxhc2ggZm9ybWF0IHZlcnNpb24gaXMgdyVkL3IlZCwgYnV0IHNvZnR3YXJlIG9ubHkgc3VwcG9ydHMgdXAgdG8gdmVyc2lvbiB3JWQvciVkIiwKIAkJCQkgIGMtPmZtdF92ZXJzaW9uLCBjLT5yb19jb21wYXRfdmVyc2lvbiwKIAkJCQkgIFVCSUZTX0ZPUk1BVF9WRVJTSU9OLAogCQkJCSAgVUJJRlNfUk9fQ09NUEFUX1ZFUlNJT04pOwogCQkJaWYgKGMtPnJvX2NvbXBhdF92ZXJzaW9uIDw9IFVCSUZTX1JPX0NPTVBBVF9WRVJTSU9OKSB7Ci0JCQkJdWJpZnNfbXNnKCJvbmx5IFIvTyBtb3VudGluZyBpcyBwb3NzaWJsZSIpOworCQkJCXViaWZzX21zZyhjLCAib25seSBSL08gbW91bnRpbmcgaXMgcG9zc2libGUiKTsKIAkJCQllcnIgPSAtRVJPRlM7CiAJCQl9IGVsc2UKIAkJCQllcnIgPSAtRUlOVkFMOwpAQCAtNTcwLDcgKzU3MCw3IEBACiAJfQogCiAJaWYgKGMtPmZtdF92ZXJzaW9uIDwgMykgewotCQl1Ymlmc19lcnIoIm9uLWZsYXNoIGZvcm1hdCB2ZXJzaW9uICVkIGlzIG5vdCBzdXBwb3J0ZWQiLAorCQl1Ymlmc19lcnIoYywgIm9uLWZsYXNoIGZvcm1hdCB2ZXJzaW9uICVkIGlzIG5vdCBzdXBwb3J0ZWQiLAogCQkJICBjLT5mbXRfdmVyc2lvbik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtNTk1LDcgKzU5NSw3IEBACiAJCWMtPmtleV9sZW4gPSBVQklGU19TS19MRU47CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXViaWZzX2VycigidW5zdXBwb3J0ZWQga2V5IGZvcm1hdCIpOworCQl1Ymlmc19lcnIoYywgInVuc3VwcG9ydGVkIGtleSBmb3JtYXQiKTsKIAkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNzg1LDcgKzc4NSw3IEBACiAJdWJpZnNfYXNzZXJ0KGMtPnNwYWNlX2ZpeHVwKTsKIAl1Ymlmc19hc3NlcnQoIWMtPnJvX21vdW50KTsKIAotCXViaWZzX21zZygic3RhcnQgZml4aW5nIHVwIGZyZWUgc3BhY2UiKTsKKwl1Ymlmc19tc2coYywgInN0YXJ0IGZpeGluZyB1cCBmcmVlIHNwYWNlIik7CiAKIAllcnIgPSBmaXh1cF9mcmVlX3NwYWNlKGMpOwogCWlmIChlcnIpCkBAIC04MDQsNiArODA0LDYgQEAKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCi0JdWJpZnNfbXNnKCJmcmVlIHNwYWNlIGZpeHVwIGNvbXBsZXRlIik7CisJdWJpZnNfbXNnKGMsICJmcmVlIHNwYWNlIGZpeHVwIGNvbXBsZXRlIik7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3NjYW4uYyBiL2ZzL3ViaWZzL3NjYW4uYwppbmRleCA4OWFkYmM0Li5hYWI4NzM0IDEwMDY0NAotLS0gYS9mcy91Ymlmcy9zY2FuLmMKKysrIGIvZnMvdWJpZnMvc2Nhbi5jCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJaWYgKHBhZF9sZW4gPCAwIHx8CiAJCSAgICBvZmZzICsgbm9kZV9sZW4gKyBwYWRfbGVuID4gYy0+bGViX3NpemUpIHsKIAkJCWlmICghcXVpZXQpIHsKLQkJCQl1Ymlmc19lcnIoImJhZCBwYWQgbm9kZSBhdCBMRUIgJWQ6JWQiLAorCQkJCXViaWZzX2VycihjLCAiYmFkIHBhZCBub2RlIGF0IExFQiAlZDolZCIsCiAJCQkJCSAgbG51bSwgb2Zmcyk7CiAJCQkJdWJpZnNfZHVtcF9ub2RlKGMsIHBhZCk7CiAJCQl9CkBAIC0xMTAsNyArMTEwLDcgQEAKIAkJLyogTWFrZSB0aGUgbm9kZSBwYWRzIHRvIDgtYnl0ZSBib3VuZGFyeSAqLwogCQlpZiAoKG5vZGVfbGVuICsgcGFkX2xlbikgJiA3KSB7CiAJCQlpZiAoIXF1aWV0KQotCQkJCXViaWZzX2VycigiYmFkIHBhZGRpbmcgbGVuZ3RoICVkIC0gJWQiLAorCQkJCXViaWZzX2VycihjLCAiYmFkIHBhZGRpbmcgbGVuZ3RoICVkIC0gJWQiLAogCQkJCQkgIG9mZnMsIG9mZnMgKyBub2RlX2xlbiArIHBhZF9sZW4pOwogCQkJcmV0dXJuIFNDQU5ORURfQV9CQURfUEFEX05PREU7CiAJCX0KQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgc2J1ZiArIG9mZnMsIG9mZnMsIGMtPmxlYl9zaXplIC0gb2ZmcywgMCk7CiAJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpIHsKLQkJdWJpZnNfZXJyKCJjYW5ub3QgcmVhZCAlZCBieXRlcyBmcm9tIExFQiAlZDolZCwgZXJyb3IgJWQiLAorCQl1Ymlmc19lcnIoYywgImNhbm5vdCByZWFkICVkIGJ5dGVzIGZyb20gTEVCICVkOiVkLCBlcnJvciAlZCIsCiAJCQkgIGMtPmxlYl9zaXplIC0gb2ZmcywgbG51bSwgb2ZmcywgZXJyKTsKIAkJa2ZyZWUoc2xlYik7CiAJCXJldHVybiBFUlJfUFRSKGVycik7CkBAIC0yNDAsMTEgKzI0MCwxMSBAQAogewogCWludCBsZW47CiAKLQl1Ymlmc19lcnIoImNvcnJ1cHRpb24gYXQgTEVCICVkOiVkIiwgbG51bSwgb2Zmcyk7CisJdWJpZnNfZXJyKGMsICJjb3JydXB0aW9uIGF0IExFQiAlZDolZCIsIGxudW0sIG9mZnMpOwogCWxlbiA9IGMtPmxlYl9zaXplIC0gb2ZmczsKIAlpZiAobGVuID4gODE5MikKIAkJbGVuID0gODE5MjsKLQl1Ymlmc19lcnIoImZpcnN0ICVkIGJ5dGVzIGZyb20gTEVCICVkOiVkIiwgbGVuLCBsbnVtLCBvZmZzKTsKKwl1Ymlmc19lcnIoYywgImZpcnN0ICVkIGJ5dGVzIGZyb20gTEVCICVkOiVkIiwgbGVuLCBsbnVtLCBvZmZzKTsKIAlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULCAzMiwgNCwgYnVmLCBsZW4sIDEpOwogfQogCkBAIC0yOTksMTYgKzI5OSwxNiBAQAogCiAJCXN3aXRjaCAocmV0KSB7CiAJCWNhc2UgU0NBTk5FRF9HQVJCQUdFOgotCQkJdWJpZnNfZXJyKCJnYXJiYWdlIik7CisJCQl1Ymlmc19lcnIoYywgImdhcmJhZ2UiKTsKIAkJCWdvdG8gY29ycnVwdGVkOwogCQljYXNlIFNDQU5ORURfQV9OT0RFOgogCQkJYnJlYWs7CiAJCWNhc2UgU0NBTk5FRF9BX0NPUlJVUFRfTk9ERToKIAkJY2FzZSBTQ0FOTkVEX0FfQkFEX1BBRF9OT0RFOgotCQkJdWJpZnNfZXJyKCJiYWQgbm9kZSIpOworCQkJdWJpZnNfZXJyKGMsICJiYWQgbm9kZSIpOwogCQkJZ290byBjb3JydXB0ZWQ7CiAJCWRlZmF1bHQ6Ci0JCQl1Ymlmc19lcnIoInVua25vd24iKTsKKwkJCXViaWZzX2VycihjLCAidW5rbm93biIpOwogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gZXJyb3I7CiAJCX0KQEAgLTMyNSw3ICszMjUsNyBAQAogCiAJaWYgKG9mZnMgJSBjLT5taW5faW9fc2l6ZSkgewogCQlpZiAoIXF1aWV0KQotCQkJdWJpZnNfZXJyKCJlbXB0eSBzcGFjZSBzdGFydHMgYXQgbm9uLWFsaWduZWQgb2Zmc2V0ICVkIiwKKwkJCXViaWZzX2VycihjLCAiZW1wdHkgc3BhY2Ugc3RhcnRzIGF0IG5vbi1hbGlnbmVkIG9mZnNldCAlZCIsCiAJCQkJICBvZmZzKTsKIAkJZ290byBjb3JydXB0ZWQ7CiAJfQpAQCAtMzM4LDcgKzMzOCw3IEBACiAJZm9yICg7IGxlbjsgb2ZmcysrLCBidWYrKywgbGVuLS0pCiAJCWlmICgqKHVpbnQ4X3QgKilidWYgIT0gMHhmZikgewogCQkJaWYgKCFxdWlldCkKLQkJCQl1Ymlmc19lcnIoImNvcnJ1cHQgZW1wdHkgc3BhY2UgYXQgTEVCICVkOiVkIiwKKwkJCQl1Ymlmc19lcnIoYywgImNvcnJ1cHQgZW1wdHkgc3BhY2UgYXQgTEVCICVkOiVkIiwKIAkJCQkJICBsbnVtLCBvZmZzKTsKIAkJCWdvdG8gY29ycnVwdGVkOwogCQl9CkBAIC0zNDgsMTQgKzM0OCwxNCBAQAogY29ycnVwdGVkOgogCWlmICghcXVpZXQpIHsKIAkJdWJpZnNfc2Nhbm5lZF9jb3JydXB0aW9uKGMsIGxudW0sIG9mZnMsIGJ1Zik7Ci0JCXViaWZzX2VycigiTEVCICVkIHNjYW5uaW5nIGZhaWxlZCIsIGxudW0pOworCQl1Ymlmc19lcnIoYywgIkxFQiAlZCBzY2FubmluZyBmYWlsZWQiLCBsbnVtKTsKIAl9CiAJZXJyID0gLUVVQ0xFQU47CiAJdWJpZnNfc2Nhbl9kZXN0cm95KHNsZWIpOwogCXJldHVybiBFUlJfUFRSKGVycik7CiAKIGVycm9yOgotCXViaWZzX2VycigiTEVCICVkIHNjYW5uaW5nIGZhaWxlZCwgZXJyb3IgJWQiLCBsbnVtLCBlcnIpOworCXViaWZzX2VycihjLCAiTEVCICVkIHNjYW5uaW5nIGZhaWxlZCwgZXJyb3IgJWQiLCBsbnVtLCBlcnIpOwogCXViaWZzX3NjYW5fZGVzdHJveShzbGViKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvc3VwZXIuYyBiL2ZzL3ViaWZzL3N1cGVyLmMKaW5kZXggOTNlOTQ2NS4uNzVlNmYwNCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvc3VwZXIuYworKysgYi9mcy91Ymlmcy9zdXBlci5jCkBAIC03MCwxMyArNzAsMTMgQEAKIAljb25zdCBzdHJ1Y3QgdWJpZnNfaW5vZGUgKnVpID0gdWJpZnNfaW5vZGUoaW5vZGUpOwogCiAJaWYgKGlub2RlLT5pX3NpemUgPiBjLT5tYXhfaW5vZGVfc3opIHsKLQkJdWJpZnNfZXJyKCJpbm9kZSBpcyB0b28gbGFyZ2UgKCVsbGQpIiwKKwkJdWJpZnNfZXJyKGMsICJpbm9kZSBpcyB0b28gbGFyZ2UgKCVsbGQpIiwKIAkJCSAgKGxvbmcgbG9uZylpbm9kZS0+aV9zaXplKTsKIAkJcmV0dXJuIDE7CiAJfQogCiAJaWYgKHVpLT5jb21wcl90eXBlID49IFVCSUZTX0NPTVBSX1RZUEVTX0NOVCkgewotCQl1Ymlmc19lcnIoInVua25vd24gY29tcHJlc3Npb24gdHlwZSAlZCIsIHVpLT5jb21wcl90eXBlKTsKKwkJdWJpZnNfZXJyKGMsICJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgJWQiLCB1aS0+Y29tcHJfdHlwZSk7CiAJCXJldHVybiAyOwogCX0KIApAQCAtOTAsNyArOTAsNyBAQAogCQlyZXR1cm4gNTsKIAogCWlmICghdWJpZnNfY29tcHJfcHJlc2VudCh1aS0+Y29tcHJfdHlwZSkpIHsKLQkJdWJpZnNfd2FybigiaW5vZGUgJWx1IHVzZXMgJyVzJyBjb21wcmVzc2lvbiwgYnV0IGl0IHdhcyBub3QgY29tcGlsZWQgaW4iLAorCQl1Ymlmc193YXJuKGMsICJpbm9kZSAlbHUgdXNlcyAnJXMnIGNvbXByZXNzaW9uLCBidXQgaXQgd2FzIG5vdCBjb21waWxlZCBpbiIsCiAJCQkgICBpbm9kZS0+aV9pbm8sIHViaWZzX2NvbXByX25hbWUodWktPmNvbXByX3R5cGUpKTsKIAl9CiAKQEAgLTI0MiwxNCArMjQyLDE0IEBACiAJcmV0dXJuIGlub2RlOwogCiBvdXRfaW52YWxpZDoKLQl1Ymlmc19lcnIoImlub2RlICVsdSB2YWxpZGF0aW9uIGZhaWxlZCwgZXJyb3IgJWQiLCBpbm9kZS0+aV9pbm8sIGVycik7CisJdWJpZnNfZXJyKGMsICJpbm9kZSAlbHUgdmFsaWRhdGlvbiBmYWlsZWQsIGVycm9yICVkIiwgaW5vZGUtPmlfaW5vLCBlcnIpOwogCXViaWZzX2R1bXBfbm9kZShjLCBpbm8pOwogCXViaWZzX2R1bXBfaW5vZGUoYywgaW5vZGUpOwogCWVyciA9IC1FSU5WQUw7CiBvdXRfaW5vOgogCWtmcmVlKGlubyk7CiBvdXQ6Ci0JdWJpZnNfZXJyKCJmYWlsZWQgdG8gcmVhZCBpbm9kZSAlbHUsIGVycm9yICVkIiwgaW5vZGUtPmlfaW5vLCBlcnIpOworCXViaWZzX2VycihjLCAiZmFpbGVkIHRvIHJlYWQgaW5vZGUgJWx1LCBlcnJvciAlZCIsIGlub2RlLT5pX2lubywgZXJyKTsKIAlpZ2V0X2ZhaWxlZChpbm9kZSk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KQEAgLTMxOSw3ICszMTksNyBAQAogCWlmIChpbm9kZS0+aV9ubGluaykgewogCQllcnIgPSB1Ymlmc19qbmxfd3JpdGVfaW5vZGUoYywgaW5vZGUpOwogCQlpZiAoZXJyKQotCQkJdWJpZnNfZXJyKCJjYW4ndCB3cml0ZSBpbm9kZSAlbHUsIGVycm9yICVkIiwKKwkJCXViaWZzX2VycihjLCAiY2FuJ3Qgd3JpdGUgaW5vZGUgJWx1LCBlcnJvciAlZCIsCiAJCQkJICBpbm9kZS0+aV9pbm8sIGVycik7CiAJCWVsc2UKIAkJCWVyciA9IGRiZ19jaGVja19pbm9kZV9zaXplKGMsIGlub2RlLCB1aS0+dWlfc2l6ZSk7CkBAIC0zNjMsNyArMzYzLDcgQEAKIAkJICogV29yc3QgY2FzZSB3ZSBoYXZlIGEgbG9zdCBvcnBoYW4gaW5vZGUgd2FzdGluZyBzcGFjZSwgc28gYQogCQkgKiBzaW1wbGUgZXJyb3IgbWVzc2FnZSBpcyBPSyBoZXJlLgogCQkgKi8KLQkJdWJpZnNfZXJyKCJjYW4ndCBkZWxldGUgaW5vZGUgJWx1LCBlcnJvciAlZCIsCisJCXViaWZzX2VycihjLCAiY2FuJ3QgZGVsZXRlIGlub2RlICVsdSwgZXJyb3IgJWQiLAogCQkJICBpbm9kZS0+aV9pbm8sIGVycik7CiAKIG91dDoKQEAgLTQ5MiwxNyArNDkyLDE3IEBACiBzdGF0aWMgaW50IGluaXRfY29uc3RhbnRzX2Vhcmx5KHN0cnVjdCB1Ymlmc19pbmZvICpjKQogewogCWlmIChjLT52aS5jb3JydXB0ZWQpIHsKLQkJdWJpZnNfd2FybigiVUJJIHZvbHVtZSBpcyBjb3JydXB0ZWQgLSByZWFkLW9ubHkgbW9kZSIpOworCQl1Ymlmc193YXJuKGMsICJVQkkgdm9sdW1lIGlzIGNvcnJ1cHRlZCAtIHJlYWQtb25seSBtb2RlIik7CiAJCWMtPnJvX21lZGlhID0gMTsKIAl9CiAKIAlpZiAoYy0+ZGkucm9fbW9kZSkgewotCQl1Ymlmc19tc2coInJlYWQtb25seSBVQkkgZGV2aWNlIik7CisJCXViaWZzX21zZyhjLCAicmVhZC1vbmx5IFVCSSBkZXZpY2UiKTsKIAkJYy0+cm9fbWVkaWEgPSAxOwogCX0KIAogCWlmIChjLT52aS52b2xfdHlwZSA9PSBVQklfU1RBVElDX1ZPTFVNRSkgewotCQl1Ymlmc19tc2coInN0YXRpYyBVQkkgdm9sdW1lIC0gcmVhZC1vbmx5IG1vZGUiKTsKKwkJdWJpZnNfbXNnKGMsICJzdGF0aWMgVUJJIHZvbHVtZSAtIHJlYWQtb25seSBtb2RlIik7CiAJCWMtPnJvX21lZGlhID0gMTsKIAl9CiAKQEAgLTUxNiwxOSArNTE2LDE5IEBACiAJYy0+bWF4X3dyaXRlX3NoaWZ0ID0gZmxzKGMtPm1heF93cml0ZV9zaXplKSAtIDE7CiAKIAlpZiAoYy0+bGViX3NpemUgPCBVQklGU19NSU5fTEVCX1NaKSB7Ci0JCXViaWZzX2VycigidG9vIHNtYWxsIExFQnMgKCVkIGJ5dGVzKSwgbWluLiBpcyAlZCBieXRlcyIsCisJCXViaWZzX2VycihjLCAidG9vIHNtYWxsIExFQnMgKCVkIGJ5dGVzKSwgbWluLiBpcyAlZCBieXRlcyIsCiAJCQkgIGMtPmxlYl9zaXplLCBVQklGU19NSU5fTEVCX1NaKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGMtPmxlYl9jbnQgPCBVQklGU19NSU5fTEVCX0NOVCkgewotCQl1Ymlmc19lcnIoInRvbyBmZXcgTEVCcyAoJWQpLCBtaW4uIGlzICVkIiwKKwkJdWJpZnNfZXJyKGMsICJ0b28gZmV3IExFQnMgKCVkKSwgbWluLiBpcyAlZCIsCiAJCQkgIGMtPmxlYl9jbnQsIFVCSUZTX01JTl9MRUJfQ05UKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKCFpc19wb3dlcl9vZl8yKGMtPm1pbl9pb19zaXplKSkgewotCQl1Ymlmc19lcnIoImJhZCBtaW4uIEkvTyBzaXplICVkIiwgYy0+bWluX2lvX3NpemUpOworCQl1Ymlmc19lcnIoYywgImJhZCBtaW4uIEkvTyBzaXplICVkIiwgYy0+bWluX2lvX3NpemUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTUzOSw3ICs1MzksNyBAQAogCWlmIChjLT5tYXhfd3JpdGVfc2l6ZSA8IGMtPm1pbl9pb19zaXplIHx8CiAJICAgIGMtPm1heF93cml0ZV9zaXplICUgYy0+bWluX2lvX3NpemUgfHwKIAkgICAgIWlzX3Bvd2VyX29mXzIoYy0+bWF4X3dyaXRlX3NpemUpKSB7Ci0JCXViaWZzX2VycigiYmFkIHdyaXRlIGJ1ZmZlciBzaXplICVkIGZvciAlZCBtaW4uIEkvTyB1bml0IiwKKwkJdWJpZnNfZXJyKGMsICJiYWQgd3JpdGUgYnVmZmVyIHNpemUgJWQgZm9yICVkIG1pbi4gSS9PIHVuaXQiLAogCQkJICBjLT5tYXhfd3JpdGVfc2l6ZSwgYy0+bWluX2lvX3NpemUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC02NjUsNyArNjY1LDcgQEAKIAl0bXAgPSBVQklGU19DU19OT0RFX1NaICsgVUJJRlNfUkVGX05PREVfU1ogKiBjLT5qaGVhZF9jbnQ7CiAJdG1wID0gQUxJR04odG1wLCBjLT5taW5faW9fc2l6ZSk7CiAJaWYgKHRtcCA+IGMtPmxlYl9zaXplKSB7Ci0JCXViaWZzX2VycigidG9vIHNtYWxsIExFQiBzaXplICVkLCBhdCBsZWFzdCAlZCBuZWVkZWQiLAorCQl1Ymlmc19lcnIoYywgInRvbyBzbWFsbCBMRUIgc2l6ZSAlZCwgYXQgbGVhc3QgJWQgbmVlZGVkIiwKIAkJCSAgYy0+bGViX3NpemUsIHRtcCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTY4MCw3ICs2ODAsNyBAQAogCXRtcCAvPSBjLT5sZWJfc2l6ZTsKIAl0bXAgKz0gMTsKIAlpZiAoYy0+bG9nX2xlYnMgPCB0bXApIHsKLQkJdWJpZnNfZXJyKCJ0b28gc21hbGwgbG9nICVkIExFQnMsIHJlcXVpcmVkIG1pbi4gJWQgTEVCcyIsCisJCXViaWZzX2VycihjLCAidG9vIHNtYWxsIGxvZyAlZCBMRUJzLCByZXF1aXJlZCBtaW4uICVkIExFQnMiLAogCQkJICBjLT5sb2dfbGVicywgdG1wKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNzcyLDcgKzc3Miw3IEBACiAJaW50IGVycjsKIAogCWlmIChjLT5nY19sbnVtID09IC0xKSB7Ci0JCXViaWZzX2Vycigibm8gTEVCIGZvciBHQyIpOworCQl1Ymlmc19lcnIoYywgIm5vIExFQiBmb3IgR0MiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC04NTcsNyArODU3LDcgQEAKIAkJb3JwaCA9IGxpc3RfZW50cnkoYy0+b3JwaF9saXN0Lm5leHQsIHN0cnVjdCB1Ymlmc19vcnBoYW4sIGxpc3QpOwogCQlsaXN0X2RlbCgmb3JwaC0+bGlzdCk7CiAJCWtmcmVlKG9ycGgpOwotCQl1Ymlmc19lcnIoIm9ycGhhbiBsaXN0IG5vdCBlbXB0eSBhdCB1bm1vdW50Iik7CisJCXViaWZzX2VycihjLCAib3JwaGFuIGxpc3Qgbm90IGVtcHR5IGF0IHVubW91bnQiKTsKIAl9CiAKIAl2ZnJlZShjLT5vcnBoX2J1Zik7CkBAIC05NTQsNyArOTU0LDggQEAKICAqLwogc3RhdGljIGludCBwYXJzZV9zdGFuZGFyZF9vcHRpb24oY29uc3QgY2hhciAqb3B0aW9uKQogewotCXViaWZzX21zZygicGFyc2UgJXMiLCBvcHRpb24pOworCisJcHJfbm90aWNlKCJVQklGUzogcGFyc2UgJXNcbiIsIG9wdGlvbik7CiAJaWYgKCFzdHJjbXAob3B0aW9uLCAic3luYyIpKQogCQlyZXR1cm4gTVNfU1lOQ0hST05PVVM7CiAJcmV0dXJuIDA7CkBAIC0xMDI2LDcgKzEwMjcsNyBAQAogCQkJZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiemxpYiIpKQogCQkJCWMtPm1vdW50X29wdHMuY29tcHJfdHlwZSA9IFVCSUZTX0NPTVBSX1pMSUI7CiAJCQllbHNlIHsKLQkJCQl1Ymlmc19lcnIoInVua25vd24gY29tcHJlc3NvciBcIiVzXCIiLCBuYW1lKTsKKwkJCQl1Ymlmc19lcnIoYywgInVua25vd24gY29tcHJlc3NvciBcIiVzXCIiLCBuYW1lKTsgLy9GSVhNRTogaXMgYyByZWFkeT8KIAkJCQlrZnJlZShuYW1lKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KQEAgLTEwNDIsNyArMTA0Myw3IEBACiAKIAkJCWZsYWcgPSBwYXJzZV9zdGFuZGFyZF9vcHRpb24ocCk7CiAJCQlpZiAoIWZsYWcpIHsKLQkJCQl1Ymlmc19lcnIoInVucmVjb2duaXplZCBtb3VudCBvcHRpb24gXCIlc1wiIG9yIG1pc3NpbmcgdmFsdWUiLAorCQkJCXViaWZzX2VycihjLCAidW5yZWNvZ25pemVkIG1vdW50IG9wdGlvbiBcIiVzXCIgb3IgbWlzc2luZyB2YWx1ZSIsCiAJCQkJCSAgcCk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CkBAIC0xMTA1LDcgKzExMDYsNyBAQAogCQl9CiAKIAkJLyogSnVzdCBkaXNhYmxlIGJ1bGstcmVhZCAqLwotCQl1Ymlmc193YXJuKCJjYW5ub3QgYWxsb2NhdGUgJWQgYnl0ZXMgb2YgbWVtb3J5IGZvciBidWxrLXJlYWQsIGRpc2FibGluZyBpdCIsCisJCXViaWZzX3dhcm4oYywgImNhbm5vdCBhbGxvY2F0ZSAlZCBieXRlcyBvZiBtZW1vcnkgZm9yIGJ1bGstcmVhZCwgZGlzYWJsaW5nIGl0IiwKIAkJCSAgIGMtPm1heF9idV9idWZfbGVuKTsKIAkJYy0+bW91bnRfb3B0cy5idWxrX3JlYWQgPSAxOwogCQljLT5idWxrX3JlYWQgPSAwOwpAQCAtMTEyNCw3ICsxMTI1LDcgQEAKIHsKIAl1Ymlmc19hc3NlcnQoYy0+ZGFya193bSA+IDApOwogCWlmIChjLT5sc3QudG90YWxfZnJlZSArIGMtPmxzdC50b3RhbF9kaXJ0eSA8IGMtPmRhcmtfd20pIHsKLQkJdWJpZnNfZXJyKCJpbnN1ZmZpY2llbnQgZnJlZSBzcGFjZSB0byBtb3VudCBpbiBSL1cgbW9kZSIpOworCQl1Ymlmc19lcnIoYywgImluc3VmZmljaWVudCBmcmVlIHNwYWNlIHRvIG1vdW50IGluIFIvVyBtb2RlIik7CiAJCXViaWZzX2R1bXBfYnVkZyhjLCAmYy0+YmkpOwogCQl1Ymlmc19kdW1wX2xwcm9wcyhjKTsKIAkJcmV0dXJuIC1FTk9TUEM7CkBAIC0xMTY2LDE0ICsxMTY3LDE0IEBACiAJCSAqIFRoaXMgVUJJIHZvbHVtZSBpcyBlbXB0eSwgYW5kIHJlYWQtb25seSwgb3IgdGhlIGZpbGUgc3lzdGVtCiAJCSAqIGlzIG1vdW50ZWQgcmVhZC1vbmx5IC0gd2UgY2Fubm90IGZvcm1hdCBpdC4KIAkJICovCi0JCXViaWZzX2VycigiY2FuJ3QgZm9ybWF0IGVtcHR5IFVCSSB2b2x1bWU6IHJlYWQtb25seSAlcyIsCisJCXViaWZzX2VycihjLCAiY2FuJ3QgZm9ybWF0IGVtcHR5IFVCSSB2b2x1bWU6IHJlYWQtb25seSAlcyIsCiAJCQkgIGMtPnJvX21lZGlhID8gIlVCSSB2b2x1bWUiIDogIm1vdW50Iik7CiAJCWVyciA9IC1FUk9GUzsKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKIAlpZiAoYy0+cm9fbWVkaWEgJiYgIWMtPnJvX21vdW50KSB7Ci0JCXViaWZzX2VycigiY2Fubm90IG1vdW50IHJlYWQtd3JpdGUgLSByZWFkLW9ubHkgbWVkaWEiKTsKKwkJdWJpZnNfZXJyKGMsICJjYW5ub3QgbW91bnQgcmVhZC13cml0ZSAtIHJlYWQtb25seSBtZWRpYSIpOwogCQllcnIgPSAtRVJPRlM7CiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQpAQCAtMTIyMSw3ICsxMjIyLDcgQEAKIAkgKiBvciBvdmVycmlkZGVuIGJ5IG1vdW50IG9wdGlvbnMgaXMgYWN0dWFsbHkgY29tcGlsZWQgaW4uCiAJICovCiAJaWYgKCF1Ymlmc19jb21wcl9wcmVzZW50KGMtPmRlZmF1bHRfY29tcHIpKSB7Ci0JCXViaWZzX2VycigiJ2NvbXByZXNzb3IgXCIlc1wiIGlzIG5vdCBjb21waWxlZCBpbiIsCisJCXViaWZzX2VycihjLCAiJ2NvbXByZXNzb3IgXCIlc1wiIGlzIG5vdCBjb21waWxlZCBpbiIsCiAJCQkgIHViaWZzX2NvbXByX25hbWUoYy0+ZGVmYXVsdF9jb21wcikpOwogCQllcnIgPSAtRU5PVFNVUFA7CiAJCWdvdG8gb3V0X2ZyZWU7CkBAIC0xMjUwLDcgKzEyNTEsNyBAQAogCQlpZiAoSVNfRVJSKGMtPmJndCkpIHsKIAkJCWVyciA9IFBUUl9FUlIoYy0+Ymd0KTsKIAkJCWMtPmJndCA9IE5VTEw7Ci0JCQl1Ymlmc19lcnIoImNhbm5vdCBzcGF3biBcIiVzXCIsIGVycm9yICVkIiwKKwkJCXViaWZzX2VycihjLCAiY2Fubm90IHNwYXduIFwiJXNcIiwgZXJyb3IgJWQiLAogCQkJCSAgYy0+Ymd0X25hbWUsIGVycik7CiAJCQlnb3RvIG91dF93YnVmczsKIAkJfQpAQCAtMTI2NCw3ICsxMjY1LDcgQEAKIAlpbml0X2NvbnN0YW50c19tYXN0ZXIoYyk7CiAKIAlpZiAoKGMtPm1zdF9ub2RlLT5mbGFncyAmIGNwdV90b19sZTMyKFVCSUZTX01TVF9ESVJUWSkpICE9IDApIHsKLQkJdWJpZnNfbXNnKCJyZWNvdmVyeSBuZWVkZWQiKTsKKwkJdWJpZnNfbXNnKGMsICJyZWNvdmVyeSBuZWVkZWQiKTsKIAkJYy0+bmVlZF9yZWNvdmVyeSA9IDE7CiAJfQogCkBAIC0xMjg0LDcgKzEyODUsNyBAQAogCQkJZ290byBvdXRfbHB0OwogCX0KIAotCWlmICghYy0+cm9fbW91bnQpIHsKKwlpZiAoIWMtPnJvX21vdW50ICYmICFjLT5uZWVkX3JlY292ZXJ5KSB7CiAJCS8qCiAJCSAqIFNldCB0aGUgImRpcnR5IiBmbGFnIHNvIHRoYXQgaWYgd2UgcmVib290IHVuY2xlYW5seSB3ZQogCQkgKiB3aWxsIG5vdGljZSB0aGlzIGltbWVkaWF0ZWx5IG9uIHRoZSBuZXh0IG1vdW50LgpAQCAtMTM3MywxMCArMTM3NCwxMCBAQAogCiAJaWYgKGMtPm5lZWRfcmVjb3ZlcnkpIHsKIAkJaWYgKGMtPnJvX21vdW50KQotCQkJdWJpZnNfbXNnKCJyZWNvdmVyeSBkZWZlcnJlZCIpOworCQkJdWJpZnNfbXNnKGMsICJyZWNvdmVyeSBkZWZlcnJlZCIpOwogCQllbHNlIHsKIAkJCWMtPm5lZWRfcmVjb3ZlcnkgPSAwOwotCQkJdWJpZnNfbXNnKCJyZWNvdmVyeSBjb21wbGV0ZWQiKTsKKwkJCXViaWZzX21zZyhjLCAicmVjb3ZlcnkgY29tcGxldGVkIik7CiAJCQkvKgogCQkJICogR0MgTEVCIGhhcyB0byBiZSBlbXB0eSBhbmQgdGFrZW4gYXQgdGhpcyBwb2ludC4gQnV0CiAJCQkgKiB0aGUgam91cm5hbCBoZWFkIExFQnMgbWF5IGFsc28gYmUgYWNjb3VudGVkIGFzCkBAIC0xMzk3LDIwICsxMzk4LDIwIEBACiAKIAljLT5tb3VudGluZyA9IDA7CiAKLQl1Ymlmc19tc2coIm1vdW50ZWQgVUJJIGRldmljZSAlZCwgdm9sdW1lICVkLCBuYW1lIFwiJXNcIiVzIiwKKwl1Ymlmc19tc2coYywgIlVCSUZTOiBtb3VudGVkIFVCSSBkZXZpY2UgJWQsIHZvbHVtZSAlZCwgbmFtZSBcIiVzXCIlcyIsCiAJCSAgYy0+dmkudWJpX251bSwgYy0+dmkudm9sX2lkLCBjLT52aS5uYW1lLAogCQkgIGMtPnJvX21vdW50ID8gIiwgUi9PIG1vZGUiIDogIiIpOwogCXggPSAobG9uZyBsb25nKWMtPm1haW5fbGVicyAqIGMtPmxlYl9zaXplOwogCXkgPSAobG9uZyBsb25nKWMtPmxvZ19sZWJzICogYy0+bGViX3NpemUgKyBjLT5tYXhfYnVkX2J5dGVzOwotCXViaWZzX21zZygiTEVCIHNpemU6ICVkIGJ5dGVzICglZCBLaUIpLCBtaW4uL21heC4gSS9PIHVuaXQgc2l6ZXM6ICVkIGJ5dGVzLyVkIGJ5dGVzIiwKKwl1Ymlmc19tc2coYywgIkxFQiBzaXplOiAlZCBieXRlcyAoJWQgS2lCKSwgbWluLi9tYXguIEkvTyB1bml0IHNpemVzOiAlZCBieXRlcy8lZCBieXRlcyIsCiAJCSAgYy0+bGViX3NpemUsIGMtPmxlYl9zaXplID4+IDEwLCBjLT5taW5faW9fc2l6ZSwKIAkJICBjLT5tYXhfd3JpdGVfc2l6ZSk7Ci0JdWJpZnNfbXNnKCJGUyBzaXplOiAlbGxkIGJ5dGVzICglbGxkIE1pQiwgJWQgTEVCcyksIGpvdXJuYWwgc2l6ZSAlbGxkIGJ5dGVzICglbGxkIE1pQiwgJWQgTEVCcykiLAorCXViaWZzX21zZyhjLCAiRlMgc2l6ZTogJWxsZCBieXRlcyAoJWxsZCBNaUIsICVkIExFQnMpLCBqb3VybmFsIHNpemUgJWxsZCBieXRlcyAoJWxsZCBNaUIsICVkIExFQnMpIiwKIAkJICB4LCB4ID4+IDIwLCBjLT5tYWluX2xlYnMsCiAJCSAgeSwgeSA+PiAyMCwgYy0+bG9nX2xlYnMgKyBjLT5tYXhfYnVkX2NudCk7Ci0JdWJpZnNfbXNnKCJyZXNlcnZlZCBmb3Igcm9vdDogJWxsdSBieXRlcyAoJWxsdSBLaUIpIiwKKwl1Ymlmc19tc2coYywgInJlc2VydmVkIGZvciByb290OiAlbGx1IGJ5dGVzICglbGx1IEtpQikiLAogCQkgIGMtPnJlcG9ydF9ycF9zaXplLCBjLT5yZXBvcnRfcnBfc2l6ZSA+PiAxMCk7Ci0JdWJpZnNfbXNnKCJtZWRpYSBmb3JtYXQ6IHclZC9yJWQgKGxhdGVzdCBpcyB3JWQvciVkKSwgVVVJRCAlcFVCJXMiLAorCXViaWZzX21zZyhjLCAibWVkaWEgZm9ybWF0OiB3JWQvciVkIChsYXRlc3QgaXMgdyVkL3IlZCksIFVVSUQgJXBVQiVzIiwKIAkJICBjLT5mbXRfdmVyc2lvbiwgYy0+cm9fY29tcGF0X3ZlcnNpb24sCiAJCSAgVUJJRlNfRk9STUFUX1ZFUlNJT04sIFVCSUZTX1JPX0NPTVBBVF9WRVJTSU9OLCBjLT51dWlkLAogCQkgIGMtPmJpZ19scHQgPyAiLCBiaWcgTFBUIG1vZGVsIiA6ICIsIHNtYWxsIExQVCBtb2RlbCIpOwpAQCAtMTU0Myw4ICsxNTQ0LDggQEAKIAlpbnQgZXJyLCBsbnVtOwogCiAJaWYgKGMtPnJ3X2luY29tcGF0KSB7Ci0JCXViaWZzX2VycigidGhlIGZpbGUtc3lzdGVtIGlzIG5vdCBSL1ctY29tcGF0aWJsZSIpOwotCQl1Ymlmc19tc2coIm9uLWZsYXNoIGZvcm1hdCB2ZXJzaW9uIGlzIHclZC9yJWQsIGJ1dCBzb2Z0d2FyZSBvbmx5IHN1cHBvcnRzIHVwIHRvIHZlcnNpb24gdyVkL3IlZCIsCisJCXViaWZzX2VycihjLCAidGhlIGZpbGUtc3lzdGVtIGlzIG5vdCBSL1ctY29tcGF0aWJsZSIpOworCQl1Ymlmc19tc2coYywgIm9uLWZsYXNoIGZvcm1hdCB2ZXJzaW9uIGlzIHclZC9yJWQsIGJ1dCBzb2Z0d2FyZSBvbmx5IHN1cHBvcnRzIHVwIHRvIHZlcnNpb24gdyVkL3IlZCIsCiAJCQkgIGMtPmZtdF92ZXJzaW9uLCBjLT5yb19jb21wYXRfdmVyc2lvbiwKIAkJCSAgVUJJRlNfRk9STUFUX1ZFUlNJT04sIFVCSUZTX1JPX0NPTVBBVF9WRVJTSU9OKTsKIAkJcmV0dXJuIC1FUk9GUzsKQEAgLTE1ODEsNyArMTU4Miw3IEBACiAJfQogCiAJaWYgKGMtPm5lZWRfcmVjb3ZlcnkpIHsKLQkJdWJpZnNfbXNnKCJjb21wbGV0aW5nIGRlZmVycmVkIHJlY292ZXJ5Iik7CisJCXViaWZzX21zZyhjLCAiY29tcGxldGluZyBkZWZlcnJlZCByZWNvdmVyeSIpOwogCQllcnIgPSB1Ymlmc193cml0ZV9yY3ZyZF9tc3Rfbm9kZShjKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gb3V0OwpAQCAtMTYzMCw3ICsxNjMxLDcgQEAKIAlpZiAoSVNfRVJSKGMtPmJndCkpIHsKIAkJZXJyID0gUFRSX0VSUihjLT5iZ3QpOwogCQljLT5iZ3QgPSBOVUxMOwotCQl1Ymlmc19lcnIoImNhbm5vdCBzcGF3biBcIiVzXCIsIGVycm9yICVkIiwKKwkJdWJpZnNfZXJyKGMsICJjYW5ub3Qgc3Bhd24gXCIlc1wiLCBlcnJvciAlZCIsCiAJCQkgIGMtPmJndF9uYW1lLCBlcnIpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNjY0LDcgKzE2NjUsNyBAQAogCiAJaWYgKGMtPm5lZWRfcmVjb3ZlcnkpIHsKIAkJYy0+bmVlZF9yZWNvdmVyeSA9IDA7Ci0JCXViaWZzX21zZygiZGVmZXJyZWQgcmVjb3ZlcnkgY29tcGxldGVkIik7CisJCXViaWZzX21zZyhjLCAiZGVmZXJyZWQgcmVjb3ZlcnkgY29tcGxldGVkIik7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogRG8gbm90IHJ1biB0aGUgZGVidWdnaW5nIHNwYWNlIGNoZWNrIGlmIHRoZSB3ZXJlIGRvaW5nCkBAIC0xNzUyLDggKzE3NTMsNyBAQAogCWludCBpOwogCXN0cnVjdCB1Ymlmc19pbmZvICpjID0gc2ItPnNfZnNfaW5mbzsKIAotCXViaWZzX21zZygidW4tbW91bnQgVUJJIGRldmljZSAlZCwgdm9sdW1lICVkIiwgYy0+dmkudWJpX251bSwKLQkJICBjLT52aS52b2xfaWQpOworCXViaWZzX21zZyhjLCAidW4tbW91bnQgVUJJIGRldmljZSAlZCIsIGMtPnZpLnViaV9udW0pOwogCiAJLyoKIAkgKiBUaGUgZm9sbG93aW5nIGFzc2VydHMgYXJlIG9ubHkgdmFsaWQgaWYgdGhlcmUgaGFzIG5vdCBiZWVuIGEgZmFpbHVyZQpAQCAtMTgwOSw3ICsxODA5LDcgQEAKIAkJCQkgKiBuZXh0IG1vdW50LCBzbyB3ZSBqdXN0IHByaW50IGEgbWVzc2FnZSBhbmQKIAkJCQkgKiBjb250aW51ZSB0byB1bm1vdW50IG5vcm1hbGx5LgogCQkJCSAqLwotCQkJCXViaWZzX2VycigiZmFpbGVkIHRvIHdyaXRlIG1hc3RlciBub2RlLCBlcnJvciAlZCIsCisJCQkJdWJpZnNfZXJyKGMsICJmYWlsZWQgdG8gd3JpdGUgbWFzdGVyIG5vZGUsIGVycm9yICVkIiwKIAkJCQkJICBlcnIpOwogCQl9IGVsc2UgewogCQkJZm9yIChpID0gMDsgaSA8IGMtPmpoZWFkX2NudDsgaSsrKQpAQCAtMTgzNCwxNyArMTgzNCwxNyBAQAogCiAJZXJyID0gdWJpZnNfcGFyc2Vfb3B0aW9ucyhjLCBkYXRhLCAxKTsKIAlpZiAoZXJyKSB7Ci0JCXViaWZzX2VycigiaW52YWxpZCBvciB1bmtub3duIHJlbW91bnQgcGFyYW1ldGVyIik7CisJCXViaWZzX2VycihjLCAiaW52YWxpZCBvciB1bmtub3duIHJlbW91bnQgcGFyYW1ldGVyIik7CiAJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKGMtPnJvX21vdW50ICYmICEoKmZsYWdzICYgTVNfUkRPTkxZKSkgewogCQlpZiAoYy0+cm9fZXJyb3IpIHsKLQkJCXViaWZzX21zZygiY2Fubm90IHJlLW1vdW50IFIvVyBkdWUgdG8gcHJpb3IgZXJyb3JzIik7CisJCQl1Ymlmc19tc2coYywgImNhbm5vdCByZS1tb3VudCBSL1cgZHVlIHRvIHByaW9yIGVycm9ycyIpOwogCQkJcmV0dXJuIC1FUk9GUzsKIAkJfQogCQlpZiAoYy0+cm9fbWVkaWEpIHsKLQkJCXViaWZzX21zZygiY2Fubm90IHJlLW1vdW50IFIvVyAtIFVCSSB2b2x1bWUgaXMgUi9PIik7CisJCQl1Ymlmc19tc2coYywgImNhbm5vdCByZS1tb3VudCBSL1cgLSBVQkkgdm9sdW1lIGlzIFIvTyIpOwogCQkJcmV0dXJuIC1FUk9GUzsKIAkJfQogCQllcnIgPSB1Ymlmc19yZW1vdW50X3J3KGMpOwpAQCAtMTg1Miw3ICsxODUyLDcgQEAKIAkJCXJldHVybiBlcnI7CiAJfSBlbHNlIGlmICghYy0+cm9fbW91bnQgJiYgKCpmbGFncyAmIE1TX1JET05MWSkpIHsKIAkJaWYgKGMtPnJvX2Vycm9yKSB7Ci0JCQl1Ymlmc19tc2coImNhbm5vdCByZS1tb3VudCBSL08gZHVlIHRvIHByaW9yIGVycm9ycyIpOworCQkJdWJpZnNfbXNnKGMsICJjYW5ub3QgcmUtbW91bnQgUi9PIGR1ZSB0byBwcmlvciBlcnJvcnMiKTsKIAkJCXJldHVybiAtRVJPRlM7CiAJCX0KIAkJdWJpZnNfcmVtb3VudF9ybyhjKTsKQEAgLTIxMDQsOCArMjEwNCw4IEBACiAJICovCiAJdWJpID0gb3Blbl91YmkobmFtZSwgVUJJX1JFQURPTkxZKTsKIAlpZiAoSVNfRVJSKHViaSkpIHsKLQkJdWJpZnNfZXJyKCJjYW5ub3Qgb3BlbiBcIiVzXCIsIGVycm9yICVkIiwKLQkJCSAgbmFtZSwgKGludClQVFJfRVJSKHViaSkpOworCQlwcl9lcnIoIlVCSUZTIGVycm9yIChwaWQ6ICVkKTogY2Fubm90IG9wZW4gXCIlc1wiLCBlcnJvciAlZCIsCisJCSAgICAgICBjdXJyZW50LT5waWQsIG5hbWUsIChpbnQpUFRSX0VSUih1YmkpKTsKIAkJcmV0dXJuIEVSUl9DQVNUKHViaSk7CiAJfQogCkBAIC0yMjMzLDggKzIyMzMsOCBAQAogCSAqIFVCSUZTX0JMT0NLX1NJWkUuIEl0IGlzIGFzc3VtZWQgdGhhdCBib3RoIGFyZSBwb3dlcnMgb2YgMi4KIAkgKi8KIAlpZiAoUEFHRV9DQUNIRV9TSVpFIDwgVUJJRlNfQkxPQ0tfU0laRSkgewotCQl1Ymlmc19lcnIoIlZGUyBwYWdlIGNhY2hlIHNpemUgaXMgJXUgYnl0ZXMsIGJ1dCBVQklGUyByZXF1aXJlcyBhdCBsZWFzdCA0MDk2IGJ5dGVzIiwKLQkJCSAgKHVuc2lnbmVkIGludClQQUdFX0NBQ0hFX1NJWkUpOworCQlwcl9lcnIoIlVCSUZTIGVycm9yIChwaWQgJWQpOiBWRlMgcGFnZSBjYWNoZSBzaXplIGlzICV1IGJ5dGVzLCBidXQgVUJJRlMgcmVxdWlyZXMgYXQgbGVhc3QgNDA5NiBieXRlcyIsCisJCSAgICAgICBjdXJyZW50LT5waWQsICh1bnNpZ25lZCBpbnQpUEFHRV9DQUNIRV9TSVpFKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yMjU3LDcgKzIyNTcsOCBAQAogCiAJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdWJpZnNfZnNfdHlwZSk7CiAJaWYgKGVycikgewotCQl1Ymlmc19lcnIoImNhbm5vdCByZWdpc3RlciBmaWxlIHN5c3RlbSwgZXJyb3IgJWQiLCBlcnIpOworCQlwcl9lcnIoIlVCSUZTIGVycm9yIChwaWQgJWQpOiBjYW5ub3QgcmVnaXN0ZXIgZmlsZSBzeXN0ZW0sIGVycm9yICVkIiwKKwkJICAgICAgIGN1cnJlbnQtPnBpZCwgZXJyKTsKIAkJZ290byBvdXRfZGJnOwogCX0KIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3RuYy5jIGIvZnMvdWJpZnMvdG5jLmMKaW5kZXggNjc5M2RiMC4uOTU3ZjU3NSAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvdG5jLmMKKysrIGIvZnMvdWJpZnMvdG5jLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAkJZWxzZSBpZiAob2ZmcyA+IG8tPm9mZnMpCiAJCQlwID0gJigqcCktPnJiX3JpZ2h0OwogCQllbHNlIHsKLQkJCXViaWZzX2Vycigib2xkIGlkeCBhZGRlZCB0d2ljZSEiKTsKKwkJCXViaWZzX2VycihjLCAib2xkIGlkeCBhZGRlZCB0d2ljZSEiKTsKIAkJCWtmcmVlKG9sZF9pZHgpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCiAJZXJyID0gdWJpZnNfbGViX3JlYWQoYywgbG51bSwgYnVmLCBvZmZzLCBsZW4sIDEpOwogCWlmIChlcnIpIHsKLQkJdWJpZnNfZXJyKCJjYW5ub3QgcmVhZCBub2RlIHR5cGUgJWQgZnJvbSBMRUIgJWQ6JWQsIGVycm9yICVkIiwKKwkJdWJpZnNfZXJyKGMsICJjYW5ub3QgcmVhZCBub2RlIHR5cGUgJWQgZnJvbSBMRUIgJWQ6JWQsIGVycm9yICVkIiwKIAkJCSAgdHlwZSwgbG51bSwgb2ZmcywgZXJyKTsKIAkJcmV0dXJuIGVycjsKIAl9CkBAIC0xNjg0LDI3ICsxNjg0LDI3IEBACiAJaW50IGVyciwgbGVuOwogCiAJaWYgKGNoLT5ub2RlX3R5cGUgIT0gVUJJRlNfREFUQV9OT0RFKSB7Ci0JCXViaWZzX2VycigiYmFkIG5vZGUgdHlwZSAoJWQgYnV0IGV4cGVjdGVkICVkKSIsCisJCXViaWZzX2VycihjLCAiYmFkIG5vZGUgdHlwZSAoJWQgYnV0IGV4cGVjdGVkICVkKSIsCiAJCQkgIGNoLT5ub2RlX3R5cGUsIFVCSUZTX0RBVEFfTk9ERSk7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAllcnIgPSB1Ymlmc19jaGVja19ub2RlKGMsIGJ1ZiwgemJyLT5sbnVtLCB6YnItPm9mZnMsIDAsIDApOwogCWlmIChlcnIpIHsKLQkJdWJpZnNfZXJyKCJleHBlY3RlZCBub2RlIHR5cGUgJWQiLCBVQklGU19EQVRBX05PREUpOworCQl1Ymlmc19lcnIoYywgImV4cGVjdGVkIG5vZGUgdHlwZSAlZCIsIFVCSUZTX0RBVEFfTk9ERSk7CiAJCWdvdG8gb3V0OwogCX0KIAogCWxlbiA9IGxlMzJfdG9fY3B1KGNoLT5sZW4pOwogCWlmIChsZW4gIT0gemJyLT5sZW4pIHsKLQkJdWJpZnNfZXJyKCJiYWQgbm9kZSBsZW5ndGggJWQsIGV4cGVjdGVkICVkIiwgbGVuLCB6YnItPmxlbik7CisJCXViaWZzX2VycihjLCAiYmFkIG5vZGUgbGVuZ3RoICVkLCBleHBlY3RlZCAlZCIsIGxlbiwgemJyLT5sZW4pOwogCQlnb3RvIG91dF9lcnI7CiAJfQogCiAJLyogTWFrZSBzdXJlIHRoZSBrZXkgb2YgdGhlIHJlYWQgbm9kZSBpcyBjb3JyZWN0ICovCiAJa2V5X3JlYWQoYywgYnVmICsgVUJJRlNfS0VZX09GRlNFVCwgJmtleTEpOwogCWlmICgha2V5c19lcShjLCAmemJyLT5rZXksICZrZXkxKSkgewotCQl1Ymlmc19lcnIoImJhZCBrZXkgaW4gbm9kZSBhdCBMRUIgJWQ6JWQiLAorCQl1Ymlmc19lcnIoYywgImJhZCBrZXkgaW4gbm9kZSBhdCBMRUIgJWQ6JWQiLAogCQkJICB6YnItPmxudW0sIHpici0+b2Zmcyk7CiAJCWRiZ190bmNrKCZ6YnItPmtleSwgImxvb2tlZCBmb3Iga2V5ICIpOwogCQlkYmdfdG5jaygma2V5MSwgImZvdW5kIG5vZGUncyBrZXkgIik7CkBAIC0xNzE2LDcgKzE3MTYsNyBAQAogb3V0X2VycjoKIAllcnIgPSAtRUlOVkFMOwogb3V0OgotCXViaWZzX2VycigiYmFkIG5vZGUgYXQgTEVCICVkOiVkIiwgemJyLT5sbnVtLCB6YnItPm9mZnMpOworCXViaWZzX2VycihjLCAiYmFkIG5vZGUgYXQgTEVCICVkOiVkIiwgemJyLT5sbnVtLCB6YnItPm9mZnMpOwogCXViaWZzX2R1bXBfbm9kZShjLCBidWYpOwogCWR1bXBfc3RhY2soKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTc0MSw3ICsxNzQxLDcgQEAKIAlsZW4gPSBidS0+emJyYW5jaFtidS0+Y250IC0gMV0ub2ZmczsKIAlsZW4gKz0gYnUtPnpicmFuY2hbYnUtPmNudCAtIDFdLmxlbiAtIG9mZnM7CiAJaWYgKGxlbiA+IGJ1LT5idWZfbGVuKSB7Ci0JCXViaWZzX2VycigiYnVmZmVyIHRvbyBzbWFsbCAlZCB2cyAlZCIsIGJ1LT5idWZfbGVuLCBsZW4pOworCQl1Ymlmc19lcnIoYywgImJ1ZmZlciB0b28gc21hbGwgJWQgdnMgJWQiLCBidS0+YnVmX2xlbiwgbGVuKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNzU3LDcgKzE3NTcsNyBAQAogCQlyZXR1cm4gLUVBR0FJTjsKIAogCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKSB7Ci0JCXViaWZzX2VycigiZmFpbGVkIHRvIHJlYWQgZnJvbSBMRUIgJWQ6JWQsIGVycm9yICVkIiwKKwkJdWJpZnNfZXJyKGMsICJmYWlsZWQgdG8gcmVhZCBmcm9tIExFQiAlZDolZCwgZXJyb3IgJWQiLAogCQkJICBsbnVtLCBvZmZzLCBlcnIpOwogCQlkdW1wX3N0YWNrKCk7CiAJCWRiZ190bmNrKCZidS0+a2V5LCAia2V5ICIpOwpAQCAtMzMxMyw3ICszMzEzLDcgQEAKIAogb3V0X2R1bXA6CiAJYmxvY2sgPSBrZXlfYmxvY2soYywga2V5KTsKLQl1Ymlmc19lcnIoImlub2RlICVsdSBoYXMgc2l6ZSAlbGxkLCBidXQgdGhlcmUgYXJlIGRhdGEgYXQgb2Zmc2V0ICVsbGQiLAorCXViaWZzX2VycihjLCAiaW5vZGUgJWx1IGhhcyBzaXplICVsbGQsIGJ1dCB0aGVyZSBhcmUgZGF0YSBhdCBvZmZzZXQgJWxsZCIsCiAJCSAgKHVuc2lnbmVkIGxvbmcpaW5vZGUtPmlfaW5vLCBzaXplLAogCQkgICgobG9mZl90KWJsb2NrKSA8PCBVQklGU19CTE9DS19TSElGVCk7CiAJbXV0ZXhfdW5sb2NrKCZjLT50bmNfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvdG5jX2NvbW1pdC5jIGIvZnMvdWJpZnMvdG5jX2NvbW1pdC5jCmluZGV4IDdhMjA1ZTAuLmI0NTM0NWQgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3RuY19jb21taXQuYworKysgYi9mcy91Ymlmcy90bmNfY29tbWl0LmMKQEAgLTUzLDcgKzUzLDcgQEAKIAkJYnItPm9mZnMgPSBjcHVfdG9fbGUzMih6YnItPm9mZnMpOwogCQlici0+bGVuID0gY3B1X3RvX2xlMzIoemJyLT5sZW4pOwogCQlpZiAoIXpici0+bG51bSB8fCAhemJyLT5sZW4pIHsKLQkJCXViaWZzX2VycigiYmFkIHJlZiBpbiB6bm9kZSIpOworCQkJdWJpZnNfZXJyKGMsICJiYWQgcmVmIGluIHpub2RlIik7CiAJCQl1Ymlmc19kdW1wX3pub2RlKGMsIHpub2RlKTsKIAkJCWlmICh6YnItPnpub2RlKQogCQkJCXViaWZzX2R1bXBfem5vZGUoYywgemJyLT56bm9kZSk7CkBAIC0zODQsNyArMzg0LDcgQEAKIAkJCQkgKiBEbyBub3QgcHJpbnQgc2Nhcnkgd2FybmluZ3MgaWYgdGhlIGRlYnVnZ2luZwogCQkJCSAqIG9wdGlvbiB3aGljaCBmb3JjZXMgaW4tdGhlLWdhcHMgaXMgZW5hYmxlZC4KIAkJCQkgKi8KLQkJCQl1Ymlmc193YXJuKCJvdXQgb2Ygc3BhY2UiKTsKKwkJCQl1Ymlmc193YXJuKGMsICJvdXQgb2Ygc3BhY2UiKTsKIAkJCQl1Ymlmc19kdW1wX2J1ZGcoYywgJmMtPmJpKTsKIAkJCQl1Ymlmc19kdW1wX2xwcm9wcyhjKTsKIAkJCX0KQEAgLTQ0MSw3ICs0NDEsNyBAQAogCQkvKiBEZXRlcm1pbmUgdGhlIGluZGV4IG5vZGUgcG9zaXRpb24gKi8KIAkJaWYgKGxudW0gPT0gLTEpIHsKIAkJCWlmIChjLT5pbGViX254dCA+PSBjLT5pbGViX2NudCkgewotCQkJCXViaWZzX2Vycigib3V0IG9mIHNwYWNlIik7CisJCQkJdWJpZnNfZXJyKGMsICJvdXQgb2Ygc3BhY2UiKTsKIAkJCQlyZXR1cm4gLUVOT1NQQzsKIAkJCX0KIAkJCWxudW0gPSBjLT5pbGVic1tjLT5pbGViX254dCsrXTsKQEAgLTg1NSw3ICs4NTUsNyBAQAogCQkJYnItPm9mZnMgPSBjcHVfdG9fbGUzMih6YnItPm9mZnMpOwogCQkJYnItPmxlbiA9IGNwdV90b19sZTMyKHpici0+bGVuKTsKIAkJCWlmICghemJyLT5sbnVtIHx8ICF6YnItPmxlbikgewotCQkJCXViaWZzX2VycigiYmFkIHJlZiBpbiB6bm9kZSIpOworCQkJCXViaWZzX2VycihjLCAiYmFkIHJlZiBpbiB6bm9kZSIpOwogCQkJCXViaWZzX2R1bXBfem5vZGUoYywgem5vZGUpOwogCQkJCWlmICh6YnItPnpub2RlKQogCQkJCQl1Ymlmc19kdW1wX3pub2RlKGMsIHpici0+em5vZGUpOwpAQCAtODc1LDcgKzg3NSw3IEBACiAKIAkJaWYgKGxudW0gIT0gem5vZGUtPmxudW0gfHwgb2ZmcyAhPSB6bm9kZS0+b2ZmcyB8fAogCQkgICAgbGVuICE9IHpub2RlLT5sZW4pIHsKLQkJCXViaWZzX2VycigiaW5jb25zaXN0ZW50IHpub2RlIHBvc24iKTsKKwkJCXViaWZzX2VycihjLCAiaW5jb25zaXN0ZW50IHpub2RlIHBvc24iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTk3Myw3ICs5NzMsNyBAQAogCiAJaWYgKGxudW0gIT0gYy0+ZGJnLT5uZXdfaWhlYWRfbG51bSB8fAogCSAgICBidWZfb2ZmcyAhPSBjLT5kYmctPm5ld19paGVhZF9vZmZzKSB7Ci0JCXViaWZzX2VycigiaW5jb25zaXN0ZW50IGloZWFkIik7CisJCXViaWZzX2VycihjLCAiaW5jb25zaXN0ZW50IGloZWFkIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApkaWZmIC0tZ2l0IGEvZnMvdWJpZnMvdG5jX21pc2MuYyBiL2ZzL3ViaWZzL3RuY19taXNjLmMKaW5kZXggZjZiZjg5OS4uOTNmNWI3OCAxMDA2NDQKLS0tIGEvZnMvdWJpZnMvdG5jX21pc2MuYworKysgYi9mcy91Ymlmcy90bmNfbWlzYy5jCkBAIC0yOTMsOSArMjkzLDkgQEAKIAkJbG51bSwgb2Zmcywgem5vZGUtPmxldmVsLCB6bm9kZS0+Y2hpbGRfY250KTsKIAogCWlmICh6bm9kZS0+Y2hpbGRfY250ID4gYy0+ZmFub3V0IHx8IHpub2RlLT5sZXZlbCA+IFVCSUZTX01BWF9MRVZFTFMpIHsKLQkJdWJpZnNfZXJyKCJjdXJyZW50IGZhbm91dCAlZCwgYnJhbmNoIGNvdW50ICVkIiwKKwkJdWJpZnNfZXJyKGMsICJjdXJyZW50IGZhbm91dCAlZCwgYnJhbmNoIGNvdW50ICVkIiwKIAkJCSAgYy0+ZmFub3V0LCB6bm9kZS0+Y2hpbGRfY250KTsKLQkJdWJpZnNfZXJyKCJtYXggbGV2ZWxzICVkLCB6bm9kZSBsZXZlbCAlZCIsCisJCXViaWZzX2VycihjLCAibWF4IGxldmVscyAlZCwgem5vZGUgbGV2ZWwgJWQiLAogCQkJICBVQklGU19NQVhfTEVWRUxTLCB6bm9kZS0+bGV2ZWwpOwogCQllcnIgPSAxOwogCQlnb3RvIG91dF9kdW1wOwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJCWlmICh6YnItPmxudW0gPCBjLT5tYWluX2ZpcnN0IHx8CiAJCSAgICB6YnItPmxudW0gPj0gYy0+bGViX2NudCB8fCB6YnItPm9mZnMgPCAwIHx8CiAJCSAgICB6YnItPm9mZnMgKyB6YnItPmxlbiA+IGMtPmxlYl9zaXplIHx8IHpici0+b2ZmcyAmIDcpIHsKLQkJCXViaWZzX2VycigiYmFkIGJyYW5jaCAlZCIsIGkpOworCQkJdWJpZnNfZXJyKGMsICJiYWQgYnJhbmNoICVkIiwgaSk7CiAJCQllcnIgPSAyOwogCQkJZ290byBvdXRfZHVtcDsKIAkJfQpAQCAtMzI4LDcgKzMyOCw3IEBACiAJCWNhc2UgVUJJRlNfWEVOVF9LRVk6CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXViaWZzX2VycigiYmFkIGtleSB0eXBlIGF0IHNsb3QgJWQ6ICVkIiwKKwkJCXViaWZzX2VycihjLCAiYmFkIGtleSB0eXBlIGF0IHNsb3QgJWQ6ICVkIiwKIAkJCQkgIGksIGtleV90eXBlKGMsICZ6YnItPmtleSkpOwogCQkJZXJyID0gMzsKIAkJCWdvdG8gb3V0X2R1bXA7CkBAIC0zNDAsMTcgKzM0MCwxNyBAQAogCQl0eXBlID0ga2V5X3R5cGUoYywgJnpici0+a2V5KTsKIAkJaWYgKGMtPnJhbmdlc1t0eXBlXS5tYXhfbGVuID09IDApIHsKIAkJCWlmICh6YnItPmxlbiAhPSBjLT5yYW5nZXNbdHlwZV0ubGVuKSB7Ci0JCQkJdWJpZnNfZXJyKCJiYWQgdGFyZ2V0IG5vZGUgKHR5cGUgJWQpIGxlbmd0aCAoJWQpIiwKKwkJCQl1Ymlmc19lcnIoYywgImJhZCB0YXJnZXQgbm9kZSAodHlwZSAlZCkgbGVuZ3RoICglZCkiLAogCQkJCQkgIHR5cGUsIHpici0+bGVuKTsKLQkJCQl1Ymlmc19lcnIoImhhdmUgdG8gYmUgJWQiLCBjLT5yYW5nZXNbdHlwZV0ubGVuKTsKKwkJCQl1Ymlmc19lcnIoYywgImhhdmUgdG8gYmUgJWQiLCBjLT5yYW5nZXNbdHlwZV0ubGVuKTsKIAkJCQllcnIgPSA0OwogCQkJCWdvdG8gb3V0X2R1bXA7CiAJCQl9CiAJCX0gZWxzZSBpZiAoemJyLT5sZW4gPCBjLT5yYW5nZXNbdHlwZV0ubWluX2xlbiB8fAogCQkJICAgemJyLT5sZW4gPiBjLT5yYW5nZXNbdHlwZV0ubWF4X2xlbikgewotCQkJdWJpZnNfZXJyKCJiYWQgdGFyZ2V0IG5vZGUgKHR5cGUgJWQpIGxlbmd0aCAoJWQpIiwKKwkJCXViaWZzX2VycihjLCAiYmFkIHRhcmdldCBub2RlICh0eXBlICVkKSBsZW5ndGggKCVkKSIsCiAJCQkJICB0eXBlLCB6YnItPmxlbik7Ci0JCQl1Ymlmc19lcnIoImhhdmUgdG8gYmUgaW4gcmFuZ2Ugb2YgJWQtJWQiLAorCQkJdWJpZnNfZXJyKGMsICJoYXZlIHRvIGJlIGluIHJhbmdlIG9mICVkLSVkIiwKIAkJCQkgIGMtPnJhbmdlc1t0eXBlXS5taW5fbGVuLAogCQkJCSAgYy0+cmFuZ2VzW3R5cGVdLm1heF9sZW4pOwogCQkJZXJyID0gNTsKQEAgLTM3MCwxMiArMzcwLDEyIEBACiAKIAkJY21wID0ga2V5c19jbXAoYywga2V5MSwga2V5Mik7CiAJCWlmIChjbXAgPiAwKSB7Ci0JCQl1Ymlmc19lcnIoImJhZCBrZXkgb3JkZXIgKGtleXMgJWQgYW5kICVkKSIsIGksIGkgKyAxKTsKKwkJCXViaWZzX2VycihjLCAiYmFkIGtleSBvcmRlciAoa2V5cyAlZCBhbmQgJWQpIiwgaSwgaSArIDEpOwogCQkJZXJyID0gNjsKIAkJCWdvdG8gb3V0X2R1bXA7CiAJCX0gZWxzZSBpZiAoY21wID09IDAgJiYgIWlzX2hhc2hfa2V5KGMsIGtleTEpKSB7CiAJCQkvKiBUaGVzZSBjYW4gb25seSBiZSBrZXlzIHdpdGggY29sbGlkaW5nIGhhc2ggKi8KLQkJCXViaWZzX2Vycigia2V5cyAlZCBhbmQgJWQgYXJlIG5vdCBoYXNoZWQgYnV0IGVxdWl2YWxlbnQiLAorCQkJdWJpZnNfZXJyKGMsICJrZXlzICVkIGFuZCAlZCBhcmUgbm90IGhhc2hlZCBidXQgZXF1aXZhbGVudCIsCiAJCQkJICBpLCBpICsgMSk7CiAJCQllcnIgPSA3OwogCQkJZ290byBvdXRfZHVtcDsKQEAgLTM4Niw3ICszODYsNyBAQAogCXJldHVybiAwOwogCiBvdXRfZHVtcDoKLQl1Ymlmc19lcnIoImJhZCBpbmRleGluZyBub2RlIGF0IExFQiAlZDolZCwgZXJyb3IgJWQiLCBsbnVtLCBvZmZzLCBlcnIpOworCXViaWZzX2VycihjLCAiYmFkIGluZGV4aW5nIG5vZGUgYXQgTEVCICVkOiVkLCBlcnJvciAlZCIsIGxudW0sIG9mZnMsIGVycik7CiAJdWJpZnNfZHVtcF9ub2RlKGMsIGlkeCk7CiAJa2ZyZWUoaWR4KTsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ4Miw3ICs0ODIsNyBAQAogCS8qIE1ha2Ugc3VyZSB0aGUga2V5IG9mIHRoZSByZWFkIG5vZGUgaXMgY29ycmVjdCAqLwogCWtleV9yZWFkKGMsIG5vZGUgKyBVQklGU19LRVlfT0ZGU0VULCAma2V5MSk7CiAJaWYgKCFrZXlzX2VxKGMsIGtleSwgJmtleTEpKSB7Ci0JCXViaWZzX2VycigiYmFkIGtleSBpbiBub2RlIGF0IExFQiAlZDolZCIsCisJCXViaWZzX2VycihjLCAiYmFkIGtleSBpbiBub2RlIGF0IExFQiAlZDolZCIsCiAJCQkgIHpici0+bG51bSwgemJyLT5vZmZzKTsKIAkJZGJnX3RuY2soa2V5LCAibG9va2VkIGZvciBrZXkgIik7CiAJCWRiZ190bmNrKCZrZXkxLCAiYnV0IGZvdW5kIG5vZGUncyBrZXkgIik7CmRpZmYgLS1naXQgYS9mcy91Ymlmcy91Ymlmcy5oIGIvZnMvdWJpZnMvdWJpZnMuaAppbmRleCBiYzA0YjljLi5kZTc1OTAyIDEwMDY0NAotLS0gYS9mcy91Ymlmcy91Ymlmcy5oCisrKyBiL2ZzL3ViaWZzL3ViaWZzLmgKQEAgLTQzLDE1ICs0MywxOSBAQAogI2RlZmluZSBVQklGU19WRVJTSU9OIDEKIAogLyogTm9ybWFsIFVCSUZTIG1lc3NhZ2VzICovCi0jZGVmaW5lIHViaWZzX21zZyhmbXQsIC4uLikgcHJfbm90aWNlKCJVQklGUzogIiBmbXQgIlxuIiwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgdWJpZnNfbXNnKGMsIGZtdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXByX25vdGljZSgiVUJJRlMgKHViaSVkOiVkKTogIiBmbXQgIlxuIiwgICAgICAgICAgICAgICAgICAgIFwKKwkJICAoYyktPnZpLnViaV9udW0sIChjKS0+dmkudm9sX2lkLCAjI19fVkFfQVJHU19fKQogLyogVUJJRlMgZXJyb3IgbWVzc2FnZXMgKi8KLSNkZWZpbmUgdWJpZnNfZXJyKGZtdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCXByX2VycigiVUJJRlMgZXJyb3IgKHBpZCAlZCk6ICVzOiAiIGZtdCAiXG4iLCBjdXJyZW50LT5waWQsIFwKKyNkZWZpbmUgdWJpZnNfZXJyKGMsIGZtdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXByX2VycigiVUJJRlMgZXJyb3IgKHViaSVkOiVkIHBpZCAlZCk6ICVzOiAiIGZtdCAiXG4iLCAgICAgIFwKKwkgICAgICAgKGMpLT52aS51YmlfbnVtLCAoYyktPnZpLnZvbF9pZCwgY3VycmVudC0+cGlkLCAgICAgICBcCiAJICAgICAgIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKQogLyogVUJJRlMgd2FybmluZyBtZXNzYWdlcyAqLwotI2RlZmluZSB1Ymlmc193YXJuKGZtdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JcHJfd2FybigiVUJJRlMgd2FybmluZyAocGlkICVkKTogJXM6ICIgZm10ICJcbiIsICAgICAgICAgICAgXAotCQljdXJyZW50LT5waWQsIF9fZnVuY19fLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSB1Ymlmc193YXJuKGMsIGZtdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcHJfd2FybigiVUJJRlMgd2FybmluZyAodWJpJWQ6JWQgcGlkICVkKTogJXM6ICIgZm10ICJcbiIsICAgXAorCQkoYyktPnZpLnViaV9udW0sIChjKS0+dmkudm9sX2lkLCBjdXJyZW50LT5waWQsICAgICAgXAorCQlfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXykKIC8qCiAgKiBBIHZhcmlhbnQgb2YgJ3ViaWZzX2VycigpJyB3aGljaCB0YWtlcyB0aGUgVUJJRlMgZmlsZS1zeXRlbSBkZXNjcmlwdGlvbgogICogb2JqZWN0IGFzIGFuIGFyZ3VtZW50LgpAQCAtNTksNyArNjMsNyBAQAogI2RlZmluZSB1Ymlmc19lcnJjKGMsIGZtdCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCQlpZiAoIShjKS0+cHJvYmluZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCQkJdWJpZnNfZXJyKGZtdCwgIyNfX1ZBX0FSR1NfXyk7ICAgICAgICAgICAgICBcCisJCQl1Ymlmc19lcnIoYywgZm10LCAjI19fVkFfQVJHU19fKTsgICAgICAgICAgIFwKIAl9IHdoaWxlICgwKQogCiAvKiBVQklGUyBmaWxlIHN5c3RlbSBWRlMgbWFnaWMgbnVtYmVyICovCkBAIC0xNTgsNyArMTYyLDcgQEAKICNkZWZpbmUgV09SU1RfQ09NUFJfRkFDVE9SIDIKIAogLyoKLSAqIEhvdyBtdWNoIG1lbW9yeSBpcyBuZWVkZWQgZm9yIGEgYnVmZmVyIHdoZXJlIHdlIGNvbXJlc3MgYSBkYXRhIG5vZGUuCisgKiBIb3cgbXVjaCBtZW1vcnkgaXMgbmVlZGVkIGZvciBhIGJ1ZmZlciB3aGVyZSB3ZSBjb21wcmVzcyBhIGRhdGEgbm9kZS4KICAqLwogI2RlZmluZSBDT01QUkVTU0VEX0RBVEFfTk9ERV9CVUZfU1ogXAogCShVQklGU19EQVRBX05PREVfU1ogKyBVQklGU19CTE9DS19TSVpFICogV09SU1RfQ09NUFJfRkFDVE9SKQpAQCAtNjY0LDcgKzY2OCw3IEBACiAgKiBAbG9jazogc2VyaWFsaXplcyBAYnVmLCBAbG51bSwgQG9mZnMsIEBhdmFpbCwgQHVzZWQsIEBuZXh0X2lubyBhbmQgQGlub2RlcwogICogICAgICAgIGZpZWxkcwogICogQHNvZnRsaW1pdDogc29mdCB3cml0ZS1idWZmZXIgdGltZW91dCBpbnRlcnZhbAotICogQGRlbHRhOiBoYXJkIGFuZCBzb2Z0IHRpbWVvdXRzIGRlbHRhICh0aGUgdGltZXIgZXhwaXJlIGludGV2YWwgaXMgQHNvZnRsaW1pdAorICogQGRlbHRhOiBoYXJkIGFuZCBzb2Z0IHRpbWVvdXRzIGRlbHRhICh0aGUgdGltZXIgZXhwaXJlIGludGVydmFsIGlzIEBzb2Z0bGltaXQKICAqICAgICAgICAgYW5kIEBzb2Z0bGltaXQgKyBAZGVsdGEpCiAgKiBAdGltZXI6IHdyaXRlLWJ1ZmZlciB0aW1lcgogICogQG5vX3RpbWVyOiBub24temVybyBpZiB0aGlzIHdyaXRlLWJ1ZmZlciBkb2VzIG5vdCBoYXZlIGEgdGltZXIKQEAgLTkzMCw5ICs5MzQsOSBAQAogLyoqCiAgKiBzdHJ1Y3QgdWJpZnNfbW91bnRfb3B0cyAtIFVCSUZTLXNwZWNpZmljIG1vdW50IG9wdGlvbnMgaW5mb3JtYXRpb24uCiAgKiBAdW5tb3VudF9tb2RlOiBzZWxlY3RlZCB1bm1vdW50IG1vZGUgKCUwIGRlZmF1bHQsICUxIG5vcm1hbCwgJTIgZmFzdCkKLSAqIEBidWxrX3JlYWQ6IGVuYWJsZS9kaXNhYmxlIGJ1bGstcmVhZHMgKCUwIGRlZmF1bHQsICUxIGRpc2FiZSwgJTIgZW5hYmxlKQorICogQGJ1bGtfcmVhZDogZW5hYmxlL2Rpc2FibGUgYnVsay1yZWFkcyAoJTAgZGVmYXVsdCwgJTEgZGlzYWJsZSwgJTIgZW5hYmxlKQogICogQGNoa19kYXRhX2NyYzogZW5hYmxlL2Rpc2FibGUgQ1JDIGRhdGEgY2hlY2tpbmcgd2hlbiByZWFkaW5nIGRhdGEgbm9kZXMKLSAqICAgICAgICAgICAgICAgICglMCBkZWZhdWx0LCAlMSBkaXNhYmUsICUyIGVuYWJsZSkKKyAqICAgICAgICAgICAgICAgICglMCBkZWZhdWx0LCAlMSBkaXNhYmxlLCAlMiBlbmFibGUpCiAgKiBAb3ZlcnJpZGVfY29tcHI6IG92ZXJyaWRlIGRlZmF1bHQgY29tcHJlc3NvciAoJTAgLSBkbyBub3Qgb3ZlcnJpZGUgYW5kIHVzZQogICogICAgICAgICAgICAgICAgICBzdXBlcmJsb2NrIGNvbXByZXNzb3IsICUxIC0gb3ZlcnJpZGUgYW5kIHVzZSBjb21wcmVzc29yCiAgKiAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBpbiBAY29tcHJfdHlwZSkKQEAgLTk2Miw5ICs5NjYsOSBAQAogICogICAgICAgICAgIG9wdGltaXphdGlvbikKICAqIEBub3NwYWNlX3JwOiB0aGUgc2FtZSBhcyBAbm9zcGFjZSwgYnV0IGFkZGl0aW9uYWxseSBtZWFucyB0aGF0IGV2ZW4gcmVzZXJ2ZWQKICAqICAgICAgICAgICAgICBwb29sIGlzIGZ1bGwKLSAqIEBwYWdlX2J1ZGdldDogYnVkZ2V0IGZvciBhIHBhZ2UgKGNvbnN0YW50LCBuZW52ZXIgY2hhbmdlZCBhZnRlciBtb3VudCkKLSAqIEBpbm9kZV9idWRnZXQ6IGJ1ZGdldCBmb3IgYW4gaW5vZGUgKGNvbnN0YW50LCBuZW52ZXIgY2hhbmdlZCBhZnRlciBtb3VudCkKLSAqIEBkZW50X2J1ZGdldDogYnVkZ2V0IGZvciBhIGRpcmVjdG9yeSBlbnRyeSAoY29uc3RhbnQsIG5lbnZlciBjaGFuZ2VkIGFmdGVyCisgKiBAcGFnZV9idWRnZXQ6IGJ1ZGdldCBmb3IgYSBwYWdlIChjb25zdGFudCwgbmV2ZXIgY2hhbmdlZCBhZnRlciBtb3VudCkKKyAqIEBpbm9kZV9idWRnZXQ6IGJ1ZGdldCBmb3IgYW4gaW5vZGUgKGNvbnN0YW50LCBuZXZlciBjaGFuZ2VkIGFmdGVyIG1vdW50KQorICogQGRlbnRfYnVkZ2V0OiBidWRnZXQgZm9yIGEgZGlyZWN0b3J5IGVudHJ5IChjb25zdGFudCwgbmV2ZXIgY2hhbmdlZCBhZnRlcgogICogICAgICAgICAgICAgICBtb3VudCkKICAqLwogc3RydWN0IHViaWZzX2J1ZGdfaW5mbyB7CkBAIC0xNzg3LDEwICsxNzkxLDEwIEBACiAvKiBjb21wcmVzc29yLmMgKi8KIGludCBfX2luaXQgdWJpZnNfY29tcHJlc3NvcnNfaW5pdCh2b2lkKTsKIHZvaWQgdWJpZnNfY29tcHJlc3NvcnNfZXhpdCh2b2lkKTsKLXZvaWQgdWJpZnNfY29tcHJlc3MoY29uc3Qgdm9pZCAqaW5fYnVmLCBpbnQgaW5fbGVuLCB2b2lkICpvdXRfYnVmLCBpbnQgKm91dF9sZW4sCi0JCSAgICBpbnQgKmNvbXByX3R5cGUpOwotaW50IHViaWZzX2RlY29tcHJlc3MoY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuLCB2b2lkICpvdXQsIGludCAqb3V0X2xlbiwKLQkJICAgICBpbnQgY29tcHJfdHlwZSk7Cit2b2lkIHViaWZzX2NvbXByZXNzKGNvbnN0IHN0cnVjdCB1Ymlmc19pbmZvICpjLCBjb25zdCB2b2lkICppbl9idWYsIGludCBpbl9sZW4sCisJCSAgICB2b2lkICpvdXRfYnVmLCBpbnQgKm91dF9sZW4sIGludCAqY29tcHJfdHlwZSk7CitpbnQgdWJpZnNfZGVjb21wcmVzcyhjb25zdCBzdHJ1Y3QgdWJpZnNfaW5mbyAqYywgY29uc3Qgdm9pZCAqYnVmLCBpbnQgbGVuLAorCQkgICAgIHZvaWQgKm91dCwgaW50ICpvdXRfbGVuLCBpbnQgY29tcHJfdHlwZSk7CiAKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgIm1pc2MuaCIKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3hhdHRyLmMgYi9mcy91Ymlmcy94YXR0ci5jCmluZGV4IGE5MmJlMjQuLjM2NTliMTkgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3hhdHRyLmMKKysrIGIvZnMvdWJpZnMveGF0dHIuYwpAQCAtMTA4LDcgKzEwOCw3IEBACiAJCQkJLmRpcnRpZWRfaW5vX2QgPSBBTElHTihob3N0X3VpLT5kYXRhX2xlbiwgOCkgfTsKIAogCWlmIChob3N0X3VpLT54YXR0cl9jbnQgPj0gTUFYX1hBVFRSU19QRVJfSU5PREUpIHsKLQkJdWJpZnNfZXJyKCJpbm9kZSAlbHUgYWxyZWFkeSBoYXMgdG9vIG1hbnkgeGF0dHJzICglZCksIGNhbm5vdCBjcmVhdGUgbW9yZSIsCisJCXViaWZzX2VycihjLCAiaW5vZGUgJWx1IGFscmVhZHkgaGFzIHRvbyBtYW55IHhhdHRycyAoJWQpLCBjYW5ub3QgY3JlYXRlIG1vcmUiLAogCQkJICBob3N0LT5pX2lubywgaG9zdF91aS0+eGF0dHJfY250KTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQpAQCAtMTIwLDcgKzEyMCw3IEBACiAJICovCiAJbmFtZXNfbGVuID0gaG9zdF91aS0+eGF0dHJfbmFtZXMgKyBob3N0X3VpLT54YXR0cl9jbnQgKyBubS0+bGVuICsgMTsKIAlpZiAobmFtZXNfbGVuID4gWEFUVFJfTElTVF9NQVgpIHsKLQkJdWJpZnNfZXJyKCJjYW5ub3QgYWRkIG9uZSBtb3JlIHhhdHRyIG5hbWUgdG8gaW5vZGUgJWx1LCB0b3RhbCBuYW1lcyBsZW5ndGggd291bGQgYmVjb21lICVkLCBtYXguIGlzICVkIiwKKwkJdWJpZnNfZXJyKGMsICJjYW5ub3QgYWRkIG9uZSBtb3JlIHhhdHRyIG5hbWUgdG8gaW5vZGUgJWx1LCB0b3RhbCBuYW1lcyBsZW5ndGggd291bGQgYmVjb21lICVkLCBtYXguIGlzICVkIiwKIAkJCSAgaG9zdC0+aV9pbm8sIG5hbWVzX2xlbiwgWEFUVFJfTElTVF9NQVgpOwogCQlyZXR1cm4gLUVOT1NQQzsKIAl9CkBAIC0yODgsMTMgKzI4OCwxMyBAQAogCiAJaW5vZGUgPSB1Ymlmc19pZ2V0KGMtPnZmc19zYiwgaW51bSk7CiAJaWYgKElTX0VSUihpbm9kZSkpIHsKLQkJdWJpZnNfZXJyKCJkZWFkIGV4dGVuZGVkIGF0dHJpYnV0ZSBlbnRyeSwgZXJyb3IgJWQiLAorCQl1Ymlmc19lcnIoYywgImRlYWQgZXh0ZW5kZWQgYXR0cmlidXRlIGVudHJ5LCBlcnJvciAlZCIsCiAJCQkgIChpbnQpUFRSX0VSUihpbm9kZSkpOwogCQlyZXR1cm4gaW5vZGU7CiAJfQogCWlmICh1Ymlmc19pbm9kZShpbm9kZSktPnhhdHRyKQogCQlyZXR1cm4gaW5vZGU7Ci0JdWJpZnNfZXJyKCJjb3JydXB0IGV4dGVuZGVkIGF0dHJpYnV0ZSBlbnRyeSIpOworCXViaWZzX2VycihjLCAiY29ycnVwdCBleHRlbmRlZCBhdHRyaWJ1dGUgZW50cnkiKTsKIAlpcHV0KGlub2RlKTsKIAlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIH0KQEAgLTQxMiw3ICs0MTIsNyBAQAogCWlmIChidWYpIHsKIAkJLyogSWYgQGJ1ZiBpcyAlTlVMTCB3ZSBhcmUgc3VwcG9zZWQgdG8gcmV0dXJuIHRoZSBsZW5ndGggKi8KIAkJaWYgKHVpLT5kYXRhX2xlbiA+IHNpemUpIHsKLQkJCXViaWZzX2VycigiYnVmZmVyIHNpemUgJXpkLCB4YXR0ciBsZW4gJWQiLAorCQkJdWJpZnNfZXJyKGMsICJidWZmZXIgc2l6ZSAlemQsIHhhdHRyIGxlbiAlZCIsCiAJCQkJICBzaXplLCB1aS0+ZGF0YV9sZW4pOwogCQkJZXJyID0gLUVSQU5HRTsKIAkJCWdvdG8gb3V0X2lwdXQ7CkBAIC00ODUsNyArNDg1LDcgQEAKIAogCWtmcmVlKHB4ZW50KTsKIAlpZiAoZXJyICE9IC1FTk9FTlQpIHsKLQkJdWJpZnNfZXJyKCJjYW5ub3QgZmluZCBuZXh0IGRpcmVudHJ5LCBlcnJvciAlZCIsIGVycik7CisJCXViaWZzX2VycihjLCAiY2Fubm90IGZpbmQgbmV4dCBkaXJlbnRyeSwgZXJyb3IgJWQiLCBlcnIpOwogCQlyZXR1cm4gZXJyOwogCX0KIApAQCAtNjU3LDggKzY1NywxMCBAQAogCQkJCQkgICAmaW5pdF94YXR0cnMsIDApOwogCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCi0JaWYgKGVycikKLQkJdWJpZnNfZXJyKCJjYW5ub3QgaW5pdGlhbGl6ZSBzZWN1cml0eSBmb3IgaW5vZGUgJWx1LCBlcnJvciAlZCIsCisJaWYgKGVycikgeworCQlzdHJ1Y3QgdWJpZnNfaW5mbyAqYyA9IGRlbnRyeS0+aV9zYi0+c19mc19pbmZvOworCQl1Ymlmc19lcnIoYywgImNhbm5vdCBpbml0aWFsaXplIHNlY3VyaXR5IGZvciBpbm9kZSAlbHUsIGVycm9yICVkIiwKIAkJCSAgaW5vZGUtPmlfaW5vLCBlcnIpOworCX0KIAlyZXR1cm4gZXJyOwogfQpkaWZmIC0tZ2l0IGEvZnMvdWRmL2ZpbGUuYyBiL2ZzL3VkZi9maWxlLmMKaW5kZXggMDhmMzU1NS4uNzQwNTBiZiAxMDA2NDQKLS0tIGEvZnMvdWRmL2ZpbGUuYworKysgYi9mcy91ZGYvZmlsZS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KIAogI2luY2x1ZGUgInVkZl9pLmgiCiAjaW5jbHVkZSAidWRmX3NiLmgiCkBAIC0xMjIsNyArMTIyLDcgQEAKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7CiAJaW50IGVyciwgcG9zOwotCXNpemVfdCBjb3VudCA9IGlvY2ItPmtpX25ieXRlczsKKwlzaXplX3QgY291bnQgPSBpb3ZfaXRlcl9jb3VudChmcm9tKTsKIAlzdHJ1Y3QgdWRmX2lub2RlX2luZm8gKmlpbmZvID0gVURGX0koaW5vZGUpOwogCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwpAQCAtMjQwLDEyICsyNDAsMTAgQEAKIH0KIAogY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB1ZGZfZmlsZV9vcGVyYXRpb25zID0gewotCS5yZWFkCQkJPSBuZXdfc3luY19yZWFkLAogCS5yZWFkX2l0ZXIJCT0gZ2VuZXJpY19maWxlX3JlYWRfaXRlciwKIAkudW5sb2NrZWRfaW9jdGwJCT0gdWRmX2lvY3RsLAogCS5vcGVuCQkJPSBnZW5lcmljX2ZpbGVfb3BlbiwKIAkubW1hcAkJCT0gZ2VuZXJpY19maWxlX21tYXAsCi0JLndyaXRlCQkJPSBuZXdfc3luY193cml0ZSwKIAkud3JpdGVfaXRlcgkJPSB1ZGZfZmlsZV93cml0ZV9pdGVyLAogCS5yZWxlYXNlCQk9IHVkZl9yZWxlYXNlX2ZpbGUsCiAJLmZzeW5jCQkJPSBnZW5lcmljX2ZpbGVfZnN5bmMsCmRpZmYgLS1naXQgYS9mcy91ZGYvaW5vZGUuYyBiL2ZzL3VkZi9pbm9kZS5jCmluZGV4IGE0NDVkNTkuLjljMWZiZDIgMTAwNjQ0Ci0tLSBhL2ZzL3VkZi9pbm9kZS5jCisrKyBiL2ZzL3VkZi9pbm9kZS5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NyYy1pdHUtdC5oPgogI2luY2x1ZGUgPGxpbnV4L21wYWdlLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAKICNpbmNsdWRlICJ1ZGZfaS5oIgogI2luY2x1ZGUgInVkZl9zYi5oIgpkaWZmIC0tZ2l0IGEvZnMvdWZzL2ZpbGUuYyBiL2ZzL3Vmcy9maWxlLmMKaW5kZXggYzg0ZWMwMS4uMDQyZGRiZiAxMDA2NDQKLS0tIGEvZnMvdWZzL2ZpbGUuYworKysgYi9mcy91ZnMvZmlsZS5jCkBAIC0zNSw5ICszNSw3IEBACiAgCiBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVmc19maWxlX29wZXJhdGlvbnMgPSB7CiAJLmxsc2VlawkJPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAotCS5yZWFkCQk9IG5ld19zeW5jX3JlYWQsCiAJLnJlYWRfaXRlcgk9IGdlbmVyaWNfZmlsZV9yZWFkX2l0ZXIsCi0JLndyaXRlCQk9IG5ld19zeW5jX3dyaXRlLAogCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLm1tYXAJCT0gZ2VuZXJpY19maWxlX21tYXAsCiAJLm9wZW4gICAgICAgICAgID0gZ2VuZXJpY19maWxlX29wZW4sCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FvcHMuYyBiL2ZzL3hmcy94ZnNfYW9wcy5jCmluZGV4IDNhOWI3YTEuLjRmOGNkYzUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYW9wcy5jCisrKyBiL2ZzL3hmcy94ZnNfYW9wcy5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSAieGZzX2JtYXAuaCIKICNpbmNsdWRlICJ4ZnNfYm1hcF91dGlsLmgiCiAjaW5jbHVkZSAieGZzX2JtYXBfYnRyZWUuaCIKLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9tcGFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZmlsZS5jIGIvZnMveGZzL3hmc19maWxlLmMKaW5kZXggYTJlMWNiOC4uNDQ4NTZjMyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19maWxlLmMKKysrIGIvZnMveGZzL3hmc19maWxlLmMKQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlICJ4ZnNfaWNhY2hlLmgiCiAjaW5jbHVkZSAieGZzX3BuZnMuaCIKIAotI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgogI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZhbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KQEAgLTEzODcsOCArMTM4Niw2IEBACiAKIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeGZzX2ZpbGVfb3BlcmF0aW9ucyA9IHsKIAkubGxzZWVrCQk9IHhmc19maWxlX2xsc2VlaywKLQkucmVhZAkJPSBuZXdfc3luY19yZWFkLAotCS53cml0ZQkJPSBuZXdfc3luY193cml0ZSwKIAkucmVhZF9pdGVyCT0geGZzX2ZpbGVfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyCT0geGZzX2ZpbGVfd3JpdGVfaXRlciwKIAkuc3BsaWNlX3JlYWQJPSB4ZnNfZmlsZV9zcGxpY2VfcmVhZCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpX2J1cy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKaW5kZXggNjFlMzJlYy4uOGRlNGZhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGlfYnVzLmgKQEAgLTI1Miw2ICsyNTIsNyBAQAogI2RlZmluZSBhY3BpX2RldmljZV9iaWQoZCkJKChkKS0+cG5wLmJ1c19pZCkKICNkZWZpbmUgYWNwaV9kZXZpY2VfYWRyKGQpCSgoZCktPnBucC5idXNfYWRkcmVzcykKIGNvbnN0IGNoYXIgKmFjcGlfZGV2aWNlX2hpZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CisjZGVmaW5lIGFjcGlfZGV2aWNlX3VpZChkKQkoKGQpLT5wbnAudW5pcXVlX2lkKQogI2RlZmluZSBhY3BpX2RldmljZV9uYW1lKGQpCSgoZCktPnBucC5kZXZpY2VfbmFtZSkKICNkZWZpbmUgYWNwaV9kZXZpY2VfY2xhc3MoZCkJKChkKS0+cG5wLmRldmljZV9jbGFzcykKIApAQCAtMzg2LDcgKzM4Nyw4IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX25vZGUoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSkKIHsKLQlyZXR1cm4gZndub2RlID8gY29udGFpbmVyX29mKGZ3bm9kZSwgc3RydWN0IGFjcGlfZGV2aWNlLCBmd25vZGUpIDogTlVMTDsKKwlyZXR1cm4gaXNfYWNwaV9ub2RlKGZ3bm9kZSkgPworCQljb250YWluZXJfb2YoZndub2RlLCBzdHJ1Y3QgYWNwaV9kZXZpY2UsIGZ3bm9kZSkgOiBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmd25vZGVfaGFuZGxlICphY3BpX2Z3bm9kZV9oYW5kbGUoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAppbmRleCA0ZDQ2MDg1Li4zOWYxZDZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3BndGFibGUuaApAQCAtNiw2ICs2LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9tbV90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKKyNpZiA0IC0gZGVmaW5lZChfX1BBR0VUQUJMRV9QVURfRk9MREVEKSAtIGRlZmluZWQoX19QQUdFVEFCTEVfUE1EX0ZPTERFRCkgIT0gXAorCUNPTkZJR19QR1RBQkxFX0xFVkVMUworI2Vycm9yIENPTkZJR19QR1RBQkxFX0xFVkVMUyBpcyBub3QgY29uc2lzdGVudCB3aXRoIF9fUEFHRVRBQkxFX3tQVUQsUE1EfV9GT0xERUQKKyNlbmRpZgogCiAvKgogICogT24gYWxtb3N0IGFsbCBhcmNoaXRlY3R1cmVzIGFuZCBjb25maWd1cmF0aW9ucywgMCBjYW4gYmUgdXNlZCBhcyB0aGUKQEAgLTY5MSw2ICs2OTcsMzAgQEAKIAogI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KIAorI2lmZGVmIENPTkZJR19IQVZFX0FSQ0hfSFVHRV9WTUFQCitpbnQgcHVkX3NldF9odWdlKHB1ZF90ICpwdWQsIHBoeXNfYWRkcl90IGFkZHIsIHBncHJvdF90IHByb3QpOworaW50IHBtZF9zZXRfaHVnZShwbWRfdCAqcG1kLCBwaHlzX2FkZHJfdCBhZGRyLCBwZ3Byb3RfdCBwcm90KTsKK2ludCBwdWRfY2xlYXJfaHVnZShwdWRfdCAqcHVkKTsKK2ludCBwbWRfY2xlYXJfaHVnZShwbWRfdCAqcG1kKTsKKyNlbHNlCS8qICFDT05GSUdfSEFWRV9BUkNIX0hVR0VfVk1BUCAqLworc3RhdGljIGlubGluZSBpbnQgcHVkX3NldF9odWdlKHB1ZF90ICpwdWQsIHBoeXNfYWRkcl90IGFkZHIsIHBncHJvdF90IHByb3QpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBwbWRfc2V0X2h1Z2UocG1kX3QgKnBtZCwgcGh5c19hZGRyX3QgYWRkciwgcGdwcm90X3QgcHJvdCkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHB1ZF9jbGVhcl9odWdlKHB1ZF90ICpwdWQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBwbWRfY2xlYXJfaHVnZShwbWRfdCAqcG1kKQoreworCXJldHVybiAwOworfQorI2VuZGlmCS8qIENPTkZJR19IQVZFX0FSQ0hfSFVHRV9WTUFQICovCisKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCiAKICNpZm5kZWYgaW9fcmVtYXBfcGZuX3JhbmdlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKaW5kZXggYWM3ODkxMC4uNWM0OGM1OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaApAQCAtMTI0LDcgKzEyNCwxMCBAQAogI2RlZmluZSBGVFJBQ0VfRVZFTlRTKCkJLiA9IEFMSUdOKDgpOwkJCQkJXAogCQkJVk1MSU5VWF9TWU1CT0woX19zdGFydF9mdHJhY2VfZXZlbnRzKSA9IC47CVwKIAkJCSooX2Z0cmFjZV9ldmVudHMpCQkJCVwKLQkJCVZNTElOVVhfU1lNQk9MKF9fc3RvcF9mdHJhY2VfZXZlbnRzKSA9IC47CisJCQlWTUxJTlVYX1NZTUJPTChfX3N0b3BfZnRyYWNlX2V2ZW50cykgPSAuOwlcCisJCQlWTUxJTlVYX1NZTUJPTChfX3N0YXJ0X2Z0cmFjZV9lbnVtX21hcHMpID0gLjsJXAorCQkJKihfZnRyYWNlX2VudW1fbWFwKQkJCQlcCisJCQlWTUxJTlVYX1NZTUJPTChfX3N0b3BfZnRyYWNlX2VudW1fbWFwcykgPSAuOwogI2Vsc2UKICNkZWZpbmUgRlRSQUNFX0VWRU5UUygpCiAjZW5kaWYKQEAgLTE2Nyw2ICsxNzAsNyBAQAogI2RlZmluZSBJT01NVV9PRl9UQUJMRVMoKQlPRl9UQUJMRShDT05GSUdfT0ZfSU9NTVUsIGlvbW11KQogI2RlZmluZSBSRVNFUlZFRE1FTV9PRl9UQUJMRVMoKQlPRl9UQUJMRShDT05GSUdfT0ZfUkVTRVJWRURfTUVNLCByZXNlcnZlZG1lbSkKICNkZWZpbmUgQ1BVX01FVEhPRF9PRl9UQUJMRVMoKQlPRl9UQUJMRShDT05GSUdfU01QLCBjcHVfbWV0aG9kKQorI2RlZmluZSBDUFVJRExFX01FVEhPRF9PRl9UQUJMRVMoKSBPRl9UQUJMRShDT05GSUdfQ1BVX0lETEUsIGNwdWlkbGVfbWV0aG9kKQogI2RlZmluZSBFQVJMWUNPTl9PRl9UQUJMRVMoKQlPRl9UQUJMRShDT05GSUdfU0VSSUFMX0VBUkxZQ09OLCBlYXJseWNvbikKIAogI2RlZmluZSBLRVJORUxfRFRCKCkJCQkJCQkJXApAQCAtNDAxLDcgKzQwNSw3IEBACiAjZGVmaW5lIFRFWFRfVEVYVAkJCQkJCQlcCiAJCUFMSUdOX0ZVTkNUSU9OKCk7CQkJCQlcCiAJCSooLnRleHQuaG90KQkJCQkJCVwKLQkJKigudGV4dCkJCQkJCQlcCisJCSooLnRleHQgLnRleHQuZml4dXApCQkJCQlcCiAJCSooLnJlZi50ZXh0KQkJCQkJCVwKIAlNRU1fS0VFUChpbml0LnRleHQpCQkJCQkJXAogCU1FTV9LRUVQKGV4aXQudGV4dCkJCQkJCQlcCkBAIC01MDEsNiArNTA1LDcgQEAKIAlDTEtTUkNfT0ZfVEFCTEVTKCkJCQkJCQlcCiAJSU9NTVVfT0ZfVEFCTEVTKCkJCQkJCQlcCiAJQ1BVX01FVEhPRF9PRl9UQUJMRVMoKQkJCQkJCVwKKwlDUFVJRExFX01FVEhPRF9PRl9UQUJMRVMoKQkJCQkJXAogCUtFUk5FTF9EVEIoKQkJCQkJCQlcCiAJSVJRQ0hJUF9PRl9NQVRDSF9UQUJMRSgpCQkJCQlcCiAJRUFSTFlDT05fT0ZfVEFCTEVTKCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL2FsZ2FwaS5oIGIvaW5jbHVkZS9jcnlwdG8vYWxnYXBpLmgKaW5kZXggNjIzYTU5Yy4uMGVjYjc2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jcnlwdG8vYWxnYXBpLmgKKysrIGIvaW5jbHVkZS9jcnlwdG8vYWxnYXBpLmgKQEAgLTEzNyw3ICsxMzcsNyBAQAogCiBpbnQgY3J5cHRvX3JlZ2lzdGVyX2luc3RhbmNlKHN0cnVjdCBjcnlwdG9fdGVtcGxhdGUgKnRtcGwsCiAJCQkgICAgIHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QpOwotaW50IGNyeXB0b191bnJlZ2lzdGVyX2luc3RhbmNlKHN0cnVjdCBjcnlwdG9fYWxnICphbGcpOworaW50IGNyeXB0b191bnJlZ2lzdGVyX2luc3RhbmNlKHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QpOwogCiBpbnQgY3J5cHRvX2luaXRfc3Bhd24oc3RydWN0IGNyeXB0b19zcGF3biAqc3Bhd24sIHN0cnVjdCBjcnlwdG9fYWxnICphbGcsCiAJCSAgICAgIHN0cnVjdCBjcnlwdG9faW5zdGFuY2UgKmluc3QsIHUzMiBtYXNrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL2lmX2FsZy5oIGIvaW5jbHVkZS9jcnlwdG8vaWZfYWxnLmgKaW5kZXggMTc4NTI1ZS4uMDE4YWZiMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jcnlwdG8vaWZfYWxnLmgKKysrIGIvaW5jbHVkZS9jcnlwdG8vaWZfYWxnLmgKQEAgLTU4LDggKzU4LDkgQEAKIH07CiAKIHN0cnVjdCBhZl9hbGdfc2dsIHsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3Qgc2dbQUxHX01BWF9QQUdFU107CisJc3RydWN0IHNjYXR0ZXJsaXN0IHNnW0FMR19NQVhfUEFHRVMgKyAxXTsKIAlzdHJ1Y3QgcGFnZSAqcGFnZXNbQUxHX01BWF9QQUdFU107CisJdW5zaWduZWQgaW50IG5wYWdlczsKIH07CiAKIGludCBhZl9hbGdfcmVnaXN0ZXJfdHlwZShjb25zdCBzdHJ1Y3QgYWZfYWxnX3R5cGUgKnR5cGUpOwpAQCAtNzAsNiArNzEsNyBAQAogCiBpbnQgYWZfYWxnX21ha2Vfc2coc3RydWN0IGFmX2FsZ19zZ2wgKnNnbCwgc3RydWN0IGlvdl9pdGVyICppdGVyLCBpbnQgbGVuKTsKIHZvaWQgYWZfYWxnX2ZyZWVfc2coc3RydWN0IGFmX2FsZ19zZ2wgKnNnbCk7Cit2b2lkIGFmX2FsZ19saW5rX3NnKHN0cnVjdCBhZl9hbGdfc2dsICpzZ2xfcHJldiwgc3RydWN0IGFmX2FsZ19zZ2wgKnNnbF9uZXcpOwogCiBpbnQgYWZfYWxnX2Ntc2dfc2VuZChzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBhZl9hbGdfY29udHJvbCAqY29uKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jcnlwdG8vcm5nLmggYi9pbmNsdWRlL2NyeXB0by9ybmcuaAppbmRleCBhMTZmYjEwLi42ZTI4ZWE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NyeXB0by9ybmcuaAorKysgYi9pbmNsdWRlL2NyeXB0by9ybmcuaApAQCAtMTAzLDggKzEwMyw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIHRoZSBjYWxsZXItYWxsb2NhdGVkIGJ1ZmZlciB3aXRoIHJhbmRvbSBudW1iZXJzIHVzaW5nIHRoZQogICogcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgcmVmZXJlbmNlZCBieSB0aGUgY2lwaGVyIGhhbmRsZS4KICAqCi0gKiBSZXR1cm46ID4gMCBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGdlbmVyYXRlZAotICoJICAgYnl0ZXM7IDwgMCBpZiBhbiBlcnJvciBvY2N1cnJlZAorICogUmV0dXJuOiAwIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsOyA8IDAgaWYgYW4gZXJyb3Igb2NjdXJyZWQKICAqLwogc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX3JuZ19nZXRfYnl0ZXMoc3RydWN0IGNyeXB0b19ybmcgKnRmbSwKIAkJCQkgICAgICAgdTggKnJkYXRhLCB1bnNpZ25lZCBpbnQgZGxlbikKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL3NoYS5oIGIvaW5jbHVkZS9jcnlwdG8vc2hhLmgKaW5kZXggMTkwZjhhMC4uZGQ3OTA1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jcnlwdG8vc2hhLmgKKysrIGIvaW5jbHVkZS9jcnlwdG8vc2hhLmgKQEAgLTY1LDIwICs2NSwyMCBAQAogI2RlZmluZSBTSEE1MTJfSDcJMHg1YmUwY2QxOTEzN2UyMTc5VUxMCiAKIHN0cnVjdCBzaGExX3N0YXRlIHsKLQl1NjQgY291bnQ7CiAJdTMyIHN0YXRlW1NIQTFfRElHRVNUX1NJWkUgLyA0XTsKKwl1NjQgY291bnQ7CiAJdTggYnVmZmVyW1NIQTFfQkxPQ0tfU0laRV07CiB9OwogCiBzdHJ1Y3Qgc2hhMjU2X3N0YXRlIHsKLQl1NjQgY291bnQ7CiAJdTMyIHN0YXRlW1NIQTI1Nl9ESUdFU1RfU0laRSAvIDRdOworCXU2NCBjb3VudDsKIAl1OCBidWZbU0hBMjU2X0JMT0NLX1NJWkVdOwogfTsKIAogc3RydWN0IHNoYTUxMl9zdGF0ZSB7Ci0JdTY0IGNvdW50WzJdOwogCXU2NCBzdGF0ZVtTSEE1MTJfRElHRVNUX1NJWkUgLyA4XTsKKwl1NjQgY291bnRbMl07CiAJdTggYnVmW1NIQTUxMl9CTE9DS19TSVpFXTsKIH07CiAKQEAgLTg3LDkgKzg3LDE4IEBACiBleHRlcm4gaW50IGNyeXB0b19zaGExX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuKTsKIAorZXh0ZXJuIGludCBjcnlwdG9fc2hhMV9maW51cChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCisJCQkgICAgIHVuc2lnbmVkIGludCBsZW4sIHU4ICpoYXNoKTsKKwogZXh0ZXJuIGludCBjcnlwdG9fc2hhMjU2X3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgbGVuKTsKIAorZXh0ZXJuIGludCBjcnlwdG9fc2hhMjU2X2ZpbnVwKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLCBjb25zdCB1OCAqZGF0YSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuLCB1OCAqaGFzaCk7CisKIGV4dGVybiBpbnQgY3J5cHRvX3NoYTUxMl91cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIGNvbnN0IHU4ICpkYXRhLAogCQkJICAgICAgdW5zaWduZWQgaW50IGxlbik7CisKK2V4dGVybiBpbnQgY3J5cHRvX3NoYTUxMl9maW51cChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgY29uc3QgdTggKmRhdGEsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGxlbiwgdTggKmhhc2gpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2NyeXB0by9zaGExX2Jhc2UuaCBiL2luY2x1ZGUvY3J5cHRvL3NoYTFfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZGY0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NyeXB0by9zaGExX2Jhc2UuaApAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIHNoYTFfYmFzZS5oIC0gY29yZSBsb2dpYyBmb3IgU0hBLTEgaW1wbGVtZW50YXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IExpbmFybyBMdGQgPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKK3R5cGVkZWYgdm9pZCAoc2hhMV9ibG9ja19mbikoc3RydWN0IHNoYTFfc3RhdGUgKnNzdCwgdTggY29uc3QgKnNyYywgaW50IGJsb2Nrcyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHNoYTFfYmFzZV9pbml0KHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjKQoreworCXN0cnVjdCBzaGExX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKwlzY3R4LT5zdGF0ZVswXSA9IFNIQTFfSDA7CisJc2N0eC0+c3RhdGVbMV0gPSBTSEExX0gxOworCXNjdHgtPnN0YXRlWzJdID0gU0hBMV9IMjsKKwlzY3R4LT5zdGF0ZVszXSA9IFNIQTFfSDM7CisJc2N0eC0+c3RhdGVbNF0gPSBTSEExX0g0OworCXNjdHgtPmNvdW50ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaGExX2Jhc2VfZG9fdXBkYXRlKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLAorCQkJCSAgICAgIGNvbnN0IHU4ICpkYXRhLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBsZW4sCisJCQkJICAgICAgc2hhMV9ibG9ja19mbiAqYmxvY2tfZm4pCit7CisJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwl1bnNpZ25lZCBpbnQgcGFydGlhbCA9IHNjdHgtPmNvdW50ICUgU0hBMV9CTE9DS19TSVpFOworCisJc2N0eC0+Y291bnQgKz0gbGVuOworCisJaWYgKHVubGlrZWx5KChwYXJ0aWFsICsgbGVuKSA+PSBTSEExX0JMT0NLX1NJWkUpKSB7CisJCWludCBibG9ja3M7CisKKwkJaWYgKHBhcnRpYWwpIHsKKwkJCWludCBwID0gU0hBMV9CTE9DS19TSVpFIC0gcGFydGlhbDsKKworCQkJbWVtY3B5KHNjdHgtPmJ1ZmZlciArIHBhcnRpYWwsIGRhdGEsIHApOworCQkJZGF0YSArPSBwOworCQkJbGVuIC09IHA7CisKKwkJCWJsb2NrX2ZuKHNjdHgsIHNjdHgtPmJ1ZmZlciwgMSk7CisJCX0KKworCQlibG9ja3MgPSBsZW4gLyBTSEExX0JMT0NLX1NJWkU7CisJCWxlbiAlPSBTSEExX0JMT0NLX1NJWkU7CisKKwkJaWYgKGJsb2NrcykgeworCQkJYmxvY2tfZm4oc2N0eCwgZGF0YSwgYmxvY2tzKTsKKwkJCWRhdGEgKz0gYmxvY2tzICogU0hBMV9CTE9DS19TSVpFOworCQl9CisJCXBhcnRpYWwgPSAwOworCX0KKwlpZiAobGVuKQorCQltZW1jcHkoc2N0eC0+YnVmZmVyICsgcGFydGlhbCwgZGF0YSwgbGVuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaGExX2Jhc2VfZG9fZmluYWxpemUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsCisJCQkJCXNoYTFfYmxvY2tfZm4gKmJsb2NrX2ZuKQoreworCWNvbnN0IGludCBiaXRfb2Zmc2V0ID0gU0hBMV9CTE9DS19TSVpFIC0gc2l6ZW9mKF9fYmU2NCk7CisJc3RydWN0IHNoYTFfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwlfX2JlNjQgKmJpdHMgPSAoX19iZTY0ICopKHNjdHgtPmJ1ZmZlciArIGJpdF9vZmZzZXQpOworCXVuc2lnbmVkIGludCBwYXJ0aWFsID0gc2N0eC0+Y291bnQgJSBTSEExX0JMT0NLX1NJWkU7CisKKwlzY3R4LT5idWZmZXJbcGFydGlhbCsrXSA9IDB4ODA7CisJaWYgKHBhcnRpYWwgPiBiaXRfb2Zmc2V0KSB7CisJCW1lbXNldChzY3R4LT5idWZmZXIgKyBwYXJ0aWFsLCAweDAsIFNIQTFfQkxPQ0tfU0laRSAtIHBhcnRpYWwpOworCQlwYXJ0aWFsID0gMDsKKworCQlibG9ja19mbihzY3R4LCBzY3R4LT5idWZmZXIsIDEpOworCX0KKworCW1lbXNldChzY3R4LT5idWZmZXIgKyBwYXJ0aWFsLCAweDAsIGJpdF9vZmZzZXQgLSBwYXJ0aWFsKTsKKwkqYml0cyA9IGNwdV90b19iZTY0KHNjdHgtPmNvdW50IDw8IDMpOworCWJsb2NrX2ZuKHNjdHgsIHNjdHgtPmJ1ZmZlciwgMSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2hhMV9iYXNlX2ZpbmlzaChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKK3sKKwlzdHJ1Y3Qgc2hhMV9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCV9fYmUzMiAqZGlnZXN0ID0gKF9fYmUzMiAqKW91dDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTSEExX0RJR0VTVF9TSVpFIC8gc2l6ZW9mKF9fYmUzMik7IGkrKykKKwkJcHV0X3VuYWxpZ25lZF9iZTMyKHNjdHgtPnN0YXRlW2ldLCBkaWdlc3QrKyk7CisKKwkqc2N0eCA9IChzdHJ1Y3Qgc2hhMV9zdGF0ZSl7fTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL3NoYTI1Nl9iYXNlLmggYi9pbmNsdWRlL2NyeXB0by9zaGEyNTZfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZjIxOTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NyeXB0by9zaGEyNTZfYmFzZS5oCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogc2hhMjU2X2Jhc2UuaCAtIGNvcmUgbG9naWMgZm9yIFNIQS0yNTYgaW1wbGVtZW50YXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IExpbmFybyBMdGQgPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKK3R5cGVkZWYgdm9pZCAoc2hhMjU2X2Jsb2NrX2ZuKShzdHJ1Y3Qgc2hhMjU2X3N0YXRlICpzc3QsIHU4IGNvbnN0ICpzcmMsCisJCQkgICAgICAgaW50IGJsb2Nrcyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHNoYTIyNF9iYXNlX2luaXQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJc2N0eC0+c3RhdGVbMF0gPSBTSEEyMjRfSDA7CisJc2N0eC0+c3RhdGVbMV0gPSBTSEEyMjRfSDE7CisJc2N0eC0+c3RhdGVbMl0gPSBTSEEyMjRfSDI7CisJc2N0eC0+c3RhdGVbM10gPSBTSEEyMjRfSDM7CisJc2N0eC0+c3RhdGVbNF0gPSBTSEEyMjRfSDQ7CisJc2N0eC0+c3RhdGVbNV0gPSBTSEEyMjRfSDU7CisJc2N0eC0+c3RhdGVbNl0gPSBTSEEyMjRfSDY7CisJc2N0eC0+c3RhdGVbN10gPSBTSEEyMjRfSDc7CisJc2N0eC0+Y291bnQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNoYTI1Nl9iYXNlX2luaXQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJc2N0eC0+c3RhdGVbMF0gPSBTSEEyNTZfSDA7CisJc2N0eC0+c3RhdGVbMV0gPSBTSEEyNTZfSDE7CisJc2N0eC0+c3RhdGVbMl0gPSBTSEEyNTZfSDI7CisJc2N0eC0+c3RhdGVbM10gPSBTSEEyNTZfSDM7CisJc2N0eC0+c3RhdGVbNF0gPSBTSEEyNTZfSDQ7CisJc2N0eC0+c3RhdGVbNV0gPSBTSEEyNTZfSDU7CisJc2N0eC0+c3RhdGVbNl0gPSBTSEEyNTZfSDY7CisJc2N0eC0+c3RhdGVbN10gPSBTSEEyNTZfSDc7CisJc2N0eC0+Y291bnQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNoYTI1Nl9iYXNlX2RvX3VwZGF0ZShzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywKKwkJCQkJY29uc3QgdTggKmRhdGEsCisJCQkJCXVuc2lnbmVkIGludCBsZW4sCisJCQkJCXNoYTI1Nl9ibG9ja19mbiAqYmxvY2tfZm4pCit7CisJc3RydWN0IHNoYTI1Nl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCXVuc2lnbmVkIGludCBwYXJ0aWFsID0gc2N0eC0+Y291bnQgJSBTSEEyNTZfQkxPQ0tfU0laRTsKKworCXNjdHgtPmNvdW50ICs9IGxlbjsKKworCWlmICh1bmxpa2VseSgocGFydGlhbCArIGxlbikgPj0gU0hBMjU2X0JMT0NLX1NJWkUpKSB7CisJCWludCBibG9ja3M7CisKKwkJaWYgKHBhcnRpYWwpIHsKKwkJCWludCBwID0gU0hBMjU2X0JMT0NLX1NJWkUgLSBwYXJ0aWFsOworCisJCQltZW1jcHkoc2N0eC0+YnVmICsgcGFydGlhbCwgZGF0YSwgcCk7CisJCQlkYXRhICs9IHA7CisJCQlsZW4gLT0gcDsKKworCQkJYmxvY2tfZm4oc2N0eCwgc2N0eC0+YnVmLCAxKTsKKwkJfQorCisJCWJsb2NrcyA9IGxlbiAvIFNIQTI1Nl9CTE9DS19TSVpFOworCQlsZW4gJT0gU0hBMjU2X0JMT0NLX1NJWkU7CisKKwkJaWYgKGJsb2NrcykgeworCQkJYmxvY2tfZm4oc2N0eCwgZGF0YSwgYmxvY2tzKTsKKwkJCWRhdGEgKz0gYmxvY2tzICogU0hBMjU2X0JMT0NLX1NJWkU7CisJCX0KKwkJcGFydGlhbCA9IDA7CisJfQorCWlmIChsZW4pCisJCW1lbWNweShzY3R4LT5idWYgKyBwYXJ0aWFsLCBkYXRhLCBsZW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNoYTI1Nl9iYXNlX2RvX2ZpbmFsaXplKHN0cnVjdCBzaGFzaF9kZXNjICpkZXNjLAorCQkJCQkgIHNoYTI1Nl9ibG9ja19mbiAqYmxvY2tfZm4pCit7CisJY29uc3QgaW50IGJpdF9vZmZzZXQgPSBTSEEyNTZfQkxPQ0tfU0laRSAtIHNpemVvZihfX2JlNjQpOworCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwlfX2JlNjQgKmJpdHMgPSAoX19iZTY0ICopKHNjdHgtPmJ1ZiArIGJpdF9vZmZzZXQpOworCXVuc2lnbmVkIGludCBwYXJ0aWFsID0gc2N0eC0+Y291bnQgJSBTSEEyNTZfQkxPQ0tfU0laRTsKKworCXNjdHgtPmJ1ZltwYXJ0aWFsKytdID0gMHg4MDsKKwlpZiAocGFydGlhbCA+IGJpdF9vZmZzZXQpIHsKKwkJbWVtc2V0KHNjdHgtPmJ1ZiArIHBhcnRpYWwsIDB4MCwgU0hBMjU2X0JMT0NLX1NJWkUgLSBwYXJ0aWFsKTsKKwkJcGFydGlhbCA9IDA7CisKKwkJYmxvY2tfZm4oc2N0eCwgc2N0eC0+YnVmLCAxKTsKKwl9CisKKwltZW1zZXQoc2N0eC0+YnVmICsgcGFydGlhbCwgMHgwLCBiaXRfb2Zmc2V0IC0gcGFydGlhbCk7CisJKmJpdHMgPSBjcHVfdG9fYmU2NChzY3R4LT5jb3VudCA8PCAzKTsKKwlibG9ja19mbihzY3R4LCBzY3R4LT5idWYsIDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNoYTI1Nl9iYXNlX2ZpbmlzaChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYywgdTggKm91dCkKK3sKKwl1bnNpZ25lZCBpbnQgZGlnZXN0X3NpemUgPSBjcnlwdG9fc2hhc2hfZGlnZXN0c2l6ZShkZXNjLT50Zm0pOworCXN0cnVjdCBzaGEyNTZfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwlfX2JlMzIgKmRpZ2VzdCA9IChfX2JlMzIgKilvdXQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBkaWdlc3Rfc2l6ZSA+IDA7IGkrKywgZGlnZXN0X3NpemUgLT0gc2l6ZW9mKF9fYmUzMikpCisJCXB1dF91bmFsaWduZWRfYmUzMihzY3R4LT5zdGF0ZVtpXSwgZGlnZXN0KyspOworCisJKnNjdHggPSAoc3RydWN0IHNoYTI1Nl9zdGF0ZSl7fTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3J5cHRvL3NoYTUxMl9iYXNlLmggYi9pbmNsdWRlL2NyeXB0by9zaGE1MTJfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNTM0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2NyeXB0by9zaGE1MTJfYmFzZS5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogc2hhNTEyX2Jhc2UuaCAtIGNvcmUgbG9naWMgZm9yIFNIQS01MTIgaW1wbGVtZW50YXRpb25zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IExpbmFybyBMdGQgPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8Y3J5cHRvL2ludGVybmFsL2hhc2guaD4KKyNpbmNsdWRlIDxjcnlwdG8vc2hhLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKK3R5cGVkZWYgdm9pZCAoc2hhNTEyX2Jsb2NrX2ZuKShzdHJ1Y3Qgc2hhNTEyX3N0YXRlICpzc3QsIHU4IGNvbnN0ICpzcmMsCisJCQkgICAgICAgaW50IGJsb2Nrcyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IHNoYTM4NF9iYXNlX2luaXQoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IHNoYTUxMl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCisJc2N0eC0+c3RhdGVbMF0gPSBTSEEzODRfSDA7CisJc2N0eC0+c3RhdGVbMV0gPSBTSEEzODRfSDE7CisJc2N0eC0+c3RhdGVbMl0gPSBTSEEzODRfSDI7CisJc2N0eC0+c3RhdGVbM10gPSBTSEEzODRfSDM7CisJc2N0eC0+c3RhdGVbNF0gPSBTSEEzODRfSDQ7CisJc2N0eC0+c3RhdGVbNV0gPSBTSEEzODRfSDU7CisJc2N0eC0+c3RhdGVbNl0gPSBTSEEzODRfSDY7CisJc2N0eC0+c3RhdGVbN10gPSBTSEEzODRfSDc7CisJc2N0eC0+Y291bnRbMF0gPSBzY3R4LT5jb3VudFsxXSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2hhNTEyX2Jhc2VfaW5pdChzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3Qgc2hhNTEyX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisKKwlzY3R4LT5zdGF0ZVswXSA9IFNIQTUxMl9IMDsKKwlzY3R4LT5zdGF0ZVsxXSA9IFNIQTUxMl9IMTsKKwlzY3R4LT5zdGF0ZVsyXSA9IFNIQTUxMl9IMjsKKwlzY3R4LT5zdGF0ZVszXSA9IFNIQTUxMl9IMzsKKwlzY3R4LT5zdGF0ZVs0XSA9IFNIQTUxMl9INDsKKwlzY3R4LT5zdGF0ZVs1XSA9IFNIQTUxMl9INTsKKwlzY3R4LT5zdGF0ZVs2XSA9IFNIQTUxMl9INjsKKwlzY3R4LT5zdGF0ZVs3XSA9IFNIQTUxMl9INzsKKwlzY3R4LT5jb3VudFswXSA9IHNjdHgtPmNvdW50WzFdID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaGE1MTJfYmFzZV9kb191cGRhdGUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsCisJCQkJCWNvbnN0IHU4ICpkYXRhLAorCQkJCQl1bnNpZ25lZCBpbnQgbGVuLAorCQkJCQlzaGE1MTJfYmxvY2tfZm4gKmJsb2NrX2ZuKQoreworCXN0cnVjdCBzaGE1MTJfc3RhdGUgKnNjdHggPSBzaGFzaF9kZXNjX2N0eChkZXNjKTsKKwl1bnNpZ25lZCBpbnQgcGFydGlhbCA9IHNjdHgtPmNvdW50WzBdICUgU0hBNTEyX0JMT0NLX1NJWkU7CisKKwlzY3R4LT5jb3VudFswXSArPSBsZW47CisJaWYgKHNjdHgtPmNvdW50WzBdIDwgbGVuKQorCQlzY3R4LT5jb3VudFsxXSsrOworCisJaWYgKHVubGlrZWx5KChwYXJ0aWFsICsgbGVuKSA+PSBTSEE1MTJfQkxPQ0tfU0laRSkpIHsKKwkJaW50IGJsb2NrczsKKworCQlpZiAocGFydGlhbCkgeworCQkJaW50IHAgPSBTSEE1MTJfQkxPQ0tfU0laRSAtIHBhcnRpYWw7CisKKwkJCW1lbWNweShzY3R4LT5idWYgKyBwYXJ0aWFsLCBkYXRhLCBwKTsKKwkJCWRhdGEgKz0gcDsKKwkJCWxlbiAtPSBwOworCisJCQlibG9ja19mbihzY3R4LCBzY3R4LT5idWYsIDEpOworCQl9CisKKwkJYmxvY2tzID0gbGVuIC8gU0hBNTEyX0JMT0NLX1NJWkU7CisJCWxlbiAlPSBTSEE1MTJfQkxPQ0tfU0laRTsKKworCQlpZiAoYmxvY2tzKSB7CisJCQlibG9ja19mbihzY3R4LCBkYXRhLCBibG9ja3MpOworCQkJZGF0YSArPSBibG9ja3MgKiBTSEE1MTJfQkxPQ0tfU0laRTsKKwkJfQorCQlwYXJ0aWFsID0gMDsKKwl9CisJaWYgKGxlbikKKwkJbWVtY3B5KHNjdHgtPmJ1ZiArIHBhcnRpYWwsIGRhdGEsIGxlbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgc2hhNTEyX2Jhc2VfZG9fZmluYWxpemUoc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsCisJCQkJCSAgc2hhNTEyX2Jsb2NrX2ZuICpibG9ja19mbikKK3sKKwljb25zdCBpbnQgYml0X29mZnNldCA9IFNIQTUxMl9CTE9DS19TSVpFIC0gc2l6ZW9mKF9fYmU2NFsyXSk7CisJc3RydWN0IHNoYTUxMl9zdGF0ZSAqc2N0eCA9IHNoYXNoX2Rlc2NfY3R4KGRlc2MpOworCV9fYmU2NCAqYml0cyA9IChfX2JlNjQgKikoc2N0eC0+YnVmICsgYml0X29mZnNldCk7CisJdW5zaWduZWQgaW50IHBhcnRpYWwgPSBzY3R4LT5jb3VudFswXSAlIFNIQTUxMl9CTE9DS19TSVpFOworCisJc2N0eC0+YnVmW3BhcnRpYWwrK10gPSAweDgwOworCWlmIChwYXJ0aWFsID4gYml0X29mZnNldCkgeworCQltZW1zZXQoc2N0eC0+YnVmICsgcGFydGlhbCwgMHgwLCBTSEE1MTJfQkxPQ0tfU0laRSAtIHBhcnRpYWwpOworCQlwYXJ0aWFsID0gMDsKKworCQlibG9ja19mbihzY3R4LCBzY3R4LT5idWYsIDEpOworCX0KKworCW1lbXNldChzY3R4LT5idWYgKyBwYXJ0aWFsLCAweDAsIGJpdF9vZmZzZXQgLSBwYXJ0aWFsKTsKKwliaXRzWzBdID0gY3B1X3RvX2JlNjQoc2N0eC0+Y291bnRbMV0gPDwgMyB8IHNjdHgtPmNvdW50WzBdID4+IDYxKTsKKwliaXRzWzFdID0gY3B1X3RvX2JlNjQoc2N0eC0+Y291bnRbMF0gPDwgMyk7CisJYmxvY2tfZm4oc2N0eCwgc2N0eC0+YnVmLCAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzaGE1MTJfYmFzZV9maW5pc2goc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2MsIHU4ICpvdXQpCit7CisJdW5zaWduZWQgaW50IGRpZ2VzdF9zaXplID0gY3J5cHRvX3NoYXNoX2RpZ2VzdHNpemUoZGVzYy0+dGZtKTsKKwlzdHJ1Y3Qgc2hhNTEyX3N0YXRlICpzY3R4ID0gc2hhc2hfZGVzY19jdHgoZGVzYyk7CisJX19iZTY0ICpkaWdlc3QgPSAoX19iZTY0ICopb3V0OworCWludCBpOworCisJZm9yIChpID0gMDsgZGlnZXN0X3NpemUgPiAwOyBpKyssIGRpZ2VzdF9zaXplIC09IHNpemVvZihfX2JlNjQpKQorCQlwdXRfdW5hbGlnbmVkX2JlNjQoc2N0eC0+c3RhdGVbaV0sIGRpZ2VzdCsrKTsKKworCSpzY3R4ID0gKHN0cnVjdCBzaGE1MTJfc3RhdGUpe307CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL2dwaW8vbWVzb244Yi1ncGlvLmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL2dwaW8vbWVzb244Yi1ncGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4Y2IyMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvZ3Bpby9tZXNvbjhiLWdwaW8uaApAQCAtMCwwICsxLDMyIEBACisvKgorICogR1BJTyBkZWZpbml0aW9ucyBmb3IgQW1sb2dpYyBNZXNvbjhiIFNvQ3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgRW5kbGVzcyBNb2JpbGUsIEluYy4KKyAqIEF1dGhvcjogQ2FybG8gQ2Fpb25lIDxjYXJsb0BlbmRsZXNzbS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19NRVNPTjhCX0dQSU9fSAorI2RlZmluZSBfRFRfQklORElOR1NfTUVTT044Ql9HUElPX0gKKworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL2dwaW8vbWVzb244LWdwaW8uaD4KKworLyogR1BJTyBCYW5rIERJRiAqLworI2RlZmluZSBESUZfMF9QCQkxMjAKKyNkZWZpbmUgRElGXzBfTgkJMTIxCisjZGVmaW5lIERJRl8xX1AJCTEyMgorI2RlZmluZSBESUZfMV9OCQkxMjMKKyNkZWZpbmUgRElGXzJfUAkJMTI0CisjZGVmaW5lIERJRl8yX04JCTEyNQorI2RlZmluZSBESUZfM19QCQkxMjYKKyNkZWZpbmUgRElGXzNfTgkJMTI3CisjZGVmaW5lIERJRl80X1AJCTEyOAorI2RlZmluZSBESUZfNF9OCQkxMjkKKworI2VuZGlmIC8qIF9EVF9CSU5ESU5HU19NRVNPTjhCX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9pbnRlcnJ1cHQtY29udHJvbGxlci9pcnEtc3QuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvaXJxLXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1OWFjZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvaW50ZXJydXB0LWNvbnRyb2xsZXIvaXJxLXN0LmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqICBpbmNsdWRlL2xpbnV4L2lycWNoaXAvaXJxLXN0LmgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE0IFNUTWljcm9lbGVjdHJvbmljcyDigJMgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICBBdXRob3I6IExlZSBKb25lcyA8bGVlLmpvbmVzQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19JTlRFUlJVUFRfQ09OVFJPTExFUl9TVF9ICisjZGVmaW5lIF9EVF9CSU5ESU5HU19JTlRFUlJVUFRfQ09OVFJPTExFUl9TVF9ICisKKyNkZWZpbmUgU1RfSVJRX1NZU0NGR19FWFRfMAkJMAorI2RlZmluZSBTVF9JUlFfU1lTQ0ZHX0VYVF8xCQkxCisjZGVmaW5lIFNUX0lSUV9TWVNDRkdfRVhUXzIJCTIKKyNkZWZpbmUgU1RfSVJRX1NZU0NGR19DVElfMAkJMworI2RlZmluZSBTVF9JUlFfU1lTQ0ZHX0NUSV8xCQk0CisjZGVmaW5lIFNUX0lSUV9TWVNDRkdfUE1VXzAJCTUKKyNkZWZpbmUgU1RfSVJRX1NZU0NGR19QTVVfMQkJNgorI2RlZmluZSBTVF9JUlFfU1lTQ0ZHX3BsMzEwX0wyCQk3CisjZGVmaW5lIFNUX0lSUV9TWVNDRkdfRElTQUJMRUQJCTB4RkZGRkZGRkYKKworI2RlZmluZSBTVF9JUlFfU1lTQ0ZHX0VYVF8xX0lOVgkJMHgxCisjZGVmaW5lIFNUX0lSUV9TWVNDRkdfRVhUXzJfSU5WCQkweDIKKyNkZWZpbmUgU1RfSVJRX1NZU0NGR19FWFRfM19JTlYJCTB4NAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvbGVkcy9jb21tb24uaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvbGVkcy9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWZjZWY3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9sZWRzL2NvbW1vbi5oCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBUaGlzIGhlYWRlciBwcm92aWRlcyBtYWNyb3MgZm9yIHRoZSBjb21tb24gTEVEcyBkZXZpY2UgdHJlZSBiaW5kaW5ncy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUsIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogQXV0aG9yOiBKYWNlayBBbmFzemV3c2tpIDxqLmFuYXN6ZXdza2lAc2Ftc3VuZy5jb20+CisgKi8KKworI2lmbmRlZiBfX0RUX0JJTkRJTkdTX0xFRFNfSF9fCisjZGVmaW5lIF9fRFRfQklORElOR1NfTEVEU19ICisKKy8qIEV4dGVybmFsIHRyaWdnZXIgdHlwZSAqLworI2RlZmluZSBMRURTX1RSSUdfVFlQRV9FREdFCTAKKyNkZWZpbmUgTEVEU19UUklHX1RZUEVfTEVWRUwJMQorCisvKiBCb29zdCBtb2RlcyAqLworI2RlZmluZSBMRURTX0JPT1NUX09GRgkJMAorI2RlZmluZSBMRURTX0JPT1NUX0FEQVBUSVZFCTEKKyNkZWZpbmUgTEVEU19CT09TVF9GSVhFRAkyCisKKyNlbmRpZiAvKiBfX0RUX0JJTkRJTkdTX0xFRFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9tZmQvYXJpem9uYS5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9tZmQvYXJpem9uYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YWY3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL21mZC9hcml6b25hLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIERldmljZSBUcmVlIGRlZmluZXMgZm9yIEFyaXpvbmEgZGV2aWNlcworICoKKyAqIENvcHlyaWdodCAyMDE1IENpcnJ1cyBMb2dpYyBJbmMuCisgKgorICogQXV0aG9yOiBDaGFybGVzIEtlZXBheCA8Y2tlZXBheEBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9EVF9CSU5ESU5HU19NRkRfQVJJWk9OQV9ICisjZGVmaW5lIF9EVF9CSU5ESU5HU19NRkRfQVJJWk9OQV9ICisKKy8qIEdQSU8gRnVuY3Rpb24gRGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9UWExSQ0xLICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fR1BJTyAgICAgICAgICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBBUklaT05BX0dQX0ZOX0lSUTEgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9JUlEyICAgICAgICAgICAgICAgICAgICAgICAweDAzCisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fT1BDTEsgICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBBUklaT05BX0dQX0ZOX0ZMTDFfT1VUICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9GTEwyX09VVCAgICAgICAgICAgICAgICAgICAweDA2CisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fUFdNMSAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBBUklaT05BX0dQX0ZOX1BXTTIgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9TWVNDTEtfVU5ERVJDTE9DS0VEICAgICAgICAweDBBCisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fQVNZTkNDTEtfVU5ERVJDTE9DS0VEICAgICAgMHgwQgorI2RlZmluZSBBUklaT05BX0dQX0ZOX0ZMTDFfTE9DSyAgICAgICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9GTEwyX0xPQ0sgICAgICAgICAgICAgICAgICAweDBECisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fRkxMMV9DTE9DS19PSyAgICAgICAgICAgICAgMHgwRgorI2RlZmluZSBBUklaT05BX0dQX0ZOX0ZMTDJfQ0xPQ0tfT0sgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9IRUFEUEhPTkVfREVUICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fTUlDX0RFVCAgICAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBBUklaT05BX0dQX0ZOX1dTRVFfU1RBVFVTICAgICAgICAgICAgICAgIDB4MTUKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9DSUZfQUREUkVTU19FUlJPUiAgICAgICAgICAweDE2CisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fQVNSQzFfTE9DSyAgICAgICAgICAgICAgICAgMHgxQQorI2RlZmluZSBBUklaT05BX0dQX0ZOX0FTUkMyX0xPQ0sgICAgICAgICAgICAgICAgIDB4MUIKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9BU1JDX0NPTkZJR19FUlJPUiAgICAgICAgICAweDFDCisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fRFJDMV9TSUdOQUxfREVURUNUICAgICAgICAgMHgxRAorI2RlZmluZSBBUklaT05BX0dQX0ZOX0RSQzFfQU5USUNMSVAgICAgICAgICAgICAgIDB4MUUKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9EUkMxX0RFQ0FZICAgICAgICAgICAgICAgICAweDFGCisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fRFJDMV9OT0lTRSAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSBBUklaT05BX0dQX0ZOX0RSQzFfUVVJQ0tfUkVMRUFTRSAgICAgICAgIDB4MjEKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9EUkMyX1NJR05BTF9ERVRFQ1QgICAgICAgICAweDIyCisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fRFJDMl9BTlRJQ0xJUCAgICAgICAgICAgICAgMHgyMworI2RlZmluZSBBUklaT05BX0dQX0ZOX0RSQzJfREVDQVkgICAgICAgICAgICAgICAgIDB4MjQKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9EUkMyX05PSVNFICAgICAgICAgICAgICAgICAweDI1CisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fRFJDMl9RVUlDS19SRUxFQVNFICAgICAgICAgMHgyNgorI2RlZmluZSBBUklaT05BX0dQX0ZOX01JWEVSX0RST1BQRURfU0FNUExFICAgICAgIDB4MjcKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9BSUYxX0NPTkZJR19FUlJPUiAgICAgICAgICAweDI4CisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fQUlGMl9DT05GSUdfRVJST1IgICAgICAgICAgMHgyOQorI2RlZmluZSBBUklaT05BX0dQX0ZOX0FJRjNfQ09ORklHX0VSUk9SICAgICAgICAgIDB4MkEKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9TUEtfVEVNUF9TSFVURE9XTiAgICAgICAgICAweDJCCisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fU1BLX1RFTVBfV0FSTklORyAgICAgICAgICAgMHgyQworI2RlZmluZSBBUklaT05BX0dQX0ZOX1VOREVSQ0xPQ0tFRCAgICAgICAgICAgICAgIDB4MkQKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9PVkVSQ0xPQ0tFRCAgICAgICAgICAgICAgICAweDJFCisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fRFNQX0lSUTEgICAgICAgICAgICAgICAgICAgMHgzNQorI2RlZmluZSBBUklaT05BX0dQX0ZOX0RTUF9JUlEyICAgICAgICAgICAgICAgICAgIDB4MzYKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9BU1lOQ19PUENMSyAgICAgICAgICAgICAgICAweDNECisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fQk9PVF9ET05FICAgICAgICAgICAgICAgICAgMHg0NAorI2RlZmluZSBBUklaT05BX0dQX0ZOX0RTUDFfUkFNX1JFQURZICAgICAgICAgICAgIDB4NDUKKyNkZWZpbmUgQVJJWk9OQV9HUF9GTl9TWVNDTEtfRU5BX1NUQVRVUyAgICAgICAgICAweDRCCisjZGVmaW5lIEFSSVpPTkFfR1BfRk5fQVNZTkNDTEtfRU5BX1NUQVRVUyAgICAgICAgMHg0QworCisvKiBHUElPIENvbmZpZ3VyYXRpb24gQml0cyAqLworI2RlZmluZSBBUklaT05BX0dQTl9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBBUklaT05BX0dQTl9QVSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMAorI2RlZmluZSBBUklaT05BX0dQTl9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMAorI2RlZmluZSBBUklaT05BX0dQTl9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBBUklaT05BX0dQTl9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBBUklaT05BX0dQTl9PUF9DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBBUklaT05BX0dQTl9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMAorCisvKiBQcm92aWRlIHNvbWUgZGVmaW5lcyBmb3IgdGhlIG1vc3QgY29tbW9uIGNvbmZpZ3MgKi8KKyNkZWZpbmUgQVJJWk9OQV9HUF9ERUZBVUxUICAgICAgICAgICAgIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQVJJWk9OQV9HUF9PVVRQVVQgICAgICAgICAgICAgIChBUklaT05BX0dQX0ZOX0dQSU8pCisjZGVmaW5lIEFSSVpPTkFfR1BfSU5QVVQgICAgICAgICAgICAgICAoQVJJWk9OQV9HUF9GTl9HUElPIHwgXAorCQkJCQlBUklaT05BX0dQTl9ESVIpCisKKyNkZWZpbmUgQVJJWk9OQV8zMktaX01DTEsxIDEKKyNkZWZpbmUgQVJJWk9OQV8zMktaX01DTEsyIDIKKyNkZWZpbmUgQVJJWk9OQV8zMktaX05PTkUgIDMKKworI2RlZmluZSBBUklaT05BX0RNSUNfTUlDVkREICAgMAorI2RlZmluZSBBUklaT05BX0RNSUNfTUlDQklBUzEgMQorI2RlZmluZSBBUklaT05BX0RNSUNfTUlDQklBUzIgMgorI2RlZmluZSBBUklaT05BX0RNSUNfTUlDQklBUzMgMworCisjZGVmaW5lIEFSSVpPTkFfSU5NT0RFX0RJRkYgMAorI2RlZmluZSBBUklaT05BX0lOTU9ERV9TRSAgIDEKKyNkZWZpbmUgQVJJWk9OQV9JTk1PREVfRE1JQyAyCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9tZmQvcWNvbS1ycG0uaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvbWZkL3Fjb20tcnBtLmgKaW5kZXggMzg4YTZmMy4uMTNhOWQ0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9tZmQvcWNvbS1ycG0uaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL21mZC9xY29tLXJwbS5oCkBAIC0xNDEsNiArMTQxLDEyIEBACiAjZGVmaW5lIFFDT01fUlBNX1NZU19GQUJSSUNfTU9ERQkJMTMxCiAjZGVmaW5lIFFDT01fUlBNX1VTQl9PVEdfU1dJVENICQkJMTMyCiAjZGVmaW5lIFFDT01fUlBNX1ZERE1JTl9HUElPCQkJMTMzCisjZGVmaW5lIFFDT01fUlBNX05TU19GQUJSSUNfMF9DTEsJCTEzNAorI2RlZmluZSBRQ09NX1JQTV9OU1NfRkFCUklDXzFfQ0xLCQkxMzUKKyNkZWZpbmUgUUNPTV9SUE1fU01CMjA4X1MxYQkJCTEzNgorI2RlZmluZSBRQ09NX1JQTV9TTUIyMDhfUzFiCQkJMTM3CisjZGVmaW5lIFFDT01fUlBNX1NNQjIwOF9TMmEJCQkxMzgKKyNkZWZpbmUgUUNPTV9SUE1fU01CMjA4X1MyYgkJCTEzOQogCiAvKgogICogQ29uc3RhbnRzIHVzZWQgdG8gc2VsZWN0IGZvcmNlIG1vZGUgZm9yIHJlZ3VsYXRvcnMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL3BoeS9waHktbWlwaHkzNjV4LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3BoeS9waHktbWlwaHkzNjV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZjhhYmEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9waHkvcGh5LW1pcGh5MzY1eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotLyoKLSAqIFRoaXMgaGVhZGVyIHByb3ZpZGVzIGNvbnN0YW50cyBmb3IgdGhlIHBoeSBmcmFtZXdvcmsKLSAqIGJhc2VkIG9uIHRoZSBTVE1pY3JvZWxlY3Ryb25pY3MgTWlQSFkzNjV4LgotICoKLSAqIEF1dGhvcjogTGVlIEpvbmVzIDxsZWUuam9uZXNAbGluYXJvLm9yZz4KLSAqLwotI2lmbmRlZiBfRFRfQklORElOR1NfUEhZX01JUEhZCi0jZGVmaW5lIF9EVF9CSU5ESU5HU19QSFlfTUlQSFkKLQotI2RlZmluZSBNSVBIWV9UWVBFX1NBVEEJCTEKLSNkZWZpbmUgTUlQSFlfVFlQRV9QQ0lFCQkyCi0jZGVmaW5lIE1JUEhZX1RZUEVfVVNCCQkzCi0KLSNlbmRpZiAvKiBfRFRfQklORElOR1NfUEhZX01JUEhZICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R0LWJpbmRpbmdzL3BpbmN0cmwvbXQ2NXh4LmggYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3BpbmN0cmwvbXQ2NXh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5OGY0NQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZHQtYmluZGluZ3MvcGluY3RybC9tdDY1eHguaApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IE1lZGlhVGVrIEluYy4KKyAqIEF1dGhvcjogSG9uZ3pob3UuWWFuZyA8aG9uZ3pob3UueWFuZ0BtZWRpYXRlay5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX0RUX0JJTkRJTkdTX1BJTkNUUkxfTVQ2NVhYX0gKKyNkZWZpbmUgX0RUX0JJTkRJTkdTX1BJTkNUUkxfTVQ2NVhYX0gKKworI2RlZmluZSBNVEtfUElOX05PKHgpICgoeCkgPDwgOCkKKyNkZWZpbmUgTVRLX0dFVF9QSU5fTk8oeCkgKCh4KSA+PiA4KQorI2RlZmluZSBNVEtfR0VUX1BJTl9GVU5DKHgpICgoeCkgJiAweGYpCisKKyNkZWZpbmUgTVRLX1BVUERfU0VUX1IxUjBfMDAgMTAwCisjZGVmaW5lIE1US19QVVBEX1NFVF9SMVIwXzAxIDEwMQorI2RlZmluZSBNVEtfUFVQRF9TRVRfUjFSMF8xMCAxMDIKKyNkZWZpbmUgTVRLX1BVUERfU0VUX1IxUjBfMTEgMTAzCisKKyNkZWZpbmUgTVRLX0RSSVZFXzJtQSAgMgorI2RlZmluZSBNVEtfRFJJVkVfNG1BICA0CisjZGVmaW5lIE1US19EUklWRV82bUEgIDYKKyNkZWZpbmUgTVRLX0RSSVZFXzhtQSAgOAorI2RlZmluZSBNVEtfRFJJVkVfMTBtQSAxMAorI2RlZmluZSBNVEtfRFJJVkVfMTJtQSAxMgorI2RlZmluZSBNVEtfRFJJVkVfMTRtQSAxNAorI2RlZmluZSBNVEtfRFJJVkVfMTZtQSAxNgorI2RlZmluZSBNVEtfRFJJVkVfMjBtQSAyMAorI2RlZmluZSBNVEtfRFJJVkVfMjRtQSAyNAorI2RlZmluZSBNVEtfRFJJVkVfMjhtQSAyOAorI2RlZmluZSBNVEtfRFJJVkVfMzJtQSAzMgorCisjZW5kaWYgLyogX0RUX0JJTkRJTkdTX1BJTkNUUkxfTVQ2NVhYX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvcGluY3RybC9xY29tLHBtaWMtZ3Bpby5oIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1ncGlvLmgKaW5kZXggZmE3NGQ3Yy4uYWFmYTc2YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1ncGlvLmgKKysrIGIvaW5jbHVkZS9kdC1iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1ncGlvLmgKQEAgLTQ4LDYgKzQ4LDE0IEBACiAjZGVmaW5lIFBNODA1OF9HUElPX0w1CQkJNgogI2RlZmluZSBQTTgwNThfR1BJT19MMgkJCTcKIAorLyoKKyAqIE5vdGU6IFBNODkxNiBHUElPMSBhbmQgR1BJTzIgYXJlIHN1cHBvcnRpbmcKKyAqIG9ubHkgTDIoMS4xNVYpIGFuZCBMNSgxLjhWKSBvcHRpb25zCisgKi8KKyNkZWZpbmUgUE04OTE2X0dQSU9fVlBICQkJMAorI2RlZmluZSBQTTg5MTZfR1BJT19MMgkJCTIKKyNkZWZpbmUgUE04OTE2X0dQSU9fTDUJCQkzCisKICNkZWZpbmUgUE04OTE3X0dQSU9fVlBICQkJMAogI2RlZmluZSBQTTg5MTdfR1BJT19TNAkJCTIKICNkZWZpbmUgUE04OTE3X0dQSU9fTDE1CQkJMwpAQCAtMTE1LDYgKzEyMywxMyBAQAogI2RlZmluZSBQTTgwNThfR1BJTzM5X01QM19DTEsJCVBNSUNfR1BJT19GVU5DX0ZVTkMxCiAjZGVmaW5lIFBNODA1OF9HUElPNDBfRVhUX0JCX0VOCQlQTUlDX0dQSU9fRlVOQ19GVU5DMQogCisjZGVmaW5lIFBNODkxNl9HUElPMV9CQVRfQUxSTV9PVVQJUE1JQ19HUElPX0ZVTkNfRlVOQzEKKyNkZWZpbmUgUE04OTE2X0dQSU8xX0tFWVBfRFJWCQlQTUlDX0dQSU9fRlVOQ19GVU5DMgorI2RlZmluZSBQTTg5MTZfR1BJTzJfRElWX0NMSwkJUE1JQ19HUElPX0ZVTkNfRlVOQzEKKyNkZWZpbmUgUE04OTE2X0dQSU8yX1NMRUVQX0NMSwkJUE1JQ19HUElPX0ZVTkNfRlVOQzIKKyNkZWZpbmUgUE04OTE2X0dQSU8zX0tFWVBfRFJWCQlQTUlDX0dQSU9fRlVOQ19GVU5DMQorI2RlZmluZSBQTTg5MTZfR1BJTzRfS0VZUF9EUlYJCVBNSUNfR1BJT19GVU5DX0ZVTkMyCisKICNkZWZpbmUgUE04OTE3X0dQSU85XzE4X0tFWVBfRFJWCVBNSUNfR1BJT19GVU5DX0ZVTkMxCiAjZGVmaW5lIFBNODkxN19HUElPMjBfQkFUX0FMUk1fT1VUCVBNSUNfR1BJT19GVU5DX0ZVTkMxCiAjZGVmaW5lIFBNODkxN19HUElPMjFfMjNfVUFSVF9UWAlQTUlDX0dQSU9fRlVOQ19GVU5DMgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1tcHAuaCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvcGluY3RybC9xY29tLHBtaWMtbXBwLmgKaW5kZXggZDJjN2RhYi4uYzEwMjA1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kdC1iaW5kaW5ncy9waW5jdHJsL3Fjb20scG1pYy1tcHAuaAorKysgYi9pbmNsdWRlL2R0LWJpbmRpbmdzL3BpbmN0cmwvcWNvbSxwbWljLW1wcC5oCkBAIC0xMCw2ICsxMCwxMCBAQAogI2RlZmluZSBQTTg4NDFfTVBQX1ZQSAkJCTAKICNkZWZpbmUgUE04ODQxX01QUF9TMwkJCTIKIAorI2RlZmluZSBQTTg5MTZfTVBQX1ZQSAkJCTAKKyNkZWZpbmUgUE04OTE2X01QUF9MMgkJCTIKKyNkZWZpbmUgUE04OTE2X01QUF9MNQkJCTMKKwogI2RlZmluZSBQTTg5NDFfTVBQX1ZQSAkJCTAKICNkZWZpbmUgUE04OTQxX01QUF9MMQkJCTEKICNkZWZpbmUgUE04OTQxX01QUF9TMwkJCTIKZGlmZiAtLWdpdCBhL2luY2x1ZGUva3ZtL2FybV9hcmNoX3RpbWVyLmggYi9pbmNsdWRlL2t2bS9hcm1fYXJjaF90aW1lci5oCmluZGV4IGIzZjQ1YTUuLmU1OTY2NzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUva3ZtL2FybV9hcmNoX3RpbWVyLmgKKysrIGIvaW5jbHVkZS9rdm0vYXJtX2FyY2hfdGltZXIuaApAQCAtMjQsMTcgKzI0LDE0IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKIHN0cnVjdCBhcmNoX3RpbWVyX2t2bSB7Ci0jaWZkZWYgQ09ORklHX0tWTV9BUk1fVElNRVIKIAkvKiBJcyB0aGUgdGltZXIgZW5hYmxlZCAqLwogCWJvb2wJCQllbmFibGVkOwogCiAJLyogVmlydHVhbCBvZmZzZXQgKi8KIAljeWNsZV90CQkJY250dm9mZjsKLSNlbmRpZgogfTsKIAogc3RydWN0IGFyY2hfdGltZXJfY3B1IHsKLSNpZmRlZiBDT05GSUdfS1ZNX0FSTV9USU1FUgogCS8qIFJlZ2lzdGVyczogY29udHJvbCByZWdpc3RlciwgdGltZXIgdmFsdWUgKi8KIAl1MzIJCQkJY250dl9jdGw7CS8qIFNhdmVkL3Jlc3RvcmVkICovCiAJY3ljbGVfdAkJCQljbnR2X2N2YWw7CS8qIFNhdmVkL3Jlc3RvcmVkICovCkBAIC01NSwxMCArNTIsOCBAQAogCiAJLyogVGltZXIgSVJRICovCiAJY29uc3Qgc3RydWN0IGt2bV9pcnFfbGV2ZWwJKmlycTsKLSNlbmRpZgogfTsKIAotI2lmZGVmIENPTkZJR19LVk1fQVJNX1RJTUVSCiBpbnQga3ZtX3RpbWVyX2h5cF9pbml0KHZvaWQpOwogdm9pZCBrdm1fdGltZXJfZW5hYmxlKHN0cnVjdCBrdm0gKmt2bSk7CiB2b2lkIGt2bV90aW1lcl9pbml0KHN0cnVjdCBrdm0gKmt2bSk7CkBAIC03MiwzMCArNjcsNiBAQAogdTY0IGt2bV9hcm1fdGltZXJfZ2V0X3JlZyhzdHJ1Y3Qga3ZtX3ZjcHUgKiwgdTY0IHJlZ2lkKTsKIGludCBrdm1fYXJtX3RpbWVyX3NldF9yZWcoc3RydWN0IGt2bV92Y3B1ICosIHU2NCByZWdpZCwgdTY0IHZhbHVlKTsKIAotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGt2bV90aW1lcl9oeXBfaW5pdCh2b2lkKQotewotCXJldHVybiAwOwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIGt2bV90aW1lcl9lbmFibGUoc3RydWN0IGt2bSAqa3ZtKSB7fQotc3RhdGljIGlubGluZSB2b2lkIGt2bV90aW1lcl9pbml0KHN0cnVjdCBrdm0gKmt2bSkge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1fdGltZXJfdmNwdV9yZXNldChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCi0JCQkJCWNvbnN0IHN0cnVjdCBrdm1faXJxX2xldmVsICppcnEpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX3RpbWVyX3ZjcHVfaW5pdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX3RpbWVyX2ZsdXNoX2h3c3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KSB7fQotc3RhdGljIGlubGluZSB2b2lkIGt2bV90aW1lcl9zeW5jX2h3c3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KSB7fQotc3RhdGljIGlubGluZSB2b2lkIGt2bV90aW1lcl92Y3B1X3Rlcm1pbmF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpIHt9Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGt2bV9hcm1fdGltZXJfc2V0X3JlZyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCByZWdpZCwgdTY0IHZhbHVlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHU2NCBrdm1fYXJtX3RpbWVyX2dldF9yZWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1NjQgcmVnaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKK2Jvb2wga3ZtX3RpbWVyX3Nob3VsZF9maXJlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9rdm0vYXJtX3ZnaWMuaCBiL2luY2x1ZGUva3ZtL2FybV92Z2ljLmgKaW5kZXggN2M1NWRkNS4uMTMzZWEwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9rdm0vYXJtX3ZnaWMuaAorKysgYi9pbmNsdWRlL2t2bS9hcm1fdmdpYy5oCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxcmV0dXJuLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGt2bS9pb2Rldi5oPgogCiAjZGVmaW5lIFZHSUNfTlJfSVJRU19MRUdBQ1kJMjU2CiAjZGVmaW5lIFZHSUNfTlJfU0dJUwkJMTYKQEAgLTExNCw2ICsxMTUsNyBAQAogCXZvaWQJKCpzeW5jX2xyX2VscnNyKShzdHJ1Y3Qga3ZtX3ZjcHUgKiwgaW50LCBzdHJ1Y3QgdmdpY19scik7CiAJdTY0CSgqZ2V0X2VscnNyKShjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCXU2NAkoKmdldF9laXNyKShjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOworCXZvaWQJKCpjbGVhcl9laXNyKShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCXUzMgkoKmdldF9pbnRlcnJ1cHRfc3RhdHVzKShjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCXZvaWQJKCplbmFibGVfdW5kZXJmbG93KShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpOwogCXZvaWQJKCpkaXNhYmxlX3VuZGVyZmxvdykoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKQEAgLTEzOSwxNiArMTQxLDIxIEBACiB9OwogCiBzdHJ1Y3QgdmdpY192bV9vcHMgewotCWJvb2wJKCpoYW5kbGVfbW1pbykoc3RydWN0IGt2bV92Y3B1ICosIHN0cnVjdCBrdm1fcnVuICosCi0JCQkgICAgICAgc3RydWN0IGt2bV9leGl0X21taW8gKik7CiAJYm9vbAkoKnF1ZXVlX3NnaSkoc3RydWN0IGt2bV92Y3B1ICosIGludCBpcnEpOwogCXZvaWQJKCphZGRfc2dpX3NvdXJjZSkoc3RydWN0IGt2bV92Y3B1ICosIGludCBpcnEsIGludCBzb3VyY2UpOwogCWludAkoKmluaXRfbW9kZWwpKHN0cnVjdCBrdm0gKik7CiAJaW50CSgqbWFwX3Jlc291cmNlcykoc3RydWN0IGt2bSAqLCBjb25zdCBzdHJ1Y3QgdmdpY19wYXJhbXMgKik7CiB9OwogCitzdHJ1Y3QgdmdpY19pb19kZXZpY2UgeworCWdwYV90IGFkZHI7CisJaW50IGxlbjsKKwljb25zdCBzdHJ1Y3QgdmdpY19pb19yYW5nZSAqcmVnX3JhbmdlczsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnJlZGlzdF92Y3B1OworCXN0cnVjdCBrdm1faW9fZGV2aWNlIGRldjsKK307CisKIHN0cnVjdCB2Z2ljX2Rpc3QgewotI2lmZGVmIENPTkZJR19LVk1fQVJNX1ZHSUMKIAlzcGlubG9ja190CQlsb2NrOwogCWJvb2wJCQlpbl9rZXJuZWw7CiAJYm9vbAkJCXJlYWR5OwpAQCAtMTk2LDYgKzIwMyw5IEBACiAJLyogTGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdCBxdWV1ZWQgb24gVkNQVSBpbnRlcmZhY2UgKi8KIAlzdHJ1Y3QgdmdpY19iaXRtYXAJaXJxX3F1ZXVlZDsKIAorCS8qIEludGVycnVwdCB3YXMgYWN0aXZlIHdoZW4gdW5xdWV1ZSBmcm9tIFZDUFUgaW50ZXJmYWNlICovCisJc3RydWN0IHZnaWNfYml0bWFwCWlycV9hY3RpdmU7CisKIAkvKiBJbnRlcnJ1cHQgcHJpb3JpdHkuIE5vdCB1c2VkIHlldC4gKi8KIAlzdHJ1Y3QgdmdpY19ieXRlbWFwCWlycV9wcmlvcml0eTsKIApAQCAtMjM2LDggKzI0NiwxMiBAQAogCS8qIEJpdG1hcCBpbmRpY2F0aW5nIHdoaWNoIENQVSBoYXMgc29tZXRoaW5nIHBlbmRpbmcgKi8KIAl1bnNpZ25lZCBsb25nCQkqaXJxX3BlbmRpbmdfb25fY3B1OwogCisJLyogQml0bWFwIGluZGljYXRpbmcgd2hpY2ggQ1BVIGhhcyBhY3RpdmUgSVJRcyAqLworCXVuc2lnbmVkIGxvbmcJCSppcnFfYWN0aXZlX29uX2NwdTsKKwogCXN0cnVjdCB2Z2ljX3ZtX29wcwl2bV9vcHM7Ci0jZW5kaWYKKwlzdHJ1Y3QgdmdpY19pb19kZXZpY2UJZGlzdF9pb2RldjsKKwlzdHJ1Y3QgdmdpY19pb19kZXZpY2UJKnJlZGlzdF9pb2RldnM7CiB9OwogCiBzdHJ1Y3QgdmdpY192Ml9jcHVfaWYgewpAQCAtMjY1LDEzICsyNzksMTggQEAKIH07CiAKIHN0cnVjdCB2Z2ljX2NwdSB7Ci0jaWZkZWYgQ09ORklHX0tWTV9BUk1fVkdJQwogCS8qIHBlciBJUlEgdG8gTFIgbWFwcGluZyAqLwogCXU4CQkqdmdpY19pcnFfbHJfbWFwOwogCi0JLyogUGVuZGluZyBpbnRlcnJ1cHRzIG9uIHRoaXMgVkNQVSAqLworCS8qIFBlbmRpbmcvYWN0aXZlL2JvdGggaW50ZXJydXB0cyBvbiB0aGlzIFZDUFUgKi8KIAlERUNMQVJFX0JJVE1BUCgJcGVuZGluZ19wZXJjcHUsIFZHSUNfTlJfUFJJVkFURV9JUlFTKTsKKwlERUNMQVJFX0JJVE1BUCgJYWN0aXZlX3BlcmNwdSwgVkdJQ19OUl9QUklWQVRFX0lSUVMpOworCURFQ0xBUkVfQklUTUFQKAlwZW5kX2FjdF9wZXJjcHUsIFZHSUNfTlJfUFJJVkFURV9JUlFTKTsKKworCS8qIFBlbmRpbmcvYWN0aXZlL2JvdGggc2hhcmVkIGludGVycnVwdHMsIGR5bmFtaWNhbGx5IHNpemVkICovCiAJdW5zaWduZWQgbG9uZwkqcGVuZGluZ19zaGFyZWQ7CisJdW5zaWduZWQgbG9uZyAgICphY3RpdmVfc2hhcmVkOworCXVuc2lnbmVkIGxvbmcgICAqcGVuZF9hY3Rfc2hhcmVkOwogCiAJLyogQml0bWFwIG9mIHVzZWQvZnJlZSBsaXN0IHJlZ2lzdGVycyAqLwogCURFQ0xBUkVfQklUTUFQKAlscl91c2VkLCBWR0lDX1YyX01BWF9MUlMpOwpAQCAtMjg0LDcgKzMwMyw2IEBACiAJCXN0cnVjdCB2Z2ljX3YyX2NwdV9pZgl2Z2ljX3YyOwogCQlzdHJ1Y3QgdmdpY192M19jcHVfaWYJdmdpY192MzsKIAl9OwotI2VuZGlmCiB9OwogCiAjZGVmaW5lIExSX0VNUFRZCTB4ZmYKQEAgLTI5NCwxMCArMzEyLDcgQEAKIAogc3RydWN0IGt2bTsKIHN0cnVjdCBrdm1fdmNwdTsKLXN0cnVjdCBrdm1fcnVuOwotc3RydWN0IGt2bV9leGl0X21taW87CiAKLSNpZmRlZiBDT05GSUdfS1ZNX0FSTV9WR0lDCiBpbnQga3ZtX3ZnaWNfYWRkcihzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgdHlwZSwgdTY0ICphZGRyLCBib29sIHdyaXRlKTsKIGludCBrdm1fdmdpY19oeXBfaW5pdCh2b2lkKTsKIGludCBrdm1fdmdpY19tYXBfcmVzb3VyY2VzKHN0cnVjdCBrdm0gKmt2bSk7CkBAIC0zMTEsOCArMzI2LDcgQEAKIAkJCWJvb2wgbGV2ZWwpOwogdm9pZCB2Z2ljX3YzX2Rpc3BhdGNoX3NnaShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHU2NCByZWcpOwogaW50IGt2bV92Z2ljX3ZjcHVfcGVuZGluZ19pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKLWJvb2wgdmdpY19oYW5kbGVfbW1pbyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4sCi0JCSAgICAgIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvKTsKK2ludCBrdm1fdmdpY192Y3B1X2FjdGl2ZV9pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAogI2RlZmluZSBpcnFjaGlwX2luX2tlcm5lbChrKQkoISEoKGspLT5hcmNoLnZnaWMuaW5fa2VybmVsKSkKICNkZWZpbmUgdmdpY19pbml0aWFsaXplZChrKQkoISEoKGspLT5hcmNoLnZnaWMubnJfY3B1cykpCkBAIC0zMzQsODQgKzM0OCw0IEBACiB9CiAjZW5kaWYKIAotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGt2bV92Z2ljX2h5cF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGt2bV92Z2ljX3NldF9hZGRyKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgbG9uZyB0eXBlLCB1NjQgYWRkcikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQga3ZtX3ZnaWNfYWRkcihzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgdHlwZSwgdTY0ICphZGRyLCBib29sIHdyaXRlKQotewotCXJldHVybiAtRU5YSU87Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGt2bV92Z2ljX21hcF9yZXNvdXJjZXMoc3RydWN0IGt2bSAqa3ZtKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBrdm1fdmdpY19jcmVhdGUoc3RydWN0IGt2bSAqa3ZtLCB1MzIgdHlwZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGt2bV92Z2ljX2Rlc3Ryb3koc3RydWN0IGt2bSAqa3ZtKQotewotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX3ZnaWNfdmNwdV9kZXN0cm95KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLX0KLQotc3RhdGljIGlubGluZSBpbnQga3ZtX3ZnaWNfdmNwdV9pbml0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGt2bV92Z2ljX2ZsdXNoX2h3c3RhdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KSB7fQotc3RhdGljIGlubGluZSB2b2lkIGt2bV92Z2ljX3N5bmNfaHdzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpIHt9Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGt2bV92Z2ljX2luamVjdF9pcnEoc3RydWN0IGt2bSAqa3ZtLCBpbnQgY3B1aWQsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGlycV9udW0sIGJvb2wgbGV2ZWwpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGt2bV92Z2ljX3ZjcHVfcGVuZGluZ19pcnEoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgdmdpY19oYW5kbGVfbW1pbyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4sCi0JCQkJICAgIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvKQotewotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXJxY2hpcF9pbl9rZXJuZWwoc3RydWN0IGt2bSAqa3ZtKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgdmdpY19pbml0aWFsaXplZChzdHJ1Y3Qga3ZtICprdm0pCi17Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCB2Z2ljX3JlYWR5KHN0cnVjdCBrdm0gKmt2bSkKLXsKLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQga3ZtX3ZnaWNfZ2V0X21heF92Y3B1cyh2b2lkKQotewotCXJldHVybiBLVk1fTUFYX1ZDUFVTOwotfQotI2VuZGlmCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9rdm0vaW9kZXYuaCBiL2luY2x1ZGUva3ZtL2lvZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZkMjA4YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUva3ZtL2lvZGV2LmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fS1ZNX0lPREVWX0hfXworI2RlZmluZSBfX0tWTV9JT0RFVl9IX18KKworI2luY2x1ZGUgPGxpbnV4L2t2bV90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisKK3N0cnVjdCBrdm1faW9fZGV2aWNlOworc3RydWN0IGt2bV92Y3B1OworCisvKioKKyAqIGt2bV9pb19kZXZpY2Vfb3BzIGFyZSBjYWxsZWQgdW5kZXIga3ZtIHNsb3RzX2xvY2suCisgKiByZWFkIGFuZCB3cml0ZSBoYW5kbGVycyByZXR1cm4gMCBpZiB0aGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gaGFuZGxlZCwKKyAqIG9yIG5vbi16ZXJvIHRvIGhhdmUgaXQgcGFzc2VkIHRvIHRoZSBuZXh0IGRldmljZS4KKyAqKi8KK3N0cnVjdCBrdm1faW9fZGV2aWNlX29wcyB7CisJaW50ICgqcmVhZCkoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkgICAgc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsCisJCSAgICBncGFfdCBhZGRyLAorCQkgICAgaW50IGxlbiwKKwkJICAgIHZvaWQgKnZhbCk7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJICAgICBzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKKwkJICAgICBncGFfdCBhZGRyLAorCQkgICAgIGludCBsZW4sCisJCSAgICAgY29uc3Qgdm9pZCAqdmFsKTsKKwl2b2lkICgqZGVzdHJ1Y3Rvcikoc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMpOworfTsKKworCitzdHJ1Y3Qga3ZtX2lvX2RldmljZSB7CisJY29uc3Qgc3RydWN0IGt2bV9pb19kZXZpY2Vfb3BzICpvcHM7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtX2lvZGV2aWNlX2luaXQoc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBrdm1faW9fZGV2aWNlX29wcyAqb3BzKQoreworCWRldi0+b3BzID0gb3BzOworfQorCitzdGF0aWMgaW5saW5lIGludCBrdm1faW9kZXZpY2VfcmVhZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJICAgIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYsIGdwYV90IGFkZHIsCisJCQkJICAgIGludCBsLCB2b2lkICp2KQoreworCXJldHVybiBkZXYtPm9wcy0+cmVhZCA/IGRldi0+b3BzLT5yZWFkKHZjcHUsIGRldiwgYWRkciwgbCwgdikKKwkJCQk6IC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW5saW5lIGludCBrdm1faW9kZXZpY2Vfd3JpdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgICAgc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwgZ3BhX3QgYWRkciwKKwkJCQkgICAgIGludCBsLCBjb25zdCB2b2lkICp2KQoreworCXJldHVybiBkZXYtPm9wcy0+d3JpdGUgPyBkZXYtPm9wcy0+d3JpdGUodmNwdSwgZGV2LCBhZGRyLCBsLCB2KQorCQkJCSA6IC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQga3ZtX2lvZGV2aWNlX2Rlc3RydWN0b3Ioc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldikKK3sKKwlpZiAoZGV2LT5vcHMtPmRlc3RydWN0b3IpCisJCWRldi0+b3BzLT5kZXN0cnVjdG9yKGRldik7Cit9CisKKyNlbmRpZiAvKiBfX0tWTV9JT0RFVl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYS5vdXQuaCBiL2luY2x1ZGUvbGludXgvYS5vdXQuaAppbmRleCAyMjBmMTQzLi5lZTg4NDE2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Eub3V0LmgKKysrIGIvaW5jbHVkZS9saW51eC9hLm91dC5oCkBAIC00LDQ0ICs0LDYgQEAKICNpbmNsdWRlIDx1YXBpL2xpbnV4L2Eub3V0Lmg+CiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi0jaWYgZGVmaW5lZCAoTV9PTERTVU4yKQotI2Vsc2UKLSNlbmRpZgotI2lmIGRlZmluZWQgKE1fNjgwMTApCi0jZWxzZQotI2VuZGlmCi0jaWYgZGVmaW5lZCAoTV82ODAyMCkKLSNlbHNlCi0jZW5kaWYKLSNpZiBkZWZpbmVkIChNX1NQQVJDKQotI2Vsc2UKLSNlbmRpZgotI2lmICFkZWZpbmVkIChOX01BR0lDKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgKE5fQkFETUFHKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgKE5fVFhUT0ZGKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgKE5fREFUT0ZGKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgKE5fVFJFTE9GRikKLSNlbmRpZgotI2lmICFkZWZpbmVkIChOX0RSRUxPRkYpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoTl9TWU1PRkYpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoTl9TVFJPRkYpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoTl9UWFRBRERSKQotI2VuZGlmCi0jaWYgZGVmaW5lZCh2YXgpIHx8IGRlZmluZWQoaHAzMDApIHx8IGRlZmluZWQocHlyKQotI2VuZGlmCi0jaWZkZWYJc29ueQotI2VuZGlmCS8qIFNvbnkuICAqLwotI2lmZGVmIGlzNjhrCi0jZW5kaWYKLSNpZiBkZWZpbmVkKG02OGspICYmIGRlZmluZWQoUE9SVEFSKQotI2VuZGlmCiAjaWZkZWYgbGludXgKICNpbmNsdWRlIDxhc20vcGFnZS5oPgogI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19tYzY4MDAwX18pCkBAIC01MSwzNCArMTMsNSBAQAogI2VuZGlmCiAjZW5kaWYKICNlbmRpZgotI2lmbmRlZiBOX0RBVEFERFIKLSNlbmRpZgotI2lmICFkZWZpbmVkIChOX0JTU0FERFIpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoTl9OTElTVF9ERUNMQVJFRCkKLSNlbmRpZiAvKiBubyBOX05MSVNUX0RFQ0xBUkVELiAgKi8KLSNpZiAhZGVmaW5lZCAoTl9VTkRGKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgKE5fQUJTKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgKE5fVEVYVCkKLSNlbmRpZgotI2lmICFkZWZpbmVkIChOX0RBVEEpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoTl9CU1MpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoTl9GTikKLSNlbmRpZgotI2lmICFkZWZpbmVkIChOX0VYVCkKLSNlbmRpZgotI2lmICFkZWZpbmVkIChOX1RZUEUpCi0jZW5kaWYKLSNpZiAhZGVmaW5lZCAoTl9TVEFCKQotI2VuZGlmCi0jaWYgIWRlZmluZWQgKE5fUkVMT0NBVElPTl9JTkZPX0RFQ0xBUkVEKQotI2lmZGVmIE5TMzJLCi0jZWxzZQotI2VuZGlmCi0jZW5kaWYgLyogbm8gTl9SRUxPQ0FUSU9OX0lORk9fREVDTEFSRUQuICAqLwogI2VuZGlmIC8qX19BU1NFTUJMWV9fICovCiAjZW5kaWYgLyogX19BX09VVF9HTlVfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjcGkuaCBiL2luY2x1ZGUvbGludXgvYWNwaS5oCmluZGV4IDI0YzdhYTguLmRkMTIxMjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaS5oCkBAIC01MywxMCArNTMsMTYgQEAKIAlyZXR1cm4gYWRldiA/IGFkZXYtPmhhbmRsZSA6IE5VTEw7CiB9CiAKLSNkZWZpbmUgQUNQSV9DT01QQU5JT04oZGV2KQkJKChkZXYpLT5hY3BpX25vZGUuY29tcGFuaW9uKQotI2RlZmluZSBBQ1BJX0NPTVBBTklPTl9TRVQoZGV2LCBhZGV2KQlBQ1BJX0NPTVBBTklPTihkZXYpID0gKGFkZXYpCisjZGVmaW5lIEFDUElfQ09NUEFOSU9OKGRldikJCWFjcGlfbm9kZSgoZGV2KS0+Zndub2RlKQorI2RlZmluZSBBQ1BJX0NPTVBBTklPTl9TRVQoZGV2LCBhZGV2KQlzZXRfcHJpbWFyeV9md25vZGUoZGV2LCAoYWRldikgPyBcCisJYWNwaV9md25vZGVfaGFuZGxlKGFkZXYpIDogTlVMTCkKICNkZWZpbmUgQUNQSV9IQU5ETEUoZGV2KQkJYWNwaV9kZXZpY2VfaGFuZGxlKEFDUElfQ09NUEFOSU9OKGRldikpCiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNfYWNwaV9jb21wYW5pb24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBpc19hY3BpX25vZGUoZGV2LT5md25vZGUpOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wcmVzZXRfY29tcGFuaW9uKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkJIHN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50LCB1NjQgYWRkcikKIHsKQEAgLTQ3MSw2ICs0NzcsMTEgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGhhc19hY3BpX2NvbXBhbmlvbihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmFjcGlfZGV2X25hbWUoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KQogewogCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9haW8uaCBiL2luY2x1ZGUvbGludXgvYWlvLmgKaW5kZXggZDljOTJkYS4uOWViNDJkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9haW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2Fpby5oCkBAIC0xLDg2ICsxLDIzIEBACiAjaWZuZGVmIF9fTElOVVhfX0FJT19ICiAjZGVmaW5lIF9fTElOVVhfX0FJT19ICiAKLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvYWlvX2FiaS5oPgotI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgotI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KIAogc3RydWN0IGtpb2N0eDsKIHN0cnVjdCBraW9jYjsKK3N0cnVjdCBtbV9zdHJ1Y3Q7CiAKICNkZWZpbmUgS0lPQ0JfS0VZCQkwCiAKLS8qCi0gKiBXZSB1c2Uga2lfY2FuY2VsID09IEtJT0NCX0NBTkNFTExFRCB0byBpbmRpY2F0ZSB0aGF0IGEga2lvY2IgaGFzIGJlZW4gZWl0aGVyCi0gKiBjYW5jZWxsZWQgb3IgY29tcGxldGVkICh0aGlzIG1ha2VzIGEgY2VydGFpbiBhbW91bnQgb2Ygc2Vuc2UgYmVjYXVzZQotICogc3VjY2Vzc2Z1bCBjYW5jZWxsYXRpb24gLSBpb19jYW5jZWwoKSAtIGRvZXMgZGVsaXZlciB0aGUgY29tcGxldGlvbiB0bwotICogdXNlcnNwYWNlKS4KLSAqCi0gKiBBbmQgc2luY2UgbW9zdCB0aGluZ3MgZG9uJ3QgaW1wbGVtZW50IGtpb2NiIGNhbmNlbGxhdGlvbiBhbmQgd2UnZCByZWFsbHkgbGlrZQotICoga2lvY2IgY29tcGxldGlvbiB0byBiZSBsb2NrbGVzcyB3aGVuIHBvc3NpYmxlLCB3ZSB1c2Uga2lfY2FuY2VsIHRvCi0gKiBzeW5jaHJvbml6ZSBjYW5jZWxsYXRpb24gYW5kIGNvbXBsZXRpb24gLSB3ZSBvbmx5IHNldCBpdCB0byBLSU9DQl9DQU5DRUxMRUQKLSAqIHdpdGggeGNoZygpIG9yIGNtcHhjaGcoKSwgc2VlIGJhdGNoX2NvbXBsZXRlX2FpbygpIGFuZCBraW9jYl9jYW5jZWwoKS4KLSAqLwotI2RlZmluZSBLSU9DQl9DQU5DRUxMRUQJCSgodm9pZCAqKSAofjBVTEwpKQotCiB0eXBlZGVmIGludCAoa2lvY2JfY2FuY2VsX2ZuKShzdHJ1Y3Qga2lvY2IgKik7CiAKLXN0cnVjdCBraW9jYiB7Ci0Jc3RydWN0IGZpbGUJCSpraV9maWxwOwotCXN0cnVjdCBraW9jdHgJCSpraV9jdHg7CS8qIE5VTEwgZm9yIHN5bmMgb3BzICovCi0Ja2lvY2JfY2FuY2VsX2ZuCQkqa2lfY2FuY2VsOwotCXZvaWQJCQkqcHJpdmF0ZTsKLQotCXVuaW9uIHsKLQkJdm9pZCBfX3VzZXIJCSp1c2VyOwotCQlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRzazsKLQl9IGtpX29iajsKLQotCV9fdTY0CQkJa2lfdXNlcl9kYXRhOwkvKiB1c2VyJ3MgZGF0YSBmb3IgY29tcGxldGlvbiAqLwotCWxvZmZfdAkJCWtpX3BvczsKLQlzaXplX3QJCQlraV9uYnl0ZXM7CS8qIGNvcHkgb2YgaW9jYi0+YWlvX25ieXRlcyAqLwotCi0Jc3RydWN0IGxpc3RfaGVhZAlraV9saXN0OwkvKiB0aGUgYWlvIGNvcmUgdXNlcyB0aGlzCi0JCQkJCQkgKiBmb3IgY2FuY2VsbGF0aW9uICovCi0KLQkvKgotCSAqIElmIHRoZSBhaW9fcmVzZmQgZmllbGQgb2YgdGhlIHVzZXJzcGFjZSBpb2NiIGlzIG5vdCB6ZXJvLAotCSAqIHRoaXMgaXMgdGhlIHVuZGVybHlpbmcgZXZlbnRmZCBjb250ZXh0IHRvIGRlbGl2ZXIgZXZlbnRzIHRvLgotCSAqLwotCXN0cnVjdCBldmVudGZkX2N0eAkqa2lfZXZlbnRmZDsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc19zeW5jX2tpb2NiKHN0cnVjdCBraW9jYiAqa2lvY2IpCi17Ci0JcmV0dXJuIGtpb2NiLT5raV9jdHggPT0gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGluaXRfc3luY19raW9jYihzdHJ1Y3Qga2lvY2IgKmtpb2NiLCBzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQkqa2lvY2IgPSAoc3RydWN0IGtpb2NiKSB7Ci0JCQkua2lfY3R4ID0gTlVMTCwKLQkJCS5raV9maWxwID0gZmlscCwKLQkJCS5raV9vYmoudHNrID0gY3VycmVudCwKLQkJfTsKLX0KLQogLyogcHJvdG90eXBlcyAqLwogI2lmZGVmIENPTkZJR19BSU8KLWV4dGVybiBzc2l6ZV90IHdhaXRfb25fc3luY19raW9jYihzdHJ1Y3Qga2lvY2IgKmlvY2IpOwotZXh0ZXJuIHZvaWQgYWlvX2NvbXBsZXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgbG9uZyByZXMsIGxvbmcgcmVzMik7Ci1zdHJ1Y3QgbW1fc3RydWN0OwogZXh0ZXJuIHZvaWQgZXhpdF9haW8oc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogZXh0ZXJuIGxvbmcgZG9faW9fc3VibWl0KGFpb19jb250ZXh0X3QgY3R4X2lkLCBsb25nIG5yLAogCQkJIHN0cnVjdCBpb2NiIF9fdXNlciAqX191c2VyICppb2NicHAsIGJvb2wgY29tcGF0KTsKIHZvaWQga2lvY2Jfc2V0X2NhbmNlbF9mbihzdHJ1Y3Qga2lvY2IgKnJlcSwga2lvY2JfY2FuY2VsX2ZuICpjYW5jZWwpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgc3NpemVfdCB3YWl0X29uX3N5bmNfa2lvY2Ioc3RydWN0IGtpb2NiICppb2NiKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgYWlvX2NvbXBsZXRlKHN0cnVjdCBraW9jYiAqaW9jYiwgbG9uZyByZXMsIGxvbmcgcmVzMikgeyB9Ci1zdHJ1Y3QgbW1fc3RydWN0Owogc3RhdGljIGlubGluZSB2b2lkIGV4aXRfYWlvKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKSB7IH0KIHN0YXRpYyBpbmxpbmUgbG9uZyBkb19pb19zdWJtaXQoYWlvX2NvbnRleHRfdCBjdHhfaWQsIGxvbmcgbnIsCiAJCQkJc3RydWN0IGlvY2IgX191c2VyICogX191c2VyICppb2NicHAsCkBAIC04OSwxMSArMjYsNiBAQAogCQkJCSAgICAgICBraW9jYl9jYW5jZWxfZm4gKmNhbmNlbCkgeyB9CiAjZW5kaWYgLyogQ09ORklHX0FJTyAqLwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBraW9jYiAqbGlzdF9raW9jYihzdHJ1Y3QgbGlzdF9oZWFkICpoKQotewotCXJldHVybiBsaXN0X2VudHJ5KGgsIHN0cnVjdCBraW9jYiwga2lfbGlzdCk7Ci19Ci0KIC8qIGZvciBzeXNjdGw6ICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBhaW9fbnI7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBhaW9fbWF4X25yOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdGEuaCBiL2luY2x1ZGUvbGludXgvYXRhLmgKaW5kZXggMTY0ODAyNi4uYjY2NmI3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0YS5oCkBAIC05NCw2ICs5NCw4IEBACiAJQVRBX0lEX1NFQ1RPUl9TSVpFCT0gMTA2LAogCUFUQV9JRF9XV04JCT0gMTA4LAogCUFUQV9JRF9MT0dJQ0FMX1NFQ1RPUl9TSVpFCT0gMTE3LAkvKiBhbmQgMTE4ICovCisJQVRBX0lEX0NPTU1BTkRfU0VUXzMJPSAxMTksCisJQVRBX0lEX0NPTU1BTkRfU0VUXzQJPSAxMjAsCiAJQVRBX0lEX0xBU1RfTFVOCQk9IDEyNiwKIAlBVEFfSURfRExGCQk9IDEyOCwKIAlBVEFfSURfQ1NGTwkJPSAxMjksCkBAIC0xNzcsNyArMTc5LDcgQEAKIAlBVEFfRFNDCQkJPSAoMSA8PCA0KSwJLyogZHJpdmUgc2VlayBjb21wbGV0ZSAqLwogCUFUQV9EUlEJCQk9ICgxIDw8IDMpLAkvKiBkYXRhIHJlcXVlc3QgaS9vICovCiAJQVRBX0NPUlIJCT0gKDEgPDwgMiksCS8qIGNvcnJlY3RlZCBkYXRhIGVycm9yICovCi0JQVRBX0lEWAkJCT0gKDEgPDwgMSksCS8qIGluZGV4ICovCisJQVRBX1NFTlNFCQk9ICgxIDw8IDEpLAkvKiBzZW5zZSBjb2RlIGF2YWlsYWJsZSAqLwogCUFUQV9FUlIJCQk9ICgxIDw8IDApLAkvKiBoYXZlIGFuIGVycm9yICovCiAJQVRBX1NSU1QJCT0gKDEgPDwgMiksCS8qIHNvZnR3YXJlIHJlc2V0ICovCiAJQVRBX0lDUkMJCT0gKDEgPDwgNyksCS8qIGludGVyZmFjZSBDUkMgZXJyb3IgKi8KQEAgLTM4Miw2ICszODQsOCBAQAogCVNBVEFfU1NQCQk9IDB4MDYsCS8qIFNvZnR3YXJlIFNldHRpbmdzIFByZXNlcnZhdGlvbiAqLwogCVNBVEFfREVWU0xQCQk9IDB4MDksCS8qIERldmljZSBTbGVlcCAqLwogCisJU0VURkVBVFVSRV9TRU5TRV9EQVRBID0gMHhDMywgLyogU2Vuc2UgRGF0YSBSZXBvcnRpbmcgZmVhdHVyZSAqLworCiAJLyogZmVhdHVyZSB2YWx1ZXMgZm9yIFNFVF9NQVggKi8KIAlBVEFfU0VUX01BWF9BRERSCT0gMHgwMCwKIAlBVEFfU0VUX01BWF9QQVNTV0QJPSAweDAxLApAQCAtNTI1LDYgKzUyOSw4IEBACiAjZGVmaW5lIGF0YV9pZF9jZGJfaW50cihpZCkJKCgoaWQpW0FUQV9JRF9DT05GSUddICYgMHg2MCkgPT0gMHgyMCkKICNkZWZpbmUgYXRhX2lkX2hhc19kYShpZCkJKChpZClbQVRBX0lEX1NBVEFfQ0FQQUJJTElUWV8yXSAmICgxIDw8IDQpKQogI2RlZmluZSBhdGFfaWRfaGFzX2RldnNscChpZCkJKChpZClbQVRBX0lEX0ZFQVRVUkVfU1VQUF0gJiAoMSA8PCA4KSkKKyNkZWZpbmUgYXRhX2lkX2hhc19uY3FfYXV0b3NlbnNlKGlkKSBcCisJCQkJKChpZClbQVRBX0lEX0ZFQVRVUkVfU1VQUF0gJiAoMSA8PCA3KSkKIAogc3RhdGljIGlubGluZSBib29sIGF0YV9pZF9oYXNfaGlwbShjb25zdCB1MTYgKmlkKQogewpAQCAtNjk2LDYgKzcwMiwyNyBAQAogCXJldHVybiBpZFtBVEFfSURfQ0ZTX0VOQUJMRV8xXSAmICgxIDw8IDUpOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgYXRhX2lkX2hhc19yZWFkX2xvZ19kbWFfZXh0KGNvbnN0IHUxNiAqaWQpCit7CisJaWYgKCEoaWRbQVRBX0lEX0NGU19FTkFCTEVfMl0gJiAoMSA8PCAxNSkpKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIGlkW0FUQV9JRF9DT01NQU5EX1NFVF8zXSAmICgxIDw8IDMpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgYXRhX2lkX2hhc19zZW5zZV9yZXBvcnRpbmcoY29uc3QgdTE2ICppZCkKK3sKKwlpZiAoIShpZFtBVEFfSURfQ0ZTX0VOQUJMRV8yXSAmICgxIDw8IDE1KSkpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gaWRbQVRBX0lEX0NPTU1BTkRfU0VUXzNdICYgKDEgPDwgNik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBhdGFfaWRfc2Vuc2VfcmVwb3J0aW5nX2VuYWJsZWQoY29uc3QgdTE2ICppZCkKK3sKKwlpZiAoIShpZFtBVEFfSURfQ0ZTX0VOQUJMRV8yXSAmICgxIDw8IDE1KSkpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gaWRbQVRBX0lEX0NPTU1BTkRfU0VUXzRdICYgKDEgPDwgNik7Cit9CisKIC8qKgogICoJYXRhX2lkX21ham9yX3ZlcnNpb24JLQlnZXQgQVRBIGxldmVsIG9mIGRyaXZlCiAgKglAaWQ6IElkZW50aWZ5IGRhdGEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmggYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYS5oCmluZGV4IDk5NDczOWQuLmUzNGY5MDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmgKKysrIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaApAQCAtNDM0LDYgKzQzNCwyNyBAQAogCXJldHVybiBiY21hX2ZpbmRfY29yZV91bml0KGJ1cywgY29yZWlkLCAwKTsKIH0KIAorI2lmZGVmIENPTkZJR19CQ01BX0hPU1RfUENJCitleHRlcm4gdm9pZCBiY21hX2hvc3RfcGNpX3VwKHN0cnVjdCBiY21hX2J1cyAqYnVzKTsKK2V4dGVybiB2b2lkIGJjbWFfaG9zdF9wY2lfZG93bihzdHJ1Y3QgYmNtYV9idXMgKmJ1cyk7CitleHRlcm4gaW50IGJjbWFfaG9zdF9wY2lfaXJxX2N0bChzdHJ1Y3QgYmNtYV9idXMgKmJ1cywKKwkJCQkgc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCBib29sIGVuYWJsZSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGJjbWFfaG9zdF9wY2lfdXAoc3RydWN0IGJjbWFfYnVzICpidXMpCit7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9ob3N0X3BjaV9kb3duKHN0cnVjdCBiY21hX2J1cyAqYnVzKQoreworfQorc3RhdGljIGlubGluZSBpbnQgYmNtYV9ob3N0X3BjaV9pcnFfY3RsKHN0cnVjdCBiY21hX2J1cyAqYnVzLAorCQkJCQlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIGJvb2wgZW5hYmxlKQoreworCWlmIChidXMtPmhvc3R0eXBlID09IEJDTUFfSE9TVFRZUEVfUENJKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCXJldHVybiAwOworfQorI2VuZGlmCisKIGV4dGVybiBib29sIGJjbWFfY29yZV9pc19lbmFibGVkKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSk7CiBleHRlcm4gdm9pZCBiY21hX2NvcmVfZGlzYWJsZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUzMiBmbGFncyk7CiBleHRlcm4gaW50IGJjbWFfY29yZV9lbmFibGUoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MzIgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX2NoaXBjb21tb24uaCBiL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX2RyaXZlcl9jaGlwY29tbW9uLmgKaW5kZXggZGI2ZmEyMS4uNmNjZWVkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX2NoaXBjb21tb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfY2hpcGNvbW1vbi5oCkBAIC02NjMsMTQgKzY2Myw2IEBACiAjZGVmaW5lIGJjbWFfY2NfbWFza3NldDMyKGNjLCBvZmZzZXQsIG1hc2ssIHNldCkgXAogCWJjbWFfY2Nfd3JpdGUzMihjYywgb2Zmc2V0LCAoYmNtYV9jY19yZWFkMzIoY2MsIG9mZnNldCkgJiAobWFzaykpIHwgKHNldCkpCiAKLWV4dGVybiB2b2lkIGJjbWFfY29yZV9jaGlwY29tbW9uX2luaXQoc3RydWN0IGJjbWFfZHJ2X2NjICpjYyk7Ci1leHRlcm4gdm9pZCBiY21hX2NvcmVfY2hpcGNvbW1vbl9lYXJseV9pbml0KHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpOwotCi1leHRlcm4gdm9pZCBiY21hX2NoaXBjb19zdXNwZW5kKHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpOwotZXh0ZXJuIHZvaWQgYmNtYV9jaGlwY29fcmVzdW1lKHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpOwotCi12b2lkIGJjbWFfY2hpcGNvX2JjbTQzMzFfZXh0X3BhX2xpbmVzX2N0bChzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjLCBib29sIGVuYWJsZSk7Ci0KIGV4dGVybiB1MzIgYmNtYV9jaGlwY29fd2F0Y2hkb2dfdGltZXJfc2V0KHN0cnVjdCBiY21hX2Rydl9jYyAqY2MsIHUzMiB0aWNrcyk7CiAKIGV4dGVybiB1MzIgYmNtYV9jaGlwY29fZ2V0X2FscF9jbG9jayhzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjKTsKQEAgLTY5MCw5ICs2ODIsNiBAQAogdTMyIGJjbWFfY2hpcGNvX2dwaW9fcHVsbGRvd24oc3RydWN0IGJjbWFfZHJ2X2NjICpjYywgdTMyIG1hc2ssIHUzMiB2YWx1ZSk7CiAKIC8qIFBNVSBzdXBwb3J0ICovCi1leHRlcm4gdm9pZCBiY21hX3BtdV9pbml0KHN0cnVjdCBiY21hX2Rydl9jYyAqY2MpOwotZXh0ZXJuIHZvaWQgYmNtYV9wbXVfZWFybHlfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfY2MgKmNjKTsKLQogZXh0ZXJuIHZvaWQgYmNtYV9jaGlwY29fcGxsX3dyaXRlKHN0cnVjdCBiY21hX2Rydl9jYyAqY2MsIHUzMiBvZmZzZXQsCiAJCQkJICB1MzIgdmFsdWUpOwogZXh0ZXJuIHZvaWQgYmNtYV9jaGlwY29fcGxsX21hc2tzZXQoc3RydWN0IGJjbWFfZHJ2X2NjICpjYywgdTMyIG9mZnNldCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX2RyaXZlcl9nbWFjX2Ntbi5oIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX2dtYWNfY21uLmgKaW5kZXggNGRkMWYzMy4uNDM1NGQ0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX2dtYWNfY21uLmgKKysrIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX2dtYWNfY21uLmgKQEAgLTkxLDEwICs5MSw0IEBACiAjZGVmaW5lIGdtYWNfY21uX3dyaXRlMTYoZ2MsIG9mZnNldCwgdmFsKQliY21hX3dyaXRlMTYoKGdjKS0+Y29yZSwgb2Zmc2V0LCB2YWwpCiAjZGVmaW5lIGdtYWNfY21uX3dyaXRlMzIoZ2MsIG9mZnNldCwgdmFsKQliY21hX3dyaXRlMzIoKGdjKS0+Y29yZSwgb2Zmc2V0LCB2YWwpCiAKLSNpZmRlZiBDT05GSUdfQkNNQV9EUklWRVJfR01BQ19DTU4KLWV4dGVybiB2b2lkIGJjbWFfY29yZV9nbWFjX2Ntbl9pbml0KHN0cnVjdCBiY21hX2Rydl9nbWFjX2NtbiAqZ2MpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBiY21hX2NvcmVfZ21hY19jbW5faW5pdChzdHJ1Y3QgYmNtYV9kcnZfZ21hY19jbW4gKmdjKSB7IH0KLSNlbmRpZgotCiAjZW5kaWYgLyogTElOVVhfQkNNQV9EUklWRVJfR01BQ19DTU5fSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX2RyaXZlcl9taXBzLmggYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfbWlwcy5oCmluZGV4IDBiM2IzMmEuLjhlZWE3ZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX2RyaXZlcl9taXBzLmgKKysrIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX21pcHMuaApAQCAtMzksMjEgKzM5LDYgQEAKIAl1OCBlYXJseV9zZXR1cF9kb25lOjE7CiB9OwogCi0jaWZkZWYgQ09ORklHX0JDTUFfRFJJVkVSX01JUFMKLWV4dGVybiB2b2lkIGJjbWFfY29yZV9taXBzX2luaXQoc3RydWN0IGJjbWFfZHJ2X21pcHMgKm1jb3JlKTsKLWV4dGVybiB2b2lkIGJjbWFfY29yZV9taXBzX2Vhcmx5X2luaXQoc3RydWN0IGJjbWFfZHJ2X21pcHMgKm1jb3JlKTsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBiY21hX2NvcmVfbWlwc19pcnEoc3RydWN0IGJjbWFfZGV2aWNlICpkZXYpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBiY21hX2NvcmVfbWlwc19pbml0KHN0cnVjdCBiY21hX2Rydl9taXBzICptY29yZSkgeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9jb3JlX21pcHNfZWFybHlfaW5pdChzdHJ1Y3QgYmNtYV9kcnZfbWlwcyAqbWNvcmUpIHsgfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiY21hX2NvcmVfbWlwc19pcnEoc3RydWN0IGJjbWFfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogZXh0ZXJuIHUzMiBiY21hX2NwdV9jbG9jayhzdHJ1Y3QgYmNtYV9kcnZfbWlwcyAqbWNvcmUpOwogCiAjZW5kaWYgLyogTElOVVhfQkNNQV9EUklWRVJfTUlQU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX3BjaS5oIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX3BjaS5oCmluZGV4IDNmODA5YWUuLjViYTY5MTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX2RyaXZlcl9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfcGNpLmgKQEAgLTIzOCwxMyArMjM4LDEzIEBACiAjZGVmaW5lIHBjaWNvcmVfd3JpdGUxNihwYywgb2Zmc2V0LCB2YWwpCWJjbWFfd3JpdGUxNigocGMpLT5jb3JlLCBvZmZzZXQsIHZhbCkKICNkZWZpbmUgcGNpY29yZV93cml0ZTMyKHBjLCBvZmZzZXQsIHZhbCkJYmNtYV93cml0ZTMyKChwYyktPmNvcmUsIG9mZnNldCwgdmFsKQogCi1leHRlcm4gdm9pZCBiY21hX2NvcmVfcGNpX2Vhcmx5X2luaXQoc3RydWN0IGJjbWFfZHJ2X3BjaSAqcGMpOwotZXh0ZXJuIHZvaWQgYmNtYV9jb3JlX3BjaV9pbml0KHN0cnVjdCBiY21hX2Rydl9wY2kgKnBjKTsKLWV4dGVybiBpbnQgYmNtYV9jb3JlX3BjaV9pcnFfY3RsKHN0cnVjdCBiY21hX2Rydl9wY2kgKnBjLAotCQkJCSBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIGJvb2wgZW5hYmxlKTsKLWV4dGVybiB2b2lkIGJjbWFfY29yZV9wY2lfdXAoc3RydWN0IGJjbWFfYnVzICpidXMpOwotZXh0ZXJuIHZvaWQgYmNtYV9jb3JlX3BjaV9kb3duKHN0cnVjdCBiY21hX2J1cyAqYnVzKTsKKyNpZmRlZiBDT05GSUdfQkNNQV9EUklWRVJfUENJCiBleHRlcm4gdm9pZCBiY21hX2NvcmVfcGNpX3Bvd2VyX3NhdmUoc3RydWN0IGJjbWFfYnVzICpidXMsIGJvb2wgdXApOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBiY21hX2NvcmVfcGNpX3Bvd2VyX3NhdmUoc3RydWN0IGJjbWFfYnVzICpidXMsIGJvb2wgdXApCit7Cit9CisjZW5kaWYKIAogZXh0ZXJuIGludCBiY21hX2NvcmVfcGNpX3BjaWJpb3NfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKIGV4dGVybiBpbnQgYmNtYV9jb3JlX3BjaV9wbGF0X2Rldl9pbml0KHN0cnVjdCBwY2lfZGV2ICpkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX3BjaWUyLmggYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfcGNpZTIuaAppbmRleCA1OTg4YjA1Li4zMWU2ZDE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfcGNpZTIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfcGNpZTIuaApAQCAtMTQzLDYgKzE0Myw4IEBACiAKIHN0cnVjdCBiY21hX2Rydl9wY2llMiB7CiAJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlOworCisJdTE2IHJlcXNpemU7CiB9OwogCiAjZGVmaW5lIHBjaWUyX3JlYWQxNihwY2llMiwgb2Zmc2V0KQkJYmNtYV9yZWFkMTYoKHBjaWUyKS0+Y29yZSwgb2Zmc2V0KQpAQCAtMTUzLDYgKzE1NSw0IEBACiAjZGVmaW5lIHBjaWUyX3NldDMyKHBjaWUyLCBvZmZzZXQsIHNldCkJCWJjbWFfc2V0MzIoKHBjaWUyKS0+Y29yZSwgb2Zmc2V0LCBzZXQpCiAjZGVmaW5lIHBjaWUyX21hc2szMihwY2llMiwgb2Zmc2V0LCBtYXNrKQliY21hX21hc2szMigocGNpZTIpLT5jb3JlLCBvZmZzZXQsIG1hc2spCiAKLXZvaWQgYmNtYV9jb3JlX3BjaWUyX2luaXQoc3RydWN0IGJjbWFfZHJ2X3BjaWUyICpwY2llMik7Ci0KICNlbmRpZiAvKiBMSU5VWF9CQ01BX0RSSVZFUl9QQ0lFMl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaXRtYXAuaCBiL2luY2x1ZGUvbGludXgvYml0bWFwLmgKaW5kZXggZGJmYmY0OS4uYmU0ZmE1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oCkBAIC0xNzIsMTIgKzE3Miw4IEBACiBleHRlcm4gaW50IGJpdG1hcF9wcmludF90b19wYWdlYnVmKGJvb2wgbGlzdCwgY2hhciAqYnVmLAogCQkJCSAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKm1hc2twLCBpbnQgbm1hc2tiaXRzKTsKIAotI2RlZmluZSBCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KSAofjBVTCA8PCAoKHN0YXJ0KSAlIEJJVFNfUEVSX0xPTkcpKQotI2RlZmluZSBCSVRNQVBfTEFTVF9XT1JEX01BU0sobmJpdHMpCQkJCQlcCi0oCQkJCQkJCQkJXAotCSgobmJpdHMpICUgQklUU19QRVJfTE9ORykgPwkJCQkJXAotCQkoMVVMPDwoKG5iaXRzKSAlIEJJVFNfUEVSX0xPTkcpKS0xIDogfjBVTAkJXAotKQorI2RlZmluZSBCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KSAofjBVTCA8PCAoKHN0YXJ0KSAmIChCSVRTX1BFUl9MT05HIC0gMSkpKQorI2RlZmluZSBCSVRNQVBfTEFTVF9XT1JEX01BU0sobmJpdHMpICh+MFVMID4+ICgtKG5iaXRzKSAmIChCSVRTX1BFUl9MT05HIC0gMSkpKQogCiAjZGVmaW5lIHNtYWxsX2NvbnN0X25iaXRzKG5iaXRzKSBcCiAJKF9fYnVpbHRpbl9jb25zdGFudF9wKG5iaXRzKSAmJiAobmJpdHMpIDw9IEJJVFNfUEVSX0xPTkcpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oIGIvaW5jbHVkZS9saW51eC9ibGtfdHlwZXMuaAppbmRleCBjMjk0ZTNlLi5hMWIyNWUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa190eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrX3R5cGVzLmgKQEAgLTE4MSw3ICsxODEsOSBAQAogCV9fUkVRX0VMVlBSSVYsCQkvKiBlbGV2YXRvciBwcml2YXRlIGRhdGEgYXR0YWNoZWQgKi8KIAlfX1JFUV9GQUlMRUQsCQkvKiBzZXQgaWYgdGhlIHJlcXVlc3QgZmFpbGVkICovCiAJX19SRVFfUVVJRVQsCQkvKiBkb24ndCB3b3JyeSBhYm91dCBlcnJvcnMgKi8KLQlfX1JFUV9QUkVFTVBULAkJLyogc2V0IGZvciAiaWRlX3ByZWVtcHQiIHJlcXVlc3RzICovCisJX19SRVFfUFJFRU1QVCwJCS8qIHNldCBmb3IgImlkZV9wcmVlbXB0IiByZXF1ZXN0cyBhbmQgYWxzbworCQkJCSAgIGZvciByZXF1ZXN0cyBmb3Igd2hpY2ggdGhlIFNDU0kgInF1aWVzY2UiCisJCQkJICAgc3RhdGUgbXVzdCBiZSBpZ25vcmVkLiAqLwogCV9fUkVRX0FMTE9DRUQsCQkvKiByZXF1ZXN0IGNhbWUgZnJvbSBvdXIgYWxsb2MgcG9vbCAqLwogCV9fUkVRX0NPUFlfVVNFUiwJLyogY29udGFpbnMgY29waWVzIG9mIHVzZXIgcGFnZXMgKi8KIAlfX1JFUV9GTFVTSF9TRVEsCS8qIHJlcXVlc3QgZm9yIGZsdXNoIHNlcXVlbmNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS9saW51eC9icGYuaAppbmRleCBiYmZjZWI3Li5kNWNkYTA2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JwZi5oCisrKyBiL2luY2x1ZGUvbGludXgvYnBmLmgKQEAgLTMyLDIzICszMiwxOSBAQAogCXUzMiBrZXlfc2l6ZTsKIAl1MzIgdmFsdWVfc2l6ZTsKIAl1MzIgbWF4X2VudHJpZXM7Ci0Jc3RydWN0IGJwZl9tYXBfb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzICpvcHM7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiB9OwogCiBzdHJ1Y3QgYnBmX21hcF90eXBlX2xpc3QgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9ub2RlOwotCXN0cnVjdCBicGZfbWFwX29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyAqb3BzOwogCWVudW0gYnBmX21hcF90eXBlIHR5cGU7CiB9OwogCi12b2lkIGJwZl9yZWdpc3Rlcl9tYXBfdHlwZShzdHJ1Y3QgYnBmX21hcF90eXBlX2xpc3QgKnRsKTsKLXZvaWQgYnBmX21hcF9wdXQoc3RydWN0IGJwZl9tYXAgKm1hcCk7Ci1zdHJ1Y3QgYnBmX21hcCAqYnBmX21hcF9nZXQoc3RydWN0IGZkIGYpOwotCiAvKiBmdW5jdGlvbiBhcmd1bWVudCBjb25zdHJhaW50cyAqLwogZW51bSBicGZfYXJnX3R5cGUgewotCUFSR19BTllUSElORyA9IDAsCS8qIGFueSBhcmd1bWVudCBpcyBvayAqLworCUFSR19ET05UQ0FSRSA9IDAsCS8qIHVudXNlZCBhcmd1bWVudCBpbiBoZWxwZXIgZnVuY3Rpb24gKi8KIAogCS8qIHRoZSBmb2xsb3dpbmcgY29uc3RyYWludHMgdXNlZCB0byBwcm90b3R5cGUKIAkgKiBicGZfbWFwX2xvb2t1cC91cGRhdGUvZGVsZXRlX2VsZW0oKSBmdW5jdGlvbnMKQEAgLTYyLDYgKzU4LDkgQEAKIAkgKi8KIAlBUkdfUFRSX1RPX1NUQUNLLAkvKiBhbnkgcG9pbnRlciB0byBlQlBGIHByb2dyYW0gc3RhY2sgKi8KIAlBUkdfQ09OU1RfU1RBQ0tfU0laRSwJLyogbnVtYmVyIG9mIGJ5dGVzIGFjY2Vzc2VkIGZyb20gc3RhY2sgKi8KKworCUFSR19QVFJfVE9fQ1RYLAkJLyogcG9pbnRlciB0byBjb250ZXh0ICovCisJQVJHX0FOWVRISU5HLAkJLyogYW55IChpbml0aWFsaXplZCkgYXJndW1lbnQgaXMgb2sgKi8KIH07CiAKIC8qIHR5cGUgb2YgdmFsdWVzIHJldHVybmVkIGZyb20gaGVscGVyIGZ1bmN0aW9ucyAqLwpAQCAtMTA1LDQxICsxMDQsNjEgQEAKIAkgKiB3aXRoICd0eXBlJyAocmVhZCBvciB3cml0ZSkgaXMgYWxsb3dlZAogCSAqLwogCWJvb2wgKCppc192YWxpZF9hY2Nlc3MpKGludCBvZmYsIGludCBzaXplLCBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlKTsKKworCXUzMiAoKmNvbnZlcnRfY3R4X2FjY2VzcykoaW50IGRzdF9yZWcsIGludCBzcmNfcmVnLCBpbnQgY3R4X29mZiwKKwkJCQkgIHN0cnVjdCBicGZfaW5zbiAqaW5zbik7CiB9OwogCiBzdHJ1Y3QgYnBmX3Byb2dfdHlwZV9saXN0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Rfbm9kZTsKLQlzdHJ1Y3QgYnBmX3ZlcmlmaWVyX29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzICpvcHM7CiAJZW51bSBicGZfcHJvZ190eXBlIHR5cGU7CiB9OwogCi12b2lkIGJwZl9yZWdpc3Rlcl9wcm9nX3R5cGUoc3RydWN0IGJwZl9wcm9nX3R5cGVfbGlzdCAqdGwpOwotCiBzdHJ1Y3QgYnBmX3Byb2c7CiAKIHN0cnVjdCBicGZfcHJvZ19hdXggewogCWF0b21pY190IHJlZmNudDsKLQlib29sIGlzX2dwbF9jb21wYXRpYmxlOwotCWVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGU7Ci0Jc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgKm9wczsKLQlzdHJ1Y3QgYnBmX21hcCAqKnVzZWRfbWFwczsKIAl1MzIgdXNlZF9tYXBfY250OworCWNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzICpvcHM7CisJc3RydWN0IGJwZl9tYXAgKip1c2VkX21hcHM7CiAJc3RydWN0IGJwZl9wcm9nICpwcm9nOwogCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwogfTsKIAogI2lmZGVmIENPTkZJR19CUEZfU1lTQ0FMTAotdm9pZCBicGZfcHJvZ19wdXQoc3RydWN0IGJwZl9wcm9nICpwcm9nKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgYnBmX3Byb2dfcHV0KHN0cnVjdCBicGZfcHJvZyAqcHJvZykge30KLSNlbmRpZgordm9pZCBicGZfcmVnaXN0ZXJfcHJvZ190eXBlKHN0cnVjdCBicGZfcHJvZ190eXBlX2xpc3QgKnRsKTsKK3ZvaWQgYnBmX3JlZ2lzdGVyX21hcF90eXBlKHN0cnVjdCBicGZfbWFwX3R5cGVfbGlzdCAqdGwpOworCiBzdHJ1Y3QgYnBmX3Byb2cgKmJwZl9wcm9nX2dldCh1MzIgdWZkKTsKK3ZvaWQgYnBmX3Byb2dfcHV0KHN0cnVjdCBicGZfcHJvZyAqcHJvZyk7CisKK3N0cnVjdCBicGZfbWFwICpicGZfbWFwX2dldChzdHJ1Y3QgZmQgZik7Cit2b2lkIGJwZl9tYXBfcHV0KHN0cnVjdCBicGZfbWFwICptYXApOworCiAvKiB2ZXJpZnkgY29ycmVjdG5lc3Mgb2YgZUJQRiBwcm9ncmFtICovCi1pbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqZnAsIHVuaW9uIGJwZl9hdHRyICphdHRyKTsKK2ludCBicGZfY2hlY2soc3RydWN0IGJwZl9wcm9nICoqZnAsIHVuaW9uIGJwZl9hdHRyICphdHRyKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYnBmX3JlZ2lzdGVyX3Byb2dfdHlwZShzdHJ1Y3QgYnBmX3Byb2dfdHlwZV9saXN0ICp0bCkKK3sKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnBmX3Byb2cgKmJwZl9wcm9nX2dldCh1MzIgdWZkKQoreworCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJwZl9wcm9nX3B1dChzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0JQRl9TWVNDQUxMICovCiAKIC8qIHZlcmlmaWVyIHByb3RvdHlwZXMgZm9yIGhlbHBlciBmdW5jdGlvbnMgY2FsbGVkIGZyb20gZUJQRiBwcm9ncmFtcyAqLwotZXh0ZXJuIHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2xvb2t1cF9lbGVtX3Byb3RvOwotZXh0ZXJuIHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX3VwZGF0ZV9lbGVtX3Byb3RvOwotZXh0ZXJuIHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2RlbGV0ZV9lbGVtX3Byb3RvOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2xvb2t1cF9lbGVtX3Byb3RvOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX3VwZGF0ZV9lbGVtX3Byb3RvOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2RlbGV0ZV9lbGVtX3Byb3RvOworCitleHRlcm4gY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9nZXRfcHJhbmRvbV91MzJfcHJvdG87CitleHRlcm4gY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9nZXRfc21wX3Byb2Nlc3Nvcl9pZF9wcm90bzsKIAogI2VuZGlmIC8qIF9MSU5VWF9CUEZfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9icmNtcGh5LmggYi9pbmNsdWRlL2xpbnV4L2JyY21waHkuaAppbmRleCA3Y2NkOTI4Li5hZTI5ODJjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JyY21waHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JyY21waHkuaApAQCAtMTEsNiArMTEsNyBAQAogI2RlZmluZSBQSFlfSURfQkNNNTQyMQkJCTB4MDAyMDYwZTAKICNkZWZpbmUgUEhZX0lEX0JDTTU0NjQJCQkweDAwMjA2MGIwCiAjZGVmaW5lIFBIWV9JRF9CQ001NDYxCQkJMHgwMDIwNjBjMAorI2RlZmluZSBQSFlfSURfQkNNNTQ2MTZTCQkweDAzNjI1ZDEwCiAjZGVmaW5lIFBIWV9JRF9CQ001Nzc4MAkJCTB4MDM2MjVkOTAKIAogI2RlZmluZSBQSFlfSURfQkNNNzI1MAkJCTB4YWUwMjUyODAKQEAgLTE5LDYgKzIwLDcgQEAKICNkZWZpbmUgUEhZX0lEX0JDTTc0MjUJCQkweDAzNjI1ZTYwCiAjZGVmaW5lIFBIWV9JRF9CQ003NDI5CQkJMHg2MDBkODczMAogI2RlZmluZSBQSFlfSURfQkNNNzQzOQkJCTB4NjAwZDg0ODAKKyNkZWZpbmUgUEhZX0lEX0JDTTc0MzlfMgkJMHhhZTAyNTA4MAogI2RlZmluZSBQSFlfSURfQkNNNzQ0NQkJCTB4NjAwZDg1MTAKIAogI2RlZmluZSBQSFlfQkNNX09VSV9NQVNLCQkweGZmZmZmYzAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nhbi9kZXYuaCBiL2luY2x1ZGUvbGludXgvY2FuL2Rldi5oCmluZGV4IGMwNWZmMGYuLmMzYTljOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FuL2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FuL2Rldi5oCkBAIC02MSw2ICs2MSw4IEBACiAJY2hhciB0eF9sZWRfdHJpZ19uYW1lW0NBTl9MRURfTkFNRV9TWl07CiAJc3RydWN0IGxlZF90cmlnZ2VyICpyeF9sZWRfdHJpZzsKIAljaGFyIHJ4X2xlZF90cmlnX25hbWVbQ0FOX0xFRF9OQU1FX1NaXTsKKwlzdHJ1Y3QgbGVkX3RyaWdnZXIgKnJ4dHhfbGVkX3RyaWc7CisJY2hhciByeHR4X2xlZF90cmlnX25hbWVbQ0FOX0xFRF9OQU1FX1NaXTsKICNlbmRpZgogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYW4vbGVkLmggYi9pbmNsdWRlL2xpbnV4L2Nhbi9sZWQuaAppbmRleCBlMDQ3NWM1Li4xNDZkZTQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nhbi9sZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nhbi9sZWQuaApAQCAtMjEsOCArMjEsMTAgQEAKIAogI2lmZGVmIENPTkZJR19DQU5fTEVEUwogCi0vKiBrZWVwIHNwYWNlIGZvciBpbnRlcmZhY2UgbmFtZSArICItdHgiLyItcngiIHN1ZmZpeCBhbmQgbnVsbCB0ZXJtaW5hdG9yICovCi0jZGVmaW5lIENBTl9MRURfTkFNRV9TWiAoSUZOQU1TSVogKyA0KQorLyoga2VlcCBzcGFjZSBmb3IgaW50ZXJmYWNlIG5hbWUgKyAiLXR4Ii8iLXJ4Ii8iLXJ4dHgiCisgKiBzdWZmaXggYW5kIG51bGwgdGVybWluYXRvcgorICovCisjZGVmaW5lIENBTl9MRURfTkFNRV9TWiAoSUZOQU1TSVogKyA2KQogCiB2b2lkIGNhbl9sZWRfZXZlbnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgZW51bSBjYW5fbGVkX2V2ZW50IGV2ZW50KTsKIHZvaWQgZGV2bV9jYW5fbGVkX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nhbi9za2IuaCBiL2luY2x1ZGUvbGludXgvY2FuL3NrYi5oCmluZGV4IGNjMDBkMTUuLmI2YTUyYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2FuL3NrYi5oCisrKyBiL2luY2x1ZGUvbGludXgvY2FuL3NrYi5oCkBAIC00NCwxNiArNDQsMTEgQEAKIAlza2JfcmVzZXJ2ZShza2IsIHNpemVvZihzdHJ1Y3QgY2FuX3NrYl9wcml2KSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjYW5fc2tiX2Rlc3RydWN0b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzb2NrX3B1dChza2ItPnNrKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGNhbl9za2Jfc2V0X293bmVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaykKIHsKIAlpZiAoc2spIHsKIAkJc29ja19ob2xkKHNrKTsKLQkJc2tiLT5kZXN0cnVjdG9yID0gY2FuX3NrYl9kZXN0cnVjdG9yOworCQlza2ItPmRlc3RydWN0b3IgPSBzb2NrX2VmcmVlOwogCQlza2ItPnNrID0gc2s7CiAJfQogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYXBhYmlsaXR5LmggYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAppbmRleCBhYTkzZTVlLi5hZjlmMGI5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NhcGFiaWxpdHkuaApAQCAtMjA1LDYgKzIwNSw3IEBACiAJCQkgICBjYXBfaW50ZXJzZWN0KHBlcm1pdHRlZCwgX19jYXBfbmZzZF9zZXQpKTsKIH0KIAorI2lmZGVmIENPTkZJR19NVUxUSVVTRVIKIGV4dGVybiBib29sIGhhc19jYXBhYmlsaXR5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNhcCk7CiBleHRlcm4gYm9vbCBoYXNfbnNfY2FwYWJpbGl0eShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsCiAJCQkgICAgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zLCBpbnQgY2FwKTsKQEAgLTIxMyw2ICsyMTQsMzQgQEAKIAkJCQkgICAgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zLCBpbnQgY2FwKTsKIGV4dGVybiBib29sIGNhcGFibGUoaW50IGNhcCk7CiBleHRlcm4gYm9vbCBuc19jYXBhYmxlKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMsIGludCBjYXApOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNfY2FwYWJpbGl0eShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGludCBjYXApCit7CisJcmV0dXJuIHRydWU7Cit9CitzdGF0aWMgaW5saW5lIGJvb2wgaGFzX25zX2NhcGFiaWxpdHkoc3RydWN0IHRhc2tfc3RydWN0ICp0LAorCQkJICAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucywgaW50IGNhcCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNfY2FwYWJpbGl0eV9ub2F1ZGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwgaW50IGNhcCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNfbnNfY2FwYWJpbGl0eV9ub2F1ZGl0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCwKKwkJCQkgICAgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zLCBpbnQgY2FwKQoreworCXJldHVybiB0cnVlOworfQorc3RhdGljIGlubGluZSBib29sIGNhcGFibGUoaW50IGNhcCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KK3N0YXRpYyBpbmxpbmUgYm9vbCBuc19jYXBhYmxlKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqbnMsIGludCBjYXApCit7CisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYgLyogQ09ORklHX01VTFRJVVNFUiAqLwogZXh0ZXJuIGJvb2wgY2FwYWJsZV93cnRfaW5vZGVfdWlkZ2lkKGNvbnN0IHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBjYXApOwogZXh0ZXJuIGJvb2wgZmlsZV9uc19jYXBhYmxlKGNvbnN0IHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKm5zLCBpbnQgY2FwKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbGVhbmNhY2hlLmggYi9pbmNsdWRlL2xpbnV4L2NsZWFuY2FjaGUuaAppbmRleCA0Y2U5MDU2Li5iZGE1ZWMwYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2xlYW5jYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2xlYW5jYWNoZS5oCkBAIC01LDYgKzUsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKKyNkZWZpbmUgQ0xFQU5DQUNIRV9OT19QT09MCQktMQorI2RlZmluZSBDTEVBTkNBQ0hFX05PX0JBQ0tFTkQJCS0yCisjZGVmaW5lIENMRUFOQ0FDSEVfTk9fQkFDS0VORF9TSEFSRUQJLTMKKwogI2RlZmluZSBDTEVBTkNBQ0hFX0tFWV9NQVggNgogCiAvKgpAQCAtMzMsMTAgKzM3LDkgQEAKIAl2b2lkICgqaW52YWxpZGF0ZV9mcykoaW50KTsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgY2xlYW5jYWNoZV9vcHMgKgotCWNsZWFuY2FjaGVfcmVnaXN0ZXJfb3BzKHN0cnVjdCBjbGVhbmNhY2hlX29wcyAqb3BzKTsKK2V4dGVybiBpbnQgY2xlYW5jYWNoZV9yZWdpc3Rlcl9vcHMoc3RydWN0IGNsZWFuY2FjaGVfb3BzICpvcHMpOwogZXh0ZXJuIHZvaWQgX19jbGVhbmNhY2hlX2luaXRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICopOwotZXh0ZXJuIHZvaWQgX19jbGVhbmNhY2hlX2luaXRfc2hhcmVkX2ZzKGNoYXIgKiwgc3RydWN0IHN1cGVyX2Jsb2NrICopOworZXh0ZXJuIHZvaWQgX19jbGVhbmNhY2hlX2luaXRfc2hhcmVkX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKIGV4dGVybiBpbnQgIF9fY2xlYW5jYWNoZV9nZXRfcGFnZShzdHJ1Y3QgcGFnZSAqKTsKIGV4dGVybiB2b2lkIF9fY2xlYW5jYWNoZV9wdXRfcGFnZShzdHJ1Y3QgcGFnZSAqKTsKIGV4dGVybiB2b2lkIF9fY2xlYW5jYWNoZV9pbnZhbGlkYXRlX3BhZ2Uoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKiwgc3RydWN0IHBhZ2UgKik7CkBAIC03OCwxMCArODEsMTAgQEAKIAkJX19jbGVhbmNhY2hlX2luaXRfZnMoc2IpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY2xlYW5jYWNoZV9pbml0X3NoYXJlZF9mcyhjaGFyICp1dWlkLCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQorc3RhdGljIGlubGluZSB2b2lkIGNsZWFuY2FjaGVfaW5pdF9zaGFyZWRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlpZiAoY2xlYW5jYWNoZV9lbmFibGVkKQotCQlfX2NsZWFuY2FjaGVfaW5pdF9zaGFyZWRfZnModXVpZCwgc2IpOworCQlfX2NsZWFuY2FjaGVfaW5pdF9zaGFyZWRfZnMoc2IpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBjbGVhbmNhY2hlX2dldF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbG9ja2NoaXBzLmggYi9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaAppbmRleCAyZTRjYjY3Li45NmMyODBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaApAQCAtOCwzMyArOCwxOSBAQAogI2lmbmRlZiBfTElOVVhfQ0xPQ0tDSElQU19ICiAjZGVmaW5lIF9MSU5VWF9DTE9DS0NISVBTX0gKIAotLyogQ2xvY2sgZXZlbnQgbm90aWZpY2F0aW9uIHZhbHVlcyAqLwotZW51bSBjbG9ja19ldmVudF9ub2ZpdGllcnMgewotCUNMT0NLX0VWVF9OT1RJRllfQURELAotCUNMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OLAotCUNMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09GRiwKLQlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9GT1JDRSwKLQlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FTlRFUiwKLQlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElULAotCUNMT0NLX0VWVF9OT1RJRllfU1VTUEVORCwKLQlDTE9DS19FVlRfTk9USUZZX1JFU1VNRSwKLQlDTE9DS19FVlRfTk9USUZZX0NQVV9EWUlORywKLQlDTE9DS19FVlRfTk9USUZZX0NQVV9ERUFELAotfTsKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUwogCi0jaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQKLQotI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgotI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyMgaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyMgaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorIyBpbmNsdWRlIDxsaW51eC9rdGltZS5oPgorIyBpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCiBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlOwogc3RydWN0IG1vZHVsZTsKIAotLyogQ2xvY2sgZXZlbnQgbW9kZSBjb21tYW5kcyAqLworLyogQ2xvY2sgZXZlbnQgbW9kZSBjb21tYW5kcyBmb3IgbGVnYWN5IC0+c2V0X21vZGUoKTogT0JTT0xFVEUgKi8KIGVudW0gY2xvY2tfZXZlbnRfbW9kZSB7Ci0JQ0xPQ0tfRVZUX01PREVfVU5VU0VEID0gMCwKKwlDTE9DS19FVlRfTU9ERV9VTlVTRUQsCiAJQ0xPQ0tfRVZUX01PREVfU0hVVERPV04sCiAJQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMsCiAJQ0xPQ0tfRVZUX01PREVfT05FU0hPVCwKQEAgLTQyLDMwICsyOCw0OSBAQAogfTsKIAogLyoKKyAqIFBvc3NpYmxlIHN0YXRlcyBvZiBhIGNsb2NrIGV2ZW50IGRldmljZS4KKyAqCisgKiBERVRBQ0hFRDoJRGV2aWNlIGlzIG5vdCB1c2VkIGJ5IGNsb2NrZXZlbnRzIGNvcmUuIEluaXRpYWwgc3RhdGUgb3IgY2FuIGJlCisgKgkJcmVhY2hlZCBmcm9tIFNIVVRET1dOLgorICogU0hVVERPV046CURldmljZSBpcyBwb3dlcmVkLW9mZi4gQ2FuIGJlIHJlYWNoZWQgZnJvbSBQRVJJT0RJQyBvciBPTkVTSE9ULgorICogUEVSSU9ESUM6CURldmljZSBpcyBwcm9ncmFtbWVkIHRvIGdlbmVyYXRlIGV2ZW50cyBwZXJpb2RpY2FsbHkuIENhbiBiZQorICoJCXJlYWNoZWQgZnJvbSBERVRBQ0hFRCBvciBTSFVURE9XTi4KKyAqIE9ORVNIT1Q6CURldmljZSBpcyBwcm9ncmFtbWVkIHRvIGdlbmVyYXRlIGV2ZW50IG9ubHkgb25jZS4gQ2FuIGJlIHJlYWNoZWQKKyAqCQlmcm9tIERFVEFDSEVEIG9yIFNIVVRET1dOLgorICovCitlbnVtIGNsb2NrX2V2ZW50X3N0YXRlIHsKKwlDTE9DS19FVlRfU1RBVEVfREVUQUNIRUQsCisJQ0xPQ0tfRVZUX1NUQVRFX1NIVVRET1dOLAorCUNMT0NLX0VWVF9TVEFURV9QRVJJT0RJQywKKwlDTE9DS19FVlRfU1RBVEVfT05FU0hPVCwKK307CisKKy8qCiAgKiBDbG9jayBldmVudCBmZWF0dXJlcwogICovCi0jZGVmaW5lIENMT0NLX0VWVF9GRUFUX1BFUklPRElDCQkweDAwMDAwMQotI2RlZmluZSBDTE9DS19FVlRfRkVBVF9PTkVTSE9UCQkweDAwMDAwMgotI2RlZmluZSBDTE9DS19FVlRfRkVBVF9LVElNRQkJMHgwMDAwMDQKKyMgZGVmaW5lIENMT0NLX0VWVF9GRUFUX1BFUklPRElDCTB4MDAwMDAxCisjIGRlZmluZSBDTE9DS19FVlRfRkVBVF9PTkVTSE9UCQkweDAwMDAwMgorIyBkZWZpbmUgQ0xPQ0tfRVZUX0ZFQVRfS1RJTUUJCTB4MDAwMDA0CisKIC8qCi0gKiB4ODYoNjQpIHNwZWNpZmljIG1pc2ZlYXR1cmVzOgorICogeDg2KDY0KSBzcGVjaWZpYyAobWlzKWZlYXR1cmVzOgogICoKICAqIC0gQ2xvY2tldmVudCBzb3VyY2Ugc3RvcHMgaW4gQzMgU3RhdGUgYW5kIG5lZWRzIGJyb2FkY2FzdCBzdXBwb3J0LgogICogLSBMb2NhbCBBUElDIHRpbWVyIGlzIHVzZWQgYXMgYSBkdW1teSBkZXZpY2UuCiAgKi8KLSNkZWZpbmUgQ0xPQ0tfRVZUX0ZFQVRfQzNTVE9QCQkweDAwMDAwOAotI2RlZmluZSBDTE9DS19FVlRfRkVBVF9EVU1NWQkJMHgwMDAwMTAKKyMgZGVmaW5lIENMT0NLX0VWVF9GRUFUX0MzU1RPUAkJMHgwMDAwMDgKKyMgZGVmaW5lIENMT0NLX0VWVF9GRUFUX0RVTU1ZCQkweDAwMDAxMAogCiAvKgogICogQ29yZSBzaGFsbCBzZXQgdGhlIGludGVycnVwdCBhZmZpbml0eSBkeW5hbWljYWxseSBpbiBicm9hZGNhc3QgbW9kZQogICovCi0jZGVmaW5lIENMT0NLX0VWVF9GRUFUX0RZTklSUQkJMHgwMDAwMjAKLSNkZWZpbmUgQ0xPQ0tfRVZUX0ZFQVRfUEVSQ1BVCQkweDAwMDA0MAorIyBkZWZpbmUgQ0xPQ0tfRVZUX0ZFQVRfRFlOSVJRCQkweDAwMDAyMAorIyBkZWZpbmUgQ0xPQ0tfRVZUX0ZFQVRfUEVSQ1BVCQkweDAwMDA0MAogCiAvKgogICogQ2xvY2tldmVudCBkZXZpY2UgaXMgYmFzZWQgb24gYSBocnRpbWVyIGZvciBicm9hZGNhc3QKICAqLwotI2RlZmluZSBDTE9DS19FVlRfRkVBVF9IUlRJTUVSCQkweDAwMDA4MAorIyBkZWZpbmUgQ0xPQ0tfRVZUX0ZFQVRfSFJUSU1FUgkJMHgwMDAwODAKIAogLyoqCiAgKiBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIC0gY2xvY2sgZXZlbnQgZGV2aWNlIGRlc2NyaXB0b3IKQEAgLTc4LDEwICs4MywxNSBAQAogICogQG1pbl9kZWx0YV9uczoJbWluaW11bSBkZWx0YSB2YWx1ZSBpbiBucwogICogQG11bHQ6CQluYW5vc2Vjb25kIHRvIGN5Y2xlcyBtdWx0aXBsaWVyCiAgKiBAc2hpZnQ6CQluYW5vc2Vjb25kcyB0byBjeWNsZXMgZGl2aXNvciAocG93ZXIgb2YgdHdvKQotICogQG1vZGU6CQlvcGVyYXRpbmcgbW9kZSBhc3NpZ25lZCBieSB0aGUgbWFuYWdlbWVudCBjb2RlCisgKiBAbW9kZToJCW9wZXJhdGluZyBtb2RlLCByZWxldmFudCBvbmx5IHRvIC0+c2V0X21vZGUoKSwgT0JTT0xFVEUKKyAqIEBzdGF0ZToJCWN1cnJlbnQgc3RhdGUgb2YgdGhlIGRldmljZSwgYXNzaWduZWQgYnkgdGhlIGNvcmUgY29kZQogICogQGZlYXR1cmVzOgkJZmVhdHVyZXMKICAqIEByZXRyaWVzOgkJbnVtYmVyIG9mIGZvcmNlZCBwcm9ncmFtbWluZyByZXRyaWVzCi0gKiBAc2V0X21vZGU6CQlzZXQgbW9kZSBmdW5jdGlvbgorICogQHNldF9tb2RlOgkJbGVnYWN5IHNldCBtb2RlIGZ1bmN0aW9uLCBvbmx5IGZvciBtb2RlcyA8PSBDTE9DS19FVlRfTU9ERV9SRVNVTUUuCisgKiBAc2V0X3N0YXRlX3BlcmlvZGljOglzd2l0Y2ggc3RhdGUgdG8gcGVyaW9kaWMsIGlmICFzZXRfbW9kZQorICogQHNldF9zdGF0ZV9vbmVzaG90Oglzd2l0Y2ggc3RhdGUgdG8gb25lc2hvdCwgaWYgIXNldF9tb2RlCisgKiBAc2V0X3N0YXRlX3NodXRkb3duOglzd2l0Y2ggc3RhdGUgdG8gc2h1dGRvd24sIGlmICFzZXRfbW9kZQorICogQHRpY2tfcmVzdW1lOglyZXN1bWUgY2xrZXZ0IGRldmljZSwgaWYgIXNldF9tb2RlCiAgKiBAYnJvYWRjYXN0OgkJZnVuY3Rpb24gdG8gYnJvYWRjYXN0IGV2ZW50cwogICogQG1pbl9kZWx0YV90aWNrczoJbWluaW11bSBkZWx0YSB2YWx1ZSBpbiB0aWNrcyBzdG9yZWQgZm9yIHJlY29uZmlndXJhdGlvbgogICogQG1heF9kZWx0YV90aWNrczoJbWF4aW11bSBkZWx0YSB2YWx1ZSBpbiB0aWNrcyBzdG9yZWQgZm9yIHJlY29uZmlndXJhdGlvbgpAQCAtOTUsMjIgKzEwNSwzMSBAQAogICovCiBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIHsKIAl2b2lkCQkJKCpldmVudF9oYW5kbGVyKShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOwotCWludAkJCSgqc2V0X25leHRfZXZlbnQpKHVuc2lnbmVkIGxvbmcgZXZ0LAotCQkJCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOwotCWludAkJCSgqc2V0X25leHRfa3RpbWUpKGt0aW1lX3QgZXhwaXJlcywKLQkJCQkJCSAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKKwlpbnQJCQkoKnNldF9uZXh0X2V2ZW50KSh1bnNpZ25lZCBsb25nIGV2dCwgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKKwlpbnQJCQkoKnNldF9uZXh0X2t0aW1lKShrdGltZV90IGV4cGlyZXMsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKik7CiAJa3RpbWVfdAkJCW5leHRfZXZlbnQ7CiAJdTY0CQkJbWF4X2RlbHRhX25zOwogCXU2NAkJCW1pbl9kZWx0YV9uczsKIAl1MzIJCQltdWx0OwogCXUzMgkJCXNoaWZ0OwogCWVudW0gY2xvY2tfZXZlbnRfbW9kZQltb2RlOworCWVudW0gY2xvY2tfZXZlbnRfc3RhdGUJc3RhdGU7CiAJdW5zaWduZWQgaW50CQlmZWF0dXJlczsKIAl1bnNpZ25lZCBsb25nCQlyZXRyaWVzOwogCisJLyoKKwkgKiBTdGF0ZSB0cmFuc2l0aW9uIGNhbGxiYWNrKHMpOiBPbmx5IG9uZSBvZiB0aGUgdHdvIGdyb3VwcyBzaG91bGQgYmUKKwkgKiBkZWZpbmVkOgorCSAqIC0gc2V0X21vZGUoKSwgb25seSBmb3IgbW9kZXMgPD0gQ0xPQ0tfRVZUX01PREVfUkVTVU1FLgorCSAqIC0gc2V0X3N0YXRlX3tzaHV0ZG93bnxwZXJpb2RpY3xvbmVzaG90fSgpLCB0aWNrX3Jlc3VtZSgpLgorCSAqLworCXZvaWQJCQkoKnNldF9tb2RlKShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKKwlpbnQJCQkoKnNldF9zdGF0ZV9wZXJpb2RpYykoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKKwlpbnQJCQkoKnNldF9zdGF0ZV9vbmVzaG90KShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOworCWludAkJCSgqc2V0X3N0YXRlX3NodXRkb3duKShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOworCWludAkJCSgqdGlja19yZXN1bWUpKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKik7CisKIAl2b2lkCQkJKCpicm9hZGNhc3QpKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKTsKLQl2b2lkCQkJKCpzZXRfbW9kZSkoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCi0JCQkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOwogCXZvaWQJCQkoKnN1c3BlbmQpKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKik7CiAJdm9pZAkJCSgqcmVzdW1lKShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOwogCXVuc2lnbmVkIGxvbmcJCW1pbl9kZWx0YV90aWNrczsKQEAgLTEzNiwxOCArMTU1LDE4IEBACiAgKgogICogZmFjdG9yID0gKGNsb2NrX3RpY2tzIDw8IHNoaWZ0KSAvIG5hbm9zZWNvbmRzCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkaXZfc2ModW5zaWduZWQgbG9uZyB0aWNrcywgdW5zaWduZWQgbG9uZyBuc2VjLAotCQkJCSAgIGludCBzaGlmdCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworZGl2X3NjKHVuc2lnbmVkIGxvbmcgdGlja3MsIHVuc2lnbmVkIGxvbmcgbnNlYywgaW50IHNoaWZ0KQogewotCXVpbnQ2NF90IHRtcCA9ICgodWludDY0X3QpdGlja3MpIDw8IHNoaWZ0OworCXU2NCB0bXAgPSAoKHU2NCl0aWNrcykgPDwgc2hpZnQ7CiAKIAlkb19kaXYodG1wLCBuc2VjKTsKKwogCXJldHVybiAodW5zaWduZWQgbG9uZykgdG1wOwogfQogCiAvKiBDbG9jayBldmVudCBsYXllciBmdW5jdGlvbnMgKi8KLWV4dGVybiB1NjQgY2xvY2tldmVudF9kZWx0YTJucyh1bnNpZ25lZCBsb25nIGxhdGNoLAotCQkJICAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCk7CitleHRlcm4gdTY0IGNsb2NrZXZlbnRfZGVsdGEybnModW5zaWduZWQgbG9uZyBsYXRjaCwgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KTsKIGV4dGVybiB2b2lkIGNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBjbG9ja2V2ZW50c191bmJpbmRfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNlZCwgaW50IGNwdSk7CiAKQEAgLTE1OCw1NyArMTc3LDQyIEBACiAKIGV4dGVybiBpbnQgY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2UsIHUzMiBmcmVxKTsKIAotZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm9sZCwKLQkJCQkJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3KTsKLWV4dGVybiB2b2lkIGNsb2NrZXZlbnRzX3NldF9tb2RlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKLQkJCQkgZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUpOwotZXh0ZXJuIGludCBjbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKLQkJCQkgICAgIGt0aW1lX3QgZXhwaXJlcywgYm9vbCBmb3JjZSk7Ci0KLWV4dGVybiB2b2lkIGNsb2NrZXZlbnRzX2hhbmRsZV9ub29wKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZAogY2xvY2tldmVudHNfY2FsY19tdWx0X3NoaWZ0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmNlLCB1MzIgZnJlcSwgdTMyIG1pbnNlYykKIHsKLQlyZXR1cm4gY2xvY2tzX2NhbGNfbXVsdF9zaGlmdCgmY2UtPm11bHQsICZjZS0+c2hpZnQsIE5TRUNfUEVSX1NFQywKLQkJCQkgICAgICBmcmVxLCBtaW5zZWMpOworCXJldHVybiBjbG9ja3NfY2FsY19tdWx0X3NoaWZ0KCZjZS0+bXVsdCwgJmNlLT5zaGlmdCwgTlNFQ19QRVJfU0VDLCBmcmVxLCBtaW5zZWMpOwogfQogCiBleHRlcm4gdm9pZCBjbG9ja2V2ZW50c19zdXNwZW5kKHZvaWQpOwogZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfcmVzdW1lKHZvaWQpOwogCi0jaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCi0jaWZkZWYgQ09ORklHX0FSQ0hfSEFTX1RJQ0tfQlJPQURDQVNUCisjIGlmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAorIyAgaWZkZWYgQ09ORklHX0FSQ0hfSEFTX1RJQ0tfQlJPQURDQVNUCiBleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdChjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7Ci0jZWxzZQotI2RlZmluZSB0aWNrX2Jyb2FkY2FzdAlOVUxMCi0jZW5kaWYKKyMgIGVsc2UKKyMgICBkZWZpbmUgdGlja19icm9hZGNhc3QJTlVMTAorIyAgZW5kaWYKIGV4dGVybiBpbnQgdGlja19yZWNlaXZlX2Jyb2FkY2FzdCh2b2lkKTsKLSNlbmRpZgorIyBlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpICYmIGRlZmluZWQoQ09ORklHX1RJQ0tfT05FU0hPVCkKKyMgaWYgZGVmaW5lZChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpICYmIGRlZmluZWQoQ09ORklHX1RJQ0tfT05FU0hPVCkKIGV4dGVybiB2b2lkIHRpY2tfc2V0dXBfaHJ0aW1lcl9icm9hZGNhc3Qodm9pZCk7CiBleHRlcm4gaW50IHRpY2tfY2hlY2tfYnJvYWRjYXN0X2V4cGlyZWQodm9pZCk7Ci0jZWxzZQorIyBlbHNlCiBzdGF0aWMgaW5saW5lIGludCB0aWNrX2NoZWNrX2Jyb2FkY2FzdF9leHBpcmVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3NldHVwX2hydGltZXJfYnJvYWRjYXN0KHZvaWQpIHt9OwotI2VuZGlmCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19zZXR1cF9ocnRpbWVyX2Jyb2FkY2FzdCh2b2lkKSB7IH0KKyMgZW5kaWYKIAotI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTCiBleHRlcm4gaW50IGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBjbG9ja2V2ZW50c19ub3RpZnkodW5zaWduZWQgbG9uZyByZWFzb24sIHZvaWQgKmFyZykgeyByZXR1cm4gMDsgfQotI2VuZGlmCiAKLSNlbHNlIC8qIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEICovCisjZWxzZSAvKiAhQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFM6ICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjbG9ja2V2ZW50c19zdXNwZW5kKHZvaWQpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgY2xvY2tldmVudHNfcmVzdW1lKHZvaWQpIHt9Ci0KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9ja2V2ZW50c19zdXNwZW5kKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGNsb2NrZXZlbnRzX3Jlc3VtZSh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIGludCB0aWNrX2NoZWNrX2Jyb2FkY2FzdF9leHBpcmVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3NldHVwX2hydGltZXJfYnJvYWRjYXN0KHZvaWQpIHt9Oworc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2V0dXBfaHJ0aW1lcl9icm9hZGNhc3Qodm9pZCkgeyB9CiAKLSNlbmRpZgorI2VuZGlmIC8qICFDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUyAqLwogCi0jZW5kaWYKKyNlbmRpZiAvKiBfTElOVVhfQ0xPQ0tDSElQU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmggYi9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKaW5kZXggOWM3OGQxNS4uMTM1NTA5OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaApAQCAtNTYsNiArNTYsNyBAQAogICogQHNoaWZ0OgkJY3ljbGUgdG8gbmFub3NlY29uZCBkaXZpc29yIChwb3dlciBvZiB0d28pCiAgKiBAbWF4X2lkbGVfbnM6CW1heCBpZGxlIHRpbWUgcGVybWl0dGVkIGJ5IHRoZSBjbG9ja3NvdXJjZSAobnNlY3MpCiAgKiBAbWF4YWRqOgkJbWF4aW11bSBhZGp1c3RtZW50IHZhbHVlIHRvIG11bHQgKH4xMSUpCisgKiBAbWF4X2N5Y2xlczoJCW1heGltdW0gc2FmZSBjeWNsZSB2YWx1ZSB3aGljaCB3b24ndCBvdmVyZmxvdyBvbiBtdWx0aXBsaWNhdGlvbgogICogQGZsYWdzOgkJZmxhZ3MgZGVzY3JpYmluZyBzcGVjaWFsIHByb3BlcnRpZXMKICAqIEBhcmNoZGF0YToJCWFyY2gtc3BlY2lmaWMgZGF0YQogICogQHN1c3BlbmQ6CQlzdXNwZW5kIGZ1bmN0aW9uIGZvciB0aGUgY2xvY2tzb3VyY2UsIGlmIG5lY2Vzc2FyeQpAQCAtNzYsNyArNzcsNyBAQAogI2lmZGVmIENPTkZJR19BUkNIX0NMT0NLU09VUkNFX0RBVEEKIAlzdHJ1Y3QgYXJjaF9jbG9ja3NvdXJjZV9kYXRhIGFyY2hkYXRhOwogI2VuZGlmCi0KKwl1NjQgbWF4X2N5Y2xlczsKIAljb25zdCBjaGFyICpuYW1lOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlpbnQgcmF0aW5nOwpAQCAtMTc4LDcgKzE3OSw2IEBACiB9CiAKIAotZXh0ZXJuIGludCBjbG9ja3NvdXJjZV9yZWdpc3RlcihzdHJ1Y3QgY2xvY2tzb3VyY2UqKTsKIGV4dGVybiBpbnQgY2xvY2tzb3VyY2VfdW5yZWdpc3RlcihzdHJ1Y3QgY2xvY2tzb3VyY2UqKTsKIGV4dGVybiB2b2lkIGNsb2Nrc291cmNlX3RvdWNoX3dhdGNoZG9nKHZvaWQpOwogZXh0ZXJuIHN0cnVjdCBjbG9ja3NvdXJjZSogY2xvY2tzb3VyY2VfZ2V0X25leHQodm9pZCk7CkBAIC0xODksNyArMTg5LDcgQEAKIGV4dGVybiB2b2lkIGNsb2Nrc291cmNlX21hcmtfdW5zdGFibGUoc3RydWN0IGNsb2Nrc291cmNlICpjcyk7CiAKIGV4dGVybiB1NjQKLWNsb2Nrc19jYWxjX21heF9uc2Vjcyh1MzIgbXVsdCwgdTMyIHNoaWZ0LCB1MzIgbWF4YWRqLCB1NjQgbWFzayk7CitjbG9ja3NfY2FsY19tYXhfbnNlY3ModTMyIG11bHQsIHUzMiBzaGlmdCwgdTMyIG1heGFkaiwgdTY0IG1hc2ssIHU2NCAqbWF4X2N5Y2xlcyk7CiBleHRlcm4gdm9pZAogY2xvY2tzX2NhbGNfbXVsdF9zaGlmdCh1MzIgKm11bHQsIHUzMiAqc2hpZnQsIHUzMiBmcm9tLCB1MzIgdG8sIHUzMiBtaW5zZWMpOwogCkBAIC0yMDAsNyArMjAwLDE2IEBACiBleHRlcm4gaW50CiBfX2Nsb2Nrc291cmNlX3JlZ2lzdGVyX3NjYWxlKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MsIHUzMiBzY2FsZSwgdTMyIGZyZXEpOwogZXh0ZXJuIHZvaWQKLV9fY2xvY2tzb3VyY2VfdXBkYXRlZnJlcV9zY2FsZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCB1MzIgc2NhbGUsIHUzMiBmcmVxKTsKK19fY2xvY2tzb3VyY2VfdXBkYXRlX2ZyZXFfc2NhbGUoc3RydWN0IGNsb2Nrc291cmNlICpjcywgdTMyIHNjYWxlLCB1MzIgZnJlcSk7CisKKy8qCisgKiBEb24ndCBjYWxsIHRoaXMgdW5sZXNzIHlvdSBhcmUgYSBkZWZhdWx0IGNsb2Nrc291cmNlCisgKiAoQUtBOiBqaWZmaWVzKSBhbmQgYWJzb2x1dGVseSBoYXZlIHRvLgorICovCitzdGF0aWMgaW5saW5lIGludCBfX2Nsb2Nrc291cmNlX3JlZ2lzdGVyKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJcmV0dXJuIF9fY2xvY2tzb3VyY2VfcmVnaXN0ZXJfc2NhbGUoY3MsIDEsIDApOworfQogCiBzdGF0aWMgaW5saW5lIGludCBjbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeihzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCB1MzIgaHopCiB7CkBAIC0yMTIsMTQgKzIyMSwxNCBAQAogCXJldHVybiBfX2Nsb2Nrc291cmNlX3JlZ2lzdGVyX3NjYWxlKGNzLCAxMDAwLCBraHopOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgX19jbG9ja3NvdXJjZV91cGRhdGVmcmVxX2h6KHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MsIHUzMiBoeikKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2Nsb2Nrc291cmNlX3VwZGF0ZV9mcmVxX2h6KHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MsIHUzMiBoeikKIHsKLQlfX2Nsb2Nrc291cmNlX3VwZGF0ZWZyZXFfc2NhbGUoY3MsIDEsIGh6KTsKKwlfX2Nsb2Nrc291cmNlX3VwZGF0ZV9mcmVxX3NjYWxlKGNzLCAxLCBoeik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2Nsb2Nrc291cmNlX3VwZGF0ZWZyZXFfa2h6KHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MsIHUzMiBraHopCitzdGF0aWMgaW5saW5lIHZvaWQgX19jbG9ja3NvdXJjZV91cGRhdGVfZnJlcV9raHooc3RydWN0IGNsb2Nrc291cmNlICpjcywgdTMyIGtoeikKIHsKLQlfX2Nsb2Nrc291cmNlX3VwZGF0ZWZyZXFfc2NhbGUoY3MsIDEwMDAsIGtoeik7CisJX19jbG9ja3NvdXJjZV91cGRhdGVfZnJlcV9zY2FsZShjcywgMTAwMCwga2h6KTsKIH0KIAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NtYS5oIGIvaW5jbHVkZS9saW51eC9jbWEuaAppbmRleCA5Mzg0YmE2Li5mN2VmMDkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NtYS5oCisrKyBiL2luY2x1ZGUvbGludXgvY21hLmgKQEAgLTE2LDE2ICsxNiwxNiBAQAogc3RydWN0IGNtYTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdG90YWxjbWFfcGFnZXM7Ci1leHRlcm4gcGh5c19hZGRyX3QgY21hX2dldF9iYXNlKHN0cnVjdCBjbWEgKmNtYSk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBjbWFfZ2V0X3NpemUoc3RydWN0IGNtYSAqY21hKTsKK2V4dGVybiBwaHlzX2FkZHJfdCBjbWFfZ2V0X2Jhc2UoY29uc3Qgc3RydWN0IGNtYSAqY21hKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNtYV9nZXRfc2l6ZShjb25zdCBzdHJ1Y3QgY21hICpjbWEpOwogCiBleHRlcm4gaW50IF9faW5pdCBjbWFfZGVjbGFyZV9jb250aWd1b3VzKHBoeXNfYWRkcl90IGJhc2UsCiAJCQlwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBsaW1pdCwKIAkJCXBoeXNfYWRkcl90IGFsaWdubWVudCwgdW5zaWduZWQgaW50IG9yZGVyX3Blcl9iaXQsCiAJCQlib29sIGZpeGVkLCBzdHJ1Y3QgY21hICoqcmVzX2NtYSk7Ci1leHRlcm4gaW50IGNtYV9pbml0X3Jlc2VydmVkX21lbShwaHlzX2FkZHJfdCBiYXNlLAotCQkJCQlwaHlzX2FkZHJfdCBzaXplLCBpbnQgb3JkZXJfcGVyX2JpdCwKK2V4dGVybiBpbnQgY21hX2luaXRfcmVzZXJ2ZWRfbWVtKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUsCisJCQkJCXVuc2lnbmVkIGludCBvcmRlcl9wZXJfYml0LAogCQkJCQlzdHJ1Y3QgY21hICoqcmVzX2NtYSk7Ci1leHRlcm4gc3RydWN0IHBhZ2UgKmNtYV9hbGxvYyhzdHJ1Y3QgY21hICpjbWEsIGludCBjb3VudCwgdW5zaWduZWQgaW50IGFsaWduKTsKLWV4dGVybiBib29sIGNtYV9yZWxlYXNlKHN0cnVjdCBjbWEgKmNtYSwgc3RydWN0IHBhZ2UgKnBhZ2VzLCBpbnQgY291bnQpOworZXh0ZXJuIHN0cnVjdCBwYWdlICpjbWFfYWxsb2Moc3RydWN0IGNtYSAqY21hLCB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBhbGlnbik7CitleHRlcm4gYm9vbCBjbWFfcmVsZWFzZShzdHJ1Y3QgY21hICpjbWEsIGNvbnN0IHN0cnVjdCBwYWdlICpwYWdlcywgdW5zaWduZWQgaW50IGNvdW50KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21wYWN0aW9uLmggYi9pbmNsdWRlL2xpbnV4L2NvbXBhY3Rpb24uaAppbmRleCBhMDE0NTU5Li5hYThmNjFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbXBhY3Rpb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBhY3Rpb24uaApAQCAtMzQsNiArMzQsNyBAQAogZXh0ZXJuIGludCBzeXNjdGxfZXh0ZnJhZ190aHJlc2hvbGQ7CiBleHRlcm4gaW50IHN5c2N0bF9leHRmcmFnX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVuZ3RoLCBsb2ZmX3QgKnBwb3MpOworZXh0ZXJuIGludCBzeXNjdGxfY29tcGFjdF91bmV2aWN0YWJsZV9hbGxvd2VkOwogCiBleHRlcm4gaW50IGZyYWdtZW50YXRpb25faW5kZXgoc3RydWN0IHpvbmUgKnpvbmUsIHVuc2lnbmVkIGludCBvcmRlcik7CiBleHRlcm4gdW5zaWduZWQgbG9uZyB0cnlfdG9fY29tcGFjdF9wYWdlcyhnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgaW50IG9yZGVyLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb21waWxlci5oIGIvaW5jbHVkZS9saW51eC9jb21waWxlci5oCmluZGV4IDFiNDVlNGEuLjBlNDFjYTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGlsZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbXBpbGVyLmgKQEAgLTE5MiwyOSArMTkyLDE2IEBACiAKICNpbmNsdWRlIDx1YXBpL2xpbnV4L3R5cGVzLmg+CiAKLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBkYXRhX2FjY2Vzc19leGNlZWRzX3dvcmRfc2l6ZSh2b2lkKQotI2lmZGVmIF9fY29tcGlsZXRpbWVfd2FybmluZwotX19jb21waWxldGltZV93YXJuaW5nKCJkYXRhIGFjY2VzcyBleGNlZWRzIHdvcmQgc2l6ZSBhbmQgd29uJ3QgYmUgYXRvbWljIikKLSNlbmRpZgotOwotCi1zdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgZGF0YV9hY2Nlc3NfZXhjZWVkc193b3JkX3NpemUodm9pZCkKLXsKLX0KLQogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIF9fcmVhZF9vbmNlX3NpemUoY29uc3Qgdm9sYXRpbGUgdm9pZCAqcCwgdm9pZCAqcmVzLCBpbnQgc2l6ZSkKIHsKIAlzd2l0Y2ggKHNpemUpIHsKIAljYXNlIDE6ICooX191OCAqKXJlcyA9ICoodm9sYXRpbGUgX191OCAqKXA7IGJyZWFrOwogCWNhc2UgMjogKihfX3UxNiAqKXJlcyA9ICoodm9sYXRpbGUgX191MTYgKilwOyBicmVhazsKIAljYXNlIDQ6ICooX191MzIgKilyZXMgPSAqKHZvbGF0aWxlIF9fdTMyICopcDsgYnJlYWs7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJY2FzZSA4OiAqKF9fdTY0ICopcmVzID0gKih2b2xhdGlsZSBfX3U2NCAqKXA7IGJyZWFrOwotI2VuZGlmCiAJZGVmYXVsdDoKIAkJYmFycmllcigpOwogCQlfX2J1aWx0aW5fbWVtY3B5KCh2b2lkICopcmVzLCAoY29uc3Qgdm9pZCAqKXAsIHNpemUpOwotCQlkYXRhX2FjY2Vzc19leGNlZWRzX3dvcmRfc2l6ZSgpOwogCQliYXJyaWVyKCk7CiAJfQogfQpAQCAtMjI1LDEzICsyMTIsMTAgQEAKIAljYXNlIDE6ICoodm9sYXRpbGUgX191OCAqKXAgPSAqKF9fdTggKilyZXM7IGJyZWFrOwogCWNhc2UgMjogKih2b2xhdGlsZSBfX3UxNiAqKXAgPSAqKF9fdTE2ICopcmVzOyBicmVhazsKIAljYXNlIDQ6ICoodm9sYXRpbGUgX191MzIgKilwID0gKihfX3UzMiAqKXJlczsgYnJlYWs7Ci0jaWZkZWYgQ09ORklHXzY0QklUCiAJY2FzZSA4OiAqKHZvbGF0aWxlIF9fdTY0ICopcCA9ICooX191NjQgKilyZXM7IGJyZWFrOwotI2VuZGlmCiAJZGVmYXVsdDoKIAkJYmFycmllcigpOwogCQlfX2J1aWx0aW5fbWVtY3B5KCh2b2lkICopcCwgKGNvbnN0IHZvaWQgKilyZXMsIHNpemUpOwotCQlkYXRhX2FjY2Vzc19leGNlZWRzX3dvcmRfc2l6ZSgpOwogCQliYXJyaWVyKCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jb250ZXh0X3RyYWNraW5nLmggYi9pbmNsdWRlL2xpbnV4L2NvbnRleHRfdHJhY2tpbmcuaAppbmRleCAzN2I4MWJkLi4yODIxODM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NvbnRleHRfdHJhY2tpbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NvbnRleHRfdHJhY2tpbmcuaApAQCAtMTAsNiArMTAsOCBAQAogI2lmZGVmIENPTkZJR19DT05URVhUX1RSQUNLSU5HCiBleHRlcm4gdm9pZCBjb250ZXh0X3RyYWNraW5nX2NwdV9zZXQoaW50IGNwdSk7CiAKK2V4dGVybiB2b2lkIGNvbnRleHRfdHJhY2tpbmdfZW50ZXIoZW51bSBjdHhfc3RhdGUgc3RhdGUpOworZXh0ZXJuIHZvaWQgY29udGV4dF90cmFja2luZ19leGl0KGVudW0gY3R4X3N0YXRlIHN0YXRlKTsKIGV4dGVybiB2b2lkIGNvbnRleHRfdHJhY2tpbmdfdXNlcl9lbnRlcih2b2lkKTsKIGV4dGVybiB2b2lkIGNvbnRleHRfdHJhY2tpbmdfdXNlcl9leGl0KHZvaWQpOwogZXh0ZXJuIHZvaWQgX19jb250ZXh0X3RyYWNraW5nX3Rhc2tfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKQEAgLTM1LDcgKzM3LDggQEAKIAkJcmV0dXJuIDA7CiAKIAlwcmV2X2N0eCA9IHRoaXNfY3B1X3JlYWQoY29udGV4dF90cmFja2luZy5zdGF0ZSk7Ci0JY29udGV4dF90cmFja2luZ191c2VyX2V4aXQoKTsKKwlpZiAocHJldl9jdHggIT0gQ09OVEVYVF9LRVJORUwpCisJCWNvbnRleHRfdHJhY2tpbmdfZXhpdChwcmV2X2N0eCk7CiAKIAlyZXR1cm4gcHJldl9jdHg7CiB9CkBAIC00Myw4ICs0Niw4IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZXhjZXB0aW9uX2V4aXQoZW51bSBjdHhfc3RhdGUgcHJldl9jdHgpCiB7CiAJaWYgKGNvbnRleHRfdHJhY2tpbmdfaXNfZW5hYmxlZCgpKSB7Ci0JCWlmIChwcmV2X2N0eCA9PSBJTl9VU0VSKQotCQkJY29udGV4dF90cmFja2luZ191c2VyX2VudGVyKCk7CisJCWlmIChwcmV2X2N0eCAhPSBDT05URVhUX0tFUk5FTCkKKwkJCWNvbnRleHRfdHJhY2tpbmdfZW50ZXIocHJldl9jdHgpOwogCX0KIH0KIApAQCAtNzgsMTAgKzgxLDE2IEBACiAJCXZ0aW1lX2d1ZXN0X2VudGVyKGN1cnJlbnQpOwogCWVsc2UKIAkJY3VycmVudC0+ZmxhZ3MgfD0gUEZfVkNQVTsKKworCWlmIChjb250ZXh0X3RyYWNraW5nX2lzX2VuYWJsZWQoKSkKKwkJY29udGV4dF90cmFja2luZ19lbnRlcihDT05URVhUX0dVRVNUKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGd1ZXN0X2V4aXQodm9pZCkKIHsKKwlpZiAoY29udGV4dF90cmFja2luZ19pc19lbmFibGVkKCkpCisJCWNvbnRleHRfdHJhY2tpbmdfZXhpdChDT05URVhUX0dVRVNUKTsKKwogCWlmICh2dGltZV9hY2NvdW50aW5nX2VuYWJsZWQoKSkKIAkJdnRpbWVfZ3Vlc3RfZXhpdChjdXJyZW50KTsKIAllbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NvbnRleHRfdHJhY2tpbmdfc3RhdGUuaCBiL2luY2x1ZGUvbGludXgvY29udGV4dF90cmFja2luZ19zdGF0ZS5oCmluZGV4IDk3YTgxMjIuLjZiN2I5NmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29udGV4dF90cmFja2luZ19zdGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvY29udGV4dF90cmFja2luZ19zdGF0ZS5oCkBAIC0xMyw4ICsxMyw5IEBACiAJICovCiAJYm9vbCBhY3RpdmU7CiAJZW51bSBjdHhfc3RhdGUgewotCQlJTl9LRVJORUwgPSAwLAotCQlJTl9VU0VSLAorCQlDT05URVhUX0tFUk5FTCA9IDAsCisJCUNPTlRFWFRfVVNFUiwKKwkJQ09OVEVYVF9HVUVTVCwKIAl9IHN0YXRlOwogfTsKIApAQCAtMzQsMTEgKzM1LDEzIEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBjb250ZXh0X3RyYWNraW5nX2luX3VzZXIodm9pZCkKIHsKLQlyZXR1cm4gX190aGlzX2NwdV9yZWFkKGNvbnRleHRfdHJhY2tpbmcuc3RhdGUpID09IElOX1VTRVI7CisJcmV0dXJuIF9fdGhpc19jcHVfcmVhZChjb250ZXh0X3RyYWNraW5nLnN0YXRlKSA9PSBDT05URVhUX1VTRVI7CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSBib29sIGNvbnRleHRfdHJhY2tpbmdfaW5fdXNlcih2b2lkKSB7IHJldHVybiBmYWxzZTsgfQogc3RhdGljIGlubGluZSBib29sIGNvbnRleHRfdHJhY2tpbmdfYWN0aXZlKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgY29udGV4dF90cmFja2luZ19pc19lbmFibGVkKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgY29udGV4dF90cmFja2luZ19jcHVfaXNfZW5hYmxlZCh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQogI2VuZGlmIC8qIENPTkZJR19DT05URVhUX1RSQUNLSU5HICovCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHUuaCBiL2luY2x1ZGUvbGludXgvY3B1LmgKaW5kZXggNDI2MGU4NS4uYzBmYjZiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdS5oCkBAIC03Myw2ICs3Myw3IEBACiAJLyogbWlncmF0aW9uIHNob3VsZCBoYXBwZW4gYmVmb3JlIG90aGVyIHN0dWZmIGJ1dCBhZnRlciBwZXJmICovCiAJQ1BVX1BSSV9QRVJGCQk9IDIwLAogCUNQVV9QUklfTUlHUkFUSU9OCT0gMTAsCisJQ1BVX1BSSV9TTVBCT09UCQk9IDksCiAJLyogYnJpbmcgdXAgd29ya3F1ZXVlcyBiZWZvcmUgbm9ybWFsIG5vdGlmaWVycyBhbmQgZG93biBhZnRlciAqLwogCUNQVV9QUklfV09SS1FVRVVFX1VQCT0gNSwKIAlDUFVfUFJJX1dPUktRVUVVRV9ET1dOCT0gLTUsCkBAIC05NSw2ICs5NiwxMCBAQAogCQkJCQkqIENhbGxlZCBvbiB0aGUgbmV3IGNwdSwganVzdCBiZWZvcmUKIAkJCQkJKiBlbmFibGluZyBpbnRlcnJ1cHRzLiBNdXN0IG5vdCBzbGVlcCwKIAkJCQkJKiBtdXN0IG5vdCBmYWlsICovCisjZGVmaW5lIENQVV9EWUlOR19JRExFCQkweDAwMEIgLyogQ1BVICh1bnNpZ25lZCl2IGR5aW5nLCByZWFjaGVkCisJCQkJCSogaWRsZSBsb29wLiAqLworI2RlZmluZSBDUFVfQlJPS0VOCQkweDAwMEMgLyogQ1BVICh1bnNpZ25lZCl2IGRpZCBub3QgZGllIHByb3Blcmx5LAorCQkJCQkqIHBlcmhhcHMgZHVlIHRvIHByZWVtcHRpb24uICovCiAKIC8qIFVzZWQgZm9yIENQVSBob3RwbHVnIGV2ZW50cyBvY2N1cnJpbmcgd2hpbGUgdGFza3MgYXJlIGZyb3plbiBkdWUgdG8gYSBzdXNwZW5kCiAgKiBvcGVyYXRpb24gaW4gcHJvZ3Jlc3MKQEAgLTE2MSw2ICsxNjYsNyBAQAogfQogI2VuZGlmCiAKK3ZvaWQgc21wYm9vdF90aHJlYWRfaW5pdCh2b2lkKTsKIGludCBjcHVfdXAodW5zaWduZWQgaW50IGNwdSk7CiB2b2lkIG5vdGlmeV9jcHVfc3RhcnRpbmcodW5zaWduZWQgaW50IGNwdSk7CiBleHRlcm4gdm9pZCBjcHVfbWFwc191cGRhdGVfYmVnaW4odm9pZCk7CkBAIC0yMDgsNiArMjE0LDEwIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbXBib290X3RocmVhZF9pbml0KHZvaWQpCit7Cit9CisKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiBleHRlcm4gc3RydWN0IGJ1c190eXBlIGNwdV9zdWJzeXM7CiAKQEAgLTI3MSw0ICsyODEsMTQgQEAKIHZvaWQgYXJjaF9jcHVfaWRsZV9leGl0KHZvaWQpOwogdm9pZCBhcmNoX2NwdV9pZGxlX2RlYWQodm9pZCk7CiAKK0RFQ0xBUkVfUEVSX0NQVShib29sLCBjcHVfZGVhZF9pZGxlKTsKKworaW50IGNwdV9yZXBvcnRfc3RhdGUoaW50IGNwdSk7CitpbnQgY3B1X2NoZWNrX3VwX3ByZXBhcmUoaW50IGNwdSk7Cit2b2lkIGNwdV9zZXRfc3RhdGVfb25saW5lKGludCBjcHUpOworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorYm9vbCBjcHVfd2FpdF9kZWF0aCh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgc2Vjb25kcyk7Citib29sIGNwdV9yZXBvcnRfZGVhdGgodm9pZCk7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLworCiAjZW5kaWYgLyogX0xJTlVYX0NQVV9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHVpZGxlLmggYi9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaAppbmRleCAzMDYxNzhkLi45YzVlODkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdWlkbGUuaApAQCAtNzcsNyArNzcsNiBAQAogCXVuc2lnbmVkIGludAkJY3B1OwogCiAJaW50CQkJbGFzdF9yZXNpZGVuY3k7Ci0JaW50CQkJc3RhdGVfY291bnQ7CiAJc3RydWN0IGNwdWlkbGVfc3RhdGVfdXNhZ2UJc3RhdGVzX3VzYWdlW0NQVUlETEVfU1RBVEVfTUFYXTsKIAlzdHJ1Y3QgY3B1aWRsZV9zdGF0ZV9rb2JqICprb2Jqc1tDUFVJRExFX1NUQVRFX01BWF07CiAJc3RydWN0IGNwdWlkbGVfZHJpdmVyX2tvYmogKmtvYmpfZHJpdmVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcmVkLmggYi9pbmNsdWRlL2xpbnV4L2NyZWQuaAppbmRleCAyZmIyY2EyLi44YjZjMDgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NyZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NyZWQuaApAQCAtNjIsOSArNjIsMjcgQEAKIAkJZ3JvdXBzX2ZyZWUoZ3JvdXBfaW5mbyk7CQlcCiB9IHdoaWxlICgwKQogCi1leHRlcm4gc3RydWN0IGdyb3VwX2luZm8gKmdyb3Vwc19hbGxvYyhpbnQpOwogZXh0ZXJuIHN0cnVjdCBncm91cF9pbmZvIGluaXRfZ3JvdXBzOworI2lmZGVmIENPTkZJR19NVUxUSVVTRVIKK2V4dGVybiBzdHJ1Y3QgZ3JvdXBfaW5mbyAqZ3JvdXBzX2FsbG9jKGludCk7CiBleHRlcm4gdm9pZCBncm91cHNfZnJlZShzdHJ1Y3QgZ3JvdXBfaW5mbyAqKTsKKworZXh0ZXJuIGludCBpbl9ncm91cF9wKGtnaWRfdCk7CitleHRlcm4gaW50IGluX2Vncm91cF9wKGtnaWRfdCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGdyb3Vwc19mcmVlKHN0cnVjdCBncm91cF9pbmZvICpncm91cF9pbmZvKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBpbl9ncm91cF9wKGtnaWRfdCBncnApCit7CisgICAgICAgIHJldHVybiAxOworfQorc3RhdGljIGlubGluZSBpbnQgaW5fZWdyb3VwX3Aoa2dpZF90IGdycCkKK3sKKyAgICAgICAgcmV0dXJuIDE7Cit9CisjZW5kaWYKIGV4dGVybiBpbnQgc2V0X2N1cnJlbnRfZ3JvdXBzKHN0cnVjdCBncm91cF9pbmZvICopOwogZXh0ZXJuIHZvaWQgc2V0X2dyb3VwcyhzdHJ1Y3QgY3JlZCAqLCBzdHJ1Y3QgZ3JvdXBfaW5mbyAqKTsKIGV4dGVybiBpbnQgZ3JvdXBzX3NlYXJjaChjb25zdCBzdHJ1Y3QgZ3JvdXBfaW5mbyAqLCBrZ2lkX3QpOwpAQCAtNzQsOSArOTIsNiBAQAogI2RlZmluZSBHUk9VUF9BVChnaSwgaSkgXAogCSgoZ2kpLT5ibG9ja3NbKGkpIC8gTkdST1VQU19QRVJfQkxPQ0tdWyhpKSAlIE5HUk9VUFNfUEVSX0JMT0NLXSkKIAotZXh0ZXJuIGludCBpbl9ncm91cF9wKGtnaWRfdCk7Ci1leHRlcm4gaW50IGluX2Vncm91cF9wKGtnaWRfdCk7Ci0KIC8qCiAgKiBUaGUgc2VjdXJpdHkgY29udGV4dCBvZiBhIHRhc2sKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2NyeXB0by5oIGIvaW5jbHVkZS9saW51eC9jcnlwdG8uaAppbmRleCBmYjVlZjE2Li4xMGRmNWQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2NyeXB0by5oCisrKyBiL2luY2x1ZGUvbGludXgvY3J5cHRvLmgKQEAgLTk1LDYgKzk1LDEyIEBACiAjZGVmaW5lIENSWVBUT19BTEdfS0VSTl9EUklWRVJfT05MWQkweDAwMDAxMDAwCiAKIC8qCisgKiBNYXJrIGEgY2lwaGVyIGFzIGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiBvbmx5IHVzYWJsZSBieSBhbm90aGVyCisgKiBjaXBoZXIgYW5kIG5ldmVyIGJ5IGEgbm9ybWFsIHVzZXIgb2YgdGhlIGtlcm5lbCBjcnlwdG8gQVBJCisgKi8KKyNkZWZpbmUgQ1JZUFRPX0FMR19JTlRFUk5BTAkJMHgwMDAwMjAwMAorCisvKgogICogVHJhbnNmb3JtIG1hc2tzIGFuZCB2YWx1ZXMgKGZvciBjcnRfZmxhZ3MpLgogICovCiAjZGVmaW5lIENSWVBUT19URk1fUkVRX01BU0sJCTB4MDAwZmZmMDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGNjcC5oIGIvaW5jbHVkZS9saW51eC9kY2NwLmgKaW5kZXggNDM5ZmY2OS4uMjIxMDI1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kY2NwLmgKKysrIGIvaW5jbHVkZS9saW51eC9kY2NwLmgKQEAgLTQzLDYgKzQzLDcgQEAKIAlEQ0NQX0NMT1NJTkcJICAgICA9IFRDUF9DTE9TSU5HLAogCURDQ1BfVElNRV9XQUlUCSAgICAgPSBUQ1BfVElNRV9XQUlULAogCURDQ1BfQ0xPU0VECSAgICAgPSBUQ1BfQ0xPU0UsCisJRENDUF9ORVdfU1lOX1JFQ1YgICAgPSBUQ1BfTkVXX1NZTl9SRUNWLAogCURDQ1BfUEFSVE9QRU4JICAgICA9IFRDUF9NQVhfU1RBVEVTLAogCURDQ1BfUEFTU0lWRV9DTE9TRVJFUSwJCQkvKiBjbGllbnRzIHJlY2VpdmluZyBDbG9zZVJlcSAqLwogCURDQ1BfTUFYX1NUQVRFUwpAQCAtNTcsNiArNTgsNyBAQAogCURDQ1BGX0NMT1NJTkcJICAgICAgPSBUQ1BGX0NMT1NJTkcsCiAJRENDUEZfVElNRV9XQUlUCSAgICAgID0gVENQRl9USU1FX1dBSVQsCiAJRENDUEZfQ0xPU0VECSAgICAgID0gVENQRl9DTE9TRSwKKwlEQ0NQRl9ORVdfU1lOX1JFQ1YgICAgPSBUQ1BGX05FV19TWU5fUkVDViwKIAlEQ0NQRl9QQVJUT1BFTgkgICAgICA9ICgxIDw8IERDQ1BfUEFSVE9QRU4pLAogfTsKIApAQCAtMzE3LDYgKzMxOSw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLWV4dGVybiB2b2lkIGRjY3Bfc3luX2Fja190aW1lb3V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKTsKK2V4dGVybiB2b2lkIGRjY3Bfc3luX2Fja190aW1lb3V0KGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7CiAKICNlbmRpZiAvKiBfTElOVVhfRENDUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmZyZXEtZXZlbnQuaCBiL2luY2x1ZGUvbGludXgvZGV2ZnJlcS1ldmVudC5oCmluZGV4IDYwMmZiYmYuLjBhODNhMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2ZnJlcS1ldmVudC5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2ZnJlcS1ldmVudC5oCkBAIC05MSw3ICs5MSw3IEBACiAJY29uc3QgY2hhciAqbmFtZTsKIAl2b2lkICpkcml2ZXJfZGF0YTsKIAotCXN0cnVjdCBkZXZmcmVxX2V2ZW50X29wcyAqb3BzOworCWNvbnN0IHN0cnVjdCBkZXZmcmVxX2V2ZW50X29wcyAqb3BzOwogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1BNX0RFVkZSRVFfRVZFTlQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCmluZGV4IDI2NDZhZWQuLmZkMjM5NzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCisrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLW1hcHBlci5oCkBAIC0zNzUsNiArMzc1LDcgQEAKICAqLwogc3RydWN0IG1hcHBlZF9kZXZpY2UgKmRtX2dldF9tZChkZXZfdCBkZXYpOwogdm9pZCBkbV9nZXQoc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kKTsKK2ludCBkbV9ob2xkKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7CiB2b2lkIGRtX3B1dChzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQpOwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKaW5kZXggMGViOGVlMi4uNjU1OGFmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS5oCkBAIC0zOCw2ICszOCw3IEBACiBzdHJ1Y3Qgc3Vic3lzX3ByaXZhdGU7CiBzdHJ1Y3QgYnVzX3R5cGU7CiBzdHJ1Y3QgZGV2aWNlX25vZGU7CitzdHJ1Y3QgZndub2RlX2hhbmRsZTsKIHN0cnVjdCBpb21tdV9vcHM7CiBzdHJ1Y3QgaW9tbXVfZ3JvdXA7CiAKQEAgLTY1MCwxNCArNjUxLDYgQEAKIAl1bnNpZ25lZCBsb25nIHNlZ21lbnRfYm91bmRhcnlfbWFzazsKIH07CiAKLXN0cnVjdCBhY3BpX2RldmljZTsKLQotc3RydWN0IGFjcGlfZGV2X25vZGUgewotI2lmZGVmIENPTkZJR19BQ1BJCi0Jc3RydWN0IGFjcGlfZGV2aWNlICpjb21wYW5pb247Ci0jZW5kaWYKLX07Ci0KIC8qKgogICogc3RydWN0IGRldmljZSAtIFRoZSBiYXNpYyBkZXZpY2Ugc3RydWN0dXJlCiAgKiBAcGFyZW50OglUaGUgZGV2aWNlJ3MgInBhcmVudCIgZGV2aWNlLCB0aGUgZGV2aWNlIHRvIHdoaWNoIGl0IGlzIGF0dGFjaGVkLgpAQCAtNzAzLDcgKzY5Niw3IEBACiAgKiBAY21hX2FyZWE6CUNvbnRpZ3VvdXMgbWVtb3J5IGFyZWEgZm9yIGRtYSBhbGxvY2F0aW9ucwogICogQGFyY2hkYXRhOglGb3IgYXJjaC1zcGVjaWZpYyBhZGRpdGlvbnMuCiAgKiBAb2Zfbm9kZToJQXNzb2NpYXRlZCBkZXZpY2UgdHJlZSBub2RlLgotICogQGFjcGlfbm9kZToJQXNzb2NpYXRlZCBBQ1BJIGRldmljZSBub2RlLgorICogQGZ3bm9kZToJQXNzb2NpYXRlZCBkZXZpY2Ugbm9kZSBzdXBwbGllZCBieSBwbGF0Zm9ybSBmaXJtd2FyZS4KICAqIEBkZXZ0OglGb3IgY3JlYXRpbmcgdGhlIHN5c2ZzICJkZXYiLgogICogQGlkOgkJZGV2aWNlIGluc3RhbmNlCiAgKiBAZGV2cmVzX2xvY2s6IFNwaW5sb2NrIHRvIHByb3RlY3QgdGhlIHJlc291cmNlIG9mIHRoZSBkZXZpY2UuCkBAIC03NzksNyArNzcyLDcgQEAKIAlzdHJ1Y3QgZGV2X2FyY2hkYXRhCWFyY2hkYXRhOwogCiAJc3RydWN0IGRldmljZV9ub2RlCSpvZl9ub2RlOyAvKiBhc3NvY2lhdGVkIGRldmljZSB0cmVlIG5vZGUgKi8KLQlzdHJ1Y3QgYWNwaV9kZXZfbm9kZQlhY3BpX25vZGU7IC8qIGFzc29jaWF0ZWQgQUNQSSBkZXZpY2Ugbm9kZSAqLworCXN0cnVjdCBmd25vZGVfaGFuZGxlCSpmd25vZGU7IC8qIGZpcm13YXJlIGRldmljZSBub2RlICovCiAKIAlkZXZfdAkJCWRldnQ7CS8qIGRldl90LCBjcmVhdGVzIHRoZSBzeXNmcyAiZGV2IiAqLwogCXUzMgkJCWlkOwkvKiBkZXZpY2UgaW5zdGFuY2UgKi8KQEAgLTkxNiw2ICs5MDksMTMgQEAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZkZXYtPm11dGV4KTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldl9vZl9ub2RlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX09GKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGRldi0+b2Zfbm9kZTsKK30KKwogdm9pZCBkcml2ZXJfaW5pdCh2b2lkKTsKIAogLyoKQEAgLTk0Nyw2ICs5NDcsOSBAQAogZXh0ZXJuIGludCBsb2NrX2RldmljZV9ob3RwbHVnX3N5c2ZzKHZvaWQpOwogZXh0ZXJuIGludCBkZXZpY2Vfb2ZmbGluZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBkZXZpY2Vfb25saW5lKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCBzZXRfcHJpbWFyeV9md25vZGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlKTsKK2V4dGVybiB2b2lkIHNldF9zZWNvbmRhcnlfZndub2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSk7CisKIC8qCiAgKiBSb290IGRldmljZSBvYmplY3RzIGZvciBncm91cGluZyB1bmRlciAvc3lzL2RldmljZXMKICAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWFwb29sLmggYi9pbmNsdWRlL2xpbnV4L2RtYXBvb2wuaAppbmRleCAwMjJlMzRmLi41MjQ1NmFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYXBvb2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYXBvb2wuaApAQCAtMTQsNiArMTQsOCBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9zY2F0dGVybGlzdC5oPgogCitzdHJ1Y3QgZGV2aWNlOworCiBzdHJ1Y3QgZG1hX3Bvb2wgKmRtYV9wb29sX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGV2aWNlICpkZXYsIAogCQkJc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwgc2l6ZV90IGFsbG9jYXRpb24pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VmaS5oIGIvaW5jbHVkZS9saW51eC9lZmkuaAppbmRleCBjZjdlNDMxLi5hZjViZTAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VmaS5oCisrKyBiL2luY2x1ZGUvbGludXgvZWZpLmgKQEAgLTk0Miw2ICs5NDIsNyBAQAogI2RlZmluZSBFRklfNjRCSVQJCTUJLyogSXMgdGhlIGZpcm13YXJlIDY0LWJpdD8gKi8KICNkZWZpbmUgRUZJX1BBUkFWSVJUCQk2CS8qIEFjY2VzcyBpcyB2aWEgYSBwYXJhdmlydCBpbnRlcmZhY2UgKi8KICNkZWZpbmUgRUZJX0FSQ0hfMQkJNwkvKiBGaXJzdCBhcmNoLXNwZWNpZmljIGJpdCAqLworI2RlZmluZSBFRklfREJHCQkJOAkvKiBQcmludCBhZGRpdGlvbmFsIGRlYnVnIGluZm8gYXQgcnVudGltZSAqLwogCiAjaWZkZWYgQ09ORklHX0VGSQogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWxmLXJhbmRvbWl6ZS5oIGIvaW5jbHVkZS9saW51eC9lbGYtcmFuZG9taXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVmMGJkYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvZWxmLXJhbmRvbWl6ZS5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0VMRl9SQU5ET01JWkVfSAorI2RlZmluZSBfRUxGX1JBTkRPTUlaRV9ICisKK3N0cnVjdCBtbV9zdHJ1Y3Q7CisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfSEFTX0VMRl9SQU5ET01JWkUKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhcmNoX21tYXBfcm5kKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyMgaWYgZGVmaW5lZChhcmNoX3JhbmRvbWl6ZV9icmspICYmIGRlZmluZWQoQ09ORklHX0NPTVBBVF9CUkspCisjICBkZWZpbmUgY29tcGF0X2Jya19yYW5kb21pemVkCisjIGVuZGlmCisjIGlmbmRlZiBhcmNoX3JhbmRvbWl6ZV9icmsKKyMgIGRlZmluZSBhcmNoX3JhbmRvbWl6ZV9icmsobW0pCShtbS0+YnJrKQorIyBlbmRpZgorI2Vsc2UKK2V4dGVybiB1bnNpZ25lZCBsb25nIGFyY2hfbW1hcF9ybmQodm9pZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworIyBpZmRlZiBDT05GSUdfQ09NUEFUX0JSSworIyAgZGVmaW5lIGNvbXBhdF9icmtfcmFuZG9taXplZAorIyBlbmRpZgorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oIGIvaW5jbHVkZS9saW51eC9ldGhlcmRldmljZS5oCmluZGV4IDFkODY5ZDEuLjYwNjU2M2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXRoZXJkZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2V0aGVyZGV2aWNlLmgKQEAgLTM1LDcgKzM1LDYgQEAKIAogaW50IGV0aF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdHlwZSwKIAkgICAgICAgY29uc3Qgdm9pZCAqZGFkZHIsIGNvbnN0IHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBsZW4pOwotaW50IGV0aF9yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBldGhfaGVhZGVyX3BhcnNlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKTsKIGludCBldGhfaGVhZGVyX2NhY2hlKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3QgaGhfY2FjaGUgKmhoLAogCQkgICAgIF9fYmUxNiB0eXBlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmlsdGVyLmggYi9pbmNsdWRlL2xpbnV4L2ZpbHRlci5oCmluZGV4IGNhYWMyMDguLmZhMTFiM2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmlsdGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9maWx0ZXIuaApAQCAtMTQ1LDggKzE0NSw2IEBACiAJCS5vZmYgICA9IDAsCQkJCQlcCiAJCS5pbW0gICA9ICgoX191NjQpIChJTU0pKSA+PiAzMiB9KQogCi0jZGVmaW5lIEJQRl9QU0VVRE9fTUFQX0ZECTEKLQogLyogcHNldWRvIEJQRl9MRF9JTU02NCBpbnNuIHVzZWQgdG8gcmVmZXIgdG8gcHJvY2Vzcy1sb2NhbCBtYXBfZmQgKi8KICNkZWZpbmUgQlBGX0xEX01BUF9GRChEU1QsIE1BUF9GRCkJCQkJXAogCUJQRl9MRF9JTU02NF9SQVcoRFNULCBCUEZfUFNFVURPX01BUF9GRCwgTUFQX0ZEKQpAQCAtMzEwLDkgKzMwOCwxMSBAQAogc3RydWN0IGJwZl9wcm9nIHsKIAl1MTYJCQlwYWdlczsJCS8qIE51bWJlciBvZiBhbGxvY2F0ZWQgcGFnZXMgKi8KIAlib29sCQkJaml0ZWQ7CQkvKiBJcyBvdXIgZmlsdGVyIEpJVCdlZD8gKi8KKwlib29sCQkJZ3BsX2NvbXBhdGlibGU7CS8qIElzIG91ciBmaWx0ZXIgR1BMIGNvbXBhdGlibGU/ICovCiAJdTMyCQkJbGVuOwkJLyogTnVtYmVyIG9mIGZpbHRlciBibG9ja3MgKi8KLQlzdHJ1Y3Qgc29ja19mcHJvZ19rZXJuCSpvcmlnX3Byb2c7CS8qIE9yaWdpbmFsIEJQRiBwcm9ncmFtICovCisJZW51bSBicGZfcHJvZ190eXBlCXR5cGU7CQkvKiBUeXBlIG9mIEJQRiBwcm9ncmFtICovCiAJc3RydWN0IGJwZl9wcm9nX2F1eAkqYXV4OwkJLyogQXV4aWxpYXJ5IGZpZWxkcyAqLworCXN0cnVjdCBzb2NrX2Zwcm9nX2tlcm4JKm9yaWdfcHJvZzsJLyogT3JpZ2luYWwgQlBGIHByb2dyYW0gKi8KIAl1bnNpZ25lZCBpbnQJCSgqYnBmX2Z1bmMpKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJCSAgICBjb25zdCBzdHJ1Y3QgYnBmX2luc24gKmZpbHRlcik7CiAJLyogSW5zdHJ1Y3Rpb25zIGZvciBpbnRlcnByZXRlciAqLwpAQCAtNDU0LDYgKzQ1NCw3IEBACiAJCUJQRl9BTkNJTExBUlkoVkxBTl9UQUdfUFJFU0VOVCk7CiAJCUJQRl9BTkNJTExBUlkoUEFZX09GRlNFVCk7CiAJCUJQRl9BTkNJTExBUlkoUkFORE9NKTsKKwkJQlBGX0FOQ0lMTEFSWShWTEFOX1RQSUQpOwogCQl9CiAJCS8qIEZhbGx0aHJvdWdoLiAqLwogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggYjRkNzFiNS4uZjRmYzYwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtMzE0LDYgKzMxNCwyOCBAQAogc3RydWN0IGFkZHJlc3Nfc3BhY2U7CiBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2w7CiAKKyNkZWZpbmUgSU9DQl9FVkVOVEZECQkoMSA8PCAwKQorCitzdHJ1Y3Qga2lvY2IgeworCXN0cnVjdCBmaWxlCQkqa2lfZmlscDsKKwlsb2ZmX3QJCQlraV9wb3M7CisJdm9pZCAoKmtpX2NvbXBsZXRlKShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGxvbmcgcmV0LCBsb25nIHJldDIpOworCXZvaWQJCQkqcHJpdmF0ZTsKKwlpbnQJCQlraV9mbGFnczsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19zeW5jX2tpb2NiKHN0cnVjdCBraW9jYiAqa2lvY2IpCit7CisJcmV0dXJuIGtpb2NiLT5raV9jb21wbGV0ZSA9PSBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9zeW5jX2tpb2NiKHN0cnVjdCBraW9jYiAqa2lvY2IsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCSpraW9jYiA9IChzdHJ1Y3Qga2lvY2IpIHsKKwkJLmtpX2ZpbHAgPSBmaWxwLAorCX07Cit9CisKIC8qCiAgKiAiZGVzY3JpcHRvciIgZm9yIHdoYXQgd2UncmUgdXAgdG8gd2l0aCBhIHJlYWQuCiAgKiBUaGlzIGFsbG93cyB1cyB0byB1c2UgdGhlIHNhbWUgcmVhZCBjb2RlIHlldApAQCAtNjA0LDYgKzYyNiw3IEBACiAJc3RydWN0IG11dGV4CQlpX211dGV4OwogCiAJdW5zaWduZWQgbG9uZwkJZGlydGllZF93aGVuOwkvKiBqaWZmaWVzIG9mIGZpcnN0IGRpcnR5aW5nICovCisJdW5zaWduZWQgbG9uZwkJZGlydGllZF90aW1lX3doZW47CiAKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlpX2hhc2g7CiAJc3RydWN0IGxpc3RfaGVhZAlpX3diX2xpc3Q7CS8qIGJhY2tpbmcgZGV2IElPIGxpc3QgKi8KQEAgLTg5Miw4ICs5MTUsOCBAQAogc3RydWN0IGxvY2tfbWFuYWdlcl9vcGVyYXRpb25zIHsKIAlpbnQgKCpsbV9jb21wYXJlX293bmVyKShzdHJ1Y3QgZmlsZV9sb2NrICosIHN0cnVjdCBmaWxlX2xvY2sgKik7CiAJdW5zaWduZWQgbG9uZyAoKmxtX293bmVyX2tleSkoc3RydWN0IGZpbGVfbG9jayAqKTsKLQl2b2lkICgqbG1fZ2V0X293bmVyKShzdHJ1Y3QgZmlsZV9sb2NrICosIHN0cnVjdCBmaWxlX2xvY2sgKik7Ci0Jdm9pZCAoKmxtX3B1dF9vd25lcikoc3RydWN0IGZpbGVfbG9jayAqKTsKKwlmbF9vd25lcl90ICgqbG1fZ2V0X293bmVyKShmbF9vd25lcl90KTsKKwl2b2lkICgqbG1fcHV0X293bmVyKShmbF9vd25lcl90KTsKIAl2b2lkICgqbG1fbm90aWZ5KShzdHJ1Y3QgZmlsZV9sb2NrICopOwkvKiB1bmJsb2NrIGNhbGxiYWNrICovCiAJaW50ICgqbG1fZ3JhbnQpKHN0cnVjdCBmaWxlX2xvY2sgKiwgaW50KTsKIAlib29sICgqbG1fYnJlYWspKHN0cnVjdCBmaWxlX2xvY2sgKik7CkBAIC0xNTM5LDggKzE1NjIsNiBAQAogCWxvZmZfdCAoKmxsc2VlaykgKHN0cnVjdCBmaWxlICosIGxvZmZfdCwgaW50KTsKIAlzc2l6ZV90ICgqcmVhZCkgKHN0cnVjdCBmaWxlICosIGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogCXNzaXplX3QgKCp3cml0ZSkgKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwotCXNzaXplX3QgKCphaW9fcmVhZCkgKHN0cnVjdCBraW9jYiAqLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKiwgdW5zaWduZWQgbG9uZywgbG9mZl90KTsKLQlzc2l6ZV90ICgqYWlvX3dyaXRlKSAoc3RydWN0IGtpb2NiICosIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLCB1bnNpZ25lZCBsb25nLCBsb2ZmX3QpOwogCXNzaXplX3QgKCpyZWFkX2l0ZXIpIChzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IGlvdl9pdGVyICopOwogCXNzaXplX3QgKCp3cml0ZV9pdGVyKSAoc3RydWN0IGtpb2NiICosIHN0cnVjdCBpb3ZfaXRlciAqKTsKIAlpbnQgKCppdGVyYXRlKSAoc3RydWN0IGZpbGUgKiwgc3RydWN0IGRpcl9jb250ZXh0ICopOwpAQCAtMTU0OCw3ICsxNTY5LDcgQEAKIAlsb25nICgqdW5sb2NrZWRfaW9jdGwpIChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCWxvbmcgKCpjb21wYXRfaW9jdGwpIChzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOwogCWludCAoKm1tYXApIChzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKik7Ci0Jdm9pZCAoKm1yZW1hcCkoc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOworCWludCAoKm1yZW1hcCkoc3RydWN0IGZpbGUgKiwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICopOwogCWludCAoKm9wZW4pIChzdHJ1Y3QgaW5vZGUgKiwgc3RydWN0IGZpbGUgKik7CiAJaW50ICgqZmx1c2gpIChzdHJ1Y3QgZmlsZSAqLCBmbF9vd25lcl90IGlkKTsKIAlpbnQgKCpyZWxlYXNlKSAoc3RydWN0IGlub2RlICosIHN0cnVjdCBmaWxlICopOwpAQCAtMTYxNiw2ICsxNjM3LDcgQEAKIAkJCSAgICAgIHN0cnVjdCBpb3ZlYyAqKnJldF9wb2ludGVyKTsKIAogZXh0ZXJuIHNzaXplX3QgX192ZnNfcmVhZChzdHJ1Y3QgZmlsZSAqLCBjaGFyIF9fdXNlciAqLCBzaXplX3QsIGxvZmZfdCAqKTsKK2V4dGVybiBzc2l6ZV90IF9fdmZzX3dyaXRlKHN0cnVjdCBmaWxlICosIGNvbnN0IGNoYXIgX191c2VyICosIHNpemVfdCwgbG9mZl90ICopOwogZXh0ZXJuIHNzaXplX3QgdmZzX3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CiBleHRlcm4gc3NpemVfdCB2ZnNfd3JpdGUoc3RydWN0IGZpbGUgKiwgY29uc3QgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CiBleHRlcm4gc3NpemVfdCB2ZnNfcmVhZHYoc3RydWN0IGZpbGUgKiwgY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqLApAQCAtMjE0NCw3ICsyMTY2LDcgQEAKIAljb25zdCBfX3VzZXIgY2hhcgkqdXB0cjsJLyogb3JpZ2luYWwgdXNlcmxhbmQgcG9pbnRlciAqLwogCXN0cnVjdCBhdWRpdF9uYW1lcwkqYW5hbWU7CiAJaW50CQkJcmVmY250OwotCWJvb2wJCQlzZXBhcmF0ZTsgLyogc2hvdWxkICJuYW1lIiBiZSBmcmVlZD8gKi8KKwljb25zdCBjaGFyCQlpbmFtZVtdOwogfTsKIAogZXh0ZXJuIGxvbmcgdmZzX3RydW5jYXRlKHN0cnVjdCBwYXRoICosIGxvZmZfdCk7CkBAIC0yNTUwLDEwICsyNTcyLDYgQEAKIGV4dGVybiBzc2l6ZV90IGdlbmVyaWNfZmlsZV93cml0ZV9pdGVyKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW92X2l0ZXIgKik7CiBleHRlcm4gc3NpemVfdCBnZW5lcmljX2ZpbGVfZGlyZWN0X3dyaXRlKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3QgaW92X2l0ZXIgKiwgbG9mZl90KTsKIGV4dGVybiBzc2l6ZV90IGdlbmVyaWNfcGVyZm9ybV93cml0ZShzdHJ1Y3QgZmlsZSAqLCBzdHJ1Y3QgaW92X2l0ZXIgKiwgbG9mZl90KTsKLWV4dGVybiBzc2l6ZV90IGRvX3N5bmNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwgbG9mZl90ICpwcG9zKTsKLWV4dGVybiBzc2l6ZV90IGRvX3N5bmNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcyk7Ci1leHRlcm4gc3NpemVfdCBuZXdfc3luY19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpOwotZXh0ZXJuIHNzaXplX3QgbmV3X3N5bmNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcyk7CiAKIHNzaXplX3QgdmZzX2l0ZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlvdl9pdGVyICppdGVyLCBsb2ZmX3QgKnBwb3MpOwogc3NpemVfdCB2ZnNfaXRlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGlvdl9pdGVyICppdGVyLCBsb2ZmX3QgKnBwb3MpOwpAQCAtMjU5Nyw2ICsyNjE1LDcgQEAKIGludCBkYXhfemVyb19wYWdlX3JhbmdlKHN0cnVjdCBpbm9kZSAqLCBsb2ZmX3QgZnJvbSwgdW5zaWduZWQgbGVuLCBnZXRfYmxvY2tfdCk7CiBpbnQgZGF4X3RydW5jYXRlX3BhZ2Uoc3RydWN0IGlub2RlICosIGxvZmZfdCBmcm9tLCBnZXRfYmxvY2tfdCk7CiBpbnQgZGF4X2ZhdWx0KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqLCBzdHJ1Y3Qgdm1fZmF1bHQgKiwgZ2V0X2Jsb2NrX3QpOworaW50IGRheF9wZm5fbWt3cml0ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiwgc3RydWN0IHZtX2ZhdWx0ICopOwogI2RlZmluZSBkYXhfbWt3cml0ZSh2bWEsIHZtZiwgZ2IpCWRheF9mYXVsdCh2bWEsIHZtZiwgZ2IpCiAKICNpZmRlZiBDT05GSUdfQkxPQ0sKQEAgLTI2NjEsNyArMjY4MCw2IEBACiBsb2ZmX3QgaW5vZGVfZ2V0X2J5dGVzKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogdm9pZCBpbm9kZV9zZXRfYnl0ZXMoc3RydWN0IGlub2RlICppbm9kZSwgbG9mZl90IGJ5dGVzKTsKIAotZXh0ZXJuIGludCB2ZnNfcmVhZGRpcihzdHJ1Y3QgZmlsZSAqLCBmaWxsZGlyX3QsIHZvaWQgKik7CiBleHRlcm4gaW50IGl0ZXJhdGVfZGlyKHN0cnVjdCBmaWxlICosIHN0cnVjdCBkaXJfY29udGV4dCAqKTsKIAogZXh0ZXJuIGludCB2ZnNfc3RhdChjb25zdCBjaGFyIF9fdXNlciAqLCBzdHJ1Y3Qga3N0YXQgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oIGIvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaAppbmRleCBjNjc0ZWU4Li40NmU4M2MyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oCisrKyBiL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmgKQEAgLTEzLDYgKzEzLDcgQEAKIHN0cnVjdCB0cmFjZV9idWZmZXI7CiBzdHJ1Y3QgdHJhY2VyOwogc3RydWN0IGRlbnRyeTsKK3N0cnVjdCBicGZfcHJvZzsKIAogc3RydWN0IHRyYWNlX3ByaW50X2ZsYWdzIHsKIAl1bnNpZ25lZCBsb25nCQltYXNrOwpAQCAtMjAyLDcgKzIwMyw3IEBACiBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGw7CiAKIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2xhc3MgewotCWNoYXIJCQkqc3lzdGVtOworCWNvbnN0IGNoYXIJCSpzeXN0ZW07CiAJdm9pZAkJCSpwcm9iZTsKICNpZmRlZiBDT05GSUdfUEVSRl9FVkVOVFMKIAl2b2lkCQkJKnBlcmZfcHJvYmU7CkBAIC0yNTIsNiArMjUzLDcgQEAKIAlUUkFDRV9FVkVOVF9GTF9XQVNfRU5BQkxFRF9CSVQsCiAJVFJBQ0VfRVZFTlRfRkxfVVNFX0NBTExfRklMVEVSX0JJVCwKIAlUUkFDRV9FVkVOVF9GTF9UUkFDRVBPSU5UX0JJVCwKKwlUUkFDRV9FVkVOVF9GTF9LUFJPQkVfQklULAogfTsKIAogLyoKQEAgLTI2NSw2ICsyNjcsNyBAQAogICogICAgICAgICAgICAgICAgICAgICBpdCBpcyBiZXN0IHRvIGNsZWFyIHRoZSBidWZmZXJzIHRoYXQgdXNlZCBpdCkuCiAgKiAgVVNFX0NBTExfRklMVEVSIC0gRm9yIGZ0cmFjZSBpbnRlcm5hbCBldmVudHMsIGRvbid0IHVzZSBmaWxlIGZpbHRlcgogICogIFRSQUNFUE9JTlQgICAgLSBFdmVudCBpcyBhIHRyYWNlcG9pbnQKKyAqICBLUFJPQkUgICAgICAgIC0gRXZlbnQgaXMgYSBrcHJvYmUKICAqLwogZW51bSB7CiAJVFJBQ0VfRVZFTlRfRkxfRklMVEVSRUQJCT0gKDEgPDwgVFJBQ0VfRVZFTlRfRkxfRklMVEVSRURfQklUKSwKQEAgLTI3NCw2ICsyNzcsNyBAQAogCVRSQUNFX0VWRU5UX0ZMX1dBU19FTkFCTEVECT0gKDEgPDwgVFJBQ0VfRVZFTlRfRkxfV0FTX0VOQUJMRURfQklUKSwKIAlUUkFDRV9FVkVOVF9GTF9VU0VfQ0FMTF9GSUxURVIJPSAoMSA8PCBUUkFDRV9FVkVOVF9GTF9VU0VfQ0FMTF9GSUxURVJfQklUKSwKIAlUUkFDRV9FVkVOVF9GTF9UUkFDRVBPSU5UCT0gKDEgPDwgVFJBQ0VfRVZFTlRfRkxfVFJBQ0VQT0lOVF9CSVQpLAorCVRSQUNFX0VWRU5UX0ZMX0tQUk9CRQkJPSAoMSA8PCBUUkFDRV9FVkVOVF9GTF9LUFJPQkVfQklUKSwKIH07CiAKIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCB7CkBAIC0yODUsNyArMjg5LDcgQEAKIAkJc3RydWN0IHRyYWNlcG9pbnQJKnRwOwogCX07CiAJc3RydWN0IHRyYWNlX2V2ZW50CWV2ZW50OwotCWNvbnN0IGNoYXIJCSpwcmludF9mbXQ7CisJY2hhcgkJCSpwcmludF9mbXQ7CiAJc3RydWN0IGV2ZW50X2ZpbHRlcgkqZmlsdGVyOwogCXZvaWQJCQkqbW9kOwogCXZvaWQJCQkqZGF0YTsKQEAgLTMwMyw2ICszMDcsNyBAQAogI2lmZGVmIENPTkZJR19QRVJGX0VWRU5UUwogCWludAkJCQlwZXJmX3JlZmNvdW50OwogCXN0cnVjdCBobGlzdF9oZWFkIF9fcGVyY3B1CSpwZXJmX2V2ZW50czsKKwlzdHJ1Y3QgYnBmX3Byb2cJCQkqcHJvZzsKIAogCWludAkoKnBlcmZfcGVybSkoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICosCiAJCQkgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICopOwpAQCAtNTQ4LDYgKzU1MywxNSBAQAogCQlldmVudF90cmlnZ2Vyc19wb3N0X2NhbGwoZmlsZSwgdHQpOwogfQogCisjaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMCit1bnNpZ25lZCBpbnQgdHJhY2VfY2FsbF9icGYoc3RydWN0IGJwZl9wcm9nICpwcm9nLCB2b2lkICpjdHgpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRyYWNlX2NhbGxfYnBmKHN0cnVjdCBicGZfcHJvZyAqcHJvZywgdm9pZCAqY3R4KQoreworCXJldHVybiAxOworfQorI2VuZGlmCisKIGVudW0gewogCUZJTFRFUl9PVEhFUiA9IDAsCiAJRklMVEVSX1NUQVRJQ19TVFJJTkcsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Z3bm9kZS5oIGIvaW5jbHVkZS9saW51eC9md25vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDA4NTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9md25vZGUuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogZndub2RlLmggLSBGaXJtd2FyZSBkZXZpY2Ugbm9kZSBvYmplY3QgaGFuZGxlIHR5cGUgZGVmaW5pdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFJhZmFlbCBKLiBXeXNvY2tpIDxyYWZhZWwuai53eXNvY2tpQGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0ZXTk9ERV9IXworI2RlZmluZSBfTElOVVhfRldOT0RFX0hfCisKK2VudW0gZndub2RlX3R5cGUgeworCUZXTk9ERV9JTlZBTElEID0gMCwKKwlGV05PREVfT0YsCisJRldOT0RFX0FDUEksCisJRldOT0RFX1BEQVRBLAorfTsKKworc3RydWN0IGZ3bm9kZV9oYW5kbGUgeworCWVudW0gZndub2RlX3R5cGUgdHlwZTsKKwlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqc2Vjb25kYXJ5OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCA1MWJkMWU3Li45N2E5MzczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTU3LDggKzU3LDEwIEBACiAgKiBfbWlnaHRfIGZhaWwuICBUaGlzIGRlcGVuZHMgdXBvbiB0aGUgcGFydGljdWxhciBWTSBpbXBsZW1lbnRhdGlvbi4KICAqCiAgKiBfX0dGUF9OT0ZBSUw6IFRoZSBWTSBpbXBsZW1lbnRhdGlvbiBfbXVzdF8gcmV0cnkgaW5maW5pdGVseTogdGhlIGNhbGxlcgotICogY2Fubm90IGhhbmRsZSBhbGxvY2F0aW9uIGZhaWx1cmVzLiAgVGhpcyBtb2RpZmllciBpcyBkZXByZWNhdGVkIGFuZCBubyBuZXcKLSAqIHVzZXJzIHNob3VsZCBiZSBhZGRlZC4KKyAqIGNhbm5vdCBoYW5kbGUgYWxsb2NhdGlvbiBmYWlsdXJlcy4gTmV3IHVzZXJzIHNob3VsZCBiZSBldmFsdWF0ZWQgY2FyZWZ1bGx5CisgKiAoYW5kIHRoZSBmbGFnIHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiB0aGVyZSBpcyBubyByZWFzb25hYmxlIGZhaWx1cmUgcG9saWN5KQorICogYnV0IGl0IGlzIGRlZmluaXRlbHkgcHJlZmVyYWJsZSB0byB1c2UgdGhlIGZsYWcgcmF0aGVyIHRoYW4gb3BlbmNvZGUgZW5kbGVzcworICogbG9vcCBhcm91bmQgYWxsb2NhdG9yLgogICoKICAqIF9fR0ZQX05PUkVUUlk6IFRoZSBWTSBpbXBsZW1lbnRhdGlvbiBtdXN0IG5vdCByZXRyeSBpbmRlZmluaXRlbHkuCiAgKgpAQCAtMTE3LDE2ICsxMTksNiBAQAogCQkJIF9fR0ZQX05PTUVNQUxMT0MgfCBfX0dGUF9OT1JFVFJZIHwgX19HRlBfTk9XQVJOIHwgXAogCQkJIF9fR0ZQX05PX0tTV0FQRCkKIAotLyoKLSAqIEdGUF9USElTTk9ERSBkb2VzIG5vdCBwZXJmb3JtIGFueSByZWNsYWltLCB5b3UgbW9zdCBsaWtlbHkgd2FudCB0bwotICogdXNlIF9fR0ZQX1RISVNOT0RFIHRvIGFsbG9jYXRlIGZyb20gYSBnaXZlbiBub2RlIHdpdGhvdXQgZmFsbGJhY2shCi0gKi8KLSNpZmRlZiBDT05GSUdfTlVNQQotI2RlZmluZSBHRlBfVEhJU05PREUJKF9fR0ZQX1RISVNOT0RFIHwgX19HRlBfTk9XQVJOIHwgX19HRlBfTk9SRVRSWSkKLSNlbHNlCi0jZGVmaW5lIEdGUF9USElTTk9ERQkoKF9fZm9yY2UgZ2ZwX3QpMCkKLSNlbmRpZgotCiAvKiBUaGlzIG1hc2sgbWFrZXMgdXAgYWxsIHRoZSBwYWdlIG1vdmFibGUgcmVsYXRlZCBmbGFncyAqLwogI2RlZmluZSBHRlBfTU9WQUJMRV9NQVNLIChfX0dGUF9SRUNMQUlNQUJMRXxfX0dGUF9NT1ZBQkxFKQogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaCBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCmluZGV4IGNiYTQ0MmUuLmY0YWYwMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCkBAIC05LDcgKzksNyBAQAogCiAKIGV4dGVybiB2b2lkIHN5bmNocm9uaXplX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLWV4dGVybiB2b2lkIHN5bmNocm9uaXplX2hhcmRpcnEodW5zaWduZWQgaW50IGlycSk7CitleHRlcm4gYm9vbCBzeW5jaHJvbml6ZV9oYXJkaXJxKHVuc2lnbmVkIGludCBpcnEpOwogCiAjaWYgZGVmaW5lZChDT05GSUdfVElOWV9SQ1UpCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaGlkLXNlbnNvci1odWIuaCBiL2luY2x1ZGUvbGludXgvaGlkLXNlbnNvci1odWIuaAppbmRleCA0MTczYThmLi4wNDA4NDIxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hpZC1zZW5zb3ItaHViLmgKKysrIGIvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWh1Yi5oCkBAIC00OSwxOSArNDksNDMgQEAKIH07CiAKIC8qKgorICogc3RydWN0IHNlbnNvcl9odWJfcGVuZGluZyAtIFN5bmNocm9ub3VzIHJlYWQgcGVuZGluZyBpbmZvcm1hdGlvbgorICogQHN0YXR1czoJCVBlbmRpbmcgc3RhdHVzIHRydWUvZmFsc2UuCisgKiBAcmVhZHk6CQlDb21wbGV0aW9uIHN5bmNocm9uaXphdGlvbiBkYXRhLgorICogQHVzYWdlX2lkOgkJVXNhZ2UgaWQgZm9yIHBoeXNpY2FsIGRldmljZSwgRS5nLiBHeXJvIHVzYWdlIGlkLgorICogQGF0dHJfdXNhZ2VfaWQ6CVVzYWdlIElkIG9mIGEgZmllbGQsIEUuZy4gWC1BWElTIGZvciBhIGd5cm8uCisgKiBAcmF3X3NpemU6CQlSZXNwb25zZSBzaXplIGZvciBhIHJlYWQgcmVxdWVzdC4KKyAqIEByYXdfZGF0YToJCVBsYWNlIGhvbGRlciBmb3IgcmVjZWl2ZWQgcmVzcG9uc2UuCisgKi8KK3N0cnVjdCBzZW5zb3JfaHViX3BlbmRpbmcgeworCWJvb2wgc3RhdHVzOworCXN0cnVjdCBjb21wbGV0aW9uIHJlYWR5OworCXUzMiB1c2FnZV9pZDsKKwl1MzIgYXR0cl91c2FnZV9pZDsKKwlpbnQgcmF3X3NpemU7CisJdTggICpyYXdfZGF0YTsKK307CisKKy8qKgogICogc3RydWN0IGhpZF9zZW5zb3JfaHViX2RldmljZSAtIFN0b3JlcyB0aGUgaHViIGluc3RhbmNlIGRhdGEKICAqIEBoZGV2OgkJU3RvcmVzIHRoZSBoaWQgaW5zdGFuY2UuCiAgKiBAdmVuZG9yX2lkOgkJVmVuZG9yIGlkIG9mIGh1YiBkZXZpY2UuCiAgKiBAcHJvZHVjdF9pZDoJCVByb2R1Y3QgaWQgb2YgaHViIGRldmljZS4KKyAqIEB1c2FnZToJCVVzYWdlIGlkIGZvciB0aGlzIGh1YiBkZXZpY2UgaW5zdGFuY2UuCiAgKiBAc3RhcnRfY29sbGVjdGlvbl9pbmRleDogU3RhcnRpbmcgaW5kZXggZm9yIGEgcGh5IHR5cGUgY29sbGVjdGlvbgogICogQGVuZF9jb2xsZWN0aW9uX2luZGV4OiBMYXN0IGluZGV4IGZvciBhIHBoeSB0eXBlIGNvbGxlY3Rpb24KKyAqIEBtdXRleDoJCXN5bmNocm9uaXppbmcgbXV0ZXguCisgKiBAcGVuZGluZzoJCUhvbGRzIGluZm9ybWF0aW9uIG9mIHBlbmRpbmcgc3luYyByZWFkIHJlcXVlc3QuCiAgKi8KIHN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgewogCXN0cnVjdCBoaWRfZGV2aWNlICpoZGV2OwogCXUzMiB2ZW5kb3JfaWQ7CiAJdTMyIHByb2R1Y3RfaWQ7CisJdTMyIHVzYWdlOwogCWludCBzdGFydF9jb2xsZWN0aW9uX2luZGV4OwogCWludCBlbmRfY29sbGVjdGlvbl9pbmRleDsKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJc3RydWN0IHNlbnNvcl9odWJfcGVuZGluZyBwZW5kaW5nOwogfTsKIAogLyoqCkBAIC0xNTIsNDAgKzE3Niw1MSBAQAogKiBAdXNhZ2VfaWQ6CUF0dHJpYnV0ZSB1c2FnZSBpZCBvZiBwYXJlbnQgcGh5c2ljYWwgZGV2aWNlIGFzIHBlciBzcGVjCiAqIEBhdHRyX3VzYWdlX2lkOglBdHRyaWJ1dGUgdXNhZ2UgaWQgYXMgcGVyIHNwZWMKICogQHJlcG9ydF9pZDoJUmVwb3J0IGlkIHRvIGxvb2sgZm9yCisqIEBmbGFnOiAgICAgIFN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cyByZWFkCiAqCi0qIElzc3VlcyBhIHN5bmNocm9ub3VzIHJlYWQgcmVxdWVzdCBmb3IgYW4gaW5wdXQgYXR0cmlidXRlLiBSZXR1cm5zCi0qIGRhdGEgdXB0byAzMiBiaXRzLiBTaW5jZSBjbGllbnQgY2FuIGdldCBldmVudHMsIHNvIHRoaXMgY2FsbCBzaG91bGQKLSogbm90IGJlIHVzZWQgZm9yIGRhdGEgcGF0aHMsIHRoaXMgd2lsbCBpbXBhY3QgcGVyZm9ybWFuY2UuCisqIElzc3VlcyBhIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cyByZWFkIHJlcXVlc3QgZm9yIGFuIGlucHV0IGF0dHJpYnV0ZS4KKyogUmV0dXJucyBkYXRhIHVwdG8gMzIgYml0cy4KICovCiAKK2VudW0gc2Vuc29yX2h1Yl9yZWFkX2ZsYWdzIHsKKwlTRU5TT1JfSFVCX1NZTkMsCisJU0VOU09SX0hVQl9BU1lOQywKK307CisKIGludCBzZW5zb3JfaHViX2lucHV0X2F0dHJfZ2V0X3Jhd192YWx1ZShzdHJ1Y3QgaGlkX3NlbnNvcl9odWJfZGV2aWNlICpoc2RldiwKLQkJCXUzMiB1c2FnZV9pZCwKLQkJCXUzMiBhdHRyX3VzYWdlX2lkLCB1MzIgcmVwb3J0X2lkKTsKKyAJCQkJCXUzMiB1c2FnZV9pZCwKKyAJCQkJCXUzMiBhdHRyX3VzYWdlX2lkLCB1MzIgcmVwb3J0X2lkLAorIAkJCQkJZW51bSBzZW5zb3JfaHViX3JlYWRfZmxhZ3MgZmxhZworKTsKKwogLyoqCiAqIHNlbnNvcl9odWJfc2V0X2ZlYXR1cmUoKSAtIEZlYXR1cmUgc2V0IHJlcXVlc3QKICogQGhzZGV2OglIdWIgZGV2aWNlIGluc3RhbmNlLgogKiBAcmVwb3J0X2lkOglSZXBvcnQgaWQgdG8gbG9vayBmb3IKICogQGZpZWxkX2luZGV4OglGaWVsZCBpbmRleCBpbnNpZGUgYSByZXBvcnQKLSogQHZhbHVlOglWYWx1ZSB0byBzZXQKKyogQGJ1ZmZlcl9zaXplOiBzaXplIG9mIHRoZSBidWZmZXIKKyogQGJ1ZmZlcjoJYnVmZmVyIHRvIHVzZSBpbiB0aGUgZmVhdHVyZSBzZXQKICoKICogVXNlZCB0byBzZXQgYSBmaWVsZCBpbiBmZWF0dXJlIHJlcG9ydC4gRm9yIGV4YW1wbGUgdGhpcyBjYW4gc2V0IHBvbGxpbmcKICogaW50ZXJ2YWwsIHNlbnNpdGl2aXR5LCBhY3RpdmF0ZS9kZWFjdGl2YXRlIHN0YXRlLgogKi8KIGludCBzZW5zb3JfaHViX3NldF9mZWF0dXJlKHN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2LCB1MzIgcmVwb3J0X2lkLAotCQkJdTMyIGZpZWxkX2luZGV4LCBzMzIgdmFsdWUpOworCQkJICAgdTMyIGZpZWxkX2luZGV4LCBpbnQgYnVmZmVyX3NpemUsIHZvaWQgKmJ1ZmZlcik7CiAKIC8qKgogKiBzZW5zb3JfaHViX2dldF9mZWF0dXJlKCkgLSBGZWF0dXJlIGdldCByZXF1ZXN0CiAqIEBoc2RldjoJSHViIGRldmljZSBpbnN0YW5jZS4KICogQHJlcG9ydF9pZDoJUmVwb3J0IGlkIHRvIGxvb2sgZm9yCiAqIEBmaWVsZF9pbmRleDoJRmllbGQgaW5kZXggaW5zaWRlIGEgcmVwb3J0Ci0qIEB2YWx1ZToJUGxhY2UgaG9sZGVyIGZvciByZXR1cm4gdmFsdWUKKyogQGJ1ZmZlcl9zaXplOglzaXplIG9mIHRoZSBidWZmZXIKKyogQGJ1ZmZlcjoJYnVmZmVyIHRvIGNvcHkgb3V0cHV0CiAqCiAqIFVzZWQgdG8gZ2V0IGEgZmllbGQgaW4gZmVhdHVyZSByZXBvcnQuIEZvciBleGFtcGxlIHRoaXMgY2FuIGdldCBwb2xsaW5nCi0qIGludGVydmFsLCBzZW5zaXRpdml0eSwgYWN0aXZhdGUvZGVhY3RpdmF0ZSBzdGF0ZS4KKyogaW50ZXJ2YWwsIHNlbnNpdGl2aXR5LCBhY3RpdmF0ZS9kZWFjdGl2YXRlIHN0YXRlLiBPbiBzdWNjZXNzIGl0IHJldHVybnMKKyogbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCB0byBidWZmZXIuIE9uIGZhaWx1cmUsIGl0IHJldHVybnMgdmFsdWUgPCAwLgogKi8KIGludCBzZW5zb3JfaHViX2dldF9mZWF0dXJlKHN0cnVjdCBoaWRfc2Vuc29yX2h1Yl9kZXZpY2UgKmhzZGV2LCB1MzIgcmVwb3J0X2lkLAotCQkJdTMyIGZpZWxkX2luZGV4LCBzMzIgKnZhbHVlKTsKKwkJCSAgIHUzMiBmaWVsZF9pbmRleCwgaW50IGJ1ZmZlcl9zaXplLCB2b2lkICpidWZmZXIpOwogCiAvKiBoaWQtc2Vuc29yLWF0dHJpYnV0ZXMgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWlkcy5oIGIvaW5jbHVkZS9saW51eC9oaWQtc2Vuc29yLWlkcy5oCmluZGV4IDEwOWYwZTYuLmYyZWU5MGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGlkLXNlbnNvci1pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hpZC1zZW5zb3ItaWRzLmgKQEAgLTIxLDYgKzIxLDggQEAKIAogI2RlZmluZSBISURfTUFYX1BIWV9ERVZJQ0VTCQkJCQkweEZGCiAKKyNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9DT0xMRUNUSU9OCQkJCTB4MjAwMDAxCisKIC8qIEFjY2VsIDNEICgyMDAwNzMpICovCiAjZGVmaW5lIEhJRF9VU0FHRV9TRU5TT1JfQUNDRUxfM0QJCQkJMHgyMDAwNzMKICNkZWZpbmUgSElEX1VTQUdFX1NFTlNPUl9EQVRBX0FDQ0VMRVJBVElPTgkJCTB4MjAwNDUyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hpZC5oIGIvaW5jbHVkZS9saW51eC9oaWQuaAppbmRleCBlZmM3Nzg3Li4xNzZiNDM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hpZC5oCisrKyBiL2luY2x1ZGUvbGludXgvaGlkLmgKQEAgLTE1OSw2ICsxNTksNyBAQAogI2RlZmluZSBISURfVVBfTEVECQkweDAwMDgwMDAwCiAjZGVmaW5lIEhJRF9VUF9CVVRUT04JCTB4MDAwOTAwMDAKICNkZWZpbmUgSElEX1VQX09SRElOQUwJCTB4MDAwYTAwMDAKKyNkZWZpbmUgSElEX1VQX1RFTEVQSE9OWQkweDAwMGIwMDAwCiAjZGVmaW5lIEhJRF9VUF9DT05TVU1FUgkJMHgwMDBjMDAwMAogI2RlZmluZSBISURfVVBfRElHSVRJWkVSCTB4MDAwZDAwMDAKICNkZWZpbmUgSElEX1VQX1BJRAkJMHgwMDBmMDAwMApAQCAtMjY5LDYgKzI3MCw3IEBACiAjZGVmaW5lIEhJRF9ER19ERVZJQ0VJTkRFWAkweDAwMGQwMDUzCiAjZGVmaW5lIEhJRF9ER19DT05UQUNUQ09VTlQJMHgwMDBkMDA1NAogI2RlZmluZSBISURfREdfQ09OVEFDVE1BWAkweDAwMGQwMDU1CisjZGVmaW5lIEhJRF9ER19CVVRUT05UWVBFCTB4MDAwZDAwNTkKICNkZWZpbmUgSElEX0RHX0JBUlJFTFNXSVRDSDIJMHgwMDBkMDA1YQogI2RlZmluZSBISURfREdfVE9PTFNFUklBTE5VTUJFUgkweDAwMGQwMDViCiAKQEAgLTUxNCwxMCArNTE2LDEwIEBACiAjaWZkZWYgQ09ORklHX0hJRF9CQVRURVJZX1NUUkVOR1RICiAJLyoKIAkgKiBQb3dlciBzdXBwbHkgaW5mb3JtYXRpb24gZm9yIEhJRCBkZXZpY2VzIHdoaWNoIHJlcG9ydAotCSAqIGJhdHRlcnkgc3RyZW5ndGguIHBvd2VyX3N1cHBseSBpcyByZWdpc3RlcmVkIGlmZgotCSAqIGJhdHRlcnkubmFtZSBpcyBub24tTlVMTC4KKwkgKiBiYXR0ZXJ5IHN0cmVuZ3RoLiBwb3dlcl9zdXBwbHkgd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkIGlmCisJICogYmF0dGVyeSBpcyBub24tTlVMTC4KIAkgKi8KLQlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnk7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeTsKIAlfX3MzMiBiYXR0ZXJ5X21pbjsKIAlfX3MzMiBiYXR0ZXJ5X21heDsKIAlfX3MzMiBiYXR0ZXJ5X3JlcG9ydF90eXBlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9odWdldGxiLmggYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAppbmRleCA3YjU3ODUwLi4yMDUwMjYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2h1Z2V0bGIuaApAQCAtMjIsNyArMjIsMTMgQEAKIHN0cnVjdCBodWdlcGFnZV9zdWJwb29sIHsKIAlzcGlubG9ja190IGxvY2s7CiAJbG9uZyBjb3VudDsKLQlsb25nIG1heF9ocGFnZXMsIHVzZWRfaHBhZ2VzOworCWxvbmcgbWF4X2hwYWdlczsJLyogTWF4aW11bSBodWdlIHBhZ2VzIG9yIC0xIGlmIG5vIG1heGltdW0uICovCisJbG9uZyB1c2VkX2hwYWdlczsJLyogVXNlZCBjb3VudCBhZ2FpbnN0IG1heGltdW0sIGluY2x1ZGVzICovCisJCQkJLyogYm90aCBhbGxvY2VkIGFuZCByZXNlcnZlZCBwYWdlcy4gKi8KKwlzdHJ1Y3QgaHN0YXRlICpoc3RhdGU7CisJbG9uZyBtaW5faHBhZ2VzOwkvKiBNaW5pbXVtIGh1Z2UgcGFnZXMgb3IgLTEgaWYgbm8gbWluaW11bS4gKi8KKwlsb25nIHJzdl9ocGFnZXM7CS8qIFBhZ2VzIHJlc2VydmVkIGFnYWluc3QgZ2xvYmFsIHBvb2wgdG8gKi8KKwkJCQkvKiBzYXNpdGZ5IG1pbmltdW0gc2l6ZS4gKi8KIH07CiAKIHN0cnVjdCByZXN2X21hcCB7CkBAIC0zOCwxMSArNDQsMTAgQEAKICNkZWZpbmUgZm9yX2VhY2hfaHN0YXRlKGgpIFwKIAlmb3IgKChoKSA9IGhzdGF0ZXM7IChoKSA8ICZoc3RhdGVzW2h1Z2V0bGJfbWF4X2hzdGF0ZV07IChoKSsrKQogCi1zdHJ1Y3QgaHVnZXBhZ2Vfc3VicG9vbCAqaHVnZXBhZ2VfbmV3X3N1YnBvb2wobG9uZyBucl9ibG9ja3MpOworc3RydWN0IGh1Z2VwYWdlX3N1YnBvb2wgKmh1Z2VwYWdlX25ld19zdWJwb29sKHN0cnVjdCBoc3RhdGUgKmgsIGxvbmcgbWF4X2hwYWdlcywKKwkJCQkJCWxvbmcgbWluX2hwYWdlcyk7CiB2b2lkIGh1Z2VwYWdlX3B1dF9zdWJwb29sKHN0cnVjdCBodWdlcGFnZV9zdWJwb29sICpzcG9vbCk7CiAKLWludCBQYWdlSHVnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci0KIHZvaWQgcmVzZXRfdm1hX3Jlc3ZfaHVnZV9wYWdlcyhzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiBpbnQgaHVnZXRsYl9zeXNjdGxfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKIGludCBodWdldGxiX292ZXJjb21taXRfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKQEAgLTc5LDcgKzg0LDYgQEAKIGludCBkZXF1ZXVlX2h3cG9pc29uZWRfaHVnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIGJvb2wgaXNvbGF0ZV9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwogdm9pZCBwdXRiYWNrX2FjdGl2ZV9odWdlcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci1ib29sIGlzX2h1Z2VwYWdlX2FjdGl2ZShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiB2b2lkIGZyZWVfaHVnZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIAogI2lmZGVmIENPTkZJR19BUkNIX1dBTlRfSFVHRV9QTURfU0hBUkUKQEAgLTEwOSwxMSArMTEzLDYgQEAKIAogI2Vsc2UgLyogIUNPTkZJR19IVUdFVExCX1BBR0UgKi8KIAotc3RhdGljIGlubGluZSBpbnQgUGFnZUh1Z2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCByZXNldF92bWFfcmVzdl9odWdlX3BhZ2VzKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogfQpAQCAtMTUyLDcgKzE1MSw2IEBACiAJcmV0dXJuIGZhbHNlOwogfQogI2RlZmluZSBwdXRiYWNrX2FjdGl2ZV9odWdlcGFnZShwKQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgaXNfaHVnZXBhZ2VfYWN0aXZlKHgpCWZhbHNlCiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBodWdldGxiX2NoYW5nZV9wcm90ZWN0aW9uKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgZW5kLCBwZ3Byb3RfdCBuZXdwcm90KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9od19yYW5kb20uaCBiL2luY2x1ZGUvbGludXgvaHdfcmFuZG9tLmgKaW5kZXggZWI3YjQxNC4uNGY3ZDhmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9od19yYW5kb20uaAorKysgYi9pbmNsdWRlL2xpbnV4L2h3X3JhbmRvbS5oCkBAIC01MCwxMCArNTAsMTQgQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiBjbGVhbnVwX2RvbmU7CiB9OwogCitzdHJ1Y3QgZGV2aWNlOworCiAvKiogUmVnaXN0ZXIgYSBuZXcgSGFyZHdhcmUgUmFuZG9tIE51bWJlciBHZW5lcmF0b3IgZHJpdmVyLiAqLwogZXh0ZXJuIGludCBod3JuZ19yZWdpc3RlcihzdHJ1Y3QgaHdybmcgKnJuZyk7CitleHRlcm4gaW50IGRldm1faHdybmdfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgaHdybmcgKnJuZyk7CiAvKiogVW5yZWdpc3RlciBhIEhhcmR3YXJlIFJhbmRvbSBOdW1iZXIgR2VuZXJhdG9yIGRyaXZlci4gKi8KIGV4dGVybiB2b2lkIGh3cm5nX3VucmVnaXN0ZXIoc3RydWN0IGh3cm5nICpybmcpOworZXh0ZXJuIHZvaWQgZGV2bV9od3JuZ191bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmR2ZSwgc3RydWN0IGh3cm5nICpybmcpOwogLyoqIEZlZWQgcmFuZG9tIGJpdHMgaW50byB0aGUgcG9vbC4gKi8KIGV4dGVybiB2b2lkIGFkZF9od2dlbmVyYXRvcl9yYW5kb21uZXNzKGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBzaXplX3QgZW50cm9weSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaTJjLmggYi9pbmNsdWRlL2xpbnV4L2kyYy5oCmluZGV4IGYxN2RhNTAuLmU4M2E3MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaTJjLmgKKysrIGIvaW5jbHVkZS9saW51eC9pMmMuaApAQCAtMjUzLDEwICsyNTMsMTAgQEAKIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQ19TTEFWRSkKIGVudW0gaTJjX3NsYXZlX2V2ZW50IHsKLQlJMkNfU0xBVkVfUkVRX1JFQURfU1RBUlQsCi0JSTJDX1NMQVZFX1JFUV9SRUFEX0VORCwKLQlJMkNfU0xBVkVfUkVRX1dSSVRFX1NUQVJULAotCUkyQ19TTEFWRV9SRVFfV1JJVEVfRU5ELAorCUkyQ19TTEFWRV9SRUFEX1JFUVVFU1RFRCwKKwlJMkNfU0xBVkVfV1JJVEVfUkVRVUVTVEVELAorCUkyQ19TTEFWRV9SRUFEX1BST0NFU1NFRCwKKwlJMkNfU0xBVkVfV1JJVEVfUkVDRUlWRUQsCiAJSTJDX1NMQVZFX1NUT1AsCiB9OwogCkBAIC0yNzgsNyArMjc4LDcgQEAKICAqIEBwbGF0Zm9ybV9kYXRhOiBzdG9yZWQgaW4gaTJjX2NsaWVudC5kZXYucGxhdGZvcm1fZGF0YQogICogQGFyY2hkYXRhOiBjb3BpZWQgaW50byBpMmNfY2xpZW50LmRldi5hcmNoZGF0YQogICogQG9mX25vZGU6IHBvaW50ZXIgdG8gT3BlbkZpcm13YXJlIGRldmljZSBub2RlCi0gKiBAYWNwaV9ub2RlOiBBQ1BJIGRldmljZSBub2RlCisgKiBAZndub2RlOiBkZXZpY2Ugbm9kZSBzdXBwbGllZCBieSB0aGUgcGxhdGZvcm0gZmlybXdhcmUKICAqIEBpcnE6IHN0b3JlZCBpbiBpMmNfY2xpZW50LmlycQogICoKICAqIEkyQyBkb2Vzbid0IGFjdHVhbGx5IHN1cHBvcnQgaGFyZHdhcmUgcHJvYmluZywgYWx0aG91Z2ggY29udHJvbGxlcnMgYW5kCkBAIC0yOTksNyArMjk5LDcgQEAKIAl2b2lkCQkqcGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgZGV2X2FyY2hkYXRhCSphcmNoZGF0YTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7Ci0Jc3RydWN0IGFjcGlfZGV2X25vZGUgYWNwaV9ub2RlOworCXN0cnVjdCBmd25vZGVfaGFuZGxlICpmd25vZGU7CiAJaW50CQlpcnE7CiB9OwogCkBAIC00MzUsOCArNDM1LDggQEAKIAl2b2lkICgqc2V0X3NjbCkoc3RydWN0IGkyY19hZGFwdGVyICosIGludCB2YWwpOwogCWludCAoKmdldF9zZGEpKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKIAotCXZvaWQgKCpwcmVwYXJlX3JlY292ZXJ5KShzdHJ1Y3QgaTJjX2J1c19yZWNvdmVyeV9pbmZvICpicmkpOwotCXZvaWQgKCp1bnByZXBhcmVfcmVjb3ZlcnkpKHN0cnVjdCBpMmNfYnVzX3JlY292ZXJ5X2luZm8gKmJyaSk7CisJdm9pZCAoKnByZXBhcmVfcmVjb3ZlcnkpKHN0cnVjdCBpMmNfYWRhcHRlciAqKTsKKwl2b2lkICgqdW5wcmVwYXJlX3JlY292ZXJ5KShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7CiAKIAkvKiBncGlvIHJlY292ZXJ5ICovCiAJaW50IHNjbF9ncGlvOwpAQCAtNDQ5LDYgKzQ0OSw0OCBAQAogaW50IGkyY19nZW5lcmljX2dwaW9fcmVjb3Zlcnkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKTsKIGludCBpMmNfZ2VuZXJpY19zY2xfcmVjb3Zlcnkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKTsKIAorLyoqCisgKiBzdHJ1Y3QgaTJjX2FkYXB0ZXJfcXVpcmtzIC0gZGVzY3JpYmUgZmxhd3Mgb2YgYW4gaTJjIGFkYXB0ZXIKKyAqIEBmbGFnczogc2VlIEkyQ19BUV8qIGZvciBwb3NzaWJsZSBmbGFncyBhbmQgcmVhZCBiZWxvdworICogQG1heF9udW1fbXNnczogbWF4aW11bSBudW1iZXIgb2YgbWVzc2FnZXMgcGVyIHRyYW5zZmVyCisgKiBAbWF4X3dyaXRlX2xlbjogbWF4aW11bSBsZW5ndGggb2YgYSB3cml0ZSBtZXNzYWdlCisgKiBAbWF4X3JlYWRfbGVuOiBtYXhpbXVtIGxlbmd0aCBvZiBhIHJlYWQgbWVzc2FnZQorICogQG1heF9jb21iXzFzdF9tc2dfbGVuOiBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgZmlyc3QgbXNnIGluIGEgY29tYmluZWQgbWVzc2FnZQorICogQG1heF9jb21iXzJuZF9tc2dfbGVuOiBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgc2Vjb25kIG1zZyBpbiBhIGNvbWJpbmVkIG1lc3NhZ2UKKyAqCisgKiBOb3RlIGFib3V0IGNvbWJpbmVkIG1lc3NhZ2VzOiBTb21lIEkyQyBjb250cm9sbGVycyBjYW4gb25seSBzZW5kIG9uZSBtZXNzYWdlCisgKiBwZXIgdHJhbnNmZXIsIHBsdXMgc29tZXRoaW5nIGNhbGxlZCBjb21iaW5lZCBtZXNzYWdlIG9yIHdyaXRlLXRoZW4tcmVhZC4KKyAqIFRoaXMgaXMgKHVzdWFsbHkpIGEgc21hbGwgd3JpdGUgbWVzc2FnZSBmb2xsb3dlZCBieSBhIHJlYWQgbWVzc2FnZSBhbmQKKyAqIGJhcmVseSBlbm91Z2ggdG8gYWNjZXNzIHJlZ2lzdGVyIGJhc2VkIGRldmljZXMgbGlrZSBFRVBST01zLiBUaGVyZSBpcyBhIGZsYWcKKyAqIHRvIHN1cHBvcnQgdGhpcyBtb2RlLiBJdCBpbXBsaWVzIG1heF9udW1fbXNnID0gMiBhbmQgZG9lcyB0aGUgbGVuZ3RoIGNoZWNrcworICogd2l0aCBtYXhfY29tYl8qX2xlbiBiZWNhdXNlIGNvbWJpbmVkIG1lc3NhZ2UgbW9kZSB1c3VhbGx5IGhhcyBpdHMgb3duCisgKiBsaW1pdGF0aW9ucy4gQmVjYXVzZSBvZiBIVyBpbXBsZW1lbnRhdGlvbnMsIHNvbWUgY29udHJvbGxlcnMgY2FuIGFjdHVhbGx5IGRvCisgKiB3cml0ZS10aGVuLWFueXRoaW5nIG9yIG90aGVyIHZhcmlhbnRzLiBUbyBzdXBwb3J0IHRoYXQsIHdyaXRlLXRoZW4tcmVhZCBoYXMKKyAqIGJlZW4gYnJva2VuIG91dCBpbnRvIHNtYWxsZXIgYml0cyBsaWtlIHdyaXRlLWZpcnN0IGFuZCByZWFkLXNlY29uZCB3aGljaCBjYW4KKyAqIGJlIGNvbWJpbmVkIGFzIG5lZWRlZC4KKyAqLworCitzdHJ1Y3QgaTJjX2FkYXB0ZXJfcXVpcmtzIHsKKwl1NjQgZmxhZ3M7CisJaW50IG1heF9udW1fbXNnczsKKwl1MTYgbWF4X3dyaXRlX2xlbjsKKwl1MTYgbWF4X3JlYWRfbGVuOworCXUxNiBtYXhfY29tYl8xc3RfbXNnX2xlbjsKKwl1MTYgbWF4X2NvbWJfMm5kX21zZ19sZW47Cit9OworCisvKiBlbmZvcmNlIG1heF9udW1fbXNncyA9IDIgYW5kIHVzZSBtYXhfY29tYl8qX2xlbiBmb3IgbGVuZ3RoIGNoZWNrcyAqLworI2RlZmluZSBJMkNfQVFfQ09NQgkJCUJJVCgwKQorLyogZmlyc3QgY29tYmluZWQgbWVzc2FnZSBtdXN0IGJlIHdyaXRlICovCisjZGVmaW5lIEkyQ19BUV9DT01CX1dSSVRFX0ZJUlNUCQlCSVQoMSkKKy8qIHNlY29uZCBjb21iaW5lZCBtZXNzYWdlIG11c3QgYmUgcmVhZCAqLworI2RlZmluZSBJMkNfQVFfQ09NQl9SRUFEX1NFQ09ORAkJQklUKDIpCisvKiBib3RoIGNvbWJpbmVkIG1lc3NhZ2VzIG11c3QgaGF2ZSB0aGUgc2FtZSB0YXJnZXQgYWRkcmVzcyAqLworI2RlZmluZSBJMkNfQVFfQ09NQl9TQU1FX0FERFIJCUJJVCgzKQorLyogY29udmVuaWVuY2UgbWFjcm8gZm9yIHR5cGljYWwgd3JpdGUtdGhlbiByZWFkIGNhc2UgKi8KKyNkZWZpbmUgSTJDX0FRX0NPTUJfV1JJVEVfVEhFTl9SRUFECShJMkNfQVFfQ09NQiB8IEkyQ19BUV9DT01CX1dSSVRFX0ZJUlNUIHwgXAorCQkJCQkgSTJDX0FRX0NPTUJfUkVBRF9TRUNPTkQgfCBJMkNfQVFfQ09NQl9TQU1FX0FERFIpCisKIC8qCiAgKiBpMmNfYWRhcHRlciBpcyB0aGUgc3RydWN0dXJlIHVzZWQgdG8gaWRlbnRpZnkgYSBwaHlzaWNhbCBpMmMgYnVzIGFsb25nCiAgKiB3aXRoIHRoZSBhY2Nlc3MgYWxnb3JpdGhtcyBuZWNlc3NhcnkgdG8gYWNjZXNzIGl0LgpAQCAtNDc0LDYgKzUxNiw3IEBACiAJc3RydWN0IGxpc3RfaGVhZCB1c2Vyc3BhY2VfY2xpZW50czsKIAogCXN0cnVjdCBpMmNfYnVzX3JlY292ZXJ5X2luZm8gKmJ1c19yZWNvdmVyeV9pbmZvOworCWNvbnN0IHN0cnVjdCBpMmNfYWRhcHRlcl9xdWlya3MgKnF1aXJrczsKIH07CiAjZGVmaW5lIHRvX2kyY19hZGFwdGVyKGQpIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgaTJjX2FkYXB0ZXIsIGRldikKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZWVlODAyMTU0LmggYi9pbmNsdWRlL2xpbnV4L2llZWU4MDIxNTQuaAppbmRleCA2ZTgyZDg4Li44ODcyY2ExIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2llZWU4MDIxNTQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2llZWU4MDIxNTQuaApAQCAtMjgsNyArMjgsOSBAQAogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KIAogI2RlZmluZSBJRUVFODAyMTU0X01UVQkJCTEyNwotI2RlZmluZSBJRUVFODAyMTU0X01JTl9QU0RVX0xFTgkJNQorI2RlZmluZSBJRUVFODAyMTU0X0FDS19QU0RVX0xFTgkJNQorI2RlZmluZSBJRUVFODAyMTU0X01JTl9QU0RVX0xFTgkJOQorI2RlZmluZSBJRUVFODAyMTU0X0ZDU19MRU4JCTIKIAogI2RlZmluZSBJRUVFODAyMTU0X1BBTl9JRF9CUk9BRENBU1QJMHhmZmZmCiAjZGVmaW5lIElFRUU4MDIxNTRfQUREUl9TSE9SVF9CUk9BRENBU1QJMHhmZmZmCkBAIC0zOCw2ICs0MCw3IEBACiAKICNkZWZpbmUgSUVFRTgwMjE1NF9MSUZTX1BFUklPRAkJNDAKICNkZWZpbmUgSUVFRTgwMjE1NF9TSUZTX1BFUklPRAkJMTIKKyNkZWZpbmUgSUVFRTgwMjE1NF9NQVhfU0lGU19GUkFNRV9TSVpFCTE4CiAKICNkZWZpbmUgSUVFRTgwMjE1NF9NQVhfQ0hBTk5FTAkJMjYKICNkZWZpbmUgSUVFRTgwMjE1NF9NQVhfUEFHRQkJMzEKQEAgLTIwNCwxMSArMjA3LDE4IEBACiAKIC8qKgogICogaWVlZTgwMjE1NF9pc192YWxpZF9wc2R1X2xlbiAtIGNoZWNrIGlmIHBzZHUgbGVuIGlzIHZhbGlkCisgKiBhdmFpbGFibGUgbGVuZ3RoczoKKyAqCTAtNAlSZXNlcnZlZAorICoJNQlNUERVIChBY2tub3dsZWRnbWVudCkKKyAqCTYtOAlSZXNlcnZlZAorICoJOS0xMjcJTVBEVQorICoKICAqIEBsZW46IHBzZHUgbGVuIHdpdGggKE1IUiArIHBheWxvYWQgKyBNRlIpCiAgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBpZWVlODAyMTU0X2lzX3ZhbGlkX3BzZHVfbGVuKGNvbnN0IHU4IGxlbikKIHsKLQlyZXR1cm4gKGxlbiA+PSBJRUVFODAyMTU0X01JTl9QU0RVX0xFTiAmJiBsZW4gPD0gSUVFRTgwMjE1NF9NVFUpOworCXJldHVybiAobGVuID09IElFRUU4MDIxNTRfQUNLX1BTRFVfTEVOIHx8CisJCShsZW4gPj0gSUVFRTgwMjE1NF9NSU5fUFNEVV9MRU4gJiYgbGVuIDw9IElFRUU4MDIxNTRfTVRVKSk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaCBiL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmgKaW5kZXggYTU3YmNhMi4uZGFkOGIwMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9icmlkZ2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX2JyaWRnZS5oCkBAIC00NCw2ICs0NCw3IEBACiAjZGVmaW5lIEJSX1BST01JU0MJCUJJVCg3KQogI2RlZmluZSBCUl9QUk9YWUFSUAkJQklUKDgpCiAjZGVmaW5lIEJSX0xFQVJOSU5HX1NZTkMJQklUKDkpCisjZGVmaW5lIEJSX1BST1hZQVJQX1dJRkkJQklUKDEwKQogCiBleHRlcm4gdm9pZCBicmlvY3RsX3NldChpbnQgKCppb2N0bF9ob29rKShzdHJ1Y3QgbmV0ICosIHVuc2lnbmVkIGludCwgdm9pZCBfX3VzZXIgKikpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2xpbmsuaCBiL2luY2x1ZGUvbGludXgvaWZfbGluay5oCmluZGV4IDExOTEzMGUuLmRhNDkyOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfbGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfbGluay5oCkBAIC0xNCw1ICsxNCw2IEBACiAJX191MzIgbGlua3N0YXRlOwogCV9fdTMyIG1pbl90eF9yYXRlOwogCV9fdTMyIG1heF90eF9yYXRlOworCV9fdTMyIHJzc19xdWVyeV9lbjsKIH07CiAjZW5kaWYgLyogX0xJTlVYX0lGX0xJTktfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZl9wcHBveC5oIGIvaW5jbHVkZS9saW51eC9pZl9wcHBveC5oCmluZGV4IGFmZjdhZDguLjY2YTdkNzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfcHBwb3guaAorKysgYi9pbmNsdWRlL2xpbnV4L2lmX3BwcG94LmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wcHBfY2hhbm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPHVhcGkvbGludXgvaWZfcHBwb3guaD4KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcHBwb2VfaGRyICpwcHBvZV9oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTMyLDYgKzMzLDcgQEAKIAlzdHJ1Y3QgcHBwb2VfYWRkcglwYTsJICAvKiB3aGF0IHRoaXMgc29ja2V0IGlzIGJvdW5kIHRvKi8KIAlzdHJ1Y3Qgc29ja2FkZHJfcHBwb3gJcmVsYXk7CSAgLyogd2hhdCBzb2NrZXQgZGF0YSB3aWxsIGJlCiAJCQkJCSAgICAgcmVsYXllZCB0byAoUFBQb0UgcmVsYXlpbmcpICovCisJc3RydWN0IHdvcmtfc3RydWN0ICAgICAgcGFkdF93b3JrOy8qIFdvcmsgaXRlbSBmb3IgaGFuZGxpbmcgUEFEVCAqLwogfTsKIAogc3RydWN0IHBwdHBfb3B0IHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKaW5kZXggYjExYjI4YS4uOTIwZTQ0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKKysrIGIvaW5jbHVkZS9saW51eC9pZl92bGFuLmgKQEAgLTU2MSw0ICs1NjEsNzEgQEAKIAkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8yKTsKIH0KIAorLyoqCisgKiBza2Jfdmxhbl90YWdnZWQgLSBjaGVjayBpZiBza2IgaXMgdmxhbiB0YWdnZWQuCisgKiBAc2tiOiBza2J1ZmYgdG8gcXVlcnkKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNrYiBpcyB0YWdnZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBpdCBpcyBoYXJkd2FyZQorICogYWNjZWxlcmF0ZWQgb3Igbm90LgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgc2tiX3ZsYW5fdGFnZ2VkKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKCFza2Jfdmxhbl90YWdfcHJlc2VudChza2IpICYmCisJICAgIGxpa2VseShza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFRKSAmJgorCQkgICBza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBza2Jfdmxhbl90YWdnZWRfbXVsdGkgLSBjaGVjayBpZiBza2IgaXMgdmxhbiB0YWdnZWQgd2l0aCBtdWx0aXBsZSBoZWFkZXJzLgorICogQHNrYjogc2tidWZmIHRvIHF1ZXJ5CisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBza2IgaXMgdGFnZ2VkIHdpdGggbXVsdGlwbGUgdmxhbiBoZWFkZXJzLCByZWdhcmRsZXNzCisgKiBvZiB3aGV0aGVyIGl0IGlzIGhhcmR3YXJlIGFjY2VsZXJhdGVkIG9yIG5vdC4KKyAqLworc3RhdGljIGlubGluZSBib29sIHNrYl92bGFuX3RhZ2dlZF9tdWx0aShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCV9fYmUxNiBwcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7CisKKwlpZiAoIXNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKKwkJc3RydWN0IHZsYW5fZXRoaGRyICp2ZWg7CisKKwkJaWYgKGxpa2VseShwcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYKKwkJCSAgIHByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFBRCkpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXZlaCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKilza2ItPmRhdGE7CisJCXByb3RvY29sID0gdmVoLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvOworCX0KKworCWlmIChwcm90b2NvbCAhPSBodG9ucyhFVEhfUF84MDIxUSkgJiYgcHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMUFEKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogdmxhbl9mZWF0dXJlc19jaGVjayAtIGRyb3AgdW5zYWZlIGZlYXR1cmVzIGZvciBza2Igd2l0aCBtdWx0aXBsZSB0YWdzLgorICogQHNrYjogc2tidWZmIHRvIHF1ZXJ5CisgKiBAZmVhdHVyZXM6IGZlYXR1cmVzIHRvIGJlIGNoZWNrZWQKKyAqCisgKiBSZXR1cm5zIGZlYXR1cmVzIHdpdGhvdXQgdW5zYWZlIG9uZXMgaWYgdGhlIHNrYiBoYXMgbXVsdGlwbGUgdGFncy4KKyAqLworc3RhdGljIGlubGluZSBuZXRkZXZfZmVhdHVyZXNfdCB2bGFuX2ZlYXR1cmVzX2NoZWNrKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCit7CisJaWYgKHNrYl92bGFuX3RhZ2dlZF9tdWx0aShza2IpKQorCQlmZWF0dXJlcyA9IG5ldGRldl9pbnRlcnNlY3RfZmVhdHVyZXMoZmVhdHVyZXMsCisJCQkJCQkgICAgIE5FVElGX0ZfU0cgfAorCQkJCQkJICAgICBORVRJRl9GX0hJR0hETUEgfAorCQkJCQkJICAgICBORVRJRl9GX0ZSQUdMSVNUIHwKKwkJCQkJCSAgICAgTkVUSUZfRl9HRU5fQ1NVTSB8CisJCQkJCQkgICAgIE5FVElGX0ZfSFdfVkxBTl9DVEFHX1RYIHwKKwkJCQkJCSAgICAgTkVUSUZfRl9IV19WTEFOX1NUQUdfVFgpOworCisJcmV0dXJuIGZlYXR1cmVzOworfQorCiAjZW5kaWYgLyogIShfTElOVVhfSUZfVkxBTl9IXykgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWlvL2J1ZmZlci5oIGIvaW5jbHVkZS9saW51eC9paW8vYnVmZmVyLmgKaW5kZXggYjY1ODUwYS4uZWI4NjIyYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vYnVmZmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9paW8vYnVmZmVyLmgKQEAgLTIxLDggKzIxLDggQEAKICAqIHN0cnVjdCBpaW9fYnVmZmVyX2FjY2Vzc19mdW5jcyAtIGFjY2VzcyBmdW5jdGlvbnMgZm9yIGJ1ZmZlcnMuCiAgKiBAc3RvcmVfdG86CQlhY3R1YWxseSBzdG9yZSBzdHVmZiB0byB0aGUgYnVmZmVyCiAgKiBAcmVhZF9maXJzdF9uOgl0cnkgdG8gZ2V0IGEgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyAobXVzdCBleGlzdCkKLSAqIEBkYXRhX2F2YWlsYWJsZToJaW5kaWNhdGVzIHdoZXRoZXIgZGF0YSBmb3IgcmVhZGluZyBmcm9tIHRoZSBidWZmZXIgaXMKLSAqCQkJYXZhaWxhYmxlLgorICogQGRhdGFfYXZhaWxhYmxlOglpbmRpY2F0ZXMgaG93IG11Y2ggZGF0YSBpcyBhdmFpbGFibGUgZm9yIHJlYWRpbmcgZnJvbQorICoJCQl0aGUgYnVmZmVyLgogICogQHJlcXVlc3RfdXBkYXRlOglpZiBhIHBhcmFtZXRlciBjaGFuZ2UgaGFzIGJlZW4gbWFya2VkLCB1cGRhdGUgdW5kZXJseWluZwogICoJCQlzdG9yYWdlLgogICogQHNldF9ieXRlc19wZXJfZGF0dW06c2V0IG51bWJlciBvZiBieXRlcyBwZXIgZGF0dW0KQEAgLTQzLDcgKzQzLDcgQEAKIAlpbnQgKCpyZWFkX2ZpcnN0X24pKHN0cnVjdCBpaW9fYnVmZmVyICpidWZmZXIsCiAJCQkgICAgc2l6ZV90IG4sCiAJCQkgICAgY2hhciBfX3VzZXIgKmJ1Zik7Ci0JYm9vbCAoKmRhdGFfYXZhaWxhYmxlKShzdHJ1Y3QgaWlvX2J1ZmZlciAqYnVmZmVyKTsKKwlzaXplX3QgKCpkYXRhX2F2YWlsYWJsZSkoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlcik7CiAKIAlpbnQgKCpyZXF1ZXN0X3VwZGF0ZSkoc3RydWN0IGlpb19idWZmZXIgKmJ1ZmZlcik7CiAKQEAgLTcyLDYgKzcyLDcgQEAKICAqIEBkZW11eF9ib3VuY2U6CVtJTlRFUk5dIGJ1ZmZlciBmb3IgZG9pbmcgZ2F0aGVyIGZyb20gaW5jb21pbmcgc2Nhbi4KICAqIEBidWZmZXJfbGlzdDoJW0lOVEVSTl0gZW50cnkgaW4gdGhlIGRldmljZXMgbGlzdCBvZiBjdXJyZW50IGJ1ZmZlcnMuCiAgKiBAcmVmOgkJW0lOVEVSTl0gcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBidWZmZXIuCisgKiBAd2F0ZXJtYXJrOgkJW0lOVEVSTl0gbnVtYmVyIG9mIGRhdHVtcyB0byB3YWl0IGZvciBwb2xsL3JlYWQuCiAgKi8KIHN0cnVjdCBpaW9fYnVmZmVyIHsKIAlpbnQJCQkJCWxlbmd0aDsKQEAgLTkwLDYgKzkxLDcgQEAKIAl2b2lkCQkJCQkqZGVtdXhfYm91bmNlOwogCXN0cnVjdCBsaXN0X2hlYWQJCQlidWZmZXJfbGlzdDsKIAlzdHJ1Y3Qga3JlZgkJCQlyZWY7CisJdW5zaWduZWQgaW50CQkJCXdhdGVybWFyazsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9paW8vZGFjL21heDUxNy5oIGIvaW5jbHVkZS9saW51eC9paW8vZGFjL21heDUxNy5oCmluZGV4IGY2ZDFkMjUuLjc2Njg3MTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWlvL2RhYy9tYXg1MTcuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lpby9kYWMvbWF4NTE3LmgKQEAgLTksNyArOSw3IEBACiAjZGVmaW5lIElJT19EQUNfTUFYNTE3X0hfCiAKIHN0cnVjdCBtYXg1MTdfcGxhdGZvcm1fZGF0YSB7Ci0JdTE2CQkJCXZyZWZfbXZbMl07CisJdTE2CQkJCXZyZWZfbXZbOF07CiB9OwogCiAjZW5kaWYgLyogSUlPX0RBQ19NQVg1MTdfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWlvL2V2ZW50cy5oIGIvaW5jbHVkZS9saW51eC9paW8vZXZlbnRzLmgKaW5kZXggMDNmYTMzMi4uOGFkODdkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9paW8vZXZlbnRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9paW8vZXZlbnRzLmgKQEAgLTksMjIgKzksOCBAQAogI2lmbmRlZiBfSUlPX0VWRU5UU19IXwogI2RlZmluZSBfSUlPX0VWRU5UU19IXwogCi0jaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lpby90eXBlcy5oPgotCi0vKioKLSAqIHN0cnVjdCBpaW9fZXZlbnRfZGF0YSAtIFRoZSBhY3R1YWwgZXZlbnQgYmVpbmcgcHVzaGVkIHRvIHVzZXJzcGFjZQotICogQGlkOgkJZXZlbnQgaWRlbnRpZmllcgotICogQHRpbWVzdGFtcDoJYmVzdCBlc3RpbWF0ZSBvZiB0aW1lIG9mIGV2ZW50IG9jY3VycmVuY2UgKG9mdGVuIGZyb20KLSAqCQl0aGUgaW50ZXJydXB0IGhhbmRsZXIpCi0gKi8KLXN0cnVjdCBpaW9fZXZlbnRfZGF0YSB7Ci0JX191NjQJaWQ7Ci0JX19zNjQJdGltZXN0YW1wOwotfTsKLQotI2RlZmluZSBJSU9fR0VUX0VWRU5UX0ZEX0lPQ1RMIF9JT1IoJ2knLCAweDkwLCBpbnQpCisjaW5jbHVkZSA8dWFwaS9saW51eC9paW8vZXZlbnRzLmg+CiAKIC8qKgogICogSUlPX0VWRU5UX0NPREUoKSAtIGNyZWF0ZSBldmVudCBpZGVudGlmaWVyCkBAIC03MCwxOCArNTYsNCBAQAogI2RlZmluZSBJSU9fVU5NT0RfRVZFTlRfQ09ERShjaGFuX3R5cGUsIG51bWJlciwgdHlwZSwgZGlyZWN0aW9uKQlcCiAJSUlPX0VWRU5UX0NPREUoY2hhbl90eXBlLCAwLCAwLCBkaXJlY3Rpb24sIHR5cGUsIG51bWJlciwgMCwgMCkKIAotI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX1RZUEUobWFzaykgKChtYXNrID4+IDU2KSAmIDB4RkYpCi0KLSNkZWZpbmUgSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9ESVIobWFzaykgKChtYXNrID4+IDQ4KSAmIDB4N0YpCi0KLSNkZWZpbmUgSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9DSEFOX1RZUEUobWFzaykgKChtYXNrID4+IDMyKSAmIDB4RkYpCi0KLS8qIEV2ZW50IGNvZGUgbnVtYmVyIGV4dHJhY3Rpb24gZGVwZW5kcyBvbiB3aGljaCB0eXBlIG9mIGV2ZW50IHdlIGhhdmUuCi0gKiBQZXJoYXBzIHJldmlldyB0aGlzIGZ1bmN0aW9uIGluIHRoZSBmdXR1cmUqLwotI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0NIQU4obWFzaykgKChfX3MxNikobWFzayAmIDB4RkZGRikpCi0jZGVmaW5lIElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfQ0hBTjIobWFzaykgKChfX3MxNikoKChtYXNrKSA+PiAxNikgJiAweEZGRkYpKQotCi0jZGVmaW5lIElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfTU9ESUZJRVIobWFzaykgKChtYXNrID4+IDQwKSAmIDB4RkYpCi0jZGVmaW5lIElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfRElGRihtYXNrKSAoKChtYXNrKSA+PiA1NSkgJiAweDEpCi0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9paW8vaWlvLmggYi9pbmNsdWRlL2xpbnV4L2lpby9paW8uaAppbmRleCA4MGQ4NTUwLi5kODZiNzUzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lpby9paW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L2lpby9paW8uaApAQCAtMzM4LDYgKzMzOCwxNiBAQAogICoJCQlwcm92aWRlIGEgY3VzdG9tIG9mX3hsYXRlIGZ1bmN0aW9uIHRoYXQgcmVhZHMgdGhlCiAgKgkJCSphcmdzKiBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaW5kZXggaW4gcmVnaXN0ZXJlZAogICoJCQlJSU8gY2hhbm5lbHMgYXJyYXkuCisgKiBAaHdmaWZvX3NldF93YXRlcm1hcms6IGZ1bmN0aW9uIHBvaW50ZXIgdG8gc2V0IHRoZSBjdXJyZW50IGhhcmR3YXJlCisgKgkJCWZpZm8gd2F0ZXJtYXJrIGxldmVsOyBzZWUgaHdmaWZvXyogZW50cmllcyBpbgorICoJCQlEb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1paW8gZm9yIGRldGFpbHMgb24KKyAqCQkJaG93IHRoZSBoYXJkd2FyZSBmaWZvIG9wZXJhdGVzCisgKiBAaHdmaWZvX2ZsdXNoX3RvX2J1ZmZlcjogZnVuY3Rpb24gcG9pbnRlciB0byBmbHVzaCB0aGUgc2FtcGxlcyBzdG9yZWQKKyAqCQkJaW4gdGhlIGhhcmR3YXJlIGZpZm8gdG8gdGhlIGRldmljZSBidWZmZXIuIFRoZSBkcml2ZXIKKyAqCQkJc2hvdWxkIG5vdCBmbHVzaCBtb3JlIHRoYW4gY291bnQgc2FtcGxlcy4gVGhlIGZ1bmN0aW9uCisgKgkJCW11c3QgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBmbHVzaGVkLCAwIGlmIG5vCisgKgkJCXNhbXBsZXMgd2VyZSBmbHVzaGVkIG9yIGEgbmVnYXRpdmUgaW50ZWdlciBpZiBubyBzYW1wbGVzCisgKgkJCXdlcmUgZmx1c2hlZCBhbmQgdGhlcmUgd2FzIGFuIGVycm9yLgogICoqLwogc3RydWN0IGlpb19pbmZvIHsKIAlzdHJ1Y3QgbW9kdWxlCQkJKmRyaXZlcl9tb2R1bGU7CkBAIC0zOTksNiArNDA5LDkgQEAKIAkJCQkgIHVuc2lnbmVkICpyZWFkdmFsKTsKIAlpbnQgKCpvZl94bGF0ZSkoc3RydWN0IGlpb19kZXYgKmluZGlvX2RldiwKIAkJCWNvbnN0IHN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgKmlpb3NwZWMpOworCWludCAoKmh3Zmlmb19zZXRfd2F0ZXJtYXJrKShzdHJ1Y3QgaWlvX2RldiAqaW5kaW9fZGV2LCB1bnNpZ25lZCB2YWwpOworCWludCAoKmh3Zmlmb19mbHVzaF90b19idWZmZXIpKHN0cnVjdCBpaW9fZGV2ICppbmRpb19kZXYsCisJCQkJICAgICAgdW5zaWduZWQgY291bnQpOwogfTsKIAogLyoqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lpby90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9paW8vdHlwZXMuaAppbmRleCA1ODBlZDViLi45NDJiNmRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lpby90eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvaWlvL3R5cGVzLmgKQEAgLTEwLDc2ICsxMCw3IEBACiAjaWZuZGVmIF9JSU9fVFlQRVNfSF8KICNkZWZpbmUgX0lJT19UWVBFU19IXwogCi1lbnVtIGlpb19jaGFuX3R5cGUgewotCUlJT19WT0xUQUdFLAotCUlJT19DVVJSRU5ULAotCUlJT19QT1dFUiwKLQlJSU9fQUNDRUwsCi0JSUlPX0FOR0xfVkVMLAotCUlJT19NQUdOLAotCUlJT19MSUdIVCwKLQlJSU9fSU5URU5TSVRZLAotCUlJT19QUk9YSU1JVFksCi0JSUlPX1RFTVAsCi0JSUlPX0lOQ0xJLAotCUlJT19ST1QsCi0JSUlPX0FOR0wsCi0JSUlPX1RJTUVTVEFNUCwKLQlJSU9fQ0FQQUNJVEFOQ0UsCi0JSUlPX0FMVFZPTFRBR0UsCi0JSUlPX0NDVCwKLQlJSU9fUFJFU1NVUkUsCi0JSUlPX0hVTUlESVRZUkVMQVRJVkUsCi0JSUlPX0FDVElWSVRZLAotCUlJT19TVEVQUywKLQlJSU9fRU5FUkdZLAotCUlJT19ESVNUQU5DRSwKLQlJSU9fVkVMT0NJVFksCi19OwotCi1lbnVtIGlpb19tb2RpZmllciB7Ci0JSUlPX05PX01PRCwKLQlJSU9fTU9EX1gsCi0JSUlPX01PRF9ZLAotCUlJT19NT0RfWiwKLQlJSU9fTU9EX1hfQU5EX1ksCi0JSUlPX01PRF9YX0FORF9aLAotCUlJT19NT0RfWV9BTkRfWiwKLQlJSU9fTU9EX1hfQU5EX1lfQU5EX1osCi0JSUlPX01PRF9YX09SX1ksCi0JSUlPX01PRF9YX09SX1osCi0JSUlPX01PRF9ZX09SX1osCi0JSUlPX01PRF9YX09SX1lfT1JfWiwKLQlJSU9fTU9EX0xJR0hUX0JPVEgsCi0JSUlPX01PRF9MSUdIVF9JUiwKLQlJSU9fTU9EX1JPT1RfU1VNX1NRVUFSRURfWF9ZLAotCUlJT19NT0RfU1VNX1NRVUFSRURfWF9ZX1osCi0JSUlPX01PRF9MSUdIVF9DTEVBUiwKLQlJSU9fTU9EX0xJR0hUX1JFRCwKLQlJSU9fTU9EX0xJR0hUX0dSRUVOLAotCUlJT19NT0RfTElHSFRfQkxVRSwKLQlJSU9fTU9EX1FVQVRFUk5JT04sCi0JSUlPX01PRF9URU1QX0FNQklFTlQsCi0JSUlPX01PRF9URU1QX09CSkVDVCwKLQlJSU9fTU9EX05PUlRIX01BR04sCi0JSUlPX01PRF9OT1JUSF9UUlVFLAotCUlJT19NT0RfTk9SVEhfTUFHTl9USUxUX0NPTVAsCi0JSUlPX01PRF9OT1JUSF9UUlVFX1RJTFRfQ09NUCwKLQlJSU9fTU9EX1JVTk5JTkcsCi0JSUlPX01PRF9KT0dHSU5HLAotCUlJT19NT0RfV0FMS0lORywKLQlJSU9fTU9EX1NUSUxMLAotCUlJT19NT0RfUk9PVF9TVU1fU1FVQVJFRF9YX1lfWiwKLX07Ci0KLWVudW0gaWlvX2V2ZW50X3R5cGUgewotCUlJT19FVl9UWVBFX1RIUkVTSCwKLQlJSU9fRVZfVFlQRV9NQUcsCi0JSUlPX0VWX1RZUEVfUk9DLAotCUlJT19FVl9UWVBFX1RIUkVTSF9BREFQVElWRSwKLQlJSU9fRVZfVFlQRV9NQUdfQURBUFRJVkUsCi0JSUlPX0VWX1RZUEVfQ0hBTkdFLAotfTsKKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2lpby90eXBlcy5oPgogCiBlbnVtIGlpb19ldmVudF9pbmZvIHsKIAlJSU9fRVZfSU5GT19FTkFCTEUsCkBAIC04OCwxMyArMTksNiBAQAogCUlJT19FVl9JTkZPX1BFUklPRCwKIH07CiAKLWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiB7Ci0JSUlPX0VWX0RJUl9FSVRIRVIsCi0JSUlPX0VWX0RJUl9SSVNJTkcsCi0JSUlPX0VWX0RJUl9GQUxMSU5HLAotCUlJT19FVl9ESVJfTk9ORSwKLX07Ci0KICNkZWZpbmUgSUlPX1ZBTF9JTlQgMQogI2RlZmluZSBJSU9fVkFMX0lOVF9QTFVTX01JQ1JPIDIKICNkZWZpbmUgSUlPX1ZBTF9JTlRfUExVU19OQU5PIDMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmggYi9pbmNsdWRlL2xpbnV4L2luZXRfZGlhZy5oCmluZGV4IDQ2ZGEwMjQuLmFjNDhiMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbmV0X2RpYWcuaApAQCAtMTEsMzMgKzExLDM0IEBACiBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjazsKIAogc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyIHsKLQl2b2lkCQkJKCpkdW1wKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCi0JCQkJCXN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLAotCQkJCQlzdHJ1Y3QgbmxhdHRyICpiYyk7CisJdm9pZAkJKCpkdW1wKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCQljb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwKKwkJCQlzdHJ1Y3QgbmxhdHRyICpiYyk7CiAKLQlpbnQJCQkoKmR1bXBfb25lKShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAotCQkJCQljb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKLQkJCQkJc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSk7CisJaW50CQkoKmR1bXBfb25lKShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAorCQkJCSAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSk7CiAKLQl2b2lkCQkJKCppZGlhZ19nZXRfaW5mbykoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJICBzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqciwKLQkJCQkJCSAgdm9pZCAqaW5mbyk7Ci0JX191MTYgICAgICAgICAgICAgICAgICAgaWRpYWdfdHlwZTsKKwl2b2lkCQkoKmlkaWFnX2dldF9pbmZvKShzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgc3RydWN0IGluZXRfZGlhZ19tc2cgKnIsCisJCQkJCSAgdm9pZCAqaW5mbyk7CisJX191MTYJCWlkaWFnX3R5cGU7CiB9OwogCiBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2s7CiBpbnQgaW5ldF9za19kaWFnX2ZpbGwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2ssCi0JCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxLAotCQkJICAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAotCQkJICAgICAgdTMyIHBpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAotCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKTsKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKKwkJICAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAorCQkgICAgICB1MzIgcGlkLCB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCk7CiB2b2lkIGluZXRfZGlhZ19kdW1wX2ljc2soc3RydWN0IGluZXRfaGFzaGluZm8gKmgsIHN0cnVjdCBza19idWZmICpza2IsCi0JCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIsCi0JCXN0cnVjdCBubGF0dHIgKmJjKTsKKwkJCSBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQkgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIsCisJCQkgc3RydWN0IG5sYXR0ciAqYmMpOwogaW50IGluZXRfZGlhZ19kdW1wX29uZV9pY3NrKHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbywKLQkJc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCi0JCXN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpOworCQkJICAgIHN0cnVjdCBza19idWZmICppbl9za2IsIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLAorCQkJICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpOwogCiBpbnQgaW5ldF9kaWFnX2JjX3NrKGNvbnN0IHN0cnVjdCBubGF0dHIgKl9iYywgc3RydWN0IHNvY2sgKnNrKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0LmggYi9pbmNsdWRlL2xpbnV4L2luaXQuaAppbmRleCAyZGY4ZThkLi4yMWI2ZDc2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2luaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2luaXQuaApAQCAtMjUzLDIxICsyNTMsNDEgQEAKICAqIG9ic19rZXJuZWxfcGFyYW0gImFycmF5IiB0b28gZmFyIGFwYXJ0IGluIC5pbml0LnNldHVwLgogICovCiAjZGVmaW5lIF9fc2V0dXBfcGFyYW0oc3RyLCB1bmlxdWVfaWQsIGZuLCBlYXJseSkJCQlcCi0Jc3RhdGljIGNvbnN0IGNoYXIgX19zZXR1cF9zdHJfIyN1bmlxdWVfaWRbXSBfX2luaXRjb25zdAlcCi0JCV9fYWxpZ25lZCgxKSA9IHN0cjsgXAotCXN0YXRpYyBzdHJ1Y3Qgb2JzX2tlcm5lbF9wYXJhbSBfX3NldHVwXyMjdW5pcXVlX2lkCVwKLQkJX191c2VkIF9fc2VjdGlvbiguaW5pdC5zZXR1cCkJCQlcCi0JCV9fYXR0cmlidXRlX18oKGFsaWduZWQoKHNpemVvZihsb25nKSkpKSkJXAorCXN0YXRpYyBjb25zdCBjaGFyIF9fc2V0dXBfc3RyXyMjdW5pcXVlX2lkW10gX19pbml0Y29uc3QJCVwKKwkJX19hbGlnbmVkKDEpID0gc3RyOyAJCQkJCVwKKwlzdGF0aWMgc3RydWN0IG9ic19rZXJuZWxfcGFyYW0gX19zZXR1cF8jI3VuaXF1ZV9pZAkJXAorCQlfX3VzZWQgX19zZWN0aW9uKC5pbml0LnNldHVwKQkJCQlcCisJCV9fYXR0cmlidXRlX18oKGFsaWduZWQoKHNpemVvZihsb25nKSkpKSkJCVwKIAkJPSB7IF9fc2V0dXBfc3RyXyMjdW5pcXVlX2lkLCBmbiwgZWFybHkgfQogCi0jZGVmaW5lIF9fc2V0dXAoc3RyLCBmbikJCQkJCVwKKyNkZWZpbmUgX19zZXR1cChzdHIsIGZuKQkJCQkJCVwKIAlfX3NldHVwX3BhcmFtKHN0ciwgZm4sIGZuLCAwKQogCi0vKiBOT1RFOiBmbiBpcyBhcyBwZXIgbW9kdWxlX3BhcmFtLCBub3QgX19zZXR1cCEgIEVtaXRzIHdhcm5pbmcgaWYgZm4KLSAqIHJldHVybnMgbm9uLXplcm8uICovCi0jZGVmaW5lIGVhcmx5X3BhcmFtKHN0ciwgZm4pCQkJCQlcCisvKgorICogTk9URTogZm4gaXMgYXMgcGVyIG1vZHVsZV9wYXJhbSwgbm90IF9fc2V0dXAhCisgKiBFbWl0cyB3YXJuaW5nIGlmIGZuIHJldHVybnMgbm9uLXplcm8uCisgKi8KKyNkZWZpbmUgZWFybHlfcGFyYW0oc3RyLCBmbikJCQkJCQlcCiAJX19zZXR1cF9wYXJhbShzdHIsIGZuLCBmbiwgMSkKIAorI2RlZmluZSBlYXJseV9wYXJhbV9vbl9vZmYoc3RyX29uLCBzdHJfb2ZmLCB2YXIsIGNvbmZpZykJCVwKKwkJCQkJCQkJCVwKKwlpbnQgdmFyID0gSVNfRU5BQkxFRChjb25maWcpOwkJCQkJXAorCQkJCQkJCQkJXAorCXN0YXRpYyBpbnQgX19pbml0IHBhcnNlXyMjdmFyIyNfb24oY2hhciAqYXJnKQkJCVwKKwl7CQkJCQkJCQlcCisJCXZhciA9IDE7CQkJCQkJXAorCQlyZXR1cm4gMDsJCQkJCQlcCisJfQkJCQkJCQkJXAorCV9fc2V0dXBfcGFyYW0oc3RyX29uLCBwYXJzZV8jI3ZhciMjX29uLCBwYXJzZV8jI3ZhciMjX29uLCAxKTsJXAorCQkJCQkJCQkJXAorCXN0YXRpYyBpbnQgX19pbml0IHBhcnNlXyMjdmFyIyNfb2ZmKGNoYXIgKmFyZykJCQlcCisJewkJCQkJCQkJXAorCQl2YXIgPSAwOwkJCQkJCVwKKwkJcmV0dXJuIDA7CQkJCQkJXAorCX0JCQkJCQkJCVwKKwlfX3NldHVwX3BhcmFtKHN0cl9vZmYsIHBhcnNlXyMjdmFyIyNfb2ZmLCBwYXJzZV8jI3ZhciMjX29mZiwgMSkKKwogLyogUmVsaWVzIG9uIGJvb3RfY29tbWFuZF9saW5lIGJlaW5nIHNldCAqLwogdm9pZCBfX2luaXQgcGFyc2VfZWFybHlfcGFyYW0odm9pZCk7CiB2b2lkIF9faW5pdCBwYXJzZV9lYXJseV9vcHRpb25zKGNoYXIgKmNtZGxpbmUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlbF9taWRfZG1hLmggYi9pbmNsdWRlL2xpbnV4L2ludGVsX21pZF9kbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0OTZiZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L2ludGVsX21pZF9kbWEuaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiAgaW50ZWxfbWlkX2RtYS5oIC0gSW50ZWwgTUlEIERNQSBEcml2ZXJzCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOC0xMCBJbnRlbCBDb3JwCi0gKiAgQXV0aG9yOiBWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4KLSAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKgotICovCi0jaWZuZGVmIF9fSU5URUxfTUlEX0RNQV9IX18KLSNkZWZpbmUgX19JTlRFTF9NSURfRE1BX0hfXwotCi0jaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Ci0KLSNkZWZpbmUgRE1BX1BSRVBfQ0lSQ1VMQVJfTElTVAkJKDEgPDwgMTApCi0KLS8qRE1BIG1vZGUgY29uZmlndXJhdGlvbnMqLwotZW51bSBpbnRlbF9taWRfZG1hX21vZGUgewotCUxOV19ETUFfUEVSX1RPX01FTSA9IDAsIC8qcGVyaXBocmFsIHRvIG1lbW9yeSBjb25maWd1cmF0aW9uKi8KLQlMTldfRE1BX01FTV9UT19QRVIsCS8qbWVtb3J5IHRvIHBlcmlwaHJhbCBjb25maWd1cmF0aW9uKi8KLQlMTldfRE1BX01FTV9UT19NRU0sCS8qbWVtIHRvIG1lbSBjb25mZyAodGVzdGluZyBvbmx5KSovCi19OwotCi0vKkRNQSBoYW5kc2hha2luZyovCi1lbnVtIGludGVsX21pZF9kbWFfaHNfbW9kZSB7Ci0JTE5XX0RNQV9IV19IUyA9IDAsCS8qSFcgSGFuZHNoYWtpbmcgb25seSovCi0JTE5XX0RNQV9TV19IUyA9IDEsCS8qU1cgSGFuZHNoYWtpbmcgbm90IHJlY29tbWVuZGVkKi8KLX07Ci0KLS8qQnVyc3Qgc2l6ZSBjb25maWd1cmF0aW9uKi8KLWVudW0gaW50ZWxfbWlkX2RtYV9tc2l6ZSB7Ci0JTE5XX0RNQV9NU0laRV8xID0gMHgwLAotCUxOV19ETUFfTVNJWkVfNCA9IDB4MSwKLQlMTldfRE1BX01TSVpFXzggPSAweDIsCi0JTE5XX0RNQV9NU0laRV8xNiA9IDB4MywKLQlMTldfRE1BX01TSVpFXzMyID0gMHg0LAotCUxOV19ETUFfTVNJWkVfNjQgPSAweDUsCi19OwotCi0vKioKLSAqIHN0cnVjdCBpbnRlbF9taWRfZG1hX3NsYXZlIC0gRE1BIHNsYXZlIHN0cnVjdHVyZQotICoKLSAqIEBkaXJuOiBETUEgdHJmIGRpcmVjdGlvbgotICogQHNyY193aWR0aDogdHggcmVnaXN0ZXIgd2lkdGgKLSAqIEBkc3Rfd2lkdGg6IHJ4IHJlZ2lzdGVyIHdpZHRoCi0gKiBAaHNfbW9kZTogSFcvU1cgaGFuZHNoYWtpbmcgbW9kZQotICogQGNmZ19tb2RlOiBETUEgZGF0YSB0cmFuc2ZlciBtb2RlIChwZXItcGVyL21lbS1wZXIvbWVtLW1lbSkKLSAqIEBzcmNfbXNpemU6IFNvdXJjZSBETUEgYnVyc3Qgc2l6ZQotICogQGRzdF9tc2l6ZTogRHN0IERNQSBidXJzdCBzaXplCi0gKiBAcGVyX2FkZHI6IFBlcmlwaHJhbCBhZGRyZXNzCi0gKiBAZGV2aWNlX2luc3RhbmNlOiBETUEgcGVyaXBoZXJhbCBkZXZpY2UgaW5zdGFuY2UsIHdlIGNhbiBoYXZlIG11bHRpcGxlCi0gKgkJcGVyaXBoZXJhbCBkZXZpY2UgY29ubmVjdGVkIHRvIHNpbmdsZSBETUFDCi0gKi8KLXN0cnVjdCBpbnRlbF9taWRfZG1hX3NsYXZlIHsKLQllbnVtIGludGVsX21pZF9kbWFfaHNfbW9kZQloc19tb2RlOyAgLypoYW5kc2hha2luZyovCi0JZW51bSBpbnRlbF9taWRfZG1hX21vZGUJCWNmZ19tb2RlOyAvKm1vZGUgY29uZmlndXJhdGlvbiovCi0JdW5zaWduZWQgaW50CQlkZXZpY2VfaW5zdGFuY2U7IC8qMCwgMSBmb3IgcGVyaXBocmFsIGluc3RhbmNlKi8KLQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZwkJZG1hX3NsYXZlOwotfTsKLQotI2VuZGlmIC8qX19JTlRFTF9NSURfRE1BX0hfXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oIGIvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAppbmRleCAyZTg4NTgwLi45NTBhZTQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKQEAgLTM5LDggKzM5LDYgQEAKICAqIFRoZXNlIGZsYWdzIHVzZWQgb25seSBieSB0aGUga2VybmVsIGFzIHBhcnQgb2YgdGhlCiAgKiBpcnEgaGFuZGxpbmcgcm91dGluZXMuCiAgKgotICogSVJRRl9ESVNBQkxFRCAtIGtlZXAgaXJxcyBkaXNhYmxlZCB3aGVuIGNhbGxpbmcgdGhlIGFjdGlvbiBoYW5kbGVyLgotICogICAgICAgICAgICAgICAgIERFUFJFQ0FURUQuIFRoaXMgZmxhZyBpcyBhIE5PT1AgYW5kIHNjaGVkdWxlZCB0byBiZSByZW1vdmVkCiAgKiBJUlFGX1NIQVJFRCAtIGFsbG93IHNoYXJpbmcgdGhlIGlycSBhbW9uZyBzZXZlcmFsIGRldmljZXMKICAqIElSUUZfUFJPQkVfU0hBUkVEIC0gc2V0IGJ5IGNhbGxlcnMgd2hlbiB0aGV5IGV4cGVjdCBzaGFyaW5nIG1pc21hdGNoZXMgdG8gb2NjdXIKICAqIElSUUZfVElNRVIgLSBGbGFnIHRvIG1hcmsgdGhpcyBpbnRlcnJ1cHQgYXMgdGltZXIgaW50ZXJydXB0CkBAIC02NCw3ICs2Miw2IEBACiAgKiAgICAgICAgICAgICAgICB3YWtldXAgZGV2aWNlcyB1c2VycyBuZWVkIHRvIGltcGxlbWVudCB3YWtldXAgZGV0ZWN0aW9uIGluCiAgKiAgICAgICAgICAgICAgICB0aGVpciBpbnRlcnJ1cHQgaGFuZGxlcnMuCiAgKi8KLSNkZWZpbmUgSVJRRl9ESVNBQkxFRAkJMHgwMDAwMDAyMAogI2RlZmluZSBJUlFGX1NIQVJFRAkJMHgwMDAwMDA4MAogI2RlZmluZSBJUlFGX1BST0JFX1NIQVJFRAkweDAwMDAwMTAwCiAjZGVmaW5lIF9fSVJRRl9USU1FUgkJMHgwMDAwMDIwMApAQCAtMTkxLDYgKzE4OCw3IEBACiAjZW5kaWYKIAogZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnFfbm9zeW5jKHVuc2lnbmVkIGludCBpcnEpOworZXh0ZXJuIGJvb2wgZGlzYWJsZV9oYXJkaXJxKHVuc2lnbmVkIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50IGlycSk7CiBleHRlcm4gdm9pZCBkaXNhYmxlX3BlcmNwdV9pcnEodW5zaWduZWQgaW50IGlycSk7CiBleHRlcm4gdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwpAQCAtMzYzLDYgKzM2MSwyMCBAQAogCXJldHVybiBpcnFfc2V0X2lycV93YWtlKGlycSwgMCk7CiB9CiAKKy8qCisgKiBpcnFfZ2V0X2lycWNoaXBfc3RhdGUvaXJxX3NldF9pcnFjaGlwX3N0YXRlIHNwZWNpZmljIGZsYWdzCisgKi8KK2VudW0gaXJxY2hpcF9pcnFfc3RhdGUgeworCUlSUUNISVBfU1RBVEVfUEVORElORywJCS8qIElzIGludGVycnVwdCBwZW5kaW5nPyAqLworCUlSUUNISVBfU1RBVEVfQUNUSVZFLAkJLyogSXMgaW50ZXJydXB0IGluIHByb2dyZXNzPyAqLworCUlSUUNISVBfU1RBVEVfTUFTS0VELAkJLyogSXMgaW50ZXJydXB0IG1hc2tlZD8gKi8KKwlJUlFDSElQX1NUQVRFX0xJTkVfTEVWRUwsCS8qIElzIElSUSBsaW5lIGhpZ2g/ICovCit9OworCitleHRlcm4gaW50IGlycV9nZXRfaXJxY2hpcF9zdGF0ZSh1bnNpZ25lZCBpbnQgaXJxLCBlbnVtIGlycWNoaXBfaXJxX3N0YXRlIHdoaWNoLAorCQkJCSBib29sICpzdGF0ZSk7CitleHRlcm4gaW50IGlycV9zZXRfaXJxY2hpcF9zdGF0ZSh1bnNpZ25lZCBpbnQgaXJxLCBlbnVtIGlycWNoaXBfaXJxX3N0YXRlIHdoaWNoLAorCQkJCSBib29sIHN0YXRlKTsKIAogI2lmZGVmIENPTkZJR19JUlFfRk9SQ0VEX1RIUkVBRElORwogZXh0ZXJuIGJvb2wgZm9yY2VfaXJxdGhyZWFkczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW8uaCBiL2luY2x1ZGUvbGludXgvaW8uaAppbmRleCBmYTAyZTU1Li40Y2MyOTljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvLmgKKysrIGIvaW5jbHVkZS9saW51eC9pby5oCkBAIC0zOCw2ICszOCwxNCBAQAogfQogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfSEFWRV9BUkNIX0hVR0VfVk1BUAordm9pZCBfX2luaXQgaW9yZW1hcF9odWdlX2luaXQodm9pZCk7CitpbnQgYXJjaF9pb3JlbWFwX3B1ZF9zdXBwb3J0ZWQodm9pZCk7CitpbnQgYXJjaF9pb3JlbWFwX3BtZF9zdXBwb3J0ZWQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGlvcmVtYXBfaHVnZV9pbml0KHZvaWQpIHsgfQorI2VuZGlmCisKIC8qCiAgKiBNYW5hZ2VkIGlvbWFwIGludGVyZmFjZQogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaAppbmRleCAyYzUyNTAyMi4uMzg4ZTNhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pb3BvcnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCkBAIC0xOTYsMTAgKzE5Niw4IEBACiAKIC8qIENvbXBhdGliaWxpdHkgY3J1ZnQgKi8KICNkZWZpbmUgcmVsZWFzZV9yZWdpb24oc3RhcnQsbikJX19yZWxlYXNlX3JlZ2lvbigmaW9wb3J0X3Jlc291cmNlLCAoc3RhcnQpLCAobikpCi0jZGVmaW5lIGNoZWNrX21lbV9yZWdpb24oc3RhcnQsbikJX19jaGVja19yZWdpb24oJmlvbWVtX3Jlc291cmNlLCAoc3RhcnQpLCAobikpCiAjZGVmaW5lIHJlbGVhc2VfbWVtX3JlZ2lvbihzdGFydCxuKQlfX3JlbGVhc2VfcmVnaW9uKCZpb21lbV9yZXNvdXJjZSwgKHN0YXJ0KSwgKG4pKQogCi1leHRlcm4gaW50IF9fY2hlY2tfcmVnaW9uKHN0cnVjdCByZXNvdXJjZSAqLCByZXNvdXJjZV9zaXplX3QsIHJlc291cmNlX3NpemVfdCk7CiBleHRlcm4gdm9pZCBfX3JlbGVhc2VfcmVnaW9uKHN0cnVjdCByZXNvdXJjZSAqLCByZXNvdXJjZV9zaXplX3QsCiAJCQkJcmVzb3VyY2Vfc2l6ZV90KTsKICNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRQpAQCAtMjA3LDEyICsyMDUsNiBAQAogCQkJCXJlc291cmNlX3NpemVfdCk7CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSBpbnQgX19kZXByZWNhdGVkIGNoZWNrX3JlZ2lvbihyZXNvdXJjZV9zaXplX3QgcywKLQkJCQkJCXJlc291cmNlX3NpemVfdCBuKQotewotCXJldHVybiBfX2NoZWNrX3JlZ2lvbigmaW9wb3J0X3Jlc291cmNlLCBzLCBuKTsKLX0KLQogLyogV3JhcHBlcnMgZm9yIG1hbmFnZWQgZGV2aWNlcyAqLwogc3RydWN0IGRldmljZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcHY2LmggYi9pbmNsdWRlL2xpbnV4L2lwdjYuaAppbmRleCA0ZDUxNjlmLi44MjgwNmM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lwdjYuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lwdjYuaApAQCAtNTMsNiArNTMsMTAgQEAKIAlfX3MzMiAgICAgICAgICAgbmRpc2Nfbm90aWZ5OwogCV9fczMyCQlzdXBwcmVzc19mcmFnX25kaXNjOwogCV9fczMyCQlhY2NlcHRfcmFfbXR1OworCXN0cnVjdCBpcHY2X3N0YWJsZV9zZWNyZXQgeworCQlib29sIGluaXRpYWxpemVkOworCQlzdHJ1Y3QgaW42X2FkZHIgc2VjcmV0OworCX0gc3RhYmxlX3NlY3JldDsKIAl2b2lkCQkqc3lzY3RsOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnEuaCBiL2luY2x1ZGUvbGludXgvaXJxLmgKaW5kZXggZDA5ZWM3YS4uNjJjNjkwMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycS5oCkBAIC0zMCw2ICszMCw3IEBACiBzdHJ1Y3Qgc2VxX2ZpbGU7CiBzdHJ1Y3QgbW9kdWxlOwogc3RydWN0IG1zaV9tc2c7CitlbnVtIGlycWNoaXBfaXJxX3N0YXRlOwogCiAvKgogICogSVJRIGxpbmUgc3RhdHVzLgpAQCAtMzI0LDYgKzMyNSw4IEBACiAgKgkJCQlpcnFfcmVxdWVzdF9yZXNvdXJjZXMKICAqIEBpcnFfY29tcG9zZV9tc2lfbXNnOglvcHRpb25hbCB0byBjb21wb3NlIG1lc3NhZ2UgY29udGVudCBmb3IgTVNJCiAgKiBAaXJxX3dyaXRlX21zaV9tc2c6CW9wdGlvbmFsIHRvIHdyaXRlIG1lc3NhZ2UgY29udGVudCBmb3IgTVNJCisgKiBAaXJxX2dldF9pcnFjaGlwX3N0YXRlOglyZXR1cm4gdGhlIGludGVybmFsIHN0YXRlIG9mIGFuIGludGVycnVwdAorICogQGlycV9zZXRfaXJxY2hpcF9zdGF0ZToJc2V0IHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiBhIGludGVycnVwdAogICogQGZsYWdzOgkJY2hpcCBzcGVjaWZpYyBmbGFncwogICovCiBzdHJ1Y3QgaXJxX2NoaXAgewpAQCAtMzYzLDYgKzM2Niw5IEBACiAJdm9pZAkJKCppcnFfY29tcG9zZV9tc2lfbXNnKShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHN0cnVjdCBtc2lfbXNnICptc2cpOwogCXZvaWQJCSgqaXJxX3dyaXRlX21zaV9tc2cpKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgc3RydWN0IG1zaV9tc2cgKm1zZyk7CiAKKwlpbnQJCSgqaXJxX2dldF9pcnFjaGlwX3N0YXRlKShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIGVudW0gaXJxY2hpcF9pcnFfc3RhdGUgd2hpY2gsIGJvb2wgKnN0YXRlKTsKKwlpbnQJCSgqaXJxX3NldF9pcnFjaGlwX3N0YXRlKShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIGVudW0gaXJxY2hpcF9pcnFfc3RhdGUgd2hpY2gsIGJvb2wgc3RhdGUpOworCiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIH07CiAKQEAgLTQ2MCw2ICs0NjYsNyBAQAogZXh0ZXJuIGludCBpcnFfY2hpcF9zZXRfYWZmaW5pdHlfcGFyZW50KHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwKIAkJCQkJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QsCiAJCQkJCWJvb2wgZm9yY2UpOworZXh0ZXJuIGludCBpcnFfY2hpcF9zZXRfd2FrZV9wYXJlbnQoc3RydWN0IGlycV9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgb24pOwogI2VuZGlmCiAKIC8qIEhhbmRsaW5nIG9mIHVuaGFuZGxlZCBhbmQgc3B1cmlvdXMgaW50ZXJydXB0czogKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxX3dvcmsuaCBiL2luY2x1ZGUvbGludXgvaXJxX3dvcmsuaAppbmRleCBiZjNmZTcxLi40N2I5ZWJkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycV93b3JrLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnFfd29yay5oCkBAIC0zOCwxNiArMzgsMTcgQEAKIGJvb2wgaXJxX3dvcmtfcXVldWVfb24oc3RydWN0IGlycV93b3JrICp3b3JrLCBpbnQgY3B1KTsKICNlbmRpZgogCi12b2lkIGlycV93b3JrX3J1bih2b2lkKTsKIHZvaWQgaXJxX3dvcmtfdGljayh2b2lkKTsKIHZvaWQgaXJxX3dvcmtfc3luYyhzdHJ1Y3QgaXJxX3dvcmsgKndvcmspOwogCiAjaWZkZWYgQ09ORklHX0lSUV9XT1JLCiAjaW5jbHVkZSA8YXNtL2lycV93b3JrLmg+CiAKK3ZvaWQgaXJxX3dvcmtfcnVuKHZvaWQpOwogYm9vbCBpcnFfd29ya19uZWVkc19jcHUodm9pZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSBib29sIGlycV93b3JrX25lZWRzX2NwdSh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQorc3RhdGljIGlubGluZSB2b2lkIGlycV93b3JrX3J1bih2b2lkKSB7IH0KICNlbmRpZgogCiAjZW5kaWYgLyogX0xJTlVYX0lSUV9XT1JLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLXYzLmggYi9pbmNsdWRlL2xpbnV4L2lycWNoaXAvYXJtLWdpYy12My5oCmluZGV4IDc4MTk3NGEuLmZmYmMwMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLXYzLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnFjaGlwL2FybS1naWMtdjMuaApAQCAtMTI2LDggKzEyNiwyMyBAQAogI2RlZmluZSBHSUNSX1BST1BCQVNFUl9XYVdiCQkoNVUgPDwgNykKICNkZWZpbmUgR0lDUl9QUk9QQkFTRVJfUmFXYVd0CQkoNlUgPDwgNykKICNkZWZpbmUgR0lDUl9QUk9QQkFTRVJfUmFXYVdiCQkoN1UgPDwgNykKKyNkZWZpbmUgR0lDUl9QUk9QQkFTRVJfQ0FDSEVBQklMSVRZX01BU0sgKDdVIDw8IDcpCiAjZGVmaW5lIEdJQ1JfUFJPUEJBU0VSX0lEQklUU19NQVNLCSgweDFmKQogCisjZGVmaW5lIEdJQ1JfUEVOREJBU0VSX05vblNoYXJlYWJsZQkoMFUgPDwgMTApCisjZGVmaW5lIEdJQ1JfUEVOREJBU0VSX0lubmVyU2hhcmVhYmxlCSgxVSA8PCAxMCkKKyNkZWZpbmUgR0lDUl9QRU5EQkFTRVJfT3V0ZXJTaGFyZWFibGUJKDJVIDw8IDEwKQorI2RlZmluZSBHSUNSX1BFTkRCQVNFUl9TSEFSRUFCSUxJVFlfTUFTSyAoM1VMIDw8IDEwKQorI2RlZmluZSBHSUNSX1BFTkRCQVNFUl9uQ25CCQkoMFUgPDwgNykKKyNkZWZpbmUgR0lDUl9QRU5EQkFTRVJfbkMJCSgxVSA8PCA3KQorI2RlZmluZSBHSUNSX1BFTkRCQVNFUl9SYVd0CQkoMlUgPDwgNykKKyNkZWZpbmUgR0lDUl9QRU5EQkFTRVJfUmFXYgkJKDNVIDw8IDcpCisjZGVmaW5lIEdJQ1JfUEVOREJBU0VSX1dhV3QJCSg0VSA8PCA3KQorI2RlZmluZSBHSUNSX1BFTkRCQVNFUl9XYVdiCQkoNVUgPDwgNykKKyNkZWZpbmUgR0lDUl9QRU5EQkFTRVJfUmFXYVd0CQkoNlUgPDwgNykKKyNkZWZpbmUgR0lDUl9QRU5EQkFTRVJfUmFXYVdiCQkoN1UgPDwgNykKKyNkZWZpbmUgR0lDUl9QRU5EQkFTRVJfQ0FDSEVBQklMSVRZX01BU0sgKDdVIDw8IDcpCisKIC8qCiAgKiBSZS1EaXN0cmlidXRvciByZWdpc3RlcnMsIG9mZnNldHMgZnJvbSBTR0lfYmFzZQogICovCkBAIC0xODIsNiArMTk3LDcgQEAKICNkZWZpbmUgR0lUU19DQkFTRVJfV2FXYgkJKDVVTCA8PCA1OSkKICNkZWZpbmUgR0lUU19DQkFTRVJfUmFXYVd0CQkoNlVMIDw8IDU5KQogI2RlZmluZSBHSVRTX0NCQVNFUl9SYVdhV2IJCSg3VUwgPDwgNTkpCisjZGVmaW5lIEdJVFNfQ0JBU0VSX0NBQ0hFQUJJTElUWV9NQVNLCSg3VUwgPDwgNTkpCiAjZGVmaW5lIEdJVFNfQ0JBU0VSX05vblNoYXJlYWJsZQkoMFVMIDw8IDEwKQogI2RlZmluZSBHSVRTX0NCQVNFUl9Jbm5lclNoYXJlYWJsZQkoMVVMIDw8IDEwKQogI2RlZmluZSBHSVRTX0NCQVNFUl9PdXRlclNoYXJlYWJsZQkoMlVMIDw8IDEwKQpAQCAtMTk4LDYgKzIxNCw3IEBACiAjZGVmaW5lIEdJVFNfQkFTRVJfV2FXYgkJCSg1VUwgPDwgNTkpCiAjZGVmaW5lIEdJVFNfQkFTRVJfUmFXYVd0CQkoNlVMIDw8IDU5KQogI2RlZmluZSBHSVRTX0JBU0VSX1JhV2FXYgkJKDdVTCA8PCA1OSkKKyNkZWZpbmUgR0lUU19CQVNFUl9DQUNIRUFCSUxJVFlfTUFTSwkoN1VMIDw8IDU5KQogI2RlZmluZSBHSVRTX0JBU0VSX1RZUEVfU0hJRlQJCSg1NikKICNkZWZpbmUgR0lUU19CQVNFUl9UWVBFKHIpCQkoKChyKSA+PiBHSVRTX0JBU0VSX1RZUEVfU0hJRlQpICYgNykKICNkZWZpbmUgR0lUU19CQVNFUl9FTlRSWV9TSVpFX1NISUZUCSg0OCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLmggYi9pbmNsdWRlL2xpbnV4L2lycWNoaXAvYXJtLWdpYy5oCmluZGV4IDcxZDcwNmQuLjM2ZWM0YWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxY2hpcC9hcm0tZ2ljLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnFjaGlwL2FybS1naWMuaApAQCAtOTcsNiArOTcsNyBAQAogCiBleHRlcm4gc3RydWN0IGlycV9jaGlwIGdpY19hcmNoX2V4dG47CiAKK3ZvaWQgZ2ljX3NldF9pcnFjaGlwX2ZsYWdzKHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogdm9pZCBnaWNfaW5pdF9iYXNlcyh1bnNpZ25lZCBpbnQsIGludCwgdm9pZCBfX2lvbWVtICosIHZvaWQgX19pb21lbSAqLAogCQkgICAgdTMyIG9mZnNldCwgc3RydWN0IGRldmljZV9ub2RlICopOwogdm9pZCBnaWNfY2FzY2FkZV9pcnEodW5zaWduZWQgaW50IGdpY19uciwgdW5zaWduZWQgaW50IGlycSk7CkBAIC0xMTUsMTEgKzExNiw1IEBACiB2b2lkIGdpY19taWdyYXRlX3RhcmdldCh1bnNpZ25lZCBpbnQgbmV3X2NwdV9pZCk7CiB1bnNpZ25lZCBsb25nIGdpY19nZXRfc2dpcl9waHlzYWRkcih2b2lkKTsKIAotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyAqZ2ljX3JvdXRhYmxlX2lycV9kb21haW5fb3BzOwotc3RhdGljIGlubGluZSB2b2lkIF9faW5pdCByZWdpc3Rlcl9yb3V0YWJsZV9kb21haW5fb3BzCi0JCQkJCShjb25zdCBzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgKm9wcykKLXsKLQlnaWNfcm91dGFibGVfaXJxX2RvbWFpbl9vcHMgPSBvcHM7Ci19CiAjZW5kaWYgLyogX19BU1NFTUJMWSAqLwogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lycWNoaXAvaXJxLWNyb3NzYmFyLmggYi9pbmNsdWRlL2xpbnV4L2lycWNoaXAvaXJxLWNyb3NzYmFyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTM3YjguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9pcnFjaGlwL2lycS1jcm9zc2Jhci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyoKLSAqICBkcml2ZXJzL2lycWNoaXAvaXJxLWNyb3NzYmFyLmgKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEzIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKi8KLWludCBpcnFjcm9zc2Jhcl9pbml0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pcnFjaGlwL21pcHMtZ2ljLmggYi9pbmNsdWRlL2xpbnV4L2lycWNoaXAvbWlwcy1naWMuaAppbmRleCBlNmE2YWFjLi4zZWEyZTQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycWNoaXAvbWlwcy1naWMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lycWNoaXAvbWlwcy1naWMuaApAQCAtMjQwLDYgKzI0MCw4IEBACiBleHRlcm4gY3ljbGVfdCBnaWNfcmVhZF9jb21wYXJlKHZvaWQpOwogZXh0ZXJuIHZvaWQgZ2ljX3dyaXRlX2NvbXBhcmUoY3ljbGVfdCBjbnQpOwogZXh0ZXJuIHZvaWQgZ2ljX3dyaXRlX2NwdV9jb21wYXJlKGN5Y2xlX3QgY250LCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIGdpY19zdGFydF9jb3VudCh2b2lkKTsKK2V4dGVybiB2b2lkIGdpY19zdG9wX2NvdW50KHZvaWQpOwogZXh0ZXJuIHZvaWQgZ2ljX3NlbmRfaXBpKHVuc2lnbmVkIGludCBpbnRyKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgcGxhdF9pcGlfY2FsbF9pbnRfeGxhdGUodW5zaWduZWQgaW50KTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgcGxhdF9pcGlfcmVzY2hlZF9pbnRfeGxhdGUodW5zaWduZWQgaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxZmxhZ3MuaCBiL2luY2x1ZGUvbGludXgvaXJxZmxhZ3MuaAppbmRleCBkMTc2ZDY1Li41ZGQxMjcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lycWZsYWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnFmbGFncy5oCkBAIC04NSw3ICs4NSw3IEBACiAgKiBUaGUgbG9jYWxfaXJxXyooKSBBUElzIGFyZSBlcXVhbCB0byB0aGUgcmF3X2xvY2FsX2lycSooKQogICogaWYgIVRSQUNFX0lSUUZMQUdTLgogICovCi0jaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQKKyNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKICNkZWZpbmUgbG9jYWxfaXJxX2VuYWJsZSgpIFwKIAlkbyB7IHRyYWNlX2hhcmRpcnFzX29uKCk7IHJhd19sb2NhbF9pcnFfZW5hYmxlKCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGxvY2FsX2lycV9kaXNhYmxlKCkgXApAQCAtMTA3LDIyICsxMDcsNiBAQAogCQkJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsJXAogCQl9CQkJCQlcCiAJfSB3aGlsZSAoMCkKLSNkZWZpbmUgbG9jYWxfc2F2ZV9mbGFncyhmbGFncykJCQkJXAotCWRvIHsJCQkJCQlcCi0JCXJhd19sb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsJCVwKLQl9IHdoaWxlICgwKQotCi0jZGVmaW5lIGlycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpCQkJXAotCSh7CQkJCQkJXAotCQlyYXdfaXJxc19kaXNhYmxlZF9mbGFncyhmbGFncyk7CQlcCi0JfSkKLQotI2RlZmluZSBpcnFzX2Rpc2FibGVkKCkJCQkJCVwKLQkoewkJCQkJCVwKLQkJdW5zaWduZWQgbG9uZyBfZmxhZ3M7CQkJXAotCQlyYXdfbG9jYWxfc2F2ZV9mbGFncyhfZmxhZ3MpOwkJXAotCQlyYXdfaXJxc19kaXNhYmxlZF9mbGFncyhfZmxhZ3MpOwlcCi0JfSkKIAogI2RlZmluZSBzYWZlX2hhbHQoKQkJCQlcCiAJZG8gewkJCQkJXApAQCAtMTMxLDcgKzExNSw3IEBACiAJfSB3aGlsZSAoMCkKIAogCi0jZWxzZSAvKiAhQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQgKi8KKyNlbHNlIC8qICFDT05GSUdfVFJBQ0VfSVJRRkxBR1MgKi8KIAogI2RlZmluZSBsb2NhbF9pcnFfZW5hYmxlKCkJZG8geyByYXdfbG9jYWxfaXJxX2VuYWJsZSgpOyB9IHdoaWxlICgwKQogI2RlZmluZSBsb2NhbF9pcnFfZGlzYWJsZSgpCWRvIHsgcmF3X2xvY2FsX2lycV9kaXNhYmxlKCk7IH0gd2hpbGUgKDApCkBAIC0xNDAsMTEgKzEyNCwyOCBAQAogCQlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwkJCVwKIAl9IHdoaWxlICgwKQogI2RlZmluZSBsb2NhbF9pcnFfcmVzdG9yZShmbGFncykgZG8geyByYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOyB9IHdoaWxlICgwKQotI2RlZmluZSBsb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKQlkbyB7IHJhd19sb2NhbF9zYXZlX2ZsYWdzKGZsYWdzKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQkocmF3X2lycXNfZGlzYWJsZWQoKSkKLSNkZWZpbmUgaXJxc19kaXNhYmxlZF9mbGFncyhmbGFncykgKHJhd19pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKSkKICNkZWZpbmUgc2FmZV9oYWx0KCkJCWRvIHsgcmF3X3NhZmVfaGFsdCgpOyB9IHdoaWxlICgwKQogCisjZW5kaWYgLyogQ09ORklHX1RSQUNFX0lSUUZMQUdTICovCisKKyNkZWZpbmUgbG9jYWxfc2F2ZV9mbGFncyhmbGFncykJcmF3X2xvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpCisKKy8qCisgKiBTb21lIGFyY2hpdGVjdHVyZXMgZG9uJ3QgZGVmaW5lIGFyY2hfaXJxc19kaXNhYmxlZCgpLCBzbyBldmVuIGlmIGVpdGhlcgorICogZGVmaW5pdGlvbiB3b3VsZCBiZSBmaW5lIHdlIG5lZWQgdG8gdXNlIGRpZmZlcmVudCBvbmVzIGZvciB0aGUgdGltZSBiZWluZworICogdG8gYXZvaWQgYnVpbGQgaXNzdWVzLgorICovCisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQKKyNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCQkJCQlcCisJKHsJCQkJCQlcCisJCXVuc2lnbmVkIGxvbmcgX2ZsYWdzOwkJCVwKKwkJcmF3X2xvY2FsX3NhdmVfZmxhZ3MoX2ZsYWdzKTsJCVwKKwkJcmF3X2lycXNfZGlzYWJsZWRfZmxhZ3MoX2ZsYWdzKTsJXAorCX0pCisjZWxzZSAvKiAhQ09ORklHX1RSQUNFX0lSUUZMQUdTX1NVUFBPUlQgKi8KKyNkZWZpbmUgaXJxc19kaXNhYmxlZCgpCXJhd19pcnFzX2Rpc2FibGVkKCkKICNlbmRpZiAvKiBDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVCAqLwogCisjZGVmaW5lIGlycXNfZGlzYWJsZWRfZmxhZ3MoZmxhZ3MpIHJhd19pcnFzX2Rpc2FibGVkX2ZsYWdzKGZsYWdzKQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvamhhc2guaCBiL2luY2x1ZGUvbGludXgvamhhc2guaAppbmRleCA0N2NiMDllLi4zNDhjNmY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2poYXNoLmgKKysrIGIvaW5jbHVkZS9saW51eC9qaGFzaC5oCkBAIC0xNDUsMTEgKzE0NSwxMSBAQAogfQogCiAKLS8qIGpoYXNoXzN3b3JkcyAtIGhhc2ggZXhhY3RseSAzLCAyIG9yIDEgd29yZChzKSAqLwotc3RhdGljIGlubGluZSB1MzIgamhhc2hfM3dvcmRzKHUzMiBhLCB1MzIgYiwgdTMyIGMsIHUzMiBpbml0dmFsKQorLyogX19qaGFzaF9ud29yZHMgLSBoYXNoIGV4YWN0bHkgMywgMiBvciAxIHdvcmQocykgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIF9famhhc2hfbndvcmRzKHUzMiBhLCB1MzIgYiwgdTMyIGMsIHUzMiBpbml0dmFsKQogewotCWEgKz0gSkhBU0hfSU5JVFZBTDsKLQliICs9IEpIQVNIX0lOSVRWQUw7CisJYSArPSBpbml0dmFsOworCWIgKz0gaW5pdHZhbDsKIAljICs9IGluaXR2YWw7CiAKIAlfX2poYXNoX2ZpbmFsKGEsIGIsIGMpOwpAQCAtMTU3LDE0ICsxNTcsMTkgQEAKIAlyZXR1cm4gYzsKIH0KIAorc3RhdGljIGlubGluZSB1MzIgamhhc2hfM3dvcmRzKHUzMiBhLCB1MzIgYiwgdTMyIGMsIHUzMiBpbml0dmFsKQoreworCXJldHVybiBfX2poYXNoX253b3JkcyhhLCBiLCBjLCBpbml0dmFsICsgSkhBU0hfSU5JVFZBTCArICgzIDw8IDIpKTsKK30KKwogc3RhdGljIGlubGluZSB1MzIgamhhc2hfMndvcmRzKHUzMiBhLCB1MzIgYiwgdTMyIGluaXR2YWwpCiB7Ci0JcmV0dXJuIGpoYXNoXzN3b3JkcyhhLCBiLCAwLCBpbml0dmFsKTsKKwlyZXR1cm4gX19qaGFzaF9ud29yZHMoYSwgYiwgMCwgaW5pdHZhbCArIEpIQVNIX0lOSVRWQUwgKyAoMiA8PCAyKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIGpoYXNoXzF3b3JkKHUzMiBhLCB1MzIgaW5pdHZhbCkKIHsKLQlyZXR1cm4gamhhc2hfM3dvcmRzKGEsIDAsIDAsIGluaXR2YWwpOworCXJldHVybiBfX2poYXNoX253b3JkcyhhLCAwLCAwLCBpbml0dmFsICsgSkhBU0hfSU5JVFZBTCArICgxIDw8IDIpKTsKIH0KIAogI2VuZGlmIC8qIF9MSU5VWF9KSEFTSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaCBiL2luY2x1ZGUvbGludXgvanVtcF9sYWJlbC5oCmluZGV4IDk4ZjkyM2I2Li5mNGRlNDczIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaAorKysgYi9pbmNsdWRlL2xpbnV4L2p1bXBfbGFiZWwuaApAQCAtNDUsNiArNDUsMTIgQEAKICAqIHNhbWUgYXMgdXNpbmcgU1RBVElDX0tFWV9JTklUX0ZBTFNFLgogICovCiAKKyNpZiBkZWZpbmVkKENDX0hBVkVfQVNNX0dPVE8pICYmIGRlZmluZWQoQ09ORklHX0pVTVBfTEFCRUwpCisjIGRlZmluZSBIQVZFX0pVTVBfTEFCRUwKKyNlbmRpZgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgpAQCAtNTUsNyArNjEsNyBAQAogCQkJCSAgICAiJXMgdXNlZCBiZWZvcmUgY2FsbCB0byBqdW1wX2xhYmVsX2luaXQiLCBcCiAJCQkJICAgIF9fZnVuY19fKQogCi0jaWYgZGVmaW5lZChDQ19IQVZFX0FTTV9HT1RPKSAmJiBkZWZpbmVkKENPTkZJR19KVU1QX0xBQkVMKQorI2lmZGVmIEhBVkVfSlVNUF9MQUJFTAogCiBzdHJ1Y3Qgc3RhdGljX2tleSB7CiAJYXRvbWljX3QgZW5hYmxlZDsKQEAgLTY2LDEzICs3MiwxOCBAQAogI2VuZGlmCiB9OwogCi0jIGluY2x1ZGUgPGFzbS9qdW1wX2xhYmVsLmg+Ci0jIGRlZmluZSBIQVZFX0pVTVBfTEFCRUwKICNlbHNlCiBzdHJ1Y3Qgc3RhdGljX2tleSB7CiAJYXRvbWljX3QgZW5hYmxlZDsKIH07Ci0jZW5kaWYJLyogQ0NfSEFWRV9BU01fR09UTyAmJiBDT05GSUdfSlVNUF9MQUJFTCAqLworI2VuZGlmCS8qIEhBVkVfSlVNUF9MQUJFTCAqLworI2VuZGlmIC8qIF9fQVNTRU1CTFlfXyAqLworCisjaWZkZWYgSEFWRV9KVU1QX0xBQkVMCisjaW5jbHVkZSA8YXNtL2p1bXBfbGFiZWwuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9fQVNTRU1CTFlfXwogCiBlbnVtIGp1bXBfbGFiZWxfdHlwZSB7CiAJSlVNUF9MQUJFTF9ESVNBQkxFID0gMCwKQEAgLTIwMywzICsyMTQsNSBAQAogfQogCiAjZW5kaWYJLyogX0xJTlVYX0pVTVBfTEFCRUxfSCAqLworCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2thc2FuLmggYi9pbmNsdWRlL2xpbnV4L2thc2FuLmgKaW5kZXggNWJiMDc0NC4uNTQ4NmQ3NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rYXNhbi5oCisrKyBiL2luY2x1ZGUvbGludXgva2FzYW4uaApAQCAtNDQsNiArNDQsNyBAQAogCiB2b2lkIGthc2FuX2ttYWxsb2NfbGFyZ2UoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CiB2b2lkIGthc2FuX2tmcmVlX2xhcmdlKGNvbnN0IHZvaWQgKnB0cik7Cit2b2lkIGthc2FuX2tmcmVlKHZvaWQgKnB0cik7CiB2b2lkIGthc2FuX2ttYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKnMsIGNvbnN0IHZvaWQgKm9iamVjdCwgc2l6ZV90IHNpemUpOwogdm9pZCBrYXNhbl9rcmVhbGxvYyhjb25zdCB2b2lkICpvYmplY3QsIHNpemVfdCBuZXdfc2l6ZSk7CiAKQEAgLTcxLDYgKzcyLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIGthc2FuX2ttYWxsb2NfbGFyZ2Uodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBrYXNhbl9rZnJlZV9sYXJnZShjb25zdCB2b2lkICpwdHIpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQga2FzYW5fa2ZyZWUodm9pZCAqcHRyKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGthc2FuX2ttYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKnMsIGNvbnN0IHZvaWQgKm9iamVjdCwKIAkJCQlzaXplX3Qgc2l6ZSkge30KIHN0YXRpYyBpbmxpbmUgdm9pZCBrYXNhbl9rcmVhbGxvYyhjb25zdCB2b2lkICpvYmplY3QsIHNpemVfdCBuZXdfc2l6ZSkge30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3NtLmggYi9pbmNsdWRlL2xpbnV4L2tzbS5oCmluZGV4IDNiZTZiYjEuLjdhZTIxNmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva3NtLmgKKysrIGIvaW5jbHVkZS9saW51eC9rc20uaApAQCAtMzUsMTggKzM1LDYgQEAKIAkJX19rc21fZXhpdChtbSk7CiB9CiAKLS8qCi0gKiBBIEtTTSBwYWdlIGlzIG9uZSBvZiB0aG9zZSB3cml0ZS1wcm90ZWN0ZWQgInNoYXJlZCBwYWdlcyIgb3IgIm1lcmdlZCBwYWdlcyIKLSAqIHdoaWNoIEtTTSBtYXBzIGludG8gbXVsdGlwbGUgbW1zLCB3aGVyZXZlciBpZGVudGljYWwgYW5vbnltb3VzIHBhZ2UgY29udGVudAotICogaXMgZm91bmQgaW4gVk1fTUVSR0VBQkxFIHZtYXMuICBJdCdzIGEgUGFnZUFub24gcGFnZSwgcG9pbnRpbmcgbm90IHRvIGFueQotICogYW5vbl92bWEsIGJ1dCB0byB0aGF0IHBhZ2UncyBub2RlIG9mIHRoZSBzdGFibGUgdHJlZS4KLSAqLwotc3RhdGljIGlubGluZSBpbnQgUGFnZUtzbShzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKXBhZ2UtPm1hcHBpbmcgJiBQQUdFX01BUFBJTkdfRkxBR1MpID09Ci0JCQkJKFBBR0VfTUFQUElOR19BTk9OIHwgUEFHRV9NQVBQSU5HX0tTTSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHN0YWJsZV9ub2RlICpwYWdlX3N0YWJsZV9ub2RlKHN0cnVjdCBwYWdlICpwYWdlKQogewogCXJldHVybiBQYWdlS3NtKHBhZ2UpID8gcGFnZV9ybWFwcGluZyhwYWdlKSA6IE5VTEw7CkBAIC04NywxMSArNzUsNiBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIGludCBQYWdlS3NtKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybiAwOwotfQotCiAjaWZkZWYgQ09ORklHX01NVQogc3RhdGljIGlubGluZSBpbnQga3NtX21hZHZpc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCXVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgYWR2aWNlLCB1bnNpZ25lZCBsb25nICp2bV9mbGFncykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaCBiL2luY2x1ZGUvbGludXgva3ZtX2hvc3QuaAppbmRleCBkMTJiMjEwLi5hZDQ1MDU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2t2bV9ob3N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9rdm1faG9zdC5oCkBAIC0xNjUsMTIgKzE2NSwxMiBAQAogCUtWTV9OUl9CVVNFUwogfTsKIAotaW50IGt2bV9pb19idXNfd3JpdGUoc3RydWN0IGt2bSAqa3ZtLCBlbnVtIGt2bV9idXMgYnVzX2lkeCwgZ3BhX3QgYWRkciwKK2ludCBrdm1faW9fYnVzX3dyaXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZW51bSBrdm1fYnVzIGJ1c19pZHgsIGdwYV90IGFkZHIsCiAJCSAgICAgaW50IGxlbiwgY29uc3Qgdm9pZCAqdmFsKTsKLWludCBrdm1faW9fYnVzX3dyaXRlX2Nvb2tpZShzdHJ1Y3Qga3ZtICprdm0sIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLAotCQkJICAgIGludCBsZW4sIGNvbnN0IHZvaWQgKnZhbCwgbG9uZyBjb29raWUpOwotaW50IGt2bV9pb19idXNfcmVhZChzdHJ1Y3Qga3ZtICprdm0sIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLCBpbnQgbGVuLAotCQkgICAgdm9pZCAqdmFsKTsKK2ludCBrdm1faW9fYnVzX3dyaXRlX2Nvb2tpZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGVudW0ga3ZtX2J1cyBidXNfaWR4LAorCQkJICAgIGdwYV90IGFkZHIsIGludCBsZW4sIGNvbnN0IHZvaWQgKnZhbCwgbG9uZyBjb29raWUpOworaW50IGt2bV9pb19idXNfcmVhZChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLAorCQkgICAgaW50IGxlbiwgdm9pZCAqdmFsKTsKIGludCBrdm1faW9fYnVzX3JlZ2lzdGVyX2RldihzdHJ1Y3Qga3ZtICprdm0sIGVudW0ga3ZtX2J1cyBidXNfaWR4LCBncGFfdCBhZGRyLAogCQkJICAgIGludCBsZW4sIHN0cnVjdCBrdm1faW9fZGV2aWNlICpkZXYpOwogaW50IGt2bV9pb19idXNfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGt2bSAqa3ZtLCBlbnVtIGt2bV9idXMgYnVzX2lkeCwKQEAgLTY1OCw3ICs2NTgsNiBAQAogaW50IGt2bV9hcmNoX3ZjcHVfc2hvdWxkX2tpY2soc3RydWN0IGt2bV92Y3B1ICp2Y3B1KTsKIAogdm9pZCAqa3ZtX2t2emFsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSk7Ci12b2lkIGt2bV9rdmZyZWUoY29uc3Qgdm9pZCAqYWRkcik7CiAKICNpZm5kZWYgX19LVk1fSEFWRV9BUkNIX1ZNX0FMTE9DCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBrdm0gKmt2bV9hcmNoX2FsbG9jX3ZtKHZvaWQpCkBAIC03MDAsNiArNjk5LDIwIEBACiAjZW5kaWYKIH0KIAorI2lmZGVmIF9fS1ZNX0hBVkVfQVJDSF9JTlRDX0lOSVRJQUxJWkVECisvKgorICogcmV0dXJucyB0cnVlIGlmIHRoZSB2aXJ0dWFsIGludGVycnVwdCBjb250cm9sbGVyIGlzIGluaXRpYWxpemVkIGFuZAorICogcmVhZHkgdG8gYWNjZXB0IHZpcnR1YWwgSVJRLiBPbiBzb21lIGFyY2hpdGVjdHVyZXMgdGhlIHZpcnR1YWwgaW50ZXJydXB0CisgKiBjb250cm9sbGVyIGlzIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlZCBhbmQgdGhpcyBpcyBub3QgYWx3YXlzIHRydWUuCisgKi8KK2Jvb2wga3ZtX2FyY2hfaW50Y19pbml0aWFsaXplZChzdHJ1Y3Qga3ZtICprdm0pOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBrdm1fYXJjaF9pbnRjX2luaXRpYWxpemVkKHN0cnVjdCBrdm0gKmt2bSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCiBpbnQga3ZtX2FyY2hfaW5pdF92bShzdHJ1Y3Qga3ZtICprdm0sIHVuc2lnbmVkIGxvbmcgdHlwZSk7CiB2b2lkIGt2bV9hcmNoX2Rlc3Ryb3lfdm0oc3RydWN0IGt2bSAqa3ZtKTsKIHZvaWQga3ZtX2FyY2hfc3luY19ldmVudHMoc3RydWN0IGt2bSAqa3ZtKTsKQEAgLTc2Niw3ICs3NzksOCBAQAogCSAqIG9uZSB0aW1lIHNsaWNlKS4gTGV0cyB0cmVhdCBndWVzdCBtb2RlIGFzIHF1aWVzY2VudCBzdGF0ZSwganVzdCBsaWtlCiAJICogd2UgZG8gd2l0aCB1c2VyLW1vZGUgZXhlY3V0aW9uLgogCSAqLwotCXJjdV92aXJ0X25vdGVfY29udGV4dF9zd2l0Y2goc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlpZiAoIWNvbnRleHRfdHJhY2tpbmdfY3B1X2lzX2VuYWJsZWQoKSkKKwkJcmN1X3ZpcnRfbm90ZV9jb250ZXh0X3N3aXRjaChzbXBfcHJvY2Vzc29yX2lkKCkpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQga3ZtX2d1ZXN0X2V4aXQodm9pZCkKQEAgLTk2OSwxMSArOTgzLDE2IEBACiAjZW5kaWYgLyogQ09ORklHX0hBVkVfS1ZNX0VWRU5URkQgKi8KIAogI2lmZGVmIENPTkZJR19LVk1fQVBJQ19BUkNISVRFQ1RVUkUKLXN0YXRpYyBpbmxpbmUgYm9vbCBrdm1fdmNwdV9pc19ic3Aoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQorc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X2lzX3Jlc2V0X2JzcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJcmV0dXJuIHZjcHUtPmt2bS0+YnNwX3ZjcHVfaWQgPT0gdmNwdS0+dmNwdV9pZDsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGt2bV92Y3B1X2lzX2JzcChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJcmV0dXJuICh2Y3B1LT5hcmNoLmFwaWNfYmFzZSAmIE1TUl9JQTMyX0FQSUNCQVNFX0JTUCkgIT0gMDsKK30KKwogYm9vbCBrdm1fdmNwdV9jb21wYXRpYmxlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKICNlbHNlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xjbS5oIGIvaW5jbHVkZS9saW51eC9sY20uaAppbmRleCA3YmYwMWQ3Li4xY2U3OWE3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xjbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGNtLmgKQEAgLTQsNSArNCw2IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KIAogdW5zaWduZWQgbG9uZyBsY20odW5zaWduZWQgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGIpIF9fYXR0cmlidXRlX2NvbnN0X187Cit1bnNpZ25lZCBsb25nIGxjbV9ub3RfemVybyh1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYikgX19hdHRyaWJ1dGVfY29uc3RfXzsKIAogI2VuZGlmIC8qIF9MQ01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sZWQtY2xhc3MtZmxhc2guaCBiL2luY2x1ZGUvbGludXgvbGVkLWNsYXNzLWZsYXNoLmgKaW5kZXggNWJhMmZhYy4uZTk3OTY2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sZWQtY2xhc3MtZmxhc2guaAorKysgYi9pbmNsdWRlL2xpbnV4L2xlZC1jbGFzcy1mbGFzaC5oCkBAIC0xMyw3ICsxMyw2IEBACiAjZGVmaW5lIF9fTElOVVhfRkxBU0hfTEVEU19IX0lOQ0xVREVECiAKICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+Ci0jaW5jbHVkZSA8dWFwaS9saW51eC92NGwyLWNvbnRyb2xzLmg+CiAKIHN0cnVjdCBkZXZpY2Vfbm9kZTsKIHN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2g7CkBAIC0zMyw3ICszMiw3IEBACiAjZGVmaW5lIExFRF9GQVVMVF9MRURfT1ZFUl9URU1QRVJBVFVSRQkoMSA8PCA4KQogI2RlZmluZSBMRURfTlVNX0ZMQVNIX0ZBVUxUUwkJOQogCi0jZGVmaW5lIExFRF9GTEFTSF9NQVhfU1lTRlNfR1JPVVBTIDcKKyNkZWZpbmUgTEVEX0ZMQVNIX1NZU0ZTX0dST1VQU19TSVpFCTUKIAogc3RydWN0IGxlZF9mbGFzaF9vcHMgewogCS8qIHNldCBmbGFzaCBicmlnaHRuZXNzICovCkBAIC04MSwyMSArODAsNyBAQAogCXN0cnVjdCBsZWRfZmxhc2hfc2V0dGluZyB0aW1lb3V0OwogCiAJLyogTEVEIEZsYXNoIGNsYXNzIHN5c2ZzIGdyb3VwcyAqLwotCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnN5c2ZzX2dyb3Vwc1tMRURfRkxBU0hfTUFYX1NZU0ZTX0dST1VQU107Ci0KLQkvKiBMRURzIGF2YWlsYWJsZSBmb3IgZmxhc2ggc3Ryb2JlIHN5bmNocm9uaXphdGlvbiAqLwotCXN0cnVjdCBsZWRfY2xhc3NkZXZfZmxhc2ggKipzeW5jX2xlZHM7Ci0KLQkvKiBOdW1iZXIgb2YgTEVEcyBhdmFpbGFibGUgZm9yIGZsYXNoIHN0cm9iZSBzeW5jaHJvbml6YXRpb24gKi8KLQlpbnQgbnVtX3N5bmNfbGVkczsKLQotCS8qCi0JICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHN1Yi1sZWQgdG8gc3luY2hyb25pemUgdGhlIGZsYXNoIHN0cm9iZSB3aXRoLgotCSAqIElkZW50aWZpZXJzIHN0YXJ0IGZyb20gMSwgd2hpY2ggcmVmbGVjdHMgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUKLQkgKiBzeW5jX2xlZHMgYXJyYXkuIDAgbWVhbnMgdGhhdCB0aGUgZmxhc2ggc3Ryb2JlIHNob3VsZCBub3QgYmUKLQkgKiBzeW5jaHJvbml6ZWQuCi0JICovCi0JdTMyIHN5bmNfbGVkX2lkOworCWNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKnN5c2ZzX2dyb3Vwc1tMRURfRkxBU0hfU1lTRlNfR1JPVVBTX1NJWkVdOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbGVkX2NsYXNzZGV2X2ZsYXNoICpsY2Rldl90b19mbGNkZXYoCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xlZHMuaCBiL2luY2x1ZGUvbGludXgvbGVkcy5oCmluZGV4IGY3MGY4NGYuLjlhMmIwMDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGVkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbGVkcy5oCkBAIC00Nyw3ICs0Nyw2IEBACiAjZGVmaW5lIFNFVF9CUklHSFRORVNTX0FTWU5DCSgxIDw8IDIxKQogI2RlZmluZSBTRVRfQlJJR0hUTkVTU19TWU5DCSgxIDw8IDIyKQogI2RlZmluZSBMRURfREVWX0NBUF9GTEFTSAkoMSA8PCAyMykKLSNkZWZpbmUgTEVEX0RFVl9DQVBfU1lOQ19TVFJPQkUJKDEgPDwgMjQpCiAKIAkvKiBTZXQgTEVEIGJyaWdodG5lc3MgbGV2ZWwgKi8KIAkvKiBNdXN0IG5vdCBzbGVlcCwgdXNlIGEgd29ya3F1ZXVlIGlmIG5lZWRlZCAqLwpAQCAtMTA1LDcgKzEwNCwxMSBAQAogCiBleHRlcm4gaW50IGxlZF9jbGFzc2Rldl9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCiAJCQkJIHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KTsKK2V4dGVybiBpbnQgZGV2bV9sZWRfY2xhc3NkZXZfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCSAgICAgIHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KTsKIGV4dGVybiB2b2lkIGxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2KTsKK2V4dGVybiB2b2lkIGRldm1fbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCQkgc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpOwogZXh0ZXJuIHZvaWQgbGVkX2NsYXNzZGV2X3N1c3BlbmQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYpOwogZXh0ZXJuIHZvaWQgbGVkX2NsYXNzZGV2X3Jlc3VtZShzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2Rldik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGliYXRhLmggYi9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCmluZGV4IGZjMDNlZmEuLjhkYWQ0YTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGliYXRhLmgKKysrIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaApAQCAtMjMxLDcgKzIzMSw3IEBACiAJQVRBX0ZMQUdfU1dfQUNUSVZJVFkJPSAoMSA8PCAyMiksIC8qIGRyaXZlciBzdXBwb3J0cyBzdyBhY3Rpdml0eQogCQkJCQkgICAgICAqIGxlZCAqLwogCUFUQV9GTEFHX05PX0RJUE0JPSAoMSA8PCAyMyksIC8qIGhvc3Qgbm90IGhhcHB5IHdpdGggRElQTSAqLwotCUFUQV9GTEFHX0xPV1RBRwkJPSAoMSA8PCAyNCksIC8qIGhvc3Qgd2FudHMgbG93ZXN0IGF2YWlsYWJsZSB0YWcgKi8KKwlBVEFfRkxBR19TQVNfSE9TVAk9ICgxIDw8IDI0KSwgLyogU0FTIGhvc3QgKi8KIAogCS8qIGJpdHMgMjQ6MzEgb2YgYXAtPmZsYWdzIGFyZSByZXNlcnZlZCBmb3IgTExEIHNwZWNpZmljIGZsYWdzICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGl2ZXBhdGNoLmggYi9pbmNsdWRlL2xpbnV4L2xpdmVwYXRjaC5oCmluZGV4IDk1MDIzZmQuLmVlNmRiYjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGl2ZXBhdGNoLmgKKysrIGIvaW5jbHVkZS9saW51eC9saXZlcGF0Y2guaApAQCAtMTIzLDEwICsxMjMsMTAgQEAKIAllbnVtIGtscF9zdGF0ZSBzdGF0ZTsKIH07CiAKLWV4dGVybiBpbnQga2xwX3JlZ2lzdGVyX3BhdGNoKHN0cnVjdCBrbHBfcGF0Y2ggKik7Ci1leHRlcm4gaW50IGtscF91bnJlZ2lzdGVyX3BhdGNoKHN0cnVjdCBrbHBfcGF0Y2ggKik7Ci1leHRlcm4gaW50IGtscF9lbmFibGVfcGF0Y2goc3RydWN0IGtscF9wYXRjaCAqKTsKLWV4dGVybiBpbnQga2xwX2Rpc2FibGVfcGF0Y2goc3RydWN0IGtscF9wYXRjaCAqKTsKK2ludCBrbHBfcmVnaXN0ZXJfcGF0Y2goc3RydWN0IGtscF9wYXRjaCAqKTsKK2ludCBrbHBfdW5yZWdpc3Rlcl9wYXRjaChzdHJ1Y3Qga2xwX3BhdGNoICopOworaW50IGtscF9lbmFibGVfcGF0Y2goc3RydWN0IGtscF9wYXRjaCAqKTsKK2ludCBrbHBfZGlzYWJsZV9wYXRjaChzdHJ1Y3Qga2xwX3BhdGNoICopOwogCiAjZW5kaWYgLyogQ09ORklHX0xJVkVQQVRDSCAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvY2tkZXAuaCBiL2luY2x1ZGUvbGludXgvbG9ja2RlcC5oCmluZGV4IDc0YWIyMzEuLjA2NmJhNDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9ja2RlcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9ja2RlcC5oCkBAIC01MzEsOCArNTMxLDEzIEBACiAjIGRlZmluZSBtaWdodF9sb2NrX3JlYWQobG9jaykgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfUFJPVkVfUkNVCisjaWZkZWYgQ09ORklHX0xPQ0tERVAKIHZvaWQgbG9ja2RlcF9yY3Vfc3VzcGljaW91cyhjb25zdCBjaGFyICpmaWxlLCBjb25zdCBpbnQgbGluZSwgY29uc3QgY2hhciAqcyk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCitsb2NrZGVwX3JjdV9zdXNwaWNpb3VzKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGludCBsaW5lLCBjb25zdCBjaGFyICpzKQoreworfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0xJTlVYX0xPQ0tERVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oIGIvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oCmluZGV4IGU4Y2M0NTMuLjk0OTdlYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmgKQEAgLTM2NSw2ICszNjUsMTQgQEAKICNkZWZpbmUgX19pbml0ZGF0YV9tZW1ibG9jawogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfTUVNVEVTVAorZXh0ZXJuIHZvaWQgZWFybHlfbWVtdGVzdChwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZWFybHlfbWVtdGVzdChwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kKQoreworfQorI2VuZGlmCisKICNlbHNlCiBzdGF0aWMgaW5saW5lIHBoeXNfYWRkcl90IG1lbWJsb2NrX2FsbG9jKHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oIGIvaW5jbHVkZS9saW51eC9tZW1vcnlfaG90cGx1Zy5oCmluZGV4IDhmMWE0MTkuLjZmZmEwYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtb3J5X2hvdHBsdWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbW9yeV9ob3RwbHVnLmgKQEAgLTE5Miw2ICsxOTIsOSBAQAogdm9pZCBnZXRfb25saW5lX21lbXModm9pZCk7CiB2b2lkIHB1dF9vbmxpbmVfbWVtcyh2b2lkKTsKIAordm9pZCBtZW1faG90cGx1Z19iZWdpbih2b2lkKTsKK3ZvaWQgbWVtX2hvdHBsdWdfZG9uZSh2b2lkKTsKKwogI2Vsc2UgLyogISBDT05GSUdfTUVNT1JZX0hPVFBMVUcgKi8KIC8qCiAgKiBTdHViIGZ1bmN0aW9ucyBmb3Igd2hlbiBob3RwbHVnIGlzIG9mZgpAQCAtMjMxLDYgKzIzNCw5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X29ubGluZV9tZW1zKHZvaWQpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X29ubGluZV9tZW1zKHZvaWQpIHt9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1faG90cGx1Z19iZWdpbih2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIG1lbV9ob3RwbHVnX2RvbmUodm9pZCkge30KKwogI2VuZGlmIC8qICEgQ09ORklHX01FTU9SWV9IT1RQTFVHICovCiAKICNpZmRlZiBDT05GSUdfTUVNT1JZX0hPVFJFTU9WRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1wb29sLmggYi9pbmNsdWRlL2xpbnV4L21lbXBvb2wuaAppbmRleCAzOWVkNjJhLi42OWI2OTUxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbXBvb2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbXBvb2wuaApAQCAtMjksMTQgKzI5LDE1IEBACiAJCQltZW1wb29sX2ZyZWVfdCAqZnJlZV9mbiwgdm9pZCAqcG9vbF9kYXRhLAogCQkJZ2ZwX3QgZ2ZwX21hc2ssIGludCBuaWQpOwogCi1leHRlcm4gaW50IG1lbXBvb2xfcmVzaXplKG1lbXBvb2xfdCAqcG9vbCwgaW50IG5ld19taW5fbnIsIGdmcF90IGdmcF9tYXNrKTsKK2V4dGVybiBpbnQgbWVtcG9vbF9yZXNpemUobWVtcG9vbF90ICpwb29sLCBpbnQgbmV3X21pbl9ucik7CiBleHRlcm4gdm9pZCBtZW1wb29sX2Rlc3Ryb3kobWVtcG9vbF90ICpwb29sKTsKIGV4dGVybiB2b2lkICogbWVtcG9vbF9hbGxvYyhtZW1wb29sX3QgKnBvb2wsIGdmcF90IGdmcF9tYXNrKTsKIGV4dGVybiB2b2lkIG1lbXBvb2xfZnJlZSh2b2lkICplbGVtZW50LCBtZW1wb29sX3QgKnBvb2wpOwogCiAvKgogICogQSBtZW1wb29sX2FsbG9jX3QgYW5kIG1lbXBvb2xfZnJlZV90IHRoYXQgZ2V0IHRoZSBtZW1vcnkgZnJvbQotICogYSBzbGFiIHRoYXQgaXMgcGFzc2VkIGluIHRocm91Z2ggcG9vbF9kYXRhLgorICogYSBzbGFiIGNhY2hlIHRoYXQgaXMgcGFzc2VkIGluIHRocm91Z2ggcG9vbF9kYXRhLgorICogTm90ZTogdGhlIHNsYWIgY2FjaGUgbWF5IG5vdCBoYXZlIGEgY3RvciBmdW5jdGlvbi4KICAqLwogdm9pZCAqbWVtcG9vbF9hbGxvY19zbGFiKGdmcF90IGdmcF9tYXNrLCB2b2lkICpwb29sX2RhdGEpOwogdm9pZCBtZW1wb29sX2ZyZWVfc2xhYih2b2lkICplbGVtZW50LCB2b2lkICpwb29sX2RhdGEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvYWJ4NTAwL3V4NTAwX2NoYXJnYWxnLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hYng1MDAvdXg1MDBfY2hhcmdhbGcuaAppbmRleCAyMzRjOTkxLi42NzcwM2YyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9hYng1MDAvdXg1MDBfY2hhcmdhbGcuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hYng1MDAvdXg1MDBfY2hhcmdhbGcuaApAQCAtOSw4ICs5LDEzIEBACiAKICNpbmNsdWRlIDxsaW51eC9wb3dlcl9zdXBwbHkuaD4KIAotI2RlZmluZSBwc3lfdG9fdXg1MDBfY2hhcmdlcih4KSBjb250YWluZXJfb2YoKHgpLCBcCi0JCXN0cnVjdCB1eDUwMF9jaGFyZ2VyLCBwc3kpCisvKgorICogVmFsaWQgb25seSBmb3Igc3VwcGxpZXMgb2YgdHlwZToKKyAqIC0gUE9XRVJfU1VQUExZX1RZUEVfTUFJTlMsCisgKiAtIFBPV0VSX1NVUFBMWV9UWVBFX1VTQiwKKyAqIGJlY2F1c2Ugb25seSB0aGVtIHN0b3JlIGFzIGRydl9kYXRhIHBvaW50ZXIgdG8gc3RydWN0IHV4NTAwX2NoYXJnZXIuCisgKi8KKyNkZWZpbmUgcHN5X3RvX3V4NTAwX2NoYXJnZXIoeCkgcG93ZXJfc3VwcGx5X2dldF9kcnZkYXRhKHBzeSkKIAogLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLwogc3RydWN0IHV4NTAwX2NoYXJnZXI7CkBAIC0zNSw3ICs0MCw3IEBACiAgKiBAcG93ZXJfcGF0aAkJVVNCIHBvd2VyIHBhdGggc3VwcG9ydAogICovCiBzdHJ1Y3QgdXg1MDBfY2hhcmdlciB7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSBwc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5OwogCXN0cnVjdCB1eDUwMF9jaGFyZ2VyX29wcyBvcHM7CiAJaW50IG1heF9vdXRfdm9sdDsKIAlpbnQgbWF4X291dF9jdXJyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvYXJpem9uYS9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL2NvcmUuaAppbmRleCA5MTBlM2FhLi5mOTcwMTA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL2NvcmUuaApAQCAtMjQsNiArMjQsNyBAQAogCVdNNTEwMiA9IDEsCiAJV001MTEwID0gMiwKIAlXTTg5OTcgPSAzLAorCVdNODI4MCA9IDQsCiB9OwogCiAjZGVmaW5lIEFSSVpPTkFfSVJRX0dQMSAgICAgICAgICAgICAgICAgICAgMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvYXJpem9uYS9ncGlvLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL2dwaW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDIxNDZiYi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL2dwaW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBHUElPIGNvbmZpZ3VyYXRpb24gZm9yIEFyaXpvbmEgZGV2aWNlcwotICoKLSAqIENvcHlyaWdodCAyMDEzIFdvbGZzb24gTWljcm9lbGVjdHJvbmljcy4gUExDLgotICoKLSAqIEF1dGhvcjogQ2hhcmxlcyBLZWVwYXggPGNrZWVwYXhAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBfQVJJWk9OQV9HUElPX0gKLSNkZWZpbmUgX0FSSVpPTkFfR1BJT19ICi0KLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9UWExSQ0xLICAgICAgICAgICAgICAgICAgICAweDAwCi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fR1BJTyAgICAgICAgICAgICAgICAgICAgICAgMHgwMQotI2RlZmluZSBBUklaT05BX0dQX0ZOX0lSUTEgICAgICAgICAgICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9JUlEyICAgICAgICAgICAgICAgICAgICAgICAweDAzCi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fT1BDTEsgICAgICAgICAgICAgICAgICAgICAgMHgwNAotI2RlZmluZSBBUklaT05BX0dQX0ZOX0ZMTDFfT1VUICAgICAgICAgICAgICAgICAgIDB4MDUKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9GTEwyX09VVCAgICAgICAgICAgICAgICAgICAweDA2Ci0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fUFdNMSAgICAgICAgICAgICAgICAgICAgICAgMHgwOAotI2RlZmluZSBBUklaT05BX0dQX0ZOX1BXTTIgICAgICAgICAgICAgICAgICAgICAgIDB4MDkKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9TWVNDTEtfVU5ERVJDTE9DS0VEICAgICAgICAweDBBCi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fQVNZTkNDTEtfVU5ERVJDTE9DS0VEICAgICAgMHgwQgotI2RlZmluZSBBUklaT05BX0dQX0ZOX0ZMTDFfTE9DSyAgICAgICAgICAgICAgICAgIDB4MEMKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9GTEwyX0xPQ0sgICAgICAgICAgICAgICAgICAweDBECi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fRkxMMV9DTE9DS19PSyAgICAgICAgICAgICAgMHgwRgotI2RlZmluZSBBUklaT05BX0dQX0ZOX0ZMTDJfQ0xPQ0tfT0sgICAgICAgICAgICAgIDB4MTAKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9IRUFEUEhPTkVfREVUICAgICAgICAgICAgICAweDEyCi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fTUlDX0RFVCAgICAgICAgICAgICAgICAgICAgMHgxMwotI2RlZmluZSBBUklaT05BX0dQX0ZOX1dTRVFfU1RBVFVTICAgICAgICAgICAgICAgIDB4MTUKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9DSUZfQUREUkVTU19FUlJPUiAgICAgICAgICAweDE2Ci0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fQVNSQzFfTE9DSyAgICAgICAgICAgICAgICAgMHgxQQotI2RlZmluZSBBUklaT05BX0dQX0ZOX0FTUkMyX0xPQ0sgICAgICAgICAgICAgICAgIDB4MUIKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9BU1JDX0NPTkZJR19FUlJPUiAgICAgICAgICAweDFDCi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fRFJDMV9TSUdOQUxfREVURUNUICAgICAgICAgMHgxRAotI2RlZmluZSBBUklaT05BX0dQX0ZOX0RSQzFfQU5USUNMSVAgICAgICAgICAgICAgIDB4MUUKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9EUkMxX0RFQ0FZICAgICAgICAgICAgICAgICAweDFGCi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fRFJDMV9OT0lTRSAgICAgICAgICAgICAgICAgMHgyMAotI2RlZmluZSBBUklaT05BX0dQX0ZOX0RSQzFfUVVJQ0tfUkVMRUFTRSAgICAgICAgIDB4MjEKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9EUkMyX1NJR05BTF9ERVRFQ1QgICAgICAgICAweDIyCi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fRFJDMl9BTlRJQ0xJUCAgICAgICAgICAgICAgMHgyMwotI2RlZmluZSBBUklaT05BX0dQX0ZOX0RSQzJfREVDQVkgICAgICAgICAgICAgICAgIDB4MjQKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9EUkMyX05PSVNFICAgICAgICAgICAgICAgICAweDI1Ci0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fRFJDMl9RVUlDS19SRUxFQVNFICAgICAgICAgMHgyNgotI2RlZmluZSBBUklaT05BX0dQX0ZOX01JWEVSX0RST1BQRURfU0FNUExFICAgICAgIDB4MjcKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9BSUYxX0NPTkZJR19FUlJPUiAgICAgICAgICAweDI4Ci0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fQUlGMl9DT05GSUdfRVJST1IgICAgICAgICAgMHgyOQotI2RlZmluZSBBUklaT05BX0dQX0ZOX0FJRjNfQ09ORklHX0VSUk9SICAgICAgICAgIDB4MkEKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9TUEtfVEVNUF9TSFVURE9XTiAgICAgICAgICAweDJCCi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fU1BLX1RFTVBfV0FSTklORyAgICAgICAgICAgMHgyQwotI2RlZmluZSBBUklaT05BX0dQX0ZOX1VOREVSQ0xPQ0tFRCAgICAgICAgICAgICAgIDB4MkQKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9PVkVSQ0xPQ0tFRCAgICAgICAgICAgICAgICAweDJFCi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fRFNQX0lSUTEgICAgICAgICAgICAgICAgICAgMHgzNQotI2RlZmluZSBBUklaT05BX0dQX0ZOX0RTUF9JUlEyICAgICAgICAgICAgICAgICAgIDB4MzYKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9BU1lOQ19PUENMSyAgICAgICAgICAgICAgICAweDNECi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fQk9PVF9ET05FICAgICAgICAgICAgICAgICAgMHg0NAotI2RlZmluZSBBUklaT05BX0dQX0ZOX0RTUDFfUkFNX1JFQURZICAgICAgICAgICAgIDB4NDUKLSNkZWZpbmUgQVJJWk9OQV9HUF9GTl9TWVNDTEtfRU5BX1NUQVRVUyAgICAgICAgICAweDRCCi0jZGVmaW5lIEFSSVpPTkFfR1BfRk5fQVNZTkNDTEtfRU5BX1NUQVRVUyAgICAgICAgMHg0QwotCi0jZGVmaW5lIEFSSVpPTkFfR1BOX0RJUiAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUE5fRElSICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX0RJUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHg4MDAwICAvKiBHUE5fRElSICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX0RJUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBHUE5fRElSICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX0RJUl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUE5fRElSICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX1BVICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwICAvKiBHUE5fUFUgKi8KLSNkZWZpbmUgQVJJWk9OQV9HUE5fUFVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQTl9QVSAqLwotI2RlZmluZSBBUklaT05BX0dQTl9QVV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNCAgLyogR1BOX1BVICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX1BVX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUE5fUFUgKi8KLSNkZWZpbmUgQVJJWk9OQV9HUE5fUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIEdQTl9QRCAqLwotI2RlZmluZSBBUklaT05BX0dQTl9QRF9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1BOX1BEICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX1BEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBHUE5fUEQgKi8KLSNkZWZpbmUgQVJJWk9OQV9HUE5fUERfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQTl9QRCAqLwotI2RlZmluZSBBUklaT05BX0dQTl9MVkwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogR1BOX0xWTCAqLwotI2RlZmluZSBBUklaT05BX0dQTl9MVkxfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDgwMCAgLyogR1BOX0xWTCAqLwotI2RlZmluZSBBUklaT05BX0dQTl9MVkxfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMSAgLyogR1BOX0xWTCAqLwotI2RlZmluZSBBUklaT05BX0dQTl9MVkxfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BOX0xWTCAqLwotI2RlZmluZSBBUklaT05BX0dQTl9QT0wgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1BOX1BPTCAqLwotI2RlZmluZSBBUklaT05BX0dQTl9QT0xfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDQwMCAgLyogR1BOX1BPTCAqLwotI2RlZmluZSBBUklaT05BX0dQTl9QT0xfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAxMCAgLyogR1BOX1BPTCAqLwotI2RlZmluZSBBUklaT05BX0dQTl9QT0xfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BOX1BPTCAqLwotI2RlZmluZSBBUklaT05BX0dQTl9PUF9DRkcgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogR1BOX09QX0NGRyAqLwotI2RlZmluZSBBUklaT05BX0dQTl9PUF9DRkdfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDIwMCAgLyogR1BOX09QX0NGRyAqLwotI2RlZmluZSBBUklaT05BX0dQTl9PUF9DRkdfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgOSAgLyogR1BOX09QX0NGRyAqLwotI2RlZmluZSBBUklaT05BX0dQTl9PUF9DRkdfV0lEVEggICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BOX09QX0NGRyAqLwotI2RlZmluZSBBUklaT05BX0dQTl9EQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMCAgLyogR1BOX0RCICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX0RCX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUE5fREIgKi8KLSNkZWZpbmUgQVJJWk9OQV9HUE5fREJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEdQTl9EQiAqLwotI2RlZmluZSBBUklaT05BX0dQTl9EQl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BOX0RCICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX0ZOX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDdGICAvKiBHUE5fREIgKi8KLSNkZWZpbmUgQVJJWk9OQV9HUE5fRk5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEdQTl9EQiAqLwotI2RlZmluZSBBUklaT05BX0dQTl9GTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgNyAgLyogR1BOX0RCICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvYXJpem9uYS9wZGF0YS5oIGIvaW5jbHVkZS9saW51eC9tZmQvYXJpem9uYS9wZGF0YS5oCmluZGV4IDQ1NzhjNzIuLjE3ODljYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL2FyaXpvbmEvcGRhdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hcml6b25hL3BkYXRhLmgKQEAgLTExLDMxICsxMSwyNiBAQAogI2lmbmRlZiBfQVJJWk9OQV9QREFUQV9ICiAjZGVmaW5lIF9BUklaT05BX1BEQVRBX0gKIAotI2RlZmluZSBBUklaT05BX0dQTl9ESVIgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogR1BOX0RJUiAqLworI2luY2x1ZGUgPGR0LWJpbmRpbmdzL21mZC9hcml6b25hLmg+CisKICNkZWZpbmUgQVJJWk9OQV9HUE5fRElSX01BU0sgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIEdQTl9ESVIgKi8KICNkZWZpbmUgQVJJWk9OQV9HUE5fRElSX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIEdQTl9ESVIgKi8KICNkZWZpbmUgQVJJWk9OQV9HUE5fRElSX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQTl9ESVIgKi8KLSNkZWZpbmUgQVJJWk9OQV9HUE5fUFUgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAgIC8qIEdQTl9QVSAqLwogI2RlZmluZSBBUklaT05BX0dQTl9QVV9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMCAgLyogR1BOX1BVICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX1BVX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE0ICAvKiBHUE5fUFUgKi8KICNkZWZpbmUgQVJJWk9OQV9HUE5fUFVfV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEdQTl9QVSAqLwotI2RlZmluZSBBUklaT05BX0dQTl9QRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogR1BOX1BEICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX1BEX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwICAvKiBHUE5fUEQgKi8KICNkZWZpbmUgQVJJWk9OQV9HUE5fUERfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIEdQTl9QRCAqLwogI2RlZmluZSBBUklaT05BX0dQTl9QRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogR1BOX1BEICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX0xWTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBHUE5fTFZMICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX0xWTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwODAwICAvKiBHUE5fTFZMICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX0xWTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDExICAvKiBHUE5fTFZMICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX0xWTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUE5fTFZMICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX1BPTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUE5fUE9MICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX1BPTF9NQVNLICAgICAgICAgICAgICAgICAgICAgMHgwNDAwICAvKiBHUE5fUE9MICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX1BPTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDEwICAvKiBHUE5fUE9MICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX1BPTF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUE5fUE9MICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX09QX0NGRyAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUE5fT1BfQ0ZHICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX09QX0NGR19NQVNLICAgICAgICAgICAgICAgICAgMHgwMjAwICAvKiBHUE5fT1BfQ0ZHICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX09QX0NGR19TSElGVCAgICAgICAgICAgICAgICAgICAgICA5ICAvKiBHUE5fT1BfQ0ZHICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX09QX0NGR19XSURUSCAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUE5fT1BfQ0ZHICovCi0jZGVmaW5lIEFSSVpPTkFfR1BOX0RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwICAvKiBHUE5fREIgKi8KICNkZWZpbmUgQVJJWk9OQV9HUE5fREJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxMDAgIC8qIEdQTl9EQiAqLwogI2RlZmluZSBBUklaT05BX0dQTl9EQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgLyogR1BOX0RCICovCiAjZGVmaW5lIEFSSVpPTkFfR1BOX0RCX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBHUE5fREIgKi8KQEAgLTQ1LDIzICs0MCwxMCBAQAogCiAjZGVmaW5lIEFSSVpPTkFfTUFYX0dQSU8gNQogCi0jZGVmaW5lIEFSSVpPTkFfMzJLWl9NQ0xLMSAxCi0jZGVmaW5lIEFSSVpPTkFfMzJLWl9NQ0xLMiAyCi0jZGVmaW5lIEFSSVpPTkFfMzJLWl9OT05FICAzCi0KICNkZWZpbmUgQVJJWk9OQV9NQVhfSU5QVVQgNAogCi0jZGVmaW5lIEFSSVpPTkFfRE1JQ19NSUNWREQgICAwCi0jZGVmaW5lIEFSSVpPTkFfRE1JQ19NSUNCSUFTMSAxCi0jZGVmaW5lIEFSSVpPTkFfRE1JQ19NSUNCSUFTMiAyCi0jZGVmaW5lIEFSSVpPTkFfRE1JQ19NSUNCSUFTMyAzCi0KICNkZWZpbmUgQVJJWk9OQV9NQVhfTUlDQklBUyAzCiAKLSNkZWZpbmUgQVJJWk9OQV9JTk1PREVfRElGRiAwCi0jZGVmaW5lIEFSSVpPTkFfSU5NT0RFX1NFICAgMQotI2RlZmluZSBBUklaT05BX0lOTU9ERV9ETUlDIDIKLQogI2RlZmluZSBBUklaT05BX01BWF9PVVRQVVQgNgogCiAjZGVmaW5lIEFSSVpPTkFfTUFYX0FJRiAzCkBAIC0xMTIsNyArOTQsNyBAQAogCWludCBncGlvX2Jhc2U7CiAKIAkvKiogUGluIHN0YXRlIGZvciBHUElPIHBpbnMgKi8KLQlpbnQgZ3Bpb19kZWZhdWx0c1tBUklaT05BX01BWF9HUElPXTsKKwl1bnNpZ25lZCBpbnQgZ3Bpb19kZWZhdWx0c1tBUklaT05BX01BWF9HUElPXTsKIAogCS8qKgogCSAqIE1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIGNsb2NrcyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9tYXg3NzY5My1wcml2YXRlLmggYi9pbmNsdWRlL2xpbnV4L21mZC9tYXg3NzY5My1wcml2YXRlLmgKaW5kZXggOTU1ZGQ5OS4uNTE2MzNlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvbWF4Nzc2OTMtcHJpdmF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL21heDc3NjkzLXByaXZhdGUuaApAQCAtODcsNiArODcsNyBAQAogLyogTUFYNzc2OTMgSVRPUkNIIHJlZ2lzdGVyICovCiAjZGVmaW5lIFRPUkNIX0lPVVQxX1NISUZUCTAKICNkZWZpbmUgVE9SQ0hfSU9VVDJfU0hJRlQJNAorI2RlZmluZSBUT1JDSF9JT1VUX01BU0soeCkJKDB4ZiA8PCAoeCkpCiAjZGVmaW5lIFRPUkNIX0lPVVRfTUlOCQkxNTYyNQogI2RlZmluZSBUT1JDSF9JT1VUX01BWAkJMjUwMDAwCiAjZGVmaW5lIFRPUkNIX0lPVVRfU1RFUAkJMTU2MjUKQEAgLTExMyw4ICsxMTQsOCBAQAogI2RlZmluZSBGTEFTSF9FTl9GTEFTSAkJMHgxCiAjZGVmaW5lIEZMQVNIX0VOX1RPUkNICQkweDIKICNkZWZpbmUgRkxBU0hfRU5fT04JCTB4MwotI2RlZmluZSBGTEFTSF9FTl9TSElGVCh4KQkoNiAtICgoeCkgLSAxKSAqIDIpCi0jZGVmaW5lIFRPUkNIX0VOX1NISUZUKHgpCSgyIC0gKCh4KSAtIDEpICogMikKKyNkZWZpbmUgRkxBU0hfRU5fU0hJRlQoeCkJKDYgLSAoeCkgKiAyKQorI2RlZmluZSBUT1JDSF9FTl9TSElGVCh4KQkoMiAtICh4KSAqIDIpCiAKIC8qIE1BWDc3NjkzIE1BWF9GTEFTSDEgcmVnaXN0ZXIgKi8KICNkZWZpbmUgTUFYX0ZMQVNIMV9NQVhfRkxfRU4JMHg4MApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvbWF4Nzc2OTMuaCBiL2luY2x1ZGUvbGludXgvbWZkL21heDc3NjkzLmgKaW5kZXggZjBiNjU4NS4uZDQ1MGY2OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvbWF4Nzc2OTMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9tYXg3NzY5My5oCkBAIC0zMCw3ICszMCw3IEBACiAjaWZuZGVmIF9fTElOVVhfTUZEX01BWDc3NjkzX0gKICNkZWZpbmUgX19MSU5VWF9NRkRfTUFYNzc2OTNfSAogCi0vKiBNQVg3NzY4NiByZWd1bGF0b3IgSURzICovCisvKiBNQVg3NzY5MyByZWd1bGF0b3IgSURzICovCiBlbnVtIG1heDc3NjkzX3JlZ3VsYXRvcnMgewogCU1BWDc3NjkzX0VTQUZFT1VUMSA9IDAsCiAJTUFYNzc2OTNfRVNBRkVPVVQyLApAQCAtMzgsMTIgKzM4LDYgQEAKIAlNQVg3NzY5M19SRUdfTUFYLAogfTsKIAotc3RydWN0IG1heDc3NjkzX3JlZ3VsYXRvcl9kYXRhIHsKLQlpbnQgaWQ7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9pbml0X2RhdGEgKmluaXRkYXRhOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKLX07Ci0KIHN0cnVjdCBtYXg3NzY5M19yZWdfZGF0YSB7CiAJdTggYWRkcjsKIAl1OCBkYXRhOwpAQCAtODcsMjYgKzgxLDkgQEAKIAlNQVg3NzY5M19MRURfQk9PU1RfRklYRUQsCiB9OwogCi1zdHJ1Y3QgbWF4Nzc2OTNfbGVkX3BsYXRmb3JtX2RhdGEgewotCXUzMiBmbGVkc1syXTsKLQl1MzIgaW91dF90b3JjaFsyXTsKLQl1MzIgaW91dF9mbGFzaFsyXTsKLQl1MzIgdHJpZ2dlclsyXTsKLQl1MzIgdHJpZ2dlcl90eXBlWzJdOwotCXUzMiBudW1fbGVkczsKLQl1MzIgYm9vc3RfbW9kZTsKLQl1MzIgZmxhc2hfdGltZW91dDsKLQl1MzIgYm9vc3Rfdm91dDsKLQl1MzIgbG93X3ZzeXM7Ci19OwotCiAvKiBNQVg3NzY5MyAqLwogCiBzdHJ1Y3QgbWF4Nzc2OTNfcGxhdGZvcm1fZGF0YSB7Ci0JLyogcmVndWxhdG9yIGRhdGEgKi8KLQlzdHJ1Y3QgbWF4Nzc2OTNfcmVndWxhdG9yX2RhdGEgKnJlZ3VsYXRvcnM7Ci0JaW50IG51bV9yZWd1bGF0b3JzOwotCiAJLyogbXVpYyBkYXRhICovCiAJc3RydWN0IG1heDc3NjkzX211aWNfcGxhdGZvcm1fZGF0YSAqbXVpY19kYXRhOwogCXN0cnVjdCBtYXg3NzY5M19sZWRfcGxhdGZvcm1fZGF0YSAqbGVkX2RhdGE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9tYXg3Nzg0My1wcml2YXRlLmggYi9pbmNsdWRlL2xpbnV4L21mZC9tYXg3Nzg0My1wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3OGFjZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL21heDc3ODQzLXByaXZhdGUuaApAQCAtMCwwICsxLDQ1NCBAQAorLyoKKyAqIENvbW1vbiB2YXJpYWJsZXMgZm9yIHRoZSBNYXhpbSBNQVg3Nzg0MyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU2Ftc3VuZyBFbGVjdHJvbmljcworICogQXV0aG9yOiBKYWV3b24gS2ltIDxqYWV3b24wMi5raW1Ac2Ftc3VuZy5jb20+CisgKiBBdXRob3I6IEJlb21obyBTZW8gPGJlb21oby5zZW9Ac2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9fTUFYNzc4NDNfUFJJVkFURV9IXworI2RlZmluZSBfX01BWDc3ODQzX1BSSVZBVEVfSF8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorCisjZGVmaW5lIEkyQ19BRERSX1RPUFNZUwkoMHhDQyA+PiAxKQorI2RlZmluZSBJMkNfQUREUl9DSEcJKDB4RDIgPj4gMSkKKyNkZWZpbmUgSTJDX0FERFJfRkcJKDB4NkMgPj4gMSkKKyNkZWZpbmUgSTJDX0FERFJfTVVJQwkoMHg0QSA+PiAxKQorCisvKiBUb3BzeXMsIEhhcHRpYyBhbmQgTEVEIHJlZ2lzdGVycyAqLworZW51bSBtYXg3Nzg0M19zeXNfcmVnIHsKKwlNQVg3Nzg0M19TWVNfUkVHX1BNSUNJRAkJPSAweDAwLAorCU1BWDc3ODQzX1NZU19SRUdfUE1JQ1JFVgk9IDB4MDEsCisJTUFYNzc4NDNfU1lTX1JFR19NQUlOQ1RSTDEJPSAweDAyLAorCU1BWDc3ODQzX1NZU19SRUdfSU5UU1JDCQk9IDB4MjIsCisJTUFYNzc4NDNfU1lTX1JFR19JTlRTUkNNQVNLCT0gMHgyMywKKwlNQVg3Nzg0M19TWVNfUkVHX1NZU0lOVFNSQwk9IDB4MjQsCisJTUFYNzc4NDNfU1lTX1JFR19TWVNJTlRNQVNLCT0gMHgyNiwKKwlNQVg3Nzg0M19TWVNfUkVHX1RPUFNZU19TVEFUCT0gMHgyOCwKKwlNQVg3Nzg0M19TWVNfUkVHX1NBRkVPVVRDVFJMCT0gMHhDNiwKKworCU1BWDc3ODQzX1NZU19SRUdfRU5ELAorfTsKKworZW51bSBtYXg3Nzg0M19oYXB0aWNfcmVnIHsKKwlNQVg3Nzg0M19IQVBfUkVHX01DT05GSUcJPSAweDEwLAorCisJTUFYNzc4NDNfSEFQX1JFR19FTkQsCit9OworCitlbnVtIG1heDc3ODQzX2xlZF9yZWcgeworCU1BWDc3ODQzX0xFRF9SRUdfTEVERU4JCT0gMHgzMCwKKwlNQVg3Nzg0M19MRURfUkVHX0xFRDBCUlQJPSAweDMxLAorCU1BWDc3ODQzX0xFRF9SRUdfTEVEMUJSVAk9IDB4MzIsCisJTUFYNzc4NDNfTEVEX1JFR19MRUQyQlJUCT0gMHgzMywKKwlNQVg3Nzg0M19MRURfUkVHX0xFRDNCUlQJPSAweDM0LAorCU1BWDc3ODQzX0xFRF9SRUdfTEVEQkxOSwk9IDB4MzgsCisJTUFYNzc4NDNfTEVEX1JFR19MRURSQU1QCT0gMHgzNiwKKworCU1BWDc3ODQzX0xFRF9SRUdfRU5ELAorfTsKKworLyogQ2hhcmdlciByZWdpc3RlcnMgKi8KK2VudW0gbWF4Nzc4NDNfY2hhcmdlcl9yZWcgeworCU1BWDc3ODQzX0NIR19SRUdfQ0hHX0lOVAk9IDB4QjAsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfSU5UX01BU0sJPSAweEIxLAorCU1BWDc3ODQzX0NIR19SRUdfQ0hHX0lOVF9PSwk9IDB4QjIsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfRFRMU18wMAk9IDB4QjMsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfRFRMU18wMQk9IDB4QjQsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfRFRMU18wMgk9IDB4QjUsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfQ05GR18wMAk9IDB4QjcsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfQ05GR18wMQk9IDB4QjgsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfQ05GR18wMgk9IDB4QjksCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfQ05GR18wMwk9IDB4QkEsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfQ05GR18wNAk9IDB4QkIsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfQ05GR18wNgk9IDB4QkQsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfQ05GR18wNwk9IDB4QkUsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfQ05GR18wOQk9IDB4QzAsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfQ05GR18xMAk9IDB4QzEsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfQ05GR18xMQk9IDB4QzIsCisJTUFYNzc4NDNfQ0hHX1JFR19DSEdfQ05GR18xMgk9IDB4QzMsCisKKwlNQVg3Nzg0M19DSEdfUkVHX0VORCwKK307CisKKy8qIEZ1ZWwgZ2F1Z2UgcmVnaXN0ZXJzICovCitlbnVtIG1heDc3ODQzX2Z1ZWxnYXVnZSB7CisJTUFYNzc4NDNfRkdfUkVHX1NUQVRVUwkJPSAweDAwLAorCU1BWDc3ODQzX0ZHX1JFR19WQUxSVF9USAk9IDB4MDEsCisJTUFYNzc4NDNfRkdfUkVHX1RBTFJUX1RICT0gMHgwMiwKKwlNQVg3Nzg0M19GR19SRUdfU0FMUlRfVEgJPSAweDAzLAorCU1BWDc3ODQzX0ZHX1JBVEVfQVRfUkFURQk9IDB4MDQsCisJTUFYNzc4NDNfRkdfUkVHX1JFTUNBUF9SRVAJPSAweDA1LAorCU1BWDc3ODQzX0ZHX1JFR19TT0NSRVAJCT0gMHgwNiwKKwlNQVg3Nzg0M19GR19SRUdfQUdFCQk9IDB4MDcsCisJTUFYNzc4NDNfRkdfUkVHX1RFTVAJCT0gMHgwOCwKKwlNQVg3Nzg0M19GR19SRUdfVkNFTEwJCT0gMHgwOSwKKwlNQVg3Nzg0M19GR19SRUdfQ1VSUkVOVAkJPSAweDBBLAorCU1BWDc3ODQzX0ZHX1JFR19BVkdfQ1VSUkVOVAk9IDB4MEIsCisJTUFYNzc4NDNfRkdfUkVHX1NPQ01JWAkJPSAweDBELAorCU1BWDc3ODQzX0ZHX1JFR19TT0NBVgkJPSAweDBFLAorCU1BWDc3ODQzX0ZHX1JFR19SRU1DQVBfTUlYCT0gMHgwRiwKKwlNQVg3Nzg0M19GR19SRUdfRlVMTENBUAkJPSAweDEwLAorCU1BWDc3ODQzX0ZHX1JFR19BVkdfVEVNUAk9IDB4MTYsCisJTUFYNzc4NDNfRkdfUkVHX0NZQ0xFUwkJPSAweDE3LAorCU1BWDc3ODQzX0ZHX1JFR19BVkdfVkNFTEwJPSAweDE5LAorCU1BWDc3ODQzX0ZHX1JFR19DT05GSUcJCT0gMHgxRCwKKwlNQVg3Nzg0M19GR19SRUdfUkVNQ0FQX0FWCT0gMHgxRiwKKwlNQVg3Nzg0M19GR19SRUdfRlVMTENBUF9OT00JPSAweDIzLAorCU1BWDc3ODQzX0ZHX1JFR19NSVNDQ0ZHCQk9IDB4MkIsCisJTUFYNzc4NDNfRkdfUkVHX1JDT01QCQk9IDB4MzgsCisJTUFYNzc4NDNfRkdfUkVHX0ZTVEFUCQk9IDB4M0QsCisJTUFYNzc4NDNfRkdfUkVHX0RRQUNDCQk9IDB4NDUsCisJTUFYNzc4NDNfRkdfUkVHX0RQQUNDCQk9IDB4NDYsCisJTUFYNzc4NDNfRkdfUkVHX09DVgkJPSAweEVFLAorCU1BWDc3ODQzX0ZHX1JFR19WRk9DVgkJPSAweEZCLAorCU1BWDc3ODQzX0ZHX1NPQ1ZGCQk9IDB4RkYsCisKKwlNQVg3Nzg0M19GR19FTkQsCit9OworCisvKiBNVUlDIHJlZ2lzdGVycyAqLworZW51bSBtYXg3Nzg0M19tdWljX3JlZyB7CisJTUFYNzc4NDNfTVVJQ19SRUdfSUQJCT0gMHgwMCwKKwlNQVg3Nzg0M19NVUlDX1JFR19JTlQxCQk9IDB4MDEsCisJTUFYNzc4NDNfTVVJQ19SRUdfSU5UMgkJPSAweDAyLAorCU1BWDc3ODQzX01VSUNfUkVHX0lOVDMJCT0gMHgwMywKKwlNQVg3Nzg0M19NVUlDX1JFR19TVEFUVVMxCT0gMHgwNCwKKwlNQVg3Nzg0M19NVUlDX1JFR19TVEFUVVMyCT0gMHgwNSwKKwlNQVg3Nzg0M19NVUlDX1JFR19TVEFUVVMzCT0gMHgwNiwKKwlNQVg3Nzg0M19NVUlDX1JFR19JTlRNQVNLMQk9IDB4MDcsCisJTUFYNzc4NDNfTVVJQ19SRUdfSU5UTUFTSzIJPSAweDA4LAorCU1BWDc3ODQzX01VSUNfUkVHX0lOVE1BU0szCT0gMHgwOSwKKwlNQVg3Nzg0M19NVUlDX1JFR19DREVUQ1RSTDEJPSAweDBBLAorCU1BWDc3ODQzX01VSUNfUkVHX0NERVRDVFJMMgk9IDB4MEIsCisJTUFYNzc4NDNfTVVJQ19SRUdfQ09OVFJPTDEJPSAweDBDLAorCU1BWDc3ODQzX01VSUNfUkVHX0NPTlRST0wyCT0gMHgwRCwKKwlNQVg3Nzg0M19NVUlDX1JFR19DT05UUk9MMwk9IDB4MEUsCisJTUFYNzc4NDNfTVVJQ19SRUdfQ09OVFJPTDQJPSAweDE2LAorCU1BWDc3ODQzX01VSUNfUkVHX0hWQ09OVFJPTDEJPSAweDE3LAorCU1BWDc3ODQzX01VSUNfUkVHX0hWQ09OVFJPTDIJPSAweDE4LAorCisJTUFYNzc4NDNfTVVJQ19SRUdfRU5ELAorfTsKKworZW51bSBtYXg3Nzg0M19pcnEgeworCS8qIFRvcHN5czogU1lTVEVNICovCisJTUFYNzc4NDNfU1lTX0lSUV9TWVNJTlRTUkNfU1lTVVZMT19JTlQsCisJTUFYNzc4NDNfU1lTX0lSUV9TWVNJTlRTUkNfU1lTT1ZMT19JTlQsCisJTUFYNzc4NDNfU1lTX0lSUV9TWVNJTlRTUkNfVFNIRE5fSU5ULAorCU1BWDc3ODQzX1NZU19JUlFfU1lTSU5UU1JDX1RNX0lOVCwKKworCS8qIENoYXJnZXI6IENIR19JTlQgKi8KKwlNQVg3Nzg0M19DSEdfSVJRX0NIR19JTlRfQllQX0ksCisJTUFYNzc4NDNfQ0hHX0lSUV9DSEdfSU5UX0JBVFBfSSwKKwlNQVg3Nzg0M19DSEdfSVJRX0NIR19JTlRfQkFUX0ksCisJTUFYNzc4NDNfQ0hHX0lSUV9DSEdfSU5UX0NIR19JLAorCU1BWDc3ODQzX0NIR19JUlFfQ0hHX0lOVF9XQ0lOX0ksCisJTUFYNzc4NDNfQ0hHX0lSUV9DSEdfSU5UX0NIR0lOX0ksCisJTUFYNzc4NDNfQ0hHX0lSUV9DSEdfSU5UX0FJQ0xfSSwKKworCU1BWDc3ODQzX0lSUV9OVU0sCit9OworCitlbnVtIG1heDc3ODQzX2lycV9tdWljIHsKKwkvKiBNVUlDOiBJTlQxICovCisJTUFYNzc4NDNfTVVJQ19JUlFfSU5UMV9BREMsCisJTUFYNzc4NDNfTVVJQ19JUlFfSU5UMV9BRENFUlJPUiwKKwlNQVg3Nzg0M19NVUlDX0lSUV9JTlQxX0FEQzFLLAorCisJLyogTVVJQzogSU5UMiAqLworCU1BWDc3ODQzX01VSUNfSVJRX0lOVDJfQ0hHVFlQLAorCU1BWDc3ODQzX01VSUNfSVJRX0lOVDJfQ0hHREVUUlVOLAorCU1BWDc3ODQzX01VSUNfSVJRX0lOVDJfRENEVE1SLAorCU1BWDc3ODQzX01VSUNfSVJRX0lOVDJfRFhPVlAsCisJTUFYNzc4NDNfTVVJQ19JUlFfSU5UMl9WQlZPTFQsCisKKwkvKiBNVUlDOiBJTlQzICovCisJTUFYNzc4NDNfTVVJQ19JUlFfSU5UM19WQkFEQywKKwlNQVg3Nzg0M19NVUlDX0lSUV9JTlQzX1ZETk1PTiwKKwlNQVg3Nzg0M19NVUlDX0lSUV9JTlQzX0ROUkVTLAorCU1BWDc3ODQzX01VSUNfSVJRX0lOVDNfTVBOQUNLLAorCU1BWDc3ODQzX01VSUNfSVJRX0lOVDNfTVJYQlVGT1csCisJTUFYNzc4NDNfTVVJQ19JUlFfSU5UM19NUlhUUkYsCisJTUFYNzc4NDNfTVVJQ19JUlFfSU5UM19NUlhQRVJSLAorCU1BWDc3ODQzX01VSUNfSVJRX0lOVDNfTVJYUkRZLAorCisJTUFYNzc4NDNfTVVJQ19JUlFfTlVNLAorfTsKKworLyogTUFYNzc4NDMgaW50ZXJydXB0cyAqLworI2RlZmluZSBNQVg3Nzg0M19TWVNfSVJRX1NZU1VWTE9fSU5UCQlCSVQoMCkKKyNkZWZpbmUgTUFYNzc4NDNfU1lTX0lSUV9TWVNPVkxPX0lOVAkJQklUKDEpCisjZGVmaW5lIE1BWDc3ODQzX1NZU19JUlFfVFNIRE5fSU5UCQlCSVQoMikKKyNkZWZpbmUgTUFYNzc4NDNfU1lTX0lSUV9UTV9JTlQJCQlCSVQoMykKKworLyogTUFYNzc4NDMgTUFJTkNUUkwxIHJlZ2lzdGVyICovCisjZGVmaW5lIE1BSU5DVFJMMV9CSUFTRU5fU0hJRlQJCQk3CisjZGVmaW5lIE1BWDc3ODQzX01BSU5DVFJMMV9CSUFTRU5fTUFTSwkJQklUKE1BSU5DVFJMMV9CSUFTRU5fU0hJRlQpCisKKy8qIE1BWDc3ODQzIE1DT05GSUcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUNPTkZJR19NT0RFX1NISUZUCQkJNworI2RlZmluZSBNQ09ORklHX01FTl9TSElGVAkJCTYKKyNkZWZpbmUgTUNPTkZJR19QRElWX1NISUZUCQkJMAorCisjZGVmaW5lIE1BWDc3ODQzX01DT05GSUdfTU9ERV9NQVNLCQlCSVQoTUNPTkZJR19NT0RFX1NISUZUKQorI2RlZmluZSBNQVg3Nzg0M19NQ09ORklHX01FTl9NQVNLCQlCSVQoTUNPTkZJR19NRU5fU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX01DT05GSUdfUERJVl9NQVNLCQkoMHgzIDw8IE1DT05GSUdfUERJVl9TSElGVCkKKworLyogTWF4Nzc4NDMgY2hhcmdlciBpbnN0ZXJydXB0cyAqLworI2RlZmluZSBNQVg3Nzg0M19DSEdfQllQX0kJCQlCSVQoMCkKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX0JBVFBfSQkJCUJJVCgyKQorI2RlZmluZSBNQVg3Nzg0M19DSEdfQkFUX0kJCQlCSVQoMykKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX0NIR19JCQkJQklUKDQpCisjZGVmaW5lIE1BWDc3ODQzX0NIR19XQ0lOX0kJCQlCSVQoNSkKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX0NIR0lOX0kJCQlCSVQoNikKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX0FJQ0xfSQkJCUJJVCg3KQorCisvKiBNQVg3Nzg0MyBDSEdfSU5UX09LIHJlZ2lzdGVyICovCisjZGVmaW5lIE1BWDc3ODQzX0NIR19CWVBfT0sJCQlCSVQoMCkKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX0JBVFBfT0sJCQlCSVQoMikKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX0JBVF9PSwkJCUJJVCgzKQorI2RlZmluZSBNQVg3Nzg0M19DSEdfQ0hHX09LCQkJQklUKDQpCisjZGVmaW5lIE1BWDc3ODQzX0NIR19XQ0lOX09LCQkJQklUKDUpCisjZGVmaW5lIE1BWDc3ODQzX0NIR19DSEdJTl9PSwkJCUJJVCg2KQorI2RlZmluZSBNQVg3Nzg0M19DSEdfQUlDTF9PSwkJCUJJVCg3KQorCisvKiBNQVg3Nzg0MyBDSEdfREVUQUlMU18wMCByZWdpc3RlciAqLworI2RlZmluZSBNQVg3Nzg0M19DSEdfQkFUX0RUTFMJCQlCSVQoMCkKKworLyogTUFYNzc4NDMgQ0hHX0RFVEFJTFNfMDEgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX0RUTFNfTUFTSwkJCTB4MGYKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX1BRX01PREUJCQkweDAwCisjZGVmaW5lIE1BWDc3ODQzX0NIR19DQ19NT0RFCQkJMHgwMQorI2RlZmluZSBNQVg3Nzg0M19DSEdfQ1ZfTU9ERQkJCTB4MDIKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX1RPX01PREUJCQkweDAzCisjZGVmaW5lIE1BWDc3ODQzX0NIR19ET19NT0RFCQkJMHgwNAorI2RlZmluZSBNQVg3Nzg0M19DSEdfSFRfTU9ERQkJCTB4MDUKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX1RGX01PREUJCQkweDA2CisjZGVmaW5lIE1BWDc3ODQzX0NIR19UU19NT0RFCQkJMHgwNworI2RlZmluZSBNQVg3Nzg0M19DSEdfT0ZGX01PREUJCQkweDA4CisKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX0JBVF9EVExTX01BU0sJCTB4ZjAKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX05PX0JBVAkJCSgweDAwIDw8IDQpCisjZGVmaW5lIE1BWDc3ODQzX0NIR19MT1dfVk9MVF9CQVQJCSgweDAxIDw8IDQpCisjZGVmaW5lIE1BWDc3ODQzX0NIR19MT05HX0JBVF9USU1FCQkoMHgwMiA8PCA0KQorI2RlZmluZSBNQVg3Nzg0M19DSEdfT0tfQkFUCQkJKDB4MDMgPDwgNCkKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX09LX0xPV19WT0xUX0JBVAkJKDB4MDQgPDwgNCkKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX09WRVJfVk9MVF9CQVQJCSgweDA1IDw8IDQpCisjZGVmaW5lIE1BWDc3ODQzX0NIR19PVkVSX0NVUlJFTlRfQkFUCQkoMHgwNiA8PCA0KQorCisvKiBNQVg3Nzg0MyBDSEdfQ05GR18wMCByZWdpc3RlciAqLworI2RlZmluZSBNQVg3Nzg0M19DSEdfRElTQUJMRQkJCTB4MDAKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX0VOQUJMRQkJCTB4MDUKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX01BU0sJCQkweDAxCisjZGVmaW5lIE1BWDc3ODQzX0NIR19CVUNLX01BU0sJCQkweDA0CisKKy8qIE1BWDc3ODQzIENIR19DTkZHXzAxIHJlZ2lzdGVyICovCisjZGVmaW5lIE1BWDc3ODQzX0NIR19SRVNUQVJUX1RIUkVTSE9MRF8xMDAJMHgwMAorI2RlZmluZSBNQVg3Nzg0M19DSEdfUkVTVEFSVF9USFJFU0hPTERfMTUwCTB4MTAKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX1JFU1RBUlRfVEhSRVNIT0xEXzIwMAkweDIwCisjZGVmaW5lIE1BWDc3ODQzX0NIR19SRVNUQVJUX1RIUkVTSE9MRF9ESVNBQkxFCTB4MzAKKworLyogTUFYNzc4NDMgQ0hHX0NORkdfMDIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX0ZBU1RfQ0hHX0NVUlJFTlRfTUlOCTEwMDAwMAorI2RlZmluZSBNQVg3Nzg0M19DSEdfRkFTVF9DSEdfQ1VSUkVOVF9NQVgJMzE1MDAwMAorI2RlZmluZSBNQVg3Nzg0M19DSEdfRkFTVF9DSEdfQ1VSUkVOVF9TVEVQCTUwMDAwCisjZGVmaW5lIE1BWDc3ODQzX0NIR19GQVNUX0NIR19DVVJSRU5UX01BU0sJMHgzZgorI2RlZmluZSBNQVg3Nzg0M19DSEdfT1RHX0lMSU1JVF81MDAJCSgweDAwIDw8IDYpCisjZGVmaW5lIE1BWDc3ODQzX0NIR19PVEdfSUxJTUlUXzkwMAkJKDB4MDEgPDwgNikKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX09UR19JTElNSVRfMTIwMAkJKDB4MDIgPDwgNikKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX09UR19JTElNSVRfMTUwMAkJKDB4MDMgPDwgNikKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX09UR19JTElNSVRfTUFTSwkJMHhjMAorCisvKiBNQVg3Nzg0MyBDSEdfQ05GR18wMyByZWdpc3RlciAqLworI2RlZmluZSBNQVg3Nzg0M19DSEdfVE9QX09GRl9DVVJSRU5UX01JTgkxMjUwMDAKKyNkZWZpbmUgTUFYNzc4NDNfQ0hHX1RPUF9PRkZfQ1VSUkVOVF9NQVgJNjUwMDAwCisjZGVmaW5lIE1BWDc3ODQzX0NIR19UT1BfT0ZGX0NVUlJFTlRfU1RFUAk3NTAwMAorI2RlZmluZSBNQVg3Nzg0M19DSEdfVE9QX09GRl9DVVJSRU5UX01BU0sJMHgwNworCisvKiBNQVg3Nzg0MyBDSEdfQ05GR18wNiByZWdpc3RlciAqLworI2RlZmluZSBNQVg3Nzg0M19DSEdfV1JJVEVfQ0FQX0JMT0NLCQkweDEwCisjZGVmaW5lIE1BWDc3ODQzX0NIR19XUklURV9DQVBfVU5CTE9DSwkJMHgwQworCisvKiBNQVg3Nzg0M19DSEdfQ05GR18wOV9yZWdpc3RlciAqLworI2RlZmluZSBNQVg3Nzg0M19DSEdfSU5QVVRfQ1VSUkVOVF9MSU1JVF9NSU4JMTAwMDAwCisjZGVmaW5lIE1BWDc3ODQzX0NIR19JTlBVVF9DVVJSRU5UX0xJTUlUX01BWAk0MDAwMDAwCisjZGVmaW5lIE1BWDc3ODQzX0NIR19JTlBVVF9DVVJSRU5UX0xJTUlUX1JFRgkzMzY3MDAwCisjZGVmaW5lIE1BWDc3ODQzX0NIR19JTlBVVF9DVVJSRU5UX0xJTUlUX1NURVAJMzMwMDAKKworI2RlZmluZSBNQVg3Nzg0M19NVUlDX0FEQwkJCUJJVCgwKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX0FEQ0VSUk9SCQkJQklUKDIpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfQURDMUsJCQlCSVQoMykKKworI2RlZmluZSBNQVg3Nzg0M19NVUlDX0NIR1RZUAkJCUJJVCgwKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX0NIR0RFVFJVTgkJCUJJVCgxKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX0RDRFRNUgkJCUJJVCgyKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX0RYT1ZQCQkJQklUKDMpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfVkJWT0xUCQkJQklUKDQpCisKKyNkZWZpbmUgTUFYNzc4NDNfTVVJQ19WQkFEQwkJCUJJVCgwKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX1ZETk1PTgkJCUJJVCgxKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX0ROUkVTCQkJQklUKDIpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfTVBOQUNLCQkJQklUKDMpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfTVJYQlVGT1cJCQlCSVQoNCkKKyNkZWZpbmUgTUFYNzc4NDNfTVVJQ19NUlhUUkYJCQlCSVQoNSkKKyNkZWZpbmUgTUFYNzc4NDNfTVVJQ19NUlhQRVJSCQkJQklUKDYpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfTVJYUkRZCQkJQklUKDcpCisKKy8qIE1BWDc3ODQzIElOVFNSQ01BU0sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgTUFYNzc4NDNfSU5UU1JDTUFTS19DSEdSCQkwCisjZGVmaW5lIE1BWDc3ODQzX0lOVFNSQ01BU0tfU1lTCQkJMQorI2RlZmluZSBNQVg3Nzg0M19JTlRTUkNNQVNLX0ZHCQkJMgorI2RlZmluZSBNQVg3Nzg0M19JTlRTUkNNQVNLX01VSUMJCTMKKworI2RlZmluZSBNQVg3Nzg0M19JTlRTUkNNQVNLX0NIR1JfTUFTSyAgICAgICAgICBCSVQoTUFYNzc4NDNfSU5UU1JDTUFTS19DSEdSKQorI2RlZmluZSBNQVg3Nzg0M19JTlRTUkNNQVNLX1NZU19NQVNLICAgICAgICAgICBCSVQoTUFYNzc4NDNfSU5UU1JDTUFTS19TWVMpCisjZGVmaW5lIE1BWDc3ODQzX0lOVFNSQ01BU0tfRkdfTUFTSyAgICAgICAgICAgIEJJVChNQVg3Nzg0M19JTlRTUkNNQVNLX0ZHKQorI2RlZmluZSBNQVg3Nzg0M19JTlRTUkNNQVNLX01VSUNfTUFTSyAgICAgICAgICBCSVQoTUFYNzc4NDNfSU5UU1JDTUFTS19NVUlDKQorCisjZGVmaW5lIE1BWDc3ODQzX0lOVFNSQ19NQVNLX01BU0sgXAorCShNQVg3Nzg0M19JTlRTUkNNQVNLX01VSUNfTUFTSyB8IE1BWDc3ODQzX0lOVFNSQ01BU0tfRkdfTUFTSyB8IFwKKwlNQVg3Nzg0M19JTlRTUkNNQVNLX1NZU19NQVNLIHwgTUFYNzc4NDNfSU5UU1JDTUFTS19DSEdSX01BU0spCisKKy8qIE1BWDc3ODQzIFNUQVRVUyByZWdpc3RlciovCisjZGVmaW5lIFNUQVRVUzFfQURDX1NISUZUCQkJMAorI2RlZmluZSBTVEFUVVMxX0FEQ0VSUk9SX1NISUZUCQkJNgorI2RlZmluZSBTVEFUVVMxX0FEQzFLX1NISUZUCQkJNworI2RlZmluZSBTVEFUVVMyX0NIR1RZUF9TSElGVAkJCTAKKyNkZWZpbmUgU1RBVFVTMl9DSEdERVRSVU5fU0hJRlQJCQkzCisjZGVmaW5lIFNUQVRVUzJfRENEVE1SX1NISUZUCQkJNAorI2RlZmluZSBTVEFUVVMyX0RYT1ZQX1NISUZUCQkJNQorI2RlZmluZSBTVEFUVVMyX1ZCVk9MVF9TSElGVAkJCTYKKyNkZWZpbmUgU1RBVFVTM19WQkFEQ19TSElGVAkJCTAKKyNkZWZpbmUgU1RBVFVTM19WRE5NT05fU0hJRlQJCQk0CisjZGVmaW5lIFNUQVRVUzNfRE5SRVNfU0hJRlQJCQk1CisjZGVmaW5lIFNUQVRVUzNfTVBOQUNLX1NISUZUCQkJNgorCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfU1RBVFVTMV9BRENfTUFTSwkJKDB4MWYgPDwgU1RBVFVTMV9BRENfU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfU1RBVFVTMV9BRENFUlJPUl9NQVNLCUJJVChTVEFUVVMxX0FEQ0VSUk9SX1NISUZUKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX1NUQVRVUzFfQURDMUtfTUFTSwlCSVQoU1RBVFVTMV9BREMxS19TSElGVCkKKyNkZWZpbmUgTUFYNzc4NDNfTVVJQ19TVEFUVVMyX0NIR1RZUF9NQVNLCSgweDcgPDwgU1RBVFVTMl9DSEdUWVBfU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfU1RBVFVTMl9DSEdERVRSVU5fTUFTSwlCSVQoU1RBVFVTMl9DSEdERVRSVU5fU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfU1RBVFVTMl9EQ0RUTVJfTUFTSwlCSVQoU1RBVFVTMl9EQ0RUTVJfU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfU1RBVFVTMl9EWE9WUF9NQVNLCUJJVChTVEFUVVMyX0RYT1ZQX1NISUZUKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX1NUQVRVUzJfVkJWT0xUX01BU0sJQklUKFNUQVRVUzJfVkJWT0xUX1NISUZUKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX1NUQVRVUzNfVkJBRENfTUFTSwkoMHhmIDw8IFNUQVRVUzNfVkJBRENfU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfU1RBVFVTM19WRE5NT05fTUFTSwlCSVQoU1RBVFVTM19WRE5NT05fU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfU1RBVFVTM19ETlJFU19NQVNLCUJJVChTVEFUVVMzX0ROUkVTX1NISUZUKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX1NUQVRVUzNfTVBOQUNLX01BU0sJQklUKFNUQVRVUzNfTVBOQUNLX1NISUZUKQorCisvKiBNQVg3Nzg0MyBDT05UUk9MIHJlZ2lzdGVyICovCisjZGVmaW5lIENPTlRST0wxX0NPTVAxU1dfU0hJRlQJCQkwCisjZGVmaW5lIENPTlRST0wxX0NPTVAyU1dfU0hJRlQJCQkzCisjZGVmaW5lIENPTlRST0wxX0lEQkVOX1NISUZUCQkJNworI2RlZmluZSBDT05UUk9MMl9MT1dQV1JfU0hJRlQJCQkwCisjZGVmaW5lIENPTlRST0wyX0FEQ0VOX1NISUZUCQkJMQorI2RlZmluZSBDT05UUk9MMl9DUEVOX1NISUZUCQkJMgorI2RlZmluZSBDT05UUk9MMl9BQ0NfREVUX1NISUZUCQkJNQorI2RlZmluZSBDT05UUk9MMl9VU0JDUElOVF9TSElGVAkJCTYKKyNkZWZpbmUgQ09OVFJPTDJfUkNQU19TSElGVAkJCTcKKyNkZWZpbmUgQ09OVFJPTDNfSklHU0VUX1NISUZUCQkJMAorI2RlZmluZSBDT05UUk9MNF9BRENEQlNFVF9TSElGVAkJCTAKKyNkZWZpbmUgQ09OVFJPTDRfVVNCQVVUT19TSElGVAkJCTQKKyNkZWZpbmUgQ09OVFJPTDRfRkNUQVVUT19TSElGVAkJCTUKKyNkZWZpbmUgQ09OVFJPTDRfQURDTU9ERV9TSElGVAkJCTYKKworI2RlZmluZSBNQVg3Nzg0M19NVUlDX0NPTlRST0wxX0NPTVAxU1dfTUFTSwkoMHg3IDw8IENPTlRST0wxX0NPTVAxU1dfU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfQ09OVFJPTDFfQ09NUDJTV19NQVNLCSgweDcgPDwgQ09OVFJPTDFfQ09NUDJTV19TSElGVCkKKyNkZWZpbmUgTUFYNzc4NDNfTVVJQ19DT05UUk9MMV9JREJFTl9NQVNLCUJJVChDT05UUk9MMV9JREJFTl9TSElGVCkKKyNkZWZpbmUgTUFYNzc4NDNfTVVJQ19DT05UUk9MMl9MT1dQV1JfTUFTSwlCSVQoQ09OVFJPTDJfTE9XUFdSX1NISUZUKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX0NPTlRST0wyX0FEQ0VOX01BU0sJQklUKENPTlRST0wyX0FEQ0VOX1NISUZUKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX0NPTlRST0wyX0NQRU5fTUFTSwlCSVQoQ09OVFJPTDJfQ1BFTl9TSElGVCkKKyNkZWZpbmUgTUFYNzc4NDNfTVVJQ19DT05UUk9MMl9BQ0NfREVUX01BU0sJQklUKENPTlRST0wyX0FDQ19ERVRfU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfQ09OVFJPTDJfVVNCQ1BJTlRfTUFTSwlCSVQoQ09OVFJPTDJfVVNCQ1BJTlRfU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfQ09OVFJPTDJfUkNQU19NQVNLCUJJVChDT05UUk9MMl9SQ1BTX1NISUZUKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX0NPTlRST0wzX0pJR1NFVF9NQVNLCSgweDMgPDwgQ09OVFJPTDNfSklHU0VUX1NISUZUKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX0NPTlRST0w0X0FEQ0RCU0VUX01BU0sJKDB4MyA8PCBDT05UUk9MNF9BRENEQlNFVF9TSElGVCkKKyNkZWZpbmUgTUFYNzc4NDNfTVVJQ19DT05UUk9MNF9VU0JBVVRPX01BU0sJQklUKENPTlRST0w0X1VTQkFVVE9fU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX01VSUNfQ09OVFJPTDRfRkNUQVVUT19NQVNLCUJJVChDT05UUk9MNF9GQ1RBVVRPX1NISUZUKQorI2RlZmluZSBNQVg3Nzg0M19NVUlDX0NPTlRST0w0X0FEQ01PREVfTUFTSwkoMHgzIDw8IENPTlRST0w0X0FEQ01PREVfU0hJRlQpCisKKy8qIE1BWDc3ODQzIHN3aXRjaCBwb3J0ICovCisjZGVmaW5lIENPTV9PUEVOCQkJCTAKKyNkZWZpbmUgQ09NX1VTQgkJCQkJMQorI2RlZmluZSBDT01fQVVESU8JCQkJMgorI2RlZmluZSBDT01fVUFSVAkJCQkzCisjZGVmaW5lIENPTV9BVVhfVVNCCQkJCTQKKyNkZWZpbmUgQ09NX0FVWF9VQVJUCQkJCTUKKworI2RlZmluZSBDT05UUk9MMV9DT01fU1cgXAorCSgoTUFYNzc4NDNfTVVJQ19DT05UUk9MMV9DT01QMVNXX01BU0sgfCBcCisJIE1BWDc3ODQzX01VSUNfQ09OVFJPTDFfQ09NUDJTV19NQVNLKSkKKworI2RlZmluZSBDT05UUk9MMV9TV19PUEVOIFwKKwkoKENPTV9PUEVOIDw8IENPTlRST0wxX0NPTVAxU1dfU0hJRlQgfCBcCisJIENPTV9PUEVOIDw8IENPTlRST0wxX0NPTVAyU1dfU0hJRlQpKQorI2RlZmluZSBDT05UUk9MMV9TV19VU0IgXAorCSgoQ09NX1VTQiA8PCBDT05UUk9MMV9DT01QMVNXX1NISUZUIHwgXAorCSBDT01fVVNCIDw8IENPTlRST0wxX0NPTVAyU1dfU0hJRlQpKQorI2RlZmluZSBDT05UUk9MMV9TV19BVURJTyBcCisJKChDT01fQVVESU8gPDwgQ09OVFJPTDFfQ09NUDFTV19TSElGVCB8IFwKKwkgQ09NX0FVRElPIDw8IENPTlRST0wxX0NPTVAyU1dfU0hJRlQpKQorI2RlZmluZSBDT05UUk9MMV9TV19VQVJUIFwKKwkoKENPTV9VQVJUIDw8IENPTlRST0wxX0NPTVAxU1dfU0hJRlQgfCBcCisJIENPTV9VQVJUIDw8IENPTlRST0wxX0NPTVAyU1dfU0hJRlQpKQorI2RlZmluZSBDT05UUk9MMV9TV19BVVhfVVNCIFwKKwkoKENPTV9BVVhfVVNCIDw8IENPTlRST0wxX0NPTVAxU1dfU0hJRlQgfCBcCisJIENPTV9BVVhfVVNCIDw8IENPTlRST0wxX0NPTVAyU1dfU0hJRlQpKQorI2RlZmluZSBDT05UUk9MMV9TV19BVVhfVUFSVCBcCisJKChDT01fQVVYX1VBUlQgPDwgQ09OVFJPTDFfQ09NUDFTV19TSElGVCB8IFwKKwkgQ09NX0FVWF9VQVJUIDw8IENPTlRST0wxX0NPTVAyU1dfU0hJRlQpKQorCisjZGVmaW5lIE1BWDc3ODQzX0RJU0FCTEUJCQkwCisjZGVmaW5lIE1BWDc3ODQzX0VOQUJMRQkJCQkxCisKKyNkZWZpbmUgQ09OVFJPTDRfQVVUT19ESVNBQkxFIFwKKwkoKE1BWDc3ODQzX0RJU0FCTEUgPDwgQ09OVFJPTDRfVVNCQVVUT19TSElGVCkgfCBcCisJKE1BWDc3ODQzX0RJU0FCTEUgPDwgQ09OVFJPTDRfRkNUQVVUT19TSElGVCkpCisjZGVmaW5lIENPTlRST0w0X0FVVE9fRU5BQkxFIFwKKwkoKE1BWDc3ODQzX0VOQUJMRSA8PCBDT05UUk9MNF9VU0JBVVRPX1NISUZUKSB8IFwKKwkoTUFYNzc4NDNfRU5BQkxFIDw8IENPTlRST0w0X0ZDVEFVVE9fU0hJRlQpKQorCisvKiBNQVg3Nzg0MyBTQUZFT1VUIExETyBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lIFNBRkVPVVRDVFJMX1NBRkVPVVQxX1NISUZUCQkwCisjZGVmaW5lIFNBRkVPVVRDVFJMX1NBRkVPVVQyX1NISUZUCQkyCisjZGVmaW5lIFNBRkVPVVRDVFJMX0VOU0FGRU9VVDFfU0hJRlQJCTYKKyNkZWZpbmUgU0FGRU9VVENUUkxfRU5TQUZFT1VUMl9TSElGVAkJNworCisjZGVmaW5lIE1BWDc3ODQzX1JFR19TQUZFT1VUQ1RSTF9FTlNBRkVPVVQxIFwKKwkJQklUKFNBRkVPVVRDVFJMX0VOU0FGRU9VVDFfU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX1JFR19TQUZFT1VUQ1RSTF9FTlNBRkVPVVQyIFwKKwkJQklUKFNBRkVPVVRDVFJMX0VOU0FGRU9VVDJfU0hJRlQpCisjZGVmaW5lIE1BWDc3ODQzX1JFR19TQUZFT1VUQ1RSTF9TQUZFT1VUMV9NQVNLIFwKKwkJKDB4MyA8PCBTQUZFT1VUQ1RSTF9TQUZFT1VUMV9TSElGVCkKKyNkZWZpbmUgTUFYNzc4NDNfUkVHX1NBRkVPVVRDVFJMX1NBRkVPVVQyX01BU0sgXAorCQkoMHgzIDw8IFNBRkVPVVRDVFJMX1NBRkVPVVQyX1NISUZUKQorCitzdHJ1Y3QgbWF4Nzc4NDMgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKworCXN0cnVjdCBpMmNfY2xpZW50ICppMmM7CisJc3RydWN0IGkyY19jbGllbnQgKmkyY19jaGc7CisJc3RydWN0IGkyY19jbGllbnQgKmkyY19mdWVsOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfbXVpYzsKKworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXBfY2hnOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcF9mdWVsOworCXN0cnVjdCByZWdtYXAgKnJlZ21hcF9tdWljOworCisJc3RydWN0IHJlZ21hcF9pcnFfY2hpcF9kYXRhICppcnFfZGF0YTsKKwlzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwX2RhdGEgKmlycV9kYXRhX2NoZzsKKwlzdHJ1Y3QgcmVnbWFwX2lycV9jaGlwX2RhdGEgKmlycV9kYXRhX2Z1ZWw7CisJc3RydWN0IHJlZ21hcF9pcnFfY2hpcF9kYXRhICppcnFfZGF0YV9tdWljOworCisJaW50IGlycTsKK307CisjZW5kaWYgLyogX19NQVg3Nzg0M19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21lbmVsYXVzLmggYi9pbmNsdWRlL2xpbnV4L21mZC9tZW5lbGF1cy5oCmluZGV4IGYwOTdlODkuLjllODVhYzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL21lbmVsYXVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbWVuZWxhdXMuaApAQCAtMjQsNyArMjQsNiBAQAogZXh0ZXJuIGludCBtZW5lbGF1c19zZXRfdmRjZGMoaW50IGRjZGMsIHVuc2lnbmVkIGludCBtVik7CiBleHRlcm4gaW50IG1lbmVsYXVzX3NldF9zbG90X3NlbChpbnQgZW5hYmxlKTsKIGV4dGVybiBpbnQgbWVuZWxhdXNfZ2V0X3Nsb3RfcGluX3N0YXRlcyh2b2lkKTsKLWV4dGVybiBpbnQgbWVuZWxhdXNfc2V0X3Zjb3JlX3N3KHVuc2lnbmVkIGludCBtVik7CiBleHRlcm4gaW50IG1lbmVsYXVzX3NldF92Y29yZV9odyh1bnNpZ25lZCBpbnQgcm9vZl9tViwgdW5zaWduZWQgaW50IGZsb29yX21WKTsKIAogI2RlZmluZSBFTl9WUExMX1NMRUVQCSgxIDw8IDcpCkBAIC0zOCwxMCArMzcsNCBAQAogCiBleHRlcm4gaW50IG1lbmVsYXVzX3NldF9yZWd1bGF0b3Jfc2xlZXAoaW50IGVuYWJsZSwgdTMyIHZhbCk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX09NQVAyKSAmJiBkZWZpbmVkKENPTkZJR19NRU5FTEFVUykKLSNkZWZpbmUgb21hcF9oYXNfbWVuZWxhdXMoKQkxCi0jZWxzZQotI2RlZmluZSBvbWFwX2hhc19tZW5lbGF1cygpCTAKLSNlbmRpZgotCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL210NjM5Ny9jb3JlLmggYi9pbmNsdWRlL2xpbnV4L21mZC9tdDYzOTcvY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNTI2NWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9tdDYzOTcvY29yZS5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgTWVkaWFUZWsgSW5jLgorICogQXV0aG9yOiBGbG9yYSBGdSwgTWVkaWFUZWsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZiBfX01GRF9NVDYzOTdfQ09SRV9IX18KKyNkZWZpbmUgX19NRkRfTVQ2Mzk3X0NPUkVfSF9fCisKK2VudW0gbXQ2Mzk3X2lycV9udW1iZXJzIHsKKwlNVDYzOTdfSVJRX1NQS0xfQUIgPSAwLAorCU1UNjM5N19JUlFfU1BLUl9BQiwKKwlNVDYzOTdfSVJRX1NQS0wsCisJTVQ2Mzk3X0lSUV9TUEtSLAorCU1UNjM5N19JUlFfQkFUX0wsCisJTVQ2Mzk3X0lSUV9CQVRfSCwKKwlNVDYzOTdfSVJRX0ZHX0JBVF9MLAorCU1UNjM5N19JUlFfRkdfQkFUX0gsCisJTVQ2Mzk3X0lSUV9XQVRDSERPRywKKwlNVDYzOTdfSVJRX1BXUktFWSwKKwlNVDYzOTdfSVJRX1RIUl9MLAorCU1UNjM5N19JUlFfVEhSX0gsCisJTVQ2Mzk3X0lSUV9WQkFUT05fVU5ERVQsCisJTVQ2Mzk3X0lSUV9CVkFMSURfREVULAorCU1UNjM5N19JUlFfQ0hSREVULAorCU1UNjM5N19JUlFfT1YsCisJTVQ2Mzk3X0lSUV9MRE8sCisJTVQ2Mzk3X0lSUV9IT01FS0VZLAorCU1UNjM5N19JUlFfQUNDREVULAorCU1UNjM5N19JUlFfQVVESU8sCisJTVQ2Mzk3X0lSUV9SVEMsCisJTVQ2Mzk3X0lSUV9QV1JLRVlfUlNUQiwKKwlNVDYzOTdfSVJRX0hETUlfU0lGTSwKKwlNVDYzOTdfSVJRX0hETUlfQ0VDLAorCU1UNjM5N19JUlFfVkNBMTUsCisJTVQ2Mzk3X0lSUV9WU1JNQ0ExNSwKKwlNVDYzOTdfSVJRX1ZDT1JFLAorCU1UNjM5N19JUlFfVkdQVSwKKwlNVDYzOTdfSVJRX1ZJTzE4LAorCU1UNjM5N19JUlFfVlBDQTcsCisJTVQ2Mzk3X0lSUV9WU1JNQ0E3LAorCU1UNjM5N19JUlFfVkRSTSwKKwlNVDYzOTdfSVJRX05SLAorfTsKKworc3RydWN0IG10NjM5N19jaGlwIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCWludCBpcnE7CisJc3RydWN0IGlycV9kb21haW4gKmlycV9kb21haW47CisJc3RydWN0IG11dGV4IGlycWxvY2s7CisJdTE2IGlycV9tYXNrc19jdXJbMl07CisJdTE2IGlycV9tYXNrc19jYWNoZVsyXTsKK307CisKKyNlbmRpZiAvKiBfX01GRF9NVDYzOTdfQ09SRV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL210NjM5Ny9yZWdpc3RlcnMuaCBiL2luY2x1ZGUvbGludXgvbWZkL210NjM5Ny9yZWdpc3RlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjNhMGE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbXQ2Mzk3L3JlZ2lzdGVycy5oCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0IE1lZGlhVGVrIEluYy4KKyAqIEF1dGhvcjogRmxvcmEgRnUsIE1lZGlhVGVrCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX19NRkRfTVQ2Mzk3X1JFR0lTVEVSU19IX18KKyNkZWZpbmUgX19NRkRfTVQ2Mzk3X1JFR0lTVEVSU19IX18KKworLyogUE1JQyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgTVQ2Mzk3X0NJRAkJCTB4MDEwMAorI2RlZmluZSBNVDYzOTdfVE9QX0NLUEROCQkweDAxMDIKKyNkZWZpbmUgTVQ2Mzk3X1RPUF9DS1BETl9TRVQJCTB4MDEwNAorI2RlZmluZSBNVDYzOTdfVE9QX0NLUEROX0NMUgkJMHgwMTA2CisjZGVmaW5lIE1UNjM5N19UT1BfQ0tQRE4yCQkweDAxMDgKKyNkZWZpbmUgTVQ2Mzk3X1RPUF9DS1BETjJfU0VUCQkweDAxMEEKKyNkZWZpbmUgTVQ2Mzk3X1RPUF9DS1BETjJfQ0xSCQkweDAxMEMKKyNkZWZpbmUgTVQ2Mzk3X1RPUF9HUElPX0NLUEROCQkweDAxMEUKKyNkZWZpbmUgTVQ2Mzk3X1RPUF9SU1RfQ09OCQkweDAxMTQKKyNkZWZpbmUgTVQ2Mzk3X1dSUF9DS1BETgkJMHgwMTFBCisjZGVmaW5lIE1UNjM5N19XUlBfUlNUX0NPTgkJMHgwMTIwCisjZGVmaW5lIE1UNjM5N19UT1BfUlNUX01JU0MJCTB4MDEyNgorI2RlZmluZSBNVDYzOTdfVE9QX0NLQ09OMQkJMHgwMTI4CisjZGVmaW5lIE1UNjM5N19UT1BfQ0tDT04yCQkweDAxMkEKKyNkZWZpbmUgTVQ2Mzk3X1RPUF9DS1RTVDEJCTB4MDEyQworI2RlZmluZSBNVDYzOTdfVE9QX0NLVFNUMgkJMHgwMTJFCisjZGVmaW5lIE1UNjM5N19PQ19ERUdfRU4JCTB4MDEzMAorI2RlZmluZSBNVDYzOTdfT0NfQ1RMMAkJCTB4MDEzMgorI2RlZmluZSBNVDYzOTdfT0NfQ1RMMQkJCTB4MDEzNAorI2RlZmluZSBNVDYzOTdfT0NfQ1RMMgkJCTB4MDEzNgorI2RlZmluZSBNVDYzOTdfSU5UX1JTVgkJCTB4MDEzOAorI2RlZmluZSBNVDYzOTdfVEVTVF9DT04wCQkweDAxM0EKKyNkZWZpbmUgTVQ2Mzk3X1RFU1RfQ09OMQkJMHgwMTNDCisjZGVmaW5lIE1UNjM5N19TVEFUVVMwCQkJMHgwMTNFCisjZGVmaW5lIE1UNjM5N19TVEFUVVMxCQkJMHgwMTQwCisjZGVmaW5lIE1UNjM5N19QR1NUQVRVUwkJCTB4MDE0MgorI2RlZmluZSBNVDYzOTdfQ0hSU1RBVFVTCQkweDAxNDQKKyNkZWZpbmUgTVQ2Mzk3X09DU1RBVFVTMAkJMHgwMTQ2CisjZGVmaW5lIE1UNjM5N19PQ1NUQVRVUzEJCTB4MDE0OAorI2RlZmluZSBNVDYzOTdfT0NTVEFUVVMyCQkweDAxNEEKKyNkZWZpbmUgTVQ2Mzk3X0hETUlfUEFEX0lFCQkweDAxNEMKKyNkZWZpbmUgTVQ2Mzk3X1RFU1RfT1VUX0wJCTB4MDE0RQorI2RlZmluZSBNVDYzOTdfVEVTVF9PVVRfSAkJMHgwMTUwCisjZGVmaW5lIE1UNjM5N19URFNFTF9DT04JCTB4MDE1MgorI2RlZmluZSBNVDYzOTdfUkRTRUxfQ09OCQkweDAxNTQKKyNkZWZpbmUgTVQ2Mzk3X0dQSU9fU01UX0NPTjAJCTB4MDE1NgorI2RlZmluZSBNVDYzOTdfR1BJT19TTVRfQ09OMQkJMHgwMTU4CisjZGVmaW5lIE1UNjM5N19HUElPX1NNVF9DT04yCQkweDAxNUEKKyNkZWZpbmUgTVQ2Mzk3X0dQSU9fU01UX0NPTjMJCTB4MDE1QworI2RlZmluZSBNVDYzOTdfRFJWX0NPTjAJCQkweDAxNUUKKyNkZWZpbmUgTVQ2Mzk3X0RSVl9DT04xCQkJMHgwMTYwCisjZGVmaW5lIE1UNjM5N19EUlZfQ09OMgkJCTB4MDE2MgorI2RlZmluZSBNVDYzOTdfRFJWX0NPTjMJCQkweDAxNjQKKyNkZWZpbmUgTVQ2Mzk3X0RSVl9DT040CQkJMHgwMTY2CisjZGVmaW5lIE1UNjM5N19EUlZfQ09ONQkJCTB4MDE2OAorI2RlZmluZSBNVDYzOTdfRFJWX0NPTjYJCQkweDAxNkEKKyNkZWZpbmUgTVQ2Mzk3X0RSVl9DT043CQkJMHgwMTZDCisjZGVmaW5lIE1UNjM5N19EUlZfQ09OOAkJCTB4MDE2RQorI2RlZmluZSBNVDYzOTdfRFJWX0NPTjkJCQkweDAxNzAKKyNkZWZpbmUgTVQ2Mzk3X0RSVl9DT04xMAkJMHgwMTcyCisjZGVmaW5lIE1UNjM5N19EUlZfQ09OMTEJCTB4MDE3NAorI2RlZmluZSBNVDYzOTdfRFJWX0NPTjEyCQkweDAxNzYKKyNkZWZpbmUgTVQ2Mzk3X0lOVF9DT04wCQkJMHgwMTc4CisjZGVmaW5lIE1UNjM5N19JTlRfQ09OMQkJCTB4MDE3RQorI2RlZmluZSBNVDYzOTdfSU5UX1NUQVRVUzAJCTB4MDE4NAorI2RlZmluZSBNVDYzOTdfSU5UX1NUQVRVUzEJCTB4MDE4NgorI2RlZmluZSBNVDYzOTdfRlFNVFJfQ09OMAkJMHgwMTg4CisjZGVmaW5lIE1UNjM5N19GUU1UUl9DT04xCQkweDAxOEEKKyNkZWZpbmUgTVQ2Mzk3X0ZRTVRSX0NPTjIJCTB4MDE4QworI2RlZmluZSBNVDYzOTdfRUZVU0VfRE9VVF8wXzE1CQkweDAxQzQKKyNkZWZpbmUgTVQ2Mzk3X0VGVVNFX0RPVVRfMTZfMzEJCTB4MDFDNgorI2RlZmluZSBNVDYzOTdfRUZVU0VfRE9VVF8zMl80NwkJMHgwMUM4CisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzQ4XzYzCQkweDAxQ0EKKyNkZWZpbmUgTVQ2Mzk3X1NQSV9DT04JCQkweDAxQ0MKKyNkZWZpbmUgTVQ2Mzk3X1RPUF9DS1BETjMJCTB4MDFDRQorI2RlZmluZSBNVDYzOTdfVE9QX0NLQ09OMwkJMHgwMUQ0CisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzY0Xzc5CQkweDAxRDYKKyNkZWZpbmUgTVQ2Mzk3X0VGVVNFX0RPVVRfODBfOTUJCTB4MDFEOAorI2RlZmluZSBNVDYzOTdfRUZVU0VfRE9VVF85Nl8xMTEJMHgwMURBCisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzExMl8xMjcJMHgwMURDCisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzEyOF8xNDMJMHgwMURFCisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzE0NF8xNTkJMHgwMUUwCisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzE2MF8xNzUJMHgwMUUyCisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzE3Nl8xOTEJMHgwMUU0CisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzE5Ml8yMDcJMHgwMUU2CisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzIwOF8yMjMJMHgwMUU4CisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzIyNF8yMzkJMHgwMUVBCisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzI0MF8yNTUJMHgwMUVDCisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzI1Nl8yNzEJMHgwMUVFCisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzI3Ml8yODcJMHgwMUYwCisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzI4OF8zMDAJMHgwMUYyCisjZGVmaW5lIE1UNjM5N19FRlVTRV9ET1VUXzMwNF8zMTkJMHgwMUY0CisjZGVmaW5lIE1UNjM5N19CVUNLX0NPTjAJCTB4MDIwMAorI2RlZmluZSBNVDYzOTdfQlVDS19DT04xCQkweDAyMDIKKyNkZWZpbmUgTVQ2Mzk3X0JVQ0tfQ09OMgkJMHgwMjA0CisjZGVmaW5lIE1UNjM5N19CVUNLX0NPTjMJCTB4MDIwNgorI2RlZmluZSBNVDYzOTdfQlVDS19DT040CQkweDAyMDgKKyNkZWZpbmUgTVQ2Mzk3X0JVQ0tfQ09ONQkJMHgwMjBBCisjZGVmaW5lIE1UNjM5N19CVUNLX0NPTjYJCTB4MDIwQworI2RlZmluZSBNVDYzOTdfQlVDS19DT043CQkweDAyMEUKKyNkZWZpbmUgTVQ2Mzk3X0JVQ0tfQ09OOAkJMHgwMjEwCisjZGVmaW5lIE1UNjM5N19CVUNLX0NPTjkJCTB4MDIxMgorI2RlZmluZSBNVDYzOTdfVkNBMTVfQ09OMAkJMHgwMjE0CisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT04xCQkweDAyMTYKKyNkZWZpbmUgTVQ2Mzk3X1ZDQTE1X0NPTjIJCTB4MDIxOAorI2RlZmluZSBNVDYzOTdfVkNBMTVfQ09OMwkJMHgwMjFBCisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT040CQkweDAyMUMKKyNkZWZpbmUgTVQ2Mzk3X1ZDQTE1X0NPTjUJCTB4MDIxRQorI2RlZmluZSBNVDYzOTdfVkNBMTVfQ09ONgkJMHgwMjIwCisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT043CQkweDAyMjIKKyNkZWZpbmUgTVQ2Mzk3X1ZDQTE1X0NPTjgJCTB4MDIyNAorI2RlZmluZSBNVDYzOTdfVkNBMTVfQ09OOQkJMHgwMjI2CisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT04xMAkJMHgwMjI4CisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT04xMQkJMHgwMjJBCisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT04xMgkJMHgwMjJDCisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT04xMwkJMHgwMjJFCisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT04xNAkJMHgwMjMwCisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT04xNQkJMHgwMjMyCisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT04xNgkJMHgwMjM0CisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT04xNwkJMHgwMjM2CisjZGVmaW5lIE1UNjM5N19WQ0ExNV9DT04xOAkJMHgwMjM4CisjZGVmaW5lIE1UNjM5N19WU1JNQ0ExNV9DT04wCQkweDAyM0EKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjEJCTB4MDIzQworI2RlZmluZSBNVDYzOTdfVlNSTUNBMTVfQ09OMgkJMHgwMjNFCisjZGVmaW5lIE1UNjM5N19WU1JNQ0ExNV9DT04zCQkweDAyNDAKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjQJCTB4MDI0MgorI2RlZmluZSBNVDYzOTdfVlNSTUNBMTVfQ09ONQkJMHgwMjQ0CisjZGVmaW5lIE1UNjM5N19WU1JNQ0ExNV9DT042CQkweDAyNDYKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjcJCTB4MDI0OAorI2RlZmluZSBNVDYzOTdfVlNSTUNBMTVfQ09OOAkJMHgwMjRBCisjZGVmaW5lIE1UNjM5N19WU1JNQ0ExNV9DT045CQkweDAyNEMKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjEwCQkweDAyNEUKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjExCQkweDAyNTAKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjEyCQkweDAyNTIKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjEzCQkweDAyNTQKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjE0CQkweDAyNTYKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjE1CQkweDAyNTgKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjE2CQkweDAyNUEKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjE3CQkweDAyNUMKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjE4CQkweDAyNUUKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjE5CQkweDAyNjAKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjIwCQkweDAyNjIKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTE1X0NPTjIxCQkweDAyNjQKKyNkZWZpbmUgTVQ2Mzk3X1ZDT1JFX0NPTjAJCTB4MDI2NgorI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09OMQkJMHgwMjY4CisjZGVmaW5lIE1UNjM5N19WQ09SRV9DT04yCQkweDAyNkEKKyNkZWZpbmUgTVQ2Mzk3X1ZDT1JFX0NPTjMJCTB4MDI2QworI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09ONAkJMHgwMjZFCisjZGVmaW5lIE1UNjM5N19WQ09SRV9DT041CQkweDAyNzAKKyNkZWZpbmUgTVQ2Mzk3X1ZDT1JFX0NPTjYJCTB4MDI3MgorI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09ONwkJMHgwMjc0CisjZGVmaW5lIE1UNjM5N19WQ09SRV9DT044CQkweDAyNzYKKyNkZWZpbmUgTVQ2Mzk3X1ZDT1JFX0NPTjkJCTB4MDI3OAorI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09OMTAJCTB4MDI3QQorI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09OMTEJCTB4MDI3QworI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09OMTIJCTB4MDI3RQorI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09OMTMJCTB4MDI4MAorI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09OMTQJCTB4MDI4MgorI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09OMTUJCTB4MDI4NAorI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09OMTYJCTB4MDI4NgorI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09OMTcJCTB4MDI4OAorI2RlZmluZSBNVDYzOTdfVkNPUkVfQ09OMTgJCTB4MDI4QQorI2RlZmluZSBNVDYzOTdfVkdQVV9DT04wCQkweDAyOEMKKyNkZWZpbmUgTVQ2Mzk3X1ZHUFVfQ09OMQkJMHgwMjhFCisjZGVmaW5lIE1UNjM5N19WR1BVX0NPTjIJCTB4MDI5MAorI2RlZmluZSBNVDYzOTdfVkdQVV9DT04zCQkweDAyOTIKKyNkZWZpbmUgTVQ2Mzk3X1ZHUFVfQ09ONAkJMHgwMjk0CisjZGVmaW5lIE1UNjM5N19WR1BVX0NPTjUJCTB4MDI5NgorI2RlZmluZSBNVDYzOTdfVkdQVV9DT042CQkweDAyOTgKKyNkZWZpbmUgTVQ2Mzk3X1ZHUFVfQ09ONwkJMHgwMjlBCisjZGVmaW5lIE1UNjM5N19WR1BVX0NPTjgJCTB4MDI5QworI2RlZmluZSBNVDYzOTdfVkdQVV9DT045CQkweDAyOUUKKyNkZWZpbmUgTVQ2Mzk3X1ZHUFVfQ09OMTAJCTB4MDJBMAorI2RlZmluZSBNVDYzOTdfVkdQVV9DT04xMQkJMHgwMkEyCisjZGVmaW5lIE1UNjM5N19WR1BVX0NPTjEyCQkweDAyQTQKKyNkZWZpbmUgTVQ2Mzk3X1ZHUFVfQ09OMTMJCTB4MDJBNgorI2RlZmluZSBNVDYzOTdfVkdQVV9DT04xNAkJMHgwMkE4CisjZGVmaW5lIE1UNjM5N19WR1BVX0NPTjE1CQkweDAyQUEKKyNkZWZpbmUgTVQ2Mzk3X1ZHUFVfQ09OMTYJCTB4MDJBQworI2RlZmluZSBNVDYzOTdfVkdQVV9DT04xNwkJMHgwMkFFCisjZGVmaW5lIE1UNjM5N19WR1BVX0NPTjE4CQkweDAyQjAKKyNkZWZpbmUgTVQ2Mzk3X1ZJTzE4X0NPTjAJCTB4MDMwMAorI2RlZmluZSBNVDYzOTdfVklPMThfQ09OMQkJMHgwMzAyCisjZGVmaW5lIE1UNjM5N19WSU8xOF9DT04yCQkweDAzMDQKKyNkZWZpbmUgTVQ2Mzk3X1ZJTzE4X0NPTjMJCTB4MDMwNgorI2RlZmluZSBNVDYzOTdfVklPMThfQ09ONAkJMHgwMzA4CisjZGVmaW5lIE1UNjM5N19WSU8xOF9DT041CQkweDAzMEEKKyNkZWZpbmUgTVQ2Mzk3X1ZJTzE4X0NPTjYJCTB4MDMwQworI2RlZmluZSBNVDYzOTdfVklPMThfQ09ONwkJMHgwMzBFCisjZGVmaW5lIE1UNjM5N19WSU8xOF9DT044CQkweDAzMTAKKyNkZWZpbmUgTVQ2Mzk3X1ZJTzE4X0NPTjkJCTB4MDMxMgorI2RlZmluZSBNVDYzOTdfVklPMThfQ09OMTAJCTB4MDMxNAorI2RlZmluZSBNVDYzOTdfVklPMThfQ09OMTEJCTB4MDMxNgorI2RlZmluZSBNVDYzOTdfVklPMThfQ09OMTIJCTB4MDMxOAorI2RlZmluZSBNVDYzOTdfVklPMThfQ09OMTMJCTB4MDMxQQorI2RlZmluZSBNVDYzOTdfVklPMThfQ09OMTQJCTB4MDMxQworI2RlZmluZSBNVDYzOTdfVklPMThfQ09OMTUJCTB4MDMxRQorI2RlZmluZSBNVDYzOTdfVklPMThfQ09OMTYJCTB4MDMyMAorI2RlZmluZSBNVDYzOTdfVklPMThfQ09OMTcJCTB4MDMyMgorI2RlZmluZSBNVDYzOTdfVklPMThfQ09OMTgJCTB4MDMyNAorI2RlZmluZSBNVDYzOTdfVlBDQTdfQ09OMAkJMHgwMzI2CisjZGVmaW5lIE1UNjM5N19WUENBN19DT04xCQkweDAzMjgKKyNkZWZpbmUgTVQ2Mzk3X1ZQQ0E3X0NPTjIJCTB4MDMyQQorI2RlZmluZSBNVDYzOTdfVlBDQTdfQ09OMwkJMHgwMzJDCisjZGVmaW5lIE1UNjM5N19WUENBN19DT040CQkweDAzMkUKKyNkZWZpbmUgTVQ2Mzk3X1ZQQ0E3X0NPTjUJCTB4MDMzMAorI2RlZmluZSBNVDYzOTdfVlBDQTdfQ09ONgkJMHgwMzMyCisjZGVmaW5lIE1UNjM5N19WUENBN19DT043CQkweDAzMzQKKyNkZWZpbmUgTVQ2Mzk3X1ZQQ0E3X0NPTjgJCTB4MDMzNgorI2RlZmluZSBNVDYzOTdfVlBDQTdfQ09OOQkJMHgwMzM4CisjZGVmaW5lIE1UNjM5N19WUENBN19DT04xMAkJMHgwMzNBCisjZGVmaW5lIE1UNjM5N19WUENBN19DT04xMQkJMHgwMzNDCisjZGVmaW5lIE1UNjM5N19WUENBN19DT04xMgkJMHgwMzNFCisjZGVmaW5lIE1UNjM5N19WUENBN19DT04xMwkJMHgwMzQwCisjZGVmaW5lIE1UNjM5N19WUENBN19DT04xNAkJMHgwMzQyCisjZGVmaW5lIE1UNjM5N19WUENBN19DT04xNQkJMHgwMzQ0CisjZGVmaW5lIE1UNjM5N19WUENBN19DT04xNgkJMHgwMzQ2CisjZGVmaW5lIE1UNjM5N19WUENBN19DT04xNwkJMHgwMzQ4CisjZGVmaW5lIE1UNjM5N19WUENBN19DT04xOAkJMHgwMzRBCisjZGVmaW5lIE1UNjM5N19WU1JNQ0E3X0NPTjAJCTB4MDM0QworI2RlZmluZSBNVDYzOTdfVlNSTUNBN19DT04xCQkweDAzNEUKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTdfQ09OMgkJMHgwMzUwCisjZGVmaW5lIE1UNjM5N19WU1JNQ0E3X0NPTjMJCTB4MDM1MgorI2RlZmluZSBNVDYzOTdfVlNSTUNBN19DT040CQkweDAzNTQKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTdfQ09ONQkJMHgwMzU2CisjZGVmaW5lIE1UNjM5N19WU1JNQ0E3X0NPTjYJCTB4MDM1OAorI2RlZmluZSBNVDYzOTdfVlNSTUNBN19DT043CQkweDAzNUEKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTdfQ09OOAkJMHgwMzVDCisjZGVmaW5lIE1UNjM5N19WU1JNQ0E3X0NPTjkJCTB4MDM1RQorI2RlZmluZSBNVDYzOTdfVlNSTUNBN19DT04xMAkJMHgwMzYwCisjZGVmaW5lIE1UNjM5N19WU1JNQ0E3X0NPTjExCQkweDAzNjIKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTdfQ09OMTIJCTB4MDM2NAorI2RlZmluZSBNVDYzOTdfVlNSTUNBN19DT04xMwkJMHgwMzY2CisjZGVmaW5lIE1UNjM5N19WU1JNQ0E3X0NPTjE0CQkweDAzNjgKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTdfQ09OMTUJCTB4MDM2QQorI2RlZmluZSBNVDYzOTdfVlNSTUNBN19DT04xNgkJMHgwMzZDCisjZGVmaW5lIE1UNjM5N19WU1JNQ0E3X0NPTjE3CQkweDAzNkUKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTdfQ09OMTgJCTB4MDM3MAorI2RlZmluZSBNVDYzOTdfVlNSTUNBN19DT04xOQkJMHgwMzcyCisjZGVmaW5lIE1UNjM5N19WU1JNQ0E3X0NPTjIwCQkweDAzNzQKKyNkZWZpbmUgTVQ2Mzk3X1ZTUk1DQTdfQ09OMjEJCTB4MDM3NgorI2RlZmluZSBNVDYzOTdfVkRSTV9DT04wCQkweDAzNzgKKyNkZWZpbmUgTVQ2Mzk3X1ZEUk1fQ09OMQkJMHgwMzdBCisjZGVmaW5lIE1UNjM5N19WRFJNX0NPTjIJCTB4MDM3QworI2RlZmluZSBNVDYzOTdfVkRSTV9DT04zCQkweDAzN0UKKyNkZWZpbmUgTVQ2Mzk3X1ZEUk1fQ09ONAkJMHgwMzgwCisjZGVmaW5lIE1UNjM5N19WRFJNX0NPTjUJCTB4MDM4MgorI2RlZmluZSBNVDYzOTdfVkRSTV9DT042CQkweDAzODQKKyNkZWZpbmUgTVQ2Mzk3X1ZEUk1fQ09ONwkJMHgwMzg2CisjZGVmaW5lIE1UNjM5N19WRFJNX0NPTjgJCTB4MDM4OAorI2RlZmluZSBNVDYzOTdfVkRSTV9DT045CQkweDAzOEEKKyNkZWZpbmUgTVQ2Mzk3X1ZEUk1fQ09OMTAJCTB4MDM4QworI2RlZmluZSBNVDYzOTdfVkRSTV9DT04xMQkJMHgwMzhFCisjZGVmaW5lIE1UNjM5N19WRFJNX0NPTjEyCQkweDAzOTAKKyNkZWZpbmUgTVQ2Mzk3X1ZEUk1fQ09OMTMJCTB4MDM5MgorI2RlZmluZSBNVDYzOTdfVkRSTV9DT04xNAkJMHgwMzk0CisjZGVmaW5lIE1UNjM5N19WRFJNX0NPTjE1CQkweDAzOTYKKyNkZWZpbmUgTVQ2Mzk3X1ZEUk1fQ09OMTYJCTB4MDM5OAorI2RlZmluZSBNVDYzOTdfVkRSTV9DT04xNwkJMHgwMzlBCisjZGVmaW5lIE1UNjM5N19WRFJNX0NPTjE4CQkweDAzOUMKKyNkZWZpbmUgTVQ2Mzk3X0JVQ0tfS19DT04wCQkweDAzOUUKKyNkZWZpbmUgTVQ2Mzk3X0JVQ0tfS19DT04xCQkweDAzQTAKKyNkZWZpbmUgTVQ2Mzk3X0FOQUxET19DT04wCQkweDA0MDAKKyNkZWZpbmUgTVQ2Mzk3X0FOQUxET19DT04xCQkweDA0MDIKKyNkZWZpbmUgTVQ2Mzk3X0FOQUxET19DT04yCQkweDA0MDQKKyNkZWZpbmUgTVQ2Mzk3X0FOQUxET19DT04zCQkweDA0MDYKKyNkZWZpbmUgTVQ2Mzk3X0FOQUxET19DT040CQkweDA0MDgKKyNkZWZpbmUgTVQ2Mzk3X0FOQUxET19DT041CQkweDA0MEEKKyNkZWZpbmUgTVQ2Mzk3X0FOQUxET19DT042CQkweDA0MEMKKyNkZWZpbmUgTVQ2Mzk3X0FOQUxET19DT043CQkweDA0MEUKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04wCQkweDA0MTAKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04xCQkweDA0MTIKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04yCQkweDA0MTQKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04zCQkweDA0MTYKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT040CQkweDA0MTgKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT041CQkweDA0MUEKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT042CQkweDA0MUMKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT043CQkweDA0MUUKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT044CQkweDA0MjAKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT045CQkweDA0MjIKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04xMAkJMHgwNDI0CisjZGVmaW5lIE1UNjM5N19ESUdMRE9fQ09OMTEJCTB4MDQyNgorI2RlZmluZSBNVDYzOTdfRElHTERPX0NPTjEyCQkweDA0MjgKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04xMwkJMHgwNDJBCisjZGVmaW5lIE1UNjM5N19ESUdMRE9fQ09OMTQJCTB4MDQyQworI2RlZmluZSBNVDYzOTdfRElHTERPX0NPTjE1CQkweDA0MkUKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04xNgkJMHgwNDMwCisjZGVmaW5lIE1UNjM5N19ESUdMRE9fQ09OMTcJCTB4MDQzMgorI2RlZmluZSBNVDYzOTdfRElHTERPX0NPTjE4CQkweDA0MzQKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04xOQkJMHgwNDM2CisjZGVmaW5lIE1UNjM5N19ESUdMRE9fQ09OMjAJCTB4MDQzOAorI2RlZmluZSBNVDYzOTdfRElHTERPX0NPTjIxCQkweDA0M0EKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04yMgkJMHgwNDNDCisjZGVmaW5lIE1UNjM5N19ESUdMRE9fQ09OMjMJCTB4MDQzRQorI2RlZmluZSBNVDYzOTdfRElHTERPX0NPTjI0CQkweDA0NDAKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04yNQkJMHgwNDQyCisjZGVmaW5lIE1UNjM5N19ESUdMRE9fQ09OMjYJCTB4MDQ0NAorI2RlZmluZSBNVDYzOTdfRElHTERPX0NPTjI3CQkweDA0NDYKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04yOAkJMHgwNDQ4CisjZGVmaW5lIE1UNjM5N19ESUdMRE9fQ09OMjkJCTB4MDQ0QQorI2RlZmluZSBNVDYzOTdfRElHTERPX0NPTjMwCQkweDA0NEMKKyNkZWZpbmUgTVQ2Mzk3X0RJR0xET19DT04zMQkJMHgwNDRFCisjZGVmaW5lIE1UNjM5N19ESUdMRE9fQ09OMzIJCTB4MDQ1MAorI2RlZmluZSBNVDYzOTdfRElHTERPX0NPTjMzCQkweDA0NUEKKyNkZWZpbmUgTVQ2Mzk3X1NQS19DT04wCQkJMHgwNjAwCisjZGVmaW5lIE1UNjM5N19TUEtfQ09OMQkJCTB4MDYwMgorI2RlZmluZSBNVDYzOTdfU1BLX0NPTjIJCQkweDA2MDQKKyNkZWZpbmUgTVQ2Mzk3X1NQS19DT04zCQkJMHgwNjA2CisjZGVmaW5lIE1UNjM5N19TUEtfQ09ONAkJCTB4MDYwOAorI2RlZmluZSBNVDYzOTdfU1BLX0NPTjUJCQkweDA2MEEKKyNkZWZpbmUgTVQ2Mzk3X1NQS19DT042CQkJMHgwNjBDCisjZGVmaW5lIE1UNjM5N19TUEtfQ09ONwkJCTB4MDYwRQorI2RlZmluZSBNVDYzOTdfU1BLX0NPTjgJCQkweDA2MTAKKyNkZWZpbmUgTVQ2Mzk3X1NQS19DT045CQkJMHgwNjEyCisjZGVmaW5lIE1UNjM5N19TUEtfQ09OMTAJCTB4MDYxNAorI2RlZmluZSBNVDYzOTdfU1BLX0NPTjExCQkweDA2MTYKKyNkZWZpbmUgTVQ2Mzk3X0FVRERBQ19DT04wCQkweDA3MDAKKyNkZWZpbmUgTVQ2Mzk3X0FVREJVRl9DRkcwCQkweDA3MDIKKyNkZWZpbmUgTVQ2Mzk3X0FVREJVRl9DRkcxCQkweDA3MDQKKyNkZWZpbmUgTVQ2Mzk3X0FVREJVRl9DRkcyCQkweDA3MDYKKyNkZWZpbmUgTVQ2Mzk3X0FVREJVRl9DRkczCQkweDA3MDgKKyNkZWZpbmUgTVQ2Mzk3X0FVREJVRl9DRkc0CQkweDA3MEEKKyNkZWZpbmUgTVQ2Mzk3X0lCSUFTRElTVF9DRkcwCQkweDA3MEMKKyNkZWZpbmUgTVQ2Mzk3X0FVREFDQ0RFUE9QX0NGRzAJCTB4MDcwRQorI2RlZmluZSBNVDYzOTdfQVVEX0lWX0NGRzAJCTB4MDcxMAorI2RlZmluZSBNVDYzOTdfQVVEQ0xLR0VOX0NGRzAJCTB4MDcxMgorI2RlZmluZSBNVDYzOTdfQVVETERPX0NGRzAJCTB4MDcxNAorI2RlZmluZSBNVDYzOTdfQVVETERPX0NGRzEJCTB4MDcxNgorI2RlZmluZSBNVDYzOTdfQVVETlZSRUdHTEJfQ0ZHMAkJMHgwNzE4CisjZGVmaW5lIE1UNjM5N19BVURfTkNQMAkJCTB4MDcxQQorI2RlZmluZSBNVDYzOTdfQVVEUFJFQU1QX0NPTjAJCTB4MDcxQworI2RlZmluZSBNVDYzOTdfQVVEQURDX0NPTjAJCTB4MDcxRQorI2RlZmluZSBNVDYzOTdfQVVEQURDX0NPTjEJCTB4MDcyMAorI2RlZmluZSBNVDYzOTdfQVVEQURDX0NPTjIJCTB4MDcyMgorI2RlZmluZSBNVDYzOTdfQVVEQURDX0NPTjMJCTB4MDcyNAorI2RlZmluZSBNVDYzOTdfQVVEQURDX0NPTjQJCTB4MDcyNgorI2RlZmluZSBNVDYzOTdfQVVEQURDX0NPTjUJCTB4MDcyOAorI2RlZmluZSBNVDYzOTdfQVVEQURDX0NPTjYJCTB4MDcyQQorI2RlZmluZSBNVDYzOTdfQVVERElHTUlfQ09OMAkJMHgwNzJDCisjZGVmaW5lIE1UNjM5N19BVURMU0JVRl9DT04wCQkweDA3MkUKKyNkZWZpbmUgTVQ2Mzk3X0FVRExTQlVGX0NPTjEJCTB4MDczMAorI2RlZmluZSBNVDYzOTdfQVVERU5DU1BBUkVfQ09OMAkJMHgwNzMyCisjZGVmaW5lIE1UNjM5N19BVURFTkNDTEtTUV9DT04wCQkweDA3MzQKKyNkZWZpbmUgTVQ2Mzk3X0FVRFBSRUFNUEdBSU5fQ09OMAkweDA3MzYKKyNkZWZpbmUgTVQ2Mzk3X1pDRF9DT04wCQkJMHgwNzM4CisjZGVmaW5lIE1UNjM5N19aQ0RfQ09OMQkJCTB4MDczQQorI2RlZmluZSBNVDYzOTdfWkNEX0NPTjIJCQkweDA3M0MKKyNkZWZpbmUgTVQ2Mzk3X1pDRF9DT04zCQkJMHgwNzNFCisjZGVmaW5lIE1UNjM5N19aQ0RfQ09ONAkJCTB4MDc0MAorI2RlZmluZSBNVDYzOTdfWkNEX0NPTjUJCQkweDA3NDIKKyNkZWZpbmUgTVQ2Mzk3X05DUF9DTEtESVZfQ09OMAkJMHgwNzQ0CisjZGVmaW5lIE1UNjM5N19OQ1BfQ0xLRElWX0NPTjEJCTB4MDc0NgorCisjZW5kaWYgLyogX19NRkRfTVQ2Mzk3X1JFR0lTVEVSU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3BhbG1hcy5oIGIvaW5jbHVkZS9saW51eC9tZmQvcGFsbWFzLmgKaW5kZXggZmIwMzkwYS4uYmIyNzBiZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvcGFsbWFzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvcGFsbWFzLmgKQEAgLTExNyw2ICsxMTcsNyBAQAogCWludCBsZG9fYmVnaW47CiAJaW50IGxkb19lbmQ7CiAJaW50IG1heF9yZWc7CisJYm9vbCBoYXNfcmVnZW4zOwogCXN0cnVjdCBwYWxtYXNfcmVnc19pbmZvICpwYWxtYXNfcmVnc19pbmZvOwogCXN0cnVjdCBvZl9yZWd1bGF0b3JfbWF0Y2ggKnBhbG1hc19tYXRjaGVzOwogCXN0cnVjdCBwYWxtYXNfc2xlZXBfcmVxdWVzdG9yX2luZm8gKnNsZWVwX3JlcV9pbmZvOwpAQCAtMjk5OSw2ICszMDAwLDkgQEAKICNkZWZpbmUgUEFMTUFTX0dQQURDX1RSSU0xNQkJCQkJMHgwRQogI2RlZmluZSBQQUxNQVNfR1BBRENfVFJJTTE2CQkJCQkweDBGCiAKKy8qIFRQUzY1OTAzOCByZWdlbjJfY3RybCBvZmZzZXQgaXNzIGRpZmZlcmVudCBmcm9tIHBhbG1hcyAqLworI2RlZmluZSBUUFM2NTkwMzhfUkVHRU4yX0NUUkwJCQkJCTB4MTIKKwogLyogVFBTNjU5MTcgSW50ZXJydXB0IHJlZ2lzdGVycyAqLwogCiAvKiBSZWdpc3RlcnMgZm9yIGZ1bmN0aW9uIElOVEVSUlVQVCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvcms4MDguaCBiL2luY2x1ZGUvbGludXgvbWZkL3JrODA4LmgKaW5kZXggZmIwOTMxMi4uNDQxYjZlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvcms4MDguaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9yazgwOC5oCkBAIC0xNTYsNiArMTU2LDkgQEAKICNkZWZpbmUgQlVDSzJfUkFURV9NQVNLCQkoMyA8PCAzKQogI2RlZmluZSBNQVNLX0FMTAkweGZmCiAKKyNkZWZpbmUgQlVDS19VVl9BQ1RfTUFTSwkweDBmCisjZGVmaW5lIEJVQ0tfVVZfQUNUX0RJU0FCTEUJMAorCiAjZGVmaW5lIFNXSVRDSDJfRU4JQklUKDYpCiAjZGVmaW5lIFNXSVRDSDFfRU4JQklUKDUpCiAjZGVmaW5lIERFVl9PRkZfUlNUCUJJVCgzKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvcnQ1MDMzLmggYi9pbmNsdWRlL2xpbnV4L21mZC9ydDUwMzMuaAppbmRleCAwMTBjZmY0Li42Y2ZmNWNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9ydDUwMzMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9ydDUwMzMuaApAQCAtMzksNyArMzksNyBAQAogCXN0cnVjdCBpMmNfY2xpZW50CSpjbGllbnQ7CiAJc3RydWN0IHJ0NTAzM19kZXYJKnJ0NTAzMzsKIAlzdHJ1Y3QgcmVnbWFwCQkqcmVnbWFwOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkJcHN5OworCXN0cnVjdCBwb3dlcl9zdXBwbHkJKnBzeTsKIH07CiAKIC8qIFJUNTAzMyBjaGFyZ2VyIHBsYXRmb3JtIGRhdGEgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3J0c3hfcGNpLmggYi9pbmNsdWRlL2xpbnV4L21mZC9ydHN4X3BjaS5oCmluZGV4IDBjMTI2MjguLmZmODQzZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3J0c3hfcGNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvcnRzeF9wY2kuaApAQCAtMjgsNzQgKzI4LDcyIEBACiAKICNkZWZpbmUgTUFYX1JXX1JFR19DTlQJCQkxMDI0CiAKLS8qIFBDSSBPcGVyYXRpb24gUmVnaXN0ZXIgQWRkcmVzcyAqLwogI2RlZmluZSBSVFNYX0hDQkFSCQkJMHgwMAogI2RlZmluZSBSVFNYX0hDQkNUTFIJCQkweDA0CisjZGVmaW5lICAgU1RPUF9DTUQJCQkoMHgwMSA8PCAyOCkKKyNkZWZpbmUgICBSRUFEX1JFR19DTUQJCQkwCisjZGVmaW5lICAgV1JJVEVfUkVHX0NNRAkJCTEKKyNkZWZpbmUgICBDSEVDS19SRUdfQ01ECQkJMgorCiAjZGVmaW5lIFJUU1hfSERCQVIJCQkweDA4CisjZGVmaW5lICAgU0dfSU5UCQkJMHgwNAorI2RlZmluZSAgIFNHX0VORAkJCTB4MDIKKyNkZWZpbmUgICBTR19WQUxJRAkJCTB4MDEKKyNkZWZpbmUgICBTR19OT19PUAkJCTB4MDAKKyNkZWZpbmUgICBTR19UUkFOU19EQVRBCQkJKDB4MDIgPDwgNCkKKyNkZWZpbmUgICBTR19MSU5LX0RFU0MJCQkoMHgwMyA8PCA0KQogI2RlZmluZSBSVFNYX0hEQkNUTFIJCQkweDBDCisjZGVmaW5lICAgU0RNQV9NT0RFCQkJMHgwMAorI2RlZmluZSAgIEFETUFfTU9ERQkJCSgweDAyIDw8IDI2KQorI2RlZmluZSAgIFNUT1BfRE1BCQkJKDB4MDEgPDwgMjgpCisjZGVmaW5lICAgVFJJR19ETUEJCQkoMHgwMSA8PCAzMSkKKwogI2RlZmluZSBSVFNYX0hBSU1SCQkJMHgxMAorI2RlZmluZSAgIEhBSU1SX1RSQU5TX1NUQVJUCQkoMHgwMSA8PCAzMSkKKyNkZWZpbmUgICBIQUlNUl9SRUFECQkJMHgwMAorI2RlZmluZSAgIEhBSU1SX1dSSVRFCQkJKDB4MDEgPDwgMzApCisjZGVmaW5lICAgSEFJTVJfUkVBRF9TVEFSVAkJKEhBSU1SX1RSQU5TX1NUQVJUIHwgSEFJTVJfUkVBRCkKKyNkZWZpbmUgICBIQUlNUl9XUklURV9TVEFSVAkJKEhBSU1SX1RSQU5TX1NUQVJUIHwgSEFJTVJfV1JJVEUpCisjZGVmaW5lICAgSEFJTVJfVFJBTlNfRU5ECQkJKEhBSU1SX1RSQU5TX1NUQVJUKQorCiAjZGVmaW5lIFJUU1hfQklQUgkJCTB4MTQKLSNkZWZpbmUgUlRTWF9CSUVSCQkJMHgxOAotCi0vKiBIb3N0IGNvbW1hbmQgYnVmZmVyIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU1RPUF9DTUQJCQkoMHgwMSA8PCAyOCkKLQotLyogSG9zdCBkYXRhIGJ1ZmZlciBjb250cm9sIHJlZ2lzdGVyICovCi0jZGVmaW5lIFNETUFfTU9ERQkJCTB4MDAKLSNkZWZpbmUgQURNQV9NT0RFCQkJKDB4MDIgPDwgMjYpCi0jZGVmaW5lIFNUT1BfRE1BCQkJKDB4MDEgPDwgMjgpCi0jZGVmaW5lIFRSSUdfRE1BCQkJKDB4MDEgPDwgMzEpCi0KLS8qIEhvc3QgYWNjZXNzIGludGVybmFsIG1lbW9yeSByZWdpc3RlciAqLwotI2RlZmluZSBIQUlNUl9UUkFOU19TVEFSVAkJKDB4MDEgPDwgMzEpCi0jZGVmaW5lIEhBSU1SX1JFQUQJCQkweDAwCi0jZGVmaW5lIEhBSU1SX1dSSVRFCQkJKDB4MDEgPDwgMzApCi0jZGVmaW5lIEhBSU1SX1JFQURfU1RBUlQJCShIQUlNUl9UUkFOU19TVEFSVCB8IEhBSU1SX1JFQUQpCi0jZGVmaW5lIEhBSU1SX1dSSVRFX1NUQVJUCQkoSEFJTVJfVFJBTlNfU1RBUlQgfCBIQUlNUl9XUklURSkKLSNkZWZpbmUgSEFJTVJfVFJBTlNfRU5ECQkJKEhBSU1SX1RSQU5TX1NUQVJUKQotCi0vKiBCdXMgaW50ZXJydXB0IHBlbmRpbmcgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQ01EX0RPTkVfSU5UCQkJKDEgPDwgMzEpCi0jZGVmaW5lIERBVEFfRE9ORV9JTlQJCQkoMSA8PCAzMCkKLSNkZWZpbmUgVFJBTlNfT0tfSU5UCQkJKDEgPDwgMjkpCi0jZGVmaW5lIFRSQU5TX0ZBSUxfSU5UCQkJKDEgPDwgMjgpCi0jZGVmaW5lIFhEX0lOVAkJCQkoMSA8PCAyNykKLSNkZWZpbmUgTVNfSU5UCQkJCSgxIDw8IDI2KQotI2RlZmluZSBTRF9JTlQJCQkJKDEgPDwgMjUpCi0jZGVmaW5lIEdQSU8wX0lOVAkJCSgxIDw8IDI0KQotI2RlZmluZSBPQ19JTlQJCQkJKDEgPDwgMjMpCi0jZGVmaW5lIFNEX1dSSVRFX1BST1RFQ1QJCSgxIDw8IDE5KQotI2RlZmluZSBYRF9FWElTVAkJCSgxIDw8IDE4KQotI2RlZmluZSBNU19FWElTVAkJCSgxIDw8IDE3KQotI2RlZmluZSBTRF9FWElTVAkJCSgxIDw8IDE2KQotI2RlZmluZSBERUxJTktfSU5UCQkJR1BJTzBfSU5UCi0jZGVmaW5lIE1TX09DX0lOVAkJCSgxIDw8IDIzKQotI2RlZmluZSBTRF9PQ19JTlQJCQkoMSA8PCAyMikKKyNkZWZpbmUgICBDTURfRE9ORV9JTlQJCQkoMSA8PCAzMSkKKyNkZWZpbmUgICBEQVRBX0RPTkVfSU5UCQkJKDEgPDwgMzApCisjZGVmaW5lICAgVFJBTlNfT0tfSU5UCQkJKDEgPDwgMjkpCisjZGVmaW5lICAgVFJBTlNfRkFJTF9JTlQJCSgxIDw8IDI4KQorI2RlZmluZSAgIFhEX0lOVAkJCSgxIDw8IDI3KQorI2RlZmluZSAgIE1TX0lOVAkJCSgxIDw8IDI2KQorI2RlZmluZSAgIFNEX0lOVAkJCSgxIDw8IDI1KQorI2RlZmluZSAgIEdQSU8wX0lOVAkJCSgxIDw8IDI0KQorI2RlZmluZSAgIE9DX0lOVAkJCSgxIDw8IDIzKQorI2RlZmluZSAgIFNEX1dSSVRFX1BST1RFQ1QJCSgxIDw8IDE5KQorI2RlZmluZSAgIFhEX0VYSVNUCQkJKDEgPDwgMTgpCisjZGVmaW5lICAgTVNfRVhJU1QJCQkoMSA8PCAxNykKKyNkZWZpbmUgICBTRF9FWElTVAkJCSgxIDw8IDE2KQorI2RlZmluZSAgIERFTElOS19JTlQJCQlHUElPMF9JTlQKKyNkZWZpbmUgICBNU19PQ19JTlQJCQkoMSA8PCAyMykKKyNkZWZpbmUgICBTRF9PQ19JTlQJCQkoMSA8PCAyMikKIAogI2RlZmluZSBDQVJEX0lOVAkJKFhEX0lOVCB8IE1TX0lOVCB8IFNEX0lOVCkKICNkZWZpbmUgTkVFRF9DT01QTEVURV9JTlQJKERBVEFfRE9ORV9JTlQgfCBUUkFOU19PS19JTlQgfCBUUkFOU19GQUlMX0lOVCkKICNkZWZpbmUgUlRTWF9JTlQJCShDTURfRE9ORV9JTlQgfCBORUVEX0NPTVBMRVRFX0lOVCB8IFwKIAkJCQkJQ0FSRF9JTlQgfCBHUElPMF9JTlQgfCBPQ19JTlQpCi0KICNkZWZpbmUgQ0FSRF9FWElTVAkJKFhEX0VYSVNUIHwgTVNfRVhJU1QgfCBTRF9FWElTVCkKIAotLyogQnVzIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgQ01EX0RPTkVfSU5UX0VOCQkoMSA8PCAzMSkKLSNkZWZpbmUgREFUQV9ET05FX0lOVF9FTgkoMSA8PCAzMCkKLSNkZWZpbmUgVFJBTlNfT0tfSU5UX0VOCQkoMSA8PCAyOSkKLSNkZWZpbmUgVFJBTlNfRkFJTF9JTlRfRU4JKDEgPDwgMjgpCi0jZGVmaW5lIFhEX0lOVF9FTgkJKDEgPDwgMjcpCi0jZGVmaW5lIE1TX0lOVF9FTgkJKDEgPDwgMjYpCi0jZGVmaW5lIFNEX0lOVF9FTgkJKDEgPDwgMjUpCi0jZGVmaW5lIEdQSU8wX0lOVF9FTgkJKDEgPDwgMjQpCi0jZGVmaW5lIE9DX0lOVF9FTgkJKDEgPDwgMjMpCi0jZGVmaW5lIERFTElOS19JTlRfRU4JCUdQSU8wX0lOVF9FTgotI2RlZmluZSBNU19PQ19JTlRfRU4JCSgxIDw8IDIzKQotI2RlZmluZSBTRF9PQ19JTlRfRU4JCSgxIDw8IDIyKQorI2RlZmluZSBSVFNYX0JJRVIJCQkweDE4CisjZGVmaW5lICAgQ01EX0RPTkVfSU5UX0VOCQkoMSA8PCAzMSkKKyNkZWZpbmUgICBEQVRBX0RPTkVfSU5UX0VOCQkoMSA8PCAzMCkKKyNkZWZpbmUgICBUUkFOU19PS19JTlRfRU4JCSgxIDw8IDI5KQorI2RlZmluZSAgIFRSQU5TX0ZBSUxfSU5UX0VOCQkoMSA8PCAyOCkKKyNkZWZpbmUgICBYRF9JTlRfRU4JCQkoMSA8PCAyNykKKyNkZWZpbmUgICBNU19JTlRfRU4JCQkoMSA8PCAyNikKKyNkZWZpbmUgICBTRF9JTlRfRU4JCQkoMSA8PCAyNSkKKyNkZWZpbmUgICBHUElPMF9JTlRfRU4JCQkoMSA8PCAyNCkKKyNkZWZpbmUgICBPQ19JTlRfRU4JCQkoMSA8PCAyMykKKyNkZWZpbmUgICBERUxJTktfSU5UX0VOCQkJR1BJTzBfSU5UX0VOCisjZGVmaW5lICAgTVNfT0NfSU5UX0VOCQkJKDEgPDwgMjMpCisjZGVmaW5lICAgU0RfT0NfSU5UX0VOCQkJKDEgPDwgMjIpCiAKLSNkZWZpbmUgUkVBRF9SRUdfQ01ECQkwCi0jZGVmaW5lIFdSSVRFX1JFR19DTUQJCTEKLSNkZWZpbmUgQ0hFQ0tfUkVHX0NNRAkJMgogCiAvKgogICogbWFjcm9zIGZvciBlYXN5IHVzZQpAQCAtMTI1LDQyMyArMTIzLDY4IEBACiAjZGVmaW5lIHJ0c3hfcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY3IsIHdoZXJlLCB2YWwpIFwKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKChwY3IpLT5wY2ksIHdoZXJlLCB2YWwpCiAKLSNkZWZpbmUgU1RBVEVfVFJBTlNfTk9ORQkwCi0jZGVmaW5lIFNUQVRFX1RSQU5TX0NNRAkJMQotI2RlZmluZSBTVEFURV9UUkFOU19CVUYJCTIKLSNkZWZpbmUgU1RBVEVfVFJBTlNfU0cJCTMKKyNkZWZpbmUgU1RBVEVfVFJBTlNfTk9ORQkJMAorI2RlZmluZSBTVEFURV9UUkFOU19DTUQJCQkxCisjZGVmaW5lIFNUQVRFX1RSQU5TX0JVRgkJCTIKKyNkZWZpbmUgU1RBVEVfVFJBTlNfU0cJCQkzCiAKLSNkZWZpbmUgVFJBTlNfTk9UX1JFQURZCQkwCi0jZGVmaW5lIFRSQU5TX1JFU1VMVF9PSwkJMQotI2RlZmluZSBUUkFOU19SRVNVTFRfRkFJTAkyCi0jZGVmaW5lIFRSQU5TX05PX0RFVklDRQkJMworI2RlZmluZSBUUkFOU19OT1RfUkVBRFkJCQkwCisjZGVmaW5lIFRSQU5TX1JFU1VMVF9PSwkJCTEKKyNkZWZpbmUgVFJBTlNfUkVTVUxUX0ZBSUwJCTIKKyNkZWZpbmUgVFJBTlNfTk9fREVWSUNFCQkJMwogCi0jZGVmaW5lIFJUU1hfUkVTVl9CVUZfTEVOCTQwOTYKLSNkZWZpbmUgSE9TVF9DTURTX0JVRl9MRU4JMTAyNAotI2RlZmluZSBIT1NUX1NHX1RCTF9CVUZfTEVOCShSVFNYX1JFU1ZfQlVGX0xFTiAtIEhPU1RfQ01EU19CVUZfTEVOKQotI2RlZmluZSBIT1NUX1NHX1RCTF9JVEVNUwkoSE9TVF9TR19UQkxfQlVGX0xFTiAvIDgpCi0jZGVmaW5lIE1BWF9TR19JVEVNX0xFTgkJMHg4MDAwMAorI2RlZmluZSBSVFNYX1JFU1ZfQlVGX0xFTgkJNDA5NgorI2RlZmluZSBIT1NUX0NNRFNfQlVGX0xFTgkJMTAyNAorI2RlZmluZSBIT1NUX1NHX1RCTF9CVUZfTEVOCQkoUlRTWF9SRVNWX0JVRl9MRU4gLSBIT1NUX0NNRFNfQlVGX0xFTikKKyNkZWZpbmUgSE9TVF9TR19UQkxfSVRFTVMJCShIT1NUX1NHX1RCTF9CVUZfTEVOIC8gOCkKKyNkZWZpbmUgTUFYX1NHX0lURU1fTEVOCQkJMHg4MDAwMAorI2RlZmluZSBIT1NUX1RPX0RFVklDRQkJCTAKKyNkZWZpbmUgREVWSUNFX1RPX0hPU1QJCQkxCiAKLSNkZWZpbmUgSE9TVF9UT19ERVZJQ0UJCTAKLSNkZWZpbmUgREVWSUNFX1RPX0hPU1QJCTEKKyNkZWZpbmUgT1VUUFVUXzNWMwkJCTAKKyNkZWZpbmUgT1VUUFVUXzFWOAkJCTEKIAotI2RlZmluZSBSVFNYX1BIQVNFX01BWAkJMzIKLSNkZWZpbmUgUlhfVFVOSU5HX0NOVAkJMwotCi0vKiBTRyBkZXNjcmlwdG9yICovCi0jZGVmaW5lIFNHX0lOVAkJCTB4MDQKLSNkZWZpbmUgU0dfRU5ECQkJMHgwMgotI2RlZmluZSBTR19WQUxJRAkJMHgwMQotCi0jZGVmaW5lIFNHX05PX09QCQkweDAwCi0jZGVmaW5lIFNHX1RSQU5TX0RBVEEJCSgweDAyIDw8IDQpCi0jZGVmaW5lIFNHX0xJTktfREVTQwkJKDB4MDMgPDwgNCkKLQotLyogT3V0cHV0IHZvbHRhZ2UgKi8KLSNkZWZpbmUgT1VUUFVUXzNWMwkJMAotI2RlZmluZSBPVVRQVVRfMVY4CQkxCi0KLS8qIENhcmQgQ2xvY2sgRW5hYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFNEX0NMS19FTgkJCTB4MDQKLSNkZWZpbmUgTVNfQ0xLX0VOCQkJMHgwOAotCi0vKiBDYXJkIFNlbGVjdCBSZWdpc3RlciAqLwotI2RlZmluZSBTRF9NT0RfU0VMCQkJMgotI2RlZmluZSBNU19NT0RfU0VMCQkJMwotCi0vKiBDYXJkIE91dHB1dCBFbmFibGUgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0RfT1VUUFVUX0VOCQkJMHgwNAotI2RlZmluZSBNU19PVVRQVVRfRU4JCQkweDA4Ci0KLS8qIENBUkRfU0hBUkVfTU9ERSAqLwotI2RlZmluZSBDQVJEX1NIQVJFX01BU0sJCQkweDBGCi0jZGVmaW5lIENBUkRfU0hBUkVfTVVMVElfTFVOCQkweDAwCi0jZGVmaW5lCUNBUkRfU0hBUkVfTk9STUFMCQkweDAwCi0jZGVmaW5lCUNBUkRfU0hBUkVfNDhfU0QJCTB4MDQKLSNkZWZpbmUJQ0FSRF9TSEFSRV80OF9NUwkJMHgwOAotLyogQ0FSRF9TSEFSRV9NT0RFIGZvciBiYXJvc3NhICovCi0jZGVmaW5lIENBUkRfU0hBUkVfQkFST1NTQV9TRAkJMHgwMQotI2RlZmluZSBDQVJEX1NIQVJFX0JBUk9TU0FfTVMJCTB4MDIKLQotLyogQ0FSRF9EUklWRV9TRUwgKi8KLSNkZWZpbmUgTVNfRFJJVkVfOG1BCQkJKDB4MDEgPDwgNikKLSNkZWZpbmUgTU1DX0RSSVZFXzhtQQkJCSgweDAxIDw8IDQpCi0jZGVmaW5lIFhEX0RSSVZFXzhtQQkJCSgweDAxIDw8IDIpCi0jZGVmaW5lIEdQSU9fRFJJVkVfOG1BCQkJMHgwMQotI2RlZmluZSBSVFM1MjA5X0NBUkRfRFJJVkVfREVGQVVMVAkoTVNfRFJJVkVfOG1BIHwgTU1DX0RSSVZFXzhtQSB8XAotCQkJCQkJWERfRFJJVkVfOG1BIHwgR1BJT19EUklWRV84bUEpCi0jZGVmaW5lIFJUTDg0MTFfQ0FSRF9EUklWRV9ERUZBVUxUCShNU19EUklWRV84bUEgfCBNTUNfRFJJVkVfOG1BIHxcCi0JCQkJCQlYRF9EUklWRV84bUEpCi0jZGVmaW5lIFJUU1hfQ0FSRF9EUklWRV9ERUZBVUxUCQkoTVNfRFJJVkVfOG1BIHwgR1BJT19EUklWRV84bUEpCi0KLS8qIFNEMzBfRFJJVkVfU0VMICovCi0jZGVmaW5lIERSSVZFUl9UWVBFX0EJCQkweDA1Ci0jZGVmaW5lIERSSVZFUl9UWVBFX0IJCQkweDAzCi0jZGVmaW5lIERSSVZFUl9UWVBFX0MJCQkweDAyCi0jZGVmaW5lIERSSVZFUl9UWVBFX0QJCQkweDAxCi0jZGVmaW5lIENGR19EUklWRVJfVFlQRV9BCQkweDAyCi0jZGVmaW5lIENGR19EUklWRVJfVFlQRV9CCQkweDAzCi0jZGVmaW5lIENGR19EUklWRVJfVFlQRV9DCQkweDAxCi0jZGVmaW5lIENGR19EUklWRVJfVFlQRV9ECQkweDAwCi0KLS8qIEZQRENUTCAqLwotI2RlZmluZSBTU0NfUE9XRVJfRE9XTgkJCTB4MDEKLSNkZWZpbmUgU0RfT0NfUE9XRVJfRE9XTgkJMHgwMgotI2RlZmluZSBBTExfUE9XRVJfRE9XTgkJCTB4MDcKLSNkZWZpbmUgT0NfUE9XRVJfRE9XTgkJCTB4MDYKLQotLyogQ0xLX0NUTCAqLwotI2RlZmluZSBDSEFOR0VfQ0xLCQkJMHgwMQotCi0vKiBMRE9fQ1RMICovCi0jZGVmaW5lIEJQUF9BU0lDXzFWNwkJCTB4MDAKLSNkZWZpbmUgQlBQX0FTSUNfMVY4CQkJMHgwMQotI2RlZmluZSBCUFBfQVNJQ18xVjkJCQkweDAyCi0jZGVmaW5lIEJQUF9BU0lDXzJWMAkJCTB4MDMKLSNkZWZpbmUgQlBQX0FTSUNfMlY3CQkJMHgwNAotI2RlZmluZSBCUFBfQVNJQ18yVjgJCQkweDA1Ci0jZGVmaW5lIEJQUF9BU0lDXzNWMgkJCTB4MDYKLSNkZWZpbmUgQlBQX0FTSUNfM1YzCQkJMHgwNwotI2RlZmluZSBCUFBfUkVHX1RVTkVEMTgJCQkweDA3Ci0jZGVmaW5lIEJQUF9UVU5FRDE4X1NISUZUXzg0MDIJCTUKLSNkZWZpbmUgQlBQX1RVTkVEMThfU0hJRlRfODQxMQkJNAotI2RlZmluZSBCUFBfUEFEX01BU0sJCQkweDA0Ci0jZGVmaW5lIEJQUF9QQURfM1YzCQkJMHgwNAotI2RlZmluZSBCUFBfUEFEXzFWOAkJCTB4MDAKLSNkZWZpbmUgQlBQX0xET19QT1dCCQkJMHgwMwotI2RlZmluZSBCUFBfTERPX09OCQkJMHgwMAotI2RlZmluZSBCUFBfTERPX1NVU1BFTkQJCQkweDAyCi0jZGVmaW5lIEJQUF9MRE9fT0ZGCQkJMHgwMwotCi0vKiBDRF9QQURfQ1RMICovCi0jZGVmaW5lIENEX0RJU0FCTEVfTUFTSwkJCTB4MDcKLSNkZWZpbmUgTVNfQ0RfRElTQUJMRQkJCTB4MDQKLSNkZWZpbmUgU0RfQ0RfRElTQUJMRQkJCTB4MDIKLSNkZWZpbmUgWERfQ0RfRElTQUJMRQkJCTB4MDEKLSNkZWZpbmUgQ0RfRElTQUJMRQkJCTB4MDcKLSNkZWZpbmUgQ0RfRU5BQkxFCQkJMHgwMAotI2RlZmluZSBNU19DRF9FTl9PTkxZCQkJMHgwMwotI2RlZmluZSBTRF9DRF9FTl9PTkxZCQkJMHgwNQotI2RlZmluZSBYRF9DRF9FTl9PTkxZCQkJMHgwNgotI2RlZmluZSBGT1JDRV9DRF9MT1dfTUFTSwkJMHgzOAotI2RlZmluZSBGT1JDRV9DRF9YRF9MT1cJCQkweDA4Ci0jZGVmaW5lIEZPUkNFX0NEX1NEX0xPVwkJCTB4MTAKLSNkZWZpbmUgRk9SQ0VfQ0RfTVNfTE9XCQkJMHgyMAotI2RlZmluZSBDRF9BVVRPX0RJU0FCTEUJCQkweDQwCi0KLS8qIFNEX1NUQVQxICovCi0jZGVmaW5lCVNEX0NSQzdfRVJSCQkJMHg4MAotI2RlZmluZQlTRF9DUkMxNl9FUlIJCQkweDQwCi0jZGVmaW5lCVNEX0NSQ19XUklURV9FUlIJCTB4MjAKLSNkZWZpbmUJU0RfQ1JDX1dSSVRFX0VSUl9NQVNLCQkweDFDCi0jZGVmaW5lCUdFVF9DUkNfVElNRV9PVVQJCTB4MDIKLSNkZWZpbmUJU0RfVFVOSU5HX0NPTVBBUkVfRVJSCQkweDAxCi0KLS8qIFNEX1NUQVQyICovCi0jZGVmaW5lCVNEX1JTUF84MENMS19USU1FT1VUCQkweDAxCi0KLS8qIFNEX0JVU19TVEFUICovCi0jZGVmaW5lCVNEX0NMS19UT0dHTEVfRU4JCTB4ODAKLSNkZWZpbmUJU0RfQ0xLX0ZPUkNFX1NUT1AJICAgICAgICAweDQwCi0jZGVmaW5lCVNEX0RBVDNfU1RBVFVTCQkgICAgICAgIDB4MTAKLSNkZWZpbmUJU0RfREFUMl9TVEFUVVMJCSAgICAgICAgMHgwOAotI2RlZmluZQlTRF9EQVQxX1NUQVRVUwkJICAgICAgICAweDA0Ci0jZGVmaW5lCVNEX0RBVDBfU1RBVFVTCQkgICAgICAgIDB4MDIKLSNkZWZpbmUJU0RfQ01EX1NUQVRVUwkJCTB4MDEKLQotLyogU0RfUEFEX0NUTCAqLwotI2RlZmluZQlTRF9JT19VU0lOR18xVjgJCSAgICAgICAgMHg4MAotI2RlZmluZQlTRF9JT19VU0lOR18zVjMJCSAgICAgICAgMHg3RgotI2RlZmluZQlUWVBFX0FfRFJJVklORwkJICAgICAgICAweDAwCi0jZGVmaW5lCVRZUEVfQl9EUklWSU5HCQkJMHgwMQotI2RlZmluZQlUWVBFX0NfRFJJVklORwkJCTB4MDIKLSNkZWZpbmUJVFlQRV9EX0RSSVZJTkcJCSAgICAgICAgMHgwMwotCi0vKiBTRF9TQU1QTEVfUE9JTlRfQ1RMICovCi0jZGVmaW5lCUREUl9GSVhfUlhfREFUCQkJMHgwMAotI2RlZmluZQlERFJfVkFSX1JYX0RBVAkJCTB4ODAKLSNkZWZpbmUJRERSX0ZJWF9SWF9EQVRfRURHRQkJMHgwMAotI2RlZmluZQlERFJfRklYX1JYX0RBVF8xNF9ERUxBWQkJMHg0MAotI2RlZmluZQlERFJfRklYX1JYX0NNRAkJCTB4MDAKLSNkZWZpbmUJRERSX1ZBUl9SWF9DTUQJCQkweDIwCi0jZGVmaW5lCUREUl9GSVhfUlhfQ01EX1BPU19FREdFCQkweDAwCi0jZGVmaW5lCUREUl9GSVhfUlhfQ01EXzE0X0RFTEFZCQkweDEwCi0jZGVmaW5lCVNEMjBfUlhfUE9TX0VER0UJCTB4MDAKLSNkZWZpbmUJU0QyMF9SWF8xNF9ERUxBWQkJMHgwOAotI2RlZmluZSBTRDIwX1JYX1NFTF9NQVNLCQkweDA4Ci0KLS8qIFNEX1BVU0hfUE9JTlRfQ1RMICovCi0jZGVmaW5lCUREUl9GSVhfVFhfQ01EX0RBVAkJMHgwMAotI2RlZmluZQlERFJfVkFSX1RYX0NNRF9EQVQJCTB4ODAKLSNkZWZpbmUJRERSX0ZJWF9UWF9EQVRfMTRfVFNVCQkweDAwCi0jZGVmaW5lCUREUl9GSVhfVFhfREFUXzEyX1RTVQkJMHg0MAotI2RlZmluZQlERFJfRklYX1RYX0NNRF9ORUdfRURHRQkJMHgwMAotI2RlZmluZQlERFJfRklYX1RYX0NNRF8xNF9BSEVBRAkJMHgyMAotI2RlZmluZQlTRDIwX1RYX05FR19FREdFCQkweDAwCi0jZGVmaW5lCVNEMjBfVFhfMTRfQUhFQUQJCTB4MTAKLSNkZWZpbmUgU0QyMF9UWF9TRUxfTUFTSwkJMHgxMAotI2RlZmluZQlERFJfVkFSX1NEQ0xLX1BPTF9TV0FQCQkweDAxCi0KLS8qIFNEX1RSQU5TRkVSICovCi0jZGVmaW5lCVNEX1RSQU5TRkVSX1NUQVJUCQkweDgwCi0jZGVmaW5lCVNEX1RSQU5TRkVSX0VORAkJCTB4NDAKLSNkZWZpbmUgU0RfU1RBVF9JRExFCQkJMHgyMAotI2RlZmluZQlTRF9UUkFOU0ZFUl9FUlIJCQkweDEwCi0vKiBTRCBUcmFuc2ZlciBNb2RlIGRlZmluaXRpb24gKi8KLSNkZWZpbmUJU0RfVE1fTk9STUFMX1dSSVRFCQkweDAwCi0jZGVmaW5lCVNEX1RNX0FVVE9fV1JJVEVfMwkJMHgwMQotI2RlZmluZQlTRF9UTV9BVVRPX1dSSVRFXzQJCTB4MDIKLSNkZWZpbmUJU0RfVE1fQVVUT19SRUFEXzMJCTB4MDUKLSNkZWZpbmUJU0RfVE1fQVVUT19SRUFEXzQJCTB4MDYKLSNkZWZpbmUJU0RfVE1fQ01EX1JTUAkJCTB4MDgKLSNkZWZpbmUJU0RfVE1fQVVUT19XUklURV8xCQkweDA5Ci0jZGVmaW5lCVNEX1RNX0FVVE9fV1JJVEVfMgkJMHgwQQotI2RlZmluZQlTRF9UTV9OT1JNQUxfUkVBRAkJMHgwQwotI2RlZmluZQlTRF9UTV9BVVRPX1JFQURfMQkJMHgwRAotI2RlZmluZQlTRF9UTV9BVVRPX1JFQURfMgkJMHgwRQotI2RlZmluZQlTRF9UTV9BVVRPX1RVTklORwkJMHgwRgotCi0vKiBTRF9WUFRYX0NUTCAvIFNEX1ZQUlhfQ1RMICovCi0jZGVmaW5lIFBIQVNFX0NIQU5HRQkJCTB4ODAKLSNkZWZpbmUgUEhBU0VfTk9UX1JFU0VUCQkJMHg0MAotCi0vKiBTRF9EQ01QU19UWF9DVEwgLyBTRF9EQ01QU19SWF9DVEwgKi8KLSNkZWZpbmUgRENNUFNfQ0hBTkdFCQkJMHg4MAotI2RlZmluZSBEQ01QU19DSEFOR0VfRE9ORQkJMHg0MAotI2RlZmluZSBEQ01QU19FUlJPUgkJCTB4MjAKLSNkZWZpbmUgRENNUFNfQ1VSUkVOVF9QSEFTRQkJMHgxRgotCi0vKiBTRCBDb25maWd1cmUgMSBSZWdpc3RlciAqLwotI2RlZmluZSBTRF9DTEtfRElWSURFXzAJCQkweDAwCi0jZGVmaW5lCVNEX0NMS19ESVZJREVfMjU2CQkweEMwCi0jZGVmaW5lCVNEX0NMS19ESVZJREVfMTI4CQkweDgwCi0jZGVmaW5lCVNEX0JVU19XSURUSF8xQklUCQkweDAwCi0jZGVmaW5lCVNEX0JVU19XSURUSF80QklUCQkweDAxCi0jZGVmaW5lCVNEX0JVU19XSURUSF84QklUCQkweDAyCi0jZGVmaW5lCVNEX0FTWU5DX0ZJRk9fTk9UX1JTVAkJMHgxMAotI2RlZmluZQlTRF8yMF9NT0RFCQkJMHgwMAotI2RlZmluZQlTRF9ERFJfTU9ERQkJCTB4MDQKLSNkZWZpbmUJU0RfMzBfTU9ERQkJCTB4MDgKLQotI2RlZmluZSBTRF9DTEtfRElWSURFX01BU0sJCTB4QzAKLQotLyogU0RfQ01EX1NUQVRFICovCi0jZGVmaW5lIFNEX0NNRF9JRExFCQkJMHg4MAotCi0vKiBTRF9EQVRBX1NUQVRFICovCi0jZGVmaW5lIFNEX0RBVEFfSURMRQkJCTB4ODAKLQotLyogRENNX0RSUF9DVEwgKi8KLSNkZWZpbmUgRENNX1JFU0VUCQkJMHgwOAotI2RlZmluZSBEQ01fTE9DS0VECQkJMHgwNAotI2RlZmluZSBEQ01fMjA4TQkJCTB4MDAKLSNkZWZpbmUgRENNX1RYCQkJICAgICAgICAweDAxCi0jZGVmaW5lIERDTV9SWAkJCSAgICAgICAgMHgwMgotCi0vKiBEQ01fRFJQX1RSSUcgKi8KLSNkZWZpbmUgRFJQX1NUQVJUCQkJMHg4MAotI2RlZmluZSBEUlBfRE9ORQkJCTB4NDAKLQotLyogRENNX0RSUF9DRkcgKi8KLSNkZWZpbmUgRFJQX1dSSVRFCQkJMHg4MAotI2RlZmluZSBEUlBfUkVBRAkJCTB4MDAKLSNkZWZpbmUgRENNX1dSSVRFX0FERFJFU1NfNTAJCTB4NTAKLSNkZWZpbmUgRENNX1dSSVRFX0FERFJFU1NfNTEJCTB4NTEKLSNkZWZpbmUgRENNX1JFQURfQUREUkVTU18wMAkJMHgwMAotI2RlZmluZSBEQ01fUkVBRF9BRERSRVNTXzUxCQkweDUxCi0KLS8qIElSUVNUQVQwICovCi0jZGVmaW5lIERNQV9ET05FX0lOVAkJCTB4ODAKLSNkZWZpbmUgU1VTUEVORF9JTlQJCQkweDQwCi0jZGVmaW5lIExJTktfUkRZX0lOVAkJCTB4MjAKLSNkZWZpbmUgTElOS19ET1dOX0lOVAkJCTB4MTAKLQotLyogRE1BQ1RMICovCi0jZGVmaW5lIERNQV9SU1QJCQkJMHg4MAotI2RlZmluZSBETUFfQlVTWQkJCTB4MDQKLSNkZWZpbmUgRE1BX0RJUl9UT19DQVJECQkJMHgwMAotI2RlZmluZSBETUFfRElSX0ZST01fQ0FSRAkJMHgwMgotI2RlZmluZSBETUFfRU4JCQkJMHgwMQotI2RlZmluZSBETUFfMTI4CQkJCSgwIDw8IDQpCi0jZGVmaW5lIERNQV8yNTYJCQkJKDEgPDwgNCkKLSNkZWZpbmUgRE1BXzUxMgkJCQkoMiA8PCA0KQotI2RlZmluZSBETUFfMTAyNAkJCSgzIDw8IDQpCi0jZGVmaW5lIERNQV9QQUNLX1NJWkVfTUFTSwkJMHgzMAotCi0vKiBTU0NfQ1RMMSAqLwotI2RlZmluZSBTU0NfUlNUQgkJCTB4ODAKLSNkZWZpbmUgU1NDXzhYX0VOCQkJMHg0MAotI2RlZmluZSBTU0NfRklYX0ZSQUMJCQkweDIwCi0jZGVmaW5lIFNTQ19TRUxfMU0JCQkweDAwCi0jZGVmaW5lIFNTQ19TRUxfMk0JCQkweDA4Ci0jZGVmaW5lIFNTQ19TRUxfNE0JCQkweDEwCi0jZGVmaW5lIFNTQ19TRUxfOE0JCQkweDE4Ci0KLS8qIFNTQ19DVEwyICovCi0jZGVmaW5lIFNTQ19ERVBUSF9NQVNLCQkJMHgwNwotI2RlZmluZSBTU0NfREVQVEhfRElTQUxCRQkJMHgwMAotI2RlZmluZSBTU0NfREVQVEhfNE0JCQkweDAxCi0jZGVmaW5lIFNTQ19ERVBUSF8yTQkJCTB4MDIKLSNkZWZpbmUgU1NDX0RFUFRIXzFNCQkJMHgwMwotI2RlZmluZSBTU0NfREVQVEhfNTAwSwkJCTB4MDQKLSNkZWZpbmUgU1NDX0RFUFRIXzI1MEsJCQkweDA1Ci0KLS8qIFN5c3RlbSBDbG9jayBDb250cm9sIFJlZ2lzdGVyICovCi0jZGVmaW5lIENMS19MT1dfRlJFUQkJCTB4MDEKLQotLyogU3lzdGVtIENsb2NrIERpdmlkZXIgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQ0xLX0RJVl8xCQkJMHgwMQotI2RlZmluZSBDTEtfRElWXzIJCQkweDAyCi0jZGVmaW5lIENMS19ESVZfNAkJCTB4MDMKLSNkZWZpbmUgQ0xLX0RJVl84CQkJMHgwNAotCi0vKiBNU19DRkcgKi8KLSNkZWZpbmUJU0FNUExFX1RJTUVfUklTSU5HCQkweDAwCi0jZGVmaW5lCVNBTVBMRV9USU1FX0ZBTExJTkcJCTB4ODAKLSNkZWZpbmUJUFVTSF9USU1FX0RFRkFVTFQJCTB4MDAKLSNkZWZpbmUJUFVTSF9USU1FX09ERAkJCTB4NDAKLSNkZWZpbmUJTk9fRVhURU5EX1RPR0dMRQkJMHgwMAotI2RlZmluZQlFWFRFTkRfVE9HR0xFX0NISwkJMHgyMAotI2RlZmluZQlNU19CVVNfV0lEVEhfMQkJCTB4MDAKLSNkZWZpbmUJTVNfQlVTX1dJRFRIXzQJCQkweDEwCi0jZGVmaW5lCU1TX0JVU19XSURUSF84CQkJMHgxOAotI2RlZmluZQlNU18yS19TRUNUT1JfTU9ERQkJMHgwNAotI2RlZmluZQlNU181MTJfU0VDVE9SX01PREUJCTB4MDAKLSNkZWZpbmUJTVNfVE9HR0xFX1RJTUVPVVRfRU4JCTB4MDAKLSNkZWZpbmUJTVNfVE9HR0xFX1RJTUVPVVRfRElTRU4JCTB4MDEKLSNkZWZpbmUgTVNfTk9fQ0hFQ0tfSU5UCQkJMHgwMgotCi0vKiBNU19UUkFOU19DRkcgKi8KLSNkZWZpbmUJV0FJVF9JTlQJCQkweDgwCi0jZGVmaW5lCU5PX1dBSVRfSU5UCQkJMHgwMAotI2RlZmluZQlOT19BVVRPX1JFQURfSU5UX1JFRwkJMHgwMAotI2RlZmluZQlBVVRPX1JFQURfSU5UX1JFRwkJMHg0MAotI2RlZmluZQlNU19DUkMxNl9FUlIJCQkweDIwCi0jZGVmaW5lCU1TX1JEWV9USU1FT1VUCQkJMHgxMAotI2RlZmluZQlNU19JTlRfQ01ETksJCQkweDA4Ci0jZGVmaW5lCU1TX0lOVF9CUkVRCQkJMHgwNAotI2RlZmluZQlNU19JTlRfRVJSCQkJMHgwMgotI2RlZmluZQlNU19JTlRfQ0VECQkJMHgwMQotCi0vKiBNU19UUkFOU0ZFUiAqLwotI2RlZmluZQlNU19UUkFOU0ZFUl9TVEFSVAkJMHg4MAotI2RlZmluZQlNU19UUkFOU0ZFUl9FTkQJCQkweDQwCi0jZGVmaW5lCU1TX1RSQU5TRkVSX0VSUgkJCTB4MjAKLSNkZWZpbmUJTVNfQlNfU1RBVEUJCQkweDEwCi0jZGVmaW5lCU1TX1RNX1JFQURfQllURVMJCTB4MDAKLSNkZWZpbmUJTVNfVE1fTk9STUFMX1JFQUQJCTB4MDEKLSNkZWZpbmUJTVNfVE1fV1JJVEVfQllURVMJCTB4MDQKLSNkZWZpbmUJTVNfVE1fTk9STUFMX1dSSVRFCQkweDA1Ci0jZGVmaW5lCU1TX1RNX0FVVE9fUkVBRAkJCTB4MDgKLSNkZWZpbmUJTVNfVE1fQVVUT19XUklURQkJMHgwQwotCi0vKiBTRCBDb25maWd1cmUgMiBSZWdpc3RlciAqLwotI2RlZmluZQlTRF9DQUxDVUxBVEVfQ1JDNwkJMHgwMAotI2RlZmluZQlTRF9OT19DQUxDVUxBVEVfQ1JDNwkJMHg4MAotI2RlZmluZQlTRF9DSEVDS19DUkMxNgkJCTB4MDAKLSNkZWZpbmUJU0RfTk9fQ0hFQ0tfQ1JDMTYJCTB4NDAKLSNkZWZpbmUgU0RfTk9fQ0hFQ0tfV0FJVF9DUkNfVE8JCTB4MjAKLSNkZWZpbmUJU0RfV0FJVF9CVVNZX0VORAkJMHgwOAotI2RlZmluZQlTRF9OT19XQUlUX0JVU1lfRU5ECQkweDAwCi0jZGVmaW5lCVNEX0NIRUNLX0NSQzcJCQkweDAwCi0jZGVmaW5lCVNEX05PX0NIRUNLX0NSQzcJCTB4MDQKLSNkZWZpbmUJU0RfUlNQX0xFTl8wCQkJMHgwMAotI2RlZmluZQlTRF9SU1BfTEVOXzYJCQkweDAxCi0jZGVmaW5lCVNEX1JTUF9MRU5fMTcJCQkweDAyCi0vKiBTRC9NTUMgUmVzcG9uc2UgVHlwZSBEZWZpbml0aW9uICovCi0jZGVmaW5lCVNEX1JTUF9UWVBFX1IwCQkJMHgwNAotI2RlZmluZQlTRF9SU1BfVFlQRV9SMQkJCTB4MDEKLSNkZWZpbmUJU0RfUlNQX1RZUEVfUjFiCQkJMHgwOQotI2RlZmluZQlTRF9SU1BfVFlQRV9SMgkJCTB4MDIKLSNkZWZpbmUJU0RfUlNQX1RZUEVfUjMJCQkweDA1Ci0jZGVmaW5lCVNEX1JTUF9UWVBFX1I0CQkJMHgwNQotI2RlZmluZQlTRF9SU1BfVFlQRV9SNQkJCTB4MDEKLSNkZWZpbmUJU0RfUlNQX1RZUEVfUjYJCQkweDAxCi0jZGVmaW5lCVNEX1JTUF9UWVBFX1I3CQkJMHgwMQotCi0vKiBTRF9DT05GSUdVUkUzICovCi0jZGVmaW5lCVNEX1JTUF84MENMS19USU1FT1VUX0VOCQkweDAxCi0KLS8qIENhcmQgVHJhbnNmZXIgUmVzZXQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgU1BJX1NUT1AJCQkweDAxCi0jZGVmaW5lIFhEX1NUT1AJCQkJMHgwMgotI2RlZmluZSBTRF9TVE9QCQkJCTB4MDQKLSNkZWZpbmUgTVNfU1RPUAkJCQkweDA4Ci0jZGVmaW5lIFNQSV9DTFJfRVJSCQkJMHgxMAotI2RlZmluZSBYRF9DTFJfRVJSCQkJMHgyMAotI2RlZmluZSBTRF9DTFJfRVJSCQkJMHg0MAotI2RlZmluZSBNU19DTFJfRVJSCQkJMHg4MAotCi0vKiBDYXJkIERhdGEgU291cmNlIFJlZ2lzdGVyICovCi0jZGVmaW5lIFBJTkdQT05HX0JVRkZFUgkJCTB4MDEKLSNkZWZpbmUgUklOR19CVUZGRVIJCQkweDAwCi0KLS8qIENhcmQgUG93ZXIgQ29udHJvbCBSZWdpc3RlciAqLwotI2RlZmluZSBQTU9TX1NUUkdfTUFTSwkJCTB4MTAKLSNkZWZpbmUgUE1PU19TVFJHXzgwMG1BCQkJMHgxMAotI2RlZmluZSBQTU9TX1NUUkdfNDAwbUEJCQkweDAwCi0jZGVmaW5lIFNEX1BPV0VSX09GRgkJCTB4MDMKLSNkZWZpbmUgU0RfUEFSVElBTF9QT1dFUl9PTgkJMHgwMQotI2RlZmluZSBTRF9QT1dFUl9PTgkJCTB4MDAKLSNkZWZpbmUgU0RfUE9XRVJfTUFTSwkJCTB4MDMKLSNkZWZpbmUgTVNfUE9XRVJfT0ZGCQkJMHgwQwotI2RlZmluZSBNU19QQVJUSUFMX1BPV0VSX09OCQkweDA0Ci0jZGVmaW5lIE1TX1BPV0VSX09OCQkJMHgwMAotI2RlZmluZSBNU19QT1dFUl9NQVNLCQkJMHgwQwotI2RlZmluZSBCUFBfUE9XRVJfT0ZGCQkJMHgwRgotI2RlZmluZSBCUFBfUE9XRVJfNV9QRVJDRU5UX09OCQkweDBFCi0jZGVmaW5lIEJQUF9QT1dFUl8xMF9QRVJDRU5UX09OCQkweDBDCi0jZGVmaW5lIEJQUF9QT1dFUl8xNV9QRVJDRU5UX09OCQkweDA4Ci0jZGVmaW5lIEJQUF9QT1dFUl9PTgkJCTB4MDAKLSNkZWZpbmUgQlBQX1BPV0VSX01BU0sJCQkweDBGCi0jZGVmaW5lIFNEX1ZDQ19QQVJUSUFMX1BPV0VSX09OCQkweDAyCi0jZGVmaW5lIFNEX1ZDQ19QT1dFUl9PTgkJCTB4MDAKLQotLyogUFdSX0dBVEVfQ1RSTCAqLwotI2RlZmluZSBQV1JfR0FURV9FTgkJCTB4MDEKLSNkZWZpbmUgTERPMzMxOF9QV1JfTUFTSwkJMHgwNgotI2RlZmluZSBMRE9fT04JCQkJMHgwMAotI2RlZmluZSBMRE9fU1VTUEVORAkJCTB4MDQKLSNkZWZpbmUgTERPX09GRgkJCQkweDA2Ci0KLS8qIENBUkRfQ0xLX1NPVVJDRSAqLwotI2RlZmluZSBDUkNfRklYX0NMSwkJCSgweDAwIDw8IDApCi0jZGVmaW5lIENSQ19WQVJfQ0xLMAkJCSgweDAxIDw8IDApCi0jZGVmaW5lIENSQ19WQVJfQ0xLMQkJCSgweDAyIDw8IDApCi0jZGVmaW5lIFNEMzBfRklYX0NMSwkJCSgweDAwIDw8IDIpCi0jZGVmaW5lIFNEMzBfVkFSX0NMSzAJCQkoMHgwMSA8PCAyKQotI2RlZmluZSBTRDMwX1ZBUl9DTEsxCQkJKDB4MDIgPDwgMikKLSNkZWZpbmUgU0FNUExFX0ZJWF9DTEsJCQkoMHgwMCA8PCA0KQotI2RlZmluZSBTQU1QTEVfVkFSX0NMSzAJCQkoMHgwMSA8PCA0KQotI2RlZmluZSBTQU1QTEVfVkFSX0NMSzEJCQkoMHgwMiA8PCA0KQotCi0vKiBIT1NUX1NMRUVQX1NUQVRFICovCi0jZGVmaW5lIEhPU1RfRU5URVJfUzEJCQkxCi0jZGVmaW5lIEhPU1RfRU5URVJfUzMJCQkyCisjZGVmaW5lIFJUU1hfUEhBU0VfTUFYCQkJMzIKKyNkZWZpbmUgUlhfVFVOSU5HX0NOVAkJCTMKIAogI2RlZmluZSBNU19DRkcJCQkJMHhGRDQwCisjZGVmaW5lICAgU0FNUExFX1RJTUVfUklTSU5HCQkweDAwCisjZGVmaW5lICAgU0FNUExFX1RJTUVfRkFMTElORwkJMHg4MAorI2RlZmluZSAgIFBVU0hfVElNRV9ERUZBVUxUCQkweDAwCisjZGVmaW5lICAgUFVTSF9USU1FX09ERAkJCTB4NDAKKyNkZWZpbmUgICBOT19FWFRFTkRfVE9HR0xFCQkweDAwCisjZGVmaW5lICAgRVhURU5EX1RPR0dMRV9DSEsJCTB4MjAKKyNkZWZpbmUgICBNU19CVVNfV0lEVEhfMQkJMHgwMAorI2RlZmluZSAgIE1TX0JVU19XSURUSF80CQkweDEwCisjZGVmaW5lICAgTVNfQlVTX1dJRFRIXzgJCTB4MTgKKyNkZWZpbmUgICBNU18yS19TRUNUT1JfTU9ERQkJMHgwNAorI2RlZmluZSAgIE1TXzUxMl9TRUNUT1JfTU9ERQkJMHgwMAorI2RlZmluZSAgIE1TX1RPR0dMRV9USU1FT1VUX0VOCQkweDAwCisjZGVmaW5lICAgTVNfVE9HR0xFX1RJTUVPVVRfRElTRU4JMHgwMQorI2RlZmluZSBNU19OT19DSEVDS19JTlQJCQkweDAyCiAjZGVmaW5lIE1TX1RQQwkJCQkweEZENDEKICNkZWZpbmUgTVNfVFJBTlNfQ0ZHCQkJMHhGRDQyCisjZGVmaW5lICAgV0FJVF9JTlQJCQkweDgwCisjZGVmaW5lICAgTk9fV0FJVF9JTlQJCQkweDAwCisjZGVmaW5lICAgTk9fQVVUT19SRUFEX0lOVF9SRUcJCTB4MDAKKyNkZWZpbmUgICBBVVRPX1JFQURfSU5UX1JFRwkJMHg0MAorI2RlZmluZSAgIE1TX0NSQzE2X0VSUgkJCTB4MjAKKyNkZWZpbmUgICBNU19SRFlfVElNRU9VVAkJMHgxMAorI2RlZmluZSAgIE1TX0lOVF9DTUROSwkJCTB4MDgKKyNkZWZpbmUgICBNU19JTlRfQlJFUQkJCTB4MDQKKyNkZWZpbmUgICBNU19JTlRfRVJSCQkJMHgwMgorI2RlZmluZSAgIE1TX0lOVF9DRUQJCQkweDAxCiAjZGVmaW5lIE1TX1RSQU5TRkVSCQkJMHhGRDQzCisjZGVmaW5lICAgTVNfVFJBTlNGRVJfU1RBUlQJCTB4ODAKKyNkZWZpbmUgICBNU19UUkFOU0ZFUl9FTkQJCTB4NDAKKyNkZWZpbmUgICBNU19UUkFOU0ZFUl9FUlIJCTB4MjAKKyNkZWZpbmUgICBNU19CU19TVEFURQkJCTB4MTAKKyNkZWZpbmUgICBNU19UTV9SRUFEX0JZVEVTCQkweDAwCisjZGVmaW5lICAgTVNfVE1fTk9STUFMX1JFQUQJCTB4MDEKKyNkZWZpbmUgICBNU19UTV9XUklURV9CWVRFUwkJMHgwNAorI2RlZmluZSAgIE1TX1RNX05PUk1BTF9XUklURQkJMHgwNQorI2RlZmluZSAgIE1TX1RNX0FVVE9fUkVBRAkJMHgwOAorI2RlZmluZSAgIE1TX1RNX0FVVE9fV1JJVEUJCTB4MEMKICNkZWZpbmUgTVNfSU5UX1JFRwkJCTB4RkQ0NAogI2RlZmluZSBNU19CWVRFX0NOVAkJCTB4RkQ0NQogI2RlZmluZSBNU19TRUNUT1JfQ05UX0wJCQkweEZENDYKQEAgLTU0OSwxNCArMTkyLDkwIEBACiAjZGVmaW5lIE1TX0RCVVNfSAkJCTB4RkQ0OAogCiAjZGVmaW5lIFNEX0NGRzEJCQkJMHhGREEwCisjZGVmaW5lICAgU0RfQ0xLX0RJVklERV8wCQkweDAwCisjZGVmaW5lICAgU0RfQ0xLX0RJVklERV8yNTYJCTB4QzAKKyNkZWZpbmUgICBTRF9DTEtfRElWSURFXzEyOAkJMHg4MAorI2RlZmluZSAgIFNEX0JVU19XSURUSF8xQklUCQkweDAwCisjZGVmaW5lICAgU0RfQlVTX1dJRFRIXzRCSVQJCTB4MDEKKyNkZWZpbmUgICBTRF9CVVNfV0lEVEhfOEJJVAkJMHgwMgorI2RlZmluZSAgIFNEX0FTWU5DX0ZJRk9fTk9UX1JTVAkJMHgxMAorI2RlZmluZSAgIFNEXzIwX01PREUJCQkweDAwCisjZGVmaW5lICAgU0RfRERSX01PREUJCQkweDA0CisjZGVmaW5lICAgU0RfMzBfTU9ERQkJCTB4MDgKKyNkZWZpbmUgICBTRF9DTEtfRElWSURFX01BU0sJCTB4QzAKICNkZWZpbmUgU0RfQ0ZHMgkJCQkweEZEQTEKKyNkZWZpbmUgICBTRF9DQUxDVUxBVEVfQ1JDNwkJMHgwMAorI2RlZmluZSAgIFNEX05PX0NBTENVTEFURV9DUkM3CQkweDgwCisjZGVmaW5lICAgU0RfQ0hFQ0tfQ1JDMTYJCTB4MDAKKyNkZWZpbmUgICBTRF9OT19DSEVDS19DUkMxNgkJMHg0MAorI2RlZmluZSAgIFNEX05PX0NIRUNLX1dBSVRfQ1JDX1RPCTB4MjAKKyNkZWZpbmUgICBTRF9XQUlUX0JVU1lfRU5ECQkweDA4CisjZGVmaW5lICAgU0RfTk9fV0FJVF9CVVNZX0VORAkJMHgwMAorI2RlZmluZSAgIFNEX0NIRUNLX0NSQzcJCQkweDAwCisjZGVmaW5lICAgU0RfTk9fQ0hFQ0tfQ1JDNwkJMHgwNAorI2RlZmluZSAgIFNEX1JTUF9MRU5fMAkJCTB4MDAKKyNkZWZpbmUgICBTRF9SU1BfTEVOXzYJCQkweDAxCisjZGVmaW5lICAgU0RfUlNQX0xFTl8xNwkJCTB4MDIKKyNkZWZpbmUgICBTRF9SU1BfVFlQRV9SMAkJMHgwNAorI2RlZmluZSAgIFNEX1JTUF9UWVBFX1IxCQkweDAxCisjZGVmaW5lICAgU0RfUlNQX1RZUEVfUjFiCQkweDA5CisjZGVmaW5lICAgU0RfUlNQX1RZUEVfUjIJCTB4MDIKKyNkZWZpbmUgICBTRF9SU1BfVFlQRV9SMwkJMHgwNQorI2RlZmluZSAgIFNEX1JTUF9UWVBFX1I0CQkweDA1CisjZGVmaW5lICAgU0RfUlNQX1RZUEVfUjUJCTB4MDEKKyNkZWZpbmUgICBTRF9SU1BfVFlQRV9SNgkJMHgwMQorI2RlZmluZSAgIFNEX1JTUF9UWVBFX1I3CQkweDAxCiAjZGVmaW5lIFNEX0NGRzMJCQkJMHhGREEyCisjZGVmaW5lICAgU0RfUlNQXzgwQ0xLX1RJTUVPVVRfRU4JMHgwMQorCiAjZGVmaW5lIFNEX1NUQVQxCQkJMHhGREEzCisjZGVmaW5lICAgU0RfQ1JDN19FUlIJCQkweDgwCisjZGVmaW5lICAgU0RfQ1JDMTZfRVJSCQkJMHg0MAorI2RlZmluZSAgIFNEX0NSQ19XUklURV9FUlIJCTB4MjAKKyNkZWZpbmUgICBTRF9DUkNfV1JJVEVfRVJSX01BU0sJCTB4MUMKKyNkZWZpbmUgICBHRVRfQ1JDX1RJTUVfT1VUCQkweDAyCisjZGVmaW5lICAgU0RfVFVOSU5HX0NPTVBBUkVfRVJSCQkweDAxCiAjZGVmaW5lIFNEX1NUQVQyCQkJMHhGREE0CisjZGVmaW5lICAgU0RfUlNQXzgwQ0xLX1RJTUVPVVQJCTB4MDEKKwogI2RlZmluZSBTRF9CVVNfU1RBVAkJCTB4RkRBNQorI2RlZmluZSAgIFNEX0NMS19UT0dHTEVfRU4JCTB4ODAKKyNkZWZpbmUgICBTRF9DTEtfRk9SQ0VfU1RPUAkJMHg0MAorI2RlZmluZSAgIFNEX0RBVDNfU1RBVFVTCQkweDEwCisjZGVmaW5lICAgU0RfREFUMl9TVEFUVVMJCTB4MDgKKyNkZWZpbmUgICBTRF9EQVQxX1NUQVRVUwkJMHgwNAorI2RlZmluZSAgIFNEX0RBVDBfU1RBVFVTCQkweDAyCisjZGVmaW5lICAgU0RfQ01EX1NUQVRVUwkJCTB4MDEKICNkZWZpbmUgU0RfUEFEX0NUTAkJCTB4RkRBNgorI2RlZmluZSAgIFNEX0lPX1VTSU5HXzFWOAkJMHg4MAorI2RlZmluZSAgIFNEX0lPX1VTSU5HXzNWMwkJMHg3RgorI2RlZmluZSAgIFRZUEVfQV9EUklWSU5HCQkweDAwCisjZGVmaW5lICAgVFlQRV9CX0RSSVZJTkcJCTB4MDEKKyNkZWZpbmUgICBUWVBFX0NfRFJJVklORwkJMHgwMgorI2RlZmluZSAgIFRZUEVfRF9EUklWSU5HCQkweDAzCiAjZGVmaW5lIFNEX1NBTVBMRV9QT0lOVF9DVEwJCTB4RkRBNworI2RlZmluZSAgIEREUl9GSVhfUlhfREFUCQkweDAwCisjZGVmaW5lICAgRERSX1ZBUl9SWF9EQVQJCTB4ODAKKyNkZWZpbmUgICBERFJfRklYX1JYX0RBVF9FREdFCQkweDAwCisjZGVmaW5lICAgRERSX0ZJWF9SWF9EQVRfMTRfREVMQVkJMHg0MAorI2RlZmluZSAgIEREUl9GSVhfUlhfQ01ECQkweDAwCisjZGVmaW5lICAgRERSX1ZBUl9SWF9DTUQJCTB4MjAKKyNkZWZpbmUgICBERFJfRklYX1JYX0NNRF9QT1NfRURHRQkweDAwCisjZGVmaW5lICAgRERSX0ZJWF9SWF9DTURfMTRfREVMQVkJMHgxMAorI2RlZmluZSAgIFNEMjBfUlhfUE9TX0VER0UJCTB4MDAKKyNkZWZpbmUgICBTRDIwX1JYXzE0X0RFTEFZCQkweDA4CisjZGVmaW5lIFNEMjBfUlhfU0VMX01BU0sJCTB4MDgKICNkZWZpbmUgU0RfUFVTSF9QT0lOVF9DVEwJCTB4RkRBOAorI2RlZmluZSAgIEREUl9GSVhfVFhfQ01EX0RBVAkJMHgwMAorI2RlZmluZSAgIEREUl9WQVJfVFhfQ01EX0RBVAkJMHg4MAorI2RlZmluZSAgIEREUl9GSVhfVFhfREFUXzE0X1RTVQkJMHgwMAorI2RlZmluZSAgIEREUl9GSVhfVFhfREFUXzEyX1RTVQkJMHg0MAorI2RlZmluZSAgIEREUl9GSVhfVFhfQ01EX05FR19FREdFCTB4MDAKKyNkZWZpbmUgICBERFJfRklYX1RYX0NNRF8xNF9BSEVBRAkweDIwCisjZGVmaW5lICAgU0QyMF9UWF9ORUdfRURHRQkJMHgwMAorI2RlZmluZSAgIFNEMjBfVFhfMTRfQUhFQUQJCTB4MTAKKyNkZWZpbmUgICBTRDIwX1RYX1NFTF9NQVNLCQkweDEwCisjZGVmaW5lICAgRERSX1ZBUl9TRENMS19QT0xfU1dBUAkweDAxCiAjZGVmaW5lIFNEX0NNRDAJCQkJMHhGREE5CiAjZGVmaW5lICAgU0RfQ01EX1NUQVJUCQkJMHg0MAogI2RlZmluZSBTRF9DTUQxCQkJCTB4RkRBQQpAQCAtNTY5LDYwICsyODgsMjAzIEBACiAjZGVmaW5lIFNEX0JMT0NLX0NOVF9MCQkJMHhGREIxCiAjZGVmaW5lIFNEX0JMT0NLX0NOVF9ICQkJMHhGREIyCiAjZGVmaW5lIFNEX1RSQU5TRkVSCQkJMHhGREIzCisjZGVmaW5lICAgU0RfVFJBTlNGRVJfU1RBUlQJCTB4ODAKKyNkZWZpbmUgICBTRF9UUkFOU0ZFUl9FTkQJCTB4NDAKKyNkZWZpbmUgICBTRF9TVEFUX0lETEUJCQkweDIwCisjZGVmaW5lICAgU0RfVFJBTlNGRVJfRVJSCQkweDEwCisjZGVmaW5lICAgU0RfVE1fTk9STUFMX1dSSVRFCQkweDAwCisjZGVmaW5lICAgU0RfVE1fQVVUT19XUklURV8zCQkweDAxCisjZGVmaW5lICAgU0RfVE1fQVVUT19XUklURV80CQkweDAyCisjZGVmaW5lICAgU0RfVE1fQVVUT19SRUFEXzMJCTB4MDUKKyNkZWZpbmUgICBTRF9UTV9BVVRPX1JFQURfNAkJMHgwNgorI2RlZmluZSAgIFNEX1RNX0NNRF9SU1AJCQkweDA4CisjZGVmaW5lICAgU0RfVE1fQVVUT19XUklURV8xCQkweDA5CisjZGVmaW5lICAgU0RfVE1fQVVUT19XUklURV8yCQkweDBBCisjZGVmaW5lICAgU0RfVE1fTk9STUFMX1JFQUQJCTB4MEMKKyNkZWZpbmUgICBTRF9UTV9BVVRPX1JFQURfMQkJMHgwRAorI2RlZmluZSAgIFNEX1RNX0FVVE9fUkVBRF8yCQkweDBFCisjZGVmaW5lICAgU0RfVE1fQVVUT19UVU5JTkcJCTB4MEYKICNkZWZpbmUgU0RfQ01EX1NUQVRFCQkJMHhGREI1CisjZGVmaW5lICAgU0RfQ01EX0lETEUJCQkweDgwCisKICNkZWZpbmUgU0RfREFUQV9TVEFURQkJCTB4RkRCNgorI2RlZmluZSAgIFNEX0RBVEFfSURMRQkJCTB4ODAKIAogI2RlZmluZSBTUkNUTAkJCQkweEZDMTMKIAotI2RlZmluZQlEQ01fRFJQX0NUTAkJCTB4RkMyMwotI2RlZmluZQlEQ01fRFJQX1RSSUcJCQkweEZDMjQKLSNkZWZpbmUJRENNX0RSUF9DRkcJCQkweEZDMjUKLSNkZWZpbmUJRENNX0RSUF9XUl9EQVRBX0wJCTB4RkMyNgotI2RlZmluZQlEQ01fRFJQX1dSX0RBVEFfSAkJMHhGQzI3Ci0jZGVmaW5lCURDTV9EUlBfUkRfREFUQV9MCQkweEZDMjgKLSNkZWZpbmUJRENNX0RSUF9SRF9EQVRBX0gJCTB4RkMyOQorI2RlZmluZSBEQ01fRFJQX0NUTAkJCTB4RkMyMworI2RlZmluZSAgIERDTV9SRVNFVAkJCTB4MDgKKyNkZWZpbmUgICBEQ01fTE9DS0VECQkJMHgwNAorI2RlZmluZSAgIERDTV8yMDhNCQkJMHgwMAorI2RlZmluZSAgIERDTV9UWAkJCTB4MDEKKyNkZWZpbmUgICBEQ01fUlgJCQkweDAyCisjZGVmaW5lIERDTV9EUlBfVFJJRwkJCTB4RkMyNAorI2RlZmluZSAgIERSUF9TVEFSVAkJCTB4ODAKKyNkZWZpbmUgICBEUlBfRE9ORQkJCTB4NDAKKyNkZWZpbmUgRENNX0RSUF9DRkcJCQkweEZDMjUKKyNkZWZpbmUgICBEUlBfV1JJVEUJCQkweDgwCisjZGVmaW5lICAgRFJQX1JFQUQJCQkweDAwCisjZGVmaW5lICAgRENNX1dSSVRFX0FERFJFU1NfNTAJCTB4NTAKKyNkZWZpbmUgICBEQ01fV1JJVEVfQUREUkVTU181MQkJMHg1MQorI2RlZmluZSAgIERDTV9SRUFEX0FERFJFU1NfMDAJCTB4MDAKKyNkZWZpbmUgICBEQ01fUkVBRF9BRERSRVNTXzUxCQkweDUxCisjZGVmaW5lIERDTV9EUlBfV1JfREFUQV9MCQkweEZDMjYKKyNkZWZpbmUgRENNX0RSUF9XUl9EQVRBX0gJCTB4RkMyNworI2RlZmluZSBEQ01fRFJQX1JEX0RBVEFfTAkJMHhGQzI4CisjZGVmaW5lIERDTV9EUlBfUkRfREFUQV9ICQkweEZDMjkKICNkZWZpbmUgU0RfVlBDTEswX0NUTAkJCTB4RkMyQQogI2RlZmluZSBTRF9WUENMSzFfQ1RMCQkJMHhGQzJCCiAjZGVmaW5lIFNEX0RDTVBTMF9DVEwJCQkweEZDMkMKICNkZWZpbmUgU0RfRENNUFMxX0NUTAkJCTB4RkMyRAogI2RlZmluZSBTRF9WUFRYX0NUTAkJCVNEX1ZQQ0xLMF9DVEwKICNkZWZpbmUgU0RfVlBSWF9DVEwJCQlTRF9WUENMSzFfQ1RMCisjZGVmaW5lICAgUEhBU0VfQ0hBTkdFCQkJMHg4MAorI2RlZmluZSAgIFBIQVNFX05PVF9SRVNFVAkJMHg0MAogI2RlZmluZSBTRF9EQ01QU19UWF9DVEwJCQlTRF9EQ01QUzBfQ1RMCiAjZGVmaW5lIFNEX0RDTVBTX1JYX0NUTAkJCVNEX0RDTVBTMV9DVEwKKyNkZWZpbmUgICBEQ01QU19DSEFOR0UJCQkweDgwCisjZGVmaW5lICAgRENNUFNfQ0hBTkdFX0RPTkUJCTB4NDAKKyNkZWZpbmUgICBEQ01QU19FUlJPUgkJCTB4MjAKKyNkZWZpbmUgICBEQ01QU19DVVJSRU5UX1BIQVNFCQkweDFGCiAjZGVmaW5lIENBUkRfQ0xLX1NPVVJDRQkJCTB4RkMyRQotCisjZGVmaW5lICAgQ1JDX0ZJWF9DTEsJCQkoMHgwMCA8PCAwKQorI2RlZmluZSAgIENSQ19WQVJfQ0xLMAkJCSgweDAxIDw8IDApCisjZGVmaW5lICAgQ1JDX1ZBUl9DTEsxCQkJKDB4MDIgPDwgMCkKKyNkZWZpbmUgICBTRDMwX0ZJWF9DTEsJCQkoMHgwMCA8PCAyKQorI2RlZmluZSAgIFNEMzBfVkFSX0NMSzAJCQkoMHgwMSA8PCAyKQorI2RlZmluZSAgIFNEMzBfVkFSX0NMSzEJCQkoMHgwMiA8PCAyKQorI2RlZmluZSAgIFNBTVBMRV9GSVhfQ0xLCQkoMHgwMCA8PCA0KQorI2RlZmluZSAgIFNBTVBMRV9WQVJfQ0xLMAkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgICBTQU1QTEVfVkFSX0NMSzEJCSgweDAyIDw8IDQpCiAjZGVmaW5lIENBUkRfUFdSX0NUTAkJCTB4RkQ1MAorI2RlZmluZSAgIFBNT1NfU1RSR19NQVNLCQkweDEwCisjZGVmaW5lICAgUE1PU19TVFJHXzgwMG1BCQkweDEwCisjZGVmaW5lICAgUE1PU19TVFJHXzQwMG1BCQkweDAwCisjZGVmaW5lICAgU0RfUE9XRVJfT0ZGCQkJMHgwMworI2RlZmluZSAgIFNEX1BBUlRJQUxfUE9XRVJfT04JCTB4MDEKKyNkZWZpbmUgICBTRF9QT1dFUl9PTgkJCTB4MDAKKyNkZWZpbmUgICBTRF9QT1dFUl9NQVNLCQkJMHgwMworI2RlZmluZSAgIE1TX1BPV0VSX09GRgkJCTB4MEMKKyNkZWZpbmUgICBNU19QQVJUSUFMX1BPV0VSX09OCQkweDA0CisjZGVmaW5lICAgTVNfUE9XRVJfT04JCQkweDAwCisjZGVmaW5lICAgTVNfUE9XRVJfTUFTSwkJCTB4MEMKKyNkZWZpbmUgICBCUFBfUE9XRVJfT0ZGCQkJMHgwRgorI2RlZmluZSAgIEJQUF9QT1dFUl81X1BFUkNFTlRfT04JMHgwRQorI2RlZmluZSAgIEJQUF9QT1dFUl8xMF9QRVJDRU5UX09OCTB4MEMKKyNkZWZpbmUgICBCUFBfUE9XRVJfMTVfUEVSQ0VOVF9PTgkweDA4CisjZGVmaW5lICAgQlBQX1BPV0VSX09OCQkJMHgwMAorI2RlZmluZSAgIEJQUF9QT1dFUl9NQVNLCQkweDBGCisjZGVmaW5lICAgU0RfVkNDX1BBUlRJQUxfUE9XRVJfT04JMHgwMgorI2RlZmluZSAgIFNEX1ZDQ19QT1dFUl9PTgkJMHgwMAogI2RlZmluZSBDQVJEX0NMS19TV0lUQ0gJCQkweEZENTEKICNkZWZpbmUgUlRMODQxMUJfUEFDS0FHRV9NT0RFCQkweEZENTEKICNkZWZpbmUgQ0FSRF9TSEFSRV9NT0RFCQkJMHhGRDUyCisjZGVmaW5lICAgQ0FSRF9TSEFSRV9NQVNLCQkweDBGCisjZGVmaW5lICAgQ0FSRF9TSEFSRV9NVUxUSV9MVU4JCTB4MDAKKyNkZWZpbmUgICBDQVJEX1NIQVJFX05PUk1BTAkJMHgwMAorI2RlZmluZSAgIENBUkRfU0hBUkVfNDhfU0QJCTB4MDQKKyNkZWZpbmUgICBDQVJEX1NIQVJFXzQ4X01TCQkweDA4CisjZGVmaW5lICAgQ0FSRF9TSEFSRV9CQVJPU1NBX1NECQkweDAxCisjZGVmaW5lICAgQ0FSRF9TSEFSRV9CQVJPU1NBX01TCQkweDAyCiAjZGVmaW5lIENBUkRfRFJJVkVfU0VMCQkJMHhGRDUzCisjZGVmaW5lICAgTVNfRFJJVkVfOG1BCQkJKDB4MDEgPDwgNikKKyNkZWZpbmUgICBNTUNfRFJJVkVfOG1BCQkJKDB4MDEgPDwgNCkKKyNkZWZpbmUgICBYRF9EUklWRV84bUEJCQkoMHgwMSA8PCAyKQorI2RlZmluZSAgIEdQSU9fRFJJVkVfOG1BCQkweDAxCisjZGVmaW5lIFJUUzUyMDlfQ0FSRF9EUklWRV9ERUZBVUxUCShNU19EUklWRV84bUEgfCBNTUNfRFJJVkVfOG1BIHxcCisJCQkJCVhEX0RSSVZFXzhtQSB8IEdQSU9fRFJJVkVfOG1BKQorI2RlZmluZSBSVEw4NDExX0NBUkRfRFJJVkVfREVGQVVMVAkoTVNfRFJJVkVfOG1BIHwgTU1DX0RSSVZFXzhtQSB8XAorCQkJCQlYRF9EUklWRV84bUEpCisjZGVmaW5lIFJUU1hfQ0FSRF9EUklWRV9ERUZBVUxUCQkoTVNfRFJJVkVfOG1BIHwgR1BJT19EUklWRV84bUEpCisKICNkZWZpbmUgQ0FSRF9TVE9QCQkJMHhGRDU0CisjZGVmaW5lICAgU1BJX1NUT1AJCQkweDAxCisjZGVmaW5lICAgWERfU1RPUAkJCTB4MDIKKyNkZWZpbmUgICBTRF9TVE9QCQkJMHgwNAorI2RlZmluZSAgIE1TX1NUT1AJCQkweDA4CisjZGVmaW5lICAgU1BJX0NMUl9FUlIJCQkweDEwCisjZGVmaW5lICAgWERfQ0xSX0VSUgkJCTB4MjAKKyNkZWZpbmUgICBTRF9DTFJfRVJSCQkJMHg0MAorI2RlZmluZSAgIE1TX0NMUl9FUlIJCQkweDgwCiAjZGVmaW5lIENBUkRfT0UJCQkJMHhGRDU1CisjZGVmaW5lICAgU0RfT1VUUFVUX0VOCQkJMHgwNAorI2RlZmluZSAgIE1TX09VVFBVVF9FTgkJCTB4MDgKICNkZWZpbmUgQ0FSRF9BVVRPX0JMSU5LCQkJMHhGRDU2CiAjZGVmaW5lIENBUkRfR1BJT19ESVIJCQkweEZENTcKICNkZWZpbmUgQ0FSRF9HUElPCQkJMHhGRDU4CiAjZGVmaW5lIENBUkRfREFUQV9TT1VSQ0UJCTB4RkQ1QgorI2RlZmluZSAgIFBJTkdQT05HX0JVRkZFUgkJMHgwMQorI2RlZmluZSAgIFJJTkdfQlVGRkVSCQkJMHgwMAogI2RlZmluZSBTRDMwX0NMS19EUklWRV9TRUwJCTB4RkQ1QQorI2RlZmluZSAgIERSSVZFUl9UWVBFX0EJCQkweDA1CisjZGVmaW5lICAgRFJJVkVSX1RZUEVfQgkJCTB4MDMKKyNkZWZpbmUgICBEUklWRVJfVFlQRV9DCQkJMHgwMgorI2RlZmluZSAgIERSSVZFUl9UWVBFX0QJCQkweDAxCiAjZGVmaW5lIENBUkRfU0VMRUNUCQkJMHhGRDVDCisjZGVmaW5lICAgU0RfTU9EX1NFTAkJCTIKKyNkZWZpbmUgICBNU19NT0RfU0VMCQkJMwogI2RlZmluZSBTRDMwX0RSSVZFX1NFTAkJCTB4RkQ1RQorI2RlZmluZSAgIENGR19EUklWRVJfVFlQRV9BCQkweDAyCisjZGVmaW5lICAgQ0ZHX0RSSVZFUl9UWVBFX0IJCTB4MDMKKyNkZWZpbmUgICBDRkdfRFJJVkVSX1RZUEVfQwkJMHgwMQorI2RlZmluZSAgIENGR19EUklWRVJfVFlQRV9ECQkweDAwCiAjZGVmaW5lIFNEMzBfQ01EX0RSSVZFX1NFTAkJMHhGRDVFCiAjZGVmaW5lIFNEMzBfREFUX0RSSVZFX1NFTAkJMHhGRDVGCiAjZGVmaW5lIENBUkRfQ0xLX0VOCQkJMHhGRDY5CisjZGVmaW5lICAgU0RfQ0xLX0VOCQkJMHgwNAorI2RlZmluZSAgIE1TX0NMS19FTgkJCTB4MDgKICNkZWZpbmUgU0RJT19DVFJMCQkJMHhGRDZCCiAjZGVmaW5lIENEX1BBRF9DVEwJCQkweEZENzMKLQorI2RlZmluZSAgIENEX0RJU0FCTEVfTUFTSwkJMHgwNworI2RlZmluZSAgIE1TX0NEX0RJU0FCTEUJCQkweDA0CisjZGVmaW5lICAgU0RfQ0RfRElTQUJMRQkJCTB4MDIKKyNkZWZpbmUgICBYRF9DRF9ESVNBQkxFCQkJMHgwMQorI2RlZmluZSAgIENEX0RJU0FCTEUJCQkweDA3CisjZGVmaW5lICAgQ0RfRU5BQkxFCQkJMHgwMAorI2RlZmluZSAgIE1TX0NEX0VOX09OTFkJCQkweDAzCisjZGVmaW5lICAgU0RfQ0RfRU5fT05MWQkJCTB4MDUKKyNkZWZpbmUgICBYRF9DRF9FTl9PTkxZCQkJMHgwNgorI2RlZmluZSAgIEZPUkNFX0NEX0xPV19NQVNLCQkweDM4CisjZGVmaW5lICAgRk9SQ0VfQ0RfWERfTE9XCQkweDA4CisjZGVmaW5lICAgRk9SQ0VfQ0RfU0RfTE9XCQkweDEwCisjZGVmaW5lICAgRk9SQ0VfQ0RfTVNfTE9XCQkweDIwCisjZGVmaW5lICAgQ0RfQVVUT19ESVNBQkxFCQkweDQwCiAjZGVmaW5lIEZQRENUTAkJCQkweEZDMDAKKyNkZWZpbmUgICBTU0NfUE9XRVJfRE9XTgkJMHgwMQorI2RlZmluZSAgIFNEX09DX1BPV0VSX0RPV04JCTB4MDIKKyNkZWZpbmUgICBBTExfUE9XRVJfRE9XTgkJMHgwNworI2RlZmluZSAgIE9DX1BPV0VSX0RPV04JCQkweDA2CiAjZGVmaW5lIFBESU5GTwkJCQkweEZDMDEKIAogI2RlZmluZSBDTEtfQ1RMCQkJCTB4RkMwMgorI2RlZmluZSAgIENIQU5HRV9DTEsJCQkweDAxCisjZGVmaW5lICAgQ0xLX0xPV19GUkVRCQkJMHgwMQorCiAjZGVmaW5lIENMS19ESVYJCQkJMHhGQzAzCisjZGVmaW5lICAgQ0xLX0RJVl8xCQkJMHgwMQorI2RlZmluZSAgIENMS19ESVZfMgkJCTB4MDIKKyNkZWZpbmUgICBDTEtfRElWXzQJCQkweDAzCisjZGVmaW5lICAgQ0xLX0RJVl84CQkJMHgwNAogI2RlZmluZSBDTEtfU0VMCQkJCTB4RkMwNAogCiAjZGVmaW5lIFNTQ19ESVZfTl8wCQkJMHhGQzBGCiAjZGVmaW5lIFNTQ19ESVZfTl8xCQkJMHhGQzEwCiAjZGVmaW5lIFNTQ19DVEwxCQkJMHhGQzExCisjZGVmaW5lICAgIFNTQ19SU1RCCQkJMHg4MAorI2RlZmluZSAgICBTU0NfOFhfRU4JCQkweDQwCisjZGVmaW5lICAgIFNTQ19GSVhfRlJBQwkJCTB4MjAKKyNkZWZpbmUgICAgU1NDX1NFTF8xTQkJCTB4MDAKKyNkZWZpbmUgICAgU1NDX1NFTF8yTQkJCTB4MDgKKyNkZWZpbmUgICAgU1NDX1NFTF80TQkJCTB4MTAKKyNkZWZpbmUgICAgU1NDX1NFTF84TQkJCTB4MTgKICNkZWZpbmUgU1NDX0NUTDIJCQkweEZDMTIKLQorI2RlZmluZSAgICBTU0NfREVQVEhfTUFTSwkJMHgwNworI2RlZmluZSAgICBTU0NfREVQVEhfRElTQUxCRQkJMHgwMAorI2RlZmluZSAgICBTU0NfREVQVEhfNE0JCQkweDAxCisjZGVmaW5lICAgIFNTQ19ERVBUSF8yTQkJCTB4MDIKKyNkZWZpbmUgICAgU1NDX0RFUFRIXzFNCQkJMHgwMworI2RlZmluZSAgICBTU0NfREVQVEhfNTAwSwkJMHgwNAorI2RlZmluZSAgICBTU0NfREVQVEhfMjUwSwkJMHgwNQogI2RlZmluZSBSQ0NUTAkJCQkweEZDMTQKIAogI2RlZmluZSBGUEdBX1BVTExfQ1RMCQkJMHhGQzFECkBAIC02MzAsNiArNDkyLDI0IEBACiAjZGVmaW5lIEdQSU9fQ1RMCQkJMHhGQzFGCiAKICNkZWZpbmUgTERPX0NUTAkJCQkweEZDMUUKKyNkZWZpbmUgICBCUFBfQVNJQ18xVjcJCQkweDAwCisjZGVmaW5lICAgQlBQX0FTSUNfMVY4CQkJMHgwMQorI2RlZmluZSAgIEJQUF9BU0lDXzFWOQkJCTB4MDIKKyNkZWZpbmUgICBCUFBfQVNJQ18yVjAJCQkweDAzCisjZGVmaW5lICAgQlBQX0FTSUNfMlY3CQkJMHgwNAorI2RlZmluZSAgIEJQUF9BU0lDXzJWOAkJCTB4MDUKKyNkZWZpbmUgICBCUFBfQVNJQ18zVjIJCQkweDA2CisjZGVmaW5lICAgQlBQX0FTSUNfM1YzCQkJMHgwNworI2RlZmluZSAgIEJQUF9SRUdfVFVORUQxOAkJMHgwNworI2RlZmluZSAgIEJQUF9UVU5FRDE4X1NISUZUXzg0MDIJNQorI2RlZmluZSAgIEJQUF9UVU5FRDE4X1NISUZUXzg0MTEJNAorI2RlZmluZSAgIEJQUF9QQURfTUFTSwkJCTB4MDQKKyNkZWZpbmUgICBCUFBfUEFEXzNWMwkJCTB4MDQKKyNkZWZpbmUgICBCUFBfUEFEXzFWOAkJCTB4MDAKKyNkZWZpbmUgICBCUFBfTERPX1BPV0IJCQkweDAzCisjZGVmaW5lICAgQlBQX0xET19PTgkJCTB4MDAKKyNkZWZpbmUgICBCUFBfTERPX1NVU1BFTkQJCTB4MDIKKyNkZWZpbmUgICBCUFBfTERPX09GRgkJCTB4MDMKICNkZWZpbmUgU1lTX1ZFUgkJCQkweEZDMzIKIAogI2RlZmluZSBDQVJEX1BVTExfQ1RMMQkJCTB4RkQ2MApAQCAtNjQyLDYgKzUyMiwxMCBAQAogLyogUENJIEV4cHJlc3MgUmVsYXRlZCBSZWdpc3RlcnMgKi8KICNkZWZpbmUgSVJRRU4wCQkJCTB4RkUyMAogI2RlZmluZSBJUlFTVEFUMAkJCTB4RkUyMQorI2RlZmluZSAgICBETUFfRE9ORV9JTlQJCQkweDgwCisjZGVmaW5lICAgIFNVU1BFTkRfSU5UCQkJMHg0MAorI2RlZmluZSAgICBMSU5LX1JEWV9JTlQJCQkweDIwCisjZGVmaW5lICAgIExJTktfRE9XTl9JTlQJCTB4MTAKICNkZWZpbmUgSVJRRU4xCQkJCTB4RkUyMgogI2RlZmluZSBJUlFTVEFUMQkJCTB4RkUyMwogI2RlZmluZSBUTFBSSUVOCQkJCTB4RkUyNApAQCAtNjUzLDYgKzUzNywxNiBAQAogI2RlZmluZSBETUFUQzIJCQkJMHhGRTJBCiAjZGVmaW5lIERNQVRDMwkJCQkweEZFMkIKICNkZWZpbmUgRE1BQ1RMCQkJCTB4RkUyQworI2RlZmluZSAgIERNQV9SU1QJCQkweDgwCisjZGVmaW5lICAgRE1BX0JVU1kJCQkweDA0CisjZGVmaW5lICAgRE1BX0RJUl9UT19DQVJECQkweDAwCisjZGVmaW5lICAgRE1BX0RJUl9GUk9NX0NBUkQJCTB4MDIKKyNkZWZpbmUgICBETUFfRU4JCQkweDAxCisjZGVmaW5lICAgRE1BXzEyOAkJCSgwIDw8IDQpCisjZGVmaW5lICAgRE1BXzI1NgkJCSgxIDw8IDQpCisjZGVmaW5lICAgRE1BXzUxMgkJCSgyIDw8IDQpCisjZGVmaW5lICAgRE1BXzEwMjQJCQkoMyA8PCA0KQorI2RlZmluZSAgIERNQV9QQUNLX1NJWkVfTUFTSwkJMHgzMAogI2RlZmluZSBCQ1RMCQkJCTB4RkUyRAogI2RlZmluZSBSQkJDMAkJCQkweEZFMkUKICNkZWZpbmUgUkJCQzEJCQkJMHhGRTJGCkBAIC02NzgsMTQgKzU3MiwyMSBAQAogI2RlZmluZSBNU0dUWERBVEEyCQkJMHhGRTQ2CiAjZGVmaW5lIE1TR1RYREFUQTMJCQkweEZFNDcKICNkZWZpbmUgTVNHVFhDVEwJCQkweEZFNDgKLSNkZWZpbmUgUEVUWENGRwkJCQkweEZFNDkKICNkZWZpbmUgTFRSX0NUTAkJCQkweEZFNEEKICNkZWZpbmUgT0JGRl9DRkcJCQkweEZFNEMKIAogI2RlZmluZSBDRFJFU1VNRUNUTAkJCTB4RkU1MgogI2RlZmluZSBXQUtFX1NFTF9DVEwJCQkweEZFNTQKKyNkZWZpbmUgUENMS19DVEwJCQkweEZFNTUKKyNkZWZpbmUgICBQQ0xLX01PREVfU0VMCQkJMHgyMAogI2RlZmluZSBQTUVfRk9SQ0VfQ1RMCQkJMHhGRTU2CisKICNkZWZpbmUgQVNQTV9GT1JDRV9DVEwJCQkweEZFNTcKKyNkZWZpbmUgICBGT1JDRV9BU1BNX0NUTDAJCTB4MTAKKyNkZWZpbmUgICBGT1JDRV9BU1BNX1ZBTF9NQVNLCQkweDAzCisjZGVmaW5lICAgRk9SQ0VfQVNQTV9MMV9FTgkJMHgwMgorI2RlZmluZSAgIEZPUkNFX0FTUE1fTDBfRU4JCTB4MDEKKyNkZWZpbmUgICBGT1JDRV9BU1BNX05PX0FTUE0JCTB4MDAKICNkZWZpbmUgUE1fQ0xLX0ZPUkNFX0NUTAkJMHhGRTU4CiAjZGVmaW5lIEZVTkNfRk9SQ0VfQ1RMCQkJMHhGRTU5CiAjZGVmaW5lIFBFUlNUX0dMSVRDSF9XSURUSAkJMHhGRTVDCkBAIC02OTMsMTkgKzU5NCwzNiBAQAogI2RlZmluZSBSRVNFVF9MT0FEX1JFRwkJCTB4RkU1RQogI2RlZmluZSBFRlVTRV9DT05URU5UCQkJMHhGRTVGCiAjZGVmaW5lIEhPU1RfU0xFRVBfU1RBVEUJCTB4RkU2MAotI2RlZmluZSBTRElPX0NGRwkJCTB4RkU3MAorI2RlZmluZSAgIEhPU1RfRU5URVJfUzEJCQkxCisjZGVmaW5lICAgSE9TVF9FTlRFUl9TMwkJCTIKIAorI2RlZmluZSBTRElPX0NGRwkJCTB4RkU3MAorI2RlZmluZSBQTV9FVkVOVF9ERUJVRwkJCTB4RkU3MQorI2RlZmluZSAgIFBNRV9ERUJVR18wCQkJMHgwOAogI2RlZmluZSBORlRTX1RYX0NUUkwJCQkweEZFNzIKIAogI2RlZmluZSBQV1JfR0FURV9DVFJMCQkJMHhGRTc1CisjZGVmaW5lICAgUFdSX0dBVEVfRU4JCQkweDAxCisjZGVmaW5lICAgTERPMzMxOF9QV1JfTUFTSwkJMHgwNgorI2RlZmluZSAgIExET19PTgkJCTB4MDAKKyNkZWZpbmUgICBMRE9fU1VTUEVORAkJCTB4MDQKKyNkZWZpbmUgICBMRE9fT0ZGCQkJMHgwNgogI2RlZmluZSBQV0RfU1VTUEVORF9FTgkJCTB4RkU3NgogI2RlZmluZSBMRE9fUFdSX1NFTAkJCTB4RkU3OAogCisjZGVmaW5lIEwxU1VCX0NPTkZJRzEJCQkweEZFOEQKKyNkZWZpbmUgTDFTVUJfQ09ORklHMgkJCTB4RkU4RQorI2RlZmluZSAgIEwxU1VCX0FVVE9fQ0ZHCQkweDAyCisjZGVmaW5lIEwxU1VCX0NPTkZJRzMJCQkweEZFOEYKKwogI2RlZmluZSBEVU1NWV9SRUdfUkVTRVRfMAkJMHhGRTkwCiAKICNkZWZpbmUgQVVUT0xPQURfQ0ZHX0JBU0UJCTB4RkYwMAorI2RlZmluZSBQRVRYQ0ZHCQkJCTB4RkYwMwogCiAjZGVmaW5lIFBNX0NUUkwxCQkJMHhGRjQ0CisjZGVmaW5lICAgQ0RfUkVTVU1FX0VOX01BU0sJCTB4RjAKKwogI2RlZmluZSBQTV9DVFJMMgkJCTB4RkY0NQogI2RlZmluZSBQTV9DVFJMMwkJCTB4RkY0NgogI2RlZmluZSAgIFNESU9fU0VORF9QTUVfRU4JCTB4ODAKQEAgLTcyNiwxOCArNjQ0LDEyNSBAQAogI2RlZmluZSBJTUFHRV9GTEFHX0FERFIwCQkweENFODAKICNkZWZpbmUgSU1BR0VfRkxBR19BRERSMQkJMHhDRTgxCiAKKyNkZWZpbmUgUlJFRl9DRkcJCQkweEZGNkMKKyNkZWZpbmUgICBSUkVGX1ZCR1NFTF9NQVNLCQkweDM4CisjZGVmaW5lICAgUlJFRl9WQkdTRUxfMVYyNQkJMHgyOAorCisjZGVmaW5lIE9PQlNfQ09ORklHCQkJMHhGRjZFCisjZGVmaW5lICAgT09CU19BVVRPS19ESVMJCTB4ODAKKyNkZWZpbmUgICBPT0JTX1ZBTF9NQVNLCQkJMHgxRgorCisjZGVmaW5lIExET19EVjE4X0NGRwkJCTB4RkY3MAorI2RlZmluZSAgIExET19EVjE4X1NSX01BU0sJCTB4QzAKKyNkZWZpbmUgICBMRE9fRFYxOF9TUl9ERgkJMHg0MAorCisjZGVmaW5lIExET19DT05GSUcyCQkJMHhGRjcxCisjZGVmaW5lICAgTERPX0QzMzE4X01BU0sJCTB4MDcKKyNkZWZpbmUgICBMRE9fRDMzMThfMzNWCQkJMHgwNworI2RlZmluZSAgIExET19EMzMxOF8xOFYJCQkweDAyCisKKyNkZWZpbmUgTERPX1ZDQ19DRkcwCQkJMHhGRjcyCisjZGVmaW5lICAgTERPX1ZDQ19MTVRWVEhfTUFTSwkJMHgzMAorI2RlZmluZSAgIExET19WQ0NfTE1UVlRIXzJBCQkweDEwCisKKyNkZWZpbmUgTERPX1ZDQ19DRkcxCQkJMHhGRjczCisjZGVmaW5lICAgTERPX1ZDQ19SRUZfVFVORV9NQVNLCQkweDMwCisjZGVmaW5lICAgTERPX1ZDQ19SRUZfMVYyCQkweDIwCisjZGVmaW5lICAgTERPX1ZDQ19UVU5FX01BU0sJCTB4MDcKKyNkZWZpbmUgICBMRE9fVkNDXzFWOAkJCTB4MDQKKyNkZWZpbmUgICBMRE9fVkNDXzNWMwkJCTB4MDcKKyNkZWZpbmUgICBMRE9fVkNDX0xNVF9FTgkJMHgwOAorCisjZGVmaW5lIExET19WSU9fQ0ZHCQkJMHhGRjc1CisjZGVmaW5lICAgTERPX1ZJT19TUl9NQVNLCQkweEMwCisjZGVmaW5lICAgTERPX1ZJT19TUl9ERgkJCTB4NDAKKyNkZWZpbmUgICBMRE9fVklPX1JFRl9UVU5FX01BU0sJCTB4MzAKKyNkZWZpbmUgICBMRE9fVklPX1JFRl8xVjIJCTB4MjAKKyNkZWZpbmUgICBMRE9fVklPX1RVTkVfTUFTSwkJMHgwNworI2RlZmluZSAgIExET19WSU9fMVY3CQkJMHgwMworI2RlZmluZSAgIExET19WSU9fMVY4CQkJMHgwNAorI2RlZmluZSAgIExET19WSU9fM1YzCQkJMHgwNworCisjZGVmaW5lIExET19EVjEyU19DRkcJCQkweEZGNzYKKyNkZWZpbmUgICBMRE9fUkVGMTJfVFVORV9NQVNLCQkweDE4CisjZGVmaW5lICAgTERPX1JFRjEyX1RVTkVfREYJCTB4MTAKKyNkZWZpbmUgICBMRE9fRDEyX1RVTkVfTUFTSwkJMHgwNworI2RlZmluZSAgIExET19EMTJfVFVORV9ERgkJMHgwNAorCisjZGVmaW5lIExET19BVjEyU19DRkcJCQkweEZGNzcKKyNkZWZpbmUgICBMRE9fQVYxMlNfVFVORV9NQVNLCQkweDA3CisjZGVmaW5lICAgTERPX0FWMTJTX1RVTkVfREYJCTB4MDQKKworI2RlZmluZSBTRDQwX0xET19DVEwxCQkJMHhGRTdECisjZGVmaW5lICAgU0Q0MF9WSU9fVFVORV9NQVNLCQkweDcwCisjZGVmaW5lICAgU0Q0MF9WSU9fVFVORV8xVjcJCTB4MzAKKyNkZWZpbmUgICBTRF9WSU9fTERPXzFWOAkJMHg0MAorI2RlZmluZSAgIFNEX1ZJT19MRE9fM1YzCQkweDcwCisKIC8qIFBoeSByZWdpc3RlciAqLwogI2RlZmluZSBQSFlfUENSCQkJCTB4MDAKKyNkZWZpbmUgICBQSFlfUENSX0ZPUkNFX0NPREUJCTB4QjAwMAorI2RlZmluZSAgIFBIWV9QQ1JfT09CU19DQUxJXzUwCQkweDA4MDAKKyNkZWZpbmUgICBQSFlfUENSX09PQlNfVkNNXzA4CQkweDAyMDAKKyNkZWZpbmUgICBQSFlfUENSX09PQlNfU0VOXzkwCQkweDAwNDAKKyNkZWZpbmUgICBQSFlfUENSX1JTU0lfRU4JCTB4MDAwMgorI2RlZmluZSAgIFBIWV9QQ1JfUlgxMEsJCQkweDAwMDEKKwogI2RlZmluZSBQSFlfUkNSMAkJCTB4MDEKICNkZWZpbmUgUEhZX1JDUjEJCQkweDAyCisjZGVmaW5lICAgUEhZX1JDUjFfQURQX1RJTUVfNAkJMHgwNDAwCisjZGVmaW5lICAgUEhZX1JDUjFfVkNPX0NPQVJTRQkJMHgwMDFGCisjZGVmaW5lIFBIWV9TU0NDUjIJCQkweDAyCisjZGVmaW5lICAgUEhZX1NTQ0NSMl9QTExfTkNPREUJCTB4MEEwMAorI2RlZmluZSAgIFBIWV9TU0NDUjJfVElNRTAJCTB4MDAxQworI2RlZmluZSAgIFBIWV9TU0NDUjJfVElNRTJfV0lEVEgJMHgwMDAzCisKICNkZWZpbmUgUEhZX1JDUjIJCQkweDAzCisjZGVmaW5lICAgUEhZX1JDUjJfRU1QSEFTRV9FTgkJMHg4MDAwCisjZGVmaW5lICAgUEhZX1JDUjJfTkFESlIJCTB4NDAwMAorI2RlZmluZSAgIFBIWV9SQ1IyX0NEUl9TUl8yCQkweDAxMDAKKyNkZWZpbmUgICBQSFlfUkNSMl9GUkVRU0VMXzEyCQkweDAwNDAKKyNkZWZpbmUgICBQSFlfUkNSMl9DRFJfU0NfMTJQCQkweDAwMTAKKyNkZWZpbmUgICBQSFlfUkNSMl9DQUxJQl9MQVRFCQkweDAwMDIKKyNkZWZpbmUgUEhZX1NTQ0NSMwkJCTB4MDMKKyNkZWZpbmUgICBQSFlfU1NDQ1IzX1NURVBfSU4JCTB4Mjc0MAorI2RlZmluZSAgIFBIWV9TU0NDUjNfQ0hFQ0tfREVMQVkJMHgwMDA4CisjZGVmaW5lIF9QSFlfQU5BMDMJCQkweDAzCisjZGVmaW5lICAgX1BIWV9BTkEwM19USU1FUl9NQVgJCTB4MjcwMAorI2RlZmluZSAgIF9QSFlfQU5BMDNfT09CU19ERUJfRU4JMHgwMDQwCisjZGVmaW5lICAgX1BIWV9DTVVfREVCVUdfRU4JCTB4MDAwOAorCiAjZGVmaW5lIFBIWV9SVENSCQkJMHgwNAogI2RlZmluZSBQSFlfUkRSCQkJCTB4MDUKKyNkZWZpbmUgICBQSFlfUkRSX1JYRFNFTF8xXzkJCTB4NDAwMAorI2RlZmluZSAgIFBIWV9TU0NfQVVUT19QV0QJCTB4MDYwMAogI2RlZmluZSBQSFlfVENSMAkJCTB4MDYKICNkZWZpbmUgUEhZX1RDUjEJCQkweDA3CiAjZGVmaW5lIFBIWV9UVU5FCQkJMHgwOAorI2RlZmluZSAgIFBIWV9UVU5FX1RVTkVSRUZfMV8wCQkweDQwMDAKKyNkZWZpbmUgICBQSFlfVFVORV9WQkdTRUxfMTI1MgkJMHgwQzAwCisjZGVmaW5lICAgUEhZX1RVTkVfU0RCVVNfMzMJCTB4MDIwMAorI2RlZmluZSAgIFBIWV9UVU5FX1RVTkVEMTgJCTB4MDFDMAorI2RlZmluZSAgIFBIWV9UVU5FX1RVTkVEMTIJCTBYMDAyMAorI2RlZmluZSAgIFBIWV9UVU5FX1RVTkVBMTIJCTB4MDAwNAorI2RlZmluZSAgIFBIWV9UVU5FX1ZPTFRBR0VfTUFTSwkJMHhGQzNGCisjZGVmaW5lICAgUEhZX1RVTkVfVk9MVEFHRV8zVjMJCTB4MDNDMAorI2RlZmluZSAgIFBIWV9UVU5FX0QxOF8xVjgJCTB4MDEwMAorI2RlZmluZSAgIFBIWV9UVU5FX0QxOF8xVjcJCTB4MDA4MAorI2RlZmluZSBQSFlfQU5BMDgJCQkweDA4CisjZGVmaW5lICAgUEhZX0FOQTA4X1JYX0VRX0RDR0FJTgkweDUwMDAKKyNkZWZpbmUgICBQSFlfQU5BMDhfU0VMX1JYX0VOCQkweDA0MDAKKyNkZWZpbmUgICBQSFlfQU5BMDhfUlhfRVFfVkFMCQkweDAzQzAKKyNkZWZpbmUgICBQSFlfQU5BMDhfU0NQCQkJMHgwMDIwCisjZGVmaW5lICAgUEhZX0FOQTA4X1NFTF9JUEkJCTB4MDAwNAorCiAjZGVmaW5lIFBIWV9JTVIJCQkJMHgwOQogI2RlZmluZSBQSFlfQlBDUgkJCTB4MEEKKyNkZWZpbmUgICBQSFlfQlBDUl9JQlJYU0VMCQkweDA0MDAKKyNkZWZpbmUgICBQSFlfQlBDUl9JQlRYU0VMCQkweDAxMDAKKyNkZWZpbmUgICBQSFlfQlBDUl9JQl9GSUxURVIJCTB4MDA4MAorI2RlZmluZSAgIFBIWV9CUENSX0NNSVJST1JfRU4JCTB4MDA0MAorCiAjZGVmaW5lIFBIWV9CSVNUCQkJMHgwQgogI2RlZmluZSBQSFlfUkFXX0wJCQkweDBDCiAjZGVmaW5lIFBIWV9SQVdfSAkJCTB4MEQKQEAgLTc0NSw2ICs3NzAsNyBAQAogI2RlZmluZSBQSFlfSE9TVF9DTEtfQ1RSTAkJMHgwRgogI2RlZmluZSBQSFlfRE1SCQkJCTB4MTAKICNkZWZpbmUgUEhZX0JBQ1IJCQkweDExCisjZGVmaW5lICAgUEhZX0JBQ1JfQkFTSUNfTUFTSwkJMHhGRkYzCiAjZGVmaW5lIFBIWV9JRVIJCQkJMHgxMgogI2RlZmluZSBQSFlfQkNTUgkJCTB4MTMKICNkZWZpbmUgUEhZX0JQUgkJCQkweDE0CkBAIC03NTIsODAgKzc3OCw3MCBAQAogI2RlZmluZSBQSFlfQlBOUgkJCTB4MTYKICNkZWZpbmUgUEhZX0JSTlIyCQkJMHgxNwogI2RlZmluZSBQSFlfQkVOUgkJCTB4MTgKLSNkZWZpbmUgUEhZX1JFR19SRVYJCQkweDE5CisjZGVmaW5lIFBIWV9SRVYJCQkJMHgxOQorI2RlZmluZSAgIFBIWV9SRVZfUkVTVgkJCTB4RTAwMAorI2RlZmluZSAgIFBIWV9SRVZfUlhJRExFX0xBVENIRUQJMHgxMDAwCisjZGVmaW5lICAgUEhZX1JFVl9QMV9FTgkJCTB4MDgwMAorI2RlZmluZSAgIFBIWV9SRVZfUlhJRExFX0VOCQkweDA0MDAKKyNkZWZpbmUgICBQSFlfUkVWX0NMS1JFUV9UWF9FTgkJMHgwMjAwCisjZGVmaW5lICAgUEhZX1JFVl9DTEtSRVFfUlhfRU4JCTB4MDEwMAorI2RlZmluZSAgIFBIWV9SRVZfQ0xLUkVRX0RUXzFfMAkJMHgwMDQwCisjZGVmaW5lICAgUEhZX1JFVl9TVE9QX0NMS1JECQkweDAwMjAKKyNkZWZpbmUgICBQSFlfUkVWX1JYX1BXU1QJCTB4MDAwOAorI2RlZmluZSAgIFBIWV9SRVZfU1RPUF9DTEtXUgkJMHgwMDA0CisjZGVmaW5lIF9QSFlfUkVWMAkJCTB4MTkKKyNkZWZpbmUgICBfUEhZX1JFVjBfRklMVEVSX09VVAkJMHgzODAwCisjZGVmaW5lICAgX1BIWV9SRVYwX0NEUl9CWVBBU1NfUEZECTB4MDEwMAorI2RlZmluZSAgIF9QSFlfUkVWMF9DRFJfUlhfSURMRV9CWVBBU1MJMHgwMDAyCisKICNkZWZpbmUgUEhZX0ZMRDAJCQkweDFBCisjZGVmaW5lIFBIWV9BTkExQQkJCTB4MUEKKyNkZWZpbmUgICBQSFlfQU5BMUFfVFhSX0xPT1BCQUNLCTB4MjAwMAorI2RlZmluZSAgIFBIWV9BTkExQV9SWFRfQklTVAkJMHgwNTAwCisjZGVmaW5lICAgUEhZX0FOQTFBX1RYUl9CSVNUCQkweDAwNDAKKyNkZWZpbmUgICBQSFlfQU5BMUFfUkVWCQkJMHgwMDA2CiAjZGVmaW5lIFBIWV9GTEQxCQkJMHgxQgogI2RlZmluZSBQSFlfRkxEMgkJCTB4MUMKICNkZWZpbmUgUEhZX0ZMRDMJCQkweDFECi0jZGVmaW5lIFBIWV9GTEQ0CQkJMHgxRQotI2RlZmluZSBQSFlfRFVNX1JFRwkJCTB4MUYKKyNkZWZpbmUgICBQSFlfRkxEM19USU1FUl80CQkweDA4MDAKKyNkZWZpbmUgICBQSFlfRkxEM19USU1FUl82CQkweDAwMjAKKyNkZWZpbmUgICBQSFlfRkxEM19SWERFTElOSwkJMHgwMDA0CisjZGVmaW5lIFBIWV9BTkExRAkJCTB4MUQKKyNkZWZpbmUgICBQSFlfQU5BMURfREVCVUdfQUREUgkJMHgwMDA0CisjZGVmaW5lIF9QSFlfRkxEMAkJCTB4MUQKKyNkZWZpbmUgICBfUEhZX0ZMRDBfQ0xLX1JFUV8yMEMJCTB4ODAwMAorI2RlZmluZSAgIF9QSFlfRkxEMF9SWF9JRExFX0VOCQkweDEwMDAKKyNkZWZpbmUgICBfUEhZX0ZMRDBfQklUX0VSUl9SU1ROCTB4MDgwMAorI2RlZmluZSAgIF9QSFlfRkxEMF9CRVJfQ09VTlQJCTB4MDFFMAorI2RlZmluZSAgIF9QSFlfRkxEMF9CRVJfVElNRVIJCTB4MDAxRQorI2RlZmluZSAgIF9QSFlfRkxEMF9DSEVDS19FTgkJMHgwMDAxCiAKLSNkZWZpbmUgTENUTFIJCQkJMHg4MAotI2RlZmluZSAgIExDVExSX0VYVF9TWU5DCQkweDgwCi0jZGVmaW5lICAgTENUTFJfQ09NTU9OX0NMT0NLX0NGRwkweDQwCi0jZGVmaW5lICAgTENUTFJfUkVUUkFJTl9MSU5LCQkweDIwCi0jZGVmaW5lICAgTENUTFJfTElOS19ESVNBQkxFCQkweDEwCi0jZGVmaW5lICAgTENUTFJfUkNCCQkJMHgwOAotI2RlZmluZSAgIExDVExSX1JFU0VSVkVECQkweDA0Ci0jZGVmaW5lICAgTENUTFJfQVNQTV9DVExfTUFTSwkJMHgwMworI2RlZmluZSBQSFlfRkxENAkJCTB4MUUKKyNkZWZpbmUgICBQSFlfRkxENF9GTERFTl9TRUwJCTB4NDAwMAorI2RlZmluZSAgIFBIWV9GTEQ0X1JFUV9SRUYJCTB4MjAwMAorI2RlZmluZSAgIFBIWV9GTEQ0X1JYQU1QX09GRgkJMHgxMDAwCisjZGVmaW5lICAgUEhZX0ZMRDRfUkVRX0FEREEJCTB4MDgwMAorI2RlZmluZSAgIFBIWV9GTEQ0X0JFUl9DT1VOVAkJMHgwMEUwCisjZGVmaW5lICAgUEhZX0ZMRDRfQkVSX1RJTUVSCQkweDAwMEEKKyNkZWZpbmUgICBQSFlfRkxENF9CRVJfQ0hLX0VOCQkweDAwMDEKKyNkZWZpbmUgUEhZX0RJRzFFCQkJMHgxRQorI2RlZmluZSAgIFBIWV9ESUcxRV9SRVYJCQkweDQwMDAKKyNkZWZpbmUgICBQSFlfRElHMUVfRDBfWF9EMQkJMHgxMDAwCisjZGVmaW5lICAgUEhZX0RJRzFFX1JYX09OX0hPU1QJCTB4MDgwMAorI2RlZmluZSAgIFBIWV9ESUcxRV9SQ0xLX1JFRl9IT1NUCTB4MDQwMAorI2RlZmluZSAgIFBIWV9ESUcxRV9SQ0xLX1RYX0VOX0tFRVAJMHgwMDQwCisjZGVmaW5lICAgUEhZX0RJRzFFX1JDTEtfVFhfVEVSTV9LRUVQCTB4MDAyMAorI2RlZmluZSAgIFBIWV9ESUcxRV9SQ0xLX1JYX0VJRExFX09OCTB4MDAxMAorI2RlZmluZSAgIFBIWV9ESUcxRV9UWF9URVJNX0tFRVAJMHgwMDA4CisjZGVmaW5lICAgUEhZX0RJRzFFX1JYX1RFUk1fS0VFUAkweDAwMDQKKyNkZWZpbmUgICBQSFlfRElHMUVfVFhfRU5fS0VFUAkJMHgwMDAyCisjZGVmaW5lICAgUEhZX0RJRzFFX1JYX0VOX0tFRVAJCTB4MDAwMQorI2RlZmluZSBQSFlfRFVNX1JFRwkJCTB4MUYKIAogI2RlZmluZSBQQ1JfU0VUVElOR19SRUcxCQkweDcyNAogI2RlZmluZSBQQ1JfU0VUVElOR19SRUcyCQkweDgxNAogI2RlZmluZSBQQ1JfU0VUVElOR19SRUczCQkweDc0NwogCi0vKiBQaHkgYml0cyAqLwotI2RlZmluZSBQSFlfUENSX0ZPUkNFX0NPREUJCQkweEIwMDAKLSNkZWZpbmUgUEhZX1BDUl9PT0JTX0NBTElfNTAJCQkweDA4MDAKLSNkZWZpbmUgUEhZX1BDUl9PT0JTX1ZDTV8wOAkJCTB4MDIwMAotI2RlZmluZSBQSFlfUENSX09PQlNfU0VOXzkwCQkJMHgwMDQwCi0jZGVmaW5lIFBIWV9QQ1JfUlNTSV9FTgkJCQkweDAwMDIKLQotI2RlZmluZSBQSFlfUkNSMV9BRFBfVElNRQkJCTB4MDEwMAotI2RlZmluZSBQSFlfUkNSMV9WQ09fQ09BUlNFCQkJMHgwMDFGCi0KLSNkZWZpbmUgUEhZX1JDUjJfRU1QSEFTRV9FTgkJCTB4ODAwMAotI2RlZmluZSBQSFlfUkNSMl9OQURKUgkJCQkweDQwMDAKLSNkZWZpbmUgUEhZX1JDUjJfQ0RSX0NQXzEwCQkJMHgwNDAwCi0jZGVmaW5lIFBIWV9SQ1IyX0NEUl9TUl8yCQkJMHgwMTAwCi0jZGVmaW5lIFBIWV9SQ1IyX0ZSRVFTRUxfMTIJCQkweDAwNDAKLSNkZWZpbmUgUEhZX1JDUjJfQ1BBREpFTgkJCTB4MDAyMAotI2RlZmluZSBQSFlfUkNSMl9DRFJfU0NfOAkJCTB4MDAwOAotI2RlZmluZSBQSFlfUkNSMl9DQUxJQl9MQVRFCQkJMHgwMDAyCi0KLSNkZWZpbmUgUEhZX1JEUl9SWERTRUxfMV85CQkJMHg0MDAwCi0KLSNkZWZpbmUgUEhZX1RVTkVfVFVORVJFRl8xXzAJCQkweDQwMDAKLSNkZWZpbmUgUEhZX1RVTkVfVkJHU0VMXzEyNTIJCQkweDBDMDAKLSNkZWZpbmUgUEhZX1RVTkVfU0RCVVNfMzMJCQkweDAyMDAKLSNkZWZpbmUgUEhZX1RVTkVfVFVORUQxOAkJCTB4MDFDMAotI2RlZmluZSBQSFlfVFVORV9UVU5FRDEyCQkJMFgwMDIwCi0KLSNkZWZpbmUgUEhZX0JQQ1JfSUJSWFNFTAkJCTB4MDQwMAotI2RlZmluZSBQSFlfQlBDUl9JQlRYU0VMCQkJMHgwMTAwCi0jZGVmaW5lIFBIWV9CUENSX0lCX0ZJTFRFUgkJCTB4MDA4MAotI2RlZmluZSBQSFlfQlBDUl9DTUlSUk9SX0VOCQkJMHgwMDQwCi0KLSNkZWZpbmUgUEhZX1JFR19SRVZfUkVTVgkJCTB4RTAwMAotI2RlZmluZSBQSFlfUkVHX1JFVl9SWElETEVfTEFUQ0hFRAkJMHgxMDAwCi0jZGVmaW5lIFBIWV9SRUdfUkVWX1AxX0VOCQkJMHgwODAwCi0jZGVmaW5lIFBIWV9SRUdfUkVWX1JYSURMRV9FTgkJCTB4MDQwMAotI2RlZmluZSBQSFlfUkVHX1JFVl9DTEtSRVFfRExZX1RJTUVSXzFfMAkweDAwNDAKLSNkZWZpbmUgUEhZX1JFR19SRVZfU1RPUF9DTEtSRAkJCTB4MDAyMAotI2RlZmluZSBQSFlfUkVHX1JFVl9SWF9QV1NUCQkJMHgwMDA4Ci0jZGVmaW5lIFBIWV9SRUdfUkVWX1NUT1BfQ0xLV1IJCQkweDAwMDQKLQotI2RlZmluZSBQSFlfRkxEM19USU1FUl80CQkJMHg3ODAwCi0jZGVmaW5lIFBIWV9GTEQzX1RJTUVSXzYJCQkweDAwRTAKLSNkZWZpbmUgUEhZX0ZMRDNfUlhERUxJTksJCQkweDAwMDQKLQotI2RlZmluZSBQSFlfRkxENF9GTERFTl9TRUwJCQkweDQwMDAKLSNkZWZpbmUgUEhZX0ZMRDRfUkVRX1JFRgkJCTB4MjAwMAotI2RlZmluZSBQSFlfRkxENF9SWEFNUF9PRkYJCQkweDEwMDAKLSNkZWZpbmUgUEhZX0ZMRDRfUkVRX0FEREEJCQkweDA4MDAKLSNkZWZpbmUgUEhZX0ZMRDRfQkVSX0NPVU5UCQkJMHgwMEUwCi0jZGVmaW5lIFBIWV9GTEQ0X0JFUl9USU1FUgkJCTB4MDAwQQotI2RlZmluZSBQSFlfRkxENF9CRVJfQ0hLX0VOCQkJMHgwMDAxCi0KICNkZWZpbmUgcnRzeF9wY2lfaW5pdF9jbWQocGNyKQkJKChwY3IpLT5jaSA9IDApCiAKIHN0cnVjdCBydHN4X3BjcjsKQEAgLTgzNSw2ICs4NTEsOCBAQAogfTsKIAogc3RydWN0IHBjcl9vcHMgeworCWludCAoKndyaXRlX3BoeSkoc3RydWN0IHJ0c3hfcGNyICpwY3IsIHU4IGFkZHIsIHUxNiB2YWwpOworCWludCAoKnJlYWRfcGh5KShzdHJ1Y3QgcnRzeF9wY3IgKnBjciwgdTggYWRkciwgdTE2ICp2YWwpOwogCWludAkJKCpleHRyYV9pbml0X2h3KShzdHJ1Y3QgcnRzeF9wY3IgKnBjcik7CiAJaW50CQkoKm9wdGltaXplX3BoeSkoc3RydWN0IHJ0c3hfcGNyICpwY3IpOwogCWludAkJKCp0dXJuX29uX2xlZCkoc3RydWN0IHJ0c3hfcGNyICpwY3IpOwpAQCAtODU2LDYgKzg3NCw3IEBACiBzdHJ1Y3QgcnRzeF9wY3IgewogCXN0cnVjdCBwY2lfZGV2CQkJKnBjaTsKIAl1bnNpZ25lZCBpbnQJCQlpZDsKKwlpbnQJCQkJcGNpZV9jYXA7CiAKIAkvKiBwY2kgcmVzb3VyY2VzICovCiAJdW5zaWduZWQgbG9uZwkJCWFkZHI7CkBAIC05MjgsNiArOTQ3LDggQEAKIAljb25zdCBzdHJ1Y3QgcGNyX29wcwkJKm9wczsKIAllbnVtIFBERVZfU1RBVAkJCXN0YXRlOwogCisJdTE2CQkJCXJlZ19wbV9jdHJsMzsKKwogCWludAkJCQludW1fc2xvdHM7CiAJc3RydWN0IHJ0c3hfc2xvdAkJKnNsb3RzOwogfTsKQEAgLTkzNSw2ICs5NTYsMTAgQEAKICNkZWZpbmUgQ0hLX1BDSV9QSUQocGNyLCBwaWQpCQkoKHBjciktPnBjaS0+ZGV2aWNlID09IChwaWQpKQogI2RlZmluZSBQQ0lfVklEKHBjcikJCQkoKHBjciktPnBjaS0+dmVuZG9yKQogI2RlZmluZSBQQ0lfUElEKHBjcikJCQkoKHBjciktPnBjaS0+ZGV2aWNlKQorI2RlZmluZSBpc192ZXJzaW9uKHBjciwgcGlkLCB2ZXIpCQkJCVwKKwkoQ0hLX1BDSV9QSUQocGNyLCBwaWQpICYmIChwY3IpLT5pY192ZXJzaW9uID09ICh2ZXIpKQorI2RlZmluZSBwY3JfZGJnKHBjciwgZm10LCBhcmcuLi4pCQkJCVwKKwlkZXZfZGJnKCYocGNyKS0+cGNpLT5kZXYsIGZtdCwgIyNhcmcpCiAKICNkZWZpbmUgU0RSMTA0X1BIQVNFKHZhbCkJCSgodmFsKSAmIDB4RkYpCiAjZGVmaW5lIFNEUjUwX1BIQVNFKHZhbCkJCSgoKHZhbCkgPj4gOCkgJiAweEZGKQpAQCAtMTAwNCw0ICsxMDI5LDE3IEBACiAJcnRzeF9wY2lfYWRkX2NtZChwY3IsIFdSSVRFX1JFR19DTUQsIHJlZyArIDMsIDB4RkYsIHZhbCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHJ0c3hfcGNpX3VwZGF0ZV9waHkoc3RydWN0IHJ0c3hfcGNyICpwY3IsIHU4IGFkZHIsCisJdTE2IG1hc2ssIHUxNiBhcHBlbmQpCit7CisJaW50IGVycjsKKwl1MTYgdmFsOworCisJZXJyID0gcnRzeF9wY2lfcmVhZF9waHlfcmVnaXN0ZXIocGNyLCBhZGRyLCAmdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBydHN4X3BjaV93cml0ZV9waHlfcmVnaXN0ZXIocGNyLCBhZGRyLCAodmFsICYgbWFzaykgfCBhcHBlbmQpOworfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvY29yZS5oIGIvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9jb3JlLmgKaW5kZXggM2ZkYjdjZmIuLjc1MTE1MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvY29yZS5oCkBAIC01OCwxMyArNTgsNyBAQAogICogQGlycV9iYXNlOgkJQmFzZSBJUlEgbnVtYmVyIGZvciBkZXZpY2UsIHJlcXVpcmVkIGZvciBJUlFzCiAgKiBAaXJxOgkJR2VuZXJpYyBJUlEgbnVtYmVyIGZvciBkZXZpY2UKICAqIEBpcnFfZGF0YToJCVJ1bnRpbWUgZGF0YSBzdHJ1Y3R1cmUgZm9yIElSUSBjb250cm9sbGVyCi0gKiBAb25vOgkJUG93ZXIgb25vZmYgSVJRIG51bWJlciBmb3IgczVtODd4eAogICogQHdha2V1cDoJCVdoZXRoZXIgb3Igbm90IHRoaXMgaXMgYSB3YWtldXAgZGV2aWNlCi0gKiBAd3Rzcl9zbXBsOgkJV2hldGhlciBvciBub3QgdG8gZW5hYmxlIGluIFJUQyBkcml2ZXIgdGhlIFdhdGNoZG9nCi0gKgkJCVRpbWVyIFNvZnR3YXJlIFJlc2V0IChyZWdpc3RlcnMgc2V0IHRvIGRlZmF1bHQgdmFsdWUKLSAqCQkJYWZ0ZXIgUFdSSE9MRCBmYWxsaW5nKSBhbmQgU3VkZGVuIE1vbWVudGFyeSBQb3dlciBMb3NzCi0gKgkJCShQTUlDIHdpbGwgZW50ZXIgcG93ZXIgb24gc2VxdWVuY2UgYWZ0ZXIgc2hvcnQgZHJvcCBpbgotICoJCQlWQkFUVCB2b2x0YWdlKS4KICAqLwogc3RydWN0IHNlY19wbWljX2RldiB7CiAJc3RydWN0IGRldmljZSAqZGV2OwpAQCAtNzcsOSArNzEsNyBAQAogCWludCBpcnE7CiAJc3RydWN0IHJlZ21hcF9pcnFfY2hpcF9kYXRhICppcnFfZGF0YTsKIAotCWludCBvbm87CiAJYm9vbCB3YWtldXA7Ci0JYm9vbCB3dHNyX3NtcGw7CiB9OwogCiBpbnQgc2VjX2lycV9pbml0KHN0cnVjdCBzZWNfcG1pY19kZXYgKnNlY19wbWljKTsKQEAgLTk1LDcgKzg3LDYgQEAKIAlpbnQJCQkJaXJxX2Jhc2U7CiAJaW50CQkJCSgqY2ZnX3BtaWNfaXJxKSh2b2lkKTsKIAotCWludAkJCQlvbm87CiAJYm9vbAkJCQl3YWtldXA7CiAJYm9vbAkJCQlidWNrX3ZvbHRhZ2VfbG9jazsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9pcnEuaCBiL2luY2x1ZGUvbGludXgvbWZkL3NhbXN1bmcvaXJxLmgKaW5kZXggZjM1YWY3My4uNjY3YWE0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvc2Ftc3VuZy9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9zYW1zdW5nL2lycS5oCkBAIC03NCw4ICs3NCw4IEBACiAJUzJNUFMxMV9JUlFfTVJCLAogCiAJUzJNUFMxMV9JUlFfUlRDNjBTLAotCVMyTVBTMTFfSVJRX1JUQ0EwLAogCVMyTVBTMTFfSVJRX1JUQ0ExLAorCVMyTVBTMTFfSVJRX1JUQ0EwLAogCVMyTVBTMTFfSVJRX1NNUEwsCiAJUzJNUFMxMV9JUlFfUlRDMVMsCiAJUzJNUFMxMV9JUlFfV1RTUiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3NreTgxNDUyLmggYi9pbmNsdWRlL2xpbnV4L21mZC9za3k4MTQ1Mi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTI1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9za3k4MTQ1Mi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBza3k4MTQ1Mi5oCVNLWTgxNDUyIE1GRCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBTa3l3b3JrcyBTb2x1dGlvbnMgSW5jLgorICogQXV0aG9yIDogR3l1bmdvaCBZb28gPGphY2sueW9vQHNreXdvcmtzaW5jLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfU0tZODE0NTJfSAorI2RlZmluZSBfU0tZODE0NTJfSAorCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9za3k4MTQ1Mi1iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvbWFjaGluZS5oPgorCitzdHJ1Y3Qgc2t5ODE0NTJfcGxhdGZvcm1fZGF0YSB7CisJc3RydWN0IHNreTgxNDUyX2JsX3BsYXRmb3JtX2RhdGEgKmJsX3BkYXRhOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICpyZWd1bGF0b3JfaW5pdF9kYXRhOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC9zdHc0ODF4LmggYi9pbmNsdWRlL2xpbnV4L21mZC9zdHc0ODF4LmgKaW5kZXggZWRhMTIxNS4uODMzMDc0YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvc3R3NDgxeC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3N0dzQ4MXguaApAQCAtNDEsMTUgKzQxLDExIEBACiAKIC8qKgogICogc3RydWN0IHN0dzQ4MXggLSBzdGF0ZSBob2xkZXIgZm9yIHRoZSBTdHc0ODF4IGRyaXZlcnMKLSAqIEBtdXRleDogbXV0ZXggdG8gc2VyaWFsaXplIEkyQyBhY2Nlc3NlcwogICogQGkyY19jbGllbnQ6IGNvcnJlc3BvbmRpbmcgSTJDIGNsaWVudAotICogQHJlZ3VsYXRvcjogcmVndWxhdG9yIGRldmljZSBmb3IgcmVndWxhdG9yIGNoaWxkcmVuCiAgKiBAbWFwOiByZWdtYXAgaGFuZGxlIHRvIGFjY2VzcyBkZXZpY2UgcmVnaXN0ZXJzCiAgKi8KIHN0cnVjdCBzdHc0ODF4IHsKLQlzdHJ1Y3QgbXV0ZXgJCWxvY2s7CiAJc3RydWN0IGkyY19jbGllbnQJKmNsaWVudDsKLQlzdHJ1Y3QgcmVndWxhdG9yX2Rldgkqdm1tY19yZWd1bGF0b3I7CiAJc3RydWN0IHJlZ21hcAkJKm1hcDsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3N5c2Nvbi9leHlub3M1LXBtdS5oIGIvaW5jbHVkZS9saW51eC9tZmQvc3lzY29uL2V4eW5vczUtcG11LmgKaW5kZXggMDBlZjI0Yi4uOTM1MmFkYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvc3lzY29uL2V4eW5vczUtcG11LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvc3lzY29uL2V4eW5vczUtcG11LmgKQEAgLTM2LDYgKzM2LDkgQEAKICNkZWZpbmUgRVhZTk9TNTQyMF9NVENBRENfUEhZX0NPTlRST0wJCSgweDcyNCkKICNkZWZpbmUgRVhZTk9TNTQyMF9EUFRYX1BIWV9DT05UUk9MCQkoMHg3MjgpCiAKKy8qIEV4eW5vczU0MzMgc3BlY2lmaWMgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgRVhZTk9TNTQzM19VU0JIT1NUMzBfUEhZX0NPTlRST0wJKDB4NzI4KQorCiAjZGVmaW5lIEVYWU5PUzVfUEhZX0VOQUJMRQkJCUJJVCgwKQogCiAjZGVmaW5lIEVYWU5PUzVfTUlQSV9QSFlfU19SRVNFVE4JCUJJVCgxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdGMzNTg5eC5oIGIvaW5jbHVkZS9saW51eC9tZmQvdGMzNTg5eC5oCmluZGV4IGMyMDNjOWMuLjQ2OGMzMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3RjMzU4OXguaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90YzM1ODl4LmgKQEAgLTE0MCwzNiArMTQwLDEzIEBACiAjZGVmaW5lIFRDX0tQRF9ERUJPVU5DRV9QRVJJT0QgIDB4QTMKICNkZWZpbmUgVENfS1BEX1NFVFRMRV9USU1FICAgICAgMHhBMwogCi0vKioKLSAqIHN0cnVjdCB0YzM1ODkzX3BsYXRmb3JtX2RhdGEgLSBkYXRhIHN0cnVjdHVyZSBmb3IgcGxhdGZvcm0gc3BlY2lmaWMgZGF0YQotICogQGtleW1hcF9kYXRhOiAgICAgICAgbWF0cml4IHNjYW4gY29kZSB0YWJsZSBmb3Iga2V5Y29kZXMKLSAqIEBrcm93OiAgICAgICAgICAgICAgIG1hc2sgZm9yIGF2YWlsYWJsZSByb3dzLCB2YWx1ZSBpcyAweEZGCi0gKiBAa2NvbDogICAgICAgICAgICAgICBtYXNrIGZvciBhdmFpbGFibGUgY29sdW1ucywgdmFsdWUgaXMgMHhGRgotICogQGRlYm91bmNlX3BlcmlvZDogICAgcGxhdGZvcm0gc3BlY2lmaWMgZGVib3VuY2UgdGltZQotICogQHNldHRsZV90aW1lOiAgICAgICAgcGxhdGZvcm0gc3BlY2lmaWMgc2V0dGxlIGRvd24gdGltZQotICogQGlycXR5cGU6ICAgICAgICAgICAgdHlwZSBvZiBpbnRlcnJ1cHQsIGZhbGxpbmcgb3IgcmlzaW5nIGVkZ2UKLSAqIEBlbmFibGVfd2FrZXVwOiAgICAgIHNwZWNpZmllcyBpZiBrZXlwYWQgZXZlbnQgY2FuIHdha2UgdXAgc3lzdGVtIGZyb20gc2xlZXAKLSAqIEBub19hdXRvcmVwZWF0OiAgICAgIGZsYWcgZm9yIGF1dG8gcmVwZXRpdGlvbgotICovCi1zdHJ1Y3QgdGMzNTg5eF9rZXlwYWRfcGxhdGZvcm1fZGF0YSB7Ci0JY29uc3Qgc3RydWN0IG1hdHJpeF9rZXltYXBfZGF0YSAqa2V5bWFwX2RhdGE7Ci0JdTggICAgICAgICAgICAgICAgICAgICAga3JvdzsKLQl1OCAgICAgICAgICAgICAgICAgICAgICBrY29sOwotCXU4ICAgICAgICAgICAgICAgICAgICAgIGRlYm91bmNlX3BlcmlvZDsKLQl1OCAgICAgICAgICAgICAgICAgICAgICBzZXR0bGVfdGltZTsKLQl1bnNpZ25lZCBsb25nICAgICAgICAgICBpcnF0eXBlOwotCWJvb2wgICAgICAgICAgICAgICAgICAgIGVuYWJsZV93YWtldXA7Ci0JYm9vbCAgICAgICAgICAgICAgICAgICAgbm9fYXV0b3JlcGVhdDsKLX07CiAKIC8qKgogICogc3RydWN0IHRjMzU4OXhfcGxhdGZvcm1fZGF0YSAtIFRDMzU4OXggcGxhdGZvcm0gZGF0YQogICogQGJsb2NrOiBiaXRtYXNrIG9mIGJsb2NrcyB0byBlbmFibGUgKHVzZSBUQzM1ODl4X0JMT0NLXyopCi0gKiBAa2V5cGFkOiBrZXlwYWQtc3BlY2lmaWMgcGxhdGZvcm0gZGF0YQogICovCiBzdHJ1Y3QgdGMzNTg5eF9wbGF0Zm9ybV9kYXRhIHsKIAl1bnNpZ25lZCBpbnQgYmxvY2s7Ci0JY29uc3Qgc3RydWN0IHRjMzU4OXhfa2V5cGFkX3BsYXRmb3JtX2RhdGEgKmtleXBhZDsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdGlfYW0zMzV4X3RzY2FkYy5oIGIvaW5jbHVkZS9saW51eC9tZmQvdGlfYW0zMzV4X3RzY2FkYy5oCmluZGV4IDNmNGU5OTQuLjFmZDUwZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3RpX2FtMzM1eF90c2NhZGMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90aV9hbTMzNXhfdHNjYWRjLmgKQEAgLTEyOCw2ICsxMjgsNyBAQAogCiAvKiBTZXF1ZW5jZXIgU3RhdHVzICovCiAjZGVmaW5lIFNFUV9TVEFUVVMgQklUKDUpCisjZGVmaW5lIENIQVJHRV9TVEVQCQkweDExCiAKICNkZWZpbmUgQURDX0NMSwkJCTMwMDAwMDAKICNkZWZpbmUgVE9UQUxfU1RFUFMJCTE2CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvc3VwcGx5LmggYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzNTAvc3VwcGx5LmgKaW5kZXggMmI5NDc5My4uOGRjOTM2NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd204MzUwL3N1cHBseS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODM1MC9zdXBwbHkuaApAQCAtMTIzLDkgKzEyMyw5IEBACiAKIHN0cnVjdCB3bTgzNTBfcG93ZXIgewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IHBvd2VyX3N1cHBseSBiYXR0ZXJ5OwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgdXNiOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgYWM7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYmF0dGVyeTsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICp1c2I7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqYWM7CiAJc3RydWN0IHdtODM1MF9jaGFyZ2VyX3BvbGljeSAqcG9saWN5OwogCiAJaW50IHJldl9nX2NvZWZmOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9taWdyYXRlLmggYi9pbmNsdWRlL2xpbnV4L21pZ3JhdGUuaAppbmRleCA3OGJhZWQ1Li5jYWMxYzA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21pZ3JhdGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21pZ3JhdGUuaApAQCAtNjksNyArNjksNiBAQAogZXh0ZXJuIGJvb2wgcG1kX3RyYW5zX21pZ3JhdGluZyhwbWRfdCBwbWQpOwogZXh0ZXJuIGludCBtaWdyYXRlX21pc3BsYWNlZF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlLAogCQkJCSAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIGludCBub2RlKTsKLWV4dGVybiBib29sIG1pZ3JhdGVfcmF0ZWxpbWl0ZWQoaW50IG5vZGUpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgYm9vbCBwbWRfdHJhbnNfbWlncmF0aW5nKHBtZF90IHBtZCkKIHsKQEAgLTgwLDEwICs3OSw2IEBACiB7CiAJcmV0dXJuIC1FQUdBSU47IC8qIGNhbid0IG1pZ3JhdGUgbm93ICovCiB9Ci1zdGF0aWMgaW5saW5lIGJvb2wgbWlncmF0ZV9yYXRlbGltaXRlZChpbnQgbm9kZSkKLXsKLQlyZXR1cm4gZmFsc2U7Ci19CiAjZW5kaWYgLyogQ09ORklHX05VTUFfQkFMQU5DSU5HICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19OVU1BX0JBTEFOQ0lORykgJiYgZGVmaW5lZChDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDQvY21kLmggYi9pbmNsdWRlL2xpbnV4L21seDQvY21kLmgKaW5kZXggN2I2ZDRlOS4uZjYyZTdjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg0L2NtZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NC9jbWQuaApAQCAtNjgsNiArNjgsOCBAQAogCU1MWDRfQ01EX1VOTUFQX0lDTV9BVVgJID0gMHhmZmIsCiAJTUxYNF9DTURfU0VUX0lDTV9TSVpFCSA9IDB4ZmZkLAogCU1MWDRfQ01EX0FDQ0VTU19SRUcJID0gMHgzYiwKKwlNTFg0X0NNRF9BTExPQ0FURV9WUFAJID0gMHg4MCwKKwlNTFg0X0NNRF9TRVRfVlBPUlRfUU9TCSA9IDB4ODEsCiAKIAkvKm1hc3RlciBub3RpZnkgZncgb24gZmluaXNoIGZvciBzbGF2ZSdzIGZsciovCiAJTUxYNF9DTURfSU5GT1JNX0ZMUl9ET05FID0gMHg1YiwKQEAgLTE2Myw2ICsxNjUsOSBAQAogCU1MWDRfUVBfRkxPV19TVEVFUklOR19BVFRBQ0ggPSAweDY1LAogCU1MWDRfUVBfRkxPV19TVEVFUklOR19ERVRBQ0ggPSAweDY2LAogCU1MWDRfRkxPV19TVEVFUklOR19JQl9VQ19RUF9SQU5HRSA9IDB4NjQsCisKKwkvKiBVcGRhdGUgYW5kIHJlYWQgUUNOIHBhcmFtZXRlcnMgKi8KKwlNTFg0X0NNRF9DT05HRVNUSU9OX0NUUkxfT1BDT0RFID0gMHg2OCwKIH07CiAKIGVudW0gewpAQCAtMTgzLDcgKzE4OCwxNCBAQAogfTsKIAogZW51bSB7Ci0JLyogc2V0IHBvcnQgb3Bjb2RlIG1vZGlmaWVycyAqLworCS8qIFNldCBwb3J0IG9wY29kZSBtb2RpZmllcnMgKi8KKwlNTFg0X1NFVF9QT1JUX0lCX09QQ09ERQkJPSAweDAsCisJTUxYNF9TRVRfUE9SVF9FVEhfT1BDT0RFCT0gMHgxLAorCU1MWDRfU0VUX1BPUlRfQkVBQ09OX09QQ09ERQk9IDB4NCwKK307CisKK2VudW0geworCS8qIFNldCBwb3J0IEV0aGVybmV0IGlucHV0IG1vZGlmaWVycyAqLwogCU1MWDRfU0VUX1BPUlRfR0VORVJBTCAgID0gMHgwLAogCU1MWDRfU0VUX1BPUlRfUlFQX0NBTEMgID0gMHgxLAogCU1MWDRfU0VUX1BPUlRfTUFDX1RBQkxFID0gMHgyLApAQCAtMjMzLDYgKzI0NSwxNiBAQAogCXU4CXJ4X2NzdW1fZmxhZ3NfcG9ydF8yOwogfTsKIAorZW51bSBtbHg0X2VuX2Nvbmdlc3Rpb25fY29udHJvbF9hbGdvcml0aG0geworCU1MWDRfQ1RSTF9BTEdPXzgwMl8xX1FBVV9SRUFDVElPTl9QT0lOVCA9IDAsCit9OworCitlbnVtIG1seDRfZW5fY29uZ2VzdGlvbl9jb250cm9sX29wbW9kIHsKKwlNTFg0X0NPTkdFU1RJT05fQ09OVFJPTF9HRVRfUEFSQU1TLAorCU1MWDRfQ09OR0VTVElPTl9DT05UUk9MX0dFVF9TVEFUSVNUSUNTLAorCU1MWDRfQ09OR0VTVElPTl9DT05UUk9MX1NFVF9QQVJBTVMgPSA0LAorfTsKKwogc3RydWN0IG1seDRfZGV2OwogCiBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCB7CkBAIC0yODEsNiArMzAzLDggQEAKIHUzMiBtbHg0X2NvbW1fZ2V0X3ZlcnNpb24odm9pZCk7CiBpbnQgbWx4NF9zZXRfdmZfbWFjKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgaW50IHZmLCB1NjQgbWFjKTsKIGludCBtbHg0X3NldF92Zl92bGFuKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgaW50IHZmLCB1MTYgdmxhbiwgdTggcW9zKTsKK2ludCBtbHg0X3NldF92Zl9yYXRlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCwgaW50IHZmLCBpbnQgbWluX3R4X3JhdGUsCisJCSAgICAgaW50IG1heF90eF9yYXRlKTsKIGludCBtbHg0X3NldF92Zl9zcG9vZmNoayhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHBvcnQsIGludCB2ZiwgYm9vbCBzZXR0aW5nKTsKIGludCBtbHg0X2dldF92Zl9jb25maWcoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0LCBpbnQgdmYsIHN0cnVjdCBpZmxhX3ZmX2luZm8gKml2Zik7CiBpbnQgbWx4NF9zZXRfdmZfbGlua19zdGF0ZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHBvcnQsIGludCB2ZiwgaW50IGxpbmtfc3RhdGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCmluZGV4IGU0ZWJmZjcuLmY5Y2UzNGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKQEAgLTQ5LDggKzQ5LDYgQEAKICNkZWZpbmUgTVNJWF9MRUdBQ1lfU1oJCTQKICNkZWZpbmUgTUlOX01TSVhfUF9QT1JUCQk1CiAKLSNkZWZpbmUgTUxYNF9OVU1fVVAJCQk4Ci0jZGVmaW5lIE1MWDRfTlVNX1RDCQkJOAogI2RlZmluZSBNTFg0X01BWF8xMDBNX1VOSVRTX1ZBTAkJMjU1CS8qCiAJCQkJCQkgKiB3b3JrIGFyb3VuZDogY2FuJ3Qgc2V0IHZhbHVlcwogCQkJCQkJICogZ3JlYXRlciB0aGVuIHRoaXMgdmFsdWUgd2hlbgpAQCAtMTc0LDYgKzE3Miw3IEBACiAJTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX1VDX1NURUVSCT0gMUxMIDw8IDQxLAogCU1MWDRfREVWX0NBUF9GTEFHX1ZFUF9NQ19TVEVFUgk9IDFMTCA8PCA0MiwKIAlNTFg0X0RFVl9DQVBfRkxBR19DT1VOVEVSUwk9IDFMTCA8PCA0OCwKKwlNTFg0X0RFVl9DQVBfRkxBR19SU1NfSVBfRlJBRyAgID0gMUxMIDw8IDUyLAogCU1MWDRfREVWX0NBUF9GTEFHX1NFVF9FVEhfU0NIRUQgPSAxTEwgPDwgNTMsCiAJTUxYNF9ERVZfQ0FQX0ZMQUdfU0VOU0VfU1VQUE9SVAk9IDFMTCA8PCA1NSwKIAlNTFg0X0RFVl9DQVBfRkxBR19QT1JUX01OR19DSEdfRVYgPSAxTEwgPDwgNTksCkBAIC0yMDMsNyArMjAyLDE0IEBACiAJTUxYNF9ERVZfQ0FQX0ZMQUcyXzgwX1ZGUwkJPSAxTEwgPDwgIDE4LAogCU1MWDRfREVWX0NBUF9GTEFHMl9GU19BMAkJPSAxTEwgPDwgIDE5LAogCU1MWDRfREVWX0NBUF9GTEFHMl9SRUNPVkVSQUJMRV9FUlJPUl9FVkVOVCA9IDFMTCA8PCAyMCwKLQlNTFg0X0RFVl9DQVBfRkxBRzJfUE9SVF9SRU1BUAkJPSAxTEwgPDwgIDIxCisJTUxYNF9ERVZfQ0FQX0ZMQUcyX1BPUlRfUkVNQVAJCT0gMUxMIDw8ICAyMSwKKwlNTFg0X0RFVl9DQVBfRkxBRzJfUUNOCQkJPSAxTEwgPDwgIDIyLAorCU1MWDRfREVWX0NBUF9GTEFHMl9RUF9SQVRFX0xJTUlUCT0gMUxMIDw8ICAyMywKKwlNTFg0X0RFVl9DQVBfRkxBRzJfRkxPV1NUQVRTX0VOICAgICAgICAgPSAxTEwgPDwgIDI0LAorCU1MWDRfREVWX0NBUF9GTEFHMl9RT1NfVlBQCQk9IDFMTCA8PCAgMjUsCisJTUxYNF9ERVZfQ0FQX0ZMQUcyX0VUU19DRkcJCT0gMUxMIDw8ICAyNiwKKwlNTFg0X0RFVl9DQVBfRkxBRzJfUE9SVF9CRUFDT04JCT0gMUxMIDw8ICAyNywKKwlNTFg0X0RFVl9DQVBfRkxBRzJfSUdOT1JFX0ZDUwkJPSAxTEwgPDwgIDI4LAogfTsKIAogZW51bSB7CkBAIC00NDksNiArNDU1LDIxIEBACiAJTUxYNF9NT0RVTEVfSURfUVNGUDI4ICAgICAgICAgICA9IDB4MTEsCiB9OwogCitlbnVtIHsgLyogcmwgKi8KKwlNTFg0X1FQX1JBVEVfTElNSVRfTk9ORQkJPSAwLAorCU1MWDRfUVBfUkFURV9MSU1JVF9LQlMJCT0gMSwKKwlNTFg0X1FQX1JBVEVfTElNSVRfTUJTCQk9IDIsCisJTUxYNF9RUF9SQVRFX0xJTUlUX0dCUwkJPSAzCit9OworCitzdHJ1Y3QgbWx4NF9yYXRlX2xpbWl0X2NhcHMgeworCXUxNgludW1fcmF0ZXM7IC8qIE51bWJlciBvZiBkaWZmZXJlbnQgcmF0ZXMgKi8KKwl1OAltaW5fdW5pdDsKKwl1MTYJbWluX3ZhbDsKKwl1OAltYXhfdW5pdDsKKwl1MTYJbWF4X3ZhbDsKK307CisKIHN0YXRpYyBpbmxpbmUgdTY0IG1seDRfZndfdmVyKHU2NCBtYWpvciwgdTY0IG1pbm9yLCB1NjQgc3VibWlub3IpCiB7CiAJcmV0dXJuIChtYWpvciA8PCAzMikgfCAobWlub3IgPDwgMTYpIHwgc3VibWlub3I7CkBAIC01NjQsNiArNTg1LDcgQEAKIAl1MzIJCQlkbWZzX2hpZ2hfcmF0ZV9xcG5fYmFzZTsKIAl1MzIJCQlkbWZzX2hpZ2hfcmF0ZV9xcG5fcmFuZ2U7CiAJdTMyCQkJdmZfY2FwczsKKwlzdHJ1Y3QgbWx4NF9yYXRlX2xpbWl0X2NhcHMgcmxfY2FwczsKIH07CiAKIHN0cnVjdCBtbHg0X2J1Zl9saXN0IHsKQEAgLTk4Miw2ICsxMDA0LDExIEBACiAJcmV0dXJuIGRldi0+ZmxhZ3MgJiBNTFg0X0ZMQUdfU0xBVkU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1seDRfaXNfZXRoKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gZGV2LT5jYXBzLnBvcnRfdHlwZVtwb3J0XSA9PSBNTFg0X1BPUlRfVFlQRV9JQiA/IDAgOiAxOworfQorCiBpbnQgbWx4NF9idWZfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzaXplLCBpbnQgbWF4X2RpcmVjdCwKIAkJICAgc3RydWN0IG1seDRfYnVmICpidWYsIGdmcF90IGdmcCk7CiB2b2lkIG1seDRfYnVmX2ZyZWUoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzaXplLCBzdHJ1Y3QgbWx4NF9idWYgKmJ1Zik7CkBAIC0xMjgyLDE0ICsxMzA5LDEzIEBACiB2b2lkIG1seDRfdW5yZWdpc3Rlcl9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU2NCBtYWMpOwogaW50IG1seDRfZ2V0X2Jhc2VfcXBuKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0KTsKIGludCBfX21seDRfcmVwbGFjZV9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCBxcG4sIHU2NCBuZXdfbWFjKTsKLXZvaWQgbWx4NF9zZXRfc3RhdHNfYml0bWFwKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1NjQgKnN0YXRzX2JpdG1hcCk7CiBpbnQgbWx4NF9TRVRfUE9SVF9nZW5lcmFsKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCBpbnQgbXR1LAogCQkJICB1OCBwcHR4LCB1OCBwZmN0eCwgdTggcHByeCwgdTggcGZjcngpOwogaW50IG1seDRfU0VUX1BPUlRfcXBuX2NhbGMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHUzMiBiYXNlX3FwbiwKIAkJCSAgIHU4IHByb21pc2MpOwotaW50IG1seDRfU0VUX1BPUlRfUFJJTzJUQyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTggKnByaW8ydGMpOwotaW50IG1seDRfU0VUX1BPUlRfU0NIRURVTEVSKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1OCAqdGNfdHhfYncsCi0JCXU4ICpwZywgdTE2ICpyYXRlbGltaXQpOworaW50IG1seDRfU0VUX1BPUlRfQkVBQ09OKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1MTYgdGltZSk7CitpbnQgbWx4NF9TRVRfUE9SVF9mY3NfY2hlY2soc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsCisJCQkgICAgdTggaWdub3JlX2Zjc192YWx1ZSk7CiBpbnQgbWx4NF9TRVRfUE9SVF9WWExBTihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTggc3RlZXJpbmcsIGludCBlbmFibGUpOwogaW50IG1seDRfZmluZF9jYWNoZWRfbWFjKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1NjQgbWFjLCBpbnQgKmlkeCk7CiBpbnQgbWx4NF9maW5kX2NhY2hlZF92bGFuKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1MTYgdmlkLCBpbnQgKmlkeCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDQvcXAuaCBiL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oCmluZGV4IDU1MWY4NTQuLjZmZWQ1MzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NC9xcC5oCkBAIC0yMDcsMTQgKzIwNywxNyBAQAogCV9fYmUzMgkJCW1zbjsKIAlfX2JlMTYJCQlycV93cWVfY291bnRlcjsKIAlfX2JlMTYJCQlzcV93cWVfY291bnRlcjsKLQl1MzIJCQlyZXNlcnZlZDNbMl07CisJdTMyCQkJcmVzZXJ2ZWQzOworCV9fYmUxNgkJCXJhdGVfbGltaXRfcGFyYW1zOworCXU4CQkJcmVzZXJ2ZWQ0OworCXU4CQkJcW9zX3Zwb3J0OwogCV9fYmUzMgkJCXBhcmFtMzsKIAlfX2JlMzIJCQludW1tbWNwZWVyc19iYXNlbWtleTsKIAl1OAkJCWxvZ19wYWdlX3NpemU7Ci0JdTgJCQlyZXNlcnZlZDRbMl07CisJdTgJCQlyZXNlcnZlZDVbMl07CiAJdTgJCQltdHRfYmFzZV9hZGRyX2g7CiAJX19iZTMyCQkJbXR0X2Jhc2VfYWRkcl9sOwotCXUzMgkJCXJlc2VydmVkNVsxMF07CisJdTMyCQkJcmVzZXJ2ZWQ2WzEwXTsKIH07CiAKIHN0cnVjdCBtbHg0X3VwZGF0ZV9xcF9jb250ZXh0IHsKQEAgLTIyOSw2ICsyMzIsOCBAQAogZW51bSB7CiAJTUxYNF9VUERfUVBfTUFTS19QTV9TVEFURQk9IDMyLAogCU1MWDRfVVBEX1FQX01BU0tfVlNECQk9IDMzLAorCU1MWDRfVVBEX1FQX01BU0tfUU9TX1ZQUAk9IDM0LAorCU1MWDRfVVBEX1FQX01BU0tfUkFURV9MSU1JVAk9IDM1LAogfTsKIAogZW51bSB7CkBAIC00MjgsNyArNDMzLDkgQEAKIGVudW0gbWx4NF91cGRhdGVfcXBfYXR0ciB7CiAJTUxYNF9VUERBVEVfUVBfU01BQwkJPSAxIDw8IDAsCiAJTUxYNF9VUERBVEVfUVBfVlNECQk9IDEgPDwgMSwKLQlNTFg0X1VQREFURV9RUF9TVVBQT1JURURfQVRUUlMJPSAoMSA8PCAyKSAtIDEKKwlNTFg0X1VQREFURV9RUF9SQVRFX0xJTUlUCT0gMSA8PCAyLAorCU1MWDRfVVBEQVRFX1FQX1FPU19WUE9SVAk9IDEgPDwgMywKKwlNTFg0X1VQREFURV9RUF9TVVBQT1JURURfQVRUUlMJPSAoMSA8PCA0KSAtIDEKIH07CiAKIGVudW0gbWx4NF91cGRhdGVfcXBfcGFyYW1zX2ZsYWdzIHsKQEAgLTQzNyw3ICs0NDQsMTAgQEAKIAogc3RydWN0IG1seDRfdXBkYXRlX3FwX3BhcmFtcyB7CiAJdTgJc21hY19pbmRleDsKKwl1OAlxb3NfdnBvcnQ7CiAJdTMyCWZsYWdzOworCXUxNglyYXRlX3VuaXQ7CisJdTE2CXJhdGVfdmFsOwogfTsKIAogaW50IG1seDRfdXBkYXRlX3FwKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgcXBuLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg1L2NtZC5oIGIvaW5jbHVkZS9saW51eC9tbHg1L2NtZC5oCmluZGV4IDI4MjZhNGIuLjY4Y2QwOGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NS9jbWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDUvY21kLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9jcS5oIGIvaW5jbHVkZS9saW51eC9tbHg1L2NxLmgKaW5kZXggZjZiMTdhYy4uMjY5NWNlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L2NxLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L2NxLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKQEAgLTEzNywxNCArMTM3LDE1IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtbHg1X2NxX2FybShzdHJ1Y3QgbWx4NV9jb3JlX2NxICpjcSwgdTMyIGNtZCwKIAkJCSAgICAgICB2b2lkIF9faW9tZW0gKnVhcl9wYWdlLAotCQkJICAgICAgIHNwaW5sb2NrX3QgKmRvb3JiZWxsX2xvY2spCisJCQkgICAgICAgc3BpbmxvY2tfdCAqZG9vcmJlbGxfbG9jaywKKwkJCSAgICAgICB1MzIgY29uc19pbmRleCkKIHsKIAlfX2JlMzIgZG9vcmJlbGxbMl07CiAJdTMyIHNuOwogCXUzMiBjaTsKIAogCXNuID0gY3EtPmFybV9zbiAmIDM7Ci0JY2kgPSBjcS0+Y29uc19pbmRleCAmIDB4ZmZmZmZmOworCWNpID0gY29uc19pbmRleCAmIDB4ZmZmZmZmOwogCiAJKmNxLT5hcm1fZGIgPSBjcHVfdG9fYmUzMihzbiA8PCAyOCB8IGNtZCB8IGNpKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg1L2RldmljZS5oIGIvaW5jbHVkZS9saW51eC9tbHg1L2RldmljZS5oCmluZGV4IDRlNWJkODEuLmFiZjY1YzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWx4NS9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDUvZGV2aWNlLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9kb29yYmVsbC5oIGIvaW5jbHVkZS9saW51eC9tbHg1L2Rvb3JiZWxsLmgKaW5kZXggMTYzYTgxOC4uYWZjNzhhMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L2Rvb3JiZWxsLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L2Rvb3JiZWxsLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvbWx4NS9kcml2ZXIuaAppbmRleCAxNjZkOTMxLi45YTkwZTc1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDUvZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L2RyaXZlci5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTWVsbGFub3ggVGVjaG5vbG9naWVzIGluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCkBAIC0yMzIsNiArMjMyLDkgQEAKIH07CiAKIHN0cnVjdCBtbHg1X2NtZCB7CisJdm9pZAkgICAgICAgKmNtZF9hbGxvY19idWY7CisJZG1hX2FkZHJfdAlhbGxvY19kbWE7CisJaW50CQlhbGxvY19zaXplOwogCXZvaWQJICAgICAgICpjbWRfYnVmOwogCWRtYV9hZGRyX3QJZG1hOwogCXUxNgkJY21kaWZfcmV2OwpAQCAtNDA3LDcgKzQxMCw3IEBACiBzdHJ1Y3QgbWx4NV9lcV90YWJsZSB7CiAJdm9pZCBfX2lvbWVtCSAgICAgICAqdXBkYXRlX2NpOwogCXZvaWQgX19pb21lbQkgICAgICAgKnVwZGF0ZV9hcm1fY2k7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAqY29tcF9lcV9oZWFkOworCXN0cnVjdCBsaXN0X2hlYWQJY29tcF9lcXNfbGlzdDsKIAlzdHJ1Y3QgbWx4NV9lcQkJcGFnZXNfZXE7CiAJc3RydWN0IG1seDVfZXEJCWFzeW5jX2VxOwogCXN0cnVjdCBtbHg1X2VxCQljbWRfZXE7CkBAIC03MjIsNiArNzI1LDcgQEAKIGludCBtbHg1X2Rlc3Ryb3lfdW5tYXBfZXEoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgc3RydWN0IG1seDVfZXEgKmVxKTsKIGludCBtbHg1X3N0YXJ0X2VxcyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2KTsKIGludCBtbHg1X3N0b3BfZXFzKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOworaW50IG1seDVfdmVjdG9yMmVxbihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCBpbnQgdmVjdG9yLCBpbnQgKmVxbiwgaW50ICppcnFuKTsKIGludCBtbHg1X2NvcmVfYXR0YWNoX21jZyhzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqZGV2LCB1bmlvbiBpYl9naWQgKm1naWQsIHUzMiBxcG4pOwogaW50IG1seDVfY29yZV9kZXRhY2hfbWNnKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHVuaW9uIGliX2dpZCAqbWdpZCwgdTMyIHFwbik7CiAKQEAgLTc3NywxNCArNzgxLDIyIEBACiAJTUFYX01SX0NBQ0hFX0VOVFJJRVMgICAgPSAxNiwKIH07CiAKK2VudW0geworCU1MWDVfSU5URVJGQUNFX1BST1RPQ09MX0lCICA9IDAsCisJTUxYNV9JTlRFUkZBQ0VfUFJPVE9DT0xfRVRIID0gMSwKK307CisKIHN0cnVjdCBtbHg1X2ludGVyZmFjZSB7CiAJdm9pZCAqCQkJKCphZGQpKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYpOwogCXZvaWQJCQkoKnJlbW92ZSkoc3RydWN0IG1seDVfY29yZV9kZXYgKmRldiwgdm9pZCAqY29udGV4dCk7CiAJdm9pZAkJCSgqZXZlbnQpKHN0cnVjdCBtbHg1X2NvcmVfZGV2ICpkZXYsIHZvaWQgKmNvbnRleHQsCiAJCQkJCSBlbnVtIG1seDVfZGV2X2V2ZW50IGV2ZW50LCB1bnNpZ25lZCBsb25nIHBhcmFtKTsKKwl2b2lkICogICAgICAgICAgICAgICAgICAoKmdldF9kZXYpKHZvaWQgKmNvbnRleHQpOworCWludAkJCXByb3RvY29sOwogCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKIH07CiAKK3ZvaWQgKm1seDVfZ2V0X3Byb3RvY29sX2RldihzdHJ1Y3QgbWx4NV9jb3JlX2RldiAqbWRldiwgaW50IHByb3RvY29sKTsKIGludCBtbHg1X3JlZ2lzdGVyX2ludGVyZmFjZShzdHJ1Y3QgbWx4NV9pbnRlcmZhY2UgKmludGYpOwogdm9pZCBtbHg1X3VucmVnaXN0ZXJfaW50ZXJmYWNlKHN0cnVjdCBtbHg1X2ludGVyZmFjZSAqaW50Zik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9tbHg1X2lmYy5oIGIvaW5jbHVkZS9saW51eC9tbHg1L21seDVfaWZjLmgKaW5kZXggNWY0OGI4Zi4uY2IzYWQxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L21seDVfaWZjLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L21seDVfaWZjLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE0LCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9xcC5oIGIvaW5jbHVkZS9saW51eC9tbHg1L3FwLmgKaW5kZXggNjFmN2EzNC4uMzEwYjVmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg1L3FwLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L3FwLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDEzLCBNZWxsYW5veCBUZWNobm9sb2dpZXMgaW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE1LCBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBzb2Z0d2FyZSBpcyBhdmFpbGFibGUgdG8geW91IHVuZGVyIGEgY2hvaWNlIG9mIG9uZSBvZiB0d28KICAqIGxpY2Vuc2VzLiAgWW91IG1heSBjaG9vc2UgdG8gYmUgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWx4NS9zcnEuaCBiL2luY2x1ZGUvbGludXgvbWx4NS9zcnEuaAppbmRleCBlMWEzNjNhLi5mNDNlZDA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDUvc3JxLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbHg1L3NycS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgTWVsbGFub3ggVGVjaG5vbG9naWVzIGluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSwgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhIGNob2ljZSBvZiBvbmUgb2YgdHdvCiAgKiBsaWNlbnNlcy4gIFlvdSBtYXkgY2hvb3NlIHRvIGJlIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgKaW5kZXggNDdhOTM5Mi4uOGIwODYwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW0uaApAQCAtMjUxLDYgKzI1MSw5IEBACiAJICogd3JpdGFibGUsIGlmIGFuIGVycm9yIGlzIHJldHVybmVkIGl0IHdpbGwgY2F1c2UgYSBTSUdCVVMgKi8KIAlpbnQgKCpwYWdlX21rd3JpdGUpKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQgKnZtZik7CiAKKwkvKiBzYW1lIGFzIHBhZ2VfbWt3cml0ZSB3aGVuIHVzaW5nIFZNX1BGTk1BUHxWTV9NSVhFRE1BUCAqLworCWludCAoKnBmbl9ta3dyaXRlKShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpOworCiAJLyogY2FsbGVkIGJ5IGFjY2Vzc19wcm9jZXNzX3ZtIHdoZW4gZ2V0X3VzZXJfcGFnZXMoKSBmYWlscywgdHlwaWNhbGx5CiAJICogZm9yIHVzZSBieSBzcGVjaWFsIFZNQXMgdGhhdCBjYW4gc3dpdGNoIGJldHdlZW4gbWVtb3J5IGFuZCBoYXJkd2FyZQogCSAqLwpAQCAtNDk0LDE4ICs0OTcsOSBAQAogCXJldHVybiBhdG9taWNfcmVhZCgmY29tcG91bmRfaGVhZChwYWdlKS0+X2NvdW50KTsKIH0KIAotI2lmZGVmIENPTkZJR19IVUdFVExCX1BBR0UKLWV4dGVybiBpbnQgUGFnZUhlYWRIdWdlKHN0cnVjdCBwYWdlICpwYWdlX2hlYWQpOwotI2Vsc2UgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLwotc3RhdGljIGlubGluZSBpbnQgUGFnZUhlYWRIdWdlKHN0cnVjdCBwYWdlICpwYWdlX2hlYWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLwotCiBzdGF0aWMgaW5saW5lIGJvb2wgX19jb21wb3VuZF90YWlsX3JlZmNvdW50ZWQoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JcmV0dXJuICFQYWdlU2xhYihwYWdlKSAmJiAhUGFnZUhlYWRIdWdlKHBhZ2UpOworCXJldHVybiBQYWdlQW5vbihwYWdlKSAmJiAhUGFnZVNsYWIocGFnZSkgJiYgIVBhZ2VIZWFkSHVnZShwYWdlKTsKIH0KIAogLyoKQEAgLTU3MSw1MyArNTY1LDYgQEAKIAlhdG9taWNfc2V0KCZwYWdlLT5fY291bnQsIDEpOwogfQogCi0vKgotICogUGFnZUJ1ZGR5KCkgaW5kaWNhdGUgdGhhdCB0aGUgcGFnZSBpcyBmcmVlIGFuZCBpbiB0aGUgYnVkZHkgc3lzdGVtCi0gKiAoc2VlIG1tL3BhZ2VfYWxsb2MuYykuCi0gKgotICogUEFHRV9CVUREWV9NQVBDT1VOVF9WQUxVRSBtdXN0IGJlIDw9IC0yIGJ1dCBiZXR0ZXIgbm90IHRvbyBjbG9zZSB0bwotICogLTIgc28gdGhhdCBhbiB1bmRlcmZsb3cgb2YgdGhlIHBhZ2VfbWFwY291bnQoKSB3b24ndCBiZSBtaXN0YWtlbgotICogZm9yIGEgZ2VudWluZSBQQUdFX0JVRERZX01BUENPVU5UX1ZBTFVFLiAtMTI4IGNhbiBiZSBjcmVhdGVkIHZlcnkKLSAqIGVmZmljaWVudGx5IGJ5IG1vc3QgQ1BVIGFyY2hpdGVjdHVyZXMuCi0gKi8KLSNkZWZpbmUgUEFHRV9CVUREWV9NQVBDT1VOVF9WQUxVRSAoLTEyOCkKLQotc3RhdGljIGlubGluZSBpbnQgUGFnZUJ1ZGR5KHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybiBhdG9taWNfcmVhZCgmcGFnZS0+X21hcGNvdW50KSA9PSBQQUdFX0JVRERZX01BUENPVU5UX1ZBTFVFOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19TZXRQYWdlQnVkZHkoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JVk1fQlVHX09OX1BBR0UoYXRvbWljX3JlYWQoJnBhZ2UtPl9tYXBjb3VudCkgIT0gLTEsIHBhZ2UpOwotCWF0b21pY19zZXQoJnBhZ2UtPl9tYXBjb3VudCwgUEFHRV9CVUREWV9NQVBDT1VOVF9WQUxVRSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX0NsZWFyUGFnZUJ1ZGR5KHN0cnVjdCBwYWdlICpwYWdlKQotewotCVZNX0JVR19PTl9QQUdFKCFQYWdlQnVkZHkocGFnZSksIHBhZ2UpOwotCWF0b21pY19zZXQoJnBhZ2UtPl9tYXBjb3VudCwgLTEpOwotfQotCi0jZGVmaW5lIFBBR0VfQkFMTE9PTl9NQVBDT1VOVF9WQUxVRSAoLTI1NikKLQotc3RhdGljIGlubGluZSBpbnQgUGFnZUJhbGxvb24oc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIGF0b21pY19yZWFkKCZwYWdlLT5fbWFwY291bnQpID09IFBBR0VfQkFMTE9PTl9NQVBDT1VOVF9WQUxVRTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fU2V0UGFnZUJhbGxvb24oc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JVk1fQlVHX09OX1BBR0UoYXRvbWljX3JlYWQoJnBhZ2UtPl9tYXBjb3VudCkgIT0gLTEsIHBhZ2UpOwotCWF0b21pY19zZXQoJnBhZ2UtPl9tYXBjb3VudCwgUEFHRV9CQUxMT09OX01BUENPVU5UX1ZBTFVFKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIF9fQ2xlYXJQYWdlQmFsbG9vbihzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlWTV9CVUdfT05fUEFHRSghUGFnZUJhbGxvb24ocGFnZSksIHBhZ2UpOwotCWF0b21pY19zZXQoJnBhZ2UtPl9tYXBjb3VudCwgLTEpOwotfQotCiB2b2lkIHB1dF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKIHZvaWQgcHV0X3BhZ2VzX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqcGFnZXMpOwogCkBAIC0xMDA2LDM0ICs5NTMsMTAgQEAKICNkZWZpbmUgcGFnZV9hZGRyZXNzX2luaXQoKSAgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYKIAotLyoKLSAqIE9uIGFuIGFub255bW91cyBwYWdlIG1hcHBlZCBpbnRvIGEgdXNlciB2aXJ0dWFsIG1lbW9yeSBhcmVhLAotICogcGFnZS0+bWFwcGluZyBwb2ludHMgdG8gaXRzIGFub25fdm1hLCBub3QgdG8gYSBzdHJ1Y3QgYWRkcmVzc19zcGFjZTsKLSAqIHdpdGggdGhlIFBBR0VfTUFQUElOR19BTk9OIGJpdCBzZXQgdG8gZGlzdGluZ3Vpc2ggaXQuICBTZWUgcm1hcC5oLgotICoKLSAqIE9uIGFuIGFub255bW91cyBwYWdlIGluIGEgVk1fTUVSR0VBQkxFIGFyZWEsIGlmIENPTkZJR19LU00gaXMgZW5hYmxlZCwKLSAqIHRoZSBQQUdFX01BUFBJTkdfS1NNIGJpdCBtYXkgYmUgc2V0IGFsb25nIHdpdGggdGhlIFBBR0VfTUFQUElOR19BTk9OIGJpdDsKLSAqIGFuZCB0aGVuIHBhZ2UtPm1hcHBpbmcgcG9pbnRzLCBub3QgdG8gYW4gYW5vbl92bWEsIGJ1dCB0byBhIHByaXZhdGUKLSAqIHN0cnVjdHVyZSB3aGljaCBLU00gYXNzb2NpYXRlcyB3aXRoIHRoYXQgbWVyZ2VkIHBhZ2UuICBTZWUga3NtLmguCi0gKgotICogUEFHRV9NQVBQSU5HX0tTTSB3aXRob3V0IFBBR0VfTUFQUElOR19BTk9OIGlzIGN1cnJlbnRseSBuZXZlciB1c2VkLgotICoKLSAqIFBsZWFzZSBub3RlIHRoYXQsIGNvbmZ1c2luZ2x5LCAicGFnZV9tYXBwaW5nIiByZWZlcnMgdG8gdGhlIGlub2RlCi0gKiBhZGRyZXNzX3NwYWNlIHdoaWNoIG1hcHMgdGhlIHBhZ2UgZnJvbSBkaXNrOyB3aGVyZWFzICJwYWdlX21hcHBlZCIKLSAqIHJlZmVycyB0byB1c2VyIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBpbnRvIHdoaWNoIHRoZSBwYWdlIGlzIG1hcHBlZC4KLSAqLwotI2RlZmluZSBQQUdFX01BUFBJTkdfQU5PTgkxCi0jZGVmaW5lIFBBR0VfTUFQUElOR19LU00JMgotI2RlZmluZSBQQUdFX01BUFBJTkdfRkxBR1MJKFBBR0VfTUFQUElOR19BTk9OIHwgUEFHRV9NQVBQSU5HX0tTTSkKLQorZXh0ZXJuIHZvaWQgKnBhZ2Vfcm1hcHBpbmcoc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIHN0cnVjdCBhbm9uX3ZtYSAqcGFnZV9hbm9uX3ZtYShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiBleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2UgKnBhZ2VfbWFwcGluZyhzdHJ1Y3QgcGFnZSAqcGFnZSk7CiAKLS8qIE5ldXRyYWwgcGFnZS0+bWFwcGluZyBwb2ludGVyIHRvIGFkZHJlc3Nfc3BhY2Ugb3IgYW5vbl92bWEgb3Igb3RoZXIgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCAqcGFnZV9ybWFwcGluZyhzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlyZXR1cm4gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcGFnZS0+bWFwcGluZyAmIH5QQUdFX01BUFBJTkdfRkxBR1MpOwotfQotCiBleHRlcm4gc3RydWN0IGFkZHJlc3Nfc3BhY2UgKl9fcGFnZV9maWxlX21hcHBpbmcoc3RydWN0IHBhZ2UgKik7CiAKIHN0YXRpYyBpbmxpbmUKQEAgLTEwNDUsMTEgKzk2OCw2IEBACiAJcmV0dXJuIHBhZ2UtPm1hcHBpbmc7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IFBhZ2VBbm9uKHN0cnVjdCBwYWdlICpwYWdlKQotewotCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpcGFnZS0+bWFwcGluZyAmIFBBR0VfTUFQUElOR19BTk9OKSAhPSAwOwotfQotCiAvKgogICogUmV0dXJuIHRoZSBwYWdlY2FjaGUgaW5kZXggb2YgdGhlIHBhc3NlZCBwYWdlLiAgUmVndWxhciBwYWdlY2FjaGUgcGFnZXMKICAqIHVzZSAtPmluZGV4IHdoZXJlYXMgc3dhcGNhY2hlIHBhZ2VzIHVzZSAtPnByaXZhdGUKQEAgLTEyOTQsOSArMTIxMiwxMSBAQAogaW50IHJlZGlydHlfcGFnZV9mb3Jfd3JpdGVwYWdlKHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjLAogCQkJCXN0cnVjdCBwYWdlICpwYWdlKTsKIHZvaWQgYWNjb3VudF9wYWdlX2RpcnRpZWQoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKTsKK3ZvaWQgYWNjb3VudF9wYWdlX2NsZWFuZWQoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nKTsKIGludCBzZXRfcGFnZV9kaXJ0eShzdHJ1Y3QgcGFnZSAqcGFnZSk7CiBpbnQgc2V0X3BhZ2VfZGlydHlfbG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSk7CiBpbnQgY2xlYXJfcGFnZV9kaXJ0eV9mb3JfaW8oc3RydWN0IHBhZ2UgKnBhZ2UpOworCiBpbnQgZ2V0X2NtZGxpbmUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBjaGFyICpidWZmZXIsIGludCBidWZsZW4pOwogCiAvKiBJcyB0aGUgdm1hIGEgY29udGludWF0aW9uIG9mIHRoZSBzdGFjayB2bWEgYWJvdmUgaXQ/ICovCkBAIC0xOTczLDEwICsxODkzLDEwIEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKIHZtX3VubWFwcGVkX2FyZWEoc3RydWN0IHZtX3VubWFwcGVkX2FyZWFfaW5mbyAqaW5mbykKIHsKLQlpZiAoIShpbmZvLT5mbGFncyAmIFZNX1VOTUFQUEVEX0FSRUFfVE9QRE9XTikpCi0JCXJldHVybiB1bm1hcHBlZF9hcmVhKGluZm8pOwotCWVsc2UKKwlpZiAoaW5mby0+ZmxhZ3MgJiBWTV9VTk1BUFBFRF9BUkVBX1RPUERPV04pCiAJCXJldHVybiB1bm1hcHBlZF9hcmVhX3RvcGRvd24oaW5mbyk7CisJZWxzZQorCQlyZXR1cm4gdW5tYXBwZWRfYXJlYShpbmZvKTsKIH0KIAogLyogdHJ1bmNhdGUuYyAqLwpAQCAtMjEwOSw3ICsyMDI5LDcgQEAKICNkZWZpbmUgRk9MTF9GT1JDRQkweDEwCS8qIGdldF91c2VyX3BhZ2VzIHJlYWQvd3JpdGUgdy9vIHBlcm1pc3Npb24gKi8KICNkZWZpbmUgRk9MTF9OT1dBSVQJMHgyMAkvKiBpZiBhIGRpc2sgdHJhbnNmZXIgaXMgbmVlZGVkLCBzdGFydCB0aGUgSU8KIAkJCQkgKiBhbmQgcmV0dXJuIHdpdGhvdXQgd2FpdGluZyB1cG9uIGl0ICovCi0jZGVmaW5lIEZPTExfTUxPQ0sJMHg0MAkvKiBtYXJrIHBhZ2UgYXMgbWxvY2tlZCAqLworI2RlZmluZSBGT0xMX1BPUFVMQVRFCTB4NDAJLyogZmF1bHQgaW4gcGFnZSAqLwogI2RlZmluZSBGT0xMX1NQTElUCTB4ODAJLyogZG9uJ3QgcmV0dXJuIHRyYW5zaHVnZSBwYWdlcywgc3BsaXQgdGhlbSAqLwogI2RlZmluZSBGT0xMX0hXUE9JU09OCTB4MTAwCS8qIGNoZWNrIHBhZ2UgaXMgaHdwb2lzb25lZCAqLwogI2RlZmluZSBGT0xMX05VTUEJMHgyMDAJLyogZm9yY2UgTlVNQSBoaW50aW5nIHBhZ2UgZmF1bHQgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaCBiL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaAppbmRleCAxOTlhMDNhLi41OTA2MzBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCkBAIC0zNjQsNyArMzY0LDkgQEAKIAlhdG9taWNfdCBtbV91c2VyczsJCQkvKiBIb3cgbWFueSB1c2VycyB3aXRoIHVzZXIgc3BhY2U/ICovCiAJYXRvbWljX3QgbW1fY291bnQ7CQkJLyogSG93IG1hbnkgcmVmZXJlbmNlcyB0byAic3RydWN0IG1tX3N0cnVjdCIgKHVzZXJzIGNvdW50IGFzIDEpICovCiAJYXRvbWljX2xvbmdfdCBucl9wdGVzOwkJCS8qIFBURSBwYWdlIHRhYmxlIHBhZ2VzICovCisjaWYgQ09ORklHX1BHVEFCTEVfTEVWRUxTID4gMgogCWF0b21pY19sb25nX3QgbnJfcG1kczsJCQkvKiBQTUQgcGFnZSB0YWJsZSBwYWdlcyAqLworI2VuZGlmCiAJaW50IG1hcF9jb3VudDsJCQkJLyogbnVtYmVyIG9mIFZNQXMgKi8KIAogCXNwaW5sb2NrX3QgcGFnZV90YWJsZV9sb2NrOwkJLyogUHJvdGVjdHMgcGFnZSB0YWJsZXMgYW5kIHNvbWUgY291bnRlcnMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbW1jL2NvcmUuaAppbmRleCAxNjA0NDhmLi5kZTcyMmQ0ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvY29yZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2NvcmUuaApAQCAtNzksNyArNzksNyBAQAogI2RlZmluZSBtbWNfY21kX3R5cGUoY21kKQkoKGNtZCktPmZsYWdzICYgTU1DX0NNRF9NQVNLKQogCiAJdW5zaWduZWQgaW50CQlyZXRyaWVzOwkvKiBtYXggbnVtYmVyIG9mIHJldHJpZXMgKi8KLQl1bnNpZ25lZCBpbnQJCWVycm9yOwkJLyogY29tbWFuZCBlcnJvciAqLworCWludAkJCWVycm9yOwkJLyogY29tbWFuZCBlcnJvciAqLwogCiAvKgogICogU3RhbmRhcmQgZXJybm8gdmFsdWVzIGFyZSB1c2VkIGZvciBlcnJvcnMsIGJ1dCBzb21lIGhhdmUgc3BlY2lmaWMKQEAgLTEwOCw3ICsxMDgsNyBAQAogCXVuc2lnbmVkIGludAkJdGltZW91dF9jbGtzOwkvKiBkYXRhIHRpbWVvdXQgKGluIGNsb2NrcykgKi8KIAl1bnNpZ25lZCBpbnQJCWJsa3N6OwkJLyogZGF0YSBibG9jayBzaXplICovCiAJdW5zaWduZWQgaW50CQlibG9ja3M7CQkvKiBudW1iZXIgb2YgYmxvY2tzICovCi0JdW5zaWduZWQgaW50CQllcnJvcjsJCS8qIGRhdGEgZXJyb3IgKi8KKwlpbnQJCQllcnJvcjsJCS8qIGRhdGEgZXJyb3IgKi8KIAl1bnNpZ25lZCBpbnQJCWZsYWdzOwogCiAjZGVmaW5lIE1NQ19EQVRBX1dSSVRFCSgxIDw8IDgpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9kd19tbWMuaCBiL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCmluZGV4IDQ3MWZiMzEuLjEyMTExOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL2R3X21tYy5oCkBAIC00NCw2ICs0NCw3IEBACiAgKiBzdHJ1Y3QgZHdfbWNpIC0gTU1DIGNvbnRyb2xsZXIgc3RhdGUgc2hhcmVkIGJldHdlZW4gYWxsIHNsb3RzCiAgKiBAbG9jazogU3BpbmxvY2sgcHJvdGVjdGluZyB0aGUgcXVldWUgYW5kIGFzc29jaWF0ZWQgZGF0YS4KICAqIEByZWdzOiBQb2ludGVyIHRvIE1NSU8gcmVnaXN0ZXJzLgorICogQGZpZm9fcmVnOiBQb2ludGVyIHRvIE1NSU8gcmVnaXN0ZXJzIGZvciBkYXRhIEZJRk8KICAqIEBzZzogU2NhdHRlcmxpc3QgZW50cnkgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBieSBQSU8gY29kZSwgaWYgYW55LgogICogQHNnX21pdGVyOiBQSU8gbWFwcGluZyBzY2F0dGVybGlzdCBpdGVyYXRvci4KICAqIEBjdXJfc2xvdDogVGhlIHNsb3Qgd2hpY2ggaXMgY3VycmVudGx5IHVzaW5nIHRoZSBjb250cm9sbGVyLgpAQCAtNzksNyArODAsNiBAQAogICogQGN1cnJlbnRfc3BlZWQ6IENvbmZpZ3VyZWQgcmF0ZSBvZiB0aGUgY29udHJvbGxlci4KICAqIEBudW1fc2xvdHM6IE51bWJlciBvZiBzbG90cyBhdmFpbGFibGUuCiAgKiBAdmVyaWQ6IERlbm90ZSBWZXJzaW9uIElELgotICogQGRhdGFfb2Zmc2V0OiBTZXQgdGhlIG9mZnNldCBvZiBEQVRBIHJlZ2lzdGVyIGFjY29yZGluZyB0byBWRVJJRC4KICAqIEBkZXY6IERldmljZSBhc3NvY2lhdGVkIHdpdGggdGhlIE1NQyBjb250cm9sbGVyLgogICogQHBkYXRhOiBQbGF0Zm9ybSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgTU1DIGNvbnRyb2xsZXIuCiAgKiBAZHJ2X2RhdGE6IERyaXZlciBzcGVjaWZpYyBkYXRhIGZvciBpZGVudGlmaWVkIHZhcmlhbnQgb2YgdGhlIGNvbnRyb2xsZXIKQEAgLTEzMiw2ICsxMzIsNyBAQAogCXNwaW5sb2NrX3QJCWxvY2s7CiAJc3BpbmxvY2tfdAkJaXJxX2xvY2s7CiAJdm9pZCBfX2lvbWVtCQkqcmVnczsKKwl2b2lkIF9faW9tZW0JCSpmaWZvX3JlZzsKIAogCXN0cnVjdCBzY2F0dGVybGlzdAkqc2c7CiAJc3RydWN0IHNnX21hcHBpbmdfaXRlcglzZ19taXRlcjsKQEAgLTE3Miw3ICsxNzMsNiBAQAogCXUzMgkJCW51bV9zbG90czsKIAl1MzIJCQlmaWZvdGhfdmFsOwogCXUxNgkJCXZlcmlkOwotCXUxNgkJCWRhdGFfb2Zmc2V0OwogCXN0cnVjdCBkZXZpY2UJCSpkZXY7CiAJc3RydWN0IGR3X21jaV9ib2FyZAkqcGRhdGE7CiAJY29uc3Qgc3RydWN0IGR3X21jaV9kcnZfZGF0YQkqZHJ2X2RhdGE7CkBAIC0yMDIsNiArMjAyLDggQEAKIAlpbnQJCQlpcnE7CiAKIAlpbnQJCQlzZGlvX2lkMDsKKworCXN0cnVjdCB0aW1lcl9saXN0ICAgICAgIGNtZDExX3RpbWVyOwogfTsKIAogLyogRE1BIG9wcyBmb3IgSW50ZXJuYWwvRXh0ZXJuYWwgRE1BQyBpbnRlcmZhY2UgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaCBiL2luY2x1ZGUvbGludXgvbW1jL2hvc3QuaAppbmRleCAwYzhjYmU1Li5iNWJlZGFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9ob3N0LmgKKysrIGIvaW5jbHVkZS9saW51eC9tbWMvaG9zdC5oCkBAIC04MCwxMiArODAsNiBAQAogCiBzdHJ1Y3QgbW1jX2hvc3Rfb3BzIHsKIAkvKgotCSAqICdlbmFibGUnIGlzIGNhbGxlZCB3aGVuIHRoZSBob3N0IGlzIGNsYWltZWQgYW5kICdkaXNhYmxlJyBpcyBjYWxsZWQKLQkgKiB3aGVuIHRoZSBob3N0IGlzIHJlbGVhc2VkLiAnZW5hYmxlJyBhbmQgJ2Rpc2FibGUnIGFyZSBkZXByZWNhdGVkLgotCSAqLwotCWludCAoKmVuYWJsZSkoc3RydWN0IG1tY19ob3N0ICpob3N0KTsKLQlpbnQgKCpkaXNhYmxlKShzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpOwotCS8qCiAJICogSXQgaXMgb3B0aW9uYWwgZm9yIHRoZSBob3N0IHRvIGltcGxlbWVudCBwcmVfcmVxIGFuZCBwb3N0X3JlcSBpbgogCSAqIG9yZGVyIHRvIHN1cHBvcnQgZG91YmxlIGJ1ZmZlcmluZyBvZiByZXF1ZXN0cyAocHJlcGFyZSBvbmUKIAkgKiByZXF1ZXN0IHdoaWxlIGFub3RoZXIgcmVxdWVzdCBpcyBhY3RpdmUpLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2RoY2ktc3BlYXIuaCBiL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLXNwZWFyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYzA5NWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvc2RoY2ktc3BlYXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBpbmNsdWRlL2xpbnV4L21tYy9zZGhjaS1zcGVhci5oCi0gKgotICogU0RIQ0kgZGVjbGFyYXRpb25zIHNwZWNpZmljIHRvIFNUIFNQRUFyIHBsYXRmb3JtCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFNUIE1pY3JvZWxlY3Ryb25pY3MKLSAqIFZpcmVzaCBLdW1hciA8dmlyZXNoLmxpbnV4QGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueQotICogd2FycmFudHkgb2YgYW55IGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICovCi0KLSNpZm5kZWYgTElOVVhfTU1DX1NESENJX1NQRUFSX0gKLSNkZWZpbmUgTElOVVhfTU1DX1NESENJX1NQRUFSX0gKLQotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotLyoKLSAqIHN0cnVjdCBzZGhjaV9wbGF0X2RhdGE6IHNwZWFyIHNkaGNpIHBsYXRmb3JtIGRhdGEgc3RydWN0dXJlCi0gKgotICogY2FyZF9pbnRfZ3BpbzogZ3BpbyBwaW4gdXNlZCBmb3IgY2FyZCBkZXRlY3Rpb24KLSAqLwotc3RydWN0IHNkaGNpX3BsYXRfZGF0YSB7Ci0JaW50IGNhcmRfaW50X2dwaW87Ci19OwotCi0vKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHBsYXRmb3JtX2RhdGEgZmllbGQgb2YgcGRldi0+ZGV2ICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNkaGNpX3NldF9wbGF0X2RhdGEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IHNkaGNpX3BsYXRfZGF0YSAqZGF0YSkKLXsKLQlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IGRhdGE7Ci19Ci0KLSNlbmRpZiAvKiBMSU5VWF9NTUNfU0RIQ0lfU1BFQVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvc2RoY2kuaCBiL2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZTNkYjEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9tbWMvc2RoY2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKgotICogIGxpbnV4L2luY2x1ZGUvbGludXgvbW1jL3NkaGNpLmggLSBTZWN1cmUgRGlnaXRhbCBIb3N0IENvbnRyb2xsZXIgSW50ZXJmYWNlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNS0yMDA4IFBpZXJyZSBPc3NtYW4sIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQKLSAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotI2lmbmRlZiBMSU5VWF9NTUNfU0RIQ0lfSAotI2RlZmluZSBMSU5VWF9NTUNfU0RIQ0lfSAotCi0jaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotCi1zdHJ1Y3Qgc2RoY2lfaG9zdF9uZXh0IHsKLQl1bnNpZ25lZCBpbnQJc2dfY291bnQ7Ci0JczMyCQljb29raWU7Ci19OwotCi1zdHJ1Y3Qgc2RoY2lfaG9zdCB7Ci0JLyogRGF0YSBzZXQgYnkgaGFyZHdhcmUgaW50ZXJmYWNlIGRyaXZlciAqLwotCWNvbnN0IGNoYXIgKmh3X25hbWU7CS8qIEhhcmR3YXJlIGJ1cyBuYW1lICovCi0KLQl1bnNpZ25lZCBpbnQgcXVpcmtzOwkvKiBEZXZpYXRpb25zIGZyb20gc3BlYy4gKi8KLQotLyogQ29udHJvbGxlciBkb2Vzbid0IGhvbm9yIHJlc2V0cyB1bmxlc3Mgd2UgdG91Y2ggdGhlIGNsb2NrIHJlZ2lzdGVyICovCi0jZGVmaW5lIFNESENJX1FVSVJLX0NMT0NLX0JFRk9SRV9SRVNFVAkJCSgxPDwwKQotLyogQ29udHJvbGxlciBoYXMgYmFkIGNhcHMgYml0cywgYnV0IHJlYWxseSBzdXBwb3J0cyBETUEgKi8KLSNkZWZpbmUgU0RIQ0lfUVVJUktfRk9SQ0VfRE1BCQkJCSgxPDwxKQotLyogQ29udHJvbGxlciBkb2Vzbid0IGxpa2UgdG8gYmUgcmVzZXQgd2hlbiB0aGVyZSBpcyBubyBjYXJkIGluc2VydGVkLiAqLwotI2RlZmluZSBTREhDSV9RVUlSS19OT19DQVJEX05PX1JFU0VUCQkJKDE8PDIpCi0vKiBDb250cm9sbGVyIGRvZXNuJ3QgbGlrZSBjbGVhcmluZyB0aGUgcG93ZXIgcmVnIGJlZm9yZSBhIGNoYW5nZSAqLwotI2RlZmluZSBTREhDSV9RVUlSS19TSU5HTEVfUE9XRVJfV1JJVEUJCQkoMTw8MykKLS8qIENvbnRyb2xsZXIgaGFzIGZsYWt5IGludGVybmFsIHN0YXRlIHNvIHJlc2V0IGl0IG9uIGVhY2ggaW9zIGNoYW5nZSAqLwotI2RlZmluZSBTREhDSV9RVUlSS19SRVNFVF9DTURfREFUQV9PTl9JT1MJCSgxPDw0KQotLyogQ29udHJvbGxlciBoYXMgYW4gdW51c2FibGUgRE1BIGVuZ2luZSAqLwotI2RlZmluZSBTREhDSV9RVUlSS19CUk9LRU5fRE1BCQkJCSgxPDw1KQotLyogQ29udHJvbGxlciBoYXMgYW4gdW51c2FibGUgQURNQSBlbmdpbmUgKi8KLSNkZWZpbmUgU0RIQ0lfUVVJUktfQlJPS0VOX0FETUEJCQkJKDE8PDYpCi0vKiBDb250cm9sbGVyIGNhbiBvbmx5IERNQSBmcm9tIDMyLWJpdCBhbGlnbmVkIGFkZHJlc3NlcyAqLwotI2RlZmluZSBTREhDSV9RVUlSS18zMkJJVF9ETUFfQUREUgkJCSgxPDw3KQotLyogQ29udHJvbGxlciBjYW4gb25seSBETUEgY2h1bmsgc2l6ZXMgdGhhdCBhcmUgYSBtdWx0aXBsZSBvZiAzMiBiaXRzICovCi0jZGVmaW5lIFNESENJX1FVSVJLXzMyQklUX0RNQV9TSVpFCQkJKDE8PDgpCi0vKiBDb250cm9sbGVyIGNhbiBvbmx5IEFETUEgY2h1bmtzIHRoYXQgYXJlIGEgbXVsdGlwbGUgb2YgMzIgYml0cyAqLwotI2RlZmluZSBTREhDSV9RVUlSS18zMkJJVF9BRE1BX1NJWkUJCQkoMTw8OSkKLS8qIENvbnRyb2xsZXIgbmVlZHMgdG8gYmUgcmVzZXQgYWZ0ZXIgZWFjaCByZXF1ZXN0IHRvIHN0YXkgc3RhYmxlICovCi0jZGVmaW5lIFNESENJX1FVSVJLX1JFU0VUX0FGVEVSX1JFUVVFU1QJCQkoMTw8MTApCi0vKiBDb250cm9sbGVyIG5lZWRzIHZvbHRhZ2UgYW5kIHBvd2VyIHdyaXRlcyB0byBoYXBwZW4gc2VwYXJhdGVseSAqLwotI2RlZmluZSBTREhDSV9RVUlSS19OT19TSU1VTFRfVkREX0FORF9QT1dFUgkJKDE8PDExKQotLyogQ29udHJvbGxlciBwcm92aWRlcyBhbiBpbmNvcnJlY3QgdGltZW91dCB2YWx1ZSBmb3IgdHJhbnNmZXJzICovCi0jZGVmaW5lIFNESENJX1FVSVJLX0JST0tFTl9USU1FT1VUX1ZBTAkJCSgxPDwxMikKLS8qIENvbnRyb2xsZXIgaGFzIGFuIGlzc3VlIHdpdGggYnVmZmVyIGJpdHMgZm9yIHNtYWxsIHRyYW5zZmVycyAqLwotI2RlZmluZSBTREhDSV9RVUlSS19CUk9LRU5fU01BTExfUElPCQkJKDE8PDEzKQotLyogQ29udHJvbGxlciBkb2VzIG5vdCBwcm92aWRlIHRyYW5zZmVyLWNvbXBsZXRlIGludGVycnVwdCB3aGVuIG5vdCBidXN5ICovCi0jZGVmaW5lIFNESENJX1FVSVJLX05PX0JVU1lfSVJRCQkJCSgxPDwxNCkKLS8qIENvbnRyb2xsZXIgaGFzIHVucmVsaWFibGUgY2FyZCBkZXRlY3Rpb24gKi8KLSNkZWZpbmUgU0RIQ0lfUVVJUktfQlJPS0VOX0NBUkRfREVURUNUSU9OCQkoMTw8MTUpCi0vKiBDb250cm9sbGVyIHJlcG9ydHMgaW52ZXJ0ZWQgd3JpdGUtcHJvdGVjdCBzdGF0ZSAqLwotI2RlZmluZSBTREhDSV9RVUlSS19JTlZFUlRFRF9XUklURV9QUk9URUNUCQkoMTw8MTYpCi0vKiBDb250cm9sbGVyIGRvZXMgbm90IGxpa2UgZmFzdCBQSU8gdHJhbnNmZXJzICovCi0jZGVmaW5lIFNESENJX1FVSVJLX1BJT19ORUVEU19ERUxBWQkJCSgxPDwxOCkKLS8qIENvbnRyb2xsZXIgaGFzIHRvIGJlIGZvcmNlZCB0byB1c2UgYmxvY2sgc2l6ZSBvZiAyMDQ4IGJ5dGVzICovCi0jZGVmaW5lIFNESENJX1FVSVJLX0ZPUkNFX0JMS19TWl8yMDQ4CQkJKDE8PDIwKQotLyogQ29udHJvbGxlciBjYW5ub3QgZG8gbXVsdGktYmxvY2sgdHJhbnNmZXJzICovCi0jZGVmaW5lIFNESENJX1FVSVJLX05PX01VTFRJQkxPQ0sJCQkoMTw8MjEpCi0vKiBDb250cm9sbGVyIGNhbiBvbmx5IGhhbmRsZSAxLWJpdCBkYXRhIHRyYW5zZmVycyAqLwotI2RlZmluZSBTREhDSV9RVUlSS19GT1JDRV8xX0JJVF9EQVRBCQkJKDE8PDIyKQotLyogQ29udHJvbGxlciBuZWVkcyAxMG1zIGRlbGF5IGJldHdlZW4gYXBwbHlpbmcgcG93ZXIgYW5kIGNsb2NrICovCi0jZGVmaW5lIFNESENJX1FVSVJLX0RFTEFZX0FGVEVSX1BPV0VSCQkJKDE8PDIzKQotLyogQ29udHJvbGxlciB1c2VzIFNEQ0xLIGluc3RlYWQgb2YgVE1DTEsgZm9yIGRhdGEgdGltZW91dHMgKi8KLSNkZWZpbmUgU0RIQ0lfUVVJUktfREFUQV9USU1FT1VUX1VTRVNfU0RDTEsJCSgxPDwyNCkKLS8qIENvbnRyb2xsZXIgcmVwb3J0cyB3cm9uZyBiYXNlIGNsb2NrIGNhcGFiaWxpdHkgKi8KLSNkZWZpbmUgU0RIQ0lfUVVJUktfQ0FQX0NMT0NLX0JBU0VfQlJPS0VOCQkoMTw8MjUpCi0vKiBDb250cm9sbGVyIGNhbm5vdCBzdXBwb3J0IEVuZCBBdHRyaWJ1dGUgaW4gTk9QIEFETUEgZGVzY3JpcHRvciAqLwotI2RlZmluZSBTREhDSV9RVUlSS19OT19FTkRBVFRSX0lOX05PUERFU0MJCSgxPDwyNikKLS8qIENvbnRyb2xsZXIgaXMgbWlzc2luZyBkZXZpY2UgY2Fwcy4gVXNlIGNhcHMgcHJvdmlkZWQgYnkgaG9zdCAqLwotI2RlZmluZSBTREhDSV9RVUlSS19NSVNTSU5HX0NBUFMJCQkoMTw8MjcpCi0vKiBDb250cm9sbGVyIHVzZXMgQXV0byBDTUQxMiBjb21tYW5kIHRvIHN0b3AgdGhlIHRyYW5zZmVyICovCi0jZGVmaW5lIFNESENJX1FVSVJLX01VTFRJQkxPQ0tfUkVBRF9BQ01EMTIJCSgxPDwyOCkKLS8qIENvbnRyb2xsZXIgZG9lc24ndCBoYXZlIEhJU1BEIGJpdCBmaWVsZCBpbiBISS1TUEVFRCBTRCBjYXJkICovCi0jZGVmaW5lIFNESENJX1FVSVJLX05PX0hJU1BEX0JJVAkJCSgxPDwyOSkKLS8qIENvbnRyb2xsZXIgdHJlYXRzIEFETUEgZGVzY3JpcHRvcnMgd2l0aCBsZW5ndGggMDAwMGggaW5jb3JyZWN0bHkgKi8KLSNkZWZpbmUgU0RIQ0lfUVVJUktfQlJPS0VOX0FETUFfWkVST0xFTl9ERVNDCQkoMTw8MzApCi0vKiBUaGUgcmVhZC1vbmx5IGRldGVjdGlvbiB2aWEgU0RIQ0lfUFJFU0VOVF9TVEFURSByZWdpc3RlciBpcyB1bnN0YWJsZSAqLwotI2RlZmluZSBTREhDSV9RVUlSS19VTlNUQUJMRV9ST19ERVRFQ1QJCQkoMTw8MzEpCi0KLQl1bnNpZ25lZCBpbnQgcXVpcmtzMjsJLyogTW9yZSBkZXZpYXRpb25zIGZyb20gc3BlYy4gKi8KLQotI2RlZmluZSBTREhDSV9RVUlSSzJfSE9TVF9PRkZfQ0FSRF9PTgkJCSgxPDwwKQotI2RlZmluZSBTREhDSV9RVUlSSzJfSE9TVF9OT19DTUQyMwkJCSgxPDwxKQotLyogVGhlIHN5c3RlbSBwaHlzaWNhbGx5IGRvZXNuJ3Qgc3VwcG9ydCAxLjh2LCBldmVuIGlmIHRoZSBob3N0IGRvZXMgKi8KLSNkZWZpbmUgU0RIQ0lfUVVJUksyX05PXzFfOF9WCQkJCSgxPDwyKQotI2RlZmluZSBTREhDSV9RVUlSSzJfUFJFU0VUX1ZBTFVFX0JST0tFTgkJKDE8PDMpCi0jZGVmaW5lIFNESENJX1FVSVJLMl9DQVJEX09OX05FRURTX0JVU19PTgkJKDE8PDQpCi0vKiBDb250cm9sbGVyIGhhcyBhIG5vbi1zdGFuZGFyZCBob3N0IGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUgU0RIQ0lfUVVJUksyX0JST0tFTl9IT1NUX0NPTlRST0wJCSgxPDw1KQotLyogQ29udHJvbGxlciBkb2VzIG5vdCBzdXBwb3J0IEhTMjAwICovCi0jZGVmaW5lIFNESENJX1FVSVJLMl9CUk9LRU5fSFMyMDAJCQkoMTw8NikKLS8qIENvbnRyb2xsZXIgZG9lcyBub3Qgc3VwcG9ydCBERFI1MCAqLwotI2RlZmluZSBTREhDSV9RVUlSSzJfQlJPS0VOX0REUjUwCQkJKDE8PDcpCi0vKiBTdG9wIGNvbW1hbmQgKENNRDEyKSBjYW4gc2V0IFRyYW5zZmVyIENvbXBsZXRlIHdoZW4gbm90IHVzaW5nIE1NQ19SU1BfQlVTWSAqLwotI2RlZmluZSBTREhDSV9RVUlSSzJfU1RPUF9XSVRIX1RDCQkJKDE8PDgpCi0vKiBDb250cm9sbGVyIGRvZXMgbm90IHN1cHBvcnQgNjQtYml0IERNQSAqLwotI2RlZmluZSBTREhDSV9RVUlSSzJfQlJPS0VOXzY0X0JJVF9ETUEJCQkoMTw8OSkKLS8qIG5lZWQgY2xlYXIgdHJhbnNmZXIgbW9kZSByZWdpc3RlciBiZWZvcmUgc2VuZCBjbWQgKi8KLSNkZWZpbmUgU0RIQ0lfUVVJUksyX0NMRUFSX1RSQU5TRkVSTU9ERV9SRUdfQkVGT1JFX0NNRAkoMTw8MTApCi0vKiBDYXBhYmlsaXR5IHJlZ2lzdGVyIGJpdC02MyBpbmRpY2F0ZXMgSFM0MDAgc3VwcG9ydCAqLwotI2RlZmluZSBTREhDSV9RVUlSSzJfQ0FQU19CSVQ2M19GT1JfSFM0MDAJCSgxPDwxMSkKLS8qIGZvcmNlZCB0dW5lZCBjbG9jayAqLwotI2RlZmluZSBTREhDSV9RVUlSSzJfVFVOSU5HX1dPUktfQVJPVU5ECQkJKDE8PDEyKQotLyogZGlzYWJsZSB0aGUgYmxvY2sgY291bnQgZm9yIHNpbmdsZSBibG9jayB0cmFuc2FjdGlvbnMgKi8KLSNkZWZpbmUgU0RIQ0lfUVVJUksyX1NVUFBPUlRfU0lOR0xFCQkJKDE8PDEzKQotCi0JaW50IGlycTsJCS8qIERldmljZSBJUlEgKi8KLQl2b2lkIF9faW9tZW0gKmlvYWRkcjsJLyogTWFwcGVkIGFkZHJlc3MgKi8KLQotCWNvbnN0IHN0cnVjdCBzZGhjaV9vcHMgKm9wczsJLyogTG93IGxldmVsIGh3IGludGVyZmFjZSAqLwotCi0JLyogSW50ZXJuYWwgZGF0YSAqLwotCXN0cnVjdCBtbWNfaG9zdCAqbW1jOwkvKiBNTUMgc3RydWN0dXJlICovCi0JdTY0IGRtYV9tYXNrOwkJLyogY3VzdG9tIERNQSBtYXNrICovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19MRURTX0NMQVNTKSB8fCBkZWZpbmVkKENPTkZJR19MRURTX0NMQVNTX01PRFVMRSkKLQlzdHJ1Y3QgbGVkX2NsYXNzZGV2IGxlZDsJLyogTEVEIGNvbnRyb2wgKi8KLQljaGFyIGxlZF9uYW1lWzMyXTsKLSNlbmRpZgotCi0Jc3BpbmxvY2tfdCBsb2NrOwkvKiBNdXRleCAqLwotCi0JaW50IGZsYWdzOwkJLyogSG9zdCBhdHRyaWJ1dGVzICovCi0jZGVmaW5lIFNESENJX1VTRV9TRE1BCQkoMTw8MCkJLyogSG9zdCBpcyBTRE1BIGNhcGFibGUgKi8KLSNkZWZpbmUgU0RIQ0lfVVNFX0FETUEJCSgxPDwxKQkvKiBIb3N0IGlzIEFETUEgY2FwYWJsZSAqLwotI2RlZmluZSBTREhDSV9SRVFfVVNFX0RNQQkoMTw8MikJLyogVXNlIERNQSBmb3IgdGhpcyByZXEuICovCi0jZGVmaW5lIFNESENJX0RFVklDRV9ERUFECSgxPDwzKQkvKiBEZXZpY2UgdW5yZXNwb25zaXZlICovCi0jZGVmaW5lIFNESENJX1NEUjUwX05FRURTX1RVTklORyAoMTw8NCkJLyogU0RSNTAgbmVlZHMgdHVuaW5nICovCi0jZGVmaW5lIFNESENJX05FRURTX1JFVFVOSU5HCSgxPDw1KQkvKiBIb3N0IG5lZWRzIHJldHVuaW5nICovCi0jZGVmaW5lIFNESENJX0FVVE9fQ01EMTIJKDE8PDYpCS8qIEF1dG8gQ01EMTIgc3VwcG9ydCAqLwotI2RlZmluZSBTREhDSV9BVVRPX0NNRDIzCSgxPDw3KQkvKiBBdXRvIENNRDIzIHN1cHBvcnQgKi8KLSNkZWZpbmUgU0RIQ0lfUFZfRU5BQkxFRAkoMTw8OCkJLyogUHJlc2V0IHZhbHVlIGVuYWJsZWQgKi8KLSNkZWZpbmUgU0RIQ0lfU0RJT19JUlFfRU5BQkxFRAkoMTw8OSkJLyogU0RJTyBpcnEgZW5hYmxlZCAqLwotI2RlZmluZSBTREhDSV9TRFIxMDRfTkVFRFNfVFVOSU5HICgxPDwxMCkJLyogU0RSMTA0L0hTMjAwIG5lZWRzIHR1bmluZyAqLwotI2RlZmluZSBTREhDSV9VU0lOR19SRVRVTklOR19USU1FUiAoMTw8MTEpCS8qIEhvc3QgaXMgdXNpbmcgYSByZXR1bmluZyB0aW1lciBmb3IgdGhlIGNhcmQgKi8KLSNkZWZpbmUgU0RIQ0lfVVNFXzY0X0JJVF9ETUEJKDE8PDEyKQkvKiBVc2UgNjQtYml0IERNQSAqLwotI2RlZmluZSBTREhDSV9IUzQwMF9UVU5JTkcJKDE8PDEzKQkvKiBUdW5pbmcgZm9yIEhTNDAwICovCi0KLQl1bnNpZ25lZCBpbnQgdmVyc2lvbjsJLyogU0RIQ0kgc3BlYy4gdmVyc2lvbiAqLwotCi0JdW5zaWduZWQgaW50IG1heF9jbGs7CS8qIE1heCBwb3NzaWJsZSBmcmVxIChNSHopICovCi0JdW5zaWduZWQgaW50IHRpbWVvdXRfY2xrOwkvKiBUaW1lb3V0IGZyZXEgKEtIeikgKi8KLQl1bnNpZ25lZCBpbnQgY2xrX211bDsJLyogQ2xvY2sgTXVsaXBsaWVyIHZhbHVlICovCi0KLQl1bnNpZ25lZCBpbnQgY2xvY2s7CS8qIEN1cnJlbnQgY2xvY2sgKE1IeikgKi8KLQl1OCBwd3I7CQkJLyogQ3VycmVudCB2b2x0YWdlICovCi0KLQlib29sIHJ1bnRpbWVfc3VzcGVuZGVkOwkvKiBIb3N0IGlzIHJ1bnRpbWUgc3VzcGVuZGVkICovCi0JYm9vbCBidXNfb247CQkvKiBCdXMgcG93ZXIgcHJldmVudHMgcnVudGltZSBzdXNwZW5kICovCi0JYm9vbCBwcmVzZXRfZW5hYmxlZDsJLyogUHJlc2V0IGlzIGVuYWJsZWQgKi8KLQotCXN0cnVjdCBtbWNfcmVxdWVzdCAqbXJxOwkvKiBDdXJyZW50IHJlcXVlc3QgKi8KLQlzdHJ1Y3QgbW1jX2NvbW1hbmQgKmNtZDsJLyogQ3VycmVudCBjb21tYW5kICovCi0Jc3RydWN0IG1tY19kYXRhICpkYXRhOwkvKiBDdXJyZW50IGRhdGEgcmVxdWVzdCAqLwotCXVuc2lnbmVkIGludCBkYXRhX2Vhcmx5OjE7CS8qIERhdGEgZmluaXNoZWQgYmVmb3JlIGNtZCAqLwotCXVuc2lnbmVkIGludCBidXN5X2hhbmRsZToxOwkvKiBIYW5kbGluZyB0aGUgb3JkZXIgb2YgQnVzeS1lbmQgKi8KLQotCXN0cnVjdCBzZ19tYXBwaW5nX2l0ZXIgc2dfbWl0ZXI7CS8qIFNHIHN0YXRlIGZvciBQSU8gKi8KLQl1bnNpZ25lZCBpbnQgYmxvY2tzOwkvKiByZW1haW5pbmcgUElPIGJsb2NrcyAqLwotCi0JaW50IHNnX2NvdW50OwkJLyogTWFwcGVkIHNnIGVudHJpZXMgKi8KLQotCXZvaWQgKmFkbWFfdGFibGU7CS8qIEFETUEgZGVzY3JpcHRvciB0YWJsZSAqLwotCXZvaWQgKmFsaWduX2J1ZmZlcjsJLyogQm91bmNlIGJ1ZmZlciAqLwotCi0Jc2l6ZV90IGFkbWFfdGFibGVfc3o7CS8qIEFETUEgZGVzY3JpcHRvciB0YWJsZSBzaXplICovCi0Jc2l6ZV90IGFsaWduX2J1ZmZlcl9zejsJLyogQm91bmNlIGJ1ZmZlciBzaXplICovCi0KLQlkbWFfYWRkcl90IGFkbWFfYWRkcjsJLyogTWFwcGVkIEFETUEgZGVzY3IuIHRhYmxlICovCi0JZG1hX2FkZHJfdCBhbGlnbl9hZGRyOwkvKiBNYXBwZWQgYm91bmNlIGJ1ZmZlciAqLwotCi0JdW5zaWduZWQgaW50IGRlc2Nfc3o7CS8qIEFETUEgZGVzY3JpcHRvciBzaXplICovCi0JdW5zaWduZWQgaW50IGFsaWduX3N6OwkvKiBBRE1BIGFsaWdubWVudCAqLwotCXVuc2lnbmVkIGludCBhbGlnbl9tYXNrOwkvKiBBRE1BIGFsaWdubWVudCBtYXNrICovCi0KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgZmluaXNoX3Rhc2tsZXQ7CS8qIFRhc2tsZXQgc3RydWN0dXJlcyAqLwotCi0Jc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CS8qIFRpbWVyIGZvciB0aW1lb3V0cyAqLwotCi0JdTMyIGNhcHM7CQkvKiBBbHRlcm5hdGl2ZSBDQVBBQklMSVRZXzAgKi8KLQl1MzIgY2FwczE7CQkvKiBBbHRlcm5hdGl2ZSBDQVBBQklMSVRZXzEgKi8KLQotCXVuc2lnbmVkIGludCAgICAgICAgICAgIG9jcl9hdmFpbF9zZGlvOwkvKiBPQ1IgYml0IG1hc2tzICovCi0JdW5zaWduZWQgaW50ICAgICAgICAgICAgb2NyX2F2YWlsX3NkOwotCXVuc2lnbmVkIGludCAgICAgICAgICAgIG9jcl9hdmFpbF9tbWM7Ci0JdTMyIG9jcl9tYXNrOwkJLyogYXZhaWxhYmxlIHZvbHRhZ2VzICovCi0KLQl1bnNpZ25lZAkJdGltaW5nOwkJLyogQ3VycmVudCB0aW1pbmcgKi8KLQotCXUzMgkJCXRocmVhZF9pc3I7Ci0KLQkvKiBjYWNoZWQgcmVnaXN0ZXJzICovCi0JdTMyCQkJaWVyOwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3QJYnVmX3JlYWR5X2ludDsJLyogV2FpdHF1ZXVlIGZvciBCdWZmZXIgUmVhZCBSZWFkeSBpbnRlcnJ1cHQgKi8KLQl1bnNpZ25lZCBpbnQJCXR1bmluZ19kb25lOwkvKiBDb25kaXRpb24gZmxhZyBzZXQgd2hlbiBDTUQxOSBzdWNjZWVkcyAqLwotCi0JdW5zaWduZWQgaW50CQl0dW5pbmdfY291bnQ7CS8qIFRpbWVyIGNvdW50IGZvciByZS10dW5pbmcgKi8KLQl1bnNpZ25lZCBpbnQJCXR1bmluZ19tb2RlOwkvKiBSZS10dW5pbmcgbW9kZSBzdXBwb3J0ZWQgYnkgaG9zdCAqLwotI2RlZmluZSBTREhDSV9UVU5JTkdfTU9ERV8xCTAKLQlzdHJ1Y3QgdGltZXJfbGlzdAl0dW5pbmdfdGltZXI7CS8qIFRpbWVyIGZvciB0dW5pbmcgKi8KLQotCXN0cnVjdCBzZGhjaV9ob3N0X25leHQJbmV4dF9kYXRhOwotCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZVswXSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7Ci19OwotI2VuZGlmIC8qIExJTlVYX01NQ19TREhDSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tYy9zZGlvX2lkcy5oIGIvaW5jbHVkZS9saW51eC9tbWMvc2Rpb19pZHMuaAppbmRleCA5OTY4MDc5Li44MzQzMGYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tYy9zZGlvX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbW1jL3NkaW9faWRzLmgKQEAgLTMzLDYgKzMzLDggQEAKICNkZWZpbmUgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDMzNDEJCTB4YTk0ZAogI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzM1XzQzMzkJMHg0MzM1CiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzYyCQkweGE5NjIKKyNkZWZpbmUgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDM0MzAJCTB4YTlhNgorI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzQ1CQkweDQzNDUKICNkZWZpbmUgU0RJT19ERVZJQ0VfSURfQlJPQURDT01fNDM1NAkJMHg0MzU0CiAKICNkZWZpbmUgU0RJT19WRU5ET1JfSURfSU5URUwJCQkweDAwODkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW16b25lLmggYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCmluZGV4IGYyNzlkOWMuLjU0ZDc0ZjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW16b25lLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtNDc0LDE2ICs0NzQsMTUgQEAKIAl1bnNpZ25lZCBsb25nCQl3YWl0X3RhYmxlX2JpdHM7CiAKIAlaT05FX1BBRERJTkcoX3BhZDFfKQotCi0JLyogV3JpdGUtaW50ZW5zaXZlIGZpZWxkcyB1c2VkIGZyb20gdGhlIHBhZ2UgYWxsb2NhdG9yICovCi0Jc3BpbmxvY2tfdAkJbG9jazsKLQogCS8qIGZyZWUgYXJlYXMgb2YgZGlmZmVyZW50IHNpemVzICovCiAJc3RydWN0IGZyZWVfYXJlYQlmcmVlX2FyZWFbTUFYX09SREVSXTsKIAogCS8qIHpvbmUgZmxhZ3MsIHNlZSBiZWxvdyAqLwogCXVuc2lnbmVkIGxvbmcJCWZsYWdzOwogCisJLyogV3JpdGUtaW50ZW5zaXZlIGZpZWxkcyB1c2VkIGZyb20gdGhlIHBhZ2UgYWxsb2NhdG9yICovCisJc3BpbmxvY2tfdAkJbG9jazsKKwogCVpPTkVfUEFERElORyhfcGFkMl8pCiAKIAkvKiBXcml0ZS1pbnRlbnNpdmUgZmllbGRzIHVzZWQgYnkgcGFnZSByZWNsYWltICovCkBAIC04NDMsMTYgKzg0MiwxNiBAQAogCiBleHRlcm4gaW50IG1vdmFibGVfem9uZTsKIAorI2lmZGVmIENPTkZJR19ISUdITUVNCiBzdGF0aWMgaW5saW5lIGludCB6b25lX21vdmFibGVfaXNfaGlnaG1lbSh2b2lkKQogewotI2lmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pICYmIGRlZmluZWQoQ09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERV9NQVApCisjaWZkZWYgQ09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERV9NQVAKIAlyZXR1cm4gbW92YWJsZV96b25lID09IFpPTkVfSElHSE1FTTsKLSNlbGlmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pCi0JcmV0dXJuIChaT05FX01PVkFCTEUgLSAxKSA9PSBaT05FX0hJR0hNRU07CiAjZWxzZQotCXJldHVybiAwOworCXJldHVybiAoWk9ORV9NT1ZBQkxFIC0gMSkgPT0gWk9ORV9ISUdITUVNOwogI2VuZGlmCiB9CisjZW5kaWYKIAogc3RhdGljIGlubGluZSBpbnQgaXNfaGlnaG1lbV9pZHgoZW51bSB6b25lX3R5cGUgaWR4KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKaW5kZXggNDI5OTlmZS4uYzg4M2I4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCkBAIC0zMzgsMTIgKzMzOCwxOCBAQAogI2lmZGVmIENPTkZJR19FVkVOVF9UUkFDSU5HCiAJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICoqdHJhY2VfZXZlbnRzOwogCXVuc2lnbmVkIGludCBudW1fdHJhY2VfZXZlbnRzOworCXN0cnVjdCB0cmFjZV9lbnVtX21hcCAqKnRyYWNlX2VudW1zOworCXVuc2lnbmVkIGludCBudW1fdHJhY2VfZW51bXM7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfRlRSQUNFX01DT1VOVF9SRUNPUkQKIAl1bnNpZ25lZCBpbnQgbnVtX2Z0cmFjZV9jYWxsc2l0ZXM7CiAJdW5zaWduZWQgbG9uZyAqZnRyYWNlX2NhbGxzaXRlczsKICNlbmRpZgogCisjaWZkZWYgQ09ORklHX0xJVkVQQVRDSAorCWJvb2wga2xwX2FsaXZlOworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRAogCS8qIFdoYXQgbW9kdWxlcyBkZXBlbmQgb24gbWU/ICovCiAJc3RydWN0IGxpc3RfaGVhZCBzb3VyY2VfbGlzdDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0LmggYi9pbmNsdWRlL2xpbnV4L25ldC5oCmluZGV4IDE3ZDgzMzkuLjczOGVhNDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXQuaApAQCAtMTIwLDcgKzEyMCw2IEBACiAKIHN0cnVjdCB2bV9hcmVhX3N0cnVjdDsKIHN0cnVjdCBwYWdlOwotc3RydWN0IGtpb2NiOwogc3RydWN0IHNvY2thZGRyOwogc3RydWN0IG1zZ2hkcjsKIHN0cnVjdCBtb2R1bGU7CkBAIC0xNjIsOCArMTYxLDggQEAKIAlpbnQJCSgqY29tcGF0X2dldHNvY2tvcHQpKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwKIAkJCQkgICAgICBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKICNlbmRpZgotCWludAkJKCpzZW5kbXNnKSAgIChzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkJICAgICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbik7CisJaW50CQkoKnNlbmRtc2cpICAgKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sCisJCQkJICAgICAgc2l6ZV90IHRvdGFsX2xlbik7CiAJLyogTm90ZXMgZm9yIGltcGxlbWVudGluZyByZWN2bXNnOgogCSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAkgKiBtc2ctPm1zZ19uYW1lbGVuIHNob3VsZCBnZXQgdXBkYXRlZCBieSB0aGUgcmVjdm1zZyBoYW5kbGVycwpAQCAtMTcyLDkgKzE3MSw4IEBACiAJICogaGFuZGxlcnMgY2FuIGFzc3VtZSB0aGF0IG1zZy5tc2dfbmFtZSBpcyBlaXRoZXIgTlVMTCBvciBoYXMKIAkgKiBhIG1pbmltdW0gc2l6ZSBvZiBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UpLgogCSAqLwotCWludAkJKCpyZWN2bXNnKSAgIChzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkJICAgICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbiwKLQkJCQkgICAgICBpbnQgZmxhZ3MpOworCWludAkJKCpyZWN2bXNnKSAgIChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLAorCQkJCSAgICAgIHNpemVfdCB0b3RhbF9sZW4sIGludCBmbGFncyk7CiAJaW50CQkoKm1tYXApCSAgICAgKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAogCQkJCSAgICAgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqIHZtYSk7CiAJc3NpemVfdAkJKCpzZW5kcGFnZSkgIChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKQEAgLTIxMyw3ICsyMTEsNyBAQAogaW50IHNvY2tfY3JlYXRlX2tlcm4oaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90bywgc3RydWN0IHNvY2tldCAqKnJlcyk7CiBpbnQgc29ja19jcmVhdGVfbGl0ZShpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvLCBzdHJ1Y3Qgc29ja2V0ICoqcmVzKTsKIHZvaWQgc29ja19yZWxlYXNlKHN0cnVjdCBzb2NrZXQgKnNvY2spOwotaW50IHNvY2tfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pOworaW50IHNvY2tfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2cpOwogaW50IHNvY2tfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLAogCQkgaW50IGZsYWdzKTsKIHN0cnVjdCBmaWxlICpzb2NrX2FsbG9jX2ZpbGUoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGZsYWdzLCBjb25zdCBjaGFyICpkbmFtZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAppbmRleCA0MjlkMTc5Li5iNTY3OWFlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKQEAgLTI2MSw3ICsyNjEsNiBAQAogCQkJICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgY29uc3Qgdm9pZCAqZGFkZHIsCiAJCQkgICBjb25zdCB2b2lkICpzYWRkciwgdW5zaWduZWQgaW50IGxlbik7CiAJaW50CSgqcGFyc2UpKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGNoYXIgKmhhZGRyKTsKLQlpbnQJKCpyZWJ1aWxkKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlpbnQJKCpjYWNoZSkoY29uc3Qgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBoaF9jYWNoZSAqaGgsIF9fYmUxNiB0eXBlKTsKIAl2b2lkCSgqY2FjaGVfdXBkYXRlKShzdHJ1Y3QgaGhfY2FjaGUgKmhoLAogCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC01ODgsNiArNTg3LDcgQEAKICNpZmRlZiBDT05GSUdfQlFMCiAJc3RydWN0IGRxbAkJZHFsOwogI2VuZGlmCisJdW5zaWduZWQgbG9uZwkJdHhfbWF4cmF0ZTsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAogc3RhdGljIGlubGluZSBpbnQgbmV0ZGV2X3F1ZXVlX251bWFfbm9kZV9yZWFkKGNvbnN0IHN0cnVjdCBuZXRkZXZfcXVldWUgKnEpCkBAIC03OTUsNyArNzk1LDEwIEBACiAgKiBuZXRkZXZfdHhfdCAoKm5kb19zdGFydF94bWl0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAgKglDYWxsZWQgd2hlbiBhIHBhY2tldCBuZWVkcyB0byBiZSB0cmFuc21pdHRlZC4KLSAqCU11c3QgcmV0dXJuIE5FVERFVl9UWF9PSyAsIE5FVERFVl9UWF9CVVNZLgorICoJUmV0dXJucyBORVRERVZfVFhfT0suICBDYW4gcmV0dXJuIE5FVERFVl9UWF9CVVNZLCBidXQgeW91IHNob3VsZCBzdG9wCisgKgl0aGUgcXVldWUgYmVmb3JlIHRoYXQgY2FuIGhhcHBlbjsgaXQncyBmb3Igb2Jzb2xldGUgZGV2aWNlcyBhbmQgd2VpcmQKKyAqCWNvcm5lciBjYXNlcywgYnV0IHRoZSBzdGFjayByZWFsbHkgZG9lcyBhIG5vbi10cml2aWFsIGFtb3VudAorICoJb2YgdXNlbGVzcyB3b3JrIGlmIHlvdSByZXR1cm4gTkVUREVWX1RYX0JVU1kuCiAgKiAgICAgICAgKGNhbiBhbHNvIHJldHVybiBORVRERVZfVFhfTE9DS0VEIGlmZiBORVRJRl9GX0xMVFgpCiAgKglSZXF1aXJlZCBjYW4gbm90IGJlIE5VTEwuCiAgKgpAQCAtODc1LDYgKzg3OCwxMSBAQAogICogaW50ICgqbmRvX3NldF92Zl9saW5rX3N0YXRlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIGludCBsaW5rX3N0YXRlKTsKICAqIGludCAoKm5kb19zZXRfdmZfcG9ydCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLAogICoJCQkgIHN0cnVjdCBubGF0dHIgKnBvcnRbXSk7CisgKgorICogICAgICBFbmFibGUgb3IgZGlzYWJsZSB0aGUgVkYgYWJpbGl0eSB0byBxdWVyeSBpdHMgUlNTIFJlZGlyZWN0aW9uIFRhYmxlIGFuZAorICogICAgICBIYXNoIEtleS4gVGhpcyBpcyBuZWVkZWQgc2luY2Ugb24gc29tZSBkZXZpY2VzIFZGIHNoYXJlIHRoaXMgaW5mb3JtYXRpb24KKyAqICAgICAgd2l0aCBQRiBhbmQgcXVlcnlpbmcgaXQgbWF5IGFkZHVjZSBhIHRoZW9yZXRpY2FsIHNlY3VyaXR5IHJpc2suCisgKiBpbnQgKCpuZG9fc2V0X3ZmX3Jzc19xdWVyeV9lbikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHZmLCBib29sIHNldHRpbmcpOwogICogaW50ICgqbmRvX2dldF92Zl9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgdmYsIHN0cnVjdCBza19idWZmICpza2IpOwogICogaW50ICgqbmRvX3NldHVwX3RjKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCB0YykKICAqIAlDYWxsZWQgdG8gc2V0dXAgJ3RjJyBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzIGluIHRoZSBuZXQgZGV2aWNlLiBUaGlzCkBAIC05NjUsOSArOTczLDEyIEBACiAgKglVc2VkIHRvIGFkZCBGREIgZW50cmllcyB0byBkdW1wIHJlcXVlc3RzLiBJbXBsZW1lbnRlcnMgc2hvdWxkIGFkZAogICoJZW50cmllcyB0byBza2IgYW5kIHVwZGF0ZSBpZHggd2l0aCB0aGUgbnVtYmVyIG9mIGVudHJpZXMuCiAgKgotICogaW50ICgqbmRvX2JyaWRnZV9zZXRsaW5rKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKKyAqIGludCAoKm5kb19icmlkZ2Vfc2V0bGluaykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5sbXNnaGRyICpubGgsCisgKgkJCSAgICAgdTE2IGZsYWdzKQogICogaW50ICgqbmRvX2JyaWRnZV9nZXRsaW5rKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcGlkLCB1MzIgc2VxLAogICoJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmaWx0ZXJfbWFzaykKKyAqIGludCAoKm5kb19icmlkZ2VfZGVsbGluaykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5sbXNnaGRyICpubGgsCisgKgkJCSAgICAgdTE2IGZsYWdzKTsKICAqCiAgKiBpbnQgKCpuZG9fY2hhbmdlX2NhcnJpZXIpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wgbmV3X2NhcnJpZXIpOwogICoJQ2FsbGVkIHRvIGNoYW5nZSBkZXZpY2UgY2Fycmllci4gU29mdC1kZXZpY2VzIChsaWtlIGR1bW15LCB0ZWFtLCBldGMpCkBAIC0xMDIzLDE1ICsxMDM0LDEyIEBACiAgKgliZSBvdGhlcndpc2UgZXhwcmVzc2VkIGJ5IGZlYXR1cmUgZmxhZ3MuIFRoZSBjaGVjayBpcyBjYWxsZWQgd2l0aAogICoJdGhlIHNldCBvZiBmZWF0dXJlcyB0aGF0IHRoZSBzdGFjayBoYXMgY2FsY3VsYXRlZCBhbmQgaXQgcmV0dXJucwogICoJdGhvc2UgdGhlIGRyaXZlciBiZWxpZXZlcyB0byBiZSBhcHByb3ByaWF0ZS4KLSAqCi0gKiBpbnQgKCpuZG9fc3dpdGNoX3BhcmVudF9pZF9nZXQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0gKgkJCQkgICBzdHJ1Y3QgbmV0ZGV2X3BoeXNfaXRlbV9pZCAqcHNpZCk7Ci0gKglDYWxsZWQgdG8gZ2V0IGFuIElEIG9mIHRoZSBzd2l0Y2ggY2hpcCB0aGlzIHBvcnQgaXMgcGFydCBvZi4KLSAqCUlmIGRyaXZlciBpbXBsZW1lbnRzIHRoaXMsIGl0IGluZGljYXRlcyB0aGF0IGl0IHJlcHJlc2VudHMgYSBwb3J0Ci0gKglvZiBhIHN3aXRjaCBjaGlwLgotICogaW50ICgqbmRvX3N3aXRjaF9wb3J0X3N0cF91cGRhdGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHN0YXRlKTsKLSAqCUNhbGxlZCB0byBub3RpZnkgc3dpdGNoIGRldmljZSBwb3J0IG9mIGJyaWRnZSBwb3J0IFNUUAotICoJc3RhdGUgY2hhbmdlLgorICogaW50ICgqbmRvX3NldF90eF9tYXhyYXRlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorICoJCQkgICAgIGludCBxdWV1ZV9pbmRleCwgdTMyIG1heHJhdGUpOworICoJQ2FsbGVkIHdoZW4gYSB1c2VyIHdhbnRzIHRvIHNldCBhIG1heC1yYXRlIGxpbWl0YXRpb24gb2Ygc3BlY2lmaWMKKyAqCVRYIHF1ZXVlLgorICogaW50ICgqbmRvX2dldF9pZmxpbmspKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworICoJQ2FsbGVkIHRvIGdldCB0aGUgaWZsaW5rIHZhbHVlIG9mIHRoaXMgZGV2aWNlLgogICovCiBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgewogCWludAkJCSgqbmRvX2luaXQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtMTA5Niw2ICsxMTA0LDkgQEAKIAkJCQkJCSAgIHN0cnVjdCBubGF0dHIgKnBvcnRbXSk7CiAJaW50CQkJKCpuZG9fZ2V0X3ZmX3BvcnQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgICBpbnQgdmYsIHN0cnVjdCBza19idWZmICpza2IpOworCWludAkJCSgqbmRvX3NldF92Zl9yc3NfcXVlcnlfZW4pKAorCQkJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCSAgIGludCB2ZiwgYm9vbCBzZXR0aW5nKTsKIAlpbnQJCQkoKm5kb19zZXR1cF90Yykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggdGMpOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0ZDT0UpCiAJaW50CQkJKCpuZG9fZmNvZV9lbmFibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtMTE2OSw2ICsxMTgwLDggQEAKIAkJCQkJCSAgICAgIGJvb2wgbmV3X2NhcnJpZXIpOwogCWludAkJCSgqbmRvX2dldF9waHlzX3BvcnRfaWQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkJc3RydWN0IG5ldGRldl9waHlzX2l0ZW1faWQgKnBwaWQpOworCWludAkJCSgqbmRvX2dldF9waHlzX3BvcnRfbmFtZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCQkgIGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pOwogCXZvaWQJCQkoKm5kb19hZGRfdnhsYW5fcG9ydCkoc3RydWN0ICBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgICAgICBzYV9mYW1pbHlfdCBzYV9mYW1pbHksCiAJCQkJCQkgICAgICBfX2JlMTYgcG9ydCk7CkBAIC0xMTg4LDEyICsxMjAxLDEwIEBACiAJbmV0ZGV2X2ZlYXR1cmVzX3QJKCpuZG9fZmVhdHVyZXNfY2hlY2spIChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgICAgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOwotI2lmZGVmIENPTkZJR19ORVRfU1dJVENIREVWCi0JaW50CQkJKCpuZG9fc3dpdGNoX3BhcmVudF9pZF9nZXQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkJICAgIHN0cnVjdCBuZXRkZXZfcGh5c19pdGVtX2lkICpwc2lkKTsKLQlpbnQJCQkoKm5kb19zd2l0Y2hfcG9ydF9zdHBfdXBkYXRlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJCSAgICAgIHU4IHN0YXRlKTsKLSNlbmRpZgorCWludAkJCSgqbmRvX3NldF90eF9tYXhyYXRlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJICAgICAgaW50IHF1ZXVlX2luZGV4LAorCQkJCQkJICAgICAgdTMyIG1heHJhdGUpOworCWludAkJCSgqbmRvX2dldF9pZmxpbmspKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogfTsKIAogLyoqCkBAIC0xMzAyLDYgKzEzMTMsOCBAQAogICoJQGJhc2VfYWRkcjoJRGV2aWNlIEkvTyBhZGRyZXNzCiAgKglAaXJxOgkJRGV2aWNlIElSUSBudW1iZXIKICAqCisgKglAY2Fycmllcl9jaGFuZ2VzOglTdGF0cyB0byBtb25pdG9yIGNhcnJpZXIgb248LT5vZmYgdHJhbnNpdGlvbnMKKyAqCiAgKglAc3RhdGU6CQlHZW5lcmljIG5ldHdvcmsgcXVldWluZyBsYXllciBzdGF0ZSwgc2VlIG5ldGRldl9zdGF0ZV90CiAgKglAZGV2X2xpc3Q6CVRoZSBnbG9iYWwgbGlzdCBvZiBuZXR3b3JrIGRldmljZXMKICAqCUBuYXBpX2xpc3Q6CUxpc3QgZW50cnksIHRoYXQgaXMgdXNlZCBmb3IgcG9sbGluZyBuYXBpIGRldmljZXMKQEAgLTEzMjUsNyArMTMzOCw3IEBACiAgKglAbXBsc19mZWF0dXJlczoJTWFzayBvZiBmZWF0dXJlcyBpbmhlcml0YWJsZSBieSBNUExTCiAgKgogICoJQGlmaW5kZXg6CWludGVyZmFjZSBpbmRleAotICoJQGlmbGluazoJdW5pcXVlIGRldmljZSBpZGVudGlmaWVyCisgKglAZ3JvdXA6CQlUaGUgZ3JvdXAsIHRoYXQgdGhlIGRldmljZSBiZWxvbmdzIHRvCiAgKgogICoJQHN0YXRzOgkJU3RhdGlzdGljcyBzdHJ1Y3QsIHdoaWNoIHdhcyBsZWZ0IGFzIGEgbGVnYWN5LCB1c2UKICAqCQkJcnRubF9saW5rX3N0YXRzNjQgaW5zdGVhZApAQCAtMTMzNSw4ICsxMzQ4LDYgQEAKICAqCUB0eF9kcm9wcGVkOglEcm9wcGVkIHBhY2tldHMgYnkgY29yZSBuZXR3b3JrLAogICoJCQlkbyBub3QgdXNlIHRoaXMgaW4gZHJpdmVycwogICoKLSAqCUBjYXJyaWVyX2NoYW5nZXM6CVN0YXRzIHRvIG1vbml0b3IgY2FycmllciBvbjwtPm9mZiB0cmFuc2l0aW9ucwotICoKICAqCUB3aXJlbGVzc19oYW5kbGVyczoJTGlzdCBvZiBmdW5jdGlvbnMgdG8gaGFuZGxlIFdpcmVsZXNzIEV4dGVuc2lvbnMsCiAgKgkJCQlpbnN0ZWFkIG9mIGlvY3RsLAogICoJCQkJc2VlIDxuZXQvaXdfaGFuZGxlci5oPiBmb3IgZGV0YWlscy4KQEAgLTEzNDUsOCArMTM1Niw3IEBACiAgKglAbmV0ZGV2X29wczoJSW5jbHVkZXMgc2V2ZXJhbCBwb2ludGVycyB0byBjYWxsYmFja3MsCiAgKgkJCWlmIG9uZSB3YW50cyB0byBvdmVycmlkZSB0aGUgbmRvXyooKSBmdW5jdGlvbnMKICAqCUBldGh0b29sX29wczoJTWFuYWdlbWVudCBvcGVyYXRpb25zCi0gKglAZndkX29wczoJTWFuYWdlbWVudCBvcGVyYXRpb25zCi0gKglAaGVhZGVyX29wczoJSW5jbHVkZXMgY2FsbGJhY2tzIGZvciBjcmVhdGluZyxwYXJzaW5nLHJlYnVpbGRpbmcsZXRjCisgKglAaGVhZGVyX29wczoJSW5jbHVkZXMgY2FsbGJhY2tzIGZvciBjcmVhdGluZyxwYXJzaW5nLGNhY2hpbmcsZXRjCiAgKgkJCW9mIExheWVyIDIgaGVhZGVycy4KICAqCiAgKglAZmxhZ3M6CQlJbnRlcmZhY2UgZmxhZ3MgKGEgbGEgQlNEKQpAQCAtMTM4MCwxNCArMTM5MCwxNCBAQAogICogCUBkZXZfcG9ydDoJCVVzZWQgdG8gZGlmZmVyZW50aWF0ZSBkZXZpY2VzIHRoYXQgc2hhcmUKICAqIAkJCQl0aGUgc2FtZSBmdW5jdGlvbgogICoJQGFkZHJfbGlzdF9sb2NrOglYWFg6IG5lZWQgY29tbWVudHMgb24gdGhpcyBvbmUKLSAqCUB1YzoJCQl1bmljYXN0IG1hYyBhZGRyZXNzZXMKLSAqCUBtYzoJCQltdWx0aWNhc3QgbWFjIGFkZHJlc3NlcwotICoJQGRldl9hZGRyczoJCWxpc3Qgb2YgZGV2aWNlIGh3IGFkZHJlc3NlcwotICoJQHF1ZXVlc19rc2V0OgkJR3JvdXAgb2YgYWxsIEtvYmplY3RzIGluIHRoZSBUeCBhbmQgUlggcXVldWVzCiAgKglAdWNfcHJvbWlzYzoJCUNvdW50ZXIsIHRoYXQgaW5kaWNhdGVzLCB0aGF0IHByb21pc2N1b3VzIG1vZGUKICAqCQkJCWhhcyBiZWVuIGVuYWJsZWQgZHVlIHRvIHRoZSBuZWVkIHRvIGxpc3RlbiB0bwogICoJCQkJYWRkaXRpb25hbCB1bmljYXN0IGFkZHJlc3NlcyBpbiBhIGRldmljZSB0aGF0CiAgKgkJCQlkb2VzIG5vdCBpbXBsZW1lbnQgbmRvX3NldF9yeF9tb2RlKCkKKyAqCUB1YzoJCQl1bmljYXN0IG1hYyBhZGRyZXNzZXMKKyAqCUBtYzoJCQltdWx0aWNhc3QgbWFjIGFkZHJlc3NlcworICoJQGRldl9hZGRyczoJCWxpc3Qgb2YgZGV2aWNlIGh3IGFkZHJlc3NlcworICoJQHF1ZXVlc19rc2V0OgkJR3JvdXAgb2YgYWxsIEtvYmplY3RzIGluIHRoZSBUeCBhbmQgUlggcXVldWVzCiAgKglAcHJvbWlzY3VpdHk6CQlOdW1iZXIgb2YgdGltZXMsIHRoZSBOSUMgaXMgdG9sZCB0byB3b3JrIGluCiAgKgkJCQlQcm9taXNjdW91cyBtb2RlLCBpZiBpdCBiZWNvbWVzIDAgdGhlIE5JQyB3aWxsCiAgKgkJCQlleGl0IGZyb20gd29ya2luZyBpbiBQcm9taXNjdW91cyBtb2RlCkBAIC0xNDE3LDYgKzE0MjcsMTIgQEAKICAqCUBpbmdyZXNzX3F1ZXVlOgkJWFhYOiBuZWVkIGNvbW1lbnRzIG9uIHRoaXMgb25lCiAgKglAYnJvYWRjYXN0OgkJaHcgYmNhc3QgYWRkcmVzcwogICoKKyAqCUByeF9jcHVfcm1hcDoJQ1BVIHJldmVyc2UtbWFwcGluZyBmb3IgUlggY29tcGxldGlvbiBpbnRlcnJ1cHRzLAorICoJCQlpbmRleGVkIGJ5IFJYIHF1ZXVlIG51bWJlci4gQXNzaWduZWQgYnkgZHJpdmVyLgorICoJCQlUaGlzIG11c3Qgb25seSBiZSBzZXQgaWYgdGhlIG5kb19yeF9mbG93X3N0ZWVyCisgKgkJCW9wZXJhdGlvbiBpcyBkZWZpbmVkCisgKglAaW5kZXhfaGxpc3Q6CQlEZXZpY2UgaW5kZXggaGFzaCBjaGFpbgorICoKICAqCUBfdHg6CQkJQXJyYXkgb2YgVFggcXVldWVzCiAgKglAbnVtX3R4X3F1ZXVlczoJCU51bWJlciBvZiBUWCBxdWV1ZXMgYWxsb2NhdGVkIGF0IGFsbG9jX25ldGRldl9tcSgpIHRpbWUKICAqCUByZWFsX251bV90eF9xdWV1ZXM6IAlOdW1iZXIgb2YgVFggcXVldWVzIGN1cnJlbnRseSBhY3RpdmUgaW4gZGV2aWNlCkBAIC0xNDI2LDExICsxNDQyLDYgQEAKICAqCiAgKglAeHBzX21hcHM6CVhYWDogbmVlZCBjb21tZW50cyBvbiB0aGlzIG9uZQogICoKLSAqCUByeF9jcHVfcm1hcDoJQ1BVIHJldmVyc2UtbWFwcGluZyBmb3IgUlggY29tcGxldGlvbiBpbnRlcnJ1cHRzLAotICoJCQlpbmRleGVkIGJ5IFJYIHF1ZXVlIG51bWJlci4gQXNzaWduZWQgYnkgZHJpdmVyLgotICoJCQlUaGlzIG11c3Qgb25seSBiZSBzZXQgaWYgdGhlIG5kb19yeF9mbG93X3N0ZWVyCi0gKgkJCW9wZXJhdGlvbiBpcyBkZWZpbmVkCi0gKgogICoJQHRyYW5zX3N0YXJ0OgkJVGltZSAoaW4gamlmZmllcykgb2YgbGFzdCBUeAogICoJQHdhdGNoZG9nX3RpbWVvOglSZXByZXNlbnRzIHRoZSB0aW1lb3V0IHRoYXQgaXMgdXNlZCBieQogICoJCQkJdGhlIHdhdGNoZG9nICggc2VlIGRldl93YXRjaGRvZygpICkKQEAgLTE0MzgsNyArMTQ0OSw2IEBACiAgKgogICoJQHBjcHVfcmVmY250OgkJTnVtYmVyIG9mIHJlZmVyZW5jZXMgdG8gdGhpcyBkZXZpY2UKICAqCUB0b2RvX2xpc3Q6CQlEZWxheWVkIHJlZ2lzdGVyL3VucmVnaXN0ZXIKLSAqCUBpbmRleF9obGlzdDoJCURldmljZSBpbmRleCBoYXNoIGNoYWluCiAgKglAbGlua193YXRjaF9saXN0OglYWFg6IG5lZWQgY29tbWVudHMgb24gdGhpcyBvbmUKICAqCiAgKglAcmVnX3N0YXRlOgkJUmVnaXN0ZXIvdW5yZWdpc3RlciBzdGF0ZSBtYWNoaW5lCkBAIC0xNDg2LDcgKzE0OTYsNiBAQAogICoKICAqCUBxZGlzY190eF9idXN5bG9jazoJWFhYOiBuZWVkIGNvbW1lbnRzIG9uIHRoaXMgb25lCiAgKgotICoJQGdyb3VwOgkJVGhlIGdyb3VwLCB0aGF0IHRoZSBkZXZpY2UgYmVsb25ncyB0bwogICoJQHBtX3Fvc19yZXE6CVBvd2VyIE1hbmFnZW1lbnQgUW9TIG9iamVjdAogICoKICAqCUZJWE1FOiBjbGVhbnVwIHN0cnVjdCBuZXRfZGV2aWNlIHN1Y2ggdGhhdCBuZXR3b3JrIHByb3RvY29sIGluZm8KQEAgLTE1MDYsNiArMTUxNSw4IEBACiAJdW5zaWduZWQgbG9uZwkJYmFzZV9hZGRyOwogCWludAkJCWlycTsKIAorCWF0b21pY190CQljYXJyaWVyX2NoYW5nZXM7CisKIAkvKgogCSAqCVNvbWUgaGFyZHdhcmUgYWxzbyBuZWVkcyB0aGVzZSBmaWVsZHMgKHN0YXRlLGRldl9saXN0LAogCSAqCW5hcGlfbGlzdCx1bnJlZ19saXN0LGNsb3NlX2xpc3QpIGJ1dCB0aGV5IGFyZSBub3QKQEAgLTE1MzksMjIgKzE1NTAsMjIgQEAKIAluZXRkZXZfZmVhdHVyZXNfdAltcGxzX2ZlYXR1cmVzOwogCiAJaW50CQkJaWZpbmRleDsKLQlpbnQJCQlpZmxpbms7CisJaW50CQkJZ3JvdXA7CiAKIAlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cwlzdGF0czsKIAogCWF0b21pY19sb25nX3QJCXJ4X2Ryb3BwZWQ7CiAJYXRvbWljX2xvbmdfdAkJdHhfZHJvcHBlZDsKIAotCWF0b21pY190CQljYXJyaWVyX2NoYW5nZXM7Ci0KICNpZmRlZiBDT05GSUdfV0lSRUxFU1NfRVhUCiAJY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmICoJd2lyZWxlc3NfaGFuZGxlcnM7CiAJc3RydWN0IGl3X3B1YmxpY19kYXRhICoJd2lyZWxlc3NfZGF0YTsKICNlbmRpZgogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqbmV0ZGV2X29wczsKIAljb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgKmV0aHRvb2xfb3BzOwotCWNvbnN0IHN0cnVjdCBmb3J3YXJkaW5nX2FjY2VsX29wcyAqZndkX29wczsKKyNpZmRlZiBDT05GSUdfTkVUX1NXSVRDSERFVgorCWNvbnN0IHN0cnVjdCBzd2Rldl9vcHMgKnN3ZGV2X29wczsKKyNlbmRpZgogCiAJY29uc3Qgc3RydWN0IGhlYWRlcl9vcHMgKmhlYWRlcl9vcHM7CiAKQEAgLTE1ODUsNiArMTU5Niw4IEBACiAJdW5zaWduZWQgc2hvcnQgICAgICAgICAgZGV2X2lkOwogCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIGRldl9wb3J0OwogCXNwaW5sb2NrX3QJCWFkZHJfbGlzdF9sb2NrOworCXVuc2lnbmVkIGNoYXIJCW5hbWVfYXNzaWduX3R5cGU7CisJYm9vbAkJCXVjX3Byb21pc2M7CiAJc3RydWN0IG5ldGRldl9od19hZGRyX2xpc3QJdWM7CiAJc3RydWN0IG5ldGRldl9od19hZGRyX2xpc3QJbWM7CiAJc3RydWN0IG5ldGRldl9od19hZGRyX2xpc3QJZGV2X2FkZHJzOwpAQCAtMTU5MiwxMCArMTYwNSw2IEBACiAjaWZkZWYgQ09ORklHX1NZU0ZTCiAJc3RydWN0IGtzZXQJCSpxdWV1ZXNfa3NldDsKICNlbmRpZgotCi0JdW5zaWduZWQgY2hhcgkJbmFtZV9hc3NpZ25fdHlwZTsKLQotCWJvb2wJCQl1Y19wcm9taXNjOwogCXVuc2lnbmVkIGludAkJcHJvbWlzY3VpdHk7CiAJdW5zaWduZWQgaW50CQlhbGxtdWx0aTsKIApAQCAtMTY0Miw3ICsxNjUxLDEwIEBACiAKIAlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlIF9fcmN1ICppbmdyZXNzX3F1ZXVlOwogCXVuc2lnbmVkIGNoYXIJCWJyb2FkY2FzdFtNQVhfQUREUl9MRU5dOwotCisjaWZkZWYgQ09ORklHX1JGU19BQ0NFTAorCXN0cnVjdCBjcHVfcm1hcAkJKnJ4X2NwdV9ybWFwOworI2VuZGlmCisJc3RydWN0IGhsaXN0X25vZGUJaW5kZXhfaGxpc3Q7CiAKIC8qCiAgKiBDYWNoZSBsaW5lcyBtb3N0bHkgdXNlZCBvbiB0cmFuc21pdCBwYXRoCkBAIC0xNjUzLDEzICsxNjY1LDExIEBACiAJc3RydWN0IFFkaXNjCQkqcWRpc2M7CiAJdW5zaWduZWQgbG9uZwkJdHhfcXVldWVfbGVuOwogCXNwaW5sb2NrX3QJCXR4X2dsb2JhbF9sb2NrOworCWludAkJCXdhdGNoZG9nX3RpbWVvOwogCiAjaWZkZWYgQ09ORklHX1hQUwogCXN0cnVjdCB4cHNfZGV2X21hcHMgX19yY3UgKnhwc19tYXBzOwogI2VuZGlmCi0jaWZkZWYgQ09ORklHX1JGU19BQ0NFTAotCXN0cnVjdCBjcHVfcm1hcAkJKnJ4X2NwdV9ybWFwOwotI2VuZGlmCiAKIAkvKiBUaGVzZSBtYXkgYmUgbmVlZGVkIGZvciBmdXR1cmUgbmV0d29yay1wb3dlci1kb3duIGNvZGUuICovCiAKQEAgLTE2NjksMTMgKzE2NzksMTEgQEAKIAkgKi8KIAl1bnNpZ25lZCBsb25nCQl0cmFuc19zdGFydDsKIAotCWludAkJCXdhdGNoZG9nX3RpbWVvOwogCXN0cnVjdCB0aW1lcl9saXN0CXdhdGNoZG9nX3RpbWVyOwogCiAJaW50IF9fcGVyY3B1CQkqcGNwdV9yZWZjbnQ7CiAJc3RydWN0IGxpc3RfaGVhZAl0b2RvX2xpc3Q7CiAKLQlzdHJ1Y3QgaGxpc3Rfbm9kZQlpbmRleF9obGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpbmtfd2F0Y2hfbGlzdDsKIAogCWVudW0geyBORVRSRUdfVU5JTklUSUFMSVpFRD0wLApAQCAtMTY5OSw5ICsxNzA3LDcgQEAKIAlzdHJ1Y3QgbmV0cG9sbF9pbmZvIF9fcmN1CSpucGluZm87CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19ORVRfTlMKLQlzdHJ1Y3QgbmV0CQkqbmRfbmV0OwotI2VuZGlmCisJcG9zc2libGVfbmV0X3QJCQluZF9uZXQ7CiAKIAkvKiBtaWQtbGF5ZXIgcHJpdmF0ZSAqLwogCXVuaW9uIHsKQEAgLTE3NDIsOCArMTc0OCw2IEBACiAjZW5kaWYKIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwogCXN0cnVjdCBsb2NrX2NsYXNzX2tleSAqcWRpc2NfdHhfYnVzeWxvY2s7Ci0JaW50IGdyb3VwOwotCXN0cnVjdCBwbV9xb3NfcmVxdWVzdAlwbV9xb3NfcmVxOwogfTsKICNkZWZpbmUgdG9fbmV0X2RldihkKSBjb250YWluZXJfb2YoZCwgc3RydWN0IG5ldF9kZXZpY2UsIGRldikKIApAQCAtMTg0MSwxMCArMTg0NSw3IEBACiBzdGF0aWMgaW5saW5lCiB2b2lkIGRldl9uZXRfc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXQgKm5ldCkKIHsKLSNpZmRlZiBDT05GSUdfTkVUX05TCi0JcmVsZWFzZV9uZXQoZGV2LT5uZF9uZXQpOwotCWRldi0+bmRfbmV0ID0gaG9sZF9uZXQobmV0KTsKLSNlbmRpZgorCXdyaXRlX3BuZXQoJmRldi0+bmRfbmV0LCBuZXQpOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgbmV0ZGV2X3VzZXNfZHNhKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yMTU2LDYgKzIxNTcsNyBAQAogdm9pZCBkZXZfYWRkX29mZmxvYWQoc3RydWN0IHBhY2tldF9vZmZsb2FkICpwbyk7CiB2b2lkIGRldl9yZW1vdmVfb2ZmbG9hZChzdHJ1Y3QgcGFja2V0X29mZmxvYWQgKnBvKTsKIAoraW50IGRldl9nZXRfaWZsaW5rKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RydWN0IG5ldF9kZXZpY2UgKl9fZGV2X2dldF9ieV9mbGFncyhzdHJ1Y3QgbmV0ICpuZXQsIHVuc2lnbmVkIHNob3J0IGZsYWdzLAogCQkJCSAgICAgIHVuc2lnbmVkIHNob3J0IG1hc2spOwogc3RydWN0IG5ldF9kZXZpY2UgKmRldl9nZXRfYnlfbmFtZShzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IGNoYXIgKm5hbWUpOwpAQCAtMjE2NCw5ICsyMTY2LDE0IEBACiBpbnQgZGV2X2FsbG9jX25hbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqbmFtZSk7CiBpbnQgZGV2X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBpbnQgZGV2X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGRldl9jbG9zZV9tYW55KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGJvb2wgdW5saW5rKTsKIHZvaWQgZGV2X2Rpc2FibGVfbHJvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IGRldl9sb29wYmFja194bWl0KHN0cnVjdCBza19idWZmICpuZXdza2IpOwotaW50IGRldl9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IpOworaW50IGRldl9sb29wYmFja194bWl0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5ld3NrYik7CitpbnQgZGV2X3F1ZXVlX3htaXRfc2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbmxpbmUgaW50IGRldl9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIGRldl9xdWV1ZV94bWl0X3NrKHNrYi0+c2ssIHNrYik7Cit9CiBpbnQgZGV2X3F1ZXVlX3htaXRfYWNjZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdm9pZCAqYWNjZWxfcHJpdik7CiBpbnQgcmVnaXN0ZXJfbmV0ZGV2aWNlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCB1bnJlZ2lzdGVyX25ldGRldmljZV9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKTsKQEAgLTIxODIsNiArMjE4OSwxMiBAQAogdm9pZCBzeW5jaHJvbml6ZV9uZXQodm9pZCk7CiBpbnQgaW5pdF9kdW1teV9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKK0RFQ0xBUkVfUEVSX0NQVShpbnQsIHhtaXRfcmVjdXJzaW9uKTsKK3N0YXRpYyBpbmxpbmUgaW50IGRldl9yZWN1cnNpb25fbGV2ZWwodm9pZCkKK3sKKwlyZXR1cm4gdGhpc19jcHVfcmVhZCh4bWl0X3JlY3Vyc2lvbik7Cit9CisKIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfZ2V0X2J5X2luZGV4KHN0cnVjdCBuZXQgKm5ldCwgaW50IGlmaW5kZXgpOwogc3RydWN0IG5ldF9kZXZpY2UgKl9fZGV2X2dldF9ieV9pbmRleChzdHJ1Y3QgbmV0ICpuZXQsIGludCBpZmluZGV4KTsKIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfZ2V0X2J5X2luZGV4X3JjdShzdHJ1Y3QgbmV0ICpuZXQsIGludCBpZmluZGV4KTsKQEAgLTI0MDAsMTUgKzI0MTMsNiBAQAogCXJldHVybiBkZXYtPmhlYWRlcl9vcHMtPnBhcnNlKHNrYiwgaGFkZHIpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkZXZfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7Ci0KLQlpZiAoIWRldi0+aGVhZGVyX29wcyB8fCAhZGV2LT5oZWFkZXJfb3BzLT5yZWJ1aWxkKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gZGV2LT5oZWFkZXJfb3BzLT5yZWJ1aWxkKHNrYik7Ci19Ci0KIHR5cGVkZWYgaW50IGdpZmNvbmZfZnVuY190KHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBjaGFyIF9fdXNlciAqIGJ1ZnB0ciwgaW50IGxlbik7CiBpbnQgcmVnaXN0ZXJfZ2lmY29uZih1bnNpZ25lZCBpbnQgZmFtaWx5LCBnaWZjb25mX2Z1bmNfdCAqZ2lmY29uZik7CiBzdGF0aWMgaW5saW5lIGludCB1bnJlZ2lzdGVyX2dpZmNvbmYodW5zaWduZWQgaW50IGZhbWlseSkKQEAgLTI5MzAsNyArMjkzNCwxMSBAQAogCiBpbnQgbmV0aWZfcngoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgbmV0aWZfcnhfbmkoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1pbnQgbmV0aWZfcmVjZWl2ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgbmV0aWZfcmVjZWl2ZV9za2Jfc2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3N0YXRpYyBpbmxpbmUgaW50IG5ldGlmX3JlY2VpdmVfc2tiKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIG5ldGlmX3JlY2VpdmVfc2tiX3NrKHNrYi0+c2ssIHNrYik7Cit9CiBncm9fcmVzdWx0X3QgbmFwaV9ncm9fcmVjZWl2ZShzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBuYXBpX2dyb19mbHVzaChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGJvb2wgZmx1c2hfb2xkKTsKIHN0cnVjdCBza19idWZmICpuYXBpX2dldF9mcmFncyhzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGkpOwpAQCAtMjk2Niw2ICsyOTc0LDggQEAKIGludCBkZXZfY2hhbmdlX2NhcnJpZXIoc3RydWN0IG5ldF9kZXZpY2UgKiwgYm9vbCBuZXdfY2Fycmllcik7CiBpbnQgZGV2X2dldF9waHlzX3BvcnRfaWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSBzdHJ1Y3QgbmV0ZGV2X3BoeXNfaXRlbV9pZCAqcHBpZCk7CitpbnQgZGV2X2dldF9waHlzX3BvcnRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgY2hhciAqbmFtZSwgc2l6ZV90IGxlbik7CiBzdHJ1Y3Qgc2tfYnVmZiAqdmFsaWRhdGVfeG1pdF9za2JfbGlzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKIHN0cnVjdCBza19idWZmICpkZXZfaGFyZF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgIHN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cSwgaW50ICpyZXQpOwpAQCAtMzY3MCw2ICszNjgwLDkgQEAKIHZvaWQgbmV0aWZfc3RhY2tlZF90cmFuc2Zlcl9vcGVyc3RhdGUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKnJvb3RkZXYsCiAJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCituZXRkZXZfZmVhdHVyZXNfdCBwYXNzdGhydV9mZWF0dXJlc19jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOwogbmV0ZGV2X2ZlYXR1cmVzX3QgbmV0aWZfc2tiX2ZlYXR1cmVzKHN0cnVjdCBza19idWZmICpza2IpOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgbmV0X2dzb19vayhuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcywgaW50IGdzb190eXBlKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKaW5kZXggMjUxN2VjZS4uNjM1NjBkMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCkBAIC00NCwxMSArNDQsMzkgQEAKIHN0cnVjdCBza19idWZmOwogCiBzdHJ1Y3QgbmZfaG9va19vcHM7CisKK3N0cnVjdCBzb2NrOworCitzdHJ1Y3QgbmZfaG9va19zdGF0ZSB7CisJdW5zaWduZWQgaW50IGhvb2s7CisJaW50IHRocmVzaDsKKwl1X2ludDhfdCBwZjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqaW47CisJc3RydWN0IG5ldF9kZXZpY2UgKm91dDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50ICgqb2tmbikoc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKik7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbmZfaG9va19zdGF0ZV9pbml0KHN0cnVjdCBuZl9ob29rX3N0YXRlICpwLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBob29rLAorCQkJCSAgICAgIGludCB0aHJlc2gsIHVfaW50OF90IHBmLAorCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKKwkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAorCQkJCSAgICAgIHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3sKKwlwLT5ob29rID0gaG9vazsKKwlwLT50aHJlc2ggPSB0aHJlc2g7CisJcC0+cGYgPSBwZjsKKwlwLT5pbiA9IGluZGV2OworCXAtPm91dCA9IG91dGRldjsKKwlwLT5zayA9IHNrOworCXAtPm9rZm4gPSBva2ZuOworfQorCiB0eXBlZGVmIHVuc2lnbmVkIGludCBuZl9ob29rZm4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCSAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSk7CisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKTsKIAogc3RydWN0IG5mX2hvb2tfb3BzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC0xMTgsOSArMTQ2LDcgQEAKIH0KICNlbmRpZgogCi1pbnQgbmZfaG9va19zbG93KHVfaW50OF90IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKLQkJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopLCBpbnQgdGhyZXNoKTsKK2ludCBuZl9ob29rX3Nsb3coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKTsKIAogLyoqCiAgKgluZl9ob29rX3RocmVzaCAtIGNhbGwgYSBuZXRmaWx0ZXIgaG9vawpAQCAtMTMwLDIxICsxNTYsMjkgQEAKICAqCXZhbHVlIGluZGljYXRlcyB0aGUgcGFja2V0IGhhcyBiZWVuIGNvbnN1bWVkIGJ5IHRoZSBob29rLgogICovCiBzdGF0aWMgaW5saW5lIGludCBuZl9ob29rX3RocmVzaCh1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssCisJCQkJIHN0cnVjdCBzb2NrICpzaywKIAkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LAogCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAotCQkJCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSwgaW50IHRocmVzaCkKKwkJCQkgaW50ICgqb2tmbikoc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKiksCisJCQkJIGludCB0aHJlc2gpCiB7Ci0JaWYgKG5mX2hvb2tzX2FjdGl2ZShwZiwgaG9vaykpCi0JCXJldHVybiBuZl9ob29rX3Nsb3cocGYsIGhvb2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbiwgdGhyZXNoKTsKKwlpZiAobmZfaG9va3NfYWN0aXZlKHBmLCBob29rKSkgeworCQlzdHJ1Y3QgbmZfaG9va19zdGF0ZSBzdGF0ZTsKKworCQluZl9ob29rX3N0YXRlX2luaXQoJnN0YXRlLCBob29rLCB0aHJlc2gsIHBmLAorCQkJCSAgIGluZGV2LCBvdXRkZXYsIHNrLCBva2ZuKTsKKwkJcmV0dXJuIG5mX2hvb2tfc2xvdyhza2IsICZzdGF0ZSk7CisJfQogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBuZl9ob29rKHVfaW50OF90IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAotCQkJICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK3N0YXRpYyBpbmxpbmUgaW50IG5mX2hvb2sodV9pbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKKwkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKKwkJCSAgaW50ICgqb2tmbikoc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKikpCiB7Ci0JcmV0dXJuIG5mX2hvb2tfdGhyZXNoKHBmLCBob29rLCBza2IsIGluZGV2LCBvdXRkZXYsIG9rZm4sIElOVF9NSU4pOworCXJldHVybiBuZl9ob29rX3RocmVzaChwZiwgaG9vaywgc2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbiwgSU5UX01JTik7CiB9CiAgICAgICAgICAgICAgICAgICAgCiAvKiBBY3RpdmF0ZSBob29rOyBlaXRoZXIgb2tmbiBvciBrZnJlZV9za2IgY2FsbGVkLCB1bmxlc3MgYSBob29rCkBAIC0xNjUsMzUgKzE5OSwzNiBAQAogKi8KIAogc3RhdGljIGlubGluZSBpbnQKLU5GX0hPT0tfVEhSRVNIKHVpbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopLCBpbnQgdGhyZXNoKQorTkZfSE9PS19USFJFU0godWludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBzb2NrICpzaywKKwkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKSwgaW50IHRocmVzaCkKIHsKLQlpbnQgcmV0ID0gbmZfaG9va190aHJlc2gocGYsIGhvb2ssIHNrYiwgaW4sIG91dCwgb2tmbiwgdGhyZXNoKTsKKwlpbnQgcmV0ID0gbmZfaG9va190aHJlc2gocGYsIGhvb2ssIHNrLCBza2IsIGluLCBvdXQsIG9rZm4sIHRocmVzaCk7CiAJaWYgKHJldCA9PSAxKQotCQlyZXQgPSBva2ZuKHNrYik7CisJCXJldCA9IG9rZm4oc2ssIHNrYik7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLU5GX0hPT0tfQ09ORCh1aW50OF90IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICppbiwgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopLCBib29sIGNvbmQpCitORl9IT09LX0NPTkQodWludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBzb2NrICpzaywKKwkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICppbiwgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgICAgIGludCAoKm9rZm4pKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopLCBib29sIGNvbmQpCiB7CiAJaW50IHJldDsKIAogCWlmICghY29uZCB8fAotCSAgICAoKHJldCA9IG5mX2hvb2tfdGhyZXNoKHBmLCBob29rLCBza2IsIGluLCBvdXQsIG9rZm4sIElOVF9NSU4pKSA9PSAxKSkKLQkJcmV0ID0gb2tmbihza2IpOworCSAgICAoKHJldCA9IG5mX2hvb2tfdGhyZXNoKHBmLCBob29rLCBzaywgc2tiLCBpbiwgb3V0LCBva2ZuLCBJTlRfTUlOKSkgPT0gMSkpCisJCXJldCA9IG9rZm4oc2ssIHNrYik7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKLU5GX0hPT0sodWludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICpza2IsCitORl9IT09LKHVpbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJc3RydWN0IG5ldF9kZXZpY2UgKmluLCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCWludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCWludCAoKm9rZm4pKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopKQogewotCXJldHVybiBORl9IT09LX1RIUkVTSChwZiwgaG9vaywgc2tiLCBpbiwgb3V0LCBva2ZuLCBJTlRfTUlOKTsKKwlyZXR1cm4gTkZfSE9PS19USFJFU0gocGYsIGhvb2ssIHNrLCBza2IsIGluLCBvdXQsIG9rZm4sIElOVF9NSU4pOwogfQogCiAvKiBDYWxsIHNldHNvY2tvcHQoKSAqLwpAQCAtMjkzLDE5ICszMjgsMjEgQEAKIH0KIAogI2Vsc2UgLyogIUNPTkZJR19ORVRGSUxURVIgKi8KLSNkZWZpbmUgTkZfSE9PSyhwZiwgaG9vaywgc2tiLCBpbmRldiwgb3V0ZGV2LCBva2ZuKSAob2tmbikoc2tiKQotI2RlZmluZSBORl9IT09LX0NPTkQocGYsIGhvb2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbiwgY29uZCkgKG9rZm4pKHNrYikKKyNkZWZpbmUgTkZfSE9PSyhwZiwgaG9vaywgc2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbikgKG9rZm4pKHNrLCBza2IpCisjZGVmaW5lIE5GX0hPT0tfQ09ORChwZiwgaG9vaywgc2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbiwgY29uZCkgKG9rZm4pKHNrLCBza2IpCiBzdGF0aWMgaW5saW5lIGludCBuZl9ob29rX3RocmVzaCh1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssCisJCQkJIHN0cnVjdCBzb2NrICpzaywKIAkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LAogCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAotCQkJCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSwgaW50IHRocmVzaCkKKwkJCQkgaW50ICgqb2tmbikoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqKSwgaW50IHRocmVzaCkKIHsKLQlyZXR1cm4gb2tmbihza2IpOworCXJldHVybiBva2ZuKHNrLCBza2IpOwogfQotc3RhdGljIGlubGluZSBpbnQgbmZfaG9vayh1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKLQkJCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCitzdGF0aWMgaW5saW5lIGludCBuZl9ob29rKHVfaW50OF90IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IHNvY2sgKnNrLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsCisJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCisJCQkgIGludCAoKm9rZm4pKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopKQogewogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXQuaAppbmRleCBmMTYwNmZhLi4zNGIxNzIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXQuaApAQCAtNDgzLDcgKzQ4Myw3IEBACiAKIAlpZiAoIV9fbmVzdGVkKQogCQlyZXR1cm4gLUVNU0dTSVpFOwotCXJldCA9IG5sYV9wdXRfbmV0MzIoc2tiLCBJUFNFVF9BVFRSX0lQQUREUl9JUFY0LCBpcGFkZHIpOworCXJldCA9IG5sYV9wdXRfaW5fYWRkcihza2IsIElQU0VUX0FUVFJfSVBBRERSX0lQVjQsIGlwYWRkcik7CiAJaWYgKCFyZXQpCiAJCWlwc2V0X25lc3RfZW5kKHNrYiwgX19uZXN0ZWQpOwogCXJldHVybiByZXQ7CkBAIC00OTcsOCArNDk3LDcgQEAKIAogCWlmICghX19uZXN0ZWQpCiAJCXJldHVybiAtRU1TR1NJWkU7Ci0JcmV0ID0gbmxhX3B1dChza2IsIElQU0VUX0FUVFJfSVBBRERSX0lQVjYsCi0JCSAgICAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLCBpcGFkZHJwdHIpOworCXJldCA9IG5sYV9wdXRfaW42X2FkZHIoc2tiLCBJUFNFVF9BVFRSX0lQQUREUl9JUFY2LCBpcGFkZHJwdHIpOwogCWlmICghcmV0KQogCQlpcHNldF9uZXN0X2VuZChza2IsIF9fbmVzdGVkKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2FycC9hcnBfdGFibGVzLmgKaW5kZXggY2ZiNzE5MS4uYzIyYTdmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYXJwL2FycF90YWJsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oCkBAIC01NCw4ICs1NCw3IEBACiBleHRlcm4gdm9pZCBhcnB0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IHh0X3RhYmxlICp0YWJsZSk7CiBleHRlcm4gdW5zaWduZWQgaW50IGFycHRfZG9fdGFibGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgIHVuc2lnbmVkIGludCBob29rLAotCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkJCQkgIHN0cnVjdCB4dF90YWJsZSAqdGFibGUpOwogCiAjaWZkZWYgQ09ORklHX0NPTVBBVApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaAppbmRleCBjNzU1ZTQ5Li5hYjhmNzZkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UuaApAQCAtMiw3ICsyLDcgQEAKICNkZWZpbmUgX19MSU5VWF9CUklER0VfTkVURklMVEVSX0gKIAogI2luY2x1ZGUgPHVhcGkvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgotCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAKIGVudW0gbmZfYnJfaG9va19wcmlvcml0aWVzIHsKIAlORl9CUl9QUklfRklSU1QgPSBJTlRfTUlOLApAQCAtMTcsOTggKzE3LDE3IEBACiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19CUklER0VfTkVURklMVEVSKQogCi0jZGVmaW5lIEJSTkZfUEtUX1RZUEUJCQkweDAxCiAjZGVmaW5lIEJSTkZfQlJJREdFRF9ETkFUCQkweDAyCi0jZGVmaW5lIEJSTkZfQlJJREdFRAkJCTB4MDQKICNkZWZpbmUgQlJORl9ORl9CUklER0VfUFJFUk9VVElORwkweDA4Ci0jZGVmaW5lIEJSTkZfODAyMVEJCQkweDEwCi0jZGVmaW5lIEJSTkZfUFBQb0UJCQkweDIwCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5mX2JyaWRnZV9lbmNhcF9oZWFkZXJfbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3dpdGNoIChza2ItPnByb3RvY29sKSB7Ci0JY2FzZSBfX2NwdV90b19iZTE2KEVUSF9QXzgwMjFRKToKLQkJcmV0dXJuIFZMQU5fSExFTjsKLQljYXNlIF9fY3B1X3RvX2JlMTYoRVRIX1BfUFBQX1NFUyk6Ci0JCXJldHVybiBQUFBPRV9TRVNfSExFTjsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZl9icmlkZ2VfdXBkYXRlX3Byb3RvY29sKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaWYgKHNrYi0+bmZfYnJpZGdlLT5tYXNrICYgQlJORl84MDIxUSkKLQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMjFRKTsKLQllbHNlIGlmIChza2ItPm5mX2JyaWRnZS0+bWFzayAmIEJSTkZfUFBQb0UpCi0JCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9QUFBfU0VTKTsKLX0KLQotLyogRmlsbCBpbiB0aGUgaGVhZGVyIGZvciBmcmFnbWVudGVkIElQIHBhY2tldHMgaGFuZGxlZCBieQotICogdGhlIElQdjQgY29ubmVjdGlvbiB0cmFja2luZyBjb2RlLgotICoKLSAqIE9ubHkgdXNlZCBpbiBicl9mb3J3YXJkLmMKLSAqLwotc3RhdGljIGlubGluZSBpbnQgbmZfYnJpZGdlX2NvcHlfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaW50IGVycjsKLQl1bnNpZ25lZCBpbnQgaGVhZGVyX3NpemU7Ci0KLQluZl9icmlkZ2VfdXBkYXRlX3Byb3RvY29sKHNrYik7Ci0JaGVhZGVyX3NpemUgPSBFVEhfSExFTiArIG5mX2JyaWRnZV9lbmNhcF9oZWFkZXJfbGVuKHNrYik7Ci0JZXJyID0gc2tiX2Nvd19oZWFkKHNrYiwgaGVhZGVyX3NpemUpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCAtaGVhZGVyX3NpemUsCi0JCQkJICAgICAgIHNrYi0+bmZfYnJpZGdlLT5kYXRhLCBoZWFkZXJfc2l6ZSk7Ci0JX19za2JfcHVzaChza2IsIG5mX2JyaWRnZV9lbmNhcF9oZWFkZXJfbGVuKHNrYikpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBuZl9icmlkZ2VfbWF5YmVfY29weV9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlpZiAoc2tiLT5uZl9icmlkZ2UgJiYKLQkgICAgc2tiLT5uZl9icmlkZ2UtPm1hc2sgJiAoQlJORl9CUklER0VEIHwgQlJORl9CUklER0VEX0ROQVQpKQotCQlyZXR1cm4gbmZfYnJpZGdlX2NvcHlfaGVhZGVyKHNrYik7Ci0gIAlyZXR1cm4gMDsKLX0KIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbmZfYnJpZGdlX210dV9yZWR1Y3Rpb24oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpZiAodW5saWtlbHkoc2tiLT5uZl9icmlkZ2UtPm1hc2sgJiBCUk5GX1BQUG9FKSkKKwlpZiAoc2tiLT5uZl9icmlkZ2UtPm9yaWdfcHJvdG8gPT0gQlJORl9QUk9UT19QUFBPRSkKIAkJcmV0dXJuIFBQUE9FX1NFU19ITEVOOwogCXJldHVybiAwOwogfQogCi1pbnQgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLS8qIE9ubHkgdXNlZCBpbiBicl9kZXZpY2UuYyAqLwotc3RhdGljIGlubGluZSBpbnQgYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoX2JyaWRnZV9zbG93KHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZTsKLQotCXNrYl9wdWxsKHNrYiwgRVRIX0hMRU4pOwotCW5mX2JyaWRnZS0+bWFzayBePSBCUk5GX0JSSURHRURfRE5BVDsKLQlza2JfY29weV90b19saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCAtKEVUSF9ITEVOLUVUSF9BTEVOKSwKLQkJCQkgICAgICAgc2tiLT5uZl9icmlkZ2UtPmRhdGEsIEVUSF9ITEVOLUVUSF9BTEVOKTsKLQlza2ItPmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2OwotCXJldHVybiBicl9oYW5kbGVfZnJhbWVfZmluaXNoKHNrYik7Ci19Ci0KLS8qIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBJUCBmcmFnbWVudGluZyBjb2RlIGFuZCBpdCBlbnN1cmVzIHRoZXJlIGlzCi0gKiBlbm91Z2ggcm9vbSBmb3IgdGhlIGVuY2Fwc3VsYXRpbmcgaGVhZGVyIChpZiB0aGVyZSBpcyBvbmUpLiAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbmZfYnJpZGdlX3BhZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWlmIChza2ItPm5mX2JyaWRnZSkKLQkJcmV0dXJuIG5mX2JyaWRnZV9lbmNhcF9oZWFkZXJfbGVuKHNrYik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBicmlkZ2Vfc2tiX2NiIHsKLQl1bmlvbiB7Ci0JCV9fYmUzMiBpcHY0OwotCX0gZGFkZHI7Ci19OworaW50IGJyX2hhbmRsZV9mcmFtZV9maW5pc2goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGJyX2Ryb3BfZmFrZV9ydGFibGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKQEAgLTExOCw5ICszNywyOCBAQAogCQlza2JfZHN0X2Ryb3Aoc2tiKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbmZfYnJpZGdlX2dldF9waHlzaW5pZihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPm5mX2JyaWRnZSA/IHNrYi0+bmZfYnJpZGdlLT5waHlzaW5kZXYtPmlmaW5kZXggOiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZl9icmlkZ2VfZ2V0X3BoeXNvdXRpZihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPm5mX2JyaWRnZSA/IHNrYi0+bmZfYnJpZGdlLT5waHlzb3V0ZGV2LT5pZmluZGV4IDogMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqCituZl9icmlkZ2VfZ2V0X3BoeXNpbmRldihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPm5mX2JyaWRnZSA/IHNrYi0+bmZfYnJpZGdlLT5waHlzaW5kZXYgOiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICoKK25mX2JyaWRnZV9nZXRfcGh5c291dGRldihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXJldHVybiBza2ItPm5mX2JyaWRnZSA/IHNrYi0+bmZfYnJpZGdlLT5waHlzb3V0ZGV2IDogTlVMTDsKK30KICNlbHNlCi0jZGVmaW5lIG5mX2JyaWRnZV9tYXliZV9jb3B5X2hlYWRlcihza2IpCSgwKQotI2RlZmluZSBuZl9icmlkZ2VfcGFkKHNrYikJCQkoMCkKICNkZWZpbmUgYnJfZHJvcF9mYWtlX3J0YWJsZShza2IpCSAgICAgICAgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmIC8qIENPTkZJR19CUklER0VfTkVURklMVEVSICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmgKaW5kZXggMzRlN2EyYi4uZjFiZDM5NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmgKQEAgLTEyLDkgKzEyLDEwIEBACiAjaWZuZGVmIF9fTElOVVhfQlJJREdFX0VGRl9ICiAjZGVmaW5lIF9fTElOVVhfQlJJREdFX0VGRl9ICiAKKyNpbmNsdWRlIDxsaW51eC9pZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmg+CiAKLQogLyogcmV0dXJuIHZhbHVlcyBmb3IgbWF0Y2goKSBmdW5jdGlvbnMgKi8KICNkZWZpbmUgRUJUX01BVENIIDAKICNkZWZpbmUgRUJUX05PTUFUQ0ggMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvaXBfdGFibGVzLmgKaW5kZXggOTAxZTg0ZC4uNDA3MzUxMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oCkBAIC02NSw4ICs2NSw3IEBACiBleHRlcm4gdm9pZCAqaXB0X2FsbG9jX2luaXRpYWxfdGFibGUoY29uc3Qgc3RydWN0IHh0X3RhYmxlICopOwogZXh0ZXJuIHVuc2lnbmVkIGludCBpcHRfZG9fdGFibGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgdW5zaWduZWQgaW50IGhvb2ssCi0JCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkJCSBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKTsKIAogI2lmZGVmIENPTkZJR19DT01QQVQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmgKaW5kZXggNjEwMjA4YjEuLmI0MGQyYjYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjYvaXA2X3RhYmxlcy5oCkBAIC0zMSw4ICszMSw3IEBACiBleHRlcm4gdm9pZCBpcDZ0X3VucmVnaXN0ZXJfdGFibGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKTsKIGV4dGVybiB1bnNpZ25lZCBpbnQgaXA2dF9kb190YWJsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgdW5zaWduZWQgaW50IGhvb2ssCi0JCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJCSAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkJCSAgc3RydWN0IHh0X3RhYmxlICp0YWJsZSk7CiAKIC8qIENoZWNrIGZvciBhbiBleHRlbnNpb24gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0bGluay5oIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKaW5kZXggMDJmYzg2ZC4uNjgzNWMxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRsaW5rLmgKQEAgLTEzNCw3ICsxMzQsNyBAQAogCiBzdHJ1Y3QgbmV0bGlua19ub3RpZnkgewogCXN0cnVjdCBuZXQgKm5ldDsKLQlpbnQgcG9ydGlkOworCXUzMiBwb3J0aWQ7CiAJaW50IHByb3RvY29sOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ubWkuaCBiL2luY2x1ZGUvbGludXgvbm1pLmgKaW5kZXggOWIyMDIyYS4uM2Q0NmZiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ubWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L25taS5oCkBAIC0yNSwxNiArMjUsMTEgQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUikKLWV4dGVybiB2b2lkIHdhdGNoZG9nX2VuYWJsZV9oYXJkbG9ja3VwX2RldGVjdG9yKGJvb2wgdmFsKTsKLWV4dGVybiBib29sIHdhdGNoZG9nX2hhcmRsb2NrdXBfZGV0ZWN0b3JfaXNfZW5hYmxlZCh2b2lkKTsKK2V4dGVybiB2b2lkIGhhcmRsb2NrdXBfZGV0ZWN0b3JfZGlzYWJsZSh2b2lkKTsKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgd2F0Y2hkb2dfZW5hYmxlX2hhcmRsb2NrdXBfZGV0ZWN0b3IoYm9vbCB2YWwpCitzdGF0aWMgaW5saW5lIHZvaWQgaGFyZGxvY2t1cF9kZXRlY3Rvcl9kaXNhYmxlKHZvaWQpCiB7CiB9Ci1zdGF0aWMgaW5saW5lIGJvb2wgd2F0Y2hkb2dfaGFyZGxvY2t1cF9kZXRlY3Rvcl9pc19lbmFibGVkKHZvaWQpCi17Ci0JcmV0dXJuIHRydWU7Ci19CiAjZW5kaWYKIAogLyoKQEAgLTY4LDEyICs2MywyMCBAQAogI2lmZGVmIENPTkZJR19MT0NLVVBfREVURUNUT1IKIGludCBod19ubWlfaXNfY3B1X3N0dWNrKHN0cnVjdCBwdF9yZWdzICopOwogdTY0IGh3X25taV9nZXRfc2FtcGxlX3BlcmlvZChpbnQgd2F0Y2hkb2dfdGhyZXNoKTsKK2V4dGVybiBpbnQgbm1pX3dhdGNoZG9nX2VuYWJsZWQ7CitleHRlcm4gaW50IHNvZnRfd2F0Y2hkb2dfZW5hYmxlZDsKIGV4dGVybiBpbnQgd2F0Y2hkb2dfdXNlcl9lbmFibGVkOwogZXh0ZXJuIGludCB3YXRjaGRvZ190aHJlc2g7CiBleHRlcm4gaW50IHN5c2N0bF9zb2Z0bG9ja3VwX2FsbF9jcHVfYmFja3RyYWNlOwogc3RydWN0IGN0bF90YWJsZTsKLWV4dGVybiBpbnQgcHJvY19kb3dhdGNoZG9nKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50ICwKLQkJCSAgIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CitleHRlcm4gaW50IHByb2Nfd2F0Y2hkb2coc3RydWN0IGN0bF90YWJsZSAqLCBpbnQgLAorCQkJIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CitleHRlcm4gaW50IHByb2Nfbm1pX3dhdGNoZG9nKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50ICwKKwkJCSAgICAgdm9pZCBfX3VzZXIgKiwgc2l6ZV90ICosIGxvZmZfdCAqKTsKK2V4dGVybiBpbnQgcHJvY19zb2Z0X3dhdGNoZG9nKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50ICwKKwkJCSAgICAgIHZvaWQgX191c2VyICosIHNpemVfdCAqLCBsb2ZmX3QgKik7CitleHRlcm4gaW50IHByb2Nfd2F0Y2hkb2dfdGhyZXNoKHN0cnVjdCBjdGxfdGFibGUgKiwgaW50ICwKKwkJCQl2b2lkIF9fdXNlciAqLCBzaXplX3QgKiwgbG9mZl90ICopOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfSEFWRV9BQ1BJX0FQRUlfTk1JCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mLmggYi9pbmNsdWRlL2xpbnV4L29mLmgKaW5kZXggZGZkZTA3ZS4uOWJmY2MxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZi5oCisrKyBiL2luY2x1ZGUvbGludXgvb2YuaApAQCAtMzMyLDYgKzMzMiw3IEBACiAKIGV4dGVybiB2b2lkIG9mX2FsaWFzX3NjYW4odm9pZCAqICgqZHRfYWxsb2MpKHU2NCBzaXplLCB1NjQgYWxpZ24pKTsKIGV4dGVybiBpbnQgb2ZfYWxpYXNfZ2V0X2lkKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNvbnN0IGNoYXIgKnN0ZW0pOworZXh0ZXJuIGludCBvZl9hbGlhc19nZXRfaGlnaGVzdF9pZChjb25zdCBjaGFyICpzdGVtKTsKIAogZXh0ZXJuIGludCBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoY29uc3QgY2hhciAqY29tcGF0KTsKIApAQCAtNTk0LDYgKzU5NSwxMSBAQAogCXJldHVybiAtRU5PU1lTOwogfQogCitzdGF0aWMgaW5saW5lIGludCBvZl9hbGlhc19nZXRfaGlnaGVzdF9pZChjb25zdCBjaGFyICpzdGVtKQoreworCXJldHVybiAtRU5PU1lTOworfQorCiBzdGF0aWMgaW5saW5lIGludCBvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoY29uc3QgY2hhciAqY29tcGF0KQogewogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvb2ZfZGV2aWNlLmgKaW5kZXggZWYzNzAyMS4uMjI4MDFiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX2RldmljZS5oCkBAIC01Myw2ICs1Myw3IEBACiAJcmV0dXJuIG9mX25vZGVfZ2V0KGNwdV9kZXYtPm9mX25vZGUpOwogfQogCit2b2lkIG9mX2RtYV9jb25maWd1cmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKICNlbHNlIC8qIENPTkZJR19PRiAqLwogCiBzdGF0aWMgaW5saW5lIGludCBvZl9kcml2ZXJfbWF0Y2hfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTkwLDYgKzkxLDggQEAKIHsKIAlyZXR1cm4gTlVMTDsKIH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBvZl9kbWFfY29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9ub2RlICpucCkKK3t9CiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKICNlbmRpZiAvKiBfTElOVVhfT0ZfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb2ZfaW9tbXUuaCBiL2luY2x1ZGUvbGludXgvb2ZfaW9tbXUuaAppbmRleCAxNmM3NTU0Li5mZmJlNDcwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX2lvbW11LmgKKysrIGIvaW5jbHVkZS9saW51eC9vZl9pb21tdS5oCkBAIC0xMiw3ICsxMiw4IEBACiAJCQkgICAgIHNpemVfdCAqc2l6ZSk7CiAKIGV4dGVybiB2b2lkIG9mX2lvbW11X2luaXQodm9pZCk7Ci1leHRlcm4gc3RydWN0IGlvbW11X29wcyAqb2ZfaW9tbXVfY29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldik7CitleHRlcm4gc3RydWN0IGlvbW11X29wcyAqb2ZfaW9tbXVfY29uZmlndXJlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9ub2RlICptYXN0ZXJfbnApOwogCiAjZWxzZQogCkBAIC0yNCw3ICsyNSw4IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBvZl9pb21tdV9pbml0KHZvaWQpIHsgfQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaW9tbXVfb3BzICpvZl9pb21tdV9jb25maWd1cmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaW9tbXVfb3BzICpvZl9pb21tdV9jb25maWd1cmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9ub2RlICptYXN0ZXJfbnApCiB7CiAJcmV0dXJuIE5VTEw7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX21kaW8uaCBiL2luY2x1ZGUvbGludXgvb2ZfbWRpby5oCmluZGV4IGQ0NDkwMTguLjhmMjIzN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2ZfbWRpby5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfbWRpby5oCkBAIC0yNCw2ICsyNCw3IEBACiAJCQkJIHBoeV9pbnRlcmZhY2VfdCBpZmFjZSk7CiAKIGV4dGVybiBzdHJ1Y3QgbWlpX2J1cyAqb2ZfbWRpb19maW5kX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm1kaW9fbnApOworZXh0ZXJuIGludCBvZl9tZGlvX3BhcnNlX2FkZHIoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIAogI2Vsc2UgLyogQ09ORklHX09GICovCiBzdGF0aWMgaW5saW5lIGludCBvZl9tZGlvYnVzX3JlZ2lzdGVyKHN0cnVjdCBtaWlfYnVzICptZGlvLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQpAQCAtNjAsNiArNjEsMTIgQEAKIHsKIAlyZXR1cm4gTlVMTDsKIH0KKworc3RhdGljIGlubGluZSBpbnQgb2ZfbWRpb19wYXJzZV9hZGRyKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJcmV0dXJuIC1FTk9TWVM7Cit9CiAjZW5kaWYgLyogQ09ORklHX09GICovCiAKICNpZiBkZWZpbmVkKENPTkZJR19PRikgJiYgZGVmaW5lZChDT05GSUdfRklYRURfUEhZKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9uZXQuaCBiL2luY2x1ZGUvbGludXgvb2ZfbmV0LmgKaW5kZXggMzQ1OTdjOC4uOWNkNzJhYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9uZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX25ldC5oCkBAIC05LDggKzksMTEgQEAKIAogI2lmZGVmIENPTkZJR19PRl9ORVQKICNpbmNsdWRlIDxsaW51eC9vZi5oPgorCitzdHJ1Y3QgbmV0X2RldmljZTsKIGV4dGVybiBpbnQgb2ZfZ2V0X3BoeV9tb2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwogZXh0ZXJuIGNvbnN0IHZvaWQgKm9mX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK2V4dGVybiBzdHJ1Y3QgbmV0X2RldmljZSAqb2ZfZmluZF9uZXRfZGV2aWNlX2J5X25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgb2ZfZ2V0X3BoeV9tb2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCiB7CkBAIC0yMSw2ICsyNCwxMSBAQAogewogCXJldHVybiBOVUxMOwogfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICpvZl9maW5kX25ldF9kZXZpY2VfYnlfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKQoreworCXJldHVybiBOVUxMOworfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfX0xJTlVYX09GX05FVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX3BjaS5oIGIvaW5jbHVkZS9saW51eC9vZl9wY2kuaAppbmRleCBjZTBlNWFiLi4yOWZkM2ZlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX3BjaS5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfcGNpLmgKQEAgLTE2LDYgKzE2LDcgQEAKIGludCBvZl9pcnFfcGFyc2VfYW5kX21hcF9wY2koY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKTsKIGludCBvZl9wY2lfcGFyc2VfYnVzX3JhbmdlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwgc3RydWN0IHJlc291cmNlICpyZXMpOwogaW50IG9mX2dldF9wY2lfZG9tYWluX25yKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSk7Cit2b2lkIG9mX3BjaV9kbWFfY29uZmlndXJlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBvZl9pcnFfcGFyc2VfcGNpKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBzdHJ1Y3Qgb2ZfcGhhbmRsZV9hcmdzICpvdXRfaXJxKQogewpAQCAtNTAsNiArNTEsOCBAQAogewogCXJldHVybiAtMTsKIH0KKworc3RhdGljIGlubGluZSB2b2lkIG9mX3BjaV9kbWFfY29uZmlndXJlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KSB7IH0KICNlbmRpZgogCiAjaWYgZGVmaW5lZChDT05GSUdfT0ZfQUREUkVTUykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb29tLmggYi9pbmNsdWRlL2xpbnV4L29vbS5oCmluZGV4IGQ1NzcxYmVkLi40NGIyZjZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29vbS5oCisrKyBiL2luY2x1ZGUvbGludXgvb29tLmgKQEAgLTY2LDcgKzY2LDggQEAKIGV4dGVybiB2b2lkIG9vbV96b25lbGlzdF91bmxvY2soc3RydWN0IHpvbmVsaXN0ICp6b25lbGlzdCwgZ2ZwX3QgZ2ZwX2ZsYWdzKTsKIAogZXh0ZXJuIHZvaWQgY2hlY2tfcGFuaWNfb25fb29tKGVudW0gb29tX2NvbnN0cmFpbnQgY29uc3RyYWludCwgZ2ZwX3QgZ2ZwX21hc2ssCi0JCQkgICAgICAgaW50IG9yZGVyLCBjb25zdCBub2RlbWFza190ICpub2RlbWFzayk7CisJCQkgICAgICAgaW50IG9yZGVyLCBjb25zdCBub2RlbWFza190ICpub2RlbWFzaywKKwkJCSAgICAgICBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOwogCiBleHRlcm4gZW51bSBvb21fc2Nhbl90IG9vbV9zY2FuX3Byb2Nlc3NfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKIAkJdW5zaWduZWQgbG9uZyB0b3RhbHBhZ2VzLCBjb25zdCBub2RlbWFza190ICpub2RlbWFzaywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oIGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKaW5kZXggNWVkN2JkYS4uZjM0ZTA0MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wYWdlLWZsYWdzLmgKQEAgLTI4OSw2ICsyODksNDcgQEAKICNkZWZpbmUgX19QR19IV1BPSVNPTiAwCiAjZW5kaWYKIAorLyoKKyAqIE9uIGFuIGFub255bW91cyBwYWdlIG1hcHBlZCBpbnRvIGEgdXNlciB2aXJ0dWFsIG1lbW9yeSBhcmVhLAorICogcGFnZS0+bWFwcGluZyBwb2ludHMgdG8gaXRzIGFub25fdm1hLCBub3QgdG8gYSBzdHJ1Y3QgYWRkcmVzc19zcGFjZTsKKyAqIHdpdGggdGhlIFBBR0VfTUFQUElOR19BTk9OIGJpdCBzZXQgdG8gZGlzdGluZ3Vpc2ggaXQuICBTZWUgcm1hcC5oLgorICoKKyAqIE9uIGFuIGFub255bW91cyBwYWdlIGluIGEgVk1fTUVSR0VBQkxFIGFyZWEsIGlmIENPTkZJR19LU00gaXMgZW5hYmxlZCwKKyAqIHRoZSBQQUdFX01BUFBJTkdfS1NNIGJpdCBtYXkgYmUgc2V0IGFsb25nIHdpdGggdGhlIFBBR0VfTUFQUElOR19BTk9OIGJpdDsKKyAqIGFuZCB0aGVuIHBhZ2UtPm1hcHBpbmcgcG9pbnRzLCBub3QgdG8gYW4gYW5vbl92bWEsIGJ1dCB0byBhIHByaXZhdGUKKyAqIHN0cnVjdHVyZSB3aGljaCBLU00gYXNzb2NpYXRlcyB3aXRoIHRoYXQgbWVyZ2VkIHBhZ2UuICBTZWUga3NtLmguCisgKgorICogUEFHRV9NQVBQSU5HX0tTTSB3aXRob3V0IFBBR0VfTUFQUElOR19BTk9OIGlzIGN1cnJlbnRseSBuZXZlciB1c2VkLgorICoKKyAqIFBsZWFzZSBub3RlIHRoYXQsIGNvbmZ1c2luZ2x5LCAicGFnZV9tYXBwaW5nIiByZWZlcnMgdG8gdGhlIGlub2RlCisgKiBhZGRyZXNzX3NwYWNlIHdoaWNoIG1hcHMgdGhlIHBhZ2UgZnJvbSBkaXNrOyB3aGVyZWFzICJwYWdlX21hcHBlZCIKKyAqIHJlZmVycyB0byB1c2VyIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSBpbnRvIHdoaWNoIHRoZSBwYWdlIGlzIG1hcHBlZC4KKyAqLworI2RlZmluZSBQQUdFX01BUFBJTkdfQU5PTgkxCisjZGVmaW5lIFBBR0VfTUFQUElOR19LU00JMgorI2RlZmluZSBQQUdFX01BUFBJTkdfRkxBR1MJKFBBR0VfTUFQUElOR19BTk9OIHwgUEFHRV9NQVBQSU5HX0tTTSkKKworc3RhdGljIGlubGluZSBpbnQgUGFnZUFub24oc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuICgodW5zaWduZWQgbG9uZylwYWdlLT5tYXBwaW5nICYgUEFHRV9NQVBQSU5HX0FOT04pICE9IDA7Cit9CisKKyNpZmRlZiBDT05GSUdfS1NNCisvKgorICogQSBLU00gcGFnZSBpcyBvbmUgb2YgdGhvc2Ugd3JpdGUtcHJvdGVjdGVkICJzaGFyZWQgcGFnZXMiIG9yICJtZXJnZWQgcGFnZXMiCisgKiB3aGljaCBLU00gbWFwcyBpbnRvIG11bHRpcGxlIG1tcywgd2hlcmV2ZXIgaWRlbnRpY2FsIGFub255bW91cyBwYWdlIGNvbnRlbnQKKyAqIGlzIGZvdW5kIGluIFZNX01FUkdFQUJMRSB2bWFzLiAgSXQncyBhIFBhZ2VBbm9uIHBhZ2UsIHBvaW50aW5nIG5vdCB0byBhbnkKKyAqIGFub25fdm1hLCBidXQgdG8gdGhhdCBwYWdlJ3Mgbm9kZSBvZiB0aGUgc3RhYmxlIHRyZWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IFBhZ2VLc20oc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuICgodW5zaWduZWQgbG9uZylwYWdlLT5tYXBwaW5nICYgUEFHRV9NQVBQSU5HX0ZMQUdTKSA9PQorCQkJCShQQUdFX01BUFBJTkdfQU5PTiB8IFBBR0VfTUFQUElOR19LU00pOworfQorI2Vsc2UKK1RFU1RQQUdFRkxBR19GQUxTRShLc20pCisjZW5kaWYKKwogdTY0IHN0YWJsZV9wYWdlX2ZsYWdzKHN0cnVjdCBwYWdlICpwYWdlKTsKIAogc3RhdGljIGlubGluZSBpbnQgUGFnZVVwdG9kYXRlKHN0cnVjdCBwYWdlICpwYWdlKQpAQCAtMzI4LDggKzM2OSw2IEBACiAKIENMRUFSUEFHRUZMQUcoVXB0b2RhdGUsIHVwdG9kYXRlKQogCi1leHRlcm4gdm9pZCBjYW5jZWxfZGlydHlfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGFjY291bnRfc2l6ZSk7Ci0KIGludCB0ZXN0X2NsZWFyX3BhZ2Vfd3JpdGViYWNrKHN0cnVjdCBwYWdlICpwYWdlKTsKIGludCBfX3Rlc3Rfc2V0X3BhZ2Vfd3JpdGViYWNrKHN0cnVjdCBwYWdlICpwYWdlLCBib29sIGtlZXBfd3JpdGUpOwogCkBAIC00MjgsNiArNDY3LDIxIEBACiAKICNlbmRpZiAvKiAhUEFHRUZMQUdTX0VYVEVOREVEICovCiAKKyNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCitpbnQgUGFnZUh1Z2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOworaW50IFBhZ2VIZWFkSHVnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7Citib29sIHBhZ2VfaHVnZV9hY3RpdmUoc3RydWN0IHBhZ2UgKnBhZ2UpOworI2Vsc2UKK1RFU1RQQUdFRkxBR19GQUxTRShIdWdlKQorVEVTVFBBR0VGTEFHX0ZBTFNFKEhlYWRIdWdlKQorCitzdGF0aWMgaW5saW5lIGJvb2wgcGFnZV9odWdlX2FjdGl2ZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisKICNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UKIC8qCiAgKiBQYWdlSHVnZSgpIG9ubHkgcmV0dXJucyB0cnVlIGZvciBodWdldGxiZnMgcGFnZXMsIGJ1dCBub3QgZm9yCkBAIC00ODIsNiArNTM2LDUzIEBACiAjZW5kaWYKIAogLyoKKyAqIFBhZ2VCdWRkeSgpIGluZGljYXRlIHRoYXQgdGhlIHBhZ2UgaXMgZnJlZSBhbmQgaW4gdGhlIGJ1ZGR5IHN5c3RlbQorICogKHNlZSBtbS9wYWdlX2FsbG9jLmMpLgorICoKKyAqIFBBR0VfQlVERFlfTUFQQ09VTlRfVkFMVUUgbXVzdCBiZSA8PSAtMiBidXQgYmV0dGVyIG5vdCB0b28gY2xvc2UgdG8KKyAqIC0yIHNvIHRoYXQgYW4gdW5kZXJmbG93IG9mIHRoZSBwYWdlX21hcGNvdW50KCkgd29uJ3QgYmUgbWlzdGFrZW4KKyAqIGZvciBhIGdlbnVpbmUgUEFHRV9CVUREWV9NQVBDT1VOVF9WQUxVRS4gLTEyOCBjYW4gYmUgY3JlYXRlZCB2ZXJ5CisgKiBlZmZpY2llbnRseSBieSBtb3N0IENQVSBhcmNoaXRlY3R1cmVzLgorICovCisjZGVmaW5lIFBBR0VfQlVERFlfTUFQQ09VTlRfVkFMVUUgKC0xMjgpCisKK3N0YXRpYyBpbmxpbmUgaW50IFBhZ2VCdWRkeShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJnBhZ2UtPl9tYXBjb3VudCkgPT0gUEFHRV9CVUREWV9NQVBDT1VOVF9WQUxVRTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fU2V0UGFnZUJ1ZGR5KHN0cnVjdCBwYWdlICpwYWdlKQoreworCVZNX0JVR19PTl9QQUdFKGF0b21pY19yZWFkKCZwYWdlLT5fbWFwY291bnQpICE9IC0xLCBwYWdlKTsKKwlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIFBBR0VfQlVERFlfTUFQQ09VTlRfVkFMVUUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19DbGVhclBhZ2VCdWRkeShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlWTV9CVUdfT05fUEFHRSghUGFnZUJ1ZGR5KHBhZ2UpLCBwYWdlKTsKKwlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIC0xKTsKK30KKworI2RlZmluZSBQQUdFX0JBTExPT05fTUFQQ09VTlRfVkFMVUUgKC0yNTYpCisKK3N0YXRpYyBpbmxpbmUgaW50IFBhZ2VCYWxsb29uKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmcGFnZS0+X21hcGNvdW50KSA9PSBQQUdFX0JBTExPT05fTUFQQ09VTlRfVkFMVUU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX1NldFBhZ2VCYWxsb29uKHN0cnVjdCBwYWdlICpwYWdlKQoreworCVZNX0JVR19PTl9QQUdFKGF0b21pY19yZWFkKCZwYWdlLT5fbWFwY291bnQpICE9IC0xLCBwYWdlKTsKKwlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIFBBR0VfQkFMTE9PTl9NQVBDT1VOVF9WQUxVRSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX0NsZWFyUGFnZUJhbGxvb24oc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJVk1fQlVHX09OX1BBR0UoIVBhZ2VCYWxsb29uKHBhZ2UpLCBwYWdlKTsKKwlhdG9taWNfc2V0KCZwYWdlLT5fbWFwY291bnQsIC0xKTsKK30KKworLyoKICAqIElmIG5ldHdvcmstYmFzZWQgc3dhcCBpcyBlbmFibGVkLCBzbCpiIG11c3Qga2VlcCB0cmFjayBvZiB3aGV0aGVyIHBhZ2VzCiAgKiB3ZXJlIGFsbG9jYXRlZCBmcm9tIHBmbWVtYWxsb2MgcmVzZXJ2ZXMuCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLWFjcGkuaCBiL2luY2x1ZGUvbGludXgvcGNpLWFjcGkuaAppbmRleCAyNGM3NzI4Li5hOTY1ZWZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS1hY3BpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2ktYWNwaS5oCkBAIC03Nyw2ICs3NywxMSBAQAogc3RhdGljIGlubGluZSB2b2lkIGFjcGlwaHBfY2hlY2tfaG9zdF9icmlkZ2Uoc3RydWN0IGFjcGlfZGV2aWNlICphZGV2KSB7IH0KICNlbmRpZgogCitleHRlcm4gY29uc3QgdTggcGNpX2FjcGlfZHNtX3V1aWRbXTsKKyNkZWZpbmUgREVWSUNFX0xBQkVMX0RTTQkweDA3CisjZGVmaW5lIFJFU0VUX0RFTEFZX0RTTQkJMHgwOAorI2RlZmluZSBGVU5DVElPTl9ERUxBWV9EU00JMHgwOQorCiAjZWxzZQkvKiBDT05GSUdfQUNQSSAqLwogc3RhdGljIGlubGluZSB2b2lkIGFjcGlfcGNpX2FkZF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cykgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgYWNwaV9wY2lfcmVtb3ZlX2J1cyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKSB7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpLWFzcG0uaCBiL2luY2x1ZGUvbGludXgvcGNpLWFzcG0uaAppbmRleCA4YWY0NjEwLi4yMDdjNTYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaS1hc3BtLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2ktYXNwbS5oCkBAIC0yOSw3ICsyOSw2IEBACiB2b2lkIHBjaWVfYXNwbV9wb3dlcnNhdmVfY29uZmlnX2xpbmsoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogdm9pZCBwY2lfZGlzYWJsZV9saW5rX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgc3RhdGUpOwogdm9pZCBwY2lfZGlzYWJsZV9saW5rX3N0YXRlX2xvY2tlZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHN0YXRlKTsKLXZvaWQgcGNpZV9jbGVhcl9hc3BtKHN0cnVjdCBwY2lfYnVzICpidXMpOwogdm9pZCBwY2llX25vX2FzcG0odm9pZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHBjaWVfYXNwbV9pbml0X2xpbmtfc3RhdGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCkBAIC00Nyw5ICs0Niw2IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgcGNpX2Rpc2FibGVfbGlua19zdGF0ZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHN0YXRlKQogewogfQotc3RhdGljIGlubGluZSB2b2lkIHBjaWVfY2xlYXJfYXNwbShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQotewotfQogc3RhdGljIGlubGluZSB2b2lkIHBjaWVfbm9fYXNwbSh2b2lkKQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggNGUxZjE3ZC4uMzUzZGI4ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC00MDYsNiArNDA2LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIHdpbmRvd3M7CS8qIHJlc291cmNlX2VudHJ5ICovCiAJdm9pZCAoKnJlbGVhc2VfZm4pKHN0cnVjdCBwY2lfaG9zdF9icmlkZ2UgKik7CiAJdm9pZCAqcmVsZWFzZV9kYXRhOworCXVuc2lnbmVkIGludCBpZ25vcmVfcmVzZXRfZGVsYXk6MTsJLyogZm9yIGVudGlyZSBoaWVyYXJjaHkgKi8KIH07CiAKICNkZWZpbmUJdG9fcGNpX2hvc3RfYnJpZGdlKG4pIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3QgcGNpX2hvc3RfYnJpZGdlLCBkZXYpCkBAIC01MTAsNiArNTExLDkgQEAKIAlyZXR1cm4gZGV2LT5idXMtPnNlbGY7CiB9CiAKK3N0cnVjdCBkZXZpY2UgKnBjaV9nZXRfaG9zdF9icmlkZ2VfZGV2aWNlKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwordm9pZCBwY2lfcHV0X2hvc3RfYnJpZGdlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCiAjaWZkZWYgQ09ORklHX1BDSV9NU0kKIHN0YXRpYyBpbmxpbmUgYm9vbCBwY2lfZGV2X21zaV9lbmFibGVkKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCBlNjNjMDJhLi4zOGNmZjhmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaApAQCAtMjMxNSw2ICsyMzE1LDggQEAKICNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DRU5BVEVLCQkweDE2Q0EKICNkZWZpbmUgUENJX0RFVklDRV9JRF9DRU5BVEVLX0lERQkweDAwMDEKIAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NZTk9QU1lTCQkweDE2YzMKKwogI2RlZmluZSBQQ0lfVkVORE9SX0lEX1ZJVEVTU0UJCTB4MTcyNQogI2RlZmluZSBQQ0lfREVWSUNFX0lEX1ZJVEVTU0VfVlNDNzE3NAkweDcxNzQKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmggYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAppbmRleCAyYjYyMTk4Li42MTk5MmNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaApAQCAtNTMsNiArNTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9yZWdzLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvY2dyb3VwLmg+CiAjaW5jbHVkZSA8YXNtL2xvY2FsLmg+CiAKIHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSB7CkBAIC0xMTgsMTAgKzExOSwxOSBAQAogCQkJc3RydWN0IGhydGltZXIJaHJ0aW1lcjsKIAkJfTsKIAkJc3RydWN0IHsgLyogdHJhY2Vwb2ludCAqLwotCQkJc3RydWN0IHRhc2tfc3RydWN0CSp0cF90YXJnZXQ7CiAJCQkvKiBmb3IgdHBfZXZlbnQtPmNsYXNzICovCiAJCQlzdHJ1Y3QgbGlzdF9oZWFkCXRwX2xpc3Q7CiAJCX07CisJCXN0cnVjdCB7IC8qIGludGVsX2NxbSAqLworCQkJaW50CQkJY3FtX3N0YXRlOworCQkJaW50CQkJY3FtX3JtaWQ7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkCWNxbV9ldmVudHNfZW50cnk7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkCWNxbV9ncm91cHNfZW50cnk7CisJCQlzdHJ1Y3QgbGlzdF9oZWFkCWNxbV9ncm91cF9lbnRyeTsKKwkJfTsKKwkJc3RydWN0IHsgLyogaXRyYWNlICovCisJCQlpbnQJCQlpdHJhY2Vfc3RhcnRlZDsKKwkJfTsKICNpZmRlZiBDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UCiAJCXN0cnVjdCB7IC8qIGJyZWFrcG9pbnQgKi8KIAkJCS8qCkBAIC0xMjksMTIgKzEzOSwxMiBAQAogCQkJICogcHJvYmxlbSBod19icmVha3BvaW50IGhhcyB3aXRoIGNvbnRleHQKIAkJCSAqIGNyZWF0aW9uIGFuZCBldmVudCBpbml0YWxpemF0aW9uLgogCQkJICovCi0JCQlzdHJ1Y3QgdGFza19zdHJ1Y3QJCSpicF90YXJnZXQ7CiAJCQlzdHJ1Y3QgYXJjaF9od19icmVha3BvaW50CWluZm87CiAJCQlzdHJ1Y3QgbGlzdF9oZWFkCQlicF9saXN0OwogCQl9OwogI2VuZGlmCiAJfTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJCSp0YXJnZXQ7CiAJaW50CQkJCXN0YXRlOwogCWxvY2FsNjRfdAkJCXByZXZfY291bnQ7CiAJdTY0CQkJCXNhbXBsZV9wZXJpb2Q7CkBAIC0xNjYsNiArMTc2LDExIEBACiAgKiBwbXU6OmNhcGFiaWxpdGllcyBmbGFncwogICovCiAjZGVmaW5lIFBFUkZfUE1VX0NBUF9OT19JTlRFUlJVUFQJCTB4MDEKKyNkZWZpbmUgUEVSRl9QTVVfQ0FQX05PX05NSQkJCTB4MDIKKyNkZWZpbmUgUEVSRl9QTVVfQ0FQX0FVWF9OT19TRwkJCTB4MDQKKyNkZWZpbmUgUEVSRl9QTVVfQ0FQX0FVWF9TV19ET1VCTEVCVUYJCTB4MDgKKyNkZWZpbmUgUEVSRl9QTVVfQ0FQX0VYQ0xVU0lWRQkJCTB4MTAKKyNkZWZpbmUgUEVSRl9QTVVfQ0FQX0lUUkFDRQkJCTB4MjAKIAogLyoqCiAgKiBzdHJ1Y3QgcG11IC0gZ2VuZXJpYyBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIHVuaXQKQEAgLTE4Niw2ICsyMDEsNyBAQAogCiAJaW50ICogX19wZXJjcHUJCQlwbXVfZGlzYWJsZV9jb3VudDsKIAlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqIF9fcGVyY3B1IHBtdV9jcHVfY29udGV4dDsKKwlhdG9taWNfdAkJCWV4Y2x1c2l2ZV9jbnQ7IC8qIDwgMDogY3B1OyA+IDA6IHRzayAqLwogCWludAkJCQl0YXNrX2N0eF9ucjsKIAlpbnQJCQkJaHJ0aW1lcl9pbnRlcnZhbF9tczsKIApAQCAtMjYyLDkgKzI3OCwzMiBAQAogCWludCAoKmV2ZW50X2lkeCkJCShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOyAvKm9wdGlvbmFsICovCiAKIAkvKgotCSAqIGZsdXNoIGJyYW5jaCBzdGFjayBvbiBjb250ZXh0LXN3aXRjaGVzIChuZWVkZWQgaW4gY3B1LXdpZGUgbW9kZSkKKwkgKiBjb250ZXh0LXN3aXRjaGVzIGNhbGxiYWNrCiAJICovCi0Jdm9pZCAoKmZsdXNoX2JyYW5jaF9zdGFjaykJKHZvaWQpOworCXZvaWQgKCpzY2hlZF90YXNrKQkJKHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCwKKwkJCQkJYm9vbCBzY2hlZF9pbik7CisJLyoKKwkgKiBQTVUgc3BlY2lmaWMgZGF0YSBzaXplCisJICovCisJc2l6ZV90CQkJCXRhc2tfY3R4X3NpemU7CisKKworCS8qCisJICogUmV0dXJuIHRoZSBjb3VudCB2YWx1ZSBmb3IgYSBjb3VudGVyLgorCSAqLworCXU2NCAoKmNvdW50KQkJCShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOyAvKm9wdGlvbmFsKi8KKworCS8qCisJICogU2V0IHVwIHBtdS1wcml2YXRlIGRhdGEgc3RydWN0dXJlcyBmb3IgYW4gQVVYIGFyZWEKKwkgKi8KKwl2b2lkICooKnNldHVwX2F1eCkJCShpbnQgY3B1LCB2b2lkICoqcGFnZXMsCisJCQkJCSBpbnQgbnJfcGFnZXMsIGJvb2wgb3ZlcndyaXRlKTsKKwkJCQkJLyogb3B0aW9uYWwgKi8KKworCS8qCisJICogRnJlZSBwbXUtcHJpdmF0ZSBBVVggZGF0YSBzdHJ1Y3R1cmVzCisJICovCisJdm9pZCAoKmZyZWVfYXV4KQkJKHZvaWQgKmF1eCk7IC8qIG9wdGlvbmFsICovCiB9OwogCiAvKioKQEAgLTMwMCw2ICszMzksNyBAQAogI2RlZmluZSBQRVJGX0FUVEFDSF9DT05URVhUCTB4MDEKICNkZWZpbmUgUEVSRl9BVFRBQ0hfR1JPVVAJMHgwMgogI2RlZmluZSBQRVJGX0FUVEFDSF9UQVNLCTB4MDQKKyNkZWZpbmUgUEVSRl9BVFRBQ0hfVEFTS19EQVRBCTB4MDgKIAogc3RydWN0IHBlcmZfY2dyb3VwOwogc3RydWN0IHJpbmdfYnVmZmVyOwpAQCAtNDM4LDYgKzQ3OCw3IEBACiAJc3RydWN0IHBpZF9uYW1lc3BhY2UJCSpuczsKIAl1NjQJCQkJaWQ7CiAKKwl1NjQJCQkJKCpjbG9jaykodm9pZCk7CiAJcGVyZl9vdmVyZmxvd19oYW5kbGVyX3QJCW92ZXJmbG93X2hhbmRsZXI7CiAJdm9pZAkJCQkqb3ZlcmZsb3dfaGFuZGxlcl9jb250ZXh0OwogCkBAIC01MDQsNyArNTQ1LDcgQEAKIAl1NjQJCQkJZ2VuZXJhdGlvbjsKIAlpbnQJCQkJcGluX2NvdW50OwogCWludAkJCQlucl9jZ3JvdXBzOwkgLyogY2dyb3VwIGV2dHMgKi8KLQlpbnQJCQkJbnJfYnJhbmNoX3N0YWNrOyAvKiBicmFuY2hfc3RhY2sgZXZ0ICovCisJdm9pZAkJCQkqdGFza19jdHhfZGF0YTsgLyogcG11IHNwZWNpZmljIGRhdGEgKi8KIAlzdHJ1Y3QgcmN1X2hlYWQJCQlyY3VfaGVhZDsKIAogCXN0cnVjdCBkZWxheWVkX3dvcmsJCW9ycGhhbnNfcmVtb3ZlOwpAQCAtNTM2LDEyICs1NzcsNTIgQEAKIAlzdHJ1Y3QgcmluZ19idWZmZXIJCSpyYjsKIAl1bnNpZ25lZCBsb25nCQkJd2FrZXVwOwogCXVuc2lnbmVkIGxvbmcJCQlzaXplOwotCXZvaWQJCQkJKmFkZHI7CisJdW5pb24geworCQl2b2lkCQkJKmFkZHI7CisJCXVuc2lnbmVkIGxvbmcJCWhlYWQ7CisJfTsKIAlpbnQJCQkJcGFnZTsKIH07CiAKKyNpZmRlZiBDT05GSUdfQ0dST1VQX1BFUkYKKworLyoKKyAqIHBlcmZfY2dyb3VwX2luZm8ga2VlcHMgdHJhY2sgb2YgdGltZV9lbmFibGVkIGZvciBhIGNncm91cC4KKyAqIFRoaXMgaXMgYSBwZXItY3B1IGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IHBlcmZfY2dyb3VwX2luZm8geworCXU2NAkJCQl0aW1lOworCXU2NAkJCQl0aW1lc3RhbXA7Cit9OworCitzdHJ1Y3QgcGVyZl9jZ3JvdXAgeworCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlCWNzczsKKwlzdHJ1Y3QgcGVyZl9jZ3JvdXBfaW5mbwlfX3BlcmNwdSAqaW5mbzsKK307CisKKy8qCisgKiBNdXN0IGVuc3VyZSBjZ3JvdXAgaXMgcGlubmVkIChjc3NfZ2V0KSBiZWZvcmUgY2FsbGluZworICogdGhpcyBmdW5jdGlvbi4gSW4gb3RoZXIgd29yZHMsIHdlIGNhbm5vdCBjYWxsIHRoaXMgZnVuY3Rpb24KKyAqIGlmIHRoZXJlIGlzIG5vIGNncm91cCBldmVudCBmb3IgdGhlIGN1cnJlbnQgQ1BVIGNvbnRleHQuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBlcmZfY2dyb3VwICoKK3BlcmZfY2dyb3VwX2Zyb21fdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih0YXNrX2Nzcyh0YXNrLCBwZXJmX2V2ZW50X2NncnBfaWQpLAorCQkJICAgIHN0cnVjdCBwZXJmX2Nncm91cCwgY3NzKTsKK30KKyNlbmRpZiAvKiBDT05GSUdfQ0dST1VQX1BFUkYgKi8KKwogI2lmZGVmIENPTkZJR19QRVJGX0VWRU5UUwogCitleHRlcm4gdm9pZCAqcGVyZl9hdXhfb3V0cHV0X2JlZ2luKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwKKwkJCQkgICBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOworZXh0ZXJuIHZvaWQgcGVyZl9hdXhfb3V0cHV0X2VuZChzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCisJCQkJdW5zaWduZWQgbG9uZyBzaXplLCBib29sIHRydW5jYXRlZCk7CitleHRlcm4gaW50IHBlcmZfYXV4X291dHB1dF9za2lwKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwKKwkJCQl1bnNpZ25lZCBsb25nIHNpemUpOworZXh0ZXJuIHZvaWQgKnBlcmZfZ2V0X2F1eChzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpOworCiBleHRlcm4gaW50IHBlcmZfcG11X3JlZ2lzdGVyKHN0cnVjdCBwbXUgKnBtdSwgY29uc3QgY2hhciAqbmFtZSwgaW50IHR5cGUpOwogZXh0ZXJuIHZvaWQgcGVyZl9wbXVfdW5yZWdpc3RlcihzdHJ1Y3QgcG11ICpwbXUpOwogCkBAIC01NTgsNiArNjM5LDggQEAKIGV4dGVybiB2b2lkIHBlcmZfZXZlbnRfcHJpbnRfZGVidWcodm9pZCk7CiBleHRlcm4gdm9pZCBwZXJmX3BtdV9kaXNhYmxlKHN0cnVjdCBwbXUgKnBtdSk7CiBleHRlcm4gdm9pZCBwZXJmX3BtdV9lbmFibGUoc3RydWN0IHBtdSAqcG11KTsKK2V4dGVybiB2b2lkIHBlcmZfc2NoZWRfY2JfZGVjKHN0cnVjdCBwbXUgKnBtdSk7CitleHRlcm4gdm9pZCBwZXJmX3NjaGVkX2NiX2luYyhzdHJ1Y3QgcG11ICpwbXUpOwogZXh0ZXJuIGludCBwZXJmX2V2ZW50X3Rhc2tfZGlzYWJsZSh2b2lkKTsKIGV4dGVybiBpbnQgcGVyZl9ldmVudF90YXNrX2VuYWJsZSh2b2lkKTsKIGV4dGVybiBpbnQgcGVyZl9ldmVudF9yZWZyZXNoKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgaW50IHJlZnJlc2gpOwpAQCAtNzMxLDYgKzgxNCwxMSBAQAogCQlfX3BlcmZfZXZlbnRfdGFza19zY2hlZF9vdXQocHJldiwgbmV4dCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTY0IF9fcGVyZl9ldmVudF9jb3VudChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIGxvY2FsNjRfcmVhZCgmZXZlbnQtPmNvdW50KSArIGF0b21pYzY0X3JlYWQoJmV2ZW50LT5jaGlsZF9jb3VudCk7Cit9CisKIGV4dGVybiB2b2lkIHBlcmZfZXZlbnRfbW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiBleHRlcm4gc3RydWN0IHBlcmZfZ3Vlc3RfaW5mb19jYWxsYmFja3MgKnBlcmZfZ3Vlc3RfY2JzOwogZXh0ZXJuIGludCBwZXJmX3JlZ2lzdGVyX2d1ZXN0X2luZm9fY2FsbGJhY2tzKHN0cnVjdCBwZXJmX2d1ZXN0X2luZm9fY2FsbGJhY2tzICpjYWxsYmFja3MpOwpAQCAtODAwLDYgKzg4OCwxNiBAQAogCXJldHVybiBldmVudC0+YXR0ci5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0JSQU5DSF9TVEFDSzsKIH0KIAorc3RhdGljIGlubGluZSBib29sIG5lZWRzX2JyYW5jaF9zdGFjayhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIGV2ZW50LT5hdHRyLmJyYW5jaF9zYW1wbGVfdHlwZSAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaGFzX2F1eChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIGV2ZW50LT5wbXUtPnNldHVwX2F1eDsKK30KKwogZXh0ZXJuIGludCBwZXJmX291dHB1dF9iZWdpbihzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCiAJCQkgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdW5zaWduZWQgaW50IHNpemUpOwogZXh0ZXJuIHZvaWQgcGVyZl9vdXRwdXRfZW5kKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSk7CkBAIC04MTUsNiArOTEzLDE3IEBACiBleHRlcm4gaW50IF9fcGVyZl9ldmVudF9kaXNhYmxlKHZvaWQgKmluZm8pOwogZXh0ZXJuIHZvaWQgcGVyZl9ldmVudF90YXNrX3RpY2sodm9pZCk7CiAjZWxzZSAvKiAhQ09ORklHX1BFUkZfRVZFTlRTOiAqLworc3RhdGljIGlubGluZSB2b2lkICoKK3BlcmZfYXV4X291dHB1dF9iZWdpbihzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCisJCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkJCQkJeyByZXR1cm4gTlVMTDsgfQorc3RhdGljIGlubGluZSB2b2lkCitwZXJmX2F1eF9vdXRwdXRfZW5kKHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkgICAgYm9vbCB0cnVuY2F0ZWQpCQkJCQl7IH0KK3N0YXRpYyBpbmxpbmUgaW50CitwZXJmX2F1eF9vdXRwdXRfc2tpcChzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCisJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplKQkJCQl7IHJldHVybiAtRUlOVkFMOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgKgorcGVyZl9nZXRfYXV4KHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSkJCQkJeyByZXR1cm4gTlVMTDsgfQogc3RhdGljIGlubGluZSB2b2lkCiBwZXJmX2V2ZW50X3Rhc2tfc2NoZWRfaW4oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAogCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykJCQl7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGVyc29uYWxpdHkuaCBiL2luY2x1ZGUvbGludXgvcGVyc29uYWxpdHkuaAppbmRleCA2NDZjMGE3Li5hZWI3ODkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcnNvbmFsaXR5LmgKKysrIGIvaW5jbHVkZS9saW51eC9wZXJzb25hbGl0eS5oCkBAIC0zLDUyICszLDE0IEBACiAKICNpbmNsdWRlIDx1YXBpL2xpbnV4L3BlcnNvbmFsaXR5Lmg+CiAKLQotLyoKLSAqIEhhbmRsaW5nIG9mIGRpZmZlcmVudCBBQklzIChwZXJzb25hbGl0aWVzKS4KLSAqLwotCi1zdHJ1Y3QgZXhlY19kb21haW47Ci1zdHJ1Y3QgcHRfcmVnczsKLQotZXh0ZXJuIGludAkJcmVnaXN0ZXJfZXhlY19kb21haW4oc3RydWN0IGV4ZWNfZG9tYWluICopOwotZXh0ZXJuIGludAkJdW5yZWdpc3Rlcl9leGVjX2RvbWFpbihzdHJ1Y3QgZXhlY19kb21haW4gKik7Ci1leHRlcm4gaW50CQlfX3NldF9wZXJzb25hbGl0eSh1bnNpZ25lZCBpbnQpOwotCi0KLS8qCi0gKiBEZXNjcmlwdGlvbiBvZiBhbiBleGVjdXRpb24gZG9tYWluLgotICogCi0gKiBUaGUgZmlyc3QgdHdvIG1lbWJlcnMgYXJlIHJlZmVybmNlZCBmcm9tIGFzc2VtYmx5IHNvdXJjZQotICogYW5kIHNob3VsZCBzdGF5IHdoZXJlIHRoZXkgYXJlIHVubGVzcyBleHBsaWNpdGx5IG5lZWRlZC4KLSAqLwotdHlwZWRlZiB2b2lkICgqaGFuZGxlcl90KShpbnQsIHN0cnVjdCBwdF9yZWdzICopOwotCi1zdHJ1Y3QgZXhlY19kb21haW4gewotCWNvbnN0IGNoYXIJCSpuYW1lOwkJLyogbmFtZSBvZiB0aGUgZXhlY2RvbWFpbiAqLwotCWhhbmRsZXJfdAkJaGFuZGxlcjsJLyogaGFuZGxlciBmb3Igc3lzY2FsbHMgKi8KLQl1bnNpZ25lZCBjaGFyCQlwZXJzX2xvdzsJLyogbG93ZXN0IHBlcnNvbmFsaXR5ICovCi0JdW5zaWduZWQgY2hhcgkJcGVyc19oaWdoOwkvKiBoaWdoZXN0IHBlcnNvbmFsaXR5ICovCi0JdW5zaWduZWQgbG9uZwkJKnNpZ25hbF9tYXA7CS8qIHNpZ25hbCBtYXBwaW5nICovCi0JdW5zaWduZWQgbG9uZwkJKnNpZ25hbF9pbnZtYXA7CS8qIHJldmVyc2Ugc2lnbmFsIG1hcHBpbmcgKi8KLQlzdHJ1Y3QgbWFwX3NlZ21lbnQJKmVycl9tYXA7CS8qIGVycm9yIG1hcHBpbmcgKi8KLQlzdHJ1Y3QgbWFwX3NlZ21lbnQJKnNvY2t0eXBlX21hcDsJLyogc29ja2V0IHR5cGUgbWFwcGluZyAqLwotCXN0cnVjdCBtYXBfc2VnbWVudAkqc29ja29wdF9tYXA7CS8qIHNvY2tldCBvcHRpb24gbWFwcGluZyAqLwotCXN0cnVjdCBtYXBfc2VnbWVudAkqYWZfbWFwOwkvKiBhZGRyZXNzIGZhbWlseSBtYXBwaW5nICovCi0Jc3RydWN0IG1vZHVsZQkJKm1vZHVsZTsJLyogbW9kdWxlIGNvbnRleHQgb2YgdGhlIGVkLiAqLwotCXN0cnVjdCBleGVjX2RvbWFpbgkqbmV4dDsJCS8qIGxpbmtlZCBsaXN0IChpbnRlcm5hbCkgKi8KLX07Ci0KIC8qCiAgKiBSZXR1cm4gdGhlIGJhc2UgcGVyc29uYWxpdHkgd2l0aG91dCBmbGFncy4KICAqLwogI2RlZmluZSBwZXJzb25hbGl0eShwZXJzKQkocGVycyAmIFBFUl9NQVNLKQogCi0KIC8qCiAgKiBDaGFuZ2UgcGVyc29uYWxpdHkgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIHByb2Nlc3MuCiAgKi8KLSNkZWZpbmUgc2V0X3BlcnNvbmFsaXR5KHBlcnMpIFwKLQkoKGN1cnJlbnQtPnBlcnNvbmFsaXR5ID09IChwZXJzKSkgPyAwIDogX19zZXRfcGVyc29uYWxpdHkocGVycykpCisjZGVmaW5lIHNldF9wZXJzb25hbGl0eShwZXJzKQkoY3VycmVudC0+cGVyc29uYWxpdHkgPSAocGVycykpCiAKICNlbmRpZiAvKiBfTElOVVhfUEVSU09OQUxJVFlfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waHlfZml4ZWQuaCBiL2luY2x1ZGUvbGludXgvcGh5X2ZpeGVkLmgKaW5kZXggN2U3NWJmZS4uZmU1NzMyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waHlfZml4ZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BoeV9maXhlZC5oCkBAIC0yMSw2ICsyMSw5IEBACiBleHRlcm4gaW50IGZpeGVkX3BoeV9zZXRfbGlua191cGRhdGUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKIAkJCWludCAoKmxpbmtfdXBkYXRlKShzdHJ1Y3QgbmV0X2RldmljZSAqLAogCQkJCQkgICBzdHJ1Y3QgZml4ZWRfcGh5X3N0YXR1cyAqKSk7CitleHRlcm4gaW50IGZpeGVkX3BoeV91cGRhdGVfc3RhdGUoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldiwKKwkJCSAgIGNvbnN0IHN0cnVjdCBmaXhlZF9waHlfc3RhdHVzICpzdGF0dXMsCisJCQkgICBjb25zdCBzdHJ1Y3QgZml4ZWRfcGh5X3N0YXR1cyAqY2hhbmdlZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgZml4ZWRfcGh5X2FkZCh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgcGh5X2lkLAogCQkJCXN0cnVjdCBmaXhlZF9waHlfc3RhdHVzICpzdGF0dXMpCkBAIC00Myw2ICs0NiwxMiBAQAogewogCXJldHVybiAtRU5PREVWOwogfQorc3RhdGljIGlubGluZSBpbnQgZml4ZWRfcGh5X3VwZGF0ZV9zdGF0ZShzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2LAorCQkJICAgY29uc3Qgc3RydWN0IGZpeGVkX3BoeV9zdGF0dXMgKnN0YXR1cywKKwkJCSAgIGNvbnN0IHN0cnVjdCBmaXhlZF9waHlfc3RhdHVzICpjaGFuZ2VkKQoreworCXJldHVybiAtRU5PREVWOworfQogI2VuZGlmIC8qIENPTkZJR19GSVhFRF9QSFkgKi8KIAogI2VuZGlmIC8qIF9fUEhZX0ZJWEVEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGluY3RybC9jb25zdW1lci5oIGIvaW5jbHVkZS9saW51eC9waW5jdHJsL2NvbnN1bWVyLmgKaW5kZXggNzJjMDQxNWQuLjE4ZWNjZWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGluY3RybC9jb25zdW1lci5oCisrKyBiL2luY2x1ZGUvbGludXgvcGluY3RybC9jb25zdW1lci5oCkBAIC04Miw3ICs4Miw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHBpbmN0cmwgKiBfX211c3RfY2hlY2sgcGluY3RybF9nZXQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGluY3RybF9wdXQoc3RydWN0IHBpbmN0cmwgKnApCkBAIC05Myw3ICs5Myw3IEBACiAJCQkJCQkJc3RydWN0IHBpbmN0cmwgKnAsCiAJCQkJCQkJY29uc3QgY2hhciAqbmFtZSkKIHsKLQlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcGluY3RybF9zZWxlY3Rfc3RhdGUoc3RydWN0IHBpbmN0cmwgKnAsCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGluY3RybCAqIF9fbXVzdF9jaGVjayBkZXZtX3BpbmN0cmxfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRldm1fcGluY3RybF9wdXQoc3RydWN0IHBpbmN0cmwgKnApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvaHNtbWMtb21hcC5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2hzbW1jLW9tYXAuaAppbmRleCA2N2JiY2YwLi44ZTk4MWJlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvaHNtbWMtb21hcC5oCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9oc21tYy1vbWFwLmgKQEAgLTU1LDkgKzU1LDYgQEAKIAl1MzIgY2FwczsJLyogVXNlZCBmb3IgdGhlIE1NQyBkcml2ZXIgb24gMjQzMCBhbmQgbGF0ZXIgKi8KIAl1MzIgcG1fY2FwczsJLyogUE0gY2FwYWJpbGl0aWVzIG9mIHRoZSBtbWMgKi8KIAotCS8qIHN3aXRjaCBwaW4gY2FuIGJlIGZvciBjYXJkIGRldGVjdCAoZGVmYXVsdCkgb3IgY2FyZCBjb3ZlciAqLwotCXVuc2lnbmVkIGNvdmVyOjE7Ci0KIAkvKiB1c2UgdGhlIGludGVybmFsIGNsb2NrICovCiAJdW5zaWduZWQgaW50ZXJuYWxfY2xvY2s6MTsKIApAQCAtNzMsNyArNzAsOCBAQAogI2RlZmluZSBIU01NQ19IQVNfSFNQRV9TVVBQT1JUCSgxIDw8IDIpCiAJdW5zaWduZWQgZmVhdHVyZXM7CiAKLQlpbnQgc3dpdGNoX3BpbjsJCQkvKiBncGlvIChjYXJkIGRldGVjdCkgKi8KKwlpbnQgZ3Bpb19jZDsJCQkvKiBncGlvIChjYXJkIGRldGVjdCkgKi8KKwlpbnQgZ3Bpb19jb2Q7CQkJLyogZ3BpbyAoY292ZXIgZGV0ZWN0KSAqLwogCWludCBncGlvX3dwOwkJCS8qIGdwaW8gKHdyaXRlIHByb3RlY3QpICovCiAKIAlpbnQgKCpzZXRfcG93ZXIpKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHBvd2VyX29uLCBpbnQgdmRkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9pMmMtZGF2aW5jaS5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2kyYy1kYXZpbmNpLmgKaW5kZXggMjMxMmQxOS4uODlmZDM0NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2kyYy1kYXZpbmNpLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL2kyYy1kYXZpbmNpLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAl1bnNpZ25lZCBpbnQJYnVzX2RlbGF5OwkvKiBwb3N0LXRyYW5zYWN0aW9uIGRlbGF5ICh1c2VjKSAqLwogCXVuc2lnbmVkIGludCAgICBzZGFfcGluOyAgICAgICAgLyogR1BJTyBwaW4gSUQgdG8gdXNlIGZvciBTREEgKi8KIAl1bnNpZ25lZCBpbnQgICAgc2NsX3BpbjsgICAgICAgIC8qIEdQSU8gcGluIElEIHRvIHVzZSBmb3IgU0NMICovCisJYm9vbAkJaGFzX3BmdW5jOwkvKmNoaXAgaGFzIGEgSUNQRlVOQyByZWdpc3RlciAqLwogfTsKIAogLyogZm9yIGJvYXJkIHNldHVwIGNvZGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9ueHAtbmNpLmggYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvbnhwLW5jaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZWQyODYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvbnhwLW5jaS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBHZW5lcmljIHBsYXRmb3JtIGRhdGEgZm9yIHRoZSBOWFAgTkNJIE5GQyBjaGlwcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgIE5YUCBTZW1pY29uZHVjdG9ycyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBBdXRob3JzOiBDbMOpbWVudCBQZXJyb2NoYXVkIDxjbGVtZW50LnBlcnJvY2hhdWRAbnhwLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpZm5kZWYgX05YUF9OQ0lfSF8KKyNkZWZpbmUgX05YUF9OQ0lfSF8KKworc3RydWN0IG54cF9uY2lfbmZjX3BsYXRmb3JtX2RhdGEgeworCXVuc2lnbmVkIGludCBncGlvX2VuOworCXVuc2lnbmVkIGludCBncGlvX2Z3OworCXVuc2lnbmVkIGludCBpcnE7Cit9OworCisjZW5kaWYgLyogX05YUF9OQ0lfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9za3k4MTQ1Mi1iYWNrbGlnaHQuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9za3k4MTQ1Mi1iYWNrbGlnaHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjMxZTliCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL3NreTgxNDUyLWJhY2tsaWdodC5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBza3k4MTQ1Mi5oCVNLWTgxNDUyIGJhY2tsaWdodCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxNCBTa3l3b3JrcyBTb2x1dGlvbnMgSW5jLgorICogQXV0aG9yIDogR3l1bmdvaCBZb28gPGphY2sueW9vQHNreXdvcmtzaW5jLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfU0tZODE0NTJfQkFDS0xJR0hUX0gKKyNkZWZpbmUgX1NLWTgxNDUyX0JBQ0tMSUdIVF9ICisKKy8qKgorICogc3RydWN0IHNreTgxNDUyX3BsYXRmb3JtX2RhdGEKKyAqIEBuYW1lOgliYWNrbGlnaHQgZHJpdmVyIG5hbWUuCisJCUlmIGl0IGlzIG5vdCBkZWZpbmVkLCBkZWZhdWx0IG5hbWUgaXMgbGNkLWJhY2tsaWdodC4KKyAqIEBncGlvX2VuYWJsZTpHUElPIG51bWJlciB3aGljaCBjb250cm9sIEVOIHBpbgorICogQGVuYWJsZToJRW5hYmxlIG1hc2sgZm9yIGN1cnJlbnQgc2luayBjaGFubmVsIDEsIDIsIDMsIDQsIDUgYW5kIDYuCisgKiBAaWdub3JlX3B3bToJdHJ1ZSBpZiBEUFdNSSBzaG91bGQgYmUgaWdub3JlZC4KKyAqIEBkcHdtX21vZGU6CXRydWUgaXMgRFBXTSBkaW1taW5nIG1vZGUsIG90aGVyd2lzZSBBbmFsb2cgZGltbWluZyBtb2RlLgorICogQHBoYXNlX3NoaWZ0OnRydWUgaXMgcGhhc2Ugc2hpZnQgbW9kZS4KKyAqIEBzaG9ydF9kZXRlY2lvbl90aHJlc2hvbGQ6CUl0IHNob3VsZCBiZSBvbmUgb2YgNCwgNSwgNiBhbmQgN1YuCisgKiBAYm9vc3RfY3VycmVudF9saW1pdDoJSXQgc2hvdWxkIGJlIG9uZSBvZiAyMzAwLCAyNzUwbUEuCisgKi8KK3N0cnVjdCBza3k4MTQ1Ml9ibF9wbGF0Zm9ybV9kYXRhIHsKKwljb25zdCBjaGFyICpuYW1lOworCWludCBncGlvX2VuYWJsZTsKKwl1bnNpZ25lZCBpbnQgZW5hYmxlOworCWJvb2wgaWdub3JlX3B3bTsKKwlib29sIGRwd21fbW9kZTsKKwlib29sIHBoYXNlX3NoaWZ0OworCXVuc2lnbmVkIGludCBzaG9ydF9kZXRlY3Rpb25fdGhyZXNob2xkOworCXVuc2lnbmVkIGludCBib29zdF9jdXJyZW50X2xpbWl0OworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc3QzM3pwMjQuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9zdDMzenAyNC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxN2RmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvc3QzM3pwMjQuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogU1RNaWNyb2VsZWN0cm9uaWNzIFRQTSBMaW51eCBkcml2ZXIgZm9yIFRQTSAxLjIgU1QzM1pQMjQKKyAqIENvcHlyaWdodCAoQykgMjAwOSAtIDIwMTUgIFNUTWljcm9lbGVjdHJvbmljcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworI2lmbmRlZiBfX1NUMzNaUDI0X0hfXworI2RlZmluZSBfX1NUMzNaUDI0X0hfXworCisjZGVmaW5lIFRQTV9TVDMzX0kyQwkJCSJzdDMzenAyNC1pMmMiCisjZGVmaW5lIFRQTV9TVDMzX1NQSQkJCSJzdDMzenAyNC1zcGkiCisKK3N0cnVjdCBzdDMzenAyNF9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgaW9fbHBjcGQ7Cit9OworCisjZW5kaWYgLyogX19TVDMzWlAyNF9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS90cG1fc3RtX3N0MzMuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS90cG1fc3RtX3N0MzMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3NTMxMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RhdGEvdHBtX3N0bV9zdDMzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogU1RNaWNyb2VsZWN0cm9uaWNzIFRQTSBJMkMgTGludXggZHJpdmVyIGZvciBUUE0gU1QzM1pQMjQKLSAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCAgU1RNaWNyb2VsZWN0cm9uaWNzCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgotICoKLSAqIFNUTWljcm9lbGVjdHJvbmljcyB2ZXJzaW9uIDEuMi4wLCBDb3B5cmlnaHQgKEMpIDIwMTAKLSAqIFNUTWljcm9lbGVjdHJvbmljcyBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuCi0gKiBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGFuZCB5b3UgYXJlIHdlbGNvbWUgdG8gcmVkaXN0cmlidXRlIGl0Ci0gKiB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMuCi0gKgotICogQEF1dGhvcjogQ2hyaXN0b3BoZSBSSUNBUkQgdHBtc3VwcG9ydEBzdC5jb20KLSAqCi0gKiBARmlsZTogc3RtX3N0MzNfdHBtLmgKLSAqCi0gKiBARGF0ZTogMDkvMTUvMjAxMAotICovCi0jaWZuZGVmIF9fU1RNX1NUMzNfVFBNX0hfXwotI2RlZmluZSBfX1NUTV9TVDMzX1RQTV9IX18KLQotI2RlZmluZSBUUE1fU1QzM19JMkMJCQkic3QzM3pwMjQtaTJjIgotI2RlZmluZSBUUE1fU1QzM19TUEkJCQkic3QzM3pwMjQtc3BpIgotCi1zdHJ1Y3Qgc3QzM3pwMjRfcGxhdGZvcm1fZGF0YSB7Ci0JaW50IGlvX2xwY3BkOwotfTsKLQotI2VuZGlmIC8qIF9fU1RNX1NUMzNfVFBNX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaCBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGV2aWNlLmgKaW5kZXggYWU0ODgyYy4uNThmMWU3NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kZXZpY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BsYXRmb3JtX2RldmljZS5oCkBAIC01OSw3ICs1OSw3IEBACiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaW5mbyB7CiAJCXN0cnVjdCBkZXZpY2UgKnBhcmVudDsKLQkJc3RydWN0IGFjcGlfZGV2X25vZGUgYWNwaV9ub2RlOworCQlzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlOwogCiAJCWNvbnN0IGNoYXIgKm5hbWU7CiAJCWludCBpZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG0tdHJhY2UuaCBiL2luY2x1ZGUvbGludXgvcG0tdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2JkZTdhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wbS10cmFjZS5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgUE1fVFJBQ0VfSAorI2RlZmluZSBQTV9UUkFDRV9ICisKKyNpZmRlZiBDT05GSUdfUE1fVFJBQ0UKKyNpbmNsdWRlIDxhc20vcG0tdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitleHRlcm4gaW50IHBtX3RyYWNlX2VuYWJsZWQ7CisKK3N0YXRpYyBpbmxpbmUgaW50IHBtX3RyYWNlX2lzX2VuYWJsZWQodm9pZCkKK3sKKyAgICAgICByZXR1cm4gcG1fdHJhY2VfZW5hYmxlZDsKK30KKworc3RydWN0IGRldmljZTsKK2V4dGVybiB2b2lkIHNldF90cmFjZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqKTsKK2V4dGVybiB2b2lkIGdlbmVyYXRlX3BtX3RyYWNlKGNvbnN0IHZvaWQgKnRyYWNlZGF0YSwgdW5zaWduZWQgaW50IHVzZXIpOworZXh0ZXJuIGludCBzaG93X3RyYWNlX2Rldl9tYXRjaChjaGFyICpidWYsIHNpemVfdCBzaXplKTsKKworI2RlZmluZSBUUkFDRV9ERVZJQ0UoZGV2KSBkbyB7IFwKKwlpZiAocG1fdHJhY2VfZW5hYmxlZCkgXAorCQlzZXRfdHJhY2VfZGV2aWNlKGRldik7IFwKKwl9IHdoaWxlKDApCisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IHBtX3RyYWNlX2lzX2VuYWJsZWQodm9pZCkgeyByZXR1cm4gMDsgfQorCisjZGVmaW5lIFRSQUNFX0RFVklDRShkZXYpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgVFJBQ0VfUkVTVU1FKGRldikgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBUUkFDRV9TVVNQRU5EKGRldikgZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtLmggYi9pbmNsdWRlL2xpbnV4L3BtLmgKaW5kZXggZTJmMWJlNi4uMmQyOWM2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wbS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG0uaApAQCAtNjAzLDEwICs2MDMsMTggQEAKICAqIFBvd2VyIGRvbWFpbnMgcHJvdmlkZSBjYWxsYmFja3MgdGhhdCBhcmUgZXhlY3V0ZWQgZHVyaW5nIHN5c3RlbSBzdXNwZW5kLAogICogaGliZXJuYXRpb24sIHN5c3RlbSByZXN1bWUgYW5kIGR1cmluZyBydW50aW1lIFBNIHRyYW5zaXRpb25zIGFsb25nIHdpdGgKICAqIHN1YnN5c3RlbS1sZXZlbCBhbmQgZHJpdmVyLWxldmVsIGNhbGxiYWNrcy4KKyAqCisgKiBAZGV0YWNoOiBDYWxsZWQgd2hlbiByZW1vdmluZyBhIGRldmljZSBmcm9tIHRoZSBkb21haW4uCisgKiBAYWN0aXZhdGU6IENhbGxlZCBiZWZvcmUgZXhlY3V0aW5nIHByb2JlIHJvdXRpbmVzIGZvciBidXMgdHlwZXMgYW5kIGRyaXZlcnMuCisgKiBAc3luYzogQ2FsbGVkIGFmdGVyIHN1Y2Nlc3NmdWwgZHJpdmVyIHByb2JlLgorICogQGRpc21pc3M6IENhbGxlZCBhZnRlciB1bnN1Y2Nlc3NmdWwgZHJpdmVyIHByb2JlIGFuZCBhZnRlciBkcml2ZXIgcmVtb3ZhbC4KICAqLwogc3RydWN0IGRldl9wbV9kb21haW4gewogCXN0cnVjdCBkZXZfcG1fb3BzCW9wczsKIAl2b2lkICgqZGV0YWNoKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgcG93ZXJfb2ZmKTsKKwlpbnQgKCphY3RpdmF0ZSkoc3RydWN0IGRldmljZSAqZGV2KTsKKwl2b2lkICgqc3luYykoc3RydWN0IGRldmljZSAqZGV2KTsKKwl2b2lkICgqZGlzbWlzcykoc3RydWN0IGRldmljZSAqZGV2KTsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BtX2RvbWFpbi5oIGIvaW5jbHVkZS9saW51eC9wbV9kb21haW4uaAppbmRleCAwODBlNzc4Li42ODFjY2IwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BtX2RvbWFpbi5oCisrKyBiL2luY2x1ZGUvbGludXgvcG1fZG9tYWluLmgKQEAgLTEyNyw3ICsxMjcsNyBAQAogCXJldHVybiB0b19ncGRfZGF0YShkZXYtPnBvd2VyLnN1YnN5c19kYXRhLT5kb21haW5fZGF0YSk7CiB9CiAKLWV4dGVybiBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKmRldl90b19nZW5wZChzdHJ1Y3QgZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqcG1fZ2VucGRfbG9va3VwX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBfX3BtX2dlbnBkX2FkZF9kZXZpY2Uoc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpnZW5wZCwKIAkJCQkgc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSBzdHJ1Y3QgZ3BkX3RpbWluZ19kYXRhICp0ZCk7CkBAIC0xNjMsOSArMTYzLDkgQEAKIHsKIAlyZXR1cm4gRVJSX1BUUigtRU5PU1lTKTsKIH0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGdlbmVyaWNfcG1fZG9tYWluICpkZXZfdG9fZ2VucGQoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZ2VuZXJpY19wbV9kb21haW4gKnBtX2dlbnBkX2xvb2t1cF9kZXYoc3RydWN0IGRldmljZSAqZGV2KQogewotCXJldHVybiBFUlJfUFRSKC1FTk9TWVMpOworCXJldHVybiBOVUxMOwogfQogc3RhdGljIGlubGluZSBpbnQgX19wbV9nZW5wZF9hZGRfZGV2aWNlKHN0cnVjdCBnZW5lcmljX3BtX2RvbWFpbiAqZ2VucGQsCiAJCQkJCXN0cnVjdCBkZXZpY2UgKmRldiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG5wLmggYi9pbmNsdWRlL2xpbnV4L3BucC5oCmluZGV4IDY1MTJlOWMuLjVkZjczM2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG5wLmgKKysrIGIvaW5jbHVkZS9saW51eC9wbnAuaApAQCAtNTEwLDQgKzUxMCwxNiBAQAogCiAjZW5kaWYgLyogQ09ORklHX1BOUCAqLwogCisvKioKKyAqIG1vZHVsZV9wbnBfZHJpdmVyKCkgLSBIZWxwZXIgbWFjcm8gZm9yIHJlZ2lzdGVyaW5nIGEgUG5QIGRyaXZlcgorICogQF9fcG5wX2RyaXZlcjogcG5wX2RyaXZlciBzdHJ1Y3QKKyAqCisgKiBIZWxwZXIgbWFjcm8gZm9yIFBuUCBkcml2ZXJzIHdoaWNoIGRvIG5vdCBkbyBhbnl0aGluZyBzcGVjaWFsIGluIG1vZHVsZQorICogaW5pdC9leGl0LiBUaGlzIGVsaW1pbmF0ZXMgYSBsb3Qgb2YgYm9pbGVycGxhdGUuIEVhY2ggbW9kdWxlIG1heSBvbmx5CisgKiB1c2UgdGhpcyBtYWNybyBvbmNlLCBhbmQgY2FsbGluZyBpdCByZXBsYWNlcyBtb2R1bGVfaW5pdCgpIGFuZCBtb2R1bGVfZXhpdCgpCisgKi8KKyNkZWZpbmUgbW9kdWxlX3BucF9kcml2ZXIoX19wbnBfZHJpdmVyKSBcCisJbW9kdWxlX2RyaXZlcihfX3BucF9kcml2ZXIsIHBucF9yZWdpc3Rlcl9kcml2ZXIsIFwKKwkJCQkgICAgcG5wX3VucmVnaXN0ZXJfZHJpdmVyKQorCiAjZW5kaWYgLyogX0xJTlVYX1BOUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL2NoYXJnZXItbWFuYWdlci5oIGIvaW5jbHVkZS9saW51eC9wb3dlci9jaGFyZ2VyLW1hbmFnZXIuaAppbmRleCA0MTZlYmViLi5lYWRmMjhjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL2NoYXJnZXItbWFuYWdlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcG93ZXIvY2hhcmdlci1tYW5hZ2VyLmgKQEAgLTI0Miw3ICsyNDIsOCBAQAogCWludCBlbWVyZ2VuY3lfc3RvcDsKIAogCWNoYXIgcHN5X25hbWVfYnVmW1BTWV9OQU1FX01BWCArIDFdOwotCXN0cnVjdCBwb3dlcl9zdXBwbHkgY2hhcmdlcl9wc3k7CisJc3RydWN0IHBvd2VyX3N1cHBseV9kZXNjIGNoYXJnZXJfcHN5X2Rlc2M7CisJc3RydWN0IHBvd2VyX3N1cHBseSAqY2hhcmdlcl9wc3k7CiAKIAl1NjQgY2hhcmdpbmdfc3RhcnRfdGltZTsKIAl1NjQgY2hhcmdpbmdfZW5kX3RpbWU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuaCBiL2luY2x1ZGUvbGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oCmluZGV4IDg5ZGQ4NGYuLmNmMTEyYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oCisrKyBiL2luY2x1ZGUvbGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oCkBAIC0xMjYsNyArMTI2LDE0IEBACiAJTUFYMTcwNDdfUVJUYmwzMAk9IDB4NDIsCiB9OwogCi1lbnVtIG1heDE3MHh4X2NoaXBfdHlwZSB7TUFYMTcwNDIsIE1BWDE3MDQ3fTsKK2VudW0gbWF4MTcweHhfY2hpcF90eXBlIHsKKwlNQVhJTV9ERVZJQ0VfVFlQRV9VTktOT1dOCT0gMCwKKwlNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA0MiwKKwlNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA0NywKKwlNQVhJTV9ERVZJQ0VfVFlQRV9NQVgxNzA1MCwKKworCU1BWElNX0RFVklDRV9UWVBFX05VTQorfTsKIAogLyoKICAqIHVzZWQgZm9yIHNldHRpbmcgYSByZWdpc3RlciB0byBhIGRlc2lyZWQgdmFsdWUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5LmggYi9pbmNsdWRlL2xpbnV4L3Bvd2VyX3N1cHBseS5oCmluZGV4IDA5NmRiY2UuLjc1YTFkZDggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG93ZXJfc3VwcGx5LmgKKysrIGIvaW5jbHVkZS9saW51eC9wb3dlcl9zdXBwbHkuaApAQCAtMTMsNiArMTMsNyBAQAogI2lmbmRlZiBfX0xJTlVYX1BPV0VSX1NVUFBMWV9IX18KICNkZWZpbmUgX19MSU5VWF9QT1dFUl9TVVBQTFlfSF9fCiAKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KQEAgLTE3MywyMiArMTc0LDMyIEBACiAJY29uc3QgY2hhciAqc3RydmFsOwogfTsKIAotc3RydWN0IGRldmljZTsKIHN0cnVjdCBkZXZpY2Vfbm9kZTsKK3N0cnVjdCBwb3dlcl9zdXBwbHk7CiAKLXN0cnVjdCBwb3dlcl9zdXBwbHkgeworLyogUnVuLXRpbWUgc3BlY2lmaWMgcG93ZXIgc3VwcGx5IGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnIHsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGU7CisJLyogRHJpdmVyIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKmRydl9kYXRhOworCisJY2hhciAqKnN1cHBsaWVkX3RvOworCXNpemVfdCBudW1fc3VwcGxpY2FudHM7Cit9OworCisvKiBEZXNjcmlwdGlvbiBvZiBwb3dlciBzdXBwbHkgKi8KK3N0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyB7CiAJY29uc3QgY2hhciAqbmFtZTsKIAllbnVtIHBvd2VyX3N1cHBseV90eXBlIHR5cGU7CiAJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgKnByb3BlcnRpZXM7CiAJc2l6ZV90IG51bV9wcm9wZXJ0aWVzOwogCi0JY2hhciAqKnN1cHBsaWVkX3RvOwotCXNpemVfdCBudW1fc3VwcGxpY2FudHM7Ci0KLQljaGFyICoqc3VwcGxpZWRfZnJvbTsKLQlzaXplX3QgbnVtX3N1cHBsaWVzOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZTsKLQorCS8qCisJICogRnVuY3Rpb25zIGZvciBkcml2ZXJzIGltcGxlbWVudGluZyBwb3dlciBzdXBwbHkgY2xhc3MuCisJICogVGhlc2Ugc2hvdWxkbid0IGJlIGNhbGxlZCBkaXJlY3RseSBieSBvdGhlciBkcml2ZXJzIGZvciBhY2Nlc3NpbmcKKwkgKiB0aGlzIHBvd2VyIHN1cHBseS4gSW5zdGVhZCB1c2UgcG93ZXJfc3VwcGx5XyooKSBmdW5jdGlvbnMgKGZvcgorCSAqIGV4YW1wbGUgcG93ZXJfc3VwcGx5X2dldF9wcm9wZXJ0eSgpKS4KKwkgKi8KIAlpbnQgKCpnZXRfcHJvcGVydHkpKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKIAkJCSAgICBlbnVtIHBvd2VyX3N1cHBseV9wcm9wZXJ0eSBwc3AsCiAJCQkgICAgdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCk7CkBAIC0yMDgsMTIgKzIxOSwyNyBAQAogCWJvb2wgbm9fdGhlcm1hbDsKIAkvKiBGb3IgQVBNIGVtdWxhdGlvbiwgdGhpbmsgbGVnYWN5IHVzZXJzcGFjZS4gKi8KIAlpbnQgdXNlX2Zvcl9hcG07Cit9OworCitzdHJ1Y3QgcG93ZXJfc3VwcGx5IHsKKwljb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKmRlc2M7CisKKwljaGFyICoqc3VwcGxpZWRfdG87CisJc2l6ZV90IG51bV9zdXBwbGljYW50czsKKworCWNoYXIgKipzdXBwbGllZF9mcm9tOworCXNpemVfdCBudW1fc3VwcGxpZXM7CisJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOworCisJLyogRHJpdmVyIHByaXZhdGUgZGF0YSAqLworCXZvaWQgKmRydl9kYXRhOwogCiAJLyogcHJpdmF0ZSAqLwotCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2hhbmdlZF93b3JrOwogCXNwaW5sb2NrX3QgY2hhbmdlZF9sb2NrOwogCWJvb2wgY2hhbmdlZDsKKwlhdG9taWNfdCB1c2VfY250OwogI2lmZGVmIENPTkZJR19USEVSTUFMCiAJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6ZDsKIAlzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZSAqdGNkOwpAQCAtMjU2LDYgKzI4Miw3IEBACiBleHRlcm4gaW50IHBvd2VyX3N1cHBseV9yZWdfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiBleHRlcm4gdm9pZCBwb3dlcl9zdXBwbHlfdW5yZWdfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiBleHRlcm4gc3RydWN0IHBvd2VyX3N1cHBseSAqcG93ZXJfc3VwcGx5X2dldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIHZvaWQgcG93ZXJfc3VwcGx5X3B1dChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpOwogI2lmZGVmIENPTkZJR19PRgogZXh0ZXJuIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBvd2VyX3N1cHBseV9nZXRfYnlfcGhhbmRsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCQkJCWNvbnN0IGNoYXIgKnByb3BlcnR5KTsKQEAgLTI3NCwxMyArMzAxLDM2IEBACiBzdGF0aWMgaW5saW5lIGludCBwb3dlcl9zdXBwbHlfaXNfc3lzdGVtX3N1cHBsaWVkKHZvaWQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KICNlbmRpZgogCi1leHRlcm4gaW50IHBvd2VyX3N1cHBseV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCi0JCQkJIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSk7Ci1leHRlcm4gaW50IHBvd2VyX3N1cHBseV9yZWdpc3Rlcl9ub193cyhzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCi0JCQkJIHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSk7CitleHRlcm4gaW50IHBvd2VyX3N1cHBseV9nZXRfcHJvcGVydHkoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5LAorCQkJICAgIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJCSAgICB1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKTsKK2V4dGVybiBpbnQgcG93ZXJfc3VwcGx5X3NldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCQkgICAgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwLAorCQkJICAgIGNvbnN0IHVuaW9uIHBvd2VyX3N1cHBseV9wcm9wdmFsICp2YWwpOworZXh0ZXJuIGludCBwb3dlcl9zdXBwbHlfcHJvcGVydHlfaXNfd3JpdGVhYmxlKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSwKKwkJCQkJZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgcHNwKTsKK2V4dGVybiB2b2lkIHBvd2VyX3N1cHBseV9leHRlcm5hbF9wb3dlcl9jaGFuZ2VkKHN0cnVjdCBwb3dlcl9zdXBwbHkgKnBzeSk7CisKK2V4dGVybiBzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpfX211c3RfY2hlY2sKK3Bvd2VyX3N1cHBseV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsCisJCQkJIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfZGVzYyAqZGVzYywKKwkJCQkgY29uc3Qgc3RydWN0IHBvd2VyX3N1cHBseV9jb25maWcgKmNmZyk7CitleHRlcm4gc3RydWN0IHBvd2VyX3N1cHBseSAqX19tdXN0X2NoZWNrCitwb3dlcl9zdXBwbHlfcmVnaXN0ZXJfbm9fd3Moc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCSBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKmRlc2MsCisJCQkJIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnICpjZmcpOworZXh0ZXJuIHN0cnVjdCBwb3dlcl9zdXBwbHkgKl9fbXVzdF9jaGVjaworZGV2bV9wb3dlcl9zdXBwbHlfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCSBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKmRlc2MsCisJCQkJIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnICpjZmcpOworZXh0ZXJuIHN0cnVjdCBwb3dlcl9zdXBwbHkgKl9fbXVzdF9jaGVjaworZGV2bV9wb3dlcl9zdXBwbHlfcmVnaXN0ZXJfbm9fd3Moc3RydWN0IGRldmljZSAqcGFyZW50LAorCQkJCSBjb25zdCBzdHJ1Y3QgcG93ZXJfc3VwcGx5X2Rlc2MgKmRlc2MsCisJCQkJIGNvbnN0IHN0cnVjdCBwb3dlcl9zdXBwbHlfY29uZmlnICpjZmcpOwogZXh0ZXJuIHZvaWQgcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KTsKIGV4dGVybiBpbnQgcG93ZXJfc3VwcGx5X3Bvd2VycyhzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksIHN0cnVjdCBkZXZpY2UgKmRldik7CiAKK2V4dGVybiB2b2lkICpwb3dlcl9zdXBwbHlfZ2V0X2RydmRhdGEoc3RydWN0IHBvd2VyX3N1cHBseSAqcHN5KTsKIC8qIEZvciBBUE0gZW11bGF0aW9uLCB0aGluayBsZWdhY3kgdXNlcnNwYWNlLiAqLwogZXh0ZXJuIHN0cnVjdCBjbGFzcyAqcG93ZXJfc3VwcGx5X2NsYXNzOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ByaW50ay5oIGIvaW5jbHVkZS9saW51eC9wcmludGsuaAppbmRleCBiYWEzZjk3Li45YjMwODcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ByaW50ay5oCisrKyBiL2luY2x1ZGUvbGludXgvcHJpbnRrLmgKQEAgLTI1NSw2ICsyNTUsMTEgQEAKIAlwcmludGsoS0VSTl9OT1RJQ0UgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCiAjZGVmaW5lIHByX2luZm8oZm10LCAuLi4pIFwKIAlwcmludGsoS0VSTl9JTkZPIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorLyoKKyAqIExpa2UgS0VSTl9DT05ULCBwcl9jb250KCkgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGNvbnRpbnVpbmcKKyAqIGEgbGluZSB3aXRoIG5vIG5ld2xpbmUgKCdcbicpIGVuY2xvc2VkLiBPdGhlcndpc2UgaXQgZGVmYXVsdHMKKyAqIGJhY2sgdG8gS0VSTl9ERUZBVUxULgorICovCiAjZGVmaW5lIHByX2NvbnQoZm10LCAuLi4pIFwKIAlwcmludGsoS0VSTl9DT05UIGZtdCwgIyNfX1ZBX0FSR1NfXykKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wcm9wZXJ0eS5oIGIvaW5jbHVkZS9saW51eC9wcm9wZXJ0eS5oCmluZGV4IGE2YTNkOTguLmRlOGJkZjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHJvcGVydHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3Byb3BlcnR5LmgKQEAgLTEzLDYgKzEzLDcgQEAKICNpZm5kZWYgX0xJTlVYX1BST1BFUlRZX0hfCiAjZGVmaW5lIF9MSU5VWF9QUk9QRVJUWV9IXwogCisjaW5jbHVkZSA8bGludXgvZndub2RlLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogc3RydWN0IGRldmljZTsKQEAgLTQwLDE2ICs0MSw2IEBACiBpbnQgZGV2aWNlX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCQkJY29uc3QgY2hhciAqKnZhbCk7CiAKLWVudW0gZndub2RlX3R5cGUgewotCUZXTk9ERV9JTlZBTElEID0gMCwKLQlGV05PREVfT0YsCi0JRldOT0RFX0FDUEksCi19OwotCi1zdHJ1Y3QgZndub2RlX2hhbmRsZSB7Ci0JZW51bSBmd25vZGVfdHlwZSB0eXBlOwotfTsKLQogYm9vbCBmd25vZGVfcHJvcGVydHlfcHJlc2VudChzdHJ1Y3QgZndub2RlX2hhbmRsZSAqZndub2RlLCBjb25zdCBjaGFyICpwcm9wbmFtZSk7CiBpbnQgZndub2RlX3Byb3BlcnR5X3JlYWRfdThfYXJyYXkoc3RydWN0IGZ3bm9kZV9oYW5kbGUgKmZ3bm9kZSwKIAkJCQkgIGNvbnN0IGNoYXIgKnByb3BuYW1lLCB1OCAqdmFsLApAQCAtMTQwLDQgKzEzMSwzNyBAQAogCXJldHVybiBmd25vZGVfcHJvcGVydHlfcmVhZF91NjRfYXJyYXkoZndub2RlLCBwcm9wbmFtZSwgdmFsLCAxKTsKIH0KIAorLyoqCisgKiBzdHJ1Y3QgcHJvcGVydHlfZW50cnkgLSAiQnVpbHQtaW4iIGRldmljZSBwcm9wZXJ0eSByZXByZXNlbnRhdGlvbi4KKyAqIEBuYW1lOiBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAqIEB0eXBlOiBUeXBlIG9mIHRoZSBwcm9wZXJ0eS4KKyAqIEBudmFsOiBOdW1iZXIgb2YgaXRlbXMgb2YgdHlwZSBAdHlwZSBtYWtpbmcgdXAgdGhlIHZhbHVlLgorICogQHZhbHVlOiBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgKGFuIGFycmF5IG9mIEBudmFsIGl0ZW1zIG9mIHR5cGUgQHR5cGUpLgorICovCitzdHJ1Y3QgcHJvcGVydHlfZW50cnkgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJZW51bSBkZXZfcHJvcF90eXBlIHR5cGU7CisJc2l6ZV90IG52YWw7CisJdW5pb24geworCQl2b2lkICpyYXdfZGF0YTsKKwkJdTggKnU4X2RhdGE7CisJCXUxNiAqdTE2X2RhdGE7CisJCXUzMiAqdTMyX2RhdGE7CisJCXU2NCAqdTY0X2RhdGE7CisJCWNvbnN0IGNoYXIgKipzdHI7CisJfSB2YWx1ZTsKK307CisKKy8qKgorICogc3RydWN0IHByb3BlcnR5X3NldCAtIENvbGxlY3Rpb24gb2YgImJ1aWx0LWluIiBkZXZpY2UgcHJvcGVydGllcy4KKyAqIEBmd25vZGU6IEhhbmRsZSB0byBiZSBwb2ludGVkIHRvIGJ5IHRoZSBmd25vZGUgZmllbGQgb2Ygc3RydWN0IGRldmljZS4KKyAqIEBwcm9wZXJ0aWVzOiBBcnJheSBvZiBwcm9wZXJ0aWVzIHRlcm1pbmF0ZWQgd2l0aCBhIG51bGwgZW50cnkuCisgKi8KK3N0cnVjdCBwcm9wZXJ0eV9zZXQgeworCXN0cnVjdCBmd25vZGVfaGFuZGxlIGZ3bm9kZTsKKwlzdHJ1Y3QgcHJvcGVydHlfZW50cnkgKnByb3BlcnRpZXM7Cit9OworCit2b2lkIGRldmljZV9hZGRfcHJvcGVydHlfc2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHByb3BlcnR5X3NldCAqcHNldCk7CisKICNlbmRpZiAvKiBfTElOVVhfUFJPUEVSVFlfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHRwX2Nsb2NrX2tlcm5lbC5oIGIvaW5jbHVkZS9saW51eC9wdHBfY2xvY2tfa2VybmVsLmgKaW5kZXggMGQ4ZmYzZi4uYjhiNzMwNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wdHBfY2xvY2tfa2VybmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wdHBfY2xvY2tfa2VybmVsLmgKQEAgLTY0LDExICs2NCwxMSBAQAogICogQGFkanRpbWU6ICBTaGlmdHMgdGhlIHRpbWUgb2YgdGhlIGhhcmR3YXJlIGNsb2NrLgogICogICAgICAgICAgICBwYXJhbWV0ZXIgZGVsdGE6IERlc2lyZWQgY2hhbmdlIGluIG5hbm9zZWNvbmRzLgogICoKLSAqIEBnZXR0aW1lOiAgUmVhZHMgdGhlIGN1cnJlbnQgdGltZSBmcm9tIHRoZSBoYXJkd2FyZSBjbG9jay4KLSAqICAgICAgICAgICAgcGFyYW1ldGVyIHRzOiBIb2xkcyB0aGUgcmVzdWx0LgorICogQGdldHRpbWU2NDogIFJlYWRzIHRoZSBjdXJyZW50IHRpbWUgZnJvbSB0aGUgaGFyZHdhcmUgY2xvY2suCisgKiAgICAgICAgICAgICAgcGFyYW1ldGVyIHRzOiBIb2xkcyB0aGUgcmVzdWx0LgogICoKLSAqIEBzZXR0aW1lOiAgU2V0IHRoZSBjdXJyZW50IHRpbWUgb24gdGhlIGhhcmR3YXJlIGNsb2NrLgotICogICAgICAgICAgICBwYXJhbWV0ZXIgdHM6IFRpbWUgdmFsdWUgdG8gc2V0LgorICogQHNldHRpbWU2NDogIFNldCB0aGUgY3VycmVudCB0aW1lIG9uIHRoZSBoYXJkd2FyZSBjbG9jay4KKyAqICAgICAgICAgICAgICBwYXJhbWV0ZXIgdHM6IFRpbWUgdmFsdWUgdG8gc2V0LgogICoKICAqIEBlbmFibGU6ICAgUmVxdWVzdCBkcml2ZXIgdG8gZW5hYmxlIG9yIGRpc2FibGUgYW4gYW5jaWxsYXJ5IGZlYXR1cmUuCiAgKiAgICAgICAgICAgIHBhcmFtZXRlciByZXF1ZXN0OiBEZXNpcmVkIHJlc291cmNlIHRvIGVuYWJsZSBvciBkaXNhYmxlLgpAQCAtMTA0LDggKzEwNCw4IEBACiAJc3RydWN0IHB0cF9waW5fZGVzYyAqcGluX2NvbmZpZzsKIAlpbnQgKCphZGpmcmVxKShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgczMyIGRlbHRhKTsKIAlpbnQgKCphZGp0aW1lKShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgczY0IGRlbHRhKTsKLQlpbnQgKCpnZXR0aW1lKShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwgc3RydWN0IHRpbWVzcGVjICp0cyk7Ci0JaW50ICgqc2V0dGltZSkoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHMpOworCWludCAoKmdldHRpbWU2NCkoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHN0cnVjdCB0aW1lc3BlYzY0ICp0cyk7CisJaW50ICgqc2V0dGltZTY0KShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnAsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYzY0ICp0cyk7CiAJaW50ICgqZW5hYmxlKShzdHJ1Y3QgcHRwX2Nsb2NrX2luZm8gKnB0cCwKIAkJICAgICAgc3RydWN0IHB0cF9jbG9ja19yZXF1ZXN0ICpyZXF1ZXN0LCBpbnQgb24pOwogCWludCAoKnZlcmlmeSkoc3RydWN0IHB0cF9jbG9ja19pbmZvICpwdHAsIHVuc2lnbmVkIGludCBwaW4sCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmggYi9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKaW5kZXggNzgwOTc0OS4uNTczYTVhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaApAQCAtNDgsNiArNDgsMjYgQEAKIAogZXh0ZXJuIGludCByY3VfZXhwZWRpdGVkOyAvKiBmb3Igc3lzY3RsICovCiAKKyNpZmRlZiBDT05GSUdfVElOWV9SQ1UKKy8qIFRpbnkgUkNVIGRvZXNuJ3QgZXhwZWRpdGUsIGFzIGl0cyBwdXJwb3NlIGluIGxpZmUgaXMgaW5zdGVhZCB0byBiZSB0aW55LiAqLworc3RhdGljIGlubGluZSBib29sIHJjdV9ncF9pc19leHBlZGl0ZWQodm9pZCkgIC8qIEludGVybmFsIFJDVSB1c2UuICovCit7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmN1X2V4cGVkaXRlX2dwKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY3VfdW5leHBlZGl0ZV9ncCh2b2lkKQoreworfQorI2Vsc2UgLyogI2lmZGVmIENPTkZJR19USU5ZX1JDVSAqLworYm9vbCByY3VfZ3BfaXNfZXhwZWRpdGVkKHZvaWQpOyAgLyogSW50ZXJuYWwgUkNVIHVzZS4gKi8KK3ZvaWQgcmN1X2V4cGVkaXRlX2dwKHZvaWQpOwordm9pZCByY3VfdW5leHBlZGl0ZV9ncCh2b2lkKTsKKyNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX1RJTllfUkNVICovCisKIGVudW0gcmN1dG9ydHVyZV90eXBlIHsKIAlSQ1VfRkxBVk9SLAogCVJDVV9CSF9GTEFWT1IsCkBAIC0xOTUsNiArMjE1LDE1IEBACiAKIHZvaWQgc3luY2hyb25pemVfc2NoZWQodm9pZCk7CiAKKy8qCisgKiBTdHJ1Y3R1cmUgYWxsb3dpbmcgYXN5bmNocm9ub3VzIHdhaXRpbmcgb24gUkNVLgorICovCitzdHJ1Y3QgcmN1X3N5bmNocm9uaXplIHsKKwlzdHJ1Y3QgcmN1X2hlYWQgaGVhZDsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworfTsKK3ZvaWQgd2FrZW1lX2FmdGVyX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpOworCiAvKioKICAqIGNhbGxfcmN1X3Rhc2tzKCkgLSBRdWV1ZSBhbiBSQ1UgZm9yIGludm9jYXRpb24gdGFzay1iYXNlZCBncmFjZSBwZXJpb2QKICAqIEBoZWFkOiBzdHJ1Y3R1cmUgdG8gYmUgdXNlZCBmb3IgcXVldWVpbmcgdGhlIFJDVSB1cGRhdGVzLgpAQCAtMjU4LDYgKzI4Nyw3IEBACiAKIC8qIEludGVybmFsIHRvIGtlcm5lbCAqLwogdm9pZCByY3VfaW5pdCh2b2lkKTsKK3ZvaWQgcmN1X2VuZF9pbmtlcm5lbF9ib290KHZvaWQpOwogdm9pZCByY3Vfc2NoZWRfcXModm9pZCk7CiB2b2lkIHJjdV9iaF9xcyh2b2lkKTsKIHZvaWQgcmN1X2NoZWNrX2NhbGxiYWNrcyhpbnQgdXNlcik7CkBAIC0yNjYsNiArMjk2LDggQEAKIHZvaWQgcmN1X2lkbGVfZXhpdCh2b2lkKTsKIHZvaWQgcmN1X2lycV9lbnRlcih2b2lkKTsKIHZvaWQgcmN1X2lycV9leGl0KHZvaWQpOworaW50IHJjdV9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpOwogCiAjaWZkZWYgQ09ORklHX1JDVV9TVEFMTF9DT01NT04KIHZvaWQgcmN1X3N5c3JxX3N0YXJ0KHZvaWQpOwpAQCAtNzIwLDcgKzc1Miw3IEBACiAgKiBhbm5vdGF0ZWQgYXMgX19yY3UuCiAgKi8KICNkZWZpbmUgcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHAsIGMpIFwKLQlfX3JjdV9kZXJlZmVyZW5jZV9jaGVjaygocCksIHJjdV9yZWFkX2xvY2tfaGVsZCgpIHx8IChjKSwgX19yY3UpCisJX19yY3VfZGVyZWZlcmVuY2VfY2hlY2soKHApLCAoYykgfHwgcmN1X3JlYWRfbG9ja19oZWxkKCksIF9fcmN1KQogCiAvKioKICAqIHJjdV9kZXJlZmVyZW5jZV9iaF9jaGVjaygpIC0gcmN1X2RlcmVmZXJlbmNlX2JoIHdpdGggZGVidWcgY2hlY2tpbmcKQEAgLTczMCw3ICs3NjIsNyBAQAogICogVGhpcyBpcyB0aGUgUkNVLWJoIGNvdW50ZXJwYXJ0IHRvIHJjdV9kZXJlZmVyZW5jZV9jaGVjaygpLgogICovCiAjZGVmaW5lIHJjdV9kZXJlZmVyZW5jZV9iaF9jaGVjayhwLCBjKSBcCi0JX19yY3VfZGVyZWZlcmVuY2VfY2hlY2soKHApLCByY3VfcmVhZF9sb2NrX2JoX2hlbGQoKSB8fCAoYyksIF9fcmN1KQorCV9fcmN1X2RlcmVmZXJlbmNlX2NoZWNrKChwKSwgKGMpIHx8IHJjdV9yZWFkX2xvY2tfYmhfaGVsZCgpLCBfX3JjdSkKIAogLyoqCiAgKiByY3VfZGVyZWZlcmVuY2Vfc2NoZWRfY2hlY2soKSAtIHJjdV9kZXJlZmVyZW5jZV9zY2hlZCB3aXRoIGRlYnVnIGNoZWNraW5nCkBAIC03NDAsNyArNzcyLDcgQEAKICAqIFRoaXMgaXMgdGhlIFJDVS1zY2hlZCBjb3VudGVycGFydCB0byByY3VfZGVyZWZlcmVuY2VfY2hlY2soKS4KICAqLwogI2RlZmluZSByY3VfZGVyZWZlcmVuY2Vfc2NoZWRfY2hlY2socCwgYykgXAotCV9fcmN1X2RlcmVmZXJlbmNlX2NoZWNrKChwKSwgcmN1X3JlYWRfbG9ja19zY2hlZF9oZWxkKCkgfHwgKGMpLCBcCisJX19yY3VfZGVyZWZlcmVuY2VfY2hlY2soKHApLCAoYykgfHwgcmN1X3JlYWRfbG9ja19zY2hlZF9oZWxkKCksIFwKIAkJCQlfX3JjdSkKIAogI2RlZmluZSByY3VfZGVyZWZlcmVuY2VfcmF3KHApIHJjdV9kZXJlZmVyZW5jZV9jaGVjayhwLCAxKSAvKkBAQCBuZWVkZWQ/IEBAQCovCkBAIC05MzMsOSArOTY1LDkgQEAKIHsKIAlyY3VfbG9ja2RlcF9hc3NlcnQocmN1X2lzX3dhdGNoaW5nKCksCiAJCQkgICAicmN1X3JlYWRfdW5sb2NrKCkgdXNlZCBpbGxlZ2FsbHkgd2hpbGUgaWRsZSIpOwotCXJjdV9sb2NrX3JlbGVhc2UoJnJjdV9sb2NrX21hcCk7CiAJX19yZWxlYXNlKFJDVSk7CiAJX19yY3VfcmVhZF91bmxvY2soKTsKKwlyY3VfbG9ja19yZWxlYXNlKCZyY3VfbG9ja19tYXApOyAvKiBLZWVwIGFjcSBpbmZvIGZvciBybHMgZGlhZ3MuICovCiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yZWJvb3QuaCBiL2luY2x1ZGUvbGludXgvcmVib290LmgKaW5kZXggNjdmYzhmYy4uYTdmZjQwOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yZWJvb3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JlYm9vdC5oCkBAIC03MCw3ICs3MCw4IEBACiAjZGVmaW5lIFBPV0VST0ZGX0NNRF9QQVRIX0xFTgkyNTYKIGV4dGVybiBjaGFyIHBvd2Vyb2ZmX2NtZFtQT1dFUk9GRl9DTURfUEFUSF9MRU5dOwogCi1leHRlcm4gaW50IG9yZGVybHlfcG93ZXJvZmYoYm9vbCBmb3JjZSk7CitleHRlcm4gdm9pZCBvcmRlcmx5X3Bvd2Vyb2ZmKGJvb2wgZm9yY2UpOworZXh0ZXJuIHZvaWQgb3JkZXJseV9yZWJvb3Qodm9pZCk7CiAKIC8qCiAgKiBFbWVyZ2VuY3kgcmVzdGFydCwgY2FsbGFibGUgZnJvbSBhbiBpbnRlcnJ1cHQgaGFuZGxlci4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2FjdDg4NjUuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2FjdDg4NjUuaAppbmRleCBiNmM0OTA5Li4xNWZhOGYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9hY3Q4ODY1LmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvYWN0ODg2NS5oCkBAIC0xOSw2ICsxOSwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9tYWNoaW5lLmg+CiAKIGVudW0geworCUFDVDg2MDBfSURfRENEQzEsCisJQUNUODYwMF9JRF9EQ0RDMiwKKwlBQ1Q4NjAwX0lEX0RDREMzLAorCUFDVDg2MDBfSURfU1VEQ0RDNCwKKwlBQ1Q4NjAwX0lEX0xETzUsCisJQUNUODYwMF9JRF9MRE82LAorCUFDVDg2MDBfSURfTERPNywKKwlBQ1Q4NjAwX0lEX0xETzgsCisJQUNUODYwMF9JRF9MRE85LAorCUFDVDg2MDBfSURfTERPMTAsCit9OworCitlbnVtIHsKIAlBQ1Q4ODY1X0lEX0RDREMxLAogCUFDVDg4NjVfSURfRENEQzIsCiAJQUNUODg2NV9JRF9EQ0RDMywKQEAgLTQ2LDYgKzU5LDcgQEAKIH07CiAKIGVudW0geworCUFDVDg2MDAsCiAJQUNUODg2NSwKIAlBQ1Q4ODQ2LAogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCmluZGV4IGQxN2UxZmYuLmY4YTY4OWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaApAQCAtMTE0LDcgKzExNCw3IEBACiAjZGVmaW5lIFJFR1VMQVRPUl9FVkVOVF9PVkVSX1RFTVAJCTB4MTAKICNkZWZpbmUgUkVHVUxBVE9SX0VWRU5UX0ZPUkNFX0RJU0FCTEUJCTB4MjAKICNkZWZpbmUgUkVHVUxBVE9SX0VWRU5UX1ZPTFRBR0VfQ0hBTkdFCQkweDQwCi0jZGVmaW5lIFJFR1VMQVRPUl9FVkVOVF9ESVNBQkxFIAkJMHg4MAorI2RlZmluZSBSRUdVTEFUT1JfRVZFTlRfRElTQUJMRQkJCTB4ODAKICNkZWZpbmUgUkVHVUxBVE9SX0VWRU5UX1BSRV9WT0xUQUdFX0NIQU5HRQkweDEwMAogI2RlZmluZSBSRUdVTEFUT1JfRVZFTlRfQUJPUlRfVk9MVEFHRV9DSEFOR0UJMHgyMDAKICNkZWZpbmUgUkVHVUxBVE9SX0VWRU5UX1BSRV9ESVNBQkxFCQkweDQwMApAQCAtMjM4LDcgKzIzOCw3IEBACiAKIGludCByZWd1bGF0b3Jfc2V0X21vZGUoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLCB1bnNpZ25lZCBpbnQgbW9kZSk7CiB1bnNpZ25lZCBpbnQgcmVndWxhdG9yX2dldF9tb2RlKHN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvcik7Ci1pbnQgcmVndWxhdG9yX3NldF9vcHRpbXVtX21vZGUoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLCBpbnQgbG9hZF91QSk7CitpbnQgcmVndWxhdG9yX3NldF9sb2FkKHN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvciwgaW50IGxvYWRfdUEpOwogCiBpbnQgcmVndWxhdG9yX2FsbG93X2J5cGFzcyhzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IsIGJvb2wgYWxsb3cpOwogCkBAIC0yNTIsOCArMjUyLDEyIEBACiAvKiByZWd1bGF0b3Igbm90aWZpZXIgYmxvY2sgKi8KIGludCByZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLAogCQkJICAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CitpbnQgZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLAorCQkJCSAgICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiBpbnQgcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLAogCQkJCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwordm9pZCBkZXZtX3JlZ3VsYXRvcl91bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvciwKKwkJCQkJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiAKIC8qIGRyaXZlciBkYXRhIC0gY29yZSBkb2Vzbid0IHRvdWNoICovCiB2b2lkICpyZWd1bGF0b3JfZ2V0X2RydmRhdGEoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKTsKQEAgLTQ3OSw4ICs0ODMsNyBAQAogCXJldHVybiBSRUdVTEFUT1JfTU9ERV9OT1JNQUw7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlZ3VsYXRvcl9zZXRfb3B0aW11bV9tb2RlKHN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvciwKLQkJCQkJaW50IGxvYWRfdUEpCitzdGF0aWMgaW5saW5lIGludCByZWd1bGF0b3Jfc2V0X2xvYWQoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLCBpbnQgbG9hZF91QSkKIHsKIAlyZXR1cm4gUkVHVUxBVE9SX01PREVfTk9STUFMOwogfQpAQCAtNTE1LDEyICs1MTgsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLAorCQkJCQkJICAgc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLAogCQkJCXN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCiB7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGRldm1fcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yLAorCQkJCQkJICAgICBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgKnJlZ3VsYXRvcl9nZXRfZHJ2ZGF0YShzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3IpCiB7CiAJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCmluZGV4IGQ0YWQ1YjUuLmZmZmE2ODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCkBAIC05OCw2ICs5OCw3IEBACiAgKglSRUdVTEFUT1JfU1RBVFVTIHZhbHVlIChvciBuZWdhdGl2ZSBlcnJubykKICAqIEBnZXRfb3B0aW11bV9tb2RlOiBHZXQgdGhlIG1vc3QgZWZmaWNpZW50IG9wZXJhdGluZyBtb2RlIGZvciB0aGUgcmVndWxhdG9yCiAgKiAgICAgICAgICAgICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICogQHNldF9sb2FkOiBTZXQgdGhlIGxvYWQgZm9yIHRoZSByZWd1bGF0b3IuCiAgKgogICogQHNldF9ieXBhc3M6IFNldCB0aGUgcmVndWxhdG9yIGluIGJ5cGFzcyBtb2RlLgogICogQGdldF9ieXBhc3M6IEdldCB0aGUgcmVndWxhdG9yIGJ5cGFzcyBtb2RlIHN0YXRlLgpAQCAtMTY3LDYgKzE2OCw4IEBACiAJLyogZ2V0IG1vc3QgZWZmaWNpZW50IHJlZ3VsYXRvciBvcGVyYXRpbmcgbW9kZSBmb3IgbG9hZCAqLwogCXVuc2lnbmVkIGludCAoKmdldF9vcHRpbXVtX21vZGUpIChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqLCBpbnQgaW5wdXRfdVYsCiAJCQkJCSAgaW50IG91dHB1dF91ViwgaW50IGxvYWRfdUEpOworCS8qIHNldCB0aGUgbG9hZCBvbiB0aGUgcmVndWxhdG9yICovCisJaW50ICgqc2V0X2xvYWQpKHN0cnVjdCByZWd1bGF0b3JfZGV2ICosIGludCBsb2FkX3VBKTsKIAogCS8qIGNvbnRyb2wgYW5kIHJlcG9ydCBvbiBieXBhc3MgbW9kZSAqLwogCWludCAoKnNldF9ieXBhc3MpKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsIGJvb2wgZW5hYmxlKTsKQEAgLTMxNiw3ICszMTksNyBAQAogICogQGRyaXZlcl9kYXRhOiBwcml2YXRlIHJlZ3VsYXRvciBkYXRhCiAgKiBAb2Zfbm9kZTogT3BlbkZpcm13YXJlIG5vZGUgdG8gcGFyc2UgZm9yIGRldmljZSB0cmVlIGJpbmRpbmdzIChtYXkgYmUKICAqICAgICAgICAgICBOVUxMKS4KLSAqIEByZWdtYXA6IHJlZ21hcCB0byB1c2UgZm9yIGNvcmUgcmVnbWFwIGhlbHBlcnMgaWYgZGV2X2dldF9yZWd1bGF0b3IoKSBpcworICogQHJlZ21hcDogcmVnbWFwIHRvIHVzZSBmb3IgY29yZSByZWdtYXAgaGVscGVycyBpZiBkZXZfZ2V0X3JlZ21hcCgpIGlzCiAgKiAgICAgICAgICBpbnN1ZmZpY2llbnQuCiAgKiBAZW5hX2dwaW9faW5pdGlhbGl6ZWQ6IEdQSU8gY29udHJvbGxpbmcgcmVndWxhdG9yIGVuYWJsZSB3YXMgcHJvcGVybHkKICAqICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQsIG1lYW5pbmcgdGhhdCA+PSAwIGlzIGEgdmFsaWQgZ3BpbwpAQCAtMzY3LDYgKzM3MCw3IEBACiAJc3RydWN0IGRldmljZSBkZXY7CiAJc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgKmNvbnN0cmFpbnRzOwogCXN0cnVjdCByZWd1bGF0b3IgKnN1cHBseTsJLyogZm9yIHRyZWUgKi8KKwljb25zdCBjaGFyICpzdXBwbHlfbmFtZTsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CiAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGRpc2FibGVfd29yazsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVzdW1lLXRyYWNlLmggYi9pbmNsdWRlL2xpbnV4L3Jlc3VtZS10cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzFkYjIzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbGludXgvcmVzdW1lLXRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jaWZuZGVmIFJFU1VNRV9UUkFDRV9ICi0jZGVmaW5lIFJFU1VNRV9UUkFDRV9ICi0KLSNpZmRlZiBDT05GSUdfUE1fVFJBQ0UKLSNpbmNsdWRlIDxhc20vcmVzdW1lLXRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotZXh0ZXJuIGludCBwbV90cmFjZV9lbmFibGVkOwotCi1zdGF0aWMgaW5saW5lIGludCBwbV90cmFjZV9pc19lbmFibGVkKHZvaWQpCi17Ci0gICAgICAgcmV0dXJuIHBtX3RyYWNlX2VuYWJsZWQ7Ci19Ci0KLXN0cnVjdCBkZXZpY2U7Ci1leHRlcm4gdm9pZCBzZXRfdHJhY2VfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKik7Ci1leHRlcm4gdm9pZCBnZW5lcmF0ZV9yZXN1bWVfdHJhY2UoY29uc3Qgdm9pZCAqdHJhY2VkYXRhLCB1bnNpZ25lZCBpbnQgdXNlcik7Ci1leHRlcm4gaW50IHNob3dfdHJhY2VfZGV2X21hdGNoKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOwotCi0jZGVmaW5lIFRSQUNFX0RFVklDRShkZXYpIGRvIHsgXAotCWlmIChwbV90cmFjZV9lbmFibGVkKSBcCi0JCXNldF90cmFjZV9kZXZpY2UoZGV2KTsgXAotCX0gd2hpbGUoMCkKLQotI2Vsc2UKLQotc3RhdGljIGlubGluZSBpbnQgcG1fdHJhY2VfaXNfZW5hYmxlZCh2b2lkKSB7IHJldHVybiAwOyB9Ci0KLSNkZWZpbmUgVFJBQ0VfREVWSUNFKGRldikgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBUUkFDRV9SRVNVTUUoZGV2KSBkbyB7IH0gd2hpbGUgKDApCi0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmhhc2h0YWJsZS5oIGIvaW5jbHVkZS9saW51eC9yaGFzaHRhYmxlLmgKaW5kZXggZDQzOGVlYi4uZTIzZDI0MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yaGFzaHRhYmxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yaGFzaHRhYmxlLmgKQEAgLTEsMTQgKzEsMTMgQEAKIC8qCiAgKiBSZXNpemFibGUsIFNjYWxhYmxlLCBDb25jdXJyZW50IEhhc2ggVGFibGUKICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNCBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KICAqCi0gKiBCYXNlZCBvbiB0aGUgZm9sbG93aW5nIHBhcGVyIGJ5IEpvc2ggVHJpcGxldHQsIFBhdWwgRS4gTWNLZW5uZXkKLSAqIGFuZCBKb25hdGhhbiBXYWxwb2xlOgotICogaHR0cHM6Ly93d3cudXNlbml4Lm9yZy9sZWdhY3kvZXZlbnQvYXRjMTEvdGVjaC9maW5hbF9maWxlcy9UcmlwbGV0dC5wZGYKLSAqCiAgKiBDb2RlIHBhcnRpYWxseSBkZXJpdmVkIGZyb20gbmZ0X2hhc2gKKyAqIFJld3JpdHRlbiB3aXRoIHJlaGFzaCBjb2RlIGZyb20gYnJfbXVsdGljYXN0IHBsdXMgc2luZ2xlIGxpc3QKKyAqIHBvaW50ZXIgYXMgc3VnZ2VzdGVkIGJ5IEpvc2ggVHJpcGxldHQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTE5LDkgKzE4LDEyIEBACiAjZGVmaW5lIF9MSU5VWF9SSEFTSFRBQkxFX0gKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3RfbnVsbHMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAKIC8qCiAgKiBUaGUgZW5kIG9mIHRoZSBjaGFpbiBpcyBtYXJrZWQgd2l0aCBhIHNwZWNpYWwgbnVsbHMgbWFya3Mgd2hpY2ggaGFzCkBAIC00Miw2ICs0NCw5IEBACiAjZGVmaW5lIFJIVF9IQVNIX0JJVFMJCTI3CiAjZGVmaW5lIFJIVF9CQVNFX1NISUZUCQlSSFRfSEFTSF9CSVRTCiAKKy8qIEJhc2UgYml0cyBwbHVzIDEgYml0IGZvciBudWxscyBtYXJrZXIgKi8KKyNkZWZpbmUgUkhUX0hBU0hfUkVTRVJWRURfU1BBQ0UJKFJIVF9CQVNFX0JJVFMgKyAxKQorCiBzdHJ1Y3Qgcmhhc2hfaGVhZCB7CiAJc3RydWN0IHJoYXNoX2hlYWQgX19yY3UJCSpuZXh0OwogfTsKQEAgLTQ5LDIwICs1NCw0MyBAQAogLyoqCiAgKiBzdHJ1Y3QgYnVja2V0X3RhYmxlIC0gVGFibGUgb2YgaGFzaCBidWNrZXRzCiAgKiBAc2l6ZTogTnVtYmVyIG9mIGhhc2ggYnVja2V0cworICogQHJlaGFzaDogQ3VycmVudCBidWNrZXQgYmVpbmcgcmVoYXNoZWQKKyAqIEBoYXNoX3JuZDogUmFuZG9tIHNlZWQgdG8gZm9sZCBpbnRvIGhhc2gKICAqIEBsb2Nrc19tYXNrOiBNYXNrIHRvIGFwcGx5IGJlZm9yZSBhY2Nlc3NpbmcgbG9ja3NbXQogICogQGxvY2tzOiBBcnJheSBvZiBzcGlubG9ja3MgcHJvdGVjdGluZyBpbmRpdmlkdWFsIGJ1Y2tldHMKKyAqIEB3YWxrZXJzOiBMaXN0IG9mIGFjdGl2ZSB3YWxrZXJzCisgKiBAcmN1OiBSQ1Ugc3RydWN0dXJlIGZvciBmcmVlaW5nIHRoZSB0YWJsZQorICogQGZ1dHVyZV90Ymw6IFRhYmxlIHVuZGVyIGNvbnN0cnVjdGlvbiBkdXJpbmcgcmVoYXNoaW5nCiAgKiBAYnVja2V0czogc2l6ZSAqIGhhc2ggYnVja2V0cwogICovCiBzdHJ1Y3QgYnVja2V0X3RhYmxlIHsKLQlzaXplX3QJCQlzaXplOworCXVuc2lnbmVkIGludAkJc2l6ZTsKKwl1bnNpZ25lZCBpbnQJCXJlaGFzaDsKKwl1MzIJCQloYXNoX3JuZDsKIAl1bnNpZ25lZCBpbnQJCWxvY2tzX21hc2s7CiAJc3BpbmxvY2tfdAkJKmxvY2tzOworCXN0cnVjdCBsaXN0X2hlYWQJd2Fsa2VyczsKKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKKworCXN0cnVjdCBidWNrZXRfdGFibGUgX19yY3UgKmZ1dHVyZV90Ymw7CiAKIAlzdHJ1Y3Qgcmhhc2hfaGVhZCBfX3JjdQkqYnVja2V0c1tdIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiB9OwogCisvKioKKyAqIHN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnIC0gS2V5IGZvciB0aGUgZnVuY3Rpb24gcmhhc2h0YWJsZV9jb21wYXJlCisgKiBAaHQ6IEhhc2ggdGFibGUKKyAqIEBrZXk6IEtleSB0byBjb21wYXJlIGFnYWluc3QKKyAqLworc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgeworCXN0cnVjdCByaGFzaHRhYmxlICpodDsKKwljb25zdCB2b2lkICprZXk7Cit9OworCiB0eXBlZGVmIHUzMiAoKnJodF9oYXNoZm5fdCkoY29uc3Qgdm9pZCAqZGF0YSwgdTMyIGxlbiwgdTMyIHNlZWQpOwotdHlwZWRlZiB1MzIgKCpyaHRfb2JqX2hhc2hmbl90KShjb25zdCB2b2lkICpkYXRhLCB1MzIgc2VlZCk7Cit0eXBlZGVmIHUzMiAoKnJodF9vYmpfaGFzaGZuX3QpKGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBsZW4sIHUzMiBzZWVkKTsKK3R5cGVkZWYgaW50ICgqcmh0X29ial9jbXBmbl90KShzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLAorCQkJICAgICAgIGNvbnN0IHZvaWQgKm9iaik7CiAKIHN0cnVjdCByaGFzaHRhYmxlOwogCkBAIC03Miw2MCArMTAwLDYyIEBACiAgKiBAa2V5X2xlbjogTGVuZ3RoIG9mIGtleQogICogQGtleV9vZmZzZXQ6IE9mZnNldCBvZiBrZXkgaW4gc3RydWN0IHRvIGJlIGhhc2hlZAogICogQGhlYWRfb2Zmc2V0OiBPZmZzZXQgb2Ygcmhhc2hfaGVhZCBpbiBzdHJ1Y3QgdG8gYmUgaGFzaGVkCi0gKiBAaGFzaF9ybmQ6IFNlZWQgdG8gdXNlIHdoaWxlIGhhc2hpbmcKLSAqIEBtYXhfc2hpZnQ6IE1heGltdW0gbnVtYmVyIG9mIHNoaWZ0cyB3aGlsZSBleHBhbmRpbmcKLSAqIEBtaW5fc2hpZnQ6IE1pbmltdW0gbnVtYmVyIG9mIHNoaWZ0cyB3aGlsZSBzaHJpbmtpbmcKKyAqIEBtYXhfc2l6ZTogTWF4aW11bSBzaXplIHdoaWxlIGV4cGFuZGluZworICogQG1pbl9zaXplOiBNaW5pbXVtIHNpemUgd2hpbGUgc2hyaW5raW5nCiAgKiBAbnVsbHNfYmFzZTogQmFzZSB2YWx1ZSB0byBnZW5lcmF0ZSBudWxscyBtYXJrZXIKKyAqIEBpbnNlY3VyZV9lbGFzdGljaXR5OiBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGNoYWluIGxlbmd0aCBjaGVja3MKKyAqIEBhdXRvbWF0aWNfc2hyaW5raW5nOiBFbmFibGUgYXV0b21hdGljIHNocmlua2luZyBvZiB0YWJsZXMKICAqIEBsb2Nrc19tdWw6IE51bWJlciBvZiBidWNrZXQgbG9ja3MgdG8gYWxsb2NhdGUgcGVyIGNwdSAoZGVmYXVsdDogMTI4KQotICogQGhhc2hmbjogRnVuY3Rpb24gdG8gaGFzaCBrZXkKKyAqIEBoYXNoZm46IEhhc2ggZnVuY3Rpb24gKGRlZmF1bHQ6IGpoYXNoMiBpZiAhKGtleV9sZW4gJSA0KSwgb3Igamhhc2gpCiAgKiBAb2JqX2hhc2hmbjogRnVuY3Rpb24gdG8gaGFzaCBvYmplY3QKKyAqIEBvYmpfY21wZm46IEZ1bmN0aW9uIHRvIGNvbXBhcmUga2V5IHdpdGggb2JqZWN0CiAgKi8KIHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyB7CiAJc2l6ZV90CQkJbmVsZW1faGludDsKIAlzaXplX3QJCQlrZXlfbGVuOwogCXNpemVfdAkJCWtleV9vZmZzZXQ7CiAJc2l6ZV90CQkJaGVhZF9vZmZzZXQ7Ci0JdTMyCQkJaGFzaF9ybmQ7Ci0Jc2l6ZV90CQkJbWF4X3NoaWZ0OwotCXNpemVfdAkJCW1pbl9zaGlmdDsKKwl1bnNpZ25lZCBpbnQJCW1heF9zaXplOworCXVuc2lnbmVkIGludAkJbWluX3NpemU7CiAJdTMyCQkJbnVsbHNfYmFzZTsKKwlib29sCQkJaW5zZWN1cmVfZWxhc3RpY2l0eTsKKwlib29sCQkJYXV0b21hdGljX3Nocmlua2luZzsKIAlzaXplX3QJCQlsb2Nrc19tdWw7CiAJcmh0X2hhc2hmbl90CQloYXNoZm47CiAJcmh0X29ial9oYXNoZm5fdAlvYmpfaGFzaGZuOworCXJodF9vYmpfY21wZm5fdAkJb2JqX2NtcGZuOwogfTsKIAogLyoqCiAgKiBzdHJ1Y3Qgcmhhc2h0YWJsZSAtIEhhc2ggdGFibGUgaGFuZGxlCiAgKiBAdGJsOiBCdWNrZXQgdGFibGUKLSAqIEBmdXR1cmVfdGJsOiBUYWJsZSB1bmRlciBjb25zdHJ1Y3Rpb24gZHVyaW5nIGV4cGFuc2lvbi9zaHJpbmtpbmcKICAqIEBuZWxlbXM6IE51bWJlciBvZiBlbGVtZW50cyBpbiB0YWJsZQotICogQHNoaWZ0OiBDdXJyZW50IHNpemUgKDEgPDwgc2hpZnQpCisgKiBAa2V5X2xlbjogS2V5IGxlbmd0aCBmb3IgaGFzaGZuCisgKiBAZWxhc3RpY2l0eTogTWF4aW11bSBjaGFpbiBsZW5ndGggYmVmb3JlIHJlaGFzaAogICogQHA6IENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycwogICogQHJ1bl93b3JrOiBEZWZlcnJlZCB3b3JrZXIgdG8gZXhwYW5kL3NocmluayBhc3luY2hyb25vdXNseQogICogQG11dGV4OiBNdXRleCB0byBwcm90ZWN0IGN1cnJlbnQvZnV0dXJlIHRhYmxlIHN3YXBwaW5nCi0gKiBAd2Fsa2VyczogTGlzdCBvZiBhY3RpdmUgd2Fsa2VycwotICogQGJlaW5nX2Rlc3Ryb3llZDogVHJ1ZSBpZiB0YWJsZSBpcyBzZXQgdXAgZm9yIGRlc3RydWN0aW9uCisgKiBAbG9jazogU3BpbiBsb2NrIHRvIHByb3RlY3Qgd2Fsa2VyIGxpc3QKICAqLwogc3RydWN0IHJoYXNodGFibGUgewogCXN0cnVjdCBidWNrZXRfdGFibGUgX19yY3UJKnRibDsKLQlzdHJ1Y3QgYnVja2V0X3RhYmxlIF9fcmN1ICAgICAgICpmdXR1cmVfdGJsOwogCWF0b21pY190CQkJbmVsZW1zOwotCWF0b21pY190CQkJc2hpZnQ7CisJdW5zaWduZWQgaW50CQkJa2V5X2xlbjsKKwl1bnNpZ25lZCBpbnQJCQllbGFzdGljaXR5OwogCXN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcwlwOwogCXN0cnVjdCB3b3JrX3N0cnVjdAkJcnVuX3dvcms7CiAJc3RydWN0IG11dGV4ICAgICAgICAgICAgICAgICAgICBtdXRleDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCQl3YWxrZXJzOwotCWJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmdfZGVzdHJveWVkOworCXNwaW5sb2NrX3QJCQlsb2NrOwogfTsKIAogLyoqCiAgKiBzdHJ1Y3Qgcmhhc2h0YWJsZV93YWxrZXIgLSBIYXNoIHRhYmxlIHdhbGtlcgogICogQGxpc3Q6IExpc3QgZW50cnkgb24gbGlzdCBvZiB3YWxrZXJzCi0gKiBAcmVzaXplOiBSZXNpemUgZXZlbnQgb2NjdXJlZAorICogQHRibDogVGhlIHRhYmxlIHRoYXQgd2Ugd2VyZSB3YWxraW5nIG92ZXIKICAqLwogc3RydWN0IHJoYXNodGFibGVfd2Fsa2VyIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0JYm9vbCByZXNpemU7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOwogfTsKIAogLyoqCkBAIC0xNjIsNiArMTkyLDExOCBAQAogCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpIHB0cikgPj4gMTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkICpyaHRfb2JqKGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGUpCit7CisJcmV0dXJuIChjaGFyICopaGUgLSBodC0+cC5oZWFkX29mZnNldDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmh0X2J1Y2tldF9pbmRleChjb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsCisJCQkJCSAgICB1bnNpZ25lZCBpbnQgaGFzaCkKK3sKKwlyZXR1cm4gKGhhc2ggPj4gUkhUX0hBU0hfUkVTRVJWRURfU1BBQ0UpICYgKHRibC0+c2l6ZSAtIDEpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByaHRfa2V5X2hhc2hmbigKKwlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwKKwljb25zdCB2b2lkICprZXksIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCit7CisJdW5zaWduZWQgaW50IGhhc2g7CisKKwkvKiBwYXJhbXMgbXVzdCBiZSBlcXVhbCB0byBodC0+cCBpZiBpdCBpc24ndCBjb25zdGFudC4gKi8KKwlpZiAoIV9fYnVpbHRpbl9jb25zdGFudF9wKHBhcmFtcy5rZXlfbGVuKSkKKwkJaGFzaCA9IGh0LT5wLmhhc2hmbihrZXksIGh0LT5rZXlfbGVuLCB0YmwtPmhhc2hfcm5kKTsKKwllbHNlIGlmIChwYXJhbXMua2V5X2xlbikgeworCQl1bnNpZ25lZCBpbnQga2V5X2xlbiA9IHBhcmFtcy5rZXlfbGVuOworCisJCWlmIChwYXJhbXMuaGFzaGZuKQorCQkJaGFzaCA9IHBhcmFtcy5oYXNoZm4oa2V5LCBrZXlfbGVuLCB0YmwtPmhhc2hfcm5kKTsKKwkJZWxzZSBpZiAoa2V5X2xlbiAmIChzaXplb2YodTMyKSAtIDEpKQorCQkJaGFzaCA9IGpoYXNoKGtleSwga2V5X2xlbiwgdGJsLT5oYXNoX3JuZCk7CisJCWVsc2UKKwkJCWhhc2ggPSBqaGFzaDIoa2V5LCBrZXlfbGVuIC8gc2l6ZW9mKHUzMiksCisJCQkJICAgICAgdGJsLT5oYXNoX3JuZCk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IGtleV9sZW4gPSBodC0+cC5rZXlfbGVuOworCisJCWlmIChwYXJhbXMuaGFzaGZuKQorCQkJaGFzaCA9IHBhcmFtcy5oYXNoZm4oa2V5LCBrZXlfbGVuLCB0YmwtPmhhc2hfcm5kKTsKKwkJZWxzZQorCQkJaGFzaCA9IGpoYXNoKGtleSwga2V5X2xlbiwgdGJsLT5oYXNoX3JuZCk7CisJfQorCisJcmV0dXJuIHJodF9idWNrZXRfaW5kZXgodGJsLCBoYXNoKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmh0X2hlYWRfaGFzaGZuKAorCXN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLAorCWNvbnN0IHN0cnVjdCByaGFzaF9oZWFkICpoZSwgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKK3sKKwljb25zdCBjaGFyICpwdHIgPSByaHRfb2JqKGh0LCBoZSk7CisKKwlyZXR1cm4gbGlrZWx5KHBhcmFtcy5vYmpfaGFzaGZuKSA/CisJICAgICAgIHJodF9idWNrZXRfaW5kZXgodGJsLCBwYXJhbXMub2JqX2hhc2hmbihwdHIsIHBhcmFtcy5rZXlfbGVuID86CisJCQkJCQkJICAgIGh0LT5wLmtleV9sZW4sCisJCQkJCQkgICAgICAgdGJsLT5oYXNoX3JuZCkpIDoKKwkgICAgICAgcmh0X2tleV9oYXNoZm4oaHQsIHRibCwgcHRyICsgcGFyYW1zLmtleV9vZmZzZXQsIHBhcmFtcyk7Cit9CisKKy8qKgorICogcmh0X2dyb3dfYWJvdmVfNzUgLSByZXR1cm5zIHRydWUgaWYgbmVsZW1zID4gMC43NSAqIHRhYmxlLXNpemUKKyAqIEBodDoJCWhhc2ggdGFibGUKKyAqIEB0Ymw6CWN1cnJlbnQgdGFibGUKKyAqLworc3RhdGljIGlubGluZSBib29sIHJodF9ncm93X2Fib3ZlXzc1KGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCkKK3sKKwkvKiBFeHBhbmQgdGFibGUgd2hlbiBleGNlZWRpbmcgNzUlIGxvYWQgKi8KKwlyZXR1cm4gYXRvbWljX3JlYWQoJmh0LT5uZWxlbXMpID4gKHRibC0+c2l6ZSAvIDQgKiAzKSAmJgorCSAgICAgICAoIWh0LT5wLm1heF9zaXplIHx8IHRibC0+c2l6ZSA8IGh0LT5wLm1heF9zaXplKTsKK30KKworLyoqCisgKiByaHRfc2hyaW5rX2JlbG93XzMwIC0gcmV0dXJucyB0cnVlIGlmIG5lbGVtcyA8IDAuMyAqIHRhYmxlLXNpemUKKyAqIEBodDoJCWhhc2ggdGFibGUKKyAqIEB0Ymw6CWN1cnJlbnQgdGFibGUKKyAqLworc3RhdGljIGlubGluZSBib29sIHJodF9zaHJpbmtfYmVsb3dfMzAoY29uc3Qgc3RydWN0IHJoYXNodGFibGUgKmh0LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwpCit7CisJLyogU2hyaW5rIHRhYmxlIGJlbmVhdGggMzAlIGxvYWQgKi8KKwlyZXR1cm4gYXRvbWljX3JlYWQoJmh0LT5uZWxlbXMpIDwgKHRibC0+c2l6ZSAqIDMgLyAxMCkgJiYKKwkgICAgICAgdGJsLT5zaXplID4gaHQtPnAubWluX3NpemU7Cit9CisKKy8qKgorICogcmh0X2dyb3dfYWJvdmVfMTAwIC0gcmV0dXJucyB0cnVlIGlmIG5lbGVtcyA+IHRhYmxlLXNpemUKKyAqIEBodDoJCWhhc2ggdGFibGUKKyAqIEB0Ymw6CWN1cnJlbnQgdGFibGUKKyAqLworc3RhdGljIGlubGluZSBib29sIHJodF9ncm93X2Fib3ZlXzEwMChjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsKQoreworCXJldHVybiBhdG9taWNfcmVhZCgmaHQtPm5lbGVtcykgPiB0YmwtPnNpemU7Cit9CisKKy8qIFRoZSBidWNrZXQgbG9jayBpcyBzZWxlY3RlZCBiYXNlZCBvbiB0aGUgaGFzaCBhbmQgcHJvdGVjdHMgbXV0YXRpb25zCisgKiBvbiBhIGdyb3VwIG9mIGhhc2ggYnVja2V0cy4KKyAqCisgKiBBIG1heGltdW0gb2YgdGJsLT5zaXplLzIgYnVja2V0IGxvY2tzIGlzIGFsbG9jYXRlZC4gVGhpcyBlbnN1cmVzIHRoYXQKKyAqIGEgc2luZ2xlIGxvY2sgYWx3YXlzIGNvdmVycyBib3RoIGJ1Y2tldHMgd2hpY2ggbWF5IGJvdGggY29udGFpbnMKKyAqIGVudHJpZXMgd2hpY2ggbGluayB0byB0aGUgc2FtZSBidWNrZXQgb2YgdGhlIG9sZCB0YWJsZSBkdXJpbmcgcmVzaXppbmcuCisgKiBUaGlzIGFsbG93cyB0byBzaW1wbGlmeSB0aGUgbG9ja2luZyBhcyBsb2NraW5nIHRoZSBidWNrZXQgaW4gYm90aAorICogdGFibGVzIGR1cmluZyByZXNpemUgYWx3YXlzIGd1YXJhbnRlZSBwcm90ZWN0aW9uLgorICoKKyAqIElNUE9SVEFOVDogV2hlbiBob2xkaW5nIHRoZSBidWNrZXQgbG9jayBvZiBib3RoIHRoZSBvbGQgYW5kIG5ldyB0YWJsZQorICogZHVyaW5nIGV4cGFuc2lvbnMgYW5kIHNocmlua2luZywgdGhlIG9sZCBidWNrZXQgbG9jayBtdXN0IGFsd2F5cyBiZQorICogYWNxdWlyZWQgZmlyc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3BpbmxvY2tfdCAqcmh0X2J1Y2tldF9sb2NrKGNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwKKwkJCQkJICB1bnNpZ25lZCBpbnQgaGFzaCkKK3sKKwlyZXR1cm4gJnRibC0+bG9ja3NbaGFzaCAmIHRibC0+bG9ja3NfbWFza107Cit9CisKICNpZmRlZiBDT05GSUdfUFJPVkVfTE9DS0lORwogaW50IGxvY2tkZXBfcmh0X211dGV4X2lzX2hlbGQoc3RydWN0IHJoYXNodGFibGUgKmh0KTsKIGludCBsb2NrZGVwX3JodF9idWNrZXRfaXNfaGVsZChjb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsIHUzMiBoYXNoKTsKQEAgLTE3OCwyMyArMzIwLDEzIEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BST1ZFX0xPQ0tJTkcgKi8KIAotaW50IHJoYXNodGFibGVfaW5pdChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyAqcGFyYW1zKTsKK2ludCByaGFzaHRhYmxlX2luaXQoc3RydWN0IHJoYXNodGFibGUgKmh0LAorCQkgICAgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zICpwYXJhbXMpOwogCi12b2lkIHJoYXNodGFibGVfaW5zZXJ0KHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNoX2hlYWQgKm5vZGUpOwotYm9vbCByaGFzaHRhYmxlX3JlbW92ZShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaF9oZWFkICpub2RlKTsKLQotaW50IHJoYXNodGFibGVfZXhwYW5kKHN0cnVjdCByaGFzaHRhYmxlICpodCk7Ci1pbnQgcmhhc2h0YWJsZV9zaHJpbmsoc3RydWN0IHJoYXNodGFibGUgKmh0KTsKLQotdm9pZCAqcmhhc2h0YWJsZV9sb29rdXAoc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXkpOwotdm9pZCAqcmhhc2h0YWJsZV9sb29rdXBfY29tcGFyZShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwKLQkJCQlib29sICgqY29tcGFyZSkodm9pZCAqLCB2b2lkICopLCB2b2lkICphcmcpOwotCi1ib29sIHJoYXNodGFibGVfbG9va3VwX2luc2VydChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaF9oZWFkICpvYmopOwotYm9vbCByaGFzaHRhYmxlX2xvb2t1cF9jb21wYXJlX2luc2VydChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCi0JCQkJICAgICAgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKLQkJCQkgICAgICBib29sICgqY29tcGFyZSkodm9pZCAqLCB2b2lkICopLAotCQkJCSAgICAgIHZvaWQgKmFyZyk7CitpbnQgcmhhc2h0YWJsZV9pbnNlcnRfc2xvdyhzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwKKwkJCSAgIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCisJCQkgICBzdHJ1Y3QgYnVja2V0X3RhYmxlICpvbGRfdGJsKTsKK2ludCByaGFzaHRhYmxlX2luc2VydF9yZWhhc2goc3RydWN0IHJoYXNodGFibGUgKmh0KTsKIAogaW50IHJoYXNodGFibGVfd2Fsa19pbml0KHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcik7CiB2b2lkIHJoYXNodGFibGVfd2Fsa19leGl0KHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpOwpAQCAtMjAyLDYgKzMzNCw5IEBACiB2b2lkICpyaGFzaHRhYmxlX3dhbGtfbmV4dChzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyKTsKIHZvaWQgcmhhc2h0YWJsZV93YWxrX3N0b3Aoc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcikgX19yZWxlYXNlcyhSQ1UpOwogCit2b2lkIHJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJIHZvaWQgKCpmcmVlX2ZuKSh2b2lkICpwdHIsIHZvaWQgKmFyZyksCisJCQkJIHZvaWQgKmFyZyk7CiB2b2lkIHJoYXNodGFibGVfZGVzdHJveShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQpOwogCiAjZGVmaW5lIHJodF9kZXJlZmVyZW5jZShwLCBodCkgXApAQCAtMzUyLDQgKzQ4NywzMTYgQEAKIAlyaHRfZm9yX2VhY2hfZW50cnlfcmN1X2NvbnRpbnVlKHRwb3MsIHBvcywgKHRibCktPmJ1Y2tldHNbaGFzaF0sXAogCQkJCQl0YmwsIGhhc2gsIG1lbWJlcikKIAorc3RhdGljIGlubGluZSBpbnQgcmhhc2h0YWJsZV9jb21wYXJlKHN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnICphcmcsCisJCQkJICAgICBjb25zdCB2b2lkICpvYmopCit7CisJc3RydWN0IHJoYXNodGFibGUgKmh0ID0gYXJnLT5odDsKKwljb25zdCBjaGFyICpwdHIgPSBvYmo7CisKKwlyZXR1cm4gbWVtY21wKHB0ciArIGh0LT5wLmtleV9vZmZzZXQsIGFyZy0+a2V5LCBodC0+cC5rZXlfbGVuKTsKK30KKworLyoqCisgKiByaGFzaHRhYmxlX2xvb2t1cF9mYXN0IC0gc2VhcmNoIGhhc2ggdGFibGUsIGlubGluZWQgdmVyc2lvbgorICogQGh0OgkJaGFzaCB0YWJsZQorICogQGtleToJdGhlIHBvaW50ZXIgdG8gdGhlIGtleQorICogQHBhcmFtczoJaGFzaCB0YWJsZSBwYXJhbWV0ZXJzCisgKgorICogQ29tcHV0ZXMgdGhlIGhhc2ggdmFsdWUgZm9yIHRoZSBrZXkgYW5kIHRyYXZlcnNlcyB0aGUgYnVja2V0IGNoYWluIGxvb2tpbmcKKyAqIGZvciBhIGVudHJ5IHdpdGggYW4gaWRlbnRpY2FsIGtleS4gVGhlIGZpcnN0IG1hdGNoaW5nIGVudHJ5IGlzIHJldHVybmVkLgorICoKKyAqIFJldHVybnMgdGhlIGZpcnN0IGVudHJ5IG9uIHdoaWNoIHRoZSBjb21wYXJlIGZ1bmN0aW9uIHJldHVybmVkIHRydWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCAqcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgKKwlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQoreworCXN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnIGFyZyA9IHsKKwkJLmh0ID0gaHQsCisJCS5rZXkgPSBrZXksCisJfTsKKwljb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CisJc3RydWN0IHJoYXNoX2hlYWQgKmhlOworCXVuc2lnbmVkIGludCBoYXNoOworCisJcmN1X3JlYWRfbG9jaygpOworCisJdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+dGJsLCBodCk7CityZXN0YXJ0OgorCWhhc2ggPSByaHRfa2V5X2hhc2hmbihodCwgdGJsLCBrZXksIHBhcmFtcyk7CisJcmh0X2Zvcl9lYWNoX3JjdShoZSwgdGJsLCBoYXNoKSB7CisJCWlmIChwYXJhbXMub2JqX2NtcGZuID8KKwkJICAgIHBhcmFtcy5vYmpfY21wZm4oJmFyZywgcmh0X29iaihodCwgaGUpKSA6CisJCSAgICByaGFzaHRhYmxlX2NvbXBhcmUoJmFyZywgcmh0X29iaihodCwgaGUpKSkKKwkJCWNvbnRpbnVlOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJcmV0dXJuIHJodF9vYmooaHQsIGhlKTsKKwl9CisKKwkvKiBFbnN1cmUgd2Ugc2VlIGFueSBuZXcgdGFibGVzLiAqLworCXNtcF9ybWIoKTsKKworCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UodGJsLT5mdXR1cmVfdGJsLCBodCk7CisJaWYgKHVubGlrZWx5KHRibCkpCisJCWdvdG8gcmVzdGFydDsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBOVUxMOworfQorCisvKiBJbnRlcm5hbCBmdW5jdGlvbiwgcGxlYXNlIHVzZSByaGFzaHRhYmxlX2luc2VydF9mYXN0KCkgaW5zdGVhZCAqLworc3RhdGljIGlubGluZSBpbnQgX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KAorCXN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAorCWNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCit7CisJc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgYXJnID0geworCQkuaHQgPSBodCwKKwkJLmtleSA9IGtleSwKKwl9OworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwgKm5ld190Ymw7CisJc3RydWN0IHJoYXNoX2hlYWQgKmhlYWQ7CisJc3BpbmxvY2tfdCAqbG9jazsKKwl1bnNpZ25lZCBpbnQgZWxhc3RpY2l0eTsKKwl1bnNpZ25lZCBpbnQgaGFzaDsKKwlpbnQgZXJyOworCityZXN0YXJ0OgorCXJjdV9yZWFkX2xvY2soKTsKKworCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOworCisJLyogQWxsIGluc2VydGlvbnMgbXVzdCBncmFiIHRoZSBvbGRlc3QgdGFibGUgY29udGFpbmluZworCSAqIHRoZSBoYXNoZWQgYnVja2V0IHRoYXQgaXMgeWV0IHRvIGJlIHJlaGFzaGVkLgorCSAqLworCWZvciAoOzspIHsKKwkJaGFzaCA9IHJodF9oZWFkX2hhc2hmbihodCwgdGJsLCBvYmosIHBhcmFtcyk7CisJCWxvY2sgPSByaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKTsKKwkJc3Bpbl9sb2NrX2JoKGxvY2spOworCisJCWlmICh0YmwtPnJlaGFzaCA8PSBoYXNoKQorCQkJYnJlYWs7CisKKwkJc3Bpbl91bmxvY2tfYmgobG9jayk7CisJCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UodGJsLT5mdXR1cmVfdGJsLCBodCk7CisJfQorCisJbmV3X3RibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UodGJsLT5mdXR1cmVfdGJsLCBodCk7CisJaWYgKHVubGlrZWx5KG5ld190YmwpKSB7CisJCWVyciA9IHJoYXNodGFibGVfaW5zZXJ0X3Nsb3coaHQsIGtleSwgb2JqLCBuZXdfdGJsKTsKKwkJaWYgKGVyciA9PSAtRUFHQUlOKQorCQkJZ290byBzbG93X3BhdGg7CisJCWdvdG8gb3V0OworCX0KKworCWlmICh1bmxpa2VseShyaHRfZ3Jvd19hYm92ZV8xMDAoaHQsIHRibCkpKSB7CitzbG93X3BhdGg6CisJCXNwaW5fdW5sb2NrX2JoKGxvY2spOworCQllcnIgPSByaGFzaHRhYmxlX2luc2VydF9yZWhhc2goaHQpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZ290byByZXN0YXJ0OworCX0KKworCWVyciA9IC1FRVhJU1Q7CisJZWxhc3RpY2l0eSA9IGh0LT5lbGFzdGljaXR5OworCXJodF9mb3JfZWFjaChoZWFkLCB0YmwsIGhhc2gpIHsKKwkJaWYgKGtleSAmJgorCQkgICAgdW5saWtlbHkoIShwYXJhbXMub2JqX2NtcGZuID8KKwkJCSAgICAgICBwYXJhbXMub2JqX2NtcGZuKCZhcmcsIHJodF9vYmooaHQsIGhlYWQpKSA6CisJCQkgICAgICAgcmhhc2h0YWJsZV9jb21wYXJlKCZhcmcsIHJodF9vYmooaHQsIGhlYWQpKSkpKQorCQkJZ290byBvdXQ7CisJCWlmICghLS1lbGFzdGljaXR5KQorCQkJZ290byBzbG93X3BhdGg7CisJfQorCisJZXJyID0gMDsKKworCWhlYWQgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KHRibC0+YnVja2V0c1toYXNoXSwgdGJsLCBoYXNoKTsKKworCVJDVV9JTklUX1BPSU5URVIob2JqLT5uZXh0LCBoZWFkKTsKKworCXJjdV9hc3NpZ25fcG9pbnRlcih0YmwtPmJ1Y2tldHNbaGFzaF0sIG9iaik7CisKKwlhdG9taWNfaW5jKCZodC0+bmVsZW1zKTsKKwlpZiAocmh0X2dyb3dfYWJvdmVfNzUoaHQsIHRibCkpCisJCXNjaGVkdWxlX3dvcmsoJmh0LT5ydW5fd29yayk7CisKK291dDoKKwlzcGluX3VubG9ja19iaChsb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogcmhhc2h0YWJsZV9pbnNlcnRfZmFzdCAtIGluc2VydCBvYmplY3QgaW50byBoYXNoIHRhYmxlCisgKiBAaHQ6CQloYXNoIHRhYmxlCisgKiBAb2JqOglwb2ludGVyIHRvIGhhc2ggaGVhZCBpbnNpZGUgb2JqZWN0CisgKiBAcGFyYW1zOgloYXNoIHRhYmxlIHBhcmFtZXRlcnMKKyAqCisgKiBXaWxsIHRha2UgYSBwZXIgYnVja2V0IHNwaW5sb2NrIHRvIHByb3RlY3QgYWdhaW5zdCBtdXR1YWwgbXV0YXRpb25zCisgKiBvbiB0aGUgc2FtZSBidWNrZXQuIE11bHRpcGxlIGluc2VydGlvbnMgbWF5IG9jY3VyIGluIHBhcmFsbGVsIHVubGVzcworICogdGhleSBtYXAgdG8gdGhlIHNhbWUgYnVja2V0IGxvY2suCisgKgorICogSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gZnJvbSBhdG9taWMgY29udGV4dC4KKyAqCisgKiBXaWxsIHRyaWdnZXIgYW4gYXV0b21hdGljIGRlZmVycmVkIHRhYmxlIHJlc2l6aW5nIGlmIHRoZSBzaXplIGdyb3dzCisgKiBiZXlvbmQgdGhlIHdhdGVybWFyayBpbmRpY2F0ZWQgYnkgZ3Jvd19kZWNpc2lvbigpIHdoaWNoIGNhbiBiZSBwYXNzZWQKKyAqIHRvIHJoYXNodGFibGVfaW5pdCgpLgorICovCitzdGF0aWMgaW5saW5lIGludCByaGFzaHRhYmxlX2luc2VydF9mYXN0KAorCXN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQoreworCXJldHVybiBfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoaHQsIE5VTEwsIG9iaiwgcGFyYW1zKTsKK30KKworLyoqCisgKiByaGFzaHRhYmxlX2xvb2t1cF9pbnNlcnRfZmFzdCAtIGxvb2t1cCBhbmQgaW5zZXJ0IG9iamVjdCBpbnRvIGhhc2ggdGFibGUKKyAqIEBodDoJCWhhc2ggdGFibGUKKyAqIEBvYmo6CXBvaW50ZXIgdG8gaGFzaCBoZWFkIGluc2lkZSBvYmplY3QKKyAqIEBwYXJhbXM6CWhhc2ggdGFibGUgcGFyYW1ldGVycworICoKKyAqIExvY2tzIGRvd24gdGhlIGJ1Y2tldCBjaGFpbiBpbiBib3RoIHRoZSBvbGQgYW5kIG5ldyB0YWJsZSBpZiBhIHJlc2l6ZQorICogaXMgaW4gcHJvZ3Jlc3MgdG8gZW5zdXJlIHRoYXQgd3JpdGVycyBjYW4ndCByZW1vdmUgZnJvbSB0aGUgb2xkIHRhYmxlCisgKiBhbmQgY2FuJ3QgaW5zZXJ0IHRvIHRoZSBuZXcgdGFibGUgZHVyaW5nIHRoZSBhdG9taWMgb3BlcmF0aW9uIG9mIHNlYXJjaAorICogYW5kIGluc2VydGlvbi4gU2VhcmNoZXMgZm9yIGR1cGxpY2F0ZXMgaW4gYm90aCB0aGUgb2xkIGFuZCBuZXcgdGFibGUgaWYKKyAqIGEgcmVzaXplIGlzIGluIHByb2dyZXNzLgorICoKKyAqIFRoaXMgbG9va3VwIGZ1bmN0aW9uIG1heSBvbmx5IGJlIHVzZWQgZm9yIGZpeGVkIGtleSBoYXNoIHRhYmxlIChrZXlfbGVuCisgKiBwYXJhbWV0ZXIgc2V0KS4gSXQgd2lsbCBCVUcoKSBpZiB1c2VkIGluYXBwcm9wcmlhdGVseS4KKyAqCisgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGF0b21pYyBjb250ZXh0LgorICoKKyAqIFdpbGwgdHJpZ2dlciBhbiBhdXRvbWF0aWMgZGVmZXJyZWQgdGFibGUgcmVzaXppbmcgaWYgdGhlIHNpemUgZ3Jvd3MKKyAqIGJleW9uZCB0aGUgd2F0ZXJtYXJrIGluZGljYXRlZCBieSBncm93X2RlY2lzaW9uKCkgd2hpY2ggY2FuIGJlIHBhc3NlZAorICogdG8gcmhhc2h0YWJsZV9pbml0KCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJoYXNodGFibGVfbG9va3VwX2luc2VydF9mYXN0KAorCXN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQoreworCWNvbnN0IGNoYXIgKmtleSA9IHJodF9vYmooaHQsIG9iaik7CisKKwlCVUdfT04oaHQtPnAub2JqX2hhc2hmbik7CisKKwlyZXR1cm4gX19yaGFzaHRhYmxlX2luc2VydF9mYXN0KGh0LCBrZXkgKyBodC0+cC5rZXlfb2Zmc2V0LCBvYmosCisJCQkJCXBhcmFtcyk7Cit9CisKKy8qKgorICogcmhhc2h0YWJsZV9sb29rdXBfaW5zZXJ0X2tleSAtIHNlYXJjaCBhbmQgaW5zZXJ0IG9iamVjdCB0byBoYXNoIHRhYmxlCisgKgkJCQkgIHdpdGggZXhwbGljaXQga2V5CisgKiBAaHQ6CQloYXNoIHRhYmxlCisgKiBAa2V5OglrZXkKKyAqIEBvYmo6CXBvaW50ZXIgdG8gaGFzaCBoZWFkIGluc2lkZSBvYmplY3QKKyAqIEBwYXJhbXM6CWhhc2ggdGFibGUgcGFyYW1ldGVycworICoKKyAqIExvY2tzIGRvd24gdGhlIGJ1Y2tldCBjaGFpbiBpbiBib3RoIHRoZSBvbGQgYW5kIG5ldyB0YWJsZSBpZiBhIHJlc2l6ZQorICogaXMgaW4gcHJvZ3Jlc3MgdG8gZW5zdXJlIHRoYXQgd3JpdGVycyBjYW4ndCByZW1vdmUgZnJvbSB0aGUgb2xkIHRhYmxlCisgKiBhbmQgY2FuJ3QgaW5zZXJ0IHRvIHRoZSBuZXcgdGFibGUgZHVyaW5nIHRoZSBhdG9taWMgb3BlcmF0aW9uIG9mIHNlYXJjaAorICogYW5kIGluc2VydGlvbi4gU2VhcmNoZXMgZm9yIGR1cGxpY2F0ZXMgaW4gYm90aCB0aGUgb2xkIGFuZCBuZXcgdGFibGUgaWYKKyAqIGEgcmVzaXplIGlzIGluIHByb2dyZXNzLgorICoKKyAqIExvb2t1cHMgbWF5IG9jY3VyIGluIHBhcmFsbGVsIHdpdGggaGFzaHRhYmxlIG11dGF0aW9ucyBhbmQgcmVzaXppbmcuCisgKgorICogV2lsbCB0cmlnZ2VyIGFuIGF1dG9tYXRpYyBkZWZlcnJlZCB0YWJsZSByZXNpemluZyBpZiB0aGUgc2l6ZSBncm93cworICogYmV5b25kIHRoZSB3YXRlcm1hcmsgaW5kaWNhdGVkIGJ5IGdyb3dfZGVjaXNpb24oKSB3aGljaCBjYW4gYmUgcGFzc2VkCisgKiB0byByaGFzaHRhYmxlX2luaXQoKS4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmhhc2h0YWJsZV9sb29rdXBfaW5zZXJ0X2tleSgKKwlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQoreworCUJVR19PTighaHQtPnAub2JqX2hhc2hmbiB8fCAha2V5KTsKKworCXJldHVybiBfX3JoYXNodGFibGVfaW5zZXJ0X2Zhc3QoaHQsIGtleSwgb2JqLCBwYXJhbXMpOworfQorCisvKiBJbnRlcm5hbCBmdW5jdGlvbiwgcGxlYXNlIHVzZSByaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCkgaW5zdGVhZCAqLworc3RhdGljIGlubGluZSBpbnQgX19yaGFzaHRhYmxlX3JlbW92ZV9mYXN0KAorCXN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLAorCXN0cnVjdCByaGFzaF9oZWFkICpvYmosIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMpCit7CisJc3RydWN0IHJoYXNoX2hlYWQgX19yY3UgKipwcHJldjsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGU7CisJc3BpbmxvY2tfdCAqIGxvY2s7CisJdW5zaWduZWQgaW50IGhhc2g7CisJaW50IGVyciA9IC1FTk9FTlQ7CisKKwloYXNoID0gcmh0X2hlYWRfaGFzaGZuKGh0LCB0YmwsIG9iaiwgcGFyYW1zKTsKKwlsb2NrID0gcmh0X2J1Y2tldF9sb2NrKHRibCwgaGFzaCk7CisKKwlzcGluX2xvY2tfYmgobG9jayk7CisKKwlwcHJldiA9ICZ0YmwtPmJ1Y2tldHNbaGFzaF07CisJcmh0X2Zvcl9lYWNoKGhlLCB0YmwsIGhhc2gpIHsKKwkJaWYgKGhlICE9IG9iaikgeworCQkJcHByZXYgPSAmaGUtPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJjdV9hc3NpZ25fcG9pbnRlcigqcHByZXYsIG9iai0+bmV4dCk7CisJCWVyciA9IDA7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2JoKGxvY2spOworCisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiByaGFzaHRhYmxlX3JlbW92ZV9mYXN0IC0gcmVtb3ZlIG9iamVjdCBmcm9tIGhhc2ggdGFibGUKKyAqIEBodDoJCWhhc2ggdGFibGUKKyAqIEBvYmo6CXBvaW50ZXIgdG8gaGFzaCBoZWFkIGluc2lkZSBvYmplY3QKKyAqIEBwYXJhbXM6CWhhc2ggdGFibGUgcGFyYW1ldGVycworICoKKyAqIFNpbmNlIHRoZSBoYXNoIGNoYWluIGlzIHNpbmdsZSBsaW5rZWQsIHRoZSByZW1vdmFsIG9wZXJhdGlvbiBuZWVkcyB0bworICogd2FsayB0aGUgYnVja2V0IGNoYWluIHVwb24gcmVtb3ZhbC4gVGhlIHJlbW92YWwgb3BlcmF0aW9uIGlzIHRodXMKKyAqIGNvbnNpZGVyYWJsZSBzbG93IGlmIHRoZSBoYXNoIHRhYmxlIGlzIG5vdCBjb3JyZWN0bHkgc2l6ZWQuCisgKgorICogV2lsbCBhdXRvbWF0aWNhbGx5IHNocmluayB0aGUgdGFibGUgdmlhIHJoYXNodGFibGVfZXhwYW5kKCkgaWYgdGhlCisgKiBzaHJpbmtfZGVjaXNpb24gZnVuY3Rpb24gc3BlY2lmaWVkIGF0IHJoYXNodGFibGVfaW5pdCgpIHJldHVybnMgdHJ1ZS4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgLUVOT0VOVCBpZiB0aGUgZW50cnkgY291bGQgbm90IGJlIGZvdW5kLgorICovCitzdGF0aWMgaW5saW5lIGludCByaGFzaHRhYmxlX3JlbW92ZV9mYXN0KAorCXN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKKwljb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zKQoreworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKKwlpbnQgZXJyOworCisJcmN1X3JlYWRfbG9jaygpOworCisJdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+dGJsLCBodCk7CisKKwkvKiBCZWNhdXNlIHdlIGhhdmUgYWxyZWFkeSB0YWtlbiAoYW5kIHJlbGVhc2VkKSB0aGUgYnVja2V0CisJICogbG9jayBpbiBvbGRfdGJsLCBpZiB3ZSBmaW5kIHRoYXQgZnV0dXJlX3RibCBpcyBub3QgeWV0CisJICogdmlzaWJsZSB0aGVuIHRoYXQgZ3VhcmFudGVlcyB0aGUgZW50cnkgdG8gc3RpbGwgYmUgaW4KKwkgKiB0aGUgb2xkIHRibCBpZiBpdCBleGlzdHMuCisJICovCisJd2hpbGUgKChlcnIgPSBfX3JoYXNodGFibGVfcmVtb3ZlX2Zhc3QoaHQsIHRibCwgb2JqLCBwYXJhbXMpKSAmJgorCSAgICAgICAodGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdSh0YmwtPmZ1dHVyZV90YmwsIGh0KSkpCisJCTsKKworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJYXRvbWljX2RlYygmaHQtPm5lbGVtcyk7CisJaWYgKHVubGlrZWx5KGh0LT5wLmF1dG9tYXRpY19zaHJpbmtpbmcgJiYKKwkJICAgICByaHRfc2hyaW5rX2JlbG93XzMwKGh0LCB0YmwpKSkKKwkJc2NoZWR1bGVfd29yaygmaHQtPnJ1bl93b3JrKTsKKworb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIGVycjsKK30KKwogI2VuZGlmIC8qIF9MSU5VWF9SSEFTSFRBQkxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcm1hcC5oIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKaW5kZXggYzRjNTU5YS4uYzg5YzUzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ybWFwLmgKKysrIGIvaW5jbHVkZS9saW51eC9ybWFwLmgKQEAgLTEwNSwxNCArMTA1LDYgQEAKIAkJX19wdXRfYW5vbl92bWEoYW5vbl92bWEpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBhbm9uX3ZtYSAqcGFnZV9hbm9uX3ZtYShzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlpZiAoKCh1bnNpZ25lZCBsb25nKXBhZ2UtPm1hcHBpbmcgJiBQQUdFX01BUFBJTkdfRkxBR1MpICE9Ci0JCQkJCSAgICBQQUdFX01BUFBJTkdfQU5PTikKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHBhZ2Vfcm1hcHBpbmcocGFnZSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCB2bWFfbG9ja19hbm9uX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gdm1hLT5hbm9uX3ZtYTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRjLmggYi9pbmNsdWRlL2xpbnV4L3J0Yy5oCmluZGV4IGRjYWQ3ZWUuLjhkY2Y2ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcnRjLmgKKysrIGIvaW5jbHVkZS9saW51eC9ydGMuaApAQCAtNzcsNiArNzcsNyBAQAogCWludCAoKnJlYWRfYWxhcm0pKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHJ0Y193a2Fscm0gKik7CiAJaW50ICgqc2V0X2FsYXJtKShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBydGNfd2thbHJtICopOwogCWludCAoKnByb2MpKHN0cnVjdCBkZXZpY2UgKiwgc3RydWN0IHNlcV9maWxlICopOworCWludCAoKnNldF9tbXNzNjQpKHN0cnVjdCBkZXZpY2UgKiwgdGltZTY0X3Qgc2Vjcyk7CiAJaW50ICgqc2V0X21tc3MpKHN0cnVjdCBkZXZpY2UgKiwgdW5zaWduZWQgbG9uZyBzZWNzKTsKIAlpbnQgKCpyZWFkX2NhbGxiYWNrKShzdHJ1Y3QgZGV2aWNlICosIGludCBkYXRhKTsKIAlpbnQgKCphbGFybV9pcnFfZW5hYmxlKShzdHJ1Y3QgZGV2aWNlICosIHVuc2lnbmVkIGludCBlbmFibGVkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L3J0bmV0bGluay5oCmluZGV4IDVkYjc2YTMuLjJkYTVkMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcnRuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9ydG5ldGxpbmsuaApAQCAtNzcsNyArNzcsMjAgQEAKIAlyZXR1cm4gcnRubF9kZXJlZmVyZW5jZShkZXYtPmluZ3Jlc3NfcXVldWUpOwogfQogCi1leHRlcm4gc3RydWN0IG5ldGRldl9xdWV1ZSAqZGV2X2luZ3Jlc3NfcXVldWVfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworc3RydWN0IG5ldGRldl9xdWV1ZSAqZGV2X2luZ3Jlc3NfcXVldWVfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCisjaWZkZWYgQ09ORklHX05FVF9DTFNfQUNUCit2b2lkIG5ldF9pbmNfaW5ncmVzc19xdWV1ZSh2b2lkKTsKK3ZvaWQgbmV0X2RlY19pbmdyZXNzX3F1ZXVlKHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRfaW5jX2luZ3Jlc3NfcXVldWUodm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldF9kZWNfaW5ncmVzc19xdWV1ZSh2b2lkKQoreworfQorI2VuZGlmCiAKIGV4dGVybiB2b2lkIHJ0bmV0bGlua19pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgX19ydG5sX3VubG9jayh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCA2ZDc3NDMyLi44MjIyYWU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC0xMjUsNyArMTI1LDYgQEAKIAl1NjQgc2NoZWRfcGVyaW9kOwogfTsKIAotc3RydWN0IGV4ZWNfZG9tYWluOwogc3RydWN0IGZ1dGV4X3BpX3N0YXRlOwogc3RydWN0IHJvYnVzdF9saXN0X2hlYWQ7CiBzdHJ1Y3QgYmlvX2xpc3Q7CkBAIC0xNzYsNiArMTc1LDE0IEBACiBleHRlcm4gdm9pZCBjYWxjX2dsb2JhbF9sb2FkKHVuc2lnbmVkIGxvbmcgdGlja3MpOwogZXh0ZXJuIHZvaWQgdXBkYXRlX2NwdV9sb2FkX25vaHoodm9pZCk7CiAKKy8qIE5vdGlmaWVyIGZvciB3aGVuIGEgdGFzayBnZXRzIG1pZ3JhdGVkIHRvIGEgbmV3IENQVSAqLworc3RydWN0IHRhc2tfbWlncmF0aW9uX25vdGlmaWVyIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJaW50IGZyb21fY3B1OworCWludCB0b19jcHU7Cit9OworZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfdGFza19taWdyYXRpb25fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuKTsKKwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3BhcmVudF9pcCh1bnNpZ25lZCBsb25nIGFkZHIpOwogCiBleHRlcm4gdm9pZCBkdW1wX2NwdV90YXNrKGludCBjcHUpOwpAQCAtMzI5LDYgKzMzNiw4IEBACiBleHRlcm4gdm9pZCBpbml0X2lkbGUoc3RydWN0IHRhc2tfc3RydWN0ICppZGxlLCBpbnQgY3B1KTsKIGV4dGVybiB2b2lkIGluaXRfaWRsZV9ib290dXBfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpOwogCitleHRlcm4gY3B1bWFza192YXJfdCBjcHVfaXNvbGF0ZWRfbWFwOworCiBleHRlcm4gaW50IHJ1bnF1ZXVlX2lzX2xvY2tlZChpbnQgY3B1KTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfTk9fSFpfQ09NTU9OKQpAQCAtMTExNSwxNSArMTEyNCwyOCBAQAogfTsKIAogc3RydWN0IHNjaGVkX2F2ZyB7CisJdTY0IGxhc3RfcnVubmFibGVfdXBkYXRlOworCXM2NCBkZWNheV9jb3VudDsKKwkvKgorCSAqIHV0aWxpemF0aW9uX2F2Z19jb250cmliIGRlc2NyaWJlcyB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCBhCisJICogc2NoZWRfZW50aXR5IGlzIHJ1bm5pbmcgb24gYSBDUFUuIEl0IGlzIGJhc2VkIG9uIHJ1bm5pbmdfYXZnX3N1bQorCSAqIGFuZCBpcyBzY2FsZWQgaW4gdGhlIHJhbmdlIFswLi5TQ0hFRF9MT0FEX1NDQUxFXS4KKwkgKiBsb2FkX2F2Z19jb250cmliIGRlc2NyaWJlZCB0aGUgYW1vdW50IG9mIHRpbWUgdGhhdCBhIHNjaGVkX2VudGl0eQorCSAqIGlzIHJ1bm5hYmxlIG9uIGEgcnEuIEl0IGlzIGJhc2VkIG9uIGJvdGggcnVubmFibGVfYXZnX3N1bSBhbmQgdGhlCisJICogd2VpZ2h0IG9mIHRoZSB0YXNrLgorCSAqLworCXVuc2lnbmVkIGxvbmcgbG9hZF9hdmdfY29udHJpYiwgdXRpbGl6YXRpb25fYXZnX2NvbnRyaWI7CiAJLyoKIAkgKiBUaGVzZSBzdW1zIHJlcHJlc2VudCBhbiBpbmZpbml0ZSBnZW9tZXRyaWMgc2VyaWVzIGFuZCBzbyBhcmUgYm91bmQKIAkgKiBhYm92ZSBieSAxMDI0LygxLXkpLiAgVGh1cyB3ZSBvbmx5IG5lZWQgYSB1MzIgdG8gc3RvcmUgdGhlbSBmb3IgYWxsCiAJICogY2hvaWNlcyBvZiB5IDwgMS0yXigtMzIpKjEwMjQuCisJICogcnVubmluZ19hdmdfc3VtIHJlZmxlY3RzIHRoZSB0aW1lIHRoYXQgdGhlIHNjaGVkX2VudGl0eSBpcworCSAqIGVmZmVjdGl2ZWx5IHJ1bm5pbmcgb24gdGhlIENQVS4KKwkgKiBydW5uYWJsZV9hdmdfc3VtIHJlcHJlc2VudHMgdGhlIGFtb3VudCBvZiB0aW1lIGEgc2NoZWRfZW50aXR5IGlzIG9uCisJICogYSBydW5xdWV1ZSB3aGljaCBpbmNsdWRlcyB0aGUgcnVubmluZyB0aW1lIHRoYXQgaXMgbW9uaXRvcmVkIGJ5CisJICogcnVubmluZ19hdmdfc3VtLgogCSAqLwotCXUzMiBydW5uYWJsZV9hdmdfc3VtLCBydW5uYWJsZV9hdmdfcGVyaW9kOwotCXU2NCBsYXN0X3J1bm5hYmxlX3VwZGF0ZTsKLQlzNjQgZGVjYXlfY291bnQ7Ci0JdW5zaWduZWQgbG9uZyBsb2FkX2F2Z19jb250cmliOworCXUzMiBydW5uYWJsZV9hdmdfc3VtLCBhdmdfcGVyaW9kLCBydW5uaW5nX2F2Z19zdW07CiB9OwogCiAjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKQEAgLTE2MjUsMTEgKzE2NDcsMTEgQEAKIAogCS8qCiAJICogbnVtYV9mYXVsdHNfbG9jYWxpdHkgdHJhY2tzIGlmIGZhdWx0cyByZWNvcmRlZCBkdXJpbmcgdGhlIGxhc3QKLQkgKiBzY2FuIHdpbmRvdyB3ZXJlIHJlbW90ZS9sb2NhbC4gVGhlIHRhc2sgc2NhbiBwZXJpb2QgaXMgYWRhcHRlZAotCSAqIGJhc2VkIG9uIHRoZSBsb2NhbGl0eSBvZiB0aGUgZmF1bHRzIHdpdGggZGlmZmVyZW50IHdlaWdodHMKLQkgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGV5IHdlcmUgc2hhcmVkIG9yIHByaXZhdGUgZmF1bHRzCisJICogc2NhbiB3aW5kb3cgd2VyZSByZW1vdGUvbG9jYWwgb3IgZmFpbGVkIHRvIG1pZ3JhdGUuIFRoZSB0YXNrIHNjYW4KKwkgKiBwZXJpb2QgaXMgYWRhcHRlZCBiYXNlZCBvbiB0aGUgbG9jYWxpdHkgb2YgdGhlIGZhdWx0cyB3aXRoIGRpZmZlcmVudAorCSAqIHdlaWdodHMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhleSB3ZXJlIHNoYXJlZCBvciBwcml2YXRlIGZhdWx0cwogCSAqLwotCXVuc2lnbmVkIGxvbmcgbnVtYV9mYXVsdHNfbG9jYWxpdHlbMl07CisJdW5zaWduZWQgbG9uZyBudW1hX2ZhdWx0c19sb2NhbGl0eVszXTsKIAogCXVuc2lnbmVkIGxvbmcgbnVtYV9wYWdlc19taWdyYXRlZDsKICNlbmRpZiAvKiBDT05GSUdfTlVNQV9CQUxBTkNJTkcgKi8KQEAgLTE3MTksNiArMTc0MSw3IEBACiAjZGVmaW5lIFRORl9OT19HUk9VUAkweDAyCiAjZGVmaW5lIFRORl9TSEFSRUQJMHgwNAogI2RlZmluZSBUTkZfRkFVTFRfTE9DQUwJMHgwOAorI2RlZmluZSBUTkZfTUlHUkFURV9GQUlMIDB4MTAKIAogI2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lORwogZXh0ZXJuIHZvaWQgdGFza19udW1hX2ZhdWx0KGludCBsYXN0X25vZGUsIGludCBub2RlLCBpbnQgcGFnZXMsIGludCBmbGFncyk7CkBAIC0yMjg3LDExICsyMzEwLDYgQEAKIAogdm9pZCB5aWVsZCh2b2lkKTsKIAotLyoKLSAqIFRoZSBkZWZhdWx0IChMaW51eCkgZXhlY3V0aW9uIGRvbWFpbi4KLSAqLwotZXh0ZXJuIHN0cnVjdCBleGVjX2RvbWFpbglkZWZhdWx0X2V4ZWNfZG9tYWluOwotCiB1bmlvbiB0aHJlYWRfdW5pb24gewogCXN0cnVjdCB0aHJlYWRfaW5mbyB0aHJlYWRfaW5mbzsKIAl1bnNpZ25lZCBsb25nIHN0YWNrW1RIUkVBRF9TSVpFL3NpemVvZihsb25nKV07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmggYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKaW5kZXggYTFiN2RiZC4uMTgyNjRlYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaApAQCAtMTU1Niw3ICsxNTU2LDcgQEAKIAlpbnQgKCppbm9kZV9mb2xsb3dfbGluaykgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwogCWludCAoKmlub2RlX3Blcm1pc3Npb24pIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgbWFzayk7CiAJaW50ICgqaW5vZGVfc2V0YXR0cikJKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IGlhdHRyICphdHRyKTsKLQlpbnQgKCppbm9kZV9nZXRhdHRyKSAoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CisJaW50ICgqaW5vZGVfZ2V0YXR0cikgKGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoKTsKIAlpbnQgKCppbm9kZV9zZXR4YXR0cikgKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgY29uc3QgY2hhciAqbmFtZSwKIAkJCSAgICAgICBjb25zdCB2b2lkICp2YWx1ZSwgc2l6ZV90IHNpemUsIGludCBmbGFncyk7CiAJdm9pZCAoKmlub2RlX3Bvc3Rfc2V0eGF0dHIpIChzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCkBAIC0xNzE2LDcgKzE3MTYsNiBAQAogCWludCAoKnR1bl9kZXZfYXR0YWNoX3F1ZXVlKSAodm9pZCAqc2VjdXJpdHkpOwogCWludCAoKnR1bl9kZXZfYXR0YWNoKSAoc3RydWN0IHNvY2sgKnNrLCB2b2lkICpzZWN1cml0eSk7CiAJaW50ICgqdHVuX2Rldl9vcGVuKSAodm9pZCAqc2VjdXJpdHkpOwotCXZvaWQgKCpza2Jfb3duZWRfYnkpIChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2spOwogI2VuZGlmCS8qIENPTkZJR19TRUNVUklUWV9ORVRXT1JLICovCiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCkBAIC0xODQzLDcgKzE4NDIsNyBAQAogaW50IHNlY3VyaXR5X2lub2RlX2ZvbGxvd19saW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpOwogaW50IHNlY3VyaXR5X2lub2RlX3Blcm1pc3Npb24oc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1hc2spOwogaW50IHNlY3VyaXR5X2lub2RlX3NldGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKmF0dHIpOwotaW50IHNlY3VyaXR5X2lub2RlX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CitpbnQgc2VjdXJpdHlfaW5vZGVfZ2V0YXR0cihjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCk7CiBpbnQgc2VjdXJpdHlfaW5vZGVfc2V0eGF0dHIoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgIGNvbnN0IHZvaWQgKnZhbHVlLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKIHZvaWQgc2VjdXJpdHlfaW5vZGVfcG9zdF9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCkBAIC0yMjU5LDggKzIyNTgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV9pbm9kZV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LAotCQkJCQkgIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2dldGF0dHIoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgpCiB7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNzM1LDggKzI3MzMsNiBAQAogaW50IHNlY3VyaXR5X3R1bl9kZXZfYXR0YWNoKHN0cnVjdCBzb2NrICpzaywgdm9pZCAqc2VjdXJpdHkpOwogaW50IHNlY3VyaXR5X3R1bl9kZXZfb3Blbih2b2lkICpzZWN1cml0eSk7CiAKLXZvaWQgc2VjdXJpdHlfc2tiX293bmVkX2J5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzayk7Ci0KICNlbHNlCS8qIENPTkZJR19TRUNVUklUWV9ORVRXT1JLICovCiBzdGF0aWMgaW5saW5lIGludCBzZWN1cml0eV91bml4X3N0cmVhbV9jb25uZWN0KHN0cnVjdCBzb2NrICpzb2NrLAogCQkJCQkgICAgICAgc3RydWN0IHNvY2sgKm90aGVyLApAQCAtMjkyOCwxMSArMjkyNCw2IEBACiB7CiAJcmV0dXJuIDA7CiB9Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZWN1cml0eV9za2Jfb3duZWRfYnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrKQotewotfQotCiAjZW5kaWYJLyogQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgKi8KIAogI2lmZGVmIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2VxbG9jay5oIGIvaW5jbHVkZS9saW51eC9zZXFsb2NrLmgKaW5kZXggZjVkZjhmNi4uNWY2OGQwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZXFsb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9zZXFsb2NrLmgKQEAgLTEwOCw3ICsxMDgsNyBAQAogCXVuc2lnbmVkIHJldDsKIAogcmVwZWF0OgotCXJldCA9IEFDQ0VTU19PTkNFKHMtPnNlcXVlbmNlKTsKKwlyZXQgPSBSRUFEX09OQ0Uocy0+c2VxdWVuY2UpOwogCWlmICh1bmxpa2VseShyZXQgJiAxKSkgewogCQljcHVfcmVsYXgoKTsKIAkJZ290byByZXBlYXQ7CkBAIC0xMjcsNyArMTI3LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCByYXdfcmVhZF9zZXFjb3VudChjb25zdCBzZXFjb3VudF90ICpzKQogewotCXVuc2lnbmVkIHJldCA9IEFDQ0VTU19PTkNFKHMtPnNlcXVlbmNlKTsKKwl1bnNpZ25lZCByZXQgPSBSRUFEX09OQ0Uocy0+c2VxdWVuY2UpOwogCXNtcF9ybWIoKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTc5LDcgKzE3OSw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgcmF3X3NlcWNvdW50X2JlZ2luKGNvbnN0IHNlcWNvdW50X3QgKnMpCiB7Ci0JdW5zaWduZWQgcmV0ID0gQUNDRVNTX09OQ0Uocy0+c2VxdWVuY2UpOworCXVuc2lnbmVkIHJldCA9IFJFQURfT05DRShzLT5zZXF1ZW5jZSk7CiAJc21wX3JtYigpOwogCXJldHVybiByZXQgJiB+MTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2tidWZmLmggYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCmluZGV4IDMwMDA3YWYuLjA5OTEyNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2tidWZmLmgKKysrIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaApAQCAtMTY2LDEwICsxNjYsMTYgQEAKICNpZiBJU19FTkFCTEVEKENPTkZJR19CUklER0VfTkVURklMVEVSKQogc3RydWN0IG5mX2JyaWRnZV9pbmZvIHsKIAlhdG9taWNfdAkJdXNlOworCWVudW0geworCQlCUk5GX1BST1RPX1VOQ0hBTkdFRCwKKwkJQlJORl9QUk9UT184MDIxUSwKKwkJQlJORl9QUk9UT19QUFBPRQorCX0gb3JpZ19wcm90bzsKKwlib29sCQkJcGt0X290aGVyaG9zdDsKIAl1bnNpZ25lZCBpbnQJCW1hc2s7CiAJc3RydWN0IG5ldF9kZXZpY2UJKnBoeXNpbmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqcGh5c291dGRldjsKLQl1bnNpZ25lZCBsb25nCQlkYXRhWzMyIC8gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpXTsKKwljaGFyCQkJbmVpZ2hfaGVhZGVyWzhdOwogfTsKICNlbmRpZgogCkBAIC00OTIsNyArNDk4LDYgQEAKICAgKglAbmFwaV9pZDogaWQgb2YgdGhlIE5BUEkgc3RydWN0IHRoaXMgc2tiIGNhbWUgZnJvbQogICoJQHNlY21hcms6IHNlY3VyaXR5IG1hcmtpbmcKICAqCUBtYXJrOiBHZW5lcmljIHBhY2tldCBtYXJrCi0gKglAZHJvcGNvdW50OiB0b3RhbCBudW1iZXIgb2Ygc2tfcmVjZWl2ZV9xdWV1ZSBvdmVyZmxvd3MKICAqCUB2bGFuX3Byb3RvOiB2bGFuIGVuY2Fwc3VsYXRpb24gcHJvdG9jb2wKICAqCUB2bGFuX3RjaTogdmxhbiB0YWcgY29udHJvbCBpbmZvcm1hdGlvbgogICoJQGlubmVyX3Byb3RvY29sOiBQcm90b2NvbCAoZW5jYXBzdWxhdGlvbikKQEAgLTY0MSw3ICs2NDYsNiBAQAogI2VuZGlmCiAJdW5pb24gewogCQlfX3UzMgkJbWFyazsKLQkJX191MzIJCWRyb3Bjb3VudDsKIAkJX191MzIJCXJlc2VydmVkX3RhaWxyb29tOwogCX07CiAKQEAgLTg3MCw4ICs4NzQsNyBAQAogdm9pZCBza2JfYWJvcnRfc2VxX3JlYWQoc3RydWN0IHNrYl9zZXFfc3RhdGUgKnN0KTsKIAogdW5zaWduZWQgaW50IHNrYl9maW5kX3RleHQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGZyb20sCi0JCQkgICB1bnNpZ25lZCBpbnQgdG8sIHN0cnVjdCB0c19jb25maWcgKmNvbmZpZywKLQkJCSAgIHN0cnVjdCB0c19zdGF0ZSAqc3RhdGUpOworCQkJICAgdW5zaWduZWQgaW50IHRvLCBzdHJ1Y3QgdHNfY29uZmlnICpjb25maWcpOwogCiAvKgogICogUGFja2V0IGhhc2ggdHlwZXMgc3BlY2lmeSB0aGUgdHlwZSBvZiBoYXNoIGluIHNrYl9zZXRfaGFzaC4KQEAgLTk0OCw2ICs5NTEsMTMgQEAKIAl0by0+bDRfaGFzaCA9IGZyb20tPmw0X2hhc2g7CiB9OwogCitzdGF0aWMgaW5saW5lIHZvaWQgc2tiX3NlbmRlcl9jcHVfY2xlYXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKyNpZmRlZiBDT05GSUdfWFBTCisJc2tiLT5zZW5kZXJfY3B1ID0gMDsKKyNlbmRpZgorfQorCiAjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgKnNrYl9lbmRfcG9pbnRlcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiLmggYi9pbmNsdWRlL2xpbnV4L3NsYWIuaAppbmRleCA3NmYxZmVlLi5mZmQyNGM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsYWIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAvKgogICogRmxhZ3MgdG8gcGFzcyB0byBrbWVtX2NhY2hlX2NyZWF0ZSgpLgotICogVGhlIG9uZXMgbWFya2VkIERFQlVHIGFyZSBvbmx5IHZhbGlkIGlmIENPTkZJR19TTEFCX0RFQlVHIGlzIHNldC4KKyAqIFRoZSBvbmVzIG1hcmtlZCBERUJVRyBhcmUgb25seSB2YWxpZCBpZiBDT05GSUdfREVCVUdfU0xBQiBpcyBzZXQuCiAgKi8KICNkZWZpbmUgU0xBQl9ERUJVR19GUkVFCQkweDAwMDAwMTAwVUwJLyogREVCVUc6IFBlcmZvcm0gKGV4cGVuc2l2ZSkgY2hlY2tzIG9uIGZyZWUgKi8KICNkZWZpbmUgU0xBQl9SRURfWk9ORQkJMHgwMDAwMDQwMFVMCS8qIERFQlVHOiBSZWQgem9uZSBvYmpzIGluIGEgY2FjaGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc21wYm9vdC5oIGIvaW5jbHVkZS9saW51eC9zbXBib290LmgKaW5kZXggMTNlOTI5Ni4uZDYwMGFmYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zbXBib290LmgKKysrIGIvaW5jbHVkZS9saW51eC9zbXBib290LmgKQEAgLTQ3LDYgKzQ3LDUgQEAKIAogaW50IHNtcGJvb3RfcmVnaXN0ZXJfcGVyY3B1X3RocmVhZChzdHJ1Y3Qgc21wX2hvdHBsdWdfdGhyZWFkICpwbHVnX3RocmVhZCk7CiB2b2lkIHNtcGJvb3RfdW5yZWdpc3Rlcl9wZXJjcHVfdGhyZWFkKHN0cnVjdCBzbXBfaG90cGx1Z190aHJlYWQgKnBsdWdfdGhyZWFkKTsKLWludCBzbXBib290X3RocmVhZF9zY2hlZHVsZSh2b2lkKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tfZGlhZy5oIGIvaW5jbHVkZS9saW51eC9zb2NrX2RpYWcuaAppbmRleCA0NmNjYTRjLi4wODNhYzM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tfZGlhZy5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ja19kaWFnLmgKQEAgLTE5LDggKzE5LDggQEAKIHZvaWQgc29ja19kaWFnX3JlZ2lzdGVyX2luZXRfY29tcGF0KGludCAoKmZuKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkpOwogdm9pZCBzb2NrX2RpYWdfdW5yZWdpc3Rlcl9pbmV0X2NvbXBhdChpbnQgKCpmbikoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpKTsKIAotaW50IHNvY2tfZGlhZ19jaGVja19jb29raWUodm9pZCAqc2ssIF9fdTMyICpjb29raWUpOwotdm9pZCBzb2NrX2RpYWdfc2F2ZV9jb29raWUodm9pZCAqc2ssIF9fdTMyICpjb29raWUpOworaW50IHNvY2tfZGlhZ19jaGVja19jb29raWUoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBfX3UzMiAqY29va2llKTsKK3ZvaWQgc29ja19kaWFnX3NhdmVfY29va2llKHN0cnVjdCBzb2NrICpzaywgX191MzIgKmNvb2tpZSk7CiAKIGludCBzb2NrX2RpYWdfcHV0X21lbWluZm8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgYXR0cik7CiBpbnQgc29ja19kaWFnX3B1dF9maWx0ZXJpbmZvKGJvb2wgbWF5X3JlcG9ydF9maWx0ZXJpbmZvLCBzdHJ1Y3Qgc29jayAqc2ssCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oIGIvaW5jbHVkZS9saW51eC9zb2NrZXQuaAppbmRleCA1YzE5Y2JhLi41YmY1OWM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NvY2tldC5oCisrKyBiL2luY2x1ZGUvbGludXgvc29ja2V0LmgKQEAgLTUxLDYgKzUxLDcgQEAKIAl2b2lkCQkqbXNnX2NvbnRyb2w7CS8qIGFuY2lsbGFyeSBkYXRhICovCiAJX19rZXJuZWxfc2l6ZV90CW1zZ19jb250cm9sbGVuOwkvKiBhbmNpbGxhcnkgZGF0YSBidWZmZXIgbGVuZ3RoICovCiAJdW5zaWduZWQgaW50CW1zZ19mbGFnczsJLyogZmxhZ3Mgb24gcmVjZWl2ZWQgbWVzc2FnZSAqLworCXN0cnVjdCBraW9jYgkqbXNnX2lvY2I7CS8qIHB0ciB0byBpb2NiIGZvciBhc3luYyByZXF1ZXN0cyAqLwogfTsKICAKIHN0cnVjdCB1c2VyX21zZ2hkciB7CkBAIC0xMzgsNiArMTM5LDExIEBACiAJcmV0dXJuIF9fY21zZ19ueHRoZHIoX19tc2ctPm1zZ19jb250cm9sLCBfX21zZy0+bXNnX2NvbnRyb2xsZW4sIF9fY21zZyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IG1zZ19kYXRhX2xlZnQoc3RydWN0IG1zZ2hkciAqbXNnKQoreworCXJldHVybiBpb3ZfaXRlcl9jb3VudCgmbXNnLT5tc2dfaXRlcik7Cit9CisKIC8qICJTb2NrZXQiLWxldmVsIGNvbnRyb2wgbWVzc2FnZSB0eXBlczogKi8KIAogI2RlZmluZQlTQ01fUklHSFRTCTB4MDEJCS8qIHJ3OiBhY2Nlc3MgcmlnaHRzIChhcnJheSBvZiBpbnQpICovCkBAIC0xODEsNiArMTg3LDcgQEAKICNkZWZpbmUgQUZfV0FOUElQRQkyNQkvKiBXYW5waXBlIEFQSSBTb2NrZXRzICovCiAjZGVmaW5lIEFGX0xMQwkJMjYJLyogTGludXggTExDCQkJKi8KICNkZWZpbmUgQUZfSUIJCTI3CS8qIE5hdGl2ZSBJbmZpbmlCYW5kIGFkZHJlc3MJKi8KKyNkZWZpbmUgQUZfTVBMUwkJMjgJLyogTVBMUyAqLwogI2RlZmluZSBBRl9DQU4JCTI5CS8qIENvbnRyb2xsZXIgQXJlYSBOZXR3b3JrICAgICAgKi8KICNkZWZpbmUgQUZfVElQQwkJMzAJLyogVElQQyBzb2NrZXRzCQkJKi8KICNkZWZpbmUgQUZfQkxVRVRPT1RICTMxCS8qIEJsdWV0b290aCBzb2NrZXRzIAkJKi8KQEAgLTIyNiw2ICsyMzMsNyBAQAogI2RlZmluZSBQRl9XQU5QSVBFCUFGX1dBTlBJUEUKICNkZWZpbmUgUEZfTExDCQlBRl9MTEMKICNkZWZpbmUgUEZfSUIJCUFGX0lCCisjZGVmaW5lIFBGX01QTFMJCUFGX01QTFMKICNkZWZpbmUgUEZfQ0FOCQlBRl9DQU4KICNkZWZpbmUgUEZfVElQQwkJQUZfVElQQwogI2RlZmluZSBQRl9CTFVFVE9PVEgJQUZfQkxVRVRPT1RICmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NwaS9hdDg2cmYyMzAuaCBiL2luY2x1ZGUvbGludXgvc3BpL2F0ODZyZjIzMC5oCmluZGV4IGNkNTE5YTEuLmI2M2ZlNmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3BpL2F0ODZyZjIzMC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3BpL2F0ODZyZjIzMC5oCkBAIC0yMiw2ICsyMiw3IEBACiAJaW50IHJzdG47CiAJaW50IHNscF90cjsKIAlpbnQgZGlnMjsKKwl1OCB4dGFsX3RyaW07CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpL2NjMjUyMC5oIGIvaW5jbHVkZS9saW51eC9zcGkvY2MyNTIwLmgKaW5kZXggODViOGVlNi4uZTc0MWU4YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcGkvY2MyNTIwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGkvY2MyNTIwLmgKQEAgLTIxLDYgKzIxLDcgQEAKIAlpbnQgc2ZkOwogCWludCByZXNldDsKIAlpbnQgdnJlZzsKKwlib29sIGFtcGxpZmllZDsKIH07CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zcGkvc3BpLmggYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAppbmRleCA4NTZkMzRkLi5kNjczMDcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NwaS9zcGkuaApAQCAtMTYyLDggKzE2Miw2IEBACiAgKiBAcmVtb3ZlOiBVbmJpbmRzIHRoaXMgZHJpdmVyIGZyb20gdGhlIHNwaSBkZXZpY2UKICAqIEBzaHV0ZG93bjogU3RhbmRhcmQgc2h1dGRvd24gY2FsbGJhY2sgdXNlZCBkdXJpbmcgc3lzdGVtIHN0YXRlCiAgKgl0cmFuc2l0aW9ucyBzdWNoIGFzIHBvd2VyZG93bi9oYWx0IGFuZCBrZXhlYwotICogQHN1c3BlbmQ6IFN0YW5kYXJkIHN1c3BlbmQgY2FsbGJhY2sgdXNlZCBkdXJpbmcgc3lzdGVtIHN0YXRlIHRyYW5zaXRpb25zCi0gKiBAcmVzdW1lOiBTdGFuZGFyZCByZXN1bWUgY2FsbGJhY2sgdXNlZCBkdXJpbmcgc3lzdGVtIHN0YXRlIHRyYW5zaXRpb25zCiAgKiBAZHJpdmVyOiBTUEkgZGV2aWNlIGRyaXZlcnMgc2hvdWxkIGluaXRpYWxpemUgdGhlIG5hbWUgYW5kIG93bmVyCiAgKglmaWVsZCBvZiB0aGlzIHN0cnVjdHVyZS4KICAqCkBAIC0xODQsOCArMTgyLDYgQEAKIAlpbnQJCQkoKnByb2JlKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKIAlpbnQJCQkoKnJlbW92ZSkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSk7CiAJdm9pZAkJCSgqc2h1dGRvd24pKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpOwotCWludAkJCSgqc3VzcGVuZCkoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgcG1fbWVzc2FnZV90IG1lc2cpOwotCWludAkJCSgqcmVzdW1lKShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKTsKIAlzdHJ1Y3QgZGV2aWNlX2RyaXZlcglkcml2ZXI7CiB9OwogCkBAIC0yOTQsNiArMjkwLDggQEAKICAqICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcl9vbmVfbWVzc2FnZSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlOyB3aGVuIGJvdGgKICAqICAgICAgICAgICAgICAgICAgICBhcmUgc2V0LCB0aGUgZ2VuZXJpYyBzdWJzeXN0ZW0gZG9lcyBub3QgY2FsbCB5b3VyCiAgKiAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJfb25lIGNhbGxiYWNrLgorICogQGhhbmRsZV9lcnI6IHRoZSBzdWJzeXN0ZW0gY2FsbHMgdGhlIGRyaXZlciB0byBoYW5kbGUgYW4gZXJyb3IgdGhhdCBvY2N1cnMKKyAqCQlpbiB0aGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiB0cmFuc2Zlcl9vbmVfbWVzc2FnZSgpLgogICogQHVucHJlcGFyZV9tZXNzYWdlOiB1bmRvIGFueSB3b3JrIGRvbmUgYnkgcHJlcGFyZV9tZXNzYWdlKCkuCiAgKiBAY3NfZ3Bpb3M6IEFycmF5IG9mIEdQSU9zIHRvIHVzZSBhcyBjaGlwIHNlbGVjdCBsaW5lczsgb25lIHBlciBDUwogICoJbnVtYmVyLiBBbnkgaW5kaXZpZHVhbCB2YWx1ZSBtYXkgYmUgLUVOT0VOVCBmb3IgQ1MgbGluZXMgdGhhdApAQCAtNDQ4LDYgKzQ0Niw4IEBACiAJdm9pZCAoKnNldF9jcykoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgYm9vbCBlbmFibGUpOwogCWludCAoKnRyYW5zZmVyX29uZSkoc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3Rlciwgc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwKIAkJCSAgICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0cmFuc2Zlcik7CisJdm9pZCAoKmhhbmRsZV9lcnIpKHN0cnVjdCBzcGlfbWFzdGVyICptYXN0ZXIsCisJCQkgICBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm1lc3NhZ2UpOwogCiAJLyogZ3BpbyBjaGlwIHNlbGVjdCAqLwogCWludAkJCSpjc19ncGlvczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3JjdS5oIGIvaW5jbHVkZS9saW51eC9zcmN1LmgKaW5kZXggOWNmZDk2Mi4uYmRlYjQ1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zcmN1LmgKKysrIGIvaW5jbHVkZS9saW51eC9zcmN1LmgKQEAgLTE4Miw3ICsxODIsNyBAQAogICogbG9ja2RlcF9pc19oZWxkKCkgY2FsbHMuCiAgKi8KICNkZWZpbmUgc3JjdV9kZXJlZmVyZW5jZV9jaGVjayhwLCBzcCwgYykgXAotCV9fcmN1X2RlcmVmZXJlbmNlX2NoZWNrKChwKSwgc3JjdV9yZWFkX2xvY2tfaGVsZChzcCkgfHwgKGMpLCBfX3JjdSkKKwlfX3JjdV9kZXJlZmVyZW5jZV9jaGVjaygocCksIChjKSB8fCBzcmN1X3JlYWRfbG9ja19oZWxkKHNwKSwgX19yY3UpCiAKIC8qKgogICogc3JjdV9kZXJlZmVyZW5jZSAtIGZldGNoIFNSQ1UtcHJvdGVjdGVkIHBvaW50ZXIgZm9yIGxhdGVyIGRlcmVmZXJlbmNpbmcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3RhY2t0cmFjZS5oIGIvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKaW5kZXggNjY5MDQ1YS4uMGEzNDQ4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdGFja3RyYWNlLmgKQEAgLTcsOCArNyw2IEBACiBzdHJ1Y3QgcHRfcmVnczsKIAogI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCi1zdHJ1Y3QgdGFza19zdHJ1Y3Q7Ci0KIHN0cnVjdCBzdGFja190cmFjZSB7CiAJdW5zaWduZWQgaW50IG5yX2VudHJpZXMsIG1heF9lbnRyaWVzOwogCXVuc2lnbmVkIGxvbmcgKmVudHJpZXM7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oIGIvaW5jbHVkZS9saW51eC9zdGRkZWYuaAppbmRleCBmNGFlYzBlLi4wNzZhZjQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N0ZGRlZi5oCisrKyBiL2luY2x1ZGUvbGludXgvc3RkZGVmLmgKQEAgLTE5LDMgKzE5LDEyIEBACiAjZGVmaW5lIG9mZnNldG9mKFRZUEUsIE1FTUJFUikgKChzaXplX3QpICYoKFRZUEUgKikwKS0+TUVNQkVSKQogI2VuZGlmCiAjZW5kaWYKKworLyoqCisgKiBvZmZzZXRvZmVuZChUWVBFLCBNRU1CRVIpCisgKgorICogQFRZUEU6IFRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqIEBNRU1CRVI6IFRoZSBtZW1iZXIgd2l0aGluIHRoZSBzdHJ1Y3R1cmUgdG8gZ2V0IHRoZSBlbmQgb2Zmc2V0IG9mCisgKi8KKyNkZWZpbmUgb2Zmc2V0b2ZlbmQoVFlQRSwgTUVNQkVSKSBcCisJKG9mZnNldG9mKFRZUEUsIE1FTUJFUikJKyBzaXplb2YoKChUWVBFICopMCktPk1FTUJFUikpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N0cmluZ19oZWxwZXJzLmggYi9pbmNsdWRlL2xpbnV4L3N0cmluZ19oZWxwZXJzLmgKaW5kZXggNjU3NTcxOC4uMDk5MTkxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zdHJpbmdfaGVscGVycy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3RyaW5nX2hlbHBlcnMuaApAQCAtNDcsMjIgKzQ3LDIyIEBACiAjZGVmaW5lIEVTQ0FQRV9BTllfTlAJCShFU0NBUEVfQU5ZIHwgRVNDQVBFX05QKQogI2RlZmluZSBFU0NBUEVfSEVYCQkweDIwCiAKLWludCBzdHJpbmdfZXNjYXBlX21lbShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBpc3osIGNoYXIgKipkc3QsIHNpemVfdCBvc3osCitpbnQgc3RyaW5nX2VzY2FwZV9tZW0oY29uc3QgY2hhciAqc3JjLCBzaXplX3QgaXN6LCBjaGFyICpkc3QsIHNpemVfdCBvc3osCiAJCXVuc2lnbmVkIGludCBmbGFncywgY29uc3QgY2hhciAqZXNjKTsKIAogc3RhdGljIGlubGluZSBpbnQgc3RyaW5nX2VzY2FwZV9tZW1fYW55X25wKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGlzeiwKLQkJY2hhciAqKmRzdCwgc2l6ZV90IG9zeiwgY29uc3QgY2hhciAqZXNjKQorCQljaGFyICpkc3QsIHNpemVfdCBvc3osIGNvbnN0IGNoYXIgKmVzYykKIHsKIAlyZXR1cm4gc3RyaW5nX2VzY2FwZV9tZW0oc3JjLCBpc3osIGRzdCwgb3N6LCBFU0NBUEVfQU5ZX05QLCBlc2MpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzdHJpbmdfZXNjYXBlX3N0cihjb25zdCBjaGFyICpzcmMsIGNoYXIgKipkc3QsIHNpemVfdCBzeiwKK3N0YXRpYyBpbmxpbmUgaW50IHN0cmluZ19lc2NhcGVfc3RyKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqZHN0LCBzaXplX3Qgc3osCiAJCXVuc2lnbmVkIGludCBmbGFncywgY29uc3QgY2hhciAqZXNjKQogewogCXJldHVybiBzdHJpbmdfZXNjYXBlX21lbShzcmMsIHN0cmxlbihzcmMpLCBkc3QsIHN6LCBmbGFncywgZXNjKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc3RyaW5nX2VzY2FwZV9zdHJfYW55X25wKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqKmRzdCwKK3N0YXRpYyBpbmxpbmUgaW50IHN0cmluZ19lc2NhcGVfc3RyX2FueV9ucChjb25zdCBjaGFyICpzcmMsIGNoYXIgKmRzdCwKIAkJc2l6ZV90IHN6LCBjb25zdCBjaGFyICplc2MpCiB7CiAJcmV0dXJuIHN0cmluZ19lc2NhcGVfc3RyKHNyYywgZHN0LCBzeiwgRVNDQVBFX0FOWV9OUCwgZXNjKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2RlYnVnLmggYi9pbmNsdWRlL2xpbnV4L3N1bnJwYy9kZWJ1Zy5oCmluZGV4IGM1N2Q4ZWEuLjU5YTc4ODkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL2RlYnVnLmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvZGVidWcuaApAQCAtNjAsMTcgKzYwLDE3IEBACiAjaWYgSVNfRU5BQkxFRChDT05GSUdfU1VOUlBDX0RFQlVHKQogdm9pZAkJcnBjX3JlZ2lzdGVyX3N5c2N0bCh2b2lkKTsKIHZvaWQJCXJwY191bnJlZ2lzdGVyX3N5c2N0bCh2b2lkKTsKLWludAkJc3VucnBjX2RlYnVnZnNfaW5pdCh2b2lkKTsKK3ZvaWQJCXN1bnJwY19kZWJ1Z2ZzX2luaXQodm9pZCk7CiB2b2lkCQlzdW5ycGNfZGVidWdmc19leGl0KHZvaWQpOwotaW50CQlycGNfY2xudF9kZWJ1Z2ZzX3JlZ2lzdGVyKHN0cnVjdCBycGNfY2xudCAqKTsKK3ZvaWQJCXJwY19jbG50X2RlYnVnZnNfcmVnaXN0ZXIoc3RydWN0IHJwY19jbG50ICopOwogdm9pZAkJcnBjX2NsbnRfZGVidWdmc191bnJlZ2lzdGVyKHN0cnVjdCBycGNfY2xudCAqKTsKLWludAkJcnBjX3hwcnRfZGVidWdmc19yZWdpc3RlcihzdHJ1Y3QgcnBjX3hwcnQgKik7Cit2b2lkCQlycGNfeHBydF9kZWJ1Z2ZzX3JlZ2lzdGVyKHN0cnVjdCBycGNfeHBydCAqKTsKIHZvaWQJCXJwY194cHJ0X2RlYnVnZnNfdW5yZWdpc3RlcihzdHJ1Y3QgcnBjX3hwcnQgKik7CiAjZWxzZQotc3RhdGljIGlubGluZSBpbnQKK3N0YXRpYyBpbmxpbmUgdm9pZAogc3VucnBjX2RlYnVnZnNfaW5pdCh2b2lkKQogewotCXJldHVybiAwOworCXJldHVybjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC03OSwxMCArNzksMTAgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIHZvaWQKIHJwY19jbG50X2RlYnVnZnNfcmVnaXN0ZXIoc3RydWN0IHJwY19jbG50ICpjbG50KQogewotCXJldHVybiAwOworCXJldHVybjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCkBAIC05MSwxMCArOTEsMTAgQEAKIAlyZXR1cm47CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50CitzdGF0aWMgaW5saW5lIHZvaWQKIHJwY194cHJ0X2RlYnVnZnNfcmVnaXN0ZXIoc3RydWN0IHJwY194cHJ0ICp4cHJ0KQogewotCXJldHVybiAwOworCXJldHVybjsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3YXAuaCBiL2luY2x1ZGUvbGludXgvc3dhcC5oCmluZGV4IDcwNjdlY2EuLmNlZTEwOGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dhcC5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dhcC5oCkBAIC0zMDcsNyArMzA3LDcgQEAKIGV4dGVybiB2b2lkIGxydV9hZGRfZHJhaW5fY3B1KGludCBjcHUpOwogZXh0ZXJuIHZvaWQgbHJ1X2FkZF9kcmFpbl9hbGwodm9pZCk7CiBleHRlcm4gdm9pZCByb3RhdGVfcmVjbGFpbWFibGVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSk7Ci1leHRlcm4gdm9pZCBkZWFjdGl2YXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOworZXh0ZXJuIHZvaWQgZGVhY3RpdmF0ZV9maWxlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogZXh0ZXJuIHZvaWQgc3dhcF9zZXR1cCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgYWRkX3BhZ2VfdG9fdW5ldmljdGFibGVfbGlzdChzdHJ1Y3QgcGFnZSAqcGFnZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N5c2ZzLmggYi9pbmNsdWRlL2xpbnV4L3N5c2ZzLmgKaW5kZXggZGRhZDE2MS4uOTkzODJjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zeXNmcy5oCisrKyBiL2luY2x1ZGUvbGludXgvc3lzZnMuaApAQCAtNTcsNiArNTcsMjEgQEAKICNkZWZpbmUgc3lzZnNfYXR0cl9pbml0KGF0dHIpIGRvIHt9IHdoaWxlICgwKQogI2VuZGlmCiAKKy8qKgorICogc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAtIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVjbGFyZSBhbiBhdHRyaWJ1dGUgZ3JvdXAuCisgKiBAbmFtZToJT3B0aW9uYWw6IEF0dHJpYnV0ZSBncm91cCBuYW1lCisgKgkJSWYgc3BlY2lmaWVkLCB0aGUgYXR0cmlidXRlIGdyb3VwIHdpbGwgYmUgY3JlYXRlZCBpbgorICoJCWEgbmV3IHN1YmRpcmVjdG9yeSB3aXRoIHRoaXMgbmFtZS4KKyAqIEBpc192aXNpYmxlOglPcHRpb25hbDogRnVuY3Rpb24gdG8gcmV0dXJuIHBlcm1pc3Npb25zIGFzc29jaWF0ZWQgd2l0aCBhbgorICoJCWF0dHJpYnV0ZSBvZiB0aGUgZ3JvdXAuIFdpbGwgYmUgY2FsbGVkIHJlcGVhdGVkbHkgZm9yIGVhY2gKKyAqCQlhdHRyaWJ1dGUgaW4gdGhlIGdyb3VwLiBPbmx5IHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgYXMgd2VsbCBhcworICoJCVNZU0ZTX1BSRUFMTE9DIGFyZSBhY2NlcHRlZC4gTXVzdCByZXR1cm4gMCBpZiBhbiBhdHRyaWJ1dGUgaXMKKyAqCQlub3QgdmlzaWJsZS4gVGhlIHJldHVybmVkIHZhbHVlIHdpbGwgcmVwbGFjZSBzdGF0aWMgcGVybWlzc2lvbnMKKyAqCQlkZWZpbmVkIGluIHN0cnVjdCBhdHRyaWJ1dGUgb3Igc3RydWN0IGJpbl9hdHRyaWJ1dGUuCisgKiBAYXR0cnM6CVBvaW50ZXIgdG8gTlVMTCB0ZXJtaW5hdGVkIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAqIEBiaW5fYXR0cnM6CVBvaW50ZXIgdG8gTlVMTCB0ZXJtaW5hdGVkIGxpc3Qgb2YgYmluYXJ5IGF0dHJpYnV0ZXMuCisgKgkJRWl0aGVyIGF0dHJzIG9yIGJpbl9hdHRycyBvciBib3RoIG11c3QgYmUgcHJvdmlkZWQuCisgKi8KIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgewogCWNvbnN0IGNoYXIJCSpuYW1lOwogCXVtb2RlX3QJCQkoKmlzX3Zpc2libGUpKHN0cnVjdCBrb2JqZWN0ICosCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RjcC5oIGIvaW5jbHVkZS9saW51eC90Y3AuaAppbmRleCAxYTdhZGI0Li4wY2FhM2EyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGNwLmgKQEAgLTU4LDYgKzU4LDcgQEAKIHN0cnVjdCB0Y3BfZmFzdG9wZW5fY29va2llIHsKIAlzOAlsZW47CiAJdTgJdmFsW1RDUF9GQVNUT1BFTl9DT09LSUVfTUFYXTsKKwlib29sCWV4cDsJLyogSW4gUkZDNjk5NCBleHBlcmltZW50YWwgb3B0aW9uIGZvcm1hdCAqLwogfTsKIAogLyogVGhpcyBkZWZpbmVzIGEgc2VsZWN0aXZlIGFja25vd2xlZGdlbWVudCBibG9jay4gKi8KQEAgLTExMSw3ICsxMTIsNyBAQAogc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2sgewogCXN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAJcmVxOwogCWNvbnN0IHN0cnVjdCB0Y3BfcmVxdWVzdF9zb2NrX29wcyAqYWZfc3BlY2lmaWM7Ci0Jc3RydWN0IHNvY2sJCQkqbGlzdGVuZXI7IC8qIG5lZWRlZCBmb3IgVEZPICovCisJYm9vbAkJCQl0Zm9fbGlzdGVuZXI7CiAJdTMyCQkJCXJjdl9pc247CiAJdTMyCQkJCXNudF9pc247CiAJdTMyCQkJCXNudF9zeW5hY2s7IC8qIHN5bmFjayBzZW50IHRpbWUgKi8KQEAgLTE4OCw2ICsxODksNyBAQAogCXU4CWRvX2Vhcmx5X3JldHJhbnM6MSwvKiBFbmFibGUgUkZDNTgyNyBlYXJseS1yZXRyYW5zbWl0ICAqLwogCQlzeW5fZGF0YToxLAkvKiBTWU4gaW5jbHVkZXMgZGF0YSAqLwogCQlzeW5fZmFzdG9wZW46MSwJLyogU1lOIGluY2x1ZGVzIEZhc3QgT3BlbiBvcHRpb24gKi8KKwkJc3luX2Zhc3RvcGVuX2V4cDoxLC8qIFNZTiBpbmNsdWRlcyBGYXN0IE9wZW4gZXhwLiBvcHRpb24gKi8KIAkJc3luX2RhdGFfYWNrZWQ6MSwvKiBkYXRhIGluIFNZTiBpcyBhY2tlZCBieSBTWU4tQUNLICovCiAJCWlzX2N3bmRfbGltaXRlZDoxOy8qIGZvcndhcmQgcHJvZ3Jlc3MgbGltaXRlZCBieSBzbmRfY3duZD8gKi8KIAl1MzIJdGxwX2hpZ2hfc2VxOwkvKiBzbmRfbnh0IGF0IHRoZSB0aW1lIG9mIFRMUCByZXRyYW5zbWl0LiAqLwpAQCAtMjM2LDcgKzIzOCw2IEBACiAJdTMyCWxvc3Rfb3V0OwkvKiBMb3N0IHBhY2tldHMJCQkqLwogCXUzMglzYWNrZWRfb3V0OwkvKiBTQUNLJ2QgcGFja2V0cwkJCSovCiAJdTMyCWZhY2tldHNfb3V0OwkvKiBGQUNLJ2QgcGFja2V0cwkJCSovCi0JdTMyCXRzb19kZWZlcnJlZDsKIAogCS8qIGZyb20gU1RDUCwgcmV0cmFucyBxdWV1ZSBoaW50aW5nICovCiAJc3RydWN0IHNrX2J1ZmYqIGxvc3Rfc2tiX2hpbnQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpY2suaCBiL2luY2x1ZGUvbGludXgvdGljay5oCmluZGV4IDljMDg1ZGMuLmY4NDkyZGE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3RpY2suaApAQCAtMSw3ICsxLDUgQEAKLS8qICBsaW51eC9pbmNsdWRlL2xpbnV4L3RpY2suaAotICoKLSAqICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBmb3IgdGljayByZWxhdGVkIGZ1bmN0aW9ucwotICoKKy8qCisgKiBUaWNrIHJlbGF0ZWQgZ2xvYmFsIGZ1bmN0aW9ucwogICovCiAjaWZuZGVmIF9MSU5VWF9USUNLX0gKICNkZWZpbmUgX0xJTlVYX1RJQ0tfSApAQCAtOSwxNDkgKzcsOTkgQEAKICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAjaW5jbHVkZSA8bGludXgvY29udGV4dF90cmFja2luZ19zdGF0ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMKLQotZW51bSB0aWNrX2RldmljZV9tb2RlIHsKLQlUSUNLREVWX01PREVfUEVSSU9ESUMsCi0JVElDS0RFVl9NT0RFX09ORVNIT1QsCi19OwotCi1zdHJ1Y3QgdGlja19kZXZpY2UgewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dGRldjsKLQllbnVtIHRpY2tfZGV2aWNlX21vZGUgbW9kZTsKLX07Ci0KLWVudW0gdGlja19ub2h6X21vZGUgewotCU5PSFpfTU9ERV9JTkFDVElWRSwKLQlOT0haX01PREVfTE9XUkVTLAotCU5PSFpfTU9ERV9ISUdIUkVTLAotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgdGlja19zY2hlZCAtIHNjaGVkIHRpY2sgZW11bGF0aW9uIGFuZCBubyBpZGxlIHRpY2sgY29udHJvbC9zdGF0cwotICogQHNjaGVkX3RpbWVyOglocnRpbWVyIHRvIHNjaGVkdWxlIHRoZSBwZXJpb2RpYyB0aWNrIGluIGhpZ2gKLSAqCQkJcmVzb2x1dGlvbiBtb2RlCi0gKiBAbGFzdF90aWNrOgkJU3RvcmUgdGhlIGxhc3QgdGljayBleHBpcnkgdGltZSB3aGVuIHRoZSB0aWNrCi0gKgkJCXRpbWVyIGlzIG1vZGlmaWVkIGZvciBub2h6IHNsZWVwcy4gVGhpcyBpcyBuZWNlc3NhcnkKLSAqCQkJdG8gcmVzdW1lIHRoZSB0aWNrIHRpbWVyIG9wZXJhdGlvbiBpbiB0aGUgdGltZWxpbmUKLSAqCQkJd2hlbiB0aGUgQ1BVIHJldHVybnMgZnJvbSBub2h6IHNsZWVwLgotICogQHRpY2tfc3RvcHBlZDoJSW5kaWNhdG9yIHRoYXQgdGhlIGlkbGUgdGljayBoYXMgYmVlbiBzdG9wcGVkCi0gKiBAaWRsZV9qaWZmaWVzOglqaWZmaWVzIGF0IHRoZSBlbnRyeSB0byBpZGxlIGZvciBpZGxlIHRpbWUgYWNjb3VudGluZwotICogQGlkbGVfY2FsbHM6CQlUb3RhbCBudW1iZXIgb2YgaWRsZSBjYWxscwotICogQGlkbGVfc2xlZXBzOglOdW1iZXIgb2YgaWRsZSBjYWxscywgd2hlcmUgdGhlIHNjaGVkIHRpY2sgd2FzIHN0b3BwZWQKLSAqIEBpZGxlX2VudHJ5dGltZToJVGltZSB3aGVuIHRoZSBpZGxlIGNhbGwgd2FzIGVudGVyZWQKLSAqIEBpZGxlX3dha2V0aW1lOglUaW1lIHdoZW4gdGhlIGlkbGUgd2FzIGludGVycnVwdGVkCi0gKiBAaWRsZV9leGl0dGltZToJVGltZSB3aGVuIHRoZSBpZGxlIHN0YXRlIHdhcyBsZWZ0Ci0gKiBAaWRsZV9zbGVlcHRpbWU6CVN1bSBvZiB0aGUgdGltZSBzbGVwdCBpbiBpZGxlIHdpdGggc2NoZWQgdGljayBzdG9wcGVkCi0gKiBAaW93YWl0X3NsZWVwdGltZToJU3VtIG9mIHRoZSB0aW1lIHNsZXB0IGluIGlkbGUgd2l0aCBzY2hlZCB0aWNrIHN0b3BwZWQsIHdpdGggSU8gb3V0c3RhbmRpbmcKLSAqIEBzbGVlcF9sZW5ndGg6CUR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGlkbGUgc2xlZXAKLSAqIEBkb190aW1lcl9sc3Q6CUNQVSB3YXMgdGhlIGxhc3Qgb25lIGRvaW5nIGRvX3RpbWVyIGJlZm9yZSBnb2luZyBpZGxlCi0gKi8KLXN0cnVjdCB0aWNrX3NjaGVkIHsKLQlzdHJ1Y3QgaHJ0aW1lcgkJCXNjaGVkX3RpbWVyOwotCXVuc2lnbmVkIGxvbmcJCQljaGVja19jbG9ja3M7Ci0JZW51bSB0aWNrX25vaHpfbW9kZQkJbm9oel9tb2RlOwotCWt0aW1lX3QJCQkJbGFzdF90aWNrOwotCWludAkJCQlpbmlkbGU7Ci0JaW50CQkJCXRpY2tfc3RvcHBlZDsKLQl1bnNpZ25lZCBsb25nCQkJaWRsZV9qaWZmaWVzOwotCXVuc2lnbmVkIGxvbmcJCQlpZGxlX2NhbGxzOwotCXVuc2lnbmVkIGxvbmcJCQlpZGxlX3NsZWVwczsKLQlpbnQJCQkJaWRsZV9hY3RpdmU7Ci0Ja3RpbWVfdAkJCQlpZGxlX2VudHJ5dGltZTsKLQlrdGltZV90CQkJCWlkbGVfd2FrZXRpbWU7Ci0Ja3RpbWVfdAkJCQlpZGxlX2V4aXR0aW1lOwotCWt0aW1lX3QJCQkJaWRsZV9zbGVlcHRpbWU7Ci0Ja3RpbWVfdAkJCQlpb3dhaXRfc2xlZXB0aW1lOwotCWt0aW1lX3QJCQkJc2xlZXBfbGVuZ3RoOwotCXVuc2lnbmVkIGxvbmcJCQlsYXN0X2ppZmZpZXM7Ci0JdW5zaWduZWQgbG9uZwkJCW5leHRfamlmZmllczsKLQlrdGltZV90CQkJCWlkbGVfZXhwaXJlczsKLQlpbnQJCQkJZG9fdGltZXJfbGFzdDsKLX07Ci0KIGV4dGVybiB2b2lkIF9faW5pdCB0aWNrX2luaXQodm9pZCk7Ci1leHRlcm4gaW50IHRpY2tfaXNfb25lc2hvdF9hdmFpbGFibGUodm9pZCk7Ci1leHRlcm4gc3RydWN0IHRpY2tfZGV2aWNlICp0aWNrX2dldF9kZXZpY2UoaW50IGNwdSk7Ci0KIGV4dGVybiB2b2lkIHRpY2tfZnJlZXplKHZvaWQpOwogZXh0ZXJuIHZvaWQgdGlja191bmZyZWV6ZSh2b2lkKTsKLQotIyBpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCi1leHRlcm4gaW50IHRpY2tfaW5pdF9oaWdocmVzKHZvaWQpOwotZXh0ZXJuIGludCB0aWNrX3Byb2dyYW1fZXZlbnQoa3RpbWVfdCBleHBpcmVzLCBpbnQgZm9yY2UpOwotZXh0ZXJuIHZvaWQgdGlja19zZXR1cF9zY2hlZF90aW1lcih2b2lkKTsKLSMgZW5kaWYKLQotIyBpZiBkZWZpbmVkIENPTkZJR19OT19IWl9DT01NT04gfHwgZGVmaW5lZCBDT05GSUdfSElHSF9SRVNfVElNRVJTCi1leHRlcm4gdm9pZCB0aWNrX2NhbmNlbF9zY2hlZF90aW1lcihpbnQgY3B1KTsKLSMgZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKGludCBjcHUpIHsgfQotIyBlbmRpZgotCi0jIGlmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAotZXh0ZXJuIHN0cnVjdCB0aWNrX2RldmljZSAqdGlja19nZXRfYnJvYWRjYXN0X2RldmljZSh2b2lkKTsKLWV4dGVybiBzdHJ1Y3QgY3B1bWFzayAqdGlja19nZXRfYnJvYWRjYXN0X21hc2sodm9pZCk7Ci0KLSMgIGlmZGVmIENPTkZJR19USUNLX09ORVNIT1QKLWV4dGVybiBzdHJ1Y3QgY3B1bWFzayAqdGlja19nZXRfYnJvYWRjYXN0X29uZXNob3RfbWFzayh2b2lkKTsKLSMgIGVuZGlmCi0KLSMgZW5kaWYgLyogQlJPQURDQVNUICovCi0KLSMgaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAotZXh0ZXJuIHZvaWQgdGlja19jbG9ja19ub3RpZnkodm9pZCk7Ci1leHRlcm4gaW50IHRpY2tfY2hlY2tfb25lc2hvdF9jaGFuZ2UoaW50IGFsbG93X25vaHopOwotZXh0ZXJuIHN0cnVjdCB0aWNrX3NjaGVkICp0aWNrX2dldF90aWNrX3NjaGVkKGludCBjcHUpOwotZXh0ZXJuIHZvaWQgdGlja19pcnFfZW50ZXIodm9pZCk7Ci1leHRlcm4gaW50IHRpY2tfb25lc2hvdF9tb2RlX2FjdGl2ZSh2b2lkKTsKLSMgIGlmbmRlZiBhcmNoX25lZWRzX2NwdQotIyAgIGRlZmluZSBhcmNoX25lZWRzX2NwdSgpICgwKQotIyAgZW5kaWYKLSMgZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfY2xvY2tfbm90aWZ5KHZvaWQpIHsgfQotc3RhdGljIGlubGluZSBpbnQgdGlja19jaGVja19vbmVzaG90X2NoYW5nZShpbnQgYWxsb3dfbm9oeikgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfaXJxX2VudGVyKHZvaWQpIHsgfQotc3RhdGljIGlubGluZSBpbnQgdGlja19vbmVzaG90X21vZGVfYWN0aXZlKHZvaWQpIHsgcmV0dXJuIDA7IH0KLSMgZW5kaWYKLQorLyogU2hvdWxkIGJlIGNvcmUgb25seSwgYnV0IEFSTSBCTCBzd2l0Y2hlciByZXF1aXJlcyBpdCAqLworZXh0ZXJuIHZvaWQgdGlja19zdXNwZW5kX2xvY2FsKHZvaWQpOworLyogU2hvdWxkIGJlIGNvcmUgb25seSwgYnV0IFhFTiByZXN1bWUgbWFnaWMgYW5kIEFSTSBCTCBzd2l0Y2hlciByZXF1aXJlIGl0ICovCitleHRlcm4gdm9pZCB0aWNrX3Jlc3VtZV9sb2NhbCh2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfaGFuZG92ZXJfZG9fdGltZXIodm9pZCk7CitleHRlcm4gdm9pZCB0aWNrX2NsZWFudXBfZGVhZF9jcHUoaW50IGNwdSk7CiAjZWxzZSAvKiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUyAqLwogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfaW5pdCh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2ZyZWV6ZSh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3VuZnJlZXplKHZvaWQpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKGludCBjcHUpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfY2xvY2tfbm90aWZ5KHZvaWQpIHsgfQotc3RhdGljIGlubGluZSBpbnQgdGlja19jaGVja19vbmVzaG90X2NoYW5nZShpbnQgYWxsb3dfbm9oeikgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfaXJxX2VudGVyKHZvaWQpIHsgfQotc3RhdGljIGlubGluZSBpbnQgdGlja19vbmVzaG90X21vZGVfYWN0aXZlKHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3N1c3BlbmRfbG9jYWwodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19yZXN1bWVfbG9jYWwodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19oYW5kb3Zlcl9kb190aW1lcih2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2NsZWFudXBfZGVhZF9jcHUoaW50IGNwdSkgeyB9CiAjZW5kaWYgLyogIUNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTICovCiAKLSMgaWZkZWYgQ09ORklHX05PX0haX0NPTU1PTgotREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCB0aWNrX3NjaGVkLCB0aWNrX2NwdV9zY2hlZCk7CisjaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAorZXh0ZXJuIHZvaWQgdGlja19pcnFfZW50ZXIodm9pZCk7CisjICBpZm5kZWYgYXJjaF9uZWVkc19jcHUKKyMgICBkZWZpbmUgYXJjaF9uZWVkc19jcHUoKSAoMCkKKyMgIGVuZGlmCisjIGVsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2lycV9lbnRlcih2b2lkKSB7IH0KKyNlbmRpZgogCi1zdGF0aWMgaW5saW5lIGludCB0aWNrX25vaHpfdGlja19zdG9wcGVkKHZvaWQpCisjaWYgZGVmaW5lZChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpICYmIGRlZmluZWQoQ09ORklHX1RJQ0tfT05FU0hPVCkKK2V4dGVybiB2b2lkIGhvdHBsdWdfY3B1X19icm9hZGNhc3RfdGlja19wdWxsKGludCBkZWFkX2NwdSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGhvdHBsdWdfY3B1X19icm9hZGNhc3RfdGlja19wdWxsKGludCBkZWFkX2NwdSkgeyB9CisjZW5kaWYKKworZW51bSB0aWNrX2Jyb2FkY2FzdF9tb2RlIHsKKwlUSUNLX0JST0FEQ0FTVF9PRkYsCisJVElDS19CUk9BRENBU1RfT04sCisJVElDS19CUk9BRENBU1RfRk9SQ0UsCit9OworCitlbnVtIHRpY2tfYnJvYWRjYXN0X3N0YXRlIHsKKwlUSUNLX0JST0FEQ0FTVF9FWElULAorCVRJQ0tfQlJPQURDQVNUX0VOVEVSLAorfTsKKworI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAorZXh0ZXJuIHZvaWQgdGlja19icm9hZGNhc3RfY29udHJvbChlbnVtIHRpY2tfYnJvYWRjYXN0X21vZGUgbW9kZSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X2NvbnRyb2woZW51bSB0aWNrX2Jyb2FkY2FzdF9tb2RlIG1vZGUpIHsgfQorI2VuZGlmIC8qIEJST0FEQ0FTVCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpICYmIGRlZmluZWQoQ09ORklHX1RJQ0tfT05FU0hPVCkKK2V4dGVybiBpbnQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKGVudW0gdGlja19icm9hZGNhc3Rfc3RhdGUgc3RhdGUpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbChlbnVtIHRpY2tfYnJvYWRjYXN0X3N0YXRlIHN0YXRlKSB7IHJldHVybiAwOyB9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X2VuYWJsZSh2b2lkKQogewotCXJldHVybiBfX3RoaXNfY3B1X3JlYWQodGlja19jcHVfc2NoZWQudGlja19zdG9wcGVkKTsKKwl0aWNrX2Jyb2FkY2FzdF9jb250cm9sKFRJQ0tfQlJPQURDQVNUX09OKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Jyb2FkY2FzdF9kaXNhYmxlKHZvaWQpCit7CisJdGlja19icm9hZGNhc3RfY29udHJvbChUSUNLX0JST0FEQ0FTVF9PRkYpOworfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X2ZvcmNlKHZvaWQpCit7CisJdGlja19icm9hZGNhc3RfY29udHJvbChUSUNLX0JST0FEQ0FTVF9GT1JDRSk7Cit9CitzdGF0aWMgaW5saW5lIGludCB0aWNrX2Jyb2FkY2FzdF9lbnRlcih2b2lkKQoreworCXJldHVybiB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2woVElDS19CUk9BRENBU1RfRU5URVIpOworfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X2V4aXQodm9pZCkKK3sKKwl0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2woVElDS19CUk9BRENBU1RfRVhJVCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfTk9fSFpfQ09NTU9OCitleHRlcm4gaW50IHRpY2tfbm9oel90aWNrX3N0b3BwZWQodm9pZCk7CiBleHRlcm4gdm9pZCB0aWNrX25vaHpfaWRsZV9lbnRlcih2b2lkKTsKIGV4dGVybiB2b2lkIHRpY2tfbm9oel9pZGxlX2V4aXQodm9pZCk7CiBleHRlcm4gdm9pZCB0aWNrX25vaHpfaXJxX2V4aXQodm9pZCk7CiBleHRlcm4ga3RpbWVfdCB0aWNrX25vaHpfZ2V0X3NsZWVwX2xlbmd0aCh2b2lkKTsKIGV4dGVybiB1NjQgZ2V0X2NwdV9pZGxlX3RpbWVfdXMoaW50IGNwdSwgdTY0ICpsYXN0X3VwZGF0ZV90aW1lKTsKIGV4dGVybiB1NjQgZ2V0X2NwdV9pb3dhaXRfdGltZV91cyhpbnQgY3B1LCB1NjQgKmxhc3RfdXBkYXRlX3RpbWUpOwotCi0jIGVsc2UgLyogIUNPTkZJR19OT19IWl9DT01NT04gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRpY2tfbm9oel90aWNrX3N0b3BwZWQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQorI2Vsc2UgLyogIUNPTkZJR19OT19IWl9DT01NT04gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfbm9oel90aWNrX3N0b3BwZWQodm9pZCkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfbm9oel9pZGxlX2VudGVyKHZvaWQpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfbm9oel9pZGxlX2V4aXQodm9pZCkgeyB9CiAKQEAgLTE2Myw3ICsxMTEsNyBAQAogfQogc3RhdGljIGlubGluZSB1NjQgZ2V0X2NwdV9pZGxlX3RpbWVfdXMoaW50IGNwdSwgdTY0ICp1bnVzZWQpIHsgcmV0dXJuIC0xOyB9CiBzdGF0aWMgaW5saW5lIHU2NCBnZXRfY3B1X2lvd2FpdF90aW1lX3VzKGludCBjcHUsIHU2NCAqdW51c2VkKSB7IHJldHVybiAtMTsgfQotIyBlbmRpZiAvKiAhQ09ORklHX05PX0haX0NPTU1PTiAqLworI2VuZGlmIC8qICFDT05GSUdfTk9fSFpfQ09NTU9OICovCiAKICNpZmRlZiBDT05GSUdfTk9fSFpfRlVMTAogZXh0ZXJuIGJvb2wgdGlja19ub2h6X2Z1bGxfcnVubmluZzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZWtlZXBlcl9pbnRlcm5hbC5oIGIvaW5jbHVkZS9saW51eC90aW1la2VlcGVyX2ludGVybmFsLmgKaW5kZXggMDVhZjlhMy4uZmI4Njk2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1la2VlcGVyX2ludGVybmFsLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1la2VlcGVyX2ludGVybmFsLmgKQEAgLTE2LDE2ICsxNiwxNiBAQAogICogQHJlYWQ6CVJlYWQgZnVuY3Rpb24gb2YgQGNsb2NrCiAgKiBAbWFzazoJQml0bWFzayBmb3IgdHdvJ3MgY29tcGxlbWVudCBzdWJ0cmFjdGlvbiBvZiBub24gNjRiaXQgY2xvY2tzCiAgKiBAY3ljbGVfbGFzdDogQGNsb2NrIGN5Y2xlIHZhbHVlIGF0IGxhc3QgdXBkYXRlCi0gKiBAbXVsdDoJTlRQIGFkanVzdGVkIG11bHRpcGxpZXIgZm9yIHNjYWxlZCBtYXRoIGNvbnZlcnNpb24KKyAqIEBtdWx0OgkoTlRQIGFkanVzdGVkKSBtdWx0aXBsaWVyIGZvciBzY2FsZWQgbWF0aCBjb252ZXJzaW9uCiAgKiBAc2hpZnQ6CVNoaWZ0IHZhbHVlIGZvciBzY2FsZWQgbWF0aCBjb252ZXJzaW9uCiAgKiBAeHRpbWVfbnNlYzogU2hpZnRlZCAoZnJhY3Rpb25hbCkgbmFubyBzZWNvbmRzIG9mZnNldCBmb3IgcmVhZG91dAotICogQGJhc2VfbW9ubzogIGt0aW1lX3QgKG5hbm9zZWNvbmRzKSBiYXNlIHRpbWUgZm9yIHJlYWRvdXQKKyAqIEBiYXNlOglrdGltZV90IChuYW5vc2Vjb25kcykgYmFzZSB0aW1lIGZvciByZWFkb3V0CiAgKgogICogVGhpcyBzdHJ1Y3QgaGFzIHNpemUgNTYgYnl0ZSBvbiA2NCBiaXQuIFRvZ2V0aGVyIHdpdGggYSBzZXFjb3VudCBpdAogICogb2NjdXBpZXMgYSBzaW5nbGUgNjRieXRlIGNhY2hlIGxpbmUuCiAgKgogICogVGhlIHN0cnVjdCBpcyBzZXBhcmF0ZSBmcm9tIHN0cnVjdCB0aW1la2VlcGVyIGFzIGl0IGlzIGFsc28gdXNlZAotICogZm9yIGEgZmFzdCBOTUkgc2FmZSBhY2Nlc3NvciB0byBjbG9jayBtb25vdG9uaWMuCisgKiBmb3IgYSBmYXN0IE5NSSBzYWZlIGFjY2Vzc29ycy4KICAqLwogc3RydWN0IHRrX3JlYWRfYmFzZSB7CiAJc3RydWN0IGNsb2Nrc291cmNlCSpjbG9jazsKQEAgLTM1LDEyICszNSwxMyBAQAogCXUzMgkJCW11bHQ7CiAJdTMyCQkJc2hpZnQ7CiAJdTY0CQkJeHRpbWVfbnNlYzsKLQlrdGltZV90CQkJYmFzZV9tb25vOworCWt0aW1lX3QJCQliYXNlOwogfTsKIAogLyoqCiAgKiBzdHJ1Y3QgdGltZWtlZXBlciAtIFN0cnVjdHVyZSBob2xkaW5nIGludGVybmFsIHRpbWVrZWVwaW5nIHZhbHVlcy4KLSAqIEB0a3I6CQlUaGUgcmVhZG91dCBiYXNlIHN0cnVjdHVyZQorICogQHRrcl9tb25vOgkJVGhlIHJlYWRvdXQgYmFzZSBzdHJ1Y3R1cmUgZm9yIENMT0NLX01PTk9UT05JQworICogQHRrcl9yYXc6CQlUaGUgcmVhZG91dCBiYXNlIHN0cnVjdHVyZSBmb3IgQ0xPQ0tfTU9OT1RPTklDX1JBVwogICogQHh0aW1lX3NlYzoJCUN1cnJlbnQgQ0xPQ0tfUkVBTFRJTUUgdGltZSBpbiBzZWNvbmRzCiAgKiBAa3RpbWVfc2VjOgkJQ3VycmVudCBDTE9DS19NT05PVE9OSUMgdGltZSBpbiBzZWNvbmRzCiAgKiBAd2FsbF90b19tb25vdG9uaWM6CUNMT0NLX1JFQUxUSU1FIHRvIENMT0NLX01PTk9UT05JQyBvZmZzZXQKQEAgLTQ4LDcgKzQ5LDYgQEAKICAqIEBvZmZzX2Jvb3Q6CQlPZmZzZXQgY2xvY2sgbW9ub3RvbmljIC0+IGNsb2NrIGJvb3R0aW1lCiAgKiBAb2Zmc190YWk6CQlPZmZzZXQgY2xvY2sgbW9ub3RvbmljIC0+IGNsb2NrIHRhaQogICogQHRhaV9vZmZzZXQ6CQlUaGUgY3VycmVudCBVVEMgdG8gVEFJIG9mZnNldCBpbiBzZWNvbmRzCi0gKiBAYmFzZV9yYXc6CQlNb25vdG9uaWMgcmF3IGJhc2UgdGltZSBpbiBrdGltZV90IGZvcm1hdAogICogQHJhd190aW1lOgkJTW9ub3RvbmljIHJhdyBiYXNlIHRpbWUgaW4gdGltZXNwZWM2NCBmb3JtYXQKICAqIEBjeWNsZV9pbnRlcnZhbDoJTnVtYmVyIG9mIGNsb2NrIGN5Y2xlcyBpbiBvbmUgTlRQIGludGVydmFsCiAgKiBAeHRpbWVfaW50ZXJ2YWw6CU51bWJlciBvZiBjbG9jayBzaGlmdGVkIG5hbm8gc2Vjb25kcyBpbiBvbmUgTlRQCkBAIC03Niw3ICs3Niw4IEBACiAgKiB1c2VkIGluc3RlYWQuCiAgKi8KIHN0cnVjdCB0aW1la2VlcGVyIHsKLQlzdHJ1Y3QgdGtfcmVhZF9iYXNlCXRrcjsKKwlzdHJ1Y3QgdGtfcmVhZF9iYXNlCXRrcl9tb25vOworCXN0cnVjdCB0a19yZWFkX2Jhc2UJdGtyX3JhdzsKIAl1NjQJCQl4dGltZV9zZWM7CiAJdW5zaWduZWQgbG9uZwkJa3RpbWVfc2VjOwogCXN0cnVjdCB0aW1lc3BlYzY0CXdhbGxfdG9fbW9ub3RvbmljOwpAQCAtODQsNyArODUsNiBAQAogCWt0aW1lX3QJCQlvZmZzX2Jvb3Q7CiAJa3RpbWVfdAkJCW9mZnNfdGFpOwogCXMzMgkJCXRhaV9vZmZzZXQ7Ci0Ja3RpbWVfdAkJCWJhc2VfcmF3OwogCXN0cnVjdCB0aW1lc3BlYzY0CXJhd190aW1lOwogCiAJLyogVGhlIGZvbGxvd2luZyBtZW1iZXJzIGFyZSBmb3IgdGltZWtlZXBpbmcgaW50ZXJuYWwgdXNlICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWVrZWVwaW5nLmggYi9pbmNsdWRlL2xpbnV4L3RpbWVrZWVwaW5nLmgKaW5kZXggM2VhYWU0Ny4uOTkxNzZhZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1la2VlcGluZy5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZWtlZXBpbmcuaApAQCAtMjE0LDEyICsyMTQsMTggQEAKIAlyZXR1cm4ga3RpbWVfdG9fbnMoa3RpbWVfZ2V0X2Jvb3R0aW1lKCkpOwogfQogCitzdGF0aWMgaW5saW5lIHU2NCBrdGltZV9nZXRfdGFpX25zKHZvaWQpCit7CisJcmV0dXJuIGt0aW1lX3RvX25zKGt0aW1lX2dldF9jbG9ja3RhaSgpKTsKK30KKwogc3RhdGljIGlubGluZSB1NjQga3RpbWVfZ2V0X3Jhd19ucyh2b2lkKQogewogCXJldHVybiBrdGltZV90b19ucyhrdGltZV9nZXRfcmF3KCkpOwogfQogCiBleHRlcm4gdTY0IGt0aW1lX2dldF9tb25vX2Zhc3RfbnModm9pZCk7CitleHRlcm4gdTY0IGt0aW1lX2dldF9yYXdfZmFzdF9ucyh2b2lkKTsKIAogLyoKICAqIFRpbWVzcGVjIGludGVyZmFjZXMgdXRpbGl6aW5nIHRoZSBrdGltZSBiYXNlZCBvbmVzCkBAIC0yNDIsNiArMjQ4LDkgQEAKIC8qCiAgKiBSVEMgc3BlY2lmaWMKICAqLworZXh0ZXJuIGJvb2wgdGltZWtlZXBpbmdfcnRjX3NraXBzdXNwZW5kKHZvaWQpOworZXh0ZXJuIGJvb2wgdGltZWtlZXBpbmdfcnRjX3NraXByZXN1bWUodm9pZCk7CisKIGV4dGVybiB2b2lkIHRpbWVrZWVwaW5nX2luamVjdF9zbGVlcHRpbWU2NChzdHJ1Y3QgdGltZXNwZWM2NCAqZGVsdGEpOwogCiAvKgpAQCAtMjUzLDE3ICsyNjIsMTQgQEAKIC8qCiAgKiBQZXJzaXN0ZW50IGNsb2NrIHJlbGF0ZWQgaW50ZXJmYWNlcwogICovCi1leHRlcm4gYm9vbCBwZXJzaXN0ZW50X2Nsb2NrX2V4aXN0OwogZXh0ZXJuIGludCBwZXJzaXN0ZW50X2Nsb2NrX2lzX2xvY2FsOwogCi1zdGF0aWMgaW5saW5lIGJvb2wgaGFzX3BlcnNpc3RlbnRfY2xvY2sodm9pZCkKLXsKLQlyZXR1cm4gcGVyc2lzdGVudF9jbG9ja19leGlzdDsKLX0KLQogZXh0ZXJuIHZvaWQgcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHN0cnVjdCB0aW1lc3BlYyAqdHMpOworZXh0ZXJuIHZvaWQgcmVhZF9wZXJzaXN0ZW50X2Nsb2NrNjQoc3RydWN0IHRpbWVzcGVjNjQgKnRzKTsKIGV4dGVybiB2b2lkIHJlYWRfYm9vdF9jbG9jayhzdHJ1Y3QgdGltZXNwZWMgKnRzKTsKK2V4dGVybiB2b2lkIHJlYWRfYm9vdF9jbG9jazY0KHN0cnVjdCB0aW1lc3BlYzY0ICp0cyk7CiBleHRlcm4gaW50IHVwZGF0ZV9wZXJzaXN0ZW50X2Nsb2NrKHN0cnVjdCB0aW1lc3BlYyBub3cpOworZXh0ZXJuIGludCB1cGRhdGVfcGVyc2lzdGVudF9jbG9jazY0KHN0cnVjdCB0aW1lc3BlYzY0IG5vdyk7CiAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RyYWNlZnMuaCBiL2luY2x1ZGUvbGludXgvdHJhY2Vmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNzI3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L3RyYWNlZnMuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogIHRyYWNlZnMuaCAtIGEgcHNldWRvIGZpbGUgc3lzdGVtIGZvciBhY3RpdmF0aW5nIHRyYWNpbmcKKyAqCisgKiBCYXNlZCBvbiBkZWJ1Z2ZzIGJ5OiAyMDA0IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ0Brcm9haC5jb20+CisgKgorICogIENvcHlyaWdodCAoQykgMjAxNCBSZWQgSGF0IEluYywgYXV0aG9yOiBTdGV2ZW4gUm9zdGVkdCA8c3Jvc3RlZHRAcmVkaGF0LmNvbT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKgkyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIHRyYWNlZnMgaXMgdGhlIGZpbGUgc3lzdGVtIHRoYXQgaXMgdXNlZCBieSB0aGUgdHJhY2luZyBpbmZyYXN0cnVjdHVyZS4KKyAqCisgKi8KKworI2lmbmRlZiBfVFJBQ0VGU19IXworI2RlZmluZSBfVFJBQ0VGU19IXworCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RydWN0IGZpbGVfb3BlcmF0aW9uczsKKworI2lmZGVmIENPTkZJR19UUkFDSU5HCisKK3N0cnVjdCBkZW50cnkgKnRyYWNlZnNfY3JlYXRlX2ZpbGUoY29uc3QgY2hhciAqbmFtZSwgdW1vZGVfdCBtb2RlLAorCQkJCSAgIHN0cnVjdCBkZW50cnkgKnBhcmVudCwgdm9pZCAqZGF0YSwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKTsKKworc3RydWN0IGRlbnRyeSAqdHJhY2Vmc19jcmVhdGVfZGlyKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCk7CisKK3ZvaWQgdHJhY2Vmc19yZW1vdmUoc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKK3ZvaWQgdHJhY2Vmc19yZW1vdmVfcmVjdXJzaXZlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSk7CisKK3N0cnVjdCBkZW50cnkgKnRyYWNlZnNfY3JlYXRlX2luc3RhbmNlX2Rpcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCisJCQkJCSAgIGludCAoKm1rZGlyKShjb25zdCBjaGFyICpuYW1lKSwKKwkJCQkJICAgaW50ICgqcm1kaXIpKGNvbnN0IGNoYXIgKm5hbWUpKTsKKworYm9vbCB0cmFjZWZzX2luaXRpYWxpemVkKHZvaWQpOworCisjZW5kaWYgLyogQ09ORklHX1RSQUNJTkcgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaCBiL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCmluZGV4IGM3Mjg1MTMuLmE1ZjdmM2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCisrKyBiL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCkBAIC0zNiw2ICszNiwxMiBAQAogCXN0cnVjdCB0cmFjZXBvaW50X2Z1bmMgX19yY3UgKmZ1bmNzOwogfTsKIAorc3RydWN0IHRyYWNlX2VudW1fbWFwIHsKKwljb25zdCBjaGFyCQkqc3lzdGVtOworCWNvbnN0IGNoYXIJCSplbnVtX3N0cmluZzsKKwl1bnNpZ25lZCBsb25nCQllbnVtX3ZhbHVlOworfTsKKwogZXh0ZXJuIGludAogdHJhY2Vwb2ludF9wcm9iZV9yZWdpc3RlcihzdHJ1Y3QgdHJhY2Vwb2ludCAqdHAsIHZvaWQgKnByb2JlLCB2b2lkICpkYXRhKTsKIGV4dGVybiBpbnQKQEAgLTg3LDYgKzkzLDggQEAKIAogI2RlZmluZSBQQVJBTVMoYXJncy4uLikgYXJncwogCisjZGVmaW5lIFRSQUNFX0RFRklORV9FTlVNKHgpCisKICNlbmRpZiAvKiBfTElOVVhfVFJBQ0VQT0lOVF9IICovCiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3R5cGVzLmggYi9pbmNsdWRlL2xpbnV4L3R5cGVzLmgKaW5kZXggNjc0NzI0Ny4uNTk2OThiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90eXBlcy5oCisrKyBiL2luY2x1ZGUvbGludXgvdHlwZXMuaApAQCAtMTQ2LDEyICsxNDYsNiBAQAogdHlwZWRlZiB1MzIgZG1hX2FkZHJfdDsKICNlbmRpZiAvKiBkbWFfYWRkcl90ICovCiAKLSNpZmRlZiBfX0NIRUNLRVJfXwotI2Vsc2UKLSNlbmRpZgotI2lmZGVmIF9fQ0hFQ0tfRU5ESUFOX18KLSNlbHNlCi0jZW5kaWYKIHR5cGVkZWYgdW5zaWduZWQgX19iaXR3aXNlX18gZ2ZwX3Q7CiB0eXBlZGVmIHVuc2lnbmVkIF9fYml0d2lzZV9fIGZtb2RlX3Q7CiB0eXBlZGVmIHVuc2lnbmVkIF9fYml0d2lzZV9fIG9vbV9mbGFnc190OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91ZHAuaCBiL2luY2x1ZGUvbGludXgvdWRwLmgKaW5kZXggMjQ3Y2ZkYy4uODdjMDk0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91ZHAuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VkcC5oCkBAIC0zNCw3ICszNCw3IEBACiAKICNkZWZpbmUgVURQX0hUQUJMRV9TSVpFX01JTgkJKENPTkZJR19CQVNFX1NNQUxMID8gMTI4IDogMjU2KQogCi1zdGF0aWMgaW5saW5lIGludCB1ZHBfaGFzaGZuKHN0cnVjdCBuZXQgKm5ldCwgdW5zaWduZWQgbnVtLCB1bnNpZ25lZCBtYXNrKQorc3RhdGljIGlubGluZSB1MzIgdWRwX2hhc2hmbihjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBudW0sIHUzMiBtYXNrKQogewogCXJldHVybiAobnVtICsgbmV0X2hhc2hfbWl4KG5ldCkpICYgbWFzazsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdWlkZ2lkLmggYi9pbmNsdWRlL2xpbnV4L3VpZGdpZC5oCmluZGV4IDJkMWY5YjYuLjBlZTA1ZGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdWlkZ2lkLmgKKysrIGIvaW5jbHVkZS9saW51eC91aWRnaWQuaApAQCAtMjksNiArMjksNyBAQAogI2RlZmluZSBLVUlEVF9JTklUKHZhbHVlKSAoa3VpZF90KXsgdmFsdWUgfQogI2RlZmluZSBLR0lEVF9JTklUKHZhbHVlKSAoa2dpZF90KXsgdmFsdWUgfQogCisjaWZkZWYgQ09ORklHX01VTFRJVVNFUgogc3RhdGljIGlubGluZSB1aWRfdCBfX2t1aWRfdmFsKGt1aWRfdCB1aWQpCiB7CiAJcmV0dXJuIHVpZC52YWw7CkBAIC0zOCw2ICszOSwxNyBAQAogewogCXJldHVybiBnaWQudmFsOwogfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdWlkX3QgX19rdWlkX3ZhbChrdWlkX3QgdWlkKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGdpZF90IF9fa2dpZF92YWwoa2dpZF90IGdpZCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCiAjZGVmaW5lIEdMT0JBTF9ST09UX1VJRCBLVUlEVF9JTklUKDApCiAjZGVmaW5lIEdMT0JBTF9ST09UX0dJRCBLR0lEVF9JTklUKDApCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Vpby5oIGIvaW5jbHVkZS9saW51eC91aW8uaAppbmRleCA3MTg4MDI5Li4xNWYxMWZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Vpby5oCisrKyBiL2luY2x1ZGUvbGludXgvdWlvLmgKQEAgLTc2LDYgKzc2LDcgQEAKIAkJc3RydWN0IGlvdl9pdGVyICppLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IGJ5dGVzKTsKIHZvaWQgaW92X2l0ZXJfYWR2YW5jZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcyk7CiBpbnQgaW92X2l0ZXJfZmF1bHRfaW5fcmVhZGFibGUoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3QgYnl0ZXMpOworaW50IGlvdl9pdGVyX2ZhdWx0X2luX211bHRpcGFnZXNfcmVhZGFibGUoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3QgYnl0ZXMpOwogc2l6ZV90IGlvdl9pdGVyX3NpbmdsZV9zZWdfY291bnQoY29uc3Qgc3RydWN0IGlvdl9pdGVyICppKTsKIHNpemVfdCBjb3B5X3BhZ2VfdG9faXRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGJ5dGVzLAogCQkJIHN0cnVjdCBpb3ZfaXRlciAqaSk7CkBAIC0xMzksNCArMTQwLDE4IEBACiBzaXplX3QgY3N1bV9hbmRfY29weV90b19pdGVyKHZvaWQgKmFkZHIsIHNpemVfdCBieXRlcywgX193c3VtICpjc3VtLCBzdHJ1Y3QgaW92X2l0ZXIgKmkpOwogc2l6ZV90IGNzdW1fYW5kX2NvcHlfZnJvbV9pdGVyKHZvaWQgKmFkZHIsIHNpemVfdCBieXRlcywgX193c3VtICpjc3VtLCBzdHJ1Y3QgaW92X2l0ZXIgKmkpOwogCitpbnQgaW1wb3J0X2lvdmVjKGludCB0eXBlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICogdXZlY3RvciwKKwkJIHVuc2lnbmVkIG5yX3NlZ3MsIHVuc2lnbmVkIGZhc3Rfc2VncywKKwkJIHN0cnVjdCBpb3ZlYyAqKmlvdiwgc3RydWN0IGlvdl9pdGVyICppKTsKKworI2lmZGVmIENPTkZJR19DT01QQVQKK3N0cnVjdCBjb21wYXRfaW92ZWM7CitpbnQgY29tcGF0X2ltcG9ydF9pb3ZlYyhpbnQgdHlwZSwgY29uc3Qgc3RydWN0IGNvbXBhdF9pb3ZlYyBfX3VzZXIgKiB1dmVjdG9yLAorCQkgdW5zaWduZWQgbnJfc2VncywgdW5zaWduZWQgZmFzdF9zZWdzLAorCQkgc3RydWN0IGlvdmVjICoqaW92LCBzdHJ1Y3QgaW92X2l0ZXIgKmkpOworI2VuZGlmCisKK2ludCBpbXBvcnRfc2luZ2xlX3JhbmdlKGludCB0eXBlLCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAorCQkgc3RydWN0IGlvdmVjICppb3YsIHN0cnVjdCBpb3ZfaXRlciAqaSk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IuaCBiL2luY2x1ZGUvbGludXgvdXNiLmgKaW5kZXggN2VlMWI1Yy4uNDQ3ZmUyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi5oCkBAIC0yMDUsNiArMjA1LDMyIEBACiAjZGVmaW5lIFVTQl9NQVhJTlRFUkZBQ0VTCTMyCiAjZGVmaW5lIFVTQl9NQVhJQURTCQkoVVNCX01BWElOVEVSRkFDRVMvMikKIAorLyoKKyAqIFVTQiBSZXN1bWUgVGltZXI6IEV2ZXJ5IEhvc3QgY29udHJvbGxlciBkcml2ZXIgc2hvdWxkIGRyaXZlIHRoZSByZXN1bWUKKyAqIHNpZ25hbGxpbmcgb24gdGhlIGJ1cyBmb3IgdGhlIGFtb3VudCBvZiB0aW1lIGRlZmluZWQgYnkgdGhpcyBtYWNyby4KKyAqCisgKiBUaGF0IHdheSB3ZSB3aWxsIGhhdmUgYSAnc3RhYmxlJyBiZWhhdmlvciBhbW9uZyBhbGwgSENEcyBzdXBwb3J0ZWQgYnkgTGludXguCisgKgorICogTm90ZSB0aGF0IHRoZSBVU0IgU3BlY2lmaWNhdGlvbiBzdGF0ZXMgd2Ugc2hvdWxkIGRyaXZlIHJlc3VtZSBmb3IgKmF0IGxlYXN0KgorICogMjAgbXMsIGJ1dCBpdCBkb2Vzbid0IGdpdmUgYW4gdXBwZXIgYm91bmQuIFRoaXMgY3JlYXRlcyB0d28gcG9zc2libGUKKyAqIHNpdHVhdGlvbnMgd2hpY2ggd2Ugd2FudCB0byBhdm9pZDoKKyAqCisgKiAoYSkgc29tZXRpbWVzIGFuIG1zbGVlcCgyMCkgbWlnaHQgZXhwaXJlIHNsaWdodGx5IGJlZm9yZSAyMCBtcywgd2hpY2ggY2F1c2VzCisgKiB1cyB0byBmYWlsIFVTQiBFbGVjdHJpY2FsIFRlc3RzLCB0aHVzIGZhaWxpbmcgQ2VydGlmaWNhdGlvbgorICoKKyAqIChiKSBTb21lIChtYW55KSBkZXZpY2VzIGFjdHVhbGx5IG5lZWQgbW9yZSB0aGFuIDIwIG1zIG9mIHJlc3VtZSBzaWduYWxsaW5nLAorICogYW5kIHdoaWxlIHdlIGNhbiBhcmd1ZSB0aGF0J3MgYWdhaW5zdCB0aGUgVVNCIFNwZWNpZmljYXRpb24sIHdlIGRvbid0IGhhdmUKKyAqIGNvbnRyb2wgb3ZlciB3aGljaCBkZXZpY2VzIGEgY2VydGlmaWNhdGlvbiBsYWJvcmF0b3J5IHdpbGwgYmUgdXNpbmcgZm9yCisgKiBjZXJ0aWZpY2F0aW9uLiBJZiBDZXJ0TGFiIHVzZXMgYSBkZXZpY2Ugd2hpY2ggd2FzIHRlc3RlZCBhZ2FpbnN0IFdpbmRvd3MgYW5kCisgKiB0aGF0IGhhcHBlbnMgdG8gaGF2ZSByZWxheGVkIHJlc3VtZSBzaWduYWxsaW5nIHJ1bGVzLCB3ZSBtaWdodCBmYWxsIGludG8KKyAqIHNpdHVhdGlvbnMgd2hlcmUgd2UgZmFpbCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBlbGVjdHJpY2FsIHRlc3RzLgorICoKKyAqIEluIG9yZGVyIHRvIGF2b2lkIGJvdGggY29uZGl0aW9ucywgd2UncmUgdXNpbmcgYSA0MCBtcyByZXN1bWUgdGltZW91dCwgd2hpY2gKKyAqIHNob3VsZCBjb3BlIHdpdGggYm90aCBMUEogY2FsaWJyYXRpb24gZXJyb3JzIGFuZCBkZXZpY2VzIG5vdCBmb2xsb3dpbmcgZXZlcnkKKyAqIGRldGFpbCBvZiB0aGUgVVNCIFNwZWNpZmljYXRpb24uCisgKi8KKyNkZWZpbmUgVVNCX1JFU1VNRV9USU1FT1VUCTQwIC8qIG1zICovCisKIC8qKgogICogc3RydWN0IHVzYl9pbnRlcmZhY2VfY2FjaGUgLSBsb25nLXRlcm0gcmVwcmVzZW50YXRpb24gb2YgYSBkZXZpY2UgaW50ZXJmYWNlCiAgKiBAbnVtX2FsdHNldHRpbmc6IG51bWJlciBvZiBhbHRzZXR0aW5ncyBkZWZpbmVkLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvY2hpcGlkZWEuaCBiL2luY2x1ZGUvbGludXgvdXNiL2NoaXBpZGVhLmgKaW5kZXggNTM1OTk3YS4uYWI5NGY3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvY2hpcGlkZWEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9jaGlwaWRlYS5oCkBAIC0xOSw2ICsxOSw3IEBACiAJZW51bSB1c2JfcGh5X2ludGVyZmFjZSBwaHlfbW9kZTsKIAl1bnNpZ25lZCBsb25nCSBmbGFnczsKICNkZWZpbmUgQ0lfSERSQ19SRUdTX1NIQVJFRAkJQklUKDApCisjZGVmaW5lIENJX0hEUkNfU1VQUE9SVFNfUlVOVElNRV9QTQlCSVQoMikKICNkZWZpbmUgQ0lfSERSQ19ESVNBQkxFX1NUUkVBTUlORwlCSVQoMykKIAkvKgogCSAqIE9ubHkgc2V0IGl0IHdoZW4gRENDUEFSQU1TLkRDPT0xIGFuZCBEQ0NQQVJBTVMuSEM9PTEsCkBAIC0yNyw2ICsyOCw3IEBACiAjZGVmaW5lIENJX0hEUkNfRFVBTF9ST0xFX05PVF9PVEcJQklUKDQpCiAjZGVmaW5lIENJX0hEUkNfSU1YMjhfV1JJVEVfRklYCQlCSVQoNSkKICNkZWZpbmUgQ0lfSERSQ19GT1JDRV9GVUxMU1BFRUQJCUJJVCg2KQorI2RlZmluZSBDSV9IRFJDX1RVUk5fVkJVU19FQVJMWV9PTglCSVQoNykKIAllbnVtIHVzYl9kcl9tb2RlCWRyX21vZGU7CiAjZGVmaW5lIENJX0hEUkNfQ09OVFJPTExFUl9SRVNFVF9FVkVOVAkJMAogI2RlZmluZSBDSV9IRFJDX0NPTlRST0xMRVJfU1RPUFBFRF9FVkVOVAkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9jb21wb3NpdGUuaCBiL2luY2x1ZGUvbGludXgvdXNiL2NvbXBvc2l0ZS5oCmluZGV4IDNkODdkZWYuLjI1MTE0NjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdXNiL2NvbXBvc2l0ZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL2NvbXBvc2l0ZS5oCkBAIC0xNDgsNiArMTQ4LDcgQEAKICAqIEBkaXNhYmxlOiAoUkVRVUlSRUQpIEluZGljYXRlcyB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGRpc2FibGVkLiAgUmVhc29ucwogICoJaW5jbHVkZSBob3N0IHJlc2V0dGluZyBvciByZWNvbmZpZ3VyaW5nIHRoZSBnYWRnZXQsIGFuZCBkaXNjb25uZWN0aW9uLgogICogQHNldHVwOiBVc2VkIGZvciBpbnRlcmZhY2Utc3BlY2lmaWMgY29udHJvbCByZXF1ZXN0cy4KKyAqIEByZXFfbWF0Y2g6IFRlc3RzIGlmIGEgZ2l2ZW4gY2xhc3MgcmVxdWVzdCBjYW4gYmUgaGFuZGxlZCBieSB0aGlzIGZ1bmN0aW9uLgogICogQHN1c3BlbmQ6IE5vdGlmaWVzIGZ1bmN0aW9ucyB3aGVuIHRoZSBob3N0IHN0b3BzIHNlbmRpbmcgVVNCIHRyYWZmaWMuCiAgKiBAcmVzdW1lOiBOb3RpZmllcyBmdW5jdGlvbnMgd2hlbiB0aGUgaG9zdCByZXN0YXJ0cyBVU0IgdHJhZmZpYy4KICAqIEBnZXRfc3RhdHVzOiBSZXR1cm5zIGZ1bmN0aW9uIHN0YXR1cyBhcyBhIHJlcGx5IHRvCkBAIC0yMTMsNiArMjE0LDggQEAKIAl2b2lkCQkJKCpkaXNhYmxlKShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICopOwogCWludAkJCSgqc2V0dXApKHN0cnVjdCB1c2JfZnVuY3Rpb24gKiwKIAkJCQkJY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKTsKKwlib29sCQkJKCpyZXFfbWF0Y2gpKHN0cnVjdCB1c2JfZnVuY3Rpb24gKiwKKwkJCQkJY29uc3Qgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKTsKIAl2b2lkCQkJKCpzdXNwZW5kKShzdHJ1Y3QgdXNiX2Z1bmN0aW9uICopOwogCXZvaWQJCQkoKnJlc3VtZSkoc3RydWN0IHVzYl9mdW5jdGlvbiAqKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC91c2IvZ2FkZ2V0LmggYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaAppbmRleCBlMmYwMGZkLi40ZjNkZmI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3VzYi9nYWRnZXQuaApAQCAtMTkwLDcgKzE5MCw3IEBACiAgKiBAZXA6dGhlIGVuZHBvaW50IGJlaW5nIGNvbmZpZ3VyZWQKICAqIEBtYXhwYWNrZXRfbGltaXQ6dmFsdWUgb2YgbWF4aW11bSBwYWNrZXQgc2l6ZSBsaW1pdAogICoKLSAqIFRoaXMgZnVuY3Rpb24gc2hvdWQgYmUgdXNlZCBvbmx5IGluIFVEQyBkcml2ZXJzIHRvIGluaXRpYWxpemUgZW5kcG9pbnQKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSBpbiBVREMgZHJpdmVycyB0byBpbml0aWFsaXplIGVuZHBvaW50CiAgKiAodXN1YWxseSBpbiBwcm9iZSBmdW5jdGlvbikuCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB1c2JfZXBfc2V0X21heHBhY2tldF9saW1pdChzdHJ1Y3QgdXNiX2VwICplcCwKQEAgLTQ3NCw2ICs0NzQsNyBAQAogCiBzdHJ1Y3QgdXNiX2dhZGdldDsKIHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlcjsKK3N0cnVjdCB1c2JfdWRjOwogCiAvKiB0aGUgcmVzdCBvZiB0aGUgYXBpIHRvIHRoZSBjb250cm9sbGVyIGhhcmR3YXJlOiBkZXZpY2Ugb3BlcmF0aW9ucywKICAqIHdoaWNoIGRvbid0IGludm9sdmUgZW5kcG9pbnRzIChvciBpL28pLgpAQCAtNDk2LDYgKzQ5Nyw3IEBACiAvKioKICAqIHN0cnVjdCB1c2JfZ2FkZ2V0IC0gcmVwcmVzZW50cyBhIHVzYiBzbGF2ZSBkZXZpY2UKICAqIEB3b3JrOiAoaW50ZXJuYWwgdXNlKSBXb3JrcXVldWUgdG8gYmUgdXNlZCBmb3Igc3lzZnNfbm90aWZ5KCkKKyAqIEB1ZGM6IHN0cnVjdCB1c2JfdWRjIHBvaW50ZXIgZm9yIHRoaXMgZ2FkZ2V0CiAgKiBAb3BzOiBGdW5jdGlvbiBwb2ludGVycyB1c2VkIHRvIGFjY2VzcyBoYXJkd2FyZS1zcGVjaWZpYyBvcGVyYXRpb25zLgogICogQGVwMDogRW5kcG9pbnQgemVybywgdXNlZCB3aGVuIHJlYWRpbmcgb3Igd3JpdGluZyByZXNwb25zZXMgdG8KICAqCWRyaXZlciBzZXR1cCgpIHJlcXVlc3RzCkBAIC01NDUsNiArNTQ3LDcgQEAKICAqLwogc3RydWN0IHVzYl9nYWRnZXQgewogCXN0cnVjdCB3b3JrX3N0cnVjdAkJd29yazsKKwlzdHJ1Y3QgdXNiX3VkYwkJCSp1ZGM7CiAJLyogcmVhZG9ubHkgdG8gZ2FkZ2V0IGRyaXZlciAqLwogCWNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X29wcwkqb3BzOwogCXN0cnVjdCB1c2JfZXAJCQkqZXAwOwpAQCAtMTAyOSw2ICsxMDMyLDEwIEBACiBleHRlcm4gdm9pZCB1c2JfZ2FkZ2V0X2dpdmViYWNrX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqZXAsCiAJCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKTsKIAorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogdXRpbGl0eSB0byB1cGRhdGUgdmJ1cyBzdGF0dXMgZm9yIHVkYyBjb3JlLCBpdCBtYXkgYmUgc2NoZWR1bGVkICovCitleHRlcm4gdm9pZCB1c2JfdWRjX3ZidXNfaGFuZGxlcihzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LCBib29sIHN0YXR1cyk7CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL21zbV9oc3VzYi5oIGIvaW5jbHVkZS9saW51eC91c2IvbXNtX2hzdXNiLmgKaW5kZXggYjBhMzkyNC4uN2RiZWNmOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvbXNtX2hzdXNiLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvbXNtX2hzdXNiLmgKQEAgLTExNyw4ICsxMTcsNiBAQAogCWVudW0gb3RnX2NvbnRyb2xfdHlwZSBvdGdfY29udHJvbDsKIAllbnVtIG1zbV91c2JfcGh5X3R5cGUgcGh5X3R5cGU7CiAJdm9pZCAoKnNldHVwX2dwaW8pKGVudW0gdXNiX290Z19zdGF0ZSBzdGF0ZSk7Ci0JaW50ICgqbGlua19jbGtfcmVzZXQpKHN0cnVjdCBjbGsgKmxpbmtfY2xrLCBib29sIGFzc2VydCk7Ci0JaW50ICgqcGh5X2Nsa19yZXNldCkoc3RydWN0IGNsayAqcGh5X2Nsayk7CiB9OwogCiAvKioKQEAgLTEyOCw3ICsxMjYsNiBAQAogICogQGlycTogSVJRIG51bWJlciBhc3NpZ25lZCBmb3IgSFNVU0IgY29udHJvbGxlci4KICAqIEBjbGs6IGNsb2NrIHN0cnVjdCBvZiB1c2JfaHNfY2xrLgogICogQHBjbGs6IGNsb2NrIHN0cnVjdCBvZiB1c2JfaHNfcGNsay4KLSAqIEBwaHlfcmVzZXRfY2xrOiBjbG9jayBzdHJ1Y3Qgb2YgdXNiX3BoeV9jbGsuCiAgKiBAY29yZV9jbGs6IGNsb2NrIHN0cnVjdCBvZiB1c2JfaHNfY29yZV9jbGsuCiAgKiBAcmVnczogaW9yZW1hcHBlZCByZWdpc3RlciBiYXNlIGFkZHJlc3MuCiAgKiBAaW5wdXRzOiBPVEcgc3RhdGUgbWFjaGluZSBpbnB1dHMoSWQsIFNlc3NWYWxpZCBldGMpLgpAQCAtMTQ4LDcgKzE0NSw2IEBACiAJaW50IGlycTsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IGNsayAqcGNsazsKLQlzdHJ1Y3QgY2xrICpwaHlfcmVzZXRfY2xrOwogCXN0cnVjdCBjbGsgKmNvcmVfY2xrOwogCXZvaWQgX19pb21lbSAqcmVnczsKICNkZWZpbmUgSUQJCTAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL290Zy1mc20uaCBiL2luY2x1ZGUvbGludXgvdXNiL290Zy1mc20uaAppbmRleCBiNmJhMWJmLi5mNzI4ZjE4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi9vdGctZnNtLmgKKysrIGIvaW5jbHVkZS9saW51eC91c2Ivb3RnLWZzbS5oCkBAIC01Myw2ICs1Myw4IEBACiAJQl9TRTBfU1JQLAogCUJfU1JQX0ZBSUwsCiAJQV9XQUlUX0VOVU0sCisJQl9EQVRBX1BMUywKKwlCX1NTRU5EX1NSUCwKIAogCU5VTV9PVEdfRlNNX1RJTUVSUywKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VzYi9yZW5lc2FzX3VzYmhzLmggYi9pbmNsdWRlL2xpbnV4L3VzYi9yZW5lc2FzX3VzYmhzLmgKaW5kZXggOWZkOWU0OC4uZjA2NTI5YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvcmVuZXNhc191c2Jocy5oCisrKyBiL2luY2x1ZGUvbGludXgvdXNiL3JlbmVzYXNfdXNiaHMuaApAQCAtMTY1LDYgKzE2NSw4IEBACiAJICovCiAJdTMyIGhhc19vdGc6MTsgLyogZm9yIGNvbnRyb2xsaW5nIFBXRU4vRVhUTFAgKi8KIAl1MzIgaGFzX3N1ZG1hYzoxOyAvKiBmb3IgU1VETUFDICovCisJdTMyIGhhc191c2JfZG1hYzoxOyAvKiBmb3IgVVNCLURNQUMgKi8KKyNkZWZpbmUgVVNCSFNfVVNCX0RNQUNfWEZFUl9TSVpFCTMyCS8qIGhhcmRjb2RlIHRoZSB4ZmVyIHNpemUgKi8KIH07CiAKICNkZWZpbmUgVVNCSFNfVFlQRV9SOEE3NzkwIDEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXNiL3VzYm5ldC5oIGIvaW5jbHVkZS9saW51eC91c2IvdXNibmV0LmgKaW5kZXggZDlhNDkwNS4uNmUwY2U4YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91c2IvdXNibmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC91c2IvdXNibmV0LmgKQEAgLTIyNyw5ICsyMjcsMjMgQEAKIAlzdHJ1Y3QgdXJiCQkqdXJiOwogCXN0cnVjdCB1c2JuZXQJCSpkZXY7CiAJZW51bSBza2Jfc3RhdGUJCXN0YXRlOwotCXNpemVfdAkJCWxlbmd0aDsKKwlsb25nCQkJbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcJCXBhY2tldHM7CiB9OwogCisvKiBEcml2ZXJzIHRoYXQgc2V0IEZMQUdfTVVMVElfUEFDS0VUIG11c3QgY2FsbCB0aGlzIGluIHRoZWlyCisgKiB0eF9maXh1cCBtZXRob2QgYmVmb3JlIHJldHVybmluZyBhbiBza2IuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAordXNibmV0X3NldF9za2JfdHhfc3RhdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXVuc2lnbmVkIGxvbmcgcGFja2V0cywgbG9uZyBieXRlc19kZWx0YSkKK3sKKwlzdHJ1Y3Qgc2tiX2RhdGEgKmVudHJ5ID0gKHN0cnVjdCBza2JfZGF0YSAqKSBza2ItPmNiOworCisJZW50cnktPnBhY2tldHMgPSBwYWNrZXRzOworCWVudHJ5LT5sZW5ndGggPSBieXRlc19kZWx0YTsKK30KKwogZXh0ZXJuIGludCB1c2JuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KTsKIGV4dGVybiBpbnQgdXNibmV0X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5ldCk7CiBleHRlcm4gbmV0ZGV2X3R4X3QgdXNibmV0X3N0YXJ0X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdXdiL3VtYy5oIGIvaW5jbHVkZS9saW51eC91d2IvdW1jLmgKaW5kZXggYmE4MmYwMy4uMDIxMTIyOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC91d2IvdW1jLmgKKysrIGIvaW5jbHVkZS9saW51eC91d2IvdW1jLmgKQEAgLTg3LDggKzg3LDYgQEAKIAogCWludCAgKCpwcm9iZSkoc3RydWN0IHVtY19kZXYgKik7CiAJdm9pZCAoKnJlbW92ZSkoc3RydWN0IHVtY19kZXYgKik7Ci0JaW50ICAoKnN1c3BlbmQpKHN0cnVjdCB1bWNfZGV2ICosIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci0JaW50ICAoKnJlc3VtZSkoc3RydWN0IHVtY19kZXYgKik7CiAJaW50ICAoKnByZV9yZXNldCkoc3RydWN0IHVtY19kZXYgKik7CiAJaW50ICAoKnBvc3RfcmVzZXQpKHN0cnVjdCB1bWNfZGV2ICopOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZmaW8uaCBiL2luY2x1ZGUvbGludXgvdmZpby5oCmluZGV4IDJkNjdiODkuLmRkYjQ0MDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdmZpby5oCisrKyBiL2luY2x1ZGUvbGludXgvdmZpby5oCkBAIC0xNCw2ICsxNCw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9pb21tdS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgogI2luY2x1ZGUgPHVhcGkvbGludXgvdmZpby5oPgogCiAvKioKQEAgLTc4LDE5ICs4MCw2IEBACiBleHRlcm4gdm9pZCB2ZmlvX3VucmVnaXN0ZXJfaW9tbXVfZHJpdmVyKAogCQkJCWNvbnN0IHN0cnVjdCB2ZmlvX2lvbW11X2RyaXZlcl9vcHMgKm9wcyk7CiAKLS8qKgotICogb2Zmc2V0b2ZlbmQoVFlQRSwgTUVNQkVSKQotICoKLSAqIEBUWVBFOiBUaGUgdHlwZSBvZiB0aGUgc3RydWN0dXJlCi0gKiBATUVNQkVSOiBUaGUgbWVtYmVyIHdpdGhpbiB0aGUgc3RydWN0dXJlIHRvIGdldCB0aGUgZW5kIG9mZnNldCBvZgotICoKLSAqIFNpbXBsZSBoZWxwZXIgbWFjcm8gZm9yIGRlYWxpbmcgd2l0aCB2YXJpYWJsZSBzaXplZCBzdHJ1Y3R1cmVzIHBhc3NlZAotICogZnJvbSB1c2VyIHNwYWNlLiAgVGhpcyBhbGxvd3MgdXMgdG8gZWFzaWx5IGRldGVybWluZSBpZiB0aGUgcHJvdmlkZWQKLSAqIHN0cnVjdHVyZSBpcyBzaXplZCB0byBpbmNsdWRlIHZhcmlvdXMgZmllbGRzLgotICovCi0jZGVmaW5lIG9mZnNldG9mZW5kKFRZUEUsIE1FTUJFUikgXAotCShvZmZzZXRvZihUWVBFLCBNRU1CRVIpCSsgc2l6ZW9mKCgoVFlQRSAqKTApLT5NRU1CRVIpKQotCiAvKgogICogRXh0ZXJuYWwgdXNlciBBUEkKICAqLwpAQCAtMTIzLDQgKzExMiwyNyBAQAogCXJldHVybiAtRU5PVFRZOwogfQogI2VuZGlmIC8qIENPTkZJR19FRUggKi8KKworLyoKKyAqIElSUWZkIC0gZ2VuZXJpYworICovCitzdHJ1Y3QgdmlycWZkIHsKKwl2b2lkCQkJKm9wYXF1ZTsKKwlzdHJ1Y3QgZXZlbnRmZF9jdHgJKmV2ZW50ZmQ7CisJaW50CQkJKCpoYW5kbGVyKSh2b2lkICosIHZvaWQgKik7CisJdm9pZAkJCSgqdGhyZWFkKSh2b2lkICosIHZvaWQgKik7CisJdm9pZAkJCSpkYXRhOworCXN0cnVjdCB3b3JrX3N0cnVjdAlpbmplY3Q7CisJd2FpdF9xdWV1ZV90CQl3YWl0OworCXBvbGxfdGFibGUJCXB0OworCXN0cnVjdCB3b3JrX3N0cnVjdAlzaHV0ZG93bjsKKwlzdHJ1Y3QgdmlycWZkCQkqKnB2aXJxZmQ7Cit9OworCitleHRlcm4gaW50IHZmaW9fdmlycWZkX2VuYWJsZSh2b2lkICpvcGFxdWUsCisJCQkgICAgICBpbnQgKCpoYW5kbGVyKSh2b2lkICosIHZvaWQgKiksCisJCQkgICAgICB2b2lkICgqdGhyZWFkKSh2b2lkICosIHZvaWQgKiksCisJCQkgICAgICB2b2lkICpkYXRhLCBzdHJ1Y3QgdmlycWZkICoqcHZpcnFmZCwgaW50IGZkKTsKK2V4dGVybiB2b2lkIHZmaW9fdmlycWZkX2Rpc2FibGUoc3RydWN0IHZpcnFmZCAqKnB2aXJxZmQpOworCiAjZW5kaWYgLyogVkZJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3ZnYWFyYi5oIGIvaW5jbHVkZS9saW51eC92Z2FhcmIuaAppbmRleCBjMzdiZDRkLi44YzNiNDEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZnYWFyYi5oCisrKyBiL2luY2x1ZGUvbGludXgvdmdhYXJiLmgKQEAgLTY1LDggKzY1LDEzIEBACiAgKiAgICAgb3V0IG9mIHRoZSBhcmJpdHJhdGlvbiBwcm9jZXNzIChhbmQgY2FuIGJlIHNhZmUgdG8gdGFrZQogICogICAgIGludGVycnVwdHMgYXQgYW55IHRpbWUuCiAgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19WR0FfQVJCKQogZXh0ZXJuIHZvaWQgdmdhX3NldF9sZWdhY3lfZGVjb2Rpbmcoc3RydWN0IHBjaV9kZXYgKnBkZXYsCiAJCQkJICAgIHVuc2lnbmVkIGludCBkZWNvZGVzKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdmdhX3NldF9sZWdhY3lfZGVjb2Rpbmcoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkJCSAgIHVuc2lnbmVkIGludCBkZWNvZGVzKSB7IH07CisjZW5kaWYKIAogLyoqCiAgKiAgICAgdmdhX2dldCAgICAgICAgIC0gYWNxdWlyZSAmIGxvY2tzIFZHQSByZXNvdXJjZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdm1lLmggYi9pbmNsdWRlL2xpbnV4L3ZtZS5oCmluZGV4IDhjZDZmMTkuLjc5MjQyZTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdm1lLmgKKysrIGIvaW5jbHVkZS9saW51eC92bWUuaApAQCAtMTM3LDYgKzEzNyw3IEBACiBzc2l6ZV90IHZtZV9tYXN0ZXJfd3JpdGUoc3RydWN0IHZtZV9yZXNvdXJjZSAqLCB2b2lkICosIHNpemVfdCwgbG9mZl90KTsKIHVuc2lnbmVkIGludCB2bWVfbWFzdGVyX3JtdyhzdHJ1Y3Qgdm1lX3Jlc291cmNlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50LAogCXVuc2lnbmVkIGludCwgbG9mZl90KTsKK2ludCB2bWVfbWFzdGVyX21tYXAoc3RydWN0IHZtZV9yZXNvdXJjZSAqcmVzb3VyY2UsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKIHZvaWQgdm1lX21hc3Rlcl9mcmVlKHN0cnVjdCB2bWVfcmVzb3VyY2UgKik7CiAKIHN0cnVjdCB2bWVfcmVzb3VyY2UgKnZtZV9kbWFfcmVxdWVzdChzdHJ1Y3Qgdm1lX2RldiAqLCB1MzIpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93YXRjaGRvZy5oIGIvaW5jbHVkZS9saW51eC93YXRjaGRvZy5oCmluZGV4IDM5NWI3MGUuLmE3NDZiZjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd2F0Y2hkb2cuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dhdGNoZG9nLmgKQEAgLTEzNyw0ICsxMzcsMTIgQEAKIGV4dGVybiBpbnQgd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CiBleHRlcm4gdm9pZCB3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOwogCisjaWZkZWYgQ09ORklHX0hBUkRMT0NLVVBfREVURUNUT1IKK3ZvaWQgd2F0Y2hkb2dfbm1pX2Rpc2FibGVfYWxsKHZvaWQpOwordm9pZCB3YXRjaGRvZ19ubWlfZW5hYmxlX2FsbCh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgd2F0Y2hkb2dfbm1pX2Rpc2FibGVfYWxsKHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgd2F0Y2hkb2dfbm1pX2VuYWJsZV9hbGwodm9pZCkge30KKyNlbmRpZgorCiAjZW5kaWYgIC8qIGlmbmRlZiBfTElOVVhfV0FUQ0hET0dfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaCBiL2luY2x1ZGUvbGludXgvd29ya3F1ZXVlLmgKaW5kZXggZjU5Nzg0Ni4uZGVlZTIxMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93b3JrcXVldWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dvcmtxdWV1ZS5oCkBAIC00NTQsNiArNDU0LDcgQEAKIGV4dGVybiB1bnNpZ25lZCBpbnQgd29ya19idXN5KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiBleHRlcm4gX19wcmludGYoMSwgMikgdm9pZCBzZXRfd29ya2VyX2Rlc2MoY29uc3QgY2hhciAqZm10LCAuLi4pOwogZXh0ZXJuIHZvaWQgcHJpbnRfd29ya2VyX2luZm8oY29uc3QgY2hhciAqbG9nX2x2bCwgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKK2V4dGVybiB2b2lkIHNob3dfd29ya3F1ZXVlX3N0YXRlKHZvaWQpOwogCiAvKioKICAqIHF1ZXVlX3dvcmsgLSBxdWV1ZSB3b3JrIG9uIGEgd29ya3F1ZXVlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oIGIvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaAppbmRleCAwMDA0ODMzLi5iMmRkMzcxZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC93cml0ZWJhY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L3dyaXRlYmFjay5oCkBAIC0xMzAsNiArMTMwLDcgQEAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHZtX2RpcnR5X2J5dGVzOwogZXh0ZXJuIHVuc2lnbmVkIGludCBkaXJ0eV93cml0ZWJhY2tfaW50ZXJ2YWw7CiBleHRlcm4gdW5zaWduZWQgaW50IGRpcnR5X2V4cGlyZV9pbnRlcnZhbDsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZGlydHl0aW1lX2V4cGlyZV9pbnRlcnZhbDsKIGV4dGVybiBpbnQgdm1faGlnaG1lbV9pc19kaXJ0eWFibGU7CiBleHRlcm4gaW50IGJsb2NrX2R1bXA7CiBleHRlcm4gaW50IGxhcHRvcF9tb2RlOwpAQCAtMTQ2LDYgKzE0Nyw4IEBACiBleHRlcm4gaW50IGRpcnR5X2J5dGVzX2hhbmRsZXIoc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKIAkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAogCQlsb2ZmX3QgKnBwb3MpOworaW50IGRpcnR5dGltZV9pbnRlcnZhbF9oYW5kbGVyKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQkgICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpOwogCiBzdHJ1Y3QgY3RsX3RhYmxlOwogaW50IGRpcnR5X3dyaXRlYmFja19jZW50aXNlY3NfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICosIGludCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvenNtYWxsb2MuaCBiL2luY2x1ZGUvbGludXgvenNtYWxsb2MuaAppbmRleCAzMjgzYzZhLi4xMzM4MTkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3pzbWFsbG9jLmgKKysrIGIvaW5jbHVkZS9saW51eC96c21hbGxvYy5oCkBAIC00Nyw1ICs0Nyw2IEBACiB2b2lkIHpzX3VubWFwX29iamVjdChzdHJ1Y3QgenNfcG9vbCAqcG9vbCwgdW5zaWduZWQgbG9uZyBoYW5kbGUpOwogCiB1bnNpZ25lZCBsb25nIHpzX2dldF90b3RhbF9wYWdlcyhzdHJ1Y3QgenNfcG9vbCAqcG9vbCk7Cit1bnNpZ25lZCBsb25nIHpzX2NvbXBhY3Qoc3RydWN0IHpzX3Bvb2wgKnBvb2wpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvYXRtZWwtaXNpLmggYi9pbmNsdWRlL21lZGlhL2F0bWVsLWlzaS5oCmluZGV4IGMyZTU3MDMuLjYwMDhiMDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvYXRtZWwtaXNpLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9hdG1lbC1pc2kuaApAQCAtNTksNiArNTksMTAgQEAKICNkZWZpbmUJCUlTSV9DRkcxX0ZSQVRFX0RJVl9NQVNLCQkoNyA8PCA4KQogI2RlZmluZSBJU0lfQ0ZHMV9ESVNDUgkJCQkoMSA8PCAxMSkKICNkZWZpbmUgSVNJX0NGRzFfRlVMTF9NT0RFCQkJKDEgPDwgMTIpCisvKiBEZWZpbml0aW9uIGZvciBUSE1BU0soSVNJX1YyKSAqLworI2RlZmluZQkJSVNJX0NGRzFfVEhNQVNLX0JFQVRTXzQJCSgwIDw8IDEzKQorI2RlZmluZQkJSVNJX0NGRzFfVEhNQVNLX0JFQVRTXzgJCSgxIDw8IDEzKQorI2RlZmluZQkJSVNJX0NGRzFfVEhNQVNLX0JFQVRTXzE2CSgyIDw8IDEzKQogCiAvKiBCaXRmaWVsZHMgaW4gQ0ZHMiAqLwogI2RlZmluZSBJU0lfQ0ZHMl9HUkFZU0NBTEUJCQkoMSA8PCAxMykKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0LzlwL2NsaWVudC5oIGIvaW5jbHVkZS9uZXQvOXAvY2xpZW50LmgKaW5kZXggNmZhYjY2Yy4uYzZiOTdlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvOXAvY2xpZW50LmgKKysrIGIvaW5jbHVkZS9uZXQvOXAvY2xpZW50LmgKQEAgLTIxMSw2ICsyMTEsOCBAQAogCWNoYXIgZF9uYW1lWzI1Nl07CiB9OwogCitzdHJ1Y3QgaW92X2l0ZXI7CisKIGludCBwOV9jbGllbnRfc3RhdGZzKHN0cnVjdCBwOV9maWQgKmZpZCwgc3RydWN0IHA5X3JzdGF0ZnMgKnNiKTsKIGludCBwOV9jbGllbnRfcmVuYW1lKHN0cnVjdCBwOV9maWQgKmZpZCwgc3RydWN0IHA5X2ZpZCAqbmV3ZGlyZmlkLAogCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwpAQCAtMjM2LDEwICsyMzgsOCBAQAogaW50IHA5X2NsaWVudF9mc3luYyhzdHJ1Y3QgcDlfZmlkICpmaWQsIGludCBkYXRhc3luYyk7CiBpbnQgcDlfY2xpZW50X3JlbW92ZShzdHJ1Y3QgcDlfZmlkICpmaWQpOwogaW50IHA5X2NsaWVudF91bmxpbmthdChzdHJ1Y3QgcDlfZmlkICpkZmlkLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpOwotaW50IHA5X2NsaWVudF9yZWFkKHN0cnVjdCBwOV9maWQgKmZpZCwgY2hhciAqZGF0YSwgY2hhciBfX3VzZXIgKnVkYXRhLAotCQkJCQkJCXU2NCBvZmZzZXQsIHUzMiBjb3VudCk7Ci1pbnQgcDlfY2xpZW50X3dyaXRlKHN0cnVjdCBwOV9maWQgKmZpZCwgY2hhciAqZGF0YSwgY29uc3QgY2hhciBfX3VzZXIgKnVkYXRhLAotCQkJCQkJCXU2NCBvZmZzZXQsIHUzMiBjb3VudCk7CitpbnQgcDlfY2xpZW50X3JlYWQoc3RydWN0IHA5X2ZpZCAqZmlkLCB1NjQgb2Zmc2V0LCBzdHJ1Y3QgaW92X2l0ZXIgKnRvLCBpbnQgKmVycik7CitpbnQgcDlfY2xpZW50X3dyaXRlKHN0cnVjdCBwOV9maWQgKmZpZCwgdTY0IG9mZnNldCwgc3RydWN0IGlvdl9pdGVyICpmcm9tLCBpbnQgKmVycik7CiBpbnQgcDlfY2xpZW50X3JlYWRkaXIoc3RydWN0IHA5X2ZpZCAqZmlkLCBjaGFyICpkYXRhLCB1MzIgY291bnQsIHU2NCBvZmZzZXQpOwogaW50IHA5ZGlyZW50X3JlYWQoc3RydWN0IHA5X2NsaWVudCAqY2xudCwgY2hhciAqYnVmLCBpbnQgbGVuLAogCQkgIHN0cnVjdCBwOV9kaXJlbnQgKmRpcmVudCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC85cC90cmFuc3BvcnQuaCBiL2luY2x1ZGUvbmV0LzlwL3RyYW5zcG9ydC5oCmluZGV4IDJhMjVkZWMuLjUxMjJiNWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0LzlwL3RyYW5zcG9ydC5oCisrKyBiL2luY2x1ZGUvbmV0LzlwL3RyYW5zcG9ydC5oCkBAIC02MSw3ICs2MSw3IEBACiAJaW50ICgqY2FuY2VsKSAoc3RydWN0IHA5X2NsaWVudCAqLCBzdHJ1Y3QgcDlfcmVxX3QgKnJlcSk7CiAJaW50ICgqY2FuY2VsbGVkKShzdHJ1Y3QgcDlfY2xpZW50ICosIHN0cnVjdCBwOV9yZXFfdCAqcmVxKTsKIAlpbnQgKCp6Y19yZXF1ZXN0KShzdHJ1Y3QgcDlfY2xpZW50ICosIHN0cnVjdCBwOV9yZXFfdCAqLAotCQkJICBjaGFyICosIGNoYXIgKiwgaW50ICwgaW50LCBpbnQsIGludCk7CisJCQkgIHN0cnVjdCBpb3ZfaXRlciAqLCBzdHJ1Y3QgaW92X2l0ZXIgKiwgaW50ICwgaW50LCBpbnQpOwogfTsKIAogdm9pZCB2OWZzX3JlZ2lzdGVyX3RyYW5zKHN0cnVjdCBwOV90cmFuc19tb2R1bGUgKm0pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYWZfdnNvY2suaCBiL2luY2x1ZGUvbmV0L2FmX3Zzb2NrLmgKaW5kZXggMGQ4NzY3NC4uMTcyNjMyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYWZfdnNvY2suaAorKysgYi9pbmNsdWRlL25ldC9hZl92c29jay5oCkBAIC0xMDAsOCArMTAwLDggQEAKIAogCS8qIERHUkFNLiAqLwogCWludCAoKmRncmFtX2JpbmQpKHN0cnVjdCB2c29ja19zb2NrICosIHN0cnVjdCBzb2NrYWRkcl92bSAqKTsKLQlpbnQgKCpkZ3JhbV9kZXF1ZXVlKShzdHJ1Y3Qga2lvY2IgKmtpb2NiLCBzdHJ1Y3QgdnNvY2tfc29jayAqdnNrLAotCQkJICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncyk7CisJaW50ICgqZGdyYW1fZGVxdWV1ZSkoc3RydWN0IHZzb2NrX3NvY2sgKnZzaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJICAgICBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpOwogCWludCAoKmRncmFtX2VucXVldWUpKHN0cnVjdCB2c29ja19zb2NrICosIHN0cnVjdCBzb2NrYWRkcl92bSAqLAogCQkJICAgICBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCBsZW4pOwogCWJvb2wgKCpkZ3JhbV9hbGxvdykodTMyIGNpZCwgdTMyIHBvcnQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYXJwLmggYi9pbmNsdWRlL25ldC9hcnAuaAppbmRleCA3M2M0OTg2Li41ZTBmODkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hcnAuaAorKysgYi9pbmNsdWRlL25ldC9hcnAuaApAQCAtOSwyOCArOSwxNyBAQAogCiBleHRlcm4gc3RydWN0IG5laWdoX3RhYmxlIGFycF90Ymw7CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGFycF9oYXNoZm4odTMyIGtleSwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGhhc2hfcm5kKQorc3RhdGljIGlubGluZSB1MzIgYXJwX2hhc2hmbihjb25zdCB2b2lkICpwa2V5LCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgKmhhc2hfcm5kKQogeworCXUzMiBrZXkgPSAqKGNvbnN0IHUzMiAqKXBrZXk7CiAJdTMyIHZhbCA9IGtleSBeIGhhc2gzMl9wdHIoZGV2KTsKIAotCXJldHVybiB2YWwgKiBoYXNoX3JuZDsKKwlyZXR1cm4gdmFsICogaGFzaF9ybmRbMF07CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5laWdoYm91ciAqX19pcHY0X25laWdoX2xvb2t1cF9ub3JlZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIga2V5KQogewotCXN0cnVjdCBuZWlnaF9oYXNoX3RhYmxlICpuaHQgPSByY3VfZGVyZWZlcmVuY2VfYmgoYXJwX3RibC5uaHQpOwotCXN0cnVjdCBuZWlnaGJvdXIgKm47Ci0JdTMyIGhhc2hfdmFsOwotCi0JaGFzaF92YWwgPSBhcnBfaGFzaGZuKGtleSwgZGV2LCBuaHQtPmhhc2hfcm5kWzBdKSA+PiAoMzIgLSBuaHQtPmhhc2hfc2hpZnQpOwotCWZvciAobiA9IHJjdV9kZXJlZmVyZW5jZV9iaChuaHQtPmhhc2hfYnVja2V0c1toYXNoX3ZhbF0pOwotCSAgICAgbiAhPSBOVUxMOwotCSAgICAgbiA9IHJjdV9kZXJlZmVyZW5jZV9iaChuLT5uZXh0KSkgewotCQlpZiAobi0+ZGV2ID09IGRldiAmJiAqKHUzMiAqKW4tPnByaW1hcnlfa2V5ID09IGtleSkKLQkJCXJldHVybiBuOwotCX0KLQotCXJldHVybiBOVUxMOworCXJldHVybiBfX19uZWlnaF9sb29rdXBfbm9yZWYoJmFycF90YmwsIG5laWdoX2tleV9lcTMyLCBhcnBfaGFzaGZuLCAma2V5LCBkZXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZWlnaGJvdXIgKl9faXB2NF9uZWlnaF9sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGtleSkKQEAgLTQ3LDcgKzM2LDYgQEAKIH0KIAogdm9pZCBhcnBfaW5pdCh2b2lkKTsKLWludCBhcnBfZmluZCh1bnNpZ25lZCBjaGFyICpoYWRkciwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgYXJwX2lvY3RsKHN0cnVjdCBuZXQgKm5ldCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZyk7CiB2b2lkIGFycF9zZW5kKGludCB0eXBlLCBpbnQgcHR5cGUsIF9fYmUzMiBkZXN0X2lwLAogCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUzMiBzcmNfaXAsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9heDI1LmggYi9pbmNsdWRlL25ldC9heDI1LmgKaW5kZXggYmYwMzk2ZS4uMTZhOTIzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYXgyNS5oCisrKyBiL2luY2x1ZGUvbmV0L2F4MjUuaApAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bmV0L25laWdoYm91ci5oPgogCiAjZGVmaW5lCUFYMjVfVDFDTEFNUExPICAJCTEKICNkZWZpbmUJQVgyNV9UMUNMQU1QSEkgCQkJKDMwICogSFopCkBAIC0zNjYsOSArMzY3LDcgQEAKIAkJICBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIAogLyogYXgyNV9pcC5jICovCi1pbnQgYXgyNV9oYXJkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqLCB1bnNpZ25lZCBzaG9ydCwKLQkJICAgICBjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKiwgdW5zaWduZWQgaW50KTsKLWludCBheDI1X3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICopOworbmV0ZGV2X3R4X3QgYXgyNV9pcF94bWl0KHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBoZWFkZXJfb3BzIGF4MjVfaGVhZGVyX29wczsKIAogLyogYXgyNV9vdXQuYyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oCmluZGV4IGUwMDQ1NWEuLjdkYmE4MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmgKQEAgLTI0NSwxMCArMjQ1LDEwIEBACiB2b2lkIGJ0X3NvY2tfdW5yZWdpc3RlcihpbnQgcHJvdG8pOwogdm9pZCBidF9zb2NrX2xpbmsoc3RydWN0IGJ0X3NvY2tfbGlzdCAqbCwgc3RydWN0IHNvY2sgKnMpOwogdm9pZCBidF9zb2NrX3VubGluayhzdHJ1Y3QgYnRfc29ja19saXN0ICpsLCBzdHJ1Y3Qgc29jayAqcyk7Ci1pbnQgIGJ0X3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpOwotaW50ICBidF9zb2NrX3N0cmVhbV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IGZsYWdzKTsKK2ludCAgYnRfc29ja19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJICAgICBpbnQgZmxhZ3MpOworaW50ICBidF9zb2NrX3N0cmVhbV9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpOwogdWludCBidF9zb2NrX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHBvbGxfdGFibGUgKndhaXQpOwogaW50ICBidF9zb2NrX2lvY3RsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKIGludCAgYnRfc29ja193YWl0X3N0YXRlKHN0cnVjdCBzb2NrICpzaywgaW50IHN0YXRlLCB1bnNpZ25lZCBsb25nIHRpbWVvKTsKQEAgLTI2OSwyOSArMjY5LDM0IEBACiAJX191MTYJcmVxc2VxOwogCV9fdTE2CXR4c2VxOwogCV9fdTgJcmV0cmllczsKKwlfX2xlMTYgIHBzbTsKKwliZGFkZHJfdCBiZGFkZHI7CisJc3RydWN0IGwyY2FwX2NoYW4gKmNoYW47CiB9OwogCiBzdHJ1Y3QgaGNpX2RldjsKIAogdHlwZWRlZiB2b2lkICgqaGNpX3JlcV9jb21wbGV0ZV90KShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzLCB1MTYgb3Bjb2RlKTsKK3R5cGVkZWYgdm9pZCAoKmhjaV9yZXFfY29tcGxldGVfc2tiX3QpKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMsCisJCQkJICAgICAgIHUxNiBvcGNvZGUsIHN0cnVjdCBza19idWZmICpza2IpOwogCi1zdHJ1Y3QgaGNpX3JlcV9jdHJsIHsKLQlib29sCQkJc3RhcnQ7Ci0JdTgJCQlldmVudDsKLQloY2lfcmVxX2NvbXBsZXRlX3QJY29tcGxldGU7CitzdHJ1Y3QgcmVxX2N0cmwgeworCWJvb2wgc3RhcnQ7CisJdTggZXZlbnQ7CisJaGNpX3JlcV9jb21wbGV0ZV90IGNvbXBsZXRlOworCWhjaV9yZXFfY29tcGxldGVfc2tiX3QgY29tcGxldGVfc2tiOwogfTsKIAogc3RydWN0IGJ0X3NrYl9jYiB7CiAJX191OCBwa3RfdHlwZTsKLQlfX3U4IGluY29taW5nOworCV9fdTggZm9yY2VfYWN0aXZlOwogCV9fdTE2IG9wY29kZTsKIAlfX3UxNiBleHBlY3Q7Ci0JX191OCBmb3JjZV9hY3RpdmU7Ci0Jc3RydWN0IGwyY2FwX2NoYW4gKmNoYW47Ci0Jc3RydWN0IGwyY2FwX2N0cmwgY29udHJvbDsKLQlzdHJ1Y3QgaGNpX3JlcV9jdHJsIHJlcTsKLQliZGFkZHJfdCBiZGFkZHI7Ci0JX19sZTE2IHBzbTsKKwlfX3U4IGluY29taW5nOjE7CisJdW5pb24geworCQlzdHJ1Y3QgbDJjYXBfY3RybCBsMmNhcDsKKwkJc3RydWN0IHJlcV9jdHJsIHJlcTsKKwl9OwogfTsKICNkZWZpbmUgYnRfY2Ioc2tiKSAoKHN0cnVjdCBidF9za2JfY2IgKikoKHNrYiktPmNiKSkKIApAQCAtMzM5LDYgKzM0NCwxMSBAQAogCiBpbnQgYnRfdG9fZXJybm8oX191MTYgY29kZSk7CiAKK3ZvaWQgaGNpX3NvY2tfc2V0X2ZsYWcoc3RydWN0IHNvY2sgKnNrLCBpbnQgbnIpOwordm9pZCBoY2lfc29ja19jbGVhcl9mbGFnKHN0cnVjdCBzb2NrICpzaywgaW50IG5yKTsKK2ludCBoY2lfc29ja190ZXN0X2ZsYWcoc3RydWN0IHNvY2sgKnNrLCBpbnQgbnIpOwordW5zaWduZWQgc2hvcnQgaGNpX3NvY2tfZ2V0X2NoYW5uZWwoc3RydWN0IHNvY2sgKnNrKTsKKwogaW50IGhjaV9zb2NrX2luaXQodm9pZCk7CiB2b2lkIGhjaV9zb2NrX2NsZWFudXAodm9pZCk7CiAKQEAgLTM1OCw2ICszNjgsOSBAQAogaW50IHNjb19pbml0KHZvaWQpOwogdm9pZCBzY29fZXhpdCh2b2lkKTsKIAoraW50IG1nbXRfaW5pdCh2b2lkKTsKK3ZvaWQgbWdtdF9leGl0KHZvaWQpOworCiB2b2lkIGJ0X3NvY2tfcmVjbGFzc2lmeV9sb2NrKHN0cnVjdCBzb2NrICpzaywgaW50IHByb3RvKTsKIAogI2VuZGlmIC8qIF9fQkxVRVRPT1RIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaAppbmRleCA4ZTU0ZjgyLi5kOTVkYTgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCkBAIC0xNjAsNiArMTYwLDE0IEBACiAJICogZHVyaW5nIHRoZSBoZGV2LT5zZXR1cCB2ZW5kb3IgY2FsbGJhY2suCiAJICovCiAJSENJX1FVSVJLX1NUUklDVF9EVVBMSUNBVEVfRklMVEVSLAorCisJLyogV2hlbiB0aGlzIHF1aXJrIGlzIHNldCwgTEUgc2NhbiBhbmQgQlIvRURSIGlucXVpcnkgaXMgZG9uZQorCSAqIHNpbXVsdGFuZW91c2x5LCBvdGhlcndpc2UgaXQncyBpbnRlcmxlYXZlZC4KKwkgKgorCSAqIFRoaXMgcXVpcmsgY2FuIGJlIHNldCBiZWZvcmUgaGNpX3JlZ2lzdGVyX2RldiBpcyBjYWxsZWQgb3IKKwkgKiBkdXJpbmcgdGhlIGhkZXYtPnNldHVwIHZlbmRvciBjYWxsYmFjay4KKwkgKi8KKwlIQ0lfUVVJUktfU0lNVUxUQU5FT1VTX0RJU0NPVkVSWSwKIH07CiAKIC8qIEhDSSBkZXZpY2UgZmxhZ3MgKi8KQEAgLTE3OSwxMyArMTg3LDE0IEBACiAJSENJX1JFU0VULAogfTsKIAotLyogQlIvRURSIGFuZC9vciBMRSBjb250cm9sbGVyIGZsYWdzOiB0aGUgZmxhZ3MgZGVmaW5lZCBoZXJlIHNob3VsZCByZXByZXNlbnQKLSAqIHN0YXRlcyBjb25maWd1cmVkIHZpYSBkZWJ1Z2ZzIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcgcHVycG9zZXMgb25seS4KLSAqLworLyogSENJIHNvY2tldCBmbGFncyAqLwogZW51bSB7Ci0JSENJX0RVVF9NT0RFLAotCUhDSV9GT1JDRV9CUkVEUl9TTVAsCi0JSENJX0ZPUkNFX1NUQVRJQ19BRERSLAorCUhDSV9TT0NLX1RSVVNURUQsCisJSENJX01HTVRfSU5ERVhfRVZFTlRTLAorCUhDSV9NR01UX1VOQ09ORl9JTkRFWF9FVkVOVFMsCisJSENJX01HTVRfRVhUX0lOREVYX0VWRU5UUywKKwlIQ0lfTUdNVF9HRU5FUklDX0VWRU5UUywKKwlIQ0lfTUdNVF9PT0JfREFUQV9FVkVOVFMsCiB9OwogCiAvKgpAQCAtMjE3LDYgKzIyNiw4IEBACiAJSENJX0hTX0VOQUJMRUQsCiAJSENJX0xFX0VOQUJMRUQsCiAJSENJX0FEVkVSVElTSU5HLAorCUhDSV9BRFZFUlRJU0lOR19DT05ORUNUQUJMRSwKKwlIQ0lfQURWRVJUSVNJTkdfSU5TVEFOQ0UsCiAJSENJX0NPTk5FQ1RBQkxFLAogCUhDSV9ESVNDT1ZFUkFCTEUsCiAJSENJX0xJTUlURURfRElTQ09WRVJBQkxFLApAQCAtMjI1LDEzICsyMzYsMTMgQEAKIAlIQ0lfRkFTVF9DT05ORUNUQUJMRSwKIAlIQ0lfQlJFRFJfRU5BQkxFRCwKIAlIQ0lfTEVfU0NBTl9JTlRFUlJVUFRFRCwKLX07CiAKLS8qIEEgbWFzayBmb3IgdGhlIGZsYWdzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIHJlbWFpbiB3aGVuIGEgcmVzZXQgaGFwcGVucwotICogb3IgdGhlIEhDSSBkZXZpY2UgaXMgY2xvc2VkLgotICovCi0jZGVmaW5lIEhDSV9QRVJTSVNURU5UX01BU0sgKEJJVChIQ0lfTEVfU0NBTikgfCBCSVQoSENJX1BFUklPRElDX0lOUSkgfCBcCi0JCQkgICAgICBCSVQoSENJX0ZBU1RfQ09OTkVDVEFCTEUpIHwgQklUKEhDSV9MRV9BRFYpKQorCUhDSV9EVVRfTU9ERSwKKwlIQ0lfRk9SQ0VfQlJFRFJfU01QLAorCUhDSV9GT1JDRV9TVEFUSUNfQUREUiwKKworCV9fSENJX05VTV9GTEFHUywKK307CiAKIC8qIEhDSSB0aW1lb3V0cyAqLwogI2RlZmluZSBIQ0lfRElTQ09OTl9USU1FT1VUCW1zZWNzX3RvX2ppZmZpZXMoMjAwMCkJLyogMiBzZWNvbmRzICovCkBAIC0zNjMsNiArMzc0LDcgQEAKIC8qIExFIGZlYXR1cmVzICovCiAjZGVmaW5lIEhDSV9MRV9FTkNSWVBUSU9OCQkweDAxCiAjZGVmaW5lIEhDSV9MRV9DT05OX1BBUkFNX1JFUV9QUk9DCTB4MDIKKyNkZWZpbmUgSENJX0xFX1NMQVZFX0ZFQVRVUkVTCQkweDA4CiAjZGVmaW5lIEhDSV9MRV9QSU5HCQkJMHgxMAogI2RlZmluZSBIQ0lfTEVfREFUQV9MRU5fRVhUCQkweDIwCiAjZGVmaW5lIEhDSV9MRV9FWFRfU0NBTl9QT0xJQ1kJCTB4ODAKQEAgLTQ1Miw5ICs0NjQsMTYgQEAKICNkZWZpbmUgRUlSX05BTUVfQ09NUExFVEUJMHgwOSAvKiBjb21wbGV0ZSBsb2NhbCBuYW1lICovCiAjZGVmaW5lIEVJUl9UWF9QT1dFUgkJMHgwQSAvKiB0cmFuc21pdCBwb3dlciBsZXZlbCAqLwogI2RlZmluZSBFSVJfQ0xBU1NfT0ZfREVWCTB4MEQgLyogQ2xhc3Mgb2YgRGV2aWNlICovCi0jZGVmaW5lIEVJUl9TU1BfSEFTSF9DCQkweDBFIC8qIFNpbXBsZSBQYWlyaW5nIEhhc2ggQyAqLwotI2RlZmluZSBFSVJfU1NQX1JBTkRfUgkJMHgwRiAvKiBTaW1wbGUgUGFpcmluZyBSYW5kb21pemVyIFIgKi8KKyNkZWZpbmUgRUlSX1NTUF9IQVNIX0MxOTIJMHgwRSAvKiBTaW1wbGUgUGFpcmluZyBIYXNoIEMtMTkyICovCisjZGVmaW5lIEVJUl9TU1BfUkFORF9SMTkyCTB4MEYgLyogU2ltcGxlIFBhaXJpbmcgUmFuZG9taXplciBSLTE5MiAqLwogI2RlZmluZSBFSVJfREVWSUNFX0lECQkweDEwIC8qIGRldmljZSBJRCAqLworI2RlZmluZSBFSVJfQVBQRUFSQU5DRQkJMHgxOSAvKiBEZXZpY2UgYXBwZWFyYW5jZSAqLworI2RlZmluZSBFSVJfTEVfQkRBRERSCQkweDFCIC8qIExFIEJsdWV0b290aCBkZXZpY2UgYWRkcmVzcyAqLworI2RlZmluZSBFSVJfTEVfUk9MRQkJMHgxQyAvKiBMRSByb2xlICovCisjZGVmaW5lIEVJUl9TU1BfSEFTSF9DMjU2CTB4MUQgLyogU2ltcGxlIFBhaXJpbmcgSGFzaCBDLTI1NiAqLworI2RlZmluZSBFSVJfU1NQX1JBTkRfUjI1NgkweDFFIC8qIFNpbXBsZSBQYWlyaW5nIFJhbmQgUi0yNTYgKi8KKyNkZWZpbmUgRUlSX0xFX1NDX0NPTkZJUk0JMHgyMiAvKiBMRSBTQyBDb25maXJtYXRpb24gVmFsdWUgKi8KKyNkZWZpbmUgRUlSX0xFX1NDX1JBTkRPTQkweDIzIC8qIExFIFNDIFJhbmRvbSBWYWx1ZSAqLwogCiAvKiBMb3cgRW5lcmd5IEFkdmVydGlzaW5nIEZsYWdzICovCiAjZGVmaW5lIExFX0FEX0xJTUlURUQJCTB4MDEgLyogTGltaXRlZCBEaXNjb3ZlcmFibGUgKi8KQEAgLTEzNTgsNiArMTM3NywxMSBAQAogCV9fbGUxNiAgIG1heF9jZV9sZW47CiB9IF9fcGFja2VkOwogCisjZGVmaW5lIEhDSV9PUF9MRV9SRUFEX1JFTU9URV9GRUFUVVJFUwkweDIwMTYKK3N0cnVjdCBoY2lfY3BfbGVfcmVhZF9yZW1vdGVfZmVhdHVyZXMgeworCV9fbGUxNgkgaGFuZGxlOworfSBfX3BhY2tlZDsKKwogI2RlZmluZSBIQ0lfT1BfTEVfU1RBUlRfRU5DCQkweDIwMTkKIHN0cnVjdCBoY2lfY3BfbGVfc3RhcnRfZW5jIHsKIAlfX2xlMTYJaGFuZGxlOwpAQCAtMTg1MCw2ICsxODc0LDEzIEBACiAJX19sZTE2ICAgc3VwZXJ2aXNpb25fdGltZW91dDsKIH0gX19wYWNrZWQ7CiAKKyNkZWZpbmUgSENJX0VWX0xFX1JFTU9URV9GRUFUX0NPTVBMRVRFCTB4MDQKK3N0cnVjdCBoY2lfZXZfbGVfcmVtb3RlX2ZlYXRfY29tcGxldGUgeworCV9fdTggICAgIHN0YXR1czsKKwlfX2xlMTYgICBoYW5kbGU7CisJX191OCAgICAgZmVhdHVyZXNbOF07Cit9IF9fcGFja2VkOworCiAjZGVmaW5lIEhDSV9FVl9MRV9MVEtfUkVRCQkweDA1CiBzdHJ1Y3QgaGNpX2V2X2xlX2x0a19yZXEgewogCV9fbGUxNgloYW5kbGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCmluZGV4IDUyODYzYzMuLmEwNTZjMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCkBAIC03Niw2ICs3Niw3IEBACiAJdTgJCQlsYXN0X2Fkdl9kYXRhW0hDSV9NQVhfQURfTEVOR1RIXTsKIAl1OAkJCWxhc3RfYWR2X2RhdGFfbGVuOwogCWJvb2wJCQlyZXBvcnRfaW52YWxpZF9yc3NpOworCWJvb2wJCQlyZXN1bHRfZmlsdGVyaW5nOwogCXM4CQkJcnNzaTsKIAl1MTYJCQl1dWlkX2NvdW50OwogCXU4CQkJKCp1dWlkcylbMTZdOwpAQCAtMTA4LDcgKzEwOSw3IEBACiBzdHJ1Y3Qgc21wX2NzcmsgewogCWJkYWRkcl90IGJkYWRkcjsKIAl1OCBiZGFkZHJfdHlwZTsKLQl1OCBtYXN0ZXI7CisJdTggdHlwZTsKIAl1OCB2YWxbMTZdOwogfTsKIApAQCAtMTU0LDYgKzE1NSwxNyBAQAogCXU4IHJhbmQyNTZbMTZdOwogfTsKIAorc3RydWN0IGFkdl9pbmZvIHsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIHRpbWVvdXRfZXhwOworCV9fdTgJaW5zdGFuY2U7CisJX191MzIJZmxhZ3M7CisJX191MTYJdGltZW91dDsKKwlfX3UxNglhZHZfZGF0YV9sZW47CisJX191OAlhZHZfZGF0YVtIQ0lfTUFYX0FEX0xFTkdUSF07CisJX191MTYJc2Nhbl9yc3BfbGVuOworCV9fdTgJc2Nhbl9yc3BfZGF0YVtIQ0lfTUFYX0FEX0xFTkdUSF07Cit9OworCiAjZGVmaW5lIEhDSV9NQVhfU0hPUlRfTkFNRV9MRU5HVEgJMTAKIAogLyogRGVmYXVsdCBMRSBSUEEgZXhwaXJ5IHRpbWUsIDE1IG1pbnV0ZXMgKi8KQEAgLTE3Myw3ICsxODUsNiBAQAogCiAjZGVmaW5lIEhDSV9NQVhfUEFHRVMJMwogCi0jZGVmaW5lIE5VTV9SRUFTU0VNQkxZIDQKIHN0cnVjdCBoY2lfZGV2IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IG11dGV4CWxvY2s7CkBAIC0zMTQsMTQgKzMyNSwxMyBAQAogCXN0cnVjdCBza19idWZmX2hlYWQJcmF3X3E7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZAljbWRfcTsKIAotCXN0cnVjdCBza19idWZmCQkqcmVjdl9ldnQ7CiAJc3RydWN0IHNrX2J1ZmYJCSpzZW50X2NtZDsKLQlzdHJ1Y3Qgc2tfYnVmZgkJKnJlYXNzZW1ibHlbTlVNX1JFQVNTRU1CTFldOwogCiAJc3RydWN0IG11dGV4CQlyZXFfbG9jazsKIAl3YWl0X3F1ZXVlX2hlYWRfdAlyZXFfd2FpdF9xOwogCV9fdTMyCQkJcmVxX3N0YXR1czsKIAlfX3UzMgkJCXJlcV9yZXN1bHQ7CisJc3RydWN0IHNrX2J1ZmYJCSpyZXFfc2tiOwogCiAJdm9pZAkJCSpzbXBfZGF0YTsKIAl2b2lkCQkJKnNtcF9icmVkcl9kYXRhOwpAQCAtMzUyLDggKzM2Miw3IEBACiAKIAlzdHJ1Y3QgcmZraWxsCQkqcmZraWxsOwogCi0JdW5zaWduZWQgbG9uZwkJZGJnX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcJCWRldl9mbGFnczsKKwlERUNMQVJFX0JJVE1BUChkZXZfZmxhZ3MsIF9fSENJX05VTV9GTEFHUyk7CiAKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCWxlX3NjYW5fZGlzYWJsZTsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrCWxlX3NjYW5fcmVzdGFydDsKQEAgLTM2NCw2ICszNzMsOCBAQAogCV9fdTgJCQlzY2FuX3JzcF9kYXRhW0hDSV9NQVhfQURfTEVOR1RIXTsKIAlfX3U4CQkJc2Nhbl9yc3BfZGF0YV9sZW47CiAKKwlzdHJ1Y3QgYWR2X2luZm8JCWFkdl9pbnN0YW5jZTsKKwogCV9fdTgJCQlpcmtbMTZdOwogCV9fdTMyCQkJcnBhX3RpbWVvdXQ7CiAJc3RydWN0IGRlbGF5ZWRfd29yawlycGFfZXhwaXJlZDsKQEAgLTM3Myw2ICszODQsNyBAQAogCWludCAoKmNsb3NlKShzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiAJaW50ICgqZmx1c2gpKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIAlpbnQgKCpzZXR1cCkoc3RydWN0IGhjaV9kZXYgKmhkZXYpOworCWludCAoKnNodXRkb3duKShzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiAJaW50ICgqc2VuZCkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpOwogCXZvaWQgKCpub3RpZnkpKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1bnNpZ25lZCBpbnQgZXZ0KTsKIAl2b2lkICgqaHdfZXJyb3IpKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBjb2RlKTsKQEAgLTQ5OCwxOSArNTEwLDI5IEBACiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBoY2lfZGV2X2xpc3Q7CiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBoY2lfY2JfbGlzdDsKIGV4dGVybiByd2xvY2tfdCBoY2lfZGV2X2xpc3RfbG9jazsKLWV4dGVybiByd2xvY2tfdCBoY2lfY2JfbGlzdF9sb2NrOworZXh0ZXJuIHN0cnVjdCBtdXRleCBoY2lfY2JfbGlzdF9sb2NrOworCisjZGVmaW5lIGhjaV9kZXZfc2V0X2ZsYWcoaGRldiwgbnIpICAgICAgICAgICAgIHNldF9iaXQoKG5yKSwgKGhkZXYpLT5kZXZfZmxhZ3MpCisjZGVmaW5lIGhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBucikgICAgICAgICAgIGNsZWFyX2JpdCgobnIpLCAoaGRldiktPmRldl9mbGFncykKKyNkZWZpbmUgaGNpX2Rldl9jaGFuZ2VfZmxhZyhoZGV2LCBucikgICAgICAgICAgY2hhbmdlX2JpdCgobnIpLCAoaGRldiktPmRldl9mbGFncykKKyNkZWZpbmUgaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgbnIpICAgICAgICAgICAgdGVzdF9iaXQoKG5yKSwgKGhkZXYpLT5kZXZfZmxhZ3MpCisjZGVmaW5lIGhjaV9kZXZfdGVzdF9hbmRfc2V0X2ZsYWcoaGRldiwgbnIpICAgIHRlc3RfYW5kX3NldF9iaXQoKG5yKSwgKGhkZXYpLT5kZXZfZmxhZ3MpCisjZGVmaW5lIGhjaV9kZXZfdGVzdF9hbmRfY2xlYXJfZmxhZyhoZGV2LCBucikgIHRlc3RfYW5kX2NsZWFyX2JpdCgobnIpLCAoaGRldiktPmRldl9mbGFncykKKyNkZWZpbmUgaGNpX2Rldl90ZXN0X2FuZF9jaGFuZ2VfZmxhZyhoZGV2LCBucikgdGVzdF9hbmRfY2hhbmdlX2JpdCgobnIpLCAoaGRldiktPmRldl9mbGFncykKKworI2RlZmluZSBoY2lfZGV2X2NsZWFyX3ZvbGF0aWxlX2ZsYWdzKGhkZXYpCQkJXAorCWRvIHsJCQkJCQkJXAorCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX0xFX1NDQU4pOwkJXAorCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX0xFX0FEVik7CQlcCisJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfUEVSSU9ESUNfSU5RKTsJXAorCX0gd2hpbGUgKDApCiAKIC8qIC0tLS0tIEhDSSBpbnRlcmZhY2UgdG8gdXBwZXIgcHJvdG9jb2xzIC0tLS0tICovCiBpbnQgbDJjYXBfY29ubmVjdF9pbmQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIpOwotdm9pZCBsMmNhcF9jb25uZWN0X2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHU4IHN0YXR1cyk7CiBpbnQgbDJjYXBfZGlzY29ubl9pbmQoc3RydWN0IGhjaV9jb25uICpoY29uKTsKLXZvaWQgbDJjYXBfZGlzY29ubl9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCB1OCByZWFzb24pOwotaW50IGwyY2FwX3NlY3VyaXR5X2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHU4IHN0YXR1cywgdTggZW5jcnlwdCk7CiBpbnQgbDJjYXBfcmVjdl9hY2xkYXRhKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGZsYWdzKTsKIAogaW50IHNjb19jb25uZWN0X2luZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgX191OCAqZmxhZ3MpOwotdm9pZCBzY29fY29ubmVjdF9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCBfX3U4IHN0YXR1cyk7Ci12b2lkIHNjb19kaXNjb25uX2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIF9fdTggcmVhc29uKTsKIGludCBzY29fcmVjdl9zY29kYXRhKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIC8qIC0tLS0tIElucXVpcnkgY2FjaGUgLS0tLS0gKi8KQEAgLTUyOSw2ICs1NTEsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2Rpc2NvdmVyeV9maWx0ZXJfY2xlYXIoc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7CisJaGRldi0+ZGlzY292ZXJ5LnJlc3VsdF9maWx0ZXJpbmcgPSBmYWxzZTsKIAloZGV2LT5kaXNjb3ZlcnkucmVwb3J0X2ludmFsaWRfcnNzaSA9IHRydWU7CiAJaGRldi0+ZGlzY292ZXJ5LnJzc2kgPSBIQ0lfUlNTSV9JTlZBTElEOwogCWhkZXYtPmRpc2NvdmVyeS51dWlkX2NvdW50ID0gMDsKQEAgLTUzOCw2ICs1NjEsMTEgQEAKIAloZGV2LT5kaXNjb3Zlcnkuc2Nhbl9kdXJhdGlvbiA9IDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZHZfaW5mb19pbml0KHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCW1lbXNldCgmaGRldi0+YWR2X2luc3RhbmNlLCAwLCBzaXplb2Yoc3RydWN0IGFkdl9pbmZvKSk7Cit9CisKIGJvb2wgaGNpX2Rpc2NvdmVyeV9hY3RpdmUoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogCiB2b2lkIGhjaV9kaXNjb3Zlcnlfc2V0X3N0YXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgc3RhdGUpOwpAQCAtNTg0LDcgKzYxMiw2IEBACiAJSENJX0NPTk5fU0NfRU5BQkxFRCwKIAlIQ0lfQ09OTl9BRVNfQ0NNLAogCUhDSV9DT05OX1BPV0VSX1NBVkUsCi0JSENJX0NPTk5fUkVNT1RFX09PQiwKIAlIQ0lfQ09OTl9GTFVTSF9LRVksCiAJSENJX0NPTk5fRU5DUllQVCwKIAlIQ0lfQ09OTl9BVVRILApAQCAtNjAwLDE0ICs2MjcsMTQgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCBoY2lfY29ubl9zc3BfZW5hYmxlZChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OwotCXJldHVybiB0ZXN0X2JpdChIQ0lfU1NQX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpICYmCisJcmV0dXJuIGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TU1BfRU5BQkxFRCkgJiYKIAkgICAgICAgdGVzdF9iaXQoSENJX0NPTk5fU1NQX0VOQUJMRUQsICZjb25uLT5mbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBoY2lfY29ubl9zY19lbmFibGVkKHN0cnVjdCBoY2lfY29ubiAqY29ubikKIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhkZXY7Ci0JcmV0dXJuIHRlc3RfYml0KEhDSV9TQ19FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgorCXJldHVybiBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU0NfRU5BQkxFRCkgJiYKIAkgICAgICAgdGVzdF9iaXQoSENJX0NPTk5fU0NfRU5BQkxFRCwgJmNvbm4tPmZsYWdzKTsKIH0KIApAQCAtOTY5LDYgKzk5Niw4IEBACiB2b2lkIGhjaV9yZW1vdmVfaXJrKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBhZGRyX3R5cGUpOwogdm9pZCBoY2lfc21wX2lya3NfY2xlYXIoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogCitib29sIGhjaV9iZGFkZHJfaXNfcGFpcmVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCB0eXBlKTsKKwogdm9pZCBoY2lfcmVtb3RlX29vYl9kYXRhX2NsZWFyKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIHN0cnVjdCBvb2JfZGF0YSAqaGNpX2ZpbmRfcmVtb3RlX29vYl9kYXRhKHN0cnVjdCBoY2lfZGV2ICpoZGV2LAogCQkJCQkgIGJkYWRkcl90ICpiZGFkZHIsIHU4IGJkYWRkcl90eXBlKTsKQEAgLTk4MSw3ICsxMDEwLDYgQEAKIHZvaWQgaGNpX2V2ZW50X3BhY2tldChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIGludCBoY2lfcmVjdl9mcmFtZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1pbnQgaGNpX3JlY3Zfc3RyZWFtX2ZyYWdtZW50KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkICpkYXRhLCBpbnQgY291bnQpOwogCiB2b2lkIGhjaV9pbml0X3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIHZvaWQgaGNpX2Nvbm5faW5pdF9zeXNmcyhzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pOwpAQCAtMTAyNSwxMCArMTA1MywxMCBAQAogI2RlZmluZSBsbXBfaG9zdF9sZV9jYXBhYmxlKGRldikgICAoISEoKGRldiktPmZlYXR1cmVzWzFdWzBdICYgTE1QX0hPU1RfTEUpKQogI2RlZmluZSBsbXBfaG9zdF9sZV9icl9jYXBhYmxlKGRldikgKCEhKChkZXYpLT5mZWF0dXJlc1sxXVswXSAmIExNUF9IT1NUX0xFX0JSRURSKSkKIAotI2RlZmluZSBoZGV2X2lzX3Bvd2VyZWQoaGRldikgKHRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSAmJiBcCi0JCQkJIXRlc3RfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmRldl9mbGFncykpCi0jZGVmaW5lIGJyZWRyX3NjX2VuYWJsZWQoZGV2KSAobG1wX3NjX2NhcGFibGUoZGV2KSAmJiBcCi0JCQkgICAgICAgdGVzdF9iaXQoSENJX1NDX0VOQUJMRUQsICYoZGV2KS0+ZGV2X2ZsYWdzKSkKKyNkZWZpbmUgaGRldl9pc19wb3dlcmVkKGRldikgICAodGVzdF9iaXQoSENJX1VQLCAmKGRldiktPmZsYWdzKSAmJiBcCisJCQkJIWhjaV9kZXZfdGVzdF9mbGFnKGRldiwgSENJX0FVVE9fT0ZGKSkKKyNkZWZpbmUgYnJlZHJfc2NfZW5hYmxlZChkZXYpICAobG1wX3NjX2NhcGFibGUoZGV2KSAmJiBcCisJCQkJaGNpX2Rldl90ZXN0X2ZsYWcoZGV2LCBIQ0lfU0NfRU5BQkxFRCkpCiAKIC8qIC0tLS0tIEhDSSBwcm90b2NvbHMgLS0tLS0gKi8KICNkZWZpbmUgSENJX1BST1RPX0RFRkVSICAgICAgICAgICAgIDB4MDEKQEAgLTEwNTAsMjggKzEwNzgsNiBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGhjaV9wcm90b19jb25uZWN0X2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggc3RhdHVzKQotewotCXN3aXRjaCAoY29ubi0+dHlwZSkgewotCWNhc2UgQUNMX0xJTks6Ci0JY2FzZSBMRV9MSU5LOgotCQlsMmNhcF9jb25uZWN0X2NmbShjb25uLCBzdGF0dXMpOwotCQlicmVhazsKLQotCWNhc2UgU0NPX0xJTks6Ci0JY2FzZSBFU0NPX0xJTks6Ci0JCXNjb19jb25uZWN0X2NmbShjb25uLCBzdGF0dXMpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUJUX0VSUigidW5rbm93biBsaW5rIHR5cGUgJWQiLCBjb25uLT50eXBlKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGNvbm4tPmNvbm5lY3RfY2ZtX2NiKQotCQljb25uLT5jb25uZWN0X2NmbV9jYihjb25uLCBzdGF0dXMpOwotfQotCiBzdGF0aWMgaW5saW5lIGludCBoY2lfcHJvdG9fZGlzY29ubl9pbmQoc3RydWN0IGhjaV9jb25uICpjb25uKQogewogCWlmIChjb25uLT50eXBlICE9IEFDTF9MSU5LICYmIGNvbm4tPnR5cGUgIT0gTEVfTElOSykKQEAgLTEwODAsOTEgKzEwODYsNjkgQEAKIAlyZXR1cm4gbDJjYXBfZGlzY29ubl9pbmQoY29ubik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfcHJvdG9fZGlzY29ubl9jZm0oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHJlYXNvbikKLXsKLQlzd2l0Y2ggKGNvbm4tPnR5cGUpIHsKLQljYXNlIEFDTF9MSU5LOgotCWNhc2UgTEVfTElOSzoKLQkJbDJjYXBfZGlzY29ubl9jZm0oY29ubiwgcmVhc29uKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFNDT19MSU5LOgotCWNhc2UgRVNDT19MSU5LOgotCQlzY29fZGlzY29ubl9jZm0oY29ubiwgcmVhc29uKTsKLQkJYnJlYWs7Ci0KLQkvKiBMMkNBUCB3b3VsZCBiZSBoYW5kbGVkIGZvciBCUkVEUiBjaGFuICovCi0JY2FzZSBBTVBfTElOSzoKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlCVF9FUlIoInVua25vd24gbGluayB0eXBlICVkIiwgY29ubi0+dHlwZSk7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChjb25uLT5kaXNjb25uX2NmbV9jYikKLQkJY29ubi0+ZGlzY29ubl9jZm1fY2IoY29ubiwgcmVhc29uKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGhjaV9wcm90b19hdXRoX2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggc3RhdHVzKQotewotCV9fdTggZW5jcnlwdDsKLQotCWlmIChjb25uLT50eXBlICE9IEFDTF9MSU5LICYmIGNvbm4tPnR5cGUgIT0gTEVfTElOSykKLQkJcmV0dXJuOwotCi0JaWYgKHRlc3RfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmNvbm4tPmZsYWdzKSkKLQkJcmV0dXJuOwotCi0JZW5jcnlwdCA9IHRlc3RfYml0KEhDSV9DT05OX0VOQ1JZUFQsICZjb25uLT5mbGFncykgPyAweDAxIDogMHgwMDsKLQlsMmNhcF9zZWN1cml0eV9jZm0oY29ubiwgc3RhdHVzLCBlbmNyeXB0KTsKLQotCWlmIChjb25uLT5zZWN1cml0eV9jZm1fY2IpCi0JCWNvbm4tPnNlY3VyaXR5X2NmbV9jYihjb25uLCBzdGF0dXMpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaGNpX3Byb3RvX2VuY3J5cHRfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzdGF0dXMsCi0JCQkJCQkJCV9fdTggZW5jcnlwdCkKLXsKLQlpZiAoY29ubi0+dHlwZSAhPSBBQ0xfTElOSyAmJiBjb25uLT50eXBlICE9IExFX0xJTkspCi0JCXJldHVybjsKLQotCWwyY2FwX3NlY3VyaXR5X2NmbShjb25uLCBzdGF0dXMsIGVuY3J5cHQpOwotCi0JaWYgKGNvbm4tPnNlY3VyaXR5X2NmbV9jYikKLQkJY29ubi0+c2VjdXJpdHlfY2ZtX2NiKGNvbm4sIHN0YXR1cyk7Ci19Ci0KIC8qIC0tLS0tIEhDSSBjYWxsYmFja3MgLS0tLS0gKi8KIHN0cnVjdCBoY2lfY2IgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAogCWNoYXIgKm5hbWU7CiAKKwl2b2lkICgqY29ubmVjdF9jZm0pCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggc3RhdHVzKTsKKwl2b2lkICgqZGlzY29ubl9jZm0pCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggc3RhdHVzKTsKIAl2b2lkICgqc2VjdXJpdHlfY2ZtKQkoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cywKIAkJCQkJCQkJX191OCBlbmNyeXB0KTsKIAl2b2lkICgqa2V5X2NoYW5nZV9jZm0pCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggc3RhdHVzKTsKIAl2b2lkICgqcm9sZV9zd2l0Y2hfY2ZtKQkoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cywgX191OCByb2xlKTsKIH07CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfY29ubmVjdF9jZm0oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgaGNpX2NiICpjYjsKKworCW11dGV4X2xvY2soJmhjaV9jYl9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2IsICZoY2lfY2JfbGlzdCwgbGlzdCkgeworCQlpZiAoY2ItPmNvbm5lY3RfY2ZtKQorCQkJY2ItPmNvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CisJfQorCW11dGV4X3VubG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CisKKwlpZiAoY29ubi0+Y29ubmVjdF9jZm1fY2IpCisJCWNvbm4tPmNvbm5lY3RfY2ZtX2NiKGNvbm4sIHN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfZGlzY29ubl9jZm0oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHJlYXNvbikKK3sKKwlzdHJ1Y3QgaGNpX2NiICpjYjsKKworCW11dGV4X2xvY2soJmhjaV9jYl9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2IsICZoY2lfY2JfbGlzdCwgbGlzdCkgeworCQlpZiAoY2ItPmRpc2Nvbm5fY2ZtKQorCQkJY2ItPmRpc2Nvbm5fY2ZtKGNvbm4sIHJlYXNvbik7CisJfQorCW11dGV4X3VubG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CisKKwlpZiAoY29ubi0+ZGlzY29ubl9jZm1fY2IpCisJCWNvbm4tPmRpc2Nvbm5fY2ZtX2NiKGNvbm4sIHJlYXNvbik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfYXV0aF9jZm0oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cykKIHsKIAlzdHJ1Y3QgaGNpX2NiICpjYjsKIAlfX3U4IGVuY3J5cHQ7CiAKLQloY2lfcHJvdG9fYXV0aF9jZm0oY29ubiwgc3RhdHVzKTsKLQogCWlmICh0ZXN0X2JpdChIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsICZjb25uLT5mbGFncykpCiAJCXJldHVybjsKIAogCWVuY3J5cHQgPSB0ZXN0X2JpdChIQ0lfQ09OTl9FTkNSWVBULCAmY29ubi0+ZmxhZ3MpID8gMHgwMSA6IDB4MDA7CiAKLQlyZWFkX2xvY2soJmhjaV9jYl9saXN0X2xvY2spOworCW11dGV4X2xvY2soJmhjaV9jYl9saXN0X2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2IsICZoY2lfY2JfbGlzdCwgbGlzdCkgewogCQlpZiAoY2ItPnNlY3VyaXR5X2NmbSkKIAkJCWNiLT5zZWN1cml0eV9jZm0oY29ubiwgc3RhdHVzLCBlbmNyeXB0KTsKIAl9Ci0JcmVhZF91bmxvY2soJmhjaV9jYl9saXN0X2xvY2spOworCW11dGV4X3VubG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CisKKwlpZiAoY29ubi0+c2VjdXJpdHlfY2ZtX2NiKQorCQljb25uLT5zZWN1cml0eV9jZm1fY2IoY29ubiwgc3RhdHVzKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGhjaV9lbmNyeXB0X2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggc3RhdHVzLApAQCAtMTE3OCwyNiArMTE2MiwyNyBAQAogCWlmIChjb25uLT5wZW5kaW5nX3NlY19sZXZlbCA+IGNvbm4tPnNlY19sZXZlbCkKIAkJY29ubi0+c2VjX2xldmVsID0gY29ubi0+cGVuZGluZ19zZWNfbGV2ZWw7CiAKLQloY2lfcHJvdG9fZW5jcnlwdF9jZm0oY29ubiwgc3RhdHVzLCBlbmNyeXB0KTsKLQotCXJlYWRfbG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CisJbXV0ZXhfbG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjYiwgJmhjaV9jYl9saXN0LCBsaXN0KSB7CiAJCWlmIChjYi0+c2VjdXJpdHlfY2ZtKQogCQkJY2ItPnNlY3VyaXR5X2NmbShjb25uLCBzdGF0dXMsIGVuY3J5cHQpOwogCX0KLQlyZWFkX3VubG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKKworCWlmIChjb25uLT5zZWN1cml0eV9jZm1fY2IpCisJCWNvbm4tPnNlY3VyaXR5X2NmbV9jYihjb25uLCBzdGF0dXMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2tleV9jaGFuZ2VfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzdGF0dXMpCiB7CiAJc3RydWN0IGhjaV9jYiAqY2I7CiAKLQlyZWFkX2xvY2soJmhjaV9jYl9saXN0X2xvY2spOworCW11dGV4X2xvY2soJmhjaV9jYl9saXN0X2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2IsICZoY2lfY2JfbGlzdCwgbGlzdCkgewogCQlpZiAoY2ItPmtleV9jaGFuZ2VfY2ZtKQogCQkJY2ItPmtleV9jaGFuZ2VfY2ZtKGNvbm4sIHN0YXR1cyk7CiAJfQotCXJlYWRfdW5sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKKwltdXRleF91bmxvY2soJmhjaV9jYl9saXN0X2xvY2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX3JvbGVfc3dpdGNoX2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggc3RhdHVzLApAQCAtMTIwNSwxMiArMTE5MCwxMiBAQAogewogCXN0cnVjdCBoY2lfY2IgKmNiOwogCi0JcmVhZF9sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKKwltdXRleF9sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNiLCAmaGNpX2NiX2xpc3QsIGxpc3QpIHsKIAkJaWYgKGNiLT5yb2xlX3N3aXRjaF9jZm0pCiAJCQljYi0+cm9sZV9zd2l0Y2hfY2ZtKGNvbm4sIHN0YXR1cywgcm9sZSk7CiAJfQotCXJlYWRfdW5sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKKwltdXRleF91bmxvY2soJmhjaV9jYl9saXN0X2xvY2spOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgZWlyX2hhc19kYXRhX3R5cGUodTggKmRhdGEsIHNpemVfdCBkYXRhX2xlbiwgdTggdHlwZSkKQEAgLTEyOTYsOCArMTI4MSw2IEBACiBpbnQgaGNpX3JlZ2lzdGVyX2NiKHN0cnVjdCBoY2lfY2IgKmhjYik7CiBpbnQgaGNpX3VucmVnaXN0ZXJfY2Ioc3RydWN0IGhjaV9jYiAqaGNiKTsKIAotYm9vbCBoY2lfcmVxX3BlbmRpbmcoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwotCiBzdHJ1Y3Qgc2tfYnVmZiAqX19oY2lfY21kX3N5bmMoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHUxNiBvcGNvZGUsIHUzMiBwbGVuLAogCQkJICAgICAgIGNvbnN0IHZvaWQgKnBhcmFtLCB1MzIgdGltZW91dCk7CiBzdHJ1Y3Qgc2tfYnVmZiAqX19oY2lfY21kX3N5bmNfZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHUxNiBvcGNvZGUsIHUzMiBwbGVuLApAQCAtMTMxMiwxMSArMTI5NSwzNSBAQAogCiAvKiAtLS0tLSBIQ0kgU29ja2V0cyAtLS0tLSAqLwogdm9pZCBoY2lfc2VuZF90b19zb2NrKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLXZvaWQgaGNpX3NlbmRfdG9fY29udHJvbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2tpcF9zayk7Cit2b2lkIGhjaV9zZW5kX3RvX2NoYW5uZWwodW5zaWduZWQgc2hvcnQgY2hhbm5lbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSBpbnQgZmxhZywgc3RydWN0IHNvY2sgKnNraXBfc2spOwogdm9pZCBoY2lfc2VuZF90b19tb25pdG9yKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogdm9pZCBoY2lfc29ja19kZXZfZXZlbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGludCBldmVudCk7CiAKKyNkZWZpbmUgSENJX01HTVRfVkFSX0xFTglCSVQoMCkKKyNkZWZpbmUgSENJX01HTVRfTk9fSERFVglCSVQoMSkKKyNkZWZpbmUgSENJX01HTVRfVU5UUlVTVEVECUJJVCgyKQorI2RlZmluZSBIQ0lfTUdNVF9VTkNPTkZJR1VSRUQJQklUKDMpCisKK3N0cnVjdCBoY2lfbWdtdF9oYW5kbGVyIHsKKwlpbnQgKCpmdW5jKSAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwKKwkJICAgICB1MTYgZGF0YV9sZW4pOworCXNpemVfdCBkYXRhX2xlbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworfTsKKworc3RydWN0IGhjaV9tZ210X2NoYW4geworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBzaG9ydCBjaGFubmVsOworCXNpemVfdCBoYW5kbGVyX2NvdW50OworCWNvbnN0IHN0cnVjdCBoY2lfbWdtdF9oYW5kbGVyICpoYW5kbGVyczsKKwl2b2lkICgqaGRldl9pbml0KSAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldik7Cit9OworCitpbnQgaGNpX21nbXRfY2hhbl9yZWdpc3RlcihzdHJ1Y3QgaGNpX21nbXRfY2hhbiAqYyk7Cit2b2lkIGhjaV9tZ210X2NoYW5fdW5yZWdpc3RlcihzdHJ1Y3QgaGNpX21nbXRfY2hhbiAqYyk7CisKIC8qIE1hbmFnZW1lbnQgaW50ZXJmYWNlICovCiAjZGVmaW5lIERJU0NPVl9UWVBFX0JSRURSCQkoQklUKEJEQUREUl9CUkVEUikpCiAjZGVmaW5lIERJU0NPVl9UWVBFX0xFCQkJKEJJVChCREFERFJfTEVfUFVCTElDKSB8IFwKQEAgLTEzMzYsNyArMTM0Myw2IEBACiAjZGVmaW5lIERJU0NPVl9CUkVEUl9JTlFVSVJZX0xFTgkweDA4CiAjZGVmaW5lIERJU0NPVl9MRV9SRVNUQVJUX0RFTEFZCQltc2Vjc190b19qaWZmaWVzKDIwMCkJLyogbXNlYyAqLwogCi1pbnQgbWdtdF9jb250cm9sKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKTsKIGludCBtZ210X25ld19zZXR0aW5ncyhzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiB2b2lkIG1nbXRfaW5kZXhfYWRkZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogdm9pZCBtZ210X2luZGV4X3JlbW92ZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwpAQCAtMTM4Miw5ICsxMzg4LDYgQEAKIHZvaWQgbWdtdF9zZXRfY2xhc3Nfb2ZfZGV2X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqZGV2X2NsYXNzLAogCQkJCSAgICB1OCBzdGF0dXMpOwogdm9pZCBtZ210X3NldF9sb2NhbF9uYW1lX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqbmFtZSwgdTggc3RhdHVzKTsKLXZvaWQgbWdtdF9yZWFkX2xvY2FsX29vYl9kYXRhX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqaGFzaDE5MiwKLQkJCQkgICAgICAgdTggKnJhbmQxOTIsIHU4ICpoYXNoMjU2LCB1OCAqcmFuZDI1NiwKLQkJCQkgICAgICAgdTggc3RhdHVzKTsKIHZvaWQgbWdtdF9kZXZpY2VfZm91bmQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IGxpbmtfdHlwZSwKIAkJICAgICAgIHU4IGFkZHJfdHlwZSwgdTggKmRldl9jbGFzcywgczggcnNzaSwgdTMyIGZsYWdzLAogCQkgICAgICAgdTggKmVpciwgdTE2IGVpcl9sZW4sIHU4ICpzY2FuX3JzcCwgdTggc2Nhbl9yc3BfbGVuKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvbWdtdC5oCmluZGV4IGUyMThhMzAuLmI4MzEyNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaApAQCAtNDMsNiArNDMsOCBAQAogI2RlZmluZSBNR01UX1NUQVRVU19DQU5DRUxMRUQJCTB4MTAKICNkZWZpbmUgTUdNVF9TVEFUVVNfSU5WQUxJRF9JTkRFWAkweDExCiAjZGVmaW5lIE1HTVRfU1RBVFVTX1JGS0lMTEVECQkweDEyCisjZGVmaW5lIE1HTVRfU1RBVFVTX0FMUkVBRFlfUEFJUkVECTB4MTMKKyNkZWZpbmUgTUdNVF9TVEFUVVNfUEVSTUlTU0lPTl9ERU5JRUQJMHgxNAogCiBzdHJ1Y3QgbWdtdF9oZHIgewogCV9fbGUxNglvcGNvZGU7CkBAIC05OCw2ICsxMDAsNyBAQAogI2RlZmluZSBNR01UX1NFVFRJTkdfREVCVUdfS0VZUwkJMHgwMDAwMTAwMAogI2RlZmluZSBNR01UX1NFVFRJTkdfUFJJVkFDWQkJMHgwMDAwMjAwMAogI2RlZmluZSBNR01UX1NFVFRJTkdfQ09ORklHVVJBVElPTgkweDAwMDA0MDAwCisjZGVmaW5lIE1HTVRfU0VUVElOR19TVEFUSUNfQUREUkVTUwkweDAwMDA4MDAwCiAKICNkZWZpbmUgTUdNVF9PUF9SRUFEX0lORk8JCTB4MDAwNAogI2RlZmluZSBNR01UX1JFQURfSU5GT19TSVpFCQkwCkBAIC01MDMsNiArNTA2LDcxIEBACiB9IF9fcGFja2VkOwogI2RlZmluZSBNR01UX1NUQVJUX1NFUlZJQ0VfRElTQ09WRVJZX1NJWkUgNAogCisjZGVmaW5lIE1HTVRfT1BfUkVBRF9MT0NBTF9PT0JfRVhUX0RBVEEJMHgwMDNCCitzdHJ1Y3QgbWdtdF9jcF9yZWFkX2xvY2FsX29vYl9leHRfZGF0YSB7CisJX191OCB0eXBlOworfSBfX3BhY2tlZDsKKyNkZWZpbmUgTUdNVF9SRUFEX0xPQ0FMX09PQl9FWFRfREFUQV9TSVpFIDEKK3N0cnVjdCBtZ210X3JwX3JlYWRfbG9jYWxfb29iX2V4dF9kYXRhIHsKKwlfX3U4ICAgIHR5cGU7CisJX19sZTE2CWVpcl9sZW47CisJX191OAllaXJbMF07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIE1HTVRfT1BfUkVBRF9FWFRfSU5ERVhfTElTVAkweDAwM0MKKyNkZWZpbmUgTUdNVF9SRUFEX0VYVF9JTkRFWF9MSVNUX1NJWkUJMAorc3RydWN0IG1nbXRfcnBfcmVhZF9leHRfaW5kZXhfbGlzdCB7CisJX19sZTE2CW51bV9jb250cm9sbGVyczsKKwlzdHJ1Y3QgeworCQlfX2xlMTYgaW5kZXg7CisJCV9fdTggICB0eXBlOworCQlfX3U4ICAgYnVzOworCX0gZW50cnlbMF07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIE1HTVRfT1BfUkVBRF9BRFZfRkVBVFVSRVMJMHgwMDAzRAorI2RlZmluZSBNR01UX1JFQURfQURWX0ZFQVRVUkVTX1NJWkUJMAorc3RydWN0IG1nbXRfcnBfcmVhZF9hZHZfZmVhdHVyZXMgeworCV9fbGUzMiBzdXBwb3J0ZWRfZmxhZ3M7CisJX191OCAgIG1heF9hZHZfZGF0YV9sZW47CisJX191OCAgIG1heF9zY2FuX3JzcF9sZW47CisJX191OCAgIG1heF9pbnN0YW5jZXM7CisJX191OCAgIG51bV9pbnN0YW5jZXM7CisJX191OCAgIGluc3RhbmNlWzBdOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBNR01UX09QX0FERF9BRFZFUlRJU0lORwkJMHgwMDNFCitzdHJ1Y3QgbWdtdF9jcF9hZGRfYWR2ZXJ0aXNpbmcgeworCV9fdTgJaW5zdGFuY2U7CisJX19sZTMyCWZsYWdzOworCV9fbGUxNglkdXJhdGlvbjsKKwlfX2xlMTYJdGltZW91dDsKKwlfX3U4CWFkdl9kYXRhX2xlbjsKKwlfX3U4CXNjYW5fcnNwX2xlbjsKKwlfX3U4CWRhdGFbMF07Cit9IF9fcGFja2VkOworI2RlZmluZSBNR01UX0FERF9BRFZFUlRJU0lOR19TSVpFCTExCitzdHJ1Y3QgbWdtdF9ycF9hZGRfYWR2ZXJ0aXNpbmcgeworCV9fdTgJaW5zdGFuY2U7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIE1HTVRfQURWX0ZMQUdfQ09OTkVDVEFCTEUJQklUKDApCisjZGVmaW5lIE1HTVRfQURWX0ZMQUdfRElTQ09WCQlCSVQoMSkKKyNkZWZpbmUgTUdNVF9BRFZfRkxBR19MSU1JVEVEX0RJU0NPVglCSVQoMikKKyNkZWZpbmUgTUdNVF9BRFZfRkxBR19NQU5BR0VEX0ZMQUdTCUJJVCgzKQorI2RlZmluZSBNR01UX0FEVl9GTEFHX1RYX1BPV0VSCQlCSVQoNCkKKyNkZWZpbmUgTUdNVF9BRFZfRkxBR19BUFBFQVJBTkNFCUJJVCg1KQorI2RlZmluZSBNR01UX0FEVl9GTEFHX0xPQ0FMX05BTUUJQklUKDYpCisKKyNkZWZpbmUgTUdNVF9PUF9SRU1PVkVfQURWRVJUSVNJTkcJMHgwMDNGCitzdHJ1Y3QgbWdtdF9jcF9yZW1vdmVfYWR2ZXJ0aXNpbmcgeworCV9fdTgJaW5zdGFuY2U7Cit9IF9fcGFja2VkOworI2RlZmluZSBNR01UX1JFTU9WRV9BRFZFUlRJU0lOR19TSVpFCTEKK3N0cnVjdCBtZ210X3JwX3JlbW92ZV9hZHZlcnRpc2luZyB7CisJX191OAlpbnN0YW5jZTsKK30gX19wYWNrZWQ7CisKICNkZWZpbmUgTUdNVF9FVl9DTURfQ09NUExFVEUJCTB4MDAwMQogc3RydWN0IG1nbXRfZXZfY21kX2NvbXBsZXRlIHsKIAlfX2xlMTYJb3Bjb2RlOwpAQCAtNjQ3LDkgKzcxNSwxNCBAQAogCXN0cnVjdCBtZ210X2lya19pbmZvIGlyazsKIH0gX19wYWNrZWQ7CiAKKyNkZWZpbmUgTUdNVF9DU1JLX0xPQ0FMX1VOQVVUSEVOVElDQVRFRAkJMHgwMAorI2RlZmluZSBNR01UX0NTUktfUkVNT1RFX1VOQVVUSEVOVElDQVRFRAkweDAxCisjZGVmaW5lIE1HTVRfQ1NSS19MT0NBTF9BVVRIRU5USUNBVEVECQkweDAyCisjZGVmaW5lIE1HTVRfQ1NSS19SRU1PVEVfQVVUSEVOVElDQVRFRAkJMHgwMworCiBzdHJ1Y3QgbWdtdF9jc3JrX2luZm8gewogCXN0cnVjdCBtZ210X2FkZHJfaW5mbyBhZGRyOwotCV9fdTggbWFzdGVyOworCV9fdTggdHlwZTsKIAlfX3U4IHZhbFsxNl07CiB9IF9fcGFja2VkOwogCkBAIC02ODUsMyArNzU4LDI5IEBACiAjZGVmaW5lIE1HTVRfRVZfVU5DT05GX0lOREVYX1JFTU9WRUQJMHgwMDFlCiAKICNkZWZpbmUgTUdNVF9FVl9ORVdfQ09ORklHX09QVElPTlMJMHgwMDFmCisKK3N0cnVjdCBtZ210X2V2X2V4dF9pbmRleCB7CisJX191OCB0eXBlOworCV9fdTggYnVzOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBNR01UX0VWX0VYVF9JTkRFWF9BRERFRAkJMHgwMDIwCisKKyNkZWZpbmUgTUdNVF9FVl9FWFRfSU5ERVhfUkVNT1ZFRAkweDAwMjEKKworI2RlZmluZSBNR01UX0VWX0xPQ0FMX09PQl9EQVRBX1VQREFURUQJMHgwMDIyCitzdHJ1Y3QgbWdtdF9ldl9sb2NhbF9vb2JfZGF0YV91cGRhdGVkIHsKKwlfX3U4ICAgIHR5cGU7CisJX19sZTE2CWVpcl9sZW47CisJX191OAllaXJbMF07Cit9IF9fcGFja2VkOworCisjZGVmaW5lIE1HTVRfRVZfQURWRVJUSVNJTkdfQURERUQJMHgwMDIzCitzdHJ1Y3QgbWdtdF9ldl9hZHZlcnRpc2luZ19hZGRlZCB7CisJX191OCAgICBpbnN0YW5jZTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgTUdNVF9FVl9BRFZFUlRJU0lOR19SRU1PVkVECTB4MDAyNAorc3RydWN0IG1nbXRfZXZfYWR2ZXJ0aXNpbmdfcmVtb3ZlZCB7CisJX191OCAgICBpbnN0YW5jZTsKK30gX19wYWNrZWQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ib25kXzNhZC5oIGIvaW5jbHVkZS9uZXQvYm9uZF8zYWQuaAppbmRleCBmMDRjZGJiLi5jMmE0MGExNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYm9uZF8zYWQuaAorKysgYi9pbmNsdWRlL25ldC9ib25kXzNhZC5oCkBAIC04Miw2ICs4MiwxMyBAQAogCUFEX1RSQU5TTUlUCQkvKiB0eCBNYWNoaW5lICovCiB9IHR4X3N0YXRlc190OwogCisvKiBjaHVybiBtYWNoaW5lIHN0YXRlcyg0My40LjE3IGluIHRoZSA4MDIuM2FkIHN0YW5kYXJkKSAqLwordHlwZWRlZiBlbnVtIHsKKwkgQURfQ0hVUk5fTU9OSVRPUiwgLyogbW9uaXRvcmluZyBmb3IgY2h1cm4gKi8KKwkgQURfQ0hVUk4sICAgICAgICAgLyogY2h1cm4gZGV0ZWN0ZWQgKGVycm9yKSAqLworCSBBRF9OT19DSFVSTiAgICAgICAvKiBubyBjaHVybiAobm8gZXJyb3IpICovCit9IGNodXJuX3N0YXRlX3Q7CisKIC8qIHJ4IGluZGljYXRpb24gdHlwZXMgKi8KIHR5cGVkZWYgZW51bSB7CiAJQURfVFlQRV9MQUNQRFUgPSAxLAkvKiB0eXBlIGxhY3BkdSAqLwpAQCAtMjI5LDYgKzIzNiwxMiBAQAogCXUxNiBzbV9tdXhfdGltZXJfY291bnRlcjsJLyogc3RhdGUgbWFjaGluZSBtdXggdGltZXIgY291bnRlciAqLwogCXR4X3N0YXRlc190IHNtX3R4X3N0YXRlOwkvKiBzdGF0ZSBtYWNoaW5lIHR4IHN0YXRlICovCiAJdTE2IHNtX3R4X3RpbWVyX2NvdW50ZXI7CS8qIHN0YXRlIG1hY2hpbmUgdHggdGltZXIgY291bnRlcihhbGx3YXlzIG9uIC0gZW50ZXIgdG8gdHJhbnNtaXQgc3RhdGUgMyB0aW1lIHBlciBzZWNvbmQpICovCisJdTE2IHNtX2NodXJuX2FjdG9yX3RpbWVyX2NvdW50ZXI7CisJdTE2IHNtX2NodXJuX3BhcnRuZXJfdGltZXJfY291bnRlcjsKKwl1MzIgY2h1cm5fYWN0b3JfY291bnQ7CisJdTMyIGNodXJuX3BhcnRuZXJfY291bnQ7CisJY2h1cm5fc3RhdGVfdCBzbV9jaHVybl9hY3Rvcl9zdGF0ZTsKKwljaHVybl9zdGF0ZV90IHNtX2NodXJuX3BhcnRuZXJfc3RhdGU7CiAJc3RydWN0IHNsYXZlICpzbGF2ZTsJCS8qIHBvaW50ZXIgdG8gdGhlIGJvbmQgc2xhdmUgdGhhdCB0aGlzIHBvcnQgYmVsb25ncyB0byAqLwogCXN0cnVjdCBhZ2dyZWdhdG9yICphZ2dyZWdhdG9yOwkvKiBwb2ludGVyIHRvIGFuIGFnZ3JlZ2F0b3IgdGhhdCB0aGlzIHBvcnQgcmVsYXRlZCB0byAqLwogCXN0cnVjdCBwb3J0ICpuZXh0X3BvcnRfaW5fYWdncmVnYXRvcjsJLyogTmV4dCBwb3J0IG9uIHRoZSBsaW5rZWQgbGlzdCBvZiB0aGUgcGFyZW50IGFnZ3JlZ2F0b3IgKi8KQEAgLTI2Miw2ICsyNzUsMjIgQEAKIAl1MTYgaWQ7CiB9OwogCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmJvbmRfM2FkX2NodXJuX2Rlc2MoY2h1cm5fc3RhdGVfdCBzdGF0ZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2h1cm5fZGVzY3JpcHRpb25bXSA9IHsKKwkJIm1vbml0b3JpbmciLAorCQkiY2h1cm5lZCIsCisJCSJub25lIiwKKwkJInVua25vd24iCisJfTsKKwlpbnQgbWF4X3NpemUgPSBzaXplb2YoY2h1cm5fZGVzY3JpcHRpb24pIC8gc2l6ZW9mKGNodXJuX2Rlc2NyaXB0aW9uWzBdKTsKKworCWlmIChzdGF0ZSA+PSBtYXhfc2l6ZSkKKwkJc3RhdGUgPSBtYXhfc2l6ZSAtIDE7CisKKwlyZXR1cm4gY2h1cm5fZGVzY3JpcHRpb25bc3RhdGVdOworfQorCiAvKiA9PT09PT09PT09IEFEIEV4cG9ydGVkIGZ1bmN0aW9ucyB0byB0aGUgbWFpbiBib25kaW5nIGNvZGUgPT09PT09PT09PSAqLwogdm9pZCBib25kXzNhZF9pbml0aWFsaXplKHN0cnVjdCBib25kaW5nICpib25kLCB1MTYgdGlja19yZXNvbHV0aW9uKTsKIHZvaWQgYm9uZF8zYWRfYmluZF9zbGF2ZShzdHJ1Y3Qgc2xhdmUgKnNsYXZlKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NmZzgwMjExLmggYi9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCmluZGV4IDY0ZTA5ZTEuLmY4ZDY4MTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKKysrIGIvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaApAQCAtMjE1LDYgKzIxNSwzOSBAQAogfTsKIAogLyoqCisgKiBlbnVtIGllZWU4MDIxMV9ic3NfdHlwZSAtIEJTUyB0eXBlIGZpbHRlcgorICoKKyAqIEBJRUVFODAyMTFfQlNTX1RZUEVfRVNTOiBJbmZyYXN0cnVjdHVyZSBCU1MKKyAqIEBJRUVFODAyMTFfQlNTX1RZUEVfUEJTUzogUGVyc29uYWwgQlNTCisgKiBASUVFRTgwMjExX0JTU19UWVBFX0lCU1M6IEluZGVwZW5kZW50IEJTUworICogQElFRUU4MDIxMV9CU1NfVFlQRV9NQlNTOiBNZXNoIEJTUworICogQElFRUU4MDIxMV9CU1NfVFlQRV9BTlk6IFdpbGRjYXJkIHZhbHVlIGZvciBtYXRjaGluZyBhbnkgQlNTIHR5cGUKKyAqLworZW51bSBpZWVlODAyMTFfYnNzX3R5cGUgeworCUlFRUU4MDIxMV9CU1NfVFlQRV9FU1MsCisJSUVFRTgwMjExX0JTU19UWVBFX1BCU1MsCisJSUVFRTgwMjExX0JTU19UWVBFX0lCU1MsCisJSUVFRTgwMjExX0JTU19UWVBFX01CU1MsCisJSUVFRTgwMjExX0JTU19UWVBFX0FOWQorfTsKKworLyoqCisgKiBlbnVtIGllZWU4MDIxMV9wcml2YWN5IC0gQlNTIHByaXZhY3kgZmlsdGVyCisgKgorICogQElFRUU4MDIxMV9QUklWQUNZX09OOiBwcml2YWN5IGJpdCBzZXQKKyAqIEBJRUVFODAyMTFfUFJJVkFDWV9PRkY6IHByaXZhY3kgYml0IGNsZWFyCisgKiBASUVFRTgwMjExX1BSSVZBQ1lfQU5ZOiBXaWxkY2FyZCB2YWx1ZSBmb3IgbWF0Y2hpbmcgYW55IHByaXZhY3kgc2V0dGluZworICovCitlbnVtIGllZWU4MDIxMV9wcml2YWN5IHsKKwlJRUVFODAyMTFfUFJJVkFDWV9PTiwKKwlJRUVFODAyMTFfUFJJVkFDWV9PRkYsCisJSUVFRTgwMjExX1BSSVZBQ1lfQU5ZCit9OworCisjZGVmaW5lIElFRUU4MDIxMV9QUklWQUNZKHgpCVwKKwkoKHgpID8gSUVFRTgwMjExX1BSSVZBQ1lfT04gOiBJRUVFODAyMTFfUFJJVkFDWV9PRkYpCisKKy8qKgogICogc3RydWN0IGllZWU4MDIxMV9yYXRlIC0gYml0cmF0ZSBkZWZpbml0aW9uCiAgKgogICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIGEgYml0cmF0ZSB0aGF0IGFuIDgwMi4xMSBQSFkgY2FuCkBAIC0yNDIzLDYgKzI0NTYsNyBAQAogCiAJc3RydWN0IHdpcmVsZXNzX2RldiAqICgqYWRkX3ZpcnR1YWxfaW50Zikoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkJCSAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCSAgdW5zaWduZWQgY2hhciBuYW1lX2Fzc2lnbl90eXBlLAogCQkJCQkJICBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCiAJCQkJCQkgIHUzMiAqZmxhZ3MsCiAJCQkJCQkgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpOwpAQCAtMzE4MywxMCArMzIxNyw4IEBACiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGFfbW9kX21hc2s7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV92aHRfY2FwICp2aHRfY2FwYV9tb2RfbWFzazsKIAotI2lmZGVmIENPTkZJR19ORVRfTlMKIAkvKiB0aGUgbmV0d29yayBuYW1lc3BhY2UgdGhpcyBwaHkgbGl2ZXMgaW4gY3VycmVudGx5ICovCi0Jc3RydWN0IG5ldCAqX25ldDsKLSNlbmRpZgorCXBvc3NpYmxlX25ldF90IF9uZXQ7CiAKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfV0VYVAogCWNvbnN0IHN0cnVjdCBpd19oYW5kbGVyX2RlZiAqd2V4dDsKQEAgLTQwMTIsMTQgKzQwNDQsMTYgQEAKIAkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCiAJCQkJICAgICAgY29uc3QgdTggKmJzc2lkLAogCQkJCSAgICAgIGNvbnN0IHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4sCi0JCQkJICAgICAgdTE2IGNhcGFfbWFzaywgdTE2IGNhcGFfdmFsKTsKKwkJCQkgICAgICBlbnVtIGllZWU4MDIxMV9ic3NfdHlwZSBic3NfdHlwZSwKKwkJCQkgICAgICBlbnVtIGllZWU4MDIxMV9wcml2YWN5KTsKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNmZzgwMjExX2JzcyAqCiBjZmc4MDIxMV9nZXRfaWJzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKIAkJICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuKQogewogCXJldHVybiBjZmc4MDIxMV9nZXRfYnNzKHdpcGh5LCBjaGFubmVsLCBOVUxMLCBzc2lkLCBzc2lkX2xlbiwKLQkJCQlXTEFOX0NBUEFCSUxJVFlfSUJTUywgV0xBTl9DQVBBQklMSVRZX0lCU1MpOworCQkJCUlFRUU4MDIxMV9CU1NfVFlQRV9JQlNTLAorCQkJCUlFRUU4MDIxMV9QUklWQUNZX0FOWSk7CiB9CiAKIC8qKgpAQCAtNDI2MCw2ICs0Mjk0LDcgQEAKIAkJCQkJICAgaW50IGFwcHJveGxlbik7CiAKIHN0cnVjdCBza19idWZmICpfX2NmZzgwMjExX2FsbG9jX2V2ZW50X3NrYihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCQkgICBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAogCQkJCQkgICBlbnVtIG5sODAyMTFfY29tbWFuZHMgY21kLAogCQkJCQkgICBlbnVtIG5sODAyMTFfYXR0cnMgYXR0ciwKIAkJCQkJICAgaW50IHZlbmRvcl9ldmVudF9pZHgsCkBAIC00MzE0LDYgKzQzNDksNyBAQAogLyoqCiAgKiBjZmc4MDIxMV92ZW5kb3JfZXZlbnRfYWxsb2MgLSBhbGxvY2F0ZSB2ZW5kb3Itc3BlY2lmaWMgZXZlbnQgc2tiCiAgKiBAd2lwaHk6IHRoZSB3aXBoeQorICogQHdkZXY6IHRoZSB3aXJlbGVzcyBkZXZpY2UKICAqIEBldmVudF9pZHg6IGluZGV4IG9mIHRoZSB2ZW5kb3IgZXZlbnQgaW4gdGhlIHdpcGh5J3MgdmVuZG9yX2V2ZW50cwogICogQGFwcHJveGxlbjogYW4gdXBwZXIgYm91bmQgb2YgdGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0aGF0IHdpbGwKICAqCWJlIHB1dCBpbnRvIHRoZSBza2IKQEAgLTQzMjIsMTYgKzQzNTgsMjAgQEAKICAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuZCBwcmUtZmlsbHMgYW4gc2tiIGZvciBhbiBldmVudCBvbiB0aGUKICAqIHZlbmRvci1zcGVjaWZpYyBtdWx0aWNhc3QgZ3JvdXAuCiAgKgorICogSWYgd2RldiAhPSBOVUxMLCBib3RoIHRoZSBpZmluZGV4IGFuZCBpZGVudGlmaWVyIG9mIHRoZSBzcGVjaWZpZWQKKyAqIHdpcmVsZXNzIGRldmljZSBhcmUgYWRkZWQgdG8gdGhlIGV2ZW50IG1lc3NhZ2UgYmVmb3JlIHRoZSB2ZW5kb3IgZGF0YQorICogYXR0cmlidXRlLgorICoKICAqIFdoZW4gZG9uZSBmaWxsaW5nIHRoZSBza2IsIGNhbGwgY2ZnODAyMTFfdmVuZG9yX2V2ZW50KCkgd2l0aCB0aGUKICAqIHNrYiB0byBzZW5kIHRoZSBldmVudC4KICAqCiAgKiBSZXR1cm46IEFuIGFsbG9jYXRlZCBhbmQgcHJlLWZpbGxlZCBza2IuICVOVUxMIGlmIGFueSBlcnJvcnMgaGFwcGVuLgogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICoKLWNmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBpbnQgYXBwcm94bGVuLAotCQkJICAgIGludCBldmVudF9pZHgsIGdmcF90IGdmcCkKK2NmZzgwMjExX3ZlbmRvcl9ldmVudF9hbGxvYyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2LAorCQkJICAgICBpbnQgYXBwcm94bGVuLCBpbnQgZXZlbnRfaWR4LCBnZnBfdCBnZnApCiB7Ci0JcmV0dXJuIF9fY2ZnODAyMTFfYWxsb2NfZXZlbnRfc2tiKHdpcGh5LCBOTDgwMjExX0NNRF9WRU5ET1IsCisJcmV0dXJuIF9fY2ZnODAyMTFfYWxsb2NfZXZlbnRfc2tiKHdpcGh5LCB3ZGV2LCBOTDgwMjExX0NNRF9WRU5ET1IsCiAJCQkJCSAgTkw4MDIxMV9BVFRSX1ZFTkRPUl9EQVRBLAogCQkJCQkgIGV2ZW50X2lkeCwgYXBwcm94bGVuLCBnZnApOwogfQpAQCAtNDQzMiw3ICs0NDcyLDcgQEAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKgogY2ZnODAyMTFfdGVzdG1vZGVfYWxsb2NfZXZlbnRfc2tiKHN0cnVjdCB3aXBoeSAqd2lwaHksIGludCBhcHByb3hsZW4sIGdmcF90IGdmcCkKIHsKLQlyZXR1cm4gX19jZmc4MDIxMV9hbGxvY19ldmVudF9za2Iod2lwaHksIE5MODAyMTFfQ01EX1RFU1RNT0RFLAorCXJldHVybiBfX2NmZzgwMjExX2FsbG9jX2V2ZW50X3NrYih3aXBoeSwgTlVMTCwgTkw4MDIxMV9DTURfVEVTVE1PREUsCiAJCQkJCSAgTkw4MDIxMV9BVFRSX1RFU1REQVRBLCAtMSwKIAkJCQkJICBhcHByb3hsZW4sIGdmcCk7CiB9CkBAIC00ODYyLDYgKzQ5MDIsMTcgQEAKIGJvb2wgaWVlZTgwMjExX29wZXJhdGluZ19jbGFzc190b19iYW5kKHU4IG9wZXJhdGluZ19jbGFzcywKIAkJCQkgICAgICAgZW51bSBpZWVlODAyMTFfYmFuZCAqYmFuZCk7CiAKKy8qKgorICogaWVlZTgwMjExX2NoYW5kZWZfdG9fb3BlcmF0aW5nX2NsYXNzIC0gY29udmVydCBjaGFuZGVmIHRvIG9wZXJhdGlvbiBjbGFzcworICoKKyAqIEBjaGFuZGVmOiB0aGUgY2hhbmRlZiB0byBjb252ZXJ0CisgKiBAb3BfY2xhc3M6IGEgcG9pbnRlciB0byB0aGUgcmVzdWx0aW5nIG9wZXJhdGluZyBjbGFzcworICoKKyAqIFJldHVybnMgJXRydWUgaWYgdGhlIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwsICVmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgaWVlZTgwMjExX2NoYW5kZWZfdG9fb3BlcmF0aW5nX2NsYXNzKHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKKwkJCQkJICB1OCAqb3BfY2xhc3MpOworCiAvKgogICogY2ZnODAyMTFfdGRsc19vcGVyX3JlcXVlc3QgLSByZXF1ZXN0IHVzZXJzcGFjZSB0byBwZXJmb3JtIFRETFMgb3BlcmF0aW9uCiAgKiBAZGV2OiB0aGUgZGV2aWNlIG9uIHdoaWNoIHRoZSBvcGVyYXRpb24gaXMgcmVxdWVzdGVkCkBAIC00OTUwLDYgKzUwMDEsNjQgQEAKIAkJCSAgdTggKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZnNpemUpOwogCiAvKioKKyAqIGllZWU4MDIxMV9pZV9zcGxpdF9yaWMgLSBzcGxpdCBhbiBJRSBidWZmZXIgYWNjb3JkaW5nIHRvIG9yZGVyaW5nICh3aXRoIFJJQykKKyAqIEBpZXM6IHRoZSBJRSBidWZmZXIKKyAqIEBpZWxlbjogdGhlIGxlbmd0aCBvZiB0aGUgSUUgYnVmZmVyCisgKiBAaWRzOiBhbiBhcnJheSB3aXRoIGVsZW1lbnQgSURzIHRoYXQgYXJlIGFsbG93ZWQgYmVmb3JlCisgKgl0aGUgc3BsaXQKKyAqIEBuX2lkczogdGhlIHNpemUgb2YgdGhlIGVsZW1lbnQgSUQgYXJyYXkKKyAqIEBhZnRlcl9yaWM6IGFycmF5IElFIHR5cGVzIHRoYXQgY29tZSBhZnRlciB0aGUgUklDIGVsZW1lbnQKKyAqIEBuX2FmdGVyX3JpYzogc2l6ZSBvZiB0aGUgQGFmdGVyX3JpYyBhcnJheQorICogQG9mZnNldDogb2Zmc2V0IHdoZXJlIHRvIHN0YXJ0IHNwbGl0dGluZyBpbiB0aGUgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBzcGxpdHMgYW4gSUUgYnVmZmVyIGJ5IHVwZGF0aW5nIHRoZSBAb2Zmc2V0CisgKiB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGJ1ZmZlciBzaG91bGQgYmUKKyAqIHNwbGl0LgorICoKKyAqIEl0IGFzc3VtZXMgdGhhdCB0aGUgZ2l2ZW4gSUUgYnVmZmVyIGlzIHdlbGwtZm9ybWVkLCB0aGlzCisgKiBoYXMgdG8gYmUgZ3VhcmFudGVlZCBieSB0aGUgY2FsbGVyIQorICoKKyAqIEl0IGFsc28gYXNzdW1lcyB0aGF0IHRoZSBJRXMgaW4gdGhlIGJ1ZmZlciBhcmUgb3JkZXJlZAorICogY29ycmVjdGx5LCBpZiBub3QgdGhlIHJlc3VsdCBvZiB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90CisgKiBiZSBvcmRlcmVkIGNvcnJlY3RseSBlaXRoZXIsIGkuZS4gaXQgZG9lcyBubyByZW9yZGVyaW5nLgorICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBvZmZzZXQgd2hlcmUgdGhlIG5leHQgcGFydCBvZiB0aGUKKyAqIGJ1ZmZlciBzdGFydHMsIHdoaWNoIG1heSBiZSBAaWVsZW4gaWYgdGhlIGVudGlyZSAocmVtYWluZGVyKQorICogb2YgdGhlIGJ1ZmZlciBzaG91bGQgYmUgdXNlZC4KKyAqLworc2l6ZV90IGllZWU4MDIxMV9pZV9zcGxpdF9yaWMoY29uc3QgdTggKmllcywgc2l6ZV90IGllbGVuLAorCQkJICAgICAgY29uc3QgdTggKmlkcywgaW50IG5faWRzLAorCQkJICAgICAgY29uc3QgdTggKmFmdGVyX3JpYywgaW50IG5fYWZ0ZXJfcmljLAorCQkJICAgICAgc2l6ZV90IG9mZnNldCk7CisKKy8qKgorICogaWVlZTgwMjExX2llX3NwbGl0IC0gc3BsaXQgYW4gSUUgYnVmZmVyIGFjY29yZGluZyB0byBvcmRlcmluZworICogQGllczogdGhlIElFIGJ1ZmZlcgorICogQGllbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBJRSBidWZmZXIKKyAqIEBpZHM6IGFuIGFycmF5IHdpdGggZWxlbWVudCBJRHMgdGhhdCBhcmUgYWxsb3dlZCBiZWZvcmUKKyAqCXRoZSBzcGxpdAorICogQG5faWRzOiB0aGUgc2l6ZSBvZiB0aGUgZWxlbWVudCBJRCBhcnJheQorICogQG9mZnNldDogb2Zmc2V0IHdoZXJlIHRvIHN0YXJ0IHNwbGl0dGluZyBpbiB0aGUgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiBzcGxpdHMgYW4gSUUgYnVmZmVyIGJ5IHVwZGF0aW5nIHRoZSBAb2Zmc2V0CisgKiB2YXJpYWJsZSB0byBwb2ludCB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGJ1ZmZlciBzaG91bGQgYmUKKyAqIHNwbGl0LgorICoKKyAqIEl0IGFzc3VtZXMgdGhhdCB0aGUgZ2l2ZW4gSUUgYnVmZmVyIGlzIHdlbGwtZm9ybWVkLCB0aGlzCisgKiBoYXMgdG8gYmUgZ3VhcmFudGVlZCBieSB0aGUgY2FsbGVyIQorICoKKyAqIEl0IGFsc28gYXNzdW1lcyB0aGF0IHRoZSBJRXMgaW4gdGhlIGJ1ZmZlciBhcmUgb3JkZXJlZAorICogY29ycmVjdGx5LCBpZiBub3QgdGhlIHJlc3VsdCBvZiB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90CisgKiBiZSBvcmRlcmVkIGNvcnJlY3RseSBlaXRoZXIsIGkuZS4gaXQgZG9lcyBubyByZW9yZGVyaW5nLgorICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBvZmZzZXQgd2hlcmUgdGhlIG5leHQgcGFydCBvZiB0aGUKKyAqIGJ1ZmZlciBzdGFydHMsIHdoaWNoIG1heSBiZSBAaWVsZW4gaWYgdGhlIGVudGlyZSAocmVtYWluZGVyKQorICogb2YgdGhlIGJ1ZmZlciBzaG91bGQgYmUgdXNlZC4KKyAqLworc2l6ZV90IGllZWU4MDIxMV9pZV9zcGxpdChjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVsZW4sCisJCQkgIGNvbnN0IHU4ICppZHMsIGludCBuX2lkcywgc2l6ZV90IG9mZnNldCk7CisKKy8qKgogICogY2ZnODAyMTFfcmVwb3J0X3dvd2xhbl93YWtldXAgLSByZXBvcnQgd2FrZXVwIGZyb20gV29XTEFOCiAgKiBAd2RldjogdGhlIHdpcmVsZXNzIGRldmljZSByZXBvcnRpbmcgdGhlIHdha2V1cAogICogQHdha2V1cDogdGhlIHdha2V1cCByZXBvcnQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NvbXBhdC5oIGIvaW5jbHVkZS9uZXQvY29tcGF0LmgKaW5kZXggNDJhOWM4NC4uNDgxMDNjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9uZXQvY29tcGF0LmgKQEAgLTQwLDcgKzQwLDcgQEAKICNkZWZpbmUgY29tcGF0X21tc2doZHIJbW1zZ2hkcgogI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0NPTVBBVCkgKi8KIAotc3NpemVfdCBnZXRfY29tcGF0X21zZ2hkcihzdHJ1Y3QgbXNnaGRyICosIHN0cnVjdCBjb21wYXRfbXNnaGRyIF9fdXNlciAqLAoraW50IGdldF9jb21wYXRfbXNnaGRyKHN0cnVjdCBtc2doZHIgKiwgc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICosCiAJCSAgICAgIHN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKiosIHN0cnVjdCBpb3ZlYyAqKik7CiBhc21saW5rYWdlIGxvbmcgY29tcGF0X3N5c19zZW5kbXNnKGludCwgc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICosCiAJCQkJICAgdW5zaWduZWQgaW50KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RjYm5sLmggYi9pbmNsdWRlL25ldC9kY2JubC5oCmluZGV4IDU5N2I4OGEuLjIwN2Q5YmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RjYm5sLmgKKysrIGIvaW5jbHVkZS9uZXQvZGNibmwuaApAQCAtNDksNiArNDksOSBAQAogCWludCAoKmllZWVfc2V0ZXRzKSAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGllZWVfZXRzICopOwogCWludCAoKmllZWVfZ2V0bWF4cmF0ZSkgKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZWVlX21heHJhdGUgKik7CiAJaW50ICgqaWVlZV9zZXRtYXhyYXRlKSAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGllZWVfbWF4cmF0ZSAqKTsKKwlpbnQgKCppZWVlX2dldHFjbikgKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZWVlX3FjbiAqKTsKKwlpbnQgKCppZWVlX3NldHFjbikgKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZWVlX3FjbiAqKTsKKwlpbnQgKCppZWVlX2dldHFjbnN0YXRzKSAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGllZWVfcWNuX3N0YXRzICopOwogCWludCAoKmllZWVfZ2V0cGZjKSAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGllZWVfcGZjICopOwogCWludCAoKmllZWVfc2V0cGZjKSAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGllZWVfcGZjICopOwogCWludCAoKmllZWVfZ2V0YXBwKSAoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGRjYl9hcHAgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kbl9uZWlnaC5oIGIvaW5jbHVkZS9uZXQvZG5fbmVpZ2guaAppbmRleCBmYWM0ZTNmLi5kMDQyNDI2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kbl9uZWlnaC5oCisrKyBiL2luY2x1ZGUvbmV0L2RuX25laWdoLmgKQEAgLTE4LDEwICsxOCwxMSBAQAogCiB2b2lkIGRuX25laWdoX2luaXQodm9pZCk7CiB2b2lkIGRuX25laWdoX2NsZWFudXAodm9pZCk7Ci1pbnQgZG5fbmVpZ2hfcm91dGVyX2hlbGxvKHN0cnVjdCBza19idWZmICpza2IpOwotaW50IGRuX25laWdoX2VuZG5vZGVfaGVsbG8oc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgZG5fbmVpZ2hfcm91dGVyX2hlbGxvKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgZG5fbmVpZ2hfZW5kbm9kZV9oZWxsbyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBkbl9uZWlnaF9wb2ludG9wb2ludF9oZWxsbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBkbl9uZWlnaF9lbGlzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICpwdHIsIGludCBuKTsKK2ludCBkbl90b19uZWlnaF9vdXRwdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogZXh0ZXJuIHN0cnVjdCBuZWlnaF90YWJsZSBkbl9uZWlnaF90YWJsZTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZHNhLmggYi9pbmNsdWRlL25ldC9kc2EuaAppbmRleCBlZDNjMzRiLi5mYmNhNjNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kc2EuaAorKysgYi9pbmNsdWRlL25ldC9kc2EuaApAQCAtNzIsNiArNzIsNyBAQAogCSAqIHRvIHRoZSByb290IHN3aXRjaCBjaGlwIG9mIHRoZSB0cmVlLgogCSAqLwogCXN0cnVjdCBkZXZpY2UJKm5ldGRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqb2ZfbmV0ZGV2OwogCiAJLyoKIAkgKiBJbmZvIHN0cnVjdHMgZGVzY3JpYmluZyBlYWNoIG9mIHRoZSBzd2l0Y2ggY2hpcHMKQEAgLTEyOCw2ICsxMjksMTEgQEAKIAlpbnQJCQlpbmRleDsKIAogCS8qCisJICogVGFnZ2luZyBwcm90b2NvbCB1bmRlcnN0b29kIGJ5IHRoaXMgc3dpdGNoCisJICovCisJZW51bSBkc2FfdGFnX3Byb3RvY29sCXRhZ19wcm90b2NvbDsKKworCS8qCiAJICogQ29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGlzIHN3aXRjaC4KIAkgKi8KIAlzdHJ1Y3QgZHNhX2NoaXBfZGF0YQkqcGQ7CkBAIC0xNjUsNiArMTcxLDExIEBACiAJcmV0dXJuICEhKGRzLT5pbmRleCA9PSBkcy0+ZHN0LT5jcHVfc3dpdGNoICYmIHAgPT0gZHMtPmRzdC0+Y3B1X3BvcnQpOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgZHNhX2lzX3BvcnRfaW5pdGlhbGl6ZWQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcCkKK3sKKwlyZXR1cm4gZHMtPnBoeXNfcG9ydF9tYXNrICYgKDEgPDwgcCkgJiYgZHMtPnBvcnRzW3BdOworfQorCiBzdGF0aWMgaW5saW5lIHU4IGRzYV91cHN0cmVhbV9wb3J0KHN0cnVjdCBkc2Ffc3dpdGNoICpkcykKIHsKIAlzdHJ1Y3QgZHNhX3N3aXRjaF90cmVlICpkc3QgPSBkcy0+ZHN0OwpAQCAtMjc1LDYgKzI4NiwyMiBAQAogCWludAkoKmdldF9yZWdzX2xlbikoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCk7CiAJdm9pZAkoKmdldF9yZWdzKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAogCQkJICAgIHN0cnVjdCBldGh0b29sX3JlZ3MgKnJlZ3MsIHZvaWQgKnApOworCisJLyoKKwkgKiBCcmlkZ2UgaW50ZWdyYXRpb24KKwkgKi8KKwlpbnQJKCpwb3J0X2pvaW5fYnJpZGdlKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJCSAgICB1MzIgYnJfcG9ydF9tYXNrKTsKKwlpbnQJKCpwb3J0X2xlYXZlX2JyaWRnZSkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgICAgIHUzMiBicl9wb3J0X21hc2spOworCWludAkoKnBvcnRfc3RwX3VwZGF0ZSkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCQkgICB1OCBzdGF0ZSk7CisJaW50CSgqZmRiX2FkZCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCSAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQpOworCWludAkoKmZkYl9kZWwpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCisJCQkgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkKTsKKwlpbnQJKCpmZGJfZ2V0bmV4dCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwKKwkJCSAgICAgICB1bnNpZ25lZCBjaGFyICphZGRyLCBib29sICppc19zdGF0aWMpOwogfTsKIAogdm9pZCByZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqdHlwZSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc3QuaCBiL2luY2x1ZGUvbmV0L2RzdC5oCmluZGV4IGE4YWU0ZTcuLjBmYjk5YTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RzdC5oCisrKyBiL2luY2x1ZGUvbmV0L2RzdC5oCkBAIC00ODEsNiArNDgxLDcgQEAKIGVudW0gewogCVhGUk1fTE9PS1VQX0lDTVAgPSAxIDw8IDAsCiAJWEZSTV9MT09LVVBfUVVFVUUgPSAxIDw8IDEsCisJWEZSTV9MT09LVVBfS0VFUF9EU1RfUkVGID0gMSA8PCAyLAogfTsKIAogc3RydWN0IGZsb3dpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvZHN0X29wcy5oIGIvaW5jbHVkZS9uZXQvZHN0X29wcy5oCmluZGV4IDFmOTlhMWQuLmQ2NDI1MzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RzdF9vcHMuaAorKysgYi9pbmNsdWRlL25ldC9kc3Rfb3BzLmgKQEAgLTEyLDcgKzEyLDYgQEAKIAogc3RydWN0IGRzdF9vcHMgewogCXVuc2lnbmVkIHNob3J0CQlmYW1pbHk7Ci0JX19iZTE2CQkJcHJvdG9jb2w7CiAJdW5zaWduZWQgaW50CQlnY190aHJlc2g7CiAKIAlpbnQJCQkoKmdjKShzdHJ1Y3QgZHN0X29wcyAqb3BzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2ZpYl9ydWxlcy5oIGIvaW5jbHVkZS9uZXQvZmliX3J1bGVzLmgKaW5kZXggZTU4NGRlMS4uNmQ2NzM4MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZmliX3J1bGVzLmgKKysrIGIvaW5jbHVkZS9uZXQvZmliX3J1bGVzLmgKQEAgLTU4LDcgKzU4LDcgQEAKIAkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqLAogCQkJCQkgICAgIHN0cnVjdCBmaWJfcnVsZV9oZHIgKiwKIAkJCQkJICAgICBzdHJ1Y3QgbmxhdHRyICoqKTsKLQl2b2lkCQkJKCpkZWxldGUpKHN0cnVjdCBmaWJfcnVsZSAqKTsKKwlpbnQJCQkoKmRlbGV0ZSkoc3RydWN0IGZpYl9ydWxlICopOwogCWludAkJCSgqY29tcGFyZSkoc3RydWN0IGZpYl9ydWxlICosCiAJCQkJCSAgIHN0cnVjdCBmaWJfcnVsZV9oZHIgKiwKIAkJCQkJICAgc3RydWN0IG5sYXR0ciAqKik7CkBAIC05NSwxNyArOTUsMTAgQEAKIAlhdG9taWNfaW5jKCZydWxlLT5yZWZjbnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmliX3J1bGVfcHV0X3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGZpYl9ydWxlICpydWxlID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBmaWJfcnVsZSwgcmN1KTsKLQlyZWxlYXNlX25ldChydWxlLT5mcl9uZXQpOwotCWtmcmVlKHJ1bGUpOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgZmliX3J1bGVfcHV0KHN0cnVjdCBmaWJfcnVsZSAqcnVsZSkKIHsKIAlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcnVsZS0+cmVmY250KSkKLQkJY2FsbF9yY3UoJnJ1bGUtPnJjdSwgZmliX3J1bGVfcHV0X3JjdSk7CisJCWtmcmVlX3JjdShydWxlLCByY3UpOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiBmcmhfZ2V0X3RhYmxlKHN0cnVjdCBmaWJfcnVsZV9oZHIgKmZyaCwgc3RydWN0IG5sYXR0ciAqKm5sYSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2dlbmV0bGluay5oIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKaW5kZXggMDU3NGFiZC4uYTlhZjFjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKQEAgLTkyLDkgKzkyLDcgQEAKIAlzdHJ1Y3QgZ2VubG1zZ2hkciAqCWdlbmxoZHI7CiAJdm9pZCAqCQkJdXNlcmhkcjsKIAlzdHJ1Y3QgbmxhdHRyICoqCWF0dHJzOwotI2lmZGVmIENPTkZJR19ORVRfTlMKLQlzdHJ1Y3QgbmV0ICoJCV9uZXQ7Ci0jZW5kaWYKKwlwb3NzaWJsZV9uZXRfdAkJX25ldDsKIAl2b2lkICoJCQl1c2VyX3B0clsyXTsKIAlzdHJ1Y3Qgc29jayAqCQlkc3Rfc2s7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaCBiL2luY2x1ZGUvbmV0L2lmX2luZXQ2LmgKaW5kZXggOThlNWY5NS4uMWM4YjY4MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaWZfaW5ldDYuaAorKysgYi9pbmNsdWRlL25ldC9pZl9pbmV0Ni5oCkBAIC00MSwxOCArNDEsMTggQEAKIHN0cnVjdCBpbmV0Nl9pZmFkZHIgewogCXN0cnVjdCBpbjZfYWRkcgkJYWRkcjsKIAlfX3UzMgkJCXByZWZpeF9sZW47Ci0JCisKIAkvKiBJbiBzZWNvbmRzLCByZWxhdGl2ZSB0byB0c3RhbXAuIEV4cGlyeSBpcyBhdCB0c3RhbXAgKyBIWiAqIGxmdC4gKi8KIAlfX3UzMgkJCXZhbGlkX2xmdDsKIAlfX3UzMgkJCXByZWZlcmVkX2xmdDsKIAlhdG9taWNfdAkJcmVmY250OwogCXNwaW5sb2NrX3QJCWxvY2s7Ci0Jc3BpbmxvY2tfdAkJc3RhdGVfbG9jazsKIAogCWludAkJCXN0YXRlOwogCiAJX191MzIJCQlmbGFnczsKIAlfX3U4CQkJZGFkX3Byb2JlczsKKwlfX3U4CQkJc3RhYmxlX3ByaXZhY3lfcmV0cnk7CiAKIAlfX3UxNgkJCXNjb3BlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0Nl9jb25uZWN0aW9uX3NvY2suaCBiL2luY2x1ZGUvbmV0L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5oCmluZGV4IDc0YWYxMzcuLjZkNTM5ZTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5oCkBAIC0yOCw4ICsyOCw3IEBACiBzdHJ1Y3QgZHN0X2VudHJ5ICppbmV0Nl9jc2tfcm91dGVfcmVxKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGZsb3dpNiAqZmw2LAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7CiAKLXN0cnVjdCByZXF1ZXN0X3NvY2sgKmluZXQ2X2Nza19zZWFyY2hfcmVxKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkJICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqKnByZXZwLAorc3RydWN0IHJlcXVlc3Rfc29jayAqaW5ldDZfY3NrX3NlYXJjaF9yZXEoc3RydWN0IHNvY2sgKnNrLAogCQkJCQkgIGNvbnN0IF9fYmUxNiBycG9ydCwKIAkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnJhZGRyLAogCQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbGFkZHIsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmggYi9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmgKaW5kZXggOTIwMWFmZTAuLjdmZjU4OGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXQ2X2hhc2h0YWJsZXMuaAorKysgYi9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmgKQEAgLTM4LDggKzM4LDYgQEAKIAlyZXR1cm4gamhhc2hfM3dvcmRzKGxoYXNoLCBmaGFzaCwgcG9ydHMsIGluaXR2YWwpOwogfQogCi1pbnQgX19pbmV0Nl9oYXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHdwKTsKLQogLyoKICAqIFNvY2tldHMgaW4gVENQX0NMT1NFIHN0YXRlIGFyZSBfYWx3YXlzXyB0YWtlbiBvdXQgb2YgdGhlIGhhc2gsIHNvCiAgKiB3ZSBuZWVkIG5vdCBjaGVjayBpdCBmb3IgVENQIGxvb2t1cHMgYW55bW9yZSwgdGhhbmtzIEFsZXhleS4gLURhdmVNCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2NvbW1vbi5oIGIvaW5jbHVkZS9uZXQvaW5ldF9jb21tb24uaAppbmRleCBiMjgyOGEwLi40YTkyNDIzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfY29tbW9uLmgKQEAgLTIxLDEyICsyMSwxMSBAQAogaW50IGluZXRfZGdyYW1fY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLAogCQkgICAgICAgaW50IGFkZHJfbGVuLCBpbnQgZmxhZ3MpOwogaW50IGluZXRfYWNjZXB0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2ssIGludCBmbGFncyk7Ci1pbnQgaW5ldF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkgc2l6ZV90IHNpemUpOworaW50IGluZXRfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplKTsKIHNzaXplX3QgaW5ldF9zZW5kcGFnZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9mZnNldCwKIAkJICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncyk7Ci1pbnQgaW5ldF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkgc2l6ZV90IHNpemUsIGludCBmbGFncyk7CitpbnQgaW5ldF9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsCisJCSBpbnQgZmxhZ3MpOwogaW50IGluZXRfc2h1dGRvd24oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGhvdyk7CiBpbnQgaW5ldF9saXN0ZW4oc3RydWN0IHNvY2tldCAqc29jaywgaW50IGJhY2tsb2cpOwogdm9pZCBpbmV0X3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oCmluZGV4IDU5NzZiZGUuLjdiNTg4N2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaApAQCAtMTI2LDYgKzEyNiw4IEBACiAKIAkJLyogSW5mb3JtYXRpb24gb24gdGhlIGN1cnJlbnQgcHJvYmUuICovCiAJCWludAkJICBwcm9iZV9zaXplOworCisJCXUzMgkJICBwcm9iZV90aW1lc3RhbXA7CiAJfSBpY3NrX210dXA7CiAJdTMyCQkJICBpY3NrX2NhX3ByaXZbMTZdOwogCXUzMgkJCSAgaWNza191c2VyX3RpbWVvdXQ7CkBAIC0yNTQsOCArMjU2LDcgQEAKIAogc3RydWN0IHNvY2sgKmluZXRfY3NrX2FjY2VwdChzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFncywgaW50ICplcnIpOwogCi1zdHJ1Y3QgcmVxdWVzdF9zb2NrICppbmV0X2Nza19zZWFyY2hfcmVxKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkJIHN0cnVjdCByZXF1ZXN0X3NvY2sgKioqcHJldnAsCitzdHJ1Y3QgcmVxdWVzdF9zb2NrICppbmV0X2Nza19zZWFyY2hfcmVxKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJIGNvbnN0IF9fYmUxNiBycG9ydCwKIAkJCQkJIGNvbnN0IF9fYmUzMiByYWRkciwKIAkJCQkJIGNvbnN0IF9fYmUzMiBsYWRkcik7CkBAIC0yODEsMTUgKzI4MiwxMyBAQAogc3RhdGljIGlubGluZSB2b2lkIGluZXRfY3NrX3JlcXNrX3F1ZXVlX3JlbW92ZWQoc3RydWN0IHNvY2sgKnNrLAogCQkJCQkJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQogewotCWlmIChyZXFza19xdWV1ZV9yZW1vdmVkKCZpbmV0X2NzayhzayktPmljc2tfYWNjZXB0X3F1ZXVlLCByZXEpID09IDApCi0JCWluZXRfY3NrX2RlbGV0ZV9rZWVwYWxpdmVfdGltZXIoc2spOworCXJlcXNrX3F1ZXVlX3JlbW92ZWQoJmluZXRfY3NrKHNrKS0+aWNza19hY2NlcHRfcXVldWUsIHJlcSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbmV0X2Nza19yZXFza19xdWV1ZV9hZGRlZChzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgdGltZW91dCkKIHsKLQlpZiAocmVxc2tfcXVldWVfYWRkZWQoJmluZXRfY3NrKHNrKS0+aWNza19hY2NlcHRfcXVldWUpID09IDApCi0JCWluZXRfY3NrX3Jlc2V0X2tlZXBhbGl2ZV90aW1lcihzaywgdGltZW91dCk7CisJcmVxc2tfcXVldWVfYWRkZWQoJmluZXRfY3NrKHNrKS0+aWNza19hY2NlcHRfcXVldWUpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBpbmV0X2Nza19yZXFza19xdWV1ZV9sZW4oY29uc3Qgc3RydWN0IHNvY2sgKnNrKQpAQCAtMzA4LDI2ICszMDcsMTkgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGluZXRfY3NrX3JlcXNrX3F1ZXVlX3VubGluayhzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCSAgICAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkJCSAgICAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqcHJldikKKwkJCQkJICAgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKIHsKLQlyZXFza19xdWV1ZV91bmxpbmsoJmluZXRfY3NrKHNrKS0+aWNza19hY2NlcHRfcXVldWUsIHJlcSwgcHJldik7CisJcmVxc2tfcXVldWVfdW5saW5rKCZpbmV0X2NzayhzayktPmljc2tfYWNjZXB0X3F1ZXVlLCByZXEpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaW5ldF9jc2tfcmVxc2tfcXVldWVfZHJvcChzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCSAgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAotCQkJCQkgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKipwcmV2KQorCQkJCQkgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKIHsKLQlpbmV0X2Nza19yZXFza19xdWV1ZV91bmxpbmsoc2ssIHJlcSwgcHJldik7CisJaW5ldF9jc2tfcmVxc2tfcXVldWVfdW5saW5rKHNrLCByZXEpOwogCWluZXRfY3NrX3JlcXNrX3F1ZXVlX3JlbW92ZWQoc2ssIHJlcSk7Ci0JcmVxc2tfZnJlZShyZXEpOworCXJlcXNrX3B1dChyZXEpOwogfQogCi12b2lkIGluZXRfY3NrX3JlcXNrX3F1ZXVlX3BydW5lKHN0cnVjdCBzb2NrICpwYXJlbnQsCi0JCQkJY29uc3QgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCwKLQkJCQljb25zdCB1bnNpZ25lZCBsb25nIHRpbWVvdXQsCi0JCQkJY29uc3QgdW5zaWduZWQgbG9uZyBtYXhfcnRvKTsKLQogdm9pZCBpbmV0X2Nza19kZXN0cm95X3NvY2soc3RydWN0IHNvY2sgKnNrKTsKIHZvaWQgaW5ldF9jc2tfcHJlcGFyZV9mb3JjZWRfY2xvc2Uoc3RydWN0IHNvY2sgKnNrKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF9oYXNodGFibGVzLmggYi9pbmNsdWRlL25ldC9pbmV0X2hhc2h0YWJsZXMuaAppbmRleCBkZDE5NTBhLi43M2ZlMGY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X2hhc2h0YWJsZXMuaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X2hhc2h0YWJsZXMuaApAQCAtNzYsOSArNzYsNyBAQAogICogcG9ydHMgYXJlIGNyZWF0ZWQgaW4gTygxKSB0aW1lPyAgSSB0aG91Z2h0IHNvLiA7LSkJLURhdmVNCiAgKi8KIHN0cnVjdCBpbmV0X2JpbmRfYnVja2V0IHsKLSNpZmRlZiBDT05GSUdfTkVUX05TCi0Jc3RydWN0IG5ldAkJKmliX25ldDsKLSNlbmRpZgorCXBvc3NpYmxlX25ldF90CQlpYl9uZXQ7CiAJdW5zaWduZWQgc2hvcnQJCXBvcnQ7CiAJc2lnbmVkIGNoYXIJCWZhc3RyZXVzZTsKIAlzaWduZWQgY2hhcgkJZmFzdHJldXNlcG9ydDsKQEAgLTIyMyw4ICsyMjEsOCBAQAogdm9pZCBpbmV0X2JpbmRfYnVja2V0X2Rlc3Ryb3koc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwKIAkJCSAgICAgIHN0cnVjdCBpbmV0X2JpbmRfYnVja2V0ICp0Yik7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGluZXRfYmhhc2hmbihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IF9fdTE2IGxwb3J0LAotCQkJICAgICAgIGNvbnN0IGludCBiaGFzaF9zaXplKQorc3RhdGljIGlubGluZSB1MzIgaW5ldF9iaGFzaGZuKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3QgX191MTYgbHBvcnQsCisJCQkgICAgICAgY29uc3QgdTMyIGJoYXNoX3NpemUpCiB7CiAJcmV0dXJuIChscG9ydCArIG5ldF9oYXNoX21peChuZXQpKSAmIChiaGFzaF9zaXplIC0gMSk7CiB9CkBAIC0yMzMsNyArMjMxLDcgQEAKIAkJICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNudW0pOwogCiAvKiBUaGVzZSBjYW4gaGF2ZSB3aWxkY2FyZHMsIGRvbid0IHRyeSB0b28gaGFyZC4gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGluZXRfbGhhc2hmbihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHVuc2lnbmVkIHNob3J0IG51bSkKK3N0YXRpYyBpbmxpbmUgdTMyIGluZXRfbGhhc2hmbihjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHVuc2lnbmVkIHNob3J0IG51bSkKIHsKIAlyZXR1cm4gKG51bSArIG5ldF9oYXNoX21peChuZXQpKSAmIChJTkVUX0xIVEFCTEVfU0laRSAtIDEpOwogfQpAQCAtMjUxLDYgKzI0OSw3IEBACiB2b2lkIGluZXRfaGFzaGluZm9faW5pdChzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaCk7CiAKIGludCBfX2luZXRfaGFzaF9ub2xpc3RlbihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KTsKK2ludCBfX2luZXRfaGFzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KTsKIHZvaWQgaW5ldF9oYXNoKHN0cnVjdCBzb2NrICpzayk7CiB2b2lkIGluZXRfdW5oYXNoKHN0cnVjdCBzb2NrICpzayk7CiAKQEAgLTM4NSwxMyArMzg0LDMyIEBACiAJCQkJICAgICBpcGgtPmRhZGRyLCBkcG9ydCwgaW5ldF9paWYoc2tiKSk7CiB9CiAKK3UzMiBza19laGFzaGZuKGNvbnN0IHN0cnVjdCBzb2NrICpzayk7Cit1MzIgaW5ldDZfZWhhc2hmbihjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCisJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpsYWRkciwgY29uc3QgdTE2IGxwb3J0LAorCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZmFkZHIsIGNvbnN0IF9fYmUxNiBmcG9ydCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza19kYWRkcl9zZXQoc3RydWN0IHNvY2sgKnNrLCBfX2JlMzIgYWRkcikKK3sKKwlzay0+c2tfZGFkZHIgPSBhZGRyOyAvKiBhbGlhcyBvZiBpbmV0X2RhZGRyICovCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKwlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKGFkZHIsICZzay0+c2tfdjZfZGFkZHIpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBza19yY3Zfc2FkZHJfc2V0KHN0cnVjdCBzb2NrICpzaywgX19iZTMyIGFkZHIpCit7CisJc2stPnNrX3Jjdl9zYWRkciA9IGFkZHI7IC8qIGFsaWFzIG9mIGluZXRfcmN2X3NhZGRyICovCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKwlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKGFkZHIsICZzay0+c2tfdjZfcmN2X3NhZGRyKTsKKyNlbmRpZgorfQorCiBpbnQgX19pbmV0X2hhc2hfY29ubmVjdChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgKmRlYXRoX3JvdywKIAkJCXN0cnVjdCBzb2NrICpzaywgdTMyIHBvcnRfb2Zmc2V0LAogCQkJaW50ICgqY2hlY2tfZXN0YWJsaXNoZWQpKHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqLAogCQkJCQkJIHN0cnVjdCBzb2NrICosIF9fdTE2LAotCQkJCQkJIHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKiopLAotCQkJaW50ICgqaGFzaCkoc3RydWN0IHNvY2sgKnNrLAotCQkJCSAgICBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0d3ApKTsKKwkJCQkJCSBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICoqKSk7CiAKIGludCBpbmV0X2hhc2hfY29ubmVjdChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgKmRlYXRoX3JvdywKIAkJICAgICAgc3RydWN0IHNvY2sgKnNrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfc29jay5oIGIvaW5jbHVkZS9uZXQvaW5ldF9zb2NrLmgKaW5kZXggZWIxNmM3Yi4uYjZjMzczNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldF9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9zb2NrLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC9yZXF1ZXN0X3NvY2suaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMvaGFzaC5oPgorI2luY2x1ZGUgPG5ldC90Y3Bfc3RhdGVzLmg+CiAKIC8qKiBzdHJ1Y3QgaXBfb3B0aW9ucyAtIElQIE9wdGlvbnMKICAqCkBAIC03Nyw2ICs3OCwxMCBAQAogI2RlZmluZSBpcl92Nl9ybXRfYWRkcgkJcmVxLl9fcmVxX2NvbW1vbi5za2NfdjZfZGFkZHIKICNkZWZpbmUgaXJfdjZfbG9jX2FkZHIJCXJlcS5fX3JlcV9jb21tb24uc2tjX3Y2X3Jjdl9zYWRkcgogI2RlZmluZSBpcl9paWYJCQlyZXEuX19yZXFfY29tbW9uLnNrY19ib3VuZF9kZXZfaWYKKyNkZWZpbmUgaXJfY29va2llCQlyZXEuX19yZXFfY29tbW9uLnNrY19jb29raWUKKyNkZWZpbmUgaXJlcV9uZXQJCXJlcS5fX3JlcV9jb21tb24uc2tjX25ldAorI2RlZmluZSBpcmVxX3N0YXRlCQlyZXEuX19yZXFfY29tbW9uLnNrY19zdGF0ZQorI2RlZmluZSBpcmVxX2ZhbWlseQkJcmVxLl9fcmVxX2NvbW1vbi5za2NfZmFtaWx5CiAKIAlrbWVtY2hlY2tfYml0ZmllbGRfYmVnaW4oZmxhZ3MpOwogCXUxNgkJCXNuZF93c2NhbGUgOiA0LApAQCAtODgsMTEgKzkzLDExIEBACiAJCQkJYWNrZWQJICAgOiAxLAogCQkJCW5vX3NyY2NoZWNrOiAxOwogCWttZW1jaGVja19iaXRmaWVsZF9lbmQoZmxhZ3MpOworCXUzMiAgICAgICAgICAgICAgICAgICAgIGlyX21hcms7CiAJdW5pb24gewogCQlzdHJ1Y3QgaXBfb3B0aW9uc19yY3UJKm9wdDsKIAkJc3RydWN0IHNrX2J1ZmYJCSpwa3RvcHRzOwogCX07Ci0JdTMyICAgICAgICAgICAgICAgICAgICAgaXJfbWFyazsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppbmV0X3Jzayhjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpzaykKQEAgLTEwMCwxMyArMTA1LDEyIEBACiAJcmV0dXJuIChzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKilzazsKIH0KIAotc3RhdGljIGlubGluZSB1MzIgaW5ldF9yZXF1ZXN0X21hcmsoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSB1MzIgaW5ldF9yZXF1ZXN0X21hcmsoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmICghc2stPnNrX21hcmsgJiYgc29ja19uZXQoc2spLT5pcHY0LnN5c2N0bF90Y3BfZndtYXJrX2FjY2VwdCkgeworCWlmICghc2stPnNrX21hcmsgJiYgc29ja19uZXQoc2spLT5pcHY0LnN5c2N0bF90Y3BfZndtYXJrX2FjY2VwdCkKIAkJcmV0dXJuIHNrYi0+bWFyazsKLQl9IGVsc2UgewotCQlyZXR1cm4gc2stPnNrX21hcms7Ci0JfQorCisJcmV0dXJuIHNrLT5za19tYXJrOwogfQogCiBzdHJ1Y3QgaW5ldF9jb3JrIHsKQEAgLTIzOSwxOCArMjQzLDggQEAKIAkJCSAgICBpbml0dmFsKTsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVxdWVzdF9zb2NrICppbmV0X3JlcXNrX2FsbG9jKHN0cnVjdCByZXF1ZXN0X3NvY2tfb3BzICpvcHMpCi17Ci0Jc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxID0gcmVxc2tfYWxsb2Mob3BzKTsKLQlzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXEgPSBpbmV0X3JzayhyZXEpOwotCi0JaWYgKHJlcSAhPSBOVUxMKSB7Ci0JCWttZW1jaGVja19hbm5vdGF0ZV9iaXRmaWVsZChpcmVxLCBmbGFncyk7Ci0JCWlyZXEtPm9wdCA9IE5VTEw7Ci0JfQotCi0JcmV0dXJuIHJlcTsKLX0KK3N0cnVjdCByZXF1ZXN0X3NvY2sgKmluZXRfcmVxc2tfYWxsb2MoY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgKm9wcywKKwkJCQkgICAgICBzdHJ1Y3Qgc29jayAqc2tfbGlzdGVuZXIpOwogCiBzdGF0aWMgaW5saW5lIF9fdTggaW5ldF9za19mbG93aV9mbGFncyhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaCBiL2luY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oCmluZGV4IDZjNTY2MDMuLjM2MGM0ODAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfdGltZXdhaXRfc29jay5oCkBAIC0zMSw2NyArMzEsMTQgQEAKIAogc3RydWN0IGluZXRfaGFzaGluZm87CiAKLSNkZWZpbmUgSU5FVF9UV0RSX1JFQ1lDTEVfU0xPVFNfTE9HCTUKLSNkZWZpbmUgSU5FVF9UV0RSX1JFQ1lDTEVfU0xPVFMJCSgxIDw8IElORVRfVFdEUl9SRUNZQ0xFX1NMT1RTX0xPRykKLQotLyoKLSAqIElmIHRpbWUgPiA0c2VjLCBpdCBpcyAic2xvdyIgcGF0aCwgbm8gcmVjeWNsaW5nIGlzIHJlcXVpcmVkLAotICogc28gdGhhdCB3ZSBzZWxlY3QgdGljayB0byBnZXQgcmFuZ2UgYWJvdXQgNCBzZWNvbmRzLgotICovCi0jaWYgSFogPD0gMTYgfHwgSFogPiA0MDk2Ci0jIGVycm9yIFVuc3VwcG9ydGVkOiBIWiA8PSAxNiBvciBIWiA+IDQwOTYKLSNlbGlmIEhaIDw9IDMyCi0jIGRlZmluZSBJTkVUX1RXRFJfUkVDWUNMRV9USUNLICg1ICsgMiAtIElORVRfVFdEUl9SRUNZQ0xFX1NMT1RTX0xPRykKLSNlbGlmIEhaIDw9IDY0Ci0jIGRlZmluZSBJTkVUX1RXRFJfUkVDWUNMRV9USUNLICg2ICsgMiAtIElORVRfVFdEUl9SRUNZQ0xFX1NMT1RTX0xPRykKLSNlbGlmIEhaIDw9IDEyOAotIyBkZWZpbmUgSU5FVF9UV0RSX1JFQ1lDTEVfVElDSyAoNyArIDIgLSBJTkVUX1RXRFJfUkVDWUNMRV9TTE9UU19MT0cpCi0jZWxpZiBIWiA8PSAyNTYKLSMgZGVmaW5lIElORVRfVFdEUl9SRUNZQ0xFX1RJQ0sgKDggKyAyIC0gSU5FVF9UV0RSX1JFQ1lDTEVfU0xPVFNfTE9HKQotI2VsaWYgSFogPD0gNTEyCi0jIGRlZmluZSBJTkVUX1RXRFJfUkVDWUNMRV9USUNLICg5ICsgMiAtIElORVRfVFdEUl9SRUNZQ0xFX1NMT1RTX0xPRykKLSNlbGlmIEhaIDw9IDEwMjQKLSMgZGVmaW5lIElORVRfVFdEUl9SRUNZQ0xFX1RJQ0sgKDEwICsgMiAtIElORVRfVFdEUl9SRUNZQ0xFX1NMT1RTX0xPRykKLSNlbGlmIEhaIDw9IDIwNDgKLSMgZGVmaW5lIElORVRfVFdEUl9SRUNZQ0xFX1RJQ0sgKDExICsgMiAtIElORVRfVFdEUl9SRUNZQ0xFX1NMT1RTX0xPRykKLSNlbHNlCi0jIGRlZmluZSBJTkVUX1RXRFJfUkVDWUNMRV9USUNLICgxMiArIDIgLSBJTkVUX1RXRFJfUkVDWUNMRV9TTE9UU19MT0cpCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSB1MzIgaW5ldF90d190aW1lX3N0YW1wKHZvaWQpCi17Ci0JcmV0dXJuIGppZmZpZXM7Ci19Ci0KLS8qIFRJTUVfV0FJVCByZWFwaW5nIG1lY2hhbmlzbS4gKi8KLSNkZWZpbmUgSU5FVF9UV0RSX1RXS0lMTF9TTE9UUwk4IC8qIFBsZWFzZSBrZWVwIHRoaXMgYSBwb3dlciBvZiAyLiAqLwotCi0jZGVmaW5lIElORVRfVFdEUl9UV0tJTExfUVVPVEEgMTAwCi0KIHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyB7Ci0JLyogU2hvcnQtdGltZSB0aW1ld2FpdCBjYWxlbmRhciAqLwotCWludAkJCXR3Y2FsX2hhbmQ7Ci0JdW5zaWduZWQgbG9uZwkJdHdjYWxfamlmZmllOwotCXN0cnVjdCB0aW1lcl9saXN0CXR3Y2FsX3RpbWVyOwotCXN0cnVjdCBobGlzdF9oZWFkCXR3Y2FsX3Jvd1tJTkVUX1RXRFJfUkVDWUNMRV9TTE9UU107CisJYXRvbWljX3QJCXR3X2NvdW50OwogCi0Jc3BpbmxvY2tfdAkJZGVhdGhfbG9jazsKLQlpbnQJCQl0d19jb3VudDsKLQlpbnQJCQlwZXJpb2Q7Ci0JdTMyCQkJdGhyZWFkX3Nsb3RzOwotCXN0cnVjdCB3b3JrX3N0cnVjdAl0d2tpbGxfd29yazsKLQlzdHJ1Y3QgdGltZXJfbGlzdAl0d190aW1lcjsKLQlpbnQJCQlzbG90OwotCXN0cnVjdCBobGlzdF9oZWFkCWNlbGxzW0lORVRfVFdEUl9UV0tJTExfU0xPVFNdOwotCXN0cnVjdCBpbmV0X2hhc2hpbmZvIAkqaGFzaGluZm87CisJc3RydWN0IGluZXRfaGFzaGluZm8gCSpoYXNoaW5mbyBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOwogCWludAkJCXN5c2N0bF90d19yZWN5Y2xlOwogCWludAkJCXN5c2N0bF9tYXhfdHdfYnVja2V0czsKIH07CiAKLXZvaWQgaW5ldF90d2RyX2hhbmdtYW4odW5zaWduZWQgbG9uZyBkYXRhKTsKLXZvaWQgaW5ldF90d2RyX3R3a2lsbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci12b2lkIGluZXRfdHdkcl90d2NhbF90aWNrKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci0KIHN0cnVjdCBpbmV0X2JpbmRfYnVja2V0OwogCiAvKgpAQCAtMTIyLDYgKzY5LDcgQEAKICNkZWZpbmUgdHdfdjZfcmN2X3NhZGRyICAgIAlfX3R3X2NvbW1vbi5za2NfdjZfcmN2X3NhZGRyCiAjZGVmaW5lIHR3X2Rwb3J0CQlfX3R3X2NvbW1vbi5za2NfZHBvcnQKICNkZWZpbmUgdHdfbnVtCQkJX190d19jb21tb24uc2tjX251bQorI2RlZmluZSB0d19jb29raWUJCV9fdHdfY29tbW9uLnNrY19jb29raWUKIAogCWludAkJCXR3X3RpbWVvdXQ7CiAJdm9sYXRpbGUgdW5zaWduZWQgY2hhcgl0d19zdWJzdGF0ZTsKQEAgLTEzMiw1MiArODAsMTggQEAKIAlfX2JlMTYJCQl0d19zcG9ydDsKIAlrbWVtY2hlY2tfYml0ZmllbGRfYmVnaW4oZmxhZ3MpOwogCS8qIEFuZCB0aGVzZSBhcmUgb3Vycy4gKi8KLQl1bnNpZ25lZCBpbnQJCXR3X3BhZDAJCTogMSwJLyogMSBiaXQgaG9sZSAqLworCXVuc2lnbmVkIGludAkJdHdfa2lsbAkJOiAxLAogCQkJCXR3X3RyYW5zcGFyZW50ICA6IDEsCiAJCQkJdHdfZmxvd2xhYmVsCTogMjAsCiAJCQkJdHdfcGFkCQk6IDIsCS8qIDIgYml0cyBob2xlICovCiAJCQkJdHdfdG9zCQk6IDg7CiAJa21lbWNoZWNrX2JpdGZpZWxkX2VuZChmbGFncyk7Ci0JdTMyCQkJdHdfdHRkOworCXN0cnVjdCB0aW1lcl9saXN0CXR3X3RpbWVyOwogCXN0cnVjdCBpbmV0X2JpbmRfYnVja2V0CSp0d190YjsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZQl0d19kZWF0aF9ub2RlOworCXN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqdHdfZHI7CiB9OwogI2RlZmluZSB0d190Y2xhc3MgdHdfdG9zCiAKLXN0YXRpYyBpbmxpbmUgaW50IGluZXRfdHdza19kZWFkX2hhc2hlZChjb25zdCBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dykKLXsKLQlyZXR1cm4gIWhsaXN0X3VuaGFzaGVkKCZ0dy0+dHdfZGVhdGhfbm9kZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbmV0X3R3c2tfZGVhZF9ub2RlX2luaXQoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcpCi17Ci0JdHctPnR3X2RlYXRoX25vZGUucHByZXYgPSBOVUxMOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19pbmV0X3R3c2tfZGVsX2RlYWRfbm9kZShzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dykKLXsKLQlfX2hsaXN0X2RlbCgmdHctPnR3X2RlYXRoX25vZGUpOwotCWluZXRfdHdza19kZWFkX25vZGVfaW5pdCh0dyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGluZXRfdHdza19kZWxfZGVhZF9ub2RlKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KQotewotCWlmIChpbmV0X3R3c2tfZGVhZF9oYXNoZWQodHcpKSB7Ci0JCV9faW5ldF90d3NrX2RlbF9kZWFkX25vZGUodHcpOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgaW5ldF90d3NrX2Zvcl9lYWNoKHR3LCBub2RlLCBoZWFkKSBcCi0JaGxpc3RfbnVsbHNfZm9yX2VhY2hfZW50cnkodHcsIG5vZGUsIGhlYWQsIHR3X25vZGUpCi0KLSNkZWZpbmUgaW5ldF90d3NrX2Zvcl9lYWNoX2lubWF0ZSh0dywgamFpbCkgXAotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHR3LCBqYWlsLCB0d19kZWF0aF9ub2RlKQotCi0jZGVmaW5lIGluZXRfdHdza19mb3JfZWFjaF9pbm1hdGVfc2FmZSh0dywgc2FmZSwgamFpbCkgXAotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHcsIHNhZmUsIGphaWwsIHR3X2RlYXRoX25vZGUpCi0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqaW5ldF90d3NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKIHsKIAlyZXR1cm4gKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKilzazsKQEAgLTE5MiwxNiArMTA2LDE0IEBACiAJCQkgIHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbyk7CiAKIHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKmluZXRfdHdza19hbGxvYyhjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgIHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqZHIsCiAJCQkJCSAgIGNvbnN0IGludCBzdGF0ZSk7CiAKIHZvaWQgX19pbmV0X3R3c2tfaGFzaGRhbmNlKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3LCBzdHJ1Y3Qgc29jayAqc2ssCiAJCQkgICBzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaGFzaGluZm8pOwogCi12b2lkIGluZXRfdHdza19zY2hlZHVsZShzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dywKLQkJCXN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqdHdkciwKLQkJCWNvbnN0IGludCB0aW1lbywgY29uc3QgaW50IHRpbWV3YWl0X2xlbik7Ci12b2lkIGluZXRfdHdza19kZXNjaGVkdWxlKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3LAotCQkJICBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgKnR3ZHIpOwordm9pZCBpbmV0X3R3c2tfc2NoZWR1bGUoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcsIGNvbnN0IGludCB0aW1lbyk7Cit2b2lkIGluZXRfdHdza19kZXNjaGVkdWxlKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KTsKIAogdm9pZCBpbmV0X3R3c2tfcHVyZ2Uoc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLAogCQkgICAgIHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqdHdkciwgaW50IGZhbWlseSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0cGVlci5oIGIvaW5jbHVkZS9uZXQvaW5ldHBlZXIuaAppbmRleCA4MDQ3OWFiLi5kNTMzMmRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0cGVlci5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRwZWVyLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAl1bmlvbiB7CiAJCV9fYmUzMgkJCWE0OwogCQlfX2JlMzIJCQlhNls0XTsKKwkJc3RydWN0IGluNl9hZGRyCQlpbjY7CiAJfTsKIH07CiAKQEAgLTE1MSw3ICsxNTIsNyBAQAogewogCXN0cnVjdCBpbmV0cGVlcl9hZGRyIGRhZGRyOwogCi0JKihzdHJ1Y3QgaW42X2FkZHIgKilkYWRkci5hZGRyLmE2ID0gKnY2ZGFkZHI7CisJZGFkZHIuYWRkci5pbjYgPSAqdjZkYWRkcjsKIAlkYWRkci5mYW1pbHkgPSBBRl9JTkVUNjsKIAlyZXR1cm4gaW5ldF9nZXRwZWVyKGJhc2UsICZkYWRkciwgY3JlYXRlKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwLmggYi9pbmNsdWRlL25ldC9pcC5oCmluZGV4IDAyNWM2MWMuLmQxNGFmN2UgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwLmgKKysrIGIvaW5jbHVkZS9uZXQvaXAuaApAQCAtMTA4LDcgKzEwOCw4IEBACiBpbnQgaXBfbXJfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgaXBfb3V0cHV0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgaXBfbWNfb3V0cHV0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1pbnQgaXBfZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICgqb3V0cHV0KShzdHJ1Y3Qgc2tfYnVmZiAqKSk7CitpbnQgaXBfZnJhZ21lbnQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlpbnQgKCpvdXRwdXQpKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopKTsKIGludCBpcF9kb19uYXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkIGlwX3NlbmRfY2hlY2soc3RydWN0IGlwaGRyICppcCk7CiBpbnQgX19pcF9sb2NhbF9vdXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CkBAIC0zMTgsOSArMzE5LDEwIEBACiB9CiAKIHUzMiBpcF9pZGVudHNfcmVzZXJ2ZSh1MzIgaGFzaCwgaW50IHNlZ3MpOwotdm9pZCBfX2lwX3NlbGVjdF9pZGVudChzdHJ1Y3QgaXBoZHIgKmlwaCwgaW50IHNlZ3MpOwordm9pZCBfX2lwX3NlbGVjdF9pZGVudChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBpcGhkciAqaXBoLCBpbnQgc2Vncyk7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcF9zZWxlY3RfaWRlbnRfc2VncyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2ssIGludCBzZWdzKQorc3RhdGljIGlubGluZSB2b2lkIGlwX3NlbGVjdF9pZGVudF9zZWdzKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJc3RydWN0IHNvY2sgKnNrLCBpbnQgc2VncykKIHsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCkBAIC0zMzcsMTMgKzMzOSwxNCBAQAogCQkJaXBoLT5pZCA9IDA7CiAJCX0KIAl9IGVsc2UgewotCQlfX2lwX3NlbGVjdF9pZGVudChpcGgsIHNlZ3MpOworCQlfX2lwX3NlbGVjdF9pZGVudChuZXQsIGlwaCwgc2Vncyk7CiAJfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaXBfc2VsZWN0X2lkZW50KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcF9zZWxlY3RfaWRlbnQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIHN0cnVjdCBzb2NrICpzaykKIHsKLQlpcF9zZWxlY3RfaWRlbnRfc2Vncyhza2IsIHNrLCAxKTsKKwlpcF9zZWxlY3RfaWRlbnRfc2VncyhuZXQsIHNrYiwgc2ssIDEpOwogfQogCiBzdGF0aWMgaW5saW5lIF9fd3N1bSBpbmV0X2NvbXB1dGVfcHNldWRvKHN0cnVjdCBza19idWZmICpza2IsIGludCBwcm90bykKQEAgLTQ1MywyMiArNDU2LDYgQEAKIAogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgaW50IHNrX21jX2xvb3Aoc3RydWN0IHNvY2sgKnNrKQotewotCWlmICghc2spCi0JCXJldHVybiAxOwotCXN3aXRjaCAoc2stPnNrX2ZhbWlseSkgewotCWNhc2UgQUZfSU5FVDoKLQkJcmV0dXJuIGluZXRfc2soc2spLT5tY19sb29wOwotI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JY2FzZSBBRl9JTkVUNjoKLQkJcmV0dXJuIGluZXQ2X3NrKHNrKS0+bWNfbG9vcDsKLSNlbmRpZgotCX0KLQlXQVJOX09OKDEpOwotCXJldHVybiAxOwotfQotCiBib29sIGlwX2NhbGxfcmFfY2hhaW4oc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIC8qCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcDZfcm91dGUuaCBiL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCmluZGV4IDFkMDliNDYuLjVlMTkyMDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCisrKyBiL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCkBAIC0xNzAsMTEgKzE3MCwxMyBAQAogCXJldHVybiBydC0+cnQ2aV9mbGFncyAmIFJURl9BTllDQVNUOwogfQogCi1pbnQgaXA2X2ZyYWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIGludCAoKm91dHB1dCkoc3RydWN0IHNrX2J1ZmYgKikpOworaW50IGlwNl9mcmFnbWVudChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCSBpbnQgKCpvdXRwdXQpKHN0cnVjdCBzb2NrICosIHN0cnVjdCBza19idWZmICopKTsKIAogc3RhdGljIGlubGluZSBpbnQgaXA2X3NrYl9kc3RfbXR1KHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IGlwdjZfcGluZm8gKm5wID0gc2tiLT5zayA/IGluZXQ2X3NrKHNrYi0+c2spIDogTlVMTDsKKwlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBza2ItPnNrICYmICFkZXZfcmVjdXJzaW9uX2xldmVsKCkgPworCQkJCWluZXQ2X3NrKHNrYi0+c2spIDogTlVMTDsKIAogCXJldHVybiAobnAgJiYgbnAtPnBtdHVkaXNjID49IElQVjZfUE1UVURJU0NfUFJPQkUpID8KIAkgICAgICAgc2tiX2RzdChza2IpLT5kZXYtPm10dSA6IGRzdF9tdHUoc2tiX2RzdChza2IpKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwNl90dW5uZWwuaCBiL2luY2x1ZGUvbmV0L2lwNl90dW5uZWwuaAppbmRleCA3NmMwOTFiLi5iODUyOWFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcDZfdHVubmVsLmgKKysrIGIvaW5jbHVkZS9uZXQvaXA2X3R1bm5lbC5oCkBAIC03MSwxNCArNzEsMTYgQEAKIF9fdTMyIGlwNl90bmxfZ2V0X2NhcChzdHJ1Y3QgaXA2X3RubCAqdCwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpsYWRkciwKIAkJCSAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpyYWRkcik7CiBzdHJ1Y3QgbmV0ICppcDZfdG5sX2dldF9saW5rX25ldChjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2ludCBpcDZfdG5sX2dldF9pZmxpbmsoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcDZ0dW5uZWxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGlubGluZSB2b2lkIGlwNnR1bm5lbF94bWl0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CiAJaW50IHBrdF9sZW4sIGVycjsKIAogCXBrdF9sZW4gPSBza2ItPmxlbjsKLQllcnIgPSBpcDZfbG9jYWxfb3V0KHNrYik7CisJZXJyID0gaXA2X2xvY2FsX291dF9zayhzaywgc2tiKTsKIAogCWlmIChuZXRfeG1pdF9ldmFsKGVycikgPT0gMCkgewogCQlzdHJ1Y3QgcGNwdV9zd19uZXRzdGF0cyAqdHN0YXRzID0gdGhpc19jcHVfcHRyKGRldi0+dHN0YXRzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwX2ZpYi5oIGIvaW5jbHVkZS9uZXQvaXBfZmliLmgKaW5kZXggNWJkMTIwZS4uNTQyNzFlZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXBfZmliLmgKKysrIGIvaW5jbHVkZS9uZXQvaXBfZmliLmgKQEAgLTEzNiw3ICsxMzYsNyBAQAogCXUzMgkJdGNsYXNzaWQ7CiAJc3RydWN0IGZpYl9pbmZvICpmaTsKIAlzdHJ1Y3QgZmliX3RhYmxlICp0YWJsZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpmYV9oZWFkOworCXN0cnVjdCBobGlzdF9oZWFkICpmYV9oZWFkOwogfTsKIAogc3RydWN0IGZpYl9yZXN1bHRfbmwgewpAQCAtMTg1LDcgKzE4NSw5IEBACiAJdTMyCQkJdGJfaWQ7CiAJaW50CQkJdGJfZGVmYXVsdDsKIAlpbnQJCQl0Yl9udW1fZGVmYXVsdDsKLQl1bnNpZ25lZCBsb25nCQl0Yl9kYXRhWzBdOworCXN0cnVjdCByY3VfaGVhZAkJcmN1OworCXVuc2lnbmVkIGxvbmcgCQkqdGJfZGF0YTsKKwl1bnNpZ25lZCBsb25nCQlfX2RhdGFbMF07CiB9OwogCiBpbnQgZmliX3RhYmxlX2xvb2t1cChzdHJ1Y3QgZmliX3RhYmxlICp0YiwgY29uc3Qgc3RydWN0IGZsb3dpNCAqZmxwLApAQCAtMTk1LDEwICsxOTcsMTAgQEAKIGludCBmaWJfdGFibGVfZHVtcChzdHJ1Y3QgZmliX3RhYmxlICp0YWJsZSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKTsKIGludCBmaWJfdGFibGVfZmx1c2goc3RydWN0IGZpYl90YWJsZSAqdGFibGUpOworc3RydWN0IGZpYl90YWJsZSAqZmliX3RyaWVfdW5tZXJnZShzdHJ1Y3QgZmliX3RhYmxlICptYWluX3RiKTsKK3ZvaWQgZmliX3RhYmxlX2ZsdXNoX2V4dGVybmFsKHN0cnVjdCBmaWJfdGFibGUgKnRhYmxlKTsKIHZvaWQgZmliX2ZyZWVfdGFibGUoc3RydWN0IGZpYl90YWJsZSAqdGIpOwogCi0KLQogI2lmbmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCiAKICNkZWZpbmUgVEFCTEVfTE9DQUxfSU5ERVgJKFJUX1RBQkxFX0xPQ0FMICYgKEZJQl9UQUJMRV9IQVNIU1ogLSAxKSkKQEAgLTIwNiwxMiArMjA4LDE2IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGZpYl90YWJsZSAqZmliX2dldF90YWJsZShzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBpZCkKIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdGJfaGxpc3Q7CiAJc3RydWN0IGhsaXN0X2hlYWQgKnB0cjsKIAogCXB0ciA9IGlkID09IFJUX1RBQkxFX0xPQ0FMID8KIAkJJm5ldC0+aXB2NC5maWJfdGFibGVfaGFzaFtUQUJMRV9MT0NBTF9JTkRFWF0gOgogCQkmbmV0LT5pcHY0LmZpYl90YWJsZV9oYXNoW1RBQkxFX01BSU5fSU5ERVhdOwotCXJldHVybiBobGlzdF9lbnRyeShwdHItPmZpcnN0LCBzdHJ1Y3QgZmliX3RhYmxlLCB0Yl9obGlzdCk7CisKKwl0Yl9obGlzdCA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGhsaXN0X2ZpcnN0X3JjdShwdHIpKTsKKworCXJldHVybiBobGlzdF9lbnRyeSh0Yl9obGlzdCwgc3RydWN0IGZpYl90YWJsZSwgdGJfaGxpc3QpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBmaWJfdGFibGUgKmZpYl9uZXdfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpCkBAIC0yMjIsMTQgKzIyOCwxMyBAQAogc3RhdGljIGlubGluZSBpbnQgZmliX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBmbG93aTQgKmZscCwKIAkJCSAgICAgc3RydWN0IGZpYl9yZXN1bHQgKnJlcykKIHsKKwlzdHJ1Y3QgZmliX3RhYmxlICp0YjsKIAlpbnQgZXJyID0gLUVORVRVTlJFQUNIOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCi0JaWYgKCFmaWJfdGFibGVfbG9va3VwKGZpYl9nZXRfdGFibGUobmV0LCBSVF9UQUJMRV9MT0NBTCksIGZscCwgcmVzLAotCQkJICAgICAgRklCX0xPT0tVUF9OT1JFRikgfHwKLQkgICAgIWZpYl90YWJsZV9sb29rdXAoZmliX2dldF90YWJsZShuZXQsIFJUX1RBQkxFX01BSU4pLCBmbHAsIHJlcywKLQkJCSAgICAgIEZJQl9MT09LVVBfTk9SRUYpKQorCXRiID0gZmliX2dldF90YWJsZShuZXQsIFJUX1RBQkxFX01BSU4pOworCWlmICh0YiAmJiAhZmliX3RhYmxlX2xvb2t1cCh0YiwgZmxwLCByZXMsIEZJQl9MT09LVVBfTk9SRUYpKQogCQllcnIgPSAwOwogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0yNDksMjggKzI1NCwyOSBAQAogc3RhdGljIGlubGluZSBpbnQgZmliX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmbG93aTQgKmZscCwKIAkJCSAgICAgc3RydWN0IGZpYl9yZXN1bHQgKnJlcykKIHsKLQlpZiAoIW5ldC0+aXB2NC5maWJfaGFzX2N1c3RvbV9ydWxlcykgewotCQlpbnQgZXJyID0gLUVORVRVTlJFQUNIOworCXN0cnVjdCBmaWJfdGFibGUgKnRiOworCWludCBlcnI7CiAKLQkJcmN1X3JlYWRfbG9jaygpOworCWlmIChuZXQtPmlwdjQuZmliX2hhc19jdXN0b21fcnVsZXMpCisJCXJldHVybiBfX2ZpYl9sb29rdXAobmV0LCBmbHAsIHJlcyk7CiAKLQkJcmVzLT50Y2xhc3NpZCA9IDA7Ci0JCWlmICgobmV0LT5pcHY0LmZpYl9sb2NhbCAmJgotCQkgICAgICFmaWJfdGFibGVfbG9va3VwKG5ldC0+aXB2NC5maWJfbG9jYWwsIGZscCwgcmVzLAotCQkJCSAgICAgICBGSUJfTE9PS1VQX05PUkVGKSkgfHwKLQkJICAgIChuZXQtPmlwdjQuZmliX21haW4gJiYKLQkJICAgICAhZmliX3RhYmxlX2xvb2t1cChuZXQtPmlwdjQuZmliX21haW4sIGZscCwgcmVzLAotCQkJCSAgICAgICBGSUJfTE9PS1VQX05PUkVGKSkgfHwKLQkJICAgIChuZXQtPmlwdjQuZmliX2RlZmF1bHQgJiYKLQkJICAgICAhZmliX3RhYmxlX2xvb2t1cChuZXQtPmlwdjQuZmliX2RlZmF1bHQsIGZscCwgcmVzLAotCQkJCSAgICAgICBGSUJfTE9PS1VQX05PUkVGKSkpCi0JCQllcnIgPSAwOworCXJjdV9yZWFkX2xvY2soKTsKIAotCQlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXMtPnRjbGFzc2lkID0gMDsKIAotCQlyZXR1cm4gZXJyOworCWZvciAoZXJyID0gMDsgIWVycjsgZXJyID0gLUVORVRVTlJFQUNIKSB7CisJCXRiID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwobmV0LT5pcHY0LmZpYl9tYWluKTsKKwkJaWYgKHRiICYmICFmaWJfdGFibGVfbG9va3VwKHRiLCBmbHAsIHJlcywgRklCX0xPT0tVUF9OT1JFRikpCisJCQlicmVhazsKKworCQl0YiA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKG5ldC0+aXB2NC5maWJfZGVmYXVsdCk7CisJCWlmICh0YiAmJiAhZmliX3RhYmxlX2xvb2t1cCh0YiwgZmxwLCByZXMsIEZJQl9MT09LVVBfTk9SRUYpKQorCQkJYnJlYWs7CiAJfQotCXJldHVybiBfX2ZpYl9sb29rdXAobmV0LCBmbHAsIHJlcyk7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBlcnI7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTICovCkBAIC0yOTQsNiArMzAwLDggQEAKIAlyZXR1cm4gMDsKIH0KICNlbmRpZgoraW50IGZpYl91bm1lcmdlKHN0cnVjdCBuZXQgKm5ldCk7Cit2b2lkIGZpYl9mbHVzaF9leHRlcm5hbChzdHJ1Y3QgbmV0ICpuZXQpOwogCiAvKiBFeHBvcnRlZCBieSBmaWJfc2VtYW50aWNzLmMgKi8KIGludCBpcF9maWJfY2hlY2tfZGVmYXVsdChfX2JlMzIgZ3csIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtMzA0LDcgKzMxMiw3IEBACiAKIC8qIEV4cG9ydGVkIGJ5IGZpYl90cmllLmMgKi8KIHZvaWQgZmliX3RyaWVfaW5pdCh2b2lkKTsKLXN0cnVjdCBmaWJfdGFibGUgKmZpYl90cmllX3RhYmxlKHUzMiBpZCk7CitzdHJ1Y3QgZmliX3RhYmxlICpmaWJfdHJpZV90YWJsZSh1MzIgaWQsIHN0cnVjdCBmaWJfdGFibGUgKmFsaWFzKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGZpYl9jb21iaW5lX2l0YWcodTMyICppdGFnLCBjb25zdCBzdHJ1Y3QgZmliX3Jlc3VsdCAqcmVzKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXBfdHVubmVscy5oIGIvaW5jbHVkZS9uZXQvaXBfdHVubmVscy5oCmluZGV4IDJjNDcwNjEuLmQ4MjE0Y2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwX3R1bm5lbHMuaAorKysgYi9pbmNsdWRlL25ldC9pcF90dW5uZWxzLmgKQEAgLTE0Miw2ICsxNDIsNyBAQAogdm9pZCBpcF90dW5uZWxfdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCAgaXBfdHVubmVsX2RlbGxpbmsoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCk7CiBzdHJ1Y3QgbmV0ICppcF90dW5uZWxfZ2V0X2xpbmtfbmV0KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworaW50IGlwX3R1bm5lbF9nZXRfaWZsaW5rKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IGlwX3R1bm5lbF9pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQsIGludCBpcF90bmxfbmV0X2lkLAogCQkgICAgICAgc3RydWN0IHJ0bmxfbGlua19vcHMgKm9wcywgY2hhciAqZGV2bmFtZSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwX3ZzLmggYi9pbmNsdWRlL25ldC9pcF92cy5oCmluZGV4IDYxNWIyMGIuLjRlMzczMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwX3ZzLmgKKysrIGIvaW5jbHVkZS9uZXQvaXBfdnMuaApAQCAtNDcsMTMgKzQ3LDEzIEBACiAJICogU3RhcnQgd2l0aCB0aGUgbW9zdCBsaWtlbHkgaGl0CiAJICogRW5kIHdpdGggQlVHCiAJICovCi0JaWYgKGxpa2VseShza2ItPmRldiAmJiBza2ItPmRldi0+bmRfbmV0KSkKKwlpZiAobGlrZWx5KHNrYi0+ZGV2ICYmIGRldl9uZXQoc2tiLT5kZXYpKSkKIAkJcmV0dXJuIGRldl9uZXQoc2tiLT5kZXYpOwogCWlmIChza2JfZHN0KHNrYikgJiYgc2tiX2RzdChza2IpLT5kZXYpCiAJCXJldHVybiBkZXZfbmV0KHNrYl9kc3Qoc2tiKS0+ZGV2KTsKIAlXQVJOKHNrYi0+c2ssICJNYXliZSBza2Jfc2tuZXQgc2hvdWxkIGJlIHVzZWQgaW4gJXMoKSBhdCBsaW5lOiVkXG4iLAogCQkgICAgICBfX2Z1bmNfXywgX19MSU5FX18pOwotCWlmIChsaWtlbHkoc2tiLT5zayAmJiBza2ItPnNrLT5za19uZXQpKQorCWlmIChsaWtlbHkoc2tiLT5zayAmJiBzb2NrX25ldChza2ItPnNrKSkpCiAJCXJldHVybiBzb2NrX25ldChza2ItPnNrKTsKIAlwcl9lcnIoIlRoZXJlIGlzIG5vIG5ldCBwdHIgdG8gZmluZCBpbiB0aGUgc2tiIGluICVzKCkgbGluZTolZFxuIiwKIAkJX19mdW5jX18sIF9fTElORV9fKTsKQEAgLTcxLDExICs3MSwxMSBAQAogI2lmZGVmIENPTkZJR19ORVRfTlMKICNpZmRlZiBDT05GSUdfSVBfVlNfREVCVUcKIAkvKiBTdGFydCB3aXRoIHRoZSBtb3N0IGxpa2VseSBoaXQgKi8KLQlpZiAobGlrZWx5KHNrYi0+c2sgJiYgc2tiLT5zay0+c2tfbmV0KSkKKwlpZiAobGlrZWx5KHNrYi0+c2sgJiYgc29ja19uZXQoc2tiLT5zaykpKQogCQlyZXR1cm4gc29ja19uZXQoc2tiLT5zayk7CiAJV0FSTihza2ItPmRldiwgIk1heWJlIHNrYl9uZXQgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBpbiAlcygpIGxpbmU6JWRcbiIsCiAJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18pOwotCWlmIChsaWtlbHkoc2tiLT5kZXYgJiYgc2tiLT5kZXYtPm5kX25ldCkpCisJaWYgKGxpa2VseShza2ItPmRldiAmJiBkZXZfbmV0KHNrYi0+ZGV2KSkpCiAJCXJldHVybiBkZXZfbmV0KHNrYi0+ZGV2KTsKIAlwcl9lcnIoIlRoZXJlIGlzIG5vIG5ldCBwdHIgdG8gZmluZCBpbiB0aGUgc2tiIGluICVzKCkgbGluZTolZFxuIiwKIAkJX19mdW5jX18sIF9fTElORV9fKTsKQEAgLTM2NSwxNSArMzY1LDE1IEBACiAKIC8qIGNvdW50ZXJzIHBlciBjcHUgKi8KIHN0cnVjdCBpcF92c19jb3VudGVycyB7Ci0JX191MzIJCWNvbm5zOwkJLyogY29ubmVjdGlvbnMgc2NoZWR1bGVkICovCi0JX191MzIJCWlucGt0czsJCS8qIGluY29taW5nIHBhY2tldHMgKi8KLQlfX3UzMgkJb3V0cGt0czsJLyogb3V0Z29pbmcgcGFja2V0cyAqLworCV9fdTY0CQljb25uczsJCS8qIGNvbm5lY3Rpb25zIHNjaGVkdWxlZCAqLworCV9fdTY0CQlpbnBrdHM7CQkvKiBpbmNvbWluZyBwYWNrZXRzICovCisJX191NjQJCW91dHBrdHM7CS8qIG91dGdvaW5nIHBhY2tldHMgKi8KIAlfX3U2NAkJaW5ieXRlczsJLyogaW5jb21pbmcgYnl0ZXMgKi8KIAlfX3U2NAkJb3V0Ynl0ZXM7CS8qIG91dGdvaW5nIGJ5dGVzICovCiB9OwogLyogU3RhdHMgcGVyIGNwdSAqLwogc3RydWN0IGlwX3ZzX2NwdV9zdGF0cyB7Ci0Jc3RydWN0IGlwX3ZzX2NvdW50ZXJzICAgdXN0YXRzOworCXN0cnVjdCBpcF92c19jb3VudGVycyAgIGNudDsKIAlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgICBzeW5jcDsKIH07CiAKQEAgLTM4MywyMyArMzgzLDQwIEBACiAKIAl1NjQJCQlsYXN0X2luYnl0ZXM7CiAJdTY0CQkJbGFzdF9vdXRieXRlczsKLQl1MzIJCQlsYXN0X2Nvbm5zOwotCXUzMgkJCWxhc3RfaW5wa3RzOwotCXUzMgkJCWxhc3Rfb3V0cGt0czsKKwl1NjQJCQlsYXN0X2Nvbm5zOworCXU2NAkJCWxhc3RfaW5wa3RzOworCXU2NAkJCWxhc3Rfb3V0cGt0czsKIAotCXUzMgkJCWNwczsKLQl1MzIJCQlpbnBwczsKLQl1MzIJCQlvdXRwcHM7Ci0JdTMyCQkJaW5icHM7Ci0JdTMyCQkJb3V0YnBzOworCXU2NAkJCWNwczsKKwl1NjQJCQlpbnBwczsKKwl1NjQJCQlvdXRwcHM7CisJdTY0CQkJaW5icHM7CisJdTY0CQkJb3V0YnBzOworfTsKKworLyoKKyAqIElQVlMgc3RhdGlzdGljcyBvYmplY3QsIDY0LWJpdCBrZXJuZWwgdmVyc2lvbiBvZiBzdHJ1Y3QgaXBfdnNfc3RhdHNfdXNlcgorICovCitzdHJ1Y3QgaXBfdnNfa3N0YXRzIHsKKwl1NjQJCQljb25uczsJCS8qIGNvbm5lY3Rpb25zIHNjaGVkdWxlZCAqLworCXU2NAkJCWlucGt0czsJCS8qIGluY29taW5nIHBhY2tldHMgKi8KKwl1NjQJCQlvdXRwa3RzOwkvKiBvdXRnb2luZyBwYWNrZXRzICovCisJdTY0CQkJaW5ieXRlczsJLyogaW5jb21pbmcgYnl0ZXMgKi8KKwl1NjQJCQlvdXRieXRlczsJLyogb3V0Z29pbmcgYnl0ZXMgKi8KKworCXU2NAkJCWNwczsJCS8qIGN1cnJlbnQgY29ubmVjdGlvbiByYXRlICovCisJdTY0CQkJaW5wcHM7CQkvKiBjdXJyZW50IGluIHBhY2tldCByYXRlICovCisJdTY0CQkJb3V0cHBzOwkJLyogY3VycmVudCBvdXQgcGFja2V0IHJhdGUgKi8KKwl1NjQJCQlpbmJwczsJCS8qIGN1cnJlbnQgaW4gYnl0ZSByYXRlICovCisJdTY0CQkJb3V0YnBzOwkJLyogY3VycmVudCBvdXQgYnl0ZSByYXRlICovCiB9OwogCiBzdHJ1Y3QgaXBfdnNfc3RhdHMgewotCXN0cnVjdCBpcF92c19zdGF0c191c2VyCXVzdGF0czsJCS8qIHN0YXRpc3RpY3MgKi8KKwlzdHJ1Y3QgaXBfdnNfa3N0YXRzCWtzdGF0czsJCS8qIGtlcm5lbCBzdGF0aXN0aWNzICovCiAJc3RydWN0IGlwX3ZzX2VzdGltYXRvcgllc3Q7CQkvKiBlc3RpbWF0b3IgKi8KIAlzdHJ1Y3QgaXBfdnNfY3B1X3N0YXRzIF9fcGVyY3B1CSpjcHVzdGF0czsJLyogcGVyIGNwdSBjb3VudGVycyAqLwogCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBzcGluIGxvY2sgKi8KLQlzdHJ1Y3QgaXBfdnNfc3RhdHNfdXNlcgl1c3RhdHMwOwkvKiByZXNldCB2YWx1ZXMgKi8KKwlzdHJ1Y3QgaXBfdnNfa3N0YXRzCWtzdGF0czA7CS8qIHJlc2V0IHZhbHVlcyAqLwogfTsKIAogc3RydWN0IGRzdF9lbnRyeTsKQEAgLTkyNCw2ICs5NDEsNyBAQAogCWludAkJCXN5c2N0bF9uYXRfaWNtcF9zZW5kOwogCWludAkJCXN5c2N0bF9wbXR1X2Rpc2M7CiAJaW50CQkJc3lzY3RsX2JhY2t1cF9vbmx5OworCWludAkJCXN5c2N0bF9jb25uX3JldXNlX21vZGU7CiAKIAkvKiBpcF92c19sYmxjICovCiAJaW50CQkJc3lzY3RsX2xibGNfZXhwaXJhdGlvbjsKQEAgLTEwNDIsNiArMTA2MCwxMSBAQAogCSAgICAgICBpcHZzLT5zeXNjdGxfYmFja3VwX29ubHk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHN5c2N0bF9jb25uX3JldXNlX21vZGUoc3RydWN0IG5ldG5zX2lwdnMgKmlwdnMpCit7CisJcmV0dXJuIGlwdnMtPnN5c2N0bF9jb25uX3JldXNlX21vZGU7Cit9CisKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgaW50IHN5c2N0bF9zeW5jX3RocmVzaG9sZChzdHJ1Y3QgbmV0bnNfaXB2cyAqaXB2cykKQEAgLTExMDksNiArMTEzMiwxMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBzeXNjdGxfY29ubl9yZXVzZV9tb2RlKHN0cnVjdCBuZXRuc19pcHZzICppcHZzKQoreworCXJldHVybiAxOworfQorCiAjZW5kaWYKIAogLyogSVBWUyBjb3JlIGZ1bmN0aW9ucwpAQCAtMTM4OCw4ICsxNDE2LDcgQEAKIHZvaWQgaXBfdnNfc3RhcnRfZXN0aW1hdG9yKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGlwX3ZzX3N0YXRzICpzdGF0cyk7CiB2b2lkIGlwX3ZzX3N0b3BfZXN0aW1hdG9yKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGlwX3ZzX3N0YXRzICpzdGF0cyk7CiB2b2lkIGlwX3ZzX3plcm9fZXN0aW1hdG9yKHN0cnVjdCBpcF92c19zdGF0cyAqc3RhdHMpOwotdm9pZCBpcF92c19yZWFkX2VzdGltYXRvcihzdHJ1Y3QgaXBfdnNfc3RhdHNfdXNlciAqZHN0LAotCQkJICBzdHJ1Y3QgaXBfdnNfc3RhdHMgKnN0YXRzKTsKK3ZvaWQgaXBfdnNfcmVhZF9lc3RpbWF0b3Ioc3RydWN0IGlwX3ZzX2tzdGF0cyAqZHN0LCBzdHJ1Y3QgaXBfdnNfc3RhdHMgKnN0YXRzKTsKIAogLyogVmFyaW91cyBJUFZTIHBhY2tldCB0cmFuc21pdHRlcnMgKGZyb20gaXBfdnNfeG1pdC5jKSAqLwogaW50IGlwX3ZzX251bGxfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcHY2LmggYi9pbmNsdWRlL25ldC9pcHY2LmgKaW5kZXggNGM5ZmUyMi4uZWVjOGFkMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbmV0L2lwdjYuaApAQCAtNDcsOCArNDcsNiBAQAogCiAjZGVmaW5lIE5FWFRIRFJfTUFYCQkyNTUKIAotCi0KICNkZWZpbmUgSVBWNl9ERUZBVUxUX0hPUExJTUlUICAgNjQKICNkZWZpbmUgSVBWNl9ERUZBVUxUX01DQVNUSE9QUwkxCiAKQEAgLTY3MSw4ICs2NjksOSBAQAogCXJldHVybiBfX2lwdjZfYWRkcl9kaWZmKGExLCBhMiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOwogfQogCi12b2lkIGlwdjZfc2VsZWN0X2lkZW50KHN0cnVjdCBmcmFnX2hkciAqZmhkciwgc3RydWN0IHJ0Nl9pbmZvICpydCk7Ci12b2lkIGlwdjZfcHJveHlfc2VsZWN0X2lkZW50KHN0cnVjdCBza19idWZmICpza2IpOwordm9pZCBpcHY2X3NlbGVjdF9pZGVudChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmcmFnX2hkciAqZmhkciwKKwkJICAgICAgIHN0cnVjdCBydDZfaW5mbyAqcnQpOwordm9pZCBpcHY2X3Byb3h5X3NlbGVjdF9pZGVudChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IpOwogCiBpbnQgaXA2X2RzdF9ob3BsaW1pdChzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogCkBAIC03NjgsNyArNzY3LDcgQEAKIGludCBpcHY2X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCSAgICAgc3RydWN0IHBhY2tldF90eXBlICpwdCwgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KTsKIAotaW50IGlwNl9yY3ZfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpOworaW50IGlwNl9yY3ZfZmluaXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIC8qCiAgKgl1cHBlci1sYXllciBvdXRwdXQgZnVuY3Rpb25zCkBAIC04MjYsNiArODI1LDcgQEAKIGludCBpcDZfbWNfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIGludCBfX2lwNl9sb2NhbF9vdXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgaXA2X2xvY2FsX291dF9zayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogaW50IGlwNl9sb2NhbF9vdXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIC8qCkBAIC05NDAsNCArOTQwLDggQEAKIHZvaWQgaXB2Nl9zeXNjdGxfdW5yZWdpc3Rlcih2b2lkKTsKICNlbmRpZgogCitpbnQgaXB2Nl9zb2NrX21jX2pvaW4oc3RydWN0IHNvY2sgKnNrLCBpbnQgaWZpbmRleCwKKwkJICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKTsKK2ludCBpcHY2X3NvY2tfbWNfZHJvcChzdHJ1Y3Qgc29jayAqc2ssIGludCBpZmluZGV4LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpOwogI2VuZGlmIC8qIF9ORVRfSVBWNl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmggYi9pbmNsdWRlL25ldC9pd19oYW5kbGVyLmgKaW5kZXggYTgzMGIwMS4uOGY4MWJiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXdfaGFuZGxlci5oCisrKyBiL2luY2x1ZGUvbmV0L2l3X2hhbmRsZXIuaApAQCAtNTE5LDYgKzUxOSwxNyBAQAogCXJldHVybiBzdHJlYW07CiB9CiAKK3N0YXRpYyBpbmxpbmUgY2hhciAqCitpd2Vfc3RyZWFtX2FkZF9ldmVudF9jaGVjayhzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLCBjaGFyICpzdHJlYW0sCisJCQkgICBjaGFyICplbmRzLCBzdHJ1Y3QgaXdfZXZlbnQgKml3ZSwgaW50IGV2ZW50X2xlbikKK3sKKwljaGFyICpyZXMgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBzdHJlYW0sIGVuZHMsIGl3ZSwgZXZlbnRfbGVuKTsKKworCWlmIChyZXMgPT0gc3RyZWFtKQorCQlyZXR1cm4gRVJSX1BUUigtRTJCSUcpOworCXJldHVybiByZXM7Cit9CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIC8qCiAgKiBXcmFwcGVyIHRvIGFkZCBhbiBzaG9ydCBXaXJlbGVzcyBFdmVudCBjb250YWluaW5nIGEgcG9pbnRlciB0byBhCkBAIC01NDUsNiArNTU2LDE3IEBACiAJcmV0dXJuIHN0cmVhbTsKIH0KIAorc3RhdGljIGlubGluZSBjaGFyICoKK2l3ZV9zdHJlYW1fYWRkX3BvaW50X2NoZWNrKHN0cnVjdCBpd19yZXF1ZXN0X2luZm8gKmluZm8sIGNoYXIgKnN0cmVhbSwKKwkJCSAgIGNoYXIgKmVuZHMsIHN0cnVjdCBpd19ldmVudCAqaXdlLCBjaGFyICpleHRyYSkKK3sKKwljaGFyICpyZXMgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBzdHJlYW0sIGVuZHMsIGl3ZSwgZXh0cmEpOworCisJaWYgKHJlcyA9PSBzdHJlYW0pCisJCXJldHVybiBFUlJfUFRSKC1FMkJJRyk7CisJcmV0dXJuIHJlczsKK30KKwogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogLyoKICAqIFdyYXBwZXIgdG8gYWRkIGEgdmFsdWUgdG8gYSBXaXJlbGVzcyBFdmVudCBpbiBhIHN0cmVhbSBvZiBldmVudHMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9tYWM4MDIxMS5oIGIvaW5jbHVkZS9uZXQvbWFjODAyMTEuaAppbmRleCBkNTI5MTRiLi5iNGJlZjExIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKQEAgLTg0LDYgKzg0LDM5IEBACiAgKgogICovCiAKKy8qKgorICogRE9DOiBtYWM4MDIxMSBzb2Z0d2FyZSB0eCBxdWV1ZWluZworICoKKyAqIG1hYzgwMjExIHByb3ZpZGVzIGFuIG9wdGlvbmFsIGludGVybWVkaWF0ZSBxdWV1ZWluZyBpbXBsZW1lbnRhdGlvbiBkZXNpZ25lZAorICogdG8gYWxsb3cgdGhlIGRyaXZlciB0byBrZWVwIGhhcmR3YXJlIHF1ZXVlcyBzaG9ydCBhbmQgcHJvdmlkZSBzb21lIGZhaXJuZXNzCisgKiBiZXR3ZWVuIGRpZmZlcmVudCBzdGF0aW9ucy9pbnRlcmZhY2VzLgorICogSW4gdGhpcyBtb2RlbCwgdGhlIGRyaXZlciBwdWxscyBkYXRhIGZyYW1lcyBmcm9tIHRoZSBtYWM4MDIxMSBxdWV1ZSBpbnN0ZWFkCisgKiBvZiBsZXR0aW5nIG1hYzgwMjExIHB1c2ggdGhlbSB2aWEgZHJ2X3R4KCkuCisgKiBPdGhlciBmcmFtZXMgKGUuZy4gY29udHJvbCBvciBtYW5hZ2VtZW50KSBhcmUgc3RpbGwgcHVzaGVkIHVzaW5nIGRydl90eCgpLgorICoKKyAqIERyaXZlcnMgaW5kaWNhdGUgdGhhdCB0aGV5IHVzZSB0aGlzIG1vZGVsIGJ5IGltcGxlbWVudGluZyB0aGUgLndha2VfdHhfcXVldWUKKyAqIGRyaXZlciBvcGVyYXRpb24uCisgKgorICogSW50ZXJtZWRpYXRlIHF1ZXVlcyAoc3RydWN0IGllZWU4MDIxMV90eHEpIGFyZSBrZXB0IHBlci1zdGEgcGVyLXRpZCwgd2l0aCBhCisgKiBzaW5nbGUgcGVyLXZpZiBxdWV1ZSBmb3IgbXVsdGljYXN0IGRhdGEgZnJhbWVzLgorICoKKyAqIFRoZSBkcml2ZXIgaXMgZXhwZWN0ZWQgdG8gaW5pdGlhbGl6ZSBpdHMgcHJpdmF0ZSBwZXItcXVldWUgZGF0YSBmb3Igc3RhdGlvbnMKKyAqIGFuZCBpbnRlcmZhY2VzIGluIHRoZSAuYWRkX2ludGVyZmFjZSBhbmQgLnN0YV9hZGQgb3BzLgorICoKKyAqIFRoZSBkcml2ZXIgY2FuJ3QgYWNjZXNzIHRoZSBxdWV1ZSBkaXJlY3RseS4gVG8gZGVxdWV1ZSBhIGZyYW1lLCBpdCBjYWxscworICogaWVlZTgwMjExX3R4X2RlcXVldWUoKS4gV2hlbmV2ZXIgbWFjODAyMTEgYWRkcyBhIG5ldyBmcmFtZSB0byBhIHF1ZXVlLCBpdAorICogY2FsbHMgdGhlIC53YWtlX3R4X3F1ZXVlIGRyaXZlciBvcC4KKyAqCisgKiBGb3IgQVAgcG93ZXJzYXZlIFRJTSBoYW5kbGluZywgdGhlIGRyaXZlciBvbmx5IG5lZWRzIHRvIGluZGljYXRlIGlmIGl0IGhhcworICogYnVmZmVyZWQgcGFja2V0cyBpbiB0aGUgZHJpdmVyIHNwZWNpZmljIGRhdGEgc3RydWN0dXJlcyBieSBjYWxsaW5nCisgKiBpZWVlODAyMTFfc3RhX3NldF9idWZmZXJlZCgpLiBGb3IgZnJhbWVzIGJ1ZmZlcmVkIGluIHRoZSBpZWVlODAyMTFfdHhxCisgKiBzdHJ1Y3QsIG1hYzgwMjExIHNldHMgdGhlIGFwcHJvcHJpYXRlIFRJTSBQVkIgYml0cyBhbmQgY2FsbHMKKyAqIC5yZWxlYXNlX2J1ZmZlcmVkX2ZyYW1lcygpLgorICogSW4gdGhhdCBjYWxsYmFjayB0aGUgZHJpdmVyIGlzIHRoZXJlZm9yZSBleHBlY3RlZCB0byByZWxlYXNlIGl0cyBvd24KKyAqIGJ1ZmZlcmVkIGZyYW1lcyBhbmQgYWZ0ZXJ3YXJkcyBhbHNvIGZyYW1lcyBmcm9tIHRoZSBpZWVlODAyMTFfdHhxIChvYnRhaW5lZAorICogdmlhIHRoZSB1c3VhbCBpZWVlODAyMTFfdHhfZGVxdWV1ZSkuCisgKi8KKwogc3RydWN0IGRldmljZTsKIAogLyoqCkBAIC0zMDEsMTcgKzMzNCw4NiBAQAogI2RlZmluZSBJRUVFODAyMTFfQlNTX0FSUF9BRERSX0xJU1RfTEVOIDQKIAogLyoqCi0gKiBlbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50IC0gUlNTSSB0aHJlc2hvbGQgZXZlbnQKLSAqIEFuIGluZGljYXRvciBmb3Igd2hlbiBSU1NJIGdvZXMgYmVsb3cvYWJvdmUgYSBjZXJ0YWluIHRocmVzaG9sZC4KLSAqIEBSU1NJX0VWRU5UX0hJR0g6IEFQJ3MgcnNzaSBjcm9zc2VkIHRoZSBoaWdoIHRocmVzaG9sZCBzZXQgYnkgdGhlIGRyaXZlci4KLSAqIEBSU1NJX0VWRU5UX0xPVzogQVAncyByc3NpIGNyb3NzZWQgdGhlIGxvdyB0aHJlc2hvbGQgc2V0IGJ5IHRoZSBkcml2ZXIuCisgKiBlbnVtIGllZWU4MDIxMV9ldmVudF90eXBlIC0gZXZlbnQgdG8gYmUgbm90aWZpZWQgdG8gdGhlIGxvdyBsZXZlbCBkcml2ZXIKKyAqIEBSU1NJX0VWRU5UOiBBUCdzIHJzc2kgY3Jvc3NlZCB0aGUgYSB0aHJlc2hvbGQgc2V0IGJ5IHRoZSBkcml2ZXIuCisgKiBATUxNRV9FVkVOVDogZXZlbnQgcmVsYXRlZCB0byBNTE1FCiAgKi8KLWVudW0gaWVlZTgwMjExX3Jzc2lfZXZlbnQgeworZW51bSBpZWVlODAyMTFfZXZlbnRfdHlwZSB7CisJUlNTSV9FVkVOVCwKKwlNTE1FX0VWRU5ULAorfTsKKworLyoqCisgKiBlbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50X2RhdGEgLSByZWxldmFudCB3aGVuIGV2ZW50IHR5cGUgaXMgJVJTU0lfRVZFTlQKKyAqIEBSU1NJX0VWRU5UX0hJR0g6IEFQJ3MgcnNzaSB3ZW50IGJlbG93IHRoZSB0aHJlc2hvbGQgc2V0IGJ5IHRoZSBkcml2ZXIuCisgKiBAUlNTSV9FVkVOVF9MT1c6IEFQJ3MgcnNzaSB3ZW50IGFib3ZlIHRoZSB0aHJlc2hvbGQgc2V0IGJ5IHRoZSBkcml2ZXIuCisgKi8KK2VudW0gaWVlZTgwMjExX3Jzc2lfZXZlbnRfZGF0YSB7CiAJUlNTSV9FVkVOVF9ISUdILAogCVJTU0lfRVZFTlRfTE9XLAogfTsKIAogLyoqCisgKiBlbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50IC0gZGF0YSBhdHRhY2hlZCB0byBhbiAlUlNTSV9FVkVOVAorICogQGRhdGE6IFNlZSAmZW51bSBpZWVlODAyMTFfcnNzaV9ldmVudF9kYXRhCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfcnNzaV9ldmVudCB7CisJZW51bSBpZWVlODAyMTFfcnNzaV9ldmVudF9kYXRhIGRhdGE7Cit9OworCisvKioKKyAqIGVudW0gaWVlZTgwMjExX21sbWVfZXZlbnRfZGF0YSAtIHJlbGV2YW50IHdoZW4gZXZlbnQgdHlwZSBpcyAlTUxNRV9FVkVOVAorICogQEFVVEhfRVZFTlQ6IHRoZSBNTE1FIG9wZXJhdGlvbiBpcyBhdXRoZW50aWNhdGlvbgorICogQEFTU09DX0VWRU5UOiB0aGUgTUxNRSBvcGVyYXRpb24gaXMgYXNzb2NpYXRpb24KKyAqIEBERUFVVEhfUlhfRVZFTlQ6IGRlYXV0aCByZWNlaXZlZC4uCisgKiBAREVBVVRIX1RYX0VWRU5UOiBkZWF1dGggc2VudC4KKyAqLworZW51bSBpZWVlODAyMTFfbWxtZV9ldmVudF9kYXRhIHsKKwlBVVRIX0VWRU5ULAorCUFTU09DX0VWRU5ULAorCURFQVVUSF9SWF9FVkVOVCwKKwlERUFVVEhfVFhfRVZFTlQsCit9OworCisvKioKKyAqIGVudW0gaWVlZTgwMjExX21sbWVfZXZlbnRfc3RhdHVzIC0gcmVsZXZhbnQgd2hlbiBldmVudCB0eXBlIGlzICVNTE1FX0VWRU5UCisgKiBATUxNRV9TVUNDRVNTOiB0aGUgTUxNRSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAqIEBNTE1FX0RFTklFRDogdGhlIE1MTUUgb3BlcmF0aW9uIHdhcyBkZW5pZWQgYnkgdGhlIHBlZXIuCisgKiBATUxNRV9USU1FT1VUOiB0aGUgTUxNRSBvcGVyYXRpb24gdGltZWQgb3V0LgorICovCitlbnVtIGllZWU4MDIxMV9tbG1lX2V2ZW50X3N0YXR1cyB7CisJTUxNRV9TVUNDRVNTLAorCU1MTUVfREVOSUVELAorCU1MTUVfVElNRU9VVCwKK307CisKKy8qKgorICogZW51bSBpZWVlODAyMTFfbWxtZV9ldmVudCAtIGRhdGEgYXR0YWNoZWQgdG8gYW4gJU1MTUVfRVZFTlQKKyAqIEBkYXRhOiBTZWUgJmVudW0gaWVlZTgwMjExX21sbWVfZXZlbnRfZGF0YQorICogQHN0YXR1czogU2VlICZlbnVtIGllZWU4MDIxMV9tbG1lX2V2ZW50X3N0YXR1cworICogQHJlYXNvbjogdGhlIHJlYXNvbiBjb2RlIGlmIGFwcGxpY2FibGUKKyAqLworc3RydWN0IGllZWU4MDIxMV9tbG1lX2V2ZW50IHsKKwllbnVtIGllZWU4MDIxMV9tbG1lX2V2ZW50X2RhdGEgZGF0YTsKKwllbnVtIGllZWU4MDIxMV9tbG1lX2V2ZW50X3N0YXR1cyBzdGF0dXM7CisJdTE2IHJlYXNvbjsKK307CisKKy8qKgorICogc3RydWN0IGllZWU4MDIxMV9ldmVudCAtIGV2ZW50IHRvIGJlIHNlbnQgdG8gdGhlIGRyaXZlcgorICogQHR5cGUgVGhlIGV2ZW50IGl0c2VsZi4gU2VlICZlbnVtIGllZWU4MDIxMV9ldmVudF90eXBlLgorICogQHJzc2k6IHJlbGV2YW50IGlmICZ0eXBlIGlzICVSU1NJX0VWRU5UCisgKiBAbWxtZTogcmVsZXZhbnQgaWYgJnR5cGUgaXMgJUFVVEhfRVZFTlQKKyAqLworc3RydWN0IGllZWU4MDIxMV9ldmVudCB7CisJZW51bSBpZWVlODAyMTFfZXZlbnRfdHlwZSB0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IGllZWU4MDIxMV9yc3NpX2V2ZW50IHJzc2k7CisJCXN0cnVjdCBpZWVlODAyMTFfbWxtZV9ldmVudCBtbG1lOworCX0gdTsKK307CisKKy8qKgogICogc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAtIGhvbGRzIHRoZSBCU1MncyBjaGFuZ2luZyBwYXJhbWV0ZXJzCiAgKgogICogVGhpcyBzdHJ1Y3R1cmUga2VlcHMgaW5mb3JtYXRpb24gYWJvdXQgYSBCU1MgKGFuZCBhbiBhc3NvY2lhdGlvbgpAQCAtMzM3LDEyICs0MzksMTUgQEAKICAqCUhXIGZsYWcgJUlFRUU4MDIxMV9IV19USU1JTkdfQkVBQ09OX09OTFkgaXMgc2V0LCB0aGVuIHRoaXMgY2FuCiAgKglvbmx5IGNvbWUgZnJvbSBhIGJlYWNvbiwgYnV0IG1pZ2h0IG5vdCBiZWNvbWUgdmFsaWQgdW50aWwgYWZ0ZXIKICAqCWFzc29jaWF0aW9uIHdoZW4gYSBiZWFjb24gaXMgcmVjZWl2ZWQgKHdoaWNoIGlzIG5vdGlmaWVkIHdpdGggdGhlCi0gKgklQlNTX0NIQU5HRURfRFRJTSBmbGFnLikKKyAqCSVCU1NfQ0hBTkdFRF9EVElNIGZsYWcuKS4gU2VlIGFsc28gc3luY19kdGltX2NvdW50IGltcG9ydGFudCBub3RpY2UuCiAgKiBAc3luY19kZXZpY2VfdHM6IHRoZSBkZXZpY2UgdGltZXN0YW1wIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN5bmNfdHNmLAogICoJdGhlIGRyaXZlci9kZXZpY2UgY2FuIHVzZSB0aGlzIHRvIGNhbGN1bGF0ZSBzeW5jaHJvbmlzYXRpb24KLSAqCShzZWUgQHN5bmNfdHNmKQorICoJKHNlZSBAc3luY190c2YpLiBTZWUgYWxzbyBzeW5jX2R0aW1fY291bnQgaW1wb3J0YW50IG5vdGljZS4KICAqIEBzeW5jX2R0aW1fY291bnQ6IE9ubHkgdmFsaWQgd2hlbiAlSUVFRTgwMjExX0hXX1RJTUlOR19CRUFDT05fT05MWQogICoJaXMgcmVxdWVzdGVkLCBzZWUgQHN5bmNfdHNmL0BzeW5jX2RldmljZV90cy4KKyAqCUlNUE9SVEFOVDogVGhlc2UgdGhyZWUgc3luY18qIHBhcmFtZXRlcnMgd291bGQgcG9zc2libHkgYmUgb3V0IG9mIHN5bmMKKyAqCWJ5IHRoZSB0aW1lIHRoZSBkcml2ZXIgd2lsbCB1c2UgdGhlbS4gVGhlIHN5bmNocm9uaXplZCB2aWV3IGlzIGN1cnJlbnRseQorICoJZ3VhcmFudGVlZCBvbmx5IGluIGNlcnRhaW4gY2FsbGJhY2tzLgogICogQGJlYWNvbl9pbnQ6IGJlYWNvbiBpbnRlcnZhbAogICogQGFzc29jX2NhcGFiaWxpdHk6IGNhcGFiaWxpdGllcyB0YWtlbiBmcm9tIGFzc29jIHJlc3AKICAqIEBiYXNpY19yYXRlczogYml0bWFwIG9mIGJhc2ljIHJhdGVzLCBlYWNoIGJpdCBzdGFuZHMgZm9yIGFuCkBAIC0xMjM0LDYgKzEzMzksNyBAQAogICoJbW9uaXRvciBpbnRlcmZhY2UgKGlmIHRoYXQgaXMgcmVxdWVzdGVkLikKICAqIEBkcnZfcHJpdjogZGF0YSBhcmVhIGZvciBkcml2ZXIgdXNlLCB3aWxsIGFsd2F5cyBiZSBhbGlnbmVkIHRvCiAgKglzaXplb2Yodm9pZCAqKS4KKyAqIEB0eHE6IHRoZSBtdWx0aWNhc3QgZGF0YSBUWCBxdWV1ZSAoaWYgZHJpdmVyIHVzZXMgdGhlIFRYUSBhYnN0cmFjdGlvbikKICAqLwogc3RydWN0IGllZWU4MDIxMV92aWYgewogCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZTsKQEAgLTEyNDUsNiArMTM1MSw4IEBACiAJdTggY2FiX3F1ZXVlOwogCXU4IGh3X3F1ZXVlW0lFRUU4MDIxMV9OVU1fQUNTXTsKIAorCXN0cnVjdCBpZWVlODAyMTFfdHhxICp0eHE7CisKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiBfX3JjdSAqY2hhbmN0eF9jb25mOwogCiAJdTMyIGRyaXZlcl9mbGFnczsKQEAgLTEyNzksNiArMTM4NywxOSBAQAogc3RydWN0IGllZWU4MDIxMV92aWYgKndkZXZfdG9faWVlZTgwMjExX3ZpZihzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2KTsKIAogLyoqCisgKiBpZWVlODAyMTFfdmlmX3RvX3dkZXYgLSByZXR1cm4gYSB3ZGV2IHN0cnVjdCBmcm9tIGEgdmlmCisgKiBAdmlmOiB0aGUgdmlmIHRvIGdldCB0aGUgd2RldiBmb3IKKyAqCisgKiBUaGlzIGNhbiBiZSB1c2VkIGJ5IG1hYzgwMjExIGRyaXZlcnMgd2l0aCBkaXJlY3QgY2ZnODAyMTEgQVBJcworICogKGxpa2UgdGhlIHZlbmRvciBjb21tYW5kcykgdGhhdCBuZWVkcyB0byBnZXQgdGhlIHdkZXYgZm9yIGEgdmlmLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gJU5VTEwgaWYgdGhlIGdpdmVuIHdkZXYgaXNuJ3QKKyAqIGFzc29jaWF0ZWQgd2l0aCBhIHZpZiB0aGF0IHRoZSBkcml2ZXIga25vd3MgYWJvdXQgKGUuZy4gbW9uaXRvcgorICogb3IgQVBfVkxBTiBpbnRlcmZhY2VzLikKKyAqLworc3RydWN0IHdpcmVsZXNzX2RldiAqaWVlZTgwMjExX3ZpZl90b193ZGV2KHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOworCisvKioKICAqIGVudW0gaWVlZTgwMjExX2tleV9mbGFncyAtIGtleSBmbGFncwogICoKICAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uIGFib3V0IGtleXMgYmV0d2VlbiB0aGUgZHJpdmVyCkBAIC0xNDcyLDcgKzE1OTMsOCBAQAogICogQHN1cHBfcmF0ZXM6IEJpdG1hcCBvZiBzdXBwb3J0ZWQgcmF0ZXMgKHBlciBiYW5kKQogICogQGh0X2NhcDogSFQgY2FwYWJpbGl0aWVzIG9mIHRoaXMgU1RBOyByZXN0cmljdGVkIHRvIG91ciBvd24gY2FwYWJpbGl0aWVzCiAgKiBAdmh0X2NhcDogVkhUIGNhcGFiaWxpdGllcyBvZiB0aGlzIFNUQTsgcmVzdHJpY3RlZCB0byBvdXIgb3duIGNhcGFiaWxpdGllcwotICogQHdtZTogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIFNUQSBzdXBwb3J0cyBRb1MvV01FLgorICogQHdtZTogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIFNUQSBzdXBwb3J0cyBRb1MvV01FIChpZiBsb2NhbCBkZXZpY2VzIGRvZXMsCisgKglvdGhlcndpc2UgYWx3YXlzIGZhbHNlKQogICogQGRydl9wcml2OiBkYXRhIGFyZWEgZm9yIGRyaXZlciB1c2UsIHdpbGwgYWx3YXlzIGJlIGFsaWduZWQgdG8KICAqCXNpemVvZih2b2lkICopLCBzaXplIGlzIGRldGVybWluZWQgaW4gaHcgaW5mb3JtYXRpb24uCiAgKiBAdWFwc2RfcXVldWVzOiBiaXRtYXAgb2YgcXVldWVzIGNvbmZpZ3VyZWQgZm9yIHVhcHNkLiBPbmx5IHZhbGlkCkBAIC0xNDg4LDYgKzE2MTAsOCBAQAogICogQHRkbHM6IGluZGljYXRlcyB3aGV0aGVyIHRoZSBTVEEgaXMgYSBURExTIHBlZXIKICAqIEB0ZGxzX2luaXRpYXRvcjogaW5kaWNhdGVzIHRoZSBTVEEgaXMgYW4gaW5pdGlhdG9yIG9mIHRoZSBURExTIGxpbmsuIE9ubHkKICAqCXZhbGlkIGlmIHRoZSBTVEEgaXMgYSBURExTIHBlZXIgaW4gdGhlIGZpcnN0IHBsYWNlLgorICogQG1mcDogaW5kaWNhdGVzIHdoZXRoZXIgdGhlIFNUQSB1c2VzIG1hbmFnZW1lbnQgZnJhbWUgcHJvdGVjdGlvbiBvciBub3QuCisgKiBAdHhxOiBwZXItVElEIGRhdGEgVFggcXVldWVzIChpZiBkcml2ZXIgdXNlcyB0aGUgVFhRIGFic3RyYWN0aW9uKQogICovCiBzdHJ1Y3QgaWVlZTgwMjExX3N0YSB7CiAJdTMyIHN1cHBfcmF0ZXNbSUVFRTgwMjExX05VTV9CQU5EU107CkBAIC0xNTA0LDYgKzE2MjgsOSBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3RhX3JhdGVzIF9fcmN1ICpyYXRlczsKIAlib29sIHRkbHM7CiAJYm9vbCB0ZGxzX2luaXRpYXRvcjsKKwlib29sIG1mcDsKKworCXN0cnVjdCBpZWVlODAyMTFfdHhxICp0eHFbSUVFRTgwMjExX05VTV9USURTXTsKIAogCS8qIG11c3QgYmUgbGFzdCAqLwogCXU4IGRydl9wcml2WzBdIF9fYWxpZ25lZChzaXplb2Yodm9pZCAqKSk7CkBAIC0xNTMzLDYgKzE2NjAsMjcgQEAKIH07CiAKIC8qKgorICogc3RydWN0IGllZWU4MDIxMV90eHEgLSBTb2Z0d2FyZSBpbnRlcm1lZGlhdGUgdHggcXVldWUKKyAqCisgKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgorICogQHN0YTogc3RhdGlvbiB0YWJsZSBlbnRyeSwgJU5VTEwgZm9yIHBlci12aWYgcXVldWUKKyAqIEB0aWQ6IHRoZSBUSUQgZm9yIHRoaXMgcXVldWUgKHVudXNlZCBmb3IgcGVyLXZpZiBxdWV1ZSkKKyAqIEBhYzogdGhlIEFDIGZvciB0aGlzIHF1ZXVlCisgKgorICogVGhlIGRyaXZlciBjYW4gb2J0YWluIHBhY2tldHMgZnJvbSB0aGlzIHF1ZXVlIGJ5IGNhbGxpbmcKKyAqIGllZWU4MDIxMV90eF9kZXF1ZXVlKCkuCisgKi8KK3N0cnVjdCBpZWVlODAyMTFfdHhxIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CisJdTggdGlkOworCXU4IGFjOworCisJLyogbXVzdCBiZSBsYXN0ICovCisJdTggZHJ2X3ByaXZbMF0gX19hbGlnbmVkKHNpemVvZih2b2lkICopKTsKK307CisKKy8qKgogICogZW51bSBpZWVlODAyMTFfaHdfZmxhZ3MgLSBoYXJkd2FyZSBmbGFncwogICoKICAqIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHRvIGluZGljYXRlIGhhcmR3YXJlIGNhcGFiaWxpdGllcyB0bwpAQCAtMTc1Niw2ICsxOTA0LDggQEAKICAqCXdpdGhpbiAmc3RydWN0IGllZWU4MDIxMV9zdGEuCiAgKiBAY2hhbmN0eF9kYXRhX3NpemU6IHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgZHJ2X3ByaXYgZGF0YSBhcmVhCiAgKgl3aXRoaW4gJnN0cnVjdCBpZWVlODAyMTFfY2hhbmN0eF9jb25mLgorICogQHR4cV9kYXRhX3NpemU6IHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgZHJ2X3ByaXYgZGF0YSBhcmVhCisgKgl3aXRoaW4gQHN0cnVjdCBpZWVlODAyMTFfdHhxLgogICoKICAqIEBtYXhfcmF0ZXM6IG1heGltdW0gbnVtYmVyIG9mIGFsdGVybmF0ZSByYXRlIHJldHJ5IHN0YWdlcyB0aGUgaHcKICAqCWNhbiBoYW5kbGUuCkBAIC0xODA0LDYgKzE5NTQsOSBAQAogICogQG5fY2lwaGVyX3NjaGVtZXM6IGEgc2l6ZSBvZiBhbiBhcnJheSBvZiBjaXBoZXIgc2NoZW1lcyBkZWZpbml0aW9ucy4KICAqIEBjaXBoZXJfc2NoZW1lczogYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIGNpcGhlciBzY2hlbWUgZGVmaW5pdGlvbnMKICAqCXN1cHBvcnRlZCBieSBIVy4KKyAqCisgKiBAdHhxX2FjX21heF9wZW5kaW5nOiBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgcGVyIEFDIHBlbmRpbmcgaW4gYWxsIHR4cQorICoJZW50cmllcyBmb3IgYSB2aWYuCiAgKi8KIHN0cnVjdCBpZWVlODAyMTFfaHcgewogCXN0cnVjdCBpZWVlODAyMTFfY29uZiBjb25mOwpAQCAtMTgxNiw2ICsxOTY5LDcgQEAKIAlpbnQgdmlmX2RhdGFfc2l6ZTsKIAlpbnQgc3RhX2RhdGFfc2l6ZTsKIAlpbnQgY2hhbmN0eF9kYXRhX3NpemU7CisJaW50IHR4cV9kYXRhX3NpemU7CiAJdTE2IHF1ZXVlczsKIAl1MTYgbWF4X2xpc3Rlbl9pbnRlcnZhbDsKIAlzOCBtYXhfc2lnbmFsOwpAQCAtMTgzMiw2ICsxOTg2LDcgQEAKIAl1OCB1YXBzZF9tYXhfc3BfbGVuOwogCXU4IG5fY2lwaGVyX3NjaGVtZXM7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9jaXBoZXJfc2NoZW1lICpjaXBoZXJfc2NoZW1lczsKKwlpbnQgdHhxX2FjX21heF9wZW5kaW5nOwogfTsKIAogLyoqCkBAIC0yODQ0LDggKzI5OTksOSBAQAogICogQHNldF9iaXRyYXRlX21hc2s6IFNldCBhIG1hc2sgb2YgcmF0ZXMgdG8gYmUgdXNlZCBmb3IgcmF0ZSBjb250cm9sIHNlbGVjdGlvbgogICoJd2hlbiB0cmFuc21pdHRpbmcgYSBmcmFtZS4gQ3VycmVudGx5IG9ubHkgbGVnYWN5IHJhdGVzIGFyZSBoYW5kbGVkLgogICoJVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4KLSAqIEByc3NpX2NhbGxiYWNrOiBOb3RpZnkgZHJpdmVyIHdoZW4gdGhlIGF2ZXJhZ2UgUlNTSSBnb2VzIGFib3ZlL2JlbG93Ci0gKgl0aHJlc2hvbGRzIHRoYXQgd2VyZSByZWdpc3RlcmVkIHByZXZpb3VzbHkuIFRoZSBjYWxsYmFjayBjYW4gc2xlZXAuCisgKiBAZXZlbnRfY2FsbGJhY2s6IE5vdGlmeSBkcml2ZXIgYWJvdXQgYW55IGV2ZW50IGluIG1hYzgwMjExLiBTZWUKKyAqCSZlbnVtIGllZWU4MDIxMV9ldmVudF90eXBlIGZvciB0aGUgZGlmZmVyZW50IHR5cGVzLgorICoJVGhlIGNhbGxiYWNrIGNhbiBzbGVlcC4KICAqCiAgKiBAcmVsZWFzZV9idWZmZXJlZF9mcmFtZXM6IFJlbGVhc2UgYnVmZmVyZWQgZnJhbWVzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4KICAqCXBhcmFtZXRlcnMuIEluIHRoZSBjYXNlIHdoZXJlIHRoZSBkcml2ZXIgYnVmZmVycyBzb21lIGZyYW1lcyBmb3IKQEAgLTI5OTMsNiArMzE0OSw4IEBACiAgKglyZXNwb25zZSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCwgdG9nZXRoZXIgd2l0aCB0aGUgbG9jYXRpb24gb2YgdGhlCiAgKglzd2l0Y2gtdGltaW5nIElFIHdpdGhpbiB0aGUgdGVtcGxhdGUuIFRoZSBza2IgY2FuIG9ubHkgYmUgdXNlZCB3aXRoaW4KICAqCXRoZSBmdW5jdGlvbiBjYWxsLgorICoKKyAqIEB3YWtlX3R4X3F1ZXVlOiBDYWxsZWQgd2hlbiBuZXcgcGFja2V0cyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHF1ZXVlLgogICovCiBzdHJ1Y3QgaWVlZTgwMjExX29wcyB7CiAJdm9pZCAoKnR4KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKQEAgLTMxNDEsOSArMzI5OSw5IEBACiAJYm9vbCAoKnR4X2ZyYW1lc19wZW5kaW5nKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAJaW50ICgqc2V0X2JpdHJhdGVfbWFzaykoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJY29uc3Qgc3RydWN0IGNmZzgwMjExX2JpdHJhdGVfbWFzayAqbWFzayk7Ci0Jdm9pZCAoKnJzc2lfY2FsbGJhY2spKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgICAgIGVudW0gaWVlZTgwMjExX3Jzc2lfZXZlbnQgcnNzaV9ldmVudCk7CisJdm9pZCAoKmV2ZW50X2NhbGxiYWNrKShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfZXZlbnQgKmV2ZW50KTsKIAogCXZvaWQgKCphbGxvd19idWZmZXJlZF9mcmFtZXMpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCkBAIC0zMjI0LDYgKzMzODIsOSBAQAogCXZvaWQgKCp0ZGxzX3JlY3ZfY2hhbm5lbF9zd2l0Y2gpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQkJIHN0cnVjdCBpZWVlODAyMTFfdGRsc19jaF9zd19wYXJhbXMgKnBhcmFtcyk7CisKKwl2b2lkICgqd2FrZV90eF9xdWV1ZSkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqdHhxKTsKIH07CiAKIC8qKgpAQCAtNDM0MywxMyArNDUwNCwzMyBAQAogICoJaGF2ZW4ndCBiZWVuIHJlLWFkZGVkIHRvIHRoZSBkcml2ZXIgeWV0LgogICogQElFRUU4MDIxMV9JRkFDRV9JVEVSX1JFU1VNRV9BTEw6IER1cmluZyByZXN1bWUsIGl0ZXJhdGUgb3ZlciBhbGwKICAqCWludGVyZmFjZXMsIGV2ZW4gaWYgdGhleSBoYXZlbid0IGJlZW4gcmUtYWRkZWQgdG8gdGhlIGRyaXZlciB5ZXQuCisgKiBASUVFRTgwMjExX0lGQUNFX0lURVJfQUNUSVZFOiBJdGVyYXRlIG9ubHkgYWN0aXZlIGludGVyZmFjZXMgKG5ldGRldiBpcyB1cCkuCiAgKi8KIGVudW0gaWVlZTgwMjExX2ludGVyZmFjZV9pdGVyYXRpb25fZmxhZ3MgewogCUlFRUU4MDIxMV9JRkFDRV9JVEVSX05PUk1BTAk9IDAsCiAJSUVFRTgwMjExX0lGQUNFX0lURVJfUkVTVU1FX0FMTAk9IEJJVCgwKSwKKwlJRUVFODAyMTFfSUZBQ0VfSVRFUl9BQ1RJVkUJPSBCSVQoMSksCiB9OwogCiAvKioKKyAqIGllZWU4MDIxMV9pdGVyYXRlX2ludGVyZmFjZXMgLSBpdGVyYXRlIGludGVyZmFjZXMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGl0ZXJhdGVzIG92ZXIgdGhlIGludGVyZmFjZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4KKyAqIGhhcmR3YXJlIGFuZCBjYWxscyB0aGUgY2FsbGJhY2sgZm9yIHRoZW0uIFRoaXMgaW5jbHVkZXMgYWN0aXZlIGFzIHdlbGwgYXMKKyAqIGluYWN0aXZlIGludGVyZmFjZXMuIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBpdGVyYXRvciBmdW5jdGlvbiB0byBzbGVlcC4KKyAqIFdpbGwgaXRlcmF0ZSBvdmVyIGEgbmV3IGludGVyZmFjZSBkdXJpbmcgYWRkX2ludGVyZmFjZSgpLgorICoKKyAqIEBodzogdGhlIGhhcmR3YXJlIHN0cnVjdCBvZiB3aGljaCB0aGUgaW50ZXJmYWNlcyBzaG91bGQgYmUgaXRlcmF0ZWQgb3ZlcgorICogQGl0ZXJfZmxhZ3M6IGl0ZXJhdGlvbiBmbGFncywgc2VlICZlbnVtIGllZWU4MDIxMV9pbnRlcmZhY2VfaXRlcmF0aW9uX2ZsYWdzCisgKiBAaXRlcmF0b3I6IHRoZSBpdGVyYXRvciBmdW5jdGlvbiB0byBjYWxsCisgKiBAZGF0YTogZmlyc3QgYXJndW1lbnQgb2YgdGhlIGl0ZXJhdG9yIGZ1bmN0aW9uCisgKi8KK3ZvaWQgaWVlZTgwMjExX2l0ZXJhdGVfaW50ZXJmYWNlcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGl0ZXJfZmxhZ3MsCisJCQkJICB2b2lkICgqaXRlcmF0b3IpKHZvaWQgKmRhdGEsIHU4ICptYWMsCisJCQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKSwKKwkJCQkgIHZvaWQgKmRhdGEpOworCisvKioKICAqIGllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzIC0gaXRlcmF0ZSBhY3RpdmUgaW50ZXJmYWNlcwogICoKICAqIFRoaXMgZnVuY3Rpb24gaXRlcmF0ZXMgb3ZlciB0aGUgaW50ZXJmYWNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbgpAQCAtNDM2NCwxMSArNDU0NSwxNiBAQAogICogQGl0ZXJhdG9yOiB0aGUgaXRlcmF0b3IgZnVuY3Rpb24gdG8gY2FsbAogICogQGRhdGE6IGZpcnN0IGFyZ3VtZW50IG9mIHRoZSBpdGVyYXRvciBmdW5jdGlvbgogICovCi12b2lkIGllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCQkgdTMyIGl0ZXJfZmxhZ3MsCi0JCQkJCSB2b2lkICgqaXRlcmF0b3IpKHZvaWQgKmRhdGEsIHU4ICptYWMsCi0JCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKSwKLQkJCQkJIHZvaWQgKmRhdGEpOworc3RhdGljIGlubGluZSB2b2lkCitpZWVlODAyMTFfaXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGl0ZXJfZmxhZ3MsCisJCQkJICAgIHZvaWQgKCppdGVyYXRvcikodm9pZCAqZGF0YSwgdTggKm1hYywKKwkJCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiksCisJCQkJICAgIHZvaWQgKmRhdGEpCit7CisJaWVlZTgwMjExX2l0ZXJhdGVfaW50ZXJmYWNlcyhodywKKwkJCQkgICAgIGl0ZXJfZmxhZ3MgfCBJRUVFODAyMTFfSUZBQ0VfSVRFUl9BQ1RJVkUsCisJCQkJICAgICBpdGVyYXRvciwgZGF0YSk7Cit9CiAKIC8qKgogICogaWVlZTgwMjExX2l0ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXNfYXRvbWljIC0gaXRlcmF0ZSBhY3RpdmUgaW50ZXJmYWNlcwpAQCAtNTE5NCwzMCArNTM4MCwxMyBAQAogdm9pZCBpZWVlODAyMTFfdW5yZXNlcnZlX3RpZChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCB0aWQpOwogCiAvKioKLSAqIGllZWU4MDIxMV9pZV9zcGxpdCAtIHNwbGl0IGFuIElFIGJ1ZmZlciBhY2NvcmRpbmcgdG8gb3JkZXJpbmcKKyAqIGllZWU4MDIxMV90eF9kZXF1ZXVlIC0gZGVxdWV1ZSBhIHBhY2tldCBmcm9tIGEgc29mdHdhcmUgdHggcXVldWUKICAqCi0gKiBAaWVzOiB0aGUgSUUgYnVmZmVyCi0gKiBAaWVsZW46IHRoZSBsZW5ndGggb2YgdGhlIElFIGJ1ZmZlcgotICogQGlkczogYW4gYXJyYXkgd2l0aCBlbGVtZW50IElEcyB0aGF0IGFyZSBhbGxvd2VkIGJlZm9yZQotICoJdGhlIHNwbGl0Ci0gKiBAbl9pZHM6IHRoZSBzaXplIG9mIHRoZSBlbGVtZW50IElEIGFycmF5Ci0gKiBAb2Zmc2V0OiBvZmZzZXQgd2hlcmUgdG8gc3RhcnQgc3BsaXR0aW5nIGluIHRoZSBidWZmZXIKKyAqIEBodzogcG9pbnRlciBhcyBvYnRhaW5lZCBmcm9tIGllZWU4MDIxMV9hbGxvY19odygpCisgKiBAdHhxOiBwb2ludGVyIG9idGFpbmVkIGZyb20gc3RhdGlvbiBvciB2aXJ0dWFsIGludGVyZmFjZQogICoKLSAqIFRoaXMgZnVuY3Rpb24gc3BsaXRzIGFuIElFIGJ1ZmZlciBieSB1cGRhdGluZyB0aGUgQG9mZnNldAotICogdmFyaWFibGUgdG8gcG9pbnQgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBidWZmZXIgc2hvdWxkIGJlCi0gKiBzcGxpdC4KLSAqCi0gKiBJdCBhc3N1bWVzIHRoYXQgdGhlIGdpdmVuIElFIGJ1ZmZlciBpcyB3ZWxsLWZvcm1lZCwgdGhpcwotICogaGFzIHRvIGJlIGd1YXJhbnRlZWQgYnkgdGhlIGNhbGxlciEKLSAqCi0gKiBJdCBhbHNvIGFzc3VtZXMgdGhhdCB0aGUgSUVzIGluIHRoZSBidWZmZXIgYXJlIG9yZGVyZWQKLSAqIGNvcnJlY3RseSwgaWYgbm90IHRoZSByZXN1bHQgb2YgdXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdAotICogYmUgb3JkZXJlZCBjb3JyZWN0bHkgZWl0aGVyLCBpLmUuIGl0IGRvZXMgbm8gcmVvcmRlcmluZy4KLSAqCi0gKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgb2Zmc2V0IHdoZXJlIHRoZSBuZXh0IHBhcnQgb2YgdGhlCi0gKiBidWZmZXIgc3RhcnRzLCB3aGljaCBtYXkgYmUgQGllbGVuIGlmIHRoZSBlbnRpcmUgKHJlbWFpbmRlcikKLSAqIG9mIHRoZSBidWZmZXIgc2hvdWxkIGJlIHVzZWQuCisgKiBSZXR1cm5zIHRoZSBza2IgaWYgc3VjY2Vzc2Z1bCwgJU5VTEwgaWYgbm8gZnJhbWUgd2FzIGF2YWlsYWJsZS4KICAqLwotc2l6ZV90IGllZWU4MDIxMV9pZV9zcGxpdChjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVsZW4sCi0JCQkgIGNvbnN0IHU4ICppZHMsIGludCBuX2lkcywgc2l6ZV90IG9mZnNldCk7CitzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3R4X2RlcXVldWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqdHhxKTsKICNlbmRpZiAvKiBNQUM4MDIxMV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9tYWM4MDIxNTQuaCBiL2luY2x1ZGUvbmV0L21hYzgwMjE1NC5oCmluZGV4IDg1MDY0NzguLmUxOGU3ZmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L21hYzgwMjE1NC5oCisrKyBiL2luY2x1ZGUvbmV0L21hYzgwMjE1NC5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8bmV0L2FmX2llZWU4MDIxNTQuaD4KICNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTU0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvdW5hbGlnbmVkL21lbW1vdmUuaD4KIAogI2luY2x1ZGUgPG5ldC9jZmc4MDIxNTQuaD4KIApAQCAtMjEyLDcgKzIxMyw3IEBACiAJaW50CQkoKnNldF9od19hZGRyX2ZpbHQpKHN0cnVjdCBpZWVlODAyMTU0X2h3ICpodywKIAkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTU0X2h3X2FkZHJfZmlsdCAqZmlsdCwKIAkJCQkJICAgIHVuc2lnbmVkIGxvbmcgY2hhbmdlZCk7Ci0JaW50CQkoKnNldF90eHBvd2VyKShzdHJ1Y3QgaWVlZTgwMjE1NF9odyAqaHcsIGludCBkYik7CisJaW50CQkoKnNldF90eHBvd2VyKShzdHJ1Y3QgaWVlZTgwMjE1NF9odyAqaHcsIHM4IGRibSk7CiAJaW50CQkoKnNldF9sYnQpKHN0cnVjdCBpZWVlODAyMTU0X2h3ICpodywgYm9vbCBvbik7CiAJaW50CQkoKnNldF9jY2FfbW9kZSkoc3RydWN0IGllZWU4MDIxNTRfaHcgKmh3LAogCQkJCQljb25zdCBzdHJ1Y3Qgd3Bhbl9waHlfY2NhICpjY2EpOwpAQCAtMjMzLDkgKzIzNCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTU0X2JlNjRfdG9fbGU2NCh2b2lkICpsZTY0X2RzdCwgY29uc3Qgdm9pZCAqYmU2NF9zcmMpCiB7Ci0JX19sZTY0IHRtcCA9IChfX2ZvcmNlIF9fbGU2NClzd2FiNjRwKGJlNjRfc3JjKTsKLQotCW1lbWNweShsZTY0X2RzdCwgJnRtcCwgSUVFRTgwMjE1NF9FWFRFTkRFRF9BRERSX0xFTik7CisJX19wdXRfdW5hbGlnbmVkX21lbW1vdmU2NChzd2FiNjRwKGJlNjRfc3JjKSwgbGU2NF9kc3QpOwogfQogCiAvKioKQEAgLTI0NSwxMiArMjQ0LDEwIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTU0X2xlNjRfdG9fYmU2NCh2b2lkICpiZTY0X2RzdCwgY29uc3Qgdm9pZCAqbGU2NF9zcmMpCiB7Ci0JX19iZTY0IHRtcCA9IChfX2ZvcmNlIF9fYmU2NClzd2FiNjRwKGxlNjRfc3JjKTsKLQotCW1lbWNweShiZTY0X2RzdCwgJnRtcCwgSUVFRTgwMjE1NF9FWFRFTkRFRF9BRERSX0xFTik7CisJX19wdXRfdW5hbGlnbmVkX21lbW1vdmU2NChzd2FiNjRwKGxlNjRfc3JjKSwgYmU2NF9kc3QpOwogfQogCi0vKiBCYXNpYyBpbnRlcmZhY2UgdG8gcmVnaXN0ZXIgaWVlZTgwMjE1NCBod2ljZSAqLworLyogQmFzaWMgaW50ZXJmYWNlIHRvIHJlZ2lzdGVyIGllZWU4MDIxNTQgZGV2aWNlICovCiBzdHJ1Y3QgaWVlZTgwMjE1NF9odyAqCiBpZWVlODAyMTU0X2FsbG9jX2h3KHNpemVfdCBwcml2X2RhdGFfbGVuLCBjb25zdCBzdHJ1Y3QgaWVlZTgwMjE1NF9vcHMgKm9wcyk7CiB2b2lkIGllZWU4MDIxNTRfZnJlZV9odyhzdHJ1Y3QgaWVlZTgwMjE1NF9odyAqaHcpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmRpc2MuaCBiL2luY2x1ZGUvbmV0L25kaXNjLmgKaW5kZXggNmJiZGEzNC4uYjNhNzc1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmRpc2MuaAorKysgYi9pbmNsdWRlL25ldC9uZGlzYy5oCkBAIC0xNTYsMjQgKzE1Niw3IEBACiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5laWdoYm91ciAqX19pcHY2X25laWdoX2xvb2t1cF9ub3JlZihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB2b2lkICpwa2V5KQogewotCXN0cnVjdCBuZWlnaF9oYXNoX3RhYmxlICpuaHQ7Ci0JY29uc3QgdTMyICpwMzIgPSBwa2V5OwotCXN0cnVjdCBuZWlnaGJvdXIgKm47Ci0JdTMyIGhhc2hfdmFsOwotCi0Jbmh0ID0gcmN1X2RlcmVmZXJlbmNlX2JoKG5kX3RibC5uaHQpOwotCWhhc2hfdmFsID0gbmRpc2NfaGFzaGZuKHBrZXksIGRldiwgbmh0LT5oYXNoX3JuZCkgPj4gKDMyIC0gbmh0LT5oYXNoX3NoaWZ0KTsKLQlmb3IgKG4gPSByY3VfZGVyZWZlcmVuY2VfYmgobmh0LT5oYXNoX2J1Y2tldHNbaGFzaF92YWxdKTsKLQkgICAgIG4gIT0gTlVMTDsKLQkgICAgIG4gPSByY3VfZGVyZWZlcmVuY2VfYmgobi0+bmV4dCkpIHsKLQkJdTMyICpuMzIgPSAodTMyICopIG4tPnByaW1hcnlfa2V5OwotCQlpZiAobi0+ZGV2ID09IGRldiAmJgotCQkgICAgKChuMzJbMF0gXiBwMzJbMF0pIHwgKG4zMlsxXSBeIHAzMlsxXSkgfAotCQkgICAgIChuMzJbMl0gXiBwMzJbMl0pIHwgKG4zMlszXSBeIHAzMlszXSkpID09IDApCi0JCQlyZXR1cm4gbjsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gX19fbmVpZ2hfbG9va3VwX25vcmVmKCZuZF90YmwsIG5laWdoX2tleV9lcTEyOCwgbmRpc2NfaGFzaGZuLCBwa2V5LCBkZXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZWlnaGJvdXIgKl9faXB2Nl9uZWlnaF9sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3Qgdm9pZCAqcGtleSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25laWdoYm91ci5oIGIvaW5jbHVkZS9uZXQvbmVpZ2hib3VyLmgKaW5kZXggNzZmNzA4NC4uYmQzM2U2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmVpZ2hib3VyLmgKKysrIGIvaW5jbHVkZS9uZXQvbmVpZ2hib3VyLmgKQEAgLTQyLDYgKzQyLDcgQEAKIAlORUlHSF9WQVJfTUNBU1RfUFJPQkVTLAogCU5FSUdIX1ZBUl9VQ0FTVF9QUk9CRVMsCiAJTkVJR0hfVkFSX0FQUF9QUk9CRVMsCisJTkVJR0hfVkFSX01DQVNUX1JFUFJPQkVTLAogCU5FSUdIX1ZBUl9SRVRSQU5TX1RJTUUsCiAJTkVJR0hfVkFSX0JBU0VfUkVBQ0hBQkxFX1RJTUUsCiAJTkVJR0hfVkFSX0RFTEFZX1BST0JFX1RJTUUsCkBAIC02NSw5ICs2Niw3IEBACiB9OwogCiBzdHJ1Y3QgbmVpZ2hfcGFybXMgewotI2lmZGVmIENPTkZJR19ORVRfTlMKLQlzdHJ1Y3QgbmV0ICpuZXQ7Ci0jZW5kaWYKKwlwb3NzaWJsZV9uZXRfdCBuZXQ7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJaW50CSgqbmVpZ2hfc2V0dXApKHN0cnVjdCBuZWlnaGJvdXIgKik7CkBAIC0xNjcsOSArMTY2LDcgQEAKIAogc3RydWN0IHBuZWlnaF9lbnRyeSB7CiAJc3RydWN0IHBuZWlnaF9lbnRyeQkqbmV4dDsKLSNpZmRlZiBDT05GSUdfTkVUX05TCi0Jc3RydWN0IG5ldAkJKm5ldDsKLSNlbmRpZgorCXBvc3NpYmxlX25ldF90CQluZXQ7CiAJc3RydWN0IG5ldF9kZXZpY2UJKmRldjsKIAl1OAkJCWZsYWdzOwogCXU4CQkJa2V5WzBdOwpAQCAtMTkzLDkgKzE5MCwxMSBAQAogCWludAkJCWZhbWlseTsKIAlpbnQJCQllbnRyeV9zaXplOwogCWludAkJCWtleV9sZW47CisJX19iZTE2CQkJcHJvdG9jb2w7CiAJX191MzIJCQkoKmhhc2gpKGNvbnN0IHZvaWQgKnBrZXksCiAJCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCV9fdTMyICpoYXNoX3JuZCk7CisJYm9vbAkJCSgqa2V5X2VxKShjb25zdCBzdHJ1Y3QgbmVpZ2hib3VyICosIGNvbnN0IHZvaWQgKnBrZXkpOwogCWludAkJCSgqY29uc3RydWN0b3IpKHN0cnVjdCBuZWlnaGJvdXIgKik7CiAJaW50CQkJKCpwY29uc3RydWN0b3IpKHN0cnVjdCBwbmVpZ2hfZW50cnkgKik7CiAJdm9pZAkJCSgqcGRlc3RydWN0b3IpKHN0cnVjdCBwbmVpZ2hfZW50cnkgKik7CkBAIC0yMjQsNiArMjIzLDcgQEAKIAlORUlHSF9ORF9UQUJMRSA9IDEsCiAJTkVJR0hfRE5fVEFCTEUgPSAyLAogCU5FSUdIX05SX1RBQkxFUywKKwlORUlHSF9MSU5LX1RBQkxFID0gTkVJR0hfTlJfVEFCTEVTIC8qIFBzZXVkbyB0YWJsZSBmb3IgbmVpZ2hfeG1pdCAqLwogfTsKIAogc3RhdGljIGlubGluZSBpbnQgbmVpZ2hfcGFybXNfZmFtaWx5KHN0cnVjdCBuZWlnaF9wYXJtcyAqcCkKQEAgLTI0Niw2ICsyNDYsNTcgQEAKICNkZWZpbmUgTkVJR0hfVVBEQVRFX0ZfSVNST1VURVIJCQkweDQwMDAwMDAwCiAjZGVmaW5lIE5FSUdIX1VQREFURV9GX0FETUlOCQkJMHg4MDAwMDAwMAogCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZWlnaF9rZXlfZXExNihjb25zdCBzdHJ1Y3QgbmVpZ2hib3VyICpuLCBjb25zdCB2b2lkICpwa2V5KQoreworCXJldHVybiAqKGNvbnN0IHUxNiAqKW4tPnByaW1hcnlfa2V5ID09ICooY29uc3QgdTE2ICopcGtleTsKK30KKworc3RhdGljIGlubGluZSBib29sIG5laWdoX2tleV9lcTMyKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm4sIGNvbnN0IHZvaWQgKnBrZXkpCit7CisJcmV0dXJuICooY29uc3QgdTMyICopbi0+cHJpbWFyeV9rZXkgPT0gKihjb25zdCB1MzIgKilwa2V5OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbmVpZ2hfa2V5X2VxMTI4KGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm4sIGNvbnN0IHZvaWQgKnBrZXkpCit7CisJY29uc3QgdTMyICpuMzIgPSAoY29uc3QgdTMyICopbi0+cHJpbWFyeV9rZXk7CisJY29uc3QgdTMyICpwMzIgPSBwa2V5OworCisJcmV0dXJuICgobjMyWzBdIF4gcDMyWzBdKSB8IChuMzJbMV0gXiBwMzJbMV0pIHwKKwkJKG4zMlsyXSBeIHAzMlsyXSkgfCAobjMyWzNdIF4gcDMyWzNdKSkgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmVpZ2hib3VyICpfX19uZWlnaF9sb29rdXBfbm9yZWYoCisJc3RydWN0IG5laWdoX3RhYmxlICp0YmwsCisJYm9vbCAoKmtleV9lcSkoY29uc3Qgc3RydWN0IG5laWdoYm91ciAqbiwgY29uc3Qgdm9pZCAqcGtleSksCisJX191MzIgKCpoYXNoKShjb25zdCB2b2lkICpwa2V5LAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkgICAgICBfX3UzMiAqaGFzaF9ybmQpLAorCWNvbnN0IHZvaWQgKnBrZXksCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmVpZ2hfaGFzaF90YWJsZSAqbmh0ID0gcmN1X2RlcmVmZXJlbmNlX2JoKHRibC0+bmh0KTsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuOworCXUzMiBoYXNoX3ZhbDsKKworCWhhc2hfdmFsID0gaGFzaChwa2V5LCBkZXYsIG5odC0+aGFzaF9ybmQpID4+ICgzMiAtIG5odC0+aGFzaF9zaGlmdCk7CisJZm9yIChuID0gcmN1X2RlcmVmZXJlbmNlX2JoKG5odC0+aGFzaF9idWNrZXRzW2hhc2hfdmFsXSk7CisJICAgICBuICE9IE5VTEw7CisJICAgICBuID0gcmN1X2RlcmVmZXJlbmNlX2JoKG4tPm5leHQpKSB7CisJCWlmIChuLT5kZXYgPT0gZGV2ICYmIGtleV9lcShuLCBwa2V5KSkKKwkJCXJldHVybiBuOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZWlnaGJvdXIgKl9fbmVpZ2hfbG9va3VwX25vcmVmKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLAorCQkJCQkJICAgICBjb25zdCB2b2lkICpwa2V5LAorCQkJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXJldHVybiBfX19uZWlnaF9sb29rdXBfbm9yZWYodGJsLCB0YmwtPmtleV9lcSwgdGJsLT5oYXNoLCBwa2V5LCBkZXYpOworfQorCiB2b2lkIG5laWdoX3RhYmxlX2luaXQoaW50IGluZGV4LCBzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCk7CiBpbnQgbmVpZ2hfdGFibGVfY2xlYXIoaW50IGluZGV4LCBzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCk7CiBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaF9sb29rdXAoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIGNvbnN0IHZvaWQgKnBrZXksCkBAIC0yNjgsNyArMzE5LDYgQEAKIGludCBuZWlnaF9pZmRvd24oc3RydWN0IG5laWdoX3RhYmxlICp0YmwsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogaW50IG5laWdoX3Jlc29sdmVfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBuZWlnaF9jb25uZWN0ZWRfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCBuZWlnaF9jb21wYXRfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBuZWlnaF9kaXJlY3Rfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoX2V2ZW50X25zKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLAogCQkJCQkJdTggKmxsYWRkciwgdm9pZCAqc2FkZHIsCkBAIC0zMDYsNiArMzU2LDcgQEAKIAkJICAgIHZvaWQgKCpjYikoc3RydWN0IG5laWdoYm91ciAqLCB2b2lkICopLCB2b2lkICpjb29raWUpOwogdm9pZCBfX25laWdoX2Zvcl9lYWNoX3JlbGVhc2Uoc3RydWN0IG5laWdoX3RhYmxlICp0YmwsCiAJCQkgICAgICBpbnQgKCpjYikoc3RydWN0IG5laWdoYm91ciAqKSk7CitpbnQgbmVpZ2hfeG1pdChpbnQgZmFtLCBzdHJ1Y3QgbmV0X2RldmljZSAqLCBjb25zdCB2b2lkICosIHN0cnVjdCBza19idWZmICopOwogdm9pZCBwbmVpZ2hfZm9yX2VhY2goc3RydWN0IG5laWdoX3RhYmxlICp0YmwsCiAJCSAgICAgdm9pZCAoKmNiKShzdHJ1Y3QgcG5laWdoX2VudHJ5ICopKTsKIApAQCAtNDU5LDQgKzUxMCw2IEBACiAJCW1lbWNweShkc3QsIG4tPmhhLCBkZXYtPmFkZHJfbGVuKTsKIAl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZuLT5oYV9sb2NrLCBzZXEpKTsKIH0KKworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaCBiL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaAppbmRleCAzNmZhZjQ5Li5mNzMzNjU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0X25hbWVzcGFjZS5oCkBAIC0yNiw2ICsyNiw3IEBACiAjZW5kaWYKICNpbmNsdWRlIDxuZXQvbmV0bnMvbmZ0YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvbmV0bnMveGZybS5oPgorI2luY2x1ZGUgPG5ldC9uZXRucy9tcGxzLmg+CiAjaW5jbHVkZSA8bGludXgvbnNfY29tbW9uLmg+CiAKIHN0cnVjdCB1c2VyX25hbWVzcGFjZTsKQEAgLTQ4LDEzICs0OSwxMCBAQAogCWF0b21pY190CQljb3VudDsJCS8qIFRvIGRlY2lkZWQgd2hlbiB0aGUgbmV0d29yawogCQkJCQkJICogIG5hbWVzcGFjZSBzaG91bGQgYmUgc2h1dCBkb3duLgogCQkJCQkJICovCi0jaWZkZWYgTkVUTlNfUkVGQ05UX0RFQlVHCi0JYXRvbWljX3QJCXVzZV9jb3VudDsJLyogVG8gdHJhY2sgcmVmZXJlbmNlcyB3ZQotCQkJCQkJICogZGVzdHJveSBvbiBkZW1hbmQKLQkJCQkJCSAqLwotI2VuZGlmCiAJc3BpbmxvY2tfdAkJcnVsZXNfbW9kX2xvY2s7CiAKKwlhdG9taWM2NF90CQljb29raWVfZ2VuOworCiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwkJLyogbGlzdCBvZiBuZXR3b3JrIG5hbWVzcGFjZXMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWNsZWFudXBfbGlzdDsJLyogbmFtZXNwYWNlcyBvbiBkZWF0aCByb3cgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWV4aXRfbGlzdDsJLyogVXNlIG9ubHkgbmV0X211dGV4ICovCkBAIC0xMzAsNiArMTI4LDkgQEAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUF9WUykKIAlzdHJ1Y3QgbmV0bnNfaXB2cwkqaXB2czsKICNlbmRpZgorI2lmIElTX0VOQUJMRUQoQ09ORklHX01QTFMpCisJc3RydWN0IG5ldG5zX21wbHMJbXBsczsKKyNlbmRpZgogCXN0cnVjdCBzb2NrCQkqZGlhZ19ubHNrOwogCWF0b21pY190CQlmbmhlX2dlbmlkOwogfTsKQEAgLTIzMCw0OCArMjMxLDI3IEBACiAjZW5kaWYKIAogCi0jaWZkZWYgTkVUTlNfUkVGQ05UX0RFQlVHCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZXQgKmhvbGRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKLXsKLQlpZiAobmV0KQotCQlhdG9taWNfaW5jKCZuZXQtPnVzZV9jb3VudCk7Ci0JcmV0dXJuIG5ldDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJlbGVhc2VfbmV0KHN0cnVjdCBuZXQgKm5ldCkKLXsKLQlpZiAobmV0KQotCQlhdG9taWNfZGVjKCZuZXQtPnVzZV9jb3VudCk7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0ICpob2xkX25ldChzdHJ1Y3QgbmV0ICpuZXQpCi17Ci0JcmV0dXJuIG5ldDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJlbGVhc2VfbmV0KHN0cnVjdCBuZXQgKm5ldCkKLXsKLX0KLSNlbmRpZgotCit0eXBlZGVmIHN0cnVjdCB7CiAjaWZkZWYgQ09ORklHX05FVF9OUwotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfcG5ldChzdHJ1Y3QgbmV0ICoqcG5ldCwgc3RydWN0IG5ldCAqbmV0KQotewotCSpwbmV0ID0gbmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZXQgKnJlYWRfcG5ldChzdHJ1Y3QgbmV0ICogY29uc3QgKnBuZXQpCi17Ci0JcmV0dXJuICpwbmV0OwotfQotCi0jZWxzZQotCi0jZGVmaW5lIHdyaXRlX3BuZXQocG5ldCwgbmV0KQlkbyB7ICh2b2lkKShuZXQpO30gd2hpbGUgKDApCi0jZGVmaW5lIHJlYWRfcG5ldChwbmV0KQkJKCZpbml0X25ldCkKLQorCXN0cnVjdCBuZXQgKm5ldDsKICNlbmRpZgorfSBwb3NzaWJsZV9uZXRfdDsKKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX3BuZXQocG9zc2libGVfbmV0X3QgKnBuZXQsIHN0cnVjdCBuZXQgKm5ldCkKK3sKKyNpZmRlZiBDT05GSUdfTkVUX05TCisJcG5ldC0+bmV0ID0gbmV0OworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldCAqcmVhZF9wbmV0KGNvbnN0IHBvc3NpYmxlX25ldF90ICpwbmV0KQoreworI2lmZGVmIENPTkZJR19ORVRfTlMKKwlyZXR1cm4gcG5ldC0+bmV0OworI2Vsc2UKKwlyZXR1cm4gJmluaXRfbmV0OworI2VuZGlmCit9CiAKICNkZWZpbmUgZm9yX2VhY2hfbmV0KFZBUikJCQkJXAogCWxpc3RfZm9yX2VhY2hfZW50cnkoVkFSLCAmbmV0X25hbWVzcGFjZV9saXN0LCBsaXN0KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjQvbmZfcmVqZWN0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2NC9uZl9yZWplY3QuaAppbmRleCAwM2U5MjhhLi43Nzg2MmMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2NC9uZl9yZWplY3QuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2NC9uZl9yZWplY3QuaApAQCAtNSwxOCArNSwxNCBAQAogI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9pY21wLmg+CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuZl9zZW5kX3VucmVhY2goc3RydWN0IHNrX2J1ZmYgKnNrYl9pbiwgaW50IGNvZGUpCi17Ci0JaWNtcF9zZW5kKHNrYl9pbiwgSUNNUF9ERVNUX1VOUkVBQ0gsIGNvZGUsIDApOwotfQotCit2b2lkIG5mX3NlbmRfdW5yZWFjaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2luLCBpbnQgY29kZSwgaW50IGhvb2spOwogdm9pZCBuZl9zZW5kX3Jlc2V0KHN0cnVjdCBza19idWZmICpvbGRza2IsIGludCBob29rKTsKIAogY29uc3Qgc3RydWN0IHRjcGhkciAqbmZfcmVqZWN0X2lwX3RjcGhkcl9nZXQoc3RydWN0IHNrX2J1ZmYgKm9sZHNrYiwKIAkJCQkJICAgICBzdHJ1Y3QgdGNwaGRyICpfb3RoLCBpbnQgaG9vayk7CiBzdHJ1Y3QgaXBoZHIgKm5mX3JlamVjdF9pcGhkcl9wdXQoc3RydWN0IHNrX2J1ZmYgKm5za2IsCiAJCQkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqb2xkc2tiLAotCQkJCSAgX19iZTE2IHByb3RvY29sLCBpbnQgdHRsKTsKKwkJCQkgIF9fdTggcHJvdG9jb2wsIGludCB0dGwpOwogdm9pZCBuZl9yZWplY3RfaXBfdGNwaGRyX3B1dChzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKm9sZHNrYiwKIAkJCSAgICAgY29uc3Qgc3RydWN0IHRjcGhkciAqb3RoKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL2lwdjYvbmZfcmVqZWN0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9yZWplY3QuaAppbmRleCAyMzIxNmQ0Li4wZWE0ZmEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9yZWplY3QuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9yZWplY3QuaApAQCAtMywxNSArMyw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KIAotc3RhdGljIGlubGluZSB2b2lkCi1uZl9zZW5kX3VucmVhY2g2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYl9pbiwgdW5zaWduZWQgY2hhciBjb2RlLAotCSAgICAgdW5zaWduZWQgaW50IGhvb2tudW0pCi17Ci0JaWYgKGhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9PVVQgJiYgc2tiX2luLT5kZXYgPT0gTlVMTCkKLQkJc2tiX2luLT5kZXYgPSBuZXQtPmxvb3BiYWNrX2RldjsKLQotCWljbXB2Nl9zZW5kKHNrYl9pbiwgSUNNUFY2X0RFU1RfVU5SRUFDSCwgY29kZSwgMCk7Ci19Cit2b2lkIG5mX3NlbmRfdW5yZWFjaDYoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2luLCB1bnNpZ25lZCBjaGFyIGNvZGUsCisJCSAgICAgIHVuc2lnbmVkIGludCBob29rbnVtKTsKIAogdm9pZCBuZl9zZW5kX3Jlc2V0NihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpvbGRza2IsIGludCBob29rKTsKIApAQCAtMjAsNyArMTMsNyBAQAogCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgKm90Y3BsZW4sIGludCBob29rKTsKIHN0cnVjdCBpcHY2aGRyICpuZl9yZWplY3RfaXA2aGRyX3B1dChzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpvbGRza2IsCi0JCQkJICAgICBfX2JlMTYgcHJvdG9jb2wsIGludCBob3BsaW1pdCk7CisJCQkJICAgICBfX3U4IHByb3RvY29sLCBpbnQgaG9wbGltaXQpOwogdm9pZCBuZl9yZWplY3RfaXA2X3RjcGhkcl9wdXQoc3RydWN0IHNrX2J1ZmYgKm5za2IsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqb2xkc2tiLAogCQkJICAgICAgY29uc3Qgc3RydWN0IHRjcGhkciAqb3RoLCB1bnNpZ25lZCBpbnQgb3RjcGxlbik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmgKaW5kZXggNzRmMjcxYS4uMDk1NDMzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaApAQCAtOTUsOSArOTUsOCBAQAogCS8qIFRpbWVyIGZ1bmN0aW9uOyBkcm9wcyByZWZjbnQgd2hlbiBpdCBnb2VzIG9mZi4gKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lb3V0OwogCi0jaWZkZWYgQ09ORklHX05FVF9OUwotCXN0cnVjdCBuZXQgKmN0X25ldDsKLSNlbmRpZgorCXBvc3NpYmxlX25ldF90IGN0X25ldDsKKwogCS8qIGFsbCBtZW1iZXJzIGJlbG93IGluaXRpYWxpemVkIHZpYSBtZW1zZXQgKi8KIAl1OCBfX25mY3RfaW5pdF9vZmZzZXRbMF07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9sb2cuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9sb2cuaAppbmRleCA1MzRlMWYyLi41NzYzOWZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2xvZy5oCkBAIC03OSw2ICs3OSwxNiBAQAogCQkgICBjb25zdCBzdHJ1Y3QgbmZfbG9naW5mbyAqbGksCiAJCSAgIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAorX19wcmludGYoOCwgOSkKK3ZvaWQgbmZfbG9nX3RyYWNlKHN0cnVjdCBuZXQgKm5ldCwKKwkJICB1X2ludDhfdCBwZiwKKwkJICB1bnNpZ25lZCBpbnQgaG9va251bSwKKwkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKKwkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkgIGNvbnN0IHN0cnVjdCBuZl9sb2dpbmZvICpsaSwKKwkJICBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKIHN0cnVjdCBuZl9sb2dfYnVmOwogCiBzdHJ1Y3QgbmZfbG9nX2J1ZiAqbmZfbG9nX2J1Zl9vcGVuKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9sM3Byb3RvLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2wzcHJvdG8uaAppbmRleCAzNDBjMDEzLi5hMzEyNzMyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2wzcHJvdG8uaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2wzcHJvdG8uaApAQCAtNDQsNDAgKzQ0LDMyIEBACiAJCQkJICB1bnNpZ25lZCBpbnQgaG9va251bSk7CiAKIHVuc2lnbmVkIGludCBuZl9uYXRfaXB2NF9pbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJCQkgICAgdW5zaWduZWQgaW50ICgqZG9fY2hhaW4pKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkJCQkJCSAgICAgc3RydWN0IG5mX2Nvbm4gKmN0KSk7CiAKIHVuc2lnbmVkIGludCBuZl9uYXRfaXB2NF9vdXQoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkJICAgICB1bnNpZ25lZCBpbnQgKCpkb19jaGFpbikoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkJCQkJCSAgICAgIHN0cnVjdCBuZl9jb25uICpjdCkpOwogCiB1bnNpZ25lZCBpbnQgbmZfbmF0X2lwdjRfbG9jYWxfZm4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkJCQkgIHVuc2lnbmVkIGludCAoKmRvX2NoYWluKShjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJCQkJCSAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkJCQkJCQkgICBzdHJ1Y3QgbmZfY29ubiAqY3QpKTsKIAogdW5zaWduZWQgaW50IG5mX25hdF9pcHY0X2ZuKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgKCpkb19jaGFpbikoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkJCQkJICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QpKTsKIAogaW50IG5mX25hdF9pY21wdjZfcmVwbHlfdHJhbnNsYXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2Nvbm4gKmN0LApAQCAtODUsNDAgKzc3LDMyIEBACiAJCQkJICAgIHVuc2lnbmVkIGludCBob29rbnVtLCB1bnNpZ25lZCBpbnQgaGRybGVuKTsKIAogdW5zaWduZWQgaW50IG5mX25hdF9pcHY2X2luKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgKCpkb19jaGFpbikoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkJCSAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkJCQkJICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QpKTsKIAogdW5zaWduZWQgaW50IG5mX25hdF9pcHY2X291dChjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJCQkgICAgIHVuc2lnbmVkIGludCAoKmRvX2NoYWluKShjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJCQkJICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkJCQkJICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0KSk7CiAKIHVuc2lnbmVkIGludCBuZl9uYXRfaXB2Nl9sb2NhbF9mbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJCSAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkJCSAgdW5zaWduZWQgaW50ICgqZG9fY2hhaW4pKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJCQkJICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkJCQkJCSAgIHN0cnVjdCBuZl9jb25uICpjdCkpOwogCiB1bnNpZ25lZCBpbnQgbmZfbmF0X2lwdjZfZm4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkJICAgIHVuc2lnbmVkIGludCAoKmRvX2NoYWluKShjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJCQkJCQkgICAgIHN0cnVjdCBuZl9jb25uICpjdCkpOwogCiAjZW5kaWYgLyogX05GX05BVF9MM1BST1RPX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9xdWV1ZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3F1ZXVlLmgKaW5kZXggODRhNTNkNy4uZDgxZDU4NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3F1ZXVlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3F1ZXVlLmgKQEAgLTEyLDEyICsxMiw4IEBACiAJdW5zaWduZWQgaW50CQlpZDsKIAogCXN0cnVjdCBuZl9ob29rX29wcwkqZWxlbTsKLQl1X2ludDhfdAkJcGY7CisJc3RydWN0IG5mX2hvb2tfc3RhdGUJc3RhdGU7CiAJdTE2CQkJc2l6ZTsgLyogc2l6ZW9mKGVudHJ5KSArIHNhdmVkIHJvdXRlIGtleXMgKi8KLQl1bnNpZ25lZCBpbnQJCWhvb2s7Ci0Jc3RydWN0IG5ldF9kZXZpY2UJKmluZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlCSpvdXRkZXY7Ci0JaW50CQkJKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKTsKIAogCS8qIGV4dHJhIHNwYWNlIHRvIHN0b3JlIHJvdXRlIGtleXMgKi8KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmgKaW5kZXggZGVjYjlhMC4uZTZiY2Y1NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXMuaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX05FVF9ORl9UQUJMRVNfSAogI2RlZmluZSBfTkVUX05GX1RBQkxFU19ICiAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgpAQCAtMjYsNDAgKzI3LDUzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgbmZ0X3NldF9wa3RpbmZvKHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0LAogCQkJCSAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQpCisJCQkJICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXBrdC0+c2tiID0gc2tiOwotCXBrdC0+aW4gPSBwa3QtPnh0LmluID0gaW47Ci0JcGt0LT5vdXQgPSBwa3QtPnh0Lm91dCA9IG91dDsKKwlwa3QtPmluID0gcGt0LT54dC5pbiA9IHN0YXRlLT5pbjsKKwlwa3QtPm91dCA9IHBrdC0+eHQub3V0ID0gc3RhdGUtPm91dDsKIAlwa3QtPm9wcyA9IG9wczsKIAlwa3QtPnh0Lmhvb2tudW0gPSBvcHMtPmhvb2tudW07CiAJcGt0LT54dC5mYW1pbHkgPSBvcHMtPnBmOwogfQogCisvKioKKyAqIAlzdHJ1Y3QgbmZ0X3ZlcmRpY3QgLSBuZl90YWJsZXMgdmVyZGljdAorICoKKyAqIAlAY29kZTogbmZfdGFibGVzL25ldGZpbHRlciB2ZXJkaWN0IGNvZGUKKyAqIAlAY2hhaW46IGRlc3RpbmF0aW9uIGNoYWluIGZvciBORlRfSlVNUC9ORlRfR09UTworICovCitzdHJ1Y3QgbmZ0X3ZlcmRpY3QgeworCXUzMgkJCQljb2RlOworCXN0cnVjdCBuZnRfY2hhaW4JCSpjaGFpbjsKK307CisKIHN0cnVjdCBuZnRfZGF0YSB7CiAJdW5pb24gewotCQl1MzIJCQkJZGF0YVs0XTsKLQkJc3RydWN0IHsKLQkJCXUzMgkJCXZlcmRpY3Q7Ci0JCQlzdHJ1Y3QgbmZ0X2NoYWluCSpjaGFpbjsKLQkJfTsKKwkJdTMyCQkJZGF0YVs0XTsKKwkJc3RydWN0IG5mdF92ZXJkaWN0CXZlcmRpY3Q7CiAJfTsKIH0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChfX2FsaWdub2ZfXyh1NjQpKSkpOwogCi1zdGF0aWMgaW5saW5lIGludCBuZnRfZGF0YV9jbXAoY29uc3Qgc3RydWN0IG5mdF9kYXRhICpkMSwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X2RhdGEgKmQyLAotCQkJICAgICAgIHVuc2lnbmVkIGludCBsZW4pCi17Ci0JcmV0dXJuIG1lbWNtcChkMS0+ZGF0YSwgZDItPmRhdGEsIGxlbik7Ci19CisvKioKKyAqCXN0cnVjdCBuZnRfcmVncyAtIG5mX3RhYmxlcyByZWdpc3RlciBzZXQKKyAqCisgKglAZGF0YTogZGF0YSByZWdpc3RlcnMKKyAqCUB2ZXJkaWN0OiB2ZXJkaWN0IHJlZ2lzdGVyCisgKgorICoJVGhlIGZpcnN0IGZvdXIgZGF0YSByZWdpc3RlcnMgYWxpYXMgdG8gdGhlIHZlcmRpY3QgcmVnaXN0ZXIuCisgKi8KK3N0cnVjdCBuZnRfcmVncyB7CisJdW5pb24geworCQl1MzIJCQlkYXRhWzIwXTsKKwkJc3RydWN0IG5mdF92ZXJkaWN0CXZlcmRpY3Q7CisJfTsKK307CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuZnRfZGF0YV9jb3B5KHN0cnVjdCBuZnRfZGF0YSAqZHN0LAotCQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X2RhdGEgKnNyYykKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnRfZGF0YV9jb3B5KHUzMiAqZHN0LCBjb25zdCBzdHJ1Y3QgbmZ0X2RhdGEgKnNyYywKKwkJCQkgdW5zaWduZWQgaW50IGxlbikKIHsKLQlCVUlMRF9CVUdfT04oX19hbGlnbm9mX18oKmRzdCkgIT0gX19hbGlnbm9mX18odTY0KSk7Ci0JKih1NjQgKikmZHN0LT5kYXRhWzBdID0gKih1NjQgKikmc3JjLT5kYXRhWzBdOwotCSoodTY0ICopJmRzdC0+ZGF0YVsyXSA9ICoodTY0ICopJnNyYy0+ZGF0YVsyXTsKKwltZW1jcHkoZHN0LCBzcmMsIGxlbik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZnRfZGF0YV9kZWJ1Zyhjb25zdCBzdHJ1Y3QgbmZ0X2RhdGEgKmRhdGEpCkBAIC05Nyw3ICsxMTEsOCBAQAogCXVuc2lnbmVkIGludAkJCWxlbjsKIH07CiAKLWludCBuZnRfZGF0YV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIHN0cnVjdCBuZnRfZGF0YSAqZGF0YSwKK2ludCBuZnRfZGF0YV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCSAgc3RydWN0IG5mdF9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJICBzdHJ1Y3QgbmZ0X2RhdGFfZGVzYyAqZGVzYywgY29uc3Qgc3RydWN0IG5sYXR0ciAqbmxhKTsKIHZvaWQgbmZ0X2RhdGFfdW5pbml0KGNvbnN0IHN0cnVjdCBuZnRfZGF0YSAqZGF0YSwgZW51bSBuZnRfZGF0YV90eXBlcyB0eXBlKTsKIGludCBuZnRfZGF0YV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRyLCBjb25zdCBzdHJ1Y3QgbmZ0X2RhdGEgKmRhdGEsCkBAIC0xMTMsMTIgKzEyOCwxNCBAQAogCXJldHVybiB0eXBlID09IE5GVF9EQVRBX1ZFUkRJQ1QgPyBORlRfUkVHX1ZFUkRJQ1QgOiBORlRfUkVHXzE7CiB9CiAKLWludCBuZnRfdmFsaWRhdGVfaW5wdXRfcmVnaXN0ZXIoZW51bSBuZnRfcmVnaXN0ZXJzIHJlZyk7Ci1pbnQgbmZ0X3ZhbGlkYXRlX291dHB1dF9yZWdpc3RlcihlbnVtIG5mdF9yZWdpc3RlcnMgcmVnKTsKLWludCBuZnRfdmFsaWRhdGVfZGF0YV9sb2FkKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIGVudW0gbmZ0X3JlZ2lzdGVycyByZWcsCi0JCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X2RhdGEgKmRhdGEsCi0JCQkgICBlbnVtIG5mdF9kYXRhX3R5cGVzIHR5cGUpOwordW5zaWduZWQgaW50IG5mdF9wYXJzZV9yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyKTsKK2ludCBuZnRfZHVtcF9yZWdpc3RlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgYXR0ciwgdW5zaWduZWQgaW50IHJlZyk7CiAKK2ludCBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZChlbnVtIG5mdF9yZWdpc3RlcnMgcmVnLCB1bnNpZ25lZCBpbnQgbGVuKTsKK2ludCBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfc3RvcmUoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCQllbnVtIG5mdF9yZWdpc3RlcnMgcmVnLAorCQkJCWNvbnN0IHN0cnVjdCBuZnRfZGF0YSAqZGF0YSwKKwkJCQllbnVtIG5mdF9kYXRhX3R5cGVzIHR5cGUsIHVuc2lnbmVkIGludCBsZW4pOwogCiAvKioKICAqCXN0cnVjdCBuZnRfdXNlcmRhdGEgLSB1c2VyIGRlZmluZWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0CkBAIC0xMzgsMTkgKzE1NSwxNSBAQAogLyoqCiAgKglzdHJ1Y3QgbmZ0X3NldF9lbGVtIC0gZ2VuZXJpYyByZXByZXNlbnRhdGlvbiBvZiBzZXQgZWxlbWVudHMKICAqCi0gKglAY29va2llOiBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYyBlbGVtZW50IGNvb2tpZQogICoJQGtleTogZWxlbWVudCBrZXkKLSAqCUBkYXRhOiBlbGVtZW50IGRhdGEgKG1hcHMgb25seSkKLSAqCUBmbGFnczogZWxlbWVudCBmbGFncyAoZW5kIG9mIGludGVydmFsKQotICoKLSAqCVRoZSBjb29raWUgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYSBoYW5kbGUgdG8gdGhlIGVsZW1lbnQgZm9yIHN1YnNlcXVlbnQKLSAqCXJlbW92YWwuCisgKglAcHJpdjogZWxlbWVudCBwcml2YXRlIGRhdGEgYW5kIGV4dGVuc2lvbnMKICAqLwogc3RydWN0IG5mdF9zZXRfZWxlbSB7Ci0Jdm9pZAkJCSpjb29raWU7Ci0Jc3RydWN0IG5mdF9kYXRhCQlrZXk7Ci0Jc3RydWN0IG5mdF9kYXRhCQlkYXRhOwotCXUzMgkJCWZsYWdzOworCXVuaW9uIHsKKwkJdTMyCQlidWZbTkZUX0RBVEFfVkFMVUVfTUFYTEVOIC8gc2l6ZW9mKHUzMildOworCQlzdHJ1Y3QgbmZ0X2RhdGEJdmFsOworCX0ga2V5OworCXZvaWQJCQkqcHJpdjsKIH07CiAKIHN0cnVjdCBuZnRfc2V0OwpAQCAtMjAyLDExICsyMTUsMTYgQEAKIAllbnVtIG5mdF9zZXRfY2xhc3MJY2xhc3M7CiB9OwogCitzdHJ1Y3QgbmZ0X3NldF9leHQ7CitzdHJ1Y3QgbmZ0X2V4cHI7CisKIC8qKgogICoJc3RydWN0IG5mdF9zZXRfb3BzIC0gbmZfdGFibGVzIHNldCBvcGVyYXRpb25zCiAgKgogICoJQGxvb2t1cDogbG9vayB1cCBhbiBlbGVtZW50IHdpdGhpbiB0aGUgc2V0CiAgKglAaW5zZXJ0OiBpbnNlcnQgbmV3IGVsZW1lbnQgaW50byBzZXQKKyAqCUBhY3RpdmF0ZTogYWN0aXZhdGUgbmV3IGVsZW1lbnQgaW4gdGhlIG5leHQgZ2VuZXJhdGlvbgorICoJQGRlYWN0aXZhdGU6IGRlYWN0aXZhdGUgZWxlbWVudCBpbiB0aGUgbmV4dCBnZW5lcmF0aW9uCiAgKglAcmVtb3ZlOiByZW1vdmUgZWxlbWVudCBmcm9tIHNldAogICoJQHdhbGs6IGl0ZXJhdGUgb3ZlciBhbGwgc2V0IGVsZW1lZW5udHMKICAqCUBwcml2c2l6ZTogZnVuY3Rpb24gdG8gcmV0dXJuIHNpemUgb2Ygc2V0IHByaXZhdGUgZGF0YQpAQCAtMjE0LDE2ICsyMzIsMjggQEAKICAqCUBkZXN0cm95OiBkZXN0cm95IHByaXZhdGUgZGF0YSBvZiBzZXQgaW5zdGFuY2UKICAqCUBsaXN0OiBuZl90YWJsZXNfc2V0X29wcyBsaXN0IG5vZGUKICAqCUBvd25lcjogbW9kdWxlIHJlZmVyZW5jZQorICoJQGVsZW1zaXplOiBlbGVtZW50IHByaXZhdGUgc2l6ZQogICoJQGZlYXR1cmVzOiBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uCiAgKi8KIHN0cnVjdCBuZnRfc2V0X29wcyB7CiAJYm9vbAkJCQkoKmxvb2t1cCkoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCQkJCSAgY29uc3Qgc3RydWN0IG5mdF9kYXRhICprZXksCi0JCQkJCQkgIHN0cnVjdCBuZnRfZGF0YSAqZGF0YSk7Ci0JaW50CQkJCSgqZ2V0KShjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJCQkgICAgICAgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSk7CisJCQkJCQkgIGNvbnN0IHUzMiAqa2V5LAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpOworCWJvb2wJCQkJKCp1cGRhdGUpKHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJCQkgIGNvbnN0IHUzMiAqa2V5LAorCQkJCQkJICB2b2lkICooKm5ldykoc3RydWN0IG5mdF9zZXQgKiwKKwkJCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICosCisJCQkJCQkJICAgICAgIHN0cnVjdCBuZnRfcmVncyAqKSwKKwkJCQkJCSAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJCQkJICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkJCQkgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2V4dCAqKmV4dCk7CisKIAlpbnQJCQkJKCppbnNlcnQpKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCiAJCQkJCQkgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pOworCXZvaWQJCQkJKCphY3RpdmF0ZSkoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKTsKKwl2b2lkICoJCQkJKCpkZWFjdGl2YXRlKShjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJCQkJICAgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSk7CiAJdm9pZAkJCQkoKnJlbW92ZSkoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKIAkJCQkJCSAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSk7CiAJdm9pZAkJCQkoKndhbGspKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCkBAIC0yNDEsNiArMjcxLDcgQEAKIAogCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7CiAJc3RydWN0IG1vZHVsZQkJCSpvd25lcjsKKwl1bnNpZ25lZCBpbnQJCQllbGVtc2l6ZTsKIAl1MzIJCQkJZmVhdHVyZXM7CiB9OwogCkBAIC0yNTcsOCArMjg4LDEyIEBACiAgKiAJQGR0eXBlOiBkYXRhIHR5cGUgKHZlcmRpY3Qgb3IgbnVtZXJpYyB0eXBlIGRlZmluZWQgYnkgdXNlcnNwYWNlKQogICogCUBzaXplOiBtYXhpbXVtIHNldCBzaXplCiAgKiAJQG5lbGVtczogbnVtYmVyIG9mIGVsZW1lbnRzCisgKiAJQG5kZWFjdDogbnVtYmVyIG9mIGRlYWN0aXZhdGVkIGVsZW1lbnRzIHF1ZXVlZCBmb3IgcmVtb3ZhbAorICogCUB0aW1lb3V0OiBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgaW4gbXNlY3MKKyAqIAlAZ2NfaW50OiBnYXJiYWdlIGNvbGxlY3Rpb24gaW50ZXJ2YWwgaW4gbXNlY3MKICAqCUBwb2xpY3k6IHNldCBwYXJhbWV0ZXJpemF0aW9uIChzZWUgZW51bSBuZnRfc2V0X3BvbGljaWVzKQogICogCUBvcHM6IHNldCBvcHMKKyAqIAlAcG5ldDogbmV0d29yayBuYW1lc3BhY2UKICAqIAlAZmxhZ3M6IHNldCBmbGFncwogICogCUBrbGVuOiBrZXkgbGVuZ3RoCiAgKiAJQGRsZW46IGRhdGEgbGVuZ3RoCkBAIC0yNzEsMTAgKzMwNiwxNCBAQAogCXUzMgkJCQlrdHlwZTsKIAl1MzIJCQkJZHR5cGU7CiAJdTMyCQkJCXNpemU7Ci0JdTMyCQkJCW5lbGVtczsKKwlhdG9taWNfdAkJCW5lbGVtczsKKwl1MzIJCQkJbmRlYWN0OworCXU2NAkJCQl0aW1lb3V0OworCXUzMgkJCQlnY19pbnQ7CiAJdTE2CQkJCXBvbGljeTsKIAkvKiBydW50aW1lIGRhdGEgYmVsb3cgaGVyZSAqLwogCWNvbnN0IHN0cnVjdCBuZnRfc2V0X29wcwkqb3BzIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKKwlwb3NzaWJsZV9uZXRfdAkJCXBuZXQ7CiAJdTE2CQkJCWZsYWdzOwogCXU4CQkJCWtsZW47CiAJdTgJCQkJZGxlbjsKQEAgLTI4NywxNiArMzI2LDI3IEBACiAJcmV0dXJuICh2b2lkICopc2V0LT5kYXRhOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnRfc2V0ICpuZnRfc2V0X2NvbnRhaW5lcl9vZihjb25zdCB2b2lkICpwcml2KQoreworCXJldHVybiAodm9pZCAqKXByaXYgLSBvZmZzZXRvZihzdHJ1Y3QgbmZ0X3NldCwgZGF0YSk7Cit9CisKIHN0cnVjdCBuZnRfc2V0ICpuZl90YWJsZXNfc2V0X2xvb2t1cChjb25zdCBzdHJ1Y3QgbmZ0X3RhYmxlICp0YWJsZSwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSk7CiBzdHJ1Y3QgbmZ0X3NldCAqbmZfdGFibGVzX3NldF9sb29rdXBfYnlpZChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCiAJCQkJCSAgY29uc3Qgc3RydWN0IG5sYXR0ciAqbmxhKTsKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5mdF9zZXRfZ2NfaW50ZXJ2YWwoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCkKK3sKKwlyZXR1cm4gc2V0LT5nY19pbnQgPyBtc2Vjc190b19qaWZmaWVzKHNldC0+Z2NfaW50KSA6IEhaOworfQorCiAvKioKICAqCXN0cnVjdCBuZnRfc2V0X2JpbmRpbmcgLSBuZl90YWJsZXMgc2V0IGJpbmRpbmcKICAqCiAgKglAbGlzdDogc2V0IGJpbmRpbmdzIGxpc3Qgbm9kZQogICoJQGNoYWluOiBjaGFpbiBjb250YWluaW5nIHRoZSBydWxlIGJvdW5kIHRvIHRoZSBzZXQKKyAqCUBmbGFnczogc2V0IGFjdGlvbiBmbGFncwogICoKICAqCUEgc2V0IGJpbmRpbmcgY29udGFpbnMgYWxsIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSBmb3IgdmFsaWRhdGlvbgogICoJb2YgbmV3IGVsZW1lbnRzIGFkZGVkIHRvIGEgYm91bmQgc2V0LgpAQCAtMzA0LDYgKzM1NCw3IEBACiBzdHJ1Y3QgbmZ0X3NldF9iaW5kaW5nIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OwogCWNvbnN0IHN0cnVjdCBuZnRfY2hhaW4JCSpjaGFpbjsKKwl1MzIJCQkJZmxhZ3M7CiB9OwogCiBpbnQgbmZfdGFibGVzX2JpbmRfc2V0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIHN0cnVjdCBuZnRfc2V0ICpzZXQsCkBAIC0zMTEsNiArMzYyLDIxNSBAQAogdm9pZCBuZl90YWJsZXNfdW5iaW5kX3NldChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAogCQkJICBzdHJ1Y3QgbmZ0X3NldF9iaW5kaW5nICpiaW5kaW5nKTsKIAorLyoqCisgKgllbnVtIG5mdF9zZXRfZXh0ZW5zaW9ucyAtIHNldCBleHRlbnNpb24gdHlwZSBJRHMKKyAqCisgKglATkZUX1NFVF9FWFRfS0VZOiBlbGVtZW50IGtleQorICoJQE5GVF9TRVRfRVhUX0RBVEE6IG1hcHBpbmcgZGF0YQorICoJQE5GVF9TRVRfRVhUX0ZMQUdTOiBlbGVtZW50IGZsYWdzCisgKglATkZUX1NFVF9FWFRfVElNRU9VVDogZWxlbWVudCB0aW1lb3V0CisgKglATkZUX1NFVF9FWFRfRVhQSVJBVElPTjogZWxlbWVudCBleHBpcmF0aW9uIHRpbWUKKyAqCUBORlRfU0VUX0VYVF9VU0VSREFUQTogdXNlciBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudAorICoJQE5GVF9TRVRfRVhUX0VYUFI6IGV4cHJlc3Npb24gYXNzaW9jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudAorICoJQE5GVF9TRVRfRVhUX05VTTogbnVtYmVyIG9mIGV4dGVuc2lvbiB0eXBlcworICovCitlbnVtIG5mdF9zZXRfZXh0ZW5zaW9ucyB7CisJTkZUX1NFVF9FWFRfS0VZLAorCU5GVF9TRVRfRVhUX0RBVEEsCisJTkZUX1NFVF9FWFRfRkxBR1MsCisJTkZUX1NFVF9FWFRfVElNRU9VVCwKKwlORlRfU0VUX0VYVF9FWFBJUkFUSU9OLAorCU5GVF9TRVRfRVhUX1VTRVJEQVRBLAorCU5GVF9TRVRfRVhUX0VYUFIsCisJTkZUX1NFVF9FWFRfTlVNCit9OworCisvKioKKyAqCXN0cnVjdCBuZnRfc2V0X2V4dF90eXBlIC0gc2V0IGV4dGVuc2lvbiB0eXBlCisgKgorICogCUBsZW46IGZpeGVkIHBhcnQgbGVuZ3RoIG9mIHRoZSBleHRlbnNpb24KKyAqIAlAYWxpZ246IGFsaWdubWVudCByZXF1aXJlbWVudHMgb2YgdGhlIGV4dGVuc2lvbgorICovCitzdHJ1Y3QgbmZ0X3NldF9leHRfdHlwZSB7CisJdTgJbGVuOworCXU4CWFsaWduOworfTsKKworZXh0ZXJuIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2V4dF90eXBlIG5mdF9zZXRfZXh0X3R5cGVzW107CisKKy8qKgorICoJc3RydWN0IG5mdF9zZXRfZXh0X3RtcGwgLSBzZXQgZXh0ZW5zaW9uIHRlbXBsYXRlCisgKgorICoJQGxlbjogbGVuZ3RoIG9mIGV4dGVuc2lvbiBhcmVhCisgKglAb2Zmc2V0OiBvZmZzZXRzIG9mIGluZGl2aWR1YWwgZXh0ZW5zaW9uIHR5cGVzCisgKi8KK3N0cnVjdCBuZnRfc2V0X2V4dF90bXBsIHsKKwl1MTYJbGVuOworCXU4CW9mZnNldFtORlRfU0VUX0VYVF9OVU1dOworfTsKKworLyoqCisgKglzdHJ1Y3QgbmZ0X3NldF9leHQgLSBzZXQgZXh0ZW5zaW9ucworICoKKyAqCUBnZW5tYXNrOiBnZW5lcmF0aW9uIG1hc2sKKyAqCUBvZmZzZXQ6IG9mZnNldHMgb2YgaW5kaXZpZHVhbCBleHRlbnNpb24gdHlwZXMKKyAqCUBkYXRhOiBiZWdpbm5pbmcgb2YgZXh0ZW5zaW9uIGRhdGEKKyAqLworc3RydWN0IG5mdF9zZXRfZXh0IHsKKwl1OAlnZW5tYXNrOworCXU4CW9mZnNldFtORlRfU0VUX0VYVF9OVU1dOworCWNoYXIJZGF0YVswXTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnRfc2V0X2V4dF9wcmVwYXJlKHN0cnVjdCBuZnRfc2V0X2V4dF90bXBsICp0bXBsKQoreworCW1lbXNldCh0bXBsLCAwLCBzaXplb2YoKnRtcGwpKTsKKwl0bXBsLT5sZW4gPSBzaXplb2Yoc3RydWN0IG5mdF9zZXRfZXh0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5mdF9zZXRfZXh0X2FkZF9sZW5ndGgoc3RydWN0IG5mdF9zZXRfZXh0X3RtcGwgKnRtcGwsIHU4IGlkLAorCQkJCQkgIHVuc2lnbmVkIGludCBsZW4pCit7CisJdG1wbC0+bGVuCSA9IEFMSUdOKHRtcGwtPmxlbiwgbmZ0X3NldF9leHRfdHlwZXNbaWRdLmFsaWduKTsKKwlCVUdfT04odG1wbC0+bGVuID4gVThfTUFYKTsKKwl0bXBsLT5vZmZzZXRbaWRdID0gdG1wbC0+bGVuOworCXRtcGwtPmxlbgkrPSBuZnRfc2V0X2V4dF90eXBlc1tpZF0ubGVuICsgbGVuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmZ0X3NldF9leHRfYWRkKHN0cnVjdCBuZnRfc2V0X2V4dF90bXBsICp0bXBsLCB1OCBpZCkKK3sKKwluZnRfc2V0X2V4dF9hZGRfbGVuZ3RoKHRtcGwsIGlkLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5mdF9zZXRfZXh0X2luaXQoc3RydWN0IG5mdF9zZXRfZXh0ICpleHQsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2V4dF90bXBsICp0bXBsKQoreworCW1lbWNweShleHQtPm9mZnNldCwgdG1wbC0+b2Zmc2V0LCBzaXplb2YoZXh0LT5vZmZzZXQpKTsKK30KKworc3RhdGljIGlubGluZSBib29sIF9fbmZ0X3NldF9leHRfZXhpc3RzKGNvbnN0IHN0cnVjdCBuZnRfc2V0X2V4dCAqZXh0LCB1OCBpZCkKK3sKKwlyZXR1cm4gISFleHQtPm9mZnNldFtpZF07Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZnRfc2V0X2V4dF9leGlzdHMoY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICpleHQsIHU4IGlkKQoreworCXJldHVybiBleHQgJiYgX19uZnRfc2V0X2V4dF9leGlzdHMoZXh0LCBpZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqbmZ0X3NldF9leHQoY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICpleHQsIHU4IGlkKQoreworCXJldHVybiAodm9pZCAqKWV4dCArIGV4dC0+b2Zmc2V0W2lkXTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZ0X2RhdGEgKm5mdF9zZXRfZXh0X2tleShjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dCkKK3sKKwlyZXR1cm4gbmZ0X3NldF9leHQoZXh0LCBORlRfU0VUX0VYVF9LRVkpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnRfZGF0YSAqbmZ0X3NldF9leHRfZGF0YShjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dCkKK3sKKwlyZXR1cm4gbmZ0X3NldF9leHQoZXh0LCBORlRfU0VUX0VYVF9EQVRBKTsKK30KKworc3RhdGljIGlubGluZSB1OCAqbmZ0X3NldF9leHRfZmxhZ3MoY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICpleHQpCit7CisJcmV0dXJuIG5mdF9zZXRfZXh0KGV4dCwgTkZUX1NFVF9FWFRfRkxBR1MpOworfQorCitzdGF0aWMgaW5saW5lIHU2NCAqbmZ0X3NldF9leHRfdGltZW91dChjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dCkKK3sKKwlyZXR1cm4gbmZ0X3NldF9leHQoZXh0LCBORlRfU0VUX0VYVF9USU1FT1VUKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICpuZnRfc2V0X2V4dF9leHBpcmF0aW9uKGNvbnN0IHN0cnVjdCBuZnRfc2V0X2V4dCAqZXh0KQoreworCXJldHVybiBuZnRfc2V0X2V4dChleHQsIE5GVF9TRVRfRVhUX0VYUElSQVRJT04pOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnRfdXNlcmRhdGEgKm5mdF9zZXRfZXh0X3VzZXJkYXRhKGNvbnN0IHN0cnVjdCBuZnRfc2V0X2V4dCAqZXh0KQoreworCXJldHVybiBuZnRfc2V0X2V4dChleHQsIE5GVF9TRVRfRVhUX1VTRVJEQVRBKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZ0X2V4cHIgKm5mdF9zZXRfZXh0X2V4cHIoY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICpleHQpCit7CisJcmV0dXJuIG5mdF9zZXRfZXh0KGV4dCwgTkZUX1NFVF9FWFRfRVhQUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZnRfc2V0X2VsZW1fZXhwaXJlZChjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dCkKK3sKKwlyZXR1cm4gbmZ0X3NldF9leHRfZXhpc3RzKGV4dCwgTkZUX1NFVF9FWFRfRVhQSVJBVElPTikgJiYKKwkgICAgICAgdGltZV9pc19iZWZvcmVfZXFfamlmZmllcygqbmZ0X3NldF9leHRfZXhwaXJhdGlvbihleHQpKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmZ0X3NldF9leHQgKm5mdF9zZXRfZWxlbV9leHQoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCQkJCSAgIHZvaWQgKmVsZW0pCit7CisJcmV0dXJuIGVsZW0gKyBzZXQtPm9wcy0+ZWxlbXNpemU7Cit9CisKK3ZvaWQgKm5mdF9zZXRfZWxlbV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQljb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHRfdG1wbCAqdG1wbCwKKwkJCWNvbnN0IHUzMiAqa2V5LCBjb25zdCB1MzIgKmRhdGEsCisJCQl1NjQgdGltZW91dCwgZ2ZwX3QgZ2ZwKTsKK3ZvaWQgbmZ0X3NldF9lbGVtX2Rlc3Ryb3koY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwgdm9pZCAqZWxlbSk7CisKKy8qKgorICoJc3RydWN0IG5mdF9zZXRfZ2NfYmF0Y2hfaGVhZCAtIG5mX3RhYmxlcyBzZXQgZ2FyYmFnZSBjb2xsZWN0aW9uIGJhdGNoCisgKgorICoJQHJjdTogcmN1IGhlYWQKKyAqCUBzZXQ6IHNldCB0aGUgZWxlbWVudHMgYmVsb25nIHRvCisgKglAY250OiBjb3VudCBvZiBlbGVtZW50cworICovCitzdHJ1Y3QgbmZ0X3NldF9nY19iYXRjaF9oZWFkIHsKKwlzdHJ1Y3QgcmN1X2hlYWQJCQlyY3U7CisJY29uc3Qgc3RydWN0IG5mdF9zZXQJCSpzZXQ7CisJdW5zaWduZWQgaW50CQkJY250OworfTsKKworI2RlZmluZSBORlRfU0VUX0dDX0JBVENIX1NJWkUJKChQQUdFX1NJWkUgLQkJCQkgIFwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgbmZ0X3NldF9nY19iYXRjaF9oZWFkKSkgLyBcCisJCQkJIHNpemVvZih2b2lkICopKQorCisvKioKKyAqCXN0cnVjdCBuZnRfc2V0X2djX2JhdGNoIC0gbmZfdGFibGVzIHNldCBnYXJiYWdlIGNvbGxlY3Rpb24gYmF0Y2gKKyAqCisgKiAJQGhlYWQ6IEdDIGJhdGNoIGhlYWQKKyAqIAlAZWxlbXM6IGdhcmJhZ2UgY29sbGVjdGlvbiBlbGVtZW50cworICovCitzdHJ1Y3QgbmZ0X3NldF9nY19iYXRjaCB7CisJc3RydWN0IG5mdF9zZXRfZ2NfYmF0Y2hfaGVhZAloZWFkOworCXZvaWQJCQkJKmVsZW1zW05GVF9TRVRfR0NfQkFUQ0hfU0laRV07Cit9OworCitzdHJ1Y3QgbmZ0X3NldF9nY19iYXRjaCAqbmZ0X3NldF9nY19iYXRjaF9hbGxvYyhjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJCQkJZ2ZwX3QgZ2ZwKTsKK3ZvaWQgbmZ0X3NldF9nY19iYXRjaF9yZWxlYXNlKHN0cnVjdCByY3VfaGVhZCAqcmN1KTsKKworc3RhdGljIGlubGluZSB2b2lkIG5mdF9zZXRfZ2NfYmF0Y2hfY29tcGxldGUoc3RydWN0IG5mdF9zZXRfZ2NfYmF0Y2ggKmdjYikKK3sKKwlpZiAoZ2NiICE9IE5VTEwpCisJCWNhbGxfcmN1KCZnY2ItPmhlYWQucmN1LCBuZnRfc2V0X2djX2JhdGNoX3JlbGVhc2UpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnRfc2V0X2djX2JhdGNoICoKK25mdF9zZXRfZ2NfYmF0Y2hfY2hlY2soY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwgc3RydWN0IG5mdF9zZXRfZ2NfYmF0Y2ggKmdjYiwKKwkJICAgICAgIGdmcF90IGdmcCkKK3sKKwlpZiAoZ2NiICE9IE5VTEwpIHsKKwkJaWYgKGdjYi0+aGVhZC5jbnQgKyAxIDwgQVJSQVlfU0laRShnY2ItPmVsZW1zKSkKKwkJCXJldHVybiBnY2I7CisJCW5mdF9zZXRfZ2NfYmF0Y2hfY29tcGxldGUoZ2NiKTsKKwl9CisJcmV0dXJuIG5mdF9zZXRfZ2NfYmF0Y2hfYWxsb2Moc2V0LCBnZnApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmZ0X3NldF9nY19iYXRjaF9hZGQoc3RydWN0IG5mdF9zZXRfZ2NfYmF0Y2ggKmdjYiwKKwkJCQkJdm9pZCAqZWxlbSkKK3sKKwlnY2ItPmVsZW1zW2djYi0+aGVhZC5jbnQrK10gPSBlbGVtOworfQogCiAvKioKICAqCXN0cnVjdCBuZnRfZXhwcl90eXBlIC0gbmZfdGFibGVzIGV4cHJlc3Npb24gdHlwZQpAQCAtMzIzLDYgKzU4Myw3IEBACiAgKglAcG9saWN5OiBuZXRsaW5rIGF0dHJpYnV0ZSBwb2xpY3kKICAqCUBtYXhhdHRyOiBoaWdoZXN0IG5ldGxpbmsgYXR0cmlidXRlIG51bWJlcgogICoJQGZhbWlseTogYWRkcmVzcyBmYW1pbHkgZm9yIEFGLXNwZWNpZmljIHR5cGVzCisgKglAZmxhZ3M6IGV4cHJlc3Npb24gdHlwZSBmbGFncwogICovCiBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSB7CiAJY29uc3Qgc3RydWN0IG5mdF9leHByX29wcwkqKCpzZWxlY3Rfb3BzKShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqLApAQCAtMzM0LDggKzU5NSwxMSBAQAogCWNvbnN0IHN0cnVjdCBubGFfcG9saWN5CQkqcG9saWN5OwogCXVuc2lnbmVkIGludAkJCW1heGF0dHI7CiAJdTgJCQkJZmFtaWx5OworCXU4CQkJCWZsYWdzOwogfTsKIAorI2RlZmluZSBORlRfRVhQUl9TVEFURUZVTAkJMHgxCisKIC8qKgogICoJc3RydWN0IG5mdF9leHByX29wcyAtIG5mX3RhYmxlcyBleHByZXNzaW9uIG9wZXJhdGlvbnMKICAqCkBAIC0zNTEsNyArNjE1LDcgQEAKIHN0cnVjdCBuZnRfZXhwcjsKIHN0cnVjdCBuZnRfZXhwcl9vcHMgewogCXZvaWQJCQkJKCpldmFsKShjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkJCQlzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJCQkJc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkJCQkJY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpOwogCXVuc2lnbmVkIGludAkJCXNpemU7CiAKQEAgLTM4OSw2ICs2NTMsMTggQEAKIAlyZXR1cm4gKHZvaWQgKilleHByLT5kYXRhOwogfQogCitzdHJ1Y3QgbmZ0X2V4cHIgKm5mdF9leHByX2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICpubGEpOwordm9pZCBuZnRfZXhwcl9kZXN0cm95KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIHN0cnVjdCBuZnRfZXhwciAqZXhwcik7CitpbnQgbmZ0X2V4cHJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgYXR0ciwKKwkJICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgbmZ0X2V4cHJfY2xvbmUoc3RydWN0IG5mdF9leHByICpkc3QsIHN0cnVjdCBuZnRfZXhwciAqc3JjKQoreworCV9fbW9kdWxlX2dldChzcmMtPm9wcy0+dHlwZS0+b3duZXIpOworCW1lbWNweShkc3QsIHNyYywgc3JjLT5vcHMtPnNpemUpOworfQorCiAvKioKICAqCXN0cnVjdCBuZnRfcnVsZSAtIG5mX3RhYmxlcyBydWxlCiAgKgpAQCAtNDA5LDc0ICs2ODUsNiBAQAogCQlfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKF9fYWxpZ25vZl9fKHN0cnVjdCBuZnRfZXhwcikpKSk7CiB9OwogCi0vKioKLSAqCXN0cnVjdCBuZnRfdHJhbnMgLSBuZl90YWJsZXMgb2JqZWN0IHVwZGF0ZSBpbiB0cmFuc2FjdGlvbgotICoKLSAqCUBsaXN0OiB1c2VkIGludGVybmFsbHkKLSAqCUBtc2dfdHlwZTogbWVzc2FnZSB0eXBlCi0gKglAY3R4OiB0cmFuc2FjdGlvbiBjb250ZXh0Ci0gKglAZGF0YTogaW50ZXJuYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24KLSAqLwotc3RydWN0IG5mdF90cmFucyB7Ci0Jc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKLQlpbnQJCQkJbXNnX3R5cGU7Ci0Jc3RydWN0IG5mdF9jdHgJCQljdHg7Ci0JY2hhcgkJCQlkYXRhWzBdOwotfTsKLQotc3RydWN0IG5mdF90cmFuc19ydWxlIHsKLQlzdHJ1Y3QgbmZ0X3J1bGUJCQkqcnVsZTsKLX07Ci0KLSNkZWZpbmUgbmZ0X3RyYW5zX3J1bGUodHJhbnMpCVwKLQkoKChzdHJ1Y3QgbmZ0X3RyYW5zX3J1bGUgKil0cmFucy0+ZGF0YSktPnJ1bGUpCi0KLXN0cnVjdCBuZnRfdHJhbnNfc2V0IHsKLQlzdHJ1Y3QgbmZ0X3NldAkqc2V0OwotCXUzMgkJc2V0X2lkOwotfTsKLQotI2RlZmluZSBuZnRfdHJhbnNfc2V0KHRyYW5zKQlcCi0JKCgoc3RydWN0IG5mdF90cmFuc19zZXQgKil0cmFucy0+ZGF0YSktPnNldCkKLSNkZWZpbmUgbmZ0X3RyYW5zX3NldF9pZCh0cmFucykJXAotCSgoKHN0cnVjdCBuZnRfdHJhbnNfc2V0ICopdHJhbnMtPmRhdGEpLT5zZXRfaWQpCi0KLXN0cnVjdCBuZnRfdHJhbnNfY2hhaW4gewotCWJvb2wJCXVwZGF0ZTsKLQljaGFyCQluYW1lW05GVF9DSEFJTl9NQVhOQU1FTEVOXTsKLQlzdHJ1Y3QgbmZ0X3N0YXRzIF9fcGVyY3B1ICpzdGF0czsKLQl1OAkJcG9saWN5OwotfTsKLQotI2RlZmluZSBuZnRfdHJhbnNfY2hhaW5fdXBkYXRlKHRyYW5zKQlcCi0JKCgoc3RydWN0IG5mdF90cmFuc19jaGFpbiAqKXRyYW5zLT5kYXRhKS0+dXBkYXRlKQotI2RlZmluZSBuZnRfdHJhbnNfY2hhaW5fbmFtZSh0cmFucykJXAotCSgoKHN0cnVjdCBuZnRfdHJhbnNfY2hhaW4gKil0cmFucy0+ZGF0YSktPm5hbWUpCi0jZGVmaW5lIG5mdF90cmFuc19jaGFpbl9zdGF0cyh0cmFucykJXAotCSgoKHN0cnVjdCBuZnRfdHJhbnNfY2hhaW4gKil0cmFucy0+ZGF0YSktPnN0YXRzKQotI2RlZmluZSBuZnRfdHJhbnNfY2hhaW5fcG9saWN5KHRyYW5zKQlcCi0JKCgoc3RydWN0IG5mdF90cmFuc19jaGFpbiAqKXRyYW5zLT5kYXRhKS0+cG9saWN5KQotCi1zdHJ1Y3QgbmZ0X3RyYW5zX3RhYmxlIHsKLQlib29sCQl1cGRhdGU7Ci0JYm9vbAkJZW5hYmxlOwotfTsKLQotI2RlZmluZSBuZnRfdHJhbnNfdGFibGVfdXBkYXRlKHRyYW5zKQlcCi0JKCgoc3RydWN0IG5mdF90cmFuc190YWJsZSAqKXRyYW5zLT5kYXRhKS0+dXBkYXRlKQotI2RlZmluZSBuZnRfdHJhbnNfdGFibGVfZW5hYmxlKHRyYW5zKQlcCi0JKCgoc3RydWN0IG5mdF90cmFuc190YWJsZSAqKXRyYW5zLT5kYXRhKS0+ZW5hYmxlKQotCi1zdHJ1Y3QgbmZ0X3RyYW5zX2VsZW0gewotCXN0cnVjdCBuZnRfc2V0CQkqc2V0OwotCXN0cnVjdCBuZnRfc2V0X2VsZW0JZWxlbTsKLX07Ci0KLSNkZWZpbmUgbmZ0X3RyYW5zX2VsZW1fc2V0KHRyYW5zKQlcCi0JKCgoc3RydWN0IG5mdF90cmFuc19lbGVtICopdHJhbnMtPmRhdGEpLT5zZXQpCi0jZGVmaW5lIG5mdF90cmFuc19lbGVtKHRyYW5zKQlcCi0JKCgoc3RydWN0IG5mdF90cmFuc19lbGVtICopdHJhbnMtPmRhdGEpLT5lbGVtKQotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZnRfZXhwciAqbmZ0X2V4cHJfZmlyc3QoY29uc3Qgc3RydWN0IG5mdF9ydWxlICpydWxlKQogewogCXJldHVybiAoc3RydWN0IG5mdF9leHByICopJnJ1bGUtPmRhdGFbMF07CkBAIC01MTcsNyArNzI1LDYgQEAKICAqCiAgKglAcnVsZXM6IGxpc3Qgb2YgcnVsZXMgaW4gdGhlIGNoYWluCiAgKglAbGlzdDogdXNlZCBpbnRlcm5hbGx5Ci0gKglAbmV0OiBuZXQgbmFtZXNwYWNlIHRoYXQgdGhpcyBjaGFpbiBiZWxvbmdzIHRvCiAgKglAdGFibGU6IHRhYmxlIHRoYXQgdGhpcyBjaGFpbiBiZWxvbmdzIHRvCiAgKglAaGFuZGxlOiBjaGFpbiBoYW5kbGUKICAqCUB1c2U6IG51bWJlciBvZiBqdW1wIHJlZmVyZW5jZXMgdG8gdGhpcyBjaGFpbgpAQCAtNTI4LDcgKzczNSw2IEBACiBzdHJ1Y3QgbmZ0X2NoYWluIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlydWxlczsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OwotCXN0cnVjdCBuZXQJCQkqbmV0OwogCXN0cnVjdCBuZnRfdGFibGUJCSp0YWJsZTsKIAl1NjQJCQkJaGFuZGxlOwogCXUzMgkJCQl1c2U7CkBAIC01NDQsNiArNzUwLDI1IEBACiAJTkZUX0NIQUlOX1RfTUFYCiB9OwogCisvKioKKyAqIAlzdHJ1Y3QgbmZfY2hhaW5fdHlwZSAtIG5mX3RhYmxlcyBjaGFpbiB0eXBlIGluZm8KKyAqCisgKiAJQG5hbWU6IG5hbWUgb2YgdGhlIHR5cGUKKyAqIAlAdHlwZTogbnVtZXJpYyBpZGVudGlmaWVyCisgKiAJQGZhbWlseTogYWRkcmVzcyBmYW1pbHkKKyAqIAlAb3duZXI6IG1vZHVsZSBvd25lcgorICogCUBob29rX21hc2s6IG1hc2sgb2YgdmFsaWQgaG9va3MKKyAqIAlAaG9va3M6IGhvb2tmbiBvdmVycmlkZXMKKyAqLworc3RydWN0IG5mX2NoYWluX3R5cGUgeworCWNvbnN0IGNoYXIJCQkqbmFtZTsKKwllbnVtIG5mdF9jaGFpbl90eXBlCQl0eXBlOworCWludAkJCQlmYW1pbHk7CisJc3RydWN0IG1vZHVsZQkJCSpvd25lcjsKKwl1bnNpZ25lZCBpbnQJCQlob29rX21hc2s7CisJbmZfaG9va2ZuCQkJKmhvb2tzW05GX01BWF9IT09LU107Cit9OworCiBpbnQgbmZ0X2NoYWluX3ZhbGlkYXRlX2RlcGVuZGVuY3koY29uc3Qgc3RydWN0IG5mdF9jaGFpbiAqY2hhaW4sCiAJCQkJICBlbnVtIG5mdF9jaGFpbl90eXBlIHR5cGUpOwogaW50IG5mdF9jaGFpbl92YWxpZGF0ZV9ob29rcyhjb25zdCBzdHJ1Y3QgbmZ0X2NoYWluICpjaGFpbiwKQEAgLTU2MSw2ICs3ODYsNyBAQAogICoJc3RydWN0IG5mdF9iYXNlX2NoYWluIC0gbmZfdGFibGVzIGJhc2UgY2hhaW4KICAqCiAgKglAb3BzOiBuZXRmaWx0ZXIgaG9vayBvcHMKKyAqCUBwbmV0OiBuZXQgbmFtZXNwYWNlIHRoYXQgdGhpcyBjaGFpbiBiZWxvbmdzIHRvCiAgKglAdHlwZTogY2hhaW4gdHlwZQogICoJQHBvbGljeTogZGVmYXVsdCBwb2xpY3kKICAqCUBzdGF0czogcGVyLWNwdSBjaGFpbiBzdGF0cwpAQCAtNTY4LDYgKzc5NCw3IEBACiAgKi8KIHN0cnVjdCBuZnRfYmFzZV9jaGFpbiB7CiAJc3RydWN0IG5mX2hvb2tfb3BzCQlvcHNbTkZUX0hPT0tfT1BTX01BWF07CisJcG9zc2libGVfbmV0X3QJCQlwbmV0OwogCWNvbnN0IHN0cnVjdCBuZl9jaGFpbl90eXBlCSp0eXBlOwogCXU4CQkJCXBvbGljeTsKIAlzdHJ1Y3QgbmZ0X3N0YXRzIF9fcGVyY3B1CSpzdGF0czsKQEAgLTYwMCw3ICs4MjcsNyBAQAogCXU2NAkJCQloZ2VuZXJhdG9yOwogCXUzMgkJCQl1c2U7CiAJdTE2CQkJCWZsYWdzOwotCWNoYXIJCQkJbmFtZVtdOworCWNoYXIJCQkJbmFtZVtORlRfVEFCTEVfTUFYTkFNRUxFTl07CiB9OwogCiAvKioKQEAgLTYzMCwyNSArODU3LDYgQEAKIGludCBuZnRfcmVnaXN0ZXJfYWZpbmZvKHN0cnVjdCBuZXQgKiwgc3RydWN0IG5mdF9hZl9pbmZvICopOwogdm9pZCBuZnRfdW5yZWdpc3Rlcl9hZmluZm8oc3RydWN0IG5mdF9hZl9pbmZvICopOwogCi0vKioKLSAqIAlzdHJ1Y3QgbmZfY2hhaW5fdHlwZSAtIG5mX3RhYmxlcyBjaGFpbiB0eXBlIGluZm8KLSAqCi0gKiAJQG5hbWU6IG5hbWUgb2YgdGhlIHR5cGUKLSAqIAlAdHlwZTogbnVtZXJpYyBpZGVudGlmaWVyCi0gKiAJQGZhbWlseTogYWRkcmVzcyBmYW1pbHkKLSAqIAlAb3duZXI6IG1vZHVsZSBvd25lcgotICogCUBob29rX21hc2s6IG1hc2sgb2YgdmFsaWQgaG9va3MKLSAqIAlAaG9va3M6IGhvb2tmbiBvdmVycmlkZXMKLSAqLwotc3RydWN0IG5mX2NoYWluX3R5cGUgewotCWNvbnN0IGNoYXIJCQkqbmFtZTsKLQllbnVtIG5mdF9jaGFpbl90eXBlCQl0eXBlOwotCWludAkJCQlmYW1pbHk7Ci0Jc3RydWN0IG1vZHVsZQkJCSpvd25lcjsKLQl1bnNpZ25lZCBpbnQJCQlob29rX21hc2s7Ci0JbmZfaG9va2ZuCQkJKmhvb2tzW05GX01BWF9IT09LU107Ci19OwotCiBpbnQgbmZ0X3JlZ2lzdGVyX2NoYWluX3R5cGUoY29uc3Qgc3RydWN0IG5mX2NoYWluX3R5cGUgKik7CiB2b2lkIG5mdF91bnJlZ2lzdGVyX2NoYWluX3R5cGUoY29uc3Qgc3RydWN0IG5mX2NoYWluX3R5cGUgKik7CiAKQEAgLTY3Myw0ICs4ODEsMTUzIEBACiAjZGVmaW5lIE1PRFVMRV9BTElBU19ORlRfU0VUKCkgXAogCU1PRFVMRV9BTElBUygibmZ0LXNldCIpCiAKKy8qCisgKiBUaGUgZ2VuY3Vyc29yIGRlZmluZXMgdHdvIGdlbmVyYXRpb25zLCB0aGUgY3VycmVudGx5IGFjdGl2ZSBhbmQgdGhlCisgKiBuZXh0IG9uZS4gT2JqZWN0cyBjb250YWluIGEgYml0bWFzayBvZiAyIGJpdHMgc3BlY2lmeWluZyB0aGUgZ2VuZXJhdGlvbnMKKyAqIHRoZXkncmUgYWN0aXZlIGluLiBBIHNldCBiaXQgbWVhbnMgdGhleSdyZSBpbmFjdGl2ZSBpbiB0aGUgZ2VuZXJhdGlvbgorICogcmVwcmVzZW50ZWQgYnkgdGhhdCBiaXQuCisgKgorICogTmV3IG9iamVjdHMgc3RhcnQgb3V0IGFzIGluYWN0aXZlIGluIHRoZSBjdXJyZW50IGFuZCBhY3RpdmUgaW4gdGhlCisgKiBuZXh0IGdlbmVyYXRpb24uIFdoZW4gY29tbWl0dGluZyB0aGUgcnVsZXNldCB0aGUgYml0bWFzayBpcyBjbGVhcmVkLAorICogbWVhbmluZyB0aGV5J3JlIGFjdGl2ZSBpbiBhbGwgZ2VuZXJhdGlvbnMuIFdoZW4gcmVtb3ZpbmcgYW4gb2JqZWN0LAorICogaXQgaXMgc2V0IGluYWN0aXZlIGluIHRoZSBuZXh0IGdlbmVyYXRpb24uIEFmdGVyIGNvbW1pdHRpbmcgdGhlIHJ1bGVzZXQsCisgKiB0aGUgb2JqZWN0cyBhcmUgcmVtb3ZlZC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbmZ0X2dlbmN1cnNvcl9uZXh0KGNvbnN0IHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlyZXR1cm4gbmV0LT5uZnQuZ2VuY3Vyc29yICsgMSA9PSAxID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggbmZ0X2dlbm1hc2tfbmV4dChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQpCit7CisJcmV0dXJuIDEgPDwgbmZ0X2dlbmN1cnNvcl9uZXh0KG5ldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggbmZ0X2dlbm1hc2tfY3VyKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCkKK3sKKwkvKiBVc2UgQUNDRVNTX09OQ0UoKSB0byBwcmV2ZW50IHJlZmV0Y2hpbmcgdGhlIHZhbHVlIGZvciBhdG9taWNpdHkgKi8KKwlyZXR1cm4gMSA8PCBBQ0NFU1NfT05DRShuZXQtPm5mdC5nZW5jdXJzb3IpOworfQorCisjZGVmaW5lIE5GVF9HRU5NQVNLX0FOWQkJKCgxIDw8IDApIHwgKDEgPDwgMSkpCisKKy8qCisgKiBTZXQgZWxlbWVudCB0cmFuc2FjdGlvbiBoZWxwZXJzCisgKi8KKworc3RhdGljIGlubGluZSBib29sIG5mdF9zZXRfZWxlbV9hY3RpdmUoY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICpleHQsCisJCQkJICAgICAgIHU4IGdlbm1hc2spCit7CisJcmV0dXJuICEoZXh0LT5nZW5tYXNrICYgZ2VubWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZnRfc2V0X2VsZW1fY2hhbmdlX2FjdGl2ZShjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAorCQkJCQkgICAgICBzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dCkKK3sKKwlleHQtPmdlbm1hc2sgXj0gbmZ0X2dlbm1hc2tfbmV4dChyZWFkX3BuZXQoJnNldC0+cG5ldCkpOworfQorCisvKgorICogV2UgdXNlIGEgZnJlZSBiaXQgaW4gdGhlIGdlbm1hc2sgZmllbGQgdG8gaW5kaWNhdGUgdGhlIGVsZW1lbnQKKyAqIGlzIGJ1c3ksIG1lYW5pbmcgaXQgaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBlaXRoZXIgYnkKKyAqIHRoZSBuZXRsaW5rIEFQSSBvciBHQy4KKyAqCisgKiBFdmVuIHRob3VnaCB0aGUgZ2VubWFzayBpcyBvbmx5IGEgc2luZ2xlIGJ5dGUgd2lkZSwgdGhpcyB3b3JrcworICogYmVjYXVzZSB0aGUgZXh0ZW5zaW9uIHN0cnVjdHVyZSBpZiBmdWxseSBjb25zdGFudCBvbmNlIGluaXRpYWxpemVkLAorICogc28gdGhlcmUgYXJlIG5vIG5vbi1hdG9taWMgd3JpdGUgYWNjZXNzZXMgdW5sZXNzIGl0IGlzIGFscmVhZHkKKyAqIG1hcmtlZCBidXN5LgorICovCisjZGVmaW5lIE5GVF9TRVRfRUxFTV9CVVNZX01BU0sJKDEgPDwgMikKKworI2lmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX0JJVEZJRUxEKQorI2RlZmluZSBORlRfU0VUX0VMRU1fQlVTWV9CSVQJMgorI2VsaWYgZGVmaW5lZChfX0JJR19FTkRJQU5fQklURklFTEQpCisjZGVmaW5lIE5GVF9TRVRfRUxFTV9CVVNZX0JJVAkoQklUU19QRVJfTE9ORyAtIEJJVFNfUEVSX0JZVEUgKyAyKQorI2Vsc2UKKyNlcnJvcgorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgaW50IG5mdF9zZXRfZWxlbV9tYXJrX2J1c3koc3RydWN0IG5mdF9zZXRfZXh0ICpleHQpCit7CisJdW5zaWduZWQgbG9uZyAqd29yZCA9ICh1bnNpZ25lZCBsb25nICopZXh0OworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBuZnRfc2V0X2V4dCwgZ2VubWFzaykgIT0gMCk7CisJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoTkZUX1NFVF9FTEVNX0JVU1lfQklULCB3b3JkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5mdF9zZXRfZWxlbV9jbGVhcl9idXN5KHN0cnVjdCBuZnRfc2V0X2V4dCAqZXh0KQoreworCXVuc2lnbmVkIGxvbmcgKndvcmQgPSAodW5zaWduZWQgbG9uZyAqKWV4dDsKKworCWNsZWFyX2JpdChORlRfU0VUX0VMRU1fQlVTWV9CSVQsIHdvcmQpOworfQorCisvKioKKyAqCXN0cnVjdCBuZnRfdHJhbnMgLSBuZl90YWJsZXMgb2JqZWN0IHVwZGF0ZSBpbiB0cmFuc2FjdGlvbgorICoKKyAqCUBsaXN0OiB1c2VkIGludGVybmFsbHkKKyAqCUBtc2dfdHlwZTogbWVzc2FnZSB0eXBlCisgKglAY3R4OiB0cmFuc2FjdGlvbiBjb250ZXh0CisgKglAZGF0YTogaW50ZXJuYWwgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgdHJhbnNhY3Rpb24KKyAqLworc3RydWN0IG5mdF90cmFucyB7CisJc3RydWN0IGxpc3RfaGVhZAkJbGlzdDsKKwlpbnQJCQkJbXNnX3R5cGU7CisJc3RydWN0IG5mdF9jdHgJCQljdHg7CisJY2hhcgkJCQlkYXRhWzBdOworfTsKKworc3RydWN0IG5mdF90cmFuc19ydWxlIHsKKwlzdHJ1Y3QgbmZ0X3J1bGUJCQkqcnVsZTsKK307CisKKyNkZWZpbmUgbmZ0X3RyYW5zX3J1bGUodHJhbnMpCVwKKwkoKChzdHJ1Y3QgbmZ0X3RyYW5zX3J1bGUgKil0cmFucy0+ZGF0YSktPnJ1bGUpCisKK3N0cnVjdCBuZnRfdHJhbnNfc2V0IHsKKwlzdHJ1Y3QgbmZ0X3NldAkJCSpzZXQ7CisJdTMyCQkJCXNldF9pZDsKK307CisKKyNkZWZpbmUgbmZ0X3RyYW5zX3NldCh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfc2V0ICopdHJhbnMtPmRhdGEpLT5zZXQpCisjZGVmaW5lIG5mdF90cmFuc19zZXRfaWQodHJhbnMpCVwKKwkoKChzdHJ1Y3QgbmZ0X3RyYW5zX3NldCAqKXRyYW5zLT5kYXRhKS0+c2V0X2lkKQorCitzdHJ1Y3QgbmZ0X3RyYW5zX2NoYWluIHsKKwlib29sCQkJCXVwZGF0ZTsKKwljaGFyCQkJCW5hbWVbTkZUX0NIQUlOX01BWE5BTUVMRU5dOworCXN0cnVjdCBuZnRfc3RhdHMgX19wZXJjcHUJKnN0YXRzOworCXU4CQkJCXBvbGljeTsKK307CisKKyNkZWZpbmUgbmZ0X3RyYW5zX2NoYWluX3VwZGF0ZSh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfY2hhaW4gKil0cmFucy0+ZGF0YSktPnVwZGF0ZSkKKyNkZWZpbmUgbmZ0X3RyYW5zX2NoYWluX25hbWUodHJhbnMpCVwKKwkoKChzdHJ1Y3QgbmZ0X3RyYW5zX2NoYWluICopdHJhbnMtPmRhdGEpLT5uYW1lKQorI2RlZmluZSBuZnRfdHJhbnNfY2hhaW5fc3RhdHModHJhbnMpCVwKKwkoKChzdHJ1Y3QgbmZ0X3RyYW5zX2NoYWluICopdHJhbnMtPmRhdGEpLT5zdGF0cykKKyNkZWZpbmUgbmZ0X3RyYW5zX2NoYWluX3BvbGljeSh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfY2hhaW4gKil0cmFucy0+ZGF0YSktPnBvbGljeSkKKworc3RydWN0IG5mdF90cmFuc190YWJsZSB7CisJYm9vbAkJCQl1cGRhdGU7CisJYm9vbAkJCQllbmFibGU7Cit9OworCisjZGVmaW5lIG5mdF90cmFuc190YWJsZV91cGRhdGUodHJhbnMpCVwKKwkoKChzdHJ1Y3QgbmZ0X3RyYW5zX3RhYmxlICopdHJhbnMtPmRhdGEpLT51cGRhdGUpCisjZGVmaW5lIG5mdF90cmFuc190YWJsZV9lbmFibGUodHJhbnMpCVwKKwkoKChzdHJ1Y3QgbmZ0X3RyYW5zX3RhYmxlICopdHJhbnMtPmRhdGEpLT5lbmFibGUpCisKK3N0cnVjdCBuZnRfdHJhbnNfZWxlbSB7CisJc3RydWN0IG5mdF9zZXQJCQkqc2V0OworCXN0cnVjdCBuZnRfc2V0X2VsZW0JCWVsZW07Cit9OworCisjZGVmaW5lIG5mdF90cmFuc19lbGVtX3NldCh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfZWxlbSAqKXRyYW5zLT5kYXRhKS0+c2V0KQorI2RlZmluZSBuZnRfdHJhbnNfZWxlbSh0cmFucykJXAorCSgoKHN0cnVjdCBuZnRfdHJhbnNfZWxlbSAqKXRyYW5zLT5kYXRhKS0+ZWxlbSkKKwogI2VuZGlmIC8qIF9ORVRfTkZfVEFCTEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19jb3JlLmgKaW5kZXggYTc1ZmM4ZS4uYzZmNDAwYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19jb3JlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19jb3JlLmgKQEAgLTMxLDYgKzMxLDkgQEAKIGludCBuZnRfbG9va3VwX21vZHVsZV9pbml0KHZvaWQpOwogdm9pZCBuZnRfbG9va3VwX21vZHVsZV9leGl0KHZvaWQpOwogCitpbnQgbmZ0X2R5bnNldF9tb2R1bGVfaW5pdCh2b2lkKTsKK3ZvaWQgbmZ0X2R5bnNldF9tb2R1bGVfZXhpdCh2b2lkKTsKKwogaW50IG5mdF9iaXR3aXNlX21vZHVsZV9pbml0KHZvaWQpOwogdm9pZCBuZnRfYml0d2lzZV9tb2R1bGVfZXhpdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuaAppbmRleCBjYmExNDNmLi4yZGY3Zjk2IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjQuaApAQCAtOCwxMiArOCwxMSBAQAogbmZ0X3NldF9wa3RpbmZvX2lwdjQoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCiAJCSAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCkKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJc3RydWN0IGlwaGRyICppcDsKIAotCW5mdF9zZXRfcGt0aW5mbyhwa3QsIG9wcywgc2tiLCBpbiwgb3V0KTsKKwluZnRfc2V0X3BrdGluZm8ocGt0LCBvcHMsIHNrYiwgc3RhdGUpOwogCiAJaXAgPSBpcF9oZHIocGt0LT5za2IpOwogCXBrdC0+dHByb3QgPSBpcC0+cHJvdG9jb2w7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjYuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5oCmluZGV4IDc0ZDk3NjEuLjk3ZGIyZTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5oCkBAIC04LDEzICs4LDEyIEBACiBuZnRfc2V0X3BrdGluZm9faXB2NihzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCwKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0KQorCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKIAlpbnQgcHJvdG9oZHIsIHRob2ZmID0gMDsKIAl1bnNpZ25lZCBzaG9ydCBmcmFnX29mZjsKIAotCW5mdF9zZXRfcGt0aW5mbyhwa3QsIG9wcywgc2tiLCBpbiwgb3V0KTsKKwluZnRfc2V0X3BrdGluZm8ocGt0LCBvcHMsIHNrYiwgc3RhdGUpOwogCiAJcHJvdG9oZHIgPSBpcHY2X2ZpbmRfaGRyKHBrdC0+c2tiLCAmdGhvZmYsIC0xLCAmZnJhZ19vZmYsIE5VTEwpOwogCS8qIElmIG1hbGZvcm1lZCwgZHJvcCBpdCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZ0X21ldGEuaAppbmRleCAwZWU0N2MzLi43MTE4ODdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZ0X21ldGEuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZ0X21ldGEuaApAQCAtMjYsMTEgKzI2LDExIEBACiAJCSAgICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcik7CiAKIHZvaWQgbmZ0X21ldGFfZ2V0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkgICAgICAgc3RydWN0IG5mdF9kYXRhIGRhdGFbTkZUX1JFR19NQVggKyAxXSwKKwkJICAgICAgIHN0cnVjdCBuZnRfcmVncyAqcmVncywKIAkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KTsKIAogdm9pZCBuZnRfbWV0YV9zZXRfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCSAgICAgICBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkgICAgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGxpbmsuaCBiL2luY2x1ZGUvbmV0L25ldGxpbmsuaAppbmRleCBlMDEwZWU4Li4yYTVkYmNjIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bGluay5oCkBAIC00LDYgKzQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KIAogLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgKiAgICAgICAgIE5ldGxpbmsgTWVzc2FnZXMgYW5kIEF0dHJpYnV0ZXMgSW50ZXJmYWNlIChBcyBTZWVuIE9uIFRWKQpAQCAtMTA1LDYgKzEwNiw4IEBACiAgKiAgIG5sYV9wdXRfc3RyaW5nKHNrYiwgdHlwZSwgc3RyKQlhZGQgc3RyaW5nIGF0dHJpYnV0ZSB0byBza2IKICAqICAgbmxhX3B1dF9mbGFnKHNrYiwgdHlwZSkJCWFkZCBmbGFnIGF0dHJpYnV0ZSB0byBza2IKICAqICAgbmxhX3B1dF9tc2Vjcyhza2IsIHR5cGUsIGppZmZpZXMpCWFkZCBtc2VjcyBhdHRyaWJ1dGUgdG8gc2tiCisgKiAgIG5sYV9wdXRfaW5fYWRkcihza2IsIHR5cGUsIGFkZHIpCWFkZCBJUHY0IGFkZHJlc3MgYXR0cmlidXRlIHRvIHNrYgorICogICBubGFfcHV0X2luNl9hZGRyKHNrYiwgdHlwZSwgYWRkcikJYWRkIElQdjYgYWRkcmVzcyBhdHRyaWJ1dGUgdG8gc2tiCiAgKgogICogTmVzdGVkIEF0dHJpYnV0ZXMgQ29uc3RydWN0aW9uOgogICogICBubGFfbmVzdF9zdGFydChza2IsIHR5cGUpCQlzdGFydCBhIG5lc3RlZCBhdHRyaWJ1dGUKQEAgLTk1Nyw2ICs5NjAsMzIgQEAKIH0KIAogLyoqCisgKiBubGFfcHV0X2luX2FkZHIgLSBBZGQgYW4gSVB2NCBhZGRyZXNzIG5ldGxpbmsgYXR0cmlidXRlIHRvIGEgc29ja2V0CisgKiBidWZmZXIKKyAqIEBza2I6IHNvY2tldCBidWZmZXIgdG8gYWRkIGF0dHJpYnV0ZSB0bworICogQGF0dHJ0eXBlOiBhdHRyaWJ1dGUgdHlwZQorICogQGFkZHI6IElQdjQgYWRkcmVzcworICovCitzdGF0aWMgaW5saW5lIGludCBubGFfcHV0X2luX2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGF0dHJ0eXBlLAorCQkJCSAgX19iZTMyIGFkZHIpCit7CisJcmV0dXJuIG5sYV9wdXRfYmUzMihza2IsIGF0dHJ0eXBlLCBhZGRyKTsKK30KKworLyoqCisgKiBubGFfcHV0X2luNl9hZGRyIC0gQWRkIGFuIElQdjYgYWRkcmVzcyBuZXRsaW5rIGF0dHJpYnV0ZSB0byBhIHNvY2tldAorICogYnVmZmVyCisgKiBAc2tiOiBzb2NrZXQgYnVmZmVyIHRvIGFkZCBhdHRyaWJ1dGUgdG8KKyAqIEBhdHRydHlwZTogYXR0cmlidXRlIHR5cGUKKyAqIEBhZGRyOiBJUHY2IGFkZHJlc3MKKyAqLworc3RhdGljIGlubGluZSBpbnQgbmxhX3B1dF9pbjZfYWRkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgYXR0cnR5cGUsCisJCQkJICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCXJldHVybiBubGFfcHV0KHNrYiwgYXR0cnR5cGUsIHNpemVvZigqYWRkciksIGFkZHIpOworfQorCisvKioKICAqIG5sYV9nZXRfdTMyIC0gcmV0dXJuIHBheWxvYWQgb2YgdTMyIGF0dHJpYnV0ZQogICogQG5sYTogdTMyIG5ldGxpbmsgYXR0cmlidXRlCiAgKi8KQEAgLTEwOTksNiArMTEyOCwyNyBAQAogfQogCiAvKioKKyAqIG5sYV9nZXRfaW5fYWRkciAtIHJldHVybiBwYXlsb2FkIG9mIElQdjQgYWRkcmVzcyBhdHRyaWJ1dGUKKyAqIEBubGE6IElQdjQgYWRkcmVzcyBuZXRsaW5rIGF0dHJpYnV0ZQorICovCitzdGF0aWMgaW5saW5lIF9fYmUzMiBubGFfZ2V0X2luX2FkZHIoY29uc3Qgc3RydWN0IG5sYXR0ciAqbmxhKQoreworCXJldHVybiAqKF9fYmUzMiAqKSBubGFfZGF0YShubGEpOworfQorCisvKioKKyAqIG5sYV9nZXRfaW42X2FkZHIgLSByZXR1cm4gcGF5bG9hZCBvZiBJUHY2IGFkZHJlc3MgYXR0cmlidXRlCisgKiBAbmxhOiBJUHY2IGFkZHJlc3MgbmV0bGluayBhdHRyaWJ1dGUKKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgaW42X2FkZHIgbmxhX2dldF9pbjZfYWRkcihjb25zdCBzdHJ1Y3QgbmxhdHRyICpubGEpCit7CisJc3RydWN0IGluNl9hZGRyIHRtcDsKKworCW5sYV9tZW1jcHkoJnRtcCwgbmxhLCBzaXplb2YodG1wKSk7CisJcmV0dXJuIHRtcDsKK30KKworLyoqCiAgKiBubGFfbmVzdF9zdGFydCAtIFN0YXJ0IGEgbmV3IGxldmVsIG9mIG5lc3RlZCBhdHRyaWJ1dGVzCiAgKiBAc2tiOiBzb2NrZXQgYnVmZmVyIHRvIGFkZCBhdHRyaWJ1dGVzIHRvCiAgKiBAYXR0cnR5cGU6IGF0dHJpYnV0ZSB0eXBlIG9mIGNvbnRhaW5lcgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bnMvaGFzaC5oIGIvaW5jbHVkZS9uZXQvbmV0bnMvaGFzaC5oCmluZGV4IGMwNmFjNTguLjY5YTY3MTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldG5zL2hhc2guaAorKysgYi9pbmNsdWRlL25ldC9uZXRucy9oYXNoLmgKQEAgLTUsNyArNSw3IEBACiAKIHN0cnVjdCBuZXQ7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG5ldF9oYXNoX21peChzdHJ1Y3QgbmV0ICpuZXQpCitzdGF0aWMgaW5saW5lIHUzMiBuZXRfaGFzaF9taXgoY29uc3Qgc3RydWN0IG5ldCAqbmV0KQogewogI2lmZGVmIENPTkZJR19ORVRfTlMKIAkvKgpAQCAtMTMsNyArMTMsNyBAQAogCSAqIGFsd2F5cyB6ZXJvZWQKIAkgKi8KIAotCXJldHVybiAodW5zaWduZWQpKCgodW5zaWduZWQgbG9uZyluZXQpID4+IEwxX0NBQ0hFX1NISUZUKTsKKwlyZXR1cm4gKHUzMikoKCh1bnNpZ25lZCBsb25nKW5ldCkgPj4gTDFfQ0FDSEVfU0hJRlQpOwogI2Vsc2UKIAlyZXR1cm4gMDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oIGIvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oCmluZGV4IGRiZTIyNTQuLjYxNGE0OWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldG5zL2lwdjQuaAorKysgYi9pbmNsdWRlL25ldC9uZXRucy9pcHY0LmgKQEAgLTcsNiArNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC91aWRnaWQuaD4KICNpbmNsdWRlIDxuZXQvaW5ldF9mcmFnLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KIAogc3RydWN0IHRjcG1faGFzaF9idWNrZXQ7CiBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlcjsKQEAgLTM4LDIxICszOSwyMSBAQAogI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKIAlzdHJ1Y3QgZmliX3J1bGVzX29wcwkqcnVsZXNfb3BzOwogCWJvb2wJCQlmaWJfaGFzX2N1c3RvbV9ydWxlczsKLQlzdHJ1Y3QgZmliX3RhYmxlCSpmaWJfbG9jYWw7Ci0Jc3RydWN0IGZpYl90YWJsZQkqZmliX21haW47Ci0Jc3RydWN0IGZpYl90YWJsZQkqZmliX2RlZmF1bHQ7CisJc3RydWN0IGZpYl90YWJsZSBfX3JjdQkqZmliX2xvY2FsOworCXN0cnVjdCBmaWJfdGFibGUgX19yY3UJKmZpYl9tYWluOworCXN0cnVjdCBmaWJfdGFibGUgX19yY3UJKmZpYl9kZWZhdWx0OwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0lQX1JPVVRFX0NMQVNTSUQKIAlpbnQJCQlmaWJfbnVtX3RjbGFzc2lkX3VzZXJzOwogI2VuZGlmCiAJc3RydWN0IGhsaXN0X2hlYWQJKmZpYl90YWJsZV9oYXNoOworCWJvb2wJCQlmaWJfb2ZmbG9hZF9kaXNhYmxlZDsKIAlzdHJ1Y3Qgc29jawkJKmZpYm5sOwogCiAJc3RydWN0IHNvY2sgICogX19wZXJjcHUJKmljbXBfc2s7CisJc3RydWN0IHNvY2sJCSptY19hdXRvam9pbl9zazsKIAogCXN0cnVjdCBpbmV0X3BlZXJfYmFzZQkqcGVlcnM7Ci0Jc3RydWN0IHRjcG1faGFzaF9idWNrZXQJKnRjcF9tZXRyaWNzX2hhc2g7Ci0JdW5zaWduZWQgaW50CQl0Y3BfbWV0cmljc19oYXNoX2xvZzsKIAlzdHJ1Y3Qgc29jayAgKiBfX3BlcmNwdQkqdGNwX3NrOwogCXN0cnVjdCBuZXRuc19mcmFncwlmcmFnczsKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCkBAIC04NCw2ICs4NSw4IEBACiAJaW50IHN5c2N0bF90Y3BfZndtYXJrX2FjY2VwdDsKIAlpbnQgc3lzY3RsX3RjcF9tdHVfcHJvYmluZzsKIAlpbnQgc3lzY3RsX3RjcF9iYXNlX21zczsKKwlpbnQgc3lzY3RsX3RjcF9wcm9iZV90aHJlc2hvbGQ7CisJdTMyIHN5c2N0bF90Y3BfcHJvYmVfaW50ZXJ2YWw7CiAKIAlzdHJ1Y3QgcGluZ19ncm91cF9yYW5nZSBwaW5nX2dyb3VwX3JhbmdlOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRucy9pcHY2LmggYi9pbmNsdWRlL25ldC9uZXRucy9pcHY2LmgKaW5kZXggNjlhZTQxZi4uZDI1MjdiZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bnMvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbmV0L25ldG5zL2lwdjYuaApAQCAtMzIsNiArMzIsOCBAQAogCWludCBpY21wdjZfdGltZTsKIAlpbnQgYW55Y2FzdF9zcmNfZWNob19yZXBseTsKIAlpbnQgZndtYXJrX3JlZmxlY3Q7CisJaW50IGlkZ2VuX3JldHJpZXM7CisJaW50IGlkZ2VuX2RlbGF5OwogfTsKIAogc3RydWN0IG5ldG5zX2lwdjYgewpAQCAtNjcsNiArNjksNyBAQAogCXN0cnVjdCBzb2NrICAgICAgICAgICAgICpuZGlzY19zazsKIAlzdHJ1Y3Qgc29jayAgICAgICAgICAgICAqdGNwX3NrOwogCXN0cnVjdCBzb2NrICAgICAgICAgICAgICppZ21wX3NrOworCXN0cnVjdCBzb2NrCQkqbWNfYXV0b2pvaW5fc2s7CiAjaWZkZWYgQ09ORklHX0lQVjZfTVJPVVRFCiAjaWZuZGVmIENPTkZJR19JUFY2X01ST1VURV9NVUxUSVBMRV9UQUJMRVMKIAlzdHJ1Y3QgbXI2X3RhYmxlCSptcnQ2OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bnMvbXBscy5oIGIvaW5jbHVkZS9uZXQvbmV0bnMvbXBscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyOTIwMzYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9uZXRucy9tcGxzLmgKQEAgLTAsMCArMSwxNyBAQAorLyoKKyAqIG1wbHMgaW4gbmV0IG5hbWVzcGFjZXMKKyAqLworCisjaWZuZGVmIF9fTkVUTlNfTVBMU19IX18KKyNkZWZpbmUgX19ORVROU19NUExTX0hfXworCitzdHJ1Y3QgbXBsc19yb3V0ZTsKK3N0cnVjdCBjdGxfdGFibGVfaGVhZGVyOworCitzdHJ1Y3QgbmV0bnNfbXBscyB7CisJc2l6ZV90IHBsYXRmb3JtX2xhYmVsczsKKwlzdHJ1Y3QgbXBsc19yb3V0ZSBfX3JjdSAqIF9fcmN1ICpwbGF0Zm9ybV9sYWJlbDsKKwlzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqY3RsOworfTsKKworI2VuZGlmIC8qIF9fTkVUTlNfTVBMU19IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldG5zL3hfdGFibGVzLmggYi9pbmNsdWRlL25ldC9uZXRucy94X3RhYmxlcy5oCmluZGV4IGMyNDA2MGUuLjRkNjU5N2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldG5zL3hfdGFibGVzLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bnMveF90YWJsZXMuaApAQCAtOSw2ICs5LDcgQEAKIHN0cnVjdCBuZXRuc194dCB7CiAJc3RydWN0IGxpc3RfaGVhZCB0YWJsZXNbTkZQUk9UT19OVU1QUk9UT107CiAJYm9vbCBub3RyYWNrX2RlcHJlY2F0ZWRfd2FybmluZzsKKwlib29sIGNsdXN0ZXJpcF9kZXByZWNhdGVkX3dhcm5pbmc7CiAjaWYgZGVmaW5lZChDT05GSUdfQlJJREdFX05GX0VCVEFCTEVTKSB8fCBcCiAgICAgZGVmaW5lZChDT05GSUdfQlJJREdFX05GX0VCVEFCTEVTX01PRFVMRSkKIAlzdHJ1Y3QgZWJ0X3RhYmxlICpicm91dGVfdGFibGU7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZmMvaGNpLmggYi9pbmNsdWRlL25ldC9uZmMvaGNpLmgKaW5kZXggYWI2NzJiNS4uMDIwYTgxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmZjL2hjaS5oCisrKyBiL2luY2x1ZGUvbmV0L25mYy9oY2kuaApAQCAtODMsNiArODMsMTAgQEAKIH07CiAKICNkZWZpbmUgTkZDX0hDSV9NQVhfQ1VTVE9NX0dBVEVTCTUwCisvKgorICogQWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24gMTAyIDYyMiBjaGFwdGVyIDQuNCBQaXBlcywKKyAqIHRoZSBwaXBlIGlkZW50aWZpZXIgaXMgNyBiaXRzIGxvbmcuCisgKi8KICNkZWZpbmUgTkZDX0hDSV9NQVhfUElQRVMJCTEyNwogc3RydWN0IG5mY19oY2lfaW5pdF9kYXRhIHsKIAl1OCBnYXRlX2NvdW50OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmZjL25jaV9jb3JlLmggYi9pbmNsdWRlL25ldC9uZmMvbmNpX2NvcmUuaAppbmRleCBmZjg3Zjg2Li5kNGRjYzcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZmMvbmNpX2NvcmUuaAorKysgYi9pbmNsdWRlL25ldC9uZmMvbmNpX2NvcmUuaApAQCAtNzEsNiArNzEsNyBAQAogCWludCAgICgqY2xvc2UpKHN0cnVjdCBuY2lfZGV2ICpuZGV2KTsKIAlpbnQgICAoKnNlbmQpKHN0cnVjdCBuY2lfZGV2ICpuZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlpbnQgICAoKnNldHVwKShzdHJ1Y3QgbmNpX2RldiAqbmRldik7CisJaW50ICAgKCpmd19kb3dubG9hZCkoc3RydWN0IG5jaV9kZXYgKm5kZXYsIGNvbnN0IGNoYXIgKmZpcm13YXJlX25hbWUpOwogCV9fdTMyICgqZ2V0X3JmcHJvdG9jb2wpKHN0cnVjdCBuY2lfZGV2ICpuZGV2LCBfX3U4IHJmX3Byb3RvY29sKTsKIAlpbnQgICAoKmRpc2NvdmVyX3NlKShzdHJ1Y3QgbmNpX2RldiAqbmRldik7CiAJaW50ICAgKCpkaXNhYmxlX3NlKShzdHJ1Y3QgbmNpX2RldiAqbmRldiwgdTMyIHNlX2lkeCk7CkBAIC0xMzcsNiArMTM4LDEwIEBACiAjZGVmaW5lIE5DSV9IQ0lfSU5WQUxJRF9IT1NUICAgICAgICAgICAgICAgMHg4MAogCiAjZGVmaW5lIE5DSV9IQ0lfTUFYX0NVU1RPTV9HQVRFUyAgIDUwCisvKgorICogQWNjb3JkaW5nIHRvIHNwZWNpZmljYXRpb24gMTAyIDYyMiBjaGFwdGVyIDQuNCBQaXBlcywKKyAqIHRoZSBwaXBlIGlkZW50aWZpZXIgaXMgNyBiaXRzIGxvbmcuCisgKi8KICNkZWZpbmUgTkNJX0hDSV9NQVhfUElQRVMgICAgICAgICAgMTI3CiAKIHN0cnVjdCBuY2lfaGNpX2dhdGUgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmZjL25mYy5oIGIvaW5jbHVkZS9uZXQvbmZjL25mYy5oCmluZGV4IDczMTkwZTYuLjdhYzAyOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25mYy9uZmMuaAorKysgYi9pbmNsdWRlL25ldC9uZmMvbmZjLmgKQEAgLTE1Nyw3ICsxNTcsNyBAQAogCXUzMiBhaWRfbGVuOwogCXU4IGFpZFtORkNfTUFYX0FJRF9MRU5HVEhdOwogCXU4IHBhcmFtc19sZW47Ci0JdTggcGFyYW1zW05GQ19NQVhfUEFSQU1TX0xFTkdUSF07CisJdTggcGFyYW1zWzBdOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IG5mY19nZW5sX2RhdGEgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcGluZy5oIGIvaW5jbHVkZS9uZXQvcGluZy5oCmluZGV4IGNjMTZkNDEuLmFjODBjYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3BpbmcuaAorKysgYi9pbmNsdWRlL25ldC9waW5nLmgKQEAgLTc1LDEyICs3NSwxMSBAQAogaW50ICBwaW5nX2dldGZyYWcodm9pZCAqZnJvbSwgY2hhciAqdG8sIGludCBvZmZzZXQsIGludCBmcmFnbGVuLCBpbnQgb2RkLAogCQkgIHN0cnVjdCBza19idWZmICopOwogCi1pbnQgIHBpbmdfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkgIHNpemVfdCBsZW4sIGludCBub2Jsb2NrLCBpbnQgZmxhZ3MsIGludCAqYWRkcl9sZW4pOworaW50ICBwaW5nX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBub2Jsb2NrLAorCQkgIGludCBmbGFncywgaW50ICphZGRyX2xlbik7CiBpbnQgIHBpbmdfY29tbW9uX3NlbmRtc2coaW50IGZhbWlseSwgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAogCQkJIHZvaWQgKnVzZXJfaWNtcGgsIHNpemVfdCBpY21waF9sZW4pOwotaW50ICBwaW5nX3Y2X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJICAgICBzaXplX3QgbGVuKTsKK2ludCAgcGluZ192Nl9zZW5kbXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKTsKIGludCAgcGluZ19xdWV1ZV9yY3Zfc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBib29sIHBpbmdfcmN2KHN0cnVjdCBza19idWZmICpza2IpOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9yZXF1ZXN0X3NvY2suaCBiL2luY2x1ZGUvbmV0L3JlcXVlc3Rfc29jay5oCmluZGV4IDdmODMwZmYuLmZlNDFmM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3JlcXVlc3Rfc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L3JlcXVlc3Rfc29jay5oCkBAIC0zOSw4ICszOSw3IEBACiAJdm9pZAkJKCpzZW5kX3Jlc2V0KShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJdm9pZAkJKCpkZXN0cnVjdG9yKShzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpOwotCXZvaWQJCSgqc3luX2Fja190aW1lb3V0KShzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7CisJdm9pZAkJKCpzeW5fYWNrX3RpbWVvdXQpKGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7CiB9OwogCiBpbnQgaW5ldF9ydHhfc3luX2FjayhzdHJ1Y3Qgc29jayAqcGFyZW50LCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpOwpAQCAtNDksNyArNDgsMTEgQEAKICAqLwogc3RydWN0IHJlcXVlc3Rfc29jayB7CiAJc3RydWN0IHNvY2tfY29tbW9uCQlfX3JlcV9jb21tb247CisjZGVmaW5lIHJza19yZWZjbnQJCQlfX3JlcV9jb21tb24uc2tjX3JlZmNudAorI2RlZmluZSByc2tfaGFzaAkJCV9fcmVxX2NvbW1vbi5za2NfaGFzaAorCiAJc3RydWN0IHJlcXVlc3Rfc29jawkJKmRsX25leHQ7CisJc3RydWN0IHNvY2sJCQkqcnNrX2xpc3RlbmVyOwogCXUxNgkJCQltc3M7CiAJdTgJCQkJbnVtX3JldHJhbnM7IC8qIG51bWJlciBvZiByZXRyYW5zbWl0cyAqLwogCXU4CQkJCWNvb2tpZV90czoxOyAvKiBzeW5jb29raWU6IGVuY29kZSB0Y3BvcHRzIGluIHRpbWVzdGFtcCAqLwpAQCAtNTgsMzIgKzYxLDU2IEBACiAJdTMyCQkJCXdpbmRvd19jbGFtcDsgLyogd2luZG93IGNsYW1wIGF0IGNyZWF0aW9uIHRpbWUgKi8KIAl1MzIJCQkJcmN2X3duZDsJICAvKiByY3Zfd25kIG9mZmVyZWQgZmlyc3QgdGltZSAqLwogCXUzMgkJCQl0c19yZWNlbnQ7Ci0JdW5zaWduZWQgbG9uZwkJCWV4cGlyZXM7CisJc3RydWN0IHRpbWVyX2xpc3QJCXJza190aW1lcjsKIAljb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrX29wcwkqcnNrX29wczsKIAlzdHJ1Y3Qgc29jawkJCSpzazsKIAl1MzIJCQkJc2VjaWQ7CiAJdTMyCQkJCXBlZXJfc2VjaWQ7CiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcXNrX2FsbG9jKGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2tfb3BzICpvcHMpCitzdGF0aWMgaW5saW5lIHN0cnVjdCByZXF1ZXN0X3NvY2sgKgorcmVxc2tfYWxsb2MoY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgKm9wcywgc3RydWN0IHNvY2sgKnNrX2xpc3RlbmVyKQogewogCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSA9IGttZW1fY2FjaGVfYWxsb2Mob3BzLT5zbGFiLCBHRlBfQVRPTUlDKTsKIAotCWlmIChyZXEgIT0gTlVMTCkKKwlpZiAocmVxKSB7CiAJCXJlcS0+cnNrX29wcyA9IG9wczsKKwkJc29ja19ob2xkKHNrX2xpc3RlbmVyKTsKKwkJcmVxLT5yc2tfbGlzdGVuZXIgPSBza19saXN0ZW5lcjsKIAorCQkvKiBGb2xsb3dpbmcgaXMgdGVtcG9yYXJ5LiBJdCBpcyBjb3VwbGVkIHdpdGggZGVidWdnaW5nCisJCSAqIGhlbHBlcnMgaW4gcmVxc2tfcHV0KCkgJiByZXFza19mcmVlKCkKKwkJICovCisJCWF0b21pY19zZXQoJnJlcS0+cnNrX3JlZmNudCwgMCk7CisJfQogCXJldHVybiByZXE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX3JlcXNrX2ZyZWUoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcmVxdWVzdF9zb2NrICppbmV0X3JlcXNrKHN0cnVjdCBzb2NrICpzaykKIHsKLQlrbWVtX2NhY2hlX2ZyZWUocmVxLT5yc2tfb3BzLT5zbGFiLCByZXEpOworCXJldHVybiAoc3RydWN0IHJlcXVlc3Rfc29jayAqKXNrOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrICpyZXFfdG9fc2soc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQoreworCXJldHVybiAoc3RydWN0IHNvY2sgKilyZXE7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZXFza19mcmVlKHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKIHsKKwkvKiB0ZW1wb3JhcnkgZGVidWdnaW5nICovCisJV0FSTl9PTl9PTkNFKGF0b21pY19yZWFkKCZyZXEtPnJza19yZWZjbnQpICE9IDApOworCiAJcmVxLT5yc2tfb3BzLT5kZXN0cnVjdG9yKHJlcSk7Ci0JX19yZXFza19mcmVlKHJlcSk7CisJaWYgKHJlcS0+cnNrX2xpc3RlbmVyKQorCQlzb2NrX3B1dChyZXEtPnJza19saXN0ZW5lcik7CisJa21lbV9jYWNoZV9mcmVlKHJlcS0+cnNrX29wcy0+c2xhYiwgcmVxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlcXNrX3B1dChzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnJlcS0+cnNrX3JlZmNudCkpCisJCXJlcXNrX2ZyZWUocmVxKTsKIH0KIAogZXh0ZXJuIGludCBzeXNjdGxfbWF4X3N5bl9iYWNrbG9nOwpAQCAtOTMsMTIgKzEyMCwxNiBAQAogICogQG1heF9xbGVuX2xvZyAtIGxvZ18yIG9mIG1heGltYWwgcXVldWVkIFNZTnMvUkVRVUVTVHMKICAqLwogc3RydWN0IGxpc3Rlbl9zb2NrIHsKLQl1OAkJCW1heF9xbGVuX2xvZzsKKwlpbnQJCQlxbGVuX2luYzsgLyogcHJvdGVjdGVkIGJ5IGxpc3RlbmVyIGxvY2sgKi8KKwlpbnQJCQl5b3VuZ19pbmM7LyogcHJvdGVjdGVkIGJ5IGxpc3RlbmVyIGxvY2sgKi8KKworCS8qIGZvbGxvd2luZyBmaWVsZHMgY2FuIGJlIHVwZGF0ZWQgYnkgdGltZXIgKi8KKwlhdG9taWNfdAkJcWxlbl9kZWM7IC8qIHFsZW4gPSBxbGVuX2luYyAtIHFsZW5fZGVjICovCisJYXRvbWljX3QJCXlvdW5nX2RlYzsKKworCXU4CQkJbWF4X3FsZW5fbG9nIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiAJdTgJCQlzeW5mbG9vZF93YXJuZWQ7CiAJLyogMiBieXRlcyBob2xlLCB0cnkgdG8gdXNlICovCi0JaW50CQkJcWxlbjsKLQlpbnQJCQlxbGVuX3lvdW5nOwotCWludAkJCWNsb2NrX2hhbmQ7CiAJdTMyCQkJaGFzaF9ybmQ7CiAJdTMyCQkJbnJfdGFibGVfZW50cmllczsKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrCSpzeW5fdGFibGVbMF07CkBAIC0xNDIsMTggKzE3MywxMSBAQAogICogJXN5bl93YWl0X2xvY2sgaXMgbmVjZXNzYXJ5IG9ubHkgdG8gYXZvaWQgcHJvYyBpbnRlcmZhY2UgaGF2aW5nIHRvIGdyYWIgdGhlIG1haW4KICAqIGxvY2sgc29jayB3aGlsZSBicm93c2luZyB0aGUgbGlzdGVuaW5nIGhhc2ggKG90aGVyd2lzZSBpdCdzIGRlYWRsb2NrIHByb25lKS4KICAqCi0gKiBUaGlzIGxvY2sgaXMgYWNxdWlyZWQgaW4gcmVhZCBtb2RlIG9ubHkgZnJvbSBsaXN0ZW5pbmdfZ2V0X25leHQoKSBzZXFfZmlsZQotICogb3AgYW5kIGl0J3MgYWNxdWlyZWQgaW4gd3JpdGUgbW9kZSBfb25seV8gZnJvbSBjb2RlIHRoYXQgaXMgYWN0aXZlbHkKLSAqIGNoYW5naW5nIHJza3FfYWNjZXB0X2hlYWQuIEFsbCByZWFkZXJzIHRoYXQgYXJlIGhvbGRpbmcgdGhlIG1hc3RlciBzb2NrIGxvY2sKLSAqIGRvbid0IG5lZWQgdG8gZ3JhYiB0aGlzIGxvY2sgaW4gcmVhZCBtb2RlIHRvbyBhcyByc2txX2FjY2VwdF9oZWFkLiB3cml0ZXMKLSAqIGFyZSBhbHdheXMgcHJvdGVjdGVkIGZyb20gdGhlIG1haW4gc29jayBsb2NrLgogICovCiBzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlIHsKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrCSpyc2txX2FjY2VwdF9oZWFkOwogCXN0cnVjdCByZXF1ZXN0X3NvY2sJKnJza3FfYWNjZXB0X3RhaWw7Ci0Jcndsb2NrX3QJCXN5bl93YWl0X2xvY2s7CiAJdTgJCQlyc2txX2RlZmVyX2FjY2VwdDsKLQkvKiAzIGJ5dGVzIGhvbGUsIHRyeSB0byBwYWNrICovCiAJc3RydWN0IGxpc3Rlbl9zb2NrCSpsaXN0ZW5fb3B0OwogCXN0cnVjdCBmYXN0b3Blbl9xdWV1ZQkqZmFzdG9wZW5xOyAvKiBUaGlzIGlzIG5vbi1OVUxMIGlmZiBURk8gaGFzIGJlZW4KIAkJCQkJICAgICAqIGVuYWJsZWQgb24gdGhpcyBsaXN0ZW5lci4gQ2hlY2sKQEAgLTE2MSw2ICsxODUsOSBAQAogCQkJCQkgICAgICogdG8gZGV0ZXJtaW5lIGlmIFRGTyBpcyBlbmFibGVkCiAJCQkJCSAgICAgKiByaWdodCBhdCB0aGlzIG1vbWVudC4KIAkJCQkJICAgICAqLworCisJLyogdGVtcG9yYXJ5IGFsaWdubWVudCwgb3VyIGdvYWwgaXMgdG8gZ2V0IHJpZCBvZiB0aGlzIGxvY2sgKi8KKwlzcGlubG9ja190CQlzeW5fd2FpdF9sb2NrIF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiB9OwogCiBpbnQgcmVxc2tfcXVldWVfYWxsb2Moc3RydWN0IHJlcXVlc3Rfc29ja19xdWV1ZSAqcXVldWUsCkBAIC0xODYsMTIgKzIxMywyMSBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVxc2tfcXVldWVfdW5saW5rKHN0cnVjdCByZXF1ZXN0X3NvY2tfcXVldWUgKnF1ZXVlLAotCQkJCSAgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKLQkJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqcHJldl9yZXEpCisJCQkJICAgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQogewotCXdyaXRlX2xvY2soJnF1ZXVlLT5zeW5fd2FpdF9sb2NrKTsKLQkqcHJldl9yZXEgPSByZXEtPmRsX25leHQ7Ci0Jd3JpdGVfdW5sb2NrKCZxdWV1ZS0+c3luX3dhaXRfbG9jayk7CisJc3RydWN0IGxpc3Rlbl9zb2NrICpsb3B0ID0gcXVldWUtPmxpc3Rlbl9vcHQ7CisJc3RydWN0IHJlcXVlc3Rfc29jayAqKnByZXY7CisKKwlzcGluX2xvY2soJnF1ZXVlLT5zeW5fd2FpdF9sb2NrKTsKKworCXByZXYgPSAmbG9wdC0+c3luX3RhYmxlW3JlcS0+cnNrX2hhc2hdOworCXdoaWxlICgqcHJldiAhPSByZXEpCisJCXByZXYgPSAmKCpwcmV2KS0+ZGxfbmV4dDsKKwkqcHJldiA9IHJlcS0+ZGxfbmV4dDsKKworCXNwaW5fdW5sb2NrKCZxdWV1ZS0+c3luX3dhaXRfbG9jayk7CisJaWYgKGRlbF90aW1lcigmcmVxLT5yc2tfdGltZXIpKQorCQlyZXFza19wdXQocmVxKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHJlcXNrX3F1ZXVlX2FkZChzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlICpxdWV1ZSwKQEAgLTIyNCw1NyArMjYwLDUzIEBACiAJcmV0dXJuIHJlcTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmVxc2tfcXVldWVfcmVtb3ZlZChzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlICpxdWV1ZSwKLQkJCQkgICAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVxc2tfcXVldWVfcmVtb3ZlZChzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlICpxdWV1ZSwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQogewogCXN0cnVjdCBsaXN0ZW5fc29jayAqbG9wdCA9IHF1ZXVlLT5saXN0ZW5fb3B0OwogCiAJaWYgKHJlcS0+bnVtX3RpbWVvdXQgPT0gMCkKLQkJLS1sb3B0LT5xbGVuX3lvdW5nOwotCi0JcmV0dXJuIC0tbG9wdC0+cWxlbjsKKwkJYXRvbWljX2luYygmbG9wdC0+eW91bmdfZGVjKTsKKwlhdG9taWNfaW5jKCZsb3B0LT5xbGVuX2RlYyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlcXNrX3F1ZXVlX2FkZGVkKHN0cnVjdCByZXF1ZXN0X3NvY2tfcXVldWUgKnF1ZXVlKQorc3RhdGljIGlubGluZSB2b2lkIHJlcXNrX3F1ZXVlX2FkZGVkKHN0cnVjdCByZXF1ZXN0X3NvY2tfcXVldWUgKnF1ZXVlKQogewogCXN0cnVjdCBsaXN0ZW5fc29jayAqbG9wdCA9IHF1ZXVlLT5saXN0ZW5fb3B0OwotCWNvbnN0IGludCBwcmV2X3FsZW4gPSBsb3B0LT5xbGVuOwogCi0JbG9wdC0+cWxlbl95b3VuZysrOwotCWxvcHQtPnFsZW4rKzsKLQlyZXR1cm4gcHJldl9xbGVuOworCWxvcHQtPnlvdW5nX2luYysrOworCWxvcHQtPnFsZW5faW5jKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpc3Rlbl9zb2NrX3FsZW4oY29uc3Qgc3RydWN0IGxpc3Rlbl9zb2NrICpsb3B0KQoreworCXJldHVybiBsb3B0LT5xbGVuX2luYyAtIGF0b21pY19yZWFkKCZsb3B0LT5xbGVuX2RlYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGxpc3Rlbl9zb2NrX3lvdW5nKGNvbnN0IHN0cnVjdCBsaXN0ZW5fc29jayAqbG9wdCkKK3sKKwlyZXR1cm4gbG9wdC0+eW91bmdfaW5jIC0gYXRvbWljX3JlYWQoJmxvcHQtPnlvdW5nX2RlYyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJlcXNrX3F1ZXVlX2xlbihjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlICpxdWV1ZSkKIHsKLQlyZXR1cm4gcXVldWUtPmxpc3Rlbl9vcHQgIT0gTlVMTCA/IHF1ZXVlLT5saXN0ZW5fb3B0LT5xbGVuIDogMDsKKwljb25zdCBzdHJ1Y3QgbGlzdGVuX3NvY2sgKmxvcHQgPSBxdWV1ZS0+bGlzdGVuX29wdDsKKworCXJldHVybiBsb3B0ID8gbGlzdGVuX3NvY2tfcWxlbihsb3B0KSA6IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJlcXNrX3F1ZXVlX2xlbl95b3VuZyhjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlICpxdWV1ZSkKIHsKLQlyZXR1cm4gcXVldWUtPmxpc3Rlbl9vcHQtPnFsZW5feW91bmc7CisJcmV0dXJuIGxpc3Rlbl9zb2NrX3lvdW5nKHF1ZXVlLT5saXN0ZW5fb3B0KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcmVxc2tfcXVldWVfaXNfZnVsbChjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlICpxdWV1ZSkKIHsKLQlyZXR1cm4gcXVldWUtPmxpc3Rlbl9vcHQtPnFsZW4gPj4gcXVldWUtPmxpc3Rlbl9vcHQtPm1heF9xbGVuX2xvZzsKKwlyZXR1cm4gcmVxc2tfcXVldWVfbGVuKHF1ZXVlKSA+PiBxdWV1ZS0+bGlzdGVuX29wdC0+bWF4X3FsZW5fbG9nOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVxc2tfcXVldWVfaGFzaF9yZXEoc3RydWN0IHJlcXVlc3Rfc29ja19xdWV1ZSAqcXVldWUsCi0JCQkJCXUzMiBoYXNoLCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkJCXVuc2lnbmVkIGxvbmcgdGltZW91dCkKLXsKLQlzdHJ1Y3QgbGlzdGVuX3NvY2sgKmxvcHQgPSBxdWV1ZS0+bGlzdGVuX29wdDsKLQotCXJlcS0+ZXhwaXJlcyA9IGppZmZpZXMgKyB0aW1lb3V0OwotCXJlcS0+bnVtX3JldHJhbnMgPSAwOwotCXJlcS0+bnVtX3RpbWVvdXQgPSAwOwotCXJlcS0+c2sgPSBOVUxMOwotCXJlcS0+ZGxfbmV4dCA9IGxvcHQtPnN5bl90YWJsZVtoYXNoXTsKLQotCXdyaXRlX2xvY2soJnF1ZXVlLT5zeW5fd2FpdF9sb2NrKTsKLQlsb3B0LT5zeW5fdGFibGVbaGFzaF0gPSByZXE7Ci0Jd3JpdGVfdW5sb2NrKCZxdWV1ZS0+c3luX3dhaXRfbG9jayk7Ci19Cit2b2lkIHJlcXNrX3F1ZXVlX2hhc2hfcmVxKHN0cnVjdCByZXF1ZXN0X3NvY2tfcXVldWUgKnF1ZXVlLAorCQkJICB1MzIgaGFzaCwgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorCQkJICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOwogCiAjZW5kaWYgLyogX1JFUVVFU1RfU09DS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ydG5ldGxpbmsuaCBiL2luY2x1ZGUvbmV0L3J0bmV0bGluay5oCmluZGV4IDZjNmQ1MzkuLjM0M2Q5MjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3J0bmV0bGluay5oCisrKyBiL2luY2x1ZGUvbmV0L3J0bmV0bGluay5oCkBAIC0xMzcsNyArMTM3LDcgQEAKIHZvaWQgcnRubF9hZl91bnJlZ2lzdGVyKHN0cnVjdCBydG5sX2FmX29wcyAqb3BzKTsKIAogc3RydWN0IG5ldCAqcnRubF9saW5rX2dldF9uZXQoc3RydWN0IG5ldCAqc3JjX25ldCwgc3RydWN0IG5sYXR0ciAqdGJbXSk7Ci1zdHJ1Y3QgbmV0X2RldmljZSAqcnRubF9jcmVhdGVfbGluayhzdHJ1Y3QgbmV0ICpuZXQsIGNoYXIgKmlmbmFtZSwKK3N0cnVjdCBuZXRfZGV2aWNlICpydG5sX2NyZWF0ZV9saW5rKHN0cnVjdCBuZXQgKm5ldCwgY29uc3QgY2hhciAqaWZuYW1lLAogCQkJCSAgICB1bnNpZ25lZCBjaGFyIG5hbWVfYXNzaWduX3R5cGUsCiAJCQkJICAgIGNvbnN0IHN0cnVjdCBydG5sX2xpbmtfb3BzICpvcHMsCiAJCQkJICAgIHN0cnVjdCBubGF0dHIgKnRiW10pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaCBiL2luY2x1ZGUvbmV0L3NjaF9nZW5lcmljLmgKaW5kZXggYzYwNWQzMC4uNmQ3NzhlZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2NoX2dlbmVyaWMuaAorKysgYi9pbmNsdWRlL25ldC9zY2hfZ2VuZXJpYy5oCkBAIC0yMTMsNyArMjEzLDcgQEAKIAkJCQkJICAgIGNvbnN0IHN0cnVjdCB0Y2ZfcHJvdG8gKiwKIAkJCQkJICAgIHN0cnVjdCB0Y2ZfcmVzdWx0ICopOwogCWludAkJCSgqaW5pdCkoc3RydWN0IHRjZl9wcm90byopOwotCXZvaWQJCQkoKmRlc3Ryb3kpKHN0cnVjdCB0Y2ZfcHJvdG8qKTsKKwlib29sCQkJKCpkZXN0cm95KShzdHJ1Y3QgdGNmX3Byb3RvKiwgYm9vbCk7CiAKIAl1bnNpZ25lZCBsb25nCQkoKmdldCkoc3RydWN0IHRjZl9wcm90byosIHUzMiBoYW5kbGUpOwogCWludAkJCSgqY2hhbmdlKShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICosCkBAIC0zOTksNyArMzk5LDcgQEAKIAkJCQljb25zdCBzdHJ1Y3QgUWRpc2Nfb3BzICpvcHMsIHUzMiBwYXJlbnRpZCk7CiB2b2lkIF9fcWRpc2NfY2FsY3VsYXRlX3BrdF9sZW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcWRpc2Nfc2l6ZV90YWJsZSAqc3RhYik7Ci12b2lkIHRjZl9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKTsKK2Jvb2wgdGNmX2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHAsIGJvb2wgZm9yY2UpOwogdm9pZCB0Y2ZfZGVzdHJveV9jaGFpbihzdHJ1Y3QgdGNmX3Byb3RvIF9fcmN1ICoqZmwpOwogCiAvKiBSZXNldCBhbGwgVFggcWRpc2NzIGdyZWF0ZXIgdGhlbiBpbmRleCBvZiBhIGRldmljZS4gICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaCBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCmluZGV4IDg1NmYwMWMuLmM1NmE0MzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCisrKyBiL2luY2x1ZGUvbmV0L3NjdHAvc2N0cC5oCkBAIC0xNjYsNiArMTY2LDkgQEAKICAgKi8KIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqc2N0cF9jaHVua19jYWNoZXAgX19yZWFkX21vc3RseTsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqc2N0cF9idWNrZXRfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CitleHRlcm4gbG9uZyBzeXNjdGxfc2N0cF9tZW1bM107CitleHRlcm4gaW50IHN5c2N0bF9zY3RwX3JtZW1bM107CitleHRlcm4gaW50IHN5c2N0bF9zY3RwX3dtZW1bM107CiAKIC8qCiAgKiAgU2VjdGlvbjogIE1hY3JvcywgZXh0ZXJucywgYW5kIGlubGluZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaAppbmRleCBhYjE4NmIxLi4zYTQ4OThlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvc29jay5oCkBAIC01Nyw3ICs1Nyw2IEBACiAjaW5jbHVkZSA8bGludXgvcGFnZV9jb3VudGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0YXRpY19rZXkuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCiAjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CkBAIC02Nyw2ICs2Niw3IEBACiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC90Y3Bfc3RhdGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0X3RzdGFtcC5oPgogCiBzdHJ1Y3QgY2dyb3VwOwpAQCAtMTkwLDE1ICsxOTAsMTUgQEAKIAkJc3RydWN0IGhsaXN0X251bGxzX25vZGUgc2tjX3BvcnRhZGRyX25vZGU7CiAJfTsKIAlzdHJ1Y3QgcHJvdG8JCSpza2NfcHJvdDsKLSNpZmRlZiBDT05GSUdfTkVUX05TCi0Jc3RydWN0IG5ldAkgCSpza2NfbmV0OwotI2VuZGlmCisJcG9zc2libGVfbmV0X3QJCXNrY19uZXQ7CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCXN0cnVjdCBpbjZfYWRkcgkJc2tjX3Y2X2RhZGRyOwogCXN0cnVjdCBpbjZfYWRkcgkJc2tjX3Y2X3Jjdl9zYWRkcjsKICNlbmRpZgogCisJYXRvbWljNjRfdAkJc2tjX2Nvb2tpZTsKKwogCS8qCiAJICogZmllbGRzIGJldHdlZW4gZG9udGNvcHlfYmVnaW4vZG9udGNvcHlfZW5kCiAJICogYXJlIG5vdCBjb3BpZWQgaW4gc29ja19jb3B5KCkKQEAgLTMyOSw2ICszMjksNyBAQAogI2RlZmluZSBza19uZXQJCQlfX3NrX2NvbW1vbi5za2NfbmV0CiAjZGVmaW5lIHNrX3Y2X2RhZGRyCQlfX3NrX2NvbW1vbi5za2NfdjZfZGFkZHIKICNkZWZpbmUgc2tfdjZfcmN2X3NhZGRyCV9fc2tfY29tbW9uLnNrY192Nl9yY3Zfc2FkZHIKKyNkZWZpbmUgc2tfY29va2llCQlfX3NrX2NvbW1vbi5za2NfY29va2llCiAKIAlzb2NrZXRfbG9ja190CQlza19sb2NrOwogCXN0cnVjdCBza19idWZmX2hlYWQJc2tfcmVjZWl2ZV9xdWV1ZTsKQEAgLTQwMyw4ICs0MDQsOCBAQAogCXJ3bG9ja190CQlza19jYWxsYmFja19sb2NrOwogCWludAkJCXNrX2VyciwKIAkJCQlza19lcnJfc29mdDsKLQl1bnNpZ25lZCBzaG9ydAkJc2tfYWNrX2JhY2tsb2c7Ci0JdW5zaWduZWQgc2hvcnQJCXNrX21heF9hY2tfYmFja2xvZzsKKwl1MzIJCQlza19hY2tfYmFja2xvZzsKKwl1MzIJCQlza19tYXhfYWNrX2JhY2tsb2c7CiAJX191MzIJCQlza19wcmlvcml0eTsKICNpZiBJU19FTkFCTEVEKENPTkZJR19DR1JPVVBfTkVUX1BSSU8pCiAJX191MzIJCQlza19jZ3JwX3ByaW9pZHg7CkBAIC05NTgsMTAgKzk1OSw5IEBACiAJaW50CQkJKCpjb21wYXRfaW9jdGwpKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogI2VuZGlmCi0JaW50CQkJKCpzZW5kbXNnKShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKTsKLQlpbnQJCQkoKnJlY3Ztc2cpKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgICBzdHJ1Y3QgbXNnaGRyICptc2csCisJaW50CQkJKCpzZW5kbXNnKShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCQkJICAgc2l6ZV90IGxlbik7CisJaW50CQkJKCpyZWN2bXNnKShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKIAkJCQkJICAgc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssIGludCBmbGFncywKIAkJCQkJICAgaW50ICphZGRyX2xlbik7CiAJaW50CQkJKCpzZW5kcGFnZSkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKQEAgLTE1NjIsOSArMTU2Miw4IEBACiBpbnQgc29ja19ub19zaHV0ZG93bihzdHJ1Y3Qgc29ja2V0ICosIGludCk7CiBpbnQgc29ja19ub19nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKiwgaW50ICwgaW50LCBjaGFyIF9fdXNlciAqLCBpbnQgX191c2VyICopOwogaW50IHNvY2tfbm9fc2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICosIGludCwgaW50LCBjaGFyIF9fdXNlciAqLCB1bnNpZ25lZCBpbnQpOwotaW50IHNvY2tfbm9fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7Ci1pbnQgc29ja19ub19yZWN2bXNnKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90LAotCQkgICAgaW50KTsKK2ludCBzb2NrX25vX3NlbmRtc2coc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7CitpbnQgc29ja19ub19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QsIGludCk7CiBpbnQgc29ja19ub19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAogCQkgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwogc3NpemVfdCBzb2NrX25vX3NlbmRwYWdlKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LApAQCAtMTU3Niw4ICsxNTc1LDggQEAKICAqLwogaW50IHNvY2tfY29tbW9uX2dldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBfX3VzZXIgKm9wdGxlbik7Ci1pbnQgc29ja19jb21tb25fcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKK2ludCBzb2NrX2NvbW1vbl9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsCisJCQlpbnQgZmxhZ3MpOwogaW50IHNvY2tfY29tbW9uX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJCQkgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pOwogaW50IGNvbXBhdF9zb2NrX2NvbW1vbl9nZXRzb2Nrb3B0KHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBsZXZlbCwKQEAgLTE2MjYsNyArMTYyNSw3IEBACiAJCXNrX2ZyZWUoc2spOwogfQogLyogR2VuZXJpYyB2ZXJzaW9uIG9mIHNvY2tfcHV0KCksIGRlYWxpbmcgd2l0aCBhbGwgc29ja2V0cwotICogKFRDUF9USU1FV0FJVCwgRVNUQUJMSVNIRUQuLi4pCisgKiAoVENQX1RJTUVXQUlULCBUQ1BfTkVXX1NZTl9SRUNWLCBFU1RBQkxJU0hFRC4uLikKICAqLwogdm9pZCBzb2NrX2dlbl9wdXQoc3RydWN0IHNvY2sgKnNrKTsKIApAQCAtMTc2Miw2ICsxNzYxLDggQEAKIAogc3RydWN0IGRzdF9lbnRyeSAqc2tfZHN0X2NoZWNrKHN0cnVjdCBzb2NrICpzaywgdTMyIGNvb2tpZSk7CiAKK2Jvb2wgc2tfbWNfbG9vcChzdHJ1Y3Qgc29jayAqc2spOworCiBzdGF0aWMgaW5saW5lIGJvb2wgc2tfY2FuX2dzbyhjb25zdCBzdHJ1Y3Qgc29jayAqc2spCiB7CiAJcmV0dXJuIG5ldF9nc29fb2soc2stPnNrX3JvdXRlX2NhcHMsIHNrLT5za19nc29fdHlwZSk7CkBAIC0yMDc4LDYgKzIwNzksMjkgQEAKIAlyZXR1cm4gdGltZW8gPT0gTUFYX1NDSEVEVUxFX1RJTUVPVVQgPyAtRVJFU1RBUlRTWVMgOiAtRUlOVFI7CiB9CiAKK3N0cnVjdCBzb2NrX3NrYl9jYiB7CisJdTMyIGRyb3Bjb3VudDsKK307CisKKy8qIFN0b3JlIHNvY2tfc2tiX2NiIGF0IHRoZSBlbmQgb2Ygc2tiLT5jYltdIHNvIHByb3RvY29sIGZhbWlsaWVzCisgKiB1c2luZyBza2ItPmNiW10gd291bGQga2VlcCB1c2luZyBpdCBkaXJlY3RseSBhbmQgdXRpbGl6ZSBpdHMKKyAqIGFsaWduZW1lbnQgZ3VhcmFudGVlLgorICovCisjZGVmaW5lIFNPQ0tfU0tCX0NCX09GRlNFVCAoKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgY2IpIC0gXAorCQkJICAgIHNpemVvZihzdHJ1Y3Qgc29ja19za2JfY2IpKSkKKworI2RlZmluZSBTT0NLX1NLQl9DQihfX3NrYikgKChzdHJ1Y3Qgc29ja19za2JfY2IgKikoKF9fc2tiKS0+Y2IgKyBcCisJCQkgICAgU09DS19TS0JfQ0JfT0ZGU0VUKSkKKworI2RlZmluZSBzb2NrX3NrYl9jYl9jaGVja19zaXplKHNpemUpIFwKKwlCVUlMRF9CVUdfT04oKHNpemUpID4gU09DS19TS0JfQ0JfT0ZGU0VUKQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3NvY2tfc2tiX3NldF9kcm9wY291bnQoY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCVNPQ0tfU0tCX0NCKHNrYiktPmRyb3Bjb3VudCA9IGF0b21pY19yZWFkKCZzay0+c2tfZHJvcHMpOworfQorCiB2b2lkIF9fc29ja19yZWN2X3RpbWVzdGFtcChzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzb2NrICpzaywKIAkJCSAgIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBfX3NvY2tfcmVjdl93aWZpX3N0YXR1cyhzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzb2NrICpzaywKQEAgLTIxODAsNyArMjIwNCw3IEBACiAKIAlpZiAoIW5ldF9lcShjdXJyZW50X25ldCwgbmV0KSkgewogCQlwdXRfbmV0KGN1cnJlbnRfbmV0KTsKLQkJc29ja19uZXRfc2V0KHNrLCBob2xkX25ldChuZXQpKTsKKwkJc29ja19uZXRfc2V0KHNrLCBuZXQpOwogCX0KIH0KIApAQCAtMjE5Niw2ICsyMjIwLDE0IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKKy8qIFRoaXMgaGVscGVyIGNoZWNrcyBpZiBhIHNvY2tldCBpcyBhIGZ1bGwgc29ja2V0LAorICogaWUgX25vdF8gYSB0aW1ld2FpdCBvciByZXF1ZXN0IHNvY2tldC4KKyAqLworc3RhdGljIGlubGluZSBib29sIHNrX2Z1bGxzb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gKDEgPDwgc2stPnNrX3N0YXRlKSAmIH4oVENQRl9USU1FX1dBSVQgfCBUQ1BGX05FV19TWU5fUkVDVik7Cit9CisKIHZvaWQgc29ja19lbmFibGVfdGltZXN0YW1wKHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWcpOwogaW50IHNvY2tfZ2V0X3RpbWVzdGFtcChzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3QgdGltZXZhbCBfX3VzZXIgKik7CiBpbnQgc29ja19nZXRfdGltZXN0YW1wbnMoc3RydWN0IHNvY2sgKiwgc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3N3aXRjaGRldi5oIGIvaW5jbHVkZS9uZXQvc3dpdGNoZGV2LmgKaW5kZXggY2ZjZGFjMi4uZDJlNjllZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc3dpdGNoZGV2LmgKKysrIGIvaW5jbHVkZS9uZXQvc3dpdGNoZGV2LmgKQEAgLTEsNiArMSw3IEBACiAvKgogICogaW5jbHVkZS9uZXQvc3dpdGNoZGV2LmggLSBTd2l0Y2ggZGV2aWNlIEFQSQogICogQ29weXJpZ2h0IChjKSAyMDE0IEppcmkgUGlya28gPGppcmlAcmVzbnVsbGkudXM+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBTY290dCBGZWxkbWFuIDxzZmVsZG1hQGdtYWlsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTEzLDYgKzE0LDM1IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KIAorc3RydWN0IGZpYl9pbmZvOworCisvKioKKyAqIHN0cnVjdCBzd2l0Y2hkZXZfb3BzIC0gc3dpdGNoZGV2IG9wZXJhdGlvbnMKKyAqCisgKiBAc3dkZXZfcGFyZW50X2lkX2dldDogQ2FsbGVkIHRvIGdldCBhbiBJRCBvZiB0aGUgc3dpdGNoIGNoaXAgdGhpcyBwb3J0CisgKiAgIGlzIHBhcnQgb2YuICBJZiBkcml2ZXIgaW1wbGVtZW50cyB0aGlzLCBpdCBpbmRpY2F0ZXMgdGhhdCBpdAorICogICByZXByZXNlbnRzIGEgcG9ydCBvZiBhIHN3aXRjaCBjaGlwLgorICoKKyAqIEBzd2Rldl9wb3J0X3N0cF91cGRhdGU6IENhbGxlZCB0byBub3RpZnkgc3dpdGNoIGRldmljZSBwb3J0IG9mIGJyaWRnZQorICogICBwb3J0IFNUUCBzdGF0ZSBjaGFuZ2UuCisgKgorICogQHN3ZGV2X2ZpYl9pcHY0X2FkZDogQ2FsbGVkIHRvIGFkZC9tb2RpZnkgSVB2NCByb3V0ZSB0byBzd2l0Y2ggZGV2aWNlLgorICoKKyAqIEBzd2Rldl9maWJfaXB2NF9kZWw6IENhbGxlZCB0byBkZWxldGUgSVB2NCByb3V0ZSBmcm9tIHN3aXRjaCBkZXZpY2UuCisgKi8KK3N0cnVjdCBzd2Rldl9vcHMgeworCWludAkoKnN3ZGV2X3BhcmVudF9pZF9nZXQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBuZXRkZXZfcGh5c19pdGVtX2lkICpwc2lkKTsKKwlpbnQJKCpzd2Rldl9wb3J0X3N0cF91cGRhdGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHN0YXRlKTsKKwlpbnQJKCpzd2Rldl9maWJfaXB2NF9hZGQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUzMiBkc3QsCisJCQkJICAgICAgaW50IGRzdF9sZW4sIHN0cnVjdCBmaWJfaW5mbyAqZmksCisJCQkJICAgICAgdTggdG9zLCB1OCB0eXBlLCB1MzIgbmxmbGFncywKKwkJCQkgICAgICB1MzIgdGJfaWQpOworCWludAkoKnN3ZGV2X2ZpYl9pcHY0X2RlbCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX19iZTMyIGRzdCwKKwkJCQkgICAgICBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKKwkJCQkgICAgICB1OCB0b3MsIHU4IHR5cGUsIHUzMiB0Yl9pZCk7Cit9OworCiBlbnVtIG5ldGRldl9zd2l0Y2hfbm90aWZpZXJfdHlwZSB7CiAJTkVUREVWX1NXSVRDSF9GREJfQUREID0gMSwKIAlORVRERVZfU1dJVENIX0ZEQl9ERUwsCkBAIC01MSw2ICs4MSwxMiBAQAogCQkJCQkgICAgICAgc3RydWN0IG5sbXNnaGRyICpubGgsIHUxNiBmbGFncyk7CiBpbnQgbmRvX2RmbHRfbmV0ZGV2X3N3aXRjaF9wb3J0X2JyaWRnZV9zZXRsaW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgdTE2IGZsYWdzKTsKK2ludCBuZXRkZXZfc3dpdGNoX2ZpYl9pcHY0X2FkZCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKKwkJCSAgICAgICB1OCB0b3MsIHU4IHR5cGUsIHUzMiBubGZsYWdzLCB1MzIgdGJfaWQpOworaW50IG5ldGRldl9zd2l0Y2hfZmliX2lwdjRfZGVsKHUzMiBkc3QsIGludCBkc3RfbGVuLCBzdHJ1Y3QgZmliX2luZm8gKmZpLAorCQkJICAgICAgIHU4IHRvcywgdTggdHlwZSwgdTMyIHRiX2lkKTsKK3ZvaWQgbmV0ZGV2X3N3aXRjaF9maWJfaXB2NF9hYm9ydChzdHJ1Y3QgZmliX2luZm8gKmZpKTsKKwogI2Vsc2UKIAogc3RhdGljIGlubGluZSBpbnQgbmV0ZGV2X3N3aXRjaF9wYXJlbnRfaWRfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC0xMDksNiArMTQ1LDI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG5ldGRldl9zd2l0Y2hfZmliX2lwdjRfYWRkKHUzMiBkc3QsIGludCBkc3RfbGVuLAorCQkJCQkgICAgIHN0cnVjdCBmaWJfaW5mbyAqZmksCisJCQkJCSAgICAgdTggdG9zLCB1OCB0eXBlLAorCQkJCQkgICAgIHUzMiBubGZsYWdzLCB1MzIgdGJfaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5ldGRldl9zd2l0Y2hfZmliX2lwdjRfZGVsKHUzMiBkc3QsIGludCBkc3RfbGVuLAorCQkJCQkgICAgIHN0cnVjdCBmaWJfaW5mbyAqZmksCisJCQkJCSAgICAgdTggdG9zLCB1OCB0eXBlLCB1MzIgdGJfaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRkZXZfc3dpdGNoX2ZpYl9pcHY0X2Fib3J0KHN0cnVjdCBmaWJfaW5mbyAqZmkpCit7Cit9CisKICNlbmRpZgogCiAjZW5kaWYgLyogX0xJTlVYX1NXSVRDSERFVl9IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX2JwZi5oIGIvaW5jbHVkZS9uZXQvdGNfYWN0L3RjX2JwZi5oCmluZGV4IDg2YTA3MGYuLmExNTJlOTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RjX2FjdC90Y19icGYuaAorKysgYi9pbmNsdWRlL25ldC90Y19hY3QvdGNfYnBmLmgKQEAgLTE2LDggKzE2LDEyIEBACiBzdHJ1Y3QgdGNmX2JwZiB7CiAJc3RydWN0IHRjZl9jb21tb24JY29tbW9uOwogCXN0cnVjdCBicGZfcHJvZwkJKmZpbHRlcjsKKwl1bmlvbiB7CisJCXUzMgkJYnBmX2ZkOworCQl1MTYJCWJwZl9udW1fb3BzOworCX07CiAJc3RydWN0IHNvY2tfZmlsdGVyCSpicGZfb3BzOwotCXUxNgkJCWJwZl9udW1fb3BzOworCWNvbnN0IGNoYXIJCSpicGZfbmFtZTsKIH07CiAjZGVmaW5lIHRvX2JwZihhKSBcCiAJY29udGFpbmVyX29mKGEtPnByaXYsIHN0cnVjdCB0Y2ZfYnBmLCBjb21tb24pCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y3AuaCBiL2luY2x1ZGUvbmV0L3RjcC5oCmluZGV4IDhkNmI5ODMuLjk1OTg4NzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3RjcC5oCisrKyBiL2luY2x1ZGUvbmV0L3RjcC5oCkBAIC02NSw3ICs2NSwxMyBAQAogI2RlZmluZSBUQ1BfTUlOX01TUwkJODhVCiAKIC8qIFRoZSBsZWFzdCBNVFUgdG8gdXNlIGZvciBwcm9iaW5nICovCi0jZGVmaW5lIFRDUF9CQVNFX01TUwkJNTEyCisjZGVmaW5lIFRDUF9CQVNFX01TUwkJMTAyNAorCisvKiBwcm9iaW5nIGludGVydmFsLCBkZWZhdWx0IHRvIDEwIG1pbnV0ZXMgYXMgcGVyIFJGQzQ4MjEgKi8KKyNkZWZpbmUgVENQX1BST0JFX0lOVEVSVkFMCTYwMAorCisvKiBTcGVjaWZ5IGludGVydmFsIHdoZW4gdGNwIG10dSBwcm9iaW5nIHdpbGwgc3RvcCAqLworI2RlZmluZSBUQ1BfUFJPQkVfVEhSRVNIT0xECTgKIAogLyogQWZ0ZXIgcmVjZWl2aW5nIHRoaXMgYW1vdW50IG9mIGR1cGxpY2F0ZSBBQ0tzIGZhc3QgcmV0cmFuc21pdCBzdGFydHMuICovCiAjZGVmaW5lIFRDUF9GQVNUUkVUUkFOU19USFJFU0ggMwpAQCAtMTczLDYgKzE3OSw3IEBACiAjZGVmaW5lIFRDUE9QVF9TQUNLICAgICAgICAgICAgIDUgICAgICAgLyogU0FDSyBCbG9jayAqLwogI2RlZmluZSBUQ1BPUFRfVElNRVNUQU1QCTgJLyogQmV0dGVyIFJUVCBlc3RpbWF0aW9ucy9QQVdTICovCiAjZGVmaW5lIFRDUE9QVF9NRDVTSUcJCTE5CS8qIE1ENSBTaWduYXR1cmUgKFJGQzIzODUpICovCisjZGVmaW5lIFRDUE9QVF9GQVNUT1BFTgkJMzQJLyogRmFzdCBvcGVuIChSRkM3NDEzKSAqLwogI2RlZmluZSBUQ1BPUFRfRVhQCQkyNTQJLyogRXhwZXJpbWVudGFsICovCiAvKiBNYWdpYyBudW1iZXIgdG8gYmUgYWZ0ZXIgdGhlIG9wdGlvbiB2YWx1ZSBmb3Igc2hhcmluZyBUQ1AKICAqIGV4cGVyaW1lbnRhbCBvcHRpb25zLiBTZWUgZHJhZnQtaWV0Zi10Y3BtLWV4cGVyaW1lbnRhbC1vcHRpb25zLTAwLnR4dApAQCAtMTg4LDYgKzE5NSw3IEBACiAjZGVmaW5lIFRDUE9MRU5fU0FDS19QRVJNICAgICAgMgogI2RlZmluZSBUQ1BPTEVOX1RJTUVTVEFNUCAgICAgIDEwCiAjZGVmaW5lIFRDUE9MRU5fTUQ1U0lHICAgICAgICAgMTgKKyNkZWZpbmUgVENQT0xFTl9GQVNUT1BFTl9CQVNFICAyCiAjZGVmaW5lIFRDUE9MRU5fRVhQX0ZBU1RPUEVOX0JBU0UgIDQKIAogLyogQnV0IHRoaXMgaXMgd2hhdCBzdGFja3MgcmVhbGx5IHNlbmQgb3V0LiAqLwpAQCAtMzQ5LDggKzM1Nyw3IEBACiBpbnQgdGNwX3Y0X3JjdihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogaW50IHRjcF92NF90d19yZW1lbWJlcl9zdGFtcChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dyk7Ci1pbnQgdGNwX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJc2l6ZV90IHNpemUpOworaW50IHRjcF9zZW5kbXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSk7CiBpbnQgdGNwX3NlbmRwYWdlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBvZmZzZXQsIHNpemVfdCBzaXplLAogCQkgaW50IGZsYWdzKTsKIHZvaWQgdGNwX3JlbGVhc2VfY2Ioc3RydWN0IHNvY2sgKnNrKTsKQEAgLTQwMSw4ICs0MDgsNyBAQAogCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCk7CiBzdHJ1Y3Qgc29jayAqdGNwX2NoZWNrX3JlcShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsIHN0cnVjdCByZXF1ZXN0X3NvY2sgKipwcmV2LAotCQkJICAgYm9vbCBmYXN0b3Blbik7CisJCQkgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsIGJvb2wgZmFzdG9wZW4pOwogaW50IHRjcF9jaGlsZF9wcm9jZXNzKHN0cnVjdCBzb2NrICpwYXJlbnQsIHN0cnVjdCBzb2NrICpjaGlsZCwKIAkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkIHRjcF9lbnRlcl9sb3NzKHN0cnVjdCBzb2NrICpzayk7CkBAIC00MjksOSArNDM1LDkgQEAKIGludCBjb21wYXRfdGNwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIHZvaWQgdGNwX3NldF9rZWVwYWxpdmUoc3RydWN0IHNvY2sgKnNrLCBpbnQgdmFsKTsKLXZvaWQgdGNwX3N5bl9hY2tfdGltZW91dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7Ci1pbnQgdGNwX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJc2l6ZV90IGxlbiwgaW50IG5vbmJsb2NrLCBpbnQgZmxhZ3MsIGludCAqYWRkcl9sZW4pOwordm9pZCB0Y3Bfc3luX2Fja190aW1lb3V0KGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7CitpbnQgdGNwX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBub25ibG9jaywKKwkJaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKTsKIHZvaWQgdGNwX3BhcnNlX29wdGlvbnMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgICAgIHN0cnVjdCB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqb3B0X3J4LAogCQkgICAgICAgaW50IGVzdGFiLCBzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZSAqZm9jKTsKQEAgLTQ0Myw2ICs0NDksNyBAQAogCiB2b2lkIHRjcF92NF9zZW5kX2NoZWNrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkIHRjcF92NF9tdHVfcmVkdWNlZChzdHJ1Y3Qgc29jayAqc2spOwordm9pZCB0Y3BfcmVxX2VycihzdHJ1Y3Qgc29jayAqc2ssIHUzMiBzZXEpOwogaW50IHRjcF92NF9jb25uX3JlcXVlc3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0cnVjdCBzb2NrICp0Y3BfY3JlYXRlX29wZW5yZXFfY2hpbGQoc3RydWN0IHNvY2sgKnNrLAogCQkJCSAgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKQEAgLTUyNCw4ICs1MzEsNiBAQAogdm9pZCB0Y3Bfc2VuZF9maW4oc3RydWN0IHNvY2sgKnNrKTsKIHZvaWQgdGNwX3NlbmRfYWN0aXZlX3Jlc2V0KHN0cnVjdCBzb2NrICpzaywgZ2ZwX3QgcHJpb3JpdHkpOwogaW50IHRjcF9zZW5kX3N5bmFjayhzdHJ1Y3Qgc29jayAqKTsKLWJvb2wgdGNwX3N5bl9mbG9vZF9hY3Rpb24oc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICBjb25zdCBjaGFyICpwcm90byk7CiB2b2lkIHRjcF9wdXNoX29uZShzdHJ1Y3Qgc29jayAqLCB1bnNpZ25lZCBpbnQgbXNzX25vdyk7CiB2b2lkIHRjcF9zZW5kX2FjayhzdHJ1Y3Qgc29jayAqc2spOwogdm9pZCB0Y3Bfc2VuZF9kZWxheWVkX2FjayhzdHJ1Y3Qgc29jayAqc2spOwpAQCAtMTEzMiwzMSArMTEzNyw2IEBACiAJcmV0dXJuIHRjcF93aW5fZnJvbV9zcGFjZShzay0+c2tfcmN2YnVmKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRjcF9vcGVucmVxX2luaXQoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAotCQkJCSAgICBzdHJ1Y3QgdGNwX29wdGlvbnNfcmVjZWl2ZWQgKnJ4X29wdCwKLQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrKQotewotCXN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaXJlcSA9IGluZXRfcnNrKHJlcSk7Ci0KLQlyZXEtPnJjdl93bmQgPSAwOwkJLyogU28gdGhhdCB0Y3Bfc2VuZF9zeW5hY2soKSBrbm93cyEgKi8KLQlyZXEtPmNvb2tpZV90cyA9IDA7Ci0JdGNwX3JzayhyZXEpLT5yY3ZfaXNuID0gVENQX1NLQl9DQihza2IpLT5zZXE7Ci0JdGNwX3JzayhyZXEpLT5yY3Zfbnh0ID0gVENQX1NLQl9DQihza2IpLT5zZXEgKyAxOwotCXRjcF9yc2socmVxKS0+c250X3N5bmFjayA9IHRjcF90aW1lX3N0YW1wOwotCXRjcF9yc2socmVxKS0+bGFzdF9vb3dfYWNrX3RpbWUgPSAwOwotCXJlcS0+bXNzID0gcnhfb3B0LT5tc3NfY2xhbXA7Ci0JcmVxLT50c19yZWNlbnQgPSByeF9vcHQtPnNhd190c3RhbXAgPyByeF9vcHQtPnJjdl90c3ZhbCA6IDA7Ci0JaXJlcS0+dHN0YW1wX29rID0gcnhfb3B0LT50c3RhbXBfb2s7Ci0JaXJlcS0+c2Fja19vayA9IHJ4X29wdC0+c2Fja19vazsKLQlpcmVxLT5zbmRfd3NjYWxlID0gcnhfb3B0LT5zbmRfd3NjYWxlOwotCWlyZXEtPndzY2FsZV9vayA9IHJ4X29wdC0+d3NjYWxlX29rOwotCWlyZXEtPmFja2VkID0gMDsKLQlpcmVxLT5lY25fb2sgPSAwOwotCWlyZXEtPmlyX3JtdF9wb3J0ID0gdGNwX2hkcihza2IpLT5zb3VyY2U7Ci0JaXJlcS0+aXJfbnVtID0gbnRvaHModGNwX2hkcihza2IpLT5kZXN0KTsKLQlpcmVxLT5pcl9tYXJrID0gaW5ldF9yZXF1ZXN0X21hcmsoc2ssIHNrYik7Ci19Ci0KIGV4dGVybiB2b2lkIHRjcF9vcGVucmVxX2luaXRfcndpbihzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCiAJCQkJICBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CiAKQEAgLTEyMzYsMzYgKzEyMTYsOCBAQAogCXJldHVybiB0cnVlOwogfQogCi0vKiBSZXR1cm4gdHJ1ZSBpZiB3ZSdyZSBjdXJyZW50bHkgcmF0ZS1saW1pdGluZyBvdXQtb2Ytd2luZG93IEFDS3MgYW5kCi0gKiB0aHVzIHNob3VsZG4ndCBzZW5kIGEgZHVwYWNrIHJpZ2h0IG5vdy4gV2UgcmF0ZS1saW1pdCBkdXBhY2tzIGluCi0gKiByZXNwb25zZSB0byBvdXQtb2Ytd2luZG93IFNZTnMgb3IgQUNLcyB0byBtaXRpZ2F0ZSBBQ0sgbG9vcHMgb3IgRG9TCi0gKiBhdHRhY2tzIHRoYXQgc2VuZCByZXBlYXRlZCBTWU5zIG9yIEFDS3MgZm9yIHRoZSBzYW1lIGNvbm5lY3Rpb24uIFRvCi0gKiBkbyB0aGlzLCB3ZSBkbyBub3Qgc2VuZCBhIGR1cGxpY2F0ZSBTWU5BQ0sgb3IgQUNLIGlmIHRoZSByZW1vdGUKLSAqIGVuZHBvaW50IGlzIHNlbmRpbmcgb3V0LW9mLXdpbmRvdyBTWU5zIG9yIHB1cmUgQUNLcyBhdCBhIGhpZ2ggcmF0ZS4KLSAqLwotc3RhdGljIGlubGluZSBib29sIHRjcF9vb3dfcmF0ZV9saW1pdGVkKHN0cnVjdCBuZXQgKm5ldCwKLQkJCQkJY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJaW50IG1pYl9pZHgsIHUzMiAqbGFzdF9vb3dfYWNrX3RpbWUpCi17Ci0JLyogRGF0YSBwYWNrZXRzIHdpdGhvdXQgU1lOcyBhcmUgbm90IGxpa2VseSBwYXJ0IG9mIGFuIEFDSyBsb29wLiAqLwotCWlmICgoVENQX1NLQl9DQihza2IpLT5zZXEgIT0gVENQX1NLQl9DQihza2IpLT5lbmRfc2VxKSAmJgotCSAgICAhdGNwX2hkcihza2IpLT5zeW4pCi0JCWdvdG8gbm90X3JhdGVfbGltaXRlZDsKLQotCWlmICgqbGFzdF9vb3dfYWNrX3RpbWUpIHsKLQkJczMyIGVsYXBzZWQgPSAoczMyKSh0Y3BfdGltZV9zdGFtcCAtICpsYXN0X29vd19hY2tfdGltZSk7Ci0KLQkJaWYgKDAgPD0gZWxhcHNlZCAmJiBlbGFwc2VkIDwgc3lzY3RsX3RjcF9pbnZhbGlkX3JhdGVsaW1pdCkgewotCQkJTkVUX0lOQ19TVEFUU19CSChuZXQsIG1pYl9pZHgpOwotCQkJcmV0dXJuIHRydWU7CS8qIHJhdGUtbGltaXRlZDogZG9uJ3Qgc2VuZCB5ZXQhICovCi0JCX0KLQl9Ci0KLQkqbGFzdF9vb3dfYWNrX3RpbWUgPSB0Y3BfdGltZV9zdGFtcDsKLQotbm90X3JhdGVfbGltaXRlZDoKLQlyZXR1cm4gZmFsc2U7CS8qIG5vdCByYXRlLWxpbWl0ZWQ6IGdvIGFoZWFkLCBzZW5kIGR1cGFjayBub3chICovCi19Citib29sIHRjcF9vb3dfcmF0ZV9saW1pdGVkKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgaW50IG1pYl9pZHgsIHUzMiAqbGFzdF9vb3dfYWNrX3RpbWUpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX21pYl9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKQEAgLTEzNDQsMTUgKzEyOTYsMTQgQEAKIH07CiAKIC8qIC0gZnVuY3Rpb25zICovCi1pbnQgdGNwX3Y0X21kNV9oYXNoX3NrYihjaGFyICptZDVfaGFzaCwgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXksCi0JCQljb25zdCBzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKLQkJCWNvbnN0IHN0cnVjdCBza19idWZmICpza2IpOworaW50IHRjcF92NF9tZDVfaGFzaF9za2IoY2hhciAqbWQ1X2hhc2gsIGNvbnN0IHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5LAorCQkJY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCB0Y3BfbWQ1X2RvX2FkZChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHVuaW9uIHRjcF9tZDVfYWRkciAqYWRkciwKIAkJICAgaW50IGZhbWlseSwgY29uc3QgdTggKm5ld2tleSwgdTggbmV3a2V5bGVuLCBnZnBfdCBnZnApOwogaW50IHRjcF9tZDVfZG9fZGVsKHN0cnVjdCBzb2NrICpzaywgY29uc3QgdW5pb24gdGNwX21kNV9hZGRyICphZGRyLAogCQkgICBpbnQgZmFtaWx5KTsKIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqdGNwX3Y0X21kNV9sb29rdXAoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgc3RydWN0IHNvY2sgKmFkZHJfc2spOworCQkJCQkgY29uc3Qgc3RydWN0IHNvY2sgKmFkZHJfc2spOwogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqdGNwX21kNV9kb19sb29rdXAoc3RydWN0IHNvY2sgKnNrLApAQCAtMTM4OCw3ICsxMzM5LDggQEAKIAkJCSAgICBzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZSAqY29va2llLCBpbnQgKnN5bl9sb3NzLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgKmxhc3Rfc3luX2xvc3MpOwogdm9pZCB0Y3BfZmFzdG9wZW5fY2FjaGVfc2V0KHN0cnVjdCBzb2NrICpzaywgdTE2IG1zcywKLQkJCSAgICBzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZSAqY29va2llLCBib29sIHN5bl9sb3N0KTsKKwkJCSAgICBzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZSAqY29va2llLCBib29sIHN5bl9sb3N0LAorCQkJICAgIHUxNiB0cnlfZXhwKTsKIHN0cnVjdCB0Y3BfZmFzdG9wZW5fcmVxdWVzdCB7CiAJLyogRmFzdCBPcGVuIGNvb2tpZS4gU2l6ZSAwIG1lYW5zIGEgY29va2llIHJlcXVlc3QgKi8KIAlzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZQljb29raWU7CkBAIC0xNjYzLDI4ICsxNjE1LDI2IEBACiBzdHJ1Y3QgdGNwX3NvY2tfYWZfb3BzIHsKICNpZmRlZiBDT05GSUdfVENQX01ENVNJRwogCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleQkqKCptZDVfbG9va3VwKSAoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJc3RydWN0IHNvY2sgKmFkZHJfc2spOwotCWludAkJCSgqY2FsY19tZDVfaGFzaCkgKGNoYXIgKmxvY2F0aW9uLAotCQkJCQkJICBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKm1kNSwKLQkJCQkJCSAgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJICBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkJCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpOwotCWludAkJCSgqbWQ1X3BhcnNlKSAoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgICAgICBjaGFyIF9fdXNlciAqb3B0dmFsLAotCQkJCQkgICAgICBpbnQgb3B0bGVuKTsKKwkJCQkJCWNvbnN0IHN0cnVjdCBzb2NrICphZGRyX3NrKTsKKwlpbnQJCSgqY2FsY19tZDVfaGFzaCkoY2hhciAqbG9jYXRpb24sCisJCQkJCSBjb25zdCBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKm1kNSwKKwkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKKwkJCQkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpOworCWludAkJKCptZDVfcGFyc2UpKHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICAgIGNoYXIgX191c2VyICpvcHR2YWwsCisJCQkJICAgICBpbnQgb3B0bGVuKTsKICNlbmRpZgogfTsKIAogc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2tfb3BzIHsKIAl1MTYgbXNzX2NsYW1wOwogI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCi0Jc3RydWN0IHRjcF9tZDVzaWdfa2V5CSooKm1kNV9sb29rdXApIChzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpOwotCWludAkJCSgqY2FsY19tZDVfaGFzaCkgKGNoYXIgKmxvY2F0aW9uLAotCQkJCQkJICBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKm1kNSwKLQkJCQkJCSAgY29uc3Qgc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJICBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkJCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpOworCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqKCpyZXFfbWQ1X2xvb2t1cCkoc3RydWN0IHNvY2sgKnNrLAorCQkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrICphZGRyX3NrKTsKKwlpbnQJCSgqY2FsY19tZDVfaGFzaCkgKGNoYXIgKmxvY2F0aW9uLAorCQkJCQkgIGNvbnN0IHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqbWQ1LAorCQkJCQkgIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKICNlbmRpZgogCXZvaWQgKCppbml0X3JlcSkoc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLCBzdHJ1Y3Qgc29jayAqc2ssCiAJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y3Bfc3RhdGVzLmggYi9pbmNsdWRlL25ldC90Y3Bfc3RhdGVzLmgKaW5kZXggYjBiNjQ1OS4uNTBlNzhhNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwX3N0YXRlcy5oCisrKyBiL2luY2x1ZGUvbmV0L3RjcF9zdGF0ZXMuaApAQCAtMjUsNiArMjUsNyBAQAogCVRDUF9MQVNUX0FDSywKIAlUQ1BfTElTVEVOLAogCVRDUF9DTE9TSU5HLAkvKiBOb3cgYSB2YWxpZCBzdGF0ZSAqLworCVRDUF9ORVdfU1lOX1JFQ1YsCiAKIAlUQ1BfTUFYX1NUQVRFUwkvKiBMZWF2ZSBhdCB0aGUgZW5kISAqLwogfTsKQEAgLTQ0LDcgKzQ1LDggQEAKIAlUQ1BGX0NMT1NFX1dBSVQJID0gKDEgPDwgOCksCiAJVENQRl9MQVNUX0FDSwkgPSAoMSA8PCA5KSwKIAlUQ1BGX0xJU1RFTgkgPSAoMSA8PCAxMCksCi0JVENQRl9DTE9TSU5HCSA9ICgxIDw8IDExKSAKKwlUQ1BGX0NMT1NJTkcJID0gKDEgPDwgMTEpLAorCVRDUEZfTkVXX1NZTl9SRUNWID0gKDEgPDwgMTIpLAogfTsKIAogI2VuZGlmCS8qIF9MSU5VWF9UQ1BfU1RBVEVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3VkcC5oIGIvaW5jbHVkZS9uZXQvdWRwLmgKaW5kZXggMDdmOWI3MC4uNmQ0ZWQxOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdWRwLmgKKysrIGIvaW5jbHVkZS9uZXQvdWRwLmgKQEAgLTE5NCw2ICsxOTQsOCBAQAogCQkgICAgIGludCAoKikoY29uc3Qgc3RydWN0IHNvY2sgKiwgY29uc3Qgc3RydWN0IHNvY2sgKiksCiAJCSAgICAgdW5zaWduZWQgaW50IGhhc2gyX251bGxhZGRyKTsKIAordTMyIHVkcF9mbG93X2hhc2hybmQodm9pZCk7CisKIHN0YXRpYyBpbmxpbmUgX19iZTE2IHVkcF9mbG93X3NyY19wb3J0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICAgICAgaW50IG1pbiwgaW50IG1heCwgYm9vbCB1c2VfZXRoKQogewpAQCAtMjA1LDEyICsyMDcsMTkgQEAKIAl9CiAKIAloYXNoID0gc2tiX2dldF9oYXNoKHNrYik7Ci0JaWYgKHVubGlrZWx5KCFoYXNoKSAmJiB1c2VfZXRoKSB7Ci0JCS8qIENhbid0IGZpbmQgYSBub3JtYWwgaGFzaCwgY2FsbGVyIGhhcyBpbmRpY2F0ZWQgYW4gRXRoZXJuZXQKLQkJICogcGFja2V0IHNvIHVzZSB0aGF0IHRvIGNvbXB1dGUgYSBoYXNoLgotCQkgKi8KLQkJaGFzaCA9IGpoYXNoKHNrYi0+ZGF0YSwgMiAqIEVUSF9BTEVOLAotCQkJICAgICAoX19mb3JjZSB1MzIpIHNrYi0+cHJvdG9jb2wpOworCWlmICh1bmxpa2VseSghaGFzaCkpIHsKKwkJaWYgKHVzZV9ldGgpIHsKKwkJCS8qIENhbid0IGZpbmQgYSBub3JtYWwgaGFzaCwgY2FsbGVyIGhhcyBpbmRpY2F0ZWQgYW4KKwkJCSAqIEV0aGVybmV0IHBhY2tldCBzbyB1c2UgdGhhdCB0byBjb21wdXRlIGEgaGFzaC4KKwkJCSAqLworCQkJaGFzaCA9IGpoYXNoKHNrYi0+ZGF0YSwgMiAqIEVUSF9BTEVOLAorCQkJCSAgICAgKF9fZm9yY2UgdTMyKSBza2ItPnByb3RvY29sKTsKKwkJfSBlbHNlIHsKKwkJCS8qIENhbid0IGRlcml2ZSBhbnkgc29ydCBvZiBoYXNoIGZvciB0aGUgcGFja2V0LCBzZXQKKwkJCSAqIHRvIHNvbWUgY29uc2lzdGVudCByYW5kb20gdmFsdWUuCisJCQkgKi8KKwkJCWhhc2ggPSB1ZHBfZmxvd19oYXNocm5kKCk7CisJCX0KIAl9CiAKIAkvKiBTaW5jZSB0aGlzIGlzIGJlaW5nIHNlbnQgb24gdGhlIHdpcmUgb2JmdXNjYXRlIGhhc2ggYSBiaXQKQEAgLTIyOSw4ICsyMzgsNyBAQAogCQkgaW50ICgqc2FkZHJfY21wKShjb25zdCBzdHJ1Y3Qgc29jayAqLAogCQkJCSAgY29uc3Qgc3RydWN0IHNvY2sgKikpOwogdm9pZCB1ZHBfZXJyKHN0cnVjdCBza19idWZmICosIHUzMik7Ci1pbnQgdWRwX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJc2l6ZV90IGxlbik7CitpbnQgdWRwX3NlbmRtc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pOwogaW50IHVkcF9wdXNoX3BlbmRpbmdfZnJhbWVzKHN0cnVjdCBzb2NrICpzayk7CiB2b2lkIHVkcF9mbHVzaF9wZW5kaW5nX2ZyYW1lcyhzdHJ1Y3Qgc29jayAqc2spOwogdm9pZCB1ZHA0X2h3Y3N1bShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX2JlMzIgc3JjLCBfX2JlMzIgZHN0KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3VkcF90dW5uZWwuaCBiL2luY2x1ZGUvbmV0L3VkcF90dW5uZWwuaAppbmRleCAxYTIwZDMzLi5jNDkxYzEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC91ZHBfdHVubmVsLmgKKysrIGIvaW5jbHVkZS9uZXQvdWRwX3R1bm5lbC5oCkBAIC03NywxMyArNzcsMTQgQEAKIAkJCSAgIHN0cnVjdCB1ZHBfdHVubmVsX3NvY2tfY2ZnICpzb2NrX2NmZyk7CiAKIC8qIFRyYW5zbWl0IHRoZSBza2IgdXNpbmcgVURQIGVuY2Fwc3VsYXRpb24uICovCi1pbnQgdWRwX3R1bm5lbF94bWl0X3NrYihzdHJ1Y3QgcnRhYmxlICpydCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2ludCB1ZHBfdHVubmVsX3htaXRfc2tiKHN0cnVjdCBydGFibGUgKnJ0LCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQlfX2JlMzIgc3JjLCBfX2JlMzIgZHN0LCBfX3U4IHRvcywgX191OCB0dGwsCiAJCQlfX2JlMTYgZGYsIF9fYmUxNiBzcmNfcG9ydCwgX19iZTE2IGRzdF9wb3J0LAogCQkJYm9vbCB4bmV0LCBib29sIG5vY2hlY2spOwogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKLWludCB1ZHBfdHVubmVsNl94bWl0X3NrYihzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHN0cnVjdCBza19idWZmICpza2IsCitpbnQgdWRwX3R1bm5lbDZfeG1pdF9za2Ioc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLAogCQkJIHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCiAJCQkgX191OCBwcmlvLCBfX3U4IHR0bCwgX19iZTE2IHNyY19wb3J0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdnhsYW4uaCBiL2luY2x1ZGUvbmV0L3Z4bGFuLmgKaW5kZXggZWFiZDNhMC4uMDA4MmI1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdnhsYW4uaAorKysgYi9pbmNsdWRlL25ldC92eGxhbi5oCkBAIC05MSw2ICs5MSw3IEBACiAKICNkZWZpbmUgVlhMQU5fTl9WSUQgICAgICgxdSA8PCAyNCkKICNkZWZpbmUgVlhMQU5fVklEX01BU0sgIChWWExBTl9OX1ZJRCAtIDEpCisjZGVmaW5lIFZYTEFOX1ZOSV9NQVNLICAoVlhMQU5fVklEX01BU0sgPDwgOCkKICNkZWZpbmUgVlhMQU5fSExFTiAoc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICsgc2l6ZW9mKHN0cnVjdCB2eGxhbmhkcikpCiAKIHN0cnVjdCB2eGxhbl9tZXRhZGF0YSB7CkBAIC0xMzAsNyArMTMxLDcgQEAKICNkZWZpbmUgVlhMQU5fRl9HQlAJCQkweDgwMAogI2RlZmluZSBWWExBTl9GX1JFTUNTVU1fTk9QQVJUSUFMCTB4MTAwMAogCi0vKiBGbGFncyB0aGF0IGFyZSB1c2VkIGluIHRoZSByZWNlaXZlIHBhdGNoLiBUaGVzZSBmbGFncyBtdXN0IG1hdGNoIGluCisvKiBGbGFncyB0aGF0IGFyZSB1c2VkIGluIHRoZSByZWNlaXZlIHBhdGguIFRoZXNlIGZsYWdzIG11c3QgbWF0Y2ggaW4KICAqIG9yZGVyIGZvciBhIHNvY2tldCB0byBiZSBzaGFyZWFibGUKICAqLwogI2RlZmluZSBWWExBTl9GX1JDVl9GTEFHUwkJKFZYTEFOX0ZfR0JQIHwJCQlcCkBAIC0xNDQsNyArMTQ1LDcgQEAKIAogdm9pZCB2eGxhbl9zb2NrX3JlbGVhc2Uoc3RydWN0IHZ4bGFuX3NvY2sgKnZzKTsKIAotaW50IHZ4bGFuX3htaXRfc2tiKHN0cnVjdCBydGFibGUgKnJ0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IHZ4bGFuX3htaXRfc2tiKHN0cnVjdCBydGFibGUgKnJ0LCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgIF9fYmUzMiBzcmMsIF9fYmUzMiBkc3QsIF9fdTggdG9zLCBfX3U4IHR0bCwgX19iZTE2IGRmLAogCQkgICBfX2JlMTYgc3JjX3BvcnQsIF9fYmUxNiBkc3RfcG9ydCwgc3RydWN0IHZ4bGFuX21ldGFkYXRhICptZCwKIAkJICAgYm9vbCB4bmV0LCB1MzIgdnhmbGFncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC94ZnJtLmggYi9pbmNsdWRlL25ldC94ZnJtLmgKaW5kZXggZGM0ODY1ZS4uMzZhYzEwMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQveGZybS5oCisrKyBiL2luY2x1ZGUvbmV0L3hmcm0uaApAQCAtMTI2LDkgKzEyNiw3IEBACiAKIC8qIEZ1bGwgZGVzY3JpcHRpb24gb2Ygc3RhdGUgb2YgdHJhbnNmb3JtZXIuICovCiBzdHJ1Y3QgeGZybV9zdGF0ZSB7Ci0jaWZkZWYgQ09ORklHX05FVF9OUwotCXN0cnVjdCBuZXQJCSp4c19uZXQ7Ci0jZW5kaWYKKwlwb3NzaWJsZV9uZXRfdAkJeHNfbmV0OwogCXVuaW9uIHsKIAkJc3RydWN0IGhsaXN0X25vZGUJZ2NsaXN0OwogCQlzdHJ1Y3QgaGxpc3Rfbm9kZQlieWRzdDsKQEAgLTMzNCw3ICszMzIsNyBAQAogCWludAkJCSgqdG1wbF9zb3J0KShzdHJ1Y3QgeGZybV90bXBsICoqZHN0LCBzdHJ1Y3QgeGZybV90bXBsICoqc3JjLCBpbnQgbik7CiAJaW50CQkJKCpzdGF0ZV9zb3J0KShzdHJ1Y3QgeGZybV9zdGF0ZSAqKmRzdCwgc3RydWN0IHhmcm1fc3RhdGUgKipzcmMsIGludCBuKTsKIAlpbnQJCQkoKm91dHB1dCkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQlpbnQJCQkoKm91dHB1dF9maW5pc2gpKHN0cnVjdCBza19idWZmICpza2IpOworCWludAkJCSgqb3V0cHV0X2ZpbmlzaCkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlpbnQJCQkoKmV4dHJhY3RfaW5wdXQpKHN0cnVjdCB4ZnJtX3N0YXRlICp4LAogCQkJCQkJIHN0cnVjdCBza19idWZmICpza2IpOwogCWludAkJCSgqZXh0cmFjdF9vdXRwdXQpKHN0cnVjdCB4ZnJtX3N0YXRlICp4LApAQCAtNTIyLDkgKzUyMCw3IEBACiB9OwogCiBzdHJ1Y3QgeGZybV9wb2xpY3kgewotI2lmZGVmIENPTkZJR19ORVRfTlMKLQlzdHJ1Y3QgbmV0CQkqeHBfbmV0OwotI2VuZGlmCisJcG9zc2libGVfbmV0X3QJCXhwX25ldDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlieWRzdDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZQlieWlkeDsKIApAQCAtMTAyOSw3ICsxMDI1LDcgQEAKIAljYXNlIEFGX0lORVQ6CiAJCXJldHVybiBhZGRyLT5hNCA9PSAwOwogCWNhc2UgQUZfSU5FVDY6Ci0JCXJldHVybiBpcHY2X2FkZHJfYW55KChzdHJ1Y3QgaW42X2FkZHIgKikmYWRkci0+YTYpOworCQlyZXR1cm4gaXB2Nl9hZGRyX2FueSgmYWRkci0+aW42KTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMjQyLDggKzEyMzgsOCBAQAogCQltZW1jcHkoJmRhZGRyLT5hNCwgJmZsLT51LmlwNC5kYWRkciwgc2l6ZW9mKGRhZGRyLT5hNCkpOwogCQlicmVhazsKIAljYXNlIEFGX0lORVQ2OgotCQkqKHN0cnVjdCBpbjZfYWRkciAqKXNhZGRyLT5hNiA9IGZsLT51LmlwNi5zYWRkcjsKLQkJKihzdHJ1Y3QgaW42X2FkZHIgKilkYWRkci0+YTYgPSBmbC0+dS5pcDYuZGFkZHI7CisJCXNhZGRyLT5pbjYgPSBmbC0+dS5pcDYuc2FkZHI7CisJCWRhZGRyLT5pbjYgPSBmbC0+dS5pcDYuZGFkZHI7CiAJCWJyZWFrOwogCX0KIH0KQEAgLTE1MDcsNyArMTUwMyw3IEBACiBpbnQgeGZybV9pbnB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmV4dGhkciwgX19iZTMyIHNwaSwgaW50IGVuY2FwX3R5cGUpOwogaW50IHhmcm1faW5wdXRfcmVzdW1lKHN0cnVjdCBza19idWZmICpza2IsIGludCBuZXh0aGRyKTsKIGludCB4ZnJtX291dHB1dF9yZXN1bWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGVycik7Ci1pbnQgeGZybV9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgeGZybV9vdXRwdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCB4ZnJtX2lubmVyX2V4dHJhY3Rfb3V0cHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgeGZybV9sb2NhbF9lcnJvcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbXR1KTsKIGludCB4ZnJtNF9leHRyYWN0X2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTE1MjgsNyArMTUyNCw3IEBACiBpbnQgeGZybTRfZXh0cmFjdF9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpOwogaW50IHhmcm00X3ByZXBhcmVfb3V0cHV0KHN0cnVjdCB4ZnJtX3N0YXRlICp4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCB4ZnJtNF9vdXRwdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCB4ZnJtNF9vdXRwdXRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpOworaW50IHhmcm00X291dHB1dF9maW5pc2goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCB4ZnJtNF9yY3ZfY2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggcHJvdG9jb2wsIGludCBlcnIpOwogaW50IHhmcm00X3Byb3RvY29sX3JlZ2lzdGVyKHN0cnVjdCB4ZnJtNF9wcm90b2NvbCAqaGFuZGxlciwgdW5zaWduZWQgY2hhciBwcm90b2NvbCk7CiBpbnQgeGZybTRfcHJvdG9jb2xfZGVyZWdpc3RlcihzdHJ1Y3QgeGZybTRfcHJvdG9jb2wgKmhhbmRsZXIsIHVuc2lnbmVkIGNoYXIgcHJvdG9jb2wpOwpAQCAtMTU1Myw3ICsxNTQ5LDcgQEAKIGludCB4ZnJtNl9leHRyYWN0X291dHB1dChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBpbnQgeGZybTZfcHJlcGFyZV9vdXRwdXQoc3RydWN0IHhmcm1fc3RhdGUgKngsIHN0cnVjdCBza19idWZmICpza2IpOwogaW50IHhmcm02X291dHB1dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwotaW50IHhmcm02X291dHB1dF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYik7CitpbnQgeGZybTZfb3V0cHV0X2ZpbmlzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogaW50IHhmcm02X2ZpbmRfMXN0ZnJhZ29wdChzdHJ1Y3QgeGZybV9zdGF0ZSAqeCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgdTggKipwcmV2aGRyKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9yeHJwYy9wYWNrZXQuaCBiL2luY2x1ZGUvcnhycGMvcGFja2V0LmgKaW5kZXggZjI5MDJlZi4uNGRjZTExNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yeHJwYy9wYWNrZXQuaAorKysgYi9pbmNsdWRlL3J4cnBjL3BhY2tldC5oCkBAIC00Nyw3ICs0Nyw4IEBACiAjZGVmaW5lIFJYUlBDX1BBQ0tFVF9UWVBFX0NIQUxMRU5HRQk2CS8qIGNvbm5lY3Rpb24gc2VjdXJpdHkgY2hhbGxlbmdlIChTUlZSLT5DTE5UKSAqLwogI2RlZmluZSBSWFJQQ19QQUNLRVRfVFlQRV9SRVNQT05TRQk3CS8qIGNvbm5lY3Rpb24gc2VjdXRpdHkgcmVzcG9uc2UgKENMTlQtPlNSVlIpICovCiAjZGVmaW5lIFJYUlBDX1BBQ0tFVF9UWVBFX0RFQlVHCQk4CS8qIGRlYnVnIGluZm8gcmVxdWVzdCAqLwotI2RlZmluZSBSWFJQQ19OX1BBQ0tFVF9UWVBFUwkJOQkvKiBudW1iZXIgb2YgcGFja2V0IHR5cGVzIChpbmNsIHR5cGUgMCkgKi8KKyNkZWZpbmUgUlhSUENfUEFDS0VUX1RZUEVfVkVSU0lPTgkxMwkvKiB2ZXJzaW9uIHN0cmluZyByZXF1ZXN0ICovCisjZGVmaW5lIFJYUlBDX05fUEFDS0VUX1RZUEVTCQkxNAkvKiBudW1iZXIgb2YgcGFja2V0IHR5cGVzIChpbmNsIHR5cGUgMCkgKi8KIAogCXVpbnQ4X3QJCWZsYWdzOwkJLyogcGFja2V0IGZsYWdzICovCiAjZGVmaW5lIFJYUlBDX0NMSUVOVF9JTklUSUFURUQJMHgwMQkJLyogc2lnbmlmaWVzIGEgcGFja2V0IGdlbmVyYXRlZCBieSBhIGNsaWVudCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL3Njc2lfZWguaCBiL2luY2x1ZGUvc2NzaS9zY3NpX2VoLmgKaW5kZXggMWUxNDIxYi4uNWE0YmI1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL3Njc2lfZWguaAorKysgYi9pbmNsdWRlL3Njc2kvc2NzaV9laC5oCkBAIC01OSw2ICs1OSw3IEBACiAJCQkJICAgdTY0ICogaW5mb19vdXQpOwogCiBleHRlcm4gdm9pZCBzY3NpX2J1aWxkX3NlbnNlX2J1ZmZlcihpbnQgZGVzYywgdTggKmJ1ZiwgdTgga2V5LCB1OCBhc2MsIHU4IGFzY3EpOworZXh0ZXJuIHZvaWQgc2NzaV9zZXRfc2Vuc2VfaW5mb3JtYXRpb24odTggKmJ1ZiwgdTY0IGluZm8pOwogCiBleHRlcm4gaW50IHNjc2lfaW9jdGxfcmVzZXQoc3RydWN0IHNjc2lfZGV2aWNlICosIGludCBfX3VzZXIgKik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvYWM5N19jb2RlYy5oIGIvaW5jbHVkZS9zb3VuZC9hYzk3X2NvZGVjLmgKaW5kZXggZDMxNWEwOC4uMGU5ZDc1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9hYzk3X2NvZGVjLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9hYzk3X2NvZGVjLmgKQEAgLTYwOCw3ICs2MDgsOSBAQAogCWludCB0eXBlOwkJLyogcXVpcmsgdHlwZSBhYm92ZSAqLwogfTsKIAotaW50IHNuZF9hYzk3X3R1bmVfaGFyZHdhcmUoc3RydWN0IHNuZF9hYzk3ICphYzk3LCBzdHJ1Y3QgYWM5N19xdWlyayAqcXVpcmssIGNvbnN0IGNoYXIgKm92ZXJyaWRlKTsKK2ludCBzbmRfYWM5N190dW5lX2hhcmR3YXJlKHN0cnVjdCBzbmRfYWM5NyAqYWM5NywKKwkJCSAgIGNvbnN0IHN0cnVjdCBhYzk3X3F1aXJrICpxdWlyaywKKwkJCSAgIGNvbnN0IGNoYXIgKm92ZXJyaWRlKTsKIGludCBzbmRfYWM5N19zZXRfcmF0ZShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIGludCByZWcsIHVuc2lnbmVkIGludCByYXRlKTsKIAogLyoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY29tcHJlc3NfZHJpdmVyLmggYi9pbmNsdWRlL3NvdW5kL2NvbXByZXNzX2RyaXZlci5oCmluZGV4IGY0ODA4OWQuLmZhMWQwNTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvY29tcHJlc3NfZHJpdmVyLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jb21wcmVzc19kcml2ZXIuaApAQCAtNzAsNyArNzAsNyBAQAogICogQGRldmljZTogZGV2aWNlIHBvaW50ZXIKICAqIEBkaXJlY3Rpb246IHN0cmVhbSBkaXJlY3Rpb24sIHBsYXliYWNrL3JlY29yZGluZwogICogQG1ldGFkYXRhX3NldDogbWV0YWRhdGEgc2V0IGZsYWcsIHRydWUgd2hlbiBzZXQKLSAqIEBuZXh0X3RyYWNrOiBoYXMgdXNlcnNwYWNlIHNpZ25hbGwgbmV4dCB0cmFjayB0cmFuc2lzdGlvbiwgdHJ1ZSB3aGVuIHNldAorICogQG5leHRfdHJhY2s6IGhhcyB1c2Vyc3BhY2Ugc2lnbmFsIG5leHQgdHJhY2sgdHJhbnNpdGlvbiwgdHJ1ZSB3aGVuIHNldAogICogQHByaXZhdGVfZGF0YTogcG9pbnRlciB0byBEU1AgcHJpdmF0ZSBkYXRhCiAgKi8KIHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtIHsKQEAgLTk1LDcgKzk1LDcgQEAKICAqIGFuZCB0aGUgc3RyZWFtIHByb3BlcnRpZXMKICAqIEBnZXRfcGFyYW1zOiByZXRyaWV2ZSB0aGUgY29kZWMgcGFyYW1ldGVycywgbWFuZGF0b3J5CiAgKiBAc2V0X21ldGFkYXRhOiBTZXQgdGhlIG1ldGFkYXRhIHZhbHVlcyBmb3IgYSBzdHJlYW0KLSAqIEBnZXRfbWV0YWRhdGE6IHJldHJlaXZlcyB0aGUgcmVxdWVzdGVkIG1ldGFkYXRhIHZhbHVlcyBmcm9tIHN0cmVhbQorICogQGdldF9tZXRhZGF0YTogcmV0cmlldmVzIHRoZSByZXF1ZXN0ZWQgbWV0YWRhdGEgdmFsdWVzIGZyb20gc3RyZWFtCiAgKiBAdHJpZ2dlcjogVHJpZ2dlciBvcGVyYXRpb25zIGxpa2Ugc3RhcnQsIHBhdXNlLCByZXN1bWUsIGRyYWluLCBzdG9wLgogICogVGhpcyBjYWxsYmFjayBpcyBtYW5kYXRvcnkKICAqIEBwb2ludGVyOiBSZXRyaWV2ZSBjdXJyZW50IGgvdyBwb2ludGVyIGluZm9ybWF0aW9uLiBNYW5kYXRvcnkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY29udHJvbC5oIGIvaW5jbHVkZS9zb3VuZC9jb250cm9sLmgKaW5kZXggNzVmMzA1NC4uOTVhYWQ2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9jb250cm9sLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jb250cm9sLmgKQEAgLTIyNyw3ICsyMjcsNyBAQAogICogQWRkIGEgdmlydHVhbCBzbGF2ZSBjb250cm9sIHRvIHRoZSBnaXZlbiBtYXN0ZXIuCiAgKiBVbmxpa2Ugc25kX2N0bF9hZGRfc2xhdmUoKSwgdGhlIGVsZW1lbnQgYWRkZWQgdmlhIHRoaXMgZnVuY3Rpb24KICAqIGlzIHN1cHBvc2VkIHRvIGhhdmUgdm9sYXRpbGUgdmFsdWVzLCBhbmQgZ2V0IGNhbGxiYWNrIGlzIGNhbGxlZAotICogYXQgZWFjaCB0aW1lIHF1cmllZCBmcm9tIHRoZSBtYXN0ZXIuCisgKiBhdCBlYWNoIHRpbWUgcXVlcmllZCBmcm9tIHRoZSBtYXN0ZXIuCiAgKgogICogV2hlbiB0aGUgY29udHJvbCBwZWVrcyB0aGUgaGFyZHdhcmUgdmFsdWVzIGRpcmVjdGx5IGFuZCB0aGUgdmFsdWUKICAqIGNhbiBiZSBjaGFuZ2VkIGJ5IG90aGVyIG1lYW5zIHRoYW4gdGhlIHB1dCBjYWxsYmFjayBvZiB0aGUgZWxlbWVudCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvY29yZS5oIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKaW5kZXggZGE1NzQ4Mi4uYjEyOTMxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9jb3JlLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9jb3JlLmgKQEAgLTI3OCw3ICsyNzgsOCBAQAogCQkgICB2b2lkICpkZXZpY2VfZGF0YSwgc3RydWN0IHNuZF9kZXZpY2Vfb3BzICpvcHMpOwogaW50IHNuZF9kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IHNuZF9jYXJkICpjYXJkLCB2b2lkICpkZXZpY2VfZGF0YSk7CiBpbnQgc25kX2RldmljZV9yZWdpc3Rlcl9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKTsKLWludCBzbmRfZGV2aWNlX2Rpc2Nvbm5lY3RfYWxsKHN0cnVjdCBzbmRfY2FyZCAqY2FyZCk7Cit2b2lkIHNuZF9kZXZpY2VfZGlzY29ubmVjdChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHZvaWQgKmRldmljZV9kYXRhKTsKK3ZvaWQgc25kX2RldmljZV9kaXNjb25uZWN0X2FsbChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpOwogdm9pZCBzbmRfZGV2aWNlX2ZyZWUoc3RydWN0IHNuZF9jYXJkICpjYXJkLCB2b2lkICpkZXZpY2VfZGF0YSk7CiB2b2lkIHNuZF9kZXZpY2VfZnJlZV9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9oZGFfcmVnbWFwLmggYi9pbmNsdWRlL3NvdW5kL2hkYV9yZWdtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2ExOGIzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9zb3VuZC9oZGFfcmVnbWFwLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBIRC1hdWRpbyByZWdtYXAgaGVscGVycworICovCisKKyNpZm5kZWYgX19TT1VORF9IREFfUkVHTUFQX0gKKyNkZWZpbmUgX19TT1VORF9IREFfUkVHTUFQX0gKKworI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9oZGF1ZGlvLmg+CisKK2ludCBzbmRfaGRhY19yZWdtYXBfaW5pdChzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKTsKK3ZvaWQgc25kX2hkYWNfcmVnbWFwX2V4aXQoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYyk7CitpbnQgc25kX2hkYWNfcmVnbWFwX2FkZF92ZW5kb3JfdmVyYihzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgdmVyYik7CitpbnQgc25kX2hkYWNfcmVnbWFwX3JlYWRfcmF3KHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJCQkgICAgIHVuc2lnbmVkIGludCAqdmFsKTsKK2ludCBzbmRfaGRhY19yZWdtYXBfd3JpdGVfcmF3KHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgdmFsKTsKK2ludCBzbmRfaGRhY19yZWdtYXBfdXBkYXRlX3JhdyhzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsKTsKKworLyoqCisgKiBzbmRfaGRhY19yZWdtYXBfZW5jb2RlX3ZlcmIgLSBlbmNvZGUgdGhlIHZlcmIgdG8gYSBwc2V1ZG8gcmVnaXN0ZXIKKyAqIEBuaWQ6IHdpZGdldCBOSUQKKyAqIEB2ZXJiOiBjb2RlYyB2ZXJiCisgKgorICogUmV0dXJucyBhbiBlbmNvZGVkIHBzZXVkbyByZWdpc3Rlci4KKyAqLworI2RlZmluZSBzbmRfaGRhY19yZWdtYXBfZW5jb2RlX3ZlcmIobmlkLCB2ZXJiKQkJXAorCSgoKHZlcmIpIDw8IDgpIHwgMHg4MDAwMCB8ICgodW5zaWduZWQgaW50KShuaWQpIDw8IDIwKSkKKworLyoqCisgKiBzbmRfaGRhY19yZWdtYXBfZW5jb2RlX2FtcCAtIGVuY29kZSB0aGUgQU1QIHZlcmIgdG8gYSBwc2V1ZG8gcmVnaXN0ZXIKKyAqIEBuaWQ6IHdpZGdldCBOSUQKKyAqIEBjaDogY2hhbm5lbCAobGVmdCA9IDAsIHJpZ2h0ID0gMSkKKyAqIEBkaXI6IGRpcmVjdGlvbiAoI0hEQV9JTlBVVCwgI0hEQV9PVVRQVVQpCisgKiBAaWR4OiBpbnB1dCBpbmRleCB2YWx1ZQorICoKKyAqIFJldHVybnMgYW4gZW5jb2RlZCBwc2V1ZG8gcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgc25kX2hkYWNfcmVnbWFwX2VuY29kZV9hbXAobmlkLCBjaCwgZGlyLCBpZHgpCQkJXAorCShzbmRfaGRhY19yZWdtYXBfZW5jb2RlX3ZlcmIobmlkLCBBQ19WRVJCX0dFVF9BTVBfR0FJTl9NVVRFKSB8CVwKKwkgKChjaCkgPyBBQ19BTVBfR0VUX1JJR0hUIDogQUNfQU1QX0dFVF9MRUZUKSB8CQkJXAorCSAoKGRpcikgPT0gSERBX09VVFBVVCA/IEFDX0FNUF9HRVRfT1VUUFVUIDogQUNfQU1QX0dFVF9JTlBVVCkgfCBcCisJIChpZHgpKQorCisvKioKKyAqIHNuZF9oZGFjX3JlZ21hcF9lbmNvZGVfYW1wX3N0ZXJlbyAtIGVuY29kZSBhIHBzZXVkbyByZWdpc3RlciBmb3Igc3RlcmVvIEFNUHMKKyAqIEBuaWQ6IHdpZGdldCBOSUQKKyAqIEBkaXI6IGRpcmVjdGlvbiAoI0hEQV9JTlBVVCwgI0hEQV9PVVRQVVQpCisgKiBAaWR4OiBpbnB1dCBpbmRleCB2YWx1ZQorICoKKyAqIFJldHVybnMgYW4gZW5jb2RlZCBwc2V1ZG8gcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgc25kX2hkYWNfcmVnbWFwX2VuY29kZV9hbXBfc3RlcmVvKG5pZCwgZGlyLCBpZHgpCQlcCisJKHNuZF9oZGFjX3JlZ21hcF9lbmNvZGVfdmVyYihuaWQsIEFDX1ZFUkJfR0VUX0FNUF9HQUlOX01VVEUpIHwJXAorCSBBQ19BTVBfU0VUX0xFRlQgfCBBQ19BTVBfU0VUX1JJR0hUIHwgLyogYm90aCBiaXRzIHNldCEgKi8JXAorCSAoKGRpcikgPT0gSERBX09VVFBVVCA/IEFDX0FNUF9HRVRfT1VUUFVUIDogQUNfQU1QX0dFVF9JTlBVVCkgfCBcCisJIChpZHgpKQorCisvKioKKyAqIHNuZF9oZGFjX3JlZ21hcF93cml0ZSAtIFdyaXRlIGEgdmVyYiB3aXRoIGNhY2hpbmcKKyAqIEBuaWQ6IGNvZGVjIE5JRAorICogQHJlZzogdmVyYiB0byB3cml0ZQorICogQHZhbDogdmFsdWUgdG8gd3JpdGUKKyAqCisgKiBGb3Igd3JpdGluZyBhbiBhbXAgdmFsdWUsIHVzZSBzbmRfaGRhX3JlZ21hcF9hbXBfdXBkYXRlKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzbmRfaGRhY19yZWdtYXBfd3JpdGUoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJICAgICAgdW5zaWduZWQgaW50IHZlcmIsIHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IGNtZCA9IHNuZF9oZGFjX3JlZ21hcF9lbmNvZGVfdmVyYihuaWQsIHZlcmIpOworCisJcmV0dXJuIHNuZF9oZGFjX3JlZ21hcF93cml0ZV9yYXcoY29kZWMsIGNtZCwgdmFsKTsKK30KKworLyoqCisgKiBzbmRfaGRhX3JlZ21hcF91cGRhdGUgLSBVcGRhdGUgYSB2ZXJiIHZhbHVlIHdpdGggY2FjaGluZworICogQG5pZDogY29kZWMgTklECisgKiBAdmVyYjogdmVyYiB0byB1cGRhdGUKKyAqIEBtYXNrOiBiaXQgbWFzayB0byB1cGRhdGUKKyAqIEB2YWw6IHZhbHVlIHRvIHVwZGF0ZQorICoKKyAqIEZvciB1cGRhdGluZyBhbiBhbXAgdmFsdWUsIHVzZSBzbmRfaGRhX3JlZ21hcF9hbXBfdXBkYXRlKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzbmRfaGRhY19yZWdtYXBfdXBkYXRlKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IG1hc2ssCisJCSAgICAgICB1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGludCBjbWQgPSBzbmRfaGRhY19yZWdtYXBfZW5jb2RlX3ZlcmIobmlkLCB2ZXJiKTsKKworCXJldHVybiBzbmRfaGRhY19yZWdtYXBfdXBkYXRlX3Jhdyhjb2RlYywgY21kLCBtYXNrLCB2YWwpOworfQorCisvKioKKyAqIHNuZF9oZGFfcmVnbWFwX3JlYWQgLSBSZWFkIGEgdmVyYiB3aXRoIGNhY2hpbmcKKyAqIEBuaWQ6IGNvZGVjIE5JRAorICogQHZlcmI6IHZlcmIgdG8gcmVhZAorICogQHZhbDogcG9pbnRlciB0byBzdG9yZSB0aGUgdmFsdWUKKyAqCisgKiBGb3IgcmVhZGluZyBhbiBhbXAgdmFsdWUsIHVzZSBzbmRfaGRhX3JlZ21hcF9nZXRfYW1wKCkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzbmRfaGRhY19yZWdtYXBfcmVhZChzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkgICAgIHVuc2lnbmVkIGludCB2ZXJiLCB1bnNpZ25lZCBpbnQgKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgY21kID0gc25kX2hkYWNfcmVnbWFwX2VuY29kZV92ZXJiKG5pZCwgdmVyYik7CisKKwlyZXR1cm4gc25kX2hkYWNfcmVnbWFwX3JlYWRfcmF3KGNvZGVjLCBjbWQsIHZhbCk7Cit9CisKKy8qKgorICogc25kX2hkYWNfcmVnbWFwX2dldF9hbXAgLSBSZWFkIEFNUCB2YWx1ZQorICogQGNvZGVjOiBIRC1hdWRpbyBjb2RlYworICogQG5pZDogTklEIHRvIHJlYWQgdGhlIEFNUCB2YWx1ZQorICogQGNoOiBjaGFubmVsIChsZWZ0PTAgb3IgcmlnaHQ9MSkKKyAqIEBkaXJlY3Rpb246ICNIREFfSU5QVVQgb3IgI0hEQV9PVVRQVVQKKyAqIEBpbmRleDogdGhlIGluZGV4IHZhbHVlIChvbmx5IGZvciBpbnB1dCBkaXJlY3Rpb24pCisgKiBAdmFsOiB0aGUgcG9pbnRlciB0byBzdG9yZSB0aGUgdmFsdWUKKyAqCisgKiBSZWFkIEFNUCB2YWx1ZS4gIFRoZSB2b2x1bWUgaXMgYmV0d2VlbiAwIHRvIDB4N2YsIDB4ODAgPSBtdXRlIGJpdC4KKyAqIFJldHVybnMgdGhlIHZhbHVlIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzbmRfaGRhY19yZWdtYXBfZ2V0X2FtcChzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJaW50IGNoLCBpbnQgZGlyLCBpbnQgaWR4KQoreworCXVuc2lnbmVkIGludCBjbWQgPSBzbmRfaGRhY19yZWdtYXBfZW5jb2RlX2FtcChuaWQsIGNoLCBkaXIsIGlkeCk7CisJaW50IGVyciwgdmFsOworCisJZXJyID0gc25kX2hkYWNfcmVnbWFwX3JlYWRfcmF3KGNvZGVjLCBjbWQsICZ2YWwpOworCXJldHVybiBlcnIgPCAwID8gZXJyIDogdmFsOworfQorCisvKioKKyAqIHNuZF9oZGFjX3JlZ21hcF91cGRhdGVfYW1wIC0gdXBkYXRlIHRoZSBBTVAgdmFsdWUKKyAqIEBjb2RlYzogSEQtYXVkaW8gY29kZWMKKyAqIEBuaWQ6IE5JRCB0byByZWFkIHRoZSBBTVAgdmFsdWUKKyAqIEBjaDogY2hhbm5lbCAobGVmdD0wIG9yIHJpZ2h0PTEpCisgKiBAZGlyZWN0aW9uOiAjSERBX0lOUFVUIG9yICNIREFfT1VUUFVUCisgKiBAaWR4OiB0aGUgaW5kZXggdmFsdWUgKG9ubHkgZm9yIGlucHV0IGRpcmVjdGlvbikKKyAqIEBtYXNrOiBiaXQgbWFzayB0byBzZXQKKyAqIEB2YWw6IHRoZSBiaXRzIHZhbHVlIHRvIHNldAorICoKKyAqIFVwZGF0ZSB0aGUgQU1QIHZhbHVlIHdpdGggYSBiaXQgbWFzay4KKyAqIFJldHVybnMgMCBpZiB0aGUgdmFsdWUgaXMgdW5jaGFuZ2VkLCAxIGlmIGNoYW5nZWQsIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitzbmRfaGRhY19yZWdtYXBfdXBkYXRlX2FtcChzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJICAgaW50IGNoLCBpbnQgZGlyLCBpbnQgaWR4LCBpbnQgbWFzaywgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgY21kID0gc25kX2hkYWNfcmVnbWFwX2VuY29kZV9hbXAobmlkLCBjaCwgZGlyLCBpZHgpOworCisJcmV0dXJuIHNuZF9oZGFjX3JlZ21hcF91cGRhdGVfcmF3KGNvZGVjLCBjbWQsIG1hc2ssIHZhbCk7Cit9CisKKy8qKgorICogc25kX2hkYWNfcmVnbWFwX2dldF9hbXBfc3RlcmVvIC0gUmVhZCBzdGVyZW8gQU1QIHZhbHVlcworICogQGNvZGVjOiBIRC1hdWRpbyBjb2RlYworICogQG5pZDogTklEIHRvIHJlYWQgdGhlIEFNUCB2YWx1ZQorICogQGNoOiBjaGFubmVsIChsZWZ0PTAgb3IgcmlnaHQ9MSkKKyAqIEBkaXJlY3Rpb246ICNIREFfSU5QVVQgb3IgI0hEQV9PVVRQVVQKKyAqIEBpbmRleDogdGhlIGluZGV4IHZhbHVlIChvbmx5IGZvciBpbnB1dCBkaXJlY3Rpb24pCisgKiBAdmFsOiB0aGUgcG9pbnRlciB0byBzdG9yZSB0aGUgdmFsdWUKKyAqCisgKiBSZWFkIHN0ZXJlbyBBTVAgdmFsdWVzLiAgVGhlIGxvd2VyIGJ5dGUgaXMgbGVmdCwgdGhlIHVwcGVyIGJ5dGUgaXMgcmlnaHQuCisgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvciBhIG5lZ2F0aXZlIGVycm9yLgorICovCitzdGF0aWMgaW5saW5lIGludAorc25kX2hkYWNfcmVnbWFwX2dldF9hbXBfc3RlcmVvKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgICAgICAgaW50IGRpciwgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBpbnQgY21kID0gc25kX2hkYWNfcmVnbWFwX2VuY29kZV9hbXBfc3RlcmVvKG5pZCwgZGlyLCBpZHgpOworCWludCBlcnIsIHZhbDsKKworCWVyciA9IHNuZF9oZGFjX3JlZ21hcF9yZWFkX3Jhdyhjb2RlYywgY21kLCAmdmFsKTsKKwlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IHZhbDsKK30KKworLyoqCisgKiBzbmRfaGRhY19yZWdtYXBfdXBkYXRlX2FtcF9zdGVyZW8gLSB1cGRhdGUgdGhlIHN0ZXJlbyBBTVAgdmFsdWUKKyAqIEBjb2RlYzogSEQtYXVkaW8gY29kZWMKKyAqIEBuaWQ6IE5JRCB0byByZWFkIHRoZSBBTVAgdmFsdWUKKyAqIEBkaXJlY3Rpb246ICNIREFfSU5QVVQgb3IgI0hEQV9PVVRQVVQKKyAqIEBpZHg6IHRoZSBpbmRleCB2YWx1ZSAob25seSBmb3IgaW5wdXQgZGlyZWN0aW9uKQorICogQG1hc2s6IGJpdCBtYXNrIHRvIHNldAorICogQHZhbDogdGhlIGJpdHMgdmFsdWUgdG8gc2V0CisgKgorICogVXBkYXRlIHRoZSBzdGVyZW8gQU1QIHZhbHVlIHdpdGggYSBiaXQgbWFzay4KKyAqIFRoZSBsb3dlciBieXRlIGlzIGxlZnQsIHRoZSB1cHBlciBieXRlIGlzIHJpZ2h0LgorICogUmV0dXJucyAwIGlmIHRoZSB2YWx1ZSBpcyB1bmNoYW5nZWQsIDEgaWYgY2hhbmdlZCwgb3IgYSBuZWdhdGl2ZSBlcnJvci4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK3NuZF9oZGFjX3JlZ21hcF91cGRhdGVfYW1wX3N0ZXJlbyhzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJCSAgaW50IGRpciwgaW50IGlkeCwgaW50IG1hc2ssIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IGNtZCA9IHNuZF9oZGFjX3JlZ21hcF9lbmNvZGVfYW1wX3N0ZXJlbyhuaWQsIGRpciwgaWR4KTsKKworCXJldHVybiBzbmRfaGRhY19yZWdtYXBfdXBkYXRlX3Jhdyhjb2RlYywgY21kLCBtYXNrLCB2YWwpOworfQorCisvKioKKyAqIHNuZF9oZGFjX3JlZ21hcF9zeW5jX25vZGUgLSBzeW5jIHRoZSB3aWRnZXQgbm9kZSBhdHRyaWJ1dGVzCisgKiBAY29kZWM6IEhELWF1ZGlvIGNvZGVjCisgKiBAbmlkOiBOSUQgdG8gc3luYworICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3NuZF9oZGFjX3JlZ21hcF9zeW5jX25vZGUoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCkKK3sKKwlyZWdjYWNoZV9tYXJrX2RpcnR5KGNvZGVjLT5yZWdtYXApOworCXJlZ2NhY2hlX3N5bmNfcmVnaW9uKGNvZGVjLT5yZWdtYXAsIG5pZCA8PCAyMCwgKChuaWQgKyAxKSA8PCAyMCkgLSAxKTsKK30KKworI2VuZGlmIC8qIF9fU09VTkRfSERBX1JFR01BUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL2hkYXVkaW8uaCBiL2luY2x1ZGUvc291bmQvaGRhdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOGFhOWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NvdW5kL2hkYXVkaW8uaApAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIEhELWF1ZGlvIGNvcmUgc3R1ZmYKKyAqLworCisjaWZuZGVmIF9fU09VTkRfSERBVURJT19ICisjZGVmaW5lIF9fU09VTkRfSERBVURJT19ICisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9oZGFfdmVyYnMuaD4KKworLyogY29kZWMgbm9kZSBpZCAqLwordHlwZWRlZiB1MTYgaGRhX25pZF90OworCitzdHJ1Y3QgaGRhY19idXM7CitzdHJ1Y3QgaGRhY19kZXZpY2U7CitzdHJ1Y3QgaGRhY19kcml2ZXI7CitzdHJ1Y3QgaGRhY193aWRnZXRfdHJlZTsKKworLyoKKyAqIGV4cG9ydGVkIGJ1cyB0eXBlCisgKi8KK2V4dGVybiBzdHJ1Y3QgYnVzX3R5cGUgc25kX2hkYV9idXNfdHlwZTsKKworLyoKKyAqIGdlbmVyaWMgYXJyYXlzCisgKi8KK3N0cnVjdCBzbmRfYXJyYXkgeworCXVuc2lnbmVkIGludCB1c2VkOworCXVuc2lnbmVkIGludCBhbGxvY2VkOworCXVuc2lnbmVkIGludCBlbGVtX3NpemU7CisJdW5zaWduZWQgaW50IGFsbG9jX2FsaWduOworCXZvaWQgKmxpc3Q7Cit9OworCisvKgorICogSEQtYXVkaW8gY29kZWMgYmFzZSBkZXZpY2UKKyAqLworc3RydWN0IGhkYWNfZGV2aWNlIHsKKwlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlpbnQgdHlwZTsKKwlzdHJ1Y3QgaGRhY19idXMgKmJ1czsKKwl1bnNpZ25lZCBpbnQgYWRkcjsJCS8qIGNvZGVjIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBsaXN0IHBvaW50IGZvciBidXMgY29kZWNfbGlzdCAqLworCisJaGRhX25pZF90IGFmZzsJCQkvKiBBRkcgbm9kZSBpZCAqLworCWhkYV9uaWRfdCBtZmc7CQkJLyogTUZHIG5vZGUgaWQgKi8KKworCS8qIGlkcyAqLworCXVuc2lnbmVkIGludCB2ZW5kb3JfaWQ7CisJdW5zaWduZWQgaW50IHN1YnN5c3RlbV9pZDsKKwl1bnNpZ25lZCBpbnQgcmV2aXNpb25faWQ7CisJdW5zaWduZWQgaW50IGFmZ19mdW5jdGlvbl9pZDsKKwl1bnNpZ25lZCBpbnQgbWZnX2Z1bmN0aW9uX2lkOworCXVuc2lnbmVkIGludCBhZmdfdW5zb2w6MTsKKwl1bnNpZ25lZCBpbnQgbWZnX3Vuc29sOjE7CisKKwl1bnNpZ25lZCBpbnQgcG93ZXJfY2FwczsJLyogRkcgcG93ZXIgY2FwcyAqLworCisJY29uc3QgY2hhciAqdmVuZG9yX25hbWU7CS8qIGNvZGVjIHZlbmRvciBuYW1lICovCisJY29uc3QgY2hhciAqY2hpcF9uYW1lOwkJLyogY29kZWMgY2hpcCBuYW1lICovCisKKwkvKiB2ZXJiIGV4ZWMgb3Agb3ZlcnJpZGUgKi8KKwlpbnQgKCpleGVjX3ZlcmIpKHN0cnVjdCBoZGFjX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLAorCQkJIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50ICpyZXMpOworCisJLyogd2lkZ2V0cyAqLworCXVuc2lnbmVkIGludCBudW1fbm9kZXM7CisJaGRhX25pZF90IHN0YXJ0X25pZCwgZW5kX25pZDsKKworCS8qIG1pc2MgZmxhZ3MgKi8KKwlhdG9taWNfdCBpbl9wbTsJCS8qIHN1c3BlbmQvcmVzdW1lIGJlaW5nIHBlcmZvcm1lZCAqLworCisJLyogc3lzZnMgKi8KKwlzdHJ1Y3QgaGRhY193aWRnZXRfdHJlZSAqd2lkZ2V0czsKKworCS8qIHJlZ21hcCAqLworCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKKwlzdHJ1Y3Qgc25kX2FycmF5IHZlbmRvcl92ZXJiczsKKwlib29sIGxhenlfY2FjaGU6MTsJLyogZG9uJ3Qgd2FrZSB1cCBmb3Igd3JpdGVzICovCisJYm9vbCBjYXBzX292ZXJ3cml0aW5nOjE7IC8qIGNhcHMgb3ZlcndyaXRlIGJlaW5nIGluIHByb2Nlc3MgKi8KKwlib29sIGNhY2hlX2NvZWY6MTsJLyogY2FjaGUgQ09FRiByZWFkL3dyaXRlIHRvbyAqLworfTsKKworLyogZGV2aWNlL2RyaXZlciB0eXBlIHVzZWQgZm9yIG1hdGNoaW5nICovCitlbnVtIHsKKwlIREFfREVWX0NPUkUsCisJSERBX0RFVl9MRUdBQ1ksCit9OworCisvKiBkaXJlY3Rpb24gKi8KK2VudW0geworCUhEQV9JTlBVVCwgSERBX09VVFBVVAorfTsKKworI2RlZmluZSBkZXZfdG9faGRhY19kZXYoX2RldikJY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBoZGFjX2RldmljZSwgZGV2KQorCitpbnQgc25kX2hkYWNfZGV2aWNlX2luaXQoc3RydWN0IGhkYWNfZGV2aWNlICpkZXYsIHN0cnVjdCBoZGFjX2J1cyAqYnVzLAorCQkJIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBhZGRyKTsKK3ZvaWQgc25kX2hkYWNfZGV2aWNlX2V4aXQoc3RydWN0IGhkYWNfZGV2aWNlICpkZXYpOworaW50IHNuZF9oZGFjX2RldmljZV9yZWdpc3RlcihzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKTsKK3ZvaWQgc25kX2hkYWNfZGV2aWNlX3VucmVnaXN0ZXIoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYyk7CisKK2ludCBzbmRfaGRhY19yZWZyZXNoX3dpZGdldHMoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYyk7CisKK3Vuc2lnbmVkIGludCBzbmRfaGRhY19tYWtlX2NtZChzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJICAgICAgIHVuc2lnbmVkIGludCB2ZXJiLCB1bnNpZ25lZCBpbnQgcGFybSk7CitpbnQgc25kX2hkYWNfZXhlY192ZXJiKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIHVuc2lnbmVkIGludCAqcmVzKTsKK2ludCBzbmRfaGRhY19yZWFkKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCSAgdW5zaWduZWQgaW50IHZlcmIsIHVuc2lnbmVkIGludCBwYXJtLCB1bnNpZ25lZCBpbnQgKnJlcyk7CitpbnQgX3NuZF9oZGFjX3JlYWRfcGFybShzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBpbnQgcGFybSwKKwkJCXVuc2lnbmVkIGludCAqcmVzKTsKK2ludCBzbmRfaGRhY19yZWFkX3Bhcm1fdW5jYWNoZWQoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCQlpbnQgcGFybSk7CitpbnQgc25kX2hkYWNfb3ZlcnJpZGVfcGFybShzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJICAgdW5zaWduZWQgaW50IHBhcm0sIHVuc2lnbmVkIGludCB2YWwpOworaW50IHNuZF9oZGFjX2dldF9jb25uZWN0aW9ucyhzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJICAgICBoZGFfbmlkX3QgKmNvbm5fbGlzdCwgaW50IG1heF9jb25ucyk7CitpbnQgc25kX2hkYWNfZ2V0X3N1Yl9ub2RlcyhzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJICAgaGRhX25pZF90ICpzdGFydF9pZCk7CisKKy8qKgorICogc25kX2hkYWNfcmVhZF9wYXJtIC0gcmVhZCBhIGNvZGVjIHBhcmFtZXRlcgorICogQGNvZGVjOiB0aGUgY29kZWMgb2JqZWN0CisgKiBAbmlkOiBOSUQgdG8gcmVhZCBhIHBhcmFtZXRlcgorICogQHBhcm06IHBhcmFtZXRlciB0byByZWFkCisgKgorICogUmV0dXJucyAtMSBmb3IgZXJyb3IuICBJZiB5b3UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGUgZXJyb3IgbW9yZQorICogc3RyaWN0bHksIHVzZSBfc25kX2hkYWNfcmVhZF9wYXJtKCkgZGlyZWN0bHkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHNuZF9oZGFjX3JlYWRfcGFybShzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJCSAgICAgaW50IHBhcm0pCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCXJldHVybiBfc25kX2hkYWNfcmVhZF9wYXJtKGNvZGVjLCBuaWQsIHBhcm0sICZ2YWwpIDwgMCA/IC0xIDogdmFsOworfQorCisjaWZkZWYgQ09ORklHX1BNCit2b2lkIHNuZF9oZGFjX3Bvd2VyX3VwKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMpOwordm9pZCBzbmRfaGRhY19wb3dlcl9kb3duKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMpOwordm9pZCBzbmRfaGRhY19wb3dlcl91cF9wbShzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKTsKK3ZvaWQgc25kX2hkYWNfcG93ZXJfZG93bl9wbShzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2hkYWNfcG93ZXJfdXAoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYykge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaGRhY19wb3dlcl9kb3duKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2hkYWNfcG93ZXJfdXBfcG0oc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYykge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaGRhY19wb3dlcl9kb3duX3BtKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMpIHt9CisjZW5kaWYKKworLyoKKyAqIEhELWF1ZGlvIGNvZGVjIGJhc2UgZHJpdmVyCisgKi8KK3N0cnVjdCBoZGFjX2RyaXZlciB7CisJc3RydWN0IGRldmljZV9kcml2ZXIgZHJpdmVyOworCWludCB0eXBlOworCWludCAoKm1hdGNoKShzdHJ1Y3QgaGRhY19kZXZpY2UgKmRldiwgc3RydWN0IGhkYWNfZHJpdmVyICpkcnYpOworCXZvaWQgKCp1bnNvbF9ldmVudCkoc3RydWN0IGhkYWNfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBldmVudCk7Cit9OworCisjZGVmaW5lIGRydl90b19oZGFjX2RyaXZlcihfZHJ2KSBjb250YWluZXJfb2YoX2Rydiwgc3RydWN0IGhkYWNfZHJpdmVyLCBkcml2ZXIpCisKKy8qCisgKiBIRC1hdWRpbyBidXMgYmFzZSBkcml2ZXIKKyAqLworc3RydWN0IGhkYWNfYnVzX29wcyB7CisJLyogc2VuZCBhIHNpbmdsZSBjb21tYW5kICovCisJaW50ICgqY29tbWFuZCkoc3RydWN0IGhkYWNfYnVzICpidXMsIHVuc2lnbmVkIGludCBjbWQpOworCS8qIGdldCBhIHJlc3BvbnNlIGZyb20gdGhlIGxhc3QgY29tbWFuZCAqLworCWludCAoKmdldF9yZXNwb25zZSkoc3RydWN0IGhkYWNfYnVzICpidXMsIHVuc2lnbmVkIGludCBhZGRyLAorCQkJICAgIHVuc2lnbmVkIGludCAqcmVzKTsKK307CisKKyNkZWZpbmUgSERBX1VOU09MX1FVRVVFX1NJWkUJNjQKKworc3RydWN0IGhkYWNfYnVzIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJY29uc3Qgc3RydWN0IGhkYWNfYnVzX29wcyAqb3BzOworCisJLyogY29kZWMgbGlua2VkIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGNvZGVjX2xpc3Q7CisJdW5zaWduZWQgaW50IG51bV9jb2RlY3M7CisKKwkvKiBsaW5rIGNhZGRyIC0+IGNvZGVjICovCisJc3RydWN0IGhkYWNfZGV2aWNlICpjYWRkcl90YmxbSERBX01BWF9DT0RFQ19BRERSRVNTICsgMV07CisKKwkvKiB1bnNvbGljaXRlZCBldmVudCBxdWV1ZSAqLworCXUzMiB1bnNvbF9xdWV1ZVtIREFfVU5TT0xfUVVFVUVfU0laRSAqIDJdOyAvKiByaW5nIGJ1ZmZlciAqLworCXVuc2lnbmVkIGludCB1bnNvbF9ycCwgdW5zb2xfd3A7CisJc3RydWN0IHdvcmtfc3RydWN0IHVuc29sX3dvcms7CisKKwkvKiBiaXQgZmxhZ3Mgb2YgcG93ZXJlZCBjb2RlY3MgKi8KKwl1bnNpZ25lZCBsb25nIGNvZGVjX3Bvd2VyZWQ7CisKKwkvKiBmbGFncyAqLworCWJvb2wgc3luY193cml0ZToxOwkJLyogc3luYyBhZnRlciB2ZXJiIHdyaXRlICovCisKKwkvKiBsb2NrcyAqLworCXN0cnVjdCBtdXRleCBjbWRfbXV0ZXg7Cit9OworCitpbnQgc25kX2hkYWNfYnVzX2luaXQoc3RydWN0IGhkYWNfYnVzICpidXMsIHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJICAgICAgY29uc3Qgc3RydWN0IGhkYWNfYnVzX29wcyAqb3BzKTsKK3ZvaWQgc25kX2hkYWNfYnVzX2V4aXQoc3RydWN0IGhkYWNfYnVzICpidXMpOworaW50IHNuZF9oZGFjX2J1c19leGVjX3ZlcmIoc3RydWN0IGhkYWNfYnVzICpidXMsIHVuc2lnbmVkIGludCBhZGRyLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgaW50ICpyZXMpOworaW50IHNuZF9oZGFjX2J1c19leGVjX3ZlcmJfdW5sb2NrZWQoc3RydWN0IGhkYWNfYnVzICpidXMsIHVuc2lnbmVkIGludCBhZGRyLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgKnJlcyk7Cit2b2lkIHNuZF9oZGFjX2J1c19xdWV1ZV9ldmVudChzdHJ1Y3QgaGRhY19idXMgKmJ1cywgdTMyIHJlcywgdTMyIHJlc19leCk7CisKK2ludCBzbmRfaGRhY19idXNfYWRkX2RldmljZShzdHJ1Y3QgaGRhY19idXMgKmJ1cywgc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYyk7Cit2b2lkIHNuZF9oZGFjX2J1c19yZW1vdmVfZGV2aWNlKHN0cnVjdCBoZGFjX2J1cyAqYnVzLAorCQkJCXN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMpOworCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2hkYWNfY29kZWNfbGlua191cChzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKQoreworCXNldF9iaXQoY29kZWMtPmFkZHIsICZjb2RlYy0+YnVzLT5jb2RlY19wb3dlcmVkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9oZGFjX2NvZGVjX2xpbmtfZG93bihzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKQoreworCWNsZWFyX2JpdChjb2RlYy0+YWRkciwgJmNvZGVjLT5idXMtPmNvZGVjX3Bvd2VyZWQpOworfQorCisvKgorICogZ2VuZXJpYyBhcnJheSBoZWxwZXJzCisgKi8KK3ZvaWQgKnNuZF9hcnJheV9uZXcoc3RydWN0IHNuZF9hcnJheSAqYXJyYXkpOwordm9pZCBzbmRfYXJyYXlfZnJlZShzdHJ1Y3Qgc25kX2FycmF5ICphcnJheSk7CitzdGF0aWMgaW5saW5lIHZvaWQgc25kX2FycmF5X2luaXQoc3RydWN0IHNuZF9hcnJheSAqYXJyYXksIHVuc2lnbmVkIGludCBzaXplLAorCQkJCSAgdW5zaWduZWQgaW50IGFsaWduKQoreworCWFycmF5LT5lbGVtX3NpemUgPSBzaXplOworCWFycmF5LT5hbGxvY19hbGlnbiA9IGFsaWduOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnNuZF9hcnJheV9lbGVtKHN0cnVjdCBzbmRfYXJyYXkgKmFycmF5LCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXJldHVybiBhcnJheS0+bGlzdCArIGlkeCAqIGFycmF5LT5lbGVtX3NpemU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNuZF9hcnJheV9pbmRleChzdHJ1Y3Qgc25kX2FycmF5ICphcnJheSwgdm9pZCAqcHRyKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZykocHRyIC0gYXJyYXktPmxpc3QpIC8gYXJyYXktPmVsZW1fc2l6ZTsKK30KKworI2VuZGlmIC8qIF9fU09VTkRfSERBVURJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3BjbS5oIGIvaW5jbHVkZS9zb3VuZC9wY20uaAppbmRleCBjMGRkYjdlLi4wY2I3ZjNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3BjbS5oCisrKyBiL2luY2x1ZGUvc291bmQvcGNtLmgKQEAgLTYwLDYgKzYwLDkgQEAKIAogc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtOwogCitzdHJ1Y3Qgc25kX3BjbV9hdWRpb190c3RhbXBfY29uZmlnOyAvKiBkZWZpbml0aW9ucyBmdXJ0aGVyIGRvd24gKi8KK3N0cnVjdCBzbmRfcGNtX2F1ZGlvX3RzdGFtcF9yZXBvcnQ7CisKIHN0cnVjdCBzbmRfcGNtX29wcyB7CiAJaW50ICgqb3Blbikoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pOwogCWludCAoKmNsb3NlKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CkBAIC03MSw4ICs3NCwxMCBAQAogCWludCAoKnByZXBhcmUpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKIAlpbnQgKCp0cmlnZ2VyKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCk7CiAJc25kX3BjbV91ZnJhbWVzX3QgKCpwb2ludGVyKShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7Ci0JaW50ICgqd2FsbF9jbG9jaykoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgIHN0cnVjdCB0aW1lc3BlYyAqYXVkaW9fdHMpOworCWludCAoKmdldF90aW1lX2luZm8pKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJc3RydWN0IHRpbWVzcGVjICpzeXN0ZW1fdHMsIHN0cnVjdCB0aW1lc3BlYyAqYXVkaW9fdHMsCisJCQlzdHJ1Y3Qgc25kX3BjbV9hdWRpb190c3RhbXBfY29uZmlnICphdWRpb190c3RhbXBfY29uZmlnLAorCQkJc3RydWN0IHNuZF9wY21fYXVkaW9fdHN0YW1wX3JlcG9ydCAqYXVkaW9fdHN0YW1wX3JlcG9ydCk7CiAJaW50ICgqY29weSkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sIGludCBjaGFubmVsLAogCQkgICAgc25kX3BjbV91ZnJhbWVzX3QgcG9zLAogCQkgICAgdm9pZCBfX3VzZXIgKmJ1Ziwgc25kX3BjbV91ZnJhbWVzX3QgY291bnQpOwpAQCAtMjgxLDYgKzI4Niw1OCBAQAogCiBzdHJ1Y3Qgc25kX3BjbV9od3B0cl9sb2c7CiAKKy8qCisgKiB1c2Vyc3BhY2UtcHJvdmlkZWQgYXVkaW8gdGltZXN0YW1wIGNvbmZpZyB0byBrZXJuZWwsCisgKiBzdHJ1Y3R1cmUgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5IGFuZCBmaWxsZWQgd2l0aCBkZWRpY2F0ZWQgdW5wYWNrIHJvdXRpbmUKKyAqLworc3RydWN0IHNuZF9wY21fYXVkaW9fdHN0YW1wX2NvbmZpZyB7CisJLyogNSBvZiBtYXggMTYgYml0cyB1c2VkICovCisJdTMyIHR5cGVfcmVxdWVzdGVkOjQ7CisJdTMyIHJlcG9ydF9kZWxheToxOyAvKiBhZGQgdG90YWwgZGVsYXkgdG8gQS9EIG9yIEQvQSAqLworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9wY21fdW5wYWNrX2F1ZGlvX3RzdGFtcF9jb25maWcoX191MzIgZGF0YSwKKwkJCQkJCXN0cnVjdCBzbmRfcGNtX2F1ZGlvX3RzdGFtcF9jb25maWcgKmNvbmZpZykKK3sKKwljb25maWctPnR5cGVfcmVxdWVzdGVkID0gZGF0YSAmIDB4RjsKKwljb25maWctPnJlcG9ydF9kZWxheSA9IChkYXRhID4+IDQpICYgMTsKK30KKworLyoKKyAqIGtlcm5lbC1wcm92aWRlZCBhdWRpbyB0aW1lc3RhbXAgcmVwb3J0IHRvIHVzZXItc3BhY2UKKyAqIHN0cnVjdHVyZSBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkgYW5kIHJlYWQgYnkgZGVkaWNhdGVkIHBhY2sgcm91dGluZQorICovCitzdHJ1Y3Qgc25kX3BjbV9hdWRpb190c3RhbXBfcmVwb3J0IHsKKwkvKiA2IG9mIG1heCAxNiBiaXRzIHVzZWQgZm9yIGJpdC1maWVsZHMgKi8KKworCS8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworCXUzMiB2YWxpZDoxOworCisJLyogYWN0dWFsIHR5cGUgaWYgaGFyZHdhcmUgY291bGQgbm90IHN1cHBvcnQgcmVxdWVzdGVkIHRpbWVzdGFtcCAqLworCXUzMiBhY3R1YWxfdHlwZTo0OworCisJLyogYWNjdXJhY3kgcmVwcmVzZW50ZWQgaW4gbnMgdW5pdHMgKi8KKwl1MzIgYWNjdXJhY3lfcmVwb3J0OjE7IC8qIDAgaWYgYWNjdXJhY3kgdW5rbm93biwgMSBpZiBhY2N1cmFjeSBmaWVsZCBpcyB2YWxpZCAqLworCXUzMiBhY2N1cmFjeTsgLyogdXAgdG8gNC4yOXMsIHdpbGwgYmUgcGFja2VkIGluIHNlcGFyYXRlIGZpZWxkICAqLworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9wY21fcGFja19hdWRpb190c3RhbXBfcmVwb3J0KF9fdTMyICpkYXRhLCBfX3UzMiAqYWNjdXJhY3ksCisJCQkJCQljb25zdCBzdHJ1Y3Qgc25kX3BjbV9hdWRpb190c3RhbXBfcmVwb3J0ICpyZXBvcnQpCit7CisJdTMyIHRtcDsKKworCXRtcCA9IHJlcG9ydC0+YWNjdXJhY3lfcmVwb3J0OworCXRtcCA8PD0gNDsKKwl0bXAgfD0gcmVwb3J0LT5hY3R1YWxfdHlwZTsKKwl0bXAgPDw9IDE7CisJdG1wIHw9IHJlcG9ydC0+dmFsaWQ7CisKKwkqZGF0YSAmPSAweGZmZmY7IC8qIHplcm8tY2xlYXIgTVNCcyAqLworCSpkYXRhIHw9ICh0bXAgPDwgMTYpOworCSphY2N1cmFjeSA9IHJlcG9ydC0+YWNjdXJhY3k7Cit9CisKKwogc3RydWN0IHNuZF9wY21fcnVudGltZSB7CiAJLyogLS0gU3RhdHVzIC0tICovCiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICp0cmlnZ2VyX21hc3RlcjsKQEAgLTM2MSw2ICs0MTgsMTEgQEAKIAogCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hX2J1ZmZlcl9wOwkvKiBhbGxvY2F0ZWQgYnVmZmVyICovCiAKKwkvKiAtLSBhdWRpbyB0aW1lc3RhbXAgY29uZmlnIC0tICovCisJc3RydWN0IHNuZF9wY21fYXVkaW9fdHN0YW1wX2NvbmZpZyBhdWRpb190c3RhbXBfY29uZmlnOworCXN0cnVjdCBzbmRfcGNtX2F1ZGlvX3RzdGFtcF9yZXBvcnQgYXVkaW9fdHN0YW1wX3JlcG9ydDsKKwlzdHJ1Y3QgdGltZXNwZWMgZHJpdmVyX3RzdGFtcDsKKwogI2lmIGRlZmluZWQoQ09ORklHX1NORF9QQ01fT1NTKSB8fCBkZWZpbmVkKENPTkZJR19TTkRfUENNX09TU19NT0RVTEUpCiAJLyogLS0gT1NTIHRoaW5ncyAtLSAqLwogCXN0cnVjdCBzbmRfcGNtX29zc19ydW50aW1lIG9zczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvcGNtX3BhcmFtcy5oIGIvaW5jbHVkZS9zb3VuZC9wY21fcGFyYW1zLmgKaW5kZXggM2M0NWYzOS4uYzcwNDM1NyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9wY21fcGFyYW1zLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9wY21fcGFyYW1zLmgKQEAgLTM2Niw0ICszNjYsMTEgQEAKIAlyZXR1cm4gc25kX3BjbV9mb3JtYXRfcGh5c2ljYWxfd2lkdGgocGFyYW1zX2Zvcm1hdChwKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZAorcGFyYW1zX3NldF9mb3JtYXQoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwLCBzbmRfcGNtX2Zvcm1hdF90IGZtdCkKK3sKKwlzbmRfbWFza19zZXQoaHdfcGFyYW1fbWFzayhwLCBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFUKSwKKwkJKF9fZm9yY2UgaW50KWZtdCk7Cit9CisKICNlbmRpZiAvKiBfX1NPVU5EX1BDTV9QQVJBTVNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9ydDU2NzAuaCBiL2luY2x1ZGUvc291bmQvcnQ1NjcwLmgKaW5kZXggYmQzMTExOS4uYjdkNjA1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9ydDU2NzAuaAorKysgYi9pbmNsdWRlL3NvdW5kL3J0NTY3MC5oCkBAIC0xNCw2ICsxNCw3IEBACiBzdHJ1Y3QgcnQ1NjcwX3BsYXRmb3JtX2RhdGEgewogCWludCBqZF9tb2RlOwogCWJvb2wgaW4yX2RpZmY7CisJYm9vbCBkZXZfZ3BpbzsKIAogCWJvb2wgZG1pY19lbjsKIAl1bnNpZ25lZCBpbnQgZG1pYzFfZGF0YV9waW47CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NlcV9kZXZpY2UuaCBiL2luY2x1ZGUvc291bmQvc2VxX2RldmljZS5oCmluZGV4IDJiNWYyNGMuLmRkYzBkNTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc2VxX2RldmljZS5oCisrKyBiL2luY2x1ZGUvc291bmQvc2VxX2RldmljZS5oCkBAIC0yNSwyOSArMjUsMjYgQEAKICAqIHJlZ2lzdGVyZWQgZGV2aWNlIGluZm9ybWF0aW9uCiAgKi8KIAotI2RlZmluZSBJRF9MRU4JMzIKLQotLyogc3RhdHVzIGZsYWcgKi8KLSNkZWZpbmUgU05EUlZfU0VRX0RFVklDRV9GUkVFCQkwCi0jZGVmaW5lIFNORFJWX1NFUV9ERVZJQ0VfUkVHSVNURVJFRAkxCi0KIHN0cnVjdCBzbmRfc2VxX2RldmljZSB7CiAJLyogZGV2aWNlIGluZm8gKi8KIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CS8qIHNvdW5kIGNhcmQgKi8KIAlpbnQgZGV2aWNlOwkJLyogZGV2aWNlIG51bWJlciAqLwotCWNoYXIgaWRbSURfTEVOXTsJLyogZHJpdmVyIGlkICovCisJY29uc3QgY2hhciAqaWQ7CQkvKiBkcml2ZXIgaWQgKi8KIAljaGFyIG5hbWVbODBdOwkJLyogZGV2aWNlIG5hbWUgKi8KIAlpbnQgYXJnc2l6ZTsJCS8qIHNpemUgb2YgdGhlIGFyZ3VtZW50ICovCiAJdm9pZCAqZHJpdmVyX2RhdGE7CS8qIHByaXZhdGUgZGF0YSBmb3IgZHJpdmVyICovCi0JaW50IHN0YXR1czsJCS8qIGZsYWcgLSByZWFkIG9ubHkgKi8KIAl2b2lkICpwcml2YXRlX2RhdGE7CS8qIHByaXZhdGUgZGF0YSBmb3IgdGhlIGNhbGxlciAqLwogCXZvaWQgKCpwcml2YXRlX2ZyZWUpKHN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2aWNlKTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIGxpbmsgdG8gbmV4dCBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlIGRldjsKIH07CiAKKyNkZWZpbmUgdG9fc2VxX2RldihfZGV2KSBcCisJY29udGFpbmVyX29mKF9kZXYsIHN0cnVjdCBzbmRfc2VxX2RldmljZSwgZGV2KQorCisvKiBzZXF1ZW5jZXIgZHJpdmVyICovCiAKIC8qIGRyaXZlciBvcGVyYXRvcnMKLSAqIGluaXRfZGV2aWNlOgorICogcHJvYmU6CiAgKglJbml0aWFsaXplIHRoZSBkZXZpY2Ugd2l0aCBnaXZlbiBwYXJhbWV0ZXJzLgogICoJVHlwaWNhbGx5LAogICoJCTEuIGNhbGwgc25kX2h3ZGVwX25ldwpAQCAtNTUsMjUgKzUyLDQwIEBACiAgKgkJMy4gY2FsbCBzbmRfaHdkZXBfcmVnaXN0ZXIKICAqCQk0LiBzdG9yZSB0aGUgaW5zdGFuY2UgdG8gZGV2LT5kcml2ZXJfZGF0YSBwb2ludGVyLgogICoJCQotICogZnJlZV9kZXZpY2U6CisgKiByZW1vdmU6CiAgKglSZWxlYXNlIHRoZSBwcml2YXRlIGRhdGEuCiAgKglUeXBpY2FsbHksIGNhbGwgc25kX2RldmljZV9mcmVlKGRldi0+Y2FyZCwgZGV2LT5kcml2ZXJfZGF0YSkKICAqLwotc3RydWN0IHNuZF9zZXFfZGV2X29wcyB7Ci0JaW50ICgqaW5pdF9kZXZpY2UpKHN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2KTsKLQlpbnQgKCpmcmVlX2RldmljZSkoc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYpOworc3RydWN0IHNuZF9zZXFfZHJpdmVyIHsKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciBkcml2ZXI7CisJY2hhciAqaWQ7CisJaW50IGFyZ3NpemU7CiB9OwogCisjZGVmaW5lIHRvX3NlcV9kcnYoX2RydikgXAorCWNvbnRhaW5lcl9vZihfZHJ2LCBzdHJ1Y3Qgc25kX3NlcV9kcml2ZXIsIGRyaXZlcikKKwogLyoKICAqIHByb3RvdHlwZXMKICAqLworI2lmZGVmIENPTkZJR19NT0RVTEVTCiB2b2lkIHNuZF9zZXFfZGV2aWNlX2xvYWRfZHJpdmVycyh2b2lkKTsKLWludCBzbmRfc2VxX2RldmljZV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2aWNlLCBjaGFyICppZCwgaW50IGFyZ3NpemUsIHN0cnVjdCBzbmRfc2VxX2RldmljZSAqKnJlc3VsdCk7Ci1pbnQgc25kX3NlcV9kZXZpY2VfcmVnaXN0ZXJfZHJpdmVyKGNoYXIgKmlkLCBzdHJ1Y3Qgc25kX3NlcV9kZXZfb3BzICplbnRyeSwgaW50IGFyZ3NpemUpOwotaW50IHNuZF9zZXFfZGV2aWNlX3VucmVnaXN0ZXJfZHJpdmVyKGNoYXIgKmlkKTsKKyNlbHNlCisjZGVmaW5lIHNuZF9zZXFfZGV2aWNlX2xvYWRfZHJpdmVycygpCisjZW5kaWYKK2ludCBzbmRfc2VxX2RldmljZV9uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBpbnQgZGV2aWNlLCBjb25zdCBjaGFyICppZCwKKwkJICAgICAgIGludCBhcmdzaXplLCBzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKipyZXN1bHQpOwogCiAjZGVmaW5lIFNORFJWX1NFUV9ERVZJQ0VfQVJHUFRSKGRldikgKHZvaWQgKikoKGNoYXIgKikoZGV2KSArIHNpemVvZihzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UpKQogCitpbnQgX19tdXN0X2NoZWNrIF9fc25kX3NlcV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHNuZF9zZXFfZHJpdmVyICpkcnYsCisJCQkJCSAgIHN0cnVjdCBtb2R1bGUgKm1vZCk7CisjZGVmaW5lIHNuZF9zZXFfZHJpdmVyX3JlZ2lzdGVyKGRydikgXAorCV9fc25kX3NlcV9kcml2ZXJfcmVnaXN0ZXIoZHJ2LCBUSElTX01PRFVMRSkKK3ZvaWQgc25kX3NlcV9kcml2ZXJfdW5yZWdpc3RlcihzdHJ1Y3Qgc25kX3NlcV9kcml2ZXIgKmRydik7CisKKyNkZWZpbmUgbW9kdWxlX3NuZF9zZXFfZHJpdmVyKGRydikgXAorCW1vZHVsZV9kcml2ZXIoZHJ2LCBzbmRfc2VxX2RyaXZlcl9yZWdpc3Rlciwgc25kX3NlcV9kcml2ZXJfdW5yZWdpc3RlcikKIAogLyoKICAqIGlkIHN0cmluZ3MgZm9yIGdlbmVyaWMgZGV2aWNlcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC9zZXFfa2VybmVsLmggYi9pbmNsdWRlL3NvdW5kL3NlcV9rZXJuZWwuaAppbmRleCAxOGEyYWM1Li5mZWI1OGQ0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NlcV9rZXJuZWwuaAorKysgYi9pbmNsdWRlL3NvdW5kL3NlcV9rZXJuZWwuaApAQCAtOTksMTMgKzk5LDkgQEAKIGludCBzbmRfc2VxX2V2ZW50X3BvcnRfZGV0YWNoKGludCBjbGllbnQsIGludCBwb3J0KTsKIAogI2lmZGVmIENPTkZJR19NT0RVTEVTCi12b2lkIHNuZF9zZXFfYXV0b2xvYWRfbG9jayh2b2lkKTsKLXZvaWQgc25kX3NlcV9hdXRvbG9hZF91bmxvY2sodm9pZCk7CiB2b2lkIHNuZF9zZXFfYXV0b2xvYWRfaW5pdCh2b2lkKTsKLSNkZWZpbmUgc25kX3NlcV9hdXRvbG9hZF9leGl0KCkJc25kX3NlcV9hdXRvbG9hZF9sb2NrKCkKK3ZvaWQgc25kX3NlcV9hdXRvbG9hZF9leGl0KHZvaWQpOwogI2Vsc2UKLSNkZWZpbmUgc25kX3NlcV9hdXRvbG9hZF9sb2NrKCkKLSNkZWZpbmUgc25kX3NlcV9hdXRvbG9hZF91bmxvY2soKQogI2RlZmluZSBzbmRfc2VxX2F1dG9sb2FkX2luaXQoKQogI2RlZmluZSBzbmRfc2VxX2F1dG9sb2FkX2V4aXQoKQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkLmggYi9pbmNsdWRlL3NvdW5kL3NpbXBsZV9jYXJkLmgKaW5kZXggMTI1NWRkYi4uYjliNGYyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zaW1wbGVfY2FyZC5oCisrKyBiL2luY2x1ZGUvc291bmQvc2ltcGxlX2NhcmQuaApAQCAtMTYsNyArMTYsNiBAQAogCiBzdHJ1Y3QgYXNvY19zaW1wbGVfZGFpIHsKIAljb25zdCBjaGFyICpuYW1lOwotCXVuc2lnbmVkIGludCBmbXQ7CiAJdW5zaWduZWQgaW50IHN5c2NsazsKIAlpbnQgc2xvdHM7CiAJaW50IHNsb3Rfd2lkdGg7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmggYi9pbmNsdWRlL3NvdW5kL3NvYy1kYXBtLmgKaW5kZXggOGQ3NDE2ZS4uMGJjODM2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zb3VuZC9zb2MtZGFwbS5oCisrKyBiL2luY2x1ZGUvc291bmQvc29jLWRhcG0uaApAQCAtMzc4LDYgKzM3OCw3IEBACiB2b2lkIHNuZF9zb2NfZGFwbV9jb25uZWN0X2RhaV9saW5rX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCk7CiBpbnQgc25kX3NvY19kYXBtX25ld19wY20oc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKIAkJCSBjb25zdCBzdHJ1Y3Qgc25kX3NvY19wY21fc3RyZWFtICpwYXJhbXMsCisJCQkgdW5zaWduZWQgaW50IG51bV9wYXJhbXMsCiAJCQkgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNvdXJjZSwKIAkJCSBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqc2luayk7CiAKQEAgLTQ0MCw3ICs0NDEsNiBAQAogaW50IHNuZF9zb2NfZGFwbV9kYWlfZ2V0X2Nvbm5lY3RlZF93aWRnZXRzKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgc3RyZWFtLAogCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0X2xpc3QgKipsaXN0KTsKIAotc3RydWN0IHNuZF9zb2NfY29kZWMgKnNuZF9zb2NfZGFwbV9rY29udHJvbF9jb2RlYyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCk7CiBzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKnNuZF9zb2NfZGFwbV9rY29udHJvbF9kYXBtKAogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sKTsKIApAQCAtNTMxLDYgKzUzMSw4IEBACiAJdm9pZCAqcHJpdjsJCQkJLyogd2lkZ2V0IHNwZWNpZmljIGRhdGEgKi8KIAlzdHJ1Y3QgcmVndWxhdG9yICpyZWd1bGF0b3I7CQkvKiBhdHRhY2hlZCByZWd1bGF0b3IgKi8KIAljb25zdCBzdHJ1Y3Qgc25kX3NvY19wY21fc3RyZWFtICpwYXJhbXM7IC8qIHBhcmFtcyBmb3IgZGFpIGxpbmtzICovCisJdW5zaWduZWQgaW50IG51bV9wYXJhbXM7IC8qIG51bWJlciBvZiBwYXJhbXMgZm9yIGRhaSBsaW5rcyAqLworCXVuc2lnbmVkIGludCBwYXJhbXNfc2VsZWN0OyAvKiBjdXJyZW50bHkgc2VsZWN0ZWQgcGFyYW0gZm9yIGRhaSBsaW5rICovCiAKIAkvKiBkYXBtIGNvbnRyb2wgKi8KIAlpbnQgcmVnOwkJCQkvKiBuZWdhdGl2ZSByZWcgPSBubyBkaXJlY3QgZGFwbSAqLwpAQCAtNTg2LDggKzU4OCw2IEBACiAvKiBEQVBNIGNvbnRleHQgKi8KIHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCB7CiAJZW51bSBzbmRfc29jX2JpYXNfbGV2ZWwgYmlhc19sZXZlbDsKLQllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBzdXNwZW5kX2JpYXNfbGV2ZWw7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBkZWxheWVkX3dvcms7CiAJdW5zaWduZWQgaW50IGlkbGVfYmlhc19vZmY6MTsgLyogVXNlIEJJQVNfT0ZGIGluc3RlYWQgb2YgU1RBTkRCWSAqLwogCS8qIEdvIHRvIEJJQVNfT0ZGIGluIHN1c3BlbmQgaWYgdGhlIERBUE0gY29udGV4dCBpcyBpZGxlICovCiAJdW5zaWduZWQgaW50IHN1c3BlbmRfYmlhc19vZmY6MTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc29jLWRwY20uaCBiL2luY2x1ZGUvc291bmQvc29jLWRwY20uaAppbmRleCA5OGYyYWRlLi44MDYwNTkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3NvYy1kcGNtLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MtZHBjbS5oCkBAIC0xMzUsNyArMTM1LDcgQEAKIAogLyogaW50ZXJuYWwgdXNlIG9ubHkgKi8KIGludCBzb2NfZHBjbV9iZV9kaWdpdGFsX211dGUoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKmZlLCBpbnQgbXV0ZSk7Ci1pbnQgc29jX2RwY21fZGVidWdmc19hZGQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCk7Cit2b2lkIHNvY19kcGNtX2RlYnVnZnNfYWRkKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpOwogaW50IHNvY19kcGNtX3J1bnRpbWVfdXBkYXRlKHN0cnVjdCBzbmRfc29jX2NhcmQgKik7CiAKIGludCBkcGNtX3BhdGhfZ2V0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpmZSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc291bmQvc29jLmggYi9pbmNsdWRlL3NvdW5kL3NvYy5oCmluZGV4IDBkMWFkZTEuLmZjYjMxMmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmQvc29jLmgKKysrIGIvaW5jbHVkZS9zb3VuZC9zb2MuaApAQCAtNDUwLDggKzQ1MCwxMCBAQAogCQkgICAgICBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSk7CiAKIC8qIEphY2sgcmVwb3J0aW5nICovCi1pbnQgc25kX3NvY19qYWNrX25ldyhzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKmlkLCBpbnQgdHlwZSwKLQkJICAgICBzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrKTsKK2ludCBzbmRfc29jX2NhcmRfamFja19uZXcoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwgY29uc3QgY2hhciAqaWQsIGludCB0eXBlLAorCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2ssIHN0cnVjdCBzbmRfc29jX2phY2tfcGluICpwaW5zLAorCXVuc2lnbmVkIGludCBudW1fcGlucyk7CisKIHZvaWQgc25kX3NvY19qYWNrX3JlcG9ydChzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrLCBpbnQgc3RhdHVzLCBpbnQgbWFzayk7CiBpbnQgc25kX3NvY19qYWNrX2FkZF9waW5zKHN0cnVjdCBzbmRfc29jX2phY2sgKmphY2ssIGludCBjb3VudCwKIAkJCSAgc3RydWN0IHNuZF9zb2NfamFja19waW4gKnBpbnMpOwpAQCAtNjU5LDcgKzY2MSw3IEBACiBzdHJ1Y3Qgc25kX3NvY19qYWNrIHsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJc3RydWN0IHNuZF9qYWNrICpqYWNrOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkOwogCXN0cnVjdCBsaXN0X2hlYWQgcGluczsKIAlpbnQgc3RhdHVzOwogCXN0cnVjdCBibG9ja2luZ19ub3RpZmllcl9oZWFkIG5vdGlmaWVyOwpAQCAtOTQxLDYgKzk0Myw3IEBACiAJaW50IGJlX2lkOwkvKiBvcHRpb25hbCBJRCBmb3IgbWFjaGluZSBkcml2ZXIgQkUgaWRlbnRpZmljYXRpb24gKi8KIAogCWNvbnN0IHN0cnVjdCBzbmRfc29jX3BjbV9zdHJlYW0gKnBhcmFtczsKKwl1bnNpZ25lZCBpbnQgbnVtX3BhcmFtczsKIAogCXVuc2lnbmVkIGludCBkYWlfZm10OyAgICAgICAgICAgLyogZm9ybWF0IHRvIHNldCBvbiBpbml0ICovCiAKQEAgLTk1NCw2ICs5NTcsOSBAQAogCXVuc2lnbmVkIGludCBzeW1tZXRyaWNfY2hhbm5lbHM6MTsKIAl1bnNpZ25lZCBpbnQgc3ltbWV0cmljX3NhbXBsZWJpdHM6MTsKIAorCS8qIE1hcmsgdGhpcyBwY20gd2l0aCBub24gYXRvbWljIG9wcyAqLworCWJvb2wgbm9uYXRvbWljOworCiAJLyogRG8gbm90IGNyZWF0ZSBhIFBDTSBmb3IgdGhpcyBEQUkgbGluayAoQmFja2VuZCBsaW5rKSAqLwogCXVuc2lnbmVkIGludCBub19wY206MTsKIApAQCAtMTA3MSwxMSArMTA3NywxNiBAQAogCiAJLyoKIAkgKiBDYXJkLXNwZWNpZmljIHJvdXRlcyBhbmQgd2lkZ2V0cy4KKwkgKiBOb3RlOiBvZl9kYXBtX3h4eCBmb3IgRGV2aWNlIFRyZWU7IE90aGVyd2lzZSBmb3IgZHJpdmVyIGJ1aWxkLWluLgogCSAqLwogCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpkYXBtX3dpZGdldHM7CiAJaW50IG51bV9kYXBtX3dpZGdldHM7CiAJY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqZGFwbV9yb3V0ZXM7CiAJaW50IG51bV9kYXBtX3JvdXRlczsKKwljb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqb2ZfZGFwbV93aWRnZXRzOworCWludCBudW1fb2ZfZGFwbV93aWRnZXRzOworCWNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgKm9mX2RhcG1fcm91dGVzOworCWludCBudW1fb2ZfZGFwbV9yb3V0ZXM7CiAJYm9vbCBmdWxseV9yb3V0ZWQ7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZGVmZXJyZWRfcmVzdW1lX3dvcms7CkBAIC0xMjU4LDYgKzEyNjksMTkgQEAKIAlyZXR1cm4gY29tcG9uZW50LT5kYXBtX3B0cjsKIH0KIAorLyoqCisgKiBzbmRfc29jX2RhcG1fa2NvbnRyb2xfY29kZWMoKSAtIFJldHVybnMgdGhlIGNvZGVjIGFzc29jaWF0ZWQgdG8gYSBrY29udHJvbAorICogQGtjb250cm9sOiBUaGUga2NvbnRyb2wKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZSB1c2VkIG9uIERBUE0gY29udGV4dHMgdGhhdCBhcmUga25vd24gdG8gYmUgcGFydCBvZgorICogYSBDT0RFQyAoZS5nLiBpbiBhIENPREVDIGRyaXZlcikuIE90aGVyd2lzZSB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfc29jX2NvZGVjICpzbmRfc29jX2RhcG1fa2NvbnRyb2xfY29kZWMoCisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wpCit7CisJcmV0dXJuIHNuZF9zb2NfZGFwbV90b19jb2RlYyhzbmRfc29jX2RhcG1fa2NvbnRyb2xfZGFwbShrY29udHJvbCkpOworfQorCiAvKiBjb2RlYyBJTyAqLwogdW5zaWduZWQgaW50IHNuZF9zb2NfcmVhZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByZWcpOwogaW50IHNuZF9zb2Nfd3JpdGUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLApAQCAtMTQ2OSw3ICsxNDkzLDcgQEAKIH0KIAogLyoqCi0gKiBzbmRfc29jX2tjb250cm9sX3BsYXRmb3JtKCkgLSBSZXR1cm5zIHRoZSBwbGF0Zm9ybSB0aGF0IHJlZ2lzdGVyZCB0aGUgY29udHJvbAorICogc25kX3NvY19rY29udHJvbF9wbGF0Zm9ybSgpIC0gUmV0dXJucyB0aGUgcGxhdGZvcm0gdGhhdCByZWdpc3RlcmVkIHRoZSBjb250cm9sCiAgKiBAa2NvbnRyb2w6IFRoZSBjb250cm9sIGZvciB3aGljaCB0byBnZXQgdGhlIHBsYXRmb3JtCiAgKgogICogTm90ZTogVGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgd29yayBjb3JyZWN0bHkgaWYgdGhlIGNvbnRyb2wgaGFzIGJlZW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2JhY2tlbmQuaCBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2JhY2tlbmQuaAppbmRleCBkYjgxYzY1Li5kNjFiZTcyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9iYWNrZW5kLmgKKysrIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFja2VuZC5oCkBAIC0xMTEsNiArMTExLDcgQEAKIHZvaWQJdGFyZ2V0X2NvcmVfc2V0dXBfc3ViX2NpdHMoc3RydWN0IHNlX3N1YnN5c3RlbV9hcGkgKik7CiAKIC8qIGF0dHJpYnV0ZSBoZWxwZXJzIGZyb20gdGFyZ2V0X2NvcmVfZGV2aWNlLmMgZm9yIGJhY2tlbmQgZHJpdmVycyAqLworYm9vbAlzZV9kZXZfY2hlY2tfd2NlKHN0cnVjdCBzZV9kZXZpY2UgKik7CiBpbnQJc2VfZGV2X3NldF9tYXhfdW5tYXBfbGJhX2NvdW50KHN0cnVjdCBzZV9kZXZpY2UgKiwgdTMyKTsKIGludAlzZV9kZXZfc2V0X21heF91bm1hcF9ibG9ja19kZXNjX2NvdW50KHN0cnVjdCBzZV9kZXZpY2UgKiwgdTMyKTsKIGludAlzZV9kZXZfc2V0X3VubWFwX2dyYW51bGFyaXR5KHN0cnVjdCBzZV9kZXZpY2UgKiwgdTMyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzLzlwLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy85cC5oCmluZGV4IGEwNjY2MzYuLjYzM2VlOWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzLzlwLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvOXAuaApAQCAtNiw3NiArNiw5NSBAQAogCiAjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgogCisjZGVmaW5lIFA5X01TR19UCQkJCQkJCVwKKwkJRU0oIFA5X1RMRVJST1IsCQkiUDlfVExFUlJPUiIgKQkJCVwKKwkJRU0oIFA5X1JMRVJST1IsCQkiUDlfUkxFUlJPUiIgKQkJCVwKKwkJRU0oIFA5X1RTVEFURlMsCQkiUDlfVFNUQVRGUyIgKQkJCVwKKwkJRU0oIFA5X1JTVEFURlMsCQkiUDlfUlNUQVRGUyIgKQkJCVwKKwkJRU0oIFA5X1RMT1BFTiwJCSJQOV9UTE9QRU4iICkJCQlcCisJCUVNKCBQOV9STE9QRU4sCQkiUDlfUkxPUEVOIiApCQkJXAorCQlFTSggUDlfVExDUkVBVEUsCSJQOV9UTENSRUFURSIgKQkJCVwKKwkJRU0oIFA5X1JMQ1JFQVRFLAkiUDlfUkxDUkVBVEUiICkJCQlcCisJCUVNKCBQOV9UU1lNTElOSywJIlA5X1RTWU1MSU5LIiApCQkJXAorCQlFTSggUDlfUlNZTUxJTkssCSJQOV9SU1lNTElOSyIgKQkJCVwKKwkJRU0oIFA5X1RNS05PRCwJCSJQOV9UTUtOT0QiICkJCQlcCisJCUVNKCBQOV9STUtOT0QsCQkiUDlfUk1LTk9EIiApCQkJXAorCQlFTSggUDlfVFJFTkFNRSwJCSJQOV9UUkVOQU1FIiApCQkJXAorCQlFTSggUDlfUlJFTkFNRSwJCSJQOV9SUkVOQU1FIiApCQkJXAorCQlFTSggUDlfVFJFQURMSU5LLAkiUDlfVFJFQURMSU5LIiApCQlcCisJCUVNKCBQOV9SUkVBRExJTkssCSJQOV9SUkVBRExJTksiICkJCVwKKwkJRU0oIFA5X1RHRVRBVFRSLAkiUDlfVEdFVEFUVFIiICkJCQlcCisJCUVNKCBQOV9SR0VUQVRUUiwJIlA5X1JHRVRBVFRSIiApCQkJXAorCQlFTSggUDlfVFNFVEFUVFIsCSJQOV9UU0VUQVRUUiIgKQkJCVwKKwkJRU0oIFA5X1JTRVRBVFRSLAkiUDlfUlNFVEFUVFIiICkJCQlcCisJCUVNKCBQOV9UWEFUVFJXQUxLLAkiUDlfVFhBVFRSV0FMSyIgKQkJXAorCQlFTSggUDlfUlhBVFRSV0FMSywJIlA5X1JYQVRUUldBTEsiICkJCVwKKwkJRU0oIFA5X1RYQVRUUkNSRUFURSwJIlA5X1RYQVRUUkNSRUFURSIgKQkJXAorCQlFTSggUDlfUlhBVFRSQ1JFQVRFLAkiUDlfUlhBVFRSQ1JFQVRFIiApCQlcCisJCUVNKCBQOV9UUkVBRERJUiwJIlA5X1RSRUFERElSIiApCQkJXAorCQlFTSggUDlfUlJFQURESVIsCSJQOV9SUkVBRERJUiIgKQkJCVwKKwkJRU0oIFA5X1RGU1lOQywJCSJQOV9URlNZTkMiICkJCQlcCisJCUVNKCBQOV9SRlNZTkMsCQkiUDlfUkZTWU5DIiApCQkJXAorCQlFTSggUDlfVExPQ0ssCQkiUDlfVExPQ0siICkJCQlcCisJCUVNKCBQOV9STE9DSywJCSJQOV9STE9DSyIgKQkJCVwKKwkJRU0oIFA5X1RHRVRMT0NLLAkiUDlfVEdFVExPQ0siICkJCQlcCisJCUVNKCBQOV9SR0VUTE9DSywJIlA5X1JHRVRMT0NLIiApCQkJXAorCQlFTSggUDlfVExJTkssCQkiUDlfVExJTksiICkJCQlcCisJCUVNKCBQOV9STElOSywJCSJQOV9STElOSyIgKQkJCVwKKwkJRU0oIFA5X1RNS0RJUiwJCSJQOV9UTUtESVIiICkJCQlcCisJCUVNKCBQOV9STUtESVIsCQkiUDlfUk1LRElSIiApCQkJXAorCQlFTSggUDlfVFJFTkFNRUFULAkiUDlfVFJFTkFNRUFUIiApCQlcCisJCUVNKCBQOV9SUkVOQU1FQVQsCSJQOV9SUkVOQU1FQVQiICkJCVwKKwkJRU0oIFA5X1RVTkxJTktBVCwJIlA5X1RVTkxJTktBVCIgKQkJXAorCQlFTSggUDlfUlVOTElOS0FULAkiUDlfUlVOTElOS0FUIiApCQlcCisJCUVNKCBQOV9UVkVSU0lPTiwJIlA5X1RWRVJTSU9OIiApCQkJXAorCQlFTSggUDlfUlZFUlNJT04sCSJQOV9SVkVSU0lPTiIgKQkJCVwKKwkJRU0oIFA5X1RBVVRILAkJIlA5X1RBVVRIIiApCQkJXAorCQlFTSggUDlfUkFVVEgsCQkiUDlfUkFVVEgiICkJCQlcCisJCUVNKCBQOV9UQVRUQUNILAkJIlA5X1RBVFRBQ0giICkJCQlcCisJCUVNKCBQOV9SQVRUQUNILAkJIlA5X1JBVFRBQ0giICkJCQlcCisJCUVNKCBQOV9URVJST1IsCQkiUDlfVEVSUk9SIiApCQkJXAorCQlFTSggUDlfUkVSUk9SLAkJIlA5X1JFUlJPUiIgKQkJCVwKKwkJRU0oIFA5X1RGTFVTSCwJCSJQOV9URkxVU0giICkJCQlcCisJCUVNKCBQOV9SRkxVU0gsCQkiUDlfUkZMVVNIIiApCQkJXAorCQlFTSggUDlfVFdBTEssCQkiUDlfVFdBTEsiICkJCQlcCisJCUVNKCBQOV9SV0FMSywJCSJQOV9SV0FMSyIgKQkJCVwKKwkJRU0oIFA5X1RPUEVOLAkJIlA5X1RPUEVOIiApCQkJXAorCQlFTSggUDlfUk9QRU4sCQkiUDlfUk9QRU4iICkJCQlcCisJCUVNKCBQOV9UQ1JFQVRFLAkJIlA5X1RDUkVBVEUiICkJCQlcCisJCUVNKCBQOV9SQ1JFQVRFLAkJIlA5X1JDUkVBVEUiICkJCQlcCisJCUVNKCBQOV9UUkVBRCwJCSJQOV9UUkVBRCIgKQkJCVwKKwkJRU0oIFA5X1JSRUFELAkJIlA5X1JSRUFEIiApCQkJXAorCQlFTSggUDlfVFdSSVRFLAkJIlA5X1RXUklURSIgKQkJCVwKKwkJRU0oIFA5X1JXUklURSwJCSJQOV9SV1JJVEUiICkJCQlcCisJCUVNKCBQOV9UQ0xVTkssCQkiUDlfVENMVU5LIiApCQkJXAorCQlFTSggUDlfUkNMVU5LLAkJIlA5X1JDTFVOSyIgKQkJCVwKKwkJRU0oIFA5X1RSRU1PVkUsCQkiUDlfVFJFTU9WRSIgKQkJCVwKKwkJRU0oIFA5X1JSRU1PVkUsCQkiUDlfUlJFTU9WRSIgKQkJCVwKKwkJRU0oIFA5X1RTVEFULAkJIlA5X1RTVEFUIiApCQkJXAorCQlFTSggUDlfUlNUQVQsCQkiUDlfUlNUQVQiICkJCQlcCisJCUVNKCBQOV9UV1NUQVQsCQkiUDlfVFdTVEFUIiApCQkJXAorCQlFTWUoUDlfUldTVEFULAkJIlA5X1JXU1RBVCIgKQorCisvKiBEZWZpbmUgRU0oKSB0byBleHBvcnQgdGhlIGVudW1zIHRvIHVzZXJzcGFjZSB2aWEgVFJBQ0VfREVGSU5FX0VOVU0oKSAqLworI3VuZGVmIEVNCisjdW5kZWYgRU1lCisjZGVmaW5lIEVNKGEsIGIpCVRSQUNFX0RFRklORV9FTlVNKGEpOworI2RlZmluZSBFTWUoYSwgYikJVFJBQ0VfREVGSU5FX0VOVU0oYSk7CisKK1A5X01TR19UCisKKy8qCisgKiBOb3cgcmVkZWZpbmUgdGhlIEVNKCkgYW5kIEVNZSgpIG1hY3JvcyB0byBtYXAgdGhlIGVudW1zIHRvIHRoZSBzdHJpbmdzCisgKiB0aGF0IHdpbGwgYmUgcHJpbnRlZCBpbiB0aGUgb3V0cHV0LgorICovCisjdW5kZWYgRU0KKyN1bmRlZiBFTWUKKyNkZWZpbmUgRU0oYSwgYikJeyBhLCBiIH0sCisjZGVmaW5lIEVNZShhLCBiKQl7IGEsIGIgfQorCiAjZGVmaW5lIHNob3dfOXBfb3AodHlwZSkJCQkJCQlcCi0JX19wcmludF9zeW1ib2xpYyh0eXBlLAkJCQkJCVwKLQkJCSB7IFA5X1RMRVJST1IsCQkiUDlfVExFUlJPUiIgfSwJCVwKLQkJCSB7IFA5X1JMRVJST1IsCQkiUDlfUkxFUlJPUiIgfSwJCVwKLQkJCSB7IFA5X1RTVEFURlMsCQkiUDlfVFNUQVRGUyIgfSwJCVwKLQkJCSB7IFA5X1JTVEFURlMsCQkiUDlfUlNUQVRGUyIgfSwJCVwKLQkJCSB7IFA5X1RMT1BFTiwJCSJQOV9UTE9QRU4iIH0sCQlcCi0JCQkgeyBQOV9STE9QRU4sCQkiUDlfUkxPUEVOIiB9LAkJXAotCQkJIHsgUDlfVExDUkVBVEUsCQkiUDlfVExDUkVBVEUiIH0sCVwKLQkJCSB7IFA5X1JMQ1JFQVRFLAkJIlA5X1JMQ1JFQVRFIiB9LAlcCi0JCQkgeyBQOV9UU1lNTElOSywJCSJQOV9UU1lNTElOSyIgfSwJXAotCQkJIHsgUDlfUlNZTUxJTkssCQkiUDlfUlNZTUxJTksiIH0sCVwKLQkJCSB7IFA5X1RNS05PRCwJCSJQOV9UTUtOT0QiIH0sCQlcCi0JCQkgeyBQOV9STUtOT0QsCQkiUDlfUk1LTk9EIiB9LAkJXAotCQkJIHsgUDlfVFJFTkFNRSwJCSJQOV9UUkVOQU1FIiB9LAkJXAotCQkJIHsgUDlfUlJFTkFNRSwJCSJQOV9SUkVOQU1FIiB9LAkJXAotCQkJIHsgUDlfVFJFQURMSU5LLAkiUDlfVFJFQURMSU5LIiB9LAlcCi0JCQkgeyBQOV9SUkVBRExJTkssCSJQOV9SUkVBRExJTksiIH0sCVwKLQkJCSB7IFA5X1RHRVRBVFRSLAkJIlA5X1RHRVRBVFRSIiB9LAlcCi0JCQkgeyBQOV9SR0VUQVRUUiwJCSJQOV9SR0VUQVRUUiIgfSwJXAotCQkJIHsgUDlfVFNFVEFUVFIsCQkiUDlfVFNFVEFUVFIiIH0sCVwKLQkJCSB7IFA5X1JTRVRBVFRSLAkJIlA5X1JTRVRBVFRSIiB9LAlcCi0JCQkgeyBQOV9UWEFUVFJXQUxLLAkiUDlfVFhBVFRSV0FMSyIgfSwJXAotCQkJIHsgUDlfUlhBVFRSV0FMSywJIlA5X1JYQVRUUldBTEsiIH0sCVwKLQkJCSB7IFA5X1RYQVRUUkNSRUFURSwJIlA5X1RYQVRUUkNSRUFURSIgfSwJXAotCQkJIHsgUDlfUlhBVFRSQ1JFQVRFLAkiUDlfUlhBVFRSQ1JFQVRFIiB9LAlcCi0JCQkgeyBQOV9UUkVBRERJUiwJCSJQOV9UUkVBRERJUiIgfSwJXAotCQkJIHsgUDlfUlJFQURESVIsCQkiUDlfUlJFQURESVIiIH0sCVwKLQkJCSB7IFA5X1RGU1lOQywJCSJQOV9URlNZTkMiIH0sCQlcCi0JCQkgeyBQOV9SRlNZTkMsCQkiUDlfUkZTWU5DIiB9LAkJXAotCQkJIHsgUDlfVExPQ0ssCQkiUDlfVExPQ0siIH0sCQlcCi0JCQkgeyBQOV9STE9DSywJCSJQOV9STE9DSyIgfSwJCVwKLQkJCSB7IFA5X1RHRVRMT0NLLAkJIlA5X1RHRVRMT0NLIiB9LAlcCi0JCQkgeyBQOV9SR0VUTE9DSywJCSJQOV9SR0VUTE9DSyIgfSwJXAotCQkJIHsgUDlfVExJTkssCQkiUDlfVExJTksiIH0sCQlcCi0JCQkgeyBQOV9STElOSywJCSJQOV9STElOSyIgfSwJCVwKLQkJCSB7IFA5X1RNS0RJUiwJCSJQOV9UTUtESVIiIH0sCQlcCi0JCQkgeyBQOV9STUtESVIsCQkiUDlfUk1LRElSIiB9LAkJXAotCQkJIHsgUDlfVFJFTkFNRUFULAkiUDlfVFJFTkFNRUFUIiB9LAlcCi0JCQkgeyBQOV9SUkVOQU1FQVQsCSJQOV9SUkVOQU1FQVQiIH0sCVwKLQkJCSB7IFA5X1RVTkxJTktBVCwJIlA5X1RVTkxJTktBVCIgfSwJXAotCQkJIHsgUDlfUlVOTElOS0FULAkiUDlfUlVOTElOS0FUIiB9LAlcCi0JCQkgeyBQOV9UVkVSU0lPTiwJCSJQOV9UVkVSU0lPTiIgfSwJXAotCQkJIHsgUDlfUlZFUlNJT04sCQkiUDlfUlZFUlNJT04iIH0sCVwKLQkJCSB7IFA5X1RBVVRILAkJIlA5X1RBVVRIIiB9LAkJXAotCQkJIHsgUDlfUkFVVEgsCQkiUDlfUkFVVEgiIH0sCQlcCi0JCQkgeyBQOV9UQVRUQUNILAkJIlA5X1RBVFRBQ0giIH0sCQlcCi0JCQkgeyBQOV9SQVRUQUNILAkJIlA5X1JBVFRBQ0giIH0sCQlcCi0JCQkgeyBQOV9URVJST1IsCQkiUDlfVEVSUk9SIiB9LAkJXAotCQkJIHsgUDlfUkVSUk9SLAkJIlA5X1JFUlJPUiIgfSwJCVwKLQkJCSB7IFA5X1RGTFVTSCwJCSJQOV9URkxVU0giIH0sCQlcCi0JCQkgeyBQOV9SRkxVU0gsCQkiUDlfUkZMVVNIIiB9LAkJXAotCQkJIHsgUDlfVFdBTEssCQkiUDlfVFdBTEsiIH0sCQlcCi0JCQkgeyBQOV9SV0FMSywJCSJQOV9SV0FMSyIgfSwJCVwKLQkJCSB7IFA5X1RPUEVOLAkJIlA5X1RPUEVOIiB9LAkJXAotCQkJIHsgUDlfUk9QRU4sCQkiUDlfUk9QRU4iIH0sCQlcCi0JCQkgeyBQOV9UQ1JFQVRFLAkJIlA5X1RDUkVBVEUiIH0sCQlcCi0JCQkgeyBQOV9SQ1JFQVRFLAkJIlA5X1JDUkVBVEUiIH0sCQlcCi0JCQkgeyBQOV9UUkVBRCwJCSJQOV9UUkVBRCIgfSwJCVwKLQkJCSB7IFA5X1JSRUFELAkJIlA5X1JSRUFEIiB9LAkJXAotCQkJIHsgUDlfVFdSSVRFLAkJIlA5X1RXUklURSIgfSwJCVwKLQkJCSB7IFA5X1JXUklURSwJCSJQOV9SV1JJVEUiIH0sCQlcCi0JCQkgeyBQOV9UQ0xVTkssCQkiUDlfVENMVU5LIiB9LAkJXAotCQkJIHsgUDlfUkNMVU5LLAkJIlA5X1JDTFVOSyIgfSwJCVwKLQkJCSB7IFA5X1RSRU1PVkUsCQkiUDlfVFJFTU9WRSIgfSwJCVwKLQkJCSB7IFA5X1JSRU1PVkUsCQkiUDlfUlJFTU9WRSIgfSwJCVwKLQkJCSB7IFA5X1RTVEFULAkJIlA5X1RTVEFUIiB9LAkJXAotCQkJIHsgUDlfUlNUQVQsCQkiUDlfUlNUQVQiIH0sCQlcCi0JCQkgeyBQOV9UV1NUQVQsCQkiUDlfVFdTVEFUIiB9LAkJXAotCQkJIHsgUDlfUldTVEFULAkJIlA5X1JXU1RBVCIgfSkKKwlfX3ByaW50X3N5bWJvbGljKHR5cGUsIFA5X01TR19UKQogCiBUUkFDRV9FVkVOVCg5cF9jbGllbnRfcmVxLAogCSAgICBUUF9QUk9UTyhzdHJ1Y3QgcDlfY2xpZW50ICpjbG50LCBpbnQ4X3QgdHlwZSwgaW50IHRhZyksCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9idHJmcy5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvYnRyZnMuaAppbmRleCAxZmFlY2VhLi41NzJlNjUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9idHJmcy5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2J0cmZzLmgKQEAgLTk2Miw3ICs5NjIsNyBAQAogCQlfX2VudHJ5LT5pcAk9IElQCiAJKSwKIAotCVRQX3ByaW50aygic3RhdGU9JXA7IG1hc2sgPSAlczsgY2FsbGVyID0gJXBGIiwgX19lbnRyeS0+c3RhdGUsCisJVFBfcHJpbnRrKCJzdGF0ZT0lcDsgbWFzayA9ICVzOyBjYWxsZXIgPSAlcFMiLCBfX2VudHJ5LT5zdGF0ZSwKIAkJICBzaG93X2dmcF9mbGFncyhfX2VudHJ5LT5tYXNrKSwgKHZvaWQgKilfX2VudHJ5LT5pcCkKICk7CiAKQEAgLTk4Miw3ICs5ODIsNyBAQAogCQlfX2VudHJ5LT5pcCA9IElQCiAJKSwKIAotCVRQX3ByaW50aygiIHN0YXRlPSVwOyBjYWxsZXIgPSAlcEYiLCBfX2VudHJ5LT5zdGF0ZSwKKwlUUF9wcmludGsoIiBzdGF0ZT0lcDsgY2FsbGVyID0gJXBTIiwgX19lbnRyeS0+c3RhdGUsCiAJCSAgKHZvaWQgKilfX2VudHJ5LT5pcCkKICk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2NtYS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvY21hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdjZDk2MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2NtYS5oCkBAIC0wLDAgKzEsNjYgQEAKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIGNtYQorCisjaWYgIWRlZmluZWQoX1RSQUNFX0NNQV9IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfVFJBQ0VfQ01BX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCitUUkFDRV9FVkVOVChjbWFfYWxsb2MsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBsb25nIHBmbiwgY29uc3Qgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCSB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBhbGlnbiksCisKKwlUUF9BUkdTKHBmbiwgcGFnZSwgY291bnQsIGFsaWduKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywgcGZuKQorCQlfX2ZpZWxkKGNvbnN0IHN0cnVjdCBwYWdlICosIHBhZ2UpCisJCV9fZmllbGQodW5zaWduZWQgaW50LCBjb3VudCkKKwkJX19maWVsZCh1bnNpZ25lZCBpbnQsIGFsaWduKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+cGZuID0gcGZuOworCQlfX2VudHJ5LT5wYWdlID0gcGFnZTsKKwkJX19lbnRyeS0+Y291bnQgPSBjb3VudDsKKwkJX19lbnRyeS0+YWxpZ24gPSBhbGlnbjsKKwkpLAorCisJVFBfcHJpbnRrKCJwZm49JWx4IHBhZ2U9JXAgY291bnQ9JXUgYWxpZ249JXUiLAorCQkgIF9fZW50cnktPnBmbiwKKwkJICBfX2VudHJ5LT5wYWdlLAorCQkgIF9fZW50cnktPmNvdW50LAorCQkgIF9fZW50cnktPmFsaWduKQorKTsKKworVFJBQ0VfRVZFTlQoY21hX3JlbGVhc2UsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBsb25nIHBmbiwgY29uc3Qgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCSB1bnNpZ25lZCBpbnQgY291bnQpLAorCisJVFBfQVJHUyhwZm4sIHBhZ2UsIGNvdW50KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywgcGZuKQorCQlfX2ZpZWxkKGNvbnN0IHN0cnVjdCBwYWdlICosIHBhZ2UpCisJCV9fZmllbGQodW5zaWduZWQgaW50LCBjb3VudCkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnBmbiA9IHBmbjsKKwkJX19lbnRyeS0+cGFnZSA9IHBhZ2U7CisJCV9fZW50cnktPmNvdW50ID0gY291bnQ7CisJKSwKKworCVRQX3ByaW50aygicGZuPSVseCBwYWdlPSVwIGNvdW50PSV1IiwKKwkJICBfX2VudHJ5LT5wZm4sCisJCSAgX19lbnRyeS0+cGFnZSwKKwkJICBfX2VudHJ5LT5jb3VudCkKKyk7CisKKyNlbmRpZiAvKiBfVFJBQ0VfQ01BX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQzLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQzLmgKaW5kZXggNjc5N2I5ZC4uN2YyMDcwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0My5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDMuaApAQCAtMTQ0LDcgKzE0NCw3IEBACiAJCV9fZW50cnktPmlwCT0gSVA7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgY2FsbGVyICVwRiIsCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgaW5vICVsdSBjYWxsZXIgJXBTIiwKIAkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8sICh2b2lkICopX19lbnRyeS0+aXApCiApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oCmluZGV4IDZlNWFiZDYuLjQ3ZmNhMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmgKQEAgLTI0MCw3ICsyNDAsNyBAQAogCQlfX2VudHJ5LT5pcAk9IElQOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IGNhbGxlciAlcEYiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGlubyAlbHUgY2FsbGVyICVwUyIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICAodW5zaWduZWQgbG9uZykgX19lbnRyeS0+aW5vLCAodm9pZCAqKV9fZW50cnktPmlwKQogKTsKQEAgLTE3NjIsNyArMTc2Miw3IEBACiAJCV9fZW50cnktPnJzdl9ibG9ja3MJID0gcnN2X2Jsb2NrczsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJWQsJWQgYmxvY2tzLCAlZCByc3ZfYmxvY2tzLCAlZCBjYWxsZXIgJXBGIiwKKwlUUF9wcmludGsoImRldiAlZCwlZCBibG9ja3MsICVkIHJzdl9ibG9ja3MsICVkIGNhbGxlciAlcFMiLAogCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCiAJCSAgX19lbnRyeS0+YmxvY2tzLCBfX2VudHJ5LT5yc3ZfYmxvY2tzLCAodm9pZCAqKV9fZW50cnktPmlwKQogKTsKQEAgLTE3ODQsNyArMTc4NCw3IEBACiAJCV9fZW50cnktPmJsb2NrcwkJID0gYmxvY2tzOwogCSksCiAKLQlUUF9wcmludGsoImRldiAlZCwlZCBibG9ja3MsICVkIGNhbGxlciAlcEYiLAorCVRQX3ByaW50aygiZGV2ICVkLCVkIGJsb2NrcywgJWQgY2FsbGVyICVwUyIsCiAJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKIAkJICBfX2VudHJ5LT5ibG9ja3MsICh2b2lkICopX19lbnRyeS0+aXApCiApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvZjJmcy5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZjJmcy5oCmluZGV4IDU0MjJkYmYuLjM2ZjQ1MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2YyZnMuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9mMmZzLmgKQEAgLTksNiArOSwzNiBAQAogI2RlZmluZSBzaG93X2RldihlbnRyeSkJCU1BSk9SKGVudHJ5LT5kZXYpLCBNSU5PUihlbnRyeS0+ZGV2KQogI2RlZmluZSBzaG93X2Rldl9pbm8oZW50cnkpCXNob3dfZGV2KGVudHJ5KSwgKHVuc2lnbmVkIGxvbmcpZW50cnktPmlubwogCitUUkFDRV9ERUZJTkVfRU5VTShOT0RFKTsKK1RSQUNFX0RFRklORV9FTlVNKERBVEEpOworVFJBQ0VfREVGSU5FX0VOVU0oTUVUQSk7CitUUkFDRV9ERUZJTkVfRU5VTShNRVRBX0ZMVVNIKTsKK1RSQUNFX0RFRklORV9FTlVNKENVUlNFR19IT1RfREFUQSk7CitUUkFDRV9ERUZJTkVfRU5VTShDVVJTRUdfV0FSTV9EQVRBKTsKK1RSQUNFX0RFRklORV9FTlVNKENVUlNFR19DT0xEX0RBVEEpOworVFJBQ0VfREVGSU5FX0VOVU0oQ1VSU0VHX0hPVF9OT0RFKTsKK1RSQUNFX0RFRklORV9FTlVNKENVUlNFR19XQVJNX05PREUpOworVFJBQ0VfREVGSU5FX0VOVU0oQ1VSU0VHX0NPTERfTk9ERSk7CitUUkFDRV9ERUZJTkVfRU5VTShOT19DSEVDS19UWVBFKTsKK1RSQUNFX0RFRklORV9FTlVNKEdDX0dSRUVEWSk7CitUUkFDRV9ERUZJTkVfRU5VTShHQ19DQik7CitUUkFDRV9ERUZJTkVfRU5VTShGR19HQyk7CitUUkFDRV9ERUZJTkVfRU5VTShCR19HQyk7CitUUkFDRV9ERUZJTkVfRU5VTShMRlMpOworVFJBQ0VfREVGSU5FX0VOVU0oU1NSKTsKK1RSQUNFX0RFRklORV9FTlVNKF9fUkVRX1JBSEVBRCk7CitUUkFDRV9ERUZJTkVfRU5VTShfX1JFUV9XUklURSk7CitUUkFDRV9ERUZJTkVfRU5VTShfX1JFUV9TWU5DKTsKK1RSQUNFX0RFRklORV9FTlVNKF9fUkVRX05PSURMRSk7CitUUkFDRV9ERUZJTkVfRU5VTShfX1JFUV9GTFVTSCk7CitUUkFDRV9ERUZJTkVfRU5VTShfX1JFUV9GVUEpOworVFJBQ0VfREVGSU5FX0VOVU0oX19SRVFfUFJJTyk7CitUUkFDRV9ERUZJTkVfRU5VTShfX1JFUV9NRVRBKTsKK1RSQUNFX0RFRklORV9FTlVNKENQX1VNT1VOVCk7CitUUkFDRV9ERUZJTkVfRU5VTShDUF9GQVNUQk9PVCk7CitUUkFDRV9ERUZJTkVfRU5VTShDUF9TWU5DKTsKK1RSQUNFX0RFRklORV9FTlVNKENQX0RJU0NBUkQpOworCiAjZGVmaW5lIHNob3dfYmxvY2tfdHlwZSh0eXBlKQkJCQkJCVwKIAlfX3ByaW50X3N5bWJvbGljKHR5cGUsCQkJCQkJXAogCQl7IE5PREUsCQkiTk9ERSIgfSwJCQkJXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaW50ZWwtc3N0LmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pbnRlbC1zc3QuaAppbmRleCA3NmM3MmQzLi5lZGMyNGU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pbnRlbC1zc3QuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pbnRlbC1zc3QuaApAQCAtMSw2ICsxLDEzIEBACiAjdW5kZWYgVFJBQ0VfU1lTVEVNCiAjZGVmaW5lIFRSQUNFX1NZU1RFTSBpbnRlbC1zc3QKIAorLyoKKyAqIFRoZSBUUkFDRV9TWVNURU1fVkFSIGRlZmF1bHRzIHRvIFRSQUNFX1NZU1RFTSwgYnV0IG11c3QgYmUgYQorICogbGVnaXRpbWF0ZSBDIHZhcmlhYmxlLiBJdCBpcyBub3QgZXhwb3J0ZWQgdG8gdXNlciBzcGFjZS4KKyAqLworI3VuZGVmIFRSQUNFX1NZU1RFTV9WQVIKKyNkZWZpbmUgVFJBQ0VfU1lTVEVNX1ZBUiBpbnRlbF9zc3QKKwogI2lmICFkZWZpbmVkKF9UUkFDRV9JTlRFTF9TU1RfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKICNkZWZpbmUgX1RSQUNFX0lOVEVMX1NTVF9ICiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2lycS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmgKaW5kZXggMzYwOGJlYi4uZmY4ZjZjMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmgKQEAgLTksMTkgKzksMzQgQEAKIHN0cnVjdCBpcnFhY3Rpb247CiBzdHJ1Y3Qgc29mdGlycV9hY3Rpb247CiAKLSNkZWZpbmUgc29mdGlycV9uYW1lKHNpcnEpIHsgc2lycSMjX1NPRlRJUlEsICNzaXJxIH0KKyNkZWZpbmUgU09GVElSUV9OQU1FX0xJU1QJCQkJXAorCQkJIHNvZnRpcnFfbmFtZShISSkJCVwKKwkJCSBzb2Z0aXJxX25hbWUoVElNRVIpCQlcCisJCQkgc29mdGlycV9uYW1lKE5FVF9UWCkJCVwKKwkJCSBzb2Z0aXJxX25hbWUoTkVUX1JYKQkJXAorCQkJIHNvZnRpcnFfbmFtZShCTE9DSykJCVwKKwkJCSBzb2Z0aXJxX25hbWUoQkxPQ0tfSU9QT0xMKQlcCisJCQkgc29mdGlycV9uYW1lKFRBU0tMRVQpCQlcCisJCQkgc29mdGlycV9uYW1lKFNDSEVEKQkJXAorCQkJIHNvZnRpcnFfbmFtZShIUlRJTUVSKQkJXAorCQkJIHNvZnRpcnFfbmFtZV9lbmQoUkNVKQorCisjdW5kZWYgc29mdGlycV9uYW1lCisjdW5kZWYgc29mdGlycV9uYW1lX2VuZAorCisjZGVmaW5lIHNvZnRpcnFfbmFtZShzaXJxKSBUUkFDRV9ERUZJTkVfRU5VTShzaXJxIyNfU09GVElSUSk7CisjZGVmaW5lIHNvZnRpcnFfbmFtZV9lbmQoc2lycSkgIFRSQUNFX0RFRklORV9FTlVNKHNpcnEjI19TT0ZUSVJRKTsKKworU09GVElSUV9OQU1FX0xJU1QKKworI3VuZGVmIHNvZnRpcnFfbmFtZQorI3VuZGVmIHNvZnRpcnFfbmFtZV9lbmQKKworI2RlZmluZSBzb2Z0aXJxX25hbWUoc2lycSkgeyBzaXJxIyNfU09GVElSUSwgI3NpcnEgfSwKKyNkZWZpbmUgc29mdGlycV9uYW1lX2VuZChzaXJxKSB7IHNpcnEjI19TT0ZUSVJRLCAjc2lycSB9CisKICNkZWZpbmUgc2hvd19zb2Z0aXJxX25hbWUodmFsKQkJCQlcCi0JX19wcmludF9zeW1ib2xpYyh2YWwsCQkJCVwKLQkJCSBzb2Z0aXJxX25hbWUoSEkpLAkJXAotCQkJIHNvZnRpcnFfbmFtZShUSU1FUiksCQlcCi0JCQkgc29mdGlycV9uYW1lKE5FVF9UWCksCQlcCi0JCQkgc29mdGlycV9uYW1lKE5FVF9SWCksCQlcCi0JCQkgc29mdGlycV9uYW1lKEJMT0NLKSwJCVwKLQkJCSBzb2Z0aXJxX25hbWUoQkxPQ0tfSU9QT0xMKSwJXAotCQkJIHNvZnRpcnFfbmFtZShUQVNLTEVUKSwJCVwKLQkJCSBzb2Z0aXJxX25hbWUoU0NIRUQpLAkJXAotCQkJIHNvZnRpcnFfbmFtZShIUlRJTUVSKSwJCVwKLQkJCSBzb2Z0aXJxX25hbWUoUkNVKSkKKwlfX3ByaW50X3N5bWJvbGljKHZhbCwgU09GVElSUV9OQU1FX0xJU1QpCiAKIC8qKgogICogaXJxX2hhbmRsZXJfZW50cnkgLSBjYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBpcnEgYWN0aW9uIGhhbmRsZXIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2xpYmF0YS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbGliYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwZmJkOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2xpYmF0YS5oCkBAIC0wLDAgKzEsMzI1IEBACisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBsaWJhdGEKKworI2lmICFkZWZpbmVkKF9UUkFDRV9MSUJBVEFfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX0xJQkFUQV9ICisKKyNpbmNsdWRlIDxsaW51eC9hdGEuaD4KKyNpbmNsdWRlIDxsaW51eC9saWJhdGEuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vfc2VxLmg+CisKKyNkZWZpbmUgYXRhX29wY29kZV9uYW1lKG9wY29kZSkJeyBvcGNvZGUsICNvcGNvZGUgfQorI2RlZmluZSBzaG93X29wY29kZV9uYW1lKHZhbCkJCQkJCVwKKwlfX3ByaW50X3N5bWJvbGljKHZhbCwJCQkJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX0RFVl9SRVNFVCksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9DSEtfUE9XRVIpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfU1RBTkRCWSksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9JRExFKSwJCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9FREQpLAkJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX0RPV05MT0FEX01JQ1JPKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfRE9XTkxPQURfTUlDUk9fRE1BKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfTk9QKSwJCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9GTFVTSCksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9GTFVTSF9FWFQpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfSURfQVRBKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX0lEX0FUQVBJKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1NFUlZJQ0UpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUkVBRCksCQkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUkVBRF9FWFQpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUkVBRF9RVUVVRUQpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUkVBRF9TVFJFQU1fRVhUKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUkVBRF9TVFJFQU1fRE1BX0VYVCksCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1dSSVRFKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1dSSVRFX0VYVCksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9XUklURV9RVUVVRUQpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfV1JJVEVfU1RSRUFNX0VYVCksCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1dSSVRFX1NUUkVBTV9ETUFfRVhUKSwgXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfV1JJVEVfRlVBX0VYVCksCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1dSSVRFX1FVRVVFRF9GVUFfRVhUKSwgXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfRlBETUFfUkVBRCksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9GUERNQV9XUklURSksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9GUERNQV9TRU5EKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX0ZQRE1BX1JFQ1YpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUElPX1JFQUQpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUElPX1JFQURfRVhUKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1BJT19XUklURSksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9QSU9fV1JJVEVfRVhUKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUkVBRF9NVUxUSSksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9SRUFEX01VTFRJX0VYVCksCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1dSSVRFX01VTFRJKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1dSSVRFX01VTFRJX0VYVCksCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1dSSVRFX01VTFRJX0ZVQV9FWFQpLAlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9TRVRfRkVBVFVSRVMpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfU0VUX01VTFRJKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1BBQ0tFVCksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9WRVJJRlkpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfVkVSSUZZX0VYVCksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9XUklURV9VTkNPUlJfRVhUKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfU1RBTkRCWU5PVzEpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfSURMRUlNTUVESUFURSksCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1NMRUVQKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX0lOSVRfREVWX1BBUkFNUyksCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1JFQURfTkFUSVZFX01BWCksCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1JFQURfTkFUSVZFX01BWF9FWFQpLAlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9TRVRfTUFYKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1NFVF9NQVhfRVhUKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1JFQURfTE9HX0VYVCksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9XUklURV9MT0dfRVhUKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUkVBRF9MT0dfRE1BX0VYVCksCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1dSSVRFX0xPR19ETUFfRVhUKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfVFJVU1RFRF9OT05EQVRBKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfVFJVU1RFRF9SQ1YpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfVFJVU1RFRF9SQ1ZfRE1BKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfVFJVU1RFRF9TTkQpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfVFJVU1RFRF9TTkRfRE1BKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUE1QX1JFQUQpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUE1QX1JFQURfRE1BKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1BNUF9XUklURSksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9QTVBfV1JJVEVfRE1BKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfQ09ORl9PVkVSTEFZKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1NFQ19TRVRfUEFTUyksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9TRUNfVU5MT0NLKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1NFQ19FUkFTRV9QUkVQKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfU0VDX0VSQVNFX1VOSVQpLAlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9TRUNfRlJFRVpFX0xPQ0spLAlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9TRUNfRElTQUJMRV9QQVNTKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfQ09ORklHX1NUUkVBTSksCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1NNQVJUKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX01FRElBX0xPQ0spLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfTUVESUFfVU5MT0NLKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX0RTTSksCQkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfQ0hLX01FRF9DUkRfVFlQKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfQ0ZBX1JFUV9FWFRfRVJSKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfQ0ZBX1dSSVRFX05FKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX0NGQV9UUkFOU19TRUNUKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfQ0ZBX0VSQVNFKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX0NGQV9XUklURV9NVUxUX05FKSwJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfUkVRX1NFTlNFX0RBVEEpLAlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9TQU5JVElaRV9ERVZJQ0UpLAlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9SRVNUT1JFKSwJCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1JFQURfTE9ORyksCQlcCisJCSBhdGFfb3Bjb2RlX25hbWUoQVRBX0NNRF9SRUFEX0xPTkdfT05DRSksCVwKKwkJIGF0YV9vcGNvZGVfbmFtZShBVEFfQ01EX1dSSVRFX0xPTkcpLAkJXAorCQkgYXRhX29wY29kZV9uYW1lKEFUQV9DTURfV1JJVEVfTE9OR19PTkNFKSkKKworI2RlZmluZSBhdGFfZXJyb3JfbmFtZShyZXN1bHQpCXsgcmVzdWx0LCAjcmVzdWx0IH0KKyNkZWZpbmUgc2hvd19lcnJvcl9uYW1lKHZhbCkJCQkJXAorCV9fcHJpbnRfc3ltYm9saWModmFsLAkJCQlcCisJCWF0YV9lcnJvcl9uYW1lKEFUQV9JQ1JDKSwJCVwKKwkJYXRhX2Vycm9yX25hbWUoQVRBX1VOQyksCQlcCisJCWF0YV9lcnJvcl9uYW1lKEFUQV9NQyksCQkJXAorCQlhdGFfZXJyb3JfbmFtZShBVEFfSURORiksCQlcCisJCWF0YV9lcnJvcl9uYW1lKEFUQV9NQ1IpLAkJXAorCQlhdGFfZXJyb3JfbmFtZShBVEFfQUJPUlRFRCksCQlcCisJCWF0YV9lcnJvcl9uYW1lKEFUQV9UUkswTkYpLAkJXAorCQlhdGFfZXJyb3JfbmFtZShBVEFfQU1ORikpCisKKyNkZWZpbmUgYXRhX3Byb3RvY29sX25hbWUocHJvdG8pCXsgcHJvdG8sICNwcm90byB9CisjZGVmaW5lIHNob3dfcHJvdG9jb2xfbmFtZSh2YWwpCQkJCVwKKwlfX3ByaW50X3N5bWJvbGljKHZhbCwJCQkJXAorCQlhdGFfcHJvdG9jb2xfbmFtZShBVEFfUFJPVF9VTktOT1dOKSwJXAorCQlhdGFfcHJvdG9jb2xfbmFtZShBVEFfUFJPVF9OT0RBVEEpLAlcCisJCWF0YV9wcm90b2NvbF9uYW1lKEFUQV9QUk9UX1BJTyksCVwKKwkJYXRhX3Byb3RvY29sX25hbWUoQVRBX1BST1RfRE1BKSwJXAorCQlhdGFfcHJvdG9jb2xfbmFtZShBVEFfUFJPVF9OQ1EpLAlcCisJCWF0YV9wcm90b2NvbF9uYW1lKEFUQVBJX1BST1RfTk9EQVRBKSwJXAorCQlhdGFfcHJvdG9jb2xfbmFtZShBVEFQSV9QUk9UX1BJTyksCVwKKwkJYXRhX3Byb3RvY29sX25hbWUoQVRBUElfUFJPVF9ETUEpKQorCitjb25zdCBjaGFyICpsaWJhdGFfdHJhY2VfcGFyc2Vfc3RhdHVzKHN0cnVjdCB0cmFjZV9zZXEqLCB1bnNpZ25lZCBjaGFyKTsKKyNkZWZpbmUgX19wYXJzZV9zdGF0dXMocykgbGliYXRhX3RyYWNlX3BhcnNlX3N0YXR1cyhwLCBzKQorCitjb25zdCBjaGFyICpsaWJhdGFfdHJhY2VfcGFyc2VfZWhfYWN0aW9uKHN0cnVjdCB0cmFjZV9zZXEgKiwgdW5zaWduZWQgaW50KTsKKyNkZWZpbmUgX19wYXJzZV9laF9hY3Rpb24oYSkgbGliYXRhX3RyYWNlX3BhcnNlX2VoX2FjdGlvbihwLCBhKQorCitjb25zdCBjaGFyICpsaWJhdGFfdHJhY2VfcGFyc2VfZWhfZXJyX21hc2soc3RydWN0IHRyYWNlX3NlcSAqLCB1bnNpZ25lZCBpbnQpOworI2RlZmluZSBfX3BhcnNlX2VoX2Vycl9tYXNrKG0pIGxpYmF0YV90cmFjZV9wYXJzZV9laF9lcnJfbWFzayhwLCBtKQorCitjb25zdCBjaGFyICpsaWJhdGFfdHJhY2VfcGFyc2VfcWNfZmxhZ3Moc3RydWN0IHRyYWNlX3NlcSAqLCB1bnNpZ25lZCBpbnQpOworI2RlZmluZSBfX3BhcnNlX3FjX2ZsYWdzKGYpIGxpYmF0YV90cmFjZV9wYXJzZV9xY19mbGFncyhwLCBmKQorCitUUkFDRV9FVkVOVChhdGFfcWNfaXNzdWUsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKSwKKworCVRQX0FSR1MocWMpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCggdW5zaWduZWQgaW50LAlhdGFfcG9ydCApCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwJYXRhX2RldgkpCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwJdGFnCSkKKwkJX19maWVsZCggdW5zaWduZWQgY2hhciwJY21kCSkKKwkJX19maWVsZCggdW5zaWduZWQgY2hhciwJZGV2CSkKKwkJX19maWVsZCggdW5zaWduZWQgY2hhciwJbGJhbAkpCisJCV9fZmllbGQoIHVuc2lnbmVkIGNoYXIsCWxiYW0JKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBjaGFyLAlsYmFoCSkKKwkJX19maWVsZCggdW5zaWduZWQgY2hhciwJbnNlY3QJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBjaGFyLAlmZWF0dXJlCSkKKwkJX19maWVsZCggdW5zaWduZWQgY2hhciwJaG9iX2xiYWwgKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBjaGFyLAlob2JfbGJhbSApCisJCV9fZmllbGQoIHVuc2lnbmVkIGNoYXIsCWhvYl9sYmFoICkKKwkJX19maWVsZCggdW5zaWduZWQgY2hhciwJaG9iX25zZWN0ICkKKwkJX19maWVsZCggdW5zaWduZWQgY2hhciwJaG9iX2ZlYXR1cmUgKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBjaGFyLAljdGwgKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBjaGFyLAlwcm90byApCisJCV9fZmllbGQoIHVuc2lnbmVkIGxvbmcsCWZsYWdzICkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmF0YV9wb3J0CT0gcWMtPmFwLT5wcmludF9pZDsKKwkJX19lbnRyeS0+YXRhX2Rldgk9IHFjLT5kZXYtPmxpbmstPnBtcCArIHFjLT5kZXYtPmRldm5vOworCQlfX2VudHJ5LT50YWcJCT0gcWMtPnRhZzsKKwkJX19lbnRyeS0+cHJvdG8JCT0gcWMtPnRmLnByb3RvY29sOworCQlfX2VudHJ5LT5jbWQJCT0gcWMtPnRmLmNvbW1hbmQ7CisJCV9fZW50cnktPmRldgkJPSBxYy0+dGYuZGV2aWNlOworCQlfX2VudHJ5LT5sYmFsCQk9IHFjLT50Zi5sYmFsOworCQlfX2VudHJ5LT5sYmFtCQk9IHFjLT50Zi5sYmFtOworCQlfX2VudHJ5LT5sYmFoCQk9IHFjLT50Zi5sYmFoOworCQlfX2VudHJ5LT5ob2JfbGJhbAk9IHFjLT50Zi5ob2JfbGJhbDsKKwkJX19lbnRyeS0+aG9iX2xiYW0JPSBxYy0+dGYuaG9iX2xiYW07CisJCV9fZW50cnktPmhvYl9sYmFoCT0gcWMtPnRmLmhvYl9sYmFoOworCQlfX2VudHJ5LT5mZWF0dXJlCT0gcWMtPnRmLmZlYXR1cmU7CisJCV9fZW50cnktPmhvYl9mZWF0dXJlCT0gcWMtPnRmLmhvYl9mZWF0dXJlOworCQlfX2VudHJ5LT5uc2VjdAkJPSBxYy0+dGYubnNlY3Q7CisJCV9fZW50cnktPmhvYl9uc2VjdAk9IHFjLT50Zi5ob2JfbnNlY3Q7CisJKSwKKworCVRQX3ByaW50aygiYXRhX3BvcnQ9JXUgYXRhX2Rldj0ldSB0YWc9JWQgcHJvdG89JXMgY21kPSVzICIgXAorCQkgICIgdGY9KCUwMngvJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4LyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC8lMDJ4KSIsCisJCSAgX19lbnRyeS0+YXRhX3BvcnQsIF9fZW50cnktPmF0YV9kZXYsIF9fZW50cnktPnRhZywKKwkJICBzaG93X3Byb3RvY29sX25hbWUoX19lbnRyeS0+cHJvdG8pLAorCQkgIHNob3dfb3Bjb2RlX25hbWUoX19lbnRyeS0+Y21kKSwKKwkJICBfX2VudHJ5LT5jbWQsIF9fZW50cnktPmZlYXR1cmUsIF9fZW50cnktPm5zZWN0LAorCQkgIF9fZW50cnktPmxiYWwsIF9fZW50cnktPmxiYW0sIF9fZW50cnktPmxiYWgsCisJCSAgX19lbnRyeS0+aG9iX2ZlYXR1cmUsIF9fZW50cnktPmhvYl9uc2VjdCwKKwkJICBfX2VudHJ5LT5ob2JfbGJhbCwgX19lbnRyeS0+aG9iX2xiYW0sIF9fZW50cnktPmhvYl9sYmFoLAorCQkgIF9fZW50cnktPmRldikKKyk7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoYXRhX3FjX2NvbXBsZXRlX3RlbXBsYXRlLAorCisJVFBfUFJPVE8oc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyksCisKKwlUUF9BUkdTKHFjKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwJYXRhX3BvcnQgKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCWF0YV9kZXYJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCXRhZwkpCisJCV9fZmllbGQoIHVuc2lnbmVkIGNoYXIsCXN0YXR1cwkpCisJCV9fZmllbGQoIHVuc2lnbmVkIGNoYXIsCWRldgkpCisJCV9fZmllbGQoIHVuc2lnbmVkIGNoYXIsCWxiYWwJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBjaGFyLAlsYmFtCSkKKwkJX19maWVsZCggdW5zaWduZWQgY2hhciwJbGJhaAkpCisJCV9fZmllbGQoIHVuc2lnbmVkIGNoYXIsCW5zZWN0CSkKKwkJX19maWVsZCggdW5zaWduZWQgY2hhciwJZXJyb3IJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBjaGFyLAlob2JfbGJhbCApCisJCV9fZmllbGQoIHVuc2lnbmVkIGNoYXIsCWhvYl9sYmFtICkKKwkJX19maWVsZCggdW5zaWduZWQgY2hhciwJaG9iX2xiYWggKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBjaGFyLAlob2JfbnNlY3QgKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBjaGFyLAlob2JfZmVhdHVyZSApCisJCV9fZmllbGQoIHVuc2lnbmVkIGNoYXIsCWN0bCApCisJCV9fZmllbGQoIHVuc2lnbmVkIGxvbmcsCWZsYWdzICkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmF0YV9wb3J0CT0gcWMtPmFwLT5wcmludF9pZDsKKwkJX19lbnRyeS0+YXRhX2Rldgk9IHFjLT5kZXYtPmxpbmstPnBtcCArIHFjLT5kZXYtPmRldm5vOworCQlfX2VudHJ5LT50YWcJCT0gcWMtPnRhZzsKKwkJX19lbnRyeS0+c3RhdHVzCQk9IHFjLT5yZXN1bHRfdGYuY29tbWFuZDsKKwkJX19lbnRyeS0+ZGV2CQk9IHFjLT5yZXN1bHRfdGYuZGV2aWNlOworCQlfX2VudHJ5LT5sYmFsCQk9IHFjLT5yZXN1bHRfdGYubGJhbDsKKwkJX19lbnRyeS0+bGJhbQkJPSBxYy0+cmVzdWx0X3RmLmxiYW07CisJCV9fZW50cnktPmxiYWgJCT0gcWMtPnJlc3VsdF90Zi5sYmFoOworCQlfX2VudHJ5LT5ob2JfbGJhbAk9IHFjLT5yZXN1bHRfdGYuaG9iX2xiYWw7CisJCV9fZW50cnktPmhvYl9sYmFtCT0gcWMtPnJlc3VsdF90Zi5ob2JfbGJhbTsKKwkJX19lbnRyeS0+aG9iX2xiYWgJPSBxYy0+cmVzdWx0X3RmLmhvYl9sYmFoOworCQlfX2VudHJ5LT5lcnJvcgkJPSBxYy0+cmVzdWx0X3RmLmZlYXR1cmU7CisJCV9fZW50cnktPmhvYl9mZWF0dXJlCT0gcWMtPnJlc3VsdF90Zi5ob2JfZmVhdHVyZTsKKwkJX19lbnRyeS0+bnNlY3QJCT0gcWMtPnJlc3VsdF90Zi5uc2VjdDsKKwkJX19lbnRyeS0+aG9iX25zZWN0CT0gcWMtPnJlc3VsdF90Zi5ob2JfbnNlY3Q7CisJKSwKKworCVRQX3ByaW50aygiYXRhX3BvcnQ9JXUgYXRhX2Rldj0ldSB0YWc9JWQgZmxhZ3M9JXMgc3RhdHVzPSVzICIgXAorCQkgICIgcmVzPSglMDJ4LyUwMng6JTAyeDolMDJ4OiUwMng6JTAyeC8lMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngvJTAyeCkiLAorCQkgIF9fZW50cnktPmF0YV9wb3J0LCBfX2VudHJ5LT5hdGFfZGV2LCBfX2VudHJ5LT50YWcsCisJCSAgX19wYXJzZV9xY19mbGFncyhfX2VudHJ5LT5mbGFncyksCisJCSAgX19wYXJzZV9zdGF0dXMoX19lbnRyeS0+c3RhdHVzKSwKKwkJICBfX2VudHJ5LT5zdGF0dXMsIF9fZW50cnktPmVycm9yLCBfX2VudHJ5LT5uc2VjdCwKKwkJICBfX2VudHJ5LT5sYmFsLCBfX2VudHJ5LT5sYmFtLCBfX2VudHJ5LT5sYmFoLAorCQkgIF9fZW50cnktPmhvYl9mZWF0dXJlLCBfX2VudHJ5LT5ob2JfbnNlY3QsCisJCSAgX19lbnRyeS0+aG9iX2xiYWwsIF9fZW50cnktPmhvYl9sYmFtLCBfX2VudHJ5LT5ob2JfbGJhaCwKKwkJICBfX2VudHJ5LT5kZXYpCispOworCitERUZJTkVfRVZFTlQoYXRhX3FjX2NvbXBsZXRlX3RlbXBsYXRlLCBhdGFfcWNfY29tcGxldGVfaW50ZXJuYWwsCisJICAgICBUUF9QUk9UTyhzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKSwKKwkgICAgIFRQX0FSR1MocWMpKTsKKworREVGSU5FX0VWRU5UKGF0YV9xY19jb21wbGV0ZV90ZW1wbGF0ZSwgYXRhX3FjX2NvbXBsZXRlX2ZhaWxlZCwKKwkgICAgIFRQX1BST1RPKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpLAorCSAgICAgVFBfQVJHUyhxYykpOworCitERUZJTkVfRVZFTlQoYXRhX3FjX2NvbXBsZXRlX3RlbXBsYXRlLCBhdGFfcWNfY29tcGxldGVfZG9uZSwKKwkgICAgIFRQX1BST1RPKHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpLAorCSAgICAgVFBfQVJHUyhxYykpOworCitUUkFDRV9FVkVOVChhdGFfZWhfbGlua19hdXRvcHN5LAorCisJVFBfUFJPVE8oc3RydWN0IGF0YV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGVoX2FjdGlvbiwgdW5zaWduZWQgaW50IGVoX2Vycl9tYXNrKSwKKworCVRQX0FSR1MoZGV2LCBlaF9hY3Rpb24sIGVoX2Vycl9tYXNrKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwJYXRhX3BvcnQgKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCWF0YV9kZXYJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCWVoX2FjdGlvbiApCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwJZWhfZXJyX21hc2spCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5hdGFfcG9ydAk9IGRldi0+bGluay0+YXAtPnByaW50X2lkOworCQlfX2VudHJ5LT5hdGFfZGV2CT0gZGV2LT5saW5rLT5wbXAgKyBkZXYtPmRldm5vOworCQlfX2VudHJ5LT5laF9hY3Rpb24JPSBlaF9hY3Rpb247CisJCV9fZW50cnktPmVoX2Vycl9tYXNrCT0gZWhfZXJyX21hc2s7CisJKSwKKworCVRQX3ByaW50aygiYXRhX3BvcnQ9JXUgYXRhX2Rldj0ldSBlaF9hY3Rpb249JXMgZXJyX21hc2s9JXMiLAorCQkgIF9fZW50cnktPmF0YV9wb3J0LCBfX2VudHJ5LT5hdGFfZGV2LAorCQkgIF9fcGFyc2VfZWhfYWN0aW9uKF9fZW50cnktPmVoX2FjdGlvbiksCisJCSAgX19wYXJzZV9laF9lcnJfbWFzayhfX2VudHJ5LT5laF9lcnJfbWFzaykpCispOworCitUUkFDRV9FVkVOVChhdGFfZWhfbGlua19hdXRvcHN5X3FjLAorCisJVFBfUFJPVE8oc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYyksCisKKwlUUF9BUkdTKHFjKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwJYXRhX3BvcnQgKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCWF0YV9kZXYJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCXRhZwkpCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwJcWNfZmxhZ3MgKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCWVoX2Vycl9tYXNrKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+YXRhX3BvcnQJPSBxYy0+YXAtPnByaW50X2lkOworCQlfX2VudHJ5LT5hdGFfZGV2CT0gcWMtPmRldi0+bGluay0+cG1wICsgcWMtPmRldi0+ZGV2bm87CisJCV9fZW50cnktPnRhZwkJPSBxYy0+dGFnOworCQlfX2VudHJ5LT5xY19mbGFncwk9IHFjLT5mbGFnczsKKwkJX19lbnRyeS0+ZWhfZXJyX21hc2sJPSBxYy0+ZXJyX21hc2s7CisJKSwKKworCVRQX3ByaW50aygiYXRhX3BvcnQ9JXUgYXRhX2Rldj0ldSB0YWc9JWQgZmxhZ3M9JXMgZXJyX21hc2s9JXMiLAorCQkgIF9fZW50cnktPmF0YV9wb3J0LCBfX2VudHJ5LT5hdGFfZGV2LCBfX2VudHJ5LT50YWcsCisJCSAgX19wYXJzZV9xY19mbGFncyhfX2VudHJ5LT5xY19mbGFncyksCisJCSAgX19wYXJzZV9laF9lcnJfbWFzayhfX2VudHJ5LT5laF9lcnJfbWFzaykpCispOworCisjZW5kaWYgLyogIF9UUkFDRV9MSUJBVEFfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL21pZ3JhdGUuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL21pZ3JhdGUuaAppbmRleCBkZDJiNTQ2Li41MzliMjVhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9taWdyYXRlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbWlncmF0ZS5oCkBAIC03LDE4ICs3LDQwIEBACiAjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgogCiAjZGVmaW5lIE1JR1JBVEVfTU9ERQkJCQkJCVwKLQl7TUlHUkFURV9BU1lOQywJCSJNSUdSQVRFX0FTWU5DIn0sCQlcCi0Je01JR1JBVEVfU1lOQ19MSUdIVCwJIk1JR1JBVEVfU1lOQ19MSUdIVCJ9LAkJXAotCXtNSUdSQVRFX1NZTkMsCQkiTUlHUkFURV9TWU5DIn0JCQorCUVNKCBNSUdSQVRFX0FTWU5DLAkiTUlHUkFURV9BU1lOQyIpCQlcCisJRU0oIE1JR1JBVEVfU1lOQ19MSUdIVCwJIk1JR1JBVEVfU1lOQ19MSUdIVCIpCQlcCisJRU1lKE1JR1JBVEVfU1lOQywJIk1JR1JBVEVfU1lOQyIpCisKIAogI2RlZmluZSBNSUdSQVRFX1JFQVNPTgkJCQkJCVwKLQl7TVJfQ09NUEFDVElPTiwJCSJjb21wYWN0aW9uIn0sCQkJXAotCXtNUl9NRU1PUllfRkFJTFVSRSwJIm1lbW9yeV9mYWlsdXJlIn0sCQlcCi0Je01SX01FTU9SWV9IT1RQTFVHLAkibWVtb3J5X2hvdHBsdWcifSwJCVwKLQl7TVJfU1lTQ0FMTCwJCSJzeXNjYWxsX29yX2NwdXNldCJ9LAkJXAotCXtNUl9NRU1QT0xJQ1lfTUJJTkQsCSJtZW1wb2xpY3lfbWJpbmQifSwJCVwKLQl7TVJfTlVNQV9NSVNQTEFDRUQsCSJudW1hX21pc3BsYWNlZCJ9LAkJXAotCXtNUl9DTUEsCQkiY21hIn0KKwlFTSggTVJfQ09NUEFDVElPTiwJImNvbXBhY3Rpb24iKQkJCVwKKwlFTSggTVJfTUVNT1JZX0ZBSUxVUkUsCSJtZW1vcnlfZmFpbHVyZSIpCQlcCisJRU0oIE1SX01FTU9SWV9IT1RQTFVHLAkibWVtb3J5X2hvdHBsdWciKQkJXAorCUVNKCBNUl9TWVNDQUxMLAkJInN5c2NhbGxfb3JfY3B1c2V0IikJCVwKKwlFTSggTVJfTUVNUE9MSUNZX01CSU5ELAkibWVtcG9saWN5X21iaW5kIikJCVwKKwlFTSggTVJfTlVNQV9NSVNQTEFDRUQsCSJudW1hX21pc3BsYWNlZCIpCQlcCisJRU1lKE1SX0NNQSwJCSJjbWEiKQorCisvKgorICogRmlyc3QgZGVmaW5lIHRoZSBlbnVtcyBpbiB0aGUgYWJvdmUgbWFjcm9zIHRvIGJlIGV4cG9ydGVkIHRvIHVzZXJzcGFjZQorICogdmlhIFRSQUNFX0RFRklORV9FTlVNKCkuCisgKi8KKyN1bmRlZiBFTQorI3VuZGVmIEVNZQorI2RlZmluZSBFTShhLCBiKQlUUkFDRV9ERUZJTkVfRU5VTShhKTsKKyNkZWZpbmUgRU1lKGEsIGIpCVRSQUNFX0RFRklORV9FTlVNKGEpOworCitNSUdSQVRFX01PREUKK01JR1JBVEVfUkVBU09OCisKKy8qCisgKiBOb3cgcmVkZWZpbmUgdGhlIEVNKCkgYW5kIEVNZSgpIG1hY3JvcyB0byBtYXAgdGhlIGVudW1zIHRvIHRoZSBzdHJpbmdzCisgKiB0aGF0IHdpbGwgYmUgcHJpbnRlZCBpbiB0aGUgb3V0cHV0LgorICovCisjdW5kZWYgRU0KKyN1bmRlZiBFTWUKKyNkZWZpbmUgRU0oYSwgYikJe2EsIGJ9LAorI2RlZmluZSBFTWUoYSwgYikJe2EsIGJ9CiAKIFRSQUNFX0VWRU5UKG1tX21pZ3JhdGVfcGFnZXMsCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL21vZHVsZS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbW9kdWxlLmgKaW5kZXggODFjNGMxOC4uMjhjNDU5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvbW9kdWxlLmgKQEAgLTg0LDcgKzg0LDcgQEAKIAkJX19hc3NpZ25fc3RyKG5hbWUsIG1vZC0+bmFtZSk7CiAJKSwKIAotCVRQX3ByaW50aygiJXMgY2FsbF9zaXRlPSVwZiByZWZjbnQ9JWQiLAorCVRQX3ByaW50aygiJXMgY2FsbF9zaXRlPSVwcyByZWZjbnQ9JWQiLAogCQkgIF9fZ2V0X3N0cihuYW1lKSwgKHZvaWQgKilfX2VudHJ5LT5pcCwgX19lbnRyeS0+cmVmY250KQogKTsKIApAQCAtMTIxLDcgKzEyMSw3IEBACiAJCV9fYXNzaWduX3N0cihuYW1lLCBuYW1lKTsKIAkpLAogCi0JVFBfcHJpbnRrKCIlcyB3YWl0PSVkIGNhbGxfc2l0ZT0lcGYiLAorCVRQX3ByaW50aygiJXMgd2FpdD0lZCBjYWxsX3NpdGU9JXBzIiwKIAkJICBfX2dldF9zdHIobmFtZSksIChpbnQpX19lbnRyeS0+d2FpdCwgKHZvaWQgKilfX2VudHJ5LT5pcCkKICk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3JhbmRvbS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcmFuZG9tLmgKaW5kZXggODA1YWY2ZC4uNDY4NGRlMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvcmFuZG9tLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcmFuZG9tLmgKQEAgLTIyLDcgKzIyLDcgQEAKIAkJX19lbnRyeS0+SVAJCT0gSVA7CiAJKSwKIAotCVRQX3ByaW50aygiYnl0ZXMgJWQgY2FsbGVyICVwRiIsCisJVFBfcHJpbnRrKCJieXRlcyAlZCBjYWxsZXIgJXBTIiwKIAkJX19lbnRyeS0+Ynl0ZXMsICh2b2lkICopX19lbnRyeS0+SVApCiApOwogCkBAIC00Myw3ICs0Myw3IEBACiAJCV9fZW50cnktPklQCQk9IElQOwogCSksCiAKLQlUUF9wcmludGsoIiVzIHBvb2w6IGJ5dGVzICVkIGNhbGxlciAlcEYiLAorCVRQX3ByaW50aygiJXMgcG9vbDogYnl0ZXMgJWQgY2FsbGVyICVwUyIsCiAJCSAgX19lbnRyeS0+cG9vbF9uYW1lLCBfX2VudHJ5LT5ieXRlcywgKHZvaWQgKilfX2VudHJ5LT5JUCkKICk7CiAKQEAgLTgyLDcgKzgyLDcgQEAKIAkpLAogCiAJVFBfcHJpbnRrKCIlcyBwb29sOiBiaXRzICVkIGVudHJvcHlfY291bnQgJWQgZW50cm9weV90b3RhbCAlZCAiCi0JCSAgImNhbGxlciAlcEYiLCBfX2VudHJ5LT5wb29sX25hbWUsIF9fZW50cnktPmJpdHMsCisJCSAgImNhbGxlciAlcFMiLCBfX2VudHJ5LT5wb29sX25hbWUsIF9fZW50cnktPmJpdHMsCiAJCSAgX19lbnRyeS0+ZW50cm9weV9jb3VudCwgX19lbnRyeS0+ZW50cm9weV90b3RhbCwKIAkJICAodm9pZCAqKV9fZW50cnktPklQKQogKTsKQEAgLTIwNyw3ICsyMDcsNyBAQAogCQlfX2VudHJ5LT5JUAkJPSBJUDsKIAkpLAogCi0JVFBfcHJpbnRrKCJuYnl0ZXMgJWQgY2FsbGVyICVwRiIsIF9fZW50cnktPm5ieXRlcywgKHZvaWQgKilfX2VudHJ5LT5JUCkKKwlUUF9wcmludGsoIm5ieXRlcyAlZCBjYWxsZXIgJXBTIiwgX19lbnRyeS0+bmJ5dGVzLCAodm9pZCAqKV9fZW50cnktPklQKQogKTsKIAogREVGSU5FX0VWRU5UKHJhbmRvbV9fZ2V0X3JhbmRvbV9ieXRlcywgZ2V0X3JhbmRvbV9ieXRlcywKQEAgLTI0Miw3ICsyNDIsNyBAQAogCQlfX2VudHJ5LT5JUAkJPSBJUDsKIAkpLAogCi0JVFBfcHJpbnRrKCIlcyBwb29sOiBuYnl0ZXMgJWQgZW50cm9weV9jb3VudCAlZCBjYWxsZXIgJXBGIiwKKwlUUF9wcmludGsoIiVzIHBvb2w6IG5ieXRlcyAlZCBlbnRyb3B5X2NvdW50ICVkIGNhbGxlciAlcFMiLAogCQkgIF9fZW50cnktPnBvb2xfbmFtZSwgX19lbnRyeS0+bmJ5dGVzLCBfX2VudHJ5LT5lbnRyb3B5X2NvdW50LAogCQkgICh2b2lkICopX19lbnRyeS0+SVApCiApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvcmVnbWFwLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9yZWdtYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNkNTYxNS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9yZWdtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0jdW5kZWYgVFJBQ0VfU1lTVEVNCi0jZGVmaW5lIFRSQUNFX1NZU1RFTSByZWdtYXAKLQotI2lmICFkZWZpbmVkKF9UUkFDRV9SRUdNQVBfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKLSNkZWZpbmUgX1RSQUNFX1JFR01BUF9ICi0KLSNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KLQotc3RydWN0IGRldmljZTsKLXN0cnVjdCByZWdtYXA7Ci0KLS8qCi0gKiBMb2cgcmVnaXN0ZXIgZXZlbnRzCi0gKi8KLURFQ0xBUkVfRVZFTlRfQ0xBU1MocmVnbWFwX3JlZywKLQotCVRQX1BST1RPKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZywKLQkJIHVuc2lnbmVkIGludCB2YWwpLAotCi0JVFBfQVJHUyhkZXYsIHJlZywgdmFsKSwKLQotCVRQX1NUUlVDVF9fZW50cnkoCi0JCV9fc3RyaW5nKAluYW1lLAkJZGV2X25hbWUoZGV2KQkpCi0JCV9fZmllbGQoCXVuc2lnbmVkIGludCwJcmVnCQkpCi0JCV9fZmllbGQoCXVuc2lnbmVkIGludCwJdmFsCQkpCi0JKSwKLQotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2Fzc2lnbl9zdHIobmFtZSwgZGV2X25hbWUoZGV2KSk7Ci0JCV9fZW50cnktPnJlZyA9IHJlZzsKLQkJX19lbnRyeS0+dmFsID0gdmFsOwotCSksCi0KLQlUUF9wcmludGsoIiVzIHJlZz0leCB2YWw9JXgiLCBfX2dldF9zdHIobmFtZSksCi0JCSAgKHVuc2lnbmVkIGludClfX2VudHJ5LT5yZWcsCi0JCSAgKHVuc2lnbmVkIGludClfX2VudHJ5LT52YWwpCi0pOwotCi1ERUZJTkVfRVZFTlQocmVnbWFwX3JlZywgcmVnbWFwX3JlZ193cml0ZSwKLQotCVRQX1BST1RPKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZywKLQkJIHVuc2lnbmVkIGludCB2YWwpLAotCi0JVFBfQVJHUyhkZXYsIHJlZywgdmFsKQotCi0pOwotCi1ERUZJTkVfRVZFTlQocmVnbWFwX3JlZywgcmVnbWFwX3JlZ19yZWFkLAotCi0JVFBfUFJPVE8oc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnLAotCQkgdW5zaWduZWQgaW50IHZhbCksCi0KLQlUUF9BUkdTKGRldiwgcmVnLCB2YWwpCi0KLSk7Ci0KLURFRklORV9FVkVOVChyZWdtYXBfcmVnLCByZWdtYXBfcmVnX3JlYWRfY2FjaGUsCi0KLQlUUF9QUk9UTyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcsCi0JCSB1bnNpZ25lZCBpbnQgdmFsKSwKLQotCVRQX0FSR1MoZGV2LCByZWcsIHZhbCkKLQotKTsKLQotREVDTEFSRV9FVkVOVF9DTEFTUyhyZWdtYXBfYmxvY2ssCi0KLQlUUF9QUk9UTyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcsIGludCBjb3VudCksCi0KLQlUUF9BUkdTKGRldiwgcmVnLCBjb3VudCksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX3N0cmluZygJbmFtZSwJCWRldl9uYW1lKGRldikJKQotCQlfX2ZpZWxkKAl1bnNpZ25lZCBpbnQsCXJlZwkJKQotCQlfX2ZpZWxkKAlpbnQsCQljb3VudAkJKQotCSksCi0KLQlUUF9mYXN0X2Fzc2lnbigKLQkJX19hc3NpZ25fc3RyKG5hbWUsIGRldl9uYW1lKGRldikpOwotCQlfX2VudHJ5LT5yZWcgPSByZWc7Ci0JCV9fZW50cnktPmNvdW50ID0gY291bnQ7Ci0JKSwKLQotCVRQX3ByaW50aygiJXMgcmVnPSV4IGNvdW50PSVkIiwgX19nZXRfc3RyKG5hbWUpLAotCQkgICh1bnNpZ25lZCBpbnQpX19lbnRyeS0+cmVnLAotCQkgIChpbnQpX19lbnRyeS0+Y291bnQpCi0pOwotCi1ERUZJTkVfRVZFTlQocmVnbWFwX2Jsb2NrLCByZWdtYXBfaHdfcmVhZF9zdGFydCwKLQotCVRQX1BST1RPKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZywgaW50IGNvdW50KSwKLQotCVRQX0FSR1MoZGV2LCByZWcsIGNvdW50KQotKTsKLQotREVGSU5FX0VWRU5UKHJlZ21hcF9ibG9jaywgcmVnbWFwX2h3X3JlYWRfZG9uZSwKLQotCVRQX1BST1RPKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZywgaW50IGNvdW50KSwKLQotCVRQX0FSR1MoZGV2LCByZWcsIGNvdW50KQotKTsKLQotREVGSU5FX0VWRU5UKHJlZ21hcF9ibG9jaywgcmVnbWFwX2h3X3dyaXRlX3N0YXJ0LAotCi0JVFBfUFJPVE8oc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnLCBpbnQgY291bnQpLAotCi0JVFBfQVJHUyhkZXYsIHJlZywgY291bnQpCi0pOwotCi1ERUZJTkVfRVZFTlQocmVnbWFwX2Jsb2NrLCByZWdtYXBfaHdfd3JpdGVfZG9uZSwKLQotCVRQX1BST1RPKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZywgaW50IGNvdW50KSwKLQotCVRQX0FSR1MoZGV2LCByZWcsIGNvdW50KQotKTsKLQotVFJBQ0VfRVZFTlQocmVnY2FjaGVfc3luYywKLQotCVRQX1BST1RPKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqdHlwZSwKLQkJIGNvbnN0IGNoYXIgKnN0YXR1cyksCi0KLQlUUF9BUkdTKGRldiwgdHlwZSwgc3RhdHVzKSwKLQotCVRQX1NUUlVDVF9fZW50cnkoCi0JCV9fc3RyaW5nKCAgICAgICBuYW1lLCAgICAgICAgICAgZGV2X25hbWUoZGV2KSAgICkKLQkJX19zdHJpbmcoCXN0YXR1cywJCXN0YXR1cwkJKQotCQlfX3N0cmluZygJdHlwZSwJCXR5cGUJCSkKLQkJX19maWVsZCgJaW50LAkJdHlwZQkJKQotCSksCi0KLQlUUF9mYXN0X2Fzc2lnbigKLQkJX19hc3NpZ25fc3RyKG5hbWUsIGRldl9uYW1lKGRldikpOwotCQlfX2Fzc2lnbl9zdHIoc3RhdHVzLCBzdGF0dXMpOwotCQlfX2Fzc2lnbl9zdHIodHlwZSwgdHlwZSk7Ci0JKSwKLQotCVRQX3ByaW50aygiJXMgdHlwZT0lcyBzdGF0dXM9JXMiLCBfX2dldF9zdHIobmFtZSksCi0JCSAgX19nZXRfc3RyKHR5cGUpLCBfX2dldF9zdHIoc3RhdHVzKSkKLSk7Ci0KLURFQ0xBUkVfRVZFTlRfQ0xBU1MocmVnbWFwX2Jvb2wsCi0KLQlUUF9QUk9UTyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZmxhZyksCi0KLQlUUF9BUkdTKGRldiwgZmxhZyksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX3N0cmluZygJbmFtZSwJCWRldl9uYW1lKGRldikJKQotCQlfX2ZpZWxkKAlpbnQsCQlmbGFnCQkpCi0JKSwKLQotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2Fzc2lnbl9zdHIobmFtZSwgZGV2X25hbWUoZGV2KSk7Ci0JCV9fZW50cnktPmZsYWcgPSBmbGFnOwotCSksCi0KLQlUUF9wcmludGsoIiVzIGZsYWc9JWQiLCBfX2dldF9zdHIobmFtZSksCi0JCSAgKGludClfX2VudHJ5LT5mbGFnKQotKTsKLQotREVGSU5FX0VWRU5UKHJlZ21hcF9ib29sLCByZWdtYXBfY2FjaGVfb25seSwKLQotCVRQX1BST1RPKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBmbGFnKSwKLQotCVRQX0FSR1MoZGV2LCBmbGFnKQotCi0pOwotCi1ERUZJTkVfRVZFTlQocmVnbWFwX2Jvb2wsIHJlZ21hcF9jYWNoZV9ieXBhc3MsCi0KLQlUUF9QUk9UTyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGJvb2wgZmxhZyksCi0KLQlUUF9BUkdTKGRldiwgZmxhZykKLQotKTsKLQotREVDTEFSRV9FVkVOVF9DTEFTUyhyZWdtYXBfYXN5bmMsCi0KLQlUUF9QUk9UTyhzdHJ1Y3QgZGV2aWNlICpkZXYpLAotCi0JVFBfQVJHUyhkZXYpLAotCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJX19zdHJpbmcoCW5hbWUsCQlkZXZfbmFtZShkZXYpCSkKLQkpLAotCi0JVFBfZmFzdF9hc3NpZ24oCi0JCV9fYXNzaWduX3N0cihuYW1lLCBkZXZfbmFtZShkZXYpKTsKLQkpLAotCi0JVFBfcHJpbnRrKCIlcyIsIF9fZ2V0X3N0cihuYW1lKSkKLSk7Ci0KLURFRklORV9FVkVOVChyZWdtYXBfYmxvY2ssIHJlZ21hcF9hc3luY193cml0ZV9zdGFydCwKLQotCVRQX1BST1RPKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZywgaW50IGNvdW50KSwKLQotCVRQX0FSR1MoZGV2LCByZWcsIGNvdW50KQotKTsKLQotREVGSU5FX0VWRU5UKHJlZ21hcF9hc3luYywgcmVnbWFwX2FzeW5jX2lvX2NvbXBsZXRlLAotCi0JVFBfUFJPVE8oc3RydWN0IGRldmljZSAqZGV2KSwKLQotCVRQX0FSR1MoZGV2KQotCi0pOwotCi1ERUZJTkVfRVZFTlQocmVnbWFwX2FzeW5jLCByZWdtYXBfYXN5bmNfY29tcGxldGVfc3RhcnQsCi0KLQlUUF9QUk9UTyhzdHJ1Y3QgZGV2aWNlICpkZXYpLAotCi0JVFBfQVJHUyhkZXYpCi0KLSk7Ci0KLURFRklORV9FVkVOVChyZWdtYXBfYXN5bmMsIHJlZ21hcF9hc3luY19jb21wbGV0ZV9kb25lLAotCi0JVFBfUFJPVE8oc3RydWN0IGRldmljZSAqZGV2KSwKLQotCVRQX0FSR1MoZGV2KQotCi0pOwotCi1UUkFDRV9FVkVOVChyZWdjYWNoZV9kcm9wX3JlZ2lvbiwKLQotCVRQX1BST1RPKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGZyb20sCi0JCSB1bnNpZ25lZCBpbnQgdG8pLAotCi0JVFBfQVJHUyhkZXYsIGZyb20sIHRvKSwKLQotCVRQX1NUUlVDVF9fZW50cnkoCi0JCV9fc3RyaW5nKCAgICAgICBuYW1lLCAgICAgICAgICAgZGV2X25hbWUoZGV2KSAgICkKLQkJX19maWVsZCgJdW5zaWduZWQgaW50LAlmcm9tCQkpCi0JCV9fZmllbGQoCXVuc2lnbmVkIGludCwJdG8JCSkKLQkpLAotCi0JVFBfZmFzdF9hc3NpZ24oCi0JCV9fYXNzaWduX3N0cihuYW1lLCBkZXZfbmFtZShkZXYpKTsKLQkJX19lbnRyeS0+ZnJvbSA9IGZyb207Ci0JCV9fZW50cnktPnRvID0gdG87Ci0JKSwKLQotCVRQX3ByaW50aygiJXMgJXUtJXUiLCBfX2dldF9zdHIobmFtZSksICh1bnNpZ25lZCBpbnQpX19lbnRyeS0+ZnJvbSwKLQkJICAodW5zaWduZWQgaW50KV9fZW50cnktPnRvKQotKTsKLQotI2VuZGlmIC8qIF9UUkFDRV9SRUdNQVBfSCAqLwotCi0vKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KLSNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3N1bnJwYy5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvc3VucnBjLmgKaW5kZXggYjljMWRjNi4uZmQxYTAyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvc3VucnBjLmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvc3VucnBjLmgKQEAgLTE3OSwyNyArMTc5LDUzIEBACiAKICk7CiAKKy8qCisgKiBGaXJzdCBkZWZpbmUgdGhlIGVudW1zIGluIHRoZSBiZWxvdyBtYWNyb3MgdG8gYmUgZXhwb3J0ZWQgdG8gdXNlcnNwYWNlCisgKiB2aWEgVFJBQ0VfREVGSU5FX0VOVU0oKS4KKyAqLworI3VuZGVmIEVNCisjdW5kZWYgRU1lCisjZGVmaW5lIEVNKGEsIGIpCVRSQUNFX0RFRklORV9FTlVNKGEpOworI2RlZmluZSBFTWUoYSwgYikJVFJBQ0VfREVGSU5FX0VOVU0oYSk7CisKKyNkZWZpbmUgUlBDX1NIT1dfU09DS0VUCQkJCVwKKwlFTSggU1NfRlJFRSwgIkZSRUUiICkJCQlcCisJRU0oIFNTX1VOQ09OTkVDVEVELCAiVU5DT05ORUNURUQiICkJXAorCUVNKCBTU19DT05ORUNUSU5HLCAiQ09OTkVDVElORywiICkJXAorCUVNKCBTU19DT05ORUNURUQsICJDT05ORUNURUQsIiApCVwKKwlFTWUoU1NfRElTQ09OTkVDVElORywgIkRJU0NPTk5FQ1RJTkciICkKKwogI2RlZmluZSBycGNfc2hvd19zb2NrZXRfc3RhdGUoc3RhdGUpIFwKLQlfX3ByaW50X3N5bWJvbGljKHN0YXRlLCBcCi0JCXsgU1NfRlJFRSwgIkZSRUUiIH0sIFwKLQkJeyBTU19VTkNPTk5FQ1RFRCwgIlVOQ09OTkVDVEVEIiB9LCBcCi0JCXsgU1NfQ09OTkVDVElORywgIkNPTk5FQ1RJTkcsIiB9LCBcCi0JCXsgU1NfQ09OTkVDVEVELCAiQ09OTkVDVEVELCIgfSwgXAotCQl7IFNTX0RJU0NPTk5FQ1RJTkcsICJESVNDT05ORUNUSU5HIiB9KQorCV9fcHJpbnRfc3ltYm9saWMoc3RhdGUsIFJQQ19TSE9XX1NPQ0tFVCkKKworUlBDX1NIT1dfU09DS0VUCisKKyNkZWZpbmUgUlBDX1NIT1dfU09DSwkJCQlcCisJRU0oIFRDUF9FU1RBQkxJU0hFRCwgIkVTVEFCTElTSEVEIiApCVwKKwlFTSggVENQX1NZTl9TRU5ULCAiU1lOX1NFTlQiICkJCVwKKwlFTSggVENQX1NZTl9SRUNWLCAiU1lOX1JFQ1YiICkJCVwKKwlFTSggVENQX0ZJTl9XQUlUMSwgIkZJTl9XQUlUMSIgKQlcCisJRU0oIFRDUF9GSU5fV0FJVDIsICJGSU5fV0FJVDIiICkJXAorCUVNKCBUQ1BfVElNRV9XQUlULCAiVElNRV9XQUlUIiApCVwKKwlFTSggVENQX0NMT1NFLCAiQ0xPU0UiICkJCVwKKwlFTSggVENQX0NMT1NFX1dBSVQsICJDTE9TRV9XQUlUIiApCVwKKwlFTSggVENQX0xBU1RfQUNLLCAiTEFTVF9BQ0siICkJCVwKKwlFTSggVENQX0xJU1RFTiwgIkxJU1RFTiIgKQkJXAorCUVNZSggVENQX0NMT1NJTkcsICJDTE9TSU5HIiApCiAKICNkZWZpbmUgcnBjX3Nob3dfc29ja19zdGF0ZShzdGF0ZSkgXAotCV9fcHJpbnRfc3ltYm9saWMoc3RhdGUsIFwKLQkJeyBUQ1BfRVNUQUJMSVNIRUQsICJFU1RBQkxJU0hFRCIgfSwgXAotCQl7IFRDUF9TWU5fU0VOVCwgIlNZTl9TRU5UIiB9LCBcCi0JCXsgVENQX1NZTl9SRUNWLCAiU1lOX1JFQ1YiIH0sIFwKLQkJeyBUQ1BfRklOX1dBSVQxLCAiRklOX1dBSVQxIiB9LCBcCi0JCXsgVENQX0ZJTl9XQUlUMiwgIkZJTl9XQUlUMiIgfSwgXAotCQl7IFRDUF9USU1FX1dBSVQsICJUSU1FX1dBSVQiIH0sIFwKLQkJeyBUQ1BfQ0xPU0UsICJDTE9TRSIgfSwgXAotCQl7IFRDUF9DTE9TRV9XQUlULCAiQ0xPU0VfV0FJVCIgfSwgXAotCQl7IFRDUF9MQVNUX0FDSywgIkxBU1RfQUNLIiB9LCBcCi0JCXsgVENQX0xJU1RFTiwgIkxJU1RFTiIgfSwgXAotCQl7IFRDUF9DTE9TSU5HLCAiQ0xPU0lORyIgfSkKKwlfX3ByaW50X3N5bWJvbGljKHN0YXRlLCBSUENfU0hPV19TT0NLKQorCitSUENfU0hPV19TT0NLCisKKy8qCisgKiBOb3cgcmVkZWZpbmUgdGhlIEVNKCkgYW5kIEVNZSgpIG1hY3JvcyB0byBtYXAgdGhlIGVudW1zIHRvIHRoZSBzdHJpbmdzCisgKiB0aGF0IHdpbGwgYmUgcHJpbnRlZCBpbiB0aGUgb3V0cHV0LgorICovCisjdW5kZWYgRU0KKyN1bmRlZiBFTWUKKyNkZWZpbmUgRU0oYSwgYikJe2EsIGJ9LAorI2RlZmluZSBFTWUoYSwgYikJe2EsIGJ9CiAKIERFQ0xBUkVfRVZFTlRfQ0xBU1MoeHNfc29ja2V0X2V2ZW50LAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy90bGIuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3RsYi5oCmluZGV4IDBlNzYzNTcuLjQyNTBmMzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3RsYi5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3RsYi5oCkBAIC03LDExICs3LDMxIEBACiAjaW5jbHVkZSA8bGludXgvbW1fdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CiAKLSNkZWZpbmUgVExCX0ZMVVNIX1JFQVNPTglcCi0JeyBUTEJfRkxVU0hfT05fVEFTS19TV0lUQ0gsCSJmbHVzaCBvbiB0YXNrIHN3aXRjaCIgfSwJXAotCXsgVExCX1JFTU9URV9TSE9PVERPV04sCQkicmVtb3RlIHNob290ZG93biIgfSwJCVwKLQl7IFRMQl9MT0NBTF9TSE9PVERPV04sCQkibG9jYWwgc2hvb3Rkb3duIiB9LAkJXAotCXsgVExCX0xPQ0FMX01NX1NIT09URE9XTiwJImxvY2FsIG1tIHNob290ZG93biIgfQorI2RlZmluZSBUTEJfRkxVU0hfUkVBU09OCQkJCQkJXAorCUVNKCAgVExCX0ZMVVNIX09OX1RBU0tfU1dJVENILAkiZmx1c2ggb24gdGFzayBzd2l0Y2giICkJXAorCUVNKCAgVExCX1JFTU9URV9TSE9PVERPV04sCSJyZW1vdGUgc2hvb3Rkb3duIiApCQlcCisJRU0oICBUTEJfTE9DQUxfU0hPT1RET1dOLAkibG9jYWwgc2hvb3Rkb3duIiApCQlcCisJRU1lKCBUTEJfTE9DQUxfTU1fU0hPT1RET1dOLAkibG9jYWwgbW0gc2hvb3Rkb3duIiApCisKKy8qCisgKiBGaXJzdCBkZWZpbmUgdGhlIGVudW1zIGluIFRMQl9GTFVTSF9SRUFTT04gdG8gYmUgZXhwb3J0ZWQgdG8gdXNlcnNwYWNlCisgKiB2aWEgVFJBQ0VfREVGSU5FX0VOVU0oKS4KKyAqLworI3VuZGVmIEVNCisjdW5kZWYgRU1lCisjZGVmaW5lIEVNKGEsYikJCVRSQUNFX0RFRklORV9FTlVNKGEpOworI2RlZmluZSBFTWUoYSxiKQlUUkFDRV9ERUZJTkVfRU5VTShhKTsKKworVExCX0ZMVVNIX1JFQVNPTgorCisvKgorICogTm93IHJlZGVmaW5lIHRoZSBFTSgpIGFuZCBFTWUoKSBtYWNyb3MgdG8gbWFwIHRoZSBlbnVtcyB0byB0aGUgc3RyaW5ncworICogdGhhdCB3aWxsIGJlIHByaW50ZWQgaW4gdGhlIG91dHB1dC4KKyAqLworI3VuZGVmIEVNCisjdW5kZWYgRU1lCisjZGVmaW5lIEVNKGEsYikJCXsgYSwgYiB9LAorI2RlZmluZSBFTWUoYSxiKQl7IGEsIGIgfQogCiBUUkFDRV9FVkVOVF9DT05ESVRJT04odGxiX2ZsdXNoLAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy92NGwyLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy92NGwyLmgKaW5kZXggYjliYjFmMi4uMjAxMTIxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvdjRsMi5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3Y0bDIuaApAQCAtNiwzMyArNiw1OCBAQAogCiAjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgogCi0jZGVmaW5lIHNob3dfdHlwZSh0eXBlKQkJCQkJCQkgICAgICAgXAotCV9fcHJpbnRfc3ltYm9saWModHlwZSwJCQkJCQkgICAgICAgXAotCQl7IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwJICAgICAgIlZJREVPX0NBUFRVUkUiIH0sICAgICAgIFwKLQkJeyBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwJICAgICAgIlZJREVPX09VVFBVVCIgfSwJICAgICAgIFwKLQkJeyBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVksCSAgICAgICJWSURFT19PVkVSTEFZIiB9LCAgICAgICBcCi0JCXsgVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSwJICAgICAgIlZCSV9DQVBUVVJFIiB9LAkgICAgICAgXAotCQl7IFY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVCwJICAgICAgIlZCSV9PVVRQVVQiIH0sCSAgICAgICBcCi0JCXsgVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX0NBUFRVUkUsICAgIlNMSUNFRF9WQklfQ0FQVFVSRSIgfSwgIFwKLQkJeyBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVULCAgICAiU0xJQ0VEX1ZCSV9PVVRQVVQiIH0sICAgXAotCQl7IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVksICJWSURFT19PVVRQVVRfT1ZFUkxBWSIgfSxcCi0JCXsgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSwgIlZJREVPX0NBUFRVUkVfTVBMQU5FIiB9LFwKLQkJeyBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUsICAiVklERU9fT1VUUFVUX01QTEFORSIgfSwgXAotCQl7IFY0TDJfQlVGX1RZUEVfU0RSX0NBUFRVUkUsICAgICAgICAgICJTRFJfQ0FQVFVSRSIgfSwgICAgICAgICBcCi0JCXsgVjRMMl9CVUZfVFlQRV9QUklWQVRFLAkgICAgICAiUFJJVkFURSIgfSkKKy8qIEVudW1zIHJlcXVpcmUgYmVpbmcgZXhwb3J0ZWQgdG8gdXNlcnNwYWNlLCBmb3IgdXNlciB0b29sIHBhcnNpbmcgKi8KKyN1bmRlZiBFTQorI3VuZGVmIEVNZQorI2RlZmluZSBFTShhLCBiKQlUUkFDRV9ERUZJTkVfRU5VTShhKTsKKyNkZWZpbmUgRU1lKGEsIGIpCVRSQUNFX0RFRklORV9FTlVNKGEpOworCisjZGVmaW5lIHNob3dfdHlwZSh0eXBlKQkJCQkJCQlcCisJX19wcmludF9zeW1ib2xpYyh0eXBlLCBTSE9XX1RZUEUpCisKKyNkZWZpbmUgU0hPV19UWVBFCQkJCQkJCVwKKwlFTSggVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLAkiVklERU9fQ0FQVFVSRSIgKQlcCisJRU0oIFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVULAkJIlZJREVPX09VVFBVVCIgKQlcCisJRU0oIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWSwJIlZJREVPX09WRVJMQVkiICkJXAorCUVNKCBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFLAkJIlZCSV9DQVBUVVJFIiApCQlcCisJRU0oIFY0TDJfQlVGX1RZUEVfVkJJX09VVFBVVCwJCSJWQklfT1VUUFVUIiApCQlcCisJRU0oIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFLCAgICJTTElDRURfVkJJX0NBUFRVUkUiICkJXAorCUVNKCBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVULCAgICAiU0xJQ0VEX1ZCSV9PVVRQVVQiICkJXAorCUVNKCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZLCAiVklERU9fT1VUUFVUX09WRVJMQVkiICkgXAorCUVNKCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FLCAiVklERU9fQ0FQVFVSRV9NUExBTkUiICkgXAorCUVNKCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUsICAiVklERU9fT1VUUFVUX01QTEFORSIgKQlcCisJRU0oIFY0TDJfQlVGX1RZUEVfU0RSX0NBUFRVUkUsICAgICAgICAgICJTRFJfQ0FQVFVSRSIgKQkJXAorCUVNZShWNEwyX0JVRl9UWVBFX1BSSVZBVEUsCQkiUFJJVkFURSIgKQorCitTSE9XX1RZUEUKIAogI2RlZmluZSBzaG93X2ZpZWxkKGZpZWxkKQkJCQkJCVwKLQlfX3ByaW50X3N5bWJvbGljKGZpZWxkLAkJCQkJCVwKLQkJeyBWNEwyX0ZJRUxEX0FOWSwJCSJBTlkiIH0sCQlcCi0JCXsgVjRMMl9GSUVMRF9OT05FLAkJIk5PTkUiIH0sCQlcCi0JCXsgVjRMMl9GSUVMRF9UT1AsCQkiVE9QIiB9LAkJXAotCQl7IFY0TDJfRklFTERfQk9UVE9NLAkJIkJPVFRPTSIgfSwJCVwKLQkJeyBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQsCSJJTlRFUkxBQ0VEIiB9LAkJXAotCQl7IFY0TDJfRklFTERfU0VRX1RCLAkJIlNFUV9UQiIgfSwJCVwKLQkJeyBWNEwyX0ZJRUxEX1NFUV9CVCwJCSJTRVFfQlQiIH0sCQlcCi0JCXsgVjRMMl9GSUVMRF9BTFRFUk5BVEUsCQkiQUxURVJOQVRFIiB9LAkJXAotCQl7IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQiwJIklOVEVSTEFDRURfVEIiIH0sICAgICAgXAotCQl7IFY0TDJfRklFTERfSU5URVJMQUNFRF9CVCwJIklOVEVSTEFDRURfQlQiIH0pCisJX19wcmludF9zeW1ib2xpYyhmaWVsZCwgU0hPV19GSUVMRCkKKworI2RlZmluZSBTSE9XX0ZJRUxECQkJCQkJCVwKKwlFTSggVjRMMl9GSUVMRF9BTlksCQkiQU5ZIiApCQkJCVwKKwlFTSggVjRMMl9GSUVMRF9OT05FLAkJIk5PTkUiICkJCQlcCisJRU0oIFY0TDJfRklFTERfVE9QLAkJIlRPUCIgKQkJCQlcCisJRU0oIFY0TDJfRklFTERfQk9UVE9NLAkJIkJPVFRPTSIgKQkJCVwKKwlFTSggVjRMMl9GSUVMRF9JTlRFUkxBQ0VELAkiSU5URVJMQUNFRCIgKQkJCVwKKwlFTSggVjRMMl9GSUVMRF9TRVFfVEIsCQkiU0VRX1RCIiApCQkJXAorCUVNKCBWNEwyX0ZJRUxEX1NFUV9CVCwJCSJTRVFfQlQiICkJCQlcCisJRU0oIFY0TDJfRklFTERfQUxURVJOQVRFLAkiQUxURVJOQVRFIiApCQkJXAorCUVNKCBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIsCSJJTlRFUkxBQ0VEX1RCIiApCQlcCisJRU1lKCBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQsCSJJTlRFUkxBQ0VEX0JUIiApCisKK1NIT1dfRklFTEQKKworLyoKKyAqIE5vdyByZWRlZmluZSB0aGUgRU0oKSBhbmQgRU1lKCkgbWFjcm9zIHRvIG1hcCB0aGUgZW51bXMgdG8gdGhlIHN0cmluZ3MKKyAqIHRoYXQgd2lsbCBiZSBwcmludGVkIGluIHRoZSBvdXRwdXQuCisgKi8KKyN1bmRlZiBFTQorI3VuZGVmIEVNZQorI2RlZmluZSBFTShhLCBiKQl7YSwgYn0sCisjZGVmaW5lIEVNZShhLCBiKQl7YSwgYn0KKworLyogVjRMMl9UQ19UWVBFXyogYXJlIG1hY3Jvcywgbm90IGRlZmluZXMsIHRoZXkgZG8gbm90IG5lZWQgcHJvY2Vzc2luZyAqLwogCiAjZGVmaW5lIHNob3dfdGltZWNvZGVfdHlwZSh0eXBlKQkJCQkJXAogCV9fcHJpbnRfc3ltYm9saWModHlwZSwJCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy93cml0ZWJhY2suaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dyaXRlYmFjay5oCmluZGV4IDVhMTRlYWQuLjg4MGRkNzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dyaXRlYmFjay5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dyaXRlYmFjay5oCkBAIC0yMywxNSArMjMsMzIgQEAKIAkJe0lfUkVGRVJFTkNFRCwJCSJJX1JFRkVSRU5DRUQifQkJXAogCSkKIAorLyogZW51bXMgbmVlZCB0byBiZSBleHBvcnRlZCB0byB1c2VyIHNwYWNlICovCisjdW5kZWYgRU0KKyN1bmRlZiBFTWUKKyNkZWZpbmUgRU0oYSxiKSAJVFJBQ0VfREVGSU5FX0VOVU0oYSk7CisjZGVmaW5lIEVNZShhLGIpCVRSQUNFX0RFRklORV9FTlVNKGEpOworCiAjZGVmaW5lIFdCX1dPUktfUkVBU09OCQkJCQkJCVwKLQkJe1dCX1JFQVNPTl9CQUNLR1JPVU5ELAkJImJhY2tncm91bmQifSwJCVwKLQkJe1dCX1JFQVNPTl9UUllfVE9fRlJFRV9QQUdFUywJInRyeV90b19mcmVlX3BhZ2VzIn0sCVwKLQkJe1dCX1JFQVNPTl9TWU5DLAkJInN5bmMifSwJCVwKLQkJe1dCX1JFQVNPTl9QRVJJT0RJQywJCSJwZXJpb2RpYyJ9LAkJXAotCQl7V0JfUkVBU09OX0xBUFRPUF9USU1FUiwJImxhcHRvcF90aW1lciJ9LAlcCi0JCXtXQl9SRUFTT05fRlJFRV9NT1JFX01FTSwJImZyZWVfbW9yZV9tZW1vcnkifSwJXAotCQl7V0JfUkVBU09OX0ZTX0ZSRUVfU1BBQ0UsCSJmc19mcmVlX3NwYWNlIn0sCVwKLQkJe1dCX1JFQVNPTl9GT1JLRVJfVEhSRUFELAkiZm9ya2VyX3RocmVhZCJ9CisJRU0oIFdCX1JFQVNPTl9CQUNLR1JPVU5ELAkJImJhY2tncm91bmQiKQkJXAorCUVNKCBXQl9SRUFTT05fVFJZX1RPX0ZSRUVfUEFHRVMsCSJ0cnlfdG9fZnJlZV9wYWdlcyIpCVwKKwlFTSggV0JfUkVBU09OX1NZTkMsCQkJInN5bmMiKQkJCVwKKwlFTSggV0JfUkVBU09OX1BFUklPRElDLAkJCSJwZXJpb2RpYyIpCQlcCisJRU0oIFdCX1JFQVNPTl9MQVBUT1BfVElNRVIsCQkibGFwdG9wX3RpbWVyIikJCVwKKwlFTSggV0JfUkVBU09OX0ZSRUVfTU9SRV9NRU0sCQkiZnJlZV9tb3JlX21lbW9yeSIpCVwKKwlFTSggV0JfUkVBU09OX0ZTX0ZSRUVfU1BBQ0UsCQkiZnNfZnJlZV9zcGFjZSIpCVwKKwlFTWUoV0JfUkVBU09OX0ZPUktFUl9USFJFQUQsCQkiZm9ya2VyX3RocmVhZCIpCisKK1dCX1dPUktfUkVBU09OCisKKy8qCisgKiBOb3cgcmVkZWZpbmUgdGhlIEVNKCkgYW5kIEVNZSgpIG1hY3JvcyB0byBtYXAgdGhlIGVudW1zIHRvIHRoZSBzdHJpbmdzCisgKiB0aGF0IHdpbGwgYmUgcHJpbnRlZCBpbiB0aGUgb3V0cHV0LgorICovCisjdW5kZWYgRU0KKyN1bmRlZiBFTWUKKyNkZWZpbmUgRU0oYSxiKQkJeyBhLCBiIH0sCisjZGVmaW5lIEVNZShhLGIpCXsgYSwgYiB9CiAKIHN0cnVjdCB3Yl93cml0ZWJhY2tfd29yazsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMveGVuLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy94ZW4uaAppbmRleCBkMDZiNmRhLi5iY2U5OTBmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy94ZW4uaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy94ZW4uaApAQCAtMjI0LDcgKzIyNCw3IEBACiAJICAgIFRQX3ByaW50aygicG1kcCAlcCIsIF9fZW50cnktPnBtZHApCiAJKTsKIAotI2lmIFBBR0VUQUJMRV9MRVZFTFMgPj0gNAorI2lmIENPTkZJR19QR1RBQkxFX0xFVkVMUyA+PSA0CiAKIFRSQUNFX0VWRU5UKHhlbl9tbXVfc2V0X3B1ZCwKIAkgICAgVFBfUFJPVE8ocHVkX3QgKnB1ZHAsIHB1ZF90IHB1ZHZhbCksCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2Z0cmFjZS5oIGIvaW5jbHVkZS90cmFjZS9mdHJhY2UuaAppbmRleCA0MWJmNjVmLi4zN2Q0YjEwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2Z0cmFjZS5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZnRyYWNlLmgKQEAgLTE4LDYgKzE4LDM0IEBACiAKICNpbmNsdWRlIDxsaW51eC9mdHJhY2VfZXZlbnQuaD4KIAorI2lmbmRlZiBUUkFDRV9TWVNURU1fVkFSCisjZGVmaW5lIFRSQUNFX1NZU1RFTV9WQVIgVFJBQ0VfU1lTVEVNCisjZW5kaWYKKworI2RlZmluZSBfX2FwcF9fKHgsIHkpIHN0cl9fIyN4IyN5CisjZGVmaW5lIF9fYXBwKHgsIHkpIF9fYXBwX18oeCwgeSkKKworI2RlZmluZSBUUkFDRV9TWVNURU1fU1RSSU5HIF9fYXBwKFRSQUNFX1NZU1RFTV9WQVIsX190cmFjZV9zeXN0ZW1fbmFtZSkKKworI2RlZmluZSBUUkFDRV9NQUtFX1NZU1RFTV9TVFIoKQkJCQlcCisJc3RhdGljIGNvbnN0IGNoYXIgVFJBQ0VfU1lTVEVNX1NUUklOR1tdID0JXAorCQlfX3N0cmluZ2lmeShUUkFDRV9TWVNURU0pCisKK1RSQUNFX01BS0VfU1lTVEVNX1NUUigpOworCisjdW5kZWYgVFJBQ0VfREVGSU5FX0VOVU0KKyNkZWZpbmUgVFJBQ0VfREVGSU5FX0VOVU0oYSkJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgdHJhY2VfZW51bV9tYXAgX191c2VkIF9faW5pdGRhdGEJXAorCV9fIyNUUkFDRV9TWVNURU0jI18jI2EgPQkJCVwKKwl7CQkJCQkJXAorCQkuc3lzdGVtID0gVFJBQ0VfU1lTVEVNX1NUUklORywJCVwKKwkJLmVudW1fc3RyaW5nID0gI2EsCQkJXAorCQkuZW51bV92YWx1ZSA9IGEJCQkJXAorCX07CQkJCQkJXAorCXN0YXRpYyBzdHJ1Y3QgdHJhY2VfZW51bV9tYXAgX191c2VkCQlcCisJX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX2Z0cmFjZV9lbnVtX21hcCIpKSkJXAorCSpUUkFDRV9TWVNURU0jI18jI2EgPSAmX18jI1RSQUNFX1NZU1RFTSMjXyMjYQorCiAvKgogICogREVDTEFSRV9FVkVOVF9DTEFTUyBjYW4gYmUgdXNlZCB0byBhZGQgYSBnZW5lcmljIGZ1bmN0aW9uCiAgKiBoYW5kbGVycyBmb3IgZXZlbnRzLiBUaGF0IGlzLCBpZiBhbGwgZXZlbnRzIGhhdmUgdGhlIHNhbWUKQEAgLTEwNSw3ICsxMzMsNiBAQAogCiAjaW5jbHVkZSBUUkFDRV9JTkNMVURFKFRSQUNFX0lOQ0xVREVfRklMRSkKIAotCiAvKgogICogU3RhZ2UgMiBvZiB0aGUgdHJhY2UgZXZlbnRzLgogICoKQEAgLTEyMiw2ICsxNDksOSBAQAogICogVGhlIHNpemUgb2YgYW4gYXJyYXkgaXMgYWxzbyBlbmNvZGVkLCBpbiB0aGUgaGlnaGVyIDE2IGJpdHMgb2YgPGl0ZW0+LgogICovCiAKKyN1bmRlZiBUUkFDRV9ERUZJTkVfRU5VTQorI2RlZmluZSBUUkFDRV9ERUZJTkVfRU5VTShhKQorCiAjdW5kZWYgX19maWVsZAogI2RlZmluZSBfX2ZpZWxkKHR5cGUsIGl0ZW0pCiAKQEAgLTUzOSw3ICs1NjksNyBAQAogICoJLnRyYWNlCQkJPSBmdHJhY2VfcmF3X291dHB1dF88Y2FsbD4sIDwtLSBzdGFnZSAyCiAgKiB9OwogICoKLSAqIHN0YXRpYyBjb25zdCBjaGFyIHByaW50X2ZtdF88Y2FsbD5bXSA9IDxUUF9wcmludGs+OworICogc3RhdGljIGNoYXIgcHJpbnRfZm10XzxjYWxsPltdID0gPFRQX3ByaW50az47CiAgKgogICogc3RhdGljIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2xhc3MgX191c2VkIGV2ZW50X2NsYXNzXzx0ZW1wbGF0ZT4gPSB7CiAgKgkuc3lzdGVtCQkJPSAiPHN5c3RlbT4iLApAQCAtNjkwLDkgKzcyMCw5IEBACiAjdW5kZWYgREVDTEFSRV9FVkVOVF9DTEFTUwogI2RlZmluZSBERUNMQVJFX0VWRU5UX0NMQVNTKGNhbGwsIHByb3RvLCBhcmdzLCB0c3RydWN0LCBhc3NpZ24sIHByaW50KQlcCiBfVFJBQ0VfUEVSRl9QUk9UTyhjYWxsLCBQQVJBTVMocHJvdG8pKTsJCQkJCVwKLXN0YXRpYyBjb25zdCBjaGFyIHByaW50X2ZtdF8jI2NhbGxbXSA9IHByaW50OwkJCQlcCitzdGF0aWMgY2hhciBwcmludF9mbXRfIyNjYWxsW10gPSBwcmludDsJCQkJCVwKIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NsYXNzIF9fdXNlZCBfX3JlZmRhdGEgZXZlbnRfY2xhc3NfIyNjYWxsID0geyBcCi0JLnN5c3RlbQkJCT0gX19zdHJpbmdpZnkoVFJBQ0VfU1lTVEVNKSwJCVwKKwkuc3lzdGVtCQkJPSBUUkFDRV9TWVNURU1fU1RSSU5HLAkJCVwKIAkuZGVmaW5lX2ZpZWxkcwkJPSBmdHJhY2VfZGVmaW5lX2ZpZWxkc18jI2NhbGwsCQlcCiAJLmZpZWxkcwkJCT0gTElTVF9IRUFEX0lOSVQoZXZlbnRfY2xhc3NfIyNjYWxsLmZpZWxkcyksXAogCS5yYXdfaW5pdAkJPSB0cmFjZV9ldmVudF9yYXdfaW5pdCwJCQlcCkBAIC03MTksNyArNzQ5LDcgQEAKICN1bmRlZiBERUZJTkVfRVZFTlRfUFJJTlQKICNkZWZpbmUgREVGSU5FX0VWRU5UX1BSSU5UKHRlbXBsYXRlLCBjYWxsLCBwcm90bywgYXJncywgcHJpbnQpCQlcCiAJCQkJCQkJCQlcCi1zdGF0aWMgY29uc3QgY2hhciBwcmludF9mbXRfIyNjYWxsW10gPSBwcmludDsJCQkJXAorc3RhdGljIGNoYXIgcHJpbnRfZm10XyMjY2FsbFtdID0gcHJpbnQ7CQkJCQlcCiAJCQkJCQkJCQlcCiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fdXNlZCBldmVudF8jI2NhbGwgPSB7CQkJXAogCS5jbGFzcwkJCT0gJmV2ZW50X2NsYXNzXyMjdGVtcGxhdGUsCQlcCkBAIC03MzUsNiArNzY1LDcgQEAKIAogI2luY2x1ZGUgVFJBQ0VfSU5DTFVERShUUkFDRV9JTkNMVURFX0ZJTEUpCiAKKyN1bmRlZiBUUkFDRV9TWVNURU1fVkFSCiAKICNpZmRlZiBDT05GSUdfUEVSRl9FVkVOVFMKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZCBiL2luY2x1ZGUvdWFwaS9saW51eC9LYnVpbGQKaW5kZXggNjhjZWI5Ny4uMzhkZjIzNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L0tidWlsZAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvS2J1aWxkCkBAIC02LDYgKzYsNyBAQAogaGVhZGVyLXkgKz0gZHZiLwogaGVhZGVyLXkgKz0gaGRsYy8KIGhlYWRlci15ICs9IGhzaS8KK2hlYWRlci15ICs9IGlpby8KIGhlYWRlci15ICs9IGlzZG4vCiBoZWFkZXIteSArPSBtbWMvCiBoZWFkZXIteSArPSBuZnNkLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2JwZi5oCmluZGV4IDQ1ZGE3ZWMuLjVjMWNlZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9icGYuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvYnBmLmgKQEAgLTExOCw4ICsxMTgsMTMgQEAKIGVudW0gYnBmX3Byb2dfdHlwZSB7CiAJQlBGX1BST0dfVFlQRV9VTlNQRUMsCiAJQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLAorCUJQRl9QUk9HX1RZUEVfS1BST0JFLAorCUJQRl9QUk9HX1RZUEVfU0NIRURfQ0xTLAorCUJQRl9QUk9HX1RZUEVfU0NIRURfQUNULAogfTsKIAorI2RlZmluZSBCUEZfUFNFVURPX01BUF9GRAkxCisKIC8qIGZsYWdzIGZvciBCUEZfTUFQX1VQREFURV9FTEVNIGNvbW1hbmQgKi8KICNkZWZpbmUgQlBGX0FOWQkJMCAvKiBjcmVhdGUgbmV3IGVsZW1lbnQgb3IgdXBkYXRlIGV4aXN0aW5nICovCiAjZGVmaW5lIEJQRl9OT0VYSVNUCTEgLyogY3JlYXRlIG5ldyBlbGVtZW50IGlmIGl0IGRpZG4ndCBleGlzdCAqLwpAQCAtMTUxLDYgKzE1Niw3IEBACiAJCV9fdTMyCQlsb2dfbGV2ZWw7CS8qIHZlcmJvc2l0eSBsZXZlbCBvZiB2ZXJpZmllciAqLwogCQlfX3UzMgkJbG9nX3NpemU7CS8qIHNpemUgb2YgdXNlciBidWZmZXIgKi8KIAkJX19hbGlnbmVkX3U2NAlsb2dfYnVmOwkvKiB1c2VyIHN1cHBsaWVkIGJ1ZmZlciAqLworCQlfX3UzMgkJa2Vybl92ZXJzaW9uOwkvKiBjaGVja2VkIHdoZW4gcHJvZ190eXBlPWtwcm9iZSAqLwogCX07CiB9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoOCkpKTsKIApAQCAtMTYyLDcgKzE2OCw2NCBAQAogCUJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSwgLyogdm9pZCAqbWFwX2xvb2t1cF9lbGVtKCZtYXAsICZrZXkpICovCiAJQlBGX0ZVTkNfbWFwX3VwZGF0ZV9lbGVtLCAvKiBpbnQgbWFwX3VwZGF0ZV9lbGVtKCZtYXAsICZrZXksICZ2YWx1ZSwgZmxhZ3MpICovCiAJQlBGX0ZVTkNfbWFwX2RlbGV0ZV9lbGVtLCAvKiBpbnQgbWFwX2RlbGV0ZV9lbGVtKCZtYXAsICZrZXkpICovCisJQlBGX0ZVTkNfcHJvYmVfcmVhZCwgICAgICAvKiBpbnQgYnBmX3Byb2JlX3JlYWQodm9pZCAqZHN0LCBpbnQgc2l6ZSwgdm9pZCAqc3JjKSAqLworCUJQRl9GVU5DX2t0aW1lX2dldF9ucywgICAgLyogdTY0IGJwZl9rdGltZV9nZXRfbnModm9pZCkgKi8KKwlCUEZfRlVOQ190cmFjZV9wcmludGssICAgIC8qIGludCBicGZfdHJhY2VfcHJpbnRrKGNvbnN0IGNoYXIgKmZtdCwgaW50IGZtdF9zaXplLCAuLi4pICovCisJQlBGX0ZVTkNfZ2V0X3ByYW5kb21fdTMyLCAvKiB1MzIgcHJhbmRvbV91MzIodm9pZCkgKi8KKwlCUEZfRlVOQ19nZXRfc21wX3Byb2Nlc3Nvcl9pZCwgLyogdTMyIHJhd19zbXBfcHJvY2Vzc29yX2lkKHZvaWQpICovCisKKwkvKioKKwkgKiBza2Jfc3RvcmVfYnl0ZXMoc2tiLCBvZmZzZXQsIGZyb20sIGxlbiwgZmxhZ3MpIC0gc3RvcmUgYnl0ZXMgaW50byBwYWNrZXQKKwkgKiBAc2tiOiBwb2ludGVyIHRvIHNrYgorCSAqIEBvZmZzZXQ6IG9mZnNldCB3aXRoaW4gcGFja2V0IGZyb20gc2tiLT5kYXRhCisJICogQGZyb206IHBvaW50ZXIgd2hlcmUgdG8gY29weSBieXRlcyBmcm9tCisJICogQGxlbjogbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGludG8gcGFja2V0CisJICogQGZsYWdzOiBiaXQgMCAtIGlmIHRydWUsIHJlY29tcHV0ZSBza2ItPmNzdW0KKwkgKiAgICAgICAgIG90aGVyIGJpdHMgLSByZXNlcnZlZAorCSAqIFJldHVybjogMCBvbiBzdWNjZXNzCisJICovCisJQlBGX0ZVTkNfc2tiX3N0b3JlX2J5dGVzLAorCisJLyoqCisJICogbDNfY3N1bV9yZXBsYWNlKHNrYiwgb2Zmc2V0LCBmcm9tLCB0bywgZmxhZ3MpIC0gcmVjb21wdXRlIElQIGNoZWNrc3VtCisJICogQHNrYjogcG9pbnRlciB0byBza2IKKwkgKiBAb2Zmc2V0OiBvZmZzZXQgd2l0aGluIHBhY2tldCB3aGVyZSBJUCBjaGVja3N1bSBpcyBsb2NhdGVkCisJICogQGZyb206IG9sZCB2YWx1ZSBvZiBoZWFkZXIgZmllbGQKKwkgKiBAdG86IG5ldyB2YWx1ZSBvZiBoZWFkZXIgZmllbGQKKwkgKiBAZmxhZ3M6IGJpdHMgMC0zIC0gc2l6ZSBvZiBoZWFkZXIgZmllbGQKKwkgKiAgICAgICAgIG90aGVyIGJpdHMgLSByZXNlcnZlZAorCSAqIFJldHVybjogMCBvbiBzdWNjZXNzCisJICovCisJQlBGX0ZVTkNfbDNfY3N1bV9yZXBsYWNlLAorCisJLyoqCisJICogbDRfY3N1bV9yZXBsYWNlKHNrYiwgb2Zmc2V0LCBmcm9tLCB0bywgZmxhZ3MpIC0gcmVjb21wdXRlIFRDUC9VRFAgY2hlY2tzdW0KKwkgKiBAc2tiOiBwb2ludGVyIHRvIHNrYgorCSAqIEBvZmZzZXQ6IG9mZnNldCB3aXRoaW4gcGFja2V0IHdoZXJlIFRDUC9VRFAgY2hlY2tzdW0gaXMgbG9jYXRlZAorCSAqIEBmcm9tOiBvbGQgdmFsdWUgb2YgaGVhZGVyIGZpZWxkCisJICogQHRvOiBuZXcgdmFsdWUgb2YgaGVhZGVyIGZpZWxkCisJICogQGZsYWdzOiBiaXRzIDAtMyAtIHNpemUgb2YgaGVhZGVyIGZpZWxkCisJICogICAgICAgICBiaXQgNCAtIGlzIHBzZXVkbyBoZWFkZXIKKwkgKiAgICAgICAgIG90aGVyIGJpdHMgLSByZXNlcnZlZAorCSAqIFJldHVybjogMCBvbiBzdWNjZXNzCisJICovCisJQlBGX0ZVTkNfbDRfY3N1bV9yZXBsYWNlLAogCV9fQlBGX0ZVTkNfTUFYX0lELAogfTsKIAorLyogdXNlciBhY2Nlc3NpYmxlIG1pcnJvciBvZiBpbi1rZXJuZWwgc2tfYnVmZi4KKyAqIG5ldyBmaWVsZHMgY2FuIG9ubHkgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGlzIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgX19za19idWZmIHsKKwlfX3UzMiBsZW47CisJX191MzIgcGt0X3R5cGU7CisJX191MzIgbWFyazsKKwlfX3UzMiBxdWV1ZV9tYXBwaW5nOworCV9fdTMyIHByb3RvY29sOworCV9fdTMyIHZsYW5fcHJlc2VudDsKKwlfX3UzMiB2bGFuX3RjaTsKKwlfX3UzMiB2bGFuX3Byb3RvOworCV9fdTMyIHByaW9yaXR5OworfTsKKwogI2VuZGlmIC8qIF9VQVBJX19MSU5VWF9CUEZfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvY2FuL3Jhdy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi9yYXcuaAppbmRleCA3OGVjNzZmLi44NzM1ZjEwOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2Nhbi9yYXcuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvY2FuL3Jhdy5oCkBAIC01Nyw2ICs1Nyw3IEBACiAJQ0FOX1JBV19MT09QQkFDSywJLyogbG9jYWwgbG9vcGJhY2sgKGRlZmF1bHQ6b24pICAgICAgICovCiAJQ0FOX1JBV19SRUNWX09XTl9NU0dTLAkvKiByZWNlaXZlIG15IG93biBtc2dzIChkZWZhdWx0Om9mZikgKi8KIAlDQU5fUkFXX0ZEX0ZSQU1FUywJLyogYWxsb3cgQ0FOIEZEIGZyYW1lcyAoZGVmYXVsdDpvZmYpICovCisJQ0FOX1JBV19KT0lOX0ZJTFRFUlMsCS8qIGFsbCBmaWx0ZXJzIG11c3QgbWF0Y2ggdG8gdHJpZ2dlciAqLwogfTsKIAogI2VuZGlmIC8qICFfVUFQSV9DQU5fUkFXX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9kY2JubC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2RjYm5sLmgKaW5kZXggZTcxMWYyMC4uNjQ5N2Q3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2RjYm5sLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2RjYm5sLmgKQEAgLTc4LDYgKzc4LDcwIEBACiAJX191NjQJdGNfbWF4cmF0ZVtJRUVFXzgwMjFRQVpfTUFYX1RDU107CiB9OwogCitlbnVtIGRjYm5sX2NuZGRfc3RhdGVzIHsKKwlEQ0JfQ05ERF9SRVNFVCA9IDAsCisJRENCX0NORERfRURHRSwKKwlEQ0JfQ05ERF9JTlRFUklPUiwKKwlEQ0JfQ05ERF9JTlRFUklPUl9SRUFEWSwKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBJRUVFIDgwMi4xUWF1IFFDTiBtYW5hZ2VkIG9iamVjdC4KKyAqCisgKkBycGdfZW5hYmxlOiBlbmFibGUgUUNOIFJQCisgKkBycHBwX21heF9ycHM6IG1heGltdW0gbnVtYmVyIG9mIFJQcyBhbGxvd2VkIGZvciB0aGlzIENOUFYgb24gdGhpcyBwb3J0CisgKkBycGdfdGltZV9yZXNldDogdGltZSBiZXR3ZWVuIHJhdGUgaW5jcmVhc2VzIGlmIG5vIENOTXMgcmVjZWl2ZWQuCisgKgkJICAgZ2l2ZW4gaW4gdS1zZWNvbmRzCisgKkBycGdfYnl0ZV9yZXNldDogdHJhbnNtaXR0ZWQgZGF0YSBiZXR3ZWVuIHJhdGUgaW5jcmVhc2VzIGlmIG5vIENOTXMgcmVjZWl2ZWQuCisgKgkJICAgZ2l2ZW4gaW4gQnl0ZXMKKyAqQHJwZ190aHJlc2hvbGQ6IFRoZSBudW1iZXIgb2YgdGltZXMgcnBCeXRlU3RhZ2Ugb3IgcnBUaW1lU3RhZ2UgY2FuIGNvdW50CisgKgkJICAgYmVmb3JlIFJQIHJhdGUgY29udHJvbCBzdGF0ZSBtYWNoaW5lIGFkdmFuY2VzIHN0YXRlcworICpAcnBnX21heF9yYXRlOiB0aGUgbWF4aW51biByYXRlLCBpbiBNYml0cyBwZXIgc2Vjb25kLAorICoJCSBhdCB3aGljaCBhbiBSUCBjYW4gdHJhbnNtaXQKKyAqQHJwZ19haV9yYXRlOiBUaGUgcmF0ZSwgaW4gTWJpdHMgcGVyIHNlY29uZCwKKyAqCQl1c2VkIHRvIGluY3JlYXNlIHJwVGFyZ2V0UmF0ZSBpbiB0aGUgUlBSX0FDVElWRV9JTkNSRUFTRQorICpAcnBnX2hhaV9yYXRlOiBUaGUgcmF0ZSwgaW4gTWJpdHMgcGVyIHNlY29uZCwKKyAqCQkgdXNlZCB0byBpbmNyZWFzZSBycFRhcmdldFJhdGUgaW4gdGhlIFJQUl9IWVBFUl9JTkNSRUFTRSBzdGF0ZQorICpAcnBnX2dkOiBVcG9uIENOTSByZWNlaXZlLCBmbG93IHJhdGUgaXMgbGltaXRlZCB0byAoRmIvR2QpKkN1cnJlbnRSYXRlLgorICoJICAgcnBnR2QgaXMgZ2l2ZW4gYXMgbG9nMihHZCksIHdoZXJlIEdkIG1heSBvbmx5IGJlIHBvd2VycyBvZiAyCisgKkBycGdfbWluX2RlY19mYWM6IFRoZSBtaW5pbXVtIGZhY3RvciBieSB3aGljaCB0aGUgY3VycmVudCB0cmFuc21pdCByYXRlCisgKgkJICAgIGNhbiBiZSBjaGFuZ2VkIGJ5IHJlY2VwdGlvbiBvZiBhIENOTS4KKyAqCQkgICAgdmFsdWUgaXMgZ2l2ZW4gYXMgcGVyY2VudGFnZSAoMS0xMDApCisgKkBycGdfbWluX3JhdGU6IFRoZSBtaW5pbXVtIHZhbHVlLCBpbiBiaXRzIHBlciBzZWNvbmQsIGZvciByYXRlIHRvIGxpbWl0CisgKkBjbmRkX3N0YXRlX21hY2hpbmU6IFRoZSBzdGF0ZSBvZiB0aGUgY29uZ2VzdGlvbiBub3RpZmljYXRpb24gZG9tYWluCisgKgkJICAgICAgIGRlZmVuc2Ugc3RhdGUgbWFjaGluZSwgYXMgZGVmaW5lZCBieSBJRUVFIDgwMi4zUWF1CisgKgkJICAgICAgIHNlY3Rpb24gMzIuMS4xLiBJbiB0aGUgaW50ZXJpb3IgcmVhZHkgc3RhdGUsCisgKgkJICAgICAgIHRoZSBRQ04gY2FwYWJsZSBoYXJkd2FyZSBtYXkgYWRkIENOLVRBRyBUTFYgdG8gdGhlCisgKgkJICAgICAgIG91dGdvaW5nIHRyYWZmaWMsIHRvIHNwZWNpZmljYWxseSBpZGVudGlmeSBvdXRnb2luZworICoJCSAgICAgICBmbG93cy4KKyAqLworCitzdHJ1Y3QgaWVlZV9xY24geworCV9fdTggcnBnX2VuYWJsZVtJRUVFXzgwMjFRQVpfTUFYX1RDU107CisJX191MzIgcnBwcF9tYXhfcnBzW0lFRUVfODAyMVFBWl9NQVhfVENTXTsKKwlfX3UzMiBycGdfdGltZV9yZXNldFtJRUVFXzgwMjFRQVpfTUFYX1RDU107CisJX191MzIgcnBnX2J5dGVfcmVzZXRbSUVFRV84MDIxUUFaX01BWF9UQ1NdOworCV9fdTMyIHJwZ190aHJlc2hvbGRbSUVFRV84MDIxUUFaX01BWF9UQ1NdOworCV9fdTMyIHJwZ19tYXhfcmF0ZVtJRUVFXzgwMjFRQVpfTUFYX1RDU107CisJX191MzIgcnBnX2FpX3JhdGVbSUVFRV84MDIxUUFaX01BWF9UQ1NdOworCV9fdTMyIHJwZ19oYWlfcmF0ZVtJRUVFXzgwMjFRQVpfTUFYX1RDU107CisJX191MzIgcnBnX2dkW0lFRUVfODAyMVFBWl9NQVhfVENTXTsKKwlfX3UzMiBycGdfbWluX2RlY19mYWNbSUVFRV84MDIxUUFaX01BWF9UQ1NdOworCV9fdTMyIHJwZ19taW5fcmF0ZVtJRUVFXzgwMjFRQVpfTUFYX1RDU107CisJX191MzIgY25kZF9zdGF0ZV9tYWNoaW5lW0lFRUVfODAyMVFBWl9NQVhfVENTXTsKK307CisKKy8qIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBJRUVFIDgwMi4xUWF1IFFDTiBzdGF0aXN0aWNzLgorICoKKyAqQHJwcHBfcnBfY2VudGlzZWNvbmRzOiB0aGUgbnVtYmVyIG9mIFJQLWNlbnRpc2Vjb25kcyBhY2N1bXVsYXRlZAorICoJCQkgYnkgUlBzIGF0IHRoaXMgcHJpb3JpdHkgbGV2ZWwgb24gdGhpcyBQb3J0CisgKkBycHBwX2NyZWF0ZWRfcnBzOiBudW1iZXIgb2YgYWN0aXZlIFJQcyhmbG93cykgdGhhdCByZWFjdCB0byBDTk1zCisgKi8KKworc3RydWN0IGllZWVfcWNuX3N0YXRzIHsKKwlfX3U2NCBycHBwX3JwX2NlbnRpc2Vjb25kc1tJRUVFXzgwMjFRQVpfTUFYX1RDU107CisJX191MzIgcnBwcF9jcmVhdGVkX3Jwc1tJRUVFXzgwMjFRQVpfTUFYX1RDU107Cit9OworCiAvKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgSUVFRSA4MDIuMVFheiBQRkMgbWFuYWdlZCBvYmplY3QKICAqCiAgKiBAcGZjX2NhcDogSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgdHJhZmZpYyBjbGFzc2VzIG9uIHRoZSBsb2NhbCBkZXZpY2UKQEAgLTMzNCw2ICszOTgsOCBAQAogCURDQl9BVFRSX0lFRUVfUEVFUl9QRkMsCiAJRENCX0FUVFJfSUVFRV9QRUVSX0FQUCwKIAlEQ0JfQVRUUl9JRUVFX01BWFJBVEUsCisJRENCX0FUVFJfSUVFRV9RQ04sCisJRENCX0FUVFJfSUVFRV9RQ05fU1RBVFMsCiAJX19EQ0JfQVRUUl9JRUVFX01BWAogfTsKICNkZWZpbmUgRENCX0FUVFJfSUVFRV9NQVggKF9fRENCX0FUVFJfSUVFRV9NQVggLSAxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2ZpbHRlci5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2ZpbHRlci5oCmluZGV4IDQ3Nzg1ZDUuLjM0Yzc5MzYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9maWx0ZXIuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvZmlsdGVyLmgKQEAgLTc3LDcgKzc3LDggQEAKICNkZWZpbmUgU0tGX0FEX1ZMQU5fVEFHX1BSRVNFTlQgNDgKICNkZWZpbmUgU0tGX0FEX1BBWV9PRkZTRVQJNTIKICNkZWZpbmUgU0tGX0FEX1JBTkRPTQk1NgotI2RlZmluZSBTS0ZfQURfTUFYCTYwCisjZGVmaW5lIFNLRl9BRF9WTEFOX1RQSUQJNjAKKyNkZWZpbmUgU0tGX0FEX01BWAk2NAogI2RlZmluZSBTS0ZfTkVUX09GRiAgICgtMHgxMDAwMDApCiAjZGVmaW5lIFNLRl9MTF9PRkYgICAgKC0weDIwMDAwMCkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2ZvdS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2ZvdS5oCmluZGV4IGMzMDM1ODguLmQyOTQ3YzUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9mb3UuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvZm91LmgKQEAgLTI1LDYgKzI1LDcgQEAKIAlGT1VfQ01EX1VOU1BFQywKIAlGT1VfQ01EX0FERCwKIAlGT1VfQ01EX0RFTCwKKwlGT1VfQ01EX0dFVCwKIAogCV9fRk9VX0NNRF9NQVgsCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2hzaS9LYnVpbGQgYi9pbmNsdWRlL3VhcGkvbGludXgvaHNpL0tidWlsZAppbmRleCAzMGFiM2NkLi5hMTZhMDA1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvaHNpL0tidWlsZAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaHNpL0tidWlsZApAQCAtMSwyICsxLDIgQEAKICMgVUFQSSBIZWFkZXIgZXhwb3J0IGxpc3QKLWhlYWRlci15ICs9IGhzaV9jaGFyLmgKK2hlYWRlci15ICs9IGhzaV9jaGFyLmggY3MtcHJvdG9jb2wuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2hzaS9jcy1wcm90b2NvbC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2hzaS9jcy1wcm90b2NvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NTdiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaHNpL2NzLXByb3RvY29sLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBjbXQtc3BlZWNoIGludGVyZmFjZSBkZWZpbml0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5LDIwMTAgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29udGFjdDogS2FpIFZlaG1hbmVuIDxrYWkudmVobWFuZW5Abm9raWEuY29tPgorICogT3JpZ2luYWwgYXV0aG9yOiBQZXRlciBVamZhbHVzaSA8cGV0ZXIudWpmYWx1c2lAbm9raWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9DU19QUk9UT0NPTF9ICisjZGVmaW5lIF9DU19QUk9UT0NPTF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKy8qIGNoYXJkZXYgcGFyYW1ldGVycyAqLworI2RlZmluZSBDU19ERVZfRklMRV9OQU1FCQkiL2Rldi9jbXRfc3BlZWNoIgorCisvKiB1c2VyLXNwYWNlIEFQSSB2ZXJzaW9uaW5nICovCisjZGVmaW5lIENTX0lGX1ZFUlNJT04JCQkyCisKKy8qIEFQRSBrZXJuZWwgPC0+IHVzZXIgc3BhY2UgbWVzc2FnZXMgKi8KKyNkZWZpbmUgQ1NfQ01EX1NISUZUCQkJMjgKKyNkZWZpbmUgQ1NfRE9NQUlOX1NISUZUCQkJMjQKKworI2RlZmluZSBDU19DTURfTUFTSwkJCTB4ZmYwMDAwMDAKKyNkZWZpbmUgQ1NfUEFSQU1fTUFTSwkJCTB4ZmZmZmZmCisKKyNkZWZpbmUgQ1NfQ01EKGlkLCBkb20pIFwKKwkoKChpZCkgPDwgQ1NfQ01EX1NISUZUKSB8ICgoZG9tKSA8PCBDU19ET01BSU5fU0hJRlQpKQorCisjZGVmaW5lIENTX0VSUk9SCQkJQ1NfQ01EKDEsIDApCisjZGVmaW5lIENTX1JYX0RBVEFfUkVDRUlWRUQJCUNTX0NNRCgyLCAwKQorI2RlZmluZSBDU19UWF9EQVRBX1JFQURZCQlDU19DTUQoMywgMCkKKyNkZWZpbmUgQ1NfVFhfREFUQV9TRU5UCQkJQ1NfQ01EKDQsIDApCisKKy8qIHBhcmFtcyB0byBDU19FUlJPUiBpbmRpY2F0aW9uICovCisjZGVmaW5lIENTX0VSUl9QRUVSX1JFU0VUCQkwCisKKy8qIGlvY3RsIGludGVyZmFjZSAqLworCisvKiBwYXJhbWV0ZXJzIHRvIENTX0NPTkZJR19CVUZTIGlvY3RsICovCisjZGVmaW5lIENTX0ZFQVRfVFNUQU1QX1JYX0NUUkwJCSgxIDw8IDApCisjZGVmaW5lIENTX0ZFQVRfUk9MTElOR19SWF9DT1VOVEVSCSgyIDw8IDApCisKKy8qIHBhcmFtZXRlcnMgdG8gQ1NfR0VUX1NUQVRFIGlvY3RsICovCisjZGVmaW5lIENTX1NUQVRFX0NMT1NFRAkJCTAKKyNkZWZpbmUgQ1NfU1RBVEVfT1BFTkVECQkJMSAvKiByZXNvdXJjZSBhbGxvY2F0ZWQgKi8KKyNkZWZpbmUgQ1NfU1RBVEVfQ09ORklHVVJFRAkJMiAvKiBkYXRhIHBhdGggYWN0aXZlICovCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIFRYL1JYIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgQ1NfTUFYX0JVRkZFUlNfU0hJRlQJCTQKKyNkZWZpbmUgQ1NfTUFYX0JVRkZFUlMJCQkoMSA8PCBDU19NQVhfQlVGRkVSU19TSElGVCkKKworLyogUGFyYW1ldGVycyBmb3Igc2V0dGluZyB1cCB0aGUgZGF0YSBidWZmZXJzICovCitzdHJ1Y3QgY3NfYnVmZmVyX2NvbmZpZyB7CisJX191MzIgcnhfYnVmczsJLyogbnVtYmVyIG9mIFJYIGJ1ZmZlciBzbG90cyAqLworCV9fdTMyIHR4X2J1ZnM7CS8qIG51bWJlciBvZiBUWCBidWZmZXIgc2xvdHMgKi8KKwlfX3UzMiBidWZfc2l6ZTsJLyogYnl0ZXMgKi8KKwlfX3UzMiBmbGFnczsJLyogc2VlIENTX0ZFQVRfKiAqLworCV9fdTMyIHJlc2VydmVkWzRdOworfTsKKworLyoKKyAqIFN0cnVjdCBkZXNjcmliaW5nIHRoZSBsYXlvdXQgYW5kIGNvbnRlbnRzIG9mIHRoZSBkcml2ZXIgbW1hcCBhcmVhLgorICogVGhpcyBpbmZvcm1hdGlvbiBpcyBtZWFudCBhcyByZWFkLW9ubHkgaW5mb3JtYXRpb24gZm9yIHRoZSBhcHBsaWNhdGlvbi4KKyAqLworc3RydWN0IGNzX21tYXBfY29uZmlnX2Jsb2NrIHsKKwlfX3UzMiByZXNlcnZlZDE7CisJX191MzIgYnVmX3NpemU7CQkvKiAwPWRpc2FibGVkLCBvdGhlcndpc2UgdGhlIHRyYW5zZmVyIHNpemUgKi8KKwlfX3UzMiByeF9idWZzOwkJLyogIyBvZiBSWCBidWZmZXJzICovCisJX191MzIgdHhfYnVmczsJCS8qICMgb2YgVFggYnVmZmVycyAqLworCV9fdTMyIHJlc2VydmVkMjsKKwkvKiBhcnJheSBvZiBvZmZzZXRzIHdpdGhpbiB0aGUgbW1hcCBhcmVhIGZvciBlYWNoIFJYIGFuZCBUWCBidWZmZXIgKi8KKwlfX3UzMiByeF9vZmZzZXRzW0NTX01BWF9CVUZGRVJTXTsKKwlfX3UzMiB0eF9vZmZzZXRzW0NTX01BWF9CVUZGRVJTXTsKKwlfX3UzMiByeF9wdHI7CisJX191MzIgcnhfcHRyX2JvdW5kYXJ5OworCV9fdTMyIHJlc2VydmVkM1syXTsKKwkvKgorCSAqIGlmIGVuYWJsZWQgd2l0aCBDU19GRUFUX1RTVEFNUF9SWF9DVFJMLCBtb25vdG9uaWMKKwkgKiB0aW1lc3RhbXAgdGFrZW4gd2hlbiB0aGUgbGFzdCBjb250cm9sIGNvbW1hbmQgd2FzIHJlY2VpdmVkCisJICovCisJc3RydWN0IHRpbWVzcGVjIHRzdGFtcF9yeF9jdHJsOworfTsKKworI2RlZmluZSBDU19JT19NQUdJQwkJJ0MnCisKKyNkZWZpbmUgQ1NfSU9XKG51bSwgZHR5cGUpCV9JT1coQ1NfSU9fTUFHSUMsIG51bSwgZHR5cGUpCisjZGVmaW5lIENTX0lPUihudW0sIGR0eXBlKQlfSU9SKENTX0lPX01BR0lDLCBudW0sIGR0eXBlKQorI2RlZmluZSBDU19JT1dSKG51bSwgZHR5cGUpCV9JT1dSKENTX0lPX01BR0lDLCBudW0sIGR0eXBlKQorI2RlZmluZSBDU19JTyhudW0pCQlfSU8oQ1NfSU9fTUFHSUMsIG51bSkKKworI2RlZmluZSBDU19HRVRfU1RBVEUJCUNTX0lPUigyMSwgdW5zaWduZWQgaW50KQorI2RlZmluZSBDU19TRVRfV0FLRUxJTkUJCUNTX0lPVygyMywgdW5zaWduZWQgaW50KQorI2RlZmluZSBDU19HRVRfSUZfVkVSU0lPTglDU19JT1IoMzAsIHVuc2lnbmVkIGludCkKKyNkZWZpbmUgQ1NfQ09ORklHX0JVRlMJCUNTX0lPVygzMSwgc3RydWN0IGNzX2J1ZmZlcl9jb25maWcpCisKKyNlbmRpZiAvKiBfQ1NfUFJPVE9DT0xfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2FkZHIuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9pZl9hZGRyLmgKaW5kZXggZGVhMTBhOC4uNDMxOGFiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2FkZHIuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfYWRkci5oCkBAIC01MCw2ICs1MCw4IEBACiAjZGVmaW5lIElGQV9GX1BFUk1BTkVOVAkJMHg4MAogI2RlZmluZSBJRkFfRl9NQU5BR0VURU1QQUREUgkweDEwMAogI2RlZmluZSBJRkFfRl9OT1BSRUZJWFJPVVRFCTB4MjAwCisjZGVmaW5lIElGQV9GX01DQVVUT0pPSU4JMHg0MDAKKyNkZWZpbmUgSUZBX0ZfU1RBQkxFX1BSSVZBQ1kJMHg4MDAKIAogc3RydWN0IGlmYV9jYWNoZWluZm8gewogCV9fdTMyCWlmYV9wcmVmZXJlZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl9saW5rLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfbGluay5oCmluZGV4IGRmZDBiYjIuLmQ5Y2QxOTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl9saW5rLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lmX2xpbmsuaApAQCAtMTQ3LDYgKzE0Nyw3IEBACiAJSUZMQV9DQVJSSUVSX0NIQU5HRVMsCiAJSUZMQV9QSFlTX1NXSVRDSF9JRCwKIAlJRkxBX0xJTktfTkVUTlNJRCwKKwlJRkxBX1BIWVNfUE9SVF9OQU1FLAogCV9fSUZMQV9NQVgKIH07CiAKQEAgLTIxNSw2ICsyMTYsNyBAQAogZW51bSBpbjZfYWRkcl9nZW5fbW9kZSB7CiAJSU42X0FERFJfR0VOX01PREVfRVVJNjQsCiAJSU42X0FERFJfR0VOX01PREVfTk9ORSwKKwlJTjZfQUREUl9HRU5fTU9ERV9TVEFCTEVfUFJJVkFDWSwKIH07CiAKIC8qIEJyaWRnZSBzZWN0aW9uICovCkBAIC0yMjQsNiArMjI2LDkgQEAKIAlJRkxBX0JSX0ZPUldBUkRfREVMQVksCiAJSUZMQV9CUl9IRUxMT19USU1FLAogCUlGTEFfQlJfTUFYX0FHRSwKKwlJRkxBX0JSX0FHRUlOR19USU1FLAorCUlGTEFfQlJfU1RQX1NUQVRFLAorCUlGTEFfQlJfUFJJT1JJVFksCiAJX19JRkxBX0JSX01BWCwKIH07CiAKQEAgLTI0Nyw2ICsyNTIsNyBAQAogCUlGTEFfQlJQT1JUX1VOSUNBU1RfRkxPT0QsIC8qIGZsb29kIHVuaWNhc3QgdHJhZmZpYyAqLwogCUlGTEFfQlJQT1JUX1BST1hZQVJQLAkvKiBwcm94eSBBUlAgKi8KIAlJRkxBX0JSUE9SVF9MRUFSTklOR19TWU5DLCAvKiBtYWMgbGVhcm5pbmcgc3luYyBmcm9tIGRldmljZSAqLworCUlGTEFfQlJQT1JUX1BST1hZQVJQX1dJRkksIC8qIHByb3h5IEFSUCBmb3IgV2ktRmkgKi8KIAlfX0lGTEFfQlJQT1JUX01BWAogfTsKICNkZWZpbmUgSUZMQV9CUlBPUlRfTUFYIChfX0lGTEFfQlJQT1JUX01BWCAtIDEpCkBAIC00NTksNiArNDY1LDkgQEAKIAlJRkxBX1ZGX1NQT09GQ0hLLAkvKiBTcG9vZiBDaGVja2luZyBvbi9vZmYgc3dpdGNoICovCiAJSUZMQV9WRl9MSU5LX1NUQVRFLAkvKiBsaW5rIHN0YXRlIGVuYWJsZS9kaXNhYmxlL2F1dG8gc3dpdGNoICovCiAJSUZMQV9WRl9SQVRFLAkJLyogTWluIGFuZCBNYXggVFggQmFuZHdpZHRoIEFsbG9jYXRpb24gKi8KKwlJRkxBX1ZGX1JTU19RVUVSWV9FTiwJLyogUlNTIFJlZGlyZWN0aW9uIFRhYmxlIGFuZCBIYXNoIEtleSBxdWVyeQorCQkJCSAqIG9uL29mZiBzd2l0Y2gKKwkJCQkgKi8KIAlfX0lGTEFfVkZfTUFYLAogfTsKIApAQCAtNTAzLDYgKzUxMiwxMSBAQAogCV9fdTMyIGxpbmtfc3RhdGU7CiB9OwogCitzdHJ1Y3QgaWZsYV92Zl9yc3NfcXVlcnlfZW4geworCV9fdTMyIHZmOworCV9fdTMyIHNldHRpbmc7Cit9OworCiAvKiBWRiBwb3J0cyBtYW5hZ2VtZW50IHNlY3Rpb24KICAqCiAgKglOZXN0ZWQgbGF5b3V0IG9mIHNldC9nZXQgbXNnIGlzOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BhY2tldC5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lmX3BhY2tldC5oCmluZGV4IGRhMmQ2NjguLjA1M2JkMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9pZl9wYWNrZXQuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWZfcGFja2V0LmgKQEAgLTk5LDYgKzk5LDcgQEAKICNkZWZpbmUgVFBfU1RBVFVTX1ZMQU5fVkFMSUQJCSgxIDw8IDQpIC8qIGF1eGRhdGEgaGFzIHZhbGlkIHRwX3ZsYW5fdGNpICovCiAjZGVmaW5lIFRQX1NUQVRVU19CTEtfVE1PCQkoMSA8PCA1KQogI2RlZmluZSBUUF9TVEFUVVNfVkxBTl9UUElEX1ZBTElECSgxIDw8IDYpIC8qIGF1eGRhdGEgaGFzIHZhbGlkIHRwX3ZsYW5fdHBpZCAqLworI2RlZmluZSBUUF9TVEFUVVNfQ1NVTV9WQUxJRAkJKDEgPDwgNykKIAogLyogVHggcmluZyAtIGhlYWRlciBzdGF0dXMgKi8KICNkZWZpbmUgVFBfU1RBVFVTX0FWQUlMQUJMRQkgICAgICAwCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaWlvL0tidWlsZCBiL2luY2x1ZGUvdWFwaS9saW51eC9paW8vS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Zjc2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWlvL0tidWlsZApAQCAtMCwwICsxLDMgQEAKKyMgVUFQSSBIZWFkZXIgZXhwb3J0IGxpc3QKK2hlYWRlci15ICs9IGV2ZW50cy5oCitoZWFkZXIteSArPSB0eXBlcy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvaWlvL2V2ZW50cy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lpby9ldmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGJiZGFlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lpby9ldmVudHMuaApAQCAtMCwwICsxLDQyIEBACisvKiBUaGUgaW5kdXN0cmlhbCBJL08gLSBldmVudCBwYXNzaW5nIHRvIHVzZXJzcGFjZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDExIEpvbmF0aGFuIENhbWVyb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaWZuZGVmIF9VQVBJX0lJT19FVkVOVFNfSF8KKyNkZWZpbmUgX1VBUElfSUlPX0VWRU5UU19IXworCisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKioKKyAqIHN0cnVjdCBpaW9fZXZlbnRfZGF0YSAtIFRoZSBhY3R1YWwgZXZlbnQgYmVpbmcgcHVzaGVkIHRvIHVzZXJzcGFjZQorICogQGlkOgkJZXZlbnQgaWRlbnRpZmllcgorICogQHRpbWVzdGFtcDoJYmVzdCBlc3RpbWF0ZSBvZiB0aW1lIG9mIGV2ZW50IG9jY3VycmVuY2UgKG9mdGVuIGZyb20KKyAqCQl0aGUgaW50ZXJydXB0IGhhbmRsZXIpCisgKi8KK3N0cnVjdCBpaW9fZXZlbnRfZGF0YSB7CisJX191NjQJaWQ7CisJX19zNjQJdGltZXN0YW1wOworfTsKKworI2RlZmluZSBJSU9fR0VUX0VWRU5UX0ZEX0lPQ1RMIF9JT1IoJ2knLCAweDkwLCBpbnQpCisKKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9UWVBFKG1hc2spICgobWFzayA+PiA1NikgJiAweEZGKQorCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfRElSKG1hc2spICgobWFzayA+PiA0OCkgJiAweDdGKQorCisjZGVmaW5lIElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfQ0hBTl9UWVBFKG1hc2spICgobWFzayA+PiAzMikgJiAweEZGKQorCisvKiBFdmVudCBjb2RlIG51bWJlciBleHRyYWN0aW9uIGRlcGVuZHMgb24gd2hpY2ggdHlwZSBvZiBldmVudCB3ZSBoYXZlLgorICogUGVyaGFwcyByZXZpZXcgdGhpcyBmdW5jdGlvbiBpbiB0aGUgZnV0dXJlKi8KKyNkZWZpbmUgSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9DSEFOKG1hc2spICgoX19zMTYpKG1hc2sgJiAweEZGRkYpKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0NIQU4yKG1hc2spICgoX19zMTYpKCgobWFzaykgPj4gMTYpICYgMHhGRkZGKSkKKworI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX01PRElGSUVSKG1hc2spICgobWFzayA+PiA0MCkgJiAweEZGKQorI2RlZmluZSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0RJRkYobWFzaykgKCgobWFzaykgPj4gNTUpICYgMHgxKQorCisjZW5kaWYgLyogX1VBUElfSUlPX0VWRU5UU19IXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lpby90eXBlcy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2lpby90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDYwMTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaWlvL3R5cGVzLmgKQEAgLTAsMCArMSw5MiBAQAorLyogaW5kdXN0cmlhbCBJL08gZGF0YSB0eXBlcyBuZWVkZWQgYm90aCBpbiBhbmQgb3V0IG9mIGtlcm5lbAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBKb25hdGhhbiBDYW1lcm9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIF9VQVBJX0lJT19UWVBFU19IXworI2RlZmluZSBfVUFQSV9JSU9fVFlQRVNfSF8KKworZW51bSBpaW9fY2hhbl90eXBlIHsKKwlJSU9fVk9MVEFHRSwKKwlJSU9fQ1VSUkVOVCwKKwlJSU9fUE9XRVIsCisJSUlPX0FDQ0VMLAorCUlJT19BTkdMX1ZFTCwKKwlJSU9fTUFHTiwKKwlJSU9fTElHSFQsCisJSUlPX0lOVEVOU0lUWSwKKwlJSU9fUFJPWElNSVRZLAorCUlJT19URU1QLAorCUlJT19JTkNMSSwKKwlJSU9fUk9ULAorCUlJT19BTkdMLAorCUlJT19USU1FU1RBTVAsCisJSUlPX0NBUEFDSVRBTkNFLAorCUlJT19BTFRWT0xUQUdFLAorCUlJT19DQ1QsCisJSUlPX1BSRVNTVVJFLAorCUlJT19IVU1JRElUWVJFTEFUSVZFLAorCUlJT19BQ1RJVklUWSwKKwlJSU9fU1RFUFMsCisJSUlPX0VORVJHWSwKKwlJSU9fRElTVEFOQ0UsCisJSUlPX1ZFTE9DSVRZLAorfTsKKworZW51bSBpaW9fbW9kaWZpZXIgeworCUlJT19OT19NT0QsCisJSUlPX01PRF9YLAorCUlJT19NT0RfWSwKKwlJSU9fTU9EX1osCisJSUlPX01PRF9YX0FORF9ZLAorCUlJT19NT0RfWF9BTkRfWiwKKwlJSU9fTU9EX1lfQU5EX1osCisJSUlPX01PRF9YX0FORF9ZX0FORF9aLAorCUlJT19NT0RfWF9PUl9ZLAorCUlJT19NT0RfWF9PUl9aLAorCUlJT19NT0RfWV9PUl9aLAorCUlJT19NT0RfWF9PUl9ZX09SX1osCisJSUlPX01PRF9MSUdIVF9CT1RILAorCUlJT19NT0RfTElHSFRfSVIsCisJSUlPX01PRF9ST09UX1NVTV9TUVVBUkVEX1hfWSwKKwlJSU9fTU9EX1NVTV9TUVVBUkVEX1hfWV9aLAorCUlJT19NT0RfTElHSFRfQ0xFQVIsCisJSUlPX01PRF9MSUdIVF9SRUQsCisJSUlPX01PRF9MSUdIVF9HUkVFTiwKKwlJSU9fTU9EX0xJR0hUX0JMVUUsCisJSUlPX01PRF9RVUFURVJOSU9OLAorCUlJT19NT0RfVEVNUF9BTUJJRU5ULAorCUlJT19NT0RfVEVNUF9PQkpFQ1QsCisJSUlPX01PRF9OT1JUSF9NQUdOLAorCUlJT19NT0RfTk9SVEhfVFJVRSwKKwlJSU9fTU9EX05PUlRIX01BR05fVElMVF9DT01QLAorCUlJT19NT0RfTk9SVEhfVFJVRV9USUxUX0NPTVAsCisJSUlPX01PRF9SVU5OSU5HLAorCUlJT19NT0RfSk9HR0lORywKKwlJSU9fTU9EX1dBTEtJTkcsCisJSUlPX01PRF9TVElMTCwKKwlJSU9fTU9EX1JPT1RfU1VNX1NRVUFSRURfWF9ZX1osCit9OworCitlbnVtIGlpb19ldmVudF90eXBlIHsKKwlJSU9fRVZfVFlQRV9USFJFU0gsCisJSUlPX0VWX1RZUEVfTUFHLAorCUlJT19FVl9UWVBFX1JPQywKKwlJSU9fRVZfVFlQRV9USFJFU0hfQURBUFRJVkUsCisJSUlPX0VWX1RZUEVfTUFHX0FEQVBUSVZFLAorCUlJT19FVl9UWVBFX0NIQU5HRSwKK307CisKK2VudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiB7CisJSUlPX0VWX0RJUl9FSVRIRVIsCisJSUlPX0VWX0RJUl9SSVNJTkcsCisJSUlPX0VWX0RJUl9GQUxMSU5HLAorCUlJT19FVl9ESVJfTk9ORSwKK307CisKKyNlbmRpZiAvKiBfVUFQSV9JSU9fVFlQRVNfSF8gKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lucHV0LmggYi9pbmNsdWRlL3VhcGkvbGludXgvaW5wdXQuaAppbmRleCBiMGE4MTMwLi43MzE0MTdjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvaW5wdXQuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaW5wdXQuaApAQCAtMzY5LDcgKzM2OSw4IEBACiAjZGVmaW5lIEtFWV9NU0RPUwkJMTUxCiAjZGVmaW5lIEtFWV9DT0ZGRUUJCTE1MgkvKiBBTCBUZXJtaW5hbCBMb2NrL1NjcmVlbnNhdmVyICovCiAjZGVmaW5lIEtFWV9TQ1JFRU5MT0NLCQlLRVlfQ09GRkVFCi0jZGVmaW5lIEtFWV9ESVJFQ1RJT04JCTE1MworI2RlZmluZSBLRVlfUk9UQVRFX0RJU1BMQVkJMTUzCS8qIERpc3BsYXkgb3JpZW50YXRpb24gZm9yIGUuZy4gdGFibGV0cyAqLworI2RlZmluZSBLRVlfRElSRUNUSU9OCQlLRVlfUk9UQVRFX0RJU1BMQVkKICNkZWZpbmUgS0VZX0NZQ0xFV0lORE9XUwkxNTQKICNkZWZpbmUgS0VZX01BSUwJCTE1NQogI2RlZmluZSBLRVlfQk9PS01BUktTCQkxNTYJLyogQUMgQm9va21hcmtzICovCkBAIC03MDIsNiArNzAzLDEwIEBACiAjZGVmaW5lIEtFWV9OVU1FUklDXzkJCTB4MjA5CiAjZGVmaW5lIEtFWV9OVU1FUklDX1NUQVIJMHgyMGEKICNkZWZpbmUgS0VZX05VTUVSSUNfUE9VTkQJMHgyMGIKKyNkZWZpbmUgS0VZX05VTUVSSUNfQQkJMHgyMGMJLyogUGhvbmUga2V5IEEgLSBIVVQgVGVsZXBob255IDB4YjkgKi8KKyNkZWZpbmUgS0VZX05VTUVSSUNfQgkJMHgyMGQKKyNkZWZpbmUgS0VZX05VTUVSSUNfQwkJMHgyMGUKKyNkZWZpbmUgS0VZX05VTUVSSUNfRAkJMHgyMGYKIAogI2RlZmluZSBLRVlfQ0FNRVJBX0ZPQ1VTCTB4MjEwCiAjZGVmaW5lIEtFWV9XUFNfQlVUVE9OCQkweDIxMQkvKiBXaUZpIFByb3RlY3RlZCBTZXR1cCBrZXkgKi8KQEAgLTk3Myw3ICs5NzgsOCBAQAogICovCiAjZGVmaW5lIE1UX1RPT0xfRklOR0VSCQkwCiAjZGVmaW5lIE1UX1RPT0xfUEVOCQkxCi0jZGVmaW5lIE1UX1RPT0xfTUFYCQkxCisjZGVmaW5lIE1UX1RPT0xfUEFMTQkJMgorI2RlZmluZSBNVF9UT09MX01BWAkJMgogCiAvKgogICogVmFsdWVzIGRlc2NyaWJpbmcgdGhlIHN0YXR1cyBvZiBhIGZvcmNlLWZlZWRiYWNrIGVmZmVjdApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lwX3ZzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvaXBfdnMuaAppbmRleCBjYWJlOTVkLi4zMTk5MjQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvaXBfdnMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaXBfdnMuaApAQCAtMzU4LDYgKzM1OCw4IEBACiAKIAlJUFZTX1NWQ19BVFRSX1BFX05BTUUsCQkvKiBuYW1lIG9mIGN0IHJldHJpZXZlciAqLwogCisJSVBWU19TVkNfQVRUUl9TVEFUUzY0LAkJLyogbmVzdGVkIGF0dHJpYnV0ZSBmb3Igc2VydmljZSBzdGF0cyAqLworCiAJX19JUFZTX1NWQ19BVFRSX01BWCwKIH07CiAKQEAgLTM4Nyw2ICszODksOCBAQAogCiAJSVBWU19ERVNUX0FUVFJfQUREUl9GQU1JTFksCS8qIEFkZHJlc3MgZmFtaWx5IG9mIGFkZHJlc3MgKi8KIAorCUlQVlNfREVTVF9BVFRSX1NUQVRTNjQsCQkvKiBuZXN0ZWQgYXR0cmlidXRlIGZvciBkZXN0IHN0YXRzICovCisKIAlfX0lQVlNfREVTVF9BVFRSX01BWCwKIH07CiAKQEAgLTQxMCw3ICs0MTQsOCBAQAogLyoKICAqIEF0dHJpYnV0ZXMgdXNlZCB0byBkZXNjcmliZSBzZXJ2aWNlIG9yIGRlc3RpbmF0aW9uIGVudHJ5IHN0YXRpc3RpY3MKICAqCi0gKiBVc2VkIGluc2lkZSBuZXN0ZWQgYXR0cmlidXRlcyBJUFZTX1NWQ19BVFRSX1NUQVRTIGFuZCBJUFZTX0RFU1RfQVRUUl9TVEFUUworICogVXNlZCBpbnNpZGUgbmVzdGVkIGF0dHJpYnV0ZXMgSVBWU19TVkNfQVRUUl9TVEFUUywgSVBWU19ERVNUX0FUVFJfU1RBVFMsCisgKiBJUFZTX1NWQ19BVFRSX1NUQVRTNjQgYW5kIElQVlNfREVTVF9BVFRSX1NUQVRTNjQuCiAgKi8KIGVudW0gewogCUlQVlNfU1RBVFNfQVRUUl9VTlNQRUMgPSAwLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2lwdjYuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9pcHY2LmgKaW5kZXggNDM3YTZhNC4uNWVmYTU0YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L2lwdjYuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvaXB2Ni5oCkBAIC0xNzAsNiArMTcwLDcgQEAKIAlERVZDT05GX0FDQ0VQVF9SQV9GUk9NX0xPQ0FMLAogCURFVkNPTkZfVVNFX09QVElNSVNUSUMsCiAJREVWQ09ORl9BQ0NFUFRfUkFfTVRVLAorCURFVkNPTkZfU1RBQkxFX1NFQ1JFVCwKIAlERVZDT05GX01BWAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L2t2bS5oCmluZGV4IDgwNTU3MDYuLmY1NzRkN2IgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9rdm0uaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgva3ZtLmgKQEAgLTE0Nyw2ICsxNDcsMTYgQEAKIAogI2RlZmluZSBLVk1fUElUX1NQRUFLRVJfRFVNTVkgICAgIDEKIAorc3RydWN0IGt2bV9zMzkwX3NrZXlzIHsKKwlfX3U2NCBzdGFydF9nZm47CisJX191NjQgY291bnQ7CisJX191NjQgc2tleWRhdGFfYWRkcjsKKwlfX3UzMiBmbGFnczsKKwlfX3UzMiByZXNlcnZlZFs5XTsKK307CisjZGVmaW5lIEtWTV9TMzkwX0dFVF9TS0VZU19OT05FICAgMQorI2RlZmluZSBLVk1fUzM5MF9TS0VZU19NQVggICAgICAgIDEwNDg1NzYKKwogI2RlZmluZSBLVk1fRVhJVF9VTktOT1dOICAgICAgICAgIDAKICNkZWZpbmUgS1ZNX0VYSVRfRVhDRVBUSU9OICAgICAgICAxCiAjZGVmaW5lIEtWTV9FWElUX0lPICAgICAgICAgICAgICAgMgpAQCAtMTcyLDYgKzE4Miw3IEBACiAjZGVmaW5lIEtWTV9FWElUX1MzOTBfVFNDSCAgICAgICAgMjIKICNkZWZpbmUgS1ZNX0VYSVRfRVBSICAgICAgICAgICAgICAyMwogI2RlZmluZSBLVk1fRVhJVF9TWVNURU1fRVZFTlQgICAgIDI0CisjZGVmaW5lIEtWTV9FWElUX1MzOTBfU1RTSSAgICAgICAgMjUKIAogLyogRm9yIEtWTV9FWElUX0lOVEVSTkFMX0VSUk9SICovCiAvKiBFbXVsYXRlIGluc3RydWN0aW9uIGZhaWxlZC4gKi8KQEAgLTMwOSw2ICszMjAsMTUgQEAKIAkJCV9fdTMyIHR5cGU7CiAJCQlfX3U2NCBmbGFnczsKIAkJfSBzeXN0ZW1fZXZlbnQ7CisJCS8qIEtWTV9FWElUX1MzOTBfU1RTSSAqLworCQlzdHJ1Y3QgeworCQkJX191NjQgYWRkcjsKKwkJCV9fdTggYXI7CisJCQlfX3U4IHJlc2VydmVkOworCQkJX191OCBmYzsKKwkJCV9fdTggc2VsMTsKKwkJCV9fdTE2IHNlbDI7CisJCX0gczM5MF9zdHNpOwogCQkvKiBGaXggdGhlIHNpemUgb2YgdGhlIHVuaW9uLiAqLwogCQljaGFyIHBhZGRpbmdbMjU2XTsKIAl9OwpAQCAtMzI0LDcgKzM0NCw3IEBACiAJX191NjQga3ZtX2RpcnR5X3JlZ3M7CiAJdW5pb24gewogCQlzdHJ1Y3Qga3ZtX3N5bmNfcmVncyByZWdzOwotCQljaGFyIHBhZGRpbmdbMTAyNF07CisJCWNoYXIgcGFkZGluZ1syMDQ4XTsKIAl9IHM7CiB9OwogCkBAIC0zNjUsNiArMzg1LDI0IEBACiAJX191OCAgcGFkWzVdOwogfTsKIAorLyogZm9yIEtWTV9TMzkwX01FTV9PUCAqLworc3RydWN0IGt2bV9zMzkwX21lbV9vcCB7CisJLyogaW4gKi8KKwlfX3U2NCBnYWRkcjsJCS8qIHRoZSBndWVzdCBhZGRyZXNzICovCisJX191NjQgZmxhZ3M7CQkvKiBmbGFncyAqLworCV9fdTMyIHNpemU7CQkvKiBhbW91bnQgb2YgYnl0ZXMgKi8KKwlfX3UzMiBvcDsJCS8qIHR5cGUgb2Ygb3BlcmF0aW9uICovCisJX191NjQgYnVmOwkJLyogYnVmZmVyIGluIHVzZXJzcGFjZSAqLworCV9fdTggYXI7CQkvKiB0aGUgYWNjZXNzIHJlZ2lzdGVyIG51bWJlciAqLworCV9fdTggcmVzZXJ2ZWRbMzFdOwkvKiBzaG91bGQgYmUgc2V0IHRvIDAgKi8KK307CisvKiB0eXBlcyBmb3Iga3ZtX3MzOTBfbWVtX29wLT5vcCAqLworI2RlZmluZSBLVk1fUzM5MF9NRU1PUF9MT0dJQ0FMX1JFQUQJMAorI2RlZmluZSBLVk1fUzM5MF9NRU1PUF9MT0dJQ0FMX1dSSVRFCTEKKy8qIGZsYWdzIGZvciBrdm1fczM5MF9tZW1fb3AtPmZsYWdzICovCisjZGVmaW5lIEtWTV9TMzkwX01FTU9QX0ZfQ0hFQ0tfT05MWQkJKDFVTEwgPDwgMCkKKyNkZWZpbmUgS1ZNX1MzOTBfTUVNT1BfRl9JTkpFQ1RfRVhDRVBUSU9OCSgxVUxMIDw8IDEpCisKIC8qIGZvciBLVk1fSU5URVJSVVBUICovCiBzdHJ1Y3Qga3ZtX2ludGVycnVwdCB7CiAJLyogaW4gKi8KQEAgLTUyMCw2ICs1NTgsMTMgQEAKIAl9IHU7CiB9OwogCitzdHJ1Y3Qga3ZtX3MzOTBfaXJxX3N0YXRlIHsKKwlfX3U2NCBidWY7CisJX191MzIgZmxhZ3M7CisJX191MzIgbGVuOworCV9fdTMyIHJlc2VydmVkWzRdOworfTsKKwogLyogZm9yIEtWTV9TRVRfR1VFU1RfREVCVUcgKi8KIAogI2RlZmluZSBLVk1fR1VFU1REQkdfRU5BQkxFCQkweDAwMDAwMDAxCkBAIC03NjAsNiArODA1LDE0IEBACiAjZGVmaW5lIEtWTV9DQVBfUFBDX0VOQUJMRV9IQ0FMTCAxMDQKICNkZWZpbmUgS1ZNX0NBUF9DSEVDS19FWFRFTlNJT05fVk0gMTA1CiAjZGVmaW5lIEtWTV9DQVBfUzM5MF9VU0VSX1NJR1AgMTA2CisjZGVmaW5lIEtWTV9DQVBfUzM5MF9WRUNUT1JfUkVHSVNURVJTIDEwNworI2RlZmluZSBLVk1fQ0FQX1MzOTBfTUVNX09QIDEwOAorI2RlZmluZSBLVk1fQ0FQX1MzOTBfVVNFUl9TVFNJIDEwOQorI2RlZmluZSBLVk1fQ0FQX1MzOTBfU0tFWVMgMTEwCisjZGVmaW5lIEtWTV9DQVBfTUlQU19GUFUgMTExCisjZGVmaW5lIEtWTV9DQVBfTUlQU19NU0EgMTEyCisjZGVmaW5lIEtWTV9DQVBfUzM5MF9JTkpFQ1RfSVJRIDExMworI2RlZmluZSBLVk1fQ0FQX1MzOTBfSVJRX1NUQVRFIDExNAogCiAjaWZkZWYgS1ZNX0NBUF9JUlFfUk9VVElORwogCkBAIC0xMTM1LDYgKzExODgsMTYgQEAKICNkZWZpbmUgS1ZNX0FSTV9WQ1BVX0lOSVQJICBfSU9XKEtWTUlPLCAgMHhhZSwgc3RydWN0IGt2bV92Y3B1X2luaXQpCiAjZGVmaW5lIEtWTV9BUk1fUFJFRkVSUkVEX1RBUkdFVCAgX0lPUihLVk1JTywgIDB4YWYsIHN0cnVjdCBrdm1fdmNwdV9pbml0KQogI2RlZmluZSBLVk1fR0VUX1JFR19MSVNUCSAgX0lPV1IoS1ZNSU8sIDB4YjAsIHN0cnVjdCBrdm1fcmVnX2xpc3QpCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1MzOTBfTUVNX09QICovCisjZGVmaW5lIEtWTV9TMzkwX01FTV9PUAkJICBfSU9XKEtWTUlPLCAgMHhiMSwgc3RydWN0IGt2bV9zMzkwX21lbV9vcCkKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfUzM5MF9TS0VZUyAqLworI2RlZmluZSBLVk1fUzM5MF9HRVRfU0tFWVMgICAgICBfSU9XKEtWTUlPLCAweGIyLCBzdHJ1Y3Qga3ZtX3MzOTBfc2tleXMpCisjZGVmaW5lIEtWTV9TMzkwX1NFVF9TS0VZUyAgICAgIF9JT1coS1ZNSU8sIDB4YjMsIHN0cnVjdCBrdm1fczM5MF9za2V5cykKKy8qIEF2YWlsYWJsZSB3aXRoIEtWTV9DQVBfUzM5MF9JTkpFQ1RfSVJRICovCisjZGVmaW5lIEtWTV9TMzkwX0lSUSAgICAgICAgICAgICAgX0lPVyhLVk1JTywgIDB4YjQsIHN0cnVjdCBrdm1fczM5MF9pcnEpCisvKiBBdmFpbGFibGUgd2l0aCBLVk1fQ0FQX1MzOTBfSVJRX1NUQVRFICovCisjZGVmaW5lIEtWTV9TMzkwX1NFVF9JUlFfU1RBVEUJICBfSU9XKEtWTUlPLCAweGI1LCBzdHJ1Y3Qga3ZtX3MzOTBfaXJxX3N0YXRlKQorI2RlZmluZSBLVk1fUzM5MF9HRVRfSVJRX1NUQVRFCSAgX0lPVyhLVk1JTywgMHhiNiwgc3RydWN0IGt2bV9zMzkwX2lycV9zdGF0ZSkKIAogI2RlZmluZSBLVk1fREVWX0FTU0lHTl9FTkFCTEVfSU9NTVUJKDEgPDwgMCkKICNkZWZpbmUgS1ZNX0RFVl9BU1NJR05fUENJXzJfMwkJKDEgPDwgMSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9tYWdpYy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L21hZ2ljLmgKaW5kZXggN2Q2NjRlYS4uN2IxNDI1YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L21hZ2ljLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L21hZ2ljLmgKQEAgLTU4LDYgKzU4LDggQEAKIAogI2RlZmluZSBTVEFDS19FTkRfTUFHSUMJCTB4NTdBQzZFOUQKIAorI2RlZmluZSBUUkFDRUZTX01BR0lDICAgICAgICAgIDB4NzQ3MjYxNjMKKwogI2RlZmluZSBWOUZTX01BR0lDCQkweDAxMDIxOTk3CiAKICNkZWZpbmUgQkRFVkZTX01BR0lDICAgICAgICAgICAgMHg2MjY0NjU3NgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L25laWdoYm91ci5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L25laWdoYm91ci5oCmluZGV4IDM4NzNhMzUuLjJlMzVjNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9uZWlnaGJvdXIuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbmVpZ2hib3VyLmgKQEAgLTEyNiw2ICsxMjYsNyBAQAogCU5EVFBBX1BST1hZX1FMRU4sCQkvKiB1MzIgKi8KIAlORFRQQV9MT0NLVElNRSwJCQkvKiB1NjQsIG1zZWNzICovCiAJTkRUUEFfUVVFVUVfTEVOQllURVMsCQkvKiB1MzIgKi8KKwlORFRQQV9NQ0FTVF9SRVBST0JFUywJCS8qIHUzMiAqLwogCV9fTkRUUEFfTUFYCiB9OwogI2RlZmluZSBORFRQQV9NQVggKF9fTkRUUEFfTUFYIC0gMSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmggYi9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oCmluZGV4IDgzMmJjNDYuLjVmYTFjZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlci9uZl90YWJsZXMuaApAQCAtMSwxOSArMSw0OSBAQAogI2lmbmRlZiBfTElOVVhfTkZfVEFCTEVTX0gKICNkZWZpbmUgX0xJTlVYX05GX1RBQkxFU19ICiAKKyNkZWZpbmUgTkZUX1RBQkxFX01BWE5BTUVMRU4JMzIKICNkZWZpbmUgTkZUX0NIQUlOX01BWE5BTUVMRU4JMzIKICNkZWZpbmUgTkZUX1VTRVJEQVRBX01BWExFTgkyNTYKIAorLyoqCisgKiBlbnVtIG5mdF9yZWdpc3RlcnMgLSBuZl90YWJsZXMgcmVnaXN0ZXJzCisgKgorICogbmZfdGFibGVzIHVzZWQgdG8gaGF2ZSBmaXZlIHJlZ2lzdGVyczogYSB2ZXJkaWN0IHJlZ2lzdGVyIGFuZCBmb3VyIGRhdGEKKyAqIHJlZ2lzdGVycyBvZiBzaXplIDE2LiBUaGUgZGF0YSByZWdpc3RlcnMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gMTYgcmVnaXN0ZXJzCisgKiBvZiBzaXplIDQuIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMsIHRoZSBORlRfUkVHX1sxLTRdIHJlZ2lzdGVycyBzdGlsbAorICogbWFwIHRvIGFyZWFzIG9mIHNpemUgMTYsIHRoZSA0IGJ5dGUgcmVnaXN0ZXJzIGFyZSBhZGRyZXNzZWQgdXNpbmcKKyAqIE5GVF9SRUczMl8wMCAtIE5GVF9SRUczMl8xNS4KKyAqLwogZW51bSBuZnRfcmVnaXN0ZXJzIHsKIAlORlRfUkVHX1ZFUkRJQ1QsCiAJTkZUX1JFR18xLAogCU5GVF9SRUdfMiwKIAlORlRfUkVHXzMsCiAJTkZUX1JFR180LAotCV9fTkZUX1JFR19NQVgKKwlfX05GVF9SRUdfTUFYLAorCisJTkZUX1JFRzMyXzAwCT0gOCwKKwlNRlRfUkVHMzJfMDEsCisJTkZUX1JFRzMyXzAyLAorCU5GVF9SRUczMl8wMywKKwlORlRfUkVHMzJfMDQsCisJTkZUX1JFRzMyXzA1LAorCU5GVF9SRUczMl8wNiwKKwlORlRfUkVHMzJfMDcsCisJTkZUX1JFRzMyXzA4LAorCU5GVF9SRUczMl8wOSwKKwlORlRfUkVHMzJfMTAsCisJTkZUX1JFRzMyXzExLAorCU5GVF9SRUczMl8xMiwKKwlORlRfUkVHMzJfMTMsCisJTkZUX1JFRzMyXzE0LAorCU5GVF9SRUczMl8xNSwKIH07CiAjZGVmaW5lIE5GVF9SRUdfTUFYCShfX05GVF9SRUdfTUFYIC0gMSkKIAorI2RlZmluZSBORlRfUkVHX1NJWkUJMTYKKyNkZWZpbmUgTkZUX1JFRzMyX1NJWkUJNAorCiAvKioKICAqIGVudW0gbmZ0X3ZlcmRpY3RzIC0gbmZfdGFibGVzIGludGVybmFsIHZlcmRpY3RzCiAgKgpAQCAtMjA3LDEyICsyMzcsMTYgQEAKICAqIEBORlRfU0VUX0NPTlNUQU5UOiBzZXQgY29udGVudHMgbWF5IG5vdCBjaGFuZ2Ugd2hpbGUgYm91bmQKICAqIEBORlRfU0VUX0lOVEVSVkFMOiBzZXQgY29udGFpbnMgaW50ZXJ2YWxzCiAgKiBATkZUX1NFVF9NQVA6IHNldCBpcyB1c2VkIGFzIGEgZGljdGlvbmFyeQorICogQE5GVF9TRVRfVElNRU9VVDogc2V0IHVzZXMgdGltZW91dHMKKyAqIEBORlRfU0VUX0VWQUw6IHNldCBjb250YWlucyBleHByZXNzaW9ucyBmb3IgZXZhbHVhdGlvbgogICovCiBlbnVtIG5mdF9zZXRfZmxhZ3MgewogCU5GVF9TRVRfQU5PTllNT1VTCQk9IDB4MSwKIAlORlRfU0VUX0NPTlNUQU5UCQk9IDB4MiwKIAlORlRfU0VUX0lOVEVSVkFMCQk9IDB4NCwKIAlORlRfU0VUX01BUAkJCT0gMHg4LAorCU5GVF9TRVRfVElNRU9VVAkJCT0gMHgxMCwKKwlORlRfU0VUX0VWQUwJCQk9IDB4MjAsCiB9OwogCiAvKioKQEAgLTI1MSw2ICsyODUsOCBAQAogICogQE5GVEFfU0VUX1BPTElDWTogc2VsZWN0aW9uIHBvbGljeSAoTkxBX1UzMikKICAqIEBORlRBX1NFVF9ERVNDOiBzZXQgZGVzY3JpcHRpb24gKE5MQV9ORVNURUQpCiAgKiBATkZUQV9TRVRfSUQ6IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSBzZXQgaW4gYSB0cmFuc2FjdGlvbiAoTkxBX1UzMikKKyAqIEBORlRBX1NFVF9USU1FT1VUOiBkZWZhdWx0IHRpbWVvdXQgdmFsdWUgKE5MQV9VNjQpCisgKiBATkZUQV9TRVRfR0NfSU5URVJWQUw6IGdhcmJhZ2UgY29sbGVjdGlvbiBpbnRlcnZhbCAoTkxBX1UzMikKICAqLwogZW51bSBuZnRfc2V0X2F0dHJpYnV0ZXMgewogCU5GVEFfU0VUX1VOU1BFQywKQEAgLTI2NCw2ICszMDAsOCBAQAogCU5GVEFfU0VUX1BPTElDWSwKIAlORlRBX1NFVF9ERVNDLAogCU5GVEFfU0VUX0lELAorCU5GVEFfU0VUX1RJTUVPVVQsCisJTkZUQV9TRVRfR0NfSU5URVJWQUwsCiAJX19ORlRBX1NFVF9NQVgKIH07CiAjZGVmaW5lIE5GVEFfU0VUX01BWAkJKF9fTkZUQV9TRVRfTUFYIC0gMSkKQEAgLTI4MywxMiArMzIxLDIwIEBACiAgKiBATkZUQV9TRVRfRUxFTV9LRVk6IGtleSB2YWx1ZSAoTkxBX05FU1RFRDogbmZ0X2RhdGEpCiAgKiBATkZUQV9TRVRfRUxFTV9EQVRBOiBkYXRhIHZhbHVlIG9mIG1hcHBpbmcgKE5MQV9ORVNURUQ6IG5mdF9kYXRhX2F0dHJpYnV0ZXMpCiAgKiBATkZUQV9TRVRfRUxFTV9GTEFHUzogYml0bWFzayBvZiBuZnRfc2V0X2VsZW1fZmxhZ3MgKE5MQV9VMzIpCisgKiBATkZUQV9TRVRfRUxFTV9USU1FT1VUOiB0aW1lb3V0IHZhbHVlIChOTEFfVTY0KQorICogQE5GVEFfU0VUX0VMRU1fRVhQSVJBVElPTjogZXhwaXJhdGlvbiB0aW1lIChOTEFfVTY0KQorICogQE5GVEFfU0VUX0VMRU1fVVNFUkRBVEE6IHVzZXIgZGF0YSAoTkxBX0JJTkFSWSkKKyAqIEBORlRBX1NFVF9FTEVNX0VYUFI6IGV4cHJlc3Npb24gKE5MQV9ORVNURUQ6IG5mdF9leHByX2F0dHJpYnV0ZXMpCiAgKi8KIGVudW0gbmZ0X3NldF9lbGVtX2F0dHJpYnV0ZXMgewogCU5GVEFfU0VUX0VMRU1fVU5TUEVDLAogCU5GVEFfU0VUX0VMRU1fS0VZLAogCU5GVEFfU0VUX0VMRU1fREFUQSwKIAlORlRBX1NFVF9FTEVNX0ZMQUdTLAorCU5GVEFfU0VUX0VMRU1fVElNRU9VVCwKKwlORlRBX1NFVF9FTEVNX0VYUElSQVRJT04sCisJTkZUQV9TRVRfRUxFTV9VU0VSREFUQSwKKwlORlRBX1NFVF9FTEVNX0VYUFIsCiAJX19ORlRBX1NFVF9FTEVNX01BWAogfTsKICNkZWZpbmUgTkZUQV9TRVRfRUxFTV9NQVgJKF9fTkZUQV9TRVRfRUxFTV9NQVggLSAxKQpAQCAtMzQ2LDYgKzM5Miw5IEBACiB9OwogI2RlZmluZSBORlRBX0RBVEFfTUFYCQkoX19ORlRBX0RBVEFfTUFYIC0gMSkKIAorLyogTWF4aW11bSBsZW5ndGggb2YgYSB2YWx1ZSAqLworI2RlZmluZSBORlRfREFUQV9WQUxVRV9NQVhMRU4JNjQKKwogLyoqCiAgKiBlbnVtIG5mdF92ZXJkaWN0X2F0dHJpYnV0ZXMgLSBuZl90YWJsZXMgdmVyZGljdCBuZXRsaW5rIGF0dHJpYnV0ZXMKICAqCkBAIC01MDQsNiArNTUzLDM1IEBACiB9OwogI2RlZmluZSBORlRBX0xPT0tVUF9NQVgJCShfX05GVEFfTE9PS1VQX01BWCAtIDEpCiAKK2VudW0gbmZ0X2R5bnNldF9vcHMgeworCU5GVF9EWU5TRVRfT1BfQURELAorCU5GVF9EWU5TRVRfT1BfVVBEQVRFLAorfTsKKworLyoqCisgKiBlbnVtIG5mdF9keW5zZXRfYXR0cmlidXRlcyAtIGR5bnNldCBleHByZXNzaW9uIGF0dHJpYnV0ZXMKKyAqCisgKiBATkZUQV9EWU5TRVRfU0VUX05BTUU6IG5hbWUgb2Ygc2V0IHRoZSB0byBhZGQgZGF0YSB0byAoTkxBX1NUUklORykKKyAqIEBORlRBX0RZTlNFVF9TRVRfSUQ6IHVuaXF1ZWx5IGlkZW50aWZpZXIgb2YgdGhlIHNldCBpbiB0aGUgdHJhbnNhY3Rpb24gKE5MQV9VMzIpCisgKiBATkZUQV9EWU5TRVRfT1A6IG9wZXJhdGlvbiAoTkxBX1UzMikKKyAqIEBORlRBX0RZTlNFVF9TUkVHX0tFWTogc291cmNlIHJlZ2lzdGVyIG9mIHRoZSBrZXkgKE5MQV9VMzIpCisgKiBATkZUQV9EWU5TRVRfU1JFR19EQVRBOiBzb3VyY2UgcmVnaXN0ZXIgb2YgdGhlIGRhdGEgKE5MQV9VMzIpCisgKiBATkZUQV9EWU5TRVRfVElNRU9VVDogdGltZW91dCB2YWx1ZSBmb3IgdGhlIG5ldyBlbGVtZW50IChOTEFfVTY0KQorICogQE5GVEFfRFlOU0VUX0VYUFI6IGV4cHJlc3Npb24gKE5MQV9ORVNURUQ6IG5mdF9leHByX2F0dHJpYnV0ZXMpCisgKi8KK2VudW0gbmZ0X2R5bnNldF9hdHRyaWJ1dGVzIHsKKwlORlRBX0RZTlNFVF9VTlNQRUMsCisJTkZUQV9EWU5TRVRfU0VUX05BTUUsCisJTkZUQV9EWU5TRVRfU0VUX0lELAorCU5GVEFfRFlOU0VUX09QLAorCU5GVEFfRFlOU0VUX1NSRUdfS0VZLAorCU5GVEFfRFlOU0VUX1NSRUdfREFUQSwKKwlORlRBX0RZTlNFVF9USU1FT1VULAorCU5GVEFfRFlOU0VUX0VYUFIsCisJX19ORlRBX0RZTlNFVF9NQVgsCit9OworI2RlZmluZSBORlRBX0RZTlNFVF9NQVgJCShfX05GVEFfRFlOU0VUX01BWCAtIDEpCisKIC8qKgogICogZW51bSBuZnRfcGF5bG9hZF9iYXNlcyAtIG5mX3RhYmxlcyBwYXlsb2FkIGV4cHJlc3Npb24gb2Zmc2V0IGJhc2VzCiAgKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9uZXRmaWx0ZXJfYnJpZGdlL2VidGFibGVzLmgKaW5kZXggYmE5OTMzNi4uNzczZGZlOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L25ldGZpbHRlcl9icmlkZ2UvZWJ0YWJsZXMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oCkBAIC0xMiw5ICsxMiw3IEBACiAKICNpZm5kZWYgX1VBUElfX0xJTlVYX0JSSURHRV9FRkZfSAogI2RlZmluZSBfVUFQSV9fTElOVVhfQlJJREdFX0VGRl9ICi0jaW5jbHVkZSA8bGludXgvaWYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KIAogI2RlZmluZSBFQlRfVEFCTEVfTUFYTkFNRUxFTiAzMgogI2RlZmluZSBFQlRfQ0hBSU5fTUFYTkFNRUxFTiBFQlRfVEFCTEVfTUFYTkFNRUxFTgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L25mc2QvZXhwb3J0LmggYi9pbmNsdWRlL3VhcGkvbGludXgvbmZzZC9leHBvcnQuaAppbmRleCA0NzQyZjJjLi5kM2JkNmZmZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L25mc2QvZXhwb3J0LmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L25mc2QvZXhwb3J0LmgKQEAgLTQ3LDcgKzQ3LDcgQEAKICAqIGV4cG9ydGVkIGZpbGVzeXN0ZW0uCiAgKi8KICNkZWZpbmUJTkZTRVhQX1Y0Uk9PVAkJMHgxMDAwMAotI2RlZmluZSBORlNFWFBfTk9QTkZTCQkweDIwMDAwCisjZGVmaW5lIE5GU0VYUF9QTkZTCQkweDIwMDAwCiAKIC8qIEFsbCBmbGFncyB0aGF0IHdlIGNsYWltIHRvIHN1cHBvcnQuICAoTm90ZSB3ZSBkb24ndCBzdXBwb3J0IE5PQUNMLikgKi8KICNkZWZpbmUgTkZTRVhQX0FMTEZMQUdTCQkweDNGRTdGCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvbmw4MDIxMS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L25sODAyMTEuaAppbmRleCA2OGIyOTRlLi4yNDEyMjBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvbmw4MDIxMS5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9ubDgwMjExLmgKQEAgLTI1LDYgKzI1LDE5IEBACiAgKgogICovCiAKKy8qCisgKiBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgdGhlIHVzZXJzcGFjZSBBUEkgdG8gdGhlIHdpcmVsZXNzIHN0YWNrLiBQbGVhc2UKKyAqIGJlIGNhcmVmdWwgbm90IHRvIGJyZWFrIHRoaW5ncyAtIGkuZS4gZG9uJ3QgbW92ZSBhbnl0aGluZyBhcm91bmQgb3Igc28KKyAqIHVubGVzcyB5b3UgY2FuIGRlbW9uc3RyYXRlIHRoYXQgaXQgYnJlYWtzIG5laXRoZXIgQVBJIG5vciBBQkkuCisgKgorICogQWRkaXRpb25zIHRvIHRoZSBBUEkgc2hvdWxkIGJlIGFjY29tcGFuaWVkIGJ5IGFjdHVhbCBpbXBsZW1lbnRhdGlvbnMgaW4KKyAqIGFuIHVwc3RyZWFtIGRyaXZlciwgc28gdGhhdCBleGFtcGxlIGltcGxlbWVudGF0aW9ucyBleGlzdCBpbiBjYXNlIHRoZXJlCisgKiBhcmUgZXZlciBjb25jZXJucyBhYm91dCB0aGUgcHJlY2lzZSBzZW1hbnRpY3Mgb2YgdGhlIEFQSSBvciBjaGFuZ2VzIGFyZQorICogbmVlZGVkLCBhbmQgdG8gZW5zdXJlIHRoYXQgY29kZSBmb3IgZGVhZCAobm8gbG9uZ2VyIGltcGxlbWVudGVkKSBBUEkKKyAqIGNhbiBhY3R1YWxseSBiZSBpZGVudGlmaWVkIGFuZCByZW1vdmVkLgorICogTm9uZXRoZWxlc3MsIHNlbWFudGljcyBzaG91bGQgYWxzbyBiZSBkb2N1bWVudGVkIGNhcmVmdWxseSBpbiB0aGlzIGZpbGUuCisgKi8KKwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKICNkZWZpbmUgTkw4MDIxMV9HRU5MX05BTUUgIm5sODAyMTEiCkBAIC0xNjg0LDYgKzE2OTcsMTAgQEAKICAqCUlmIHNldCBkdXJpbmcgc2NoZWR1bGVkIHNjYW4gc3RhcnQgdGhlbiB0aGUgbmV3IHNjYW4gcmVxIHdpbGwgYmUKICAqCW93bmVkIGJ5IHRoZSBuZXRsaW5rIHNvY2tldCB0aGF0IGNyZWF0ZWQgaXQgYW5kIHRoZSBzY2hlZHVsZWQgc2NhbiB3aWxsCiAgKgliZSBzdG9wcGVkIHdoZW4gdGhlIHNvY2tldCBpcyBjbG9zZWQuCisgKglJZiBzZXQgZHVyaW5nIGNvbmZpZ3VyYXRpb24gb2YgcmVndWxhdG9yeSBpbmRvb3Igb3BlcmF0aW9uIHRoZW4gdGhlCisgKglyZWd1bGF0b3J5IGluZG9vciBjb25maWd1cmF0aW9uIHdvdWxkIGJlIG93bmVkIGJ5IHRoZSBuZXRsaW5rIHNvY2tldAorICoJdGhhdCBjb25maWd1cmVkIHRoZSBpbmRvb3Igc2V0dGluZywgYW5kIHRoZSBpbmRvb3Igb3BlcmF0aW9uIHdvdWxkIGJlCisgKgljbGVhcmVkIHdoZW4gdGhlIHNvY2tldCBpcyBjbG9zZWQuCiAgKgogICogQE5MODAyMTFfQVRUUl9URExTX0lOSVRJQVRPUjogZmxhZyBhdHRyaWJ1dGUgaW5kaWNhdGluZyB0aGUgY3VycmVudCBlbmQgaXMKICAqCXRoZSBURExTIGxpbmsgaW5pdGlhdG9yLgpAQCAtMTczNyw4ICsxNzU0LDEyIEBACiAgKglzaG91bGQgYmUgY29udGFpbmVkIGluIHRoZSByZXN1bHQgYXMgdGhlIHN1bSBvZiB0aGUgcmVzcGVjdGl2ZSBjb3VudGVycwogICoJb3ZlciBhbGwgY2hhbm5lbHMuCiAgKgotICogQE5MODAyMTFfQVRUUl9TQ0hFRF9TQ0FOX0RFTEFZOiBkZWxheSBiZWZvcmUgYSBzY2hlZHVsZWQgc2NhbiAob3IgYQotICoJV29XTEFOIG5ldC1kZXRlY3Qgc2NhbikgaXMgc3RhcnRlZCwgdTMyIGluIHNlY29uZHMuCisgKiBATkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fREVMQVk6IGRlbGF5IGJlZm9yZSB0aGUgZmlyc3QgY3ljbGUgb2YgYQorICoJc2NoZWR1bGVkIHNjYW4gKG9yIGEgV29XTEFOIG5ldC1kZXRlY3Qgc2NhbikgaXMgc3RhcnRlZCwgdTMyCisgKglpbiBzZWNvbmRzLgorCisgKiBATkw4MDIxMV9BVFRSX1JFR19JTkRPT1I6IGZsYWcgYXR0cmlidXRlLCBpZiBzZXQgaW5kaWNhdGVzIHRoYXQgdGhlIGRldmljZQorICogICAgICBpcyBvcGVyYXRpbmcgaW4gYW4gaW5kb29yIGVudmlyb25tZW50LgogICoKICAqIEBOVU1fTkw4MDIxMV9BVFRSOiB0b3RhbCBudW1iZXIgb2Ygbmw4MDIxMV9hdHRycyBhdmFpbGFibGUKICAqIEBOTDgwMjExX0FUVFJfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKQEAgLTIxMDcsNiArMjEyOCw4IEBACiAKIAlOTDgwMjExX0FUVFJfU0NIRURfU0NBTl9ERUxBWSwKIAorCU5MODAyMTFfQVRUUl9SRUdfSU5ET09SLAorCiAJLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCiAKIAlfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNULApAQCAtMzA5Miw3ICszMTE1LDggQEAKICAqCiAgKiBATkw4MDIxMV9NRVNIQ09ORl9QTElOS19USU1FT1VUOiBJZiBubyB0eCBhY3Rpdml0eSBpcyBzZWVuIGZyb20gYSBTVEEgd2UndmUKICAqCWVzdGFibGlzaGVkIHBlZXJpbmcgd2l0aCBmb3IgbG9uZ2VyIHRoYW4gdGhpcyB0aW1lIChpbiBzZWNvbmRzKSwgdGhlbgotICoJcmVtb3ZlIGl0IGZyb20gdGhlIFNUQSdzIGxpc3Qgb2YgcGVlcnMuICBEZWZhdWx0IGlzIDMwIG1pbnV0ZXMuCisgKglyZW1vdmUgaXQgZnJvbSB0aGUgU1RBJ3MgbGlzdCBvZiBwZWVycy4gWW91IG1heSBzZXQgdGhpcyB0byAwIHRvIGRpc2FibGUKKyAqCXRoZSByZW1vdmFsIG9mIHRoZSBTVEEuIERlZmF1bHQgaXMgMzAgbWludXRlcy4KICAqCiAgKiBAX19OTDgwMjExX01FU0hDT05GX0FUVFJfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KQEAgLTM2OTQsNiArMzcxOCw4IEBACiAgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19BTlk6IHdha2UgdXAgb24gYW55IGFjdGl2aXR5LCBkbyBub3QgcmVhbGx5IHB1dAogICoJdGhlIGNoaXAgaW50byBhIHNwZWNpYWwgc3RhdGUgLS0gd29ya3MgYmVzdCB3aXRoIGNoaXBzIHRoYXQgaGF2ZQogICoJc3VwcG9ydCBmb3IgbG93LXBvd2VyIG9wZXJhdGlvbiBhbHJlYWR5IChmbGFnKQorICoJTm90ZSB0aGF0IHRoaXMgbW9kZSBpcyBpbmNvbXBhdGlibGUgd2l0aCBhbGwgb2YgdGhlIG90aGVycywgaWYKKyAqCWFueSBvdGhlcnMgYXJlIGV2ZW4gc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuCiAgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19ESVNDT05ORUNUOiB3YWtlIHVwIG9uIGRpc2Nvbm5lY3QsIHRoZSB3YXkgZGlzY29ubmVjdAogICoJaXMgZGV0ZWN0ZWQgaXMgaW1wbGVtZW50YXRpb24tc3BlY2lmaWMgKGZsYWcpCiAgKiBATkw4MDIxMV9XT1dMQU5fVFJJR19NQUdJQ19QS1Q6IHdha2UgdXAgb24gbWFnaWMgcGFja2V0ICg2eCAweGZmLCBmb2xsb3dlZApAQCAtNDMyNywxMSArNDM1MywxMyBAQAogCiAvKioKICAqIGVudW0gbmw4MDIxMV9leHRfZmVhdHVyZV9pbmRleCAtIGJpdCBpbmRleCBvZiBleHRlbmRlZCBmZWF0dXJlcy4KKyAqIEBOTDgwMjExX0VYVF9GRUFUVVJFX1ZIVF9JQlNTOiBUaGlzIGRyaXZlciBzdXBwb3J0cyBJQlNTIHdpdGggVkhUIGRhdGFyYXRlcy4KICAqCiAgKiBATlVNX05MODAyMTFfRVhUX0ZFQVRVUkVTOiBudW1iZXIgb2YgZXh0ZW5kZWQgZmVhdHVyZXMuCiAgKiBATUFYX05MODAyMTFfRVhUX0ZFQVRVUkVTOiBoaWdoZXN0IGV4dGVuZGVkIGZlYXR1cmUgaW5kZXguCiAgKi8KIGVudW0gbmw4MDIxMV9leHRfZmVhdHVyZV9pbmRleCB7CisJTkw4MDIxMV9FWFRfRkVBVFVSRV9WSFRfSUJTUywKIAogCS8qIGFkZCBuZXcgZmVhdHVyZXMgYmVmb3JlIHRoZSBkZWZpbml0aW9uIGJlbG93ICovCiAJTlVNX05MODAyMTFfRVhUX0ZFQVRVUkVTLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3BlcmZfZXZlbnQuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9wZXJmX2V2ZW50LmgKaW5kZXggOWI3OWFiYi4uMzA5MjExYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3BlcmZfZXZlbnQuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvcGVyZl9ldmVudC5oCkBAIC0xNTIsMjEgKzE1Miw0MiBAQAogICogVGhlIGJyYW5jaCB0eXBlcyBjYW4gYmUgY29tYmluZWQsIGhvd2V2ZXIgQlJBTkNIX0FOWSBjb3ZlcnMgYWxsIHR5cGVzCiAgKiBvZiBicmFuY2hlcyBhbmQgdGhlcmVmb3JlIGl0IHN1cGVyc2VkZXMgYWxsIHRoZSBvdGhlciB0eXBlcy4KICAqLworZW51bSBwZXJmX2JyYW5jaF9zYW1wbGVfdHlwZV9zaGlmdCB7CisJUEVSRl9TQU1QTEVfQlJBTkNIX1VTRVJfU0hJRlQJCT0gMCwgLyogdXNlciBicmFuY2hlcyAqLworCVBFUkZfU0FNUExFX0JSQU5DSF9LRVJORUxfU0hJRlQJCT0gMSwgLyoga2VybmVsIGJyYW5jaGVzICovCisJUEVSRl9TQU1QTEVfQlJBTkNIX0hWX1NISUZUCQk9IDIsIC8qIGh5cGVydmlzb3IgYnJhbmNoZXMgKi8KKworCVBFUkZfU0FNUExFX0JSQU5DSF9BTllfU0hJRlQJCT0gMywgLyogYW55IGJyYW5jaCB0eXBlcyAqLworCVBFUkZfU0FNUExFX0JSQU5DSF9BTllfQ0FMTF9TSElGVAk9IDQsIC8qIGFueSBjYWxsIGJyYW5jaCAqLworCVBFUkZfU0FNUExFX0JSQU5DSF9BTllfUkVUVVJOX1NISUZUCT0gNSwgLyogYW55IHJldHVybiBicmFuY2ggKi8KKwlQRVJGX1NBTVBMRV9CUkFOQ0hfSU5EX0NBTExfU0hJRlQJPSA2LCAvKiBpbmRpcmVjdCBjYWxscyAqLworCVBFUkZfU0FNUExFX0JSQU5DSF9BQk9SVF9UWF9TSElGVAk9IDcsIC8qIHRyYW5zYWN0aW9uIGFib3J0cyAqLworCVBFUkZfU0FNUExFX0JSQU5DSF9JTl9UWF9TSElGVAkJPSA4LCAvKiBpbiB0cmFuc2FjdGlvbiAqLworCVBFUkZfU0FNUExFX0JSQU5DSF9OT19UWF9TSElGVAkJPSA5LCAvKiBub3QgaW4gdHJhbnNhY3Rpb24gKi8KKwlQRVJGX1NBTVBMRV9CUkFOQ0hfQ09ORF9TSElGVAkJPSAxMCwgLyogY29uZGl0aW9uYWwgYnJhbmNoZXMgKi8KKworCVBFUkZfU0FNUExFX0JSQU5DSF9DQUxMX1NUQUNLX1NISUZUCT0gMTEsIC8qIGNhbGwvcmV0IHN0YWNrICovCisKKwlQRVJGX1NBTVBMRV9CUkFOQ0hfTUFYX1NISUZUCQkvKiBub24tQUJJICovCit9OworCiBlbnVtIHBlcmZfYnJhbmNoX3NhbXBsZV90eXBlIHsKLQlQRVJGX1NBTVBMRV9CUkFOQ0hfVVNFUgkJPSAxVSA8PCAwLCAvKiB1c2VyIGJyYW5jaGVzICovCi0JUEVSRl9TQU1QTEVfQlJBTkNIX0tFUk5FTAk9IDFVIDw8IDEsIC8qIGtlcm5lbCBicmFuY2hlcyAqLwotCVBFUkZfU0FNUExFX0JSQU5DSF9IVgkJPSAxVSA8PCAyLCAvKiBoeXBlcnZpc29yIGJyYW5jaGVzICovCisJUEVSRl9TQU1QTEVfQlJBTkNIX1VTRVIJCT0gMVUgPDwgUEVSRl9TQU1QTEVfQlJBTkNIX1VTRVJfU0hJRlQsCisJUEVSRl9TQU1QTEVfQlJBTkNIX0tFUk5FTAk9IDFVIDw8IFBFUkZfU0FNUExFX0JSQU5DSF9LRVJORUxfU0hJRlQsCisJUEVSRl9TQU1QTEVfQlJBTkNIX0hWCQk9IDFVIDw8IFBFUkZfU0FNUExFX0JSQU5DSF9IVl9TSElGVCwKIAotCVBFUkZfU0FNUExFX0JSQU5DSF9BTlkJCT0gMVUgPDwgMywgLyogYW55IGJyYW5jaCB0eXBlcyAqLwotCVBFUkZfU0FNUExFX0JSQU5DSF9BTllfQ0FMTAk9IDFVIDw8IDQsIC8qIGFueSBjYWxsIGJyYW5jaCAqLwotCVBFUkZfU0FNUExFX0JSQU5DSF9BTllfUkVUVVJOCT0gMVUgPDwgNSwgLyogYW55IHJldHVybiBicmFuY2ggKi8KLQlQRVJGX1NBTVBMRV9CUkFOQ0hfSU5EX0NBTEwJPSAxVSA8PCA2LCAvKiBpbmRpcmVjdCBjYWxscyAqLwotCVBFUkZfU0FNUExFX0JSQU5DSF9BQk9SVF9UWAk9IDFVIDw8IDcsIC8qIHRyYW5zYWN0aW9uIGFib3J0cyAqLwotCVBFUkZfU0FNUExFX0JSQU5DSF9JTl9UWAk9IDFVIDw8IDgsIC8qIGluIHRyYW5zYWN0aW9uICovCi0JUEVSRl9TQU1QTEVfQlJBTkNIX05PX1RYCT0gMVUgPDwgOSwgLyogbm90IGluIHRyYW5zYWN0aW9uICovCi0JUEVSRl9TQU1QTEVfQlJBTkNIX0NPTkQJCT0gMVUgPDwgMTAsIC8qIGNvbmRpdGlvbmFsIGJyYW5jaGVzICovCisJUEVSRl9TQU1QTEVfQlJBTkNIX0FOWQkJPSAxVSA8PCBQRVJGX1NBTVBMRV9CUkFOQ0hfQU5ZX1NISUZULAorCVBFUkZfU0FNUExFX0JSQU5DSF9BTllfQ0FMTAk9IDFVIDw8IFBFUkZfU0FNUExFX0JSQU5DSF9BTllfQ0FMTF9TSElGVCwKKwlQRVJGX1NBTVBMRV9CUkFOQ0hfQU5ZX1JFVFVSTgk9IDFVIDw8IFBFUkZfU0FNUExFX0JSQU5DSF9BTllfUkVUVVJOX1NISUZULAorCVBFUkZfU0FNUExFX0JSQU5DSF9JTkRfQ0FMTAk9IDFVIDw8IFBFUkZfU0FNUExFX0JSQU5DSF9JTkRfQ0FMTF9TSElGVCwKKwlQRVJGX1NBTVBMRV9CUkFOQ0hfQUJPUlRfVFgJPSAxVSA8PCBQRVJGX1NBTVBMRV9CUkFOQ0hfQUJPUlRfVFhfU0hJRlQsCisJUEVSRl9TQU1QTEVfQlJBTkNIX0lOX1RYCT0gMVUgPDwgUEVSRl9TQU1QTEVfQlJBTkNIX0lOX1RYX1NISUZULAorCVBFUkZfU0FNUExFX0JSQU5DSF9OT19UWAk9IDFVIDw8IFBFUkZfU0FNUExFX0JSQU5DSF9OT19UWF9TSElGVCwKKwlQRVJGX1NBTVBMRV9CUkFOQ0hfQ09ORAkJPSAxVSA8PCBQRVJGX1NBTVBMRV9CUkFOQ0hfQ09ORF9TSElGVCwKIAotCVBFUkZfU0FNUExFX0JSQU5DSF9NQVgJCT0gMVUgPDwgMTEsIC8qIG5vbi1BQkkgKi8KKwlQRVJGX1NBTVBMRV9CUkFOQ0hfQ0FMTF9TVEFDSwk9IDFVIDw8IFBFUkZfU0FNUExFX0JSQU5DSF9DQUxMX1NUQUNLX1NISUZULAorCisJUEVSRl9TQU1QTEVfQlJBTkNIX01BWAkJPSAxVSA8PCBQRVJGX1NBTVBMRV9CUkFOQ0hfTUFYX1NISUZULAogfTsKIAogI2RlZmluZSBQRVJGX1NBTVBMRV9CUkFOQ0hfUExNX0FMTCBcCkBAIC0yNDAsNiArMjYxLDcgQEAKICNkZWZpbmUgUEVSRl9BVFRSX1NJWkVfVkVSMwk5NgkvKiBhZGQ6IHNhbXBsZV9yZWdzX3VzZXIgKi8KIAkJCQkJLyogYWRkOiBzYW1wbGVfc3RhY2tfdXNlciAqLwogI2RlZmluZSBQRVJGX0FUVFJfU0laRV9WRVI0CTEwNAkvKiBhZGQ6IHNhbXBsZV9yZWdzX2ludHIgKi8KKyNkZWZpbmUgUEVSRl9BVFRSX1NJWkVfVkVSNQkxMTIJLyogYWRkOiBhdXhfd2F0ZXJtYXJrICovCiAKIC8qCiAgKiBIYXJkd2FyZSBldmVudF9pZCB0byBtb25pdG9yIHZpYSBhIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcgZXZlbnQ6CkBAIC0zMDUsNyArMzI3LDggQEAKIAkJCQlleGNsdWRlX2NhbGxjaGFpbl91c2VyICAgOiAxLCAvKiBleGNsdWRlIHVzZXIgY2FsbGNoYWlucyAqLwogCQkJCW1tYXAyICAgICAgICAgIDogIDEsIC8qIGluY2x1ZGUgbW1hcCB3aXRoIGlub2RlIGRhdGEgICAgICovCiAJCQkJY29tbV9leGVjICAgICAgOiAgMSwgLyogZmxhZyBjb21tIGV2ZW50cyB0aGF0IGFyZSBkdWUgdG8gYW4gZXhlYyAqLwotCQkJCV9fcmVzZXJ2ZWRfMSAgIDogMzk7CisJCQkJdXNlX2Nsb2NraWQgICAgOiAgMSwgLyogdXNlIEBjbG9ja2lkIGZvciB0aW1lIGZpZWxkcyAqLworCQkJCV9fcmVzZXJ2ZWRfMSAgIDogMzg7CiAKIAl1bmlvbiB7CiAJCV9fdTMyCQl3YWtldXBfZXZlbnRzOwkgIC8qIHdha2V1cCBldmVyeSBuIGV2ZW50cyAqLwpAQCAtMzM0LDggKzM1Nyw3IEBACiAJICovCiAJX191MzIJc2FtcGxlX3N0YWNrX3VzZXI7CiAKLQkvKiBBbGlnbiB0byB1NjQuICovCi0JX191MzIJX19yZXNlcnZlZF8yOworCV9fczMyCWNsb2NraWQ7CiAJLyoKIAkgKiBEZWZpbmVzIHNldCBvZiByZWdzIHRvIGR1bXAgZm9yIGVhY2ggc2FtcGxlCiAJICogc3RhdGUgY2FwdHVyZWQgb246CkBAIC0zNDUsNiArMzY3LDEyIEBACiAJICogU2VlIGFzbS9wZXJmX3JlZ3MuaCBmb3IgZGV0YWlscy4KIAkgKi8KIAlfX3U2NAlzYW1wbGVfcmVnc19pbnRyOworCisJLyoKKwkgKiBXYWtldXAgd2F0ZXJtYXJrIGZvciBBVVggYXJlYQorCSAqLworCV9fdTMyCWF1eF93YXRlcm1hcms7CisJX191MzIJX19yZXNlcnZlZF8yOwkvKiBhbGlnbiB0byBfX3U2NCAqLwogfTsKIAogI2RlZmluZSBwZXJmX2ZsYWdzKGF0dHIpCSgqKCYoYXR0ciktPnJlYWRfZm9ybWF0ICsgMSkpCkBAIC0zNjAsNiArMzg4LDcgQEAKICNkZWZpbmUgUEVSRl9FVkVOVF9JT0NfU0VUX09VVFBVVAlfSU8gKCckJywgNSkKICNkZWZpbmUgUEVSRl9FVkVOVF9JT0NfU0VUX0ZJTFRFUglfSU9XKCckJywgNiwgY2hhciAqKQogI2RlZmluZSBQRVJGX0VWRU5UX0lPQ19JRAkJX0lPUignJCcsIDcsIF9fdTY0ICopCisjZGVmaW5lIFBFUkZfRVZFTlRfSU9DX1NFVF9CUEYJCV9JT1coJyQnLCA4LCBfX3UzMikKIAogZW51bSBwZXJmX2V2ZW50X2lvY19mbGFncyB7CiAJUEVSRl9JT0NfRkxBR19HUk9VUAkJPSAxVSA8PCAwLApAQCAtNTAwLDkgKzUyOSwzMCBAQAogCSAqIEluIHRoaXMgY2FzZSB0aGUga2VybmVsIHdpbGwgbm90IG92ZXItd3JpdGUgdW5yZWFkIGRhdGEuCiAJICoKIAkgKiBTZWUgcGVyZl9vdXRwdXRfcHV0X2hhbmRsZSgpIGZvciB0aGUgZGF0YSBvcmRlcmluZy4KKwkgKgorCSAqIGRhdGFfe29mZnNldCxzaXplfSBpbmRpY2F0ZSB0aGUgbG9jYXRpb24gYW5kIHNpemUgb2YgdGhlIHBlcmYgcmVjb3JkCisJICogYnVmZmVyIHdpdGhpbiB0aGUgbW1hcHBlZCBhcmVhLgogCSAqLwogCV9fdTY0ICAgZGF0YV9oZWFkOwkJLyogaGVhZCBpbiB0aGUgZGF0YSBzZWN0aW9uICovCiAJX191NjQJZGF0YV90YWlsOwkJLyogdXNlci1zcGFjZSB3cml0dGVuIHRhaWwgKi8KKwlfX3U2NAlkYXRhX29mZnNldDsJCS8qIHdoZXJlIHRoZSBidWZmZXIgc3RhcnRzICovCisJX191NjQJZGF0YV9zaXplOwkJLyogZGF0YSBidWZmZXIgc2l6ZSAqLworCisJLyoKKwkgKiBBVVggYXJlYSBpcyBkZWZpbmVkIGJ5IGF1eF97b2Zmc2V0LHNpemV9IGZpZWxkcyB0aGF0IHNob3VsZCBiZSBzZXQKKwkgKiBieSB0aGUgdXNlcnNwYWNlLCBzbyB0aGF0CisJICoKKwkgKiAgIGF1eF9vZmZzZXQgPj0gZGF0YV9vZmZzZXQgKyBkYXRhX3NpemUKKwkgKgorCSAqIHByaW9yIHRvIG1tYXAoKWluZyBpdC4gU2l6ZSBvZiB0aGUgbW1hcCgpZWQgYXJlYSBzaG91bGQgYmUgYXV4X3NpemUuCisJICoKKwkgKiBSaW5nIGJ1ZmZlciBwb2ludGVycyBhdXhfe2hlYWQsdGFpbH0gaGF2ZSB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKKwkgKiBkYXRhX3toZWFkLHRhaWx9IGFuZCBzYW1lIG9yZGVyaW5nIHJ1bGVzIGFwcGx5LgorCSAqLworCV9fdTY0CWF1eF9oZWFkOworCV9fdTY0CWF1eF90YWlsOworCV9fdTY0CWF1eF9vZmZzZXQ7CisJX191NjQJYXV4X3NpemU7CiB9OwogCiAjZGVmaW5lIFBFUkZfUkVDT1JEX01JU0NfQ1BVTU9ERV9NQVNLCQkoNyA8PCAwKQpAQCAtNzI1LDYgKzc3NSwzMSBAQAogCSAqLwogCVBFUkZfUkVDT1JEX01NQVAyCQkJPSAxMCwKIAorCS8qCisJICogUmVjb3JkcyB0aGF0IG5ldyBkYXRhIGxhbmRlZCBpbiB0aGUgQVVYIGJ1ZmZlciBwYXJ0LgorCSAqCisJICogc3RydWN0IHsKKwkgKiAJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgorCSAqIAl1NjQJCQkJYXV4X29mZnNldDsKKwkgKiAJdTY0CQkJCWF1eF9zaXplOworCSAqCXU2NAkJCQlmbGFnczsKKwkgKiAJc3RydWN0IHNhbXBsZV9pZAkJc2FtcGxlX2lkOworCSAqIH07CisJICovCisJUEVSRl9SRUNPUkRfQVVYCQkJCT0gMTEsCisKKwkvKgorCSAqIEluZGljYXRlcyB0aGF0IGluc3RydWN0aW9uIHRyYWNlIGhhcyBzdGFydGVkCisJICoKKwkgKiBzdHJ1Y3QgeworCSAqCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJICoJdTMyCQkJCXBpZDsKKwkgKgl1MzIJCQkJdGlkOworCSAqIH07CisJICovCisJUEVSRl9SRUNPUkRfSVRSQUNFX1NUQVJUCQk9IDEyLAorCiAJUEVSRl9SRUNPUkRfTUFYLAkJCS8qIG5vbi1BQkkgKi8KIH07CiAKQEAgLTc0Miw2ICs4MTcsMTIgQEAKIAlQRVJGX0NPTlRFWFRfTUFYCQk9IChfX3U2NCktNDA5NSwKIH07CiAKKy8qKgorICogUEVSRl9SRUNPUkRfQVVYOjpmbGFncyBiaXRzCisgKi8KKyNkZWZpbmUgUEVSRl9BVVhfRkxBR19UUlVOQ0FURUQJCTB4MDEJLyogcmVjb3JkIHdhcyB0cnVuY2F0ZWQgdG8gZml0ICovCisjZGVmaW5lIFBFUkZfQVVYX0ZMQUdfT1ZFUldSSVRFCQkweDAyCS8qIHNuYXBzaG90IGZyb20gb3ZlcndyaXRlIG1vZGUgKi8KKwogI2RlZmluZSBQRVJGX0ZMQUdfRkRfTk9fR1JPVVAJCSgxVUwgPDwgMCkKICNkZWZpbmUgUEVSRl9GTEFHX0ZEX09VVFBVVAkJKDFVTCA8PCAxKQogI2RlZmluZSBQRVJGX0ZMQUdfUElEX0NHUk9VUAkJKDFVTCA8PCAyKSAvKiBwaWQ9Y2dyb3VwIGlkLCBwZXItY3B1IG1vZGUgb25seSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9jbHMuaCBiL2luY2x1ZGUvdWFwaS9saW51eC9wa3RfY2xzLmgKaW5kZXggMjU3MzFkZi4uYmYwOGU3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3BrdF9jbHMuaAorKysgYi9pbmNsdWRlL3VhcGkvbGludXgvcGt0X2Nscy5oCkBAIC0zOTcsNiArMzk3LDggQEAKIAlUQ0FfQlBGX0NMQVNTSUQsCiAJVENBX0JQRl9PUFNfTEVOLAogCVRDQV9CUEZfT1BTLAorCVRDQV9CUEZfRkQsCisJVENBX0JQRl9OQU1FLAogCV9fVENBX0JQRl9NQVgsCiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvcnRuZXRsaW5rLmggYi9pbmNsdWRlL3VhcGkvbGludXgvcnRuZXRsaW5rLmgKaW5kZXggNWNjNWQ2Ni4uOTc0ZGIwMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3J0bmV0bGluay5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC9ydG5ldGxpbmsuaApAQCAtMTM0LDYgKzEzNCw4IEBACiAKIAlSVE1fTkVXTlNJRCA9IDg4LAogI2RlZmluZSBSVE1fTkVXTlNJRCBSVE1fTkVXTlNJRAorCVJUTV9ERUxOU0lEID0gODksCisjZGVmaW5lIFJUTV9ERUxOU0lEIFJUTV9ERUxOU0lECiAJUlRNX0dFVE5TSUQgPSA5MCwKICNkZWZpbmUgUlRNX0dFVE5TSUQgUlRNX0dFVE5TSUQKIApAQCAtMzAzLDYgKzMwNSw5IEBACiAJUlRBX1RBQkxFLAogCVJUQV9NQVJLLAogCVJUQV9NRkNfU1RBVFMsCisJUlRBX1ZJQSwKKwlSVEFfTkVXRFNULAorCVJUQV9QUkVGLAogCV9fUlRBX01BWAogfTsKIApAQCAtMzMyLDYgKzMzNyw3IEBACiAjZGVmaW5lIFJUTkhfRl9ERUFECQkxCS8qIE5leHRob3AgaXMgZGVhZCAodXNlZCBieSBtdWx0aXBhdGgpCSovCiAjZGVmaW5lIFJUTkhfRl9QRVJWQVNJVkUJMgkvKiBEbyByZWN1cnNpdmUgZ2F0ZXdheSBsb29rdXAJKi8KICNkZWZpbmUgUlROSF9GX09OTElOSwkJNAkvKiBHYXRld2F5IGlzIGZvcmNlZCBvbiBsaW5rCSovCisjZGVmaW5lIFJUTkhfRl9FWFRFUk5BTAkJOAkvKiBSb3V0ZSBpbnN0YWxsZWQgZXh0ZXJuYWxseQkqLwogCiAvKiBNYWNyb3MgdG8gaGFuZGxlIGhleHRob3BzICovCiAKQEAgLTM0NCw2ICszNTAsMTIgQEAKICNkZWZpbmUgUlROSF9TUEFDRShsZW4pCVJUTkhfQUxJR04oUlROSF9MRU5HVEgobGVuKSkKICNkZWZpbmUgUlROSF9EQVRBKHJ0bmgpICAgKChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKikocnRuaCkpICsgUlROSF9MRU5HVEgoMCkpKQogCisvKiBSVEFfVklBICovCitzdHJ1Y3QgcnR2aWEgeworCV9fa2VybmVsX3NhX2ZhbWlseV90CXJ0dmlhX2ZhbWlseTsKKwlfX3U4CQkJcnR2aWFfYWRkclswXTsKK307CisKIC8qIFJUTV9DQUNIRUlORk8gKi8KIAogc3RydWN0IHJ0YV9jYWNoZWluZm8gewpAQCAtNjIzLDYgKzYzNSwxMCBAQAogI2RlZmluZSBSVE5MR1JQX0lQVjZfTkVUQ09ORglSVE5MR1JQX0lQVjZfTkVUQ09ORgogCVJUTkxHUlBfTURCLAogI2RlZmluZSBSVE5MR1JQX01EQgkJUlROTEdSUF9NREIKKwlSVE5MR1JQX01QTFNfUk9VVEUsCisjZGVmaW5lIFJUTkxHUlBfTVBMU19ST1VURQlSVE5MR1JQX01QTFNfUk9VVEUKKwlSVE5MR1JQX05TSUQsCisjZGVmaW5lIFJUTkxHUlBfTlNJRAkJUlROTEdSUF9OU0lECiAJX19SVE5MR1JQX01BWAogfTsKICNkZWZpbmUgUlROTEdSUF9NQVgJKF9fUlROTEdSUF9NQVggLSAxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL2xpbnV4L3RjX2FjdC90Y19icGYuaCBiL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfYnBmLmgKaW5kZXggNTI4OGJkNzcuLjA3ZjE3Y2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC90Y19hY3QvdGNfYnBmLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3RjX2FjdC90Y19icGYuaApAQCAtMjQsNiArMjQsOCBAQAogCVRDQV9BQ1RfQlBGX1BBUk1TLAogCVRDQV9BQ1RfQlBGX09QU19MRU4sCiAJVENBX0FDVF9CUEZfT1BTLAorCVRDQV9BQ1RfQlBGX0ZELAorCVRDQV9BQ1RfQlBGX05BTUUsCiAJX19UQ0FfQUNUX0JQRl9NQVgsCiB9OwogI2RlZmluZSBUQ0FfQUNUX0JQRl9NQVggKF9fVENBX0FDVF9CUEZfTUFYIC0gMSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC90aXBjX25ldGxpbmsuaCBiL2luY2x1ZGUvdWFwaS9saW51eC90aXBjX25ldGxpbmsuaAppbmRleCA4ZDcyMzgyLi5kNGM4ZjE0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdGlwY19uZXRsaW5rLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3RpcGNfbmV0bGluay5oCkBAIC04MywxMSArODMsMjAgQEAKIAlUSVBDX05MQV9CRUFSRVJfTkFNRSwJCS8qIHN0cmluZyAqLwogCVRJUENfTkxBX0JFQVJFUl9QUk9QLAkJLyogbmVzdCAqLwogCVRJUENfTkxBX0JFQVJFUl9ET01BSU4sCQkvKiB1MzIgKi8KKwlUSVBDX05MQV9CRUFSRVJfVURQX09QVFMsCS8qIG5lc3QgKi8KIAogCV9fVElQQ19OTEFfQkVBUkVSX01BWCwKIAlUSVBDX05MQV9CRUFSRVJfTUFYID0gX19USVBDX05MQV9CRUFSRVJfTUFYIC0gMQogfTsKIAorZW51bSB7CisJVElQQ19OTEFfVURQX1VOU1BFQywKKwlUSVBDX05MQV9VRFBfTE9DQUwsCQkvKiBzb2NrYWRkcl9zdG9yYWdlICovCisJVElQQ19OTEFfVURQX1JFTU9URSwJCS8qIHNvY2thZGRyX3N0b3JhZ2UgKi8KKworCV9fVElQQ19OTEFfVURQX01BWCwKKwlUSVBDX05MQV9VRFBfTUFYID0gX19USVBDX05MQV9VRFBfTUFYIC0gMQorfTsKIC8qIFNvY2tldCBpbmZvICovCiBlbnVtIHsKIAlUSVBDX05MQV9TT0NLX1VOU1BFQywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC92ZmlvLmggYi9pbmNsdWRlL3VhcGkvbGludXgvdmZpby5oCmluZGV4IDgyODg5YzMuLmI1N2I3NTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC92ZmlvLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3ZmaW8uaApAQCAtMTYwLDYgKzE2MCw4IEBACiAJX191MzIJZmxhZ3M7CiAjZGVmaW5lIFZGSU9fREVWSUNFX0ZMQUdTX1JFU0VUCSgxIDw8IDApCS8qIERldmljZSBzdXBwb3J0cyByZXNldCAqLwogI2RlZmluZSBWRklPX0RFVklDRV9GTEFHU19QQ0kJKDEgPDwgMSkJLyogdmZpby1wY2kgZGV2aWNlICovCisjZGVmaW5lIFZGSU9fREVWSUNFX0ZMQUdTX1BMQVRGT1JNICgxIDw8IDIpCS8qIHZmaW8tcGxhdGZvcm0gZGV2aWNlICovCisjZGVmaW5lIFZGSU9fREVWSUNFX0ZMQUdTX0FNQkEgICgxIDw8IDMpCS8qIHZmaW8tYW1iYSBkZXZpY2UgKi8KIAlfX3UzMgludW1fcmVnaW9uczsJLyogTWF4IHJlZ2lvbiBpbmRleCArIDEgKi8KIAlfX3UzMgludW1faXJxczsJLyogTWF4IElSUSBpbmRleCArIDEgKi8KIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgvdmlydGlvX2Jsay5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRpb19ibGsuaAppbmRleCAzYzUzZWVjLi4xOWM2NmZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvbGludXgvdmlydGlvX2Jsay5oCisrKyBiL2luY2x1ZGUvdWFwaS9saW51eC92aXJ0aW9fYmxrLmgKQEAgLTYwLDcgKzYwLDcgQEAKIAlfX3UzMiBzaXplX21heDsKIAkvKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2VnbWVudHMgKGlmIFZJUlRJT19CTEtfRl9TRUdfTUFYKSAqLwogCV9fdTMyIHNlZ19tYXg7Ci0JLyogZ2VvbWV0cnkgdGhlIGRldmljZSAoaWYgVklSVElPX0JMS19GX0dFT01FVFJZKSAqLworCS8qIGdlb21ldHJ5IG9mIHRoZSBkZXZpY2UgKGlmIFZJUlRJT19CTEtfRl9HRU9NRVRSWSkgKi8KIAlzdHJ1Y3QgdmlydGlvX2Jsa19nZW9tZXRyeSB7CiAJCV9fdTE2IGN5bGluZGVyczsKIAkJX191OCBoZWFkczsKQEAgLTExOSw3ICsxMTksMTEgQEAKICNkZWZpbmUgVklSVElPX0JMS19UX0JBUlJJRVIJMHg4MDAwMDAwMAogI2VuZGlmIC8qICFWSVJUSU9fQkxLX05PX0xFR0FDWSAqLwogCi0vKiBUaGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSByZWFkIHNjYXR0ZXItZ2F0aGVyIGxpc3QuICovCisvKgorICogVGhpcyBjb21lcyBmaXJzdCBpbiB0aGUgcmVhZCBzY2F0dGVyLWdhdGhlciBsaXN0LgorICogRm9yIGxlZ2FjeSB2aXJ0aW8sIGlmIFZJUlRJT19GX0FOWV9MQVlPVVQgaXMgbm90IG5lZ290aWF0ZWQsCisgKiB0aGlzIGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSByZWFkIHNjYXR0ZXItZ2F0aGVyIGxpc3QuCisgKi8KIHN0cnVjdCB2aXJ0aW9fYmxrX291dGhkciB7CiAJLyogVklSVElPX0JMS19UKiAqLwogCV9fdmlydGlvMzIgdHlwZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC92aXJ0aW9fc2NzaS5oIGIvaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRpb19zY3NpLmgKaW5kZXggNDJiOTM3MC4uY2MxOGVmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRpb19zY3NpLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3ZpcnRpb19zY3NpLmgKQEAgLTI5LDggKzI5LDE2IEBACiAKICNpbmNsdWRlIDxsaW51eC92aXJ0aW9fdHlwZXMuaD4KIAotI2RlZmluZSBWSVJUSU9fU0NTSV9DREJfU0laRSAgIDMyCi0jZGVmaW5lIFZJUlRJT19TQ1NJX1NFTlNFX1NJWkUgOTYKKy8qIERlZmF1bHQgdmFsdWVzIG9mIHRoZSBDREIgYW5kIHNlbnNlIGRhdGEgc2l6ZSBjb25maWd1cmF0aW9uIGZpZWxkcyAqLworI2RlZmluZSBWSVJUSU9fU0NTSV9DREJfREVGQVVMVF9TSVpFICAgMzIKKyNkZWZpbmUgVklSVElPX1NDU0lfU0VOU0VfREVGQVVMVF9TSVpFIDk2CisKKyNpZm5kZWYgVklSVElPX1NDU0lfQ0RCX1NJWkUKKyNkZWZpbmUgVklSVElPX1NDU0lfQ0RCX1NJWkUgVklSVElPX1NDU0lfQ0RCX0RFRkFVTFRfU0laRQorI2VuZGlmCisjaWZuZGVmIFZJUlRJT19TQ1NJX1NFTlNFX1NJWkUKKyNkZWZpbmUgVklSVElPX1NDU0lfU0VOU0VfU0laRSBWSVJUSU9fU0NTSV9TRU5TRV9ERUZBVUxUX1NJWkUKKyNlbmRpZgogCiAvKiBTQ1NJIGNvbW1hbmQgcmVxdWVzdCwgZm9sbG93ZWQgYnkgZGF0YS1vdXQgKi8KIHN0cnVjdCB2aXJ0aW9fc2NzaV9jbWRfcmVxIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9saW51eC94ZnJtLmggYi9pbmNsdWRlL3VhcGkvbGludXgveGZybS5oCmluZGV4IDAyZDUxMjUuLjJjZDllNjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC94ZnJtLmgKKysrIGIvaW5jbHVkZS91YXBpL2xpbnV4L3hmcm0uaApAQCAtMSw2ICsxLDcgQEAKICNpZm5kZWYgX0xJTlVYX1hGUk1fSAogI2RlZmluZSBfTElOVVhfWEZSTV9ICiAKKyNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCiAvKiBBbGwgb2YgdGhlIHN0cnVjdHVyZXMgaW4gdGhpcyBmaWxlIG1heSBub3QgY2hhbmdlIHNpemUgYXMgdGhleSBhcmUKQEAgLTEzLDYgKzE0LDcgQEAKIHR5cGVkZWYgdW5pb24gewogCV9fYmUzMgkJYTQ7CiAJX19iZTMyCQlhNls0XTsKKwlzdHJ1Y3QgaW42X2FkZHIJaW42OwogfSB4ZnJtX2FkZHJlc3NfdDsKIAogLyogSWRlbnQgb2YgYSBzcGVjaWZpYyB4ZnJtX3N0YXRlLiBJdCBpcyB1c2VkIG9uIGlucHV0IHRvIGxvb2t1cApkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL2FzZXF1ZW5jZXIuaCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9hc2VxdWVuY2VyLmgKaW5kZXggMDljOGEwMC4uNWE1ZmE0OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL2FzZXF1ZW5jZXIuaAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvYXNlcXVlbmNlci5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaWZuZGVmIF9VQVBJX19TT1VORF9BU0VRVUVOQ0VSX0gKICNkZWZpbmUgX1VBUElfX1NPVU5EX0FTRVFVRU5DRVJfSAogCisjaW5jbHVkZSA8c291bmQvYXNvdW5kLmg+CiAKIC8qKiB2ZXJzaW9uIG9mIHRoZSBzZXF1ZW5jZXIgKi8KICNkZWZpbmUgU05EUlZfU0VRX1ZFUlNJT04gU05EUlZfUFJPVE9DT0xfVkVSU0lPTiAoMSwgMCwgMSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9zb3VuZC9hc291bmQuaCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9hc291bmQuaAppbmRleCAwZTg4ZTdhLi40NjE0NWE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL3VhcGkvc291bmQvYXNvdW5kLmgKKysrIGIvaW5jbHVkZS91YXBpL3NvdW5kL2Fzb3VuZC5oCkBAIC0yNSw2ICsyNSw5IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCisjaWZuZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgogCiAvKgogICogIHByb3RvY29sIHZlcnNpb24KQEAgLTE0MCw3ICsxNDMsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgU05EUlZfUENNX1ZFUlNJT04JCVNORFJWX1BST1RPQ09MX1ZFUlNJT04oMiwgMCwgMTIpCisjZGVmaW5lIFNORFJWX1BDTV9WRVJTSU9OCQlTTkRSVl9QUk9UT0NPTF9WRVJTSU9OKDIsIDAsIDEzKQogCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgc25kX3BjbV91ZnJhbWVzX3Q7CiB0eXBlZGVmIHNpZ25lZCBsb25nIHNuZF9wY21fc2ZyYW1lc190OwpAQCAtMjY3LDEwICsyNzAsMTcgQEAKICNkZWZpbmUgU05EUlZfUENNX0lORk9fSk9JTlRfRFVQTEVYCTB4MDAyMDAwMDAJLyogcGxheWJhY2sgYW5kIGNhcHR1cmUgc3RyZWFtIGFyZSBzb21ld2hhdCBjb3JyZWxhdGVkICovCiAjZGVmaW5lIFNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQJMHgwMDQwMDAwMAkvKiBwY20gc3VwcG9ydCBzb21lIGtpbmQgb2Ygc3luYyBnbyAqLwogI2RlZmluZSBTTkRSVl9QQ01fSU5GT19OT19QRVJJT0RfV0FLRVVQCTB4MDA4MDAwMDAJLyogcGVyaW9kIHdha2V1cCBjYW4gYmUgZGlzYWJsZWQgKi8KLSNkZWZpbmUgU05EUlZfUENNX0lORk9fSEFTX1dBTExfQ0xPQ0sgICAweDAxMDAwMDAwICAgICAgLyogaGFzIGF1ZGlvIHdhbGwgY2xvY2sgZm9yIGF1ZGlvL3N5c3RlbSB0aW1lIHN5bmMgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fSEFTX1dBTExfQ0xPQ0sgICAweDAxMDAwMDAwICAgICAgLyogKERlcHJlY2F0ZWQpaGFzIGF1ZGlvIHdhbGwgY2xvY2sgZm9yIGF1ZGlvL3N5c3RlbSB0aW1lIHN5bmMgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fSEFTX0xJTktfQVRJTUUgICAgICAgICAgICAgIDB4MDEwMDAwMDAgIC8qIHJlcG9ydCBoYXJkd2FyZSBsaW5rIGF1ZGlvIHRpbWUsIHJlc2V0IG9uIHN0YXJ0dXAgKi8KKyNkZWZpbmUgU05EUlZfUENNX0lORk9fSEFTX0xJTktfQUJTT0xVVEVfQVRJTUUgICAgIDB4MDIwMDAwMDAgIC8qIHJlcG9ydCBhYnNvbHV0ZSBoYXJkd2FyZSBsaW5rIGF1ZGlvIHRpbWUsIG5vdCByZXNldCBvbiBzdGFydHVwICovCisjZGVmaW5lIFNORFJWX1BDTV9JTkZPX0hBU19MSU5LX0VTVElNQVRFRF9BVElNRSAgICAweDA0MDAwMDAwICAvKiByZXBvcnQgZXN0aW1hdGVkIGxpbmsgYXVkaW8gdGltZSAqLworI2RlZmluZSBTTkRSVl9QQ01fSU5GT19IQVNfTElOS19TWU5DSFJPTklaRURfQVRJTUUgMHgwODAwMDAwMCAgLyogcmVwb3J0IHN5bmNocm9uaXplZCBhdWRpby9zeXN0ZW0gdGltZSAqLworCiAjZGVmaW5lIFNORFJWX1BDTV9JTkZPX0RSQUlOX1RSSUdHRVIJMHg0MDAwMDAwMAkJLyogaW50ZXJuYWwga2VybmVsIGZsYWcgLSB0cmlnZ2VyIGluIGRyYWluICovCiAjZGVmaW5lIFNORFJWX1BDTV9JTkZPX0ZJRk9fSU5fRlJBTUVTCTB4ODAwMDAwMDAJLyogaW50ZXJuYWwga2VybmVsIGZsYWcgLSBGSUZPIHNpemUgaXMgaW4gZnJhbWVzICovCiAKKworCiB0eXBlZGVmIGludCBfX2JpdHdpc2Ugc25kX3BjbV9zdGF0ZV90OwogI2RlZmluZQlTTkRSVl9QQ01fU1RBVEVfT1BFTgkJKChfX2ZvcmNlIHNuZF9wY21fc3RhdGVfdCkgMCkgLyogc3RyZWFtIGlzIG9wZW4gKi8KICNkZWZpbmUJU05EUlZfUENNX1NUQVRFX1NFVFVQCQkoKF9fZm9yY2Ugc25kX3BjbV9zdGF0ZV90KSAxKSAvKiBzdHJlYW0gaGFzIGEgc2V0dXAgKi8KQEAgLTQwOCw2ICs0MTgsMjIgQEAKIAl1bnNpZ25lZCBpbnQgc3RlcDsJCS8qIHNhbXBsZXMgZGlzdGFuY2UgaW4gYml0cyAqLwogfTsKIAorZW51bSB7CisJLyoKKwkgKiAgZmlyc3QgZGVmaW5pdGlvbiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seSwKKwkgKiAgbWFwcyB0byB3YWxsY2xvY2svbGluayB0aW1lIGZvciBIREF1ZGlvIHBsYXliYWNrIGFuZCBERUZBVUxUL0RNQSB0aW1lIGZvciBldmVyeXRoaW5nIGVsc2UKKwkgKi8KKwlTTkRSVl9QQ01fQVVESU9fVFNUQU1QX1RZUEVfQ09NUEFUID0gMCwKKworCS8qIHRpbWVzdGFtcCBkZWZpbml0aW9ucyAqLworCVNORFJWX1BDTV9BVURJT19UU1RBTVBfVFlQRV9ERUZBVUxUID0gMSwgICAgICAgICAgIC8qIERNQSB0aW1lLCByZXBvcnRlZCBhcyBwZXIgaHdfcHRyICovCisJU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0xJTksgPSAyLAkgICAgICAgICAgIC8qIGxpbmsgdGltZSByZXBvcnRlZCBieSBzYW1wbGUgb3Igd2FsbGNsb2NrIGNvdW50ZXIsIHJlc2V0IG9uIHN0YXJ0dXAgKi8KKwlTTkRSVl9QQ01fQVVESU9fVFNUQU1QX1RZUEVfTElOS19BQlNPTFVURSA9IDMsCSAgIC8qIGxpbmsgdGltZSByZXBvcnRlZCBieSBzYW1wbGUgb3Igd2FsbGNsb2NrIGNvdW50ZXIsIG5vdCByZXNldCBvbiBzdGFydHVwICovCisJU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0xJTktfRVNUSU1BVEVEID0gNCwgICAgLyogbGluayB0aW1lIGVzdGltYXRlZCBpbmRpcmVjdGx5ICovCisJU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0xJTktfU1lOQ0hST05JWkVEID0gNSwgLyogbGluayB0aW1lIHN5bmNocm9uaXplZCB3aXRoIHN5c3RlbSB0aW1lICovCisJU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0xBU1QgPSBTTkRSVl9QQ01fQVVESU9fVFNUQU1QX1RZUEVfTElOS19TWU5DSFJPTklaRUQKK307CisKIHN0cnVjdCBzbmRfcGNtX3N0YXR1cyB7CiAJc25kX3BjbV9zdGF0ZV90IHN0YXRlOwkJLyogc3RyZWFtIHN0YXRlICovCiAJc3RydWN0IHRpbWVzcGVjIHRyaWdnZXJfdHN0YW1wOwkvKiB0aW1lIHdoZW4gc3RyZWFtIHdhcyBzdGFydGVkL3N0b3BwZWQvcGF1c2VkICovCkBAIC00MTksOSArNDQ1LDExIEBACiAJc25kX3BjbV91ZnJhbWVzX3QgYXZhaWxfbWF4OwkvKiBtYXggZnJhbWVzIGF2YWlsYWJsZSBvbiBodyBzaW5jZSBsYXN0IHN0YXR1cyAqLwogCXNuZF9wY21fdWZyYW1lc190IG92ZXJyYW5nZTsJLyogY291bnQgb2YgQURDIChjYXB0dXJlKSBvdmVycmFuZ2UgZGV0ZWN0aW9ucyBmcm9tIGxhc3Qgc3RhdHVzICovCiAJc25kX3BjbV9zdGF0ZV90IHN1c3BlbmRlZF9zdGF0ZTsgLyogc3VzcGVuZGVkIHN0cmVhbSBzdGF0ZSAqLwotCV9fdTMyIHJlc2VydmVkX2FsaWdubWVudDsJLyogbXVzdCBiZSBmaWxsZWQgd2l0aCB6ZXJvICovCi0Jc3RydWN0IHRpbWVzcGVjIGF1ZGlvX3RzdGFtcDsJLyogZnJvbSBzYW1wbGUgY291bnRlciBvciB3YWxsIGNsb2NrICovCi0JdW5zaWduZWQgY2hhciByZXNlcnZlZFs1Ni1zaXplb2Yoc3RydWN0IHRpbWVzcGVjKV07IC8qIG11c3QgYmUgZmlsbGVkIHdpdGggemVybyAqLworCV9fdTMyIGF1ZGlvX3RzdGFtcF9kYXRhOwkgLyogbmVlZGVkIGZvciA2NC1iaXQgYWxpZ25tZW50LCB1c2VkIGZvciBjb25maWdzL3JlcG9ydCB0by9mcm9tIHVzZXJzcGFjZSAqLworCXN0cnVjdCB0aW1lc3BlYyBhdWRpb190c3RhbXA7CS8qIHNhbXBsZSBjb3VudGVyLCB3YWxsIGNsb2NrLCBQSEMgb3Igb24tZGVtYW5kIHN5bmMnZWQgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgZHJpdmVyX3RzdGFtcDsJLyogdXNlZnVsIGluIGNhc2UgcmVmZXJlbmNlIHN5c3RlbSB0c3RhbXAgaXMgcmVwb3J0ZWQgd2l0aCBkZWxheSAqLworCV9fdTMyIGF1ZGlvX3RzdGFtcF9hY2N1cmFjeTsJLyogaW4gbnMgdW5pdHMsIG9ubHkgdmFsaWQgaWYgaW5kaWNhdGVkIGluIGF1ZGlvX3RzdGFtcF9kYXRhICovCisJdW5zaWduZWQgY2hhciByZXNlcnZlZFs1Mi0yKnNpemVvZihzdHJ1Y3QgdGltZXNwZWMpXTsgLyogbXVzdCBiZSBmaWxsZWQgd2l0aCB6ZXJvICovCiB9OwogCiBzdHJ1Y3Qgc25kX3BjbV9tbWFwX3N0YXR1cyB7CkBAIC01MzQsNiArNTYyLDcgQEAKICNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX0RFTEFZCQlfSU9SKCdBJywgMHgyMSwgc25kX3BjbV9zZnJhbWVzX3QpCiAjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9IV1NZTkMJCV9JTygnQScsIDB4MjIpCiAjZGVmaW5lIFNORFJWX1BDTV9JT0NUTF9TWU5DX1BUUglfSU9XUignQScsIDB4MjMsIHN0cnVjdCBzbmRfcGNtX3N5bmNfcHRyKQorI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfU1RBVFVTX0VYVAlfSU9XUignQScsIDB4MjQsIHN0cnVjdCBzbmRfcGNtX3N0YXR1cykKICNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX0NIQU5ORUxfSU5GTwlfSU9SKCdBJywgMHgzMiwgc3RydWN0IHNuZF9wY21fY2hhbm5lbF9pbmZvKQogI2RlZmluZSBTTkRSVl9QQ01fSU9DVExfUFJFUEFSRQkJX0lPKCdBJywgMHg0MCkKICNkZWZpbmUgU05EUlZfUENNX0lPQ1RMX1JFU0VUCQlfSU8oJ0EnLCAweDQxKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS91YXBpL3NvdW5kL2NvbXByZXNzX29mZmxvYWQuaCBiL2luY2x1ZGUvdWFwaS9zb3VuZC9jb21wcmVzc19vZmZsb2FkLmgKaW5kZXggMjJlZDhjYi4uZTAwZDhjYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL2NvbXByZXNzX29mZmxvYWQuaAorKysgYi9pbmNsdWRlL3VhcGkvc291bmQvY29tcHJlc3Nfb2ZmbG9hZC5oCkBAIC03NSw3ICs3NSw3IEBACiAvKioKICAqIHN0cnVjdCBzbmRfY29tcHJfYXZhaWwgLSBhdmFpbCBkZXNjcmlwdG9yCiAgKiBAYXZhaWw6IE51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgaW4gcmluZyBidWZmZXIgZm9yIHdyaXRpbmcvcmVhZGluZwotICogQHRzdGFtcDogdGltZXN0YW1wIGluZm9tYXRpb24KKyAqIEB0c3RhbXA6IHRpbWVzdGFtcCBpbmZvcm1hdGlvbgogICovCiBzdHJ1Y3Qgc25kX2NvbXByX2F2YWlsIHsKIAlfX3U2NCBhdmFpbDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9zb3VuZC9lbXUxMGsxLmggYi9pbmNsdWRlL3VhcGkvc291bmQvZW11MTBrMS5oCmluZGV4IGQxYmJhZjcuLmVjMTUzNWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdWFwaS9zb3VuZC9lbXUxMGsxLmgKKysrIGIvaW5jbHVkZS91YXBpL3NvdW5kL2VtdTEwazEuaApAQCAtMjMsOCArMjMsNyBAQAogI2RlZmluZSBfVUFQSV9fU09VTkRfRU1VMTBLMV9ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotCi0KKyNpbmNsdWRlIDxzb3VuZC9hc291bmQuaD4KIAogLyoKICAqIC0tLS0gRlg4MDEwIC0tLS0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdWFwaS9zb3VuZC9oZHNwbS5oIGIvaW5jbHVkZS91YXBpL3NvdW5kL2hkc3BtLmgKaW5kZXggYjM1N2YxYS4uNTczNzMzMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS91YXBpL3NvdW5kL2hkc3BtLmgKKysrIGIvaW5jbHVkZS91YXBpL3NvdW5kL2hkc3BtLmgKQEAgLTIwLDYgKzIwLDEyIEBACiAgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogICovCiAKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNlbHNlCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKwogLyogTWF4aW11bSBjaGFubmVscyBpcyA2NCBldmVuIG9uIDU2TW9kZSB5b3UgaGF2ZSA2NHBsYXliYWNrcyB0byBtYXRyaXggKi8KICNkZWZpbmUgSERTUE1fTUFYX0NIQU5ORUxTICAgICAgNjQKIApkaWZmIC0tZ2l0IGEvaW5pdC9LY29uZmlnIGIvaW5pdC9LY29uZmlnCmluZGV4IGY1ZGJjNmQuLjNiOWRmMWEgMTAwNjQ0Ci0tLSBhL2luaXQvS2NvbmZpZworKysgYi9pbml0L0tjb25maWcKQEAgLTM5NCw2ICszOTQsNyBAQAogCiBjb25maWcgQlNEX1BST0NFU1NfQUNDVAogCWJvb2wgIkJTRCBQcm9jZXNzIEFjY291bnRpbmciCisJZGVwZW5kcyBvbiBNVUxUSVVTRVIKIAloZWxwCiAJICBJZiB5b3Ugc2F5IFkgaGVyZSwgYSB1c2VyIGxldmVsIHByb2dyYW0gd2lsbCBiZSBhYmxlIHRvIGluc3RydWN0IHRoZQogCSAga2VybmVsICh2aWEgYSBzcGVjaWFsIHN5c3RlbSBjYWxsKSB0byB3cml0ZSBwcm9jZXNzIGFjY291bnRpbmcKQEAgLTQyMCw2ICs0MjEsNyBAQAogY29uZmlnIFRBU0tTVEFUUwogCWJvb2wgIkV4cG9ydCB0YXNrL3Byb2Nlc3Mgc3RhdGlzdGljcyB0aHJvdWdoIG5ldGxpbmsiCiAJZGVwZW5kcyBvbiBORVQKKwlkZXBlbmRzIG9uIE1VTFRJVVNFUgogCWRlZmF1bHQgbgogCWhlbHAKIAkgIEV4cG9ydCBzZWxlY3RlZCBzdGF0aXN0aWNzIGZvciB0YXNrcy9wcm9jZXNzZXMgdGhyb3VnaCB0aGUKQEAgLTc5MSw2ICs3OTMsMTkgQEAKIAogZW5kY2hvaWNlCiAKK2NvbmZpZyBSQ1VfRVhQRURJVEVfQk9PVAorCWJvb2wKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGV4cGVkaXRlZCBncmFjZSBwZXJpb2RzIGF0IGJvb3QgdGltZSwKKwkgIGFzIGlmIHJjdV9leHBlZGl0ZV9ncCgpIGhhZCBiZWVuIGludm9rZWQgZWFybHkgaW4gYm9vdC4KKwkgIFRoZSBjb3JyZXNwb25kaW5nIHJjdV91bmV4cGVkaXRlX2dwKCkgaXMgaW52b2tlZCBmcm9tCisJICByY3VfZW5kX2lua2VybmVsX2Jvb3QoKSwgd2hpY2ggaXMgaW50ZW5kZWQgdG8gYmUgaW52b2tlZAorCSAgYXQgdGhlIGVuZCBvZiB0aGUga2VybmVsLW9ubHkgYm9vdCBzZXF1ZW5jZSwganVzdCBiZWZvcmUKKwkgIGluaXQgaXMgZXhlYydlZC4KKworCSAgQWNjZXB0IHRoZSBkZWZhdWx0IGlmIHVuc3VyZS4KKwogZW5kbWVudSAjICJSQ1UgU3Vic3lzdGVtIgogCiBjb25maWcgQlVJTERfQklOMkMKQEAgLTExNDcsNiArMTE2Miw3IEBACiAKIG1lbnVjb25maWcgTkFNRVNQQUNFUwogCWJvb2wgIk5hbWVzcGFjZXMgc3VwcG9ydCIgaWYgRVhQRVJUCisJZGVwZW5kcyBvbiBNVUxUSVVTRVIKIAlkZWZhdWx0ICFFWFBFUlQKIAloZWxwCiAJICBQcm92aWRlcyB0aGUgd2F5IHRvIG1ha2UgdGFza3Mgd29yayB3aXRoIGRpZmZlcmVudCBvYmplY3RzIHVzaW5nCkBAIC0xMzQzLDExICsxMzU5LDI1IEBACiAKIGNvbmZpZyBVSUQxNgogCWJvb2wgIkVuYWJsZSAxNi1iaXQgVUlEIHN5c3RlbSBjYWxscyIgaWYgRVhQRVJUCi0JZGVwZW5kcyBvbiBIQVZFX1VJRDE2CisJZGVwZW5kcyBvbiBIQVZFX1VJRDE2ICYmIE1VTFRJVVNFUgogCWRlZmF1bHQgeQogCWhlbHAKIAkgIFRoaXMgZW5hYmxlcyB0aGUgbGVnYWN5IDE2LWJpdCBVSUQgc3lzY2FsbCB3cmFwcGVycy4KIAorY29uZmlnIE1VTFRJVVNFUgorCWJvb2wgIk11bHRpcGxlIHVzZXJzLCBncm91cHMgYW5kIGNhcGFiaWxpdGllcyBzdXBwb3J0IiBpZiBFWFBFUlQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIG5vbi1yb290IHVzZXJzLCBncm91cHMgYW5kCisJICBjYXBhYmlsaXRpZXMuCisKKwkgIElmIHlvdSBzYXkgTiBoZXJlLCBhbGwgcHJvY2Vzc2VzIHdpbGwgcnVuIHdpdGggVUlEIDAsIEdJRCAwLCBhbmQgYWxsCisJICBwb3NzaWJsZSBjYXBhYmlsaXRpZXMuICBTYXlpbmcgTiBoZXJlIGFsc28gY29tcGlsZXMgb3V0IHN1cHBvcnQgZm9yCisJICBzeXN0ZW0gY2FsbHMgcmVsYXRlZCB0byBVSURzLCBHSURzLCBhbmQgY2FwYWJpbGl0aWVzLCBzdWNoIGFzIHNldHVpZCwKKwkgIHNldGdpZCwgYW5kIGNhcHNldC4KKworCSAgSWYgdW5zdXJlLCBzYXkgWSBoZXJlLgorCiBjb25maWcgU0dFVE1BU0tfU1lTQ0FMTAogCWJvb2wgInNnZXRtYXNrL3NzZXRtYXNrIHN5c2NhbGxzIHN1cHBvcnQiIGlmIEVYUEVSVAogCWRlZl9ib29sIFBBUklTQyB8fCBNTjEwMzAwIHx8IEJMQUNLRklOIHx8IE02OEsgfHwgUFBDIHx8IE1JUFMgfHwgWDg2IHx8IFNQQVJDIHx8IENSSVMgfHwgTUlDUk9CTEFaRSB8fCBTVVBFUkgKQEAgLTE1MTMsNyArMTU0Myw3IEBACiAKICMgc3lzY2FsbCwgbWFwcywgdmVyaWZpZXIKIGNvbmZpZyBCUEZfU1lTQ0FMTAotCWJvb2wgIkVuYWJsZSBicGYoKSBzeXN0ZW0gY2FsbCIgaWYgRVhQRVJUCisJYm9vbCAiRW5hYmxlIGJwZigpIHN5c3RlbSBjYWxsIgogCXNlbGVjdCBBTk9OX0lOT0RFUwogCXNlbGVjdCBCUEYKIAlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL2luaXQvbWFpbi5jIGIvaW5pdC9tYWluLmMKaW5kZXggNmYwZjFjNWYuLmE3ZTk2OWQgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC04MCw2ICs4MCw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVncml0eS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2J1Z3MuaD4KQEAgLTE0Myw3ICsxNDQsNyBAQAogICogcmVseSBvbiB0aGUgQklPUyBhbmQgc2tpcCB0aGUgcmVzZXQgb3BlcmF0aW9uLgogICoKICAqIFRoaXMgaXMgdXNlZnVsIGlmIGtlcm5lbCBpcyBib290aW5nIGluIGFuIHVucmVsaWFibGUgZW52aXJvbm1lbnQuCi0gKiBGb3IgZXguIGtkdW1wIHNpdHVhaXRvbiB3aGVyZSBwcmV2aW91cyBrZXJuZWwgaGFzIGNyYXNoZWQsIEJJT1MgaGFzIGJlZW4KKyAqIEZvciBleC4ga2R1bXAgc2l0dWF0aW9uIHdoZXJlIHByZXZpb3VzIGtlcm5lbCBoYXMgY3Jhc2hlZCwgQklPUyBoYXMgYmVlbgogICogc2tpcHBlZCBhbmQgZGV2aWNlcyB3aWxsIGJlIGluIHVua25vd24gc3RhdGUuCiAgKi8KIHVuc2lnbmVkIGludCByZXNldF9kZXZpY2VzOwpAQCAtMzg0LDYgKzM4NSw3IEBACiAJaW50IHBpZDsKIAogCXJjdV9zY2hlZHVsZXJfc3RhcnRpbmcoKTsKKwlzbXBib290X3RocmVhZF9pbml0KCk7CiAJLyoKIAkgKiBXZSBuZWVkIHRvIHNwYXduIGluaXQgZmlyc3Qgc28gdGhhdCBpdCBvYnRhaW5zIHBpZCAxLCBob3dldmVyCiAJICogdGhlIGluaXQgdGFzayB3aWxsIGVuZCB1cCB3YW50aW5nIHRvIGNyZWF0ZSBrdGhyZWFkcywgd2hpY2gsIGlmCkBAIC00ODQsNiArNDg2LDcgQEAKIAlwZXJjcHVfaW5pdF9sYXRlKCk7CiAJcGd0YWJsZV9pbml0KCk7CiAJdm1hbGxvY19pbml0KCk7CisJaW9yZW1hcF9odWdlX2luaXQoKTsKIH0KIAogYXNtbGlua2FnZSBfX3Zpc2libGUgdm9pZCBfX2luaXQgc3RhcnRfa2VybmVsKHZvaWQpCkBAIC02NTQsOCArNjU3LDggQEAKIAlwYWdlX3dyaXRlYmFja19pbml0KCk7CiAJcHJvY19yb290X2luaXQoKTsKIAluc2ZzX2luaXQoKTsKLQljZ3JvdXBfaW5pdCgpOwogCWNwdXNldF9pbml0KCk7CisJY2dyb3VwX2luaXQoKTsKIAl0YXNrc3RhdHNfaW5pdF9lYXJseSgpOwogCWRlbGF5YWNjdF9pbml0KCk7CiAKZGlmZiAtLWdpdCBhL2lwYy9tc2cuYyBiL2lwYy9tc2cuYwppbmRleCBhNzI2MWQ1Li4yYjZmZGJiIDEwMDY0NAotLS0gYS9pcGMvbXNnLmMKKysrIGIvaXBjL21zZy5jCkBAIC0xMDE1LDIyICsxMDE1LDI0IEBACiAJc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zID0gc2VxX3VzZXJfbnMocyk7CiAJc3RydWN0IG1zZ19xdWV1ZSAqbXNxID0gaXQ7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihzLAotCQkJIiUxMGQgJTEwZCAgJTRvICAlMTBsdSAlMTBsdSAlNXUgJTV1ICU1dSAlNXUgJTV1ICU1dSAlMTBsdSAlMTBsdSAlMTBsdVxuIiwKLQkJCW1zcS0+cV9wZXJtLmtleSwKLQkJCW1zcS0+cV9wZXJtLmlkLAotCQkJbXNxLT5xX3Blcm0ubW9kZSwKLQkJCW1zcS0+cV9jYnl0ZXMsCi0JCQltc3EtPnFfcW51bSwKLQkJCW1zcS0+cV9sc3BpZCwKLQkJCW1zcS0+cV9scnBpZCwKLQkJCWZyb21fa3VpZF9tdW5nZWQodXNlcl9ucywgbXNxLT5xX3Blcm0udWlkKSwKLQkJCWZyb21fa2dpZF9tdW5nZWQodXNlcl9ucywgbXNxLT5xX3Blcm0uZ2lkKSwKLQkJCWZyb21fa3VpZF9tdW5nZWQodXNlcl9ucywgbXNxLT5xX3Blcm0uY3VpZCksCi0JCQlmcm9tX2tnaWRfbXVuZ2VkKHVzZXJfbnMsIG1zcS0+cV9wZXJtLmNnaWQpLAotCQkJbXNxLT5xX3N0aW1lLAotCQkJbXNxLT5xX3J0aW1lLAotCQkJbXNxLT5xX2N0aW1lKTsKKwlzZXFfcHJpbnRmKHMsCisJCSAgICIlMTBkICUxMGQgICU0byAgJTEwbHUgJTEwbHUgJTV1ICU1dSAlNXUgJTV1ICU1dSAlNXUgJTEwbHUgJTEwbHUgJTEwbHVcbiIsCisJCSAgIG1zcS0+cV9wZXJtLmtleSwKKwkJICAgbXNxLT5xX3Blcm0uaWQsCisJCSAgIG1zcS0+cV9wZXJtLm1vZGUsCisJCSAgIG1zcS0+cV9jYnl0ZXMsCisJCSAgIG1zcS0+cV9xbnVtLAorCQkgICBtc3EtPnFfbHNwaWQsCisJCSAgIG1zcS0+cV9scnBpZCwKKwkJICAgZnJvbV9rdWlkX211bmdlZCh1c2VyX25zLCBtc3EtPnFfcGVybS51aWQpLAorCQkgICBmcm9tX2tnaWRfbXVuZ2VkKHVzZXJfbnMsIG1zcS0+cV9wZXJtLmdpZCksCisJCSAgIGZyb21fa3VpZF9tdW5nZWQodXNlcl9ucywgbXNxLT5xX3Blcm0uY3VpZCksCisJCSAgIGZyb21fa2dpZF9tdW5nZWQodXNlcl9ucywgbXNxLT5xX3Blcm0uY2dpZCksCisJCSAgIG1zcS0+cV9zdGltZSwKKwkJICAgbXNxLT5xX3J0aW1lLAorCQkgICBtc3EtPnFfY3RpbWUpOworCisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaXBjL3NlbS5jIGIvaXBjL3NlbS5jCmluZGV4IDkyODQyMTEuLmQxYTZlZGQgMTAwNjQ0Ci0tLSBhL2lwYy9zZW0uYworKysgYi9pcGMvc2VtLmMKQEAgLTIxNzAsMTcgKzIxNzAsMTkgQEAKIAogCXNlbV9vdGltZSA9IGdldF9zZW1vdGltZShzbWEpOwogCi0JcmV0dXJuIHNlcV9wcmludGYocywKLQkJCSAgIiUxMGQgJTEwZCAgJTRvICUxMHUgJTV1ICU1dSAlNXUgJTV1ICUxMGx1ICUxMGx1XG4iLAotCQkJICBzbWEtPnNlbV9wZXJtLmtleSwKLQkJCSAgc21hLT5zZW1fcGVybS5pZCwKLQkJCSAgc21hLT5zZW1fcGVybS5tb2RlLAotCQkJICBzbWEtPnNlbV9uc2VtcywKLQkJCSAgZnJvbV9rdWlkX211bmdlZCh1c2VyX25zLCBzbWEtPnNlbV9wZXJtLnVpZCksCi0JCQkgIGZyb21fa2dpZF9tdW5nZWQodXNlcl9ucywgc21hLT5zZW1fcGVybS5naWQpLAotCQkJICBmcm9tX2t1aWRfbXVuZ2VkKHVzZXJfbnMsIHNtYS0+c2VtX3Blcm0uY3VpZCksCi0JCQkgIGZyb21fa2dpZF9tdW5nZWQodXNlcl9ucywgc21hLT5zZW1fcGVybS5jZ2lkKSwKLQkJCSAgc2VtX290aW1lLAotCQkJICBzbWEtPnNlbV9jdGltZSk7CisJc2VxX3ByaW50ZihzLAorCQkgICAiJTEwZCAlMTBkICAlNG8gJTEwdSAlNXUgJTV1ICU1dSAlNXUgJTEwbHUgJTEwbHVcbiIsCisJCSAgIHNtYS0+c2VtX3Blcm0ua2V5LAorCQkgICBzbWEtPnNlbV9wZXJtLmlkLAorCQkgICBzbWEtPnNlbV9wZXJtLm1vZGUsCisJCSAgIHNtYS0+c2VtX25zZW1zLAorCQkgICBmcm9tX2t1aWRfbXVuZ2VkKHVzZXJfbnMsIHNtYS0+c2VtX3Blcm0udWlkKSwKKwkJICAgZnJvbV9rZ2lkX211bmdlZCh1c2VyX25zLCBzbWEtPnNlbV9wZXJtLmdpZCksCisJCSAgIGZyb21fa3VpZF9tdW5nZWQodXNlcl9ucywgc21hLT5zZW1fcGVybS5jdWlkKSwKKwkJICAgZnJvbV9rZ2lkX211bmdlZCh1c2VyX25zLCBzbWEtPnNlbV9wZXJtLmNnaWQpLAorCQkgICBzZW1fb3RpbWUsCisJCSAgIHNtYS0+c2VtX2N0aW1lKTsKKworCXJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pcGMvc2htLmMgYi9pcGMvc2htLmMKaW5kZXggMTk2MzNiNC4uZDI4MGE3NCAxMDA2NDQKLS0tIGEvaXBjL3NobS5jCisrKyBiL2lwYy9zaG0uYwpAQCAtMTM0MiwyNSArMTM0MiwyNyBAQAogI2RlZmluZSBTSVpFX1NQRUMgIiUyMWx1IgogI2VuZGlmCiAKLQlyZXR1cm4gc2VxX3ByaW50ZihzLAotCQkJICAiJTEwZCAlMTBkICAlNG8gIiBTSVpFX1NQRUMgIiAlNXUgJTV1ICAiCi0JCQkgICIlNWx1ICU1dSAlNXUgJTV1ICU1dSAlMTBsdSAlMTBsdSAlMTBsdSAiCi0JCQkgIFNJWkVfU1BFQyAiICIgU0laRV9TUEVDICJcbiIsCi0JCQkgIHNocC0+c2htX3Blcm0ua2V5LAotCQkJICBzaHAtPnNobV9wZXJtLmlkLAotCQkJICBzaHAtPnNobV9wZXJtLm1vZGUsCi0JCQkgIHNocC0+c2htX3NlZ3N6LAotCQkJICBzaHAtPnNobV9jcHJpZCwKLQkJCSAgc2hwLT5zaG1fbHByaWQsCi0JCQkgIHNocC0+c2htX25hdHRjaCwKLQkJCSAgZnJvbV9rdWlkX211bmdlZCh1c2VyX25zLCBzaHAtPnNobV9wZXJtLnVpZCksCi0JCQkgIGZyb21fa2dpZF9tdW5nZWQodXNlcl9ucywgc2hwLT5zaG1fcGVybS5naWQpLAotCQkJICBmcm9tX2t1aWRfbXVuZ2VkKHVzZXJfbnMsIHNocC0+c2htX3Blcm0uY3VpZCksCi0JCQkgIGZyb21fa2dpZF9tdW5nZWQodXNlcl9ucywgc2hwLT5zaG1fcGVybS5jZ2lkKSwKLQkJCSAgc2hwLT5zaG1fYXRpbSwKLQkJCSAgc2hwLT5zaG1fZHRpbSwKLQkJCSAgc2hwLT5zaG1fY3RpbSwKLQkJCSAgcnNzICogUEFHRV9TSVpFLAotCQkJICBzd3AgKiBQQUdFX1NJWkUpOworCXNlcV9wcmludGYocywKKwkJICAgIiUxMGQgJTEwZCAgJTRvICIgU0laRV9TUEVDICIgJTV1ICU1dSAgIgorCQkgICAiJTVsdSAlNXUgJTV1ICU1dSAlNXUgJTEwbHUgJTEwbHUgJTEwbHUgIgorCQkgICBTSVpFX1NQRUMgIiAiIFNJWkVfU1BFQyAiXG4iLAorCQkgICBzaHAtPnNobV9wZXJtLmtleSwKKwkJICAgc2hwLT5zaG1fcGVybS5pZCwKKwkJICAgc2hwLT5zaG1fcGVybS5tb2RlLAorCQkgICBzaHAtPnNobV9zZWdzeiwKKwkJICAgc2hwLT5zaG1fY3ByaWQsCisJCSAgIHNocC0+c2htX2xwcmlkLAorCQkgICBzaHAtPnNobV9uYXR0Y2gsCisJCSAgIGZyb21fa3VpZF9tdW5nZWQodXNlcl9ucywgc2hwLT5zaG1fcGVybS51aWQpLAorCQkgICBmcm9tX2tnaWRfbXVuZ2VkKHVzZXJfbnMsIHNocC0+c2htX3Blcm0uZ2lkKSwKKwkJICAgZnJvbV9rdWlkX211bmdlZCh1c2VyX25zLCBzaHAtPnNobV9wZXJtLmN1aWQpLAorCQkgICBmcm9tX2tnaWRfbXVuZ2VkKHVzZXJfbnMsIHNocC0+c2htX3Blcm0uY2dpZCksCisJCSAgIHNocC0+c2htX2F0aW0sCisJCSAgIHNocC0+c2htX2R0aW0sCisJCSAgIHNocC0+c2htX2N0aW0sCisJCSAgIHJzcyAqIFBBR0VfU0laRSwKKwkJICAgc3dwICogUEFHRV9TSVpFKTsKKworCXJldHVybiAwOwogfQogI2VuZGlmCmRpZmYgLS1naXQgYS9pcGMvdXRpbC5jIGIvaXBjL3V0aWwuYwppbmRleCAxMDZiZWQwLi5mZjMzMjNlIDEwMDY0NAotLS0gYS9pcGMvdXRpbC5jCisrKyBiL2lwYy91dGlsLmMKQEAgLTgzNyw4ICs4MzcsMTAgQEAKIAlzdHJ1Y3QgaXBjX3Byb2NfaXRlciAqaXRlciA9IHMtPnByaXZhdGU7CiAJc3RydWN0IGlwY19wcm9jX2lmYWNlICppZmFjZSA9IGl0ZXItPmlmYWNlOwogCi0JaWYgKGl0ID09IFNFUV9TVEFSVF9UT0tFTikKLQkJcmV0dXJuIHNlcV9wdXRzKHMsIGlmYWNlLT5oZWFkZXIpOworCWlmIChpdCA9PSBTRVFfU1RBUlRfVE9LRU4pIHsKKwkJc2VxX3B1dHMocywgaWZhY2UtPmhlYWRlcik7CisJCXJldHVybiAwOworCX0KIAogCXJldHVybiBpZmFjZS0+c2hvdyhzLCBpdCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggMTQwOGIzMy4uMGY4ZjhiMCAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtOSw3ICs5LDkgQEAKIAkgICAgZXh0YWJsZS5vIHBhcmFtcy5vIFwKIAkgICAga3RocmVhZC5vIHN5c19uaS5vIG5zcHJveHkubyBcCiAJICAgIG5vdGlmaWVyLm8ga3N5c2ZzLm8gY3JlZC5vIHJlYm9vdC5vIFwKLQkgICAgYXN5bmMubyByYW5nZS5vIGdyb3Vwcy5vIHNtcGJvb3QubworCSAgICBhc3luYy5vIHJhbmdlLm8gc21wYm9vdC5vCisKK29iai0kKENPTkZJR19NVUxUSVVTRVIpICs9IGdyb3Vwcy5vCiAKIGlmZGVmIENPTkZJR19GVU5DVElPTl9UUkFDRVIKICMgRG8gbm90IHRyYWNlIGRlYnVnIGZpbGVzIGFuZCBpbnRlcm5hbCBmdHJhY2UgZmlsZXMKZGlmZiAtLWdpdCBhL2tlcm5lbC9hY2N0LmMgYi9rZXJuZWwvYWNjdC5jCmluZGV4IGU2YzEwZDFhLi43NDk2M2QxIDEwMDY0NAotLS0gYS9rZXJuZWwvYWNjdC5jCisrKyBiL2tlcm5lbC9hY2N0LmMKQEAgLTIxMyw3ICsyMTMsNyBAQAogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKLQlpZiAoIWZpbGUtPmZfb3AtPndyaXRlKSB7CisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfQ0FOX1dSSVRFKSkgewogCQlrZnJlZShhY2N0KTsKIAkJZmlscF9jbG9zZShmaWxlLCBOVUxMKTsKIAkJcmV0dXJuIC1FSU87CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL01ha2VmaWxlIGIva2VybmVsL2JwZi9NYWtlZmlsZQppbmRleCBhNWFlNjBmLi5lNjk4M2JlIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL01ha2VmaWxlCisrKyBiL2tlcm5lbC9icGYvTWFrZWZpbGUKQEAgLTEsNSArMSwyIEBACiBvYmoteSA6PSBjb3JlLm8KIG9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gc3lzY2FsbC5vIHZlcmlmaWVyLm8gaGFzaHRhYi5vIGFycmF5bWFwLm8gaGVscGVycy5vCi1pZmRlZiBDT05GSUdfVEVTVF9CUEYKLW9iai0kKENPTkZJR19CUEZfU1lTQ0FMTCkgKz0gdGVzdF9zdHViLm8KLWVuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2FycmF5bWFwLmMgYi9rZXJuZWwvYnBmL2FycmF5bWFwLmMKaW5kZXggOWViNGQ4YS4uOGE2NjE2NSAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9hcnJheW1hcC5jCisrKyBiL2tlcm5lbC9icGYvYXJyYXltYXAuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJa3ZmcmVlKGFycmF5KTsKIH0KIAotc3RhdGljIHN0cnVjdCBicGZfbWFwX29wcyBhcnJheV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9tYXBfb3BzIGFycmF5X29wcyA9IHsKIAkubWFwX2FsbG9jID0gYXJyYXlfbWFwX2FsbG9jLAogCS5tYXBfZnJlZSA9IGFycmF5X21hcF9mcmVlLAogCS5tYXBfZ2V0X25leHRfa2V5ID0gYXJyYXlfbWFwX2dldF9uZXh0X2tleSwKQEAgLTE0MywxNCArMTQzLDE0IEBACiAJLm1hcF9kZWxldGVfZWxlbSA9IGFycmF5X21hcF9kZWxldGVfZWxlbSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYnBmX21hcF90eXBlX2xpc3QgdGwgPSB7CitzdGF0aWMgc3RydWN0IGJwZl9tYXBfdHlwZV9saXN0IGFycmF5X3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkub3BzID0gJmFycmF5X29wcywKIAkudHlwZSA9IEJQRl9NQVBfVFlQRV9BUlJBWSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX2FycmF5X21hcCh2b2lkKQogewotCWJwZl9yZWdpc3Rlcl9tYXBfdHlwZSgmdGwpOworCWJwZl9yZWdpc3Rlcl9tYXBfdHlwZSgmYXJyYXlfdHlwZSk7CiAJcmV0dXJuIDA7CiB9CiBsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX2FycmF5X21hcCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL2NvcmUuYyBiL2tlcm5lbC9icGYvY29yZS5jCmluZGV4IGE2NGU3YTIuLjQxMzlhMGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvY29yZS5jCisrKyBiL2tlcm5lbC9icGYvY29yZS5jCkBAIC02NTYsNiArNjU2LDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChicGZfcHJvZ19mcmVlKTsKIAorLyogV2VhayBkZWZpbml0aW9ucyBvZiBoZWxwZXIgZnVuY3Rpb25zIGluIGNhc2Ugd2UgZG9uJ3QgaGF2ZSBicGYgc3lzY2FsbC4gKi8KK2NvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2xvb2t1cF9lbGVtX3Byb3RvIF9fd2VhazsKK2NvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX3VwZGF0ZV9lbGVtX3Byb3RvIF9fd2VhazsKK2NvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2RlbGV0ZV9lbGVtX3Byb3RvIF9fd2VhazsKKworY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9nZXRfcHJhbmRvbV91MzJfcHJvdG8gX193ZWFrOworY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9nZXRfc21wX3Byb2Nlc3Nvcl9pZF9wcm90byBfX3dlYWs7CisKIC8qIFRvIGV4ZWN1dGUgTERfQUJTL0xEX0lORCBpbnN0cnVjdGlvbnMgX19icGZfcHJvZ19ydW4oKSBtYXkgY2FsbAogICogc2tiX2NvcHlfYml0cygpLCBzbyBwcm92aWRlIGEgd2VhayBkZWZpbml0aW9uIG9mIGl0IGZvciBORVQtbGVzcyBjb25maWcuCiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGFzaHRhYi5jIGIva2VybmVsL2JwZi9oYXNodGFiLmMKaW5kZXggYjNiYTQzNi4uODNjMjA5ZCAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9oYXNodGFiLmMKKysrIGIva2VybmVsL2JwZi9oYXNodGFiLmMKQEAgLTM0NSw3ICszNDUsNyBAQAogCWtmcmVlKGh0YWIpOwogfQogCi1zdGF0aWMgc3RydWN0IGJwZl9tYXBfb3BzIGh0YWJfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfbWFwX29wcyBodGFiX29wcyA9IHsKIAkubWFwX2FsbG9jID0gaHRhYl9tYXBfYWxsb2MsCiAJLm1hcF9mcmVlID0gaHRhYl9tYXBfZnJlZSwKIAkubWFwX2dldF9uZXh0X2tleSA9IGh0YWJfbWFwX2dldF9uZXh0X2tleSwKQEAgLTM1NCwxNCArMzU0LDE0IEBACiAJLm1hcF9kZWxldGVfZWxlbSA9IGh0YWJfbWFwX2RlbGV0ZV9lbGVtLAogfTsKIAotc3RhdGljIHN0cnVjdCBicGZfbWFwX3R5cGVfbGlzdCB0bCA9IHsKK3N0YXRpYyBzdHJ1Y3QgYnBmX21hcF90eXBlX2xpc3QgaHRhYl90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm9wcyA9ICZodGFiX29wcywKIAkudHlwZSA9IEJQRl9NQVBfVFlQRV9IQVNILAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcmVnaXN0ZXJfaHRhYl9tYXAodm9pZCkKIHsKLQlicGZfcmVnaXN0ZXJfbWFwX3R5cGUoJnRsKTsKKwlicGZfcmVnaXN0ZXJfbWFwX3R5cGUoJmh0YWJfdHlwZSk7CiAJcmV0dXJuIDA7CiB9CiBsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX2h0YWJfbWFwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvaGVscGVycy5jIGIva2VybmVsL2JwZi9oZWxwZXJzLmMKaW5kZXggOWUzNDE0ZC4uYmQ3ZjU5OCAxMDA2NDQKLS0tIGEva2VybmVsL2JwZi9oZWxwZXJzLmMKKysrIGIva2VybmVsL2JwZi9oZWxwZXJzLmMKQEAgLTExLDYgKzExLDggQEAKICAqLwogI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CiAKIC8qIElmIGtlcm5lbCBzdWJzeXN0ZW0gaXMgYWxsb3dpbmcgZUJQRiBwcm9ncmFtcyB0byBjYWxsIHRoaXMgZnVuY3Rpb24sCiAgKiBpbnNpZGUgaXRzIG93biB2ZXJpZmllcl9vcHMtPmdldF9mdW5jX3Byb3RvKCkgY2FsbGJhY2sgaXQgc2hvdWxkIHJldHVybgpAQCAtNDEsNyArNDMsNyBAQAogCXJldHVybiAodW5zaWduZWQgbG9uZykgdmFsdWU7CiB9CiAKLXN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2xvb2t1cF9lbGVtX3Byb3RvID0geworY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9tYXBfbG9va3VwX2VsZW1fcHJvdG8gPSB7CiAJLmZ1bmMgPSBicGZfbWFwX2xvb2t1cF9lbGVtLAogCS5ncGxfb25seSA9IGZhbHNlLAogCS5yZXRfdHlwZSA9IFJFVF9QVFJfVE9fTUFQX1ZBTFVFX09SX05VTEwsCkBAIC02MCw3ICs2Miw3IEBACiAJcmV0dXJuIG1hcC0+b3BzLT5tYXBfdXBkYXRlX2VsZW0obWFwLCBrZXksIHZhbHVlLCByNCk7CiB9CiAKLXN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX3VwZGF0ZV9lbGVtX3Byb3RvID0geworY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9tYXBfdXBkYXRlX2VsZW1fcHJvdG8gPSB7CiAJLmZ1bmMgPSBicGZfbWFwX3VwZGF0ZV9lbGVtLAogCS5ncGxfb25seSA9IGZhbHNlLAogCS5yZXRfdHlwZSA9IFJFVF9JTlRFR0VSLApAQCAtODAsMTAgKzgyLDMyIEBACiAJcmV0dXJuIG1hcC0+b3BzLT5tYXBfZGVsZXRlX2VsZW0obWFwLCBrZXkpOwogfQogCi1zdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX21hcF9kZWxldGVfZWxlbV9wcm90byA9IHsKK2NvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbWFwX2RlbGV0ZV9lbGVtX3Byb3RvID0gewogCS5mdW5jID0gYnBmX21hcF9kZWxldGVfZWxlbSwKIAkuZ3BsX29ubHkgPSBmYWxzZSwKIAkucmV0X3R5cGUgPSBSRVRfSU5URUdFUiwKIAkuYXJnMV90eXBlID0gQVJHX0NPTlNUX01BUF9QVFIsCiAJLmFyZzJfdHlwZSA9IEFSR19QVFJfVE9fTUFQX0tFWSwKIH07CisKK3N0YXRpYyB1NjQgYnBmX2dldF9wcmFuZG9tX3UzMih1NjQgcjEsIHU2NCByMiwgdTY0IHIzLCB1NjQgcjQsIHU2NCByNSkKK3sKKwlyZXR1cm4gcHJhbmRvbV91MzIoKTsKK30KKworY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9nZXRfcHJhbmRvbV91MzJfcHJvdG8gPSB7CisJLmZ1bmMJCT0gYnBmX2dldF9wcmFuZG9tX3UzMiwKKwkuZ3BsX29ubHkJPSBmYWxzZSwKKwkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKK307CisKK3N0YXRpYyB1NjQgYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IHI1KQoreworCXJldHVybiByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworfQorCitjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2dldF9zbXBfcHJvY2Vzc29yX2lkX3Byb3RvID0geworCS5mdW5jCQk9IGJwZl9nZXRfc21wX3Byb2Nlc3Nvcl9pZCwKKwkuZ3BsX29ubHkJPSBmYWxzZSwKKwkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKK307CmRpZmYgLS1naXQgYS9rZXJuZWwvYnBmL3N5c2NhbGwuYyBiL2tlcm5lbC9icGYvc3lzY2FsbC5jCmluZGV4IDUzNmVkYzIuLjNiYWU2YzUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9icGYvc3lzY2FsbC5jCisrKyBiL2tlcm5lbC9icGYvc3lzY2FsbC5jCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpY2Vuc2UuaD4KICNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAKIHN0YXRpYyBMSVNUX0hFQUQoYnBmX21hcF90eXBlcyk7CiAKQEAgLTM1NCwxMCArMzU1LDExIEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh0bCwgJmJwZl9wcm9nX3R5cGVzLCBsaXN0X25vZGUpIHsKIAkJaWYgKHRsLT50eXBlID09IHR5cGUpIHsKIAkJCXByb2ctPmF1eC0+b3BzID0gdGwtPm9wczsKLQkJCXByb2ctPmF1eC0+cHJvZ190eXBlID0gdHlwZTsKKwkJCXByb2ctPnR5cGUgPSB0eXBlOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CisKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApAQCAtNDE4LDYgKzQyMCw3IEBACiAJCWJwZl9wcm9nX2ZyZWUocHJvZyk7CiAJfQogfQorRVhQT1JUX1NZTUJPTF9HUEwoYnBmX3Byb2dfcHV0KTsKIAogc3RhdGljIGludCBicGZfcHJvZ19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQogewpAQCAtNDY1LDkgKzQ2OCwxMCBAQAogCWZkcHV0KGYpOwogCXJldHVybiBwcm9nOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoYnBmX3Byb2dfZ2V0KTsKIAogLyogbGFzdCBmaWVsZCBpbiAndW5pb24gYnBmX2F0dHInIHVzZWQgYnkgdGhpcyBjb21tYW5kICovCi0jZGVmaW5lCUJQRl9QUk9HX0xPQURfTEFTVF9GSUVMRCBsb2dfYnVmCisjZGVmaW5lCUJQRl9QUk9HX0xPQURfTEFTVF9GSUVMRCBrZXJuX3ZlcnNpb24KIAogc3RhdGljIGludCBicGZfcHJvZ19sb2FkKHVuaW9uIGJwZl9hdHRyICphdHRyKQogewpAQCAtNDkyLDYgKzQ5NiwxMCBAQAogCWlmIChhdHRyLT5pbnNuX2NudCA+PSBCUEZfTUFYSU5TTlMpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKHR5cGUgPT0gQlBGX1BST0dfVFlQRV9LUFJPQkUgJiYKKwkgICAgYXR0ci0+a2Vybl92ZXJzaW9uICE9IExJTlVYX1ZFUlNJT05fQ09ERSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAkvKiBwbGFpbiBicGZfcHJvZyBhbGxvY2F0aW9uICovCiAJcHJvZyA9IGJwZl9wcm9nX2FsbG9jKGJwZl9wcm9nX3NpemUoYXR0ci0+aW5zbl9jbnQpLCBHRlBfVVNFUik7CiAJaWYgKCFwcm9nKQpAQCAtNTA4LDcgKzUxNiw3IEBACiAJcHJvZy0+aml0ZWQgPSBmYWxzZTsKIAogCWF0b21pY19zZXQoJnByb2ctPmF1eC0+cmVmY250LCAxKTsKLQlwcm9nLT5hdXgtPmlzX2dwbF9jb21wYXRpYmxlID0gaXNfZ3BsOworCXByb2ctPmdwbF9jb21wYXRpYmxlID0gaXNfZ3BsOwogCiAJLyogZmluZCBwcm9ncmFtIHR5cGU6IHNvY2tldF9maWx0ZXIgdnMgdHJhY2luZ19maWx0ZXIgKi8KIAllcnIgPSBmaW5kX3Byb2dfdHlwZSh0eXBlLCBwcm9nKTsKQEAgLTUxNiw4ICs1MjQsNyBAQAogCQlnb3RvIGZyZWVfcHJvZzsKIAogCS8qIHJ1biBlQlBGIHZlcmlmaWVyICovCi0JZXJyID0gYnBmX2NoZWNrKHByb2csIGF0dHIpOwotCisJZXJyID0gYnBmX2NoZWNrKCZwcm9nLCBhdHRyKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBmcmVlX3VzZWRfbWFwczsKIApAQCAtNTI4LDcgKzUzNSw2IEBACiAJYnBmX3Byb2dfc2VsZWN0X3J1bnRpbWUocHJvZyk7CiAKIAllcnIgPSBhbm9uX2lub2RlX2dldGZkKCJicGYtcHJvZyIsICZicGZfcHJvZ19mb3BzLCBwcm9nLCBPX1JEV1IgfCBPX0NMT0VYRUMpOwotCiAJaWYgKGVyciA8IDApCiAJCS8qIGZhaWxlZCB0byBhbGxvY2F0ZSBmZCAqLwogCQlnb3RvIGZyZWVfdXNlZF9tYXBzOwpkaWZmIC0tZ2l0IGEva2VybmVsL2JwZi90ZXN0X3N0dWIuYyBiL2tlcm5lbC9icGYvdGVzdF9zdHViLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZWFlMWUuLjAwMDAwMDAKLS0tIGEva2VybmVsL2JwZi90ZXN0X3N0dWIuYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IFBMVU1ncmlkLCBodHRwOi8vcGx1bWdyaWQuY29tCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgotI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgotCi0vKiB0ZXN0IHN0dWJzIGZvciBCUEZfTUFQX1RZUEVfVU5TUEVDIGFuZCBmb3IgQlBGX1BST0dfVFlQRV9VTlNQRUMKLSAqIHRvIGJlIHVzZWQgYnkgdXNlciBzcGFjZSB2ZXJpZmllciB0ZXN0c3VpdGUKLSAqLwotc3RydWN0IGJwZl9jb250ZXh0IHsKLQl1NjQgYXJnMTsKLQl1NjQgYXJnMjsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gKnRlc3RfZnVuY19wcm90byhlbnVtIGJwZl9mdW5jX2lkIGZ1bmNfaWQpCi17Ci0Jc3dpdGNoIChmdW5jX2lkKSB7Ci0JY2FzZSBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW06Ci0JCXJldHVybiAmYnBmX21hcF9sb29rdXBfZWxlbV9wcm90bzsKLQljYXNlIEJQRl9GVU5DX21hcF91cGRhdGVfZWxlbToKLQkJcmV0dXJuICZicGZfbWFwX3VwZGF0ZV9lbGVtX3Byb3RvOwotCWNhc2UgQlBGX0ZVTkNfbWFwX2RlbGV0ZV9lbGVtOgotCQlyZXR1cm4gJmJwZl9tYXBfZGVsZXRlX2VsZW1fcHJvdG87Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9jb250ZXh0X2FjY2VzcyB7Ci0JaW50IHNpemU7Ci0JZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZTsKLX0gdGVzdF9jdHhfYWNjZXNzW10gPSB7Ci0JW29mZnNldG9mKHN0cnVjdCBicGZfY29udGV4dCwgYXJnMSldID0gewotCQlGSUVMRF9TSVpFT0Yoc3RydWN0IGJwZl9jb250ZXh0LCBhcmcxKSwKLQkJQlBGX1JFQUQKLQl9LAotCVtvZmZzZXRvZihzdHJ1Y3QgYnBmX2NvbnRleHQsIGFyZzIpXSA9IHsKLQkJRklFTERfU0laRU9GKHN0cnVjdCBicGZfY29udGV4dCwgYXJnMiksCi0JCUJQRl9SRUFECi0JfSwKLX07Ci0KLXN0YXRpYyBib29sIHRlc3RfaXNfdmFsaWRfYWNjZXNzKGludCBvZmYsIGludCBzaXplLCBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlKQotewotCWNvbnN0IHN0cnVjdCBicGZfY29udGV4dF9hY2Nlc3MgKmFjY2VzczsKLQotCWlmIChvZmYgPCAwIHx8IG9mZiA+PSBBUlJBWV9TSVpFKHRlc3RfY3R4X2FjY2VzcykpCi0JCXJldHVybiBmYWxzZTsKLQotCWFjY2VzcyA9ICZ0ZXN0X2N0eF9hY2Nlc3Nbb2ZmXTsKLQlpZiAoYWNjZXNzLT5zaXplID09IHNpemUgJiYgKGFjY2Vzcy0+dHlwZSAmIHR5cGUpKQotCQlyZXR1cm4gdHJ1ZTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIHRlc3Rfb3BzID0gewotCS5nZXRfZnVuY19wcm90byA9IHRlc3RfZnVuY19wcm90bywKLQkuaXNfdmFsaWRfYWNjZXNzID0gdGVzdF9pc192YWxpZF9hY2Nlc3MsCi19OwotCi1zdGF0aWMgc3RydWN0IGJwZl9wcm9nX3R5cGVfbGlzdCB0bF9wcm9nID0gewotCS5vcHMgPSAmdGVzdF9vcHMsCi0JLnR5cGUgPSBCUEZfUFJPR19UWVBFX1VOU1BFQywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX3Rlc3Rfb3BzKHZvaWQpCi17Ci0JYnBmX3JlZ2lzdGVyX3Byb2dfdHlwZSgmdGxfcHJvZyk7Ci0JcmV0dXJuIDA7Ci19Ci1sYXRlX2luaXRjYWxsKHJlZ2lzdGVyX3Rlc3Rfb3BzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9icGYvdmVyaWZpZXIuYyBiL2tlcm5lbC9icGYvdmVyaWZpZXIuYwppbmRleCBhMjhlMDljLi42MzBhN2JhIDEwMDY0NAotLS0gYS9rZXJuZWwvYnBmL3ZlcmlmaWVyLmMKKysrIGIva2VybmVsL2JwZi92ZXJpZmllci5jCkBAIC03NTUsNyArNzU1LDcgQEAKIAllbnVtIGJwZl9yZWdfdHlwZSBleHBlY3RlZF90eXBlOwogCWludCBlcnIgPSAwOwogCi0JaWYgKGFyZ190eXBlID09IEFSR19BTllUSElORykKKwlpZiAoYXJnX3R5cGUgPT0gQVJHX0RPTlRDQVJFKQogCQlyZXR1cm4gMDsKIAogCWlmIChyZWctPnR5cGUgPT0gTk9UX0lOSVQpIHsKQEAgLTc2Myw2ICs3NjMsOSBAQAogCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CiAKKwlpZiAoYXJnX3R5cGUgPT0gQVJHX0FOWVRISU5HKQorCQlyZXR1cm4gMDsKKwogCWlmIChhcmdfdHlwZSA9PSBBUkdfUFRSX1RPX1NUQUNLIHx8IGFyZ190eXBlID09IEFSR19QVFJfVE9fTUFQX0tFWSB8fAogCSAgICBhcmdfdHlwZSA9PSBBUkdfUFRSX1RPX01BUF9WQUxVRSkgewogCQlleHBlY3RlZF90eXBlID0gUFRSX1RPX1NUQUNLOwpAQCAtNzcwLDYgKzc3Myw4IEBACiAJCWV4cGVjdGVkX3R5cGUgPSBDT05TVF9JTU07CiAJfSBlbHNlIGlmIChhcmdfdHlwZSA9PSBBUkdfQ09OU1RfTUFQX1BUUikgewogCQlleHBlY3RlZF90eXBlID0gQ09OU1RfUFRSX1RPX01BUDsKKwl9IGVsc2UgaWYgKGFyZ190eXBlID09IEFSR19QVFJfVE9fQ1RYKSB7CisJCWV4cGVjdGVkX3R5cGUgPSBQVFJfVE9fQ1RYOwogCX0gZWxzZSB7CiAJCXZlcmJvc2UoInVuc3VwcG9ydGVkIGFyZ190eXBlICVkXG4iLCBhcmdfdHlwZSk7CiAJCXJldHVybiAtRUZBVUxUOwpAQCAtODUyLDcgKzg1Nyw3IEBACiAJfQogCiAJLyogZUJQRiBwcm9ncmFtcyBtdXN0IGJlIEdQTCBjb21wYXRpYmxlIHRvIHVzZSBHUEwtZWQgZnVuY3Rpb25zICovCi0JaWYgKCFlbnYtPnByb2ctPmF1eC0+aXNfZ3BsX2NvbXBhdGlibGUgJiYgZm4tPmdwbF9vbmx5KSB7CisJaWYgKCFlbnYtPnByb2ctPmdwbF9jb21wYXRpYmxlICYmIGZuLT5ncGxfb25seSkgewogCQl2ZXJib3NlKCJjYW5ub3QgY2FsbCBHUEwgb25seSBmdW5jdGlvbiBmcm9tIHByb3ByaWV0YXJ5IHByb2dyYW1cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMTcyLDYgKzExNzcsMTggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGJvb2wgbWF5X2FjY2Vzc19za2IoZW51bSBicGZfcHJvZ190eXBlIHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVI6CisJY2FzZSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUzoKKwljYXNlIEJQRl9QUk9HX1RZUEVfU0NIRURfQUNUOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCiAvKiB2ZXJpZnkgc2FmZXR5IG9mIExEX0FCU3xMRF9JTkQgaW5zdHJ1Y3Rpb25zOgogICogLSB0aGV5IGNhbiBvbmx5IGFwcGVhciBpbiB0aGUgcHJvZ3JhbXMgd2hlcmUgY3R4ID09IHNrYgogICogLSBzaW5jZSB0aGV5IGFyZSB3cmFwcGVycyBvZiBmdW5jdGlvbiBjYWxscywgdGhleSBzY3JhdGNoIFIxLVI1IHJlZ2lzdGVycywKQEAgLTExOTQsOCArMTIxMSw4IEBACiAJc3RydWN0IHJlZ19zdGF0ZSAqcmVnOwogCWludCBpLCBlcnI7CiAKLQlpZiAoZW52LT5wcm9nLT5hdXgtPnByb2dfdHlwZSAhPSBCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIpIHsKLQkJdmVyYm9zZSgiQlBGX0xEX0FCU3xJTkQgaW5zdHJ1Y3Rpb25zIGFyZSBvbmx5IGFsbG93ZWQgaW4gc29ja2V0IGZpbHRlcnNcbiIpOworCWlmICghbWF5X2FjY2Vzc19za2IoZW52LT5wcm9nLT50eXBlKSkgeworCQl2ZXJib3NlKCJCUEZfTERfQUJTfElORCBpbnN0cnVjdGlvbnMgbm90IGFsbG93ZWQgZm9yIHRoaXMgcHJvZ3JhbSB0eXBlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xNjA2LDExICsxNjIzLDEwIEBACiAJCQkJcmV0dXJuIGVycjsKIAogCQl9IGVsc2UgaWYgKGNsYXNzID09IEJQRl9MRFgpIHsKLQkJCWlmIChCUEZfTU9ERShpbnNuLT5jb2RlKSAhPSBCUEZfTUVNIHx8Ci0JCQkgICAgaW5zbi0+aW1tICE9IDApIHsKLQkJCQl2ZXJib3NlKCJCUEZfTERYIHVzZXMgcmVzZXJ2ZWQgZmllbGRzXG4iKTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KKwkJCWVudW0gYnBmX3JlZ190eXBlIHNyY19yZWdfdHlwZTsKKworCQkJLyogY2hlY2sgZm9yIHJlc2VydmVkIGZpZWxkcyBpcyBhbHJlYWR5IGRvbmUgKi8KKwogCQkJLyogY2hlY2sgc3JjIG9wZXJhbmQgKi8KIAkJCWVyciA9IGNoZWNrX3JlZ19hcmcocmVncywgaW5zbi0+c3JjX3JlZywgU1JDX09QKTsKIAkJCWlmIChlcnIpCkBAIC0xNjI5LDYgKzE2NDUsMjkgQEAKIAkJCWlmIChlcnIpCiAJCQkJcmV0dXJuIGVycjsKIAorCQkJc3JjX3JlZ190eXBlID0gcmVnc1tpbnNuLT5zcmNfcmVnXS50eXBlOworCisJCQlpZiAoaW5zbi0+aW1tID09IDAgJiYgQlBGX1NJWkUoaW5zbi0+Y29kZSkgPT0gQlBGX1cpIHsKKwkJCQkvKiBzYXcgYSB2YWxpZCBpbnNuCisJCQkJICogZHN0X3JlZyA9ICoodTMyICopKHNyY19yZWcgKyBvZmYpCisJCQkJICogdXNlIHJlc2VydmVkICdpbW0nIGZpZWxkIHRvIG1hcmsgdGhpcyBpbnNuCisJCQkJICovCisJCQkJaW5zbi0+aW1tID0gc3JjX3JlZ190eXBlOworCisJCQl9IGVsc2UgaWYgKHNyY19yZWdfdHlwZSAhPSBpbnNuLT5pbW0gJiYKKwkJCQkgICAoc3JjX3JlZ190eXBlID09IFBUUl9UT19DVFggfHwKKwkJCQkgICAgaW5zbi0+aW1tID09IFBUUl9UT19DVFgpKSB7CisJCQkJLyogQUJ1c2VyIHByb2dyYW0gaXMgdHJ5aW5nIHRvIHVzZSB0aGUgc2FtZSBpbnNuCisJCQkJICogZHN0X3JlZyA9ICoodTMyKikgKHNyY19yZWcgKyBvZmYpCisJCQkJICogd2l0aCBkaWZmZXJlbnQgcG9pbnRlciB0eXBlczoKKwkJCQkgKiBzcmNfcmVnID09IGN0eCBpbiBvbmUgYnJhbmNoIGFuZAorCQkJCSAqIHNyY19yZWcgPT0gc3RhY2t8bWFwIGluIHNvbWUgb3RoZXIgYnJhbmNoLgorCQkJCSAqIFJlamVjdCBpdC4KKwkJCQkgKi8KKwkJCQl2ZXJib3NlKCJzYW1lIGluc24gY2Fubm90IGJlIHVzZWQgd2l0aCBkaWZmZXJlbnQgcG9pbnRlcnNcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCiAJCX0gZWxzZSBpZiAoY2xhc3MgPT0gQlBGX1NUWCkgewogCQkJaWYgKEJQRl9NT0RFKGluc24tPmNvZGUpID09IEJQRl9YQUREKSB7CiAJCQkJZXJyID0gY2hlY2tfeGFkZChlbnYsIGluc24pOwpAQCAtMTc3Niw2ICsxODE1LDEzIEBACiAJaW50IGksIGo7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaW5zbl9jbnQ7IGkrKywgaW5zbisrKSB7CisJCWlmIChCUEZfQ0xBU1MoaW5zbi0+Y29kZSkgPT0gQlBGX0xEWCAmJgorCQkgICAgKEJQRl9NT0RFKGluc24tPmNvZGUpICE9IEJQRl9NRU0gfHwKKwkJICAgICBpbnNuLT5pbW0gIT0gMCkpIHsKKwkJCXZlcmJvc2UoIkJQRl9MRFggdXNlcyByZXNlcnZlZCBmaWVsZHNcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwogCQlpZiAoaW5zblswXS5jb2RlID09IChCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXKSkgewogCQkJc3RydWN0IGJwZl9tYXAgKm1hcDsKIAkJCXN0cnVjdCBmZCBmOwpAQCAtMTg2Nyw2ICsxOTEzLDkyIEBACiAJCQlpbnNuLT5zcmNfcmVnID0gMDsKIH0KIAorc3RhdGljIHZvaWQgYWRqdXN0X2JyYW5jaGVzKHN0cnVjdCBicGZfcHJvZyAqcHJvZywgaW50IHBvcywgaW50IGRlbHRhKQoreworCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9IHByb2ctPmluc25zaTsKKwlpbnQgaW5zbl9jbnQgPSBwcm9nLT5sZW47CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaW5zbl9jbnQ7IGkrKywgaW5zbisrKSB7CisJCWlmIChCUEZfQ0xBU1MoaW5zbi0+Y29kZSkgIT0gQlBGX0pNUCB8fAorCQkgICAgQlBGX09QKGluc24tPmNvZGUpID09IEJQRl9DQUxMIHx8CisJCSAgICBCUEZfT1AoaW5zbi0+Y29kZSkgPT0gQlBGX0VYSVQpCisJCQljb250aW51ZTsKKworCQkvKiBhZGp1c3Qgb2Zmc2V0IG9mIGptcHMgaWYgbmVjZXNzYXJ5ICovCisJCWlmIChpIDwgcG9zICYmIGkgKyBpbnNuLT5vZmYgKyAxID4gcG9zKQorCQkJaW5zbi0+b2ZmICs9IGRlbHRhOworCQllbHNlIGlmIChpID4gcG9zICYmIGkgKyBpbnNuLT5vZmYgKyAxIDwgcG9zKQorCQkJaW5zbi0+b2ZmIC09IGRlbHRhOworCX0KK30KKworLyogY29udmVydCBsb2FkIGluc3RydWN0aW9ucyB0aGF0IGFjY2VzcyBmaWVsZHMgb2YgJ3N0cnVjdCBfX3NrX2J1ZmYnCisgKiBpbnRvIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyB0aGF0IGFjY2VzcyBmaWVsZHMgb2YgJ3N0cnVjdCBza19idWZmJworICovCitzdGF0aWMgaW50IGNvbnZlcnRfY3R4X2FjY2Vzc2VzKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudikKK3sKKwlzdHJ1Y3QgYnBmX2luc24gKmluc24gPSBlbnYtPnByb2ctPmluc25zaTsKKwlpbnQgaW5zbl9jbnQgPSBlbnYtPnByb2ctPmxlbjsKKwlzdHJ1Y3QgYnBmX2luc24gaW5zbl9idWZbMTZdOworCXN0cnVjdCBicGZfcHJvZyAqbmV3X3Byb2c7CisJdTMyIGNudDsKKwlpbnQgaTsKKworCWlmICghZW52LT5wcm9nLT5hdXgtPm9wcy0+Y29udmVydF9jdHhfYWNjZXNzKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBpbnNuX2NudDsgaSsrLCBpbnNuKyspIHsKKwkJaWYgKGluc24tPmNvZGUgIT0gKEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX1cpKQorCQkJY29udGludWU7CisKKwkJaWYgKGluc24tPmltbSAhPSBQVFJfVE9fQ1RYKSB7CisJCQkvKiBjbGVhciBpbnRlcm5hbCBtYXJrICovCisJCQlpbnNuLT5pbW0gPSAwOworCQkJY29udGludWU7CisJCX0KKworCQljbnQgPSBlbnYtPnByb2ctPmF1eC0+b3BzLT4KKwkJCWNvbnZlcnRfY3R4X2FjY2VzcyhpbnNuLT5kc3RfcmVnLCBpbnNuLT5zcmNfcmVnLAorCQkJCQkgICBpbnNuLT5vZmYsIGluc25fYnVmKTsKKwkJaWYgKGNudCA9PSAwIHx8IGNudCA+PSBBUlJBWV9TSVpFKGluc25fYnVmKSkgeworCQkJdmVyYm9zZSgiYnBmIHZlcmlmaWVyIGlzIG1pc2NvbmZpZ3VyZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAoY250ID09IDEpIHsKKwkJCW1lbWNweShpbnNuLCBpbnNuX2J1Ziwgc2l6ZW9mKCppbnNuKSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIHNldmVyYWwgbmV3IGluc25zIG5lZWQgdG8gYmUgaW5zZXJ0ZWQuIE1ha2Ugcm9vbSBmb3IgdGhlbSAqLworCQlpbnNuX2NudCArPSBjbnQgLSAxOworCQluZXdfcHJvZyA9IGJwZl9wcm9nX3JlYWxsb2MoZW52LT5wcm9nLAorCQkJCQkgICAgYnBmX3Byb2dfc2l6ZShpbnNuX2NudCksCisJCQkJCSAgICBHRlBfVVNFUik7CisJCWlmICghbmV3X3Byb2cpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQluZXdfcHJvZy0+bGVuID0gaW5zbl9jbnQ7CisKKwkJbWVtbW92ZShuZXdfcHJvZy0+aW5zbnNpICsgaSArIGNudCwgbmV3X3Byb2ctPmluc25zICsgaSArIDEsCisJCQlzaXplb2YoKmluc24pICogKGluc25fY250IC0gaSAtIGNudCkpOworCisJCS8qIGNvcHkgc3Vic3RpdHV0ZSBpbnNucyBpbiBwbGFjZSBvZiBsb2FkIGluc3RydWN0aW9uICovCisJCW1lbWNweShuZXdfcHJvZy0+aW5zbnNpICsgaSwgaW5zbl9idWYsIHNpemVvZigqaW5zbikgKiBjbnQpOworCisJCS8qIGFkanVzdCBicmFuY2hlcyBpbiB0aGUgd2hvbGUgcHJvZ3JhbSAqLworCQlhZGp1c3RfYnJhbmNoZXMobmV3X3Byb2csIGksIGNudCAtIDEpOworCisJCS8qIGtlZXAgd2Fsa2luZyBuZXcgcHJvZ3JhbSBhbmQgc2tpcCBpbnNucyB3ZSBqdXN0IGluc2VydGVkICovCisJCWVudi0+cHJvZyA9IG5ld19wcm9nOworCQlpbnNuID0gbmV3X3Byb2ctPmluc25zaSArIGkgKyBjbnQgLSAxOworCQlpICs9IGNudCAtIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGZyZWVfc3RhdGVzKHN0cnVjdCB2ZXJpZmllcl9lbnYgKmVudikKIHsKIAlzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqc2wsICpzbG47CkBAIC0xODg5LDEzICsyMDIxLDEzIEBACiAJa2ZyZWUoZW52LT5leHBsb3JlZF9zdGF0ZXMpOwogfQogCi1pbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqcHJvZywgdW5pb24gYnBmX2F0dHIgKmF0dHIpCitpbnQgYnBmX2NoZWNrKHN0cnVjdCBicGZfcHJvZyAqKnByb2csIHVuaW9uIGJwZl9hdHRyICphdHRyKQogewogCWNoYXIgX191c2VyICpsb2dfdWJ1ZiA9IE5VTEw7CiAJc3RydWN0IHZlcmlmaWVyX2VudiAqZW52OwogCWludCByZXQgPSAtRUlOVkFMOwogCi0JaWYgKHByb2ctPmxlbiA8PSAwIHx8IHByb2ctPmxlbiA+IEJQRl9NQVhJTlNOUykKKwlpZiAoKCpwcm9nKS0+bGVuIDw9IDAgfHwgKCpwcm9nKS0+bGVuID4gQlBGX01BWElOU05TKQogCQlyZXR1cm4gLUUyQklHOwogCiAJLyogJ3N0cnVjdCB2ZXJpZmllcl9lbnYnIGNhbiBiZSBnbG9iYWwsIGJ1dCBzaW5jZSBpdCdzIG5vdCBzbWFsbCwKQEAgLTE5MDUsNyArMjAzNyw3IEBACiAJaWYgKCFlbnYpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZW52LT5wcm9nID0gcHJvZzsKKwllbnYtPnByb2cgPSAqcHJvZzsKIAogCS8qIGdyYWIgdGhlIG11dGV4IHRvIHByb3RlY3QgZmV3IGdsb2JhbHMgdXNlZCBieSB2ZXJpZmllciAqLwogCW11dGV4X2xvY2soJmJwZl92ZXJpZmllcl9sb2NrKTsKQEAgLTE5MzcsNyArMjA2OSw3IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gc2tpcF9mdWxsX2NoZWNrOwogCi0JZW52LT5leHBsb3JlZF9zdGF0ZXMgPSBrY2FsbG9jKHByb2ctPmxlbiwKKwllbnYtPmV4cGxvcmVkX3N0YXRlcyA9IGtjYWxsb2MoZW52LT5wcm9nLT5sZW4sCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgdmVyaWZpZXJfc3RhdGVfbGlzdCAqKSwKIAkJCQkgICAgICAgR0ZQX1VTRVIpOwogCXJldCA9IC1FTk9NRU07CkBAIC0xOTU0LDYgKzIwODYsMTAgQEAKIAl3aGlsZSAocG9wX3N0YWNrKGVudiwgTlVMTCkgPj0gMCk7CiAJZnJlZV9zdGF0ZXMoZW52KTsKIAorCWlmIChyZXQgPT0gMCkKKwkJLyogcHJvZ3JhbSBpcyB2YWxpZCwgY29udmVydCAqKHUzMiopKGN0eCArIG9mZikgYWNjZXNzZXMgKi8KKwkJcmV0ID0gY29udmVydF9jdHhfYWNjZXNzZXMoZW52KTsKKwogCWlmIChsb2dfbGV2ZWwgJiYgbG9nX2xlbiA+PSBsb2dfc2l6ZSAtIDEpIHsKIAkJQlVHX09OKGxvZ19sZW4gPj0gbG9nX3NpemUpOwogCQkvKiB2ZXJpZmllciBsb2cgZXhjZWVkZWQgdXNlciBzdXBwbGllZCBidWZmZXIgKi8KQEAgLTE5NjksMTggKzIxMDUsMTggQEAKIAogCWlmIChyZXQgPT0gMCAmJiBlbnYtPnVzZWRfbWFwX2NudCkgewogCQkvKiBpZiBwcm9ncmFtIHBhc3NlZCB2ZXJpZmllciwgdXBkYXRlIHVzZWRfbWFwcyBpbiBicGZfcHJvZ19pbmZvICovCi0JCXByb2ctPmF1eC0+dXNlZF9tYXBzID0ga21hbGxvY19hcnJheShlbnYtPnVzZWRfbWFwX2NudCwKLQkJCQkJCSAgICAgc2l6ZW9mKGVudi0+dXNlZF9tYXBzWzBdKSwKLQkJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJCWVudi0+cHJvZy0+YXV4LT51c2VkX21hcHMgPSBrbWFsbG9jX2FycmF5KGVudi0+dXNlZF9tYXBfY250LAorCQkJCQkJCSAgc2l6ZW9mKGVudi0+dXNlZF9tYXBzWzBdKSwKKwkJCQkJCQkgIEdGUF9LRVJORUwpOwogCi0JCWlmICghcHJvZy0+YXV4LT51c2VkX21hcHMpIHsKKwkJaWYgKCFlbnYtPnByb2ctPmF1eC0+dXNlZF9tYXBzKSB7CiAJCQlyZXQgPSAtRU5PTUVNOwogCQkJZ290byBmcmVlX2xvZ19idWY7CiAJCX0KIAotCQltZW1jcHkocHJvZy0+YXV4LT51c2VkX21hcHMsIGVudi0+dXNlZF9tYXBzLAorCQltZW1jcHkoZW52LT5wcm9nLT5hdXgtPnVzZWRfbWFwcywgZW52LT51c2VkX21hcHMsCiAJCSAgICAgICBzaXplb2YoZW52LT51c2VkX21hcHNbMF0pICogZW52LT51c2VkX21hcF9jbnQpOwotCQlwcm9nLT5hdXgtPnVzZWRfbWFwX2NudCA9IGVudi0+dXNlZF9tYXBfY250OworCQllbnYtPnByb2ctPmF1eC0+dXNlZF9tYXBfY250ID0gZW52LT51c2VkX21hcF9jbnQ7CiAKIAkJLyogcHJvZ3JhbSBpcyB2YWxpZC4gQ29udmVydCBwc2V1ZG8gYnBmX2xkX2ltbTY0IGludG8gZ2VuZXJpYwogCQkgKiBicGZfbGRfaW1tNjQgaW5zdHJ1Y3Rpb25zCkBAIC0xOTkyLDExICsyMTI4LDEyIEBACiAJaWYgKGxvZ19sZXZlbCkKIAkJdmZyZWUobG9nX2J1Zik7CiBmcmVlX2VudjoKLQlpZiAoIXByb2ctPmF1eC0+dXNlZF9tYXBzKQorCWlmICghZW52LT5wcm9nLT5hdXgtPnVzZWRfbWFwcykKIAkJLyogaWYgd2UgZGlkbid0IGNvcHkgbWFwIHBvaW50ZXJzIGludG8gYnBmX3Byb2dfaW5mbywgcmVsZWFzZQogCQkgKiB0aGVtIG5vdy4gT3RoZXJ3aXNlIGZyZWVfYnBmX3Byb2dfaW5mbygpIHdpbGwgcmVsZWFzZSB0aGVtLgogCQkgKi8KIAkJcmVsZWFzZV9tYXBzKGVudik7CisJKnByb2cgPSBlbnYtPnByb2c7CiAJa2ZyZWUoZW52KTsKIAltdXRleF91bmxvY2soJmJwZl92ZXJpZmllcl9sb2NrKTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEva2VybmVsL2NhcGFiaWxpdHkuYyBiL2tlcm5lbC9jYXBhYmlsaXR5LmMKaW5kZXggOTg5ZjViZi4uNDU0MzJiNSAxMDA2NDQKLS0tIGEva2VybmVsL2NhcGFiaWxpdHkuYworKysgYi9rZXJuZWwvY2FwYWJpbGl0eS5jCkBAIC0zNSw2ICszNSw3IEBACiB9CiBfX3NldHVwKCJub19maWxlX2NhcHMiLCBmaWxlX2NhcHNfZGlzYWJsZSk7CiAKKyNpZmRlZiBDT05GSUdfTVVMVElVU0VSCiAvKgogICogTW9yZSByZWNlbnQgdmVyc2lvbnMgb2YgbGliY2FwIGFyZSBhdmFpbGFibGUgZnJvbToKICAqCkBAIC0zODYsNiArMzg3LDI0IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5zX2NhcGFibGUpOwogCisKKy8qKgorICogY2FwYWJsZSAtIERldGVybWluZSBpZiB0aGUgY3VycmVudCB0YXNrIGhhcyBhIHN1cGVyaW9yIGNhcGFiaWxpdHkgaW4gZWZmZWN0CisgKiBAY2FwOiBUaGUgY2FwYWJpbGl0eSB0byBiZSB0ZXN0ZWQgZm9yCisgKgorICogUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgdGFzayBoYXMgdGhlIGdpdmVuIHN1cGVyaW9yIGNhcGFiaWxpdHkgY3VycmVudGx5CisgKiBhdmFpbGFibGUgZm9yIHVzZSwgZmFsc2UgaWYgbm90LgorICoKKyAqIFRoaXMgc2V0cyBQRl9TVVBFUlBSSVYgb24gdGhlIHRhc2sgaWYgdGhlIGNhcGFiaWxpdHkgaXMgYXZhaWxhYmxlIG9uIHRoZQorICogYXNzdW1wdGlvbiB0aGF0IGl0J3MgYWJvdXQgdG8gYmUgdXNlZC4KKyAqLworYm9vbCBjYXBhYmxlKGludCBjYXApCit7CisJcmV0dXJuIG5zX2NhcGFibGUoJmluaXRfdXNlcl9ucywgY2FwKTsKK30KK0VYUE9SVF9TWU1CT0woY2FwYWJsZSk7CisjZW5kaWYgLyogQ09ORklHX01VTFRJVVNFUiAqLworCiAvKioKICAqIGZpbGVfbnNfY2FwYWJsZSAtIERldGVybWluZSBpZiB0aGUgZmlsZSdzIG9wZW5lciBoYWQgYSBjYXBhYmlsaXR5IGluIGVmZmVjdAogICogQGZpbGU6ICBUaGUgZmlsZSB3ZSB3YW50IHRvIGNoZWNrCkBAIC00MTIsMjIgKzQzMSw2IEBACiBFWFBPUlRfU1lNQk9MKGZpbGVfbnNfY2FwYWJsZSk7CiAKIC8qKgotICogY2FwYWJsZSAtIERldGVybWluZSBpZiB0aGUgY3VycmVudCB0YXNrIGhhcyBhIHN1cGVyaW9yIGNhcGFiaWxpdHkgaW4gZWZmZWN0Ci0gKiBAY2FwOiBUaGUgY2FwYWJpbGl0eSB0byBiZSB0ZXN0ZWQgZm9yCi0gKgotICogUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgdGFzayBoYXMgdGhlIGdpdmVuIHN1cGVyaW9yIGNhcGFiaWxpdHkgY3VycmVudGx5Ci0gKiBhdmFpbGFibGUgZm9yIHVzZSwgZmFsc2UgaWYgbm90LgotICoKLSAqIFRoaXMgc2V0cyBQRl9TVVBFUlBSSVYgb24gdGhlIHRhc2sgaWYgdGhlIGNhcGFiaWxpdHkgaXMgYXZhaWxhYmxlIG9uIHRoZQotICogYXNzdW1wdGlvbiB0aGF0IGl0J3MgYWJvdXQgdG8gYmUgdXNlZC4KLSAqLwotYm9vbCBjYXBhYmxlKGludCBjYXApCi17Ci0JcmV0dXJuIG5zX2NhcGFibGUoJmluaXRfdXNlcl9ucywgY2FwKTsKLX0KLUVYUE9SVF9TWU1CT0woY2FwYWJsZSk7Ci0KLS8qKgogICogY2FwYWJsZV93cnRfaW5vZGVfdWlkZ2lkIC0gQ2hlY2sgbnNvd25fY2FwYWJsZSBhbmQgdWlkIGFuZCBnaWQgbWFwcGVkCiAgKiBAaW5vZGU6IFRoZSBpbm9kZSBpbiBxdWVzdGlvbgogICogQGNhcDogVGhlIGNhcGFiaWxpdHkgaW4gcXVlc3Rpb24KZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAuYyBiL2tlcm5lbC9jZ3JvdXAuYwppbmRleCAyOWE3YjJjLi40NjlkZDU0IDEwMDY0NAotLS0gYS9rZXJuZWwvY2dyb3VwLmMKKysrIGIva2VybmVsL2Nncm91cC5jCkBAIC0zODA2LDEwICszODA2LDcgQEAKIAogc3RhdGljIHZvaWQgcGlkbGlzdF9mcmVlKHZvaWQgKnApCiB7Ci0JaWYgKGlzX3ZtYWxsb2NfYWRkcihwKSkKLQkJdmZyZWUocCk7Ci0JZWxzZQotCQlrZnJlZShwKTsKKwlrdmZyZWUocCk7CiB9CiAKIC8qCkBAIC00MTk5LDcgKzQxOTYsOSBAQAogCiBzdGF0aWMgaW50IGNncm91cF9waWRsaXN0X3Nob3coc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICp2KQogewotCXJldHVybiBzZXFfcHJpbnRmKHMsICIlZFxuIiwgKihpbnQgKil2KTsKKwlzZXFfcHJpbnRmKHMsICIlZFxuIiwgKihpbnQgKil2KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdTY0IGNncm91cF9yZWFkX25vdGlmeV9vbl9yZWxlYXNlKHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MsCkBAIC01MDQwLDYgKzUwMzksOSBAQAogCQkJV0FSTl9PTihjZ3JvdXBfYWRkX2RmbF9jZnR5cGVzKHNzLCBzcy0+ZGZsX2NmdHlwZXMpKTsKIAkJCVdBUk5fT04oY2dyb3VwX2FkZF9sZWdhY3lfY2Z0eXBlcyhzcywgc3MtPmxlZ2FjeV9jZnR5cGVzKSk7CiAJCX0KKworCQlpZiAoc3MtPmJpbmQpCisJCQlzcy0+YmluZChpbml0X2Nzc19zZXQuc3Vic3lzW3NzaWRdKTsKIAl9CiAKIAljZ3JvdXBfa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImNncm91cCIsIGZzX2tvYmopOwpAQCAtNTQ1MSw3ICs1NDUzLDcgQEAKIHN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3NfZnJvbV9pZChpbnQgaWQsIHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcykKIHsKIAlXQVJOX09OX09OQ0UoIXJjdV9yZWFkX2xvY2tfaGVsZCgpKTsKLQlyZXR1cm4gaWRyX2ZpbmQoJnNzLT5jc3NfaWRyLCBpZCk7CisJcmV0dXJuIGlkID4gMCA/IGlkcl9maW5kKCZzcy0+Y3NzX2lkciwgaWQpIDogTlVMTDsKIH0KIAogI2lmZGVmIENPTkZJR19DR1JPVVBfREVCVUcKZGlmZiAtLWdpdCBhL2tlcm5lbC9jb250ZXh0X3RyYWNraW5nLmMgYi9rZXJuZWwvY29udGV4dF90cmFja2luZy5jCmluZGV4IDkzN2VjZGYuLjcyZDU5YTEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb250ZXh0X3RyYWNraW5nLmMKKysrIGIva2VybmVsL2NvbnRleHRfdHJhY2tpbmcuYwpAQCAtMzksMTUgKzM5LDE1IEBACiB9CiAKIC8qKgotICogY29udGV4dF90cmFja2luZ191c2VyX2VudGVyIC0gSW5mb3JtIHRoZSBjb250ZXh0IHRyYWNraW5nIHRoYXQgdGhlIENQVSBpcyBnb2luZyB0bwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50ZXIgdXNlcnNwYWNlIG1vZGUuCisgKiBjb250ZXh0X3RyYWNraW5nX2VudGVyIC0gSW5mb3JtIHRoZSBjb250ZXh0IHRyYWNraW5nIHRoYXQgdGhlIENQVSBpcyBnb2luZworICogICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyIHVzZXIgb3IgZ3Vlc3Qgc3BhY2UgbW9kZS4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHJpZ2h0IGJlZm9yZSB3ZSBzd2l0Y2ggZnJvbSB0aGUga2VybmVsCi0gKiB0byB1c2Vyc3BhY2UsIHdoZW4gaXQncyBndWFyYW50ZWVkIHRoZSByZW1haW5pbmcga2VybmVsIGluc3RydWN0aW9ucwotICogdG8gZXhlY3V0ZSB3b24ndCB1c2UgYW55IFJDVSByZWFkIHNpZGUgY3JpdGljYWwgc2VjdGlvbiBiZWNhdXNlIHRoaXMKLSAqIGZ1bmN0aW9uIHNldHMgUkNVIGluIGV4dGVuZGVkIHF1aWVzY2VudCBzdGF0ZS4KKyAqIHRvIHVzZXIgb3IgZ3Vlc3Qgc3BhY2UsIHdoZW4gaXQncyBndWFyYW50ZWVkIHRoZSByZW1haW5pbmcga2VybmVsCisgKiBpbnN0cnVjdGlvbnMgdG8gZXhlY3V0ZSB3b24ndCB1c2UgYW55IFJDVSByZWFkIHNpZGUgY3JpdGljYWwgc2VjdGlvbgorICogYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIHNldHMgUkNVIGluIGV4dGVuZGVkIHF1aWVzY2VudCBzdGF0ZS4KICAqLwotdm9pZCBjb250ZXh0X3RyYWNraW5nX3VzZXJfZW50ZXIodm9pZCkKK3ZvaWQgY29udGV4dF90cmFja2luZ19lbnRlcihlbnVtIGN0eF9zdGF0ZSBzdGF0ZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCkBAIC03NSw5ICs3NSw4IEBACiAJV0FSTl9PTl9PTkNFKCFjdXJyZW50LT5tbSk7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JaWYgKCBfX3RoaXNfY3B1X3JlYWQoY29udGV4dF90cmFja2luZy5zdGF0ZSkgIT0gSU5fVVNFUikgeworCWlmICggX190aGlzX2NwdV9yZWFkKGNvbnRleHRfdHJhY2tpbmcuc3RhdGUpICE9IHN0YXRlKSB7CiAJCWlmIChfX3RoaXNfY3B1X3JlYWQoY29udGV4dF90cmFja2luZy5hY3RpdmUpKSB7Ci0JCQl0cmFjZV91c2VyX2VudGVyKDApOwogCQkJLyoKIAkJCSAqIEF0IHRoaXMgc3RhZ2UsIG9ubHkgbG93IGxldmVsIGFyY2ggZW50cnkgY29kZSByZW1haW5zIGFuZAogCQkJICogdGhlbiB3ZSdsbCBydW4gaW4gdXNlcnNwYWNlLiBXZSBjYW4gYXNzdW1lIHRoZXJlIHdvbid0IGJlCkBAIC04NSw3ICs4NCwxMCBAQAogCQkJICogdXNlcl9leGl0KCkgb3IgcmN1X2lycV9lbnRlcigpLiBMZXQncyByZW1vdmUgUkNVJ3MgZGVwZW5kZW5jeQogCQkJICogb24gdGhlIHRpY2suCiAJCQkgKi8KLQkJCXZ0aW1lX3VzZXJfZW50ZXIoY3VycmVudCk7CisJCQlpZiAoc3RhdGUgPT0gQ09OVEVYVF9VU0VSKSB7CisJCQkJdHJhY2VfdXNlcl9lbnRlcigwKTsKKwkJCQl2dGltZV91c2VyX2VudGVyKGN1cnJlbnQpOworCQkJfQogCQkJcmN1X3VzZXJfZW50ZXIoKTsKIAkJfQogCQkvKgpAQCAtMTAxLDI0ICsxMDMsMzIgQEAKIAkJICogT1RPSCB3ZSBjYW4gc3BhcmUgdGhlIGNhbGxzIHRvIHZ0aW1lIGFuZCBSQ1Ugd2hlbiBjb250ZXh0X3RyYWNraW5nLmFjdGl2ZQogCQkgKiBpcyBmYWxzZSBiZWNhdXNlIHdlIGtub3cgdGhhdCBDUFUgaXMgbm90IHRpY2tsZXNzLgogCQkgKi8KLQkJX190aGlzX2NwdV93cml0ZShjb250ZXh0X3RyYWNraW5nLnN0YXRlLCBJTl9VU0VSKTsKKwkJX190aGlzX2NwdV93cml0ZShjb250ZXh0X3RyYWNraW5nLnN0YXRlLCBzdGF0ZSk7CiAJfQogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KK05PS1BST0JFX1NZTUJPTChjb250ZXh0X3RyYWNraW5nX2VudGVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNvbnRleHRfdHJhY2tpbmdfZW50ZXIpOworCit2b2lkIGNvbnRleHRfdHJhY2tpbmdfdXNlcl9lbnRlcih2b2lkKQoreworCWNvbnRleHRfdHJhY2tpbmdfZW50ZXIoQ09OVEVYVF9VU0VSKTsKK30KIE5PS1BST0JFX1NZTUJPTChjb250ZXh0X3RyYWNraW5nX3VzZXJfZW50ZXIpOwogCiAvKioKLSAqIGNvbnRleHRfdHJhY2tpbmdfdXNlcl9leGl0IC0gSW5mb3JtIHRoZSBjb250ZXh0IHRyYWNraW5nIHRoYXQgdGhlIENQVSBpcwotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0aW5nIHVzZXJzcGFjZSBtb2RlIGFuZCBlbnRlcmluZyB0aGUga2VybmVsLgorICogY29udGV4dF90cmFja2luZ19leGl0IC0gSW5mb3JtIHRoZSBjb250ZXh0IHRyYWNraW5nIHRoYXQgdGhlIENQVSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgZXhpdGluZyB1c2VyIG9yIGd1ZXN0IG1vZGUgYW5kIGVudGVyaW5nIHRoZSBrZXJuZWwuCiAgKgotICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciB3ZSBlbnRlcmVkIHRoZSBrZXJuZWwgZnJvbSB1c2Vyc3BhY2UKLSAqIGJlZm9yZSBhbnkgdXNlIG9mIFJDVSByZWFkIHNpZGUgY3JpdGljYWwgc2VjdGlvbi4gVGhpcyBwb3RlbnRpYWxseSBpbmNsdWRlCi0gKiBhbnkgaGlnaCBsZXZlbCBrZXJuZWwgY29kZSBsaWtlIHN5c2NhbGxzLCBleGNlcHRpb25zLCBzaWduYWwgaGFuZGxpbmcsIGV0Yy4uLgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciB3ZSBlbnRlcmVkIHRoZSBrZXJuZWwgZnJvbSB1c2VyIG9yCisgKiBndWVzdCBzcGFjZSBiZWZvcmUgYW55IHVzZSBvZiBSQ1UgcmVhZCBzaWRlIGNyaXRpY2FsIHNlY3Rpb24uIFRoaXMKKyAqIHBvdGVudGlhbGx5IGluY2x1ZGUgYW55IGhpZ2ggbGV2ZWwga2VybmVsIGNvZGUgbGlrZSBzeXNjYWxscywgZXhjZXB0aW9ucywKKyAqIHNpZ25hbCBoYW5kbGluZywgZXRjLi4uCiAgKgogICogVGhpcyBjYWxsIHN1cHBvcnRzIHJlLWVudHJhbmN5LiBUaGlzIHdheSBpdCBjYW4gYmUgY2FsbGVkIGZyb20gYW55IGV4Y2VwdGlvbgogICogaGFuZGxlciB3aXRob3V0IG5lZWRpbmcgdG8ga25vdyBpZiB3ZSBjYW1lIGZyb20gdXNlcnNwYWNlIG9yIG5vdC4KICAqLwotdm9pZCBjb250ZXh0X3RyYWNraW5nX3VzZXJfZXhpdCh2b2lkKQordm9pZCBjb250ZXh0X3RyYWNraW5nX2V4aXQoZW51bSBjdHhfc3RhdGUgc3RhdGUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTI5LDIwICsxMzksMjkgQEAKIAkJcmV0dXJuOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmIChfX3RoaXNfY3B1X3JlYWQoY29udGV4dF90cmFja2luZy5zdGF0ZSkgPT0gSU5fVVNFUikgeworCWlmIChfX3RoaXNfY3B1X3JlYWQoY29udGV4dF90cmFja2luZy5zdGF0ZSkgPT0gc3RhdGUpIHsKIAkJaWYgKF9fdGhpc19jcHVfcmVhZChjb250ZXh0X3RyYWNraW5nLmFjdGl2ZSkpIHsKIAkJCS8qCiAJCQkgKiBXZSBhcmUgZ29pbmcgdG8gcnVuIGNvZGUgdGhhdCBtYXkgdXNlIFJDVS4gSW5mb3JtCiAJCQkgKiBSQ1UgY29yZSBhYm91dCB0aGF0IChpZTogd2UgbWF5IG5lZWQgdGhlIHRpY2sgYWdhaW4pLgogCQkJICovCiAJCQlyY3VfdXNlcl9leGl0KCk7Ci0JCQl2dGltZV91c2VyX2V4aXQoY3VycmVudCk7Ci0JCQl0cmFjZV91c2VyX2V4aXQoMCk7CisJCQlpZiAoc3RhdGUgPT0gQ09OVEVYVF9VU0VSKSB7CisJCQkJdnRpbWVfdXNlcl9leGl0KGN1cnJlbnQpOworCQkJCXRyYWNlX3VzZXJfZXhpdCgwKTsKKwkJCX0KIAkJfQotCQlfX3RoaXNfY3B1X3dyaXRlKGNvbnRleHRfdHJhY2tpbmcuc3RhdGUsIElOX0tFUk5FTCk7CisJCV9fdGhpc19jcHVfd3JpdGUoY29udGV4dF90cmFja2luZy5zdGF0ZSwgQ09OVEVYVF9LRVJORUwpOwogCX0KIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CitOT0tQUk9CRV9TWU1CT0woY29udGV4dF90cmFja2luZ19leGl0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNvbnRleHRfdHJhY2tpbmdfZXhpdCk7CisKK3ZvaWQgY29udGV4dF90cmFja2luZ191c2VyX2V4aXQodm9pZCkKK3sKKwljb250ZXh0X3RyYWNraW5nX2V4aXQoQ09OVEVYVF9VU0VSKTsKK30KIE5PS1BST0JFX1NZTUJPTChjb250ZXh0X3RyYWNraW5nX3VzZXJfZXhpdCk7CiAKIC8qKgpkaWZmIC0tZ2l0IGEva2VybmVsL2NwdS5jIGIva2VybmVsL2NwdS5jCmluZGV4IDE5NzJiMTYuLjk0YmJlNDYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jcHUuYworKysgYi9rZXJuZWwvY3B1LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMvcG93ZXIuaD4KIAogI2luY2x1ZGUgInNtcGJvb3QuaCIKQEAgLTMzOCw2ICszMzksOCBAQAogCQlyZXR1cm4gZXJyOwogCiAJY3B1X25vdGlmeShDUFVfRFlJTkcgfCBwYXJhbS0+bW9kLCBwYXJhbS0+aGNwdSk7CisJLyogR2l2ZSB1cCB0aW1la2VlcGluZyBkdXRpZXMgKi8KKwl0aWNrX2hhbmRvdmVyX2RvX3RpbWVyKCk7CiAJLyogUGFyayB0aGUgc3RvcHBlciB0aHJlYWQgKi8KIAlrdGhyZWFkX3BhcmsoY3VycmVudCk7CiAJcmV0dXJuIDA7CkBAIC00MDgsMTMgKzQxMSwxNyBAQAogCSAqCiAJICogV2FpdCBmb3IgdGhlIHN0b3AgdGhyZWFkIHRvIGdvIGF3YXkuCiAJICovCi0Jd2hpbGUgKCFpZGxlX2NwdShjcHUpKQorCXdoaWxlICghcGVyX2NwdShjcHVfZGVhZF9pZGxlLCBjcHUpKQogCQljcHVfcmVsYXgoKTsKKwlzbXBfbWIoKTsgLyogUmVhZCBmcm9tIGNwdV9kZWFkX2lkbGUgYmVmb3JlIF9fY3B1X2RpZSgpLiAqLworCXBlcl9jcHUoY3B1X2RlYWRfaWRsZSwgY3B1KSA9IGZhbHNlOwogCisJaG90cGx1Z19jcHVfX2Jyb2FkY2FzdF90aWNrX3B1bGwoY3B1KTsKIAkvKiBUaGlzIGFjdHVhbGx5IGtpbGxzIHRoZSBDUFUuICovCiAJX19jcHVfZGllKGNwdSk7CiAKIAkvKiBDUFUgaXMgY29tcGxldGVseSBkZWFkOiB0ZWxsIGV2ZXJ5b25lLiAgVG9vIGxhdGUgdG8gY29tcGxhaW4uICovCisJdGlja19jbGVhbnVwX2RlYWRfY3B1KGNwdSk7CiAJY3B1X25vdGlmeV9ub2ZhaWwoQ1BVX0RFQUQgfCBtb2QsIGhjcHUpOwogCiAJY2hlY2tfZm9yX3Rhc2tzKGNwdSk7CkBAIC00NDYsNiArNDUzLDM3IEBACiBFWFBPUlRfU1lNQk9MKGNwdV9kb3duKTsKICNlbmRpZiAvKkNPTkZJR19IT1RQTFVHX0NQVSovCiAKKy8qCisgKiBVbnBhcmsgcGVyLUNQVSBzbXBib290IGt0aHJlYWRzIGF0IENQVS1vbmxpbmUgdGltZS4KKyAqLworc3RhdGljIGludCBzbXBib290X3RocmVhZF9jYWxsKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCWludCBjcHUgPSAobG9uZyloY3B1OworCisJc3dpdGNoIChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgeworCisJY2FzZSBDUFVfT05MSU5FOgorCQlzbXBib290X3VucGFya190aHJlYWRzKGNwdSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBzbXBib290X3RocmVhZF9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHNtcGJvb3RfdGhyZWFkX2NhbGwsCisJLnByaW9yaXR5ID0gQ1BVX1BSSV9TTVBCT09ULAorfTsKKwordm9pZCBfX2NwdWluaXQgc21wYm9vdF90aHJlYWRfaW5pdCh2b2lkKQoreworCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmc21wYm9vdF90aHJlYWRfbm90aWZpZXIpOworfQorCiAvKiBSZXF1aXJlcyBjcHVfYWRkX3JlbW92ZV9sb2NrIHRvIGJlIGhlbGQgKi8KIHN0YXRpYyBpbnQgX2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgdGFza3NfZnJvemVuKQogewpAQCAtNDg1LDkgKzUyMyw2IEBACiAJCWdvdG8gb3V0X25vdGlmeTsKIAlCVUdfT04oIWNwdV9vbmxpbmUoY3B1KSk7CiAKLQkvKiBXYWtlIHRoZSBwZXIgY3B1IHRocmVhZHMgKi8KLQlzbXBib290X3VucGFya190aHJlYWRzKGNwdSk7Ci0KIAkvKiBOb3cgY2FsbCBub3RpZmllciBpbiBwcmVwYXJhdGlvbi4gKi8KIAljcHVfbm90aWZ5KENQVV9PTkxJTkUgfCBtb2QsIGhjcHUpOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvY3B1c2V0LmMgYi9rZXJuZWwvY3B1c2V0LmMKaW5kZXggZmM3ZjQ3NC4uZWUxNGUzYSAxMDA2NDQKLS0tIGEva2VybmVsL2NwdXNldC5jCisrKyBiL2tlcm5lbC9jcHVzZXQuYwpAQCAtNjIyLDYgKzYyMiw3IEBACiAJaW50IGNzbjsJCS8qIGhvdyBtYW55IGNwdXNldCBwdHJzIGluIGNzYSBzbyBmYXIgKi8KIAlpbnQgaSwgaiwgazsJCS8qIGluZGljZXMgZm9yIHBhcnRpdGlvbiBmaW5kaW5nIGxvb3BzICovCiAJY3B1bWFza192YXJfdCAqZG9tczsJLyogcmVzdWx0aW5nIHBhcnRpdGlvbjsgaS5lLiBzY2hlZCBkb21haW5zICovCisJY3B1bWFza192YXJfdCBub25faXNvbGF0ZWRfY3B1czsgIC8qIGxvYWQgYmFsYW5jZWQgQ1BVcyAqLwogCXN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqZGF0dHI7ICAvKiBhdHRyaWJ1dGVzIGZvciBjdXN0b20gZG9tYWlucyAqLwogCWludCBuZG9tcyA9IDA7CQkvKiBudW1iZXIgb2Ygc2NoZWQgZG9tYWlucyBpbiByZXN1bHQgKi8KIAlpbnQgbnNsb3Q7CQkvKiBuZXh0IGVtcHR5IGRvbXNbXSBzdHJ1Y3QgY3B1bWFzayBzbG90ICovCkBAIC02MzEsNiArNjMyLDEwIEBACiAJZGF0dHIgPSBOVUxMOwogCWNzYSA9IE5VTEw7CiAKKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZub25faXNvbGF0ZWRfY3B1cywgR0ZQX0tFUk5FTCkpCisJCWdvdG8gZG9uZTsKKwljcHVtYXNrX2FuZG5vdChub25faXNvbGF0ZWRfY3B1cywgY3B1X3Bvc3NpYmxlX21hc2ssIGNwdV9pc29sYXRlZF9tYXApOworCiAJLyogU3BlY2lhbCBjYXNlIGZvciB0aGUgOTklIG9mIHN5c3RlbXMgd2l0aCBvbmUsIGZ1bGwsIHNjaGVkIGRvbWFpbiAqLwogCWlmIChpc19zY2hlZF9sb2FkX2JhbGFuY2UoJnRvcF9jcHVzZXQpKSB7CiAJCW5kb21zID0gMTsKQEAgLTY0Myw3ICs2NDgsOCBAQAogCQkJKmRhdHRyID0gU0RfQVRUUl9JTklUOwogCQkJdXBkYXRlX2RvbWFpbl9hdHRyX3RyZWUoZGF0dHIsICZ0b3BfY3B1c2V0KTsKIAkJfQotCQljcHVtYXNrX2NvcHkoZG9tc1swXSwgdG9wX2NwdXNldC5lZmZlY3RpdmVfY3B1cyk7CisJCWNwdW1hc2tfYW5kKGRvbXNbMF0sIHRvcF9jcHVzZXQuZWZmZWN0aXZlX2NwdXMsCisJCQkJICAgICBub25faXNvbGF0ZWRfY3B1cyk7CiAKIAkJZ290byBkb25lOwogCX0KQEAgLTY2Niw3ICs2NzIsOCBAQAogCQkgKiB0aGUgY29ycmVzcG9uZGluZyBzY2hlZCBkb21haW4uCiAJCSAqLwogCQlpZiAoIWNwdW1hc2tfZW1wdHkoY3AtPmNwdXNfYWxsb3dlZCkgJiYKLQkJICAgICFpc19zY2hlZF9sb2FkX2JhbGFuY2UoY3ApKQorCQkgICAgIShpc19zY2hlZF9sb2FkX2JhbGFuY2UoY3ApICYmCisJCSAgICAgIGNwdW1hc2tfaW50ZXJzZWN0cyhjcC0+Y3B1c19hbGxvd2VkLCBub25faXNvbGF0ZWRfY3B1cykpKQogCQkJY29udGludWU7CiAKIAkJaWYgKGlzX3NjaGVkX2xvYWRfYmFsYW5jZShjcCkpCkBAIC03NDgsNiArNzU1LDcgQEAKIAogCQkJaWYgKGFwbiA9PSBiLT5wbikgewogCQkJCWNwdW1hc2tfb3IoZHAsIGRwLCBiLT5lZmZlY3RpdmVfY3B1cyk7CisJCQkJY3B1bWFza19hbmQoZHAsIGRwLCBub25faXNvbGF0ZWRfY3B1cyk7CiAJCQkJaWYgKGRhdHRyKQogCQkJCQl1cGRhdGVfZG9tYWluX2F0dHJfdHJlZShkYXR0ciArIG5zbG90LCBiKTsKIApAQCAtNzYwLDYgKzc2OCw3IEBACiAJQlVHX09OKG5zbG90ICE9IG5kb21zKTsKIAogZG9uZToKKwlmcmVlX2NwdW1hc2tfdmFyKG5vbl9pc29sYXRlZF9jcHVzKTsKIAlrZnJlZShjc2EpOwogCiAJLyoKQEAgLTI0NDQsMjAgKzI0NTMsMTIgQEAKICAqIEBub2RlOiBpcyB0aGlzIGFuIGFsbG93ZWQgbm9kZT8KICAqIEBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKICAqCi0gKiBJZiB3ZSdyZSBpbiBpbnRlcnJ1cHQsIHllcywgd2UgY2FuIGFsd2F5cyBhbGxvY2F0ZS4gIElmIF9fR0ZQX1RISVNOT0RFIGlzCi0gKiBzZXQsIHllcywgd2UgY2FuIGFsd2F5cyBhbGxvY2F0ZS4gIElmIG5vZGUgaXMgaW4gb3VyIHRhc2sncyBtZW1zX2FsbG93ZWQsCi0gKiB5ZXMuICBJZiBpdCdzIG5vdCBhIF9fR0ZQX0hBUkRXQUxMIHJlcXVlc3QgYW5kIHRoaXMgbm9kZSBpcyBpbiB0aGUgbmVhcmVzdAotICogaGFyZHdhbGxlZCBjcHVzZXQgYW5jZXN0b3IgdG8gdGhpcyB0YXNrJ3MgY3B1c2V0LCB5ZXMuICBJZiB0aGUgdGFzayBoYXMgYmVlbgotICogT09NIGtpbGxlZCBhbmQgaGFzIGFjY2VzcyB0byBtZW1vcnkgcmVzZXJ2ZXMgYXMgc3BlY2lmaWVkIGJ5IHRoZSBUSUZfTUVNRElFCi0gKiBmbGFnLCB5ZXMuCisgKiBJZiB3ZSdyZSBpbiBpbnRlcnJ1cHQsIHllcywgd2UgY2FuIGFsd2F5cyBhbGxvY2F0ZS4gIElmIEBub2RlIGlzIHNldCBpbgorICogY3VycmVudCdzIG1lbXNfYWxsb3dlZCwgeWVzLiAgSWYgaXQncyBub3QgYSBfX0dGUF9IQVJEV0FMTCByZXF1ZXN0IGFuZCB0aGlzCisgKiBub2RlIGlzIHNldCBpbiB0aGUgbmVhcmVzdCBoYXJkd2FsbGVkIGNwdXNldCBhbmNlc3RvciB0byBjdXJyZW50J3MgY3B1c2V0LAorICogeWVzLiAgSWYgY3VycmVudCBoYXMgYWNjZXNzIHRvIG1lbW9yeSByZXNlcnZlcyBkdWUgdG8gVElGX01FTURJRSwgeWVzLgogICogT3RoZXJ3aXNlLCBuby4KICAqCi0gKiBUaGUgX19HRlBfVEhJU05PREUgcGxhY2VtZW50IGxvZ2ljIGlzIHJlYWxseSBoYW5kbGVkIGVsc2V3aGVyZSwKLSAqIGJ5IGZvcmNpYmx5IHVzaW5nIGEgem9uZWxpc3Qgc3RhcnRpbmcgYXQgYSBzcGVjaWZpZWQgbm9kZSwgYW5kIGJ5Ci0gKiAoaW4gZ2V0X3BhZ2VfZnJvbV9mcmVlbGlzdCgpKSByZWZ1c2luZyB0byBjb25zaWRlciB0aGUgem9uZXMgZm9yCi0gKiBhbnkgbm9kZSBvbiB0aGUgem9uZWxpc3QgZXhjZXB0IHRoZSBmaXJzdC4gIEJ5IHRoZSB0aW1lIGFueSBzdWNoCi0gKiBjYWxscyBnZXQgdG8gdGhpcyByb3V0aW5lLCB3ZSBzaG91bGQganVzdCBzaHV0IHVwIGFuZCBzYXkgJ3llcycuCi0gKgogICogR0ZQX1VTRVIgYWxsb2NhdGlvbnMgYXJlIG1hcmtlZCB3aXRoIHRoZSBfX0dGUF9IQVJEV0FMTCBiaXQsCiAgKiBhbmQgZG8gbm90IGFsbG93IGFsbG9jYXRpb25zIG91dHNpZGUgdGhlIGN1cnJlbnQgdGFza3MgY3B1c2V0CiAgKiB1bmxlc3MgdGhlIHRhc2sgaGFzIGJlZW4gT09NIGtpbGxlZCBhcyBpcyBtYXJrZWQgVElGX01FTURJRS4KQEAgLTI0OTMsNyArMjQ5NCw3IEBACiAJaW50IGFsbG93ZWQ7CQkJLyogaXMgYWxsb2NhdGlvbiBpbiB6b25lIHogYWxsb3dlZD8gKi8KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKGluX2ludGVycnVwdCgpIHx8IChnZnBfbWFzayAmIF9fR0ZQX1RISVNOT0RFKSkKKwlpZiAoaW5faW50ZXJydXB0KCkpCiAJCXJldHVybiAxOwogCWlmIChub2RlX2lzc2V0KG5vZGUsIGN1cnJlbnQtPm1lbXNfYWxsb3dlZCkpCiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEva2VybmVsL2NyZWQuYyBiL2tlcm5lbC9jcmVkLmMKaW5kZXggZTA1NzNhNC4uZWMxYzA3NiAxMDA2NDQKLS0tIGEva2VybmVsL2NyZWQuYworKysgYi9rZXJuZWwvY3JlZC5jCkBAIC0yOSw2ICsyOSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY3JlZF9qYXI7CiAKKy8qIGluaXQgdG8gMiAtIG9uZSBmb3IgaW5pdF90YXNrLCBvbmUgdG8gZW5zdXJlIGl0IGlzIG5ldmVyIGZyZWVkICovCitzdHJ1Y3QgZ3JvdXBfaW5mbyBpbml0X2dyb3VwcyA9IHsgLnVzYWdlID0gQVRPTUlDX0lOSVQoMikgfTsKKwogLyoKICAqIFRoZSBpbml0aWFsIGNyZWRlbnRpYWxzIGZvciB0aGUgaW5pdGlhbCB0YXNrCiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvY29yZS5jIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKaW5kZXggZjA0ZGFhYi4uODFhYTNhNCAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9jb3JlLmMKKysrIGIva2VybmVsL2V2ZW50cy9jb3JlLmMKQEAgLTM0LDE0ICszNCwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvYW5vbl9pbm9kZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nncm91cC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2VfZXZlbnQuaD4KICNpbmNsdWRlIDxsaW51eC9od19icmVha3BvaW50Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1fdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisjaW5jbHVkZSA8bGludXgvYnBmLmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC0xNTMsNyArMTU1LDcgQEAKICAqLwogc3RydWN0IHN0YXRpY19rZXlfZGVmZXJyZWQgcGVyZl9zY2hlZF9ldmVudHMgX19yZWFkX21vc3RseTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShhdG9taWNfdCwgcGVyZl9jZ3JvdXBfZXZlbnRzKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShhdG9taWNfdCwgcGVyZl9icmFuY2hfc3RhY2tfZXZlbnRzKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHBlcmZfc2NoZWRfY2JfdXNhZ2VzKTsKIAogc3RhdGljIGF0b21pY190IG5yX21tYXBfZXZlbnRzIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgYXRvbWljX3QgbnJfY29tbV9ldmVudHMgX19yZWFkX21vc3RseTsKQEAgLTMyNyw2ICszMjksMTEgQEAKIAlyZXR1cm4gbG9jYWxfY2xvY2soKTsKIH0KIAorc3RhdGljIGlubGluZSB1NjQgcGVyZl9ldmVudF9jbG9jayhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIGV2ZW50LT5jbG9jaygpOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICoKIF9fZ2V0X2NwdV9jb250ZXh0KHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCkKIHsKQEAgLTM1MSwzMiArMzU4LDYgQEAKIAogI2lmZGVmIENPTkZJR19DR1JPVVBfUEVSRgogCi0vKgotICogcGVyZl9jZ3JvdXBfaW5mbyBrZWVwcyB0cmFjayBvZiB0aW1lX2VuYWJsZWQgZm9yIGEgY2dyb3VwLgotICogVGhpcyBpcyBhIHBlci1jcHUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlLgotICovCi1zdHJ1Y3QgcGVyZl9jZ3JvdXBfaW5mbyB7Ci0JdTY0CQkJCXRpbWU7Ci0JdTY0CQkJCXRpbWVzdGFtcDsKLX07Ci0KLXN0cnVjdCBwZXJmX2Nncm91cCB7Ci0Jc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUJY3NzOwotCXN0cnVjdCBwZXJmX2Nncm91cF9pbmZvCV9fcGVyY3B1ICppbmZvOwotfTsKLQotLyoKLSAqIE11c3QgZW5zdXJlIGNncm91cCBpcyBwaW5uZWQgKGNzc19nZXQpIGJlZm9yZSBjYWxsaW5nCi0gKiB0aGlzIGZ1bmN0aW9uLiBJbiBvdGhlciB3b3Jkcywgd2UgY2Fubm90IGNhbGwgdGhpcyBmdW5jdGlvbgotICogaWYgdGhlcmUgaXMgbm8gY2dyb3VwIGV2ZW50IGZvciB0aGUgY3VycmVudCBDUFUgY29udGV4dC4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGVyZl9jZ3JvdXAgKgotcGVyZl9jZ3JvdXBfZnJvbV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKHRhc2tfY3NzKHRhc2ssIHBlcmZfZXZlbnRfY2dycF9pZCksCi0JCQkgICAgc3RydWN0IHBlcmZfY2dyb3VwLCBjc3MpOwotfQotCiBzdGF0aWMgaW5saW5lIGJvb2wKIHBlcmZfY2dyb3VwX21hdGNoKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKQEAgLTkwNSw2ICs4ODYsMTUgQEAKIAlXQVJOX09OKCFhdG9taWNfaW5jX25vdF96ZXJvKCZjdHgtPnJlZmNvdW50KSk7CiB9CiAKK3N0YXRpYyB2b2lkIGZyZWVfY3R4KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHg7CisKKwljdHggPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCwgcmN1X2hlYWQpOworCWtmcmVlKGN0eC0+dGFza19jdHhfZGF0YSk7CisJa2ZyZWUoY3R4KTsKK30KKwogc3RhdGljIHZvaWQgcHV0X2N0eChzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpCiB7CiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmN0eC0+cmVmY291bnQpKSB7CkBAIC05MTIsNyArOTAyLDcgQEAKIAkJCXB1dF9jdHgoY3R4LT5wYXJlbnRfY3R4KTsKIAkJaWYgKGN0eC0+dGFzaykKIAkJCXB1dF90YXNrX3N0cnVjdChjdHgtPnRhc2spOwotCQlrZnJlZV9yY3UoY3R4LCByY3VfaGVhZCk7CisJCWNhbGxfcmN1KCZjdHgtPnJjdV9oZWFkLCBmcmVlX2N0eCk7CiAJfQogfQogCkBAIC0xMjM5LDkgKzEyMjksNiBAQAogCWlmIChpc19jZ3JvdXBfZXZlbnQoZXZlbnQpKQogCQljdHgtPm5yX2Nncm91cHMrKzsKIAotCWlmIChoYXNfYnJhbmNoX3N0YWNrKGV2ZW50KSkKLQkJY3R4LT5ucl9icmFuY2hfc3RhY2srKzsKLQogCWxpc3RfYWRkX3JjdSgmZXZlbnQtPmV2ZW50X2VudHJ5LCAmY3R4LT5ldmVudF9saXN0KTsKIAljdHgtPm5yX2V2ZW50cysrOwogCWlmIChldmVudC0+YXR0ci5pbmhlcml0X3N0YXQpCkBAIC0xNDA4LDkgKzEzOTUsNiBAQAogCQkJY3B1Y3R4LT5jZ3JwID0gTlVMTDsKIAl9CiAKLQlpZiAoaGFzX2JyYW5jaF9zdGFjayhldmVudCkpCi0JCWN0eC0+bnJfYnJhbmNoX3N0YWNrLS07Ci0KIAljdHgtPm5yX2V2ZW50cy0tOwogCWlmIChldmVudC0+YXR0ci5pbmhlcml0X3N0YXQpCiAJCWN0eC0+bnJfc3RhdC0tOwpAQCAtMTg0Nyw2ICsxODMxLDcgQEAKICNkZWZpbmUgTUFYX0lOVEVSUlVQVFMgKH4wVUxMKQogCiBzdGF0aWMgdm9pZCBwZXJmX2xvZ190aHJvdHRsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIGludCBlbmFibGUpOworc3RhdGljIHZvaWQgcGVyZl9sb2dfaXRyYWNlX3N0YXJ0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAKIHN0YXRpYyBpbnQKIGV2ZW50X3NjaGVkX2luKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKQEAgLTE4ODEsNiArMTg2NiwxMiBAQAogCiAJcGVyZl9wbXVfZGlzYWJsZShldmVudC0+cG11KTsKIAorCWV2ZW50LT50c3RhbXBfcnVubmluZyArPSB0c3RhbXAgLSBldmVudC0+dHN0YW1wX3N0b3BwZWQ7CisKKwlwZXJmX3NldF9zaGFkb3dfdGltZShldmVudCwgY3R4LCB0c3RhbXApOworCisJcGVyZl9sb2dfaXRyYWNlX3N0YXJ0KGV2ZW50KTsKKwogCWlmIChldmVudC0+cG11LT5hZGQoZXZlbnQsIFBFUkZfRUZfU1RBUlQpKSB7CiAJCWV2ZW50LT5zdGF0ZSA9IFBFUkZfRVZFTlRfU1RBVEVfSU5BQ1RJVkU7CiAJCWV2ZW50LT5vbmNwdSA9IC0xOwpAQCAtMTg4OCwxMCArMTg3OSw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWV2ZW50LT50c3RhbXBfcnVubmluZyArPSB0c3RhbXAgLSBldmVudC0+dHN0YW1wX3N0b3BwZWQ7Ci0KLQlwZXJmX3NldF9zaGFkb3dfdGltZShldmVudCwgY3R4LCB0c3RhbXApOwotCiAJaWYgKCFpc19zb2Z0d2FyZV9ldmVudChldmVudCkpCiAJCWNwdWN0eC0+YWN0aXZlX29uY3B1Kys7CiAJaWYgKCFjdHgtPm5yX2FjdGl2ZSsrKQpAQCAtMjU1OSw2ICsyNTQ2LDkgQEAKIAkJCW5leHQtPnBlcmZfZXZlbnRfY3R4cFtjdHhuXSA9IGN0eDsKIAkJCWN0eC0+dGFzayA9IG5leHQ7CiAJCQluZXh0X2N0eC0+dGFzayA9IHRhc2s7CisKKwkJCXN3YXAoY3R4LT50YXNrX2N0eF9kYXRhLCBuZXh0X2N0eC0+dGFza19jdHhfZGF0YSk7CisKIAkJCWRvX3N3aXRjaCA9IDA7CiAKIAkJCXBlcmZfZXZlbnRfc3luY19zdGF0KGN0eCwgbmV4dF9jdHgpOwpAQCAtMjU3Nyw2ICsyNTY3LDU2IEBACiAJfQogfQogCit2b2lkIHBlcmZfc2NoZWRfY2JfZGVjKHN0cnVjdCBwbXUgKnBtdSkKK3sKKwl0aGlzX2NwdV9kZWMocGVyZl9zY2hlZF9jYl91c2FnZXMpOworfQorCit2b2lkIHBlcmZfc2NoZWRfY2JfaW5jKHN0cnVjdCBwbXUgKnBtdSkKK3sKKwl0aGlzX2NwdV9pbmMocGVyZl9zY2hlZF9jYl91c2FnZXMpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgY29udGV4dCBzd2l0Y2ggY2FsbGJhY2sgdG8gdGhlIGxvd2VyIGNvZGUKKyAqIGxheWVyLiBJdCBpcyBpbnZva2VkIE9OTFkgd2hlbiB0aGUgY29udGV4dCBzd2l0Y2ggY2FsbGJhY2sgaXMgZW5hYmxlZC4KKyAqLworc3RhdGljIHZvaWQgcGVyZl9wbXVfc2NoZWRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsCisJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0LAorCQkJCWJvb2wgc2NoZWRfaW4pCit7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eDsKKwlzdHJ1Y3QgcG11ICpwbXU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChwcmV2ID09IG5leHQpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBtdSwgJnBtdXMsIGVudHJ5KSB7CisJCWlmIChwbXUtPnNjaGVkX3Rhc2spIHsKKwkJCWNwdWN0eCA9IHRoaXNfY3B1X3B0cihwbXUtPnBtdV9jcHVfY29udGV4dCk7CisKKwkJCXBlcmZfY3R4X2xvY2soY3B1Y3R4LCBjcHVjdHgtPnRhc2tfY3R4KTsKKworCQkJcGVyZl9wbXVfZGlzYWJsZShwbXUpOworCisJCQlwbXUtPnNjaGVkX3Rhc2soY3B1Y3R4LT50YXNrX2N0eCwgc2NoZWRfaW4pOworCisJCQlwZXJmX3BtdV9lbmFibGUocG11KTsKKworCQkJcGVyZl9jdHhfdW5sb2NrKGNwdWN0eCwgY3B1Y3R4LT50YXNrX2N0eCk7CisJCX0KKwl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKwogI2RlZmluZSBmb3JfZWFjaF90YXNrX2NvbnRleHRfbnIoY3R4bikJCQkJCVwKIAlmb3IgKChjdHhuKSA9IDA7IChjdHhuKSA8IHBlcmZfbnJfdGFza19jb250ZXh0czsgKGN0eG4pKyspCiAKQEAgLTI1OTYsNiArMjYzNiw5IEBACiB7CiAJaW50IGN0eG47CiAKKwlpZiAoX190aGlzX2NwdV9yZWFkKHBlcmZfc2NoZWRfY2JfdXNhZ2VzKSkKKwkJcGVyZl9wbXVfc2NoZWRfdGFzayh0YXNrLCBuZXh0LCBmYWxzZSk7CisKIAlmb3JfZWFjaF90YXNrX2NvbnRleHRfbnIoY3R4bikKIAkJcGVyZl9ldmVudF9jb250ZXh0X3NjaGVkX291dCh0YXNrLCBjdHhuLCBuZXh0KTsKIApAQCAtMjc1NSw2NCArMjc5OCw2IEBACiB9CiAKIC8qCi0gKiBXaGVuIHNhbXBsaW5nIHRoZSBicmFuY2sgc3RhY2sgaW4gc3lzdGVtLXdpZGUsIGl0IG1heSBiZSBuZWNlc3NhcnkKLSAqIHRvIGZsdXNoIHRoZSBzdGFjayBvbiBjb250ZXh0IHN3aXRjaC4gVGhpcyBoYXBwZW5zIHdoZW4gdGhlIGJyYW5jaAotICogc3RhY2sgZG9lcyBub3QgdGFnIGl0cyBlbnRyaWVzIHdpdGggdGhlIHBpZCBvZiB0aGUgY3VycmVudCB0YXNrLgotICogT3RoZXJ3aXNlIGl0IGJlY29tZXMgaW1wb3NzaWJsZSB0byBhc3NvY2lhdGUgYSBicmFuY2ggZW50cnkgd2l0aCBhCi0gKiB0YXNrLiBUaGlzIGFtYmlndWl0eSBpcyBtb3JlIGxpa2VseSB0byBhcHBlYXIgd2hlbiB0aGUgYnJhbmNoIHN0YWNrCi0gKiBzdXBwb3J0cyBwcml2IGxldmVsIGZpbHRlcmluZyBhbmQgdGhlIHVzZXIgc2V0cyBpdCB0byBtb25pdG9yIG9ubHkKLSAqIGF0IHRoZSB1c2VyIGxldmVsICh3aGljaCBjb3VsZCBiZSBhIHVzZWZ1bCBtZWFzdXJlbWVudCBpbiBzeXN0ZW0td2lkZQotICogbW9kZSkuIEluIHRoYXQgY2FzZSwgdGhlIHJpc2sgaXMgaGlnaCBvZiBoYXZpbmcgYSBicmFuY2ggc3RhY2sgd2l0aAotICogYnJhbmNoIGZyb20gbXVsdGlwbGUgdGFza3MuIEZsdXNoaW5nIG1heSBtZWFuIGRyb3BwaW5nIHRoZSBleGlzdGluZwotICogZW50cmllcyBvciBzdGFzaGluZyB0aGVtIHNvbWV3aGVyZSBpbiB0aGUgUE1VIHNwZWNpZmljIGNvZGUgbGF5ZXIuCi0gKgotICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgY29udGV4dCBzd2l0Y2ggY2FsbGJhY2sgdG8gdGhlIGxvd2VyIGNvZGUKLSAqIGxheWVyLiBJdCBpcyBpbnZva2VkIE9OTFkgd2hlbiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgc3lzdGVtLXdpZGUgY29udGV4dAotICogd2l0aCBhdCBsZWFzdCBvbmUgYWN0aXZlIGV2ZW50IHVzaW5nIHRha2VuIGJyYW5jaCBzYW1wbGluZy4KLSAqLwotc3RhdGljIHZvaWQgcGVyZl9icmFuY2hfc3RhY2tfc2NoZWRfaW4oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAotCQkJCSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0Jc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eDsKLQlzdHJ1Y3QgcG11ICpwbXU7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIG5vIG5lZWQgdG8gZmx1c2ggYnJhbmNoIHN0YWNrIGlmIG5vdCBjaGFuZ2luZyB0YXNrICovCi0JaWYgKHByZXYgPT0gdGFzaykKLQkJcmV0dXJuOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocG11LCAmcG11cywgZW50cnkpIHsKLQkJY3B1Y3R4ID0gdGhpc19jcHVfcHRyKHBtdS0+cG11X2NwdV9jb250ZXh0KTsKLQotCQkvKgotCQkgKiBjaGVjayBpZiB0aGUgY29udGV4dCBoYXMgYXQgbGVhc3Qgb25lCi0JCSAqIGV2ZW50IHVzaW5nIFBFUkZfU0FNUExFX0JSQU5DSF9TVEFDSwotCQkgKi8KLQkJaWYgKGNwdWN0eC0+Y3R4Lm5yX2JyYW5jaF9zdGFjayA+IDAKLQkJICAgICYmIHBtdS0+Zmx1c2hfYnJhbmNoX3N0YWNrKSB7Ci0KLQkJCXBlcmZfY3R4X2xvY2soY3B1Y3R4LCBjcHVjdHgtPnRhc2tfY3R4KTsKLQotCQkJcGVyZl9wbXVfZGlzYWJsZShwbXUpOwotCi0JCQlwbXUtPmZsdXNoX2JyYW5jaF9zdGFjaygpOwotCi0JCQlwZXJmX3BtdV9lbmFibGUocG11KTsKLQotCQkJcGVyZl9jdHhfdW5sb2NrKGNwdWN0eCwgY3B1Y3R4LT50YXNrX2N0eCk7Ci0JCX0KLQl9Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotLyoKICAqIENhbGxlZCBmcm9tIHNjaGVkdWxlciB0byBhZGQgdGhlIGV2ZW50cyBvZiB0aGUgY3VycmVudCB0YXNrCiAgKiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCiAgKgpAQCAtMjg0NCw5ICsyODI5LDggQEAKIAlpZiAoYXRvbWljX3JlYWQodGhpc19jcHVfcHRyKCZwZXJmX2Nncm91cF9ldmVudHMpKSkKIAkJcGVyZl9jZ3JvdXBfc2NoZWRfaW4ocHJldiwgdGFzayk7CiAKLQkvKiBjaGVjayBmb3Igc3lzdGVtLXdpZGUgYnJhbmNoX3N0YWNrIGV2ZW50cyAqLwotCWlmIChhdG9taWNfcmVhZCh0aGlzX2NwdV9wdHIoJnBlcmZfYnJhbmNoX3N0YWNrX2V2ZW50cykpKQotCQlwZXJmX2JyYW5jaF9zdGFja19zY2hlZF9pbihwcmV2LCB0YXNrKTsKKwlpZiAoX190aGlzX2NwdV9yZWFkKHBlcmZfc2NoZWRfY2JfdXNhZ2VzKSkKKwkJcGVyZl9wbXVfc2NoZWRfdGFzayhwcmV2LCB0YXNrLCB0cnVlKTsKIH0KIAogc3RhdGljIHU2NCBwZXJmX2NhbGN1bGF0ZV9wZXJpb2Qoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1NjQgbnNlYywgdTY0IGNvdW50KQpAQCAtMzIyMCw3ICszMjA0LDEwIEBACiAKIHN0YXRpYyBpbmxpbmUgdTY0IHBlcmZfZXZlbnRfY291bnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewotCXJldHVybiBsb2NhbDY0X3JlYWQoJmV2ZW50LT5jb3VudCkgKyBhdG9taWM2NF9yZWFkKCZldmVudC0+Y2hpbGRfY291bnQpOworCWlmIChldmVudC0+cG11LT5jb3VudCkKKwkJcmV0dXJuIGV2ZW50LT5wbXUtPmNvdW50KGV2ZW50KTsKKworCXJldHVybiBfX3BlcmZfZXZlbnRfY291bnQoZXZlbnQpOwogfQogCiBzdGF0aWMgdTY0IHBlcmZfZXZlbnRfcmVhZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCkBAIC0zMzIxLDEyICszMzA4LDE1IEBACiAgKiBSZXR1cm5zIGEgbWF0Y2hpbmcgY29udGV4dCB3aXRoIHJlZmNvdW50IGFuZCBwaW5jb3VudC4KICAqLwogc3RhdGljIHN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKgotZmluZF9nZXRfY29udGV4dChzdHJ1Y3QgcG11ICpwbXUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGNwdSkKK2ZpbmRfZ2V0X2NvbnRleHQoc3RydWN0IHBtdSAqcG11LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCXN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgsICpjbG9uZV9jdHggPSBOVUxMOwogCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHg7CisJdm9pZCAqdGFza19jdHhfZGF0YSA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgY3R4biwgZXJyOworCWludCBjcHUgPSBldmVudC0+Y3B1OwogCiAJaWYgKCF0YXNrKSB7CiAJCS8qIE11c3QgYmUgcm9vdCB0byBvcGVyYXRlIG9uIGEgQ1BVIGV2ZW50OiAqLwpAQCAtMzM1NCwxMSArMzM0NCwyNCBAQAogCWlmIChjdHhuIDwgMCkKIAkJZ290byBlcnJvdXQ7CiAKKwlpZiAoZXZlbnQtPmF0dGFjaF9zdGF0ZSAmIFBFUkZfQVRUQUNIX1RBU0tfREFUQSkgeworCQl0YXNrX2N0eF9kYXRhID0ga3phbGxvYyhwbXUtPnRhc2tfY3R4X3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAoIXRhc2tfY3R4X2RhdGEpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIGVycm91dDsKKwkJfQorCX0KKwogcmV0cnk6CiAJY3R4ID0gcGVyZl9sb2NrX3Rhc2tfY29udGV4dCh0YXNrLCBjdHhuLCAmZmxhZ3MpOwogCWlmIChjdHgpIHsKIAkJY2xvbmVfY3R4ID0gdW5jbG9uZV9jdHgoY3R4KTsKIAkJKytjdHgtPnBpbl9jb3VudDsKKworCQlpZiAodGFza19jdHhfZGF0YSAmJiAhY3R4LT50YXNrX2N0eF9kYXRhKSB7CisJCQljdHgtPnRhc2tfY3R4X2RhdGEgPSB0YXNrX2N0eF9kYXRhOworCQkJdGFza19jdHhfZGF0YSA9IE5VTEw7CisJCX0KIAkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+bG9jaywgZmxhZ3MpOwogCiAJCWlmIChjbG9uZV9jdHgpCkBAIC0zMzY5LDYgKzMzNzIsMTEgQEAKIAkJaWYgKCFjdHgpCiAJCQlnb3RvIGVycm91dDsKIAorCQlpZiAodGFza19jdHhfZGF0YSkgeworCQkJY3R4LT50YXNrX2N0eF9kYXRhID0gdGFza19jdHhfZGF0YTsKKwkJCXRhc2tfY3R4X2RhdGEgPSBOVUxMOworCQl9CisKIAkJZXJyID0gMDsKIAkJbXV0ZXhfbG9jaygmdGFzay0+cGVyZl9ldmVudF9tdXRleCk7CiAJCS8qCkBAIC0zMzk1LDEzICszNDAzLDE2IEBACiAJCX0KIAl9CiAKKwlrZnJlZSh0YXNrX2N0eF9kYXRhKTsKIAlyZXR1cm4gY3R4OwogCiBlcnJvdXQ6CisJa2ZyZWUodGFza19jdHhfZGF0YSk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KIAogc3RhdGljIHZvaWQgcGVyZl9ldmVudF9mcmVlX2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOworc3RhdGljIHZvaWQgcGVyZl9ldmVudF9mcmVlX2JwZl9wcm9nKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAKIHN0YXRpYyB2b2lkIGZyZWVfZXZlbnRfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKIHsKQEAgLTM0MTEsMTAgKzM0MjIsMTAgQEAKIAlpZiAoZXZlbnQtPm5zKQogCQlwdXRfcGlkX25zKGV2ZW50LT5ucyk7CiAJcGVyZl9ldmVudF9mcmVlX2ZpbHRlcihldmVudCk7CisJcGVyZl9ldmVudF9mcmVlX2JwZl9wcm9nKGV2ZW50KTsKIAlrZnJlZShldmVudCk7CiB9CiAKLXN0YXRpYyB2b2lkIHJpbmdfYnVmZmVyX3B1dChzdHJ1Y3QgcmluZ19idWZmZXIgKnJiKTsKIHN0YXRpYyB2b2lkIHJpbmdfYnVmZmVyX2F0dGFjaChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkgICAgICAgc3RydWN0IHJpbmdfYnVmZmVyICpyYik7CiAKQEAgLTM0MjMsMTAgKzM0MzQsNiBAQAogCWlmIChldmVudC0+cGFyZW50KQogCQlyZXR1cm47CiAKLQlpZiAoaGFzX2JyYW5jaF9zdGFjayhldmVudCkpIHsKLQkJaWYgKCEoZXZlbnQtPmF0dGFjaF9zdGF0ZSAmIFBFUkZfQVRUQUNIX1RBU0spKQotCQkJYXRvbWljX2RlYygmcGVyX2NwdShwZXJmX2JyYW5jaF9zdGFja19ldmVudHMsIGNwdSkpOwotCX0KIAlpZiAoaXNfY2dyb3VwX2V2ZW50KGV2ZW50KSkKIAkJYXRvbWljX2RlYygmcGVyX2NwdShwZXJmX2Nncm91cF9ldmVudHMsIGNwdSkpOwogfQpAQCAtMzQ1NCw2ICszNDYxLDkxIEBACiAJdW5hY2NvdW50X2V2ZW50X2NwdShldmVudCwgZXZlbnQtPmNwdSk7CiB9CiAKKy8qCisgKiBUaGUgZm9sbG93aW5nIGltcGxlbWVudCBtdXR1YWwgZXhjbHVzaW9uIG9mIGV2ZW50cyBvbiAiZXhjbHVzaXZlIiBwbXVzCisgKiAoUEVSRl9QTVVfQ0FQX0VYQ0xVU0lWRSkuIFN1Y2ggcG11cyBjYW4gb25seSBoYXZlIG9uZSBldmVudCBzY2hlZHVsZWQKKyAqIGF0IGEgdGltZSwgc28gd2UgZGlzYWxsb3cgY3JlYXRpbmcgZXZlbnRzIHRoYXQgbWlnaHQgY29uZmxpY3QsIG5hbWVseToKKyAqCisgKiAgMSkgY3B1LXdpZGUgZXZlbnRzIGluIHRoZSBwcmVzZW5jZSBvZiBwZXItdGFzayBldmVudHMsCisgKiAgMikgcGVyLXRhc2sgZXZlbnRzIGluIHRoZSBwcmVzZW5jZSBvZiBjcHUtd2lkZSBldmVudHMsCisgKiAgMykgdHdvIG1hdGNoaW5nIGV2ZW50cyBvbiB0aGUgc2FtZSBjb250ZXh0LgorICoKKyAqIFRoZSBmb3JtZXIgdHdvIGNhc2VzIGFyZSBoYW5kbGVkIGluIHRoZSBhbGxvY2F0aW9uIHBhdGggKHBlcmZfZXZlbnRfYWxsb2MoKSwKKyAqIF9fZnJlZV9ldmVudCgpKSwgdGhlIGxhdHRlciAtLSBiZWZvcmUgdGhlIGZpcnN0IHBlcmZfaW5zdGFsbF9pbl9jb250ZXh0KCkuCisgKi8KK3N0YXRpYyBpbnQgZXhjbHVzaXZlX2V2ZW50X2luaXQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBwbXUgKnBtdSA9IGV2ZW50LT5wbXU7CisKKwlpZiAoIShwbXUtPmNhcGFiaWxpdGllcyAmIFBFUkZfUE1VX0NBUF9FWENMVVNJVkUpKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogUHJldmVudCBjby1leGlzdGVuY2Ugb2YgcGVyLXRhc2sgYW5kIGNwdS13aWRlIGV2ZW50cyBvbiB0aGUKKwkgKiBzYW1lIGV4Y2x1c2l2ZSBwbXUuCisJICoKKwkgKiBOZWdhdGl2ZSBwbXU6OmV4Y2x1c2l2ZV9jbnQgbWVhbnMgdGhlcmUgYXJlIGNwdS13aWRlCisJICogZXZlbnRzIG9uIHRoaXMgImV4Y2x1c2l2ZSIgcG11LCBwb3NpdGl2ZSBtZWFucyB0aGVyZSBhcmUKKwkgKiBwZXItdGFzayBldmVudHMuCisJICoKKwkgKiBTaW5jZSB0aGlzIGlzIGNhbGxlZCBpbiBwZXJmX2V2ZW50X2FsbG9jKCkgcGF0aCwgZXZlbnQ6OmN0eAorCSAqIGRvZXNuJ3QgZXhpc3QgeWV0OyBpdCBpcywgaG93ZXZlciwgc2FmZSB0byB1c2UgUEVSRl9BVFRBQ0hfVEFTSworCSAqIHRvIG1lYW4gInBlci10YXNrIGV2ZW50IiwgYmVjYXVzZSB1bmxpa2Ugb3RoZXIgYXR0YWNoIHN0YXRlcyBpdAorCSAqIG5ldmVyIGdldHMgY2xlYXJlZC4KKwkgKi8KKwlpZiAoZXZlbnQtPmF0dGFjaF9zdGF0ZSAmIFBFUkZfQVRUQUNIX1RBU0spIHsKKwkJaWYgKCFhdG9taWNfaW5jX3VubGVzc19uZWdhdGl2ZSgmcG11LT5leGNsdXNpdmVfY250KSkKKwkJCXJldHVybiAtRUJVU1k7CisJfSBlbHNlIHsKKwkJaWYgKCFhdG9taWNfZGVjX3VubGVzc19wb3NpdGl2ZSgmcG11LT5leGNsdXNpdmVfY250KSkKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4Y2x1c2l2ZV9ldmVudF9kZXN0cm95KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgcG11ICpwbXUgPSBldmVudC0+cG11OworCisJaWYgKCEocG11LT5jYXBhYmlsaXRpZXMgJiBQRVJGX1BNVV9DQVBfRVhDTFVTSVZFKSkKKwkJcmV0dXJuOworCisJLyogc2VlIGNvbW1lbnQgaW4gZXhjbHVzaXZlX2V2ZW50X2luaXQoKSAqLworCWlmIChldmVudC0+YXR0YWNoX3N0YXRlICYgUEVSRl9BVFRBQ0hfVEFTSykKKwkJYXRvbWljX2RlYygmcG11LT5leGNsdXNpdmVfY250KTsKKwllbHNlCisJCWF0b21pY19pbmMoJnBtdS0+ZXhjbHVzaXZlX2NudCk7Cit9CisKK3N0YXRpYyBib29sIGV4Y2x1c2l2ZV9ldmVudF9tYXRjaChzdHJ1Y3QgcGVyZl9ldmVudCAqZTEsIHN0cnVjdCBwZXJmX2V2ZW50ICplMikKK3sKKwlpZiAoKGUxLT5wbXUtPmNhcGFiaWxpdGllcyAmIFBFUkZfUE1VX0NBUF9FWENMVVNJVkUpICYmCisJICAgIChlMS0+Y3B1ID09IGUyLT5jcHUgfHwKKwkgICAgIGUxLT5jcHUgPT0gLTEgfHwKKwkgICAgIGUyLT5jcHUgPT0gLTEpKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qIENhbGxlZCB1bmRlciB0aGUgc2FtZSBjdHg6Om11dGV4IGFzIHBlcmZfaW5zdGFsbF9pbl9jb250ZXh0KCkgKi8KK3N0YXRpYyBib29sIGV4Y2x1c2l2ZV9ldmVudF9pbnN0YWxsYWJsZShzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQkJCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqaXRlcl9ldmVudDsKKwlzdHJ1Y3QgcG11ICpwbXUgPSBldmVudC0+cG11OworCisJaWYgKCEocG11LT5jYXBhYmlsaXRpZXMgJiBQRVJGX1BNVV9DQVBfRVhDTFVTSVZFKSkKKwkJcmV0dXJuIHRydWU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGl0ZXJfZXZlbnQsICZjdHgtPmV2ZW50X2xpc3QsIGV2ZW50X2VudHJ5KSB7CisJCWlmIChleGNsdXNpdmVfZXZlbnRfbWF0Y2goaXRlcl9ldmVudCwgZXZlbnQpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgdm9pZCBfX2ZyZWVfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewogCWlmICghZXZlbnQtPnBhcmVudCkgewpAQCAtMzQ2Nyw4ICszNTU5LDEwIEBACiAJaWYgKGV2ZW50LT5jdHgpCiAJCXB1dF9jdHgoZXZlbnQtPmN0eCk7CiAKLQlpZiAoZXZlbnQtPnBtdSkKKwlpZiAoZXZlbnQtPnBtdSkgeworCQlleGNsdXNpdmVfZXZlbnRfZGVzdHJveShldmVudCk7CiAJCW1vZHVsZV9wdXQoZXZlbnQtPnBtdS0+bW9kdWxlKTsKKwl9CiAKIAljYWxsX3JjdSgmZXZlbnQtPnJjdV9oZWFkLCBmcmVlX2V2ZW50X3JjdSk7CiB9CkBAIC0zNTkxLDcgKzM2ODUsNyBAQAogCWN0eCA9IHBlcmZfZXZlbnRfY3R4X2xvY2tfbmVzdGVkKGV2ZW50LCBTSU5HTEVfREVQVEhfTkVTVElORyk7CiAJV0FSTl9PTl9PTkNFKGN0eC0+cGFyZW50X2N0eCk7CiAJcGVyZl9yZW1vdmVfZnJvbV9jb250ZXh0KGV2ZW50LCB0cnVlKTsKLQltdXRleF91bmxvY2soJmN0eC0+bXV0ZXgpOworCXBlcmZfZXZlbnRfY3R4X3VubG9jayhldmVudCwgY3R4KTsKIAogCV9mcmVlX2V2ZW50KGV2ZW50KTsKIH0KQEAgLTM5MjcsNiArNDAyMSw3IEBACiBzdGF0aWMgaW50IHBlcmZfZXZlbnRfc2V0X291dHB1dChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJIHN0cnVjdCBwZXJmX2V2ZW50ICpvdXRwdXRfZXZlbnQpOwogc3RhdGljIGludCBwZXJmX2V2ZW50X3NldF9maWx0ZXIoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB2b2lkIF9fdXNlciAqYXJnKTsKK3N0YXRpYyBpbnQgcGVyZl9ldmVudF9zZXRfYnBmX3Byb2coc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1MzIgcHJvZ19mZCk7CiAKIHN0YXRpYyBsb25nIF9wZXJmX2lvY3RsKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CkBAIC0zOTgwLDYgKzQwNzUsOSBAQAogCWNhc2UgUEVSRl9FVkVOVF9JT0NfU0VUX0ZJTFRFUjoKIAkJcmV0dXJuIHBlcmZfZXZlbnRfc2V0X2ZpbHRlcihldmVudCwgKHZvaWQgX191c2VyICopYXJnKTsKIAorCWNhc2UgUEVSRl9FVkVOVF9JT0NfU0VUX0JQRjoKKwkJcmV0dXJuIHBlcmZfZXZlbnRfc2V0X2JwZl9wcm9nKGV2ZW50LCBhcmcpOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9UVFk7CiAJfQpAQCAtNDA5Niw2ICs0MTk0LDggQEAKIAkvKiBBbGxvdyBuZXcgdXNlcnNwYWNlIHRvIGRldGVjdCB0aGF0IGJpdCAwIGlzIGRlcHJlY2F0ZWQgKi8KIAl1c2VycGctPmNhcF9iaXQwX2lzX2RlcHJlY2F0ZWQgPSAxOwogCXVzZXJwZy0+c2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBwZXJmX2V2ZW50X21tYXBfcGFnZSwgX19yZXNlcnZlZCk7CisJdXNlcnBnLT5kYXRhX29mZnNldCA9IFBBR0VfU0laRTsKKwl1c2VycGctPmRhdGFfc2l6ZSA9IHBlcmZfZGF0YV9zaXplKHJiKTsKIAogdW5sb2NrOgogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtNDI2Myw3ICs0MzYzLDcgQEAKIAlyYl9mcmVlKHJiKTsKIH0KIAotc3RhdGljIHN0cnVjdCByaW5nX2J1ZmZlciAqcmluZ19idWZmZXJfZ2V0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3N0cnVjdCByaW5nX2J1ZmZlciAqcmluZ19idWZmZXJfZ2V0KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgcmluZ19idWZmZXIgKnJiOwogCkBAIC00Mjc4LDcgKzQzNzgsNyBAQAogCXJldHVybiByYjsKIH0KIAotc3RhdGljIHZvaWQgcmluZ19idWZmZXJfcHV0KHN0cnVjdCByaW5nX2J1ZmZlciAqcmIpCit2b2lkIHJpbmdfYnVmZmVyX3B1dChzdHJ1Y3QgcmluZ19idWZmZXIgKnJiKQogewogCWlmICghYXRvbWljX2RlY19hbmRfdGVzdCgmcmItPnJlZmNvdW50KSkKIAkJcmV0dXJuOwpAQCAtNDI5NSw2ICs0Mzk1LDkgQEAKIAlhdG9taWNfaW5jKCZldmVudC0+bW1hcF9jb3VudCk7CiAJYXRvbWljX2luYygmZXZlbnQtPnJiLT5tbWFwX2NvdW50KTsKIAorCWlmICh2bWEtPnZtX3Bnb2ZmKQorCQlhdG9taWNfaW5jKCZldmVudC0+cmItPmF1eF9tbWFwX2NvdW50KTsKKwogCWlmIChldmVudC0+cG11LT5ldmVudF9tYXBwZWQpCiAJCWV2ZW50LT5wbXUtPmV2ZW50X21hcHBlZChldmVudCk7CiB9CkBAIC00MzE5LDYgKzQ0MjIsMjAgQEAKIAlpZiAoZXZlbnQtPnBtdS0+ZXZlbnRfdW5tYXBwZWQpCiAJCWV2ZW50LT5wbXUtPmV2ZW50X3VubWFwcGVkKGV2ZW50KTsKIAorCS8qCisJICogcmItPmF1eF9tbWFwX2NvdW50IHdpbGwgYWx3YXlzIGRyb3AgYmVmb3JlIHJiLT5tbWFwX2NvdW50IGFuZAorCSAqIGV2ZW50LT5tbWFwX2NvdW50LCBzbyBpdCBpcyBvayB0byB1c2UgZXZlbnQtPm1tYXBfbXV0ZXggdG8KKwkgKiBzZXJpYWxpemUgd2l0aCBwZXJmX21tYXAgaGVyZS4KKwkgKi8KKwlpZiAocmJfaGFzX2F1eChyYikgJiYgdm1hLT52bV9wZ29mZiA9PSByYi0+YXV4X3Bnb2ZmICYmCisJICAgIGF0b21pY19kZWNfYW5kX211dGV4X2xvY2soJnJiLT5hdXhfbW1hcF9jb3VudCwgJmV2ZW50LT5tbWFwX211dGV4KSkgeworCQlhdG9taWNfbG9uZ19zdWIocmItPmF1eF9ucl9wYWdlcywgJm1tYXBfdXNlci0+bG9ja2VkX3ZtKTsKKwkJdm1hLT52bV9tbS0+cGlubmVkX3ZtIC09IHJiLT5hdXhfbW1hcF9sb2NrZWQ7CisKKwkJcmJfZnJlZV9hdXgocmIpOworCQltdXRleF91bmxvY2soJmV2ZW50LT5tbWFwX211dGV4KTsKKwl9CisKIAlhdG9taWNfZGVjKCZyYi0+bW1hcF9jb3VudCk7CiAKIAlpZiAoIWF0b21pY19kZWNfYW5kX211dGV4X2xvY2soJmV2ZW50LT5tbWFwX2NvdW50LCAmZXZlbnQtPm1tYXBfbXV0ZXgpKQpAQCAtNDM5Miw3ICs0NTA5LDcgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBwZXJmX21tYXBfdm1vcHMgPSB7CiAJLm9wZW4JCT0gcGVyZl9tbWFwX29wZW4sCi0JLmNsb3NlCQk9IHBlcmZfbW1hcF9jbG9zZSwKKwkuY2xvc2UJCT0gcGVyZl9tbWFwX2Nsb3NlLCAvKiBub24gbWVyZ2FibGUgKi8KIAkuZmF1bHQJCT0gcGVyZl9tbWFwX2ZhdWx0LAogCS5wYWdlX21rd3JpdGUJPSBwZXJmX21tYXBfZmF1bHQsCiB9OwpAQCAtNDQwMywxMCArNDUyMCwxMCBAQAogCXVuc2lnbmVkIGxvbmcgdXNlcl9sb2NrZWQsIHVzZXJfbG9ja19saW1pdDsKIAlzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVzZXIgPSBjdXJyZW50X3VzZXIoKTsKIAl1bnNpZ25lZCBsb25nIGxvY2tlZCwgbG9ja19saW1pdDsKLQlzdHJ1Y3QgcmluZ19idWZmZXIgKnJiOworCXN0cnVjdCByaW5nX2J1ZmZlciAqcmIgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgdm1hX3NpemU7CiAJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKLQlsb25nIHVzZXJfZXh0cmEsIGV4dHJhOworCWxvbmcgdXNlcl9leHRyYSA9IDAsIGV4dHJhID0gMDsKIAlpbnQgcmV0ID0gMCwgZmxhZ3MgPSAwOwogCiAJLyoKQEAgLTQ0MjEsNyArNDUzOCw2NiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXZtYV9zaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwotCW5yX3BhZ2VzID0gKHZtYV9zaXplIC8gUEFHRV9TSVpFKSAtIDE7CisKKwlpZiAodm1hLT52bV9wZ29mZiA9PSAwKSB7CisJCW5yX3BhZ2VzID0gKHZtYV9zaXplIC8gUEFHRV9TSVpFKSAtIDE7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQVVYIGFyZWEgbWFwcGluZzogaWYgcmItPmF1eF9ucl9wYWdlcyAhPSAwLCBpdCdzIGFscmVhZHkKKwkJICogbWFwcGVkLCBhbGwgc3Vic2VxdWVudCBtYXBwaW5ncyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBzaXplCisJCSAqIGFuZCBvZmZzZXQuIE11c3QgYmUgYWJvdmUgdGhlIG5vcm1hbCBwZXJmIGJ1ZmZlci4KKwkJICovCisJCXU2NCBhdXhfb2Zmc2V0LCBhdXhfc2l6ZTsKKworCQlpZiAoIWV2ZW50LT5yYikKKwkJCXJldHVybiAtRUlOVkFMOworCisJCW5yX3BhZ2VzID0gdm1hX3NpemUgLyBQQUdFX1NJWkU7CisKKwkJbXV0ZXhfbG9jaygmZXZlbnQtPm1tYXBfbXV0ZXgpOworCQlyZXQgPSAtRUlOVkFMOworCisJCXJiID0gZXZlbnQtPnJiOworCQlpZiAoIXJiKQorCQkJZ290byBhdXhfdW5sb2NrOworCisJCWF1eF9vZmZzZXQgPSBBQ0NFU1NfT05DRShyYi0+dXNlcl9wYWdlLT5hdXhfb2Zmc2V0KTsKKwkJYXV4X3NpemUgPSBBQ0NFU1NfT05DRShyYi0+dXNlcl9wYWdlLT5hdXhfc2l6ZSk7CisKKwkJaWYgKGF1eF9vZmZzZXQgPCBwZXJmX2RhdGFfc2l6ZShyYikgKyBQQUdFX1NJWkUpCisJCQlnb3RvIGF1eF91bmxvY2s7CisKKwkJaWYgKGF1eF9vZmZzZXQgIT0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKQorCQkJZ290byBhdXhfdW5sb2NrOworCisJCS8qIGFscmVhZHkgbWFwcGVkIHdpdGggYSBkaWZmZXJlbnQgb2Zmc2V0ICovCisJCWlmIChyYl9oYXNfYXV4KHJiKSAmJiByYi0+YXV4X3Bnb2ZmICE9IHZtYS0+dm1fcGdvZmYpCisJCQlnb3RvIGF1eF91bmxvY2s7CisKKwkJaWYgKGF1eF9zaXplICE9IHZtYV9zaXplIHx8IGF1eF9zaXplICE9IG5yX3BhZ2VzICogUEFHRV9TSVpFKQorCQkJZ290byBhdXhfdW5sb2NrOworCisJCS8qIGFscmVhZHkgbWFwcGVkIHdpdGggYSBkaWZmZXJlbnQgc2l6ZSAqLworCQlpZiAocmJfaGFzX2F1eChyYikgJiYgcmItPmF1eF9ucl9wYWdlcyAhPSBucl9wYWdlcykKKwkJCWdvdG8gYXV4X3VubG9jazsKKworCQlpZiAoIWlzX3Bvd2VyX29mXzIobnJfcGFnZXMpKQorCQkJZ290byBhdXhfdW5sb2NrOworCisJCWlmICghYXRvbWljX2luY19ub3RfemVybygmcmItPm1tYXBfY291bnQpKQorCQkJZ290byBhdXhfdW5sb2NrOworCisJCWlmIChyYl9oYXNfYXV4KHJiKSkgeworCQkJYXRvbWljX2luYygmcmItPmF1eF9tbWFwX2NvdW50KTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCisJCWF0b21pY19zZXQoJnJiLT5hdXhfbW1hcF9jb3VudCwgMSk7CisJCXVzZXJfZXh0cmEgPSBucl9wYWdlczsKKworCQlnb3RvIGFjY291bnRpbmc7CisJfQogCiAJLyoKIAkgKiBJZiB3ZSBoYXZlIHJiIHBhZ2VzIGVuc3VyZSB0aGV5J3JlIGEgcG93ZXItb2YtdHdvIG51bWJlciwgc28gd2UKQEAgLTQ0MzMsOSArNDYwOSw2IEBACiAJaWYgKHZtYV9zaXplICE9IFBBR0VfU0laRSAqICgxICsgbnJfcGFnZXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCiAJV0FSTl9PTl9PTkNFKGV2ZW50LT5jdHgtPnBhcmVudF9jdHgpOwogYWdhaW46CiAJbXV0ZXhfbG9jaygmZXZlbnQtPm1tYXBfbXV0ZXgpOwpAQCAtNDQ1OSw2ICs0NjMyLDggQEAKIAl9CiAKIAl1c2VyX2V4dHJhID0gbnJfcGFnZXMgKyAxOworCithY2NvdW50aW5nOgogCXVzZXJfbG9ja19saW1pdCA9IHN5c2N0bF9wZXJmX2V2ZW50X21sb2NrID4+IChQQUdFX1NISUZUIC0gMTApOwogCiAJLyoKQEAgLTQ0NjgsNyArNDY0Myw2IEBACiAKIAl1c2VyX2xvY2tlZCA9IGF0b21pY19sb25nX3JlYWQoJnVzZXItPmxvY2tlZF92bSkgKyB1c2VyX2V4dHJhOwogCi0JZXh0cmEgPSAwOwogCWlmICh1c2VyX2xvY2tlZCA+IHVzZXJfbG9ja19saW1pdCkKIAkJZXh0cmEgPSB1c2VyX2xvY2tlZCAtIHVzZXJfbG9ja19saW1pdDsKIApAQCAtNDQ4MiwzNSArNDY1Niw0NiBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlXQVJOX09OKGV2ZW50LT5yYik7CisJV0FSTl9PTighcmIgJiYgZXZlbnQtPnJiKTsKIAogCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpCiAJCWZsYWdzIHw9IFJJTkdfQlVGRkVSX1dSSVRBQkxFOwogCi0JcmIgPSByYl9hbGxvYyhucl9wYWdlcywgCi0JCWV2ZW50LT5hdHRyLndhdGVybWFyayA/IGV2ZW50LT5hdHRyLndha2V1cF93YXRlcm1hcmsgOiAwLAotCQlldmVudC0+Y3B1LCBmbGFncyk7Ci0KIAlpZiAoIXJiKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gdW5sb2NrOworCQlyYiA9IHJiX2FsbG9jKG5yX3BhZ2VzLAorCQkJICAgICAgZXZlbnQtPmF0dHIud2F0ZXJtYXJrID8gZXZlbnQtPmF0dHIud2FrZXVwX3dhdGVybWFyayA6IDAsCisJCQkgICAgICBldmVudC0+Y3B1LCBmbGFncyk7CisKKwkJaWYgKCFyYikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisKKwkJYXRvbWljX3NldCgmcmItPm1tYXBfY291bnQsIDEpOworCQlyYi0+bW1hcF91c2VyID0gZ2V0X2N1cnJlbnRfdXNlcigpOworCQlyYi0+bW1hcF9sb2NrZWQgPSBleHRyYTsKKworCQlyaW5nX2J1ZmZlcl9hdHRhY2goZXZlbnQsIHJiKTsKKworCQlwZXJmX2V2ZW50X2luaXRfdXNlcnBhZ2UoZXZlbnQpOworCQlwZXJmX2V2ZW50X3VwZGF0ZV91c2VycGFnZShldmVudCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gcmJfYWxsb2NfYXV4KHJiLCBldmVudCwgdm1hLT52bV9wZ29mZiwgbnJfcGFnZXMsCisJCQkJICAgZXZlbnQtPmF0dHIuYXV4X3dhdGVybWFyaywgZmxhZ3MpOworCQlpZiAoIXJldCkKKwkJCXJiLT5hdXhfbW1hcF9sb2NrZWQgPSBleHRyYTsKIAl9CiAKLQlhdG9taWNfc2V0KCZyYi0+bW1hcF9jb3VudCwgMSk7Ci0JcmItPm1tYXBfbG9ja2VkID0gZXh0cmE7Ci0JcmItPm1tYXBfdXNlciA9IGdldF9jdXJyZW50X3VzZXIoKTsKLQotCWF0b21pY19sb25nX2FkZCh1c2VyX2V4dHJhLCAmdXNlci0+bG9ja2VkX3ZtKTsKLQl2bWEtPnZtX21tLT5waW5uZWRfdm0gKz0gZXh0cmE7Ci0KLQlyaW5nX2J1ZmZlcl9hdHRhY2goZXZlbnQsIHJiKTsKLQotCXBlcmZfZXZlbnRfaW5pdF91c2VycGFnZShldmVudCk7Ci0JcGVyZl9ldmVudF91cGRhdGVfdXNlcnBhZ2UoZXZlbnQpOwotCiB1bmxvY2s6Ci0JaWYgKCFyZXQpCisJaWYgKCFyZXQpIHsKKwkJYXRvbWljX2xvbmdfYWRkKHVzZXJfZXh0cmEsICZ1c2VyLT5sb2NrZWRfdm0pOworCQl2bWEtPnZtX21tLT5waW5uZWRfdm0gKz0gZXh0cmE7CisKIAkJYXRvbWljX2luYygmZXZlbnQtPm1tYXBfY291bnQpOworCX0gZWxzZSBpZiAocmIpIHsKKwkJYXRvbWljX2RlYygmcmItPm1tYXBfY291bnQpOworCX0KK2F1eF91bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZldmVudC0+bW1hcF9tdXRleCk7CiAKIAkvKgpAQCAtNDU3NCw2ICs0NzU5LDEzIEBACiB7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gY29udGFpbmVyX29mKGVudHJ5LAogCQkJc3RydWN0IHBlcmZfZXZlbnQsIHBlbmRpbmcpOworCWludCByY3R4OworCisJcmN0eCA9IHBlcmZfc3dldmVudF9nZXRfcmVjdXJzaW9uX2NvbnRleHQoKTsKKwkvKgorCSAqIElmIHdlICdmYWlsJyBoZXJlLCB0aGF0J3MgT0ssIGl0IG1lYW5zIHJlY3Vyc2lvbiBpcyBhbHJlYWR5IGRpc2FibGVkCisJICogYW5kIHdlIHdvbid0IHJlY3Vyc2UgJ2Z1cnRoZXInLgorCSAqLwogCiAJaWYgKGV2ZW50LT5wZW5kaW5nX2Rpc2FibGUpIHsKIAkJZXZlbnQtPnBlbmRpbmdfZGlzYWJsZSA9IDA7CkBAIC00NTg0LDYgKzQ3NzYsOSBAQAogCQlldmVudC0+cGVuZGluZ193YWtldXAgPSAwOwogCQlwZXJmX2V2ZW50X3dha2V1cChldmVudCk7CiAJfQorCisJaWYgKHJjdHggPj0gMCkKKwkJcGVyZl9zd2V2ZW50X3B1dF9yZWN1cnNpb25fY29udGV4dChyY3R4KTsKIH0KIAogLyoKQEAgLTQ3NTYsNyArNDk1MSw3IEBACiAJfQogCiAJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElNRSkKLQkJZGF0YS0+dGltZSA9IHBlcmZfY2xvY2soKTsKKwkJZGF0YS0+dGltZSA9IHBlcmZfZXZlbnRfY2xvY2soZXZlbnQpOwogCiAJaWYgKHNhbXBsZV90eXBlICYgKFBFUkZfU0FNUExFX0lEIHwgUEVSRl9TQU1QTEVfSURFTlRJRklFUikpCiAJCWRhdGEtPmlkID0gcHJpbWFyeV9ldmVudF9pZChldmVudCk7CkBAIC01MzM0LDYgKzU1MjksOCBAQAogCXRhc2tfZXZlbnQtPmV2ZW50X2lkLnRpZCA9IHBlcmZfZXZlbnRfdGlkKGV2ZW50LCB0YXNrKTsKIAl0YXNrX2V2ZW50LT5ldmVudF9pZC5wdGlkID0gcGVyZl9ldmVudF90aWQoZXZlbnQsIGN1cnJlbnQpOwogCisJdGFza19ldmVudC0+ZXZlbnRfaWQudGltZSA9IHBlcmZfZXZlbnRfY2xvY2soZXZlbnQpOworCiAJcGVyZl9vdXRwdXRfcHV0KCZoYW5kbGUsIHRhc2tfZXZlbnQtPmV2ZW50X2lkKTsKIAogCXBlcmZfZXZlbnRfX291dHB1dF9pZF9zYW1wbGUoZXZlbnQsICZoYW5kbGUsICZzYW1wbGUpOwpAQCAtNTM2Nyw3ICs1NTY0LDcgQEAKIAkJCS8qIC5wcGlkICovCiAJCQkvKiAudGlkICAqLwogCQkJLyogLnB0aWQgKi8KLQkJCS50aW1lID0gcGVyZl9jbG9jaygpLAorCQkJLyogLnRpbWUgKi8KIAkJfSwKIAl9OwogCkBAIC01NzIyLDYgKzU5MTksNDAgQEAKIAlwZXJmX2V2ZW50X21tYXBfZXZlbnQoJm1tYXBfZXZlbnQpOwogfQogCit2b2lkIHBlcmZfZXZlbnRfYXV4X2V2ZW50KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdW5zaWduZWQgbG9uZyBoZWFkLAorCQkJICB1bnNpZ25lZCBsb25nIHNpemUsIHU2NCBmbGFncykKK3sKKwlzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlIGhhbmRsZTsKKwlzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSBzYW1wbGU7CisJc3RydWN0IHBlcmZfYXV4X2V2ZW50IHsKKwkJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkJdTY0CQkJCW9mZnNldDsKKwkJdTY0CQkJCXNpemU7CisJCXU2NAkJCQlmbGFnczsKKwl9IHJlYyA9IHsKKwkJLmhlYWRlciA9IHsKKwkJCS50eXBlID0gUEVSRl9SRUNPUkRfQVVYLAorCQkJLm1pc2MgPSAwLAorCQkJLnNpemUgPSBzaXplb2YocmVjKSwKKwkJfSwKKwkJLm9mZnNldAkJPSBoZWFkLAorCQkuc2l6ZQkJPSBzaXplLAorCQkuZmxhZ3MJCT0gZmxhZ3MsCisJfTsKKwlpbnQgcmV0OworCisJcGVyZl9ldmVudF9oZWFkZXJfX2luaXRfaWQoJnJlYy5oZWFkZXIsICZzYW1wbGUsIGV2ZW50KTsKKwlyZXQgPSBwZXJmX291dHB1dF9iZWdpbigmaGFuZGxlLCBldmVudCwgcmVjLmhlYWRlci5zaXplKTsKKworCWlmIChyZXQpCisJCXJldHVybjsKKworCXBlcmZfb3V0cHV0X3B1dCgmaGFuZGxlLCByZWMpOworCXBlcmZfZXZlbnRfX291dHB1dF9pZF9zYW1wbGUoZXZlbnQsICZoYW5kbGUsICZzYW1wbGUpOworCisJcGVyZl9vdXRwdXRfZW5kKCZoYW5kbGUpOworfQorCiAvKgogICogSVJRIHRocm90dGxlIGxvZ2dpbmcKICAqLwpAQCAtNTc0Myw3ICs1OTc0LDcgQEAKIAkJCS5taXNjID0gMCwKIAkJCS5zaXplID0gc2l6ZW9mKHRocm90dGxlX2V2ZW50KSwKIAkJfSwKLQkJLnRpbWUJCT0gcGVyZl9jbG9jaygpLAorCQkudGltZQkJPSBwZXJmX2V2ZW50X2Nsb2NrKGV2ZW50KSwKIAkJLmlkCQk9IHByaW1hcnlfZXZlbnRfaWQoZXZlbnQpLAogCQkuc3RyZWFtX2lkCT0gZXZlbnQtPmlkLAogCX07CkBAIC01NzYzLDYgKzU5OTQsNDQgQEAKIAlwZXJmX291dHB1dF9lbmQoJmhhbmRsZSk7CiB9CiAKK3N0YXRpYyB2b2lkIHBlcmZfbG9nX2l0cmFjZV9zdGFydChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSBoYW5kbGU7CisJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgc2FtcGxlOworCXN0cnVjdCBwZXJmX2F1eF9ldmVudCB7CisJCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAgICAgICAgaGVhZGVyOworCQl1MzIJCQkJcGlkOworCQl1MzIJCQkJdGlkOworCX0gcmVjOworCWludCByZXQ7CisKKwlpZiAoZXZlbnQtPnBhcmVudCkKKwkJZXZlbnQgPSBldmVudC0+cGFyZW50OworCisJaWYgKCEoZXZlbnQtPnBtdS0+Y2FwYWJpbGl0aWVzICYgUEVSRl9QTVVfQ0FQX0lUUkFDRSkgfHwKKwkgICAgZXZlbnQtPmh3Lml0cmFjZV9zdGFydGVkKQorCQlyZXR1cm47CisKKwlldmVudC0+aHcuaXRyYWNlX3N0YXJ0ZWQgPSAxOworCisJcmVjLmhlYWRlci50eXBlCT0gUEVSRl9SRUNPUkRfSVRSQUNFX1NUQVJUOworCXJlYy5oZWFkZXIubWlzYwk9IDA7CisJcmVjLmhlYWRlci5zaXplCT0gc2l6ZW9mKHJlYyk7CisJcmVjLnBpZAk9IHBlcmZfZXZlbnRfcGlkKGV2ZW50LCBjdXJyZW50KTsKKwlyZWMudGlkCT0gcGVyZl9ldmVudF90aWQoZXZlbnQsIGN1cnJlbnQpOworCisJcGVyZl9ldmVudF9oZWFkZXJfX2luaXRfaWQoJnJlYy5oZWFkZXIsICZzYW1wbGUsIGV2ZW50KTsKKwlyZXQgPSBwZXJmX291dHB1dF9iZWdpbigmaGFuZGxlLCBldmVudCwgcmVjLmhlYWRlci5zaXplKTsKKworCWlmIChyZXQpCisJCXJldHVybjsKKworCXBlcmZfb3V0cHV0X3B1dCgmaGFuZGxlLCByZWMpOworCXBlcmZfZXZlbnRfX291dHB1dF9pZF9zYW1wbGUoZXZlbnQsICZoYW5kbGUsICZzYW1wbGUpOworCisJcGVyZl9vdXRwdXRfZW5kKCZoYW5kbGUpOworfQorCiAvKgogICogR2VuZXJpYyBldmVudCBvdmVyZmxvdyBoYW5kbGluZywgc2FtcGxpbmcuCiAgKi8KQEAgLTYxMjMsNiArNjM5Miw3IEBACiAJfQogCiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZldmVudC0+aGxpc3RfZW50cnksIGhlYWQpOworCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKIAogCXJldHVybiAwOwogfQpAQCAtNjI4Niw2ICs2NTU2LDggQEAKIHN0YXRpYyBzdHJ1Y3QgcG11IHBlcmZfc3dldmVudCA9IHsKIAkudGFza19jdHhfbnIJPSBwZXJmX3N3X2NvbnRleHQsCiAKKwkuY2FwYWJpbGl0aWVzCT0gUEVSRl9QTVVfQ0FQX05PX05NSSwKKwogCS5ldmVudF9pbml0CT0gcGVyZl9zd2V2ZW50X2luaXQsCiAJLmFkZAkJPSBwZXJmX3N3ZXZlbnRfYWRkLAogCS5kZWwJCT0gcGVyZl9zd2V2ZW50X2RlbCwKQEAgLTY0MzksNiArNjcxMSw0OSBAQAogCWZ0cmFjZV9wcm9maWxlX2ZyZWVfZmlsdGVyKGV2ZW50KTsKIH0KIAorc3RhdGljIGludCBwZXJmX2V2ZW50X3NldF9icGZfcHJvZyhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIHUzMiBwcm9nX2ZkKQoreworCXN0cnVjdCBicGZfcHJvZyAqcHJvZzsKKworCWlmIChldmVudC0+YXR0ci50eXBlICE9IFBFUkZfVFlQRV9UUkFDRVBPSU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChldmVudC0+dHBfZXZlbnQtPnByb2cpCisJCXJldHVybiAtRUVYSVNUOworCisJaWYgKCEoZXZlbnQtPnRwX2V2ZW50LT5mbGFncyAmIFRSQUNFX0VWRU5UX0ZMX0tQUk9CRSkpCisJCS8qIGJwZiBwcm9ncmFtcyBjYW4gb25seSBiZSBhdHRhY2hlZCB0byBrcHJvYmVzICovCisJCXJldHVybiAtRUlOVkFMOworCisJcHJvZyA9IGJwZl9wcm9nX2dldChwcm9nX2ZkKTsKKwlpZiAoSVNfRVJSKHByb2cpKQorCQlyZXR1cm4gUFRSX0VSUihwcm9nKTsKKworCWlmIChwcm9nLT50eXBlICE9IEJQRl9QUk9HX1RZUEVfS1BST0JFKSB7CisJCS8qIHZhbGlkIGZkLCBidXQgaW52YWxpZCBicGYgcHJvZ3JhbSB0eXBlICovCisJCWJwZl9wcm9nX3B1dChwcm9nKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXZlbnQtPnRwX2V2ZW50LT5wcm9nID0gcHJvZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwZXJmX2V2ZW50X2ZyZWVfYnBmX3Byb2coc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCBicGZfcHJvZyAqcHJvZzsKKworCWlmICghZXZlbnQtPnRwX2V2ZW50KQorCQlyZXR1cm47CisKKwlwcm9nID0gZXZlbnQtPnRwX2V2ZW50LT5wcm9nOworCWlmIChwcm9nKSB7CisJCWV2ZW50LT50cF9ldmVudC0+cHJvZyA9IE5VTEw7CisJCWJwZl9wcm9nX3B1dChwcm9nKTsKKwl9Cit9CisKICNlbHNlCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX3RwX3JlZ2lzdGVyKHZvaWQpCkBAIC02NDU0LDYgKzY3NjksMTQgQEAKIHsKIH0KIAorc3RhdGljIGludCBwZXJmX2V2ZW50X3NldF9icGZfcHJvZyhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIHUzMiBwcm9nX2ZkKQoreworCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgdm9pZCBwZXJmX2V2ZW50X2ZyZWVfYnBmX3Byb2coc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworfQogI2VuZGlmIC8qIENPTkZJR19FVkVOVF9UUkFDSU5HICovCiAKICNpZmRlZiBDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UCkBAIC02NTkyLDYgKzY5MTUsNyBAQAogewogCWlmIChmbGFncyAmIFBFUkZfRUZfU1RBUlQpCiAJCWNwdV9jbG9ja19ldmVudF9zdGFydChldmVudCwgZmxhZ3MpOworCXBlcmZfZXZlbnRfdXBkYXRlX3VzZXJwYWdlKGV2ZW50KTsKIAogCXJldHVybiAwOwogfQpAQCAtNjYyOCw2ICs2OTUyLDggQEAKIHN0YXRpYyBzdHJ1Y3QgcG11IHBlcmZfY3B1X2Nsb2NrID0gewogCS50YXNrX2N0eF9ucgk9IHBlcmZfc3dfY29udGV4dCwKIAorCS5jYXBhYmlsaXRpZXMJPSBQRVJGX1BNVV9DQVBfTk9fTk1JLAorCiAJLmV2ZW50X2luaXQJPSBjcHVfY2xvY2tfZXZlbnRfaW5pdCwKIAkuYWRkCQk9IGNwdV9jbG9ja19ldmVudF9hZGQsCiAJLmRlbAkJPSBjcHVfY2xvY2tfZXZlbnRfZGVsLApAQCAtNjY2Niw2ICs2OTkyLDcgQEAKIHsKIAlpZiAoZmxhZ3MgJiBQRVJGX0VGX1NUQVJUKQogCQl0YXNrX2Nsb2NrX2V2ZW50X3N0YXJ0KGV2ZW50LCBmbGFncyk7CisJcGVyZl9ldmVudF91cGRhdGVfdXNlcnBhZ2UoZXZlbnQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NzA2LDYgKzcwMzMsOCBAQAogc3RhdGljIHN0cnVjdCBwbXUgcGVyZl90YXNrX2Nsb2NrID0gewogCS50YXNrX2N0eF9ucgk9IHBlcmZfc3dfY29udGV4dCwKIAorCS5jYXBhYmlsaXRpZXMJPSBQRVJGX1BNVV9DQVBfTk9fTk1JLAorCiAJLmV2ZW50X2luaXQJPSB0YXNrX2Nsb2NrX2V2ZW50X2luaXQsCiAJLmFkZAkJPSB0YXNrX2Nsb2NrX2V2ZW50X2FkZCwKIAkuZGVsCQk9IHRhc2tfY2xvY2tfZXZlbnRfZGVsLApAQCAtNjk4Myw2ICs3MzEyLDcgQEAKIAkJcG11LT5ldmVudF9pZHggPSBwZXJmX2V2ZW50X2lkeF9kZWZhdWx0OwogCiAJbGlzdF9hZGRfcmN1KCZwbXUtPmVudHJ5LCAmcG11cyk7CisJYXRvbWljX3NldCgmcG11LT5leGNsdXNpdmVfY250LCAwKTsKIAlyZXQgPSAwOwogdW5sb2NrOgogCW11dGV4X3VubG9jaygmcG11c19sb2NrKTsKQEAgLTcwMjcsMTIgKzczNTcsMjMgQEAKIAogc3RhdGljIGludCBwZXJmX3RyeV9pbml0X2V2ZW50KHN0cnVjdCBwbXUgKnBtdSwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogeworCXN0cnVjdCBwZXJmX2V2ZW50X2NvbnRleHQgKmN0eCA9IE5VTEw7CiAJaW50IHJldDsKIAogCWlmICghdHJ5X21vZHVsZV9nZXQocG11LT5tb2R1bGUpKQogCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChldmVudC0+Z3JvdXBfbGVhZGVyICE9IGV2ZW50KSB7CisJCWN0eCA9IHBlcmZfZXZlbnRfY3R4X2xvY2soZXZlbnQtPmdyb3VwX2xlYWRlcik7CisJCUJVR19PTighY3R4KTsKKwl9CisKIAlldmVudC0+cG11ID0gcG11OwogCXJldCA9IHBtdS0+ZXZlbnRfaW5pdChldmVudCk7CisKKwlpZiAoY3R4KQorCQlwZXJmX2V2ZW50X2N0eF91bmxvY2soZXZlbnQtPmdyb3VwX2xlYWRlciwgY3R4KTsKKwogCWlmIChyZXQpCiAJCW1vZHVsZV9wdXQocG11LT5tb2R1bGUpOwogCkBAIC03MDc5LDEwICs3NDIwLDYgQEAKIAlpZiAoZXZlbnQtPnBhcmVudCkKIAkJcmV0dXJuOwogCi0JaWYgKGhhc19icmFuY2hfc3RhY2soZXZlbnQpKSB7Ci0JCWlmICghKGV2ZW50LT5hdHRhY2hfc3RhdGUgJiBQRVJGX0FUVEFDSF9UQVNLKSkKLQkJCWF0b21pY19pbmMoJnBlcl9jcHUocGVyZl9icmFuY2hfc3RhY2tfZXZlbnRzLCBjcHUpKTsKLQl9CiAJaWYgKGlzX2Nncm91cF9ldmVudChldmVudCkpCiAJCWF0b21pY19pbmMoJnBlcl9jcHUocGVyZl9jZ3JvdXBfZXZlbnRzLCBjcHUpKTsKIH0KQEAgLTcxMjEsNyArNzQ1OCw3IEBACiAJCSBzdHJ1Y3QgcGVyZl9ldmVudCAqZ3JvdXBfbGVhZGVyLAogCQkgc3RydWN0IHBlcmZfZXZlbnQgKnBhcmVudF9ldmVudCwKIAkJIHBlcmZfb3ZlcmZsb3dfaGFuZGxlcl90IG92ZXJmbG93X2hhbmRsZXIsCi0JCSB2b2lkICpjb250ZXh0KQorCQkgdm9pZCAqY29udGV4dCwgaW50IGNncm91cF9mZCkKIHsKIAlzdHJ1Y3QgcG11ICpwbXU7CiAJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50OwpAQCAtNzE3NiwxOCArNzUxMywxOCBAQAogCiAJaWYgKHRhc2spIHsKIAkJZXZlbnQtPmF0dGFjaF9zdGF0ZSA9IFBFUkZfQVRUQUNIX1RBU0s7Ci0KLQkJaWYgKGF0dHItPnR5cGUgPT0gUEVSRl9UWVBFX1RSQUNFUE9JTlQpCi0JCQlldmVudC0+aHcudHBfdGFyZ2V0ID0gdGFzazsKLSNpZmRlZiBDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UCiAJCS8qCi0JCSAqIGh3X2JyZWFrcG9pbnQgaXMgYSBiaXQgZGlmZmljdWx0IGhlcmUuLgorCQkgKiBYWFggcG11OjpldmVudF9pbml0IG5lZWRzIHRvIGtub3cgd2hhdCB0YXNrIHRvIGFjY291bnQgdG8KKwkJICogYW5kIHdlIGNhbm5vdCB1c2UgdGhlIGN0eCBpbmZvcm1hdGlvbiBiZWNhdXNlIHdlIG5lZWQgdGhlCisJCSAqIHBtdSBiZWZvcmUgd2UgZ2V0IGEgY3R4LgogCQkgKi8KLQkJZWxzZSBpZiAoYXR0ci0+dHlwZSA9PSBQRVJGX1RZUEVfQlJFQUtQT0lOVCkKLQkJCWV2ZW50LT5ody5icF90YXJnZXQgPSB0YXNrOwotI2VuZGlmCisJCWV2ZW50LT5ody50YXJnZXQgPSB0YXNrOwogCX0KIAorCWV2ZW50LT5jbG9jayA9ICZsb2NhbF9jbG9jazsKKwlpZiAocGFyZW50X2V2ZW50KQorCQlldmVudC0+Y2xvY2sgPSBwYXJlbnRfZXZlbnQtPmNsb2NrOworCiAJaWYgKCFvdmVyZmxvd19oYW5kbGVyICYmIHBhcmVudF9ldmVudCkgewogCQlvdmVyZmxvd19oYW5kbGVyID0gcGFyZW50X2V2ZW50LT5vdmVyZmxvd19oYW5kbGVyOwogCQljb250ZXh0ID0gcGFyZW50X2V2ZW50LT5vdmVyZmxvd19oYW5kbGVyX2NvbnRleHQ7CkBAIC03MjE0LDYgKzc1NTEsMTUgQEAKIAlpZiAoYXR0ci0+aW5oZXJpdCAmJiAoYXR0ci0+cmVhZF9mb3JtYXQgJiBQRVJGX0ZPUk1BVF9HUk9VUCkpCiAJCWdvdG8gZXJyX25zOwogCisJaWYgKCFoYXNfYnJhbmNoX3N0YWNrKGV2ZW50KSkKKwkJZXZlbnQtPmF0dHIuYnJhbmNoX3NhbXBsZV90eXBlID0gMDsKKworCWlmIChjZ3JvdXBfZmQgIT0gLTEpIHsKKwkJZXJyID0gcGVyZl9jZ3JvdXBfY29ubmVjdChjZ3JvdXBfZmQsIGV2ZW50LCBhdHRyLCBncm91cF9sZWFkZXIpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfbnM7CisJfQorCiAJcG11ID0gcGVyZl9pbml0X2V2ZW50KGV2ZW50KTsKIAlpZiAoIXBtdSkKIAkJZ290byBlcnJfbnM7CkBAIC03MjIyLDIxICs3NTY4LDMwIEBACiAJCWdvdG8gZXJyX25zOwogCX0KIAorCWVyciA9IGV4Y2x1c2l2ZV9ldmVudF9pbml0KGV2ZW50KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9wbXU7CisKIAlpZiAoIWV2ZW50LT5wYXJlbnQpIHsKIAkJaWYgKGV2ZW50LT5hdHRyLnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ0FMTENIQUlOKSB7CiAJCQllcnIgPSBnZXRfY2FsbGNoYWluX2J1ZmZlcnMoKTsKIAkJCWlmIChlcnIpCi0JCQkJZ290byBlcnJfcG11OworCQkJCWdvdG8gZXJyX3Blcl90YXNrOwogCQl9CiAJfQogCiAJcmV0dXJuIGV2ZW50OwogCitlcnJfcGVyX3Rhc2s6CisJZXhjbHVzaXZlX2V2ZW50X2Rlc3Ryb3koZXZlbnQpOworCiBlcnJfcG11OgogCWlmIChldmVudC0+ZGVzdHJveSkKIAkJZXZlbnQtPmRlc3Ryb3koZXZlbnQpOwogCW1vZHVsZV9wdXQocG11LT5tb2R1bGUpOwogZXJyX25zOgorCWlmIChpc19jZ3JvdXBfZXZlbnQoZXZlbnQpKQorCQlwZXJmX2RldGFjaF9jZ3JvdXAoZXZlbnQpOwogCWlmIChldmVudC0+bnMpCiAJCXB1dF9waWRfbnMoZXZlbnQtPm5zKTsKIAlrZnJlZShldmVudCk7CkBAIC03Mzk5LDYgKzc3NTQsMTkgQEAKIAlpZiAob3V0cHV0X2V2ZW50LT5jcHUgPT0gLTEgJiYgb3V0cHV0X2V2ZW50LT5jdHggIT0gZXZlbnQtPmN0eCkKIAkJZ290byBvdXQ7CiAKKwkvKgorCSAqIE1peGluZyBjbG9ja3MgaW4gdGhlIHNhbWUgYnVmZmVyIGlzIHRyb3VibGUgeW91IGRvbid0IG5lZWQuCisJICovCisJaWYgKG91dHB1dF9ldmVudC0+Y2xvY2sgIT0gZXZlbnQtPmNsb2NrKQorCQlnb3RvIG91dDsKKworCS8qCisJICogSWYgYm90aCBldmVudHMgZ2VuZXJhdGUgYXV4IGRhdGEsIHRoZXkgbXVzdCBiZSBvbiB0aGUgc2FtZSBQTVUKKwkgKi8KKwlpZiAoaGFzX2F1eChldmVudCkgJiYgaGFzX2F1eChvdXRwdXRfZXZlbnQpICYmCisJICAgIGV2ZW50LT5wbXUgIT0gb3V0cHV0X2V2ZW50LT5wbXUpCisJCWdvdG8gb3V0OworCiBzZXQ6CiAJbXV0ZXhfbG9jaygmZXZlbnQtPm1tYXBfbXV0ZXgpOwogCS8qIENhbid0IHJlZGlyZWN0IG91dHB1dCBpZiB3ZSd2ZSBnb3QgYW4gYWN0aXZlIG1tYXAoKSAqLwpAQCAtNzQzMSw2ICs3Nzk5LDQzIEBACiAJbXV0ZXhfbG9ja19uZXN0ZWQoYiwgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwogfQogCitzdGF0aWMgaW50IHBlcmZfZXZlbnRfc2V0X2Nsb2NrKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgY2xvY2tpZF90IGNsa19pZCkKK3sKKwlib29sIG5taV9zYWZlID0gZmFsc2U7CisKKwlzd2l0Y2ggKGNsa19pZCkgeworCWNhc2UgQ0xPQ0tfTU9OT1RPTklDOgorCQlldmVudC0+Y2xvY2sgPSAma3RpbWVfZ2V0X21vbm9fZmFzdF9uczsKKwkJbm1pX3NhZmUgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfTU9OT1RPTklDX1JBVzoKKwkJZXZlbnQtPmNsb2NrID0gJmt0aW1lX2dldF9yYXdfZmFzdF9uczsKKwkJbm1pX3NhZmUgPSB0cnVlOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfUkVBTFRJTUU6CisJCWV2ZW50LT5jbG9jayA9ICZrdGltZV9nZXRfcmVhbF9uczsKKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX0JPT1RUSU1FOgorCQlldmVudC0+Y2xvY2sgPSAma3RpbWVfZ2V0X2Jvb3RfbnM7CisJCWJyZWFrOworCisJY2FzZSBDTE9DS19UQUk6CisJCWV2ZW50LT5jbG9jayA9ICZrdGltZV9nZXRfdGFpX25zOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghbm1pX3NhZmUgJiYgIShldmVudC0+cG11LT5jYXBhYmlsaXRpZXMgJiBQRVJGX1BNVV9DQVBfTk9fTk1JKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBzeXNfcGVyZl9ldmVudF9vcGVuIC0gb3BlbiBhIHBlcmZvcm1hbmNlIGV2ZW50LCBhc3NvY2lhdGUgaXQgdG8gYSB0YXNrL2NwdQogICoKQEAgLTc0NTUsNiArNzg2MCw3IEBACiAJaW50IG1vdmVfZ3JvdXAgPSAwOwogCWludCBlcnI7CiAJaW50IGZfZmxhZ3MgPSBPX1JEV1I7CisJaW50IGNncm91cF9mZCA9IC0xOwogCiAJLyogZm9yIGZ1dHVyZSBleHBhbmRhYmlsaXR5Li4uICovCiAJaWYgKGZsYWdzICYgflBFUkZfRkxBR19BTEwpCkBAIC03NTIwLDIxICs3OTI2LDE2IEBACiAKIAlnZXRfb25saW5lX2NwdXMoKTsKIAorCWlmIChmbGFncyAmIFBFUkZfRkxBR19QSURfQ0dST1VQKQorCQljZ3JvdXBfZmQgPSBwaWQ7CisKIAlldmVudCA9IHBlcmZfZXZlbnRfYWxsb2MoJmF0dHIsIGNwdSwgdGFzaywgZ3JvdXBfbGVhZGVyLCBOVUxMLAotCQkJCSBOVUxMLCBOVUxMKTsKKwkJCQkgTlVMTCwgTlVMTCwgY2dyb3VwX2ZkKTsKIAlpZiAoSVNfRVJSKGV2ZW50KSkgewogCQllcnIgPSBQVFJfRVJSKGV2ZW50KTsKIAkJZ290byBlcnJfY3B1czsKIAl9CiAKLQlpZiAoZmxhZ3MgJiBQRVJGX0ZMQUdfUElEX0NHUk9VUCkgewotCQllcnIgPSBwZXJmX2Nncm91cF9jb25uZWN0KHBpZCwgZXZlbnQsICZhdHRyLCBncm91cF9sZWFkZXIpOwotCQlpZiAoZXJyKSB7Ci0JCQlfX2ZyZWVfZXZlbnQoZXZlbnQpOwotCQkJZ290byBlcnJfY3B1czsKLQkJfQotCX0KLQogCWlmIChpc19zYW1wbGluZ19ldmVudChldmVudCkpIHsKIAkJaWYgKGV2ZW50LT5wbXUtPmNhcGFiaWxpdGllcyAmIFBFUkZfUE1VX0NBUF9OT19JTlRFUlJVUFQpIHsKIAkJCWVyciA9IC1FTk9UU1VQUDsKQEAgLTc1NTAsNiArNzk1MSwxMiBAQAogCSAqLwogCXBtdSA9IGV2ZW50LT5wbXU7CiAKKwlpZiAoYXR0ci51c2VfY2xvY2tpZCkgeworCQllcnIgPSBwZXJmX2V2ZW50X3NldF9jbG9jayhldmVudCwgYXR0ci5jbG9ja2lkKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyX2FsbG9jOworCX0KKwogCWlmIChncm91cF9sZWFkZXIgJiYKIAkgICAgKGlzX3NvZnR3YXJlX2V2ZW50KGV2ZW50KSAhPSBpc19zb2Z0d2FyZV9ldmVudChncm91cF9sZWFkZXIpKSkgewogCQlpZiAoaXNfc29mdHdhcmVfZXZlbnQoZXZlbnQpKSB7CkBAIC03NTc2LDEyICs3OTgzLDE3IEBACiAJLyoKIAkgKiBHZXQgdGhlIHRhcmdldCBjb250ZXh0ICh0YXNrIG9yIHBlcmNwdSk6CiAJICovCi0JY3R4ID0gZmluZF9nZXRfY29udGV4dChwbXUsIHRhc2ssIGV2ZW50LT5jcHUpOworCWN0eCA9IGZpbmRfZ2V0X2NvbnRleHQocG11LCB0YXNrLCBldmVudCk7CiAJaWYgKElTX0VSUihjdHgpKSB7CiAJCWVyciA9IFBUUl9FUlIoY3R4KTsKIAkJZ290byBlcnJfYWxsb2M7CiAJfQogCisJaWYgKChwbXUtPmNhcGFiaWxpdGllcyAmIFBFUkZfUE1VX0NBUF9FWENMVVNJVkUpICYmIGdyb3VwX2xlYWRlcikgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXJyX2NvbnRleHQ7CisJfQorCiAJaWYgKHRhc2spIHsKIAkJcHV0X3Rhc2tfc3RydWN0KHRhc2spOwogCQl0YXNrID0gTlVMTDsKQEAgLTc1OTksNiArODAxMSwxMSBAQAogCQkgKi8KIAkJaWYgKGdyb3VwX2xlYWRlci0+Z3JvdXBfbGVhZGVyICE9IGdyb3VwX2xlYWRlcikKIAkJCWdvdG8gZXJyX2NvbnRleHQ7CisKKwkJLyogQWxsIGV2ZW50cyBpbiBhIGdyb3VwIHNob3VsZCBoYXZlIHRoZSBzYW1lIGNsb2NrICovCisJCWlmIChncm91cF9sZWFkZXItPmNsb2NrICE9IGV2ZW50LT5jbG9jaykKKwkJCWdvdG8gZXJyX2NvbnRleHQ7CisKIAkJLyoKIAkJICogRG8gbm90IGFsbG93IHRvIGF0dGFjaCB0byBhIGdyb3VwIGluIGEgZGlmZmVyZW50CiAJCSAqIHRhc2sgb3IgQ1BVIGNvbnRleHQ6CkBAIC03Njk5LDYgKzgxMTYsMTMgQEAKIAkJZ2V0X2N0eChjdHgpOwogCX0KIAorCWlmICghZXhjbHVzaXZlX2V2ZW50X2luc3RhbGxhYmxlKGV2ZW50LCBjdHgpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJbXV0ZXhfdW5sb2NrKCZjdHgtPm11dGV4KTsKKwkJZnB1dChldmVudF9maWxlKTsKKwkJZ290byBlcnJfY29udGV4dDsKKwl9CisKIAlwZXJmX2luc3RhbGxfaW5fY29udGV4dChjdHgsIGV2ZW50LCBldmVudC0+Y3B1KTsKIAlwZXJmX3VucGluX2NvbnRleHQoY3R4KTsKIApAQCAtNzc3MSw3ICs4MTk1LDcgQEAKIAkgKi8KIAogCWV2ZW50ID0gcGVyZl9ldmVudF9hbGxvYyhhdHRyLCBjcHUsIHRhc2ssIE5VTEwsIE5VTEwsCi0JCQkJIG92ZXJmbG93X2hhbmRsZXIsIGNvbnRleHQpOworCQkJCSBvdmVyZmxvd19oYW5kbGVyLCBjb250ZXh0LCAtMSk7CiAJaWYgKElTX0VSUihldmVudCkpIHsKIAkJZXJyID0gUFRSX0VSUihldmVudCk7CiAJCWdvdG8gZXJyOwpAQCAtNzc4Miw3ICs4MjA2LDcgQEAKIAogCWFjY291bnRfZXZlbnQoZXZlbnQpOwogCi0JY3R4ID0gZmluZF9nZXRfY29udGV4dChldmVudC0+cG11LCB0YXNrLCBjcHUpOworCWN0eCA9IGZpbmRfZ2V0X2NvbnRleHQoZXZlbnQtPnBtdSwgdGFzaywgZXZlbnQpOwogCWlmIChJU19FUlIoY3R4KSkgewogCQllcnIgPSBQVFJfRVJSKGN0eCk7CiAJCWdvdG8gZXJyX2ZyZWU7CkBAIC03NzkwLDYgKzgyMTQsMTQgQEAKIAogCVdBUk5fT05fT05DRShjdHgtPnBhcmVudF9jdHgpOwogCW11dGV4X2xvY2soJmN0eC0+bXV0ZXgpOworCWlmICghZXhjbHVzaXZlX2V2ZW50X2luc3RhbGxhYmxlKGV2ZW50LCBjdHgpKSB7CisJCW11dGV4X3VubG9jaygmY3R4LT5tdXRleCk7CisJCXBlcmZfdW5waW5fY29udGV4dChjdHgpOworCQlwdXRfY3R4KGN0eCk7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKIAlwZXJmX2luc3RhbGxfaW5fY29udGV4dChjdHgsIGV2ZW50LCBjcHUpOwogCXBlcmZfdW5waW5fY29udGV4dChjdHgpOwogCW11dGV4X3VubG9jaygmY3R4LT5tdXRleCk7CkBAIC04MTMyLDcgKzg1NjQsNyBAQAogCQkJCQkgICBwYXJlbnRfZXZlbnQtPmNwdSwKIAkJCQkJICAgY2hpbGQsCiAJCQkJCSAgIGdyb3VwX2xlYWRlciwgcGFyZW50X2V2ZW50LAotCQkJCSAgICAgICAgICAgTlVMTCwgTlVMTCk7CisJCQkJCSAgIE5VTEwsIE5VTEwsIC0xKTsKIAlpZiAoSVNfRVJSKGNoaWxkX2V2ZW50KSkKIAkJcmV0dXJuIGNoaWxkX2V2ZW50OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvZXZlbnRzL2h3X2JyZWFrcG9pbnQuYyBiL2tlcm5lbC9ldmVudHMvaHdfYnJlYWtwb2ludC5jCmluZGV4IDk4MDNhNjYuLjkyY2U1ZjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ldmVudHMvaHdfYnJlYWtwb2ludC5jCisrKyBiL2tlcm5lbC9ldmVudHMvaHdfYnJlYWtwb2ludC5jCkBAIC0xMTYsMTIgKzExNiwxMiBAQAogICovCiBzdGF0aWMgaW50IHRhc2tfYnBfcGlubmVkKGludCBjcHUsIHN0cnVjdCBwZXJmX2V2ZW50ICpicCwgZW51bSBicF90eXBlX2lkeCB0eXBlKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gYnAtPmh3LmJwX3RhcmdldDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGJwLT5ody50YXJnZXQ7CiAJc3RydWN0IHBlcmZfZXZlbnQgKml0ZXI7CiAJaW50IGNvdW50ID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaXRlciwgJmJwX3Rhc2tfaGVhZCwgaHcuYnBfbGlzdCkgewotCQlpZiAoaXRlci0+aHcuYnBfdGFyZ2V0ID09IHRzayAmJgorCQlpZiAoaXRlci0+aHcudGFyZ2V0ID09IHRzayAmJgogCQkgICAgZmluZF9zbG90X2lkeChpdGVyKSA9PSB0eXBlICYmCiAJCSAgICAoaXRlci0+Y3B1IDwgMCB8fCBjcHUgPT0gaXRlci0+Y3B1KSkKIAkJCWNvdW50ICs9IGh3X2JyZWFrcG9pbnRfd2VpZ2h0KGl0ZXIpOwpAQCAtMTUzLDcgKzE1Myw3IEBACiAJCWludCBucjsKIAogCQluciA9IGluZm8tPmNwdV9waW5uZWQ7Ci0JCWlmICghYnAtPmh3LmJwX3RhcmdldCkKKwkJaWYgKCFicC0+aHcudGFyZ2V0KQogCQkJbnIgKz0gbWF4X3Rhc2tfYnBfcGlubmVkKGNwdSwgdHlwZSk7CiAJCWVsc2UKIAkJCW5yICs9IHRhc2tfYnBfcGlubmVkKGNwdSwgYnAsIHR5cGUpOwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJCXdlaWdodCA9IC13ZWlnaHQ7CiAKIAkvKiBQaW5uZWQgY291bnRlciBjcHUgcHJvZmlsaW5nICovCi0JaWYgKCFicC0+aHcuYnBfdGFyZ2V0KSB7CisJaWYgKCFicC0+aHcudGFyZ2V0KSB7CiAJCWdldF9icF9pbmZvKGJwLT5jcHUsIHR5cGUpLT5jcHVfcGlubmVkICs9IHdlaWdodDsKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvaW50ZXJuYWwuaCBiL2tlcm5lbC9ldmVudHMvaW50ZXJuYWwuaAppbmRleCA1NjliMjE4Ny4uOWY2Y2U5YiAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9pbnRlcm5hbC5oCisrKyBiL2tlcm5lbC9ldmVudHMvaW50ZXJuYWwuaApAQCAtMjcsNiArMjcsNyBAQAogCWxvY2FsX3QJCQkJbG9zdDsJCS8qIG5yIHJlY29yZHMgbG9zdCAgICovCiAKIAlsb25nCQkJCXdhdGVybWFyazsJLyogd2FrZXVwIHdhdGVybWFyayAgKi8KKwlsb25nCQkJCWF1eF93YXRlcm1hcms7CiAJLyogcG9sbCBjcmFwICovCiAJc3BpbmxvY2tfdAkJCWV2ZW50X2xvY2s7CiAJc3RydWN0IGxpc3RfaGVhZAkJZXZlbnRfbGlzdDsKQEAgLTM1LDYgKzM2LDIwIEBACiAJdW5zaWduZWQgbG9uZwkJCW1tYXBfbG9ja2VkOwogCXN0cnVjdCB1c2VyX3N0cnVjdAkJKm1tYXBfdXNlcjsKIAorCS8qIEFVWCBhcmVhICovCisJbG9jYWxfdAkJCQlhdXhfaGVhZDsKKwlsb2NhbF90CQkJCWF1eF9uZXN0OworCWxvY2FsX3QJCQkJYXV4X3dha2V1cDsKKwl1bnNpZ25lZCBsb25nCQkJYXV4X3Bnb2ZmOworCWludAkJCQlhdXhfbnJfcGFnZXM7CisJaW50CQkJCWF1eF9vdmVyd3JpdGU7CisJYXRvbWljX3QJCQlhdXhfbW1hcF9jb3VudDsKKwl1bnNpZ25lZCBsb25nCQkJYXV4X21tYXBfbG9ja2VkOworCXZvaWQJCQkJKCpmcmVlX2F1eCkodm9pZCAqKTsKKwlhdG9taWNfdAkJCWF1eF9yZWZjb3VudDsKKwl2b2lkCQkJCSoqYXV4X3BhZ2VzOworCXZvaWQJCQkJKmF1eF9wcml2OworCiAJc3RydWN0IHBlcmZfZXZlbnRfbW1hcF9wYWdlCSp1c2VyX3BhZ2U7CiAJdm9pZAkJCQkqZGF0YV9wYWdlc1swXTsKIH07CkBAIC00Myw2ICs1OCwxOSBAQAogZXh0ZXJuIHN0cnVjdCByaW5nX2J1ZmZlciAqCiByYl9hbGxvYyhpbnQgbnJfcGFnZXMsIGxvbmcgd2F0ZXJtYXJrLCBpbnQgY3B1LCBpbnQgZmxhZ3MpOwogZXh0ZXJuIHZvaWQgcGVyZl9ldmVudF93YWtldXAoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKK2V4dGVybiBpbnQgcmJfYWxsb2NfYXV4KHN0cnVjdCByaW5nX2J1ZmZlciAqcmIsIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCXBnb2ZmX3QgcGdvZmYsIGludCBucl9wYWdlcywgbG9uZyB3YXRlcm1hcmssIGludCBmbGFncyk7CitleHRlcm4gdm9pZCByYl9mcmVlX2F1eChzdHJ1Y3QgcmluZ19idWZmZXIgKnJiKTsKK2V4dGVybiBzdHJ1Y3QgcmluZ19idWZmZXIgKnJpbmdfYnVmZmVyX2dldChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpOworZXh0ZXJuIHZvaWQgcmluZ19idWZmZXJfcHV0KHN0cnVjdCByaW5nX2J1ZmZlciAqcmIpOworCitzdGF0aWMgaW5saW5lIGJvb2wgcmJfaGFzX2F1eChzdHJ1Y3QgcmluZ19idWZmZXIgKnJiKQoreworCXJldHVybiAhIXJiLT5hdXhfbnJfcGFnZXM7Cit9CisKK3ZvaWQgcGVyZl9ldmVudF9hdXhfZXZlbnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCB1bnNpZ25lZCBsb25nIGhlYWQsCisJCQkgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdTY0IGZsYWdzKTsKIAogZXh0ZXJuIHZvaWQKIHBlcmZfZXZlbnRfaGVhZGVyX19pbml0X2lkKHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAqaGVhZGVyLApAQCAtODEsNiArMTA5LDExIEBACiAJcmV0dXJuIHJiLT5ucl9wYWdlcyA8PCAoUEFHRV9TSElGVCArIHBhZ2Vfb3JkZXIocmIpKTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBlcmZfYXV4X3NpemUoc3RydWN0IHJpbmdfYnVmZmVyICpyYikKK3sKKwlyZXR1cm4gcmItPmF1eF9ucl9wYWdlcyA8PCBQQUdFX1NISUZUOworfQorCiAjZGVmaW5lIERFRklORV9PVVRQVVRfQ09QWShmdW5jX25hbWUsIG1lbWNweV9mdW5jKQkJCVwKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZwkJCQkJCVwKIGZ1bmNfbmFtZShzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCQkJCVwKZGlmZiAtLWdpdCBhL2tlcm5lbC9ldmVudHMvcmluZ19idWZmZXIuYyBiL2tlcm5lbC9ldmVudHMvcmluZ19idWZmZXIuYwppbmRleCBlYWRiOTVjLi4yMzJmMDBmIDEwMDY0NAotLS0gYS9rZXJuZWwvZXZlbnRzL3JpbmdfYnVmZmVyLmMKKysrIGIva2VybmVsL2V2ZW50cy9yaW5nX2J1ZmZlci5jCkBAIC0yNDMsMTQgKzI0MywzMTcgQEAKIAlzcGluX2xvY2tfaW5pdCgmcmItPmV2ZW50X2xvY2spOwogfQogCisvKgorICogVGhpcyBpcyBjYWxsZWQgYmVmb3JlIGhhcmR3YXJlIHN0YXJ0cyB3cml0aW5nIHRvIHRoZSBBVVggYXJlYSB0bworICogb2J0YWluIGFuIG91dHB1dCBoYW5kbGUgYW5kIG1ha2Ugc3VyZSB0aGVyZSdzIHJvb20gaW4gdGhlIGJ1ZmZlci4KKyAqIFdoZW4gdGhlIGNhcHR1cmUgY29tcGxldGVzLCBjYWxsIHBlcmZfYXV4X291dHB1dF9lbmQoKSB0byBjb21taXQKKyAqIHRoZSByZWNvcmRlZCBkYXRhIHRvIHRoZSBidWZmZXIuCisgKgorICogVGhlIG9yZGVyaW5nIGlzIHNpbWlsYXIgdG8gdGhhdCBvZiBwZXJmX291dHB1dF97YmVnaW4sZW5kfSwgd2l0aAorICogdGhlIGV4Y2VwdGlvbiBvZiAoQiksIHdoaWNoIHNob3VsZCBiZSB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBwbXUKKyAqIGRyaXZlciwgc2luY2Ugb3JkZXJpbmcgcnVsZXMgd2lsbCBkaWZmZXIgZGVwZW5kaW5nIG9uIGhhcmR3YXJlLgorICovCit2b2lkICpwZXJmX2F1eF9vdXRwdXRfYmVnaW4oc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlLAorCQkJICAgIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudCAqb3V0cHV0X2V2ZW50ID0gZXZlbnQ7CisJdW5zaWduZWQgbG9uZyBhdXhfaGVhZCwgYXV4X3RhaWw7CisJc3RydWN0IHJpbmdfYnVmZmVyICpyYjsKKworCWlmIChvdXRwdXRfZXZlbnQtPnBhcmVudCkKKwkJb3V0cHV0X2V2ZW50ID0gb3V0cHV0X2V2ZW50LT5wYXJlbnQ7CisKKwkvKgorCSAqIFNpbmNlIHRoaXMgd2lsbCB0eXBpY2FsbHkgYmUgb3BlbiBhY3Jvc3MgcG11OjphZGQvcG11OjpkZWwsIHdlCisJICogZ3JhYiByaW5nX2J1ZmZlcidzIHJlZmNvdW50IGluc3RlYWQgb2YgaG9sZGluZyByY3UgcmVhZCBsb2NrCisJICogdG8gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZGlzYXBwZWFyIHVuZGVyIHVzLgorCSAqLworCXJiID0gcmluZ19idWZmZXJfZ2V0KG91dHB1dF9ldmVudCk7CisJaWYgKCFyYikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXJiX2hhc19hdXgocmIpIHx8ICFhdG9taWNfaW5jX25vdF96ZXJvKCZyYi0+YXV4X3JlZmNvdW50KSkKKwkJZ290byBlcnI7CisKKwkvKgorCSAqIE5lc3RpbmcgaXMgbm90IHN1cHBvcnRlZCBmb3IgQVVYIGFyZWEsIG1ha2Ugc3VyZSBuZXN0ZWQKKwkgKiB3cml0ZXJzIGFyZSBjYXVnaHQgZWFybHkKKwkgKi8KKwlpZiAoV0FSTl9PTl9PTkNFKGxvY2FsX3hjaGcoJnJiLT5hdXhfbmVzdCwgMSkpKQorCQlnb3RvIGVycl9wdXQ7CisKKwlhdXhfaGVhZCA9IGxvY2FsX3JlYWQoJnJiLT5hdXhfaGVhZCk7CisKKwloYW5kbGUtPnJiID0gcmI7CisJaGFuZGxlLT5ldmVudCA9IGV2ZW50OworCWhhbmRsZS0+aGVhZCA9IGF1eF9oZWFkOworCWhhbmRsZS0+c2l6ZSA9IDA7CisKKwkvKgorCSAqIEluIG92ZXJ3cml0ZSBtb2RlLCBBVVggZGF0YSBzdG9yZXMgZG8gbm90IGRlcGVuZCBvbiBhdXhfdGFpbCwKKwkgKiB0aGVyZWZvcmUgKEEpIGNvbnRyb2wgZGVwZW5kZW5jeSBiYXJyaWVyIGRvZXMgbm90IGV4aXN0LiBUaGUKKwkgKiAoQikgPC0+IChDKSBvcmRlcmluZyBpcyBzdGlsbCBvYnNlcnZlZCBieSB0aGUgcG11IGRyaXZlci4KKwkgKi8KKwlpZiAoIXJiLT5hdXhfb3ZlcndyaXRlKSB7CisJCWF1eF90YWlsID0gQUNDRVNTX09OQ0UocmItPnVzZXJfcGFnZS0+YXV4X3RhaWwpOworCQloYW5kbGUtPndha2V1cCA9IGxvY2FsX3JlYWQoJnJiLT5hdXhfd2FrZXVwKSArIHJiLT5hdXhfd2F0ZXJtYXJrOworCQlpZiAoYXV4X2hlYWQgLSBhdXhfdGFpbCA8IHBlcmZfYXV4X3NpemUocmIpKQorCQkJaGFuZGxlLT5zaXplID0gQ0lSQ19TUEFDRShhdXhfaGVhZCwgYXV4X3RhaWwsIHBlcmZfYXV4X3NpemUocmIpKTsKKworCQkvKgorCQkgKiBoYW5kbGUtPnNpemUgY29tcHV0YXRpb24gZGVwZW5kcyBvbiBhdXhfdGFpbCBsb2FkOyB0aGlzIGZvcm1zIGEKKwkJICogY29udHJvbCBkZXBlbmRlbmN5IGJhcnJpZXIgc2VwYXJhdGluZyBhdXhfdGFpbCBsb2FkIGZyb20gYXV4IGRhdGEKKwkJICogc3RvcmUgdGhhdCB3aWxsIGJlIGVuYWJsZWQgb24gc3VjY2Vzc2Z1bCByZXR1cm4KKwkJICovCisJCWlmICghaGFuZGxlLT5zaXplKSB7IC8qIEEsIG1hdGNoZXMgRCAqLworCQkJZXZlbnQtPnBlbmRpbmdfZGlzYWJsZSA9IDE7CisJCQlwZXJmX291dHB1dF93YWtldXAoaGFuZGxlKTsKKwkJCWxvY2FsX3NldCgmcmItPmF1eF9uZXN0LCAwKTsKKwkJCWdvdG8gZXJyX3B1dDsKKwkJfQorCX0KKworCXJldHVybiBoYW5kbGUtPnJiLT5hdXhfcHJpdjsKKworZXJyX3B1dDoKKwlyYl9mcmVlX2F1eChyYik7CisKK2VycjoKKwlyaW5nX2J1ZmZlcl9wdXQocmIpOworCWhhbmRsZS0+ZXZlbnQgPSBOVUxMOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBDb21taXQgdGhlIGRhdGEgd3JpdHRlbiBieSBoYXJkd2FyZSBpbnRvIHRoZSByaW5nIGJ1ZmZlciBieSBhZGp1c3RpbmcKKyAqIGF1eF9oZWFkIGFuZCBwb3N0aW5nIGEgUEVSRl9SRUNPUkRfQVVYIGludG8gdGhlIHBlcmYgYnVmZmVyLiBJdCBpcyB0aGUKKyAqIHBtdSBkcml2ZXIncyByZXNwb25zaWJpbGl0eSB0byBvYnNlcnZlIG9yZGVyaW5nIHJ1bGVzIG9mIHRoZSBoYXJkd2FyZSwKKyAqIHNvIHRoYXQgYWxsIHRoZSBkYXRhIGlzIGV4dGVybmFsbHkgdmlzaWJsZSBiZWZvcmUgdGhpcyBpcyBjYWxsZWQuCisgKi8KK3ZvaWQgcGVyZl9hdXhfb3V0cHV0X2VuZChzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSBib29sIHRydW5jYXRlZCkKK3sKKwlzdHJ1Y3QgcmluZ19idWZmZXIgKnJiID0gaGFuZGxlLT5yYjsKKwl1bnNpZ25lZCBsb25nIGF1eF9oZWFkOworCXU2NCBmbGFncyA9IDA7CisKKwlpZiAodHJ1bmNhdGVkKQorCQlmbGFncyB8PSBQRVJGX0FVWF9GTEFHX1RSVU5DQVRFRDsKKworCS8qIGluIG92ZXJ3cml0ZSBtb2RlLCBkcml2ZXIgcHJvdmlkZXMgYXV4X2hlYWQgdmlhIGhhbmRsZSAqLworCWlmIChyYi0+YXV4X292ZXJ3cml0ZSkgeworCQlmbGFncyB8PSBQRVJGX0FVWF9GTEFHX09WRVJXUklURTsKKworCQlhdXhfaGVhZCA9IGhhbmRsZS0+aGVhZDsKKwkJbG9jYWxfc2V0KCZyYi0+YXV4X2hlYWQsIGF1eF9oZWFkKTsKKwl9IGVsc2UgeworCQlhdXhfaGVhZCA9IGxvY2FsX3JlYWQoJnJiLT5hdXhfaGVhZCk7CisJCWxvY2FsX2FkZChzaXplLCAmcmItPmF1eF9oZWFkKTsKKwl9CisKKwlpZiAoc2l6ZSB8fCBmbGFncykgeworCQkvKgorCQkgKiBPbmx5IHNlbmQgUkVDT1JEX0FVWCBpZiB3ZSBoYXZlIHNvbWV0aGluZyB1c2VmdWwgdG8gY29tbXVuaWNhdGUKKwkJICovCisKKwkJcGVyZl9ldmVudF9hdXhfZXZlbnQoaGFuZGxlLT5ldmVudCwgYXV4X2hlYWQsIHNpemUsIGZsYWdzKTsKKwl9CisKKwlhdXhfaGVhZCA9IHJiLT51c2VyX3BhZ2UtPmF1eF9oZWFkID0gbG9jYWxfcmVhZCgmcmItPmF1eF9oZWFkKTsKKworCWlmIChhdXhfaGVhZCAtIGxvY2FsX3JlYWQoJnJiLT5hdXhfd2FrZXVwKSA+PSByYi0+YXV4X3dhdGVybWFyaykgeworCQlwZXJmX291dHB1dF93YWtldXAoaGFuZGxlKTsKKwkJbG9jYWxfYWRkKHJiLT5hdXhfd2F0ZXJtYXJrLCAmcmItPmF1eF93YWtldXApOworCX0KKwloYW5kbGUtPmV2ZW50ID0gTlVMTDsKKworCWxvY2FsX3NldCgmcmItPmF1eF9uZXN0LCAwKTsKKwlyYl9mcmVlX2F1eChyYik7CisJcmluZ19idWZmZXJfcHV0KHJiKTsKK30KKworLyoKKyAqIFNraXAgb3ZlciBhIGdpdmVuIG51bWJlciBvZiBieXRlcyBpbiB0aGUgQVVYIGJ1ZmZlciwgZHVlIHRvLCBmb3IgZXhhbXBsZSwKKyAqIGhhcmR3YXJlJ3MgYWxpZ25tZW50IGNvbnN0cmFpbnRzLgorICovCitpbnQgcGVyZl9hdXhfb3V0cHV0X3NraXAoc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IHJpbmdfYnVmZmVyICpyYiA9IGhhbmRsZS0+cmI7CisJdW5zaWduZWQgbG9uZyBhdXhfaGVhZDsKKworCWlmIChzaXplID4gaGFuZGxlLT5zaXplKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCWxvY2FsX2FkZChzaXplLCAmcmItPmF1eF9oZWFkKTsKKworCWF1eF9oZWFkID0gcmItPnVzZXJfcGFnZS0+YXV4X2hlYWQgPSBsb2NhbF9yZWFkKCZyYi0+YXV4X2hlYWQpOworCWlmIChhdXhfaGVhZCAtIGxvY2FsX3JlYWQoJnJiLT5hdXhfd2FrZXVwKSA+PSByYi0+YXV4X3dhdGVybWFyaykgeworCQlwZXJmX291dHB1dF93YWtldXAoaGFuZGxlKTsKKwkJbG9jYWxfYWRkKHJiLT5hdXhfd2F0ZXJtYXJrLCAmcmItPmF1eF93YWtldXApOworCQloYW5kbGUtPndha2V1cCA9IGxvY2FsX3JlYWQoJnJiLT5hdXhfd2FrZXVwKSArCisJCQkJIHJiLT5hdXhfd2F0ZXJtYXJrOworCX0KKworCWhhbmRsZS0+aGVhZCA9IGF1eF9oZWFkOworCWhhbmRsZS0+c2l6ZSAtPSBzaXplOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgKnBlcmZfZ2V0X2F1eChzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpCit7CisJLyogdGhpcyBpcyBvbmx5IHZhbGlkIGJldHdlZW4gcGVyZl9hdXhfb3V0cHV0X2JlZ2luIGFuZCAqX2VuZCAqLworCWlmICghaGFuZGxlLT5ldmVudCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gaGFuZGxlLT5yYi0+YXV4X3ByaXY7Cit9CisKKyNkZWZpbmUgUEVSRl9BVVhfR0ZQCShHRlBfS0VSTkVMIHwgX19HRlBfWkVSTyB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpCisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqcmJfYWxsb2NfYXV4X3BhZ2UoaW50IG5vZGUsIGludCBvcmRlcikKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWlmIChvcmRlciA+IE1BWF9PUkRFUikKKwkJb3JkZXIgPSBNQVhfT1JERVI7CisKKwlkbyB7CisJCXBhZ2UgPSBhbGxvY19wYWdlc19ub2RlKG5vZGUsIFBFUkZfQVVYX0dGUCwgb3JkZXIpOworCX0gd2hpbGUgKCFwYWdlICYmIG9yZGVyLS0pOworCisJaWYgKHBhZ2UgJiYgb3JkZXIpIHsKKwkJLyoKKwkJICogQ29tbXVuaWNhdGUgdGhlIGFsbG9jYXRpb24gc2l6ZSB0byB0aGUgZHJpdmVyCisJCSAqLworCQlzcGxpdF9wYWdlKHBhZ2UsIG9yZGVyKTsKKwkJU2V0UGFnZVByaXZhdGUocGFnZSk7CisJCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgb3JkZXIpOworCX0KKworCXJldHVybiBwYWdlOworfQorCitzdGF0aWMgdm9pZCByYl9mcmVlX2F1eF9wYWdlKHN0cnVjdCByaW5nX2J1ZmZlciAqcmIsIGludCBpZHgpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocmItPmF1eF9wYWdlc1tpZHhdKTsKKworCUNsZWFyUGFnZVByaXZhdGUocGFnZSk7CisJcGFnZS0+bWFwcGluZyA9IE5VTEw7CisJX19mcmVlX3BhZ2UocGFnZSk7Cit9CisKK2ludCByYl9hbGxvY19hdXgoc3RydWN0IHJpbmdfYnVmZmVyICpyYiwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAorCQkgcGdvZmZfdCBwZ29mZiwgaW50IG5yX3BhZ2VzLCBsb25nIHdhdGVybWFyaywgaW50IGZsYWdzKQoreworCWJvb2wgb3ZlcndyaXRlID0gIShmbGFncyAmIFJJTkdfQlVGRkVSX1dSSVRBQkxFKTsKKwlpbnQgbm9kZSA9IChldmVudC0+Y3B1ID09IC0xKSA/IC0xIDogY3B1X3RvX25vZGUoZXZlbnQtPmNwdSk7CisJaW50IHJldCA9IC1FTk9NRU0sIG1heF9vcmRlciA9IDA7CisKKwlpZiAoIWhhc19hdXgoZXZlbnQpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaWYgKGV2ZW50LT5wbXUtPmNhcGFiaWxpdGllcyAmIFBFUkZfUE1VX0NBUF9BVVhfTk9fU0cpIHsKKwkJLyoKKwkJICogV2UgbmVlZCB0byBzdGFydCB3aXRoIHRoZSBtYXhfb3JkZXIgdGhhdCBmaXRzIGluIG5yX3BhZ2VzLAorCQkgKiBub3QgdGhlIG90aGVyIHdheSBhcm91bmQsIGhlbmNlIGlsb2cyKCkgYW5kIG5vdCBnZXRfb3JkZXIuCisJCSAqLworCQltYXhfb3JkZXIgPSBpbG9nMihucl9wYWdlcyk7CisKKwkJLyoKKwkJICogUE1VIHJlcXVlc3RzIG1vcmUgdGhhbiBvbmUgY29udGlndW91cyBjaHVua3Mgb2YgbWVtb3J5CisJCSAqIGZvciBTVyBkb3VibGUgYnVmZmVyaW5nCisJCSAqLworCQlpZiAoKGV2ZW50LT5wbXUtPmNhcGFiaWxpdGllcyAmIFBFUkZfUE1VX0NBUF9BVVhfU1dfRE9VQkxFQlVGKSAmJgorCQkgICAgIW92ZXJ3cml0ZSkgeworCQkJaWYgKCFtYXhfb3JkZXIpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCW1heF9vcmRlci0tOworCQl9CisJfQorCisJcmItPmF1eF9wYWdlcyA9IGt6YWxsb2Nfbm9kZShucl9wYWdlcyAqIHNpemVvZih2b2lkICopLCBHRlBfS0VSTkVMLCBub2RlKTsKKwlpZiAoIXJiLT5hdXhfcGFnZXMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmItPmZyZWVfYXV4ID0gZXZlbnQtPnBtdS0+ZnJlZV9hdXg7CisJZm9yIChyYi0+YXV4X25yX3BhZ2VzID0gMDsgcmItPmF1eF9ucl9wYWdlcyA8IG5yX3BhZ2VzOykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwkJaW50IGxhc3QsIG9yZGVyOworCisJCW9yZGVyID0gbWluKG1heF9vcmRlciwgaWxvZzIobnJfcGFnZXMgLSByYi0+YXV4X25yX3BhZ2VzKSk7CisJCXBhZ2UgPSByYl9hbGxvY19hdXhfcGFnZShub2RlLCBvcmRlcik7CisJCWlmICghcGFnZSkKKwkJCWdvdG8gb3V0OworCisJCWZvciAobGFzdCA9IHJiLT5hdXhfbnJfcGFnZXMgKyAoMSA8PCBwYWdlX3ByaXZhdGUocGFnZSkpOworCQkgICAgIGxhc3QgPiByYi0+YXV4X25yX3BhZ2VzOyByYi0+YXV4X25yX3BhZ2VzKyspCisJCQlyYi0+YXV4X3BhZ2VzW3JiLT5hdXhfbnJfcGFnZXNdID0gcGFnZV9hZGRyZXNzKHBhZ2UrKyk7CisJfQorCisJcmItPmF1eF9wcml2ID0gZXZlbnQtPnBtdS0+c2V0dXBfYXV4KGV2ZW50LT5jcHUsIHJiLT5hdXhfcGFnZXMsIG5yX3BhZ2VzLAorCQkJCQkgICAgIG92ZXJ3cml0ZSk7CisJaWYgKCFyYi0+YXV4X3ByaXYpCisJCWdvdG8gb3V0OworCisJcmV0ID0gMDsKKworCS8qCisJICogYXV4X3BhZ2VzIChhbmQgcG11IGRyaXZlcidzIHByaXZhdGUgZGF0YSwgYXV4X3ByaXYpIHdpbGwgYmUKKwkgKiByZWZlcmVuY2VkIGluIGJvdGggcHJvZHVjZXIncyBhbmQgY29uc3VtZXIncyBjb250ZXh0cywgdGh1cworCSAqIHdlIGtlZXAgYSByZWZjb3VudCBoZXJlIHRvIG1ha2Ugc3VyZSBlaXRoZXIgb2YgdGhlIHR3byBjYW4KKwkgKiByZWZlcmVuY2UgdGhlbSBzYWZlbHkuCisJICovCisJYXRvbWljX3NldCgmcmItPmF1eF9yZWZjb3VudCwgMSk7CisKKwlyYi0+YXV4X292ZXJ3cml0ZSA9IG92ZXJ3cml0ZTsKKwlyYi0+YXV4X3dhdGVybWFyayA9IHdhdGVybWFyazsKKworCWlmICghcmItPmF1eF93YXRlcm1hcmsgJiYgIXJiLT5hdXhfb3ZlcndyaXRlKQorCQlyYi0+YXV4X3dhdGVybWFyayA9IG5yX3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gMSk7CisKK291dDoKKwlpZiAoIXJldCkKKwkJcmItPmF1eF9wZ29mZiA9IHBnb2ZmOworCWVsc2UKKwkJcmJfZnJlZV9hdXgocmIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19yYl9mcmVlX2F1eChzdHJ1Y3QgcmluZ19idWZmZXIgKnJiKQoreworCWludCBwZzsKKworCWlmIChyYi0+YXV4X3ByaXYpIHsKKwkJcmItPmZyZWVfYXV4KHJiLT5hdXhfcHJpdik7CisJCXJiLT5mcmVlX2F1eCA9IE5VTEw7CisJCXJiLT5hdXhfcHJpdiA9IE5VTEw7CisJfQorCisJZm9yIChwZyA9IDA7IHBnIDwgcmItPmF1eF9ucl9wYWdlczsgcGcrKykKKwkJcmJfZnJlZV9hdXhfcGFnZShyYiwgcGcpOworCisJa2ZyZWUocmItPmF1eF9wYWdlcyk7CisJcmItPmF1eF9ucl9wYWdlcyA9IDA7Cit9CisKK3ZvaWQgcmJfZnJlZV9hdXgoc3RydWN0IHJpbmdfYnVmZmVyICpyYikKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmcmItPmF1eF9yZWZjb3VudCkpCisJCV9fcmJfZnJlZV9hdXgocmIpOworfQorCiAjaWZuZGVmIENPTkZJR19QRVJGX1VTRV9WTUFMTE9DCiAKIC8qCiAgKiBCYWNrIHBlcmZfbW1hcCgpIHdpdGggcmVndWxhciBHRlBfS0VSTkVMLTAgcGFnZXMuCiAgKi8KIAotc3RydWN0IHBhZ2UgKgotcGVyZl9tbWFwX3RvX3BhZ2Uoc3RydWN0IHJpbmdfYnVmZmVyICpyYiwgdW5zaWduZWQgbG9uZyBwZ29mZikKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqCitfX3BlcmZfbW1hcF90b19wYWdlKHN0cnVjdCByaW5nX2J1ZmZlciAqcmIsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCiB7CiAJaWYgKHBnb2ZmID4gcmItPm5yX3BhZ2VzKQogCQlyZXR1cm4gTlVMTDsKQEAgLTM0MCw4ICs2NDMsOCBAQAogCXJldHVybiByYi0+bnJfcGFnZXMgPDwgcGFnZV9vcmRlcihyYik7CiB9CiAKLXN0cnVjdCBwYWdlICoKLXBlcmZfbW1hcF90b19wYWdlKHN0cnVjdCByaW5nX2J1ZmZlciAqcmIsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCitzdGF0aWMgc3RydWN0IHBhZ2UgKgorX19wZXJmX21tYXBfdG9fcGFnZShzdHJ1Y3QgcmluZ19idWZmZXIgKnJiLCB1bnNpZ25lZCBsb25nIHBnb2ZmKQogewogCS8qIFRoZSAnPicgY291bnRzIGluIHRoZSB1c2VyIHBhZ2UuICovCiAJaWYgKHBnb2ZmID4gZGF0YV9wYWdlX25yKHJiKSkKQEAgLTQxNiwzICs3MTksMTkgQEAKIH0KIAogI2VuZGlmCisKK3N0cnVjdCBwYWdlICoKK3BlcmZfbW1hcF90b19wYWdlKHN0cnVjdCByaW5nX2J1ZmZlciAqcmIsIHVuc2lnbmVkIGxvbmcgcGdvZmYpCit7CisJaWYgKHJiLT5hdXhfbnJfcGFnZXMpIHsKKwkJLyogYWJvdmUgQVVYIHNwYWNlICovCisJCWlmIChwZ29mZiA+IHJiLT5hdXhfcGdvZmYgKyByYi0+YXV4X25yX3BhZ2VzKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJLyogQVVYIHNwYWNlICovCisJCWlmIChwZ29mZiA+PSByYi0+YXV4X3Bnb2ZmKQorCQkJcmV0dXJuIHZpcnRfdG9fcGFnZShyYi0+YXV4X3BhZ2VzW3Bnb2ZmIC0gcmItPmF1eF9wZ29mZl0pOworCX0KKworCXJldHVybiBfX3BlcmZfbW1hcF90b19wYWdlKHJiLCBwZ29mZik7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvZXhlY19kb21haW4uYyBiL2tlcm5lbC9leGVjX2RvbWFpbi5jCmluZGV4IDgzZDQzODIuLjY4NzNiYjMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGVjX2RvbWFpbi5jCisrKyBiL2tlcm5lbC9leGVjX2RvbWFpbi5jCkBAIC0yMCwxNDUgKzIwLDEwIEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9mc19zdHJ1Y3QuaD4KIAotCi1zdGF0aWMgdm9pZCBkZWZhdWx0X2hhbmRsZXIoaW50LCBzdHJ1Y3QgcHRfcmVncyAqKTsKLQotc3RhdGljIHN0cnVjdCBleGVjX2RvbWFpbiAqZXhlY19kb21haW5zID0gJmRlZmF1bHRfZXhlY19kb21haW47Ci1zdGF0aWMgREVGSU5FX1JXTE9DSyhleGVjX2RvbWFpbnNfbG9jayk7Ci0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgaWRlbnRfbWFwWzMyXSA9IHsKLQkwLAkxLAkyLAkzLAk0LAk1LAk2LAk3LAotCTgsCTksCTEwLAkxMSwJMTIsCTEzLAkxNCwJMTUsCi0JMTYsCTE3LAkxOCwJMTksCTIwLAkyMSwJMjIsCTIzLAotCTI0LAkyNSwJMjYsCTI3LAkyOCwJMjksCTMwLAkzMQotfTsKLQotc3RydWN0IGV4ZWNfZG9tYWluIGRlZmF1bHRfZXhlY19kb21haW4gPSB7Ci0JLm5hbWUJCT0gIkxpbnV4IiwJCS8qIG5hbWUgKi8KLQkuaGFuZGxlcgk9IGRlZmF1bHRfaGFuZGxlciwJLyogbGNhbGw3IGNhdXNlcyBhIHNlZyBmYXVsdC4gKi8KLQkucGVyc19sb3cJPSAwLAkJCS8qIFBFUl9MSU5VWCBwZXJzb25hbGl0eS4gKi8KLQkucGVyc19oaWdoCT0gMCwJCQkvKiBQRVJfTElOVVggcGVyc29uYWxpdHkuICovCi0JLnNpZ25hbF9tYXAJPSBpZGVudF9tYXAsCQkvKiBJZGVudGl0eSBtYXAgc2lnbmFscy4gKi8KLQkuc2lnbmFsX2ludm1hcAk9IGlkZW50X21hcCwJCS8qICAtIGJvdGggd2F5cy4gKi8KLX07Ci0KLQotc3RhdGljIHZvaWQKLWRlZmF1bHRfaGFuZGxlcihpbnQgc2VnbWVudCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3ApCi17Ci0Jc2V0X3BlcnNvbmFsaXR5KDApOwotCi0JaWYgKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW4tPmhhbmRsZXIgIT0gZGVmYXVsdF9oYW5kbGVyKQotCQljdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluLT5oYW5kbGVyKHNlZ21lbnQsIHJlZ3ApOwotCWVsc2UKLQkJc2VuZF9zaWcoU0lHU0VHViwgY3VycmVudCwgMSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZXhlY19kb21haW4gKgotbG9va3VwX2V4ZWNfZG9tYWluKHVuc2lnbmVkIGludCBwZXJzb25hbGl0eSkKLXsKLQl1bnNpZ25lZCBpbnQgcGVycyA9IHBlcnNvbmFsaXR5KHBlcnNvbmFsaXR5KTsKLQlzdHJ1Y3QgZXhlY19kb21haW4gKmVwOwotCi0JcmVhZF9sb2NrKCZleGVjX2RvbWFpbnNfbG9jayk7Ci0JZm9yIChlcCA9IGV4ZWNfZG9tYWluczsgZXA7IGVwID0gZXAtPm5leHQpIHsKLQkJaWYgKHBlcnMgPj0gZXAtPnBlcnNfbG93ICYmIHBlcnMgPD0gZXAtPnBlcnNfaGlnaCkKLQkJCWlmICh0cnlfbW9kdWxlX2dldChlcC0+bW9kdWxlKSkKLQkJCQlnb3RvIG91dDsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfTU9EVUxFUwotCXJlYWRfdW5sb2NrKCZleGVjX2RvbWFpbnNfbG9jayk7Ci0JcmVxdWVzdF9tb2R1bGUoInBlcnNvbmFsaXR5LSVkIiwgcGVycyk7Ci0JcmVhZF9sb2NrKCZleGVjX2RvbWFpbnNfbG9jayk7Ci0KLQlmb3IgKGVwID0gZXhlY19kb21haW5zOyBlcDsgZXAgPSBlcC0+bmV4dCkgewotCQlpZiAocGVycyA+PSBlcC0+cGVyc19sb3cgJiYgcGVycyA8PSBlcC0+cGVyc19oaWdoKQotCQkJaWYgKHRyeV9tb2R1bGVfZ2V0KGVwLT5tb2R1bGUpKQotCQkJCWdvdG8gb3V0OwotCX0KLSNlbmRpZgotCi0JZXAgPSAmZGVmYXVsdF9leGVjX2RvbWFpbjsKLW91dDoKLQlyZWFkX3VubG9jaygmZXhlY19kb21haW5zX2xvY2spOwotCXJldHVybiBlcDsKLX0KLQotaW50Ci1yZWdpc3Rlcl9leGVjX2RvbWFpbihzdHJ1Y3QgZXhlY19kb21haW4gKmVwKQotewotCXN0cnVjdCBleGVjX2RvbWFpbgkqdG1wOwotCWludAkJCWVyciA9IC1FQlVTWTsKLQotCWlmIChlcCA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChlcC0+bmV4dCAhPSBOVUxMKQotCQlyZXR1cm4gLUVCVVNZOwotCi0Jd3JpdGVfbG9jaygmZXhlY19kb21haW5zX2xvY2spOwotCWZvciAodG1wID0gZXhlY19kb21haW5zOyB0bXA7IHRtcCA9IHRtcC0+bmV4dCkgewotCQlpZiAodG1wID09IGVwKQotCQkJZ290byBvdXQ7Ci0JfQotCi0JZXAtPm5leHQgPSBleGVjX2RvbWFpbnM7Ci0JZXhlY19kb21haW5zID0gZXA7Ci0JZXJyID0gMDsKLQotb3V0OgotCXdyaXRlX3VubG9jaygmZXhlY19kb21haW5zX2xvY2spOwotCXJldHVybiBlcnI7Ci19Ci1FWFBPUlRfU1lNQk9MKHJlZ2lzdGVyX2V4ZWNfZG9tYWluKTsKLQotaW50Ci11bnJlZ2lzdGVyX2V4ZWNfZG9tYWluKHN0cnVjdCBleGVjX2RvbWFpbiAqZXApCi17Ci0Jc3RydWN0IGV4ZWNfZG9tYWluCSoqZXBwOwotCi0JZXBwID0gJmV4ZWNfZG9tYWluczsKLQl3cml0ZV9sb2NrKCZleGVjX2RvbWFpbnNfbG9jayk7Ci0JZm9yIChlcHAgPSAmZXhlY19kb21haW5zOyAqZXBwOyBlcHAgPSAmKCplcHApLT5uZXh0KSB7Ci0JCWlmIChlcCA9PSAqZXBwKQotCQkJZ290byB1bnJlZ2lzdGVyOwotCX0KLQl3cml0ZV91bmxvY2soJmV4ZWNfZG9tYWluc19sb2NrKTsKLQlyZXR1cm4gLUVJTlZBTDsKLQotdW5yZWdpc3RlcjoKLQkqZXBwID0gZXAtPm5leHQ7Ci0JZXAtPm5leHQgPSBOVUxMOwotCXdyaXRlX3VubG9jaygmZXhlY19kb21haW5zX2xvY2spOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2V4ZWNfZG9tYWluKTsKLQotaW50IF9fc2V0X3BlcnNvbmFsaXR5KHVuc2lnbmVkIGludCBwZXJzb25hbGl0eSkKLXsKLQlzdHJ1Y3QgZXhlY19kb21haW4gKm9lcCA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZXhlY19kb21haW47Ci0KLQljdXJyZW50X3RocmVhZF9pbmZvKCktPmV4ZWNfZG9tYWluID0gbG9va3VwX2V4ZWNfZG9tYWluKHBlcnNvbmFsaXR5KTsKLQljdXJyZW50LT5wZXJzb25hbGl0eSA9IHBlcnNvbmFsaXR5OwotCW1vZHVsZV9wdXQob2VwLT5tb2R1bGUpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fc2V0X3BlcnNvbmFsaXR5KTsKLQogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgaW50IGV4ZWNkb21haW5zX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IGV4ZWNfZG9tYWluCSplcDsKLQotCXJlYWRfbG9jaygmZXhlY19kb21haW5zX2xvY2spOwotCWZvciAoZXAgPSBleGVjX2RvbWFpbnM7IGVwOyBlcCA9IGVwLT5uZXh0KQotCQlzZXFfcHJpbnRmKG0sICIlZC0lZFx0JS0xNnNcdFslc11cbiIsCi0JCQkgICAgICAgZXAtPnBlcnNfbG93LCBlcC0+cGVyc19oaWdoLCBlcC0+bmFtZSwKLQkJCSAgICAgICBtb2R1bGVfbmFtZShlcC0+bW9kdWxlKSk7Ci0JcmVhZF91bmxvY2soJmV4ZWNfZG9tYWluc19sb2NrKTsKKwlzZXFfcHV0cyhtLCAiMC0wXHRMaW51eCAgICAgICAgICAgXHRba2VybmVsXVxuIik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IGZlZmYxMGIuLjIyZmNjMDUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtNzU2LDggKzc1Niw2IEBACiAKIAljZ3JvdXBfZXhpdCh0c2spOwogCi0JbW9kdWxlX3B1dCh0YXNrX3RocmVhZF9pbmZvKHRzayktPmV4ZWNfZG9tYWluLT5tb2R1bGUpOwotCiAJLyoKIAkgKiBGSVhNRTogZG8gdGhhdCBvbmx5IHdoZW4gbmVlZGVkLCB1c2luZyBzY2hlZF9leGl0IHRyYWNlcG9pbnQKIAkgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9mb3JrLmMgYi9rZXJuZWwvZm9yay5jCmluZGV4IGNmNjUxMzkuLmYyYzFlNzMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mb3JrLmMKKysrIGIva2VybmVsL2ZvcmsuYwpAQCAtMTI3OSw5ICsxMjc5LDYgQEAKIAlpZiAobnJfdGhyZWFkcyA+PSBtYXhfdGhyZWFkcykKIAkJZ290byBiYWRfZm9ya19jbGVhbnVwX2NvdW50OwogCi0JaWYgKCF0cnlfbW9kdWxlX2dldCh0YXNrX3RocmVhZF9pbmZvKHApLT5leGVjX2RvbWFpbi0+bW9kdWxlKSkKLQkJZ290byBiYWRfZm9ya19jbGVhbnVwX2NvdW50OwotCiAJZGVsYXlhY2N0X3Rza19pbml0KHApOwkvKiBNdXN0IHJlbWFpbiBhZnRlciBkdXBfdGFza19zdHJ1Y3QoKSAqLwogCXAtPmZsYWdzICY9IH4oUEZfU1VQRVJQUklWIHwgUEZfV1FfV09SS0VSKTsKIAlwLT5mbGFncyB8PSBQRl9GT1JLTk9FWEVDOwpAQCAtMTU5MCw3ICsxNTg3LDYgQEAKIAlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9USFJFQUQpCiAJCXRocmVhZGdyb3VwX2NoYW5nZV9lbmQoY3VycmVudCk7CiAJZGVsYXlhY2N0X3Rza19mcmVlKHApOwotCW1vZHVsZV9wdXQodGFza190aHJlYWRfaW5mbyhwKS0+ZXhlY19kb21haW4tPm1vZHVsZSk7CiBiYWRfZm9ya19jbGVhbnVwX2NvdW50OgogCWF0b21pY19kZWMoJnAtPmNyZWQtPnVzZXItPnByb2Nlc3Nlcyk7CiAJZXhpdF9jcmVkcyhwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggMmE1ZTM4My4uMjU3OWU0MCAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTkwMCw3ICs5MDAsNyBAQAogCWlmICghcCkKIAkJcmV0dXJuIC1FU1JDSDsKIAotCWlmICghcC0+bW0pIHsKKwlpZiAodW5saWtlbHkocC0+ZmxhZ3MgJiBQRl9LVEhSRUFEKSkgewogCQlwdXRfdGFza19zdHJ1Y3QocCk7CiAJCXJldHVybiAtRVBFUk07CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2dyb3Vwcy5jIGIva2VybmVsL2dyb3Vwcy5jCmluZGV4IDY2NDQxMWYuLjc0ZDQzMWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ncm91cHMuYworKysgYi9rZXJuZWwvZ3JvdXBzLmMKQEAgLTksOSArOSw2IEBACiAjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCi0vKiBpbml0IHRvIDIgLSBvbmUgZm9yIGluaXRfdGFzaywgb25lIHRvIGVuc3VyZSBpdCBpcyBuZXZlciBmcmVlZCAqLwotc3RydWN0IGdyb3VwX2luZm8gaW5pdF9ncm91cHMgPSB7IC51c2FnZSA9IEFUT01JQ19JTklUKDIpIH07Ci0KIHN0cnVjdCBncm91cF9pbmZvICpncm91cHNfYWxsb2MoaW50IGdpZHNldHNpemUpCiB7CiAJc3RydWN0IGdyb3VwX2luZm8gKmdyb3VwX2luZm87CmRpZmYgLS1naXQgYS9rZXJuZWwvaHVuZ190YXNrLmMgYi9rZXJuZWwvaHVuZ190YXNrLmMKaW5kZXggMDZkYjEyNC4uZTBmOTBjMiAxMDA2NDQKLS0tIGEva2VybmVsL2h1bmdfdGFzay5jCisrKyBiL2tlcm5lbC9odW5nX3Rhc2suYwpAQCAtMTY5LDcgKzE2OSw3IEBACiAJCXJldHVybjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlkb19lYWNoX3RocmVhZChnLCB0KSB7CisJZm9yX2VhY2hfcHJvY2Vzc190aHJlYWQoZywgdCkgewogCQlpZiAoIW1heF9jb3VudC0tKQogCQkJZ290byB1bmxvY2s7CiAJCWlmICghLS1iYXRjaF9jb3VudCkgewpAQCAtMTgwLDcgKzE4MCw3IEBACiAJCS8qIHVzZSAiPT0iIHRvIHNraXAgdGhlIFRBU0tfS0lMTEFCTEUgdGFza3Mgd2FpdGluZyBvbiBORlMgKi8KIAkJaWYgKHQtPnN0YXRlID09IFRBU0tfVU5JTlRFUlJVUFRJQkxFKQogCQkJY2hlY2tfaHVuZ190YXNrKHQsIHRpbWVvdXQpOwotCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgdCk7CisJfQogIHVubG9jazoKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvY2hpcC5jIGIva2VybmVsL2lycS9jaGlwLmMKaW5kZXggNmYxYzdhNS4uZWI5YTRlYSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9jaGlwLmMKKysrIGIva2VybmVsL2lycS9jaGlwLmMKQEAgLTk0OCw2ICs5NDgsMjIgQEAKIAogCXJldHVybiAtRU5PU1lTOwogfQorCisvKioKKyAqIGlycV9jaGlwX3NldF93YWtlX3BhcmVudCAtIFNldC9yZXNldCB3YWtlLXVwIG9uIHRoZSBwYXJlbnQgaW50ZXJydXB0CisgKiBAZGF0YToJUG9pbnRlciB0byBpbnRlcnJ1cHQgc3BlY2lmaWMgZGF0YQorICogQG9uOgkJV2hldGhlciB0byBzZXQgb3IgcmVzZXQgdGhlIHdha2UtdXAgY2FwYWJpbGl0eSBvZiB0aGlzIGlycQorICoKKyAqIENvbmRpdGlvbmFsLCBhcyB0aGUgdW5kZXJseWluZyBwYXJlbnQgY2hpcCBtaWdodCBub3QgaW1wbGVtZW50IGl0LgorICovCitpbnQgaXJxX2NoaXBfc2V0X3dha2VfcGFyZW50KHN0cnVjdCBpcnFfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IG9uKQoreworCWRhdGEgPSBkYXRhLT5wYXJlbnRfZGF0YTsKKwlpZiAoZGF0YS0+Y2hpcC0+aXJxX3NldF93YWtlKQorCQlyZXR1cm4gZGF0YS0+Y2hpcC0+aXJxX3NldF93YWtlKGRhdGEsIG9uKTsKKworCXJldHVybiAtRU5PU1lTOworfQogI2VuZGlmCiAKIC8qKgpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9tYW5hZ2UuYyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKaW5kZXggODg2ZDA5ZS4uZTY4OTMyYiAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9tYW5hZ2UuYworKysgYi9rZXJuZWwvaXJxL21hbmFnZS5jCkBAIC02OCwxNCArNjgsMjAgQEAKICAqCURvIG5vdCB1c2UgdGhpcyBmb3Igc2h1dGRvd24gc2NlbmFyaW9zIHdoZXJlIHlvdSBtdXN0IGJlIHN1cmUKICAqCXRoYXQgYWxsIHBhcnRzIChoYXJkaXJxIGFuZCB0aHJlYWRlZCBoYW5kbGVyKSBoYXZlIGNvbXBsZXRlZC4KICAqCisgKglSZXR1cm5zOiBmYWxzZSBpZiBhIHRocmVhZGVkIGhhbmRsZXIgaXMgYWN0aXZlLgorICoKICAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCAtIHdpdGggY2FyZSAtIGZyb20gSVJRIGNvbnRleHQuCiAgKi8KLXZvaWQgc3luY2hyb25pemVfaGFyZGlycSh1bnNpZ25lZCBpbnQgaXJxKQorYm9vbCBzeW5jaHJvbml6ZV9oYXJkaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAotCWlmIChkZXNjKQorCWlmIChkZXNjKSB7CiAJCV9fc3luY2hyb25pemVfaGFyZGlycShkZXNjKTsKKwkJcmV0dXJuICFhdG9taWNfcmVhZCgmZGVzYy0+dGhyZWFkc19hY3RpdmUpOworCX0KKworCXJldHVybiB0cnVlOwogfQogRVhQT1JUX1NZTUJPTChzeW5jaHJvbml6ZV9oYXJkaXJxKTsKIApAQCAtNDQwLDYgKzQ0NiwzMiBAQAogfQogRVhQT1JUX1NZTUJPTChkaXNhYmxlX2lycSk7CiAKKy8qKgorICoJZGlzYWJsZV9oYXJkaXJxIC0gZGlzYWJsZXMgYW4gaXJxIGFuZCB3YWl0cyBmb3IgaGFyZGlycSBjb21wbGV0aW9uCisgKglAaXJxOiBJbnRlcnJ1cHQgdG8gZGlzYWJsZQorICoKKyAqCURpc2FibGUgdGhlIHNlbGVjdGVkIGludGVycnVwdCBsaW5lLiAgRW5hYmxlcyBhbmQgRGlzYWJsZXMgYXJlCisgKgluZXN0ZWQuCisgKglUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciBhbnkgcGVuZGluZyBoYXJkIElSUSBoYW5kbGVycyBmb3IgdGhpcworICoJaW50ZXJydXB0IHRvIGNvbXBsZXRlIGJlZm9yZSByZXR1cm5pbmcuIElmIHlvdSB1c2UgdGhpcyBmdW5jdGlvbiB3aGlsZQorICoJaG9sZGluZyBhIHJlc291cmNlIHRoZSBoYXJkIElSUSBoYW5kbGVyIG1heSBuZWVkIHlvdSB3aWxsIGRlYWRsb2NrLgorICoKKyAqCVdoZW4gdXNlZCB0byBvcHRpbWlzdGljYWxseSBkaXNhYmxlIGFuIGludGVycnVwdCBmcm9tIGF0b21pYyBjb250ZXh0CisgKgl0aGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgY2hlY2tlZC4KKyAqCisgKglSZXR1cm5zOiBmYWxzZSBpZiBhIHRocmVhZGVkIGhhbmRsZXIgaXMgYWN0aXZlLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCAtIHdpdGggY2FyZSAtIGZyb20gSVJRIGNvbnRleHQuCisgKi8KK2Jvb2wgZGlzYWJsZV9oYXJkaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJaWYgKCFfX2Rpc2FibGVfaXJxX25vc3luYyhpcnEpKQorCQlyZXR1cm4gc3luY2hyb25pemVfaGFyZGlycShpcnEpOworCisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGlzYWJsZV9oYXJkaXJxKTsKKwogdm9pZCBfX2VuYWJsZV9pcnEoc3RydWN0IGlycV9kZXNjICpkZXNjLCB1bnNpZ25lZCBpbnQgaXJxKQogewogCXN3aXRjaCAoZGVzYy0+ZGVwdGgpIHsKQEAgLTE3NjYsMyArMTc5OCw5NCBAQAogCiAJcmV0dXJuIHJldHZhbDsKIH0KKworLyoqCisgKglpcnFfZ2V0X2lycWNoaXBfc3RhdGUgLSByZXR1cm5zIHRoZSBpcnFjaGlwIHN0YXRlIG9mIGEgaW50ZXJydXB0LgorICoJQGlycTogSW50ZXJydXB0IGxpbmUgdGhhdCBpcyBmb3J3YXJkZWQgdG8gYSBWTQorICoJQHdoaWNoOiBPbmUgb2YgSVJRQ0hJUF9TVEFURV8qIHRoZSBjYWxsZXIgd2FudHMgdG8ga25vdyBhYm91dAorICoJQHN0YXRlOiBhIHBvaW50ZXIgdG8gYSBib29sZWFuIHdoZXJlIHRoZSBzdGF0ZSBpcyB0byBiZSBzdG9yZWVkCisgKgorICoJVGhpcyBjYWxsIHNuYXBzaG90cyB0aGUgaW50ZXJuYWwgaXJxY2hpcCBzdGF0ZSBvZiBhbgorICoJaW50ZXJydXB0LCByZXR1cm5pbmcgaW50byBAc3RhdGUgdGhlIGJpdCBjb3JyZXNwb25kaW5nIHRvCisgKglzdGFnZSBAd2hpY2gKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBwcmVlbXB0aW9uIGRpc2FibGVkIGlmIHRoZQorICoJaW50ZXJydXB0IGNvbnRyb2xsZXIgaGFzIHBlci1jcHUgcmVnaXN0ZXJzLgorICovCitpbnQgaXJxX2dldF9pcnFjaGlwX3N0YXRlKHVuc2lnbmVkIGludCBpcnEsIGVudW0gaXJxY2hpcF9pcnFfc3RhdGUgd2hpY2gsCisJCQkgIGJvb2wgKnN0YXRlKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGE7CisJc3RydWN0IGlycV9jaGlwICpjaGlwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlkZXNjID0gaXJxX2dldF9kZXNjX2J1c2xvY2soaXJxLCAmZmxhZ3MsIDApOworCWlmICghZGVzYykKKwkJcmV0dXJuIGVycjsKKworCWRhdGEgPSBpcnFfZGVzY19nZXRfaXJxX2RhdGEoZGVzYyk7CisKKwlkbyB7CisJCWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXAoZGF0YSk7CisJCWlmIChjaGlwLT5pcnFfZ2V0X2lycWNoaXBfc3RhdGUpCisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfSVJRX0RPTUFJTl9ISUVSQVJDSFkKKwkJZGF0YSA9IGRhdGEtPnBhcmVudF9kYXRhOworI2Vsc2UKKwkJZGF0YSA9IE5VTEw7CisjZW5kaWYKKwl9IHdoaWxlIChkYXRhKTsKKworCWlmIChkYXRhKQorCQllcnIgPSBjaGlwLT5pcnFfZ2V0X2lycWNoaXBfc3RhdGUoZGF0YSwgd2hpY2gsIHN0YXRlKTsKKworCWlycV9wdXRfZGVzY19idXN1bmxvY2soZGVzYywgZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICoJaXJxX3NldF9pcnFjaGlwX3N0YXRlIC0gc2V0IHRoZSBzdGF0ZSBvZiBhIGZvcndhcmRlZCBpbnRlcnJ1cHQuCisgKglAaXJxOiBJbnRlcnJ1cHQgbGluZSB0aGF0IGlzIGZvcndhcmRlZCB0byBhIFZNCisgKglAd2hpY2g6IFN0YXRlIHRvIGJlIHJlc3RvcmVkIChvbmUgb2YgSVJRQ0hJUF9TVEFURV8qKQorICoJQHZhbDogVmFsdWUgY29ycmVzcG9uZGluZyB0byBAd2hpY2gKKyAqCisgKglUaGlzIGNhbGwgc2V0cyB0aGUgaW50ZXJuYWwgaXJxY2hpcCBzdGF0ZSBvZiBhbiBpbnRlcnJ1cHQsCisgKglkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIEB3aGljaC4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBwcmVlbXB0aW9uIGRpc2FibGVkIGlmIHRoZQorICoJaW50ZXJydXB0IGNvbnRyb2xsZXIgaGFzIHBlci1jcHUgcmVnaXN0ZXJzLgorICovCitpbnQgaXJxX3NldF9pcnFjaGlwX3N0YXRlKHVuc2lnbmVkIGludCBpcnEsIGVudW0gaXJxY2hpcF9pcnFfc3RhdGUgd2hpY2gsCisJCQkgIGJvb2wgdmFsKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgaXJxX2RhdGEgKmRhdGE7CisJc3RydWN0IGlycV9jaGlwICpjaGlwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVyciA9IC1FSU5WQUw7CisKKwlkZXNjID0gaXJxX2dldF9kZXNjX2J1c2xvY2soaXJxLCAmZmxhZ3MsIDApOworCWlmICghZGVzYykKKwkJcmV0dXJuIGVycjsKKworCWRhdGEgPSBpcnFfZGVzY19nZXRfaXJxX2RhdGEoZGVzYyk7CisKKwlkbyB7CisJCWNoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXAoZGF0YSk7CisJCWlmIChjaGlwLT5pcnFfc2V0X2lycWNoaXBfc3RhdGUpCisJCQlicmVhazsKKyNpZmRlZiBDT05GSUdfSVJRX0RPTUFJTl9ISUVSQVJDSFkKKwkJZGF0YSA9IGRhdGEtPnBhcmVudF9kYXRhOworI2Vsc2UKKwkJZGF0YSA9IE5VTEw7CisjZW5kaWYKKwl9IHdoaWxlIChkYXRhKTsKKworCWlmIChkYXRhKQorCQllcnIgPSBjaGlwLT5pcnFfc2V0X2lycWNoaXBfc3RhdGUoZGF0YSwgd2hpY2gsIHZhbCk7CisKKwlpcnFfcHV0X2Rlc2NfYnVzdW5sb2NrKGRlc2MsIGZsYWdzKTsKKwlyZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9tc2kuYyBiL2tlcm5lbC9pcnEvbXNpLmMKaW5kZXggM2UxODE2My4uNDc0ZGU1YyAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9tc2kuYworKysgYi9rZXJuZWwvaXJxL21zaS5jCkBAIC0zMTAsOCArMzEwLDE1IEBACiAJc3RydWN0IG1zaV9kZXNjICpkZXNjOwogCiAJZm9yX2VhY2hfbXNpX2VudHJ5KGRlc2MsIGRldikgewotCQlpcnFfZG9tYWluX2ZyZWVfaXJxcyhkZXNjLT5pcnEsIGRlc2MtPm52ZWNfdXNlZCk7Ci0JCWRlc2MtPmlycSA9IDA7CisJCS8qCisJCSAqIFdlIG1pZ2h0IGhhdmUgZmFpbGVkIHRvIGFsbG9jYXRlIGFuIE1TSSBlYXJseQorCQkgKiBlbm91Z2ggdGhhdCB0aGVyZSBpcyBubyBJUlEgYXNzb2NpYXRlZCB0byB0aGlzCisJCSAqIGVudHJ5LiBJZiB0aGF0J3MgdGhlIGNhc2UsIGRvbid0IGRvIGFueXRoaW5nLgorCQkgKi8KKwkJaWYgKGRlc2MtPmlycSkgeworCQkJaXJxX2RvbWFpbl9mcmVlX2lycXMoZGVzYy0+aXJxLCBkZXNjLT5udmVjX3VzZWQpOworCQkJZGVzYy0+aXJxID0gMDsKKwkJfQogCX0KIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL2xpdmVwYXRjaC9jb3JlLmMgYi9rZXJuZWwvbGl2ZXBhdGNoL2NvcmUuYwppbmRleCAwMWNhMDg4Li4yODRlMjY5IDEwMDY0NAotLS0gYS9rZXJuZWwvbGl2ZXBhdGNoL2NvcmUuYworKysgYi9rZXJuZWwvbGl2ZXBhdGNoL2NvcmUuYwpAQCAtODksMTYgKzg5LDI4IEBACiAvKiBzZXRzIG9iai0+bW9kIGlmIG9iamVjdCBpcyBub3Qgdm1saW51eCBhbmQgbW9kdWxlIGlzIGZvdW5kICovCiBzdGF0aWMgdm9pZCBrbHBfZmluZF9vYmplY3RfbW9kdWxlKHN0cnVjdCBrbHBfb2JqZWN0ICpvYmopCiB7CisJc3RydWN0IG1vZHVsZSAqbW9kOworCiAJaWYgKCFrbHBfaXNfbW9kdWxlKG9iaikpCiAJCXJldHVybjsKIAogCW11dGV4X2xvY2soJm1vZHVsZV9tdXRleCk7CiAJLyoKLQkgKiBXZSBkb24ndCBuZWVkIHRvIHRha2UgYSByZWZlcmVuY2Ugb24gdGhlIG1vZHVsZSBoZXJlIGJlY2F1c2Ugd2UgaGF2ZQotCSAqIHRoZSBrbHBfbXV0ZXgsIHdoaWNoIGlzIGFsc28gdGFrZW4gYnkgdGhlIG1vZHVsZSBub3RpZmllci4gIFRoaXMKLQkgKiBwcmV2ZW50cyBhbnkgbW9kdWxlIGZyb20gdW5sb2FkaW5nIHVudGlsIHdlIHJlbGVhc2UgdGhlIGtscF9tdXRleC4KKwkgKiBXZSBkbyBub3Qgd2FudCB0byBibG9jayByZW1vdmFsIG9mIHBhdGNoZWQgbW9kdWxlcyBhbmQgdGhlcmVmb3JlCisJICogd2UgZG8gbm90IHRha2UgYSByZWZlcmVuY2UgaGVyZS4gVGhlIHBhdGNoZXMgYXJlIHJlbW92ZWQgYnkKKwkgKiBhIGdvaW5nIG1vZHVsZSBoYW5kbGVyIGluc3RlYWQuCiAJICovCi0Jb2JqLT5tb2QgPSBmaW5kX21vZHVsZShvYmotPm5hbWUpOworCW1vZCA9IGZpbmRfbW9kdWxlKG9iai0+bmFtZSk7CisJLyoKKwkgKiBEbyBub3QgbWVzcyB3b3JrIG9mIHRoZSBtb2R1bGUgY29taW5nIGFuZCBnb2luZyBub3RpZmllcnMuCisJICogTm90ZSB0aGF0IHRoZSBwYXRjaCBtaWdodCBzdGlsbCBiZSBuZWVkZWQgYmVmb3JlIHRoZSBnb2luZyBoYW5kbGVyCisJICogaXMgY2FsbGVkLiBNb2R1bGUgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgZXZlbiBpbiB0aGUgR09JTkcgc3RhdGUKKwkgKiB1bnRpbCBtb2QtPmV4aXQoKSBmaW5pc2hlcy4gVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IKKwkgKiBwYXRjaGVzIHRoYXQgbW9kaWZ5IHNlbWFudGljIG9mIHRoZSBmdW5jdGlvbnMuCisJICovCisJaWYgKG1vZCAmJiBtb2QtPmtscF9hbGl2ZSkKKwkJb2JqLT5tb2QgPSBtb2Q7CisKIAltdXRleF91bmxvY2soJm1vZHVsZV9tdXRleCk7CiB9CiAKQEAgLTMyMywzMiArMzM1LDIwIEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKLXN0YXRpYyBpbnQga2xwX2Rpc2FibGVfZnVuYyhzdHJ1Y3Qga2xwX2Z1bmMgKmZ1bmMpCitzdGF0aWMgdm9pZCBrbHBfZGlzYWJsZV9mdW5jKHN0cnVjdCBrbHBfZnVuYyAqZnVuYykKIHsKIAlzdHJ1Y3Qga2xwX29wcyAqb3BzOwotCWludCByZXQ7CiAKLQlpZiAoV0FSTl9PTihmdW5jLT5zdGF0ZSAhPSBLTFBfRU5BQkxFRCkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKFdBUk5fT04oIWZ1bmMtPm9sZF9hZGRyKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJV0FSTl9PTihmdW5jLT5zdGF0ZSAhPSBLTFBfRU5BQkxFRCk7CisJV0FSTl9PTighZnVuYy0+b2xkX2FkZHIpOwogCiAJb3BzID0ga2xwX2ZpbmRfb3BzKGZ1bmMtPm9sZF9hZGRyKTsKIAlpZiAoV0FSTl9PTighb3BzKSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybjsKIAogCWlmIChsaXN0X2lzX3Npbmd1bGFyKCZvcHMtPmZ1bmNfc3RhY2spKSB7Ci0JCXJldCA9IHVucmVnaXN0ZXJfZnRyYWNlX2Z1bmN0aW9uKCZvcHMtPmZvcHMpOwotCQlpZiAocmV0KSB7Ci0JCQlwcl9lcnIoImZhaWxlZCB0byB1bnJlZ2lzdGVyIGZ0cmFjZSBoYW5kbGVyIGZvciBmdW5jdGlvbiAnJXMnICglZClcbiIsCi0JCQkgICAgICAgZnVuYy0+b2xkX25hbWUsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJcmV0ID0gZnRyYWNlX3NldF9maWx0ZXJfaXAoJm9wcy0+Zm9wcywgZnVuYy0+b2xkX2FkZHIsIDEsIDApOwotCQlpZiAocmV0KQotCQkJcHJfd2FybigiZnVuY3Rpb24gdW5yZWdpc3RlciBzdWNjZWVkZWQgYnV0IGZhaWxlZCB0byBjbGVhciB0aGUgZmlsdGVyXG4iKTsKKwkJV0FSTl9PTih1bnJlZ2lzdGVyX2Z0cmFjZV9mdW5jdGlvbigmb3BzLT5mb3BzKSk7CisJCVdBUk5fT04oZnRyYWNlX3NldF9maWx0ZXJfaXAoJm9wcy0+Zm9wcywgZnVuYy0+b2xkX2FkZHIsIDEsIDApKTsKIAogCQlsaXN0X2RlbF9yY3UoJmZ1bmMtPnN0YWNrX25vZGUpOwogCQlsaXN0X2RlbCgmb3BzLT5ub2RlKTsKQEAgLTM1OCw4ICszNTgsNiBAQAogCX0KIAogCWZ1bmMtPnN0YXRlID0gS0xQX0RJU0FCTEVEOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQga2xwX2VuYWJsZV9mdW5jKHN0cnVjdCBrbHBfZnVuYyAqZnVuYykKQEAgLTQyMCwyMyArNDE4LDE1IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBrbHBfZGlzYWJsZV9vYmplY3Qoc3RydWN0IGtscF9vYmplY3QgKm9iaikKK3N0YXRpYyB2b2lkIGtscF9kaXNhYmxlX29iamVjdChzdHJ1Y3Qga2xwX29iamVjdCAqb2JqKQogewogCXN0cnVjdCBrbHBfZnVuYyAqZnVuYzsKLQlpbnQgcmV0OwogCi0JZm9yIChmdW5jID0gb2JqLT5mdW5jczsgZnVuYy0+b2xkX25hbWU7IGZ1bmMrKykgewotCQlpZiAoZnVuYy0+c3RhdGUgIT0gS0xQX0VOQUJMRUQpCi0JCQljb250aW51ZTsKLQotCQlyZXQgPSBrbHBfZGlzYWJsZV9mdW5jKGZ1bmMpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9CisJZm9yIChmdW5jID0gb2JqLT5mdW5jczsgZnVuYy0+b2xkX25hbWU7IGZ1bmMrKykKKwkJaWYgKGZ1bmMtPnN0YXRlID09IEtMUF9FTkFCTEVEKQorCQkJa2xwX2Rpc2FibGVfZnVuYyhmdW5jKTsKIAogCW9iai0+c3RhdGUgPSBLTFBfRElTQUJMRUQ7Ci0KLQlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBrbHBfZW5hYmxlX29iamVjdChzdHJ1Y3Qga2xwX29iamVjdCAqb2JqKQpAQCAtNDUyLDIyICs0NDIsMTkgQEAKIAogCWZvciAoZnVuYyA9IG9iai0+ZnVuY3M7IGZ1bmMtPm9sZF9uYW1lOyBmdW5jKyspIHsKIAkJcmV0ID0ga2xwX2VuYWJsZV9mdW5jKGZ1bmMpOwotCQlpZiAocmV0KQotCQkJZ290byB1bnJlZ2lzdGVyOworCQlpZiAocmV0KSB7CisJCQlrbHBfZGlzYWJsZV9vYmplY3Qob2JqKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAJb2JqLT5zdGF0ZSA9IEtMUF9FTkFCTEVEOwogCiAJcmV0dXJuIDA7Ci0KLXVucmVnaXN0ZXI6Ci0JV0FSTl9PTihrbHBfZGlzYWJsZV9vYmplY3Qob2JqKSk7Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBfX2tscF9kaXNhYmxlX3BhdGNoKHN0cnVjdCBrbHBfcGF0Y2ggKnBhdGNoKQogewogCXN0cnVjdCBrbHBfb2JqZWN0ICpvYmo7Ci0JaW50IHJldDsKIAogCS8qIGVuZm9yY2Ugc3RhY2tpbmc6IG9ubHkgdGhlIGxhc3QgZW5hYmxlZCBwYXRjaCBjYW4gYmUgZGlzYWJsZWQgKi8KIAlpZiAoIWxpc3RfaXNfbGFzdCgmcGF0Y2gtPmxpc3QsICZrbHBfcGF0Y2hlcykgJiYKQEAgLTQ3NywxMiArNDY0LDggQEAKIAlwcl9ub3RpY2UoImRpc2FibGluZyBwYXRjaCAnJXMnXG4iLCBwYXRjaC0+bW9kLT5uYW1lKTsKIAogCWZvciAob2JqID0gcGF0Y2gtPm9ianM7IG9iai0+ZnVuY3M7IG9iaisrKSB7Ci0JCWlmIChvYmotPnN0YXRlICE9IEtMUF9FTkFCTEVEKQotCQkJY29udGludWU7Ci0KLQkJcmV0ID0ga2xwX2Rpc2FibGVfb2JqZWN0KG9iaik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQlpZiAob2JqLT5zdGF0ZSA9PSBLTFBfRU5BQkxFRCkKKwkJCWtscF9kaXNhYmxlX29iamVjdChvYmopOwogCX0KIAogCXBhdGNoLT5zdGF0ZSA9IEtMUF9ESVNBQkxFRDsKQEAgLTU0MSw4ICs1MjQsNiBAQAogCXByX25vdGljZSgiZW5hYmxpbmcgcGF0Y2ggJyVzJ1xuIiwgcGF0Y2gtPm1vZC0+bmFtZSk7CiAKIAlmb3IgKG9iaiA9IHBhdGNoLT5vYmpzOyBvYmotPmZ1bmNzOyBvYmorKykgewotCQlrbHBfZmluZF9vYmplY3RfbW9kdWxlKG9iaik7Ci0KIAkJaWYgKCFrbHBfaXNfb2JqZWN0X2xvYWRlZChvYmopKQogCQkJY29udGludWU7CiAKQEAgLTc2Nyw2ICs3NDgsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW9iai0+c3RhdGUgPSBLTFBfRElTQUJMRUQ7CisJb2JqLT5tb2QgPSBOVUxMOwogCiAJa2xwX2ZpbmRfb2JqZWN0X21vZHVsZShvYmopOwogCkBAIC05MzIsNyArOTE0LDYgQEAKIHsKIAlzdHJ1Y3QgbW9kdWxlICpwbW9kID0gcGF0Y2gtPm1vZDsKIAlzdHJ1Y3QgbW9kdWxlICptb2QgPSBvYmotPm1vZDsKLQlpbnQgcmV0OwogCiAJaWYgKHBhdGNoLT5zdGF0ZSA9PSBLTFBfRElTQUJMRUQpCiAJCWdvdG8gZGlzYWJsZWQ7CkBAIC05NDAsMTAgKzkyMSw3IEBACiAJcHJfbm90aWNlKCJyZXZlcnRpbmcgcGF0Y2ggJyVzJyBvbiB1bmxvYWRpbmcgbW9kdWxlICclcydcbiIsCiAJCSAgcG1vZC0+bmFtZSwgbW9kLT5uYW1lKTsKIAotCXJldCA9IGtscF9kaXNhYmxlX29iamVjdChvYmopOwotCWlmIChyZXQpCi0JCXByX3dhcm4oImZhaWxlZCB0byByZXZlcnQgcGF0Y2ggJyVzJyBvbiBtb2R1bGUgJyVzJyAoJWQpXG4iLAotCQkJcG1vZC0+bmFtZSwgbW9kLT5uYW1lLCByZXQpOworCWtscF9kaXNhYmxlX29iamVjdChvYmopOwogCiBkaXNhYmxlZDoKIAlrbHBfZnJlZV9vYmplY3RfbG9hZGVkKG9iaik7CkBAIC05NjEsNiArOTM5LDE1IEBACiAKIAltdXRleF9sb2NrKCZrbHBfbXV0ZXgpOwogCisJLyoKKwkgKiBFYWNoIG1vZHVsZSBoYXMgdG8ga25vdyB0aGF0IHRoZSBub3RpZmllciBoYXMgYmVlbiBjYWxsZWQuCisJICogV2UgbmV2ZXIga25vdyB3aGF0IG1vZHVsZSB3aWxsIGdldCBwYXRjaGVkIGJ5IGEgbmV3IHBhdGNoLgorCSAqLworCWlmIChhY3Rpb24gPT0gTU9EVUxFX1NUQVRFX0NPTUlORykKKwkJbW9kLT5rbHBfYWxpdmUgPSB0cnVlOworCWVsc2UgLyogTU9EVUxFX1NUQVRFX0dPSU5HICovCisJCW1vZC0+a2xwX2FsaXZlID0gZmFsc2U7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhdGNoLCAma2xwX3BhdGNoZXMsIGxpc3QpIHsKIAkJZm9yIChvYmogPSBwYXRjaC0+b2Jqczsgb2JqLT5mdW5jczsgb2JqKyspIHsKIAkJCWlmICgha2xwX2lzX21vZHVsZShvYmopIHx8IHN0cmNtcChvYmotPm5hbWUsIG1vZC0+bmFtZSkpCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9sb2NrZGVwLmMgYi9rZXJuZWwvbG9ja2luZy9sb2NrZGVwLmMKaW5kZXggODhkMGQ0NC4uYmE3N2FiNSAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tpbmcvbG9ja2RlcC5jCisrKyBiL2tlcm5lbC9sb2NraW5nL2xvY2tkZXAuYwpAQCAtNjMzLDcgKzYzMyw3IEBACiAJaWYgKCFuZXdfY2xhc3MtPm5hbWUpCiAJCXJldHVybiAwOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjbGFzcywgJmFsbF9sb2NrX2NsYXNzZXMsIGxvY2tfZW50cnkpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjbGFzcywgJmFsbF9sb2NrX2NsYXNzZXMsIGxvY2tfZW50cnkpIHsKIAkJaWYgKG5ld19jbGFzcy0+a2V5IC0gbmV3X2NsYXNzLT5zdWJjbGFzcyA9PSBjbGFzcy0+a2V5KQogCQkJcmV0dXJuIGNsYXNzLT5uYW1lX3ZlcnNpb247CiAJCWlmIChjbGFzcy0+bmFtZSAmJiAhc3RyY21wKGNsYXNzLT5uYW1lLCBuZXdfY2xhc3MtPm5hbWUpKQpAQCAtNzAwLDEwICs3MDAsMTIgQEAKIAloYXNoX2hlYWQgPSBjbGFzc2hhc2hlbnRyeShrZXkpOwogCiAJLyoKLQkgKiBXZSBjYW4gd2FsayB0aGUgaGFzaCBsb2NrZnJlZSwgYmVjYXVzZSB0aGUgaGFzaCBvbmx5Ci0JICogZ3Jvd3MsIGFuZCB3ZSBhcmUgY2FyZWZ1bCB3aGVuIGFkZGluZyBlbnRyaWVzIHRvIHRoZSBlbmQ6CisJICogV2UgZG8gYW4gUkNVIHdhbGsgb2YgdGhlIGhhc2gsIHNlZSBsb2NrZGVwX2ZyZWVfa2V5X3JhbmdlKCkuCiAJICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjbGFzcywgaGFzaF9oZWFkLCBoYXNoX2VudHJ5KSB7CisJaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04oIWlycXNfZGlzYWJsZWQoKSkpCisJCXJldHVybiBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2xhc3MsIGhhc2hfaGVhZCwgaGFzaF9lbnRyeSkgewogCQlpZiAoY2xhc3MtPmtleSA9PSBrZXkpIHsKIAkJCS8qCiAJCQkgKiBIdWghIHNhbWUga2V5LCBkaWZmZXJlbnQgbmFtZT8gRGlkIHNvbWVvbmUgdHJhbXBsZQpAQCAtNzI4LDcgKzczMCw4IEBACiAJc3RydWN0IGxvY2tkZXBfc3ViY2xhc3Nfa2V5ICprZXk7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGFzaF9oZWFkOwogCXN0cnVjdCBsb2NrX2NsYXNzICpjbGFzczsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJREVCVUdfTE9DS1NfV0FSTl9PTighaXJxc19kaXNhYmxlZCgpKTsKIAogCWNsYXNzID0gbG9va191cF9sb2NrX2NsYXNzKGxvY2ssIHN1YmNsYXNzKTsKIAlpZiAobGlrZWx5KGNsYXNzKSkKQEAgLTc1MCwyOCArNzUzLDI2IEBACiAJa2V5ID0gbG9jay0+a2V5LT5zdWJrZXlzICsgc3ViY2xhc3M7CiAJaGFzaF9oZWFkID0gY2xhc3NoYXNoZW50cnkoa2V5KTsKIAotCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJaWYgKCFncmFwaF9sb2NrKCkpIHsKLQkJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCS8qCiAJICogV2UgaGF2ZSB0byBkbyB0aGUgaGFzaC13YWxrIGFnYWluLCB0byBhdm9pZCByYWNlcwogCSAqIHdpdGggYW5vdGhlciBDUFU6CiAJICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjbGFzcywgaGFzaF9oZWFkLCBoYXNoX2VudHJ5KQorCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNsYXNzLCBoYXNoX2hlYWQsIGhhc2hfZW50cnkpIHsKIAkJaWYgKGNsYXNzLT5rZXkgPT0ga2V5KQogCQkJZ290byBvdXRfdW5sb2NrX3NldDsKKwl9CisKIAkvKgogCSAqIEFsbG9jYXRlIGEgbmV3IGtleSBmcm9tIHRoZSBzdGF0aWMgYXJyYXksIGFuZCBhZGQgaXQgdG8KIAkgKiB0aGUgaGFzaDoKIAkgKi8KIAlpZiAobnJfbG9ja19jbGFzc2VzID49IE1BWF9MT0NLREVQX0tFWVMpIHsKIAkJaWYgKCFkZWJ1Z19sb2Nrc19vZmZfZ3JhcGhfdW5sb2NrKCkpIHsKLQkJCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQotCQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiAJCXByaW50X2xvY2tkZXBfb2ZmKCJCVUc6IE1BWF9MT0NLREVQX0tFWVMgdG9vIGxvdyEiKTsKIAkJZHVtcF9zdGFjaygpOwpAQCAtNzk4LDcgKzc5OSw2IEBACiAKIAlpZiAodmVyYm9zZShjbGFzcykpIHsKIAkJZ3JhcGhfdW5sb2NrKCk7Ci0JCXJhd19sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIAkJcHJpbnRrKCJcbm5ldyBjbGFzcyAlcDogJXMiLCBjbGFzcy0+a2V5LCBjbGFzcy0+bmFtZSk7CiAJCWlmIChjbGFzcy0+bmFtZV92ZXJzaW9uID4gMSkKQEAgLTgwNiwxNSArODA2LDEyIEBACiAJCXByaW50aygiXG4iKTsKIAkJZHVtcF9zdGFjaygpOwogCi0JCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCWlmICghZ3JhcGhfbG9jaygpKSB7Ci0JCQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9CiBvdXRfdW5sb2NrX3NldDoKIAlncmFwaF91bmxvY2soKTsKLQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCiBvdXRfc2V0X2NsYXNzX2NhY2hlOgogCWlmICghc3ViY2xhc3MgfHwgZm9yY2UpCkBAIC04NzAsMTEgKzg2Nyw5IEBACiAJZW50cnktPmRpc3RhbmNlID0gZGlzdGFuY2U7CiAJZW50cnktPnRyYWNlID0gKnRyYWNlOwogCS8qCi0JICogU2luY2Ugd2UgbmV2ZXIgcmVtb3ZlIGZyb20gdGhlIGRlcGVuZGVuY3kgbGlzdCwgdGhlIGxpc3QgY2FuCi0JICogYmUgd2Fsa2VkIGxvY2tsZXNzIGJ5IG90aGVyIENQVXMsIGl0J3Mgb25seSBhbGxvY2F0aW9uCi0JICogdGhhdCBtdXN0IGJlIHByb3RlY3RlZCBieSB0aGUgc3BpbmxvY2suIEJ1dCB0aGlzIGFsc28gbWVhbnMKLQkgKiB3ZSBtdXN0IG1ha2UgbmV3IGVudHJpZXMgdmlzaWJsZSBvbmx5IG9uY2Ugd3JpdGVzIHRvIHRoZQotCSAqIGVudHJ5IGJlY29tZSB2aXNpYmxlIC0gaGVuY2UgdGhlIFJDVSBvcDoKKwkgKiBCb3RoIGFsbG9jYXRpb24gYW5kIHJlbW92YWwgYXJlIGRvbmUgdW5kZXIgdGhlIGdyYXBoIGxvY2s7IGJ1dAorCSAqIGl0ZXJhdGlvbiBpcyB1bmRlciBSQ1Utc2NoZWQ7IHNlZSBsb29rX3VwX2xvY2tfY2xhc3MoKSBhbmQKKwkgKiBsb2NrZGVwX2ZyZWVfa2V5X3JhbmdlKCkuCiAJICovCiAJbGlzdF9hZGRfdGFpbF9yY3UoJmVudHJ5LT5lbnRyeSwgaGVhZCk7CiAKQEAgLTEwMjUsNyArMTAyMCw5IEBACiAJCWVsc2UKIAkJCWhlYWQgPSAmbG9jay0+Y2xhc3MtPmxvY2tzX2JlZm9yZTsKIAotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGVudHJ5LCBoZWFkLCBlbnRyeSkgeworCQlERUJVR19MT0NLU19XQVJOX09OKCFpcnFzX2Rpc2FibGVkKCkpOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGVudHJ5LCBoZWFkLCBlbnRyeSkgewogCQkJaWYgKCFsb2NrX2FjY2Vzc2VkKGVudHJ5KSkgewogCQkJCXVuc2lnbmVkIGludCBjcV9kZXB0aDsKIAkJCQltYXJrX2xvY2tfYWNjZXNzZWQoZW50cnksIGxvY2spOwpAQCAtMjAyMiw3ICsyMDE5LDcgQEAKIAkgKiBXZSBjYW4gd2FsayBpdCBsb2NrLWZyZWUsIGJlY2F1c2UgZW50cmllcyBvbmx5IGdldCBhZGRlZAogCSAqIHRvIHRoZSBoYXNoOgogCSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhaW4sIGhhc2hfaGVhZCwgZW50cnkpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjaGFpbiwgaGFzaF9oZWFkLCBlbnRyeSkgewogCQlpZiAoY2hhaW4tPmNoYWluX2tleSA9PSBjaGFpbl9rZXkpIHsKIGNhY2hlX2hpdDoKIAkJCWRlYnVnX2F0b21pY19pbmMoY2hhaW5fbG9va3VwX2hpdHMpOwpAQCAtMjk5Niw4ICsyOTkzLDE4IEBACiAJaWYgKHVubGlrZWx5KCFkZWJ1Z19sb2NrcykpCiAJCXJldHVybjsKIAotCWlmIChzdWJjbGFzcykKKwlpZiAoc3ViY2xhc3MpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlpZiAoREVCVUdfTE9DS1NfV0FSTl9PTihjdXJyZW50LT5sb2NrZGVwX3JlY3Vyc2lvbikpCisJCQlyZXR1cm47CisKKwkJcmF3X2xvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24gPSAxOwogCQlyZWdpc3Rlcl9sb2NrX2NsYXNzKGxvY2ssIHN1YmNsYXNzLCAxKTsKKwkJY3VycmVudC0+bG9ja2RlcF9yZWN1cnNpb24gPSAwOworCQlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0KIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tkZXBfaW5pdF9tYXApOwogCkBAIC0zODg3LDkgKzM4OTQsMTcgQEAKIAlyZXR1cm4gYWRkciA+PSBzdGFydCAmJiBhZGRyIDwgc3RhcnQgKyBzaXplOwogfQogCisvKgorICogVXNlZCBpbiBtb2R1bGUuYyB0byByZW1vdmUgbG9jayBjbGFzc2VzIGZyb20gbWVtb3J5IHRoYXQgaXMgZ29pbmcgdG8gYmUKKyAqIGZyZWVkOyBhbmQgcG9zc2libHkgcmUtdXNlZCBieSBvdGhlciBtb2R1bGVzLgorICoKKyAqIFdlIHdpbGwgaGF2ZSBoYWQgb25lIHN5bmNfc2NoZWQoKSBiZWZvcmUgZ2V0dGluZyBoZXJlLCBzbyB3ZSdyZSBndWFyYW50ZWVkCisgKiBub2JvZHkgd2lsbCBsb29rIHVwIHRoZXNlIGV4YWN0IGNsYXNzZXMgLS0gdGhleSdyZSBwcm9wZXJseSBkZWFkIGJ1dCBzdGlsbAorICogYWxsb2NhdGVkLgorICovCiB2b2lkIGxvY2tkZXBfZnJlZV9rZXlfcmFuZ2Uodm9pZCAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKLQlzdHJ1Y3QgbG9ja19jbGFzcyAqY2xhc3MsICpuZXh0OworCXN0cnVjdCBsb2NrX2NsYXNzICpjbGFzczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CkBAIC0zOTA1LDcgKzM5MjAsNyBAQAogCQloZWFkID0gY2xhc3NoYXNoX3RhYmxlICsgaTsKIAkJaWYgKGxpc3RfZW1wdHkoaGVhZCkpCiAJCQljb250aW51ZTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNsYXNzLCBuZXh0LCBoZWFkLCBoYXNoX2VudHJ5KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNsYXNzLCBoZWFkLCBoYXNoX2VudHJ5KSB7CiAJCQlpZiAod2l0aGluKGNsYXNzLT5rZXksIHN0YXJ0LCBzaXplKSkKIAkJCQl6YXBfY2xhc3MoY2xhc3MpOwogCQkJZWxzZSBpZiAod2l0aGluKGNsYXNzLT5uYW1lLCBzdGFydCwgc2l6ZSkpCkBAIC0zOTE2LDExICszOTMxLDI1IEBACiAJaWYgKGxvY2tlZCkKIAkJZ3JhcGhfdW5sb2NrKCk7CiAJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCS8qCisJICogV2FpdCBmb3IgYW55IHBvc3NpYmxlIGl0ZXJhdG9ycyBmcm9tIGxvb2tfdXBfbG9ja19jbGFzcygpIHRvIHBhc3MKKwkgKiBiZWZvcmUgY29udGludWluZyB0byBmcmVlIHRoZSBtZW1vcnkgdGhleSByZWZlciB0by4KKwkgKgorCSAqIHN5bmNfc2NoZWQoKSBpcyBzdWZmaWNpZW50IGJlY2F1c2UgdGhlIHJlYWQtc2lkZSBpcyBJUlEgZGlzYWJsZS4KKwkgKi8KKwlzeW5jaHJvbml6ZV9zY2hlZCgpOworCisJLyoKKwkgKiBYWFggYXQgdGhpcyBwb2ludCB3ZSBjb3VsZCByZXR1cm4gdGhlIHJlc291cmNlcyB0byB0aGUgcG9vbDsKKwkgKiBpbnN0ZWFkIHdlIGxlYWsgdGhlbS4gV2Ugd291bGQgbmVlZCB0byBjaGFuZ2UgdG8gYml0bWFwIGFsbG9jYXRvcnMKKwkgKiBpbnN0ZWFkIG9mIHRoZSBsaW5lYXIgYWxsb2NhdG9ycyB3ZSBoYXZlIG5vdy4KKwkgKi8KIH0KIAogdm9pZCBsb2NrZGVwX3Jlc2V0X2xvY2soc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrKQogewotCXN0cnVjdCBsb2NrX2NsYXNzICpjbGFzcywgKm5leHQ7CisJc3RydWN0IGxvY2tfY2xhc3MgKmNsYXNzOwogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgaSwgajsKQEAgLTM5NDgsNyArMzk3Nyw3IEBACiAJCWhlYWQgPSBjbGFzc2hhc2hfdGFibGUgKyBpOwogCQlpZiAobGlzdF9lbXB0eShoZWFkKSkKIAkJCWNvbnRpbnVlOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2xhc3MsIG5leHQsIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2xhc3MsIGhlYWQsIGhhc2hfZW50cnkpIHsKIAkJCWludCBtYXRjaCA9IDA7CiAKIAkJCWZvciAoaiA9IDA7IGogPCBOUl9MT0NLREVQX0NBQ0hJTkdfQ0xBU1NFUzsgaisrKQpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvbWNzX3NwaW5sb2NrLmggYi9rZXJuZWwvbG9ja2luZy9tY3Nfc3BpbmxvY2suaAppbmRleCBkMWZlMmJhLi43NWUxMTRiIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9tY3Nfc3BpbmxvY2suaAorKysgYi9rZXJuZWwvbG9ja2luZy9tY3Nfc3BpbmxvY2suaApAQCAtNzgsNyArNzgsNyBAQAogCQkgKi8KIAkJcmV0dXJuOwogCX0KLQlBQ0NFU1NfT05DRShwcmV2LT5uZXh0KSA9IG5vZGU7CisJV1JJVEVfT05DRShwcmV2LT5uZXh0LCBub2RlKTsKIAogCS8qIFdhaXQgdW50aWwgdGhlIGxvY2sgaG9sZGVyIHBhc3NlcyB0aGUgbG9jayBkb3duLiAqLwogCWFyY2hfbWNzX3NwaW5fbG9ja19jb250ZW5kZWQoJm5vZGUtPmxvY2tlZCk7CkBAIC05MSw3ICs5MSw3IEBACiBzdGF0aWMgaW5saW5lCiB2b2lkIG1jc19zcGluX3VubG9jayhzdHJ1Y3QgbWNzX3NwaW5sb2NrICoqbG9jaywgc3RydWN0IG1jc19zcGlubG9jayAqbm9kZSkKIHsKLQlzdHJ1Y3QgbWNzX3NwaW5sb2NrICpuZXh0ID0gQUNDRVNTX09OQ0Uobm9kZS0+bmV4dCk7CisJc3RydWN0IG1jc19zcGlubG9jayAqbmV4dCA9IFJFQURfT05DRShub2RlLT5uZXh0KTsKIAogCWlmIChsaWtlbHkoIW5leHQpKSB7CiAJCS8qCkBAIC0xMDAsNyArMTAwLDcgQEAKIAkJaWYgKGxpa2VseShjbXB4Y2hnKGxvY2ssIG5vZGUsIE5VTEwpID09IG5vZGUpKQogCQkJcmV0dXJuOwogCQkvKiBXYWl0IHVudGlsIHRoZSBuZXh0IHBvaW50ZXIgaXMgc2V0ICovCi0JCXdoaWxlICghKG5leHQgPSBBQ0NFU1NfT05DRShub2RlLT5uZXh0KSkpCisJCXdoaWxlICghKG5leHQgPSBSRUFEX09OQ0Uobm9kZS0+bmV4dCkpKQogCQkJY3B1X3JlbGF4X2xvd2xhdGVuY3koKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL211dGV4LmMgYi9rZXJuZWwvbG9ja2luZy9tdXRleC5jCmluZGV4IDk0Njc0ZTUuLjRjY2NlYTYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NraW5nL211dGV4LmMKKysrIGIva2VybmVsL2xvY2tpbmcvbXV0ZXguYwpAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdfbG9ja3MuaD4KLSNpbmNsdWRlICJtY3Nfc3BpbmxvY2suaCIKKyNpbmNsdWRlIDxsaW51eC9vc3FfbG9jay5oPgogCiAvKgogICogSW4gdGhlIERFQlVHIGNhc2Ugd2UgYXJlIHVzaW5nIHRoZSAiTlVMTCBmYXN0cGF0aCIgZm9yIG11dGV4ZXMsCkBAIC0yMTcsNDQgKzIxNywzNSBAQAogfQogCiAjaWZkZWYgQ09ORklHX01VVEVYX1NQSU5fT05fT1dORVIKLXN0YXRpYyBpbmxpbmUgYm9vbCBvd25lcl9ydW5uaW5nKHN0cnVjdCBtdXRleCAqbG9jaywgc3RydWN0IHRhc2tfc3RydWN0ICpvd25lcikKLXsKLQlpZiAobG9jay0+b3duZXIgIT0gb3duZXIpCi0JCXJldHVybiBmYWxzZTsKLQotCS8qCi0JICogRW5zdXJlIHdlIGVtaXQgdGhlIG93bmVyLT5vbl9jcHUsIGRlcmVmZXJlbmNlIF9hZnRlcl8gY2hlY2tpbmcKLQkgKiBsb2NrLT5vd25lciBzdGlsbCBtYXRjaGVzIG93bmVyLCBpZiB0aGF0IGZhaWxzLCBvd25lciBtaWdodAotCSAqIHBvaW50IHRvIGZyZWUoKWQgbWVtb3J5LCBpZiBpdCBzdGlsbCBtYXRjaGVzLCB0aGUgcmN1X3JlYWRfbG9jaygpCi0JICogZW5zdXJlcyB0aGUgbWVtb3J5IHN0YXlzIHZhbGlkLgotCSAqLwotCWJhcnJpZXIoKTsKLQotCXJldHVybiBvd25lci0+b25fY3B1OwotfQotCiAvKgogICogTG9vayBvdXQhICJvd25lciIgaXMgYW4gZW50aXJlbHkgc3BlY3VsYXRpdmUgcG9pbnRlcgogICogYWNjZXNzIGFuZCBub3QgcmVsaWFibGUuCiAgKi8KIHN0YXRpYyBub2lubGluZQotaW50IG11dGV4X3NwaW5fb25fb3duZXIoc3RydWN0IG11dGV4ICpsb2NrLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyKQorYm9vbCBtdXRleF9zcGluX29uX293bmVyKHN0cnVjdCBtdXRleCAqbG9jaywgc3RydWN0IHRhc2tfc3RydWN0ICpvd25lcikKIHsKKwlib29sIHJldCA9IHRydWU7CisKIAlyY3VfcmVhZF9sb2NrKCk7Ci0Jd2hpbGUgKG93bmVyX3J1bm5pbmcobG9jaywgb3duZXIpKSB7Ci0JCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwl3aGlsZSAobG9jay0+b3duZXIgPT0gb3duZXIpIHsKKwkJLyoKKwkJICogRW5zdXJlIHdlIGVtaXQgdGhlIG93bmVyLT5vbl9jcHUsIGRlcmVmZXJlbmNlIF9hZnRlcl8KKwkJICogY2hlY2tpbmcgbG9jay0+b3duZXIgc3RpbGwgbWF0Y2hlcyBvd25lci4gSWYgdGhhdCBmYWlscywKKwkJICogb3duZXIgbWlnaHQgcG9pbnQgdG8gZnJlZWQgbWVtb3J5LiBJZiBpdCBzdGlsbCBtYXRjaGVzLAorCQkgKiB0aGUgcmN1X3JlYWRfbG9jaygpIGVuc3VyZXMgdGhlIG1lbW9yeSBzdGF5cyB2YWxpZC4KKwkJICovCisJCWJhcnJpZXIoKTsKKworCQlpZiAoIW93bmVyLT5vbl9jcHUgfHwgbmVlZF9yZXNjaGVkKCkpIHsKKwkJCXJldCA9IGZhbHNlOwogCQkJYnJlYWs7CisJCX0KIAogCQljcHVfcmVsYXhfbG93bGF0ZW5jeSgpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCS8qCi0JICogV2UgYnJlYWsgb3V0IHRoZSBsb29wIGFib3ZlIG9uIG5lZWRfcmVzY2hlZCgpIGFuZCB3aGVuIHRoZQotCSAqIG93bmVyIGNoYW5nZWQsIHdoaWNoIGlzIGEgc2lnbiBmb3IgaGVhdnkgY29udGVudGlvbi4gUmV0dXJuCi0JICogc3VjY2VzcyBvbmx5IHdoZW4gbG9jay0+b3duZXIgaXMgTlVMTC4KLQkgKi8KLQlyZXR1cm4gbG9jay0+b3duZXIgPT0gTlVMTDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMjY5LDcgKzI2MCw3IEBACiAJCXJldHVybiAwOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW93bmVyID0gQUNDRVNTX09OQ0UobG9jay0+b3duZXIpOworCW93bmVyID0gUkVBRF9PTkNFKGxvY2stPm93bmVyKTsKIAlpZiAob3duZXIpCiAJCXJldHZhbCA9IG93bmVyLT5vbl9jcHU7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0zNDMsNyArMzM0LDcgQEAKIAkJCSAqIEFzIHN1Y2gsIHdoZW4gZGVhZGxvY2sgZGV0ZWN0aW9uIG5lZWRzIHRvIGJlCiAJCQkgKiBwZXJmb3JtZWQgdGhlIG9wdGltaXN0aWMgc3Bpbm5pbmcgY2Fubm90IGJlIGRvbmUuCiAJCQkgKi8KLQkJCWlmIChBQ0NFU1NfT05DRSh3dy0+Y3R4KSkKKwkJCWlmIChSRUFEX09OQ0Uod3ctPmN0eCkpCiAJCQkJYnJlYWs7CiAJCX0KIApAQCAtMzUxLDcgKzM0Miw3IEBACiAJCSAqIElmIHRoZXJlJ3MgYW4gb3duZXIsIHdhaXQgZm9yIGl0IHRvIGVpdGhlcgogCQkgKiByZWxlYXNlIHRoZSBsb2NrIG9yIGdvIHRvIHNsZWVwLgogCQkgKi8KLQkJb3duZXIgPSBBQ0NFU1NfT05DRShsb2NrLT5vd25lcik7CisJCW93bmVyID0gUkVBRF9PTkNFKGxvY2stPm93bmVyKTsKIAkJaWYgKG93bmVyICYmICFtdXRleF9zcGluX29uX293bmVyKGxvY2ssIG93bmVyKSkKIAkJCWJyZWFrOwogCkBAIC00OTAsNyArNDgxLDcgQEAKIF9fd3dfbXV0ZXhfbG9ja19jaGVja19zdGFtcChzdHJ1Y3QgbXV0ZXggKmxvY2ssIHN0cnVjdCB3d19hY3F1aXJlX2N0eCAqY3R4KQogewogCXN0cnVjdCB3d19tdXRleCAqd3cgPSBjb250YWluZXJfb2YobG9jaywgc3RydWN0IHd3X211dGV4LCBiYXNlKTsKLQlzdHJ1Y3Qgd3dfYWNxdWlyZV9jdHggKmhvbGRfY3R4ID0gQUNDRVNTX09OQ0Uod3ctPmN0eCk7CisJc3RydWN0IHd3X2FjcXVpcmVfY3R4ICpob2xkX2N0eCA9IFJFQURfT05DRSh3dy0+Y3R4KTsKIAogCWlmICghaG9sZF9jdHgpCiAJCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvb3NxX2xvY2suYyBiL2tlcm5lbC9sb2NraW5nL29zcV9sb2NrLmMKaW5kZXggYzExMmQwMC4uZGM4NWVlMiAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tpbmcvb3NxX2xvY2suYworKysgYi9rZXJuZWwvbG9ja2luZy9vc3FfbG9jay5jCkBAIC05OCw3ICs5OCw3IEBACiAKIAlwcmV2ID0gZGVjb2RlX2NwdShvbGQpOwogCW5vZGUtPnByZXYgPSBwcmV2OwotCUFDQ0VTU19PTkNFKHByZXYtPm5leHQpID0gbm9kZTsKKwlXUklURV9PTkNFKHByZXYtPm5leHQsIG5vZGUpOwogCiAJLyoKIAkgKiBOb3JtYWxseSBAcHJldiBpcyB1bnRvdWNoYWJsZSBhZnRlciB0aGUgYWJvdmUgc3RvcmU7IGJlY2F1c2UgYXQgdGhhdApAQCAtMTA5LDcgKzEwOSw3IEBACiAJICogY21weGNoZyBpbiBhbiBhdHRlbXB0IHRvIHVuZG8gb3VyIHF1ZXVlaW5nLgogCSAqLwogCi0Jd2hpbGUgKCFBQ0NFU1NfT05DRShub2RlLT5sb2NrZWQpKSB7CisJd2hpbGUgKCFSRUFEX09OQ0Uobm9kZS0+bG9ja2VkKSkgewogCQkvKgogCQkgKiBJZiB3ZSBuZWVkIHRvIHJlc2NoZWR1bGUgYmFpbC4uLiBzbyB3ZSBjYW4gYmxvY2suCiAJCSAqLwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAJCSAqIE9yIHdlIHJhY2UgYWdhaW5zdCBhIGNvbmN1cnJlbnQgdW5xdWV1ZSgpJ3Mgc3RlcC1CLCBpbiB3aGljaAogCQkgKiBjYXNlIGl0cyBzdGVwLUMgd2lsbCB3cml0ZSB1cyBhIG5ldyBAbm9kZS0+cHJldiBwb2ludGVyLgogCQkgKi8KLQkJcHJldiA9IEFDQ0VTU19PTkNFKG5vZGUtPnByZXYpOworCQlwcmV2ID0gUkVBRF9PTkNFKG5vZGUtPnByZXYpOwogCX0KIAogCS8qCkBAIC0xNzAsOCArMTcwLDggQEAKIAkgKiBpdCB3aWxsIHdhaXQgaW4gU3RlcC1BLgogCSAqLwogCi0JQUNDRVNTX09OQ0UobmV4dC0+cHJldikgPSBwcmV2OwotCUFDQ0VTU19PTkNFKHByZXYtPm5leHQpID0gbmV4dDsKKwlXUklURV9PTkNFKG5leHQtPnByZXYsIHByZXYpOworCVdSSVRFX09OQ0UocHJldi0+bmV4dCwgbmV4dCk7CiAKIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC0xOTMsMTEgKzE5MywxMSBAQAogCW5vZGUgPSB0aGlzX2NwdV9wdHIoJm9zcV9ub2RlKTsKIAluZXh0ID0geGNoZygmbm9kZS0+bmV4dCwgTlVMTCk7CiAJaWYgKG5leHQpIHsKLQkJQUNDRVNTX09OQ0UobmV4dC0+bG9ja2VkKSA9IDE7CisJCVdSSVRFX09OQ0UobmV4dC0+bG9ja2VkLCAxKTsKIAkJcmV0dXJuOwogCX0KIAogCW5leHQgPSBvc3Ffd2FpdF9uZXh0KGxvY2ssIG5vZGUsIE5VTEwpOwogCWlmIChuZXh0KQotCQlBQ0NFU1NfT05DRShuZXh0LT5sb2NrZWQpID0gMTsKKwkJV1JJVEVfT05DRShuZXh0LT5sb2NrZWQsIDEpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvcnRtdXRleC5jIGIva2VybmVsL2xvY2tpbmcvcnRtdXRleC5jCmluZGV4IDYzNTcyNjUuLmI3MzI3OTMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NraW5nL3J0bXV0ZXguYworKysgYi9rZXJuZWwvbG9ja2luZy9ydG11dGV4LmMKQEAgLTM0OSw3ICszNDksNyBAQAogICoKICAqIEB0YXNrOgl0aGUgdGFzayBvd25pbmcgdGhlIG11dGV4IChvd25lcikgZm9yIHdoaWNoIGEgY2hhaW4gd2FsayBpcwogICoJCXByb2JhYmx5IG5lZWRlZAotICogQGRlYWRsb2NrX2RldGVjdDogZG8gd2UgaGF2ZSB0byBjYXJyeSBvdXQgZGVhZGxvY2sgZGV0ZWN0aW9uPworICogQGNod2FsazoJZG8gd2UgaGF2ZSB0byBjYXJyeSBvdXQgZGVhZGxvY2sgZGV0ZWN0aW9uPwogICogQG9yaWdfbG9jazoJdGhlIG11dGV4IChjYW4gYmUgTlVMTCBpZiB3ZSBhcmUgd2Fsa2luZyB0aGUgY2hhaW4gdG8gcmVjaGVjawogICoJCXRoaW5ncyBmb3IgYSB0YXNrIHRoYXQgaGFzIGp1c3QgZ290IGl0cyBwcmlvcml0eSBhZGp1c3RlZCwgYW5kCiAgKgkJaXMgd2FpdGluZyBvbiBhIG11dGV4KQpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvcndzZW0tc3BpbmxvY2suYyBiL2tlcm5lbC9sb2NraW5nL3J3c2VtLXNwaW5sb2NrLmMKaW5kZXggMjU1NWFlMS4uM2E1MDQ4NSAxMDA2NDQKLS0tIGEva2VybmVsL2xvY2tpbmcvcndzZW0tc3BpbmxvY2suYworKysgYi9rZXJuZWwvbG9ja2luZy9yd3NlbS1zcGlubG9jay5jCkBAIC04NSw2ICs4NSwxMyBAQAogCiAJCWxpc3RfZGVsKCZ3YWl0ZXItPmxpc3QpOwogCQl0c2sgPSB3YWl0ZXItPnRhc2s7CisJCS8qCisJCSAqIE1ha2Ugc3VyZSB3ZSBkbyBub3Qgd2FrZXVwIHRoZSBuZXh0IHJlYWRlciBiZWZvcmUKKwkJICogc2V0dGluZyB0aGUgbmlsIGNvbmRpdGlvbiB0byBncmFudCB0aGUgbmV4dCByZWFkZXI7CisJCSAqIG90aGVyd2lzZSB3ZSBjb3VsZCBtaXNzIHRoZSB3YWtldXAgb24gdGhlIG90aGVyCisJCSAqIHNpZGUgYW5kIGVuZCB1cCBzbGVlcGluZyBhZ2Fpbi4gU2VlIHRoZSBwYWlyaW5nCisJCSAqIGluIHJ3c2VtX2Rvd25fcmVhZF9mYWlsZWQoKS4KKwkJICovCiAJCXNtcF9tYigpOwogCQl3YWl0ZXItPnRhc2sgPSBOVUxMOwogCQl3YWtlX3VwX3Byb2Nlc3ModHNrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NraW5nL3J3c2VtLXhhZGQuYyBiL2tlcm5lbC9sb2NraW5nL3J3c2VtLXhhZGQuYwppbmRleCAyZjdjYzQwLi4zNDE3ZDAxIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9yd3NlbS14YWRkLmMKKysrIGIva2VybmVsL2xvY2tpbmcvcndzZW0teGFkZC5jCkBAIC0xNCw4ICsxNCw5IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3J0Lmg+CisjaW5jbHVkZSA8bGludXgvb3NxX2xvY2suaD4KIAotI2luY2x1ZGUgIm1jc19zcGlubG9jay5oIgorI2luY2x1ZGUgInJ3c2VtLmgiCiAKIC8qCiAgKiBHdWlkZSB0byB0aGUgcndfc2VtYXBob3JlJ3MgY291bnQgZmllbGQgZm9yIGNvbW1vbiB2YWx1ZXMuCkBAIC0xODYsNiArMTg3LDEzIEBACiAJCXdhaXRlciA9IGxpc3RfZW50cnkobmV4dCwgc3RydWN0IHJ3c2VtX3dhaXRlciwgbGlzdCk7CiAJCW5leHQgPSB3YWl0ZXItPmxpc3QubmV4dDsKIAkJdHNrID0gd2FpdGVyLT50YXNrOworCQkvKgorCQkgKiBNYWtlIHN1cmUgd2UgZG8gbm90IHdha2V1cCB0aGUgbmV4dCByZWFkZXIgYmVmb3JlCisJCSAqIHNldHRpbmcgdGhlIG5pbCBjb25kaXRpb24gdG8gZ3JhbnQgdGhlIG5leHQgcmVhZGVyOworCQkgKiBvdGhlcndpc2Ugd2UgY291bGQgbWlzcyB0aGUgd2FrZXVwIG9uIHRoZSBvdGhlcgorCQkgKiBzaWRlIGFuZCBlbmQgdXAgc2xlZXBpbmcgYWdhaW4uIFNlZSB0aGUgcGFpcmluZworCQkgKiBpbiByd3NlbV9kb3duX3JlYWRfZmFpbGVkKCkuCisJCSAqLwogCQlzbXBfbWIoKTsKIAkJd2FpdGVyLT50YXNrID0gTlVMTDsKIAkJd2FrZV91cF9wcm9jZXNzKHRzayk7CkBAIC0yNTgsNiArMjY2LDcgQEAKIAkJICAgIFJXU0VNX0FDVElWRV9XUklURV9CSUFTKSA9PSBSV1NFTV9XQUlUSU5HX0JJQVMpIHsKIAkJaWYgKCFsaXN0X2lzX3Npbmd1bGFyKCZzZW0tPndhaXRfbGlzdCkpCiAJCQlyd3NlbV9hdG9taWNfdXBkYXRlKFJXU0VNX1dBSVRJTkdfQklBUywgc2VtKTsKKwkJcndzZW1fc2V0X293bmVyKHNlbSk7CiAJCXJldHVybiB0cnVlOwogCX0KIApAQCAtMjcwLDE1ICsyNzksMTcgQEAKICAqLwogc3RhdGljIGlubGluZSBib29sIHJ3c2VtX3RyeV93cml0ZV9sb2NrX3VucXVldWVkKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKIHsKLQlsb25nIG9sZCwgY291bnQgPSBBQ0NFU1NfT05DRShzZW0tPmNvdW50KTsKKwlsb25nIG9sZCwgY291bnQgPSBSRUFEX09OQ0Uoc2VtLT5jb3VudCk7CiAKIAl3aGlsZSAodHJ1ZSkgewogCQlpZiAoIShjb3VudCA9PSAwIHx8IGNvdW50ID09IFJXU0VNX1dBSVRJTkdfQklBUykpCiAJCQlyZXR1cm4gZmFsc2U7CiAKIAkJb2xkID0gY21weGNoZygmc2VtLT5jb3VudCwgY291bnQsIGNvdW50ICsgUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMpOwotCQlpZiAob2xkID09IGNvdW50KQorCQlpZiAob2xkID09IGNvdW50KSB7CisJCQlyd3NlbV9zZXRfb3duZXIoc2VtKTsKIAkJCXJldHVybiB0cnVlOworCQl9CiAKIAkJY291bnQgPSBvbGQ7CiAJfQpAQCAtMjg3LDYwICsyOTgsNjcgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbCByd3NlbV9jYW5fc3Bpbl9vbl9vd25lcihzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpvd25lcjsKLQlib29sIG9uX2NwdSA9IGZhbHNlOworCWJvb2wgcmV0ID0gdHJ1ZTsKIAogCWlmIChuZWVkX3Jlc2NoZWQoKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW93bmVyID0gQUNDRVNTX09OQ0Uoc2VtLT5vd25lcik7Ci0JaWYgKG93bmVyKQotCQlvbl9jcHUgPSBvd25lci0+b25fY3B1OworCW93bmVyID0gUkVBRF9PTkNFKHNlbS0+b3duZXIpOworCWlmICghb3duZXIpIHsKKwkJbG9uZyBjb3VudCA9IFJFQURfT05DRShzZW0tPmNvdW50KTsKKwkJLyoKKwkJICogSWYgc2VtLT5vd25lciBpcyBub3Qgc2V0LCB5ZXQgd2UgaGF2ZSBqdXN0IHJlY2VudGx5IGVudGVyZWQgdGhlCisJCSAqIHNsb3dwYXRoIHdpdGggdGhlIGxvY2sgYmVpbmcgYWN0aXZlLCB0aGVuIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkKKwkJICogcmVhZGVyKHMpIG1heSBoYXZlIHRoZSBsb2NrLiBUbyBiZSBzYWZlLCBiYWlsIHNwaW5uaW5nIGluIHRoZXNlCisJCSAqIHNpdHVhdGlvbnMuCisJCSAqLworCQlpZiAoY291bnQgJiBSV1NFTV9BQ1RJVkVfTUFTSykKKwkJCXJldCA9IGZhbHNlOworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0gb3duZXItPm9uX2NwdTsKK2RvbmU6CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQkvKgotCSAqIElmIHNlbS0+b3duZXIgaXMgbm90IHNldCwgeWV0IHdlIGhhdmUganVzdCByZWNlbnRseSBlbnRlcmVkIHRoZQotCSAqIHNsb3dwYXRoLCB0aGVuIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgcmVhZGVyKHMpIG1heSBoYXZlIHRoZSBsb2NrLgotCSAqIFRvIGJlIHNhZmUsIGF2b2lkIHNwaW5uaW5nIGluIHRoZXNlIHNpdHVhdGlvbnMuCi0JICovCi0JcmV0dXJuIG9uX2NwdTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIG93bmVyX3J1bm5pbmcoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtLAotCQkJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm93bmVyKQotewotCWlmIChzZW0tPm93bmVyICE9IG93bmVyKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKgotCSAqIEVuc3VyZSB3ZSBlbWl0IHRoZSBvd25lci0+b25fY3B1LCBkZXJlZmVyZW5jZSBfYWZ0ZXJfIGNoZWNraW5nCi0JICogc2VtLT5vd25lciBzdGlsbCBtYXRjaGVzIG93bmVyLCBpZiB0aGF0IGZhaWxzLCBvd25lciBtaWdodAotCSAqIHBvaW50IHRvIGZyZWUoKWQgbWVtb3J5LCBpZiBpdCBzdGlsbCBtYXRjaGVzLCB0aGUgcmN1X3JlYWRfbG9jaygpCi0JICogZW5zdXJlcyB0aGUgbWVtb3J5IHN0YXlzIHZhbGlkLgotCSAqLwotCWJhcnJpZXIoKTsKLQotCXJldHVybiBvd25lci0+b25fY3B1OworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBub2lubGluZQogYm9vbCByd3NlbV9zcGluX29uX293bmVyKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSwgc3RydWN0IHRhc2tfc3RydWN0ICpvd25lcikKIHsKKwlsb25nIGNvdW50OworCiAJcmN1X3JlYWRfbG9jaygpOwotCXdoaWxlIChvd25lcl9ydW5uaW5nKHNlbSwgb3duZXIpKSB7Ci0JCWlmIChuZWVkX3Jlc2NoZWQoKSkKLQkJCWJyZWFrOworCXdoaWxlIChzZW0tPm93bmVyID09IG93bmVyKSB7CisJCS8qCisJCSAqIEVuc3VyZSB3ZSBlbWl0IHRoZSBvd25lci0+b25fY3B1LCBkZXJlZmVyZW5jZSBfYWZ0ZXJfCisJCSAqIGNoZWNraW5nIHNlbS0+b3duZXIgc3RpbGwgbWF0Y2hlcyBvd25lciwgaWYgdGhhdCBmYWlscywKKwkJICogb3duZXIgbWlnaHQgcG9pbnQgdG8gZnJlZSgpZCBtZW1vcnksIGlmIGl0IHN0aWxsIG1hdGNoZXMsCisJCSAqIHRoZSByY3VfcmVhZF9sb2NrKCkgZW5zdXJlcyB0aGUgbWVtb3J5IHN0YXlzIHZhbGlkLgorCQkgKi8KKwkJYmFycmllcigpOworCisJCS8qIGFib3J0IHNwaW5uaW5nIHdoZW4gbmVlZF9yZXNjaGVkIG9yIG93bmVyIGlzIG5vdCBydW5uaW5nICovCisJCWlmICghb3duZXItPm9uX2NwdSB8fCBuZWVkX3Jlc2NoZWQoKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KIAogCQljcHVfcmVsYXhfbG93bGF0ZW5jeSgpOwogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAorCWlmIChSRUFEX09OQ0Uoc2VtLT5vd25lcikpCisJCXJldHVybiB0cnVlOyAvKiBuZXcgb3duZXIsIGNvbnRpbnVlIHNwaW5uaW5nICovCisKIAkvKgotCSAqIFdlIGJyZWFrIG91dCB0aGUgbG9vcCBhYm92ZSBvbiBuZWVkX3Jlc2NoZWQoKSBvciB3aGVuIHRoZQotCSAqIG93bmVyIGNoYW5nZWQsIHdoaWNoIGlzIGEgc2lnbiBmb3IgaGVhdnkgY29udGVudGlvbi4gUmV0dXJuCi0JICogc3VjY2VzcyBvbmx5IHdoZW4gc2VtLT5vd25lciBpcyBOVUxMLgorCSAqIFdoZW4gdGhlIG93bmVyIGlzIG5vdCBzZXQsIHRoZSBsb2NrIGNvdWxkIGJlIGZyZWUgb3IKKwkgKiBoZWxkIGJ5IHJlYWRlcnMuIENoZWNrIHRoZSBjb3VudGVyIHRvIHZlcmlmeSB0aGUKKwkgKiBzdGF0ZS4KIAkgKi8KLQlyZXR1cm4gc2VtLT5vd25lciA9PSBOVUxMOworCWNvdW50ID0gUkVBRF9PTkNFKHNlbS0+Y291bnQpOworCXJldHVybiAoY291bnQgPT0gMCB8fCBjb3VudCA9PSBSV1NFTV9XQUlUSU5HX0JJQVMpOwogfQogCiBzdGF0aWMgYm9vbCByd3NlbV9vcHRpbWlzdGljX3NwaW4oc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQpAQCAtMzU4LDcgKzM3Niw3IEBACiAJCWdvdG8gZG9uZTsKIAogCXdoaWxlICh0cnVlKSB7Ci0JCW93bmVyID0gQUNDRVNTX09OQ0Uoc2VtLT5vd25lcik7CisJCW93bmVyID0gUkVBRF9PTkNFKHNlbS0+b3duZXIpOwogCQlpZiAob3duZXIgJiYgIXJ3c2VtX3NwaW5fb25fb3duZXIoc2VtLCBvd25lcikpCiAJCQlicmVhazsKIApAQCAtNDMyLDcgKzQ1MCw3IEBACiAKIAkvKiB3ZSdyZSBub3cgd2FpdGluZyBvbiB0aGUgbG9jaywgYnV0IG5vIGxvbmdlciBhY3RpdmVseSBsb2NraW5nICovCiAJaWYgKHdhaXRpbmcpIHsKLQkJY291bnQgPSBBQ0NFU1NfT05DRShzZW0tPmNvdW50KTsKKwkJY291bnQgPSBSRUFEX09OQ0Uoc2VtLT5jb3VudCk7CiAKIAkJLyoKIAkJICogSWYgdGhlcmUgd2VyZSBhbHJlYWR5IHRocmVhZHMgcXVldWVkIGJlZm9yZSB1cyBhbmQgdGhlcmUgYXJlCmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2luZy9yd3NlbS5jIGIva2VybmVsL2xvY2tpbmcvcndzZW0uYwppbmRleCBlMmQzYmM3Li4yMDViZTBjIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2luZy9yd3NlbS5jCisrKyBiL2tlcm5lbC9sb2NraW5nL3J3c2VtLmMKQEAgLTksMjkgKzksOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KLQogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogCi0jaWZkZWYgQ09ORklHX1JXU0VNX1NQSU5fT05fT1dORVIKLXN0YXRpYyBpbmxpbmUgdm9pZCByd3NlbV9zZXRfb3duZXIoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQotewotCXNlbS0+b3duZXIgPSBjdXJyZW50OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcndzZW1fY2xlYXJfb3duZXIoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQotewotCXNlbS0+b3duZXIgPSBOVUxMOwotfQotCi0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHJ3c2VtX3NldF9vd25lcihzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCi17Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByd3NlbV9jbGVhcl9vd25lcihzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCi17Ci19Ci0jZW5kaWYKKyNpbmNsdWRlICJyd3NlbS5oIgogCiAvKgogICogbG9jayBmb3IgcmVhZGluZwpkaWZmIC0tZ2l0IGEva2VybmVsL2xvY2tpbmcvcndzZW0uaCBiL2tlcm5lbC9sb2NraW5nL3J3c2VtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwZWQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9sb2NraW5nL3J3c2VtLmgKQEAgLTAsMCArMSwyMCBAQAorI2lmZGVmIENPTkZJR19SV1NFTV9TUElOX09OX09XTkVSCitzdGF0aWMgaW5saW5lIHZvaWQgcndzZW1fc2V0X293bmVyKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlzZW0tPm93bmVyID0gY3VycmVudDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJ3c2VtX2NsZWFyX293bmVyKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKK3sKKwlzZW0tPm93bmVyID0gTlVMTDsKK30KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCByd3NlbV9zZXRfb3duZXIoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcndzZW1fY2xlYXJfb3duZXIoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQoreworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvbW9kdWxlLmMgYi9rZXJuZWwvbW9kdWxlLmMKaW5kZXggYjNkNjM0ZS4uNjUwYjAzOCAxMDA2NDQKLS0tIGEva2VybmVsL21vZHVsZS5jCisrKyBiL2tlcm5lbC9tb2R1bGUuYwpAQCAtMTg2NSw3ICsxODY1LDcgQEAKIAlrZnJlZShtb2QtPmFyZ3MpOwogCXBlcmNwdV9tb2RmcmVlKG1vZCk7CiAKLQkvKiBGcmVlIGxvY2stY2xhc3NlczogKi8KKwkvKiBGcmVlIGxvY2stY2xhc3NlczsgcmVsaWVzIG9uIHRoZSBwcmVjZWRpbmcgc3luY19yY3UoKS4gKi8KIAlsb2NrZGVwX2ZyZWVfa2V5X3JhbmdlKG1vZC0+bW9kdWxlX2NvcmUsIG1vZC0+Y29yZV9zaXplKTsKIAogCS8qIEZpbmFsbHksIGZyZWUgdGhlIGNvcmUgKGNvbnRhaW5pbmcgdGhlIG1vZHVsZSBzdHJ1Y3R1cmUpICovCkBAIC0yNDc5LDYgKzI0NzksMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBDT1BZX0NIVU5LX1NJWkUgKDE2KlBBR0VfU0laRSkKKworc3RhdGljIGludCBjb3B5X2NodW5rZWRfZnJvbV91c2VyKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCBfX3VzZXIgKnVzcmMsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWRvIHsKKwkJdW5zaWduZWQgbG9uZyBuID0gbWluKGxlbiwgQ09QWV9DSFVOS19TSVpFKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoZHN0LCB1c3JjLCBuKSAhPSAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWNvbmRfcmVzY2hlZCgpOworCQlkc3QgKz0gbjsKKwkJdXNyYyArPSBuOworCQlsZW4gLT0gbjsKKwl9IHdoaWxlIChsZW4pOworCXJldHVybiAwOworfQorCiAvKiBTZXRzIGluZm8tPmhkciBhbmQgaW5mby0+bGVuLiAqLwogc3RhdGljIGludCBjb3B5X21vZHVsZV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnVtb2QsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJCSAgc3RydWN0IGxvYWRfaW5mbyAqaW5mbykKQEAgLTI0OTgsNyArMjUxNSw3IEBACiAJaWYgKCFpbmZvLT5oZHIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKGluZm8tPmhkciwgdW1vZCwgaW5mby0+bGVuKSAhPSAwKSB7CisJaWYgKGNvcHlfY2h1bmtlZF9mcm9tX3VzZXIoaW5mby0+aGRyLCB1bW9kLCBpbmZvLT5sZW4pICE9IDApIHsKIAkJdmZyZWUoaW5mby0+aGRyKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQpAQCAtMjc1Myw2ICsyNzcwLDkgQEAKIAltb2QtPnRyYWNlX2V2ZW50cyA9IHNlY3Rpb25fb2JqcyhpbmZvLCAiX2Z0cmFjZV9ldmVudHMiLAogCQkJCQkgc2l6ZW9mKCptb2QtPnRyYWNlX2V2ZW50cyksCiAJCQkJCSAmbW9kLT5udW1fdHJhY2VfZXZlbnRzKTsKKwltb2QtPnRyYWNlX2VudW1zID0gc2VjdGlvbl9vYmpzKGluZm8sICJfZnRyYWNlX2VudW1fbWFwIiwKKwkJCQkJc2l6ZW9mKCptb2QtPnRyYWNlX2VudW1zKSwKKwkJCQkJJm1vZC0+bnVtX3RyYWNlX2VudW1zKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19UUkFDSU5HCiAJbW9kLT50cmFjZV9icHJpbnRrX2ZtdF9zdGFydCA9IHNlY3Rpb25fb2JqcyhpbmZvLCAiX190cmFjZV9wcmludGtfZm10IiwKQEAgLTMzNDksOSArMzM2OSw2IEBACiAJbW9kdWxlX2J1Z19jbGVhbnVwKG1vZCk7CiAJbXV0ZXhfdW5sb2NrKCZtb2R1bGVfbXV0ZXgpOwogCi0JLyogRnJlZSBsb2NrLWNsYXNzZXM6ICovCi0JbG9ja2RlcF9mcmVlX2tleV9yYW5nZShtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSk7Ci0KIAkvKiB3ZSBjYW4ndCBkZWFsbG9jYXRlIHRoZSBtb2R1bGUgdW50aWwgd2UgY2xlYXIgbWVtb3J5IHByb3RlY3Rpb24gKi8KIAl1bnNldF9tb2R1bGVfaW5pdF9yb19ueChtb2QpOwogCXVuc2V0X21vZHVsZV9jb3JlX3JvX254KG1vZCk7CkBAIC0zMzc1LDYgKzMzOTIsOSBAQAogCXN5bmNocm9uaXplX3JjdSgpOwogCW11dGV4X3VubG9jaygmbW9kdWxlX211dGV4KTsKICBmcmVlX21vZHVsZToKKwkvKiBGcmVlIGxvY2stY2xhc3NlczsgcmVsaWVzIG9uIHRoZSBwcmVjZWRpbmcgc3luY19yY3UoKSAqLworCWxvY2tkZXBfZnJlZV9rZXlfcmFuZ2UobW9kLT5tb2R1bGVfY29yZSwgbW9kLT5jb3JlX3NpemUpOworCiAJbW9kdWxlX2RlYWxsb2NhdGUobW9kLCBpbmZvKTsKICBmcmVlX2NvcHk6CiAJZnJlZV9jb3B5KGluZm8pOwpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvd2VyL21haW4uYyBiL2tlcm5lbC9wb3dlci9tYWluLmMKaW5kZXggOWE1OWQwNC4uODZlODE1NyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL21haW4uYworKysgYi9rZXJuZWwvcG93ZXIvbWFpbi5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3Jlc3VtZS10cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLXRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvcG93ZXIvc25hcHNob3QuYyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCmluZGV4IGMyNGQ1YTIuLjUyMzVkZDQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCisrKyBiL2tlcm5lbC9wb3dlci9zbmFwc2hvdC5jCkBAIC05NTUsMjUgKzk1NSw2IEBACiAJfQogfQogCi1zdGF0aWMgYm9vbCBpc19ub3NhdmVfcGFnZSh1bnNpZ25lZCBsb25nIHBmbikKLXsKLQlzdHJ1Y3Qgbm9zYXZlX3JlZ2lvbiAqcmVnaW9uOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZWdpb24sICZub3NhdmVfcmVnaW9ucywgbGlzdCkgewotCQlpZiAocGZuID49IHJlZ2lvbi0+c3RhcnRfcGZuICYmIHBmbiA8IHJlZ2lvbi0+ZW5kX3BmbikgewotCQkJcHJfZXJyKCJQTTogJSMwMTBsbHggaW4gZTgyMCBub3NhdmUgcmVnaW9uOiAiCi0JCQkgICAgICAgIlttZW0gJSMwMTBsbHgtJSMwMTBsbHhdXG4iLAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBmbiA8PCBQQUdFX1NISUZULAotCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHJlZ2lvbi0+c3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQsCi0JCQkgICAgICAgKCh1bnNpZ25lZCBsb25nIGxvbmcpIHJlZ2lvbi0+ZW5kX3BmbiA8PCBQQUdFX1NISUZUKQotCQkJCQktIDEpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KIC8qKgogICoJY3JlYXRlX2Jhc2ljX21lbW9yeV9iaXRtYXBzIC0gY3JlYXRlIGJpdG1hcHMgbmVlZGVkIGZvciBtYXJraW5nIHBhZ2UKICAqCWZyYW1lcyB0aGF0IHNob3VsZCBub3QgYmUgc2F2ZWQgYW5kIGZyZWUgcGFnZSBmcmFtZXMuICBUaGUgcG9pbnRlcnMKQEAgLTIwNDIsNyArMjAyMyw3IEBACiAJZG8gewogCQlwZm4gPSBtZW1vcnlfYm1fbmV4dF9wZm4oYm0pOwogCQlpZiAobGlrZWx5KHBmbiAhPSBCTV9FTkRfT0ZfTUFQKSkgewotCQkJaWYgKGxpa2VseShwZm5fdmFsaWQocGZuKSkgJiYgIWlzX25vc2F2ZV9wYWdlKHBmbikpCisJCQlpZiAobGlrZWx5KHBmbl92YWxpZChwZm4pKSkKIAkJCQlzd3N1c3Bfc2V0X3BhZ2VfZnJlZShwZm5fdG9fcGFnZShwZm4pKTsKIAkJCWVsc2UKIAkJCQlyZXR1cm4gLUVGQVVMVDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMgYi9rZXJuZWwvcG93ZXIvc3VzcGVuZC5jCmluZGV4IGI3ZDZiM2EuLjhkN2ExZWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wb3dlci9zdXNwZW5kLmMKKysrIGIva2VybmVsL3Bvd2VyL3N1c3BlbmQuYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9wb3dlci5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KIAogI2luY2x1ZGUgInBvd2VyLmgiCiAKQEAgLTIzMywxMiArMjM0LDIwIEBACiAJCXN1c3BlbmRfb3BzLT5zdXNwZW5kX2FnYWluKCkgOiBmYWxzZTsKIH0KIAorI2lmZGVmIENPTkZJR19QTV9ERUJVRworc3RhdGljIHVuc2lnbmVkIGludCBwbV90ZXN0X2RlbGF5ID0gNTsKK21vZHVsZV9wYXJhbShwbV90ZXN0X2RlbGF5LCB1aW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocG1fdGVzdF9kZWxheSwKKwkJICJOdW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGJlZm9yZSByZXN1bWluZyBmcm9tIHN1c3BlbmQgdGVzdCIpOworI2VuZGlmCisKIHN0YXRpYyBpbnQgc3VzcGVuZF90ZXN0KGludCBsZXZlbCkKIHsKICNpZmRlZiBDT05GSUdfUE1fREVCVUcKIAlpZiAocG1fdGVzdF9sZXZlbCA9PSBsZXZlbCkgewotCQlwcmludGsoS0VSTl9JTkZPICJzdXNwZW5kIGRlYnVnOiBXYWl0aW5nIGZvciA1IHNlY29uZHMuXG4iKTsKLQkJbWRlbGF5KDUwMDApOworCQlwcmludGsoS0VSTl9JTkZPICJzdXNwZW5kIGRlYnVnOiBXYWl0aW5nIGZvciAlZCBzZWNvbmQocykuXG4iLAorCQkJCXBtX3Rlc3RfZGVsYXkpOworCQltZGVsYXkocG1fdGVzdF9kZWxheSAqIDEwMDApOwogCQlyZXR1cm4gMTsKIAl9CiAjZW5kaWYgLyogIUNPTkZJR19QTV9ERUJVRyAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3ByaW50ay9wcmludGsuYyBiL2tlcm5lbC9wcmludGsvcHJpbnRrLmMKaW5kZXggYmIwNjM1Yi4uODc5ZWRmYyAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay9wcmludGsuYworKysgYi9rZXJuZWwvcHJpbnRrL3ByaW50ay5jCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAjaW5jbHVkZSA8bGludXgva2RiLmg+CkBAIC00Niw2ICs0NSw3IEBACiAjaW5jbHVkZSA8bGludXgvaXJxX3dvcmsuaD4KICNpbmNsdWRlIDxsaW51eC91dHNuYW1lLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTUyMSw3ICs1MjEsNyBAQAogCWludCBpOwogCWludCBsZXZlbCA9IGRlZmF1bHRfbWVzc2FnZV9sb2dsZXZlbDsKIAlpbnQgZmFjaWxpdHkgPSAxOwkvKiBMT0dfVVNFUiAqLwotCXNpemVfdCBsZW4gPSBpb2NiLT5raV9uYnl0ZXM7CisJc2l6ZV90IGxlbiA9IGlvdl9pdGVyX2NvdW50KGZyb20pOwogCXNzaXplX3QgcmV0ID0gbGVuOwogCiAJaWYgKGxlbiA+IExPR19MSU5FX01BWCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvcmN1dG9ydHVyZS5jIGIva2VybmVsL3JjdS9yY3V0b3J0dXJlLmMKaW5kZXggMzBkNDJhYS4uOGRiZTI3NiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS9yY3V0b3J0dXJlLmMKKysrIGIva2VybmVsL3JjdS9yY3V0b3J0dXJlLmMKQEAgLTg1Myw2ICs4NTMsOCBAQAogc3RhdGljIGludAogcmN1X3RvcnR1cmVfd3JpdGVyKHZvaWQgKmFyZykKIHsKKwlib29sIGNhbl9leHBlZGl0ZSA9ICFyY3VfZ3BfaXNfZXhwZWRpdGVkKCk7CisJaW50IGV4cGVkaXRpbmcgPSAwOwogCXVuc2lnbmVkIGxvbmcgZ3Bfc25hcDsKIAlib29sIGdwX2NvbmQxID0gZ3BfY29uZCwgZ3BfZXhwMSA9IGdwX2V4cCwgZ3Bfbm9ybWFsMSA9IGdwX25vcm1hbDsKIAlib29sIGdwX3N5bmMxID0gZ3Bfc3luYzsKQEAgLTg2NSw5ICs4NjcsMTUgQEAKIAlpbnQgbnN5bmN0eXBlcyA9IDA7CiAKIAlWRVJCT1NFX1RPUk9VVF9TVFJJTkcoInJjdV90b3J0dXJlX3dyaXRlciB0YXNrIHN0YXJ0ZWQiKTsKKwlwcl9hbGVydCgiJXMiIFRPUlRVUkVfRkxBRworCQkgIiBHcmFjZSBwZXJpb2RzIGV4cGVkaXRlZCBmcm9tIGJvb3Qvc3lzZnMgZm9yICVzLFxuIiwKKwkJIHRvcnR1cmVfdHlwZSwgY3VyX29wcy0+bmFtZSk7CisJcHJfYWxlcnQoIiVzIiBUT1JUVVJFX0ZMQUcKKwkJICIgVGVzdGluZyBvZiBkeW5hbWljIGdyYWNlLXBlcmlvZCBleHBlZGl0aW5nIGRpYWJsZWQuXG4iLAorCQkgdG9ydHVyZV90eXBlKTsKIAogCS8qIEluaXRpYWxpemUgc3luY3R5cGVbXSBhcnJheS4gIElmIG5vbmUgc2V0LCB0YWtlIGRlZmF1bHQuICovCi0JaWYgKCFncF9jb25kMSAmJiAhZ3BfZXhwMSAmJiAhZ3Bfbm9ybWFsMSAmJiAhZ3Bfc3luYykKKwlpZiAoIWdwX2NvbmQxICYmICFncF9leHAxICYmICFncF9ub3JtYWwxICYmICFncF9zeW5jMSkKIAkJZ3BfY29uZDEgPSBncF9leHAxID0gZ3Bfbm9ybWFsMSA9IGdwX3N5bmMxID0gdHJ1ZTsKIAlpZiAoZ3BfY29uZDEgJiYgY3VyX29wcy0+Z2V0X3N0YXRlICYmIGN1cl9vcHMtPmNvbmRfc3luYykKIAkJc3luY3R5cGVbbnN5bmN0eXBlcysrXSA9IFJUV1NfQ09ORF9HRVQ7CkBAIC05NDksOSArOTU3LDI2IEBACiAJCQl9CiAJCX0KIAkJcmN1dG9ydHVyZV9yZWNvcmRfcHJvZ3Jlc3MoKytyY3VfdG9ydHVyZV9jdXJyZW50X3ZlcnNpb24pOworCQkvKiBDeWNsZSB0aHJvdWdoIG5lc3RpbmcgbGV2ZWxzIG9mIHJjdV9leHBlZGl0ZV9ncCgpIGNhbGxzLiAqLworCQlpZiAoY2FuX2V4cGVkaXRlICYmCisJCSAgICAhKHRvcnR1cmVfcmFuZG9tKCZyYW5kKSAmIDB4ZmYgJiAoISFleHBlZGl0aW5nIC0gMSkpKSB7CisJCQlXQVJOX09OX09OQ0UoZXhwZWRpdGluZyA9PSAwICYmIHJjdV9ncF9pc19leHBlZGl0ZWQoKSk7CisJCQlpZiAoZXhwZWRpdGluZyA+PSAwKQorCQkJCXJjdV9leHBlZGl0ZV9ncCgpOworCQkJZWxzZQorCQkJCXJjdV91bmV4cGVkaXRlX2dwKCk7CisJCQlpZiAoKytleHBlZGl0aW5nID4gMykKKwkJCQlleHBlZGl0aW5nID0gLWV4cGVkaXRpbmc7CisJCX0KIAkJcmN1X3RvcnR1cmVfd3JpdGVyX3N0YXRlID0gUlRXU19TVFVUVEVSOwogCQlzdHV0dGVyX3dhaXQoInJjdV90b3J0dXJlX3dyaXRlciIpOwogCX0gd2hpbGUgKCF0b3J0dXJlX211c3Rfc3RvcCgpKTsKKwkvKiBSZXNldCBleHBlZGl0aW5nIGJhY2sgdG8gdW5leHBlZGl0ZWQuICovCisJaWYgKGV4cGVkaXRpbmcgPiAwKQorCQlleHBlZGl0aW5nID0gLWV4cGVkaXRpbmc7CisJd2hpbGUgKGNhbl9leHBlZGl0ZSAmJiBleHBlZGl0aW5nKysgPCAwKQorCQlyY3VfdW5leHBlZGl0ZV9ncCgpOworCVdBUk5fT05fT05DRShjYW5fZXhwZWRpdGUgJiYgcmN1X2dwX2lzX2V4cGVkaXRlZCgpKTsKIAlyY3VfdG9ydHVyZV93cml0ZXJfc3RhdGUgPSBSVFdTX1NUT1BQSU5HOwogCXRvcnR1cmVfa3RocmVhZF9zdG9wcGluZygicmN1X3RvcnR1cmVfd3JpdGVyIik7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3NyY3UuYyBiL2tlcm5lbC9yY3Uvc3JjdS5jCmluZGV4IDQ0NWJmOGYuLmNhZDc2ZTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3Uvc3JjdS5jCisrKyBiL2tlcm5lbC9yY3Uvc3JjdS5jCkBAIC00MDIsMjMgKzQwMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjYWxsX3NyY3UpOwogCi1zdHJ1Y3QgcmN1X3N5bmNocm9uaXplIHsKLQlzdHJ1Y3QgcmN1X2hlYWQgaGVhZDsKLQlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOwotfTsKLQotLyoKLSAqIEF3YWtlbiB0aGUgY29ycmVzcG9uZGluZyBzeW5jaHJvbml6ZV9zcmN1KCkgaW5zdGFuY2Ugbm93IHRoYXQgYQotICogZ3JhY2UgcGVyaW9kIGhhcyBlbGFwc2VkLgotICovCi1zdGF0aWMgdm9pZCB3YWtlbWVfYWZ0ZXJfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKLXsKLQlzdHJ1Y3QgcmN1X3N5bmNocm9uaXplICpyY3U7Ci0KLQlyY3UgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHJjdV9zeW5jaHJvbml6ZSwgaGVhZCk7Ci0JY29tcGxldGUoJnJjdS0+Y29tcGxldGlvbik7Ci19Ci0KIHN0YXRpYyB2b2lkIHNyY3VfYWR2YW5jZV9iYXRjaGVzKHN0cnVjdCBzcmN1X3N0cnVjdCAqc3AsIGludCB0cnljb3VudCk7CiBzdGF0aWMgdm9pZCBzcmN1X3Jlc2NoZWR1bGUoc3RydWN0IHNyY3Vfc3RydWN0ICpzcCk7CiAKQEAgLTUwNyw3ICs0OTAsNyBAQAogICovCiB2b2lkIHN5bmNocm9uaXplX3NyY3Uoc3RydWN0IHNyY3Vfc3RydWN0ICpzcCkKIHsKLQlfX3N5bmNocm9uaXplX3NyY3Uoc3AsIHJjdV9leHBlZGl0ZWQKKwlfX3N5bmNocm9uaXplX3NyY3Uoc3AsIHJjdV9ncF9pc19leHBlZGl0ZWQoKQogCQkJICAgPyBTWU5DSFJPTklaRV9TUkNVX0VYUF9UUllDT1VOVAogCQkJICAgOiBTWU5DSFJPTklaRV9TUkNVX1RSWUNPVU5UKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdGlueS5jIGIva2VybmVsL3JjdS90aW55LmMKaW5kZXggY2M5Y2VjYS4uMDY5NzQyZCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90aW55LmMKKysrIGIva2VybmVsL3JjdS90aW55LmMKQEAgLTEwMyw4ICsxMDMsNyBAQAogc3RhdGljIGludCByY3VfcXNjdHJfaGVscChzdHJ1Y3QgcmN1X2N0cmxibGsgKnJjcCkKIHsKIAlSQ1VfVFJBQ0UocmVzZXRfY3B1X3N0YWxsX3RpY2tzKHJjcCkpOwotCWlmIChyY3AtPnJjdWNibGlzdCAhPSBOVUxMICYmCi0JICAgIHJjcC0+ZG9uZXRhaWwgIT0gcmNwLT5jdXJ0YWlsKSB7CisJaWYgKHJjcC0+ZG9uZXRhaWwgIT0gcmNwLT5jdXJ0YWlsKSB7CiAJCXJjcC0+ZG9uZXRhaWwgPSByY3AtPmN1cnRhaWw7CiAJCXJldHVybiAxOwogCX0KQEAgLTE2OSwxNyArMTY4LDYgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCVJDVV9UUkFDRShpbnQgY2JfY291bnQgPSAwKTsKIAotCS8qIElmIG5vIFJDVSBjYWxsYmFja3MgcmVhZHkgdG8gaW52b2tlLCBqdXN0IHJldHVybi4gKi8KLQlpZiAoJnJjcC0+cmN1Y2JsaXN0ID09IHJjcC0+ZG9uZXRhaWwpIHsKLQkJUkNVX1RSQUNFKHRyYWNlX3JjdV9iYXRjaF9zdGFydChyY3AtPm5hbWUsIDAsIDAsIC0xKSk7Ci0JCVJDVV9UUkFDRSh0cmFjZV9yY3VfYmF0Y2hfZW5kKHJjcC0+bmFtZSwgMCwKLQkJCQkJICAgICAgISFBQ0NFU1NfT05DRShyY3AtPnJjdWNibGlzdCksCi0JCQkJCSAgICAgIG5lZWRfcmVzY2hlZCgpLAotCQkJCQkgICAgICBpc19pZGxlX3Rhc2soY3VycmVudCksCi0JCQkJCSAgICAgIGZhbHNlKSk7Ci0JCXJldHVybjsKLQl9Ci0KIAkvKiBNb3ZlIHRoZSByZWFkeS10by1pbnZva2UgY2FsbGJhY2tzIHRvIGEgbG9jYWwgbGlzdC4gKi8KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJUkNVX1RSQUNFKHRyYWNlX3JjdV9iYXRjaF9zdGFydChyY3AtPm5hbWUsIDAsIHJjcC0+cWxlbiwgLTEpKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdHJlZS5jIGIva2VybmVsL3JjdS90cmVlLmMKaW5kZXggNDhkNjQwYy4uMjMzMTY1ZCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlLmMKKysrIGIva2VybmVsL3JjdS90cmVlLmMKQEAgLTkxLDggKzkxLDEwIEBACiAKICNkZWZpbmUgUkNVX1NUQVRFX0lOSVRJQUxJWkVSKHNuYW1lLCBzYWJiciwgY3IpIFwKIERFRklORV9SQ1VfVFBTKHNuYW1lKSBcCitERUZJTkVfUEVSX0NQVV9TSEFSRURfQUxJR05FRChzdHJ1Y3QgcmN1X2RhdGEsIHNuYW1lIyNfZGF0YSk7IFwKIHN0cnVjdCByY3Vfc3RhdGUgc25hbWUjI19zdGF0ZSA9IHsgXAogCS5sZXZlbCA9IHsgJnNuYW1lIyNfc3RhdGUubm9kZVswXSB9LCBcCisJLnJkYSA9ICZzbmFtZSMjX2RhdGEsIFwKIAkuY2FsbCA9IGNyLCBcCiAJLmZxc19zdGF0ZSA9IFJDVV9HUF9JRExFLCBcCiAJLmdwbnVtID0gMFVMIC0gMzAwVUwsIFwKQEAgLTEwMSwxMSArMTAzLDkgQEAKIAkub3JwaGFuX254dHRhaWwgPSAmc25hbWUjI19zdGF0ZS5vcnBoYW5fbnh0bGlzdCwgXAogCS5vcnBoYW5fZG9uZXRhaWwgPSAmc25hbWUjI19zdGF0ZS5vcnBoYW5fZG9uZWxpc3QsIFwKIAkuYmFycmllcl9tdXRleCA9IF9fTVVURVhfSU5JVElBTElaRVIoc25hbWUjI19zdGF0ZS5iYXJyaWVyX211dGV4KSwgXAotCS5vbm9mZl9tdXRleCA9IF9fTVVURVhfSU5JVElBTElaRVIoc25hbWUjI19zdGF0ZS5vbm9mZl9tdXRleCksIFwKIAkubmFtZSA9IFJDVV9TVEFURV9OQU1FKHNuYW1lKSwgXAogCS5hYmJyID0gc2FiYnIsIFwKLX07IFwKLURFRklORV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCByY3VfZGF0YSwgc25hbWUjI19kYXRhKQorfQogCiBSQ1VfU1RBVEVfSU5JVElBTElaRVIocmN1X3NjaGVkLCAncycsIGNhbGxfcmN1X3NjaGVkKTsKIFJDVV9TVEFURV9JTklUSUFMSVpFUihyY3VfYmgsICdiJywgY2FsbF9yY3VfYmgpOwpAQCAtMTUyLDYgKzE1Miw4IEBACiAgKi8KIHN0YXRpYyBpbnQgcmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUgX19yZWFkX21vc3RseTsKIAorc3RhdGljIHZvaWQgcmN1X2luaXRfbmV3X3JucChzdHJ1Y3QgcmN1X25vZGUgKnJucF9sZWFmKTsKK3N0YXRpYyB2b2lkIHJjdV9jbGVhbnVwX2RlYWRfcm5wKHN0cnVjdCByY3Vfbm9kZSAqcm5wX2xlYWYpOwogc3RhdGljIHZvaWQgcmN1X2Jvb3N0X2t0aHJlYWRfc2V0YWZmaW5pdHkoc3RydWN0IHJjdV9ub2RlICpybnAsIGludCBvdXRnb2luZ2NwdSk7CiBzdGF0aWMgdm9pZCBpbnZva2VfcmN1X2NvcmUodm9pZCk7CiBzdGF0aWMgdm9pZCBpbnZva2VfcmN1X2NhbGxiYWNrcyhzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIHN0cnVjdCByY3VfZGF0YSAqcmRwKTsKQEAgLTE2MCw2ICsxNjIsMTIgQEAKIHN0YXRpYyBpbnQga3RocmVhZF9wcmlvID0gQ09ORklHX1JDVV9LVEhSRUFEX1BSSU87CiBtb2R1bGVfcGFyYW0oa3RocmVhZF9wcmlvLCBpbnQsIDA2NDQpOwogCisvKiBEZWxheSBpbiBqaWZmaWVzIGZvciBncmFjZS1wZXJpb2QgaW5pdGlhbGl6YXRpb24gZGVsYXlzLiAqLworc3RhdGljIGludCBncF9pbml0X2RlbGF5ID0gSVNfRU5BQkxFRChDT05GSUdfUkNVX1RPUlRVUkVfVEVTVF9TTE9XX0lOSVQpCisJCQkJPyBDT05GSUdfUkNVX1RPUlRVUkVfVEVTVF9TTE9XX0lOSVRfREVMQVkKKwkJCQk6IDA7Cittb2R1bGVfcGFyYW0oZ3BfaW5pdF9kZWxheSwgaW50LCAwNjQ0KTsKKwogLyoKICAqIFRyYWNrIHRoZSByY3V0b3J0dXJlIHRlc3Qgc2VxdWVuY2UgbnVtYmVyIGFuZCB0aGUgdXBkYXRlIHZlcnNpb24KICAqIG51bWJlciB3aXRoaW4gYSBnaXZlbiB0ZXN0LiAgVGhlIHJjdXRvcnR1cmVfdGVzdHNlcSBpcyBpbmNyZW1lbnRlZApAQCAtMTczLDYgKzE4MSwxNyBAQAogdW5zaWduZWQgbG9uZyByY3V0b3J0dXJlX3Zlcm51bTsKIAogLyoKKyAqIENvbXB1dGUgdGhlIG1hc2sgb2Ygb25saW5lIENQVXMgZm9yIHRoZSBzcGVjaWZpZWQgcmN1X25vZGUgc3RydWN0dXJlLgorICogVGhpcyB3aWxsIG5vdCBiZSBzdGFibGUgdW5sZXNzIHRoZSByY3Vfbm9kZSBzdHJ1Y3R1cmUncyAtPmxvY2sgaXMKKyAqIGhlbGQsIGJ1dCB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgQ1BVIHdpbGwgYmUgc3RhYmxlCisgKiBpbiBtb3N0IGNvbnRleHRzLgorICovCit1bnNpZ25lZCBsb25nIHJjdV9ybnBfb25saW5lX2NwdXMoc3RydWN0IHJjdV9ub2RlICpybnApCit7CisJcmV0dXJuIEFDQ0VTU19PTkNFKHJucC0+cXNtYXNraW5pdG5leHQpOworfQorCisvKgogICogUmV0dXJuIHRydWUgaWYgYW4gUkNVIGdyYWNlIHBlcmlvZCBpcyBpbiBwcm9ncmVzcy4gIFRoZSBBQ0NFU1NfT05DRSgpcwogICogcGVybWl0IHRoaXMgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCB3aXRob3V0IGhvbGRpbmcgdGhlIHJvb3QgcmN1X25vZGUKICAqIHN0cnVjdHVyZSdzIC0+bG9jaywgYnV0IG9mIGNvdXJzZSByZXN1bHRzIGNhbiBiZSBzdWJqZWN0IHRvIGNoYW5nZS4KQEAgLTI5MiwxMCArMzExLDEwIEBACiBFWFBPUlRfU1lNQk9MX0dQTChyY3Vfbm90ZV9jb250ZXh0X3N3aXRjaCk7CiAKIC8qCi0gKiBSZWdpc3RlciBhIHF1aWVzZWNlbnQgc3RhdGUgZm9yIGFsbCBSQ1UgZmxhdm9ycy4gIElmIHRoZXJlIGlzIGFuCisgKiBSZWdpc3RlciBhIHF1aWVzY2VudCBzdGF0ZSBmb3IgYWxsIFJDVSBmbGF2b3JzLiAgSWYgdGhlcmUgaXMgYW4KICAqIGVtZXJnZW5jeSwgaW52b2tlIHJjdV9tb21lbnRhcnlfZHludGlja19pZGxlKCkgdG8gZG8gYSBoZWF2eS13ZWlnaHQKICAqIGR5bnRpY2staWRsZSBxdWllc2NlbnQgc3RhdGUgdmlzaWJsZSB0byBvdGhlciBDUFVzIChidXQgb25seSBmb3IgdGhvc2UKLSAqIFJDVSBmbGF2b3JzIGluIGRlc3BhcmF0ZSBuZWVkIG9mIGEgcXVpZXNjZW50IHN0YXRlLCB3aGljaCB3aWxsIG5vcm1hbGx5CisgKiBSQ1UgZmxhdm9ycyBpbiBkZXNwZXJhdGUgbmVlZCBvZiBhIHF1aWVzY2VudCBzdGF0ZSwgd2hpY2ggd2lsbCBub3JtYWxseQogICogYmUgbm9uZSBvZiB0aGVtKS4gIEVpdGhlciB3YXksIGRvIGEgbGlnaHR3ZWlnaHQgcXVpZXNjZW50IHN0YXRlIGZvcgogICogYWxsIFJDVSBmbGF2b3JzLgogICovCkBAIC00MTAsNiArNDI5LDE1IEBACiBFWFBPUlRfU1lNQk9MX0dQTChyY3VfYmhfZm9yY2VfcXVpZXNjZW50X3N0YXRlKTsKIAogLyoKKyAqIEZvcmNlIGEgcXVpZXNjZW50IHN0YXRlIGZvciBSQ1Utc2NoZWQuCisgKi8KK3ZvaWQgcmN1X3NjaGVkX2ZvcmNlX3F1aWVzY2VudF9zdGF0ZSh2b2lkKQoreworCWZvcmNlX3F1aWVzY2VudF9zdGF0ZSgmcmN1X3NjaGVkX3N0YXRlKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJjdV9zY2hlZF9mb3JjZV9xdWllc2NlbnRfc3RhdGUpOworCisvKgogICogU2hvdyB0aGUgc3RhdGUgb2YgdGhlIGdyYWNlLXBlcmlvZCBrdGhyZWFkcy4KICAqLwogdm9pZCBzaG93X3JjdV9ncF9rdGhyZWFkcyh2b2lkKQpAQCAtNDgzLDE1ICs1MTEsNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwocmN1dG9ydHVyZV9yZWNvcmRfcHJvZ3Jlc3MpOwogCiAvKgotICogRm9yY2UgYSBxdWllc2NlbnQgc3RhdGUgZm9yIFJDVS1zY2hlZC4KLSAqLwotdm9pZCByY3Vfc2NoZWRfZm9yY2VfcXVpZXNjZW50X3N0YXRlKHZvaWQpCi17Ci0JZm9yY2VfcXVpZXNjZW50X3N0YXRlKCZyY3Vfc2NoZWRfc3RhdGUpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocmN1X3NjaGVkX2ZvcmNlX3F1aWVzY2VudF9zdGF0ZSk7Ci0KLS8qCiAgKiBEb2VzIHRoZSBDUFUgaGF2ZSBjYWxsYmFja3MgcmVhZHkgdG8gYmUgaW52b2tlZD8KICAqLwogc3RhdGljIGludApAQCAtOTU0LDcgKzk3Myw3IEBACiAJcHJlZW1wdF9kaXNhYmxlKCk7CiAJcmRwID0gdGhpc19jcHVfcHRyKCZyY3Vfc2NoZWRfZGF0YSk7CiAJcm5wID0gcmRwLT5teW5vZGU7Ci0JcmV0ID0gKHJkcC0+Z3JwbWFzayAmIHJucC0+cXNtYXNraW5pdCkgfHwKKwlyZXQgPSAocmRwLT5ncnBtYXNrICYgcmN1X3JucF9vbmxpbmVfY3B1cyhybnApKSB8fAogCSAgICAgICFyY3Vfc2NoZWR1bGVyX2Z1bGx5X2FjdGl2ZTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogCXJldHVybiByZXQ7CkBAIC0xMTk2LDkgKzEyMTUsMTAgQEAKIAkJfSBlbHNlIHsKIAkJCWogPSBqaWZmaWVzOwogCQkJZ3BhID0gQUNDRVNTX09OQ0UocnNwLT5ncF9hY3Rpdml0eSk7Ci0JCQlwcl9lcnIoIkFsbCBRU2VzIHNlZW4sIGxhc3QgJXMga3RocmVhZCBhY3Rpdml0eSAlbGQgKCVsZC0lbGQpLCBqaWZmaWVzX3RpbGxfbmV4dF9mcXM9JWxkXG4iLAorCQkJcHJfZXJyKCJBbGwgUVNlcyBzZWVuLCBsYXN0ICVzIGt0aHJlYWQgYWN0aXZpdHkgJWxkICglbGQtJWxkKSwgamlmZmllc190aWxsX25leHRfZnFzPSVsZCwgcm9vdCAtPnFzbWFzayAlI2x4XG4iLAogCQkJICAgICAgIHJzcC0+bmFtZSwgaiAtIGdwYSwgaiwgZ3BhLAotCQkJICAgICAgIGppZmZpZXNfdGlsbF9uZXh0X2Zxcyk7CisJCQkgICAgICAgamlmZmllc190aWxsX25leHRfZnFzLAorCQkJICAgICAgIHJjdV9nZXRfcm9vdChyc3ApLT5xc21hc2spOwogCQkJLyogSW4gdGhpcyBjYXNlLCB0aGUgY3VycmVudCBDUFUgbWlnaHQgYmUgYXQgZmF1bHQuICovCiAJCQlzY2hlZF9zaG93X3Rhc2soY3VycmVudCk7CiAJCX0KQEAgLTEzMjgsMTcgKzEzNDgsMjcgQEAKIH0KIAogLyoKKyAqIEluaXRpYWxpemUgdGhlIHNwZWNpZmllZCByY3VfZGF0YSBzdHJ1Y3R1cmUncyBkZWZhdWx0IGNhbGxiYWNrIGxpc3QKKyAqIHRvIGVtcHR5LiAgVGhlIGRlZmF1bHQgY2FsbGJhY2sgbGlzdCBpcyB0aGUgb25lIHRoYXQgaXMgbm90IHVzZWQgYnkKKyAqIG5vLWNhbGxiYWNrcyBDUFVzLgorICovCitzdGF0aWMgdm9pZCBpbml0X2RlZmF1bHRfY2FsbGJhY2tfbGlzdChzdHJ1Y3QgcmN1X2RhdGEgKnJkcCkKK3sKKwlpbnQgaTsKKworCXJkcC0+bnh0bGlzdCA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IFJDVV9ORVhUX1NJWkU7IGkrKykKKwkJcmRwLT5ueHR0YWlsW2ldID0gJnJkcC0+bnh0bGlzdDsKK30KKworLyoKICAqIEluaXRpYWxpemUgdGhlIHNwZWNpZmllZCByY3VfZGF0YSBzdHJ1Y3R1cmUncyBjYWxsYmFjayBsaXN0IHRvIGVtcHR5LgogICovCiBzdGF0aWMgdm9pZCBpbml0X2NhbGxiYWNrX2xpc3Qoc3RydWN0IHJjdV9kYXRhICpyZHApCiB7Ci0JaW50IGk7Ci0KIAlpZiAoaW5pdF9ub2NiX2NhbGxiYWNrX2xpc3QocmRwKSkKIAkJcmV0dXJuOwotCXJkcC0+bnh0bGlzdCA9IE5VTEw7Ci0JZm9yIChpID0gMDsgaSA8IFJDVV9ORVhUX1NJWkU7IGkrKykKLQkJcmRwLT5ueHR0YWlsW2ldID0gJnJkcC0+bnh0bGlzdDsKKwlpbml0X2RlZmF1bHRfY2FsbGJhY2tfbGlzdChyZHApOwogfQogCiAvKgpAQCAtMTcwMywxMSArMTczMywxMSBAQAogICovCiBzdGF0aWMgaW50IHJjdV9ncF9pbml0KHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKIHsKKwl1bnNpZ25lZCBsb25nIG9sZG1hc2s7CiAJc3RydWN0IHJjdV9kYXRhICpyZHA7CiAJc3RydWN0IHJjdV9ub2RlICpybnAgPSByY3VfZ2V0X3Jvb3QocnNwKTsKIAogCUFDQ0VTU19PTkNFKHJzcC0+Z3BfYWN0aXZpdHkpID0gamlmZmllczsKLQlyY3VfYmluZF9ncF9rdGhyZWFkKCk7CiAJcmF3X3NwaW5fbG9ja19pcnEoJnJucC0+bG9jayk7CiAJc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpOwogCWlmICghQUNDRVNTX09OQ0UocnNwLT5ncF9mbGFncykpIHsKQEAgLTE3MzMsOSArMTc2Myw1NCBAQAogCXRyYWNlX3JjdV9ncmFjZV9wZXJpb2QocnNwLT5uYW1lLCByc3AtPmdwbnVtLCBUUFMoInN0YXJ0IikpOwogCXJhd19zcGluX3VubG9ja19pcnEoJnJucC0+bG9jayk7CiAKLQkvKiBFeGNsdWRlIGFueSBjb25jdXJyZW50IENQVS1ob3RwbHVnIG9wZXJhdGlvbnMuICovCi0JbXV0ZXhfbG9jaygmcnNwLT5vbm9mZl9tdXRleCk7Ci0Jc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpOyAvKiAtPmdwbnVtIGluY3JlbWVudCBiZWZvcmUgR1AhICovCisJLyoKKwkgKiBBcHBseSBwZXItbGVhZiBidWZmZXJlZCBvbmxpbmUgYW5kIG9mZmxpbmUgb3BlcmF0aW9ucyB0byB0aGUKKwkgKiByY3Vfbm9kZSB0cmVlLiAgTm90ZSB0aGF0IHRoaXMgbmV3IGdyYWNlIHBlcmlvZCBuZWVkIG5vdCB3YWl0CisJICogZm9yIHN1YnNlcXVlbnQgb25saW5lIENQVXMsIGFuZCB0aGF0IHF1aWVzY2VudC1zdGF0ZSBmb3JjaW5nCisJICogd2lsbCBoYW5kbGUgc3Vic2VxdWVudCBvZmZsaW5lIENQVXMuCisJICovCisJcmN1X2Zvcl9lYWNoX2xlYWZfbm9kZShyc3AsIHJucCkgeworCQlyYXdfc3Bpbl9sb2NrX2lycSgmcm5wLT5sb2NrKTsKKwkJc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpOworCQlpZiAocm5wLT5xc21hc2tpbml0ID09IHJucC0+cXNtYXNraW5pdG5leHQgJiYKKwkJICAgICFybnAtPndhaXRfYmxrZF90YXNrcykgeworCQkJLyogTm90aGluZyB0byBkbyBvbiB0aGlzIGxlYWYgcmN1X25vZGUgc3RydWN0dXJlLiAqLworCQkJcmF3X3NwaW5fdW5sb2NrX2lycSgmcm5wLT5sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUmVjb3JkIG9sZCBzdGF0ZSwgYXBwbHkgY2hhbmdlcyB0byAtPnFzbWFza2luaXQgZmllbGQuICovCisJCW9sZG1hc2sgPSBybnAtPnFzbWFza2luaXQ7CisJCXJucC0+cXNtYXNraW5pdCA9IHJucC0+cXNtYXNraW5pdG5leHQ7CisKKwkJLyogSWYgemVyby1uZXNzIG9mIC0+cXNtYXNraW5pdCBjaGFuZ2VkLCBwcm9wYWdhdGUgdXAgdHJlZS4gKi8KKwkJaWYgKCFvbGRtYXNrICE9ICFybnAtPnFzbWFza2luaXQpIHsKKwkJCWlmICghb2xkbWFzaykgLyogRmlyc3Qgb25saW5lIENQVSBmb3IgdGhpcyByY3Vfbm9kZS4gKi8KKwkJCQlyY3VfaW5pdF9uZXdfcm5wKHJucCk7CisJCQllbHNlIGlmIChyY3VfcHJlZW1wdF9oYXNfdGFza3Mocm5wKSkgLyogYmxvY2tlZCB0YXNrcyAqLworCQkJCXJucC0+d2FpdF9ibGtkX3Rhc2tzID0gdHJ1ZTsKKwkJCWVsc2UgLyogTGFzdCBvZmZsaW5lIENQVSBhbmQgY2FuIHByb3BhZ2F0ZS4gKi8KKwkJCQlyY3VfY2xlYW51cF9kZWFkX3JucChybnApOworCQl9CisKKwkJLyoKKwkJICogSWYgYWxsIHdhaXRlZC1vbiB0YXNrcyBmcm9tIHByaW9yIGdyYWNlIHBlcmlvZCBhcmUKKwkJICogZG9uZSwgYW5kIGlmIGFsbCB0aGlzIHJjdV9ub2RlIHN0cnVjdHVyZSdzIENQVXMgYXJlCisJCSAqIHN0aWxsIG9mZmxpbmUsIHByb3BhZ2F0ZSB1cCB0aGUgcmN1X25vZGUgdHJlZSBhbmQKKwkJICogY2xlYXIgLT53YWl0X2Jsa2RfdGFza3MuICBPdGhlcndpc2UsIGlmIG9uZSBvZiB0aGlzCisJCSAqIHJjdV9ub2RlIHN0cnVjdHVyZSdzIENQVXMgaGFzIHNpbmNlIGNvbWUgYmFjayBvbmxpbmUsCisJCSAqIHNpbXBseSBjbGVhciAtPndhaXRfYmxrZF90YXNrcyAoYnV0IHJjdV9jbGVhbnVwX2RlYWRfcm5wKCkKKwkJICogY2hlY2tzIGZvciB0aGlzLCBzbyBqdXN0IGNhbGwgaXQgdW5jb25kaXRpb25hbGx5KS4KKwkJICovCisJCWlmIChybnAtPndhaXRfYmxrZF90YXNrcyAmJgorCQkgICAgKCFyY3VfcHJlZW1wdF9oYXNfdGFza3Mocm5wKSB8fAorCQkgICAgIHJucC0+cXNtYXNraW5pdCkpIHsKKwkJCXJucC0+d2FpdF9ibGtkX3Rhc2tzID0gZmFsc2U7CisJCQlyY3VfY2xlYW51cF9kZWFkX3JucChybnApOworCQl9CisKKwkJcmF3X3NwaW5fdW5sb2NrX2lycSgmcm5wLT5sb2NrKTsKKwl9CiAKIAkvKgogCSAqIFNldCB0aGUgcXVpZXNjZW50LXN0YXRlLW5lZWRlZCBiaXRzIGluIGFsbCB0aGUgcmN1X25vZGUKQEAgLTE3NTcsOCArMTgzMiw4IEBACiAJCXJjdV9wcmVlbXB0X2NoZWNrX2Jsb2NrZWRfdGFza3Mocm5wKTsKIAkJcm5wLT5xc21hc2sgPSBybnAtPnFzbWFza2luaXQ7CiAJCUFDQ0VTU19PTkNFKHJucC0+Z3BudW0pID0gcnNwLT5ncG51bTsKLQkJV0FSTl9PTl9PTkNFKHJucC0+Y29tcGxldGVkICE9IHJzcC0+Y29tcGxldGVkKTsKLQkJQUNDRVNTX09OQ0Uocm5wLT5jb21wbGV0ZWQpID0gcnNwLT5jb21wbGV0ZWQ7CisJCWlmIChXQVJOX09OX09OQ0Uocm5wLT5jb21wbGV0ZWQgIT0gcnNwLT5jb21wbGV0ZWQpKQorCQkJQUNDRVNTX09OQ0Uocm5wLT5jb21wbGV0ZWQpID0gcnNwLT5jb21wbGV0ZWQ7CiAJCWlmIChybnAgPT0gcmRwLT5teW5vZGUpCiAJCQkodm9pZClfX25vdGVfZ3BfY2hhbmdlcyhyc3AsIHJucCwgcmRwKTsKIAkJcmN1X3ByZWVtcHRfYm9vc3Rfc3RhcnRfZ3Aocm5wKTsKQEAgLTE3NjgsOSArMTg0MywxMiBAQAogCQlyYXdfc3Bpbl91bmxvY2tfaXJxKCZybnAtPmxvY2spOwogCQljb25kX3Jlc2NoZWRfcmN1X3FzKCk7CiAJCUFDQ0VTU19PTkNFKHJzcC0+Z3BfYWN0aXZpdHkpID0gamlmZmllczsKKwkJaWYgKElTX0VOQUJMRUQoQ09ORklHX1JDVV9UT1JUVVJFX1RFU1RfU0xPV19JTklUKSAmJgorCQkgICAgZ3BfaW5pdF9kZWxheSA+IDAgJiYKKwkJICAgICEocnNwLT5ncG51bSAlIChyY3VfbnVtX25vZGVzICogMTApKSkKKwkJCXNjaGVkdWxlX3RpbWVvdXRfdW5pbnRlcnJ1cHRpYmxlKGdwX2luaXRfZGVsYXkpOwogCX0KIAotCW11dGV4X3VubG9jaygmcnNwLT5vbm9mZl9tdXRleCk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTE3OTgsNyArMTg3Niw3IEBACiAJCWZxc19zdGF0ZSA9IFJDVV9GT1JDRV9RUzsKIAl9IGVsc2UgewogCQkvKiBIYW5kbGUgZHludGljay1pZGxlIGFuZCBvZmZsaW5lIENQVXMuICovCi0JCWlzaWRsZSA9IGZhbHNlOworCQlpc2lkbGUgPSB0cnVlOwogCQlmb3JjZV9xc19ybnAocnNwLCByY3VfaW1wbGljaXRfZHludGlja3NfcXMsICZpc2lkbGUsICZtYXhqKTsKIAl9CiAJLyogQ2xlYXIgZmxhZyB0byBwcmV2ZW50IGltbWVkaWF0ZSByZS1lbnRyeS4gKi8KQEAgLTE4NTIsNiArMTkzMCw4IEBACiAJcmN1X2Zvcl9lYWNoX25vZGVfYnJlYWR0aF9maXJzdChyc3AsIHJucCkgewogCQlyYXdfc3Bpbl9sb2NrX2lycSgmcm5wLT5sb2NrKTsKIAkJc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpOworCQlXQVJOX09OX09OQ0UocmN1X3ByZWVtcHRfYmxvY2tlZF9yZWFkZXJzX2NncChybnApKTsKKwkJV0FSTl9PTl9PTkNFKHJucC0+cXNtYXNrKTsKIAkJQUNDRVNTX09OQ0Uocm5wLT5jb21wbGV0ZWQpID0gcnNwLT5ncG51bTsKIAkJcmRwID0gdGhpc19jcHVfcHRyKHJzcC0+cmRhKTsKIAkJaWYgKHJucCA9PSByZHAtPm15bm9kZSkKQEAgLTE4OTUsNiArMTk3NSw3IEBACiAJc3RydWN0IHJjdV9zdGF0ZSAqcnNwID0gYXJnOwogCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gcmN1X2dldF9yb290KHJzcCk7CiAKKwlyY3VfYmluZF9ncF9rdGhyZWFkKCk7CiAJZm9yICg7OykgewogCiAJCS8qIEhhbmRsZSBncmFjZS1wZXJpb2Qgc3RhcnQuICovCkBAIC0yMDYyLDI1ICsyMTQzLDMyIEBACiAgKiBTaW1pbGFyIHRvIHJjdV9yZXBvcnRfcXNfcmRwKCksIGZvciB3aGljaCBpdCBpcyBhIGhlbHBlciBmdW5jdGlvbi4KICAqIEFsbG93cyBxdWllc2NlbnQgc3RhdGVzIGZvciBhIGdyb3VwIG9mIENQVXMgdG8gYmUgcmVwb3J0ZWQgYXQgb25lIGdvCiAgKiB0byB0aGUgc3BlY2lmaWVkIHJjdV9ub2RlIHN0cnVjdHVyZSwgdGhvdWdoIGFsbCB0aGUgQ1BVcyBpbiB0aGUgZ3JvdXAKLSAqIG11c3QgYmUgcmVwcmVzZW50ZWQgYnkgdGhlIHNhbWUgcmN1X25vZGUgc3RydWN0dXJlICh3aGljaCBuZWVkIG5vdCBiZQotICogYSBsZWFmIHJjdV9ub2RlIHN0cnVjdHVyZSwgdGhvdWdoIGl0IG9mdGVuIHdpbGwgYmUpLiAgVGhhdCBzdHJ1Y3R1cmUncwotICogbG9jayBtdXN0IGJlIGhlbGQgdXBvbiBlbnRyeSwgYW5kIGl0IGlzIHJlbGVhc2VkIGJlZm9yZSByZXR1cm4uCisgKiBtdXN0IGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBzYW1lIHJjdV9ub2RlIHN0cnVjdHVyZSAod2hpY2ggbmVlZCBub3QgYmUgYQorICogbGVhZiByY3Vfbm9kZSBzdHJ1Y3R1cmUsIHRob3VnaCBpdCBvZnRlbiB3aWxsIGJlKS4gIFRoZSBncHMgcGFyYW1ldGVyCisgKiBpcyB0aGUgZ3JhY2UtcGVyaW9kIHNuYXBzaG90LCB3aGljaCBtZWFucyB0aGF0IHRoZSBxdWllc2NlbnQgc3RhdGVzCisgKiBhcmUgdmFsaWQgb25seSBpZiBybnAtPmdwbnVtIGlzIGVxdWFsIHRvIGdwcy4gIFRoYXQgc3RydWN0dXJlJ3MgbG9jaworICogbXVzdCBiZSBoZWxkIHVwb24gZW50cnksIGFuZCBpdCBpcyByZWxlYXNlZCBiZWZvcmUgcmV0dXJuLgogICovCiBzdGF0aWMgdm9pZAogcmN1X3JlcG9ydF9xc19ybnAodW5zaWduZWQgbG9uZyBtYXNrLCBzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsCi0JCSAgc3RydWN0IHJjdV9ub2RlICpybnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJCSAgc3RydWN0IHJjdV9ub2RlICpybnAsIHVuc2lnbmVkIGxvbmcgZ3BzLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogCV9fcmVsZWFzZXMocm5wLT5sb2NrKQogeworCXVuc2lnbmVkIGxvbmcgb2xkbWFzayA9IDA7CiAJc3RydWN0IHJjdV9ub2RlICpybnBfYzsKIAogCS8qIFdhbGsgdXAgdGhlIHJjdV9ub2RlIGhpZXJhcmNoeS4gKi8KIAlmb3IgKDs7KSB7Ci0JCWlmICghKHJucC0+cXNtYXNrICYgbWFzaykpIHsKKwkJaWYgKCEocm5wLT5xc21hc2sgJiBtYXNrKSB8fCBybnAtPmdwbnVtICE9IGdwcykgewogCi0JCQkvKiBPdXIgYml0IGhhcyBhbHJlYWR5IGJlZW4gY2xlYXJlZCwgc28gZG9uZS4gKi8KKwkJCS8qCisJCQkgKiBPdXIgYml0IGhhcyBhbHJlYWR5IGJlZW4gY2xlYXJlZCwgb3IgdGhlCisJCQkgKiByZWxldmFudCBncmFjZSBwZXJpb2QgaXMgYWxyZWFkeSBvdmVyLCBzbyBkb25lLgorCQkJICovCiAJCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJCQlyZXR1cm47CiAJCX0KKwkJV0FSTl9PTl9PTkNFKG9sZG1hc2spOyAvKiBBbnkgY2hpbGQgbXVzdCBiZSBhbGwgemVyb2VkISAqLwogCQlybnAtPnFzbWFzayAmPSB+bWFzazsKIAkJdHJhY2VfcmN1X3F1aWVzY2VudF9zdGF0ZV9yZXBvcnQocnNwLT5uYW1lLCBybnAtPmdwbnVtLAogCQkJCQkJIG1hc2ssIHJucC0+cXNtYXNrLCBybnAtPmxldmVsLApAQCAtMjEwNCw3ICsyMTkyLDcgQEAKIAkJcm5wID0gcm5wLT5wYXJlbnQ7CiAJCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJCXNtcF9tYl9fYWZ0ZXJfdW5sb2NrX2xvY2soKTsKLQkJV0FSTl9PTl9PTkNFKHJucF9jLT5xc21hc2spOworCQlvbGRtYXNrID0gcm5wX2MtPnFzbWFzazsKIAl9CiAKIAkvKgpAQCAtMjExNiw2ICsyMjA0LDQ2IEBACiB9CiAKIC8qCisgKiBSZWNvcmQgYSBxdWllc2NlbnQgc3RhdGUgZm9yIGFsbCB0YXNrcyB0aGF0IHdlcmUgcHJldmlvdXNseSBxdWV1ZWQKKyAqIG9uIHRoZSBzcGVjaWZpZWQgcmN1X25vZGUgc3RydWN0dXJlIGFuZCB0aGF0IHdlcmUgYmxvY2tpbmcgdGhlIGN1cnJlbnQKKyAqIFJDVSBncmFjZSBwZXJpb2QuICBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgc3BlY2lmaWVkIHJucC0+bG9jayB3aXRoCisgKiBpcnFzIGRpc2FibGVkLCBhbmQgdGhpcyBsb2NrIGlzIHJlbGVhc2VkIHVwb24gcmV0dXJuLCBidXQgaXJxcyByZW1haW4KKyAqIGRpc2FibGVkLgorICovCitzdGF0aWMgdm9pZCByY3VfcmVwb3J0X3VuYmxvY2tfcXNfcm5wKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwKKwkJCQkgICAgICBzdHJ1Y3QgcmN1X25vZGUgKnJucCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwlfX3JlbGVhc2VzKHJucC0+bG9jaykKK3sKKwl1bnNpZ25lZCBsb25nIGdwczsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJc3RydWN0IHJjdV9ub2RlICpybnBfcDsKKworCWlmIChyY3Vfc3RhdGVfcCA9PSAmcmN1X3NjaGVkX3N0YXRlIHx8IHJzcCAhPSByY3Vfc3RhdGVfcCB8fAorCSAgICBybnAtPnFzbWFzayAhPSAwIHx8IHJjdV9wcmVlbXB0X2Jsb2NrZWRfcmVhZGVyc19jZ3Aocm5wKSkgeworCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsgIC8qIFN0aWxsIG5lZWQgbW9yZSBxdWllc2NlbnQgc3RhdGVzISAqLworCX0KKworCXJucF9wID0gcm5wLT5wYXJlbnQ7CisJaWYgKHJucF9wID09IE5VTEwpIHsKKwkJLyoKKwkJICogT25seSBvbmUgcmN1X25vZGUgc3RydWN0dXJlIGluIHRoZSB0cmVlLCBzbyBkb24ndAorCQkgKiB0cnkgdG8gcmVwb3J0IHVwIHRvIGl0cyBub25leGlzdGVudCBwYXJlbnQhCisJCSAqLworCQlyY3VfcmVwb3J0X3FzX3JzcChyc3AsIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlcG9ydCB1cCB0aGUgcmVzdCBvZiB0aGUgaGllcmFyY2h5LCB0cmFja2luZyBjdXJyZW50IC0+Z3BudW0uICovCisJZ3BzID0gcm5wLT5ncG51bTsKKwltYXNrID0gcm5wLT5ncnBtYXNrOworCXJhd19zcGluX3VubG9jaygmcm5wLT5sb2NrKTsJLyogaXJxcyByZW1haW4gZGlzYWJsZWQuICovCisJcmF3X3NwaW5fbG9jaygmcm5wX3AtPmxvY2spOwkvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQuICovCisJc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpOworCXJjdV9yZXBvcnRfcXNfcm5wKG1hc2ssIHJzcCwgcm5wX3AsIGdwcywgZmxhZ3MpOworfQorCisvKgogICogUmVjb3JkIGEgcXVpZXNjZW50IHN0YXRlIGZvciB0aGUgc3BlY2lmaWVkIENQVSB0byB0aGF0IENQVSdzIHJjdV9kYXRhCiAgKiBzdHJ1Y3R1cmUuICBUaGlzIG11c3QgYmUgZWl0aGVyIGNhbGxlZCBmcm9tIHRoZSBzcGVjaWZpZWQgQ1BVLCBvcgogICogY2FsbGVkIHdoZW4gdGhlIHNwZWNpZmllZCBDUFUgaXMga25vd24gdG8gYmUgb2ZmbGluZSAoYW5kIHdoZW4gaXQgaXMKQEAgLTIxNjMsNyArMjI5MSw4IEBACiAJCSAqLwogCQluZWVkd2FrZSA9IHJjdV9hY2NlbGVyYXRlX2Nicyhyc3AsIHJucCwgcmRwKTsKIAotCQlyY3VfcmVwb3J0X3FzX3JucChtYXNrLCByc3AsIHJucCwgZmxhZ3MpOyAvKiBybHNlcyBybnAtPmxvY2sgKi8KKwkJcmN1X3JlcG9ydF9xc19ybnAobWFzaywgcnNwLCBybnAsIHJucC0+Z3BudW0sIGZsYWdzKTsKKwkJLyogXl5eIFJlbGVhc2VkIHJucC0+bG9jayAqLwogCQlpZiAobmVlZHdha2UpCiAJCQlyY3VfZ3Bfa3RocmVhZF93YWtlKHJzcCk7CiAJfQpAQCAtMjI1Niw4ICsyMzg1LDEyIEBACiAJCXJzcC0+b3JwaGFuX2RvbmV0YWlsID0gcmRwLT5ueHR0YWlsW1JDVV9ET05FX1RBSUxdOwogCX0KIAotCS8qIEZpbmFsbHksIGluaXRpYWxpemUgdGhlIHJjdV9kYXRhIHN0cnVjdHVyZSdzIGxpc3QgdG8gZW1wdHkuICAqLworCS8qCisJICogRmluYWxseSwgaW5pdGlhbGl6ZSB0aGUgcmN1X2RhdGEgc3RydWN0dXJlJ3MgbGlzdCB0byBlbXB0eSBhbmQKKwkgKiBkaXNhbGxvdyBmdXJ0aGVyIGNhbGxiYWNrcyBvbiB0aGlzIENQVS4KKwkgKi8KIAlpbml0X2NhbGxiYWNrX2xpc3QocmRwKTsKKwlyZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF0gPSBOVUxMOwogfQogCiAvKgpAQCAtMjM1NSw2ICsyNDg4LDcgQEAKIAkJcmF3X3NwaW5fbG9jaygmcm5wLT5sb2NrKTsgLyogaXJxcyBhbHJlYWR5IGRpc2FibGVkLiAqLwogCQlzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCk7IC8qIEdQIG1lbW9yeSBvcmRlcmluZy4gKi8KIAkJcm5wLT5xc21hc2tpbml0ICY9IH5tYXNrOworCQlybnAtPnFzbWFzayAmPSB+bWFzazsKIAkJaWYgKHJucC0+cXNtYXNraW5pdCkgewogCQkJcmF3X3NwaW5fdW5sb2NrKCZybnAtPmxvY2spOyAvKiBpcnFzIHJlbWFpbiBkaXNhYmxlZC4gKi8KIAkJCXJldHVybjsKQEAgLTIzNjQsNiArMjQ5OCwyNiBAQAogfQogCiAvKgorICogVGhlIENQVSBpcyBleGl0aW5nIHRoZSBpZGxlIGxvb3AgaW50byB0aGUgYXJjaF9jcHVfaWRsZV9kZWFkKCkKKyAqIGZ1bmN0aW9uLiAgV2Ugbm93IHJlbW92ZSBpdCBmcm9tIHRoZSByY3Vfbm9kZSB0cmVlJ3MgLT5xc21hc2tpbml0CisgKiBiaXQgbWFza3MuCisgKi8KK3N0YXRpYyB2b2lkIHJjdV9jbGVhbnVwX2R5aW5nX2lkbGVfY3B1KGludCBjcHUsIHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHBlcl9jcHVfcHRyKHJzcC0+cmRhLCBjcHUpOworCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gcmRwLT5teW5vZGU7ICAvKiBPdXRnb2luZyBDUFUncyByZHAgJiBybnAuICovCisKKwkvKiBSZW1vdmUgb3V0Z29pbmcgQ1BVIGZyb20gbWFzayBpbiB0aGUgbGVhZiByY3Vfbm9kZSBzdHJ1Y3R1cmUuICovCisJbWFzayA9IHJkcC0+Z3JwbWFzazsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOworCXNtcF9tYl9fYWZ0ZXJfdW5sb2NrX2xvY2soKTsJLyogRW5mb3JjZSBHUCBtZW1vcnktb3JkZXIgZ3VhcmFudGVlLiAqLworCXJucC0+cXNtYXNraW5pdG5leHQgJj0gfm1hc2s7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOworfQorCisvKgogICogVGhlIENQVSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlbW92ZWQsIGFuZCBzb21lIG90aGVyIENQVSBpcyByZXBvcnRpbmcKICAqIHRoaXMgZmFjdCBmcm9tIHByb2Nlc3MgY29udGV4dC4gIERvIHRoZSByZW1haW5kZXIgb2YgdGhlIGNsZWFudXAsCiAgKiBpbmNsdWRpbmcgb3JwaGFuaW5nIHRoZSBvdXRnb2luZyBDUFUncyBSQ1UgY2FsbGJhY2tzLCBhbmQgYWxzbwpAQCAtMjM3OSwyOSArMjUzMywxNSBAQAogCS8qIEFkanVzdCBhbnkgbm8tbG9uZ2VyLW5lZWRlZCBrdGhyZWFkcy4gKi8KIAlyY3VfYm9vc3Rfa3RocmVhZF9zZXRhZmZpbml0eShybnAsIC0xKTsKIAotCS8qIEV4Y2x1ZGUgYW55IGF0dGVtcHRzIHRvIHN0YXJ0IGEgbmV3IGdyYWNlIHBlcmlvZC4gKi8KLQltdXRleF9sb2NrKCZyc3AtPm9ub2ZmX211dGV4KTsKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJzcC0+b3JwaGFuX2xvY2ssIGZsYWdzKTsKLQogCS8qIE9ycGhhbiB0aGUgZGVhZCBDUFUncyBjYWxsYmFja3MsIGFuZCBhZG9wdCB0aGVtIGlmIGFwcHJvcHJpYXRlLiAqLworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcnNwLT5vcnBoYW5fbG9jaywgZmxhZ3MpOwogCXJjdV9zZW5kX2Nic190b19vcnBoYW5hZ2UoY3B1LCByc3AsIHJucCwgcmRwKTsKIAlyY3VfYWRvcHRfb3JwaGFuX2Nicyhyc3AsIGZsYWdzKTsKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNwLT5vcnBoYW5fbG9jaywgZmxhZ3MpOwogCi0JLyogUmVtb3ZlIG91dGdvaW5nIENQVSBmcm9tIG1hc2sgaW4gdGhlIGxlYWYgcmN1X25vZGUgc3RydWN0dXJlLiAqLwotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcm5wLT5sb2NrLCBmbGFncyk7Ci0Jc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpOwkvKiBFbmZvcmNlIEdQIG1lbW9yeS1vcmRlciBndWFyYW50ZWUuICovCi0Jcm5wLT5xc21hc2tpbml0ICY9IH5yZHAtPmdycG1hc2s7Ci0JaWYgKHJucC0+cXNtYXNraW5pdCA9PSAwICYmICFyY3VfcHJlZW1wdF9oYXNfdGFza3Mocm5wKSkKLQkJcmN1X2NsZWFudXBfZGVhZF9ybnAocm5wKTsKLQlyY3VfcmVwb3J0X3FzX3JucChyZHAtPmdycG1hc2ssIHJzcCwgcm5wLCBmbGFncyk7IC8qIFJsc2VzIHJucC0+bG9jay4gKi8KIAlXQVJOX09OQ0UocmRwLT5xbGVuICE9IDAgfHwgcmRwLT5ueHRsaXN0ICE9IE5VTEwsCiAJCSAgInJjdV9jbGVhbnVwX2RlYWRfY3B1OiBDYWxsYmFja3Mgb24gb2ZmbGluZSBDUFUgJWQ6IHFsZW49JWx1LCBueHRsaXN0PSVwXG4iLAogCQkgIGNwdSwgcmRwLT5xbGVuLCByZHAtPm54dGxpc3QpOwotCWluaXRfY2FsbGJhY2tfbGlzdChyZHApOwotCS8qIERpc2FsbG93IGZ1cnRoZXIgY2FsbGJhY2tzIG9uIHRoaXMgQ1BVLiAqLwotCXJkcC0+bnh0dGFpbFtSQ1VfTkVYVF9UQUlMXSA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZyc3AtPm9ub2ZmX211dGV4KTsKIH0KIAogI2Vsc2UgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLwpAQCAtMjQxNCw2ICsyNTU0LDEwIEBACiB7CiB9CiAKK3N0YXRpYyB2b2lkIHJjdV9jbGVhbnVwX2R5aW5nX2lkbGVfY3B1KGludCBjcHUsIHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKK30KKwogc3RhdGljIHZvaWQgcmN1X2NsZWFudXBfZGVhZF9jcHUoaW50IGNwdSwgc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQogewogfQpAQCAtMjU4OSwyNiArMjczMyw0NyBAQAogCQkJcmV0dXJuOwogCQl9CiAJCWlmIChybnAtPnFzbWFzayA9PSAwKSB7Ci0JCQlyY3VfaW5pdGlhdGVfYm9vc3Qocm5wLCBmbGFncyk7IC8qIHJlbGVhc2VzIHJucC0+bG9jayAqLwotCQkJY29udGludWU7CisJCQlpZiAocmN1X3N0YXRlX3AgPT0gJnJjdV9zY2hlZF9zdGF0ZSB8fAorCQkJICAgIHJzcCAhPSByY3Vfc3RhdGVfcCB8fAorCQkJICAgIHJjdV9wcmVlbXB0X2Jsb2NrZWRfcmVhZGVyc19jZ3Aocm5wKSkgeworCQkJCS8qCisJCQkJICogTm8gcG9pbnQgaW4gc2Nhbm5pbmcgYml0cyBiZWNhdXNlIHRoZXkKKwkJCQkgKiBhcmUgYWxsIHplcm8uICBCdXQgd2UgbWlnaHQgbmVlZCB0bworCQkJCSAqIHByaW9yaXR5LWJvb3N0IGJsb2NrZWQgcmVhZGVycy4KKwkJCQkgKi8KKwkJCQlyY3VfaW5pdGlhdGVfYm9vc3Qocm5wLCBmbGFncyk7CisJCQkJLyogcmN1X2luaXRpYXRlX2Jvb3N0KCkgcmVsZWFzZXMgcm5wLT5sb2NrICovCisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAocm5wLT5wYXJlbnQgJiYKKwkJCSAgICAocm5wLT5wYXJlbnQtPnFzbWFzayAmIHJucC0+Z3JwbWFzaykpIHsKKwkJCQkvKgorCQkJCSAqIFJhY2UgYmV0d2VlbiBncmFjZS1wZXJpb2QKKwkJCQkgKiBpbml0aWFsaXphdGlvbiBhbmQgdGFzayBleGl0aW5nIFJDVQorCQkJCSAqIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uOiBSZXBvcnQuCisJCQkJICovCisJCQkJcmN1X3JlcG9ydF91bmJsb2NrX3FzX3JucChyc3AsIHJucCwgZmxhZ3MpOworCQkJCS8qIHJjdV9yZXBvcnRfdW5ibG9ja19xc19ybnAoKSBybHNlcyAtPmxvY2sgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KIAkJfQogCQljcHUgPSBybnAtPmdycGxvOwogCQliaXQgPSAxOwogCQlmb3IgKDsgY3B1IDw9IHJucC0+Z3JwaGk7IGNwdSsrLCBiaXQgPDw9IDEpIHsKIAkJCWlmICgocm5wLT5xc21hc2sgJiBiaXQpICE9IDApIHsKLQkJCQlpZiAoKHJucC0+cXNtYXNraW5pdCAmIGJpdCkgIT0gMCkKLQkJCQkJKmlzaWRsZSA9IGZhbHNlOworCQkJCWlmICgocm5wLT5xc21hc2tpbml0ICYgYml0KSA9PSAwKQorCQkJCQkqaXNpZGxlID0gZmFsc2U7IC8qIFBlbmRpbmcgaG90cGx1Zy4gKi8KIAkJCQlpZiAoZihwZXJfY3B1X3B0cihyc3AtPnJkYSwgY3B1KSwgaXNpZGxlLCBtYXhqKSkKIAkJCQkJbWFzayB8PSBiaXQ7CiAJCQl9CiAJCX0KIAkJaWYgKG1hc2sgIT0gMCkgewotCi0JCQkvKiByY3VfcmVwb3J0X3FzX3JucCgpIHJlbGVhc2VzIHJucC0+bG9jay4gKi8KLQkJCXJjdV9yZXBvcnRfcXNfcm5wKG1hc2ssIHJzcCwgcm5wLCBmbGFncyk7Ci0JCQljb250aW51ZTsKKwkJCS8qIElkbGUvb2ZmbGluZSBDUFVzLCByZXBvcnQgKHJlbGVhc2VzIHJucC0+bG9jay4gKi8KKwkJCXJjdV9yZXBvcnRfcXNfcm5wKG1hc2ssIHJzcCwgcm5wLCBybnAtPmdwbnVtLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQkvKiBOb3RoaW5nIHRvIGRvIGhlcmUsIHNvIGp1c3QgZHJvcCB0aGUgbG9jay4gKi8KKwkJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIAkJfQotCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CiAJfQogfQogCkBAIC0yNzQxLDcgKzI5MDYsNyBAQAogCSAqIElmIGNhbGxlZCBmcm9tIGFuIGV4dGVuZGVkIHF1aWVzY2VudCBzdGF0ZSwgaW52b2tlIHRoZSBSQ1UKIAkgKiBjb3JlIGluIG9yZGVyIHRvIGZvcmNlIGEgcmUtZXZhbHVhdGlvbiBvZiBSQ1UncyBpZGxlbmVzcy4KIAkgKi8KLQlpZiAoIXJjdV9pc193YXRjaGluZygpICYmIGNwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpKSkKKwlpZiAoIXJjdV9pc193YXRjaGluZygpKQogCQlpbnZva2VfcmN1X2NvcmUoKTsKIAogCS8qIElmIGludGVycnVwdHMgd2VyZSBkaXNhYmxlZCBvciBDUFUgb2ZmbGluZSwgZG9uJ3QgaW52b2tlIFJDVSBjb3JlLiAqLwpAQCAtMjgyNywxMSArMjk5MiwyMiBAQAogCiAJCWlmIChjcHUgIT0gLTEpCiAJCQlyZHAgPSBwZXJfY3B1X3B0cihyc3AtPnJkYSwgY3B1KTsKLQkJb2ZmbGluZSA9ICFfX2NhbGxfcmN1X25vY2IocmRwLCBoZWFkLCBsYXp5LCBmbGFncyk7Ci0JCVdBUk5fT05fT05DRShvZmZsaW5lKTsKLQkJLyogX2NhbGxfcmN1KCkgaXMgaWxsZWdhbCBvbiBvZmZsaW5lIENQVTsgbGVhayB0aGUgY2FsbGJhY2suICovCi0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuOworCQlpZiAobGlrZWx5KHJkcC0+bXlub2RlKSkgeworCQkJLyogUG9zdC1ib290LCBzbyB0aGlzIHNob3VsZCBiZSBmb3IgYSBuby1DQnMgQ1BVLiAqLworCQkJb2ZmbGluZSA9ICFfX2NhbGxfcmN1X25vY2IocmRwLCBoZWFkLCBsYXp5LCBmbGFncyk7CisJCQlXQVJOX09OX09OQ0Uob2ZmbGluZSk7CisJCQkvKiBPZmZsaW5lIENQVSwgX2NhbGxfcmN1KCkgaWxsZWdhbCwgbGVhayBjYWxsYmFjay4gICovCisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJLyoKKwkJICogVmVyeSBlYXJseSBib290LCBiZWZvcmUgcmN1X2luaXQoKS4gIEluaXRpYWxpemUgaWYgbmVlZGVkCisJCSAqIGFuZCB0aGVuIGRyb3AgdGhyb3VnaCB0byBxdWV1ZSB0aGUgY2FsbGJhY2suCisJCSAqLworCQlCVUdfT04oY3B1ICE9IC0xKTsKKwkJV0FSTl9PTl9PTkNFKCFyY3VfaXNfd2F0Y2hpbmcoKSk7CisJCWlmICghbGlrZWx5KHJkcC0+bnh0bGlzdCkpCisJCQlpbml0X2RlZmF1bHRfY2FsbGJhY2tfbGlzdChyZHApOwogCX0KIAlBQ0NFU1NfT05DRShyZHAtPnFsZW4pID0gcmRwLT5xbGVuICsgMTsKIAlpZiAobGF6eSkKQEAgLTI5NTQsNyArMzEzMCw3IEBACiAJCQkgICAiSWxsZWdhbCBzeW5jaHJvbml6ZV9zY2hlZCgpIGluIFJDVS1zY2hlZCByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiIpOwogCWlmIChyY3VfYmxvY2tpbmdfaXNfZ3AoKSkKIAkJcmV0dXJuOwotCWlmIChyY3VfZXhwZWRpdGVkKQorCWlmIChyY3VfZ3BfaXNfZXhwZWRpdGVkKCkpCiAJCXN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCgpOwogCWVsc2UKIAkJd2FpdF9yY3VfZ3AoY2FsbF9yY3Vfc2NoZWQpOwpAQCAtMjk4MSw3ICszMTU3LDcgQEAKIAkJCSAgICJJbGxlZ2FsIHN5bmNocm9uaXplX3JjdV9iaCgpIGluIFJDVS1iaCByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiIpOwogCWlmIChyY3VfYmxvY2tpbmdfaXNfZ3AoKSkKIAkJcmV0dXJuOwotCWlmIChyY3VfZXhwZWRpdGVkKQorCWlmIChyY3VfZ3BfaXNfZXhwZWRpdGVkKCkpCiAJCXN5bmNocm9uaXplX3JjdV9iaF9leHBlZGl0ZWQoKTsKIAllbHNlCiAJCXdhaXRfcmN1X2dwKGNhbGxfcmN1X2JoKTsKQEAgLTM1MTgsNiArMzY5NCwyOCBAQAogRVhQT1JUX1NZTUJPTF9HUEwocmN1X2JhcnJpZXJfc2NoZWQpOwogCiAvKgorICogUHJvcGFnYXRlIC0+cXNpbml0bWFzayBiaXRzIHVwIHRoZSByY3Vfbm9kZSB0cmVlIHRvIGFjY291bnQgZm9yIHRoZQorICogZmlyc3QgQ1BVIGluIGEgZ2l2ZW4gbGVhZiByY3Vfbm9kZSBzdHJ1Y3R1cmUgY29taW5nIG9ubGluZS4gIFRoZSBjYWxsZXIKKyAqIG11c3QgaG9sZCB0aGUgY29ycmVzcG9uZGluZyBsZWFmIHJjdV9ub2RlIC0+bG9jayB3aXRoIGludGVycnJ1cHRzCisgKiBkaXNhYmxlZC4KKyAqLworc3RhdGljIHZvaWQgcmN1X2luaXRfbmV3X3JucChzdHJ1Y3QgcmN1X25vZGUgKnJucF9sZWFmKQoreworCWxvbmcgbWFzazsKKwlzdHJ1Y3QgcmN1X25vZGUgKnJucCA9IHJucF9sZWFmOworCisJZm9yICg7OykgeworCQltYXNrID0gcm5wLT5ncnBtYXNrOworCQlybnAgPSBybnAtPnBhcmVudDsKKwkJaWYgKHJucCA9PSBOVUxMKQorCQkJcmV0dXJuOworCQlyYXdfc3Bpbl9sb2NrKCZybnAtPmxvY2spOyAvKiBJbnRlcnJ1cHRzIGFscmVhZHkgZGlzYWJsZWQuICovCisJCXJucC0+cXNtYXNraW5pdCB8PSBtYXNrOworCQlyYXdfc3Bpbl91bmxvY2soJnJucC0+bG9jayk7IC8qIEludGVycnVwdHMgcmVtYWluIGRpc2FibGVkLiAqLworCX0KK30KKworLyoKICAqIERvIGJvb3QtdGltZSBpbml0aWFsaXphdGlvbiBvZiBhIENQVSdzIHBlci1DUFUgUkNVIGRhdGEuCiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdApAQCAtMzU1Myw0OSArMzc1MSwzNyBAQAogCXN0cnVjdCByY3VfZGF0YSAqcmRwID0gcGVyX2NwdV9wdHIocnNwLT5yZGEsIGNwdSk7CiAJc3RydWN0IHJjdV9ub2RlICpybnAgPSByY3VfZ2V0X3Jvb3QocnNwKTsKIAotCS8qIEV4Y2x1ZGUgbmV3IGdyYWNlIHBlcmlvZHMuICovCi0JbXV0ZXhfbG9jaygmcnNwLT5vbm9mZl9tdXRleCk7Ci0KIAkvKiBTZXQgdXAgbG9jYWwgc3RhdGUsIGVuc3VyaW5nIGNvbnNpc3RlbnQgdmlldyBvZiBnbG9iYWwgc3RhdGUuICovCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKIAlyZHAtPmJlZW5vbmxpbmUgPSAxOwkgLyogV2UgaGF2ZSBub3cgYmVlbiBvbmxpbmUuICovCiAJcmRwLT5xbGVuX2xhc3RfZnFzX2NoZWNrID0gMDsKIAlyZHAtPm5fZm9yY2VfcXNfc25hcCA9IHJzcC0+bl9mb3JjZV9xczsKIAlyZHAtPmJsaW1pdCA9IGJsaW1pdDsKLQlpbml0X2NhbGxiYWNrX2xpc3QocmRwKTsgIC8qIFJlLWVuYWJsZSBjYWxsYmFja3Mgb24gdGhpcyBDUFUuICovCisJaWYgKCFyZHAtPm54dGxpc3QpCisJCWluaXRfY2FsbGJhY2tfbGlzdChyZHApOyAgLyogUmUtZW5hYmxlIGNhbGxiYWNrcyBvbiB0aGlzIENQVS4gKi8KIAlyZHAtPmR5bnRpY2tzLT5keW50aWNrc19uZXN0aW5nID0gRFlOVElDS19UQVNLX0VYSVRfSURMRTsKIAlyY3Vfc3lzaWRsZV9pbml0X3BlcmNwdV9kYXRhKHJkcC0+ZHludGlja3MpOwogCWF0b21pY19zZXQoJnJkcC0+ZHludGlja3MtPmR5bnRpY2tzLAogCQkgICAoYXRvbWljX3JlYWQoJnJkcC0+ZHludGlja3MtPmR5bnRpY2tzKSAmIH4weDEpICsgMSk7CiAJcmF3X3NwaW5fdW5sb2NrKCZybnAtPmxvY2spOwkJLyogaXJxcyByZW1haW4gZGlzYWJsZWQuICovCiAKLQkvKiBBZGQgQ1BVIHRvIHJjdV9ub2RlIGJpdG1hc2tzLiAqLworCS8qCisJICogQWRkIENQVSB0byBsZWFmIHJjdV9ub2RlIHBlbmRpbmctb25saW5lIGJpdG1hc2suICBBbnkgbmVlZGVkCisJICogcHJvcGFnYXRpb24gdXAgdGhlIHJjdV9ub2RlIHRyZWUgd2lsbCBoYXBwZW4gYXQgdGhlIGJlZ2lubmluZworCSAqIG9mIHRoZSBuZXh0IGdyYWNlIHBlcmlvZC4KKwkgKi8KIAlybnAgPSByZHAtPm15bm9kZTsKIAltYXNrID0gcmRwLT5ncnBtYXNrOwotCWRvIHsKLQkJLyogRXhjbHVkZSBhbnkgYXR0ZW1wdHMgdG8gc3RhcnQgYSBuZXcgR1Agb24gc21hbGwgc3lzdGVtcy4gKi8KLQkJcmF3X3NwaW5fbG9jaygmcm5wLT5sb2NrKTsJLyogaXJxcyBhbHJlYWR5IGRpc2FibGVkLiAqLwotCQlybnAtPnFzbWFza2luaXQgfD0gbWFzazsKLQkJbWFzayA9IHJucC0+Z3JwbWFzazsKLQkJaWYgKHJucCA9PSByZHAtPm15bm9kZSkgewotCQkJLyoKLQkJCSAqIElmIHRoZXJlIGlzIGEgZ3JhY2UgcGVyaW9kIGluIHByb2dyZXNzLCB3ZSB3aWxsCi0JCQkgKiBzZXQgdXAgdG8gd2FpdCBmb3IgaXQgbmV4dCB0aW1lIHdlIHJ1biB0aGUKLQkJCSAqIFJDVSBjb3JlIGNvZGUuCi0JCQkgKi8KLQkJCXJkcC0+Z3BudW0gPSBybnAtPmNvbXBsZXRlZDsKLQkJCXJkcC0+Y29tcGxldGVkID0gcm5wLT5jb21wbGV0ZWQ7Ci0JCQlyZHAtPnBhc3NlZF9xdWllc2NlID0gMDsKLQkJCXJkcC0+cmN1X3FzX2N0cl9zbmFwID0gX190aGlzX2NwdV9yZWFkKHJjdV9xc19jdHIpOwotCQkJcmRwLT5xc19wZW5kaW5nID0gMDsKLQkJCXRyYWNlX3JjdV9ncmFjZV9wZXJpb2QocnNwLT5uYW1lLCByZHAtPmdwbnVtLCBUUFMoImNwdW9ubCIpKTsKLQkJfQotCQlyYXdfc3Bpbl91bmxvY2soJnJucC0+bG9jayk7IC8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZC4gKi8KLQkJcm5wID0gcm5wLT5wYXJlbnQ7Ci0JfSB3aGlsZSAocm5wICE9IE5VTEwgJiYgIShybnAtPnFzbWFza2luaXQgJiBtYXNrKSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JbXV0ZXhfdW5sb2NrKCZyc3AtPm9ub2ZmX211dGV4KTsKKwlyYXdfc3Bpbl9sb2NrKCZybnAtPmxvY2spOwkJLyogaXJxcyBhbHJlYWR5IGRpc2FibGVkLiAqLworCXNtcF9tYl9fYWZ0ZXJfdW5sb2NrX2xvY2soKTsKKwlybnAtPnFzbWFza2luaXRuZXh0IHw9IG1hc2s7CisJcmRwLT5ncG51bSA9IHJucC0+Y29tcGxldGVkOyAvKiBNYWtlIENQVSBsYXRlciBub3RlIGFueSBuZXcgR1AuICovCisJcmRwLT5jb21wbGV0ZWQgPSBybnAtPmNvbXBsZXRlZDsKKwlyZHAtPnBhc3NlZF9xdWllc2NlID0gZmFsc2U7CisJcmRwLT5yY3VfcXNfY3RyX3NuYXAgPSBfX3RoaXNfY3B1X3JlYWQocmN1X3FzX2N0cik7CisJcmRwLT5xc19wZW5kaW5nID0gZmFsc2U7CisJdHJhY2VfcmN1X2dyYWNlX3BlcmlvZChyc3AtPm5hbWUsIHJkcC0+Z3BudW0sIFRQUygiY3B1b25sIikpOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgcmN1X3ByZXBhcmVfY3B1KGludCBjcHUpCkBAIC0zNjA5LDE1ICszNzk1LDE0IEBACiAvKgogICogSGFuZGxlIENQVSBvbmxpbmUvb2ZmbGluZSBub3RpZmljYXRpb24gZXZlbnRzLgogICovCi1zdGF0aWMgaW50IHJjdV9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCitpbnQgcmN1X2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAorCQkgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKIAlsb25nIGNwdSA9IChsb25nKWhjcHU7CiAJc3RydWN0IHJjdV9kYXRhICpyZHAgPSBwZXJfY3B1X3B0cihyY3Vfc3RhdGVfcC0+cmRhLCBjcHUpOwogCXN0cnVjdCByY3Vfbm9kZSAqcm5wID0gcmRwLT5teW5vZGU7CiAJc3RydWN0IHJjdV9zdGF0ZSAqcnNwOwogCi0JdHJhY2VfcmN1X3V0aWxpemF0aW9uKFRQUygiU3RhcnQgQ1BVIGhvdHBsdWciKSk7CiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIENQVV9VUF9QUkVQQVJFOgogCWNhc2UgQ1BVX1VQX1BSRVBBUkVfRlJPWkVOOgpAQCAtMzYzNyw2ICszODIyLDExIEBACiAJCWZvcl9lYWNoX3JjdV9mbGF2b3IocnNwKQogCQkJcmN1X2NsZWFudXBfZHlpbmdfY3B1KHJzcCk7CiAJCWJyZWFrOworCWNhc2UgQ1BVX0RZSU5HX0lETEU6CisJCWZvcl9lYWNoX3JjdV9mbGF2b3IocnNwKSB7CisJCQlyY3VfY2xlYW51cF9keWluZ19pZGxlX2NwdShjcHUsIHJzcCk7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBDUFVfREVBRDoKIAljYXNlIENQVV9ERUFEX0ZST1pFTjoKIAljYXNlIENQVV9VUF9DQU5DRUxFRDoKQEAgLTM2NDksNyArMzgzOSw2IEBACiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQotCXRyYWNlX3JjdV91dGlsaXphdGlvbihUUFMoIkVuZCBDUFUgaG90cGx1ZyIpKTsKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCkBAIC0zNjYwLDExICszODQ5LDEyIEBACiAJY2FzZSBQTV9ISUJFUk5BVElPTl9QUkVQQVJFOgogCWNhc2UgUE1fU1VTUEVORF9QUkVQQVJFOgogCQlpZiAobnJfY3B1X2lkcyA8PSAyNTYpIC8qIEV4cGVkaXRpbmcgYmFkIGZvciBsYXJnZSBzeXN0ZW1zLiAqLwotCQkJcmN1X2V4cGVkaXRlZCA9IDE7CisJCQlyY3VfZXhwZWRpdGVfZ3AoKTsKIAkJYnJlYWs7CiAJY2FzZSBQTV9QT1NUX0hJQkVSTkFUSU9OOgogCWNhc2UgUE1fUE9TVF9TVVNQRU5EOgotCQlyY3VfZXhwZWRpdGVkID0gMDsKKwkJaWYgKG5yX2NwdV9pZHMgPD0gMjU2KSAvKiBFeHBlZGl0aW5nIGJhZCBmb3IgbGFyZ2Ugc3lzdGVtcy4gKi8KKwkJCXJjdV91bmV4cGVkaXRlX2dwKCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMzczNCwzMCArMzkyNCwyNiBAQAogICogQ29tcHV0ZSB0aGUgcGVyLWxldmVsIGZhbm91dCwgZWl0aGVyIHVzaW5nIHRoZSBleGFjdCBmYW5vdXQgc3BlY2lmaWVkCiAgKiBvciBiYWxhbmNpbmcgdGhlIHRyZWUsIGRlcGVuZGluZyBvbiBDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVC4KICAqLwotI2lmZGVmIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUCiBzdGF0aWMgdm9pZCBfX2luaXQgcmN1X2luaXRfbGV2ZWxzcHJlYWQoc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQogewogCWludCBpOwogCi0JcnNwLT5sZXZlbHNwcmVhZFtyY3VfbnVtX2x2bHMgLSAxXSA9IHJjdV9mYW5vdXRfbGVhZjsKLQlmb3IgKGkgPSByY3VfbnVtX2x2bHMgLSAyOyBpID49IDA7IGktLSkKLQkJcnNwLT5sZXZlbHNwcmVhZFtpXSA9IENPTkZJR19SQ1VfRkFOT1VUOwotfQotI2Vsc2UgLyogI2lmZGVmIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUICovCi1zdGF0aWMgdm9pZCBfX2luaXQgcmN1X2luaXRfbGV2ZWxzcHJlYWQoc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQotewotCWludCBjY3VyOwotCWludCBjcHJ2OwotCWludCBpOworCWlmIChJU19FTkFCTEVEKENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUKSkgeworCQlyc3AtPmxldmVsc3ByZWFkW3JjdV9udW1fbHZscyAtIDFdID0gcmN1X2Zhbm91dF9sZWFmOworCQlmb3IgKGkgPSByY3VfbnVtX2x2bHMgLSAyOyBpID49IDA7IGktLSkKKwkJCXJzcC0+bGV2ZWxzcHJlYWRbaV0gPSBDT05GSUdfUkNVX0ZBTk9VVDsKKwl9IGVsc2UgeworCQlpbnQgY2N1cjsKKwkJaW50IGNwcnY7CiAKLQljcHJ2ID0gbnJfY3B1X2lkczsKLQlmb3IgKGkgPSByY3VfbnVtX2x2bHMgLSAxOyBpID49IDA7IGktLSkgewotCQljY3VyID0gcnNwLT5sZXZlbGNudFtpXTsKLQkJcnNwLT5sZXZlbHNwcmVhZFtpXSA9IChjcHJ2ICsgY2N1ciAtIDEpIC8gY2N1cjsKLQkJY3BydiA9IGNjdXI7CisJCWNwcnYgPSBucl9jcHVfaWRzOworCQlmb3IgKGkgPSByY3VfbnVtX2x2bHMgLSAxOyBpID49IDA7IGktLSkgeworCQkJY2N1ciA9IHJzcC0+bGV2ZWxjbnRbaV07CisJCQlyc3AtPmxldmVsc3ByZWFkW2ldID0gKGNwcnYgKyBjY3VyIC0gMSkgLyBjY3VyOworCQkJY3BydiA9IGNjdXI7CisJCX0KIAl9CiB9Ci0jZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUICovCiAKIC8qCiAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHJjdV9pbml0KCkgdGhhdCBpbml0aWFsaXplcyBvbmUgcmN1X3N0YXRlIHN0cnVjdHVyZS4KQEAgLTM4MzMsNyArNDAxOSw2IEBACiAJCX0KIAl9CiAKLQlyc3AtPnJkYSA9IHJkYTsKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZyc3AtPmdwX3dxKTsKIAlybnAgPSByc3AtPmxldmVsW3JjdV9udW1fbHZscyAtIDFdOwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CkBAIC0zOTI2LDYgKzQxMTEsOCBAQAogewogCWludCBjcHU7CiAKKwlyY3VfZWFybHlfYm9vdF90ZXN0cygpOworCiAJcmN1X2Jvb3R1cF9hbm5vdW5jZSgpOwogCXJjdV9pbml0X2dlb21ldHJ5KCk7CiAJcmN1X2luaXRfb25lKCZyY3VfYmhfc3RhdGUsICZyY3VfYmhfZGF0YSk7CkBAIC0zOTQyLDggKzQxMjksNiBAQAogCXBtX25vdGlmaWVyKHJjdV9wbV9ub3RpZnksIDApOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQogCQlyY3VfY3B1X25vdGlmeShOVUxMLCBDUFVfVVBfUFJFUEFSRSwgKHZvaWQgKikobG9uZyljcHUpOwotCi0JcmN1X2Vhcmx5X2Jvb3RfdGVzdHMoKTsKIH0KIAogI2luY2x1ZGUgInRyZWVfcGx1Z2luLmgiCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1L3RyZWUuaCBiL2tlcm5lbC9yY3UvdHJlZS5oCmluZGV4IDExOWRlMzkuLmE2OWQzZGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3UvdHJlZS5oCisrKyBiL2tlcm5lbC9yY3UvdHJlZS5oCkBAIC0xNDEsMTIgKzE0MSwyMCBAQAogCQkJCS8qICBjb21wbGV0ZSAob25seSBmb3IgUFJFRU1QVF9SQ1UpLiAqLwogCXVuc2lnbmVkIGxvbmcgcXNtYXNraW5pdDsKIAkJCQkvKiBQZXItR1AgaW5pdGlhbCB2YWx1ZSBmb3IgcXNtYXNrICYgZXhwbWFzay4gKi8KKwkJCQkvKiAgSW5pdGlhbGl6ZWQgZnJvbSAtPnFzbWFza2luaXRuZXh0IGF0IHRoZSAqLworCQkJCS8qICBiZWdpbm5pbmcgb2YgZWFjaCBncmFjZSBwZXJpb2QuICovCisJdW5zaWduZWQgbG9uZyBxc21hc2tpbml0bmV4dDsKKwkJCQkvKiBPbmxpbmUgQ1BVcyBmb3IgbmV4dCBncmFjZSBwZXJpb2QuICovCiAJdW5zaWduZWQgbG9uZyBncnBtYXNrOwkvKiBNYXNrIHRvIGFwcGx5IHRvIHBhcmVudCBxc21hc2suICovCiAJCQkJLyogIE9ubHkgb25lIGJpdCB3aWxsIGJlIHNldCBpbiB0aGlzIG1hc2suICovCiAJaW50CWdycGxvOwkJLyogbG93ZXN0LW51bWJlcmVkIENQVSBvciBncm91cCBoZXJlLiAqLwogCWludAlncnBoaTsJCS8qIGhpZ2hlc3QtbnVtYmVyZWQgQ1BVIG9yIGdyb3VwIGhlcmUuICovCiAJdTgJZ3JwbnVtOwkJLyogQ1BVL2dyb3VwIG51bWJlciBmb3IgbmV4dCBsZXZlbCB1cC4gKi8KIAl1OAlsZXZlbDsJCS8qIHJvb3QgaXMgYXQgbGV2ZWwgMC4gKi8KKwlib29sCXdhaXRfYmxrZF90YXNrczsvKiBOZWNlc3NhcnkgdG8gd2FpdCBmb3IgYmxvY2tlZCB0YXNrcyB0byAqLworCQkJCS8qICBleGl0IFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgKi8KKwkJCQkvKiAgYmVmb3JlIHByb3BhZ2F0aW5nIG9mZmxpbmUgdXAgdGhlICovCisJCQkJLyogIHJjdV9ub2RlIHRyZWU/ICovCiAJc3RydWN0IHJjdV9ub2RlICpwYXJlbnQ7CiAJc3RydWN0IGxpc3RfaGVhZCBibGtkX3Rhc2tzOwogCQkJCS8qIFRhc2tzIGJsb2NrZWQgaW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCAqLwpAQCAtNDQ4LDggKzQ1Niw2IEBACiAJbG9uZyBxbGVuOwkJCQkvKiBUb3RhbCBudW1iZXIgb2YgY2FsbGJhY2tzLiAqLwogCS8qIEVuZCBvZiBmaWVsZHMgZ3VhcmRlZCBieSBvcnBoYW5fbG9jay4gKi8KIAotCXN0cnVjdCBtdXRleCBvbm9mZl9tdXRleDsJCS8qIENvb3JkaW5hdGUgaG90cGx1ZyAmIEdQcy4gKi8KLQogCXN0cnVjdCBtdXRleCBiYXJyaWVyX211dGV4OwkJLyogR3VhcmRzIGJhcnJpZXIgZmllbGRzLiAqLwogCWF0b21pY190IGJhcnJpZXJfY3B1X2NvdW50OwkJLyogIyBDUFVzIHdhaXRpbmcgb24uICovCiAJc3RydWN0IGNvbXBsZXRpb24gYmFycmllcl9jb21wbGV0aW9uOwkvKiBXYWtlIGF0IGJhcnJpZXIgZW5kLiAqLwpAQCAtNTU5LDYgKzU2NSw3IEBACiBzdGF0aWMgdm9pZCByY3VfY2xlYW51cF9hZnRlcl9pZGxlKHZvaWQpOwogc3RhdGljIHZvaWQgcmN1X3ByZXBhcmVfZm9yX2lkbGUodm9pZCk7CiBzdGF0aWMgdm9pZCByY3VfaWRsZV9jb3VudF9jYWxsYmFja3NfcG9zdGVkKHZvaWQpOworc3RhdGljIGJvb2wgcmN1X3ByZWVtcHRfaGFzX3Rhc2tzKHN0cnVjdCByY3Vfbm9kZSAqcm5wKTsKIHN0YXRpYyB2b2lkIHByaW50X2NwdV9zdGFsbF9pbmZvX2JlZ2luKHZvaWQpOwogc3RhdGljIHZvaWQgcHJpbnRfY3B1X3N0YWxsX2luZm8oc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBpbnQgY3B1KTsKIHN0YXRpYyB2b2lkIHByaW50X2NwdV9zdGFsbF9pbmZvX2VuZCh2b2lkKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdHJlZV9wbHVnaW4uaCBiL2tlcm5lbC9yY3UvdHJlZV9wbHVnaW4uaAppbmRleCAwYTU3MWU5Li44YzBlYzBmIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1L3RyZWVfcGx1Z2luLmgKKysrIGIva2VybmVsL3JjdS90cmVlX3BsdWdpbi5oCkBAIC01OCwzOCArNTgsMzMgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IHJjdV9ib290dXBfYW5ub3VuY2Vfb2RkbmVzcyh2b2lkKQogewotI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UKLQlwcl9pbmZvKCJcdFJDVSBkZWJ1Z2ZzLWJhc2VkIHRyYWNpbmcgaXMgZW5hYmxlZC5cbiIpOwotI2VuZGlmCi0jaWYgKGRlZmluZWQoQ09ORklHXzY0QklUKSAmJiBDT05GSUdfUkNVX0ZBTk9VVCAhPSA2NCkgfHwgKCFkZWZpbmVkKENPTkZJR182NEJJVCkgJiYgQ09ORklHX1JDVV9GQU5PVVQgIT0gMzIpCi0JcHJfaW5mbygiXHRDT05GSUdfUkNVX0ZBTk9VVCBzZXQgdG8gbm9uLWRlZmF1bHQgdmFsdWUgb2YgJWRcbiIsCi0JICAgICAgIENPTkZJR19SQ1VfRkFOT1VUKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19SQ1VfRkFOT1VUX0VYQUNUCi0JcHJfaW5mbygiXHRIaWVyYXJjaGljYWwgUkNVIGF1dG9iYWxhbmNpbmcgaXMgZGlzYWJsZWQuXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19SQ1VfRkFTVF9OT19IWgotCXByX2luZm8oIlx0UkNVIGR5bnRpY2staWRsZSBncmFjZS1wZXJpb2QgYWNjZWxlcmF0aW9uIGlzIGVuYWJsZWQuXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QUk9WRV9SQ1UKLQlwcl9pbmZvKCJcdFJDVSBsb2NrZGVwIGNoZWNraW5nIGlzIGVuYWJsZWQuXG4iKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUX1JVTk5BQkxFCi0JcHJfaW5mbygiXHRSQ1UgdG9ydHVyZSB0ZXN0aW5nIHN0YXJ0cyBkdXJpbmcgYm9vdC5cbiIpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPKQotCXByX2luZm8oIlx0QWRkaXRpb25hbCBwZXItQ1BVIGluZm8gcHJpbnRlZCB3aXRoIHN0YWxscy5cbiIpOwotI2VuZGlmCi0jaWYgTlVNX1JDVV9MVkxfNCAhPSAwCi0JcHJfaW5mbygiXHRGb3VyLWxldmVsIGhpZXJhcmNoeSBpcyBlbmFibGVkLlxuIik7Ci0jZW5kaWYKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfUkNVX1RSQUNFKSkKKwkJcHJfaW5mbygiXHRSQ1UgZGVidWdmcy1iYXNlZCB0cmFjaW5nIGlzIGVuYWJsZWQuXG4iKTsKKwlpZiAoKElTX0VOQUJMRUQoQ09ORklHXzY0QklUKSAmJiBDT05GSUdfUkNVX0ZBTk9VVCAhPSA2NCkgfHwKKwkgICAgKCFJU19FTkFCTEVEKENPTkZJR182NEJJVCkgJiYgQ09ORklHX1JDVV9GQU5PVVQgIT0gMzIpKQorCQlwcl9pbmZvKCJcdENPTkZJR19SQ1VfRkFOT1VUIHNldCB0byBub24tZGVmYXVsdCB2YWx1ZSBvZiAlZFxuIiwKKwkJICAgICAgIENPTkZJR19SQ1VfRkFOT1VUKTsKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfUkNVX0ZBTk9VVF9FWEFDVCkpCisJCXByX2luZm8oIlx0SGllcmFyY2hpY2FsIFJDVSBhdXRvYmFsYW5jaW5nIGlzIGRpc2FibGVkLlxuIik7CisJaWYgKElTX0VOQUJMRUQoQ09ORklHX1JDVV9GQVNUX05PX0haKSkKKwkJcHJfaW5mbygiXHRSQ1UgZHludGljay1pZGxlIGdyYWNlLXBlcmlvZCBhY2NlbGVyYXRpb24gaXMgZW5hYmxlZC5cbiIpOworCWlmIChJU19FTkFCTEVEKENPTkZJR19QUk9WRV9SQ1UpKQorCQlwcl9pbmZvKCJcdFJDVSBsb2NrZGVwIGNoZWNraW5nIGlzIGVuYWJsZWQuXG4iKTsKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfUkNVX1RPUlRVUkVfVEVTVF9SVU5OQUJMRSkpCisJCXByX2luZm8oIlx0UkNVIHRvcnR1cmUgdGVzdGluZyBzdGFydHMgZHVyaW5nIGJvb3QuXG4iKTsKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfUkNVX0NQVV9TVEFMTF9JTkZPKSkKKwkJcHJfaW5mbygiXHRBZGRpdGlvbmFsIHBlci1DUFUgaW5mbyBwcmludGVkIHdpdGggc3RhbGxzLlxuIik7CisJaWYgKE5VTV9SQ1VfTFZMXzQgIT0gMCkKKwkJcHJfaW5mbygiXHRGb3VyLWxldmVsIGhpZXJhcmNoeSBpcyBlbmFibGVkLlxuIik7CisJaWYgKENPTkZJR19SQ1VfRkFOT1VUX0xFQUYgIT0gMTYpCisJCXByX2luZm8oIlx0QnVpbGQtdGltZSBhZGp1c3RtZW50IG9mIGxlYWYgZmFub3V0IHRvICVkLlxuIiwKKwkJCUNPTkZJR19SQ1VfRkFOT1VUX0xFQUYpOwogCWlmIChyY3VfZmFub3V0X2xlYWYgIT0gQ09ORklHX1JDVV9GQU5PVVRfTEVBRikKIAkJcHJfaW5mbygiXHRCb290LXRpbWUgYWRqdXN0bWVudCBvZiBsZWFmIGZhbm91dCB0byAlZC5cbiIsIHJjdV9mYW5vdXRfbGVhZik7CiAJaWYgKG5yX2NwdV9pZHMgIT0gTlJfQ1BVUykKIAkJcHJfaW5mbygiXHRSQ1UgcmVzdHJpY3RpbmcgQ1BVcyBmcm9tIE5SX0NQVVM9JWQgdG8gbnJfY3B1X2lkcz0lZC5cbiIsIE5SX0NQVVMsIG5yX2NwdV9pZHMpOwotI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QKLQlwcl9pbmZvKCJcdFJDVSBrdGhyZWFkIHByaW9yaXR5OiAlZC5cbiIsIGt0aHJlYWRfcHJpbyk7Ci0jZW5kaWYKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfUkNVX0JPT1NUKSkKKwkJcHJfaW5mbygiXHRSQ1Uga3RocmVhZCBwcmlvcml0eTogJWQuXG4iLCBrdGhyZWFkX3ByaW8pOwogfQogCiAjaWZkZWYgQ09ORklHX1BSRUVNUFRfUkNVCkBAIC0xODAsNyArMTc1LDcgQEAKIAkJICogQnV0IGZpcnN0LCBub3RlIHRoYXQgdGhlIGN1cnJlbnQgQ1BVIG11c3Qgc3RpbGwgYmUKIAkJICogb24gbGluZSEKIAkJICovCi0JCVdBUk5fT05fT05DRSgocmRwLT5ncnBtYXNrICYgcm5wLT5xc21hc2tpbml0KSA9PSAwKTsKKwkJV0FSTl9PTl9PTkNFKChyZHAtPmdycG1hc2sgJiByY3Vfcm5wX29ubGluZV9jcHVzKHJucCkpID09IDApOwogCQlXQVJOX09OX09OQ0UoIWxpc3RfZW1wdHkoJnQtPnJjdV9ub2RlX2VudHJ5KSk7CiAJCWlmICgocm5wLT5xc21hc2sgJiByZHAtPmdycG1hc2spICYmIHJucC0+Z3BfdGFza3MgIT0gTlVMTCkgewogCQkJbGlzdF9hZGQoJnQtPnJjdV9ub2RlX2VudHJ5LCBybnAtPmdwX3Rhc2tzLT5wcmV2KTsKQEAgLTIzMyw0MyArMjI4LDYgQEAKIH0KIAogLyoKLSAqIFJlY29yZCBhIHF1aWVzY2VudCBzdGF0ZSBmb3IgYWxsIHRhc2tzIHRoYXQgd2VyZSBwcmV2aW91c2x5IHF1ZXVlZAotICogb24gdGhlIHNwZWNpZmllZCByY3Vfbm9kZSBzdHJ1Y3R1cmUgYW5kIHRoYXQgd2VyZSBibG9ja2luZyB0aGUgY3VycmVudAotICogUkNVIGdyYWNlIHBlcmlvZC4gIFRoZSBjYWxsZXIgbXVzdCBob2xkIHRoZSBzcGVjaWZpZWQgcm5wLT5sb2NrIHdpdGgKLSAqIGlycXMgZGlzYWJsZWQsIGFuZCB0aGlzIGxvY2sgaXMgcmVsZWFzZWQgdXBvbiByZXR1cm4sIGJ1dCBpcnFzIHJlbWFpbgotICogZGlzYWJsZWQuCi0gKi8KLXN0YXRpYyB2b2lkIHJjdV9yZXBvcnRfdW5ibG9ja19xc19ybnAoc3RydWN0IHJjdV9ub2RlICpybnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi0JX19yZWxlYXNlcyhybnAtPmxvY2spCi17Ci0JdW5zaWduZWQgbG9uZyBtYXNrOwotCXN0cnVjdCByY3Vfbm9kZSAqcm5wX3A7Ci0KLQlpZiAocm5wLT5xc21hc2sgIT0gMCB8fCByY3VfcHJlZW1wdF9ibG9ja2VkX3JlYWRlcnNfY2dwKHJucCkpIHsKLQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwotCQlyZXR1cm47ICAvKiBTdGlsbCBuZWVkIG1vcmUgcXVpZXNjZW50IHN0YXRlcyEgKi8KLQl9Ci0KLQlybnBfcCA9IHJucC0+cGFyZW50OwotCWlmIChybnBfcCA9PSBOVUxMKSB7Ci0JCS8qCi0JCSAqIEVpdGhlciB0aGVyZSBpcyBvbmx5IG9uZSByY3Vfbm9kZSBpbiB0aGUgdHJlZSwKLQkJICogb3IgdGFza3Mgd2VyZSBraWNrZWQgdXAgdG8gcm9vdCByY3Vfbm9kZSBkdWUgdG8KLQkJICogQ1BVcyBnb2luZyBvZmZsaW5lLgotCQkgKi8KLQkJcmN1X3JlcG9ydF9xc19yc3AoJnJjdV9wcmVlbXB0X3N0YXRlLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBSZXBvcnQgdXAgdGhlIHJlc3Qgb2YgdGhlIGhpZXJhcmNoeS4gKi8KLQltYXNrID0gcm5wLT5ncnBtYXNrOwotCXJhd19zcGluX3VubG9jaygmcm5wLT5sb2NrKTsJLyogaXJxcyByZW1haW4gZGlzYWJsZWQuICovCi0JcmF3X3NwaW5fbG9jaygmcm5wX3AtPmxvY2spOwkvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQuICovCi0Jc21wX21iX19hZnRlcl91bmxvY2tfbG9jaygpOwotCXJjdV9yZXBvcnRfcXNfcm5wKG1hc2ssICZyY3VfcHJlZW1wdF9zdGF0ZSwgcm5wX3AsIGZsYWdzKTsKLX0KLQotLyoKICAqIEFkdmFuY2UgYSAtPmJsa2RfdGFza3MtbGlzdCBwb2ludGVyIHRvIHRoZSBuZXh0IGVudHJ5LCBpbnN0ZWFkCiAgKiByZXR1cm5pbmcgTlVMTCBpZiBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICovCkBAIC0zMDAsNyArMjU4LDYgQEAKICAqLwogdm9pZCByY3VfcmVhZF91bmxvY2tfc3BlY2lhbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCiB7Ci0JYm9vbCBlbXB0eTsKIAlib29sIGVtcHR5X2V4cDsKIAlib29sIGVtcHR5X25vcm07CiAJYm9vbCBlbXB0eV9leHBfbm93OwpAQCAtMzM0LDcgKzI5MSwxMyBAQAogCX0KIAogCS8qIEhhcmR3YXJlIElSUSBoYW5kbGVycyBjYW5ub3QgYmxvY2ssIGNvbXBsYWluIGlmIHRoZXkgZ2V0IGhlcmUuICovCi0JaWYgKFdBUk5fT05fT05DRShpbl9pcnEoKSB8fCBpbl9zZXJ2aW5nX3NvZnRpcnEoKSkpIHsKKwlpZiAoaW5faXJxKCkgfHwgaW5fc2VydmluZ19zb2Z0aXJxKCkpIHsKKwkJbG9ja2RlcF9yY3Vfc3VzcGljaW91cyhfX0ZJTEVfXywgX19MSU5FX18sCisJCQkJICAgICAgICJyY3VfcmVhZF91bmxvY2soKSBmcm9tIGlycSBvciBzb2Z0aXJxIHdpdGggYmxvY2tpbmcgaW4gY3JpdGljYWwgc2VjdGlvbiEhIVxuIik7CisJCXByX2FsZXJ0KCItPnJjdV9yZWFkX3VubG9ja19zcGVjaWFsOiAlI3ggKGI6ICVkLCBucTogJWQpXG4iLAorCQkJIHQtPnJjdV9yZWFkX3VubG9ja19zcGVjaWFsLnMsCisJCQkgdC0+cmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwuYi5ibG9ja2VkLAorCQkJIHQtPnJjdV9yZWFkX3VubG9ja19zcGVjaWFsLmIubmVlZF9xcyk7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJcmV0dXJuOwogCX0KQEAgLTM1Niw3ICszMTksNiBAQAogCQkJCWJyZWFrOwogCQkJcmF3X3NwaW5fdW5sb2NrKCZybnAtPmxvY2spOyAvKiBpcnFzIHJlbWFpbiBkaXNhYmxlZC4gKi8KIAkJfQotCQllbXB0eSA9ICFyY3VfcHJlZW1wdF9oYXNfdGFza3Mocm5wKTsKIAkJZW1wdHlfbm9ybSA9ICFyY3VfcHJlZW1wdF9ibG9ja2VkX3JlYWRlcnNfY2dwKHJucCk7CiAJCWVtcHR5X2V4cCA9ICFyY3VfcHJlZW1wdGVkX3JlYWRlcnNfZXhwKHJucCk7CiAJCXNtcF9tYigpOyAvKiBlbnN1cmUgZXhwZWRpdGVkIGZhc3RwYXRoIHNlZXMgZW5kIG9mIFJDVSBjLXMuICovCkBAIC0zNzcsMTQgKzMzOSw2IEBACiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KIAogCQkvKgotCQkgKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCB0YXNrIG9uIHRoZSBsaXN0LCBnbyBzZWUgaWYgd2UKLQkJICogbmVlZCB0byBwcm9wYWdhdGUgLT5xc21hc2tpbml0IGJpdCBjbGVhcmluZyB1cCB0aGUKLQkJICogcmN1X25vZGUgdHJlZS4KLQkJICovCi0JCWlmICghZW1wdHkgJiYgIXJjdV9wcmVlbXB0X2hhc190YXNrcyhybnApKQotCQkJcmN1X2NsZWFudXBfZGVhZF9ybnAocm5wKTsKLQotCQkvKgogCQkgKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCB0YXNrIG9uIHRoZSBjdXJyZW50IGxpc3QsIGFuZCBpZgogCQkgKiB3ZSBhcmVuJ3Qgd2FpdGluZyBvbiBhbnkgQ1BVcywgcmVwb3J0IHRoZSBxdWllc2NlbnQgc3RhdGUuCiAJCSAqIE5vdGUgdGhhdCByY3VfcmVwb3J0X3VuYmxvY2tfcXNfcm5wKCkgcmVsZWFzZXMgcm5wLT5sb2NrLApAQCAtMzk5LDcgKzM1Myw4IEBACiAJCQkJCQkJIHJucC0+Z3JwbG8sCiAJCQkJCQkJIHJucC0+Z3JwaGksCiAJCQkJCQkJICEhcm5wLT5ncF90YXNrcyk7Ci0JCQlyY3VfcmVwb3J0X3VuYmxvY2tfcXNfcm5wKHJucCwgZmxhZ3MpOworCQkJcmN1X3JlcG9ydF91bmJsb2NrX3FzX3JucCgmcmN1X3ByZWVtcHRfc3RhdGUsCisJCQkJCQkgIHJucCwgZmxhZ3MpOwogCQl9IGVsc2UgewogCQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwogCQl9CkBAIC01MjAsMTAgKzQ3NSw2IEBACiAJV0FSTl9PTl9PTkNFKHJucC0+cXNtYXNrKTsKIH0KIAotI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQotCi0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLwotCiAvKgogICogQ2hlY2sgZm9yIGEgcXVpZXNjZW50IHN0YXRlIGZyb20gdGhlIGN1cnJlbnQgQ1BVLiAgV2hlbiBhIHRhc2sgYmxvY2tzLAogICogdGhlIHRhc2sgaXMgcmVjb3JkZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgQ1BVJ3MgcmN1X25vZGUgc3RydWN0dXJlLApAQCAtNTg1LDcgKzUzNiw3IEBACiAJCQkgICAiSWxsZWdhbCBzeW5jaHJvbml6ZV9yY3UoKSBpbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24iKTsKIAlpZiAoIXJjdV9zY2hlZHVsZXJfYWN0aXZlKQogCQlyZXR1cm47Ci0JaWYgKHJjdV9leHBlZGl0ZWQpCisJaWYgKHJjdV9ncF9pc19leHBlZGl0ZWQoKSkKIAkJc3luY2hyb25pemVfcmN1X2V4cGVkaXRlZCgpOwogCWVsc2UKIAkJd2FpdF9yY3VfZ3AoY2FsbF9yY3UpOwpAQCAtNjMwLDkgKzU4MSw2IEBACiAgKiByZWN1cnNpdmVseSB1cCB0aGUgdHJlZS4gIChDYWxtIGRvd24sIGNhbG0gZG93biwgd2UgZG8gdGhlIHJlY3Vyc2lvbgogICogaXRlcmF0aXZlbHkhKQogICoKLSAqIE1vc3QgY2FsbGVycyB3aWxsIHNldCB0aGUgIndha2UiIGZsYWcsIGJ1dCB0aGUgdGFzayBpbml0aWF0aW5nIHRoZQotICogZXhwZWRpdGVkIGdyYWNlIHBlcmlvZCBuZWVkIG5vdCB3YWtlIGl0c2VsZi4KLSAqCiAgKiBDYWxsZXIgbXVzdCBob2xkIHN5bmNfcmN1X3ByZWVtcHRfZXhwX211dGV4LgogICovCiBzdGF0aWMgdm9pZCByY3VfcmVwb3J0X2V4cF9ybnAoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X25vZGUgKnJucCwKQEAgLTY2NywyOSArNjE1LDg1IEBACiAKIC8qCiAgKiBTbmFwc2hvdCB0aGUgdGFza3MgYmxvY2tpbmcgdGhlIG5ld2x5IHN0YXJ0ZWQgcHJlZW1wdGlibGUtUkNVIGV4cGVkaXRlZAotICogZ3JhY2UgcGVyaW9kIGZvciB0aGUgc3BlY2lmaWVkIHJjdV9ub2RlIHN0cnVjdHVyZS4gIElmIHRoZXJlIGFyZSBubyBzdWNoCi0gKiB0YXNrcywgcmVwb3J0IGl0IHVwIHRoZSByY3Vfbm9kZSBoaWVyYXJjaHkuCisgKiBncmFjZSBwZXJpb2QgZm9yIHRoZSBzcGVjaWZpZWQgcmN1X25vZGUgc3RydWN0dXJlLCBwaGFzZSAxLiAgSWYgdGhlcmUKKyAqIGFyZSBzdWNoIHRhc2tzLCBzZXQgdGhlIC0+ZXhwbWFzayBiaXRzIHVwIHRoZSByY3Vfbm9kZSB0cmVlIGFuZCBhbHNvCisgKiBzZXQgdGhlIC0+ZXhwbWFzayBiaXRzIG9uIHRoZSBsZWFmIHJjdV9ub2RlIHN0cnVjdHVyZXMgdG8gdGVsbCBwaGFzZSAyCisgKiB0aGF0IHdvcmsgaXMgbmVlZGVkIGhlcmUuCiAgKgotICogQ2FsbGVyIG11c3QgaG9sZCBzeW5jX3JjdV9wcmVlbXB0X2V4cF9tdXRleCBhbmQgbXVzdCBleGNsdWRlCi0gKiBDUFUgaG90cGx1ZyBvcGVyYXRpb25zLgorICogQ2FsbGVyIG11c3QgaG9sZCBzeW5jX3JjdV9wcmVlbXB0X2V4cF9tdXRleC4KICAqLwogc3RhdGljIHZvaWQKLXN5bmNfcmN1X3ByZWVtcHRfZXhwX2luaXQoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3N5bmNfcmN1X3ByZWVtcHRfZXhwX2luaXQxKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9ub2RlICpybnApCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbXVzdF93YWl0ID0gMDsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJc3RydWN0IHJjdV9ub2RlICpybnBfdXA7CiAKIAlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOwogCXNtcF9tYl9fYWZ0ZXJfdW5sb2NrX2xvY2soKTsKKwlXQVJOX09OX09OQ0Uocm5wLT5leHBtYXNrKTsKKwlXQVJOX09OX09OQ0Uocm5wLT5leHBfdGFza3MpOwogCWlmICghcmN1X3ByZWVtcHRfaGFzX3Rhc2tzKHJucCkpIHsKKwkJLyogTm8gYmxvY2tlZCB0YXNrcywgbm90aGluZyB0byBkby4gKi8KIAkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwotCX0gZWxzZSB7CisJCXJldHVybjsKKwl9CisJLyogQ2FsbCBmb3IgUGhhc2UgMiBhbmQgcHJvcGFnYXRlIC0+ZXhwbWFzayBiaXRzIHVwIHRoZSB0cmVlLiAqLworCXJucC0+ZXhwbWFzayA9IDE7CisJcm5wX3VwID0gcm5wOworCXdoaWxlIChybnBfdXAtPnBhcmVudCkgeworCQltYXNrID0gcm5wX3VwLT5ncnBtYXNrOworCQlybnBfdXAgPSBybnBfdXAtPnBhcmVudDsKKwkJaWYgKHJucF91cC0+ZXhwbWFzayAmIG1hc2spCisJCQlicmVhazsKKwkJcmF3X3NwaW5fbG9jaygmcm5wX3VwLT5sb2NrKTsgLyogaXJxcyBhbHJlYWR5IG9mZiAqLworCQlzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCk7CisJCXJucF91cC0+ZXhwbWFzayB8PSBtYXNrOworCQlyYXdfc3Bpbl91bmxvY2soJnJucF91cC0+bG9jayk7IC8qIGlycXMgc3RpbGwgb2ZmICovCisJfQorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFNuYXBzaG90IHRoZSB0YXNrcyBibG9ja2luZyB0aGUgbmV3bHkgc3RhcnRlZCBwcmVlbXB0aWJsZS1SQ1UgZXhwZWRpdGVkCisgKiBncmFjZSBwZXJpb2QgZm9yIHRoZSBzcGVjaWZpZWQgcmN1X25vZGUgc3RydWN0dXJlLCBwaGFzZSAyLiAgSWYgdGhlCisgKiBsZWFmIHJjdV9ub2RlIHN0cnVjdHVyZSBoYXMgaXRzIC0+ZXhwbWFzayBmaWVsZCBzZXQsIGNoZWNrIGZvciB0YXNrcy4KKyAqIElmIHRoZXJlIGFyZSBzb21lLCBjbGVhciAtPmV4cG1hc2sgYW5kIHNldCAtPmV4cF90YXNrcyBhY2NvcmRpbmdseSwKKyAqIHRoZW4gaW5pdGlhdGUgUkNVIHByaW9yaXR5IGJvb3N0aW5nLiAgT3RoZXJ3aXNlLCBjbGVhciAtPmV4cG1hc2sgYW5kCisgKiBpbnZva2UgcmN1X3JlcG9ydF9leHBfcm5wKCkgdG8gY2xlYXIgb3V0IHRoZSB1cHBlci1sZXZlbCAtPmV4cG1hc2sgYml0cywKKyAqIGVuYWJsaW5nIHJjdV9yZWFkX3VubG9ja19zcGVjaWFsKCkgdG8gZG8gdGhlIGJpdC1jbGVhcmluZy4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIHN5bmNfcmN1X3ByZWVtcHRfZXhwX211dGV4LgorICovCitzdGF0aWMgdm9pZAorc3luY19yY3VfcHJlZW1wdF9leHBfaW5pdDIoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwlzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCk7CisJaWYgKCFybnAtPmV4cG1hc2spIHsKKwkJLyogUGhhc2UgMSBkaWRuJ3QgZG8gYW55dGhpbmcsIHNvIFBoYXNlIDIgZG9lc24ndCBlaXRoZXIuICovCisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFBoYXNlIDEgaXMgb3Zlci4gKi8KKwlybnAtPmV4cG1hc2sgPSAwOworCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgc3RpbGwgYmxvY2tlZCB0YXNrcywgc2V0IHVwIC0+ZXhwX3Rhc2tzIHNvIHRoYXQKKwkgKiByY3VfcmVhZF91bmxvY2tfc3BlY2lhbCgpIHdpbGwgd2FrZSB1cyBhbmQgdGhlbiBib29zdCB0aGVtLgorCSAqLworCWlmIChyY3VfcHJlZW1wdF9oYXNfdGFza3Mocm5wKSkgewogCQlybnAtPmV4cF90YXNrcyA9IHJucC0+YmxrZF90YXNrcy5uZXh0OwogCQlyY3VfaW5pdGlhdGVfYm9vc3Qocm5wLCBmbGFncyk7ICAvKiByZWxlYXNlcyBybnAtPmxvY2sgKi8KLQkJbXVzdF93YWl0ID0gMTsKKwkJcmV0dXJuOwogCX0KLQlpZiAoIW11c3Rfd2FpdCkKLQkJcmN1X3JlcG9ydF9leHBfcm5wKHJzcCwgcm5wLCBmYWxzZSk7IC8qIERvbid0IHdha2Ugc2VsZi4gKi8KKworCS8qIE5vIGxvbmdlciBhbnkgYmxvY2tlZCB0YXNrcywgc28gdW5kbyBiaXQgc2V0dGluZy4gKi8KKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CisJcmN1X3JlcG9ydF9leHBfcm5wKHJzcCwgcm5wLCBmYWxzZSk7CiB9CiAKIC8qKgpAQCAtNzA2LDcgKzcxMCw2IEBACiAgKi8KIHZvaWQgc3luY2hyb25pemVfcmN1X2V4cGVkaXRlZCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHJjdV9ub2RlICpybnA7CiAJc3RydWN0IHJjdV9zdGF0ZSAqcnNwID0gJnJjdV9wcmVlbXB0X3N0YXRlOwogCXVuc2lnbmVkIGxvbmcgc25hcDsKQEAgLTc1NywxOSArNzYwLDE2IEBACiAJLyogZm9yY2UgYWxsIFJDVSByZWFkZXJzIG9udG8gLT5ibGtkX3Rhc2tzIGxpc3RzLiAqLwogCXN5bmNocm9uaXplX3NjaGVkX2V4cGVkaXRlZCgpOwogCi0JLyogSW5pdGlhbGl6ZSAtPmV4cG1hc2sgZm9yIGFsbCBub24tbGVhZiByY3Vfbm9kZSBzdHJ1Y3R1cmVzLiAqLwotCXJjdV9mb3JfZWFjaF9ub25sZWFmX25vZGVfYnJlYWR0aF9maXJzdChyc3AsIHJucCkgewotCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJucC0+bG9jaywgZmxhZ3MpOwotCQlzbXBfbWJfX2FmdGVyX3VubG9ja19sb2NrKCk7Ci0JCXJucC0+ZXhwbWFzayA9IHJucC0+cXNtYXNraW5pdDsKLQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwotCX0KLQotCS8qIFNuYXBzaG90IGN1cnJlbnQgc3RhdGUgb2YgLT5ibGtkX3Rhc2tzIGxpc3RzLiAqLworCS8qCisJICogU25hcHNob3QgY3VycmVudCBzdGF0ZSBvZiAtPmJsa2RfdGFza3MgbGlzdHMgaW50byAtPmV4cG1hc2suCisJICogUGhhc2UgMSBzZXRzIGJpdHMgYW5kIHBoYXNlIDIgcGVybWl0cyByY3VfcmVhZF91bmxvY2tfc3BlY2lhbCgpCisJICogdG8gc3RhcnQgY2xlYXJpbmcgdGhlbS4gIERvaW5nIHRoaXMgaW4gb25lIHBoYXNlIGxlYWRzIHRvCisJICogc3RyYW5nZSByYWNlcyBiZXR3ZWVuIHNldHRpbmcgYW5kIGNsZWFyaW5nIGJpdHMsIHNvIGp1c3Qgc2F5ICJubyIhCisJICovCiAJcmN1X2Zvcl9lYWNoX2xlYWZfbm9kZShyc3AsIHJucCkKLQkJc3luY19yY3VfcHJlZW1wdF9leHBfaW5pdChyc3AsIHJucCk7Ci0JaWYgKE5VTV9SQ1VfTk9ERVMgPiAxKQotCQlzeW5jX3JjdV9wcmVlbXB0X2V4cF9pbml0KHJzcCwgcmN1X2dldF9yb290KHJzcCkpOworCQlzeW5jX3JjdV9wcmVlbXB0X2V4cF9pbml0MShyc3AsIHJucCk7CisJcmN1X2Zvcl9lYWNoX2xlYWZfbm9kZShyc3AsIHJucCkKKwkJc3luY19yY3VfcHJlZW1wdF9leHBfaW5pdDIocnNwLCBybnApOwogCiAJcHV0X29ubGluZV9jcHVzKCk7CiAKQEAgLTg1OSw4ICs4NTksNiBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0KIC8qCiAgKiBCZWNhdXNlIHRoZXJlIGlzIG5vIHByZWVtcHRpYmxlIFJDVSwgdGhlcmUgY2FuIGJlIG5vIHJlYWRlcnMgYmxvY2tlZC4KICAqLwpAQCAtODY5LDggKzg2Nyw2IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLwotCiAvKgogICogQmVjYXVzZSBwcmVlbXB0aWJsZSBSQ1UgZG9lcyBub3QgZXhpc3QsIHdlIG5ldmVyIGhhdmUgdG8gY2hlY2sgZm9yCiAgKiB0YXNrcyBibG9ja2VkIHdpdGhpbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLgpAQCAtMTE3MCw3ICsxMTY2LDcgQEAKICAqIFJldHVybnMgemVybyBpZiBhbGwgaXMgd2VsbCwgYSBuZWdhdGVkIGVycm5vIG90aGVyd2lzZS4KICAqLwogc3RhdGljIGludCByY3Vfc3Bhd25fb25lX2Jvb3N0X2t0aHJlYWQoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLAotCQkJCQkJIHN0cnVjdCByY3Vfbm9kZSAqcm5wKQorCQkJCSAgICAgICBzdHJ1Y3QgcmN1X25vZGUgKnJucCkKIHsKIAlpbnQgcm5wX2luZGV4ID0gcm5wIC0gJnJzcC0+bm9kZVswXTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTE4MCw3ICsxMTc2LDcgQEAKIAlpZiAoJnJjdV9wcmVlbXB0X3N0YXRlICE9IHJzcCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoIXJjdV9zY2hlZHVsZXJfZnVsbHlfYWN0aXZlIHx8IHJucC0+cXNtYXNraW5pdCA9PSAwKQorCWlmICghcmN1X3NjaGVkdWxlcl9mdWxseV9hY3RpdmUgfHwgcmN1X3JucF9vbmxpbmVfY3B1cyhybnApID09IDApCiAJCXJldHVybiAwOwogCiAJcnNwLT5ib29zdCA9IDE7CkBAIC0xMjczLDcgKzEyNjksNyBAQAogc3RhdGljIHZvaWQgcmN1X2Jvb3N0X2t0aHJlYWRfc2V0YWZmaW5pdHkoc3RydWN0IHJjdV9ub2RlICpybnAsIGludCBvdXRnb2luZ2NwdSkKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQgPSBybnAtPmJvb3N0X2t0aHJlYWRfdGFzazsKLQl1bnNpZ25lZCBsb25nIG1hc2sgPSBybnAtPnFzbWFza2luaXQ7CisJdW5zaWduZWQgbG9uZyBtYXNrID0gcmN1X3JucF9vbmxpbmVfY3B1cyhybnApOwogCWNwdW1hc2tfdmFyX3QgY207CiAJaW50IGNwdTsKIApAQCAtMTk0NSw3ICsxOTQxLDggQEAKIAkJcmhwID0gQUNDRVNTX09OQ0UocmRwLT5ub2NiX2ZvbGxvd2VyX2hlYWQpOwogCiAJLyogSGF2aW5nIG5vIHJjdW8ga3RocmVhZCBidXQgQ0JzIGFmdGVyIHNjaGVkdWxlciBzdGFydHMgaXMgYmFkISAqLwotCWlmICghQUNDRVNTX09OQ0UocmRwLT5ub2NiX2t0aHJlYWQpICYmIHJocCkgeworCWlmICghQUNDRVNTX09OQ0UocmRwLT5ub2NiX2t0aHJlYWQpICYmIHJocCAmJgorCSAgICByY3Vfc2NoZWR1bGVyX2Z1bGx5X2FjdGl2ZSkgewogCQkvKiBSQ1UgY2FsbGJhY2sgZW5xdWV1ZWQgYmVmb3JlIENQVSBmaXJzdCBjYW1lIG9ubGluZT8/PyAqLwogCQlwcl9lcnIoIlJDVTogTmV2ZXItb25saW5lZCBuby1DQnMgQ1BVICVkIGhhcyBDQiAlcFxuIiwKIAkJICAgICAgIGNwdSwgcmhwLT5mdW5jKTsKQEAgLTIzOTIsMTggKzIzODksOCBAQAogCQlwcl9pbmZvKCJcdFBvbGwgZm9yIGNhbGxiYWNrcyBmcm9tIG5vLUNCcyBDUFVzLlxuIik7CiAKIAlmb3JfZWFjaF9yY3VfZmxhdm9yKHJzcCkgewotCQlmb3JfZWFjaF9jcHUoY3B1LCByY3Vfbm9jYl9tYXNrKSB7Ci0JCQlzdHJ1Y3QgcmN1X2RhdGEgKnJkcCA9IHBlcl9jcHVfcHRyKHJzcC0+cmRhLCBjcHUpOwotCi0JCQkvKgotCQkJICogSWYgdGhlcmUgYXJlIGVhcmx5IGNhbGxiYWNrcywgdGhleSB3aWxsIG5lZWQKLQkJCSAqIHRvIGJlIG1vdmVkIHRvIHRoZSBub2NiIGxpc3RzLgotCQkJICovCi0JCQlXQVJOX09OX09OQ0UocmRwLT5ueHR0YWlsW1JDVV9ORVhUX1RBSUxdICE9Ci0JCQkJICAgICAmcmRwLT5ueHRsaXN0ICYmCi0JCQkJICAgICByZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF0gIT0gTlVMTCk7Ci0JCQlpbml0X25vY2JfY2FsbGJhY2tfbGlzdChyZHApOwotCQl9CisJCWZvcl9lYWNoX2NwdShjcHUsIHJjdV9ub2NiX21hc2spCisJCQlpbml0X25vY2JfY2FsbGJhY2tfbGlzdChwZXJfY3B1X3B0cihyc3AtPnJkYSwgY3B1KSk7CiAJCXJjdV9vcmdhbml6ZV9ub2NiX2t0aHJlYWRzKHJzcCk7CiAJfQogfQpAQCAtMjU0MCw2ICsyNTI3LDE2IEBACiAJaWYgKCFyY3VfaXNfbm9jYl9jcHUocmRwLT5jcHUpKQogCQlyZXR1cm4gZmFsc2U7CiAKKwkvKiBJZiB0aGVyZSBhcmUgZWFybHktYm9vdCBjYWxsYmFja3MsIG1vdmUgdGhlbSB0byBub2NiIGxpc3RzLiAqLworCWlmIChyZHAtPm54dGxpc3QpIHsKKwkJcmRwLT5ub2NiX2hlYWQgPSByZHAtPm54dGxpc3Q7CisJCXJkcC0+bm9jYl90YWlsID0gcmRwLT5ueHR0YWlsW1JDVV9ORVhUX1RBSUxdOworCQlhdG9taWNfbG9uZ19zZXQoJnJkcC0+bm9jYl9xX2NvdW50LCByZHAtPnFsZW4pOworCQlhdG9taWNfbG9uZ19zZXQoJnJkcC0+bm9jYl9xX2NvdW50X2xhenksIHJkcC0+cWxlbl9sYXp5KTsKKwkJcmRwLT5ueHRsaXN0ID0gTlVMTDsKKwkJcmRwLT5xbGVuID0gMDsKKwkJcmRwLT5xbGVuX2xhenkgPSAwOworCX0KIAlyZHAtPm54dHRhaWxbUkNVX05FWFRfVEFJTF0gPSBOVUxMOwogCXJldHVybiB0cnVlOwogfQpAQCAtMjc2Myw3ICsyNzYwLDggQEAKIAogLyoKICAqIENoZWNrIHRvIHNlZSBpZiB0aGUgY3VycmVudCBDUFUgaXMgaWRsZS4gIE5vdGUgdGhhdCB1c2VybW9kZSBleGVjdXRpb24KLSAqIGRvZXMgbm90IGNvdW50IGFzIGlkbGUuICBUaGUgY2FsbGVyIG11c3QgaGF2ZSBkaXNhYmxlZCBpbnRlcnJ1cHRzLgorICogZG9lcyBub3QgY291bnQgYXMgaWRsZS4gIFRoZSBjYWxsZXIgbXVzdCBoYXZlIGRpc2FibGVkIGludGVycnVwdHMsCisgKiBhbmQgbXVzdCBiZSBydW5uaW5nIG9uIHRpY2tfZG9fdGltZXJfY3B1LgogICovCiBzdGF0aWMgdm9pZCByY3Vfc3lzaWRsZV9jaGVja19jcHUoc3RydWN0IHJjdV9kYXRhICpyZHAsIGJvb2wgKmlzaWRsZSwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgKm1heGopCkBAIC0yNzg0LDggKzI3ODIsOCBAQAogCWlmICghKmlzaWRsZSB8fCByZHAtPnJzcCAhPSByY3Vfc3RhdGVfcCB8fAogCSAgICBjcHVfaXNfb2ZmbGluZShyZHAtPmNwdSkgfHwgcmRwLT5jcHUgPT0gdGlja19kb190aW1lcl9jcHUpCiAJCXJldHVybjsKLQlpZiAocmN1X2dwX2luX3Byb2dyZXNzKHJkcC0+cnNwKSkKLQkJV0FSTl9PTl9PTkNFKHNtcF9wcm9jZXNzb3JfaWQoKSAhPSB0aWNrX2RvX3RpbWVyX2NwdSk7CisJLyogVmVyaWZ5IGFmZmluaXR5IG9mIGN1cnJlbnQga3RocmVhZC4gKi8KKwlXQVJOX09OX09OQ0Uoc21wX3Byb2Nlc3Nvcl9pZCgpICE9IHRpY2tfZG9fdGltZXJfY3B1KTsKIAogCS8qIFBpY2sgdXAgY3VycmVudCBpZGxlIGFuZCBOTUktbmVzdGluZyBjb3VudGVyIGFuZCBjaGVjay4gKi8KIAljdXIgPSBhdG9taWNfcmVhZCgmcmR0cC0+ZHludGlja3NfaWRsZSk7CkBAIC0zMDY4LDExICszMDY2LDEwIEBACiAJCXJldHVybjsKICNpZmRlZiBDT05GSUdfTk9fSFpfRlVMTF9TWVNJRExFCiAJY3B1ID0gdGlja19kb190aW1lcl9jcHU7Ci0JaWYgKGNwdSA+PSAwICYmIGNwdSA8IG5yX2NwdV9pZHMgJiYgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSAhPSBjcHUpCisJaWYgKGNwdSA+PSAwICYmIGNwdSA8IG5yX2NwdV9pZHMpCiAJCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIGNwdW1hc2tfb2YoY3B1KSk7CiAjZWxzZSAvKiAjaWZkZWYgQ09ORklHX05PX0haX0ZVTExfU1lTSURMRSAqLwotCWlmICghaXNfaG91c2VrZWVwaW5nX2NwdShyYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKSkKLQkJaG91c2VrZWVwaW5nX2FmZmluZShjdXJyZW50KTsKKwlob3VzZWtlZXBpbmdfYWZmaW5lKGN1cnJlbnQpOwogI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfTk9fSFpfRlVMTF9TWVNJRExFICovCiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UvdHJlZV90cmFjZS5jIGIva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKaW5kZXggZmJiNjI0MC4uZjkyMzYxZSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKKysrIGIva2VybmVsL3JjdS90cmVlX3RyYWNlLmMKQEAgLTI4Myw4ICsyODMsOCBAQAogCQkJc2VxX3B1dHMobSwgIlxuIik7CiAJCQlsZXZlbCA9IHJucC0+bGV2ZWw7CiAJCX0KLQkJc2VxX3ByaW50ZihtLCAiJWx4LyVseCAlYyVjPiVjICVkOiVkIF4lZCAgICAiLAotCQkJICAgcm5wLT5xc21hc2ssIHJucC0+cXNtYXNraW5pdCwKKwkJc2VxX3ByaW50ZihtLCAiJWx4LyVseC0+JWx4ICVjJWM+JWMgJWQ6JWQgXiVkICAgICIsCisJCQkgICBybnAtPnFzbWFzaywgcm5wLT5xc21hc2tpbml0LCBybnAtPnFzbWFza2luaXRuZXh0LAogCQkJICAgIi5HIltybnAtPmdwX3Rhc2tzICE9IE5VTExdLAogCQkJICAgIi5FIltybnAtPmV4cF90YXNrcyAhPSBOVUxMXSwKIAkJCSAgICIuVCJbIWxpc3RfZW1wdHkoJnJucC0+YmxrZF90YXNrcyldLApkaWZmIC0tZ2l0IGEva2VybmVsL3JjdS91cGRhdGUuYyBiL2tlcm5lbC9yY3UvdXBkYXRlLmMKaW5kZXggZTBkMzFhMy4uMWYxMzMzNSAxMDA2NDQKLS0tIGEva2VybmVsL3JjdS91cGRhdGUuYworKysgYi9rZXJuZWwvcmN1L3VwZGF0ZS5jCkBAIC02Miw2ICs2Miw2MyBAQAogCiBtb2R1bGVfcGFyYW0ocmN1X2V4cGVkaXRlZCwgaW50LCAwKTsKIAorI2lmbmRlZiBDT05GSUdfVElOWV9SQ1UKKworc3RhdGljIGF0b21pY190IHJjdV9leHBlZGl0ZWRfbmVzdGluZyA9CisJQVRPTUlDX0lOSVQoSVNfRU5BQkxFRChDT05GSUdfUkNVX0VYUEVESVRFX0JPT1QpID8gMSA6IDApOworCisvKgorICogU2hvdWxkIG5vcm1hbCBncmFjZS1wZXJpb2QgcHJpbWl0aXZlcyBiZSBleHBlZGl0ZWQ/ICBJbnRlbmRlZCBmb3IKKyAqIHVzZSB3aXRoaW4gUkNVLiAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHJjdV9leHBlZGl0ZWQKKyAqIHN5c2ZzL2Jvb3QgdmFyaWFibGUgaW50byBhY2NvdW50IGFzIHdlbGwgYXMgdGhlIHJjdV9leHBlZGl0ZV9ncCgpCisgKiBuZXN0aW5nLiAgU28gbG9vcGluZyBvbiByY3VfdW5leHBlZGl0ZV9ncCgpIHVudGlsIHJjdV9ncF9pc19leHBlZGl0ZWQoKQorICogcmV0dXJucyBmYWxzZSBpcyBhIC1yZWFsbHktIGJhZCBpZGVhLgorICovCitib29sIHJjdV9ncF9pc19leHBlZGl0ZWQodm9pZCkKK3sKKwlyZXR1cm4gcmN1X2V4cGVkaXRlZCB8fCBhdG9taWNfcmVhZCgmcmN1X2V4cGVkaXRlZF9uZXN0aW5nKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJjdV9ncF9pc19leHBlZGl0ZWQpOworCisvKioKKyAqIHJjdV9leHBlZGl0ZV9ncCAtIEV4cGVkaXRlIGZ1dHVyZSBSQ1UgZ3JhY2UgcGVyaW9kcworICoKKyAqIEFmdGVyIGEgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLCBmdXR1cmUgY2FsbHMgdG8gc3luY2hyb25pemVfcmN1KCkgYW5kCisgKiBmcmllbmRzIGFjdCBhcyB0aGUgY29ycmVzcG9uZGluZyBzeW5jaHJvbml6ZV9yY3VfZXhwZWRpdGVkKCkgZnVuY3Rpb24KKyAqIGhhZCBpbnN0ZWFkIGJlZW4gY2FsbGVkLgorICovCit2b2lkIHJjdV9leHBlZGl0ZV9ncCh2b2lkKQoreworCWF0b21pY19pbmMoJnJjdV9leHBlZGl0ZWRfbmVzdGluZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyY3VfZXhwZWRpdGVfZ3ApOworCisvKioKKyAqIHJjdV91bmV4cGVkaXRlX2dwIC0gQ2FuY2VsIHByaW9yIHJjdV9leHBlZGl0ZV9ncCgpIGludm9jYXRpb24KKyAqCisgKiBVbmRvIGEgcHJpb3IgY2FsbCB0byByY3VfZXhwZWRpdGVfZ3AoKS4gIElmIGFsbCBwcmlvciBjYWxscyB0bworICogcmN1X2V4cGVkaXRlX2dwKCkgYXJlIHVuZG9uZSBieSBhIHN1YnNlcXVlbnQgY2FsbCB0byByY3VfdW5leHBlZGl0ZV9ncCgpLAorICogYW5kIGlmIHRoZSByY3VfZXhwZWRpdGVkIHN5c2ZzL2Jvb3QgcGFyYW1ldGVyIGlzIG5vdCBzZXQsIHRoZW4gYWxsCisgKiBzdWJzZXF1ZW50IGNhbGxzIHRvIHN5bmNocm9uaXplX3JjdSgpIGFuZCBmcmllbmRzIHdpbGwgcmV0dXJuIHRvCisgKiB0aGVpciBub3JtYWwgbm9uLWV4cGVkaXRlZCBiZWhhdmlvci4KKyAqLwordm9pZCByY3VfdW5leHBlZGl0ZV9ncCh2b2lkKQoreworCWF0b21pY19kZWMoJnJjdV9leHBlZGl0ZWRfbmVzdGluZyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyY3VfdW5leHBlZGl0ZV9ncCk7CisKKyNlbmRpZiAvKiAjaWZuZGVmIENPTkZJR19USU5ZX1JDVSAqLworCisvKgorICogSW5mb3JtIFJDVSBvZiB0aGUgZW5kIG9mIHRoZSBpbi1rZXJuZWwgYm9vdCBzZXF1ZW5jZS4KKyAqLwordm9pZCByY3VfZW5kX2lua2VybmVsX2Jvb3Qodm9pZCkKK3sKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfUkNVX0VYUEVESVRFX0JPT1QpKQorCQlyY3VfdW5leHBlZGl0ZV9ncCgpOworfQorCiAjaWZkZWYgQ09ORklHX1BSRUVNUFRfUkNVCiAKIC8qCkBAIC0xOTksMTYgKzI1NiwxMyBAQAogCiAjZW5kaWYgLyogI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DICovCiAKLXN0cnVjdCByY3Vfc3luY2hyb25pemUgewotCXN0cnVjdCByY3VfaGVhZCBoZWFkOwotCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBsZXRpb247Ci19OwotCi0vKgotICogQXdha2VuIHRoZSBjb3JyZXNwb25kaW5nIHN5bmNocm9uaXplX3JjdSgpIGluc3RhbmNlIG5vdyB0aGF0IGEKLSAqIGdyYWNlIHBlcmlvZCBoYXMgZWxhcHNlZC4KKy8qKgorICogd2FrZW1lX2FmdGVyX3JjdSgpIC0gQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYXdha2VuIGEgdGFzayBhZnRlciBncmFjZSBwZXJpb2QKKyAqIEBoZWFkOiBQb2ludGVyIHRvIHJjdV9oZWFkIG1lbWJlciB3aXRoaW4gcmN1X3N5bmNocm9uaXplIHN0cnVjdHVyZQorICoKKyAqIEF3YWtlbiB0aGUgY29ycmVzcG9uZGluZyB0YXNrIG5vdyB0aGF0IGEgZ3JhY2UgcGVyaW9kIGhhcyBlbGFwc2VkLgogICovCi1zdGF0aWMgdm9pZCB3YWtlbWVfYWZ0ZXJfcmN1KHN0cnVjdCByY3VfaGVhZCAgKmhlYWQpCit2b2lkIHdha2VtZV9hZnRlcl9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQogewogCXN0cnVjdCByY3Vfc3luY2hyb25pemUgKnJjdTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3JlYm9vdC5jIGIva2VybmVsL3JlYm9vdC5jCmluZGV4IDU5MjVmNWEuLmQyMGM4NWQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZWJvb3QuYworKysgYi9rZXJuZWwvcmVib290LmMKQEAgLTM4Nyw4ICszODcsOSBAQAogfQogCiBjaGFyIHBvd2Vyb2ZmX2NtZFtQT1dFUk9GRl9DTURfUEFUSF9MRU5dID0gIi9zYmluL3Bvd2Vyb2ZmIjsKK3N0YXRpYyBjb25zdCBjaGFyIHJlYm9vdF9jbWRbXSA9ICIvc2Jpbi9yZWJvb3QiOwogCi1zdGF0aWMgaW50IF9fb3JkZXJseV9wb3dlcm9mZihib29sIGZvcmNlKQorc3RhdGljIGludCBydW5fY21kKGNvbnN0IGNoYXIgKmNtZCkKIHsKIAljaGFyICoqYXJndjsKIAlzdGF0aWMgY2hhciAqZW52cFtdID0gewpAQCAtMzk3LDggKzM5OCw3IEBACiAJCU5VTEwKIAl9OwogCWludCByZXQ7Ci0KLQlhcmd2ID0gYXJndl9zcGxpdChHRlBfS0VSTkVMLCBwb3dlcm9mZl9jbWQsIE5VTEwpOworCWFyZ3YgPSBhcmd2X3NwbGl0KEdGUF9LRVJORUwsIGNtZCwgTlVMTCk7CiAJaWYgKGFyZ3YpIHsKIAkJcmV0ID0gY2FsbF91c2VybW9kZWhlbHBlcihhcmd2WzBdLCBhcmd2LCBlbnZwLCBVTUhfV0FJVF9FWEVDKTsKIAkJYXJndl9mcmVlKGFyZ3YpOwpAQCAtNDA2LDggKzQwNiwzMyBAQAogCQlyZXQgPSAtRU5PTUVNOwogCX0KIAorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19vcmRlcmx5X3JlYm9vdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBydW5fY21kKHJlYm9vdF9jbWQpOworCisJaWYgKHJldCkgeworCQlwcl93YXJuKCJGYWlsZWQgdG8gc3RhcnQgb3JkZXJseSByZWJvb3Q6IGZvcmNpbmcgdGhlIGlzc3VlXG4iKTsKKwkJZW1lcmdlbmN5X3N5bmMoKTsKKwkJa2VybmVsX3Jlc3RhcnQoTlVMTCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX29yZGVybHlfcG93ZXJvZmYoYm9vbCBmb3JjZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcnVuX2NtZChwb3dlcm9mZl9jbWQpOworCiAJaWYgKHJldCAmJiBmb3JjZSkgewogCQlwcl93YXJuKCJGYWlsZWQgdG8gc3RhcnQgb3JkZXJseSBzaHV0ZG93bjogZm9yY2luZyB0aGUgaXNzdWVcbiIpOworCiAJCS8qCiAJCSAqIEkgZ3Vlc3MgdGhpcyBzaG91bGQgdHJ5IHRvIGtpY2sgb2ZmIHNvbWUgZGFlbW9uIHRvIHN5bmMgYW5kCiAJCSAqIHBvd2Vyb2ZmIGFzYXAuICBPciBub3QgZXZlbiBib3RoZXIgc3luY2luZyBpZiB3ZSdyZSBkb2luZyBhbgpAQCAtNDM2LDE1ICs0NjEsMzMgQEAKICAqIFRoaXMgbWF5IGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0IHRvIHRyaWdnZXIgYSBzeXN0ZW0gc2h1dGRvd24uCiAgKiBJZiB0aGUgb3JkZXJseSBzaHV0ZG93biBmYWlscywgaXQgd2lsbCBmb3JjZSBhbiBpbW1lZGlhdGUgc2h1dGRvd24uCiAgKi8KLWludCBvcmRlcmx5X3Bvd2Vyb2ZmKGJvb2wgZm9yY2UpCit2b2lkIG9yZGVybHlfcG93ZXJvZmYoYm9vbCBmb3JjZSkKIHsKIAlpZiAoZm9yY2UpIC8qIGRvIG5vdCBvdmVycmlkZSB0aGUgcGVuZGluZyAidHJ1ZSIgKi8KIAkJcG93ZXJvZmZfZm9yY2UgPSB0cnVlOwogCXNjaGVkdWxlX3dvcmsoJnBvd2Vyb2ZmX3dvcmspOwotCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwob3JkZXJseV9wb3dlcm9mZik7CiAKK3N0YXRpYyB2b2lkIHJlYm9vdF93b3JrX2Z1bmMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCV9fb3JkZXJseV9yZWJvb3QoKTsKK30KKworc3RhdGljIERFQ0xBUkVfV09SSyhyZWJvb3Rfd29yaywgcmVib290X3dvcmtfZnVuYyk7CisKKy8qKgorICogb3JkZXJseV9yZWJvb3QgLSBUcmlnZ2VyIGFuIG9yZGVybHkgc3lzdGVtIHJlYm9vdAorICoKKyAqIFRoaXMgbWF5IGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0IHRvIHRyaWdnZXIgYSBzeXN0ZW0gcmVib290LgorICogSWYgdGhlIG9yZGVybHkgcmVib290IGZhaWxzLCBpdCB3aWxsIGZvcmNlIGFuIGltbWVkaWF0ZSByZWJvb3QuCisgKi8KK3ZvaWQgb3JkZXJseV9yZWJvb3Qodm9pZCkKK3sKKwlzY2hlZHVsZV93b3JrKCZyZWJvb3Rfd29yayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChvcmRlcmx5X3JlYm9vdCk7CisKIHN0YXRpYyBpbnQgX19pbml0IHJlYm9vdF9zZXR1cChjaGFyICpzdHIpCiB7CiAJZm9yICg7OykgewpkaWZmIC0tZ2l0IGEva2VybmVsL3Jlc291cmNlLmMgYi9rZXJuZWwvcmVzb3VyY2UuYwppbmRleCAxOWYyMzU3Li45MDU1MmFhIDEwMDY0NAotLS0gYS9rZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtMTAzNCw4ICsxMDM0LDYgQEAKICAqCiAgKiByZXF1ZXN0X3JlZ2lvbiBjcmVhdGVzIGEgbmV3IGJ1c3kgcmVnaW9uLgogICoKLSAqIGNoZWNrX3JlZ2lvbiByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSBhcmVhIGlzIGFscmVhZHkgYnVzeS4KLSAqCiAgKiByZWxlYXNlX3JlZ2lvbiByZWxlYXNlcyBhIG1hdGNoaW5nIGJ1c3kgcmVnaW9uLgogICovCiAKQEAgLTEwOTgsMzYgKzEwOTYsNiBAQAogRVhQT1JUX1NZTUJPTChfX3JlcXVlc3RfcmVnaW9uKTsKIAogLyoqCi0gKiBfX2NoZWNrX3JlZ2lvbiAtIGNoZWNrIGlmIGEgcmVzb3VyY2UgcmVnaW9uIGlzIGJ1c3kgb3IgZnJlZQotICogQHBhcmVudDogcGFyZW50IHJlc291cmNlIGRlc2NyaXB0b3IKLSAqIEBzdGFydDogcmVzb3VyY2Ugc3RhcnQgYWRkcmVzcwotICogQG46IHJlc291cmNlIHJlZ2lvbiBzaXplCi0gKgotICogUmV0dXJucyAwIGlmIHRoZSByZWdpb24gaXMgZnJlZSBhdCB0aGUgbW9tZW50IGl0IGlzIGNoZWNrZWQsCi0gKiByZXR1cm5zICUtRUJVU1kgaWYgdGhlIHJlZ2lvbiBpcyBidXN5LgotICoKLSAqIE5PVEU6Ci0gKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBpdHMgdXNlIGlzIHJhY3kuCi0gKiBFdmVuIGlmIGl0IHJldHVybnMgMCwgYSBzdWJzZXF1ZW50IGNhbGwgdG8gcmVxdWVzdF9yZWdpb24oKQotICogbWF5IGZhaWwgYmVjYXVzZSBhbm90aGVyIGRyaXZlciBldGMuIGp1c3QgYWxsb2NhdGVkIHRoZSByZWdpb24uCi0gKiBEbyBOT1QgdXNlIGl0LiAgSXQgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGtlcm5lbC4KLSAqLwotaW50IF9fY2hlY2tfcmVnaW9uKHN0cnVjdCByZXNvdXJjZSAqcGFyZW50LCByZXNvdXJjZV9zaXplX3Qgc3RhcnQsCi0JCQlyZXNvdXJjZV9zaXplX3QgbikKLXsKLQlzdHJ1Y3QgcmVzb3VyY2UgKiByZXM7Ci0KLQlyZXMgPSBfX3JlcXVlc3RfcmVnaW9uKHBhcmVudCwgc3RhcnQsIG4sICJjaGVjay1yZWdpb24iLCAwKTsKLQlpZiAoIXJlcykKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXJlbGVhc2VfcmVzb3VyY2UocmVzKTsKLQlmcmVlX3Jlc291cmNlKHJlcyk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKF9fY2hlY2tfcmVnaW9uKTsKLQotLyoqCiAgKiBfX3JlbGVhc2VfcmVnaW9uIC0gcmVsZWFzZSBhIHByZXZpb3VzbHkgcmVzZXJ2ZWQgcmVzb3VyY2UgcmVnaW9uCiAgKiBAcGFyZW50OiBwYXJlbnQgcmVzb3VyY2UgZGVzY3JpcHRvcgogICogQHN0YXJ0OiByZXNvdXJjZSBzdGFydCBhZGRyZXNzCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvY29yZS5jIGIva2VybmVsL3NjaGVkL2NvcmUuYwppbmRleCBmMGY4MzFlLi5mOTEyM2E4IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvY29yZS5jCisrKyBiL2tlcm5lbC9zY2hlZC9jb3JlLmMKQEAgLTMwNiw2ICszMDYsOSBAQAogICovCiBpbnQgc3lzY3RsX3NjaGVkX3J0X3J1bnRpbWUgPSA5NTAwMDA7CiAKKy8qIGNwdXMgd2l0aCBpc29sYXRlZCBkb21haW5zICovCitjcHVtYXNrX3Zhcl90IGNwdV9pc29sYXRlZF9tYXA7CisKIC8qCiAgKiB0aGlzX3JxX2xvY2sgLSBsb2NrIHRoaXMgcnVucXVldWUgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KICAqLwpAQCAtNjkwLDYgKzY5MywyMyBAQAogYm9vbCBzY2hlZF9jYW5fc3RvcF90aWNrKHZvaWQpCiB7CiAJLyoKKwkgKiBGSUZPIHJlYWx0aW1lIHBvbGljeSBydW5zIHRoZSBoaWdoZXN0IHByaW9yaXR5IHRhc2suIE90aGVyIHJ1bm5hYmxlCisJICogdGFza3MgYXJlIG9mIGEgbG93ZXIgcHJpb3JpdHkuIFRoZSBzY2hlZHVsZXIgdGljayBkb2VzIG5vdGhpbmcuCisJICovCisJaWYgKGN1cnJlbnQtPnBvbGljeSA9PSBTQ0hFRF9GSUZPKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qCisJICogUm91bmQtcm9iaW4gcmVhbHRpbWUgdGFza3MgdGltZSBzbGljZSB3aXRoIG90aGVyIHRhc2tzIGF0IHRoZSBzYW1lCisJICogcmVhbHRpbWUgcHJpb3JpdHkuIElzIHRoaXMgdGFzayB0aGUgb25seSBvbmUgYXQgdGhpcyBwcmlvcml0eT8KKwkgKi8KKwlpZiAoY3VycmVudC0+cG9saWN5ID09IFNDSEVEX1JSKSB7CisJCXN0cnVjdCBzY2hlZF9ydF9lbnRpdHkgKnJ0X3NlID0gJmN1cnJlbnQtPnJ0OworCisJCXJldHVybiBydF9zZS0+cnVuX2xpc3QucHJldiA9PSBydF9zZS0+cnVuX2xpc3QubmV4dDsKKwl9CisKKwkvKgogCSAqIE1vcmUgdGhhbiBvbmUgcnVubmluZyB0YXNrIG5lZWQgcHJlZW1wdGlvbi4KIAkgKiBucl9ydW5uaW5nIHVwZGF0ZSBpcyBhc3N1bWVkIHRvIGJlIHZpc2libGUKIAkgKiBhZnRlciBJUEkgaXMgc2VudCBmcm9tIHdha2Vycy4KQEAgLTk5Niw2ICsxMDE2LDEzIEBACiAJCXJxX2Nsb2NrX3NraXBfdXBkYXRlKHJxLCB0cnVlKTsKIH0KIAorc3RhdGljIEFUT01JQ19OT1RJRklFUl9IRUFEKHRhc2tfbWlncmF0aW9uX25vdGlmaWVyKTsKKwordm9pZCByZWdpc3Rlcl90YXNrX21pZ3JhdGlvbl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm4pCit7CisJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZ0YXNrX21pZ3JhdGlvbl9ub3RpZmllciwgbik7Cit9CisKICNpZmRlZiBDT05GSUdfU01QCiB2b2lkIHNldF90YXNrX2NwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGludCBuZXdfY3B1KQogewpAQCAtMTAyNiwxMCArMTA1MywxOCBAQAogCXRyYWNlX3NjaGVkX21pZ3JhdGVfdGFzayhwLCBuZXdfY3B1KTsKIAogCWlmICh0YXNrX2NwdShwKSAhPSBuZXdfY3B1KSB7CisJCXN0cnVjdCB0YXNrX21pZ3JhdGlvbl9ub3RpZmllciB0bW47CisKIAkJaWYgKHAtPnNjaGVkX2NsYXNzLT5taWdyYXRlX3Rhc2tfcnEpCiAJCQlwLT5zY2hlZF9jbGFzcy0+bWlncmF0ZV90YXNrX3JxKHAsIG5ld19jcHUpOwogCQlwLT5zZS5ucl9taWdyYXRpb25zKys7CiAJCXBlcmZfc3dfZXZlbnRfc2NoZWQoUEVSRl9DT1VOVF9TV19DUFVfTUlHUkFUSU9OUywgMSwgMCk7CisKKwkJdG1uLnRhc2sgPSBwOworCQl0bW4uZnJvbV9jcHUgPSB0YXNrX2NwdShwKTsKKwkJdG1uLnRvX2NwdSA9IG5ld19jcHU7CisKKwkJYXRvbWljX25vdGlmaWVyX2NhbGxfY2hhaW4oJnRhc2tfbWlncmF0aW9uX25vdGlmaWVyLCAwLCAmdG1uKTsKIAl9CiAKIAlfX3NldF90YXNrX2NwdShwLCBuZXdfY3B1KTsKQEAgLTI4MTgsNyArMjg1Myw3IEBACiAJICogd2UgZmluZCBhIGJldHRlciBzb2x1dGlvbi4KIAkgKgogCSAqIE5COiBUaGVyZSBhcmUgYnVnZ3kgY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uLiAgSWRlYWxseSB3ZQotCSAqIHNob3VsZCB3YXJuIGlmIHByZXZfc3RhdGUgIT0gSU5fVVNFUiwgYnV0IHRoYXQgd2lsbCB0cmlnZ2VyCisJICogc2hvdWxkIHdhcm4gaWYgcHJldl9zdGF0ZSAhPSBDT05URVhUX1VTRVIsIGJ1dCB0aGF0IHdpbGwgdHJpZ2dlcgogCSAqIHRvbyBmcmVxdWVudGx5IHRvIG1ha2Ugc2Vuc2UgeWV0LgogCSAqLwogCWVudW0gY3R4X3N0YXRlIHByZXZfc3RhdGUgPSBleGNlcHRpb25fZW50ZXIoKTsKQEAgLTMwMzQsNiArMzA2OSw4IEBACiAJfSBlbHNlIHsKIAkJaWYgKGRsX3ByaW8ob2xkcHJpbykpCiAJCQlwLT5kbC5kbF9ib29zdGVkID0gMDsKKwkJaWYgKHJ0X3ByaW8ob2xkcHJpbykpCisJCQlwLT5ydC50aW1lb3V0ID0gMDsKIAkJcC0+c2NoZWRfY2xhc3MgPSAmZmFpcl9zY2hlZF9jbGFzczsKIAl9CiAKQEAgLTUzMTgsMzYgKzUzNTUsMTMgQEAKIHN0YXRpYyBpbnQgc2NoZWRfY3B1X2luYWN0aXZlKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAogCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWxvbmcgY3B1ID0gKGxvbmcpaGNwdTsKLQlzdHJ1Y3QgZGxfYncgKmRsX2I7Ci0KIAlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7CiAJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCQlzZXRfY3B1X2FjdGl2ZShjcHUsIGZhbHNlKTsKLQotCQkvKiBleHBsaWNpdGx5IGFsbG93IHN1c3BlbmQgKi8KLQkJaWYgKCEoYWN0aW9uICYgQ1BVX1RBU0tTX0ZST1pFTikpIHsKLQkJCWJvb2wgb3ZlcmZsb3c7Ci0JCQlpbnQgY3B1czsKLQotCQkJcmN1X3JlYWRfbG9ja19zY2hlZCgpOwotCQkJZGxfYiA9IGRsX2J3X29mKGNwdSk7Ci0KLQkJCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZGxfYi0+bG9jaywgZmxhZ3MpOwotCQkJY3B1cyA9IGRsX2J3X2NwdXMoY3B1KTsKLQkJCW92ZXJmbG93ID0gX19kbF9vdmVyZmxvdyhkbF9iLCBjcHVzLCAwLCAwKTsKLQkJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbF9iLT5sb2NrLCBmbGFncyk7Ci0KLQkJCXJjdV9yZWFkX3VubG9ja19zY2hlZCgpOwotCi0JCQlpZiAob3ZlcmZsb3cpCi0JCQkJcmV0dXJuIG5vdGlmaWVyX2Zyb21fZXJybm8oLUVCVVNZKTsKLQkJfQorCQlzZXRfY3B1X2FjdGl2ZSgobG9uZyloY3B1LCBmYWxzZSk7CiAJCXJldHVybiBOT1RJRllfT0s7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5PVElGWV9ET05FOwogCX0KLQotCXJldHVybiBOT1RJRllfRE9ORTsKIH0KIAogc3RhdGljIGludCBfX2luaXQgbWlncmF0aW9uX2luaXQodm9pZCkKQEAgLTU0MjgsMTcgKzU0NDIsNiBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQkvKgotCQkgKiBFdmVuIHRob3VnaCB3ZSBpbml0aWFsaXplIC0+Y2FwYWNpdHkgdG8gc29tZXRoaW5nIHNlbWktc2FuZSwKLQkJICogd2UgbGVhdmUgY2FwYWNpdHlfb3JpZyB1bnNldC4gVGhpcyBhbGxvd3MgdXMgdG8gZGV0ZWN0IGlmCi0JCSAqIGRvbWFpbiBpdGVyYXRpb24gaXMgc3RpbGwgZnVubnkgd2l0aG91dCBjYXVzaW5nIC8wIHRyYXBzLgotCQkgKi8KLQkJaWYgKCFncm91cC0+c2djLT5jYXBhY2l0eV9vcmlnKSB7Ci0JCQlwcmludGsoS0VSTl9DT05UICJcbiIpOwotCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogZG9tYWluLT5jcHVfY2FwYWNpdHkgbm90IHNldFxuIik7Ci0JCQlicmVhazsKLQkJfQotCiAJCWlmICghY3B1bWFza193ZWlnaHQoc2NoZWRfZ3JvdXBfY3B1cyhncm91cCkpKSB7CiAJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOwogCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogZW1wdHkgZ3JvdXBcbiIpOwpAQCAtNTgxMSw5ICs1ODE0LDYgQEAKIAl1cGRhdGVfdG9wX2NhY2hlX2RvbWFpbihjcHUpOwogfQogCi0vKiBjcHVzIHdpdGggaXNvbGF0ZWQgZG9tYWlucyAqLwotc3RhdGljIGNwdW1hc2tfdmFyX3QgY3B1X2lzb2xhdGVkX21hcDsKLQogLyogU2V0dXAgdGhlIG1hc2sgb2YgY3B1cyBjb25maWd1cmVkIGZvciBpc29sYXRlZCBkb21haW5zICovCiBzdGF0aWMgaW50IF9faW5pdCBpc29sYXRlZF9jcHVfc2V0dXAoY2hhciAqc3RyKQogewpAQCAtNTkyMiw3ICs1OTIyLDYgQEAKIAkJICogZGllIG9uIGEgLzAgdHJhcC4KIAkJICovCiAJCXNnLT5zZ2MtPmNhcGFjaXR5ID0gU0NIRURfQ0FQQUNJVFlfU0NBTEUgKiBjcHVtYXNrX3dlaWdodChzZ19zcGFuKTsKLQkJc2ctPnNnYy0+Y2FwYWNpdHlfb3JpZyA9IHNnLT5zZ2MtPmNhcGFjaXR5OwogCiAJCS8qCiAJCSAqIE1ha2Ugc3VyZSB0aGUgZmlyc3QgZ3JvdXAgb2YgdGhpcyBkb21haW4gY29udGFpbnMgdGhlCkBAIC02MjMzLDYgKzYyMzIsNyBAQAogCSAqLwogCiAJaWYgKHNkLT5mbGFncyAmIFNEX1NIQVJFX0NQVUNBUEFDSVRZKSB7CisJCXNkLT5mbGFncyB8PSBTRF9QUkVGRVJfU0lCTElORzsKIAkJc2QtPmltYmFsYW5jZV9wY3QgPSAxMTA7CiAJCXNkLT5zbXRfZ2FpbiA9IDExNzg7IC8qIH4xNSUgKi8KIApAQCAtNjk5OCw3ICs2OTk4LDYgQEAKIAkJICovCiAKIAljYXNlIENQVV9PTkxJTkU6Ci0JY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CiAJCWNwdXNldF91cGRhdGVfYWN0aXZlX2NwdXModHJ1ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC03MDEwLDggKzcwMDksMzAgQEAKIHN0YXRpYyBpbnQgY3B1c2V0X2NwdV9pbmFjdGl2ZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCiAJCQkgICAgICAgdm9pZCAqaGNwdSkKIHsKLQlzd2l0Y2ggKGFjdGlvbikgeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9uZyBjcHUgPSAobG9uZyloY3B1OworCXN0cnVjdCBkbF9idyAqZGxfYjsKKworCXN3aXRjaCAoYWN0aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKIAljYXNlIENQVV9ET1dOX1BSRVBBUkU6CisJCS8qIGV4cGxpY2l0bHkgYWxsb3cgc3VzcGVuZCAqLworCQlpZiAoIShhY3Rpb24gJiBDUFVfVEFTS1NfRlJPWkVOKSkgeworCQkJYm9vbCBvdmVyZmxvdzsKKwkJCWludCBjcHVzOworCisJCQlyY3VfcmVhZF9sb2NrX3NjaGVkKCk7CisJCQlkbF9iID0gZGxfYndfb2YoY3B1KTsKKworCQkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkbF9iLT5sb2NrLCBmbGFncyk7CisJCQljcHVzID0gZGxfYndfY3B1cyhjcHUpOworCQkJb3ZlcmZsb3cgPSBfX2RsX292ZXJmbG93KGRsX2IsIGNwdXMsIDAsIDApOworCQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRsX2ItPmxvY2ssIGZsYWdzKTsKKworCQkJcmN1X3JlYWRfdW5sb2NrX3NjaGVkKCk7CisKKwkJCWlmIChvdmVyZmxvdykKKwkJCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubygtRUJVU1kpOworCQl9CiAJCWNwdXNldF91cGRhdGVfYWN0aXZlX2NwdXMoZmFsc2UpOwogCQlicmVhazsKIAljYXNlIENQVV9ET1dOX1BSRVBBUkVfRlJPWkVOOgpAQCAtNzE1Niw4ICs3MTc3LDggQEAKIAkJcnEtPmNhbGNfbG9hZF9hY3RpdmUgPSAwOwogCQlycS0+Y2FsY19sb2FkX3VwZGF0ZSA9IGppZmZpZXMgKyBMT0FEX0ZSRVE7CiAJCWluaXRfY2ZzX3JxKCZycS0+Y2ZzKTsKLQkJaW5pdF9ydF9ycSgmcnEtPnJ0LCBycSk7Ci0JCWluaXRfZGxfcnEoJnJxLT5kbCwgcnEpOworCQlpbml0X3J0X3JxKCZycS0+cnQpOworCQlpbml0X2RsX3JxKCZycS0+ZGwpOwogI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECiAJCXJvb3RfdGFza19ncm91cC5zaGFyZXMgPSBST09UX1RBU0tfR1JPVVBfTE9BRDsKIAkJSU5JVF9MSVNUX0hFQUQoJnJxLT5sZWFmX2Nmc19ycV9saXN0KTsKQEAgLTcxOTcsNyArNzIxOCw3IEBACiAjaWZkZWYgQ09ORklHX1NNUAogCQlycS0+c2QgPSBOVUxMOwogCQlycS0+cmQgPSBOVUxMOwotCQlycS0+Y3B1X2NhcGFjaXR5ID0gU0NIRURfQ0FQQUNJVFlfU0NBTEU7CisJCXJxLT5jcHVfY2FwYWNpdHkgPSBycS0+Y3B1X2NhcGFjaXR5X29yaWcgPSBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRTsKIAkJcnEtPnBvc3Rfc2NoZWR1bGUgPSAwOwogCQlycS0+YWN0aXZlX2JhbGFuY2UgPSAwOwogCQlycS0+bmV4dF9iYWxhbmNlID0gamlmZmllczsKQEAgLTc3OTYsNyArNzgxNyw3IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1JUX0dST1VQX1NDSEVEICovCiAKLXN0YXRpYyBpbnQgc2NoZWRfZGxfZ2xvYmFsX2NvbnN0cmFpbnRzKHZvaWQpCitzdGF0aWMgaW50IHNjaGVkX2RsX2dsb2JhbF92YWxpZGF0ZSh2b2lkKQogewogCXU2NCBydW50aW1lID0gZ2xvYmFsX3J0X3J1bnRpbWUoKTsKIAl1NjQgcGVyaW9kID0gZ2xvYmFsX3J0X3BlcmlvZCgpOwpAQCAtNzg5NywxMSArNzkxOCwxMSBAQAogCQlpZiAocmV0KQogCQkJZ290byB1bmRvOwogCi0JCXJldCA9IHNjaGVkX3J0X2dsb2JhbF9jb25zdHJhaW50cygpOworCQlyZXQgPSBzY2hlZF9kbF9nbG9iYWxfdmFsaWRhdGUoKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gdW5kbzsKIAotCQlyZXQgPSBzY2hlZF9kbF9nbG9iYWxfY29uc3RyYWludHMoKTsKKwkJcmV0ID0gc2NoZWRfcnRfZ2xvYmFsX2NvbnN0cmFpbnRzKCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIHVuZG87CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9kZWFkbGluZS5jIGIva2VybmVsL3NjaGVkL2RlYWRsaW5lLmMKaW5kZXggM2ZhOGZhNi4uNWU5NTE0NSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2RlYWRsaW5lLmMKKysrIGIva2VybmVsL3NjaGVkL2RlYWRsaW5lLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAlkbF9iLT50b3RhbF9idyA9IDA7CiB9CiAKLXZvaWQgaW5pdF9kbF9ycShzdHJ1Y3QgZGxfcnEgKmRsX3JxLCBzdHJ1Y3QgcnEgKnJxKQordm9pZCBpbml0X2RsX3JxKHN0cnVjdCBkbF9ycSAqZGxfcnEpCiB7CiAJZGxfcnEtPnJiX3Jvb3QgPSBSQl9ST09UOwogCkBAIC0yMTgsNiArMjE4LDUyIEBACiAJcnEtPnBvc3Rfc2NoZWR1bGUgPSBoYXNfcHVzaGFibGVfZGxfdGFza3MocnEpOwogfQogCitzdGF0aWMgc3RydWN0IHJxICpmaW5kX2xvY2tfbGF0ZXJfcnEoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBzdHJ1Y3QgcnEgKnJxKTsKKworc3RhdGljIHZvaWQgZGxfdGFza19vZmZsaW5lX21pZ3JhdGlvbihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJc3RydWN0IHJxICpsYXRlcl9ycSA9IE5VTEw7CisJYm9vbCBmYWxsYmFjayA9IGZhbHNlOworCisJbGF0ZXJfcnEgPSBmaW5kX2xvY2tfbGF0ZXJfcnEocCwgcnEpOworCisJaWYgKCFsYXRlcl9ycSkgeworCQlpbnQgY3B1OworCisJCS8qCisJCSAqIElmIHdlIGNhbm5vdCBwcmVlbXB0IGFueSBycSwgZmFsbCBiYWNrIHRvIHBpY2sgYW55CisJCSAqIG9ubGluZSBjcHUuCisJCSAqLworCQlmYWxsYmFjayA9IHRydWU7CisJCWNwdSA9IGNwdW1hc2tfYW55X2FuZChjcHVfYWN0aXZlX21hc2ssIHRza19jcHVzX2FsbG93ZWQocCkpOworCQlpZiAoY3B1ID49IG5yX2NwdV9pZHMpIHsKKwkJCS8qCisJCQkgKiBGYWlsIHRvIGZpbmQgYW55IHN1aXRhYmxlIGNwdS4KKwkJCSAqIFRoZSB0YXNrIHdpbGwgbmV2ZXIgY29tZSBiYWNrIQorCQkJICovCisJCQlCVUdfT04oZGxfYmFuZHdpZHRoX2VuYWJsZWQoKSk7CisKKwkJCS8qCisJCQkgKiBJZiBhZG1pc3Npb24gY29udHJvbCBpcyBkaXNhYmxlZCB3ZQorCQkJICogdHJ5IGEgbGl0dGxlIGhhcmRlciB0byBsZXQgdGhlIHRhc2sKKwkJCSAqIHJ1bi4KKwkJCSAqLworCQkJY3B1ID0gY3B1bWFza19hbnkoY3B1X2FjdGl2ZV9tYXNrKTsKKwkJfQorCQlsYXRlcl9ycSA9IGNwdV9ycShjcHUpOworCQlkb3VibGVfbG9ja19iYWxhbmNlKHJxLCBsYXRlcl9ycSk7CisJfQorCisJZGVhY3RpdmF0ZV90YXNrKHJxLCBwLCAwKTsKKwlzZXRfdGFza19jcHUocCwgbGF0ZXJfcnEtPmNwdSk7CisJYWN0aXZhdGVfdGFzayhsYXRlcl9ycSwgcCwgRU5RVUVVRV9SRVBMRU5JU0gpOworCisJaWYgKCFmYWxsYmFjaykKKwkJcmVzY2hlZF9jdXJyKGxhdGVyX3JxKTsKKworCWRvdWJsZV91bmxvY2tfYmFsYW5jZShycSwgbGF0ZXJfcnEpOworfQorCiAjZWxzZQogCiBzdGF0aWMgaW5saW5lCkBAIC01MTQsNyArNTYwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBycSAqcnE7CiAKLQlycSA9IHRhc2tfcnFfbG9jayhjdXJyZW50LCAmZmxhZ3MpOworCXJxID0gdGFza19ycV9sb2NrKHAsICZmbGFncyk7CiAKIAkvKgogCSAqIFdlIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHNldmVyYWwgcG9zc2libGUgcmFjZXMgaGVyZToKQEAgLTUzNiw2ICs1ODIsMTcgQEAKIAlzY2hlZF9jbG9ja190aWNrKCk7CiAJdXBkYXRlX3JxX2Nsb2NrKHJxKTsKIAorI2lmZGVmIENPTkZJR19TTVAKKwkvKgorCSAqIElmIHdlIGZpbmQgdGhhdCB0aGUgcnEgdGhlIHRhc2sgd2FzIG9uIGlzIG5vIGxvbmdlcgorCSAqIGF2YWlsYWJsZSwgd2UgbmVlZCB0byBzZWxlY3QgYSBuZXcgcnEuCisJICovCisJaWYgKHVubGlrZWx5KCFycS0+b25saW5lKSkgeworCQlkbF90YXNrX29mZmxpbmVfbWlncmF0aW9uKHJxLCBwKTsKKwkJZ290byB1bmxvY2s7CisJfQorI2VuZGlmCisKIAkvKgogCSAqIElmIHRoZSB0aHJvdHRsZSBoYXBwZW5lZCBkdXJpbmcgc2NoZWQtb3V0OyBsaWtlOgogCSAqCkBAIC01NjksNyArNjI2LDcgQEAKIAkJcHVzaF9kbF90YXNrKHJxKTsKICNlbmRpZgogdW5sb2NrOgotCXRhc2tfcnFfdW5sb2NrKHJxLCBjdXJyZW50LCAmZmxhZ3MpOworCXRhc2tfcnFfdW5sb2NrKHJxLCBwLCAmZmxhZ3MpOwogCiAJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwogfQpAQCAtOTE0LDYgKzk3MSwxMiBAQAogCX0KIAl1cGRhdGVfcnFfY2xvY2socnEpOwogCXVwZGF0ZV9jdXJyX2RsKHJxKTsKKwkvKgorCSAqIFRlbGwgdXBkYXRlX3JxX2Nsb2NrKCkgdGhhdCB3ZSd2ZSBqdXN0IHVwZGF0ZWQsCisJICogc28gd2UgZG9uJ3QgZG8gbWljcm9zY29waWMgdXBkYXRlIGluIHNjaGVkdWxlKCkKKwkgKiBhbmQgZG91YmxlIHRoZSBmYXN0cGF0aCBjb3N0LgorCSAqLworCXJxX2Nsb2NrX3NraXBfdXBkYXRlKHJxLCB0cnVlKTsKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTE2NTksMTQgKzE3MjIsNiBAQAogewogCWludCBjaGVja19yZXNjaGVkID0gMTsKIAotCS8qCi0JICogSWYgcCBpcyB0aHJvdHRsZWQsIGRvbid0IGNvbnNpZGVyIHRoZSBwb3NzaWJpbGl0eQotCSAqIG9mIHByZWVtcHRpbmcgcnEtPmN1cnIsIHRoZSBjaGVjayB3aWxsIGJlIGRvbmUgcmlnaHQKLQkgKiBhZnRlciBpdHMgcnVudGltZSB3aWxsIGdldCByZXBsZW5pc2hlZC4KLQkgKi8KLQlpZiAodW5saWtlbHkocC0+ZGwuZGxfdGhyb3R0bGVkKSkKLQkJcmV0dXJuOwotCiAJaWYgKHRhc2tfb25fcnFfcXVldWVkKHApICYmIHJxLT5jdXJyICE9IHApIHsKICNpZmRlZiBDT05GSUdfU01QCiAJCWlmIChwLT5ucl9jcHVzX2FsbG93ZWQgPiAxICYmIHJxLT5kbC5vdmVybG9hZGVkICYmCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvZGVidWcuYyBiL2tlcm5lbC9zY2hlZC9kZWJ1Zy5jCmluZGV4IDhiYWFmODUuLmEyNDVjMWYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC9kZWJ1Zy5jCisrKyBiL2tlcm5lbC9zY2hlZC9kZWJ1Zy5jCkBAIC03MSw3ICs3MSw3IEBACiAJaWYgKCFzZSkgewogCQlzdHJ1Y3Qgc2NoZWRfYXZnICphdmcgPSAmY3B1X3JxKGNwdSktPmF2ZzsKIAkJUChhdmctPnJ1bm5hYmxlX2F2Z19zdW0pOwotCQlQKGF2Zy0+cnVubmFibGVfYXZnX3BlcmlvZCk7CisJCVAoYXZnLT5hdmdfcGVyaW9kKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtOTQsOCArOTQsMTAgQEAKIAlQKHNlLT5sb2FkLndlaWdodCk7CiAjaWZkZWYgQ09ORklHX1NNUAogCVAoc2UtPmF2Zy5ydW5uYWJsZV9hdmdfc3VtKTsKLQlQKHNlLT5hdmcucnVubmFibGVfYXZnX3BlcmlvZCk7CisJUChzZS0+YXZnLnJ1bm5pbmdfYXZnX3N1bSk7CisJUChzZS0+YXZnLmF2Z19wZXJpb2QpOwogCVAoc2UtPmF2Zy5sb2FkX2F2Z19jb250cmliKTsKKwlQKHNlLT5hdmcudXRpbGl6YXRpb25fYXZnX2NvbnRyaWIpOwogCVAoc2UtPmF2Zy5kZWNheV9jb3VudCk7CiAjZW5kaWYKICN1bmRlZiBQTgpAQCAtMjE0LDYgKzIxNiw4IEBACiAJCQljZnNfcnEtPnJ1bm5hYmxlX2xvYWRfYXZnKTsKIAlTRVFfcHJpbnRmKG0sICIgIC4lLTMwczogJWxkXG4iLCAiYmxvY2tlZF9sb2FkX2F2ZyIsCiAJCQljZnNfcnEtPmJsb2NrZWRfbG9hZF9hdmcpOworCVNFUV9wcmludGYobSwgIiAgLiUtMzBzOiAlbGRcbiIsICJ1dGlsaXphdGlvbl9sb2FkX2F2ZyIsCisJCQljZnNfcnEtPnV0aWxpemF0aW9uX2xvYWRfYXZnKTsKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogCVNFUV9wcmludGYobSwgIiAgLiUtMzBzOiAlbGRcbiIsICJ0Z19sb2FkX2NvbnRyaWIiLAogCQkJY2ZzX3JxLT50Z19sb2FkX2NvbnRyaWIpOwpAQCAtNjM2LDggKzY0MCwxMCBAQAogCVAoc2UubG9hZC53ZWlnaHQpOwogI2lmZGVmIENPTkZJR19TTVAKIAlQKHNlLmF2Zy5ydW5uYWJsZV9hdmdfc3VtKTsKLQlQKHNlLmF2Zy5ydW5uYWJsZV9hdmdfcGVyaW9kKTsKKwlQKHNlLmF2Zy5ydW5uaW5nX2F2Z19zdW0pOworCVAoc2UuYXZnLmF2Z19wZXJpb2QpOwogCVAoc2UuYXZnLmxvYWRfYXZnX2NvbnRyaWIpOworCVAoc2UuYXZnLnV0aWxpemF0aW9uX2F2Z19jb250cmliKTsKIAlQKHNlLmF2Zy5kZWNheV9jb3VudCk7CiAjZW5kaWYKIAlQKHBvbGljeSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvZmFpci5jIGIva2VybmVsL3NjaGVkL2ZhaXIuYwppbmRleCA3Y2UxOGYzLi5mZmVhYTQxIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvZmFpci5jCisrKyBiL2tlcm5lbC9zY2hlZC9mYWlyLmMKQEAgLTY3MCw2ICs2NzAsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgdGFza19oX2xvYWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKIAogc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX3Rhc2tfZW50aXR5X2NvbnRyaWIoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpOworc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX3Rhc2tfZW50aXR5X3V0aWxpemF0aW9uKHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKTsKIAogLyogR2l2ZSBuZXcgdGFzayBzdGFydCBydW5uYWJsZSB2YWx1ZXMgdG8gaGVhdnkgaXRzIGxvYWQgaW4gaW5mYW50IHRpbWUgKi8KIHZvaWQgaW5pdF90YXNrX3J1bm5hYmxlX2F2ZXJhZ2Uoc3RydWN0IHRhc2tfc3RydWN0ICpwKQpAQCAtNjc3LDkgKzY3OCwxMCBAQAogCXUzMiBzbGljZTsKIAogCXNsaWNlID0gc2NoZWRfc2xpY2UodGFza19jZnNfcnEocCksICZwLT5zZSkgPj4gMTA7Ci0JcC0+c2UuYXZnLnJ1bm5hYmxlX2F2Z19zdW0gPSBzbGljZTsKLQlwLT5zZS5hdmcucnVubmFibGVfYXZnX3BlcmlvZCA9IHNsaWNlOworCXAtPnNlLmF2Zy5ydW5uYWJsZV9hdmdfc3VtID0gcC0+c2UuYXZnLnJ1bm5pbmdfYXZnX3N1bSA9IHNsaWNlOworCXAtPnNlLmF2Zy5hdmdfcGVyaW9kID0gc2xpY2U7CiAJX191cGRhdGVfdGFza19lbnRpdHlfY29udHJpYigmcC0+c2UpOworCV9fdXBkYXRlX3Rhc2tfZW50aXR5X3V0aWxpemF0aW9uKCZwLT5zZSk7CiB9CiAjZWxzZQogdm9pZCBpbml0X3Rhc2tfcnVubmFibGVfYXZlcmFnZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCkBAIC0xMTk2LDkgKzExOTgsMTEgQEAKIHN0YXRpYyBib29sIGxvYWRfdG9vX2ltYmFsYW5jZWQobG9uZyBzcmNfbG9hZCwgbG9uZyBkc3RfbG9hZCwKIAkJCQlzdHJ1Y3QgdGFza19udW1hX2VudiAqZW52KQogewotCWxvbmcgaW1iLCBvbGRfaW1iOwotCWxvbmcgb3JpZ19zcmNfbG9hZCwgb3JpZ19kc3RfbG9hZDsKIAlsb25nIHNyY19jYXBhY2l0eSwgZHN0X2NhcGFjaXR5OworCWxvbmcgb3JpZ19zcmNfbG9hZDsKKwlsb25nIGxvYWRfYSwgbG9hZF9iOworCWxvbmcgbW92ZWRfbG9hZDsKKwlsb25nIGltYjsKIAogCS8qCiAJICogVGhlIGxvYWQgaXMgY29ycmVjdGVkIGZvciB0aGUgQ1BVIGNhcGFjaXR5IGF2YWlsYWJsZSBvbiBlYWNoIG5vZGUuCkBAIC0xMjExLDMwICsxMjE1LDM5IEBACiAJZHN0X2NhcGFjaXR5ID0gZW52LT5kc3Rfc3RhdHMuY29tcHV0ZV9jYXBhY2l0eTsKIAogCS8qIFdlIGNhcmUgYWJvdXQgdGhlIHNsb3BlIG9mIHRoZSBpbWJhbGFuY2UsIG5vdCB0aGUgZGlyZWN0aW9uLiAqLwotCWlmIChkc3RfbG9hZCA8IHNyY19sb2FkKQotCQlzd2FwKGRzdF9sb2FkLCBzcmNfbG9hZCk7CisJbG9hZF9hID0gZHN0X2xvYWQ7CisJbG9hZF9iID0gc3JjX2xvYWQ7CisJaWYgKGxvYWRfYSA8IGxvYWRfYikKKwkJc3dhcChsb2FkX2EsIGxvYWRfYik7CiAKIAkvKiBJcyB0aGUgZGlmZmVyZW5jZSBiZWxvdyB0aGUgdGhyZXNob2xkPyAqLwotCWltYiA9IGRzdF9sb2FkICogc3JjX2NhcGFjaXR5ICogMTAwIC0KLQkgICAgICBzcmNfbG9hZCAqIGRzdF9jYXBhY2l0eSAqIGVudi0+aW1iYWxhbmNlX3BjdDsKKwlpbWIgPSBsb2FkX2EgKiBzcmNfY2FwYWNpdHkgKiAxMDAgLQorCQlsb2FkX2IgKiBkc3RfY2FwYWNpdHkgKiBlbnYtPmltYmFsYW5jZV9wY3Q7CiAJaWYgKGltYiA8PSAwKQogCQlyZXR1cm4gZmFsc2U7CiAKIAkvKgogCSAqIFRoZSBpbWJhbGFuY2UgaXMgYWJvdmUgdGhlIGFsbG93ZWQgdGhyZXNob2xkLgotCSAqIENvbXBhcmUgaXQgd2l0aCB0aGUgb2xkIGltYmFsYW5jZS4KKwkgKiBBbGxvdyBhIG1vdmUgdGhhdCBicmluZ3MgdXMgY2xvc2VyIHRvIGEgYmFsYW5jZWQgc2l0dWF0aW9uLAorCSAqIHdpdGhvdXQgbW92aW5nIHRoaW5ncyBwYXN0IHRoZSBwb2ludCBvZiBiYWxhbmNlLgogCSAqLwogCW9yaWdfc3JjX2xvYWQgPSBlbnYtPnNyY19zdGF0cy5sb2FkOwotCW9yaWdfZHN0X2xvYWQgPSBlbnYtPmRzdF9zdGF0cy5sb2FkOwogCi0JaWYgKG9yaWdfZHN0X2xvYWQgPCBvcmlnX3NyY19sb2FkKQotCQlzd2FwKG9yaWdfZHN0X2xvYWQsIG9yaWdfc3JjX2xvYWQpOworCS8qCisJICogSW4gYSB0YXNrIHN3YXAsIHRoZXJlIHdpbGwgYmUgb25lIGxvYWQgbW92aW5nIGZyb20gc3JjIHRvIGRzdCwKKwkgKiBhbmQgYW5vdGhlciBtb3ZpbmcgYmFjay4gVGhpcyBpcyB0aGUgbmV0IHN1bSBvZiBib3RoIG1vdmVzLgorCSAqIEEgc2ltcGxlIHRhc2sgbW92ZSB3aWxsIGFsd2F5cyBoYXZlIGEgcG9zaXRpdmUgdmFsdWUuCisJICogQWxsb3cgdGhlIG1vdmUgaWYgaXQgYnJpbmdzIHRoZSBzeXN0ZW0gY2xvc2VyIHRvIGEgYmFsYW5jZWQKKwkgKiBzaXR1YXRpb24sIHdpdGhvdXQgY3Jvc3Npbmcgb3ZlciB0aGUgYmFsYW5jZSBwb2ludC4KKwkgKi8KKwltb3ZlZF9sb2FkID0gb3JpZ19zcmNfbG9hZCAtIHNyY19sb2FkOwogCi0Jb2xkX2ltYiA9IG9yaWdfZHN0X2xvYWQgKiBzcmNfY2FwYWNpdHkgKiAxMDAgLQotCQkgIG9yaWdfc3JjX2xvYWQgKiBkc3RfY2FwYWNpdHkgKiBlbnYtPmltYmFsYW5jZV9wY3Q7Ci0KLQkvKiBXb3VsZCB0aGlzIGNoYW5nZSBtYWtlIHRoaW5ncyB3b3JzZT8gKi8KLQlyZXR1cm4gKGltYiA+IG9sZF9pbWIpOworCWlmIChtb3ZlZF9sb2FkID4gMCkKKwkJLyogTW92aW5nIHNyYyAtPiBkc3QuIERpZCB3ZSBvdmVyc2hvb3QgYmFsYW5jZT8gKi8KKwkJcmV0dXJuIHNyY19sb2FkICogZHN0X2NhcGFjaXR5IDwgZHN0X2xvYWQgKiBzcmNfY2FwYWNpdHk7CisJZWxzZQorCQkvKiBNb3ZpbmcgZHN0IC0+IHNyYy4gRGlkIHdlIG92ZXJzaG9vdCBiYWxhbmNlPyAqLworCQlyZXR1cm4gZHN0X2xvYWQgKiBzcmNfY2FwYWNpdHkgPCBzcmNfbG9hZCAqIGRzdF9jYXBhY2l0eTsKIH0KIAogLyoKQEAgLTE2MDksOSArMTYyMiwxMSBAQAogCS8qCiAJICogSWYgdGhlcmUgd2VyZSBubyByZWNvcmQgaGludGluZyBmYXVsdHMgdGhlbiBlaXRoZXIgdGhlIHRhc2sgaXMKIAkgKiBjb21wbGV0ZWx5IGlkbGUgb3IgYWxsIGFjdGl2aXR5IGlzIGFyZWFzIHRoYXQgYXJlIG5vdCBvZiBpbnRlcmVzdAotCSAqIHRvIGF1dG9tYXRpYyBudW1hIGJhbGFuY2luZy4gU2NhbiBzbG93ZXIKKwkgKiB0byBhdXRvbWF0aWMgbnVtYSBiYWxhbmNpbmcuIFJlbGF0ZWQgdG8gdGhhdCwgaWYgdGhlcmUgd2VyZSBmYWlsZWQKKwkgKiBtaWdyYXRpb24gdGhlbiBpdCBpbXBsaWVzIHdlIGFyZSBtaWdyYXRpbmcgdG9vIHF1aWNrbHkgb3IgdGhlIGxvY2FsCisJICogbm9kZSBpcyBvdmVybG9hZGVkLiBJbiBlaXRoZXIgY2FzZSwgc2NhbiBzbG93ZXIKIAkgKi8KLQlpZiAobG9jYWwgKyBzaGFyZWQgPT0gMCkgeworCWlmIChsb2NhbCArIHNoYXJlZCA9PSAwIHx8IHAtPm51bWFfZmF1bHRzX2xvY2FsaXR5WzJdKSB7CiAJCXAtPm51bWFfc2Nhbl9wZXJpb2QgPSBtaW4ocC0+bnVtYV9zY2FuX3BlcmlvZF9tYXgsCiAJCQlwLT5udW1hX3NjYW5fcGVyaW9kIDw8IDEpOwogCkBAIC0xNjczLDcgKzE2ODgsNyBAQAogCQkqcGVyaW9kID0gbm93IC0gcC0+bGFzdF90YXNrX251bWFfcGxhY2VtZW50OwogCX0gZWxzZSB7CiAJCWRlbHRhID0gcC0+c2UuYXZnLnJ1bm5hYmxlX2F2Z19zdW07Ci0JCSpwZXJpb2QgPSBwLT5zZS5hdmcucnVubmFibGVfYXZnX3BlcmlvZDsKKwkJKnBlcmlvZCA9IHAtPnNlLmF2Zy5hdmdfcGVyaW9kOwogCX0KIAogCXAtPmxhc3Rfc3VtX2V4ZWNfcnVudGltZSA9IHJ1bnRpbWU7CkBAIC0xNzYzLDYgKzE3NzgsOCBAQAogCQkJfQogCQl9CiAJCS8qIE5leHQgcm91bmQsIGV2YWx1YXRlIHRoZSBub2RlcyB3aXRoaW4gbWF4X2dyb3VwLiAqLworCQlpZiAoIW1heF9mYXVsdHMpCisJCQlicmVhazsKIAkJbm9kZXMgPSBtYXhfZ3JvdXA7CiAJfQogCXJldHVybiBuaWQ7CkBAIC0yMDgwLDYgKzIwOTcsOCBAQAogCiAJaWYgKG1pZ3JhdGVkKQogCQlwLT5udW1hX3BhZ2VzX21pZ3JhdGVkICs9IHBhZ2VzOworCWlmIChmbGFncyAmIFRORl9NSUdSQVRFX0ZBSUwpCisJCXAtPm51bWFfZmF1bHRzX2xvY2FsaXR5WzJdICs9IHBhZ2VzOwogCiAJcC0+bnVtYV9mYXVsdHNbdGFza19mYXVsdHNfaWR4KE5VTUFfTUVNQlVGLCBtZW1fbm9kZSwgcHJpdildICs9IHBhZ2VzOwogCXAtPm51bWFfZmF1bHRzW3Rhc2tfZmF1bHRzX2lkeChOVU1BX0NQVUJVRiwgY3B1X25vZGUsIHByaXYpXSArPSBwYWdlczsKQEAgLTIxNjEsOCArMjE4MCwxMCBAQAogCQl2bWEgPSBtbS0+bW1hcDsKIAl9CiAJZm9yICg7IHZtYTsgdm1hID0gdm1hLT52bV9uZXh0KSB7Ci0JCWlmICghdm1hX21pZ3JhdGFibGUodm1hKSB8fCAhdm1hX3BvbGljeV9tb2Yodm1hKSkKKwkJaWYgKCF2bWFfbWlncmF0YWJsZSh2bWEpIHx8ICF2bWFfcG9saWN5X21vZih2bWEpIHx8CisJCQlpc192bV9odWdldGxiX3BhZ2Uodm1hKSkgewogCQkJY29udGludWU7CisJCX0KIAogCQkvKgogCQkgKiBTaGFyZWQgbGlicmFyeSBwYWdlcyBtYXBwZWQgYnkgbXVsdGlwbGUgcHJvY2Vzc2VzIGFyZSBub3QKQEAgLTI0OTcsMTMgKzI1MTgsMTUgQEAKICAqICAgbG9hZF9hdmcgPSB1XzBgICsgeSoodV8wICsgdV8xKnkgKyB1XzIqeV4yICsgLi4uICkKICAqICAgICAgICAgICAgPSB1XzAgKyB1XzEqeSArIHVfMip5XjIgKyAuLi4gW3JlLWxhYmVsaW5nIHVfaSAtLT4gdV97aSsxfV0KICAqLwotc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX191cGRhdGVfZW50aXR5X3J1bm5hYmxlX2F2Zyh1NjQgbm93LAorc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgX191cGRhdGVfZW50aXR5X3J1bm5hYmxlX2F2Zyh1NjQgbm93LCBpbnQgY3B1LAogCQkJCQkJCXN0cnVjdCBzY2hlZF9hdmcgKnNhLAotCQkJCQkJCWludCBydW5uYWJsZSkKKwkJCQkJCQlpbnQgcnVubmFibGUsCisJCQkJCQkJaW50IHJ1bm5pbmcpCiB7CiAJdTY0IGRlbHRhLCBwZXJpb2RzOwogCXUzMiBydW5uYWJsZV9jb250cmliOwogCWludCBkZWx0YV93LCBkZWNheWVkID0gMDsKKwl1bnNpZ25lZCBsb25nIHNjYWxlX2ZyZXEgPSBhcmNoX3NjYWxlX2ZyZXFfY2FwYWNpdHkoTlVMTCwgY3B1KTsKIAogCWRlbHRhID0gbm93IC0gc2EtPmxhc3RfcnVubmFibGVfdXBkYXRlOwogCS8qCkBAIC0yNTI1LDcgKzI1NDgsNyBAQAogCXNhLT5sYXN0X3J1bm5hYmxlX3VwZGF0ZSA9IG5vdzsKIAogCS8qIGRlbHRhX3cgaXMgdGhlIGFtb3VudCBhbHJlYWR5IGFjY3VtdWxhdGVkIGFnYWluc3Qgb3VyIG5leHQgcGVyaW9kICovCi0JZGVsdGFfdyA9IHNhLT5ydW5uYWJsZV9hdmdfcGVyaW9kICUgMTAyNDsKKwlkZWx0YV93ID0gc2EtPmF2Z19wZXJpb2QgJSAxMDI0OwogCWlmIChkZWx0YSArIGRlbHRhX3cgPj0gMTAyNCkgewogCQkvKiBwZXJpb2Qgcm9sbC1vdmVyICovCiAJCWRlY2F5ZWQgPSAxOwpAQCAtMjUzOCw3ICsyNTYxLDEwIEBACiAJCWRlbHRhX3cgPSAxMDI0IC0gZGVsdGFfdzsKIAkJaWYgKHJ1bm5hYmxlKQogCQkJc2EtPnJ1bm5hYmxlX2F2Z19zdW0gKz0gZGVsdGFfdzsKLQkJc2EtPnJ1bm5hYmxlX2F2Z19wZXJpb2QgKz0gZGVsdGFfdzsKKwkJaWYgKHJ1bm5pbmcpCisJCQlzYS0+cnVubmluZ19hdmdfc3VtICs9IGRlbHRhX3cgKiBzY2FsZV9mcmVxCisJCQkJPj4gU0NIRURfQ0FQQUNJVFlfU0hJRlQ7CisJCXNhLT5hdmdfcGVyaW9kICs9IGRlbHRhX3c7CiAKIAkJZGVsdGEgLT0gZGVsdGFfdzsKIApAQCAtMjU0OCwyMCArMjU3NCwyOCBAQAogCiAJCXNhLT5ydW5uYWJsZV9hdmdfc3VtID0gZGVjYXlfbG9hZChzYS0+cnVubmFibGVfYXZnX3N1bSwKIAkJCQkJCSAgcGVyaW9kcyArIDEpOwotCQlzYS0+cnVubmFibGVfYXZnX3BlcmlvZCA9IGRlY2F5X2xvYWQoc2EtPnJ1bm5hYmxlX2F2Z19wZXJpb2QsCisJCXNhLT5ydW5uaW5nX2F2Z19zdW0gPSBkZWNheV9sb2FkKHNhLT5ydW5uaW5nX2F2Z19zdW0sCisJCQkJCQkgIHBlcmlvZHMgKyAxKTsKKwkJc2EtPmF2Z19wZXJpb2QgPSBkZWNheV9sb2FkKHNhLT5hdmdfcGVyaW9kLAogCQkJCQkJICAgICBwZXJpb2RzICsgMSk7CiAKIAkJLyogRWZmaWNpZW50bHkgY2FsY3VsYXRlIFxzdW0gKDEuLm5fcGVyaW9kKSAxMDI0KnleaSAqLwogCQlydW5uYWJsZV9jb250cmliID0gX19jb21wdXRlX3J1bm5hYmxlX2NvbnRyaWIocGVyaW9kcyk7CiAJCWlmIChydW5uYWJsZSkKIAkJCXNhLT5ydW5uYWJsZV9hdmdfc3VtICs9IHJ1bm5hYmxlX2NvbnRyaWI7Ci0JCXNhLT5ydW5uYWJsZV9hdmdfcGVyaW9kICs9IHJ1bm5hYmxlX2NvbnRyaWI7CisJCWlmIChydW5uaW5nKQorCQkJc2EtPnJ1bm5pbmdfYXZnX3N1bSArPSBydW5uYWJsZV9jb250cmliICogc2NhbGVfZnJlcQorCQkJCT4+IFNDSEVEX0NBUEFDSVRZX1NISUZUOworCQlzYS0+YXZnX3BlcmlvZCArPSBydW5uYWJsZV9jb250cmliOwogCX0KIAogCS8qIFJlbWFpbmRlciBvZiBkZWx0YSBhY2NydWVkIGFnYWluc3QgdV8wYCAqLwogCWlmIChydW5uYWJsZSkKIAkJc2EtPnJ1bm5hYmxlX2F2Z19zdW0gKz0gZGVsdGE7Ci0Jc2EtPnJ1bm5hYmxlX2F2Z19wZXJpb2QgKz0gZGVsdGE7CisJaWYgKHJ1bm5pbmcpCisJCXNhLT5ydW5uaW5nX2F2Z19zdW0gKz0gZGVsdGEgKiBzY2FsZV9mcmVxCisJCQk+PiBTQ0hFRF9DQVBBQ0lUWV9TSElGVDsKKwlzYS0+YXZnX3BlcmlvZCArPSBkZWx0YTsKIAogCXJldHVybiBkZWNheWVkOwogfQpAQCAtMjU3OCw2ICsyNjEyLDggQEAKIAkJcmV0dXJuIDA7CiAKIAlzZS0+YXZnLmxvYWRfYXZnX2NvbnRyaWIgPSBkZWNheV9sb2FkKHNlLT5hdmcubG9hZF9hdmdfY29udHJpYiwgZGVjYXlzKTsKKwlzZS0+YXZnLnV0aWxpemF0aW9uX2F2Z19jb250cmliID0KKwkJZGVjYXlfbG9hZChzZS0+YXZnLnV0aWxpemF0aW9uX2F2Z19jb250cmliLCBkZWNheXMpOwogCiAJcmV0dXJuIGRlY2F5czsKIH0KQEAgLTI2MTMsNyArMjY0OSw3IEBACiAKIAkvKiBUaGUgZnJhY3Rpb24gb2YgYSBjcHUgdXNlZCBieSB0aGlzIGNmc19ycSAqLwogCWNvbnRyaWIgPSBkaXZfdTY0KCh1NjQpc2EtPnJ1bm5hYmxlX2F2Z19zdW0gPDwgTklDRV8wX1NISUZULAotCQkJICBzYS0+cnVubmFibGVfYXZnX3BlcmlvZCArIDEpOworCQkJICBzYS0+YXZnX3BlcmlvZCArIDEpOwogCWNvbnRyaWIgLT0gY2ZzX3JxLT50Z19ydW5uYWJsZV9jb250cmliOwogCiAJaWYgKGFicyhjb250cmliKSA+IGNmc19ycS0+dGdfcnVubmFibGVfY29udHJpYiAvIDY0KSB7CkBAIC0yNjY2LDcgKzI3MDIsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3JxX3J1bm5hYmxlX2F2ZyhzdHJ1Y3QgcnEgKnJxLCBpbnQgcnVubmFibGUpCiB7Ci0JX191cGRhdGVfZW50aXR5X3J1bm5hYmxlX2F2ZyhycV9jbG9ja190YXNrKHJxKSwgJnJxLT5hdmcsIHJ1bm5hYmxlKTsKKwlfX3VwZGF0ZV9lbnRpdHlfcnVubmFibGVfYXZnKHJxX2Nsb2NrX3Rhc2socnEpLCBjcHVfb2YocnEpLCAmcnEtPmF2ZywKKwkJCXJ1bm5hYmxlLCBydW5uYWJsZSk7CiAJX191cGRhdGVfdGdfcnVubmFibGVfYXZnKCZycS0+YXZnLCAmcnEtPmNmcyk7CiB9CiAjZWxzZSAvKiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRCAqLwpAQCAtMjY4NCw3ICsyNzIxLDcgQEAKIAogCS8qIGF2b2lkIG92ZXJmbG93aW5nIGEgMzItYml0IHR5cGUgdy8gU0NIRURfTE9BRF9TQ0FMRSAqLwogCWNvbnRyaWIgPSBzZS0+YXZnLnJ1bm5hYmxlX2F2Z19zdW0gKiBzY2FsZV9sb2FkX2Rvd24oc2UtPmxvYWQud2VpZ2h0KTsKLQljb250cmliIC89IChzZS0+YXZnLnJ1bm5hYmxlX2F2Z19wZXJpb2QgKyAxKTsKKwljb250cmliIC89IChzZS0+YXZnLmF2Z19wZXJpb2QgKyAxKTsKIAlzZS0+YXZnLmxvYWRfYXZnX2NvbnRyaWIgPSBzY2FsZV9sb2FkKGNvbnRyaWIpOwogfQogCkBAIC0yNzAzLDYgKzI3NDAsMzAgQEAKIAlyZXR1cm4gc2UtPmF2Zy5sb2FkX2F2Z19jb250cmliIC0gb2xkX2NvbnRyaWI7CiB9CiAKKworc3RhdGljIGlubGluZSB2b2lkIF9fdXBkYXRlX3Rhc2tfZW50aXR5X3V0aWxpemF0aW9uKHN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlKQoreworCXUzMiBjb250cmliOworCisJLyogYXZvaWQgb3ZlcmZsb3dpbmcgYSAzMi1iaXQgdHlwZSB3LyBTQ0hFRF9MT0FEX1NDQUxFICovCisJY29udHJpYiA9IHNlLT5hdmcucnVubmluZ19hdmdfc3VtICogc2NhbGVfbG9hZF9kb3duKFNDSEVEX0xPQURfU0NBTEUpOworCWNvbnRyaWIgLz0gKHNlLT5hdmcuYXZnX3BlcmlvZCArIDEpOworCXNlLT5hdmcudXRpbGl6YXRpb25fYXZnX2NvbnRyaWIgPSBzY2FsZV9sb2FkKGNvbnRyaWIpOworfQorCitzdGF0aWMgbG9uZyBfX3VwZGF0ZV9lbnRpdHlfdXRpbGl6YXRpb25fYXZnX2NvbnRyaWIoc3RydWN0IHNjaGVkX2VudGl0eSAqc2UpCit7CisJbG9uZyBvbGRfY29udHJpYiA9IHNlLT5hdmcudXRpbGl6YXRpb25fYXZnX2NvbnRyaWI7CisKKwlpZiAoZW50aXR5X2lzX3Rhc2soc2UpKQorCQlfX3VwZGF0ZV90YXNrX2VudGl0eV91dGlsaXphdGlvbihzZSk7CisJZWxzZQorCQlzZS0+YXZnLnV0aWxpemF0aW9uX2F2Z19jb250cmliID0KKwkJCQkJZ3JvdXBfY2ZzX3JxKHNlKS0+dXRpbGl6YXRpb25fbG9hZF9hdmc7CisKKwlyZXR1cm4gc2UtPmF2Zy51dGlsaXphdGlvbl9hdmdfY29udHJpYiAtIG9sZF9jb250cmliOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc3VidHJhY3RfYmxvY2tlZF9sb2FkX2NvbnRyaWIoc3RydWN0IGNmc19ycSAqY2ZzX3JxLAogCQkJCQkJIGxvbmcgbG9hZF9jb250cmliKQogewpAQCAtMjcxOSw3ICsyNzgwLDggQEAKIAkJCQkJICBpbnQgdXBkYXRlX2Nmc19ycSkKIHsKIAlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSBjZnNfcnFfb2Yoc2UpOwotCWxvbmcgY29udHJpYl9kZWx0YTsKKwlsb25nIGNvbnRyaWJfZGVsdGEsIHV0aWxpemF0aW9uX2RlbHRhOworCWludCBjcHUgPSBjcHVfb2YocnFfb2YoY2ZzX3JxKSk7CiAJdTY0IG5vdzsKIAogCS8qCkBAIC0yNzMxLDE4ICsyNzkzLDIyIEBACiAJZWxzZQogCQlub3cgPSBjZnNfcnFfY2xvY2tfdGFzayhncm91cF9jZnNfcnEoc2UpKTsKIAotCWlmICghX191cGRhdGVfZW50aXR5X3J1bm5hYmxlX2F2Zyhub3csICZzZS0+YXZnLCBzZS0+b25fcnEpKQorCWlmICghX191cGRhdGVfZW50aXR5X3J1bm5hYmxlX2F2Zyhub3csIGNwdSwgJnNlLT5hdmcsIHNlLT5vbl9ycSwKKwkJCQkJY2ZzX3JxLT5jdXJyID09IHNlKSkKIAkJcmV0dXJuOwogCiAJY29udHJpYl9kZWx0YSA9IF9fdXBkYXRlX2VudGl0eV9sb2FkX2F2Z19jb250cmliKHNlKTsKKwl1dGlsaXphdGlvbl9kZWx0YSA9IF9fdXBkYXRlX2VudGl0eV91dGlsaXphdGlvbl9hdmdfY29udHJpYihzZSk7CiAKIAlpZiAoIXVwZGF0ZV9jZnNfcnEpCiAJCXJldHVybjsKIAotCWlmIChzZS0+b25fcnEpCisJaWYgKHNlLT5vbl9ycSkgewogCQljZnNfcnEtPnJ1bm5hYmxlX2xvYWRfYXZnICs9IGNvbnRyaWJfZGVsdGE7Ci0JZWxzZQorCQljZnNfcnEtPnV0aWxpemF0aW9uX2xvYWRfYXZnICs9IHV0aWxpemF0aW9uX2RlbHRhOworCX0gZWxzZSB7CiAJCXN1YnRyYWN0X2Jsb2NrZWRfbG9hZF9jb250cmliKGNmc19ycSwgLWNvbnRyaWJfZGVsdGEpOworCX0KIH0KIAogLyoKQEAgLTI4MTcsNiArMjg4Myw3IEBACiAJfQogCiAJY2ZzX3JxLT5ydW5uYWJsZV9sb2FkX2F2ZyArPSBzZS0+YXZnLmxvYWRfYXZnX2NvbnRyaWI7CisJY2ZzX3JxLT51dGlsaXphdGlvbl9sb2FkX2F2ZyArPSBzZS0+YXZnLnV0aWxpemF0aW9uX2F2Z19jb250cmliOwogCS8qIHdlIGZvcmNlIHVwZGF0ZSBjb25zaWRlcmF0aW9uIG9uIGxvYWQtYmFsYW5jZXIgbW92ZXMgKi8KIAl1cGRhdGVfY2ZzX3JxX2Jsb2NrZWRfbG9hZChjZnNfcnEsICF3YWtldXApOwogfQpAQCAtMjgzNSw2ICsyOTAyLDcgQEAKIAl1cGRhdGVfY2ZzX3JxX2Jsb2NrZWRfbG9hZChjZnNfcnEsICFzbGVlcCk7CiAKIAljZnNfcnEtPnJ1bm5hYmxlX2xvYWRfYXZnIC09IHNlLT5hdmcubG9hZF9hdmdfY29udHJpYjsKKwljZnNfcnEtPnV0aWxpemF0aW9uX2xvYWRfYXZnIC09IHNlLT5hdmcudXRpbGl6YXRpb25fYXZnX2NvbnRyaWI7CiAJaWYgKHNsZWVwKSB7CiAJCWNmc19ycS0+YmxvY2tlZF9sb2FkX2F2ZyArPSBzZS0+YXZnLmxvYWRfYXZnX2NvbnRyaWI7CiAJCXNlLT5hdmcuZGVjYXlfY291bnQgPSBhdG9taWM2NF9yZWFkKCZjZnNfcnEtPmRlY2F5X2NvdW50ZXIpOwpAQCAtMzE3Miw2ICszMjQwLDcgQEAKIAkJICovCiAJCXVwZGF0ZV9zdGF0c193YWl0X2VuZChjZnNfcnEsIHNlKTsKIAkJX19kZXF1ZXVlX2VudGl0eShjZnNfcnEsIHNlKTsKKwkJdXBkYXRlX2VudGl0eV9sb2FkX2F2ZyhzZSwgMSk7CiAJfQogCiAJdXBkYXRlX3N0YXRzX2N1cnJfc3RhcnQoY2ZzX3JxLCBzZSk7CkBAIC00Mjk4LDYgKzQzNjcsMTEgQEAKIAlyZXR1cm4gY3B1X3JxKGNwdSktPmNwdV9jYXBhY2l0eTsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FwYWNpdHlfb3JpZ19vZihpbnQgY3B1KQoreworCXJldHVybiBjcHVfcnEoY3B1KS0+Y3B1X2NhcGFjaXR5X29yaWc7Cit9CisKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGNwdV9hdmdfbG9hZF9wZXJfdGFzayhpbnQgY3B1KQogewogCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKQEAgLTQ3MTEsNiArNDc4NSwzMyBAQAogZG9uZToKIAlyZXR1cm4gdGFyZ2V0OwogfQorLyoKKyAqIGdldF9jcHVfdXNhZ2UgcmV0dXJucyB0aGUgYW1vdW50IG9mIGNhcGFjaXR5IG9mIGEgQ1BVIHRoYXQgaXMgdXNlZCBieSBDRlMKKyAqIHRhc2tzLiBUaGUgdW5pdCBvZiB0aGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgdGhlIG9uZSBvZiBjYXBhY2l0eSBzbyB3ZSBjYW4KKyAqIGNvbXBhcmUgdGhlIHVzYWdlIHdpdGggdGhlIGNhcGFjaXR5IG9mIHRoZSBDUFUgdGhhdCBpcyBhdmFpbGFibGUgZm9yIENGUworICogdGFzayAoaWUgY3B1X2NhcGFjaXR5KS4KKyAqIGNmcy51dGlsaXphdGlvbl9sb2FkX2F2ZyBpcyB0aGUgc3VtIG9mIHJ1bm5pbmcgdGltZSBvZiBydW5uYWJsZSB0YXNrcyBvbiBhCisgKiBDUFUuIEl0IHJlcHJlc2VudHMgdGhlIGFtb3VudCBvZiB1dGlsaXphdGlvbiBvZiBhIENQVSBpbiB0aGUgcmFuZ2UKKyAqIFswLi5TQ0hFRF9MT0FEX1NDQUxFXS4gIFRoZSB1c2FnZSBvZiBhIENQVSBjYW4ndCBiZSBoaWdoZXIgdGhhbiB0aGUgZnVsbAorICogY2FwYWNpdHkgb2YgdGhlIENQVSBiZWNhdXNlIGl0J3MgYWJvdXQgdGhlIHJ1bm5pbmcgdGltZSBvbiB0aGlzIENQVS4KKyAqIE5ldmVydGhlbGVzcywgY2ZzLnV0aWxpemF0aW9uX2xvYWRfYXZnIGNhbiBiZSBoaWdoZXIgdGhhbiBTQ0hFRF9MT0FEX1NDQUxFCisgKiBiZWNhdXNlIG9mIHVuZm9ydHVuYXRlIHJvdW5kaW5nIGluIGF2Z19wZXJpb2QgYW5kIHJ1bm5pbmdfbG9hZF9hdmcgb3IganVzdAorICogYWZ0ZXIgbWlncmF0aW5nIHRhc2tzIHVudGlsIHRoZSBhdmVyYWdlIHN0YWJpbGl6ZXMgd2l0aCB0aGUgbmV3IHJ1bm5pbmcKKyAqIHRpbWUuIFNvIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgdXNhZ2Ugc3RheXMgaW50byB0aGUgcmFuZ2UKKyAqIFswLi5jcHVfY2FwYWNpdHlfb3JpZ10gYW5kIGNhcCBpZiBuZWNlc3NhcnkuCisgKiBXaXRob3V0IGNhcHBpbmcgdGhlIHVzYWdlLCBhIGdyb3VwIGNvdWxkIGJlIHNlZW4gYXMgb3ZlcmxvYWRlZCAoQ1BVMCB1c2FnZQorICogYXQgMTIxJSArIENQVTEgdXNhZ2UgYXQgODAlKSB3aGVyZWFzIENQVTEgaGFzIDIwJSBvZiBhdmFpbGFibGUgY2FwYWNpdHkKKyAqLworc3RhdGljIGludCBnZXRfY3B1X3VzYWdlKGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyB1c2FnZSA9IGNwdV9ycShjcHUpLT5jZnMudXRpbGl6YXRpb25fbG9hZF9hdmc7CisJdW5zaWduZWQgbG9uZyBjYXBhY2l0eSA9IGNhcGFjaXR5X29yaWdfb2YoY3B1KTsKKworCWlmICh1c2FnZSA+PSBTQ0hFRF9MT0FEX1NDQUxFKQorCQlyZXR1cm4gY2FwYWNpdHk7CisKKwlyZXR1cm4gKHVzYWdlICogY2FwYWNpdHkpID4+IFNDSEVEX0xPQURfU0hJRlQ7Cit9CiAKIC8qCiAgKiBzZWxlY3RfdGFza19ycV9mYWlyOiBTZWxlY3QgdGFyZ2V0IHJ1bnF1ZXVlIGZvciB0aGUgd2FraW5nIHRhc2sgaW4gZG9tYWlucwpAQCAtNTgzNywxMiArNTkzOCwxMiBAQAogCXVuc2lnbmVkIGxvbmcgc3VtX3dlaWdodGVkX2xvYWQ7IC8qIFdlaWdodGVkIGxvYWQgb2YgZ3JvdXAncyB0YXNrcyAqLwogCXVuc2lnbmVkIGxvbmcgbG9hZF9wZXJfdGFzazsKIAl1bnNpZ25lZCBsb25nIGdyb3VwX2NhcGFjaXR5OworCXVuc2lnbmVkIGxvbmcgZ3JvdXBfdXNhZ2U7IC8qIFRvdGFsIHVzYWdlIG9mIHRoZSBncm91cCAqLwogCXVuc2lnbmVkIGludCBzdW1fbnJfcnVubmluZzsgLyogTnIgdGFza3MgcnVubmluZyBpbiB0aGUgZ3JvdXAgKi8KLQl1bnNpZ25lZCBpbnQgZ3JvdXBfY2FwYWNpdHlfZmFjdG9yOwogCXVuc2lnbmVkIGludCBpZGxlX2NwdXM7CiAJdW5zaWduZWQgaW50IGdyb3VwX3dlaWdodDsKIAllbnVtIGdyb3VwX3R5cGUgZ3JvdXBfdHlwZTsKLQlpbnQgZ3JvdXBfaGFzX2ZyZWVfY2FwYWNpdHk7CisJaW50IGdyb3VwX25vX2NhcGFjaXR5OwogI2lmZGVmIENPTkZJR19OVU1BX0JBTEFOQ0lORwogCXVuc2lnbmVkIGludCBucl9udW1hX3J1bm5pbmc7CiAJdW5zaWduZWQgaW50IG5yX3ByZWZlcnJlZF9ydW5uaW5nOwpAQCAtNTkxMywxNiArNjAxNCw2IEBACiAJcmV0dXJuIGxvYWRfaWR4OwogfQogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0X3NjYWxlX2NhcGFjaXR5KHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQotewotCXJldHVybiBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRTsKLX0KLQotdW5zaWduZWQgbG9uZyBfX3dlYWsgYXJjaF9zY2FsZV9mcmVxX2NhcGFjaXR5KHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQotewotCXJldHVybiBkZWZhdWx0X3NjYWxlX2NhcGFjaXR5KHNkLCBjcHUpOwotfQotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0X3NjYWxlX2NwdV9jYXBhY2l0eShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKIHsKIAlpZiAoKHNkLT5mbGFncyAmIFNEX1NIQVJFX0NQVUNBUEFDSVRZKSAmJiAoc2QtPnNwYW5fd2VpZ2h0ID4gMSkpCkBAIC01OTM5LDcgKzYwMzAsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc2NhbGVfcnRfY2FwYWNpdHkoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7Ci0JdTY0IHRvdGFsLCBhdmFpbGFibGUsIGFnZV9zdGFtcCwgYXZnOworCXU2NCB0b3RhbCwgdXNlZCwgYWdlX3N0YW1wLCBhdmc7CiAJczY0IGRlbHRhOwogCiAJLyoKQEAgLTU5NTUsMTkgKzYwNDYsMTIgQEAKIAogCXRvdGFsID0gc2NoZWRfYXZnX3BlcmlvZCgpICsgZGVsdGE7CiAKLQlpZiAodW5saWtlbHkodG90YWwgPCBhdmcpKSB7Ci0JCS8qIEVuc3VyZXMgdGhhdCBjYXBhY2l0eSB3b24ndCBlbmQgdXAgYmVpbmcgbmVnYXRpdmUgKi8KLQkJYXZhaWxhYmxlID0gMDsKLQl9IGVsc2UgewotCQlhdmFpbGFibGUgPSB0b3RhbCAtIGF2ZzsKLQl9CisJdXNlZCA9IGRpdl91NjQoYXZnLCB0b3RhbCk7CiAKLQlpZiAodW5saWtlbHkoKHM2NCl0b3RhbCA8IFNDSEVEX0NBUEFDSVRZX1NDQUxFKSkKLQkJdG90YWwgPSBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRTsKKwlpZiAobGlrZWx5KHVzZWQgPCBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSkpCisJCXJldHVybiBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSAtIHVzZWQ7CiAKLQl0b3RhbCA+Pj0gU0NIRURfQ0FQQUNJVFlfU0hJRlQ7Ci0KLQlyZXR1cm4gZGl2X3U2NChhdmFpbGFibGUsIHRvdGFsKTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIHZvaWQgdXBkYXRlX2NwdV9jYXBhY2l0eShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKQEAgLTU5ODIsMTQgKzYwNjYsNyBAQAogCiAJY2FwYWNpdHkgPj49IFNDSEVEX0NBUEFDSVRZX1NISUZUOwogCi0Jc2RnLT5zZ2MtPmNhcGFjaXR5X29yaWcgPSBjYXBhY2l0eTsKLQotCWlmIChzY2hlZF9mZWF0KEFSQ0hfQ0FQQUNJVFkpKQotCQljYXBhY2l0eSAqPSBhcmNoX3NjYWxlX2ZyZXFfY2FwYWNpdHkoc2QsIGNwdSk7Ci0JZWxzZQotCQljYXBhY2l0eSAqPSBkZWZhdWx0X3NjYWxlX2NhcGFjaXR5KHNkLCBjcHUpOwotCi0JY2FwYWNpdHkgPj49IFNDSEVEX0NBUEFDSVRZX1NISUZUOworCWNwdV9ycShjcHUpLT5jcHVfY2FwYWNpdHlfb3JpZyA9IGNhcGFjaXR5OwogCiAJY2FwYWNpdHkgKj0gc2NhbGVfcnRfY2FwYWNpdHkoY3B1KTsKIAljYXBhY2l0eSA+Pj0gU0NIRURfQ0FQQUNJVFlfU0hJRlQ7CkBAIC02MDA1LDcgKzYwODIsNyBAQAogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKmNoaWxkID0gc2QtPmNoaWxkOwogCXN0cnVjdCBzY2hlZF9ncm91cCAqZ3JvdXAsICpzZGcgPSBzZC0+Z3JvdXBzOwotCXVuc2lnbmVkIGxvbmcgY2FwYWNpdHksIGNhcGFjaXR5X29yaWc7CisJdW5zaWduZWQgbG9uZyBjYXBhY2l0eTsKIAl1bnNpZ25lZCBsb25nIGludGVydmFsOwogCiAJaW50ZXJ2YWwgPSBtc2Vjc190b19qaWZmaWVzKHNkLT5iYWxhbmNlX2ludGVydmFsKTsKQEAgLTYwMTcsNyArNjA5NCw3IEBACiAJCXJldHVybjsKIAl9CiAKLQljYXBhY2l0eV9vcmlnID0gY2FwYWNpdHkgPSAwOworCWNhcGFjaXR5ID0gMDsKIAogCWlmIChjaGlsZC0+ZmxhZ3MgJiBTRF9PVkVSTEFQKSB7CiAJCS8qCkBAIC02MDM3LDE5ICs2MTE0LDE1IEBACiAJCQkgKiBVc2UgY2FwYWNpdHlfb2YoKSwgd2hpY2ggaXMgc2V0IGlycmVzcGVjdGl2ZSBvZiBkb21haW5zCiAJCQkgKiBpbiB1cGRhdGVfY3B1X2NhcGFjaXR5KCkuCiAJCQkgKgotCQkJICogVGhpcyBhdm9pZHMgY2FwYWNpdHkvY2FwYWNpdHlfb3JpZyBmcm9tIGJlaW5nIDAgYW5kCisJCQkgKiBUaGlzIGF2b2lkcyBjYXBhY2l0eSBmcm9tIGJlaW5nIDAgYW5kCiAJCQkgKiBjYXVzaW5nIGRpdmlkZS1ieS16ZXJvIGlzc3VlcyBvbiBib290LgotCQkJICoKLQkJCSAqIFJ1bnRpbWUgdXBkYXRlcyB3aWxsIGNvcnJlY3QgY2FwYWNpdHlfb3JpZy4KIAkJCSAqLwogCQkJaWYgKHVubGlrZWx5KCFycS0+c2QpKSB7Ci0JCQkJY2FwYWNpdHlfb3JpZyArPSBjYXBhY2l0eV9vZihjcHUpOwogCQkJCWNhcGFjaXR5ICs9IGNhcGFjaXR5X29mKGNwdSk7CiAJCQkJY29udGludWU7CiAJCQl9CiAKIAkJCXNnYyA9IHJxLT5zZC0+Z3JvdXBzLT5zZ2M7Ci0JCQljYXBhY2l0eV9vcmlnICs9IHNnYy0+Y2FwYWNpdHlfb3JpZzsKIAkJCWNhcGFjaXR5ICs9IHNnYy0+Y2FwYWNpdHk7CiAJCX0KIAl9IGVsc2UgIHsKQEAgLTYwNjAsMzkgKzYxMzMsMjQgQEAKIAogCQlncm91cCA9IGNoaWxkLT5ncm91cHM7CiAJCWRvIHsKLQkJCWNhcGFjaXR5X29yaWcgKz0gZ3JvdXAtPnNnYy0+Y2FwYWNpdHlfb3JpZzsKIAkJCWNhcGFjaXR5ICs9IGdyb3VwLT5zZ2MtPmNhcGFjaXR5OwogCQkJZ3JvdXAgPSBncm91cC0+bmV4dDsKIAkJfSB3aGlsZSAoZ3JvdXAgIT0gY2hpbGQtPmdyb3Vwcyk7CiAJfQogCi0Jc2RnLT5zZ2MtPmNhcGFjaXR5X29yaWcgPSBjYXBhY2l0eV9vcmlnOwogCXNkZy0+c2djLT5jYXBhY2l0eSA9IGNhcGFjaXR5OwogfQogCiAvKgotICogVHJ5IGFuZCBmaXggdXAgY2FwYWNpdHkgZm9yIHRpbnkgc2libGluZ3MsIHRoaXMgaXMgbmVlZGVkIHdoZW4KLSAqIHRoaW5ncyBsaWtlIFNEX0FTWU1fUEFDS0lORyBuZWVkIGZfYl9nIHRvIHNlbGVjdCBhbm90aGVyIHNpYmxpbmcKLSAqIHdoaWNoIG9uIGl0cyBvd24gaXNuJ3QgcG93ZXJmdWwgZW5vdWdoLgotICoKLSAqIFNlZSB1cGRhdGVfc2RfcGlja19idXNpZXN0KCkgYW5kIGNoZWNrX2FzeW1fcGFja2luZygpLgorICogQ2hlY2sgd2hldGhlciB0aGUgY2FwYWNpdHkgb2YgdGhlIHJxIGhhcyBiZWVuIG5vdGljZWFibHkgcmVkdWNlZCBieSBzaWRlCisgKiBhY3Rpdml0eS4gVGhlIGltYmFsYW5jZV9wY3QgaXMgdXNlZCBmb3IgdGhlIHRocmVzaG9sZC4KKyAqIFJldHVybiB0cnVlIGlzIHRoZSBjYXBhY2l0eSBpcyByZWR1Y2VkCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50Ci1maXhfc21hbGxfY2FwYWNpdHkoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIHN0cnVjdCBzY2hlZF9ncm91cCAqZ3JvdXApCitjaGVja19jcHVfY2FwYWNpdHkoc3RydWN0IHJxICpycSwgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCiB7Ci0JLyoKLQkgKiBPbmx5IHNpYmxpbmdzIGNhbiBoYXZlIHNpZ25pZmljYW50bHkgbGVzcyB0aGFuIFNDSEVEX0NBUEFDSVRZX1NDQUxFCi0JICovCi0JaWYgKCEoc2QtPmZsYWdzICYgU0RfU0hBUkVfQ1BVQ0FQQUNJVFkpKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogSWYgfjkwJSBvZiB0aGUgY3B1X2NhcGFjaXR5IGlzIHN0aWxsIHRoZXJlLCB3ZSdyZSBnb29kLgotCSAqLwotCWlmIChncm91cC0+c2djLT5jYXBhY2l0eSAqIDMyID4gZ3JvdXAtPnNnYy0+Y2FwYWNpdHlfb3JpZyAqIDI5KQotCQlyZXR1cm4gMTsKLQotCXJldHVybiAwOworCXJldHVybiAoKHJxLT5jcHVfY2FwYWNpdHkgKiBzZC0+aW1iYWxhbmNlX3BjdCkgPAorCQkJCShycS0+Y3B1X2NhcGFjaXR5X29yaWcgKiAxMDApKTsKIH0KIAogLyoKQEAgLTYxMzAsMzcgKzYxODgsNTYgQEAKIH0KIAogLyoKLSAqIENvbXB1dGUgdGhlIGdyb3VwIGNhcGFjaXR5IGZhY3Rvci4KLSAqCi0gKiBBdm9pZCB0aGUgaXNzdWUgd2hlcmUgTipmcmFjKHNtdF9jYXBhY2l0eSkgPj0gMSBjcmVhdGVzICdwaGFudG9tJyBjb3JlcyBieQotICogZmlyc3QgZGl2aWRpbmcgb3V0IHRoZSBzbXQgZmFjdG9yIGFuZCBjb21wdXRpbmcgdGhlIGFjdHVhbCBudW1iZXIgb2YgY29yZXMKLSAqIGFuZCBsaW1pdCB1bml0IGNhcGFjaXR5IHdpdGggdGhhdC4KKyAqIGdyb3VwX2hhc19jYXBhY2l0eSByZXR1cm5zIHRydWUgaWYgdGhlIGdyb3VwIGhhcyBzcGFyZSBjYXBhY2l0eSB0aGF0IGNvdWxkCisgKiBiZSB1c2VkIGJ5IHNvbWUgdGFza3MuCisgKiBXZSBjb25zaWRlciB0aGF0IGEgZ3JvdXAgaGFzIHNwYXJlIGNhcGFjaXR5IGlmIHRoZSAgKiBudW1iZXIgb2YgdGFzayBpcworICogc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgQ1BVcyBvciBpZiB0aGUgdXNhZ2UgaXMgbG93ZXIgdGhhbiB0aGUgYXZhaWxhYmxlCisgKiBjYXBhY2l0eSBmb3IgQ0ZTIHRhc2tzLgorICogRm9yIHRoZSBsYXR0ZXIsIHdlIHVzZSBhIHRocmVzaG9sZCB0byBzdGFiaWxpemUgdGhlIHN0YXRlLCB0byB0YWtlIGludG8KKyAqIGFjY291bnQgdGhlIHZhcmlhbmNlIG9mIHRoZSB0YXNrcycgbG9hZCBhbmQgdG8gcmV0dXJuIHRydWUgaWYgdGhlIGF2YWlsYWJsZQorICogY2FwYWNpdHkgaW4gbWVhbmluZ2Z1bCBmb3IgdGhlIGxvYWQgYmFsYW5jZXIuCisgKiBBcyBhbiBleGFtcGxlLCBhbiBhdmFpbGFibGUgY2FwYWNpdHkgb2YgMSUgY2FuIGFwcGVhciBidXQgaXQgZG9lc24ndCBtYWtlCisgKiBhbnkgYmVuZWZpdCBmb3IgdGhlIGxvYWQgYmFsYW5jZS4KICAqLwotc3RhdGljIGlubGluZSBpbnQgc2dfY2FwYWNpdHlfZmFjdG9yKHN0cnVjdCBsYl9lbnYgKmVudiwgc3RydWN0IHNjaGVkX2dyb3VwICpncm91cCkKK3N0YXRpYyBpbmxpbmUgYm9vbAorZ3JvdXBfaGFzX2NhcGFjaXR5KHN0cnVjdCBsYl9lbnYgKmVudiwgc3RydWN0IHNnX2xiX3N0YXRzICpzZ3MpCiB7Ci0JdW5zaWduZWQgaW50IGNhcGFjaXR5X2ZhY3Rvciwgc210LCBjcHVzOwotCXVuc2lnbmVkIGludCBjYXBhY2l0eSwgY2FwYWNpdHlfb3JpZzsKKwlpZiAoc2dzLT5zdW1fbnJfcnVubmluZyA8IHNncy0+Z3JvdXBfd2VpZ2h0KQorCQlyZXR1cm4gdHJ1ZTsKIAotCWNhcGFjaXR5ID0gZ3JvdXAtPnNnYy0+Y2FwYWNpdHk7Ci0JY2FwYWNpdHlfb3JpZyA9IGdyb3VwLT5zZ2MtPmNhcGFjaXR5X29yaWc7Ci0JY3B1cyA9IGdyb3VwLT5ncm91cF93ZWlnaHQ7CisJaWYgKChzZ3MtPmdyb3VwX2NhcGFjaXR5ICogMTAwKSA+CisJCQkoc2dzLT5ncm91cF91c2FnZSAqIGVudi0+c2QtPmltYmFsYW5jZV9wY3QpKQorCQlyZXR1cm4gdHJ1ZTsKIAotCS8qIHNtdCA6PSBjZWlsKGNwdXMgLyBjYXBhY2l0eSksIGFzc3VtZXM6IDEgPCBzbXRfY2FwYWNpdHkgPCAyICovCi0Jc210ID0gRElWX1JPVU5EX1VQKFNDSEVEX0NBUEFDSVRZX1NDQUxFICogY3B1cywgY2FwYWNpdHlfb3JpZyk7Ci0JY2FwYWNpdHlfZmFjdG9yID0gY3B1cyAvIHNtdDsgLyogY29yZXMgKi8KLQotCWNhcGFjaXR5X2ZhY3RvciA9IG1pbl90KHVuc2lnbmVkLAotCQljYXBhY2l0eV9mYWN0b3IsIERJVl9ST1VORF9DTE9TRVNUKGNhcGFjaXR5LCBTQ0hFRF9DQVBBQ0lUWV9TQ0FMRSkpOwotCWlmICghY2FwYWNpdHlfZmFjdG9yKQotCQljYXBhY2l0eV9mYWN0b3IgPSBmaXhfc21hbGxfY2FwYWNpdHkoZW52LT5zZCwgZ3JvdXApOwotCi0JcmV0dXJuIGNhcGFjaXR5X2ZhY3RvcjsKKwlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBlbnVtIGdyb3VwX3R5cGUKLWdyb3VwX2NsYXNzaWZ5KHN0cnVjdCBzY2hlZF9ncm91cCAqZ3JvdXAsIHN0cnVjdCBzZ19sYl9zdGF0cyAqc2dzKQorLyoKKyAqICBncm91cF9pc19vdmVybG9hZGVkIHJldHVybnMgdHJ1ZSBpZiB0aGUgZ3JvdXAgaGFzIG1vcmUgdGFza3MgdGhhbiBpdCBjYW4KKyAqICBoYW5kbGUuCisgKiAgZ3JvdXBfaXNfb3ZlcmxvYWRlZCBpcyBub3QgZXF1YWxzIHRvICFncm91cF9oYXNfY2FwYWNpdHkgYmVjYXVzZSBhIGdyb3VwCisgKiAgd2l0aCB0aGUgZXhhY3QgcmlnaHQgbnVtYmVyIG9mIHRhc2tzLCBoYXMgbm8gbW9yZSBzcGFyZSBjYXBhY2l0eSBidXQgaXMgbm90CisgKiAgb3ZlcmxvYWRlZCBzbyBib3RoIGdyb3VwX2hhc19jYXBhY2l0eSBhbmQgZ3JvdXBfaXNfb3ZlcmxvYWRlZCByZXR1cm4KKyAqICBmYWxzZS4KKyAqLworc3RhdGljIGlubGluZSBib29sCitncm91cF9pc19vdmVybG9hZGVkKHN0cnVjdCBsYl9lbnYgKmVudiwgc3RydWN0IHNnX2xiX3N0YXRzICpzZ3MpCiB7Ci0JaWYgKHNncy0+c3VtX25yX3J1bm5pbmcgPiBzZ3MtPmdyb3VwX2NhcGFjaXR5X2ZhY3RvcikKKwlpZiAoc2dzLT5zdW1fbnJfcnVubmluZyA8PSBzZ3MtPmdyb3VwX3dlaWdodCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKChzZ3MtPmdyb3VwX2NhcGFjaXR5ICogMTAwKSA8CisJCQkoc2dzLT5ncm91cF91c2FnZSAqIGVudi0+c2QtPmltYmFsYW5jZV9wY3QpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGVudW0gZ3JvdXBfdHlwZSBncm91cF9jbGFzc2lmeShzdHJ1Y3QgbGJfZW52ICplbnYsCisJCXN0cnVjdCBzY2hlZF9ncm91cCAqZ3JvdXAsCisJCXN0cnVjdCBzZ19sYl9zdGF0cyAqc2dzKQoreworCWlmIChzZ3MtPmdyb3VwX25vX2NhcGFjaXR5KQogCQlyZXR1cm4gZ3JvdXBfb3ZlcmxvYWRlZDsKIAogCWlmIChzZ19pbWJhbGFuY2VkKGdyb3VwKSkKQEAgLTYxOTgsNiArNjI3NSw3IEBACiAJCQlsb2FkID0gc291cmNlX2xvYWQoaSwgbG9hZF9pZHgpOwogCiAJCXNncy0+Z3JvdXBfbG9hZCArPSBsb2FkOworCQlzZ3MtPmdyb3VwX3VzYWdlICs9IGdldF9jcHVfdXNhZ2UoaSk7CiAJCXNncy0+c3VtX25yX3J1bm5pbmcgKz0gcnEtPmNmcy5oX25yX3J1bm5pbmc7CiAKIAkJaWYgKHJxLT5ucl9ydW5uaW5nID4gMSkKQEAgLTYyMjAsMTEgKzYyOTgsOSBAQAogCQlzZ3MtPmxvYWRfcGVyX3Rhc2sgPSBzZ3MtPnN1bV93ZWlnaHRlZF9sb2FkIC8gc2dzLT5zdW1fbnJfcnVubmluZzsKIAogCXNncy0+Z3JvdXBfd2VpZ2h0ID0gZ3JvdXAtPmdyb3VwX3dlaWdodDsKLQlzZ3MtPmdyb3VwX2NhcGFjaXR5X2ZhY3RvciA9IHNnX2NhcGFjaXR5X2ZhY3RvcihlbnYsIGdyb3VwKTsKLQlzZ3MtPmdyb3VwX3R5cGUgPSBncm91cF9jbGFzc2lmeShncm91cCwgc2dzKTsKIAotCWlmIChzZ3MtPmdyb3VwX2NhcGFjaXR5X2ZhY3RvciA+IHNncy0+c3VtX25yX3J1bm5pbmcpCi0JCXNncy0+Z3JvdXBfaGFzX2ZyZWVfY2FwYWNpdHkgPSAxOworCXNncy0+Z3JvdXBfbm9fY2FwYWNpdHkgPSBncm91cF9pc19vdmVybG9hZGVkKGVudiwgc2dzKTsKKwlzZ3MtPmdyb3VwX3R5cGUgPSBncm91cF9jbGFzc2lmeShlbnYsIGdyb3VwLCBzZ3MpOwogfQogCiAvKioKQEAgLTYzNDYsMTggKzY0MjIsMTkgQEAKIAogCQkvKgogCQkgKiBJbiBjYXNlIHRoZSBjaGlsZCBkb21haW4gcHJlZmVycyB0YXNrcyBnbyB0byBzaWJsaW5ncwotCQkgKiBmaXJzdCwgbG93ZXIgdGhlIHNnIGNhcGFjaXR5IGZhY3RvciB0byBvbmUgc28gdGhhdCB3ZSdsbCB0cnkKKwkJICogZmlyc3QsIGxvd2VyIHRoZSBzZyBjYXBhY2l0eSBzbyB0aGF0IHdlJ2xsIHRyeQogCQkgKiBhbmQgbW92ZSBhbGwgdGhlIGV4Y2VzcyB0YXNrcyBhd2F5LiBXZSBsb3dlciB0aGUgY2FwYWNpdHkKIAkJICogb2YgYSBncm91cCBvbmx5IGlmIHRoZSBsb2NhbCBncm91cCBoYXMgdGhlIGNhcGFjaXR5IHRvIGZpdAotCQkgKiB0aGVzZSBleGNlc3MgdGFza3MsIGkuZS4gbnJfcnVubmluZyA8IGdyb3VwX2NhcGFjaXR5X2ZhY3Rvci4gVGhlCi0JCSAqIGV4dHJhIGNoZWNrIHByZXZlbnRzIHRoZSBjYXNlIHdoZXJlIHlvdSBhbHdheXMgcHVsbCBmcm9tIHRoZQotCQkgKiBoZWF2aWVzdCBncm91cCB3aGVuIGl0IGlzIGFscmVhZHkgdW5kZXItdXRpbGl6ZWQgKHBvc3NpYmxlCi0JCSAqIHdpdGggYSBsYXJnZSB3ZWlnaHQgdGFzayBvdXR3ZWlnaHMgdGhlIHRhc2tzIG9uIHRoZSBzeXN0ZW0pLgorCQkgKiB0aGVzZSBleGNlc3MgdGFza3MuIFRoZSBleHRyYSBjaGVjayBwcmV2ZW50cyB0aGUgY2FzZSB3aGVyZQorCQkgKiB5b3UgYWx3YXlzIHB1bGwgZnJvbSB0aGUgaGVhdmllc3QgZ3JvdXAgd2hlbiBpdCBpcyBhbHJlYWR5CisJCSAqIHVuZGVyLXV0aWxpemVkIChwb3NzaWJsZSB3aXRoIGEgbGFyZ2Ugd2VpZ2h0IHRhc2sgb3V0d2VpZ2hzCisJCSAqIHRoZSB0YXNrcyBvbiB0aGUgc3lzdGVtKS4KIAkJICovCiAJCWlmIChwcmVmZXJfc2libGluZyAmJiBzZHMtPmxvY2FsICYmCi0JCSAgICBzZHMtPmxvY2FsX3N0YXQuZ3JvdXBfaGFzX2ZyZWVfY2FwYWNpdHkpIHsKLQkJCXNncy0+Z3JvdXBfY2FwYWNpdHlfZmFjdG9yID0gbWluKHNncy0+Z3JvdXBfY2FwYWNpdHlfZmFjdG9yLCAxVSk7Ci0JCQlzZ3MtPmdyb3VwX3R5cGUgPSBncm91cF9jbGFzc2lmeShzZywgc2dzKTsKKwkJICAgIGdyb3VwX2hhc19jYXBhY2l0eShlbnYsICZzZHMtPmxvY2FsX3N0YXQpICYmCisJCSAgICAoc2dzLT5zdW1fbnJfcnVubmluZyA+IDEpKSB7CisJCQlzZ3MtPmdyb3VwX25vX2NhcGFjaXR5ID0gMTsKKwkJCXNncy0+Z3JvdXBfdHlwZSA9IGdyb3VwX292ZXJsb2FkZWQ7CiAJCX0KIAogCQlpZiAodXBkYXRlX3NkX3BpY2tfYnVzaWVzdChlbnYsIHNkcywgc2csIHNncykpIHsKQEAgLTY1MzcsMTEgKzY2MTQsMTIgQEAKIAkgKi8KIAlpZiAoYnVzaWVzdC0+Z3JvdXBfdHlwZSA9PSBncm91cF9vdmVybG9hZGVkICYmCiAJICAgIGxvY2FsLT5ncm91cF90eXBlICAgPT0gZ3JvdXBfb3ZlcmxvYWRlZCkgewotCQlsb2FkX2Fib3ZlX2NhcGFjaXR5ID0KLQkJCShidXNpZXN0LT5zdW1fbnJfcnVubmluZyAtIGJ1c2llc3QtPmdyb3VwX2NhcGFjaXR5X2ZhY3Rvcik7Ci0KLQkJbG9hZF9hYm92ZV9jYXBhY2l0eSAqPSAoU0NIRURfTE9BRF9TQ0FMRSAqIFNDSEVEX0NBUEFDSVRZX1NDQUxFKTsKLQkJbG9hZF9hYm92ZV9jYXBhY2l0eSAvPSBidXNpZXN0LT5ncm91cF9jYXBhY2l0eTsKKwkJbG9hZF9hYm92ZV9jYXBhY2l0eSA9IGJ1c2llc3QtPnN1bV9ucl9ydW5uaW5nICoKKwkJCQkJU0NIRURfTE9BRF9TQ0FMRTsKKwkJaWYgKGxvYWRfYWJvdmVfY2FwYWNpdHkgPiBidXNpZXN0LT5ncm91cF9jYXBhY2l0eSkKKwkJCWxvYWRfYWJvdmVfY2FwYWNpdHkgLT0gYnVzaWVzdC0+Z3JvdXBfY2FwYWNpdHk7CisJCWVsc2UKKwkJCWxvYWRfYWJvdmVfY2FwYWNpdHkgPSB+MFVMOwogCX0KIAogCS8qCkBAIC02NjA0LDYgKzY2ODIsNyBAQAogCWxvY2FsID0gJnNkcy5sb2NhbF9zdGF0OwogCWJ1c2llc3QgPSAmc2RzLmJ1c2llc3Rfc3RhdDsKIAorCS8qIEFTWU0gZmVhdHVyZSBieXBhc3NlcyBuaWNlIGxvYWQgYmFsYW5jZSBjaGVjayAqLwogCWlmICgoZW52LT5pZGxlID09IENQVV9JRExFIHx8IGVudi0+aWRsZSA9PSBDUFVfTkVXTFlfSURMRSkgJiYKIAkgICAgY2hlY2tfYXN5bV9wYWNraW5nKGVudiwgJnNkcykpCiAJCXJldHVybiBzZHMuYnVzaWVzdDsKQEAgLTY2MjQsOCArNjcwMyw4IEBACiAJCWdvdG8gZm9yY2VfYmFsYW5jZTsKIAogCS8qIFNEX0JBTEFOQ0VfTkVXSURMRSB0cnVtcHMgU01QIG5pY2Ugd2hlbiB1bmRlcnV0aWxpemVkICovCi0JaWYgKGVudi0+aWRsZSA9PSBDUFVfTkVXTFlfSURMRSAmJiBsb2NhbC0+Z3JvdXBfaGFzX2ZyZWVfY2FwYWNpdHkgJiYKLQkgICAgIWJ1c2llc3QtPmdyb3VwX2hhc19mcmVlX2NhcGFjaXR5KQorCWlmIChlbnYtPmlkbGUgPT0gQ1BVX05FV0xZX0lETEUgJiYgZ3JvdXBfaGFzX2NhcGFjaXR5KGVudiwgbG9jYWwpICYmCisJICAgIGJ1c2llc3QtPmdyb3VwX25vX2NhcGFjaXR5KQogCQlnb3RvIGZvcmNlX2JhbGFuY2U7CiAKIAkvKgpAQCAtNjY4NCw3ICs2NzYzLDcgQEAKIAlpbnQgaTsKIAogCWZvcl9lYWNoX2NwdV9hbmQoaSwgc2NoZWRfZ3JvdXBfY3B1cyhncm91cCksIGVudi0+Y3B1cykgewotCQl1bnNpZ25lZCBsb25nIGNhcGFjaXR5LCBjYXBhY2l0eV9mYWN0b3IsIHdsOworCQl1bnNpZ25lZCBsb25nIGNhcGFjaXR5LCB3bDsKIAkJZW51bSBmYnFfdHlwZSBydDsKIAogCQlycSA9IGNwdV9ycShpKTsKQEAgLTY3MTMsOSArNjc5Miw2IEBACiAJCQljb250aW51ZTsKIAogCQljYXBhY2l0eSA9IGNhcGFjaXR5X29mKGkpOwotCQljYXBhY2l0eV9mYWN0b3IgPSBESVZfUk9VTkRfQ0xPU0VTVChjYXBhY2l0eSwgU0NIRURfQ0FQQUNJVFlfU0NBTEUpOwotCQlpZiAoIWNhcGFjaXR5X2ZhY3RvcikKLQkJCWNhcGFjaXR5X2ZhY3RvciA9IGZpeF9zbWFsbF9jYXBhY2l0eShlbnYtPnNkLCBncm91cCk7CiAKIAkJd2wgPSB3ZWlnaHRlZF9jcHVsb2FkKGkpOwogCkBAIC02NzIzLDcgKzY3OTksOSBAQAogCQkgKiBXaGVuIGNvbXBhcmluZyB3aXRoIGltYmFsYW5jZSwgdXNlIHdlaWdodGVkX2NwdWxvYWQoKQogCQkgKiB3aGljaCBpcyBub3Qgc2NhbGVkIHdpdGggdGhlIGNwdSBjYXBhY2l0eS4KIAkJICovCi0JCWlmIChjYXBhY2l0eV9mYWN0b3IgJiYgcnEtPm5yX3J1bm5pbmcgPT0gMSAmJiB3bCA+IGVudi0+aW1iYWxhbmNlKQorCisJCWlmIChycS0+bnJfcnVubmluZyA9PSAxICYmIHdsID4gZW52LT5pbWJhbGFuY2UgJiYKKwkJICAgICFjaGVja19jcHVfY2FwYWNpdHkocnEsIGVudi0+c2QpKQogCQkJY29udGludWU7CiAKIAkJLyoKQEAgLTY3NzEsNiArNjg0OSwxOSBAQAogCQkJcmV0dXJuIDE7CiAJfQogCisJLyoKKwkgKiBUaGUgZHN0X2NwdSBpcyBpZGxlIGFuZCB0aGUgc3JjX2NwdSBDUFUgaGFzIG9ubHkgMSBDRlMgdGFzay4KKwkgKiBJdCdzIHdvcnRoIG1pZ3JhdGluZyB0aGUgdGFzayBpZiB0aGUgc3JjX2NwdSdzIGNhcGFjaXR5IGlzIHJlZHVjZWQKKwkgKiBiZWNhdXNlIG9mIG90aGVyIHNjaGVkX2NsYXNzIG9yIElSUXMgaWYgbW9yZSBjYXBhY2l0eSBzdGF5cworCSAqIGF2YWlsYWJsZSBvbiBkc3RfY3B1LgorCSAqLworCWlmICgoZW52LT5pZGxlICE9IENQVV9OT1RfSURMRSkgJiYKKwkgICAgKGVudi0+c3JjX3JxLT5jZnMuaF9ucl9ydW5uaW5nID09IDEpKSB7CisJCWlmICgoY2hlY2tfY3B1X2NhcGFjaXR5KGVudi0+c3JjX3JxLCBzZCkpICYmCisJCSAgICAoY2FwYWNpdHlfb2YoZW52LT5zcmNfY3B1KSpzZC0+aW1iYWxhbmNlX3BjdCA8IGNhcGFjaXR5X29mKGVudi0+ZHN0X2NwdSkqMTAwKSkKKwkJCXJldHVybiAxOworCX0KKwogCXJldHVybiB1bmxpa2VseShzZC0+bnJfYmFsYW5jZV9mYWlsZWQgPiBzZC0+Y2FjaGVfbmljZV90cmllcysyKTsKIH0KIApAQCAtNjg3MCw2ICs2OTYxLDkgQEAKIAogCXNjaGVkc3RhdF9hZGQoc2QsIGxiX2ltYmFsYW5jZVtpZGxlXSwgZW52LmltYmFsYW5jZSk7CiAKKwllbnYuc3JjX2NwdSA9IGJ1c2llc3QtPmNwdTsKKwllbnYuc3JjX3JxID0gYnVzaWVzdDsKKwogCWxkX21vdmVkID0gMDsKIAlpZiAoYnVzaWVzdC0+bnJfcnVubmluZyA+IDEpIHsKIAkJLyoKQEAgLTY4NzksOCArNjk3Myw2IEBACiAJCSAqIGNvcnJlY3RseSB0cmVhdGVkIGFzIGFuIGltYmFsYW5jZS4KIAkJICovCiAJCWVudi5mbGFncyB8PSBMQkZfQUxMX1BJTk5FRDsKLQkJZW52LnNyY19jcHUgICA9IGJ1c2llc3QtPmNwdTsKLQkJZW52LnNyY19ycSAgICA9IGJ1c2llc3Q7CiAJCWVudi5sb29wX21heCAgPSBtaW4oc3lzY3RsX3NjaGVkX25yX21pZ3JhdGUsIGJ1c2llc3QtPm5yX3J1bm5pbmcpOwogCiBtb3JlX2JhbGFuY2U6CkBAIC03NTgwLDIyICs3NjcyLDI1IEBACiAKIC8qCiAgKiBDdXJyZW50IGhldXJpc3RpYyBmb3Iga2lja2luZyB0aGUgaWRsZSBsb2FkIGJhbGFuY2VyIGluIHRoZSBwcmVzZW5jZQotICogb2YgYW4gaWRsZSBjcHUgaXMgdGhlIHN5c3RlbS4KKyAqIG9mIGFuIGlkbGUgY3B1IGluIHRoZSBzeXN0ZW0uCiAgKiAgIC0gVGhpcyBycSBoYXMgbW9yZSB0aGFuIG9uZSB0YXNrLgotICogICAtIEF0IGFueSBzY2hlZHVsZXIgZG9tYWluIGxldmVsLCB0aGlzIGNwdSdzIHNjaGVkdWxlciBncm91cCBoYXMgbXVsdGlwbGUKLSAqICAgICBidXN5IGNwdSdzIGV4Y2VlZGluZyB0aGUgZ3JvdXAncyBjYXBhY2l0eS4KKyAqICAgLSBUaGlzIHJxIGhhcyBhdCBsZWFzdCBvbmUgQ0ZTIHRhc2sgYW5kIHRoZSBjYXBhY2l0eSBvZiB0aGUgQ1BVIGlzCisgKiAgICAgc2lnbmlmaWNhbnRseSByZWR1Y2VkIGJlY2F1c2Ugb2YgUlQgdGFza3Mgb3IgSVJRcy4KKyAqICAgLSBBdCBwYXJlbnQgb2YgTExDIHNjaGVkdWxlciBkb21haW4gbGV2ZWwsIHRoaXMgY3B1J3Mgc2NoZWR1bGVyIGdyb3VwIGhhcworICogICAgIG11bHRpcGxlIGJ1c3kgY3B1LgogICogICAtIEZvciBTRF9BU1lNX1BBQ0tJTkcsIGlmIHRoZSBsb3dlciBudW1iZXJlZCBjcHUncyBpbiB0aGUgc2NoZWR1bGVyCiAgKiAgICAgZG9tYWluIHNwYW4gYXJlIGlkbGUuCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IG5vaHpfa2lja19uZWVkZWQoc3RydWN0IHJxICpycSkKK3N0YXRpYyBpbmxpbmUgYm9vbCBub2h6X2tpY2tfbmVlZGVkKHN0cnVjdCBycSAqcnEpCiB7CiAJdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwogCXN0cnVjdCBzY2hlZF9ncm91cF9jYXBhY2l0eSAqc2djOwogCWludCBucl9idXN5LCBjcHUgPSBycS0+Y3B1OworCWJvb2wga2ljayA9IGZhbHNlOwogCiAJaWYgKHVubGlrZWx5KHJxLT5pZGxlX2JhbGFuY2UpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCiAgICAgICAgLyoKIAkqIFdlIG1heSBiZSByZWNlbnRseSBpbiB0aWNrZWQgb3IgdGlja2xlc3MgaWRsZSBtb2RlLiBBdCB0aGUgZmlyc3QKQEAgLTc2MDksMzggKzc3MDQsNDYgQEAKIAkgKiBiYWxhbmNpbmcuCiAJICovCiAJaWYgKGxpa2VseSghYXRvbWljX3JlYWQoJm5vaHoubnJfY3B1cykpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKHRpbWVfYmVmb3JlKG5vdywgbm9oei5uZXh0X2JhbGFuY2UpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKHJxLT5ucl9ydW5uaW5nID49IDIpCi0JCWdvdG8gbmVlZF9raWNrOworCQlyZXR1cm4gdHJ1ZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlzZCA9IHJjdV9kZXJlZmVyZW5jZShwZXJfY3B1KHNkX2J1c3ksIGNwdSkpOwotCiAJaWYgKHNkKSB7CiAJCXNnYyA9IHNkLT5ncm91cHMtPnNnYzsKIAkJbnJfYnVzeSA9IGF0b21pY19yZWFkKCZzZ2MtPm5yX2J1c3lfY3B1cyk7CiAKLQkJaWYgKG5yX2J1c3kgPiAxKQotCQkJZ290byBuZWVkX2tpY2tfdW5sb2NrOworCQlpZiAobnJfYnVzeSA+IDEpIHsKKwkJCWtpY2sgPSB0cnVlOworCQkJZ290byB1bmxvY2s7CisJCX0KKworCX0KKworCXNkID0gcmN1X2RlcmVmZXJlbmNlKHJxLT5zZCk7CisJaWYgKHNkKSB7CisJCWlmICgocnEtPmNmcy5oX25yX3J1bm5pbmcgPj0gMSkgJiYKKwkJCQljaGVja19jcHVfY2FwYWNpdHkocnEsIHNkKSkgeworCQkJa2ljayA9IHRydWU7CisJCQlnb3RvIHVubG9jazsKKwkJfQogCX0KIAogCXNkID0gcmN1X2RlcmVmZXJlbmNlKHBlcl9jcHUoc2RfYXN5bSwgY3B1KSk7Ci0KIAlpZiAoc2QgJiYgKGNwdW1hc2tfZmlyc3RfYW5kKG5vaHouaWRsZV9jcHVzX21hc2ssCi0JCQkJICBzY2hlZF9kb21haW5fc3BhbihzZCkpIDwgY3B1KSkKLQkJZ290byBuZWVkX2tpY2tfdW5sb2NrOworCQkJCSAgc2NoZWRfZG9tYWluX3NwYW4oc2QpKSA8IGNwdSkpIHsKKwkJa2ljayA9IHRydWU7CisJCWdvdG8gdW5sb2NrOworCX0KIAordW5sb2NrOgogCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiAwOwotCi1uZWVkX2tpY2tfdW5sb2NrOgotCXJjdV9yZWFkX3VubG9jaygpOwotbmVlZF9raWNrOgotCXJldHVybiAxOworCXJldHVybiBraWNrOwogfQogI2Vsc2UKIHN0YXRpYyB2b2lkIG5vaHpfaWRsZV9iYWxhbmNlKHN0cnVjdCBycSAqdGhpc19ycSwgZW51bSBjcHVfaWRsZV90eXBlIGlkbGUpIHsgfQpAQCAtNzY1NiwxNCArNzc1OSwxNiBAQAogCWVudW0gY3B1X2lkbGVfdHlwZSBpZGxlID0gdGhpc19ycS0+aWRsZV9iYWxhbmNlID8KIAkJCQkJCUNQVV9JRExFIDogQ1BVX05PVF9JRExFOwogCi0JcmViYWxhbmNlX2RvbWFpbnModGhpc19ycSwgaWRsZSk7Ci0KIAkvKgogCSAqIElmIHRoaXMgY3B1IGhhcyBhIHBlbmRpbmcgbm9oel9iYWxhbmNlX2tpY2ssIHRoZW4gZG8gdGhlCiAJICogYmFsYW5jaW5nIG9uIGJlaGFsZiBvZiB0aGUgb3RoZXIgaWRsZSBjcHVzIHdob3NlIHRpY2tzIGFyZQotCSAqIHN0b3BwZWQuCisJICogc3RvcHBlZC4gRG8gbm9oel9pZGxlX2JhbGFuY2UgKmJlZm9yZSogcmViYWxhbmNlX2RvbWFpbnMgdG8KKwkgKiBnaXZlIHRoZSBpZGxlIGNwdXMgYSBjaGFuY2UgdG8gbG9hZCBiYWxhbmNlLiBFbHNlIHdlIG1heQorCSAqIGxvYWQgYmFsYW5jZSBvbmx5IHdpdGhpbiB0aGUgbG9jYWwgc2NoZWRfZG9tYWluIGhpZXJhcmNoeQorCSAqIGFuZCBhYm9ydCBub2h6X2lkbGVfYmFsYW5jZSBhbHRvZ2V0aGVyIGlmIHdlIHB1bGwgc29tZSBsb2FkLgogCSAqLwogCW5vaHpfaWRsZV9iYWxhbmNlKHRoaXNfcnEsIGlkbGUpOworCXJlYmFsYW5jZV9kb21haW5zKHRoaXNfcnEsIGlkbGUpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2ZlYXR1cmVzLmggYi9rZXJuZWwvc2NoZWQvZmVhdHVyZXMuaAppbmRleCA5MDI4NGQxLi45MWUzM2NkIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvZmVhdHVyZXMuaAorKysgYi9rZXJuZWwvc2NoZWQvZmVhdHVyZXMuaApAQCAtNTYsNiArNTYsMTkgQEAKICAqLwogU0NIRURfRkVBVChUVFdVX1FVRVVFLCB0cnVlKQogCisjaWZkZWYgSEFWRV9SVF9QVVNIX0lQSQorLyoKKyAqIEluIG9yZGVyIHRvIGF2b2lkIGEgdGh1bmRlcmluZyBoZXJkIGF0dGFjayBvZiBDUFVzIHRoYXQgYXJlCisgKiBsb3dlcmluZyB0aGVpciBwcmlvcml0aWVzIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGVyZSBiZWluZworICogYSBzaW5nbGUgQ1BVIHRoYXQgaGFzIGFuIFJUIHRhc2sgdGhhdCBjYW4gbWlncmF0ZSBhbmQgaXMgd2FpdGluZworICogdG8gcnVuLCB3aGVyZSB0aGUgb3RoZXIgQ1BVcyB3aWxsIHRyeSB0byB0YWtlIHRoYXQgQ1BVcworICogcnEgbG9jayBhbmQgcG9zc2libHkgY3JlYXRlIGEgbGFyZ2UgY29udGVudGlvbiwgc2VuZGluZyBhbgorICogSVBJIHRvIHRoYXQgQ1BVIGFuZCBsZXQgdGhhdCBDUFUgcHVzaCB0aGUgUlQgdGFzayB0byB3aGVyZQorICogaXQgc2hvdWxkIGdvIG1heSBiZSBhIGJldHRlciBzY2VuYXJpby4KKyAqLworU0NIRURfRkVBVChSVF9QVVNIX0lQSSwgdHJ1ZSkKKyNlbmRpZgorCiBTQ0hFRF9GRUFUKEZPUkNFX1NEX09WRVJMQVAsIGZhbHNlKQogU0NIRURfRkVBVChSVF9SVU5USU1FX1NIQVJFLCB0cnVlKQogU0NIRURfRkVBVChMQl9NSU4sIGZhbHNlKQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL2lkbGUuYyBiL2tlcm5lbC9zY2hlZC9pZGxlLmMKaW5kZXggODAwMTRhMS4uZGVlZjFjYSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL2lkbGUuYworKysgYi9rZXJuZWwvc2NoZWQvaWRsZS5jCkBAIC0xNTgsOCArMTU4LDcgQEAKIAkgKiBpcyB1c2VkIGZyb20gYW5vdGhlciBjcHUgYXMgYSBicm9hZGNhc3QgdGltZXIsIHRoaXMgY2FsbCBtYXkKIAkgKiBmYWlsIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUKIAkgKi8KLQlpZiAoYnJvYWRjYXN0ICYmCi0JICAgIGNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FTlRFUiwgJmRldi0+Y3B1KSkKKwlpZiAoYnJvYWRjYXN0ICYmIHRpY2tfYnJvYWRjYXN0X2VudGVyKCkpCiAJCWdvdG8gdXNlX2RlZmF1bHQ7CiAKIAkvKiBUYWtlIG5vdGUgb2YgdGhlIHBsYW5uZWQgaWRsZSBzdGF0ZS4gKi8KQEAgLTE3Niw3ICsxNzUsNyBAQAogCWlkbGVfc2V0X3N0YXRlKHRoaXNfcnEoKSwgTlVMTCk7CiAKIAlpZiAoYnJvYWRjYXN0KQotCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRVhJVCwgJmRldi0+Y3B1KTsKKwkJdGlja19icm9hZGNhc3RfZXhpdCgpOwogCiAJLyoKIAkgKiBHaXZlIHRoZSBnb3Zlcm5vciBhbiBvcHBvcnR1bml0eSB0byByZWZsZWN0IG9uIHRoZSBvdXRjb21lCkBAIC0yMTAsNiArMjA5LDggQEAKIAlnb3RvIGV4aXRfaWRsZTsKIH0KIAorREVGSU5FX1BFUl9DUFUoYm9vbCwgY3B1X2RlYWRfaWRsZSk7CisKIC8qCiAgKiBHZW5lcmljIGlkbGUgbG9vcCBpbXBsZW1lbnRhdGlvbgogICoKQEAgLTIzNCw4ICsyMzUsMTMgQEAKIAkJCWNoZWNrX3BndF9jYWNoZSgpOwogCQkJcm1iKCk7CiAKLQkJCWlmIChjcHVfaXNfb2ZmbGluZShzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQkJaWYgKGNwdV9pc19vZmZsaW5lKHNtcF9wcm9jZXNzb3JfaWQoKSkpIHsKKwkJCQlyY3VfY3B1X25vdGlmeShOVUxMLCBDUFVfRFlJTkdfSURMRSwKKwkJCQkJICAgICAgICh2b2lkICopKGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJCQlzbXBfbWIoKTsgLyogYWxsIGFjdGl2aXR5IGJlZm9yZSBkZWFkLiAqLworCQkJCXRoaXNfY3B1X3dyaXRlKGNwdV9kZWFkX2lkbGUsIHRydWUpOwogCQkJCWFyY2hfY3B1X2lkbGVfZGVhZCgpOworCQkJfQogCiAJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQkJYXJjaF9jcHVfaWRsZV9lbnRlcigpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkL3J0LmMgYi9rZXJuZWwvc2NoZWQvcnQuYwppbmRleCBmNGQ0YjA3Li41NzVkYTc2IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQvcnQuYworKysgYi9rZXJuZWwvc2NoZWQvcnQuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlICJzY2hlZC5oIgogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lycV93b3JrLmg+CiAKIGludCBzY2hlZF9ycl90aW1lc2xpY2UgPSBSUl9USU1FU0xJQ0U7CiAKQEAgLTU5LDcgKzYwLDExIEBACiAJcmF3X3NwaW5fdW5sb2NrKCZydF9iLT5ydF9ydW50aW1lX2xvY2spOwogfQogCi12b2lkIGluaXRfcnRfcnEoc3RydWN0IHJ0X3JxICpydF9ycSwgc3RydWN0IHJxICpycSkKKyNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgdm9pZCBwdXNoX2lycV93b3JrX2Z1bmMoc3RydWN0IGlycV93b3JrICp3b3JrKTsKKyNlbmRpZgorCit2b2lkIGluaXRfcnRfcnEoc3RydWN0IHJ0X3JxICpydF9ycSkKIHsKIAlzdHJ1Y3QgcnRfcHJpb19hcnJheSAqYXJyYXk7CiAJaW50IGk7CkBAIC03OCw3ICs4MywxNCBAQAogCXJ0X3JxLT5ydF9ucl9taWdyYXRvcnkgPSAwOwogCXJ0X3JxLT5vdmVybG9hZGVkID0gMDsKIAlwbGlzdF9oZWFkX2luaXQoJnJ0X3JxLT5wdXNoYWJsZV90YXNrcyk7CisKKyNpZmRlZiBIQVZFX1JUX1BVU0hfSVBJCisJcnRfcnEtPnB1c2hfZmxhZ3MgPSAwOworCXJ0X3JxLT5wdXNoX2NwdSA9IG5yX2NwdV9pZHM7CisJcmF3X3NwaW5fbG9ja19pbml0KCZydF9ycS0+cHVzaF9sb2NrKTsKKwlpbml0X2lycV93b3JrKCZydF9ycS0+cHVzaF93b3JrLCBwdXNoX2lycV93b3JrX2Z1bmMpOwogI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCS8qIFdlIHN0YXJ0IGlzIGRlcXVldWVkIHN0YXRlLCBiZWNhdXNlIG5vIFJUIHRhc2tzIGFyZSBxdWV1ZWQgKi8KIAlydF9ycS0+cnRfcXVldWVkID0gMDsKIApAQCAtMTkzLDcgKzIwNSw3IEBACiAJCWlmICghcnRfc2UpCiAJCQlnb3RvIGVycl9mcmVlX3JxOwogCi0JCWluaXRfcnRfcnEocnRfcnEsIGNwdV9ycShpKSk7CisJCWluaXRfcnRfcnEocnRfcnEpOwogCQlydF9ycS0+cnRfcnVudGltZSA9IHRnLT5ydF9iYW5kd2lkdGgucnRfcnVudGltZTsKIAkJaW5pdF90Z19ydF9lbnRyeSh0ZywgcnRfcnEsIHJ0X3NlLCBpLCBwYXJlbnQtPnJ0X3NlW2ldKTsKIAl9CkBAIC0xNzc4LDYgKzE3OTAsMTY0IEBACiAJCTsKIH0KIAorI2lmZGVmIEhBVkVfUlRfUFVTSF9JUEkKKy8qCisgKiBUaGUgc2VhcmNoIGZvciB0aGUgbmV4dCBjcHUgYWx3YXlzIHN0YXJ0cyBhdCBycS0+Y3B1IGFuZCBlbmRzCisgKiB3aGVuIHdlIHJlYWNoIHJxLT5jcHUgYWdhaW4uIEl0IHdpbGwgbmV2ZXIgcmV0dXJuIHJxLT5jcHUuCisgKiBUaGlzIHJldHVybnMgdGhlIG5leHQgY3B1IHRvIGNoZWNrLCBvciBucl9jcHVfaWRzIGlmIHRoZSBsb29wCisgKiBpcyBjb21wbGV0ZS4KKyAqCisgKiBycS0+cnQucHVzaF9jcHUgaG9sZHMgdGhlIGxhc3QgY3B1IHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24sCisgKiBvciBpZiB0aGlzIGlzIHRoZSBmaXJzdCBpbnN0YW5jZSwgaXQgbXVzdCBob2xkIHJxLT5jcHUuCisgKi8KK3N0YXRpYyBpbnQgcnRvX25leHRfY3B1KHN0cnVjdCBycSAqcnEpCit7CisJaW50IHByZXZfY3B1ID0gcnEtPnJ0LnB1c2hfY3B1OworCWludCBjcHU7CisKKwljcHUgPSBjcHVtYXNrX25leHQocHJldl9jcHUsIHJxLT5yZC0+cnRvX21hc2spOworCisJLyoKKwkgKiBJZiB0aGUgcHJldmlvdXMgY3B1IGlzIGxlc3MgdGhhbiB0aGUgcnEncyBDUFUsIHRoZW4gaXQgYWxyZWFkeQorCSAqIHBhc3NlZCB0aGUgZW5kIG9mIHRoZSBtYXNrLCBhbmQgaGFzIHN0YXJ0ZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgorCSAqIFdlIGVuZCBpZiB0aGUgbmV4dCBDUFUgaXMgZ3JlYXRlciBvciBlcXVhbCB0byBycSdzIENQVS4KKwkgKi8KKwlpZiAocHJldl9jcHUgPCBycS0+Y3B1KSB7CisJCWlmIChjcHUgPj0gcnEtPmNwdSkKKwkJCXJldHVybiBucl9jcHVfaWRzOworCisJfSBlbHNlIGlmIChjcHUgPj0gbnJfY3B1X2lkcykgeworCQkvKgorCQkgKiBXZSBwYXNzZWQgdGhlIGVuZCBvZiB0aGUgbWFzaywgc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KKwkJICogSWYgdGhlIHJlc3VsdCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBycSdzIENQVSwgdGhlbgorCQkgKiB0aGUgbG9vcCBpcyBmaW5pc2hlZC4KKwkJICovCisJCWNwdSA9IGNwdW1hc2tfZmlyc3QocnEtPnJkLT5ydG9fbWFzayk7CisJCWlmIChjcHUgPj0gcnEtPmNwdSkKKwkJCXJldHVybiBucl9jcHVfaWRzOworCX0KKwlycS0+cnQucHVzaF9jcHUgPSBjcHU7CisKKwkvKiBSZXR1cm4gY3B1IHRvIGxldCB0aGUgY2FsbGVyIGtub3cgaWYgdGhlIGxvb3AgaXMgZmluaXNoZWQgb3Igbm90ICovCisJcmV0dXJuIGNwdTsKK30KKworc3RhdGljIGludCBmaW5kX25leHRfcHVzaF9jcHUoc3RydWN0IHJxICpycSkKK3sKKwlzdHJ1Y3QgcnEgKm5leHRfcnE7CisJaW50IGNwdTsKKworCXdoaWxlICgxKSB7CisJCWNwdSA9IHJ0b19uZXh0X2NwdShycSk7CisJCWlmIChjcHUgPj0gbnJfY3B1X2lkcykKKwkJCWJyZWFrOworCQluZXh0X3JxID0gY3B1X3JxKGNwdSk7CisKKwkJLyogTWFrZSBzdXJlIHRoZSBuZXh0IHJxIGNhbiBwdXNoIHRvIHRoaXMgcnEgKi8KKwkJaWYgKG5leHRfcnEtPnJ0LmhpZ2hlc3RfcHJpby5uZXh0IDwgcnEtPnJ0LmhpZ2hlc3RfcHJpby5jdXJyKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGNwdTsKK30KKworI2RlZmluZSBSVF9QVVNIX0lQSV9FWEVDVVRJTkcJCTEKKyNkZWZpbmUgUlRfUFVTSF9JUElfUkVTVEFSVAkJMgorCitzdGF0aWMgdm9pZCB0ZWxsX2NwdV90b19wdXNoKHN0cnVjdCBycSAqcnEpCit7CisJaW50IGNwdTsKKworCWlmIChycS0+cnQucHVzaF9mbGFncyAmIFJUX1BVU0hfSVBJX0VYRUNVVElORykgeworCQlyYXdfc3Bpbl9sb2NrKCZycS0+cnQucHVzaF9sb2NrKTsKKwkJLyogTWFrZSBzdXJlIGl0J3Mgc3RpbGwgZXhlY3V0aW5nICovCisJCWlmIChycS0+cnQucHVzaF9mbGFncyAmIFJUX1BVU0hfSVBJX0VYRUNVVElORykgeworCQkJLyoKKwkJCSAqIFRlbGwgdGhlIElQSSB0byByZXN0YXJ0IHRoZSBsb29wIGFzIHRoaW5ncyBoYXZlCisJCQkgKiBjaGFuZ2VkIHNpbmNlIGl0IHN0YXJ0ZWQuCisJCQkgKi8KKwkJCXJxLT5ydC5wdXNoX2ZsYWdzIHw9IFJUX1BVU0hfSVBJX1JFU1RBUlQ7CisJCQlyYXdfc3Bpbl91bmxvY2soJnJxLT5ydC5wdXNoX2xvY2spOworCQkJcmV0dXJuOworCQl9CisJCXJhd19zcGluX3VubG9jaygmcnEtPnJ0LnB1c2hfbG9jayk7CisJfQorCisJLyogV2hlbiBoZXJlLCB0aGVyZSdzIG5vIElQSSBnb2luZyBhcm91bmQgKi8KKworCXJxLT5ydC5wdXNoX2NwdSA9IHJxLT5jcHU7CisJY3B1ID0gZmluZF9uZXh0X3B1c2hfY3B1KHJxKTsKKwlpZiAoY3B1ID49IG5yX2NwdV9pZHMpCisJCXJldHVybjsKKworCXJxLT5ydC5wdXNoX2ZsYWdzID0gUlRfUFVTSF9JUElfRVhFQ1VUSU5HOworCisJaXJxX3dvcmtfcXVldWVfb24oJnJxLT5ydC5wdXNoX3dvcmssIGNwdSk7Cit9CisKKy8qIENhbGxlZCBmcm9tIGhhcmRpcnEgY29udGV4dCAqLworc3RhdGljIHZvaWQgdHJ5X3RvX3B1c2hfdGFza3Modm9pZCAqYXJnKQoreworCXN0cnVjdCBydF9ycSAqcnRfcnEgPSBhcmc7CisJc3RydWN0IHJxICpycSwgKnNyY19ycTsKKwlpbnQgdGhpc19jcHU7CisJaW50IGNwdTsKKworCXRoaXNfY3B1ID0gcnRfcnEtPnB1c2hfY3B1OworCisJLyogUGFyYW5vaWQgY2hlY2sgKi8KKwlCVUdfT04odGhpc19jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCXJxID0gY3B1X3JxKHRoaXNfY3B1KTsKKwlzcmNfcnEgPSBycV9vZl9ydF9ycShydF9ycSk7CisKK2FnYWluOgorCWlmIChoYXNfcHVzaGFibGVfdGFza3MocnEpKSB7CisJCXJhd19zcGluX2xvY2soJnJxLT5sb2NrKTsKKwkJcHVzaF9ydF90YXNrKHJxKTsKKwkJcmF3X3NwaW5fdW5sb2NrKCZycS0+bG9jayk7CisJfQorCisJLyogUGFzcyB0aGUgSVBJIHRvIHRoZSBuZXh0IHJ0IG92ZXJsb2FkZWQgcXVldWUgKi8KKwlyYXdfc3Bpbl9sb2NrKCZydF9ycS0+cHVzaF9sb2NrKTsKKwkvKgorCSAqIElmIHRoZSBzb3VyY2UgcXVldWUgY2hhbmdlZCBzaW5jZSB0aGUgSVBJIHdlbnQgb3V0LAorCSAqIHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgc2VhcmNoIGZyb20gdGhhdCBDUFUgYWdhaW4uCisJICovCisJaWYgKHJ0X3JxLT5wdXNoX2ZsYWdzICYgUlRfUFVTSF9JUElfUkVTVEFSVCkgeworCQlydF9ycS0+cHVzaF9mbGFncyAmPSB+UlRfUFVTSF9JUElfUkVTVEFSVDsKKwkJcnRfcnEtPnB1c2hfY3B1ID0gc3JjX3JxLT5jcHU7CisJfQorCisJY3B1ID0gZmluZF9uZXh0X3B1c2hfY3B1KHNyY19ycSk7CisKKwlpZiAoY3B1ID49IG5yX2NwdV9pZHMpCisJCXJ0X3JxLT5wdXNoX2ZsYWdzICY9IH5SVF9QVVNIX0lQSV9FWEVDVVRJTkc7CisJcmF3X3NwaW5fdW5sb2NrKCZydF9ycS0+cHVzaF9sb2NrKTsKKworCWlmIChjcHUgPj0gbnJfY3B1X2lkcykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJdCBpcyBwb3NzaWJsZSB0aGF0IGEgcmVzdGFydCBjYXVzZWQgdGhpcyBDUFUgdG8gYmUKKwkgKiBjaG9zZW4gYWdhaW4uIERvbid0IGJvdGhlciB3aXRoIGFuIElQSSwganVzdCBzZWUgaWYgd2UKKwkgKiBoYXZlIG1vcmUgdG8gcHVzaC4KKwkgKi8KKwlpZiAodW5saWtlbHkoY3B1ID09IHJxLT5jcHUpKQorCQlnb3RvIGFnYWluOworCisJLyogVHJ5IHRoZSBuZXh0IFJUIG92ZXJsb2FkZWQgQ1BVICovCisJaXJxX3dvcmtfcXVldWVfb24oJnJ0X3JxLT5wdXNoX3dvcmssIGNwdSk7Cit9CisKK3N0YXRpYyB2b2lkIHB1c2hfaXJxX3dvcmtfZnVuYyhzdHJ1Y3QgaXJxX3dvcmsgKndvcmspCit7CisJc3RydWN0IHJ0X3JxICpydF9ycSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnRfcnEsIHB1c2hfd29yayk7CisKKwl0cnlfdG9fcHVzaF90YXNrcyhydF9ycSk7Cit9CisjZW5kaWYgLyogSEFWRV9SVF9QVVNIX0lQSSAqLworCiBzdGF0aWMgaW50IHB1bGxfcnRfdGFzayhzdHJ1Y3QgcnEgKnRoaXNfcnEpCiB7CiAJaW50IHRoaXNfY3B1ID0gdGhpc19ycS0+Y3B1LCByZXQgPSAwLCBjcHU7CkBAIC0xNzkzLDYgKzE5NjMsMTMgQEAKIAkgKi8KIAlzbXBfcm1iKCk7CiAKKyNpZmRlZiBIQVZFX1JUX1BVU0hfSVBJCisJaWYgKHNjaGVkX2ZlYXQoUlRfUFVTSF9JUEkpKSB7CisJCXRlbGxfY3B1X3RvX3B1c2godGhpc19ycSk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCiAJZm9yX2VhY2hfY3B1KGNwdSwgdGhpc19ycS0+cmQtPnJ0b19tYXNrKSB7CiAJCWlmICh0aGlzX2NwdSA9PSBjcHUpCiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9zY2hlZC5oIGIva2VybmVsL3NjaGVkL3NjaGVkLmgKaW5kZXggZGMwZjQzNS4uZTBlMTI5OSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkL3NjaGVkLmgKKysrIGIva2VybmVsL3NjaGVkL3NjaGVkLmgKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3N0b3BfbWFjaGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycV93b3JrLmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIApAQCAtMzYyLDggKzM2MywxNCBAQAogCSAqIFVuZGVyIENGUywgbG9hZCBpcyB0cmFja2VkIG9uIGEgcGVyLWVudGl0eSBiYXNpcyBhbmQgYWdncmVnYXRlZCB1cC4KIAkgKiBUaGlzIGFsbG93cyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIGJvdGggdGhyZWFkIGFuZCBncm91cCB1c2FnZSAoaW4KIAkgKiB0aGUgRkFJUl9HUk9VUF9TQ0hFRCBjYXNlKS4KKwkgKiBydW5uYWJsZV9sb2FkX2F2ZyBpcyB0aGUgc3VtIG9mIHRoZSBsb2FkX2F2Z19jb250cmliIG9mIHRoZQorCSAqIHNjaGVkX2VudGl0aWVzIG9uIHRoZSBycS4KKwkgKiBibG9ja2VkX2xvYWRfYXZnIGlzIHNpbWlsYXIgdG8gcnVubmFibGVfbG9hZF9hdmcgZXhjZXB0IHRoYXQgaXRzCisJICogdGhlIGJsb2NrZWQgc2NoZWRfZW50aXRpZXMgb24gdGhlIHJxLgorCSAqIHV0aWxpemF0aW9uX2xvYWRfYXZnIGlzIHRoZSBzdW0gb2YgdGhlIGF2ZXJhZ2UgcnVubmluZyB0aW1lIG9mIHRoZQorCSAqIHNjaGVkX2VudGl0aWVzIG9uIHRoZSBycS4KIAkgKi8KLQl1bnNpZ25lZCBsb25nIHJ1bm5hYmxlX2xvYWRfYXZnLCBibG9ja2VkX2xvYWRfYXZnOworCXVuc2lnbmVkIGxvbmcgcnVubmFibGVfbG9hZF9hdmcsIGJsb2NrZWRfbG9hZF9hdmcsIHV0aWxpemF0aW9uX2xvYWRfYXZnOwogCWF0b21pYzY0X3QgZGVjYXlfY291bnRlcjsKIAl1NjQgbGFzdF9kZWNheTsKIAlhdG9taWNfbG9uZ190IHJlbW92ZWRfbG9hZDsKQEAgLTQxOCw2ICs0MjUsMTEgQEAKIAlyZXR1cm4gc3lzY3RsX3NjaGVkX3J0X3J1bnRpbWUgPj0gMDsKIH0KIAorLyogUlQgSVBJIHB1bGwgbG9naWMgcmVxdWlyZXMgSVJRX1dPUksgKi8KKyNpZmRlZiBDT05GSUdfSVJRX1dPUksKKyMgZGVmaW5lIEhBVkVfUlRfUFVTSF9JUEkKKyNlbmRpZgorCiAvKiBSZWFsLVRpbWUgY2xhc3NlcycgcmVsYXRlZCBmaWVsZCBpbiBhIHJ1bnF1ZXVlOiAqLwogc3RydWN0IHJ0X3JxIHsKIAlzdHJ1Y3QgcnRfcHJpb19hcnJheSBhY3RpdmU7CkBAIC00MzUsNyArNDQ3LDEzIEBACiAJdW5zaWduZWQgbG9uZyBydF9ucl90b3RhbDsKIAlpbnQgb3ZlcmxvYWRlZDsKIAlzdHJ1Y3QgcGxpc3RfaGVhZCBwdXNoYWJsZV90YXNrczsKKyNpZmRlZiBIQVZFX1JUX1BVU0hfSVBJCisJaW50IHB1c2hfZmxhZ3M7CisJaW50IHB1c2hfY3B1OworCXN0cnVjdCBpcnFfd29yayBwdXNoX3dvcms7CisJcmF3X3NwaW5sb2NrX3QgcHVzaF9sb2NrOwogI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCWludCBydF9xdWV1ZWQ7CiAKIAlpbnQgcnRfdGhyb3R0bGVkOwpAQCAtNTk3LDYgKzYxNSw3IEBACiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAKIAl1bnNpZ25lZCBsb25nIGNwdV9jYXBhY2l0eTsKKwl1bnNpZ25lZCBsb25nIGNwdV9jYXBhY2l0eV9vcmlnOwogCiAJdW5zaWduZWQgY2hhciBpZGxlX2JhbGFuY2U7CiAJLyogRm9yIGFjdGl2ZSBiYWxhbmNpbmcgKi8KQEAgLTgwNyw3ICs4MjYsNyBAQAogCSAqIENQVSBjYXBhY2l0eSBvZiB0aGlzIGdyb3VwLCBTQ0hFRF9MT0FEX1NDQUxFIGJlaW5nIG1heCBjYXBhY2l0eQogCSAqIGZvciBhIHNpbmdsZSBDUFUuCiAJICovCi0JdW5zaWduZWQgaW50IGNhcGFjaXR5LCBjYXBhY2l0eV9vcmlnOworCXVuc2lnbmVkIGludCBjYXBhY2l0eTsKIAl1bnNpZ25lZCBsb25nIG5leHRfdXBkYXRlOwogCWludCBpbWJhbGFuY2U7IC8qIFhYWCB1bnJlbGF0ZWQgdG8gY2FwYWNpdHkgYnV0IHNoYXJlZCBncm91cCBzdGF0ZSAqLwogCS8qCkBAIC0xMzY4LDkgKzEzODcsMTggQEAKIAogI2lmZGVmIENPTkZJR19TTVAKIGV4dGVybiB2b2lkIHNjaGVkX2F2Z191cGRhdGUoc3RydWN0IHJxICpycSk7CisKKyNpZm5kZWYgYXJjaF9zY2FsZV9mcmVxX2NhcGFjaXR5CitzdGF0aWMgX19hbHdheXNfaW5saW5lCit1bnNpZ25lZCBsb25nIGFyY2hfc2NhbGVfZnJlcV9jYXBhY2l0eShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKK3sKKwlyZXR1cm4gU0NIRURfQ0FQQUNJVFlfU0NBTEU7Cit9CisjZW5kaWYKKwogc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX3J0X2F2Z191cGRhdGUoc3RydWN0IHJxICpycSwgdTY0IHJ0X2RlbHRhKQogewotCXJxLT5ydF9hdmcgKz0gcnRfZGVsdGE7CisJcnEtPnJ0X2F2ZyArPSBydF9kZWx0YSAqIGFyY2hfc2NhbGVfZnJlcV9jYXBhY2l0eShOVUxMLCBjcHVfb2YocnEpKTsKIAlzY2hlZF9hdmdfdXBkYXRlKHJxKTsKIH0KICNlbHNlCkBAIC0xNjQzLDggKzE2NzEsOCBAQAogZXh0ZXJuIHZvaWQgcHJpbnRfZGxfc3RhdHMoc3RydWN0IHNlcV9maWxlICptLCBpbnQgY3B1KTsKIAogZXh0ZXJuIHZvaWQgaW5pdF9jZnNfcnEoc3RydWN0IGNmc19ycSAqY2ZzX3JxKTsKLWV4dGVybiB2b2lkIGluaXRfcnRfcnEoc3RydWN0IHJ0X3JxICpydF9ycSwgc3RydWN0IHJxICpycSk7Ci1leHRlcm4gdm9pZCBpbml0X2RsX3JxKHN0cnVjdCBkbF9ycSAqZGxfcnEsIHN0cnVjdCBycSAqcnEpOworZXh0ZXJuIHZvaWQgaW5pdF9ydF9ycShzdHJ1Y3QgcnRfcnEgKnJ0X3JxKTsKK2V4dGVybiB2b2lkIGluaXRfZGxfcnEoc3RydWN0IGRsX3JxICpkbF9ycSk7CiAKIGV4dGVybiB2b2lkIGNmc19iYW5kd2lkdGhfdXNhZ2VfaW5jKHZvaWQpOwogZXh0ZXJuIHZvaWQgY2ZzX2JhbmR3aWR0aF91c2FnZV9kZWModm9pZCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvc21wYm9vdC5jIGIva2VybmVsL3NtcGJvb3QuYwppbmRleCA0MDE5MGYyLi5jNjk3ZjczIDEwMDY0NAotLS0gYS9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2tlcm5lbC9zbXBib290LmMKQEAgLTQsNiArNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTMxNCwzICszMTUsMTU4IEBACiAJcHV0X29ubGluZV9jcHVzKCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbXBib290X3VucmVnaXN0ZXJfcGVyY3B1X3RocmVhZCk7CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShhdG9taWNfdCwgY3B1X2hvdHBsdWdfc3RhdGUpID0gQVRPTUlDX0lOSVQoQ1BVX1BPU1RfREVBRCk7CisKKy8qCisgKiBDYWxsZWQgdG8gcG9sbCBzcGVjaWZpZWQgQ1BVJ3Mgc3RhdGUsIGZvciBleGFtcGxlLCB3aGVuIHdhaXRpbmcgZm9yCisgKiBhIENQVSB0byBjb21lIG9ubGluZS4KKyAqLworaW50IGNwdV9yZXBvcnRfc3RhdGUoaW50IGNwdSkKK3sKKwlyZXR1cm4gYXRvbWljX3JlYWQoJnBlcl9jcHUoY3B1X2hvdHBsdWdfc3RhdGUsIGNwdSkpOworfQorCisvKgorICogSWYgQ1BVIGhhcyBkaWVkIHByb3Blcmx5LCBzZXQgaXRzIHN0YXRlIHRvIENQVV9VUF9QUkVQQVJFIGFuZAorICogcmV0dXJuIHN1Y2Nlc3MuICBPdGhlcndpc2UsIHJldHVybiAtRUJVU1kgaWYgdGhlIENQVSBkaWVkIGFmdGVyCisgKiBjcHVfd2FpdF9kZWF0aCgpIHRpbWVkIG91dC4gIEFuZCB5ZXQgb3RoZXJ3aXNlIGFnYWluLCByZXR1cm4gLUVBR0FJTgorICogaWYgY3B1X3dhaXRfZGVhdGgoKSB0aW1lZCBvdXQgYW5kIHRoZSBDUFUgc3RpbGwgaGFzbid0IGdvdHRlbiBhcm91bmQKKyAqIHRvIGR5aW5nLiAgSW4gdGhlIGxhdHRlciB0d28gY2FzZXMsIHRoZSBDUFUgbWlnaHQgbm90IGJlIHNldCB1cAorICogcHJvcGVybHksIGJ1dCBpdCBpcyB1cCB0byB0aGUgYXJjaC1zcGVjaWZpYyBjb2RlIHRvIGRlY2lkZS4KKyAqIEZpbmFsbHksIC1FSU8gaW5kaWNhdGVzIGFuIHVuYW50aWNpcGF0ZWQgcHJvYmxlbS4KKyAqCisgKiBOb3RlIHRoYXQgaXQgaXMgcGVybWlzc2libGUgdG8gb21pdCB0aGlzIGNhbGwgZW50aXJlbHksIGFzIGlzCisgKiBkb25lIGluIGFyY2hpdGVjdHVyZXMgdGhhdCBkbyBubyBDUFUtaG90cGx1ZyBlcnJvciBjaGVja2luZy4KKyAqLworaW50IGNwdV9jaGVja191cF9wcmVwYXJlKGludCBjcHUpCit7CisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19IT1RQTFVHX0NQVSkpIHsKKwkJYXRvbWljX3NldCgmcGVyX2NwdShjcHVfaG90cGx1Z19zdGF0ZSwgY3B1KSwgQ1BVX1VQX1BSRVBBUkUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGF0b21pY19yZWFkKCZwZXJfY3B1KGNwdV9ob3RwbHVnX3N0YXRlLCBjcHUpKSkgeworCisJY2FzZSBDUFVfUE9TVF9ERUFEOgorCisJCS8qIFRoZSBDUFUgZGllZCBwcm9wZXJseSwgc28ganVzdCBzdGFydCBpdCB1cCBhZ2Fpbi4gKi8KKwkJYXRvbWljX3NldCgmcGVyX2NwdShjcHVfaG90cGx1Z19zdGF0ZSwgY3B1KSwgQ1BVX1VQX1BSRVBBUkUpOworCQlyZXR1cm4gMDsKKworCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgorCisJCS8qCisJCSAqIFRpbWVvdXQgZHVyaW5nIENQVSBkZWF0aCwgc28gbGV0IGNhbGxlciBrbm93LgorCQkgKiBUaGUgb3V0Z29pbmcgQ1BVIGNvbXBsZXRlZCBpdHMgcHJvY2Vzc2luZywgYnV0IGFmdGVyCisJCSAqIGNwdV93YWl0X2RlYXRoKCkgdGltZWQgb3V0IGFuZCByZXBvcnRlZCB0aGUgZXJyb3IuIFRoZQorCQkgKiBjYWxsZXIgaXMgZnJlZSB0byBwcm9jZWVkLCBpbiB3aGljaCBjYXNlIHRoZSBzdGF0ZQorCQkgKiB3aWxsIGJlIHJlc2V0IHByb3Blcmx5IGJ5IGNwdV9zZXRfc3RhdGVfb25saW5lKCkuCisJCSAqIFByb2NlZWRpbmcgZGVzcGl0ZSB0aGlzIC1FQlVTWSByZXR1cm4gbWFrZXMgc2Vuc2UKKwkJICogZm9yIHN5c3RlbXMgd2hlcmUgdGhlIG91dGdvaW5nIENQVXMgdGFrZSB0aGVtc2VsdmVzCisJCSAqIG9mZmxpbmUsIHdpdGggbm8gcG9zdC1kZWF0aCBtYW5pcHVsYXRpb24gcmVxdWlyZWQgZnJvbQorCQkgKiBhIHN1cnZpdmluZyBDUFUuCisJCSAqLworCQlyZXR1cm4gLUVCVVNZOworCisJY2FzZSBDUFVfQlJPS0VOOgorCisJCS8qCisJCSAqIFRoZSBtb3N0IGxpa2VseSByZWFzb24gd2UgZ290IGhlcmUgaXMgdGhhdCB0aGVyZSB3YXMKKwkJICogYSB0aW1lb3V0IGR1cmluZyBDUFUgZGVhdGgsIGFuZCB0aGUgb3V0Z29pbmcgQ1BVIG5ldmVyCisJCSAqIGRpZCBjb21wbGV0ZSBpdHMgcHJvY2Vzc2luZy4gIFRoaXMgY291bGQgaGFwcGVuIG9uCisJCSAqIGEgdmlydHVhbGl6ZWQgc3lzdGVtIGlmIHRoZSBvdXRnb2luZyBWQ1BVIGdldHMgcHJlZW1wdGVkCisJCSAqIGZvciBtb3JlIHRoYW4gZml2ZSBzZWNvbmRzLCBhbmQgdGhlIHVzZXIgYXR0ZW1wdHMgdG8KKwkJICogaW1tZWRpYXRlbHkgb25saW5lIHRoYXQgc2FtZSBDUFUuICBUcnlpbmcgYWdhaW4gbGF0ZXIKKwkJICogbWlnaHQgcmV0dXJuIC1FQlVTWSBhYm92ZSwgaGVuY2UgLUVBR0FJTi4KKwkJICovCisJCXJldHVybiAtRUFHQUlOOworCisJZGVmYXVsdDoKKworCQkvKiBTaG91bGQgbm90IGhhcHBlbi4gIEZhbW91cyBsYXN0IHdvcmRzLiAqLworCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKKy8qCisgKiBNYXJrIHRoZSBzcGVjaWZpZWQgQ1BVIG9ubGluZS4KKyAqCisgKiBOb3RlIHRoYXQgaXQgaXMgcGVybWlzc2libGUgdG8gb21pdCB0aGlzIGNhbGwgZW50aXJlbHksIGFzIGlzCisgKiBkb25lIGluIGFyY2hpdGVjdHVyZXMgdGhhdCBkbyBubyBDUFUtaG90cGx1ZyBlcnJvciBjaGVja2luZy4KKyAqLwordm9pZCBjcHVfc2V0X3N0YXRlX29ubGluZShpbnQgY3B1KQoreworCSh2b2lkKWF0b21pY194Y2hnKCZwZXJfY3B1KGNwdV9ob3RwbHVnX3N0YXRlLCBjcHUpLCBDUFVfT05MSU5FKTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCisvKgorICogV2FpdCBmb3IgdGhlIHNwZWNpZmllZCBDUFUgdG8gZXhpdCB0aGUgaWRsZSBsb29wIGFuZCBkaWUuCisgKi8KK2Jvb2wgY3B1X3dhaXRfZGVhdGgodW5zaWduZWQgaW50IGNwdSwgaW50IHNlY29uZHMpCit7CisJaW50IGpmX2xlZnQgPSBzZWNvbmRzICogSFo7CisJaW50IG9sZHN0YXRlOworCWJvb2wgcmV0ID0gdHJ1ZTsKKwlpbnQgc2xlZXBfamYgPSAxOworCisJbWlnaHRfc2xlZXAoKTsKKworCS8qIFRoZSBvdXRnb2luZyBDUFUgd2lsbCBub3JtYWxseSBnZXQgZG9uZSBxdWl0ZSBxdWlja2x5LiAqLworCWlmIChhdG9taWNfcmVhZCgmcGVyX2NwdShjcHVfaG90cGx1Z19zdGF0ZSwgY3B1KSkgPT0gQ1BVX0RFQUQpCisJCWdvdG8gdXBkYXRlX3N0YXRlOworCXVkZWxheSg1KTsKKworCS8qIEJ1dCBpZiB0aGUgb3V0Z29pbmcgQ1BVIGRhd2RsZXMsIHdhaXQgaW5jcmVhc2luZ2x5IGxvbmcgdGltZXMuICovCisJd2hpbGUgKGF0b21pY19yZWFkKCZwZXJfY3B1KGNwdV9ob3RwbHVnX3N0YXRlLCBjcHUpKSAhPSBDUFVfREVBRCkgeworCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShzbGVlcF9qZik7CisJCWpmX2xlZnQgLT0gc2xlZXBfamY7CisJCWlmIChqZl9sZWZ0IDw9IDApCisJCQlicmVhazsKKwkJc2xlZXBfamYgPSBESVZfUk9VTkRfVVAoc2xlZXBfamYgKiAxMSwgMTApOworCX0KK3VwZGF0ZV9zdGF0ZToKKwlvbGRzdGF0ZSA9IGF0b21pY19yZWFkKCZwZXJfY3B1KGNwdV9ob3RwbHVnX3N0YXRlLCBjcHUpKTsKKwlpZiAob2xkc3RhdGUgPT0gQ1BVX0RFQUQpIHsKKwkJLyogT3V0Z29pbmcgQ1BVIGRpZWQgbm9ybWFsbHksIHVwZGF0ZSBzdGF0ZS4gKi8KKwkJc21wX21iKCk7IC8qIGF0b21pY19yZWFkKCkgYmVmb3JlIHVwZGF0ZS4gKi8KKwkJYXRvbWljX3NldCgmcGVyX2NwdShjcHVfaG90cGx1Z19zdGF0ZSwgY3B1KSwgQ1BVX1BPU1RfREVBRCk7CisJfSBlbHNlIHsKKwkJLyogT3V0Z29pbmcgQ1BVIHN0aWxsIGhhc24ndCBkaWVkLCBzZXQgc3RhdGUgYWNjb3JkaW5nbHkuICovCisJCWlmIChhdG9taWNfY21weGNoZygmcGVyX2NwdShjcHVfaG90cGx1Z19zdGF0ZSwgY3B1KSwKKwkJCQkgICBvbGRzdGF0ZSwgQ1BVX0JST0tFTikgIT0gb2xkc3RhdGUpCisJCQlnb3RvIHVwZGF0ZV9zdGF0ZTsKKwkJcmV0ID0gZmFsc2U7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDYWxsZWQgYnkgdGhlIG91dGdvaW5nIENQVSB0byByZXBvcnQgaXRzIHN1Y2Nlc3NmdWwgZGVhdGguICBSZXR1cm4KKyAqIGZhbHNlIGlmIHRoaXMgcmVwb3J0IGZvbGxvd3MgdGhlIHN1cnZpdmluZyBDUFUncyB0aW1pbmcgb3V0LgorICoKKyAqIEEgc2VwYXJhdGUgIkNQVV9ERUFEX0ZST1pFTiIgaXMgdXNlZCB3aGVuIHRoZSBzdXJ2aXZpbmcgQ1BVCisgKiB0aW1lZCBvdXQuICBUaGlzIGFwcHJvYWNoIGFsbG93cyBhcmNoaXRlY3R1cmVzIHRvIG9taXQgY2FsbHMgdG8KKyAqIGNwdV9jaGVja191cF9wcmVwYXJlKCkgYW5kIGNwdV9zZXRfc3RhdGVfb25saW5lKCkgd2l0aG91dCBkZWZlYXRpbmcKKyAqIHRoZSBuZXh0IGNwdV93YWl0X2RlYXRoKCkncyBwb2xsaW5nIGxvb3AuCisgKi8KK2Jvb2wgY3B1X3JlcG9ydF9kZWF0aCh2b2lkKQoreworCWludCBvbGRzdGF0ZTsKKwlpbnQgbmV3c3RhdGU7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWRvIHsKKwkJb2xkc3RhdGUgPSBhdG9taWNfcmVhZCgmcGVyX2NwdShjcHVfaG90cGx1Z19zdGF0ZSwgY3B1KSk7CisJCWlmIChvbGRzdGF0ZSAhPSBDUFVfQlJPS0VOKQorCQkJbmV3c3RhdGUgPSBDUFVfREVBRDsKKwkJZWxzZQorCQkJbmV3c3RhdGUgPSBDUFVfREVBRF9GUk9aRU47CisJfSB3aGlsZSAoYXRvbWljX2NtcHhjaGcoJnBlcl9jcHUoY3B1X2hvdHBsdWdfc3RhdGUsIGNwdSksCisJCQkJb2xkc3RhdGUsIG5ld3N0YXRlKSAhPSBvbGRzdGF0ZSk7CisJcmV0dXJuIG5ld3N0YXRlID09IENQVV9ERUFEOworfQorCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IGEwM2Q5Y2QuLjNiZTM0NDkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTMyNSw2ICszMjUsNyBAQAogICogU01QOiBUaGVyZSBhcmUgbm90IHJhY2VzLCB0aGUgR0lEcyBhcmUgY2hlY2tlZCBvbmx5IGJ5IGZpbGVzeXN0ZW0KICAqICAgICAgb3BlcmF0aW9ucyAoYXMgZmFyIGFzIHNlbWFudGljIHByZXNlcnZhdGlvbiBpcyBjb25jZXJuZWQpLgogICovCisjaWZkZWYgQ09ORklHX01VTFRJVVNFUgogU1lTQ0FMTF9ERUZJTkUyKHNldHJlZ2lkLCBnaWRfdCwgcmdpZCwgZ2lkX3QsIGVnaWQpCiB7CiAJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpucyA9IGN1cnJlbnRfdXNlcl9ucygpOwpAQCAtODE1LDYgKzgxNiw3IEBACiAJY29tbWl0X2NyZWRzKG5ldyk7CiAJcmV0dXJuIG9sZF9mc2dpZDsKIH0KKyNlbmRpZiAvKiBDT05GSUdfTVVMVElVU0VSICovCiAKIC8qKgogICogc3lzX2dldHBpZCAtIHJldHVybiB0aGUgdGhyZWFkIGdyb3VwIGlkIG9mIHRoZSBjdXJyZW50IHByb2Nlc3MKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNfbmkuYyBiL2tlcm5lbC9zeXNfbmkuYwppbmRleCA1YWRjYjBhLi43OTk1ZWY1IDEwMDY0NAotLS0gYS9rZXJuZWwvc3lzX25pLmMKKysrIGIva2VybmVsL3N5c19uaS5jCkBAIC0xNTksNiArMTU5LDIwIEBACiBjb25kX3N5c2NhbGwoc3lzX2ZhZHZpc2U2NCk7CiBjb25kX3N5c2NhbGwoc3lzX2ZhZHZpc2U2NF82NCk7CiBjb25kX3N5c2NhbGwoc3lzX21hZHZpc2UpOworY29uZF9zeXNjYWxsKHN5c19zZXR1aWQpOworY29uZF9zeXNjYWxsKHN5c19zZXRyZWdpZCk7Citjb25kX3N5c2NhbGwoc3lzX3NldGdpZCk7Citjb25kX3N5c2NhbGwoc3lzX3NldHJldWlkKTsKK2NvbmRfc3lzY2FsbChzeXNfc2V0cmVzdWlkKTsKK2NvbmRfc3lzY2FsbChzeXNfZ2V0cmVzdWlkKTsKK2NvbmRfc3lzY2FsbChzeXNfc2V0cmVzZ2lkKTsKK2NvbmRfc3lzY2FsbChzeXNfZ2V0cmVzZ2lkKTsKK2NvbmRfc3lzY2FsbChzeXNfc2V0Z3JvdXBzKTsKK2NvbmRfc3lzY2FsbChzeXNfZ2V0Z3JvdXBzKTsKK2NvbmRfc3lzY2FsbChzeXNfc2V0ZnN1aWQpOworY29uZF9zeXNjYWxsKHN5c19zZXRmc2dpZCk7Citjb25kX3N5c2NhbGwoc3lzX2NhcGdldCk7Citjb25kX3N5c2NhbGwoc3lzX2NhcHNldCk7CiAKIC8qIGFyY2gtc3BlY2lmaWMgd2VhayBzeXNjYWxsIGVudHJpZXMgKi8KIGNvbmRfc3lzY2FsbChzeXNfcGNpY29uZmlnX3JlYWQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IDg4ZWEyZDYuLjQyYjdmYzIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtODQ2LDcgKzg0Nyw3IEBACiAJCS5kYXRhICAgICAgICAgICA9ICZ3YXRjaGRvZ191c2VyX2VuYWJsZWQsCiAJCS5tYXhsZW4gICAgICAgICA9IHNpemVvZiAoaW50KSwKIAkJLm1vZGUgICAgICAgICAgID0gMDY0NCwKLQkJLnByb2NfaGFuZGxlciAgID0gcHJvY19kb3dhdGNoZG9nLAorCQkucHJvY19oYW5kbGVyICAgPSBwcm9jX3dhdGNoZG9nLAogCQkuZXh0cmExCQk9ICZ6ZXJvLAogCQkuZXh0cmEyCQk9ICZvbmUsCiAJfSwKQEAgLTg1NSwxMSArODU2LDMzIEBACiAJCS5kYXRhCQk9ICZ3YXRjaGRvZ190aHJlc2gsCiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2Rvd2F0Y2hkb2csCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX3dhdGNoZG9nX3RocmVzaCwKIAkJLmV4dHJhMQkJPSAmemVybywKIAkJLmV4dHJhMgkJPSAmc2l4dHksCiAJfSwKIAl7CisJCS5wcm9jbmFtZSAgICAgICA9ICJubWlfd2F0Y2hkb2ciLAorCQkuZGF0YSAgICAgICAgICAgPSAmbm1pX3dhdGNoZG9nX2VuYWJsZWQsCisJCS5tYXhsZW4gICAgICAgICA9IHNpemVvZiAoaW50KSwKKwkJLm1vZGUgICAgICAgICAgID0gMDY0NCwKKwkJLnByb2NfaGFuZGxlciAgID0gcHJvY19ubWlfd2F0Y2hkb2csCisJCS5leHRyYTEJCT0gJnplcm8sCisjaWYgZGVmaW5lZChDT05GSUdfSEFWRV9OTUlfV0FUQ0hET0cpIHx8IGRlZmluZWQoQ09ORklHX0hBUkRMT0NLVVBfREVURUNUT1IpCisJCS5leHRyYTIJCT0gJm9uZSwKKyNlbHNlCisJCS5leHRyYTIJCT0gJnplcm8sCisjZW5kaWYKKwl9LAorCXsKKwkJLnByb2NuYW1lICAgICAgID0gInNvZnRfd2F0Y2hkb2ciLAorCQkuZGF0YSAgICAgICAgICAgPSAmc29mdF93YXRjaGRvZ19lbmFibGVkLAorCQkubWF4bGVuICAgICAgICAgPSBzaXplb2YgKGludCksCisJCS5tb2RlICAgICAgICAgICA9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIgICA9IHByb2Nfc29mdF93YXRjaGRvZywKKwkJLmV4dHJhMQkJPSAmemVybywKKwkJLmV4dHJhMgkJPSAmb25lLAorCX0sCisJewogCQkucHJvY25hbWUJPSAic29mdGxvY2t1cF9wYW5pYyIsCiAJCS5kYXRhCQk9ICZzb2Z0bG9ja3VwX3BhbmljLAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLApAQCAtODc5LDE1ICs5MDIsNiBAQAogCQkuZXh0cmEyCQk9ICZvbmUsCiAJfSwKICNlbmRpZiAvKiBDT05GSUdfU01QICovCi0JewotCQkucHJvY25hbWUgICAgICAgPSAibm1pX3dhdGNoZG9nIiwKLQkJLmRhdGEgICAgICAgICAgID0gJndhdGNoZG9nX3VzZXJfZW5hYmxlZCwKLQkJLm1heGxlbiAgICAgICAgID0gc2l6ZW9mIChpbnQpLAotCQkubW9kZSAgICAgICAgICAgPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyICAgPSBwcm9jX2Rvd2F0Y2hkb2csCi0JCS5leHRyYTEJCT0gJnplcm8sCi0JCS5leHRyYTIJCT0gJm9uZSwKLQl9LAogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1g4NikKIAl7CkBAIC0xMjI4LDYgKzEyNDIsMTQgQEAKIAkJLmV4dHJhMQkJPSAmemVybywKIAl9LAogCXsKKwkJLnByb2NuYW1lCT0gImRpcnR5dGltZV9leHBpcmVfc2Vjb25kcyIsCisJCS5kYXRhCQk9ICZkaXJ0eXRpbWVfZXhwaXJlX2ludGVydmFsLAorCQkubWF4bGVuCQk9IHNpemVvZihkaXJ0eV9leHBpcmVfaW50ZXJ2YWwpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gZGlydHl0aW1lX2ludGVydmFsX2hhbmRsZXIsCisJCS5leHRyYTEJCT0gJnplcm8sCisJfSwKKwl7CiAJCS5wcm9jbmFtZSAgICAgICA9ICJucl9wZGZsdXNoX3RocmVhZHMiLAogCQkubW9kZSAgICAgICAgICAgPSAwNDQ0IC8qIHJlYWQtb25seSAqLywKIAkJLnByb2NfaGFuZGxlciAgID0gcGRmbHVzaF9wcm9jX29ic29sZXRlLApAQCAtMTMxMyw2ICsxMzM1LDE1IEBACiAJCS5leHRyYTEJCT0gJm1pbl9leHRmcmFnX3RocmVzaG9sZCwKIAkJLmV4dHJhMgkJPSAmbWF4X2V4dGZyYWdfdGhyZXNob2xkLAogCX0sCisJeworCQkucHJvY25hbWUJPSAiY29tcGFjdF91bmV2aWN0YWJsZV9hbGxvd2VkIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9jb21wYWN0X3VuZXZpY3RhYmxlX2FsbG93ZWQsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCQkuZXh0cmExCQk9ICZ6ZXJvLAorCQkuZXh0cmEyCQk9ICZvbmUsCisJfSwKIAogI2VuZGlmIC8qIENPTkZJR19DT01QQUNUSU9OICovCiAJewpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvS2NvbmZpZyBiL2tlcm5lbC90aW1lL0tjb25maWcKaW5kZXggZDYyNmRjOS4uNTc5Y2UxYiAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvS2NvbmZpZworKysgYi9rZXJuZWwvdGltZS9LY29uZmlnCkBAIC0zMywxMiArMzMsNiBAQAogY29uZmlnIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKIAlib29sCiAKLSMgTWlncmF0aW9uIGhlbHBlci4gQnVpbGRzLCBidXQgZG9lcyBub3QgaW52b2tlCi1jb25maWcgR0VORVJJQ19DTE9DS0VWRU5UU19CVUlMRAotCWJvb2wKLQlkZWZhdWx0IHkKLQlkZXBlbmRzIG9uIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKLQogIyBBcmNoaXRlY3R1cmUgY2FuIGhhbmRsZSBicm9hZGNhc3QgaW4gYSBkcml2ZXItYWdub3N0aWMgd2F5CiBjb25maWcgQVJDSF9IQVNfVElDS19CUk9BRENBU1QKIAlib29sCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9NYWtlZmlsZSBiL2tlcm5lbC90aW1lL01ha2VmaWxlCmluZGV4IGMwOWMwNzguLjAxZjAzMTIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL01ha2VmaWxlCisrKyBiL2tlcm5lbC90aW1lL01ha2VmaWxlCkBAIC0yLDE1ICsyLDEzIEBACiBvYmoteSArPSB0aW1la2VlcGluZy5vIG50cC5vIGNsb2Nrc291cmNlLm8gamlmZmllcy5vIHRpbWVyX2xpc3Qubwogb2JqLXkgKz0gdGltZWNvbnYubyB0aW1lY291bnRlci5vIHBvc2l4LWNsb2NrLm8gYWxhcm10aW1lci5vCiAKLW9iai0kKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEKQkJKz0gY2xvY2tldmVudHMubwotb2JqLSQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMpCQkrPSB0aWNrLWNvbW1vbi5vCitvYmotJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUykJCSs9IGNsb2NrZXZlbnRzLm8gdGljay1jb21tb24ubwogaWZlcSAoJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpLHkpCiAgb2JqLXkJCQkJCQkrPSB0aWNrLWJyb2FkY2FzdC5vCiAgb2JqLSQoQ09ORklHX1RJQ0tfT05FU0hPVCkJCQkrPSB0aWNrLWJyb2FkY2FzdC1ocnRpbWVyLm8KIGVuZGlmCiBvYmotJChDT05GSUdfR0VORVJJQ19TQ0hFRF9DTE9DSykJCSs9IHNjaGVkX2Nsb2NrLm8KLW9iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1vbmVzaG90Lm8KLW9iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1zY2hlZC5vCitvYmotJChDT05GSUdfVElDS19PTkVTSE9UKQkJCSs9IHRpY2stb25lc2hvdC5vIHRpY2stc2NoZWQubwogb2JqLSQoQ09ORklHX1RJTUVSX1NUQVRTKQkJCSs9IHRpbWVyX3N0YXRzLm8KIG9iai0kKENPTkZJR19ERUJVR19GUykJCQkJKz0gdGltZWtlZXBpbmdfZGVidWcubwogb2JqLSQoQ09ORklHX1RFU1RfVURFTEFZKQkJCSs9IHRlc3RfdWRlbGF5Lm8KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMgYi9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCmluZGV4IDU1NDQ5OTAuLjI1ZDk0MmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYwpAQCAtOTQsMjUgKzk0LDc2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjbG9ja2V2ZW50X2RlbHRhMm5zKTsKIAorc3RhdGljIGludCBfX2Nsb2NrZXZlbnRzX3NldF9zdGF0ZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsCisJCQkJICAgZW51bSBjbG9ja19ldmVudF9zdGF0ZSBzdGF0ZSkKK3sKKwkvKiBUcmFuc2l0aW9uIHdpdGggbGVnYWN5IHNldF9tb2RlKCkgY2FsbGJhY2sgKi8KKwlpZiAoZGV2LT5zZXRfbW9kZSkgeworCQkvKiBMZWdhY3kgY2FsbGJhY2sgZG9lc24ndCBzdXBwb3J0IG5ldyBtb2RlcyAqLworCQlpZiAoc3RhdGUgPiBDTE9DS19FVlRfU1RBVEVfT05FU0hPVCkKKwkJCXJldHVybiAtRU5PU1lTOworCQkvKgorCQkgKiAnY2xvY2tfZXZlbnRfc3RhdGUnIGFuZCAnY2xvY2tfZXZlbnRfbW9kZScgaGF2ZSAxLXRvLTEKKwkJICogbWFwcGluZyB1bnRpbCAqX09ORVNIT1QsIGFuZCBzbyBhIHNpbXBsZSBjYXN0IHdpbGwgd29yay4KKwkJICovCisJCWRldi0+c2V0X21vZGUoKGVudW0gY2xvY2tfZXZlbnRfbW9kZSlzdGF0ZSwgZGV2KTsKKwkJZGV2LT5tb2RlID0gKGVudW0gY2xvY2tfZXZlbnRfbW9kZSlzdGF0ZTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9EVU1NWSkKKwkJcmV0dXJuIDA7CisKKwkvKiBUcmFuc2l0aW9uIHdpdGggbmV3IHN0YXRlLXNwZWNpZmljIGNhbGxiYWNrcyAqLworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIENMT0NLX0VWVF9TVEFURV9ERVRBQ0hFRDoKKwkJLyoKKwkJICogVGhpcyBpcyBhbiBpbnRlcm5hbCBzdGF0ZSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBnbyBmcm9tCisJCSAqIFNIVVRET1dOIHRvIERFVEFDSEVELiBObyBkcml2ZXIgaW50ZXJhY3Rpb24gcmVxdWlyZWQuCisJCSAqLworCQlyZXR1cm4gMDsKKworCWNhc2UgQ0xPQ0tfRVZUX1NUQVRFX1NIVVRET1dOOgorCQlyZXR1cm4gZGV2LT5zZXRfc3RhdGVfc2h1dGRvd24oZGV2KTsKKworCWNhc2UgQ0xPQ0tfRVZUX1NUQVRFX1BFUklPRElDOgorCQkvKiBDb3JlIGludGVybmFsIGJ1ZyAqLworCQlpZiAoIShkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMpKQorCQkJcmV0dXJuIC1FTk9TWVM7CisJCXJldHVybiBkZXYtPnNldF9zdGF0ZV9wZXJpb2RpYyhkZXYpOworCisJY2FzZSBDTE9DS19FVlRfU1RBVEVfT05FU0hPVDoKKwkJLyogQ29yZSBpbnRlcm5hbCBidWcgKi8KKwkJaWYgKCEoZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX09ORVNIT1QpKQorCQkJcmV0dXJuIC1FTk9TWVM7CisJCXJldHVybiBkZXYtPnNldF9zdGF0ZV9vbmVzaG90KGRldik7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1NZUzsKKwl9Cit9CisKIC8qKgotICogY2xvY2tldmVudHNfc2V0X21vZGUgLSBzZXQgdGhlIG9wZXJhdGluZyBtb2RlIG9mIGEgY2xvY2sgZXZlbnQgZGV2aWNlCisgKiBjbG9ja2V2ZW50c19zZXRfc3RhdGUgLSBzZXQgdGhlIG9wZXJhdGluZyBzdGF0ZSBvZiBhIGNsb2NrIGV2ZW50IGRldmljZQogICogQGRldjoJZGV2aWNlIHRvIG1vZGlmeQotICogQG1vZGU6CW5ldyBtb2RlCisgKiBAc3RhdGU6CW5ldyBzdGF0ZQogICoKICAqIE11c3QgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCAhCiAgKi8KLXZvaWQgY2xvY2tldmVudHNfc2V0X21vZGUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAotCQkJCSBlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSkKK3ZvaWQgY2xvY2tldmVudHNfc2V0X3N0YXRlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKKwkJCSAgIGVudW0gY2xvY2tfZXZlbnRfc3RhdGUgc3RhdGUpCiB7Ci0JaWYgKGRldi0+bW9kZSAhPSBtb2RlKSB7Ci0JCWRldi0+c2V0X21vZGUobW9kZSwgZGV2KTsKLQkJZGV2LT5tb2RlID0gbW9kZTsKKwlpZiAoZGV2LT5zdGF0ZSAhPSBzdGF0ZSkgeworCQlpZiAoX19jbG9ja2V2ZW50c19zZXRfc3RhdGUoZGV2LCBzdGF0ZSkpCisJCQlyZXR1cm47CisKKwkJZGV2LT5zdGF0ZSA9IHN0YXRlOwogCiAJCS8qCiAJCSAqIEEgbnNlYzJjeWMgbXVsdGlwbGljYXRvciBvZiAwIGlzIGludmFsaWQgYW5kIHdlJ2QgY3Jhc2gKIAkJICogb24gaXQsIHNvIGZpeCBpdCB1cCBhbmQgZW1pdCBhIHdhcm5pbmc6CiAJCSAqLwotCQlpZiAobW9kZSA9PSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKSB7CisJCWlmIChzdGF0ZSA9PSBDTE9DS19FVlRfU1RBVEVfT05FU0hPVCkgewogCQkJaWYgKHVubGlrZWx5KCFkZXYtPm11bHQpKSB7CiAJCQkJZGV2LT5tdWx0ID0gMTsKIAkJCQlXQVJOX09OKDEpOwpAQCAtMTI3LDEwICsxNzgsMjggQEAKICAqLwogdm9pZCBjbG9ja2V2ZW50c19zaHV0ZG93bihzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCiB7Ci0JY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7CisJY2xvY2tldmVudHNfc2V0X3N0YXRlKGRldiwgQ0xPQ0tfRVZUX1NUQVRFX1NIVVRET1dOKTsKIAlkZXYtPm5leHRfZXZlbnQudHY2NCA9IEtUSU1FX01BWDsKIH0KIAorLyoqCisgKiBjbG9ja2V2ZW50c190aWNrX3Jlc3VtZSAtCVJlc3VtZSB0aGUgdGljayBkZXZpY2UgYmVmb3JlIHVzaW5nIGl0IGFnYWluCisgKiBAZGV2OgkJCWRldmljZSB0byByZXN1bWUKKyAqLworaW50IGNsb2NrZXZlbnRzX3RpY2tfcmVzdW1lKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZXYtPnNldF9tb2RlKSB7CisJCWRldi0+c2V0X21vZGUoQ0xPQ0tfRVZUX01PREVfUkVTVU1FLCBkZXYpOworCQlkZXYtPm1vZGUgPSBDTE9DS19FVlRfTU9ERV9SRVNVTUU7CisJfSBlbHNlIGlmIChkZXYtPnRpY2tfcmVzdW1lKSB7CisJCXJldCA9IGRldi0+dGlja19yZXN1bWUoZGV2KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfTUlOX0FESlVTVAogCiAvKiBMaW1pdCBtaW5fZGVsdGEgdG8gYSBqaWZmaWUgKi8KQEAgLTE4Myw3ICsyNTIsNyBAQAogCQlkZWx0YSA9IGRldi0+bWluX2RlbHRhX25zOwogCQlkZXYtPm5leHRfZXZlbnQgPSBrdGltZV9hZGRfbnMoa3RpbWVfZ2V0KCksIGRlbHRhKTsKIAotCQlpZiAoZGV2LT5tb2RlID09IENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKQorCQlpZiAoZGV2LT5zdGF0ZSA9PSBDTE9DS19FVlRfU1RBVEVfU0hVVERPV04pCiAJCQlyZXR1cm4gMDsKIAogCQlkZXYtPnJldHJpZXMrKzsKQEAgLTIyMCw3ICsyODksNyBAQAogCWRlbHRhID0gZGV2LT5taW5fZGVsdGFfbnM7CiAJZGV2LT5uZXh0X2V2ZW50ID0ga3RpbWVfYWRkX25zKGt0aW1lX2dldCgpLCBkZWx0YSk7CiAKLQlpZiAoZGV2LT5tb2RlID09IENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKQorCWlmIChkZXYtPnN0YXRlID09IENMT0NLX0VWVF9TVEFURV9TSFVURE9XTikKIAkJcmV0dXJuIDA7CiAKIAlkZXYtPnJldHJpZXMrKzsKQEAgLTI1Miw3ICszMjEsNyBAQAogCiAJZGV2LT5uZXh0X2V2ZW50ID0gZXhwaXJlczsKIAotCWlmIChkZXYtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pCisJaWYgKGRldi0+c3RhdGUgPT0gQ0xPQ0tfRVZUX1NUQVRFX1NIVVRET1dOKQogCQlyZXR1cm4gMDsKIAogCS8qIFNob3J0Y3V0IGZvciBjbG9ja2V2ZW50IGRldmljZXMgdGhhdCBjYW4gZGVhbCB3aXRoIGt0aW1lLiAqLwpAQCAtMjk3LDcgKzM2Niw3IEBACiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCAqbmV3ZGV2ID0gTlVMTDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmY2xvY2tldmVudF9kZXZpY2VzLCBsaXN0KSB7Ci0JCWlmIChkZXYgPT0gY2VkIHx8IGRldi0+bW9kZSAhPSBDTE9DS19FVlRfTU9ERV9VTlVTRUQpCisJCWlmIChkZXYgPT0gY2VkIHx8IGRldi0+c3RhdGUgIT0gQ0xPQ0tfRVZUX1NUQVRFX0RFVEFDSEVEKQogCQkJY29udGludWU7CiAKIAkJaWYgKCF0aWNrX2NoZWNrX3JlcGxhY2VtZW50KG5ld2RldiwgZGV2KSkKQEAgLTMyMyw3ICszOTIsNyBAQAogc3RhdGljIGludCBfX2Nsb2NrZXZlbnRzX3RyeV91bmJpbmQoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2VkLCBpbnQgY3B1KQogewogCS8qIEZhc3QgdHJhY2suIERldmljZSBpcyB1bnVzZWQgKi8KLQlpZiAoY2VkLT5tb2RlID09IENMT0NLX0VWVF9NT0RFX1VOVVNFRCkgeworCWlmIChjZWQtPnN0YXRlID09IENMT0NLX0VWVF9TVEFURV9ERVRBQ0hFRCkgewogCQlsaXN0X2RlbF9pbml0KCZjZWQtPmxpc3QpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0zNzMsNiArNDQyLDM3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjbG9ja2V2ZW50c191bmJpbmQpOwogCisvKiBTYW5pdHkgY2hlY2sgb2Ygc3RhdGUgdHJhbnNpdGlvbiBjYWxsYmFja3MgKi8KK3N0YXRpYyBpbnQgY2xvY2tldmVudHNfc2FuaXR5X2NoZWNrKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwkvKiBMZWdhY3kgc2V0X21vZGUoKSBjYWxsYmFjayAqLworCWlmIChkZXYtPnNldF9tb2RlKSB7CisJCS8qIFdlIHNob3VsZG4ndCBiZSBzdXBwb3J0aW5nIG5ldyBtb2RlcyBub3cgKi8KKwkJV0FSTl9PTihkZXYtPnNldF9zdGF0ZV9wZXJpb2RpYyB8fCBkZXYtPnNldF9zdGF0ZV9vbmVzaG90IHx8CisJCQlkZXYtPnNldF9zdGF0ZV9zaHV0ZG93biB8fCBkZXYtPnRpY2tfcmVzdW1lKTsKKworCQlCVUdfT04oZGV2LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX1VOVVNFRCk7CisJCXJldHVybiAwOworCX0KKworCWlmIChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfRFVNTVkpCisJCXJldHVybiAwOworCisJLyogTmV3IHN0YXRlLXNwZWNpZmljIGNhbGxiYWNrcyAqLworCWlmICghZGV2LT5zZXRfc3RhdGVfc2h1dGRvd24pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMpICYmCisJICAgICFkZXYtPnNldF9zdGF0ZV9wZXJpb2RpYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9PTkVTSE9UKSAmJgorCSAgICAhZGV2LT5zZXRfc3RhdGVfb25lc2hvdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiBjbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UgLSByZWdpc3RlciBhIGNsb2NrIGV2ZW50IGRldmljZQogICogQGRldjoJZGV2aWNlIHRvIHJlZ2lzdGVyCkBAIC0zODEsNyArNDgxLDExIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCUJVR19PTihkZXYtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfVU5VU0VEKTsKKwlCVUdfT04oY2xvY2tldmVudHNfc2FuaXR5X2NoZWNrKGRldikpOworCisJLyogSW5pdGlhbGl6ZSBzdGF0ZSB0byBERVRBQ0hFRCAqLworCWRldi0+c3RhdGUgPSBDTE9DS19FVlRfU1RBVEVfREVUQUNIRUQ7CisKIAlpZiAoIWRldi0+Y3B1bWFzaykgewogCQlXQVJOX09OKG51bV9wb3NzaWJsZV9jcHVzKCkgPiAxKTsKIAkJZGV2LT5jcHVtYXNrID0gY3B1bWFza19vZihzbXBfcHJvY2Vzc29yX2lkKCkpOwpAQCAtNDQ1LDExICs1NDksMTEgQEAKIHsKIAljbG9ja2V2ZW50c19jb25maWcoZGV2LCBmcmVxKTsKIAotCWlmIChkZXYtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCkKKwlpZiAoZGV2LT5zdGF0ZSA9PSBDTE9DS19FVlRfU1RBVEVfT05FU0hPVCkKIAkJcmV0dXJuIGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBkZXYtPm5leHRfZXZlbnQsIGZhbHNlKTsKIAotCWlmIChkZXYtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMpCi0JCWRldi0+c2V0X21vZGUoQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMsIGRldik7CisJaWYgKGRldi0+c3RhdGUgPT0gQ0xPQ0tfRVZUX1NUQVRFX1BFUklPRElDKQorCQlyZXR1cm4gX19jbG9ja2V2ZW50c19zZXRfc3RhdGUoZGV2LCBDTE9DS19FVlRfU1RBVEVfUEVSSU9ESUMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00OTEsMzAgKzU5NSwyNyBAQAogICogQG9sZDoJZGV2aWNlIHRvIHJlbGVhc2UgKGNhbiBiZSBOVUxMKQogICogQG5ldzoJZGV2aWNlIHRvIHJlcXVlc3QgKGNhbiBiZSBOVUxMKQogICoKLSAqIENhbGxlZCBmcm9tIHRoZSBub3RpZmllciBjaGFpbi4gY2xvY2tldmVudHNfbG9jayBpcyBoZWxkIGFscmVhZHkKKyAqIENhbGxlZCBmcm9tIHZhcmlvdXMgdGljayBmdW5jdGlvbnMgd2l0aCBjbG9ja2V2ZW50c19sb2NrIGhlbGQgYW5kCisgKiBpbnRlcnJ1cHRzIGRpc2FibGVkLgogICovCiB2b2lkIGNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpvbGQsCiAJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm5ldykKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCS8qCiAJICogQ2FsbGVyIHJlbGVhc2VzIGEgY2xvY2sgZXZlbnQgZGV2aWNlLiBXZSBxdWV1ZSBpdCBpbnRvIHRoZQogCSAqIHJlbGVhc2VkIGxpc3QgYW5kIGRvIGEgbm90aWZ5IGFkZCBsYXRlci4KIAkgKi8KIAlpZiAob2xkKSB7CiAJCW1vZHVsZV9wdXQob2xkLT5vd25lcik7Ci0JCWNsb2NrZXZlbnRzX3NldF9tb2RlKG9sZCwgQ0xPQ0tfRVZUX01PREVfVU5VU0VEKTsKKwkJY2xvY2tldmVudHNfc2V0X3N0YXRlKG9sZCwgQ0xPQ0tfRVZUX1NUQVRFX0RFVEFDSEVEKTsKIAkJbGlzdF9kZWwoJm9sZC0+bGlzdCk7CiAJCWxpc3RfYWRkKCZvbGQtPmxpc3QsICZjbG9ja2V2ZW50c19yZWxlYXNlZCk7CiAJfQogCiAJaWYgKG5ldykgewotCQlCVUdfT04obmV3LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX1VOVVNFRCk7CisJCUJVR19PTihuZXctPnN0YXRlICE9IENMT0NLX0VWVF9TVEFURV9ERVRBQ0hFRCk7CiAJCWNsb2NrZXZlbnRzX3NodXRkb3duKG5ldyk7CiAJfQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIAogLyoqCkBAIC01NDEsNzQgKzY0Miw0MCBAQAogCQkJZGV2LT5yZXN1bWUoZGV2KTsKIH0KIAotI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiAvKioKLSAqIGNsb2NrZXZlbnRzX25vdGlmeSAtIG5vdGlmaWNhdGlvbiBhYm91dCByZWxldmFudCBldmVudHMKLSAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBhbnkgb3RoZXIgdmFsdWUgb24gZXJyb3IKKyAqIHRpY2tfY2xlYW51cF9kZWFkX2NwdSAtIENsZWFudXAgdGhlIHRpY2sgYW5kIGNsb2NrZXZlbnRzIG9mIGEgZGVhZCBjcHUKICAqLwotaW50IGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKQordm9pZCB0aWNrX2NsZWFudXBfZGVhZF9jcHUoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsICp0bXA7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgY3B1LCByZXQgPSAwOwogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZjbG9ja2V2ZW50c19sb2NrLCBmbGFncyk7CiAKLQlzd2l0Y2ggKHJlYXNvbikgewotCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfT046Ci0JY2FzZSBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9PRkY6Ci0JY2FzZSBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9GT1JDRToKLQkJdGlja19icm9hZGNhc3Rfb25fb2ZmKHJlYXNvbiwgYXJnKTsKLQkJYnJlYWs7Ci0KLQljYXNlIENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VOVEVSOgotCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRVhJVDoKLQkJcmV0ID0gdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHJlYXNvbik7Ci0JCWJyZWFrOwotCi0JY2FzZSBDTE9DS19FVlRfTk9USUZZX0NQVV9EWUlORzoKLQkJdGlja19oYW5kb3Zlcl9kb190aW1lcihhcmcpOwotCQlicmVhazsKLQotCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9TVVNQRU5EOgotCQl0aWNrX3N1c3BlbmQoKTsKLQkJdGlja19zdXNwZW5kX2Jyb2FkY2FzdCgpOwotCQlicmVhazsKLQotCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9SRVNVTUU6Ci0JCXRpY2tfcmVzdW1lKCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBDTE9DS19FVlRfTk9USUZZX0NQVV9ERUFEOgotCQl0aWNrX3NodXRkb3duX2Jyb2FkY2FzdF9vbmVzaG90KGFyZyk7Ci0JCXRpY2tfc2h1dGRvd25fYnJvYWRjYXN0KGFyZyk7Ci0JCXRpY2tfc2h1dGRvd24oYXJnKTsKLQkJLyoKLQkJICogVW5yZWdpc3RlciB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlcyB3aGljaCB3ZXJlCi0JCSAqIHJlbGVhc2VkIGZyb20gdGhlIHVzZXJzIGluIHRoZSBub3RpZnkgY2hhaW4uCi0JCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCB0bXAsICZjbG9ja2V2ZW50c19yZWxlYXNlZCwgbGlzdCkKKwl0aWNrX3NodXRkb3duX2Jyb2FkY2FzdF9vbmVzaG90KGNwdSk7CisJdGlja19zaHV0ZG93bl9icm9hZGNhc3QoY3B1KTsKKwl0aWNrX3NodXRkb3duKGNwdSk7CisJLyoKKwkgKiBVbnJlZ2lzdGVyIHRoZSBjbG9jayBldmVudCBkZXZpY2VzIHdoaWNoIHdlcmUKKwkgKiByZWxlYXNlZCBmcm9tIHRoZSB1c2VycyBpbiB0aGUgbm90aWZ5IGNoYWluLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmNsb2NrZXZlbnRzX3JlbGVhc2VkLCBsaXN0KQorCQlsaXN0X2RlbCgmZGV2LT5saXN0KTsKKwkvKgorCSAqIE5vdyBjaGVjayB3aGV0aGVyIHRoZSBDUFUgaGFzIGxlZnQgdW51c2VkIHBlciBjcHUgZGV2aWNlcworCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXYsIHRtcCwgJmNsb2NrZXZlbnRfZGV2aWNlcywgbGlzdCkgeworCQlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsIGRldi0+Y3B1bWFzaykgJiYKKwkJICAgIGNwdW1hc2tfd2VpZ2h0KGRldi0+Y3B1bWFzaykgPT0gMSAmJgorCQkgICAgIXRpY2tfaXNfYnJvYWRjYXN0X2RldmljZShkZXYpKSB7CisJCQlCVUdfT04oZGV2LT5zdGF0ZSAhPSBDTE9DS19FVlRfU1RBVEVfREVUQUNIRUQpOwogCQkJbGlzdF9kZWwoJmRldi0+bGlzdCk7Ci0JCS8qCi0JCSAqIE5vdyBjaGVjayB3aGV0aGVyIHRoZSBDUFUgaGFzIGxlZnQgdW51c2VkIHBlciBjcHUgZGV2aWNlcwotCQkgKi8KLQkJY3B1ID0gKigoaW50ICopYXJnKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGRldiwgdG1wLCAmY2xvY2tldmVudF9kZXZpY2VzLCBsaXN0KSB7Ci0JCQlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsIGRldi0+Y3B1bWFzaykgJiYKLQkJCSAgICBjcHVtYXNrX3dlaWdodChkZXYtPmNwdW1hc2spID09IDEgJiYKLQkJCSAgICAhdGlja19pc19icm9hZGNhc3RfZGV2aWNlKGRldikpIHsKLQkJCQlCVUdfT04oZGV2LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX1VOVVNFRCk7Ci0JCQkJbGlzdF9kZWwoJmRldi0+bGlzdCk7Ci0JCQl9CiAJCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7CiAJfQogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja2V2ZW50c19sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGNsb2NrZXZlbnRzX25vdGlmeSk7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TWVNGUwogc3RydWN0IGJ1c190eXBlIGNsb2NrZXZlbnRzX3N1YnN5cyA9IHsKQEAgLTcyNyw1ICs3OTQsMyBAQAogfQogZGV2aWNlX2luaXRjYWxsKGNsb2NrZXZlbnRzX2luaXRfc3lzZnMpOwogI2VuZGlmIC8qIFNZU0ZTICovCi0KLSNlbmRpZiAvKiBHRU5FUklDX0NMT0NLX0VWRU5UUyAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYyBiL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKaW5kZXggNDg5MjM1Mi4uMTVmYWNiMSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYworKysgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCkBAIC0xNDIsMTMgKzE0Miw2IEBACiAJCXNjaGVkdWxlX3dvcmsoJndhdGNoZG9nX3dvcmspOwogfQogCi1zdGF0aWMgdm9pZCBjbG9ja3NvdXJjZV91bnN0YWJsZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCBpbnQ2NF90IGRlbHRhKQotewotCXByaW50ayhLRVJOX1dBUk5JTkcgIkNsb2Nrc291cmNlICVzIHVuc3RhYmxlIChkZWx0YSA9ICVMZCBucylcbiIsCi0JICAgICAgIGNzLT5uYW1lLCBkZWx0YSk7Ci0JX19jbG9ja3NvdXJjZV91bnN0YWJsZShjcyk7Ci19Ci0KIC8qKgogICogY2xvY2tzb3VyY2VfbWFya191bnN0YWJsZSAtIG1hcmsgY2xvY2tzb3VyY2UgdW5zdGFibGUgdmlhIHdhdGNoZG9nCiAgKiBAY3M6CQljbG9ja3NvdXJjZSB0byBiZSBtYXJrZWQgdW5zdGFibGUKQEAgLTE3NCw3ICsxNjcsNyBAQAogc3RhdGljIHZvaWQgY2xvY2tzb3VyY2Vfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBjbG9ja3NvdXJjZSAqY3M7Ci0JY3ljbGVfdCBjc25vdywgd2Rub3csIGRlbHRhOworCWN5Y2xlX3QgY3Nub3csIHdkbm93LCBjc2xhc3QsIHdkbGFzdCwgZGVsdGE7CiAJaW50NjRfdCB3ZF9uc2VjLCBjc19uc2VjOwogCWludCBuZXh0X2NwdSwgcmVzZXRfcGVuZGluZzsKIApAQCAtMjEzLDYgKzIwNiw4IEBACiAKIAkJZGVsdGEgPSBjbG9ja3NvdXJjZV9kZWx0YShjc25vdywgY3MtPmNzX2xhc3QsIGNzLT5tYXNrKTsKIAkJY3NfbnNlYyA9IGNsb2Nrc291cmNlX2N5YzJucyhkZWx0YSwgY3MtPm11bHQsIGNzLT5zaGlmdCk7CisJCXdkbGFzdCA9IGNzLT53ZF9sYXN0OyAvKiBzYXZlIHRoZXNlIGluIGNhc2Ugd2UgcHJpbnQgdGhlbSAqLworCQljc2xhc3QgPSBjcy0+Y3NfbGFzdDsKIAkJY3MtPmNzX2xhc3QgPSBjc25vdzsKIAkJY3MtPndkX2xhc3QgPSB3ZG5vdzsKIApAQCAtMjIxLDcgKzIxNiwxMiBAQAogCiAJCS8qIENoZWNrIHRoZSBkZXZpYXRpb24gZnJvbSB0aGUgd2F0Y2hkb2cgY2xvY2tzb3VyY2UuICovCiAJCWlmICgoYWJzKGNzX25zZWMgLSB3ZF9uc2VjKSA+IFdBVENIRE9HX1RIUkVTSE9MRCkpIHsKLQkJCWNsb2Nrc291cmNlX3Vuc3RhYmxlKGNzLCBjc19uc2VjIC0gd2RfbnNlYyk7CisJCQlwcl93YXJuKCJ0aW1la2VlcGluZyB3YXRjaGRvZzogTWFya2luZyBjbG9ja3NvdXJjZSAnJXMnIGFzIHVuc3RhYmxlLCBiZWNhdXNlIHRoZSBza2V3IGlzIHRvbyBsYXJnZTpcbiIsIGNzLT5uYW1lKTsKKwkJCXByX3dhcm4oIgknJXMnIHdkX25vdzogJWxseCB3ZF9sYXN0OiAlbGx4IG1hc2s6ICVsbHhcbiIsCisJCQkJd2F0Y2hkb2ctPm5hbWUsIHdkbm93LCB3ZGxhc3QsIHdhdGNoZG9nLT5tYXNrKTsKKwkJCXByX3dhcm4oIgknJXMnIGNzX25vdzogJWxseCBjc19sYXN0OiAlbGx4IG1hc2s6ICVsbHhcbiIsCisJCQkJY3MtPm5hbWUsIGNzbm93LCBjc2xhc3QsIGNzLT5tYXNrKTsKKwkJCV9fY2xvY2tzb3VyY2VfdW5zdGFibGUoY3MpOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtNDY5LDI2ICs0NjksMjUgQEAKICAqIEBzaGlmdDoJY3ljbGUgdG8gbmFub3NlY29uZCBkaXZpc29yIChwb3dlciBvZiB0d28pCiAgKiBAbWF4YWRqOgltYXhpbXVtIGFkanVzdG1lbnQgdmFsdWUgdG8gbXVsdCAofjExJSkKICAqIEBtYXNrOgliaXRtYXNrIGZvciB0d28ncyBjb21wbGVtZW50IHN1YnRyYWN0aW9uIG9mIG5vbiA2NCBiaXQgY291bnRlcnMKKyAqIEBtYXhfY3ljOgltYXhpbXVtIGN5Y2xlIHZhbHVlIGJlZm9yZSBwb3RlbnRpYWwgb3ZlcmZsb3cgKGRvZXMgbm90IGluY2x1ZGUKKyAqCQlhbnkgc2FmZXR5IG1hcmdpbikKKyAqCisgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGluY2x1ZGVzIGEgc2FmZXR5IG1hcmdpbiBvZiA1MCUsIGluIG90aGVyIHdvcmRzLCB3ZQorICogcmV0dXJuIGhhbGYgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyB0aGUgaGFyZHdhcmUgY291bnRlciBjYW4gdGVjaG5pY2FsbHkKKyAqIGNvdmVyLiBUaGlzIGlzIGRvbmUgc28gdGhhdCB3ZSBjYW4gcG90ZW50aWFsbHkgZGV0ZWN0IHByb2JsZW1zIGNhdXNlZCBieQorICogZGVsYXllZCB0aW1lcnMgb3IgYmFkIGhhcmR3YXJlLCB3aGljaCBtaWdodCByZXN1bHQgaW4gdGltZSBpbnRlcnZhbHMgdGhhdAorICogYXJlIGxhcmdlciB0aGVuIHdoYXQgdGhlIG1hdGggdXNlZCBjYW4gaGFuZGxlIHdpdGhvdXQgb3ZlcmZsb3dzLgogICovCi11NjQgY2xvY2tzX2NhbGNfbWF4X25zZWNzKHUzMiBtdWx0LCB1MzIgc2hpZnQsIHUzMiBtYXhhZGosIHU2NCBtYXNrKQordTY0IGNsb2Nrc19jYWxjX21heF9uc2Vjcyh1MzIgbXVsdCwgdTMyIHNoaWZ0LCB1MzIgbWF4YWRqLCB1NjQgbWFzaywgdTY0ICptYXhfY3ljKQogewogCXU2NCBtYXhfbnNlY3MsIG1heF9jeWNsZXM7CiAKIAkvKgogCSAqIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgY3ljbGVzIHRoYXQgd2UgY2FuIHBhc3MgdG8gdGhlCi0JICogY3ljMm5zIGZ1bmN0aW9uIHdpdGhvdXQgb3ZlcmZsb3dpbmcgYSA2NC1iaXQgc2lnbmVkIHJlc3VsdC4gVGhlCi0JICogbWF4aW11bSBudW1iZXIgb2YgY3ljbGVzIGlzIGVxdWFsIHRvIFVMTE9OR19NQVgvKG11bHQrbWF4YWRqKQotCSAqIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJlbG93LgotCSAqIG1heF9jeWNsZXMgPCAoMl42MykvKG11bHQgKyBtYXhhZGopCi0JICogbWF4X2N5Y2xlcyA8IDJeKGxvZzIoKDJeNjMpLyhtdWx0ICsgbWF4YWRqKSkpCi0JICogbWF4X2N5Y2xlcyA8IDJeKGxvZzIoMl42MykgLSBsb2cyKG11bHQgKyBtYXhhZGopKQotCSAqIG1heF9jeWNsZXMgPCAyXig2MyAtIGxvZzIobXVsdCArIG1heGFkaikpCi0JICogbWF4X2N5Y2xlcyA8IDEgPDwgKDYzIC0gbG9nMihtdWx0ICsgbWF4YWRqKSkKLQkgKiBQbGVhc2Ugbm90ZSB0aGF0IHdlIGFkZCAxIHRvIHRoZSByZXN1bHQgb2YgdGhlIGxvZzIgdG8gYWNjb3VudCBmb3IKLQkgKiBhbnkgcm91bmRpbmcgZXJyb3JzLCBlbnN1cmUgdGhlIGFib3ZlIGluZXF1YWxpdHkgaXMgc2F0aXNmaWVkIGFuZAotCSAqIG5vIG92ZXJmbG93IHdpbGwgb2NjdXIuCisJICogY3ljMm5zKCkgZnVuY3Rpb24gd2l0aG91dCBvdmVyZmxvd2luZyBhIDY0LWJpdCByZXN1bHQuCiAJICovCi0JbWF4X2N5Y2xlcyA9IDFVTEwgPDwgKDYzIC0gKGlsb2cyKG11bHQgKyBtYXhhZGopICsgMSkpOworCW1heF9jeWNsZXMgPSBVTExPTkdfTUFYOworCWRvX2RpdihtYXhfY3ljbGVzLCBtdWx0K21heGFkaik7CiAKIAkvKgogCSAqIFRoZSBhY3R1YWwgbWF4aW11bSBudW1iZXIgb2YgY3ljbGVzIHdlIGNhbiBkZWZlciB0aGUgY2xvY2tzb3VyY2UgaXMKQEAgLTQ5OSwyNyArNDk4LDI2IEBACiAJbWF4X2N5Y2xlcyA9IG1pbihtYXhfY3ljbGVzLCBtYXNrKTsKIAltYXhfbnNlY3MgPSBjbG9ja3NvdXJjZV9jeWMybnMobWF4X2N5Y2xlcywgbXVsdCAtIG1heGFkaiwgc2hpZnQpOwogCisJLyogcmV0dXJuIHRoZSBtYXhfY3ljbGVzIHZhbHVlIGFzIHdlbGwgaWYgcmVxdWVzdGVkICovCisJaWYgKG1heF9jeWMpCisJCSptYXhfY3ljID0gbWF4X2N5Y2xlczsKKworCS8qIFJldHVybiA1MCUgb2YgdGhlIGFjdHVhbCBtYXhpbXVtLCBzbyB3ZSBjYW4gZGV0ZWN0IGJhZCB2YWx1ZXMgKi8KKwltYXhfbnNlY3MgPj49IDE7CisKIAlyZXR1cm4gbWF4X25zZWNzOwogfQogCiAvKioKLSAqIGNsb2Nrc291cmNlX21heF9kZWZlcm1lbnQgLSBSZXR1cm5zIG1heCB0aW1lIHRoZSBjbG9ja3NvdXJjZSBjYW4gYmUgZGVmZXJyZWQKLSAqIEBjczogICAgICAgICBQb2ludGVyIHRvIGNsb2Nrc291cmNlCisgKiBjbG9ja3NvdXJjZV91cGRhdGVfbWF4X2RlZmVybWVudCAtIFVwZGF0ZXMgdGhlIGNsb2Nrc291cmNlIG1heF9pZGxlX25zICYgbWF4X2N5Y2xlcworICogQGNzOiAgICAgICAgIFBvaW50ZXIgdG8gY2xvY2tzb3VyY2UgdG8gYmUgdXBkYXRlZAogICoKICAqLwotc3RhdGljIHU2NCBjbG9ja3NvdXJjZV9tYXhfZGVmZXJtZW50KHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCitzdGF0aWMgaW5saW5lIHZvaWQgY2xvY2tzb3VyY2VfdXBkYXRlX21heF9kZWZlcm1lbnQoc3RydWN0IGNsb2Nrc291cmNlICpjcykKIHsKLQl1NjQgbWF4X25zZWNzOwotCi0JbWF4X25zZWNzID0gY2xvY2tzX2NhbGNfbWF4X25zZWNzKGNzLT5tdWx0LCBjcy0+c2hpZnQsIGNzLT5tYXhhZGosCi0JCQkJCSAgY3MtPm1hc2spOwotCS8qCi0JICogVG8gZW5zdXJlIHRoYXQgdGhlIGNsb2Nrc291cmNlIGRvZXMgbm90IHdyYXAgd2hpbHN0IHdlIGFyZSBpZGxlLAotCSAqIGxpbWl0IHRoZSB0aW1lIHRoZSBjbG9ja3NvdXJjZSBjYW4gYmUgZGVmZXJyZWQgYnkgMTIuNSUuIFBsZWFzZQotCSAqIG5vdGUgYSBtYXJnaW4gb2YgMTIuNSUgaXMgdXNlZCBiZWNhdXNlIHRoaXMgY2FuIGJlIGNvbXB1dGVkIHdpdGgKLQkgKiBhIHNoaWZ0LCB2ZXJzdXMgc2F5IDEwJSB3aGljaCB3b3VsZCByZXF1aXJlIGRpdmlzaW9uLgotCSAqLwotCXJldHVybiBtYXhfbnNlY3MgLSAobWF4X25zZWNzID4+IDMpOworCWNzLT5tYXhfaWRsZV9ucyA9IGNsb2Nrc19jYWxjX21heF9uc2Vjcyhjcy0+bXVsdCwgY3MtPnNoaWZ0LAorCQkJCQkJY3MtPm1heGFkaiwgY3MtPm1hc2ssCisJCQkJCQkmY3MtPm1heF9jeWNsZXMpOwogfQogCiAjaWZuZGVmIENPTkZJR19BUkNIX1VTRVNfR0VUVElNRU9GRlNFVApAQCAtNjQ4LDcgKzY0Niw3IEBACiB9CiAKIC8qKgotICogX19jbG9ja3NvdXJjZV91cGRhdGVmcmVxX3NjYWxlIC0gVXNlZCB1cGRhdGUgY2xvY2tzb3VyY2Ugd2l0aCBuZXcgZnJlcQorICogX19jbG9ja3NvdXJjZV91cGRhdGVfZnJlcV9zY2FsZSAtIFVzZWQgdXBkYXRlIGNsb2Nrc291cmNlIHdpdGggbmV3IGZyZXEKICAqIEBjczoJCWNsb2Nrc291cmNlIHRvIGJlIHJlZ2lzdGVyZWQKICAqIEBzY2FsZToJU2NhbGUgZmFjdG9yIG11bHRpcGxpZWQgYWdhaW5zdCBmcmVxIHRvIGdldCBjbG9ja3NvdXJjZSBoegogICogQGZyZXE6CWNsb2Nrc291cmNlIGZyZXF1ZW5jeSAoY3ljbGVzIHBlciBzZWNvbmQpIGRpdmlkZWQgYnkgc2NhbGUKQEAgLTY1Niw0OCArNjU0LDY0IEBACiAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSBjbG9ja3NvdXJjZS0+ZW5hYmxlKCkgbWV0aG9kLgogICoKICAqIFRoaXMgKlNIT1VMRCBOT1QqIGJlIGNhbGxlZCBkaXJlY3RseSEgUGxlYXNlIHVzZSB0aGUKLSAqIGNsb2Nrc291cmNlX3VwZGF0ZWZyZXFfaHooKSBvciBjbG9ja3NvdXJjZV91cGRhdGVmcmVxX2toeiBoZWxwZXIgZnVuY3Rpb25zLgorICogX19jbG9ja3NvdXJjZV91cGRhdGVfZnJlcV9oeigpIG9yIF9fY2xvY2tzb3VyY2VfdXBkYXRlX2ZyZXFfa2h6KCkgaGVscGVyCisgKiBmdW5jdGlvbnMuCiAgKi8KLXZvaWQgX19jbG9ja3NvdXJjZV91cGRhdGVmcmVxX3NjYWxlKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MsIHUzMiBzY2FsZSwgdTMyIGZyZXEpCit2b2lkIF9fY2xvY2tzb3VyY2VfdXBkYXRlX2ZyZXFfc2NhbGUoc3RydWN0IGNsb2Nrc291cmNlICpjcywgdTMyIHNjYWxlLCB1MzIgZnJlcSkKIHsKIAl1NjQgc2VjOworCiAJLyoKLQkgKiBDYWxjIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHdoaWNoIHdlIGNhbiBydW4gYmVmb3JlCi0JICogd3JhcHBpbmcgYXJvdW5kLiBGb3IgY2xvY2tzb3VyY2VzIHdoaWNoIGhhdmUgYSBtYXNrID4gMzJiaXQKLQkgKiB3ZSBuZWVkIHRvIGxpbWl0IHRoZSBtYXggc2xlZXAgdGltZSB0byBoYXZlIGEgZ29vZAotCSAqIGNvbnZlcnNpb24gcHJlY2lzaW9uLiAxMCBtaW51dGVzIGlzIHN0aWxsIGEgcmVhc29uYWJsZQotCSAqIGFtb3VudC4gVGhhdCByZXN1bHRzIGluIGEgc2hpZnQgdmFsdWUgb2YgMjQgZm9yIGEKLQkgKiBjbG9ja3NvdXJjZSB3aXRoIG1hc2sgPj0gNDBiaXQgYW5kIGYgPj0gNEdIei4gVGhhdCBtYXBzIHRvCi0JICogfiAwLjA2cHBtIGdyYW51bGFyaXR5IGZvciBOVFAuIFdlIGFwcGx5IHRoZSBzYW1lIDEyLjUlCi0JICogbWFyZ2luIGFzIHdlIGRvIGluIGNsb2Nrc291cmNlX21heF9kZWZlcm1lbnQoKQorCSAqIERlZmF1bHQgY2xvY2tzb3VyY2VzIGFyZSAqc3BlY2lhbCogYW5kIHNlbGYtZGVmaW5lIHRoZWlyIG11bHQvc2hpZnQuCisJICogQnV0LCB5b3UncmUgbm90IHNwZWNpYWwsIHNvIHlvdSBzaG91bGQgc3BlY2lmeSBhIGZyZXEgdmFsdWUuCiAJICovCi0Jc2VjID0gKGNzLT5tYXNrIC0gKGNzLT5tYXNrID4+IDMpKTsKLQlkb19kaXYoc2VjLCBmcmVxKTsKLQlkb19kaXYoc2VjLCBzY2FsZSk7Ci0JaWYgKCFzZWMpCi0JCXNlYyA9IDE7Ci0JZWxzZSBpZiAoc2VjID4gNjAwICYmIGNzLT5tYXNrID4gVUlOVF9NQVgpCi0JCXNlYyA9IDYwMDsKKwlpZiAoZnJlcSkgeworCQkvKgorCQkgKiBDYWxjIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWNvbmRzIHdoaWNoIHdlIGNhbiBydW4gYmVmb3JlCisJCSAqIHdyYXBwaW5nIGFyb3VuZC4gRm9yIGNsb2Nrc291cmNlcyB3aGljaCBoYXZlIGEgbWFzayA+IDMyLWJpdAorCQkgKiB3ZSBuZWVkIHRvIGxpbWl0IHRoZSBtYXggc2xlZXAgdGltZSB0byBoYXZlIGEgZ29vZAorCQkgKiBjb252ZXJzaW9uIHByZWNpc2lvbi4gMTAgbWludXRlcyBpcyBzdGlsbCBhIHJlYXNvbmFibGUKKwkJICogYW1vdW50LiBUaGF0IHJlc3VsdHMgaW4gYSBzaGlmdCB2YWx1ZSBvZiAyNCBmb3IgYQorCQkgKiBjbG9ja3NvdXJjZSB3aXRoIG1hc2sgPj0gNDAtYml0IGFuZCBmID49IDRHSHouIFRoYXQgbWFwcyB0bworCQkgKiB+IDAuMDZwcG0gZ3JhbnVsYXJpdHkgZm9yIE5UUC4KKwkJICovCisJCXNlYyA9IGNzLT5tYXNrOworCQlkb19kaXYoc2VjLCBmcmVxKTsKKwkJZG9fZGl2KHNlYywgc2NhbGUpOworCQlpZiAoIXNlYykKKwkJCXNlYyA9IDE7CisJCWVsc2UgaWYgKHNlYyA+IDYwMCAmJiBjcy0+bWFzayA+IFVJTlRfTUFYKQorCQkJc2VjID0gNjAwOwogCi0JY2xvY2tzX2NhbGNfbXVsdF9zaGlmdCgmY3MtPm11bHQsICZjcy0+c2hpZnQsIGZyZXEsCi0JCQkgICAgICAgTlNFQ19QRVJfU0VDIC8gc2NhbGUsIHNlYyAqIHNjYWxlKTsKLQorCQljbG9ja3NfY2FsY19tdWx0X3NoaWZ0KCZjcy0+bXVsdCwgJmNzLT5zaGlmdCwgZnJlcSwKKwkJCQkgICAgICAgTlNFQ19QRVJfU0VDIC8gc2NhbGUsIHNlYyAqIHNjYWxlKTsKKwl9CiAJLyoKLQkgKiBmb3IgY2xvY2tzb3VyY2VzIHRoYXQgaGF2ZSBsYXJnZSBtdWx0cywgdG8gYXZvaWQgb3ZlcmZsb3cuCi0JICogU2luY2UgbXVsdCBtYXkgYmUgYWRqdXN0ZWQgYnkgbnRwLCBhZGQgYW4gc2FmZXR5IGV4dHJhIG1hcmdpbgotCSAqCisJICogRW5zdXJlIGNsb2Nrc291cmNlcyB0aGF0IGhhdmUgbGFyZ2UgJ211bHQnIHZhbHVlcyBkb24ndCBvdmVyZmxvdworCSAqIHdoZW4gYWRqdXN0ZWQuCiAJICovCiAJY3MtPm1heGFkaiA9IGNsb2Nrc291cmNlX21heF9hZGp1c3RtZW50KGNzKTsKLQl3aGlsZSAoKGNzLT5tdWx0ICsgY3MtPm1heGFkaiA8IGNzLT5tdWx0KQotCQl8fCAoY3MtPm11bHQgLSBjcy0+bWF4YWRqID4gY3MtPm11bHQpKSB7CisJd2hpbGUgKGZyZXEgJiYgKChjcy0+bXVsdCArIGNzLT5tYXhhZGogPCBjcy0+bXVsdCkKKwkJfHwgKGNzLT5tdWx0IC0gY3MtPm1heGFkaiA+IGNzLT5tdWx0KSkpIHsKIAkJY3MtPm11bHQgPj49IDE7CiAJCWNzLT5zaGlmdC0tOwogCQljcy0+bWF4YWRqID0gY2xvY2tzb3VyY2VfbWF4X2FkanVzdG1lbnQoY3MpOwogCX0KIAotCWNzLT5tYXhfaWRsZV9ucyA9IGNsb2Nrc291cmNlX21heF9kZWZlcm1lbnQoY3MpOworCS8qCisJICogT25seSB3YXJuIGZvciAqc3BlY2lhbCogY2xvY2tzb3VyY2VzIHRoYXQgc2VsZi1kZWZpbmUKKwkgKiB0aGVpciBtdWx0L3NoaWZ0IHZhbHVlcyBhbmQgZG9uJ3Qgc3BlY2lmeSBhIGZyZXEuCisJICovCisJV0FSTl9PTkNFKGNzLT5tdWx0ICsgY3MtPm1heGFkaiA8IGNzLT5tdWx0LAorCQkidGltZWtlZXBpbmc6IENsb2Nrc291cmNlICVzIG1pZ2h0IG92ZXJmbG93IG9uIDExJSUgYWRqdXN0bWVudFxuIiwKKwkJY3MtPm5hbWUpOworCisJY2xvY2tzb3VyY2VfdXBkYXRlX21heF9kZWZlcm1lbnQoY3MpOworCisJcHJfaW5mbygiY2xvY2tzb3VyY2UgJXM6IG1hc2s6IDB4JWxseCBtYXhfY3ljbGVzOiAweCVsbHgsIG1heF9pZGxlX25zOiAlbGxkIG5zXG4iLAorCQkJY3MtPm5hbWUsIGNzLT5tYXNrLCBjcy0+bWF4X2N5Y2xlcywgY3MtPm1heF9pZGxlX25zKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKF9fY2xvY2tzb3VyY2VfdXBkYXRlZnJlcV9zY2FsZSk7CitFWFBPUlRfU1lNQk9MX0dQTChfX2Nsb2Nrc291cmNlX3VwZGF0ZV9mcmVxX3NjYWxlKTsKIAogLyoqCiAgKiBfX2Nsb2Nrc291cmNlX3JlZ2lzdGVyX3NjYWxlIC0gVXNlZCB0byBpbnN0YWxsIG5ldyBjbG9ja3NvdXJjZXMKQEAgLTcxNCw3ICs3MjgsNyBAQAogewogCiAJLyogSW5pdGlhbGl6ZSBtdWx0L3NoaWZ0IGFuZCBtYXhfaWRsZV9ucyAqLwotCV9fY2xvY2tzb3VyY2VfdXBkYXRlZnJlcV9zY2FsZShjcywgc2NhbGUsIGZyZXEpOworCV9fY2xvY2tzb3VyY2VfdXBkYXRlX2ZyZXFfc2NhbGUoY3MsIHNjYWxlLCBmcmVxKTsKIAogCS8qIEFkZCBjbG9ja3NvdXJjZSB0byB0aGUgY2xvY2tzb3VyY2UgbGlzdCAqLwogCW11dGV4X2xvY2soJmNsb2Nrc291cmNlX211dGV4KTsKQEAgLTcyNiwzMyArNzQwLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKF9fY2xvY2tzb3VyY2VfcmVnaXN0ZXJfc2NhbGUpOwogCi0KLS8qKgotICogY2xvY2tzb3VyY2VfcmVnaXN0ZXIgLSBVc2VkIHRvIGluc3RhbGwgbmV3IGNsb2Nrc291cmNlcwotICogQGNzOgkJY2xvY2tzb3VyY2UgdG8gYmUgcmVnaXN0ZXJlZAotICoKLSAqIFJldHVybnMgLUVCVVNZIGlmIHJlZ2lzdHJhdGlvbiBmYWlscywgemVybyBvdGhlcndpc2UuCi0gKi8KLWludCBjbG9ja3NvdXJjZV9yZWdpc3RlcihzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQotewotCS8qIGNhbGN1bGF0ZSBtYXggYWRqdXN0bWVudCBmb3IgZ2l2ZW4gbXVsdC9zaGlmdCAqLwotCWNzLT5tYXhhZGogPSBjbG9ja3NvdXJjZV9tYXhfYWRqdXN0bWVudChjcyk7Ci0JV0FSTl9PTkNFKGNzLT5tdWx0ICsgY3MtPm1heGFkaiA8IGNzLT5tdWx0LAotCQkiQ2xvY2tzb3VyY2UgJXMgbWlnaHQgb3ZlcmZsb3cgb24gMTElJSBhZGp1c3RtZW50XG4iLAotCQljcy0+bmFtZSk7Ci0KLQkvKiBjYWxjdWxhdGUgbWF4IGlkbGUgdGltZSBwZXJtaXR0ZWQgZm9yIHRoaXMgY2xvY2tzb3VyY2UgKi8KLQljcy0+bWF4X2lkbGVfbnMgPSBjbG9ja3NvdXJjZV9tYXhfZGVmZXJtZW50KGNzKTsKLQotCW11dGV4X2xvY2soJmNsb2Nrc291cmNlX211dGV4KTsKLQljbG9ja3NvdXJjZV9lbnF1ZXVlKGNzKTsKLQljbG9ja3NvdXJjZV9lbnF1ZXVlX3dhdGNoZG9nKGNzKTsKLQljbG9ja3NvdXJjZV9zZWxlY3QoKTsKLQltdXRleF91bmxvY2soJmNsb2Nrc291cmNlX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woY2xvY2tzb3VyY2VfcmVnaXN0ZXIpOwotCiBzdGF0aWMgdm9pZCBfX2Nsb2Nrc291cmNlX2NoYW5nZV9yYXRpbmcoc3RydWN0IGNsb2Nrc291cmNlICpjcywgaW50IHJhdGluZykKIHsKIAlsaXN0X2RlbCgmY3MtPmxpc3QpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvaHJ0aW1lci5jIGIva2VybmVsL3RpbWUvaHJ0aW1lci5jCmluZGV4IGJlZTBjMWYuLjc2ZDRiZDkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2hydGltZXIuYworKysgYi9rZXJuZWwvdGltZS9ocnRpbWVyLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy90aW1lci5oPgogCi0jaW5jbHVkZSAidGltZWtlZXBpbmcuaCIKKyNpbmNsdWRlICJ0aWNrLWludGVybmFsLmgiCiAKIC8qCiAgKiBUaGUgdGltZXIgYmFzZXM6CkBAIC0xNzA3LDE3ICsxNzA3LDEwIEBACiAJCWJyZWFrOwogCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCi0JY2FzZSBDUFVfRFlJTkc6Ci0JY2FzZSBDUFVfRFlJTkdfRlJPWkVOOgotCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9DUFVfRFlJTkcsICZzY3B1KTsKLQkJYnJlYWs7CiAJY2FzZSBDUFVfREVBRDoKIAljYXNlIENQVV9ERUFEX0ZST1pFTjoKLQl7Ci0JCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX0NQVV9ERUFELCAmc2NwdSk7CiAJCW1pZ3JhdGVfaHJ0aW1lcnMoc2NwdSk7CiAJCWJyZWFrOwotCX0KICNlbmRpZgogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2ppZmZpZXMuYyBiL2tlcm5lbC90aW1lL2ppZmZpZXMuYwppbmRleCBhNmE1YmY1Li4zNDdmZWNmIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9qaWZmaWVzLmMKKysrIGIva2VybmVsL3RpbWUvamlmZmllcy5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogCi0jaW5jbHVkZSAidGljay1pbnRlcm5hbC5oIgorI2luY2x1ZGUgInRpbWVrZWVwaW5nLmgiCiAKIC8qIFRoZSBKaWZmaWVzIGJhc2VkIGNsb2Nrc291cmNlIGlzIHRoZSBsb3dlc3QgY29tbW9uCiAgKiBkZW5vbWluYXRvciBjbG9jayBzb3VyY2Ugd2hpY2ggc2hvdWxkIGZ1bmN0aW9uIG9uCkBAIC03MSw2ICs3MSw3IEBACiAJLm1hc2sJCT0gMHhmZmZmZmZmZiwgLyozMmJpdHMqLwogCS5tdWx0CQk9IE5TRUNfUEVSX0pJRkZZIDw8IEpJRkZJRVNfU0hJRlQsIC8qIGRldGFpbHMgYWJvdmUgKi8KIAkuc2hpZnQJCT0gSklGRklFU19TSElGVCwKKwkubWF4X2N5Y2xlcwk9IDEwLAogfTsKIAogX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXAgREVGSU5FX1NFUUxPQ0soamlmZmllc19sb2NrKTsKQEAgLTk0LDcgKzk1LDcgQEAKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9qaWZmaWVzX2Nsb2Nrc291cmNlKHZvaWQpCiB7Ci0JcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9qaWZmaWVzKTsKKwlyZXR1cm4gX19jbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfamlmZmllcyk7CiB9CiAKIGNvcmVfaW5pdGNhbGwoaW5pdF9qaWZmaWVzX2Nsb2Nrc291cmNlKTsKQEAgLTEzMCw2ICsxMzEsNiBAQAogCiAJcmVmaW5lZF9qaWZmaWVzLm11bHQgPSAoKHUzMiluc2VjX3Blcl90aWNrKSA8PCBKSUZGSUVTX1NISUZUOwogCi0JY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJnJlZmluZWRfamlmZmllcyk7CisJX19jbG9ja3NvdXJjZV9yZWdpc3RlcigmcmVmaW5lZF9qaWZmaWVzKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL250cC5jIGIva2VybmVsL3RpbWUvbnRwLmMKaW5kZXggMGY2MGIwOC4uN2E2ODEwMCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvbnRwLmMKKysrIGIva2VybmVsL3RpbWUvbnRwLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KIAotI2luY2x1ZGUgInRpY2staW50ZXJuYWwuaCIKICNpbmNsdWRlICJudHBfaW50ZXJuYWwuaCIKIAogLyoKQEAgLTQ1OSw2ICs0NTgsMTYgQEAKIAlyZXR1cm4gbGVhcDsKIH0KIAorI2lmZGVmIENPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFCitpbnQgX193ZWFrIHVwZGF0ZV9wZXJzaXN0ZW50X2Nsb2NrNjQoc3RydWN0IHRpbWVzcGVjNjQgbm93NjQpCit7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKworCW5vdyA9IHRpbWVzcGVjNjRfdG9fdGltZXNwZWMobm93NjQpOworCXJldHVybiB1cGRhdGVfcGVyc2lzdGVudF9jbG9jayhub3cpOworfQorI2VuZGlmCisKICNpZiBkZWZpbmVkKENPTkZJR19HRU5FUklDX0NNT1NfVVBEQVRFKSB8fCBkZWZpbmVkKENPTkZJR19SVENfU1lTVE9IQykKIHN0YXRpYyB2b2lkIHN5bmNfY21vc19jbG9jayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCkBAIC00OTQsOCArNTAzLDkgQEAKIAkJaWYgKHBlcnNpc3RlbnRfY2xvY2tfaXNfbG9jYWwpCiAJCQlhZGp1c3QudHZfc2VjIC09IChzeXNfdHoudHpfbWludXRlc3dlc3QgKiA2MCk7CiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ01PU19VUERBVEUKLQkJZmFpbCA9IHVwZGF0ZV9wZXJzaXN0ZW50X2Nsb2NrKHRpbWVzcGVjNjRfdG9fdGltZXNwZWMoYWRqdXN0KSk7CisJCWZhaWwgPSB1cGRhdGVfcGVyc2lzdGVudF9jbG9jazY0KGFkanVzdCk7CiAjZW5kaWYKKwogI2lmZGVmIENPTkZJR19SVENfU1lTVE9IQwogCQlpZiAoZmFpbCA9PSAtRU5PREVWKQogCQkJZmFpbCA9IHJ0Y19zZXRfbnRwX3RpbWUoYWRqdXN0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3NjaGVkX2Nsb2NrLmMgYi9rZXJuZWwvdGltZS9zY2hlZF9jbG9jay5jCmluZGV4IDAxZDJkMTUuLmEyNjAzNmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3NjaGVkX2Nsb2NrLmMKKysrIGIva2VybmVsL3RpbWUvc2NoZWRfY2xvY2suYwpAQCAtMSw1ICsxLDYgQEAKIC8qCi0gKiBzY2hlZF9jbG9jay5jOiBzdXBwb3J0IGZvciBleHRlbmRpbmcgY291bnRlcnMgdG8gZnVsbCA2NC1iaXQgbnMgY291bnRlcgorICogc2NoZWRfY2xvY2suYzogR2VuZXJpYyBzY2hlZF9jbG9jaygpIHN1cHBvcnQsIHRvIGV4dGVuZCBsb3cgbGV2ZWwKKyAqICAgICAgICAgICAgICAgIGhhcmR3YXJlIHRpbWUgY291bnRlcnMgdG8gZnVsbCA2NC1iaXQgbnMgdmFsdWVzLgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwpAQCAtMTgsMTUgKzE5LDUzIEBACiAjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgogCi1zdHJ1Y3QgY2xvY2tfZGF0YSB7Ci0Ja3RpbWVfdCB3cmFwX2t0OworLyoqCisgKiBzdHJ1Y3QgY2xvY2tfcmVhZF9kYXRhIC0gZGF0YSByZXF1aXJlZCB0byByZWFkIGZyb20gc2NoZWRfY2xvY2soKQorICoKKyAqIEBlcG9jaF9uczoJCXNjaGVkX2Nsb2NrKCkgdmFsdWUgYXQgbGFzdCB1cGRhdGUKKyAqIEBlcG9jaF9jeWM6CQlDbG9jayBjeWNsZSB2YWx1ZSBhdCBsYXN0IHVwZGF0ZS4KKyAqIEBzY2hlZF9jbG9ja19tYXNrOiAgIEJpdG1hc2sgZm9yIHR3bydzIGNvbXBsZW1lbnQgc3VidHJhY3Rpb24gb2Ygbm9uIDY0Yml0CisgKgkJCWNsb2Nrcy4KKyAqIEByZWFkX3NjaGVkX2Nsb2NrOglDdXJyZW50IGNsb2NrIHNvdXJjZSAob3IgZHVtbXkgc291cmNlIHdoZW4gc3VzcGVuZGVkKS4KKyAqIEBtdWx0OgkJTXVsdGlwbGVyIGZvciBzY2FsZWQgbWF0aCBjb252ZXJzaW9uLgorICogQHNoaWZ0OgkJU2hpZnQgdmFsdWUgZm9yIHNjYWxlZCBtYXRoIGNvbnZlcnNpb24uCisgKgorICogQ2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gdXBkYXRpbmcgdGhpcyBzdHJ1Y3R1cmU7IGl0IGlzIHJlYWQgYnkKKyAqIHNvbWUgdmVyeSBob3QgY29kZSBwYXRocy4gSXQgb2NjdXBpZXMgPD00MCBieXRlcyBhbmQsIHdoZW4gY29tYmluZWQKKyAqIHdpdGggdGhlIHNlcWNvdW50IHVzZWQgdG8gc3luY2hyb25pemUgYWNjZXNzLCBjb21mb3J0YWJseSBmaXRzIGludG8KKyAqIGEgNjQgYnl0ZSBjYWNoZSBsaW5lLgorICovCitzdHJ1Y3QgY2xvY2tfcmVhZF9kYXRhIHsKIAl1NjQgZXBvY2hfbnM7CiAJdTY0IGVwb2NoX2N5YzsKLQlzZXFjb3VudF90IHNlcTsKLQl1bnNpZ25lZCBsb25nIHJhdGU7CisJdTY0IHNjaGVkX2Nsb2NrX21hc2s7CisJdTY0ICgqcmVhZF9zY2hlZF9jbG9jaykodm9pZCk7CiAJdTMyIG11bHQ7CiAJdTMyIHNoaWZ0OwotCWJvb2wgc3VzcGVuZGVkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgY2xvY2tfZGF0YSAtIGFsbCBkYXRhIG5lZWRlZCBmb3Igc2NoZWRfY2xvY2soKSAoaW5jbHVkaW5nCisgKiAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbiBvZiBhIG5ldyBjbG9jayBzb3VyY2UpCisgKgorICogQHNlcToJCVNlcXVlbmNlIGNvdW50ZXIgZm9yIHByb3RlY3RpbmcgdXBkYXRlcy4gVGhlIGxvd2VzdAorICoJCQliaXQgaXMgdGhlIGluZGV4IGZvciBAcmVhZF9kYXRhLgorICogQHJlYWRfZGF0YToJCURhdGEgcmVxdWlyZWQgdG8gcmVhZCBmcm9tIHNjaGVkX2Nsb2NrLgorICogQHdyYXBfa3Q6CQlEdXJhdGlvbiBmb3Igd2hpY2ggY2xvY2sgY2FuIHJ1biBiZWZvcmUgd3JhcHBpbmcuCisgKiBAcmF0ZToJCVRpY2sgcmF0ZSBvZiB0aGUgcmVnaXN0ZXJlZCBjbG9jay4KKyAqIEBhY3R1YWxfcmVhZF9zY2hlZF9jbG9jazogUmVnaXN0ZXJlZCBoYXJkd2FyZSBsZXZlbCBjbG9jayByZWFkIGZ1bmN0aW9uLgorICoKKyAqIFRoZSBvcmRlcmluZyBvZiB0aGlzIHN0cnVjdHVyZSBoYXMgYmVlbiBjaG9zZW4gdG8gb3B0aW1pemUgY2FjaGUKKyAqIHBlcmZvcm1hbmNlLiBJbiBwYXJ0aWN1bGFyICdzZXEnIGFuZCAncmVhZF9kYXRhWzBdJyAoY29tYmluZWQpIHNob3VsZCBmaXQKKyAqIGludG8gYSBzaW5nbGUgNjQtYnl0ZSBjYWNoZSBsaW5lLgorICovCitzdHJ1Y3QgY2xvY2tfZGF0YSB7CisJc2VxY291bnRfdAkJc2VxOworCXN0cnVjdCBjbG9ja19yZWFkX2RhdGEJcmVhZF9kYXRhWzJdOworCWt0aW1lX3QJCQl3cmFwX2t0OworCXVuc2lnbmVkIGxvbmcJCXJhdGU7CisKKwl1NjQgKCphY3R1YWxfcmVhZF9zY2hlZF9jbG9jaykodm9pZCk7CiB9OwogCiBzdGF0aWMgc3RydWN0IGhydGltZXIgc2NoZWRfY2xvY2tfdGltZXI7CkBAIC0zNCwxMiArNzMsNiBAQAogCiBjb3JlX3BhcmFtKGlycXRpbWUsIGlycXRpbWUsIGludCwgMDQwMCk7CiAKLXN0YXRpYyBzdHJ1Y3QgY2xvY2tfZGF0YSBjZCA9IHsKLQkubXVsdAk9IE5TRUNfUEVSX1NFQyAvIEhaLAotfTsKLQotc3RhdGljIHU2NCBfX3JlYWRfbW9zdGx5IHNjaGVkX2Nsb2NrX21hc2s7Ci0KIHN0YXRpYyB1NjQgbm90cmFjZSBqaWZmeV9zY2hlZF9jbG9ja19yZWFkKHZvaWQpCiB7CiAJLyoKQEAgLTQ5LDcgKzgyLDExIEBACiAJcmV0dXJuICh1NjQpKGppZmZpZXMgLSBJTklUSUFMX0pJRkZJRVMpOwogfQogCi1zdGF0aWMgdTY0IF9fcmVhZF9tb3N0bHkgKCpyZWFkX3NjaGVkX2Nsb2NrKSh2b2lkKSA9IGppZmZ5X3NjaGVkX2Nsb2NrX3JlYWQ7CitzdGF0aWMgc3RydWN0IGNsb2NrX2RhdGEgY2QgX19fX2NhY2hlbGluZV9hbGlnbmVkID0geworCS5yZWFkX2RhdGFbMF0gPSB7IC5tdWx0ID0gTlNFQ19QRVJfU0VDIC8gSFosCisJCQkgIC5yZWFkX3NjaGVkX2Nsb2NrID0gamlmZnlfc2NoZWRfY2xvY2tfcmVhZCwgfSwKKwkuYWN0dWFsX3JlYWRfc2NoZWRfY2xvY2sgPSBqaWZmeV9zY2hlZF9jbG9ja19yZWFkLAorfTsKIAogc3RhdGljIGlubGluZSB1NjQgbm90cmFjZSBjeWNfdG9fbnModTY0IGN5YywgdTMyIG11bHQsIHUzMiBzaGlmdCkKIHsKQEAgLTU4LDExMSArOTUsMTM2IEBACiAKIHVuc2lnbmVkIGxvbmcgbG9uZyBub3RyYWNlIHNjaGVkX2Nsb2NrKHZvaWQpCiB7Ci0JdTY0IGVwb2NoX25zOwotCXU2NCBlcG9jaF9jeWM7Ci0JdTY0IGN5YzsKKwl1NjQgY3ljLCByZXM7CiAJdW5zaWduZWQgbG9uZyBzZXE7Ci0KLQlpZiAoY2Quc3VzcGVuZGVkKQotCQlyZXR1cm4gY2QuZXBvY2hfbnM7CisJc3RydWN0IGNsb2NrX3JlYWRfZGF0YSAqcmQ7CiAKIAlkbyB7Ci0JCXNlcSA9IHJhd19yZWFkX3NlcWNvdW50X2JlZ2luKCZjZC5zZXEpOwotCQllcG9jaF9jeWMgPSBjZC5lcG9jaF9jeWM7Ci0JCWVwb2NoX25zID0gY2QuZXBvY2hfbnM7CisJCXNlcSA9IHJhd19yZWFkX3NlcWNvdW50KCZjZC5zZXEpOworCQlyZCA9IGNkLnJlYWRfZGF0YSArIChzZXEgJiAxKTsKKworCQljeWMgPSAocmQtPnJlYWRfc2NoZWRfY2xvY2soKSAtIHJkLT5lcG9jaF9jeWMpICYKKwkJICAgICAgcmQtPnNjaGVkX2Nsb2NrX21hc2s7CisJCXJlcyA9IHJkLT5lcG9jaF9ucyArIGN5Y190b19ucyhjeWMsIHJkLT5tdWx0LCByZC0+c2hpZnQpOwogCX0gd2hpbGUgKHJlYWRfc2VxY291bnRfcmV0cnkoJmNkLnNlcSwgc2VxKSk7CiAKLQljeWMgPSByZWFkX3NjaGVkX2Nsb2NrKCk7Ci0JY3ljID0gKGN5YyAtIGVwb2NoX2N5YykgJiBzY2hlZF9jbG9ja19tYXNrOwotCXJldHVybiBlcG9jaF9ucyArIGN5Y190b19ucyhjeWMsIGNkLm11bHQsIGNkLnNoaWZ0KTsKKwlyZXR1cm4gcmVzOwogfQogCiAvKgotICogQXRvbWljYWxseSB1cGRhdGUgdGhlIHNjaGVkX2Nsb2NrIGVwb2NoLgorICogVXBkYXRpbmcgdGhlIGRhdGEgcmVxdWlyZWQgdG8gcmVhZCB0aGUgY2xvY2suCisgKgorICogc2NoZWRfY2xvY2soKSB3aWxsIG5ldmVyIG9ic2VydmUgbWlzLW1hdGNoZWQgZGF0YSBldmVuIGlmIGNhbGxlZCBmcm9tCisgKiBhbiBOTUkuIFdlIGRvIHRoaXMgYnkgbWFpbnRhaW5pbmcgYW4gb2RkL2V2ZW4gY29weSBvZiB0aGUgZGF0YSBhbmQKKyAqIHN0ZWVyaW5nIHNjaGVkX2Nsb2NrKCkgdG8gb25lIG9yIHRoZSBvdGhlciB1c2luZyBhIHNlcXVlbmNlIGNvdW50ZXIuCisgKiBJbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgZGF0YSBjYWNoZSBwcm9maWxlIG9mIHNjaGVkX2Nsb2NrKCkgYXMgbXVjaAorICogYXMgcG9zc2libGUgdGhlIHN5c3RlbSByZXZlcnRzIGJhY2sgdG8gdGhlIGV2ZW4gY29weSB3aGVuIHRoZSB1cGRhdGUKKyAqIGNvbXBsZXRlczsgdGhlIG9kZCBjb3B5IGlzIHVzZWQgKm9ubHkqIGR1cmluZyBhbiB1cGRhdGUuCiAgKi8KLXN0YXRpYyB2b2lkIG5vdHJhY2UgdXBkYXRlX3NjaGVkX2Nsb2NrKHZvaWQpCitzdGF0aWMgdm9pZCB1cGRhdGVfY2xvY2tfcmVhZF9kYXRhKHN0cnVjdCBjbG9ja19yZWFkX2RhdGEgKnJkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLyogdXBkYXRlIHRoZSBiYWNrdXAgKG9kZCkgY29weSB3aXRoIHRoZSBuZXcgZGF0YSAqLworCWNkLnJlYWRfZGF0YVsxXSA9ICpyZDsKKworCS8qIHN0ZWVyIHJlYWRlcnMgdG93YXJkcyB0aGUgb2RkIGNvcHkgKi8KKwlyYXdfd3JpdGVfc2VxY291bnRfbGF0Y2goJmNkLnNlcSk7CisKKwkvKiBub3cgaXRzIHNhZmUgZm9yIHVzIHRvIHVwZGF0ZSB0aGUgbm9ybWFsIChldmVuKSBjb3B5ICovCisJY2QucmVhZF9kYXRhWzBdID0gKnJkOworCisJLyogc3dpdGNoIHJlYWRlcnMgYmFjayB0byB0aGUgZXZlbiBjb3B5ICovCisJcmF3X3dyaXRlX3NlcWNvdW50X2xhdGNoKCZjZC5zZXEpOworfQorCisvKgorICogQXRvbWljYWxseSB1cGRhdGUgdGhlIHNjaGVkX2Nsb2NrKCkgZXBvY2guCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9zY2hlZF9jbG9jayh2b2lkKQorewogCXU2NCBjeWM7CiAJdTY0IG5zOworCXN0cnVjdCBjbG9ja19yZWFkX2RhdGEgcmQ7CiAKLQljeWMgPSByZWFkX3NjaGVkX2Nsb2NrKCk7Ci0JbnMgPSBjZC5lcG9jaF9ucyArCi0JCWN5Y190b19ucygoY3ljIC0gY2QuZXBvY2hfY3ljKSAmIHNjaGVkX2Nsb2NrX21hc2ssCi0JCQkgIGNkLm11bHQsIGNkLnNoaWZ0KTsKKwlyZCA9IGNkLnJlYWRfZGF0YVswXTsKIAotCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JcmF3X3dyaXRlX3NlcWNvdW50X2JlZ2luKCZjZC5zZXEpOwotCWNkLmVwb2NoX25zID0gbnM7Ci0JY2QuZXBvY2hfY3ljID0gY3ljOwotCXJhd193cml0ZV9zZXFjb3VudF9lbmQoJmNkLnNlcSk7Ci0JcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwljeWMgPSBjZC5hY3R1YWxfcmVhZF9zY2hlZF9jbG9jaygpOworCW5zID0gcmQuZXBvY2hfbnMgKyBjeWNfdG9fbnMoKGN5YyAtIHJkLmVwb2NoX2N5YykgJiByZC5zY2hlZF9jbG9ja19tYXNrLCByZC5tdWx0LCByZC5zaGlmdCk7CisKKwlyZC5lcG9jaF9ucyA9IG5zOworCXJkLmVwb2NoX2N5YyA9IGN5YzsKKworCXVwZGF0ZV9jbG9ja19yZWFkX2RhdGEoJnJkKTsKIH0KIAogc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHNjaGVkX2Nsb2NrX3BvbGwoc3RydWN0IGhydGltZXIgKmhydCkKIHsKIAl1cGRhdGVfc2NoZWRfY2xvY2soKTsKIAlocnRpbWVyX2ZvcndhcmRfbm93KGhydCwgY2Qud3JhcF9rdCk7CisKIAlyZXR1cm4gSFJUSU1FUl9SRVNUQVJUOwogfQogCi12b2lkIF9faW5pdCBzY2hlZF9jbG9ja19yZWdpc3Rlcih1NjQgKCpyZWFkKSh2b2lkKSwgaW50IGJpdHMsCi0JCQkJIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3ZvaWQgX19pbml0CitzY2hlZF9jbG9ja19yZWdpc3Rlcih1NjQgKCpyZWFkKSh2b2lkKSwgaW50IGJpdHMsIHVuc2lnbmVkIGxvbmcgcmF0ZSkKIHsKIAl1NjQgcmVzLCB3cmFwLCBuZXdfbWFzaywgbmV3X2Vwb2NoLCBjeWMsIG5zOwogCXUzMiBuZXdfbXVsdCwgbmV3X3NoaWZ0OwotCWt0aW1lX3QgbmV3X3dyYXBfa3Q7CiAJdW5zaWduZWQgbG9uZyByOwogCWNoYXIgcl91bml0OworCXN0cnVjdCBjbG9ja19yZWFkX2RhdGEgcmQ7CiAKIAlpZiAoY2QucmF0ZSA+IHJhdGUpCiAJCXJldHVybjsKIAogCVdBUk5fT04oIWlycXNfZGlzYWJsZWQoKSk7CiAKLQkvKiBjYWxjdWxhdGUgdGhlIG11bHQvc2hpZnQgdG8gY29udmVydCBjb3VudGVyIHRpY2tzIHRvIG5zLiAqLworCS8qIENhbGN1bGF0ZSB0aGUgbXVsdC9zaGlmdCB0byBjb252ZXJ0IGNvdW50ZXIgdGlja3MgdG8gbnMuICovCiAJY2xvY2tzX2NhbGNfbXVsdF9zaGlmdCgmbmV3X211bHQsICZuZXdfc2hpZnQsIHJhdGUsIE5TRUNfUEVSX1NFQywgMzYwMCk7CiAKIAluZXdfbWFzayA9IENMT0NLU09VUkNFX01BU0soYml0cyk7Ci0KLQkvKiBjYWxjdWxhdGUgaG93IG1hbnkgbnMgdW50aWwgd2Ugd3JhcCAqLwotCXdyYXAgPSBjbG9ja3NfY2FsY19tYXhfbnNlY3MobmV3X211bHQsIG5ld19zaGlmdCwgMCwgbmV3X21hc2spOwotCW5ld193cmFwX2t0ID0gbnNfdG9fa3RpbWUod3JhcCAtICh3cmFwID4+IDMpKTsKLQotCS8qIHVwZGF0ZSBlcG9jaCBmb3IgbmV3IGNvdW50ZXIgYW5kIHVwZGF0ZSBlcG9jaF9ucyBmcm9tIG9sZCBjb3VudGVyKi8KLQluZXdfZXBvY2ggPSByZWFkKCk7Ci0JY3ljID0gcmVhZF9zY2hlZF9jbG9jaygpOwotCW5zID0gY2QuZXBvY2hfbnMgKyBjeWNfdG9fbnMoKGN5YyAtIGNkLmVwb2NoX2N5YykgJiBzY2hlZF9jbG9ja19tYXNrLAotCQkJICBjZC5tdWx0LCBjZC5zaGlmdCk7Ci0KLQlyYXdfd3JpdGVfc2VxY291bnRfYmVnaW4oJmNkLnNlcSk7Ci0JcmVhZF9zY2hlZF9jbG9jayA9IHJlYWQ7Ci0Jc2NoZWRfY2xvY2tfbWFzayA9IG5ld19tYXNrOwogCWNkLnJhdGUgPSByYXRlOwotCWNkLndyYXBfa3QgPSBuZXdfd3JhcF9rdDsKLQljZC5tdWx0ID0gbmV3X211bHQ7Ci0JY2Quc2hpZnQgPSBuZXdfc2hpZnQ7Ci0JY2QuZXBvY2hfY3ljID0gbmV3X2Vwb2NoOwotCWNkLmVwb2NoX25zID0gbnM7Ci0JcmF3X3dyaXRlX3NlcWNvdW50X2VuZCgmY2Quc2VxKTsKKworCS8qIENhbGN1bGF0ZSBob3cgbWFueSBuYW5vc2VjcyB1bnRpbCB3ZSByaXNrIHdyYXBwaW5nICovCisJd3JhcCA9IGNsb2Nrc19jYWxjX21heF9uc2VjcyhuZXdfbXVsdCwgbmV3X3NoaWZ0LCAwLCBuZXdfbWFzaywgTlVMTCk7CisJY2Qud3JhcF9rdCA9IG5zX3RvX2t0aW1lKHdyYXApOworCisJcmQgPSBjZC5yZWFkX2RhdGFbMF07CisKKwkvKiBVcGRhdGUgZXBvY2ggZm9yIG5ldyBjb3VudGVyIGFuZCB1cGRhdGUgJ2Vwb2NoX25zJyBmcm9tIG9sZCBjb3VudGVyKi8KKwluZXdfZXBvY2ggPSByZWFkKCk7CisJY3ljID0gY2QuYWN0dWFsX3JlYWRfc2NoZWRfY2xvY2soKTsKKwlucyA9IHJkLmVwb2NoX25zICsgY3ljX3RvX25zKChjeWMgLSByZC5lcG9jaF9jeWMpICYgcmQuc2NoZWRfY2xvY2tfbWFzaywgcmQubXVsdCwgcmQuc2hpZnQpOworCWNkLmFjdHVhbF9yZWFkX3NjaGVkX2Nsb2NrID0gcmVhZDsKKworCXJkLnJlYWRfc2NoZWRfY2xvY2sJPSByZWFkOworCXJkLnNjaGVkX2Nsb2NrX21hc2sJPSBuZXdfbWFzazsKKwlyZC5tdWx0CQkJPSBuZXdfbXVsdDsKKwlyZC5zaGlmdAkJPSBuZXdfc2hpZnQ7CisJcmQuZXBvY2hfY3ljCQk9IG5ld19lcG9jaDsKKwlyZC5lcG9jaF9ucwkJPSBuczsKKworCXVwZGF0ZV9jbG9ja19yZWFkX2RhdGEoJnJkKTsKIAogCXIgPSByYXRlOwogCWlmIChyID49IDQwMDAwMDApIHsKIAkJciAvPSAxMDAwMDAwOwogCQlyX3VuaXQgPSAnTSc7Ci0JfSBlbHNlIGlmIChyID49IDEwMDApIHsKLQkJciAvPSAxMDAwOwotCQlyX3VuaXQgPSAnayc7Ci0JfSBlbHNlCi0JCXJfdW5pdCA9ICcgJzsKKwl9IGVsc2UgeworCQlpZiAociA+PSAxMDAwKSB7CisJCQlyIC89IDEwMDA7CisJCQlyX3VuaXQgPSAnayc7CisJCX0gZWxzZSB7CisJCQlyX3VuaXQgPSAnICc7CisJCX0KKwl9CiAKLQkvKiBjYWxjdWxhdGUgdGhlIG5zIHJlc29sdXRpb24gb2YgdGhpcyBjb3VudGVyICovCisJLyogQ2FsY3VsYXRlIHRoZSBucyByZXNvbHV0aW9uIG9mIHRoaXMgY291bnRlciAqLwogCXJlcyA9IGN5Y190b19ucygxVUxMLCBuZXdfbXVsdCwgbmV3X3NoaWZ0KTsKIAogCXByX2luZm8oInNjaGVkX2Nsb2NrOiAldSBiaXRzIGF0ICVsdSVjSHosIHJlc29sdXRpb24gJWxsdW5zLCB3cmFwcyBldmVyeSAlbGx1bnNcbiIsCiAJCWJpdHMsIHIsIHJfdW5pdCwgcmVzLCB3cmFwKTsKIAotCS8qIEVuYWJsZSBJUlEgdGltZSBhY2NvdW50aW5nIGlmIHdlIGhhdmUgYSBmYXN0IGVub3VnaCBzY2hlZF9jbG9jayAqLworCS8qIEVuYWJsZSBJUlEgdGltZSBhY2NvdW50aW5nIGlmIHdlIGhhdmUgYSBmYXN0IGVub3VnaCBzY2hlZF9jbG9jaygpICovCiAJaWYgKGlycXRpbWUgPiAwIHx8IChpcnF0aW1lID09IC0xICYmIHJhdGUgPj0gMTAwMDAwMCkpCiAJCWVuYWJsZV9zY2hlZF9jbG9ja19pcnF0aW1lKCk7CiAKQEAgLTE3MiwxMCArMjM0LDEwIEBACiB2b2lkIF9faW5pdCBzY2hlZF9jbG9ja19wb3N0aW5pdCh2b2lkKQogewogCS8qCi0JICogSWYgbm8gc2NoZWRfY2xvY2sgZnVuY3Rpb24gaGFzIGJlZW4gcHJvdmlkZWQgYXQgdGhhdCBwb2ludCwKKwkgKiBJZiBubyBzY2hlZF9jbG9jaygpIGZ1bmN0aW9uIGhhcyBiZWVuIHByb3ZpZGVkIGF0IHRoYXQgcG9pbnQsCiAJICogbWFrZSBpdCB0aGUgZmluYWwgb25lIG9uZS4KIAkgKi8KLQlpZiAocmVhZF9zY2hlZF9jbG9jayA9PSBqaWZmeV9zY2hlZF9jbG9ja19yZWFkKQorCWlmIChjZC5hY3R1YWxfcmVhZF9zY2hlZF9jbG9jayA9PSBqaWZmeV9zY2hlZF9jbG9ja19yZWFkKQogCQlzY2hlZF9jbG9ja19yZWdpc3RlcihqaWZmeV9zY2hlZF9jbG9ja19yZWFkLCBCSVRTX1BFUl9MT05HLCBIWik7CiAKIAl1cGRhdGVfc2NoZWRfY2xvY2soKTsKQEAgLTE4OSwyOSArMjUxLDUzIEBACiAJaHJ0aW1lcl9zdGFydCgmc2NoZWRfY2xvY2tfdGltZXIsIGNkLndyYXBfa3QsIEhSVElNRVJfTU9ERV9SRUwpOwogfQogCisvKgorICogQ2xvY2sgcmVhZCBmdW5jdGlvbiBmb3IgdXNlIHdoZW4gdGhlIGNsb2NrIGlzIHN1c3BlbmRlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIGl0IGFwcGVhciB0byBzY2hlZF9jbG9jaygpIGFzIGlmIHRoZSBjbG9jaworICogc3RvcHBlZCBjb3VudGluZyBhdCBpdHMgbGFzdCB1cGRhdGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgY2FsbGVkIGZyb20gdGhlIGNyaXRpY2FsCisgKiBzZWN0aW9uIGluIHNjaGVkX2Nsb2NrKCkuIEl0IHJlbGllcyBvbiB0aGUgcmVhZF9zZXFjb3VudF9yZXRyeSgpCisgKiBhdCB0aGUgZW5kIG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uIHRvIGJlIHN1cmUgd2Ugb2JzZXJ2ZSB0aGUKKyAqIGNvcnJlY3QgY29weSBvZiAnZXBvY2hfY3ljJy4KKyAqLworc3RhdGljIHU2NCBub3RyYWNlIHN1c3BlbmRlZF9zY2hlZF9jbG9ja19yZWFkKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzZXEgPSByYXdfcmVhZF9zZXFjb3VudCgmY2Quc2VxKTsKKworCXJldHVybiBjZC5yZWFkX2RhdGFbc2VxICYgMV0uZXBvY2hfY3ljOworfQorCiBzdGF0aWMgaW50IHNjaGVkX2Nsb2NrX3N1c3BlbmQodm9pZCkKIHsKKwlzdHJ1Y3QgY2xvY2tfcmVhZF9kYXRhICpyZCA9ICZjZC5yZWFkX2RhdGFbMF07CisKIAl1cGRhdGVfc2NoZWRfY2xvY2soKTsKIAlocnRpbWVyX2NhbmNlbCgmc2NoZWRfY2xvY2tfdGltZXIpOwotCWNkLnN1c3BlbmRlZCA9IHRydWU7CisJcmQtPnJlYWRfc2NoZWRfY2xvY2sgPSBzdXNwZW5kZWRfc2NoZWRfY2xvY2tfcmVhZDsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzY2hlZF9jbG9ja19yZXN1bWUodm9pZCkKIHsKLQljZC5lcG9jaF9jeWMgPSByZWFkX3NjaGVkX2Nsb2NrKCk7CisJc3RydWN0IGNsb2NrX3JlYWRfZGF0YSAqcmQgPSAmY2QucmVhZF9kYXRhWzBdOworCisJcmQtPmVwb2NoX2N5YyA9IGNkLmFjdHVhbF9yZWFkX3NjaGVkX2Nsb2NrKCk7CiAJaHJ0aW1lcl9zdGFydCgmc2NoZWRfY2xvY2tfdGltZXIsIGNkLndyYXBfa3QsIEhSVElNRVJfTU9ERV9SRUwpOwotCWNkLnN1c3BlbmRlZCA9IGZhbHNlOworCXJkLT5yZWFkX3NjaGVkX2Nsb2NrID0gY2QuYWN0dWFsX3JlYWRfc2NoZWRfY2xvY2s7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc3lzY29yZV9vcHMgc2NoZWRfY2xvY2tfb3BzID0gewotCS5zdXNwZW5kID0gc2NoZWRfY2xvY2tfc3VzcGVuZCwKLQkucmVzdW1lID0gc2NoZWRfY2xvY2tfcmVzdW1lLAorCS5zdXNwZW5kCT0gc2NoZWRfY2xvY2tfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNjaGVkX2Nsb2NrX3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNjaGVkX2Nsb2NrX3N5c2NvcmVfaW5pdCh2b2lkKQogewogCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZzY2hlZF9jbG9ja19vcHMpOworCiAJcmV0dXJuIDA7CiB9CiBkZXZpY2VfaW5pdGNhbGwoc2NoZWRfY2xvY2tfc3lzY29yZV9pbml0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LWhydGltZXIuYyBiL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LWhydGltZXIuYwppbmRleCBlYjY4MmQ1Li42YWFjNGJlIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC1ocnRpbWVyLmMKKysrIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QtaHJ0aW1lci5jCkBAIC00OSw2ICs0OSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgYmNfc2V0X25leHQoa3RpbWVfdCBleHBpcmVzLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKIHsKKwlpbnQgYmNfbW92ZWQ7CiAJLyoKIAkgKiBXZSB0cnkgdG8gY2FuY2VsIHRoZSB0aW1lciBmaXJzdC4gSWYgdGhlIGNhbGxiYWNrIGlzIG9uCiAJICogZmxpZ2h0IG9uIHNvbWUgb3RoZXIgY3B1IHRoZW4gd2UgbGV0IGl0IGhhbmRsZSBpdC4gSWYgd2UKQEAgLTYwLDkgKzYxLDE1IEBACiAJICogcmVzdGFydCB0aGUgdGltZXIgYmVjYXVzZSB3ZSBhcmUgaW4gdGhlIGNhbGxiYWNrLCBidXQgd2UKIAkgKiBjYW4gc2V0IHRoZSBleHBpcnkgdGltZSBhbmQgbGV0IHRoZSBjYWxsYmFjayByZXR1cm4KIAkgKiBIUlRJTUVSX1JFU1RBUlQuCisJICoKKwkgKiBTaW5jZSB3ZSBhcmUgaW4gdGhlIGlkbGUgbG9vcCBhdCB0aGlzIHBvaW50IGFuZCBiZWNhdXNlCisJICogaHJ0aW1lcl97c3RhcnQvY2FuY2VsfSBmdW5jdGlvbnMgY2FsbCBpbnRvIHRyYWNpbmcsCisJICogY2FsbHMgdG8gdGhlc2UgZnVuY3Rpb25zIG11c3QgYmUgYm91bmQgd2l0aGluIFJDVV9OT05JRExFLgogCSAqLwotCWlmIChocnRpbWVyX3RyeV90b19jYW5jZWwoJmJjdGltZXIpID49IDApIHsKLQkJaHJ0aW1lcl9zdGFydCgmYmN0aW1lciwgZXhwaXJlcywgSFJUSU1FUl9NT0RFX0FCU19QSU5ORUQpOworCVJDVV9OT05JRExFKGJjX21vdmVkID0gKGhydGltZXJfdHJ5X3RvX2NhbmNlbCgmYmN0aW1lcikgPj0gMCkgPworCQkhaHJ0aW1lcl9zdGFydCgmYmN0aW1lciwgZXhwaXJlcywgSFJUSU1FUl9NT0RFX0FCU19QSU5ORUQpIDoKKwkJCTApOworCWlmIChiY19tb3ZlZCkgewogCQkvKiBCaW5kIHRoZSAiZGV2aWNlIiB0byB0aGUgY3B1ICovCiAJCWJjLT5ib3VuZF9vbiA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl9IGVsc2UgaWYgKGJjLT5ib3VuZF9vbiA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMgYi9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jCmluZGV4IDA2NmYwZWMuLjdlOGNhNGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMKKysrIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwpAQCAtMzMsMTIgKzMzLDE0IEBACiBzdGF0aWMgY3B1bWFza192YXJfdCB0aWNrX2Jyb2FkY2FzdF9vbjsKIHN0YXRpYyBjcHVtYXNrX3Zhcl90IHRtcG1hc2s7CiBzdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyh0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKLXN0YXRpYyBpbnQgdGlja19icm9hZGNhc3RfZm9yY2U7CitzdGF0aWMgaW50IHRpY2tfYnJvYWRjYXN0X2ZvcmNlZDsKIAogI2lmZGVmIENPTkZJR19USUNLX09ORVNIT1QKIHN0YXRpYyB2b2lkIHRpY2tfYnJvYWRjYXN0X2NsZWFyX29uZXNob3QoaW50IGNwdSk7CitzdGF0aWMgdm9pZCB0aWNrX3Jlc3VtZV9icm9hZGNhc3Rfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYyk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X2NsZWFyX29uZXNob3QoaW50IGNwdSkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19yZXN1bWVfYnJvYWRjYXN0X29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpIHsgfQogI2VuZGlmCiAKIC8qCkBAIC0zMDMsNyArMzA1LDcgQEAKIAkvKgogCSAqIFRoZSBkZXZpY2UgaXMgaW4gcGVyaW9kaWMgbW9kZS4gTm8gcmVwcm9ncmFtbWluZyBuZWNlc3Nhcnk6CiAJICovCi0JaWYgKGRldi0+bW9kZSA9PSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKKwlpZiAoZGV2LT5zdGF0ZSA9PSBDTE9DS19FVlRfU1RBVEVfUEVSSU9ESUMpCiAJCWdvdG8gdW5sb2NrOwogCiAJLyoKQEAgLTMyNCw0OSArMzI2LDU0IEBACiAJcmF3X3NwaW5fdW5sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKIH0KIAotLyoKLSAqIFBvd2Vyc3RhdGUgaW5mb3JtYXRpb246IFRoZSBzeXN0ZW0gZW50ZXJzL2xlYXZlcyBhIHN0YXRlLCB3aGVyZQotICogYWZmZWN0ZWQgZGV2aWNlcyBtaWdodCBzdG9wCisvKioKKyAqIHRpY2tfYnJvYWRjYXN0X2NvbnRyb2wgLSBFbmFibGUvZGlzYWJsZSBvciBmb3JjZSBicm9hZGNhc3QgbW9kZQorICogQG1vZGU6CVRoZSBzZWxlY3RlZCBicm9hZGNhc3QgbW9kZQorICoKKyAqIENhbGxlZCB3aGVuIHRoZSBzeXN0ZW0gZW50ZXJzIGEgc3RhdGUgd2hlcmUgYWZmZWN0ZWQgdGljayBkZXZpY2VzCisgKiBtaWdodCBzdG9wLiBOb3RlOiBUSUNLX0JST0FEQ0FTVF9GT1JDRSBjYW5ub3QgYmUgdW5kb25lLgorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIHNvIGNsb2NrZXZlbnRzX2xvY2sgaXMgbm90CisgKiByZXF1aXJlZCBoZXJlIGJlY2F1c2UgdGhlIGxvY2FsIGNsb2NrIGV2ZW50IGRldmljZSBjYW5ub3QgZ28gYXdheQorICogdW5kZXIgdXMuCiAgKi8KLXN0YXRpYyB2b2lkIHRpY2tfZG9fYnJvYWRjYXN0X29uX29mZih1bnNpZ25lZCBsb25nICpyZWFzb24pCit2b2lkIHRpY2tfYnJvYWRjYXN0X2NvbnRyb2woZW51bSB0aWNrX2Jyb2FkY2FzdF9tb2RlIG1vZGUpCiB7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMsICpkZXY7CiAJc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjcHUsIGJjX3N0b3BwZWQ7CiAKLQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKLQotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl0ZCA9ICZwZXJfY3B1KHRpY2tfY3B1X2RldmljZSwgY3B1KTsKKwl0ZCA9IHRoaXNfY3B1X3B0cigmdGlja19jcHVfZGV2aWNlKTsKIAlkZXYgPSB0ZC0+ZXZ0ZGV2OwotCWJjID0gdGlja19icm9hZGNhc3RfZGV2aWNlLmV2dGRldjsKIAogCS8qCiAJICogSXMgdGhlIGRldmljZSBub3QgYWZmZWN0ZWQgYnkgdGhlIHBvd2Vyc3RhdGUgPwogCSAqLwogCWlmICghZGV2IHx8ICEoZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX0MzU1RPUCkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAKIAlpZiAoIXRpY2tfZGV2aWNlX2lzX2Z1bmN0aW9uYWwoZGV2KSkKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAorCXJhd19zcGluX2xvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwliYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CiAJYmNfc3RvcHBlZCA9IGNwdW1hc2tfZW1wdHkodGlja19icm9hZGNhc3RfbWFzayk7CiAKLQlzd2l0Y2ggKCpyZWFzb24pIHsKLQljYXNlIENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OOgotCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRk9SQ0U6CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBUSUNLX0JST0FEQ0FTVF9GT1JDRToKKwkJdGlja19icm9hZGNhc3RfZm9yY2VkID0gMTsKKwljYXNlIFRJQ0tfQlJPQURDQVNUX09OOgogCQljcHVtYXNrX3NldF9jcHUoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbik7CiAJCWlmICghY3B1bWFza190ZXN0X2FuZF9zZXRfY3B1KGNwdSwgdGlja19icm9hZGNhc3RfbWFzaykpIHsKIAkJCWlmICh0aWNrX2Jyb2FkY2FzdF9kZXZpY2UubW9kZSA9PQogCQkJICAgIFRJQ0tERVZfTU9ERV9QRVJJT0RJQykKIAkJCQljbG9ja2V2ZW50c19zaHV0ZG93bihkZXYpOwogCQl9Ci0JCWlmICgqcmVhc29uID09IENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0ZPUkNFKQotCQkJdGlja19icm9hZGNhc3RfZm9yY2UgPSAxOwogCQlicmVhazsKLQljYXNlIENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09GRjoKLQkJaWYgKHRpY2tfYnJvYWRjYXN0X2ZvcmNlKQorCisJY2FzZSBUSUNLX0JST0FEQ0FTVF9PRkY6CisJCWlmICh0aWNrX2Jyb2FkY2FzdF9mb3JjZWQpCiAJCQlicmVhazsKIAkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbik7CiAJCWlmICghdGlja19kZXZpY2VfaXNfZnVuY3Rpb25hbChkZXYpKQpAQCAtMzg4LDIyICszOTUsOSBAQAogCQllbHNlCiAJCQl0aWNrX2Jyb2FkY2FzdF9zZXR1cF9vbmVzaG90KGJjKTsKIAl9Ci1vdXQ6Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKKwlyYXdfc3Bpbl91bmxvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOwogfQotCi0vKgotICogUG93ZXJzdGF0ZSBpbmZvcm1hdGlvbjogVGhlIHN5c3RlbSBlbnRlcnMvbGVhdmVzIGEgc3RhdGUsIHdoZXJlCi0gKiBhZmZlY3RlZCBkZXZpY2VzIG1pZ2h0IHN0b3AuCi0gKi8KLXZvaWQgdGlja19icm9hZGNhc3Rfb25fb2ZmKHVuc2lnbmVkIGxvbmcgcmVhc29uLCBpbnQgKm9uY3B1KQotewotCWlmICghY3B1bWFza190ZXN0X2NwdSgqb25jcHUsIGNwdV9vbmxpbmVfbWFzaykpCi0JCXByaW50ayhLRVJOX0VSUiAidGljay1icm9hZGNhc3Q6IGlnbm9yaW5nIGJyb2FkY2FzdCBmb3IgIgotCQkgICAgICAgIm9mZmxpbmUgQ1BVICMlZFxuIiwgKm9uY3B1KTsKLQllbHNlCi0JCXRpY2tfZG9fYnJvYWRjYXN0X29uX29mZigmcmVhc29uKTsKLX0KK0VYUE9SVF9TWU1CT0xfR1BMKHRpY2tfYnJvYWRjYXN0X2NvbnRyb2wpOwogCiAvKgogICogU2V0IHRoZSBwZXJpb2RpYyBoYW5kbGVyIGRlcGVuZGluZyBvbiBicm9hZGNhc3Qgb24vb2ZmCkBAIC00MTYsMTQgKzQxMCwxNCBAQAogCQlkZXYtPmV2ZW50X2hhbmRsZXIgPSB0aWNrX2hhbmRsZV9wZXJpb2RpY19icm9hZGNhc3Q7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIC8qCiAgKiBSZW1vdmUgYSBDUFUgZnJvbSBicm9hZGNhc3RpbmcKICAqLwotdm9pZCB0aWNrX3NodXRkb3duX2Jyb2FkY2FzdCh1bnNpZ25lZCBpbnQgKmNwdXApCit2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0KHVuc2lnbmVkIGludCBjcHUpCiB7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmM7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gKmNwdXA7CiAKIAlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKIApAQCAtNDM4LDYgKzQzMiw3IEBACiAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOwogfQorI2VuZGlmCiAKIHZvaWQgdGlja19zdXNwZW5kX2Jyb2FkY2FzdCh2b2lkKQogewpAQCAtNDUzLDM4ICs0NDgsNDggQEAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOwogfQogCi1pbnQgdGlja19yZXN1bWVfYnJvYWRjYXN0KHZvaWQpCisvKgorICogVGhpcyBpcyBjYWxsZWQgZnJvbSB0aWNrX3Jlc3VtZV9sb2NhbCgpIG9uIGEgcmVzdW1pbmcgQ1BVLiBUaGF0J3MKKyAqIGNhbGxlZCBmcm9tIHRoZSBjb3JlIHJlc3VtZSBmdW5jdGlvbiwgdGlja191bmZyZWV6ZSgpIGFuZCB0aGUgbWFnaWMgWEVOCisgKiByZXN1bWUgaGFja2VyeS4KKyAqCisgKiBJbiBub25lIG9mIHRoZXNlIGNhc2VzIHRoZSBicm9hZGNhc3QgZGV2aWNlIG1vZGUgY2FuIGNoYW5nZSBhbmQgdGhlCisgKiBiaXQgb2YgdGhlIHJlc3VtaW5nIENQVSBpbiB0aGUgYnJvYWRjYXN0IG1hc2sgaXMgc2FmZSBhcyB3ZWxsLgorICovCitib29sIHRpY2tfcmVzdW1lX2NoZWNrX2Jyb2FkY2FzdCh2b2lkKQoreworCWlmICh0aWNrX2Jyb2FkY2FzdF9kZXZpY2UubW9kZSA9PSBUSUNLREVWX01PREVfT05FU0hPVCkKKwkJcmV0dXJuIGZhbHNlOworCWVsc2UKKwkJcmV0dXJuIGNwdW1hc2tfdGVzdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCB0aWNrX2Jyb2FkY2FzdF9tYXNrKTsKK30KKwordm9pZCB0aWNrX3Jlc3VtZV9icm9hZGNhc3Qodm9pZCkKIHsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBicm9hZGNhc3QgPSAwOwogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CiAKIAliYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CiAKIAlpZiAoYmMpIHsKLQkJY2xvY2tldmVudHNfc2V0X21vZGUoYmMsIENMT0NLX0VWVF9NT0RFX1JFU1VNRSk7CisJCWNsb2NrZXZlbnRzX3RpY2tfcmVzdW1lKGJjKTsKIAogCQlzd2l0Y2ggKHRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlKSB7CiAJCWNhc2UgVElDS0RFVl9NT0RFX1BFUklPRElDOgogCQkJaWYgKCFjcHVtYXNrX2VtcHR5KHRpY2tfYnJvYWRjYXN0X21hc2spKQogCQkJCXRpY2tfYnJvYWRjYXN0X3N0YXJ0X3BlcmlvZGljKGJjKTsKLQkJCWJyb2FkY2FzdCA9IGNwdW1hc2tfdGVzdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLAotCQkJCQkJICAgICB0aWNrX2Jyb2FkY2FzdF9tYXNrKTsKIAkJCWJyZWFrOwogCQljYXNlIFRJQ0tERVZfTU9ERV9PTkVTSE9UOgogCQkJaWYgKCFjcHVtYXNrX2VtcHR5KHRpY2tfYnJvYWRjYXN0X21hc2spKQotCQkJCWJyb2FkY2FzdCA9IHRpY2tfcmVzdW1lX2Jyb2FkY2FzdF9vbmVzaG90KGJjKTsKKwkJCQl0aWNrX3Jlc3VtZV9icm9hZGNhc3Rfb25lc2hvdChiYyk7CiAJCQlicmVhazsKIAkJfQogCX0KIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGJyb2FkY2FzdDsKIH0KIAotCiAjaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAogCiBzdGF0aWMgY3B1bWFza192YXJfdCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2s7CkBAIC01MzIsOCArNTM3LDggQEAKIHsKIAlpbnQgcmV0OwogCi0JaWYgKGJjLT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX09ORVNIT1QpCi0JCWNsb2NrZXZlbnRzX3NldF9tb2RlKGJjLCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwlpZiAoYmMtPnN0YXRlICE9IENMT0NLX0VWVF9TVEFURV9PTkVTSE9UKQorCQljbG9ja2V2ZW50c19zZXRfc3RhdGUoYmMsIENMT0NLX0VWVF9TVEFURV9PTkVTSE9UKTsKIAogCXJldCA9IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoYmMsIGV4cGlyZXMsIGZvcmNlKTsKIAlpZiAoIXJldCkKQEAgLTU0MSwxMCArNTQ2LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgdGlja19yZXN1bWVfYnJvYWRjYXN0X29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpCitzdGF0aWMgdm9pZCB0aWNrX3Jlc3VtZV9icm9hZGNhc3Rfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKIHsKLQljbG9ja2V2ZW50c19zZXRfbW9kZShiYywgQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7Ci0JcmV0dXJuIDA7CisJY2xvY2tldmVudHNfc2V0X3N0YXRlKGJjLCBDTE9DS19FVlRfU1RBVEVfT05FU0hPVCk7CiB9CiAKIC8qCkBAIC01NjIsOCArNTY2LDggQEAKIAkJICogc3dpdGNoZWQgb3ZlciwgbGVhdmUgdGhlIGRldmljZSBhbG9uZS4KIAkJICovCiAJCWlmICh0ZC0+bW9kZSA9PSBUSUNLREVWX01PREVfT05FU0hPVCkgewotCQkJY2xvY2tldmVudHNfc2V0X21vZGUodGQtPmV2dGRldiwKLQkJCQkJICAgICBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwkJCWNsb2NrZXZlbnRzX3NldF9zdGF0ZSh0ZC0+ZXZ0ZGV2LAorCQkJCQkgICAgICBDTE9DS19FVlRfU1RBVEVfT05FU0hPVCk7CiAJCX0KIAl9CiB9CkBAIC02NjYsMzEgKzY3MCwyNiBAQAogCQlpZiAoZGV2LT5uZXh0X2V2ZW50LnR2NjQgPCBiYy0+bmV4dF9ldmVudC50djY0KQogCQkJcmV0dXJuOwogCX0KLQljbG9ja2V2ZW50c19zZXRfbW9kZShkZXYsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKKwljbG9ja2V2ZW50c19zZXRfc3RhdGUoZGV2LCBDTE9DS19FVlRfU1RBVEVfU0hVVERPV04pOwogfQogCi1zdGF0aWMgdm9pZCBicm9hZGNhc3RfbW92ZV9iYyhpbnQgZGVhZGNwdSkKLXsKLQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7Ci0KLQlpZiAoIWJjIHx8ICFicm9hZGNhc3RfbmVlZHNfY3B1KGJjLCBkZWFkY3B1KSkKLQkJcmV0dXJuOwotCS8qIFRoaXMgbW92ZXMgdGhlIGJyb2FkY2FzdCBhc3NpZ25tZW50IHRvIHRoaXMgY3B1ICovCi0JY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChiYywgYmMtPm5leHRfZXZlbnQsIDEpOwotfQotCi0vKgotICogUG93ZXJzdGF0ZSBpbmZvcm1hdGlvbjogVGhlIHN5c3RlbSBlbnRlcnMvbGVhdmVzIGEgc3RhdGUsIHdoZXJlCi0gKiBhZmZlY3RlZCBkZXZpY2VzIG1pZ2h0IHN0b3AKKy8qKgorICogdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sIC0gRW50ZXIvZXhpdCBicm9hZGNhc3Qgb25lc2hvdCBtb2RlCisgKiBAc3RhdGU6CVRoZSB0YXJnZXQgc3RhdGUgKGVudGVyL2V4aXQpCisgKgorICogVGhlIHN5c3RlbSBlbnRlcnMvbGVhdmVzIGEgc3RhdGUsIHdoZXJlIGFmZmVjdGVkIGRldmljZXMgbWlnaHQgc3RvcAogICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FQlVTWSBpZiB0aGUgY3B1IGlzIHVzZWQgdG8gYnJvYWRjYXN0IHdha2V1cHMuCisgKgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZCwgc28gY2xvY2tldmVudHNfbG9jayBpcyBub3QKKyAqIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSB0aGUgbG9jYWwgY2xvY2sgZXZlbnQgZGV2aWNlIGNhbm5vdCBnbyBhd2F5CisgKiB1bmRlciB1cy4KICAqLwotaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikKK2ludCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2woZW51bSB0aWNrX2Jyb2FkY2FzdF9zdGF0ZSBzdGF0ZSkKIHsKIAlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYywgKmRldjsKIAlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Ja3RpbWVfdCBub3c7CiAJaW50IGNwdSwgcmV0ID0gMDsKKwlrdGltZV90IG5vdzsKIAogCS8qCiAJICogUGVyaW9kaWMgbW9kZSBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZSBlbnRlci9leGl0IG9mIHBvd2VyCkBAIC03MDMsMTcgKzcwMiwxNyBAQAogCSAqIFdlIGFyZSBjYWxsZWQgd2l0aCBwcmVlbXRpb24gZGlzYWJsZWQgZnJvbSB0aGUgZGVwdGggb2YgdGhlCiAJICogaWRsZSBjb2RlLCBzbyB3ZSBjYW4ndCBiZSBtb3ZlZCBhd2F5LgogCSAqLwotCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQl0ZCA9ICZwZXJfY3B1KHRpY2tfY3B1X2RldmljZSwgY3B1KTsKKwl0ZCA9IHRoaXNfY3B1X3B0cigmdGlja19jcHVfZGV2aWNlKTsKIAlkZXYgPSB0ZC0+ZXZ0ZGV2OwogCiAJaWYgKCEoZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX0MzU1RPUCkpCiAJCXJldHVybiAwOwogCisJcmF3X3NwaW5fbG9jaygmdGlja19icm9hZGNhc3RfbG9jayk7CiAJYmMgPSB0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2OworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOwotCWlmIChyZWFzb24gPT0gQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIpIHsKKwlpZiAoc3RhdGUgPT0gVElDS19CUk9BRENBU1RfRU5URVIpIHsKIAkJaWYgKCFjcHVtYXNrX3Rlc3RfYW5kX3NldF9jcHUoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spKSB7CiAJCQlXQVJOX09OX09OQ0UoY3B1bWFza190ZXN0X2NwdShjcHUsIHRpY2tfYnJvYWRjYXN0X3BlbmRpbmdfbWFzaykpOwogCQkJYnJvYWRjYXN0X3NodXRkb3duX2xvY2FsKGJjLCBkZXYpOwpAQCAtNzQxLDcgKzc0MCw3IEBACiAJCQljcHVtYXNrX2NsZWFyX2NwdShjcHUsIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfbWFzayk7CiAJfSBlbHNlIHsKIAkJaWYgKGNwdW1hc2tfdGVzdF9hbmRfY2xlYXJfY3B1KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKSkgewotCQkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwkJCWNsb2NrZXZlbnRzX3NldF9zdGF0ZShkZXYsIENMT0NLX0VWVF9TVEFURV9PTkVTSE9UKTsKIAkJCS8qCiAJCQkgKiBUaGUgY3B1IHdoaWNoIHdhcyBoYW5kbGluZyB0aGUgYnJvYWRjYXN0CiAJCQkgKiB0aW1lciBtYXJrZWQgdGhpcyBjcHUgaW4gdGhlIGJyb2FkY2FzdApAQCAtODA1LDkgKzgwNCwxMCBAQAogCQl9CiAJfQogb3V0OgotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CisJcmF3X3NwaW5fdW5sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwodGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKTsKIAogLyoKICAqIFJlc2V0IHRoZSBvbmUgc2hvdCBicm9hZGNhc3QgZm9yIGEgY3B1CkBAIC04NDIsNyArODQyLDcgQEAKIAogCS8qIFNldCBpdCB1cCBvbmx5IG9uY2UgISAqLwogCWlmIChiYy0+ZXZlbnRfaGFuZGxlciAhPSB0aWNrX2hhbmRsZV9vbmVzaG90X2Jyb2FkY2FzdCkgewotCQlpbnQgd2FzX3BlcmlvZGljID0gYmMtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM7CisJCWludCB3YXNfcGVyaW9kaWMgPSBiYy0+c3RhdGUgPT0gQ0xPQ0tfRVZUX1NUQVRFX1BFUklPRElDOwogCiAJCWJjLT5ldmVudF9oYW5kbGVyID0gdGlja19oYW5kbGVfb25lc2hvdF9icm9hZGNhc3Q7CiAKQEAgLTg1OCw3ICs4NTgsNyBAQAogCQkJICAgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrLCB0bXBtYXNrKTsKIAogCQlpZiAod2FzX3BlcmlvZGljICYmICFjcHVtYXNrX2VtcHR5KHRtcG1hc2spKSB7Ci0JCQljbG9ja2V2ZW50c19zZXRfbW9kZShiYywgQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7CisJCQljbG9ja2V2ZW50c19zZXRfc3RhdGUoYmMsIENMT0NLX0VWVF9TVEFURV9PTkVTSE9UKTsKIAkJCXRpY2tfYnJvYWRjYXN0X2luaXRfbmV4dF9ldmVudCh0bXBtYXNrLAogCQkJCQkJICAgICAgIHRpY2tfbmV4dF9wZXJpb2QpOwogCQkJdGlja19icm9hZGNhc3Rfc2V0X2V2ZW50KGJjLCBjcHUsIHRpY2tfbmV4dF9wZXJpb2QsIDEpOwpAQCAtODk0LDE0ICs4OTQsMjggQEAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOwogfQogCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCit2b2lkIGhvdHBsdWdfY3B1X19icm9hZGNhc3RfdGlja19wdWxsKGludCBkZWFkY3B1KQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKKwliYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CisKKwlpZiAoYmMgJiYgYnJvYWRjYXN0X25lZWRzX2NwdShiYywgZGVhZGNwdSkpIHsKKwkJLyogVGhpcyBtb3ZlcyB0aGUgYnJvYWRjYXN0IGFzc2lnbm1lbnQgdG8gdGhpcyBDUFU6ICovCisJCWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoYmMsIGJjLT5uZXh0X2V2ZW50LCAxKTsKKwl9CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKK30KIAogLyoKICAqIFJlbW92ZSBhIGRlYWQgQ1BVIGZyb20gYnJvYWRjYXN0aW5nCiAgKi8KLXZvaWQgdGlja19zaHV0ZG93bl9icm9hZGNhc3Rfb25lc2hvdCh1bnNpZ25lZCBpbnQgKmNwdXApCit2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBjcHUgPSAqY3B1cDsKIAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOwogCkBAIC05MTMsMTAgKzkyNyw5IEBACiAJY3B1bWFza19jbGVhcl9jcHUoY3B1LCB0aWNrX2Jyb2FkY2FzdF9wZW5kaW5nX21hc2spOwogCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgdGlja19icm9hZGNhc3RfZm9yY2VfbWFzayk7CiAKLQlicm9hZGNhc3RfbW92ZV9iYyhjcHUpOwotCiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKIH0KKyNlbmRpZgogCiAvKgogICogQ2hlY2ssIHdoZXRoZXIgdGhlIGJyb2FkY2FzdCBkZXZpY2UgaXMgaW4gb25lIHNob3QgbW9kZQpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1jb21tb24uYyBiL2tlcm5lbC90aW1lL3RpY2stY29tbW9uLmMKaW5kZXggZjdjNTE1NS4uM2FlNmFmYSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGljay1jb21tb24uYworKysgYi9rZXJuZWwvdGltZS90aWNrLWNvbW1vbi5jCkBAIC0xMDIsNyArMTAyLDcgQEAKIAogCXRpY2tfcGVyaW9kaWMoY3B1KTsKIAotCWlmIChkZXYtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCkKKwlpZiAoZGV2LT5zdGF0ZSAhPSBDTE9DS19FVlRfU1RBVEVfT05FU0hPVCkKIAkJcmV0dXJuOwogCWZvciAoOzspIHsKIAkJLyoKQEAgLTE0MCw3ICsxNDAsNyBAQAogCiAJaWYgKChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMpICYmCiAJICAgICF0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2FjdGl2ZSgpKSB7Ci0JCWNsb2NrZXZlbnRzX3NldF9tb2RlKGRldiwgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUMpOworCQljbG9ja2V2ZW50c19zZXRfc3RhdGUoZGV2LCBDTE9DS19FVlRfU1RBVEVfUEVSSU9ESUMpOwogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGxvbmcgc2VxOwogCQlrdGltZV90IG5leHQ7CkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJCW5leHQgPSB0aWNrX25leHRfcGVyaW9kOwogCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZqaWZmaWVzX2xvY2ssIHNlcSkpOwogCi0JCWNsb2NrZXZlbnRzX3NldF9tb2RlKGRldiwgQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7CisJCWNsb2NrZXZlbnRzX3NldF9zdGF0ZShkZXYsIENMT0NLX0VWVF9TVEFURV9PTkVTSE9UKTsKIAogCQlmb3IgKDs7KSB7CiAJCQlpZiAoIWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBuZXh0LCBmYWxzZSkpCkBAIC0zMzIsMTQgKzMzMiwxNiBAQAogCXRpY2tfaW5zdGFsbF9icm9hZGNhc3RfZGV2aWNlKG5ld2Rldik7CiB9CiAKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIC8qCiAgKiBUcmFuc2ZlciB0aGUgZG9fdGltZXIgam9iIGF3YXkgZnJvbSBhIGR5aW5nIGNwdS4KICAqCi0gKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4gTm90IGxvY2tpbmcgcmVxdWlyZWQuIElmCisgKiB0aWNrX2RvX3RpbWVyX2NwdSBpcyBvd25lZCBieSB0aGlzIGNwdSwgbm90aGluZyBjYW4gY2hhbmdlIGl0LgogICovCi12b2lkIHRpY2tfaGFuZG92ZXJfZG9fdGltZXIoaW50ICpjcHVwKQordm9pZCB0aWNrX2hhbmRvdmVyX2RvX3RpbWVyKHZvaWQpCiB7Ci0JaWYgKCpjcHVwID09IHRpY2tfZG9fdGltZXJfY3B1KSB7CisJaWYgKHRpY2tfZG9fdGltZXJfY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkgewogCQlpbnQgY3B1ID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOwogCiAJCXRpY2tfZG9fdGltZXJfY3B1ID0gKGNwdSA8IG5yX2NwdV9pZHMpID8gY3B1IDoKQEAgLTM1NCw5ICszNTYsOSBAQAogICogYWNjZXNzIHRoZSBoYXJkd2FyZSBkZXZpY2UgaXRzZWxmLgogICogV2UganVzdCBzZXQgdGhlIG1vZGUgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0cy4KICAqLwotdm9pZCB0aWNrX3NodXRkb3duKHVuc2lnbmVkIGludCAqY3B1cCkKK3ZvaWQgdGlja19zaHV0ZG93bih1bnNpZ25lZCBpbnQgY3B1KQogewotCXN0cnVjdCB0aWNrX2RldmljZSAqdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsICpjcHVwKTsKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkID0gJnBlcl9jcHUodGlja19jcHVfZGV2aWNlLCBjcHUpOwogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiA9IHRkLT5ldnRkZXY7CiAKIAl0ZC0+bW9kZSA9IFRJQ0tERVZfTU9ERV9QRVJJT0RJQzsKQEAgLTM2NSwyNyArMzY3LDQyIEBACiAJCSAqIFByZXZlbnQgdGhhdCB0aGUgY2xvY2sgZXZlbnRzIGxheWVyIHRyaWVzIHRvIGNhbGwKIAkJICogdGhlIHNldCBtb2RlIGZ1bmN0aW9uIQogCQkgKi8KKwkJZGV2LT5zdGF0ZSA9IENMT0NLX0VWVF9TVEFURV9ERVRBQ0hFRDsKIAkJZGV2LT5tb2RlID0gQ0xPQ0tfRVZUX01PREVfVU5VU0VEOwogCQljbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UoZGV2LCBOVUxMKTsKIAkJZGV2LT5ldmVudF9oYW5kbGVyID0gY2xvY2tldmVudHNfaGFuZGxlX25vb3A7CiAJCXRkLT5ldnRkZXYgPSBOVUxMOwogCX0KIH0KKyNlbmRpZgogCi12b2lkIHRpY2tfc3VzcGVuZCh2b2lkKQorLyoqCisgKiB0aWNrX3N1c3BlbmRfbG9jYWwgLSBTdXNwZW5kIHRoZSBsb2NhbCB0aWNrIGRldmljZQorICoKKyAqIENhbGxlZCBmcm9tIHRoZSBsb2NhbCBjcHUgZm9yIGZyZWV6ZSB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKgorICogTm8gbG9ja3MgcmVxdWlyZWQuIE5vdGhpbmcgY2FuIGNoYW5nZSB0aGUgcGVyIGNwdSBkZXZpY2UuCisgKi8KK3ZvaWQgdGlja19zdXNwZW5kX2xvY2FsKHZvaWQpCiB7CiAJc3RydWN0IHRpY2tfZGV2aWNlICp0ZCA9IHRoaXNfY3B1X3B0cigmdGlja19jcHVfZGV2aWNlKTsKIAogCWNsb2NrZXZlbnRzX3NodXRkb3duKHRkLT5ldnRkZXYpOwogfQogCi12b2lkIHRpY2tfcmVzdW1lKHZvaWQpCisvKioKKyAqIHRpY2tfcmVzdW1lX2xvY2FsIC0gUmVzdW1lIHRoZSBsb2NhbCB0aWNrIGRldmljZQorICoKKyAqIENhbGxlZCBmcm9tIHRoZSBsb2NhbCBDUFUgZm9yIHVuZnJlZXplIG9yIFhFTiByZXN1bWUgbWFnaWMuCisgKgorICogTm8gbG9ja3MgcmVxdWlyZWQuIE5vdGhpbmcgY2FuIGNoYW5nZSB0aGUgcGVyIGNwdSBkZXZpY2UuCisgKi8KK3ZvaWQgdGlja19yZXN1bWVfbG9jYWwodm9pZCkKIHsKIAlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkID0gdGhpc19jcHVfcHRyKCZ0aWNrX2NwdV9kZXZpY2UpOwotCWludCBicm9hZGNhc3QgPSB0aWNrX3Jlc3VtZV9icm9hZGNhc3QoKTsKKwlib29sIGJyb2FkY2FzdCA9IHRpY2tfcmVzdW1lX2NoZWNrX2Jyb2FkY2FzdCgpOwogCi0JY2xvY2tldmVudHNfc2V0X21vZGUodGQtPmV2dGRldiwgQ0xPQ0tfRVZUX01PREVfUkVTVU1FKTsKLQorCWNsb2NrZXZlbnRzX3RpY2tfcmVzdW1lKHRkLT5ldnRkZXYpOwogCWlmICghYnJvYWRjYXN0KSB7CiAJCWlmICh0ZC0+bW9kZSA9PSBUSUNLREVWX01PREVfUEVSSU9ESUMpCiAJCQl0aWNrX3NldHVwX3BlcmlvZGljKHRkLT5ldnRkZXYsIDApOwpAQCAtMzk0LDYgKzQxMSwzNSBAQAogCX0KIH0KIAorLyoqCisgKiB0aWNrX3N1c3BlbmQgLSBTdXNwZW5kIHRoZSB0aWNrIGFuZCB0aGUgYnJvYWRjYXN0IGRldmljZQorICoKKyAqIENhbGxlZCBmcm9tIHN5c2NvcmVfc3VzcGVuZCgpIHZpYSB0aW1la2VlcGluZ19zdXNwZW5kIHdpdGggb25seSBvbmUKKyAqIENQVSBvbmxpbmUgYW5kIGludGVycnVwdHMgZGlzYWJsZWQgb3IgZnJvbSB0aWNrX3VuZnJlZXplKCkgdW5kZXIKKyAqIHRpY2tfZnJlZXplX2xvY2suCisgKgorICogTm8gbG9ja3MgcmVxdWlyZWQuIE5vdGhpbmcgY2FuIGNoYW5nZSB0aGUgcGVyIGNwdSBkZXZpY2UuCisgKi8KK3ZvaWQgdGlja19zdXNwZW5kKHZvaWQpCit7CisJdGlja19zdXNwZW5kX2xvY2FsKCk7CisJdGlja19zdXNwZW5kX2Jyb2FkY2FzdCgpOworfQorCisvKioKKyAqIHRpY2tfcmVzdW1lIC0gUmVzdW1lIHRoZSB0aWNrIGFuZCB0aGUgYnJvYWRjYXN0IGRldmljZQorICoKKyAqIENhbGxlZCBmcm9tIHN5c2NvcmVfcmVzdW1lKCkgdmlhIHRpbWVrZWVwaW5nX3Jlc3VtZSB3aXRoIG9ubHkgb25lCisgKiBDUFUgb25saW5lIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICoKKyAqIE5vIGxvY2tzIHJlcXVpcmVkLiBOb3RoaW5nIGNhbiBjaGFuZ2UgdGhlIHBlciBjcHUgZGV2aWNlLgorICovCit2b2lkIHRpY2tfcmVzdW1lKHZvaWQpCit7CisJdGlja19yZXN1bWVfYnJvYWRjYXN0KCk7CisJdGlja19yZXN1bWVfbG9jYWwoKTsKK30KKwogc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sodGlja19mcmVlemVfbG9jayk7CiBzdGF0aWMgdW5zaWduZWQgaW50IHRpY2tfZnJlZXplX2RlcHRoOwogCkBAIC00MTEsMTIgKzQ1NywxMCBAQAogCXJhd19zcGluX2xvY2soJnRpY2tfZnJlZXplX2xvY2spOwogCiAJdGlja19mcmVlemVfZGVwdGgrKzsKLQlpZiAodGlja19mcmVlemVfZGVwdGggPT0gbnVtX29ubGluZV9jcHVzKCkpIHsKKwlpZiAodGlja19mcmVlemVfZGVwdGggPT0gbnVtX29ubGluZV9jcHVzKCkpCiAJCXRpbWVrZWVwaW5nX3N1c3BlbmQoKTsKLQl9IGVsc2UgewotCQl0aWNrX3N1c3BlbmQoKTsKLQkJdGlja19zdXNwZW5kX2Jyb2FkY2FzdCgpOwotCX0KKwllbHNlCisJCXRpY2tfc3VzcGVuZF9sb2NhbCgpOwogCiAJcmF3X3NwaW5fdW5sb2NrKCZ0aWNrX2ZyZWV6ZV9sb2NrKTsKIH0KQEAgLTQzNyw3ICs0ODEsNyBAQAogCWlmICh0aWNrX2ZyZWV6ZV9kZXB0aCA9PSBudW1fb25saW5lX2NwdXMoKSkKIAkJdGltZWtlZXBpbmdfcmVzdW1lKCk7CiAJZWxzZQotCQl0aWNrX3Jlc3VtZSgpOworCQl0aWNrX3Jlc3VtZV9sb2NhbCgpOwogCiAJdGlja19mcmVlemVfZGVwdGgtLTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1pbnRlcm5hbC5oIGIva2VybmVsL3RpbWUvdGljay1pbnRlcm5hbC5oCmluZGV4IDM2NmFlYjQuLmI2NGZkZDggMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaAorKysgYi9rZXJuZWwvdGltZS90aWNrLWludGVybmFsLmgKQEAgLTUsMTUgKzUsMTIgQEAKICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAKICNpbmNsdWRlICJ0aW1la2VlcGluZy5oIgorI2luY2x1ZGUgInRpY2stc2NoZWQuaCIKIAotZXh0ZXJuIHNlcWxvY2tfdCBqaWZmaWVzX2xvY2s7CisjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMKIAotI2RlZmluZSBDU19OQU1FX0xFTgkzMgotCi0jaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlVJTEQKLQotI2RlZmluZSBUSUNLX0RPX1RJTUVSX05PTkUJLTEKLSNkZWZpbmUgVElDS19ET19USU1FUl9CT09UCS0yCisjIGRlZmluZSBUSUNLX0RPX1RJTUVSX05PTkUJLTEKKyMgZGVmaW5lIFRJQ0tfRE9fVElNRVJfQk9PVAktMgogCiBERUNMQVJFX1BFUl9DUFUoc3RydWN0IHRpY2tfZGV2aWNlLCB0aWNrX2NwdV9kZXZpY2UpOwogZXh0ZXJuIGt0aW1lX3QgdGlja19uZXh0X3BlcmlvZDsKQEAgLTIzLDIxICsyMCw3MiBAQAogZXh0ZXJuIHZvaWQgdGlja19zZXR1cF9wZXJpb2RpYyhzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIGludCBicm9hZGNhc3QpOwogZXh0ZXJuIHZvaWQgdGlja19oYW5kbGVfcGVyaW9kaWMoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KTsKIGV4dGVybiB2b2lkIHRpY2tfY2hlY2tfbmV3X2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgdGlja19oYW5kb3Zlcl9kb190aW1lcihpbnQgKmNwdXApOwotZXh0ZXJuIHZvaWQgdGlja19zaHV0ZG93bih1bnNpZ25lZCBpbnQgKmNwdXApOworZXh0ZXJuIHZvaWQgdGlja19zaHV0ZG93bih1bnNpZ25lZCBpbnQgY3B1KTsKIGV4dGVybiB2b2lkIHRpY2tfc3VzcGVuZCh2b2lkKTsKIGV4dGVybiB2b2lkIHRpY2tfcmVzdW1lKHZvaWQpOwogZXh0ZXJuIGJvb2wgdGlja19jaGVja19yZXBsYWNlbWVudChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjdXJkZXYsCiAJCQkJICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3ZGV2KTsKIGV4dGVybiB2b2lkIHRpY2tfaW5zdGFsbF9yZXBsYWNlbWVudChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCB0aWNrX2lzX29uZXNob3RfYXZhaWxhYmxlKHZvaWQpOworZXh0ZXJuIHN0cnVjdCB0aWNrX2RldmljZSAqdGlja19nZXRfZGV2aWNlKGludCBjcHUpOworCitleHRlcm4gaW50IGNsb2NrZXZlbnRzX3RpY2tfcmVzdW1lKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CisvKiBDaGVjaywgaWYgdGhlIGRldmljZSBpcyBmdW5jdGlvbmFsIG9yIGEgZHVtbXkgZm9yIGJyb2FkY2FzdCAqLworc3RhdGljIGlubGluZSBpbnQgdGlja19kZXZpY2VfaXNfZnVuY3Rpb25hbChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICEoZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX0RVTU1ZKTsKK30KIAogZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfc2h1dGRvd24oc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KTsKLQorZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm9sZCwKKwkJCQkJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3KTsKK2V4dGVybiB2b2lkIGNsb2NrZXZlbnRzX3NldF9zdGF0ZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsCisJCQkJIGVudW0gY2xvY2tfZXZlbnRfc3RhdGUgc3RhdGUpOworZXh0ZXJuIGludCBjbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIGt0aW1lX3QgZXhwaXJlcywgYm9vbCBmb3JjZSk7CitleHRlcm4gdm9pZCBjbG9ja2V2ZW50c19oYW5kbGVfbm9vcChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOworZXh0ZXJuIGludCBfX2Nsb2NrZXZlbnRzX3VwZGF0ZV9mcmVxKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgdTMyIGZyZXEpOwogZXh0ZXJuIHNzaXplX3Qgc3lzZnNfZ2V0X3VuYW1lKGNvbnN0IGNoYXIgKmJ1ZiwgY2hhciAqZHN0LCBzaXplX3QgY250KTsKIAotLyoKLSAqIE5PX0haIC8gaGlnaCByZXNvbHV0aW9uIHRpbWVyIHNoYXJlZCBjb2RlCi0gKi8KKy8qIEJyb2FkY2FzdGluZyBzdXBwb3J0ICovCisjIGlmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAorZXh0ZXJuIGludCB0aWNrX2RldmljZV91c2VzX2Jyb2FkY2FzdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIGludCBjcHUpOworZXh0ZXJuIHZvaWQgdGlja19pbnN0YWxsX2Jyb2FkY2FzdF9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KTsKK2V4dGVybiBpbnQgdGlja19pc19icm9hZGNhc3RfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CitleHRlcm4gdm9pZCB0aWNrX3NodXRkb3duX2Jyb2FkY2FzdCh1bnNpZ25lZCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIHRpY2tfc3VzcGVuZF9icm9hZGNhc3Qodm9pZCk7CitleHRlcm4gdm9pZCB0aWNrX3Jlc3VtZV9icm9hZGNhc3Qodm9pZCk7CitleHRlcm4gYm9vbCB0aWNrX3Jlc3VtZV9jaGVja19icm9hZGNhc3Qodm9pZCk7CitleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgdGlja19zZXRfcGVyaW9kaWNfaGFuZGxlcihzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIGludCBicm9hZGNhc3QpOworZXh0ZXJuIGludCB0aWNrX2Jyb2FkY2FzdF91cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIHUzMiBmcmVxKTsKK2V4dGVybiBzdHJ1Y3QgdGlja19kZXZpY2UgKnRpY2tfZ2V0X2Jyb2FkY2FzdF9kZXZpY2Uodm9pZCk7CitleHRlcm4gc3RydWN0IGNwdW1hc2sgKnRpY2tfZ2V0X2Jyb2FkY2FzdF9tYXNrKHZvaWQpOworIyBlbHNlIC8qICFDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1Q6ICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19pbnN0YWxsX2Jyb2FkY2FzdF9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KSB7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfaXNfYnJvYWRjYXN0X2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfZGV2aWNlX3VzZXNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGNwdSkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0KHVuc2lnbmVkIGludCBjcHUpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc3VzcGVuZF9icm9hZGNhc3Qodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19yZXN1bWVfYnJvYWRjYXN0KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSBib29sIHRpY2tfcmVzdW1lX2NoZWNrX2Jyb2FkY2FzdCh2b2lkKSB7IHJldHVybiBmYWxzZTsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X2luaXQodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIGludCB0aWNrX2Jyb2FkY2FzdF91cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIHUzMiBmcmVxKSB7IHJldHVybiAtRU5PREVWOyB9CisKKy8qIFNldCB0aGUgcGVyaW9kaWMgaGFuZGxlciBpbiBub24gYnJvYWRjYXN0IG1vZGUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3NldF9wZXJpb2RpY19oYW5kbGVyKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGJyb2FkY2FzdCkKK3sKKwlkZXYtPmV2ZW50X2hhbmRsZXIgPSB0aWNrX2hhbmRsZV9wZXJpb2RpYzsKK30KKyMgZW5kaWYgLyogIUNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVCAqLworCisjZWxzZSAvKiAhR0VORVJJQ19DTE9DS0VWRU5UUzogKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3N1c3BlbmQodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19yZXN1bWUodm9pZCkgeyB9CisjZW5kaWYgLyogIUdFTkVSSUNfQ0xPQ0tFVkVOVFMgKi8KKworLyogT25lc2hvdCByZWxhdGVkIGZ1bmN0aW9ucyAqLwogI2lmZGVmIENPTkZJR19USUNLX09ORVNIT1QKIGV4dGVybiB2b2lkIHRpY2tfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpuZXdkZXYsCiAJCQkgICAgICAgdm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKiksCkBAIC00Niw1OCArOTQsNDIgQEAKIGV4dGVybiB2b2lkIHRpY2tfb25lc2hvdF9ub3RpZnkodm9pZCk7CiBleHRlcm4gaW50IHRpY2tfc3dpdGNoX3RvX29uZXNob3Qodm9pZCAoKmhhbmRsZXIpKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKikpOwogZXh0ZXJuIHZvaWQgdGlja19yZXN1bWVfb25lc2hvdCh2b2lkKTsKLSMgaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCi1leHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKTsKLWV4dGVybiBpbnQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKTsKLWV4dGVybiB2b2lkIHRpY2tfYnJvYWRjYXN0X3N3aXRjaF90b19vbmVzaG90KHZvaWQpOwotZXh0ZXJuIHZvaWQgdGlja19zaHV0ZG93bl9icm9hZGNhc3Rfb25lc2hvdCh1bnNpZ25lZCBpbnQgKmNwdXApOwotZXh0ZXJuIGludCB0aWNrX3Jlc3VtZV9icm9hZGNhc3Rfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYyk7Ci1leHRlcm4gaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfYWN0aXZlKHZvaWQpOwotZXh0ZXJuIHZvaWQgdGlja19jaGVja19vbmVzaG90X2Jyb2FkY2FzdF90aGlzX2NwdSh2b2lkKTsKLWJvb2wgdGlja19icm9hZGNhc3Rfb25lc2hvdF9hdmFpbGFibGUodm9pZCk7Ci0jIGVsc2UgLyogQlJPQURDQVNUICovCi1zdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKLXsKLQlCVUcoKTsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X3N3aXRjaF90b19vbmVzaG90KHZvaWQpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKSB7IH0KLXN0YXRpYyBpbmxpbmUgaW50IHRpY2tfYnJvYWRjYXN0X29uZXNob3RfYWN0aXZlKHZvaWQpIHsgcmV0dXJuIDA7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2NoZWNrX29uZXNob3RfYnJvYWRjYXN0X3RoaXNfY3B1KHZvaWQpIHsgfQotc3RhdGljIGlubGluZSBib29sIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfYXZhaWxhYmxlKHZvaWQpIHsgcmV0dXJuIHRydWU7IH0KLSMgZW5kaWYgLyogIUJST0FEQ0FTVCAqLwotCi0jZWxzZSAvKiAhT05FU0hPVCAqLworc3RhdGljIGlubGluZSBib29sIHRpY2tfb25lc2hvdF9wb3NzaWJsZSh2b2lkKSB7IHJldHVybiB0cnVlOyB9CitleHRlcm4gaW50IHRpY2tfb25lc2hvdF9tb2RlX2FjdGl2ZSh2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfY2xvY2tfbm90aWZ5KHZvaWQpOworZXh0ZXJuIGludCB0aWNrX2NoZWNrX29uZXNob3RfY2hhbmdlKGludCBhbGxvd19ub2h6KTsKK2V4dGVybiBpbnQgdGlja19pbml0X2hpZ2hyZXModm9pZCk7CisjZWxzZSAvKiAhQ09ORklHX1RJQ0tfT05FU0hPVDogKi8KIHN0YXRpYyBpbmxpbmUKIHZvaWQgdGlja19zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm5ld2RldiwKIAkJCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopLAotCQkJa3RpbWVfdCBuZXh0ZXZ0KQotewotCUJVRygpOwotfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfcmVzdW1lX29uZXNob3Qodm9pZCkKLXsKLQlCVUcoKTsKLX0KLXN0YXRpYyBpbmxpbmUgaW50IHRpY2tfcHJvZ3JhbV9ldmVudChrdGltZV90IGV4cGlyZXMsIGludCBmb3JjZSkKLXsKLQlyZXR1cm4gMDsKLX0KKwkJCWt0aW1lX3QgbmV4dGV2dCkgeyBCVUcoKTsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfcmVzdW1lX29uZXNob3Qodm9pZCkgeyBCVUcoKTsgfQorc3RhdGljIGlubGluZSBpbnQgdGlja19wcm9ncmFtX2V2ZW50KGt0aW1lX3QgZXhwaXJlcywgaW50IGZvcmNlKSB7IHJldHVybiAwOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgdGlja19vbmVzaG90X25vdGlmeSh2b2lkKSB7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Jyb2FkY2FzdF9zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKQotewotCUJVRygpOwotfQotc3RhdGljIGlubGluZSBpbnQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgdGlja19zaHV0ZG93bl9icm9hZGNhc3Rfb25lc2hvdCh1bnNpZ25lZCBpbnQgKmNwdXApIHsgfQotc3RhdGljIGlubGluZSBpbnQgdGlja19yZXN1bWVfYnJvYWRjYXN0X29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpCi17Ci0JcmV0dXJuIDA7Ci19CitzdGF0aWMgaW5saW5lIGJvb2wgdGlja19vbmVzaG90X3Bvc3NpYmxlKHZvaWQpIHsgcmV0dXJuIGZhbHNlOyB9CitzdGF0aWMgaW5saW5lIGludCB0aWNrX29uZXNob3RfbW9kZV9hY3RpdmUodm9pZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfY2xvY2tfbm90aWZ5KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSBpbnQgdGlja19jaGVja19vbmVzaG90X2NoYW5nZShpbnQgYWxsb3dfbm9oeikgeyByZXR1cm4gMDsgfQorI2VuZGlmIC8qICFDT05GSUdfVElDS19PTkVTSE9UICovCisKKy8qIEZ1bmN0aW9ucyByZWxhdGVkIHRvIG9uZXNob3QgYnJvYWRjYXN0aW5nICovCisjaWYgZGVmaW5lZChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpICYmIGRlZmluZWQoQ09ORklHX1RJQ0tfT05FU0hPVCkKK2V4dGVybiB2b2lkIHRpY2tfYnJvYWRjYXN0X3NldHVwX29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpOworZXh0ZXJuIHZvaWQgdGlja19icm9hZGNhc3Rfc3dpdGNoX3RvX29uZXNob3Qodm9pZCk7CitleHRlcm4gdm9pZCB0aWNrX3NodXRkb3duX2Jyb2FkY2FzdF9vbmVzaG90KHVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIGludCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2FjdGl2ZSh2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfY2hlY2tfb25lc2hvdF9icm9hZGNhc3RfdGhpc19jcHUodm9pZCk7Citib29sIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfYXZhaWxhYmxlKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBjcHVtYXNrICp0aWNrX2dldF9icm9hZGNhc3Rfb25lc2hvdF9tYXNrKHZvaWQpOworI2Vsc2UgLyogIShCUk9BRENBU1QgJiYgT05FU0hPVCk6ICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykgeyBCVUcoKTsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X3N3aXRjaF90b19vbmVzaG90KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50IGNwdSkgeyB9CiBzdGF0aWMgaW5saW5lIGludCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2FjdGl2ZSh2b2lkKSB7IHJldHVybiAwOyB9Ci1zdGF0aWMgaW5saW5lIGJvb2wgdGlja19icm9hZGNhc3Rfb25lc2hvdF9hdmFpbGFibGUodm9pZCkgeyByZXR1cm4gZmFsc2U7IH0KLSNlbmRpZiAvKiAhVElDS19PTkVTSE9UICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19jaGVja19vbmVzaG90X2Jyb2FkY2FzdF90aGlzX2NwdSh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgYm9vbCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2F2YWlsYWJsZSh2b2lkKSB7IHJldHVybiB0aWNrX29uZXNob3RfcG9zc2libGUoKTsgfQorI2VuZGlmIC8qICEoQlJPQURDQVNUICYmIE9ORVNIT1QpICovCiAKIC8qIE5PX0haX0ZVTEwgaW50ZXJuYWwgKi8KICNpZmRlZiBDT05GSUdfTk9fSFpfRlVMTApAQCAtMTA1LDY4ICsxMzcsMyBAQAogIyBlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgdGlja19ub2h6X2luaXQodm9pZCkgeyB9CiAjZW5kaWYKLQotLyoKLSAqIEJyb2FkY2FzdGluZyBzdXBwb3J0Ci0gKi8KLSNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKLWV4dGVybiBpbnQgdGlja19kZXZpY2VfdXNlc19icm9hZGNhc3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgY3B1KTsKLWV4dGVybiB2b2lkIHRpY2tfaW5zdGFsbF9icm9hZGNhc3RfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7Ci1leHRlcm4gaW50IHRpY2tfaXNfYnJvYWRjYXN0X2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOwotZXh0ZXJuIHZvaWQgdGlja19icm9hZGNhc3Rfb25fb2ZmKHVuc2lnbmVkIGxvbmcgcmVhc29uLCBpbnQgKm9uY3B1KTsKLWV4dGVybiB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0KHVuc2lnbmVkIGludCAqY3B1cCk7Ci1leHRlcm4gdm9pZCB0aWNrX3N1c3BlbmRfYnJvYWRjYXN0KHZvaWQpOwotZXh0ZXJuIGludCB0aWNrX3Jlc3VtZV9icm9hZGNhc3Qodm9pZCk7Ci1leHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9pbml0KHZvaWQpOwotZXh0ZXJuIHZvaWQKLXRpY2tfc2V0X3BlcmlvZGljX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgYnJvYWRjYXN0KTsKLWludCB0aWNrX2Jyb2FkY2FzdF91cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsIHUzMiBmcmVxKTsKLQotI2Vsc2UgLyogIUJST0FEQ0FTVCAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgdGlja19pbnN0YWxsX2Jyb2FkY2FzdF9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQotewotfQotCi1zdGF0aWMgaW5saW5lIGludCB0aWNrX2lzX2Jyb2FkY2FzdF9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQotewotCXJldHVybiAwOwotfQotc3RhdGljIGlubGluZSBpbnQgdGlja19kZXZpY2VfdXNlc19icm9hZGNhc3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAotCQkJCQkgICAgIGludCBjcHUpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgdGlja19kb19wZXJpb2RpY19icm9hZGNhc3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZCkgeyB9Ci1zdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfb25fb2ZmKHVuc2lnbmVkIGxvbmcgcmVhc29uLCBpbnQgKm9uY3B1KSB7IH0KLXN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3NodXRkb3duX2Jyb2FkY2FzdCh1bnNpZ25lZCBpbnQgKmNwdXApIHsgfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc3VzcGVuZF9icm9hZGNhc3Qodm9pZCkgeyB9Ci1zdGF0aWMgaW5saW5lIGludCB0aWNrX3Jlc3VtZV9icm9hZGNhc3Qodm9pZCkgeyByZXR1cm4gMDsgfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X2luaXQodm9pZCkgeyB9Ci1zdGF0aWMgaW5saW5lIGludCB0aWNrX2Jyb2FkY2FzdF91cGRhdGVfZnJlcShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsCi0JCQkJCSAgICAgdTMyIGZyZXEpIHsgcmV0dXJuIC1FTk9ERVY7IH0KLQotLyoKLSAqIFNldCB0aGUgcGVyaW9kaWMgaGFuZGxlciBpbiBub24gYnJvYWRjYXN0IG1vZGUKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2V0X3BlcmlvZGljX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAotCQkJCQkgICAgIGludCBicm9hZGNhc3QpCi17Ci0JZGV2LT5ldmVudF9oYW5kbGVyID0gdGlja19oYW5kbGVfcGVyaW9kaWM7Ci19Ci0jZW5kaWYgLyogIUJST0FEQ0FTVCAqLwotCi0vKgotICogQ2hlY2ssIGlmIHRoZSBkZXZpY2UgaXMgZnVuY3Rpb25hbCBvciBhIGR1bW15IGZvciBicm9hZGNhc3QKLSAqLwotc3RhdGljIGlubGluZSBpbnQgdGlja19kZXZpY2VfaXNfZnVuY3Rpb25hbChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuICEoZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX0RVTU1ZKTsKLX0KLQotaW50IF9fY2xvY2tldmVudHNfdXBkYXRlX2ZyZXEoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCB1MzIgZnJlcSk7Ci0KLSNlbmRpZgotCi1leHRlcm4gdm9pZCBkb190aW1lcih1bnNpZ25lZCBsb25nIHRpY2tzKTsKLWV4dGVybiB2b2lkIHVwZGF0ZV93YWxsX3RpbWUodm9pZCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLW9uZXNob3QuYyBiL2tlcm5lbC90aW1lL3RpY2stb25lc2hvdC5jCmluZGV4IDdjZTc0MGUuLjY3YTY0YjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stb25lc2hvdC5jCisrKyBiL2tlcm5lbC90aW1lL3RpY2stb25lc2hvdC5jCkBAIC0zOCw3ICszOCw3IEBACiB7CiAJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2ID0gX190aGlzX2NwdV9yZWFkKHRpY2tfY3B1X2RldmljZS5ldnRkZXYpOwogCi0JY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwljbG9ja2V2ZW50c19zZXRfc3RhdGUoZGV2LCBDTE9DS19FVlRfU1RBVEVfT05FU0hPVCk7CiAJY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChkZXYsIGt0aW1lX2dldCgpLCB0cnVlKTsKIH0KIApAQCAtNTAsNyArNTAsNyBAQAogCQkJa3RpbWVfdCBuZXh0X2V2ZW50KQogewogCW5ld2Rldi0+ZXZlbnRfaGFuZGxlciA9IGhhbmRsZXI7Ci0JY2xvY2tldmVudHNfc2V0X21vZGUobmV3ZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwljbG9ja2V2ZW50c19zZXRfc3RhdGUobmV3ZGV2LCBDTE9DS19FVlRfU1RBVEVfT05FU0hPVCk7CiAJY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChuZXdkZXYsIG5leHRfZXZlbnQsIHRydWUpOwogfQogCkBAIC04MSw3ICs4MSw3IEBACiAKIAl0ZC0+bW9kZSA9IFRJQ0tERVZfTU9ERV9PTkVTSE9UOwogCWRldi0+ZXZlbnRfaGFuZGxlciA9IGhhbmRsZXI7Ci0JY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwljbG9ja2V2ZW50c19zZXRfc3RhdGUoZGV2LCBDTE9DS19FVlRfU1RBVEVfT05FU0hPVCk7CiAJdGlja19icm9hZGNhc3Rfc3dpdGNoX3RvX29uZXNob3QoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYyBiL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYwppbmRleCBhNGM0ZWRhLi45MTQyNTkxIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKKysrIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCkBAIC0zNCw3ICszNCw3IEBACiAvKgogICogUGVyIGNwdSBub2h6IGNvbnRyb2wgc3RydWN0dXJlCiAgKi8KLURFRklORV9QRVJfQ1BVKHN0cnVjdCB0aWNrX3NjaGVkLCB0aWNrX2NwdV9zY2hlZCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRpY2tfc2NoZWQsIHRpY2tfY3B1X3NjaGVkKTsKIAogLyoKICAqIFRoZSB0aW1lLCB3aGVuIHRoZSBsYXN0IGppZmZ5IHVwZGF0ZSBoYXBwZW5lZC4gUHJvdGVjdGVkIGJ5IGppZmZpZXNfbG9jay4KQEAgLTQxNiw2ICs0MTYsMTEgQEAKIAogX19zZXR1cCgibm9oej0iLCBzZXR1cF90aWNrX25vaHopOwogCitpbnQgdGlja19ub2h6X3RpY2tfc3RvcHBlZCh2b2lkKQoreworCXJldHVybiBfX3RoaXNfY3B1X3JlYWQodGlja19jcHVfc2NoZWQudGlja19zdG9wcGVkKTsKK30KKwogLyoqCiAgKiB0aWNrX25vaHpfdXBkYXRlX2ppZmZpZXMgLSB1cGRhdGUgamlmZmllcyB3aGVuIGlkbGUgd2FzIGludGVycnVwdGVkCiAgKgpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5oIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjVkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBfVElDS19TQ0hFRF9ICisjZGVmaW5lIF9USUNLX1NDSEVEX0gKKworI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKworZW51bSB0aWNrX2RldmljZV9tb2RlIHsKKwlUSUNLREVWX01PREVfUEVSSU9ESUMsCisJVElDS0RFVl9NT0RFX09ORVNIT1QsCit9OworCitzdHJ1Y3QgdGlja19kZXZpY2UgeworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dGRldjsKKwllbnVtIHRpY2tfZGV2aWNlX21vZGUgbW9kZTsKK307CisKK2VudW0gdGlja19ub2h6X21vZGUgeworCU5PSFpfTU9ERV9JTkFDVElWRSwKKwlOT0haX01PREVfTE9XUkVTLAorCU5PSFpfTU9ERV9ISUdIUkVTLAorfTsKKworLyoqCisgKiBzdHJ1Y3QgdGlja19zY2hlZCAtIHNjaGVkIHRpY2sgZW11bGF0aW9uIGFuZCBubyBpZGxlIHRpY2sgY29udHJvbC9zdGF0cworICogQHNjaGVkX3RpbWVyOglocnRpbWVyIHRvIHNjaGVkdWxlIHRoZSBwZXJpb2RpYyB0aWNrIGluIGhpZ2gKKyAqCQkJcmVzb2x1dGlvbiBtb2RlCisgKiBAbGFzdF90aWNrOgkJU3RvcmUgdGhlIGxhc3QgdGljayBleHBpcnkgdGltZSB3aGVuIHRoZSB0aWNrCisgKgkJCXRpbWVyIGlzIG1vZGlmaWVkIGZvciBub2h6IHNsZWVwcy4gVGhpcyBpcyBuZWNlc3NhcnkKKyAqCQkJdG8gcmVzdW1lIHRoZSB0aWNrIHRpbWVyIG9wZXJhdGlvbiBpbiB0aGUgdGltZWxpbmUKKyAqCQkJd2hlbiB0aGUgQ1BVIHJldHVybnMgZnJvbSBub2h6IHNsZWVwLgorICogQHRpY2tfc3RvcHBlZDoJSW5kaWNhdG9yIHRoYXQgdGhlIGlkbGUgdGljayBoYXMgYmVlbiBzdG9wcGVkCisgKiBAaWRsZV9qaWZmaWVzOglqaWZmaWVzIGF0IHRoZSBlbnRyeSB0byBpZGxlIGZvciBpZGxlIHRpbWUgYWNjb3VudGluZworICogQGlkbGVfY2FsbHM6CQlUb3RhbCBudW1iZXIgb2YgaWRsZSBjYWxscworICogQGlkbGVfc2xlZXBzOglOdW1iZXIgb2YgaWRsZSBjYWxscywgd2hlcmUgdGhlIHNjaGVkIHRpY2sgd2FzIHN0b3BwZWQKKyAqIEBpZGxlX2VudHJ5dGltZToJVGltZSB3aGVuIHRoZSBpZGxlIGNhbGwgd2FzIGVudGVyZWQKKyAqIEBpZGxlX3dha2V0aW1lOglUaW1lIHdoZW4gdGhlIGlkbGUgd2FzIGludGVycnVwdGVkCisgKiBAaWRsZV9leGl0dGltZToJVGltZSB3aGVuIHRoZSBpZGxlIHN0YXRlIHdhcyBsZWZ0CisgKiBAaWRsZV9zbGVlcHRpbWU6CVN1bSBvZiB0aGUgdGltZSBzbGVwdCBpbiBpZGxlIHdpdGggc2NoZWQgdGljayBzdG9wcGVkCisgKiBAaW93YWl0X3NsZWVwdGltZToJU3VtIG9mIHRoZSB0aW1lIHNsZXB0IGluIGlkbGUgd2l0aCBzY2hlZCB0aWNrIHN0b3BwZWQsIHdpdGggSU8gb3V0c3RhbmRpbmcKKyAqIEBzbGVlcF9sZW5ndGg6CUR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGlkbGUgc2xlZXAKKyAqIEBkb190aW1lcl9sc3Q6CUNQVSB3YXMgdGhlIGxhc3Qgb25lIGRvaW5nIGRvX3RpbWVyIGJlZm9yZSBnb2luZyBpZGxlCisgKi8KK3N0cnVjdCB0aWNrX3NjaGVkIHsKKwlzdHJ1Y3QgaHJ0aW1lcgkJCXNjaGVkX3RpbWVyOworCXVuc2lnbmVkIGxvbmcJCQljaGVja19jbG9ja3M7CisJZW51bSB0aWNrX25vaHpfbW9kZQkJbm9oel9tb2RlOworCWt0aW1lX3QJCQkJbGFzdF90aWNrOworCWludAkJCQlpbmlkbGU7CisJaW50CQkJCXRpY2tfc3RvcHBlZDsKKwl1bnNpZ25lZCBsb25nCQkJaWRsZV9qaWZmaWVzOworCXVuc2lnbmVkIGxvbmcJCQlpZGxlX2NhbGxzOworCXVuc2lnbmVkIGxvbmcJCQlpZGxlX3NsZWVwczsKKwlpbnQJCQkJaWRsZV9hY3RpdmU7CisJa3RpbWVfdAkJCQlpZGxlX2VudHJ5dGltZTsKKwlrdGltZV90CQkJCWlkbGVfd2FrZXRpbWU7CisJa3RpbWVfdAkJCQlpZGxlX2V4aXR0aW1lOworCWt0aW1lX3QJCQkJaWRsZV9zbGVlcHRpbWU7CisJa3RpbWVfdAkJCQlpb3dhaXRfc2xlZXB0aW1lOworCWt0aW1lX3QJCQkJc2xlZXBfbGVuZ3RoOworCXVuc2lnbmVkIGxvbmcJCQlsYXN0X2ppZmZpZXM7CisJdW5zaWduZWQgbG9uZwkJCW5leHRfamlmZmllczsKKwlrdGltZV90CQkJCWlkbGVfZXhwaXJlczsKKwlpbnQJCQkJZG9fdGltZXJfbGFzdDsKK307CisKK2V4dGVybiBzdHJ1Y3QgdGlja19zY2hlZCAqdGlja19nZXRfdGlja19zY2hlZChpbnQgY3B1KTsKKworZXh0ZXJuIHZvaWQgdGlja19zZXR1cF9zY2hlZF90aW1lcih2b2lkKTsKKyNpZiBkZWZpbmVkIENPTkZJR19OT19IWl9DT01NT04gfHwgZGVmaW5lZCBDT05GSUdfSElHSF9SRVNfVElNRVJTCitleHRlcm4gdm9pZCB0aWNrX2NhbmNlbF9zY2hlZF90aW1lcihpbnQgY3B1KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19jYW5jZWxfc2NoZWRfdGltZXIoaW50IGNwdSkgeyB9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwppbmRleCA5MWRiOTQxLi45NDZhY2I3IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKQEAgLTU5LDE3ICs1OSwxNSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCB0a19mYXN0IHRrX2Zhc3RfbW9ubyBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CitzdGF0aWMgc3RydWN0IHRrX2Zhc3QgdGtfZmFzdF9yYXcgIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAogLyogZmxhZyBmb3IgaWYgdGltZWtlZXBpbmcgaXMgc3VzcGVuZGVkICovCiBpbnQgX19yZWFkX21vc3RseSB0aW1la2VlcGluZ19zdXNwZW5kZWQ7CiAKLS8qIEZsYWcgZm9yIGlmIHRoZXJlIGlzIGEgcGVyc2lzdGVudCBjbG9jayBvbiB0aGlzIHBsYXRmb3JtICovCi1ib29sIF9fcmVhZF9tb3N0bHkgcGVyc2lzdGVudF9jbG9ja19leGlzdCA9IGZhbHNlOwotCiBzdGF0aWMgaW5saW5lIHZvaWQgdGtfbm9ybWFsaXplX3h0aW1lKHN0cnVjdCB0aW1la2VlcGVyICp0aykKIHsKLQl3aGlsZSAodGstPnRrci54dGltZV9uc2VjID49ICgodTY0KU5TRUNfUEVSX1NFQyA8PCB0ay0+dGtyLnNoaWZ0KSkgewotCQl0ay0+dGtyLnh0aW1lX25zZWMgLT0gKHU2NClOU0VDX1BFUl9TRUMgPDwgdGstPnRrci5zaGlmdDsKKwl3aGlsZSAodGstPnRrcl9tb25vLnh0aW1lX25zZWMgPj0gKCh1NjQpTlNFQ19QRVJfU0VDIDw8IHRrLT50a3JfbW9uby5zaGlmdCkpIHsKKwkJdGstPnRrcl9tb25vLnh0aW1lX25zZWMgLT0gKHU2NClOU0VDX1BFUl9TRUMgPDwgdGstPnRrcl9tb25vLnNoaWZ0OwogCQl0ay0+eHRpbWVfc2VjKys7CiAJfQogfQpAQCAtNzksMjAgKzc3LDIwIEBACiAJc3RydWN0IHRpbWVzcGVjNjQgdHM7CiAKIAl0cy50dl9zZWMgPSB0ay0+eHRpbWVfc2VjOwotCXRzLnR2X25zZWMgPSAobG9uZykodGstPnRrci54dGltZV9uc2VjID4+IHRrLT50a3Iuc2hpZnQpOworCXRzLnR2X25zZWMgPSAobG9uZykodGstPnRrcl9tb25vLnh0aW1lX25zZWMgPj4gdGstPnRrcl9tb25vLnNoaWZ0KTsKIAlyZXR1cm4gdHM7CiB9CiAKIHN0YXRpYyB2b2lkIHRrX3NldF94dGltZShzdHJ1Y3QgdGltZWtlZXBlciAqdGssIGNvbnN0IHN0cnVjdCB0aW1lc3BlYzY0ICp0cykKIHsKIAl0ay0+eHRpbWVfc2VjID0gdHMtPnR2X3NlYzsKLQl0ay0+dGtyLnh0aW1lX25zZWMgPSAodTY0KXRzLT50dl9uc2VjIDw8IHRrLT50a3Iuc2hpZnQ7CisJdGstPnRrcl9tb25vLnh0aW1lX25zZWMgPSAodTY0KXRzLT50dl9uc2VjIDw8IHRrLT50a3JfbW9uby5zaGlmdDsKIH0KIAogc3RhdGljIHZvaWQgdGtfeHRpbWVfYWRkKHN0cnVjdCB0aW1la2VlcGVyICp0aywgY29uc3Qgc3RydWN0IHRpbWVzcGVjNjQgKnRzKQogewogCXRrLT54dGltZV9zZWMgKz0gdHMtPnR2X3NlYzsKLQl0ay0+dGtyLnh0aW1lX25zZWMgKz0gKHU2NCl0cy0+dHZfbnNlYyA8PCB0ay0+dGtyLnNoaWZ0OworCXRrLT50a3JfbW9uby54dGltZV9uc2VjICs9ICh1NjQpdHMtPnR2X25zZWMgPDwgdGstPnRrcl9tb25vLnNoaWZ0OwogCXRrX25vcm1hbGl6ZV94dGltZSh0ayk7CiB9CiAKQEAgLTExOCw2ICsxMTYsMTE3IEBACiAJdGstPm9mZnNfYm9vdCA9IGt0aW1lX2FkZCh0ay0+b2Zmc19ib290LCBkZWx0YSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfVElNRUtFRVBJTkcKKyNkZWZpbmUgV0FSTklOR19GUkVRIChIWiozMDApIC8qIDUgbWludXRlIHJhdGUtbGltaXRpbmcgKi8KKy8qCisgKiBUaGVzZSBzaW1wbGUgZmxhZyB2YXJpYWJsZXMgYXJlIG1hbmFnZWQKKyAqIHdpdGhvdXQgbG9ja3MsIHdoaWNoIGlzIHJhY3ksIGJ1dCBvayBzaW5jZQorICogd2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgYmVpbmcgc3VwZXIKKyAqIHByZWNpc2UgYWJvdXQgaG93IG1hbnkgZXZlbnRzIHdlcmUgc2VlbiwKKyAqIGp1c3QgdGhhdCBhIHByb2JsZW0gd2FzIG9ic2VydmVkLgorICovCitzdGF0aWMgaW50IHRpbWVrZWVwaW5nX3VuZGVyZmxvd19zZWVuOworc3RhdGljIGludCB0aW1la2VlcGluZ19vdmVyZmxvd19zZWVuOworCisvKiBsYXN0X3dhcm5pbmcgaXMgb25seSBtb2RpZmllZCB1bmRlciB0aGUgdGltZWtlZXBpbmcgbG9jayAqLworc3RhdGljIGxvbmcgdGltZWtlZXBpbmdfbGFzdF93YXJuaW5nOworCitzdGF0aWMgdm9pZCB0aW1la2VlcGluZ19jaGVja191cGRhdGUoc3RydWN0IHRpbWVrZWVwZXIgKnRrLCBjeWNsZV90IG9mZnNldCkKK3sKKworCWN5Y2xlX3QgbWF4X2N5Y2xlcyA9IHRrLT50a3JfbW9uby5jbG9jay0+bWF4X2N5Y2xlczsKKwljb25zdCBjaGFyICpuYW1lID0gdGstPnRrcl9tb25vLmNsb2NrLT5uYW1lOworCisJaWYgKG9mZnNldCA+IG1heF9jeWNsZXMpIHsKKwkJcHJpbnRrX2RlZmVycmVkKCJXQVJOSU5HOiB0aW1la2VlcGluZzogQ3ljbGUgb2Zmc2V0ICglbGxkKSBpcyBsYXJnZXIgdGhhbiBhbGxvd2VkIGJ5IHRoZSAnJXMnIGNsb2NrJ3MgbWF4X2N5Y2xlcyB2YWx1ZSAoJWxsZCk6IHRpbWUgb3ZlcmZsb3cgZGFuZ2VyXG4iLAorCQkJCW9mZnNldCwgbmFtZSwgbWF4X2N5Y2xlcyk7CisJCXByaW50a19kZWZlcnJlZCgiICAgICAgICAgdGltZWtlZXBpbmc6IFlvdXIga2VybmVsIGlzIHNpY2ssIGJ1dCB0cmllcyB0byBjb3BlIGJ5IGNhcHBpbmcgdGltZSB1cGRhdGVzXG4iKTsKKwl9IGVsc2UgeworCQlpZiAob2Zmc2V0ID4gKG1heF9jeWNsZXMgPj4gMSkpIHsKKwkJCXByaW50a19kZWZlcnJlZCgiSU5GTzogdGltZWtlZXBpbmc6IEN5Y2xlIG9mZnNldCAoJWxsZCkgaXMgbGFyZ2VyIHRoYW4gdGhlIHRoZSAnJXMnIGNsb2NrJ3MgNTAlJSBzYWZldHkgbWFyZ2luICglbGxkKVxuIiwKKwkJCQkJb2Zmc2V0LCBuYW1lLCBtYXhfY3ljbGVzID4+IDEpOworCQkJcHJpbnRrX2RlZmVycmVkKCIgICAgICB0aW1la2VlcGluZzogWW91ciBrZXJuZWwgaXMgc3RpbGwgZmluZSwgYnV0IGlzIGZlZWxpbmcgYSBiaXQgbmVydm91c1xuIik7CisJCX0KKwl9CisKKwlpZiAodGltZWtlZXBpbmdfdW5kZXJmbG93X3NlZW4pIHsKKwkJaWYgKGppZmZpZXMgLSB0aW1la2VlcGluZ19sYXN0X3dhcm5pbmcgPiBXQVJOSU5HX0ZSRVEpIHsKKwkJCXByaW50a19kZWZlcnJlZCgiV0FSTklORzogVW5kZXJmbG93IGluIGNsb2Nrc291cmNlICclcycgb2JzZXJ2ZWQsIHRpbWUgdXBkYXRlIGlnbm9yZWQuXG4iLCBuYW1lKTsKKwkJCXByaW50a19kZWZlcnJlZCgiICAgICAgICAgUGxlYXNlIHJlcG9ydCB0aGlzLCBjb25zaWRlciB1c2luZyBhIGRpZmZlcmVudCBjbG9ja3NvdXJjZSwgaWYgcG9zc2libGUuXG4iKTsKKwkJCXByaW50a19kZWZlcnJlZCgiICAgICAgICAgWW91ciBrZXJuZWwgaXMgcHJvYmFibHkgc3RpbGwgZmluZS5cbiIpOworCQkJdGltZWtlZXBpbmdfbGFzdF93YXJuaW5nID0gamlmZmllczsKKwkJfQorCQl0aW1la2VlcGluZ191bmRlcmZsb3dfc2VlbiA9IDA7CisJfQorCisJaWYgKHRpbWVrZWVwaW5nX292ZXJmbG93X3NlZW4pIHsKKwkJaWYgKGppZmZpZXMgLSB0aW1la2VlcGluZ19sYXN0X3dhcm5pbmcgPiBXQVJOSU5HX0ZSRVEpIHsKKwkJCXByaW50a19kZWZlcnJlZCgiV0FSTklORzogT3ZlcmZsb3cgaW4gY2xvY2tzb3VyY2UgJyVzJyBvYnNlcnZlZCwgdGltZSB1cGRhdGUgY2FwcGVkLlxuIiwgbmFtZSk7CisJCQlwcmludGtfZGVmZXJyZWQoIiAgICAgICAgIFBsZWFzZSByZXBvcnQgdGhpcywgY29uc2lkZXIgdXNpbmcgYSBkaWZmZXJlbnQgY2xvY2tzb3VyY2UsIGlmIHBvc3NpYmxlLlxuIik7CisJCQlwcmludGtfZGVmZXJyZWQoIiAgICAgICAgIFlvdXIga2VybmVsIGlzIHByb2JhYmx5IHN0aWxsIGZpbmUuXG4iKTsKKwkJCXRpbWVrZWVwaW5nX2xhc3Rfd2FybmluZyA9IGppZmZpZXM7CisJCX0KKwkJdGltZWtlZXBpbmdfb3ZlcmZsb3dfc2VlbiA9IDA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGN5Y2xlX3QgdGltZWtlZXBpbmdfZ2V0X2RlbHRhKHN0cnVjdCB0a19yZWFkX2Jhc2UgKnRrcikKK3sKKwljeWNsZV90IG5vdywgbGFzdCwgbWFzaywgbWF4LCBkZWx0YTsKKwl1bnNpZ25lZCBpbnQgc2VxOworCisJLyoKKwkgKiBTaW5jZSB3ZSdyZSBjYWxsZWQgaG9sZGluZyBhIHNlcWxvY2ssIHRoZSBkYXRhIG1heSBzaGlmdAorCSAqIHVuZGVyIHVzIHdoaWxlIHdlJ3JlIGRvaW5nIHRoZSBjYWxjdWxhdGlvbi4gVGhpcyBjYW4gY2F1c2UKKwkgKiBmYWxzZSBwb3NpdGl2ZXMsIHNpbmNlIHdlJ2Qgbm90ZSBhIHByb2JsZW0gYnV0IHRocm93IHRoZQorCSAqIHJlc3VsdHMgYXdheS4gU28gbmVzdCBhbm90aGVyIHNlcWxvY2sgaGVyZSB0byBhdG9taWNhbGx5CisJICogZ3JhYiB0aGUgcG9pbnRzIHdlIGFyZSBjaGVja2luZyB3aXRoLgorCSAqLworCWRvIHsKKwkJc2VxID0gcmVhZF9zZXFjb3VudF9iZWdpbigmdGtfY29yZS5zZXEpOworCQlub3cgPSB0a3ItPnJlYWQodGtyLT5jbG9jayk7CisJCWxhc3QgPSB0a3ItPmN5Y2xlX2xhc3Q7CisJCW1hc2sgPSB0a3ItPm1hc2s7CisJCW1heCA9IHRrci0+Y2xvY2stPm1heF9jeWNsZXM7CisJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmdGtfY29yZS5zZXEsIHNlcSkpOworCisJZGVsdGEgPSBjbG9ja3NvdXJjZV9kZWx0YShub3csIGxhc3QsIG1hc2spOworCisJLyoKKwkgKiBUcnkgdG8gY2F0Y2ggdW5kZXJmbG93cyBieSBjaGVja2luZyBpZiB3ZSBhcmUgc2VlaW5nIHNtYWxsCisJICogbWFzay1yZWxhdGl2ZSBuZWdhdGl2ZSB2YWx1ZXMuCisJICovCisJaWYgKHVubGlrZWx5KCh+ZGVsdGEgJiBtYXNrKSA8IChtYXNrID4+IDMpKSkgeworCQl0aW1la2VlcGluZ191bmRlcmZsb3dfc2VlbiA9IDE7CisJCWRlbHRhID0gMDsKKwl9CisKKwkvKiBDYXAgZGVsdGEgdmFsdWUgdG8gdGhlIG1heF9jeWNsZXMgdmFsdWVzIHRvIGF2b2lkIG11bHQgb3ZlcmZsb3dzICovCisJaWYgKHVubGlrZWx5KGRlbHRhID4gbWF4KSkgeworCQl0aW1la2VlcGluZ19vdmVyZmxvd19zZWVuID0gMTsKKwkJZGVsdGEgPSB0a3ItPmNsb2NrLT5tYXhfY3ljbGVzOworCX0KKworCXJldHVybiBkZWx0YTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZWtlZXBpbmdfY2hlY2tfdXBkYXRlKHN0cnVjdCB0aW1la2VlcGVyICp0aywgY3ljbGVfdCBvZmZzZXQpCit7Cit9CitzdGF0aWMgaW5saW5lIGN5Y2xlX3QgdGltZWtlZXBpbmdfZ2V0X2RlbHRhKHN0cnVjdCB0a19yZWFkX2Jhc2UgKnRrcikKK3sKKwljeWNsZV90IGN5Y2xlX25vdywgZGVsdGE7CisKKwkvKiByZWFkIGNsb2Nrc291cmNlICovCisJY3ljbGVfbm93ID0gdGtyLT5yZWFkKHRrci0+Y2xvY2spOworCisJLyogY2FsY3VsYXRlIHRoZSBkZWx0YSBzaW5jZSB0aGUgbGFzdCB1cGRhdGVfd2FsbF90aW1lICovCisJZGVsdGEgPSBjbG9ja3NvdXJjZV9kZWx0YShjeWNsZV9ub3csIHRrci0+Y3ljbGVfbGFzdCwgdGtyLT5tYXNrKTsKKworCXJldHVybiBkZWx0YTsKK30KKyNlbmRpZgorCiAvKioKICAqIHRrX3NldHVwX2ludGVybmFscyAtIFNldCB1cCBpbnRlcm5hbHMgdG8gdXNlIGNsb2Nrc291cmNlIGNsb2NrLgogICoKQEAgLTEzNSwxMSArMjQ0LDE2IEBACiAJdTY0IHRtcCwgbnRwaW50ZXJ2YWw7CiAJc3RydWN0IGNsb2Nrc291cmNlICpvbGRfY2xvY2s7CiAKLQlvbGRfY2xvY2sgPSB0ay0+dGtyLmNsb2NrOwotCXRrLT50a3IuY2xvY2sgPSBjbG9jazsKLQl0ay0+dGtyLnJlYWQgPSBjbG9jay0+cmVhZDsKLQl0ay0+dGtyLm1hc2sgPSBjbG9jay0+bWFzazsKLQl0ay0+dGtyLmN5Y2xlX2xhc3QgPSB0ay0+dGtyLnJlYWQoY2xvY2spOworCW9sZF9jbG9jayA9IHRrLT50a3JfbW9uby5jbG9jazsKKwl0ay0+dGtyX21vbm8uY2xvY2sgPSBjbG9jazsKKwl0ay0+dGtyX21vbm8ucmVhZCA9IGNsb2NrLT5yZWFkOworCXRrLT50a3JfbW9uby5tYXNrID0gY2xvY2stPm1hc2s7CisJdGstPnRrcl9tb25vLmN5Y2xlX2xhc3QgPSB0ay0+dGtyX21vbm8ucmVhZChjbG9jayk7CisKKwl0ay0+dGtyX3Jhdy5jbG9jayA9IGNsb2NrOworCXRrLT50a3JfcmF3LnJlYWQgPSBjbG9jay0+cmVhZDsKKwl0ay0+dGtyX3Jhdy5tYXNrID0gY2xvY2stPm1hc2s7CisJdGstPnRrcl9yYXcuY3ljbGVfbGFzdCA9IHRrLT50a3JfbW9uby5jeWNsZV9sYXN0OwogCiAJLyogRG8gdGhlIG5zIC0+IGN5Y2xlIGNvbnZlcnNpb24gZmlyc3QsIHVzaW5nIG9yaWdpbmFsIG11bHQgKi8KIAl0bXAgPSBOVFBfSU5URVJWQUxfTEVOR1RIOwpAQCAtMTYzLDExICsyNzcsMTQgQEAKIAlpZiAob2xkX2Nsb2NrKSB7CiAJCWludCBzaGlmdF9jaGFuZ2UgPSBjbG9jay0+c2hpZnQgLSBvbGRfY2xvY2stPnNoaWZ0OwogCQlpZiAoc2hpZnRfY2hhbmdlIDwgMCkKLQkJCXRrLT50a3IueHRpbWVfbnNlYyA+Pj0gLXNoaWZ0X2NoYW5nZTsKKwkJCXRrLT50a3JfbW9uby54dGltZV9uc2VjID4+PSAtc2hpZnRfY2hhbmdlOwogCQllbHNlCi0JCQl0ay0+dGtyLnh0aW1lX25zZWMgPDw9IHNoaWZ0X2NoYW5nZTsKKwkJCXRrLT50a3JfbW9uby54dGltZV9uc2VjIDw8PSBzaGlmdF9jaGFuZ2U7CiAJfQotCXRrLT50a3Iuc2hpZnQgPSBjbG9jay0+c2hpZnQ7CisJdGstPnRrcl9yYXcueHRpbWVfbnNlYyA9IDA7CisKKwl0ay0+dGtyX21vbm8uc2hpZnQgPSBjbG9jay0+c2hpZnQ7CisJdGstPnRrcl9yYXcuc2hpZnQgPSBjbG9jay0+c2hpZnQ7CiAKIAl0ay0+bnRwX2Vycm9yID0gMDsKIAl0ay0+bnRwX2Vycm9yX3NoaWZ0ID0gTlRQX1NDQUxFX1NISUZUIC0gY2xvY2stPnNoaWZ0OwpAQCAtMTc4LDcgKzI5NSw4IEBACiAJICogYWN0aXZlIGNsb2Nrc291cmNlLiBUaGVzZSB2YWx1ZSB3aWxsIGJlIGFkanVzdGVkIHZpYSBOVFAKIAkgKiB0byBjb3VudGVyYWN0IGNsb2NrIGRyaWZ0aW5nLgogCSAqLwotCXRrLT50a3IubXVsdCA9IGNsb2NrLT5tdWx0OworCXRrLT50a3JfbW9uby5tdWx0ID0gY2xvY2stPm11bHQ7CisJdGstPnRrcl9yYXcubXVsdCA9IGNsb2NrLT5tdWx0OwogCXRrLT5udHBfZXJyX211bHQgPSAwOwogfQogCkBAIC0xOTMsMTQgKzMxMSwxMCBAQAogCiBzdGF0aWMgaW5saW5lIHM2NCB0aW1la2VlcGluZ19nZXRfbnMoc3RydWN0IHRrX3JlYWRfYmFzZSAqdGtyKQogewotCWN5Y2xlX3QgY3ljbGVfbm93LCBkZWx0YTsKKwljeWNsZV90IGRlbHRhOwogCXM2NCBuc2VjOwogCi0JLyogcmVhZCBjbG9ja3NvdXJjZTogKi8KLQljeWNsZV9ub3cgPSB0a3ItPnJlYWQodGtyLT5jbG9jayk7Ci0KLQkvKiBjYWxjdWxhdGUgdGhlIGRlbHRhIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZV93YWxsX3RpbWU6ICovCi0JZGVsdGEgPSBjbG9ja3NvdXJjZV9kZWx0YShjeWNsZV9ub3csIHRrci0+Y3ljbGVfbGFzdCwgdGtyLT5tYXNrKTsKKwlkZWx0YSA9IHRpbWVrZWVwaW5nX2dldF9kZWx0YSh0a3IpOwogCiAJbnNlYyA9IGRlbHRhICogdGtyLT5tdWx0ICsgdGtyLT54dGltZV9uc2VjOwogCW5zZWMgPj49IHRrci0+c2hpZnQ7CkBAIC0yMDksMjUgKzMyMyw2IEBACiAJcmV0dXJuIG5zZWMgKyBhcmNoX2dldHRpbWVvZmZzZXQoKTsKIH0KIAotc3RhdGljIGlubGluZSBzNjQgdGltZWtlZXBpbmdfZ2V0X25zX3JhdyhzdHJ1Y3QgdGltZWtlZXBlciAqdGspCi17Ci0Jc3RydWN0IGNsb2Nrc291cmNlICpjbG9jayA9IHRrLT50a3IuY2xvY2s7Ci0JY3ljbGVfdCBjeWNsZV9ub3csIGRlbHRhOwotCXM2NCBuc2VjOwotCi0JLyogcmVhZCBjbG9ja3NvdXJjZTogKi8KLQljeWNsZV9ub3cgPSB0ay0+dGtyLnJlYWQoY2xvY2spOwotCi0JLyogY2FsY3VsYXRlIHRoZSBkZWx0YSBzaW5jZSB0aGUgbGFzdCB1cGRhdGVfd2FsbF90aW1lOiAqLwotCWRlbHRhID0gY2xvY2tzb3VyY2VfZGVsdGEoY3ljbGVfbm93LCB0ay0+dGtyLmN5Y2xlX2xhc3QsIHRrLT50a3IubWFzayk7Ci0KLQkvKiBjb252ZXJ0IGRlbHRhIHRvIG5hbm9zZWNvbmRzLiAqLwotCW5zZWMgPSBjbG9ja3NvdXJjZV9jeWMybnMoZGVsdGEsIGNsb2NrLT5tdWx0LCBjbG9jay0+c2hpZnQpOwotCi0JLyogSWYgYXJjaCByZXF1aXJlcywgYWRkIGluIGdldF9hcmNoX3RpbWVvZmZzZXQoKSAqLwotCXJldHVybiBuc2VjICsgYXJjaF9nZXR0aW1lb2Zmc2V0KCk7Ci19Ci0KIC8qKgogICogdXBkYXRlX2Zhc3RfdGltZWtlZXBlciAtIFVwZGF0ZSB0aGUgZmFzdCBhbmQgTk1JIHNhZmUgbW9ub3RvbmljIHRpbWVrZWVwZXIuCiAgKiBAdGtyOiBUaW1la2VlcGluZyByZWFkb3V0IGJhc2UgZnJvbSB3aGljaCB3ZSB0YWtlIHRoZSB1cGRhdGUKQEAgLTI2NywxOCArMzYyLDE4IEBACiAgKiBzbGlnaHRseSB3cm9uZyB0aW1lc3RhbXAgKGEgZmV3IG5hbm9zZWNvbmRzKS4gU2VlCiAgKiBAa3RpbWVfZ2V0X21vbm9fZmFzdF9ucy4KICAqLwotc3RhdGljIHZvaWQgdXBkYXRlX2Zhc3RfdGltZWtlZXBlcihzdHJ1Y3QgdGtfcmVhZF9iYXNlICp0a3IpCitzdGF0aWMgdm9pZCB1cGRhdGVfZmFzdF90aW1la2VlcGVyKHN0cnVjdCB0a19yZWFkX2Jhc2UgKnRrciwgc3RydWN0IHRrX2Zhc3QgKnRrZikKIHsKLQlzdHJ1Y3QgdGtfcmVhZF9iYXNlICpiYXNlID0gdGtfZmFzdF9tb25vLmJhc2U7CisJc3RydWN0IHRrX3JlYWRfYmFzZSAqYmFzZSA9IHRrZi0+YmFzZTsKIAogCS8qIEZvcmNlIHJlYWRlcnMgb2ZmIHRvIGJhc2VbMV0gKi8KLQlyYXdfd3JpdGVfc2VxY291bnRfbGF0Y2goJnRrX2Zhc3RfbW9uby5zZXEpOworCXJhd193cml0ZV9zZXFjb3VudF9sYXRjaCgmdGtmLT5zZXEpOwogCiAJLyogVXBkYXRlIGJhc2VbMF0gKi8KIAltZW1jcHkoYmFzZSwgdGtyLCBzaXplb2YoKmJhc2UpKTsKIAogCS8qIEZvcmNlIHJlYWRlcnMgYmFjayB0byBiYXNlWzBdICovCi0JcmF3X3dyaXRlX3NlcWNvdW50X2xhdGNoKCZ0a19mYXN0X21vbm8uc2VxKTsKKwlyYXdfd3JpdGVfc2VxY291bnRfbGF0Y2goJnRrZi0+c2VxKTsKIAogCS8qIFVwZGF0ZSBiYXNlWzFdICovCiAJbWVtY3B5KGJhc2UgKyAxLCBiYXNlLCBzaXplb2YoKmJhc2UpKTsKQEAgLTMxNiwyMiArNDExLDMzIEBACiAgKiBvZiB0aGUgZm9sbG93aW5nIHRpbWVzdGFtcHMuIENhbGxlcnMgbmVlZCB0byBiZSBhd2FyZSBvZiB0aGF0IGFuZAogICogZGVhbCB3aXRoIGl0LgogICovCi11NjQgbm90cmFjZSBrdGltZV9nZXRfbW9ub19mYXN0X25zKHZvaWQpCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHU2NCBfX2t0aW1lX2dldF9mYXN0X25zKHN0cnVjdCB0a19mYXN0ICp0a2YpCiB7CiAJc3RydWN0IHRrX3JlYWRfYmFzZSAqdGtyOwogCXVuc2lnbmVkIGludCBzZXE7CiAJdTY0IG5vdzsKIAogCWRvIHsKLQkJc2VxID0gcmF3X3JlYWRfc2VxY291bnQoJnRrX2Zhc3RfbW9uby5zZXEpOwotCQl0a3IgPSB0a19mYXN0X21vbm8uYmFzZSArIChzZXEgJiAweDAxKTsKLQkJbm93ID0ga3RpbWVfdG9fbnModGtyLT5iYXNlX21vbm8pICsgdGltZWtlZXBpbmdfZ2V0X25zKHRrcik7CisJCXNlcSA9IHJhd19yZWFkX3NlcWNvdW50KCZ0a2YtPnNlcSk7CisJCXRrciA9IHRrZi0+YmFzZSArIChzZXEgJiAweDAxKTsKKwkJbm93ID0ga3RpbWVfdG9fbnModGtyLT5iYXNlKSArIHRpbWVrZWVwaW5nX2dldF9ucyh0a3IpOworCX0gd2hpbGUgKHJlYWRfc2VxY291bnRfcmV0cnkoJnRrZi0+c2VxLCBzZXEpKTsKIAotCX0gd2hpbGUgKHJlYWRfc2VxY291bnRfcmV0cnkoJnRrX2Zhc3RfbW9uby5zZXEsIHNlcSkpOwogCXJldHVybiBub3c7CiB9CisKK3U2NCBrdGltZV9nZXRfbW9ub19mYXN0X25zKHZvaWQpCit7CisJcmV0dXJuIF9fa3RpbWVfZ2V0X2Zhc3RfbnMoJnRrX2Zhc3RfbW9ubyk7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChrdGltZV9nZXRfbW9ub19mYXN0X25zKTsKIAordTY0IGt0aW1lX2dldF9yYXdfZmFzdF9ucyh2b2lkKQoreworCXJldHVybiBfX2t0aW1lX2dldF9mYXN0X25zKCZ0a19mYXN0X3Jhdyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrdGltZV9nZXRfcmF3X2Zhc3RfbnMpOworCiAvKiBTdXNwZW5kLXRpbWUgY3ljbGVzIHZhbHVlIGZvciBoYWx0ZWQgZmFzdCB0aW1la2VlcGVyLiAqLwogc3RhdGljIGN5Y2xlX3QgY3ljbGVzX2F0X3N1c3BlbmQ7CiAKQEAgLTM1MywxMiArNDU5LDE3IEBACiBzdGF0aWMgdm9pZCBoYWx0X2Zhc3RfdGltZWtlZXBlcihzdHJ1Y3QgdGltZWtlZXBlciAqdGspCiB7CiAJc3RhdGljIHN0cnVjdCB0a19yZWFkX2Jhc2UgdGtyX2R1bW15OwotCXN0cnVjdCB0a19yZWFkX2Jhc2UgKnRrciA9ICZ0ay0+dGtyOworCXN0cnVjdCB0a19yZWFkX2Jhc2UgKnRrciA9ICZ0ay0+dGtyX21vbm87CiAKIAltZW1jcHkoJnRrcl9kdW1teSwgdGtyLCBzaXplb2YodGtyX2R1bW15KSk7CiAJY3ljbGVzX2F0X3N1c3BlbmQgPSB0a3ItPnJlYWQodGtyLT5jbG9jayk7CiAJdGtyX2R1bW15LnJlYWQgPSBkdW1teV9jbG9ja19yZWFkOwotCXVwZGF0ZV9mYXN0X3RpbWVrZWVwZXIoJnRrcl9kdW1teSk7CisJdXBkYXRlX2Zhc3RfdGltZWtlZXBlcigmdGtyX2R1bW15LCAmdGtfZmFzdF9tb25vKTsKKworCXRrciA9ICZ0ay0+dGtyX3JhdzsKKwltZW1jcHkoJnRrcl9kdW1teSwgdGtyLCBzaXplb2YodGtyX2R1bW15KSk7CisJdGtyX2R1bW15LnJlYWQgPSBkdW1teV9jbG9ja19yZWFkOworCXVwZGF0ZV9mYXN0X3RpbWVrZWVwZXIoJnRrcl9kdW1teSwgJnRrX2Zhc3RfcmF3KTsKIH0KIAogI2lmZGVmIENPTkZJR19HRU5FUklDX1RJTUVfVlNZU0NBTExfT0xECkBAIC0zNjksOCArNDgwLDggQEAKIAogCXh0ID0gdGltZXNwZWM2NF90b190aW1lc3BlYyh0a194dGltZSh0aykpOwogCXdtID0gdGltZXNwZWM2NF90b190aW1lc3BlYyh0ay0+d2FsbF90b19tb25vdG9uaWMpOwotCXVwZGF0ZV92c3lzY2FsbF9vbGQoJnh0LCAmd20sIHRrLT50a3IuY2xvY2ssIHRrLT50a3IubXVsdCwKLQkJCSAgICB0ay0+dGtyLmN5Y2xlX2xhc3QpOworCXVwZGF0ZV92c3lzY2FsbF9vbGQoJnh0LCAmd20sIHRrLT50a3JfbW9uby5jbG9jaywgdGstPnRrcl9tb25vLm11bHQsCisJCQkgICAgdGstPnRrcl9tb25vLmN5Y2xlX2xhc3QpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgb2xkX3ZzeXNjYWxsX2ZpeHVwKHN0cnVjdCB0aW1la2VlcGVyICp0aykKQEAgLTM4NywxMSArNDk4LDExIEBACiAJKiAoc2hpZnRlZCBuYW5vc2Vjb25kcyksIGFuZCBDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMX09MRAogCSogdXNlcnMgYXJlIHJlbW92ZWQsIHRoaXMgY2FuIGJlIGtpbGxlZC4KIAkqLwotCXJlbWFpbmRlciA9IHRrLT50a3IueHRpbWVfbnNlYyAmICgoMVVMTCA8PCB0ay0+dGtyLnNoaWZ0KSAtIDEpOwotCXRrLT50a3IueHRpbWVfbnNlYyAtPSByZW1haW5kZXI7Ci0JdGstPnRrci54dGltZV9uc2VjICs9IDFVTEwgPDwgdGstPnRrci5zaGlmdDsKKwlyZW1haW5kZXIgPSB0ay0+dGtyX21vbm8ueHRpbWVfbnNlYyAmICgoMVVMTCA8PCB0ay0+dGtyX21vbm8uc2hpZnQpIC0gMSk7CisJdGstPnRrcl9tb25vLnh0aW1lX25zZWMgLT0gcmVtYWluZGVyOworCXRrLT50a3JfbW9uby54dGltZV9uc2VjICs9IDFVTEwgPDwgdGstPnRrcl9tb25vLnNoaWZ0OwogCXRrLT5udHBfZXJyb3IgKz0gcmVtYWluZGVyIDw8IHRrLT5udHBfZXJyb3Jfc2hpZnQ7Ci0JdGstPm50cF9lcnJvciAtPSAoMVVMTCA8PCB0ay0+dGtyLnNoaWZ0KSA8PCB0ay0+bnRwX2Vycm9yX3NoaWZ0OworCXRrLT5udHBfZXJyb3IgLT0gKDFVTEwgPDwgdGstPnRrcl9tb25vLnNoaWZ0KSA8PCB0ay0+bnRwX2Vycm9yX3NoaWZ0OwogfQogI2Vsc2UKICNkZWZpbmUgb2xkX3ZzeXNjYWxsX2ZpeHVwKHRrKQpAQCAtNDU2LDE3ICs1NjcsMTcgQEAKIAkgKi8KIAlzZWNvbmRzID0gKHU2NCkodGstPnh0aW1lX3NlYyArIHRrLT53YWxsX3RvX21vbm90b25pYy50dl9zZWMpOwogCW5zZWMgPSAodTMyKSB0ay0+d2FsbF90b19tb25vdG9uaWMudHZfbnNlYzsKLQl0ay0+dGtyLmJhc2VfbW9ubyA9IG5zX3RvX2t0aW1lKHNlY29uZHMgKiBOU0VDX1BFUl9TRUMgKyBuc2VjKTsKKwl0ay0+dGtyX21vbm8uYmFzZSA9IG5zX3RvX2t0aW1lKHNlY29uZHMgKiBOU0VDX1BFUl9TRUMgKyBuc2VjKTsKIAogCS8qIFVwZGF0ZSB0aGUgbW9ub3RvbmljIHJhdyBiYXNlICovCi0JdGstPmJhc2VfcmF3ID0gdGltZXNwZWM2NF90b19rdGltZSh0ay0+cmF3X3RpbWUpOworCXRrLT50a3JfcmF3LmJhc2UgPSB0aW1lc3BlYzY0X3RvX2t0aW1lKHRrLT5yYXdfdGltZSk7CiAKIAkvKgogCSAqIFRoZSBzdW0gb2YgdGhlIG5hbm9zZWNvbmRzIHBvcnRpb25zIG9mIHh0aW1lIGFuZAogCSAqIHdhbGxfdG9fbW9ub3RvbmljIGNhbiBiZSBncmVhdGVyL2VxdWFsIG9uZSBzZWNvbmQuIFRha2UKIAkgKiB0aGlzIGludG8gYWNjb3VudCBiZWZvcmUgdXBkYXRpbmcgdGstPmt0aW1lX3NlYy4KIAkgKi8KLQluc2VjICs9ICh1MzIpKHRrLT50a3IueHRpbWVfbnNlYyA+PiB0ay0+dGtyLnNoaWZ0KTsKKwluc2VjICs9ICh1MzIpKHRrLT50a3JfbW9uby54dGltZV9uc2VjID4+IHRrLT50a3JfbW9uby5zaGlmdCk7CiAJaWYgKG5zZWMgPj0gTlNFQ19QRVJfU0VDKQogCQlzZWNvbmRzKys7CiAJdGstPmt0aW1lX3NlYyA9IHNlY29uZHM7CkBAIC00ODksNyArNjAwLDggQEAKIAkJbWVtY3B5KCZzaGFkb3dfdGltZWtlZXBlciwgJnRrX2NvcmUudGltZWtlZXBlciwKIAkJICAgICAgIHNpemVvZih0a19jb3JlLnRpbWVrZWVwZXIpKTsKIAotCXVwZGF0ZV9mYXN0X3RpbWVrZWVwZXIoJnRrLT50a3IpOworCXVwZGF0ZV9mYXN0X3RpbWVrZWVwZXIoJnRrLT50a3JfbW9ubywgJnRrX2Zhc3RfbW9ubyk7CisJdXBkYXRlX2Zhc3RfdGltZWtlZXBlcigmdGstPnRrcl9yYXcsICAmdGtfZmFzdF9yYXcpOwogfQogCiAvKioKQEAgLTUwMSwyMiArNjEzLDIzIEBACiAgKi8KIHN0YXRpYyB2b2lkIHRpbWVrZWVwaW5nX2ZvcndhcmRfbm93KHN0cnVjdCB0aW1la2VlcGVyICp0aykKIHsKLQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNsb2NrID0gdGstPnRrci5jbG9jazsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNsb2NrID0gdGstPnRrcl9tb25vLmNsb2NrOwogCWN5Y2xlX3QgY3ljbGVfbm93LCBkZWx0YTsKIAlzNjQgbnNlYzsKIAotCWN5Y2xlX25vdyA9IHRrLT50a3IucmVhZChjbG9jayk7Ci0JZGVsdGEgPSBjbG9ja3NvdXJjZV9kZWx0YShjeWNsZV9ub3csIHRrLT50a3IuY3ljbGVfbGFzdCwgdGstPnRrci5tYXNrKTsKLQl0ay0+dGtyLmN5Y2xlX2xhc3QgPSBjeWNsZV9ub3c7CisJY3ljbGVfbm93ID0gdGstPnRrcl9tb25vLnJlYWQoY2xvY2spOworCWRlbHRhID0gY2xvY2tzb3VyY2VfZGVsdGEoY3ljbGVfbm93LCB0ay0+dGtyX21vbm8uY3ljbGVfbGFzdCwgdGstPnRrcl9tb25vLm1hc2spOworCXRrLT50a3JfbW9uby5jeWNsZV9sYXN0ID0gY3ljbGVfbm93OworCXRrLT50a3JfcmF3LmN5Y2xlX2xhc3QgID0gY3ljbGVfbm93OwogCi0JdGstPnRrci54dGltZV9uc2VjICs9IGRlbHRhICogdGstPnRrci5tdWx0OworCXRrLT50a3JfbW9uby54dGltZV9uc2VjICs9IGRlbHRhICogdGstPnRrcl9tb25vLm11bHQ7CiAKIAkvKiBJZiBhcmNoIHJlcXVpcmVzLCBhZGQgaW4gZ2V0X2FyY2hfdGltZW9mZnNldCgpICovCi0JdGstPnRrci54dGltZV9uc2VjICs9ICh1NjQpYXJjaF9nZXR0aW1lb2Zmc2V0KCkgPDwgdGstPnRrci5zaGlmdDsKKwl0ay0+dGtyX21vbm8ueHRpbWVfbnNlYyArPSAodTY0KWFyY2hfZ2V0dGltZW9mZnNldCgpIDw8IHRrLT50a3JfbW9uby5zaGlmdDsKIAogCXRrX25vcm1hbGl6ZV94dGltZSh0ayk7CiAKLQluc2VjID0gY2xvY2tzb3VyY2VfY3ljMm5zKGRlbHRhLCBjbG9jay0+bXVsdCwgY2xvY2stPnNoaWZ0KTsKKwluc2VjID0gY2xvY2tzb3VyY2VfY3ljMm5zKGRlbHRhLCB0ay0+dGtyX3Jhdy5tdWx0LCB0ay0+dGtyX3Jhdy5zaGlmdCk7CiAJdGltZXNwZWM2NF9hZGRfbnMoJnRrLT5yYXdfdGltZSwgbnNlYyk7CiB9CiAKQEAgLTUzNyw3ICs2NTAsNyBAQAogCQlzZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZ0a19jb3JlLnNlcSk7CiAKIAkJdHMtPnR2X3NlYyA9IHRrLT54dGltZV9zZWM7Ci0JCW5zZWNzID0gdGltZWtlZXBpbmdfZ2V0X25zKCZ0ay0+dGtyKTsKKwkJbnNlY3MgPSB0aW1la2VlcGluZ19nZXRfbnMoJnRrLT50a3JfbW9ubyk7CiAKIAl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZ0a19jb3JlLnNlcSwgc2VxKSk7CiAKQEAgLTU3Nyw4ICs2OTAsOCBAQAogCiAJZG8gewogCQlzZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZ0a19jb3JlLnNlcSk7Ci0JCWJhc2UgPSB0ay0+dGtyLmJhc2VfbW9ubzsKLQkJbnNlY3MgPSB0aW1la2VlcGluZ19nZXRfbnMoJnRrLT50a3IpOworCQliYXNlID0gdGstPnRrcl9tb25vLmJhc2U7CisJCW5zZWNzID0gdGltZWtlZXBpbmdfZ2V0X25zKCZ0ay0+dGtyX21vbm8pOwogCiAJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmdGtfY29yZS5zZXEsIHNlcSkpOwogCkBAIC02MDMsOCArNzE2LDggQEAKIAogCWRvIHsKIAkJc2VxID0gcmVhZF9zZXFjb3VudF9iZWdpbigmdGtfY29yZS5zZXEpOwotCQliYXNlID0ga3RpbWVfYWRkKHRrLT50a3IuYmFzZV9tb25vLCAqb2Zmc2V0KTsKLQkJbnNlY3MgPSB0aW1la2VlcGluZ19nZXRfbnMoJnRrLT50a3IpOworCQliYXNlID0ga3RpbWVfYWRkKHRrLT50a3JfbW9uby5iYXNlLCAqb2Zmc2V0KTsKKwkJbnNlY3MgPSB0aW1la2VlcGluZ19nZXRfbnMoJnRrLT50a3JfbW9ubyk7CiAKIAl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZ0a19jb3JlLnNlcSwgc2VxKSk7CiAKQEAgLTY0NSw4ICs3NTgsOCBAQAogCiAJZG8gewogCQlzZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZ0a19jb3JlLnNlcSk7Ci0JCWJhc2UgPSB0ay0+YmFzZV9yYXc7Ci0JCW5zZWNzID0gdGltZWtlZXBpbmdfZ2V0X25zX3Jhdyh0ayk7CisJCWJhc2UgPSB0ay0+dGtyX3Jhdy5iYXNlOworCQluc2VjcyA9IHRpbWVrZWVwaW5nX2dldF9ucygmdGstPnRrcl9yYXcpOwogCiAJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmdGtfY29yZS5zZXEsIHNlcSkpOwogCkBAIC02NzQsNyArNzg3LDcgQEAKIAlkbyB7CiAJCXNlcSA9IHJlYWRfc2VxY291bnRfYmVnaW4oJnRrX2NvcmUuc2VxKTsKIAkJdHMtPnR2X3NlYyA9IHRrLT54dGltZV9zZWM7Ci0JCW5zZWMgPSB0aW1la2VlcGluZ19nZXRfbnMoJnRrLT50a3IpOworCQluc2VjID0gdGltZWtlZXBpbmdfZ2V0X25zKCZ0ay0+dGtyX21vbm8pOwogCQl0b21vbm8gPSB0ay0+d2FsbF90b19tb25vdG9uaWM7CiAKIAl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZ0a19jb3JlLnNlcSwgc2VxKSk7CkBAIC03NTksOCArODcyLDggQEAKIAkJdHNfcmVhbC0+dHZfc2VjID0gdGstPnh0aW1lX3NlYzsKIAkJdHNfcmVhbC0+dHZfbnNlYyA9IDA7CiAKLQkJbnNlY3NfcmF3ID0gdGltZWtlZXBpbmdfZ2V0X25zX3Jhdyh0ayk7Ci0JCW5zZWNzX3JlYWwgPSB0aW1la2VlcGluZ19nZXRfbnMoJnRrLT50a3IpOworCQluc2Vjc19yYXcgID0gdGltZWtlZXBpbmdfZ2V0X25zKCZ0ay0+dGtyX3Jhdyk7CisJCW5zZWNzX3JlYWwgPSB0aW1la2VlcGluZ19nZXRfbnMoJnRrLT50a3JfbW9ubyk7CiAKIAl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZ0a19jb3JlLnNlcSwgc2VxKSk7CiAKQEAgLTk0Myw3ICsxMDU2LDcgQEAKIAkgKi8KIAlpZiAodHJ5X21vZHVsZV9nZXQobmV3LT5vd25lcikpIHsKIAkJaWYgKCFuZXctPmVuYWJsZSB8fCBuZXctPmVuYWJsZShuZXcpID09IDApIHsKLQkJCW9sZCA9IHRrLT50a3IuY2xvY2s7CisJCQlvbGQgPSB0ay0+dGtyX21vbm8uY2xvY2s7CiAJCQl0a19zZXR1cF9pbnRlcm5hbHModGssIG5ldyk7CiAJCQlpZiAob2xkLT5kaXNhYmxlKQogCQkJCW9sZC0+ZGlzYWJsZShvbGQpOwpAQCAtOTcxLDExICsxMDg0LDExIEBACiB7CiAJc3RydWN0IHRpbWVrZWVwZXIgKnRrID0gJnRrX2NvcmUudGltZWtlZXBlcjsKIAotCWlmICh0ay0+dGtyLmNsb2NrID09IGNsb2NrKQorCWlmICh0ay0+dGtyX21vbm8uY2xvY2sgPT0gY2xvY2spCiAJCXJldHVybiAwOwogCXN0b3BfbWFjaGluZShjaGFuZ2VfY2xvY2tzb3VyY2UsIGNsb2NrLCBOVUxMKTsKIAl0aWNrX2Nsb2NrX25vdGlmeSgpOwotCXJldHVybiB0ay0+dGtyLmNsb2NrID09IGNsb2NrID8gMCA6IC0xOworCXJldHVybiB0ay0+dGtyX21vbm8uY2xvY2sgPT0gY2xvY2sgPyAwIDogLTE7CiB9CiAKIC8qKgpAQCAtOTkzLDcgKzExMDYsNyBAQAogCiAJZG8gewogCQlzZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZ0a19jb3JlLnNlcSk7Ci0JCW5zZWNzID0gdGltZWtlZXBpbmdfZ2V0X25zX3Jhdyh0ayk7CisJCW5zZWNzID0gdGltZWtlZXBpbmdfZ2V0X25zKCZ0ay0+dGtyX3Jhdyk7CiAJCXRzNjQgPSB0ay0+cmF3X3RpbWU7CiAKIAl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZ0a19jb3JlLnNlcSwgc2VxKSk7CkBAIC0xMDE2LDcgKzExMjksNyBAQAogCWRvIHsKIAkJc2VxID0gcmVhZF9zZXFjb3VudF9iZWdpbigmdGtfY29yZS5zZXEpOwogCi0JCXJldCA9IHRrLT50a3IuY2xvY2stPmZsYWdzICYgQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTOworCQlyZXQgPSB0ay0+dGtyX21vbm8uY2xvY2stPmZsYWdzICYgQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTOwogCiAJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmdGtfY29yZS5zZXEsIHNlcSkpOwogCkBAIC0xMDM1LDcgKzExNDgsNyBAQAogCWRvIHsKIAkJc2VxID0gcmVhZF9zZXFjb3VudF9iZWdpbigmdGtfY29yZS5zZXEpOwogCi0JCXJldCA9IHRrLT50a3IuY2xvY2stPm1heF9pZGxlX25zOworCQlyZXQgPSB0ay0+dGtyX21vbm8uY2xvY2stPm1heF9pZGxlX25zOwogCiAJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgmdGtfY29yZS5zZXEsIHNlcSkpOwogCkBAIC0xMDU3LDYgKzExNzAsMTQgQEAKIAl0cy0+dHZfbnNlYyA9IDA7CiB9CiAKK3ZvaWQgX193ZWFrIHJlYWRfcGVyc2lzdGVudF9jbG9jazY0KHN0cnVjdCB0aW1lc3BlYzY0ICp0czY0KQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCXJlYWRfcGVyc2lzdGVudF9jbG9jaygmdHMpOworCSp0czY0ID0gdGltZXNwZWNfdG9fdGltZXNwZWM2NCh0cyk7Cit9CisKIC8qKgogICogcmVhZF9ib290X2Nsb2NrIC0gIFJldHVybiB0aW1lIG9mIHRoZSBzeXN0ZW0gc3RhcnQuCiAgKgpAQCAtMTA3Miw2ICsxMTkzLDIwIEBACiAJdHMtPnR2X25zZWMgPSAwOwogfQogCit2b2lkIF9fd2VhayByZWFkX2Jvb3RfY2xvY2s2NChzdHJ1Y3QgdGltZXNwZWM2NCAqdHM2NCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKwlyZWFkX2Jvb3RfY2xvY2soJnRzKTsKKwkqdHM2NCA9IHRpbWVzcGVjX3RvX3RpbWVzcGVjNjQodHMpOworfQorCisvKiBGbGFnIGZvciBpZiB0aW1la2VlcGluZ19yZXN1bWUoKSBoYXMgaW5qZWN0ZWQgc2xlZXB0aW1lICovCitzdGF0aWMgYm9vbCBzbGVlcHRpbWVfaW5qZWN0ZWQ7CisKKy8qIEZsYWcgZm9yIGlmIHRoZXJlIGlzIGEgcGVyc2lzdGVudCBjbG9jayBvbiB0aGlzIHBsYXRmb3JtICovCitzdGF0aWMgYm9vbCBwZXJzaXN0ZW50X2Nsb2NrX2V4aXN0czsKKwogLyoKICAqIHRpbWVrZWVwaW5nX2luaXQgLSBJbml0aWFsaXplcyB0aGUgY2xvY2tzb3VyY2UgYW5kIGNvbW1vbiB0aW1la2VlcGluZyB2YWx1ZXMKICAqLwpAQCAtMTA4MSwyMCArMTIxNiwxNyBAQAogCXN0cnVjdCBjbG9ja3NvdXJjZSAqY2xvY2s7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgdGltZXNwZWM2NCBub3csIGJvb3QsIHRtcDsKLQlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAKLQlyZWFkX3BlcnNpc3RlbnRfY2xvY2soJnRzKTsKLQlub3cgPSB0aW1lc3BlY190b190aW1lc3BlYzY0KHRzKTsKKwlyZWFkX3BlcnNpc3RlbnRfY2xvY2s2NCgmbm93KTsKIAlpZiAoIXRpbWVzcGVjNjRfdmFsaWRfc3RyaWN0KCZub3cpKSB7CiAJCXByX3dhcm4oIldBUk5JTkc6IFBlcnNpc3RlbnQgY2xvY2sgcmV0dXJuZWQgaW52YWxpZCB2YWx1ZSFcbiIKIAkJCSIgICAgICAgICBDaGVjayB5b3VyIENNT1MvQklPUyBzZXR0aW5ncy5cbiIpOwogCQlub3cudHZfc2VjID0gMDsKIAkJbm93LnR2X25zZWMgPSAwOwogCX0gZWxzZSBpZiAobm93LnR2X3NlYyB8fCBub3cudHZfbnNlYykKLQkJcGVyc2lzdGVudF9jbG9ja19leGlzdCA9IHRydWU7CisJCXBlcnNpc3RlbnRfY2xvY2tfZXhpc3RzID0gdHJ1ZTsKIAotCXJlYWRfYm9vdF9jbG9jaygmdHMpOwotCWJvb3QgPSB0aW1lc3BlY190b190aW1lc3BlYzY0KHRzKTsKKwlyZWFkX2Jvb3RfY2xvY2s2NCgmYm9vdCk7CiAJaWYgKCF0aW1lc3BlYzY0X3ZhbGlkX3N0cmljdCgmYm9vdCkpIHsKIAkJcHJfd2FybigiV0FSTklORzogQm9vdCBjbG9jayByZXR1cm5lZCBpbnZhbGlkIHZhbHVlIVxuIgogCQkJIiAgICAgICAgIENoZWNrIHlvdXIgQ01PUy9CSU9TIHNldHRpbmdzLlxuIik7CkBAIC0xMTE0LDcgKzEyNDYsNiBAQAogCXRrX3NldF94dGltZSh0aywgJm5vdyk7CiAJdGstPnJhd190aW1lLnR2X3NlYyA9IDA7CiAJdGstPnJhd190aW1lLnR2X25zZWMgPSAwOwotCXRrLT5iYXNlX3Jhdy50djY0ID0gMDsKIAlpZiAoYm9vdC50dl9zZWMgPT0gMCAmJiBib290LnR2X25zZWMgPT0gMCkKIAkJYm9vdCA9IHRrX3h0aW1lKHRrKTsKIApAQCAtMTEyNyw3ICsxMjU4LDcgQEAKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGltZWtlZXBlcl9sb2NrLCBmbGFncyk7CiB9CiAKLS8qIHRpbWUgaW4gc2Vjb25kcyB3aGVuIHN1c3BlbmQgYmVnYW4gKi8KKy8qIHRpbWUgaW4gc2Vjb25kcyB3aGVuIHN1c3BlbmQgYmVnYW4gZm9yIHBlcnNpc3RlbnQgY2xvY2sgKi8KIHN0YXRpYyBzdHJ1Y3QgdGltZXNwZWM2NCB0aW1la2VlcGluZ19zdXNwZW5kX3RpbWU7CiAKIC8qKgpAQCAtMTE1MiwxMiArMTI4Myw0OSBAQAogCXRrX2RlYnVnX2FjY291bnRfc2xlZXBfdGltZShkZWx0YSk7CiB9CiAKKyNpZiBkZWZpbmVkKENPTkZJR19QTV9TTEVFUCkgJiYgZGVmaW5lZChDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFKQorLyoqCisgKiBXZSBoYXZlIHRocmVlIGtpbmRzIG9mIHRpbWUgc291cmNlcyB0byB1c2UgZm9yIHNsZWVwIHRpbWUKKyAqIGluamVjdGlvbiwgdGhlIHByZWZlcmVuY2Ugb3JkZXIgaXM6CisgKiAxKSBub24tc3RvcCBjbG9ja3NvdXJjZQorICogMikgcGVyc2lzdGVudCBjbG9jayAoaWU6IFJUQyBhY2Nlc3NpYmxlIHdoZW4gaXJxcyBhcmUgb2ZmKQorICogMykgUlRDCisgKgorICogMSkgYW5kIDIpIGFyZSB1c2VkIGJ5IHRpbWVrZWVwaW5nLCAzKSBieSBSVEMgc3Vic3lzdGVtLgorICogSWYgc3lzdGVtIGhhcyBuZWl0aGVyIDEpIG5vciAyKSwgMykgd2lsbCBiZSB1c2VkIGZpbmFsbHkuCisgKgorICoKKyAqIElmIHRpbWVrZWVwaW5nIGhhcyBpbmplY3RlZCBzbGVlcHRpbWUgdmlhIGVpdGhlciAxKSBvciAyKSwKKyAqIDMpIGJlY29tZXMgbmVlZGxlc3MsIHNvIGluIHRoaXMgY2FzZSB3ZSBkb24ndCBuZWVkIHRvIGNhbGwKKyAqIHJ0Y19yZXN1bWUoKSwgYW5kIHRoaXMgaXMgd2hhdCB0aW1la2VlcGluZ19ydGNfc2tpcHJlc3VtZSgpCisgKiBtZWFucy4KKyAqLworYm9vbCB0aW1la2VlcGluZ19ydGNfc2tpcHJlc3VtZSh2b2lkKQoreworCXJldHVybiBzbGVlcHRpbWVfaW5qZWN0ZWQ7Cit9CisKKy8qKgorICogMSkgY2FuIGJlIGRldGVybWluZWQgd2hldGhlciB0byB1c2Ugb3Igbm90IG9ubHkgd2hlbiBkb2luZworICogdGltZWtlZXBpbmdfcmVzdW1lKCkgd2hpY2ggaXMgaW52b2tlZCBhZnRlciBydGNfc3VzcGVuZCgpLAorICogc28gd2UgY2FuJ3Qgc2tpcCBydGNfc3VzcGVuZCgpIHN1cmVseSBpZiBzeXN0ZW0gaGFzIDEpLgorICoKKyAqIEJ1dCBpZiBzeXN0ZW0gaGFzIDIpLCAyKSB3aWxsIGRlZmluaXRlbHkgYmUgdXNlZCwgc28gaW4gdGhpcworICogY2FzZSB3ZSBkb24ndCBuZWVkIHRvIGNhbGwgcnRjX3N1c3BlbmQoKSwgYW5kIHRoaXMgaXMgd2hhdAorICogdGltZWtlZXBpbmdfcnRjX3NraXBzdXNwZW5kKCkgbWVhbnMuCisgKi8KK2Jvb2wgdGltZWtlZXBpbmdfcnRjX3NraXBzdXNwZW5kKHZvaWQpCit7CisJcmV0dXJuIHBlcnNpc3RlbnRfY2xvY2tfZXhpc3RzOworfQorCiAvKioKICAqIHRpbWVrZWVwaW5nX2luamVjdF9zbGVlcHRpbWU2NCAtIEFkZHMgc3VzcGVuZCBpbnRlcnZhbCB0byB0aW1lZWtlZXBpbmcgdmFsdWVzCiAgKiBAZGVsdGE6IHBvaW50ZXIgdG8gYSB0aW1lc3BlYzY0IGRlbHRhIHZhbHVlCiAgKgotICogVGhpcyBob29rIGlzIGZvciBhcmNoaXRlY3R1cmVzIHRoYXQgY2Fubm90IHN1cHBvcnQgcmVhZF9wZXJzaXN0ZW50X2Nsb2NrCisgKiBUaGlzIGhvb2sgaXMgZm9yIGFyY2hpdGVjdHVyZXMgdGhhdCBjYW5ub3Qgc3VwcG9ydCByZWFkX3BlcnNpc3RlbnRfY2xvY2s2NAogICogYmVjYXVzZSB0aGVpciBSVEMvcGVyc2lzdGVudCBjbG9jayBpcyBvbmx5IGFjY2Vzc2libGUgd2hlbiBpcnFzIGFyZSBlbmFibGVkLgorICogYW5kIGFsc28gZG9uJ3QgaGF2ZSBhbiBlZmZlY3RpdmUgbm9uc3RvcCBjbG9ja3NvdXJjZS4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBieSBydGNfcmVzdW1lKCksIGFuZCBhbGxvd3MKICAqIGEgc3VzcGVuZCBvZmZzZXQgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgdGltZWtlZXBpbmcgdmFsdWVzLgpAQCAtMTE2NywxMyArMTMzNSw2IEBACiAJc3RydWN0IHRpbWVrZWVwZXIgKnRrID0gJnRrX2NvcmUudGltZWtlZXBlcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JLyoKLQkgKiBNYWtlIHN1cmUgd2UgZG9uJ3Qgc2V0IHRoZSBjbG9jayB0d2ljZSwgYXMgdGltZWtlZXBpbmdfcmVzdW1lKCkKLQkgKiBhbHJlYWR5IGRpZCBpdAotCSAqLwotCWlmIChoYXNfcGVyc2lzdGVudF9jbG9jaygpKQotCQlyZXR1cm47Ci0KIAlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnRpbWVrZWVwZXJfbG9jaywgZmxhZ3MpOwogCXdyaXRlX3NlcWNvdW50X2JlZ2luKCZ0a19jb3JlLnNlcSk7CiAKQEAgLTExODksMjYgKzEzNTAsMjEgQEAKIAkvKiBzaWduYWwgaHJ0aW1lcnMgYWJvdXQgdGltZSBjaGFuZ2UgKi8KIAljbG9ja193YXNfc2V0KCk7CiB9CisjZW5kaWYKIAogLyoqCiAgKiB0aW1la2VlcGluZ19yZXN1bWUgLSBSZXN1bWVzIHRoZSBnZW5lcmljIHRpbWVrZWVwaW5nIHN1YnN5c3RlbS4KLSAqCi0gKiBUaGlzIGlzIGZvciB0aGUgZ2VuZXJpYyBjbG9ja3NvdXJjZSB0aW1la2VlcGluZy4KLSAqIHh0aW1lL3dhbGxfdG9fbW9ub3RvbmljL2ppZmZpZXMvZXRjIGFyZQotICogc3RpbGwgbWFuYWdlZCBieSBhcmNoIHNwZWNpZmljIHN1c3BlbmQvcmVzdW1lIGNvZGUuCiAgKi8KIHZvaWQgdGltZWtlZXBpbmdfcmVzdW1lKHZvaWQpCiB7CiAJc3RydWN0IHRpbWVrZWVwZXIgKnRrID0gJnRrX2NvcmUudGltZWtlZXBlcjsKLQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNsb2NrID0gdGstPnRrci5jbG9jazsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNsb2NrID0gdGstPnRrcl9tb25vLmNsb2NrOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHRpbWVzcGVjNjQgdHNfbmV3LCB0c19kZWx0YTsKLQlzdHJ1Y3QgdGltZXNwZWMgdG1wOwogCWN5Y2xlX3QgY3ljbGVfbm93LCBjeWNsZV9kZWx0YTsKLQlib29sIHN1c3BlbmR0aW1lX2ZvdW5kID0gZmFsc2U7CiAKLQlyZWFkX3BlcnNpc3RlbnRfY2xvY2soJnRtcCk7Ci0JdHNfbmV3ID0gdGltZXNwZWNfdG9fdGltZXNwZWM2NCh0bXApOworCXNsZWVwdGltZV9pbmplY3RlZCA9IGZhbHNlOworCXJlYWRfcGVyc2lzdGVudF9jbG9jazY0KCZ0c19uZXcpOwogCiAJY2xvY2tldmVudHNfcmVzdW1lKCk7CiAJY2xvY2tzb3VyY2VfcmVzdW1lKCk7CkBAIC0xMjI4LDE2ICsxMzg0LDE2IEBACiAJICogVGhlIGxlc3MgcHJlZmVycmVkIHNvdXJjZSB3aWxsIG9ubHkgYmUgdHJpZWQgaWYgdGhlcmUgaXMgbm8gYmV0dGVyCiAJICogdXNhYmxlIHNvdXJjZS4gVGhlIHJ0YyBwYXJ0IGlzIGhhbmRsZWQgc2VwYXJhdGVseSBpbiBydGMgY29yZSBjb2RlLgogCSAqLwotCWN5Y2xlX25vdyA9IHRrLT50a3IucmVhZChjbG9jayk7CisJY3ljbGVfbm93ID0gdGstPnRrcl9tb25vLnJlYWQoY2xvY2spOwogCWlmICgoY2xvY2stPmZsYWdzICYgQ0xPQ0tfU09VUkNFX1NVU1BFTkRfTk9OU1RPUCkgJiYKLQkJY3ljbGVfbm93ID4gdGstPnRrci5jeWNsZV9sYXN0KSB7CisJCWN5Y2xlX25vdyA+IHRrLT50a3JfbW9uby5jeWNsZV9sYXN0KSB7CiAJCXU2NCBudW0sIG1heCA9IFVMTE9OR19NQVg7CiAJCXUzMiBtdWx0ID0gY2xvY2stPm11bHQ7CiAJCXUzMiBzaGlmdCA9IGNsb2NrLT5zaGlmdDsKIAkJczY0IG5zZWMgPSAwOwogCi0JCWN5Y2xlX2RlbHRhID0gY2xvY2tzb3VyY2VfZGVsdGEoY3ljbGVfbm93LCB0ay0+dGtyLmN5Y2xlX2xhc3QsCi0JCQkJCQl0ay0+dGtyLm1hc2spOworCQljeWNsZV9kZWx0YSA9IGNsb2Nrc291cmNlX2RlbHRhKGN5Y2xlX25vdywgdGstPnRrcl9tb25vLmN5Y2xlX2xhc3QsCisJCQkJCQl0ay0+dGtyX21vbm8ubWFzayk7CiAKIAkJLyoKIAkJICogImN5Y2xlX2RlbHRhICogbXV0bCIgbWF5IGNhdXNlIDY0IGJpdHMgb3ZlcmZsb3csIGlmIHRoZQpAQCAtMTI1MywxNyArMTQwOSwxOSBAQAogCQluc2VjICs9ICgodTY0KSBjeWNsZV9kZWx0YSAqIG11bHQpID4+IHNoaWZ0OwogCiAJCXRzX2RlbHRhID0gbnNfdG9fdGltZXNwZWM2NChuc2VjKTsKLQkJc3VzcGVuZHRpbWVfZm91bmQgPSB0cnVlOworCQlzbGVlcHRpbWVfaW5qZWN0ZWQgPSB0cnVlOwogCX0gZWxzZSBpZiAodGltZXNwZWM2NF9jb21wYXJlKCZ0c19uZXcsICZ0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUpID4gMCkgewogCQl0c19kZWx0YSA9IHRpbWVzcGVjNjRfc3ViKHRzX25ldywgdGltZWtlZXBpbmdfc3VzcGVuZF90aW1lKTsKLQkJc3VzcGVuZHRpbWVfZm91bmQgPSB0cnVlOworCQlzbGVlcHRpbWVfaW5qZWN0ZWQgPSB0cnVlOwogCX0KIAotCWlmIChzdXNwZW5kdGltZV9mb3VuZCkKKwlpZiAoc2xlZXB0aW1lX2luamVjdGVkKQogCQlfX3RpbWVrZWVwaW5nX2luamVjdF9zbGVlcHRpbWUodGssICZ0c19kZWx0YSk7CiAKIAkvKiBSZS1iYXNlIHRoZSBsYXN0IGN5Y2xlIHZhbHVlICovCi0JdGstPnRrci5jeWNsZV9sYXN0ID0gY3ljbGVfbm93OworCXRrLT50a3JfbW9uby5jeWNsZV9sYXN0ID0gY3ljbGVfbm93OworCXRrLT50a3JfcmF3LmN5Y2xlX2xhc3QgID0gY3ljbGVfbm93OworCiAJdGstPm50cF9lcnJvciA9IDA7CiAJdGltZWtlZXBpbmdfc3VzcGVuZGVkID0gMDsKIAl0aW1la2VlcGluZ191cGRhdGUodGssIFRLX01JUlJPUiB8IFRLX0NMT0NLX1dBU19TRVQpOwpAQCAtMTI3Miw5ICsxNDMwLDcgQEAKIAogCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKIAotCWNsb2NrZXZlbnRzX25vdGlmeShDTE9DS19FVlRfTk9USUZZX1JFU1VNRSwgTlVMTCk7Ci0KLQkvKiBSZXN1bWUgaHJ0aW1lcnMgKi8KKwl0aWNrX3Jlc3VtZSgpOwogCWhydGltZXJzX3Jlc3VtZSgpOwogfQogCkBAIC0xMjg0LDEwICsxNDQwLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCB0aW1lc3BlYzY0CQlkZWx0YSwgZGVsdGFfZGVsdGE7CiAJc3RhdGljIHN0cnVjdCB0aW1lc3BlYzY0CW9sZF9kZWx0YTsKLQlzdHJ1Y3QgdGltZXNwZWMgdG1wOwogCi0JcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKCZ0bXApOwotCXRpbWVrZWVwaW5nX3N1c3BlbmRfdGltZSA9IHRpbWVzcGVjX3RvX3RpbWVzcGVjNjQodG1wKTsKKwlyZWFkX3BlcnNpc3RlbnRfY2xvY2s2NCgmdGltZWtlZXBpbmdfc3VzcGVuZF90aW1lKTsKIAogCS8qCiAJICogT24gc29tZSBzeXN0ZW1zIHRoZSBwZXJzaXN0ZW50X2Nsb2NrIGNhbiBub3QgYmUgZGV0ZWN0ZWQgYXQKQEAgLTEyOTUsMzEgKzE0NDksMzMgQEAKIAkgKiB2YWx1ZSByZXR1cm5lZCwgdXBkYXRlIHRoZSBwZXJzaXN0ZW50X2Nsb2NrX2V4aXN0cyBmbGFnLgogCSAqLwogCWlmICh0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUudHZfc2VjIHx8IHRpbWVrZWVwaW5nX3N1c3BlbmRfdGltZS50dl9uc2VjKQotCQlwZXJzaXN0ZW50X2Nsb2NrX2V4aXN0ID0gdHJ1ZTsKKwkJcGVyc2lzdGVudF9jbG9ja19leGlzdHMgPSB0cnVlOwogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZ0aW1la2VlcGVyX2xvY2ssIGZsYWdzKTsKIAl3cml0ZV9zZXFjb3VudF9iZWdpbigmdGtfY29yZS5zZXEpOwogCXRpbWVrZWVwaW5nX2ZvcndhcmRfbm93KHRrKTsKIAl0aW1la2VlcGluZ19zdXNwZW5kZWQgPSAxOwogCi0JLyoKLQkgKiBUbyBhdm9pZCBkcmlmdCBjYXVzZWQgYnkgcmVwZWF0ZWQgc3VzcGVuZC9yZXN1bWVzLAotCSAqIHdoaWNoIGVhY2ggY2FuIGFkZCB+MSBzZWNvbmQgZHJpZnQgZXJyb3IsCi0JICogdHJ5IHRvIGNvbXBlbnNhdGUgc28gdGhlIGRpZmZlcmVuY2UgaW4gc3lzdGVtIHRpbWUKLQkgKiBhbmQgcGVyc2lzdGVudF9jbG9jayB0aW1lIHN0YXlzIGNsb3NlIHRvIGNvbnN0YW50LgotCSAqLwotCWRlbHRhID0gdGltZXNwZWM2NF9zdWIodGtfeHRpbWUodGspLCB0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUpOwotCWRlbHRhX2RlbHRhID0gdGltZXNwZWM2NF9zdWIoZGVsdGEsIG9sZF9kZWx0YSk7Ci0JaWYgKGFicyhkZWx0YV9kZWx0YS50dl9zZWMpICA+PSAyKSB7CisJaWYgKHBlcnNpc3RlbnRfY2xvY2tfZXhpc3RzKSB7CiAJCS8qCi0JCSAqIGlmIGRlbHRhX2RlbHRhIGlzIHRvbyBsYXJnZSwgYXNzdW1lIHRpbWUgY29ycmVjdGlvbgotCQkgKiBoYXMgb2NjdXJlZCBhbmQgc2V0IG9sZF9kZWx0YSB0byB0aGUgY3VycmVudCBkZWx0YS4KKwkJICogVG8gYXZvaWQgZHJpZnQgY2F1c2VkIGJ5IHJlcGVhdGVkIHN1c3BlbmQvcmVzdW1lcywKKwkJICogd2hpY2ggZWFjaCBjYW4gYWRkIH4xIHNlY29uZCBkcmlmdCBlcnJvciwKKwkJICogdHJ5IHRvIGNvbXBlbnNhdGUgc28gdGhlIGRpZmZlcmVuY2UgaW4gc3lzdGVtIHRpbWUKKwkJICogYW5kIHBlcnNpc3RlbnRfY2xvY2sgdGltZSBzdGF5cyBjbG9zZSB0byBjb25zdGFudC4KIAkJICovCi0JCW9sZF9kZWx0YSA9IGRlbHRhOwotCX0gZWxzZSB7Ci0JCS8qIE90aGVyd2lzZSB0cnkgdG8gYWRqdXN0IG9sZF9zeXN0ZW0gdG8gY29tcGVuc2F0ZSAqLwotCQl0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUgPQotCQkJdGltZXNwZWM2NF9hZGQodGltZWtlZXBpbmdfc3VzcGVuZF90aW1lLCBkZWx0YV9kZWx0YSk7CisJCWRlbHRhID0gdGltZXNwZWM2NF9zdWIodGtfeHRpbWUodGspLCB0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUpOworCQlkZWx0YV9kZWx0YSA9IHRpbWVzcGVjNjRfc3ViKGRlbHRhLCBvbGRfZGVsdGEpOworCQlpZiAoYWJzKGRlbHRhX2RlbHRhLnR2X3NlYykgPj0gMikgeworCQkJLyoKKwkJCSAqIGlmIGRlbHRhX2RlbHRhIGlzIHRvbyBsYXJnZSwgYXNzdW1lIHRpbWUgY29ycmVjdGlvbgorCQkJICogaGFzIG9jY3VycmVkIGFuZCBzZXQgb2xkX2RlbHRhIHRvIHRoZSBjdXJyZW50IGRlbHRhLgorCQkJICovCisJCQlvbGRfZGVsdGEgPSBkZWx0YTsKKwkJfSBlbHNlIHsKKwkJCS8qIE90aGVyd2lzZSB0cnkgdG8gYWRqdXN0IG9sZF9zeXN0ZW0gdG8gY29tcGVuc2F0ZSAqLworCQkJdGltZWtlZXBpbmdfc3VzcGVuZF90aW1lID0KKwkJCQl0aW1lc3BlYzY0X2FkZCh0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUsIGRlbHRhX2RlbHRhKTsKKwkJfQogCX0KIAogCXRpbWVrZWVwaW5nX3VwZGF0ZSh0aywgVEtfTUlSUk9SKTsKQEAgLTEzMjcsNyArMTQ4Myw3IEBACiAJd3JpdGVfc2VxY291bnRfZW5kKCZ0a19jb3JlLnNlcSk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVrZWVwZXJfbG9jaywgZmxhZ3MpOwogCi0JY2xvY2tldmVudHNfbm90aWZ5KENMT0NLX0VWVF9OT1RJRllfU1VTUEVORCwgTlVMTCk7CisJdGlja19zdXNwZW5kKCk7CiAJY2xvY2tzb3VyY2Vfc3VzcGVuZCgpOwogCWNsb2NrZXZlbnRzX3N1c3BlbmQoKTsKIApAQCAtMTQxNiwxNSArMTU3MiwxNSBAQAogCSAqCiAJICogWFhYIC0gVE9ETzogRG9jIG50cF9lcnJvciBjYWxjdWxhdGlvbi4KIAkgKi8KLQlpZiAoKG11bHRfYWRqID4gMCkgJiYgKHRrLT50a3IubXVsdCArIG11bHRfYWRqIDwgbXVsdF9hZGopKSB7CisJaWYgKChtdWx0X2FkaiA+IDApICYmICh0ay0+dGtyX21vbm8ubXVsdCArIG11bHRfYWRqIDwgbXVsdF9hZGopKSB7CiAJCS8qIE5UUCBhZGp1c3RtZW50IGNhdXNlZCBjbG9ja3NvdXJjZSBtdWx0IG92ZXJmbG93ICovCiAJCVdBUk5fT05fT05DRSgxKTsKIAkJcmV0dXJuOwogCX0KIAotCXRrLT50a3IubXVsdCArPSBtdWx0X2FkajsKKwl0ay0+dGtyX21vbm8ubXVsdCArPSBtdWx0X2FkajsKIAl0ay0+eHRpbWVfaW50ZXJ2YWwgKz0gaW50ZXJ2YWw7Ci0JdGstPnRrci54dGltZV9uc2VjIC09IG9mZnNldDsKKwl0ay0+dGtyX21vbm8ueHRpbWVfbnNlYyAtPSBvZmZzZXQ7CiAJdGstPm50cF9lcnJvciAtPSAoaW50ZXJ2YWwgLSBvZmZzZXQpIDw8IHRrLT5udHBfZXJyb3Jfc2hpZnQ7CiB9CiAKQEAgLTE0ODYsMTMgKzE2NDIsMTMgQEAKIAkJdGstPm50cF9lcnJfbXVsdCA9IDA7CiAJfQogCi0JaWYgKHVubGlrZWx5KHRrLT50a3IuY2xvY2stPm1heGFkaiAmJgotCQkoYWJzKHRrLT50a3IubXVsdCAtIHRrLT50a3IuY2xvY2stPm11bHQpCi0JCQk+IHRrLT50a3IuY2xvY2stPm1heGFkaikpKSB7CisJaWYgKHVubGlrZWx5KHRrLT50a3JfbW9uby5jbG9jay0+bWF4YWRqICYmCisJCShhYnModGstPnRrcl9tb25vLm11bHQgLSB0ay0+dGtyX21vbm8uY2xvY2stPm11bHQpCisJCQk+IHRrLT50a3JfbW9uby5jbG9jay0+bWF4YWRqKSkpIHsKIAkJcHJpbnRrX29uY2UoS0VSTl9XQVJOSU5HCiAJCQkiQWRqdXN0aW5nICVzIG1vcmUgdGhhbiAxMSUlICglbGQgdnMgJWxkKVxuIiwKLQkJCXRrLT50a3IuY2xvY2stPm5hbWUsIChsb25nKXRrLT50a3IubXVsdCwKLQkJCShsb25nKXRrLT50a3IuY2xvY2stPm11bHQgKyB0ay0+dGtyLmNsb2NrLT5tYXhhZGopOworCQkJdGstPnRrcl9tb25vLmNsb2NrLT5uYW1lLCAobG9uZyl0ay0+dGtyX21vbm8ubXVsdCwKKwkJCShsb25nKXRrLT50a3JfbW9uby5jbG9jay0+bXVsdCArIHRrLT50a3JfbW9uby5jbG9jay0+bWF4YWRqKTsKIAl9CiAKIAkvKgpAQCAtMTUwOSw5ICsxNjY1LDkgQEAKIAkgKiBXZSdsbCBjb3JyZWN0IHRoaXMgZXJyb3IgbmV4dCB0aW1lIHRocm91Z2ggdGhpcyBmdW5jdGlvbiwgd2hlbgogCSAqIHh0aW1lX25zZWMgaXMgbm90IGFzIHNtYWxsLgogCSAqLwotCWlmICh1bmxpa2VseSgoczY0KXRrLT50a3IueHRpbWVfbnNlYyA8IDApKSB7Ci0JCXM2NCBuZWcgPSAtKHM2NCl0ay0+dGtyLnh0aW1lX25zZWM7Ci0JCXRrLT50a3IueHRpbWVfbnNlYyA9IDA7CisJaWYgKHVubGlrZWx5KChzNjQpdGstPnRrcl9tb25vLnh0aW1lX25zZWMgPCAwKSkgeworCQlzNjQgbmVnID0gLShzNjQpdGstPnRrcl9tb25vLnh0aW1lX25zZWM7CisJCXRrLT50a3JfbW9uby54dGltZV9uc2VjID0gMDsKIAkJdGstPm50cF9lcnJvciArPSBuZWcgPDwgdGstPm50cF9lcnJvcl9zaGlmdDsKIAl9CiB9CkBAIC0xNTI2LDEzICsxNjgyLDEzIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFjY3VtdWxhdGVfbnNlY3NfdG9fc2VjcyhzdHJ1Y3QgdGltZWtlZXBlciAqdGspCiB7Ci0JdTY0IG5zZWNwcyA9ICh1NjQpTlNFQ19QRVJfU0VDIDw8IHRrLT50a3Iuc2hpZnQ7CisJdTY0IG5zZWNwcyA9ICh1NjQpTlNFQ19QRVJfU0VDIDw8IHRrLT50a3JfbW9uby5zaGlmdDsKIAl1bnNpZ25lZCBpbnQgY2xvY2tfc2V0ID0gMDsKIAotCXdoaWxlICh0ay0+dGtyLnh0aW1lX25zZWMgPj0gbnNlY3BzKSB7CisJd2hpbGUgKHRrLT50a3JfbW9uby54dGltZV9uc2VjID49IG5zZWNwcykgewogCQlpbnQgbGVhcDsKIAotCQl0ay0+dGtyLnh0aW1lX25zZWMgLT0gbnNlY3BzOworCQl0ay0+dGtyX21vbm8ueHRpbWVfbnNlYyAtPSBuc2VjcHM7CiAJCXRrLT54dGltZV9zZWMrKzsKIAogCQkvKiBGaWd1cmUgb3V0IGlmIGl0cyBhIGxlYXAgc2VjIGFuZCBhcHBseSBpZiBuZWVkZWQgKi8KQEAgLTE1NzcsOSArMTczMywxMCBAQAogCiAJLyogQWNjdW11bGF0ZSBvbmUgc2hpZnRlZCBpbnRlcnZhbCAqLwogCW9mZnNldCAtPSBpbnRlcnZhbDsKLQl0ay0+dGtyLmN5Y2xlX2xhc3QgKz0gaW50ZXJ2YWw7CisJdGstPnRrcl9tb25vLmN5Y2xlX2xhc3QgKz0gaW50ZXJ2YWw7CisJdGstPnRrcl9yYXcuY3ljbGVfbGFzdCAgKz0gaW50ZXJ2YWw7CiAKLQl0ay0+dGtyLnh0aW1lX25zZWMgKz0gdGstPnh0aW1lX2ludGVydmFsIDw8IHNoaWZ0OworCXRrLT50a3JfbW9uby54dGltZV9uc2VjICs9IHRrLT54dGltZV9pbnRlcnZhbCA8PCBzaGlmdDsKIAkqY2xvY2tfc2V0IHw9IGFjY3VtdWxhdGVfbnNlY3NfdG9fc2Vjcyh0ayk7CiAKIAkvKiBBY2N1bXVsYXRlIHJhdyB0aW1lICovCkBAIC0xNjIyLDE0ICsxNzc5LDE3IEBACiAjaWZkZWYgQ09ORklHX0FSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCiAJb2Zmc2V0ID0gcmVhbF90ay0+Y3ljbGVfaW50ZXJ2YWw7CiAjZWxzZQotCW9mZnNldCA9IGNsb2Nrc291cmNlX2RlbHRhKHRrLT50a3IucmVhZCh0ay0+dGtyLmNsb2NrKSwKLQkJCQkgICB0ay0+dGtyLmN5Y2xlX2xhc3QsIHRrLT50a3IubWFzayk7CisJb2Zmc2V0ID0gY2xvY2tzb3VyY2VfZGVsdGEodGstPnRrcl9tb25vLnJlYWQodGstPnRrcl9tb25vLmNsb2NrKSwKKwkJCQkgICB0ay0+dGtyX21vbm8uY3ljbGVfbGFzdCwgdGstPnRrcl9tb25vLm1hc2spOwogI2VuZGlmCiAKIAkvKiBDaGVjayBpZiB0aGVyZSdzIHJlYWxseSBub3RoaW5nIHRvIGRvICovCiAJaWYgKG9mZnNldCA8IHJlYWxfdGstPmN5Y2xlX2ludGVydmFsKQogCQlnb3RvIG91dDsKIAorCS8qIERvIHNvbWUgYWRkaXRpb25hbCBzYW5pdHkgY2hlY2tpbmcgKi8KKwl0aW1la2VlcGluZ19jaGVja191cGRhdGUocmVhbF90aywgb2Zmc2V0KTsKKwogCS8qCiAJICogV2l0aCBOT19IWiB3ZSBtYXkgaGF2ZSB0byBhY2N1bXVsYXRlIG1hbnkgY3ljbGVfaW50ZXJ2YWxzCiAJICogKHRoaW5rICJ0aWNrcyIpIHdvcnRoIG9mIHRpbWUgYXQgb25jZS4gVG8gZG8gdGhpcyBlZmZpY2llbnRseSwKQEAgLTE3ODQsOCArMTk0NCw4IEBACiAJZG8gewogCQlzZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZ0a19jb3JlLnNlcSk7CiAKLQkJYmFzZSA9IHRrLT50a3IuYmFzZV9tb25vOwotCQluc2VjcyA9IHRrLT50a3IueHRpbWVfbnNlYyA+PiB0ay0+dGtyLnNoaWZ0OworCQliYXNlID0gdGstPnRrcl9tb25vLmJhc2U7CisJCW5zZWNzID0gdGstPnRrcl9tb25vLnh0aW1lX25zZWMgPj4gdGstPnRrcl9tb25vLnNoaWZ0OwogCiAJCSpvZmZzX3JlYWwgPSB0ay0+b2Zmc19yZWFsOwogCQkqb2Zmc19ib290ID0gdGstPm9mZnNfYm9vdDsKQEAgLTE4MTYsOCArMTk3Niw4IEBACiAJZG8gewogCQlzZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZ0a19jb3JlLnNlcSk7CiAKLQkJYmFzZSA9IHRrLT50a3IuYmFzZV9tb25vOwotCQluc2VjcyA9IHRpbWVrZWVwaW5nX2dldF9ucygmdGstPnRrcik7CisJCWJhc2UgPSB0ay0+dGtyX21vbm8uYmFzZTsKKwkJbnNlY3MgPSB0aW1la2VlcGluZ19nZXRfbnMoJnRrLT50a3JfbW9ubyk7CiAKIAkJKm9mZnNfcmVhbCA9IHRrLT5vZmZzX3JlYWw7CiAJCSpvZmZzX2Jvb3QgPSB0ay0+b2Zmc19ib290OwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuaCBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmgKaW5kZXggMWQ5MTQxNi4uZWFkODc5NCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuaAorKysgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5oCkBAIC0xOSw0ICsxOSwxMSBAQAogZXh0ZXJuIGludCB0aW1la2VlcGluZ19zdXNwZW5kKHZvaWQpOwogZXh0ZXJuIHZvaWQgdGltZWtlZXBpbmdfcmVzdW1lKHZvaWQpOwogCitleHRlcm4gdm9pZCBkb190aW1lcih1bnNpZ25lZCBsb25nIHRpY2tzKTsKK2V4dGVybiB2b2lkIHVwZGF0ZV93YWxsX3RpbWUodm9pZCk7CisKK2V4dGVybiBzZXFsb2NrX3QgamlmZmllc19sb2NrOworCisjZGVmaW5lIENTX05BTUVfTEVOCTMyCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZXIuYyBiL2tlcm5lbC90aW1lL3RpbWVyLmMKaW5kZXggMmQzZjVjNS4uMmVjZTNhYSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZXIuYworKysgYi9rZXJuZWwvdGltZS90aW1lci5jCkBAIC05MCw4ICs5MCwxOCBAQAogCXN0cnVjdCB0dmVjIHR2NTsKIH0gX19fX2NhY2hlbGluZV9hbGlnbmVkOwogCisvKgorICogX19USU1FUl9JTklUSUFMSVpFUigpIG5lZWRzIHRvIHNldCAtPmJhc2UgdG8gYSB2YWxpZCBwb2ludGVyIChiZWNhdXNlIHdlJ3ZlCisgKiBtYWRlIE5VTEwgc3BlY2lhbCwgaGludDogbG9ja190aW1lcl9iYXNlKCkpIGFuZCB3ZSBjYW5ub3QgZ2V0IGEgY29tcGlsZSB0aW1lCisgKiBwb2ludGVyIHRvIHBlci1jcHUgZW50cmllcyBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hlcmUgd2UnbGwgbWFwIHRoZSBzZWN0aW9uLAorICogZXZlbiBmb3IgdGhlIGJvb3QgY3B1LgorICoKKyAqIEFuZCBzbyB3ZSB1c2UgYm9vdF90dmVjX2Jhc2VzIGZvciBib290IENQVSBhbmQgcGVyLWNwdSBfX3R2ZWNfYmFzZXMgZm9yIHRoZQorICogcmVzdCBvZiB0aGVtLgorICovCiBzdHJ1Y3QgdHZlY19iYXNlIGJvb3RfdHZlY19iYXNlczsKIEVYUE9SVF9TWU1CT0woYm9vdF90dmVjX2Jhc2VzKTsKKwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0dmVjX2Jhc2UgKiwgdHZlY19iYXNlcykgPSAmYm9vdF90dmVjX2Jhc2VzOwogCiAvKiBGdW5jdGlvbnMgYmVsb3cgaGVscCB1cyBtYW5hZ2UgJ2RlZmVycmFibGUnIGZsYWcgKi8KQEAgLTEwMjcsNiArMTAzNyw4IEBACiBFWFBPUlRfU1lNQk9MKHRyeV90b19kZWxfdGltZXJfc3luYyk7CiAKICNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHR2ZWNfYmFzZSwgX190dmVjX2Jhc2VzKTsKKwogLyoqCiAgKiBkZWxfdGltZXJfc3luYyAtIGRlYWN0aXZhdGUgYSB0aW1lciBhbmQgd2FpdCBmb3IgdGhlIGhhbmRsZXIgdG8gZmluaXNoLgogICogQHRpbWVyOiB0aGUgdGltZXIgdG8gYmUgZGVhY3RpdmF0ZWQKQEAgLTE1MzIsNjQgKzE1NDQsNiBAQAogfQogRVhQT1JUX1NZTUJPTChzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZSk7CiAKLXN0YXRpYyBpbnQgaW5pdF90aW1lcnNfY3B1KGludCBjcHUpCi17Ci0JaW50IGo7Ci0Jc3RydWN0IHR2ZWNfYmFzZSAqYmFzZTsKLQlzdGF0aWMgY2hhciB0dmVjX2Jhc2VfZG9uZVtOUl9DUFVTXTsKLQotCWlmICghdHZlY19iYXNlX2RvbmVbY3B1XSkgewotCQlzdGF0aWMgY2hhciBib290X2RvbmU7Ci0KLQkJaWYgKGJvb3RfZG9uZSkgewotCQkJLyoKLQkJCSAqIFRoZSBBUHMgdXNlIHRoaXMgcGF0aCBsYXRlciBpbiBib290Ci0JCQkgKi8KLQkJCWJhc2UgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpiYXNlKSwgR0ZQX0tFUk5FTCwKLQkJCQkJICAgIGNwdV90b19ub2RlKGNwdSkpOwotCQkJaWYgKCFiYXNlKQotCQkJCXJldHVybiAtRU5PTUVNOwotCi0JCQkvKiBNYWtlIHN1cmUgdHZlY19iYXNlIGhhcyBUSU1FUl9GTEFHX01BU0sgYml0cyBmcmVlICovCi0JCQlpZiAoV0FSTl9PTihiYXNlICE9IHRiYXNlX2dldF9iYXNlKGJhc2UpKSkgewotCQkJCWtmcmVlKGJhc2UpOwotCQkJCXJldHVybiAtRU5PTUVNOwotCQkJfQotCQkJcGVyX2NwdSh0dmVjX2Jhc2VzLCBjcHUpID0gYmFzZTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBUaGlzIGlzIGZvciB0aGUgYm9vdCBDUFUgLSB3ZSB1c2UgY29tcGlsZS10aW1lCi0JCQkgKiBzdGF0aWMgaW5pdGlhbGlzYXRpb24gYmVjYXVzZSBwZXItY3B1IG1lbW9yeSBpc24ndAotCQkJICogcmVhZHkgeWV0IGFuZCBiZWNhdXNlIHRoZSBtZW1vcnkgYWxsb2NhdG9ycyBhcmUgbm90Ci0JCQkgKiBpbml0aWFsaXNlZCBlaXRoZXIuCi0JCQkgKi8KLQkJCWJvb3RfZG9uZSA9IDE7Ci0JCQliYXNlID0gJmJvb3RfdHZlY19iYXNlczsKLQkJfQotCQlzcGluX2xvY2tfaW5pdCgmYmFzZS0+bG9jayk7Ci0JCXR2ZWNfYmFzZV9kb25lW2NwdV0gPSAxOwotCQliYXNlLT5jcHUgPSBjcHU7Ci0JfSBlbHNlIHsKLQkJYmFzZSA9IHBlcl9jcHUodHZlY19iYXNlcywgY3B1KTsKLQl9Ci0KLQotCWZvciAoaiA9IDA7IGogPCBUVk5fU0laRTsgaisrKSB7Ci0JCUlOSVRfTElTVF9IRUFEKGJhc2UtPnR2NS52ZWMgKyBqKTsKLQkJSU5JVF9MSVNUX0hFQUQoYmFzZS0+dHY0LnZlYyArIGopOwotCQlJTklUX0xJU1RfSEVBRChiYXNlLT50djMudmVjICsgaik7Ci0JCUlOSVRfTElTVF9IRUFEKGJhc2UtPnR2Mi52ZWMgKyBqKTsKLQl9Ci0JZm9yIChqID0gMDsgaiA8IFRWUl9TSVpFOyBqKyspCi0JCUlOSVRfTElTVF9IRUFEKGJhc2UtPnR2MS52ZWMgKyBqKTsKLQotCWJhc2UtPnRpbWVyX2ppZmZpZXMgPSBqaWZmaWVzOwotCWJhc2UtPm5leHRfdGltZXIgPSBiYXNlLT50aW1lcl9qaWZmaWVzOwotCWJhc2UtPmFjdGl2ZV90aW1lcnMgPSAwOwotCWJhc2UtPmFsbF90aW1lcnMgPSAwOwotCXJldHVybiAwOwotfQotCiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCiBzdGF0aWMgdm9pZCBtaWdyYXRlX3RpbWVyX2xpc3Qoc3RydWN0IHR2ZWNfYmFzZSAqbmV3X2Jhc2UsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CkBAIC0xNjMxLDU1ICsxNTg1LDg2IEBACiAJCW1pZ3JhdGVfdGltZXJfbGlzdChuZXdfYmFzZSwgb2xkX2Jhc2UtPnR2NS52ZWMgKyBpKTsKIAl9CiAKKwlvbGRfYmFzZS0+YWN0aXZlX3RpbWVycyA9IDA7CisJb2xkX2Jhc2UtPmFsbF90aW1lcnMgPSAwOworCiAJc3Bpbl91bmxvY2soJm9sZF9iYXNlLT5sb2NrKTsKIAlzcGluX3VubG9ja19pcnEoJm5ld19iYXNlLT5sb2NrKTsKIAlwdXRfY3B1X3Zhcih0dmVjX2Jhc2VzKTsKIH0KLSNlbmRpZiAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KIAogc3RhdGljIGludCB0aW1lcl9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKIAkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKLQlsb25nIGNwdSA9IChsb25nKWhjcHU7Ci0JaW50IGVycjsKLQotCXN3aXRjaChhY3Rpb24pIHsKLQljYXNlIENQVV9VUF9QUkVQQVJFOgotCWNhc2UgQ1BVX1VQX1BSRVBBUkVfRlJPWkVOOgotCQllcnIgPSBpbml0X3RpbWVyc19jcHUoY3B1KTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhlcnIpOwotCQlicmVhazsKLSNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX0RFQUQ6CiAJY2FzZSBDUFVfREVBRF9GUk9aRU46Ci0JCW1pZ3JhdGVfdGltZXJzKGNwdSk7CisJCW1pZ3JhdGVfdGltZXJzKChsb25nKWhjcHUpOwogCQlicmVhazsKLSNlbmRpZgogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KKwogCXJldHVybiBOT1RJRllfT0s7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGltZXJzX25iID0gewotCS5ub3RpZmllcl9jYWxsCT0gdGltZXJfY3B1X25vdGlmeSwKLX07CitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfcmVnaXN0ZXJfY3B1X25vdGlmaWVyKHZvaWQpCit7CisJY3B1X25vdGlmaWVyKHRpbWVyX2NwdV9ub3RpZnksIDApOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9yZWdpc3Rlcl9jcHVfbm90aWZpZXIodm9pZCkgeyB9CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCiAKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X3RpbWVyX2NwdShzdHJ1Y3QgdHZlY19iYXNlICpiYXNlLCBpbnQgY3B1KQoreworCWludCBqOworCisJQlVHX09OKGJhc2UgIT0gdGJhc2VfZ2V0X2Jhc2UoYmFzZSkpOworCisJYmFzZS0+Y3B1ID0gY3B1OworCXBlcl9jcHUodHZlY19iYXNlcywgY3B1KSA9IGJhc2U7CisJc3Bpbl9sb2NrX2luaXQoJmJhc2UtPmxvY2spOworCisJZm9yIChqID0gMDsgaiA8IFRWTl9TSVpFOyBqKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoYmFzZS0+dHY1LnZlYyArIGopOworCQlJTklUX0xJU1RfSEVBRChiYXNlLT50djQudmVjICsgaik7CisJCUlOSVRfTElTVF9IRUFEKGJhc2UtPnR2My52ZWMgKyBqKTsKKwkJSU5JVF9MSVNUX0hFQUQoYmFzZS0+dHYyLnZlYyArIGopOworCX0KKwlmb3IgKGogPSAwOyBqIDwgVFZSX1NJWkU7IGorKykKKwkJSU5JVF9MSVNUX0hFQUQoYmFzZS0+dHYxLnZlYyArIGopOworCisJYmFzZS0+dGltZXJfamlmZmllcyA9IGppZmZpZXM7CisJYmFzZS0+bmV4dF90aW1lciA9IGJhc2UtPnRpbWVyX2ppZmZpZXM7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X3RpbWVyX2NwdXModm9pZCkKK3sKKwlzdHJ1Y3QgdHZlY19iYXNlICpiYXNlOworCWludCBsb2NhbF9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJaWYgKGNwdSA9PSBsb2NhbF9jcHUpCisJCQliYXNlID0gJmJvb3RfdHZlY19iYXNlczsKKyNpZmRlZiBDT05GSUdfU01QCisJCWVsc2UKKwkJCWJhc2UgPSBwZXJfY3B1X3B0cigmX190dmVjX2Jhc2VzLCBjcHUpOworI2VuZGlmCisKKwkJaW5pdF90aW1lcl9jcHUoYmFzZSwgY3B1KTsKKwl9Cit9CiAKIHZvaWQgX19pbml0IGluaXRfdGltZXJzKHZvaWQpCiB7Ci0JaW50IGVycjsKLQogCS8qIGVuc3VyZSB0aGVyZSBhcmUgZW5vdWdoIGxvdyBiaXRzIGZvciBmbGFncyBpbiB0aW1lci0+YmFzZSBwb2ludGVyICovCiAJQlVJTERfQlVHX09OKF9fYWxpZ25vZl9fKHN0cnVjdCB0dmVjX2Jhc2UpICYgVElNRVJfRkxBR19NQVNLKTsKIAotCWVyciA9IHRpbWVyX2NwdV9ub3RpZnkoJnRpbWVyc19uYiwgKHVuc2lnbmVkIGxvbmcpQ1BVX1VQX1BSRVBBUkUsCi0JCQkgICAgICAgKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwotCUJVR19PTihlcnIgIT0gTk9USUZZX09LKTsKLQorCWluaXRfdGltZXJfY3B1cygpOwogCWluaXRfdGltZXJfc3RhdHMoKTsKLQlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnRpbWVyc19uYik7CisJdGltZXJfcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCk7CiAJb3Blbl9zb2Z0aXJxKFRJTUVSX1NPRlRJUlEsIHJ1bl90aW1lcl9zb2Z0aXJxKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jIGIva2VybmVsL3RpbWUvdGltZXJfbGlzdC5jCmluZGV4IDYxZWQ4NjIuLmU4NzhjMmUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYworKysgYi9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKQEAgLTE2LDEwICsxNiwxMCBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgotI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKKyNpbmNsdWRlICJ0aWNrLWludGVybmFsLmgiCiAKIHN0cnVjdCB0aW1lcl9saXN0X2l0ZXIgewogCWludCBjcHU7CkBAIC0yMjgsOSArMjI4LDM1IEBACiAJcHJpbnRfbmFtZV9vZmZzZXQobSwgZGV2LT5zZXRfbmV4dF9ldmVudCk7CiAJU0VRX3ByaW50ZihtLCAiXG4iKTsKIAotCVNFUV9wcmludGYobSwgIiBzZXRfbW9kZTogICAgICAgIik7Ci0JcHJpbnRfbmFtZV9vZmZzZXQobSwgZGV2LT5zZXRfbW9kZSk7Ci0JU0VRX3ByaW50ZihtLCAiXG4iKTsKKwlpZiAoZGV2LT5zZXRfbW9kZSkgeworCQlTRVFfcHJpbnRmKG0sICIgc2V0X21vZGU6ICAgICAgICIpOworCQlwcmludF9uYW1lX29mZnNldChtLCBkZXYtPnNldF9tb2RlKTsKKwkJU0VRX3ByaW50ZihtLCAiXG4iKTsKKwl9IGVsc2UgeworCQlpZiAoZGV2LT5zZXRfc3RhdGVfc2h1dGRvd24pIHsKKwkJCVNFUV9wcmludGYobSwgIiBzaHV0ZG93bjogIik7CisJCQlwcmludF9uYW1lX29mZnNldChtLCBkZXYtPnNldF9zdGF0ZV9zaHV0ZG93bik7CisJCQlTRVFfcHJpbnRmKG0sICJcbiIpOworCQl9CisKKwkJaWYgKGRldi0+c2V0X3N0YXRlX3BlcmlvZGljKSB7CisJCQlTRVFfcHJpbnRmKG0sICIgcGVyaW9kaWM6ICIpOworCQkJcHJpbnRfbmFtZV9vZmZzZXQobSwgZGV2LT5zZXRfc3RhdGVfcGVyaW9kaWMpOworCQkJU0VRX3ByaW50ZihtLCAiXG4iKTsKKwkJfQorCisJCWlmIChkZXYtPnNldF9zdGF0ZV9vbmVzaG90KSB7CisJCQlTRVFfcHJpbnRmKG0sICIgb25lc2hvdDogICIpOworCQkJcHJpbnRfbmFtZV9vZmZzZXQobSwgZGV2LT5zZXRfc3RhdGVfb25lc2hvdCk7CisJCQlTRVFfcHJpbnRmKG0sICJcbiIpOworCQl9CisKKwkJaWYgKGRldi0+dGlja19yZXN1bWUpIHsKKwkJCVNFUV9wcmludGYobSwgIiByZXN1bWU6ICAgIik7CisJCQlwcmludF9uYW1lX29mZnNldChtLCBkZXYtPnRpY2tfcmVzdW1lKTsKKwkJCVNFUV9wcmludGYobSwgIlxuIik7CisJCX0KKwl9CiAKIAlTRVFfcHJpbnRmKG0sICIgZXZlbnRfaGFuZGxlcjogICIpOwogCXByaW50X25hbWVfb2Zmc2V0KG0sIGRldi0+ZXZlbnRfaGFuZGxlcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvS2NvbmZpZyBiL2tlcm5lbC90cmFjZS9LY29uZmlnCmluZGV4IGE1ZGEwOWMuLjNiOWE0OGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9LY29uZmlnCisrKyBiL2tlcm5lbC90cmFjZS9LY29uZmlnCkBAIC00MzIsNiArNDMyLDE0IEBACiAJICBUaGlzIG9wdGlvbiBpcyByZXF1aXJlZCBpZiB5b3UgcGxhbiB0byB1c2UgcGVyZi1wcm9iZSBzdWJjb21tYW5kCiAJICBvZiBwZXJmIHRvb2xzIG9uIHVzZXIgc3BhY2UgYXBwbGljYXRpb25zLgogCitjb25maWcgQlBGX0VWRU5UUworCWRlcGVuZHMgb24gQlBGX1NZU0NBTEwKKwlkZXBlbmRzIG9uIEtQUk9CRV9FVkVOVAorCWJvb2wKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBhdHRhY2ggQlBGIHByb2dyYW1zIHRvIGtwcm9iZSBldmVudHMuCisKIGNvbmZpZyBQUk9CRV9FVkVOVFMKIAlkZWZfYm9vbCBuCiAKQEAgLTU5OSw2ICs2MDcsMzQgQEAKIAogCSBJZiB1bnN1cmUsIHNheSBOCiAKK2NvbmZpZyBUUkFDRV9FTlVNX01BUF9GSUxFCisgICAgICAgYm9vbCAiU2hvdyBlbnVtIG1hcHBpbmdzIGZvciB0cmFjZSBldmVudHMiCisgICAgICAgZGVwZW5kcyBvbiBUUkFDSU5HCisgICAgICAgaGVscAorICAgICAgICBUaGUgInByaW50IGZtdCIgb2YgdGhlIHRyYWNlIGV2ZW50cyB3aWxsIHNob3cgdGhlIGVudW0gbmFtZXMgaW5zdGVhZAorCW9mIHRoZWlyIHZhbHVlcy4gVGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgZm9yIHVzZXIgc3BhY2UgdG9vbHMgdGhhdAorCXVzZSB0aGlzIHN0cmluZyB0byBwYXJzZSB0aGUgcmF3IGRhdGEgYXMgdXNlciBzcGFjZSBkb2VzIG5vdCBrbm93CisJaG93IHRvIGNvbnZlcnQgdGhlIHN0cmluZyB0byBpdHMgdmFsdWUuCisKKwlUbyBmaXggdGhpcywgdGhlcmUncyBhIHNwZWNpYWwgbWFjcm8gaW4gdGhlIGtlcm5lbCB0aGF0IGNhbiBiZSB1c2VkCisJdG8gY29udmVydCB0aGUgZW51bSBpbnRvIGl0cyB2YWx1ZS4gSWYgdGhpcyBtYWNybyBpcyB1c2VkLCB0aGVuIHRoZQorCXByaW50IGZtdCBzdHJpbmdzIHdpbGwgaGF2ZSB0aGUgZW51bXMgY29udmVydGVkIHRvIHRoZWlyIHZhbHVlcy4KKworCUlmIHNvbWV0aGluZyBkb2VzIG5vdCBnZXQgY29udmVydGVkIHByb3Blcmx5LCB0aGlzIG9wdGlvbiBjYW4gYmUKKwl1c2VkIHRvIHNob3cgd2hhdCBlbnVtcyB0aGUga2VybmVsIHRyaWVkIHRvIGNvbnZlcnQuCisKKwlUaGlzIG9wdGlvbiBpcyBmb3IgZGVidWdnaW5nIHRoZSBlbnVtIGNvbnZlcnNpb25zLiBBIGZpbGUgaXMgY3JlYXRlZAorCWluIHRoZSB0cmFjaW5nIGRpcmVjdG9yeSBjYWxsZWQgImVudW1fbWFwIiB0aGF0IHdpbGwgc2hvdyB0aGUgZW51bQorCW5hbWVzIG1hdGNoZWQgd2l0aCB0aGVpciB2YWx1ZXMgYW5kIHdoYXQgdHJhY2UgZXZlbnQgc3lzdGVtIHRoZXkKKwliZWxvbmcgdG9vLgorCisJTm9ybWFsbHksIHRoZSBtYXBwaW5nIG9mIHRoZSBzdHJpbmdzIHRvIHZhbHVlcyB3aWxsIGJlIGZyZWVkIGFmdGVyCisJYm9vdCB1cCBvciBtb2R1bGUgbG9hZC4gV2l0aCB0aGlzIG9wdGlvbiwgdGhleSB3aWxsIG5vdCBiZSBmcmVlZCwgYXMKKwl0aGV5IGFyZSBuZWVkZWQgZm9yIHRoZSAiZW51bV9tYXAiIGZpbGUuIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwKKwlpbmNyZWFzZSB0aGUgbWVtb3J5IGZvb3RwcmludCBvZiB0aGUgcnVubmluZyBrZXJuZWwuCisKKwlJZiB1bnN1cmUsIHNheSBOCisKIGVuZGlmICMgRlRSQUNFCiAKIGVuZGlmICMgVFJBQ0lOR19TVVBQT1JUCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvTWFrZWZpbGUgYi9rZXJuZWwvdHJhY2UvTWFrZWZpbGUKaW5kZXggOThmMjY1OC4uOWIxMDQ0ZSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL01ha2VmaWxlCisrKyBiL2tlcm5lbC90cmFjZS9NYWtlZmlsZQpAQCAtNTMsNiArNTMsNyBAQAogZW5kaWYKIG9iai0kKENPTkZJR19FVkVOVF9UUkFDSU5HKSArPSB0cmFjZV9ldmVudHNfZmlsdGVyLm8KIG9iai0kKENPTkZJR19FVkVOVF9UUkFDSU5HKSArPSB0cmFjZV9ldmVudHNfdHJpZ2dlci5vCitvYmotJChDT05GSUdfQlBGX0VWRU5UUykgKz0gYnBmX3RyYWNlLm8KIG9iai0kKENPTkZJR19LUFJPQkVfRVZFTlQpICs9IHRyYWNlX2twcm9iZS5vCiBvYmotJChDT05GSUdfVFJBQ0VQT0lOVFMpICs9IHBvd2VyLXRyYWNlcy5vCiBpZmVxICgkKENPTkZJR19QTSkseSkKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9icGZfdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9icGZfdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDU2Y2U1Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RyYWNlL2JwZl90cmFjZS5jCkBAIC0wLDAgKzEsMjIyIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxNSBQTFVNZ3JpZCwgaHR0cDovL3BsdW1ncmlkLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlICJ0cmFjZS5oIgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBicGZfcHJvZ19hY3RpdmUpOworCisvKioKKyAqIHRyYWNlX2NhbGxfYnBmIC0gaW52b2tlIEJQRiBwcm9ncmFtCisgKiBAcHJvZzogQlBGIHByb2dyYW0KKyAqIEBjdHg6IG9wYXF1ZSBjb250ZXh0IHBvaW50ZXIKKyAqCisgKiBrcHJvYmUgaGFuZGxlcnMgZXhlY3V0ZSBCUEYgcHJvZ3JhbXMgdmlhIHRoaXMgaGVscGVyLgorICogQ2FuIGJlIHVzZWQgZnJvbSBzdGF0aWMgdHJhY2Vwb2ludHMgaW4gdGhlIGZ1dHVyZS4KKyAqCisgKiBSZXR1cm46IEJQRiBwcm9ncmFtcyBhbHdheXMgcmV0dXJuIGFuIGludGVnZXIgd2hpY2ggaXMgaW50ZXJwcmV0ZWQgYnkKKyAqIGtwcm9iZSBoYW5kbGVyIGFzOgorICogMCAtIHJldHVybiBmcm9tIGtwcm9iZSAoZXZlbnQgaXMgZmlsdGVyZWQgb3V0KQorICogMSAtIHN0b3JlIGtwcm9iZSBldmVudCBpbnRvIHJpbmcgYnVmZmVyCisgKiBPdGhlciB2YWx1ZXMgYXJlIHJlc2VydmVkIGFuZCBjdXJyZW50bHkgYWxpYXMgdG8gMQorICovCit1bnNpZ25lZCBpbnQgdHJhY2VfY2FsbF9icGYoc3RydWN0IGJwZl9wcm9nICpwcm9nLCB2b2lkICpjdHgpCit7CisJdW5zaWduZWQgaW50IHJldDsKKworCWlmIChpbl9ubWkoKSkgLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKwkJcmV0dXJuIDE7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCWlmICh1bmxpa2VseShfX3RoaXNfY3B1X2luY19yZXR1cm4oYnBmX3Byb2dfYWN0aXZlKSAhPSAxKSkgeworCQkvKgorCQkgKiBzaW5jZSBzb21lIGJwZiBwcm9ncmFtIGlzIGFscmVhZHkgcnVubmluZyBvbiB0aGlzIGNwdSwKKwkJICogZG9uJ3QgY2FsbCBpbnRvIGFub3RoZXIgYnBmIHByb2dyYW0gKHNhbWUgb3IgZGlmZmVyZW50KQorCQkgKiBhbmQgZG9uJ3Qgc2VuZCBrcHJvYmUgZXZlbnQgaW50byByaW5nLWJ1ZmZlciwKKwkJICogc28gcmV0dXJuIHplcm8gaGVyZQorCQkgKi8KKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJcmN1X3JlYWRfbG9jaygpOworCXJldCA9IEJQRl9QUk9HX1JVTihwcm9nLCBjdHgpOworCXJjdV9yZWFkX3VubG9jaygpOworCisgb3V0OgorCV9fdGhpc19jcHVfZGVjKGJwZl9wcm9nX2FjdGl2ZSk7CisJcHJlZW1wdF9lbmFibGUoKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0cmFjZV9jYWxsX2JwZik7CisKK3N0YXRpYyB1NjQgYnBmX3Byb2JlX3JlYWQodTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCit7CisJdm9pZCAqZHN0ID0gKHZvaWQgKikgKGxvbmcpIHIxOworCWludCBzaXplID0gKGludCkgcjI7CisJdm9pZCAqdW5zYWZlX3B0ciA9ICh2b2lkICopIChsb25nKSByMzsKKworCXJldHVybiBwcm9iZV9rZXJuZWxfcmVhZChkc3QsIHVuc2FmZV9wdHIsIHNpemUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9wcm9iZV9yZWFkX3Byb3RvID0geworCS5mdW5jCQk9IGJwZl9wcm9iZV9yZWFkLAorCS5ncGxfb25seQk9IHRydWUsCisJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCisJLmFyZzFfdHlwZQk9IEFSR19QVFJfVE9fU1RBQ0ssCisJLmFyZzJfdHlwZQk9IEFSR19DT05TVF9TVEFDS19TSVpFLAorCS5hcmczX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCit9OworCitzdGF0aWMgdTY0IGJwZl9rdGltZV9nZXRfbnModTY0IHIxLCB1NjQgcjIsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCit7CisJLyogTk1JIHNhZmUgYWNjZXNzIHRvIGNsb2NrIG1vbm90b25pYyAqLworCXJldHVybiBrdGltZV9nZXRfbW9ub19mYXN0X25zKCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX2t0aW1lX2dldF9uc19wcm90byA9IHsKKwkuZnVuYwkJPSBicGZfa3RpbWVfZ2V0X25zLAorCS5ncGxfb25seQk9IHRydWUsCisJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCit9OworCisvKgorICogbGltaXRlZCB0cmFjZV9wcmludGsoKQorICogb25seSAlZCAldSAleCAlbGQgJWx1ICVseCAlbGxkICVsbHUgJWxseCAlcCBjb252ZXJzaW9uIHNwZWNpZmllcnMgYWxsb3dlZAorICovCitzdGF0aWMgdTY0IGJwZl90cmFjZV9wcmludGsodTY0IHIxLCB1NjQgZm10X3NpemUsIHU2NCByMywgdTY0IHI0LCB1NjQgcjUpCit7CisJY2hhciAqZm10ID0gKGNoYXIgKikgKGxvbmcpIHIxOworCWludCBtb2RbM10gPSB7fTsKKwlpbnQgZm10X2NudCA9IDA7CisJaW50IGk7CisKKwkvKgorCSAqIGJwZl9jaGVjaygpLT5jaGVja19mdW5jX2FyZygpLT5jaGVja19zdGFja19ib3VuZGFyeSgpCisJICogZ3VhcmFudGVlcyB0aGF0IGZtdCBwb2ludHMgdG8gYnBmIHByb2dyYW0gc3RhY2ssCisJICogZm10X3NpemUgYnl0ZXMgb2YgaXQgd2VyZSBpbml0aWFsaXplZCBhbmQgZm10X3NpemUgPiAwCisJICovCisJaWYgKGZtdFstLWZtdF9zaXplXSAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGNoZWNrIGZvcm1hdCBzdHJpbmcgZm9yIGFsbG93ZWQgc3BlY2lmaWVycyAqLworCWZvciAoaSA9IDA7IGkgPCBmbXRfc2l6ZTsgaSsrKSB7CisJCWlmICgoIWlzcHJpbnQoZm10W2ldKSAmJiAhaXNzcGFjZShmbXRbaV0pKSB8fCAhaXNhc2NpaShmbXRbaV0pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGZtdFtpXSAhPSAnJScpCisJCQljb250aW51ZTsKKworCQlpZiAoZm10X2NudCA+PSAzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogZm10W2ldICE9IDAgJiYgZm10W2xhc3RdID09IDAsIHNvIHdlIGNhbiBhY2Nlc3MgZm10W2kgKyAxXSAqLworCQlpKys7CisJCWlmIChmbXRbaV0gPT0gJ2wnKSB7CisJCQltb2RbZm10X2NudF0rKzsKKwkJCWkrKzsKKwkJfSBlbHNlIGlmIChmbXRbaV0gPT0gJ3AnKSB7CisJCQltb2RbZm10X2NudF0rKzsKKwkJCWkrKzsKKwkJCWlmICghaXNzcGFjZShmbXRbaV0pICYmICFpc3B1bmN0KGZtdFtpXSkgJiYgZm10W2ldICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlmbXRfY250Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChmbXRbaV0gPT0gJ2wnKSB7CisJCQltb2RbZm10X2NudF0rKzsKKwkJCWkrKzsKKwkJfQorCisJCWlmIChmbXRbaV0gIT0gJ2QnICYmIGZtdFtpXSAhPSAndScgJiYgZm10W2ldICE9ICd4JykKKwkJCXJldHVybiAtRUlOVkFMOworCQlmbXRfY250Kys7CisJfQorCisJcmV0dXJuIF9fdHJhY2VfcHJpbnRrKDEvKiBmYWtlIGlwIHdpbGwgbm90IGJlIHByaW50ZWQgKi8sIGZtdCwKKwkJCSAgICAgIG1vZFswXSA9PSAyID8gcjMgOiBtb2RbMF0gPT0gMSA/IChsb25nKSByMyA6ICh1MzIpIHIzLAorCQkJICAgICAgbW9kWzFdID09IDIgPyByNCA6IG1vZFsxXSA9PSAxID8gKGxvbmcpIHI0IDogKHUzMikgcjQsCisJCQkgICAgICBtb2RbMl0gPT0gMiA/IHI1IDogbW9kWzJdID09IDEgPyAobG9uZykgcjUgOiAodTMyKSByNSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gYnBmX3RyYWNlX3ByaW50a19wcm90byA9IHsKKwkuZnVuYwkJPSBicGZfdHJhY2VfcHJpbnRrLAorCS5ncGxfb25seQk9IHRydWUsCisJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCisJLmFyZzFfdHlwZQk9IEFSR19QVFJfVE9fU1RBQ0ssCisJLmFyZzJfdHlwZQk9IEFSR19DT05TVF9TVEFDS19TSVpFLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byAqa3Byb2JlX3Byb2dfZnVuY19wcm90byhlbnVtIGJwZl9mdW5jX2lkIGZ1bmNfaWQpCit7CisJc3dpdGNoIChmdW5jX2lkKSB7CisJY2FzZSBCUEZfRlVOQ19tYXBfbG9va3VwX2VsZW06CisJCXJldHVybiAmYnBmX21hcF9sb29rdXBfZWxlbV9wcm90bzsKKwljYXNlIEJQRl9GVU5DX21hcF91cGRhdGVfZWxlbToKKwkJcmV0dXJuICZicGZfbWFwX3VwZGF0ZV9lbGVtX3Byb3RvOworCWNhc2UgQlBGX0ZVTkNfbWFwX2RlbGV0ZV9lbGVtOgorCQlyZXR1cm4gJmJwZl9tYXBfZGVsZXRlX2VsZW1fcHJvdG87CisJY2FzZSBCUEZfRlVOQ19wcm9iZV9yZWFkOgorCQlyZXR1cm4gJmJwZl9wcm9iZV9yZWFkX3Byb3RvOworCWNhc2UgQlBGX0ZVTkNfa3RpbWVfZ2V0X25zOgorCQlyZXR1cm4gJmJwZl9rdGltZV9nZXRfbnNfcHJvdG87CisKKwljYXNlIEJQRl9GVU5DX3RyYWNlX3ByaW50azoKKwkJLyoKKwkJICogdGhpcyBwcm9ncmFtIG1pZ2h0IGJlIGNhbGxpbmcgYnBmX3RyYWNlX3ByaW50aywKKwkJICogc28gYWxsb2NhdGUgcGVyLWNwdSBwcmludGsgYnVmZmVycworCQkgKi8KKwkJdHJhY2VfcHJpbnRrX2luaXRfYnVmZmVycygpOworCisJCXJldHVybiAmYnBmX3RyYWNlX3ByaW50a19wcm90bzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTlVMTDsKKwl9Cit9CisKKy8qIGJwZitrcHJvYmUgcHJvZ3JhbXMgY2FuIGFjY2VzcyBmaWVsZHMgb2YgJ3N0cnVjdCBwdF9yZWdzJyAqLworc3RhdGljIGJvb2wga3Byb2JlX3Byb2dfaXNfdmFsaWRfYWNjZXNzKGludCBvZmYsIGludCBzaXplLCBlbnVtIGJwZl9hY2Nlc3NfdHlwZSB0eXBlKQoreworCS8qIGNoZWNrIGJvdW5kcyAqLworCWlmIChvZmYgPCAwIHx8IG9mZiA+PSBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBvbmx5IHJlYWQgaXMgYWxsb3dlZCAqLworCWlmICh0eXBlICE9IEJQRl9SRUFEKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBkaXNhbGxvdyBtaXNhbGlnbmVkIGFjY2VzcyAqLworCWlmIChvZmYgJSBzaXplICE9IDApCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMga3Byb2JlX3Byb2dfb3BzID0geworCS5nZXRfZnVuY19wcm90byAgPSBrcHJvYmVfcHJvZ19mdW5jX3Byb3RvLAorCS5pc192YWxpZF9hY2Nlc3MgPSBrcHJvYmVfcHJvZ19pc192YWxpZF9hY2Nlc3MsCit9OworCitzdGF0aWMgc3RydWN0IGJwZl9wcm9nX3R5cGVfbGlzdCBrcHJvYmVfdGwgPSB7CisJLm9wcwk9ICZrcHJvYmVfcHJvZ19vcHMsCisJLnR5cGUJPSBCUEZfUFJPR19UWVBFX0tQUk9CRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJlZ2lzdGVyX2twcm9iZV9wcm9nX29wcyh2b2lkKQoreworCWJwZl9yZWdpc3Rlcl9wcm9nX3R5cGUoJmtwcm9iZV90bCk7CisJcmV0dXJuIDA7Cit9CitsYXRlX2luaXRjYWxsKHJlZ2lzdGVyX2twcm9iZV9wcm9nX29wcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMgYi9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKaW5kZXggNGYyMjgwMi4uMDJiZWNlNCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL2Z0cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlZnMuaD4KICNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KQEAgLTI0OSw2ICsyNDksMTkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfZnVuY3Rpb25fZ3JhcGhfZnVuYyh2b2lkKSB7IH0KICNlbmRpZgogCisKK3N0YXRpYyBmdHJhY2VfZnVuY190IGZ0cmFjZV9vcHNfZ2V0X2xpc3RfZnVuYyhzdHJ1Y3QgZnRyYWNlX29wcyAqb3BzKQoreworCS8qCisJICogSWYgdGhpcyBpcyBhIGR5bmFtaWMgb3BzIG9yIHdlIGZvcmNlIGxpc3QgZnVuYywKKwkgKiB0aGVuIGl0IG5lZWRzIHRvIGNhbGwgdGhlIGxpc3QgYW55d2F5LgorCSAqLworCWlmIChvcHMtPmZsYWdzICYgRlRSQUNFX09QU19GTF9EWU5BTUlDIHx8IEZUUkFDRV9GT1JDRV9MSVNUX0ZVTkMpCisJCXJldHVybiBmdHJhY2Vfb3BzX2xpc3RfZnVuYzsKKworCXJldHVybiBmdHJhY2Vfb3BzX2dldF9mdW5jKG9wcyk7Cit9CisKIHN0YXRpYyB2b2lkIHVwZGF0ZV9mdHJhY2VfZnVuY3Rpb24odm9pZCkKIHsKIAlmdHJhY2VfZnVuY190IGZ1bmM7CkBAIC0yNzAsNyArMjgzLDcgQEAKIAkgKiB0aGVuIGhhdmUgdGhlIG1jb3VudCB0cmFtcG9saW5lIGNhbGwgdGhlIGZ1bmN0aW9uIGRpcmVjdGx5LgogCSAqLwogCX0gZWxzZSBpZiAoZnRyYWNlX29wc19saXN0LT5uZXh0ID09ICZmdHJhY2VfbGlzdF9lbmQpIHsKLQkJZnVuYyA9IGZ0cmFjZV9vcHNfZ2V0X2Z1bmMoZnRyYWNlX29wc19saXN0KTsKKwkJZnVuYyA9IGZ0cmFjZV9vcHNfZ2V0X2xpc3RfZnVuYyhmdHJhY2Vfb3BzX2xpc3QpOwogCiAJfSBlbHNlIHsKIAkJLyogSnVzdCB1c2UgdGhlIGRlZmF1bHQgZnRyYWNlX29wcyAqLwpAQCAtMTAwOCw3ICsxMDIxLDcgQEAKIAkuc3RhdF9zaG93CT0gZnVuY3Rpb25fc3RhdF9zaG93CiB9OwogCi1zdGF0aWMgX19pbml0IHZvaWQgZnRyYWNlX3Byb2ZpbGVfZGVidWdmcyhzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcikKK3N0YXRpYyBfX2luaXQgdm9pZCBmdHJhY2VfcHJvZmlsZV90cmFjZWZzKHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyKQogewogCXN0cnVjdCBmdHJhY2VfcHJvZmlsZV9zdGF0ICpzdGF0OwogCXN0cnVjdCBkZW50cnkgKmVudHJ5OwpAQCAtMTA0NCwxNSArMTA1NywxNSBAQAogCQl9CiAJfQogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJmdW5jdGlvbl9wcm9maWxlX2VuYWJsZWQiLCAwNjQ0LAorCWVudHJ5ID0gdHJhY2Vmc19jcmVhdGVfZmlsZSgiZnVuY3Rpb25fcHJvZmlsZV9lbmFibGVkIiwgMDY0NCwKIAkJCQkgICAgZF90cmFjZXIsIE5VTEwsICZmdHJhY2VfcHJvZmlsZV9mb3BzKTsKIAlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgorCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIHRyYWNlZnMgIgogCQkJICAgIidmdW5jdGlvbl9wcm9maWxlX2VuYWJsZWQnIGVudHJ5XG4iKTsKIH0KIAogI2Vsc2UgLyogQ09ORklHX0ZVTkNUSU9OX1BST0ZJTEVSICovCi1zdGF0aWMgX19pbml0IHZvaWQgZnRyYWNlX3Byb2ZpbGVfZGVidWdmcyhzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcikKK3N0YXRpYyBfX2luaXQgdm9pZCBmdHJhY2VfcHJvZmlsZV90cmFjZWZzKHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyKQogewogfQogI2VuZGlmIC8qIENPTkZJR19GVU5DVElPTl9QUk9GSUxFUiAqLwpAQCAtNDcxMiw3ICs0NzI1LDcgQEAKIAltdXRleF91bmxvY2soJmZ0cmFjZV9sb2NrKTsKIH0KIAotc3RhdGljIF9faW5pdCBpbnQgZnRyYWNlX2luaXRfZHluX2RlYnVnZnMoc3RydWN0IGRlbnRyeSAqZF90cmFjZXIpCitzdGF0aWMgX19pbml0IGludCBmdHJhY2VfaW5pdF9keW5fdHJhY2VmcyhzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcikKIHsKIAogCXRyYWNlX2NyZWF0ZV9maWxlKCJhdmFpbGFibGVfZmlsdGVyX2Z1bmN0aW9ucyIsIDA0NDQsCkBAIC01MDIwLDcgKzUwMzMsNyBAQAogfQogY29yZV9pbml0Y2FsbChmdHJhY2Vfbm9keW5faW5pdCk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGZ0cmFjZV9pbml0X2R5bl9kZWJ1Z2ZzKHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBmdHJhY2VfaW5pdF9keW5fdHJhY2VmcyhzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcikgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9zdGFydHVwX2VuYWJsZShpbnQgY29tbWFuZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZnRyYWNlX3N0YXJ0dXBfYWxsKGludCBjb21tYW5kKSB7IH0KIC8qIEtlZXAgYXMgbWFjcm9zIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGRlZmluZSB0aGUgY29tbWFuZHMgKi8KQEAgLTUyMDksMTMgKzUyMjIsNiBAQAogZnRyYWNlX2Z1bmNfdCBmdHJhY2Vfb3BzX2dldF9mdW5jKHN0cnVjdCBmdHJhY2Vfb3BzICpvcHMpCiB7CiAJLyoKLQkgKiBJZiB0aGlzIGlzIGEgZHluYW1pYyBvcHMgb3Igd2UgZm9yY2UgbGlzdCBmdW5jLAotCSAqIHRoZW4gaXQgbmVlZHMgdG8gY2FsbCB0aGUgbGlzdCBhbnl3YXkuCi0JICovCi0JaWYgKG9wcy0+ZmxhZ3MgJiBGVFJBQ0VfT1BTX0ZMX0RZTkFNSUMgfHwgRlRSQUNFX0ZPUkNFX0xJU1RfRlVOQykKLQkJcmV0dXJuIGZ0cmFjZV9vcHNfbGlzdF9mdW5jOwotCi0JLyoKIAkgKiBJZiB0aGUgZnVuYyBoYW5kbGVzIGl0cyBvd24gcmVjdXJzaW9uLCBjYWxsIGl0IGRpcmVjdGx5LgogCSAqIE90aGVyd2lzZSBjYWxsIHRoZSByZWN1cnNpb24gcHJvdGVjdGVkIGZ1bmN0aW9uIHRoYXQKIAkgKiB3aWxsIGNhbGwgdGhlIGZ0cmFjZSBvcHMgZnVuY3Rpb24uCkBAIC01NDczLDcgKzU0NzksNyBAQAogCS5yZWxlYXNlCT0gZnRyYWNlX3BpZF9yZWxlYXNlLAogfTsKIAotc3RhdGljIF9faW5pdCBpbnQgZnRyYWNlX2luaXRfZGVidWdmcyh2b2lkKQorc3RhdGljIF9faW5pdCBpbnQgZnRyYWNlX2luaXRfdHJhY2Vmcyh2b2lkKQogewogCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwogCkBAIC01NDgxLDE2ICs1NDg3LDE2IEBACiAJaWYgKElTX0VSUihkX3RyYWNlcikpCiAJCXJldHVybiAwOwogCi0JZnRyYWNlX2luaXRfZHluX2RlYnVnZnMoZF90cmFjZXIpOworCWZ0cmFjZV9pbml0X2R5bl90cmFjZWZzKGRfdHJhY2VyKTsKIAogCXRyYWNlX2NyZWF0ZV9maWxlKCJzZXRfZnRyYWNlX3BpZCIsIDA2NDQsIGRfdHJhY2VyLAogCQkJICAgIE5VTEwsICZmdHJhY2VfcGlkX2ZvcHMpOwogCi0JZnRyYWNlX3Byb2ZpbGVfZGVidWdmcyhkX3RyYWNlcik7CisJZnRyYWNlX3Byb2ZpbGVfdHJhY2VmcyhkX3RyYWNlcik7CiAKIAlyZXR1cm4gMDsKIH0KLWZzX2luaXRjYWxsKGZ0cmFjZV9pbml0X2RlYnVnZnMpOworZnNfaW5pdGNhbGwoZnRyYWNlX2luaXRfdHJhY2Vmcyk7CiAKIC8qKgogICogZnRyYWNlX2tpbGwgLSBraWxsIGZ0cmFjZQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyLmMgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYwppbmRleCA1MDQwZDQ0Li4wMzE1ZDQzIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYworKysgYi9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYwpAQCAtMjY3OSw3ICsyNjc5LDcgQEAKIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSBpbnQgdHJhY2VfcmVjdXJzaXZlX2xvY2sodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgdmFsID0gdGhpc19jcHVfcmVhZChjdXJyZW50X2NvbnRleHQpOworCXVuc2lnbmVkIGludCB2YWwgPSBfX3RoaXNfY3B1X3JlYWQoY3VycmVudF9jb250ZXh0KTsKIAlpbnQgYml0OwogCiAJaWYgKGluX2ludGVycnVwdCgpKSB7CkBAIC0yNjk2LDE4ICsyNjk2LDE0IEBACiAJCXJldHVybiAxOwogCiAJdmFsIHw9ICgxIDw8IGJpdCk7Ci0JdGhpc19jcHVfd3JpdGUoY3VycmVudF9jb250ZXh0LCB2YWwpOworCV9fdGhpc19jcHVfd3JpdGUoY3VycmVudF9jb250ZXh0LCB2YWwpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCB0cmFjZV9yZWN1cnNpdmVfdW5sb2NrKHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IHZhbCA9IHRoaXNfY3B1X3JlYWQoY3VycmVudF9jb250ZXh0KTsKLQotCXZhbC0tOwotCXZhbCAmPSB0aGlzX2NwdV9yZWFkKGN1cnJlbnRfY29udGV4dCk7Ci0JdGhpc19jcHVfd3JpdGUoY3VycmVudF9jb250ZXh0LCB2YWwpOworCV9fdGhpc19jcHVfYW5kKGN1cnJlbnRfY29udGV4dCwgX190aGlzX2NwdV9yZWFkKGN1cnJlbnRfY29udGV4dCkgLSAxKTsKIH0KIAogI2Vsc2UKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKaW5kZXggNjJjNjUwNi4uOTFlZWNhYSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L2lycWZsYWdzLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlZnMuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KQEAgLTMxLDYgKzMyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGxpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgPGxpbnV4L3J3c2VtLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CkBAIC0xMjMsNiArMTI1LDQyIEBACiAvKiBXaGVuIHNldCwgdHJhY2luZyB3aWxsIHN0b3Agd2hlbiBhIFdBUk4qKCkgaXMgaGl0ICovCiBpbnQgX19kaXNhYmxlX3RyYWNlX29uX3dhcm5pbmc7CiAKKyNpZmRlZiBDT05GSUdfVFJBQ0VfRU5VTV9NQVBfRklMRQorLyogTWFwIG9mIGVudW1zIHRvIHRoZWlyIHZhbHVlcywgZm9yICJlbnVtX21hcCIgZmlsZSAqLworc3RydWN0IHRyYWNlX2VudW1fbWFwX2hlYWQgeworCXN0cnVjdCBtb2R1bGUJCQkqbW9kOworCXVuc2lnbmVkIGxvbmcJCQlsZW5ndGg7Cit9OworCit1bmlvbiB0cmFjZV9lbnVtX21hcF9pdGVtOworCitzdHJ1Y3QgdHJhY2VfZW51bV9tYXBfdGFpbCB7CisJLyoKKwkgKiAiZW5kIiBpcyBmaXJzdCBhbmQgcG9pbnRzIHRvIE5VTEwgYXMgaXQgbXVzdCBiZSBkaWZmZXJlbnQKKwkgKiB0aGFuICJtb2QiIG9yICJlbnVtX3N0cmluZyIKKwkgKi8KKwl1bmlvbiB0cmFjZV9lbnVtX21hcF9pdGVtCSpuZXh0OworCWNvbnN0IGNoYXIJCQkqZW5kOwkvKiBwb2ludHMgdG8gTlVMTCAqLworfTsKKworc3RhdGljIERFRklORV9NVVRFWCh0cmFjZV9lbnVtX211dGV4KTsKKworLyoKKyAqIFRoZSB0cmFjZV9lbnVtX21hcHMgYXJlIHNhdmVkIGluIGFuIGFycmF5IHdpdGggdHdvIGV4dHJhIGVsZW1lbnRzLAorICogb25lIGF0IHRoZSBiZWdpbm5pbmcsIGFuZCBvbmUgYXQgdGhlIGVuZC4gVGhlIGJlZ2lubmluZyBpdGVtIGNvbnRhaW5zCisgKiB0aGUgY291bnQgb2YgdGhlIHNhdmVkIG1hcHMgKGhlYWQubGVuZ3RoKSwgYW5kIHRoZSBtb2R1bGUgdGhleQorICogYmVsb25nIHRvIGlmIG5vdCBidWlsdCBpbiAoaGVhZC5tb2QpLiBUaGUgZW5kaW5nIGl0ZW0gY29udGFpbnMgYQorICogcG9pbnRlciB0byB0aGUgbmV4dCBhcnJheSBvZiBzYXZlZCBlbnVtX21hcCBpdGVtcy4KKyAqLwordW5pb24gdHJhY2VfZW51bV9tYXBfaXRlbSB7CisJc3RydWN0IHRyYWNlX2VudW1fbWFwCQltYXA7CisJc3RydWN0IHRyYWNlX2VudW1fbWFwX2hlYWQJaGVhZDsKKwlzdHJ1Y3QgdHJhY2VfZW51bV9tYXBfdGFpbAl0YWlsOworfTsKKworc3RhdGljIHVuaW9uIHRyYWNlX2VudW1fbWFwX2l0ZW0gKnRyYWNlX2VudW1fbWFwczsKKyNlbmRpZiAvKiBDT05GSUdfVFJBQ0VfRU5VTV9NQVBfRklMRSAqLworCiBzdGF0aWMgaW50IHRyYWNpbmdfc2V0X3RyYWNlcihzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLCBjb25zdCBjaGFyICpidWYpOwogCiAjZGVmaW5lIE1BWF9UUkFDRVJfU0laRQkJMTAwCkBAIC0zOTA4LDYgKzM5NDYsMTgyIEBACiAJLndyaXRlCQk9IHRyYWNpbmdfc2F2ZWRfY21kbGluZXNfc2l6ZV93cml0ZSwKIH07CiAKKyNpZmRlZiBDT05GSUdfVFJBQ0VfRU5VTV9NQVBfRklMRQorc3RhdGljIHVuaW9uIHRyYWNlX2VudW1fbWFwX2l0ZW0gKgordXBkYXRlX2VudW1fbWFwKHVuaW9uIHRyYWNlX2VudW1fbWFwX2l0ZW0gKnB0cikKK3sKKwlpZiAoIXB0ci0+bWFwLmVudW1fc3RyaW5nKSB7CisJCWlmIChwdHItPnRhaWwubmV4dCkgeworCQkJcHRyID0gcHRyLT50YWlsLm5leHQ7CisJCQkvKiBTZXQgcHRyIHRvIHRoZSBuZXh0IHJlYWwgaXRlbSAoc2tpcCBoZWFkKSAqLworCQkJcHRyKys7CisJCX0gZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBwdHI7Cit9CisKK3N0YXRpYyB2b2lkICplbnVtX21hcF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCit7CisJdW5pb24gdHJhY2VfZW51bV9tYXBfaXRlbSAqcHRyID0gdjsKKworCS8qCisJICogUGFyYW5vaWQhIElmIHB0ciBwb2ludHMgdG8gZW5kLCB3ZSBkb24ndCB3YW50IHRvIGluY3JlbWVudCBwYXN0IGl0LgorCSAqIFRoaXMgcmVhbGx5IHNob3VsZCBuZXZlciBoYXBwZW4uCisJICovCisJcHRyID0gdXBkYXRlX2VudW1fbWFwKHB0cik7CisJaWYgKFdBUk5fT05fT05DRSghcHRyKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwdHIrKzsKKworCSgqcG9zKSsrOworCisJcHRyID0gdXBkYXRlX2VudW1fbWFwKHB0cik7CisKKwlyZXR1cm4gcHRyOworfQorCitzdGF0aWMgdm9pZCAqZW51bV9tYXBfc3RhcnQoc3RydWN0IHNlcV9maWxlICptLCBsb2ZmX3QgKnBvcykKK3sKKwl1bmlvbiB0cmFjZV9lbnVtX21hcF9pdGVtICp2OworCWxvZmZfdCBsID0gMDsKKworCW11dGV4X2xvY2soJnRyYWNlX2VudW1fbXV0ZXgpOworCisJdiA9IHRyYWNlX2VudW1fbWFwczsKKwlpZiAodikKKwkJdisrOworCisJd2hpbGUgKHYgJiYgbCA8ICpwb3MpIHsKKwkJdiA9IGVudW1fbWFwX25leHQobSwgdiwgJmwpOworCX0KKworCXJldHVybiB2OworfQorCitzdGF0aWMgdm9pZCBlbnVtX21hcF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwltdXRleF91bmxvY2soJnRyYWNlX2VudW1fbXV0ZXgpOworfQorCitzdGF0aWMgaW50IGVudW1fbWFwX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQoreworCXVuaW9uIHRyYWNlX2VudW1fbWFwX2l0ZW0gKnB0ciA9IHY7CisKKwlzZXFfcHJpbnRmKG0sICIlcyAlbGQgKCVzKVxuIiwKKwkJICAgcHRyLT5tYXAuZW51bV9zdHJpbmcsIHB0ci0+bWFwLmVudW1fdmFsdWUsCisJCSAgIHB0ci0+bWFwLnN5c3RlbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyB0cmFjaW5nX2VudW1fbWFwX3NlcV9vcHMgPSB7CisJLnN0YXJ0CQk9IGVudW1fbWFwX3N0YXJ0LAorCS5uZXh0CQk9IGVudW1fbWFwX25leHQsCisJLnN0b3AJCT0gZW51bV9tYXBfc3RvcCwKKwkuc2hvdwkJPSBlbnVtX21hcF9zaG93LAorfTsKKworc3RhdGljIGludCB0cmFjaW5nX2VudW1fbWFwX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCit7CisJaWYgKHRyYWNpbmdfZGlzYWJsZWQpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIHNlcV9vcGVuKGZpbHAsICZ0cmFjaW5nX2VudW1fbWFwX3NlcV9vcHMpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjaW5nX2VudW1fbWFwX2ZvcHMgPSB7CisJLm9wZW4JCT0gdHJhY2luZ19lbnVtX21hcF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW5saW5lIHVuaW9uIHRyYWNlX2VudW1fbWFwX2l0ZW0gKgordHJhY2VfZW51bV9qbXBfdG9fdGFpbCh1bmlvbiB0cmFjZV9lbnVtX21hcF9pdGVtICpwdHIpCit7CisJLyogUmV0dXJuIHRhaWwgb2YgYXJyYXkgZ2l2ZW4gdGhlIGhlYWQgKi8KKwlyZXR1cm4gcHRyICsgcHRyLT5oZWFkLmxlbmd0aCArIDE7Cit9CisKK3N0YXRpYyB2b2lkCit0cmFjZV9pbnNlcnRfZW51bV9tYXBfZmlsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCB0cmFjZV9lbnVtX21hcCAqKnN0YXJ0LAorCQkJICAgaW50IGxlbikKK3sKKwlzdHJ1Y3QgdHJhY2VfZW51bV9tYXAgKipzdG9wOworCXN0cnVjdCB0cmFjZV9lbnVtX21hcCAqKm1hcDsKKwl1bmlvbiB0cmFjZV9lbnVtX21hcF9pdGVtICptYXBfYXJyYXk7CisJdW5pb24gdHJhY2VfZW51bV9tYXBfaXRlbSAqcHRyOworCisJc3RvcCA9IHN0YXJ0ICsgbGVuOworCisJLyoKKwkgKiBUaGUgdHJhY2VfZW51bV9tYXBzIGNvbnRhaW5zIHRoZSBtYXAgcGx1cyBhIGhlYWQgYW5kIHRhaWwgaXRlbSwKKwkgKiB3aGVyZSB0aGUgaGVhZCBob2xkcyB0aGUgbW9kdWxlIGFuZCBsZW5ndGggb2YgYXJyYXksIGFuZCB0aGUKKwkgKiB0YWlsIGhvbGRzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBsaXN0LgorCSAqLworCW1hcF9hcnJheSA9IGttYWxsb2Moc2l6ZW9mKCptYXBfYXJyYXkpICogKGxlbiArIDIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1hcF9hcnJheSkgeworCQlwcl93YXJuaW5nKCJVbmFibGUgdG8gYWxsb2NhdGUgdHJhY2UgZW51bSBtYXBwaW5nXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW11dGV4X2xvY2soJnRyYWNlX2VudW1fbXV0ZXgpOworCisJaWYgKCF0cmFjZV9lbnVtX21hcHMpCisJCXRyYWNlX2VudW1fbWFwcyA9IG1hcF9hcnJheTsKKwllbHNlIHsKKwkJcHRyID0gdHJhY2VfZW51bV9tYXBzOworCQlmb3IgKDs7KSB7CisJCQlwdHIgPSB0cmFjZV9lbnVtX2ptcF90b190YWlsKHB0cik7CisJCQlpZiAoIXB0ci0+dGFpbC5uZXh0KQorCQkJCWJyZWFrOworCQkJcHRyID0gcHRyLT50YWlsLm5leHQ7CisKKwkJfQorCQlwdHItPnRhaWwubmV4dCA9IG1hcF9hcnJheTsKKwl9CisJbWFwX2FycmF5LT5oZWFkLm1vZCA9IG1vZDsKKwltYXBfYXJyYXktPmhlYWQubGVuZ3RoID0gbGVuOworCW1hcF9hcnJheSsrOworCisJZm9yIChtYXAgPSBzdGFydDsgKHVuc2lnbmVkIGxvbmcpbWFwIDwgKHVuc2lnbmVkIGxvbmcpc3RvcDsgbWFwKyspIHsKKwkJbWFwX2FycmF5LT5tYXAgPSAqKm1hcDsKKwkJbWFwX2FycmF5Kys7CisJfQorCW1lbXNldChtYXBfYXJyYXksIDAsIHNpemVvZigqbWFwX2FycmF5KSk7CisKKwltdXRleF91bmxvY2soJnRyYWNlX2VudW1fbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCB0cmFjZV9jcmVhdGVfZW51bV9maWxlKHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyKQoreworCXRyYWNlX2NyZWF0ZV9maWxlKCJlbnVtX21hcCIsIDA0NDQsIGRfdHJhY2VyLAorCQkJICBOVUxMLCAmdHJhY2luZ19lbnVtX21hcF9mb3BzKTsKK30KKworI2Vsc2UgLyogQ09ORklHX1RSQUNFX0VOVU1fTUFQX0ZJTEUgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZV9jcmVhdGVfZW51bV9maWxlKHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZV9pbnNlcnRfZW51bV9tYXBfZmlsZShzdHJ1Y3QgbW9kdWxlICptb2QsCisJCQkgICAgICBzdHJ1Y3QgdHJhY2VfZW51bV9tYXAgKipzdGFydCwgaW50IGxlbikgeyB9CisjZW5kaWYgLyogIUNPTkZJR19UUkFDRV9FTlVNX01BUF9GSUxFICovCisKK3N0YXRpYyB2b2lkIHRyYWNlX2luc2VydF9lbnVtX21hcChzdHJ1Y3QgbW9kdWxlICptb2QsCisJCQkJICBzdHJ1Y3QgdHJhY2VfZW51bV9tYXAgKipzdGFydCwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgdHJhY2VfZW51bV9tYXAgKiptYXA7CisKKwlpZiAobGVuIDw9IDApCisJCXJldHVybjsKKworCW1hcCA9IHN0YXJ0OworCisJdHJhY2VfZXZlbnRfZW51bV91cGRhdGUobWFwLCBsZW4pOworCisJdHJhY2VfaW5zZXJ0X2VudW1fbWFwX2ZpbGUobW9kLCBzdGFydCwgbGVuKTsKK30KKwogc3RhdGljIHNzaXplX3QKIHRyYWNpbmdfc2V0X3RyYWNlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1YnVmLAogCQkgICAgICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQpAQCAtNDEwNSw5ICs0MzE5LDI0IEBACiAJdHItPmN1cnJlbnRfdHJhY2UgPSAmbm9wX3RyYWNlOwogfQogCi1zdGF0aWMgaW50IHRyYWNpbmdfc2V0X3RyYWNlcihzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLCBjb25zdCBjaGFyICpidWYpCitzdGF0aWMgdm9pZCB1cGRhdGVfdHJhY2VyX29wdGlvbnMoc3RydWN0IHRyYWNlX2FycmF5ICp0ciwgc3RydWN0IHRyYWNlciAqdCkKIHsKIAlzdGF0aWMgc3RydWN0IHRyYWNlX29wdGlvbl9kZW50cnkgKnRvcHRzOworCisJLyogT25seSBlbmFibGUgaWYgdGhlIGRpcmVjdG9yeSBoYXMgYmVlbiBjcmVhdGVkIGFscmVhZHkuICovCisJaWYgKCF0ci0+ZGlyKQorCQlyZXR1cm47CisKKwkvKiBDdXJyZW50bHksIG9ubHkgdGhlIHRvcCBpbnN0YW5jZSBoYXMgb3B0aW9ucyAqLworCWlmICghKHRyLT5mbGFncyAmIFRSQUNFX0FSUkFZX0ZMX0dMT0JBTCkpCisJCXJldHVybjsKKworCWRlc3Ryb3lfdHJhY2Vfb3B0aW9uX2ZpbGVzKHRvcHRzKTsKKwl0b3B0cyA9IGNyZWF0ZV90cmFjZV9vcHRpb25fZmlsZXModHIsIHQpOworfQorCitzdGF0aWMgaW50IHRyYWNpbmdfc2V0X3RyYWNlcihzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLCBjb25zdCBjaGFyICpidWYpCit7CiAJc3RydWN0IHRyYWNlciAqdDsKICNpZmRlZiBDT05GSUdfVFJBQ0VSX01BWF9UUkFDRQogCWJvb2wgaGFkX21heF90cjsKQEAgLTQxNzIsMTEgKzQ0MDEsNyBAQAogCQlmcmVlX3NuYXBzaG90KHRyKTsKIAl9CiAjZW5kaWYKLQkvKiBDdXJyZW50bHksIG9ubHkgdGhlIHRvcCBpbnN0YW5jZSBoYXMgb3B0aW9ucyAqLwotCWlmICh0ci0+ZmxhZ3MgJiBUUkFDRV9BUlJBWV9GTF9HTE9CQUwpIHsKLQkJZGVzdHJveV90cmFjZV9vcHRpb25fZmlsZXModG9wdHMpOwotCQl0b3B0cyA9IGNyZWF0ZV90cmFjZV9vcHRpb25fZmlsZXModHIsIHQpOwotCX0KKwl1cGRhdGVfdHJhY2VyX29wdGlvbnModHIsIHQpOwogCiAjaWZkZWYgQ09ORklHX1RSQUNFUl9NQVhfVFJBQ0UKIAlpZiAodC0+dXNlX21heF90ciAmJiAhaGFkX21heF90cikgewpAQCAtNTgxNyw2ICs2MDQyLDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICp0cmFjaW5nX2dldF9kZW50cnkoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKIHsKKwlpZiAoV0FSTl9PTighdHItPmRpcikpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJLyogVG9wIGRpcmVjdG9yeSB1c2VzIE5VTEwgYXMgdGhlIHBhcmVudCAqLworCWlmICh0ci0+ZmxhZ3MgJiBUUkFDRV9BUlJBWV9GTF9HTE9CQUwpCisJCXJldHVybiBOVUxMOworCisJLyogQWxsIHN1YiBidWZmZXJzIGhhdmUgYSBkZXNjcmlwdG9yICovCiAJcmV0dXJuIHRyLT5kaXI7CiB9CiAKQEAgLTU4MzEsMTAgKzYwNjQsMTAgQEAKIAlpZiAoSVNfRVJSKGRfdHJhY2VyKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQl0ci0+cGVyY3B1X2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigicGVyX2NwdSIsIGRfdHJhY2VyKTsKKwl0ci0+cGVyY3B1X2RpciA9IHRyYWNlZnNfY3JlYXRlX2RpcigicGVyX2NwdSIsIGRfdHJhY2VyKTsKIAogCVdBUk5fT05DRSghdHItPnBlcmNwdV9kaXIsCi0JCSAgIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnkgJ3Blcl9jcHUvJWQnXG4iLCBjcHUpOworCQkgICJDb3VsZCBub3QgY3JlYXRlIHRyYWNlZnMgZGlyZWN0b3J5ICdwZXJfY3B1LyVkJ1xuIiwgY3B1KTsKIAogCXJldHVybiB0ci0+cGVyY3B1X2RpcjsKIH0KQEAgLTU4NTEsNyArNjA4NCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi10cmFjaW5nX2luaXRfZGVidWdmc19wZXJjcHUoc3RydWN0IHRyYWNlX2FycmF5ICp0ciwgbG9uZyBjcHUpCit0cmFjaW5nX2luaXRfdHJhY2Vmc19wZXJjcHUoc3RydWN0IHRyYWNlX2FycmF5ICp0ciwgbG9uZyBjcHUpCiB7CiAJc3RydWN0IGRlbnRyeSAqZF9wZXJjcHUgPSB0cmFjaW5nX2RlbnRyeV9wZXJjcHUodHIsIGNwdSk7CiAJc3RydWN0IGRlbnRyeSAqZF9jcHU7CkBAIC01ODYxLDkgKzYwOTQsOSBAQAogCQlyZXR1cm47CiAKIAlzbnByaW50ZihjcHVfZGlyLCAzMCwgImNwdSVsZCIsIGNwdSk7Ci0JZF9jcHUgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoY3B1X2RpciwgZF9wZXJjcHUpOworCWRfY3B1ID0gdHJhY2Vmc19jcmVhdGVfZGlyKGNwdV9kaXIsIGRfcGVyY3B1KTsKIAlpZiAoIWRfY3B1KSB7Ci0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnJXMnIGVudHJ5XG4iLCBjcHVfZGlyKTsKKwkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSB0cmFjZWZzICclcycgZW50cnlcbiIsIGNwdV9kaXIpOwogCQlyZXR1cm47CiAJfQogCkBAIC02MDE1LDkgKzYyNDgsOSBAQAogewogCXN0cnVjdCBkZW50cnkgKnJldDsKIAotCXJldCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgbW9kZSwgcGFyZW50LCBkYXRhLCBmb3BzKTsKKwlyZXQgPSB0cmFjZWZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgZGF0YSwgZm9wcyk7CiAJaWYgKCFyZXQpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnJXMnIGVudHJ5XG4iLCBuYW1lKTsKKwkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSB0cmFjZWZzICclcycgZW50cnlcbiIsIG5hbWUpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTYwMzQsOSArNjI2Nyw5IEBACiAJaWYgKElTX0VSUihkX3RyYWNlcikpCiAJCXJldHVybiBOVUxMOwogCi0JdHItPm9wdGlvbnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoIm9wdGlvbnMiLCBkX3RyYWNlcik7CisJdHItPm9wdGlvbnMgPSB0cmFjZWZzX2NyZWF0ZV9kaXIoIm9wdGlvbnMiLCBkX3RyYWNlcik7CiAJaWYgKCF0ci0+b3B0aW9ucykgewotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5ICdvcHRpb25zJ1xuIik7CisJCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgdHJhY2VmcyBkaXJlY3RvcnkgJ29wdGlvbnMnXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC02MTA1LDcgKzYzMzgsNyBAQAogCQlyZXR1cm47CiAKIAlmb3IgKGNudCA9IDA7IHRvcHRzW2NudF0ub3B0OyBjbnQrKykKLQkJZGVidWdmc19yZW1vdmUodG9wdHNbY250XS5lbnRyeSk7CisJCXRyYWNlZnNfcmVtb3ZlKHRvcHRzW2NudF0uZW50cnkpOwogCiAJa2ZyZWUodG9wdHMpOwogfQpAQCAtNjE5NCw3ICs2NDI3LDcgQEAKIHN0cnVjdCBkZW50cnkgKnRyYWNlX2luc3RhbmNlX2RpcjsKIAogc3RhdGljIHZvaWQKLWluaXRfdHJhY2VyX2RlYnVnZnMoc3RydWN0IHRyYWNlX2FycmF5ICp0ciwgc3RydWN0IGRlbnRyeSAqZF90cmFjZXIpOworaW5pdF90cmFjZXJfdHJhY2VmcyhzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLCBzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcik7CiAKIHN0YXRpYyBpbnQKIGFsbG9jYXRlX3RyYWNlX2J1ZmZlcihzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLCBzdHJ1Y3QgdHJhY2VfYnVmZmVyICpidWYsIGludCBzaXplKQpAQCAtNjI3MSw3ICs2NTA0LDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW50IG5ld19pbnN0YW5jZV9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSkKK3N0YXRpYyBpbnQgaW5zdGFuY2VfbWtkaXIoY29uc3QgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyOwogCWludCByZXQ7CkBAIC02MzEwLDE3ICs2NTQzLDE3IEBACiAJaWYgKGFsbG9jYXRlX3RyYWNlX2J1ZmZlcnModHIsIHRyYWNlX2J1Zl9zaXplKSA8IDApCiAJCWdvdG8gb3V0X2ZyZWVfdHI7CiAKLQl0ci0+ZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHRyYWNlX2luc3RhbmNlX2Rpcik7CisJdHItPmRpciA9IHRyYWNlZnNfY3JlYXRlX2RpcihuYW1lLCB0cmFjZV9pbnN0YW5jZV9kaXIpOwogCWlmICghdHItPmRpcikKIAkJZ290byBvdXRfZnJlZV90cjsKIAogCXJldCA9IGV2ZW50X3RyYWNlX2FkZF90cmFjZXIodHItPmRpciwgdHIpOwogCWlmIChyZXQpIHsKLQkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHRyLT5kaXIpOworCQl0cmFjZWZzX3JlbW92ZV9yZWN1cnNpdmUodHItPmRpcik7CiAJCWdvdG8gb3V0X2ZyZWVfdHI7CiAJfQogCi0JaW5pdF90cmFjZXJfZGVidWdmcyh0ciwgdHItPmRpcik7CisJaW5pdF90cmFjZXJfdHJhY2Vmcyh0ciwgdHItPmRpcik7CiAKIAlsaXN0X2FkZCgmdHItPmxpc3QsICZmdHJhY2VfdHJhY2VfYXJyYXlzKTsKIApAQCAtNjM0MSw3ICs2NTc0LDcgQEAKIAogfQogCi1zdGF0aWMgaW50IGluc3RhbmNlX2RlbGV0ZShjb25zdCBjaGFyICpuYW1lKQorc3RhdGljIGludCBpbnN0YW5jZV9ybWRpcihjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCB0cmFjZV9hcnJheSAqdHI7CiAJaW50IGZvdW5kID0gMDsKQEAgLTYzODIsODIgKzY2MTUsMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGluc3RhbmNlX21rZGlyIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHVtb2RlX3QgbW9kZSkKLXsKLQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7Ci0JaW50IHJldDsKLQotCS8qIFBhcmFub2lkOiBNYWtlIHN1cmUgdGhlIHBhcmVudCBpcyB0aGUgImluc3RhbmNlcyIgZGlyZWN0b3J5ICovCi0JcGFyZW50ID0gaGxpc3RfZW50cnkoaW5vZGUtPmlfZGVudHJ5LmZpcnN0LCBzdHJ1Y3QgZGVudHJ5LCBkX3UuZF9hbGlhcyk7Ci0JaWYgKFdBUk5fT05fT05DRShwYXJlbnQgIT0gdHJhY2VfaW5zdGFuY2VfZGlyKSkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQkvKgotCSAqIFRoZSBpbm9kZSBtdXRleCBpcyBsb2NrZWQsIGJ1dCBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoKSB3aWxsIGFsc28KLQkgKiB0YWtlIHRoZSBtdXRleC4gQXMgdGhlIGluc3RhbmNlcyBkaXJlY3RvcnkgY2FuIG5vdCBiZSBkZXN0cm95ZWQKLQkgKiBvciBjaGFuZ2VkIGluIGFueSBvdGhlciB3YXksIGl0IGlzIHNhZmUgdG8gdW5sb2NrIGl0LCBhbmQKLQkgKiBsZXQgdGhlIGRlbnRyeSB0cnkuIElmIHR3byB1c2VycyB0cnkgdG8gbWFrZSB0aGUgc2FtZSBkaXIgYXQKLQkgKiB0aGUgc2FtZSB0aW1lLCB0aGVuIHRoZSBuZXdfaW5zdGFuY2VfY3JlYXRlKCkgd2lsbCBkZXRlcm1pbmUgdGhlCi0JICogd2lubmVyLgotCSAqLwotCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCi0JcmV0ID0gbmV3X2luc3RhbmNlX2NyZWF0ZShkZW50cnktPmRfaW5hbWUpOwotCi0JbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpbnN0YW5jZV9ybWRpcihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCi17Ci0Jc3RydWN0IGRlbnRyeSAqcGFyZW50OwotCWludCByZXQ7Ci0KLQkvKiBQYXJhbm9pZDogTWFrZSBzdXJlIHRoZSBwYXJlbnQgaXMgdGhlICJpbnN0YW5jZXMiIGRpcmVjdG9yeSAqLwotCXBhcmVudCA9IGhsaXN0X2VudHJ5KGlub2RlLT5pX2RlbnRyeS5maXJzdCwgc3RydWN0IGRlbnRyeSwgZF91LmRfYWxpYXMpOwotCWlmIChXQVJOX09OX09OQ0UocGFyZW50ICE9IHRyYWNlX2luc3RhbmNlX2RpcikpCi0JCXJldHVybiAtRU5PRU5UOwotCi0JLyogVGhlIGNhbGxlciBkaWQgYSBkZ2V0KCkgb24gZGVudHJ5ICovCi0JbXV0ZXhfdW5sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwotCi0JLyoKLQkgKiBUaGUgaW5vZGUgbXV0ZXggaXMgbG9ja2VkLCBidXQgZGVidWdmc19jcmVhdGVfZGlyKCkgd2lsbCBhbHNvCi0JICogdGFrZSB0aGUgbXV0ZXguIEFzIHRoZSBpbnN0YW5jZXMgZGlyZWN0b3J5IGNhbiBub3QgYmUgZGVzdHJveWVkCi0JICogb3IgY2hhbmdlZCBpbiBhbnkgb3RoZXIgd2F5LCBpdCBpcyBzYWZlIHRvIHVubG9jayBpdCwgYW5kCi0JICogbGV0IHRoZSBkZW50cnkgdHJ5LiBJZiB0d28gdXNlcnMgdHJ5IHRvIG1ha2UgdGhlIHNhbWUgZGlyIGF0Ci0JICogdGhlIHNhbWUgdGltZSwgdGhlbiB0aGUgaW5zdGFuY2VfZGVsZXRlKCkgd2lsbCBkZXRlcm1pbmUgdGhlCi0JICogd2lubmVyLgotCSAqLwotCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwotCi0JcmV0ID0gaW5zdGFuY2VfZGVsZXRlKGRlbnRyeS0+ZF9pbmFtZSk7Ci0KLQltdXRleF9sb2NrX25lc3RlZCgmaW5vZGUtPmlfbXV0ZXgsIElfTVVURVhfUEFSRU5UKTsKLQltdXRleF9sb2NrKCZkZW50cnktPmRfaW5vZGUtPmlfbXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGluc3RhbmNlX2Rpcl9pbm9kZV9vcGVyYXRpb25zID0gewotCS5sb29rdXAJCT0gc2ltcGxlX2xvb2t1cCwKLQkubWtkaXIJCT0gaW5zdGFuY2VfbWtkaXIsCi0JLnJtZGlyCQk9IGluc3RhbmNlX3JtZGlyLAotfTsKLQogc3RhdGljIF9faW5pdCB2b2lkIGNyZWF0ZV90cmFjZV9pbnN0YW5jZXMoc3RydWN0IGRlbnRyeSAqZF90cmFjZXIpCiB7Ci0JdHJhY2VfaW5zdGFuY2VfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJpbnN0YW5jZXMiLCBkX3RyYWNlcik7CisJdHJhY2VfaW5zdGFuY2VfZGlyID0gdHJhY2Vmc19jcmVhdGVfaW5zdGFuY2VfZGlyKCJpbnN0YW5jZXMiLCBkX3RyYWNlciwKKwkJCQkJCQkgaW5zdGFuY2VfbWtkaXIsCisJCQkJCQkJIGluc3RhbmNlX3JtZGlyKTsKIAlpZiAoV0FSTl9PTighdHJhY2VfaW5zdGFuY2VfZGlyKSkKIAkJcmV0dXJuOwotCi0JLyogSGlqYWNrIHRoZSBkaXIgaW5vZGUgb3BlcmF0aW9ucywgdG8gYWxsb3cgbWtkaXIgKi8KLQl0cmFjZV9pbnN0YW5jZV9kaXItPmRfaW5vZGUtPmlfb3AgPSAmaW5zdGFuY2VfZGlyX2lub2RlX29wZXJhdGlvbnM7CiB9CiAKIHN0YXRpYyB2b2lkCi1pbml0X3RyYWNlcl9kZWJ1Z2ZzKHN0cnVjdCB0cmFjZV9hcnJheSAqdHIsIHN0cnVjdCBkZW50cnkgKmRfdHJhY2VyKQoraW5pdF90cmFjZXJfdHJhY2VmcyhzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLCBzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcikKIHsKIAlpbnQgY3B1OwogCkBAIC02NTExLDEwICs2Njc5LDMyIEBACiAjZW5kaWYKIAogCWZvcl9lYWNoX3RyYWNpbmdfY3B1KGNwdSkKLQkJdHJhY2luZ19pbml0X2RlYnVnZnNfcGVyY3B1KHRyLCBjcHUpOworCQl0cmFjaW5nX2luaXRfdHJhY2Vmc19wZXJjcHUodHIsIGNwdSk7CiAKIH0KIAorc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqdHJhY2VfYXV0b21vdW50KHZvaWQgKmluZ29yZSkKK3sKKwlzdHJ1Y3QgdmZzbW91bnQgKm1udDsKKwlzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSAqdHlwZTsKKworCS8qCisJICogVG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgdG9vbHMgdGhhdCBtb3VudAorCSAqIGRlYnVnZnMgdG8gZ2V0IHRvIHRoZSB0cmFjaW5nIGZhY2lsaXR5LCB0cmFjZWZzIGlzIGF1dG9tYXRpY2FsbHkKKwkgKiBtb3VudGVkIHRvIHRoZSBkZWJ1Z2ZzL3RyYWNpbmcgZGlyZWN0b3J5LgorCSAqLworCXR5cGUgPSBnZXRfZnNfdHlwZSgidHJhY2VmcyIpOworCWlmICghdHlwZSkKKwkJcmV0dXJuIE5VTEw7CisJbW50ID0gdmZzX2tlcm5fbW91bnQodHlwZSwgMCwgInRyYWNlZnMiLCBOVUxMKTsKKwlwdXRfZmlsZXN5c3RlbSh0eXBlKTsKKwlpZiAoSVNfRVJSKG1udCkpCisJCXJldHVybiBOVUxMOworCW1udGdldChtbnQpOworCisJcmV0dXJuIG1udDsKK30KKwogLyoqCiAgKiB0cmFjaW5nX2luaXRfZGVudHJ5IC0gaW5pdGlhbGl6ZSB0b3AgbGV2ZWwgdHJhY2UgYXJyYXkKICAqCkBAIC02NTI2LDIzICs2NzE2LDExMiBAQAogewogCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSAmZ2xvYmFsX3RyYWNlOwogCisJLyogVGhlIHRvcCBsZXZlbCB0cmFjZSBhcnJheSB1c2VzICBOVUxMIGFzIHBhcmVudCAqLwogCWlmICh0ci0+ZGlyKQotCQlyZXR1cm4gdHItPmRpcjsKKwkJcmV0dXJuIE5VTEw7CiAKIAlpZiAoV0FSTl9PTighZGVidWdmc19pbml0aWFsaXplZCgpKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CiAKLQl0ci0+ZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ0cmFjaW5nIiwgTlVMTCk7Ci0KKwkvKgorCSAqIEFzIHRoZXJlIG1heSBzdGlsbCBiZSB1c2VycyB0aGF0IGV4cGVjdCB0aGUgdHJhY2luZworCSAqIGZpbGVzIHRvIGV4aXN0IGluIGRlYnVnZnMvdHJhY2luZywgd2UgbXVzdCBhdXRvbW91bnQKKwkgKiB0aGUgdHJhY2VmcyBmaWxlIHN5c3RlbSB0aGVyZSwgc28gb2xkZXIgdG9vbHMgc3RpbGwKKwkgKiB3b3JrIHdpdGggdGhlIG5ld2VyIGtlcmVubC4KKwkgKi8KKwl0ci0+ZGlyID0gZGVidWdmc19jcmVhdGVfYXV0b21vdW50KCJ0cmFjaW5nIiwgTlVMTCwKKwkJCQkJICAgdHJhY2VfYXV0b21vdW50LCBOVUxMKTsKIAlpZiAoIXRyLT5kaXIpIHsKIAkJcHJfd2Fybl9vbmNlKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5ICd0cmFjaW5nJ1xuIik7CiAJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCX0KIAotCXJldHVybiB0ci0+ZGlyOworCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgX19pbml0IGludCB0cmFjZXJfaW5pdF9kZWJ1Z2ZzKHZvaWQpCitleHRlcm4gc3RydWN0IHRyYWNlX2VudW1fbWFwICpfX3N0YXJ0X2Z0cmFjZV9lbnVtX21hcHNbXTsKK2V4dGVybiBzdHJ1Y3QgdHJhY2VfZW51bV9tYXAgKl9fc3RvcF9mdHJhY2VfZW51bV9tYXBzW107CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0cmFjZV9lbnVtX2luaXQodm9pZCkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gX19zdG9wX2Z0cmFjZV9lbnVtX21hcHMgLSBfX3N0YXJ0X2Z0cmFjZV9lbnVtX21hcHM7CisJdHJhY2VfaW5zZXJ0X2VudW1fbWFwKE5VTEwsIF9fc3RhcnRfZnRyYWNlX2VudW1fbWFwcywgbGVuKTsKK30KKworI2lmZGVmIENPTkZJR19NT0RVTEVTCitzdGF0aWMgdm9pZCB0cmFjZV9tb2R1bGVfYWRkX2VudW1zKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlpZiAoIW1vZC0+bnVtX3RyYWNlX2VudW1zKQorCQlyZXR1cm47CisKKwkvKgorCSAqIE1vZHVsZXMgd2l0aCBiYWQgdGFpbnQgZG8gbm90IGhhdmUgZXZlbnRzIGNyZWF0ZWQsIGRvCisJICogbm90IGJvdGhlciB3aXRoIGVudW1zIGVpdGhlci4KKwkgKi8KKwlpZiAodHJhY2VfbW9kdWxlX2hhc19iYWRfdGFpbnQobW9kKSkKKwkJcmV0dXJuOworCisJdHJhY2VfaW5zZXJ0X2VudW1fbWFwKG1vZCwgbW9kLT50cmFjZV9lbnVtcywgbW9kLT5udW1fdHJhY2VfZW51bXMpOworfQorCisjaWZkZWYgQ09ORklHX1RSQUNFX0VOVU1fTUFQX0ZJTEUKK3N0YXRpYyB2b2lkIHRyYWNlX21vZHVsZV9yZW1vdmVfZW51bXMoc3RydWN0IG1vZHVsZSAqbW9kKQoreworCXVuaW9uIHRyYWNlX2VudW1fbWFwX2l0ZW0gKm1hcDsKKwl1bmlvbiB0cmFjZV9lbnVtX21hcF9pdGVtICoqbGFzdCA9ICZ0cmFjZV9lbnVtX21hcHM7CisKKwlpZiAoIW1vZC0+bnVtX3RyYWNlX2VudW1zKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZ0cmFjZV9lbnVtX211dGV4KTsKKworCW1hcCA9IHRyYWNlX2VudW1fbWFwczsKKworCXdoaWxlIChtYXApIHsKKwkJaWYgKG1hcC0+aGVhZC5tb2QgPT0gbW9kKQorCQkJYnJlYWs7CisJCW1hcCA9IHRyYWNlX2VudW1fam1wX3RvX3RhaWwobWFwKTsKKwkJbGFzdCA9ICZtYXAtPnRhaWwubmV4dDsKKwkJbWFwID0gbWFwLT50YWlsLm5leHQ7CisJfQorCWlmICghbWFwKQorCQlnb3RvIG91dDsKKworCSpsYXN0ID0gdHJhY2VfZW51bV9qbXBfdG9fdGFpbChtYXApLT50YWlsLm5leHQ7CisJa2ZyZWUobWFwKTsKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0cmFjZV9lbnVtX211dGV4KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdHJhY2VfbW9kdWxlX3JlbW92ZV9lbnVtcyhzdHJ1Y3QgbW9kdWxlICptb2QpIHsgfQorI2VuZGlmIC8qIENPTkZJR19UUkFDRV9FTlVNX01BUF9GSUxFICovCisKK3N0YXRpYyBpbnQgdHJhY2VfbW9kdWxlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1vZHVsZSAqbW9kID0gZGF0YTsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBNT0RVTEVfU1RBVEVfQ09NSU5HOgorCQl0cmFjZV9tb2R1bGVfYWRkX2VudW1zKG1vZCk7CisJCWJyZWFrOworCWNhc2UgTU9EVUxFX1NUQVRFX0dPSU5HOgorCQl0cmFjZV9tb2R1bGVfcmVtb3ZlX2VudW1zKG1vZCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHRyYWNlX21vZHVsZV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHRyYWNlX21vZHVsZV9ub3RpZnksCisJLnByaW9yaXR5ID0gMCwKK307CisjZW5kaWYgLyogQ09ORklHX01PRFVMRVMgKi8KKworc3RhdGljIF9faW5pdCBpbnQgdHJhY2VyX2luaXRfdHJhY2Vmcyh2b2lkKQogewogCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwogCkBAIC02NTUyLDcgKzY4MzEsNyBAQAogCWlmIChJU19FUlIoZF90cmFjZXIpKQogCQlyZXR1cm4gMDsKIAotCWluaXRfdHJhY2VyX2RlYnVnZnMoJmdsb2JhbF90cmFjZSwgZF90cmFjZXIpOworCWluaXRfdHJhY2VyX3RyYWNlZnMoJmdsb2JhbF90cmFjZSwgZF90cmFjZXIpOwogCiAJdHJhY2VfY3JlYXRlX2ZpbGUoInRyYWNpbmdfdGhyZXNoIiwgMDY0NCwgZF90cmFjZXIsCiAJCQkmZ2xvYmFsX3RyYWNlLCAmdHJhY2luZ190aHJlc2hfZm9wcyk7CkBAIC02NTY2LDYgKzY4NDUsMTQgQEAKIAl0cmFjZV9jcmVhdGVfZmlsZSgic2F2ZWRfY21kbGluZXNfc2l6ZSIsIDA2NDQsIGRfdHJhY2VyLAogCQkJICBOVUxMLCAmdHJhY2luZ19zYXZlZF9jbWRsaW5lc19zaXplX2ZvcHMpOwogCisJdHJhY2VfZW51bV9pbml0KCk7CisKKwl0cmFjZV9jcmVhdGVfZW51bV9maWxlKGRfdHJhY2VyKTsKKworI2lmZGVmIENPTkZJR19NT0RVTEVTCisJcmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKCZ0cmFjZV9tb2R1bGVfbmIpOworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfRFlOQU1JQ19GVFJBQ0UKIAl0cmFjZV9jcmVhdGVfZmlsZSgiZHluX2Z0cmFjZV90b3RhbF9pbmZvIiwgMDQ0NCwgZF90cmFjZXIsCiAJCQkmZnRyYWNlX3VwZGF0ZV90b3RfY250LCAmdHJhY2luZ19keW5faW5mb19mb3BzKTsKQEAgLTY1NzUsNiArNjg2MiwxMCBAQAogCiAJY3JlYXRlX3RyYWNlX29wdGlvbnNfZGlyKCZnbG9iYWxfdHJhY2UpOwogCisJLyogSWYgdGhlIHRyYWNlciB3YXMgc3RhcnRlZCB2aWEgY21kbGluZSwgY3JlYXRlIG9wdGlvbnMgZm9yIGl0IGhlcmUgKi8KKwlpZiAoZ2xvYmFsX3RyYWNlLmN1cnJlbnRfdHJhY2UgIT0gJm5vcF90cmFjZSkKKwkJdXBkYXRlX3RyYWNlcl9vcHRpb25zKCZnbG9iYWxfdHJhY2UsIGdsb2JhbF90cmFjZS5jdXJyZW50X3RyYWNlKTsKKwogCXJldHVybiAwOwogfQogCkBAIC02ODg4LDcgKzcxNzksNyBAQAogCQkJdHJhY2Vwb2ludF9wcmludGsgPSAwOwogCX0KIAl0cmFjZXJfYWxsb2NfYnVmZmVycygpOwotCXRyYWNlX2V2ZW50X2luaXQoKTsJCisJdHJhY2VfZXZlbnRfaW5pdCgpOwogfQogCiBfX2luaXQgc3RhdGljIGludCBjbGVhcl9ib290X3RyYWNlcih2b2lkKQpAQCAtNjkxMCw1ICs3MjAxLDUgQEAKIAlyZXR1cm4gMDsKIH0KIAotZnNfaW5pdGNhbGwodHJhY2VyX2luaXRfZGVidWdmcyk7Citmc19pbml0Y2FsbCh0cmFjZXJfaW5pdF90cmFjZWZzKTsKIGxhdGVfaW5pdGNhbGwoY2xlYXJfYm9vdF90cmFjZXIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlLmggYi9rZXJuZWwvdHJhY2UvdHJhY2UuaAppbmRleCBkZDgyMDVhLi5kMjYxMjAxIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2UuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2UuaApAQCAtMzM0LDcgKzMzNCw3IEBACiAKIAogLyoqCi0gKiBzdHJ1Y3QgdHJhY2VyIC0gYSBzcGVjaWZpYyB0cmFjZXIgYW5kIGl0cyBjYWxsYmFja3MgdG8gaW50ZXJhY3Qgd2l0aCBkZWJ1Z2ZzCisgKiBzdHJ1Y3QgdHJhY2VyIC0gYSBzcGVjaWZpYyB0cmFjZXIgYW5kIGl0cyBjYWxsYmFja3MgdG8gaW50ZXJhY3Qgd2l0aCB0cmFjZWZzCiAgKiBAbmFtZTogdGhlIG5hbWUgY2hvc2VuIHRvIHNlbGVjdCBpdCBvbiB0aGUgYXZhaWxhYmxlX3RyYWNlcnMgZmlsZQogICogQGluaXQ6IGNhbGxlZCB3aGVuIG9uZSBzd2l0Y2hlcyB0byB0aGlzIHRyYWNlciAoZWNobyBuYW1lID4gY3VycmVudF90cmFjZXIpCiAgKiBAcmVzZXQ6IGNhbGxlZCB3aGVuIG9uZSBzd2l0Y2hlcyB0byBhbm90aGVyIHRyYWNlcgpAQCAtMTMwOSw4ICsxMzA5LDEwIEBACiAKICNpZmRlZiBDT05GSUdfRVZFTlRfVFJBQ0lORwogdm9pZCB0cmFjZV9ldmVudF9pbml0KHZvaWQpOwordm9pZCB0cmFjZV9ldmVudF9lbnVtX3VwZGF0ZShzdHJ1Y3QgdHJhY2VfZW51bV9tYXAgKiptYXAsIGludCBsZW4pOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgdHJhY2VfZXZlbnRfaW5pdCh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbiB2b2lkIHRyYWNlX2V2ZW50X2VudW1fdXBkYXRlKHN0cnVjdCB0cmFjZV9lbnVtX21hcCAqKm1hcCwgaW50IGxlbikgeyB9CiAjZW5kaWYKIAogZXh0ZXJuIHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqdHJhY2Vwb2ludF9wcmludF9pdGVyOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2VudHJpZXMuaCBiL2tlcm5lbC90cmFjZS90cmFjZV9lbnRyaWVzLmgKaW5kZXggZTJkMDI3YS4uZWU3Yjk0YSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2VudHJpZXMuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZW50cmllcy5oCkBAIC0yMjMsNyArMjIzLDcgQEAKIAkJX19keW5hbWljX2FycmF5KAl1MzIsCWJ1ZgkpCiAJKSwKIAotCUZfcHJpbnRrKCIlcGY6ICVzIiwKKwlGX3ByaW50aygiJXBzOiAlcyIsCiAJCSAodm9pZCAqKV9fZW50cnktPmlwLCBfX2VudHJ5LT5mbXQpLAogCiAJRklMVEVSX09USEVSCkBAIC0yMzgsNyArMjM4LDcgQEAKIAkJX19keW5hbWljX2FycmF5KAljaGFyLAlidWYJKQogCSksCiAKLQlGX3ByaW50aygiJXBmOiAlcyIsCisJRl9wcmludGsoIiVwczogJXMiLAogCQkgKHZvaWQgKilfX2VudHJ5LT5pcCwgX19lbnRyeS0+YnVmKSwKIAogCUZJTFRFUl9PVEhFUgpAQCAtMjUzLDcgKzI1Myw3IEBACiAJCV9fZmllbGQoCWNvbnN0IGNoYXIgKiwJc3RyCSkKIAkpLAogCi0JRl9wcmludGsoIiVwZjogJXMiLAorCUZfcHJpbnRrKCIlcHM6ICVzIiwKIAkJICh2b2lkICopX19lbnRyeS0+aXAsIF9fZW50cnktPnN0ciksCiAKIAlGSUxURVJfT1RIRVIKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYwppbmRleCBkYjU0ZGRhLi43ZGExZGZlIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50cy5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlZnMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KQEAgLTQ4MCw3ICs0ODAsNyBAQAogCQlyZXR1cm47CiAKIAlpZiAoIS0tZGlyLT5ucl9ldmVudHMpIHsKLQkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRpci0+ZW50cnkpOworCQl0cmFjZWZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyLT5lbnRyeSk7CiAJCWxpc3RfZGVsKCZkaXItPmxpc3QpOwogCQlfX3B1dF9zeXN0ZW1fZGlyKGRpcik7CiAJfQpAQCAtNDk5LDcgKzQ5OSw3IEBACiAJCX0KIAkJc3Bpbl91bmxvY2soJmRpci0+ZF9sb2NrKTsKIAotCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKKwkJdHJhY2Vmc19yZW1vdmVfcmVjdXJzaXZlKGRpcik7CiAJfQogCiAJbGlzdF9kZWwoJmZpbGUtPmxpc3QpOwpAQCAtMTUyNiw3ICsxNTI2LDcgQEAKIAl9IGVsc2UKIAkJX19nZXRfc3lzdGVtKHN5c3RlbSk7CiAKLQlkaXItPmVudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHBhcmVudCk7CisJZGlyLT5lbnRyeSA9IHRyYWNlZnNfY3JlYXRlX2RpcihuYW1lLCBwYXJlbnQpOwogCWlmICghZGlyLT5lbnRyeSkgewogCQlwcl93YXJuKCJGYWlsZWQgdG8gY3JlYXRlIHN5c3RlbSBkaXJlY3RvcnkgJXNcbiIsIG5hbWUpOwogCQlfX3B1dF9zeXN0ZW0oc3lzdGVtKTsKQEAgLTE1MzksMTIgKzE1MzksMTIgQEAKIAlkaXItPnN1YnN5c3RlbSA9IHN5c3RlbTsKIAlmaWxlLT5zeXN0ZW0gPSBkaXI7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImZpbHRlciIsIDA2NDQsIGRpci0+ZW50cnksIGRpciwKKwllbnRyeSA9IHRyYWNlZnNfY3JlYXRlX2ZpbGUoImZpbHRlciIsIDA2NDQsIGRpci0+ZW50cnksIGRpciwKIAkJCQkgICAgJmZ0cmFjZV9zdWJzeXN0ZW1fZmlsdGVyX2ZvcHMpOwogCWlmICghZW50cnkpIHsKIAkJa2ZyZWUoc3lzdGVtLT5maWx0ZXIpOwogCQlzeXN0ZW0tPmZpbHRlciA9IE5VTEw7Ci0JCXByX3dhcm4oIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnJXMvZmlsdGVyJyBlbnRyeVxuIiwgbmFtZSk7CisJCXByX3dhcm4oIkNvdWxkIG5vdCBjcmVhdGUgdHJhY2VmcyAnJXMvZmlsdGVyJyBlbnRyeVxuIiwgbmFtZSk7CiAJfQogCiAJdHJhY2VfY3JlYXRlX2ZpbGUoImVuYWJsZSIsIDA2NDQsIGRpci0+ZW50cnksIGRpciwKQEAgLTE1ODUsOSArMTU4NSw5IEBACiAJCWRfZXZlbnRzID0gcGFyZW50OwogCiAJbmFtZSA9IGZ0cmFjZV9ldmVudF9uYW1lKGNhbGwpOwotCWZpbGUtPmRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihuYW1lLCBkX2V2ZW50cyk7CisJZmlsZS0+ZGlyID0gdHJhY2Vmc19jcmVhdGVfZGlyKG5hbWUsIGRfZXZlbnRzKTsKIAlpZiAoIWZpbGUtPmRpcikgewotCQlwcl93YXJuKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJyVzJyBkaXJlY3RvcnlcbiIsIG5hbWUpOworCQlwcl93YXJuKCJDb3VsZCBub3QgY3JlYXRlIHRyYWNlZnMgJyVzJyBkaXJlY3RvcnlcbiIsIG5hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xNzA0LDYgKzE3MDQsMTI1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjaGFyICplbnVtX3JlcGxhY2UoY2hhciAqcHRyLCBzdHJ1Y3QgdHJhY2VfZW51bV9tYXAgKm1hcCwgaW50IGxlbikKK3sKKwlpbnQgcmxlbjsKKwlpbnQgZWxlbjsKKworCS8qIEZpbmQgdGhlIGxlbmd0aCBvZiB0aGUgZW51bSB2YWx1ZSBhcyBhIHN0cmluZyAqLworCWVsZW4gPSBzbnByaW50ZihwdHIsIDAsICIlbGQiLCBtYXAtPmVudW1fdmFsdWUpOworCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCByb29tIHRvIHJlcGxhY2UgdGhlIHN0cmluZyB3aXRoIHRoZSB2YWx1ZSAqLworCWlmIChsZW4gPCBlbGVuKQorCQlyZXR1cm4gTlVMTDsKKworCXNucHJpbnRmKHB0ciwgZWxlbiArIDEsICIlbGQiLCBtYXAtPmVudW1fdmFsdWUpOworCisJLyogR2V0IHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgb2YgcHRyICovCisJcmxlbiA9IHN0cmxlbihwdHIgKyBsZW4pOworCW1lbW1vdmUocHRyICsgZWxlbiwgcHRyICsgbGVuLCBybGVuKTsKKwkvKiBNYWtlIHN1cmUgd2UgZW5kIHRoZSBuZXcgc3RyaW5nICovCisJcHRyW2VsZW4gKyBybGVuXSA9IDA7CisKKwlyZXR1cm4gcHRyICsgZWxlbjsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2V2ZW50X3ByaW50ayhzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsCisJCQkJc3RydWN0IHRyYWNlX2VudW1fbWFwICptYXApCit7CisJY2hhciAqcHRyOworCWludCBxdW90ZSA9IDA7CisJaW50IGxlbiA9IHN0cmxlbihtYXAtPmVudW1fc3RyaW5nKTsKKworCWZvciAocHRyID0gY2FsbC0+cHJpbnRfZm10OyAqcHRyOyBwdHIrKykgeworCQlpZiAoKnB0ciA9PSAnXFwnKSB7CisJCQlwdHIrKzsKKwkJCS8qIHBhcmFub2lkICovCisJCQlpZiAoISpwdHIpCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnB0ciA9PSAnIicpIHsKKwkJCXF1b3RlIF49IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocXVvdGUpCisJCQljb250aW51ZTsKKwkJaWYgKGlzZGlnaXQoKnB0cikpIHsKKwkJCS8qIHNraXAgbnVtYmVycyAqLworCQkJZG8geworCQkJCXB0cisrOworCQkJCS8qIENoZWNrIGZvciBhbHBoYSBjaGFycyBsaWtlIFVMTCAqLworCQkJfSB3aGlsZSAoaXNhbG51bSgqcHRyKSk7CisJCQkvKgorCQkJICogQSBudW1iZXIgbXVzdCBoYXZlIHNvbWUga2luZCBvZiBkZWxpbWl0ZXIgYWZ0ZXIKKwkJCSAqIGl0LCBhbmQgd2UgY2FuIGlnbm9yZSB0aGF0IHRvby4KKwkJCSAqLworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGlzYWxwaGEoKnB0cikgfHwgKnB0ciA9PSAnXycpIHsKKwkJCWlmIChzdHJuY21wKG1hcC0+ZW51bV9zdHJpbmcsIHB0ciwgbGVuKSA9PSAwICYmCisJCQkgICAgIWlzYWxudW0ocHRyW2xlbl0pICYmIHB0cltsZW5dICE9ICdfJykgeworCQkJCXB0ciA9IGVudW1fcmVwbGFjZShwdHIsIG1hcCwgbGVuKTsKKwkJCQkvKiBIbW0sIGVudW0gc3RyaW5nIHNtYWxsZXIgdGhhbiB2YWx1ZSAqLworCQkJCWlmIChXQVJOX09OX09OQ0UoIXB0cikpCisJCQkJCXJldHVybjsKKwkJCQkvKgorCQkJCSAqIE5vIG5lZWQgdG8gZGVjcmVtZW50IGhlcmUsIGFzIGVudW1fcmVwbGFjZSgpCisJCQkJICogcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgY2hhcmFjdGVyIHBhc3NlZAorCQkJCSAqIHRoZSBlbnVtLCBhbmQgdHdvIGVudW1zIGNhbiBub3QgYmUgcGxhY2VkCisJCQkJICogYmFjayB0byBiYWNrIHdpdGhvdXQgc29tZXRoaW5nIGluIGJldHdlZW4uCisJCQkJICogV2UgY2FuIHNraXAgdGhhdCBzb21ldGhpbmcgaW4gYmV0d2Vlbi4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJc2tpcF9tb3JlOgorCQkJZG8geworCQkJCXB0cisrOworCQkJfSB3aGlsZSAoaXNhbG51bSgqcHRyKSB8fCAqcHRyID09ICdfJyk7CisJCQkvKgorCQkJICogSWYgd2hhdCBjb21lcyBhZnRlciB0aGlzIHZhcmlhYmxlIGlzIGEgJy4nIG9yCisJCQkgKiAnLT4nIHRoZW4gd2UgY2FuIGNvbnRpbnVlIHRvIGlnbm9yZSB0aGF0IHN0cmluZy4KKwkJCSAqLworCQkJaWYgKCpwdHIgPT0gJy4nIHx8IChwdHJbMF0gPT0gJy0nICYmIHB0clsxXSA9PSAnPicpKSB7CisJCQkJcHRyICs9ICpwdHIgPT0gJy4nID8gMSA6IDI7CisJCQkJZ290byBza2lwX21vcmU7CisJCQl9CisJCQkvKgorCQkJICogT25jZSBhZ2Fpbiwgd2UgY2FuIHNraXAgdGhlIGRlbGltaXRlciB0aGF0IGNhbWUKKwkJCSAqIGFmdGVyIHRoZSBzdHJpbmcuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJfQorfQorCit2b2lkIHRyYWNlX2V2ZW50X2VudW1fdXBkYXRlKHN0cnVjdCB0cmFjZV9lbnVtX21hcCAqKm1hcCwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsICpwOworCWNvbnN0IGNoYXIgKmxhc3Rfc3lzdGVtID0gTlVMTDsKKwlpbnQgbGFzdF9pOworCWludCBpOworCisJZG93bl93cml0ZSgmdHJhY2VfZXZlbnRfc2VtKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2FsbCwgcCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKKwkJLyogZXZlbnRzIGFyZSB1c3VhbGx5IGdyb3VwZWQgdG9nZXRoZXIgd2l0aCBzeXN0ZW1zICovCisJCWlmICghbGFzdF9zeXN0ZW0gfHwgY2FsbC0+Y2xhc3MtPnN5c3RlbSAhPSBsYXN0X3N5c3RlbSkgeworCQkJbGFzdF9pID0gMDsKKwkJCWxhc3Rfc3lzdGVtID0gY2FsbC0+Y2xhc3MtPnN5c3RlbTsKKwkJfQorCisJCWZvciAoaSA9IGxhc3RfaTsgaSA8IGxlbjsgaSsrKSB7CisJCQlpZiAoY2FsbC0+Y2xhc3MtPnN5c3RlbSA9PSBtYXBbaV0tPnN5c3RlbSkgeworCQkJCS8qIFNhdmUgdGhlIGZpcnN0IHN5c3RlbSBpZiBuZWVkIGJlICovCisJCQkJaWYgKCFsYXN0X2kpCisJCQkJCWxhc3RfaSA9IGk7CisJCQkJdXBkYXRlX2V2ZW50X3ByaW50ayhjYWxsLCBtYXBbaV0pOworCQkJfQorCQl9CisJfQorCXVwX3dyaXRlKCZ0cmFjZV9ldmVudF9zZW0pOworfQorCiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9maWxlICoKIHRyYWNlX2NyZWF0ZV9uZXdfZXZlbnQoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLAogCQkgICAgICAgc3RydWN0IHRyYWNlX2FycmF5ICp0cikKQEAgLTE5MTUsNyArMjAzNCw3IEBACiAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdHJhY2VfbW9kdWxlX25iID0gewogCS5ub3RpZmllcl9jYWxsID0gdHJhY2VfbW9kdWxlX25vdGlmeSwKLQkucHJpb3JpdHkgPSAwLAorCS5wcmlvcml0eSA9IDEsIC8qIGhpZ2hlciB0aGFuIHRyYWNlLmMgbW9kdWxlIG5vdGlmeSAqLwogfTsKICNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLwogCkBAIC0yMjI4LDcgKzIzNDcsNyBAQAogLyoKICAqIFRoZSB0b3AgbGV2ZWwgYXJyYXkgaGFzIGFscmVhZHkgaGFkIGl0cyBmdHJhY2VfZXZlbnRfZmlsZQogICogZGVzY3JpcHRvcnMgY3JlYXRlZCBpbiBvcmRlciB0byBhbGxvdyBmb3IgZWFybHkgZXZlbnRzIHRvCi0gKiBiZSByZWNvcmRlZC4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgdGhlIGRlYnVnZnMgaGFzIGJlZW4KKyAqIGJlIHJlY29yZGVkLiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGUgdHJhY2VmcyBoYXMgYmVlbgogICogaW5pdGlhbGl6ZWQsIGFuZCB3ZSBub3cgaGF2ZSB0byBjcmVhdGUgdGhlIGZpbGVzIGFzc29jaWF0ZWQKICAqIHRvIHRoZSBldmVudHMuCiAgKi8KQEAgLTIzMTEsMTYgKzI0MzAsMTYgQEAKIAlzdHJ1Y3QgZGVudHJ5ICpkX2V2ZW50czsKIAlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgic2V0X2V2ZW50IiwgMDY0NCwgcGFyZW50LAorCWVudHJ5ID0gdHJhY2Vmc19jcmVhdGVfZmlsZSgic2V0X2V2ZW50IiwgMDY0NCwgcGFyZW50LAogCQkJCSAgICB0ciwgJmZ0cmFjZV9zZXRfZXZlbnRfZm9wcyk7CiAJaWYgKCFlbnRyeSkgewotCQlwcl93YXJuKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJ3NldF9ldmVudCcgZW50cnlcbiIpOworCQlwcl93YXJuKCJDb3VsZCBub3QgY3JlYXRlIHRyYWNlZnMgJ3NldF9ldmVudCcgZW50cnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlkX2V2ZW50cyA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZXZlbnRzIiwgcGFyZW50KTsKKwlkX2V2ZW50cyA9IHRyYWNlZnNfY3JlYXRlX2RpcigiZXZlbnRzIiwgcGFyZW50KTsKIAlpZiAoIWRfZXZlbnRzKSB7Ci0JCXByX3dhcm4oIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnZXZlbnRzJyBkaXJlY3RvcnlcbiIpOworCQlwcl93YXJuKCJDb3VsZCBub3QgY3JlYXRlIHRyYWNlZnMgJ2V2ZW50cycgZGlyZWN0b3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0yNDEyLDcgKzI1MzEsNyBAQAogCiAJZG93bl93cml0ZSgmdHJhY2VfZXZlbnRfc2VtKTsKIAlfX3RyYWNlX3JlbW92ZV9ldmVudF9kaXJzKHRyKTsKLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUodHItPmV2ZW50X2Rpcik7CisJdHJhY2Vmc19yZW1vdmVfcmVjdXJzaXZlKHRyLT5ldmVudF9kaXIpOwogCXVwX3dyaXRlKCZ0cmFjZV9ldmVudF9zZW0pOwogCiAJdHItPmV2ZW50X2RpciA9IE5VTEw7CkBAIC0yNTM0LDEwICsyNjUzLDEwIEBACiAJaWYgKElTX0VSUihkX3RyYWNlcikpCiAJCXJldHVybiAwOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhdmFpbGFibGVfZXZlbnRzIiwgMDQ0NCwgZF90cmFjZXIsCisJZW50cnkgPSB0cmFjZWZzX2NyZWF0ZV9maWxlKCJhdmFpbGFibGVfZXZlbnRzIiwgMDQ0NCwgZF90cmFjZXIsCiAJCQkJICAgIHRyLCAmZnRyYWNlX2F2YWlsX2ZvcHMpOwogCWlmICghZW50cnkpCi0JCXByX3dhcm4oIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnYXZhaWxhYmxlX2V2ZW50cycgZW50cnlcbiIpOworCQlwcl93YXJuKCJDb3VsZCBub3QgY3JlYXRlIHRyYWNlZnMgJ2F2YWlsYWJsZV9ldmVudHMnIGVudHJ5XG4iKTsKIAogCWlmICh0cmFjZV9kZWZpbmVfY29tbW9uX2ZpZWxkcygpKQogCQlwcl93YXJuKCJ0cmFjaW5nOiBGYWlsZWQgdG8gYWxsb2NhdGUgY29tbW9uIGZpZWxkcyIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V4cG9ydC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2V4cG9ydC5jCmluZGV4IDEyZTJiOTkuLjE3NGE2YTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9leHBvcnQuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXhwb3J0LmMKQEAgLTE3Nyw3ICsxNzcsNyBAQAogCX0sCQkJCQkJCQlcCiAJLmV2ZW50LnR5cGUJCT0gZXR5cGUsCQkJCVwKIAkucHJpbnRfZm10CQk9IHByaW50LAkJCQlcCi0JLmZsYWdzCQkJPSBUUkFDRV9FVkVOVF9GTF9JR05PUkVfRU5BQkxFIHwgVFJBQ0VfRVZFTlRfRkxfVVNFX0NBTExfRklMVEVSLCBcCisJLmZsYWdzCQkJPSBUUkFDRV9FVkVOVF9GTF9JR05PUkVfRU5BQkxFLAkJXAogfTsJCQkJCQkJCQlcCiBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgX191c2VkCQkJCQkJXAogX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX2Z0cmFjZV9ldmVudHMiKSkpICpfX2V2ZW50XyMjY2FsbCA9ICZldmVudF8jI2NhbGw7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMKaW5kZXggMmQyNWFkMS4uOWNmZWE0YyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYwpAQCAtNiw3ICs2LDYgQEAKICAqIGlzIENvcHlyaWdodCAoYykgU3RldmVuIFJvc3RlZHQgPHNyb3N0ZWR0QHJlZGhhdC5jb20+CiAgKgogICovCi0jaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CkBAIC0xNTEsNyArMTUwLDcgQEAKIAkgKiBUaGUgY3Vycl9yZXRfc3RhY2sgaXMgaW5pdGlhbGl6ZWQgdG8gLTEgYW5kIGdldCBpbmNyZWFzZWQKIAkgKiBpbiB0aGlzIGZ1bmN0aW9uLiAgU28gaXQgY2FuIGJlIGxlc3MgdGhhbiAtMSBvbmx5IGlmIGl0IHdhcwogCSAqIGZpbHRlcmVkIG91dCB2aWEgZnRyYWNlX2dyYXBoX25vdHJhY2VfYWRkcigpIHdoaWNoIGNhbiBiZQotCSAqIHNldCBmcm9tIHNldF9ncmFwaF9ub3RyYWNlIGZpbGUgaW4gZGVidWdmcyBieSB1c2VyLgorCSAqIHNldCBmcm9tIHNldF9ncmFwaF9ub3RyYWNlIGZpbGUgaW4gdHJhY2VmcyBieSB1c2VyLgogCSAqLwogCWlmIChjdXJyZW50LT5jdXJyX3JldF9zdGFjayA8IC0xKQogCQlyZXR1cm4gLUVCVVNZOwpAQCAtMTQzMiw3ICsxNDMxLDcgQEAKIAkubGxzZWVrCQk9IGdlbmVyaWNfZmlsZV9sbHNlZWssCiB9OwogCi1zdGF0aWMgX19pbml0IGludCBpbml0X2dyYXBoX2RlYnVnZnModm9pZCkKK3N0YXRpYyBfX2luaXQgaW50IGluaXRfZ3JhcGhfdHJhY2Vmcyh2b2lkKQogewogCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwogCkBAIC0xNDQ1LDcgKzE0NDQsNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci1mc19pbml0Y2FsbChpbml0X2dyYXBoX2RlYnVnZnMpOworZnNfaW5pdGNhbGwoaW5pdF9ncmFwaF90cmFjZWZzKTsKIAogc3RhdGljIF9faW5pdCBpbnQgaW5pdF9ncmFwaF90cmFjZSh2b2lkKQogewpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2twcm9iZS5jCmluZGV4IGQ3M2Y1NjUuLmQwY2U1OTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9rcHJvYmUuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfa3Byb2JlLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogI2RlZmluZSBmZXRjaF9maWxlX29mZnNldF9zdHJpbmdfc2l6ZQlOVUxMCiAKIC8qIEZldGNoIHR5cGUgaW5mb3JtYXRpb24gdGFibGUgKi8KLWNvbnN0IHN0cnVjdCBmZXRjaF90eXBlIGtwcm9iZXNfZmV0Y2hfdHlwZV90YWJsZVtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmZXRjaF90eXBlIGtwcm9iZXNfZmV0Y2hfdHlwZV90YWJsZVtdID0gewogCS8qIFNwZWNpYWwgdHlwZXMgKi8KIAlbRkVUQ0hfVFlQRV9TVFJJTkddID0gX19BU1NJR05fRkVUQ0hfVFlQRSgic3RyaW5nIiwgc3RyaW5nLCBzdHJpbmcsCiAJCQkJCXNpemVvZih1MzIpLCAxLCAiX19kYXRhX2xvYyBjaGFyW10iKSwKQEAgLTc2MCw3ICs3NjAsOCBAQAogCiAJCS8qIFBhcnNlIGZldGNoIGFyZ3VtZW50ICovCiAJCXJldCA9IHRyYWNlcHJvYmVfcGFyc2VfcHJvYmVfYXJnKGFyZywgJnRrLT50cC5zaXplLCBwYXJnLAotCQkJCQkJaXNfcmV0dXJuLCB0cnVlKTsKKwkJCQkJCWlzX3JldHVybiwgdHJ1ZSwKKwkJCQkJCWtwcm9iZXNfZmV0Y2hfdHlwZV90YWJsZSk7CiAJCWlmIChyZXQpIHsKIAkJCXByX2luZm8oIlBhcnNlIGVycm9yIGF0IGFyZ3VtZW50WyVkXS4gKCVkKVxuIiwgaSwgcmV0KTsKIAkJCWdvdG8gZXJyb3I7CkBAIC0xMTM0LDExICsxMTM1LDE1IEBACiBrcHJvYmVfcGVyZl9mdW5jKHN0cnVjdCB0cmFjZV9rcHJvYmUgKnRrLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmdGstPnRwLmNhbGw7CisJc3RydWN0IGJwZl9wcm9nICpwcm9nID0gY2FsbC0+cHJvZzsKIAlzdHJ1Y3Qga3Byb2JlX3RyYWNlX2VudHJ5X2hlYWQgKmVudHJ5OwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwogCWludCBzaXplLCBfX3NpemUsIGRzaXplOwogCWludCByY3R4OwogCisJaWYgKHByb2cgJiYgIXRyYWNlX2NhbGxfYnBmKHByb2csIHJlZ3MpKQorCQlyZXR1cm47CisKIAloZWFkID0gdGhpc19jcHVfcHRyKGNhbGwtPnBlcmZfZXZlbnRzKTsKIAlpZiAoaGxpc3RfZW1wdHkoaGVhZCkpCiAJCXJldHVybjsKQEAgLTExNjUsMTEgKzExNzAsMTUgQEAKIAkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZ0ay0+dHAuY2FsbDsKKwlzdHJ1Y3QgYnBmX3Byb2cgKnByb2cgPSBjYWxsLT5wcm9nOwogCXN0cnVjdCBrcmV0cHJvYmVfdHJhY2VfZW50cnlfaGVhZCAqZW50cnk7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJaW50IHNpemUsIF9fc2l6ZSwgZHNpemU7CiAJaW50IHJjdHg7CiAKKwlpZiAocHJvZyAmJiAhdHJhY2VfY2FsbF9icGYocHJvZywgcmVncykpCisJCXJldHVybjsKKwogCWhlYWQgPSB0aGlzX2NwdV9wdHIoY2FsbC0+cGVyZl9ldmVudHMpOwogCWlmIChobGlzdF9lbXB0eShoZWFkKSkKIAkJcmV0dXJuOwpAQCAtMTI4Niw3ICsxMjk1LDcgQEAKIAkJa2ZyZWUoY2FsbC0+cHJpbnRfZm10KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCWNhbGwtPmZsYWdzID0gMDsKKwljYWxsLT5mbGFncyA9IFRSQUNFX0VWRU5UX0ZMX0tQUk9CRTsKIAljYWxsLT5jbGFzcy0+cmVnID0ga3Byb2JlX3JlZ2lzdGVyOwogCWNhbGwtPmRhdGEgPSB0azsKIAlyZXQgPSB0cmFjZV9hZGRfZXZlbnRfY2FsbChjYWxsKTsKQEAgLTEzMTAsNyArMTMxOSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogTWFrZSBhIGRlYnVnZnMgaW50ZXJmYWNlIGZvciBjb250cm9sbGluZyBwcm9iZSBwb2ludHMgKi8KKy8qIE1ha2UgYSB0cmFjZWZzIGludGVyZmFjZSBmb3IgY29udHJvbGxpbmcgcHJvYmUgcG9pbnRzICovCiBzdGF0aWMgX19pbml0IGludCBpbml0X2twcm9iZV90cmFjZSh2b2lkKQogewogCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwpAQCAtMTMyMywyMCArMTMzMiwyMCBAQAogCWlmIChJU19FUlIoZF90cmFjZXIpKQogCQlyZXR1cm4gMDsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgia3Byb2JlX2V2ZW50cyIsIDA2NDQsIGRfdHJhY2VyLAorCWVudHJ5ID0gdHJhY2Vmc19jcmVhdGVfZmlsZSgia3Byb2JlX2V2ZW50cyIsIDA2NDQsIGRfdHJhY2VyLAogCQkJCSAgICBOVUxMLCAma3Byb2JlX2V2ZW50c19vcHMpOwogCiAJLyogRXZlbnQgbGlzdCBpbnRlcmZhY2UgKi8KIAlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgorCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIHRyYWNlZnMgIgogCQkJICAgIidrcHJvYmVfZXZlbnRzJyBlbnRyeVxuIik7CiAKIAkvKiBQcm9maWxlIGludGVyZmFjZSAqLwotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgia3Byb2JlX3Byb2ZpbGUiLCAwNDQ0LCBkX3RyYWNlciwKKwllbnRyeSA9IHRyYWNlZnNfY3JlYXRlX2ZpbGUoImtwcm9iZV9wcm9maWxlIiwgMDQ0NCwgZF90cmFjZXIsCiAJCQkJICAgIE5VTEwsICZrcHJvYmVfcHJvZmlsZV9vcHMpOwogCiAJaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKKwkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSB0cmFjZWZzICIKIAkJCSAgICIna3Byb2JlX3Byb2ZpbGUnIGVudHJ5XG4iKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9wcm9iZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmMKaW5kZXggYjk4M2IyZi4uMTc2OWE4MSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmMKQEAgLTM1NiwxNyArMzU2LDE0IEBACiAKIC8qIFJlY3Vyc2l2ZSBhcmd1bWVudCBwYXJzZXIgKi8KIHN0YXRpYyBpbnQgcGFyc2VfcHJvYmVfYXJnKGNoYXIgKmFyZywgY29uc3Qgc3RydWN0IGZldGNoX3R5cGUgKnQsCi0JCSAgICAgc3RydWN0IGZldGNoX3BhcmFtICpmLCBib29sIGlzX3JldHVybiwgYm9vbCBpc19rcHJvYmUpCisJCSAgICAgc3RydWN0IGZldGNoX3BhcmFtICpmLCBib29sIGlzX3JldHVybiwgYm9vbCBpc19rcHJvYmUsCisJCSAgICAgY29uc3Qgc3RydWN0IGZldGNoX3R5cGUgKmZ0YmwpCiB7Ci0JY29uc3Qgc3RydWN0IGZldGNoX3R5cGUgKmZ0Ymw7CiAJdW5zaWduZWQgbG9uZyBwYXJhbTsKIAlsb25nIG9mZnNldDsKIAljaGFyICp0bXA7CiAJaW50IHJldCA9IDA7CiAKLQlmdGJsID0gaXNfa3Byb2JlID8ga3Byb2Jlc19mZXRjaF90eXBlX3RhYmxlIDogdXByb2Jlc19mZXRjaF90eXBlX3RhYmxlOwotCUJVR19PTihmdGJsID09IE5VTEwpOwotCiAJc3dpdGNoIChhcmdbMF0pIHsKIAljYXNlICckJzoKIAkJcmV0ID0gcGFyc2VfcHJvYmVfdmFycyhhcmcgKyAxLCB0LCBmLCBpc19yZXR1cm4sIGlzX2twcm9iZSk7CkBAIC00NDcsNyArNDQ0LDcgQEAKIAkJCWRwcm0tPmZldGNoX3NpemUgPSBnZXRfZmV0Y2hfc2l6ZV9mdW5jdGlvbih0LAogCQkJCQkJCWRwcm0tPmZldGNoLCBmdGJsKTsKIAkJCXJldCA9IHBhcnNlX3Byb2JlX2FyZyhhcmcsIHQyLCAmZHBybS0+b3JpZywgaXNfcmV0dXJuLAotCQkJCQkJCWlzX2twcm9iZSk7CisJCQkJCQkJaXNfa3Byb2JlLCBmdGJsKTsKIAkJCWlmIChyZXQpCiAJCQkJa2ZyZWUoZHBybSk7CiAJCQllbHNlIHsKQEAgLTUwNSwxNSArNTAyLDEyIEBACiAKIC8qIFN0cmluZyBsZW5ndGggY2hlY2tpbmcgd3JhcHBlciAqLwogaW50IHRyYWNlcHJvYmVfcGFyc2VfcHJvYmVfYXJnKGNoYXIgKmFyZywgc3NpemVfdCAqc2l6ZSwKLQkJc3RydWN0IHByb2JlX2FyZyAqcGFyZywgYm9vbCBpc19yZXR1cm4sIGJvb2wgaXNfa3Byb2JlKQorCQlzdHJ1Y3QgcHJvYmVfYXJnICpwYXJnLCBib29sIGlzX3JldHVybiwgYm9vbCBpc19rcHJvYmUsCisJCWNvbnN0IHN0cnVjdCBmZXRjaF90eXBlICpmdGJsKQogewotCWNvbnN0IHN0cnVjdCBmZXRjaF90eXBlICpmdGJsOwogCWNvbnN0IGNoYXIgKnQ7CiAJaW50IHJldDsKIAotCWZ0YmwgPSBpc19rcHJvYmUgPyBrcHJvYmVzX2ZldGNoX3R5cGVfdGFibGUgOiB1cHJvYmVzX2ZldGNoX3R5cGVfdGFibGU7Ci0JQlVHX09OKGZ0YmwgPT0gTlVMTCk7Ci0KIAlpZiAoc3RybGVuKGFyZykgPiBNQVhfQVJHU1RSX0xFTikgewogCQlwcl9pbmZvKCJBcmd1bWVudCBpcyB0b28gbG9uZy46ICVzXG4iLCAgYXJnKTsKIAkJcmV0dXJuIC1FTk9TUEM7CkBAIC01MzUsNyArNTI5LDggQEAKIAl9CiAJcGFyZy0+b2Zmc2V0ID0gKnNpemU7CiAJKnNpemUgKz0gcGFyZy0+dHlwZS0+c2l6ZTsKLQlyZXQgPSBwYXJzZV9wcm9iZV9hcmcoYXJnLCBwYXJnLT50eXBlLCAmcGFyZy0+ZmV0Y2gsIGlzX3JldHVybiwgaXNfa3Byb2JlKTsKKwlyZXQgPSBwYXJzZV9wcm9iZV9hcmcoYXJnLCBwYXJnLT50eXBlLCAmcGFyZy0+ZmV0Y2gsIGlzX3JldHVybiwKKwkJCSAgICAgIGlzX2twcm9iZSwgZnRibCk7CiAKIAlpZiAocmV0ID49IDAgJiYgdCAhPSBOVUxMKQogCQlyZXQgPSBfX3BhcnNlX2JpdGZpZWxkX3Byb2JlX2FyZyh0LCBwYXJnLT50eXBlLCAmcGFyZy0+ZmV0Y2gpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3Byb2JlLmggYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuaAppbmRleCA0ZjgxNWZiLi5hYjI4M2UxIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJvYmUuaApAQCAtMjUsNyArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWZzLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgpAQCAtMjI5LDEzICsyMjksNiBAQAogI2RlZmluZSBGRVRDSF9UWVBFX1NUUklORwkwCiAjZGVmaW5lIEZFVENIX1RZUEVfU1RSU0laRQkxCiAKLS8qCi0gKiBGZXRjaCB0eXBlIGluZm9ybWF0aW9uIHRhYmxlLgotICogSXQncyBkZWNsYXJlZCBhcyBhIHdlYWsgc3ltYm9sIGR1ZSB0byBjb25kaXRpb25hbCBjb21waWxhdGlvbi4KLSAqLwotZXh0ZXJuIF9fd2VhayBjb25zdCBzdHJ1Y3QgZmV0Y2hfdHlwZSBrcHJvYmVzX2ZldGNoX3R5cGVfdGFibGVbXTsKLWV4dGVybiBfX3dlYWsgY29uc3Qgc3RydWN0IGZldGNoX3R5cGUgdXByb2Jlc19mZXRjaF90eXBlX3RhYmxlW107Ci0KICNpZmRlZiBDT05GSUdfS1BST0JFX0VWRU5UCiBzdHJ1Y3Qgc3ltYm9sX2NhY2hlOwogdW5zaWduZWQgbG9uZyB1cGRhdGVfc3ltYm9sX2NhY2hlKHN0cnVjdCBzeW1ib2xfY2FjaGUgKnNjKTsKQEAgLTMzMyw3ICszMjYsOCBAQAogfQogCiBleHRlcm4gaW50IHRyYWNlcHJvYmVfcGFyc2VfcHJvYmVfYXJnKGNoYXIgKmFyZywgc3NpemVfdCAqc2l6ZSwKLQkJICAgc3RydWN0IHByb2JlX2FyZyAqcGFyZywgYm9vbCBpc19yZXR1cm4sIGJvb2wgaXNfa3Byb2JlKTsKKwkJICAgc3RydWN0IHByb2JlX2FyZyAqcGFyZywgYm9vbCBpc19yZXR1cm4sIGJvb2wgaXNfa3Byb2JlLAorCQkgICBjb25zdCBzdHJ1Y3QgZmV0Y2hfdHlwZSAqZnRibCk7CiAKIGV4dGVybiBpbnQgdHJhY2Vwcm9iZV9jb25mbGljdF9maWVsZF9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgICAgICAgc3RydWN0IHByb2JlX2FyZyAqYXJncywgaW50IG5hcmcpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3N0YWNrLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYwppbmRleCBjM2U0ZmNmLi4zZjM0NDk2IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhY2suYwpAQCAtMzI3LDExICszMjcsMTEgQEAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiB9CiAKLXN0YXRpYyBpbnQgdHJhY2VfbG9va3VwX3N0YWNrKHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9uZyBpKQorc3RhdGljIHZvaWQgdHJhY2VfbG9va3VwX3N0YWNrKHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9uZyBpKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YWNrX2R1bXBfdHJhY2VbaV07CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihtLCAiJXBTXG4iLCAodm9pZCAqKWFkZHIpOworCXNlcV9wcmludGYobSwgIiVwU1xuIiwgKHZvaWQgKilhZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgcHJpbnRfZGlzYWJsZWQoc3RydWN0IHNlcV9maWxlICptKQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3N0YXQuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9zdGF0LmMKaW5kZXggNzVlMTllOC4uNmNmOTM1MyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3N0YXQuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhdC5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vmcy5oPgogI2luY2x1ZGUgInRyYWNlX3N0YXQuaCIKICNpbmNsdWRlICJ0cmFjZS5oIgogCkBAIC02NSw3ICs2NSw3IEBACiAKIHN0YXRpYyB2b2lkIGRlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3Qgc3RhdF9zZXNzaW9uICpzZXNzaW9uKQogewotCWRlYnVnZnNfcmVtb3ZlKHNlc3Npb24tPmZpbGUpOworCXRyYWNlZnNfcmVtb3ZlKHNlc3Npb24tPmZpbGUpOwogCV9fcmVzZXRfc3RhdF9zZXNzaW9uKHNlc3Npb24pOwogCW11dGV4X2Rlc3Ryb3koJnNlc3Npb24tPnN0YXRfbXV0ZXgpOwogCWtmcmVlKHNlc3Npb24pOwpAQCAtMjc5LDkgKzI3OSw5IEBACiAJaWYgKElTX0VSUihkX3RyYWNpbmcpKQogCQlyZXR1cm4gMDsKIAotCXN0YXRfZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJ0cmFjZV9zdGF0IiwgZF90cmFjaW5nKTsKKwlzdGF0X2RpciA9IHRyYWNlZnNfY3JlYXRlX2RpcigidHJhY2Vfc3RhdCIsIGRfdHJhY2luZyk7CiAJaWYgKCFzdGF0X2RpcikKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKKwkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSB0cmFjZWZzICIKIAkJCSAgICIndHJhY2Vfc3RhdCcgZW50cnlcbiIpOwogCXJldHVybiAwOwogfQpAQCAtMjkxLDcgKzI5MSw3IEBACiAJaWYgKCFzdGF0X2RpciAmJiB0cmFjaW5nX3N0YXRfaW5pdCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXNlc3Npb24tPmZpbGUgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKHNlc3Npb24tPnRzLT5uYW1lLCAwNjQ0LAorCXNlc3Npb24tPmZpbGUgPSB0cmFjZWZzX2NyZWF0ZV9maWxlKHNlc3Npb24tPnRzLT5uYW1lLCAwNjQ0LAogCQkJCQkgICAgc3RhdF9kaXIsCiAJCQkJCSAgICBzZXNzaW9uLCAmdHJhY2luZ19zdGF0X2ZvcHMpOwogCWlmICghc2Vzc2lvbi0+ZmlsZSkKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV91cHJvYmUuYyBiL2tlcm5lbC90cmFjZS90cmFjZV91cHJvYmUuYwppbmRleCA3ZGMxYzhhLi5kNjBmZTYyIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfdXByb2JlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3Vwcm9iZS5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIERFRklORV9GRVRDSF9maWxlX29mZnNldChzdHJpbmdfc2l6ZSkKIAogLyogRmV0Y2ggdHlwZSBpbmZvcm1hdGlvbiB0YWJsZSAqLwotY29uc3Qgc3RydWN0IGZldGNoX3R5cGUgdXByb2Jlc19mZXRjaF90eXBlX3RhYmxlW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGZldGNoX3R5cGUgdXByb2Jlc19mZXRjaF90eXBlX3RhYmxlW10gPSB7CiAJLyogU3BlY2lhbCB0eXBlcyAqLwogCVtGRVRDSF9UWVBFX1NUUklOR10gPSBfX0FTU0lHTl9GRVRDSF9UWVBFKCJzdHJpbmciLCBzdHJpbmcsIHN0cmluZywKIAkJCQkJc2l6ZW9mKHUzMiksIDEsICJfX2RhdGFfbG9jIGNoYXJbXSIpLApAQCAtNTM1LDcgKzUzNSw4IEBACiAKIAkJLyogUGFyc2UgZmV0Y2ggYXJndW1lbnQgKi8KIAkJcmV0ID0gdHJhY2Vwcm9iZV9wYXJzZV9wcm9iZV9hcmcoYXJnLCAmdHUtPnRwLnNpemUsIHBhcmcsCi0JCQkJCQkgaXNfcmV0dXJuLCBmYWxzZSk7CisJCQkJCQkgaXNfcmV0dXJuLCBmYWxzZSwKKwkJCQkJCSB1cHJvYmVzX2ZldGNoX3R5cGVfdGFibGUpOwogCQlpZiAocmV0KSB7CiAJCQlwcl9pbmZvKCJQYXJzZSBlcnJvciBhdCBhcmd1bWVudFslZF0uICglZClcbiIsIGksIHJldCk7CiAJCQlnb3RvIGVycm9yOwpAQCAtMTAwNSw3ICsxMDA2LDcgQEAKIAkJcmV0dXJuIHRydWU7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2ZW50LCAmZmlsdGVyLT5wZXJmX2V2ZW50cywgaHcudHBfbGlzdCkgewotCQlpZiAoZXZlbnQtPmh3LnRwX3RhcmdldC0+bW0gPT0gbW0pCisJCWlmIChldmVudC0+aHcudGFyZ2V0LT5tbSA9PSBtbSkKIAkJCXJldHVybiB0cnVlOwogCX0KIApAQCAtMTAxNSw3ICsxMDE2LDcgQEAKIHN0YXRpYyBpbmxpbmUgYm9vbAogdXByb2JlX2ZpbHRlcl9ldmVudChzdHJ1Y3QgdHJhY2VfdXByb2JlICp0dSwgc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQogewotCXJldHVybiBfX3Vwcm9iZV9wZXJmX2ZpbHRlcigmdHUtPmZpbHRlciwgZXZlbnQtPmh3LnRwX3RhcmdldC0+bW0pOworCXJldHVybiBfX3Vwcm9iZV9wZXJmX2ZpbHRlcigmdHUtPmZpbHRlciwgZXZlbnQtPmh3LnRhcmdldC0+bW0pOwogfQogCiBzdGF0aWMgaW50IHVwcm9iZV9wZXJmX2Nsb3NlKHN0cnVjdCB0cmFjZV91cHJvYmUgKnR1LCBzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCkBAIC0xMDIzLDEwICsxMDI0LDEwIEBACiAJYm9vbCBkb25lOwogCiAJd3JpdGVfbG9jaygmdHUtPmZpbHRlci5yd2xvY2spOwotCWlmIChldmVudC0+aHcudHBfdGFyZ2V0KSB7CisJaWYgKGV2ZW50LT5ody50YXJnZXQpIHsKIAkJbGlzdF9kZWwoJmV2ZW50LT5ody50cF9saXN0KTsKIAkJZG9uZSA9IHR1LT5maWx0ZXIubnJfc3lzdGVtd2lkZSB8fAotCQkJKGV2ZW50LT5ody50cF90YXJnZXQtPmZsYWdzICYgUEZfRVhJVElORykgfHwKKwkJCShldmVudC0+aHcudGFyZ2V0LT5mbGFncyAmIFBGX0VYSVRJTkcpIHx8CiAJCQl1cHJvYmVfZmlsdGVyX2V2ZW50KHR1LCBldmVudCk7CiAJfSBlbHNlIHsKIAkJdHUtPmZpbHRlci5ucl9zeXN0ZW13aWRlLS07CkBAIC0xMDQ2LDcgKzEwNDcsNyBAQAogCWludCBlcnI7CiAKIAl3cml0ZV9sb2NrKCZ0dS0+ZmlsdGVyLnJ3bG9jayk7Ci0JaWYgKGV2ZW50LT5ody50cF90YXJnZXQpIHsKKwlpZiAoZXZlbnQtPmh3LnRhcmdldCkgewogCQkvKgogCQkgKiBldmVudC0+cGFyZW50ICE9IE5VTEwgbWVhbnMgY29weV9wcm9jZXNzKCksIHdlIGNhbiBhdm9pZAogCQkgKiB1cHJvYmVfYXBwbHkoKS4gY3VycmVudC0+bW0gbXVzdCBiZSBwcm9iZWQgYW5kIHdlIGNhbiByZWx5CmRpZmYgLS1naXQgYS9rZXJuZWwvd2F0Y2hkb2cuYyBiL2tlcm5lbC93YXRjaGRvZy5jCmluZGV4IDMxNzRiZjguLjIzMTZmNTAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93YXRjaGRvZy5jCisrKyBiL2tlcm5lbC93YXRjaGRvZy5jCkBAIC0yNCw4ICsyNCwzMyBAQAogI2luY2x1ZGUgPGxpbnV4L2t2bV9wYXJhLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyZl9ldmVudC5oPgogCi1pbnQgd2F0Y2hkb2dfdXNlcl9lbmFibGVkID0gMTsKKy8qCisgKiBUaGUgcnVuIHN0YXRlIG9mIHRoZSBsb2NrdXAgZGV0ZWN0b3JzIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGNvbnRlbnQgb2YgdGhlCisgKiAnd2F0Y2hkb2dfZW5hYmxlZCcgdmFyaWFibGUuIEVhY2ggbG9ja3VwIGRldGVjdG9yIGhhcyBpdHMgZGVkaWNhdGVkIGJpdCAtCisgKiBiaXQgMCBmb3IgdGhlIGhhcmQgbG9ja3VwIGRldGVjdG9yIGFuZCBiaXQgMSBmb3IgdGhlIHNvZnQgbG9ja3VwIGRldGVjdG9yLgorICoKKyAqICd3YXRjaGRvZ191c2VyX2VuYWJsZWQnLCAnbm1pX3dhdGNoZG9nX2VuYWJsZWQnIGFuZCAnc29mdF93YXRjaGRvZ19lbmFibGVkJworICogYXJlIHZhcmlhYmxlcyB0aGF0IGFyZSBvbmx5IHVzZWQgYXMgYW4gJ2ludGVyZmFjZScgYmV0d2VlbiB0aGUgcGFyYW1ldGVycworICogaW4gL3Byb2Mvc3lzL2tlcm5lbCBhbmQgdGhlIGludGVybmFsIHN0YXRlIGJpdHMgaW4gJ3dhdGNoZG9nX2VuYWJsZWQnLiBUaGUKKyAqICd3YXRjaGRvZ190aHJlc2gnIHZhcmlhYmxlIGlzIGhhbmRsZWQgZGlmZmVyZW50bHkgYmVjYXVzZSBpdHMgdmFsdWUgaXMgbm90CisgKiBib29sZWFuLCBhbmQgdGhlIGxvY2t1cCBkZXRlY3RvcnMgYXJlICdzdXNwZW5kZWQnIHdoaWxlICd3YXRjaGRvZ190aHJlc2gnCisgKiBpcyBlcXVhbCB6ZXJvLgorICovCisjZGVmaW5lIE5NSV9XQVRDSERPR19FTkFCTEVEX0JJVCAgIDAKKyNkZWZpbmUgU09GVF9XQVRDSERPR19FTkFCTEVEX0JJVCAgMQorI2RlZmluZSBOTUlfV0FUQ0hET0dfRU5BQkxFRCAgICAgICgxIDw8IE5NSV9XQVRDSERPR19FTkFCTEVEX0JJVCkKKyNkZWZpbmUgU09GVF9XQVRDSERPR19FTkFCTEVEICAgICAoMSA8PCBTT0ZUX1dBVENIRE9HX0VOQUJMRURfQklUKQorCisjaWZkZWYgQ09ORklHX0hBUkRMT0NLVVBfREVURUNUT1IKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fcmVhZF9tb3N0bHkgd2F0Y2hkb2dfZW5hYmxlZCA9IFNPRlRfV0FUQ0hET0dfRU5BQkxFRHxOTUlfV0FUQ0hET0dfRU5BQkxFRDsKKyNlbHNlCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX3JlYWRfbW9zdGx5IHdhdGNoZG9nX2VuYWJsZWQgPSBTT0ZUX1dBVENIRE9HX0VOQUJMRUQ7CisjZW5kaWYKK2ludCBfX3JlYWRfbW9zdGx5IG5taV93YXRjaGRvZ19lbmFibGVkOworaW50IF9fcmVhZF9tb3N0bHkgc29mdF93YXRjaGRvZ19lbmFibGVkOworaW50IF9fcmVhZF9tb3N0bHkgd2F0Y2hkb2dfdXNlcl9lbmFibGVkOwogaW50IF9fcmVhZF9tb3N0bHkgd2F0Y2hkb2dfdGhyZXNoID0gMTA7CisKICNpZmRlZiBDT05GSUdfU01QCiBpbnQgX19yZWFkX21vc3RseSBzeXNjdGxfc29mdGxvY2t1cF9hbGxfY3B1X2JhY2t0cmFjZTsKICNlbHNlCkBAIC01OCw4ICs4Myw2IEBACiAjaWZkZWYgQ09ORklHX0hBUkRMT0NLVVBfREVURUNUT1IKIHN0YXRpYyBpbnQgaGFyZGxvY2t1cF9wYW5pYyA9CiAJCQlDT05GSUdfQk9PVFBBUkFNX0hBUkRMT0NLVVBfUEFOSUNfVkFMVUU7Ci0KLXN0YXRpYyBib29sIGhhcmRsb2NrdXBfZGV0ZWN0b3JfZW5hYmxlZCA9IHRydWU7CiAvKgogICogV2UgbWF5IG5vdCB3YW50IHRvIGVuYWJsZSBoYXJkIGxvY2t1cCBkZXRlY3Rpb24gYnkgZGVmYXVsdCBpbiBhbGwgY2FzZXMsCiAgKiBmb3IgZXhhbXBsZSB3aGVuIHJ1bm5pbmcgdGhlIGtlcm5lbCBhcyBhIGd1ZXN0IG9uIGEgaHlwZXJ2aXNvci4gSW4gdGhlc2UKQEAgLTY4LDE0ICs5MSw5IEBACiAgKiBrZXJuZWwgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMgYXJlIHBhcnNlZCwgYmVjYXVzZSBvdGhlcndpc2UgaXQgaXMgbm90CiAgKiBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGlzIGluIGhhcmRsb2NrdXBfcGFuaWNfc2V0dXAoKS4KICAqLwotdm9pZCB3YXRjaGRvZ19lbmFibGVfaGFyZGxvY2t1cF9kZXRlY3Rvcihib29sIHZhbCkKK3ZvaWQgaGFyZGxvY2t1cF9kZXRlY3Rvcl9kaXNhYmxlKHZvaWQpCiB7Ci0JaGFyZGxvY2t1cF9kZXRlY3Rvcl9lbmFibGVkID0gdmFsOwotfQotCi1ib29sIHdhdGNoZG9nX2hhcmRsb2NrdXBfZGV0ZWN0b3JfaXNfZW5hYmxlZCh2b2lkKQotewotCXJldHVybiBoYXJkbG9ja3VwX2RldGVjdG9yX2VuYWJsZWQ7CisJd2F0Y2hkb2dfZW5hYmxlZCAmPSB+Tk1JX1dBVENIRE9HX0VOQUJMRUQ7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGhhcmRsb2NrdXBfcGFuaWNfc2V0dXAoY2hhciAqc3RyKQpAQCAtODUsMTUgKzEwMyw5IEBACiAJZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAibm9wYW5pYyIsIDcpKQogCQloYXJkbG9ja3VwX3BhbmljID0gMDsKIAllbHNlIGlmICghc3RybmNtcChzdHIsICIwIiwgMSkpCi0JCXdhdGNoZG9nX3VzZXJfZW5hYmxlZCA9IDA7Ci0JZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAiMSIsIDEpIHx8ICFzdHJuY21wKHN0ciwgIjIiLCAxKSkgewotCQkvKgotCQkgKiBTZXR0aW5nICdubWlfd2F0Y2hkb2c9MScgb3IgJ25taV93YXRjaGRvZz0yJyAobGVnYWN5IG9wdGlvbikKLQkJICogaGFzIHRoZSBzYW1lIGVmZmVjdC4KLQkJICovCi0JCXdhdGNoZG9nX3VzZXJfZW5hYmxlZCA9IDE7Ci0JCXdhdGNoZG9nX2VuYWJsZV9oYXJkbG9ja3VwX2RldGVjdG9yKHRydWUpOwotCX0KKwkJd2F0Y2hkb2dfZW5hYmxlZCAmPSB+Tk1JX1dBVENIRE9HX0VOQUJMRUQ7CisJZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAiMSIsIDEpKQorCQl3YXRjaGRvZ19lbmFibGVkIHw9IE5NSV9XQVRDSERPR19FTkFCTEVEOwogCXJldHVybiAxOwogfQogX19zZXR1cCgibm1pX3dhdGNoZG9nPSIsIGhhcmRsb2NrdXBfcGFuaWNfc2V0dXApOwpAQCAtMTEyLDE5ICsxMjQsMTggQEAKIAogc3RhdGljIGludCBfX2luaXQgbm93YXRjaGRvZ19zZXR1cChjaGFyICpzdHIpCiB7Ci0Jd2F0Y2hkb2dfdXNlcl9lbmFibGVkID0gMDsKKwl3YXRjaGRvZ19lbmFibGVkID0gMDsKIAlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoIm5vd2F0Y2hkb2ciLCBub3dhdGNoZG9nX3NldHVwKTsKIAotLyogZGVwcmVjYXRlZCAqLwogc3RhdGljIGludCBfX2luaXQgbm9zb2Z0bG9ja3VwX3NldHVwKGNoYXIgKnN0cikKIHsKLQl3YXRjaGRvZ191c2VyX2VuYWJsZWQgPSAwOworCXdhdGNoZG9nX2VuYWJsZWQgJj0gflNPRlRfV0FUQ0hET0dfRU5BQkxFRDsKIAlyZXR1cm4gMTsKIH0KIF9fc2V0dXAoIm5vc29mdGxvY2t1cCIsIG5vc29mdGxvY2t1cF9zZXR1cCk7Ci0vKiAgKi8KKwogI2lmZGVmIENPTkZJR19TTVAKIHN0YXRpYyBpbnQgX19pbml0IHNvZnRsb2NrdXBfYWxsX2NwdV9iYWNrdHJhY2Vfc2V0dXAoY2hhciAqc3RyKQogewpAQCAtMjM5LDEwICsyNTAsMTEgQEAKIHsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGdldF90aW1lc3RhbXAoKTsKIAotCS8qIFdhcm4gYWJvdXQgdW5yZWFzb25hYmxlIGRlbGF5czogKi8KLQlpZiAodGltZV9hZnRlcihub3csIHRvdWNoX3RzICsgZ2V0X3NvZnRsb2NrdXBfdGhyZXNoKCkpKQotCQlyZXR1cm4gbm93IC0gdG91Y2hfdHM7Ci0KKwlpZiAod2F0Y2hkb2dfZW5hYmxlZCAmIFNPRlRfV0FUQ0hET0dfRU5BQkxFRCkgeworCQkvKiBXYXJuIGFib3V0IHVucmVhc29uYWJsZSBkZWxheXMuICovCisJCWlmICh0aW1lX2FmdGVyKG5vdywgdG91Y2hfdHMgKyBnZXRfc29mdGxvY2t1cF90aHJlc2goKSkpCisJCQlyZXR1cm4gbm93IC0gdG91Y2hfdHM7CisJfQogCXJldHVybiAwOwogfQogCkBAIC00NzcsNiArNDg5LDIxIEBACiAJX190aGlzX2NwdV93cml0ZShzb2Z0X2xvY2t1cF9ocnRpbWVyX2NudCwKIAkJCSBfX3RoaXNfY3B1X3JlYWQoaHJ0aW1lcl9pbnRlcnJ1cHRzKSk7CiAJX190b3VjaF93YXRjaGRvZygpOworCisJLyoKKwkgKiB3YXRjaGRvZ19ubWlfZW5hYmxlKCkgY2xlYXJzIHRoZSBOTUlfV0FUQ0hET0dfRU5BQkxFRCBiaXQgaW4gdGhlCisJICogZmFpbHVyZSBwYXRoLiBDaGVjayBmb3IgZmFpbHVyZXMgdGhhdCBjYW4gb2NjdXIgYXN5bmNocm9ub3VzbHkgLQorCSAqIGZvciBleGFtcGxlLCB3aGVuIENQVXMgYXJlIG9uLWxpbmVkIC0gYW5kIHNodXQgZG93biB0aGUgaGFyZHdhcmUKKwkgKiBwZXJmIGV2ZW50IG9uIGVhY2ggQ1BVIGFjY29yZGluZ2x5LgorCSAqCisJICogVGhlIG9ubHkgbm9uLW9idmlvdXMgcGxhY2UgdGhpcyBiaXQgY2FuIGJlIGNsZWFyZWQgaXMgdGhyb3VnaAorCSAqIHdhdGNoZG9nX25taV9lbmFibGUoKSwgc28gYSBwcl9pbmZvKCkgaXMgcGxhY2VkIHRoZXJlLiAgUGxhY2luZyBhCisJICogcHJfaW5mbyBoZXJlIHdvdWxkIGJlIHRvbyBub2lzeSBhcyBpdCB3b3VsZCByZXN1bHQgaW4gYSBtZXNzYWdlCisJICogZXZlcnkgZmV3IHNlY29uZHMgaWYgdGhlIGhhcmRsb2NrdXAgd2FzIGRpc2FibGVkIGJ1dCB0aGUgc29mdGxvY2t1cAorCSAqIGVuYWJsZWQuCisJICovCisJaWYgKCEod2F0Y2hkb2dfZW5hYmxlZCAmIE5NSV9XQVRDSERPR19FTkFCTEVEKSkKKwkJd2F0Y2hkb2dfbm1pX2Rpc2FibGUoY3B1KTsKIH0KIAogI2lmZGVmIENPTkZJR19IQVJETE9DS1VQX0RFVEVDVE9SCkBAIC00OTIsMTQgKzUxOSw5IEBACiAJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqd2RfYXR0cjsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQgPSBwZXJfY3B1KHdhdGNoZG9nX2V2LCBjcHUpOwogCi0JLyoKLQkgKiBTb21lIGtlcm5lbHMgbmVlZCB0byBkZWZhdWx0IGhhcmQgbG9ja3VwIGRldGVjdGlvbiB0bwotCSAqICdkaXNhYmxlZCcsIGZvciBleGFtcGxlIGEgZ3Vlc3Qgb24gYSBoeXBlcnZpc29yLgotCSAqLwotCWlmICghd2F0Y2hkb2dfaGFyZGxvY2t1cF9kZXRlY3Rvcl9pc19lbmFibGVkKCkpIHsKLQkJZXZlbnQgPSBFUlJfUFRSKC1FTk9FTlQpOwotCQlnb3RvIGhhbmRsZV9lcnI7Ci0JfQorCS8qIG5vdGhpbmcgdG8gZG8gaWYgdGhlIGhhcmQgbG9ja3VwIGRldGVjdG9yIGlzIGRpc2FibGVkICovCisJaWYgKCEod2F0Y2hkb2dfZW5hYmxlZCAmIE5NSV9XQVRDSERPR19FTkFCTEVEKSkKKwkJZ290byBvdXQ7CiAKIAkvKiBpcyBpdCBhbHJlYWR5IHNldHVwIGFuZCBlbmFibGVkPyAqLwogCWlmIChldmVudCAmJiBldmVudC0+c3RhdGUgPiBQRVJGX0VWRU5UX1NUQVRFX09GRikKQEAgLTUxNSw3ICs1MzcsNiBAQAogCS8qIFRyeSB0byByZWdpc3RlciB1c2luZyBoYXJkd2FyZSBwZXJmIGV2ZW50cyAqLwogCWV2ZW50ID0gcGVyZl9ldmVudF9jcmVhdGVfa2VybmVsX2NvdW50ZXIod2RfYXR0ciwgY3B1LCBOVUxMLCB3YXRjaGRvZ19vdmVyZmxvd19jYWxsYmFjaywgTlVMTCk7CiAKLWhhbmRsZV9lcnI6CiAJLyogc2F2ZSBjcHUwIGVycm9yIGZvciBmdXR1cmUgY29tcGFyaXNpb24gKi8KIAlpZiAoY3B1ID09IDAgJiYgSVNfRVJSKGV2ZW50KSkKIAkJY3B1MF9lcnIgPSBQVFJfRVJSKGV2ZW50KTsKQEAgLTUyNyw2ICs1NDgsMTggQEAKIAkJZ290byBvdXRfc2F2ZTsKIAl9CiAKKwkvKgorCSAqIERpc2FibGUgdGhlIGhhcmQgbG9ja3VwIGRldGVjdG9yIGlmIF9hbnlfIENQVSBmYWlscyB0byBzZXQgdXAKKwkgKiBzZXQgdXAgdGhlIGhhcmR3YXJlIHBlcmYgZXZlbnQuIFRoZSB3YXRjaGRvZygpIGZ1bmN0aW9uIGNoZWNrcworCSAqIHRoZSBOTUlfV0FUQ0hET0dfRU5BQkxFRCBiaXQgcGVyaW9kaWNhbGx5LgorCSAqCisJICogVGhlIGJhcnJpZXJzIGFyZSBmb3Igc3luY2luZyB1cCB3YXRjaGRvZ19lbmFibGVkIGFjcm9zcyBhbGwgdGhlCisJICogY3B1cywgYXMgY2xlYXJfYml0KCkgZG9lcyBub3QgdXNlIGJhcnJpZXJzLgorCSAqLworCXNtcF9tYl9fYmVmb3JlX2F0b21pYygpOworCWNsZWFyX2JpdChOTUlfV0FUQ0hET0dfRU5BQkxFRF9CSVQsICZ3YXRjaGRvZ19lbmFibGVkKTsKKwlzbXBfbWJfX2FmdGVyX2F0b21pYygpOworCiAJLyogc2tpcCBkaXNwbGF5aW5nIHRoZSBzYW1lIGVycm9yIGFnYWluICovCiAJaWYgKGNwdSA+IDAgJiYgKFBUUl9FUlIoZXZlbnQpID09IGNwdTBfZXJyKSkKIAkJcmV0dXJuIFBUUl9FUlIoZXZlbnQpOwpAQCAtNTQwLDYgKzU3Myw5IEBACiAJZWxzZQogCQlwcl9lcnIoImRpc2FibGVkIChjcHUlaSk6IHVuYWJsZSB0byBjcmVhdGUgcGVyZiBldmVudDogJWxkXG4iLAogCQkJY3B1LCBQVFJfRVJSKGV2ZW50KSk7CisKKwlwcl9pbmZvKCJTaHV0dGluZyBkb3duIGhhcmQgbG9ja3VwIGRldGVjdG9yIG9uIGFsbCBjcHVzXG4iKTsKKwogCXJldHVybiBQVFJfRVJSKGV2ZW50KTsKIAogCS8qIHN1Y2Nlc3MgcGF0aCAqLwpAQCAtNTY3LDkgKzYwMywzNyBAQAogCQljcHUwX2VyciA9IDA7CiAJfQogfQorCit2b2lkIHdhdGNoZG9nX25taV9lbmFibGVfYWxsKHZvaWQpCit7CisJaW50IGNwdTsKKworCWlmICghd2F0Y2hkb2dfdXNlcl9lbmFibGVkKQorCQlyZXR1cm47CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJd2F0Y2hkb2dfbm1pX2VuYWJsZShjcHUpOworCXB1dF9vbmxpbmVfY3B1cygpOworfQorCit2b2lkIHdhdGNoZG9nX25taV9kaXNhYmxlX2FsbCh2b2lkKQoreworCWludCBjcHU7CisKKwlpZiAoIXdhdGNoZG9nX3J1bm5pbmcpCisJCXJldHVybjsKKworCWdldF9vbmxpbmVfY3B1cygpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQl3YXRjaGRvZ19ubWlfZGlzYWJsZShjcHUpOworCXB1dF9vbmxpbmVfY3B1cygpOworfQogI2Vsc2UKIHN0YXRpYyBpbnQgd2F0Y2hkb2dfbm1pX2VuYWJsZSh1bnNpZ25lZCBpbnQgY3B1KSB7IHJldHVybiAwOyB9CiBzdGF0aWMgdm9pZCB3YXRjaGRvZ19ubWlfZGlzYWJsZSh1bnNpZ25lZCBpbnQgY3B1KSB7IHJldHVybjsgfQordm9pZCB3YXRjaGRvZ19ubWlfZW5hYmxlX2FsbCh2b2lkKSB7fQordm9pZCB3YXRjaGRvZ19ubWlfZGlzYWJsZV9hbGwodm9pZCkge30KICNlbmRpZiAvKiBDT05GSUdfSEFSRExPQ0tVUF9ERVRFQ1RPUiAqLwogCiBzdGF0aWMgc3RydWN0IHNtcF9ob3RwbHVnX3RocmVhZCB3YXRjaGRvZ190aHJlYWRzID0gewpAQCAtNjAwLDcgKzY2NCw3IEBACiAJCQkJSFJUSU1FUl9NT0RFX1JFTF9QSU5ORUQpOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfdGltZXJzKGludCBjcHUpCitzdGF0aWMgdm9pZCB1cGRhdGVfd2F0Y2hkb2coaW50IGNwdSkKIHsKIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGF0IHBlcmYgZXZlbnQgY291bnRlciB3aWxsIGFkb3B0IHRvIGEgbmV3CkBAIC02MTUsMTcgKzY3OSwxNyBAQAogCXdhdGNoZG9nX25taV9lbmFibGUoY3B1KTsKIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlX3RpbWVyc19hbGxfY3B1cyh2b2lkKQorc3RhdGljIHZvaWQgdXBkYXRlX3dhdGNoZG9nX2FsbF9jcHVzKHZvaWQpCiB7CiAJaW50IGNwdTsKIAogCWdldF9vbmxpbmVfY3B1cygpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQl1cGRhdGVfdGltZXJzKGNwdSk7CisJCXVwZGF0ZV93YXRjaGRvZyhjcHUpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCi1zdGF0aWMgaW50IHdhdGNoZG9nX2VuYWJsZV9hbGxfY3B1cyhib29sIHNhbXBsZV9wZXJpb2RfY2hhbmdlZCkKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfZW5hYmxlX2FsbF9jcHVzKHZvaWQpCiB7CiAJaW50IGVyciA9IDA7CiAKQEAgLTYzNSw4ICs2OTksMTIgQEAKIAkJCXByX2VycigiRmFpbGVkIHRvIGNyZWF0ZSB3YXRjaGRvZyB0aHJlYWRzLCBkaXNhYmxlZFxuIik7CiAJCWVsc2UKIAkJCXdhdGNoZG9nX3J1bm5pbmcgPSAxOwotCX0gZWxzZSBpZiAoc2FtcGxlX3BlcmlvZF9jaGFuZ2VkKSB7Ci0JCXVwZGF0ZV90aW1lcnNfYWxsX2NwdXMoKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBFbmFibGUvZGlzYWJsZSB0aGUgbG9ja3VwIGRldGVjdG9ycyBvcgorCQkgKiBjaGFuZ2UgdGhlIHNhbXBsZSBwZXJpb2QgJ29uIHRoZSBmbHknLgorCQkgKi8KKwkJdXBkYXRlX3dhdGNoZG9nX2FsbF9jcHVzKCk7CiAJfQogCiAJcmV0dXJuIGVycjsKQEAgLTY1NCw0OCArNzIyLDE0OSBAQAogfQogCiAvKgotICogcHJvYyBoYW5kbGVyIGZvciAvcHJvYy9zeXMva2VybmVsL25taV93YXRjaGRvZyx3YXRjaGRvZ190aHJlc2gKKyAqIFVwZGF0ZSB0aGUgcnVuIHN0YXRlIG9mIHRoZSBsb2NrdXAgZGV0ZWN0b3JzLgogICovCi0KLWludCBwcm9jX2Rvd2F0Y2hkb2coc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKLQkJICAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQorc3RhdGljIGludCBwcm9jX3dhdGNoZG9nX3VwZGF0ZSh2b2lkKQogewotCWludCBlcnIsIG9sZF90aHJlc2gsIG9sZF9lbmFibGVkOwotCWJvb2wgb2xkX2hhcmRsb2NrdXA7Ci0Jc3RhdGljIERFRklORV9NVVRFWCh3YXRjaGRvZ19wcm9jX211dGV4KTsKKwlpbnQgZXJyID0gMDsKKworCS8qCisJICogV2F0Y2hkb2cgdGhyZWFkcyB3b24ndCBiZSBzdGFydGVkIGlmIHRoZXkgYXJlIGFscmVhZHkgYWN0aXZlLgorCSAqIFRoZSAnd2F0Y2hkb2dfcnVubmluZycgdmFyaWFibGUgaW4gd2F0Y2hkb2dfKl9hbGxfY3B1cygpIHRha2VzCisJICogY2FyZSBvZiB0aGlzLiBJZiB0aG9zZSB0aHJlYWRzIGFyZSBhbHJlYWR5IGFjdGl2ZSwgdGhlIHNhbXBsZQorCSAqIHBlcmlvZCB3aWxsIGJlIHVwZGF0ZWQgYW5kIHRoZSBsb2NrdXAgZGV0ZWN0b3JzIHdpbGwgYmUgZW5hYmxlZAorCSAqIG9yIGRpc2FibGVkICdvbiB0aGUgZmx5Jy4KKwkgKi8KKwlpZiAod2F0Y2hkb2dfZW5hYmxlZCAmJiB3YXRjaGRvZ190aHJlc2gpCisJCWVyciA9IHdhdGNoZG9nX2VuYWJsZV9hbGxfY3B1cygpOworCWVsc2UKKwkJd2F0Y2hkb2dfZGlzYWJsZV9hbGxfY3B1cygpOworCisJcmV0dXJuIGVycjsKKworfQorCitzdGF0aWMgREVGSU5FX01VVEVYKHdhdGNoZG9nX3Byb2NfbXV0ZXgpOworCisvKgorICogY29tbW9uIGZ1bmN0aW9uIGZvciB3YXRjaGRvZywgbm1pX3dhdGNoZG9nIGFuZCBzb2Z0X3dhdGNoZG9nIHBhcmFtZXRlcgorICoKKyAqIGNhbGxlciAgICAgICAgICAgICB8IHRhYmxlLT5kYXRhIHBvaW50cyB0byB8ICd3aGljaCcgY29udGFpbnMgdGhlIGZsYWcocykKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHByb2Nfd2F0Y2hkb2cgICAgICB8IHdhdGNoZG9nX3VzZXJfZW5hYmxlZCB8IE5NSV9XQVRDSERPR19FTkFCTEVEIG9yJ2VkCisgKiAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCB3aXRoIFNPRlRfV0FUQ0hET0dfRU5BQkxFRAorICogLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcHJvY19ubWlfd2F0Y2hkb2cgIHwgbm1pX3dhdGNoZG9nX2VuYWJsZWQgIHwgTk1JX1dBVENIRE9HX0VOQUJMRUQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHByb2Nfc29mdF93YXRjaGRvZyB8IHNvZnRfd2F0Y2hkb2dfZW5hYmxlZCB8IFNPRlRfV0FUQ0hET0dfRU5BQkxFRAorICovCitzdGF0aWMgaW50IHByb2Nfd2F0Y2hkb2dfY29tbW9uKGludCB3aGljaCwgc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgZXJyLCBvbGQsIG5ldzsKKwlpbnQgKndhdGNoZG9nX3BhcmFtID0gKGludCAqKXRhYmxlLT5kYXRhOwogCiAJbXV0ZXhfbG9jaygmd2F0Y2hkb2dfcHJvY19tdXRleCk7Ci0Jb2xkX3RocmVzaCA9IEFDQ0VTU19PTkNFKHdhdGNoZG9nX3RocmVzaCk7Ci0Jb2xkX2VuYWJsZWQgPSBBQ0NFU1NfT05DRSh3YXRjaGRvZ191c2VyX2VuYWJsZWQpOwotCW9sZF9oYXJkbG9ja3VwID0gd2F0Y2hkb2dfaGFyZGxvY2t1cF9kZXRlY3Rvcl9pc19lbmFibGVkKCk7CiAKKwkvKgorCSAqIElmIHRoZSBwYXJhbWV0ZXIgaXMgYmVpbmcgcmVhZCByZXR1cm4gdGhlIHN0YXRlIG9mIHRoZSBjb3JyZXNwb25kaW5nCisJICogYml0KHMpIGluICd3YXRjaGRvZ19lbmFibGVkJywgZWxzZSB1cGRhdGUgJ3dhdGNoZG9nX2VuYWJsZWQnIGFuZCB0aGUKKwkgKiBydW4gc3RhdGUgb2YgdGhlIGxvY2t1cCBkZXRlY3RvcnMuCisJICovCisJaWYgKCF3cml0ZSkgeworCQkqd2F0Y2hkb2dfcGFyYW0gPSAod2F0Y2hkb2dfZW5hYmxlZCAmIHdoaWNoKSAhPSAwOworCQllcnIgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJfSBlbHNlIHsKKwkJZXJyID0gcHJvY19kb2ludHZlY19taW5tYXgodGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisKKwkJLyoKKwkJICogVGhlcmUgaXMgYSByYWNlIHdpbmRvdyBiZXR3ZWVuIGZldGNoaW5nIHRoZSBjdXJyZW50IHZhbHVlCisJCSAqIGZyb20gJ3dhdGNoZG9nX2VuYWJsZWQnIGFuZCBzdG9yaW5nIHRoZSBuZXcgdmFsdWUuIER1cmluZworCQkgKiB0aGlzIHJhY2Ugd2luZG93LCB3YXRjaGRvZ19ubWlfZW5hYmxlKCkgY2FuIHNuZWFrIGluIGFuZAorCQkgKiBjbGVhciB0aGUgTk1JX1dBVENIRE9HX0VOQUJMRUQgYml0IGluICd3YXRjaGRvZ19lbmFibGVkJy4KKwkJICogVGhlICdjbXB4Y2hnJyBkZXRlY3RzIHRoaXMgcmFjZSBhbmQgdGhlIGxvb3AgcmV0cmllcy4KKwkJICovCisJCWRvIHsKKwkJCW9sZCA9IHdhdGNoZG9nX2VuYWJsZWQ7CisJCQkvKgorCQkJICogSWYgdGhlIHBhcmFtZXRlciB2YWx1ZSBpcyBub3QgemVybyBzZXQgdGhlCisJCQkgKiBjb3JyZXNwb25kaW5nIGJpdChzKSwgZWxzZSBjbGVhciBpdCh0aGVtKS4KKwkJCSAqLworCQkJaWYgKCp3YXRjaGRvZ19wYXJhbSkKKwkJCQluZXcgPSBvbGQgfCB3aGljaDsKKwkJCWVsc2UKKwkJCQluZXcgPSBvbGQgJiB+d2hpY2g7CisJCX0gd2hpbGUgKGNtcHhjaGcoJndhdGNoZG9nX2VuYWJsZWQsIG9sZCwgbmV3KSAhPSBvbGQpOworCisJCS8qCisJCSAqIFVwZGF0ZSB0aGUgcnVuIHN0YXRlIG9mIHRoZSBsb2NrdXAgZGV0ZWN0b3JzLgorCQkgKiBSZXN0b3JlICd3YXRjaGRvZ19lbmFibGVkJyBvbiBmYWlsdXJlLgorCQkgKi8KKwkJZXJyID0gcHJvY193YXRjaGRvZ191cGRhdGUoKTsKKwkJaWYgKGVycikKKwkJCXdhdGNoZG9nX2VuYWJsZWQgPSBvbGQ7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmd2F0Y2hkb2dfcHJvY19tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIC9wcm9jL3N5cy9rZXJuZWwvd2F0Y2hkb2cKKyAqLworaW50IHByb2Nfd2F0Y2hkb2coc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJICB2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gcHJvY193YXRjaGRvZ19jb21tb24oTk1JX1dBVENIRE9HX0VOQUJMRUR8U09GVF9XQVRDSERPR19FTkFCTEVELAorCQkJCSAgICB0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Cit9CisKKy8qCisgKiAvcHJvYy9zeXMva2VybmVsL25taV93YXRjaGRvZworICovCitpbnQgcHJvY19ubWlfd2F0Y2hkb2coc3RydWN0IGN0bF90YWJsZSAqdGFibGUsIGludCB3cml0ZSwKKwkJICAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIHByb2Nfd2F0Y2hkb2dfY29tbW9uKE5NSV9XQVRDSERPR19FTkFCTEVELAorCQkJCSAgICB0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Cit9CisKKy8qCisgKiAvcHJvYy9zeXMva2VybmVsL3NvZnRfd2F0Y2hkb2cKKyAqLworaW50IHByb2Nfc29mdF93YXRjaGRvZyhzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIHByb2Nfd2F0Y2hkb2dfY29tbW9uKFNPRlRfV0FUQ0hET0dfRU5BQkxFRCwKKwkJCQkgICAgdGFibGUsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOworfQorCisvKgorICogL3Byb2Mvc3lzL2tlcm5lbC93YXRjaGRvZ190aHJlc2gKKyAqLworaW50IHByb2Nfd2F0Y2hkb2dfdGhyZXNoKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQkgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGVyciwgb2xkOworCisJbXV0ZXhfbG9jaygmd2F0Y2hkb2dfcHJvY19tdXRleCk7CisKKwlvbGQgPSBBQ0NFU1NfT05DRSh3YXRjaGRvZ190aHJlc2gpOwogCWVyciA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KHRhYmxlLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwogCWlmIChlcnIgfHwgIXdyaXRlKQogCQlnb3RvIG91dDsKIAotCXNldF9zYW1wbGVfcGVyaW9kKCk7CiAJLyoKLQkgKiBXYXRjaGRvZyB0aHJlYWRzIHNob3VsZG4ndCBiZSBlbmFibGVkIGlmIHRoZXkgYXJlCi0JICogZGlzYWJsZWQuIFRoZSAnd2F0Y2hkb2dfcnVubmluZycgdmFyaWFibGUgY2hlY2sgaW4KLQkgKiB3YXRjaGRvZ18qX2FsbF9jcHVzKCkgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiB0aGlzLgorCSAqIFVwZGF0ZSB0aGUgc2FtcGxlIHBlcmlvZC4KKwkgKiBSZXN0b3JlICd3YXRjaGRvZ190aHJlc2gnIG9uIGZhaWx1cmUuCiAJICovCi0JaWYgKHdhdGNoZG9nX3VzZXJfZW5hYmxlZCAmJiB3YXRjaGRvZ190aHJlc2gpIHsKLQkJLyoKLQkJICogUHJldmVudCBhIGNoYW5nZSBpbiB3YXRjaGRvZ190aHJlc2ggYWNjaWRlbnRhbGx5IG92ZXJyaWRpbmcKLQkJICogdGhlIGVuYWJsZW1lbnQgb2YgdGhlIGhhcmRsb2NrdXAgZGV0ZWN0b3IuCi0JCSAqLwotCQlpZiAod2F0Y2hkb2dfdXNlcl9lbmFibGVkICE9IG9sZF9lbmFibGVkKQotCQkJd2F0Y2hkb2dfZW5hYmxlX2hhcmRsb2NrdXBfZGV0ZWN0b3IodHJ1ZSk7Ci0JCWVyciA9IHdhdGNoZG9nX2VuYWJsZV9hbGxfY3B1cyhvbGRfdGhyZXNoICE9IHdhdGNoZG9nX3RocmVzaCk7Ci0JfSBlbHNlCi0JCXdhdGNoZG9nX2Rpc2FibGVfYWxsX2NwdXMoKTsKLQotCS8qIFJlc3RvcmUgb2xkIHZhbHVlcyBvbiBmYWlsdXJlICovCi0JaWYgKGVycikgewotCQl3YXRjaGRvZ190aHJlc2ggPSBvbGRfdGhyZXNoOwotCQl3YXRjaGRvZ191c2VyX2VuYWJsZWQgPSBvbGRfZW5hYmxlZDsKLQkJd2F0Y2hkb2dfZW5hYmxlX2hhcmRsb2NrdXBfZGV0ZWN0b3Iob2xkX2hhcmRsb2NrdXApOwotCX0KKwlzZXRfc2FtcGxlX3BlcmlvZCgpOworCWVyciA9IHByb2Nfd2F0Y2hkb2dfdXBkYXRlKCk7CisJaWYgKGVycikKKwkJd2F0Y2hkb2dfdGhyZXNoID0gb2xkOwogb3V0OgogCW11dGV4X3VubG9jaygmd2F0Y2hkb2dfcHJvY19tdXRleCk7CiAJcmV0dXJuIGVycjsKQEAgLTcwNiw2ICs4NzUsNiBAQAogewogCXNldF9zYW1wbGVfcGVyaW9kKCk7CiAKLQlpZiAod2F0Y2hkb2dfdXNlcl9lbmFibGVkKQotCQl3YXRjaGRvZ19lbmFibGVfYWxsX2NwdXMoZmFsc2UpOworCWlmICh3YXRjaGRvZ19lbmFibGVkKQorCQl3YXRjaGRvZ19lbmFibGVfYWxsX2NwdXMoKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuYwppbmRleCA0MWZmNzViLi41ODZhZDkxIDEwMDY0NAotLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmMKKysrIGIva2VybmVsL3dvcmtxdWV1ZS5jCkBAIC0xNTksNiArMTU5LDcgQEAKIAogCS8qIHNlZSBtYW5hZ2Vfd29ya2VycygpIGZvciBkZXRhaWxzIG9uIHRoZSB0d28gbWFuYWdlciBtdXRleGVzICovCiAJc3RydWN0IG11dGV4CQltYW5hZ2VyX2FyYjsJLyogbWFuYWdlciBhcmJpdHJhdGlvbiAqLworCXN0cnVjdCB3b3JrZXIJCSptYW5hZ2VyOwkvKiBMOiBwdXJlbHkgaW5mb3JtYXRpb25hbCAqLwogCXN0cnVjdCBtdXRleAkJYXR0YWNoX211dGV4OwkvKiBhdHRhY2gvZGV0YWNoIGV4Y2x1c2lvbiAqLwogCXN0cnVjdCBsaXN0X2hlYWQJd29ya2VyczsJLyogQTogYXR0YWNoZWQgd29ya2VycyAqLwogCXN0cnVjdCBjb21wbGV0aW9uCSpkZXRhY2hfY29tcGxldGlvbjsgLyogYWxsIHdvcmtlcnMgZGV0YWNoZWQgKi8KQEAgLTIzMCw3ICsyMzEsNyBAQAogICovCiBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCB7CiAJc3RydWN0IGxpc3RfaGVhZAlwd3FzOwkJLyogV1I6IGFsbCBwd3FzIG9mIHRoaXMgd3EgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CQkvKiBQTDogbGlzdCBvZiBhbGwgd29ya3F1ZXVlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsJCS8qIFBSOiBsaXN0IG9mIGFsbCB3b3JrcXVldWVzICovCiAKIAlzdHJ1Y3QgbXV0ZXgJCW11dGV4OwkJLyogcHJvdGVjdHMgdGhpcyB3cSAqLwogCWludAkJCXdvcmtfY29sb3I7CS8qIFdROiBjdXJyZW50IHdvcmsgY29sb3IgKi8KQEAgLTI1Nyw2ICsyNTgsMTMgQEAKICNlbmRpZgogCWNoYXIJCQluYW1lW1dRX05BTUVfTEVOXTsgLyogSTogd29ya3F1ZXVlIG5hbWUgKi8KIAorCS8qCisJICogRGVzdHJ1Y3Rpb24gb2Ygd29ya3F1ZXVlX3N0cnVjdCBpcyBzY2hlZC1SQ1UgcHJvdGVjdGVkIHRvIGFsbG93CisJICogd2Fsa2luZyB0aGUgd29ya3F1ZXVlcyBsaXN0IHdpdGhvdXQgZ3JhYmJpbmcgd3FfcG9vbF9tdXRleC4KKwkgKiBUaGlzIGlzIHVzZWQgdG8gZHVtcCBhbGwgd29ya3F1ZXVlcyBmcm9tIHN5c3JxLgorCSAqLworCXN0cnVjdCByY3VfaGVhZAkJcmN1OworCiAJLyogaG90IGZpZWxkcyB1c2VkIGR1cmluZyBjb21tYW5kIGlzc3VlLCBhbGlnbmVkIHRvIGNhY2hlbGluZSAqLwogCXVuc2lnbmVkIGludAkJZmxhZ3MgX19fX2NhY2hlbGluZV9hbGlnbmVkOyAvKiBXUTogV1FfKiBmbGFncyAqLwogCXN0cnVjdCBwb29sX3dvcmtxdWV1ZSBfX3BlcmNwdSAqY3B1X3B3cXM7IC8qIEk6IHBlci1jcHUgcHdxcyAqLwpAQCAtMjg4LDcgKzI5Niw3IEBACiBzdGF0aWMgREVGSU5FX01VVEVYKHdxX3Bvb2xfbXV0ZXgpOwkvKiBwcm90ZWN0cyBwb29scyBhbmQgd29ya3F1ZXVlcyBsaXN0ICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHdxX21heWRheV9sb2NrKTsJLyogcHJvdGVjdHMgd3EtPm1heWRheXMgbGlzdCAqLwogCi1zdGF0aWMgTElTVF9IRUFEKHdvcmtxdWV1ZXMpOwkJLyogUEw6IGxpc3Qgb2YgYWxsIHdvcmtxdWV1ZXMgKi8KK3N0YXRpYyBMSVNUX0hFQUQod29ya3F1ZXVlcyk7CQkvKiBQUjogbGlzdCBvZiBhbGwgd29ya3F1ZXVlcyAqLwogc3RhdGljIGJvb2wgd29ya3F1ZXVlX2ZyZWV6aW5nOwkJLyogUEw6IGhhdmUgd3FzIHN0YXJ0ZWQgZnJlZXppbmc/ICovCiAKIC8qIHRoZSBwZXItY3B1IHdvcmtlciBwb29scyAqLwpAQCAtMzI0LDYgKzMzMiw3IEBACiBzdGF0aWMgaW50IHdvcmtlcl90aHJlYWQodm9pZCAqX193b3JrZXIpOwogc3RhdGljIHZvaWQgY29weV93b3JrcXVldWVfYXR0cnMoc3RydWN0IHdvcmtxdWV1ZV9hdHRycyAqdG8sCiAJCQkJIGNvbnN0IHN0cnVjdCB3b3JrcXVldWVfYXR0cnMgKmZyb20pOworc3RhdGljIHZvaWQgd29ya3F1ZXVlX3N5c2ZzX3VucmVnaXN0ZXIoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKTsKIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3dvcmtxdWV1ZS5oPgpAQCAtMTkxMSw5ICsxOTIwLDExIEBACiAJICovCiAJaWYgKCFtdXRleF90cnlsb2NrKCZwb29sLT5tYW5hZ2VyX2FyYikpCiAJCXJldHVybiBmYWxzZTsKKwlwb29sLT5tYW5hZ2VyID0gd29ya2VyOwogCiAJbWF5YmVfY3JlYXRlX3dvcmtlcihwb29sKTsKIAorCXBvb2wtPm1hbmFnZXIgPSBOVUxMOwogCW11dGV4X3VubG9jaygmcG9vbC0+bWFuYWdlcl9hcmIpOwogCXJldHVybiB0cnVlOwogfQpAQCAtMjMwMyw2ICsyMzE0LDcgQEAKIHN0cnVjdCB3cV9iYXJyaWVyIHsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKIAlzdHJ1Y3QgY29tcGxldGlvbglkb25lOworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJLyogcHVyZWx5IGluZm9ybWF0aW9uYWwgKi8KIH07CiAKIHN0YXRpYyB2b2lkIHdxX2JhcnJpZXJfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0yMzUxLDYgKzIzNjMsNyBAQAogCUlOSVRfV09SS19PTlNUQUNLKCZiYXJyLT53b3JrLCB3cV9iYXJyaWVyX2Z1bmMpOwogCV9fc2V0X2JpdChXT1JLX1NUUlVDVF9QRU5ESU5HX0JJVCwgd29ya19kYXRhX2JpdHMoJmJhcnItPndvcmspKTsKIAlpbml0X2NvbXBsZXRpb24oJmJhcnItPmRvbmUpOworCWJhcnItPnRhc2sgPSBjdXJyZW50OwogCiAJLyoKIAkgKiBJZiBAdGFyZ2V0IGlzIGN1cnJlbnRseSBiZWluZyBleGVjdXRlZCwgc2NoZWR1bGUgdGhlCkBAIC0yOTg5LDMyMyArMzAwMiw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChleGVjdXRlX2luX3Byb2Nlc3NfY29udGV4dCk7CiAKLSNpZmRlZiBDT05GSUdfU1lTRlMKLS8qCi0gKiBXb3JrcXVldWVzIHdpdGggV1FfU1lTRlMgZmxhZyBzZXQgaXMgdmlzaWJsZSB0byB1c2VybGFuZCB2aWEKLSAqIC9zeXMvYnVzL3dvcmtxdWV1ZS9kZXZpY2VzL1dRX05BTUUuICBBbGwgdmlzaWJsZSB3b3JrcXVldWVzIGhhdmUgdGhlCi0gKiBmb2xsb3dpbmcgYXR0cmlidXRlcy4KLSAqCi0gKiAgcGVyX2NwdQlSTyBib29sCTogd2hldGhlciB0aGUgd29ya3F1ZXVlIGlzIHBlci1jcHUgb3IgdW5ib3VuZAotICogIG1heF9hY3RpdmUJUlcgaW50CTogbWF4aW11bSBudW1iZXIgb2YgaW4tZmxpZ2h0IHdvcmsgaXRlbXMKLSAqCi0gKiBVbmJvdW5kIHdvcmtxdWV1ZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGV4dHJhIGF0dHJpYnV0ZXMuCi0gKgotICogIGlkCQlSTyBpbnQJOiB0aGUgYXNzb2NpYXRlZCBwb29sIElECi0gKiAgbmljZQlSVyBpbnQJOiBuaWNlIHZhbHVlIG9mIHRoZSB3b3JrZXJzCi0gKiAgY3B1bWFzawlSVyBtYXNrCTogYml0bWFzayBvZiBhbGxvd2VkIENQVXMgZm9yIHRoZSB3b3JrZXJzCi0gKi8KLXN0cnVjdCB3cV9kZXZpY2UgewotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CQkqd3E7Ci0Jc3RydWN0IGRldmljZQkJCWRldjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZGV2X3RvX3dxKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgd3FfZGV2aWNlICp3cV9kZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgd3FfZGV2aWNlLCBkZXYpOwotCi0JcmV0dXJuIHdxX2Rldi0+d3E7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHBlcl9jcHVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBkZXZfdG9fd3EoZGV2KTsKLQotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgKGJvb2wpISh3cS0+ZmxhZ3MgJiBXUV9VTkJPVU5EKSk7Ci19Ci1zdGF0aWMgREVWSUNFX0FUVFJfUk8ocGVyX2NwdSk7Ci0KLXN0YXRpYyBzc2l6ZV90IG1heF9hY3RpdmVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBkZXZfdG9fd3EoZGV2KTsKLQotCXJldHVybiBzY25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgd3EtPnNhdmVkX21heF9hY3RpdmUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBtYXhfYWN0aXZlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY29uc3QgY2hhciAqYnVmLAotCQkJCXNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBkZXZfdG9fd3EoZGV2KTsKLQlpbnQgdmFsOwotCi0JaWYgKHNzY2FuZihidWYsICIlZCIsICZ2YWwpICE9IDEgfHwgdmFsIDw9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jd29ya3F1ZXVlX3NldF9tYXhfYWN0aXZlKHdxLCB2YWwpOwotCXJldHVybiBjb3VudDsKLX0KLXN0YXRpYyBERVZJQ0VfQVRUUl9SVyhtYXhfYWN0aXZlKTsKLQotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKndxX3N5c2ZzX2F0dHJzW10gPSB7Ci0JJmRldl9hdHRyX3Blcl9jcHUuYXR0ciwKLQkmZGV2X2F0dHJfbWF4X2FjdGl2ZS5hdHRyLAotCU5VTEwsCi19OwotQVRUUklCVVRFX0dST1VQUyh3cV9zeXNmcyk7Ci0KLXN0YXRpYyBzc2l6ZV90IHdxX3Bvb2xfaWRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxID0gZGV2X3RvX3dxKGRldik7Ci0JY29uc3QgY2hhciAqZGVsaW0gPSAiIjsKLQlpbnQgbm9kZSwgd3JpdHRlbiA9IDA7Ci0KLQlyY3VfcmVhZF9sb2NrX3NjaGVkKCk7Ci0JZm9yX2VhY2hfbm9kZShub2RlKSB7Ci0JCXdyaXR0ZW4gKz0gc2NucHJpbnRmKGJ1ZiArIHdyaXR0ZW4sIFBBR0VfU0laRSAtIHdyaXR0ZW4sCi0JCQkJICAgICAiJXMlZDolZCIsIGRlbGltLCBub2RlLAotCQkJCSAgICAgdW5ib3VuZF9wd3FfYnlfbm9kZSh3cSwgbm9kZSktPnBvb2wtPmlkKTsKLQkJZGVsaW0gPSAiICI7Ci0JfQotCXdyaXR0ZW4gKz0gc2NucHJpbnRmKGJ1ZiArIHdyaXR0ZW4sIFBBR0VfU0laRSAtIHdyaXR0ZW4sICJcbiIpOwotCXJjdV9yZWFkX3VubG9ja19zY2hlZCgpOwotCi0JcmV0dXJuIHdyaXR0ZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHdxX25pY2Vfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBkZXZfdG9fd3EoZGV2KTsKLQlpbnQgd3JpdHRlbjsKLQotCW11dGV4X2xvY2soJndxLT5tdXRleCk7Ci0Jd3JpdHRlbiA9IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB3cS0+dW5ib3VuZF9hdHRycy0+bmljZSk7Ci0JbXV0ZXhfdW5sb2NrKCZ3cS0+bXV0ZXgpOwotCi0JcmV0dXJuIHdyaXR0ZW47Ci19Ci0KLS8qIHByZXBhcmUgd29ya3F1ZXVlX2F0dHJzIGZvciBzeXNmcyBzdG9yZSBvcGVyYXRpb25zICovCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9hdHRycyAqd3Ffc3lzZnNfcHJlcF9hdHRycyhzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpCi17Ci0Jc3RydWN0IHdvcmtxdWV1ZV9hdHRycyAqYXR0cnM7Ci0KLQlhdHRycyA9IGFsbG9jX3dvcmtxdWV1ZV9hdHRycyhHRlBfS0VSTkVMKTsKLQlpZiAoIWF0dHJzKQotCQlyZXR1cm4gTlVMTDsKLQotCW11dGV4X2xvY2soJndxLT5tdXRleCk7Ci0JY29weV93b3JrcXVldWVfYXR0cnMoYXR0cnMsIHdxLT51bmJvdW5kX2F0dHJzKTsKLQltdXRleF91bmxvY2soJndxLT5tdXRleCk7Ci0JcmV0dXJuIGF0dHJzOwotfQotCi1zdGF0aWMgc3NpemVfdCB3cV9uaWNlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGRldl90b193cShkZXYpOwotCXN0cnVjdCB3b3JrcXVldWVfYXR0cnMgKmF0dHJzOwotCWludCByZXQ7Ci0KLQlhdHRycyA9IHdxX3N5c2ZzX3ByZXBfYXR0cnMod3EpOwotCWlmICghYXR0cnMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKHNzY2FuZihidWYsICIlZCIsICZhdHRycy0+bmljZSkgPT0gMSAmJgotCSAgICBhdHRycy0+bmljZSA+PSBNSU5fTklDRSAmJiBhdHRycy0+bmljZSA8PSBNQVhfTklDRSkKLQkJcmV0ID0gYXBwbHlfd29ya3F1ZXVlX2F0dHJzKHdxLCBhdHRycyk7Ci0JZWxzZQotCQlyZXQgPSAtRUlOVkFMOwotCi0JZnJlZV93b3JrcXVldWVfYXR0cnMoYXR0cnMpOwotCXJldHVybiByZXQgPzogY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHdxX2NwdW1hc2tfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkgICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBkZXZfdG9fd3EoZGV2KTsKLQlpbnQgd3JpdHRlbjsKLQotCW11dGV4X2xvY2soJndxLT5tdXRleCk7Ci0Jd3JpdHRlbiA9IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiUqcGJcbiIsCi0JCQkgICAgY3B1bWFza19wcl9hcmdzKHdxLT51bmJvdW5kX2F0dHJzLT5jcHVtYXNrKSk7Ci0JbXV0ZXhfdW5sb2NrKCZ3cS0+bXV0ZXgpOwotCXJldHVybiB3cml0dGVuOwotfQotCi1zdGF0aWMgc3NpemVfdCB3cV9jcHVtYXNrX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBkZXZfdG9fd3EoZGV2KTsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX2F0dHJzICphdHRyczsKLQlpbnQgcmV0OwotCi0JYXR0cnMgPSB3cV9zeXNmc19wcmVwX2F0dHJzKHdxKTsKLQlpZiAoIWF0dHJzKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldCA9IGNwdW1hc2tfcGFyc2UoYnVmLCBhdHRycy0+Y3B1bWFzayk7Ci0JaWYgKCFyZXQpCi0JCXJldCA9IGFwcGx5X3dvcmtxdWV1ZV9hdHRycyh3cSwgYXR0cnMpOwotCi0JZnJlZV93b3JrcXVldWVfYXR0cnMoYXR0cnMpOwotCXJldHVybiByZXQgPzogY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHdxX251bWFfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJICAgIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBkZXZfdG9fd3EoZGV2KTsKLQlpbnQgd3JpdHRlbjsKLQotCW11dGV4X2xvY2soJndxLT5tdXRleCk7Ci0Jd3JpdHRlbiA9IHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLAotCQkJICAgICF3cS0+dW5ib3VuZF9hdHRycy0+bm9fbnVtYSk7Ci0JbXV0ZXhfdW5sb2NrKCZ3cS0+bXV0ZXgpOwotCi0JcmV0dXJuIHdyaXR0ZW47Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHdxX251bWFfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxID0gZGV2X3RvX3dxKGRldik7Ci0Jc3RydWN0IHdvcmtxdWV1ZV9hdHRycyAqYXR0cnM7Ci0JaW50IHYsIHJldDsKLQotCWF0dHJzID0gd3Ffc3lzZnNfcHJlcF9hdHRycyh3cSk7Ci0JaWYgKCFhdHRycykKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXQgPSAtRUlOVkFMOwotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmdikgPT0gMSkgewotCQlhdHRycy0+bm9fbnVtYSA9ICF2OwotCQlyZXQgPSBhcHBseV93b3JrcXVldWVfYXR0cnMod3EsIGF0dHJzKTsKLQl9Ci0KLQlmcmVlX3dvcmtxdWV1ZV9hdHRycyhhdHRycyk7Ci0JcmV0dXJuIHJldCA/OiBjb3VudDsKLX0KLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIHdxX3N5c2ZzX3VuYm91bmRfYXR0cnNbXSA9IHsKLQlfX0FUVFIocG9vbF9pZHMsIDA0NDQsIHdxX3Bvb2xfaWRzX3Nob3csIE5VTEwpLAotCV9fQVRUUihuaWNlLCAwNjQ0LCB3cV9uaWNlX3Nob3csIHdxX25pY2Vfc3RvcmUpLAotCV9fQVRUUihjcHVtYXNrLCAwNjQ0LCB3cV9jcHVtYXNrX3Nob3csIHdxX2NwdW1hc2tfc3RvcmUpLAotCV9fQVRUUihudW1hLCAwNjQ0LCB3cV9udW1hX3Nob3csIHdxX251bWFfc3RvcmUpLAotCV9fQVRUUl9OVUxMLAotfTsKLQotc3RhdGljIHN0cnVjdCBidXNfdHlwZSB3cV9zdWJzeXMgPSB7Ci0JLm5hbWUJCQkJPSAid29ya3F1ZXVlIiwKLQkuZGV2X2dyb3VwcwkJCT0gd3Ffc3lzZnNfZ3JvdXBzLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgd3Ffc3lzZnNfaW5pdCh2b2lkKQotewotCXJldHVybiBzdWJzeXNfdmlydHVhbF9yZWdpc3Rlcigmd3Ffc3Vic3lzLCBOVUxMKTsKLX0KLWNvcmVfaW5pdGNhbGwod3Ffc3lzZnNfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIHdxX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgd3FfZGV2aWNlICp3cV9kZXYgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgd3FfZGV2aWNlLCBkZXYpOwotCi0Ja2ZyZWUod3FfZGV2KTsKLX0KLQotLyoqCi0gKiB3b3JrcXVldWVfc3lzZnNfcmVnaXN0ZXIgLSBtYWtlIGEgd29ya3F1ZXVlIHZpc2libGUgaW4gc3lzZnMKLSAqIEB3cTogdGhlIHdvcmtxdWV1ZSB0byByZWdpc3RlcgotICoKLSAqIEV4cG9zZSBAd3EgaW4gc3lzZnMgdW5kZXIgL3N5cy9idXMvd29ya3F1ZXVlL2RldmljZXMuCi0gKiBhbGxvY193b3JrcXVldWUqKCkgYXV0b21hdGljYWxseSBjYWxscyB0aGlzIGZ1bmN0aW9uIGlmIFdRX1NZU0ZTIGlzIHNldAotICogd2hpY2ggaXMgdGhlIHByZWZlcnJlZCBtZXRob2QuCi0gKgotICogV29ya3F1ZXVlIHVzZXIgc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IGlmZiBpdCB3YW50cyB0byBhcHBseQotICogd29ya3F1ZXVlX2F0dHJzIGJlZm9yZSBtYWtpbmcgdGhlIHdvcmtxdWV1ZSB2aXNpYmxlIGluIHN5c2ZzOyBvdGhlcndpc2UsCi0gKiBhcHBseV93b3JrcXVldWVfYXR0cnMoKSBtYXkgcmFjZSBhZ2FpbnN0IHVzZXJsYW5kIHVwZGF0aW5nIHRoZQotICogYXR0cmlidXRlcy4KLSAqCi0gKiBSZXR1cm46IDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCi0gKi8KLWludCB3b3JrcXVldWVfc3lzZnNfcmVnaXN0ZXIoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKQotewotCXN0cnVjdCB3cV9kZXZpY2UgKndxX2RldjsKLQlpbnQgcmV0OwotCi0JLyoKLQkgKiBBZGp1c3RpbmcgbWF4X2FjdGl2ZSBvciBjcmVhdGluZyBuZXcgcHdxcyBieSBhcHBseXRpbmcKLQkgKiBhdHRyaWJ1dGVzIGJyZWFrcyBvcmRlcmluZyBndWFyYW50ZWUuICBEaXNhbGxvdyBleHBvc2luZyBvcmRlcmVkCi0JICogd29ya3F1ZXVlcy4KLQkgKi8KLQlpZiAoV0FSTl9PTih3cS0+ZmxhZ3MgJiBfX1dRX09SREVSRUQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXdxLT53cV9kZXYgPSB3cV9kZXYgPSBremFsbG9jKHNpemVvZigqd3FfZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF3cV9kZXYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jd3FfZGV2LT53cSA9IHdxOwotCXdxX2Rldi0+ZGV2LmJ1cyA9ICZ3cV9zdWJzeXM7Ci0Jd3FfZGV2LT5kZXYuaW5pdF9uYW1lID0gd3EtPm5hbWU7Ci0Jd3FfZGV2LT5kZXYucmVsZWFzZSA9IHdxX2RldmljZV9yZWxlYXNlOwotCi0JLyoKLQkgKiB1bmJvdW5kX2F0dHJzIGFyZSBjcmVhdGVkIHNlcGFyYXRlbHkuICBTdXBwcmVzcyB1ZXZlbnQgdW50aWwKLQkgKiBldmVyeXRoaW5nIGlzIHJlYWR5LgotCSAqLwotCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKCZ3cV9kZXYtPmRldiwgdHJ1ZSk7Ci0KLQlyZXQgPSBkZXZpY2VfcmVnaXN0ZXIoJndxX2Rldi0+ZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWtmcmVlKHdxX2Rldik7Ci0JCXdxLT53cV9kZXYgPSBOVUxMOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmICh3cS0+ZmxhZ3MgJiBXUV9VTkJPVU5EKSB7Ci0JCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyOwotCi0JCWZvciAoYXR0ciA9IHdxX3N5c2ZzX3VuYm91bmRfYXR0cnM7IGF0dHItPmF0dHIubmFtZTsgYXR0cisrKSB7Ci0JCQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJndxX2Rldi0+ZGV2LCBhdHRyKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlkZXZpY2VfdW5yZWdpc3Rlcigmd3FfZGV2LT5kZXYpOwotCQkJCXdxLT53cV9kZXYgPSBOVUxMOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlkZXZfc2V0X3VldmVudF9zdXBwcmVzcygmd3FfZGV2LT5kZXYsIGZhbHNlKTsKLQlrb2JqZWN0X3VldmVudCgmd3FfZGV2LT5kZXYua29iaiwgS09CSl9BREQpOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHdvcmtxdWV1ZV9zeXNmc191bnJlZ2lzdGVyIC0gdW5kbyB3b3JrcXVldWVfc3lzZnNfcmVnaXN0ZXIoKQotICogQHdxOiB0aGUgd29ya3F1ZXVlIHRvIHVucmVnaXN0ZXIKLSAqCi0gKiBJZiBAd3EgaXMgcmVnaXN0ZXJlZCB0byBzeXNmcyBieSB3b3JrcXVldWVfc3lzZnNfcmVnaXN0ZXIoKSwgdW5yZWdpc3Rlci4KLSAqLwotc3RhdGljIHZvaWQgd29ya3F1ZXVlX3N5c2ZzX3VucmVnaXN0ZXIoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKQotewotCXN0cnVjdCB3cV9kZXZpY2UgKndxX2RldiA9IHdxLT53cV9kZXY7Ci0KLQlpZiAoIXdxLT53cV9kZXYpCi0JCXJldHVybjsKLQotCXdxLT53cV9kZXYgPSBOVUxMOwotCWRldmljZV91bnJlZ2lzdGVyKCZ3cV9kZXYtPmRldik7Ci19Ci0jZWxzZQkvKiBDT05GSUdfU1lTRlMgKi8KLXN0YXRpYyB2b2lkIHdvcmtxdWV1ZV9zeXNmc191bnJlZ2lzdGVyKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSkJeyB9Ci0jZW5kaWYJLyogQ09ORklHX1NZU0ZTICovCi0KIC8qKgogICogZnJlZV93b3JrcXVldWVfYXR0cnMgLSBmcmVlIGEgd29ya3F1ZXVlX2F0dHJzCiAgKiBAYXR0cnM6IHdvcmtxdWV1ZV9hdHRycyB0byBmcmVlCkBAIC0zNDI0LDYgKzMxMjAsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgcmN1X2ZyZWVfd3Eoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxID0KKwkJY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QsIHJjdSk7CisKKwlpZiAoISh3cS0+ZmxhZ3MgJiBXUV9VTkJPVU5EKSkKKwkJZnJlZV9wZXJjcHUod3EtPmNwdV9wd3FzKTsKKwllbHNlCisJCWZyZWVfd29ya3F1ZXVlX2F0dHJzKHdxLT51bmJvdW5kX2F0dHJzKTsKKworCWtmcmVlKHdxLT5yZXNjdWVyKTsKKwlrZnJlZSh3cSk7Cit9CisKIHN0YXRpYyB2b2lkIHJjdV9mcmVlX3Bvb2woc3RydWN0IHJjdV9oZWFkICpyY3UpCiB7CiAJc3RydWN0IHdvcmtlcl9wb29sICpwb29sID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHdvcmtlcl9wb29sLCByY3UpOwpAQCAtMzYwMSwxMiArMzMxMSwxMCBAQAogCiAJLyoKIAkgKiBJZiB3ZSdyZSB0aGUgbGFzdCBwd3EgZ29pbmcgYXdheSwgQHdxIGlzIGFscmVhZHkgZGVhZCBhbmQgbm8gb25lCi0JICogaXMgZ29ubmEgYWNjZXNzIGl0IGFueW1vcmUuICBGcmVlIGl0LgorCSAqIGlzIGdvbm5hIGFjY2VzcyBpdCBhbnltb3JlLiAgU2NoZWR1bGUgUkNVIGZyZWUuCiAJICovCi0JaWYgKGlzX2xhc3QpIHsKLQkJZnJlZV93b3JrcXVldWVfYXR0cnMod3EtPnVuYm91bmRfYXR0cnMpOwotCQlrZnJlZSh3cSk7Ci0JfQorCWlmIChpc19sYXN0KQorCQljYWxsX3JjdV9zY2hlZCgmd3EtPnJjdSwgcmN1X2ZyZWVfd3EpOwogfQogCiAvKioKQEAgLTQxNDMsNyArMzg1MSw3IEBACiAJCXB3cV9hZGp1c3RfbWF4X2FjdGl2ZShwd3EpOwogCW11dGV4X3VubG9jaygmd3EtPm11dGV4KTsKIAotCWxpc3RfYWRkKCZ3cS0+bGlzdCwgJndvcmtxdWV1ZXMpOworCWxpc3RfYWRkX3RhaWxfcmN1KCZ3cS0+bGlzdCwgJndvcmtxdWV1ZXMpOwogCiAJbXV0ZXhfdW5sb2NrKCZ3cV9wb29sX211dGV4KTsKIApAQCAtNDE5OSwyNCArMzkwNywyMCBAQAogCSAqIGZsdXNoaW5nIGlzIGNvbXBsZXRlIGluIGNhc2UgZnJlZXplIHJhY2VzIHVzLgogCSAqLwogCW11dGV4X2xvY2soJndxX3Bvb2xfbXV0ZXgpOwotCWxpc3RfZGVsX2luaXQoJndxLT5saXN0KTsKKwlsaXN0X2RlbF9yY3UoJndxLT5saXN0KTsKIAltdXRleF91bmxvY2soJndxX3Bvb2xfbXV0ZXgpOwogCiAJd29ya3F1ZXVlX3N5c2ZzX3VucmVnaXN0ZXIod3EpOwogCi0JaWYgKHdxLT5yZXNjdWVyKSB7CisJaWYgKHdxLT5yZXNjdWVyKQogCQlrdGhyZWFkX3N0b3Aod3EtPnJlc2N1ZXItPnRhc2spOwotCQlrZnJlZSh3cS0+cmVzY3Vlcik7Ci0JCXdxLT5yZXNjdWVyID0gTlVMTDsKLQl9CiAKIAlpZiAoISh3cS0+ZmxhZ3MgJiBXUV9VTkJPVU5EKSkgewogCQkvKgogCQkgKiBUaGUgYmFzZSByZWYgaXMgbmV2ZXIgZHJvcHBlZCBvbiBwZXItY3B1IHB3cXMuICBEaXJlY3RseQotCQkgKiBmcmVlIHRoZSBwd3FzIGFuZCB3cS4KKwkJICogc2NoZWR1bGUgUkNVIGZyZWUuCiAJCSAqLwotCQlmcmVlX3BlcmNwdSh3cS0+Y3B1X3B3cXMpOwotCQlrZnJlZSh3cSk7CisJCWNhbGxfcmN1X3NjaGVkKCZ3cS0+cmN1LCByY3VfZnJlZV93cSk7CiAJfSBlbHNlIHsKIAkJLyoKIAkJICogV2UncmUgdGhlIHNvbGUgYWNjZXNzb3Igb2YgQHdxIGF0IHRoaXMgcG9pbnQuICBEaXJlY3RseQpAQCAtNDQzNyw2ICs0MTQxLDE2NiBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgcHJfY29udF9wb29sX2luZm8oc3RydWN0IHdvcmtlcl9wb29sICpwb29sKQoreworCXByX2NvbnQoIiBjcHVzPSUqcGJsIiwgbnJfY3B1bWFza19iaXRzLCBwb29sLT5hdHRycy0+Y3B1bWFzayk7CisJaWYgKHBvb2wtPm5vZGUgIT0gTlVNQV9OT19OT0RFKQorCQlwcl9jb250KCIgbm9kZT0lZCIsIHBvb2wtPm5vZGUpOworCXByX2NvbnQoIiBmbGFncz0weCV4IG5pY2U9JWQiLCBwb29sLT5mbGFncywgcG9vbC0+YXR0cnMtPm5pY2UpOworfQorCitzdGF0aWMgdm9pZCBwcl9jb250X3dvcmsoYm9vbCBjb21tYSwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCWlmICh3b3JrLT5mdW5jID09IHdxX2JhcnJpZXJfZnVuYykgeworCQlzdHJ1Y3Qgd3FfYmFycmllciAqYmFycjsKKworCQliYXJyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3cV9iYXJyaWVyLCB3b3JrKTsKKworCQlwcl9jb250KCIlcyBCQVIoJWQpIiwgY29tbWEgPyAiLCIgOiAiIiwKKwkJCXRhc2tfcGlkX25yKGJhcnItPnRhc2spKTsKKwl9IGVsc2UgeworCQlwcl9jb250KCIlcyAlcGYiLCBjb21tYSA/ICIsIiA6ICIiLCB3b3JrLT5mdW5jKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcHdxKHN0cnVjdCBwb29sX3dvcmtxdWV1ZSAqcHdxKQoreworCXN0cnVjdCB3b3JrZXJfcG9vbCAqcG9vbCA9IHB3cS0+cG9vbDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcms7CisJc3RydWN0IHdvcmtlciAqd29ya2VyOworCWJvb2wgaGFzX2luX2ZsaWdodCA9IGZhbHNlLCBoYXNfcGVuZGluZyA9IGZhbHNlOworCWludCBia3Q7CisKKwlwcl9pbmZvKCIgIHB3cSAlZDoiLCBwb29sLT5pZCk7CisJcHJfY29udF9wb29sX2luZm8ocG9vbCk7CisKKwlwcl9jb250KCIgYWN0aXZlPSVkLyVkJXNcbiIsIHB3cS0+bnJfYWN0aXZlLCBwd3EtPm1heF9hY3RpdmUsCisJCSFsaXN0X2VtcHR5KCZwd3EtPm1heWRheV9ub2RlKSA/ICIgTUFZREFZIiA6ICIiKTsKKworCWhhc2hfZm9yX2VhY2gocG9vbC0+YnVzeV9oYXNoLCBia3QsIHdvcmtlciwgaGVudHJ5KSB7CisJCWlmICh3b3JrZXItPmN1cnJlbnRfcHdxID09IHB3cSkgeworCQkJaGFzX2luX2ZsaWdodCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaGFzX2luX2ZsaWdodCkgeworCQlib29sIGNvbW1hID0gZmFsc2U7CisKKwkJcHJfaW5mbygiICAgIGluLWZsaWdodDoiKTsKKwkJaGFzaF9mb3JfZWFjaChwb29sLT5idXN5X2hhc2gsIGJrdCwgd29ya2VyLCBoZW50cnkpIHsKKwkJCWlmICh3b3JrZXItPmN1cnJlbnRfcHdxICE9IHB3cSkKKwkJCQljb250aW51ZTsKKworCQkJcHJfY29udCgiJXMgJWQlczolcGYiLCBjb21tYSA/ICIsIiA6ICIiLAorCQkJCXRhc2tfcGlkX25yKHdvcmtlci0+dGFzayksCisJCQkJd29ya2VyID09IHB3cS0+d3EtPnJlc2N1ZXIgPyAiKFJFU0NVRVIpIiA6ICIiLAorCQkJCXdvcmtlci0+Y3VycmVudF9mdW5jKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkod29yaywgJndvcmtlci0+c2NoZWR1bGVkLCBlbnRyeSkKKwkJCQlwcl9jb250X3dvcmsoZmFsc2UsIHdvcmspOworCQkJY29tbWEgPSB0cnVlOworCQl9CisJCXByX2NvbnQoIlxuIik7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh3b3JrLCAmcG9vbC0+d29ya2xpc3QsIGVudHJ5KSB7CisJCWlmIChnZXRfd29ya19wd3Eod29yaykgPT0gcHdxKSB7CisJCQloYXNfcGVuZGluZyA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaGFzX3BlbmRpbmcpIHsKKwkJYm9vbCBjb21tYSA9IGZhbHNlOworCisJCXByX2luZm8oIiAgICBwZW5kaW5nOiIpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdvcmssICZwb29sLT53b3JrbGlzdCwgZW50cnkpIHsKKwkJCWlmIChnZXRfd29ya19wd3Eod29yaykgIT0gcHdxKQorCQkJCWNvbnRpbnVlOworCisJCQlwcl9jb250X3dvcmsoY29tbWEsIHdvcmspOworCQkJY29tbWEgPSAhKCp3b3JrX2RhdGFfYml0cyh3b3JrKSAmIFdPUktfU1RSVUNUX0xJTktFRCk7CisJCX0KKwkJcHJfY29udCgiXG4iKTsKKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJnB3cS0+ZGVsYXllZF93b3JrcykpIHsKKwkJYm9vbCBjb21tYSA9IGZhbHNlOworCisJCXByX2luZm8oIiAgICBkZWxheWVkOiIpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdvcmssICZwd3EtPmRlbGF5ZWRfd29ya3MsIGVudHJ5KSB7CisJCQlwcl9jb250X3dvcmsoY29tbWEsIHdvcmspOworCQkJY29tbWEgPSAhKCp3b3JrX2RhdGFfYml0cyh3b3JrKSAmIFdPUktfU1RSVUNUX0xJTktFRCk7CisJCX0KKwkJcHJfY29udCgiXG4iKTsKKwl9Cit9CisKKy8qKgorICogc2hvd193b3JrcXVldWVfc3RhdGUgLSBkdW1wIHdvcmtxdWV1ZSBzdGF0ZQorICoKKyAqIENhbGxlZCBmcm9tIGEgc3lzcnEgaGFuZGxlciBhbmQgcHJpbnRzIG91dCBhbGwgYnVzeSB3b3JrcXVldWVzIGFuZAorICogcG9vbHMuCisgKi8KK3ZvaWQgc2hvd193b3JrcXVldWVfc3RhdGUodm9pZCkKK3sKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3E7CisJc3RydWN0IHdvcmtlcl9wb29sICpwb29sOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHBpOworCisJcmN1X3JlYWRfbG9ja19zY2hlZCgpOworCisJcHJfaW5mbygiU2hvd2luZyBidXN5IHdvcmtxdWV1ZXMgYW5kIHdvcmtlciBwb29sczpcbiIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uod3EsICZ3b3JrcXVldWVzLCBsaXN0KSB7CisJCXN0cnVjdCBwb29sX3dvcmtxdWV1ZSAqcHdxOworCQlib29sIGlkbGUgPSB0cnVlOworCisJCWZvcl9lYWNoX3B3cShwd3EsIHdxKSB7CisJCQlpZiAocHdxLT5ucl9hY3RpdmUgfHwgIWxpc3RfZW1wdHkoJnB3cS0+ZGVsYXllZF93b3JrcykpIHsKKwkJCQlpZGxlID0gZmFsc2U7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGlkbGUpCisJCQljb250aW51ZTsKKworCQlwcl9pbmZvKCJ3b3JrcXVldWUgJXM6IGZsYWdzPTB4JXhcbiIsIHdxLT5uYW1lLCB3cS0+ZmxhZ3MpOworCisJCWZvcl9lYWNoX3B3cShwd3EsIHdxKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHdxLT5wb29sLT5sb2NrLCBmbGFncyk7CisJCQlpZiAocHdxLT5ucl9hY3RpdmUgfHwgIWxpc3RfZW1wdHkoJnB3cS0+ZGVsYXllZF93b3JrcykpCisJCQkJc2hvd19wd3EocHdxKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnB3cS0+cG9vbC0+bG9jaywgZmxhZ3MpOworCQl9CisJfQorCisJZm9yX2VhY2hfcG9vbChwb29sLCBwaSkgeworCQlzdHJ1Y3Qgd29ya2VyICp3b3JrZXI7CisJCWJvb2wgZmlyc3QgPSB0cnVlOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJCWlmIChwb29sLT5ucl93b3JrZXJzID09IHBvb2wtPm5yX2lkbGUpCisJCQlnb3RvIG5leHRfcG9vbDsKKworCQlwcl9pbmZvKCJwb29sICVkOiIsIHBvb2wtPmlkKTsKKwkJcHJfY29udF9wb29sX2luZm8ocG9vbCk7CisJCXByX2NvbnQoIiB3b3JrZXJzPSVkIiwgcG9vbC0+bnJfd29ya2Vycyk7CisJCWlmIChwb29sLT5tYW5hZ2VyKQorCQkJcHJfY29udCgiIG1hbmFnZXI6ICVkIiwKKwkJCQl0YXNrX3BpZF9ucihwb29sLT5tYW5hZ2VyLT50YXNrKSk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkod29ya2VyLCAmcG9vbC0+aWRsZV9saXN0LCBlbnRyeSkgeworCQkJcHJfY29udCgiICVzJWQiLCBmaXJzdCA/ICJpZGxlOiAiIDogIiIsCisJCQkJdGFza19waWRfbnIod29ya2VyLT50YXNrKSk7CisJCQlmaXJzdCA9IGZhbHNlOworCQl9CisJCXByX2NvbnQoIlxuIik7CisJbmV4dF9wb29sOgorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmN1X3JlYWRfdW5sb2NrX3NjaGVkKCk7Cit9CisKIC8qCiAgKiBDUFUgaG90cGx1Zy4KICAqCkBAIC00ODM0LDYgKzQ2OTgsMzIzIEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0ZSRUVaRVIgKi8KIAorI2lmZGVmIENPTkZJR19TWVNGUworLyoKKyAqIFdvcmtxdWV1ZXMgd2l0aCBXUV9TWVNGUyBmbGFnIHNldCBpcyB2aXNpYmxlIHRvIHVzZXJsYW5kIHZpYQorICogL3N5cy9idXMvd29ya3F1ZXVlL2RldmljZXMvV1FfTkFNRS4gIEFsbCB2aXNpYmxlIHdvcmtxdWV1ZXMgaGF2ZSB0aGUKKyAqIGZvbGxvd2luZyBhdHRyaWJ1dGVzLgorICoKKyAqICBwZXJfY3B1CVJPIGJvb2wJOiB3aGV0aGVyIHRoZSB3b3JrcXVldWUgaXMgcGVyLWNwdSBvciB1bmJvdW5kCisgKiAgbWF4X2FjdGl2ZQlSVyBpbnQJOiBtYXhpbXVtIG51bWJlciBvZiBpbi1mbGlnaHQgd29yayBpdGVtcworICoKKyAqIFVuYm91bmQgd29ya3F1ZXVlcyBoYXZlIHRoZSBmb2xsb3dpbmcgZXh0cmEgYXR0cmlidXRlcy4KKyAqCisgKiAgaWQJCVJPIGludAk6IHRoZSBhc3NvY2lhdGVkIHBvb2wgSUQKKyAqICBuaWNlCVJXIGludAk6IG5pY2UgdmFsdWUgb2YgdGhlIHdvcmtlcnMKKyAqICBjcHVtYXNrCVJXIG1hc2sJOiBiaXRtYXNrIG9mIGFsbG93ZWQgQ1BVcyBmb3IgdGhlIHdvcmtlcnMKKyAqLworc3RydWN0IHdxX2RldmljZSB7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJCSp3cTsKKwlzdHJ1Y3QgZGV2aWNlCQkJZGV2OworfTsKKworc3RhdGljIHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpkZXZfdG9fd3Eoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB3cV9kZXZpY2UgKndxX2RldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3cV9kZXZpY2UsIGRldik7CisKKwlyZXR1cm4gd3FfZGV2LT53cTsKK30KKworc3RhdGljIHNzaXplX3QgcGVyX2NwdV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGRldl90b193cShkZXYpOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCAoYm9vbCkhKHdxLT5mbGFncyAmIFdRX1VOQk9VTkQpKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9STyhwZXJfY3B1KTsKKworc3RhdGljIHNzaXplX3QgbWF4X2FjdGl2ZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGRldl90b193cShkZXYpOworCisJcmV0dXJuIHNjbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB3cS0+c2F2ZWRfbWF4X2FjdGl2ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1heF9hY3RpdmVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjb25zdCBjaGFyICpidWYsCisJCQkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGRldl90b193cShkZXYpOworCWludCB2YWw7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnZhbCkgIT0gMSB8fCB2YWwgPD0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3b3JrcXVldWVfc2V0X21heF9hY3RpdmUod3EsIHZhbCk7CisJcmV0dXJuIGNvdW50OworfQorc3RhdGljIERFVklDRV9BVFRSX1JXKG1heF9hY3RpdmUpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqd3Ffc3lzZnNfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfcGVyX2NwdS5hdHRyLAorCSZkZXZfYXR0cl9tYXhfYWN0aXZlLmF0dHIsCisJTlVMTCwKK307CitBVFRSSUJVVEVfR1JPVVBTKHdxX3N5c2ZzKTsKKworc3RhdGljIHNzaXplX3Qgd3FfcG9vbF9pZHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBkZXZfdG9fd3EoZGV2KTsKKwljb25zdCBjaGFyICpkZWxpbSA9ICIiOworCWludCBub2RlLCB3cml0dGVuID0gMDsKKworCXJjdV9yZWFkX2xvY2tfc2NoZWQoKTsKKwlmb3JfZWFjaF9ub2RlKG5vZGUpIHsKKwkJd3JpdHRlbiArPSBzY25wcmludGYoYnVmICsgd3JpdHRlbiwgUEFHRV9TSVpFIC0gd3JpdHRlbiwKKwkJCQkgICAgICIlcyVkOiVkIiwgZGVsaW0sIG5vZGUsCisJCQkJICAgICB1bmJvdW5kX3B3cV9ieV9ub2RlKHdxLCBub2RlKS0+cG9vbC0+aWQpOworCQlkZWxpbSA9ICIgIjsKKwl9CisJd3JpdHRlbiArPSBzY25wcmludGYoYnVmICsgd3JpdHRlbiwgUEFHRV9TSVpFIC0gd3JpdHRlbiwgIlxuIik7CisJcmN1X3JlYWRfdW5sb2NrX3NjaGVkKCk7CisKKwlyZXR1cm4gd3JpdHRlbjsKK30KKworc3RhdGljIHNzaXplX3Qgd3FfbmljZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGRldl90b193cShkZXYpOworCWludCB3cml0dGVuOworCisJbXV0ZXhfbG9jaygmd3EtPm11dGV4KTsKKwl3cml0dGVuID0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIHdxLT51bmJvdW5kX2F0dHJzLT5uaWNlKTsKKwltdXRleF91bmxvY2soJndxLT5tdXRleCk7CisKKwlyZXR1cm4gd3JpdHRlbjsKK30KKworLyogcHJlcGFyZSB3b3JrcXVldWVfYXR0cnMgZm9yIHN5c2ZzIHN0b3JlIG9wZXJhdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgd29ya3F1ZXVlX2F0dHJzICp3cV9zeXNmc19wcmVwX2F0dHJzKHN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSkKK3sKKwlzdHJ1Y3Qgd29ya3F1ZXVlX2F0dHJzICphdHRyczsKKworCWF0dHJzID0gYWxsb2Nfd29ya3F1ZXVlX2F0dHJzKEdGUF9LRVJORUwpOworCWlmICghYXR0cnMpCisJCXJldHVybiBOVUxMOworCisJbXV0ZXhfbG9jaygmd3EtPm11dGV4KTsKKwljb3B5X3dvcmtxdWV1ZV9hdHRycyhhdHRycywgd3EtPnVuYm91bmRfYXR0cnMpOworCW11dGV4X3VubG9jaygmd3EtPm11dGV4KTsKKwlyZXR1cm4gYXR0cnM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdxX25pY2Vfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxID0gZGV2X3RvX3dxKGRldik7CisJc3RydWN0IHdvcmtxdWV1ZV9hdHRycyAqYXR0cnM7CisJaW50IHJldDsKKworCWF0dHJzID0gd3Ffc3lzZnNfcHJlcF9hdHRycyh3cSk7CisJaWYgKCFhdHRycykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJmF0dHJzLT5uaWNlKSA9PSAxICYmCisJICAgIGF0dHJzLT5uaWNlID49IE1JTl9OSUNFICYmIGF0dHJzLT5uaWNlIDw9IE1BWF9OSUNFKQorCQlyZXQgPSBhcHBseV93b3JrcXVldWVfYXR0cnMod3EsIGF0dHJzKTsKKwllbHNlCisJCXJldCA9IC1FSU5WQUw7CisKKwlmcmVlX3dvcmtxdWV1ZV9hdHRycyhhdHRycyk7CisJcmV0dXJuIHJldCA/OiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgd3FfY3B1bWFza19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGRldl90b193cShkZXYpOworCWludCB3cml0dGVuOworCisJbXV0ZXhfbG9jaygmd3EtPm11dGV4KTsKKwl3cml0dGVuID0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJSpwYlxuIiwKKwkJCSAgICBjcHVtYXNrX3ByX2FyZ3Mod3EtPnVuYm91bmRfYXR0cnMtPmNwdW1hc2spKTsKKwltdXRleF91bmxvY2soJndxLT5tdXRleCk7CisJcmV0dXJuIHdyaXR0ZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdxX2NwdW1hc2tfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGRldl90b193cShkZXYpOworCXN0cnVjdCB3b3JrcXVldWVfYXR0cnMgKmF0dHJzOworCWludCByZXQ7CisKKwlhdHRycyA9IHdxX3N5c2ZzX3ByZXBfYXR0cnMod3EpOworCWlmICghYXR0cnMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gY3B1bWFza19wYXJzZShidWYsIGF0dHJzLT5jcHVtYXNrKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYXBwbHlfd29ya3F1ZXVlX2F0dHJzKHdxLCBhdHRycyk7CisKKwlmcmVlX3dvcmtxdWV1ZV9hdHRycyhhdHRycyk7CisJcmV0dXJuIHJldCA/OiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3Qgd3FfbnVtYV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGRldl90b193cShkZXYpOworCWludCB3cml0dGVuOworCisJbXV0ZXhfbG9jaygmd3EtPm11dGV4KTsKKwl3cml0dGVuID0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsCisJCQkgICAgIXdxLT51bmJvdW5kX2F0dHJzLT5ub19udW1hKTsKKwltdXRleF91bmxvY2soJndxLT5tdXRleCk7CisKKwlyZXR1cm4gd3JpdHRlbjsKK30KKworc3RhdGljIHNzaXplX3Qgd3FfbnVtYV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EgPSBkZXZfdG9fd3EoZGV2KTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX2F0dHJzICphdHRyczsKKwlpbnQgdiwgcmV0OworCisJYXR0cnMgPSB3cV9zeXNmc19wcmVwX2F0dHJzKHdxKTsKKwlpZiAoIWF0dHJzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IC1FSU5WQUw7CisJaWYgKHNzY2FuZihidWYsICIlZCIsICZ2KSA9PSAxKSB7CisJCWF0dHJzLT5ub19udW1hID0gIXY7CisJCXJldCA9IGFwcGx5X3dvcmtxdWV1ZV9hdHRycyh3cSwgYXR0cnMpOworCX0KKworCWZyZWVfd29ya3F1ZXVlX2F0dHJzKGF0dHJzKTsKKwlyZXR1cm4gcmV0ID86IGNvdW50OworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgd3Ffc3lzZnNfdW5ib3VuZF9hdHRyc1tdID0geworCV9fQVRUUihwb29sX2lkcywgMDQ0NCwgd3FfcG9vbF9pZHNfc2hvdywgTlVMTCksCisJX19BVFRSKG5pY2UsIDA2NDQsIHdxX25pY2Vfc2hvdywgd3FfbmljZV9zdG9yZSksCisJX19BVFRSKGNwdW1hc2ssIDA2NDQsIHdxX2NwdW1hc2tfc2hvdywgd3FfY3B1bWFza19zdG9yZSksCisJX19BVFRSKG51bWEsIDA2NDQsIHdxX251bWFfc2hvdywgd3FfbnVtYV9zdG9yZSksCisJX19BVFRSX05VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGJ1c190eXBlIHdxX3N1YnN5cyA9IHsKKwkubmFtZQkJCQk9ICJ3b3JrcXVldWUiLAorCS5kZXZfZ3JvdXBzCQkJPSB3cV9zeXNmc19ncm91cHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB3cV9zeXNmc19pbml0KHZvaWQpCit7CisJcmV0dXJuIHN1YnN5c192aXJ0dWFsX3JlZ2lzdGVyKCZ3cV9zdWJzeXMsIE5VTEwpOworfQorY29yZV9pbml0Y2FsbCh3cV9zeXNmc19pbml0KTsKKworc3RhdGljIHZvaWQgd3FfZGV2aWNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB3cV9kZXZpY2UgKndxX2RldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCB3cV9kZXZpY2UsIGRldik7CisKKwlrZnJlZSh3cV9kZXYpOworfQorCisvKioKKyAqIHdvcmtxdWV1ZV9zeXNmc19yZWdpc3RlciAtIG1ha2UgYSB3b3JrcXVldWUgdmlzaWJsZSBpbiBzeXNmcworICogQHdxOiB0aGUgd29ya3F1ZXVlIHRvIHJlZ2lzdGVyCisgKgorICogRXhwb3NlIEB3cSBpbiBzeXNmcyB1bmRlciAvc3lzL2J1cy93b3JrcXVldWUvZGV2aWNlcy4KKyAqIGFsbG9jX3dvcmtxdWV1ZSooKSBhdXRvbWF0aWNhbGx5IGNhbGxzIHRoaXMgZnVuY3Rpb24gaWYgV1FfU1lTRlMgaXMgc2V0CisgKiB3aGljaCBpcyB0aGUgcHJlZmVycmVkIG1ldGhvZC4KKyAqCisgKiBXb3JrcXVldWUgdXNlciBzaG91bGQgdXNlIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkgaWZmIGl0IHdhbnRzIHRvIGFwcGx5CisgKiB3b3JrcXVldWVfYXR0cnMgYmVmb3JlIG1ha2luZyB0aGUgd29ya3F1ZXVlIHZpc2libGUgaW4gc3lzZnM7IG90aGVyd2lzZSwKKyAqIGFwcGx5X3dvcmtxdWV1ZV9hdHRycygpIG1heSByYWNlIGFnYWluc3QgdXNlcmxhbmQgdXBkYXRpbmcgdGhlCisgKiBhdHRyaWJ1dGVzLgorICoKKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworaW50IHdvcmtxdWV1ZV9zeXNmc19yZWdpc3RlcihzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpCit7CisJc3RydWN0IHdxX2RldmljZSAqd3FfZGV2OworCWludCByZXQ7CisKKwkvKgorCSAqIEFkanVzdGluZyBtYXhfYWN0aXZlIG9yIGNyZWF0aW5nIG5ldyBwd3FzIGJ5IGFwcGx5dGluZworCSAqIGF0dHJpYnV0ZXMgYnJlYWtzIG9yZGVyaW5nIGd1YXJhbnRlZS4gIERpc2FsbG93IGV4cG9zaW5nIG9yZGVyZWQKKwkgKiB3b3JrcXVldWVzLgorCSAqLworCWlmIChXQVJOX09OKHdxLT5mbGFncyAmIF9fV1FfT1JERVJFRCkpCisJCXJldHVybiAtRUlOVkFMOworCisJd3EtPndxX2RldiA9IHdxX2RldiA9IGt6YWxsb2Moc2l6ZW9mKCp3cV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXdxX2RldikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl3cV9kZXYtPndxID0gd3E7CisJd3FfZGV2LT5kZXYuYnVzID0gJndxX3N1YnN5czsKKwl3cV9kZXYtPmRldi5pbml0X25hbWUgPSB3cS0+bmFtZTsKKwl3cV9kZXYtPmRldi5yZWxlYXNlID0gd3FfZGV2aWNlX3JlbGVhc2U7CisKKwkvKgorCSAqIHVuYm91bmRfYXR0cnMgYXJlIGNyZWF0ZWQgc2VwYXJhdGVseS4gIFN1cHByZXNzIHVldmVudCB1bnRpbAorCSAqIGV2ZXJ5dGhpbmcgaXMgcmVhZHkuCisJICovCisJZGV2X3NldF91ZXZlbnRfc3VwcHJlc3MoJndxX2Rldi0+ZGV2LCB0cnVlKTsKKworCXJldCA9IGRldmljZV9yZWdpc3Rlcigmd3FfZGV2LT5kZXYpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUod3FfZGV2KTsKKwkJd3EtPndxX2RldiA9IE5VTEw7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHdxLT5mbGFncyAmIFdRX1VOQk9VTkQpIHsKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHI7CisKKwkJZm9yIChhdHRyID0gd3Ffc3lzZnNfdW5ib3VuZF9hdHRyczsgYXR0ci0+YXR0ci5uYW1lOyBhdHRyKyspIHsKKwkJCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSgmd3FfZGV2LT5kZXYsIGF0dHIpOworCQkJaWYgKHJldCkgeworCQkJCWRldmljZV91bnJlZ2lzdGVyKCZ3cV9kZXYtPmRldik7CisJCQkJd3EtPndxX2RldiA9IE5VTEw7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKworCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKCZ3cV9kZXYtPmRldiwgZmFsc2UpOworCWtvYmplY3RfdWV2ZW50KCZ3cV9kZXYtPmRldi5rb2JqLCBLT0JKX0FERCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogd29ya3F1ZXVlX3N5c2ZzX3VucmVnaXN0ZXIgLSB1bmRvIHdvcmtxdWV1ZV9zeXNmc19yZWdpc3RlcigpCisgKiBAd3E6IHRoZSB3b3JrcXVldWUgdG8gdW5yZWdpc3RlcgorICoKKyAqIElmIEB3cSBpcyByZWdpc3RlcmVkIHRvIHN5c2ZzIGJ5IHdvcmtxdWV1ZV9zeXNmc19yZWdpc3RlcigpLCB1bnJlZ2lzdGVyLgorICovCitzdGF0aWMgdm9pZCB3b3JrcXVldWVfc3lzZnNfdW5yZWdpc3RlcihzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd3EpCit7CisJc3RydWN0IHdxX2RldmljZSAqd3FfZGV2ID0gd3EtPndxX2RldjsKKworCWlmICghd3EtPndxX2RldikKKwkJcmV0dXJuOworCisJd3EtPndxX2RldiA9IE5VTEw7CisJZGV2aWNlX3VucmVnaXN0ZXIoJndxX2Rldi0+ZGV2KTsKK30KKyNlbHNlCS8qIENPTkZJR19TWVNGUyAqLworc3RhdGljIHZvaWQgd29ya3F1ZXVlX3N5c2ZzX3VucmVnaXN0ZXIoc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxKQl7IH0KKyNlbmRpZgkvKiBDT05GSUdfU1lTRlMgKi8KKwogc3RhdGljIHZvaWQgX19pbml0IHdxX251bWFfaW5pdCh2b2lkKQogewogCWNwdW1hc2tfdmFyX3QgKnRibDsKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggYzVjZWZiMy4uMTc2NzA1NyAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTg2NSw2ICs4NjUsMTkgQEAKIAkgIGRhdGEgY29ycnVwdGlvbiBvciBhIHNwb3JhZGljIGNyYXNoIGF0IGEgbGF0ZXIgc3RhZ2Ugb25jZSB0aGUgcmVnaW9uCiAJICBpcyBleGFtaW5lZC4gVGhlIHJ1bnRpbWUgb3ZlcmhlYWQgaW50cm9kdWNlZCBpcyBtaW5pbWFsLgogCitjb25maWcgREVCVUdfVElNRUtFRVBJTkcKKwlib29sICJFbmFibGUgZXh0cmEgdGltZWtlZXBpbmcgc2FuaXR5IGNoZWNraW5nIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIGFkZGl0aW9uYWwgdGltZWtlZXBpbmcgc2FuaXR5IGNoZWNrcworCSAgd2hpY2ggbWF5IGJlIGhlbHBmdWwgd2hlbiBkaWFnbm9zaW5nIGlzc3VlcyB3aGVyZSB0aW1la2VlcGluZworCSAgcHJvYmxlbXMgYXJlIHN1c3BlY3RlZC4KKworCSAgVGhpcyBtYXkgaW5jbHVkZSBjaGVja3MgaW4gdGhlIHRpbWVrZWVwaW5nIGhvdHBhdGhzLCBzbyB0aGlzCisJICBvcHRpb24gbWF5IGhhdmUgYSAodmVyeSBzbWFsbCkgcGVyZm9ybWFuY2UgaW1wYWN0IHRvIHNvbWUKKwkgIHdvcmtsb2Fkcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwogY29uZmlnIFRJTUVSX1NUQVRTCiAJYm9vbCAiQ29sbGVjdCBrZXJuZWwgdGltZXJzIHN0YXRpc3RpY3MiCiAJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgUFJPQ19GUwpAQCAtMTE4MCwxNiArMTE5Myw3IEBACiBtZW51ICJSQ1UgRGVidWdnaW5nIgogCiBjb25maWcgUFJPVkVfUkNVCi0JYm9vbCAiUkNVIGRlYnVnZ2luZzogcHJvdmUgUkNVIGNvcnJlY3RuZXNzIgotCWRlcGVuZHMgb24gUFJPVkVfTE9DS0lORwotCWRlZmF1bHQgbgotCWhlbHAKLQkgVGhpcyBmZWF0dXJlIGVuYWJsZXMgbG9ja2RlcCBleHRlbnNpb25zIHRoYXQgY2hlY2sgZm9yIGNvcnJlY3QKLQkgdXNlIG9mIFJDVSBBUElzLiAgVGhpcyBpcyBjdXJyZW50bHkgdW5kZXIgZGV2ZWxvcG1lbnQuICBTYXkgWQotCSBpZiB5b3Ugd2FudCB0byBkZWJ1ZyBSQ1UgdXNhZ2Ugb3IgaGVscCB3b3JrIG9uIHRoZSBQUk9WRV9SQ1UKLQkgZmVhdHVyZS4KLQotCSBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KKwlkZWZfYm9vbCBQUk9WRV9MT0NLSU5HCiAKIGNvbmZpZyBQUk9WRV9SQ1VfUkVQRUFURURMWQogCWJvb2wgIlJDVSBkZWJ1Z2dpbmc6IGRvbid0IGRpc2FibGUgUFJPVkVfUkNVIG9uIGZpcnN0IHNwbGF0IgpAQCAtMTI1Nyw2ICsxMjYxLDMwIEBACiAJICBTYXkgTiBoZXJlIGlmIHlvdSB3YW50IHRoZSBSQ1UgdG9ydHVyZSB0ZXN0cyB0byBzdGFydCBvbmx5CiAJICBhZnRlciBiZWluZyBtYW51YWxseSBlbmFibGVkIHZpYSAvcHJvYy4KIAorY29uZmlnIFJDVV9UT1JUVVJFX1RFU1RfU0xPV19JTklUCisJYm9vbCAiU2xvdyBkb3duIFJDVSBncmFjZS1wZXJpb2QgaW5pdGlhbGl6YXRpb24gdG8gZXhwb3NlIHJhY2VzIgorCWRlcGVuZHMgb24gUkNVX1RPUlRVUkVfVEVTVAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIGdyYWNlLXBlcmlvZCBpbml0aWFsaXphdGlvbiBibG9jayBmb3IgYQorCSAgZmV3IGppZmZpZXMgYmV0d2VlbiBpbml0aWFsaXppbmcgZWFjaCBwYWlyIG9mIGNvbnNlY3V0aXZlCisJICByY3Vfbm9kZSBzdHJ1Y3R1cmVzLglUaGlzIGhlbHBzIHRvIGV4cG9zZSByYWNlcyBpbnZvbHZpbmcKKwkgIGdyYWNlLXBlcmlvZCBpbml0aWFsaXphdGlvbiwgaW4gb3RoZXIgd29yZHMsIGl0IG1ha2VzIHlvdXIKKwkgIGtlcm5lbCBsZXNzIHN0YWJsZS4gIEl0IGNhbiBhbHNvIGdyZWF0bHkgaW5jcmVhc2UgZ3JhY2UtcGVyaW9kCisJICBsYXRlbmN5LCBlc3BlY2lhbGx5IG9uIHN5c3RlbXMgd2l0aCBsYXJnZSBudW1iZXJzIG9mIENQVXMuCisJICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHRvcnR1cmUtdGVzdGluZyBSQ1UsIGJ1dCBpbiBhbG1vc3Qgbm8KKwkgIG90aGVyIGNpcmN1bXN0YW5jZS4KKworCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB5b3VyIHN5c3RlbSB0byBjcmFzaCBhbmQgaGFuZyBtb3JlIG9mdGVuLgorCSAgU2F5IE4gaWYgeW91IHdhbnQgYSBzYW5lIHN5c3RlbS4KKworY29uZmlnIFJDVV9UT1JUVVJFX1RFU1RfU0xPV19JTklUX0RFTEFZCisJaW50ICJIb3cgbXVjaCB0byBzbG93IGRvd24gUkNVIGdyYWNlLXBlcmlvZCBpbml0aWFsaXphdGlvbiIKKwlyYW5nZSAwIDUKKwlkZWZhdWx0IDMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBqaWZmaWVzIHRvIHdhaXQgYmV0d2VlbgorCSAgZWFjaCByY3Vfbm9kZSBzdHJ1Y3R1cmUgaW5pdGlhbGl6YXRpb24uCisKIGNvbmZpZyBSQ1VfQ1BVX1NUQUxMX1RJTUVPVVQKIAlpbnQgIlJDVSBDUFUgc3RhbGwgdGltZW91dCBpbiBzZWNvbmRzIgogCWRlcGVuZHMgb24gUkNVX1NUQUxMX0NPTU1PTgpAQCAtMTczMiw2ICsxNzYwLDE4IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbmZpZyBNRU1URVNUCisJYm9vbCAiTWVtdGVzdCIKKwlkZXBlbmRzIG9uIEhBVkVfTUVNQkxPQ0sKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBhZGRzIGEga2VybmVsIHBhcmFtZXRlciAnbWVtdGVzdCcsIHdoaWNoIGFsbG93cyBtZW10ZXN0CisJICB0byBiZSBzZXQuCisJICAgICAgICBtZW10ZXN0PTAsIG1lYW4gZGlzYWJsZWQ7IC0tIGRlZmF1bHQKKwkgICAgICAgIG1lbXRlc3Q9MSwgbWVhbiBkbyAxIHRlc3QgcGF0dGVybjsKKwkgICAgICAgIC4uLgorCSAgICAgICAgbWVtdGVzdD0xNywgbWVhbiBkbyAxNyB0ZXN0IHBhdHRlcm5zLgorCSAgSWYgeW91IGFyZSB1bnN1cmUgaG93IHRvIGFuc3dlciB0aGlzIHF1ZXN0aW9uLCBhbnN3ZXIgTi4KKwogc291cmNlICJzYW1wbGVzL0tjb25maWciCiAKIHNvdXJjZSAibGliL0tjb25maWcua2dkYiIKZGlmZiAtLWdpdCBhL2xpYi9kaXY2NC5jIGIvbGliL2RpdjY0LmMKaW5kZXggNDM4MmFkNy4uMTllYTdlZCAxMDA2NDQKLS0tIGEvbGliL2RpdjY0LmMKKysrIGIvbGliL2RpdjY0LmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogICogYnkgdGhlIGJvb2sgJ0hhY2tlcidzIERlbGlnaHQnLiAgVGhlIG9yaWdpbmFsIHNvdXJjZSBhbmQgZnVsbCBwcm9vZgogICogY2FuIGJlIGZvdW5kIGhlcmUgYW5kIGlzIGF2YWlsYWJsZSBmb3IgdXNlIHdpdGhvdXQgcmVzdHJpY3Rpb24uCiAgKgotICogJ2h0dHA6Ly93d3cuaGFja2Vyc2RlbGlnaHQub3JnL0hEY29kZS9uZXdDb2RlL2RpdkRvdWJsZS5jLnR4dCcKKyAqICdodHRwOi8vd3d3LmhhY2tlcnNkZWxpZ2h0Lm9yZy9oZGNvZGV0eHQvZGl2RG91YmxlLmMudHh0JwogICovCiAjaWZuZGVmIGRpdjY0X3U2NAogdTY0IGRpdjY0X3U2NCh1NjQgZGl2aWRlbmQsIHU2NCBkaXZpc29yKQpkaWZmIC0tZ2l0IGEvbGliL2lvcmVtYXAuYyBiL2xpYi9pb3JlbWFwLmMKaW5kZXggMGM5MjE2Yy4uODZjODkxMSAxMDA2NDQKLS0tIGEvbGliL2lvcmVtYXAuYworKysgYi9saWIvaW9yZW1hcC5jCkBAIC0xMyw2ICsxMyw0MyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAorI2lmZGVmIENPTkZJR19IQVZFX0FSQ0hfSFVHRV9WTUFQCitzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgaW9yZW1hcF9wdWRfY2FwYWJsZTsKK3N0YXRpYyBpbnQgX19yZWFkX21vc3RseSBpb3JlbWFwX3BtZF9jYXBhYmxlOworc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGlvcmVtYXBfaHVnZV9kaXNhYmxlZDsKKworc3RhdGljIGludCBfX2luaXQgc2V0X25vaHVnZWlvbWFwKGNoYXIgKnN0cikKK3sKKwlpb3JlbWFwX2h1Z2VfZGlzYWJsZWQgPSAxOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIm5vaHVnZWlvbWFwIiwgc2V0X25vaHVnZWlvbWFwKTsKKwordm9pZCBfX2luaXQgaW9yZW1hcF9odWdlX2luaXQodm9pZCkKK3sKKwlpZiAoIWlvcmVtYXBfaHVnZV9kaXNhYmxlZCkgeworCQlpZiAoYXJjaF9pb3JlbWFwX3B1ZF9zdXBwb3J0ZWQoKSkKKwkJCWlvcmVtYXBfcHVkX2NhcGFibGUgPSAxOworCQlpZiAoYXJjaF9pb3JlbWFwX3BtZF9zdXBwb3J0ZWQoKSkKKwkJCWlvcmVtYXBfcG1kX2NhcGFibGUgPSAxOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgaW9yZW1hcF9wdWRfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiBpb3JlbWFwX3B1ZF9jYXBhYmxlOworfQorCitzdGF0aWMgaW5saW5lIGludCBpb3JlbWFwX3BtZF9lbmFibGVkKHZvaWQpCit7CisJcmV0dXJuIGlvcmVtYXBfcG1kX2NhcGFibGU7Cit9CisKKyNlbHNlCS8qICFDT05GSUdfSEFWRV9BUkNIX0hVR0VfVk1BUCAqLworc3RhdGljIGlubGluZSBpbnQgaW9yZW1hcF9wdWRfZW5hYmxlZCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBpb3JlbWFwX3BtZF9lbmFibGVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgkvKiBDT05GSUdfSEFWRV9BUkNIX0hVR0VfVk1BUCAqLworCiBzdGF0aWMgaW50IGlvcmVtYXBfcHRlX3JhbmdlKHBtZF90ICpwbWQsIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJdW5zaWduZWQgbG9uZyBlbmQsIHBoeXNfYWRkcl90IHBoeXNfYWRkciwgcGdwcm90X3QgcHJvdCkKIHsKQEAgLTQzLDYgKzgwLDE0IEBACiAJCXJldHVybiAtRU5PTUVNOwogCWRvIHsKIAkJbmV4dCA9IHBtZF9hZGRyX2VuZChhZGRyLCBlbmQpOworCisJCWlmIChpb3JlbWFwX3BtZF9lbmFibGVkKCkgJiYKKwkJICAgICgobmV4dCAtIGFkZHIpID09IFBNRF9TSVpFKSAmJgorCQkgICAgSVNfQUxJR05FRChwaHlzX2FkZHIgKyBhZGRyLCBQTURfU0laRSkpIHsKKwkJCWlmIChwbWRfc2V0X2h1Z2UocG1kLCBwaHlzX2FkZHIgKyBhZGRyLCBwcm90KSkKKwkJCQljb250aW51ZTsKKwkJfQorCiAJCWlmIChpb3JlbWFwX3B0ZV9yYW5nZShwbWQsIGFkZHIsIG5leHQsIHBoeXNfYWRkciArIGFkZHIsIHByb3QpKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfSB3aGlsZSAocG1kKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CkBAIC02MSw2ICsxMDYsMTQgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJZG8gewogCQluZXh0ID0gcHVkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisKKwkJaWYgKGlvcmVtYXBfcHVkX2VuYWJsZWQoKSAmJgorCQkgICAgKChuZXh0IC0gYWRkcikgPT0gUFVEX1NJWkUpICYmCisJCSAgICBJU19BTElHTkVEKHBoeXNfYWRkciArIGFkZHIsIFBVRF9TSVpFKSkgeworCQkJaWYgKHB1ZF9zZXRfaHVnZShwdWQsIHBoeXNfYWRkciArIGFkZHIsIHByb3QpKQorCQkJCWNvbnRpbnVlOworCQl9CisKIAkJaWYgKGlvcmVtYXBfcG1kX3JhbmdlKHB1ZCwgYWRkciwgbmV4dCwgcGh5c19hZGRyICsgYWRkciwgcHJvdCkpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9IHdoaWxlIChwdWQrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKZGlmZiAtLWdpdCBhL2xpYi9pb3ZfaXRlci5jIGIvbGliL2lvdl9pdGVyLmMKaW5kZXggOWQ5NmUyODMuLjc1MjMyYWQgMTAwNjQ0Ci0tLSBhL2xpYi9pb3ZfaXRlci5jCisrKyBiL2xpYi9pb3ZfaXRlci5jCkBAIC0zMTcsNiArMzE3LDMyIEBACiB9CiBFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2ZhdWx0X2luX3JlYWRhYmxlKTsKIAorLyoKKyAqIEZhdWx0IGluIG9uZSBvciBtb3JlIGlvdmVjcyBvZiB0aGUgZ2l2ZW4gaW92X2l0ZXIsIHRvIGEgbWF4aW11bSBsZW5ndGggb2YKKyAqIGJ5dGVzLiAgRm9yIGVhY2ggaW92ZWMsIGZhdWx0IGluIGVhY2ggcGFnZSB0aGF0IGNvbnN0aXR1dGVzIHRoZSBpb3ZlYy4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBvciBub24temVybyBpZiB0aGUgbWVtb3J5IGNvdWxkIG5vdCBiZSBhY2Nlc3NlZCAoaS5lLgorICogYmVjYXVzZSBpdCBpcyBhbiBpbnZhbGlkIGFkZHJlc3MpLgorICovCitpbnQgaW92X2l0ZXJfZmF1bHRfaW5fbXVsdGlwYWdlc19yZWFkYWJsZShzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCBieXRlcykKK3sKKwlzaXplX3Qgc2tpcCA9IGktPmlvdl9vZmZzZXQ7CisJY29uc3Qgc3RydWN0IGlvdmVjICppb3Y7CisJaW50IGVycjsKKwlzdHJ1Y3QgaW92ZWMgdjsKKworCWlmICghKGktPnR5cGUgJiAoSVRFUl9CVkVDfElURVJfS1ZFQykpKSB7CisJCWl0ZXJhdGVfaW92ZWMoaSwgYnl0ZXMsIHYsIGlvdiwgc2tpcCwgKHsKKwkJCWVyciA9IGZhdWx0X2luX211bHRpcGFnZXNfcmVhZGFibGUodi5pb3ZfYmFzZSwKKwkJCQkJdi5pb3ZfbGVuKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKQorCQkJcmV0dXJuIGVycjsKKwkJMDt9KSkKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2ZhdWx0X2luX211bHRpcGFnZXNfcmVhZGFibGUpOworCiB2b2lkIGlvdl9pdGVyX2luaXQoc3RydWN0IGlvdl9pdGVyICppLCBpbnQgZGlyZWN0aW9uLAogCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHVuc2lnbmVkIGxvbmcgbnJfc2VncywKIAkJCXNpemVfdCBjb3VudCkKQEAgLTc2NiwzICs3OTIsNjAgQEAKIAkJCQkgICBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGR1cF9pdGVyKTsKKworaW50IGltcG9ydF9pb3ZlYyhpbnQgdHlwZSwgY29uc3Qgc3RydWN0IGlvdmVjIF9fdXNlciAqIHV2ZWN0b3IsCisJCSB1bnNpZ25lZCBucl9zZWdzLCB1bnNpZ25lZCBmYXN0X3NlZ3MsCisJCSBzdHJ1Y3QgaW92ZWMgKippb3YsIHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwlzc2l6ZV90IG47CisJc3RydWN0IGlvdmVjICpwOworCW4gPSByd19jb3B5X2NoZWNrX3V2ZWN0b3IodHlwZSwgdXZlY3RvciwgbnJfc2VncywgZmFzdF9zZWdzLAorCQkJCSAgKmlvdiwgJnApOworCWlmIChuIDwgMCkgeworCQlpZiAocCAhPSAqaW92KQorCQkJa2ZyZWUocCk7CisJCSppb3YgPSBOVUxMOworCQlyZXR1cm4gbjsKKwl9CisJaW92X2l0ZXJfaW5pdChpLCB0eXBlLCBwLCBucl9zZWdzLCBuKTsKKwkqaW92ID0gcCA9PSAqaW92ID8gTlVMTCA6IHA7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGltcG9ydF9pb3ZlYyk7CisKKyNpZmRlZiBDT05GSUdfQ09NUEFUCisjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+CisKK2ludCBjb21wYXRfaW1wb3J0X2lvdmVjKGludCB0eXBlLCBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqIHV2ZWN0b3IsCisJCSB1bnNpZ25lZCBucl9zZWdzLCB1bnNpZ25lZCBmYXN0X3NlZ3MsCisJCSBzdHJ1Y3QgaW92ZWMgKippb3YsIHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwlzc2l6ZV90IG47CisJc3RydWN0IGlvdmVjICpwOworCW4gPSBjb21wYXRfcndfY29weV9jaGVja191dmVjdG9yKHR5cGUsIHV2ZWN0b3IsIG5yX3NlZ3MsIGZhc3Rfc2VncywKKwkJCQkgICppb3YsICZwKTsKKwlpZiAobiA8IDApIHsKKwkJaWYgKHAgIT0gKmlvdikKKwkJCWtmcmVlKHApOworCQkqaW92ID0gTlVMTDsKKwkJcmV0dXJuIG47CisJfQorCWlvdl9pdGVyX2luaXQoaSwgdHlwZSwgcCwgbnJfc2Vncywgbik7CisJKmlvdiA9IHAgPT0gKmlvdiA/IE5VTEwgOiBwOworCXJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBpbXBvcnRfc2luZ2xlX3JhbmdlKGludCBydywgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGxlbiwKKwkJIHN0cnVjdCBpb3ZlYyAqaW92LCBzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJaWYgKGxlbiA+IE1BWF9SV19DT1VOVCkKKwkJbGVuID0gTUFYX1JXX0NPVU5UOworCWlmICh1bmxpa2VseSghYWNjZXNzX29rKCFydywgYnVmLCBsZW4pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpb3YtPmlvdl9iYXNlID0gYnVmOworCWlvdi0+aW92X2xlbiA9IGxlbjsKKwlpb3ZfaXRlcl9pbml0KGksIHJ3LCBpb3YsIDEsIGxlbik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWIva29iamVjdC5jIGIvbGliL2tvYmplY3QuYwppbmRleCAwM2Q0YWIzLi4zYjg0MWI5IDEwMDY0NAotLS0gYS9saWIva29iamVjdC5jCisrKyBiL2xpYi9rb2JqZWN0LmMKQEAgLTU3Niw4ICs1NzYsMTMgQEAKICAqLwogc3RydWN0IGtvYmplY3QgKmtvYmplY3RfZ2V0KHN0cnVjdCBrb2JqZWN0ICprb2JqKQogewotCWlmIChrb2JqKQorCWlmIChrb2JqKSB7CisJCWlmICgha29iai0+c3RhdGVfaW5pdGlhbGl6ZWQpCisJCQlXQVJOKDEsIEtFUk5fV0FSTklORyAia29iamVjdDogJyVzJyAoJXApOiBpcyBub3QgIgorCQkJICAgICAgICJpbml0aWFsaXplZCwgeWV0IGtvYmplY3RfZ2V0KCkgaXMgYmVpbmcgIgorCQkJICAgICAgICJjYWxsZWQuXG4iLCBrb2JqZWN0X25hbWUoa29iaiksIGtvYmopOwogCQlrcmVmX2dldCgma29iai0+a3JlZik7CisJfQogCXJldHVybiBrb2JqOwogfQogCmRpZmYgLS1naXQgYS9saWIvbGNtLmMgYi9saWIvbGNtLmMKaW5kZXggZTk3ZGJkNS4uMDNkN2ZjYiAxMDA2NDQKLS0tIGEvbGliL2xjbS5jCisrKyBiL2xpYi9sY20uYwpAQCAtMTIsMyArMTIsMTQgQEAKIAkJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsY20pOworCit1bnNpZ25lZCBsb25nIGxjbV9ub3RfemVybyh1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYikKK3sKKwl1bnNpZ25lZCBsb25nIGwgPSBsY20oYSwgYik7CisKKwlpZiAobCkKKwkJcmV0dXJuIGw7CisKKwlyZXR1cm4gKGIgPyA6IGEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobGNtX25vdF96ZXJvKTsKZGlmZiAtLWdpdCBhL2xpYi9sb2NrcmVmLmMgYi9saWIvbG9ja3JlZi5jCmluZGV4IGVjYjlhNjYuLjQ5NDk5NGIgMTAwNjQ0Ci0tLSBhL2xpYi9sb2NrcmVmLmMKKysrIGIvbGliL2xvY2tyZWYuYwpAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBDTVBYQ0hHX0xPT1AoQ09ERSwgU1VDQ0VTUykgZG8gewkJCQkJXAogCXN0cnVjdCBsb2NrcmVmIG9sZDsJCQkJCQkJXAogCUJVSUxEX0JVR19PTihzaXplb2Yob2xkKSAhPSA4KTsJCQkJCQlcCi0Jb2xkLmxvY2tfY291bnQgPSBBQ0NFU1NfT05DRShsb2NrcmVmLT5sb2NrX2NvdW50KTsJCQlcCisJb2xkLmxvY2tfY291bnQgPSBSRUFEX09OQ0UobG9ja3JlZi0+bG9ja19jb3VudCk7CQkJXAogCXdoaWxlIChsaWtlbHkoYXJjaF9zcGluX3ZhbHVlX3VubG9ja2VkKG9sZC5sb2NrLnJsb2NrLnJhd19sb2NrKSkpIHsgIAlcCiAJCXN0cnVjdCBsb2NrcmVmIG5ldyA9IG9sZCwgcHJldiA9IG9sZDsJCQkJXAogCQlDT0RFCQkJCQkJCQlcCmRpZmYgLS1naXQgYS9saWIvbHJ1X2NhY2hlLmMgYi9saWIvbHJ1X2NhY2hlLmMKaW5kZXggODUyYzgxZS4uMDI4ZjVkOSAxMDA2NDQKLS0tIGEvbGliL2xydV9jYWNoZS5jCisrKyBiL2xpYi9scnVfY2FjaGUuYwpAQCAtMjQ3LDEwICsyNDcsMTEgQEAKIAkgKiBwcm9ncmVzcykgYW5kICJjaGFuZ2VkIiwgd2hlbiB0aGlzIGluIGZhY3QgbGVhZCB0byBhbiBzdWNjZXNzZnVsCiAJICogdXBkYXRlIG9mIHRoZSBjYWNoZS4KIAkgKi8KLQlyZXR1cm4gc2VxX3ByaW50ZihzZXEsICJcdCVzOiB1c2VkOiV1LyV1ICIKLQkJImhpdHM6JWx1IG1pc3NlczolbHUgc3RhcnZpbmc6JWx1IGxvY2tlZDolbHUgY2hhbmdlZDolbHVcbiIsCi0JCWxjLT5uYW1lLCBsYy0+dXNlZCwgbGMtPm5yX2VsZW1lbnRzLAotCQlsYy0+aGl0cywgbGMtPm1pc3NlcywgbGMtPnN0YXJ2aW5nLCBsYy0+bG9ja2VkLCBsYy0+Y2hhbmdlZCk7CisJc2VxX3ByaW50ZihzZXEsICJcdCVzOiB1c2VkOiV1LyV1IGhpdHM6JWx1IG1pc3NlczolbHUgc3RhcnZpbmc6JWx1IGxvY2tlZDolbHUgY2hhbmdlZDolbHVcbiIsCisJCSAgIGxjLT5uYW1lLCBsYy0+dXNlZCwgbGMtPm5yX2VsZW1lbnRzLAorCQkgICBsYy0+aGl0cywgbGMtPm1pc3NlcywgbGMtPnN0YXJ2aW5nLCBsYy0+bG9ja2VkLCBsYy0+Y2hhbmdlZCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpsY19oYXNoX3Nsb3Qoc3RydWN0IGxydV9jYWNoZSAqbGMsIHVuc2lnbmVkIGludCBlbnIpCmRpZmYgLS1naXQgYS9saWIvbHo0L2x6NF9kZWNvbXByZXNzLmMgYi9saWIvbHo0L2x6NF9kZWNvbXByZXNzLmMKaW5kZXggN2E4NTk2Ny4uMjZjYzYwMiAxMDA2NDQKLS0tIGEvbGliL2x6NC9sejRfZGVjb21wcmVzcy5jCisrKyBiL2xpYi9sejQvbHo0X2RlY29tcHJlc3MuYwpAQCAtNDcsNiArNDcsMTEgQEAKIAogI2luY2x1ZGUgImx6NGRlZnMuaCIKIAorc3RhdGljIGNvbnN0IGludCBkZWMzMnRhYmxlW10gPSB7MCwgMywgMiwgMywgMCwgMCwgMCwgMH07CisjaWYgTFo0X0FSQ0g2NAorc3RhdGljIGNvbnN0IGludCBkZWM2NHRhYmxlW10gPSB7MCwgMCwgMCwgLTEsIDAsIDEsIDIsIDN9OworI2VuZGlmCisKIHN0YXRpYyBpbnQgbHo0X3VuY29tcHJlc3MoY29uc3QgY2hhciAqc291cmNlLCBjaGFyICpkZXN0LCBpbnQgb3NpemUpCiB7CiAJY29uc3QgQllURSAqaXAgPSAoY29uc3QgQllURSAqKSBzb3VyY2U7CkBAIC01NiwxMCArNjEsNiBAQAogCUJZVEUgKmNweTsKIAl1bnNpZ25lZCB0b2tlbjsKIAlzaXplX3QgbGVuZ3RoOwotCXNpemVfdCBkZWMzMnRhYmxlW10gPSB7MCwgMywgMiwgMywgMCwgMCwgMCwgMH07Ci0jaWYgTFo0X0FSQ0g2NAotCXNpemVfdCBkZWM2NHRhYmxlW10gPSB7MCwgMCwgMCwgLTEsIDAsIDEsIDIsIDN9OwotI2VuZGlmCiAKIAl3aGlsZSAoMSkgewogCkBAIC0xMTYsNyArMTE3LDcgQEAKIAkJLyogY29weSByZXBlYXRlZCBzZXF1ZW5jZSAqLwogCQlpZiAodW5saWtlbHkoKG9wIC0gcmVmKSA8IFNURVBTSVpFKSkgewogI2lmIExaNF9BUkNINjQKLQkJCXNpemVfdCBkZWM2NCA9IGRlYzY0dGFibGVbb3AgLSByZWZdOworCQkJaW50IGRlYzY0ID0gZGVjNjR0YWJsZVtvcCAtIHJlZl07CiAjZWxzZQogCQkJY29uc3QgaW50IGRlYzY0ID0gMDsKICNlbmRpZgpAQCAtMTM5LDYgKzE0MCw5IEBACiAJCQkvKiBFcnJvcjogcmVxdWVzdCB0byB3cml0ZSBiZXlvbmQgZGVzdGluYXRpb24gYnVmZmVyICovCiAJCQlpZiAoY3B5ID4gb2VuZCkKIAkJCQlnb3RvIF9vdXRwdXRfZXJyb3I7CisJCQlpZiAoKHJlZiArIENPUFlMRU5HVEgpID4gb2VuZCB8fAorCQkJCQkob3AgKyBDT1BZTEVOR1RIKSA+IG9lbmQpCisJCQkJZ290byBfb3V0cHV0X2Vycm9yOwogCQkJTFo0X1NFQ1VSRUNPUFkocmVmLCBvcCwgKG9lbmQgLSBDT1BZTEVOR1RIKSk7CiAJCQl3aGlsZSAob3AgPCBjcHkpCiAJCQkJKm9wKysgPSAqcmVmKys7CkBAIC0xNzQsMTEgKzE3OCw2IEBACiAJQllURSAqIGNvbnN0IG9lbmQgPSBvcCArIG1heG91dHB1dHNpemU7CiAJQllURSAqY3B5OwogCi0Jc2l6ZV90IGRlYzMydGFibGVbXSA9IHswLCAzLCAyLCAzLCAwLCAwLCAwLCAwfTsKLSNpZiBMWjRfQVJDSDY0Ci0Jc2l6ZV90IGRlYzY0dGFibGVbXSA9IHswLCAwLCAwLCAtMSwgMCwgMSwgMiwgM307Ci0jZW5kaWYKLQogCS8qIE1haW4gTG9vcCAqLwogCXdoaWxlIChpcCA8IGllbmQpIHsKIApAQCAtMjQ2LDcgKzI0NSw3IEBACiAJCS8qIGNvcHkgcmVwZWF0ZWQgc2VxdWVuY2UgKi8KIAkJaWYgKHVubGlrZWx5KChvcCAtIHJlZikgPCBTVEVQU0laRSkpIHsKICNpZiBMWjRfQVJDSDY0Ci0JCQlzaXplX3QgZGVjNjQgPSBkZWM2NHRhYmxlW29wIC0gcmVmXTsKKwkJCWludCBkZWM2NCA9IGRlYzY0dGFibGVbb3AgLSByZWZdOwogI2Vsc2UKIAkJCWNvbnN0IGludCBkZWM2NCA9IDA7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYi9ubGF0dHIuYyBiL2xpYi9ubGF0dHIuYwppbmRleCA3NmExYjU5Li5mNTkwN2QyIDEwMDY0NAotLS0gYS9saWIvbmxhdHRyLmMKKysrIGIvbGliL25sYXR0ci5jCkBAIC0yNzksNiArMjc5LDggQEAKIAlpbnQgbWlubGVuID0gbWluX3QoaW50LCBjb3VudCwgbmxhX2xlbihzcmMpKTsKIAogCW1lbWNweShkZXN0LCBubGFfZGF0YShzcmMpLCBtaW5sZW4pOworCWlmIChjb3VudCA+IG1pbmxlbikKKwkJbWVtc2V0KGRlc3QgKyBtaW5sZW4sIDAsIGNvdW50IC0gbWlubGVuKTsKIAogCXJldHVybiBtaW5sZW47CiB9CmRpZmYgLS1naXQgYS9saWIvcmhhc2h0YWJsZS5jIGIvbGliL3JoYXNodGFibGUuYwppbmRleCBiNTM0NGVmLi40ODk4NDQyIDEwMDY0NAotLS0gYS9saWIvcmhhc2h0YWJsZS5jCisrKyBiL2xpYi9yaGFzaHRhYmxlLmMKQEAgLTEsMTMgKzEsMTMgQEAKIC8qCiAgKiBSZXNpemFibGUsIFNjYWxhYmxlLCBDb25jdXJyZW50IEhhc2ggVGFibGUKICAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgogICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNCBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KICAqCi0gKiBCYXNlZCBvbiB0aGUgZm9sbG93aW5nIHBhcGVyOgotICogaHR0cHM6Ly93d3cudXNlbml4Lm9yZy9sZWdhY3kvZXZlbnQvYXRjMTEvdGVjaC9maW5hbF9maWxlcy9UcmlwbGV0dC5wZGYKLSAqCiAgKiBDb2RlIHBhcnRpYWxseSBkZXJpdmVkIGZyb20gbmZ0X2hhc2gKKyAqIFJld3JpdHRlbiB3aXRoIHJlaGFzaCBjb2RlIGZyb20gYnJfbXVsdGljYXN0IHBsdXMgc2luZ2xlIGxpc3QKKyAqIHBvaW50ZXIgYXMgc3VnZ2VzdGVkIGJ5IEpvc2ggVHJpcGxldHQKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKQEAgLTI3LDEyMSArMjcsMTggQEAKICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogI2RlZmluZSBIQVNIX0RFRkFVTFRfU0laRQk2NFVMCi0jZGVmaW5lIEhBU0hfTUlOX1NJWkUJCTRVTAorI2RlZmluZSBIQVNIX01JTl9TSVpFCQk0VQogI2RlZmluZSBCVUNLRVRfTE9DS1NfUEVSX0NQVSAgIDEyOFVMCiAKLS8qIEJhc2UgYml0cyBwbHVzIDEgYml0IGZvciBudWxscyBtYXJrZXIgKi8KLSNkZWZpbmUgSEFTSF9SRVNFUlZFRF9TUEFDRQkoUkhUX0JBU0VfQklUUyArIDEpCi0KLWVudW0gewotCVJIVF9MT0NLX05PUk1BTCwKLQlSSFRfTE9DS19ORVNURUQsCi19OwotCi0vKiBUaGUgYnVja2V0IGxvY2sgaXMgc2VsZWN0ZWQgYmFzZWQgb24gdGhlIGhhc2ggYW5kIHByb3RlY3RzIG11dGF0aW9ucwotICogb24gYSBncm91cCBvZiBoYXNoIGJ1Y2tldHMuCi0gKgotICogQSBtYXhpbXVtIG9mIHRibC0+c2l6ZS8yIGJ1Y2tldCBsb2NrcyBpcyBhbGxvY2F0ZWQuIFRoaXMgZW5zdXJlcyB0aGF0Ci0gKiBhIHNpbmdsZSBsb2NrIGFsd2F5cyBjb3ZlcnMgYm90aCBidWNrZXRzIHdoaWNoIG1heSBib3RoIGNvbnRhaW5zCi0gKiBlbnRyaWVzIHdoaWNoIGxpbmsgdG8gdGhlIHNhbWUgYnVja2V0IG9mIHRoZSBvbGQgdGFibGUgZHVyaW5nIHJlc2l6aW5nLgotICogVGhpcyBhbGxvd3MgdG8gc2ltcGxpZnkgdGhlIGxvY2tpbmcgYXMgbG9ja2luZyB0aGUgYnVja2V0IGluIGJvdGgKLSAqIHRhYmxlcyBkdXJpbmcgcmVzaXplIGFsd2F5cyBndWFyYW50ZWUgcHJvdGVjdGlvbi4KLSAqCi0gKiBJTVBPUlRBTlQ6IFdoZW4gaG9sZGluZyB0aGUgYnVja2V0IGxvY2sgb2YgYm90aCB0aGUgb2xkIGFuZCBuZXcgdGFibGUKLSAqIGR1cmluZyBleHBhbnNpb25zIGFuZCBzaHJpbmtpbmcsIHRoZSBvbGQgYnVja2V0IGxvY2sgbXVzdCBhbHdheXMgYmUKLSAqIGFjcXVpcmVkIGZpcnN0LgotICovCi1zdGF0aWMgc3BpbmxvY2tfdCAqYnVja2V0X2xvY2soY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLCB1MzIgaGFzaCkKLXsKLQlyZXR1cm4gJnRibC0+bG9ja3NbaGFzaCAmIHRibC0+bG9ja3NfbWFza107Ci19Ci0KLXN0YXRpYyB2b2lkICpyaHRfb2JqKGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgc3RydWN0IHJoYXNoX2hlYWQgKmhlKQotewotCXJldHVybiAodm9pZCAqKSBoZSAtIGh0LT5wLmhlYWRfb2Zmc2V0OwotfQotCi1zdGF0aWMgdTMyIHJodF9idWNrZXRfaW5kZXgoY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLCB1MzIgaGFzaCkKLXsKLQlyZXR1cm4gaGFzaCAmICh0YmwtPnNpemUgLSAxKTsKLX0KLQotc3RhdGljIHUzMiBvYmpfcmF3X2hhc2hmbihjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKnB0cikKLXsKLQl1MzIgaGFzaDsKLQotCWlmICh1bmxpa2VseSghaHQtPnAua2V5X2xlbikpCi0JCWhhc2ggPSBodC0+cC5vYmpfaGFzaGZuKHB0ciwgaHQtPnAuaGFzaF9ybmQpOwotCWVsc2UKLQkJaGFzaCA9IGh0LT5wLmhhc2hmbihwdHIgKyBodC0+cC5rZXlfb2Zmc2V0LCBodC0+cC5rZXlfbGVuLAotCQkJCSAgICBodC0+cC5oYXNoX3JuZCk7Ci0KLQlyZXR1cm4gaGFzaCA+PiBIQVNIX1JFU0VSVkVEX1NQQUNFOwotfQotCi1zdGF0aWMgdTMyIGtleV9oYXNoZm4oc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksIHUzMiBsZW4pCi17Ci0JcmV0dXJuIGh0LT5wLmhhc2hmbihrZXksIGxlbiwgaHQtPnAuaGFzaF9ybmQpID4+IEhBU0hfUkVTRVJWRURfU1BBQ0U7Ci19Ci0KLXN0YXRpYyB1MzIgaGVhZF9oYXNoZm4oY29uc3Qgc3RydWN0IHJoYXNodGFibGUgKmh0LAorc3RhdGljIHUzMiBoZWFkX2hhc2hmbihzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsCiAJCSAgICAgICBjb25zdCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGUpCiB7Ci0JcmV0dXJuIHJodF9idWNrZXRfaW5kZXgodGJsLCBvYmpfcmF3X2hhc2hmbihodCwgcmh0X29iaihodCwgaGUpKSk7CisJcmV0dXJuIHJodF9oZWFkX2hhc2hmbihodCwgdGJsLCBoZSwgaHQtPnApOwogfQogCiAjaWZkZWYgQ09ORklHX1BST1ZFX0xPQ0tJTkcKLXN0YXRpYyB2b2lkIGRlYnVnX2R1bXBfYnVja2V0cyhjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsKQotewotCXN0cnVjdCByaGFzaF9oZWFkICpoZTsKLQl1bnNpZ25lZCBpbnQgaSwgaGFzaDsKLQotCWZvciAoaSA9IDA7IGkgPCB0YmwtPnNpemU7IGkrKykgewotCQlwcl93YXJuKCIgW0J1Y2tldCAlZF0gIiwgaSk7Ci0JCXJodF9mb3JfZWFjaF9yY3UoaGUsIHRibCwgaSkgewotCQkJaGFzaCA9IGhlYWRfaGFzaGZuKGh0LCB0YmwsIGhlKTsKLQkJCXByX2NvbnQoIltoYXNoID0gJSN4LCBsb2NrID0gJXBdICIsCi0JCQkJaGFzaCwgYnVja2V0X2xvY2sodGJsLCBoYXNoKSk7Ci0JCX0KLQkJcHJfY29udCgiXG4iKTsKLQl9Ci0KLX0KLQotc3RhdGljIHZvaWQgZGVidWdfZHVtcF90YWJsZShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwKLQkJCSAgICAgdW5zaWduZWQgaW50IGhhc2gpCi17Ci0Jc3RydWN0IGJ1Y2tldF90YWJsZSAqb2xkX3RibCwgKmZ1dHVyZV90Ymw7Ci0KLQlwcl9lbWVyZygiQlVHOiBsb2NrIGZvciBoYXNoICUjeCBpbiB0YWJsZSAlcCBub3QgaGVsZFxuIiwKLQkJIGhhc2gsIHRibCk7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JZnV0dXJlX3RibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPmZ1dHVyZV90YmwsIGh0KTsKLQlvbGRfdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+dGJsLCBodCk7Ci0JaWYgKGZ1dHVyZV90YmwgIT0gb2xkX3RibCkgewotCQlwcl93YXJuKCJGdXR1cmUgdGFibGUgJXAgKHNpemU6ICV6ZClcbiIsCi0JCQlmdXR1cmVfdGJsLCBmdXR1cmVfdGJsLT5zaXplKTsKLQkJZGVidWdfZHVtcF9idWNrZXRzKGh0LCBmdXR1cmVfdGJsKTsKLQl9Ci0KLQlwcl93YXJuKCJUYWJsZSAlcCAoc2l6ZTogJXpkKVxuIiwgb2xkX3RibCwgb2xkX3RibC0+c2l6ZSk7Ci0JZGVidWdfZHVtcF9idWNrZXRzKGh0LCBvbGRfdGJsKTsKLQotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCiAjZGVmaW5lIEFTU0VSVF9SSFRfTVVURVgoSFQpIEJVR19PTighbG9ja2RlcF9yaHRfbXV0ZXhfaXNfaGVsZChIVCkpCi0jZGVmaW5lIEFTU0VSVF9CVUNLRVRfTE9DSyhIVCwgVEJMLCBIQVNIKQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAodW5saWtlbHkoIWxvY2tkZXBfcmh0X2J1Y2tldF9pc19oZWxkKFRCTCwgSEFTSCkpKSB7CVwKLQkJCWRlYnVnX2R1bXBfdGFibGUoSFQsIFRCTCwgSEFTSCk7CQlcCi0JCQlCVUcoKTsJCQkJCQlcCi0JCX0JCQkJCQkJXAotCX0gd2hpbGUgKDApCiAKIGludCBsb2NrZGVwX3JodF9tdXRleF9pc19oZWxkKHN0cnVjdCByaGFzaHRhYmxlICpodCkKIHsKQEAgLTE1MSwzMCArNDgsMTggQEAKIAogaW50IGxvY2tkZXBfcmh0X2J1Y2tldF9pc19oZWxkKGNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwgdTMyIGhhc2gpCiB7Ci0Jc3BpbmxvY2tfdCAqbG9jayA9IGJ1Y2tldF9sb2NrKHRibCwgaGFzaCk7CisJc3BpbmxvY2tfdCAqbG9jayA9IHJodF9idWNrZXRfbG9jayh0YmwsIGhhc2gpOwogCiAJcmV0dXJuIChkZWJ1Z19sb2NrcykgPyBsb2NrZGVwX2lzX2hlbGQobG9jaykgOiAxOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobG9ja2RlcF9yaHRfYnVja2V0X2lzX2hlbGQpOwogI2Vsc2UKICNkZWZpbmUgQVNTRVJUX1JIVF9NVVRFWChIVCkKLSNkZWZpbmUgQVNTRVJUX0JVQ0tFVF9MT0NLKEhULCBUQkwsIEhBU0gpCiAjZW5kaWYKIAogCi1zdGF0aWMgc3RydWN0IHJoYXNoX2hlYWQgX19yY3UgKipidWNrZXRfdGFpbChzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsIHUzMiBuKQotewotCXN0cnVjdCByaGFzaF9oZWFkIF9fcmN1ICoqcHByZXY7Ci0KLQlmb3IgKHBwcmV2ID0gJnRibC0+YnVja2V0c1tuXTsKLQkgICAgICFyaHRfaXNfYV9udWxscyhyaHRfZGVyZWZlcmVuY2VfYnVja2V0KCpwcHJldiwgdGJsLCBuKSk7Ci0JICAgICBwcHJldiA9ICZyaHRfZGVyZWZlcmVuY2VfYnVja2V0KCpwcHJldiwgdGJsLCBuKS0+bmV4dCkKLQkJOwotCi0JcmV0dXJuIHBwcmV2OwotfQotCi1zdGF0aWMgaW50IGFsbG9jX2J1Y2tldF9sb2NrcyhzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCkKK3N0YXRpYyBpbnQgYWxsb2NfYnVja2V0X2xvY2tzKHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLAorCQkJICAgICAgZ2ZwX3QgZ2ZwKQogewogCXVuc2lnbmVkIGludCBpLCBzaXplOwogI2lmIGRlZmluZWQoQ09ORklHX1BST1ZFX0xPQ0tJTkcpCkBAIC0xOTEsMTIgKzc2LDEzIEBACiAKIAlpZiAoc2l6ZW9mKHNwaW5sb2NrX3QpICE9IDApIHsKICNpZmRlZiBDT05GSUdfTlVNQQotCQlpZiAoc2l6ZSAqIHNpemVvZihzcGlubG9ja190KSA+IFBBR0VfU0laRSkKKwkJaWYgKHNpemUgKiBzaXplb2Yoc3BpbmxvY2tfdCkgPiBQQUdFX1NJWkUgJiYKKwkJICAgIGdmcCA9PSBHRlBfS0VSTkVMKQogCQkJdGJsLT5sb2NrcyA9IHZtYWxsb2Moc2l6ZSAqIHNpemVvZihzcGlubG9ja190KSk7CiAJCWVsc2UKICNlbmRpZgogCQl0YmwtPmxvY2tzID0ga21hbGxvY19hcnJheShzaXplLCBzaXplb2Yoc3BpbmxvY2tfdCksCi0JCQkJCSAgIEdGUF9LRVJORUwpOworCQkJCQkgICBnZnApOwogCQlpZiAoIXRibC0+bG9ja3MpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKQEAgLTIxNSwxNTMgKzEwMSwxODEgQEAKIAlrdmZyZWUodGJsKTsKIH0KIAorc3RhdGljIHZvaWQgYnVja2V0X3RhYmxlX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlidWNrZXRfdGFibGVfZnJlZShjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGJ1Y2tldF90YWJsZSwgcmN1KSk7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgYnVja2V0X3RhYmxlICpidWNrZXRfdGFibGVfYWxsb2Moc3RydWN0IHJoYXNodGFibGUgKmh0LAotCQkJCQkgICAgICAgc2l6ZV90IG5idWNrZXRzKQorCQkJCQkgICAgICAgc2l6ZV90IG5idWNrZXRzLAorCQkJCQkgICAgICAgZ2ZwX3QgZ2ZwKQogewogCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCA9IE5VTEw7CiAJc2l6ZV90IHNpemU7CiAJaW50IGk7CiAKIAlzaXplID0gc2l6ZW9mKCp0YmwpICsgbmJ1Y2tldHMgKiBzaXplb2YodGJsLT5idWNrZXRzWzBdKTsKLQlpZiAoc2l6ZSA8PSAoUEFHRV9TSVpFIDw8IFBBR0VfQUxMT0NfQ09TVExZX09SREVSKSkKLQkJdGJsID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOIHwgX19HRlBfTk9SRVRSWSk7Ci0JaWYgKHRibCA9PSBOVUxMKQorCWlmIChzaXplIDw9IChQQUdFX1NJWkUgPDwgUEFHRV9BTExPQ19DT1NUTFlfT1JERVIpIHx8CisJICAgIGdmcCAhPSBHRlBfS0VSTkVMKQorCQl0YmwgPSBremFsbG9jKHNpemUsIGdmcCB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpOworCWlmICh0YmwgPT0gTlVMTCAmJiBnZnAgPT0gR0ZQX0tFUk5FTCkKIAkJdGJsID0gdnphbGxvYyhzaXplKTsKIAlpZiAodGJsID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCiAJdGJsLT5zaXplID0gbmJ1Y2tldHM7CiAKLQlpZiAoYWxsb2NfYnVja2V0X2xvY2tzKGh0LCB0YmwpIDwgMCkgeworCWlmIChhbGxvY19idWNrZXRfbG9ja3MoaHQsIHRibCwgZ2ZwKSA8IDApIHsKIAkJYnVja2V0X3RhYmxlX2ZyZWUodGJsKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCisJSU5JVF9MSVNUX0hFQUQoJnRibC0+d2Fsa2Vycyk7CisKKwlnZXRfcmFuZG9tX2J5dGVzKCZ0YmwtPmhhc2hfcm5kLCBzaXplb2YodGJsLT5oYXNoX3JuZCkpOworCiAJZm9yIChpID0gMDsgaSA8IG5idWNrZXRzOyBpKyspCiAJCUlOSVRfUkhUX05VTExTX0hFQUQodGJsLT5idWNrZXRzW2ldLCBodCwgaSk7CiAKIAlyZXR1cm4gdGJsOwogfQogCi0vKioKLSAqIHJodF9ncm93X2Fib3ZlXzc1IC0gcmV0dXJucyB0cnVlIGlmIG5lbGVtcyA+IDAuNzUgKiB0YWJsZS1zaXplCi0gKiBAaHQ6CQloYXNoIHRhYmxlCi0gKiBAbmV3X3NpemU6CW5ldyB0YWJsZSBzaXplCi0gKi8KLXN0YXRpYyBib29sIHJodF9ncm93X2Fib3ZlXzc1KGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlICpodCwgc2l6ZV90IG5ld19zaXplKQorc3RhdGljIHN0cnVjdCBidWNrZXRfdGFibGUgKnJoYXNodGFibGVfbGFzdF90YWJsZShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJCQkgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCkKIHsKLQkvKiBFeHBhbmQgdGFibGUgd2hlbiBleGNlZWRpbmcgNzUlIGxvYWQgKi8KLQlyZXR1cm4gYXRvbWljX3JlYWQoJmh0LT5uZWxlbXMpID4gKG5ld19zaXplIC8gNCAqIDMpICYmCi0JICAgICAgICghaHQtPnAubWF4X3NoaWZ0IHx8IGF0b21pY19yZWFkKCZodC0+c2hpZnQpIDwgaHQtPnAubWF4X3NoaWZ0KTsKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsOworCisJZG8geworCQluZXdfdGJsID0gdGJsOworCQl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KHRibC0+ZnV0dXJlX3RibCwgaHQpOworCX0gd2hpbGUgKHRibCk7CisKKwlyZXR1cm4gbmV3X3RibDsKIH0KIAotLyoqCi0gKiByaHRfc2hyaW5rX2JlbG93XzMwIC0gcmV0dXJucyB0cnVlIGlmIG5lbGVtcyA8IDAuMyAqIHRhYmxlLXNpemUKLSAqIEBodDoJCWhhc2ggdGFibGUKLSAqIEBuZXdfc2l6ZToJbmV3IHRhYmxlIHNpemUKLSAqLwotc3RhdGljIGJvb2wgcmh0X3Nocmlua19iZWxvd18zMChjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHNpemVfdCBuZXdfc2l6ZSkKK3N0YXRpYyBpbnQgcmhhc2h0YWJsZV9yZWhhc2hfb25lKHN0cnVjdCByaGFzaHRhYmxlICpodCwgdW5zaWduZWQgaW50IG9sZF9oYXNoKQogewotCS8qIFNocmluayB0YWJsZSBiZW5lYXRoIDMwJSBsb2FkICovCi0JcmV0dXJuIGF0b21pY19yZWFkKCZodC0+bmVsZW1zKSA8IChuZXdfc2l6ZSAqIDMgLyAxMCkgJiYKLQkgICAgICAgKGF0b21pY19yZWFkKCZodC0+c2hpZnQpID4gaHQtPnAubWluX3NoaWZ0KTsKLX0KKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpvbGRfdGJsID0gcmh0X2RlcmVmZXJlbmNlKGh0LT50YmwsIGh0KTsKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsID0gcmhhc2h0YWJsZV9sYXN0X3RhYmxlKGh0LAorCQlyaHRfZGVyZWZlcmVuY2VfcmN1KG9sZF90YmwtPmZ1dHVyZV90YmwsIGh0KSk7CisJc3RydWN0IHJoYXNoX2hlYWQgX19yY3UgKipwcHJldiA9ICZvbGRfdGJsLT5idWNrZXRzW29sZF9oYXNoXTsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGVhZCwgKm5leHQsICplbnRyeTsKKwlzcGlubG9ja190ICpuZXdfYnVja2V0X2xvY2s7CisJdW5zaWduZWQgaW50IG5ld19oYXNoOwogCi1zdGF0aWMgdm9pZCBsb2NrX2J1Y2tldHMoc3RydWN0IGJ1Y2tldF90YWJsZSAqbmV3X3RibCwKLQkJCSBzdHJ1Y3QgYnVja2V0X3RhYmxlICpvbGRfdGJsLCB1bnNpZ25lZCBpbnQgaGFzaCkKLQlfX2FjcXVpcmVzKG9sZF9idWNrZXRfbG9jaykKLXsKLQlzcGluX2xvY2tfYmgoYnVja2V0X2xvY2sob2xkX3RibCwgaGFzaCkpOwotCWlmIChuZXdfdGJsICE9IG9sZF90YmwpCi0JCXNwaW5fbG9ja19iaF9uZXN0ZWQoYnVja2V0X2xvY2sobmV3X3RibCwgaGFzaCksCi0JCQkJICAgIFJIVF9MT0NLX05FU1RFRCk7Ci19CisJcmh0X2Zvcl9lYWNoKGVudHJ5LCBvbGRfdGJsLCBvbGRfaGFzaCkgeworCQllcnIgPSAwOworCQluZXh0ID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldChlbnRyeS0+bmV4dCwgb2xkX3RibCwgb2xkX2hhc2gpOwogCi1zdGF0aWMgdm9pZCB1bmxvY2tfYnVja2V0cyhzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsLAotCQkJICAgc3RydWN0IGJ1Y2tldF90YWJsZSAqb2xkX3RibCwgdW5zaWduZWQgaW50IGhhc2gpCi0JX19yZWxlYXNlcyhvbGRfYnVja2V0X2xvY2spCi17Ci0JaWYgKG5ld190YmwgIT0gb2xkX3RibCkKLQkJc3Bpbl91bmxvY2tfYmgoYnVja2V0X2xvY2sobmV3X3RibCwgaGFzaCkpOwotCXNwaW5fdW5sb2NrX2JoKGJ1Y2tldF9sb2NrKG9sZF90YmwsIGhhc2gpKTsKLX0KLQotLyoqCi0gKiBVbmxpbmsgZW50cmllcyBvbiBidWNrZXQgd2hpY2ggaGFzaCB0byBkaWZmZXJlbnQgYnVja2V0LgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiBubyBtb3JlIHdvcmsgbmVlZHMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoZSBidWNrZXQuCi0gKi8KLXN0YXRpYyBib29sIGhhc2h0YWJsZV9jaGFpbl91bnppcChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCi0JCQkJICBjb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsLAotCQkJCSAgc3RydWN0IGJ1Y2tldF90YWJsZSAqb2xkX3RibCwKLQkJCQkgIHNpemVfdCBvbGRfaGFzaCkKLXsKLQlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGUsICpwLCAqbmV4dDsKLQl1bnNpZ25lZCBpbnQgbmV3X2hhc2gsIG5ld19oYXNoMjsKLQotCUFTU0VSVF9CVUNLRVRfTE9DSyhodCwgb2xkX3RibCwgb2xkX2hhc2gpOwotCi0JLyogT2xkIGJ1Y2tldCBlbXB0eSwgbm8gd29yayBuZWVkZWQuICovCi0JcCA9IHJodF9kZXJlZmVyZW5jZV9idWNrZXQob2xkX3RibC0+YnVja2V0c1tvbGRfaGFzaF0sIG9sZF90YmwsCi0JCQkJICAgb2xkX2hhc2gpOwotCWlmIChyaHRfaXNfYV9udWxscyhwKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JbmV3X2hhc2ggPSBoZWFkX2hhc2hmbihodCwgbmV3X3RibCwgcCk7Ci0JQVNTRVJUX0JVQ0tFVF9MT0NLKGh0LCBuZXdfdGJsLCBuZXdfaGFzaCk7Ci0KLQkvKiBBZHZhbmNlIHRoZSBvbGQgYnVja2V0IHBvaW50ZXIgb25lIG9yIG1vcmUgdGltZXMgdW50aWwgaXQKLQkgKiByZWFjaGVzIGEgbm9kZSB0aGF0IGRvZXNuJ3QgaGFzaCB0byB0aGUgc2FtZSBidWNrZXQgYXMgdGhlCi0JICogcHJldmlvdXMgbm9kZSBwLiBDYWxsIHRoZSBwcmV2aW91cyBub2RlIHA7Ci0JICovCi0Jcmh0X2Zvcl9lYWNoX2NvbnRpbnVlKGhlLCBwLT5uZXh0LCBvbGRfdGJsLCBvbGRfaGFzaCkgewotCQluZXdfaGFzaDIgPSBoZWFkX2hhc2hmbihodCwgbmV3X3RibCwgaGUpOwotCQlBU1NFUlRfQlVDS0VUX0xPQ0soaHQsIG5ld190YmwsIG5ld19oYXNoMik7Ci0KLQkJaWYgKG5ld19oYXNoICE9IG5ld19oYXNoMikKKwkJaWYgKHJodF9pc19hX251bGxzKG5leHQpKQogCQkJYnJlYWs7Ci0JCXAgPSBoZTsKLQl9Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKG9sZF90YmwtPmJ1Y2tldHNbb2xkX2hhc2hdLCBwLT5uZXh0KTsKIAotCS8qIEZpbmQgdGhlIHN1YnNlcXVlbnQgbm9kZSB3aGljaCBkb2VzIGhhc2ggdG8gdGhlIHNhbWUKLQkgKiBidWNrZXQgYXMgbm9kZSBQLCBvciBOVUxMIGlmIG5vIHN1Y2ggbm9kZSBleGlzdHMuCi0JICovCi0JSU5JVF9SSFRfTlVMTFNfSEVBRChuZXh0LCBodCwgb2xkX2hhc2gpOwotCWlmICghcmh0X2lzX2FfbnVsbHMoaGUpKSB7Ci0JCXJodF9mb3JfZWFjaF9jb250aW51ZShoZSwgaGUtPm5leHQsIG9sZF90YmwsIG9sZF9oYXNoKSB7Ci0JCQlpZiAoaGVhZF9oYXNoZm4oaHQsIG5ld190YmwsIGhlKSA9PSBuZXdfaGFzaCkgewotCQkJCW5leHQgPSBoZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQorCQlwcHJldiA9ICZlbnRyeS0+bmV4dDsKIAl9CiAKLQkvKiBTZXQgcCdzIG5leHQgcG9pbnRlciB0byB0aGF0IHN1YnNlcXVlbnQgbm9kZSBwb2ludGVyLAotCSAqIGJ5cGFzc2luZyB0aGUgbm9kZXMgd2hpY2ggZG8gbm90IGhhc2ggdG8gcCdzIGJ1Y2tldAotCSAqLwotCXJjdV9hc3NpZ25fcG9pbnRlcihwLT5uZXh0LCBuZXh0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKIAotCXAgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KG9sZF90YmwtPmJ1Y2tldHNbb2xkX2hhc2hdLCBvbGRfdGJsLAotCQkJCSAgIG9sZF9oYXNoKTsKKwluZXdfaGFzaCA9IGhlYWRfaGFzaGZuKGh0LCBuZXdfdGJsLCBlbnRyeSk7CiAKLQlyZXR1cm4gIXJodF9pc19hX251bGxzKHApOworCW5ld19idWNrZXRfbG9jayA9IHJodF9idWNrZXRfbG9jayhuZXdfdGJsLCBuZXdfaGFzaCk7CisKKwlzcGluX2xvY2tfbmVzdGVkKG5ld19idWNrZXRfbG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCWhlYWQgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KG5ld190YmwtPmJ1Y2tldHNbbmV3X2hhc2hdLAorCQkJCSAgICAgIG5ld190YmwsIG5ld19oYXNoKTsKKworCWlmIChyaHRfaXNfYV9udWxscyhoZWFkKSkKKwkJSU5JVF9SSFRfTlVMTFNfSEVBRChlbnRyeS0+bmV4dCwgaHQsIG5ld19oYXNoKTsKKwllbHNlCisJCVJDVV9JTklUX1BPSU5URVIoZW50cnktPm5leHQsIGhlYWQpOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKG5ld190YmwtPmJ1Y2tldHNbbmV3X2hhc2hdLCBlbnRyeSk7CisJc3Bpbl91bmxvY2sobmV3X2J1Y2tldF9sb2NrKTsKKworCXJjdV9hc3NpZ25fcG9pbnRlcigqcHByZXYsIG5leHQpOworCitvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgbGlua19vbGRfdG9fbmV3KHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IGJ1Y2tldF90YWJsZSAqbmV3X3RibCwKLQkJCSAgICB1bnNpZ25lZCBpbnQgbmV3X2hhc2gsIHN0cnVjdCByaGFzaF9oZWFkICplbnRyeSkKK3N0YXRpYyB2b2lkIHJoYXNodGFibGVfcmVoYXNoX2NoYWluKHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJCQkgICAgdW5zaWduZWQgaW50IG9sZF9oYXNoKQogewotCUFTU0VSVF9CVUNLRVRfTE9DSyhodCwgbmV3X3RibCwgbmV3X2hhc2gpOworCXN0cnVjdCBidWNrZXRfdGFibGUgKm9sZF90YmwgPSByaHRfZGVyZWZlcmVuY2UoaHQtPnRibCwgaHQpOworCXNwaW5sb2NrX3QgKm9sZF9idWNrZXRfbG9jazsKIAotCXJjdV9hc3NpZ25fcG9pbnRlcigqYnVja2V0X3RhaWwobmV3X3RibCwgbmV3X2hhc2gpLCBlbnRyeSk7CisJb2xkX2J1Y2tldF9sb2NrID0gcmh0X2J1Y2tldF9sb2NrKG9sZF90YmwsIG9sZF9oYXNoKTsKKworCXNwaW5fbG9ja19iaChvbGRfYnVja2V0X2xvY2spOworCXdoaWxlICghcmhhc2h0YWJsZV9yZWhhc2hfb25lKGh0LCBvbGRfaGFzaCkpCisJCTsKKwlvbGRfdGJsLT5yZWhhc2grKzsKKwlzcGluX3VubG9ja19iaChvbGRfYnVja2V0X2xvY2spOworfQorCitzdGF0aWMgaW50IHJoYXNodGFibGVfcmVoYXNoX2F0dGFjaChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJICAgIHN0cnVjdCBidWNrZXRfdGFibGUgKm9sZF90YmwsCisJCQkJICAgIHN0cnVjdCBidWNrZXRfdGFibGUgKm5ld190YmwpCit7CisJLyogUHJvdGVjdCBmdXR1cmVfdGJsIHVzaW5nIHRoZSBmaXJzdCBidWNrZXQgbG9jay4gKi8KKwlzcGluX2xvY2tfYmgob2xkX3RibC0+bG9ja3MpOworCisJLyogRGlkIHNvbWVib2R5IGJlYXQgdXMgdG8gaXQ/ICovCisJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihvbGRfdGJsLT5mdXR1cmVfdGJsKSkgeworCQlzcGluX3VubG9ja19iaChvbGRfdGJsLT5sb2Nrcyk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCS8qIE1ha2UgaW5zZXJ0aW9ucyBnbyBpbnRvIHRoZSBuZXcsIGVtcHR5IHRhYmxlIHJpZ2h0IGF3YXkuIERlbGV0aW9ucworCSAqIGFuZCBsb29rdXBzIHdpbGwgYmUgYXR0ZW1wdGVkIGluIGJvdGggdGFibGVzIHVudGlsIHdlIHN5bmNocm9uaXplLgorCSAqLworCXJjdV9hc3NpZ25fcG9pbnRlcihvbGRfdGJsLT5mdXR1cmVfdGJsLCBuZXdfdGJsKTsKKworCS8qIEVuc3VyZSB0aGUgbmV3IHRhYmxlIGlzIHZpc2libGUgdG8gcmVhZGVycy4gKi8KKwlzbXBfd21iKCk7CisKKwlzcGluX3VubG9ja19iaChvbGRfdGJsLT5sb2Nrcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByaGFzaHRhYmxlX3JlaGFzaF90YWJsZShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQpCit7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqb2xkX3RibCA9IHJodF9kZXJlZmVyZW5jZShodC0+dGJsLCBodCk7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqbmV3X3RibDsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZV93YWxrZXIgKndhbGtlcjsKKwl1bnNpZ25lZCBpbnQgb2xkX2hhc2g7CisKKwluZXdfdGJsID0gcmh0X2RlcmVmZXJlbmNlKG9sZF90YmwtPmZ1dHVyZV90YmwsIGh0KTsKKwlpZiAoIW5ld190YmwpCisJCXJldHVybiAwOworCisJZm9yIChvbGRfaGFzaCA9IDA7IG9sZF9oYXNoIDwgb2xkX3RibC0+c2l6ZTsgb2xkX2hhc2grKykKKwkJcmhhc2h0YWJsZV9yZWhhc2hfY2hhaW4oaHQsIG9sZF9oYXNoKTsKKworCS8qIFB1Ymxpc2ggdGhlIG5ldyB0YWJsZSBwb2ludGVyLiAqLworCXJjdV9hc3NpZ25fcG9pbnRlcihodC0+dGJsLCBuZXdfdGJsKTsKKworCXNwaW5fbG9jaygmaHQtPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkod2Fsa2VyLCAmb2xkX3RibC0+d2Fsa2VycywgbGlzdCkKKwkJd2Fsa2VyLT50YmwgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZodC0+bG9jayk7CisKKwkvKiBXYWl0IGZvciByZWFkZXJzLiBBbGwgbmV3IHJlYWRlcnMgd2lsbCBzZWUgdGhlIG5ldworCSAqIHRhYmxlLCBhbmQgdGh1cyBubyByZWZlcmVuY2VzIHRvIHRoZSBvbGQgdGFibGUgd2lsbAorCSAqIHJlbWFpbi4KKwkgKi8KKwljYWxsX3JjdSgmb2xkX3RibC0+cmN1LCBidWNrZXRfdGFibGVfZnJlZV9yY3UpOworCisJcmV0dXJuIHJodF9kZXJlZmVyZW5jZShuZXdfdGJsLT5mdXR1cmVfdGJsLCBodCkgPyAtRUFHQUlOIDogMDsKIH0KIAogLyoqCiAgKiByaGFzaHRhYmxlX2V4cGFuZCAtIEV4cGFuZCBoYXNoIHRhYmxlIHdoaWxlIGFsbG93aW5nIGNvbmN1cnJlbnQgbG9va3VwcwogICogQGh0OgkJdGhlIGhhc2ggdGFibGUgdG8gZXhwYW5kCiAgKgotICogQSBzZWNvbmRhcnkgYnVja2V0IGFycmF5IGlzIGFsbG9jYXRlZCBhbmQgdGhlIGhhc2ggZW50cmllcyBhcmUgbWlncmF0ZWQKLSAqIHdoaWxlIGtlZXBpbmcgdGhlbSBvbiBib3RoIGxpc3RzIHVudGlsIHRoZSBlbmQgb2YgdGhlIFJDVSBncmFjZSBwZXJpb2QuCisgKiBBIHNlY29uZGFyeSBidWNrZXQgYXJyYXkgaXMgYWxsb2NhdGVkIGFuZCB0aGUgaGFzaCBlbnRyaWVzIGFyZSBtaWdyYXRlZC4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBpbiBhIGNvbnRleHQgd2hlcmUgaXQgaXMgc2FmZSB0byBjYWxsCiAgKiBzeW5jaHJvbml6ZV9yY3UoKSwgZS5nLiBub3Qgd2l0aGluIGEgcmN1X3JlYWRfbG9jaygpIHNlY3Rpb24uCkBAIC0zNzIsODkgKzI4NiwzMiBAQAogICogSXQgaXMgdmFsaWQgdG8gaGF2ZSBjb25jdXJyZW50IGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucyBwcm90ZWN0ZWQgYnkgcGVyCiAgKiBidWNrZXQgbG9ja3Mgb3IgY29uY3VycmVudCBSQ1UgcHJvdGVjdGVkIGxvb2t1cHMgYW5kIHRyYXZlcnNhbHMuCiAgKi8KLWludCByaGFzaHRhYmxlX2V4cGFuZChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQpCitzdGF0aWMgaW50IHJoYXNodGFibGVfZXhwYW5kKHN0cnVjdCByaGFzaHRhYmxlICpodCkKIHsKIAlzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsLCAqb2xkX3RibCA9IHJodF9kZXJlZmVyZW5jZShodC0+dGJsLCBodCk7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgKmhlOwotCXVuc2lnbmVkIGludCBuZXdfaGFzaCwgb2xkX2hhc2g7Ci0JYm9vbCBjb21wbGV0ZSA9IGZhbHNlOworCWludCBlcnI7CiAKIAlBU1NFUlRfUkhUX01VVEVYKGh0KTsKIAotCW5ld190YmwgPSBidWNrZXRfdGFibGVfYWxsb2MoaHQsIG9sZF90YmwtPnNpemUgKiAyKTsKKwlvbGRfdGJsID0gcmhhc2h0YWJsZV9sYXN0X3RhYmxlKGh0LCBvbGRfdGJsKTsKKworCW5ld190YmwgPSBidWNrZXRfdGFibGVfYWxsb2MoaHQsIG9sZF90YmwtPnNpemUgKiAyLCBHRlBfS0VSTkVMKTsKIAlpZiAobmV3X3RibCA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWF0b21pY19pbmMoJmh0LT5zaGlmdCk7CisJZXJyID0gcmhhc2h0YWJsZV9yZWhhc2hfYXR0YWNoKGh0LCBvbGRfdGJsLCBuZXdfdGJsKTsKKwlpZiAoZXJyKQorCQlidWNrZXRfdGFibGVfZnJlZShuZXdfdGJsKTsKIAotCS8qIE1ha2UgaW5zZXJ0aW9ucyBnbyBpbnRvIHRoZSBuZXcsIGVtcHR5IHRhYmxlIHJpZ2h0IGF3YXkuIERlbGV0aW9ucwotCSAqIGFuZCBsb29rdXBzIHdpbGwgYmUgYXR0ZW1wdGVkIGluIGJvdGggdGFibGVzIHVudGlsIHdlIHN5bmNocm9uaXplLgotCSAqIFRoZSBzeW5jaHJvbml6ZV9yY3UoKSBndWFyYW50ZWVzIGZvciB0aGUgbmV3IHRhYmxlIHRvIGJlIHBpY2tlZCB1cAotCSAqIHNvIG5vIG5ldyBhZGRpdGlvbnMgZ28gaW50byB0aGUgb2xkIHRhYmxlIHdoaWxlIHdlIHJlbGluay4KLQkgKi8KLQlyY3VfYXNzaWduX3BvaW50ZXIoaHQtPmZ1dHVyZV90YmwsIG5ld190YmwpOwotCXN5bmNocm9uaXplX3JjdSgpOwotCi0JLyogRm9yIGVhY2ggbmV3IGJ1Y2tldCwgc2VhcmNoIHRoZSBjb3JyZXNwb25kaW5nIG9sZCBidWNrZXQgZm9yIHRoZQotCSAqIGZpcnN0IGVudHJ5IHRoYXQgaGFzaGVzIHRvIHRoZSBuZXcgYnVja2V0LCBhbmQgbGluayB0aGUgZW5kIG9mCi0JICogbmV3bHkgZm9ybWVkIGJ1Y2tldCBjaGFpbiAoY29udGFpbmluZyBlbnRyaWVzIGFkZGVkIHRvIGZ1dHVyZQotCSAqIHRhYmxlKSB0byB0aGF0IGVudHJ5LiBTaW5jZSBhbGwgdGhlIGVudHJpZXMgd2hpY2ggd2lsbCBlbmQgdXAgaW4KLQkgKiB0aGUgbmV3IGJ1Y2tldCBhcHBlYXIgaW4gdGhlIHNhbWUgb2xkIGJ1Y2tldCwgdGhpcyBjb25zdHJ1Y3RzIGFuCi0JICogZW50aXJlbHkgdmFsaWQgbmV3IGhhc2ggdGFibGUsIGJ1dCB3aXRoIG11bHRpcGxlIGJ1Y2tldHMKLQkgKiAiemlwcGVkIiB0b2dldGhlciBpbnRvIGEgc2luZ2xlIGltcHJlY2lzZSBjaGFpbi4KLQkgKi8KLQlmb3IgKG5ld19oYXNoID0gMDsgbmV3X2hhc2ggPCBuZXdfdGJsLT5zaXplOyBuZXdfaGFzaCsrKSB7Ci0JCW9sZF9oYXNoID0gcmh0X2J1Y2tldF9pbmRleChvbGRfdGJsLCBuZXdfaGFzaCk7Ci0JCWxvY2tfYnVja2V0cyhuZXdfdGJsLCBvbGRfdGJsLCBuZXdfaGFzaCk7Ci0JCXJodF9mb3JfZWFjaChoZSwgb2xkX3RibCwgb2xkX2hhc2gpIHsKLQkJCWlmIChoZWFkX2hhc2hmbihodCwgbmV3X3RibCwgaGUpID09IG5ld19oYXNoKSB7Ci0JCQkJbGlua19vbGRfdG9fbmV3KGh0LCBuZXdfdGJsLCBuZXdfaGFzaCwgaGUpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXVubG9ja19idWNrZXRzKG5ld190YmwsIG9sZF90YmwsIG5ld19oYXNoKTsKLQkJY29uZF9yZXNjaGVkKCk7Ci0JfQotCi0JLyogVW56aXAgaW50ZXJsZWF2ZWQgaGFzaCBjaGFpbnMgKi8KLQl3aGlsZSAoIWNvbXBsZXRlICYmICFodC0+YmVpbmdfZGVzdHJveWVkKSB7Ci0JCS8qIFdhaXQgZm9yIHJlYWRlcnMuIEFsbCBuZXcgcmVhZGVycyB3aWxsIHNlZSB0aGUgbmV3Ci0JCSAqIHRhYmxlLCBhbmQgdGh1cyBubyByZWZlcmVuY2VzIHRvIHRoZSBvbGQgdGFibGUgd2lsbAotCQkgKiByZW1haW4uCi0JCSAqLwotCQlzeW5jaHJvbml6ZV9yY3UoKTsKLQotCQkvKiBGb3IgZWFjaCBidWNrZXQgaW4gdGhlIG9sZCB0YWJsZSAoZWFjaCBvZiB3aGljaAotCQkgKiBjb250YWlucyBpdGVtcyBmcm9tIG11bHRpcGxlIGJ1Y2tldHMgb2YgdGhlIG5ldwotCQkgKiB0YWJsZSk6IC4uLgotCQkgKi8KLQkJY29tcGxldGUgPSB0cnVlOwotCQlmb3IgKG9sZF9oYXNoID0gMDsgb2xkX2hhc2ggPCBvbGRfdGJsLT5zaXplOyBvbGRfaGFzaCsrKSB7Ci0JCQlsb2NrX2J1Y2tldHMobmV3X3RibCwgb2xkX3RibCwgb2xkX2hhc2gpOwotCi0JCQlpZiAoaGFzaHRhYmxlX2NoYWluX3VuemlwKGh0LCBuZXdfdGJsLCBvbGRfdGJsLAotCQkJCQkJICBvbGRfaGFzaCkpCi0JCQkJY29tcGxldGUgPSBmYWxzZTsKLQotCQkJdW5sb2NrX2J1Y2tldHMobmV3X3RibCwgb2xkX3RibCwgb2xkX2hhc2gpOwotCQkJY29uZF9yZXNjaGVkKCk7Ci0JCX0KLQl9Ci0KLQlyY3VfYXNzaWduX3BvaW50ZXIoaHQtPnRibCwgbmV3X3RibCk7Ci0Jc3luY2hyb25pemVfcmN1KCk7Ci0KLQlidWNrZXRfdGFibGVfZnJlZShvbGRfdGJsKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV9leHBhbmQpOwogCiAvKioKICAqIHJoYXNodGFibGVfc2hyaW5rIC0gU2hyaW5rIGhhc2ggdGFibGUgd2hpbGUgYWxsb3dpbmcgY29uY3VycmVudCBsb29rdXBzCiAgKiBAaHQ6CQl0aGUgaGFzaCB0YWJsZSB0byBzaHJpbmsKICAqCi0gKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBpbiBhIGNvbnRleHQgd2hlcmUgaXQgaXMgc2FmZSB0byBjYWxsCi0gKiBzeW5jaHJvbml6ZV9yY3UoKSwgZS5nLiBub3Qgd2l0aGluIGEgcmN1X3JlYWRfbG9jaygpIHNlY3Rpb24uCisgKiBUaGlzIGZ1bmN0aW9uIHNocmlua3MgdGhlIGhhc2ggdGFibGUgdG8gZml0LCBpLmUuLCB0aGUgc21hbGxlc3QKKyAqIHNpemUgd291bGQgbm90IGNhdXNlIGl0IHRvIGV4cGFuZCByaWdodCBhd2F5IGF1dG9tYXRpY2FsbHkuCiAgKgogICogVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IG5vIGNvbmN1cnJlbnQgcmVzaXppbmcgb2NjdXJzIGJ5IGhvbGRpbmcKICAqIGh0LT5tdXRleC4KQEAgLTQ2NSwzOTUgKzMyMiwxNDYgQEAKICAqIEl0IGlzIHZhbGlkIHRvIGhhdmUgY29uY3VycmVudCBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMgcHJvdGVjdGVkIGJ5IHBlcgogICogYnVja2V0IGxvY2tzIG9yIGNvbmN1cnJlbnQgUkNVIHByb3RlY3RlZCBsb29rdXBzIGFuZCB0cmF2ZXJzYWxzLgogICovCi1pbnQgcmhhc2h0YWJsZV9zaHJpbmsoc3RydWN0IHJoYXNodGFibGUgKmh0KQorc3RhdGljIGludCByaGFzaHRhYmxlX3NocmluayhzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQpCiB7Ci0Jc3RydWN0IGJ1Y2tldF90YWJsZSAqbmV3X3RibCwgKnRibCA9IHJodF9kZXJlZmVyZW5jZShodC0+dGJsLCBodCk7Ci0JdW5zaWduZWQgaW50IG5ld19oYXNoOworCXN0cnVjdCBidWNrZXRfdGFibGUgKm5ld190YmwsICpvbGRfdGJsID0gcmh0X2RlcmVmZXJlbmNlKGh0LT50YmwsIGh0KTsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlpbnQgZXJyOwogCiAJQVNTRVJUX1JIVF9NVVRFWChodCk7CiAKLQluZXdfdGJsID0gYnVja2V0X3RhYmxlX2FsbG9jKGh0LCB0YmwtPnNpemUgLyAyKTsKKwlzaXplID0gcm91bmR1cF9wb3dfb2ZfdHdvKGF0b21pY19yZWFkKCZodC0+bmVsZW1zKSAqIDMgLyAyKTsKKwlpZiAoc2l6ZSA8IGh0LT5wLm1pbl9zaXplKQorCQlzaXplID0gaHQtPnAubWluX3NpemU7CisKKwlpZiAob2xkX3RibC0+c2l6ZSA8PSBzaXplKQorCQlyZXR1cm4gMDsKKworCWlmIChyaHRfZGVyZWZlcmVuY2Uob2xkX3RibC0+ZnV0dXJlX3RibCwgaHQpKQorCQlyZXR1cm4gLUVFWElTVDsKKworCW5ld190YmwgPSBidWNrZXRfdGFibGVfYWxsb2MoaHQsIHNpemUsIEdGUF9LRVJORUwpOwogCWlmIChuZXdfdGJsID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmN1X2Fzc2lnbl9wb2ludGVyKGh0LT5mdXR1cmVfdGJsLCBuZXdfdGJsKTsKLQlzeW5jaHJvbml6ZV9yY3UoKTsKKwllcnIgPSByaGFzaHRhYmxlX3JlaGFzaF9hdHRhY2goaHQsIG9sZF90YmwsIG5ld190YmwpOworCWlmIChlcnIpCisJCWJ1Y2tldF90YWJsZV9mcmVlKG5ld190YmwpOwogCi0JLyogTGluayB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIG9sZCBidWNrZXQgdG8gdGhlIGVuZCBvZiB0aGUKLQkgKiBidWNrZXQgaW4gdGhlIG5ldyB0YWJsZS4gQXMgZW50cmllcyBhcmUgY29uY3VycmVudGx5IGJlaW5nCi0JICogYWRkZWQgdG8gdGhlIG5ldyB0YWJsZSwgbG9jayBkb3duIHRoZSBuZXcgYnVja2V0LiBBcyB3ZQotCSAqIGFsd2F5cyBkaXZpZGUgdGhlIHNpemUgaW4gaGFsZiB3aGVuIHNocmlua2luZywgZWFjaCBidWNrZXQKLQkgKiBpbiB0aGUgbmV3IHRhYmxlIG1hcHMgdG8gZXhhY3RseSB0d28gYnVja2V0cyBpbiB0aGUgb2xkCi0JICogdGFibGUuCi0JICovCi0JZm9yIChuZXdfaGFzaCA9IDA7IG5ld19oYXNoIDwgbmV3X3RibC0+c2l6ZTsgbmV3X2hhc2grKykgewotCQlsb2NrX2J1Y2tldHMobmV3X3RibCwgdGJsLCBuZXdfaGFzaCk7Ci0KLQkJcmN1X2Fzc2lnbl9wb2ludGVyKCpidWNrZXRfdGFpbChuZXdfdGJsLCBuZXdfaGFzaCksCi0JCQkJICAgdGJsLT5idWNrZXRzW25ld19oYXNoXSk7Ci0JCUFTU0VSVF9CVUNLRVRfTE9DSyhodCwgdGJsLCBuZXdfaGFzaCArIG5ld190YmwtPnNpemUpOwotCQlyY3VfYXNzaWduX3BvaW50ZXIoKmJ1Y2tldF90YWlsKG5ld190YmwsIG5ld19oYXNoKSwKLQkJCQkgICB0YmwtPmJ1Y2tldHNbbmV3X2hhc2ggKyBuZXdfdGJsLT5zaXplXSk7Ci0KLQkJdW5sb2NrX2J1Y2tldHMobmV3X3RibCwgdGJsLCBuZXdfaGFzaCk7Ci0JCWNvbmRfcmVzY2hlZCgpOwotCX0KLQotCS8qIFB1Ymxpc2ggdGhlIG5ldywgdmFsaWQgaGFzaCB0YWJsZSAqLwotCXJjdV9hc3NpZ25fcG9pbnRlcihodC0+dGJsLCBuZXdfdGJsKTsKLQlhdG9taWNfZGVjKCZodC0+c2hpZnQpOwotCi0JLyogV2FpdCBmb3IgcmVhZGVycy4gTm8gbmV3IHJlYWRlcnMgd2lsbCBoYXZlIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogb2xkIGhhc2ggdGFibGUuCi0JICovCi0Jc3luY2hyb25pemVfcmN1KCk7Ci0KLQlidWNrZXRfdGFibGVfZnJlZSh0YmwpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfc2hyaW5rKTsKIAogc3RhdGljIHZvaWQgcmh0X2RlZmVycmVkX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IHJoYXNodGFibGUgKmh0OwogCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKLQlzdHJ1Y3Qgcmhhc2h0YWJsZV93YWxrZXIgKndhbGtlcjsKKwlpbnQgZXJyID0gMDsKIAogCWh0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByaGFzaHRhYmxlLCBydW5fd29yayk7CiAJbXV0ZXhfbG9jaygmaHQtPm11dGV4KTsKLQlpZiAoaHQtPmJlaW5nX2Rlc3Ryb3llZCkKLQkJZ290byB1bmxvY2s7CiAKIAl0YmwgPSByaHRfZGVyZWZlcmVuY2UoaHQtPnRibCwgaHQpOworCXRibCA9IHJoYXNodGFibGVfbGFzdF90YWJsZShodCwgdGJsKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkod2Fsa2VyLCAmaHQtPndhbGtlcnMsIGxpc3QpCi0JCXdhbGtlci0+cmVzaXplID0gdHJ1ZTsKLQotCWlmIChyaHRfZ3Jvd19hYm92ZV83NShodCwgdGJsLT5zaXplKSkKKwlpZiAocmh0X2dyb3dfYWJvdmVfNzUoaHQsIHRibCkpCiAJCXJoYXNodGFibGVfZXhwYW5kKGh0KTsKLQllbHNlIGlmIChyaHRfc2hyaW5rX2JlbG93XzMwKGh0LCB0YmwtPnNpemUpKQorCWVsc2UgaWYgKGh0LT5wLmF1dG9tYXRpY19zaHJpbmtpbmcgJiYgcmh0X3Nocmlua19iZWxvd18zMChodCwgdGJsKSkKIAkJcmhhc2h0YWJsZV9zaHJpbmsoaHQpOwotdW5sb2NrOgorCisJZXJyID0gcmhhc2h0YWJsZV9yZWhhc2hfdGFibGUoaHQpOworCiAJbXV0ZXhfdW5sb2NrKCZodC0+bXV0ZXgpOworCisJaWYgKGVycikKKwkJc2NoZWR1bGVfd29yaygmaHQtPnJ1bl93b3JrKTsKIH0KIAotc3RhdGljIHZvaWQgX19yaGFzaHRhYmxlX2luc2VydChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCi0JCQkJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLAotCQkJCWNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKm9sZF90YmwsIHUzMiBoYXNoKQorc3RhdGljIGJvb2wgcmhhc2h0YWJsZV9jaGVja19lbGFzdGljaXR5KHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJCQkJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLAorCQkJCQl1bnNpZ25lZCBpbnQgaGFzaCkKIHsKLQlib29sIG5vX3Jlc2l6ZV9ydW5uaW5nID0gdGJsID09IG9sZF90Ymw7CisJdW5zaWduZWQgaW50IGVsYXN0aWNpdHkgPSBodC0+ZWxhc3RpY2l0eTsKIAlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGVhZDsKIAotCWhhc2ggPSByaHRfYnVja2V0X2luZGV4KHRibCwgaGFzaCk7CisJcmh0X2Zvcl9lYWNoKGhlYWQsIHRibCwgaGFzaCkKKwkJaWYgKCEtLWVsYXN0aWNpdHkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworaW50IHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQpCit7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqb2xkX3RibDsKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsOworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlpbnQgZXJyOworCisJb2xkX3RibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOworCXRibCA9IHJoYXNodGFibGVfbGFzdF90YWJsZShodCwgb2xkX3RibCk7CisKKwlzaXplID0gdGJsLT5zaXplOworCisJaWYgKHJodF9ncm93X2Fib3ZlXzc1KGh0LCB0YmwpKQorCQlzaXplICo9IDI7CisJLyogTW9yZSB0aGFuIHR3byByZWhhc2hlcyAobm90IHJlc2l6ZXMpIGRldGVjdGVkLiAqLworCWVsc2UgaWYgKFdBUk5fT04ob2xkX3RibCAhPSB0YmwgJiYgb2xkX3RibC0+c2l6ZSA9PSBzaXplKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW5ld190YmwgPSBidWNrZXRfdGFibGVfYWxsb2MoaHQsIHNpemUsIEdGUF9BVE9NSUMpOworCWlmIChuZXdfdGJsID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gcmhhc2h0YWJsZV9yZWhhc2hfYXR0YWNoKGh0LCB0YmwsIG5ld190YmwpOworCWlmIChlcnIpIHsKKwkJYnVja2V0X3RhYmxlX2ZyZWUobmV3X3RibCk7CisJCWlmIChlcnIgPT0gLUVFWElTVCkKKwkJCWVyciA9IDA7CisJfSBlbHNlCisJCXNjaGVkdWxlX3dvcmsoJmh0LT5ydW5fd29yayk7CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV9pbnNlcnRfcmVoYXNoKTsKKworaW50IHJoYXNodGFibGVfaW5zZXJ0X3Nsb3coc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksCisJCQkgICBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAorCQkJICAgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsKQoreworCXN0cnVjdCByaGFzaF9oZWFkICpoZWFkOworCXVuc2lnbmVkIGludCBoYXNoOworCWludCBlcnI7CisKKwl0YmwgPSByaGFzaHRhYmxlX2xhc3RfdGFibGUoaHQsIHRibCk7CisJaGFzaCA9IGhlYWRfaGFzaGZuKGh0LCB0YmwsIG9iaik7CisJc3Bpbl9sb2NrX25lc3RlZChyaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKSwgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCisJZXJyID0gLUVFWElTVDsKKwlpZiAoa2V5ICYmIHJoYXNodGFibGVfbG9va3VwX2Zhc3QoaHQsIGtleSwgaHQtPnApKQorCQlnb3RvIGV4aXQ7CisKKwllcnIgPSAtRUFHQUlOOworCWlmIChyaGFzaHRhYmxlX2NoZWNrX2VsYXN0aWNpdHkoaHQsIHRibCwgaGFzaCkgfHwKKwkgICAgcmh0X2dyb3dfYWJvdmVfMTAwKGh0LCB0YmwpKQorCQlnb3RvIGV4aXQ7CisKKwllcnIgPSAwOworCiAJaGVhZCA9IHJodF9kZXJlZmVyZW5jZV9idWNrZXQodGJsLT5idWNrZXRzW2hhc2hdLCB0YmwsIGhhc2gpOwogCi0JQVNTRVJUX0JVQ0tFVF9MT0NLKGh0LCB0YmwsIGhhc2gpOwotCi0JaWYgKHJodF9pc19hX251bGxzKGhlYWQpKQotCQlJTklUX1JIVF9OVUxMU19IRUFEKG9iai0+bmV4dCwgaHQsIGhhc2gpOwotCWVsc2UKLQkJUkNVX0lOSVRfUE9JTlRFUihvYmotPm5leHQsIGhlYWQpOworCVJDVV9JTklUX1BPSU5URVIob2JqLT5uZXh0LCBoZWFkKTsKIAogCXJjdV9hc3NpZ25fcG9pbnRlcih0YmwtPmJ1Y2tldHNbaGFzaF0sIG9iaik7CiAKIAlhdG9taWNfaW5jKCZodC0+bmVsZW1zKTsKLQlpZiAobm9fcmVzaXplX3J1bm5pbmcgJiYgcmh0X2dyb3dfYWJvdmVfNzUoaHQsIHRibC0+c2l6ZSkpCi0JCXNjaGVkdWxlX3dvcmsoJmh0LT5ydW5fd29yayk7Ci19Ci0KLS8qKgotICogcmhhc2h0YWJsZV9pbnNlcnQgLSBpbnNlcnQgb2JqZWN0IGludG8gaGFzaCB0YWJsZQotICogQGh0OgkJaGFzaCB0YWJsZQotICogQG9iajoJcG9pbnRlciB0byBoYXNoIGhlYWQgaW5zaWRlIG9iamVjdAotICoKLSAqIFdpbGwgdGFrZSBhIHBlciBidWNrZXQgc3BpbmxvY2sgdG8gcHJvdGVjdCBhZ2FpbnN0IG11dHVhbCBtdXRhdGlvbnMKLSAqIG9uIHRoZSBzYW1lIGJ1Y2tldC4gTXVsdGlwbGUgaW5zZXJ0aW9ucyBtYXkgb2NjdXIgaW4gcGFyYWxsZWwgdW5sZXNzCi0gKiB0aGV5IG1hcCB0byB0aGUgc2FtZSBidWNrZXQgbG9jay4KLSAqCi0gKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGF0b21pYyBjb250ZXh0LgotICoKLSAqIFdpbGwgdHJpZ2dlciBhbiBhdXRvbWF0aWMgZGVmZXJyZWQgdGFibGUgcmVzaXppbmcgaWYgdGhlIHNpemUgZ3Jvd3MKLSAqIGJleW9uZCB0aGUgd2F0ZXJtYXJrIGluZGljYXRlZCBieSBncm93X2RlY2lzaW9uKCkgd2hpY2ggY2FuIGJlIHBhc3NlZAotICogdG8gcmhhc2h0YWJsZV9pbml0KCkuCi0gKi8KLXZvaWQgcmhhc2h0YWJsZV9pbnNlcnQoc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqKQotewotCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwgKm9sZF90Ymw7Ci0JdW5zaWduZWQgaGFzaDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPmZ1dHVyZV90YmwsIGh0KTsKLQlvbGRfdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+dGJsLCBodCk7Ci0JaGFzaCA9IG9ial9yYXdfaGFzaGZuKGh0LCByaHRfb2JqKGh0LCBvYmopKTsKLQotCWxvY2tfYnVja2V0cyh0YmwsIG9sZF90YmwsIGhhc2gpOwotCV9fcmhhc2h0YWJsZV9pbnNlcnQoaHQsIG9iaiwgdGJsLCBvbGRfdGJsLCBoYXNoKTsKLQl1bmxvY2tfYnVja2V0cyh0YmwsIG9sZF90YmwsIGhhc2gpOwotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX2luc2VydCk7Ci0KLS8qKgotICogcmhhc2h0YWJsZV9yZW1vdmUgLSByZW1vdmUgb2JqZWN0IGZyb20gaGFzaCB0YWJsZQotICogQGh0OgkJaGFzaCB0YWJsZQotICogQG9iajoJcG9pbnRlciB0byBoYXNoIGhlYWQgaW5zaWRlIG9iamVjdAotICoKLSAqIFNpbmNlIHRoZSBoYXNoIGNoYWluIGlzIHNpbmdsZSBsaW5rZWQsIHRoZSByZW1vdmFsIG9wZXJhdGlvbiBuZWVkcyB0bwotICogd2FsayB0aGUgYnVja2V0IGNoYWluIHVwb24gcmVtb3ZhbC4gVGhlIHJlbW92YWwgb3BlcmF0aW9uIGlzIHRodXMKLSAqIGNvbnNpZGVyYWJsZSBzbG93IGlmIHRoZSBoYXNoIHRhYmxlIGlzIG5vdCBjb3JyZWN0bHkgc2l6ZWQuCi0gKgotICogV2lsbCBhdXRvbWF0aWNhbGx5IHNocmluayB0aGUgdGFibGUgdmlhIHJoYXNodGFibGVfZXhwYW5kKCkgaWYgdGhlCi0gKiBzaHJpbmtfZGVjaXNpb24gZnVuY3Rpb24gc3BlY2lmaWVkIGF0IHJoYXNodGFibGVfaW5pdCgpIHJldHVybnMgdHJ1ZS4KLSAqCi0gKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgbm8gY29uY3VycmVudCB0YWJsZSBtdXRhdGlvbnMgb2NjdXIuIEl0IGlzCi0gKiBob3dldmVyIHZhbGlkIHRvIGhhdmUgY29uY3VycmVudCBsb29rdXBzIGlmIHRoZXkgYXJlIFJDVSBwcm90ZWN0ZWQuCi0gKi8KLWJvb2wgcmhhc2h0YWJsZV9yZW1vdmUoc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqKQotewotCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwgKm5ld190YmwsICpvbGRfdGJsOwotCXN0cnVjdCByaGFzaF9oZWFkIF9fcmN1ICoqcHByZXY7Ci0Jc3RydWN0IHJoYXNoX2hlYWQgKmhlLCAqaGUyOwotCXVuc2lnbmVkIGludCBoYXNoLCBuZXdfaGFzaDsKLQlib29sIHJldCA9IGZhbHNlOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCW9sZF90YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT50YmwsIGh0KTsKLQl0YmwgPSBuZXdfdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+ZnV0dXJlX3RibCwgaHQpOwotCW5ld19oYXNoID0gb2JqX3Jhd19oYXNoZm4oaHQsIHJodF9vYmooaHQsIG9iaikpOwotCi0JbG9ja19idWNrZXRzKG5ld190YmwsIG9sZF90YmwsIG5ld19oYXNoKTsKLXJlc3RhcnQ6Ci0JaGFzaCA9IHJodF9idWNrZXRfaW5kZXgodGJsLCBuZXdfaGFzaCk7Ci0JcHByZXYgPSAmdGJsLT5idWNrZXRzW2hhc2hdOwotCXJodF9mb3JfZWFjaChoZSwgdGJsLCBoYXNoKSB7Ci0JCWlmIChoZSAhPSBvYmopIHsKLQkJCXBwcmV2ID0gJmhlLT5uZXh0OwotCQkJY29udGludWU7Ci0JCX0KLQotCQlBU1NFUlRfQlVDS0VUX0xPQ0soaHQsIHRibCwgaGFzaCk7Ci0KLQkJaWYgKG9sZF90YmwtPnNpemUgPiBuZXdfdGJsLT5zaXplICYmIHRibCA9PSBvbGRfdGJsICYmCi0JCSAgICAhcmh0X2lzX2FfbnVsbHMob2JqLT5uZXh0KSAmJgotCQkgICAgaGVhZF9oYXNoZm4oaHQsIHRibCwgb2JqLT5uZXh0KSAhPSBoYXNoKSB7Ci0JCQlyY3VfYXNzaWduX3BvaW50ZXIoKnBwcmV2LCAoc3RydWN0IHJoYXNoX2hlYWQgKikgcmh0X21hcmtlcihodCwgaGFzaCkpOwotCQl9IGVsc2UgaWYgKHVubGlrZWx5KG9sZF90YmwtPnNpemUgPCBuZXdfdGJsLT5zaXplICYmIHRibCA9PSBuZXdfdGJsKSkgewotCQkJcmh0X2Zvcl9lYWNoX2NvbnRpbnVlKGhlMiwgb2JqLT5uZXh0LCB0YmwsIGhhc2gpIHsKLQkJCQlpZiAoaGVhZF9oYXNoZm4oaHQsIHRibCwgaGUyKSA9PSBoYXNoKSB7Ci0JCQkJCXJjdV9hc3NpZ25fcG9pbnRlcigqcHByZXYsIGhlMik7Ci0JCQkJCWdvdG8gZm91bmQ7Ci0JCQkJfQotCQkJfQotCi0JCQlyY3VfYXNzaWduX3BvaW50ZXIoKnBwcmV2LCAoc3RydWN0IHJoYXNoX2hlYWQgKikgcmh0X21hcmtlcihodCwgaGFzaCkpOwotCQl9IGVsc2UgewotCQkJcmN1X2Fzc2lnbl9wb2ludGVyKCpwcHJldiwgb2JqLT5uZXh0KTsKLQkJfQotCi1mb3VuZDoKLQkJcmV0ID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JfQotCi0JLyogVGhlIGVudHJ5IG1heSBiZSBsaW5rZWQgaW4gZWl0aGVyICd0YmwnLCAnZnV0dXJlX3RibCcsIG9yIGJvdGguCi0JICogJ2Z1dHVyZV90YmwnIG9ubHkgZXhpc3RzIGZvciBhIHNob3J0IHBlcmlvZCBvZiB0aW1lIGR1cmluZwotCSAqIHJlc2l6aW5nLiBUaHVzIHRyYXZlcnNpbmcgYm90aCBpcyBmaW5lIGFuZCB0aGUgYWRkZWQgY29zdCBpcwotCSAqIHZlcnkgcmFyZS4KLQkgKi8KLQlpZiAodGJsICE9IG9sZF90YmwpIHsKLQkJdGJsID0gb2xkX3RibDsKLQkJZ290byByZXN0YXJ0OwotCX0KLQotCXVubG9ja19idWNrZXRzKG5ld190YmwsIG9sZF90YmwsIG5ld19oYXNoKTsKLQotCWlmIChyZXQpIHsKLQkJYm9vbCBub19yZXNpemVfcnVubmluZyA9IG5ld190YmwgPT0gb2xkX3RibDsKLQotCQlhdG9taWNfZGVjKCZodC0+bmVsZW1zKTsKLQkJaWYgKG5vX3Jlc2l6ZV9ydW5uaW5nICYmIHJodF9zaHJpbmtfYmVsb3dfMzAoaHQsIG5ld190YmwtPnNpemUpKQotCQkJc2NoZWR1bGVfd29yaygmaHQtPnJ1bl93b3JrKTsKLQl9Ci0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX3JlbW92ZSk7Ci0KLXN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnIHsKLQlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQ7Ci0JY29uc3Qgdm9pZCAqa2V5OwotfTsKLQotc3RhdGljIGJvb2wgcmhhc2h0YWJsZV9jb21wYXJlKHZvaWQgKnB0ciwgdm9pZCAqYXJnKQotewotCXN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnICp4ID0gYXJnOwotCXN0cnVjdCByaGFzaHRhYmxlICpodCA9IHgtPmh0OwotCi0JcmV0dXJuICFtZW1jbXAocHRyICsgaHQtPnAua2V5X29mZnNldCwgeC0+a2V5LCBodC0+cC5rZXlfbGVuKTsKLX0KLQotLyoqCi0gKiByaGFzaHRhYmxlX2xvb2t1cCAtIGxvb2t1cCBrZXkgaW4gaGFzaCB0YWJsZQotICogQGh0OgkJaGFzaCB0YWJsZQotICogQGtleToJcG9pbnRlciB0byBrZXkKLSAqCi0gKiBDb21wdXRlcyB0aGUgaGFzaCB2YWx1ZSBmb3IgdGhlIGtleSBhbmQgdHJhdmVyc2VzIHRoZSBidWNrZXQgY2hhaW4gbG9va2luZwotICogZm9yIGEgZW50cnkgd2l0aCBhbiBpZGVudGljYWwga2V5LiBUaGUgZmlyc3QgbWF0Y2hpbmcgZW50cnkgaXMgcmV0dXJuZWQuCi0gKgotICogVGhpcyBsb29rdXAgZnVuY3Rpb24gbWF5IG9ubHkgYmUgdXNlZCBmb3IgZml4ZWQga2V5IGhhc2ggdGFibGUgKGtleV9sZW4KLSAqIHBhcmFtZXRlciBzZXQpLiBJdCB3aWxsIEJVRygpIGlmIHVzZWQgaW5hcHByb3ByaWF0ZWx5LgotICoKLSAqIExvb2t1cHMgbWF5IG9jY3VyIGluIHBhcmFsbGVsIHdpdGggaGFzaHRhYmxlIG11dGF0aW9ucyBhbmQgcmVzaXppbmcuCi0gKi8KLXZvaWQgKnJoYXNodGFibGVfbG9va3VwKHN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5KQotewotCXN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnIGFyZyA9IHsKLQkJLmh0ID0gaHQsCi0JCS5rZXkgPSBrZXksCi0JfTsKLQotCUJVR19PTighaHQtPnAua2V5X2xlbik7Ci0KLQlyZXR1cm4gcmhhc2h0YWJsZV9sb29rdXBfY29tcGFyZShodCwga2V5LCAmcmhhc2h0YWJsZV9jb21wYXJlLCAmYXJnKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfbG9va3VwKTsKLQotLyoqCi0gKiByaGFzaHRhYmxlX2xvb2t1cF9jb21wYXJlIC0gc2VhcmNoIGhhc2ggdGFibGUgd2l0aCBjb21wYXJlIGZ1bmN0aW9uCi0gKiBAaHQ6CQloYXNoIHRhYmxlCi0gKiBAa2V5Ogl0aGUgcG9pbnRlciB0byB0aGUga2V5Ci0gKiBAY29tcGFyZToJY29tcGFyZSBmdW5jdGlvbiwgbXVzdCByZXR1cm4gdHJ1ZSBvbiBtYXRjaAotICogQGFyZzoJYXJndW1lbnQgcGFzc2VkIG9uIHRvIGNvbXBhcmUgZnVuY3Rpb24KLSAqCi0gKiBUcmF2ZXJzZXMgdGhlIGJ1Y2tldCBjaGFpbiBiZWhpbmQgdGhlIHByb3ZpZGVkIGhhc2ggdmFsdWUgYW5kIGNhbGxzIHRoZQotICogc3BlY2lmaWVkIGNvbXBhcmUgZnVuY3Rpb24gZm9yIGVhY2ggZW50cnkuCi0gKgotICogTG9va3VwcyBtYXkgb2NjdXIgaW4gcGFyYWxsZWwgd2l0aCBoYXNodGFibGUgbXV0YXRpb25zIGFuZCByZXNpemluZy4KLSAqCi0gKiBSZXR1cm5zIHRoZSBmaXJzdCBlbnRyeSBvbiB3aGljaCB0aGUgY29tcGFyZSBmdW5jdGlvbiByZXR1cm5lZCB0cnVlLgotICovCi12b2lkICpyaGFzaHRhYmxlX2xvb2t1cF9jb21wYXJlKHN0cnVjdCByaGFzaHRhYmxlICpodCwgY29uc3Qgdm9pZCAqa2V5LAotCQkJCWJvb2wgKCpjb21wYXJlKSh2b2lkICosIHZvaWQgKiksIHZvaWQgKmFyZykKLXsKLQljb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsICpvbGRfdGJsOwotCXN0cnVjdCByaGFzaF9oZWFkICpoZTsKLQl1MzIgaGFzaDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCW9sZF90YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT50YmwsIGh0KTsKLQl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT5mdXR1cmVfdGJsLCBodCk7Ci0JaGFzaCA9IGtleV9oYXNoZm4oaHQsIGtleSwgaHQtPnAua2V5X2xlbik7Ci1yZXN0YXJ0OgotCXJodF9mb3JfZWFjaF9yY3UoaGUsIHRibCwgcmh0X2J1Y2tldF9pbmRleCh0YmwsIGhhc2gpKSB7Ci0JCWlmICghY29tcGFyZShyaHRfb2JqKGh0LCBoZSksIGFyZykpCi0JCQljb250aW51ZTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybiByaHRfb2JqKGh0LCBoZSk7Ci0JfQotCi0JaWYgKHVubGlrZWx5KHRibCAhPSBvbGRfdGJsKSkgewotCQl0YmwgPSBvbGRfdGJsOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX2xvb2t1cF9jb21wYXJlKTsKLQotLyoqCi0gKiByaGFzaHRhYmxlX2xvb2t1cF9pbnNlcnQgLSBsb29rdXAgYW5kIGluc2VydCBvYmplY3QgaW50byBoYXNoIHRhYmxlCi0gKiBAaHQ6CQloYXNoIHRhYmxlCi0gKiBAb2JqOglwb2ludGVyIHRvIGhhc2ggaGVhZCBpbnNpZGUgb2JqZWN0Ci0gKgotICogTG9ja3MgZG93biB0aGUgYnVja2V0IGNoYWluIGluIGJvdGggdGhlIG9sZCBhbmQgbmV3IHRhYmxlIGlmIGEgcmVzaXplCi0gKiBpcyBpbiBwcm9ncmVzcyB0byBlbnN1cmUgdGhhdCB3cml0ZXJzIGNhbid0IHJlbW92ZSBmcm9tIHRoZSBvbGQgdGFibGUKLSAqIGFuZCBjYW4ndCBpbnNlcnQgdG8gdGhlIG5ldyB0YWJsZSBkdXJpbmcgdGhlIGF0b21pYyBvcGVyYXRpb24gb2Ygc2VhcmNoCi0gKiBhbmQgaW5zZXJ0aW9uLiBTZWFyY2hlcyBmb3IgZHVwbGljYXRlcyBpbiBib3RoIHRoZSBvbGQgYW5kIG5ldyB0YWJsZSBpZgotICogYSByZXNpemUgaXMgaW4gcHJvZ3Jlc3MuCi0gKgotICogVGhpcyBsb29rdXAgZnVuY3Rpb24gbWF5IG9ubHkgYmUgdXNlZCBmb3IgZml4ZWQga2V5IGhhc2ggdGFibGUgKGtleV9sZW4KLSAqIHBhcmFtZXRlciBzZXQpLiBJdCB3aWxsIEJVRygpIGlmIHVzZWQgaW5hcHByb3ByaWF0ZWx5LgotICoKLSAqIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gYXRvbWljIGNvbnRleHQuCi0gKgotICogV2lsbCB0cmlnZ2VyIGFuIGF1dG9tYXRpYyBkZWZlcnJlZCB0YWJsZSByZXNpemluZyBpZiB0aGUgc2l6ZSBncm93cwotICogYmV5b25kIHRoZSB3YXRlcm1hcmsgaW5kaWNhdGVkIGJ5IGdyb3dfZGVjaXNpb24oKSB3aGljaCBjYW4gYmUgcGFzc2VkCi0gKiB0byByaGFzaHRhYmxlX2luaXQoKS4KLSAqLwotYm9vbCByaGFzaHRhYmxlX2xvb2t1cF9pbnNlcnQoc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqKQotewotCXN0cnVjdCByaGFzaHRhYmxlX2NvbXBhcmVfYXJnIGFyZyA9IHsKLQkJLmh0ID0gaHQsCi0JCS5rZXkgPSByaHRfb2JqKGh0LCBvYmopICsgaHQtPnAua2V5X29mZnNldCwKLQl9OwotCi0JQlVHX09OKCFodC0+cC5rZXlfbGVuKTsKLQotCXJldHVybiByaGFzaHRhYmxlX2xvb2t1cF9jb21wYXJlX2luc2VydChodCwgb2JqLCAmcmhhc2h0YWJsZV9jb21wYXJlLAotCQkJCQkJJmFyZyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX2xvb2t1cF9pbnNlcnQpOwotCi0vKioKLSAqIHJoYXNodGFibGVfbG9va3VwX2NvbXBhcmVfaW5zZXJ0IC0gc2VhcmNoIGFuZCBpbnNlcnQgb2JqZWN0IHRvIGhhc2ggdGFibGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBjb21wYXJlIGZ1bmN0aW9uCi0gKiBAaHQ6CQloYXNoIHRhYmxlCi0gKiBAb2JqOglwb2ludGVyIHRvIGhhc2ggaGVhZCBpbnNpZGUgb2JqZWN0Ci0gKiBAY29tcGFyZToJY29tcGFyZSBmdW5jdGlvbiwgbXVzdCByZXR1cm4gdHJ1ZSBvbiBtYXRjaAotICogQGFyZzoJYXJndW1lbnQgcGFzc2VkIG9uIHRvIGNvbXBhcmUgZnVuY3Rpb24KLSAqCi0gKiBMb2NrcyBkb3duIHRoZSBidWNrZXQgY2hhaW4gaW4gYm90aCB0aGUgb2xkIGFuZCBuZXcgdGFibGUgaWYgYSByZXNpemUKLSAqIGlzIGluIHByb2dyZXNzIHRvIGVuc3VyZSB0aGF0IHdyaXRlcnMgY2FuJ3QgcmVtb3ZlIGZyb20gdGhlIG9sZCB0YWJsZQotICogYW5kIGNhbid0IGluc2VydCB0byB0aGUgbmV3IHRhYmxlIGR1cmluZyB0aGUgYXRvbWljIG9wZXJhdGlvbiBvZiBzZWFyY2gKLSAqIGFuZCBpbnNlcnRpb24uIFNlYXJjaGVzIGZvciBkdXBsaWNhdGVzIGluIGJvdGggdGhlIG9sZCBhbmQgbmV3IHRhYmxlIGlmCi0gKiBhIHJlc2l6ZSBpcyBpbiBwcm9ncmVzcy4KLSAqCi0gKiBMb29rdXBzIG1heSBvY2N1ciBpbiBwYXJhbGxlbCB3aXRoIGhhc2h0YWJsZSBtdXRhdGlvbnMgYW5kIHJlc2l6aW5nLgotICoKLSAqIFdpbGwgdHJpZ2dlciBhbiBhdXRvbWF0aWMgZGVmZXJyZWQgdGFibGUgcmVzaXppbmcgaWYgdGhlIHNpemUgZ3Jvd3MKLSAqIGJleW9uZCB0aGUgd2F0ZXJtYXJrIGluZGljYXRlZCBieSBncm93X2RlY2lzaW9uKCkgd2hpY2ggY2FuIGJlIHBhc3NlZAotICogdG8gcmhhc2h0YWJsZV9pbml0KCkuCi0gKi8KLWJvb2wgcmhhc2h0YWJsZV9sb29rdXBfY29tcGFyZV9pbnNlcnQoc3RydWN0IHJoYXNodGFibGUgKmh0LAotCQkJCSAgICAgIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCi0JCQkJICAgICAgYm9vbCAoKmNvbXBhcmUpKHZvaWQgKiwgdm9pZCAqKSwKLQkJCQkgICAgICB2b2lkICphcmcpCi17Ci0Jc3RydWN0IGJ1Y2tldF90YWJsZSAqbmV3X3RibCwgKm9sZF90Ymw7Ci0JdTMyIG5ld19oYXNoOwotCWJvb2wgc3VjY2VzcyA9IHRydWU7Ci0KLQlCVUdfT04oIWh0LT5wLmtleV9sZW4pOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCW9sZF90YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT50YmwsIGh0KTsKLQluZXdfdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+ZnV0dXJlX3RibCwgaHQpOwotCW5ld19oYXNoID0gb2JqX3Jhd19oYXNoZm4oaHQsIHJodF9vYmooaHQsIG9iaikpOwotCi0JbG9ja19idWNrZXRzKG5ld190YmwsIG9sZF90YmwsIG5ld19oYXNoKTsKLQotCWlmIChyaGFzaHRhYmxlX2xvb2t1cF9jb21wYXJlKGh0LCByaHRfb2JqKGh0LCBvYmopICsgaHQtPnAua2V5X29mZnNldCwKLQkJCQkgICAgICBjb21wYXJlLCBhcmcpKSB7Ci0JCXN1Y2Nlc3MgPSBmYWxzZTsKLQkJZ290byBleGl0OwotCX0KLQotCV9fcmhhc2h0YWJsZV9pbnNlcnQoaHQsIG9iaiwgbmV3X3RibCwgb2xkX3RibCwgbmV3X2hhc2gpOwogCiBleGl0OgotCXVubG9ja19idWNrZXRzKG5ld190YmwsIG9sZF90YmwsIG5ld19oYXNoKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKKwlzcGluX3VubG9jayhyaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKSk7CiAKLQlyZXR1cm4gc3VjY2VzczsKKwlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV9sb29rdXBfY29tcGFyZV9pbnNlcnQpOworRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV9pbnNlcnRfc2xvdyk7CiAKIC8qKgogICogcmhhc2h0YWJsZV93YWxrX2luaXQgLSBJbml0aWFsaXNlIGFuIGl0ZXJhdG9yCkBAIC04ODcsMTEgKzQ5NSw5IEBACiAJaWYgKCFpdGVyLT53YWxrZXIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JSU5JVF9MSVNUX0hFQUQoJml0ZXItPndhbGtlci0+bGlzdCk7Ci0JaXRlci0+d2Fsa2VyLT5yZXNpemUgPSBmYWxzZTsKLQogCW11dGV4X2xvY2soJmh0LT5tdXRleCk7Ci0JbGlzdF9hZGQoJml0ZXItPndhbGtlci0+bGlzdCwgJmh0LT53YWxrZXJzKTsKKwlpdGVyLT53YWxrZXItPnRibCA9IHJodF9kZXJlZmVyZW5jZShodC0+dGJsLCBodCk7CisJbGlzdF9hZGQoJml0ZXItPndhbGtlci0+bGlzdCwgJml0ZXItPndhbGtlci0+dGJsLT53YWxrZXJzKTsKIAltdXRleF91bmxvY2soJmh0LT5tdXRleCk7CiAKIAlyZXR1cm4gMDsKQEAgLTkwNyw3ICs1MTMsOCBAQAogdm9pZCByaGFzaHRhYmxlX3dhbGtfZXhpdChzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyICppdGVyKQogewogCW11dGV4X2xvY2soJml0ZXItPmh0LT5tdXRleCk7Ci0JbGlzdF9kZWwoJml0ZXItPndhbGtlci0+bGlzdCk7CisJaWYgKGl0ZXItPndhbGtlci0+dGJsKQorCQlsaXN0X2RlbCgmaXRlci0+d2Fsa2VyLT5saXN0KTsKIAltdXRleF91bmxvY2soJml0ZXItPmh0LT5tdXRleCk7CiAJa2ZyZWUoaXRlci0+d2Fsa2VyKTsKIH0KQEAgLTkyOCwxMyArNTM1LDIxIEBACiAgKiBieSBjYWxsaW5nIHJoYXNodGFibGVfd2Fsa19uZXh0LgogICovCiBpbnQgcmhhc2h0YWJsZV93YWxrX3N0YXJ0KHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpCisJX19hY3F1aXJlcyhSQ1UpCiB7CisJc3RydWN0IHJoYXNodGFibGUgKmh0ID0gaXRlci0+aHQ7CisKKwltdXRleF9sb2NrKCZodC0+bXV0ZXgpOworCisJaWYgKGl0ZXItPndhbGtlci0+dGJsKQorCQlsaXN0X2RlbCgmaXRlci0+d2Fsa2VyLT5saXN0KTsKKwogCXJjdV9yZWFkX2xvY2soKTsKIAotCWlmIChpdGVyLT53YWxrZXItPnJlc2l6ZSkgewotCQlpdGVyLT5zbG90ID0gMDsKLQkJaXRlci0+c2tpcCA9IDA7Ci0JCWl0ZXItPndhbGtlci0+cmVzaXplID0gZmFsc2U7CisJbXV0ZXhfdW5sb2NrKCZodC0+bXV0ZXgpOworCisJaWYgKCFpdGVyLT53YWxrZXItPnRibCkgeworCQlpdGVyLT53YWxrZXItPnRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CiAKQEAgLTk1NiwxMyArNTcxLDExIEBACiAgKi8KIHZvaWQgKnJoYXNodGFibGVfd2Fsa19uZXh0KHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpCiB7Ci0JY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCA9IGl0ZXItPndhbGtlci0+dGJsOwogCXN0cnVjdCByaGFzaHRhYmxlICpodCA9IGl0ZXItPmh0OwogCXN0cnVjdCByaGFzaF9oZWFkICpwID0gaXRlci0+cDsKIAl2b2lkICpvYmogPSBOVUxMOwogCi0JdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShodC0+dGJsLCBodCk7Ci0KIAlpZiAocCkgewogCQlwID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldF9yY3UocC0+bmV4dCwgdGJsLCBpdGVyLT5zbG90KTsKIAkJZ290byBuZXh0OwpAQCAtOTg4LDE2ICs2MDEsMTkgQEAKIAkJaXRlci0+c2tpcCA9IDA7CiAJfQogCisJLyogRW5zdXJlIHdlIHNlZSBhbnkgbmV3IHRhYmxlcy4gKi8KKwlzbXBfcm1iKCk7CisKKwlpdGVyLT53YWxrZXItPnRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UodGJsLT5mdXR1cmVfdGJsLCBodCk7CisJaWYgKGl0ZXItPndhbGtlci0+dGJsKSB7CisJCWl0ZXItPnNsb3QgPSAwOworCQlpdGVyLT5za2lwID0gMDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisJfQorCiAJaXRlci0+cCA9IE5VTEw7CiAKIG91dDoKLQlpZiAoaXRlci0+d2Fsa2VyLT5yZXNpemUpIHsKLQkJaXRlci0+cCA9IE5VTEw7Ci0JCWl0ZXItPnNsb3QgPSAwOwotCQlpdGVyLT5za2lwID0gMDsKLQkJaXRlci0+d2Fsa2VyLT5yZXNpemUgPSBmYWxzZTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7Ci0JfQogCiAJcmV0dXJuIG9iajsKIH0KQEAgLTEwMTAsMTYgKzYyNiwzOSBAQAogICogRmluaXNoIGEgaGFzaCB0YWJsZSB3YWxrLgogICovCiB2b2lkIHJoYXNodGFibGVfd2Fsa19zdG9wKHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpCisJX19yZWxlYXNlcyhSQ1UpCiB7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJc3RydWN0IHJoYXNodGFibGUgKmh0OworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCA9IGl0ZXItPndhbGtlci0+dGJsOworCisJaWYgKCF0YmwpCisJCWdvdG8gb3V0OworCisJaHQgPSBpdGVyLT5odDsKKworCXNwaW5fbG9jaygmaHQtPmxvY2spOworCWlmICh0YmwtPnJlaGFzaCA8IHRibC0+c2l6ZSkKKwkJbGlzdF9hZGQoJml0ZXItPndhbGtlci0+bGlzdCwgJnRibC0+d2Fsa2Vycyk7CisJZWxzZQorCQlpdGVyLT53YWxrZXItPnRibCA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmh0LT5sb2NrKTsKKwogCWl0ZXItPnAgPSBOVUxMOworCitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX3dhbGtfc3RvcCk7CiAKLXN0YXRpYyBzaXplX3Qgcm91bmRlZF9oYXNodGFibGVfc2l6ZShzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgKnBhcmFtcykKK3N0YXRpYyBzaXplX3Qgcm91bmRlZF9oYXNodGFibGVfc2l6ZShjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgKnBhcmFtcykKIHsKIAlyZXR1cm4gbWF4KHJvdW5kdXBfcG93X29mX3R3byhwYXJhbXMtPm5lbGVtX2hpbnQgKiA0IC8gMyksCi0JCSAgIDFVTCA8PCBwYXJhbXMtPm1pbl9zaGlmdCk7CisJCSAgICh1bnNpZ25lZCBsb25nKXBhcmFtcy0+bWluX3NpemUpOworfQorCitzdGF0aWMgdTMyIHJoYXNodGFibGVfamhhc2gyKGNvbnN0IHZvaWQgKmtleSwgdTMyIGxlbmd0aCwgdTMyIHNlZWQpCit7CisJcmV0dXJuIGpoYXNoMihrZXksIGxlbmd0aCwgc2VlZCk7CiB9CiAKIC8qKgpAQCAtMTA1Miw3ICs2OTEsNyBAQAogICoJc3RydWN0IHJoYXNoX2hlYWQJbm9kZTsKICAqIH07CiAgKgotICogdTMyIG15X2hhc2hfZm4oY29uc3Qgdm9pZCAqZGF0YSwgdTMyIHNlZWQpCisgKiB1MzIgbXlfaGFzaF9mbihjb25zdCB2b2lkICpkYXRhLCB1MzIgbGVuLCB1MzIgc2VlZCkKICAqIHsKICAqCXN0cnVjdCB0ZXN0X29iaiAqb2JqID0gZGF0YTsKICAqCkBAIC0xMDY1LDQ3ICs3MDQsNzQgQEAKICAqCS5vYmpfaGFzaGZuID0gbXlfaGFzaF9mbiwKICAqIH07CiAgKi8KLWludCByaGFzaHRhYmxlX2luaXQoc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgKnBhcmFtcykKK2ludCByaGFzaHRhYmxlX2luaXQoc3RydWN0IHJoYXNodGFibGUgKmh0LAorCQkgICAgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOwogCXNpemVfdCBzaXplOwogCiAJc2l6ZSA9IEhBU0hfREVGQVVMVF9TSVpFOwogCi0JaWYgKChwYXJhbXMtPmtleV9sZW4gJiYgIXBhcmFtcy0+aGFzaGZuKSB8fAotCSAgICAoIXBhcmFtcy0+a2V5X2xlbiAmJiAhcGFyYW1zLT5vYmpfaGFzaGZuKSkKKwlpZiAoKCFwYXJhbXMtPmtleV9sZW4gJiYgIXBhcmFtcy0+b2JqX2hhc2hmbikgfHwKKwkgICAgKHBhcmFtcy0+b2JqX2hhc2hmbiAmJiAhcGFyYW1zLT5vYmpfY21wZm4pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChwYXJhbXMtPm51bGxzX2Jhc2UgJiYgcGFyYW1zLT5udWxsc19iYXNlIDwgKDFVIDw8IFJIVF9CQVNFX1NISUZUKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwYXJhbXMtPm1pbl9zaGlmdCA9IG1heF90KHNpemVfdCwgcGFyYW1zLT5taW5fc2hpZnQsCi0JCQkJICBpbG9nMihIQVNIX01JTl9TSVpFKSk7Ci0KIAlpZiAocGFyYW1zLT5uZWxlbV9oaW50KQogCQlzaXplID0gcm91bmRlZF9oYXNodGFibGVfc2l6ZShwYXJhbXMpOwogCiAJbWVtc2V0KGh0LCAwLCBzaXplb2YoKmh0KSk7CiAJbXV0ZXhfaW5pdCgmaHQtPm11dGV4KTsKKwlzcGluX2xvY2tfaW5pdCgmaHQtPmxvY2spOwogCW1lbWNweSgmaHQtPnAsIHBhcmFtcywgc2l6ZW9mKCpwYXJhbXMpKTsKLQlJTklUX0xJU1RfSEVBRCgmaHQtPndhbGtlcnMpOworCisJaWYgKHBhcmFtcy0+bWluX3NpemUpCisJCWh0LT5wLm1pbl9zaXplID0gcm91bmR1cF9wb3dfb2ZfdHdvKHBhcmFtcy0+bWluX3NpemUpOworCisJaWYgKHBhcmFtcy0+bWF4X3NpemUpCisJCWh0LT5wLm1heF9zaXplID0gcm91bmRkb3duX3Bvd19vZl90d28ocGFyYW1zLT5tYXhfc2l6ZSk7CisKKwlodC0+cC5taW5fc2l6ZSA9IG1heChodC0+cC5taW5fc2l6ZSwgSEFTSF9NSU5fU0laRSk7CisKKwkvKiBUaGUgbWF4aW11bSAobm90IGF2ZXJhZ2UpIGNoYWluIGxlbmd0aCBncm93cyB3aXRoIHRoZQorCSAqIHNpemUgb2YgdGhlIGhhc2ggdGFibGUsIGF0IGEgcmF0ZSBvZiAobG9nIE4pLyhsb2cgbG9nIE4pLgorCSAqIFRoZSB2YWx1ZSBvZiAxNiBpcyBzZWxlY3RlZCBzbyB0aGF0IGV2ZW4gaWYgdGhlIGhhc2gKKwkgKiB0YWJsZSBncmV3IHRvIDJeMzIgeW91IHdvdWxkIG5vdCBleHBlY3QgdGhlIG1heGltdW0KKwkgKiBjaGFpbiBsZW5ndGggdG8gZXhjZWVkIGl0IHVubGVzcyB3ZSBhcmUgdW5kZXIgYXR0YWNrCisJICogKG9yIGV4dHJlbWVseSB1bmx1Y2t5KS4KKwkgKgorCSAqIEFzIHRoaXMgbGltaXQgaXMgb25seSB0byBkZXRlY3QgYXR0YWNrcywgd2UgZG9uJ3QgbmVlZAorCSAqIHRvIHNldCBpdCB0byBhIGxvd2VyIHZhbHVlIGFzIHlvdSdkIG5lZWQgdGhlIGNoYWluCisJICogbGVuZ3RoIHRvIHZhc3RseSBleGNlZWQgMTYgdG8gaGF2ZSBhbnkgcmVhbCBlZmZlY3QKKwkgKiBvbiB0aGUgc3lzdGVtLgorCSAqLworCWlmICghcGFyYW1zLT5pbnNlY3VyZV9lbGFzdGljaXR5KQorCQlodC0+ZWxhc3RpY2l0eSA9IDE2OwogCiAJaWYgKHBhcmFtcy0+bG9ja3NfbXVsKQogCQlodC0+cC5sb2Nrc19tdWwgPSByb3VuZHVwX3Bvd19vZl90d28ocGFyYW1zLT5sb2Nrc19tdWwpOwogCWVsc2UKIAkJaHQtPnAubG9ja3NfbXVsID0gQlVDS0VUX0xPQ0tTX1BFUl9DUFU7CiAKLQl0YmwgPSBidWNrZXRfdGFibGVfYWxsb2MoaHQsIHNpemUpOworCWh0LT5rZXlfbGVuID0gaHQtPnAua2V5X2xlbjsKKwlpZiAoIXBhcmFtcy0+aGFzaGZuKSB7CisJCWh0LT5wLmhhc2hmbiA9IGpoYXNoOworCisJCWlmICghKGh0LT5rZXlfbGVuICYgKHNpemVvZih1MzIpIC0gMSkpKSB7CisJCQlodC0+a2V5X2xlbiAvPSBzaXplb2YodTMyKTsKKwkJCWh0LT5wLmhhc2hmbiA9IHJoYXNodGFibGVfamhhc2gyOworCQl9CisJfQorCisJdGJsID0gYnVja2V0X3RhYmxlX2FsbG9jKGh0LCBzaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAodGJsID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJYXRvbWljX3NldCgmaHQtPm5lbGVtcywgMCk7Ci0JYXRvbWljX3NldCgmaHQtPnNoaWZ0LCBpbG9nMih0YmwtPnNpemUpKTsKLQlSQ1VfSU5JVF9QT0lOVEVSKGh0LT50YmwsIHRibCk7Ci0JUkNVX0lOSVRfUE9JTlRFUihodC0+ZnV0dXJlX3RibCwgdGJsKTsKIAotCWlmICghaHQtPnAuaGFzaF9ybmQpCi0JCWdldF9yYW5kb21fYnl0ZXMoJmh0LT5wLmhhc2hfcm5kLCBzaXplb2YoaHQtPnAuaGFzaF9ybmQpKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKGh0LT50YmwsIHRibCk7CiAKIAlJTklUX1dPUksoJmh0LT5ydW5fd29yaywgcmh0X2RlZmVycmVkX3dvcmtlcik7CiAKQEAgLTExMTQsMjEgKzc4MCw1MyBAQAogRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV9pbml0KTsKIAogLyoqCi0gKiByaGFzaHRhYmxlX2Rlc3Ryb3kgLSBkZXN0cm95IGhhc2ggdGFibGUKKyAqIHJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveSAtIGZyZWUgZWxlbWVudHMgYW5kIGRlc3Ryb3kgaGFzaCB0YWJsZQogICogQGh0OgkJdGhlIGhhc2ggdGFibGUgdG8gZGVzdHJveQorICogQGZyZWVfZm46CWNhbGxiYWNrIHRvIHJlbGVhc2UgcmVzb3VyY2VzIG9mIGVsZW1lbnQKKyAqIEBhcmc6CXBvaW50ZXIgcGFzc2VkIHRvIGZyZWVfZm4KICAqCi0gKiBGcmVlcyB0aGUgYnVja2V0IGFycmF5LiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCByY3Ugc2FmZSwgdGhlcmVmb3JlIHRoZSBjYWxsZXIKLSAqIGhhcyB0byBtYWtlIHN1cmUgdGhhdCBubyByZXNpemluZyBtYXkgaGFwcGVuIGJ5IHVucHVibGlzaGluZyB0aGUgaGFzaHRhYmxlCi0gKiBhbmQgd2FpdGluZyBmb3IgdGhlIHF1aWVzY2VudCBjeWNsZSBiZWZvcmUgcmVsZWFzaW5nIHRoZSBidWNrZXQgYXJyYXkuCisgKiBTdG9wcyBhbiBldmVudHVhbCBhc3luYyByZXNpemUuIElmIGRlZmluZWQsIGludm9rZXMgZnJlZV9mbiBmb3IgZWFjaAorICogZWxlbWVudCB0byByZWxlYXNhbCByZXNvdXJjZXMuIFBsZWFzZSBub3RlIHRoYXQgUkNVIHByb3RlY3RlZAorICogcmVhZGVycyBtYXkgc3RpbGwgYmUgYWNjZXNzaW5nIHRoZSBlbGVtZW50cy4gUmVsZWFzaW5nIG9mIHJlc291cmNlcworICogbXVzdCBvY2N1ciBpbiBhIGNvbXBhdGlibGUgbWFubmVyLiBUaGVuIGZyZWVzIHRoZSBidWNrZXQgYXJyYXkuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGV2ZW50dWFsbHkgc2xlZXAgdG8gd2FpdCBmb3IgYW4gYXN5bmMgcmVzaXplCisgKiB0byBjb21wbGV0ZS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSB0aGF0IG5vIGZ1cnRoZXIgd3JpdGUgb3BlcmF0aW9ucworICogb2NjdXJzIGluIHBhcmFsbGVsLgogICovCi12b2lkIHJoYXNodGFibGVfZGVzdHJveShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQpCit2b2lkIHJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJIHZvaWQgKCpmcmVlX2ZuKSh2b2lkICpwdHIsIHZvaWQgKmFyZyksCisJCQkJIHZvaWQgKmFyZykKIHsKLQlodC0+YmVpbmdfZGVzdHJveWVkID0gdHJ1ZTsKKwljb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CisJdW5zaWduZWQgaW50IGk7CiAKIAljYW5jZWxfd29ya19zeW5jKCZodC0+cnVuX3dvcmspOwogCiAJbXV0ZXhfbG9jaygmaHQtPm11dGV4KTsKLQlidWNrZXRfdGFibGVfZnJlZShyaHRfZGVyZWZlcmVuY2UoaHQtPnRibCwgaHQpKTsKKwl0YmwgPSByaHRfZGVyZWZlcmVuY2UoaHQtPnRibCwgaHQpOworCWlmIChmcmVlX2ZuKSB7CisJCWZvciAoaSA9IDA7IGkgPCB0YmwtPnNpemU7IGkrKykgeworCQkJc3RydWN0IHJoYXNoX2hlYWQgKnBvcywgKm5leHQ7CisKKwkJCWZvciAocG9zID0gcmh0X2RlcmVmZXJlbmNlKHRibC0+YnVja2V0c1tpXSwgaHQpLAorCQkJICAgICBuZXh0ID0gIXJodF9pc19hX251bGxzKHBvcykgPworCQkJCQlyaHRfZGVyZWZlcmVuY2UocG9zLT5uZXh0LCBodCkgOiBOVUxMOworCQkJICAgICAhcmh0X2lzX2FfbnVsbHMocG9zKTsKKwkJCSAgICAgcG9zID0gbmV4dCwKKwkJCSAgICAgbmV4dCA9ICFyaHRfaXNfYV9udWxscyhwb3MpID8KKwkJCQkJcmh0X2RlcmVmZXJlbmNlKHBvcy0+bmV4dCwgaHQpIDogTlVMTCkKKwkJCQlmcmVlX2ZuKHJodF9vYmooaHQsIHBvcyksIGFyZyk7CisJCX0KKwl9CisKKwlidWNrZXRfdGFibGVfZnJlZSh0YmwpOwogCW11dGV4X3VubG9jaygmaHQtPm11dGV4KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveSk7CisKK3ZvaWQgcmhhc2h0YWJsZV9kZXN0cm95KHN0cnVjdCByaGFzaHRhYmxlICpodCkKK3sKKwlyZXR1cm4gcmhhc2h0YWJsZV9mcmVlX2FuZF9kZXN0cm95KGh0LCBOVUxMLCBOVUxMKTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfZGVzdHJveSk7CmRpZmYgLS1naXQgYS9saWIvc2hhMS5jIGIvbGliL3NoYTEuYwppbmRleCAxZGYxOTFlLi41YTU2ZGZkIDEwMDY0NAotLS0gYS9saWIvc2hhMS5jCisrKyBiL2xpYi9zaGExLmMKQEAgLTE5OCwzICsxOTgsNCBAQAogCWJ1ZlszXSA9IDB4MTAzMjU0NzY7CiAJYnVmWzRdID0gMHhjM2QyZTFmMDsKIH0KK0VYUE9SVF9TWU1CT0woc2hhX2luaXQpOwpkaWZmIC0tZ2l0IGEvbGliL3N0cmluZy5jIGIvbGliL3N0cmluZy5jCmluZGV4IGNlODFhYWUuLmE1NzkyMDEgMTAwNjQ0Ci0tLSBhL2xpYi9zdHJpbmcuYworKysgYi9saWIvc3RyaW5nLmMKQEAgLTYwNyw3ICs2MDcsNyBAQAogdm9pZCBtZW16ZXJvX2V4cGxpY2l0KHZvaWQgKnMsIHNpemVfdCBjb3VudCkKIHsKIAltZW1zZXQocywgMCwgY291bnQpOwotCU9QVElNSVpFUl9ISURFX1ZBUihzKTsKKwliYXJyaWVyKCk7CiB9CiBFWFBPUlRfU1lNQk9MKG1lbXplcm9fZXhwbGljaXQpOwogCmRpZmYgLS1naXQgYS9saWIvc3RyaW5nX2hlbHBlcnMuYyBiL2xpYi9zdHJpbmdfaGVscGVycy5jCmluZGV4IDhmOGM0NDEuLjE4MjZjNzQgMTAwNjQ0Ci0tLSBhL2xpYi9zdHJpbmdfaGVscGVycy5jCisrKyBiL2xpYi9zdHJpbmdfaGVscGVycy5jCkBAIC0yMzksMjkgKzIzOSwyMSBAQAogfQogRVhQT1JUX1NZTUJPTChzdHJpbmdfdW5lc2NhcGUpOwogCi1zdGF0aWMgaW50IGVzY2FwZV9wYXNzdGhyb3VnaCh1bnNpZ25lZCBjaGFyIGMsIGNoYXIgKipkc3QsIHNpemVfdCAqb3N6KQorc3RhdGljIGJvb2wgZXNjYXBlX3Bhc3N0aHJvdWdoKHVuc2lnbmVkIGNoYXIgYywgY2hhciAqKmRzdCwgY2hhciAqZW5kKQogewogCWNoYXIgKm91dCA9ICpkc3Q7CiAKLQlpZiAoKm9zeiA8IDEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JKm91dCsrID0gYzsKLQotCSpkc3QgPSBvdXQ7Ci0JKm9zeiAtPSAxOwotCi0JcmV0dXJuIDE7CisJaWYgKG91dCA8IGVuZCkKKwkJKm91dCA9IGM7CisJKmRzdCA9IG91dCArIDE7CisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgZXNjYXBlX3NwYWNlKHVuc2lnbmVkIGNoYXIgYywgY2hhciAqKmRzdCwgc2l6ZV90ICpvc3opCitzdGF0aWMgYm9vbCBlc2NhcGVfc3BhY2UodW5zaWduZWQgY2hhciBjLCBjaGFyICoqZHN0LCBjaGFyICplbmQpCiB7CiAJY2hhciAqb3V0ID0gKmRzdDsKIAl1bnNpZ25lZCBjaGFyIHRvOwogCi0JaWYgKCpvc3ogPCAyKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCXN3aXRjaCAoYykgewogCWNhc2UgJ1xuJzoKIAkJdG8gPSAnbic7CkBAIC0yNzksMjYgKzI3MSwyNSBAQAogCQl0byA9ICdmJzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAl9CiAKLQkqb3V0KysgPSAnXFwnOwotCSpvdXQrKyA9IHRvOworCWlmIChvdXQgPCBlbmQpCisJCSpvdXQgPSAnXFwnOworCSsrb3V0OworCWlmIChvdXQgPCBlbmQpCisJCSpvdXQgPSB0bzsKKwkrK291dDsKIAogCSpkc3QgPSBvdXQ7Ci0JKm9zeiAtPSAyOwotCi0JcmV0dXJuIDE7CisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgZXNjYXBlX3NwZWNpYWwodW5zaWduZWQgY2hhciBjLCBjaGFyICoqZHN0LCBzaXplX3QgKm9zeikKK3N0YXRpYyBib29sIGVzY2FwZV9zcGVjaWFsKHVuc2lnbmVkIGNoYXIgYywgY2hhciAqKmRzdCwgY2hhciAqZW5kKQogewogCWNoYXIgKm91dCA9ICpkc3Q7CiAJdW5zaWduZWQgY2hhciB0bzsKIAotCWlmICgqb3N6IDwgMikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlzd2l0Y2ggKGMpIHsKIAljYXNlICdcXCc6CiAJCXRvID0gJ1xcJzsKQEAgLTMxMCw3MSArMzAxLDc4IEBACiAJCXRvID0gJ2UnOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCX0KIAotCSpvdXQrKyA9ICdcXCc7Ci0JKm91dCsrID0gdG87CisJaWYgKG91dCA8IGVuZCkKKwkJKm91dCA9ICdcXCc7CisJKytvdXQ7CisJaWYgKG91dCA8IGVuZCkKKwkJKm91dCA9IHRvOworCSsrb3V0OwogCiAJKmRzdCA9IG91dDsKLQkqb3N6IC09IDI7Ci0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIGludCBlc2NhcGVfbnVsbCh1bnNpZ25lZCBjaGFyIGMsIGNoYXIgKipkc3QsIHNpemVfdCAqb3N6KQorc3RhdGljIGJvb2wgZXNjYXBlX251bGwodW5zaWduZWQgY2hhciBjLCBjaGFyICoqZHN0LCBjaGFyICplbmQpCiB7CiAJY2hhciAqb3V0ID0gKmRzdDsKIAotCWlmICgqb3N6IDwgMikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KIAlpZiAoYykKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAotCSpvdXQrKyA9ICdcXCc7Ci0JKm91dCsrID0gJzAnOworCWlmIChvdXQgPCBlbmQpCisJCSpvdXQgPSAnXFwnOworCSsrb3V0OworCWlmIChvdXQgPCBlbmQpCisJCSpvdXQgPSAnMCc7CisJKytvdXQ7CiAKIAkqZHN0ID0gb3V0OwotCSpvc3ogLT0gMjsKLQotCXJldHVybiAxOworCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW50IGVzY2FwZV9vY3RhbCh1bnNpZ25lZCBjaGFyIGMsIGNoYXIgKipkc3QsIHNpemVfdCAqb3N6KQorc3RhdGljIGJvb2wgZXNjYXBlX29jdGFsKHVuc2lnbmVkIGNoYXIgYywgY2hhciAqKmRzdCwgY2hhciAqZW5kKQogewogCWNoYXIgKm91dCA9ICpkc3Q7CiAKLQlpZiAoKm9zeiA8IDQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JKm91dCsrID0gJ1xcJzsKLQkqb3V0KysgPSAoKGMgPj4gNikgJiAweDA3KSArICcwJzsKLQkqb3V0KysgPSAoKGMgPj4gMykgJiAweDA3KSArICcwJzsKLQkqb3V0KysgPSAoKGMgPj4gMCkgJiAweDA3KSArICcwJzsKKwlpZiAob3V0IDwgZW5kKQorCQkqb3V0ID0gJ1xcJzsKKwkrK291dDsKKwlpZiAob3V0IDwgZW5kKQorCQkqb3V0ID0gKChjID4+IDYpICYgMHgwNykgKyAnMCc7CisJKytvdXQ7CisJaWYgKG91dCA8IGVuZCkKKwkJKm91dCA9ICgoYyA+PiAzKSAmIDB4MDcpICsgJzAnOworCSsrb3V0OworCWlmIChvdXQgPCBlbmQpCisJCSpvdXQgPSAoKGMgPj4gMCkgJiAweDA3KSArICcwJzsKKwkrK291dDsKIAogCSpkc3QgPSBvdXQ7Ci0JKm9zeiAtPSA0OwotCi0JcmV0dXJuIDE7CisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgZXNjYXBlX2hleCh1bnNpZ25lZCBjaGFyIGMsIGNoYXIgKipkc3QsIHNpemVfdCAqb3N6KQorc3RhdGljIGJvb2wgZXNjYXBlX2hleCh1bnNpZ25lZCBjaGFyIGMsIGNoYXIgKipkc3QsIGNoYXIgKmVuZCkKIHsKIAljaGFyICpvdXQgPSAqZHN0OwogCi0JaWYgKCpvc3ogPCA0KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCSpvdXQrKyA9ICdcXCc7Ci0JKm91dCsrID0gJ3gnOwotCSpvdXQrKyA9IGhleF9hc2NfaGkoYyk7Ci0JKm91dCsrID0gaGV4X2FzY19sbyhjKTsKKwlpZiAob3V0IDwgZW5kKQorCQkqb3V0ID0gJ1xcJzsKKwkrK291dDsKKwlpZiAob3V0IDwgZW5kKQorCQkqb3V0ID0gJ3gnOworCSsrb3V0OworCWlmIChvdXQgPCBlbmQpCisJCSpvdXQgPSBoZXhfYXNjX2hpKGMpOworCSsrb3V0OworCWlmIChvdXQgPCBlbmQpCisJCSpvdXQgPSBoZXhfYXNjX2xvKGMpOworCSsrb3V0OwogCiAJKmRzdCA9IG91dDsKLQkqb3N6IC09IDQ7Ci0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogLyoqCkBAIC00MjYsMTkgKzQyNCwxNyBAQAogICogaXQgaWYgbmVlZHMuCiAgKgogICogUmV0dXJuOgotICogVGhlIGFtb3VudCBvZiB0aGUgY2hhcmFjdGVycyBwcm9jZXNzZWQgdG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgb3IKLSAqICUtRU5PTUVNIGlmIHRoZSBzaXplIG9mIGJ1ZmZlciBpcyBub3QgZW5vdWdoIHRvIHB1dCBhbiBlc2NhcGVkIGNoYXJhY3RlciBpcwotICogcmV0dXJuZWQuCi0gKgotICogRXZlbiBpbiB0aGUgY2FzZSBvZiBlcnJvciBAZHN0IHBvaW50ZXIgd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBieXRlCi0gKiBhZnRlciB0aGUgbGFzdCBwcm9jZXNzZWQgY2hhcmFjdGVyLgorICogVGhlIHRvdGFsIHNpemUgb2YgdGhlIGVzY2FwZWQgb3V0cHV0IHRoYXQgd291bGQgYmUgZ2VuZXJhdGVkIGZvcgorICogdGhlIGdpdmVuIGlucHV0IGFuZCBmbGFncy4gVG8gY2hlY2sgd2hldGhlciB0aGUgb3V0cHV0IHdhcworICogdHJ1bmNhdGVkLCBjb21wYXJlIHRoZSByZXR1cm4gdmFsdWUgdG8gb3N6LiBUaGVyZSBpcyByb29tIGxlZnQgaW4KKyAqIGRzdCBmb3IgYSAnXDAnIHRlcm1pbmF0b3IgaWYgYW5kIG9ubHkgaWYgcmV0IDwgb3N6LgogICovCi1pbnQgc3RyaW5nX2VzY2FwZV9tZW0oY29uc3QgY2hhciAqc3JjLCBzaXplX3QgaXN6LCBjaGFyICoqZHN0LCBzaXplX3Qgb3N6LAoraW50IHN0cmluZ19lc2NhcGVfbWVtKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGlzeiwgY2hhciAqZHN0LCBzaXplX3Qgb3N6LAogCQkgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmVzYykKIHsKLQljaGFyICpvdXQgPSAqZHN0LCAqcCA9IG91dDsKKwljaGFyICpwID0gZHN0OworCWNoYXIgKmVuZCA9IHAgKyBvc3o7CiAJYm9vbCBpc19kaWN0ID0gZXNjICYmICplc2M7Ci0JaW50IHJldCA9IDA7CiAKIAl3aGlsZSAoaXN6LS0pIHsKIAkJdW5zaWduZWQgY2hhciBjID0gKnNyYysrOwpAQCAtNDU4LDU1ICs0NTQsMjYgQEAKIAkJICAgIChpc19kaWN0ICYmICFzdHJjaHIoZXNjLCBjKSkpIHsKIAkJCS8qIGRvIG5vdGhpbmcgKi8KIAkJfSBlbHNlIHsKLQkJCWlmIChmbGFncyAmIEVTQ0FQRV9TUEFDRSkgewotCQkJCXJldCA9IGVzY2FwZV9zcGFjZShjLCAmcCwgJm9zeik7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWJyZWFrOwotCQkJCWlmIChyZXQgPiAwKQotCQkJCQljb250aW51ZTsKLQkJCX0KKwkJCWlmIChmbGFncyAmIEVTQ0FQRV9TUEFDRSAmJiBlc2NhcGVfc3BhY2UoYywgJnAsIGVuZCkpCisJCQkJY29udGludWU7CiAKLQkJCWlmIChmbGFncyAmIEVTQ0FQRV9TUEVDSUFMKSB7Ci0JCQkJcmV0ID0gZXNjYXBlX3NwZWNpYWwoYywgJnAsICZvc3opOwotCQkJCWlmIChyZXQgPCAwKQotCQkJCQlicmVhazsKLQkJCQlpZiAocmV0ID4gMCkKLQkJCQkJY29udGludWU7Ci0JCQl9CisJCQlpZiAoZmxhZ3MgJiBFU0NBUEVfU1BFQ0lBTCAmJiBlc2NhcGVfc3BlY2lhbChjLCAmcCwgZW5kKSkKKwkJCQljb250aW51ZTsKIAotCQkJaWYgKGZsYWdzICYgRVNDQVBFX05VTEwpIHsKLQkJCQlyZXQgPSBlc2NhcGVfbnVsbChjLCAmcCwgJm9zeik7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWJyZWFrOwotCQkJCWlmIChyZXQgPiAwKQotCQkJCQljb250aW51ZTsKLQkJCX0KKwkJCWlmIChmbGFncyAmIEVTQ0FQRV9OVUxMICYmIGVzY2FwZV9udWxsKGMsICZwLCBlbmQpKQorCQkJCWNvbnRpbnVlOwogCiAJCQkvKiBFU0NBUEVfT0NUQUwgYW5kIEVTQ0FQRV9IRVggYWx3YXlzIGdvIGxhc3QgKi8KLQkJCWlmIChmbGFncyAmIEVTQ0FQRV9PQ1RBTCkgewotCQkJCXJldCA9IGVzY2FwZV9vY3RhbChjLCAmcCwgJm9zeik7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWJyZWFrOworCQkJaWYgKGZsYWdzICYgRVNDQVBFX09DVEFMICYmIGVzY2FwZV9vY3RhbChjLCAmcCwgZW5kKSkKIAkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChmbGFncyAmIEVTQ0FQRV9IRVgpIHsKLQkJCQlyZXQgPSBlc2NhcGVfaGV4KGMsICZwLCAmb3N6KTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJYnJlYWs7CisKKwkJCWlmIChmbGFncyAmIEVTQ0FQRV9IRVggJiYgZXNjYXBlX2hleChjLCAmcCwgZW5kKSkKIAkJCQljb250aW51ZTsKLQkJCX0KIAkJfQogCi0JCXJldCA9IGVzY2FwZV9wYXNzdGhyb3VnaChjLCAmcCwgJm9zeik7Ci0JCWlmIChyZXQgPCAwKQotCQkJYnJlYWs7CisJCWVzY2FwZV9wYXNzdGhyb3VnaChjLCAmcCwgZW5kKTsKIAl9CiAKLQkqZHN0ID0gcDsKLQotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHAgLSBvdXQ7CisJcmV0dXJuIHAgLSBkc3Q7CiB9CiBFWFBPUlRfU1lNQk9MKHN0cmluZ19lc2NhcGVfbWVtKTsKZGlmZiAtLWdpdCBhL2xpYi90ZXN0LWhleGR1bXAuYyBiL2xpYi90ZXN0LWhleGR1bXAuYwppbmRleCBkYWYyOWEzOS4uOTg0NmZmNyAxMDA2NDQKLS0tIGEvbGliL3Rlc3QtaGV4ZHVtcC5jCisrKyBiL2xpYi90ZXN0LWhleGR1bXAuYwpAQCAtMTgsMjYgKzE4LDI2IEBACiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGRhdGFfYVtdID0gIi4yLnsuLi4ucC4uJH0uNC4uLjEuLi4uLkwuLi5DLi4uIjsKIAotc3RhdGljIGNvbnN0IGNoYXIgKnRlc3RfZGF0YV8xX2xlW10gX19pbml0Y29uc3QgPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRlc3RfZGF0YV8xX2xlW10gX19pbml0Y29uc3QgPSB7CiAJImJlIiwgIjMyIiwgImRiIiwgIjdiIiwgIjBhIiwgIjE4IiwgIjkzIiwgImIyIiwKIAkiNzAiLCAiYmEiLCAiYzQiLCAiMjQiLCAiN2QiLCAiODMiLCAiMzQiLCAiOWIiLAogCSJhNiIsICI5YyIsICIzMSIsICJhZCIsICI5YyIsICIwZiIsICJhYyIsICJlOSIsCiAJIjRjIiwgImQxIiwgIjE5IiwgIjk5IiwgIjQzIiwgImIxIiwgImFmIiwgIjBjIiwKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyICp0ZXN0X2RhdGFfMl9sZVtdIF9faW5pdGNvbnN0ID0geworc3RhdGljIGNvbnN0IGNoYXIgKnRlc3RfZGF0YV8yX2xlW10gX19pbml0ZGF0YSA9IHsKIAkiMzJiZSIsICI3YmRiIiwgIjE4MGEiLCAiYjI5MyIsCiAJImJhNzAiLCAiMjRjNCIsICI4MzdkIiwgIjliMzQiLAogCSI5Y2E2IiwgImFkMzEiLCAiMGY5YyIsICJlOWFjIiwKIAkiZDE0YyIsICI5OTE5IiwgImIxNDMiLCAiMGNhZiIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqdGVzdF9kYXRhXzRfbGVbXSBfX2luaXRjb25zdCA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICp0ZXN0X2RhdGFfNF9sZVtdIF9faW5pdGRhdGEgPSB7CiAJIjdiZGIzMmJlIiwgImIyOTMxODBhIiwgIjI0YzRiYTcwIiwgIjliMzQ4MzdkIiwKIAkiYWQzMTljYTYiLCAiZTlhYzBmOWMiLCAiOTkxOWQxNGMiLCAiMGNhZmIxNDMiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKnRlc3RfZGF0YV84X2xlW10gX19pbml0Y29uc3QgPSB7CitzdGF0aWMgY29uc3QgY2hhciAqdGVzdF9kYXRhXzhfbGVbXSBfX2luaXRkYXRhID0gewogCSJiMjkzMTgwYTdiZGIzMmJlIiwgIjliMzQ4MzdkMjRjNGJhNzAiLAogCSJlOWFjMGY5Y2FkMzE5Y2E2IiwgIjBjYWZiMTQzOTkxOWQxNGMiLAogfTsKZGlmZiAtLWdpdCBhL2xpYi90ZXN0LXN0cmluZ19oZWxwZXJzLmMgYi9saWIvdGVzdC1zdHJpbmdfaGVscGVycy5jCmluZGV4IGFiMGQzMGUuLjhlMzc2ZWYgMTAwNjQ0Ci0tLSBhL2xpYi90ZXN0LXN0cmluZ19oZWxwZXJzLmMKKysrIGIvbGliL3Rlc3Qtc3RyaW5nX2hlbHBlcnMuYwpAQCAtMjYwLDE2ICsyNjAsMjggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIF9faW5pdCB2b2lkCit0ZXN0X3N0cmluZ19lc2NhcGVfb3ZlcmZsb3coY29uc3QgY2hhciAqaW4sIGludCBwLCB1bnNpZ25lZCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKmVzYywKKwkJCSAgICBpbnQgcV90ZXN0LCBjb25zdCBjaGFyICpuYW1lKQoreworCWludCBxX3JlYWw7CisKKwlxX3JlYWwgPSBzdHJpbmdfZXNjYXBlX21lbShpbiwgcCwgTlVMTCwgMCwgZmxhZ3MsIGVzYyk7CisJaWYgKHFfcmVhbCAhPSBxX3Rlc3QpCisJCXByX3dhcm4oIlRlc3QgJyVzJyBmYWlsZWQ6IGZsYWdzID0gJXUsIG9zeiA9IDAsIGV4cGVjdGVkICVkLCBnb3QgJWRcbiIsCisJCQluYW1lLCBmbGFncywgcV90ZXN0LCBxX3JlYWwpOworfQorCiBzdGF0aWMgX19pbml0IHZvaWQgdGVzdF9zdHJpbmdfZXNjYXBlKGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IHRlc3Rfc3RyaW5nXzIgKnMyLAogCQkJCSAgICAgIHVuc2lnbmVkIGludCBmbGFncywgY29uc3QgY2hhciAqZXNjKQogewotCWludCBxX3JlYWwgPSA1MTI7Ci0JY2hhciAqb3V0X3Rlc3QgPSBrbWFsbG9jKHFfcmVhbCwgR0ZQX0tFUk5FTCk7Ci0JY2hhciAqb3V0X3JlYWwgPSBrbWFsbG9jKHFfcmVhbCwgR0ZQX0tFUk5FTCk7CisJc2l6ZV90IG91dF9zaXplID0gNTEyOworCWNoYXIgKm91dF90ZXN0ID0ga21hbGxvYyhvdXRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJY2hhciAqb3V0X3JlYWwgPSBrbWFsbG9jKG91dF9zaXplLCBHRlBfS0VSTkVMKTsKIAljaGFyICppbiA9IGttYWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKLQljaGFyICpidWYgPSBvdXRfcmVhbDsKIAlpbnQgcCA9IDAsIHFfdGVzdCA9IDA7CisJaW50IHFfcmVhbDsKIAogCWlmICghb3V0X3Rlc3QgfHwgIW91dF9yZWFsIHx8ICFpbikKIAkJZ290byBvdXQ7CkBAIC0zMDEsMjkgKzMxMywxOSBAQAogCQlxX3Rlc3QgKz0gbGVuOwogCX0KIAotCXFfcmVhbCA9IHN0cmluZ19lc2NhcGVfbWVtKGluLCBwLCAmYnVmLCBxX3JlYWwsIGZsYWdzLCBlc2MpOworCXFfcmVhbCA9IHN0cmluZ19lc2NhcGVfbWVtKGluLCBwLCBvdXRfcmVhbCwgb3V0X3NpemUsIGZsYWdzLCBlc2MpOwogCiAJdGVzdF9zdHJpbmdfY2hlY2tfYnVmKG5hbWUsIGZsYWdzLCBpbiwgcCwgb3V0X3JlYWwsIHFfcmVhbCwgb3V0X3Rlc3QsCiAJCQkgICAgICBxX3Rlc3QpOworCisJdGVzdF9zdHJpbmdfZXNjYXBlX292ZXJmbG93KGluLCBwLCBmbGFncywgZXNjLCBxX3Rlc3QsIG5hbWUpOworCiBvdXQ6CiAJa2ZyZWUoaW4pOwogCWtmcmVlKG91dF9yZWFsKTsKIAlrZnJlZShvdXRfdGVzdCk7CiB9CiAKLXN0YXRpYyBfX2luaXQgdm9pZCB0ZXN0X3N0cmluZ19lc2NhcGVfbm9tZW0odm9pZCkKLXsKLQljaGFyICppbiA9ICJcZWIgXFxDXDAwN1wiXHg5MFxyXSI7Ci0JY2hhciBvdXRbNjRdLCAqYnVmID0gb3V0OwotCWludCByYyA9IC1FTk9NRU0sIHJldDsKLQotCXJldCA9IHN0cmluZ19lc2NhcGVfc3RyX2FueV9ucChpbiwgJmJ1Ziwgc3RybGVuKGluKSwgTlVMTCk7Ci0JaWYgKHJldCA9PSByYykKLQkJcmV0dXJuOwotCi0JcHJfZXJyKCJUZXN0ICdlc2NhcGUgbm9tZW0nIGZhaWxlZDogZ290ICVkIGluc3RlYWQgb2YgJWRcbiIsIHJldCwgcmMpOwotfQotCiBzdGF0aWMgaW50IF9faW5pdCB0ZXN0X3N0cmluZ19oZWxwZXJzX2luaXQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKQEAgLTM0Miw4ICszNDQsNiBAQAogCWZvciAoaSA9IDA7IGkgPCAoRVNDQVBFX0FOWV9OUCB8IEVTQ0FQRV9IRVgpICsgMTsgaSsrKQogCQl0ZXN0X3N0cmluZ19lc2NhcGUoImVzY2FwZSAxIiwgZXNjYXBlMSwgaSwgVEVTVF9TVFJJTkdfMl9ESUNUXzEpOwogCi0JdGVzdF9zdHJpbmdfZXNjYXBlX25vbWVtKCk7Ci0KIAlyZXR1cm4gLUVJTlZBTDsKIH0KIG1vZHVsZV9pbml0KHRlc3Rfc3RyaW5nX2hlbHBlcnNfaW5pdCk7CmRpZmYgLS1naXQgYS9saWIvdGVzdF9yaGFzaHRhYmxlLmMgYi9saWIvdGVzdF9yaGFzaHRhYmxlLmMKaW5kZXggNjdjNzU5My4uYjI5NTc1NCAxMDA2NDQKLS0tIGEvbGliL3Rlc3Rfcmhhc2h0YWJsZS5jCisrKyBiL2xpYi90ZXN0X3JoYXNodGFibGUuYwpAQCAtMzgsNiArMzgsMTUgQEAKIAlzdHJ1Y3Qgcmhhc2hfaGVhZAlub2RlOwogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyB0ZXN0X3JodF9wYXJhbXMgPSB7CisJLm5lbGVtX2hpbnQgPSBURVNUX0hUX1NJWkUsCisJLmhlYWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRlc3Rfb2JqLCBub2RlKSwKKwkua2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0ZXN0X29iaiwgdmFsdWUpLAorCS5rZXlfbGVuID0gc2l6ZW9mKGludCksCisJLmhhc2hmbiA9IGpoYXNoLAorCS5udWxsc19iYXNlID0gKDNVIDw8IFJIVF9CQVNFX1NISUZUKSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHRlc3Rfcmh0X2xvb2t1cChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQpCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC00Nyw3ICs1Niw3IEBACiAJCWJvb2wgZXhwZWN0ZWQgPSAhKGkgJSAyKTsKIAkJdTMyIGtleSA9IGk7CiAKLQkJb2JqID0gcmhhc2h0YWJsZV9sb29rdXAoaHQsICZrZXkpOworCQlvYmogPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KGh0LCAma2V5LCB0ZXN0X3JodF9wYXJhbXMpOwogCiAJCWlmIChleHBlY3RlZCAmJiAhb2JqKSB7CiAJCQlwcl93YXJuKCJUZXN0IGZhaWxlZDogQ291bGQgbm90IGZpbmQga2V5ICV1XG4iLCBrZXkpOwpAQCAtODAsNyArODksNyBAQAogCQlyY3VfY250ID0gY250ID0gMDsKIAogCQlpZiAoIXF1aWV0KQotCQkJcHJfaW5mbygiIFslIzR4LyV6dV0iLCBpLCB0YmwtPnNpemUpOworCQkJcHJfaW5mbygiIFslIzR4LyV1XSIsIGksIHRibC0+c2l6ZSk7CiAKIAkJcmh0X2Zvcl9lYWNoX2VudHJ5X3JjdShvYmosIHBvcywgdGJsLCBpLCBub2RlKSB7CiAJCQljbnQrKzsKQEAgLTEzMyw3ICsxNDIsMTEgQEAKIAkJb2JqLT5wdHIgPSBURVNUX1BUUjsKIAkJb2JqLT52YWx1ZSA9IGkgKiAyOwogCi0JCXJoYXNodGFibGVfaW5zZXJ0KGh0LCAmb2JqLT5ub2RlKTsKKwkJZXJyID0gcmhhc2h0YWJsZV9pbnNlcnRfZmFzdChodCwgJm9iai0+bm9kZSwgdGVzdF9yaHRfcGFyYW1zKTsKKwkJaWYgKGVycikgeworCQkJa2ZyZWUob2JqKTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KIAl9CiAKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC0xNDEsMzAgKzE1NCw2IEBACiAJdGVzdF9yaHRfbG9va3VwKGh0KTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCWZvciAoaSA9IDA7IGkgPCBURVNUX05FWFBBTkRTOyBpKyspIHsKLQkJcHJfaW5mbygiICBUYWJsZSBleHBhbnNpb24gaXRlcmF0aW9uICV1Li4uXG4iLCBpKTsKLQkJbXV0ZXhfbG9jaygmaHQtPm11dGV4KTsKLQkJcmhhc2h0YWJsZV9leHBhbmQoaHQpOwotCQltdXRleF91bmxvY2soJmh0LT5tdXRleCk7Ci0KLQkJcmN1X3JlYWRfbG9jaygpOwotCQlwcl9pbmZvKCIgIFZlcmlmeWluZyBsb29rdXBzLi4uXG4iKTsKLQkJdGVzdF9yaHRfbG9va3VwKGh0KTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IFRFU1RfTkVYUEFORFM7IGkrKykgewotCQlwcl9pbmZvKCIgIFRhYmxlIHNocmlua2FnZSBpdGVyYXRpb24gJXUuLi5cbiIsIGkpOwotCQltdXRleF9sb2NrKCZodC0+bXV0ZXgpOwotCQlyaGFzaHRhYmxlX3NocmluayhodCk7Ci0JCW11dGV4X3VubG9jaygmaHQtPm11dGV4KTsKLQotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXByX2luZm8oIiAgVmVyaWZ5aW5nIGxvb2t1cHMuLi5cbiIpOwotCQl0ZXN0X3JodF9sb29rdXAoaHQpOwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQl9Ci0KIAlyY3VfcmVhZF9sb2NrKCk7CiAJdGVzdF9idWNrZXRfc3RhdHMoaHQsIHRydWUpOwogCXJjdV9yZWFkX3VubG9jaygpOwpAQCAtMTczLDEwICsxNjIsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgVEVTVF9FTlRSSUVTOyBpKyspIHsKIAkJdTMyIGtleSA9IGkgKiAyOwogCi0JCW9iaiA9IHJoYXNodGFibGVfbG9va3VwKGh0LCAma2V5KTsKKwkJb2JqID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdChodCwgJmtleSwgdGVzdF9yaHRfcGFyYW1zKTsKIAkJQlVHX09OKCFvYmopOwogCi0JCXJoYXNodGFibGVfcmVtb3ZlKGh0LCAmb2JqLT5ub2RlKTsKKwkJcmhhc2h0YWJsZV9yZW1vdmVfZmFzdChodCwgJm9iai0+bm9kZSwgdGVzdF9yaHRfcGFyYW1zKTsKIAkJa2ZyZWUob2JqKTsKIAl9CiAKQEAgLTE5NSwyMCArMTg0LDExIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHRlc3Rfcmh0X2luaXQodm9pZCkKIHsKLQlzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zID0gewotCQkubmVsZW1faGludCA9IFRFU1RfSFRfU0laRSwKLQkJLmhlYWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRlc3Rfb2JqLCBub2RlKSwKLQkJLmtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGVzdF9vYmosIHZhbHVlKSwKLQkJLmtleV9sZW4gPSBzaXplb2YoaW50KSwKLQkJLmhhc2hmbiA9IGpoYXNoLAotCQkubWF4X3NoaWZ0ID0gMSwgLyogd2UgZXhwYW5kL3NocmluayBtYW51YWxseSBoZXJlICovCi0JCS5udWxsc19iYXNlID0gKDNVIDw8IFJIVF9CQVNFX1NISUZUKSwKLQl9OwogCWludCBlcnI7CiAKIAlwcl9pbmZvKCJSdW5uaW5nIHJlc2l6YWJsZSBoYXNodGFibGUgdGVzdHMuLi5cbiIpOwogCi0JZXJyID0gcmhhc2h0YWJsZV9pbml0KCZodCwgJnBhcmFtcyk7CisJZXJyID0gcmhhc2h0YWJsZV9pbml0KCZodCwgJnRlc3Rfcmh0X3BhcmFtcyk7CiAJaWYgKGVyciA8IDApIHsKIAkJcHJfd2FybigiVGVzdCBmYWlsZWQ6IFVuYWJsZSB0byBpbml0aWFsaXplIGhhc2h0YWJsZTogJWRcbiIsCiAJCQllcnIpOwpkaWZmIC0tZ2l0IGEvbGliL3ZzcHJpbnRmLmMgYi9saWIvdnNwcmludGYuYwppbmRleCBiMjM1Yzk2Li4zYTFlMDg0IDEwMDY0NAotLS0gYS9saWIvdnNwcmludGYuYworKysgYi9saWIvdnNwcmludGYuYwpAQCAtMTcsNiArMTcsNyBAQAogICovCiAKICNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGstcHJvdmlkZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogZm9yIEtTWU1fU1lNQk9MX0xFTiAqLwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CkBAIC0zNDAsMTEgKzM0MSwxMSBAQAogCXJldHVybiBsZW47CiB9CiAKLSNkZWZpbmUgWkVST1BBRAkxCQkvKiBwYWQgd2l0aCB6ZXJvICovCi0jZGVmaW5lIFNJR04JMgkJLyogdW5zaWduZWQvc2lnbmVkIGxvbmcgKi8KKyNkZWZpbmUgU0lHTgkxCQkvKiB1bnNpZ25lZC9zaWduZWQsIG11c3QgYmUgMSAqLworI2RlZmluZSBMRUZUCTIJCS8qIGxlZnQganVzdGlmaWVkICovCiAjZGVmaW5lIFBMVVMJNAkJLyogc2hvdyBwbHVzICovCiAjZGVmaW5lIFNQQUNFCTgJCS8qIHNwYWNlIGlmIHBsdXMgKi8KLSNkZWZpbmUgTEVGVAkxNgkJLyogbGVmdCBqdXN0aWZpZWQgKi8KKyNkZWZpbmUgWkVST1BBRAkxNgkJLyogcGFkIHdpdGggemVybywgbXVzdCBiZSAxNiA9PSAnMCcgLSAnICcgKi8KICNkZWZpbmUgU01BTEwJMzIJCS8qIHVzZSBsb3dlcmNhc2UgaW4gaGV4IChtdXN0IGJlIDMyID09IDB4MjApICovCiAjZGVmaW5lIFNQRUNJQUwJNjQJCS8qIHByZWZpeCBoZXggd2l0aCAiMHgiLCBvY3RhbCB3aXRoICIwIiAqLwogCkBAIC0zODMsMTAgKzM4NCw3IEBACiBjaGFyICpudW1iZXIoY2hhciAqYnVmLCBjaGFyICplbmQsIHVuc2lnbmVkIGxvbmcgbG9uZyBudW0sCiAJICAgICBzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYykKIHsKLQkvKiB3ZSBhcmUgY2FsbGVkIHdpdGggYmFzZSA4LCAxMCBvciAxNiwgb25seSwgdGh1cyBkb24ndCBuZWVkICJHLi4uIiAgKi8KLQlzdGF0aWMgY29uc3QgY2hhciBkaWdpdHNbMTZdID0gIjAxMjM0NTY3ODlBQkNERUYiOyAvKiAiR0hJSktMTU5PUFFSU1RVVldYWVoiOyAqLwotCi0JY2hhciB0bXBbNjZdOworCWNoYXIgdG1wWzMgKiBzaXplb2YobnVtKV07CiAJY2hhciBzaWduOwogCWNoYXIgbG9jYXNlOwogCWludCBuZWVkX3BmeCA9ICgoc3BlYy5mbGFncyAmIFNQRUNJQUwpICYmIHNwZWMuYmFzZSAhPSAxMCk7CkBAIC00MjIsMTIgKzQyMCw3IEBACiAJLyogZ2VuZXJhdGUgZnVsbCBzdHJpbmcgaW4gdG1wW10sIGluIHJldmVyc2Ugb3JkZXIgKi8KIAlpID0gMDsKIAlpZiAobnVtIDwgc3BlYy5iYXNlKQotCQl0bXBbaSsrXSA9IGRpZ2l0c1tudW1dIHwgbG9jYXNlOwotCS8qIEdlbmVyaWMgY29kZSwgZm9yIGFueSBiYXNlOgotCWVsc2UgZG8gewotCQl0bXBbaSsrXSA9IChkaWdpdHNbZG9fZGl2KG51bSxiYXNlKV0gfCBsb2Nhc2UpOwotCX0gd2hpbGUgKG51bSAhPSAwKTsKLQkqLworCQl0bXBbaSsrXSA9IGhleF9hc2NfdXBwZXJbbnVtXSB8IGxvY2FzZTsKIAllbHNlIGlmIChzcGVjLmJhc2UgIT0gMTApIHsgLyogOCBvciAxNiAqLwogCQlpbnQgbWFzayA9IHNwZWMuYmFzZSAtIDE7CiAJCWludCBzaGlmdCA9IDM7CkBAIC00MzUsNyArNDI4LDcgQEAKIAkJaWYgKHNwZWMuYmFzZSA9PSAxNikKIAkJCXNoaWZ0ID0gNDsKIAkJZG8gewotCQkJdG1wW2krK10gPSAoZGlnaXRzWygodW5zaWduZWQgY2hhciludW0pICYgbWFza10gfCBsb2Nhc2UpOworCQkJdG1wW2krK10gPSAoaGV4X2FzY191cHBlclsoKHVuc2lnbmVkIGNoYXIpbnVtKSAmIG1hc2tdIHwgbG9jYXNlKTsKIAkJCW51bSA+Pj0gc2hpZnQ7CiAJCX0gd2hpbGUgKG51bSk7CiAJfSBlbHNlIHsgLyogYmFzZSAxMCAqLwpAQCAtNDQ3LDcgKzQ0MCw3IEBACiAJCXNwZWMucHJlY2lzaW9uID0gaTsKIAkvKiBsZWFkaW5nIHNwYWNlIHBhZGRpbmcgKi8KIAlzcGVjLmZpZWxkX3dpZHRoIC09IHNwZWMucHJlY2lzaW9uOwotCWlmICghKHNwZWMuZmxhZ3MgJiAoWkVST1BBRCtMRUZUKSkpIHsKKwlpZiAoIShzcGVjLmZsYWdzICYgKFpFUk9QQUQgfCBMRUZUKSkpIHsKIAkJd2hpbGUgKC0tc3BlYy5maWVsZF93aWR0aCA+PSAwKSB7CiAJCQlpZiAoYnVmIDwgZW5kKQogCQkJCSpidWYgPSAnICc7CkBAIC00NzUsNyArNDY4LDggQEAKIAl9CiAJLyogemVybyBvciBzcGFjZSBwYWRkaW5nICovCiAJaWYgKCEoc3BlYy5mbGFncyAmIExFRlQpKSB7Ci0JCWNoYXIgYyA9IChzcGVjLmZsYWdzICYgWkVST1BBRCkgPyAnMCcgOiAnICc7CisJCWNoYXIgYyA9ICcgJyArIChzcGVjLmZsYWdzICYgWkVST1BBRCk7CisJCUJVSUxEX0JVR19PTignICcgKyBaRVJPUEFEICE9ICcwJyk7CiAJCXdoaWxlICgtLXNwZWMuZmllbGRfd2lkdGggPj0gMCkgewogCQkJaWYgKGJ1ZiA8IGVuZCkKIAkJCQkqYnVmID0gYzsKQEAgLTc4MywxMSArNzc3LDE5IEBACiAJaWYgKHNwZWMuZmllbGRfd2lkdGggPiAwKQogCQlsZW4gPSBtaW5fdChpbnQsIHNwZWMuZmllbGRfd2lkdGgsIDY0KTsKIAotCWZvciAoaSA9IDA7IGkgPCBsZW4gJiYgYnVmIDwgZW5kIC0gMTsgaSsrKSB7Ci0JCWJ1ZiA9IGhleF9ieXRlX3BhY2soYnVmLCBhZGRyW2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJaWYgKGJ1ZiA8IGVuZCkKKwkJCSpidWYgPSBoZXhfYXNjX2hpKGFkZHJbaV0pOworCQkrK2J1ZjsKKwkJaWYgKGJ1ZiA8IGVuZCkKKwkJCSpidWYgPSBoZXhfYXNjX2xvKGFkZHJbaV0pOworCQkrK2J1ZjsKIAotCQlpZiAoYnVmIDwgZW5kICYmIHNlcGFyYXRvciAmJiBpICE9IGxlbiAtIDEpCi0JCQkqYnVmKysgPSBzZXBhcmF0b3I7CisJCWlmIChzZXBhcmF0b3IgJiYgaSAhPSBsZW4gLSAxKSB7CisJCQlpZiAoYnVmIDwgZW5kKQorCQkJCSpidWYgPSBzZXBhcmF0b3I7CisJCQkrK2J1ZjsKKwkJfQogCX0KIAogCXJldHVybiBidWY7CkBAIC0xMjMzLDggKzEyMzUsMTIgQEAKIAogCWxlbiA9IHNwZWMuZmllbGRfd2lkdGggPCAwID8gMSA6IHNwZWMuZmllbGRfd2lkdGg7CiAKLQkvKiBJZ25vcmUgdGhlIGVycm9yLiBXZSBwcmludCBhcyBtYW55IGNoYXJhY3RlcnMgYXMgd2UgY2FuICovCi0Jc3RyaW5nX2VzY2FwZV9tZW0oYWRkciwgbGVuLCAmYnVmLCBlbmQgLSBidWYsIGZsYWdzLCBOVUxMKTsKKwkvKgorCSAqIHN0cmluZ19lc2NhcGVfbWVtKCkgd3JpdGVzIGFzIG1hbnkgY2hhcmFjdGVycyBhcyBpdCBjYW4gdG8KKwkgKiB0aGUgZ2l2ZW4gYnVmZmVyLCBhbmQgcmV0dXJucyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgb3V0cHV0CisJICogaGFkIHRoZSBidWZmZXIgYmVlbiBiaWcgZW5vdWdoLgorCSAqLworCWJ1ZiArPSBzdHJpbmdfZXNjYXBlX21lbShhZGRyLCBsZW4sIGJ1ZiwgYnVmIDwgZW5kID8gZW5kIC0gYnVmIDogMCwgZmxhZ3MsIE5VTEwpOwogCiAJcmV0dXJuIGJ1ZjsKIH0KQEAgLTEzMjIsNiArMTMyOCwzMCBAQAogCXJldHVybiBudW1iZXIoYnVmLCBlbmQsIG51bSwgc3BlYyk7CiB9CiAKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sKK2NoYXIgKmNsb2NrKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgY2xrICpjbGssIHN0cnVjdCBwcmludGZfc3BlYyBzcGVjLAorCSAgICBjb25zdCBjaGFyICpmbXQpCit7CisJaWYgKCFJU19FTkFCTEVEKENPTkZJR19IQVZFX0NMSykgfHwgIWNsaykKKwkJcmV0dXJuIHN0cmluZyhidWYsIGVuZCwgTlVMTCwgc3BlYyk7CisKKwlzd2l0Y2ggKGZtdFsxXSkgeworCWNhc2UgJ3InOgorCQlyZXR1cm4gbnVtYmVyKGJ1ZiwgZW5kLCBjbGtfZ2V0X3JhdGUoY2xrKSwgc3BlYyk7CisKKwljYXNlICduJzoKKwlkZWZhdWx0OgorI2lmZGVmIENPTkZJR19DT01NT05fQ0xLCisJCXJldHVybiBzdHJpbmcoYnVmLCBlbmQsIF9fY2xrX2dldF9uYW1lKGNsayksIHNwZWMpOworI2Vsc2UKKwkJc3BlYy5iYXNlID0gMTY7CisJCXNwZWMuZmllbGRfd2lkdGggPSBzaXplb2YodW5zaWduZWQgbG9uZykgKiAyICsgMjsKKwkJc3BlYy5mbGFncyB8PSBTUEVDSUFMIHwgU01BTEwgfCBaRVJPUEFEOworCQlyZXR1cm4gbnVtYmVyKGJ1ZiwgZW5kLCAodW5zaWduZWQgbG9uZyljbGssIHNwZWMpOworI2VuZGlmCisJfQorfQorCiBpbnQga3B0cl9yZXN0cmljdCBfX3JlYWRfbW9zdGx5OwogCiAvKgpAQCAtMTQwNCw2ICsxNDM0LDExIEBACiAgKiAgICAgICAgICAgKGRlZmF1bHQgYXNzdW1lZCB0byBiZSBwaHlzX2FkZHJfdCwgcGFzc2VkIGJ5IHJlZmVyZW5jZSkKICAqIC0gJ2RbMjM0XScgRm9yIGEgZGVudHJ5IG5hbWUgKG9wdGlvbmFsbHkgMi00IGxhc3QgY29tcG9uZW50cykKICAqIC0gJ0RbMjM0XScgU2FtZSBhcyAnZCcgYnV0IGZvciBhIHN0cnVjdCBmaWxlCisgKiAtICdDJyBGb3IgYSBjbG9jaywgaXQgcHJpbnRzIHRoZSBuYW1lIChDb21tb24gQ2xvY2sgRnJhbWV3b3JrKSBvciBhZGRyZXNzCisgKiAgICAgICAobGVnYWN5IGNsb2NrIGZyYW1ld29yaykgb2YgdGhlIGNsb2NrCisgKiAtICdDbicgRm9yIGEgY2xvY2ssIGl0IHByaW50cyB0aGUgbmFtZSAoQ29tbW9uIENsb2NrIEZyYW1ld29yaykgb3IgYWRkcmVzcworICogICAgICAgIChsZWdhY3kgY2xvY2sgZnJhbWV3b3JrKSBvZiB0aGUgY2xvY2sKKyAqIC0gJ0NyJyBGb3IgYSBjbG9jaywgaXQgcHJpbnRzIHRoZSBjdXJyZW50IHJhdGUgb2YgdGhlIGNsb2NrCiAgKgogICogTm90ZTogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAnUycgYW5kICdGJyBpcyB0aGF0IG9uIGlhNjQgYW5kIHBwYzY0CiAgKiBmdW5jdGlvbiBwb2ludGVycyBhcmUgcmVhbGx5IGZ1bmN0aW9uIGRlc2NyaXB0b3JzLCB3aGljaCBjb250YWluIGEKQEAgLTE1NDgsNiArMTU4Myw4IEBACiAJCXJldHVybiBhZGRyZXNzX3ZhbChidWYsIGVuZCwgcHRyLCBzcGVjLCBmbXQpOwogCWNhc2UgJ2QnOgogCQlyZXR1cm4gZGVudHJ5X25hbWUoYnVmLCBlbmQsIHB0ciwgc3BlYywgZm10KTsKKwljYXNlICdDJzoKKwkJcmV0dXJuIGNsb2NrKGJ1ZiwgZW5kLCBwdHIsIHNwZWMsIGZtdCk7CiAJY2FzZSAnRCc6CiAJCXJldHVybiBkZW50cnlfbmFtZShidWYsIGVuZCwKIAkJCQkgICAoKGNvbnN0IHN0cnVjdCBmaWxlICopcHRyKS0+Zl9wYXRoLmRlbnRyeSwKQEAgLTE3MzgsMjkgKzE3NzUsMjEgQEAKIAlpZiAoc3BlYy0+cXVhbGlmaWVyID09ICdMJykKIAkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX0xPTkdfTE9ORzsKIAllbHNlIGlmIChzcGVjLT5xdWFsaWZpZXIgPT0gJ2wnKSB7Ci0JCWlmIChzcGVjLT5mbGFncyAmIFNJR04pCi0JCQlzcGVjLT50eXBlID0gRk9STUFUX1RZUEVfTE9ORzsKLQkJZWxzZQotCQkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1VMT05HOworCQlCVUlMRF9CVUdfT04oRk9STUFUX1RZUEVfVUxPTkcgKyBTSUdOICE9IEZPUk1BVF9UWVBFX0xPTkcpOworCQlzcGVjLT50eXBlID0gRk9STUFUX1RZUEVfVUxPTkcgKyAoc3BlYy0+ZmxhZ3MgJiBTSUdOKTsKIAl9IGVsc2UgaWYgKF90b2xvd2VyKHNwZWMtPnF1YWxpZmllcikgPT0gJ3onKSB7CiAJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9TSVpFX1Q7CiAJfSBlbHNlIGlmIChzcGVjLT5xdWFsaWZpZXIgPT0gJ3QnKSB7CiAJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9QVFJESUZGOwogCX0gZWxzZSBpZiAoc3BlYy0+cXVhbGlmaWVyID09ICdIJykgewotCQlpZiAoc3BlYy0+ZmxhZ3MgJiBTSUdOKQotCQkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX0JZVEU7Ci0JCWVsc2UKLQkJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9VQllURTsKKwkJQlVJTERfQlVHX09OKEZPUk1BVF9UWVBFX1VCWVRFICsgU0lHTiAhPSBGT1JNQVRfVFlQRV9CWVRFKTsKKwkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1VCWVRFICsgKHNwZWMtPmZsYWdzICYgU0lHTik7CiAJfSBlbHNlIGlmIChzcGVjLT5xdWFsaWZpZXIgPT0gJ2gnKSB7Ci0JCWlmIChzcGVjLT5mbGFncyAmIFNJR04pCi0JCQlzcGVjLT50eXBlID0gRk9STUFUX1RZUEVfU0hPUlQ7Ci0JCWVsc2UKLQkJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9VU0hPUlQ7CisJCUJVSUxEX0JVR19PTihGT1JNQVRfVFlQRV9VU0hPUlQgKyBTSUdOICE9IEZPUk1BVF9UWVBFX1NIT1JUKTsKKwkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1VTSE9SVCArIChzcGVjLT5mbGFncyAmIFNJR04pOwogCX0gZWxzZSB7Ci0JCWlmIChzcGVjLT5mbGFncyAmIFNJR04pCi0JCQlzcGVjLT50eXBlID0gRk9STUFUX1RZUEVfSU5UOwotCQllbHNlCi0JCQlzcGVjLT50eXBlID0gRk9STUFUX1RZUEVfVUlOVDsKKwkJQlVJTERfQlVHX09OKEZPUk1BVF9UWVBFX1VJTlQgKyBTSUdOICE9IEZPUk1BVF9UWVBFX0lOVCk7CisJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9VSU5UICsgKHNwZWMtPmZsYWdzICYgU0lHTik7CiAJfQogCiAJcmV0dXJuICsrZm10IC0gc3RhcnQ7CkBAIC0xODAwLDYgKzE4MjksMTEgQEAKICAqICUqcEVbYWNobm9wc10gcHJpbnQgYW4gZXNjYXBlZCBidWZmZXIKICAqICUqcGhbQ0ROXSBhIHZhcmlhYmxlLWxlbmd0aCBoZXggc3RyaW5nIHdpdGggYSBzZXBhcmF0b3IgKHN1cHBvcnRzIHVwIHRvIDY0CiAgKiAgICAgICAgICAgYnl0ZXMgb2YgdGhlIGlucHV0KQorICogJXBDIG91dHB1dCB0aGUgbmFtZSAoQ29tbW9uIENsb2NrIEZyYW1ld29yaykgb3IgYWRkcmVzcyAobGVnYWN5IGNsb2NrCisgKiAgICAgZnJhbWV3b3JrKSBvZiBhIGNsb2NrCisgKiAlcENuIG91dHB1dCB0aGUgbmFtZSAoQ29tbW9uIENsb2NrIEZyYW1ld29yaykgb3IgYWRkcmVzcyAobGVnYWN5IGNsb2NrCisgKiAgICAgIGZyYW1ld29yaykgb2YgYSBjbG9jaworICogJXBDciBvdXRwdXQgdGhlIGN1cnJlbnQgcmF0ZSBvZiBhIGNsb2NrCiAgKiAlbiBpcyBpZ25vcmVkCiAgKgogICogKiogUGxlYXNlIHVwZGF0ZSBEb2N1bWVudGF0aW9uL3ByaW50ay1mb3JtYXRzLnR4dCB3aGVuIG1ha2luZyBjaGFuZ2VzICoqCmRpZmYgLS1naXQgYS9tbS9LY29uZmlnIGIvbW0vS2NvbmZpZwppbmRleCBhMDMxMzFiLi4zOTAyMTRkIDEwMDY0NAotLS0gYS9tbS9LY29uZmlnCisrKyBiL21tL0tjb25maWcKQEAgLTUxNyw2ICs1MTcsMTIgQEAKIAkgIHByb2Nlc3NpbmcgY2FsbHMgc3VjaCBhcyBkbWFfYWxsb2NfZnJvbV9jb250aWd1b3VzKCkuCiAJICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3Qgd2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMuCiAKK2NvbmZpZyBDTUFfREVCVUdGUworCWJvb2wgIkNNQSBkZWJ1Z2ZzIGludGVyZmFjZSIKKwlkZXBlbmRzIG9uIENNQSAmJiBERUJVR19GUworCWhlbHAKKwkgIFR1cm5zIG9uIHRoZSBEZWJ1Z0ZTIGludGVyZmFjZSBmb3IgQ01BLgorCiBjb25maWcgQ01BX0FSRUFTCiAJaW50ICJNYXhpbXVtIGNvdW50IG9mIHRoZSBDTUEgYXJlYXMiCiAJZGVwZW5kcyBvbiBDTUEKZGlmZiAtLWdpdCBhL21tL01ha2VmaWxlIGIvbW0vTWFrZWZpbGUKaW5kZXggMTVkYmU5OS4uOThjNGVhZSAxMDA2NDQKLS0tIGEvbW0vTWFrZWZpbGUKKysrIGIvbW0vTWFrZWZpbGUKQEAgLTU1LDYgKzU1LDcgQEAKIG9iai0kKENPTkZJR19LQVNBTikJKz0ga2FzYW4vCiBvYmotJChDT05GSUdfRkFJTFNMQUIpICs9IGZhaWxzbGFiLm8KIG9iai0kKENPTkZJR19NRU1PUllfSE9UUExVRykgKz0gbWVtb3J5X2hvdHBsdWcubworb2JqLSQoQ09ORklHX01FTVRFU1QpCQkrPSBtZW10ZXN0Lm8KIG9iai0kKENPTkZJR19NSUdSQVRJT04pICs9IG1pZ3JhdGUubwogb2JqLSQoQ09ORklHX1FVSUNLTElTVCkgKz0gcXVpY2tsaXN0Lm8KIG9iai0kKENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSkgKz0gaHVnZV9tZW1vcnkubwpAQCAtNzYsMyArNzcsNCBAQAogb2JqLSQoQ09ORklHX0NNQSkJKz0gY21hLm8KIG9iai0kKENPTkZJR19NRU1PUllfQkFMTE9PTikgKz0gYmFsbG9vbl9jb21wYWN0aW9uLm8KIG9iai0kKENPTkZJR19QQUdFX0VYVEVOU0lPTikgKz0gcGFnZV9leHQubworb2JqLSQoQ09ORklHX0NNQV9ERUJVR0ZTKSArPSBjbWFfZGVidWcubwpkaWZmIC0tZ2l0IGEvbW0vY2xlYW5jYWNoZS5jIGIvbW0vY2xlYW5jYWNoZS5jCmluZGV4IDA1M2JjZDguLjhmYzUwODEgMTAwNjQ0Ci0tLSBhL21tL2NsZWFuY2FjaGUuYworKysgYi9tbS9jbGVhbmNhY2hlLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jbGVhbmNhY2hlLmg+CiAKIC8qCi0gKiBjbGVhbmNhY2hlX29wcyBpcyBzZXQgYnkgY2xlYW5jYWNoZV9vcHNfcmVnaXN0ZXIgdG8gY29udGFpbiB0aGUgcG9pbnRlcnMKKyAqIGNsZWFuY2FjaGVfb3BzIGlzIHNldCBieSBjbGVhbmNhY2hlX3JlZ2lzdGVyX29wcyB0byBjb250YWluIHRoZSBwb2ludGVycwogICogdG8gdGhlIGNsZWFuY2FjaGUgImJhY2tlbmQiIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucy4KICAqLwogc3RhdGljIHN0cnVjdCBjbGVhbmNhY2hlX29wcyAqY2xlYW5jYWNoZV9vcHMgX19yZWFkX21vc3RseTsKQEAgLTM0LDE0NSArMzQsMTA3IEBACiBzdGF0aWMgdTY0IGNsZWFuY2FjaGVfcHV0czsKIHN0YXRpYyB1NjQgY2xlYW5jYWNoZV9pbnZhbGlkYXRlczsKIAotLyoKLSAqIFdoZW4gbm8gYmFja2VuZCBpcyByZWdpc3RlcmVkIGFsbCBjYWxscyB0byBpbml0X2ZzIGFuZCBpbml0X3NoYXJlZF9mcwotICogYXJlIHJlZ2lzdGVyZWQgYW5kIGZha2UgcG9vbGlkcyAoRkFLRV9GU19QT09MSURfT0ZGU0VUIG9yCi0gKiBGQUtFX1NIQVJFRF9GU19QT09MSURfT0ZGU0VULCBwbHVzIG9mZnNldCBpbiB0aGUgcmVzcGVjdGl2ZSBhcnJheQotICogW3NoYXJlZF98XWZzX3Bvb2xpZF9tYXApIGFyZSBnaXZlbiB0byB0aGUgcmVzcGVjdGl2ZSBzdXBlciBibG9jawotICogKHNiLT5jbGVhbmNhY2hlX3Bvb2xpZCkgYW5kIG5vIHRtZW1fcG9vbHMgYXJlIGNyZWF0ZWQuIFdoZW4gYSBiYWNrZW5kCi0gKiByZWdpc3RlcnMgd2l0aCBjbGVhbmNhY2hlIHRoZSBwcmV2aW91cyBjYWxscyB0byBpbml0X2ZzIGFuZCBpbml0X3NoYXJlZF9mcwotICogYXJlIGV4ZWN1dGVkIHRvIGNyZWF0ZSB0bWVtX3Bvb2xzIGFuZCBzZXQgdGhlIHJlc3BlY3RpdmUgcG9vbGlkcy4gV2hpbGUgbm8KLSAqIGJhY2tlbmQgaXMgcmVnaXN0ZXJlZCBhbGwgInB1dHMiLCAiZ2V0cyIgYW5kICJmbHVzaGVzIiBhcmUgaWdub3JlZCBvciBmYWlsZWQuCi0gKi8KLSNkZWZpbmUgTUFYX0lOSVRJQUxJWkFCTEVfRlMgMzIKLSNkZWZpbmUgRkFLRV9GU19QT09MSURfT0ZGU0VUIDEwMDAKLSNkZWZpbmUgRkFLRV9TSEFSRURfRlNfUE9PTElEX09GRlNFVCAyMDAwCi0KLSNkZWZpbmUgRlNfTk9fQkFDS0VORCAoLTEpCi0jZGVmaW5lIEZTX1VOS05PV04gKC0yKQotc3RhdGljIGludCBmc19wb29saWRfbWFwW01BWF9JTklUSUFMSVpBQkxFX0ZTXTsKLXN0YXRpYyBpbnQgc2hhcmVkX2ZzX3Bvb2xpZF9tYXBbTUFYX0lOSVRJQUxJWkFCTEVfRlNdOwotc3RhdGljIGNoYXIgKnV1aWRzW01BWF9JTklUSUFMSVpBQkxFX0ZTXTsKLS8qCi0gKiBNdXRleCBmb3IgdGhlIFtzaGFyZWRffF1mc19wb29saWRfbWFwIHRvIGd1YXJkIGFnYWluc3QgbXVsdGlwbGUgdGhyZWFkcwotICogaW52b2tpbmcgdW1vdW50IChhbmQgZW5kaW5nIGluIF9fY2xlYW5jYWNoZV9pbnZhbGlkYXRlX2ZzKSBhbmQgYWxzbyBtdWx0aXBsZQotICogdGhyZWFkcyBjYWxsaW5nIG1vdW50IChhbmQgZW5kaW5nIHVwIGluIF9fY2xlYW5jYWNoZV9pbml0X1tzaGFyZWR8XWZzKS4KLSAqLwotc3RhdGljIERFRklORV9NVVRFWChwb29saWRfbXV0ZXgpOwotLyoKLSAqIFdoZW4gc2V0IHRvIGZhbHNlIChkZWZhdWx0KSBhbGwgY2FsbHMgdG8gdGhlIGNsZWFuY2FjaGUgZnVuY3Rpb25zLCBleGNlcHQKLSAqIHRoZSBfX2NsZWFuY2FjaGVfaW52YWxpZGF0ZV9mcyBhbmQgX19jbGVhbmNhY2hlX2luaXRfW3NoYXJlZHxdZnMgYXJlIGd1YXJkZWQKLSAqIGJ5IHRoZSBpZiAoIWNsZWFuY2FjaGVfb3BzKSByZXR1cm4uIFRoaXMgbWVhbnMgbXVsdGlwbGUgdGhyZWFkcyAoZnJvbQotICogZGlmZmVyZW50IGZpbGVzeXN0ZW1zKSB3aWxsIGJlIGNoZWNraW5nIGNsZWFuY2FjaGVfb3BzLiBUaGUgdXNhZ2Ugb2YgYQotICogYm9vbCBpbnN0ZWFkIG9mIGEgYXRvbWljX3Qgb3IgYSBib29sIGd1YXJkZWQgYnkgYSBzcGlubG9jayBpcyBPSyAtIHdlIGFyZQotICogT0sgaWYgdGhlIHRpbWUgYmV0d2VlbiB0aGUgYmFja2VuZCdzIGhhdmUgYmVlbiBpbml0aWFsaXplZCAoYW5kCi0gKiBjbGVhbmNhY2hlX29wcyBoYXMgYmVlbiBzZXQgdG8gbm90IE5VTEwpIGFuZCB3aGVuIHRoZSBmaWxlc3lzdGVtcyBzdGFydAotICogYWN0dWFsbHkgY2FsbGluZyB0aGUgYmFja2VuZHMuIFRoZSBpbnZlcnNlICh3aGVuIHVubG9hZGluZykgaXMgb2J2aW91c2x5Ci0gKiBub3QgZ29vZCAtIGJ1dCB0aGlzIHNoaW0gZG9lcyBub3QgZG8gdGhhdCAoeWV0KS4KLSAqLwotCi0vKgotICogVGhlIGJhY2tlbmRzIGFuZCBmaWxlc3lzdGVtcyB3b3JrIGFsbCBhc3luY2hyb25vdXNseS4gVGhpcyBpcyBiL2MgdGhlCi0gKiBiYWNrZW5kcyBjYW4gYmUgYnVpbHQgYXMgbW9kdWxlcy4KLSAqIFRoZSB1c3VhbCBzZXF1ZW5jZSBvZiBldmVudHMgaXM6Ci0gKglhKSBtb3VudCAvCS0+IF9fY2xlYW5jYWNoZV9pbml0X2ZzIGlzIGNhbGxlZC4gV2Ugc2V0IHRoZQotICoJCVtzaGFyZWRffF1mc19wb29saWRfbWFwIGFuZCB1dWlkcyBmb3IuCi0gKgotICoJYikuIHVzZXIgZG9lcyBJL09zIC0+IHdlIGNhbGwgdGhlIHJlc3Qgb2YgX19jbGVhbmNhY2hlXyogZnVuY3Rpb25zCi0gKgkJd2hpY2ggcmV0dXJuIGltbWVkaWF0ZWx5IGFzIGNsZWFuY2FjaGVfb3BzIGlzIGZhbHNlLgotICoKLSAqCWMpLiBtb2Rwcm9iZSB6Y2FjaGUgLT4gY2xlYW5jYWNoZV9yZWdpc3Rlcl9vcHMuIFdlIGluaXQgdGhlIGJhY2tlbmQKLSAqCQlhbmQgc2V0IGNsZWFuY2FjaGVfb3BzIHRvIHRydWUsIGFuZCBmb3IgYW55IGZzX3Bvb2xpZF9tYXAKLSAqCQkod2hpY2ggaXMgc2V0IGJ5IF9fY2xlYW5jYWNoZV9pbml0X2ZzKSB3ZSBpbml0aWFsaXplIHRoZSBwb29saWQuCi0gKgotICoJZCkuIHVzZXIgZG9lcyBJL09zIC0+IG5vdyB0aGF0IGNsZWFuY2FjaGVfb3BzIGlzIHRydWUgYWxsIHRoZQotICoJCV9fY2xlYW5jYWNoZV8qIGZ1bmN0aW9ucyBjYW4gY2FsbCB0aGUgYmFja2VuZC4gVGhleSBhbGwgY2hlY2sKLSAqCQl0aGF0IGZzX3Bvb2xpZF9tYXAgaXMgdmFsaWQgYW5kIGlmIHNvIGludm9rZSB0aGUgYmFja2VuZC4KLSAqCi0gKgllKS4gdW1vdW50IC8JLT4gX19jbGVhbmNhY2hlX2ludmFsaWRhdGVfZnMsIHRoZSBmc19wb29saWRfbWFwIGlzCi0gKgkJcmVzZXQgKHdoaWNoIGlzIHRoZSBzZWNvbmQgY2hlY2sgaW4gdGhlIF9fY2xlYW5jYWNoZV8qIG9wcwotICoJCXRvIGNhbGwgdGhlIGJhY2tlbmQpLgotICoKLSAqIFRoZSBzZXF1ZW5jZSBvZiBldmVudCBjb3VsZCBhbHNvIGJlIGMpLCBmb2xsb3dlZCBieSBhKSwgYW5kIGQpLiBhbmQgZSkuIFRoZQotICogYykgd291bGQgbm90IGhhcHBlbiBhbnltb3JlLiBUaGVyZSBpcyBhbHNvIHRoZSBjaGFuY2Ugb2YgYyksIGFuZCBvbmUgdGhyZWFkCi0gKiBkb2luZyBhKSArIGQpLCBhbmQgYW5vdGhlciBkb2luZyBlKS4gRm9yIHRoYXQgY2FzZSB3ZSBkZXBlbmQgb24gdGhlCi0gKiBmaWxlc3lzdGVtIGNhbGxpbmcgX19jbGVhbmNhY2hlX2ludmFsaWRhdGVfZnMgaW4gdGhlIHByb3BlciBzZXF1ZW5jZSAoc28KLSAqIHRoYXQgaXQgaGFuZGxlcyBhbGwgSS9PcyBiZWZvcmUgaXQgaW52YWxpZGF0ZXMgdGhlIGZzICh3aGljaCBpcyBsYXN0IHBhcnQKLSAqIG9mIHVubW91bnRpbmcgcHJvY2VzcykuCi0gKgotICogTm90ZTogVGhlIGFjdXRlIHJlYWRlciB3aWxsIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vICJybW1vZCB6Y2FjaGUiIGNhc2UuCi0gKiBUaGlzIGlzIGIvYyB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgdGhhdCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGFuZCB3aGVuCi0gKiBkb25lLCB3aWxsIHJlcXVpcmUgc29tZSBleHRyYSBsb2NraW5nIG5vdCB5ZXQgZGV2aXNlZC4KLSAqLwotCi0vKgotICogUmVnaXN0ZXIgb3BlcmF0aW9ucyBmb3IgY2xlYW5jYWNoZSwgcmV0dXJuaW5nIHByZXZpb3VzIHRodXMgYWxsb3dpbmcKLSAqIGRldGVjdGlvbiBvZiBtdWx0aXBsZSBiYWNrZW5kcyBhbmQgcG9zc2libGUgbmVzdGluZy4KLSAqLwotc3RydWN0IGNsZWFuY2FjaGVfb3BzICpjbGVhbmNhY2hlX3JlZ2lzdGVyX29wcyhzdHJ1Y3QgY2xlYW5jYWNoZV9vcHMgKm9wcykKK3N0YXRpYyB2b2lkIGNsZWFuY2FjaGVfcmVnaXN0ZXJfb3BzX3NiKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIHZvaWQgKnVudXNlZCkKIHsKLQlzdHJ1Y3QgY2xlYW5jYWNoZV9vcHMgKm9sZCA9IGNsZWFuY2FjaGVfb3BzOwotCWludCBpOwotCi0JbXV0ZXhfbG9jaygmcG9vbGlkX211dGV4KTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOSVRJQUxJWkFCTEVfRlM7IGkrKykgewotCQlpZiAoZnNfcG9vbGlkX21hcFtpXSA9PSBGU19OT19CQUNLRU5EKQotCQkJZnNfcG9vbGlkX21hcFtpXSA9IG9wcy0+aW5pdF9mcyhQQUdFX1NJWkUpOwotCQlpZiAoc2hhcmVkX2ZzX3Bvb2xpZF9tYXBbaV0gPT0gRlNfTk9fQkFDS0VORCkKLQkJCXNoYXJlZF9mc19wb29saWRfbWFwW2ldID0gb3BzLT5pbml0X3NoYXJlZF9mcwotCQkJCQkodXVpZHNbaV0sIFBBR0VfU0laRSk7CisJc3dpdGNoIChzYi0+Y2xlYW5jYWNoZV9wb29saWQpIHsKKwljYXNlIENMRUFOQ0FDSEVfTk9fQkFDS0VORDoKKwkJX19jbGVhbmNhY2hlX2luaXRfZnMoc2IpOworCQlicmVhazsKKwljYXNlIENMRUFOQ0FDSEVfTk9fQkFDS0VORF9TSEFSRUQ6CisJCV9fY2xlYW5jYWNoZV9pbml0X3NoYXJlZF9mcyhzYik7CisJCWJyZWFrOwogCX0KK30KKworLyoKKyAqIFJlZ2lzdGVyIG9wZXJhdGlvbnMgZm9yIGNsZWFuY2FjaGUuIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICovCitpbnQgY2xlYW5jYWNoZV9yZWdpc3Rlcl9vcHMoc3RydWN0IGNsZWFuY2FjaGVfb3BzICpvcHMpCit7CisJaWYgKGNtcHhjaGcoJmNsZWFuY2FjaGVfb3BzLCBOVUxMLCBvcHMpKQorCQlyZXR1cm4gLUVCVVNZOworCiAJLyoKLQkgKiBXZSBNVVNUIHNldCBjbGVhbmNhY2hlX29wcyBfYWZ0ZXJfIHdlIGhhdmUgY2FsbGVkIHRoZSBiYWNrZW5kcwotCSAqIGluaXRfZnMgb3IgaW5pdF9zaGFyZWRfZnMgZnVuY3Rpb25zLiBPdGhlcndpc2UgdGhlIGNvbXBpbGVyIG1pZ2h0Ci0JICogcmUtb3JkZXIgd2hlcmUgY2xlYW5jYWNoZV9vcHMgaXMgc2V0IGluIHRoaXMgZnVuY3Rpb24uCisJICogQSBjbGVhbmNhY2hlIGJhY2tlbmQgY2FuIGJlIGJ1aWx0IGFzIGEgbW9kdWxlIGFuZCBoZW5jZSBsb2FkZWQgYWZ0ZXIKKwkgKiBhIGNsZWFuY2FjaGUgZW5hYmxlZCBmaWxlc3lzdGVtIGhhcyBjYWxsZWQgY2xlYW5jYWNoZV9pbml0X2ZzLiBUbworCSAqIGhhbmRsZSBzdWNoIGEgc2NlbmFyaW8sIGhlcmUgd2UgY2FsbCAtPmluaXRfZnMgb3IgLT5pbml0X3NoYXJlZF9mcworCSAqIGZvciBlYWNoIGFjdGl2ZSBzdXBlciBibG9jay4gVG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGxvY2FsIGFuZAorCSAqIHNoYXJlZCBmaWxlc3lzdGVtcywgd2UgdGVtcG9yYXJpbHkgaW5pdGlhbGl6ZSBzYi0+Y2xlYW5jYWNoZV9wb29saWQKKwkgKiB0byBDTEVBTkNBQ0hFX05PX0JBQ0tFTkQgb3IgQ0xFQU5DQUNIRV9OT19CQUNLRU5EX1NIQVJFRAorCSAqIHJlc3BlY3RpdmVseSBpbiBjYXNlIHRoZXJlIGlzIG5vIGJhY2tlbmQgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZQorCSAqIGNsZWFuY2FjaGVfaW5pdF9mcyBvciBjbGVhbmNhY2hlX2luaXRfc2hhcmVkX2ZzIGlzIGNhbGxlZC4KKwkgKgorCSAqIFNpbmNlIGZpbGVzeXN0ZW1zIGNhbiBiZSBtb3VudGVkIGNvbmN1cnJlbnRseSB3aXRoIGNsZWFuY2FjaGUKKwkgKiBiYWNrZW5kIHJlZ2lzdHJhdGlvbiwgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIGd1YXJhbnRlZSB0aGF0IGFsbAorCSAqIGNsZWFuY2FjaGUgZW5hYmxlZCBmaWxlc3lzdGVtcyB0aGF0IGhhcyBiZWVuIG1vdW50ZWQgYnkgdGhlIHRpbWUKKwkgKiBjbGVhbmNhY2hlX3JlZ2lzdGVyX29wcyBpcyBjYWxsZWQgaGFzIGdvdCBhbmQgYWxsIG1vdW50ZWQgbGF0ZXIgd2lsbAorCSAqIGdldCBjbGVhbmNhY2hlX3Bvb2xpZC4gVGhpcyBpcyBhc3N1cmVkIGJ5IHRoZSBmb2xsb3dpbmcgc3RhdGVtZW50cworCSAqIHRpZWQgdG9nZXRoZXI6CisJICoKKwkgKiBhKSBpdGVyYXRlX3N1cGVycyBza2lwcyBvbmx5IHRob3NlIHN1cGVyIGJsb2NrcyB0aGF0IGhhcyBzdGFydGVkCisJICogICAgLT5raWxsX3NiCisJICoKKwkgKiBiKSBpZiBpdGVyYXRlX3N1cGVycyBlbmNvdW50ZXJzIGEgc3VwZXIgYmxvY2sgdGhhdCBoYXMgbm90IGZpbmlzaGVkCisJICogICAgLT5tb3VudCB5ZXQsIGl0IHdhaXRzIHVudGlsIGl0IGlzIGZpbmlzaGVkCisJICoKKwkgKiBjKSBjbGVhbmNhY2hlX2luaXRfZnMgaXMgY2FsbGVkIGZyb20gLT5tb3VudCBhbmQKKwkgKiAgICBjbGVhbmNhY2hlX2ludmFsaWRhdGVfZnMgaXMgY2FsbGVkIGZyb20gLT5raWxsX3NiCisJICoKKwkgKiBkKSB3ZSBjYWxsIGl0ZXJhdGVfc3VwZXJzIGFmdGVyIGNsZWFuY2FjaGVfb3BzIGhhcyBiZWVuIHNldAorCSAqCisJICogRnJvbSBhKSBpdCBmb2xsb3dzIHRoYXQgaWYgaXRlcmF0ZV9zdXBlcnMgc2tpcHMgYSBzdXBlciBibG9jaywgdGhlbgorCSAqIGVpdGhlciB0aGUgc3VwZXIgYmxvY2sgaXMgYWxyZWFkeSBkZWFkLCBpbiB3aGljaCBjYXNlIHdlIGRvIG5vdCBuZWVkCisJICogdG8gYm90aGVyIGluaXRpYWxpemluZyBjbGVhbmNhY2hlIGZvciBpdCwgb3IgaXQgd2FzIG1vdW50ZWQgYWZ0ZXIgd2UKKwkgKiBpbml0aWF0ZWQgaXRlcmF0ZV9zdXBlcnMuIEluIHRoZSBsYXR0ZXIgY2FzZSwgaXQgbXVzdCBoYXZlIHNlZW4KKwkgKiBjbGVhbmNhY2hlX29wcyBzZXQgYWNjb3JkaW5nIHRvIGQpIGFuZCBpbml0aWFsaXplZCBjbGVhbmNhY2hlIGZyb20KKwkgKiAtPm1vdW50IGJ5IGl0c2VsZiBhY2NvcmRpbmcgdG8gYykuIFRoaXMgcHJvdmVzIHRoYXQgd2UgY2FsbAorCSAqIC0+aW5pdF9mcyBhdCBsZWFzdCBvbmNlIGZvciBlYWNoIGFjdGl2ZSBzdXBlciBibG9jay4KKwkgKgorCSAqIEZyb20gYikgYW5kIGMpIGl0IGZvbGxvd3MgdGhhdCBpZiBpdGVyYXRlX3N1cGVycyBlbmNvdW50ZXJzIGEgc3VwZXIKKwkgKiBibG9jayB0aGF0IGhhcyBhbHJlYWR5IHN0YXJ0ZWQgLT5pbml0X2ZzLCBpdCB3aWxsIHdhaXQgdW50aWwgLT5tb3VudAorCSAqIGFuZCBoZW5jZSAtPmluaXRfZnMgaGFzIGZpbmlzaGVkLCB0aGVuIGNoZWNrIGNsZWFuY2FjaGVfcG9vbGlkLCBzZWUKKwkgKiB0aGF0IGl0IGhhcyBhbHJlYWR5IGJlZW4gc2V0IGFuZCB0aGVyZWZvcmUgZG8gbm90aGluZy4gVGhpcyBwcm92ZXMKKwkgKiB0aGF0IHdlIGNhbGwgLT5pbml0X2ZzIG5vIG1vcmUgdGhhbiBvbmNlIGZvciBlYWNoIHN1cGVyIGJsb2NrLgorCSAqCisJICogQ29tYmluZWQgdG9nZXRoZXIsIHRoZSBsYXN0IHR3byBwYXJhZ3JhcGhzIHByb3ZlIHRoZSBmdW5jdGlvbgorCSAqIGNvcnJlY3RuZXNzLgorCSAqCisJICogTm90ZSB0aGF0IHZhcmlvdXMgY2xlYW5jYWNoZSBjYWxsYmFja3MgbWF5IHByb2NlZWQgYmVmb3JlIHRoaXMKKwkgKiBmdW5jdGlvbiBpcyBjYWxsZWQgb3IgZXZlbiBjb25jdXJyZW50bHkgd2l0aCBpdCwgYnV0IHNpbmNlCisJICogQ0xFQU5DQUNIRV9OT19CQUNLRU5EIGlzIG5lZ2F0aXZlLCB0aGV5IHdpbGwgYWxsIHJlc3VsdCBpbiBhIG5vb3AKKwkgKiB1bnRpbCB0aGUgY29ycmVzcG9uZGluZyAtPmluaXRfZnMgaGFzIGJlZW4gYWN0dWFsbHkgY2FsbGVkIGFuZAorCSAqIGNsZWFuY2FjaGVfb3BzIGhhcyBiZWVuIHNldC4KIAkgKi8KLQliYXJyaWVyKCk7Ci0JY2xlYW5jYWNoZV9vcHMgPSBvcHM7Ci0JbXV0ZXhfdW5sb2NrKCZwb29saWRfbXV0ZXgpOwotCXJldHVybiBvbGQ7CisJaXRlcmF0ZV9zdXBlcnMoY2xlYW5jYWNoZV9yZWdpc3Rlcl9vcHNfc2IsIE5VTEwpOworCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChjbGVhbmNhY2hlX3JlZ2lzdGVyX29wcyk7CiAKIC8qIENhbGxlZCBieSBhIGNsZWFuY2FjaGUtZW5hYmxlZCBmaWxlc3lzdGVtIGF0IHRpbWUgb2YgbW91bnQgKi8KIHZvaWQgX19jbGVhbmNhY2hlX2luaXRfZnMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlpbnQgaTsKKwlpbnQgcG9vbF9pZCA9IENMRUFOQ0FDSEVfTk9fQkFDS0VORDsKIAotCW11dGV4X2xvY2soJnBvb2xpZF9tdXRleCk7Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9JTklUSUFMSVpBQkxFX0ZTOyBpKyspIHsKLQkJaWYgKGZzX3Bvb2xpZF9tYXBbaV0gPT0gRlNfVU5LTk9XTikgewotCQkJc2ItPmNsZWFuY2FjaGVfcG9vbGlkID0gaSArIEZBS0VfRlNfUE9PTElEX09GRlNFVDsKLQkJCWlmIChjbGVhbmNhY2hlX29wcykKLQkJCQlmc19wb29saWRfbWFwW2ldID0gY2xlYW5jYWNoZV9vcHMtPmluaXRfZnMoUEFHRV9TSVpFKTsKLQkJCWVsc2UKLQkJCQlmc19wb29saWRfbWFwW2ldID0gRlNfTk9fQkFDS0VORDsKLQkJCWJyZWFrOwotCQl9CisJaWYgKGNsZWFuY2FjaGVfb3BzKSB7CisJCXBvb2xfaWQgPSBjbGVhbmNhY2hlX29wcy0+aW5pdF9mcyhQQUdFX1NJWkUpOworCQlpZiAocG9vbF9pZCA8IDApCisJCQlwb29sX2lkID0gQ0xFQU5DQUNIRV9OT19QT09MOwogCX0KLQltdXRleF91bmxvY2soJnBvb2xpZF9tdXRleCk7CisJc2ItPmNsZWFuY2FjaGVfcG9vbGlkID0gcG9vbF9pZDsKIH0KIEVYUE9SVF9TWU1CT0woX19jbGVhbmNhY2hlX2luaXRfZnMpOwogCiAvKiBDYWxsZWQgYnkgYSBjbGVhbmNhY2hlLWVuYWJsZWQgY2x1c3RlcmVkIGZpbGVzeXN0ZW0gYXQgdGltZSBvZiBtb3VudCAqLwotdm9pZCBfX2NsZWFuY2FjaGVfaW5pdF9zaGFyZWRfZnMoY2hhciAqdXVpZCwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3ZvaWQgX19jbGVhbmNhY2hlX2luaXRfc2hhcmVkX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7Ci0JaW50IGk7CisJaW50IHBvb2xfaWQgPSBDTEVBTkNBQ0hFX05PX0JBQ0tFTkRfU0hBUkVEOwogCi0JbXV0ZXhfbG9jaygmcG9vbGlkX211dGV4KTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOSVRJQUxJWkFCTEVfRlM7IGkrKykgewotCQlpZiAoc2hhcmVkX2ZzX3Bvb2xpZF9tYXBbaV0gPT0gRlNfVU5LTk9XTikgewotCQkJc2ItPmNsZWFuY2FjaGVfcG9vbGlkID0gaSArIEZBS0VfU0hBUkVEX0ZTX1BPT0xJRF9PRkZTRVQ7Ci0JCQl1dWlkc1tpXSA9IHV1aWQ7Ci0JCQlpZiAoY2xlYW5jYWNoZV9vcHMpCi0JCQkJc2hhcmVkX2ZzX3Bvb2xpZF9tYXBbaV0gPSBjbGVhbmNhY2hlX29wcy0+aW5pdF9zaGFyZWRfZnMKLQkJCQkJCSh1dWlkLCBQQUdFX1NJWkUpOwotCQkJZWxzZQotCQkJCXNoYXJlZF9mc19wb29saWRfbWFwW2ldID0gRlNfTk9fQkFDS0VORDsKLQkJCWJyZWFrOwotCQl9CisJaWYgKGNsZWFuY2FjaGVfb3BzKSB7CisJCXBvb2xfaWQgPSBjbGVhbmNhY2hlX29wcy0+aW5pdF9zaGFyZWRfZnMoc2ItPnNfdXVpZCwgUEFHRV9TSVpFKTsKKwkJaWYgKHBvb2xfaWQgPCAwKQorCQkJcG9vbF9pZCA9IENMRUFOQ0FDSEVfTk9fUE9PTDsKIAl9Ci0JbXV0ZXhfdW5sb2NrKCZwb29saWRfbXV0ZXgpOworCXNiLT5jbGVhbmNhY2hlX3Bvb2xpZCA9IHBvb2xfaWQ7CiB9CiBFWFBPUlRfU1lNQk9MKF9fY2xlYW5jYWNoZV9pbml0X3NoYXJlZF9mcyk7CiAKQEAgLTIwMiwxOSArMTY0LDYgQEAKIH0KIAogLyoKLSAqIFJldHVybnMgYSBwb29sX2lkIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZmFrZSBwb29saWQuCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X3Bvb2xpZF9mcm9tX2Zha2UoaW50IGZha2VfcG9vbF9pZCkKLXsKLQlpZiAoZmFrZV9wb29sX2lkID49IEZBS0VfU0hBUkVEX0ZTX1BPT0xJRF9PRkZTRVQpCi0JCXJldHVybiBzaGFyZWRfZnNfcG9vbGlkX21hcFtmYWtlX3Bvb2xfaWQgLQotCQkJRkFLRV9TSEFSRURfRlNfUE9PTElEX09GRlNFVF07Ci0JZWxzZSBpZiAoZmFrZV9wb29sX2lkID49IEZBS0VfRlNfUE9PTElEX09GRlNFVCkKLQkJcmV0dXJuIGZzX3Bvb2xpZF9tYXBbZmFrZV9wb29sX2lkIC0gRkFLRV9GU19QT09MSURfT0ZGU0VUXTsKLQlyZXR1cm4gRlNfTk9fQkFDS0VORDsKLX0KLQotLyoKICAqICJHZXQiIGRhdGEgZnJvbSBjbGVhbmNhY2hlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcG9vbGlkL2lub2RlL2luZGV4CiAgKiB0aGF0IHdlcmUgc3BlY2lmaWVkIHdoZW4gdGhlIGRhdGEgd2FzIHB1dCB0byBjbGVhbmFjaGUgYW5kLCBpZgogICogc3VjY2Vzc2Z1bCwgdXNlIGl0IHRvIGZpbGwgdGhlIHNwZWNpZmllZCBwYWdlIHdpdGggZGF0YSBhbmQgcmV0dXJuIDAuCkBAIC0yMjksNyArMTc4LDYgQEAKIHsKIAlpbnQgcmV0ID0gLTE7CiAJaW50IHBvb2xfaWQ7Ci0JaW50IGZha2VfcG9vbF9pZDsKIAlzdHJ1Y3QgY2xlYW5jYWNoZV9maWxla2V5IGtleSA9IHsgLnUua2V5ID0geyAwIH0gfTsKIAogCWlmICghY2xlYW5jYWNoZV9vcHMpIHsKQEAgLTIzOCwxNyArMTg2LDE0IEBACiAJfQogCiAJVk1fQlVHX09OX1BBR0UoIVBhZ2VMb2NrZWQocGFnZSksIHBhZ2UpOwotCWZha2VfcG9vbF9pZCA9IHBhZ2UtPm1hcHBpbmctPmhvc3QtPmlfc2ItPmNsZWFuY2FjaGVfcG9vbGlkOwotCWlmIChmYWtlX3Bvb2xfaWQgPCAwKQorCXBvb2xfaWQgPSBwYWdlLT5tYXBwaW5nLT5ob3N0LT5pX3NiLT5jbGVhbmNhY2hlX3Bvb2xpZDsKKwlpZiAocG9vbF9pZCA8IDApCiAJCWdvdG8gb3V0OwotCXBvb2xfaWQgPSBnZXRfcG9vbGlkX2Zyb21fZmFrZShmYWtlX3Bvb2xfaWQpOwogCiAJaWYgKGNsZWFuY2FjaGVfZ2V0X2tleShwYWdlLT5tYXBwaW5nLT5ob3N0LCAma2V5KSA8IDApCiAJCWdvdG8gb3V0OwogCi0JaWYgKHBvb2xfaWQgPj0gMCkKLQkJcmV0ID0gY2xlYW5jYWNoZV9vcHMtPmdldF9wYWdlKHBvb2xfaWQsCi0JCQkJa2V5LCBwYWdlLT5pbmRleCwgcGFnZSk7CisJcmV0ID0gY2xlYW5jYWNoZV9vcHMtPmdldF9wYWdlKHBvb2xfaWQsIGtleSwgcGFnZS0+aW5kZXgsIHBhZ2UpOwogCWlmIChyZXQgPT0gMCkKIAkJY2xlYW5jYWNoZV9zdWNjX2dldHMrKzsKIAllbHNlCkBAIC0yNzEsNyArMjE2LDYgQEAKIHZvaWQgX19jbGVhbmNhY2hlX3B1dF9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewogCWludCBwb29sX2lkOwotCWludCBmYWtlX3Bvb2xfaWQ7CiAJc3RydWN0IGNsZWFuY2FjaGVfZmlsZWtleSBrZXkgPSB7IC51LmtleSA9IHsgMCB9IH07CiAKIAlpZiAoIWNsZWFuY2FjaGVfb3BzKSB7CkBAIC0yODAsMTIgKzIyNCw3IEBACiAJfQogCiAJVk1fQlVHX09OX1BBR0UoIVBhZ2VMb2NrZWQocGFnZSksIHBhZ2UpOwotCWZha2VfcG9vbF9pZCA9IHBhZ2UtPm1hcHBpbmctPmhvc3QtPmlfc2ItPmNsZWFuY2FjaGVfcG9vbGlkOwotCWlmIChmYWtlX3Bvb2xfaWQgPCAwKQotCQlyZXR1cm47Ci0KLQlwb29sX2lkID0gZ2V0X3Bvb2xpZF9mcm9tX2Zha2UoZmFrZV9wb29sX2lkKTsKLQorCXBvb2xfaWQgPSBwYWdlLT5tYXBwaW5nLT5ob3N0LT5pX3NiLT5jbGVhbmNhY2hlX3Bvb2xpZDsKIAlpZiAocG9vbF9pZCA+PSAwICYmCiAJCWNsZWFuY2FjaGVfZ2V0X2tleShwYWdlLT5tYXBwaW5nLT5ob3N0LCAma2V5KSA+PSAwKSB7CiAJCWNsZWFuY2FjaGVfb3BzLT5wdXRfcGFnZShwb29sX2lkLCBrZXksIHBhZ2UtPmluZGV4LCBwYWdlKTsKQEAgLTMwNiwxOCArMjQ1LDEzIEBACiAJCQkJCXN0cnVjdCBwYWdlICpwYWdlKQogewogCS8qIGNhcmVmdWwuLi4gcGFnZS0+bWFwcGluZyBpcyBOVUxMIHNvbWV0aW1lcyB3aGVuIHRoaXMgaXMgY2FsbGVkICovCi0JaW50IHBvb2xfaWQ7Ci0JaW50IGZha2VfcG9vbF9pZCA9IG1hcHBpbmctPmhvc3QtPmlfc2ItPmNsZWFuY2FjaGVfcG9vbGlkOworCWludCBwb29sX2lkID0gbWFwcGluZy0+aG9zdC0+aV9zYi0+Y2xlYW5jYWNoZV9wb29saWQ7CiAJc3RydWN0IGNsZWFuY2FjaGVfZmlsZWtleSBrZXkgPSB7IC51LmtleSA9IHsgMCB9IH07CiAKIAlpZiAoIWNsZWFuY2FjaGVfb3BzKQogCQlyZXR1cm47CiAKLQlpZiAoZmFrZV9wb29sX2lkID49IDApIHsKLQkJcG9vbF9pZCA9IGdldF9wb29saWRfZnJvbV9mYWtlKGZha2VfcG9vbF9pZCk7Ci0JCWlmIChwb29sX2lkIDwgMCkKLQkJCXJldHVybjsKLQorCWlmIChwb29sX2lkID49IDApIHsKIAkJVk1fQlVHX09OX1BBR0UoIVBhZ2VMb2NrZWQocGFnZSksIHBhZ2UpOwogCQlpZiAoY2xlYW5jYWNoZV9nZXRfa2V5KG1hcHBpbmctPmhvc3QsICZrZXkpID49IDApIHsKIAkJCWNsZWFuY2FjaGVfb3BzLT5pbnZhbGlkYXRlX3BhZ2UocG9vbF9pZCwKQEAgLTMzOSwxOCArMjczLDEyIEBACiAgKi8KIHZvaWQgX19jbGVhbmNhY2hlX2ludmFsaWRhdGVfaW5vZGUoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpCiB7Ci0JaW50IHBvb2xfaWQ7Ci0JaW50IGZha2VfcG9vbF9pZCA9IG1hcHBpbmctPmhvc3QtPmlfc2ItPmNsZWFuY2FjaGVfcG9vbGlkOworCWludCBwb29sX2lkID0gbWFwcGluZy0+aG9zdC0+aV9zYi0+Y2xlYW5jYWNoZV9wb29saWQ7CiAJc3RydWN0IGNsZWFuY2FjaGVfZmlsZWtleSBrZXkgPSB7IC51LmtleSA9IHsgMCB9IH07CiAKIAlpZiAoIWNsZWFuY2FjaGVfb3BzKQogCQlyZXR1cm47CiAKLQlpZiAoZmFrZV9wb29sX2lkIDwgMCkKLQkJcmV0dXJuOwotCi0JcG9vbF9pZCA9IGdldF9wb29saWRfZnJvbV9mYWtlKGZha2VfcG9vbF9pZCk7Ci0KIAlpZiAocG9vbF9pZCA+PSAwICYmIGNsZWFuY2FjaGVfZ2V0X2tleShtYXBwaW5nLT5ob3N0LCAma2V5KSA+PSAwKQogCQljbGVhbmNhY2hlX29wcy0+aW52YWxpZGF0ZV9pbm9kZShwb29sX2lkLCBrZXkpOwogfQpAQCAtMzYzLDMyICsyOTEsMTggQEAKICAqLwogdm9pZCBfX2NsZWFuY2FjaGVfaW52YWxpZGF0ZV9mcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQogewotCWludCBpbmRleDsKLQlpbnQgZmFrZV9wb29sX2lkID0gc2ItPmNsZWFuY2FjaGVfcG9vbGlkOwotCWludCBvbGRfcG9vbGlkID0gZmFrZV9wb29sX2lkOworCWludCBwb29sX2lkOwogCi0JbXV0ZXhfbG9jaygmcG9vbGlkX211dGV4KTsKLQlpZiAoZmFrZV9wb29sX2lkID49IEZBS0VfU0hBUkVEX0ZTX1BPT0xJRF9PRkZTRVQpIHsKLQkJaW5kZXggPSBmYWtlX3Bvb2xfaWQgLSBGQUtFX1NIQVJFRF9GU19QT09MSURfT0ZGU0VUOwotCQlvbGRfcG9vbGlkID0gc2hhcmVkX2ZzX3Bvb2xpZF9tYXBbaW5kZXhdOwotCQlzaGFyZWRfZnNfcG9vbGlkX21hcFtpbmRleF0gPSBGU19VTktOT1dOOwotCQl1dWlkc1tpbmRleF0gPSBOVUxMOwotCX0gZWxzZSBpZiAoZmFrZV9wb29sX2lkID49IEZBS0VfRlNfUE9PTElEX09GRlNFVCkgewotCQlpbmRleCA9IGZha2VfcG9vbF9pZCAtIEZBS0VfRlNfUE9PTElEX09GRlNFVDsKLQkJb2xkX3Bvb2xpZCA9IGZzX3Bvb2xpZF9tYXBbaW5kZXhdOwotCQlmc19wb29saWRfbWFwW2luZGV4XSA9IEZTX1VOS05PV047Ci0JfQotCXNiLT5jbGVhbmNhY2hlX3Bvb2xpZCA9IC0xOwotCWlmIChjbGVhbmNhY2hlX29wcykKLQkJY2xlYW5jYWNoZV9vcHMtPmludmFsaWRhdGVfZnMob2xkX3Bvb2xpZCk7Ci0JbXV0ZXhfdW5sb2NrKCZwb29saWRfbXV0ZXgpOworCXBvb2xfaWQgPSBzYi0+Y2xlYW5jYWNoZV9wb29saWQ7CisJc2ItPmNsZWFuY2FjaGVfcG9vbGlkID0gQ0xFQU5DQUNIRV9OT19QT09MOworCisJaWYgKGNsZWFuY2FjaGVfb3BzICYmIHBvb2xfaWQgPj0gMCkKKwkJY2xlYW5jYWNoZV9vcHMtPmludmFsaWRhdGVfZnMocG9vbF9pZCk7CiB9CiBFWFBPUlRfU1lNQk9MKF9fY2xlYW5jYWNoZV9pbnZhbGlkYXRlX2ZzKTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9jbGVhbmNhY2hlKHZvaWQpCiB7Ci0JaW50IGk7Ci0KICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAlzdHJ1Y3QgZGVudHJ5ICpyb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJjbGVhbmNhY2hlIiwgTlVMTCk7CiAJaWYgKHJvb3QgPT0gTlVMTCkKQEAgLTQwMCwxMCArMzE0LDYgQEAKIAlkZWJ1Z2ZzX2NyZWF0ZV91NjQoImludmFsaWRhdGVzIiwgU19JUlVHTywKIAkJCQlyb290LCAmY2xlYW5jYWNoZV9pbnZhbGlkYXRlcyk7CiAjZW5kaWYKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOSVRJQUxJWkFCTEVfRlM7IGkrKykgewotCQlmc19wb29saWRfbWFwW2ldID0gRlNfVU5LTk9XTjsKLQkJc2hhcmVkX2ZzX3Bvb2xpZF9tYXBbaV0gPSBGU19VTktOT1dOOwotCX0KIAlyZXR1cm4gMDsKIH0KIG1vZHVsZV9pbml0KGluaXRfY2xlYW5jYWNoZSkKZGlmZiAtLWdpdCBhL21tL2NtYS5jIGIvbW0vY21hLmMKaW5kZXggNjhlY2I3YS4uM2E3YTY3YiAxMDA2NDQKLS0tIGEvbW0vY21hLmMKKysrIGIvbW0vY21hLmMKQEAgLTIzLDYgKzIzLDcgQEAKICMgIGRlZmluZSBERUJVRwogI2VuZGlmCiAjZW5kaWYKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogCiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KQEAgLTM0LDMwICszNSwyNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NtYS5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9jbWEuaD4KIAotc3RydWN0IGNtYSB7Ci0JdW5zaWduZWQgbG9uZwliYXNlX3BmbjsKLQl1bnNpZ25lZCBsb25nCWNvdW50OwotCXVuc2lnbmVkIGxvbmcJKmJpdG1hcDsKLQl1bnNpZ25lZCBpbnQgb3JkZXJfcGVyX2JpdDsgLyogT3JkZXIgb2YgcGFnZXMgcmVwcmVzZW50ZWQgYnkgb25lIGJpdCAqLwotCXN0cnVjdCBtdXRleAlsb2NrOwotfTsKKyNpbmNsdWRlICJjbWEuaCIKIAotc3RhdGljIHN0cnVjdCBjbWEgY21hX2FyZWFzW01BWF9DTUFfQVJFQVNdOwotc3RhdGljIHVuc2lnbmVkIGNtYV9hcmVhX2NvdW50Oworc3RydWN0IGNtYSBjbWFfYXJlYXNbTUFYX0NNQV9BUkVBU107Cit1bnNpZ25lZCBjbWFfYXJlYV9jb3VudDsKIHN0YXRpYyBERUZJTkVfTVVURVgoY21hX211dGV4KTsKIAotcGh5c19hZGRyX3QgY21hX2dldF9iYXNlKHN0cnVjdCBjbWEgKmNtYSkKK3BoeXNfYWRkcl90IGNtYV9nZXRfYmFzZShjb25zdCBzdHJ1Y3QgY21hICpjbWEpCiB7CiAJcmV0dXJuIFBGTl9QSFlTKGNtYS0+YmFzZV9wZm4pOwogfQogCi11bnNpZ25lZCBsb25nIGNtYV9nZXRfc2l6ZShzdHJ1Y3QgY21hICpjbWEpCit1bnNpZ25lZCBsb25nIGNtYV9nZXRfc2l6ZShjb25zdCBzdHJ1Y3QgY21hICpjbWEpCiB7CiAJcmV0dXJuIGNtYS0+Y291bnQgPDwgUEFHRV9TSElGVDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgY21hX2JpdG1hcF9hbGlnbmVkX21hc2soc3RydWN0IGNtYSAqY21hLCBpbnQgYWxpZ25fb3JkZXIpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbWFfYml0bWFwX2FsaWduZWRfbWFzayhjb25zdCBzdHJ1Y3QgY21hICpjbWEsCisJCQkJCSAgICAgaW50IGFsaWduX29yZGVyKQogewogCWlmIChhbGlnbl9vcmRlciA8PSBjbWEtPm9yZGVyX3Blcl9iaXQpCiAJCXJldHVybiAwOwpAQCAtNjgsNyArNjUsOCBAQAogICogRmluZCBhIFBGTiBhbGlnbmVkIHRvIHRoZSBzcGVjaWZpZWQgb3JkZXIgYW5kIHJldHVybiBhbiBvZmZzZXQgcmVwcmVzZW50ZWQgaW4KICAqIG9yZGVyX3Blcl9iaXRzLgogICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjbWFfYml0bWFwX2FsaWduZWRfb2Zmc2V0KHN0cnVjdCBjbWEgKmNtYSwgaW50IGFsaWduX29yZGVyKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgY21hX2JpdG1hcF9hbGlnbmVkX29mZnNldChjb25zdCBzdHJ1Y3QgY21hICpjbWEsCisJCQkJCSAgICAgICBpbnQgYWxpZ25fb3JkZXIpCiB7CiAJaWYgKGFsaWduX29yZGVyIDw9IGNtYS0+b3JkZXJfcGVyX2JpdCkKIAkJcmV0dXJuIDA7CkBAIC03NywxOCArNzUsMTQgQEAKIAkJLSBjbWEtPmJhc2VfcGZuKSA+PiBjbWEtPm9yZGVyX3Blcl9iaXQ7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNtYV9iaXRtYXBfbWF4bm8oc3RydWN0IGNtYSAqY21hKQotewotCXJldHVybiBjbWEtPmNvdW50ID4+IGNtYS0+b3JkZXJfcGVyX2JpdDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgY21hX2JpdG1hcF9wYWdlc190b19iaXRzKHN0cnVjdCBjbWEgKmNtYSwKLQkJCQkJCXVuc2lnbmVkIGxvbmcgcGFnZXMpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjbWFfYml0bWFwX3BhZ2VzX3RvX2JpdHMoY29uc3Qgc3RydWN0IGNtYSAqY21hLAorCQkJCQkgICAgICB1bnNpZ25lZCBsb25nIHBhZ2VzKQogewogCXJldHVybiBBTElHTihwYWdlcywgMVVMIDw8IGNtYS0+b3JkZXJfcGVyX2JpdCkgPj4gY21hLT5vcmRlcl9wZXJfYml0OwogfQogCi1zdGF0aWMgdm9pZCBjbWFfY2xlYXJfYml0bWFwKHN0cnVjdCBjbWEgKmNtYSwgdW5zaWduZWQgbG9uZyBwZm4sIGludCBjb3VudCkKK3N0YXRpYyB2b2lkIGNtYV9jbGVhcl9iaXRtYXAoc3RydWN0IGNtYSAqY21hLCB1bnNpZ25lZCBsb25nIHBmbiwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNvdW50KQogewogCXVuc2lnbmVkIGxvbmcgYml0bWFwX25vLCBiaXRtYXBfY291bnQ7CiAKQEAgLTEzNCw2ICsxMjgsMTIgQEAKIAl9IHdoaWxlICgtLWkpOwogCiAJbXV0ZXhfaW5pdCgmY21hLT5sb2NrKTsKKworI2lmZGVmIENPTkZJR19DTUFfREVCVUdGUworCUlOSVRfSExJU1RfSEVBRCgmY21hLT5tZW1faGVhZCk7CisJc3Bpbl9sb2NrX2luaXQoJmNtYS0+bWVtX2hlYWRfbG9jayk7CisjZW5kaWYKKwogCXJldHVybiAwOwogCiBlcnI6CkBAIC0xNjcsNyArMTY3LDggQEAKICAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBjdXN0b20gY29udGlndW91cyBhcmVhIGZyb20gYWxyZWFkeSByZXNlcnZlZCBtZW1vcnkuCiAgKi8KIGludCBfX2luaXQgY21hX2luaXRfcmVzZXJ2ZWRfbWVtKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUsCi0JCQkJIGludCBvcmRlcl9wZXJfYml0LCBzdHJ1Y3QgY21hICoqcmVzX2NtYSkKKwkJCQkgdW5zaWduZWQgaW50IG9yZGVyX3Blcl9iaXQsCisJCQkJIHN0cnVjdCBjbWEgKipyZXNfY21hKQogewogCXN0cnVjdCBjbWEgKmNtYTsKIAlwaHlzX2FkZHJfdCBhbGlnbm1lbnQ7CkBAIC0zNTgsNyArMzU5LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHBhcnQgb2YgY29udGlndW91cyBtZW1vcnkgb24gc3BlY2lmaWMKICAqIGNvbnRpZ3VvdXMgbWVtb3J5IGFyZWEuCiAgKi8KLXN0cnVjdCBwYWdlICpjbWFfYWxsb2Moc3RydWN0IGNtYSAqY21hLCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBhbGlnbikKK3N0cnVjdCBwYWdlICpjbWFfYWxsb2Moc3RydWN0IGNtYSAqY21hLCB1bnNpZ25lZCBpbnQgY291bnQsIHVuc2lnbmVkIGludCBhbGlnbikKIHsKIAl1bnNpZ25lZCBsb25nIG1hc2ssIG9mZnNldCwgcGZuLCBzdGFydCA9IDA7CiAJdW5zaWduZWQgbG9uZyBiaXRtYXBfbWF4bm8sIGJpdG1hcF9ubywgYml0bWFwX2NvdW50OwpAQCAtNDE1LDYgKzQxNiw4IEBACiAJCXN0YXJ0ID0gYml0bWFwX25vICsgbWFzayArIDE7CiAJfQogCisJdHJhY2VfY21hX2FsbG9jKHBhZ2UgPyBwZm4gOiAtMVVMLCBwYWdlLCBjb3VudCwgYWxpZ24pOworCiAJcHJfZGVidWcoIiVzKCk6IHJldHVybmVkICVwXG4iLCBfX2Z1bmNfXywgcGFnZSk7CiAJcmV0dXJuIHBhZ2U7CiB9CkBAIC00MjksNyArNDMyLDcgQEAKICAqIEl0IHJldHVybnMgZmFsc2Ugd2hlbiBwcm92aWRlZCBwYWdlcyBkbyBub3QgYmVsb25nIHRvIGNvbnRpZ3VvdXMgYXJlYSBhbmQKICAqIHRydWUgb3RoZXJ3aXNlLgogICovCi1ib29sIGNtYV9yZWxlYXNlKHN0cnVjdCBjbWEgKmNtYSwgc3RydWN0IHBhZ2UgKnBhZ2VzLCBpbnQgY291bnQpCitib29sIGNtYV9yZWxlYXNlKHN0cnVjdCBjbWEgKmNtYSwgY29uc3Qgc3RydWN0IHBhZ2UgKnBhZ2VzLCB1bnNpZ25lZCBpbnQgY291bnQpCiB7CiAJdW5zaWduZWQgbG9uZyBwZm47CiAKQEAgLTQ0Nyw2ICs0NTAsNyBAQAogCiAJZnJlZV9jb250aWdfcmFuZ2UocGZuLCBjb3VudCk7CiAJY21hX2NsZWFyX2JpdG1hcChjbWEsIHBmbiwgY291bnQpOworCXRyYWNlX2NtYV9yZWxlYXNlKHBmbiwgcGFnZXMsIGNvdW50KTsKIAogCXJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvbW0vY21hLmggYi9tbS9jbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTMyZDczCi0tLSAvZGV2L251bGwKKysrIGIvbW0vY21hLmgKQEAgLTAsMCArMSwyNCBAQAorI2lmbmRlZiBfX01NX0NNQV9IX18KKyNkZWZpbmUgX19NTV9DTUFfSF9fCisKK3N0cnVjdCBjbWEgeworCXVuc2lnbmVkIGxvbmcgICBiYXNlX3BmbjsKKwl1bnNpZ25lZCBsb25nICAgY291bnQ7CisJdW5zaWduZWQgbG9uZyAgICpiaXRtYXA7CisJdW5zaWduZWQgaW50IG9yZGVyX3Blcl9iaXQ7IC8qIE9yZGVyIG9mIHBhZ2VzIHJlcHJlc2VudGVkIGJ5IG9uZSBiaXQgKi8KKwlzdHJ1Y3QgbXV0ZXggICAgbG9jazsKKyNpZmRlZiBDT05GSUdfQ01BX0RFQlVHRlMKKwlzdHJ1Y3QgaGxpc3RfaGVhZCBtZW1faGVhZDsKKwlzcGlubG9ja190IG1lbV9oZWFkX2xvY2s7CisjZW5kaWYKK307CisKK2V4dGVybiBzdHJ1Y3QgY21hIGNtYV9hcmVhc1tNQVhfQ01BX0FSRUFTXTsKK2V4dGVybiB1bnNpZ25lZCBjbWFfYXJlYV9jb3VudDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgY21hX2JpdG1hcF9tYXhubyhzdHJ1Y3QgY21hICpjbWEpCit7CisJcmV0dXJuIGNtYS0+Y291bnQgPj4gY21hLT5vcmRlcl9wZXJfYml0OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21tL2NtYV9kZWJ1Zy5jIGIvbW0vY21hX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyMWVlMwotLS0gL2Rldi9udWxsCisrKyBiL21tL2NtYV9kZWJ1Zy5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ01BIERlYnVnRlMgSW50ZXJmYWNlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1IFNhc2hhIExldmluIDxzYXNoYS5sZXZpbkBvcmFjbGUuY29tPgorICovCisKKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tX3R5cGVzLmg+CisKKyNpbmNsdWRlICJjbWEuaCIKKworc3RydWN0IGNtYV9tZW0geworCXN0cnVjdCBobGlzdF9ub2RlIG5vZGU7CisJc3RydWN0IHBhZ2UgKnA7CisJdW5zaWduZWQgbG9uZyBuOworfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmNtYV9kZWJ1Z2ZzX3Jvb3Q7CisKK3N0YXRpYyBpbnQgY21hX2RlYnVnZnNfZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQoreworCXVuc2lnbmVkIGxvbmcgKnAgPSBkYXRhOworCisJKnZhbCA9ICpwOworCisJcmV0dXJuIDA7Cit9CitERUZJTkVfU0lNUExFX0FUVFJJQlVURShjbWFfZGVidWdmc19mb3BzLCBjbWFfZGVidWdmc19nZXQsIE5VTEwsICIlbGx1XG4iKTsKKworc3RhdGljIGludCBjbWFfdXNlZF9nZXQodm9pZCAqZGF0YSwgdTY0ICp2YWwpCit7CisJc3RydWN0IGNtYSAqY21hID0gZGF0YTsKKwl1bnNpZ25lZCBsb25nIHVzZWQ7CisKKwltdXRleF9sb2NrKCZjbWEtPmxvY2spOworCS8qIHBhZ2VzIGNvdW50ZXIgaXMgc21hbGxlciB0aGFuIHNpemVvZihpbnQpICovCisJdXNlZCA9IGJpdG1hcF93ZWlnaHQoY21hLT5iaXRtYXAsIChpbnQpY21hLT5jb3VudCk7CisJbXV0ZXhfdW5sb2NrKCZjbWEtPmxvY2spOworCSp2YWwgPSAodTY0KXVzZWQgPDwgY21hLT5vcmRlcl9wZXJfYml0OworCisJcmV0dXJuIDA7Cit9CitERUZJTkVfU0lNUExFX0FUVFJJQlVURShjbWFfdXNlZF9mb3BzLCBjbWFfdXNlZF9nZXQsIE5VTEwsICIlbGx1XG4iKTsKKworc3RhdGljIGludCBjbWFfbWF4Y2h1bmtfZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQoreworCXN0cnVjdCBjbWEgKmNtYSA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyBtYXhjaHVuayA9IDA7CisJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kID0gMDsKKworCW11dGV4X2xvY2soJmNtYS0+bG9jayk7CisJZm9yICg7OykgeworCQlzdGFydCA9IGZpbmRfbmV4dF96ZXJvX2JpdChjbWEtPmJpdG1hcCwgY21hLT5jb3VudCwgZW5kKTsKKwkJaWYgKHN0YXJ0ID49IGNtYS0+Y291bnQpCisJCQlicmVhazsKKwkJZW5kID0gZmluZF9uZXh0X2JpdChjbWEtPmJpdG1hcCwgY21hLT5jb3VudCwgc3RhcnQpOworCQltYXhjaHVuayA9IG1heChlbmQgLSBzdGFydCwgbWF4Y2h1bmspOworCX0KKwltdXRleF91bmxvY2soJmNtYS0+bG9jayk7CisJKnZhbCA9ICh1NjQpbWF4Y2h1bmsgPDwgY21hLT5vcmRlcl9wZXJfYml0OworCisJcmV0dXJuIDA7Cit9CitERUZJTkVfU0lNUExFX0FUVFJJQlVURShjbWFfbWF4Y2h1bmtfZm9wcywgY21hX21heGNodW5rX2dldCwgTlVMTCwgIiVsbHVcbiIpOworCitzdGF0aWMgdm9pZCBjbWFfYWRkX3RvX2NtYV9tZW1fbGlzdChzdHJ1Y3QgY21hICpjbWEsIHN0cnVjdCBjbWFfbWVtICptZW0pCit7CisJc3Bpbl9sb2NrKCZjbWEtPm1lbV9oZWFkX2xvY2spOworCWhsaXN0X2FkZF9oZWFkKCZtZW0tPm5vZGUsICZjbWEtPm1lbV9oZWFkKTsKKwlzcGluX3VubG9jaygmY21hLT5tZW1faGVhZF9sb2NrKTsKK30KKworc3RhdGljIHN0cnVjdCBjbWFfbWVtICpjbWFfZ2V0X2VudHJ5X2Zyb21fbGlzdChzdHJ1Y3QgY21hICpjbWEpCit7CisJc3RydWN0IGNtYV9tZW0gKm1lbSA9IE5VTEw7CisKKwlzcGluX2xvY2soJmNtYS0+bWVtX2hlYWRfbG9jayk7CisJaWYgKCFobGlzdF9lbXB0eSgmY21hLT5tZW1faGVhZCkpIHsKKwkJbWVtID0gaGxpc3RfZW50cnkoY21hLT5tZW1faGVhZC5maXJzdCwgc3RydWN0IGNtYV9tZW0sIG5vZGUpOworCQlobGlzdF9kZWxfaW5pdCgmbWVtLT5ub2RlKTsKKwl9CisJc3Bpbl91bmxvY2soJmNtYS0+bWVtX2hlYWRfbG9jayk7CisKKwlyZXR1cm4gbWVtOworfQorCitzdGF0aWMgaW50IGNtYV9mcmVlX21lbShzdHJ1Y3QgY21hICpjbWEsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgY21hX21lbSAqbWVtID0gTlVMTDsKKworCXdoaWxlIChjb3VudCkgeworCQltZW0gPSBjbWFfZ2V0X2VudHJ5X2Zyb21fbGlzdChjbWEpOworCQlpZiAobWVtID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKworCQlpZiAobWVtLT5uIDw9IGNvdW50KSB7CisJCQljbWFfcmVsZWFzZShjbWEsIG1lbS0+cCwgbWVtLT5uKTsKKwkJCWNvdW50IC09IG1lbS0+bjsKKwkJCWtmcmVlKG1lbSk7CisJCX0gZWxzZSBpZiAoY21hLT5vcmRlcl9wZXJfYml0ID09IDApIHsKKwkJCWNtYV9yZWxlYXNlKGNtYSwgbWVtLT5wLCBjb3VudCk7CisJCQltZW0tPnAgKz0gY291bnQ7CisJCQltZW0tPm4gLT0gY291bnQ7CisJCQljb3VudCA9IDA7CisJCQljbWFfYWRkX3RvX2NtYV9tZW1fbGlzdChjbWEsIG1lbSk7CisJCX0gZWxzZSB7CisJCQlwcl9kZWJ1ZygiY21hOiBjYW5ub3QgcmVsZWFzZSBwYXJ0aWFsIGJsb2NrIHdoZW4gb3JkZXJfcGVyX2JpdCAhPSAwXG4iKTsKKwkJCWNtYV9hZGRfdG9fY21hX21lbV9saXN0KGNtYSwgbWVtKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIGludCBjbWFfZnJlZV93cml0ZSh2b2lkICpkYXRhLCB1NjQgdmFsKQoreworCWludCBwYWdlcyA9IHZhbDsKKwlzdHJ1Y3QgY21hICpjbWEgPSBkYXRhOworCisJcmV0dXJuIGNtYV9mcmVlX21lbShjbWEsIHBhZ2VzKTsKK30KK0RFRklORV9TSU1QTEVfQVRUUklCVVRFKGNtYV9mcmVlX2ZvcHMsIE5VTEwsIGNtYV9mcmVlX3dyaXRlLCAiJWxsdVxuIik7CisKK3N0YXRpYyBpbnQgY21hX2FsbG9jX21lbShzdHJ1Y3QgY21hICpjbWEsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgY21hX21lbSAqbWVtOworCXN0cnVjdCBwYWdlICpwOworCisJbWVtID0ga3phbGxvYyhzaXplb2YoKm1lbSksIEdGUF9LRVJORUwpOworCWlmICghbWVtKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXAgPSBjbWFfYWxsb2MoY21hLCBjb3VudCwgMCk7CisJaWYgKCFwKSB7CisJCWtmcmVlKG1lbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbS0+cCA9IHA7CisJbWVtLT5uID0gY291bnQ7CisKKwljbWFfYWRkX3RvX2NtYV9tZW1fbGlzdChjbWEsIG1lbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbWFfYWxsb2Nfd3JpdGUodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3sKKwlpbnQgcGFnZXMgPSB2YWw7CisJc3RydWN0IGNtYSAqY21hID0gZGF0YTsKKworCXJldHVybiBjbWFfYWxsb2NfbWVtKGNtYSwgcGFnZXMpOworfQorREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoY21hX2FsbG9jX2ZvcHMsIE5VTEwsIGNtYV9hbGxvY193cml0ZSwgIiVsbHVcbiIpOworCitzdGF0aWMgdm9pZCBjbWFfZGVidWdmc19hZGRfb25lKHN0cnVjdCBjbWEgKmNtYSwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICp0bXA7CisJY2hhciBuYW1lWzE2XTsKKwlpbnQgdTMyczsKKworCXNwcmludGYobmFtZSwgImNtYS0lZCIsIGlkeCk7CisKKwl0bXAgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgY21hX2RlYnVnZnNfcm9vdCk7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhbGxvYyIsIFNfSVdVU1IsIGNtYV9kZWJ1Z2ZzX3Jvb3QsIGNtYSwKKwkJCQkmY21hX2FsbG9jX2ZvcHMpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgiZnJlZSIsIFNfSVdVU1IsIGNtYV9kZWJ1Z2ZzX3Jvb3QsIGNtYSwKKwkJCQkmY21hX2ZyZWVfZm9wcyk7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJiYXNlX3BmbiIsIFNfSVJVR08sIHRtcCwKKwkJCQkmY21hLT5iYXNlX3BmbiwgJmNtYV9kZWJ1Z2ZzX2ZvcHMpOworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImNvdW50IiwgU19JUlVHTywgdG1wLAorCQkJCSZjbWEtPmNvdW50LCAmY21hX2RlYnVnZnNfZm9wcyk7CisJZGVidWdmc19jcmVhdGVfZmlsZSgib3JkZXJfcGVyX2JpdCIsIFNfSVJVR08sIHRtcCwKKwkJCQkmY21hLT5vcmRlcl9wZXJfYml0LCAmY21hX2RlYnVnZnNfZm9wcyk7CisJZGVidWdmc19jcmVhdGVfZmlsZSgidXNlZCIsIFNfSVJVR08sIHRtcCwgY21hLCAmY21hX3VzZWRfZm9wcyk7CisJZGVidWdmc19jcmVhdGVfZmlsZSgibWF4Y2h1bmsiLCBTX0lSVUdPLCB0bXAsIGNtYSwgJmNtYV9tYXhjaHVua19mb3BzKTsKKworCXUzMnMgPSBESVZfUk9VTkRfVVAoY21hX2JpdG1hcF9tYXhubyhjbWEpLCBCSVRTX1BFUl9CWVRFICogc2l6ZW9mKHUzMikpOworCWRlYnVnZnNfY3JlYXRlX3UzMl9hcnJheSgiYml0bWFwIiwgU19JUlVHTywgdG1wLCAodTMyKiljbWEtPmJpdG1hcCwgdTMycyk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNtYV9kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWNtYV9kZWJ1Z2ZzX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImNtYSIsIE5VTEwpOworCWlmICghY21hX2RlYnVnZnNfcm9vdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgY21hX2FyZWFfY291bnQ7IGkrKykKKwkJY21hX2RlYnVnZnNfYWRkX29uZSgmY21hX2FyZWFzW2ldLCBpKTsKKworCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbChjbWFfZGVidWdmc19pbml0KTsKZGlmZiAtLWdpdCBhL21tL2NvbXBhY3Rpb24uYyBiL21tL2NvbXBhY3Rpb24uYwppbmRleCA4YzBkOTQ1Li4wMThmMDhkIDEwMDY0NAotLS0gYS9tbS9jb21wYWN0aW9uLmMKKysrIGIvbW0vY29tcGFjdGlvbi5jCkBAIC0zOTEsMjggKzM5MSw2IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0vKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhZ2UgaXMgd2l0aGluIGEgYmxvY2sgc3VpdGFibGUgZm9yIG1pZ3JhdGlvbiB0byAqLwotc3RhdGljIGJvb2wgc3VpdGFibGVfbWlncmF0aW9uX3RhcmdldChzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQkvKiBJZiB0aGUgcGFnZSBpcyBhIGxhcmdlIGZyZWUgcGFnZSwgdGhlbiBkaXNhbGxvdyBtaWdyYXRpb24gKi8KLQlpZiAoUGFnZUJ1ZGR5KHBhZ2UpKSB7Ci0JCS8qCi0JCSAqIFdlIGFyZSBjaGVja2luZyBwYWdlX29yZGVyIHdpdGhvdXQgem9uZS0+bG9jayB0YWtlbi4gQnV0Ci0JCSAqIHRoZSBvbmx5IHNtYWxsIGRhbmdlciBpcyB0aGF0IHdlIHNraXAgYSBwb3RlbnRpYWxseSBzdWl0YWJsZQotCQkgKiBwYWdlYmxvY2ssIHNvIGl0J3Mgbm90IHdvcnRoIHRvIGNoZWNrIG9yZGVyIGZvciB2YWxpZCByYW5nZS4KLQkJICovCi0JCWlmIChwYWdlX29yZGVyX3Vuc2FmZShwYWdlKSA+PSBwYWdlYmxvY2tfb3JkZXIpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogSWYgdGhlIGJsb2NrIGlzIE1JR1JBVEVfTU9WQUJMRSBvciBNSUdSQVRFX0NNQSwgYWxsb3cgbWlncmF0aW9uICovCi0JaWYgKG1pZ3JhdGVfYXN5bmNfc3VpdGFibGUoZ2V0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlKSkpCi0JCXJldHVybiB0cnVlOwotCi0JLyogT3RoZXJ3aXNlIHNraXAgdGhlIGJsb2NrICovCi0JcmV0dXJuIGZhbHNlOwotfQotCiAvKgogICogSXNvbGF0ZSBmcmVlIHBhZ2VzIG9udG8gYSBwcml2YXRlIGZyZWVsaXN0LiBJZiBAc3RyaWN0IGlzIHRydWUsIHdpbGwgYWJvcnQKICAqIHJldHVybmluZyAwIG9uIGFueSBpbnZhbGlkIFBGTnMgb3Igbm9uLWZyZWUgcGFnZXMgaW5zaWRlIG9mIHRoZSBwYWdlYmxvY2sKQEAgLTg5Niw2ICs4NzQsMjkgQEAKIAogI2VuZGlmIC8qIENPTkZJR19DT01QQUNUSU9OIHx8IENPTkZJR19DTUEgKi8KICNpZmRlZiBDT05GSUdfQ09NUEFDVElPTgorCisvKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhZ2UgaXMgd2l0aGluIGEgYmxvY2sgc3VpdGFibGUgZm9yIG1pZ3JhdGlvbiB0byAqLworc3RhdGljIGJvb2wgc3VpdGFibGVfbWlncmF0aW9uX3RhcmdldChzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwkvKiBJZiB0aGUgcGFnZSBpcyBhIGxhcmdlIGZyZWUgcGFnZSwgdGhlbiBkaXNhbGxvdyBtaWdyYXRpb24gKi8KKwlpZiAoUGFnZUJ1ZGR5KHBhZ2UpKSB7CisJCS8qCisJCSAqIFdlIGFyZSBjaGVja2luZyBwYWdlX29yZGVyIHdpdGhvdXQgem9uZS0+bG9jayB0YWtlbi4gQnV0CisJCSAqIHRoZSBvbmx5IHNtYWxsIGRhbmdlciBpcyB0aGF0IHdlIHNraXAgYSBwb3RlbnRpYWxseSBzdWl0YWJsZQorCQkgKiBwYWdlYmxvY2ssIHNvIGl0J3Mgbm90IHdvcnRoIHRvIGNoZWNrIG9yZGVyIGZvciB2YWxpZCByYW5nZS4KKwkJICovCisJCWlmIChwYWdlX29yZGVyX3Vuc2FmZShwYWdlKSA+PSBwYWdlYmxvY2tfb3JkZXIpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogSWYgdGhlIGJsb2NrIGlzIE1JR1JBVEVfTU9WQUJMRSBvciBNSUdSQVRFX0NNQSwgYWxsb3cgbWlncmF0aW9uICovCisJaWYgKG1pZ3JhdGVfYXN5bmNfc3VpdGFibGUoZ2V0X3BhZ2VibG9ja19taWdyYXRldHlwZShwYWdlKSkpCisJCXJldHVybiB0cnVlOworCisJLyogT3RoZXJ3aXNlIHNraXAgdGhlIGJsb2NrICovCisJcmV0dXJuIGZhbHNlOworfQorCiAvKgogICogQmFzZWQgb24gaW5mb3JtYXRpb24gaW4gdGhlIGN1cnJlbnQgY29tcGFjdF9jb250cm9sLCBmaW5kIGJsb2NrcwogICogc3VpdGFibGUgZm9yIGlzb2xhdGluZyBmcmVlIHBhZ2VzIGZyb20gYW5kIHRoZW4gaXNvbGF0ZSB0aGVtLgpAQCAtMTA0Nyw2ICsxMDQ4LDEyIEBACiB9IGlzb2xhdGVfbWlncmF0ZV90OwogCiAvKgorICogQWxsb3cgdXNlcnNwYWNlIHRvIGNvbnRyb2wgcG9saWN5IG9uIHNjYW5uaW5nIHRoZSB1bmV2aWN0YWJsZSBMUlUgZm9yCisgKiBjb21wYWN0YWJsZSBwYWdlcy4KKyAqLworaW50IHN5c2N0bF9jb21wYWN0X3VuZXZpY3RhYmxlX2FsbG93ZWQgX19yZWFkX21vc3RseSA9IDE7CisKKy8qCiAgKiBJc29sYXRlIGFsbCBwYWdlcyB0aGF0IGNhbiBiZSBtaWdyYXRlZCBmcm9tIHRoZSBmaXJzdCBzdWl0YWJsZSBibG9jaywKICAqIHN0YXJ0aW5nIGF0IHRoZSBibG9jayBwb2ludGVkIHRvIGJ5IHRoZSBtaWdyYXRlIHNjYW5uZXIgcGZuIHdpdGhpbgogICogY29tcGFjdF9jb250cm9sLgpAQCAtMTA1Nyw2ICsxMDY0LDcgQEAKIAl1bnNpZ25lZCBsb25nIGxvd19wZm4sIGVuZF9wZm47CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJY29uc3QgaXNvbGF0ZV9tb2RlX3QgaXNvbGF0ZV9tb2RlID0KKwkJKHN5c2N0bF9jb21wYWN0X3VuZXZpY3RhYmxlX2FsbG93ZWQgPyBJU09MQVRFX1VORVZJQ1RBQkxFIDogMCkgfAogCQkoY2MtPm1vZGUgPT0gTUlHUkFURV9BU1lOQyA/IElTT0xBVEVfQVNZTkNfTUlHUkFURSA6IDApOwogCiAJLyoKQEAgLTExNzQsMTMgKzExODIsMjQgQEAKIAkvKiBEaXJlY3QgY29tcGFjdG9yOiBJcyBhIHN1aXRhYmxlIHBhZ2UgZnJlZT8gKi8KIAlmb3IgKG9yZGVyID0gY2MtPm9yZGVyOyBvcmRlciA8IE1BWF9PUkRFUjsgb3JkZXIrKykgewogCQlzdHJ1Y3QgZnJlZV9hcmVhICphcmVhID0gJnpvbmUtPmZyZWVfYXJlYVtvcmRlcl07CisJCWJvb2wgY2FuX3N0ZWFsOwogCiAJCS8qIEpvYiBkb25lIGlmIHBhZ2UgaXMgZnJlZSBvZiB0aGUgcmlnaHQgbWlncmF0ZXR5cGUgKi8KIAkJaWYgKCFsaXN0X2VtcHR5KCZhcmVhLT5mcmVlX2xpc3RbbWlncmF0ZXR5cGVdKSkKIAkJCXJldHVybiBDT01QQUNUX1BBUlRJQUw7CiAKLQkJLyogSm9iIGRvbmUgaWYgYWxsb2NhdGlvbiB3b3VsZCBzZXQgYmxvY2sgdHlwZSAqLwotCQlpZiAob3JkZXIgPj0gcGFnZWJsb2NrX29yZGVyICYmIGFyZWEtPm5yX2ZyZWUpCisjaWZkZWYgQ09ORklHX0NNQQorCQkvKiBNSUdSQVRFX01PVkFCTEUgY2FuIGZhbGxiYWNrIG9uIE1JR1JBVEVfQ01BICovCisJCWlmIChtaWdyYXRldHlwZSA9PSBNSUdSQVRFX01PVkFCTEUgJiYKKwkJCSFsaXN0X2VtcHR5KCZhcmVhLT5mcmVlX2xpc3RbTUlHUkFURV9DTUFdKSkKKwkJCXJldHVybiBDT01QQUNUX1BBUlRJQUw7CisjZW5kaWYKKwkJLyoKKwkJICogSm9iIGRvbmUgaWYgYWxsb2NhdGlvbiB3b3VsZCBzdGVhbCBmcmVlcGFnZXMgZnJvbQorCQkgKiBvdGhlciBtaWdyYXRldHlwZSBidWRkeSBsaXN0cy4KKwkJICovCisJCWlmIChmaW5kX3N1aXRhYmxlX2ZhbGxiYWNrKGFyZWEsIG9yZGVyLCBtaWdyYXRldHlwZSwKKwkJCQkJCXRydWUsICZjYW5fc3RlYWwpICE9IC0xKQogCQkJcmV0dXJuIENPTVBBQ1RfUEFSVElBTDsKIAl9CiAKQEAgLTE1ODcsNiArMTYwNiwxNCBAQAogCQlJTklUX0xJU1RfSEVBRCgmY2MtPmZyZWVwYWdlcyk7CiAJCUlOSVRfTElTVF9IRUFEKCZjYy0+bWlncmF0ZXBhZ2VzKTsKIAorCQkvKgorCQkgKiBXaGVuIGNhbGxlZCB2aWEgL3Byb2Mvc3lzL3ZtL2NvbXBhY3RfbWVtb3J5CisJCSAqIHRoaXMgbWFrZXMgc3VyZSB3ZSBjb21wYWN0IHRoZSB3aG9sZSB6b25lIHJlZ2FyZGxlc3Mgb2YKKwkJICogY2FjaGVkIHNjYW5uZXIgcG9zaXRpb25zLgorCQkgKi8KKwkJaWYgKGNjLT5vcmRlciA9PSAtMSkKKwkJCV9fcmVzZXRfaXNvbGF0aW9uX3N1aXRhYmxlKHpvbmUpOworCiAJCWlmIChjYy0+b3JkZXIgPT0gLTEgfHwgIWNvbXBhY3Rpb25fZGVmZXJyZWQoem9uZSwgY2MtPm9yZGVyKSkKIAkJCWNvbXBhY3Rfem9uZSh6b25lLCBjYyk7CiAKZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCBhZDcyNDIwLi4xMjU0OGQwIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0xMyw3ICsxMyw2IEBACiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsX3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KQEAgLTIwMywxNiArMjAyLDE1IEBACiAJQlVHX09OKHBhZ2VfbWFwcGVkKHBhZ2UpKTsKIAogCS8qCi0JICogU29tZSBmaWxlc3lzdGVtcyBzZWVtIHRvIHJlLWRpcnR5IHRoZSBwYWdlIGV2ZW4gYWZ0ZXIKLQkgKiB0aGUgVk0gaGFzIGNhbmNlbGVkIHRoZSBkaXJ0eSBiaXQgKGVnIGV4dDMgam91cm5hbGluZykuCisJICogQXQgdGhpcyBwb2ludCBwYWdlIG11c3QgYmUgZWl0aGVyIHdyaXR0ZW4gb3IgY2xlYW5lZCBieSB0cnVuY2F0ZS4KKwkgKiBEaXJ0eSBwYWdlIGhlcmUgc2lnbmFscyBhIGJ1ZyBhbmQgbG9zcyBvZiB1bndyaXR0ZW4gZGF0YS4KIAkgKgotCSAqIEZpeCBpdCB1cCBieSBkb2luZyBhIGZpbmFsIGRpcnR5IGFjY291bnRpbmcgY2hlY2sgYWZ0ZXIKLQkgKiBoYXZpbmcgcmVtb3ZlZCB0aGUgcGFnZSBlbnRpcmVseS4KKwkgKiBUaGlzIGZpeGVzIGRpcnR5IGFjY291bnRpbmcgYWZ0ZXIgcmVtb3ZpbmcgdGhlIHBhZ2UgZW50aXJlbHkgYnV0CisJICogbGVhdmVzIFBhZ2VEaXJ0eSBzZXQ6IGl0IGhhcyBubyBlZmZlY3QgZm9yIHRydW5jYXRlZCBwYWdlIGFuZAorCSAqIGFueXdheSB3aWxsIGJlIGNsZWFyZWQgYmVmb3JlIHJldHVybmluZyBwYWdlIGludG8gYnVkZHkgYWxsb2NhdG9yLgogCSAqLwotCWlmIChQYWdlRGlydHkocGFnZSkgJiYgbWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkgewotCQlkZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX0ZJTEVfRElSVFkpOwotCQlkZWNfYmRpX3N0YXQoaW5vZGVfdG9fYmRpKG1hcHBpbmctPmhvc3QpLCBCRElfUkVDTEFJTUFCTEUpOwotCX0KKwlpZiAoV0FSTl9PTl9PTkNFKFBhZ2VEaXJ0eShwYWdlKSkpCisJCWFjY291bnRfcGFnZV9jbGVhbmVkKHBhZ2UsIG1hcHBpbmcpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL21tL2d1cC5jIGIvbW0vZ3VwLmMKaW5kZXggYTZlMjRlMi4uNjI5N2Y2YiAxMDA2NDQKLS0tIGEvbW0vZ3VwLmMKKysrIGIvbW0vZ3VwLmMKQEAgLTkyLDcgKzkyLDcgQEAKIAkJICovCiAJCW1hcmtfcGFnZV9hY2Nlc3NlZChwYWdlKTsKIAl9Ci0JaWYgKChmbGFncyAmIEZPTExfTUxPQ0spICYmICh2bWEtPnZtX2ZsYWdzICYgVk1fTE9DS0VEKSkgeworCWlmICgoZmxhZ3MgJiBGT0xMX1BPUFVMQVRFKSAmJiAodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkpIHsKIAkJLyoKIAkJICogVGhlIHByZWxpbWluYXJ5IG1hcHBpbmcgY2hlY2sgaXMgbWFpbmx5IHRvIGF2b2lkIHRoZQogCQkgKiBwb2ludGxlc3Mgb3ZlcmhlYWQgb2YgbG9ja19wYWdlIG9uIHRoZSBaRVJPX1BBR0UKQEAgLTI2NSw4ICsyNjUsOCBAQAogCXVuc2lnbmVkIGludCBmYXVsdF9mbGFncyA9IDA7CiAJaW50IHJldDsKIAotCS8qIEZvciBtbG9jaywganVzdCBza2lwIHRoZSBzdGFjayBndWFyZCBwYWdlLiAqLwotCWlmICgoKmZsYWdzICYgRk9MTF9NTE9DSykgJiYKKwkvKiBGb3IgbW1fcG9wdWxhdGUoKSwganVzdCBza2lwIHRoZSBzdGFjayBndWFyZCBwYWdlLiAqLworCWlmICgoKmZsYWdzICYgRk9MTF9QT1BVTEFURSkgJiYKIAkJCShzdGFja19ndWFyZF9wYWdlX3N0YXJ0KHZtYSwgYWRkcmVzcykgfHwKIAkJCSBzdGFja19ndWFyZF9wYWdlX2VuZCh2bWEsIGFkZHJlc3MgKyBQQUdFX1NJWkUpKSkKIAkJcmV0dXJuIC1FTk9FTlQ7CkBAIC04MTksNiArODE5LDEyNCBAQAogRVhQT1JUX1NZTUJPTChnZXRfdXNlcl9wYWdlcyk7CiAKIC8qKgorICogcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UoKSAtICBwb3B1bGF0ZSBhIHJhbmdlIG9mIHBhZ2VzIGluIHRoZSB2bWEuCisgKiBAdm1hOiAgIHRhcmdldCB2bWEKKyAqIEBzdGFydDogc3RhcnQgYWRkcmVzcworICogQGVuZDogICBlbmQgYWRkcmVzcworICogQG5vbmJsb2NraW5nOgorICoKKyAqIFRoaXMgdGFrZXMgY2FyZSBvZiBtbG9ja2luZyB0aGUgcGFnZXMgdG9vIGlmIFZNX0xPQ0tFRCBpcyBzZXQuCisgKgorICogcmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvci4KKyAqCisgKiB2bWEtPnZtX21tLT5tbWFwX3NlbSBtdXN0IGJlIGhlbGQuCisgKgorICogSWYgQG5vbmJsb2NraW5nIGlzIE5VTEwsIGl0IG1heSBiZSBoZWxkIGZvciByZWFkIG9yIHdyaXRlIGFuZCB3aWxsCisgKiBiZSB1bnBlcnR1cmJlZC4KKyAqCisgKiBJZiBAbm9uYmxvY2tpbmcgaXMgbm9uLU5VTEwsIGl0IG11c3QgaGVsZCBmb3IgcmVhZCBvbmx5IGFuZCBtYXkgYmUKKyAqIHJlbGVhc2VkLiAgSWYgaXQncyByZWxlYXNlZCwgKkBub25ibG9ja2luZyB3aWxsIGJlIHNldCB0byAwLgorICovCitsb25nIHBvcHVsYXRlX3ZtYV9wYWdlX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50ICpub25ibG9ja2luZykKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07CisJdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IChlbmQgLSBzdGFydCkgLyBQQUdFX1NJWkU7CisJaW50IGd1cF9mbGFnczsKKworCVZNX0JVR19PTihzdGFydCAmIH5QQUdFX01BU0spOworCVZNX0JVR19PTihlbmQgICAmIH5QQUdFX01BU0spOworCVZNX0JVR19PTl9WTUEoc3RhcnQgPCB2bWEtPnZtX3N0YXJ0LCB2bWEpOworCVZNX0JVR19PTl9WTUEoZW5kICAgPiB2bWEtPnZtX2VuZCwgdm1hKTsKKwlWTV9CVUdfT05fTU0oIXJ3c2VtX2lzX2xvY2tlZCgmbW0tPm1tYXBfc2VtKSwgbW0pOworCisJZ3VwX2ZsYWdzID0gRk9MTF9UT1VDSCB8IEZPTExfUE9QVUxBVEU7CisJLyoKKwkgKiBXZSB3YW50IHRvIHRvdWNoIHdyaXRhYmxlIG1hcHBpbmdzIHdpdGggYSB3cml0ZSBmYXVsdCBpbiBvcmRlcgorCSAqIHRvIGJyZWFrIENPVywgZXhjZXB0IGZvciBzaGFyZWQgbWFwcGluZ3MgYmVjYXVzZSB0aGVzZSBkb24ndCBDT1cKKwkgKiBhbmQgd2Ugd291bGQgbm90IHdhbnQgdG8gZGlydHkgdGhlbSBmb3Igbm90aGluZy4KKwkgKi8KKwlpZiAoKHZtYS0+dm1fZmxhZ3MgJiAoVk1fV1JJVEUgfCBWTV9TSEFSRUQpKSA9PSBWTV9XUklURSkKKwkJZ3VwX2ZsYWdzIHw9IEZPTExfV1JJVEU7CisKKwkvKgorCSAqIFdlIHdhbnQgbWxvY2sgdG8gc3VjY2VlZCBmb3IgcmVnaW9ucyB0aGF0IGhhdmUgYW55IHBlcm1pc3Npb25zCisJICogb3RoZXIgdGhhbiBQUk9UX05PTkUuCisJICovCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiAoVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQykpCisJCWd1cF9mbGFncyB8PSBGT0xMX0ZPUkNFOworCisJLyoKKwkgKiBXZSBtYWRlIHN1cmUgYWRkciBpcyB3aXRoaW4gYSBWTUEsIHNvIHRoZSBmb2xsb3dpbmcgd2lsbAorCSAqIG5vdCByZXN1bHQgaW4gYSBzdGFjayBleHBhbnNpb24gdGhhdCByZWN1cnNlcyBiYWNrIGhlcmUuCisJICovCisJcmV0dXJuIF9fZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgbW0sIHN0YXJ0LCBucl9wYWdlcywgZ3VwX2ZsYWdzLAorCQkJCU5VTEwsIE5VTEwsIG5vbmJsb2NraW5nKTsKK30KKworLyoKKyAqIF9fbW1fcG9wdWxhdGUgLSBwb3B1bGF0ZSBhbmQvb3IgbWxvY2sgcGFnZXMgd2l0aGluIGEgcmFuZ2Ugb2YgYWRkcmVzcyBzcGFjZS4KKyAqCisgKiBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IG1sb2NrKCkgYW5kIHRoZSBNQVBfUE9QVUxBVEUgLyBNQVBfTE9DS0VEIG1tYXAKKyAqIGZsYWdzLiBWTUFzIG11c3QgYmUgYWxyZWFkeSBtYXJrZWQgd2l0aCB0aGUgZGVzaXJlZCB2bV9mbGFncywgYW5kCisgKiBtbWFwX3NlbSBtdXN0IG5vdCBiZSBoZWxkLgorICovCitpbnQgX19tbV9wb3B1bGF0ZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGxlbiwgaW50IGlnbm9yZV9lcnJvcnMpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwl1bnNpZ25lZCBsb25nIGVuZCwgbnN0YXJ0LCBuZW5kOworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hID0gTlVMTDsKKwlpbnQgbG9ja2VkID0gMDsKKwlsb25nIHJldCA9IDA7CisKKwlWTV9CVUdfT04oc3RhcnQgJiB+UEFHRV9NQVNLKTsKKwlWTV9CVUdfT04obGVuICE9IFBBR0VfQUxJR04obGVuKSk7CisJZW5kID0gc3RhcnQgKyBsZW47CisKKwlmb3IgKG5zdGFydCA9IHN0YXJ0OyBuc3RhcnQgPCBlbmQ7IG5zdGFydCA9IG5lbmQpIHsKKwkJLyoKKwkJICogV2Ugd2FudCB0byBmYXVsdCBpbiBwYWdlcyBmb3IgW25zdGFydDsgZW5kKSBhZGRyZXNzIHJhbmdlLgorCQkgKiBGaW5kIGZpcnN0IGNvcnJlc3BvbmRpbmcgVk1BLgorCQkgKi8KKwkJaWYgKCFsb2NrZWQpIHsKKwkJCWxvY2tlZCA9IDE7CisJCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7CisJCQl2bWEgPSBmaW5kX3ZtYShtbSwgbnN0YXJ0KTsKKwkJfSBlbHNlIGlmIChuc3RhcnQgPj0gdm1hLT52bV9lbmQpCisJCQl2bWEgPSB2bWEtPnZtX25leHQ7CisJCWlmICghdm1hIHx8IHZtYS0+dm1fc3RhcnQgPj0gZW5kKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIFNldCBbbnN0YXJ0OyBuZW5kKSB0byBpbnRlcnNlY3Rpb24gb2YgZGVzaXJlZCBhZGRyZXNzCisJCSAqIHJhbmdlIHdpdGggdGhlIGZpcnN0IFZNQS4gQWxzbywgc2tpcCB1bmRlc2lyYWJsZSBWTUEgdHlwZXMuCisJCSAqLworCQluZW5kID0gbWluKGVuZCwgdm1hLT52bV9lbmQpOworCQlpZiAodm1hLT52bV9mbGFncyAmIChWTV9JTyB8IFZNX1BGTk1BUCkpCisJCQljb250aW51ZTsKKwkJaWYgKG5zdGFydCA8IHZtYS0+dm1fc3RhcnQpCisJCQluc3RhcnQgPSB2bWEtPnZtX3N0YXJ0OworCQkvKgorCQkgKiBOb3cgZmF1bHQgaW4gYSByYW5nZSBvZiBwYWdlcy4gcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UoKQorCQkgKiBkb3VibGUgY2hlY2tzIHRoZSB2bWEgZmxhZ3MsIHNvIHRoYXQgaXQgd29uJ3QgbWxvY2sgcGFnZXMKKwkJICogaWYgdGhlIHZtYSB3YXMgYWxyZWFkeSBtdW5sb2NrZWQuCisJCSAqLworCQlyZXQgPSBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSh2bWEsIG5zdGFydCwgbmVuZCwgJmxvY2tlZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAoaWdub3JlX2Vycm9ycykgeworCQkJCXJldCA9IDA7CisJCQkJY29udGludWU7CS8qIGNvbnRpbnVlIGF0IG5leHQgVk1BICovCisJCQl9CisJCQlicmVhazsKKwkJfQorCQluZW5kID0gbnN0YXJ0ICsgcmV0ICogUEFHRV9TSVpFOworCQlyZXQgPSAwOworCX0KKwlpZiAobG9ja2VkKQorCQl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOworCXJldHVybiByZXQ7CS8qIDAgb3IgbmVnYXRpdmUgZXJyb3IgY29kZSAqLworfQorCisvKioKICAqIGdldF9kdW1wX3BhZ2UoKSAtIHBpbiB1c2VyIHBhZ2UgaW4gbWVtb3J5IHdoaWxlIHdyaXRpbmcgaXQgdG8gY29yZSBkdW1wCiAgKiBAYWRkcjogdXNlciBhZGRyZXNzCiAgKgpAQCAtOTAxLDcgKzEwMTksNyBAQAogCQkgKgogCQkgKiBmb3IgYW4gZXhhbXBsZSBzZWUgZ3VwX2dldF9wdGUgaW4gYXJjaC94ODYvbW0vZ3VwLmMKIAkJICovCi0JCXB0ZV90IHB0ZSA9IEFDQ0VTU19PTkNFKCpwdGVwKTsKKwkJcHRlX3QgcHRlID0gUkVBRF9PTkNFKCpwdGVwKTsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAKIAkJLyoKQEAgLTExOTEsNyArMTMwOSw3IEBACiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCXBnZHAgPSBwZ2Rfb2Zmc2V0KG1tLCBhZGRyKTsKIAlkbyB7Ci0JCXBnZF90IHBnZCA9IEFDQ0VTU19PTkNFKCpwZ2RwKTsKKwkJcGdkX3QgcGdkID0gUkVBRF9PTkNFKCpwZ2RwKTsKIAogCQluZXh0ID0gcGdkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CiAJCWlmIChwZ2Rfbm9uZShwZ2QpKQpkaWZmIC0tZ2l0IGEvbW0vaHVnZV9tZW1vcnkuYyBiL21tL2h1Z2VfbWVtb3J5LmMKaW5kZXggNjI2ZTkzZC4uMDc4ODMyYyAxMDA2NDQKLS0tIGEvbW0vaHVnZV9tZW1vcnkuYworKysgYi9tbS9odWdlX21lbW9yeS5jCkBAIC02Nyw2ICs2Nyw3IEBACiAKIHN0YXRpYyBpbnQga2h1Z2VwYWdlZCh2b2lkICpub25lKTsKIHN0YXRpYyBpbnQga2h1Z2VwYWdlZF9zbGFiX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBraHVnZXBhZ2VkX3NsYWJfZXhpdCh2b2lkKTsKIAogI2RlZmluZSBNTV9TTE9UU19IQVNIX0JJVFMgMTAKIHN0YXRpYyBfX3JlYWRfbW9zdGx5IERFRklORV9IQVNIVEFCTEUobW1fc2xvdHNfaGFzaCwgTU1fU0xPVFNfSEFTSF9CSVRTKTsKQEAgLTEwOSw5ICsxMTAsNiBAQAogCWludCBucl96b25lcyA9IDA7CiAJdW5zaWduZWQgbG9uZyByZWNvbW1lbmRlZF9taW47CiAKLQlpZiAoIWtodWdlcGFnZWRfZW5hYmxlZCgpKQotCQlyZXR1cm4gMDsKLQogCWZvcl9lYWNoX3BvcHVsYXRlZF96b25lKHpvbmUpCiAJCW5yX3pvbmVzKys7CiAKQEAgLTE0Myw5ICsxNDEsOCBAQAogCXNldHVwX3Blcl96b25lX3dtYXJrcygpOwogCXJldHVybiAwOwogfQotbGF0ZV9pbml0Y2FsbChzZXRfcmVjb21tZW5kZWRfbWluX2ZyZWVfa2J5dGVzKTsKIAotc3RhdGljIGludCBzdGFydF9raHVnZXBhZ2VkKHZvaWQpCitzdGF0aWMgaW50IHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZCh2b2lkKQogewogCWludCBlcnIgPSAwOwogCWlmIChraHVnZXBhZ2VkX2VuYWJsZWQoKSkgewpAQCAtMTU2LDYgKzE1Myw3IEBACiAJCQlwcl9lcnIoImtodWdlcGFnZWQ6IGt0aHJlYWRfcnVuKGtodWdlcGFnZWQpIGZhaWxlZFxuIik7CiAJCQllcnIgPSBQVFJfRVJSKGtodWdlcGFnZWRfdGhyZWFkKTsKIAkJCWtodWdlcGFnZWRfdGhyZWFkID0gTlVMTDsKKwkJCWdvdG8gZmFpbDsKIAkJfQogCiAJCWlmICghbGlzdF9lbXB0eSgma2h1Z2VwYWdlZF9zY2FuLm1tX2hlYWQpKQpAQCAtMTY2LDcgKzE2NCw3IEBACiAJCWt0aHJlYWRfc3RvcChraHVnZXBhZ2VkX3RocmVhZCk7CiAJCWtodWdlcGFnZWRfdGhyZWFkID0gTlVMTDsKIAl9Ci0KK2ZhaWw6CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTgzLDcgKzE4MSw3IEBACiAJc3RydWN0IHBhZ2UgKnplcm9fcGFnZTsKIHJldHJ5OgogCWlmIChsaWtlbHkoYXRvbWljX2luY19ub3RfemVybygmaHVnZV96ZXJvX3JlZmNvdW50KSkpCi0JCXJldHVybiBBQ0NFU1NfT05DRShodWdlX3plcm9fcGFnZSk7CisJCXJldHVybiBSRUFEX09OQ0UoaHVnZV96ZXJvX3BhZ2UpOwogCiAJemVyb19wYWdlID0gYWxsb2NfcGFnZXMoKEdGUF9UUkFOU0hVR0UgfCBfX0dGUF9aRVJPKSAmIH5fX0dGUF9NT1ZBQkxFLAogCQkJSFBBR0VfUE1EX09SREVSKTsKQEAgLTIwMiw3ICsyMDAsNyBAQAogCS8qIFdlIHRha2UgYWRkaXRpb25hbCByZWZlcmVuY2UgaGVyZS4gSXQgd2lsbCBiZSBwdXQgYmFjayBieSBzaHJpbmtlciAqLwogCWF0b21pY19zZXQoJmh1Z2VfemVyb19yZWZjb3VudCwgMik7CiAJcHJlZW1wdF9lbmFibGUoKTsKLQlyZXR1cm4gQUNDRVNTX09OQ0UoaHVnZV96ZXJvX3BhZ2UpOworCXJldHVybiBSRUFEX09OQ0UoaHVnZV96ZXJvX3BhZ2UpOwogfQogCiBzdGF0aWMgdm9pZCBwdXRfaHVnZV96ZXJvX3BhZ2Uodm9pZCkKQEAgLTMwMCw3ICsyOTgsNyBAQAogCQlpbnQgZXJyOwogCiAJCW11dGV4X2xvY2soJmtodWdlcGFnZWRfbXV0ZXgpOwotCQllcnIgPSBzdGFydF9raHVnZXBhZ2VkKCk7CisJCWVyciA9IHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZCgpOwogCQltdXRleF91bmxvY2soJmtodWdlcGFnZWRfbXV0ZXgpOwogCiAJCWlmIChlcnIpCkBAIC02MzQsMjcgKzYzMiwzOCBAQAogCiAJZXJyID0gaHVnZXBhZ2VfaW5pdF9zeXNmcygmaHVnZXBhZ2Vfa29iaik7CiAJaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwkJZ290byBlcnJfc3lzZnM7CiAKIAllcnIgPSBraHVnZXBhZ2VkX3NsYWJfaW5pdCgpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0OworCQlnb3RvIGVycl9zbGFiOwogCi0JcmVnaXN0ZXJfc2hyaW5rZXIoJmh1Z2VfemVyb19wYWdlX3Nocmlua2VyKTsKKwllcnIgPSByZWdpc3Rlcl9zaHJpbmtlcigmaHVnZV96ZXJvX3BhZ2Vfc2hyaW5rZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2h6cF9zaHJpbmtlcjsKIAogCS8qCiAJICogQnkgZGVmYXVsdCBkaXNhYmxlIHRyYW5zcGFyZW50IGh1Z2VwYWdlcyBvbiBzbWFsbGVyIHN5c3RlbXMsCiAJICogd2hlcmUgdGhlIGV4dHJhIG1lbW9yeSB1c2VkIGNvdWxkIGh1cnQgbW9yZSB0aGFuIFRMQiBvdmVyaGVhZAogCSAqIGlzIGxpa2VseSB0byBzYXZlLiAgVGhlIGFkbWluIGNhbiBzdGlsbCBlbmFibGUgaXQgdGhyb3VnaCAvc3lzLgogCSAqLwotCWlmICh0b3RhbHJhbV9wYWdlcyA8ICg1MTIgPDwgKDIwIC0gUEFHRV9TSElGVCkpKQorCWlmICh0b3RhbHJhbV9wYWdlcyA8ICg1MTIgPDwgKDIwIC0gUEFHRV9TSElGVCkpKSB7CiAJCXRyYW5zcGFyZW50X2h1Z2VwYWdlX2ZsYWdzID0gMDsKKwkJcmV0dXJuIDA7CisJfQogCi0Jc3RhcnRfa2h1Z2VwYWdlZCgpOworCWVyciA9IHN0YXJ0X3N0b3Bfa2h1Z2VwYWdlZCgpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2todWdlcGFnZWQ7CiAKIAlyZXR1cm4gMDsKLW91dDoKK2Vycl9raHVnZXBhZ2VkOgorCXVucmVnaXN0ZXJfc2hyaW5rZXIoJmh1Z2VfemVyb19wYWdlX3Nocmlua2VyKTsKK2Vycl9oenBfc2hyaW5rZXI6CisJa2h1Z2VwYWdlZF9zbGFiX2V4aXQoKTsKK2Vycl9zbGFiOgogCWh1Z2VwYWdlX2V4aXRfc3lzZnMoaHVnZXBhZ2Vfa29iaik7CitlcnJfc3lzZnM6CiAJcmV0dXJuIGVycjsKIH0KIHN1YnN5c19pbml0Y2FsbChodWdlcGFnZV9pbml0KTsKQEAgLTcwOCw3ICs3MTcsNyBAQAogc3RhdGljIGludCBfX2RvX2h1Z2VfcG1kX2Fub255bW91c19wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJCQkJdW5zaWduZWQgbG9uZyBoYWRkciwgcG1kX3QgKnBtZCwKLQkJCQkJc3RydWN0IHBhZ2UgKnBhZ2UpCisJCQkJCXN0cnVjdCBwYWdlICpwYWdlLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOwogCXBndGFibGVfdCBwZ3RhYmxlOwpAQCAtNzE2LDcgKzcyNSw3IEBACiAKIAlWTV9CVUdfT05fUEFHRSghUGFnZUNvbXBvdW5kKHBhZ2UpLCBwYWdlKTsKIAotCWlmIChtZW1fY2dyb3VwX3RyeV9jaGFyZ2UocGFnZSwgbW0sIEdGUF9UUkFOU0hVR0UsICZtZW1jZykpCisJaWYgKG1lbV9jZ3JvdXBfdHJ5X2NoYXJnZShwYWdlLCBtbSwgZ2ZwLCAmbWVtY2cpKQogCQlyZXR1cm4gVk1fRkFVTFRfT09NOwogCiAJcGd0YWJsZSA9IHB0ZV9hbGxvY19vbmUobW0sIGhhZGRyKTsKQEAgLTgyMiw3ICs4MzEsNyBAQAogCQljb3VudF92bV9ldmVudChUSFBfRkFVTFRfRkFMTEJBQ0spOwogCQlyZXR1cm4gVk1fRkFVTFRfRkFMTEJBQ0s7CiAJfQotCWlmICh1bmxpa2VseShfX2RvX2h1Z2VfcG1kX2Fub255bW91c19wYWdlKG1tLCB2bWEsIGhhZGRyLCBwbWQsIHBhZ2UpKSkgeworCWlmICh1bmxpa2VseShfX2RvX2h1Z2VfcG1kX2Fub255bW91c19wYWdlKG1tLCB2bWEsIGhhZGRyLCBwbWQsIHBhZ2UsIGdmcCkpKSB7CiAJCXB1dF9wYWdlKHBhZ2UpOwogCQljb3VudF92bV9ldmVudChUSFBfRkFVTFRfRkFMTEJBQ0spOwogCQlyZXR1cm4gVk1fRkFVTFRfRkFMTEJBQ0s7CkBAIC0xMDgwLDYgKzEwODksNyBAQAogCXVuc2lnbmVkIGxvbmcgaGFkZHI7CiAJdW5zaWduZWQgbG9uZyBtbXVuX3N0YXJ0OwkvKiBGb3IgbW11X25vdGlmaWVycyAqLwogCXVuc2lnbmVkIGxvbmcgbW11bl9lbmQ7CQkvKiBGb3IgbW11X25vdGlmaWVycyAqLworCWdmcF90IGh1Z2VfZ2ZwOwkJCS8qIGZvciBhbGxvY2F0aW9uIGFuZCBjaGFyZ2UgKi8KIAogCXB0bCA9IHBtZF9sb2NrcHRyKG1tLCBwbWQpOwogCVZNX0JVR19PTl9WTUEoIXZtYS0+YW5vbl92bWEsIHZtYSk7CkBAIC0xMTA2LDEwICsxMTE2LDggQEAKIGFsbG9jOgogCWlmICh0cmFuc3BhcmVudF9odWdlcGFnZV9lbmFibGVkKHZtYSkgJiYKIAkgICAgIXRyYW5zcGFyZW50X2h1Z2VwYWdlX2RlYnVnX2NvdygpKSB7Ci0JCWdmcF90IGdmcDsKLQotCQlnZnAgPSBhbGxvY19odWdlcGFnZV9nZnBtYXNrKHRyYW5zcGFyZW50X2h1Z2VwYWdlX2RlZnJhZyh2bWEpLCAwKTsKLQkJbmV3X3BhZ2UgPSBhbGxvY19odWdlcGFnZV92bWEoZ2ZwLCB2bWEsIGhhZGRyLCBIUEFHRV9QTURfT1JERVIpOworCQlodWdlX2dmcCA9IGFsbG9jX2h1Z2VwYWdlX2dmcG1hc2sodHJhbnNwYXJlbnRfaHVnZXBhZ2VfZGVmcmFnKHZtYSksIDApOworCQluZXdfcGFnZSA9IGFsbG9jX2h1Z2VwYWdlX3ZtYShodWdlX2dmcCwgdm1hLCBoYWRkciwgSFBBR0VfUE1EX09SREVSKTsKIAl9IGVsc2UKIAkJbmV3X3BhZ2UgPSBOVUxMOwogCkBAIC0xMTMwLDggKzExMzgsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAodW5saWtlbHkobWVtX2Nncm91cF90cnlfY2hhcmdlKG5ld19wYWdlLCBtbSwKLQkJCQkJICAgR0ZQX1RSQU5TSFVHRSwgJm1lbWNnKSkpIHsKKwlpZiAodW5saWtlbHkobWVtX2Nncm91cF90cnlfY2hhcmdlKG5ld19wYWdlLCBtbSwgaHVnZV9nZnAsICZtZW1jZykpKSB7CiAJCXB1dF9wYWdlKG5ld19wYWdlKTsKIAkJaWYgKHBhZ2UpIHsKIAkJCXNwbGl0X2h1Z2VfcGFnZShwYWdlKTsKQEAgLTEyMzEsNyArMTIzOCw3IEBACiAJCQkJCSAgcG1kLCBfcG1kLCAgMSkpCiAJCQl1cGRhdGVfbW11X2NhY2hlX3BtZCh2bWEsIGFkZHIsIHBtZCk7CiAJfQotCWlmICgoZmxhZ3MgJiBGT0xMX01MT0NLKSAmJiAodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkpIHsKKwlpZiAoKGZsYWdzICYgRk9MTF9QT1BVTEFURSkgJiYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpKSB7CiAJCWlmIChwYWdlLT5tYXBwaW5nICYmIHRyeWxvY2tfcGFnZShwYWdlKSkgewogCQkJbHJ1X2FkZF9kcmFpbigpOwogCQkJaWYgKHBhZ2UtPm1hcHBpbmcpCkBAIC0xMjYwLDYgKzEyNjcsNyBAQAogCWludCB0YXJnZXRfbmlkLCBsYXN0X2NwdXBpZCA9IC0xOwogCWJvb2wgcGFnZV9sb2NrZWQ7CiAJYm9vbCBtaWdyYXRlZCA9IGZhbHNlOworCWJvb2wgd2FzX3dyaXRhYmxlOwogCWludCBmbGFncyA9IDA7CiAKIAkvKiBBIFBST1RfTk9ORSBmYXVsdCBzaG91bGQgbm90IGVuZCB1cCBoZXJlICovCkBAIC0xMjkxLDE3ICsxMjk5LDggQEAKIAkJZmxhZ3MgfD0gVE5GX0ZBVUxUX0xPQ0FMOwogCX0KIAotCS8qCi0JICogQXZvaWQgZ3JvdXBpbmcgb24gRFNPL0NPVyBwYWdlcyBpbiBzcGVjaWZpYyBhbmQgUk8gcGFnZXMKLQkgKiBpbiBnZW5lcmFsLCBSTyBwYWdlcyBzaG91bGRuJ3QgaHVydCBhcyBtdWNoIGFueXdheSBzaW5jZQotCSAqIHRoZXkgY2FuIGJlIGluIHNoYXJlZCBjYWNoZSBzdGF0ZS4KLQkgKgotCSAqIEZJWE1FISBUaGlzIGNoZWNrcyAicG1kX2RpcnR5KCkiIGFzIGFuIGFwcHJveGltYXRpb24gb2YKLQkgKiAiaXMgdGhpcyBhIHJlYWQtb25seSBwYWdlIiwgc2luY2UgY2hlY2tpbmcgInBtZF93cml0ZSgpIgotCSAqIGlzIGV2ZW4gbW9yZSBicm9rZW4uIFdlIGhhdmVuJ3QgYWN0dWFsbHkgdHVybmVkIHRoaXMgaW50bwotCSAqIGEgd3JpdGFibGUgcGFnZSwgc28gcG1kX3dyaXRlKCkgd2lsbCBhbHdheXMgYmUgZmFsc2UuCi0JICovCi0JaWYgKCFwbWRfZGlydHkocG1kKSkKKwkvKiBTZWUgc2ltaWxhciBjb21tZW50IGluIGRvX251bWFfcGFnZSBmb3IgZXhwbGFuYXRpb24gKi8KKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQogCQlmbGFncyB8PSBUTkZfTk9fR1JPVVA7CiAKIAkvKgpAQCAtMTM1OCwxMiArMTM1NywxNyBAQAogCWlmIChtaWdyYXRlZCkgewogCQlmbGFncyB8PSBUTkZfTUlHUkFURUQ7CiAJCXBhZ2VfbmlkID0gdGFyZ2V0X25pZDsKLQl9CisJfSBlbHNlCisJCWZsYWdzIHw9IFRORl9NSUdSQVRFX0ZBSUw7CiAKIAlnb3RvIG91dDsKIGNsZWFyX3BtZG51bWE6CiAJQlVHX09OKCFQYWdlTG9ja2VkKHBhZ2UpKTsKKwl3YXNfd3JpdGFibGUgPSBwbWRfd3JpdGUocG1kKTsKIAlwbWQgPSBwbWRfbW9kaWZ5KHBtZCwgdm1hLT52bV9wYWdlX3Byb3QpOworCXBtZCA9IHBtZF9ta3lvdW5nKHBtZCk7CisJaWYgKHdhc193cml0YWJsZSkKKwkJcG1kID0gcG1kX21rd3JpdGUocG1kKTsKIAlzZXRfcG1kX2F0KG1tLCBoYWRkciwgcG1kcCwgcG1kKTsKIAl1cGRhdGVfbW11X2NhY2hlX3BtZCh2bWEsIGFkZHIsIHBtZHApOwogCXVubG9ja19wYWdlKHBhZ2UpOwpAQCAtMTQ4Nyw2ICsxNDkxLDcgQEAKIAogCWlmIChfX3BtZF90cmFuc19odWdlX2xvY2socG1kLCB2bWEsICZwdGwpID09IDEpIHsKIAkJcG1kX3QgZW50cnk7CisJCWJvb2wgcHJlc2VydmVfd3JpdGUgPSBwcm90X251bWEgJiYgcG1kX3dyaXRlKCpwbWQpOwogCQlyZXQgPSAxOwogCiAJCS8qCkBAIC0xNTAyLDkgKzE1MDcsMTEgQEAKIAkJaWYgKCFwcm90X251bWEgfHwgIXBtZF9wcm90bm9uZSgqcG1kKSkgewogCQkJZW50cnkgPSBwbWRwX2dldF9hbmRfY2xlYXJfbm90aWZ5KG1tLCBhZGRyLCBwbWQpOwogCQkJZW50cnkgPSBwbWRfbW9kaWZ5KGVudHJ5LCBuZXdwcm90KTsKKwkJCWlmIChwcmVzZXJ2ZV93cml0ZSkKKwkJCQllbnRyeSA9IHBtZF9ta3dyaXRlKGVudHJ5KTsKIAkJCXJldCA9IEhQQUdFX1BNRF9OUjsKIAkJCXNldF9wbWRfYXQobW0sIGFkZHIsIHBtZCwgZW50cnkpOwotCQkJQlVHX09OKHBtZF93cml0ZShlbnRyeSkpOworCQkJQlVHX09OKCFwcmVzZXJ2ZV93cml0ZSAmJiBwbWRfd3JpdGUoZW50cnkpKTsKIAkJfQogCQlzcGluX3VubG9jayhwdGwpOwogCX0KQEAgLTE5NzYsNiArMTk4MywxMSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBfX2luaXQga2h1Z2VwYWdlZF9zbGFiX2V4aXQodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3kobW1fc2xvdF9jYWNoZSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1tX3Nsb3QgKmFsbG9jX21tX3Nsb3Qodm9pZCkKIHsKIAlpZiAoIW1tX3Nsb3RfY2FjaGUpCS8qIGluaXRpYWxpemF0aW9uIGZhaWxlZCAqLwpAQCAtMjEwOSw3ICsyMTIxLDcgQEAKIHsKIAl3aGlsZSAoLS1fcHRlID49IHB0ZSkgewogCQlwdGVfdCBwdGV2YWwgPSAqX3B0ZTsKLQkJaWYgKCFwdGVfbm9uZShwdGV2YWwpKQorCQlpZiAoIXB0ZV9ub25lKHB0ZXZhbCkgJiYgIWlzX3plcm9fcGZuKHB0ZV9wZm4ocHRldmFsKSkpCiAJCQlyZWxlYXNlX3B0ZV9wYWdlKHB0ZV9wYWdlKHB0ZXZhbCkpOwogCX0KIH0KQEAgLTIxMjAsMTMgKzIxMzIsMTMgQEAKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAlwdGVfdCAqX3B0ZTsKLQlpbnQgbm9uZSA9IDA7CisJaW50IG5vbmVfb3JfemVybyA9IDA7CiAJYm9vbCByZWZlcmVuY2VkID0gZmFsc2UsIHdyaXRhYmxlID0gZmFsc2U7CiAJZm9yIChfcHRlID0gcHRlOyBfcHRlIDwgcHRlK0hQQUdFX1BNRF9OUjsKIAkgICAgIF9wdGUrKywgYWRkcmVzcyArPSBQQUdFX1NJWkUpIHsKIAkJcHRlX3QgcHRldmFsID0gKl9wdGU7Ci0JCWlmIChwdGVfbm9uZShwdGV2YWwpKSB7Ci0JCQlpZiAoKytub25lIDw9IGtodWdlcGFnZWRfbWF4X3B0ZXNfbm9uZSkKKwkJaWYgKHB0ZV9ub25lKHB0ZXZhbCkgfHwgaXNfemVyb19wZm4ocHRlX3BmbihwdGV2YWwpKSkgeworCQkJaWYgKCsrbm9uZV9vcl96ZXJvIDw9IGtodWdlcGFnZWRfbWF4X3B0ZXNfbm9uZSkKIAkJCQljb250aW51ZTsKIAkJCWVsc2UKIAkJCQlnb3RvIG91dDsKQEAgLTIyMDcsOSArMjIxOSwyMSBAQAogCQlwdGVfdCBwdGV2YWwgPSAqX3B0ZTsKIAkJc3RydWN0IHBhZ2UgKnNyY19wYWdlOwogCi0JCWlmIChwdGVfbm9uZShwdGV2YWwpKSB7CisJCWlmIChwdGVfbm9uZShwdGV2YWwpIHx8IGlzX3plcm9fcGZuKHB0ZV9wZm4ocHRldmFsKSkpIHsKIAkJCWNsZWFyX3VzZXJfaGlnaHBhZ2UocGFnZSwgYWRkcmVzcyk7CiAJCQlhZGRfbW1fY291bnRlcih2bWEtPnZtX21tLCBNTV9BTk9OUEFHRVMsIDEpOworCQkJaWYgKGlzX3plcm9fcGZuKHB0ZV9wZm4ocHRldmFsKSkpIHsKKwkJCQkvKgorCQkJCSAqIHB0bCBtb3N0bHkgdW5uZWNlc3NhcnkuCisJCQkJICovCisJCQkJc3Bpbl9sb2NrKHB0bCk7CisJCQkJLyoKKwkJCQkgKiBwYXJhdmlydCBjYWxscyBpbnNpZGUgcHRlX2NsZWFyIGhlcmUgYXJlCisJCQkJICogc3VwZXJmbHVvdXMuCisJCQkJICovCisJCQkJcHRlX2NsZWFyKHZtYS0+dm1fbW0sIGFkZHJlc3MsIF9wdGUpOworCQkJCXNwaW5fdW5sb2NrKHB0bCk7CisJCQl9CiAJCX0gZWxzZSB7CiAJCQlzcmNfcGFnZSA9IHB0ZV9wYWdlKHB0ZXZhbCk7CiAJCQljb3B5X3VzZXJfaGlnaHBhZ2UocGFnZSwgc3JjX3BhZ2UsIGFkZHJlc3MsIHZtYSk7CkBAIC0yMzExLDggKzIzMzUsOCBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RydWN0IHBhZ2UKLSpraHVnZXBhZ2VkX2FsbG9jX3BhZ2Uoc3RydWN0IHBhZ2UgKipocGFnZSwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCitzdGF0aWMgc3RydWN0IHBhZ2UgKgora2h1Z2VwYWdlZF9hbGxvY19wYWdlKHN0cnVjdCBwYWdlICoqaHBhZ2UsIGdmcF90IGdmcCwgc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCSAgICAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkgICAgICAgaW50IG5vZGUpCiB7CkBAIC0yMzI2LDggKzIzNTAsNyBAQAogCSAqLwogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAKLQkqaHBhZ2UgPSBhbGxvY19wYWdlc19leGFjdF9ub2RlKG5vZGUsIGFsbG9jX2h1Z2VwYWdlX2dmcG1hc2soCi0JCWtodWdlcGFnZWRfZGVmcmFnKCksIF9fR0ZQX09USEVSX05PREUpLCBIUEFHRV9QTURfT1JERVIpOworCSpocGFnZSA9IGFsbG9jX3BhZ2VzX2V4YWN0X25vZGUobm9kZSwgZ2ZwLCBIUEFHRV9QTURfT1JERVIpOwogCWlmICh1bmxpa2VseSghKmhwYWdlKSkgewogCQljb3VudF92bV9ldmVudChUSFBfQ09MTEFQU0VfQUxMT0NfRkFJTEVEKTsKIAkJKmhwYWdlID0gRVJSX1BUUigtRU5PTUVNKTsKQEAgLTIzODAsMTMgKzI0MDMsMTQgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHN0cnVjdCBwYWdlCi0qa2h1Z2VwYWdlZF9hbGxvY19wYWdlKHN0cnVjdCBwYWdlICoqaHBhZ2UsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAorc3RhdGljIHN0cnVjdCBwYWdlICoKK2todWdlcGFnZWRfYWxsb2NfcGFnZShzdHJ1Y3QgcGFnZSAqKmhwYWdlLCBnZnBfdCBnZnAsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCQkgICAgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKIAkJICAgICAgIGludCBub2RlKQogewogCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7CiAJVk1fQlVHX09OKCEqaHBhZ2UpOworCiAJcmV0dXJuICAqaHBhZ2U7CiB9CiAjZW5kaWYKQEAgLTI0MjEsMTYgKzI0NDUsMjEgQEAKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CiAJdW5zaWduZWQgbG9uZyBtbXVuX3N0YXJ0OwkvKiBGb3IgbW11X25vdGlmaWVycyAqLwogCXVuc2lnbmVkIGxvbmcgbW11bl9lbmQ7CQkvKiBGb3IgbW11X25vdGlmaWVycyAqLworCWdmcF90IGdmcDsKIAogCVZNX0JVR19PTihhZGRyZXNzICYgfkhQQUdFX1BNRF9NQVNLKTsKIAorCS8qIE9ubHkgYWxsb2NhdGUgZnJvbSB0aGUgdGFyZ2V0IG5vZGUgKi8KKwlnZnAgPSBhbGxvY19odWdlcGFnZV9nZnBtYXNrKGtodWdlcGFnZWRfZGVmcmFnKCksIF9fR0ZQX09USEVSX05PREUpIHwKKwkJX19HRlBfVEhJU05PREU7CisKIAkvKiByZWxlYXNlIHRoZSBtbWFwX3NlbSByZWFkIGxvY2suICovCi0JbmV3X3BhZ2UgPSBraHVnZXBhZ2VkX2FsbG9jX3BhZ2UoaHBhZ2UsIG1tLCB2bWEsIGFkZHJlc3MsIG5vZGUpOworCW5ld19wYWdlID0ga2h1Z2VwYWdlZF9hbGxvY19wYWdlKGhwYWdlLCBnZnAsIG1tLCB2bWEsIGFkZHJlc3MsIG5vZGUpOwogCWlmICghbmV3X3BhZ2UpCiAJCXJldHVybjsKIAogCWlmICh1bmxpa2VseShtZW1fY2dyb3VwX3RyeV9jaGFyZ2UobmV3X3BhZ2UsIG1tLAotCQkJCQkgICBHRlBfVFJBTlNIVUdFLCAmbWVtY2cpKSkKKwkJCQkJICAgZ2ZwLCAmbWVtY2cpKSkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTI1NDMsNyArMjU3Miw3IEBACiB7CiAJcG1kX3QgKnBtZDsKIAlwdGVfdCAqcHRlLCAqX3B0ZTsKLQlpbnQgcmV0ID0gMCwgbm9uZSA9IDA7CisJaW50IHJldCA9IDAsIG5vbmVfb3JfemVybyA9IDA7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbG9uZyBfYWRkcmVzczsKIAlzcGlubG9ja190ICpwdGw7CkBAIC0yNTYxLDggKzI1OTAsOCBAQAogCWZvciAoX2FkZHJlc3MgPSBhZGRyZXNzLCBfcHRlID0gcHRlOyBfcHRlIDwgcHRlK0hQQUdFX1BNRF9OUjsKIAkgICAgIF9wdGUrKywgX2FkZHJlc3MgKz0gUEFHRV9TSVpFKSB7CiAJCXB0ZV90IHB0ZXZhbCA9ICpfcHRlOwotCQlpZiAocHRlX25vbmUocHRldmFsKSkgewotCQkJaWYgKCsrbm9uZSA8PSBraHVnZXBhZ2VkX21heF9wdGVzX25vbmUpCisJCWlmIChwdGVfbm9uZShwdGV2YWwpIHx8IGlzX3plcm9fcGZuKHB0ZV9wZm4ocHRldmFsKSkpIHsKKwkJCWlmICgrK25vbmVfb3JfemVybyA8PSBraHVnZXBhZ2VkX21heF9wdGVzX25vbmUpCiAJCQkJY29udGludWU7CiAJCQllbHNlCiAJCQkJZ290byBvdXRfdW5tYXA7CmRpZmYgLS1naXQgYS9tbS9odWdldGxiLmMgYi9tbS9odWdldGxiLmMKaW5kZXggYzQxYjJhMC4uMjcxZTQ0MyAxMDA2NDQKLS0tIGEvbW0vaHVnZXRsYi5jCisrKyBiL21tL2h1Z2V0bGIuYwpAQCAtNjEsNiArNjEsOSBAQAogc3RhdGljIGludCBudW1fZmF1bHRfbXV0ZXhlczsKIHN0YXRpYyBzdHJ1Y3QgbXV0ZXggKmh0bGJfZmF1bHRfbXV0ZXhfdGFibGUgX19fX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcDsKIAorLyogRm9yd2FyZCBkZWNsYXJhdGlvbiAqLworc3RhdGljIGludCBodWdldGxiX2FjY3RfbWVtb3J5KHN0cnVjdCBoc3RhdGUgKmgsIGxvbmcgZGVsdGEpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgdW5sb2NrX29yX3JlbGVhc2Vfc3VicG9vbChzdHJ1Y3QgaHVnZXBhZ2Vfc3VicG9vbCAqc3Bvb2wpCiB7CiAJYm9vbCBmcmVlID0gKHNwb29sLT5jb3VudCA9PSAwKSAmJiAoc3Bvb2wtPnVzZWRfaHBhZ2VzID09IDApOwpAQCAtNjgsMjMgKzcxLDM2IEBACiAJc3Bpbl91bmxvY2soJnNwb29sLT5sb2NrKTsKIAogCS8qIElmIG5vIHBhZ2VzIGFyZSB1c2VkLCBhbmQgbm8gb3RoZXIgaGFuZGxlcyB0byB0aGUgc3VicG9vbAotCSAqIHJlbWFpbiwgZnJlZSB0aGUgc3VicG9vbCB0aGUgc3VicG9vbCByZW1haW4gKi8KLQlpZiAoZnJlZSkKKwkgKiByZW1haW4sIGdpdmUgdXAgYW55IHJlc2VydmF0aW9ucyBtYXNlZCBvbiBtaW5pbXVtIHNpemUgYW5kCisJICogZnJlZSB0aGUgc3VicG9vbCAqLworCWlmIChmcmVlKSB7CisJCWlmIChzcG9vbC0+bWluX2hwYWdlcyAhPSAtMSkKKwkJCWh1Z2V0bGJfYWNjdF9tZW1vcnkoc3Bvb2wtPmhzdGF0ZSwKKwkJCQkJCS1zcG9vbC0+bWluX2hwYWdlcyk7CiAJCWtmcmVlKHNwb29sKTsKKwl9CiB9CiAKLXN0cnVjdCBodWdlcGFnZV9zdWJwb29sICpodWdlcGFnZV9uZXdfc3VicG9vbChsb25nIG5yX2Jsb2NrcykKK3N0cnVjdCBodWdlcGFnZV9zdWJwb29sICpodWdlcGFnZV9uZXdfc3VicG9vbChzdHJ1Y3QgaHN0YXRlICpoLCBsb25nIG1heF9ocGFnZXMsCisJCQkJCQlsb25nIG1pbl9ocGFnZXMpCiB7CiAJc3RydWN0IGh1Z2VwYWdlX3N1YnBvb2wgKnNwb29sOwogCi0Jc3Bvb2wgPSBrbWFsbG9jKHNpemVvZigqc3Bvb2wpLCBHRlBfS0VSTkVMKTsKKwlzcG9vbCA9IGt6YWxsb2Moc2l6ZW9mKCpzcG9vbCksIEdGUF9LRVJORUwpOwogCWlmICghc3Bvb2wpCiAJCXJldHVybiBOVUxMOwogCiAJc3Bpbl9sb2NrX2luaXQoJnNwb29sLT5sb2NrKTsKIAlzcG9vbC0+Y291bnQgPSAxOwotCXNwb29sLT5tYXhfaHBhZ2VzID0gbnJfYmxvY2tzOwotCXNwb29sLT51c2VkX2hwYWdlcyA9IDA7CisJc3Bvb2wtPm1heF9ocGFnZXMgPSBtYXhfaHBhZ2VzOworCXNwb29sLT5oc3RhdGUgPSBoOworCXNwb29sLT5taW5faHBhZ2VzID0gbWluX2hwYWdlczsKKworCWlmIChtaW5faHBhZ2VzICE9IC0xICYmIGh1Z2V0bGJfYWNjdF9tZW1vcnkoaCwgbWluX2hwYWdlcykpIHsKKwkJa2ZyZWUoc3Bvb2wpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3Bvb2wtPnJzdl9ocGFnZXMgPSBtaW5faHBhZ2VzOwogCiAJcmV0dXJuIHNwb29sOwogfQpAQCAtOTcsMzYgKzExMyw4OSBAQAogCXVubG9ja19vcl9yZWxlYXNlX3N1YnBvb2woc3Bvb2wpOwogfQogCi1zdGF0aWMgaW50IGh1Z2VwYWdlX3N1YnBvb2xfZ2V0X3BhZ2VzKHN0cnVjdCBodWdlcGFnZV9zdWJwb29sICpzcG9vbCwKKy8qCisgKiBTdWJwb29sIGFjY291bnRpbmcgZm9yIGFsbG9jYXRpbmcgYW5kIHJlc2VydmluZyBwYWdlcy4KKyAqIFJldHVybiAtRU5PTUVNIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyB0byBzYXRpc2Z5IHRoZQorICogdGhlIHJlcXVlc3QuICBPdGhlcndpc2UsIHJldHVybiB0aGUgbnVtYmVyIG9mIHBhZ2VzIGJ5IHdoaWNoIHRoZQorICogZ2xvYmFsIHBvb2xzIG11c3QgYmUgYWRqdXN0ZWQgKHVwd2FyZCkuICBUaGUgcmV0dXJuZWQgdmFsdWUgbWF5CisgKiBvbmx5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBwYXNzZWQgdmFsdWUgKGRlbHRhKSBpbiB0aGUgY2FzZSB3aGVyZQorICogYSBzdWJwb29sIG1pbmltdW0gc2l6ZSBtdXN0IGJlIG1hbml0YWluZWQuCisgKi8KK3N0YXRpYyBsb25nIGh1Z2VwYWdlX3N1YnBvb2xfZ2V0X3BhZ2VzKHN0cnVjdCBodWdlcGFnZV9zdWJwb29sICpzcG9vbCwKIAkJCQkgICAgICBsb25nIGRlbHRhKQogewotCWludCByZXQgPSAwOworCWxvbmcgcmV0ID0gZGVsdGE7CiAKIAlpZiAoIXNwb29sKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHJldDsKIAogCXNwaW5fbG9jaygmc3Bvb2wtPmxvY2spOwotCWlmICgoc3Bvb2wtPnVzZWRfaHBhZ2VzICsgZGVsdGEpIDw9IHNwb29sLT5tYXhfaHBhZ2VzKSB7Ci0JCXNwb29sLT51c2VkX2hwYWdlcyArPSBkZWx0YTsKLQl9IGVsc2UgewotCQlyZXQgPSAtRU5PTUVNOwotCX0KLQlzcGluX3VubG9jaygmc3Bvb2wtPmxvY2spOwogCisJaWYgKHNwb29sLT5tYXhfaHBhZ2VzICE9IC0xKSB7CQkvKiBtYXhpbXVtIHNpemUgYWNjb3VudGluZyAqLworCQlpZiAoKHNwb29sLT51c2VkX2hwYWdlcyArIGRlbHRhKSA8PSBzcG9vbC0+bWF4X2hwYWdlcykKKwkJCXNwb29sLT51c2VkX2hwYWdlcyArPSBkZWx0YTsKKwkJZWxzZSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byB1bmxvY2tfcmV0OworCQl9CisJfQorCisJaWYgKHNwb29sLT5taW5faHBhZ2VzICE9IC0xKSB7CQkvKiBtaW5pbXVtIHNpemUgYWNjb3VudGluZyAqLworCQlpZiAoZGVsdGEgPiBzcG9vbC0+cnN2X2hwYWdlcykgeworCQkJLyoKKwkJCSAqIEFza2luZyBmb3IgbW9yZSByZXNlcnZlcyB0aGFuIHRob3NlIGFscmVhZHkgdGFrZW4gb24KKwkJCSAqIGJlaGFsZiBvZiBzdWJwb29sLiAgUmV0dXJuIGRpZmZlcmVuY2UuCisJCQkgKi8KKwkJCXJldCA9IGRlbHRhIC0gc3Bvb2wtPnJzdl9ocGFnZXM7CisJCQlzcG9vbC0+cnN2X2hwYWdlcyA9IDA7CisJCX0gZWxzZSB7CisJCQlyZXQgPSAwOwkvKiByZXNlcnZlcyBhbHJlYWR5IGFjY291bnRlZCBmb3IgKi8KKwkJCXNwb29sLT5yc3ZfaHBhZ2VzIC09IGRlbHRhOworCQl9CisJfQorCit1bmxvY2tfcmV0OgorCXNwaW5fdW5sb2NrKCZzcG9vbC0+bG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgaHVnZXBhZ2Vfc3VicG9vbF9wdXRfcGFnZXMoc3RydWN0IGh1Z2VwYWdlX3N1YnBvb2wgKnNwb29sLAorLyoKKyAqIFN1YnBvb2wgYWNjb3VudGluZyBmb3IgZnJlZWluZyBhbmQgdW5yZXNlcnZpbmcgcGFnZXMuCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBnbG9iYWwgcGFnZSByZXNlcnZhdGlvbnMgdGhhdCBtdXN0IGJlIGRyb3BwZWQuCisgKiBUaGUgcmV0dXJuIHZhbHVlIG1heSBvbmx5IGJlIGRpZmZlcmVudCB0aGFuIHRoZSBwYXNzZWQgdmFsdWUgKGRlbHRhKQorICogaW4gdGhlIGNhc2Ugd2hlcmUgYSBzdWJwb29sIG1pbmltdW0gc2l6ZSBtdXN0IGJlIG1haW50YWluZWQuCisgKi8KK3N0YXRpYyBsb25nIGh1Z2VwYWdlX3N1YnBvb2xfcHV0X3BhZ2VzKHN0cnVjdCBodWdlcGFnZV9zdWJwb29sICpzcG9vbCwKIAkJCQkgICAgICAgbG9uZyBkZWx0YSkKIHsKKwlsb25nIHJldCA9IGRlbHRhOworCiAJaWYgKCFzcG9vbCkKLQkJcmV0dXJuOworCQlyZXR1cm4gZGVsdGE7CiAKIAlzcGluX2xvY2soJnNwb29sLT5sb2NrKTsKLQlzcG9vbC0+dXNlZF9ocGFnZXMgLT0gZGVsdGE7Ci0JLyogSWYgaHVnZXRsYmZzX3B1dF9zdXBlciBjb3VsZG4ndCBmcmVlIHNwb29sIGR1ZSB0bwotCSogYW4gb3V0c3RhbmRpbmcgcXVvdGEgcmVmZXJlbmNlLCBmcmVlIGl0IG5vdy4gKi8KKworCWlmIChzcG9vbC0+bWF4X2hwYWdlcyAhPSAtMSkJCS8qIG1heGltdW0gc2l6ZSBhY2NvdW50aW5nICovCisJCXNwb29sLT51c2VkX2hwYWdlcyAtPSBkZWx0YTsKKworCWlmIChzcG9vbC0+bWluX2hwYWdlcyAhPSAtMSkgewkJLyogbWluaW11bSBzaXplIGFjY291bnRpbmcgKi8KKwkJaWYgKHNwb29sLT5yc3ZfaHBhZ2VzICsgZGVsdGEgPD0gc3Bvb2wtPm1pbl9ocGFnZXMpCisJCQlyZXQgPSAwOworCQllbHNlCisJCQlyZXQgPSBzcG9vbC0+cnN2X2hwYWdlcyArIGRlbHRhIC0gc3Bvb2wtPm1pbl9ocGFnZXM7CisKKwkJc3Bvb2wtPnJzdl9ocGFnZXMgKz0gZGVsdGE7CisJCWlmIChzcG9vbC0+cnN2X2hwYWdlcyA+IHNwb29sLT5taW5faHBhZ2VzKQorCQkJc3Bvb2wtPnJzdl9ocGFnZXMgPSBzcG9vbC0+bWluX2hwYWdlczsKKwl9CisKKwkvKgorCSAqIElmIGh1Z2V0bGJmc19wdXRfc3VwZXIgY291bGRuJ3QgZnJlZSBzcG9vbCBkdWUgdG8gYW4gb3V0c3RhbmRpbmcKKwkgKiBxdW90YSByZWZlcmVuY2UsIGZyZWUgaXQgbm93LgorCSAqLwogCXVubG9ja19vcl9yZWxlYXNlX3N1YnBvb2woc3Bvb2wpOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgaHVnZXBhZ2Vfc3VicG9vbCAqc3VicG9vbF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQpAQCAtODU1LDYgKzkyNCwzMSBAQAogCXJldHVybiBOVUxMOwogfQogCisvKgorICogVGVzdCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgaHVnZXBhZ2UgaXMgImFjdGl2ZS9pbi11c2UiIChpLmUuIGJlaW5nIGxpbmtlZAorICogdG8gaHN0YXRlLT5odWdlcGFnZV9hY3RpdmVsaXN0LikKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZm9yIHRhaWwgcGFnZXMsIGJ1dCBuZXZlciByZXR1cm5zIHRydWUgZm9yIHRoZW0uCisgKi8KK2Jvb2wgcGFnZV9odWdlX2FjdGl2ZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlWTV9CVUdfT05fUEFHRSghUGFnZUh1Z2UocGFnZSksIHBhZ2UpOworCXJldHVybiBQYWdlSGVhZChwYWdlKSAmJiBQYWdlUHJpdmF0ZSgmcGFnZVsxXSk7Cit9CisKKy8qIG5ldmVyIGNhbGxlZCBmb3IgdGFpbCBwYWdlICovCitzdGF0aWMgdm9pZCBzZXRfcGFnZV9odWdlX2FjdGl2ZShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlWTV9CVUdfT05fUEFHRSghUGFnZUhlYWRIdWdlKHBhZ2UpLCBwYWdlKTsKKwlTZXRQYWdlUHJpdmF0ZSgmcGFnZVsxXSk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX3BhZ2VfaHVnZV9hY3RpdmUoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJVk1fQlVHX09OX1BBR0UoIVBhZ2VIZWFkSHVnZShwYWdlKSwgcGFnZSk7CisJQ2xlYXJQYWdlUHJpdmF0ZSgmcGFnZVsxXSk7Cit9CisKIHZvaWQgZnJlZV9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJLyoKQEAgLTg3NCw3ICs5NjgsMTYgQEAKIAlyZXN0b3JlX3Jlc2VydmUgPSBQYWdlUHJpdmF0ZShwYWdlKTsKIAlDbGVhclBhZ2VQcml2YXRlKHBhZ2UpOwogCisJLyoKKwkgKiBBIHJldHVybiBjb2RlIG9mIHplcm8gaW1wbGllcyB0aGF0IHRoZSBzdWJwb29sIHdpbGwgYmUgdW5kZXIgaXRzCisJICogbWluaW11bSBzaXplIGlmIHRoZSByZXNlcnZhdGlvbiBpcyBub3QgcmVzdG9yZWQgYWZ0ZXIgcGFnZSBpcyBmcmVlLgorCSAqIFRoZXJlZm9yZSwgZm9yY2UgcmVzdG9yZV9yZXNlcnZlIG9wZXJhdGlvbi4KKwkgKi8KKwlpZiAoaHVnZXBhZ2Vfc3VicG9vbF9wdXRfcGFnZXMoc3Bvb2wsIDEpID09IDApCisJCXJlc3RvcmVfcmVzZXJ2ZSA9IHRydWU7CisKIAlzcGluX2xvY2soJmh1Z2V0bGJfbG9jayk7CisJY2xlYXJfcGFnZV9odWdlX2FjdGl2ZShwYWdlKTsKIAlodWdldGxiX2Nncm91cF91bmNoYXJnZV9wYWdlKGhzdGF0ZV9pbmRleChoKSwKIAkJCQkgICAgIHBhZ2VzX3Blcl9odWdlX3BhZ2UoaCksIHBhZ2UpOwogCWlmIChyZXN0b3JlX3Jlc2VydmUpCkBAIC04OTEsNyArOTk0LDYgQEAKIAkJZW5xdWV1ZV9odWdlX3BhZ2UoaCwgcGFnZSk7CiAJfQogCXNwaW5fdW5sb2NrKCZodWdldGxiX2xvY2spOwotCWh1Z2VwYWdlX3N1YnBvb2xfcHV0X3BhZ2VzKHNwb29sLCAxKTsKIH0KIAogc3RhdGljIHZvaWQgcHJlcF9uZXdfaHVnZV9wYWdlKHN0cnVjdCBoc3RhdGUgKmgsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbmlkKQpAQCAtMTM4Niw3ICsxNDg4LDcgQEAKIAlpZiAoY2hnIDwgMCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJaWYgKGNoZyB8fCBhdm9pZF9yZXNlcnZlKQotCQlpZiAoaHVnZXBhZ2Vfc3VicG9vbF9nZXRfcGFnZXMoc3Bvb2wsIDEpKQorCQlpZiAoaHVnZXBhZ2Vfc3VicG9vbF9nZXRfcGFnZXMoc3Bvb2wsIDEpIDwgMCkKIAkJCXJldHVybiBFUlJfUFRSKC1FTk9TUEMpOwogCiAJcmV0ID0gaHVnZXRsYl9jZ3JvdXBfY2hhcmdlX2Nncm91cChpZHgsIHBhZ2VzX3Blcl9odWdlX3BhZ2UoaCksICZoX2NnKTsKQEAgLTI0NTQsNiArMjU1Niw3IEBACiAJc3RydWN0IHJlc3ZfbWFwICpyZXN2ID0gdm1hX3Jlc3ZfbWFwKHZtYSk7CiAJc3RydWN0IGh1Z2VwYWdlX3N1YnBvb2wgKnNwb29sID0gc3VicG9vbF92bWEodm1hKTsKIAl1bnNpZ25lZCBsb25nIHJlc2VydmUsIHN0YXJ0LCBlbmQ7CisJbG9uZyBnYmxfcmVzZXJ2ZTsKIAogCWlmICghcmVzdiB8fCAhaXNfdm1hX3Jlc3Zfc2V0KHZtYSwgSFBBR0VfUkVTVl9PV05FUikpCiAJCXJldHVybjsKQEAgLTI0NjYsOCArMjU2OSwxMiBAQAogCWtyZWZfcHV0KCZyZXN2LT5yZWZzLCByZXN2X21hcF9yZWxlYXNlKTsKIAogCWlmIChyZXNlcnZlKSB7Ci0JCWh1Z2V0bGJfYWNjdF9tZW1vcnkoaCwgLXJlc2VydmUpOwotCQlodWdlcGFnZV9zdWJwb29sX3B1dF9wYWdlcyhzcG9vbCwgcmVzZXJ2ZSk7CisJCS8qCisJCSAqIERlY3JlbWVudCByZXNlcnZlIGNvdW50cy4gIFRoZSBnbG9iYWwgcmVzZXJ2ZSBjb3VudCBtYXkgYmUKKwkJICogYWRqdXN0ZWQgaWYgdGhlIHN1YnBvb2wgaGFzIGEgbWluaW11bSBzaXplLgorCQkgKi8KKwkJZ2JsX3Jlc2VydmUgPSBodWdlcGFnZV9zdWJwb29sX3B1dF9wYWdlcyhzcG9vbCwgcmVzZXJ2ZSk7CisJCWh1Z2V0bGJfYWNjdF9tZW1vcnkoaCwgLWdibF9yZXNlcnZlKTsKIAl9CiB9CiAKQEAgLTI4OTEsNiArMjk5OCw3IEBACiAJY29weV91c2VyX2h1Z2VfcGFnZShuZXdfcGFnZSwgb2xkX3BhZ2UsIGFkZHJlc3MsIHZtYSwKIAkJCSAgICBwYWdlc19wZXJfaHVnZV9wYWdlKGgpKTsKIAlfX1NldFBhZ2VVcHRvZGF0ZShuZXdfcGFnZSk7CisJc2V0X3BhZ2VfaHVnZV9hY3RpdmUobmV3X3BhZ2UpOwogCiAJbW11bl9zdGFydCA9IGFkZHJlc3MgJiBodWdlX3BhZ2VfbWFzayhoKTsKIAltbXVuX2VuZCA9IG1tdW5fc3RhcnQgKyBodWdlX3BhZ2Vfc2l6ZShoKTsKQEAgLTMwMDMsNiArMzExMSw3IEBACiAJCX0KIAkJY2xlYXJfaHVnZV9wYWdlKHBhZ2UsIGFkZHJlc3MsIHBhZ2VzX3Blcl9odWdlX3BhZ2UoaCkpOwogCQlfX1NldFBhZ2VVcHRvZGF0ZShwYWdlKTsKKwkJc2V0X3BhZ2VfaHVnZV9hY3RpdmUocGFnZSk7CiAKIAkJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9NQVlTSEFSRSkgewogCQkJaW50IGVycjsKQEAgLTMyNzgsNiArMzM4NywxNSBAQAogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAogCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgcGVuZGluZyBTSUdLSUxMLCBkb24ndCBrZWVwIGZhdWx0aW5nIHBhZ2VzIGFuZAorCQkgKiBwb3RlbnRpYWxseSBhbGxvY2F0aW5nIG1lbW9yeS4KKwkJICovCisJCWlmICh1bmxpa2VseShmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkpIHsKKwkJCXJlbWFpbmRlciA9IDA7CisJCQlicmVhazsKKwkJfQorCisJCS8qCiAJCSAqIFNvbWUgYXJjaHMgKHNwYXJjNjQsIHNoKikgaGF2ZSBtdWx0aXBsZSBwdGVfdHMgdG8KIAkJICogZWFjaCBodWdlcGFnZS4gIFdlIGhhdmUgdG8gbWFrZSBzdXJlIHdlIGdldCB0aGUKIAkJICogZmlyc3QsIGZvciB0aGUgcGFnZSBpbmRleGluZyBiZWxvdyB0byB3b3JrLgpAQCAtMzQzOCw2ICszNTU2LDcgQEAKIAlzdHJ1Y3QgaHN0YXRlICpoID0gaHN0YXRlX2lub2RlKGlub2RlKTsKIAlzdHJ1Y3QgaHVnZXBhZ2Vfc3VicG9vbCAqc3Bvb2wgPSBzdWJwb29sX2lub2RlKGlub2RlKTsKIAlzdHJ1Y3QgcmVzdl9tYXAgKnJlc3ZfbWFwOworCWxvbmcgZ2JsX3Jlc2VydmU7CiAKIAkvKgogCSAqIE9ubHkgYXBwbHkgaHVnZXBhZ2UgcmVzZXJ2YXRpb24gaWYgYXNrZWQuIEF0IGZhdWx0IHRpbWUsIGFuCkBAIC0zNDc0LDggKzM1OTMsMTMgQEAKIAkJZ290byBvdXRfZXJyOwogCX0KIAotCS8qIFRoZXJlIG11c3QgYmUgZW5vdWdoIHBhZ2VzIGluIHRoZSBzdWJwb29sIGZvciB0aGUgbWFwcGluZyAqLwotCWlmIChodWdlcGFnZV9zdWJwb29sX2dldF9wYWdlcyhzcG9vbCwgY2hnKSkgeworCS8qCisJICogVGhlcmUgbXVzdCBiZSBlbm91Z2ggcGFnZXMgaW4gdGhlIHN1YnBvb2wgZm9yIHRoZSBtYXBwaW5nLiBJZgorCSAqIHRoZSBzdWJwb29sIGhhcyBhIG1pbmltdW0gc2l6ZSwgdGhlcmUgbWF5IGJlIHNvbWUgZ2xvYmFsCisJICogcmVzZXJ2YXRpb25zIGFscmVhZHkgaW4gcGxhY2UgKGdibF9yZXNlcnZlKS4KKwkgKi8KKwlnYmxfcmVzZXJ2ZSA9IGh1Z2VwYWdlX3N1YnBvb2xfZ2V0X3BhZ2VzKHNwb29sLCBjaGcpOworCWlmIChnYmxfcmVzZXJ2ZSA8IDApIHsKIAkJcmV0ID0gLUVOT1NQQzsKIAkJZ290byBvdXRfZXJyOwogCX0KQEAgLTM0ODQsOSArMzYwOCwxMCBAQAogCSAqIENoZWNrIGVub3VnaCBodWdlcGFnZXMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIHJlc2VydmF0aW9uLgogCSAqIEhhbmQgdGhlIHBhZ2VzIGJhY2sgdG8gdGhlIHN1YnBvb2wgaWYgdGhlcmUgYXJlIG5vdAogCSAqLwotCXJldCA9IGh1Z2V0bGJfYWNjdF9tZW1vcnkoaCwgY2hnKTsKKwlyZXQgPSBodWdldGxiX2FjY3RfbWVtb3J5KGgsIGdibF9yZXNlcnZlKTsKIAlpZiAocmV0IDwgMCkgewotCQlodWdlcGFnZV9zdWJwb29sX3B1dF9wYWdlcyhzcG9vbCwgY2hnKTsKKwkJLyogcHV0IGJhY2sgb3JpZ2luYWwgbnVtYmVyIG9mIHBhZ2VzLCBjaGcgKi8KKwkJKHZvaWQpaHVnZXBhZ2Vfc3VicG9vbF9wdXRfcGFnZXMoc3Bvb2wsIGNoZyk7CiAJCWdvdG8gb3V0X2VycjsKIAl9CiAKQEAgLTM1MTYsNiArMzY0MSw3IEBACiAJc3RydWN0IHJlc3ZfbWFwICpyZXN2X21hcCA9IGlub2RlX3Jlc3ZfbWFwKGlub2RlKTsKIAlsb25nIGNoZyA9IDA7CiAJc3RydWN0IGh1Z2VwYWdlX3N1YnBvb2wgKnNwb29sID0gc3VicG9vbF9pbm9kZShpbm9kZSk7CisJbG9uZyBnYmxfcmVzZXJ2ZTsKIAogCWlmIChyZXN2X21hcCkKIAkJY2hnID0gcmVnaW9uX3RydW5jYXRlKHJlc3ZfbWFwLCBvZmZzZXQpOwpAQCAtMzUyMyw4ICszNjQ5LDEyIEBACiAJaW5vZGUtPmlfYmxvY2tzIC09IChibG9ja3NfcGVyX2h1Z2VfcGFnZShoKSAqIGZyZWVkKTsKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAKLQlodWdlcGFnZV9zdWJwb29sX3B1dF9wYWdlcyhzcG9vbCwgKGNoZyAtIGZyZWVkKSk7Ci0JaHVnZXRsYl9hY2N0X21lbW9yeShoLCAtKGNoZyAtIGZyZWVkKSk7CisJLyoKKwkgKiBJZiB0aGUgc3VicG9vbCBoYXMgYSBtaW5pbXVtIHNpemUsIHRoZSBudW1iZXIgb2YgZ2xvYmFsCisJICogcmVzZXJ2YXRpb25zIHRvIGJlIHJlbGVhc2VkIG1heSBiZSBhZGp1c3RlZC4KKwkgKi8KKwlnYmxfcmVzZXJ2ZSA9IGh1Z2VwYWdlX3N1YnBvb2xfcHV0X3BhZ2VzKHNwb29sLCAoY2hnIC0gZnJlZWQpKTsKKwlodWdldGxiX2FjY3RfbWVtb3J5KGgsIC1nYmxfcmVzZXJ2ZSk7CiB9CiAKICNpZmRlZiBDT05GSUdfQVJDSF9XQU5UX0hVR0VfUE1EX1NIQVJFCkBAIC0zNzM1LDggKzM4NjUsNyBAQAogCWlmICghcG1kX2h1Z2UoKnBtZCkpCiAJCWdvdG8gb3V0OwogCWlmIChwbWRfcHJlc2VudCgqcG1kKSkgewotCQlwYWdlID0gcHRlX3BhZ2UoKihwdGVfdCAqKXBtZCkgKwotCQkJKChhZGRyZXNzICYgflBNRF9NQVNLKSA+PiBQQUdFX1NISUZUKTsKKwkJcGFnZSA9IHBtZF9wYWdlKCpwbWQpICsgKChhZGRyZXNzICYgflBNRF9NQVNLKSA+PiBQQUdFX1NISUZUKTsKIAkJaWYgKGZsYWdzICYgRk9MTF9HRVQpCiAJCQlnZXRfcGFnZShwYWdlKTsKIAl9IGVsc2UgewpAQCAtMzc2NywyMCArMzg5Niw2IEBACiAKICNpZmRlZiBDT05GSUdfTUVNT1JZX0ZBSUxVUkUKIAotLyogU2hvdWxkIGJlIGNhbGxlZCBpbiBodWdldGxiX2xvY2sgKi8KLXN0YXRpYyBpbnQgaXNfaHVnZXBhZ2Vfb25fZnJlZWxpc3Qoc3RydWN0IHBhZ2UgKmhwYWdlKQotewotCXN0cnVjdCBwYWdlICpwYWdlOwotCXN0cnVjdCBwYWdlICp0bXA7Ci0Jc3RydWN0IGhzdGF0ZSAqaCA9IHBhZ2VfaHN0YXRlKGhwYWdlKTsKLQlpbnQgbmlkID0gcGFnZV90b19uaWQoaHBhZ2UpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhZ2UsIHRtcCwgJmgtPmh1Z2VwYWdlX2ZyZWVsaXN0c1tuaWRdLCBscnUpCi0JCWlmIChwYWdlID09IGhwYWdlKQotCQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIG1lbW9yeSBmYWlsdXJlIGNvZGUuCiAgKiBBc3N1bWUgdGhlIGNhbGxlciBob2xkcyBwYWdlIGxvY2sgb2YgdGhlIGhlYWQgcGFnZS4KQEAgLTM3OTIsNyArMzkwNywxMSBAQAogCWludCByZXQgPSAtRUJVU1k7CiAKIAlzcGluX2xvY2soJmh1Z2V0bGJfbG9jayk7Ci0JaWYgKGlzX2h1Z2VwYWdlX29uX2ZyZWVsaXN0KGhwYWdlKSkgeworCS8qCisJICogSnVzdCBjaGVja2luZyAhcGFnZV9odWdlX2FjdGl2ZSBpcyBub3QgZW5vdWdoLCBiZWNhdXNlIHRoYXQgY291bGQgYmUKKwkgKiBhbiBpc29sYXRlZC9od3BvaXNvbmVkIGh1Z2VwYWdlICh3aGljaCBoYXZlID4wIHJlZmNvdW50KS4KKwkgKi8KKwlpZiAoIXBhZ2VfaHVnZV9hY3RpdmUoaHBhZ2UpICYmICFwYWdlX2NvdW50KGhwYWdlKSkgewogCQkvKgogCQkgKiBId3BvaXNvbmVkIGh1Z2VwYWdlIGlzbid0IGxpbmtlZCB0byBhY3RpdmVsaXN0IG9yIGZyZWVsaXN0LAogCQkgKiBidXQgZGFuZ2xpbmcgaHBhZ2UtPmxydSBjYW4gdHJpZ2dlciBsaXN0LWRlYnVnIHdhcm5pbmdzCkBAIC0zODEyLDQyICszOTMxLDI3IEBACiAKIGJvb2wgaXNvbGF0ZV9odWdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpCiB7CisJYm9vbCByZXQgPSB0cnVlOworCiAJVk1fQlVHX09OX1BBR0UoIVBhZ2VIZWFkKHBhZ2UpLCBwYWdlKTsKLQlpZiAoIWdldF9wYWdlX3VubGVzc196ZXJvKHBhZ2UpKQotCQlyZXR1cm4gZmFsc2U7CiAJc3Bpbl9sb2NrKCZodWdldGxiX2xvY2spOworCWlmICghcGFnZV9odWdlX2FjdGl2ZShwYWdlKSB8fCAhZ2V0X3BhZ2VfdW5sZXNzX3plcm8ocGFnZSkpIHsKKwkJcmV0ID0gZmFsc2U7CisJCWdvdG8gdW5sb2NrOworCX0KKwljbGVhcl9wYWdlX2h1Z2VfYWN0aXZlKHBhZ2UpOwogCWxpc3RfbW92ZV90YWlsKCZwYWdlLT5scnUsIGxpc3QpOwordW5sb2NrOgogCXNwaW5fdW5sb2NrKCZodWdldGxiX2xvY2spOwotCXJldHVybiB0cnVlOworCXJldHVybiByZXQ7CiB9CiAKIHZvaWQgcHV0YmFja19hY3RpdmVfaHVnZXBhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJVk1fQlVHX09OX1BBR0UoIVBhZ2VIZWFkKHBhZ2UpLCBwYWdlKTsKIAlzcGluX2xvY2soJmh1Z2V0bGJfbG9jayk7CisJc2V0X3BhZ2VfaHVnZV9hY3RpdmUocGFnZSk7CiAJbGlzdF9tb3ZlX3RhaWwoJnBhZ2UtPmxydSwgJihwYWdlX2hzdGF0ZShwYWdlKSktPmh1Z2VwYWdlX2FjdGl2ZWxpc3QpOwogCXNwaW5fdW5sb2NrKCZodWdldGxiX2xvY2spOwogCXB1dF9wYWdlKHBhZ2UpOwogfQotCi1ib29sIGlzX2h1Z2VwYWdlX2FjdGl2ZShzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlWTV9CVUdfT05fUEFHRSghUGFnZUh1Z2UocGFnZSksIHBhZ2UpOwotCS8qCi0JICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZvciBhIHRhaWwgcGFnZSBiZWNhdXNlIHRoZSBjYWxsZXIsCi0JICogc2Nhbl9tb3ZhYmxlX3BhZ2VzLCBzY2FucyB0aHJvdWdoIGEgZ2l2ZW4gcGZuLXJhbmdlIHdoaWNoIHR5cGljYWxseQotCSAqIGNvdmVycyBvbmUgbWVtb3J5IGJsb2NrLiBJbiBzeXN0ZW1zIHVzaW5nIGdpZ2FudGljIGh1Z2VwYWdlICgxR0IKLQkgKiBmb3IgeDg2XzY0LCkgYSBodWdlcGFnZSBpcyBsYXJnZXIgdGhhbiBhIG1lbW9yeSBibG9jaywgYW5kIHdlIGRvbid0Ci0JICogc3VwcG9ydCBtaWdyYXRpbmcgc3VjaCBsYXJnZSBodWdlcGFnZXMgZm9yIG5vdywgc28gcmV0dXJuIGZhbHNlCi0JICogd2hlbiBjYWxsZWQgZm9yIHRhaWwgcGFnZXMuCi0JICovCi0JaWYgKFBhZ2VUYWlsKHBhZ2UpKQotCQlyZXR1cm4gZmFsc2U7Ci0JLyoKLQkgKiBSZWZjb3VudCBvZiBhIGh3cG9pc29uZWQgaHVnZXBhZ2VzIGlzIDEsIGJ1dCB0aGV5IGFyZSBub3QgYWN0aXZlLAotCSAqIHNvIHdlIHNob3VsZCByZXR1cm4gZmFsc2UgZm9yIHRoZW0uCi0JICovCi0JaWYgKHVubGlrZWx5KFBhZ2VIV1BvaXNvbihwYWdlKSkpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gcGFnZV9jb3VudChwYWdlKSA+IDA7Ci19CmRpZmYgLS1naXQgYS9tbS9pbnRlcm5hbC5oIGIvbW0vaW50ZXJuYWwuaAppbmRleCBhOTZkYTViLi5hMjVlMzU5IDEwMDY0NAotLS0gYS9tbS9pbnRlcm5hbC5oCisrKyBiL21tL2ludGVybmFsLmgKQEAgLTIwMCw2ICsyMDAsOCBAQAogdW5zaWduZWQgbG9uZwogaXNvbGF0ZV9taWdyYXRlcGFnZXNfcmFuZ2Uoc3RydWN0IGNvbXBhY3RfY29udHJvbCAqY2MsCiAJCQkgICB1bnNpZ25lZCBsb25nIGxvd19wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7CitpbnQgZmluZF9zdWl0YWJsZV9mYWxsYmFjayhzdHJ1Y3QgZnJlZV9hcmVhICphcmVhLCB1bnNpZ25lZCBpbnQgb3JkZXIsCisJCQlpbnQgbWlncmF0ZXR5cGUsIGJvb2wgb25seV9zdGVhbGFibGUsIGJvb2wgKmNhbl9zdGVhbCk7CiAKICNlbmRpZgogCkBAIC0yMjIsMTMgKzIyNCwxMyBAQAogICogUGFnZUJ1ZGR5KCkgc2hvdWxkIGJlIGNoZWNrZWQgZmlyc3QgYnkgdGhlIGNhbGxlciB0byBtaW5pbWl6ZSByYWNlIHdpbmRvdywKICAqIGFuZCBpbnZhbGlkIHZhbHVlcyBtdXN0IGJlIGhhbmRsZWQgZ3JhY2VmdWxseS4KICAqCi0gKiBBQ0NFU1NfT05DRSBpcyB1c2VkIHNvIHRoYXQgaWYgdGhlIGNhbGxlciBhc3NpZ25zIHRoZSByZXN1bHQgaW50byBhIGxvY2FsCisgKiBSRUFEX09OQ0UgaXMgdXNlZCBzbyB0aGF0IGlmIHRoZSBjYWxsZXIgYXNzaWducyB0aGUgcmVzdWx0IGludG8gYSBsb2NhbAogICogdmFyaWFibGUgYW5kIGUuZy4gdGVzdHMgaXQgZm9yIHZhbGlkIHJhbmdlIGJlZm9yZSB1c2luZywgdGhlIGNvbXBpbGVyIGNhbm5vdAogICogZGVjaWRlIHRvIHJlbW92ZSB0aGUgdmFyaWFibGUgYW5kIGlubGluZSB0aGUgcGFnZV9wcml2YXRlKHBhZ2UpIG11bHRpcGxlCiAgKiB0aW1lcywgcG90ZW50aWFsbHkgb2JzZXJ2aW5nIGRpZmZlcmVudCB2YWx1ZXMgaW4gdGhlIHRlc3RzIGFuZCB0aGUgYWN0dWFsCiAgKiB1c2Ugb2YgdGhlIHJlc3VsdC4KICAqLwotI2RlZmluZSBwYWdlX29yZGVyX3Vuc2FmZShwYWdlKQkJQUNDRVNTX09OQ0UocGFnZV9wcml2YXRlKHBhZ2UpKQorI2RlZmluZSBwYWdlX29yZGVyX3Vuc2FmZShwYWdlKQkJUkVBRF9PTkNFKHBhZ2VfcHJpdmF0ZShwYWdlKSkKIAogc3RhdGljIGlubGluZSBib29sIGlzX2Nvd19tYXBwaW5nKHZtX2ZsYWdzX3QgZmxhZ3MpCiB7CkBAIC0yNDAsNyArMjQyLDcgQEAKIAkJc3RydWN0IHZtX2FyZWFfc3RydWN0ICpwcmV2LCBzdHJ1Y3QgcmJfbm9kZSAqcmJfcGFyZW50KTsKIAogI2lmZGVmIENPTkZJR19NTVUKLWV4dGVybiBsb25nIF9fbWxvY2tfdm1hX3BhZ2VzX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorZXh0ZXJuIGxvbmcgcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCXVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgKm5vbmJsb2NraW5nKTsKIGV4dGVybiB2b2lkIG11bmxvY2tfdm1hX3BhZ2VzX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwpkaWZmIC0tZ2l0IGEvbW0va2FzYW4va2FzYW4uYyBiL21tL2thc2FuL2thc2FuLmMKaW5kZXggOTM2ZDgxNi4uNmM1MTNhNiAxMDA2NDQKLS0tIGEvbW0va2FzYW4va2FzYW4uYworKysgYi9tbS9rYXNhbi9rYXNhbi5jCkBAIC0zODksNiArMzg5LDE5IEBACiAJCWthc2FuX2ttYWxsb2MocGFnZS0+c2xhYl9jYWNoZSwgb2JqZWN0LCBzaXplKTsKIH0KIAordm9pZCBrYXNhbl9rZnJlZSh2b2lkICpwdHIpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlwYWdlID0gdmlydF90b19oZWFkX3BhZ2UocHRyKTsKKworCWlmICh1bmxpa2VseSghUGFnZVNsYWIocGFnZSkpKQorCQlrYXNhbl9wb2lzb25fc2hhZG93KHB0ciwgUEFHRV9TSVpFIDw8IGNvbXBvdW5kX29yZGVyKHBhZ2UpLAorCQkJCUtBU0FOX0ZSRUVfUEFHRSk7CisJZWxzZQorCQlrYXNhbl9zbGFiX2ZyZWUocGFnZS0+c2xhYl9jYWNoZSwgcHRyKTsKK30KKwogdm9pZCBrYXNhbl9rZnJlZV9sYXJnZShjb25zdCB2b2lkICpwdHIpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UocHRyKTsKZGlmZiAtLWdpdCBhL21tL2tzbS5jIGIvbW0va3NtLmMKaW5kZXggNDE2MmRjZS4uN2VlMTAxZSAxMDA2NDQKLS0tIGEvbW0va3NtLmMKKysrIGIvbW0va3NtLmMKQEAgLTU0Miw3ICs1NDIsNyBAQAogCWV4cGVjdGVkX21hcHBpbmcgPSAodm9pZCAqKXN0YWJsZV9ub2RlICsKIAkJCQkoUEFHRV9NQVBQSU5HX0FOT04gfCBQQUdFX01BUFBJTkdfS1NNKTsKIGFnYWluOgotCWtwZm4gPSBBQ0NFU1NfT05DRShzdGFibGVfbm9kZS0+a3Bmbik7CisJa3BmbiA9IFJFQURfT05DRShzdGFibGVfbm9kZS0+a3Bmbik7CiAJcGFnZSA9IHBmbl90b19wYWdlKGtwZm4pOwogCiAJLyoKQEAgLTU1MSw3ICs1NTEsNyBAQAogCSAqIGJ1dCBvbiBBbHBoYSB3ZSBuZWVkIHRvIGJlIG1vcmUgY2FyZWZ1bC4KIAkgKi8KIAlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKLQlpZiAoQUNDRVNTX09OQ0UocGFnZS0+bWFwcGluZykgIT0gZXhwZWN0ZWRfbWFwcGluZykKKwlpZiAoUkVBRF9PTkNFKHBhZ2UtPm1hcHBpbmcpICE9IGV4cGVjdGVkX21hcHBpbmcpCiAJCWdvdG8gc3RhbGU7CiAKIAkvKgpAQCAtNTc3LDE0ICs1NzcsMTQgQEAKIAkJY3B1X3JlbGF4KCk7CiAJfQogCi0JaWYgKEFDQ0VTU19PTkNFKHBhZ2UtPm1hcHBpbmcpICE9IGV4cGVjdGVkX21hcHBpbmcpIHsKKwlpZiAoUkVBRF9PTkNFKHBhZ2UtPm1hcHBpbmcpICE9IGV4cGVjdGVkX21hcHBpbmcpIHsKIAkJcHV0X3BhZ2UocGFnZSk7CiAJCWdvdG8gc3RhbGU7CiAJfQogCiAJaWYgKGxvY2tfaXQpIHsKIAkJbG9ja19wYWdlKHBhZ2UpOwotCQlpZiAoQUNDRVNTX09OQ0UocGFnZS0+bWFwcGluZykgIT0gZXhwZWN0ZWRfbWFwcGluZykgeworCQlpZiAoUkVBRF9PTkNFKHBhZ2UtPm1hcHBpbmcpICE9IGV4cGVjdGVkX21hcHBpbmcpIHsKIAkJCXVubG9ja19wYWdlKHBhZ2UpOwogCQkJcHV0X3BhZ2UocGFnZSk7CiAJCQlnb3RvIHN0YWxlOwpAQCAtNjAwLDcgKzYwMCw3IEBACiAJICogYmVmb3JlIGNoZWNraW5nIHdoZXRoZXIgbm9kZS0+a3BmbiBoYXMgYmVlbiBjaGFuZ2VkLgogCSAqLwogCXNtcF9ybWIoKTsKLQlpZiAoQUNDRVNTX09OQ0Uoc3RhYmxlX25vZGUtPmtwZm4pICE9IGtwZm4pCisJaWYgKFJFQURfT05DRShzdGFibGVfbm9kZS0+a3BmbikgIT0ga3BmbikKIAkJZ290byBhZ2FpbjsKIAlyZW1vdmVfbm9kZV9mcm9tX3N0YWJsZV90cmVlKHN0YWJsZV9ub2RlKTsKIAlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL21tL21lbWJsb2NrLmMgYi9tbS9tZW1ibG9jay5jCmluZGV4IDI1MmI3N2IuLjkzMThiNTYgMTAwNjQ0Ci0tLSBhL21tL21lbWJsb2NrLmMKKysrIGIvbW0vbWVtYmxvY2suYwpAQCAtNTgwLDEwICs1ODAsMjQgQEAKIAlyZXR1cm4gbWVtYmxvY2tfYWRkX3JhbmdlKCZtZW1ibG9jay5tZW1vcnksIGJhc2UsIHNpemUsIG5pZCwgMCk7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2FkZF9yZWdpb24ocGh5c19hZGRyX3QgYmFzZSwKKwkJCQkJCXBoeXNfYWRkcl90IHNpemUsCisJCQkJCQlpbnQgbmlkLAorCQkJCQkJdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqX3JnbiA9ICZtZW1ibG9jay5tZW1vcnk7CisKKwltZW1ibG9ja19kYmcoIm1lbWJsb2NrX2FkZDogWyUjMDE2bGx4LSUjMDE2bGx4XSBmbGFncyAlIzAybHggJXBGXG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmFzZSwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJhc2UgKyBzaXplIC0gMSwKKwkJICAgICBmbGFncywgKHZvaWQgKilfUkVUX0lQXyk7CisKKwlyZXR1cm4gbWVtYmxvY2tfYWRkX3JhbmdlKF9yZ24sIGJhc2UsIHNpemUsIG5pZCwgZmxhZ3MpOworfQorCiBpbnQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2FkZChwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKQogewotCXJldHVybiBtZW1ibG9ja19hZGRfcmFuZ2UoJm1lbWJsb2NrLm1lbW9yeSwgYmFzZSwgc2l6ZSwKLQkJCQkgICBNQVhfTlVNTk9ERVMsIDApOworCXJldHVybiBtZW1ibG9ja19hZGRfcmVnaW9uKGJhc2UsIHNpemUsIE1BWF9OVU1OT0RFUywgMCk7CiB9CiAKIC8qKgpAQCAtNjk5LDE0ICs3MTMsMTQgQEAKIAkJCQkJCSAgIGludCBuaWQsCiAJCQkJCQkgICB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCXN0cnVjdCBtZW1ibG9ja190eXBlICpfcmduID0gJm1lbWJsb2NrLnJlc2VydmVkOworCXN0cnVjdCBtZW1ibG9ja190eXBlICp0eXBlID0gJm1lbWJsb2NrLnJlc2VydmVkOwogCiAJbWVtYmxvY2tfZGJnKCJtZW1ibG9ja19yZXNlcnZlOiBbJSMwMTZsbHgtJSMwMTZsbHhdIGZsYWdzICUjMDJseCAlcEZcbiIsCiAJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliYXNlLAogCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmFzZSArIHNpemUgLSAxLAogCQkgICAgIGZsYWdzLCAodm9pZCAqKV9SRVRfSVBfKTsKIAotCXJldHVybiBtZW1ibG9ja19hZGRfcmFuZ2UoX3JnbiwgYmFzZSwgc2l6ZSwgbmlkLCBmbGFncyk7CisJcmV0dXJuIG1lbWJsb2NrX2FkZF9yYW5nZSh0eXBlLCBiYXNlLCBzaXplLCBuaWQsIGZsYWdzKTsKIH0KIAogaW50IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19yZXNlcnZlKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUpCmRpZmYgLS1naXQgYS9tbS9tZW1jb250cm9sLmMgYi9tbS9tZW1jb250cm9sLmMKaW5kZXggYjM0ZWY0YS4uMTRjMmYyMCAxMDA2NDQKLS0tIGEvbW0vbWVtY29udHJvbC5jCisrKyBiL21tL21lbWNvbnRyb2wuYwpAQCAtMTQsNiArMTQsMTIgQEAKICAqIENvcHlyaWdodCAoQykgMjAxMiBQYXJhbGxlbHMgSW5jLiBhbmQgR29vZ2xlIEluYy4KICAqIEF1dGhvcnM6IEdsYXViZXIgQ29zdGEgYW5kIFN1bGVpbWFuIFNvdWhsYWwKICAqCisgKiBOYXRpdmUgcGFnZSByZWNsYWltCisgKiBDaGFyZ2UgbGlmZXRpbWUgc2FuaXRhdGlvbgorICogTG9ja2xlc3MgcGFnZSB0cmFja2luZyAmIGFjY291bnRpbmcKKyAqIFVuaWZpZWQgaGllcmFyY2h5IGNvbmZpZ3VyYXRpb24gbW9kZWwKKyAqIENvcHlyaWdodCAoQykgMjAxNSBSZWQgSGF0LCBJbmMuLCBKb2hhbm5lcyBXZWluZXIKKyAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCkBAIC0yNTMsMTEgKzI1OSw2IEBACiAgKiBwYWdlIGNhY2hlIGFuZCBSU1MgcGVyIGNncm91cC4gV2Ugd291bGQgZXZlbnR1YWxseSBsaWtlIHRvIHByb3ZpZGUKICAqIHN0YXRpc3RpY3MgYmFzZWQgb24gdGhlIHN0YXRpc3RpY3MgZGV2ZWxvcGVkIGJ5IFJpayBWYW4gUmllbCBmb3IgY2xvY2stcHJvLAogICogdG8gaGVscCB0aGUgYWRtaW5pc3RyYXRvciBkZXRlcm1pbmUgd2hhdCBrbm9icyB0byB0dW5lLgotICoKLSAqIFRPRE86IEFkZCBhIHdhdGVyIG1hcmsgZm9yIHRoZSBtZW1vcnkgY29udHJvbGxlci4gUmVjbGFpbSB3aWxsIGJlZ2luIHdoZW4KLSAqIHdlIGhpdCB0aGUgd2F0ZXIgbWFyay4gTWF5IGJlIGV2ZW4gYWRkIGEgbG93IHdhdGVyIG1hcmssIHN1Y2ggdGhhdAotICogbm8gcmVjbGFpbSBvY2N1cnMgZnJvbSBhIGNncm91cCBhdCBpdCdzIGxvdyB3YXRlciBtYXJrLCB0aGlzIGlzCi0gKiBhIGZlYXR1cmUgdGhhdCB3aWxsIGJlIGltcGxlbWVudGVkIG11Y2ggbGF0ZXIgaW4gdGhlIGZ1dHVyZS4KICAqLwogc3RydWN0IG1lbV9jZ3JvdXAgewogCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlIGNzczsKQEAgLTQ1NCw2ICs0NTUsMTIgQEAKIAlyZXR1cm4gbWVtY2ctPmNzcy5pZDsKIH0KIAorLyoKKyAqIEEgaGVscGVyIGZ1bmN0aW9uIHRvIGdldCBtZW1fY2dyb3VwIGZyb20gSUQuIG11c3QgYmUgY2FsbGVkIHVuZGVyCisgKiByY3VfcmVhZF9sb2NrKCkuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCisgKiBjc3NfdHJ5Z2V0X29ubGluZSgpIGlmIHRoZSBtZW1fY2dyb3VwIGlzIHVzZWQgZm9yIGNoYXJnaW5nLiAoZHJvcHBpbmcKKyAqIHJlZmNudCBmcm9tIHN3YXAgY2FuIGJlIGNhbGxlZCBhZ2FpbnN0IHJlbW92ZWQgbWVtY2cuKQorICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX2Zyb21faWQodW5zaWduZWQgc2hvcnQgaWQpCiB7CiAJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNzczsKQEAgLTY2Nyw3ICs2NzQsNyBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgc29mdF9saW1pdF9leGNlc3Moc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCXVuc2lnbmVkIGxvbmcgbnJfcGFnZXMgPSBwYWdlX2NvdW50ZXJfcmVhZCgmbWVtY2ctPm1lbW9yeSk7Ci0JdW5zaWduZWQgbG9uZyBzb2Z0X2xpbWl0ID0gQUNDRVNTX09OQ0UobWVtY2ctPnNvZnRfbGltaXQpOworCXVuc2lnbmVkIGxvbmcgc29mdF9saW1pdCA9IFJFQURfT05DRShtZW1jZy0+c29mdF9saW1pdCk7CiAJdW5zaWduZWQgbG9uZyBleGNlc3MgPSAwOwogCiAJaWYgKG5yX3BhZ2VzID4gc29mdF9saW1pdCkKQEAgLTEwMzUsNyArMTA0Miw3IEBACiAJCQlnb3RvIG91dF91bmxvY2s7CiAKIAkJZG8gewotCQkJcG9zID0gQUNDRVNTX09OQ0UoaXRlci0+cG9zaXRpb24pOworCQkJcG9zID0gUkVBRF9PTkNFKGl0ZXItPnBvc2l0aW9uKTsKIAkJCS8qCiAJCQkgKiBBIHJhY2luZyB1cGRhdGUgbWF5IGNoYW5nZSB0aGUgcG9zaXRpb24gYW5kCiAJCQkgKiBwdXQgdGhlIGxhc3QgcmVmZXJlbmNlLCBoZW5jZSBjc3NfdHJ5Z2V0KCksCkBAIC0xMzUyLDEzICsxMzU5LDEzIEBACiAJdW5zaWduZWQgbG9uZyBsaW1pdDsKIAogCWNvdW50ID0gcGFnZV9jb3VudGVyX3JlYWQoJm1lbWNnLT5tZW1vcnkpOwotCWxpbWl0ID0gQUNDRVNTX09OQ0UobWVtY2ctPm1lbW9yeS5saW1pdCk7CisJbGltaXQgPSBSRUFEX09OQ0UobWVtY2ctPm1lbW9yeS5saW1pdCk7CiAJaWYgKGNvdW50IDwgbGltaXQpCiAJCW1hcmdpbiA9IGxpbWl0IC0gY291bnQ7CiAKIAlpZiAoZG9fc3dhcF9hY2NvdW50KSB7CiAJCWNvdW50ID0gcGFnZV9jb3VudGVyX3JlYWQoJm1lbWNnLT5tZW1zdyk7Ci0JCWxpbWl0ID0gQUNDRVNTX09OQ0UobWVtY2ctPm1lbXN3LmxpbWl0KTsKKwkJbGltaXQgPSBSRUFEX09OQ0UobWVtY2ctPm1lbXN3LmxpbWl0KTsKIAkJaWYgKGNvdW50IDw9IGxpbWl0KQogCQkJbWFyZ2luID0gbWluKG1hcmdpbiwgbGltaXQgLSBjb3VudCk7CiAJfQpAQCAtMTQzNiwxNSArMTQ0MywxNyBAQAogCXN0cnVjdCBtZW1fY2dyb3VwICppdGVyOwogCXVuc2lnbmVkIGludCBpOwogCi0JaWYgKCFwKQotCQlyZXR1cm47Ci0KIAltdXRleF9sb2NrKCZvb21faW5mb19sb2NrKTsKIAlyY3VfcmVhZF9sb2NrKCk7CiAKLQlwcl9pbmZvKCJUYXNrIGluICIpOwotCXByX2NvbnRfY2dyb3VwX3BhdGgodGFza19jZ3JvdXAocCwgbWVtb3J5X2NncnBfaWQpKTsKLQlwcl9jb250KCIga2lsbGVkIGFzIGEgcmVzdWx0IG9mIGxpbWl0IG9mICIpOworCWlmIChwKSB7CisJCXByX2luZm8oIlRhc2sgaW4gIik7CisJCXByX2NvbnRfY2dyb3VwX3BhdGgodGFza19jZ3JvdXAocCwgbWVtb3J5X2NncnBfaWQpKTsKKwkJcHJfY29udCgiIGtpbGxlZCBhcyBhIHJlc3VsdCBvZiBsaW1pdCBvZiAiKTsKKwl9IGVsc2UgeworCQlwcl9pbmZvKCJNZW1vcnkgbGltaXQgcmVhY2hlZCBvZiBjZ3JvdXAgIik7CisJfQorCiAJcHJfY29udF9jZ3JvdXBfcGF0aChtZW1jZy0+Y3NzLmNncm91cCk7CiAJcHJfY29udCgiXG4iKTsKIApAQCAtMTUzMSw3ICsxNTQwLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWNoZWNrX3BhbmljX29uX29vbShDT05TVFJBSU5UX01FTUNHLCBnZnBfbWFzaywgb3JkZXIsIE5VTEwpOworCWNoZWNrX3BhbmljX29uX29vbShDT05TVFJBSU5UX01FTUNHLCBnZnBfbWFzaywgb3JkZXIsIE5VTEwsIG1lbWNnKTsKIAl0b3RhbHBhZ2VzID0gbWVtX2Nncm91cF9nZXRfbGltaXQobWVtY2cpID8gOiAxOwogCWZvcl9lYWNoX21lbV9jZ3JvdXBfdHJlZShpdGVyLCBtZW1jZykgewogCQlzdHJ1Y3QgY3NzX3Rhc2tfaXRlciBpdDsKQEAgLTIzNDEsMjAgKzIzNTAsNiBAQAogfQogCiAvKgotICogQSBoZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IG1lbV9jZ3JvdXAgZnJvbSBJRC4gbXVzdCBiZSBjYWxsZWQgdW5kZXIKLSAqIHJjdV9yZWFkX2xvY2soKS4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcKLSAqIGNzc190cnlnZXRfb25saW5lKCkgaWYgdGhlIG1lbV9jZ3JvdXAgaXMgdXNlZCBmb3IgY2hhcmdpbmcuIChkcm9wcGluZwotICogcmVmY250IGZyb20gc3dhcCBjYW4gYmUgY2FsbGVkIGFnYWluc3QgcmVtb3ZlZCBtZW1jZy4pCi0gKi8KLXN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtX2Nncm91cF9sb29rdXAodW5zaWduZWQgc2hvcnQgaWQpCi17Ci0JLyogSUQgMCBpcyB1bnVzZWQgSUQgKi8KLQlpZiAoIWlkKQotCQlyZXR1cm4gTlVMTDsKLQlyZXR1cm4gbWVtX2Nncm91cF9mcm9tX2lkKGlkKTsKLX0KLQotLyoKICAqIHRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX3BhZ2UgLSBsb29rIHVwIHBhZ2UncyBtZW1jZyBhc3NvY2lhdGlvbgogICogQHBhZ2U6IHRoZSBwYWdlCiAgKgpAQCAtMjM4MCw3ICsyMzc1LDcgQEAKIAkJZW50LnZhbCA9IHBhZ2VfcHJpdmF0ZShwYWdlKTsKIAkJaWQgPSBsb29rdXBfc3dhcF9jZ3JvdXBfaWQoZW50KTsKIAkJcmN1X3JlYWRfbG9jaygpOwotCQltZW1jZyA9IG1lbV9jZ3JvdXBfbG9va3VwKGlkKTsKKwkJbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21faWQoaWQpOwogCQlpZiAobWVtY2cgJiYgIWNzc190cnlnZXRfb25saW5lKCZtZW1jZy0+Y3NzKSkKIAkJCW1lbWNnID0gTlVMTDsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0yNjQyLDcgKzI2MzcsNyBAQAogCQlyZXR1cm4gY2FjaGVwOwogCiAJbWVtY2cgPSBnZXRfbWVtX2Nncm91cF9mcm9tX21tKGN1cnJlbnQtPm1tKTsKLQlrbWVtY2dfaWQgPSBBQ0NFU1NfT05DRShtZW1jZy0+a21lbWNnX2lkKTsKKwlrbWVtY2dfaWQgPSBSRUFEX09OQ0UobWVtY2ctPmttZW1jZ19pZCk7CiAJaWYgKGttZW1jZ19pZCA8IDApCiAJCWdvdG8gb3V0OwogCkBAIC0yNzc5LDkyICsyNzc0LDYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KIAotLyoqCi0gKiBtZW1fY2dyb3VwX21vdmVfYWNjb3VudCAtIG1vdmUgYWNjb3VudCBvZiB0aGUgcGFnZQotICogQHBhZ2U6IHRoZSBwYWdlCi0gKiBAbnJfcGFnZXM6IG51bWJlciBvZiByZWd1bGFyIHBhZ2VzICg+MSBmb3IgaHVnZSBwYWdlcykKLSAqIEBmcm9tOiBtZW1fY2dyb3VwIHdoaWNoIHRoZSBwYWdlIGlzIG1vdmVkIGZyb20uCi0gKiBAdG86CW1lbV9jZ3JvdXAgd2hpY2ggdGhlIHBhZ2UgaXMgbW92ZWQgdG8uIEBmcm9tICE9IEB0by4KLSAqCi0gKiBUaGUgY2FsbGVyIG11c3QgY29uZmlybSBmb2xsb3dpbmcuCi0gKiAtIHBhZ2UgaXMgbm90IG9uIExSVSAoaXNvbGF0ZV9wYWdlKCkgaXMgdXNlZnVsLikKLSAqIC0gY29tcG91bmRfbG9jayBpcyBoZWxkIHdoZW4gbnJfcGFnZXMgPiAxCi0gKgotICogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGRvICJjaGFyZ2UiIHRvIG5ldyBjZ3JvdXAgYW5kIGRvZXNuJ3QgZG8gInVuY2hhcmdlIgotICogZnJvbSBvbGQgY2dyb3VwLgotICovCi1zdGF0aWMgaW50IG1lbV9jZ3JvdXBfbW92ZV9hY2NvdW50KHN0cnVjdCBwYWdlICpwYWdlLAotCQkJCSAgIHVuc2lnbmVkIGludCBucl9wYWdlcywKLQkJCQkgICBzdHJ1Y3QgbWVtX2Nncm91cCAqZnJvbSwKLQkJCQkgICBzdHJ1Y3QgbWVtX2Nncm91cCAqdG8pCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwotCi0JVk1fQlVHX09OKGZyb20gPT0gdG8pOwotCVZNX0JVR19PTl9QQUdFKFBhZ2VMUlUocGFnZSksIHBhZ2UpOwotCS8qCi0JICogVGhlIHBhZ2UgaXMgaXNvbGF0ZWQgZnJvbSBMUlUuIFNvLCBjb2xsYXBzZSBmdW5jdGlvbgotCSAqIHdpbGwgbm90IGhhbmRsZSB0aGlzIHBhZ2UuIEJ1dCBwYWdlIHNwbGl0dGluZyBjYW4gaGFwcGVuLgotCSAqIERvIHRoaXMgY2hlY2sgdW5kZXIgY29tcG91bmRfcGFnZV9sb2NrKCkuIFRoZSBjYWxsZXIgc2hvdWxkCi0JICogaG9sZCBpdC4KLQkgKi8KLQlyZXQgPSAtRUJVU1k7Ci0JaWYgKG5yX3BhZ2VzID4gMSAmJiAhUGFnZVRyYW5zSHVnZShwYWdlKSkKLQkJZ290byBvdXQ7Ci0KLQkvKgotCSAqIFByZXZlbnQgbWVtX2Nncm91cF9taWdyYXRlKCkgZnJvbSBsb29raW5nIGF0IHBhZ2UtPm1lbV9jZ3JvdXAKLQkgKiBvZiBpdHMgc291cmNlIHBhZ2Ugd2hpbGUgd2UgY2hhbmdlIGl0OiBwYWdlIG1pZ3JhdGlvbiB0YWtlcwotCSAqIGJvdGggcGFnZXMgb2ZmIHRoZSBMUlUsIGJ1dCBwYWdlIGNhY2hlIHJlcGxhY2VtZW50IGRvZXNuJ3QuCi0JICovCi0JaWYgKCF0cnlsb2NrX3BhZ2UocGFnZSkpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gLUVJTlZBTDsKLQlpZiAocGFnZS0+bWVtX2Nncm91cCAhPSBmcm9tKQotCQlnb3RvIG91dF91bmxvY2s7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZnJvbS0+bW92ZV9sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIVBhZ2VBbm9uKHBhZ2UpICYmIHBhZ2VfbWFwcGVkKHBhZ2UpKSB7Ci0JCV9fdGhpc19jcHVfc3ViKGZyb20tPnN0YXQtPmNvdW50W01FTV9DR1JPVVBfU1RBVF9GSUxFX01BUFBFRF0sCi0JCQkgICAgICAgbnJfcGFnZXMpOwotCQlfX3RoaXNfY3B1X2FkZCh0by0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9TVEFUX0ZJTEVfTUFQUEVEXSwKLQkJCSAgICAgICBucl9wYWdlcyk7Ci0JfQotCi0JaWYgKFBhZ2VXcml0ZWJhY2socGFnZSkpIHsKLQkJX190aGlzX2NwdV9zdWIoZnJvbS0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9TVEFUX1dSSVRFQkFDS10sCi0JCQkgICAgICAgbnJfcGFnZXMpOwotCQlfX3RoaXNfY3B1X2FkZCh0by0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9TVEFUX1dSSVRFQkFDS10sCi0JCQkgICAgICAgbnJfcGFnZXMpOwotCX0KLQotCS8qCi0JICogSXQgaXMgc2FmZSB0byBjaGFuZ2UgcGFnZS0+bWVtX2Nncm91cCBoZXJlIGJlY2F1c2UgdGhlIHBhZ2UKLQkgKiBpcyByZWZlcmVuY2VkLCBjaGFyZ2VkLCBhbmQgaXNvbGF0ZWQgLSB3ZSBjYW4ndCByYWNlIHdpdGgKLQkgKiB1bmNoYXJnaW5nLCBjaGFyZ2luZywgbWlncmF0aW9uLCBvciBMUlUgcHV0YmFjay4KLQkgKi8KLQotCS8qIGNhbGxlciBzaG91bGQgaGF2ZSBkb25lIGNzc19nZXQgKi8KLQlwYWdlLT5tZW1fY2dyb3VwID0gdG87Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnJvbS0+bW92ZV9sb2NrLCBmbGFncyk7Ci0KLQlyZXQgPSAwOwotCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKHRvLCBwYWdlLCBucl9wYWdlcyk7Ci0JbWVtY2dfY2hlY2tfZXZlbnRzKHRvLCBwYWdlKTsKLQltZW1fY2dyb3VwX2NoYXJnZV9zdGF0aXN0aWNzKGZyb20sIHBhZ2UsIC1ucl9wYWdlcyk7Ci0JbWVtY2dfY2hlY2tfZXZlbnRzKGZyb20sIHBhZ2UpOwotCWxvY2FsX2lycV9lbmFibGUoKTsKLW91dF91bmxvY2s6Ci0JdW5sb2NrX3BhZ2UocGFnZSk7Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQogI2lmZGVmIENPTkZJR19NRU1DR19TV0FQCiBzdGF0aWMgdm9pZCBtZW1fY2dyb3VwX3N3YXBfc3RhdGlzdGljcyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2csCiAJCQkJCSBib29sIGNoYXJnZSkKQEAgLTQ4MTYsNiArNDcyNSw5MiBAQAogCXJldHVybiBwYWdlOwogfQogCisvKioKKyAqIG1lbV9jZ3JvdXBfbW92ZV9hY2NvdW50IC0gbW92ZSBhY2NvdW50IG9mIHRoZSBwYWdlCisgKiBAcGFnZTogdGhlIHBhZ2UKKyAqIEBucl9wYWdlczogbnVtYmVyIG9mIHJlZ3VsYXIgcGFnZXMgKD4xIGZvciBodWdlIHBhZ2VzKQorICogQGZyb206IG1lbV9jZ3JvdXAgd2hpY2ggdGhlIHBhZ2UgaXMgbW92ZWQgZnJvbS4KKyAqIEB0bzoJbWVtX2Nncm91cCB3aGljaCB0aGUgcGFnZSBpcyBtb3ZlZCB0by4gQGZyb20gIT0gQHRvLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBjb25maXJtIGZvbGxvd2luZy4KKyAqIC0gcGFnZSBpcyBub3Qgb24gTFJVIChpc29sYXRlX3BhZ2UoKSBpcyB1c2VmdWwuKQorICogLSBjb21wb3VuZF9sb2NrIGlzIGhlbGQgd2hlbiBucl9wYWdlcyA+IDEKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZG8gImNoYXJnZSIgdG8gbmV3IGNncm91cCBhbmQgZG9lc24ndCBkbyAidW5jaGFyZ2UiCisgKiBmcm9tIG9sZCBjZ3JvdXAuCisgKi8KK3N0YXRpYyBpbnQgbWVtX2Nncm91cF9tb3ZlX2FjY291bnQoc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgdW5zaWduZWQgaW50IG5yX3BhZ2VzLAorCQkJCSAgIHN0cnVjdCBtZW1fY2dyb3VwICpmcm9tLAorCQkJCSAgIHN0cnVjdCBtZW1fY2dyb3VwICp0bykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlWTV9CVUdfT04oZnJvbSA9PSB0byk7CisJVk1fQlVHX09OX1BBR0UoUGFnZUxSVShwYWdlKSwgcGFnZSk7CisJLyoKKwkgKiBUaGUgcGFnZSBpcyBpc29sYXRlZCBmcm9tIExSVS4gU28sIGNvbGxhcHNlIGZ1bmN0aW9uCisJICogd2lsbCBub3QgaGFuZGxlIHRoaXMgcGFnZS4gQnV0IHBhZ2Ugc3BsaXR0aW5nIGNhbiBoYXBwZW4uCisJICogRG8gdGhpcyBjaGVjayB1bmRlciBjb21wb3VuZF9wYWdlX2xvY2soKS4gVGhlIGNhbGxlciBzaG91bGQKKwkgKiBob2xkIGl0LgorCSAqLworCXJldCA9IC1FQlVTWTsKKwlpZiAobnJfcGFnZXMgPiAxICYmICFQYWdlVHJhbnNIdWdlKHBhZ2UpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogUHJldmVudCBtZW1fY2dyb3VwX21pZ3JhdGUoKSBmcm9tIGxvb2tpbmcgYXQgcGFnZS0+bWVtX2Nncm91cAorCSAqIG9mIGl0cyBzb3VyY2UgcGFnZSB3aGlsZSB3ZSBjaGFuZ2UgaXQ6IHBhZ2UgbWlncmF0aW9uIHRha2VzCisJICogYm90aCBwYWdlcyBvZmYgdGhlIExSVSwgYnV0IHBhZ2UgY2FjaGUgcmVwbGFjZW1lbnQgZG9lc24ndC4KKwkgKi8KKwlpZiAoIXRyeWxvY2tfcGFnZShwYWdlKSkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAtRUlOVkFMOworCWlmIChwYWdlLT5tZW1fY2dyb3VwICE9IGZyb20pCisJCWdvdG8gb3V0X3VubG9jazsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmcm9tLT5tb3ZlX2xvY2ssIGZsYWdzKTsKKworCWlmICghUGFnZUFub24ocGFnZSkgJiYgcGFnZV9tYXBwZWQocGFnZSkpIHsKKwkJX190aGlzX2NwdV9zdWIoZnJvbS0+c3RhdC0+Y291bnRbTUVNX0NHUk9VUF9TVEFUX0ZJTEVfTUFQUEVEXSwKKwkJCSAgICAgICBucl9wYWdlcyk7CisJCV9fdGhpc19jcHVfYWRkKHRvLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX1NUQVRfRklMRV9NQVBQRURdLAorCQkJICAgICAgIG5yX3BhZ2VzKTsKKwl9CisKKwlpZiAoUGFnZVdyaXRlYmFjayhwYWdlKSkgeworCQlfX3RoaXNfY3B1X3N1Yihmcm9tLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX1NUQVRfV1JJVEVCQUNLXSwKKwkJCSAgICAgICBucl9wYWdlcyk7CisJCV9fdGhpc19jcHVfYWRkKHRvLT5zdGF0LT5jb3VudFtNRU1fQ0dST1VQX1NUQVRfV1JJVEVCQUNLXSwKKwkJCSAgICAgICBucl9wYWdlcyk7CisJfQorCisJLyoKKwkgKiBJdCBpcyBzYWZlIHRvIGNoYW5nZSBwYWdlLT5tZW1fY2dyb3VwIGhlcmUgYmVjYXVzZSB0aGUgcGFnZQorCSAqIGlzIHJlZmVyZW5jZWQsIGNoYXJnZWQsIGFuZCBpc29sYXRlZCAtIHdlIGNhbid0IHJhY2Ugd2l0aAorCSAqIHVuY2hhcmdpbmcsIGNoYXJnaW5nLCBtaWdyYXRpb24sIG9yIExSVSBwdXRiYWNrLgorCSAqLworCisJLyogY2FsbGVyIHNob3VsZCBoYXZlIGRvbmUgY3NzX2dldCAqLworCXBhZ2UtPm1lbV9jZ3JvdXAgPSB0bzsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmcm9tLT5tb3ZlX2xvY2ssIGZsYWdzKTsKKworCXJldCA9IDA7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3ModG8sIHBhZ2UsIG5yX3BhZ2VzKTsKKwltZW1jZ19jaGVja19ldmVudHModG8sIHBhZ2UpOworCW1lbV9jZ3JvdXBfY2hhcmdlX3N0YXRpc3RpY3MoZnJvbSwgcGFnZSwgLW5yX3BhZ2VzKTsKKwltZW1jZ19jaGVja19ldmVudHMoZnJvbSwgcGFnZSk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworb3V0X3VubG9jazoKKwl1bmxvY2tfcGFnZShwYWdlKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgZW51bSBtY190YXJnZXRfdHlwZSBnZXRfbWN0Z3RfdHlwZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKIAkJdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCBwdGVudCwgdW5pb24gbWNfdGFyZ2V0ICp0YXJnZXQpCiB7CkBAIC01MDEyLDcgKzUwMDcsNyBAQAogCSAqIHR1bmFibGUgd2lsbCBvbmx5IGFmZmVjdCB1cGNvbWluZyBtaWdyYXRpb25zLCBub3QgdGhlIGN1cnJlbnQgb25lLgogCSAqIFNvIHdlIG5lZWQgdG8gc2F2ZSBpdCwgYW5kIGtlZXAgaXQgZ29pbmcuCiAJICovCi0JbW92ZV9mbGFncyA9IEFDQ0VTU19PTkNFKG1lbWNnLT5tb3ZlX2NoYXJnZV9hdF9pbW1pZ3JhdGUpOworCW1vdmVfZmxhZ3MgPSBSRUFEX09OQ0UobWVtY2ctPm1vdmVfY2hhcmdlX2F0X2ltbWlncmF0ZSk7CiAJaWYgKG1vdmVfZmxhZ3MpIHsKIAkJc3RydWN0IG1tX3N0cnVjdCAqbW07CiAJCXN0cnVjdCBtZW1fY2dyb3VwICpmcm9tID0gbWVtX2Nncm91cF9mcm9tX3Rhc2socCk7CkBAIC01MjQ2LDcgKzUyNDEsNyBAQAogc3RhdGljIGludCBtZW1vcnlfbG93X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jc3Moc2VxX2NzcyhtKSk7Ci0JdW5zaWduZWQgbG9uZyBsb3cgPSBBQ0NFU1NfT05DRShtZW1jZy0+bG93KTsKKwl1bnNpZ25lZCBsb25nIGxvdyA9IFJFQURfT05DRShtZW1jZy0+bG93KTsKIAogCWlmIChsb3cgPT0gUEFHRV9DT1VOVEVSX01BWCkKIAkJc2VxX3B1dHMobSwgIm1heFxuIik7CkBAIC01Mjc2LDcgKzUyNzEsNyBAQAogc3RhdGljIGludCBtZW1vcnlfaGlnaF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY3NzKHNlcV9jc3MobSkpOwotCXVuc2lnbmVkIGxvbmcgaGlnaCA9IEFDQ0VTU19PTkNFKG1lbWNnLT5oaWdoKTsKKwl1bnNpZ25lZCBsb25nIGhpZ2ggPSBSRUFEX09OQ0UobWVtY2ctPmhpZ2gpOwogCiAJaWYgKGhpZ2ggPT0gUEFHRV9DT1VOVEVSX01BWCkKIAkJc2VxX3B1dHMobSwgIm1heFxuIik7CkBAIC01MzA2LDcgKzUzMDEsNyBAQAogc3RhdGljIGludCBtZW1vcnlfbWF4X3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jc3Moc2VxX2NzcyhtKSk7Ci0JdW5zaWduZWQgbG9uZyBtYXggPSBBQ0NFU1NfT05DRShtZW1jZy0+bWVtb3J5LmxpbWl0KTsKKwl1bnNpZ25lZCBsb25nIG1heCA9IFJFQURfT05DRShtZW1jZy0+bWVtb3J5LmxpbWl0KTsKIAogCWlmIChtYXggPT0gUEFHRV9DT1VOVEVSX01BWCkKIAkJc2VxX3B1dHMobSwgIm1heFxuIik7CkBAIC01ODYxLDcgKzU4NTYsNyBAQAogCiAJaWQgPSBzd2FwX2Nncm91cF9yZWNvcmQoZW50cnksIDApOwogCXJjdV9yZWFkX2xvY2soKTsKLQltZW1jZyA9IG1lbV9jZ3JvdXBfbG9va3VwKGlkKTsKKwltZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9pZChpZCk7CiAJaWYgKG1lbWNnKSB7CiAJCWlmICghbWVtX2Nncm91cF9pc19yb290KG1lbWNnKSkKIAkJCXBhZ2VfY291bnRlcl91bmNoYXJnZSgmbWVtY2ctPm1lbXN3LCAxKTsKZGlmZiAtLWdpdCBhL21tL21lbW9yeS1mYWlsdXJlLmMgYi9tbS9tZW1vcnktZmFpbHVyZS5jCmluZGV4IGQ0ODdmOGQuLmQ5MzU5YjcgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS1mYWlsdXJlLmMKKysrIGIvbW0vbWVtb3J5LWZhaWx1cmUuYwpAQCAtNTIxLDYgKzUyMSw1MiBAQAogCVtSRUNPVkVSRURdID0gIlJlY292ZXJlZCIsCiB9OwogCitlbnVtIGFjdGlvbl9wYWdlX3R5cGUgeworCU1TR19LRVJORUwsCisJTVNHX0tFUk5FTF9ISUdIX09SREVSLAorCU1TR19TTEFCLAorCU1TR19ESUZGRVJFTlRfQ09NUE9VTkQsCisJTVNHX1BPSVNPTkVEX0hVR0UsCisJTVNHX0hVR0UsCisJTVNHX0ZSRUVfSFVHRSwKKwlNU0dfVU5NQVBfRkFJTEVELAorCU1TR19ESVJUWV9TV0FQQ0FDSEUsCisJTVNHX0NMRUFOX1NXQVBDQUNIRSwKKwlNU0dfRElSVFlfTUxPQ0tFRF9MUlUsCisJTVNHX0NMRUFOX01MT0NLRURfTFJVLAorCU1TR19ESVJUWV9VTkVWSUNUQUJMRV9MUlUsCisJTVNHX0NMRUFOX1VORVZJQ1RBQkxFX0xSVSwKKwlNU0dfRElSVFlfTFJVLAorCU1TR19DTEVBTl9MUlUsCisJTVNHX1RSVU5DQVRFRF9MUlUsCisJTVNHX0JVRERZLAorCU1TR19CVUREWV8yTkQsCisJTVNHX1VOS05PV04sCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFjdGlvbl9wYWdlX3R5cGVzW10gPSB7CisJW01TR19LRVJORUxdCQkJPSAicmVzZXJ2ZWQga2VybmVsIHBhZ2UiLAorCVtNU0dfS0VSTkVMX0hJR0hfT1JERVJdCQk9ICJoaWdoLW9yZGVyIGtlcm5lbCBwYWdlIiwKKwlbTVNHX1NMQUJdCQkJPSAia2VybmVsIHNsYWIgcGFnZSIsCisJW01TR19ESUZGRVJFTlRfQ09NUE9VTkRdCT0gImRpZmZlcmVudCBjb21wb3VuZCBwYWdlIGFmdGVyIGxvY2tpbmciLAorCVtNU0dfUE9JU09ORURfSFVHRV0JCT0gImh1Z2UgcGFnZSBhbHJlYWR5IGhhcmR3YXJlIHBvaXNvbmVkIiwKKwlbTVNHX0hVR0VdCQkJPSAiaHVnZSBwYWdlIiwKKwlbTVNHX0ZSRUVfSFVHRV0JCQk9ICJmcmVlIGh1Z2UgcGFnZSIsCisJW01TR19VTk1BUF9GQUlMRURdCQk9ICJ1bm1hcHBpbmcgZmFpbGVkIHBhZ2UiLAorCVtNU0dfRElSVFlfU1dBUENBQ0hFXQkJPSAiZGlydHkgc3dhcGNhY2hlIHBhZ2UiLAorCVtNU0dfQ0xFQU5fU1dBUENBQ0hFXQkJPSAiY2xlYW4gc3dhcGNhY2hlIHBhZ2UiLAorCVtNU0dfRElSVFlfTUxPQ0tFRF9MUlVdCQk9ICJkaXJ0eSBtbG9ja2VkIExSVSBwYWdlIiwKKwlbTVNHX0NMRUFOX01MT0NLRURfTFJVXQkJPSAiY2xlYW4gbWxvY2tlZCBMUlUgcGFnZSIsCisJW01TR19ESVJUWV9VTkVWSUNUQUJMRV9MUlVdCT0gImRpcnR5IHVuZXZpY3RhYmxlIExSVSBwYWdlIiwKKwlbTVNHX0NMRUFOX1VORVZJQ1RBQkxFX0xSVV0JPSAiY2xlYW4gdW5ldmljdGFibGUgTFJVIHBhZ2UiLAorCVtNU0dfRElSVFlfTFJVXQkJCT0gImRpcnR5IExSVSBwYWdlIiwKKwlbTVNHX0NMRUFOX0xSVV0JCQk9ICJjbGVhbiBMUlUgcGFnZSIsCisJW01TR19UUlVOQ0FURURfTFJVXQkJPSAiYWxyZWFkeSB0cnVuY2F0ZWQgTFJVIHBhZ2UiLAorCVtNU0dfQlVERFldCQkJPSAiZnJlZSBidWRkeSBwYWdlIiwKKwlbTVNHX0JVRERZXzJORF0JCQk9ICJmcmVlIGJ1ZGR5IHBhZ2UgKDJuZCB0cnkpIiwKKwlbTVNHX1VOS05PV05dCQkJPSAidW5rbm93biBwYWdlIiwKK307CisKIC8qCiAgKiBYWFg6IEl0IGlzIHBvc3NpYmxlIHRoYXQgYSBwYWdlIGlzIGlzb2xhdGVkIGZyb20gTFJVIGNhY2hlLAogICogYW5kIHRoZW4ga2VwdCBpbiBzd2FwIGNhY2hlIG9yIGZhaWxlZCB0byByZW1vdmUgZnJvbSBwYWdlIGNhY2hlLgpAQCAtNzc3LDEwICs4MjMsMTAgQEAKIHN0YXRpYyBzdHJ1Y3QgcGFnZV9zdGF0ZSB7CiAJdW5zaWduZWQgbG9uZyBtYXNrOwogCXVuc2lnbmVkIGxvbmcgcmVzOwotCWNoYXIgKm1zZzsKKwllbnVtIGFjdGlvbl9wYWdlX3R5cGUgdHlwZTsKIAlpbnQgKCphY3Rpb24pKHN0cnVjdCBwYWdlICpwLCB1bnNpZ25lZCBsb25nIHBmbik7CiB9IGVycm9yX3N0YXRlc1tdID0gewotCXsgcmVzZXJ2ZWQsCXJlc2VydmVkLAkicmVzZXJ2ZWQga2VybmVsIiwJbWVfa2VybmVsIH0sCisJeyByZXNlcnZlZCwJcmVzZXJ2ZWQsCU1TR19LRVJORUwsCW1lX2tlcm5lbCB9LAogCS8qCiAJICogZnJlZSBwYWdlcyBhcmUgc3BlY2lhbGx5IGRldGVjdGVkIG91dHNpZGUgdGhpcyB0YWJsZToKIAkgKiBQR19idWRkeSBwYWdlcyBvbmx5IG1ha2UgYSBzbWFsbCBmcmFjdGlvbiBvZiBhbGwgZnJlZSBwYWdlcy4KQEAgLTc5MSwzMSArODM3LDMxIEBACiAJICogY3VycmVudGx5IHVudXNlZCBvYmplY3RzIHdpdGhvdXQgdG91Y2hpbmcgdGhlbS4gQnV0IGp1c3QKIAkgKiB0cmVhdCBpdCBhcyBzdGFuZGFyZCBrZXJuZWwgZm9yIG5vdy4KIAkgKi8KLQl7IHNsYWIsCQlzbGFiLAkJImtlcm5lbCBzbGFiIiwJbWVfa2VybmVsIH0sCisJeyBzbGFiLAkJc2xhYiwJCU1TR19TTEFCLAltZV9rZXJuZWwgfSwKIAogI2lmZGVmIENPTkZJR19QQUdFRkxBR1NfRVhURU5ERUQKLQl7IGhlYWQsCQloZWFkLAkJImh1Z2UiLAkJbWVfaHVnZV9wYWdlIH0sCi0JeyB0YWlsLAkJdGFpbCwJCSJodWdlIiwJCW1lX2h1Z2VfcGFnZSB9LAorCXsgaGVhZCwJCWhlYWQsCQlNU0dfSFVHRSwJCW1lX2h1Z2VfcGFnZSB9LAorCXsgdGFpbCwJCXRhaWwsCQlNU0dfSFVHRSwJCW1lX2h1Z2VfcGFnZSB9LAogI2Vsc2UKLQl7IGNvbXBvdW5kLAljb21wb3VuZCwJImh1Z2UiLAkJbWVfaHVnZV9wYWdlIH0sCisJeyBjb21wb3VuZCwJY29tcG91bmQsCU1TR19IVUdFLAkJbWVfaHVnZV9wYWdlIH0sCiAjZW5kaWYKIAotCXsgc2N8ZGlydHksCXNjfGRpcnR5LAkiZGlydHkgc3dhcGNhY2hlIiwJbWVfc3dhcGNhY2hlX2RpcnR5IH0sCi0JeyBzY3xkaXJ0eSwJc2MsCQkiY2xlYW4gc3dhcGNhY2hlIiwJbWVfc3dhcGNhY2hlX2NsZWFuIH0sCisJeyBzY3xkaXJ0eSwJc2N8ZGlydHksCU1TR19ESVJUWV9TV0FQQ0FDSEUsCW1lX3N3YXBjYWNoZV9kaXJ0eSB9LAorCXsgc2N8ZGlydHksCXNjLAkJTVNHX0NMRUFOX1NXQVBDQUNIRSwJbWVfc3dhcGNhY2hlX2NsZWFuIH0sCiAKLQl7IG1sb2NrfGRpcnR5LAltbG9ja3xkaXJ0eSwJImRpcnR5IG1sb2NrZWQgTFJVIiwJbWVfcGFnZWNhY2hlX2RpcnR5IH0sCi0JeyBtbG9ja3xkaXJ0eSwJbWxvY2ssCQkiY2xlYW4gbWxvY2tlZCBMUlUiLAltZV9wYWdlY2FjaGVfY2xlYW4gfSwKKwl7IG1sb2NrfGRpcnR5LAltbG9ja3xkaXJ0eSwJTVNHX0RJUlRZX01MT0NLRURfTFJVLAltZV9wYWdlY2FjaGVfZGlydHkgfSwKKwl7IG1sb2NrfGRpcnR5LAltbG9jaywJCU1TR19DTEVBTl9NTE9DS0VEX0xSVSwJbWVfcGFnZWNhY2hlX2NsZWFuIH0sCiAKLQl7IHVuZXZpY3R8ZGlydHksIHVuZXZpY3R8ZGlydHksCSJkaXJ0eSB1bmV2aWN0YWJsZSBMUlUiLCBtZV9wYWdlY2FjaGVfZGlydHkgfSwKLQl7IHVuZXZpY3R8ZGlydHksIHVuZXZpY3QsCSJjbGVhbiB1bmV2aWN0YWJsZSBMUlUiLCBtZV9wYWdlY2FjaGVfY2xlYW4gfSwKKwl7IHVuZXZpY3R8ZGlydHksIHVuZXZpY3R8ZGlydHksCU1TR19ESVJUWV9VTkVWSUNUQUJMRV9MUlUsCW1lX3BhZ2VjYWNoZV9kaXJ0eSB9LAorCXsgdW5ldmljdHxkaXJ0eSwgdW5ldmljdCwJTVNHX0NMRUFOX1VORVZJQ1RBQkxFX0xSVSwJbWVfcGFnZWNhY2hlX2NsZWFuIH0sCiAKLQl7IGxydXxkaXJ0eSwJbHJ1fGRpcnR5LAkiZGlydHkgTFJVIiwJbWVfcGFnZWNhY2hlX2RpcnR5IH0sCi0JeyBscnV8ZGlydHksCWxydSwJCSJjbGVhbiBMUlUiLAltZV9wYWdlY2FjaGVfY2xlYW4gfSwKKwl7IGxydXxkaXJ0eSwJbHJ1fGRpcnR5LAlNU0dfRElSVFlfTFJVLAltZV9wYWdlY2FjaGVfZGlydHkgfSwKKwl7IGxydXxkaXJ0eSwJbHJ1LAkJTVNHX0NMRUFOX0xSVSwJbWVfcGFnZWNhY2hlX2NsZWFuIH0sCiAKIAkvKgogCSAqIENhdGNoYWxsIGVudHJ5OiBtdXN0IGJlIGF0IGVuZC4KIAkgKi8KLQl7IDAsCQkwLAkJInVua25vd24gcGFnZSBzdGF0ZSIsCW1lX3Vua25vd24gfSwKKwl7IDAsCQkwLAkJTVNHX1VOS05PV04sCW1lX3Vua25vd24gfSwKIH07CiAKICN1bmRlZiBkaXJ0eQpAQCAtODM1LDEwICs4ODEsMTAgQEAKICAqICJEaXJ0eS9DbGVhbiIgaW5kaWNhdGlvbiBpcyBub3QgMTAwJSBhY2N1cmF0ZSBkdWUgdG8gdGhlIHBvc3NpYmlsaXR5IG9mCiAgKiBzZXR0aW5nIFBHX2RpcnR5IG91dHNpZGUgcGFnZSBsb2NrLiBTZWUgYWxzbyBjb21tZW50IGFib3ZlIHNldF9wYWdlX2RpcnR5KCkuCiAgKi8KLXN0YXRpYyB2b2lkIGFjdGlvbl9yZXN1bHQodW5zaWduZWQgbG9uZyBwZm4sIGNoYXIgKm1zZywgaW50IHJlc3VsdCkKK3N0YXRpYyB2b2lkIGFjdGlvbl9yZXN1bHQodW5zaWduZWQgbG9uZyBwZm4sIGVudW0gYWN0aW9uX3BhZ2VfdHlwZSB0eXBlLCBpbnQgcmVzdWx0KQogewotCXByX2VycigiTUNFICUjbHg6ICVzIHBhZ2UgcmVjb3Zlcnk6ICVzXG4iLAotCQlwZm4sIG1zZywgYWN0aW9uX25hbWVbcmVzdWx0XSk7CisJcHJfZXJyKCJNQ0UgJSNseDogcmVjb3ZlcnkgYWN0aW9uIGZvciAlczogJXNcbiIsCisJCXBmbiwgYWN0aW9uX3BhZ2VfdHlwZXNbdHlwZV0sIGFjdGlvbl9uYW1lW3Jlc3VsdF0pOwogfQogCiBzdGF0aWMgaW50IHBhZ2VfYWN0aW9uKHN0cnVjdCBwYWdlX3N0YXRlICpwcywgc3RydWN0IHBhZ2UgKnAsCkBAIC04NTQsMTEgKzkwMCwxMSBAQAogCQljb3VudC0tOwogCWlmIChjb3VudCAhPSAwKSB7CiAJCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIk1DRSAlI2x4OiAlcyBwYWdlIHN0aWxsIHJlZmVyZW5jZWQgYnkgJWQgdXNlcnNcbiIsCi0JCSAgICAgICBwZm4sIHBzLT5tc2csIGNvdW50KTsKKwkJICAgICAgICJNQ0UgJSNseDogJXMgc3RpbGwgcmVmZXJlbmNlZCBieSAlZCB1c2Vyc1xuIiwKKwkJICAgICAgIHBmbiwgYWN0aW9uX3BhZ2VfdHlwZXNbcHMtPnR5cGVdLCBjb3VudCk7CiAJCXJlc3VsdCA9IEZBSUxFRDsKIAl9Ci0JYWN0aW9uX3Jlc3VsdChwZm4sIHBzLT5tc2csIHJlc3VsdCk7CisJYWN0aW9uX3Jlc3VsdChwZm4sIHBzLT50eXBlLCByZXN1bHQpOwogCiAJLyogQ291bGQgZG8gbW9yZSBjaGVja3MgaGVyZSBpZiBwYWdlIGxvb2tzIG9rICovCiAJLyoKQEAgLTExMDYsNyArMTE1Miw3IEBACiAJaWYgKCEoZmxhZ3MgJiBNRl9DT1VOVF9JTkNSRUFTRUQpICYmCiAJCSFnZXRfcGFnZV91bmxlc3NfemVybyhocGFnZSkpIHsKIAkJaWYgKGlzX2ZyZWVfYnVkZHlfcGFnZShwKSkgewotCQkJYWN0aW9uX3Jlc3VsdChwZm4sICJmcmVlIGJ1ZGR5IiwgREVMQVlFRCk7CisJCQlhY3Rpb25fcmVzdWx0KHBmbiwgTVNHX0JVRERZLCBERUxBWUVEKTsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UgaWYgKFBhZ2VIdWdlKGhwYWdlKSkgewogCQkJLyoKQEAgLTExMjMsMTIgKzExNjksMTIgQEAKIAkJCX0KIAkJCXNldF9wYWdlX2h3cG9pc29uX2h1Z2VfcGFnZShocGFnZSk7CiAJCQlyZXMgPSBkZXF1ZXVlX2h3cG9pc29uZWRfaHVnZV9wYWdlKGhwYWdlKTsKLQkJCWFjdGlvbl9yZXN1bHQocGZuLCAiZnJlZSBodWdlIiwKKwkJCWFjdGlvbl9yZXN1bHQocGZuLCBNU0dfRlJFRV9IVUdFLAogCQkJCSAgICAgIHJlcyA/IElHTk9SRUQgOiBERUxBWUVEKTsKIAkJCXVubG9ja19wYWdlKGhwYWdlKTsKIAkJCXJldHVybiByZXM7CiAJCX0gZWxzZSB7Ci0JCQlhY3Rpb25fcmVzdWx0KHBmbiwgImhpZ2ggb3JkZXIga2VybmVsIiwgSUdOT1JFRCk7CisJCQlhY3Rpb25fcmVzdWx0KHBmbiwgTVNHX0tFUk5FTF9ISUdIX09SREVSLCBJR05PUkVEKTsKIAkJCXJldHVybiAtRUJVU1k7CiAJCX0KIAl9CkBAIC0xMTUwLDkgKzExOTYsMTAgQEAKIAkJCSAqLwogCQkJaWYgKGlzX2ZyZWVfYnVkZHlfcGFnZShwKSkgewogCQkJCWlmIChmbGFncyAmIE1GX0NPVU5UX0lOQ1JFQVNFRCkKLQkJCQkJYWN0aW9uX3Jlc3VsdChwZm4sICJmcmVlIGJ1ZGR5IiwgREVMQVlFRCk7CisJCQkJCWFjdGlvbl9yZXN1bHQocGZuLCBNU0dfQlVERFksIERFTEFZRUQpOwogCQkJCWVsc2UKLQkJCQkJYWN0aW9uX3Jlc3VsdChwZm4sICJmcmVlIGJ1ZGR5LCAybmQgdHJ5IiwgREVMQVlFRCk7CisJCQkJCWFjdGlvbl9yZXN1bHQocGZuLCBNU0dfQlVERFlfMk5ELAorCQkJCQkJICAgICAgREVMQVlFRCk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KQEAgLTExNjUsNyArMTIxMiw3IEBACiAJICogSWYgdGhpcyBoYXBwZW5zIGp1c3QgYmFpbCBvdXQuCiAJICovCiAJaWYgKGNvbXBvdW5kX2hlYWQocCkgIT0gaHBhZ2UpIHsKLQkJYWN0aW9uX3Jlc3VsdChwZm4sICJkaWZmZXJlbnQgY29tcG91bmQgcGFnZSBhZnRlciBsb2NraW5nIiwgSUdOT1JFRCk7CisJCWFjdGlvbl9yZXN1bHQocGZuLCBNU0dfRElGRkVSRU5UX0NPTVBPVU5ELCBJR05PUkVEKTsKIAkJcmVzID0gLUVCVVNZOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMjA1LDggKzEyNTIsNyBAQAogCSAqIG9uIHRoZSBoZWFkIHBhZ2UgdG8gc2hvdyB0aGF0IHRoZSBodWdlcGFnZSBpcyBod3BvaXNvbmVkCiAJICovCiAJaWYgKFBhZ2VIdWdlKHApICYmIFBhZ2VUYWlsKHApICYmIFRlc3RTZXRQYWdlSFdQb2lzb24oaHBhZ2UpKSB7Ci0JCWFjdGlvbl9yZXN1bHQocGZuLCAiaHVnZXBhZ2UgYWxyZWFkeSBoYXJkd2FyZSBwb2lzb25lZCIsCi0JCQkJSUdOT1JFRCk7CisJCWFjdGlvbl9yZXN1bHQocGZuLCBNU0dfUE9JU09ORURfSFVHRSwgSUdOT1JFRCk7CiAJCXVubG9ja19wYWdlKGhwYWdlKTsKIAkJcHV0X3BhZ2UoaHBhZ2UpOwogCQlyZXR1cm4gMDsKQEAgLTEyMzUsNyArMTI4MSw3IEBACiAJICovCiAJaWYgKGh3cG9pc29uX3VzZXJfbWFwcGluZ3MocCwgcGZuLCB0cmFwbm8sIGZsYWdzLCAmaHBhZ2UpCiAJICAgICE9IFNXQVBfU1VDQ0VTUykgewotCQlhY3Rpb25fcmVzdWx0KHBmbiwgInVubWFwcGluZyBmYWlsZWQiLCBJR05PUkVEKTsKKwkJYWN0aW9uX3Jlc3VsdChwZm4sIE1TR19VTk1BUF9GQUlMRUQsIElHTk9SRUQpOwogCQlyZXMgPSAtRUJVU1k7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTEyNDQsNyArMTI5MCw3IEBACiAJICogVG9ybiBkb3duIGJ5IHNvbWVvbmUgZWxzZT8KIAkgKi8KIAlpZiAoUGFnZUxSVShwKSAmJiAhUGFnZVN3YXBDYWNoZShwKSAmJiBwLT5tYXBwaW5nID09IE5VTEwpIHsKLQkJYWN0aW9uX3Jlc3VsdChwZm4sICJhbHJlYWR5IHRydW5jYXRlZCBMUlUiLCBJR05PUkVEKTsKKwkJYWN0aW9uX3Jlc3VsdChwZm4sIE1TR19UUlVOQ0FURURfTFJVLCBJR05PUkVEKTsKIAkJcmVzID0gLUVCVVNZOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNTQwLDggKzE1ODYsMTggQEAKIAl9CiAJdW5sb2NrX3BhZ2UoaHBhZ2UpOwogCi0JLyogS2VlcCBwYWdlIGNvdW50IHRvIGluZGljYXRlIGEgZ2l2ZW4gaHVnZXBhZ2UgaXMgaXNvbGF0ZWQuICovCi0JbGlzdF9tb3ZlKCZocGFnZS0+bHJ1LCAmcGFnZWxpc3QpOworCXJldCA9IGlzb2xhdGVfaHVnZV9wYWdlKGhwYWdlLCAmcGFnZWxpc3QpOworCWlmIChyZXQpIHsKKwkJLyoKKwkJICogZ2V0X2FueV9wYWdlKCkgYW5kIGlzb2xhdGVfaHVnZV9wYWdlKCkgdGFrZXMgYSByZWZjb3VudCBlYWNoLAorCQkgKiBzbyBuZWVkIHRvIGRyb3Agb25lIGhlcmUuCisJCSAqLworCQlwdXRfcGFnZShocGFnZSk7CisJfSBlbHNlIHsKKwkJcHJfaW5mbygic29mdCBvZmZsaW5lOiAlI2x4IGh1Z2VwYWdlIGZhaWxlZCB0byBpc29sYXRlXG4iLCBwZm4pOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwogCXJldCA9IG1pZ3JhdGVfcGFnZXMoJnBhZ2VsaXN0LCBuZXdfcGFnZSwgTlVMTCwgTVBPTF9NRl9NT1ZFX0FMTCwKIAkJCQlNSUdSQVRFX1NZTkMsIE1SX01FTU9SWV9GQUlMVVJFKTsKIAlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9tbS9tZW1vcnkuYyBiL21tL21lbW9yeS5jCmluZGV4IDQxMTE0NGYuLjIyZTAzN2UgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS5jCisrKyBiL21tL21lbW9yeS5jCkBAIC02OTAsMTIgKzY5MCwxMSBAQAogCS8qCiAJICogQ2hvb3NlIHRleHQgYmVjYXVzZSBkYXRhIHN5bWJvbHMgZGVwZW5kIG9uIENPTkZJR19LQUxMU1lNU19BTEw9eQogCSAqLwotCWlmICh2bWEtPnZtX29wcykKLQkJcHJpbnRrKEtFUk5fQUxFUlQgInZtYS0+dm1fb3BzLT5mYXVsdDogJXBTUlxuIiwKLQkJICAgICAgIHZtYS0+dm1fb3BzLT5mYXVsdCk7Ci0JaWYgKHZtYS0+dm1fZmlsZSkKLQkJcHJpbnRrKEtFUk5fQUxFUlQgInZtYS0+dm1fZmlsZS0+Zl9vcC0+bW1hcDogJXBTUlxuIiwKLQkJICAgICAgIHZtYS0+dm1fZmlsZS0+Zl9vcC0+bW1hcCk7CisJcHJfYWxlcnQoImZpbGU6JXBEIGZhdWx0OiVwZiBtbWFwOiVwZiByZWFkcGFnZTolcGZcbiIsCisJCSB2bWEtPnZtX2ZpbGUsCisJCSB2bWEtPnZtX29wcyA/IHZtYS0+dm1fb3BzLT5mYXVsdCA6IE5VTEwsCisJCSB2bWEtPnZtX2ZpbGUgPyB2bWEtPnZtX2ZpbGUtPmZfb3AtPm1tYXAgOiBOVUxMLAorCQkgbWFwcGluZyA/IG1hcHBpbmctPmFfb3BzLT5yZWFkcGFnZSA6IE5VTEwpOwogCWR1bXBfc3RhY2soKTsKIAlhZGRfdGFpbnQoVEFJTlRfQkFEX1BBR0UsIExPQ0tERVBfTk9XX1VOUkVMSUFCTEUpOwogfQpAQCAtMTk4MywxNjggKzE5ODIsOTIgQEAKIH0KIAogLyoKLSAqIFRoaXMgcm91dGluZSBoYW5kbGVzIHByZXNlbnQgcGFnZXMsIHdoZW4gdXNlcnMgdHJ5IHRvIHdyaXRlCi0gKiB0byBhIHNoYXJlZCBwYWdlLiBJdCBpcyBkb25lIGJ5IGNvcHlpbmcgdGhlIHBhZ2UgdG8gYSBuZXcgYWRkcmVzcwotICogYW5kIGRlY3JlbWVudGluZyB0aGUgc2hhcmVkLXBhZ2UgY291bnRlciBmb3IgdGhlIG9sZCBwYWdlLgorICogSGFuZGxlIHdyaXRlIHBhZ2UgZmF1bHRzIGZvciBwYWdlcyB0aGF0IGNhbiBiZSByZXVzZWQgaW4gdGhlIGN1cnJlbnQgdm1hCiAgKgotICogTm90ZSB0aGF0IHRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIHByb3RlY3Rpb24gY2hlY2tzIGhhdmUgYmVlbgotICogZG9uZSBieSB0aGUgY2FsbGVyICh0aGUgbG93LWxldmVsIHBhZ2UgZmF1bHQgcm91dGluZSBpbiBtb3N0IGNhc2VzKS4KLSAqIFRodXMgd2UgY2FuIHNhZmVseSBqdXN0IG1hcmsgaXQgd3JpdGFibGUgb25jZSB3ZSd2ZSBkb25lIGFueSBuZWNlc3NhcnkKLSAqIENPVy4KLSAqCi0gKiBXZSBhbHNvIG1hcmsgdGhlIHBhZ2UgZGlydHkgYXQgdGhpcyBwb2ludCBldmVuIHRob3VnaCB0aGUgcGFnZSB3aWxsCi0gKiBjaGFuZ2Ugb25seSBvbmNlIHRoZSB3cml0ZSBhY3R1YWxseSBoYXBwZW5zLiBUaGlzIGF2b2lkcyBhIGZldyByYWNlcywKLSAqIGFuZCBwb3RlbnRpYWxseSBtYWtlcyBpdCBtb3JlIGVmZmljaWVudC4KLSAqCi0gKiBXZSBlbnRlciB3aXRoIG5vbi1leGNsdXNpdmUgbW1hcF9zZW0gKHRvIGV4Y2x1ZGUgdm1hIGNoYW5nZXMsCi0gKiBidXQgYWxsb3cgY29uY3VycmVudCBmYXVsdHMpLCB3aXRoIHB0ZSBib3RoIG1hcHBlZCBhbmQgbG9ja2VkLgotICogV2UgcmV0dXJuIHdpdGggbW1hcF9zZW0gc3RpbGwgaGVsZCwgYnV0IHB0ZSB1bm1hcHBlZCBhbmQgdW5sb2NrZWQuCisgKiBUaGlzIGNhbiBoYXBwZW4gZWl0aGVyIGR1ZSB0byB0aGUgbWFwcGluZyBiZWluZyB3aXRoIHRoZSBWTV9TSEFSRUQgZmxhZywKKyAqIG9yIGR1ZSB0byB1cyBiZWluZyB0aGUgbGFzdCByZWZlcmVuY2Ugc3RhbmRpbmcgdG8gdGhlIHBhZ2UuIEluIGVpdGhlcgorICogY2FzZSwgYWxsIHdlIG5lZWQgdG8gZG8gaGVyZSBpcyB0byBtYXJrIHRoZSBwYWdlIGFzIHdyaXRhYmxlIGFuZCB1cGRhdGUKKyAqIGFueSByZWxhdGVkIGJvb2sta2VlcGluZy4KICAqLwotc3RhdGljIGludCBkb193cF9wYWdlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwKLQkJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBwdGVfdCAqcGFnZV90YWJsZSwgcG1kX3QgKnBtZCwKLQkJc3BpbmxvY2tfdCAqcHRsLCBwdGVfdCBvcmlnX3B0ZSkKK3N0YXRpYyBpbmxpbmUgaW50IHdwX3BhZ2VfcmV1c2Uoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJcHRlX3QgKnBhZ2VfdGFibGUsIHNwaW5sb2NrX3QgKnB0bCwgcHRlX3Qgb3JpZ19wdGUsCisJCQlzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHBhZ2VfbWt3cml0ZSwKKwkJCWludCBkaXJ0eV9zaGFyZWQpCiAJX19yZWxlYXNlcyhwdGwpCiB7Ci0Jc3RydWN0IHBhZ2UgKm9sZF9wYWdlLCAqbmV3X3BhZ2UgPSBOVUxMOwogCXB0ZV90IGVudHJ5OwotCWludCByZXQgPSAwOwotCWludCBwYWdlX21rd3JpdGUgPSAwOwotCWJvb2wgZGlydHlfc2hhcmVkID0gZmFsc2U7Ci0JdW5zaWduZWQgbG9uZyBtbXVuX3N0YXJ0ID0gMDsJLyogRm9yIG1tdV9ub3RpZmllcnMgKi8KLQl1bnNpZ25lZCBsb25nIG1tdW5fZW5kID0gMDsJLyogRm9yIG1tdV9ub3RpZmllcnMgKi8KLQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7Ci0KLQlvbGRfcGFnZSA9IHZtX25vcm1hbF9wYWdlKHZtYSwgYWRkcmVzcywgb3JpZ19wdGUpOwotCWlmICghb2xkX3BhZ2UpIHsKLQkJLyoKLQkJICogVk1fTUlYRURNQVAgIXBmbl92YWxpZCgpIGNhc2UsIG9yIFZNX1NPRlRESVJUWSBjbGVhciBvbiBhCi0JCSAqIFZNX1BGTk1BUCBWTUEuCi0JCSAqCi0JCSAqIFdlIHNob3VsZCBub3QgY293IHBhZ2VzIGluIGEgc2hhcmVkIHdyaXRlYWJsZSBtYXBwaW5nLgotCQkgKiBKdXN0IG1hcmsgdGhlIHBhZ2VzIHdyaXRhYmxlIGFzIHdlIGNhbid0IGRvIGFueSBkaXJ0eQotCQkgKiBhY2NvdW50aW5nIG9uIHJhdyBwZm4gbWFwcy4KLQkJICovCi0JCWlmICgodm1hLT52bV9mbGFncyAmIChWTV9XUklURXxWTV9TSEFSRUQpKSA9PQotCQkJCSAgICAgKFZNX1dSSVRFfFZNX1NIQVJFRCkpCi0JCQlnb3RvIHJldXNlOwotCQlnb3RvIGdvdHRlbjsKLQl9Ci0KIAkvKgotCSAqIFRha2Ugb3V0IGFub255bW91cyBwYWdlcyBmaXJzdCwgYW5vbnltb3VzIHNoYXJlZCB2bWFzIGFyZQotCSAqIG5vdCBkaXJ0eSBhY2NvdW50YWJsZS4KKwkgKiBDbGVhciB0aGUgcGFnZXMgY3B1cGlkIGluZm9ybWF0aW9uIGFzIHRoZSBleGlzdGluZworCSAqIGluZm9ybWF0aW9uIHBvdGVudGlhbGx5IGJlbG9uZ3MgdG8gYSBub3cgY29tcGxldGVseQorCSAqIHVucmVsYXRlZCBwcm9jZXNzLgogCSAqLwotCWlmIChQYWdlQW5vbihvbGRfcGFnZSkgJiYgIVBhZ2VLc20ob2xkX3BhZ2UpKSB7Ci0JCWlmICghdHJ5bG9ja19wYWdlKG9sZF9wYWdlKSkgewotCQkJcGFnZV9jYWNoZV9nZXQob2xkX3BhZ2UpOwotCQkJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOwotCQkJbG9ja19wYWdlKG9sZF9wYWdlKTsKLQkJCXBhZ2VfdGFibGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsCi0JCQkJCQkJICZwdGwpOwotCQkJaWYgKCFwdGVfc2FtZSgqcGFnZV90YWJsZSwgb3JpZ19wdGUpKSB7Ci0JCQkJdW5sb2NrX3BhZ2Uob2xkX3BhZ2UpOwotCQkJCWdvdG8gdW5sb2NrOwotCQkJfQotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKLQkJfQotCQlpZiAocmV1c2Vfc3dhcF9wYWdlKG9sZF9wYWdlKSkgewotCQkJLyoKLQkJCSAqIFRoZSBwYWdlIGlzIGFsbCBvdXJzLiAgTW92ZSBpdCB0byBvdXIgYW5vbl92bWEgc28KLQkJCSAqIHRoZSBybWFwIGNvZGUgd2lsbCBub3Qgc2VhcmNoIG91ciBwYXJlbnQgb3Igc2libGluZ3MuCi0JCQkgKiBQcm90ZWN0ZWQgYWdhaW5zdCB0aGUgcm1hcCBjb2RlIGJ5IHRoZSBwYWdlIGxvY2suCi0JCQkgKi8KLQkJCXBhZ2VfbW92ZV9hbm9uX3JtYXAob2xkX3BhZ2UsIHZtYSwgYWRkcmVzcyk7Ci0JCQl1bmxvY2tfcGFnZShvbGRfcGFnZSk7Ci0JCQlnb3RvIHJldXNlOwotCQl9Ci0JCXVubG9ja19wYWdlKG9sZF9wYWdlKTsKLQl9IGVsc2UgaWYgKHVubGlrZWx5KCh2bWEtPnZtX2ZsYWdzICYgKFZNX1dSSVRFfFZNX1NIQVJFRCkpID09Ci0JCQkJCShWTV9XUklURXxWTV9TSEFSRUQpKSkgewotCQlwYWdlX2NhY2hlX2dldChvbGRfcGFnZSk7Ci0JCS8qCi0JCSAqIE9ubHkgY2F0Y2ggd3JpdGUtZmF1bHRzIG9uIHNoYXJlZCB3cml0YWJsZSBwYWdlcywKLQkJICogcmVhZC1vbmx5IHNoYXJlZCBwYWdlcyBjYW4gZ2V0IENPV2VkIGJ5Ci0JCSAqIGdldF91c2VyX3BhZ2VzKC53cml0ZT0xLCAuZm9yY2U9MSkuCi0JCSAqLwotCQlpZiAodm1hLT52bV9vcHMgJiYgdm1hLT52bV9vcHMtPnBhZ2VfbWt3cml0ZSkgewotCQkJaW50IHRtcDsKKwlpZiAocGFnZSkKKwkJcGFnZV9jcHVwaWRfeGNoZ19sYXN0KHBhZ2UsICgxIDw8IExBU1RfQ1BVUElEX1NISUZUKSAtIDEpOwogCi0JCQlwdGVfdW5tYXBfdW5sb2NrKHBhZ2VfdGFibGUsIHB0bCk7Ci0JCQl0bXAgPSBkb19wYWdlX21rd3JpdGUodm1hLCBvbGRfcGFnZSwgYWRkcmVzcyk7Ci0JCQlpZiAodW5saWtlbHkoIXRtcCB8fCAodG1wICYKLQkJCQkJKFZNX0ZBVUxUX0VSUk9SIHwgVk1fRkFVTFRfTk9QQUdFKSkpKSB7Ci0JCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKLQkJCQlyZXR1cm4gdG1wOwotCQkJfQotCQkJLyoKLQkJCSAqIFNpbmNlIHdlIGRyb3BwZWQgdGhlIGxvY2sgd2UgbmVlZCB0byByZXZhbGlkYXRlCi0JCQkgKiB0aGUgUFRFIGFzIHNvbWVvbmUgZWxzZSBtYXkgaGF2ZSBjaGFuZ2VkIGl0LiAgSWYKLQkJCSAqIHRoZXkgZGlkLCB3ZSBqdXN0IHJldHVybiwgYXMgd2UgY2FuIGNvdW50IG9uIHRoZQotCQkJICogTU1VIHRvIHRlbGwgdXMgaWYgdGhleSBkaWRuJ3QgYWxzbyBtYWtlIGl0IHdyaXRhYmxlLgotCQkJICovCi0JCQlwYWdlX3RhYmxlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLAotCQkJCQkJCSAmcHRsKTsKLQkJCWlmICghcHRlX3NhbWUoKnBhZ2VfdGFibGUsIG9yaWdfcHRlKSkgewotCQkJCXVubG9ja19wYWdlKG9sZF9wYWdlKTsKLQkJCQlnb3RvIHVubG9jazsKLQkJCX0KLQkJCXBhZ2VfbWt3cml0ZSA9IDE7Ci0JCX0KLQotCQlkaXJ0eV9zaGFyZWQgPSB0cnVlOwotCi1yZXVzZToKLQkJLyoKLQkJICogQ2xlYXIgdGhlIHBhZ2VzIGNwdXBpZCBpbmZvcm1hdGlvbiBhcyB0aGUgZXhpc3RpbmcKLQkJICogaW5mb3JtYXRpb24gcG90ZW50aWFsbHkgYmVsb25ncyB0byBhIG5vdyBjb21wbGV0ZWx5Ci0JCSAqIHVucmVsYXRlZCBwcm9jZXNzLgotCQkgKi8KLQkJaWYgKG9sZF9wYWdlKQotCQkJcGFnZV9jcHVwaWRfeGNoZ19sYXN0KG9sZF9wYWdlLCAoMSA8PCBMQVNUX0NQVVBJRF9TSElGVCkgLSAxKTsKLQotCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbihvcmlnX3B0ZSkpOwotCQllbnRyeSA9IHB0ZV9ta3lvdW5nKG9yaWdfcHRlKTsKLQkJZW50cnkgPSBtYXliZV9ta3dyaXRlKHB0ZV9ta2RpcnR5KGVudHJ5KSwgdm1hKTsKLQkJaWYgKHB0ZXBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIGFkZHJlc3MsIHBhZ2VfdGFibGUsIGVudHJ5LDEpKQotCQkJdXBkYXRlX21tdV9jYWNoZSh2bWEsIGFkZHJlc3MsIHBhZ2VfdGFibGUpOwotCQlwdGVfdW5tYXBfdW5sb2NrKHBhZ2VfdGFibGUsIHB0bCk7Ci0JCXJldCB8PSBWTV9GQVVMVF9XUklURTsKLQotCQlpZiAoZGlydHlfc2hhcmVkKSB7Ci0JCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZzsKLQkJCWludCBkaXJ0aWVkOwotCi0JCQlpZiAoIXBhZ2VfbWt3cml0ZSkKLQkJCQlsb2NrX3BhZ2Uob2xkX3BhZ2UpOwotCi0JCQlkaXJ0aWVkID0gc2V0X3BhZ2VfZGlydHkob2xkX3BhZ2UpOwotCQkJVk1fQlVHX09OX1BBR0UoUGFnZUFub24ob2xkX3BhZ2UpLCBvbGRfcGFnZSk7Ci0JCQltYXBwaW5nID0gb2xkX3BhZ2UtPm1hcHBpbmc7Ci0JCQl1bmxvY2tfcGFnZShvbGRfcGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2Uob2xkX3BhZ2UpOwotCi0JCQlpZiAoKGRpcnRpZWQgfHwgcGFnZV9ta3dyaXRlKSAmJiBtYXBwaW5nKSB7Ci0JCQkJLyoKLQkJCQkgKiBTb21lIGRldmljZSBkcml2ZXJzIGRvIG5vdCBzZXQgcGFnZS5tYXBwaW5nCi0JCQkJICogYnV0IHN0aWxsIGRpcnR5IHRoZWlyIHBhZ2VzCi0JCQkJICovCi0JCQkJYmFsYW5jZV9kaXJ0eV9wYWdlc19yYXRlbGltaXRlZChtYXBwaW5nKTsKLQkJCX0KLQotCQkJaWYgKCFwYWdlX21rd3JpdGUpCi0JCQkJZmlsZV91cGRhdGVfdGltZSh2bWEtPnZtX2ZpbGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKgotCSAqIE9rLCB3ZSBuZWVkIHRvIGNvcHkuIE9oLCB3ZWxsLi4KLQkgKi8KLQlwYWdlX2NhY2hlX2dldChvbGRfcGFnZSk7Ci1nb3R0ZW46CisJZmx1c2hfY2FjaGVfcGFnZSh2bWEsIGFkZHJlc3MsIHB0ZV9wZm4ob3JpZ19wdGUpKTsKKwllbnRyeSA9IHB0ZV9ta3lvdW5nKG9yaWdfcHRlKTsKKwllbnRyeSA9IG1heWJlX21rd3JpdGUocHRlX21rZGlydHkoZW50cnkpLCB2bWEpOworCWlmIChwdGVwX3NldF9hY2Nlc3NfZmxhZ3Modm1hLCBhZGRyZXNzLCBwYWdlX3RhYmxlLCBlbnRyeSwgMSkpCisJCXVwZGF0ZV9tbXVfY2FjaGUodm1hLCBhZGRyZXNzLCBwYWdlX3RhYmxlKTsKIAlwdGVfdW5tYXBfdW5sb2NrKHBhZ2VfdGFibGUsIHB0bCk7CiAKKwlpZiAoZGlydHlfc2hhcmVkKSB7CisJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOworCQlpbnQgZGlydGllZDsKKworCQlpZiAoIXBhZ2VfbWt3cml0ZSkKKwkJCWxvY2tfcGFnZShwYWdlKTsKKworCQlkaXJ0aWVkID0gc2V0X3BhZ2VfZGlydHkocGFnZSk7CisJCVZNX0JVR19PTl9QQUdFKFBhZ2VBbm9uKHBhZ2UpLCBwYWdlKTsKKwkJbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CisJCXVubG9ja19wYWdlKHBhZ2UpOworCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisKKwkJaWYgKChkaXJ0aWVkIHx8IHBhZ2VfbWt3cml0ZSkgJiYgbWFwcGluZykgeworCQkJLyoKKwkJCSAqIFNvbWUgZGV2aWNlIGRyaXZlcnMgZG8gbm90IHNldCBwYWdlLm1hcHBpbmcKKwkJCSAqIGJ1dCBzdGlsbCBkaXJ0eSB0aGVpciBwYWdlcworCQkJICovCisJCQliYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkKG1hcHBpbmcpOworCQl9CisKKwkJaWYgKCFwYWdlX21rd3JpdGUpCisJCQlmaWxlX3VwZGF0ZV90aW1lKHZtYS0+dm1fZmlsZSk7CisJfQorCisJcmV0dXJuIFZNX0ZBVUxUX1dSSVRFOworfQorCisvKgorICogSGFuZGxlIHRoZSBjYXNlIG9mIGEgcGFnZSB3aGljaCB3ZSBhY3R1YWxseSBuZWVkIHRvIGNvcHkgdG8gYSBuZXcgcGFnZS4KKyAqCisgKiBDYWxsZWQgd2l0aCBtbWFwX3NlbSBsb2NrZWQgYW5kIHRoZSBvbGQgcGFnZSByZWZlcmVuY2VkLCBidXQKKyAqIHdpdGhvdXQgdGhlIHB0bCBoZWxkLgorICoKKyAqIEhpZ2ggbGV2ZWwgbG9naWMgZmxvdzoKKyAqCisgKiAtIEFsbG9jYXRlIGEgcGFnZSwgY29weSB0aGUgY29udGVudCBvZiB0aGUgb2xkIHBhZ2UgdG8gdGhlIG5ldyBvbmUuCisgKiAtIEhhbmRsZSBib29rIGtlZXBpbmcgYW5kIGFjY291bnRpbmcgLSBjZ3JvdXBzLCBtbXUtbm90aWZpZXJzLCBldGMuCisgKiAtIFRha2UgdGhlIFBUTC4gSWYgdGhlIHB0ZSBjaGFuZ2VkLCBiYWlsIG91dCBhbmQgcmVsZWFzZSB0aGUgYWxsb2NhdGVkIHBhZ2UKKyAqIC0gSWYgdGhlIHB0ZSBpcyBzdGlsbCB0aGUgd2F5IHdlIHJlbWVtYmVyIGl0LCB1cGRhdGUgdGhlIHBhZ2UgdGFibGUgYW5kIGFsbAorICogICByZWxldmFudCByZWZlcmVuY2VzLiBUaGlzIGluY2x1ZGVzIGRyb3BwaW5nIHRoZSByZWZlcmVuY2UgdGhlIHBhZ2UtdGFibGUKKyAqICAgaGVsZCB0byB0aGUgb2xkIHBhZ2UsIGFzIHdlbGwgYXMgdXBkYXRpbmcgdGhlIHJtYXAuCisgKiAtIEluIGFueSBjYXNlLCB1bmxvY2sgdGhlIFBUTCBhbmQgZHJvcCB0aGUgcmVmZXJlbmNlIHdlIHRvb2sgdG8gdGhlIG9sZCBwYWdlLgorICovCitzdGF0aWMgaW50IHdwX3BhZ2VfY29weShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwYWdlX3RhYmxlLCBwbWRfdCAqcG1kLAorCQkJcHRlX3Qgb3JpZ19wdGUsIHN0cnVjdCBwYWdlICpvbGRfcGFnZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqbmV3X3BhZ2UgPSBOVUxMOworCXNwaW5sb2NrX3QgKnB0bCA9IE5VTEw7CisJcHRlX3QgZW50cnk7CisJaW50IHBhZ2VfY29waWVkID0gMDsKKwljb25zdCB1bnNpZ25lZCBsb25nIG1tdW5fc3RhcnQgPSBhZGRyZXNzICYgUEFHRV9NQVNLOwkvKiBGb3IgbW11X25vdGlmaWVycyAqLworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbW11bl9lbmQgPSBtbXVuX3N0YXJ0ICsgUEFHRV9TSVpFOwkvKiBGb3IgbW11X25vdGlmaWVycyAqLworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKKwogCWlmICh1bmxpa2VseShhbm9uX3ZtYV9wcmVwYXJlKHZtYSkpKQogCQlnb3RvIG9vbTsKIApAQCAtMjE2Myw4ICsyMDg2LDYgQEAKIAlpZiAobWVtX2Nncm91cF90cnlfY2hhcmdlKG5ld19wYWdlLCBtbSwgR0ZQX0tFUk5FTCwgJm1lbWNnKSkKIAkJZ290byBvb21fZnJlZV9uZXc7CiAKLQltbXVuX3N0YXJ0ICA9IGFkZHJlc3MgJiBQQUdFX01BU0s7Ci0JbW11bl9lbmQgICAgPSBtbXVuX3N0YXJ0ICsgUEFHRV9TSVpFOwogCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX3N0YXJ0KG1tLCBtbXVuX3N0YXJ0LCBtbXVuX2VuZCk7CiAKIAkvKgpAQCAtMjE3Nyw4ICsyMDk4LDkgQEAKIAkJCQlkZWNfbW1fY291bnRlcl9mYXN0KG1tLCBNTV9GSUxFUEFHRVMpOwogCQkJCWluY19tbV9jb3VudGVyX2Zhc3QobW0sIE1NX0FOT05QQUdFUyk7CiAJCQl9Ci0JCX0gZWxzZQorCQl9IGVsc2UgewogCQkJaW5jX21tX2NvdW50ZXJfZmFzdChtbSwgTU1fQU5PTlBBR0VTKTsKKwkJfQogCQlmbHVzaF9jYWNoZV9wYWdlKHZtYSwgYWRkcmVzcywgcHRlX3BmbihvcmlnX3B0ZSkpOwogCQllbnRyeSA9IG1rX3B0ZShuZXdfcGFnZSwgdm1hLT52bV9wYWdlX3Byb3QpOwogCQllbnRyeSA9IG1heWJlX21rd3JpdGUocHRlX21rZGlydHkoZW50cnkpLCB2bWEpOwpAQCAtMjIyNywyOSArMjE0OSwyOSBAQAogCiAJCS8qIEZyZWUgdGhlIG9sZCBwYWdlLi4gKi8KIAkJbmV3X3BhZ2UgPSBvbGRfcGFnZTsKLQkJcmV0IHw9IFZNX0ZBVUxUX1dSSVRFOwotCX0gZWxzZQorCQlwYWdlX2NvcGllZCA9IDE7CisJfSBlbHNlIHsKIAkJbWVtX2Nncm91cF9jYW5jZWxfY2hhcmdlKG5ld19wYWdlLCBtZW1jZyk7CisJfQogCiAJaWYgKG5ld19wYWdlKQogCQlwYWdlX2NhY2hlX3JlbGVhc2UobmV3X3BhZ2UpOwotdW5sb2NrOgorCiAJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOwotCWlmIChtbXVuX2VuZCA+IG1tdW5fc3RhcnQpCi0JCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChtbSwgbW11bl9zdGFydCwgbW11bl9lbmQpOworCW1tdV9ub3RpZmllcl9pbnZhbGlkYXRlX3JhbmdlX2VuZChtbSwgbW11bl9zdGFydCwgbW11bl9lbmQpOwogCWlmIChvbGRfcGFnZSkgewogCQkvKgogCQkgKiBEb24ndCBsZXQgYW5vdGhlciB0YXNrLCB3aXRoIHBvc3NpYmx5IHVubG9ja2VkIHZtYSwKIAkJICoga2VlcCB0aGUgbWxvY2tlZCBwYWdlLgogCQkgKi8KLQkJaWYgKChyZXQgJiBWTV9GQVVMVF9XUklURSkgJiYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpKSB7CisJCWlmIChwYWdlX2NvcGllZCAmJiAodm1hLT52bV9mbGFncyAmIFZNX0xPQ0tFRCkpIHsKIAkJCWxvY2tfcGFnZShvbGRfcGFnZSk7CS8qIExSVSBtYW5pcHVsYXRpb24gKi8KIAkJCW11bmxvY2tfdm1hX3BhZ2Uob2xkX3BhZ2UpOwogCQkJdW5sb2NrX3BhZ2Uob2xkX3BhZ2UpOwogCQl9CiAJCXBhZ2VfY2FjaGVfcmVsZWFzZShvbGRfcGFnZSk7CiAJfQotCXJldHVybiByZXQ7CisJcmV0dXJuIHBhZ2VfY29waWVkID8gVk1fRkFVTFRfV1JJVEUgOiAwOwogb29tX2ZyZWVfbmV3OgogCXBhZ2VfY2FjaGVfcmVsZWFzZShuZXdfcGFnZSk7CiBvb206CkBAIC0yMjU4LDYgKzIxODAsMTc5IEBACiAJcmV0dXJuIFZNX0ZBVUxUX09PTTsKIH0KIAorLyoKKyAqIEhhbmRsZSB3cml0ZSBwYWdlIGZhdWx0cyBmb3IgVk1fTUlYRURNQVAgb3IgVk1fUEZOTUFQIGZvciBhIFZNX1NIQVJFRAorICogbWFwcGluZworICovCitzdGF0aWMgaW50IHdwX3Bmbl9zaGFyZWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkJcHRlX3QgKnBhZ2VfdGFibGUsIHNwaW5sb2NrX3QgKnB0bCwgcHRlX3Qgb3JpZ19wdGUsCisJCQlwbWRfdCAqcG1kKQoreworCWlmICh2bWEtPnZtX29wcyAmJiB2bWEtPnZtX29wcy0+cGZuX21rd3JpdGUpIHsKKwkJc3RydWN0IHZtX2ZhdWx0IHZtZiA9IHsKKwkJCS5wYWdlID0gTlVMTCwKKwkJCS5wZ29mZiA9IGxpbmVhcl9wYWdlX2luZGV4KHZtYSwgYWRkcmVzcyksCisJCQkudmlydHVhbF9hZGRyZXNzID0gKHZvaWQgX191c2VyICopKGFkZHJlc3MgJiBQQUdFX01BU0spLAorCQkJLmZsYWdzID0gRkFVTFRfRkxBR19XUklURSB8IEZBVUxUX0ZMQUdfTUtXUklURSwKKwkJfTsKKwkJaW50IHJldDsKKworCQlwdGVfdW5tYXBfdW5sb2NrKHBhZ2VfdGFibGUsIHB0bCk7CisJCXJldCA9IHZtYS0+dm1fb3BzLT5wZm5fbWt3cml0ZSh2bWEsICZ2bWYpOworCQlpZiAocmV0ICYgVk1fRkFVTFRfRVJST1IpCisJCQlyZXR1cm4gcmV0OworCQlwYWdlX3RhYmxlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLCAmcHRsKTsKKwkJLyoKKwkJICogV2UgbWlnaHQgaGF2ZSByYWNlZCB3aXRoIGFub3RoZXIgcGFnZSBmYXVsdCB3aGlsZSB3ZQorCQkgKiByZWxlYXNlZCB0aGUgcHRlX29mZnNldF9tYXBfbG9jay4KKwkJICovCisJCWlmICghcHRlX3NhbWUoKnBhZ2VfdGFibGUsIG9yaWdfcHRlKSkgeworCQkJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJcmV0dXJuIHdwX3BhZ2VfcmV1c2UobW0sIHZtYSwgYWRkcmVzcywgcGFnZV90YWJsZSwgcHRsLCBvcmlnX3B0ZSwKKwkJCSAgICAgTlVMTCwgMCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgd3BfcGFnZV9zaGFyZWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHB0ZV90ICpwYWdlX3RhYmxlLAorCQkJICBwbWRfdCAqcG1kLCBzcGlubG9ja190ICpwdGwsIHB0ZV90IG9yaWdfcHRlLAorCQkJICBzdHJ1Y3QgcGFnZSAqb2xkX3BhZ2UpCisJX19yZWxlYXNlcyhwdGwpCit7CisJaW50IHBhZ2VfbWt3cml0ZSA9IDA7CisKKwlwYWdlX2NhY2hlX2dldChvbGRfcGFnZSk7CisKKwkvKgorCSAqIE9ubHkgY2F0Y2ggd3JpdGUtZmF1bHRzIG9uIHNoYXJlZCB3cml0YWJsZSBwYWdlcywKKwkgKiByZWFkLW9ubHkgc2hhcmVkIHBhZ2VzIGNhbiBnZXQgQ09XZWQgYnkKKwkgKiBnZXRfdXNlcl9wYWdlcygud3JpdGU9MSwgLmZvcmNlPTEpLgorCSAqLworCWlmICh2bWEtPnZtX29wcyAmJiB2bWEtPnZtX29wcy0+cGFnZV9ta3dyaXRlKSB7CisJCWludCB0bXA7CisKKwkJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOworCQl0bXAgPSBkb19wYWdlX21rd3JpdGUodm1hLCBvbGRfcGFnZSwgYWRkcmVzcyk7CisJCWlmICh1bmxpa2VseSghdG1wIHx8ICh0bXAgJgorCQkJCSAgICAgIChWTV9GQVVMVF9FUlJPUiB8IFZNX0ZBVUxUX05PUEFHRSkpKSkgeworCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKKwkJCXJldHVybiB0bXA7CisJCX0KKwkJLyoKKwkJICogU2luY2Ugd2UgZHJvcHBlZCB0aGUgbG9jayB3ZSBuZWVkIHRvIHJldmFsaWRhdGUKKwkJICogdGhlIFBURSBhcyBzb21lb25lIGVsc2UgbWF5IGhhdmUgY2hhbmdlZCBpdC4gIElmCisJCSAqIHRoZXkgZGlkLCB3ZSBqdXN0IHJldHVybiwgYXMgd2UgY2FuIGNvdW50IG9uIHRoZQorCQkgKiBNTVUgdG8gdGVsbCB1cyBpZiB0aGV5IGRpZG4ndCBhbHNvIG1ha2UgaXQgd3JpdGFibGUuCisJCSAqLworCQlwYWdlX3RhYmxlID0gcHRlX29mZnNldF9tYXBfbG9jayhtbSwgcG1kLCBhZGRyZXNzLAorCQkJCQkJICZwdGwpOworCQlpZiAoIXB0ZV9zYW1lKCpwYWdlX3RhYmxlLCBvcmlnX3B0ZSkpIHsKKwkJCXVubG9ja19wYWdlKG9sZF9wYWdlKTsKKwkJCXB0ZV91bm1hcF91bmxvY2socGFnZV90YWJsZSwgcHRsKTsKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZShvbGRfcGFnZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwYWdlX21rd3JpdGUgPSAxOworCX0KKworCXJldHVybiB3cF9wYWdlX3JldXNlKG1tLCB2bWEsIGFkZHJlc3MsIHBhZ2VfdGFibGUsIHB0bCwKKwkJCSAgICAgb3JpZ19wdGUsIG9sZF9wYWdlLCBwYWdlX21rd3JpdGUsIDEpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGhhbmRsZXMgcHJlc2VudCBwYWdlcywgd2hlbiB1c2VycyB0cnkgdG8gd3JpdGUKKyAqIHRvIGEgc2hhcmVkIHBhZ2UuIEl0IGlzIGRvbmUgYnkgY29weWluZyB0aGUgcGFnZSB0byBhIG5ldyBhZGRyZXNzCisgKiBhbmQgZGVjcmVtZW50aW5nIHRoZSBzaGFyZWQtcGFnZSBjb3VudGVyIGZvciB0aGUgb2xkIHBhZ2UuCisgKgorICogTm90ZSB0aGF0IHRoaXMgcm91dGluZSBhc3N1bWVzIHRoYXQgdGhlIHByb3RlY3Rpb24gY2hlY2tzIGhhdmUgYmVlbgorICogZG9uZSBieSB0aGUgY2FsbGVyICh0aGUgbG93LWxldmVsIHBhZ2UgZmF1bHQgcm91dGluZSBpbiBtb3N0IGNhc2VzKS4KKyAqIFRodXMgd2UgY2FuIHNhZmVseSBqdXN0IG1hcmsgaXQgd3JpdGFibGUgb25jZSB3ZSd2ZSBkb25lIGFueSBuZWNlc3NhcnkKKyAqIENPVy4KKyAqCisgKiBXZSBhbHNvIG1hcmsgdGhlIHBhZ2UgZGlydHkgYXQgdGhpcyBwb2ludCBldmVuIHRob3VnaCB0aGUgcGFnZSB3aWxsCisgKiBjaGFuZ2Ugb25seSBvbmNlIHRoZSB3cml0ZSBhY3R1YWxseSBoYXBwZW5zLiBUaGlzIGF2b2lkcyBhIGZldyByYWNlcywKKyAqIGFuZCBwb3RlbnRpYWxseSBtYWtlcyBpdCBtb3JlIGVmZmljaWVudC4KKyAqCisgKiBXZSBlbnRlciB3aXRoIG5vbi1leGNsdXNpdmUgbW1hcF9zZW0gKHRvIGV4Y2x1ZGUgdm1hIGNoYW5nZXMsCisgKiBidXQgYWxsb3cgY29uY3VycmVudCBmYXVsdHMpLCB3aXRoIHB0ZSBib3RoIG1hcHBlZCBhbmQgbG9ja2VkLgorICogV2UgcmV0dXJuIHdpdGggbW1hcF9zZW0gc3RpbGwgaGVsZCwgYnV0IHB0ZSB1bm1hcHBlZCBhbmQgdW5sb2NrZWQuCisgKi8KK3N0YXRpYyBpbnQgZG9fd3BfcGFnZShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgKnBhZ2VfdGFibGUsIHBtZF90ICpwbWQsCisJCXNwaW5sb2NrX3QgKnB0bCwgcHRlX3Qgb3JpZ19wdGUpCisJX19yZWxlYXNlcyhwdGwpCit7CisJc3RydWN0IHBhZ2UgKm9sZF9wYWdlOworCisJb2xkX3BhZ2UgPSB2bV9ub3JtYWxfcGFnZSh2bWEsIGFkZHJlc3MsIG9yaWdfcHRlKTsKKwlpZiAoIW9sZF9wYWdlKSB7CisJCS8qCisJCSAqIFZNX01JWEVETUFQICFwZm5fdmFsaWQoKSBjYXNlLCBvciBWTV9TT0ZURElSVFkgY2xlYXIgb24gYQorCQkgKiBWTV9QRk5NQVAgVk1BLgorCQkgKgorCQkgKiBXZSBzaG91bGQgbm90IGNvdyBwYWdlcyBpbiBhIHNoYXJlZCB3cml0ZWFibGUgbWFwcGluZy4KKwkJICogSnVzdCBtYXJrIHRoZSBwYWdlcyB3cml0YWJsZSBhbmQvb3IgY2FsbCBvcHMtPnBmbl9ta3dyaXRlLgorCQkgKi8KKwkJaWYgKCh2bWEtPnZtX2ZsYWdzICYgKFZNX1dSSVRFfFZNX1NIQVJFRCkpID09CisJCQkJICAgICAoVk1fV1JJVEV8Vk1fU0hBUkVEKSkKKwkJCXJldHVybiB3cF9wZm5fc2hhcmVkKG1tLCB2bWEsIGFkZHJlc3MsIHBhZ2VfdGFibGUsIHB0bCwKKwkJCQkJICAgICBvcmlnX3B0ZSwgcG1kKTsKKworCQlwdGVfdW5tYXBfdW5sb2NrKHBhZ2VfdGFibGUsIHB0bCk7CisJCXJldHVybiB3cF9wYWdlX2NvcHkobW0sIHZtYSwgYWRkcmVzcywgcGFnZV90YWJsZSwgcG1kLAorCQkJCSAgICBvcmlnX3B0ZSwgb2xkX3BhZ2UpOworCX0KKworCS8qCisJICogVGFrZSBvdXQgYW5vbnltb3VzIHBhZ2VzIGZpcnN0LCBhbm9ueW1vdXMgc2hhcmVkIHZtYXMgYXJlCisJICogbm90IGRpcnR5IGFjY291bnRhYmxlLgorCSAqLworCWlmIChQYWdlQW5vbihvbGRfcGFnZSkgJiYgIVBhZ2VLc20ob2xkX3BhZ2UpKSB7CisJCWlmICghdHJ5bG9ja19wYWdlKG9sZF9wYWdlKSkgeworCQkJcGFnZV9jYWNoZV9nZXQob2xkX3BhZ2UpOworCQkJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOworCQkJbG9ja19wYWdlKG9sZF9wYWdlKTsKKwkJCXBhZ2VfdGFibGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsCisJCQkJCQkJICZwdGwpOworCQkJaWYgKCFwdGVfc2FtZSgqcGFnZV90YWJsZSwgb3JpZ19wdGUpKSB7CisJCQkJdW5sb2NrX3BhZ2Uob2xkX3BhZ2UpOworCQkJCXB0ZV91bm1hcF91bmxvY2socGFnZV90YWJsZSwgcHRsKTsKKwkJCQlwYWdlX2NhY2hlX3JlbGVhc2Uob2xkX3BhZ2UpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJcGFnZV9jYWNoZV9yZWxlYXNlKG9sZF9wYWdlKTsKKwkJfQorCQlpZiAocmV1c2Vfc3dhcF9wYWdlKG9sZF9wYWdlKSkgeworCQkJLyoKKwkJCSAqIFRoZSBwYWdlIGlzIGFsbCBvdXJzLiAgTW92ZSBpdCB0byBvdXIgYW5vbl92bWEgc28KKwkJCSAqIHRoZSBybWFwIGNvZGUgd2lsbCBub3Qgc2VhcmNoIG91ciBwYXJlbnQgb3Igc2libGluZ3MuCisJCQkgKiBQcm90ZWN0ZWQgYWdhaW5zdCB0aGUgcm1hcCBjb2RlIGJ5IHRoZSBwYWdlIGxvY2suCisJCQkgKi8KKwkJCXBhZ2VfbW92ZV9hbm9uX3JtYXAob2xkX3BhZ2UsIHZtYSwgYWRkcmVzcyk7CisJCQl1bmxvY2tfcGFnZShvbGRfcGFnZSk7CisJCQlyZXR1cm4gd3BfcGFnZV9yZXVzZShtbSwgdm1hLCBhZGRyZXNzLCBwYWdlX3RhYmxlLCBwdGwsCisJCQkJCSAgICAgb3JpZ19wdGUsIG9sZF9wYWdlLCAwLCAwKTsKKwkJfQorCQl1bmxvY2tfcGFnZShvbGRfcGFnZSk7CisJfSBlbHNlIGlmICh1bmxpa2VseSgodm1hLT52bV9mbGFncyAmIChWTV9XUklURXxWTV9TSEFSRUQpKSA9PQorCQkJCQkoVk1fV1JJVEV8Vk1fU0hBUkVEKSkpIHsKKwkJcmV0dXJuIHdwX3BhZ2Vfc2hhcmVkKG1tLCB2bWEsIGFkZHJlc3MsIHBhZ2VfdGFibGUsIHBtZCwKKwkJCQkgICAgICBwdGwsIG9yaWdfcHRlLCBvbGRfcGFnZSk7CisJfQorCisJLyoKKwkgKiBPaywgd2UgbmVlZCB0byBjb3B5LiBPaCwgd2VsbC4uCisJICovCisJcGFnZV9jYWNoZV9nZXQob2xkX3BhZ2UpOworCisJcHRlX3VubWFwX3VubG9jayhwYWdlX3RhYmxlLCBwdGwpOworCXJldHVybiB3cF9wYWdlX2NvcHkobW0sIHZtYSwgYWRkcmVzcywgcGFnZV90YWJsZSwgcG1kLAorCQkJICAgIG9yaWdfcHRlLCBvbGRfcGFnZSk7Cit9CisKIHN0YXRpYyB2b2lkIHVubWFwX21hcHBpbmdfcmFuZ2Vfdm1hKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQl1bnNpZ25lZCBsb25nIHN0YXJ0X2FkZHIsIHVuc2lnbmVkIGxvbmcgZW5kX2FkZHIsCiAJCXN0cnVjdCB6YXBfZGV0YWlscyAqZGV0YWlscykKQEAgLTI3ODQsNyArMjg3OSw3IEBACiAJc3RydWN0IHZtX2ZhdWx0IHZtZjsKIAlpbnQgb2ZmOwogCi0JbnJfcGFnZXMgPSBBQ0NFU1NfT05DRShmYXVsdF9hcm91bmRfYnl0ZXMpID4+IFBBR0VfU0hJRlQ7CisJbnJfcGFnZXMgPSBSRUFEX09OQ0UoZmF1bHRfYXJvdW5kX2J5dGVzKSA+PiBQQUdFX1NISUZUOwogCW1hc2sgPSB+KG5yX3BhZ2VzICogUEFHRV9TSVpFIC0gMSkgJiBQQUdFX01BU0s7CiAKIAlzdGFydF9hZGRyID0gbWF4KGFkZHJlc3MgJiBtYXNrLCB2bWEtPnZtX3N0YXJ0KTsKQEAgLTMwMzUsNiArMzEzMCw3IEBACiAJaW50IGxhc3RfY3B1cGlkOwogCWludCB0YXJnZXRfbmlkOwogCWJvb2wgbWlncmF0ZWQgPSBmYWxzZTsKKwlib29sIHdhc193cml0YWJsZSA9IHB0ZV93cml0ZShwdGUpOwogCWludCBmbGFncyA9IDA7CiAKIAkvKiBBIFBST1RfTk9ORSBmYXVsdCBzaG91bGQgbm90IGVuZCB1cCBoZXJlICovCkBAIC0zMDU5LDYgKzMxNTUsOCBAQAogCS8qIE1ha2UgaXQgcHJlc2VudCBhZ2FpbiAqLwogCXB0ZSA9IHB0ZV9tb2RpZnkocHRlLCB2bWEtPnZtX3BhZ2VfcHJvdCk7CiAJcHRlID0gcHRlX21reW91bmcocHRlKTsKKwlpZiAod2FzX3dyaXRhYmxlKQorCQlwdGUgPSBwdGVfbWt3cml0ZShwdGUpOwogCXNldF9wdGVfYXQobW0sIGFkZHIsIHB0ZXAsIHB0ZSk7CiAJdXBkYXRlX21tdV9jYWNoZSh2bWEsIGFkZHIsIHB0ZXApOwogCkBAIC0zMDY5LDE2ICszMTY3LDE0IEBACiAJfQogCiAJLyoKLQkgKiBBdm9pZCBncm91cGluZyBvbiBEU08vQ09XIHBhZ2VzIGluIHNwZWNpZmljIGFuZCBSTyBwYWdlcwotCSAqIGluIGdlbmVyYWwsIFJPIHBhZ2VzIHNob3VsZG4ndCBodXJ0IGFzIG11Y2ggYW55d2F5IHNpbmNlCi0JICogdGhleSBjYW4gYmUgaW4gc2hhcmVkIGNhY2hlIHN0YXRlLgotCSAqCi0JICogRklYTUUhIFRoaXMgY2hlY2tzICJwbWRfZGlydHkoKSIgYXMgYW4gYXBwcm94aW1hdGlvbiBvZgotCSAqICJpcyB0aGlzIGEgcmVhZC1vbmx5IHBhZ2UiLCBzaW5jZSBjaGVja2luZyAicG1kX3dyaXRlKCkiCi0JICogaXMgZXZlbiBtb3JlIGJyb2tlbi4gV2UgaGF2ZW4ndCBhY3R1YWxseSB0dXJuZWQgdGhpcyBpbnRvCi0JICogYSB3cml0YWJsZSBwYWdlLCBzbyBwbWRfd3JpdGUoKSB3aWxsIGFsd2F5cyBiZSBmYWxzZS4KKwkgKiBBdm9pZCBncm91cGluZyBvbiBSTyBwYWdlcyBpbiBnZW5lcmFsLiBSTyBwYWdlcyBzaG91bGRuJ3QgaHVydCBhcworCSAqIG11Y2ggYW55d2F5IHNpbmNlIHRoZXkgY2FuIGJlIGluIHNoYXJlZCBjYWNoZSBzdGF0ZS4gVGhpcyBtaXNzZXMKKwkgKiB0aGUgY2FzZSB3aGVyZSBhIG1hcHBpbmcgaXMgd3JpdGFibGUgYnV0IHRoZSBwcm9jZXNzIG5ldmVyIHdyaXRlcworCSAqIHRvIGl0IGJ1dCBwdGVfd3JpdGUgZ2V0cyBjbGVhcmVkIGR1cmluZyBwcm90ZWN0aW9uIHVwZGF0ZXMgYW5kCisJICogcHRlX2RpcnR5IGhhcyB1bnByZWRpY3RhYmxlIGJlaGF2aW91ciBiZXR3ZWVuIFBURSBzY2FuIHVwZGF0ZXMsCisJICogYmFja2dyb3VuZCB3cml0ZWJhY2ssIGRpcnR5IGJhbGFuY2luZyBhbmQgYXBwbGljYXRpb24gYmVoYXZpb3VyLgogCSAqLwotCWlmICghcHRlX2RpcnR5KHB0ZSkpCisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKIAkJZmxhZ3MgfD0gVE5GX05PX0dST1VQOwogCiAJLyoKQEAgLTMxMDIsNyArMzE5OCw4IEBACiAJaWYgKG1pZ3JhdGVkKSB7CiAJCXBhZ2VfbmlkID0gdGFyZ2V0X25pZDsKIAkJZmxhZ3MgfD0gVE5GX01JR1JBVEVEOwotCX0KKwl9IGVsc2UKKwkJZmxhZ3MgfD0gVE5GX01JR1JBVEVfRkFJTDsKIAogb3V0OgogCWlmIChwYWdlX25pZCAhPSAtMSkKZGlmZiAtLWdpdCBhL21tL21lbW9yeV9ob3RwbHVnLmMgYi9tbS9tZW1vcnlfaG90cGx1Zy5jCmluZGV4IDlmYWIxMDcuLjQ1N2JkZTUgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeV9ob3RwbHVnLmMKKysrIGIvbW0vbWVtb3J5X2hvdHBsdWcuYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAKIH0KIAotc3RhdGljIHZvaWQgbWVtX2hvdHBsdWdfYmVnaW4odm9pZCkKK3ZvaWQgbWVtX2hvdHBsdWdfYmVnaW4odm9pZCkKIHsKIAltZW1faG90cGx1Zy5hY3RpdmVfd3JpdGVyID0gY3VycmVudDsKIApAQCAtMTE5LDcgKzExOSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBtZW1faG90cGx1Z19kb25lKHZvaWQpCit2b2lkIG1lbV9ob3RwbHVnX2RvbmUodm9pZCkKIHsKIAltZW1faG90cGx1Zy5hY3RpdmVfd3JpdGVyID0gTlVMTDsKIAltdXRleF91bmxvY2soJm1lbV9ob3RwbHVnLmxvY2spOwpAQCAtNTAyLDcgKzUwMiw3IEBACiAJZW5kX3NlYyA9IHBmbl90b19zZWN0aW9uX25yKHBoeXNfc3RhcnRfcGZuICsgbnJfcGFnZXMgLSAxKTsKIAogCWZvciAoaSA9IHN0YXJ0X3NlYzsgaSA8PSBlbmRfc2VjOyBpKyspIHsKLQkJZXJyID0gX19hZGRfc2VjdGlvbihuaWQsIHpvbmUsIGkgPDwgUEZOX1NFQ1RJT05fU0hJRlQpOworCQllcnIgPSBfX2FkZF9zZWN0aW9uKG5pZCwgem9uZSwgc2VjdGlvbl9ucl90b19wZm4oaSkpOwogCiAJCS8qCiAJCSAqIEVFWElTVCBpcyBmaW5hbGx5IGRlYWx0IHdpdGggYnkgaW9yZXNvdXJjZSBjb2xsaXNpb24KQEAgLTk1OSw2ICs5NTksNyBAQAogfQogCiAKKy8qIE11c3QgYmUgcHJvdGVjdGVkIGJ5IG1lbV9ob3RwbHVnX2JlZ2luKCkgKi8KIGludCBfX3JlZiBvbmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBwZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMsIGludCBvbmxpbmVfdHlwZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtOTY5LDcgKzk3MCw2IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgbWVtb3J5X25vdGlmeSBhcmc7CiAKLQltZW1faG90cGx1Z19iZWdpbigpOwogCS8qCiAJICogVGhpcyBkb2Vzbid0IG5lZWQgYSBsb2NrIHRvIGRvIHBmbl90b19wYWdlKCkuCiAJICogVGhlIHNlY3Rpb24gY2FuJ3QgYmUgcmVtb3ZlZCBoZXJlIGJlY2F1c2Ugb2YgdGhlCkBAIC05NzcsMjEgKzk3NywyMCBAQAogCSAqLwogCXpvbmUgPSBwYWdlX3pvbmUocGZuX3RvX3BhZ2UocGZuKSk7CiAKLQlyZXQgPSAtRUlOVkFMOwogCWlmICgoem9uZV9pZHgoem9uZSkgPiBaT05FX05PUk1BTCB8fAogCSAgICBvbmxpbmVfdHlwZSA9PSBNTU9QX09OTElORV9NT1ZBQkxFKSAmJgogCSAgICAhY2FuX29ubGluZV9oaWdoX21vdmFibGUoem9uZSkpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChvbmxpbmVfdHlwZSA9PSBNTU9QX09OTElORV9LRVJORUwgJiYKIAkgICAgem9uZV9pZHgoem9uZSkgPT0gWk9ORV9NT1ZBQkxFKSB7CiAJCWlmIChtb3ZlX3Bmbl9yYW5nZV9sZWZ0KHpvbmUgLSAxLCB6b25lLCBwZm4sIHBmbiArIG5yX3BhZ2VzKSkKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChvbmxpbmVfdHlwZSA9PSBNTU9QX09OTElORV9NT1ZBQkxFICYmCiAJICAgIHpvbmVfaWR4KHpvbmUpID09IFpPTkVfTU9WQUJMRSAtIDEpIHsKIAkJaWYgKG1vdmVfcGZuX3JhbmdlX3JpZ2h0KHpvbmUsIHpvbmUgKyAxLCBwZm4sIHBmbiArIG5yX3BhZ2VzKSkKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJLyogUHJldmlvdXMgY29kZSBtYXkgY2hhbmdlZCB0aGUgem9uZSBvZiB0aGUgcGZuIHJhbmdlICovCkBAIC0xMDA3LDcgKzEwMDYsNyBAQAogCXJldCA9IG5vdGlmaWVyX3RvX2Vycm5vKHJldCk7CiAJaWYgKHJldCkgewogCQltZW1vcnlfbm90aWZ5KE1FTV9DQU5DRUxfT05MSU5FLCAmYXJnKTsKLQkJZ290byBvdXQ7CisJCXJldHVybiByZXQ7CiAJfQogCS8qCiAJICogSWYgdGhpcyB6b25lIGlzIG5vdCBwb3B1bGF0ZWQsIHRoZW4gaXQgaXMgbm90IGluIHpvbmVsaXN0LgpAQCAtMTAzMSw3ICsxMDMwLDcgQEAKIAkJICAgICAgICgoKHVuc2lnbmVkIGxvbmcgbG9uZykgcGZuICsgbnJfcGFnZXMpCiAJCQkgICAgPDwgUEFHRV9TSElGVCkgLSAxKTsKIAkJbWVtb3J5X25vdGlmeShNRU1fQ0FOQ0VMX09OTElORSwgJmFyZyk7Ci0JCWdvdG8gb3V0OworCQlyZXR1cm4gcmV0OwogCX0KIAogCXpvbmUtPnByZXNlbnRfcGFnZXMgKz0gb25saW5lZF9wYWdlczsKQEAgLTEwNjEsOSArMTA2MCw3IEBACiAKIAlpZiAob25saW5lZF9wYWdlcykKIAkJbWVtb3J5X25vdGlmeShNRU1fT05MSU5FLCAmYXJnKTsKLW91dDoKLQltZW1faG90cGx1Z19kb25lKCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfU1BBUlNFICovCiAKQEAgLTEwOTIsNiArMTA4OSwxMCBAQAogCQkJcmV0dXJuIE5VTEw7CiAKIAkJYXJjaF9yZWZyZXNoX25vZGVkYXRhKG5pZCwgcGdkYXQpOworCX0gZWxzZSB7CisJCS8qIFJlc2V0IHRoZSBucl96b25lcyBhbmQgY2xhc3N6b25lX2lkeCB0byAwIGJlZm9yZSByZXVzZSAqLworCQlwZ2RhdC0+bnJfem9uZXMgPSAwOworCQlwZ2RhdC0+Y2xhc3N6b25lX2lkeCA9IDA7CiAJfQogCiAJLyogd2UgY2FuIHVzZSBOT0RFX0RBVEEobmlkKSBmcm9tIGhlcmUgKi8KQEAgLTEzNzIsNyArMTM3Myw3IEBACiAJCQlpZiAoUGFnZUxSVShwYWdlKSkKIAkJCQlyZXR1cm4gcGZuOwogCQkJaWYgKFBhZ2VIdWdlKHBhZ2UpKSB7Ci0JCQkJaWYgKGlzX2h1Z2VwYWdlX2FjdGl2ZShwYWdlKSkKKwkJCQlpZiAocGFnZV9odWdlX2FjdGl2ZShwYWdlKSkKIAkJCQkJcmV0dXJuIHBmbjsKIAkJCQllbHNlCiAJCQkJCXBmbiA9IHJvdW5kX3VwKHBmbiArIDEsCkBAIC0xNjg0LDIxICsxNjg1LDE4IEBACiAJaWYgKCF0ZXN0X3BhZ2VzX2luX2Ffem9uZShzdGFydF9wZm4sIGVuZF9wZm4pKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW1lbV9ob3RwbHVnX2JlZ2luKCk7Ci0KIAl6b25lID0gcGFnZV96b25lKHBmbl90b19wYWdlKHN0YXJ0X3BmbikpOwogCW5vZGUgPSB6b25lX3RvX25pZCh6b25lKTsKIAlucl9wYWdlcyA9IGVuZF9wZm4gLSBzdGFydF9wZm47CiAKLQlyZXQgPSAtRUlOVkFMOwogCWlmICh6b25lX2lkeCh6b25lKSA8PSBaT05FX05PUk1BTCAmJiAhY2FuX29mZmxpbmVfbm9ybWFsKHpvbmUsIG5yX3BhZ2VzKSkKLQkJZ290byBvdXQ7CisJCXJldHVybiAtRUlOVkFMOwogCiAJLyogc2V0IGFib3ZlIHJhbmdlIGFzIGlzb2xhdGVkICovCiAJcmV0ID0gc3RhcnRfaXNvbGF0ZV9wYWdlX3JhbmdlKHN0YXJ0X3BmbiwgZW5kX3BmbiwKIAkJCQkgICAgICAgTUlHUkFURV9NT1ZBQkxFLCB0cnVlKTsKIAlpZiAocmV0KQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIHJldDsKIAogCWFyZy5zdGFydF9wZm4gPSBzdGFydF9wZm47CiAJYXJnLm5yX3BhZ2VzID0gbnJfcGFnZXM7CkBAIC0xNzkxLDcgKzE3ODksNiBAQAogCXdyaXRlYmFja19zZXRfcmF0ZWxpbWl0KCk7CiAKIAltZW1vcnlfbm90aWZ5KE1FTV9PRkZMSU5FLCAmYXJnKTsKLQltZW1faG90cGx1Z19kb25lKCk7CiAJcmV0dXJuIDA7CiAKIGZhaWxlZF9yZW1vdmFsOgpAQCAtMTgwMSwxMiArMTc5OCwxMCBAQAogCW1lbW9yeV9ub3RpZnkoTUVNX0NBTkNFTF9PRkZMSU5FLCAmYXJnKTsKIAkvKiBwdXNoYmFjayB0byBmcmVlIGFyZWEgKi8KIAl1bmRvX2lzb2xhdGVfcGFnZV9yYW5nZShzdGFydF9wZm4sIGVuZF9wZm4sIE1JR1JBVEVfTU9WQUJMRSk7Ci0KLW91dDoKLQltZW1faG90cGx1Z19kb25lKCk7CiAJcmV0dXJuIHJldDsKIH0KIAorLyogTXVzdCBiZSBwcm90ZWN0ZWQgYnkgbWVtX2hvdHBsdWdfYmVnaW4oKSAqLwogaW50IG9mZmxpbmVfcGFnZXModW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgbnJfcGFnZXMpCiB7CiAJcmV0dXJuIF9fb2ZmbGluZV9wYWdlcyhzdGFydF9wZm4sIHN0YXJ0X3BmbiArIG5yX3BhZ2VzLCAxMjAgKiBIWik7CkBAIC0xOTc3LDE1ICsxOTcyLDYgQEAKIAkJaWYgKGlzX3ZtYWxsb2NfYWRkcih6b25lLT53YWl0X3RhYmxlKSkKIAkJCXZmcmVlKHpvbmUtPndhaXRfdGFibGUpOwogCX0KLQotCS8qCi0JICogU2luY2UgdGhlcmUgaXMgbm8gd2F5IHRvIGd1YXJlbnRlZSB0aGUgYWRkcmVzcyBvZiBwZ2RhdC96b25lIGlzIG5vdAotCSAqIG9uIHN0YWNrIG9mIGFueSBrZXJuZWwgdGhyZWFkcyBvciB1c2VkIGJ5IG90aGVyIGtlcm5lbCBvYmplY3RzCi0JICogd2l0aG91dCByZWZlcmVuY2UgY291bnRpbmcgb3Igb3RoZXIgc3ltY2hyb25pemluZyBtZXRob2QsIGRvIG5vdAotCSAqIHJlc2V0IG5vZGVfZGF0YSBhbmQgZnJlZSBwZ2RhdCBoZXJlLiBKdXN0IHJlc2V0IGl0IHRvIDAgYW5kIHJldXNlCi0JICogdGhlIG1lbW9yeSB3aGVuIHRoZSBub2RlIGlzIG9ubGluZSBhZ2Fpbi4KLQkgKi8KLQltZW1zZXQocGdkYXQsIDAsIHNpemVvZigqcGdkYXQpKTsKIH0KIEVYUE9SVF9TWU1CT0wodHJ5X29mZmxpbmVfbm9kZSk7CiAKZGlmZiAtLWdpdCBhL21tL21lbXBvbGljeS5jIGIvbW0vbWVtcG9saWN5LmMKaW5kZXggNDcyMTA0Ni4uZWRlMjYyOSAxMDA2NDQKLS0tIGEvbW0vbWVtcG9saWN5LmMKKysrIGIvbW0vbWVtcG9saWN5LmMKQEAgLTk0NSw3ICs5NDUsOCBAQAogCQlyZXR1cm4gYWxsb2NfaHVnZV9wYWdlX25vZGUocGFnZV9oc3RhdGUoY29tcG91bmRfaGVhZChwYWdlKSksCiAJCQkJCW5vZGUpOwogCWVsc2UKLQkJcmV0dXJuIGFsbG9jX3BhZ2VzX2V4YWN0X25vZGUobm9kZSwgR0ZQX0hJR0hVU0VSX01PVkFCTEUsIDApOworCQlyZXR1cm4gYWxsb2NfcGFnZXNfZXhhY3Rfbm9kZShub2RlLCBHRlBfSElHSFVTRVJfTU9WQUJMRSB8CisJCQkJCQkgICAgX19HRlBfVEhJU05PREUsIDApOwogfQogCiAvKgpAQCAtMTk4NSw3ICsxOTg2LDggQEAKIAkJbm1hc2sgPSBwb2xpY3lfbm9kZW1hc2soZ2ZwLCBwb2wpOwogCQlpZiAoIW5tYXNrIHx8IG5vZGVfaXNzZXQobm9kZSwgKm5tYXNrKSkgewogCQkJbXBvbF9jb25kX3B1dChwb2wpOwotCQkJcGFnZSA9IGFsbG9jX3BhZ2VzX2V4YWN0X25vZGUobm9kZSwgZ2ZwLCBvcmRlcik7CisJCQlwYWdlID0gYWxsb2NfcGFnZXNfZXhhY3Rfbm9kZShub2RlLAorCQkJCQkJZ2ZwIHwgX19HRlBfVEhJU05PREUsIG9yZGVyKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvbW0vbWVtcG9vbC5jIGIvbW0vbWVtcG9vbC5jCmluZGV4IGUyMDljOTguLjJjYzA4ZGUgMTAwNjQ0Ci0tLSBhL21tL21lbXBvb2wuYworKysgYi9tbS9tZW1wb29sLmMKQEAgLTYsMjYgKzYsMTM4IEBACiAgKiAgZXh0cmVtZSBWTSBsb2FkLgogICoKICAqICBzdGFydGVkIGJ5IEluZ28gTW9sbmFyLCBDb3B5cmlnaHQgKEMpIDIwMDEKKyAqICBkZWJ1Z2dpbmcgYnkgRGF2aWQgUmllbnRqZXMsIENvcHlyaWdodCAoQykgMjAxNQogICovCiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgva2FzYW4uaD4KICNpbmNsdWRlIDxsaW51eC9rbWVtbGVhay5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KKyNpbmNsdWRlICJzbGFiLmgiCisKKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19TTEFCKSB8fCBkZWZpbmVkKENPTkZJR19TTFVCX0RFQlVHX09OKQorc3RhdGljIHZvaWQgcG9pc29uX2Vycm9yKG1lbXBvb2xfdCAqcG9vbCwgdm9pZCAqZWxlbWVudCwgc2l6ZV90IHNpemUsCisJCQkgc2l6ZV90IGJ5dGUpCit7CisJY29uc3QgaW50IG5yID0gcG9vbC0+Y3Vycl9ucjsKKwljb25zdCBpbnQgc3RhcnQgPSBtYXhfdChpbnQsIGJ5dGUgLSAoQklUU19QRVJfTE9ORyAvIDgpLCAwKTsKKwljb25zdCBpbnQgZW5kID0gbWluX3QoaW50LCBieXRlICsgKEJJVFNfUEVSX0xPTkcgLyA4KSwgc2l6ZSk7CisJaW50IGk7CisKKwlwcl9lcnIoIkJVRzogbWVtcG9vbCBlbGVtZW50IHBvaXNvbiBtaXNtYXRjaFxuIik7CisJcHJfZXJyKCJNZW1wb29sICVwIHNpemUgJXp1XG4iLCBwb29sLCBzaXplKTsKKwlwcl9lcnIoIiBucj0lZCBAICVwOiAlczB4IiwgbnIsIGVsZW1lbnQsIHN0YXJ0ID4gMCA/ICIuLi4gIiA6ICIiKTsKKwlmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKQorCQlwcl9jb250KCIleCAiLCAqKHU4ICopKGVsZW1lbnQgKyBpKSk7CisJcHJfY29udCgiJXNcbiIsIGVuZCA8IHNpemUgPyAiLi4uIiA6ICIiKTsKKwlkdW1wX3N0YWNrKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fY2hlY2tfZWxlbWVudChtZW1wb29sX3QgKnBvb2wsIHZvaWQgKmVsZW1lbnQsIHNpemVfdCBzaXplKQoreworCXU4ICpvYmogPSBlbGVtZW50OworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworCQl1OCBleHAgPSAoaSA8IHNpemUgLSAxKSA/IFBPSVNPTl9GUkVFIDogUE9JU09OX0VORDsKKworCQlpZiAob2JqW2ldICE9IGV4cCkgeworCQkJcG9pc29uX2Vycm9yKHBvb2wsIGVsZW1lbnQsIHNpemUsIGkpOworCQkJcmV0dXJuOworCQl9CisJfQorCW1lbXNldChvYmosIFBPSVNPTl9JTlVTRSwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2VsZW1lbnQobWVtcG9vbF90ICpwb29sLCB2b2lkICplbGVtZW50KQoreworCS8qIE1lbXBvb2xzIGJhY2tlZCBieSBzbGFiIGFsbG9jYXRvciAqLworCWlmIChwb29sLT5mcmVlID09IG1lbXBvb2xfZnJlZV9zbGFiIHx8IHBvb2wtPmZyZWUgPT0gbWVtcG9vbF9rZnJlZSkKKwkJX19jaGVja19lbGVtZW50KHBvb2wsIGVsZW1lbnQsIGtzaXplKGVsZW1lbnQpKTsKKworCS8qIE1lbXBvb2xzIGJhY2tlZCBieSBwYWdlIGFsbG9jYXRvciAqLworCWlmIChwb29sLT5mcmVlID09IG1lbXBvb2xfZnJlZV9wYWdlcykgeworCQlpbnQgb3JkZXIgPSAoaW50KShsb25nKXBvb2wtPnBvb2xfZGF0YTsKKwkJdm9pZCAqYWRkciA9IGttYXBfYXRvbWljKChzdHJ1Y3QgcGFnZSAqKWVsZW1lbnQpOworCisJCV9fY2hlY2tfZWxlbWVudChwb29sLCBhZGRyLCAxVUwgPDwgKFBBR0VfU0hJRlQgKyBvcmRlcikpOworCQlrdW5tYXBfYXRvbWljKGFkZHIpOworCX0KK30KKworc3RhdGljIHZvaWQgX19wb2lzb25fZWxlbWVudCh2b2lkICplbGVtZW50LCBzaXplX3Qgc2l6ZSkKK3sKKwl1OCAqb2JqID0gZWxlbWVudDsKKworCW1lbXNldChvYmosIFBPSVNPTl9GUkVFLCBzaXplIC0gMSk7CisJb2JqW3NpemUgLSAxXSA9IFBPSVNPTl9FTkQ7Cit9CisKK3N0YXRpYyB2b2lkIHBvaXNvbl9lbGVtZW50KG1lbXBvb2xfdCAqcG9vbCwgdm9pZCAqZWxlbWVudCkKK3sKKwkvKiBNZW1wb29scyBiYWNrZWQgYnkgc2xhYiBhbGxvY2F0b3IgKi8KKwlpZiAocG9vbC0+YWxsb2MgPT0gbWVtcG9vbF9hbGxvY19zbGFiIHx8IHBvb2wtPmFsbG9jID09IG1lbXBvb2xfa21hbGxvYykKKwkJX19wb2lzb25fZWxlbWVudChlbGVtZW50LCBrc2l6ZShlbGVtZW50KSk7CisKKwkvKiBNZW1wb29scyBiYWNrZWQgYnkgcGFnZSBhbGxvY2F0b3IgKi8KKwlpZiAocG9vbC0+YWxsb2MgPT0gbWVtcG9vbF9hbGxvY19wYWdlcykgeworCQlpbnQgb3JkZXIgPSAoaW50KShsb25nKXBvb2wtPnBvb2xfZGF0YTsKKwkJdm9pZCAqYWRkciA9IGttYXBfYXRvbWljKChzdHJ1Y3QgcGFnZSAqKWVsZW1lbnQpOworCisJCV9fcG9pc29uX2VsZW1lbnQoYWRkciwgMVVMIDw8IChQQUdFX1NISUZUICsgb3JkZXIpKTsKKwkJa3VubWFwX2F0b21pYyhhZGRyKTsKKwl9Cit9CisjZWxzZSAvKiBDT05GSUdfREVCVUdfU0xBQiB8fCBDT05GSUdfU0xVQl9ERUJVR19PTiAqLworc3RhdGljIGlubGluZSB2b2lkIGNoZWNrX2VsZW1lbnQobWVtcG9vbF90ICpwb29sLCB2b2lkICplbGVtZW50KQoreworfQorc3RhdGljIGlubGluZSB2b2lkIHBvaXNvbl9lbGVtZW50KG1lbXBvb2xfdCAqcG9vbCwgdm9pZCAqZWxlbWVudCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfU0xBQiB8fCBDT05GSUdfU0xVQl9ERUJVR19PTiAqLworCitzdGF0aWMgdm9pZCBrYXNhbl9wb2lzb25fZWxlbWVudChtZW1wb29sX3QgKnBvb2wsIHZvaWQgKmVsZW1lbnQpCit7CisJaWYgKHBvb2wtPmFsbG9jID09IG1lbXBvb2xfYWxsb2Nfc2xhYikKKwkJa2FzYW5fc2xhYl9mcmVlKHBvb2wtPnBvb2xfZGF0YSwgZWxlbWVudCk7CisJaWYgKHBvb2wtPmFsbG9jID09IG1lbXBvb2xfa21hbGxvYykKKwkJa2FzYW5fa2ZyZWUoZWxlbWVudCk7CisJaWYgKHBvb2wtPmFsbG9jID09IG1lbXBvb2xfYWxsb2NfcGFnZXMpCisJCWthc2FuX2ZyZWVfcGFnZXMoZWxlbWVudCwgKHVuc2lnbmVkIGxvbmcpcG9vbC0+cG9vbF9kYXRhKTsKK30KKworc3RhdGljIHZvaWQga2FzYW5fdW5wb2lzb25fZWxlbWVudChtZW1wb29sX3QgKnBvb2wsIHZvaWQgKmVsZW1lbnQpCit7CisJaWYgKHBvb2wtPmFsbG9jID09IG1lbXBvb2xfYWxsb2Nfc2xhYikKKwkJa2FzYW5fc2xhYl9hbGxvYyhwb29sLT5wb29sX2RhdGEsIGVsZW1lbnQpOworCWlmIChwb29sLT5hbGxvYyA9PSBtZW1wb29sX2ttYWxsb2MpCisJCWthc2FuX2tyZWFsbG9jKGVsZW1lbnQsIChzaXplX3QpcG9vbC0+cG9vbF9kYXRhKTsKKwlpZiAocG9vbC0+YWxsb2MgPT0gbWVtcG9vbF9hbGxvY19wYWdlcykKKwkJa2FzYW5fYWxsb2NfcGFnZXMoZWxlbWVudCwgKHVuc2lnbmVkIGxvbmcpcG9vbC0+cG9vbF9kYXRhKTsKK30KIAogc3RhdGljIHZvaWQgYWRkX2VsZW1lbnQobWVtcG9vbF90ICpwb29sLCB2b2lkICplbGVtZW50KQogewogCUJVR19PTihwb29sLT5jdXJyX25yID49IHBvb2wtPm1pbl9ucik7CisJcG9pc29uX2VsZW1lbnQocG9vbCwgZWxlbWVudCk7CisJa2FzYW5fcG9pc29uX2VsZW1lbnQocG9vbCwgZWxlbWVudCk7CiAJcG9vbC0+ZWxlbWVudHNbcG9vbC0+Y3Vycl9ucisrXSA9IGVsZW1lbnQ7CiB9CiAKIHN0YXRpYyB2b2lkICpyZW1vdmVfZWxlbWVudChtZW1wb29sX3QgKnBvb2wpCiB7Ci0JQlVHX09OKHBvb2wtPmN1cnJfbnIgPD0gMCk7Ci0JcmV0dXJuIHBvb2wtPmVsZW1lbnRzWy0tcG9vbC0+Y3Vycl9ucl07CisJdm9pZCAqZWxlbWVudCA9IHBvb2wtPmVsZW1lbnRzWy0tcG9vbC0+Y3Vycl9ucl07CisKKwlCVUdfT04ocG9vbC0+Y3Vycl9uciA8IDApOworCWNoZWNrX2VsZW1lbnQocG9vbCwgZWxlbWVudCk7CisJa2FzYW5fdW5wb2lzb25fZWxlbWVudChwb29sLCBlbGVtZW50KTsKKwlyZXR1cm4gZWxlbWVudDsKIH0KIAogLyoqCkBAIC0xMTMsMjMgKzIyNSwyNCBAQAogICogICAgICAgICAgICAgIG1lbXBvb2xfY3JlYXRlKCkuCiAgKiBAbmV3X21pbl9ucjogdGhlIG5ldyBtaW5pbXVtIG51bWJlciBvZiBlbGVtZW50cyBndWFyYW50ZWVkIHRvIGJlCiAgKiAgICAgICAgICAgICAgYWxsb2NhdGVkIGZvciB0aGlzIHBvb2wuCi0gKiBAZ2ZwX21hc2s6ICAgdGhlIHVzdWFsIGFsbG9jYXRpb24gYml0bWFzay4KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHNocmlua3MvZ3Jvd3MgdGhlIHBvb2wuIEluIHRoZSBjYXNlIG9mIGdyb3dpbmcsCiAgKiBpdCBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0aGF0IHRoZSBwb29sIHdpbGwgYmUgZ3Jvd24gdG8gdGhlIG5ldwogICogc2l6ZSBpbW1lZGlhdGVseSwgYnV0IG5ldyBtZW1wb29sX2ZyZWUoKSBjYWxscyB3aWxsIHJlZmlsbCBpdC4KKyAqIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwLgogICoKICAqIE5vdGUsIHRoZSBjYWxsZXIgbXVzdCBndWFyYW50ZWUgdGhhdCBubyBtZW1wb29sX2Rlc3Ryb3kgaXMgY2FsbGVkCiAgKiB3aGlsZSB0aGlzIGZ1bmN0aW9uIGlzIHJ1bm5pbmcuIG1lbXBvb2xfYWxsb2MoKSAmIG1lbXBvb2xfZnJlZSgpCiAgKiBtaWdodCBiZSBjYWxsZWQgKGVnLiBmcm9tIElSUSBjb250ZXh0cykgd2hpbGUgdGhpcyBmdW5jdGlvbiBleGVjdXRlcy4KICAqLwotaW50IG1lbXBvb2xfcmVzaXplKG1lbXBvb2xfdCAqcG9vbCwgaW50IG5ld19taW5fbnIsIGdmcF90IGdmcF9tYXNrKQoraW50IG1lbXBvb2xfcmVzaXplKG1lbXBvb2xfdCAqcG9vbCwgaW50IG5ld19taW5fbnIpCiB7CiAJdm9pZCAqZWxlbWVudDsKIAl2b2lkICoqbmV3X2VsZW1lbnRzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlCVUdfT04obmV3X21pbl9uciA8PSAwKTsKKwltaWdodF9zbGVlcCgpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKIAlpZiAobmV3X21pbl9uciA8PSBwb29sLT5taW5fbnIpIHsKQEAgLTE0NSw3ICsyNTgsOCBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKIAogCS8qIEdyb3cgdGhlIHBvb2wgKi8KLQluZXdfZWxlbWVudHMgPSBrbWFsbG9jKG5ld19taW5fbnIgKiBzaXplb2YoKm5ld19lbGVtZW50cyksIGdmcF9tYXNrKTsKKwluZXdfZWxlbWVudHMgPSBrbWFsbG9jX2FycmF5KG5ld19taW5fbnIsIHNpemVvZigqbmV3X2VsZW1lbnRzKSwKKwkJCQkgICAgIEdGUF9LRVJORUwpOwogCWlmICghbmV3X2VsZW1lbnRzKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTY0LDcgKzI3OCw3IEBACiAKIAl3aGlsZSAocG9vbC0+Y3Vycl9uciA8IHBvb2wtPm1pbl9ucikgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBmbGFncyk7Ci0JCWVsZW1lbnQgPSBwb29sLT5hbGxvYyhnZnBfbWFzaywgcG9vbC0+cG9vbF9kYXRhKTsKKwkJZWxlbWVudCA9IHBvb2wtPmFsbG9jKEdGUF9LRVJORUwsIHBvb2wtPnBvb2xfZGF0YSk7CiAJCWlmICghZWxlbWVudCkKIAkJCWdvdG8gb3V0OwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOwpAQCAtMzMyLDYgKzQ0Niw3IEBACiB2b2lkICptZW1wb29sX2FsbG9jX3NsYWIoZ2ZwX3QgZ2ZwX21hc2ssIHZvaWQgKnBvb2xfZGF0YSkKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqbWVtID0gcG9vbF9kYXRhOworCVZNX0JVR19PTihtZW0tPmN0b3IpOwogCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKG1lbSwgZ2ZwX21hc2spOwogfQogRVhQT1JUX1NZTUJPTChtZW1wb29sX2FsbG9jX3NsYWIpOwpkaWZmIC0tZ2l0IGEvbW0vbWVtdGVzdC5jIGIvbW0vbWVtdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OTdkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9tbS9tZW10ZXN0LmMKQEAgLTAsMCArMSwxMTggQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGZuLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKworc3RhdGljIHU2NCBwYXR0ZXJuc1tdIF9faW5pdGRhdGEgPSB7CisJLyogVGhlIGZpcnN0IGVudHJ5IGhhcyB0byBiZSAwIHRvIGxlYXZlIG1lbXRlc3Qgd2l0aCB6ZXJvZWQgbWVtb3J5ICovCisJMCwKKwkweGZmZmZmZmZmZmZmZmZmZmZVTEwsCisJMHg1NTU1NTU1NTU1NTU1NTU1VUxMLAorCTB4YWFhYWFhYWFhYWFhYWFhYVVMTCwKKwkweDExMTExMTExMTExMTExMTFVTEwsCisJMHgyMjIyMjIyMjIyMjIyMjIyVUxMLAorCTB4NDQ0NDQ0NDQ0NDQ0NDQ0NFVMTCwKKwkweDg4ODg4ODg4ODg4ODg4ODhVTEwsCisJMHgzMzMzMzMzMzMzMzMzMzMzVUxMLAorCTB4NjY2NjY2NjY2NjY2NjY2NlVMTCwKKwkweDk5OTk5OTk5OTk5OTk5OTlVTEwsCisJMHhjY2NjY2NjY2NjY2NjY2NjVUxMLAorCTB4Nzc3Nzc3Nzc3Nzc3Nzc3N1VMTCwKKwkweGJiYmJiYmJiYmJiYmJiYmJVTEwsCisJMHhkZGRkZGRkZGRkZGRkZGRkVUxMLAorCTB4ZWVlZWVlZWVlZWVlZWVlZVVMTCwKKwkweDdhNmM3MjU4NTU0ZTQ5NGNVTEwsIC8qIHllYWggOy0pICovCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgcmVzZXJ2ZV9iYWRfbWVtKHU2NCBwYXR0ZXJuLCBwaHlzX2FkZHJfdCBzdGFydF9iYWQsIHBoeXNfYWRkcl90IGVuZF9iYWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiICAlMDE2bGx4IGJhZCBtZW0gYWRkciAlMDEwbGx4IC0gJTAxMGxseCByZXNlcnZlZFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGF0dGVybiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhcnRfYmFkLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBlbmRfYmFkKTsKKwltZW1ibG9ja19yZXNlcnZlKHN0YXJ0X2JhZCwgZW5kX2JhZCAtIHN0YXJ0X2JhZCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtZW10ZXN0KHU2NCBwYXR0ZXJuLCBwaHlzX2FkZHJfdCBzdGFydF9waHlzLCBwaHlzX2FkZHJfdCBzaXplKQoreworCXU2NCAqcCwgKnN0YXJ0LCAqZW5kOworCXBoeXNfYWRkcl90IHN0YXJ0X2JhZCwgbGFzdF9iYWQ7CisJcGh5c19hZGRyX3Qgc3RhcnRfcGh5c19hbGlnbmVkOworCWNvbnN0IHNpemVfdCBpbmNyID0gc2l6ZW9mKHBhdHRlcm4pOworCisJc3RhcnRfcGh5c19hbGlnbmVkID0gQUxJR04oc3RhcnRfcGh5cywgaW5jcik7CisJc3RhcnQgPSBfX3ZhKHN0YXJ0X3BoeXNfYWxpZ25lZCk7CisJZW5kID0gc3RhcnQgKyAoc2l6ZSAtIChzdGFydF9waHlzX2FsaWduZWQgLSBzdGFydF9waHlzKSkgLyBpbmNyOworCXN0YXJ0X2JhZCA9IDA7CisJbGFzdF9iYWQgPSAwOworCisJZm9yIChwID0gc3RhcnQ7IHAgPCBlbmQ7IHArKykKKwkJKnAgPSBwYXR0ZXJuOworCisJZm9yIChwID0gc3RhcnQ7IHAgPCBlbmQ7IHArKywgc3RhcnRfcGh5c19hbGlnbmVkICs9IGluY3IpIHsKKwkJaWYgKCpwID09IHBhdHRlcm4pCisJCQljb250aW51ZTsKKwkJaWYgKHN0YXJ0X3BoeXNfYWxpZ25lZCA9PSBsYXN0X2JhZCArIGluY3IpIHsKKwkJCWxhc3RfYmFkICs9IGluY3I7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RhcnRfYmFkKQorCQkJcmVzZXJ2ZV9iYWRfbWVtKHBhdHRlcm4sIHN0YXJ0X2JhZCwgbGFzdF9iYWQgKyBpbmNyKTsKKwkJc3RhcnRfYmFkID0gbGFzdF9iYWQgPSBzdGFydF9waHlzX2FsaWduZWQ7CisJfQorCWlmIChzdGFydF9iYWQpCisJCXJlc2VydmVfYmFkX21lbShwYXR0ZXJuLCBzdGFydF9iYWQsIGxhc3RfYmFkICsgaW5jcik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBkb19vbmVfcGFzcyh1NjQgcGF0dGVybiwgcGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZCkKK3sKKwl1NjQgaTsKKwlwaHlzX2FkZHJfdCB0aGlzX3N0YXJ0LCB0aGlzX2VuZDsKKworCWZvcl9lYWNoX2ZyZWVfbWVtX3JhbmdlKGksIE5VTUFfTk9fTk9ERSwgJnRoaXNfc3RhcnQsICZ0aGlzX2VuZCwgTlVMTCkgeworCQl0aGlzX3N0YXJ0ID0gY2xhbXAodGhpc19zdGFydCwgc3RhcnQsIGVuZCk7CisJCXRoaXNfZW5kID0gY2xhbXAodGhpc19lbmQsIHN0YXJ0LCBlbmQpOworCQlpZiAodGhpc19zdGFydCA8IHRoaXNfZW5kKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIgICUwMTBsbHggLSAlMDEwbGx4IHBhdHRlcm4gJTAxNmxseFxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXRoaXNfc3RhcnQsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0aGlzX2VuZCwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWNwdV90b19iZTY0KHBhdHRlcm4pKTsKKwkJCW1lbXRlc3QocGF0dGVybiwgdGhpc19zdGFydCwgdGhpc19lbmQgLSB0aGlzX3N0YXJ0KTsKKwkJfQorCX0KK30KKworLyogZGVmYXVsdCBpcyBkaXNhYmxlZCAqLworc3RhdGljIGludCBtZW10ZXN0X3BhdHRlcm4gX19pbml0ZGF0YTsKKworc3RhdGljIGludCBfX2luaXQgcGFyc2VfbWVtdGVzdChjaGFyICphcmcpCit7CisJaWYgKGFyZykKKwkJbWVtdGVzdF9wYXR0ZXJuID0gc2ltcGxlX3N0cnRvdWwoYXJnLCBOVUxMLCAwKTsKKwllbHNlCisJCW1lbXRlc3RfcGF0dGVybiA9IEFSUkFZX1NJWkUocGF0dGVybnMpOworCisJcmV0dXJuIDA7Cit9CisKK2Vhcmx5X3BhcmFtKCJtZW10ZXN0IiwgcGFyc2VfbWVtdGVzdCk7CisKK3ZvaWQgX19pbml0IGVhcmx5X21lbXRlc3QocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gMDsKKworCWlmICghbWVtdGVzdF9wYXR0ZXJuKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9JTkZPICJlYXJseV9tZW10ZXN0OiAjIG9mIHRlc3RzOiAlZFxuIiwgbWVtdGVzdF9wYXR0ZXJuKTsKKwlmb3IgKGkgPSBtZW10ZXN0X3BhdHRlcm4tMTsgaSA8IFVJTlRfTUFYOyAtLWkpIHsKKwkJaWR4ID0gaSAlIEFSUkFZX1NJWkUocGF0dGVybnMpOworCQlkb19vbmVfcGFzcyhwYXR0ZXJuc1tpZHhdLCBzdGFydCwgZW5kKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmMKaW5kZXggODVlMDQyNi4uZjUzODM4ZiAxMDA2NDQKLS0tIGEvbW0vbWlncmF0ZS5jCisrKyBiL21tL21pZ3JhdGUuYwpAQCAtNTM3LDcgKzUzNyw4IEBACiAJICogUGxlYXNlIGRvIG5vdCByZW9yZGVyIHRoaXMgd2l0aG91dCBjb25zaWRlcmluZyBob3cgbW0va3NtLmMncwogCSAqIGdldF9rc21fcGFnZSgpIGRlcGVuZHMgdXBvbiBrc21fbWlncmF0ZV9wYWdlKCkgYW5kIFBhZ2VTd2FwQ2FjaGUoKS4KIAkgKi8KLQlDbGVhclBhZ2VTd2FwQ2FjaGUocGFnZSk7CisJaWYgKFBhZ2VTd2FwQ2FjaGUocGFnZSkpCisJCUNsZWFyUGFnZVN3YXBDYWNoZShwYWdlKTsKIAlDbGVhclBhZ2VQcml2YXRlKHBhZ2UpOwogCXNldF9wYWdlX3ByaXZhdGUocGFnZSwgMCk7CiAKQEAgLTkwMSwxMiArOTAyLDIzIEBACiB9CiAKIC8qCisgKiBnY2MgNC43IGFuZCA0Ljggb24gYXJtIGdldCBhbiBJQ0VzIHdoZW4gaW5saW5pbmcgdW5tYXBfYW5kX21vdmUoKS4gIFdvcmsKKyAqIGFyb3VuZCBpdC4KKyAqLworI2lmIChHQ0NfVkVSU0lPTiA+PSA0MDcwMCAmJiBHQ0NfVkVSU0lPTiA8IDQwOTAwKSAmJiBkZWZpbmVkKENPTkZJR19BUk0pCisjZGVmaW5lIElDRV9ub2lubGluZSBub2lubGluZQorI2Vsc2UKKyNkZWZpbmUgSUNFX25vaW5saW5lCisjZW5kaWYKKworLyoKICAqIE9idGFpbiB0aGUgbG9jayBvbiBwYWdlLCByZW1vdmUgYWxsIHB0ZXMgYW5kIG1pZ3JhdGUgdGhlIHBhZ2UKICAqIHRvIHRoZSBuZXdseSBhbGxvY2F0ZWQgcGFnZSBpbiBuZXdwYWdlLgogICovCi1zdGF0aWMgaW50IHVubWFwX2FuZF9tb3ZlKG5ld19wYWdlX3QgZ2V0X25ld19wYWdlLCBmcmVlX3BhZ2VfdCBwdXRfbmV3X3BhZ2UsCi0JCQl1bnNpZ25lZCBsb25nIHByaXZhdGUsIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgZm9yY2UsCi0JCQllbnVtIG1pZ3JhdGVfbW9kZSBtb2RlKQorc3RhdGljIElDRV9ub2lubGluZSBpbnQgdW5tYXBfYW5kX21vdmUobmV3X3BhZ2VfdCBnZXRfbmV3X3BhZ2UsCisJCQkJICAgZnJlZV9wYWdlX3QgcHV0X25ld19wYWdlLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgcHJpdmF0ZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgaW50IGZvcmNlLCBlbnVtIG1pZ3JhdGVfbW9kZSBtb2RlKQogewogCWludCByYyA9IDA7CiAJaW50ICpyZXN1bHQgPSBOVUxMOwpAQCAtMTU1NCwzMCArMTU2NiwxMCBAQAogICogcGFnZSBtaWdyYXRpb24gcmF0ZSBsaW1pdGluZyBjb250cm9sLgogICogRG8gbm90IG1pZ3JhdGUgbW9yZSB0aGFuIEBwYWdlc190b19taWdyYXRlIGluIGEgQG1pZ3JhdGVfaW50ZXJ2YWxfbWlsbGlzZWNzCiAgKiB3aW5kb3cgb2YgdGltZS4gRGVmYXVsdCBoZXJlIHNheXMgZG8gbm90IG1pZ3JhdGUgbW9yZSB0aGFuIDEyODBNIHBlciBzZWNvbmQuCi0gKiBJZiBhIG5vZGUgaXMgcmF0ZS1saW1pdGVkIHRoZW4gUFRFIE5VTUEgdXBkYXRlcyBhcmUgYWxzbyByYXRlLWxpbWl0ZWQuIEhvd2V2ZXIKLSAqIGFzIGl0IGlzIGZhdWx0cyB0aGF0IHJlc2V0IHRoZSB3aW5kb3csIHB0ZSB1cGRhdGVzIHdpbGwgaGFwcGVuIHVuY29uZGl0aW9uYWxseQotICogaWYgdGhlcmUgaGFzIG5vdCBiZWVuIGEgZmF1bHQgc2luY2UgQHB0ZXVwZGF0ZV9pbnRlcnZhbF9taWxsaXNlY3MgYWZ0ZXIgdGhlCi0gKiB0aHJvdHRsZSB3aW5kb3cgY2xvc2VkLgogICovCiBzdGF0aWMgdW5zaWduZWQgaW50IG1pZ3JhdGVfaW50ZXJ2YWxfbWlsbGlzZWNzIF9fcmVhZF9tb3N0bHkgPSAxMDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IHB0ZXVwZGF0ZV9pbnRlcnZhbF9taWxsaXNlY3MgX19yZWFkX21vc3RseSA9IDEwMDA7CiBzdGF0aWMgdW5zaWduZWQgaW50IHJhdGVsaW1pdF9wYWdlcyBfX3JlYWRfbW9zdGx5ID0gMTI4IDw8ICgyMCAtIFBBR0VfU0hJRlQpOwogCi0vKiBSZXR1cm5zIHRydWUgaWYgTlVNQSBtaWdyYXRpb24gaXMgY3VycmVudGx5IHJhdGUgbGltaXRlZCAqLwotYm9vbCBtaWdyYXRlX3JhdGVsaW1pdGVkKGludCBub2RlKQotewotCXBnX2RhdGFfdCAqcGdkYXQgPSBOT0RFX0RBVEEobm9kZSk7Ci0KLQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBwZ2RhdC0+bnVtYWJhbGFuY2luZ19taWdyYXRlX25leHRfd2luZG93ICsKLQkJCQltc2Vjc190b19qaWZmaWVzKHB0ZXVwZGF0ZV9pbnRlcnZhbF9taWxsaXNlY3MpKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKHBnZGF0LT5udW1hYmFsYW5jaW5nX21pZ3JhdGVfbnJfcGFnZXMgPCByYXRlbGltaXRfcGFnZXMpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCiAvKiBSZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaXMgbWlncmF0ZSByYXRlLWxpbWl0ZWQgYWZ0ZXIgdGhlIHVwZGF0ZSAqLwogc3RhdGljIGJvb2wgbnVtYW1pZ3JhdGVfdXBkYXRlX3JhdGVsaW1pdChwZ19kYXRhX3QgKnBnZGF0LAogCQkJCQl1bnNpZ25lZCBsb25nIG5yX3BhZ2VzKQpkaWZmIC0tZ2l0IGEvbW0vbWxvY2suYyBiL21tL21sb2NrLmMKaW5kZXggOGE1NGNkMi4uNmZkMmNmMSAxMDA2NDQKLS0tIGEvbW0vbWxvY2suYworKysgYi9tbS9tbG9jay5jCkBAIC0yMDUsNjIgKzIwNSw2IEBACiAJcmV0dXJuIG5yX3BhZ2VzIC0gMTsKIH0KIAotLyoqCi0gKiBfX21sb2NrX3ZtYV9wYWdlc19yYW5nZSgpIC0gIG1sb2NrIGEgcmFuZ2Ugb2YgcGFnZXMgaW4gdGhlIHZtYS4KLSAqIEB2bWE6ICAgdGFyZ2V0IHZtYQotICogQHN0YXJ0OiBzdGFydCBhZGRyZXNzCi0gKiBAZW5kOiAgIGVuZCBhZGRyZXNzCi0gKiBAbm9uYmxvY2tpbmc6Ci0gKgotICogVGhpcyB0YWtlcyBjYXJlIG9mIG1ha2luZyB0aGUgcGFnZXMgcHJlc2VudCB0b28uCi0gKgotICogcmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBlcnJvci4KLSAqCi0gKiB2bWEtPnZtX21tLT5tbWFwX3NlbSBtdXN0IGJlIGhlbGQuCi0gKgotICogSWYgQG5vbmJsb2NraW5nIGlzIE5VTEwsIGl0IG1heSBiZSBoZWxkIGZvciByZWFkIG9yIHdyaXRlIGFuZCB3aWxsCi0gKiBiZSB1bnBlcnR1cmJlZC4KLSAqCi0gKiBJZiBAbm9uYmxvY2tpbmcgaXMgbm9uLU5VTEwsIGl0IG11c3QgaGVsZCBmb3IgcmVhZCBvbmx5IGFuZCBtYXkgYmUKLSAqIHJlbGVhc2VkLiAgSWYgaXQncyByZWxlYXNlZCwgKkBub25ibG9ja2luZyB3aWxsIGJlIHNldCB0byAwLgotICovCi1sb25nIF9fbWxvY2tfdm1hX3BhZ2VzX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAotCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwgaW50ICpub25ibG9ja2luZykKLXsKLQlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IHZtYS0+dm1fbW07Ci0JdW5zaWduZWQgbG9uZyBucl9wYWdlcyA9IChlbmQgLSBzdGFydCkgLyBQQUdFX1NJWkU7Ci0JaW50IGd1cF9mbGFnczsKLQotCVZNX0JVR19PTihzdGFydCAmIH5QQUdFX01BU0spOwotCVZNX0JVR19PTihlbmQgICAmIH5QQUdFX01BU0spOwotCVZNX0JVR19PTl9WTUEoc3RhcnQgPCB2bWEtPnZtX3N0YXJ0LCB2bWEpOwotCVZNX0JVR19PTl9WTUEoZW5kICAgPiB2bWEtPnZtX2VuZCwgdm1hKTsKLQlWTV9CVUdfT05fTU0oIXJ3c2VtX2lzX2xvY2tlZCgmbW0tPm1tYXBfc2VtKSwgbW0pOwotCi0JZ3VwX2ZsYWdzID0gRk9MTF9UT1VDSCB8IEZPTExfTUxPQ0s7Ci0JLyoKLQkgKiBXZSB3YW50IHRvIHRvdWNoIHdyaXRhYmxlIG1hcHBpbmdzIHdpdGggYSB3cml0ZSBmYXVsdCBpbiBvcmRlcgotCSAqIHRvIGJyZWFrIENPVywgZXhjZXB0IGZvciBzaGFyZWQgbWFwcGluZ3MgYmVjYXVzZSB0aGVzZSBkb24ndCBDT1cKLQkgKiBhbmQgd2Ugd291bGQgbm90IHdhbnQgdG8gZGlydHkgdGhlbSBmb3Igbm90aGluZy4KLQkgKi8KLQlpZiAoKHZtYS0+dm1fZmxhZ3MgJiAoVk1fV1JJVEUgfCBWTV9TSEFSRUQpKSA9PSBWTV9XUklURSkKLQkJZ3VwX2ZsYWdzIHw9IEZPTExfV1JJVEU7Ci0KLQkvKgotCSAqIFdlIHdhbnQgbWxvY2sgdG8gc3VjY2VlZCBmb3IgcmVnaW9ucyB0aGF0IGhhdmUgYW55IHBlcm1pc3Npb25zCi0JICogb3RoZXIgdGhhbiBQUk9UX05PTkUuCi0JICovCi0JaWYgKHZtYS0+dm1fZmxhZ3MgJiAoVk1fUkVBRCB8IFZNX1dSSVRFIHwgVk1fRVhFQykpCi0JCWd1cF9mbGFncyB8PSBGT0xMX0ZPUkNFOwotCi0JLyoKLQkgKiBXZSBtYWRlIHN1cmUgYWRkciBpcyB3aXRoaW4gYSBWTUEsIHNvIHRoZSBmb2xsb3dpbmcgd2lsbAotCSAqIG5vdCByZXN1bHQgaW4gYSBzdGFjayBleHBhbnNpb24gdGhhdCByZWN1cnNlcyBiYWNrIGhlcmUuCi0JICovCi0JcmV0dXJuIF9fZ2V0X3VzZXJfcGFnZXMoY3VycmVudCwgbW0sIHN0YXJ0LCBucl9wYWdlcywgZ3VwX2ZsYWdzLAotCQkJCU5VTEwsIE5VTEwsIG5vbmJsb2NraW5nKTsKLX0KLQogLyoKICAqIGNvbnZlcnQgZ2V0X3VzZXJfcGFnZXMoKSByZXR1cm4gdmFsdWUgdG8gcG9zaXggbWxvY2soKSBlcnJvcgogICovCkBAIC01OTYsNyArNTQwLDcgQEAKIAkvKgogCSAqIHZtX2ZsYWdzIGlzIHByb3RlY3RlZCBieSB0aGUgbW1hcF9zZW0gaGVsZCBpbiB3cml0ZSBtb2RlLgogCSAqIEl0J3Mgb2theSBpZiB0cnlfdG9fdW5tYXBfb25lIHVubWFwcyBhIHBhZ2UganVzdCBhZnRlciB3ZQotCSAqIHNldCBWTV9MT0NLRUQsIF9fbWxvY2tfdm1hX3BhZ2VzX3JhbmdlIHdpbGwgYnJpbmcgaXQgYmFjay4KKwkgKiBzZXQgVk1fTE9DS0VELCBwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSB3aWxsIGJyaW5nIGl0IGJhY2suCiAJICovCiAKIAlpZiAobG9jaykKQEAgLTY2MCw2OSArNjA0LDYgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLS8qCi0gKiBfX21tX3BvcHVsYXRlIC0gcG9wdWxhdGUgYW5kL29yIG1sb2NrIHBhZ2VzIHdpdGhpbiBhIHJhbmdlIG9mIGFkZHJlc3Mgc3BhY2UuCi0gKgotICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBtbG9jaygpIGFuZCB0aGUgTUFQX1BPUFVMQVRFIC8gTUFQX0xPQ0tFRCBtbWFwCi0gKiBmbGFncy4gVk1BcyBtdXN0IGJlIGFscmVhZHkgbWFya2VkIHdpdGggdGhlIGRlc2lyZWQgdm1fZmxhZ3MsIGFuZAotICogbW1hcF9zZW0gbXVzdCBub3QgYmUgaGVsZC4KLSAqLwotaW50IF9fbW1fcG9wdWxhdGUodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsZW4sIGludCBpZ25vcmVfZXJyb3JzKQotewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07Ci0JdW5zaWduZWQgbG9uZyBlbmQsIG5zdGFydCwgbmVuZDsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IE5VTEw7Ci0JaW50IGxvY2tlZCA9IDA7Ci0JbG9uZyByZXQgPSAwOwotCi0JVk1fQlVHX09OKHN0YXJ0ICYgflBBR0VfTUFTSyk7Ci0JVk1fQlVHX09OKGxlbiAhPSBQQUdFX0FMSUdOKGxlbikpOwotCWVuZCA9IHN0YXJ0ICsgbGVuOwotCi0JZm9yIChuc3RhcnQgPSBzdGFydDsgbnN0YXJ0IDwgZW5kOyBuc3RhcnQgPSBuZW5kKSB7Ci0JCS8qCi0JCSAqIFdlIHdhbnQgdG8gZmF1bHQgaW4gcGFnZXMgZm9yIFtuc3RhcnQ7IGVuZCkgYWRkcmVzcyByYW5nZS4KLQkJICogRmluZCBmaXJzdCBjb3JyZXNwb25kaW5nIFZNQS4KLQkJICovCi0JCWlmICghbG9ja2VkKSB7Ci0JCQlsb2NrZWQgPSAxOwotCQkJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwotCQkJdm1hID0gZmluZF92bWEobW0sIG5zdGFydCk7Ci0JCX0gZWxzZSBpZiAobnN0YXJ0ID49IHZtYS0+dm1fZW5kKQotCQkJdm1hID0gdm1hLT52bV9uZXh0OwotCQlpZiAoIXZtYSB8fCB2bWEtPnZtX3N0YXJ0ID49IGVuZCkKLQkJCWJyZWFrOwotCQkvKgotCQkgKiBTZXQgW25zdGFydDsgbmVuZCkgdG8gaW50ZXJzZWN0aW9uIG9mIGRlc2lyZWQgYWRkcmVzcwotCQkgKiByYW5nZSB3aXRoIHRoZSBmaXJzdCBWTUEuIEFsc28sIHNraXAgdW5kZXNpcmFibGUgVk1BIHR5cGVzLgotCQkgKi8KLQkJbmVuZCA9IG1pbihlbmQsIHZtYS0+dm1fZW5kKTsKLQkJaWYgKHZtYS0+dm1fZmxhZ3MgJiAoVk1fSU8gfCBWTV9QRk5NQVApKQotCQkJY29udGludWU7Ci0JCWlmIChuc3RhcnQgPCB2bWEtPnZtX3N0YXJ0KQotCQkJbnN0YXJ0ID0gdm1hLT52bV9zdGFydDsKLQkJLyoKLQkJICogTm93IGZhdWx0IGluIGEgcmFuZ2Ugb2YgcGFnZXMuIF9fbWxvY2tfdm1hX3BhZ2VzX3JhbmdlKCkKLQkJICogZG91YmxlIGNoZWNrcyB0aGUgdm1hIGZsYWdzLCBzbyB0aGF0IGl0IHdvbid0IG1sb2NrIHBhZ2VzCi0JCSAqIGlmIHRoZSB2bWEgd2FzIGFscmVhZHkgbXVubG9ja2VkLgotCQkgKi8KLQkJcmV0ID0gX19tbG9ja192bWFfcGFnZXNfcmFuZ2Uodm1hLCBuc3RhcnQsIG5lbmQsICZsb2NrZWQpOwotCQlpZiAocmV0IDwgMCkgewotCQkJaWYgKGlnbm9yZV9lcnJvcnMpIHsKLQkJCQlyZXQgPSAwOwotCQkJCWNvbnRpbnVlOwkvKiBjb250aW51ZSBhdCBuZXh0IFZNQSAqLwotCQkJfQotCQkJcmV0ID0gX19tbG9ja19wb3NpeF9lcnJvcl9yZXR1cm4ocmV0KTsKLQkJCWJyZWFrOwotCQl9Ci0JCW5lbmQgPSBuc3RhcnQgKyByZXQgKiBQQUdFX1NJWkU7Ci0JCXJldCA9IDA7Ci0JfQotCWlmIChsb2NrZWQpCi0JCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Ci0JcmV0dXJuIHJldDsJLyogMCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlICovCi19Ci0KIFNZU0NBTExfREVGSU5FMihtbG9jaywgdW5zaWduZWQgbG9uZywgc3RhcnQsIHNpemVfdCwgbGVuKQogewogCXVuc2lnbmVkIGxvbmcgbG9ja2VkOwpAQCAtNzUwLDkgKzYzMSwxMyBAQAogCQllcnJvciA9IGRvX21sb2NrKHN0YXJ0LCBsZW4sIDEpOwogCiAJdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci0JaWYgKCFlcnJvcikKLQkJZXJyb3IgPSBfX21tX3BvcHVsYXRlKHN0YXJ0LCBsZW4sIDApOwotCXJldHVybiBlcnJvcjsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKworCWVycm9yID0gX19tbV9wb3B1bGF0ZShzdGFydCwgbGVuLCAwKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBfX21sb2NrX3Bvc2l4X2Vycm9yX3JldHVybihlcnJvcik7CisJcmV0dXJuIDA7CiB9CiAKIFNZU0NBTExfREVGSU5FMihtdW5sb2NrLCB1bnNpZ25lZCBsb25nLCBzdGFydCwgc2l6ZV90LCBsZW4pCmRpZmYgLS1naXQgYS9tbS9tbWFwLmMgYi9tbS9tbWFwLmMKaW5kZXggZGE5OTkwYS4uYmI1MGNhYyAxMDA2NDQKLS0tIGEvbW0vbW1hcC5jCisrKyBiL21tL21tYXAuYwpAQCAtNzc0LDEwICs3NzQsOCBAQAogCiAJCQlpbXBvcnRlci0+YW5vbl92bWEgPSBleHBvcnRlci0+YW5vbl92bWE7CiAJCQllcnJvciA9IGFub25fdm1hX2Nsb25lKGltcG9ydGVyLCBleHBvcnRlcik7Ci0JCQlpZiAoZXJyb3IpIHsKLQkJCQlpbXBvcnRlci0+YW5vbl92bWEgPSBOVUxMOworCQkJaWYgKGVycm9yKQogCQkJCXJldHVybiBlcnJvcjsKLQkJCX0KIAkJfQogCX0KIApAQCAtMTEzNSw3ICsxMTMzLDcgQEAKICAqIGJ5IGFub3RoZXIgcGFnZSBmYXVsdCB0cnlpbmcgdG8gbWVyZ2UgX3RoYXRfLiBCdXQgdGhhdCdzIG9rOiBpZiBpdAogICogaXMgYmVpbmcgc2V0IHVwLCB0aGF0IGF1dG9tYXRpY2FsbHkgbWVhbnMgdGhhdCBpdCB3aWxsIGJlIGEgc2luZ2xldG9uCiAgKiBhY2NlcHRhYmxlIGZvciBtZXJnaW5nLCBzbyB3ZSBjYW4gZG8gYWxsIG9mIHRoaXMgb3B0aW1pc3RpY2FsbHkuIEJ1dAotICogd2UgZG8gdGhhdCBBQ0NFU1NfT05DRSgpIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIG5ldmVyIHJlLWxvYWQgdGhlIHBvaW50ZXIuCisgKiB3ZSBkbyB0aGF0IFJFQURfT05DRSgpIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIG5ldmVyIHJlLWxvYWQgdGhlIHBvaW50ZXIuCiAgKgogICogSU9XOiB0aGF0IHRoZSAibGlzdF9pc19zaW5ndWxhcigpIiB0ZXN0IG9uIHRoZSBhbm9uX3ZtYV9jaGFpbiBvbmx5CiAgKiBtYXR0ZXJzIGZvciB0aGUgJ3N0YWJsZSBhbm9uX3ZtYScgY2FzZSAoaWUgdGhlIHRoaW5nIHdlIHdhbnQgdG8gYXZvaWQKQEAgLTExNDksNyArMTE0Nyw3IEBACiBzdGF0aWMgc3RydWN0IGFub25fdm1hICpyZXVzYWJsZV9hbm9uX3ZtYShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKm9sZCwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICphLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmIpCiB7CiAJaWYgKGFub25fdm1hX2NvbXBhdGlibGUoYSwgYikpIHsKLQkJc3RydWN0IGFub25fdm1hICphbm9uX3ZtYSA9IEFDQ0VTU19PTkNFKG9sZC0+YW5vbl92bWEpOworCQlzdHJ1Y3QgYW5vbl92bWEgKmFub25fdm1hID0gUkVBRF9PTkNFKG9sZC0+YW5vbl92bWEpOwogCiAJCWlmIChhbm9uX3ZtYSAmJiBsaXN0X2lzX3Npbmd1bGFyKCZvbGQtPmFub25fdm1hX2NoYWluKSkKIAkJCXJldHVybiBhbm9uX3ZtYTsKQEAgLTE1NTMsMTEgKzE1NTEsMTAgQEAKIAogCS8qIENsZWFyIG9sZCBtYXBzICovCiAJZXJyb3IgPSAtRU5PTUVNOwotbXVubWFwX2JhY2s6Ci0JaWYgKGZpbmRfdm1hX2xpbmtzKG1tLCBhZGRyLCBhZGRyICsgbGVuLCAmcHJldiwgJnJiX2xpbmssICZyYl9wYXJlbnQpKSB7CisJd2hpbGUgKGZpbmRfdm1hX2xpbmtzKG1tLCBhZGRyLCBhZGRyICsgbGVuLCAmcHJldiwgJnJiX2xpbmssCisJCQkgICAgICAmcmJfcGFyZW50KSkgewogCQlpZiAoZG9fbXVubWFwKG1tLCBhZGRyLCBsZW4pKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWdvdG8gbXVubWFwX2JhY2s7CiAJfQogCiAJLyoKQEAgLTE1NzMsNyArMTU3MCw4IEBACiAJLyoKIAkgKiBDYW4gd2UganVzdCBleHBhbmQgYW4gb2xkIG1hcHBpbmc/CiAJICovCi0Jdm1hID0gdm1hX21lcmdlKG1tLCBwcmV2LCBhZGRyLCBhZGRyICsgbGVuLCB2bV9mbGFncywgTlVMTCwgZmlsZSwgcGdvZmYsIE5VTEwpOworCXZtYSA9IHZtYV9tZXJnZShtbSwgcHJldiwgYWRkciwgYWRkciArIGxlbiwgdm1fZmxhZ3MsIE5VTEwsIGZpbGUsIHBnb2ZmLAorCQkJTlVMTCk7CiAJaWYgKHZtYSkKIAkJZ290byBvdXQ7CiAKQEAgLTIxMDIsNyArMjEwMCw3IEBACiAJYWN0dWFsX3NpemUgPSBzaXplOwogCWlmIChzaXplICYmICh2bWEtPnZtX2ZsYWdzICYgKFZNX0dST1dTVVAgfCBWTV9HUk9XU0RPV04pKSkKIAkJYWN0dWFsX3NpemUgLT0gUEFHRV9TSVpFOwotCWlmIChhY3R1YWxfc2l6ZSA+IEFDQ0VTU19PTkNFKHJsaW1bUkxJTUlUX1NUQUNLXS5ybGltX2N1cikpCisJaWYgKGFjdHVhbF9zaXplID4gUkVBRF9PTkNFKHJsaW1bUkxJTUlUX1NUQUNLXS5ybGltX2N1cikpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJLyogbWxvY2sgbGltaXQgdGVzdHMgKi8KQEAgLTIxMTAsNyArMjEwOCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbG9ja2VkOwogCQl1bnNpZ25lZCBsb25nIGxpbWl0OwogCQlsb2NrZWQgPSBtbS0+bG9ja2VkX3ZtICsgZ3JvdzsKLQkJbGltaXQgPSBBQ0NFU1NfT05DRShybGltW1JMSU1JVF9NRU1MT0NLXS5ybGltX2N1cik7CisJCWxpbWl0ID0gUkVBRF9PTkNFKHJsaW1bUkxJTUlUX01FTUxPQ0tdLnJsaW1fY3VyKTsKIAkJbGltaXQgPj49IFBBR0VfU0hJRlQ7CiAJCWlmIChsb2NrZWQgPiBsaW1pdCAmJiAhY2FwYWJsZShDQVBfSVBDX0xPQ0spKQogCQkJcmV0dXJuIC1FTk9NRU07CkBAIC0yMzE4LDcgKzIzMTYsNyBAQAogCWlmICghcHJldiB8fCBleHBhbmRfc3RhY2socHJldiwgYWRkcikpCiAJCXJldHVybiBOVUxMOwogCWlmIChwcmV2LT52bV9mbGFncyAmIFZNX0xPQ0tFRCkKLQkJX19tbG9ja192bWFfcGFnZXNfcmFuZ2UocHJldiwgYWRkciwgcHJldi0+dm1fZW5kLCBOVUxMKTsKKwkJcG9wdWxhdGVfdm1hX3BhZ2VfcmFuZ2UocHJldiwgYWRkciwgcHJldi0+dm1fZW5kLCBOVUxMKTsKIAlyZXR1cm4gcHJldjsKIH0KICNlbHNlCkBAIC0yMzUzLDcgKzIzNTEsNyBAQAogCWlmIChleHBhbmRfc3RhY2sodm1hLCBhZGRyKSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpCi0JCV9fbWxvY2tfdm1hX3BhZ2VzX3JhbmdlKHZtYSwgYWRkciwgc3RhcnQsIE5VTEwpOworCQlwb3B1bGF0ZV92bWFfcGFnZV9yYW5nZSh2bWEsIGFkZHIsIHN0YXJ0LCBOVUxMKTsKIAlyZXR1cm4gdm1hOwogfQogI2VuZGlmCkBAIC0yNzQxLDExICsyNzM5LDEwIEBACiAJLyoKIAkgKiBDbGVhciBvbGQgbWFwcy4gIHRoaXMgYWxzbyBkb2VzIHNvbWUgZXJyb3IgY2hlY2tpbmcgZm9yIHVzCiAJICovCi0gbXVubWFwX2JhY2s6Ci0JaWYgKGZpbmRfdm1hX2xpbmtzKG1tLCBhZGRyLCBhZGRyICsgbGVuLCAmcHJldiwgJnJiX2xpbmssICZyYl9wYXJlbnQpKSB7CisJd2hpbGUgKGZpbmRfdm1hX2xpbmtzKG1tLCBhZGRyLCBhZGRyICsgbGVuLCAmcHJldiwgJnJiX2xpbmssCisJCQkgICAgICAmcmJfcGFyZW50KSkgewogCQlpZiAoZG9fbXVubWFwKG1tLCBhZGRyLCBsZW4pKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWdvdG8gbXVubWFwX2JhY2s7CiAJfQogCiAJLyogQ2hlY2sgYWdhaW5zdCBhZGRyZXNzIHNwYWNlIGxpbWl0cyAqYWZ0ZXIqIGNsZWFyaW5nIG9sZCBtYXBzLi4uICovCmRpZmYgLS1naXQgYS9tbS9tcHJvdGVjdC5jIGIvbW0vbXByb3RlY3QuYwppbmRleCA0NDcyNzgxLi44ODU4NDgzIDEwMDY0NAotLS0gYS9tbS9tcHJvdGVjdC5jCisrKyBiL21tL21wcm90ZWN0LmMKQEAgLTc1LDYgKzc1LDcgQEAKIAkJb2xkcHRlID0gKnB0ZTsKIAkJaWYgKHB0ZV9wcmVzZW50KG9sZHB0ZSkpIHsKIAkJCXB0ZV90IHB0ZW50OworCQkJYm9vbCBwcmVzZXJ2ZV93cml0ZSA9IHByb3RfbnVtYSAmJiBwdGVfd3JpdGUob2xkcHRlKTsKIAogCQkJLyoKIAkJCSAqIEF2b2lkIHRyYXBwaW5nIGZhdWx0cyBhZ2FpbnN0IHRoZSB6ZXJvIG9yIEtTTQpAQCAtOTQsNiArOTUsOCBAQAogCiAJCQlwdGVudCA9IHB0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQobW0sIGFkZHIsIHB0ZSk7CiAJCQlwdGVudCA9IHB0ZV9tb2RpZnkocHRlbnQsIG5ld3Byb3QpOworCQkJaWYgKHByZXNlcnZlX3dyaXRlKQorCQkJCXB0ZW50ID0gcHRlX21rd3JpdGUocHRlbnQpOwogCiAJCQkvKiBBdm9pZCB0YWtpbmcgd3JpdGUgZmF1bHRzIGZvciBrbm93biBkaXJ0eSBwYWdlcyAqLwogCQkJaWYgKGRpcnR5X2FjY291bnRhYmxlICYmIHB0ZV9kaXJ0eShwdGVudCkgJiYKZGlmZiAtLWdpdCBhL21tL21yZW1hcC5jIGIvbW0vbXJlbWFwLmMKaW5kZXggNTdkYWRjMC4uMDM0ZTJkMyAxMDA2NDQKLS0tIGEvbW0vbXJlbWFwLmMKKysrIGIvbW0vbXJlbWFwLmMKQEAgLTI4Niw4ICsyODYsMTQgQEAKIAkJb2xkX2xlbiA9IG5ld19sZW47CiAJCW9sZF9hZGRyID0gbmV3X2FkZHI7CiAJCW5ld19hZGRyID0gLUVOT01FTTsKLQl9IGVsc2UgaWYgKHZtYS0+dm1fZmlsZSAmJiB2bWEtPnZtX2ZpbGUtPmZfb3AtPm1yZW1hcCkKLQkJdm1hLT52bV9maWxlLT5mX29wLT5tcmVtYXAodm1hLT52bV9maWxlLCBuZXdfdm1hKTsKKwl9IGVsc2UgaWYgKHZtYS0+dm1fZmlsZSAmJiB2bWEtPnZtX2ZpbGUtPmZfb3AtPm1yZW1hcCkgeworCQllcnIgPSB2bWEtPnZtX2ZpbGUtPmZfb3AtPm1yZW1hcCh2bWEtPnZtX2ZpbGUsIG5ld192bWEpOworCQlpZiAoZXJyIDwgMCkgeworCQkJbW92ZV9wYWdlX3RhYmxlcyhuZXdfdm1hLCBuZXdfYWRkciwgdm1hLCBvbGRfYWRkciwKKwkJCQkJIG1vdmVkX2xlbiwgdHJ1ZSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQogCiAJLyogQ29uY2VhbCBWTV9BQ0NPVU5UIHNvIG9sZCByZXNlcnZhdGlvbiBpcyBub3QgdW5kb25lICovCiAJaWYgKHZtX2ZsYWdzICYgVk1fQUNDT1VOVCkgewpAQCAtMzM5LDI1ICszNDUsMjUgQEAKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSA9IGZpbmRfdm1hKG1tLCBhZGRyKTsKIAogCWlmICghdm1hIHx8IHZtYS0+dm1fc3RhcnQgPiBhZGRyKQotCQlnb3RvIEVmYXVsdDsKKwkJcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7CiAKIAlpZiAoaXNfdm1faHVnZXRsYl9wYWdlKHZtYSkpCi0JCWdvdG8gRWludmFsOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCS8qIFdlIGNhbid0IHJlbWFwIGFjcm9zcyB2bSBhcmVhIGJvdW5kYXJpZXMgKi8KIAlpZiAob2xkX2xlbiA+IHZtYS0+dm1fZW5kIC0gYWRkcikKLQkJZ290byBFZmF1bHQ7CisJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwogCiAJLyogTmVlZCB0byBiZSBjYXJlZnVsIGFib3V0IGEgZ3Jvd2luZyBtYXBwaW5nICovCiAJaWYgKG5ld19sZW4gPiBvbGRfbGVuKSB7CiAJCXVuc2lnbmVkIGxvbmcgcGdvZmY7CiAKIAkJaWYgKHZtYS0+dm1fZmxhZ3MgJiAoVk1fRE9OVEVYUEFORCB8IFZNX1BGTk1BUCkpCi0JCQlnb3RvIEVmYXVsdDsKKwkJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwogCQlwZ29mZiA9IChhZGRyIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVDsKIAkJcGdvZmYgKz0gdm1hLT52bV9wZ29mZjsKIAkJaWYgKHBnb2ZmICsgKG5ld19sZW4gPj4gUEFHRV9TSElGVCkgPCBwZ29mZikKLQkJCWdvdG8gRWludmFsOworCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiAJfQogCiAJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9MT0NLRUQpIHsKQEAgLTM2NiwyOSArMzcyLDIwIEBACiAJCWxvY2tfbGltaXQgPSBybGltaXQoUkxJTUlUX01FTUxPQ0spOwogCQlsb2NrZWQgKz0gbmV3X2xlbiAtIG9sZF9sZW47CiAJCWlmIChsb2NrZWQgPiBsb2NrX2xpbWl0ICYmICFjYXBhYmxlKENBUF9JUENfTE9DSykpCi0JCQlnb3RvIEVhZ2FpbjsKKwkJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOwogCX0KIAogCWlmICghbWF5X2V4cGFuZF92bShtbSwgKG5ld19sZW4gLSBvbGRfbGVuKSA+PiBQQUdFX1NISUZUKSkKLQkJZ290byBFbm9tZW07CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9BQ0NPVU5UKSB7CiAJCXVuc2lnbmVkIGxvbmcgY2hhcmdlZCA9IChuZXdfbGVuIC0gb2xkX2xlbikgPj4gUEFHRV9TSElGVDsKIAkJaWYgKHNlY3VyaXR5X3ZtX2Vub3VnaF9tZW1vcnlfbW0obW0sIGNoYXJnZWQpKQotCQkJZ290byBFZmF1bHQ7CisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAkJKnAgPSBjaGFyZ2VkOwogCX0KIAogCXJldHVybiB2bWE7Ci0KLUVmYXVsdDoJLyogdmVyeSBvZGQgY2hvaWNlIGZvciBtb3N0IG9mIHRoZSBjYXNlcywgYnV0Li4uICovCi0JcmV0dXJuIEVSUl9QVFIoLUVGQVVMVCk7Ci1FaW52YWw6Ci0JcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci1Fbm9tZW06Ci0JcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci1FYWdhaW46Ci0JcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIG1yZW1hcF90byh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgb2xkX2xlbiwKZGlmZiAtLWdpdCBhL21tL25vbW11LmMgYi9tbS9ub21tdS5jCmluZGV4IDNmYmEyZGM5Li5lNTQ0NTA4IDEwMDY0NAotLS0gYS9tbS9ub21tdS5jCisrKyBiL21tL25vbW11LmMKQEAgLTEwMTYsNyArMTAxNiw3IEBACiAJCSAqIGRldmljZSAqLwogCQlpZiAoIWZpbGUtPmZfb3AtPmdldF91bm1hcHBlZF9hcmVhKQogCQkJY2FwYWJpbGl0aWVzICY9IH5OT01NVV9NQVBfRElSRUNUOwotCQlpZiAoIWZpbGUtPmZfb3AtPnJlYWQpCisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX0NBTl9SRUFEKSkKIAkJCWNhcGFiaWxpdGllcyAmPSB+Tk9NTVVfTUFQX0NPUFk7CiAKIAkJLyogVGhlIGZpbGUgc2hhbGwgaGF2ZSBiZWVuIG9wZW5lZCB3aXRoIHJlYWQgcGVybWlzc2lvbi4gKi8KQEAgLTEyNDAsNyArMTI0MCw3IEBACiAKIAkJb2xkX2ZzID0gZ2V0X2ZzKCk7CiAJCXNldF9mcyhLRVJORUxfRFMpOwotCQlyZXQgPSB2bWEtPnZtX2ZpbGUtPmZfb3AtPnJlYWQodm1hLT52bV9maWxlLCBiYXNlLCBsZW4sICZmcG9zKTsKKwkJcmV0ID0gX192ZnNfcmVhZCh2bWEtPnZtX2ZpbGUsIGJhc2UsIGxlbiwgJmZwb3MpOwogCQlzZXRfZnMob2xkX2ZzKTsKIAogCQlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL21tL29vbV9raWxsLmMgYi9tbS9vb21fa2lsbC5jCmluZGV4IDY0MmYzOGMuLjJiNjY1ZGEgMTAwNjQ0Ci0tLSBhL21tL29vbV9raWxsLmMKKysrIGIvbW0vb29tX2tpbGwuYwpAQCAtNDA4LDcgKzQwOCw3IEBACiBzdGF0aWMgREVDTEFSRV9SV1NFTShvb21fc2VtKTsKIAogLyoqCi0gKiBtYXJrX3Rza19vb21fdmljdGltIC0gbWFya3MgdGhlIGdpdmVuIHRha3MgYXMgT09NIHZpY3RpbS4KKyAqIG1hcmtfdHNrX29vbV92aWN0aW0gLSBtYXJrcyB0aGUgZ2l2ZW4gdGFzayBhcyBPT00gdmljdGltLgogICogQHRzazogdGFzayB0byBtYXJrCiAgKgogICogSGFzIHRvIGJlIGNhbGxlZCB3aXRoIG9vbV9zZW0gdGFrZW4gZm9yIHJlYWQgYW5kIG5ldmVyIGFmdGVyCkBAIC02MTIsNyArNjEyLDggQEAKICAqIERldGVybWluZXMgd2hldGhlciB0aGUga2VybmVsIG11c3QgcGFuaWMgYmVjYXVzZSBvZiB0aGUgcGFuaWNfb25fb29tIHN5c2N0bC4KICAqLwogdm9pZCBjaGVja19wYW5pY19vbl9vb20oZW51bSBvb21fY29uc3RyYWludCBjb25zdHJhaW50LCBnZnBfdCBnZnBfbWFzaywKLQkJCWludCBvcmRlciwgY29uc3Qgbm9kZW1hc2tfdCAqbm9kZW1hc2spCisJCQlpbnQgb3JkZXIsIGNvbnN0IG5vZGVtYXNrX3QgKm5vZGVtYXNrLAorCQkJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQogewogCWlmIChsaWtlbHkoIXN5c2N0bF9wYW5pY19vbl9vb20pKQogCQlyZXR1cm47CkBAIC02MjUsNyArNjI2LDcgQEAKIAkJaWYgKGNvbnN0cmFpbnQgIT0gQ09OU1RSQUlOVF9OT05FKQogCQkJcmV0dXJuOwogCX0KLQlkdW1wX2hlYWRlcihOVUxMLCBnZnBfbWFzaywgb3JkZXIsIE5VTEwsIG5vZGVtYXNrKTsKKwlkdW1wX2hlYWRlcihOVUxMLCBnZnBfbWFzaywgb3JkZXIsIG1lbWNnLCBub2RlbWFzayk7CiAJcGFuaWMoIk91dCBvZiBtZW1vcnk6ICVzIHBhbmljX29uX29vbSBpcyBlbmFibGVkXG4iLAogCQlzeXNjdGxfcGFuaWNfb25fb29tID09IDIgPyAiY29tcHVsc29yeSIgOiAic3lzdGVtLXdpZGUiKTsKIH0KQEAgLTc0MCw3ICs3NDEsNyBAQAogCWNvbnN0cmFpbnQgPSBjb25zdHJhaW5lZF9hbGxvYyh6b25lbGlzdCwgZ2ZwX21hc2ssIG5vZGVtYXNrLAogCQkJCQkJJnRvdGFscGFnZXMpOwogCW1wb2xfbWFzayA9IChjb25zdHJhaW50ID09IENPTlNUUkFJTlRfTUVNT1JZX1BPTElDWSkgPyBub2RlbWFzayA6IE5VTEw7Ci0JY2hlY2tfcGFuaWNfb25fb29tKGNvbnN0cmFpbnQsIGdmcF9tYXNrLCBvcmRlciwgbXBvbF9tYXNrKTsKKwljaGVja19wYW5pY19vbl9vb20oY29uc3RyYWludCwgZ2ZwX21hc2ssIG9yZGVyLCBtcG9sX21hc2ssIE5VTEwpOwogCiAJaWYgKHN5c2N0bF9vb21fa2lsbF9hbGxvY2F0aW5nX3Rhc2sgJiYgY3VycmVudC0+bW0gJiYKIAkgICAgIW9vbV91bmtpbGxhYmxlX3Rhc2soY3VycmVudCwgTlVMTCwgbm9kZW1hc2spICYmCmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCA0NWUxODdiLi41ZGFmNTU2IDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTg1Nyw4ICs4NTcsMTEgQEAKIAkgKiAgICAgICAgICAgICAgICAgICBidyAqIGVsYXBzZWQgKyB3cml0ZV9iYW5kd2lkdGggKiAocGVyaW9kIC0gZWxhcHNlZCkKIAkgKiB3cml0ZV9iYW5kd2lkdGggPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZAorCSAqCisJICogQHdyaXR0ZW4gbWF5IGhhdmUgZGVjcmVhc2VkIGR1ZSB0byBhY2NvdW50X3BhZ2VfcmVkaXJ0eSgpLgorCSAqIEF2b2lkIHVuZGVyZmxvd2luZyBAYncgY2FsY3VsYXRpb24uCiAJICovCi0JYncgPSB3cml0dGVuIC0gYmRpLT53cml0dGVuX3N0YW1wOworCWJ3ID0gd3JpdHRlbiAtIG1pbih3cml0dGVuLCBiZGktPndyaXR0ZW5fc3RhbXApOwogCWJ3ICo9IEhaOwogCWlmICh1bmxpa2VseShlbGFwc2VkID4gcGVyaW9kKSkgewogCQlkb19kaXYoYncsIGVsYXBzZWQpOwpAQCAtOTIyLDcgKzkyNSw3IEBACiAJCQkJICAgIHVuc2lnbmVkIGxvbmcgbm93KQogewogCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZGlydHlfbG9jayk7Ci0Jc3RhdGljIHVuc2lnbmVkIGxvbmcgdXBkYXRlX3RpbWU7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgdXBkYXRlX3RpbWUgPSBJTklUSUFMX0pJRkZJRVM7CiAKIAkvKgogCSAqIGNoZWNrIGxvY2tsZXNzbHkgZmlyc3QgdG8gb3B0aW1pemUgYXdheSBsb2NraW5nIGZvciB0aGUgbW9zdCB0aW1lCkBAIC0yMTA4LDYgKzIxMTEsMjUgQEAKIEVYUE9SVF9TWU1CT0woYWNjb3VudF9wYWdlX2RpcnRpZWQpOwogCiAvKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBkZWFjY291bnRpbmcgZGlydHkgcGFnZSB3aXRob3V0IHdyaXRlYmFjay4KKyAqCisgKiBEb2luZyB0aGlzIHNob3VsZCAqbm9ybWFsbHkqIG9ubHkgZXZlciBiZSBkb25lIHdoZW4gYSBwYWdlCisgKiBpcyB0cnVuY2F0ZWQsIGFuZCBpcyBub3QgYWN0dWFsbHkgbWFwcGVkIGFueXdoZXJlIGF0IGFsbC4gSG93ZXZlciwKKyAqIGZzL2J1ZmZlci5jIGRvZXMgdGhpcyB3aGVuIGl0IG5vdGljZXMgdGhhdCBzb21lYm9keSBoYXMgY2xlYW5lZAorICogb3V0IGFsbCB0aGUgYnVmZmVycyBvbiBhIHBhZ2Ugd2l0aG91dCBhY3R1YWxseSBkb2luZyBpdCB0aHJvdWdoCisgKiB0aGUgVk0uIENhbiB5b3Ugc2F5ICJleHQzIGlzIGhvcnJpYmx5IHVnbHkiPyBUaG91Z2h0IHlvdSBjb3VsZC4KKyAqLwordm9pZCBhY2NvdW50X3BhZ2VfY2xlYW5lZChzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcpCit7CisJaWYgKG1hcHBpbmdfY2FwX2FjY291bnRfZGlydHkobWFwcGluZykpIHsKKwkJZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX0RJUlRZKTsKKwkJZGVjX2JkaV9zdGF0KGlub2RlX3RvX2JkaShtYXBwaW5nLT5ob3N0KSwgQkRJX1JFQ0xBSU1BQkxFKTsKKwkJdGFza19pb19hY2NvdW50X2NhbmNlbGxlZF93cml0ZShQQUdFX0NBQ0hFX1NJWkUpOworCX0KK30KK0VYUE9SVF9TWU1CT0woYWNjb3VudF9wYWdlX2NsZWFuZWQpOworCisvKgogICogRm9yIGFkZHJlc3Nfc3BhY2VzIHdoaWNoIGRvIG5vdCB1c2UgYnVmZmVycy4gIEp1c3QgdGFnIHRoZSBwYWdlIGFzIGRpcnR5IGluCiAgKiBpdHMgcmFkaXggdHJlZS4KICAqCkBAIC0yMjA2LDcgKzIyMjgsOCBAQAogCQkgKiBpdCB3aWxsIGNvbmZ1c2UgcmVhZGFoZWFkIGFuZCBtYWtlIGl0IHJlc3RhcnQgdGhlIHNpemUgcmFtcHVwCiAJCSAqIHByb2Nlc3MuIEJ1dCBpdCdzIGEgdHJpdmlhbCBwcm9ibGVtLgogCQkgKi8KLQkJQ2xlYXJQYWdlUmVjbGFpbShwYWdlKTsKKwkJaWYgKFBhZ2VSZWNsYWltKHBhZ2UpKQorCQkJQ2xlYXJQYWdlUmVjbGFpbShwYWdlKTsKICNpZmRlZiBDT05GSUdfQkxPQ0sKIAkJaWYgKCFzcGQpCiAJCQlzcGQgPSBfX3NldF9wYWdlX2RpcnR5X2J1ZmZlcnM7CmRpZmYgLS1naXQgYS9tbS9wYWdlX2FsbG9jLmMgYi9tbS9wYWdlX2FsbG9jLmMKaW5kZXggNDBlMjk0Mi4uZWJmZmEwZSAxMDA2NDQKLS0tIGEvbW0vcGFnZV9hbGxvYy5jCisrKyBiL21tL3BhZ2VfYWxsb2MuYwpAQCAtMTAzMiwxMSArMTAzMiw5IEBACiBzdGF0aWMgaW50IGZhbGxiYWNrc1tNSUdSQVRFX1RZUEVTXVs0XSA9IHsKIAlbTUlHUkFURV9VTk1PVkFCTEVdICAgPSB7IE1JR1JBVEVfUkVDTEFJTUFCTEUsIE1JR1JBVEVfTU9WQUJMRSwgICAgIE1JR1JBVEVfUkVTRVJWRSB9LAogCVtNSUdSQVRFX1JFQ0xBSU1BQkxFXSA9IHsgTUlHUkFURV9VTk1PVkFCTEUsICAgTUlHUkFURV9NT1ZBQkxFLCAgICAgTUlHUkFURV9SRVNFUlZFIH0sCi0jaWZkZWYgQ09ORklHX0NNQQotCVtNSUdSQVRFX01PVkFCTEVdICAgICA9IHsgTUlHUkFURV9DTUEsICAgICAgICAgTUlHUkFURV9SRUNMQUlNQUJMRSwgTUlHUkFURV9VTk1PVkFCTEUsIE1JR1JBVEVfUkVTRVJWRSB9LAotCVtNSUdSQVRFX0NNQV0gICAgICAgICA9IHsgTUlHUkFURV9SRVNFUlZFIH0sIC8qIE5ldmVyIHVzZWQgKi8KLSNlbHNlCiAJW01JR1JBVEVfTU9WQUJMRV0gICAgID0geyBNSUdSQVRFX1JFQ0xBSU1BQkxFLCBNSUdSQVRFX1VOTU9WQUJMRSwgICBNSUdSQVRFX1JFU0VSVkUgfSwKKyNpZmRlZiBDT05GSUdfQ01BCisJW01JR1JBVEVfQ01BXSAgICAgICAgID0geyBNSUdSQVRFX1JFU0VSVkUgfSwgLyogTmV2ZXIgdXNlZCAqLwogI2VuZGlmCiAJW01JR1JBVEVfUkVTRVJWRV0gICAgID0geyBNSUdSQVRFX1JFU0VSVkUgfSwgLyogTmV2ZXIgdXNlZCAqLwogI2lmZGVmIENPTkZJR19NRU1PUllfSVNPTEFUSU9OCkBAIC0xMDQ0LDYgKzEwNDIsMTcgQEAKICNlbmRpZgogfTsKIAorI2lmZGVmIENPTkZJR19DTUEKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqX19ybXF1ZXVlX2NtYV9mYWxsYmFjayhzdHJ1Y3Qgem9uZSAqem9uZSwKKwkJCQkJdW5zaWduZWQgaW50IG9yZGVyKQoreworCXJldHVybiBfX3JtcXVldWVfc21hbGxlc3Qoem9uZSwgb3JkZXIsIE1JR1JBVEVfQ01BKTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpfX3JtcXVldWVfY21hX2ZhbGxiYWNrKHN0cnVjdCB6b25lICp6b25lLAorCQkJCQl1bnNpZ25lZCBpbnQgb3JkZXIpIHsgcmV0dXJuIE5VTEw7IH0KKyNlbmRpZgorCiAvKgogICogTW92ZSB0aGUgZnJlZSBwYWdlcyBpbiBhIHJhbmdlIHRvIHRoZSBmcmVlIGxpc3RzIG9mIHRoZSByZXF1ZXN0ZWQgdHlwZS4KICAqIE5vdGUgdGhhdCBzdGFydF9wYWdlIGFuZCBlbmRfcGFnZXMgYXJlIG5vdCBhbGlnbmVkIG9uIGEgcGFnZWJsb2NrCkBAIC0xMTM2LDE0ICsxMTQ1LDQwIEBACiAgKiBhcyBmcmFnbWVudGF0aW9uIGNhdXNlZCBieSB0aG9zZSBhbGxvY2F0aW9ucyBwb2xsdXRpbmcgbW92YWJsZSBwYWdlYmxvY2tzCiAgKiBpcyB3b3JzZSB0aGFuIG1vdmFibGUgYWxsb2NhdGlvbnMgc3RlYWxpbmcgZnJvbSB1bm1vdmFibGUgYW5kIHJlY2xhaW1hYmxlCiAgKiBwYWdlYmxvY2tzLgotICoKLSAqIElmIHdlIGNsYWltIG1vcmUgdGhhbiBoYWxmIG9mIHRoZSBwYWdlYmxvY2ssIGNoYW5nZSBwYWdlYmxvY2sncyBtaWdyYXRldHlwZQotICogYXMgd2VsbC4KICAqLwotc3RhdGljIHZvaWQgdHJ5X3RvX3N0ZWFsX2ZyZWVwYWdlcyhzdHJ1Y3Qgem9uZSAqem9uZSwgc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkJICBpbnQgc3RhcnRfdHlwZSwgaW50IGZhbGxiYWNrX3R5cGUpCitzdGF0aWMgYm9vbCBjYW5fc3RlYWxfZmFsbGJhY2sodW5zaWduZWQgaW50IG9yZGVyLCBpbnQgc3RhcnRfbXQpCit7CisJLyoKKwkgKiBMZWF2aW5nIHRoaXMgb3JkZXIgY2hlY2sgaXMgaW50ZW5kZWQsIGFsdGhvdWdoIHRoZXJlIGlzCisJICogcmVsYXhlZCBvcmRlciBjaGVjayBpbiBuZXh0IGNoZWNrLiBUaGUgcmVhc29uIGlzIHRoYXQKKwkgKiB3ZSBjYW4gYWN0dWFsbHkgc3RlYWwgd2hvbGUgcGFnZWJsb2NrIGlmIHRoaXMgY29uZGl0aW9uIG1ldCwKKwkgKiBidXQsIGJlbG93IGNoZWNrIGRvZXNuJ3QgZ3VhcmFudGVlIGl0IGFuZCB0aGF0IGlzIGp1c3QgaGV1cmlzdGljCisJICogc28gY291bGQgYmUgY2hhbmdlZCBhbnl0aW1lLgorCSAqLworCWlmIChvcmRlciA+PSBwYWdlYmxvY2tfb3JkZXIpCisJCXJldHVybiB0cnVlOworCisJaWYgKG9yZGVyID49IHBhZ2VibG9ja19vcmRlciAvIDIgfHwKKwkJc3RhcnRfbXQgPT0gTUlHUkFURV9SRUNMQUlNQUJMRSB8fAorCQlzdGFydF9tdCA9PSBNSUdSQVRFX1VOTU9WQUJMRSB8fAorCQlwYWdlX2dyb3VwX2J5X21vYmlsaXR5X2Rpc2FibGVkKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBhY3R1YWwgc3RlYWwgYmVoYXZpb3VyLiBJZiBvcmRlciBpcyBsYXJnZSBlbm91Z2gsCisgKiB3ZSBjYW4gc3RlYWwgd2hvbGUgcGFnZWJsb2NrLiBJZiBub3QsIHdlIGZpcnN0IG1vdmUgZnJlZXBhZ2VzIGluIHRoaXMKKyAqIHBhZ2VibG9jayBhbmQgY2hlY2sgd2hldGhlciBoYWxmIG9mIHBhZ2VzIGFyZSBtb3ZlZCBvciBub3QuIElmIGhhbGYgb2YKKyAqIHBhZ2VzIGFyZSBtb3ZlZCwgd2UgY2FuIGNoYW5nZSBtaWdyYXRldHlwZSBvZiBwYWdlYmxvY2sgYW5kIHBlcm1hbmVudGx5CisgKiB1c2UgaXQncyBwYWdlcyBhcyByZXF1ZXN0ZWQgbWlncmF0ZXR5cGUgaW4gdGhlIGZ1dHVyZS4KKyAqLworc3RhdGljIHZvaWQgc3RlYWxfc3VpdGFibGVfZmFsbGJhY2soc3RydWN0IHpvbmUgKnpvbmUsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCQkJCSAgaW50IHN0YXJ0X3R5cGUpCiB7CiAJaW50IGN1cnJlbnRfb3JkZXIgPSBwYWdlX29yZGVyKHBhZ2UpOworCWludCBwYWdlczsKIAogCS8qIFRha2Ugb3duZXJzaGlwIGZvciBvcmRlcnMgPj0gcGFnZWJsb2NrX29yZGVyICovCiAJaWYgKGN1cnJlbnRfb3JkZXIgPj0gcGFnZWJsb2NrX29yZGVyKSB7CkBAIC0xMTUxLDE5ICsxMTg2LDQ5IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoY3VycmVudF9vcmRlciA+PSBwYWdlYmxvY2tfb3JkZXIgLyAyIHx8Ci0JICAgIHN0YXJ0X3R5cGUgPT0gTUlHUkFURV9SRUNMQUlNQUJMRSB8fAotCSAgICBzdGFydF90eXBlID09IE1JR1JBVEVfVU5NT1ZBQkxFIHx8Ci0JICAgIHBhZ2VfZ3JvdXBfYnlfbW9iaWxpdHlfZGlzYWJsZWQpIHsKLQkJaW50IHBhZ2VzOworCXBhZ2VzID0gbW92ZV9mcmVlcGFnZXNfYmxvY2soem9uZSwgcGFnZSwgc3RhcnRfdHlwZSk7CiAKLQkJcGFnZXMgPSBtb3ZlX2ZyZWVwYWdlc19ibG9jayh6b25lLCBwYWdlLCBzdGFydF90eXBlKTsKKwkvKiBDbGFpbSB0aGUgd2hvbGUgYmxvY2sgaWYgb3ZlciBoYWxmIG9mIGl0IGlzIGZyZWUgKi8KKwlpZiAocGFnZXMgPj0gKDEgPDwgKHBhZ2VibG9ja19vcmRlci0xKSkgfHwKKwkJCXBhZ2VfZ3JvdXBfYnlfbW9iaWxpdHlfZGlzYWJsZWQpCisJCXNldF9wYWdlYmxvY2tfbWlncmF0ZXR5cGUocGFnZSwgc3RhcnRfdHlwZSk7Cit9CiAKLQkJLyogQ2xhaW0gdGhlIHdob2xlIGJsb2NrIGlmIG92ZXIgaGFsZiBvZiBpdCBpcyBmcmVlICovCi0JCWlmIChwYWdlcyA+PSAoMSA8PCAocGFnZWJsb2NrX29yZGVyLTEpKSB8fAotCQkJCXBhZ2VfZ3JvdXBfYnlfbW9iaWxpdHlfZGlzYWJsZWQpCi0JCQlzZXRfcGFnZWJsb2NrX21pZ3JhdGV0eXBlKHBhZ2UsIHN0YXJ0X3R5cGUpOworLyoKKyAqIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYSBzdWl0YWJsZSBmYWxsYmFjayBmcmVlcGFnZSB3aXRoIHJlcXVlc3RlZCBvcmRlci4KKyAqIElmIG9ubHlfc3RlYWxhYmxlIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxsYmFja19tdCBvbmx5IGlmCisgKiB3ZSBjYW4gc3RlYWwgb3RoZXIgZnJlZXBhZ2VzIGFsbCB0b2dldGhlci4gVGhpcyB3b3VsZCBoZWxwIHRvIHJlZHVjZQorICogZnJhZ21lbnRhdGlvbiBkdWUgdG8gbWl4ZWQgbWlncmF0ZXR5cGUgcGFnZXMgaW4gb25lIHBhZ2VibG9jay4KKyAqLworaW50IGZpbmRfc3VpdGFibGVfZmFsbGJhY2soc3RydWN0IGZyZWVfYXJlYSAqYXJlYSwgdW5zaWduZWQgaW50IG9yZGVyLAorCQkJaW50IG1pZ3JhdGV0eXBlLCBib29sIG9ubHlfc3RlYWxhYmxlLCBib29sICpjYW5fc3RlYWwpCit7CisJaW50IGk7CisJaW50IGZhbGxiYWNrX210OworCisJaWYgKGFyZWEtPm5yX2ZyZWUgPT0gMCkKKwkJcmV0dXJuIC0xOworCisJKmNhbl9zdGVhbCA9IGZhbHNlOworCWZvciAoaSA9IDA7OyBpKyspIHsKKwkJZmFsbGJhY2tfbXQgPSBmYWxsYmFja3NbbWlncmF0ZXR5cGVdW2ldOworCQlpZiAoZmFsbGJhY2tfbXQgPT0gTUlHUkFURV9SRVNFUlZFKQorCQkJYnJlYWs7CisKKwkJaWYgKGxpc3RfZW1wdHkoJmFyZWEtPmZyZWVfbGlzdFtmYWxsYmFja19tdF0pKQorCQkJY29udGludWU7CisKKwkJaWYgKGNhbl9zdGVhbF9mYWxsYmFjayhvcmRlciwgbWlncmF0ZXR5cGUpKQorCQkJKmNhbl9zdGVhbCA9IHRydWU7CisKKwkJaWYgKCFvbmx5X3N0ZWFsYWJsZSkKKwkJCXJldHVybiBmYWxsYmFja19tdDsKKworCQlpZiAoKmNhbl9zdGVhbCkKKwkJCXJldHVybiBmYWxsYmFja19tdDsKIAl9CisKKwlyZXR1cm4gLTE7CiB9CiAKIC8qIFJlbW92ZSBhbiBlbGVtZW50IGZyb20gdGhlIGJ1ZGR5IGFsbG9jYXRvciBmcm9tIHRoZSBmYWxsYmFjayBsaXN0ICovCkBAIC0xMTczLDY0ICsxMjM4LDQ1IEBACiAJc3RydWN0IGZyZWVfYXJlYSAqYXJlYTsKIAl1bnNpZ25lZCBpbnQgY3VycmVudF9vcmRlcjsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlpbnQgZmFsbGJhY2tfbXQ7CisJYm9vbCBjYW5fc3RlYWw7CiAKIAkvKiBGaW5kIHRoZSBsYXJnZXN0IHBvc3NpYmxlIGJsb2NrIG9mIHBhZ2VzIGluIHRoZSBvdGhlciBsaXN0ICovCiAJZm9yIChjdXJyZW50X29yZGVyID0gTUFYX09SREVSLTE7CiAJCQkJY3VycmVudF9vcmRlciA+PSBvcmRlciAmJiBjdXJyZW50X29yZGVyIDw9IE1BWF9PUkRFUi0xOwogCQkJCS0tY3VycmVudF9vcmRlcikgewotCQlpbnQgaTsKLQkJZm9yIChpID0gMDs7IGkrKykgewotCQkJaW50IG1pZ3JhdGV0eXBlID0gZmFsbGJhY2tzW3N0YXJ0X21pZ3JhdGV0eXBlXVtpXTsKLQkJCWludCBidWRkeV90eXBlID0gc3RhcnRfbWlncmF0ZXR5cGU7CisJCWFyZWEgPSAmKHpvbmUtPmZyZWVfYXJlYVtjdXJyZW50X29yZGVyXSk7CisJCWZhbGxiYWNrX210ID0gZmluZF9zdWl0YWJsZV9mYWxsYmFjayhhcmVhLCBjdXJyZW50X29yZGVyLAorCQkJCXN0YXJ0X21pZ3JhdGV0eXBlLCBmYWxzZSwgJmNhbl9zdGVhbCk7CisJCWlmIChmYWxsYmFja19tdCA9PSAtMSkKKwkJCWNvbnRpbnVlOwogCi0JCQkvKiBNSUdSQVRFX1JFU0VSVkUgaGFuZGxlZCBsYXRlciBpZiBuZWNlc3NhcnkgKi8KLQkJCWlmIChtaWdyYXRldHlwZSA9PSBNSUdSQVRFX1JFU0VSVkUpCi0JCQkJYnJlYWs7CisJCXBhZ2UgPSBsaXN0X2VudHJ5KGFyZWEtPmZyZWVfbGlzdFtmYWxsYmFja19tdF0ubmV4dCwKKwkJCQkJCXN0cnVjdCBwYWdlLCBscnUpOworCQlpZiAoY2FuX3N0ZWFsKQorCQkJc3RlYWxfc3VpdGFibGVfZmFsbGJhY2soem9uZSwgcGFnZSwgc3RhcnRfbWlncmF0ZXR5cGUpOwogCi0JCQlhcmVhID0gJih6b25lLT5mcmVlX2FyZWFbY3VycmVudF9vcmRlcl0pOwotCQkJaWYgKGxpc3RfZW1wdHkoJmFyZWEtPmZyZWVfbGlzdFttaWdyYXRldHlwZV0pKQotCQkJCWNvbnRpbnVlOworCQkvKiBSZW1vdmUgdGhlIHBhZ2UgZnJvbSB0aGUgZnJlZWxpc3RzICovCisJCWFyZWEtPm5yX2ZyZWUtLTsKKwkJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CisJCXJtdl9wYWdlX29yZGVyKHBhZ2UpOwogCi0JCQlwYWdlID0gbGlzdF9lbnRyeShhcmVhLT5mcmVlX2xpc3RbbWlncmF0ZXR5cGVdLm5leHQsCi0JCQkJCXN0cnVjdCBwYWdlLCBscnUpOwotCQkJYXJlYS0+bnJfZnJlZS0tOworCQlleHBhbmQoem9uZSwgcGFnZSwgb3JkZXIsIGN1cnJlbnRfb3JkZXIsIGFyZWEsCisJCQkJCXN0YXJ0X21pZ3JhdGV0eXBlKTsKKwkJLyoKKwkJICogVGhlIGZyZWVwYWdlX21pZ3JhdGV0eXBlIG1heSBkaWZmZXIgZnJvbSBwYWdlYmxvY2sncworCQkgKiBtaWdyYXRldHlwZSBkZXBlbmRpbmcgb24gdGhlIGRlY2lzaW9ucyBpbgorCQkgKiB0cnlfdG9fc3RlYWxfZnJlZXBhZ2VzKCkuIFRoaXMgaXMgT0sgYXMgbG9uZyBhcyBpdAorCQkgKiBkb2VzIG5vdCBkaWZmZXIgZm9yIE1JR1JBVEVfQ01BIHBhZ2VibG9ja3MuIEZvciBDTUEKKwkJICogd2UgbmVlZCB0byBtYWtlIHN1cmUgdW5hbGxvY2F0ZWQgcGFnZXMgZmx1c2hlZCBmcm9tCisJCSAqIHBjcCBsaXN0cyBhcmUgcmV0dXJuZWQgdG8gdGhlIGNvcnJlY3QgZnJlZWxpc3QuCisJCSAqLworCQlzZXRfZnJlZXBhZ2VfbWlncmF0ZXR5cGUocGFnZSwgc3RhcnRfbWlncmF0ZXR5cGUpOwogCi0JCQlpZiAoIWlzX21pZ3JhdGVfY21hKG1pZ3JhdGV0eXBlKSkgewotCQkJCXRyeV90b19zdGVhbF9mcmVlcGFnZXMoem9uZSwgcGFnZSwKLQkJCQkJCQlzdGFydF9taWdyYXRldHlwZSwKLQkJCQkJCQltaWdyYXRldHlwZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICogV2hlbiBib3Jyb3dpbmcgZnJvbSBNSUdSQVRFX0NNQSwgd2UgbmVlZCB0bwotCQkJCSAqIHJlbGVhc2UgdGhlIGV4Y2VzcyBidWRkeSBwYWdlcyB0byBDTUEKLQkJCQkgKiBpdHNlbGYsIGFuZCB3ZSBkbyBub3QgdHJ5IHRvIHN0ZWFsIGV4dHJhCi0JCQkJICogZnJlZSBwYWdlcy4KLQkJCQkgKi8KLQkJCQlidWRkeV90eXBlID0gbWlncmF0ZXR5cGU7Ci0JCQl9CisJCXRyYWNlX21tX3BhZ2VfYWxsb2NfZXh0ZnJhZyhwYWdlLCBvcmRlciwgY3VycmVudF9vcmRlciwKKwkJCXN0YXJ0X21pZ3JhdGV0eXBlLCBmYWxsYmFja19tdCk7CiAKLQkJCS8qIFJlbW92ZSB0aGUgcGFnZSBmcm9tIHRoZSBmcmVlbGlzdHMgKi8KLQkJCWxpc3RfZGVsKCZwYWdlLT5scnUpOwotCQkJcm12X3BhZ2Vfb3JkZXIocGFnZSk7Ci0KLQkJCWV4cGFuZCh6b25lLCBwYWdlLCBvcmRlciwgY3VycmVudF9vcmRlciwgYXJlYSwKLQkJCQkJYnVkZHlfdHlwZSk7Ci0KLQkJCS8qCi0JCQkgKiBUaGUgZnJlZXBhZ2VfbWlncmF0ZXR5cGUgbWF5IGRpZmZlciBmcm9tIHBhZ2VibG9jaydzCi0JCQkgKiBtaWdyYXRldHlwZSBkZXBlbmRpbmcgb24gdGhlIGRlY2lzaW9ucyBpbgotCQkJICogdHJ5X3RvX3N0ZWFsX2ZyZWVwYWdlcygpLiBUaGlzIGlzIE9LIGFzIGxvbmcgYXMgaXQKLQkJCSAqIGRvZXMgbm90IGRpZmZlciBmb3IgTUlHUkFURV9DTUEgcGFnZWJsb2Nrcy4gRm9yIENNQQotCQkJICogd2UgbmVlZCB0byBtYWtlIHN1cmUgdW5hbGxvY2F0ZWQgcGFnZXMgZmx1c2hlZCBmcm9tCi0JCQkgKiBwY3AgbGlzdHMgYXJlIHJldHVybmVkIHRvIHRoZSBjb3JyZWN0IGZyZWVsaXN0LgotCQkJICovCi0JCQlzZXRfZnJlZXBhZ2VfbWlncmF0ZXR5cGUocGFnZSwgYnVkZHlfdHlwZSk7Ci0KLQkJCXRyYWNlX21tX3BhZ2VfYWxsb2NfZXh0ZnJhZyhwYWdlLCBvcmRlciwgY3VycmVudF9vcmRlciwKLQkJCQlzdGFydF9taWdyYXRldHlwZSwgbWlncmF0ZXR5cGUpOwotCi0JCQlyZXR1cm4gcGFnZTsKLQkJfQorCQlyZXR1cm4gcGFnZTsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTEyNDksNyArMTI5NSwxMSBAQAogCXBhZ2UgPSBfX3JtcXVldWVfc21hbGxlc3Qoem9uZSwgb3JkZXIsIG1pZ3JhdGV0eXBlKTsKIAogCWlmICh1bmxpa2VseSghcGFnZSkgJiYgbWlncmF0ZXR5cGUgIT0gTUlHUkFURV9SRVNFUlZFKSB7Ci0JCXBhZ2UgPSBfX3JtcXVldWVfZmFsbGJhY2soem9uZSwgb3JkZXIsIG1pZ3JhdGV0eXBlKTsKKwkJaWYgKG1pZ3JhdGV0eXBlID09IE1JR1JBVEVfTU9WQUJMRSkKKwkJCXBhZ2UgPSBfX3JtcXVldWVfY21hX2ZhbGxiYWNrKHpvbmUsIG9yZGVyKTsKKworCQlpZiAoIXBhZ2UpCisJCQlwYWdlID0gX19ybXF1ZXVlX2ZhbGxiYWNrKHpvbmUsIG9yZGVyLCBtaWdyYXRldHlwZSk7CiAKIAkJLyoKIAkJICogVXNlIE1JR1JBVEVfUkVTRVJWRSByYXRoZXIgdGhhbiBmYWlsIGFuIGFsbG9jYXRpb24uIGdvdG8KQEAgLTEzMjEsNyArMTM3MSw3IEBACiAJaW50IHRvX2RyYWluLCBiYXRjaDsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQliYXRjaCA9IEFDQ0VTU19PTkNFKHBjcC0+YmF0Y2gpOworCWJhdGNoID0gUkVBRF9PTkNFKHBjcC0+YmF0Y2gpOwogCXRvX2RyYWluID0gbWluKHBjcC0+Y291bnQsIGJhdGNoKTsKIAlpZiAodG9fZHJhaW4gPiAwKSB7CiAJCWZyZWVfcGNwcGFnZXNfYnVsayh6b25lLCB0b19kcmFpbiwgcGNwKTsKQEAgLTE1MjAsNyArMTU3MCw3IEBACiAJCWxpc3RfYWRkX3RhaWwoJnBhZ2UtPmxydSwgJnBjcC0+bGlzdHNbbWlncmF0ZXR5cGVdKTsKIAlwY3AtPmNvdW50Kys7CiAJaWYgKHBjcC0+Y291bnQgPj0gcGNwLT5oaWdoKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYmF0Y2ggPSBBQ0NFU1NfT05DRShwY3AtPmJhdGNoKTsKKwkJdW5zaWduZWQgbG9uZyBiYXRjaCA9IFJFQURfT05DRShwY3AtPmJhdGNoKTsKIAkJZnJlZV9wY3BwYWdlc19idWxrKHpvbmUsIGJhdGNoLCBwY3ApOwogCQlwY3AtPmNvdW50IC09IGJhdGNoOwogCX0KQEAgLTIzNjIsMTMgKzI0MTIsNyBAQAogCQkJKmRpZF9zb21lX3Byb2dyZXNzID0gMTsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCS8qCi0JCSAqIEdGUF9USElTTk9ERSBjb250YWlucyBfX0dGUF9OT1JFVFJZIGFuZCB3ZSBuZXZlciBoaXQgdGhpcy4KLQkJICogU2FuaXR5IGNoZWNrIGZvciBiYXJlIGNhbGxzIG9mIF9fR0ZQX1RISVNOT0RFLCBub3QgcmVhbCBPT00uCi0JCSAqIFRoZSBjYWxsZXIgc2hvdWxkIGhhbmRsZSBwYWdlIGFsbG9jYXRpb24gZmFpbHVyZSBieSBpdHNlbGYgaWYKLQkJICogaXQgc3BlY2lmaWVzIF9fR0ZQX1RISVNOT0RFLgotCQkgKiBOb3RlOiBIdWdlcGFnZSB1c2VzIGl0IGJ1dCB3aWxsIGhpdCBQQUdFX0FMTE9DX0NPU1RMWV9PUkRFUi4KLQkJICovCisJCS8qIFRoZSBPT00ga2lsbGVyIG1heSBub3QgZnJlZSBtZW1vcnkgb24gYSBzcGVjaWZpYyBub2RlICovCiAJCWlmIChnZnBfbWFzayAmIF9fR0ZQX1RISVNOT0RFKQogCQkJZ290byBvdXQ7CiAJfQpAQCAtMjYyMywxNSArMjY2NywxMSBAQAogCX0KIAogCS8qCi0JICogR0ZQX1RISVNOT0RFIChtZWFuaW5nIF9fR0ZQX1RISVNOT0RFLCBfX0dGUF9OT1JFVFJZIGFuZAotCSAqIF9fR0ZQX05PV0FSTiBzZXQpIHNob3VsZCBub3QgY2F1c2UgcmVjbGFpbSBzaW5jZSB0aGUgc3Vic3lzdGVtCi0JICogKGYuZS4gc2xhYikgdXNpbmcgR0ZQX1RISVNOT0RFIG1heSBjaG9vc2UgdG8gdHJpZ2dlciByZWNsYWltCi0JICogdXNpbmcgYSBsYXJnZXIgc2V0IG9mIG5vZGVzIGFmdGVyIGl0IGhhcyBlc3RhYmxpc2hlZCB0aGF0IHRoZQotCSAqIGFsbG93ZWQgcGVyIG5vZGUgcXVldWVzIGFyZSBlbXB0eSBhbmQgdGhhdCBub2RlcyBhcmUKLQkgKiBvdmVyIGFsbG9jYXRlZC4KKwkgKiBJZiB0aGlzIGFsbG9jYXRpb24gY2Fubm90IGJsb2NrIGFuZCBpdCBpcyBmb3IgYSBzcGVjaWZpYyBub2RlLCB0aGVuCisJICogZmFpbCBlYXJseS4gIFRoZXJlJ3Mgbm8gbmVlZCB0byB3YWtldXAga3N3YXBkIG9yIHJldHJ5IGZvciBhCisJICogc3BlY3VsYXRpdmUgbm9kZS1zcGVjaWZpYyBhbGxvY2F0aW9uLgogCSAqLwotCWlmIChJU19FTkFCTEVEKENPTkZJR19OVU1BKSAmJgotCSAgICAoZ2ZwX21hc2sgJiBHRlBfVEhJU05PREUpID09IEdGUF9USElTTk9ERSkKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfTlVNQSkgJiYgKGdmcF9tYXNrICYgX19HRlBfVEhJU05PREUpICYmICF3YWl0KQogCQlnb3RvIG5vcGFnZTsKIAogcmV0cnk6CkBAIC0yODI0LDcgKzI4NjQsNyBAQAogCS8qCiAJICogQ2hlY2sgdGhlIHpvbmVzIHN1aXRhYmxlIGZvciB0aGUgZ2ZwX21hc2sgY29udGFpbiBhdCBsZWFzdCBvbmUKIAkgKiB2YWxpZCB6b25lLiBJdCdzIHBvc3NpYmxlIHRvIGhhdmUgYW4gZW1wdHkgem9uZWxpc3QgYXMgYSByZXN1bHQKLQkgKiBvZiBHRlBfVEhJU05PREUgYW5kIGEgbWVtb3J5bGVzcyBub2RlCisJICogb2YgX19HRlBfVEhJU05PREUgYW5kIGEgbWVtb3J5bGVzcyBub2RlCiAJICovCiAJaWYgKHVubGlrZWx5KCF6b25lbGlzdC0+X3pvbmVyZWZzLT56b25lKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0zMjAxLDM4ICszMjQxLDMxIEBACiAgKiBTaG93IGZyZWUgYXJlYSBsaXN0ICh1c2VkIGluc2lkZSBzaGlmdF9zY3JvbGwtbG9jayBzdHVmZikKICAqIFdlIGFsc28gY2FsY3VsYXRlIHRoZSBwZXJjZW50YWdlIGZyYWdtZW50YXRpb24uIFdlIGRvIHRoaXMgYnkgY291bnRpbmcgdGhlCiAgKiBtZW1vcnkgb24gZWFjaCBmcmVlIGxpc3Qgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBmaXJzdCBpdGVtIG9uIHRoZSBsaXN0LgotICogU3VwcHJlc3NlcyBub2RlcyB0aGF0IGFyZSBub3QgYWxsb3dlZCBieSBjdXJyZW50J3MgY3B1c2V0IGlmCi0gKiBTSE9XX01FTV9GSUxURVJfTk9ERVMgaXMgcGFzc2VkLgorICoKKyAqIEJpdHMgaW4gQGZpbHRlcjoKKyAqIFNIT1dfTUVNX0ZJTFRFUl9OT0RFUzogc3VwcHJlc3Mgbm9kZXMgdGhhdCBhcmUgbm90IGFsbG93ZWQgYnkgY3VycmVudCdzCisgKiAgIGNwdXNldC4KICAqLwogdm9pZCBzaG93X2ZyZWVfYXJlYXModW5zaWduZWQgaW50IGZpbHRlcikKIHsKKwl1bnNpZ25lZCBsb25nIGZyZWVfcGNwID0gMDsKIAlpbnQgY3B1OwogCXN0cnVjdCB6b25lICp6b25lOwogCiAJZm9yX2VhY2hfcG9wdWxhdGVkX3pvbmUoem9uZSkgewogCQlpZiAoc2tpcF9mcmVlX2FyZWFzX25vZGUoZmlsdGVyLCB6b25lX3RvX25pZCh6b25lKSkpCiAJCQljb250aW51ZTsKLQkJc2hvd19ub2RlKHpvbmUpOwotCQlwcmludGsoIiVzIHBlci1jcHU6XG4iLCB6b25lLT5uYW1lKTsKIAotCQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQkJc3RydWN0IHBlcl9jcHVfcGFnZXNldCAqcGFnZXNldDsKLQotCQkJcGFnZXNldCA9IHBlcl9jcHVfcHRyKHpvbmUtPnBhZ2VzZXQsIGNwdSk7Ci0KLQkJCXByaW50aygiQ1BVICU0ZDogaGk6JTVkLCBidGNoOiU0ZCB1c2Q6JTRkXG4iLAotCQkJICAgICAgIGNwdSwgcGFnZXNldC0+cGNwLmhpZ2gsCi0JCQkgICAgICAgcGFnZXNldC0+cGNwLmJhdGNoLCBwYWdlc2V0LT5wY3AuY291bnQpOwotCQl9CisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQkJZnJlZV9wY3AgKz0gcGVyX2NwdV9wdHIoem9uZS0+cGFnZXNldCwgY3B1KS0+cGNwLmNvdW50OwogCX0KIAogCXByaW50aygiYWN0aXZlX2Fub246JWx1IGluYWN0aXZlX2Fub246JWx1IGlzb2xhdGVkX2Fub246JWx1XG4iCiAJCSIgYWN0aXZlX2ZpbGU6JWx1IGluYWN0aXZlX2ZpbGU6JWx1IGlzb2xhdGVkX2ZpbGU6JWx1XG4iCi0JCSIgdW5ldmljdGFibGU6JWx1IgotCQkiIGRpcnR5OiVsdSB3cml0ZWJhY2s6JWx1IHVuc3RhYmxlOiVsdVxuIgotCQkiIGZyZWU6JWx1IHNsYWJfcmVjbGFpbWFibGU6JWx1IHNsYWJfdW5yZWNsYWltYWJsZTolbHVcbiIKKwkJIiB1bmV2aWN0YWJsZTolbHUgZGlydHk6JWx1IHdyaXRlYmFjazolbHUgdW5zdGFibGU6JWx1XG4iCisJCSIgc2xhYl9yZWNsYWltYWJsZTolbHUgc2xhYl91bnJlY2xhaW1hYmxlOiVsdVxuIgogCQkiIG1hcHBlZDolbHUgc2htZW06JWx1IHBhZ2V0YWJsZXM6JWx1IGJvdW5jZTolbHVcbiIKLQkJIiBmcmVlX2NtYTolbHVcbiIsCisJCSIgZnJlZTolbHUgZnJlZV9wY3A6JWx1IGZyZWVfY21hOiVsdVxuIiwKIAkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfQUNUSVZFX0FOT04pLAogCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9JTkFDVElWRV9BTk9OKSwKIAkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfSVNPTEFURURfQU5PTiksCkBAIC0zMjQzLDEzICszMjc2LDE0IEBACiAJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfRElSVFkpLAogCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9XUklURUJBQ0spLAogCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9VTlNUQUJMRV9ORlMpLAotCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9GUkVFX1BBR0VTKSwKIAkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0xBQl9SRUNMQUlNQUJMRSksCiAJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX1NMQUJfVU5SRUNMQUlNQUJMRSksCiAJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZJTEVfTUFQUEVEKSwKIAkJZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0hNRU0pLAogCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9QQUdFVEFCTEUpLAogCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9CT1VOQ0UpLAorCQlnbG9iYWxfcGFnZV9zdGF0ZShOUl9GUkVFX1BBR0VTKSwKKwkJZnJlZV9wY3AsCiAJCWdsb2JhbF9wYWdlX3N0YXRlKE5SX0ZSRUVfQ01BX1BBR0VTKSk7CiAKIAlmb3JfZWFjaF9wb3B1bGF0ZWRfem9uZSh6b25lKSB7CkBAIC0zMjU3LDYgKzMyOTEsMTEgQEAKIAogCQlpZiAoc2tpcF9mcmVlX2FyZWFzX25vZGUoZmlsdGVyLCB6b25lX3RvX25pZCh6b25lKSkpCiAJCQljb250aW51ZTsKKworCQlmcmVlX3BjcCA9IDA7CisJCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQkJZnJlZV9wY3AgKz0gcGVyX2NwdV9wdHIoem9uZS0+cGFnZXNldCwgY3B1KS0+cGNwLmNvdW50OworCiAJCXNob3dfbm9kZSh6b25lKTsKIAkJcHJpbnRrKCIlcyIKIAkJCSIgZnJlZTolbHVrQiIKQEAgLTMyODMsNiArMzMyMiw4IEBACiAJCQkiIHBhZ2V0YWJsZXM6JWx1a0IiCiAJCQkiIHVuc3RhYmxlOiVsdWtCIgogCQkJIiBib3VuY2U6JWx1a0IiCisJCQkiIGZyZWVfcGNwOiVsdWtCIgorCQkJIiBsb2NhbF9wY3A6JXVrQiIKIAkJCSIgZnJlZV9jbWE6JWx1a0IiCiAJCQkiIHdyaXRlYmFja190bXA6JWx1a0IiCiAJCQkiIHBhZ2VzX3NjYW5uZWQ6JWx1IgpAQCAtMzMxNCw2ICszMzU1LDggQEAKIAkJCUsoem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX1BBR0VUQUJMRSkpLAogCQkJSyh6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfVU5TVEFCTEVfTkZTKSksCiAJCQlLKHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9CT1VOQ0UpKSwKKwkJCUsoZnJlZV9wY3ApLAorCQkJSyh0aGlzX2NwdV9yZWFkKHpvbmUtPnBhZ2VzZXQtPnBjcC5jb3VudCkpLAogCQkJSyh6b25lX3BhZ2Vfc3RhdGUoem9uZSwgTlJfRlJFRV9DTUFfUEFHRVMpKSwKIAkJCUsoem9uZV9wYWdlX3N0YXRlKHpvbmUsIE5SX1dSSVRFQkFDS19URU1QKSksCiAJCQlLKHpvbmVfcGFnZV9zdGF0ZSh6b25lLCBOUl9QQUdFU19TQ0FOTkVEKSksCkBAIC01NzE3LDcgKzU3NjAsNyBAQAogCQkJICogdmFsdWUgaGVyZS4KIAkJCSAqCiAJCQkgKiBUaGUgV01BUktfSElHSC1XTUFSS19MT1cgYW5kIChXTUFSS19MT1ctV01BUktfTUlOKQotCQkJICogZGVsdGFzIGNvbnRyb2xzIGFzeW5jaCBwYWdlIHJlY2xhaW0sIGFuZCBzbyBzaG91bGQKKwkJCSAqIGRlbHRhcyBjb250cm9sIGFzeW5jaCBwYWdlIHJlY2xhaW0sIGFuZCBzbyBzaG91bGQKIAkJCSAqIG5vdCBiZSBjYXBwZWQgZm9yIGhpZ2htZW0uCiAJCQkgKi8KIAkJCXVuc2lnbmVkIGxvbmcgbWluX3BhZ2VzOwpAQCAtNjE2NCw3ICs2MjA3LDcgQEAKIAltYXNrIDw8PSAoQklUU19QRVJfTE9ORyAtIGJpdGlkeCAtIDEpOwogCWZsYWdzIDw8PSAoQklUU19QRVJfTE9ORyAtIGJpdGlkeCAtIDEpOwogCi0Jd29yZCA9IEFDQ0VTU19PTkNFKGJpdG1hcFt3b3JkX2JpdGlkeF0pOworCXdvcmQgPSBSRUFEX09OQ0UoYml0bWFwW3dvcmRfYml0aWR4XSk7CiAJZm9yICg7OykgewogCQlvbGRfd29yZCA9IGNtcHhjaGcoJmJpdG1hcFt3b3JkX2JpdGlkeF0sIHdvcmQsICh3b3JkICYgfm1hc2spIHwgZmxhZ3MpOwogCQlpZiAod29yZCA9PSBvbGRfd29yZCkKZGlmZiAtLWdpdCBhL21tL3BhZ2VfaW8uYyBiL21tL3BhZ2VfaW8uYwppbmRleCBlNjA0NTgwLi5hOTZjODU2IDEwMDY0NAotLS0gYS9tbS9wYWdlX2lvLmMKKysrIGIvbW0vcGFnZV9pby5jCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4KICNpbmNsdWRlIDxsaW51eC93cml0ZWJhY2suaD4KICNpbmNsdWRlIDxsaW51eC9mcm9udHN3YXAuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogCiBzdGF0aWMgc3RydWN0IGJpbyAqZ2V0X3N3YXBfYmlvKGdmcF90IGdmcF9mbGFncywKQEAgLTI3NCw3ICsyNzQsNiBAQAogCQlpb3ZfaXRlcl9idmVjKCZmcm9tLCBJVEVSX0JWRUMgfCBXUklURSwgJmJ2LCAxLCBQQUdFX1NJWkUpOwogCQlpbml0X3N5bmNfa2lvY2IoJmtpb2NiLCBzd2FwX2ZpbGUpOwogCQlraW9jYi5raV9wb3MgPSBwYWdlX2ZpbGVfb2Zmc2V0KHBhZ2UpOwotCQlraW9jYi5raV9uYnl0ZXMgPSBQQUdFX1NJWkU7CiAKIAkJc2V0X3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOwogCQl1bmxvY2tfcGFnZShwYWdlKTsKZGlmZiAtLWdpdCBhL21tL3BhZ2VfaXNvbGF0aW9uLmMgYi9tbS9wYWdlX2lzb2xhdGlvbi5jCmluZGV4IDcyZjVhYzMuLjc1NWE0MmMgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfaXNvbGF0aW9uLmMKKysrIGIvbW0vcGFnZV9pc29sYXRpb24uYwpAQCAtMTAzLDYgKzEwMyw3IEBACiAKIAkJCWlmICghaXNfbWlncmF0ZV9pc29sYXRlX3BhZ2UoYnVkZHkpKSB7CiAJCQkJX19pc29sYXRlX2ZyZWVfcGFnZShwYWdlLCBvcmRlcik7CisJCQkJa2VybmVsX21hcF9wYWdlcyhwYWdlLCAoMSA8PCBvcmRlciksIDEpOwogCQkJCXNldF9wYWdlX3JlZmNvdW50ZWQocGFnZSk7CiAJCQkJaXNvbGF0ZWRfcGFnZSA9IHBhZ2U7CiAJCQl9CmRpZmYgLS1naXQgYS9tbS9wYWdld2Fsay5jIGIvbW0vcGFnZXdhbGsuYwppbmRleCA3NWMxZjI4Li4yOWYyZjhiIDEwMDY0NAotLS0gYS9tbS9wYWdld2Fsay5jCisrKyBiL21tL3BhZ2V3YWxrLmMKQEAgLTI2NSw4ICsyNjUsMTUgQEAKIAkJCXZtYSA9IHZtYS0+dm1fbmV4dDsKIAogCQkJZXJyID0gd2Fsa19wYWdlX3Rlc3Qoc3RhcnQsIG5leHQsIHdhbGspOwotCQkJaWYgKGVyciA+IDApCisJCQlpZiAoZXJyID4gMCkgeworCQkJCS8qCisJCQkJICogcG9zaXRpdmUgcmV0dXJuIHZhbHVlcyBhcmUgcHVyZWx5IGZvcgorCQkJCSAqIGNvbnRyb2xsaW5nIHRoZSBwYWdld2Fsaywgc28gc2hvdWxkIG5ldmVyCisJCQkJICogYmUgcGFzc2VkIHRvIHRoZSBjYWxsZXJzLgorCQkJCSAqLworCQkJCWVyciA9IDA7CiAJCQkJY29udGludWU7CisJCQl9CiAJCQlpZiAoZXJyIDwgMCkKIAkJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvbW0vcGVyY3B1LmMgYi9tbS9wZXJjcHUuYwppbmRleCA3M2M5N2E1Li5kZmQwMjQ4IDEwMDY0NAotLS0gYS9tbS9wZXJjcHUuYworKysgYi9tbS9wZXJjcHUuYwpAQCAtMTMxMCw3ICsxMzEwLDcgQEAKICAqIGFuZCwgZnJvbSB0aGUgc2Vjb25kIG9uZSwgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIChjdXJyZW50bHkgZWl0aGVyIHZtIG9yCiAgKiBrbSkgcHJvdmlkZXMgdHJhbnNsYXRpb24uCiAgKgotICogVGhlIGFkZHIgY2FuIGJlIHRyYW5sYXRlZCBzaW1wbHkgd2l0aG91dCBjaGVja2luZyBpZiBpdCBmYWxscyBpbnRvIHRoZQorICogVGhlIGFkZHIgY2FuIGJlIHRyYW5zbGF0ZWQgc2ltcGx5IHdpdGhvdXQgY2hlY2tpbmcgaWYgaXQgZmFsbHMgaW50byB0aGUKICAqIGZpcnN0IGNodW5rLiBCdXQgdGhlIGN1cnJlbnQgY29kZSByZWZsZWN0cyBiZXR0ZXIgaG93IHBlcmNwdSBhbGxvY2F0b3IKICAqIGFjdHVhbGx5IHdvcmtzLCBhbmQgdGhlIHZlcmlmaWNhdGlvbiBjYW4gZGlzY292ZXIgYm90aCBidWdzIGluIHBlcmNwdQogICogYWxsb2NhdG9yIGl0c2VsZiBhbmQgcGVyX2NwdV9wdHJfdG9fcGh5cygpIGNhbGxlcnMuIFNvIHdlIGtlZXAgY3VycmVudApAQCAtMTc2Miw3ICsxNzYyLDcgQEAKICAqIGFuZCBvdGhlciBwYXJhbWV0ZXJzIGNvbnNpZGVyaW5nIG5lZWRlZCBwZXJjcHUgc2l6ZSwgYWxsb2NhdGlvbgogICogYXRvbSBzaXplIGFuZCBkaXN0YW5jZXMgYmV0d2VlbiBDUFVzLgogICoKLSAqIEdyb3VwcyBhcmUgYWx3YXlzIG11dGxpcGxlcyBvZiBhdG9tIHNpemUgYW5kIENQVXMgd2hpY2ggYXJlIG9mCisgKiBHcm91cHMgYXJlIGFsd2F5cyBtdWx0aXBsZXMgb2YgYXRvbSBzaXplIGFuZCBDUFVzIHdoaWNoIGFyZSBvZgogICogTE9DQUxfRElTVEFOQ0UgYm90aCB3YXlzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGFuZCBzaGFyZSBzcGFjZSBmb3IKICAqIHVuaXRzIGluIHRoZSBzYW1lIGdyb3VwLiAgVGhlIHJldHVybmVkIGNvbmZpZ3VyYXRpb24gaXMgZ3VhcmFudGVlZAogICogdG8gaGF2ZSBDUFVzIG9uIGRpZmZlcmVudCBub2RlcyBvbiBkaWZmZXJlbnQgZ3JvdXBzIGFuZCA+PTc1JSB1c2FnZQpkaWZmIC0tZ2l0IGEvbW0vcHJvY2Vzc192bV9hY2Nlc3MuYyBiL21tL3Byb2Nlc3Nfdm1fYWNjZXNzLmMKaW5kZXggYjE1OTc2OS4uZTg4ZDA3MSAxMDA2NDQKLS0tIGEvbW0vcHJvY2Vzc192bV9hY2Nlc3MuYworKysgYi9tbS9wcm9jZXNzX3ZtX2FjY2Vzcy5jCkBAIC0yNTcsMjIgKzI1NywxOCBAQAogCXN0cnVjdCBpb3ZlYyAqaW92X3IgPSBpb3ZzdGFja19yOwogCXN0cnVjdCBpb3ZfaXRlciBpdGVyOwogCXNzaXplX3QgcmM7CisJaW50IGRpciA9IHZtX3dyaXRlID8gV1JJVEUgOiBSRUFEOwogCiAJaWYgKGZsYWdzICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyogQ2hlY2sgaW92ZWNzICovCi0JaWYgKHZtX3dyaXRlKQotCQlyYyA9IHJ3X2NvcHlfY2hlY2tfdXZlY3RvcihXUklURSwgbHZlYywgbGlvdmNudCwgVUlPX0ZBU1RJT1YsCi0JCQkJCSAgIGlvdnN0YWNrX2wsICZpb3ZfbCk7Ci0JZWxzZQotCQlyYyA9IHJ3X2NvcHlfY2hlY2tfdXZlY3RvcihSRUFELCBsdmVjLCBsaW92Y250LCBVSU9fRkFTVElPViwKLQkJCQkJICAgaW92c3RhY2tfbCwgJmlvdl9sKTsKLQlpZiAocmMgPD0gMCkKKwlyYyA9IGltcG9ydF9pb3ZlYyhkaXIsIGx2ZWMsIGxpb3ZjbnQsIFVJT19GQVNUSU9WLCAmaW92X2wsICZpdGVyKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisJaWYgKCFpb3ZfaXRlcl9jb3VudCgmaXRlcikpCiAJCWdvdG8gZnJlZV9pb3ZlY3M7CiAKLQlpb3ZfaXRlcl9pbml0KCZpdGVyLCB2bV93cml0ZSA/IFdSSVRFIDogUkVBRCwgaW92X2wsIGxpb3ZjbnQsIHJjKTsKLQogCXJjID0gcndfY29weV9jaGVja191dmVjdG9yKENIRUNLX0lPVkVDX09OTFksIHJ2ZWMsIHJpb3ZjbnQsIFVJT19GQVNUSU9WLAogCQkJCSAgIGlvdnN0YWNrX3IsICZpb3Zfcik7CiAJaWYgKHJjIDw9IDApCkBAIC0yODMsOCArMjc5LDcgQEAKIGZyZWVfaW92ZWNzOgogCWlmIChpb3ZfciAhPSBpb3ZzdGFja19yKQogCQlrZnJlZShpb3Zfcik7Ci0JaWYgKGlvdl9sICE9IGlvdnN0YWNrX2wpCi0JCWtmcmVlKGlvdl9sKTsKKwlrZnJlZShpb3ZfbCk7CiAKIAlyZXR1cm4gcmM7CiB9CkBAIC0zMjAsMjEgKzMxNSwxNiBAQAogCXN0cnVjdCBpb3ZlYyAqaW92X3IgPSBpb3ZzdGFja19yOwogCXN0cnVjdCBpb3ZfaXRlciBpdGVyOwogCXNzaXplX3QgcmMgPSAtRUZBVUxUOworCWludCBkaXIgPSB2bV93cml0ZSA/IFdSSVRFIDogUkVBRDsKIAogCWlmIChmbGFncyAhPSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmICh2bV93cml0ZSkKLQkJcmMgPSBjb21wYXRfcndfY29weV9jaGVja191dmVjdG9yKFdSSVRFLCBsdmVjLCBsaW92Y250LAotCQkJCQkJICBVSU9fRkFTVElPViwgaW92c3RhY2tfbCwKLQkJCQkJCSAgJmlvdl9sKTsKLQllbHNlCi0JCXJjID0gY29tcGF0X3J3X2NvcHlfY2hlY2tfdXZlY3RvcihSRUFELCBsdmVjLCBsaW92Y250LAotCQkJCQkJICBVSU9fRkFTVElPViwgaW92c3RhY2tfbCwKLQkJCQkJCSAgJmlvdl9sKTsKLQlpZiAocmMgPD0gMCkKKwlyYyA9IGNvbXBhdF9pbXBvcnRfaW92ZWMoZGlyLCBsdmVjLCBsaW92Y250LCBVSU9fRkFTVElPViwgJmlvdl9sLCAmaXRlcik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCWlmICghaW92X2l0ZXJfY291bnQoJml0ZXIpKQogCQlnb3RvIGZyZWVfaW92ZWNzOwotCWlvdl9pdGVyX2luaXQoJml0ZXIsIHZtX3dyaXRlID8gV1JJVEUgOiBSRUFELCBpb3ZfbCwgbGlvdmNudCwgcmMpOwogCXJjID0gY29tcGF0X3J3X2NvcHlfY2hlY2tfdXZlY3RvcihDSEVDS19JT1ZFQ19PTkxZLCBydmVjLCByaW92Y250LAogCQkJCQkgIFVJT19GQVNUSU9WLCBpb3ZzdGFja19yLAogCQkJCQkgICZpb3Zfcik7CkBAIC0zNDYsOCArMzM2LDcgQEAKIGZyZWVfaW92ZWNzOgogCWlmIChpb3ZfciAhPSBpb3ZzdGFja19yKQogCQlrZnJlZShpb3Zfcik7Ci0JaWYgKGlvdl9sICE9IGlvdnN0YWNrX2wpCi0JCWtmcmVlKGlvdl9sKTsKKwlrZnJlZShpb3ZfbCk7CiAJcmV0dXJuIHJjOwogfQogCmRpZmYgLS1naXQgYS9tbS9ybWFwLmMgYi9tbS9ybWFwLmMKaW5kZXggNWUzZTA5MC4uMjRkZDNmOSAxMDA2NDQKLS0tIGEvbW0vcm1hcC5jCisrKyBiL21tL3JtYXAuYwpAQCAtMjg3LDYgKzI4NywxMyBAQAogCXJldHVybiAwOwogCiAgZW5vbWVtX2ZhaWx1cmU6CisJLyoKKwkgKiBkc3QtPmFub25fdm1hIGlzIGRyb3BwZWQgaGVyZSBvdGhlcndpc2UgaXRzIGRlZ3JlZSBjYW4gYmUgaW5jb3JyZWN0bHkKKwkgKiBkZWNyZW1lbnRlZCBpbiB1bmxpbmtfYW5vbl92bWFzKCkuCisJICogV2UgY2FuIHNhZmVseSBkbyB0aGlzIGJlY2F1c2UgY2FsbGVycyBvZiBhbm9uX3ZtYV9jbG9uZSgpIGRvbid0IGNhcmUKKwkgKiBhYm91dCBkc3QtPmFub25fdm1hIGlmIGFub25fdm1hX2Nsb25lKCkgZmFpbGVkLgorCSAqLworCWRzdC0+YW5vbl92bWEgPSBOVUxMOwogCXVubGlua19hbm9uX3ZtYXMoZHN0KTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KQEAgLTQ0OSw3ICs0NTYsNyBAQAogCXVuc2lnbmVkIGxvbmcgYW5vbl9tYXBwaW5nOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCWFub25fbWFwcGluZyA9ICh1bnNpZ25lZCBsb25nKSBBQ0NFU1NfT05DRShwYWdlLT5tYXBwaW5nKTsKKwlhbm9uX21hcHBpbmcgPSAodW5zaWduZWQgbG9uZylSRUFEX09OQ0UocGFnZS0+bWFwcGluZyk7CiAJaWYgKChhbm9uX21hcHBpbmcgJiBQQUdFX01BUFBJTkdfRkxBR1MpICE9IFBBR0VfTUFQUElOR19BTk9OKQogCQlnb3RvIG91dDsKIAlpZiAoIXBhZ2VfbWFwcGVkKHBhZ2UpKQpAQCAtNDkzLDE0ICs1MDAsMTQgQEAKIAl1bnNpZ25lZCBsb25nIGFub25fbWFwcGluZzsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlhbm9uX21hcHBpbmcgPSAodW5zaWduZWQgbG9uZykgQUNDRVNTX09OQ0UocGFnZS0+bWFwcGluZyk7CisJYW5vbl9tYXBwaW5nID0gKHVuc2lnbmVkIGxvbmcpUkVBRF9PTkNFKHBhZ2UtPm1hcHBpbmcpOwogCWlmICgoYW5vbl9tYXBwaW5nICYgUEFHRV9NQVBQSU5HX0ZMQUdTKSAhPSBQQUdFX01BUFBJTkdfQU5PTikKIAkJZ290byBvdXQ7CiAJaWYgKCFwYWdlX21hcHBlZChwYWdlKSkKIAkJZ290byBvdXQ7CiAKIAlhbm9uX3ZtYSA9IChzdHJ1Y3QgYW5vbl92bWEgKikgKGFub25fbWFwcGluZyAtIFBBR0VfTUFQUElOR19BTk9OKTsKLQlyb290X2Fub25fdm1hID0gQUNDRVNTX09OQ0UoYW5vbl92bWEtPnJvb3QpOworCXJvb3RfYW5vbl92bWEgPSBSRUFEX09OQ0UoYW5vbl92bWEtPnJvb3QpOwogCWlmIChkb3duX3JlYWRfdHJ5bG9jaygmcm9vdF9hbm9uX3ZtYS0+cndzZW0pKSB7CiAJCS8qCiAJCSAqIElmIHRoZSBwYWdlIGlzIHN0aWxsIG1hcHBlZCwgdGhlbiB0aGlzIGFub25fdm1hIGlzIHN0aWxsCmRpZmYgLS1naXQgYS9tbS9zaG1lbS5jIGIvbW0vc2htZW0uYwppbmRleCBjZjJkMGNhLi4xZWEyNDAwIDEwMDY0NAotLS0gYS9tbS9zaG1lbS5jCisrKyBiL21tL3NobWVtLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KIAogc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqc2htX21udDsKIApAQCAtMzExOCw4ICszMTE4LDYgQEAKIAkubW1hcAkJPSBzaG1lbV9tbWFwLAogI2lmZGVmIENPTkZJR19UTVBGUwogCS5sbHNlZWsJCT0gc2htZW1fZmlsZV9sbHNlZWssCi0JLnJlYWQJCT0gbmV3X3N5bmNfcmVhZCwKLQkud3JpdGUJCT0gbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlcgk9IHNobWVtX2ZpbGVfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyCT0gZ2VuZXJpY19maWxlX3dyaXRlX2l0ZXIsCiAJLmZzeW5jCQk9IG5vb3BfZnN5bmMsCmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggYzRiODllYS4uN2ViMzhkZCAxMDA2NDQKLS0tIGEvbW0vc2xhYi5jCisrKyBiL21tL3NsYWIuYwpAQCAtODU3LDYgKzg1NywxMSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW5saW5lIGdmcF90IGdmcF9leGFjdF9ub2RlKGdmcF90IGZsYWdzKQoreworCXJldHVybiBmbGFnczsKK30KKwogI2Vsc2UJLyogQ09ORklHX05VTUEgKi8KIAogc3RhdGljIHZvaWQgKl9fX19jYWNoZV9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICosIGdmcF90LCBpbnQpOwpAQCAtMTAyMyw2ICsxMDI4LDE1IEBACiAKIAlyZXR1cm4gX19jYWNoZV9mcmVlX2FsaWVuKGNhY2hlcCwgb2JqcCwgbm9kZSwgcGFnZV9ub2RlKTsKIH0KKworLyoKKyAqIENvbnN0cnVjdCBnZnAgbWFzayB0byBhbGxvY2F0ZSBmcm9tIGEgc3BlY2lmaWMgbm9kZSBidXQgZG8gbm90IGludm9rZSByZWNsYWltCisgKiBvciB3YXJuIGFib3V0IGZhaWx1cmVzLgorICovCitzdGF0aWMgaW5saW5lIGdmcF90IGdmcF9leGFjdF9ub2RlKGdmcF90IGZsYWdzKQoreworCXJldHVybiAoZmxhZ3MgfCBfX0dGUF9USElTTk9ERSB8IF9fR0ZQX05PV0FSTikgJiB+X19HRlBfV0FJVDsKK30KICNlbmRpZgogCiAvKgpAQCAtMjgyNSw3ICsyODM5LDcgQEAKIAlpZiAodW5saWtlbHkoIWFjLT5hdmFpbCkpIHsKIAkJaW50IHg7CiBmb3JjZV9ncm93OgotCQl4ID0gY2FjaGVfZ3JvdyhjYWNoZXAsIGZsYWdzIHwgR0ZQX1RISVNOT0RFLCBub2RlLCBOVUxMKTsKKwkJeCA9IGNhY2hlX2dyb3coY2FjaGVwLCBnZnBfZXhhY3Rfbm9kZShmbGFncyksIG5vZGUsIE5VTEwpOwogCiAJCS8qIGNhY2hlX2dyb3cgY2FuIHJlZW5hYmxlIGludGVycnVwdHMsIHRoZW4gYWMgY291bGQgY2hhbmdlLiAqLwogCQlhYyA9IGNwdV9jYWNoZV9nZXQoY2FjaGVwKTsKQEAgLTMwMTksNyArMzAzMyw3IEBACiAJCQlnZXRfbm9kZShjYWNoZSwgbmlkKSAmJgogCQkJZ2V0X25vZGUoY2FjaGUsIG5pZCktPmZyZWVfb2JqZWN0cykgewogCQkJCW9iaiA9IF9fX19jYWNoZV9hbGxvY19ub2RlKGNhY2hlLAotCQkJCQlmbGFncyB8IEdGUF9USElTTk9ERSwgbmlkKTsKKwkJCQkJZ2ZwX2V4YWN0X25vZGUoZmxhZ3MpLCBuaWQpOwogCQkJCWlmIChvYmopCiAJCQkJCWJyZWFrOwogCQl9CkBAIC0zMDQ3LDcgKzMwNjEsNyBAQAogCQkJbmlkID0gcGFnZV90b19uaWQocGFnZSk7CiAJCQlpZiAoY2FjaGVfZ3JvdyhjYWNoZSwgZmxhZ3MsIG5pZCwgcGFnZSkpIHsKIAkJCQlvYmogPSBfX19fY2FjaGVfYWxsb2Nfbm9kZShjYWNoZSwKLQkJCQkJZmxhZ3MgfCBHRlBfVEhJU05PREUsIG5pZCk7CisJCQkJCWdmcF9leGFjdF9ub2RlKGZsYWdzKSwgbmlkKTsKIAkJCQlpZiAoIW9iaikKIAkJCQkJLyoKIAkJCQkJICogQW5vdGhlciBwcm9jZXNzb3IgbWF5IGFsbG9jYXRlIHRoZQpAQCAtMzExOCw3ICszMTMyLDcgQEAKIAogbXVzdF9ncm93OgogCXNwaW5fdW5sb2NrKCZuLT5saXN0X2xvY2spOwotCXggPSBjYWNoZV9ncm93KGNhY2hlcCwgZmxhZ3MgfCBHRlBfVEhJU05PREUsIG5vZGVpZCwgTlVMTCk7CisJeCA9IGNhY2hlX2dyb3coY2FjaGVwLCBnZnBfZXhhY3Rfbm9kZShmbGFncyksIG5vZGVpZCwgTlVMTCk7CiAJaWYgKHgpCiAJCWdvdG8gcmV0cnk7CiAKZGlmZiAtLWdpdCBhL21tL3Nsb2IuYyBiL21tL3Nsb2IuYwppbmRleCA5NGE3ZmVkLi40NzY1ZjY1IDEwMDY0NAotLS0gYS9tbS9zbG9iLmMKKysrIGIvbW0vc2xvYi5jCkBAIC01MzIsNyArNTMyLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCAqc2xvYl9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCitzdGF0aWMgdm9pZCAqc2xvYl9hbGxvY19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCiB7CiAJdm9pZCAqYjsKIApAQCAtNTU4LDcgKzU1OCw2IEBACiAJa21lbWxlYWtfYWxsb2NfcmVjdXJzaXZlKGIsIGMtPnNpemUsIDEsIGMtPmZsYWdzLCBmbGFncyk7CiAJcmV0dXJuIGI7CiB9Ci1FWFBPUlRfU1lNQk9MKHNsb2JfYWxsb2Nfbm9kZSk7CiAKIHZvaWQgKmttZW1fY2FjaGVfYWxsb2Moc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcCwgZ2ZwX3QgZmxhZ3MpCiB7CmRpZmYgLS1naXQgYS9tbS9zbHViLmMgYi9tbS9zbHViLmMKaW5kZXggNjgzMmM0ZS4uNTRjMDg3NiAxMDA2NDQKLS0tIGEvbW0vc2x1Yi5jCisrKyBiL21tL3NsdWIuYwpAQCAtMzc0LDcgKzM3NCw3IEBACiAJCWlmIChjbXB4Y2hnX2RvdWJsZSgmcGFnZS0+ZnJlZWxpc3QsICZwYWdlLT5jb3VudGVycywKIAkJCQkgICBmcmVlbGlzdF9vbGQsIGNvdW50ZXJzX29sZCwKIAkJCQkgICBmcmVlbGlzdF9uZXcsIGNvdW50ZXJzX25ldykpCi0JCQlyZXR1cm4gMTsKKwkJCXJldHVybiB0cnVlOwogCX0gZWxzZQogI2VuZGlmCiAJewpAQCAtMzg0LDcgKzM4NCw3IEBACiAJCQlwYWdlLT5mcmVlbGlzdCA9IGZyZWVsaXN0X25ldzsKIAkJCXNldF9wYWdlX3NsdWJfY291bnRlcnMocGFnZSwgY291bnRlcnNfbmV3KTsKIAkJCXNsYWJfdW5sb2NrKHBhZ2UpOwotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCQlzbGFiX3VubG9jayhwYWdlKTsKIAl9CkBAIC0zOTYsNyArMzk2LDcgQEAKIAlwcl9pbmZvKCIlcyAlczogY21weGNoZyBkb3VibGUgcmVkbyAiLCBuLCBzLT5uYW1lKTsKICNlbmRpZgogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGZhbHNlOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgY21weGNoZ19kb3VibGVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCkBAIC00MTAsNyArNDEwLDcgQEAKIAkJaWYgKGNtcHhjaGdfZG91YmxlKCZwYWdlLT5mcmVlbGlzdCwgJnBhZ2UtPmNvdW50ZXJzLAogCQkJCSAgIGZyZWVsaXN0X29sZCwgY291bnRlcnNfb2xkLAogCQkJCSAgIGZyZWVsaXN0X25ldywgY291bnRlcnNfbmV3KSkKLQkJCXJldHVybiAxOworCQkJcmV0dXJuIHRydWU7CiAJfSBlbHNlCiAjZW5kaWYKIAl7CkBAIC00MjQsNyArNDI0LDcgQEAKIAkJCXNldF9wYWdlX3NsdWJfY291bnRlcnMocGFnZSwgY291bnRlcnNfbmV3KTsKIAkJCXNsYWJfdW5sb2NrKHBhZ2UpOwogCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gdHJ1ZTsKIAkJfQogCQlzbGFiX3VubG9jayhwYWdlKTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtNDM3LDcgKzQzNyw3IEBACiAJcHJfaW5mbygiJXMgJXM6IGNtcHhjaGcgZG91YmxlIHJlZG8gIiwgbiwgcy0+bmFtZSk7CiAjZW5kaWYKIAotCXJldHVybiAwOworCXJldHVybiBmYWxzZTsKIH0KIAogI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCkBAIC0xMTM3LDE1ICsxMTM3LDYgQEAKIAkJICovCiAJCWdvdG8gY2hlY2tfc2xhYnM7CiAKLQlpZiAodG9sb3dlcigqc3RyKSA9PSAnbycpIHsKLQkJLyoKLQkJICogQXZvaWQgZW5hYmxpbmcgZGVidWdnaW5nIG9uIGNhY2hlcyBpZiBpdHMgbWluaW11bSBvcmRlcgotCQkgKiB3b3VsZCBpbmNyZWFzZSBhcyBhIHJlc3VsdC4KLQkJICovCi0JCWRpc2FibGVfaGlnaGVyX29yZGVyX2RlYnVnID0gMTsKLQkJZ290byBvdXQ7Ci0JfQotCiAJc2x1Yl9kZWJ1ZyA9IDA7CiAJaWYgKCpzdHIgPT0gJy0nKQogCQkvKgpAQCAtMTE3Niw2ICsxMTY3LDEzIEBACiAJCWNhc2UgJ2EnOgogCQkJc2x1Yl9kZWJ1ZyB8PSBTTEFCX0ZBSUxTTEFCOwogCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJLyoKKwkJCSAqIEF2b2lkIGVuYWJsaW5nIGRlYnVnZ2luZyBvbiBjYWNoZXMgaWYgaXRzIG1pbmltdW0KKwkJCSAqIG9yZGVyIHdvdWxkIGluY3JlYXNlIGFzIGEgcmVzdWx0LgorCQkJICovCisJCQlkaXNhYmxlX2hpZ2hlcl9vcmRlcl9kZWJ1ZyA9IDE7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCXByX2Vycigic2x1Yl9kZWJ1ZyBvcHRpb24gJyVjJyB1bmtub3duLiBza2lwcGVkXG4iLAogCQkJICAgICAgICpzdHIpOwpAQCAtMjQ0OSw3ICsyNDQ3LDggQEAKIAlkbyB7CiAJCXRpZCA9IHRoaXNfY3B1X3JlYWQocy0+Y3B1X3NsYWItPnRpZCk7CiAJCWMgPSByYXdfY3B1X3B0cihzLT5jcHVfc2xhYik7Ci0JfSB3aGlsZSAoSVNfRU5BQkxFRChDT05GSUdfUFJFRU1QVCkgJiYgdW5saWtlbHkodGlkICE9IGMtPnRpZCkpOworCX0gd2hpbGUgKElTX0VOQUJMRUQoQ09ORklHX1BSRUVNUFQpICYmCisJCSB1bmxpa2VseSh0aWQgIT0gUkVBRF9PTkNFKGMtPnRpZCkpKTsKIAogCS8qCiAJICogSXJxbGVzcyBvYmplY3QgYWxsb2MvZnJlZSBhbGdvcml0aG0gdXNlZCBoZXJlIGRlcGVuZHMgb24gc2VxdWVuY2UKQEAgLTI3MTgsNyArMjcxNyw4IEBACiAJZG8gewogCQl0aWQgPSB0aGlzX2NwdV9yZWFkKHMtPmNwdV9zbGFiLT50aWQpOwogCQljID0gcmF3X2NwdV9wdHIocy0+Y3B1X3NsYWIpOwotCX0gd2hpbGUgKElTX0VOQUJMRUQoQ09ORklHX1BSRUVNUFQpICYmIHVubGlrZWx5KHRpZCAhPSBjLT50aWQpKTsKKwl9IHdoaWxlIChJU19FTkFCTEVEKENPTkZJR19QUkVFTVBUKSAmJgorCQkgdW5saWtlbHkodGlkICE9IFJFQURfT05DRShjLT50aWQpKSk7CiAKIAkvKiBTYW1lIHdpdGggY29tbWVudCBvbiBiYXJyaWVyKCkgaW4gc2xhYl9hbGxvY19ub2RlKCkgKi8KIAliYXJyaWVyKCk7CkBAIC00Mjc3LDcgKzQyNzcsNyBAQAogCQkJaW50IG5vZGU7CiAJCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKIAotCQkJcGFnZSA9IEFDQ0VTU19PTkNFKGMtPnBhZ2UpOworCQkJcGFnZSA9IFJFQURfT05DRShjLT5wYWdlKTsKIAkJCWlmICghcGFnZSkKIAkJCQljb250aW51ZTsKIApAQCAtNDI5Miw3ICs0MjkyLDcgQEAKIAkJCXRvdGFsICs9IHg7CiAJCQlub2Rlc1tub2RlXSArPSB4OwogCi0JCQlwYWdlID0gQUNDRVNTX09OQ0UoYy0+cGFydGlhbCk7CisJCQlwYWdlID0gUkVBRF9PTkNFKGMtPnBhcnRpYWwpOwogCQkJaWYgKHBhZ2UpIHsKIAkJCQlub2RlID0gcGFnZV90b19uaWQocGFnZSk7CiAJCQkJaWYgKGZsYWdzICYgU09fVE9UQUwpCmRpZmYgLS1naXQgYS9tbS9zd2FwLmMgYi9tbS9zd2FwLmMKaW5kZXggY2QzYTVlNi4uYTcyNTFhOCAxMDA2NDQKLS0tIGEvbW0vc3dhcC5jCisrKyBiL21tL3N3YXAuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC00Miw3ICs0Myw3IEBACiAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGFnZXZlYywgbHJ1X2FkZF9wdmVjKTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGFnZXZlYywgbHJ1X3JvdGF0ZV9wdmVjcyk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHBhZ2V2ZWMsIGxydV9kZWFjdGl2YXRlX3B2ZWNzKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGFnZXZlYywgbHJ1X2RlYWN0aXZhdGVfZmlsZV9wdmVjcyk7CiAKIC8qCiAgKiBUaGlzIHBhdGggYWxtb3N0IG5ldmVyIGhhcHBlbnMgZm9yIFZNIGFjdGl2aXR5IC0gcGFnZXMgYXJlIG5vcm1hbGx5CkBAIC03NSw3ICs3NiwxNCBAQAogewogCWNvbXBvdW5kX3BhZ2VfZHRvciAqZHRvcjsKIAotCV9fcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCS8qCisJICogX19wYWdlX2NhY2hlX3JlbGVhc2UoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgZm9yIHRocCwgbm90IGZvcgorCSAqIGh1Z2V0bGIuIFRoaXMgaXMgYmVjYXVzZSBodWdldGxiIHBhZ2UgZG9lcyBuZXZlciBoYXZlIFBhZ2VMUlUgc2V0CisJICogKGl0J3MgbmV2ZXIgbGlzdGVkIHRvIGFueSBMUlUgbGlzdHMpIGFuZCBubyBtZW1jZyByb3V0aW5lcyBzaG91bGQKKwkgKiBiZSBjYWxsZWQgZm9yIGh1Z2V0bGIgKGl0IGhhcyBhIHNlcGFyYXRlIGh1Z2V0bGJfY2dyb3VwLikKKwkgKi8KKwlpZiAoIVBhZ2VIdWdlKHBhZ2UpKQorCQlfX3BhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAlkdG9yID0gZ2V0X2NvbXBvdW5kX3BhZ2VfZHRvcihwYWdlKTsKIAkoKmR0b3IpKHBhZ2UpOwogfQpAQCAtNzQzLDcgKzc1MSw3IEBACiAgKiBiZSB3cml0ZSBpdCBvdXQgYnkgZmx1c2hlciB0aHJlYWRzIGFzIHRoaXMgaXMgbXVjaCBtb3JlIGVmZmVjdGl2ZQogICogdGhhbiB0aGUgc2luZ2xlLXBhZ2Ugd3JpdGVvdXQgZnJvbSByZWNsYWltLgogICovCi1zdGF0aWMgdm9pZCBscnVfZGVhY3RpdmF0ZV9mbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxydXZlYyAqbHJ1dmVjLAorc3RhdGljIHZvaWQgbHJ1X2RlYWN0aXZhdGVfZmlsZV9mbihzdHJ1Y3QgcGFnZSAqcGFnZSwgc3RydWN0IGxydXZlYyAqbHJ1dmVjLAogCQkJICAgICAgdm9pZCAqYXJnKQogewogCWludCBscnUsIGZpbGU7CkBAIC04MTEsMzYgKzgxOSwzNiBAQAogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogCi0JcHZlYyA9ICZwZXJfY3B1KGxydV9kZWFjdGl2YXRlX3B2ZWNzLCBjcHUpOworCXB2ZWMgPSAmcGVyX2NwdShscnVfZGVhY3RpdmF0ZV9maWxlX3B2ZWNzLCBjcHUpOwogCWlmIChwYWdldmVjX2NvdW50KHB2ZWMpKQotCQlwYWdldmVjX2xydV9tb3ZlX2ZuKHB2ZWMsIGxydV9kZWFjdGl2YXRlX2ZuLCBOVUxMKTsKKwkJcGFnZXZlY19scnVfbW92ZV9mbihwdmVjLCBscnVfZGVhY3RpdmF0ZV9maWxlX2ZuLCBOVUxMKTsKIAogCWFjdGl2YXRlX3BhZ2VfZHJhaW4oY3B1KTsKIH0KIAogLyoqCi0gKiBkZWFjdGl2YXRlX3BhZ2UgLSBmb3JjZWZ1bGx5IGRlYWN0aXZhdGUgYSBwYWdlCisgKiBkZWFjdGl2YXRlX2ZpbGVfcGFnZSAtIGZvcmNlZnVsbHkgZGVhY3RpdmF0ZSBhIGZpbGUgcGFnZQogICogQHBhZ2U6IHBhZ2UgdG8gZGVhY3RpdmF0ZQogICoKICAqIFRoaXMgZnVuY3Rpb24gaGludHMgdGhlIFZNIHRoYXQgQHBhZ2UgaXMgYSBnb29kIHJlY2xhaW0gY2FuZGlkYXRlLAogICogZm9yIGV4YW1wbGUgaWYgaXRzIGludmFsaWRhdGlvbiBmYWlscyBkdWUgdG8gdGhlIHBhZ2UgYmVpbmcgZGlydHkKICAqIG9yIHVuZGVyIHdyaXRlYmFjay4KICAqLwotdm9pZCBkZWFjdGl2YXRlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit2b2lkIGRlYWN0aXZhdGVfZmlsZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewogCS8qCi0JICogSW4gYSB3b3JrbG9hZCB3aXRoIG1hbnkgdW5ldmljdGFibGUgcGFnZSBzdWNoIGFzIG1wcm90ZWN0LCB1bmV2aWN0YWJsZQotCSAqIHBhZ2UgZGVhY3RpdmF0aW9uIGZvciBhY2NlbGVyYXRpbmcgcmVjbGFpbSBpcyBwb2ludGxlc3MuCisJICogSW4gYSB3b3JrbG9hZCB3aXRoIG1hbnkgdW5ldmljdGFibGUgcGFnZSBzdWNoIGFzIG1wcm90ZWN0LAorCSAqIHVuZXZpY3RhYmxlIHBhZ2UgZGVhY3RpdmF0aW9uIGZvciBhY2NlbGVyYXRpbmcgcmVjbGFpbSBpcyBwb2ludGxlc3MuCiAJICovCiAJaWYgKFBhZ2VVbmV2aWN0YWJsZShwYWdlKSkKIAkJcmV0dXJuOwogCiAJaWYgKGxpa2VseShnZXRfcGFnZV91bmxlc3NfemVybyhwYWdlKSkpIHsKLQkJc3RydWN0IHBhZ2V2ZWMgKnB2ZWMgPSAmZ2V0X2NwdV92YXIobHJ1X2RlYWN0aXZhdGVfcHZlY3MpOworCQlzdHJ1Y3QgcGFnZXZlYyAqcHZlYyA9ICZnZXRfY3B1X3ZhcihscnVfZGVhY3RpdmF0ZV9maWxlX3B2ZWNzKTsKIAogCQlpZiAoIXBhZ2V2ZWNfYWRkKHB2ZWMsIHBhZ2UpKQotCQkJcGFnZXZlY19scnVfbW92ZV9mbihwdmVjLCBscnVfZGVhY3RpdmF0ZV9mbiwgTlVMTCk7Ci0JCXB1dF9jcHVfdmFyKGxydV9kZWFjdGl2YXRlX3B2ZWNzKTsKKwkJCXBhZ2V2ZWNfbHJ1X21vdmVfZm4ocHZlYywgbHJ1X2RlYWN0aXZhdGVfZmlsZV9mbiwgTlVMTCk7CisJCXB1dF9jcHVfdmFyKGxydV9kZWFjdGl2YXRlX2ZpbGVfcHZlY3MpOwogCX0KIH0KIApAQCAtODcyLDcgKzg4MCw3IEBACiAKIAkJaWYgKHBhZ2V2ZWNfY291bnQoJnBlcl9jcHUobHJ1X2FkZF9wdmVjLCBjcHUpKSB8fAogCQkgICAgcGFnZXZlY19jb3VudCgmcGVyX2NwdShscnVfcm90YXRlX3B2ZWNzLCBjcHUpKSB8fAotCQkgICAgcGFnZXZlY19jb3VudCgmcGVyX2NwdShscnVfZGVhY3RpdmF0ZV9wdmVjcywgY3B1KSkgfHwKKwkJICAgIHBhZ2V2ZWNfY291bnQoJnBlcl9jcHUobHJ1X2RlYWN0aXZhdGVfZmlsZV9wdmVjcywgY3B1KSkgfHwKIAkJICAgIG5lZWRfYWN0aXZhdGVfcGFnZV9kcmFpbihjcHUpKSB7CiAJCQlJTklUX1dPUksod29yaywgbHJ1X2FkZF9kcmFpbl9wZXJfY3B1KTsKIAkJCXNjaGVkdWxlX3dvcmtfb24oY3B1LCB3b3JrKTsKZGlmZiAtLWdpdCBhL21tL3N3YXBfc3RhdGUuYyBiL21tL3N3YXBfc3RhdGUuYwppbmRleCA0MDU5MjNmLi44YmM4ZTY2IDEwMDY0NAotLS0gYS9tbS9zd2FwX3N0YXRlLmMKKysrIGIvbW0vc3dhcF9zdGF0ZS5jCkBAIC0zOTAsNyArMzkwLDcgQEAKIAl1bnNpZ25lZCBpbnQgcGFnZXMsIG1heF9wYWdlcywgbGFzdF9yYTsKIAlzdGF0aWMgYXRvbWljX3QgbGFzdF9yZWFkYWhlYWRfcGFnZXM7CiAKLQltYXhfcGFnZXMgPSAxIDw8IEFDQ0VTU19PTkNFKHBhZ2VfY2x1c3Rlcik7CisJbWF4X3BhZ2VzID0gMSA8PCBSRUFEX09OQ0UocGFnZV9jbHVzdGVyKTsKIAlpZiAobWF4X3BhZ2VzIDw9IDEpCiAJCXJldHVybiAxOwogCmRpZmYgLS1naXQgYS9tbS9zd2FwZmlsZS5jIGIvbW0vc3dhcGZpbGUuYwppbmRleCA2M2Y1NWNjLi5hN2U3MjEwIDEwMDY0NAotLS0gYS9tbS9zd2FwZmlsZS5jCisrKyBiL21tL3N3YXBmaWxlLmMKQEAgLTEzMTIsNyArMTMxMiw3IEBACiAJCQllbHNlCiAJCQkJY29udGludWU7CiAJCX0KLQkJY291bnQgPSBBQ0NFU1NfT05DRShzaS0+c3dhcF9tYXBbaV0pOworCQljb3VudCA9IFJFQURfT05DRShzaS0+c3dhcF9tYXBbaV0pOwogCQlpZiAoY291bnQgJiYgc3dhcF9jb3VudChjb3VudCkgIT0gU1dBUF9NQVBfQkFEKQogCQkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vdHJ1bmNhdGUuYyBiL21tL3RydW5jYXRlLmMKaW5kZXggZGRlYzVhNS4uNjZhZjkwMyAxMDA2NDQKLS0tIGEvbW0vdHJ1bmNhdGUuYworKysgYi9tbS90cnVuY2F0ZS5jCkBAIC05MywzNSArOTMsNiBAQAogfQogCiAvKgotICogVGhpcyBjYW5jZWxzIGp1c3QgdGhlIGRpcnR5IGJpdCBvbiB0aGUga2VybmVsIHBhZ2UgaXRzZWxmLCBpdAotICogZG9lcyBOT1QgYWN0dWFsbHkgcmVtb3ZlIGRpcnR5IGJpdHMgb24gYW55IG1tYXAncyB0aGF0IG1heSBiZQotICogYXJvdW5kLiBJdCBhbHNvIGxlYXZlcyB0aGUgcGFnZSB0YWdnZWQgZGlydHksIHNvIGFueSBzeW5jCi0gKiBhY3Rpdml0eSB3aWxsIHN0aWxsIGZpbmQgaXQgb24gdGhlIGRpcnR5IGxpc3RzLCBhbmQgaW4gcGFydGljdWxhciwKLSAqIGNsZWFyX3BhZ2VfZGlydHlfZm9yX2lvKCkgd2lsbCBzdGlsbCBsb29rIGF0IHRoZSBkaXJ0eSBiaXRzIGluCi0gKiB0aGUgVk0uCi0gKgotICogRG9pbmcgdGhpcyBzaG91bGQgKm5vcm1hbGx5KiBvbmx5IGV2ZXIgYmUgZG9uZSB3aGVuIGEgcGFnZQotICogaXMgdHJ1bmNhdGVkLCBhbmQgaXMgbm90IGFjdHVhbGx5IG1hcHBlZCBhbnl3aGVyZSBhdCBhbGwuIEhvd2V2ZXIsCi0gKiBmcy9idWZmZXIuYyBkb2VzIHRoaXMgd2hlbiBpdCBub3RpY2VzIHRoYXQgc29tZWJvZHkgaGFzIGNsZWFuZWQKLSAqIG91dCBhbGwgdGhlIGJ1ZmZlcnMgb24gYSBwYWdlIHdpdGhvdXQgYWN0dWFsbHkgZG9pbmcgaXQgdGhyb3VnaAotICogdGhlIFZNLiBDYW4geW91IHNheSAiZXh0MyBpcyBob3JyaWJseSB1Z2x5Ij8gVG91Z2h0IHlvdSBjb3VsZC4KLSAqLwotdm9pZCBjYW5jZWxfZGlydHlfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgaW50IGFjY291bnRfc2l6ZSkKLXsKLQlpZiAoVGVzdENsZWFyUGFnZURpcnR5KHBhZ2UpKSB7Ci0JCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKLQkJaWYgKG1hcHBpbmcgJiYgbWFwcGluZ19jYXBfYWNjb3VudF9kaXJ0eShtYXBwaW5nKSkgewotCQkJZGVjX3pvbmVfcGFnZV9zdGF0ZShwYWdlLCBOUl9GSUxFX0RJUlRZKTsKLQkJCWRlY19iZGlfc3RhdChpbm9kZV90b19iZGkobWFwcGluZy0+aG9zdCksCi0JCQkJCUJESV9SRUNMQUlNQUJMRSk7Ci0JCQlpZiAoYWNjb3VudF9zaXplKQotCQkJCXRhc2tfaW9fYWNjb3VudF9jYW5jZWxsZWRfd3JpdGUoYWNjb3VudF9zaXplKTsKLQkJfQotCX0KLX0KLUVYUE9SVF9TWU1CT0woY2FuY2VsX2RpcnR5X3BhZ2UpOwotCi0vKgogICogSWYgdHJ1bmNhdGUgY2Fubm90IHJlbW92ZSB0aGUgZnMtcHJpdmF0ZSBtZXRhZGF0YSBmcm9tIHRoZSBwYWdlLCB0aGUgcGFnZQogICogYmVjb21lcyBvcnBoYW5lZC4gIEl0IHdpbGwgYmUgbGVmdCBvbiB0aGUgTFJVIGFuZCBtYXkgZXZlbiBiZSBtYXBwZWQgaW50bwogICogdXNlciBwYWdldGFibGVzIGlmIHdlJ3JlIHJhY2luZyB3aXRoIGZpbGVtYXBfZmF1bHQoKS4KQEAgLTE0MCw3ICsxMTEsMTMgQEAKIAlpZiAocGFnZV9oYXNfcHJpdmF0ZShwYWdlKSkKIAkJZG9faW52YWxpZGF0ZXBhZ2UocGFnZSwgMCwgUEFHRV9DQUNIRV9TSVpFKTsKIAotCWNhbmNlbF9kaXJ0eV9wYWdlKHBhZ2UsIFBBR0VfQ0FDSEVfU0laRSk7CisJLyoKKwkgKiBTb21lIGZpbGVzeXN0ZW1zIHNlZW0gdG8gcmUtZGlydHkgdGhlIHBhZ2UgZXZlbiBhZnRlcgorCSAqIHRoZSBWTSBoYXMgY2FuY2VsZWQgdGhlIGRpcnR5IGJpdCAoZWcgZXh0MyBqb3VybmFsaW5nKS4KKwkgKiBIZW5jZSBkaXJ0eSBhY2NvdW50aW5nIGNoZWNrIGlzIHBsYWNlZCBhZnRlciBpbnZhbGlkYXRpb24uCisJICovCisJaWYgKFRlc3RDbGVhclBhZ2VEaXJ0eShwYWdlKSkKKwkJYWNjb3VudF9wYWdlX2NsZWFuZWQocGFnZSwgbWFwcGluZyk7CiAKIAlDbGVhclBhZ2VNYXBwZWRUb0Rpc2socGFnZSk7CiAJZGVsZXRlX2Zyb21fcGFnZV9jYWNoZShwYWdlKTsKQEAgLTUxMyw3ICs0OTAsNyBAQAogCQkJICogb2YgaW50ZXJlc3QgYW5kIHRyeSB0byBzcGVlZCB1cCBpdHMgcmVjbGFpbS4KIAkJCSAqLwogCQkJaWYgKCFyZXQpCi0JCQkJZGVhY3RpdmF0ZV9wYWdlKHBhZ2UpOworCQkJCWRlYWN0aXZhdGVfZmlsZV9wYWdlKHBhZ2UpOwogCQkJY291bnQgKz0gcmV0OwogCQl9CiAJCXBhZ2V2ZWNfcmVtb3ZlX2V4Y2VwdGlvbmFscygmcHZlYyk7CmRpZmYgLS1naXQgYS9tbS91dGlsLmMgYi9tbS91dGlsLmMKaW5kZXggMzk4MWFlOS4uNjhmZjhhNSAxMDA2NDQKLS0tIGEvbW0vdXRpbC5jCisrKyBiL21tL3V0aWwuYwpAQCAtMzI1LDkgKzMyNSwzNyBAQAogfQogRVhQT1JUX1NZTUJPTChrdmZyZWUpOwogCitzdGF0aWMgaW5saW5lIHZvaWQgKl9fcGFnZV9ybWFwcGluZyhzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1hcHBpbmc7CisKKwltYXBwaW5nID0gKHVuc2lnbmVkIGxvbmcpcGFnZS0+bWFwcGluZzsKKwltYXBwaW5nICY9IH5QQUdFX01BUFBJTkdfRkxBR1M7CisKKwlyZXR1cm4gKHZvaWQgKiltYXBwaW5nOworfQorCisvKiBOZXV0cmFsIHBhZ2UtPm1hcHBpbmcgcG9pbnRlciB0byBhZGRyZXNzX3NwYWNlIG9yIGFub25fdm1hIG9yIG90aGVyICovCit2b2lkICpwYWdlX3JtYXBwaW5nKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXBhZ2UgPSBjb21wb3VuZF9oZWFkKHBhZ2UpOworCXJldHVybiBfX3BhZ2Vfcm1hcHBpbmcocGFnZSk7Cit9CisKK3N0cnVjdCBhbm9uX3ZtYSAqcGFnZV9hbm9uX3ZtYShzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1hcHBpbmc7CisKKwlwYWdlID0gY29tcG91bmRfaGVhZChwYWdlKTsKKwltYXBwaW5nID0gKHVuc2lnbmVkIGxvbmcpcGFnZS0+bWFwcGluZzsKKwlpZiAoKG1hcHBpbmcgJiBQQUdFX01BUFBJTkdfRkxBR1MpICE9IFBBR0VfTUFQUElOR19BTk9OKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gX19wYWdlX3JtYXBwaW5nKHBhZ2UpOworfQorCiBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqcGFnZV9tYXBwaW5nKHN0cnVjdCBwYWdlICpwYWdlKQogewotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZS0+bWFwcGluZzsKKwl1bnNpZ25lZCBsb25nIG1hcHBpbmc7CiAKIAkvKiBUaGlzIGhhcHBlbnMgaWYgc29tZW9uZSBjYWxscyBmbHVzaF9kY2FjaGVfcGFnZSBvbiBzbGFiIHBhZ2UgKi8KIAlpZiAodW5saWtlbHkoUGFnZVNsYWIocGFnZSkpKQpAQCAtMzM3LDEwICszNjUsMTMgQEAKIAkJc3dwX2VudHJ5X3QgZW50cnk7CiAKIAkJZW50cnkudmFsID0gcGFnZV9wcml2YXRlKHBhZ2UpOwotCQltYXBwaW5nID0gc3dhcF9hZGRyZXNzX3NwYWNlKGVudHJ5KTsKLQl9IGVsc2UgaWYgKCh1bnNpZ25lZCBsb25nKW1hcHBpbmcgJiBQQUdFX01BUFBJTkdfQU5PTikKLQkJbWFwcGluZyA9IE5VTEw7Ci0JcmV0dXJuIG1hcHBpbmc7CisJCXJldHVybiBzd2FwX2FkZHJlc3Nfc3BhY2UoZW50cnkpOworCX0KKworCW1hcHBpbmcgPSAodW5zaWduZWQgbG9uZylwYWdlLT5tYXBwaW5nOworCWlmIChtYXBwaW5nICYgUEFHRV9NQVBQSU5HX0ZMQUdTKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcGFnZS0+bWFwcGluZzsKIH0KIAogaW50IG92ZXJjb21taXRfcmF0aW9faGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLApkaWZmIC0tZ2l0IGEvbW0vdm1hbGxvYy5jIGIvbW0vdm1hbGxvYy5jCmluZGV4IDQ5YWJjY2YuLjJmYWFhMjkgMTAwNjQ0Ci0tLSBhL21tL3ZtYWxsb2MuYworKysgYi9tbS92bWFsbG9jLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2xsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgpAQCAtNzQsNiArNzUsOCBAQAogCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKIAlkbyB7CiAJCW5leHQgPSBwbWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKKwkJaWYgKHBtZF9jbGVhcl9odWdlKHBtZCkpCisJCQljb250aW51ZTsKIAkJaWYgKHBtZF9ub25lX29yX2NsZWFyX2JhZChwbWQpKQogCQkJY29udGludWU7CiAJCXZ1bm1hcF9wdGVfcmFuZ2UocG1kLCBhZGRyLCBuZXh0KTsKQEAgLTg4LDYgKzkxLDggQEAKIAlwdWQgPSBwdWRfb2Zmc2V0KHBnZCwgYWRkcik7CiAJZG8gewogCQluZXh0ID0gcHVkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWlmIChwdWRfY2xlYXJfaHVnZShwdWQpKQorCQkJY29udGludWU7CiAJCWlmIChwdWRfbm9uZV9vcl9jbGVhcl9iYWQocHVkKSkKIAkJCWNvbnRpbnVlOwogCQl2dW5tYXBfcG1kX3JhbmdlKHB1ZCwgYWRkciwgbmV4dCk7CkBAIC03NjAsNyArNzY1LDcgQEAKIAlzcGlubG9ja190IGxvY2s7CiAJc3RydWN0IHZtYXBfYXJlYSAqdmE7CiAJdW5zaWduZWQgbG9uZyBmcmVlLCBkaXJ0eTsKLQlERUNMQVJFX0JJVE1BUChkaXJ0eV9tYXAsIFZNQVBfQkJNQVBfQklUUyk7CisJdW5zaWduZWQgbG9uZyBkaXJ0eV9taW4sIGRpcnR5X21heDsgLyo8IGRpcnR5IHJhbmdlICovCiAJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2xpc3Q7CiAJc3RydWN0IHJjdV9oZWFkIHJjdV9oZWFkOwogCXN0cnVjdCBsaXN0X2hlYWQgcHVyZ2U7CkBAIC03OTEsMTMgKzc5NiwzMSBAQAogCXJldHVybiBhZGRyOwogfQogCi1zdGF0aWMgc3RydWN0IHZtYXBfYmxvY2sgKm5ld192bWFwX2Jsb2NrKGdmcF90IGdmcF9tYXNrKQorc3RhdGljIHZvaWQgKnZtYXBfYmxvY2tfdmFkZHIodW5zaWduZWQgbG9uZyB2YV9zdGFydCwgdW5zaWduZWQgbG9uZyBwYWdlc19vZmYpCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJYWRkciA9IHZhX3N0YXJ0ICsgKHBhZ2VzX29mZiA8PCBQQUdFX1NISUZUKTsKKwlCVUdfT04oYWRkcl90b192Yl9pZHgoYWRkcikgIT0gYWRkcl90b192Yl9pZHgodmFfc3RhcnQpKTsKKwlyZXR1cm4gKHZvaWQgKilhZGRyOworfQorCisvKioKKyAqIG5ld192bWFwX2Jsb2NrIC0gYWxsb2NhdGVzIG5ldyB2bWFwX2Jsb2NrIGFuZCBvY2N1cGllcyAyXm9yZGVyIHBhZ2VzIGluIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgYmxvY2suIE9mIGNvdXJzZSBwYWdlcyBudW1iZXIgY2FuJ3QgZXhjZWVkIFZNQVBfQkJNQVBfQklUUworICogQG9yZGVyOiAgICBob3cgbWFueSAyXm9yZGVyIHBhZ2VzIHNob3VsZCBiZSBvY2N1cGllZCBpbiBuZXdseSBhbGxvY2F0ZWQgYmxvY2sKKyAqIEBnZnBfbWFzazogZmxhZ3MgZm9yIHRoZSBwYWdlIGxldmVsIGFsbG9jYXRvcgorICoKKyAqIFJldHVybnM6IHZpcnR1YWwgYWRkcmVzcyBpbiBhIG5ld2x5IGFsbG9jYXRlZCBibG9jayBvciBFUlJfUFRSKC1lcnJubykKKyAqLworc3RhdGljIHZvaWQgKm5ld192bWFwX2Jsb2NrKHVuc2lnbmVkIGludCBvcmRlciwgZ2ZwX3QgZ2ZwX21hc2spCiB7CiAJc3RydWN0IHZtYXBfYmxvY2tfcXVldWUgKnZicTsKIAlzdHJ1Y3Qgdm1hcF9ibG9jayAqdmI7CiAJc3RydWN0IHZtYXBfYXJlYSAqdmE7CiAJdW5zaWduZWQgbG9uZyB2Yl9pZHg7CiAJaW50IG5vZGUsIGVycjsKKwl2b2lkICp2YWRkcjsKIAogCW5vZGUgPSBudW1hX25vZGVfaWQoKTsKIApAQCAtODIxLDExICs4NDQsMTUgQEAKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAl9CiAKKwl2YWRkciA9IHZtYXBfYmxvY2tfdmFkZHIodmEtPnZhX3N0YXJ0LCAwKTsKIAlzcGluX2xvY2tfaW5pdCgmdmItPmxvY2spOwogCXZiLT52YSA9IHZhOwotCXZiLT5mcmVlID0gVk1BUF9CQk1BUF9CSVRTOworCS8qIEF0IGxlYXN0IHNvbWV0aGluZyBzaG91bGQgYmUgbGVmdCBmcmVlICovCisJQlVHX09OKFZNQVBfQkJNQVBfQklUUyA8PSAoMVVMIDw8IG9yZGVyKSk7CisJdmItPmZyZWUgPSBWTUFQX0JCTUFQX0JJVFMgLSAoMVVMIDw8IG9yZGVyKTsKIAl2Yi0+ZGlydHkgPSAwOwotCWJpdG1hcF96ZXJvKHZiLT5kaXJ0eV9tYXAsIFZNQVBfQkJNQVBfQklUUyk7CisJdmItPmRpcnR5X21pbiA9IFZNQVBfQkJNQVBfQklUUzsKKwl2Yi0+ZGlydHlfbWF4ID0gMDsKIAlJTklUX0xJU1RfSEVBRCgmdmItPmZyZWVfbGlzdCk7CiAKIAl2Yl9pZHggPSBhZGRyX3RvX3ZiX2lkeCh2YS0+dmFfc3RhcnQpOwpAQCAtODM3LDExICs4NjQsMTEgQEAKIAogCXZicSA9ICZnZXRfY3B1X3Zhcih2bWFwX2Jsb2NrX3F1ZXVlKTsKIAlzcGluX2xvY2soJnZicS0+bG9jayk7Ci0JbGlzdF9hZGRfcmN1KCZ2Yi0+ZnJlZV9saXN0LCAmdmJxLT5mcmVlKTsKKwlsaXN0X2FkZF90YWlsX3JjdSgmdmItPmZyZWVfbGlzdCwgJnZicS0+ZnJlZSk7CiAJc3Bpbl91bmxvY2soJnZicS0+bG9jayk7CiAJcHV0X2NwdV92YXIodm1hcF9ibG9ja19xdWV1ZSk7CiAKLQlyZXR1cm4gdmI7CisJcmV0dXJuIHZhZGRyOwogfQogCiBzdGF0aWMgdm9pZCBmcmVlX3ZtYXBfYmxvY2soc3RydWN0IHZtYXBfYmxvY2sgKnZiKQpAQCAtODc2LDcgKzkwMyw4IEBACiAJCWlmICh2Yi0+ZnJlZSArIHZiLT5kaXJ0eSA9PSBWTUFQX0JCTUFQX0JJVFMgJiYgdmItPmRpcnR5ICE9IFZNQVBfQkJNQVBfQklUUykgewogCQkJdmItPmZyZWUgPSAwOyAvKiBwcmV2ZW50IGZ1cnRoZXIgYWxsb2NzIGFmdGVyIHJlbGVhc2luZyBsb2NrICovCiAJCQl2Yi0+ZGlydHkgPSBWTUFQX0JCTUFQX0JJVFM7IC8qIHByZXZlbnQgcHVyZ2luZyBpdCBhZ2FpbiAqLwotCQkJYml0bWFwX2ZpbGwodmItPmRpcnR5X21hcCwgVk1BUF9CQk1BUF9CSVRTKTsKKwkJCXZiLT5kaXJ0eV9taW4gPSAwOworCQkJdmItPmRpcnR5X21heCA9IFZNQVBfQkJNQVBfQklUUzsKIAkJCXNwaW5fbG9jaygmdmJxLT5sb2NrKTsKIAkJCWxpc3RfZGVsX3JjdSgmdmItPmZyZWVfbGlzdCk7CiAJCQlzcGluX3VubG9jaygmdmJxLT5sb2NrKTsKQEAgLTkwNSw3ICs5MzMsNyBAQAogewogCXN0cnVjdCB2bWFwX2Jsb2NrX3F1ZXVlICp2YnE7CiAJc3RydWN0IHZtYXBfYmxvY2sgKnZiOwotCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7CisJdm9pZCAqdmFkZHIgPSBOVUxMOwogCXVuc2lnbmVkIGludCBvcmRlcjsKIAogCUJVR19PTihzaXplICYgflBBR0VfTUFTSyk7CkBAIC05MjAsNDMgKzk0OCwzOCBAQAogCX0KIAlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKIAotYWdhaW46CiAJcmN1X3JlYWRfbG9jaygpOwogCXZicSA9ICZnZXRfY3B1X3Zhcih2bWFwX2Jsb2NrX3F1ZXVlKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh2YiwgJnZicS0+ZnJlZSwgZnJlZV9saXN0KSB7Ci0JCWludCBpOworCQl1bnNpZ25lZCBsb25nIHBhZ2VzX29mZjsKIAogCQlzcGluX2xvY2soJnZiLT5sb2NrKTsKLQkJaWYgKHZiLT5mcmVlIDwgMVVMIDw8IG9yZGVyKQotCQkJZ290byBuZXh0OworCQlpZiAodmItPmZyZWUgPCAoMVVMIDw8IG9yZGVyKSkgeworCQkJc3Bpbl91bmxvY2soJnZiLT5sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CiAKLQkJaSA9IFZNQVBfQkJNQVBfQklUUyAtIHZiLT5mcmVlOwotCQlhZGRyID0gdmItPnZhLT52YV9zdGFydCArIChpIDw8IFBBR0VfU0hJRlQpOwotCQlCVUdfT04oYWRkcl90b192Yl9pZHgoYWRkcikgIT0KLQkJCQlhZGRyX3RvX3ZiX2lkeCh2Yi0+dmEtPnZhX3N0YXJ0KSk7CisJCXBhZ2VzX29mZiA9IFZNQVBfQkJNQVBfQklUUyAtIHZiLT5mcmVlOworCQl2YWRkciA9IHZtYXBfYmxvY2tfdmFkZHIodmItPnZhLT52YV9zdGFydCwgcGFnZXNfb2ZmKTsKIAkJdmItPmZyZWUgLT0gMVVMIDw8IG9yZGVyOwogCQlpZiAodmItPmZyZWUgPT0gMCkgewogCQkJc3Bpbl9sb2NrKCZ2YnEtPmxvY2spOwogCQkJbGlzdF9kZWxfcmN1KCZ2Yi0+ZnJlZV9saXN0KTsKIAkJCXNwaW5fdW5sb2NrKCZ2YnEtPmxvY2spOwogCQl9CisKIAkJc3Bpbl91bmxvY2soJnZiLT5sb2NrKTsKIAkJYnJlYWs7Ci1uZXh0OgotCQlzcGluX3VubG9jaygmdmItPmxvY2spOwogCX0KIAogCXB1dF9jcHVfdmFyKHZtYXBfYmxvY2tfcXVldWUpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JaWYgKCFhZGRyKSB7Ci0JCXZiID0gbmV3X3ZtYXBfYmxvY2soZ2ZwX21hc2spOwotCQlpZiAoSVNfRVJSKHZiKSkKLQkJCXJldHVybiB2YjsKLQkJZ290byBhZ2FpbjsKLQl9CisJLyogQWxsb2NhdGUgbmV3IGJsb2NrIGlmIG5vdGhpbmcgd2FzIGZvdW5kICovCisJaWYgKCF2YWRkcikKKwkJdmFkZHIgPSBuZXdfdm1hcF9ibG9jayhvcmRlciwgZ2ZwX21hc2spOwogCi0JcmV0dXJuICh2b2lkICopYWRkcjsKKwlyZXR1cm4gdmFkZHI7CiB9CiAKIHN0YXRpYyB2b2lkIHZiX2ZyZWUoY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQpAQCAtOTc0LDYgKzk5Nyw3IEBACiAJb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CiAKIAlvZmZzZXQgPSAodW5zaWduZWQgbG9uZylhZGRyICYgKFZNQVBfQkxPQ0tfU0laRSAtIDEpOworCW9mZnNldCA+Pj0gUEFHRV9TSElGVDsKIAogCXZiX2lkeCA9IGFkZHJfdG9fdmJfaWR4KCh1bnNpZ25lZCBsb25nKWFkZHIpOwogCXJjdV9yZWFkX2xvY2soKTsKQEAgLTk4NCw3ICsxMDA4LDEwIEBACiAJdnVubWFwX3BhZ2VfcmFuZ2UoKHVuc2lnbmVkIGxvbmcpYWRkciwgKHVuc2lnbmVkIGxvbmcpYWRkciArIHNpemUpOwogCiAJc3Bpbl9sb2NrKCZ2Yi0+bG9jayk7Ci0JQlVHX09OKGJpdG1hcF9hbGxvY2F0ZV9yZWdpb24odmItPmRpcnR5X21hcCwgb2Zmc2V0ID4+IFBBR0VfU0hJRlQsIG9yZGVyKSk7CisKKwkvKiBFeHBhbmQgZGlydHkgcmFuZ2UgKi8KKwl2Yi0+ZGlydHlfbWluID0gbWluKHZiLT5kaXJ0eV9taW4sIG9mZnNldCk7CisJdmItPmRpcnR5X21heCA9IG1heCh2Yi0+ZGlydHlfbWF4LCBvZmZzZXQgKyAoMVVMIDw8IG9yZGVyKSk7CiAKIAl2Yi0+ZGlydHkgKz0gMVVMIDw8IG9yZGVyOwogCWlmICh2Yi0+ZGlydHkgPT0gVk1BUF9CQk1BUF9CSVRTKSB7CkBAIC0xMDIzLDI1ICsxMDUwLDE4IEBACiAKIAkJcmN1X3JlYWRfbG9jaygpOwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh2YiwgJnZicS0+ZnJlZSwgZnJlZV9saXN0KSB7Ci0JCQlpbnQgaSwgajsKLQogCQkJc3Bpbl9sb2NrKCZ2Yi0+bG9jayk7Ci0JCQlpID0gZmluZF9maXJzdF9iaXQodmItPmRpcnR5X21hcCwgVk1BUF9CQk1BUF9CSVRTKTsKLQkJCWlmIChpIDwgVk1BUF9CQk1BUF9CSVRTKSB7CisJCQlpZiAodmItPmRpcnR5KSB7CisJCQkJdW5zaWduZWQgbG9uZyB2YV9zdGFydCA9IHZiLT52YS0+dmFfc3RhcnQ7CiAJCQkJdW5zaWduZWQgbG9uZyBzLCBlOwogCi0JCQkJaiA9IGZpbmRfbGFzdF9iaXQodmItPmRpcnR5X21hcCwKLQkJCQkJCQlWTUFQX0JCTUFQX0JJVFMpOwotCQkJCWogPSBqICsgMTsgLyogbmVlZCBleGNsdXNpdmUgaW5kZXggKi8KKwkJCQlzID0gdmFfc3RhcnQgKyAodmItPmRpcnR5X21pbiA8PCBQQUdFX1NISUZUKTsKKwkJCQllID0gdmFfc3RhcnQgKyAodmItPmRpcnR5X21heCA8PCBQQUdFX1NISUZUKTsKIAotCQkJCXMgPSB2Yi0+dmEtPnZhX3N0YXJ0ICsgKGkgPDwgUEFHRV9TSElGVCk7Ci0JCQkJZSA9IHZiLT52YS0+dmFfc3RhcnQgKyAoaiA8PCBQQUdFX1NISUZUKTsKKwkJCQlzdGFydCA9IG1pbihzLCBzdGFydCk7CisJCQkJZW5kICAgPSBtYXgoZSwgZW5kKTsKKwogCQkJCWZsdXNoID0gMTsKLQotCQkJCWlmIChzIDwgc3RhcnQpCi0JCQkJCXN0YXJ0ID0gczsKLQkJCQlpZiAoZSA+IGVuZCkKLQkJCQkJZW5kID0gZTsKIAkJCX0KIAkJCXNwaW5fdW5sb2NrKCZ2Yi0+bG9jayk7CiAJCX0KQEAgLTEzMTQsNyArMTMzNCw4IEBACiAKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCWlmIChmbGFncyAmIFZNX0lPUkVNQVApCi0JCWFsaWduID0gMXVsIDw8IGNsYW1wKGZscyhzaXplKSwgUEFHRV9TSElGVCwgSU9SRU1BUF9NQVhfT1JERVIpOworCQlhbGlnbiA9IDF1bCA8PCBjbGFtcF90KGludCwgZmxzX2xvbmcoc2l6ZSksCisJCQkJICAgICAgIFBBR0VfU0hJRlQsIElPUkVNQVBfTUFYX09SREVSKTsKIAogCXNpemUgPSBQQUdFX0FMSUdOKHNpemUpOwogCWlmICh1bmxpa2VseSghc2l6ZSkpCmRpZmYgLS1naXQgYS9tbS96c21hbGxvYy5jIGIvbW0venNtYWxsb2MuYwppbmRleCAwZGVjMWZhLi4wOGJkN2EzIDEwMDY0NAotLS0gYS9tbS96c21hbGxvYy5jCisrKyBiL21tL3pzbWFsbG9jLmMKQEAgLTEyLDM1ICsxMiw2IEBACiAgKi8KIAogLyoKLSAqIFRoaXMgYWxsb2NhdG9yIGlzIGRlc2lnbmVkIGZvciB1c2Ugd2l0aCB6cmFtLiBUaHVzLCB0aGUgYWxsb2NhdG9yIGlzCi0gKiBzdXBwb3NlZCB0byB3b3JrIHdlbGwgdW5kZXIgbG93IG1lbW9yeSBjb25kaXRpb25zLiBJbiBwYXJ0aWN1bGFyLCBpdAotICogbmV2ZXIgYXR0ZW1wdHMgaGlnaGVyIG9yZGVyIHBhZ2UgYWxsb2NhdGlvbiB3aGljaCBpcyB2ZXJ5IGxpa2VseSB0bwotICogZmFpbCB1bmRlciBtZW1vcnkgcHJlc3N1cmUuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB3ZSBqdXN0IHVzZSBzaW5nbGUKLSAqICgwLW9yZGVyKSBwYWdlcywgaXQgd291bGQgc3VmZmVyIGZyb20gdmVyeSBoaWdoIGZyYWdtZW50YXRpb24gLS0KLSAqIGFueSBvYmplY3Qgb2Ygc2l6ZSBQQUdFX1NJWkUvMiBvciBsYXJnZXIgd291bGQgb2NjdXB5IGFuIGVudGlyZSBwYWdlLgotICogVGhpcyB3YXMgb25lIG9mIHRoZSBtYWpvciBpc3N1ZXMgd2l0aCBpdHMgcHJlZGVjZXNzb3IgKHh2bWFsbG9jKS4KLSAqCi0gKiBUbyBvdmVyY29tZSB0aGVzZSBpc3N1ZXMsIHpzbWFsbG9jIGFsbG9jYXRlcyBhIGJ1bmNoIG9mIDAtb3JkZXIgcGFnZXMKLSAqIGFuZCBsaW5rcyB0aGVtIHRvZ2V0aGVyIHVzaW5nIHZhcmlvdXMgJ3N0cnVjdCBwYWdlJyBmaWVsZHMuIFRoZXNlIGxpbmtlZAotICogcGFnZXMgYWN0IGFzIGEgc2luZ2xlIGhpZ2hlci1vcmRlciBwYWdlIGkuZS4gYW4gb2JqZWN0IGNhbiBzcGFuIDAtb3JkZXIKLSAqIHBhZ2UgYm91bmRhcmllcy4gVGhlIGNvZGUgcmVmZXJzIHRvIHRoZXNlIGxpbmtlZCBwYWdlcyBhcyBhIHNpbmdsZSBlbnRpdHkKLSAqIGNhbGxlZCB6c3BhZ2UuCi0gKgotICogRm9yIHNpbXBsaWNpdHksIHpzbWFsbG9jIGNhbiBvbmx5IGFsbG9jYXRlIG9iamVjdHMgb2Ygc2l6ZSB1cCB0byBQQUdFX1NJWkUKLSAqIHNpbmNlIHRoaXMgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgb2YgYWxsIGl0cyBjdXJyZW50IHVzZXJzIChpbiB0aGUKLSAqIHdvcnN0IGNhc2UsIHBhZ2UgaXMgaW5jb21wcmVzc2libGUgYW5kIGlzIHRodXMgc3RvcmVkICJhcy1pcyIgaS5lLiBpbgotICogdW5jb21wcmVzc2VkIGZvcm0pLiBGb3IgYWxsb2NhdGlvbiByZXF1ZXN0cyBsYXJnZXIgdGhhbiB0aGlzIHNpemUsIGZhaWx1cmUKLSAqIGlzIHJldHVybmVkIChzZWUgenNfbWFsbG9jKS4KLSAqCi0gKiBBZGRpdGlvbmFsbHksIHpzX21hbGxvYygpIGRvZXMgbm90IHJldHVybiBhIGRlcmVmZXJlbmNlYWJsZSBwb2ludGVyLgotICogSW5zdGVhZCwgaXQgcmV0dXJucyBhbiBvcGFxdWUgaGFuZGxlICh1bnNpZ25lZCBsb25nKSB3aGljaCBlbmNvZGVzIGFjdHVhbAotICogbG9jYXRpb24gb2YgdGhlIGFsbG9jYXRlZCBvYmplY3QuIFRoZSByZWFzb24gZm9yIHRoaXMgaW5kaXJlY3Rpb24gaXMgdGhhdAotICogenNtYWxsb2MgZG9lcyBub3Qga2VlcCB6c3BhZ2VzIHBlcm1hbmVudGx5IG1hcHBlZCBzaW5jZSB0aGF0IHdvdWxkIGNhdXNlCi0gKiBpc3N1ZXMgb24gMzItYml0IHN5c3RlbXMgd2hlcmUgdGhlIFZBIHJlZ2lvbiBmb3Iga2VybmVsIHNwYWNlIG1hcHBpbmdzCi0gKiBpcyB2ZXJ5IHNtYWxsLiBTbywgYmVmb3JlIHVzaW5nIHRoZSBhbGxvY2F0aW5nIG1lbW9yeSwgdGhlIG9iamVjdCBoYXMgdG8KLSAqIGJlIG1hcHBlZCB1c2luZyB6c19tYXBfb2JqZWN0KCkgdG8gZ2V0IGEgdXNhYmxlIHBvaW50ZXIgYW5kIHN1YnNlcXVlbnRseQotICogdW5tYXBwZWQgdXNpbmcgenNfdW5tYXBfb2JqZWN0KCkuCi0gKgogICogRm9sbG93aW5nIGlzIGhvdyB3ZSB1c2UgdmFyaW91cyBmaWVsZHMgYW5kIGZsYWdzIG9mIHVuZGVybHlpbmcKICAqIHN0cnVjdCBwYWdlKHMpIHRvIGZvcm0gYSB6c3BhZ2UuCiAgKgpAQCAtNTcsNiArMjgsOCBAQAogICoKICAqCXBhZ2UtPnByaXZhdGUgKHVuaW9uIHdpdGggcGFnZS0+Zmlyc3RfcGFnZSk6IHJlZmVycyB0byB0aGUKICAqCQljb21wb25lbnQgcGFnZSBhZnRlciB0aGUgZmlyc3QgcGFnZQorICoJCUlmIHRoZSBwYWdlIGlzIGZpcnN0X3BhZ2UgZm9yIGh1Z2Ugb2JqZWN0LCBpdCBzdG9yZXMgaGFuZGxlLgorICoJCUxvb2sgYXQgc2l6ZV9jbGFzcy0+aHVnZS4KICAqCXBhZ2UtPmZyZWVsaXN0OiBwb2ludHMgdG8gdGhlIGZpcnN0IGZyZWUgb2JqZWN0IGluIHpzcGFnZS4KICAqCQlGcmVlIG9iamVjdHMgYXJlIGxpbmtlZCB0b2dldGhlciB1c2luZyBpbi1wbGFjZQogICoJCW1ldGFkYXRhLgpAQCAtNzgsNiArNTEsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KQEAgLTExMCw2ICs4NCw4IEBACiAjZGVmaW5lIFpTX01BWF9aU1BBR0VfT1JERVIgMgogI2RlZmluZSBaU19NQVhfUEFHRVNfUEVSX1pTUEFHRSAoX0FDKDEsIFVMKSA8PCBaU19NQVhfWlNQQUdFX09SREVSKQogCisjZGVmaW5lIFpTX0hBTkRMRV9TSVpFIChzaXplb2YodW5zaWduZWQgbG9uZykpCisKIC8qCiAgKiBPYmplY3QgbG9jYXRpb24gKDxQRk4+LCA8b2JqX2lkeD4pIGlzIGVuY29kZWQgYXMKICAqIGFzIHNpbmdsZSAodW5zaWduZWQgbG9uZykgaGFuZGxlIHZhbHVlLgpAQCAtMTMzLDEzICsxMDksMzMgQEAKICNlbmRpZgogI2VuZGlmCiAjZGVmaW5lIF9QRk5fQklUUwkJKE1BWF9QSFlTTUVNX0JJVFMgLSBQQUdFX1NISUZUKQotI2RlZmluZSBPQkpfSU5ERVhfQklUUwkoQklUU19QRVJfTE9ORyAtIF9QRk5fQklUUykKKworLyoKKyAqIE1lbW9yeSBmb3IgYWxsb2NhdGluZyBmb3IgaGFuZGxlIGtlZXBzIG9iamVjdCBwb3NpdGlvbiBieQorICogZW5jb2RpbmcgPHBhZ2UsIG9ial9pZHg+IGFuZCB0aGUgZW5jb2RlZCB2YWx1ZSBoYXMgYSByb29tCisgKiBpbiBsZWFzdCBiaXQoaWUsIGxvb2sgYXQgb2JqX3RvX2xvY2F0aW9uKS4KKyAqIFdlIHVzZSB0aGUgYml0IHRvIHN5bmNocm9uaXplIGJldHdlZW4gb2JqZWN0IGFjY2VzcyBieQorICogdXNlciBhbmQgbWlncmF0aW9uLgorICovCisjZGVmaW5lIEhBTkRMRV9QSU5fQklUCTAKKworLyoKKyAqIEhlYWQgaW4gYWxsb2NhdGVkIG9iamVjdCBzaG91bGQgaGF2ZSBPQkpfQUxMT0NBVEVEX1RBRworICogdG8gaWRlbnRpZnkgdGhlIG9iamVjdCB3YXMgYWxsb2NhdGVkIG9yIG5vdC4KKyAqIEl0J3Mgb2theSB0byBhZGQgdGhlIHN0YXR1cyBiaXQgaW4gdGhlIGxlYXN0IGJpdCBiZWNhdXNlCisgKiBoZWFkZXIga2VlcHMgaGFuZGxlIHdoaWNoIGlzIDRieXRlLWFsaWduZWQgYWRkcmVzcyBzbyB3ZQorICogaGF2ZSByb29tIGZvciB0d28gYml0IGF0IGxlYXN0LgorICovCisjZGVmaW5lIE9CSl9BTExPQ0FURURfVEFHIDEKKyNkZWZpbmUgT0JKX1RBR19CSVRTIDEKKyNkZWZpbmUgT0JKX0lOREVYX0JJVFMJKEJJVFNfUEVSX0xPTkcgLSBfUEZOX0JJVFMgLSBPQkpfVEFHX0JJVFMpCiAjZGVmaW5lIE9CSl9JTkRFWF9NQVNLCSgoX0FDKDEsIFVMKSA8PCBPQkpfSU5ERVhfQklUUykgLSAxKQogCiAjZGVmaW5lIE1BWChhLCBiKSAoKGEpID49IChiKSA/IChhKSA6IChiKSkKIC8qIFpTX01JTl9BTExPQ19TSVpFIG11c3QgYmUgbXVsdGlwbGUgb2YgWlNfQUxJR04gKi8KICNkZWZpbmUgWlNfTUlOX0FMTE9DX1NJWkUgXAogCU1BWCgzMiwgKFpTX01BWF9QQUdFU19QRVJfWlNQQUdFIDw8IFBBR0VfU0hJRlQgPj4gT0JKX0lOREVYX0JJVFMpKQorLyogZWFjaCBjaHVuayBpbmNsdWRlcyBleHRyYSBzcGFjZSB0byBrZWVwIGhhbmRsZSAqLwogI2RlZmluZSBaU19NQVhfQUxMT0NfU0laRQlQQUdFX1NJWkUKIAogLyoKQEAgLTE3Miw2ICsxNjgsOCBAQAogZW51bSB6c19zdGF0X3R5cGUgewogCU9CSl9BTExPQ0FURUQsCiAJT0JKX1VTRUQsCisJQ0xBU1NfQUxNT1NUX0ZVTEwsCisJQ0xBU1NfQUxNT1NUX0VNUFRZLAogCU5SX1pTX1NUQVRfVFlQRSwKIH07CiAKQEAgLTIxNiw2ICsyMTQsOCBAQAogCiAJLyogTnVtYmVyIG9mIFBBR0VfU0laRSBzaXplZCBwYWdlcyB0byBjb21iaW5lIHRvIGZvcm0gYSAnenNwYWdlJyAqLwogCWludCBwYWdlc19wZXJfenNwYWdlOworCS8qIGh1Z2Ugb2JqZWN0OiBwYWdlc19wZXJfenNwYWdlID09IDEgJiYgbWF4b2JqX3Blcl96c3BhZ2UgPT0gMSAqLworCWJvb2wgaHVnZTsKIAogI2lmZGVmIENPTkZJR19aU01BTExPQ19TVEFUCiAJc3RydWN0IHpzX3NpemVfc3RhdCBzdGF0czsKQEAgLTIzMywxNCArMjMzLDI0IEBACiAgKiBUaGlzIG11c3QgYmUgcG93ZXIgb2YgMiBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIFpTX0FMSUdOCiAgKi8KIHN0cnVjdCBsaW5rX2ZyZWUgewotCS8qIEhhbmRsZSBvZiBuZXh0IGZyZWUgY2h1bmsgKGVuY29kZXMgPFBGTiwgb2JqX2lkeD4pICovCi0Jdm9pZCAqbmV4dDsKKwl1bmlvbiB7CisJCS8qCisJCSAqIFBvc2l0aW9uIG9mIG5leHQgZnJlZSBjaHVuayAoZW5jb2RlcyA8UEZOLCBvYmpfaWR4PikKKwkJICogSXQncyB2YWxpZCBmb3Igbm9uLWFsbG9jYXRlZCBvYmplY3QKKwkJICovCisJCXZvaWQgKm5leHQ7CisJCS8qCisJCSAqIEhhbmRsZSBvZiBhbGxvY2F0ZWQgb2JqZWN0LgorCQkgKi8KKwkJdW5zaWduZWQgbG9uZyBoYW5kbGU7CisJfTsKIH07CiAKIHN0cnVjdCB6c19wb29sIHsKIAljaGFyICpuYW1lOwogCiAJc3RydWN0IHNpemVfY2xhc3MgKipzaXplX2NsYXNzOworCXN0cnVjdCBrbWVtX2NhY2hlICpoYW5kbGVfY2FjaGVwOwogCiAJZ2ZwX3QgZmxhZ3M7CS8qIGFsbG9jYXRpb24gZmxhZ3MgdXNlZCB3aGVuIGdyb3dpbmcgcG9vbCAqLwogCWF0b21pY19sb25nX3QgcGFnZXNfYWxsb2NhdGVkOwpAQCAtMjY3LDggKzI3NywzNyBAQAogI2VuZGlmCiAJY2hhciAqdm1fYWRkcjsgLyogYWRkcmVzcyBvZiBrbWFwX2F0b21pYygpJ2VkIHBhZ2VzICovCiAJZW51bSB6c19tYXBtb2RlIHZtX21tOyAvKiBtYXBwaW5nIG1vZGUgKi8KKwlib29sIGh1Z2U7CiB9OwogCitzdGF0aWMgaW50IGNyZWF0ZV9oYW5kbGVfY2FjaGUoc3RydWN0IHpzX3Bvb2wgKnBvb2wpCit7CisJcG9vbC0+aGFuZGxlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJ6c19oYW5kbGUiLCBaU19IQU5ETEVfU0laRSwKKwkJCQkJMCwgMCwgTlVMTCk7CisJcmV0dXJuIHBvb2wtPmhhbmRsZV9jYWNoZXAgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9oYW5kbGVfY2FjaGUoc3RydWN0IHpzX3Bvb2wgKnBvb2wpCit7CisJa21lbV9jYWNoZV9kZXN0cm95KHBvb2wtPmhhbmRsZV9jYWNoZXApOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBhbGxvY19oYW5kbGUoc3RydWN0IHpzX3Bvb2wgKnBvb2wpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWttZW1fY2FjaGVfYWxsb2MocG9vbC0+aGFuZGxlX2NhY2hlcCwKKwkJcG9vbC0+ZmxhZ3MgJiB+X19HRlBfSElHSE1FTSk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfaGFuZGxlKHN0cnVjdCB6c19wb29sICpwb29sLCB1bnNpZ25lZCBsb25nIGhhbmRsZSkKK3sKKwlrbWVtX2NhY2hlX2ZyZWUocG9vbC0+aGFuZGxlX2NhY2hlcCwgKHZvaWQgKiloYW5kbGUpOworfQorCitzdGF0aWMgdm9pZCByZWNvcmRfb2JqKHVuc2lnbmVkIGxvbmcgaGFuZGxlLCB1bnNpZ25lZCBsb25nIG9iaikKK3sKKwkqKHVuc2lnbmVkIGxvbmcgKiloYW5kbGUgPSBvYmo7Cit9CisKIC8qIHpwb29sIGRyaXZlciAqLwogCiAjaWZkZWYgQ09ORklHX1pQT09MCkBAIC0zNDYsNiArMzg1LDExIEBACiBNT0RVTEVfQUxJQVMoInpwb29sLXpzbWFsbG9jIik7CiAjZW5kaWYgLyogQ09ORklHX1pQT09MICovCiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X21heG9ial9wZXJfenNwYWdlKGludCBzaXplLCBpbnQgcGFnZXNfcGVyX3pzcGFnZSkKK3sKKwlyZXR1cm4gcGFnZXNfcGVyX3pzcGFnZSAqIFBBR0VfU0laRSAvIHNpemU7Cit9CisKIC8qIHBlci1jcHUgVk0gbWFwcGluZyBhcmVhcyBmb3IgenNwYWdlIGFjY2Vzc2VzIHRoYXQgY3Jvc3MgcGFnZSBib3VuZGFyaWVzICovCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IG1hcHBpbmdfYXJlYSwgenNfbWFwX2FyZWEpOwogCkBAIC0zOTYsOSArNDQwLDE4MiBAQAogCQlpZHggPSBESVZfUk9VTkRfVVAoc2l6ZSAtIFpTX01JTl9BTExPQ19TSVpFLAogCQkJCVpTX1NJWkVfQ0xBU1NfREVMVEEpOwogCi0JcmV0dXJuIGlkeDsKKwlyZXR1cm4gbWluKHpzX3NpemVfY2xhc3NlcyAtIDEsIGlkeCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfWlNNQUxMT0NfU1RBVAorCitzdGF0aWMgaW5saW5lIHZvaWQgenNfc3RhdF9pbmMoc3RydWN0IHNpemVfY2xhc3MgKmNsYXNzLAorCQkJCWVudW0genNfc3RhdF90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcgY250KQoreworCWNsYXNzLT5zdGF0cy5vYmpzW3R5cGVdICs9IGNudDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHpzX3N0YXRfZGVjKHN0cnVjdCBzaXplX2NsYXNzICpjbGFzcywKKwkJCQllbnVtIHpzX3N0YXRfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIGNudCkKK3sKKwljbGFzcy0+c3RhdHMub2Jqc1t0eXBlXSAtPSBjbnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB6c19zdGF0X2dldChzdHJ1Y3Qgc2l6ZV9jbGFzcyAqY2xhc3MsCisJCQkJZW51bSB6c19zdGF0X3R5cGUgdHlwZSkKK3sKKwlyZXR1cm4gY2xhc3MtPnN0YXRzLm9ianNbdHlwZV07Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHpzX3N0YXRfaW5pdCh2b2lkKQoreworCWlmICghZGVidWdmc19pbml0aWFsaXplZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXpzX3N0YXRfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcigienNtYWxsb2MiLCBOVUxMKTsKKwlpZiAoIXpzX3N0YXRfcm9vdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHpzX3N0YXRfZXhpdCh2b2lkKQoreworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh6c19zdGF0X3Jvb3QpOworfQorCitzdGF0aWMgaW50IHpzX3N0YXRzX3NpemVfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCit7CisJaW50IGk7CisJc3RydWN0IHpzX3Bvb2wgKnBvb2wgPSBzLT5wcml2YXRlOworCXN0cnVjdCBzaXplX2NsYXNzICpjbGFzczsKKwlpbnQgb2Jqc19wZXJfenNwYWdlOworCXVuc2lnbmVkIGxvbmcgY2xhc3NfYWxtb3N0X2Z1bGwsIGNsYXNzX2FsbW9zdF9lbXB0eTsKKwl1bnNpZ25lZCBsb25nIG9ial9hbGxvY2F0ZWQsIG9ial91c2VkLCBwYWdlc191c2VkOworCXVuc2lnbmVkIGxvbmcgdG90YWxfY2xhc3NfYWxtb3N0X2Z1bGwgPSAwLCB0b3RhbF9jbGFzc19hbG1vc3RfZW1wdHkgPSAwOworCXVuc2lnbmVkIGxvbmcgdG90YWxfb2JqcyA9IDAsIHRvdGFsX3VzZWRfb2JqcyA9IDAsIHRvdGFsX3BhZ2VzID0gMDsKKworCXNlcV9wcmludGYocywgIiAlNXMgJTVzICUxMXMgJTEycyAlMTNzICUxMHMgJTEwcyAlMTZzXG4iLAorCQkJImNsYXNzIiwgInNpemUiLCAiYWxtb3N0X2Z1bGwiLCAiYWxtb3N0X2VtcHR5IiwKKwkJCSJvYmpfYWxsb2NhdGVkIiwgIm9ial91c2VkIiwgInBhZ2VzX3VzZWQiLAorCQkJInBhZ2VzX3Blcl96c3BhZ2UiKTsKKworCWZvciAoaSA9IDA7IGkgPCB6c19zaXplX2NsYXNzZXM7IGkrKykgeworCQljbGFzcyA9IHBvb2wtPnNpemVfY2xhc3NbaV07CisKKwkJaWYgKGNsYXNzLT5pbmRleCAhPSBpKQorCQkJY29udGludWU7CisKKwkJc3Bpbl9sb2NrKCZjbGFzcy0+bG9jayk7CisJCWNsYXNzX2FsbW9zdF9mdWxsID0genNfc3RhdF9nZXQoY2xhc3MsIENMQVNTX0FMTU9TVF9GVUxMKTsKKwkJY2xhc3NfYWxtb3N0X2VtcHR5ID0genNfc3RhdF9nZXQoY2xhc3MsIENMQVNTX0FMTU9TVF9FTVBUWSk7CisJCW9ial9hbGxvY2F0ZWQgPSB6c19zdGF0X2dldChjbGFzcywgT0JKX0FMTE9DQVRFRCk7CisJCW9ial91c2VkID0genNfc3RhdF9nZXQoY2xhc3MsIE9CSl9VU0VEKTsKKwkJc3Bpbl91bmxvY2soJmNsYXNzLT5sb2NrKTsKKworCQlvYmpzX3Blcl96c3BhZ2UgPSBnZXRfbWF4b2JqX3Blcl96c3BhZ2UoY2xhc3MtPnNpemUsCisJCQkJY2xhc3MtPnBhZ2VzX3Blcl96c3BhZ2UpOworCQlwYWdlc191c2VkID0gb2JqX2FsbG9jYXRlZCAvIG9ianNfcGVyX3pzcGFnZSAqCisJCQkJY2xhc3MtPnBhZ2VzX3Blcl96c3BhZ2U7CisKKwkJc2VxX3ByaW50ZihzLCAiICU1dSAlNXUgJTExbHUgJTEybHUgJTEzbHUgJTEwbHUgJTEwbHUgJTE2ZFxuIiwKKwkJCWksIGNsYXNzLT5zaXplLCBjbGFzc19hbG1vc3RfZnVsbCwgY2xhc3NfYWxtb3N0X2VtcHR5LAorCQkJb2JqX2FsbG9jYXRlZCwgb2JqX3VzZWQsIHBhZ2VzX3VzZWQsCisJCQljbGFzcy0+cGFnZXNfcGVyX3pzcGFnZSk7CisKKwkJdG90YWxfY2xhc3NfYWxtb3N0X2Z1bGwgKz0gY2xhc3NfYWxtb3N0X2Z1bGw7CisJCXRvdGFsX2NsYXNzX2FsbW9zdF9lbXB0eSArPSBjbGFzc19hbG1vc3RfZW1wdHk7CisJCXRvdGFsX29ianMgKz0gb2JqX2FsbG9jYXRlZDsKKwkJdG90YWxfdXNlZF9vYmpzICs9IG9ial91c2VkOworCQl0b3RhbF9wYWdlcyArPSBwYWdlc191c2VkOworCX0KKworCXNlcV9wdXRzKHMsICJcbiIpOworCXNlcV9wcmludGYocywgIiAlNXMgJTVzICUxMWx1ICUxMmx1ICUxM2x1ICUxMGx1ICUxMGx1XG4iLAorCQkJIlRvdGFsIiwgIiIsIHRvdGFsX2NsYXNzX2FsbW9zdF9mdWxsLAorCQkJdG90YWxfY2xhc3NfYWxtb3N0X2VtcHR5LCB0b3RhbF9vYmpzLAorCQkJdG90YWxfdXNlZF9vYmpzLCB0b3RhbF9wYWdlcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB6c19zdGF0c19zaXplX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHpzX3N0YXRzX3NpemVfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHpzX3N0YXRfc2l6ZV9vcHMgPSB7CisJLm9wZW4gICAgICAgICAgID0genNfc3RhdHNfc2l6ZV9vcGVuLAorCS5yZWFkICAgICAgICAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgICAgICAgICA9IHNlcV9sc2VlaywKKwkucmVsZWFzZSAgICAgICAgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBpbnQgenNfcG9vbF9zdGF0X2NyZWF0ZShjaGFyICpuYW1lLCBzdHJ1Y3QgenNfcG9vbCAqcG9vbCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKKworCWlmICghenNfc3RhdF9yb290KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHpzX3N0YXRfcm9vdCk7CisJaWYgKCFlbnRyeSkgeworCQlwcl93YXJuKCJkZWJ1Z2ZzIGRpciA8JXM+IGNyZWF0aW9uIGZhaWxlZFxuIiwgbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlwb29sLT5zdGF0X2RlbnRyeSA9IGVudHJ5OworCisJZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjbGFzc2VzIiwgU19JRlJFRyB8IFNfSVJVR08sCisJCQlwb29sLT5zdGF0X2RlbnRyeSwgcG9vbCwgJnpzX3N0YXRfc2l6ZV9vcHMpOworCWlmICghZW50cnkpIHsKKwkJcHJfd2FybigiJXM6IGRlYnVnZnMgZmlsZSBlbnRyeSA8JXM+IGNyZWF0aW9uIGZhaWxlZFxuIiwKKwkJCQluYW1lLCAiY2xhc3NlcyIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgenNfcG9vbF9zdGF0X2Rlc3Ryb3koc3RydWN0IHpzX3Bvb2wgKnBvb2wpCit7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHBvb2wtPnN0YXRfZGVudHJ5KTsKK30KKworI2Vsc2UgLyogQ09ORklHX1pTTUFMTE9DX1NUQVQgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHpzX3N0YXRfaW5jKHN0cnVjdCBzaXplX2NsYXNzICpjbGFzcywKKwkJCQllbnVtIHpzX3N0YXRfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIGNudCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHpzX3N0YXRfZGVjKHN0cnVjdCBzaXplX2NsYXNzICpjbGFzcywKKwkJCQllbnVtIHpzX3N0YXRfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIGNudCkKK3sKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHpzX3N0YXRfZ2V0KHN0cnVjdCBzaXplX2NsYXNzICpjbGFzcywKKwkJCQllbnVtIHpzX3N0YXRfdHlwZSB0eXBlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB6c19zdGF0X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHpzX3N0YXRfZXhpdCh2b2lkKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCB6c19wb29sX3N0YXRfY3JlYXRlKGNoYXIgKm5hbWUsIHN0cnVjdCB6c19wb29sICpwb29sKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgenNfcG9vbF9zdGF0X2Rlc3Ryb3koc3RydWN0IHpzX3Bvb2wgKnBvb2wpCit7Cit9CisKKyNlbmRpZgorCisKIC8qCiAgKiBGb3IgZWFjaCBzaXplIGNsYXNzLCB6c3BhZ2VzIGFyZSBkaXZpZGVkIGludG8gZGlmZmVyZW50IGdyb3VwcwogICogZGVwZW5kaW5nIG9uIGhvdyAiZnVsbCIgdGhleSBhcmUuIFRoaXMgd2FzIGRvbmUgc28gdGhhdCB3ZSBjb3VsZApAQCAtNDE5LDcgKzYzNiw3IEBACiAJCWZnID0gWlNfRU1QVFk7CiAJZWxzZSBpZiAoaW51c2UgPT0gbWF4X29iamVjdHMpCiAJCWZnID0gWlNfRlVMTDsKLQllbHNlIGlmIChpbnVzZSA8PSBtYXhfb2JqZWN0cyAvIGZ1bGxuZXNzX3RocmVzaG9sZF9mcmFjKQorCWVsc2UgaWYgKGludXNlIDw9IDMgKiBtYXhfb2JqZWN0cyAvIGZ1bGxuZXNzX3RocmVzaG9sZF9mcmFjKQogCQlmZyA9IFpTX0FMTU9TVF9FTVBUWTsKIAllbHNlCiAJCWZnID0gWlNfQUxNT1NUX0ZVTEw7CkBAIC00NDgsNiArNjY1LDggQEAKIAkJbGlzdF9hZGRfdGFpbCgmcGFnZS0+bHJ1LCAmKCpoZWFkKS0+bHJ1KTsKIAogCSpoZWFkID0gcGFnZTsKKwl6c19zdGF0X2luYyhjbGFzcywgZnVsbG5lc3MgPT0gWlNfQUxNT1NUX0VNUFRZID8KKwkJCUNMQVNTX0FMTU9TVF9FTVBUWSA6IENMQVNTX0FMTU9TVF9GVUxMLCAxKTsKIH0KIAogLyoKQEAgLTQ3Myw2ICs2OTIsOCBAQAogCQkJCQlzdHJ1Y3QgcGFnZSwgbHJ1KTsKIAogCWxpc3RfZGVsX2luaXQoJnBhZ2UtPmxydSk7CisJenNfc3RhdF9kZWMoY2xhc3MsIGZ1bGxuZXNzID09IFpTX0FMTU9TVF9FTVBUWSA/CisJCQlDTEFTU19BTE1PU1RfRU1QVFkgOiBDTEFTU19BTE1PU1RfRlVMTCwgMSk7CiB9CiAKIC8qCkBAIC00ODQsMTEgKzcwNSwxMCBAQAogICogcGFnZSBmcm9tIHRoZSBmcmVlbGlzdCBvZiB0aGUgb2xkIGZ1bGxuZXNzIGdyb3VwIHRvIHRoYXQgb2YgdGhlIG5ldwogICogZnVsbG5lc3MgZ3JvdXAuCiAgKi8KLXN0YXRpYyBlbnVtIGZ1bGxuZXNzX2dyb3VwIGZpeF9mdWxsbmVzc19ncm91cChzdHJ1Y3QgenNfcG9vbCAqcG9vbCwKK3N0YXRpYyBlbnVtIGZ1bGxuZXNzX2dyb3VwIGZpeF9mdWxsbmVzc19ncm91cChzdHJ1Y3Qgc2l6ZV9jbGFzcyAqY2xhc3MsCiAJCQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlpbnQgY2xhc3NfaWR4OwotCXN0cnVjdCBzaXplX2NsYXNzICpjbGFzczsKIAllbnVtIGZ1bGxuZXNzX2dyb3VwIGN1cnJmZywgbmV3Zmc7CiAKIAlCVUdfT04oIWlzX2ZpcnN0X3BhZ2UocGFnZSkpOwpAQCAtNDk4LDcgKzcxOCw2IEBACiAJaWYgKG5ld2ZnID09IGN1cnJmZykKIAkJZ290byBvdXQ7CiAKLQljbGFzcyA9IHBvb2wtPnNpemVfY2xhc3NbY2xhc3NfaWR4XTsKIAlyZW1vdmVfenNwYWdlKHBhZ2UsIGNsYXNzLCBjdXJyZmcpOwogCWluc2VydF96c3BhZ2UocGFnZSwgY2xhc3MsIG5ld2ZnKTsKIAlzZXRfenNwYWdlX21hcHBpbmcocGFnZSwgY2xhc3NfaWR4LCBuZXdmZyk7CkBAIC01MTIsNyArNzMxLDggQEAKICAqIHRvIGZvcm0gYSB6c3BhZ2UgZm9yIGVhY2ggc2l6ZSBjbGFzcy4gVGhpcyBpcyBpbXBvcnRhbnQKICAqIHRvIHJlZHVjZSB3YXN0YWdlIGR1ZSB0byB1bnVzYWJsZSBzcGFjZSBsZWZ0IGF0IGVuZCBvZgogICogZWFjaCB6c3BhZ2Ugd2hpY2ggaXMgZ2l2ZW4gYXM6Ci0gKgl3YXN0YWdlID0gWnAgLSBacCAlIHNpemVfY2xhc3MKKyAqICAgICB3YXN0YWdlID0gWnAgJSBjbGFzc19zaXplCisgKiAgICAgdXNhZ2UgPSBacCAtIHdhc3RhZ2UKICAqIHdoZXJlIFpwID0genNwYWdlIHNpemUgPSBrICogUEFHRV9TSVpFIHdoZXJlIGsgPSAxLCAyLCAuLi4KICAqCiAgKiBGb3IgZXhhbXBsZSwgZm9yIHNpemUgY2xhc3Mgb2YgMy84ICogUEFHRV9TSVpFLCB3ZSBzaG91bGQKQEAgLTU3MSwzNSArNzkxLDUwIEBACiAKIC8qCiAgKiBFbmNvZGUgPHBhZ2UsIG9ial9pZHg+IGFzIGEgc2luZ2xlIGhhbmRsZSB2YWx1ZS4KLSAqIE9uIGhhcmR3YXJlIHBsYXRmb3JtcyB3aXRoIHBoeXNpY2FsIG1lbW9yeSBzdGFydGluZyBhdCAweDAgdGhlIHBmbgotICogY291bGQgYmUgMCBzbyB3ZSBlbnN1cmUgdGhhdCB0aGUgaGFuZGxlIHdpbGwgbmV2ZXIgYmUgMCBieSBhZGp1c3RpbmcgdGhlCi0gKiBlbmNvZGVkIG9ial9pZHggdmFsdWUgYmVmb3JlIGVuY29kaW5nLgorICogV2UgdXNlIHRoZSBsZWFzdCBiaXQgb2YgaGFuZGxlIGZvciB0YWdnaW5nLgogICovCi1zdGF0aWMgdm9pZCAqb2JqX2xvY2F0aW9uX3RvX2hhbmRsZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvYmpfaWR4KQorc3RhdGljIHZvaWQgKmxvY2F0aW9uX3RvX29iaihzdHJ1Y3QgcGFnZSAqcGFnZSwgdW5zaWduZWQgbG9uZyBvYmpfaWR4KQogewotCXVuc2lnbmVkIGxvbmcgaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgb2JqOwogCiAJaWYgKCFwYWdlKSB7CiAJCUJVR19PTihvYmpfaWR4KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JaGFuZGxlID0gcGFnZV90b19wZm4ocGFnZSkgPDwgT0JKX0lOREVYX0JJVFM7Ci0JaGFuZGxlIHw9ICgob2JqX2lkeCArIDEpICYgT0JKX0lOREVYX01BU0spOworCW9iaiA9IHBhZ2VfdG9fcGZuKHBhZ2UpIDw8IE9CSl9JTkRFWF9CSVRTOworCW9iaiB8PSAoKG9ial9pZHgpICYgT0JKX0lOREVYX01BU0spOworCW9iaiA8PD0gT0JKX1RBR19CSVRTOwogCi0JcmV0dXJuICh2b2lkICopaGFuZGxlOworCXJldHVybiAodm9pZCAqKW9iajsKIH0KIAogLyoKICAqIERlY29kZSA8cGFnZSwgb2JqX2lkeD4gcGFpciBmcm9tIHRoZSBnaXZlbiBvYmplY3QgaGFuZGxlLiBXZSBhZGp1c3QgdGhlCiAgKiBkZWNvZGVkIG9ial9pZHggYmFjayB0byBpdHMgb3JpZ2luYWwgdmFsdWUgc2luY2UgaXQgd2FzIGFkanVzdGVkIGluCi0gKiBvYmpfbG9jYXRpb25fdG9faGFuZGxlKCkuCisgKiBsb2NhdGlvbl90b19vYmooKS4KICAqLwotc3RhdGljIHZvaWQgb2JqX2hhbmRsZV90b19sb2NhdGlvbih1bnNpZ25lZCBsb25nIGhhbmRsZSwgc3RydWN0IHBhZ2UgKipwYWdlLAorc3RhdGljIHZvaWQgb2JqX3RvX2xvY2F0aW9uKHVuc2lnbmVkIGxvbmcgb2JqLCBzdHJ1Y3QgcGFnZSAqKnBhZ2UsCiAJCQkJdW5zaWduZWQgbG9uZyAqb2JqX2lkeCkKIHsKLQkqcGFnZSA9IHBmbl90b19wYWdlKGhhbmRsZSA+PiBPQkpfSU5ERVhfQklUUyk7Ci0JKm9ial9pZHggPSAoaGFuZGxlICYgT0JKX0lOREVYX01BU0spIC0gMTsKKwlvYmogPj49IE9CSl9UQUdfQklUUzsKKwkqcGFnZSA9IHBmbl90b19wYWdlKG9iaiA+PiBPQkpfSU5ERVhfQklUUyk7CisJKm9ial9pZHggPSAob2JqICYgT0JKX0lOREVYX01BU0spOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBoYW5kbGVfdG9fb2JqKHVuc2lnbmVkIGxvbmcgaGFuZGxlKQoreworCXJldHVybiAqKHVuc2lnbmVkIGxvbmcgKiloYW5kbGU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG9ial90b19oZWFkKHN0cnVjdCBzaXplX2NsYXNzICpjbGFzcywgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQl2b2lkICpvYmopCit7CisJaWYgKGNsYXNzLT5odWdlKSB7CisJCVZNX0JVR19PTighaXNfZmlyc3RfcGFnZShwYWdlKSk7CisJCXJldHVybiAqKHVuc2lnbmVkIGxvbmcgKilwYWdlX3ByaXZhdGUocGFnZSk7CisJfSBlbHNlCisJCXJldHVybiAqKHVuc2lnbmVkIGxvbmcgKilvYmo7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIG9ial9pZHhfdG9fb2Zmc2V0KHN0cnVjdCBwYWdlICpwYWdlLApAQCAtNjEzLDYgKzg0OCwyNSBAQAogCXJldHVybiBvZmYgKyBvYmpfaWR4ICogY2xhc3Nfc2l6ZTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgdHJ5cGluX3RhZyh1bnNpZ25lZCBsb25nIGhhbmRsZSkKK3sKKwl1bnNpZ25lZCBsb25nICpwdHIgPSAodW5zaWduZWQgbG9uZyAqKWhhbmRsZTsKKworCXJldHVybiAhdGVzdF9hbmRfc2V0X2JpdF9sb2NrKEhBTkRMRV9QSU5fQklULCBwdHIpOworfQorCitzdGF0aWMgdm9pZCBwaW5fdGFnKHVuc2lnbmVkIGxvbmcgaGFuZGxlKQoreworCXdoaWxlICghdHJ5cGluX3RhZyhoYW5kbGUpKTsKK30KKworc3RhdGljIHZvaWQgdW5waW5fdGFnKHVuc2lnbmVkIGxvbmcgaGFuZGxlKQoreworCXVuc2lnbmVkIGxvbmcgKnB0ciA9ICh1bnNpZ25lZCBsb25nICopaGFuZGxlOworCisJY2xlYXJfYml0X3VubG9jayhIQU5ETEVfUElOX0JJVCwgcHRyKTsKK30KKwogc3RhdGljIHZvaWQgcmVzZXRfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAljbGVhcl9iaXQoUEdfcHJpdmF0ZSwgJnBhZ2UtPmZsYWdzKTsKQEAgLTY3NCw3ICs5MjgsNyBAQAogCQlsaW5rID0gKHN0cnVjdCBsaW5rX2ZyZWUgKil2YWRkciArIG9mZiAvIHNpemVvZigqbGluayk7CiAKIAkJd2hpbGUgKChvZmYgKz0gY2xhc3MtPnNpemUpIDwgUEFHRV9TSVpFKSB7Ci0JCQlsaW5rLT5uZXh0ID0gb2JqX2xvY2F0aW9uX3RvX2hhbmRsZShwYWdlLCBpKyspOworCQkJbGluay0+bmV4dCA9IGxvY2F0aW9uX3RvX29iaihwYWdlLCBpKyspOwogCQkJbGluayArPSBjbGFzcy0+c2l6ZSAvIHNpemVvZigqbGluayk7CiAJCX0KIApAQCAtNjg0LDcgKzkzOCw3IEBACiAJCSAqIHBhZ2UgKGlmIHByZXNlbnQpCiAJCSAqLwogCQluZXh0X3BhZ2UgPSBnZXRfbmV4dF9wYWdlKHBhZ2UpOwotCQlsaW5rLT5uZXh0ID0gb2JqX2xvY2F0aW9uX3RvX2hhbmRsZShuZXh0X3BhZ2UsIDApOworCQlsaW5rLT5uZXh0ID0gbG9jYXRpb25fdG9fb2JqKG5leHRfcGFnZSwgMCk7CiAJCWt1bm1hcF9hdG9taWModmFkZHIpOwogCQlwYWdlID0gbmV4dF9wYWdlOwogCQlvZmYgJT0gUEFHRV9TSVpFOwpAQCAtNzM4LDcgKzk5Miw3IEBACiAKIAlpbml0X3pzcGFnZShmaXJzdF9wYWdlLCBjbGFzcyk7CiAKLQlmaXJzdF9wYWdlLT5mcmVlbGlzdCA9IG9ial9sb2NhdGlvbl90b19oYW5kbGUoZmlyc3RfcGFnZSwgMCk7CisJZmlyc3RfcGFnZS0+ZnJlZWxpc3QgPSBsb2NhdGlvbl90b19vYmooZmlyc3RfcGFnZSwgMCk7CiAJLyogTWF4aW11bSBudW1iZXIgb2Ygb2JqZWN0cyB3ZSBjYW4gc3RvcmUgaW4gdGhpcyB6c3BhZ2UgKi8KIAlmaXJzdF9wYWdlLT5vYmplY3RzID0gY2xhc3MtPnBhZ2VzX3Blcl96c3BhZ2UgKiBQQUdFX1NJWkUgLyBjbGFzcy0+c2l6ZTsKIApAQCAtODYwLDEyICsxMTE0LDE5IEBACiB7CiAJaW50IHNpemVzWzJdOwogCXZvaWQgKmFkZHI7Ci0JY2hhciAqYnVmID0gYXJlYS0+dm1fYnVmOworCWNoYXIgKmJ1ZjsKIAogCS8qIG5vIHdyaXRlIGZhc3RwYXRoICovCiAJaWYgKGFyZWEtPnZtX21tID09IFpTX01NX1JPKQogCQlnb3RvIG91dDsKIAorCWJ1ZiA9IGFyZWEtPnZtX2J1ZjsKKwlpZiAoIWFyZWEtPmh1Z2UpIHsKKwkJYnVmID0gYnVmICsgWlNfSEFORExFX1NJWkU7CisJCXNpemUgLT0gWlNfSEFORExFX1NJWkU7CisJCW9mZiArPSBaU19IQU5ETEVfU0laRTsKKwl9CisKIAlzaXplc1swXSA9IFBBR0VfU0laRSAtIG9mZjsKIAlzaXplc1sxXSA9IHNpemUgLSBzaXplc1swXTsKIApAQCAtOTUyLDExICsxMjEzLDYgQEAKIAl6c19zaXplX2NsYXNzZXMgPSBucjsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCBnZXRfbWF4b2JqX3Blcl96c3BhZ2UoaW50IHNpemUsIGludCBwYWdlc19wZXJfenNwYWdlKQotewotCXJldHVybiBwYWdlc19wZXJfenNwYWdlICogUEFHRV9TSVpFIC8gc2l6ZTsKLX0KLQogc3RhdGljIGJvb2wgY2FuX21lcmdlKHN0cnVjdCBzaXplX2NsYXNzICpwcmV2LCBpbnQgc2l6ZSwgaW50IHBhZ2VzX3Blcl96c3BhZ2UpCiB7CiAJaWYgKHByZXYtPnBhZ2VzX3Blcl96c3BhZ2UgIT0gcGFnZXNfcGVyX3pzcGFnZSkKQEAgLTk2OSwxNjYgKzEyMjUsMTMgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotI2lmZGVmIENPTkZJR19aU01BTExPQ19TVEFUCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCB6c19zdGF0X2luYyhzdHJ1Y3Qgc2l6ZV9jbGFzcyAqY2xhc3MsCi0JCQkJZW51bSB6c19zdGF0X3R5cGUgdHlwZSwgdW5zaWduZWQgbG9uZyBjbnQpCitzdGF0aWMgYm9vbCB6c3BhZ2VfZnVsbChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQljbGFzcy0+c3RhdHMub2Jqc1t0eXBlXSArPSBjbnQ7CisJQlVHX09OKCFpc19maXJzdF9wYWdlKHBhZ2UpKTsKKworCXJldHVybiBwYWdlLT5pbnVzZSA9PSBwYWdlLT5vYmplY3RzOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgenNfc3RhdF9kZWMoc3RydWN0IHNpemVfY2xhc3MgKmNsYXNzLAotCQkJCWVudW0genNfc3RhdF90eXBlIHR5cGUsIHVuc2lnbmVkIGxvbmcgY250KQotewotCWNsYXNzLT5zdGF0cy5vYmpzW3R5cGVdIC09IGNudDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHpzX3N0YXRfZ2V0KHN0cnVjdCBzaXplX2NsYXNzICpjbGFzcywKLQkJCQllbnVtIHpzX3N0YXRfdHlwZSB0eXBlKQotewotCXJldHVybiBjbGFzcy0+c3RhdHMub2Jqc1t0eXBlXTsKLX0KLQotc3RhdGljIGludCBfX2luaXQgenNfc3RhdF9pbml0KHZvaWQpCi17Ci0JaWYgKCFkZWJ1Z2ZzX2luaXRpYWxpemVkKCkpCi0JCXJldHVybiAtRU5PREVWOwotCi0JenNfc3RhdF9yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJ6c21hbGxvYyIsIE5VTEwpOwotCWlmICghenNfc3RhdF9yb290KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgenNfc3RhdF9leGl0KHZvaWQpCi17Ci0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHpzX3N0YXRfcm9vdCk7Ci19Ci0KLXN0YXRpYyBpbnQgenNfc3RhdHNfc2l6ZV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdikKLXsKLQlpbnQgaTsKLQlzdHJ1Y3QgenNfcG9vbCAqcG9vbCA9IHMtPnByaXZhdGU7Ci0Jc3RydWN0IHNpemVfY2xhc3MgKmNsYXNzOwotCWludCBvYmpzX3Blcl96c3BhZ2U7Ci0JdW5zaWduZWQgbG9uZyBvYmpfYWxsb2NhdGVkLCBvYmpfdXNlZCwgcGFnZXNfdXNlZDsKLQl1bnNpZ25lZCBsb25nIHRvdGFsX29ianMgPSAwLCB0b3RhbF91c2VkX29ianMgPSAwLCB0b3RhbF9wYWdlcyA9IDA7Ci0KLQlzZXFfcHJpbnRmKHMsICIgJTVzICU1cyAlMTNzICUxMHMgJTEwc1xuIiwgImNsYXNzIiwgInNpemUiLAotCQkJCSJvYmpfYWxsb2NhdGVkIiwgIm9ial91c2VkIiwgInBhZ2VzX3VzZWQiKTsKLQotCWZvciAoaSA9IDA7IGkgPCB6c19zaXplX2NsYXNzZXM7IGkrKykgewotCQljbGFzcyA9IHBvb2wtPnNpemVfY2xhc3NbaV07Ci0KLQkJaWYgKGNsYXNzLT5pbmRleCAhPSBpKQotCQkJY29udGludWU7Ci0KLQkJc3Bpbl9sb2NrKCZjbGFzcy0+bG9jayk7Ci0JCW9ial9hbGxvY2F0ZWQgPSB6c19zdGF0X2dldChjbGFzcywgT0JKX0FMTE9DQVRFRCk7Ci0JCW9ial91c2VkID0genNfc3RhdF9nZXQoY2xhc3MsIE9CSl9VU0VEKTsKLQkJc3Bpbl91bmxvY2soJmNsYXNzLT5sb2NrKTsKLQotCQlvYmpzX3Blcl96c3BhZ2UgPSBnZXRfbWF4b2JqX3Blcl96c3BhZ2UoY2xhc3MtPnNpemUsCi0JCQkJY2xhc3MtPnBhZ2VzX3Blcl96c3BhZ2UpOwotCQlwYWdlc191c2VkID0gb2JqX2FsbG9jYXRlZCAvIG9ianNfcGVyX3pzcGFnZSAqCi0JCQkJY2xhc3MtPnBhZ2VzX3Blcl96c3BhZ2U7Ci0KLQkJc2VxX3ByaW50ZihzLCAiICU1dSAlNXUgICAgJTEwbHUgJTEwbHUgJTEwbHVcbiIsIGksCi0JCQljbGFzcy0+c2l6ZSwgb2JqX2FsbG9jYXRlZCwgb2JqX3VzZWQsIHBhZ2VzX3VzZWQpOwotCi0JCXRvdGFsX29ianMgKz0gb2JqX2FsbG9jYXRlZDsKLQkJdG90YWxfdXNlZF9vYmpzICs9IG9ial91c2VkOwotCQl0b3RhbF9wYWdlcyArPSBwYWdlc191c2VkOwotCX0KLQotCXNlcV9wdXRzKHMsICJcbiIpOwotCXNlcV9wcmludGYocywgIiAlNXMgJTVzICAgICUxMGx1ICUxMGx1ICUxMGx1XG4iLCAiVG90YWwiLCAiIiwKLQkJCXRvdGFsX29ianMsIHRvdGFsX3VzZWRfb2JqcywgdG90YWxfcGFnZXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgenNfc3RhdHNfc2l6ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCB6c19zdGF0c19zaXplX3Nob3csIGlub2RlLT5pX3ByaXZhdGUpOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB6c19zdGF0X3NpemVfb3BzID0gewotCS5vcGVuICAgICAgICAgICA9IHpzX3N0YXRzX3NpemVfb3BlbiwKLQkucmVhZCAgICAgICAgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICAgICAgICAgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgICAgICAgID0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IHpzX3Bvb2xfc3RhdF9jcmVhdGUoY2hhciAqbmFtZSwgc3RydWN0IHpzX3Bvb2wgKnBvb2wpCi17Ci0Jc3RydWN0IGRlbnRyeSAqZW50cnk7Ci0KLQlpZiAoIXpzX3N0YXRfcm9vdCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2RpcihuYW1lLCB6c19zdGF0X3Jvb3QpOwotCWlmICghZW50cnkpIHsKLQkJcHJfd2FybigiZGVidWdmcyBkaXIgPCVzPiBjcmVhdGlvbiBmYWlsZWRcbiIsIG5hbWUpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcG9vbC0+c3RhdF9kZW50cnkgPSBlbnRyeTsKLQotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgib2JqX2luX2NsYXNzZXMiLCBTX0lGUkVHIHwgU19JUlVHTywKLQkJCXBvb2wtPnN0YXRfZGVudHJ5LCBwb29sLCAmenNfc3RhdF9zaXplX29wcyk7Ci0JaWYgKCFlbnRyeSkgewotCQlwcl93YXJuKCIlczogZGVidWdmcyBmaWxlIGVudHJ5IDwlcz4gY3JlYXRpb24gZmFpbGVkXG4iLAotCQkJCW5hbWUsICJvYmpfaW5fY2xhc3NlcyIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgenNfcG9vbF9zdGF0X2Rlc3Ryb3koc3RydWN0IHpzX3Bvb2wgKnBvb2wpCi17Ci0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHBvb2wtPnN0YXRfZGVudHJ5KTsKLX0KLQotI2Vsc2UgLyogQ09ORklHX1pTTUFMTE9DX1NUQVQgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIHpzX3N0YXRfaW5jKHN0cnVjdCBzaXplX2NsYXNzICpjbGFzcywKLQkJCQllbnVtIHpzX3N0YXRfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIGNudCkKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHpzX3N0YXRfZGVjKHN0cnVjdCBzaXplX2NsYXNzICpjbGFzcywKLQkJCQllbnVtIHpzX3N0YXRfdHlwZSB0eXBlLCB1bnNpZ25lZCBsb25nIGNudCkKLXsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHpzX3N0YXRfZ2V0KHN0cnVjdCBzaXplX2NsYXNzICpjbGFzcywKLQkJCQllbnVtIHpzX3N0YXRfdHlwZSB0eXBlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCB6c19zdGF0X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHpzX3N0YXRfZXhpdCh2b2lkKQotewotfQotCi1zdGF0aWMgaW5saW5lIGludCB6c19wb29sX3N0YXRfY3JlYXRlKGNoYXIgKm5hbWUsIHN0cnVjdCB6c19wb29sICpwb29sKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgenNfcG9vbF9zdGF0X2Rlc3Ryb3koc3RydWN0IHpzX3Bvb2wgKnBvb2wpCi17Ci19Ci0KLSNlbmRpZgotCiB1bnNpZ25lZCBsb25nIHpzX2dldF90b3RhbF9wYWdlcyhzdHJ1Y3QgenNfcG9vbCAqcG9vbCkKIHsKIAlyZXR1cm4gYXRvbWljX2xvbmdfcmVhZCgmcG9vbC0+cGFnZXNfYWxsb2NhdGVkKTsKQEAgLTExNTMsMTMgKzEyNTYsMTQgQEAKIAkJCWVudW0genNfbWFwbW9kZSBtbSkKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNpZ25lZCBsb25nIG9ial9pZHgsIG9mZjsKKwl1bnNpZ25lZCBsb25nIG9iaiwgb2JqX2lkeCwgb2ZmOwogCiAJdW5zaWduZWQgaW50IGNsYXNzX2lkeDsKIAllbnVtIGZ1bGxuZXNzX2dyb3VwIGZnOwogCXN0cnVjdCBzaXplX2NsYXNzICpjbGFzczsKIAlzdHJ1Y3QgbWFwcGluZ19hcmVhICphcmVhOwogCXN0cnVjdCBwYWdlICpwYWdlc1syXTsKKwl2b2lkICpyZXQ7CiAKIAlCVUdfT04oIWhhbmRsZSk7CiAKQEAgLTExNzAsNyArMTI3NCwxMSBAQAogCSAqLwogCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CiAKLQlvYmpfaGFuZGxlX3RvX2xvY2F0aW9uKGhhbmRsZSwgJnBhZ2UsICZvYmpfaWR4KTsKKwkvKiBGcm9tIG5vdyBvbiwgbWlncmF0aW9uIGNhbm5vdCBtb3ZlIHRoZSBvYmplY3QgKi8KKwlwaW5fdGFnKGhhbmRsZSk7CisKKwlvYmogPSBoYW5kbGVfdG9fb2JqKGhhbmRsZSk7CisJb2JqX3RvX2xvY2F0aW9uKG9iaiwgJnBhZ2UsICZvYmpfaWR4KTsKIAlnZXRfenNwYWdlX21hcHBpbmcoZ2V0X2ZpcnN0X3BhZ2UocGFnZSksICZjbGFzc19pZHgsICZmZyk7CiAJY2xhc3MgPSBwb29sLT5zaXplX2NsYXNzW2NsYXNzX2lkeF07CiAJb2ZmID0gb2JqX2lkeF90b19vZmZzZXQocGFnZSwgb2JqX2lkeCwgY2xhc3MtPnNpemUpOwpAQCAtMTE4MCw3ICsxMjg4LDggQEAKIAlpZiAob2ZmICsgY2xhc3MtPnNpemUgPD0gUEFHRV9TSVpFKSB7CiAJCS8qIHRoaXMgb2JqZWN0IGlzIGNvbnRhaW5lZCBlbnRpcmVseSB3aXRoaW4gYSBwYWdlICovCiAJCWFyZWEtPnZtX2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKLQkJcmV0dXJuIGFyZWEtPnZtX2FkZHIgKyBvZmY7CisJCXJldCA9IGFyZWEtPnZtX2FkZHIgKyBvZmY7CisJCWdvdG8gb3V0OwogCX0KIAogCS8qIHRoaXMgb2JqZWN0IHNwYW5zIHR3byBwYWdlcyAqLwpAQCAtMTE4OCwxNCArMTI5NywxOSBAQAogCXBhZ2VzWzFdID0gZ2V0X25leHRfcGFnZShwYWdlKTsKIAlCVUdfT04oIXBhZ2VzWzFdKTsKIAotCXJldHVybiBfX3pzX21hcF9vYmplY3QoYXJlYSwgcGFnZXMsIG9mZiwgY2xhc3MtPnNpemUpOworCXJldCA9IF9fenNfbWFwX29iamVjdChhcmVhLCBwYWdlcywgb2ZmLCBjbGFzcy0+c2l6ZSk7CitvdXQ6CisJaWYgKCFjbGFzcy0+aHVnZSkKKwkJcmV0ICs9IFpTX0hBTkRMRV9TSVpFOworCisJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHpzX21hcF9vYmplY3QpOwogCiB2b2lkIHpzX3VubWFwX29iamVjdChzdHJ1Y3QgenNfcG9vbCAqcG9vbCwgdW5zaWduZWQgbG9uZyBoYW5kbGUpCiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBvYmpfaWR4LCBvZmY7CisJdW5zaWduZWQgbG9uZyBvYmosIG9ial9pZHgsIG9mZjsKIAogCXVuc2lnbmVkIGludCBjbGFzc19pZHg7CiAJZW51bSBmdWxsbmVzc19ncm91cCBmZzsKQEAgLTEyMDQsNyArMTMxOCw4IEBACiAKIAlCVUdfT04oIWhhbmRsZSk7CiAKLQlvYmpfaGFuZGxlX3RvX2xvY2F0aW9uKGhhbmRsZSwgJnBhZ2UsICZvYmpfaWR4KTsKKwlvYmogPSBoYW5kbGVfdG9fb2JqKGhhbmRsZSk7CisJb2JqX3RvX2xvY2F0aW9uKG9iaiwgJnBhZ2UsICZvYmpfaWR4KTsKIAlnZXRfenNwYWdlX21hcHBpbmcoZ2V0X2ZpcnN0X3BhZ2UocGFnZSksICZjbGFzc19pZHgsICZmZyk7CiAJY2xhc3MgPSBwb29sLT5zaXplX2NsYXNzW2NsYXNzX2lkeF07CiAJb2ZmID0gb2JqX2lkeF90b19vZmZzZXQocGFnZSwgb2JqX2lkeCwgY2xhc3MtPnNpemUpOwpAQCAtMTIyMiw5ICsxMzM3LDQyIEBACiAJCV9fenNfdW5tYXBfb2JqZWN0KGFyZWEsIHBhZ2VzLCBvZmYsIGNsYXNzLT5zaXplKTsKIAl9CiAJcHV0X2NwdV92YXIoenNfbWFwX2FyZWEpOworCXVucGluX3RhZyhoYW5kbGUpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoenNfdW5tYXBfb2JqZWN0KTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX21hbGxvYyhzdHJ1Y3QgcGFnZSAqZmlyc3RfcGFnZSwKKwkJc3RydWN0IHNpemVfY2xhc3MgKmNsYXNzLCB1bnNpZ25lZCBsb25nIGhhbmRsZSkKK3sKKwl1bnNpZ25lZCBsb25nIG9iajsKKwlzdHJ1Y3QgbGlua19mcmVlICpsaW5rOworCisJc3RydWN0IHBhZ2UgKm1fcGFnZTsKKwl1bnNpZ25lZCBsb25nIG1fb2JqaWR4LCBtX29mZnNldDsKKwl2b2lkICp2YWRkcjsKKworCWhhbmRsZSB8PSBPQkpfQUxMT0NBVEVEX1RBRzsKKwlvYmogPSAodW5zaWduZWQgbG9uZylmaXJzdF9wYWdlLT5mcmVlbGlzdDsKKwlvYmpfdG9fbG9jYXRpb24ob2JqLCAmbV9wYWdlLCAmbV9vYmppZHgpOworCW1fb2Zmc2V0ID0gb2JqX2lkeF90b19vZmZzZXQobV9wYWdlLCBtX29iamlkeCwgY2xhc3MtPnNpemUpOworCisJdmFkZHIgPSBrbWFwX2F0b21pYyhtX3BhZ2UpOworCWxpbmsgPSAoc3RydWN0IGxpbmtfZnJlZSAqKXZhZGRyICsgbV9vZmZzZXQgLyBzaXplb2YoKmxpbmspOworCWZpcnN0X3BhZ2UtPmZyZWVsaXN0ID0gbGluay0+bmV4dDsKKwlpZiAoIWNsYXNzLT5odWdlKQorCQkvKiByZWNvcmQgaGFuZGxlIGluIHRoZSBoZWFkZXIgb2YgYWxsb2NhdGVkIGNodW5rICovCisJCWxpbmstPmhhbmRsZSA9IGhhbmRsZTsKKwllbHNlCisJCS8qIHJlY29yZCBoYW5kbGUgaW4gZmlyc3RfcGFnZS0+cHJpdmF0ZSAqLworCQlzZXRfcGFnZV9wcml2YXRlKGZpcnN0X3BhZ2UsIGhhbmRsZSk7CisJa3VubWFwX2F0b21pYyh2YWRkcik7CisJZmlyc3RfcGFnZS0+aW51c2UrKzsKKwl6c19zdGF0X2luYyhjbGFzcywgT0JKX1VTRUQsIDEpOworCisJcmV0dXJuIG9iajsKK30KKworCiAvKioKICAqIHpzX21hbGxvYyAtIEFsbG9jYXRlIGJsb2NrIG9mIGdpdmVuIHNpemUgZnJvbSBwb29sLgogICogQHBvb2w6IHBvb2wgdG8gYWxsb2NhdGUgZnJvbQpAQCAtMTIzNiwxNyArMTM4NCwxOSBAQAogICovCiB1bnNpZ25lZCBsb25nIHpzX21hbGxvYyhzdHJ1Y3QgenNfcG9vbCAqcG9vbCwgc2l6ZV90IHNpemUpCiB7Ci0JdW5zaWduZWQgbG9uZyBvYmo7Ci0Jc3RydWN0IGxpbmtfZnJlZSAqbGluazsKKwl1bnNpZ25lZCBsb25nIGhhbmRsZSwgb2JqOwogCXN0cnVjdCBzaXplX2NsYXNzICpjbGFzczsKLQl2b2lkICp2YWRkcjsKLQotCXN0cnVjdCBwYWdlICpmaXJzdF9wYWdlLCAqbV9wYWdlOwotCXVuc2lnbmVkIGxvbmcgbV9vYmppZHgsIG1fb2Zmc2V0OworCXN0cnVjdCBwYWdlICpmaXJzdF9wYWdlOwogCiAJaWYgKHVubGlrZWx5KCFzaXplIHx8IHNpemUgPiBaU19NQVhfQUxMT0NfU0laRSkpCiAJCXJldHVybiAwOwogCisJaGFuZGxlID0gYWxsb2NfaGFuZGxlKHBvb2wpOworCWlmICghaGFuZGxlKQorCQlyZXR1cm4gMDsKKworCS8qIGV4dHJhIHNwYWNlIGluIGNodW5rIHRvIGtlZXAgdGhlIGhhbmRsZSAqLworCXNpemUgKz0gWlNfSEFORExFX1NJWkU7CiAJY2xhc3MgPSBwb29sLT5zaXplX2NsYXNzW2dldF9zaXplX2NsYXNzX2luZGV4KHNpemUpXTsKIAogCXNwaW5fbG9jaygmY2xhc3MtPmxvY2spOwpAQCAtMTI1NSw4ICsxNDA1LDEwIEBACiAJaWYgKCFmaXJzdF9wYWdlKSB7CiAJCXNwaW5fdW5sb2NrKCZjbGFzcy0+bG9jayk7CiAJCWZpcnN0X3BhZ2UgPSBhbGxvY196c3BhZ2UoY2xhc3MsIHBvb2wtPmZsYWdzKTsKLQkJaWYgKHVubGlrZWx5KCFmaXJzdF9wYWdlKSkKKwkJaWYgKHVubGlrZWx5KCFmaXJzdF9wYWdlKSkgeworCQkJZnJlZV9oYW5kbGUocG9vbCwgaGFuZGxlKTsKIAkJCXJldHVybiAwOworCQl9CiAKIAkJc2V0X3pzcGFnZV9tYXBwaW5nKGZpcnN0X3BhZ2UsIGNsYXNzLT5pbmRleCwgWlNfRU1QVFkpOwogCQlhdG9taWNfbG9uZ19hZGQoY2xhc3MtPnBhZ2VzX3Blcl96c3BhZ2UsCkBAIC0xMjY3LDc0ICsxNDE5LDM2MSBAQAogCQkJCWNsYXNzLT5zaXplLCBjbGFzcy0+cGFnZXNfcGVyX3pzcGFnZSkpOwogCX0KIAotCW9iaiA9ICh1bnNpZ25lZCBsb25nKWZpcnN0X3BhZ2UtPmZyZWVsaXN0OwotCW9ial9oYW5kbGVfdG9fbG9jYXRpb24ob2JqLCAmbV9wYWdlLCAmbV9vYmppZHgpOwotCW1fb2Zmc2V0ID0gb2JqX2lkeF90b19vZmZzZXQobV9wYWdlLCBtX29iamlkeCwgY2xhc3MtPnNpemUpOwotCi0JdmFkZHIgPSBrbWFwX2F0b21pYyhtX3BhZ2UpOwotCWxpbmsgPSAoc3RydWN0IGxpbmtfZnJlZSAqKXZhZGRyICsgbV9vZmZzZXQgLyBzaXplb2YoKmxpbmspOwotCWZpcnN0X3BhZ2UtPmZyZWVsaXN0ID0gbGluay0+bmV4dDsKLQltZW1zZXQobGluaywgUE9JU09OX0lOVVNFLCBzaXplb2YoKmxpbmspKTsKLQlrdW5tYXBfYXRvbWljKHZhZGRyKTsKLQotCWZpcnN0X3BhZ2UtPmludXNlKys7Ci0JenNfc3RhdF9pbmMoY2xhc3MsIE9CSl9VU0VELCAxKTsKKwlvYmogPSBvYmpfbWFsbG9jKGZpcnN0X3BhZ2UsIGNsYXNzLCBoYW5kbGUpOwogCS8qIE5vdyBtb3ZlIHRoZSB6c3BhZ2UgdG8gYW5vdGhlciBmdWxsbmVzcyBncm91cCwgaWYgcmVxdWlyZWQgKi8KLQlmaXhfZnVsbG5lc3NfZ3JvdXAocG9vbCwgZmlyc3RfcGFnZSk7CisJZml4X2Z1bGxuZXNzX2dyb3VwKGNsYXNzLCBmaXJzdF9wYWdlKTsKKwlyZWNvcmRfb2JqKGhhbmRsZSwgb2JqKTsKIAlzcGluX3VubG9jaygmY2xhc3MtPmxvY2spOwogCi0JcmV0dXJuIG9iajsKKwlyZXR1cm4gaGFuZGxlOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoenNfbWFsbG9jKTsKIAotdm9pZCB6c19mcmVlKHN0cnVjdCB6c19wb29sICpwb29sLCB1bnNpZ25lZCBsb25nIG9iaikKK3N0YXRpYyB2b2lkIG9ial9mcmVlKHN0cnVjdCB6c19wb29sICpwb29sLCBzdHJ1Y3Qgc2l6ZV9jbGFzcyAqY2xhc3MsCisJCQl1bnNpZ25lZCBsb25nIG9iaikKIHsKIAlzdHJ1Y3QgbGlua19mcmVlICpsaW5rOwogCXN0cnVjdCBwYWdlICpmaXJzdF9wYWdlLCAqZl9wYWdlOwogCXVuc2lnbmVkIGxvbmcgZl9vYmppZHgsIGZfb2Zmc2V0OwogCXZvaWQgKnZhZGRyOworCWludCBjbGFzc19pZHg7CisJZW51bSBmdWxsbmVzc19ncm91cCBmdWxsbmVzczsKIAorCUJVR19PTighb2JqKTsKKworCW9iaiAmPSB+T0JKX0FMTE9DQVRFRF9UQUc7CisJb2JqX3RvX2xvY2F0aW9uKG9iaiwgJmZfcGFnZSwgJmZfb2JqaWR4KTsKKwlmaXJzdF9wYWdlID0gZ2V0X2ZpcnN0X3BhZ2UoZl9wYWdlKTsKKworCWdldF96c3BhZ2VfbWFwcGluZyhmaXJzdF9wYWdlLCAmY2xhc3NfaWR4LCAmZnVsbG5lc3MpOworCWZfb2Zmc2V0ID0gb2JqX2lkeF90b19vZmZzZXQoZl9wYWdlLCBmX29iamlkeCwgY2xhc3MtPnNpemUpOworCisJdmFkZHIgPSBrbWFwX2F0b21pYyhmX3BhZ2UpOworCisJLyogSW5zZXJ0IHRoaXMgb2JqZWN0IGluIGNvbnRhaW5pbmcgenNwYWdlJ3MgZnJlZWxpc3QgKi8KKwlsaW5rID0gKHN0cnVjdCBsaW5rX2ZyZWUgKikodmFkZHIgKyBmX29mZnNldCk7CisJbGluay0+bmV4dCA9IGZpcnN0X3BhZ2UtPmZyZWVsaXN0OworCWlmIChjbGFzcy0+aHVnZSkKKwkJc2V0X3BhZ2VfcHJpdmF0ZShmaXJzdF9wYWdlLCAwKTsKKwlrdW5tYXBfYXRvbWljKHZhZGRyKTsKKwlmaXJzdF9wYWdlLT5mcmVlbGlzdCA9ICh2b2lkICopb2JqOworCWZpcnN0X3BhZ2UtPmludXNlLS07CisJenNfc3RhdF9kZWMoY2xhc3MsIE9CSl9VU0VELCAxKTsKK30KKwordm9pZCB6c19mcmVlKHN0cnVjdCB6c19wb29sICpwb29sLCB1bnNpZ25lZCBsb25nIGhhbmRsZSkKK3sKKwlzdHJ1Y3QgcGFnZSAqZmlyc3RfcGFnZSwgKmZfcGFnZTsKKwl1bnNpZ25lZCBsb25nIG9iaiwgZl9vYmppZHg7CiAJaW50IGNsYXNzX2lkeDsKIAlzdHJ1Y3Qgc2l6ZV9jbGFzcyAqY2xhc3M7CiAJZW51bSBmdWxsbmVzc19ncm91cCBmdWxsbmVzczsKIAotCWlmICh1bmxpa2VseSghb2JqKSkKKwlpZiAodW5saWtlbHkoIWhhbmRsZSkpCiAJCXJldHVybjsKIAotCW9ial9oYW5kbGVfdG9fbG9jYXRpb24ob2JqLCAmZl9wYWdlLCAmZl9vYmppZHgpOworCXBpbl90YWcoaGFuZGxlKTsKKwlvYmogPSBoYW5kbGVfdG9fb2JqKGhhbmRsZSk7CisJb2JqX3RvX2xvY2F0aW9uKG9iaiwgJmZfcGFnZSwgJmZfb2JqaWR4KTsKIAlmaXJzdF9wYWdlID0gZ2V0X2ZpcnN0X3BhZ2UoZl9wYWdlKTsKIAogCWdldF96c3BhZ2VfbWFwcGluZyhmaXJzdF9wYWdlLCAmY2xhc3NfaWR4LCAmZnVsbG5lc3MpOwogCWNsYXNzID0gcG9vbC0+c2l6ZV9jbGFzc1tjbGFzc19pZHhdOwotCWZfb2Zmc2V0ID0gb2JqX2lkeF90b19vZmZzZXQoZl9wYWdlLCBmX29iamlkeCwgY2xhc3MtPnNpemUpOwogCiAJc3Bpbl9sb2NrKCZjbGFzcy0+bG9jayk7Ci0KLQkvKiBJbnNlcnQgdGhpcyBvYmplY3QgaW4gY29udGFpbmluZyB6c3BhZ2UncyBmcmVlbGlzdCAqLwotCXZhZGRyID0ga21hcF9hdG9taWMoZl9wYWdlKTsKLQlsaW5rID0gKHN0cnVjdCBsaW5rX2ZyZWUgKikodmFkZHIgKyBmX29mZnNldCk7Ci0JbGluay0+bmV4dCA9IGZpcnN0X3BhZ2UtPmZyZWVsaXN0OwotCWt1bm1hcF9hdG9taWModmFkZHIpOwotCWZpcnN0X3BhZ2UtPmZyZWVsaXN0ID0gKHZvaWQgKilvYmo7Ci0KLQlmaXJzdF9wYWdlLT5pbnVzZS0tOwotCWZ1bGxuZXNzID0gZml4X2Z1bGxuZXNzX2dyb3VwKHBvb2wsIGZpcnN0X3BhZ2UpOwotCi0JenNfc3RhdF9kZWMoY2xhc3MsIE9CSl9VU0VELCAxKTsKLQlpZiAoZnVsbG5lc3MgPT0gWlNfRU1QVFkpCisJb2JqX2ZyZWUocG9vbCwgY2xhc3MsIG9iaik7CisJZnVsbG5lc3MgPSBmaXhfZnVsbG5lc3NfZ3JvdXAoY2xhc3MsIGZpcnN0X3BhZ2UpOworCWlmIChmdWxsbmVzcyA9PSBaU19FTVBUWSkgewogCQl6c19zdGF0X2RlYyhjbGFzcywgT0JKX0FMTE9DQVRFRCwgZ2V0X21heG9ial9wZXJfenNwYWdlKAogCQkJCWNsYXNzLT5zaXplLCBjbGFzcy0+cGFnZXNfcGVyX3pzcGFnZSkpOwotCi0Jc3Bpbl91bmxvY2soJmNsYXNzLT5sb2NrKTsKLQotCWlmIChmdWxsbmVzcyA9PSBaU19FTVBUWSkgewogCQlhdG9taWNfbG9uZ19zdWIoY2xhc3MtPnBhZ2VzX3Blcl96c3BhZ2UsCiAJCQkJJnBvb2wtPnBhZ2VzX2FsbG9jYXRlZCk7CiAJCWZyZWVfenNwYWdlKGZpcnN0X3BhZ2UpOwogCX0KKwlzcGluX3VubG9jaygmY2xhc3MtPmxvY2spOworCXVucGluX3RhZyhoYW5kbGUpOworCisJZnJlZV9oYW5kbGUocG9vbCwgaGFuZGxlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHpzX2ZyZWUpOwogCitzdGF0aWMgdm9pZCB6c19vYmplY3RfY29weSh1bnNpZ25lZCBsb25nIHNyYywgdW5zaWduZWQgbG9uZyBkc3QsCisJCQkJc3RydWN0IHNpemVfY2xhc3MgKmNsYXNzKQoreworCXN0cnVjdCBwYWdlICpzX3BhZ2UsICpkX3BhZ2U7CisJdW5zaWduZWQgbG9uZyBzX29iamlkeCwgZF9vYmppZHg7CisJdW5zaWduZWQgbG9uZyBzX29mZiwgZF9vZmY7CisJdm9pZCAqc19hZGRyLCAqZF9hZGRyOworCWludCBzX3NpemUsIGRfc2l6ZSwgc2l6ZTsKKwlpbnQgd3JpdHRlbiA9IDA7CisKKwlzX3NpemUgPSBkX3NpemUgPSBjbGFzcy0+c2l6ZTsKKworCW9ial90b19sb2NhdGlvbihzcmMsICZzX3BhZ2UsICZzX29iamlkeCk7CisJb2JqX3RvX2xvY2F0aW9uKGRzdCwgJmRfcGFnZSwgJmRfb2JqaWR4KTsKKworCXNfb2ZmID0gb2JqX2lkeF90b19vZmZzZXQoc19wYWdlLCBzX29iamlkeCwgY2xhc3MtPnNpemUpOworCWRfb2ZmID0gb2JqX2lkeF90b19vZmZzZXQoZF9wYWdlLCBkX29iamlkeCwgY2xhc3MtPnNpemUpOworCisJaWYgKHNfb2ZmICsgY2xhc3MtPnNpemUgPiBQQUdFX1NJWkUpCisJCXNfc2l6ZSA9IFBBR0VfU0laRSAtIHNfb2ZmOworCisJaWYgKGRfb2ZmICsgY2xhc3MtPnNpemUgPiBQQUdFX1NJWkUpCisJCWRfc2l6ZSA9IFBBR0VfU0laRSAtIGRfb2ZmOworCisJc19hZGRyID0ga21hcF9hdG9taWMoc19wYWdlKTsKKwlkX2FkZHIgPSBrbWFwX2F0b21pYyhkX3BhZ2UpOworCisJd2hpbGUgKDEpIHsKKwkJc2l6ZSA9IG1pbihzX3NpemUsIGRfc2l6ZSk7CisJCW1lbWNweShkX2FkZHIgKyBkX29mZiwgc19hZGRyICsgc19vZmYsIHNpemUpOworCQl3cml0dGVuICs9IHNpemU7CisKKwkJaWYgKHdyaXR0ZW4gPT0gY2xhc3MtPnNpemUpCisJCQlicmVhazsKKworCQlzX29mZiArPSBzaXplOworCQlzX3NpemUgLT0gc2l6ZTsKKwkJZF9vZmYgKz0gc2l6ZTsKKwkJZF9zaXplIC09IHNpemU7CisKKwkJaWYgKHNfb2ZmID49IFBBR0VfU0laRSkgeworCQkJa3VubWFwX2F0b21pYyhkX2FkZHIpOworCQkJa3VubWFwX2F0b21pYyhzX2FkZHIpOworCQkJc19wYWdlID0gZ2V0X25leHRfcGFnZShzX3BhZ2UpOworCQkJQlVHX09OKCFzX3BhZ2UpOworCQkJc19hZGRyID0ga21hcF9hdG9taWMoc19wYWdlKTsKKwkJCWRfYWRkciA9IGttYXBfYXRvbWljKGRfcGFnZSk7CisJCQlzX3NpemUgPSBjbGFzcy0+c2l6ZSAtIHdyaXR0ZW47CisJCQlzX29mZiA9IDA7CisJCX0KKworCQlpZiAoZF9vZmYgPj0gUEFHRV9TSVpFKSB7CisJCQlrdW5tYXBfYXRvbWljKGRfYWRkcik7CisJCQlkX3BhZ2UgPSBnZXRfbmV4dF9wYWdlKGRfcGFnZSk7CisJCQlCVUdfT04oIWRfcGFnZSk7CisJCQlkX2FkZHIgPSBrbWFwX2F0b21pYyhkX3BhZ2UpOworCQkJZF9zaXplID0gY2xhc3MtPnNpemUgLSB3cml0dGVuOworCQkJZF9vZmYgPSAwOworCQl9CisJfQorCisJa3VubWFwX2F0b21pYyhkX2FkZHIpOworCWt1bm1hcF9hdG9taWMoc19hZGRyKTsKK30KKworLyoKKyAqIEZpbmQgYWxsb2NlZCBvYmplY3QgaW4genNwYWdlIGZyb20gaW5kZXggb2JqZWN0IGFuZAorICogcmV0dXJuIGhhbmRsZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZmluZF9hbGxvY2VkX29iaihzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IGluZGV4LAorCQkJCQlzdHJ1Y3Qgc2l6ZV9jbGFzcyAqY2xhc3MpCit7CisJdW5zaWduZWQgbG9uZyBoZWFkOworCWludCBvZmZzZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgaGFuZGxlID0gMDsKKwl2b2lkICphZGRyID0ga21hcF9hdG9taWMocGFnZSk7CisKKwlpZiAoIWlzX2ZpcnN0X3BhZ2UocGFnZSkpCisJCW9mZnNldCA9IHBhZ2UtPmluZGV4OworCW9mZnNldCArPSBjbGFzcy0+c2l6ZSAqIGluZGV4OworCisJd2hpbGUgKG9mZnNldCA8IFBBR0VfU0laRSkgeworCQloZWFkID0gb2JqX3RvX2hlYWQoY2xhc3MsIHBhZ2UsIGFkZHIgKyBvZmZzZXQpOworCQlpZiAoaGVhZCAmIE9CSl9BTExPQ0FURURfVEFHKSB7CisJCQloYW5kbGUgPSBoZWFkICYgfk9CSl9BTExPQ0FURURfVEFHOworCQkJaWYgKHRyeXBpbl90YWcoaGFuZGxlKSkKKwkJCQlicmVhazsKKwkJCWhhbmRsZSA9IDA7CisJCX0KKworCQlvZmZzZXQgKz0gY2xhc3MtPnNpemU7CisJCWluZGV4Kys7CisJfQorCisJa3VubWFwX2F0b21pYyhhZGRyKTsKKwlyZXR1cm4gaGFuZGxlOworfQorCitzdHJ1Y3QgenNfY29tcGFjdF9jb250cm9sIHsKKwkvKiBTb3VyY2UgcGFnZSBmb3IgbWlncmF0aW9uIHdoaWNoIGNvdWxkIGJlIGEgc3VicGFnZSBvZiB6c3BhZ2UuICovCisJc3RydWN0IHBhZ2UgKnNfcGFnZTsKKwkvKiBEZXN0aW5hdGlvbiBwYWdlIGZvciBtaWdyYXRpb24gd2hpY2ggc2hvdWxkIGJlIGEgZmlyc3QgcGFnZQorCSAqIG9mIHpzcGFnZS4gKi8KKwlzdHJ1Y3QgcGFnZSAqZF9wYWdlOworCSAvKiBTdGFydGluZyBvYmplY3QgaW5kZXggd2l0aGluIEBzX3BhZ2Ugd2hpY2ggdXNlZCBmb3IgbGl2ZSBvYmplY3QKKwkgICogaW4gdGhlIHN1YnBhZ2UuICovCisJaW50IGluZGV4OworCS8qIGhvdyBtYW55IG9mIG9iamVjdHMgYXJlIG1pZ3JhdGVkICovCisJaW50IG5yX21pZ3JhdGVkOworfTsKKworc3RhdGljIGludCBtaWdyYXRlX3pzcGFnZShzdHJ1Y3QgenNfcG9vbCAqcG9vbCwgc3RydWN0IHNpemVfY2xhc3MgKmNsYXNzLAorCQkJCXN0cnVjdCB6c19jb21wYWN0X2NvbnRyb2wgKmNjKQoreworCXVuc2lnbmVkIGxvbmcgdXNlZF9vYmosIGZyZWVfb2JqOworCXVuc2lnbmVkIGxvbmcgaGFuZGxlOworCXN0cnVjdCBwYWdlICpzX3BhZ2UgPSBjYy0+c19wYWdlOworCXN0cnVjdCBwYWdlICpkX3BhZ2UgPSBjYy0+ZF9wYWdlOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBjYy0+aW5kZXg7CisJaW50IG5yX21pZ3JhdGVkID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCXdoaWxlICgxKSB7CisJCWhhbmRsZSA9IGZpbmRfYWxsb2NlZF9vYmooc19wYWdlLCBpbmRleCwgY2xhc3MpOworCQlpZiAoIWhhbmRsZSkgeworCQkJc19wYWdlID0gZ2V0X25leHRfcGFnZShzX3BhZ2UpOworCQkJaWYgKCFzX3BhZ2UpCisJCQkJYnJlYWs7CisJCQlpbmRleCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFN0b3AgaWYgdGhlcmUgaXMgbm8gbW9yZSBzcGFjZSAqLworCQlpZiAoenNwYWdlX2Z1bGwoZF9wYWdlKSkgeworCQkJdW5waW5fdGFnKGhhbmRsZSk7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQl1c2VkX29iaiA9IGhhbmRsZV90b19vYmooaGFuZGxlKTsKKwkJZnJlZV9vYmogPSBvYmpfbWFsbG9jKGRfcGFnZSwgY2xhc3MsIGhhbmRsZSk7CisJCXpzX29iamVjdF9jb3B5KHVzZWRfb2JqLCBmcmVlX29iaiwgY2xhc3MpOworCQlpbmRleCsrOworCQlyZWNvcmRfb2JqKGhhbmRsZSwgZnJlZV9vYmopOworCQl1bnBpbl90YWcoaGFuZGxlKTsKKwkJb2JqX2ZyZWUocG9vbCwgY2xhc3MsIHVzZWRfb2JqKTsKKwkJbnJfbWlncmF0ZWQrKzsKKwl9CisKKwkvKiBSZW1lbWJlciBsYXN0IHBvc2l0aW9uIGluIHRoaXMgaXRlcmF0aW9uICovCisJY2MtPnNfcGFnZSA9IHNfcGFnZTsKKwljYy0+aW5kZXggPSBpbmRleDsKKwljYy0+bnJfbWlncmF0ZWQgPSBucl9taWdyYXRlZDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqYWxsb2NfdGFyZ2V0X3BhZ2Uoc3RydWN0IHNpemVfY2xhc3MgKmNsYXNzKQoreworCWludCBpOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJZm9yIChpID0gMDsgaSA8IF9aU19OUl9GVUxMTkVTU19HUk9VUFM7IGkrKykgeworCQlwYWdlID0gY2xhc3MtPmZ1bGxuZXNzX2xpc3RbaV07CisJCWlmIChwYWdlKSB7CisJCQlyZW1vdmVfenNwYWdlKHBhZ2UsIGNsYXNzLCBpKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyB2b2lkIHB1dGJhY2tfenNwYWdlKHN0cnVjdCB6c19wb29sICpwb29sLCBzdHJ1Y3Qgc2l6ZV9jbGFzcyAqY2xhc3MsCisJCQkJc3RydWN0IHBhZ2UgKmZpcnN0X3BhZ2UpCit7CisJZW51bSBmdWxsbmVzc19ncm91cCBmdWxsbmVzczsKKworCUJVR19PTighaXNfZmlyc3RfcGFnZShmaXJzdF9wYWdlKSk7CisKKwlmdWxsbmVzcyA9IGdldF9mdWxsbmVzc19ncm91cChmaXJzdF9wYWdlKTsKKwlpbnNlcnRfenNwYWdlKGZpcnN0X3BhZ2UsIGNsYXNzLCBmdWxsbmVzcyk7CisJc2V0X3pzcGFnZV9tYXBwaW5nKGZpcnN0X3BhZ2UsIGNsYXNzLT5pbmRleCwgZnVsbG5lc3MpOworCisJaWYgKGZ1bGxuZXNzID09IFpTX0VNUFRZKSB7CisJCXpzX3N0YXRfZGVjKGNsYXNzLCBPQkpfQUxMT0NBVEVELCBnZXRfbWF4b2JqX3Blcl96c3BhZ2UoCisJCQljbGFzcy0+c2l6ZSwgY2xhc3MtPnBhZ2VzX3Blcl96c3BhZ2UpKTsKKwkJYXRvbWljX2xvbmdfc3ViKGNsYXNzLT5wYWdlc19wZXJfenNwYWdlLAorCQkJCSZwb29sLT5wYWdlc19hbGxvY2F0ZWQpOworCisJCWZyZWVfenNwYWdlKGZpcnN0X3BhZ2UpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBwYWdlICppc29sYXRlX3NvdXJjZV9wYWdlKHN0cnVjdCBzaXplX2NsYXNzICpjbGFzcykKK3sKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCXBhZ2UgPSBjbGFzcy0+ZnVsbG5lc3NfbGlzdFtaU19BTE1PU1RfRU1QVFldOworCWlmIChwYWdlKQorCQlyZW1vdmVfenNwYWdlKHBhZ2UsIGNsYXNzLCBaU19BTE1PU1RfRU1QVFkpOworCisJcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fenNfY29tcGFjdChzdHJ1Y3QgenNfcG9vbCAqcG9vbCwKKwkJCQlzdHJ1Y3Qgc2l6ZV9jbGFzcyAqY2xhc3MpCit7CisJaW50IG5yX3RvX21pZ3JhdGU7CisJc3RydWN0IHpzX2NvbXBhY3RfY29udHJvbCBjYzsKKwlzdHJ1Y3QgcGFnZSAqc3JjX3BhZ2U7CisJc3RydWN0IHBhZ2UgKmRzdF9wYWdlID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIG5yX3RvdGFsX21pZ3JhdGVkID0gMDsKKworCXNwaW5fbG9jaygmY2xhc3MtPmxvY2spOworCXdoaWxlICgoc3JjX3BhZ2UgPSBpc29sYXRlX3NvdXJjZV9wYWdlKGNsYXNzKSkpIHsKKworCQlCVUdfT04oIWlzX2ZpcnN0X3BhZ2Uoc3JjX3BhZ2UpKTsKKworCQkvKiBUaGUgZ29hbCBpcyB0byBtaWdyYXRlIGFsbCBsaXZlIG9iamVjdHMgaW4gc291cmNlIHBhZ2UgKi8KKwkJbnJfdG9fbWlncmF0ZSA9IHNyY19wYWdlLT5pbnVzZTsKKwkJY2MuaW5kZXggPSAwOworCQljYy5zX3BhZ2UgPSBzcmNfcGFnZTsKKworCQl3aGlsZSAoKGRzdF9wYWdlID0gYWxsb2NfdGFyZ2V0X3BhZ2UoY2xhc3MpKSkgeworCQkJY2MuZF9wYWdlID0gZHN0X3BhZ2U7CisJCQkvKgorCQkJICogSWYgdGhlcmUgaXMgbm8gbW9yZSBzcGFjZSBpbiBkc3RfcGFnZSwgdHJ5IHRvCisJCQkgKiBhbGxvY2F0ZSBhbm90aGVyIHpzcGFnZS4KKwkJCSAqLworCQkJaWYgKCFtaWdyYXRlX3pzcGFnZShwb29sLCBjbGFzcywgJmNjKSkKKwkJCQlicmVhazsKKworCQkJcHV0YmFja196c3BhZ2UocG9vbCwgY2xhc3MsIGRzdF9wYWdlKTsKKwkJCW5yX3RvdGFsX21pZ3JhdGVkICs9IGNjLm5yX21pZ3JhdGVkOworCQkJbnJfdG9fbWlncmF0ZSAtPSBjYy5ucl9taWdyYXRlZDsKKwkJfQorCisJCS8qIFN0b3AgaWYgd2UgY291bGRuJ3QgZmluZCBzbG90ICovCisJCWlmIChkc3RfcGFnZSA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJcHV0YmFja196c3BhZ2UocG9vbCwgY2xhc3MsIGRzdF9wYWdlKTsKKwkJcHV0YmFja196c3BhZ2UocG9vbCwgY2xhc3MsIHNyY19wYWdlKTsKKwkJc3Bpbl91bmxvY2soJmNsYXNzLT5sb2NrKTsKKwkJbnJfdG90YWxfbWlncmF0ZWQgKz0gY2MubnJfbWlncmF0ZWQ7CisJCWNvbmRfcmVzY2hlZCgpOworCQlzcGluX2xvY2soJmNsYXNzLT5sb2NrKTsKKwl9CisKKwlpZiAoc3JjX3BhZ2UpCisJCXB1dGJhY2tfenNwYWdlKHBvb2wsIGNsYXNzLCBzcmNfcGFnZSk7CisKKwlzcGluX3VubG9jaygmY2xhc3MtPmxvY2spOworCisJcmV0dXJuIG5yX3RvdGFsX21pZ3JhdGVkOworfQorCit1bnNpZ25lZCBsb25nIHpzX2NvbXBhY3Qoc3RydWN0IHpzX3Bvb2wgKnBvb2wpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBucl9taWdyYXRlZCA9IDA7CisJc3RydWN0IHNpemVfY2xhc3MgKmNsYXNzOworCisJZm9yIChpID0genNfc2l6ZV9jbGFzc2VzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJY2xhc3MgPSBwb29sLT5zaXplX2NsYXNzW2ldOworCQlpZiAoIWNsYXNzKQorCQkJY29udGludWU7CisJCWlmIChjbGFzcy0+aW5kZXggIT0gaSkKKwkJCWNvbnRpbnVlOworCQlucl9taWdyYXRlZCArPSBfX3pzX2NvbXBhY3QocG9vbCwgY2xhc3MpOworCX0KKworCXJldHVybiBucl9taWdyYXRlZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHpzX2NvbXBhY3QpOworCiAvKioKICAqIHpzX2NyZWF0ZV9wb29sIC0gQ3JlYXRlcyBhbiBhbGxvY2F0aW9uIHBvb2wgdG8gd29yayBmcm9tLgogICogQGZsYWdzOiBhbGxvY2F0aW9uIGZsYWdzIHVzZWQgdG8gYWxsb2NhdGUgcG9vbCBtZXRhZGF0YQpAQCAtMTM1NSwxOSArMTc5NCwxOSBAQAogCWlmICghcG9vbCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlwb29sLT5uYW1lID0ga3N0cmR1cChuYW1lLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXBvb2wtPm5hbWUpIHsKKwlwb29sLT5zaXplX2NsYXNzID0ga2NhbGxvYyh6c19zaXplX2NsYXNzZXMsIHNpemVvZihzdHJ1Y3Qgc2l6ZV9jbGFzcyAqKSwKKwkJCUdGUF9LRVJORUwpOworCWlmICghcG9vbC0+c2l6ZV9jbGFzcykgewogCQlrZnJlZShwb29sKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JcG9vbC0+c2l6ZV9jbGFzcyA9IGtjYWxsb2MoenNfc2l6ZV9jbGFzc2VzLCBzaXplb2Yoc3RydWN0IHNpemVfY2xhc3MgKiksCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXBvb2wtPnNpemVfY2xhc3MpIHsKLQkJa2ZyZWUocG9vbC0+bmFtZSk7Ci0JCWtmcmVlKHBvb2wpOwotCQlyZXR1cm4gTlVMTDsKLQl9CisJcG9vbC0+bmFtZSA9IGtzdHJkdXAobmFtZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwb29sLT5uYW1lKQorCQlnb3RvIGVycjsKKworCWlmIChjcmVhdGVfaGFuZGxlX2NhY2hlKHBvb2wpKQorCQlnb3RvIGVycjsKIAogCS8qCiAJICogSXRlcmF0ZSByZXZlcnNseSwgYmVjYXVzZSwgc2l6ZSBvZiBzaXplX2NsYXNzIHRoYXQgd2Ugd2FudCB0byB1c2UKQEAgLTE0MDYsNiArMTg0NSw5IEBACiAJCWNsYXNzLT5zaXplID0gc2l6ZTsKIAkJY2xhc3MtPmluZGV4ID0gaTsKIAkJY2xhc3MtPnBhZ2VzX3Blcl96c3BhZ2UgPSBwYWdlc19wZXJfenNwYWdlOworCQlpZiAocGFnZXNfcGVyX3pzcGFnZSA9PSAxICYmCisJCQlnZXRfbWF4b2JqX3Blcl96c3BhZ2Uoc2l6ZSwgcGFnZXNfcGVyX3pzcGFnZSkgPT0gMSkKKwkJCWNsYXNzLT5odWdlID0gdHJ1ZTsKIAkJc3Bpbl9sb2NrX2luaXQoJmNsYXNzLT5sb2NrKTsKIAkJcG9vbC0+c2l6ZV9jbGFzc1tpXSA9IGNsYXNzOwogCkBAIC0xNDUwLDYgKzE4OTIsNyBAQAogCQlrZnJlZShjbGFzcyk7CiAJfQogCisJZGVzdHJveV9oYW5kbGVfY2FjaGUocG9vbCk7CiAJa2ZyZWUocG9vbC0+c2l6ZV9jbGFzcyk7CiAJa2ZyZWUocG9vbC0+bmFtZSk7CiAJa2ZyZWUocG9vbCk7CmRpZmYgLS1naXQgYS9uZXQvNmxvd3Bhbi9LY29uZmlnIGIvbmV0LzZsb3dwYW4vS2NvbmZpZwppbmRleCBlNGEwMmVmLi43ZmEwZjM4IDEwMDY0NAotLS0gYS9uZXQvNmxvd3Bhbi9LY29uZmlnCisrKyBiL25ldC82bG93cGFuL0tjb25maWcKQEAgLTEsNiArMSw2MSBAQAotY29uZmlnIDZMT1dQQU4KK21lbnVjb25maWcgNkxPV1BBTgogCXRyaXN0YXRlICI2TG9XUEFOIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBJUFY2CiAJLS0taGVscC0tLQogCSAgVGhpcyBlbmFibGVzIElQdjYgb3ZlciBMb3cgcG93ZXIgV2lyZWxlc3MgUGVyc29uYWwgQXJlYSBOZXR3b3JrIC0KIAkgICI2TG9XUEFOIiB3aGljaCBpcyBzdXBwb3J0ZWQgYnkgSUVFRSA4MDIuMTUuNCBvciBCbHVldG9vdGggc3RhY2tzLgorCittZW51Y29uZmlnIDZMT1dQQU5fTkhDCisJdHJpc3RhdGUgIk5leHQgSGVhZGVyIENvbXByZXNzaW9uIFN1cHBvcnQiCisJZGVwZW5kcyBvbiA2TE9XUEFOCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgU3VwcG9ydCBmb3IgbmV4dCBoZWFkZXIgY29tcHJlc3Npb24uCisKK2lmIDZMT1dQQU5fTkhDCisKK2NvbmZpZyA2TE9XUEFOX05IQ19ERVNUCisJdHJpc3RhdGUgIkRlc3RpbmF0aW9uIE9wdGlvbnMgSGVhZGVyIFN1cHBvcnQiCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgNkxvV1BBTiBJUHY2IERlc3RpbmF0aW9uIE9wdGlvbnMgSGVhZGVyIGNvbXByZXNzaW9uIGFjY29yZGluZyB0bworCSAgUkZDNjI4Mi4KKworY29uZmlnIDZMT1dQQU5fTkhDX0ZSQUdNRU5UCisJdHJpc3RhdGUgIkZyYWdtZW50IEhlYWRlciBTdXBwb3J0IgorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIDZMb1dQQU4gSVB2NiBGcmFnbWVudCBIZWFkZXIgY29tcHJlc3Npb24gYWNjb3JkaW5nIHRvIFJGQzYyODIuCisKK2NvbmZpZyA2TE9XUEFOX05IQ19IT1AKKwl0cmlzdGF0ZSAiSG9wLWJ5LUhvcCBPcHRpb25zIEhlYWRlciBTdXBwb3J0IgorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIDZMb1dQQU4gSVB2NiBIb3AtYnktSG9wIE9wdGlvbnMgSGVhZGVyIGNvbXByZXNzaW9uIGFjY29yZGluZyB0bworCSAgUkZDNjI4Mi4KKworY29uZmlnIDZMT1dQQU5fTkhDX0lQVjYKKwl0cmlzdGF0ZSAiSVB2NiBIZWFkZXIgU3VwcG9ydCIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICA2TG9XUEFOIElQdjYgSGVhZGVyIGNvbXByZXNzaW9uIGFjY29yZGluZyB0byBSRkM2MjgyLgorCitjb25maWcgNkxPV1BBTl9OSENfTU9CSUxJVFkKKwl0cmlzdGF0ZSAiTW9iaWxpdHkgSGVhZGVyIFN1cHBvcnQiCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgNkxvV1BBTiBJUHY2IE1vYmlsaXR5IEhlYWRlciBjb21wcmVzc2lvbiBhY2NvcmRpbmcgdG8gUkZDNjI4Mi4KKworY29uZmlnIDZMT1dQQU5fTkhDX1JPVVRJTkcKKwl0cmlzdGF0ZSAiUm91dGluZyBIZWFkZXIgU3VwcG9ydCIKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICA2TG9XUEFOIElQdjYgUm91dGluZyBIZWFkZXIgY29tcHJlc3Npb24gYWNjb3JkaW5nIHRvIFJGQzYyODIuCisKK2NvbmZpZyA2TE9XUEFOX05IQ19VRFAKKwl0cmlzdGF0ZSAiVURQIEhlYWRlciBTdXBwb3J0IgorCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIDZMb1dQQU4gSVB2NiBVRFAgSGVhZGVyIGNvbXByZXNzaW9uIGFjY29yZGluZyB0byBSRkM2MjgyLgorCitlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0LzZsb3dwYW4vTWFrZWZpbGUgYi9uZXQvNmxvd3Bhbi9NYWtlZmlsZQppbmRleCA0MTU4ODZiLi5lYjhiYWE3IDEwMDY0NAotLS0gYS9uZXQvNmxvd3Bhbi9NYWtlZmlsZQorKysgYi9uZXQvNmxvd3Bhbi9NYWtlZmlsZQpAQCAtMSwzICsxLDEyIEBACi1vYmotJChDT05GSUdfNkxPV1BBTikgOj0gNmxvd3Bhbi5vCitvYmotJChDT05GSUdfNkxPV1BBTikgKz0gNmxvd3Bhbi5vCiAKLTZsb3dwYW4teSA6PSBpcGhjLm8KKzZsb3dwYW4teSA6PSBpcGhjLm8gbmhjLm8KKworI3JmYzYyODIgbmhjcworb2JqLSQoQ09ORklHXzZMT1dQQU5fTkhDX0RFU1QpICs9IG5oY19kZXN0Lm8KK29iai0kKENPTkZJR182TE9XUEFOX05IQ19GUkFHTUVOVCkgKz0gbmhjX2ZyYWdtZW50Lm8KK29iai0kKENPTkZJR182TE9XUEFOX05IQ19IT1ApICs9IG5oY19ob3Aubworb2JqLSQoQ09ORklHXzZMT1dQQU5fTkhDX0lQVjYpICs9IG5oY19pcHY2Lm8KK29iai0kKENPTkZJR182TE9XUEFOX05IQ19NT0JJTElUWSkgKz0gbmhjX21vYmlsaXR5Lm8KK29iai0kKENPTkZJR182TE9XUEFOX05IQ19ST1VUSU5HKSArPSBuaGNfcm91dGluZy5vCitvYmotJChDT05GSUdfNkxPV1BBTl9OSENfVURQKSArPSBuaGNfdWRwLm8KZGlmZiAtLWdpdCBhL25ldC82bG93cGFuL2lwaGMuYyBiL25ldC82bG93cGFuL2lwaGMuYwppbmRleCAzMmZmZWM2Li45NGEzNzVjIDEwMDY0NAotLS0gYS9uZXQvNmxvd3Bhbi9pcGhjLmMKKysrIGIvbmV0LzZsb3dwYW4vaXBoYy5jCkBAIC01NCw2ICs1NCw4IEBACiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvYWZfaWVlZTgwMjE1NC5oPgogCisjaW5jbHVkZSAibmhjLmgiCisKIC8qIFVuY29tcHJlc3MgYWRkcmVzcyBmdW5jdGlvbiBmb3Igc291cmNlIGFuZAogICogZGVzdGluYXRpb24gYWRkcmVzcyhub24tbXVsdGljYXN0KS4KICAqCkBAIC0yMjQsNzcgKzIyNiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdW5jb21wcmVzc191ZHBfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB1ZHBoZHIgKnVoKQotewotCWJvb2wgZmFpbDsKLQl1OCB0bXAgPSAwLCB2YWwgPSAwOwotCi0JZmFpbCA9IGxvd3Bhbl9mZXRjaF9za2Ioc2tiLCAmdG1wLCBzaXplb2YodG1wKSk7Ci0KLQlpZiAoKHRtcCAmIExPV1BBTl9OSENfVURQX01BU0spID09IExPV1BBTl9OSENfVURQX0lEKSB7Ci0JCXByX2RlYnVnKCJVRFAgaGVhZGVyIHVuY29tcHJlc3Npb25cbiIpOwotCQlzd2l0Y2ggKHRtcCAmIExPV1BBTl9OSENfVURQX0NTX1BfMTEpIHsKLQkJY2FzZSBMT1dQQU5fTkhDX1VEUF9DU19QXzAwOgotCQkJZmFpbCB8PSBsb3dwYW5fZmV0Y2hfc2tiKHNrYiwgJnVoLT5zb3VyY2UsCi0JCQkJCQkgc2l6ZW9mKHVoLT5zb3VyY2UpKTsKLQkJCWZhaWwgfD0gbG93cGFuX2ZldGNoX3NrYihza2IsICZ1aC0+ZGVzdCwKLQkJCQkJCSBzaXplb2YodWgtPmRlc3QpKTsKLQkJCWJyZWFrOwotCQljYXNlIExPV1BBTl9OSENfVURQX0NTX1BfMDE6Ci0JCQlmYWlsIHw9IGxvd3Bhbl9mZXRjaF9za2Ioc2tiLCAmdWgtPnNvdXJjZSwKLQkJCQkJCSBzaXplb2YodWgtPnNvdXJjZSkpOwotCQkJZmFpbCB8PSBsb3dwYW5fZmV0Y2hfc2tiKHNrYiwgJnZhbCwgc2l6ZW9mKHZhbCkpOwotCQkJdWgtPmRlc3QgPSBodG9ucyh2YWwgKyBMT1dQQU5fTkhDX1VEUF84QklUX1BPUlQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTE9XUEFOX05IQ19VRFBfQ1NfUF8xMDoKLQkJCWZhaWwgfD0gbG93cGFuX2ZldGNoX3NrYihza2IsICZ2YWwsIHNpemVvZih2YWwpKTsKLQkJCXVoLT5zb3VyY2UgPSBodG9ucyh2YWwgKyBMT1dQQU5fTkhDX1VEUF84QklUX1BPUlQpOwotCQkJZmFpbCB8PSBsb3dwYW5fZmV0Y2hfc2tiKHNrYiwgJnVoLT5kZXN0LAotCQkJCQkJIHNpemVvZih1aC0+ZGVzdCkpOwotCQkJYnJlYWs7Ci0JCWNhc2UgTE9XUEFOX05IQ19VRFBfQ1NfUF8xMToKLQkJCWZhaWwgfD0gbG93cGFuX2ZldGNoX3NrYihza2IsICZ2YWwsIHNpemVvZih2YWwpKTsKLQkJCXVoLT5zb3VyY2UgPSBodG9ucyhMT1dQQU5fTkhDX1VEUF80QklUX1BPUlQgKwotCQkJCQkgICAodmFsID4+IDQpKTsKLQkJCXVoLT5kZXN0ID0gaHRvbnMoTE9XUEFOX05IQ19VRFBfNEJJVF9QT1JUICsKLQkJCQkJICh2YWwgJiAweDBmKSk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXByX2RlYnVnKCJFUlJPUjogdW5rbm93biBVRFAgZm9ybWF0XG4iKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0KLQkJcHJfZGVidWcoInVuY29tcHJlc3NlZCBVRFAgcG9ydHM6IHNyYyA9ICVkLCBkc3QgPSAlZFxuIiwKLQkJCSBudG9ocyh1aC0+c291cmNlKSwgbnRvaHModWgtPmRlc3QpKTsKLQotCQkvKiBjaGVja3N1bSAqLwotCQlpZiAodG1wICYgTE9XUEFOX05IQ19VRFBfQ1NfQykgewotCQkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoImNoZWNrc3VtIGVsaWRlZCBjdXJyZW50bHkgbm90IHN1cHBvcnRlZFxuIik7Ci0JCQlnb3RvIGVycjsKLQkJfSBlbHNlIHsKLQkJCWZhaWwgfD0gbG93cGFuX2ZldGNoX3NrYihza2IsICZ1aC0+Y2hlY2ssCi0JCQkJCQkgc2l6ZW9mKHVoLT5jaGVjaykpOwotCQl9Ci0KLQkJLyogVURQIGxlbmd0aCBuZWVkcyB0byBiZSBpbmZlcmVkIGZyb20gdGhlIGxvd2VyIGxheWVycwotCQkgKiBoZXJlLCB3ZSBvYnRhaW4gdGhlIGhpbnQgZnJvbSB0aGUgcmVtYWluaW5nIHNpemUgb2YgdGhlCi0JCSAqIGZyYW1lCi0JCSAqLwotCQl1aC0+bGVuID0gaHRvbnMoc2tiLT5sZW4gKyBzaXplb2Yoc3RydWN0IHVkcGhkcikpOwotCQlwcl9kZWJ1ZygidW5jb21wcmVzc2VkIFVEUCBsZW5ndGg6IHNyYyA9ICVkIiwgbnRvaHModWgtPmxlbikpOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJFUlJPUjogdW5zdXBwb3J0ZWQgTkggZm9ybWF0XG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKGZhaWwpCi0JCWdvdG8gZXJyOwotCi0JcmV0dXJuIDA7Ci1lcnI6Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KIC8qIFRUTCB1bmNvbXByZXNzaW9uIHZhbHVlcyAqLwogc3RhdGljIGNvbnN0IHU4IGxvd3Bhbl90dGxfdmFsdWVzW10gPSB7IDAsIDEsIDY0LCAyNTUgfTsKIApAQCAtNDI1LDI5ICszNTYsMTEgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCS8qIFVEUCBkYXRhIHVuY29tcHJlc3Npb24gKi8KKwkvKiBOZXh0IGhlYWRlciBkYXRhIHVuY29tcHJlc3Npb24gKi8KIAlpZiAoaXBoYzAgJiBMT1dQQU5fSVBIQ19OSF9DKSB7Ci0JCXN0cnVjdCB1ZHBoZHIgdWg7Ci0JCWNvbnN0IGludCBuZWVkZWQgPSBzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBzaXplb2YoaGRyKTsKLQotCQlpZiAodW5jb21wcmVzc191ZHBfaGVhZGVyKHNrYiwgJnVoKSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCS8qIHJlcGxhY2UgdGhlIGNvbXByZXNzZWQgVURQIGhlYWQgYnkgdGhlIHVuY29tcHJlc3NlZCBVRFAKLQkJICogaGVhZGVyCi0JCSAqLwotCQllcnIgPSBza2JfY293KHNrYiwgbmVlZGVkKTsKLQkJaWYgKHVubGlrZWx5KGVycikpCisJCWVyciA9IGxvd3Bhbl9uaGNfZG9fdW5jb21wcmVzc2lvbihza2IsIGRldiwgJmhkcik7CisJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKLQotCQlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7Ci0JCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7Ci0JCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKHNrYiwgJnVoLCBzaXplb2Yoc3RydWN0IHVkcGhkcikpOwotCi0JCXJhd19kdW1wX3RhYmxlKF9fZnVuY19fLCAicmF3IFVEUCBoZWFkZXIgZHVtcCIsCi0JCQkgICAgICAgKHU4ICopJnVoLCBzaXplb2YodWgpKTsKLQotCQloZHIubmV4dGhkciA9IFVJUF9QUk9UT19VRFA7CiAJfSBlbHNlIHsKIAkJZXJyID0gc2tiX2Nvdyhza2IsIHNpemVvZihoZHIpKTsKIAkJaWYgKHVubGlrZWx5KGVycikpCkBAIC01MDAsNzEgKzQxMyw2IEBACiAJcmV0dXJuIHJvbDgodmFsLCBzaGlmdCk7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbXByZXNzX3VkcF9oZWFkZXIodTggKipoY19wdHIsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IHVkcGhkciAqdWg7Ci0JdTggdG1wOwotCi0JLyogSW4gdGhlIGNhc2Ugb2YgUkFXIHNvY2tldHMgdGhlIHRyYW5zcG9ydCBoZWFkZXIgaXMgbm90IHNldCBieQotCSAqIHRoZSBpcDYgc3RhY2sgc28gd2UgbXVzdCBzZXQgaXQgb3Vyc2VsdmVzCi0JICovCi0JaWYgKHNrYi0+dHJhbnNwb3J0X2hlYWRlciA9PSBza2ItPm5ldHdvcmtfaGVhZGVyKQotCQlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKLQotCXVoID0gdWRwX2hkcihza2IpOwotCi0JaWYgKCgobnRvaHModWgtPnNvdXJjZSkgJiBMT1dQQU5fTkhDX1VEUF80QklUX01BU0spID09Ci0JICAgICBMT1dQQU5fTkhDX1VEUF80QklUX1BPUlQpICYmCi0JICAgICgobnRvaHModWgtPmRlc3QpICYgTE9XUEFOX05IQ19VRFBfNEJJVF9NQVNLKSA9PQotCSAgICAgTE9XUEFOX05IQ19VRFBfNEJJVF9QT1JUKSkgewotCQlwcl9kZWJ1ZygiVURQIGhlYWRlcjogYm90aCBwb3J0cyBjb21wcmVzc2lvbiB0byA0IGJpdHNcbiIpOwotCQkvKiBjb21wcmVzc2lvbiB2YWx1ZSAqLwotCQl0bXAgPSBMT1dQQU5fTkhDX1VEUF9DU19QXzExOwotCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnRtcCwgc2l6ZW9mKHRtcCkpOwotCQkvKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvcnQgKi8KLQkJdG1wID0gbnRvaHModWgtPmRlc3QpIC0gTE9XUEFOX05IQ19VRFBfNEJJVF9QT1JUICsKLQkJICAgICAgKChudG9ocyh1aC0+c291cmNlKSAtIExPV1BBTl9OSENfVURQXzRCSVRfUE9SVCkgPDwgNCk7Ci0JCWxvd3Bhbl9wdXNoX2hjX2RhdGEoaGNfcHRyLCAmdG1wLCBzaXplb2YodG1wKSk7Ci0JfSBlbHNlIGlmICgobnRvaHModWgtPmRlc3QpICYgTE9XUEFOX05IQ19VRFBfOEJJVF9NQVNLKSA9PQotCQkJTE9XUEFOX05IQ19VRFBfOEJJVF9QT1JUKSB7Ci0JCXByX2RlYnVnKCJVRFAgaGVhZGVyOiByZW1vdmUgOCBiaXRzIG9mIGRlc3RcbiIpOwotCQkvKiBjb21wcmVzc2lvbiB2YWx1ZSAqLwotCQl0bXAgPSBMT1dQQU5fTkhDX1VEUF9DU19QXzAxOwotCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnRtcCwgc2l6ZW9mKHRtcCkpOwotCQkvKiBzb3VyY2UgcG9ydCAqLwotCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnVoLT5zb3VyY2UsIHNpemVvZih1aC0+c291cmNlKSk7Ci0JCS8qIGRlc3RpbmF0aW9uIHBvcnQgKi8KLQkJdG1wID0gbnRvaHModWgtPmRlc3QpIC0gTE9XUEFOX05IQ19VRFBfOEJJVF9QT1JUOwotCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnRtcCwgc2l6ZW9mKHRtcCkpOwotCX0gZWxzZSBpZiAoKG50b2hzKHVoLT5zb3VyY2UpICYgTE9XUEFOX05IQ19VRFBfOEJJVF9NQVNLKSA9PQotCQkJTE9XUEFOX05IQ19VRFBfOEJJVF9QT1JUKSB7Ci0JCXByX2RlYnVnKCJVRFAgaGVhZGVyOiByZW1vdmUgOCBiaXRzIG9mIHNvdXJjZVxuIik7Ci0JCS8qIGNvbXByZXNzaW9uIHZhbHVlICovCi0JCXRtcCA9IExPV1BBTl9OSENfVURQX0NTX1BfMTA7Ci0JCWxvd3Bhbl9wdXNoX2hjX2RhdGEoaGNfcHRyLCAmdG1wLCBzaXplb2YodG1wKSk7Ci0JCS8qIHNvdXJjZSBwb3J0ICovCi0JCXRtcCA9IG50b2hzKHVoLT5zb3VyY2UpIC0gTE9XUEFOX05IQ19VRFBfOEJJVF9QT1JUOwotCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnRtcCwgc2l6ZW9mKHRtcCkpOwotCQkvKiBkZXN0aW5hdGlvbiBwb3J0ICovCi0JCWxvd3Bhbl9wdXNoX2hjX2RhdGEoaGNfcHRyLCAmdWgtPmRlc3QsIHNpemVvZih1aC0+ZGVzdCkpOwotCX0gZWxzZSB7Ci0JCXByX2RlYnVnKCJVRFAgaGVhZGVyOiBjYW4ndCBjb21wcmVzc1xuIik7Ci0JCS8qIGNvbXByZXNzaW9uIHZhbHVlICovCi0JCXRtcCA9IExPV1BBTl9OSENfVURQX0NTX1BfMDA7Ci0JCWxvd3Bhbl9wdXNoX2hjX2RhdGEoaGNfcHRyLCAmdG1wLCBzaXplb2YodG1wKSk7Ci0JCS8qIHNvdXJjZSBwb3J0ICovCi0JCWxvd3Bhbl9wdXNoX2hjX2RhdGEoaGNfcHRyLCAmdWgtPnNvdXJjZSwgc2l6ZW9mKHVoLT5zb3VyY2UpKTsKLQkJLyogZGVzdGluYXRpb24gcG9ydCAqLwotCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnVoLT5kZXN0LCBzaXplb2YodWgtPmRlc3QpKTsKLQl9Ci0KLQkvKiBjaGVja3N1bSBpcyBhbHdheXMgaW5saW5lICovCi0JbG93cGFuX3B1c2hfaGNfZGF0YShoY19wdHIsICZ1aC0+Y2hlY2ssIHNpemVvZih1aC0+Y2hlY2spKTsKLQotCS8qIHNraXAgdGhlIFVEUCBoZWFkZXIgKi8KLQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7Ci19Ci0KIGludCBsb3dwYW5faGVhZGVyX2NvbXByZXNzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCBjb25zdCB2b2lkICpfZGFkZHIsCiAJCQkgICBjb25zdCB2b2lkICpfc2FkZHIsIHVuc2lnbmVkIGludCBsZW4pCkBAIC01NzIsNyArNDIwLDcgQEAKIAl1OCB0bXAsIGlwaGMwLCBpcGhjMSwgKmhjX3B0cjsKIAlzdHJ1Y3QgaXB2NmhkciAqaGRyOwogCXU4IGhlYWRbMTAwXSA9IHt9OwotCWludCBhZGRyX3R5cGU7CisJaW50IHJldCwgYWRkcl90eXBlOwogCiAJaWYgKHR5cGUgIT0gRVRIX1BfSVBWNikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02NDksMTMgKzQ5NywxMiBAQAogCiAJLyogTk9URTogcGF5bG9hZCBsZW5ndGggaXMgYWx3YXlzIGNvbXByZXNzZWQgKi8KIAotCS8qIE5leHQgSGVhZGVyIGlzIGNvbXByZXNzIGlmIFVEUCAqLwotCWlmIChoZHItPm5leHRoZHIgPT0gVUlQX1BST1RPX1VEUCkKLQkJaXBoYzAgfD0gTE9XUEFOX0lQSENfTkhfQzsKLQotCWlmICgoaXBoYzAgJiBMT1dQQU5fSVBIQ19OSF9DKSA9PSAwKQotCQlsb3dwYW5fcHVzaF9oY19kYXRhKCZoY19wdHIsICZoZHItPm5leHRoZHIsCi0JCQkJICAgIHNpemVvZihoZHItPm5leHRoZHIpKTsKKwkvKiBDaGVjayBpZiB3ZSBwcm92aWRlIHRoZSBuaGMgZm9ybWF0IGZvciBuZXh0aGRyIGFuZCBjb21wcmVzc2lvbgorCSAqIGZ1bmN0aW9uYWxpdHkuIElmIG5vdCBuZXh0aGRyIGlzIGhhbmRsZWQgaW5saW5lIGFuZCBub3QgY29tcHJlc3NlZC4KKwkgKi8KKwlyZXQgPSBsb3dwYW5fbmhjX2NoZWNrX2NvbXByZXNzaW9uKHNrYiwgaGRyLCAmaGNfcHRyLCAmaXBoYzApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OwogCiAJLyogSG9wIGxpbWl0CiAJICogaWYgMTogICBjb21wcmVzcywgZW5jb2RpbmcgaXMgMDEKQEAgLTc0MSw5ICs1ODgsMTIgQEAKIAkJfQogCX0KIAotCS8qIFVEUCBoZWFkZXIgY29tcHJlc3Npb24gKi8KLQlpZiAoaGRyLT5uZXh0aGRyID09IFVJUF9QUk9UT19VRFApCi0JCWNvbXByZXNzX3VkcF9oZWFkZXIoJmhjX3B0ciwgc2tiKTsKKwkvKiBuZXh0IGhlYWRlciBjb21wcmVzc2lvbiAqLworCWlmIChpcGhjMCAmIExPV1BBTl9JUEhDX05IX0MpIHsKKwkJcmV0ID0gbG93cGFuX25oY19kb19jb21wcmVzc2lvbihza2IsIGhkciwgJmhjX3B0cik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CiAKIAloZWFkWzBdID0gaXBoYzA7CiAJaGVhZFsxXSA9IGlwaGMxOwpAQCAtNzYxLDQgKzYxMSwxOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobG93cGFuX2hlYWRlcl9jb21wcmVzcyk7CiAKK3N0YXRpYyBpbnQgX19pbml0IGxvd3Bhbl9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJlcXVlc3RfbW9kdWxlX25vd2FpdCgibmhjX2Rlc3QiKTsKKwlyZXF1ZXN0X21vZHVsZV9ub3dhaXQoIm5oY19mcmFnbWVudCIpOworCXJlcXVlc3RfbW9kdWxlX25vd2FpdCgibmhjX2hvcCIpOworCXJlcXVlc3RfbW9kdWxlX25vd2FpdCgibmhjX2lwdjYiKTsKKwlyZXF1ZXN0X21vZHVsZV9ub3dhaXQoIm5oY19tb2JpbGl0eSIpOworCXJlcXVlc3RfbW9kdWxlX25vd2FpdCgibmhjX3JvdXRpbmciKTsKKwlyZXF1ZXN0X21vZHVsZV9ub3dhaXQoIm5oY191ZHAiKTsKKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQobG93cGFuX21vZHVsZV9pbml0KTsKKwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0LzZsb3dwYW4vbmhjLmMgYi9uZXQvNmxvd3Bhbi9uaGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDIwZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0LzZsb3dwYW4vbmhjLmMKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKgk2TG9XUEFOIG5leHQgaGVhZGVyIGNvbXByZXNzaW9uCisgKgorICoKKyAqCUF1dGhvcnM6CisgKglBbGV4YW5kZXIgQXJpbmcJCTxhYXJAcGVuZ3V0cm9uaXguZGU+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorCisjaW5jbHVkZSAibmhjLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcmJfcm9vdCByYl9yb290ID0gUkJfUk9PVDsKK3N0YXRpYyBzdHJ1Y3QgbG93cGFuX25oYyAqbG93cGFuX25leHRoZHJfbmhjc1tORVhUSERSX01BWF07CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvd3Bhbl9uaGNfbG9jayk7CisKK3N0YXRpYyBpbnQgbG93cGFuX25oY19pbnNlcnQoc3RydWN0IGxvd3Bhbl9uaGMgKm5oYykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5ldyA9ICZyYl9yb290LnJiX25vZGUsICpwYXJlbnQgPSBOVUxMOworCisJLyogRmlndXJlIG91dCB3aGVyZSB0byBwdXQgbmV3IG5vZGUgKi8KKwl3aGlsZSAoKm5ldykgeworCQlzdHJ1Y3QgbG93cGFuX25oYyAqdGhpcyA9IGNvbnRhaW5lcl9vZigqbmV3LCBzdHJ1Y3QgbG93cGFuX25oYywKKwkJCQkJCSAgICAgICBub2RlKTsKKwkJaW50IHJlc3VsdCwgbGVuX2RpZiwgbGVuOworCisJCWxlbl9kaWYgPSBuaGMtPmlkbGVuIC0gdGhpcy0+aWRsZW47CisKKwkJaWYgKG5oYy0+aWRsZW4gPCB0aGlzLT5pZGxlbikKKwkJCWxlbiA9IG5oYy0+aWRsZW47CisJCWVsc2UKKwkJCWxlbiA9IHRoaXMtPmlkbGVuOworCisJCXJlc3VsdCA9IG1lbWNtcChuaGMtPmlkLCB0aGlzLT5pZCwgbGVuKTsKKwkJaWYgKCFyZXN1bHQpCisJCQlyZXN1bHQgPSBsZW5fZGlmOworCisJCXBhcmVudCA9ICpuZXc7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJbmV3ID0gJigoKm5ldyktPnJiX2xlZnQpOworCQllbHNlIGlmIChyZXN1bHQgPiAwKQorCQkJbmV3ID0gJigoKm5ldyktPnJiX3JpZ2h0KTsKKwkJZWxzZQorCQkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJLyogQWRkIG5ldyBub2RlIGFuZCByZWJhbGFuY2UgdHJlZS4gKi8KKwlyYl9saW5rX25vZGUoJm5oYy0+bm9kZSwgcGFyZW50LCBuZXcpOworCXJiX2luc2VydF9jb2xvcigmbmhjLT5ub2RlLCAmcmJfcm9vdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbG93cGFuX25oY19yZW1vdmUoc3RydWN0IGxvd3Bhbl9uaGMgKm5oYykKK3sKKwlyYl9lcmFzZSgmbmhjLT5ub2RlLCAmcmJfcm9vdCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbG93cGFuX25oYyAqbG93cGFuX25oY19ieV9uaGNpZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCByYl9ub2RlICpub2RlID0gcmJfcm9vdC5yYl9ub2RlOworCWNvbnN0IHU4ICpuaGNpZF9za2JfcHRyID0gc2tiLT5kYXRhOworCisJd2hpbGUgKG5vZGUpIHsKKwkJc3RydWN0IGxvd3Bhbl9uaGMgKm5oYyA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgbG93cGFuX25oYywKKwkJCQkJCSAgICAgIG5vZGUpOworCQl1OCBuaGNpZF9za2JfcHRyX21hc2tlZFtMT1dQQU5fTkhDX01BWF9JRF9MRU5dOworCQlpbnQgcmVzdWx0LCBpOworCisJCWlmIChuaGNpZF9za2JfcHRyICsgbmhjLT5pZGxlbiA+IHNrYi0+ZGF0YSArIHNrYi0+bGVuKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJLyogY29weSBhbmQgbWFzayBhZnRlcndhcmRzIHRoZSBuaGlkIHZhbHVlIGZyb20gc2tiICovCisJCW1lbWNweShuaGNpZF9za2JfcHRyX21hc2tlZCwgbmhjaWRfc2tiX3B0ciwgbmhjLT5pZGxlbik7CisJCWZvciAoaSA9IDA7IGkgPCBuaGMtPmlkbGVuOyBpKyspCisJCQluaGNpZF9za2JfcHRyX21hc2tlZFtpXSAmPSBuaGMtPmlkbWFza1tpXTsKKworCQlyZXN1bHQgPSBtZW1jbXAobmhjaWRfc2tiX3B0cl9tYXNrZWQsIG5oYy0+aWQsIG5oYy0+aWRsZW4pOworCQlpZiAocmVzdWx0IDwgMCkKKwkJCW5vZGUgPSBub2RlLT5yYl9sZWZ0OworCQllbHNlIGlmIChyZXN1bHQgPiAwKQorCQkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gbmhjOworCX0KKworCXJldHVybiBOVUxMOworfQorCitpbnQgbG93cGFuX25oY19jaGVja19jb21wcmVzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSBjb25zdCBzdHJ1Y3QgaXB2NmhkciAqaGRyLCB1OCAqKmhjX3B0ciwKKwkJCQkgdTggKmlwaGMwKQoreworCXN0cnVjdCBsb3dwYW5fbmhjICpuaGM7CisKKwlzcGluX2xvY2tfYmgoJmxvd3Bhbl9uaGNfbG9jayk7CisKKwluaGMgPSBsb3dwYW5fbmV4dGhkcl9uaGNzW2hkci0+bmV4dGhkcl07CisJaWYgKG5oYyAmJiBuaGMtPmNvbXByZXNzKQorCQkqaXBoYzAgfD0gTE9XUEFOX0lQSENfTkhfQzsKKwllbHNlCisJCWxvd3Bhbl9wdXNoX2hjX2RhdGEoaGNfcHRyLCAmaGRyLT5uZXh0aGRyLAorCQkJCSAgICBzaXplb2YoaGRyLT5uZXh0aGRyKSk7CisKKwlzcGluX3VubG9ja19iaCgmbG93cGFuX25oY19sb2NrKTsKKworCXJldHVybiAwOworfQorCitpbnQgbG93cGFuX25oY19kb19jb21wcmVzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgaXB2NmhkciAqaGRyLAorCQkJICAgICAgdTggKipoY19wdHIpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbG93cGFuX25oYyAqbmhjOworCisJc3Bpbl9sb2NrX2JoKCZsb3dwYW5fbmhjX2xvY2spOworCisJbmhjID0gbG93cGFuX25leHRoZHJfbmhjc1toZHItPm5leHRoZHJdOworCS8qIGNoZWNrIGlmIHRoZSBuaGMgbW9kdWxlIHdhcyByZW1vdmVkIGluIHVubG9ja2VkIHBhcnQuCisJICogVE9ETzogdGhpcyBpcyBhIHdvcmthcm91bmQgd2Ugc2hvdWxkIHByZXZlbnQgdW5sb2FkaW5nCisJICogb2YgbmhjIG1vZHVsZXMgd2hpbGUgdW5sb2NrZWQgcGFydCwgdGhpcyB3aWxsIGFsd2F5cyBkcm9wCisJICogdGhlIGxvd3BhbiBwYWNrZXQgYnV0IGl0J3MgdmVyeSB1bmxpa2VseS4KKwkgKgorCSAqIFNvbHV0aW9uIGlzbid0IGVhc3kgYmVjYXVzZSB3ZSBuZWVkIHRvIGRlY2lkZSBhdAorCSAqIGxvd3Bhbl9uaGNfY2hlY2tfY29tcHJlc3Npb24gaWYgd2UgZG8gYSBjb21wcmVzc2lvbiBvciBub3QuCisJICogQmVjYXVzZSB0aGUgaW5saW5lIGRhdGEgd2hpY2ggaXMgYWRkZWQgdG8gc2tiLCB3ZSBjYW4ndCBtb3ZlIHRoaXMKKwkgKiBoYW5kbGluZy4KKwkgKi8KKwlpZiAodW5saWtlbHkoIW5oYyB8fCAhbmhjLT5jb21wcmVzcykpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSW4gdGhlIGNhc2Ugb2YgUkFXIHNvY2tldHMgdGhlIHRyYW5zcG9ydCBoZWFkZXIgaXMgbm90IHNldCBieQorCSAqIHRoZSBpcDYgc3RhY2sgc28gd2UgbXVzdCBzZXQgaXQgb3Vyc2VsdmVzCisJICovCisJaWYgKHNrYi0+dHJhbnNwb3J0X2hlYWRlciA9PSBza2ItPm5ldHdvcmtfaGVhZGVyKQorCQlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKTsKKworCXJldCA9IG5oYy0+Y29tcHJlc3Moc2tiLCBoY19wdHIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIHNraXAgdGhlIHRyYW5zcG9ydCBoZWFkZXIgKi8KKwlza2JfcHVsbChza2IsIG5oYy0+bmV4dGhkcmxlbik7CisKK291dDoKKwlzcGluX3VubG9ja19iaCgmbG93cGFuX25oY19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBsb3dwYW5fbmhjX2RvX3VuY29tcHJlc3Npb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaXB2NmhkciAqaGRyKQoreworCXN0cnVjdCBsb3dwYW5fbmhjICpuaGM7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19iaCgmbG93cGFuX25oY19sb2NrKTsKKworCW5oYyA9IGxvd3Bhbl9uaGNfYnlfbmhjaWQoc2tiKTsKKwlpZiAobmhjKSB7CisJCWlmIChuaGMtPnVuY29tcHJlc3MpIHsKKwkJCXJldCA9IG5oYy0+dW5jb21wcmVzcyhza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKworCQkJCQkgICAgICBuaGMtPm5leHRoZHJsZW4pOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlzcGluX3VubG9ja19iaCgmbG93cGFuX25oY19sb2NrKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9IGVsc2UgeworCQkJc3Bpbl91bmxvY2tfYmgoJmxvd3Bhbl9uaGNfbG9jayk7CisJCQluZXRkZXZfd2FybihkZXYsICJyZWNlaXZlZCBuaGMgaWQgZm9yICVzIHdoaWNoIGlzIG5vdCBpbXBsZW1lbnRlZC5cbiIsCisJCQkJICAgIG5oYy0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT1RTVVBQOworCQl9CisJfSBlbHNlIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmxvd3Bhbl9uaGNfbG9jayk7CisJCW5ldGRldl93YXJuKGRldiwgInJlY2VpdmVkIHVua25vd24gbmhjIGlkIHdoaWNoIHdhcyBub3QgZm91bmQuXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJaGRyLT5uZXh0aGRyID0gbmhjLT5uZXh0aGRyOworCXNrYl9yZXNldF90cmFuc3BvcnRfaGVhZGVyKHNrYik7CisJcmF3X2R1bXBfdGFibGUoX19mdW5jX18sICJyYXcgdHJhbnNwb3J0IGhlYWRlciBkdW1wIiwKKwkJICAgICAgIHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksIG5oYy0+bmV4dGhkcmxlbik7CisKKwlzcGluX3VubG9ja19iaCgmbG93cGFuX25oY19sb2NrKTsKKworCXJldHVybiAwOworfQorCitpbnQgbG93cGFuX25oY19hZGQoc3RydWN0IGxvd3Bhbl9uaGMgKm5oYykKK3sKKwlpbnQgcmV0OworCisJaWYgKCFuaGMtPmlkbGVuIHx8ICFuaGMtPmlkc2V0dXApCisJCXJldHVybiAtRUlOVkFMOworCisJV0FSTl9PTkNFKG5oYy0+aWRsZW4gPiBMT1dQQU5fTkhDX01BWF9JRF9MRU4sCisJCSAgIkxPV1BBTl9OSENfTUFYX0lEX0xFTiBzaG91bGQgYmUgdXBkYXRlZCB0byAlemQuXG4iLAorCQkgIG5oYy0+aWRsZW4pOworCisJbmhjLT5pZHNldHVwKG5oYyk7CisKKwlzcGluX2xvY2tfYmgoJmxvd3Bhbl9uaGNfbG9jayk7CisKKwlpZiAobG93cGFuX25leHRoZHJfbmhjc1tuaGMtPm5leHRoZHJdKSB7CisJCXJldCA9IC1FRVhJU1Q7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IGxvd3Bhbl9uaGNfaW5zZXJ0KG5oYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJbG93cGFuX25leHRoZHJfbmhjc1tuaGMtPm5leHRoZHJdID0gbmhjOworb3V0OgorCXNwaW5fdW5sb2NrX2JoKCZsb3dwYW5fbmhjX2xvY2spOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGxvd3Bhbl9uaGNfYWRkKTsKKwordm9pZCBsb3dwYW5fbmhjX2RlbChzdHJ1Y3QgbG93cGFuX25oYyAqbmhjKQoreworCXNwaW5fbG9ja19iaCgmbG93cGFuX25oY19sb2NrKTsKKworCWxvd3Bhbl9uaGNfcmVtb3ZlKG5oYyk7CisJbG93cGFuX25leHRoZHJfbmhjc1tuaGMtPm5leHRoZHJdID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2JoKCZsb3dwYW5fbmhjX2xvY2spOworCisJc3luY2hyb25pemVfbmV0KCk7Cit9CitFWFBPUlRfU1lNQk9MKGxvd3Bhbl9uaGNfZGVsKTsKZGlmZiAtLWdpdCBhL25ldC82bG93cGFuL25oYy5oIGIvbmV0LzZsb3dwYW4vbmhjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ0NDkzOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC82bG93cGFuL25oYy5oCkBAIC0wLDAgKzEsMTQ2IEBACisjaWZuZGVmIF9fNkxPV1BBTl9OSENfSAorI2RlZmluZSBfXzZMT1dQQU5fTkhDX0gKKworI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSA8bmV0LzZsb3dwYW4uaD4KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgorCisjZGVmaW5lIExPV1BBTl9OSENfTUFYX0lEX0xFTgkxCisKKy8qKgorICogTE9XUEFOX05IQyAtIGhlbHBlciBtYWNybyB0byBnZW5lcmF0ZSBuaCBpZCBmaWVsZHMgYW5kIGxvd3Bhbl9uaGMgc3RydWN0CisgKgorICogQF9fbmhjOiB2YXJpYWJsZSBuYW1lIG9mIHRoZSBsb3dwYW5fbmhjIHN0cnVjdC4KKyAqIEBfbmFtZTogY29uc3QgY2hhciAqIG9mIGNvbW1vbiBoZWFkZXIgY29tcHJlc3Npb24gbmFtZS4KKyAqIEBfbmV4dGhkcjogaXB2NiBuZXh0aGRyIGZpZWxkIGZvciB0aGUgaGVhZGVyIGNvbXByZXNzaW9uLgorICogQF9uZXh0aGRybGVuOiBpcHY2IG5leHRoZHIgbGVuIGZvciB0aGUgcmVzZXJ2ZWQgc3BhY2UuCisgKiBAX2lkc2V0dXA6IGNhbGxiYWNrIHRvIHNldHVwIGlkIGFuZCBtYXNrIHZhbHVlcy4KKyAqIEBfaWRsZW46IGxlbiBmb3IgdGhlIG5leHQgaGVhZGVyIGlkIGFuZCBtYXNrLCBzaG91bGQgYmUgYWx3YXlzIHRoZSBzYW1lLgorICogQF91bmNvbXByZXNzOiBjYWxsYmFjayBmb3IgdW5jb21wcmVzc2lvbiBjYWxsLgorICogQF9jb21wcmVzczogY2FsbGJhY2sgZm9yIGNvbXByZXNzaW9uIGNhbGwuCisgKi8KKyNkZWZpbmUgTE9XUEFOX05IQyhfX25oYywgX25hbWUsIF9uZXh0aGRyLAlcCisJCSAgIF9oZHJsZW4sIF9pZHNldHVwLCBfaWRsZW4sCVwKKwkJICAgX3VuY29tcHJlc3MsIF9jb21wcmVzcykJXAorc3RhdGljIHU4IF9fbmhjIyNfdmFsW19pZGxlbl07CQkJXAorc3RhdGljIHU4IF9fbmhjIyNfbWFza1tfaWRsZW5dOwkJCVwKK3N0YXRpYyBzdHJ1Y3QgbG93cGFuX25oYyBfX25oYyA9IHsJCVwKKwkubmFtZQkJPSBfbmFtZSwJCVwKKwkubmV4dGhkcgk9IF9uZXh0aGRyLAkJXAorCS5uZXh0aGRybGVuCT0gX2hkcmxlbiwJCVwKKwkuaWQJCT0gX19uaGMjI192YWwsCQlcCisJLmlkbWFzawkJPSBfX25oYyMjX21hc2ssCQlcCisJLmlkbGVuCQk9IF9pZGxlbiwJCVwKKwkuaWRzZXR1cAk9IF9pZHNldHVwLAkJXAorCS51bmNvbXByZXNzCT0gX3VuY29tcHJlc3MsCQlcCisJLmNvbXByZXNzCT0gX2NvbXByZXNzLAkJXAorfQorCisjZGVmaW5lIG1vZHVsZV9sb3dwYW5fbmhjKF9fbmhjKQkJXAorc3RhdGljIGludCBfX2luaXQgX19uaGMjI19pbml0KHZvaWQpCQlcCit7CQkJCQkJXAorCXJldHVybiBsb3dwYW5fbmhjX2FkZCgmKF9fbmhjKSk7CVwKK30JCQkJCQlcCittb2R1bGVfaW5pdChfX25oYyMjX2luaXQpOwkJCVwKK3N0YXRpYyB2b2lkIF9fZXhpdCBfX25oYyMjX2V4aXQodm9pZCkJCVwKK3sJCQkJCQlcCisJbG93cGFuX25oY19kZWwoJihfX25oYykpOwkJXAorfQkJCQkJCVwKK21vZHVsZV9leGl0KF9fbmhjIyNfZXhpdCk7CisKKy8qKgorICogc3RydWN0IGxvd3Bhbl9uaGMgLSBob2xkIDZsb3dwYW4gbmV4dCBoZHIgY29tcHJlc3Npb24gaWZuZm9ybWF0aW9uCisgKgorICogQG5vZGU6IGhvbGRlciBmb3IgdGhlIHJidHJlZS4KKyAqIEBuYW1lOiBuYW1lIG9mIHRoZSBzcGVjaWZpYyBuZXh0IGhlYWRlciBjb21wcmVzc2lvbgorICogQG5leHRoZHI6IG5leHQgaGVhZGVyIHZhbHVlIG9mIHRoZSBwcm90b2NvbCB3aGljaCBzaG91bGQgYmUgY29tcHJlc3NlZC4KKyAqIEBuZXh0aGRybGVuOiBpcHY2IG5leHRoZHIgbGVuIGZvciB0aGUgcmVzZXJ2ZWQgc3BhY2UuCisgKiBAaWQ6IGFycmF5IGZvciBuaGMgaWQuIE5vdGUgdGhpcyBuZWVkIHRvIGJlIGluIG5ldHdvcmsgYnl0ZW9yZGVyLgorICogQG1hc2s6IGFycmF5IGZvciBuaGMgaWQgbWFzay4gTm90ZSB0aGlzIG5lZWQgdG8gYmUgaW4gbmV0d29yayBieXRlb3JkZXIuCisgKiBAbGVuOiB0aGUgbGVuZ3RoIG9mIHRoZSBuZXh0IGhlYWRlciBpZCBhbmQgbWFzay4KKyAqIEBzZXR1cDogY2FsbGJhY2sgdG8gc2V0dXAgZmlsbCB0aGUgbmV4dCBoZWFkZXIgaWQgdmFsdWUgYW5kIG1hc2suCisgKiBAY29tcHJlc3M6IGNhbGxiYWNrIHRvIGRvIHRoZSBoZWFkZXIgY29tcHJlc3Npb24uCisgKiBAdW5jb21wcmVzczogY2FsbGJhY2sgdG8gZG8gdGhlIGhlYWRlciB1bmNvbXByZXNzaW9uLgorICovCitzdHJ1Y3QgbG93cGFuX25oYyB7CisJc3RydWN0IHJiX25vZGUJbm9kZTsKKwljb25zdCBjaGFyCSpuYW1lOworCWNvbnN0IHU4CW5leHRoZHI7CisJY29uc3Qgc2l6ZV90CW5leHRoZHJsZW47CisJdTgJCSppZDsKKwl1OAkJKmlkbWFzazsKKwljb25zdCBzaXplX3QJaWRsZW47CisKKwl2b2lkCQkoKmlkc2V0dXApKHN0cnVjdCBsb3dwYW5fbmhjICpuaGMpOworCWludAkJKCp1bmNvbXByZXNzKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3QgbmVlZGVkKTsKKwlpbnQJCSgqY29tcHJlc3MpKHN0cnVjdCBza19idWZmICpza2IsIHU4ICoqaGNfcHRyKTsKK307CisKKy8qKgorICogbG93cGFuX25oY19ieV9uZXh0aGRyIC0gcmV0dXJuIHRoZSA2bG93cGFuIG5oYyBieSBpcHY2IG5leHRoZHIuCisgKgorICogQG5leHRoZHI6IGlwdjYgbmV4dGhkciB2YWx1ZS4KKyAqLworc3RydWN0IGxvd3Bhbl9uaGMgKmxvd3Bhbl9uaGNfYnlfbmV4dGhkcih1OCBuZXh0aGRyKTsKKworLyoqCisgKiBsb3dwYW5fbmhjX2NoZWNrX2NvbXByZXNzaW9uIC0gY2hlY2tzIGlmIHdlIHN1cHBvcnQgY29tcHJlc3Npb24gZm9ybWF0LiBJZgorICoJd2Ugc3VwcG9ydCB0aGUgbmhjIGJ5IG5leHRoZHIgZmllbGQsIHRoZSA2TG9XUEFOIGlwaGMgTkhDIGJpdCB3aWxsIGJlCisgKglzZXQuIElmIHdlIGRvbid0IHN1cHBvcnQgbmV4dGhkciB3aWxsIGJlIGFkZGVkIGFzIGlubGluZSBkYXRhIHRvIHRoZQorICoJNkxvV1BBTiBoZWFkZXIuCisgKgorICogQHNrYjogc2tiIG9mIDZMb1dQQU4gaGVhZGVyIHRvIHJlYWQgbmhjIGFuZCByZXBsYWNlIGhlYWRlci4KKyAqIEBoZHI6IGlwdjZoZHIgdG8gY2hlY2sgdGhlIG5leHRoZHIgdmFsdWUKKyAqIEBoY19wdHI6IHBvaW50ZXIgZm9yIDZMb1dQQU4gaGVhZGVyIHdoaWNoIHNob3VsZCBpbmNyZW1lbnQgYXQgdGhlIGVuZCBvZgorICoJICAgIHJlcGxhY2VkIGhlYWRlci4KKyAqIEBpcGhjMDogaXBoYzAgcG9pbnRlciB0byBzZXQgdGhlIDZMb1dQQU4gTkhDIGJpdAorICovCitpbnQgbG93cGFuX25oY19jaGVja19jb21wcmVzc2lvbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSBjb25zdCBzdHJ1Y3QgaXB2NmhkciAqaGRyLCB1OCAqKmhjX3B0ciwKKwkJCQkgdTggKmlwaGMwKTsKKworLyoqCisgKiBsb3dwYW5fbmhjX2RvX2NvbXByZXNzaW9uIC0gY2FsbGluZyBjb21wcmVzcyBjYWxsYmFjayBmb3IgbmhjCisgKgorICogQHNrYjogc2tiIG9mIDZMb1dQQU4gaGVhZGVyIHRvIHJlYWQgbmhjIGFuZCByZXBsYWNlIGhlYWRlci4KKyAqIEBoZHI6IGlwdjZoZHIgdG8gc2V0IHRoZSBuZXh0aGRyIHZhbHVlCisgKiBAaGNfcHRyOiBwb2ludGVyIGZvciA2TG9XUEFOIGhlYWRlciB3aGljaCBzaG91bGQgaW5jcmVtZW50IGF0IHRoZSBlbmQgb2YKKyAqCSAgICByZXBsYWNlZCBoZWFkZXIuCisgKi8KK2ludCBsb3dwYW5fbmhjX2RvX2NvbXByZXNzaW9uKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBpcHY2aGRyICpoZHIsCisJCQkgICAgICB1OCAqKmhjX3B0cik7CisKKy8qKgorICogbG93cGFuX25oY19kb191bmNvbXByZXNzaW9uIC0gY2FsbGluZyB1bmNvbXByZXNzIGNhbGxiYWNrIGZvciBuaGMKKyAqCisgKiBAbmhjOiA2TG9XUEFOIG5oYyBjb250ZXh0LCBnZXQgYnkgbG93cGFuX25oY19ieV8gZnVuY3Rpb25zLgorICogQHNrYjogc2tiIG9mIDZMb1dQQU4gaGVhZGVyLCBza2ItPmRhdGEgc2hvdWxkIGJlIHBvaW50ZWQgdG8gbmhjIGlkIHZhbHVlLgorICogQGRldjogbmV0ZGV2aWNlIGZvciBwcmludCBsb2dnaW5nIGluZm9ybWF0aW9uLgorICogQGhkcjogaXB2NmhkciBmb3Igc2V0dGluZyBuZXh0aGRyIHZhbHVlLgorICovCitpbnQgbG93cGFuX25oY19kb191bmNvbXByZXNzaW9uKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGlwdjZoZHIgKmhkcik7CisKKy8qKgorICogbG93cGFuX25oY19hZGQgLSByZWdpc3RlciBhIG5leHQgaGVhZGVyIGNvbXByZXNzaW9uIHRvIGZyYW1ld29yaworICoKKyAqIEBuaGM6IG5oYyB3aGljaCBzaG91bGQgYmUgYWRkLgorICovCitpbnQgbG93cGFuX25oY19hZGQoc3RydWN0IGxvd3Bhbl9uaGMgKm5oYyk7CisKKy8qKgorICogbG93cGFuX25oY19kZWwgLSBkZWxldGUgYSBuZXh0IGhlYWRlciBjb21wcmVzc2lvbiBmcm9tIGZyYW1ld29yaworICoKKyAqIEBuaGM6IG5oYyB3aGljaCBzaG91bGQgYmUgZGVsZXRlLgorICovCit2b2lkIGxvd3Bhbl9uaGNfZGVsKHN0cnVjdCBsb3dwYW5fbmhjICpuaGMpOworCisvKioKKyAqIGxvd3Bhbl9uaGNfaW5pdCAtIGFkZGluZyBhbGwgZGVmYXVsdCBuaGNzCisgKi8KK3ZvaWQgbG93cGFuX25oY19pbml0KHZvaWQpOworCisjZW5kaWYgLyogX182TE9XUEFOX05IQ19IICovCmRpZmYgLS1naXQgYS9uZXQvNmxvd3Bhbi9uaGNfZGVzdC5jIGIvbmV0LzZsb3dwYW4vbmhjX2Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjI5MmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0LzZsb3dwYW4vbmhjX2Rlc3QuYwpAQCAtMCwwICsxLDI4IEBACisvKgorICoJNkxvV1BBTiBJUHY2IERlc3RpbmF0aW9uIE9wdGlvbnMgSGVhZGVyIGNvbXByZXNzaW9uIGFjY29yZGluZyB0bworICoJUkZDNjI4MgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgIm5oYy5oIgorCisjZGVmaW5lIExPV1BBTl9OSENfREVTVF9JRExFTgkxCisjZGVmaW5lIExPV1BBTl9OSENfREVTVF9JRF8wCTB4ZTYKKyNkZWZpbmUgTE9XUEFOX05IQ19ERVNUX01BU0tfMAkweGZlCisKK3N0YXRpYyB2b2lkIGRlc3RfbmhpZF9zZXR1cChzdHJ1Y3QgbG93cGFuX25oYyAqbmhjKQoreworCW5oYy0+aWRbMF0gPSBMT1dQQU5fTkhDX0RFU1RfSURfMDsKKwluaGMtPmlkbWFza1swXSA9IExPV1BBTl9OSENfREVTVF9NQVNLXzA7Cit9CisKK0xPV1BBTl9OSEMobmhjX2Rlc3QsICJSRkM2MjgyIERlc3RpbmF0aW9uIE9wdGlvbnMiLCBORVhUSERSX0RFU1QsIDAsCisJICAgZGVzdF9uaGlkX3NldHVwLCBMT1dQQU5fTkhDX0RFU1RfSURMRU4sIE5VTEwsIE5VTEwpOworCittb2R1bGVfbG93cGFuX25oYyhuaGNfZGVzdCk7CitNT0RVTEVfREVTQ1JJUFRJT04oIjZMb1dQQU4gbmV4dCBoZWFkZXIgUkZDNjI4MiBEZXN0aW5hdGlvbiBPcHRpb25zIGNvbXByZXNzaW9uIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvNmxvd3Bhbi9uaGNfZnJhZ21lbnQuYyBiL25ldC82bG93cGFuL25oY19mcmFnbWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3M2RiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvNmxvd3Bhbi9uaGNfZnJhZ21lbnQuYwpAQCAtMCwwICsxLDI3IEBACisvKgorICoJNkxvV1BBTiBJUHY2IEZyYWdtZW50IEhlYWRlciBjb21wcmVzc2lvbiBhY2NvcmRpbmcgdG8gUkZDNjI4MgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgIm5oYy5oIgorCisjZGVmaW5lIExPV1BBTl9OSENfRlJBR01FTlRfSURMRU4JMQorI2RlZmluZSBMT1dQQU5fTkhDX0ZSQUdNRU5UX0lEXzAJMHhlNAorI2RlZmluZSBMT1dQQU5fTkhDX0ZSQUdNRU5UX01BU0tfMAkweGZlCisKK3N0YXRpYyB2b2lkIGZyYWdtZW50X25oaWRfc2V0dXAoc3RydWN0IGxvd3Bhbl9uaGMgKm5oYykKK3sKKwluaGMtPmlkWzBdID0gTE9XUEFOX05IQ19GUkFHTUVOVF9JRF8wOworCW5oYy0+aWRtYXNrWzBdID0gTE9XUEFOX05IQ19GUkFHTUVOVF9NQVNLXzA7Cit9CisKK0xPV1BBTl9OSEMobmhjX2ZyYWdtZW50LCAiUkZDNjI4MiBGcmFnbWVudCIsIE5FWFRIRFJfRlJBR01FTlQsIDAsCisJICAgZnJhZ21lbnRfbmhpZF9zZXR1cCwgTE9XUEFOX05IQ19GUkFHTUVOVF9JRExFTiwgTlVMTCwgTlVMTCk7CisKK21vZHVsZV9sb3dwYW5fbmhjKG5oY19mcmFnbWVudCk7CitNT0RVTEVfREVTQ1JJUFRJT04oIjZMb1dQQU4gbmV4dCBoZWFkZXIgUkZDNjI4MiBGcmFnbWVudCBjb21wcmVzc2lvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0LzZsb3dwYW4vbmhjX2hvcC5jIGIvbmV0LzZsb3dwYW4vbmhjX2hvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYjY2YmUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvNmxvd3Bhbi9uaGNfaG9wLmMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqCTZMb1dQQU4gSVB2NiBIb3AtYnktSG9wIE9wdGlvbnMgSGVhZGVyIGNvbXByZXNzaW9uIGFjY29yZGluZyB0byBSRkM2MjgyCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSAibmhjLmgiCisKKyNkZWZpbmUgTE9XUEFOX05IQ19IT1BfSURMRU4JMQorI2RlZmluZSBMT1dQQU5fTkhDX0hPUF9JRF8wCTB4ZTAKKyNkZWZpbmUgTE9XUEFOX05IQ19IT1BfTUFTS18wCTB4ZmUKKworc3RhdGljIHZvaWQgaG9wX25oaWRfc2V0dXAoc3RydWN0IGxvd3Bhbl9uaGMgKm5oYykKK3sKKwluaGMtPmlkWzBdID0gTE9XUEFOX05IQ19IT1BfSURfMDsKKwluaGMtPmlkbWFza1swXSA9IExPV1BBTl9OSENfSE9QX01BU0tfMDsKK30KKworTE9XUEFOX05IQyhuaGNfaG9wLCAiUkZDNjI4MiBIb3AtYnktSG9wIE9wdGlvbnMiLCBORVhUSERSX0hPUCwgMCwKKwkgICBob3BfbmhpZF9zZXR1cCwgTE9XUEFOX05IQ19IT1BfSURMRU4sIE5VTEwsIE5VTEwpOworCittb2R1bGVfbG93cGFuX25oYyhuaGNfaG9wKTsKK01PRFVMRV9ERVNDUklQVElPTigiNkxvV1BBTiBuZXh0IGhlYWRlciBSRkM2MjgyIEhvcC1ieS1Ib3AgT3B0aW9ucyBjb21wcmVzc2lvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0LzZsb3dwYW4vbmhjX2lwdjYuYyBiL25ldC82bG93cGFuL25oY19pcHY2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMxM2QxNgotLS0gL2Rldi9udWxsCisrKyBiL25ldC82bG93cGFuL25oY19pcHY2LmMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqCTZMb1dQQU4gSVB2NiBIZWFkZXIgY29tcHJlc3Npb24gYWNjb3JkaW5nIHRvIFJGQzYyODIKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJuaGMuaCIKKworI2RlZmluZSBMT1dQQU5fTkhDX0lQVjZfSURMRU4JMQorI2RlZmluZSBMT1dQQU5fTkhDX0lQVjZfSURfMAkweGVlCisjZGVmaW5lIExPV1BBTl9OSENfSVBWNl9NQVNLXzAJMHhmZQorCitzdGF0aWMgdm9pZCBpcHY2X25oaWRfc2V0dXAoc3RydWN0IGxvd3Bhbl9uaGMgKm5oYykKK3sKKwluaGMtPmlkWzBdID0gTE9XUEFOX05IQ19JUFY2X0lEXzA7CisJbmhjLT5pZG1hc2tbMF0gPSBMT1dQQU5fTkhDX0lQVjZfTUFTS18wOworfQorCitMT1dQQU5fTkhDKG5oY19pcHY2LCAiUkZDNjI4MiBJUHY2IiwgTkVYVEhEUl9JUFY2LCAwLCBpcHY2X25oaWRfc2V0dXAsCisJICAgTE9XUEFOX05IQ19JUFY2X0lETEVOLCBOVUxMLCBOVUxMKTsKKworbW9kdWxlX2xvd3Bhbl9uaGMobmhjX2lwdjYpOworTU9EVUxFX0RFU0NSSVBUSU9OKCI2TG9XUEFOIG5leHQgaGVhZGVyIFJGQzYyODIgSVB2NiBjb21wcmVzc2lvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0LzZsb3dwYW4vbmhjX21vYmlsaXR5LmMgYi9uZXQvNmxvd3Bhbi9uaGNfbW9iaWxpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQzZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0LzZsb3dwYW4vbmhjX21vYmlsaXR5LmMKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqCTZMb1dQQU4gSVB2NiBNb2JpbGl0eSBIZWFkZXIgY29tcHJlc3Npb24gYWNjb3JkaW5nIHRvIFJGQzYyODIKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJuaGMuaCIKKworI2RlZmluZSBMT1dQQU5fTkhDX01PQklMSVRZX0lETEVOCTEKKyNkZWZpbmUgTE9XUEFOX05IQ19NT0JJTElUWV9JRF8wCTB4ZTgKKyNkZWZpbmUgTE9XUEFOX05IQ19NT0JJTElUWV9NQVNLXzAJMHhmZQorCitzdGF0aWMgdm9pZCBtb2JpbGl0eV9uaGlkX3NldHVwKHN0cnVjdCBsb3dwYW5fbmhjICpuaGMpCit7CisJbmhjLT5pZFswXSA9IExPV1BBTl9OSENfTU9CSUxJVFlfSURfMDsKKwluaGMtPmlkbWFza1swXSA9IExPV1BBTl9OSENfTU9CSUxJVFlfTUFTS18wOworfQorCitMT1dQQU5fTkhDKG5oY19tb2JpbGl0eSwgIlJGQzYyODIgTW9iaWxpdHkiLCBORVhUSERSX01PQklMSVRZLCAwLAorCSAgIG1vYmlsaXR5X25oaWRfc2V0dXAsIExPV1BBTl9OSENfTU9CSUxJVFlfSURMRU4sIE5VTEwsIE5VTEwpOworCittb2R1bGVfbG93cGFuX25oYyhuaGNfbW9iaWxpdHkpOworTU9EVUxFX0RFU0NSSVBUSU9OKCI2TG9XUEFOIG5leHQgaGVhZGVyIFJGQzYyODIgTW9iaWxpdHkgY29tcHJlc3Npb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC82bG93cGFuL25oY19yb3V0aW5nLmMgYi9uZXQvNmxvd3Bhbi9uaGNfcm91dGluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTMyODAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvNmxvd3Bhbi9uaGNfcm91dGluZy5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKgk2TG9XUEFOIElQdjYgUm91dGluZyBIZWFkZXIgY29tcHJlc3Npb24gYWNjb3JkaW5nIHRvIFJGQzYyODIKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJuaGMuaCIKKworI2RlZmluZSBMT1dQQU5fTkhDX1JPVVRJTkdfSURMRU4JMQorI2RlZmluZSBMT1dQQU5fTkhDX1JPVVRJTkdfSURfMAkJMHhlMgorI2RlZmluZSBMT1dQQU5fTkhDX1JPVVRJTkdfTUFTS18wCTB4ZmUKKworc3RhdGljIHZvaWQgcm91dGluZ19uaGlkX3NldHVwKHN0cnVjdCBsb3dwYW5fbmhjICpuaGMpCit7CisJbmhjLT5pZFswXSA9IExPV1BBTl9OSENfUk9VVElOR19JRF8wOworCW5oYy0+aWRtYXNrWzBdID0gTE9XUEFOX05IQ19ST1VUSU5HX01BU0tfMDsKK30KKworTE9XUEFOX05IQyhuaGNfcm91dGluZywgIlJGQzYyODIgUm91dGluZyIsIE5FWFRIRFJfUk9VVElORywgMCwKKwkgICByb3V0aW5nX25oaWRfc2V0dXAsIExPV1BBTl9OSENfUk9VVElOR19JRExFTiwgTlVMTCwgTlVMTCk7CisKK21vZHVsZV9sb3dwYW5fbmhjKG5oY19yb3V0aW5nKTsKK01PRFVMRV9ERVNDUklQVElPTigiNkxvV1BBTiBuZXh0IGhlYWRlciBSRkM2MjgyIFJvdXRpbmcgY29tcHJlc3Npb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC82bG93cGFuL25oY191ZHAuYyBiL25ldC82bG93cGFuL25oY191ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmJjYWViCi0tLSAvZGV2L251bGwKKysrIGIvbmV0LzZsb3dwYW4vbmhjX3VkcC5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICoJNkxvV1BBTiBJUHY2IFVEUCBjb21wcmVzc2lvbiBhY2NvcmRpbmcgdG8gUkZDNjI4MgorICoKKyAqCisgKglBdXRob3JzOgorICoJQWxleGFuZGVyIEFyaW5nCTxhYXJAcGVuZ3V0cm9uaXguZGU+CisgKgorICoJT3JpZ25hbCB3cml0dGVuIGJ5OgorICoJQWxleGFuZGVyIFNtaXJub3YgPGFsZXguYmx1ZXNtYW4uc21pcm5vdkBnbWFpbC5jb20+CisgKglKb24gU21pcmwgPGpvbnNtaXJsQGdtYWlsLmNvbT4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlICJuaGMuaCIKKworI2RlZmluZSBMT1dQQU5fTkhDX1VEUF9JRExFTgkxCisKK3N0YXRpYyBpbnQgdWRwX3VuY29tcHJlc3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgc2l6ZV90IG5lZWRlZCkKK3sKKwl1OCB0bXAgPSAwLCB2YWwgPSAwOworCXN0cnVjdCB1ZHBoZHIgdWg7CisJYm9vbCBmYWlsOworCWludCBlcnI7CisKKwlmYWlsID0gbG93cGFuX2ZldGNoX3NrYihza2IsICZ0bXAsIHNpemVvZih0bXApKTsKKworCXByX2RlYnVnKCJVRFAgaGVhZGVyIHVuY29tcHJlc3Npb25cbiIpOworCXN3aXRjaCAodG1wICYgTE9XUEFOX05IQ19VRFBfQ1NfUF8xMSkgeworCWNhc2UgTE9XUEFOX05IQ19VRFBfQ1NfUF8wMDoKKwkJZmFpbCB8PSBsb3dwYW5fZmV0Y2hfc2tiKHNrYiwgJnVoLnNvdXJjZSwgc2l6ZW9mKHVoLnNvdXJjZSkpOworCQlmYWlsIHw9IGxvd3Bhbl9mZXRjaF9za2Ioc2tiLCAmdWguZGVzdCwgc2l6ZW9mKHVoLmRlc3QpKTsKKwkJYnJlYWs7CisJY2FzZSBMT1dQQU5fTkhDX1VEUF9DU19QXzAxOgorCQlmYWlsIHw9IGxvd3Bhbl9mZXRjaF9za2Ioc2tiLCAmdWguc291cmNlLCBzaXplb2YodWguc291cmNlKSk7CisJCWZhaWwgfD0gbG93cGFuX2ZldGNoX3NrYihza2IsICZ2YWwsIHNpemVvZih2YWwpKTsKKwkJdWguZGVzdCA9IGh0b25zKHZhbCArIExPV1BBTl9OSENfVURQXzhCSVRfUE9SVCk7CisJCWJyZWFrOworCWNhc2UgTE9XUEFOX05IQ19VRFBfQ1NfUF8xMDoKKwkJZmFpbCB8PSBsb3dwYW5fZmV0Y2hfc2tiKHNrYiwgJnZhbCwgc2l6ZW9mKHZhbCkpOworCQl1aC5zb3VyY2UgPSBodG9ucyh2YWwgKyBMT1dQQU5fTkhDX1VEUF84QklUX1BPUlQpOworCQlmYWlsIHw9IGxvd3Bhbl9mZXRjaF9za2Ioc2tiLCAmdWguZGVzdCwgc2l6ZW9mKHVoLmRlc3QpKTsKKwkJYnJlYWs7CisJY2FzZSBMT1dQQU5fTkhDX1VEUF9DU19QXzExOgorCQlmYWlsIHw9IGxvd3Bhbl9mZXRjaF9za2Ioc2tiLCAmdmFsLCBzaXplb2YodmFsKSk7CisJCXVoLnNvdXJjZSA9IGh0b25zKExPV1BBTl9OSENfVURQXzRCSVRfUE9SVCArICh2YWwgPj4gNCkpOworCQl1aC5kZXN0ID0gaHRvbnMoTE9XUEFOX05IQ19VRFBfNEJJVF9QT1JUICsgKHZhbCAmIDB4MGYpKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJcHJfZGVidWcoInVuY29tcHJlc3NlZCBVRFAgcG9ydHM6IHNyYyA9ICVkLCBkc3QgPSAlZFxuIiwKKwkJIG50b2hzKHVoLnNvdXJjZSksIG50b2hzKHVoLmRlc3QpKTsKKworCS8qIGNoZWNrc3VtICovCisJaWYgKHRtcCAmIExPV1BBTl9OSENfVURQX0NTX0MpIHsKKwkJcHJfZGVidWdfcmF0ZWxpbWl0ZWQoImNoZWNrc3VtIGVsaWRlZCBjdXJyZW50bHkgbm90IHN1cHBvcnRlZFxuIik7CisJCWZhaWwgPSB0cnVlOworCX0gZWxzZSB7CisJCWZhaWwgfD0gbG93cGFuX2ZldGNoX3NrYihza2IsICZ1aC5jaGVjaywgc2l6ZW9mKHVoLmNoZWNrKSk7CisJfQorCisJaWYgKGZhaWwpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVURQIGxlbmd0aCBuZWVkcyB0byBiZSBpbmZlcmVkIGZyb20gdGhlIGxvd2VyIGxheWVycworCSAqIGhlcmUsIHdlIG9idGFpbiB0aGUgaGludCBmcm9tIHRoZSByZW1haW5pbmcgc2l6ZSBvZiB0aGUKKwkgKiBmcmFtZQorCSAqLworCXVoLmxlbiA9IGh0b25zKHNrYi0+bGVuICsgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpKTsKKwlwcl9kZWJ1ZygidW5jb21wcmVzc2VkIFVEUCBsZW5ndGg6IHNyYyA9ICVkIiwgbnRvaHModWgubGVuKSk7CisKKwkvKiByZXBsYWNlIHRoZSBjb21wcmVzc2VkIFVEUCBoZWFkIGJ5IHRoZSB1bmNvbXByZXNzZWQgVURQCisJICogaGVhZGVyCisJICovCisJZXJyID0gc2tiX2Nvdyhza2IsIG5lZWRlZCk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCXJldHVybiBlcnI7CisKKwlza2JfcHVzaChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCAmdWgsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZHBfY29tcHJlc3Moc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTggKipoY19wdHIpCit7CisJY29uc3Qgc3RydWN0IHVkcGhkciAqdWggPSB1ZHBfaGRyKHNrYik7CisJdTggdG1wOworCisJaWYgKCgobnRvaHModWgtPnNvdXJjZSkgJiBMT1dQQU5fTkhDX1VEUF80QklUX01BU0spID09CisJICAgICBMT1dQQU5fTkhDX1VEUF80QklUX1BPUlQpICYmCisJICAgICgobnRvaHModWgtPmRlc3QpICYgTE9XUEFOX05IQ19VRFBfNEJJVF9NQVNLKSA9PQorCSAgICAgTE9XUEFOX05IQ19VRFBfNEJJVF9QT1JUKSkgeworCQlwcl9kZWJ1ZygiVURQIGhlYWRlcjogYm90aCBwb3J0cyBjb21wcmVzc2lvbiB0byA0IGJpdHNcbiIpOworCQkvKiBjb21wcmVzc2lvbiB2YWx1ZSAqLworCQl0bXAgPSBMT1dQQU5fTkhDX1VEUF9DU19QXzExOworCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCQkvKiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvcnQgKi8KKwkJdG1wID0gbnRvaHModWgtPmRlc3QpIC0gTE9XUEFOX05IQ19VRFBfNEJJVF9QT1JUICsKKwkJICAgICAgKChudG9ocyh1aC0+c291cmNlKSAtIExPV1BBTl9OSENfVURQXzRCSVRfUE9SVCkgPDwgNCk7CisJCWxvd3Bhbl9wdXNoX2hjX2RhdGEoaGNfcHRyLCAmdG1wLCBzaXplb2YodG1wKSk7CisJfSBlbHNlIGlmICgobnRvaHModWgtPmRlc3QpICYgTE9XUEFOX05IQ19VRFBfOEJJVF9NQVNLKSA9PQorCQkJTE9XUEFOX05IQ19VRFBfOEJJVF9QT1JUKSB7CisJCXByX2RlYnVnKCJVRFAgaGVhZGVyOiByZW1vdmUgOCBiaXRzIG9mIGRlc3RcbiIpOworCQkvKiBjb21wcmVzc2lvbiB2YWx1ZSAqLworCQl0bXAgPSBMT1dQQU5fTkhDX1VEUF9DU19QXzAxOworCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCQkvKiBzb3VyY2UgcG9ydCAqLworCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnVoLT5zb3VyY2UsIHNpemVvZih1aC0+c291cmNlKSk7CisJCS8qIGRlc3RpbmF0aW9uIHBvcnQgKi8KKwkJdG1wID0gbnRvaHModWgtPmRlc3QpIC0gTE9XUEFOX05IQ19VRFBfOEJJVF9QT1JUOworCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCX0gZWxzZSBpZiAoKG50b2hzKHVoLT5zb3VyY2UpICYgTE9XUEFOX05IQ19VRFBfOEJJVF9NQVNLKSA9PQorCQkJTE9XUEFOX05IQ19VRFBfOEJJVF9QT1JUKSB7CisJCXByX2RlYnVnKCJVRFAgaGVhZGVyOiByZW1vdmUgOCBiaXRzIG9mIHNvdXJjZVxuIik7CisJCS8qIGNvbXByZXNzaW9uIHZhbHVlICovCisJCXRtcCA9IExPV1BBTl9OSENfVURQX0NTX1BfMTA7CisJCWxvd3Bhbl9wdXNoX2hjX2RhdGEoaGNfcHRyLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCS8qIHNvdXJjZSBwb3J0ICovCisJCXRtcCA9IG50b2hzKHVoLT5zb3VyY2UpIC0gTE9XUEFOX05IQ19VRFBfOEJJVF9QT1JUOworCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCQkvKiBkZXN0aW5hdGlvbiBwb3J0ICovCisJCWxvd3Bhbl9wdXNoX2hjX2RhdGEoaGNfcHRyLCAmdWgtPmRlc3QsIHNpemVvZih1aC0+ZGVzdCkpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJVRFAgaGVhZGVyOiBjYW4ndCBjb21wcmVzc1xuIik7CisJCS8qIGNvbXByZXNzaW9uIHZhbHVlICovCisJCXRtcCA9IExPV1BBTl9OSENfVURQX0NTX1BfMDA7CisJCWxvd3Bhbl9wdXNoX2hjX2RhdGEoaGNfcHRyLCAmdG1wLCBzaXplb2YodG1wKSk7CisJCS8qIHNvdXJjZSBwb3J0ICovCisJCWxvd3Bhbl9wdXNoX2hjX2RhdGEoaGNfcHRyLCAmdWgtPnNvdXJjZSwgc2l6ZW9mKHVoLT5zb3VyY2UpKTsKKwkJLyogZGVzdGluYXRpb24gcG9ydCAqLworCQlsb3dwYW5fcHVzaF9oY19kYXRhKGhjX3B0ciwgJnVoLT5kZXN0LCBzaXplb2YodWgtPmRlc3QpKTsKKwl9CisKKwkvKiBjaGVja3N1bSBpcyBhbHdheXMgaW5saW5lICovCisJbG93cGFuX3B1c2hfaGNfZGF0YShoY19wdHIsICZ1aC0+Y2hlY2ssIHNpemVvZih1aC0+Y2hlY2spKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1ZHBfbmhpZF9zZXR1cChzdHJ1Y3QgbG93cGFuX25oYyAqbmhjKQoreworCW5oYy0+aWRbMF0gPSBMT1dQQU5fTkhDX1VEUF9JRDsKKwluaGMtPmlkbWFza1swXSA9IExPV1BBTl9OSENfVURQX01BU0s7Cit9CisKK0xPV1BBTl9OSEMobmhjX3VkcCwgIlJGQzYyODIgVURQIiwgTkVYVEhEUl9VRFAsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwKKwkgICB1ZHBfbmhpZF9zZXR1cCwgTE9XUEFOX05IQ19VRFBfSURMRU4sIHVkcF91bmNvbXByZXNzLCB1ZHBfY29tcHJlc3MpOworCittb2R1bGVfbG93cGFuX25oYyhuaGNfdWRwKTsKK01PRFVMRV9ERVNDUklQVElPTigiNkxvV1BBTiBuZXh0IGhlYWRlciBSRkM2MjgyIFVEUCBjb21wcmVzc2lvbiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMi9mYy5jIGIvbmV0LzgwMi9mYy5jCmluZGV4IDdjMTc0YjYuLjdiOTIxOTAgMTAwNjQ0Ci0tLSBhL25ldC84MDIvZmMuYworKysgYi9uZXQvODAyL2ZjLmMKQEAgLTc1LDI5ICs3NSw4IEBACiAJcmV0dXJuIC1oZHJfbGVuOwogfQogCi0vKgotICoJQSBuZWlnaGJvdXIgZGlzY292ZXJ5IG9mIHNvbWUgc3BlY2llcyAoZWcgYXJwKSBoYXMgY29tcGxldGVkLiBXZQotICoJY2FuIG5vdyBzZW5kIHRoZSBwYWNrZXQuCi0gKi8KLQotc3RhdGljIGludCBmY19yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotI2lmZGVmIENPTkZJR19JTkVUCi0Jc3RydWN0IGZjaF9oZHIgKmZjaD0oc3RydWN0IGZjaF9oZHIgKilza2ItPmRhdGE7Ci0Jc3RydWN0IGZjbGxjICpmY2xsYz0oc3RydWN0IGZjbGxjICopKHNrYi0+ZGF0YStzaXplb2Yoc3RydWN0IGZjaF9oZHIpKTsKLQlpZihmY2xsYy0+ZXRoZXJ0eXBlICE9IGh0b25zKEVUSF9QX0lQKSkgewotCQlwcmludGsoImZjX3JlYnVpbGRfaGVhZGVyOiBEb24ndCBrbm93IGhvdyB0byByZXNvbHZlIHR5cGUgJTA0WCBhZGRyZXNzZXMgP1xuIiwgbnRvaHMoZmNsbGMtPmV0aGVydHlwZSkpOwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0dXJuIGFycF9maW5kKGZjaC0+ZGFkZHIsIHNrYik7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCi19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGVhZGVyX29wcyBmY19oZWFkZXJfb3BzID0gewogCS5jcmVhdGUJID0gZmNfaGVhZGVyLAotCS5yZWJ1aWxkID0gZmNfcmVidWlsZF9oZWFkZXIsCiB9OwogCiBzdGF0aWMgdm9pZCBmY19zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvbmV0LzgwMi9mZGRpLmMgYi9uZXQvODAyL2ZkZGkuYwppbmRleCA1OWU3MzQ2Li43ZDNhMGFmIDEwMDY0NAotLS0gYS9uZXQvODAyL2ZkZGkuYworKysgYi9uZXQvODAyL2ZkZGkuYwpAQCAtODcsMzEgKzg3LDYgQEAKIAlyZXR1cm4gLWhsOwogfQogCi0KLS8qCi0gKiBSZWJ1aWxkIHRoZSBGRERJIE1BQyBoZWFkZXIuIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFuIEFSUAotICogKG9yIGluIGZ1dHVyZSBvdGhlciBhZGRyZXNzIHJlc29sdXRpb24pIGhhcyBjb21wbGV0ZWQgb24KLSAqIHRoaXMgc2tfYnVmZi4gIFdlIG5vdyBsZXQgQVJQIGZpbGwgaW4gdGhlIG90aGVyIGZpZWxkcy4KLSAqLwotCi1zdGF0aWMgaW50IGZkZGlfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYJKnNrYikKLXsKLQlzdHJ1Y3QgZmRkaWhkciAqZmRkaSA9IChzdHJ1Y3QgZmRkaWhkciAqKXNrYi0+ZGF0YTsKLQotI2lmZGVmIENPTkZJR19JTkVUCi0JaWYgKGZkZGktPmhkci5sbGNfc25hcC5ldGhlcnR5cGUgPT0gaHRvbnMoRVRIX1BfSVApKQotCQkvKiBUcnkgdG8gZ2V0IEFSUCB0byByZXNvbHZlIHRoZSBoZWFkZXIgYW5kIGZpbGwgZGVzdGluYXRpb24gYWRkcmVzcyAqLwotCQlyZXR1cm4gYXJwX2ZpbmQoZmRkaS0+ZGFkZHIsIHNrYik7Ci0JZWxzZQotI2VuZGlmCi0JewotCQlwcmludGsoIiVzOiBEb24ndCBrbm93IGhvdyB0byByZXNvbHZlIHR5cGUgJTA0WCBhZGRyZXNzZXMuXG4iLAotCQkgICAgICAgc2tiLT5kZXYtPm5hbWUsIG50b2hzKGZkZGktPmhkci5sbGNfc25hcC5ldGhlcnR5cGUpKTsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi0KIC8qCiAgKiBEZXRlcm1pbmUgdGhlIHBhY2tldCdzIHByb3RvY29sIElEIGFuZCBmaWxsIGluIHNrYiBmaWVsZHMuCiAgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJlZm9yZSBhbiBpbmNvbWluZyBwYWNrZXQgaXMgcGFzc2VkCkBAIC0xNzcsNyArMTUyLDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZWFkZXJfb3BzIGZkZGlfaGVhZGVyX29wcyA9IHsKIAkuY3JlYXRlCQk9IGZkZGlfaGVhZGVyLAotCS5yZWJ1aWxkCT0gZmRkaV9yZWJ1aWxkX2hlYWRlciwKIH07CiAKIApkaWZmIC0tZ2l0IGEvbmV0LzgwMi9oaXBwaS5jIGIvbmV0LzgwMi9oaXBwaS5jCmluZGV4IDJlMDNmODIuLmFkZTFhNTIgMTAwNjQ0Ci0tLSBhL25ldC84MDIvaGlwcGkuYworKysgYi9uZXQvODAyL2hpcHBpLmMKQEAgLTkxLDMzICs5MSw2IEBACiAKIAogLyoKLSAqIFJlYnVpbGQgdGhlIEhJUFBJIE1BQyBoZWFkZXIuIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGFuIEFSUCBoYXMKLSAqIGNvbXBsZXRlZCBvbiB0aGlzIHNrX2J1ZmYuIFdlIG5vdyBsZXQgQVJQIGZpbGwgaW4gdGhlIG90aGVyIGZpZWxkcy4KLSAqLwotCi1zdGF0aWMgaW50IGhpcHBpX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGhpcHBpX2hkciAqaGlwID0gKHN0cnVjdCBoaXBwaV9oZHIgKilza2ItPmRhdGE7Ci0KLQkvKgotCSAqIE9ubHkgSVAgaXMgY3VycmVudGx5IHN1cHBvcnRlZAotCSAqLwotCi0JaWYoaGlwLT5zbmFwLmV0aGVydHlwZSAhPSBodG9ucyhFVEhfUF9JUCkpCi0JewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHVuYWJsZSB0byByZXNvbHZlIHR5cGUgJVggYWRkcmVzc2VzLlxuIixza2ItPmRldi0+bmFtZSxudG9ocyhoaXAtPnNuYXAuZXRoZXJ0eXBlKSk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogV2UgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIEFSUCBvbiBISVBQSSwgYnV0IHdlIHVzZSB0aGUgQVJQCi0JICogc3RhdGljIEFSUCB0YWJsZXMgdG8gaG9sZCB0aGUgSS1GSUVMRHMuCi0JICovCi0JcmV0dXJuIGFycF9maW5kKGhpcC0+bGUuZGFkZHIsIHNrYik7Ci19Ci0KLQotLyoKICAqCURldGVybWluZSB0aGUgcGFja2V0J3MgcHJvdG9jb2wgSUQuCiAgKi8KIApAQCAtMTg2LDcgKzE1OSw2IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGVhZGVyX29wcyBoaXBwaV9oZWFkZXJfb3BzID0gewogCS5jcmVhdGUJCT0gaGlwcGlfaGVhZGVyLAotCS5yZWJ1aWxkCT0gaGlwcGlfcmVidWlsZF9oZWFkZXIsCiB9OwogCiAKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuLmMgYi9uZXQvODAyMXEvdmxhbi5jCmluZGV4IDY0YzZiZWQuLjk4YTMwYTUgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW4uYwpAQCAtNDEzLDcgKzQxMywxMCBAQAogCQkJdmxhbl90cmFuc2Zlcl9mZWF0dXJlcyhkZXYsIHZsYW5kZXYpOwogCQlicmVhazsKIAotCWNhc2UgTkVUREVWX0RPV046CisJY2FzZSBORVRERVZfRE9XTjogeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqdG1wOworCQlMSVNUX0hFQUQoY2xvc2VfbGlzdCk7CisKIAkJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fQ1RBR19GSUxURVIpCiAJCQl2bGFuX3ZpZF9kZWwoZGV2LCBodG9ucyhFVEhfUF84MDIxUSksIDApOwogCkBAIC00MjUsMTEgKzQyOCwxOCBAQAogCiAJCQl2bGFuID0gdmxhbl9kZXZfcHJpdih2bGFuZGV2KTsKIAkJCWlmICghKHZsYW4tPmZsYWdzICYgVkxBTl9GTEFHX0xPT1NFX0JJTkRJTkcpKQotCQkJCWRldl9jaGFuZ2VfZmxhZ3ModmxhbmRldiwgZmxncyAmIH5JRkZfVVApOwotCQkJbmV0aWZfc3RhY2tlZF90cmFuc2Zlcl9vcGVyc3RhdGUoZGV2LCB2bGFuZGV2KTsKKwkJCQlsaXN0X2FkZCgmdmxhbmRldi0+Y2xvc2VfbGlzdCwgJmNsb3NlX2xpc3QpOwogCQl9Ci0JCWJyZWFrOwogCisJCWRldl9jbG9zZV9tYW55KCZjbG9zZV9saXN0LCBmYWxzZSk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZsYW5kZXYsIHRtcCwgJmNsb3NlX2xpc3QsIGNsb3NlX2xpc3QpIHsKKwkJCW5ldGlmX3N0YWNrZWRfdHJhbnNmZXJfb3BlcnN0YXRlKGRldiwgdmxhbmRldik7CisJCQlsaXN0X2RlbF9pbml0KCZ2bGFuZGV2LT5jbG9zZV9saXN0KTsKKwkJfQorCQlsaXN0X2RlbCgmY2xvc2VfbGlzdCk7CisJCWJyZWFrOworCX0KIAljYXNlIE5FVERFVl9VUDoKIAkJLyogUHV0IGFsbCBWTEFOcyBmb3IgdGhpcyBkZXYgaW4gdGhlIHVwIHN0YXRlIHRvby4gICovCiAJCXZsYW5fZ3JvdXBfZm9yX2VhY2hfZGV2KGdycCwgaSwgdmxhbmRldikgewpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwppbmRleCAxMTg5NTY0Li4wMWQ3YmE4IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9kZXYuYworKysgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwpAQCAtMzcsMzkgKzM3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRwb2xsLmg+CiAKIC8qCi0gKglSZWJ1aWxkIHRoZSBFdGhlcm5ldCBNQUMgaGVhZGVyLiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbiBBUlAKLSAqCShvciBpbiBmdXR1cmUgb3RoZXIgYWRkcmVzcyByZXNvbHV0aW9uKSBoYXMgY29tcGxldGVkIG9uIHRoaXMKLSAqCXNrX2J1ZmYuIFdlIG5vdyBsZXQgQVJQIGZpbGwgaW4gdGhlIG90aGVyIGZpZWxkcy4KLSAqCi0gKglUaGlzIHJvdXRpbmUgQ0FOTk9UIHVzZSBjYWNoZWQgZHN0LT5uZWlnaCEKLSAqCVJlYWxseSwgaXQgaXMgdXNlZCBvbmx5IHdoZW4gZHN0LT5uZWlnaCBpcyB3cm9uZy4KLSAqCi0gKiBUT0RPOiAgVGhpcyBuZWVkcyBhIGNoZWNrdXAsIEknbSBpZ25vcmFudCBoZXJlLiAtLUJMRwotICovCi1zdGF0aWMgaW50IHZsYW5fZGV2X3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwotCXN0cnVjdCB2bGFuX2V0aGhkciAqdmV0aCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKikoc2tiLT5kYXRhKTsKLQotCXN3aXRjaCAodmV0aC0+aF92bGFuX2VuY2Fwc3VsYXRlZF9wcm90bykgewotI2lmZGVmIENPTkZJR19JTkVUCi0JY2FzZSBodG9ucyhFVEhfUF9JUCk6Ci0KLQkJLyogVE9ETzogIENvbmZpcm0gdGhpcyB3aWxsIHdvcmsgd2l0aCBWTEFOIGhlYWRlcnMuLi4gKi8KLQkJcmV0dXJuIGFycF9maW5kKHZldGgtPmhfZGVzdCwgc2tiKTsKLSNlbmRpZgotCWRlZmF1bHQ6Ci0JCXByX2RlYnVnKCIlczogdW5hYmxlIHRvIHJlc29sdmUgdHlwZSAlWCBhZGRyZXNzZXNcbiIsCi0JCQkgZGV2LT5uYW1lLCBudG9ocyh2ZXRoLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvKSk7Ci0KLQkJZXRoZXJfYWRkcl9jb3B5KHZldGgtPmhfc291cmNlLCBkZXYtPmRldl9hZGRyKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCiAgKglDcmVhdGUgdGhlIFZMQU4gaGVhZGVyIGZvciBhbiBhcmJpdHJhcnkgcHJvdG9jb2wgbGF5ZXIKICAqCiAgKglzYWRkcj1OVUxMCW1lYW5zIHVzZSBkZXZpY2Ugc291cmNlIGFkZHJlc3MKQEAgLTUzNCw3ICs1MDEsNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhlYWRlcl9vcHMgdmxhbl9oZWFkZXJfb3BzID0gewogCS5jcmVhdGUJID0gdmxhbl9kZXZfaGFyZF9oZWFkZXIsCi0JLnJlYnVpbGQgPSB2bGFuX2Rldl9yZWJ1aWxkX2hlYWRlciwKIAkucGFyc2UJID0gZXRoX2hlYWRlcl9wYXJzZSwKIH07CiAKQEAgLTU1NCw3ICs1MjAsNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhlYWRlcl9vcHMgdmxhbl9wYXNzdGhydV9oZWFkZXJfb3BzID0gewogCS5jcmVhdGUJID0gdmxhbl9wYXNzdGhydV9oYXJkX2hlYWRlciwKLQkucmVidWlsZCA9IGRldl9yZWJ1aWxkX2hlYWRlciwKIAkucGFyc2UJID0gZXRoX2hlYWRlcl9wYXJzZSwKIH07CiAKQEAgLTU3Myw3ICs1MzgsNiBAQAogCS8qIElGRl9CUk9BRENBU1R8SUZGX01VTFRJQ0FTVDsgPz8/ICovCiAJZGV2LT5mbGFncyAgPSByZWFsX2Rldi0+ZmxhZ3MgJiB+KElGRl9VUCB8IElGRl9QUk9NSVNDIHwgSUZGX0FMTE1VTFRJIHwKIAkJCQkJICBJRkZfTUFTVEVSIHwgSUZGX1NMQVZFKTsKLQlkZXYtPmlmbGluayA9IHJlYWxfZGV2LT5pZmluZGV4OwogCWRldi0+c3RhdGUgID0gKHJlYWxfZGV2LT5zdGF0ZSAmICgoMTw8X19MSU5LX1NUQVRFX05PQ0FSUklFUikgfAogCQkJCQkgICgxPDxfX0xJTktfU1RBVEVfRE9STUFOVCkpKSB8CiAJCSAgICAgICgxPDxfX0xJTktfU1RBVEVfUFJFU0VOVCk7CkBAIC01ODksNiArNTUzLDcgQEAKIAlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfVkxBTl9GRUFUVVJFUykKIAkJbmV0ZGV2X3dhcm4ocmVhbF9kZXYsICJWTEFOIGZlYXR1cmVzIGFyZSBzZXQgaW5jb3JyZWN0bHkuICBRLWluLVEgY29uZmlndXJhdGlvbnMgbWF5IG5vdCB3b3JrIGNvcnJlY3RseS5cbiIpOwogCisJZGV2LT52bGFuX2ZlYXR1cmVzID0gcmVhbF9kZXYtPnZsYW5fZmVhdHVyZXMgJiB+TkVUSUZfRl9BTExfRkNPRTsKIAogCS8qIGlwdjYgc2hhcmVkIGNhcmQgcmVsYXRlZCBzdHVmZiAqLwogCWRldi0+ZGV2X2lkID0gcmVhbF9kZXYtPmRldl9pZDsKQEAgLTc2Nyw2ICs3MzIsMTMgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUiAqLwogCitzdGF0aWMgaW50IHZsYW5fZGV2X2dldF9pZmxpbmsoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OworCisJcmV0dXJuIHJlYWxfZGV2LT5pZmluZGV4OworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHZsYW5fZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncwkgICAgICAgID0gdmxhbl9ldGh0b29sX2dldF9zZXR0aW5ncywKIAkuZ2V0X2RydmluZm8JICAgICAgICA9IHZsYW5fZXRodG9vbF9nZXRfZHJ2aW5mbywKQEAgLTgwMyw2ICs3NzUsNyBAQAogI2VuZGlmCiAJLm5kb19maXhfZmVhdHVyZXMJPSB2bGFuX2Rldl9maXhfZmVhdHVyZXMsCiAJLm5kb19nZXRfbG9ja19zdWJjbGFzcyAgPSB2bGFuX2Rldl9nZXRfbG9ja19zdWJjbGFzcywKKwkubmRvX2dldF9pZmxpbmsJCT0gdmxhbl9kZXZfZ2V0X2lmbGluaywKIH07CiAKIHN0YXRpYyB2b2lkIHZsYW5fZGV2X2ZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTgyNyw1ICs4MDAsNSBAQAogCWRldi0+ZGVzdHJ1Y3RvcgkJPSB2bGFuX2Rldl9mcmVlOwogCWRldi0+ZXRodG9vbF9vcHMJPSAmdmxhbl9ldGh0b29sX29wczsKIAotCW1lbXNldChkZXYtPmJyb2FkY2FzdCwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIoZGV2LT5icm9hZGNhc3QpOwogfQpkaWZmIC0tZ2l0IGEvbmV0LzlwL2NsaWVudC5jIGIvbmV0LzlwL2NsaWVudC5jCmluZGV4IGU4NmE5YmUuLjZmNGM0YzggMTAwNjQ0Ci0tLSBhL25ldC85cC9jbGllbnQuYworKysgYi9uZXQvOXAvY2xpZW50LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvdWlvLmg+CiAjaW5jbHVkZSA8bmV0LzlwLzlwLmg+CiAjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bmV0LzlwL2NsaWVudC5oPgpAQCAtNTU1LDcgKzU1Niw3IEBACiAgKi8KIAogc3RhdGljIGludCBwOV9jaGVja196Y19lcnJvcnMoc3RydWN0IHA5X2NsaWVudCAqYywgc3RydWN0IHA5X3JlcV90ICpyZXEsCi0JCQkgICAgICBjaGFyICp1aWRhdGEsIGludCBpbl9oZHJsZW4sIGludCBrZXJuX2J1ZikKKwkJCSAgICAgIHN0cnVjdCBpb3ZfaXRlciAqdWlkYXRhLCBpbnQgaW5faGRybGVuKQogewogCWludCBlcnI7CiAJaW50IGVjb2RlOwpAQCAtNTkxLDE2ICs1OTIsMTEgQEAKIAkJZW5hbWUgPSAmcmVxLT5yYy0+c2RhdGFbcmVxLT5yYy0+b2Zmc2V0XTsKIAkJaWYgKGxlbiA+IGlubGluZV9sZW4pIHsKIAkJCS8qIFdlIGhhdmUgZXJyb3IgaW4gZXh0ZXJuYWwgYnVmZmVyICovCi0JCQlpZiAoa2Vybl9idWYpIHsKLQkJCQltZW1jcHkoZW5hbWUgKyBpbmxpbmVfbGVuLCB1aWRhdGEsCi0JCQkJICAgICAgIGxlbiAtIGlubGluZV9sZW4pOwotCQkJfSBlbHNlIHsKLQkJCQllcnIgPSBjb3B5X2Zyb21fdXNlcihlbmFtZSArIGlubGluZV9sZW4sCi0JCQkJCQkgICAgIHVpZGF0YSwgbGVuIC0gaW5saW5lX2xlbik7Ci0JCQkJaWYgKGVycikgewotCQkJCQllcnIgPSAtRUZBVUxUOwotCQkJCQlnb3RvIG91dF9lcnI7Ci0JCQkJfQorCQkJZXJyID0gY29weV9mcm9tX2l0ZXIoZW5hbWUgKyBpbmxpbmVfbGVuLAorCQkJCQkgICAgIGxlbiAtIGlubGluZV9sZW4sIHVpZGF0YSk7CisJCQlpZiAoZXJyICE9IGxlbiAtIGlubGluZV9sZW4pIHsKKwkJCQllcnIgPSAtRUZBVUxUOworCQkJCWdvdG8gb3V0X2VycjsKIAkJCX0KIAkJfQogCQllbmFtZSA9IE5VTEw7CkBAIC04MDYsOCArODAyLDggQEAKICAqIHA5X2NsaWVudF96Y19ycGMgLSBpc3N1ZSBhIHJlcXVlc3QgYW5kIHdhaXQgZm9yIGEgcmVzcG9uc2UKICAqIEBjOiBjbGllbnQgc2Vzc2lvbgogICogQHR5cGU6IHR5cGUgb2YgcmVxdWVzdAotICogQHVpZGF0YTogdXNlciBiZmZlciB0aGF0IHNob3VsZCBiZSB1ZWQgZm9yIHplcm8gY29weSByZWFkCi0gKiBAdW9kYXRhOiB1c2VyIGJ1ZmZlciB0aGF0IHNob3VkIGJlIHVzZXIgZm9yIHplcm8gY29weSB3cml0ZQorICogQHVpZGF0YTogZGVzdGluYXRpb24gZm9yIHplcm8gY29weSByZWFkCisgKiBAdW9kYXRhOiBzb3VyY2UgZm9yIHplcm8gY29weSB3cml0ZQogICogQGlubGVuOiByZWFkIGJ1ZmZlciBzaXplCiAgKiBAb2xlbjogd3JpdGUgYnVmZmVyIHNpemUKICAqIEBoZHJsZW46IHJlYWRlciBoZWFkZXIgc2l6ZSwgVGhpcyBpcyB0aGUgc2l6ZSBvZiByZXNwb25zZSBwcm90b2NvbCBkYXRhCkBAIC04MTYsOSArODEyLDEwIEBACiAgKiBSZXR1cm5zIHJlcXVlc3Qgc3RydWN0dXJlICh3aGljaCBjbGllbnQgbXVzdCBmcmVlIHVzaW5nIHA5X2ZyZWVfcmVxKQogICovCiBzdGF0aWMgc3RydWN0IHA5X3JlcV90ICpwOV9jbGllbnRfemNfcnBjKHN0cnVjdCBwOV9jbGllbnQgKmMsIGludDhfdCB0eXBlLAotCQkJCQkgY2hhciAqdWlkYXRhLCBjaGFyICp1b2RhdGEsCisJCQkJCSBzdHJ1Y3QgaW92X2l0ZXIgKnVpZGF0YSwKKwkJCQkJIHN0cnVjdCBpb3ZfaXRlciAqdW9kYXRhLAogCQkJCQkgaW50IGlubGVuLCBpbnQgb2xlbiwgaW50IGluX2hkcmxlbiwKLQkJCQkJIGludCBrZXJuX2J1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJCQkJCSBjb25zdCBjaGFyICpmbXQsIC4uLikKIHsKIAl2YV9saXN0IGFwOwogCWludCBzaWdwZW5kaW5nLCBlcnI7CkBAIC04NDEsMTIgKzgzOCw4IEBACiAJfSBlbHNlCiAJCXNpZ3BlbmRpbmcgPSAwOwogCi0JLyogSWYgd2UgYXJlIGNhbGxlZCB3aXRoIEtFUk5FTF9EUyBmb3JjZSBrZXJuX2J1ZiAqLwotCWlmIChzZWdtZW50X2VxKGdldF9mcygpLCBLRVJORUxfRFMpKQotCQlrZXJuX2J1ZiA9IDE7Ci0KIAllcnIgPSBjLT50cmFuc19tb2QtPnpjX3JlcXVlc3QoYywgcmVxLCB1aWRhdGEsIHVvZGF0YSwKLQkJCQkgICAgICAgaW5sZW4sIG9sZW4sIGluX2hkcmxlbiwga2Vybl9idWYpOworCQkJCSAgICAgICBpbmxlbiwgb2xlbiwgaW5faGRybGVuKTsKIAlpZiAoZXJyIDwgMCkgewogCQlpZiAoZXJyID09IC1FSU8pCiAJCQljLT5zdGF0dXMgPSBEaXNjb25uZWN0ZWQ7CkBAIC04NzYsNyArODY5LDcgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byByZXRlcnI7CiAKLQllcnIgPSBwOV9jaGVja196Y19lcnJvcnMoYywgcmVxLCB1aWRhdGEsIGluX2hkcmxlbiwga2Vybl9idWYpOworCWVyciA9IHA5X2NoZWNrX3pjX2Vycm9ycyhjLCByZXEsIHVpZGF0YSwgaW5faGRybGVuKTsKIAl0cmFjZV85cF9jbGllbnRfcmVzKGMsIHR5cGUsIHJlcS0+cmMtPnRhZywgZXJyKTsKIAlpZiAoIWVycikKIAkJcmV0dXJuIHJlcTsKQEAgLTExMjMsNiArMTExNiw3IEBACiAJCWZpZCA9IE5VTEw7CiAJCWdvdG8gZXJyb3I7CiAJfQorCWZpZC0+dWlkID0gbl91bmFtZTsKIAogCXJlcSA9IHA5X2NsaWVudF9ycGMoY2xudCwgUDlfVEFUVEFDSCwgImRkc3M/dSIsIGZpZC0+ZmlkLAogCQkJYWZpZCA/IGFmaWQtPmZpZCA6IFA5X05PRklELCB1bmFtZSwgYW5hbWUsIG5fdW5hbWUpOwpAQCAtMTU0MSwxNDIgKzE1MzUsMTI4IEBACiBFWFBPUlRfU1lNQk9MKHA5X2NsaWVudF91bmxpbmthdCk7CiAKIGludAotcDlfY2xpZW50X3JlYWQoc3RydWN0IHA5X2ZpZCAqZmlkLCBjaGFyICpkYXRhLCBjaGFyIF9fdXNlciAqdWRhdGEsIHU2NCBvZmZzZXQsCi0JCQkJCQkJCXUzMiBjb3VudCkKK3A5X2NsaWVudF9yZWFkKHN0cnVjdCBwOV9maWQgKmZpZCwgdTY0IG9mZnNldCwgc3RydWN0IGlvdl9pdGVyICp0bywgaW50ICplcnIpCiB7Ci0JY2hhciAqZGF0YXB0cjsKLQlpbnQga2VybmVsX2J1ZiA9IDA7CisJc3RydWN0IHA5X2NsaWVudCAqY2xudCA9IGZpZC0+Y2xudDsKIAlzdHJ1Y3QgcDlfcmVxX3QgKnJlcTsKLQlzdHJ1Y3QgcDlfY2xpZW50ICpjbG50OwotCWludCBlcnIsIHJzaXplLCBub25femMgPSAwOwotCisJaW50IHRvdGFsID0gMDsKIAogCXA5X2RlYnVnKFA5X0RFQlVHXzlQLCAiPj4+IFRSRUFEIGZpZCAlZCBvZmZzZXQgJWxsdSAlZFxuIiwKLQkJICAgZmlkLT5maWQsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZnNldCwgY291bnQpOwotCWVyciA9IDA7Ci0JY2xudCA9IGZpZC0+Y2xudDsKKwkJICAgZmlkLT5maWQsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZnNldCwgKGludClpb3ZfaXRlcl9jb3VudCh0bykpOwogCi0JcnNpemUgPSBmaWQtPmlvdW5pdDsKLQlpZiAoIXJzaXplIHx8IHJzaXplID4gY2xudC0+bXNpemUtUDlfSU9IRFJTWikKLQkJcnNpemUgPSBjbG50LT5tc2l6ZSAtIFA5X0lPSERSU1o7CisJd2hpbGUgKGlvdl9pdGVyX2NvdW50KHRvKSkgeworCQlpbnQgY291bnQgPSBpb3ZfaXRlcl9jb3VudCh0byk7CisJCWludCByc2l6ZSwgbm9uX3pjID0gMDsKKwkJY2hhciAqZGF0YXB0cjsKKwkJCQorCQlyc2l6ZSA9IGZpZC0+aW91bml0OworCQlpZiAoIXJzaXplIHx8IHJzaXplID4gY2xudC0+bXNpemUtUDlfSU9IRFJTWikKKwkJCXJzaXplID0gY2xudC0+bXNpemUgLSBQOV9JT0hEUlNaOwogCi0JaWYgKGNvdW50IDwgcnNpemUpCi0JCXJzaXplID0gY291bnQ7CisJCWlmIChjb3VudCA8IHJzaXplKQorCQkJcnNpemUgPSBjb3VudDsKIAotCS8qIERvbid0IGJvdGhlciB6ZXJvY29weSBmb3Igc21hbGwgSU8gKDwgMTAyNCkgKi8KLQlpZiAoY2xudC0+dHJhbnNfbW9kLT56Y19yZXF1ZXN0ICYmIHJzaXplID4gMTAyNCkgewotCQljaGFyICppbmRhdGE7Ci0JCWlmIChkYXRhKSB7Ci0JCQlrZXJuZWxfYnVmID0gMTsKLQkJCWluZGF0YSA9IGRhdGE7Ci0JCX0gZWxzZQotCQkJaW5kYXRhID0gKF9fZm9yY2UgY2hhciAqKXVkYXRhOwotCQkvKgotCQkgKiByZXNwb25zZSBoZWFkZXIgbGVuIGlzIDExCi0JCSAqIFBEVSBIZWFkZXIoNykgKyBJTyBTaXplICg0KQotCQkgKi8KLQkJcmVxID0gcDlfY2xpZW50X3pjX3JwYyhjbG50LCBQOV9UUkVBRCwgaW5kYXRhLCBOVUxMLCByc2l6ZSwgMCwKLQkJCQkgICAgICAgMTEsIGtlcm5lbF9idWYsICJkcWQiLCBmaWQtPmZpZCwKLQkJCQkgICAgICAgb2Zmc2V0LCByc2l6ZSk7Ci0JfSBlbHNlIHsKLQkJbm9uX3pjID0gMTsKLQkJcmVxID0gcDlfY2xpZW50X3JwYyhjbG50LCBQOV9UUkVBRCwgImRxZCIsIGZpZC0+ZmlkLCBvZmZzZXQsCi0JCQkJICAgIHJzaXplKTsKLQl9Ci0JaWYgKElTX0VSUihyZXEpKSB7Ci0JCWVyciA9IFBUUl9FUlIocmVxKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQllcnIgPSBwOXBkdV9yZWFkZihyZXEtPnJjLCBjbG50LT5wcm90b192ZXJzaW9uLCAiRCIsICZjb3VudCwgJmRhdGFwdHIpOwotCWlmIChlcnIpIHsKLQkJdHJhY2VfOXBfcHJvdG9jb2xfZHVtcChjbG50LCByZXEtPnJjKTsKLQkJZ290byBmcmVlX2FuZF9lcnJvcjsKLQl9Ci0KLQlwOV9kZWJ1ZyhQOV9ERUJVR185UCwgIjw8PCBSUkVBRCBjb3VudCAlZFxuIiwgY291bnQpOwotCi0JaWYgKG5vbl96YykgewotCQlpZiAoZGF0YSkgewotCQkJbWVtbW92ZShkYXRhLCBkYXRhcHRyLCBjb3VudCk7CisJCS8qIERvbid0IGJvdGhlciB6ZXJvY29weSBmb3Igc21hbGwgSU8gKDwgMTAyNCkgKi8KKwkJaWYgKGNsbnQtPnRyYW5zX21vZC0+emNfcmVxdWVzdCAmJiByc2l6ZSA+IDEwMjQpIHsKKwkJCS8qCisJCQkgKiByZXNwb25zZSBoZWFkZXIgbGVuIGlzIDExCisJCQkgKiBQRFUgSGVhZGVyKDcpICsgSU8gU2l6ZSAoNCkKKwkJCSAqLworCQkJcmVxID0gcDlfY2xpZW50X3pjX3JwYyhjbG50LCBQOV9UUkVBRCwgdG8sIE5VTEwsIHJzaXplLAorCQkJCQkgICAgICAgMCwgMTEsICJkcWQiLCBmaWQtPmZpZCwKKwkJCQkJICAgICAgIG9mZnNldCwgcnNpemUpOwogCQl9IGVsc2UgewotCQkJZXJyID0gY29weV90b191c2VyKHVkYXRhLCBkYXRhcHRyLCBjb3VudCk7Ci0JCQlpZiAoZXJyKSB7Ci0JCQkJZXJyID0gLUVGQVVMVDsKLQkJCQlnb3RvIGZyZWVfYW5kX2Vycm9yOwotCQkJfQorCQkJbm9uX3pjID0gMTsKKwkJCXJlcSA9IHA5X2NsaWVudF9ycGMoY2xudCwgUDlfVFJFQUQsICJkcWQiLCBmaWQtPmZpZCwgb2Zmc2V0LAorCQkJCQkgICAgcnNpemUpOwogCQl9Ci0JfQotCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7Ci0JcmV0dXJuIGNvdW50OworCQlpZiAoSVNfRVJSKHJlcSkpIHsKKwkJCSplcnIgPSBQVFJfRVJSKHJlcSk7CisJCQlicmVhazsKKwkJfQogCi1mcmVlX2FuZF9lcnJvcjoKLQlwOV9mcmVlX3JlcShjbG50LCByZXEpOwotZXJyb3I6Ci0JcmV0dXJuIGVycjsKKwkJKmVyciA9IHA5cGR1X3JlYWRmKHJlcS0+cmMsIGNsbnQtPnByb3RvX3ZlcnNpb24sCisJCQkJICAgIkQiLCAmY291bnQsICZkYXRhcHRyKTsKKwkJaWYgKCplcnIpIHsKKwkJCXRyYWNlXzlwX3Byb3RvY29sX2R1bXAoY2xudCwgcmVxLT5yYyk7CisJCQlwOV9mcmVlX3JlcShjbG50LCByZXEpOworCQkJYnJlYWs7CisJCX0KKworCQlwOV9kZWJ1ZyhQOV9ERUJVR185UCwgIjw8PCBSUkVBRCBjb3VudCAlZFxuIiwgY291bnQpOworCQlpZiAoIWNvdW50KSB7CisJCQlwOV9mcmVlX3JlcShjbG50LCByZXEpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobm9uX3pjKSB7CisJCQlpbnQgbiA9IGNvcHlfdG9faXRlcihkYXRhcHRyLCBjb3VudCwgdG8pOworCQkJdG90YWwgKz0gbjsKKwkJCW9mZnNldCArPSBuOworCQkJaWYgKG4gIT0gY291bnQpIHsKKwkJCQkqZXJyID0gLUVGQVVMVDsKKwkJCQlwOV9mcmVlX3JlcShjbG50LCByZXEpOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaW92X2l0ZXJfYWR2YW5jZSh0bywgY291bnQpOworCQkJdG90YWwgKz0gY291bnQ7CisJCQlvZmZzZXQgKz0gY291bnQ7CisJCX0KKwkJcDlfZnJlZV9yZXEoY2xudCwgcmVxKTsKKwl9CisJcmV0dXJuIHRvdGFsOwogfQogRVhQT1JUX1NZTUJPTChwOV9jbGllbnRfcmVhZCk7CiAKIGludAotcDlfY2xpZW50X3dyaXRlKHN0cnVjdCBwOV9maWQgKmZpZCwgY2hhciAqZGF0YSwgY29uc3QgY2hhciBfX3VzZXIgKnVkYXRhLAotCQkJCQkJCXU2NCBvZmZzZXQsIHUzMiBjb3VudCkKK3A5X2NsaWVudF93cml0ZShzdHJ1Y3QgcDlfZmlkICpmaWQsIHU2NCBvZmZzZXQsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSwgaW50ICplcnIpCiB7Ci0JaW50IGVyciwgcnNpemU7Ci0JaW50IGtlcm5lbF9idWYgPSAwOwotCXN0cnVjdCBwOV9jbGllbnQgKmNsbnQ7CisJc3RydWN0IHA5X2NsaWVudCAqY2xudCA9IGZpZC0+Y2xudDsKIAlzdHJ1Y3QgcDlfcmVxX3QgKnJlcTsKKwlpbnQgdG90YWwgPSAwOwogCi0JcDlfZGVidWcoUDlfREVCVUdfOVAsICI+Pj4gVFdSSVRFIGZpZCAlZCBvZmZzZXQgJWxsdSBjb3VudCAlZFxuIiwKLQkJCQlmaWQtPmZpZCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2Zmc2V0LCBjb3VudCk7Ci0JZXJyID0gMDsKLQljbG50ID0gZmlkLT5jbG50OworCXA5X2RlYnVnKFA5X0RFQlVHXzlQLCAiPj4+IFRXUklURSBmaWQgJWQgb2Zmc2V0ICVsbHUgY291bnQgJXpkXG4iLAorCQkJCWZpZC0+ZmlkLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmZzZXQsCisJCQkJaW92X2l0ZXJfY291bnQoZnJvbSkpOwogCi0JcnNpemUgPSBmaWQtPmlvdW5pdDsKLQlpZiAoIXJzaXplIHx8IHJzaXplID4gY2xudC0+bXNpemUtUDlfSU9IRFJTWikKLQkJcnNpemUgPSBjbG50LT5tc2l6ZSAtIFA5X0lPSERSU1o7CisJd2hpbGUgKGlvdl9pdGVyX2NvdW50KGZyb20pKSB7CisJCWludCBjb3VudCA9IGlvdl9pdGVyX2NvdW50KGZyb20pOworCQlpbnQgcnNpemUgPSBmaWQtPmlvdW5pdDsKKwkJaWYgKCFyc2l6ZSB8fCByc2l6ZSA+IGNsbnQtPm1zaXplLVA5X0lPSERSU1opCisJCQlyc2l6ZSA9IGNsbnQtPm1zaXplIC0gUDlfSU9IRFJTWjsKIAotCWlmIChjb3VudCA8IHJzaXplKQotCQlyc2l6ZSA9IGNvdW50OworCQlpZiAoY291bnQgPCByc2l6ZSkKKwkJCXJzaXplID0gY291bnQ7CiAKLQkvKiBEb24ndCBib3RoZXIgemVyb2NvcHkgZm9yIHNtYWxsIElPICg8IDEwMjQpICovCi0JaWYgKGNsbnQtPnRyYW5zX21vZC0+emNfcmVxdWVzdCAmJiByc2l6ZSA+IDEwMjQpIHsKLQkJY2hhciAqb2RhdGE7Ci0JCWlmIChkYXRhKSB7Ci0JCQlrZXJuZWxfYnVmID0gMTsKLQkJCW9kYXRhID0gZGF0YTsKLQkJfSBlbHNlCi0JCQlvZGF0YSA9IChjaGFyICopdWRhdGE7Ci0JCXJlcSA9IHA5X2NsaWVudF96Y19ycGMoY2xudCwgUDlfVFdSSVRFLCBOVUxMLCBvZGF0YSwgMCwgcnNpemUsCi0JCQkJICAgICAgIFA5X1pDX0hEUl9TWiwga2VybmVsX2J1ZiwgImRxZCIsCi0JCQkJICAgICAgIGZpZC0+ZmlkLCBvZmZzZXQsIHJzaXplKTsKLQl9IGVsc2UgewotCQlpZiAoZGF0YSkKLQkJCXJlcSA9IHA5X2NsaWVudF9ycGMoY2xudCwgUDlfVFdSSVRFLCAiZHFEIiwgZmlkLT5maWQsCi0JCQkJCSAgICBvZmZzZXQsIHJzaXplLCBkYXRhKTsKLQkJZWxzZQotCQkJcmVxID0gcDlfY2xpZW50X3JwYyhjbG50LCBQOV9UV1JJVEUsICJkcVUiLCBmaWQtPmZpZCwKLQkJCQkJICAgIG9mZnNldCwgcnNpemUsIHVkYXRhKTsKKwkJLyogRG9uJ3QgYm90aGVyIHplcm9jb3B5IGZvciBzbWFsbCBJTyAoPCAxMDI0KSAqLworCQlpZiAoY2xudC0+dHJhbnNfbW9kLT56Y19yZXF1ZXN0ICYmIHJzaXplID4gMTAyNCkgeworCQkJcmVxID0gcDlfY2xpZW50X3pjX3JwYyhjbG50LCBQOV9UV1JJVEUsIE5VTEwsIGZyb20sIDAsCisJCQkJCSAgICAgICByc2l6ZSwgUDlfWkNfSERSX1NaLCAiZHFkIiwKKwkJCQkJICAgICAgIGZpZC0+ZmlkLCBvZmZzZXQsIHJzaXplKTsKKwkJfSBlbHNlIHsKKwkJCXJlcSA9IHA5X2NsaWVudF9ycGMoY2xudCwgUDlfVFdSSVRFLCAiZHFWIiwgZmlkLT5maWQsCisJCQkJCQkgICAgb2Zmc2V0LCByc2l6ZSwgZnJvbSk7CisJCX0KKwkJaWYgKElTX0VSUihyZXEpKSB7CisJCQkqZXJyID0gUFRSX0VSUihyZXEpOworCQkJYnJlYWs7CisJCX0KKworCQkqZXJyID0gcDlwZHVfcmVhZGYocmVxLT5yYywgY2xudC0+cHJvdG9fdmVyc2lvbiwgImQiLCAmY291bnQpOworCQlpZiAoKmVycikgeworCQkJdHJhY2VfOXBfcHJvdG9jb2xfZHVtcChjbG50LCByZXEtPnJjKTsKKwkJCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7CisJCX0KKworCQlwOV9kZWJ1ZyhQOV9ERUJVR185UCwgIjw8PCBSV1JJVEUgY291bnQgJWRcbiIsIGNvdW50KTsKKworCQlwOV9mcmVlX3JlcShjbG50LCByZXEpOworCQlpb3ZfaXRlcl9hZHZhbmNlKGZyb20sIGNvdW50KTsKKwkJdG90YWwgKz0gY291bnQ7CisJCW9mZnNldCArPSBjb3VudDsKIAl9Ci0JaWYgKElTX0VSUihyZXEpKSB7Ci0JCWVyciA9IFBUUl9FUlIocmVxKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQllcnIgPSBwOXBkdV9yZWFkZihyZXEtPnJjLCBjbG50LT5wcm90b192ZXJzaW9uLCAiZCIsICZjb3VudCk7Ci0JaWYgKGVycikgewotCQl0cmFjZV85cF9wcm90b2NvbF9kdW1wKGNsbnQsIHJlcS0+cmMpOwotCQlnb3RvIGZyZWVfYW5kX2Vycm9yOwotCX0KLQotCXA5X2RlYnVnKFA5X0RFQlVHXzlQLCAiPDw8IFJXUklURSBjb3VudCAlZFxuIiwgY291bnQpOwotCi0JcDlfZnJlZV9yZXEoY2xudCwgcmVxKTsKLQlyZXR1cm4gY291bnQ7Ci0KLWZyZWVfYW5kX2Vycm9yOgotCXA5X2ZyZWVfcmVxKGNsbnQsIHJlcSk7Ci1lcnJvcjoKLQlyZXR1cm4gZXJyOworCXJldHVybiB0b3RhbDsKIH0KIEVYUE9SVF9TWU1CT0wocDlfY2xpZW50X3dyaXRlKTsKIApAQCAtMjA2OCw2ICsyMDQ4LDEwIEBACiAJc3RydWN0IHA5X2NsaWVudCAqY2xudDsKIAlzdHJ1Y3QgcDlfcmVxX3QgKnJlcTsKIAljaGFyICpkYXRhcHRyOworCXN0cnVjdCBrdmVjIGt2ID0gey5pb3ZfYmFzZSA9IGRhdGEsIC5pb3ZfbGVuID0gY291bnR9OworCXN0cnVjdCBpb3ZfaXRlciB0bzsKKworCWlvdl9pdGVyX2t2ZWMoJnRvLCBSRUFEIHwgSVRFUl9LVkVDLCAma3YsIDEsIGNvdW50KTsKIAogCXA5X2RlYnVnKFA5X0RFQlVHXzlQLCAiPj4+IFRSRUFERElSIGZpZCAlZCBvZmZzZXQgJWxsdSBjb3VudCAlZFxuIiwKIAkJCQlmaWQtPmZpZCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2Zmc2V0LCBjb3VudCk7CkBAIC0yMDg4LDggKzIwNzIsOCBAQAogCQkgKiByZXNwb25zZSBoZWFkZXIgbGVuIGlzIDExCiAJCSAqIFBEVSBIZWFkZXIoNykgKyBJTyBTaXplICg0KQogCQkgKi8KLQkJcmVxID0gcDlfY2xpZW50X3pjX3JwYyhjbG50LCBQOV9UUkVBRERJUiwgZGF0YSwgTlVMTCwgcnNpemUsIDAsCi0JCQkJICAgICAgIDExLCAxLCAiZHFkIiwgZmlkLT5maWQsIG9mZnNldCwgcnNpemUpOworCQlyZXEgPSBwOV9jbGllbnRfemNfcnBjKGNsbnQsIFA5X1RSRUFERElSLCAmdG8sIE5VTEwsIHJzaXplLCAwLAorCQkJCSAgICAgICAxMSwgImRxZCIsIGZpZC0+ZmlkLCBvZmZzZXQsIHJzaXplKTsKIAl9IGVsc2UgewogCQlub25femMgPSAxOwogCQlyZXEgPSBwOV9jbGllbnRfcnBjKGNsbnQsIFA5X1RSRUFERElSLCAiZHFkIiwgZmlkLT5maWQsCmRpZmYgLS1naXQgYS9uZXQvOXAvcHJvdG9jb2wuYyBiL25ldC85cC9wcm90b2NvbC5jCmluZGV4IGFiOTEyN2UuLmU5ZDBmMGMgMTAwNjQ0Ci0tLSBhL25ldC85cC9wcm90b2NvbC5jCisrKyBiL25ldC85cC9wcm90b2NvbC5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Vpby5oPgogI2luY2x1ZGUgPG5ldC85cC85cC5oPgogI2luY2x1ZGUgPG5ldC85cC9jbGllbnQuaD4KICNpbmNsdWRlICJwcm90b2NvbC5oIgpAQCAtNjksMTAgKzcwLDExIEBACiB9CiAKIHN0YXRpYyBzaXplX3QKLXBkdV93cml0ZV91KHN0cnVjdCBwOV9mY2FsbCAqcGR1LCBjb25zdCBjaGFyIF9fdXNlciAqdWRhdGEsIHNpemVfdCBzaXplKQorcGR1X3dyaXRlX3Uoc3RydWN0IHA5X2ZjYWxsICpwZHUsIHN0cnVjdCBpb3ZfaXRlciAqZnJvbSwgc2l6ZV90IHNpemUpCiB7CiAJc2l6ZV90IGxlbiA9IG1pbihwZHUtPmNhcGFjaXR5IC0gcGR1LT5zaXplLCBzaXplKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoJnBkdS0+c2RhdGFbcGR1LT5zaXplXSwgdWRhdGEsIGxlbikpCisJc3RydWN0IGlvdl9pdGVyIGkgPSAqZnJvbTsKKwlpZiAoY29weV9mcm9tX2l0ZXIoJnBkdS0+c2RhdGFbcGR1LT5zaXplXSwgbGVuLCAmaSkgIT0gbGVuKQogCQlsZW4gPSAwOwogCiAJcGR1LT5zaXplICs9IGxlbjsKQEAgLTQzNywyMyArNDM5LDEzIEBACiAJCQkJCQkgc3RidWYtPmV4dGVuc2lvbiwgc3RidWYtPm5fdWlkLAogCQkJCQkJIHN0YnVmLT5uX2dpZCwgc3RidWYtPm5fbXVpZCk7CiAJCQl9IGJyZWFrOwotCQljYXNlICdEJzp7Ci0JCQkJdWludDMyX3QgY291bnQgPSB2YV9hcmcoYXAsIHVpbnQzMl90KTsKLQkJCQljb25zdCB2b2lkICpkYXRhID0gdmFfYXJnKGFwLCBjb25zdCB2b2lkICopOwotCi0JCQkJZXJyY29kZSA9IHA5cGR1X3dyaXRlZihwZHUsIHByb3RvX3ZlcnNpb24sICJkIiwKLQkJCQkJCQkJCWNvdW50KTsKLQkJCQlpZiAoIWVycmNvZGUgJiYgcGR1X3dyaXRlKHBkdSwgZGF0YSwgY291bnQpKQotCQkJCQllcnJjb2RlID0gLUVGQVVMVDsKLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlICdVJzp7CisJCWNhc2UgJ1YnOnsKIAkJCQlpbnQzMl90IGNvdW50ID0gdmFfYXJnKGFwLCBpbnQzMl90KTsKLQkJCQljb25zdCBjaGFyIF9fdXNlciAqdWRhdGEgPQotCQkJCQkJdmFfYXJnKGFwLCBjb25zdCB2b2lkIF9fdXNlciAqKTsKKwkJCQlzdHJ1Y3QgaW92X2l0ZXIgKmZyb20gPQorCQkJCQkJdmFfYXJnKGFwLCBzdHJ1Y3QgaW92X2l0ZXIgKik7CiAJCQkJZXJyY29kZSA9IHA5cGR1X3dyaXRlZihwZHUsIHByb3RvX3ZlcnNpb24sICJkIiwKIAkJCQkJCQkJCWNvdW50KTsKLQkJCQlpZiAoIWVycmNvZGUgJiYgcGR1X3dyaXRlX3UocGR1LCB1ZGF0YSwgY291bnQpKQorCQkJCWlmICghZXJyY29kZSAmJiBwZHVfd3JpdGVfdShwZHUsIGZyb20sIGNvdW50KSkKIAkJCQkJZXJyY29kZSA9IC1FRkFVTFQ7CiAJCQl9CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC85cC90cmFuc19jb21tb24uYyBiL25ldC85cC90cmFuc19jb21tb24uYwppbmRleCAyZWUzODc5Li4zOGFhNjM0IDEwMDY0NAotLS0gYS9uZXQvOXAvdHJhbnNfY29tbW9uLmMKKysrIGIvbmV0LzlwL3RyYW5zX2NvbW1vbi5jCkBAIC0xMiwxMiArMTIsOCBAQAogICoKICAqLwogCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bmV0LzlwLzlwLmg+Ci0jaW5jbHVkZSA8bmV0LzlwL2NsaWVudC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+Ci0jaW5jbHVkZSAidHJhbnNfY29tbW9uLmgiCiAKIC8qKgogICogIHA5X3JlbGVhc2VfcmVxX3BhZ2VzIC0gUmVsZWFzZSBwYWdlcyBhZnRlciB0aGUgdHJhbnNhY3Rpb24uCkBAIC0zMSwzOSArMjcsMyBAQAogCQkJcHV0X3BhZ2UocGFnZXNbaV0pOwogfQogRVhQT1JUX1NZTUJPTChwOV9yZWxlYXNlX3BhZ2VzKTsKLQotLyoqCi0gKiBwOV9ucl9wYWdlcyAtIFJldHVybiBudW1iZXIgb2YgcGFnZXMgbmVlZGVkIHRvIGFjY29tbW9kYXRlIHRoZSBwYXlsb2FkLgotICovCi1pbnQgcDlfbnJfcGFnZXMoY2hhciAqZGF0YSwgaW50IGxlbikKLXsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BhZ2UsIGVuZF9wYWdlOwotCXN0YXJ0X3BhZ2UgPSAgKHVuc2lnbmVkIGxvbmcpZGF0YSA+PiBQQUdFX1NISUZUOwotCWVuZF9wYWdlID0gKCh1bnNpZ25lZCBsb25nKWRhdGEgKyBsZW4gKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCXJldHVybiBlbmRfcGFnZSAtIHN0YXJ0X3BhZ2U7Ci19Ci1FWFBPUlRfU1lNQk9MKHA5X25yX3BhZ2VzKTsKLQotLyoqCi0gKiBwYXlsb2FkX2d1cCAtIFRyYW5zbGF0ZXMgdXNlciBidWZmZXIgaW50byBrZXJuZWwgcGFnZXMgYW5kCi0gKiBwaW5zIHRoZW0gZWl0aGVyIGZvciByZWFkL3dyaXRlIHRocm91Z2ggZ2V0X3VzZXJfcGFnZXNfZmFzdCgpLgotICogQHJlcTogUmVxdWVzdCB0byBiZSBzZW50IHRvIHNlcnZlci4KLSAqIEBwZGF0YV9vZmY6IGRhdGEgb2Zmc2V0IGludG8gdGhlIGZpcnN0IHBhZ2UgYWZ0ZXIgdHJhbnNsYXRpb24gKGd1cCkuCi0gKiBAcGRhdGFfbGVuOiBUb3RhbCBsZW5ndGggb2YgdGhlIElPLiBndXAgbWF5IG5vdCByZXR1cm4gcmVxdWVzdGVkICMgb2YgcGFnZXMuCi0gKiBAbnJfcGFnZXM6IG51bWJlciBvZiBwYWdlcyB0byBhY2NvbW1vZGF0ZSB0aGUgcGF5bG9hZAotICogQHJ3OiBJbmRpY2F0ZXMgaWYgdGhlIHBhZ2VzIGFyZSBmb3IgcmVhZCBvciB3cml0ZS4KLSAqLwotCi1pbnQgcDlfcGF5bG9hZF9ndXAoY2hhciAqZGF0YSwgaW50ICpucl9wYWdlcywgc3RydWN0IHBhZ2UgKipwYWdlcywgaW50IHdyaXRlKQotewotCWludCBucl9tYXBwZWRfcGFnZXM7Ci0KLQlucl9tYXBwZWRfcGFnZXMgPSBnZXRfdXNlcl9wYWdlc19mYXN0KCh1bnNpZ25lZCBsb25nKWRhdGEsCi0JCQkJCSAgICAgICpucl9wYWdlcywgd3JpdGUsIHBhZ2VzKTsKLQlpZiAobnJfbWFwcGVkX3BhZ2VzIDw9IDApCi0JCXJldHVybiBucl9tYXBwZWRfcGFnZXM7Ci0KLQkqbnJfcGFnZXMgPSBucl9tYXBwZWRfcGFnZXM7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKHA5X3BheWxvYWRfZ3VwKTsKZGlmZiAtLWdpdCBhL25ldC85cC90cmFuc19jb21tb24uaCBiL25ldC85cC90cmFuc19jb21tb24uaAppbmRleCAxNzNiYjU1Li5jNDNiYWJiIDEwMDY0NAotLS0gYS9uZXQvOXAvdHJhbnNfY29tbW9uLmgKKysrIGIvbmV0LzlwL3RyYW5zX2NvbW1vbi5oCkBAIC0xMyw1ICsxMywzIEBACiAgKi8KIAogdm9pZCBwOV9yZWxlYXNlX3BhZ2VzKHN0cnVjdCBwYWdlICoqLCBpbnQpOwotaW50IHA5X3BheWxvYWRfZ3VwKGNoYXIgKiwgaW50ICosIHN0cnVjdCBwYWdlICoqLCBpbnQpOwotaW50IHA5X25yX3BhZ2VzKGNoYXIgKiwgaW50KTsKZGlmZiAtLWdpdCBhL25ldC85cC90cmFuc19mZC5jIGIvbmV0LzlwL3RyYW5zX2ZkLmMKaW5kZXggODBkMDhmNi4uM2UzZDgyZCAxMDA2NDQKLS0tIGEvbmV0LzlwL3RyYW5zX2ZkLmMKKysrIGIvbmV0LzlwL3RyYW5zX2ZkLmMKQEAgLTk0MCw3ICs5NDAsNyBAQAogCXNpbl9zZXJ2ZXIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CiAJc2luX3NlcnZlci5zaW5fYWRkci5zX2FkZHIgPSBpbl9hdG9uKGFkZHIpOwogCXNpbl9zZXJ2ZXIuc2luX3BvcnQgPSBodG9ucyhvcHRzLnBvcnQpOwotCWVyciA9IF9fc29ja19jcmVhdGUocmVhZF9wbmV0KCZjdXJyZW50LT5uc3Byb3h5LT5uZXRfbnMpLCBQRl9JTkVULAorCWVyciA9IF9fc29ja19jcmVhdGUoY3VycmVudC0+bnNwcm94eS0+bmV0X25zLCBQRl9JTkVULAogCQkJICAgIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCwgJmNzb2NrZXQsIDEpOwogCWlmIChlcnIpIHsKIAkJcHJfZXJyKCIlcyAoJWQpOiBwcm9ibGVtIGNyZWF0aW5nIHNvY2tldFxuIiwKQEAgLTk4OCw3ICs5ODgsNyBAQAogCiAJc3VuX3NlcnZlci5zdW5fZmFtaWx5ID0gUEZfVU5JWDsKIAlzdHJjcHkoc3VuX3NlcnZlci5zdW5fcGF0aCwgYWRkcik7Ci0JZXJyID0gX19zb2NrX2NyZWF0ZShyZWFkX3BuZXQoJmN1cnJlbnQtPm5zcHJveHktPm5ldF9ucyksIFBGX1VOSVgsCisJZXJyID0gX19zb2NrX2NyZWF0ZShjdXJyZW50LT5uc3Byb3h5LT5uZXRfbnMsIFBGX1VOSVgsCiAJCQkgICAgU09DS19TVFJFQU0sIDAsICZjc29ja2V0LCAxKTsKIAlpZiAoZXJyIDwgMCkgewogCQlwcl9lcnIoIiVzICglZCk6IHByb2JsZW0gY3JlYXRpbmcgc29ja2V0XG4iLApkaWZmIC0tZ2l0IGEvbmV0LzlwL3RyYW5zX3ZpcnRpby5jIGIvbmV0LzlwL3RyYW5zX3ZpcnRpby5jCmluZGV4IGQ4ZTM3NmEuLmU2MmJjYmIgMTAwNjQ0Ci0tLSBhL25ldC85cC90cmFuc192aXJ0aW8uYworKysgYi9uZXQvOXAvdHJhbnNfdmlydGlvLmMKQEAgLTIxNywxNSArMjE3LDE1IEBACiAgKiBAc3RhcnQ6IHdoaWNoIHNlZ21lbnQgb2YgdGhlIHNnX2xpc3QgdG8gc3RhcnQgYXQKICAqIEBwZGF0YTogYSBsaXN0IG9mIHBhZ2VzIHRvIGFkZCBpbnRvIHNnLgogICogQG5yX3BhZ2VzOiBudW1iZXIgb2YgcGFnZXMgdG8gcGFjayBpbnRvIHRoZSBzY2F0dGVyL2dhdGhlciBsaXN0Ci0gKiBAZGF0YTogZGF0YSB0byBwYWNrIGludG8gc2NhdHRlci9nYXRoZXIgbGlzdAorICogQG9mZnM6IGFtb3VudCBvZiBkYXRhIGluIHRoZSBiZWdpbm5pbmcgb2YgZmlyc3QgcGFnZSBfbm90XyB0byBwYWNrCiAgKiBAY291bnQ6IGFtb3VudCBvZiBkYXRhIHRvIHBhY2sgaW50byB0aGUgc2NhdHRlci9nYXRoZXIgbGlzdAogICovCiBzdGF0aWMgaW50CiBwYWNrX3NnX2xpc3RfcChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCBpbnQgc3RhcnQsIGludCBsaW1pdCwKLQkgICAgICAgc3RydWN0IHBhZ2UgKipwZGF0YSwgaW50IG5yX3BhZ2VzLCBjaGFyICpkYXRhLCBpbnQgY291bnQpCisJICAgICAgIHN0cnVjdCBwYWdlICoqcGRhdGEsIGludCBucl9wYWdlcywgc2l6ZV90IG9mZnMsIGludCBjb3VudCkKIHsKIAlpbnQgaSA9IDAsIHM7Ci0JaW50IGRhdGFfb2ZmOworCWludCBkYXRhX29mZiA9IG9mZnM7CiAJaW50IGluZGV4ID0gc3RhcnQ7CiAKIAlCVUdfT04obnJfcGFnZXMgPiAobGltaXQgLSBzdGFydCkpOwpAQCAtMjMzLDE2ICsyMzMsMTQgQEAKIAkgKiBpZiB0aGUgZmlyc3QgcGFnZSBkb2Vzbid0IHN0YXJ0IGF0CiAJICogcGFnZSBib3VuZGFyeSBmaW5kIHRoZSBvZmZzZXQKIAkgKi8KLQlkYXRhX29mZiA9IG9mZnNldF9pbl9wYWdlKGRhdGEpOwogCXdoaWxlIChucl9wYWdlcykgewotCQlzID0gcmVzdF9vZl9wYWdlKGRhdGEpOworCQlzID0gUEFHRV9TSVpFIC0gZGF0YV9vZmY7CiAJCWlmIChzID4gY291bnQpCiAJCQlzID0gY291bnQ7CiAJCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCB0ZXJtaW5hdGUgZWFybHkuICovCiAJCXNnX3VubWFya19lbmQoJnNnW2luZGV4XSk7CiAJCXNnX3NldF9wYWdlKCZzZ1tpbmRleCsrXSwgcGRhdGFbaSsrXSwgcywgZGF0YV9vZmYpOwogCQlkYXRhX29mZiA9IDA7Ci0JCWRhdGEgKz0gczsKIAkJY291bnQgLT0gczsKIAkJbnJfcGFnZXMtLTsKIAl9CkBAIC0zMTQsMTEgKzMxMiwyMCBAQAogfQogCiBzdGF0aWMgaW50IHA5X2dldF9tYXBwZWRfcGFnZXMoc3RydWN0IHZpcnRpb19jaGFuICpjaGFuLAotCQkJICAgICAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIGNoYXIgKmRhdGEsCi0JCQkgICAgICAgaW50IG5yX3BhZ2VzLCBpbnQgd3JpdGUsIGludCBrZXJuX2J1ZikKKwkJCSAgICAgICBzdHJ1Y3QgcGFnZSAqKipwYWdlcywKKwkJCSAgICAgICBzdHJ1Y3QgaW92X2l0ZXIgKmRhdGEsCisJCQkgICAgICAgaW50IGNvdW50LAorCQkJICAgICAgIHNpemVfdCAqb2ZmcywKKwkJCSAgICAgICBpbnQgKm5lZWRfZHJvcCkKIHsKKwlpbnQgbnJfcGFnZXM7CiAJaW50IGVycjsKLQlpZiAoIWtlcm5fYnVmKSB7CisKKwlpZiAoIWlvdl9pdGVyX2NvdW50KGRhdGEpKQorCQlyZXR1cm4gMDsKKworCWlmICghKGRhdGEtPnR5cGUgJiBJVEVSX0tWRUMpKSB7CisJCWludCBuOwogCQkvKgogCQkgKiBXZSBhbGxvdyBvbmx5IHA5X21heF9wYWdlcyBwaW5uZWQuIFdlIHdhaXQgZm9yIHRoZQogCQkgKiBPdGhlciB6YyByZXF1ZXN0IHRvIGZpbmlzaCBoZXJlCkBAIC0zMjksMjYgKzMzNiw0OSBAQAogCQkJaWYgKGVyciA9PSAtRVJFU1RBUlRTWVMpCiAJCQkJcmV0dXJuIGVycjsKIAkJfQotCQllcnIgPSBwOV9wYXlsb2FkX2d1cChkYXRhLCAmbnJfcGFnZXMsIHBhZ2VzLCB3cml0ZSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKKwkJbiA9IGlvdl9pdGVyX2dldF9wYWdlc19hbGxvYyhkYXRhLCBwYWdlcywgY291bnQsIG9mZnMpOworCQlpZiAobiA8IDApCisJCQlyZXR1cm4gbjsKKwkJKm5lZWRfZHJvcCA9IDE7CisJCW5yX3BhZ2VzID0gRElWX1JPVU5EX1VQKG4gKyAqb2ZmcywgUEFHRV9TSVpFKTsKIAkJYXRvbWljX2FkZChucl9wYWdlcywgJnZwX3Bpbm5lZCk7CisJCXJldHVybiBuOwogCX0gZWxzZSB7CiAJCS8qIGtlcm5lbCBidWZmZXIsIG5vIG5lZWQgdG8gcGluIHBhZ2VzICovCi0JCWludCBzLCBpbmRleCA9IDA7Ci0JCWludCBjb3VudCA9IG5yX3BhZ2VzOwotCQl3aGlsZSAobnJfcGFnZXMpIHsKLQkJCXMgPSByZXN0X29mX3BhZ2UoZGF0YSk7Ci0JCQlpZiAoaXNfdm1hbGxvY19hZGRyKGRhdGEpKQotCQkJCXBhZ2VzW2luZGV4KytdID0gdm1hbGxvY190b19wYWdlKGRhdGEpOwotCQkJZWxzZQotCQkJCXBhZ2VzW2luZGV4KytdID0ga21hcF90b19wYWdlKGRhdGEpOwotCQkJZGF0YSArPSBzOwotCQkJbnJfcGFnZXMtLTsKKwkJaW50IGluZGV4OworCQlzaXplX3QgbGVuOworCQl2b2lkICpwOworCisJCS8qIHdlJ2QgYWxyZWFkeSBjaGVja2VkIHRoYXQgaXQncyBub24tZW1wdHkgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCWxlbiA9IGlvdl9pdGVyX3NpbmdsZV9zZWdfY291bnQoZGF0YSk7CisJCQlpZiAobGlrZWx5KGxlbikpIHsKKwkJCQlwID0gZGF0YS0+a3ZlYy0+aW92X2Jhc2UgKyBkYXRhLT5pb3Zfb2Zmc2V0OworCQkJCWJyZWFrOworCQkJfQorCQkJaW92X2l0ZXJfYWR2YW5jZShkYXRhLCAwKTsKIAkJfQotCQlucl9wYWdlcyA9IGNvdW50OworCQlpZiAobGVuID4gY291bnQpCisJCQlsZW4gPSBjb3VudDsKKworCQlucl9wYWdlcyA9IERJVl9ST1VORF9VUCgodW5zaWduZWQgbG9uZylwICsgbGVuLCBQQUdFX1NJWkUpIC0KKwkJCSAgICh1bnNpZ25lZCBsb25nKXAgLyBQQUdFX1NJWkU7CisKKwkJKnBhZ2VzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBucl9wYWdlcywgR0ZQX05PRlMpOworCQlpZiAoISpwYWdlcykKKwkJCXJldHVybiAtRU5PTUVNOworCisJCSpuZWVkX2Ryb3AgPSAwOworCQlwIC09ICgqb2ZmcyA9ICh1bnNpZ25lZCBsb25nKXAgJSBQQUdFX1NJWkUpOworCQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBucl9wYWdlczsgaW5kZXgrKykgeworCQkJaWYgKGlzX3ZtYWxsb2NfYWRkcihwKSkKKwkJCQkoKnBhZ2VzKVtpbmRleF0gPSB2bWFsbG9jX3RvX3BhZ2UocCk7CisJCQllbHNlCisJCQkJKCpwYWdlcylbaW5kZXhdID0ga21hcF90b19wYWdlKHApOworCQkJcCArPSBQQUdFX1NJWkU7CisJCX0KKwkJcmV0dXJuIGxlbjsKIAl9Ci0JcmV0dXJuIG5yX3BhZ2VzOwogfQogCiAvKioKQEAgLTM2NCw4ICszOTQsOCBAQAogICovCiBzdGF0aWMgaW50CiBwOV92aXJ0aW9femNfcmVxdWVzdChzdHJ1Y3QgcDlfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBwOV9yZXFfdCAqcmVxLAotCQkgICAgIGNoYXIgKnVpZGF0YSwgY2hhciAqdW9kYXRhLCBpbnQgaW5sZW4sCi0JCSAgICAgaW50IG91dGxlbiwgaW50IGluX2hkcl9sZW4sIGludCBrZXJuX2J1ZikKKwkJICAgICBzdHJ1Y3QgaW92X2l0ZXIgKnVpZGF0YSwgc3RydWN0IGlvdl9pdGVyICp1b2RhdGEsCisJCSAgICAgaW50IGlubGVuLCBpbnQgb3V0bGVuLCBpbnQgaW5faGRyX2xlbikKIHsKIAlpbnQgaW4sIG91dCwgZXJyLCBvdXRfc2dzLCBpbl9zZ3M7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTM3Myw0MSArNDAzLDMyIEBACiAJc3RydWN0IHBhZ2UgKippbl9wYWdlcyA9IE5VTEwsICoqb3V0X3BhZ2VzID0gTlVMTDsKIAlzdHJ1Y3QgdmlydGlvX2NoYW4gKmNoYW4gPSBjbGllbnQtPnRyYW5zOwogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dzWzRdOworCXNpemVfdCBvZmZzOworCWludCBuZWVkX2Ryb3AgPSAwOwogCiAJcDlfZGVidWcoUDlfREVCVUdfVFJBTlMsICJ2aXJ0aW8gcmVxdWVzdFxuIik7CiAKIAlpZiAodW9kYXRhKSB7Ci0JCW91dF9ucl9wYWdlcyA9IHA5X25yX3BhZ2VzKHVvZGF0YSwgb3V0bGVuKTsKLQkJb3V0X3BhZ2VzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBhZ2UgKikgKiBvdXRfbnJfcGFnZXMsCi0JCQkJICAgIEdGUF9OT0ZTKTsKLQkJaWYgKCFvdXRfcGFnZXMpIHsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycl9vdXQ7CisJCWludCBuID0gcDlfZ2V0X21hcHBlZF9wYWdlcyhjaGFuLCAmb3V0X3BhZ2VzLCB1b2RhdGEsCisJCQkJCSAgICBvdXRsZW4sICZvZmZzLCAmbmVlZF9kcm9wKTsKKwkJaWYgKG4gPCAwKQorCQkJcmV0dXJuIG47CisJCW91dF9ucl9wYWdlcyA9IERJVl9ST1VORF9VUChuICsgb2ZmcywgUEFHRV9TSVpFKTsKKwkJaWYgKG4gIT0gb3V0bGVuKSB7CisJCQlfX2xlMzIgdiA9IGNwdV90b19sZTMyKG4pOworCQkJbWVtY3B5KCZyZXEtPnRjLT5zZGF0YVtyZXEtPnRjLT5zaXplIC0gNF0sICZ2LCA0KTsKKwkJCW91dGxlbiA9IG47CiAJCX0KLQkJb3V0X25yX3BhZ2VzID0gcDlfZ2V0X21hcHBlZF9wYWdlcyhjaGFuLCBvdXRfcGFnZXMsIHVvZGF0YSwKLQkJCQkJCSAgIG91dF9ucl9wYWdlcywgMCwga2Vybl9idWYpOwotCQlpZiAob3V0X25yX3BhZ2VzIDwgMCkgewotCQkJZXJyID0gb3V0X25yX3BhZ2VzOwotCQkJa2ZyZWUob3V0X3BhZ2VzKTsKLQkJCW91dF9wYWdlcyA9IE5VTEw7Ci0JCQlnb3RvIGVycl9vdXQ7Ci0JCX0KLQl9Ci0JaWYgKHVpZGF0YSkgewotCQlpbl9ucl9wYWdlcyA9IHA5X25yX3BhZ2VzKHVpZGF0YSwgaW5sZW4pOwotCQlpbl9wYWdlcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwYWdlICopICogaW5fbnJfcGFnZXMsCi0JCQkJICAgR0ZQX05PRlMpOwotCQlpZiAoIWluX3BhZ2VzKSB7Ci0JCQllcnIgPSAtRU5PTUVNOwotCQkJZ290byBlcnJfb3V0OwotCQl9Ci0JCWluX25yX3BhZ2VzID0gcDlfZ2V0X21hcHBlZF9wYWdlcyhjaGFuLCBpbl9wYWdlcywgdWlkYXRhLAotCQkJCQkJICBpbl9ucl9wYWdlcywgMSwga2Vybl9idWYpOwotCQlpZiAoaW5fbnJfcGFnZXMgPCAwKSB7Ci0JCQllcnIgPSBpbl9ucl9wYWdlczsKLQkJCWtmcmVlKGluX3BhZ2VzKTsKLQkJCWluX3BhZ2VzID0gTlVMTDsKLQkJCWdvdG8gZXJyX291dDsKKwl9IGVsc2UgaWYgKHVpZGF0YSkgeworCQlpbnQgbiA9IHA5X2dldF9tYXBwZWRfcGFnZXMoY2hhbiwgJmluX3BhZ2VzLCB1aWRhdGEsCisJCQkJCSAgICBpbmxlbiwgJm9mZnMsICZuZWVkX2Ryb3ApOworCQlpZiAobiA8IDApCisJCQlyZXR1cm4gbjsKKwkJaW5fbnJfcGFnZXMgPSBESVZfUk9VTkRfVVAobiArIG9mZnMsIFBBR0VfU0laRSk7CisJCWlmIChuICE9IGlubGVuKSB7CisJCQlfX2xlMzIgdiA9IGNwdV90b19sZTMyKG4pOworCQkJbWVtY3B5KCZyZXEtPnRjLT5zZGF0YVtyZXEtPnRjLT5zaXplIC0gNF0sICZ2LCA0KTsKKwkJCWlubGVuID0gbjsKIAkJfQogCX0KIAlyZXEtPnN0YXR1cyA9IFJFUV9TVEFUVVNfU0VOVDsKQEAgLTQyNiw3ICs0NDcsNyBAQAogCWlmIChvdXRfcGFnZXMpIHsKIAkJc2dzW291dF9zZ3MrK10gPSBjaGFuLT5zZyArIG91dDsKIAkJb3V0ICs9IHBhY2tfc2dfbGlzdF9wKGNoYW4tPnNnLCBvdXQsIFZJUlRRVUVVRV9OVU0sCi0JCQkJICAgICAgb3V0X3BhZ2VzLCBvdXRfbnJfcGFnZXMsIHVvZGF0YSwgb3V0bGVuKTsKKwkJCQkgICAgICBvdXRfcGFnZXMsIG91dF9ucl9wYWdlcywgb2Zmcywgb3V0bGVuKTsKIAl9CiAJCQogCS8qCkBAIC00NDQsNyArNDY1LDcgQEAKIAlpZiAoaW5fcGFnZXMpIHsKIAkJc2dzW291dF9zZ3MgKyBpbl9zZ3MrK10gPSBjaGFuLT5zZyArIG91dCArIGluOwogCQlpbiArPSBwYWNrX3NnX2xpc3RfcChjaGFuLT5zZywgb3V0ICsgaW4sIFZJUlRRVUVVRV9OVU0sCi0JCQkJICAgICBpbl9wYWdlcywgaW5fbnJfcGFnZXMsIHVpZGF0YSwgaW5sZW4pOworCQkJCSAgICAgaW5fcGFnZXMsIGluX25yX3BhZ2VzLCBvZmZzLCBpbmxlbik7CiAJfQogCiAJQlVHX09OKG91dF9zZ3MgKyBpbl9zZ3MgPiBBUlJBWV9TSVpFKHNncykpOwpAQCAtNDc4LDcgKzQ5OSw3IEBACiAJICogTm9uIGtlcm5lbCBidWZmZXJzIGFyZSBwaW5uZWQsIHVucGluIHRoZW0KIAkgKi8KIGVycl9vdXQ6Ci0JaWYgKCFrZXJuX2J1ZikgeworCWlmIChuZWVkX2Ryb3ApIHsKIAkJaWYgKGluX3BhZ2VzKSB7CiAJCQlwOV9yZWxlYXNlX3BhZ2VzKGluX3BhZ2VzLCBpbl9ucl9wYWdlcyk7CiAJCQlhdG9taWNfc3ViKGluX25yX3BhZ2VzLCAmdnBfcGlubmVkKTsKQEAgLTY1OCwxNCArNjc5LDMwIEBACiBzdGF0aWMgdm9pZCBwOV92aXJ0aW9fcmVtb3ZlKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQogewogCXN0cnVjdCB2aXJ0aW9fY2hhbiAqY2hhbiA9IHZkZXYtPnByaXY7Ci0KLQlpZiAoY2hhbi0+aW51c2UpCi0JCXA5X3ZpcnRpb19jbG9zZShjaGFuLT5jbGllbnQpOwotCXZkZXYtPmNvbmZpZy0+ZGVsX3Zxcyh2ZGV2KTsKKwl1bnNpZ25lZCBsb25nIHdhcm5pbmdfdGltZTsKIAogCW11dGV4X2xvY2soJnZpcnRpb185cF9sb2NrKTsKKworCS8qIFJlbW92ZSBzZWxmIGZyb20gbGlzdCBzbyB3ZSBkb24ndCBnZXQgbmV3IHVzZXJzLiAqLwogCWxpc3RfZGVsKCZjaGFuLT5jaGFuX2xpc3QpOworCXdhcm5pbmdfdGltZSA9IGppZmZpZXM7CisKKwkvKiBXYWl0IGZvciBleGlzdGluZyB1c2VycyB0byBjbG9zZS4gKi8KKwl3aGlsZSAoY2hhbi0+aW51c2UpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ2aXJ0aW9fOXBfbG9jayk7CisJCW1zbGVlcCgyNTApOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB3YXJuaW5nX3RpbWUgKyAxMCAqIEhaKSkgeworCQkJZGV2X2VtZXJnKCZ2ZGV2LT5kZXYsCisJCQkJICAicDlfdmlydGlvX3JlbW92ZTogd2FpdGluZyBmb3IgZGV2aWNlIGluIHVzZS5cbiIpOworCQkJd2FybmluZ190aW1lID0gamlmZmllczsKKwkJfQorCQltdXRleF9sb2NrKCZ2aXJ0aW9fOXBfbG9jayk7CisJfQorCiAJbXV0ZXhfdW5sb2NrKCZ2aXJ0aW9fOXBfbG9jayk7CisKKwl2ZGV2LT5jb25maWctPmRlbF92cXModmRldik7CisKIAlzeXNmc19yZW1vdmVfZmlsZSgmKHZkZXYtPmRldi5rb2JqKSwgJmRldl9hdHRyX21vdW50X3RhZy5hdHRyKTsKIAlrb2JqZWN0X3VldmVudCgmKHZkZXYtPmRldi5rb2JqKSwgS09CSl9DSEFOR0UpOwogCWtmcmVlKGNoYW4tPnRhZyk7CmRpZmYgLS1naXQgYS9uZXQvTWFrZWZpbGUgYi9uZXQvTWFrZWZpbGUKaW5kZXggMzg3MDRiZC4uMzk5NTYxMyAxMDA2NDQKLS0tIGEvbmV0L01ha2VmaWxlCisrKyBiL25ldC9NYWtlZmlsZQpAQCAtNjksNyArNjksNyBAQAogb2JqLSQoQ09ORklHX05GQykJCSs9IG5mYy8KIG9iai0kKENPTkZJR19PUEVOVlNXSVRDSCkJKz0gb3BlbnZzd2l0Y2gvCiBvYmotJChDT05GSUdfVlNPQ0tFVFMpCSs9IHZtd192c29jay8KLW9iai0kKENPTkZJR19ORVRfTVBMU19HU08pCSs9IG1wbHMvCitvYmotJChDT05GSUdfTVBMUykJCSs9IG1wbHMvCiBvYmotJChDT05GSUdfSFNSKQkJKz0gaHNyLwogaWZuZXEgKCQoQ09ORklHX05FVF9TV0lUQ0hERVYpLCkKIG9iai15CQkJCSs9IHN3aXRjaGRldi8KZGlmZiAtLWdpdCBhL25ldC9hcHBsZXRhbGsvYWFycC5jIGIvbmV0L2FwcGxldGFsay9hYXJwLmMKaW5kZXggZDFjNTVkOC4uOGFkM2VjMiAxMDA2NDQKLS0tIGEvbmV0L2FwcGxldGFsay9hYXJwLmMKKysrIGIvbmV0L2FwcGxldGFsay9hYXJwLmMKQEAgLTE0MSw3ICsxNDEsNyBAQAogCWVhaC0+cGFfc3JjX25ldAkgPSBzYXQtPnNfbmV0OwogCWVhaC0+cGFfc3JjX25vZGUgPSBzYXQtPnNfbm9kZTsKIAotCW1lbXNldChlYWgtPmh3X2RzdCwgJ1wwJywgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIoZWFoLT5od19kc3QpOwogCiAJZWFoLT5wYV9kc3RfemVybyA9IDA7CiAJZWFoLT5wYV9kc3RfbmV0CSA9IGEtPnRhcmdldF9hZGRyLnNfbmV0OwpAQCAtMTg5LDcgKzE4OSw3IEBACiAJZWFoLT5wYV9zcmNfbm9kZSA9IHVzLT5zX25vZGU7CiAKIAlpZiAoIXNoYSkKLQkJbWVtc2V0KGVhaC0+aHdfZHN0LCAnXDAnLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIoZWFoLT5od19kc3QpOwogCWVsc2UKIAkJZXRoZXJfYWRkcl9jb3B5KGVhaC0+aHdfZHN0LCBzaGEpOwogCkBAIC0yMzksNyArMjM5LDcgQEAKIAllYWgtPnBhX3NyY19uZXQJID0gdXMtPnNfbmV0OwogCWVhaC0+cGFfc3JjX25vZGUgPSB1cy0+c19ub2RlOwogCi0JbWVtc2V0KGVhaC0+aHdfZHN0LCAnXDAnLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihlYWgtPmh3X2RzdCk7CiAKIAllYWgtPnBhX2RzdF96ZXJvID0gMDsKIAllYWgtPnBhX2RzdF9uZXQJID0gdXMtPnNfbmV0OwpkaWZmIC0tZ2l0IGEvbmV0L2FwcGxldGFsay9kZHAuYyBiL25ldC9hcHBsZXRhbGsvZGRwLmMKaW5kZXggMGQwNzY2ZS4uM2I3YWQ0MyAxMDA2NDQKLS0tIGEvbmV0L2FwcGxldGFsay9kZHAuYworKysgYi9uZXQvYXBwbGV0YWxrL2RkcC5jCkBAIC0xNTU5LDggKzE1NTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0YWxrX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCi0JCQkgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgYXRhbGtfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGF0YWxrX3NvY2sgKmF0ID0gYXRfc2soc2spOwpAQCAtMTcyOCw4ICsxNzI3LDggQEAKIAlyZXR1cm4gZXJyID8gOiBsZW47CiB9CiAKLXN0YXRpYyBpbnQgYXRhbGtfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJCSBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorc3RhdGljIGludCBhdGFsa19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsCisJCQkgaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBkZHBlaGRyICpkZHA7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2NvbW1vbi5jIGIvbmV0L2F0bS9jb21tb24uYwppbmRleCBiODQwNTdlLi5lZDA0NjY2IDEwMDY0NAotLS0gYS9uZXQvYXRtL2NvbW1vbi5jCisrKyBiL25ldC9hdG0vY29tbW9uLmMKQEAgLTUyMyw4ICs1MjMsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgdmNjX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCi0JCXNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitpbnQgdmNjX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwKKwkJaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBhdG1fdmNjICp2Y2M7CkBAIC01NjksOCArNTY5LDcgQEAKIAlyZXR1cm4gY29waWVkOwogfQogCi1pbnQgdmNjX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLAotCQlzaXplX3Qgc2l6ZSkKK2ludCB2Y2Nfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlERUZJTkVfV0FJVCh3YWl0KTsKZGlmZiAtLWdpdCBhL25ldC9hdG0vY29tbW9uLmggYi9uZXQvYXRtL2NvbW1vbi5oCmluZGV4IGNjM2MyZGEuLjRkNmY1YjIgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vY29tbW9uLmgKKysrIGIvbmV0L2F0bS9jb21tb24uaApAQCAtMTMsMTAgKzEzLDkgQEAKIGludCB2Y2NfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNvY2tldCAqc29jaywgaW50IHByb3RvY29sLCBpbnQgZmFtaWx5KTsKIGludCB2Y2NfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKIGludCB2Y2NfY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgaXRmLCBzaG9ydCB2cGksIGludCB2Y2kpOwotaW50IHZjY19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQlzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKTsKLWludCB2Y2Nfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sCi0JCXNpemVfdCB0b3RhbF9sZW4pOworaW50IHZjY19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsCisJCWludCBmbGFncyk7CitpbnQgdmNjX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbik7CiB1bnNpZ25lZCBpbnQgdmNjX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHBvbGxfdGFibGUgKndhaXQpOwogaW50IHZjY19pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CiBpbnQgdmNjX2NvbXBhdF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2xlYy5jIGIvbmV0L2F0bS9sZWMuYwppbmRleCA0Yjk4Zjg5Li5jZDNiMzc5IDEwMDY0NAotLS0gYS9uZXQvYXRtL2xlYy5jCisrKyBiL25ldC9hdG0vbGVjLmMKQEAgLTIwMDEsNyArMjAwMSw3IEBACiAJCWlmIChlbnRyeSA9PSBOVUxMKQogCQkJZ290byBvdXQ7CiAJCW1lbWNweShlbnRyeS0+YXRtX2FkZHIsIGlvY19kYXRhLT5hdG1fYWRkciwgQVRNX0VTQV9MRU4pOwotCQltZW1zZXQoZW50cnktPm1hY19hZGRyLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIoZW50cnktPm1hY19hZGRyKTsKIAkJZW50cnktPnJlY3ZfdmNjID0gdmNjOwogCQllbnRyeS0+b2xkX3JlY3ZfcHVzaCA9IG9sZF9wdXNoOwogCQllbnRyeS0+c3RhdHVzID0gRVNJX1VOS05PV047CkBAIC0yMDg2LDcgKzIwODYsNyBAQAogCWVudHJ5LT52Y2MgPSB2Y2M7CiAJZW50cnktPm9sZF9wdXNoID0gb2xkX3B1c2g7CiAJbWVtY3B5KGVudHJ5LT5hdG1fYWRkciwgaW9jX2RhdGEtPmF0bV9hZGRyLCBBVE1fRVNBX0xFTik7Ci0JbWVtc2V0KGVudHJ5LT5tYWNfYWRkciwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIoZW50cnktPm1hY19hZGRyKTsKIAllbnRyeS0+c3RhdHVzID0gRVNJX1VOS05PV047CiAJaGxpc3RfYWRkX2hlYWQoJmVudHJ5LT5uZXh0LCAmcHJpdi0+bGVjX2FycF9lbXB0eV9vbmVzKTsKIAllbnRyeS0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBwcml2LT52Y2NfdGltZW91dF9wZXJpb2Q7CmRpZmYgLS1naXQgYS9uZXQvYXRtL21wb2FfcHJvYy5jIGIvbmV0L2F0bS9tcG9hX3Byb2MuYwppbmRleCA1YmRkMzAwLi4yZGYzNGViIDEwMDY0NAotLS0gYS9uZXQvYXRtL21wb2FfcHJvYy5jCisrKyBiL25ldC9hdG0vbXBvYV9wcm9jLmMKQEAgLTI3Miw3ICsyNzIsNyBAQAogCXFvcy5yeHRwLm1heF9wY3IgPSByeF9wY3I7CiAJcW9zLnJ4dHAubWF4X3NkdSA9IHJ4X3NkdTsKIAlxb3MuYWFsID0gQVRNX0FBTDU7Ci0JZHByaW50aygicGFyc2VfcW9zKCk6IHNldHRpbmcgcW9zIHBhcmFtYW1ldGVycyB0byB0eD0lZCwlZCByeD0lZCwlZFxuIiwKKwlkcHJpbnRrKCJwYXJzZV9xb3MoKTogc2V0dGluZyBxb3MgcGFyYW1ldGVycyB0byB0eD0lZCwlZCByeD0lZCwlZFxuIiwKIAkJcW9zLnR4dHAubWF4X3BjciwgcW9zLnR4dHAubWF4X3NkdSwKIAkJcW9zLnJ4dHAubWF4X3BjciwgcW9zLnJ4dHAubWF4X3NkdSk7CiAKZGlmZiAtLWdpdCBhL25ldC9hdG0vc2lnbmFsaW5nLmMgYi9uZXQvYXRtL3NpZ25hbGluZy5jCmluZGV4IDUyM2JjZTcuLjRmZDZhZjQgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vc2lnbmFsaW5nLmMKKysrIGIvbmV0L2F0bS9zaWduYWxpbmcuYwpAQCAtMTksMzYgKzE5LDE1IEBACiAjaW5jbHVkZSAicmVzb3VyY2VzLmgiCiAjaW5jbHVkZSAic2lnbmFsaW5nLmgiCiAKLSN1bmRlZiBXQUlUX0ZPUl9ERU1PTgkJLyogI2RlZmluZSB0aGlzIGlmIHN5c3RlbSBjYWxscyBvbiBTVkMgc29ja2V0cwotCQkJCSAgIHNob3VsZCBibG9jayB1bnRpbCB0aGUgZGVtb24gcnVucy4KLQkJCQkgICBEYW5nZXI6IG1heSBjYXVzZSBuYXN0eSBoYW5ncyBpZiB0aGUgZGVtb24KLQkJCQkgICBjcmFzaGVzLiAqLwotCiBzdHJ1Y3QgYXRtX3ZjYyAqc2lnZCA9IE5VTEw7Ci0jaWZkZWYgV0FJVF9GT1JfREVNT04KLXN0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChzaWdkX3NsZWVwKTsKLSNlbmRpZgogCiBzdGF0aWMgdm9pZCBzaWdkX3B1dF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLSNpZmRlZiBXQUlUX0ZPUl9ERU1PTgotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwotCi0JYWRkX3dhaXRfcXVldWUoJnNpZ2Rfc2xlZXAsICZ3YWl0KTsKLQl3aGlsZSAoIXNpZ2QpIHsKLQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlwcl9kZWJ1ZygiYXRtc3ZjOiB3YWl0aW5nIGZvciBzaWduYWxpbmcgZGFlbW9uLi4uXG4iKTsKLQkJc2NoZWR1bGUoKTsKLQl9Ci0JY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJnNpZ2Rfc2xlZXAsICZ3YWl0KTsKLSNlbHNlCiAJaWYgKCFzaWdkKSB7CiAJCXByX2RlYnVnKCJhdG1zdmM6IG5vIHNpZ25hbGluZyBkYWVtb25cbiIpOwogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuOwogCX0KLSNlbmRpZgogCWF0bV9mb3JjZV9jaGFyZ2Uoc2lnZCwgc2tiLT50cnVlc2l6ZSk7CiAJc2tiX3F1ZXVlX3RhaWwoJnNrX2F0bShzaWdkKS0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKIAlza19hdG0oc2lnZCktPnNrX2RhdGFfcmVhZHkoc2tfYXRtKHNpZ2QpKTsKQEAgLTI2MSw4ICsyNDAsNSBAQAogCXZjY19pbnNlcnRfc29ja2V0KHNrX2F0bSh2Y2MpKTsKIAlzZXRfYml0KEFUTV9WRl9NRVRBLCAmdmNjLT5mbGFncyk7CiAJc2V0X2JpdChBVE1fVkZfUkVBRFksICZ2Y2MtPmZsYWdzKTsKLSNpZmRlZiBXQUlUX0ZPUl9ERU1PTgotCXdha2VfdXAoJnNpZ2Rfc2xlZXApOwotI2VuZGlmCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvYXgyNS9hZl9heDI1LmMgYi9uZXQvYXgyNS9hZl9heDI1LmMKaW5kZXggY2EwNDlhNy4uMzMwYzFmNCAxMDA2NDQKLS0tIGEvbmV0L2F4MjUvYWZfYXgyNS5jCisrKyBiL25ldC9heDI1L2FmX2F4MjUuYwpAQCAtMTQzMiw4ICsxNDMyLDcgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGF4MjVfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGF4MjVfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CiAJREVDTEFSRV9TT0NLQUREUihzdHJ1Y3Qgc29ja2FkZHJfYXgyNSAqLCB1c2F4LCBtc2ctPm1zZ19uYW1lKTsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKQEAgLTE1OTksOCArMTU5OCw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBheDI1X3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3N0YXRpYyBpbnQgYXgyNV9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsCisJCQlpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKZGlmZiAtLWdpdCBhL25ldC9heDI1L2F4MjVfaXAuYyBiL25ldC9heDI1L2F4MjVfaXAuYwppbmRleCA2N2RlNmIzLi43YzY0NmJiIDEwMDY0NAotLS0gYS9uZXQvYXgyNS9heDI1X2lwLmMKKysrIGIvbmV0L2F4MjUvYXgyNV9pcC5jCkBAIC00Niw5ICs0Niw5IEBACiAKICNpZmRlZiBDT05GSUdfSU5FVAogCi1pbnQgYXgyNV9oYXJkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkgICAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIGNvbnN0IHZvaWQgKmRhZGRyLAotCQkgICAgIGNvbnN0IHZvaWQgKnNhZGRyLCB1bnNpZ25lZCBpbnQgbGVuKQorc3RhdGljIGludCBheDI1X2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgY29uc3Qgdm9pZCAqZGFkZHIsCisJCQkgICAgY29uc3Qgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGludCBsZW4pCiB7CiAJdW5zaWduZWQgY2hhciAqYnVmZjsKIApAQCAtMTAwLDcgKzEwMCw3IEBACiAJcmV0dXJuIC1BWDI1X0hFQURFUl9MRU47CS8qIFVuZmluaXNoZWQgaGVhZGVyICovCiB9CiAKLWludCBheDI1X3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCituZXRkZXZfdHhfdCBheDI1X2lwX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqb3Vyc2tiOwogCXVuc2lnbmVkIGNoYXIgKmJwICA9IHNrYi0+ZGF0YTsKQEAgLTExNSw5ICsxMTUsNiBAQAogCWRzdCA9IChheDI1X2FkZHJlc3MgKikoYnAgKyAxKTsKIAlzcmMgPSAoYXgyNV9hZGRyZXNzICopKGJwICsgOCk7CiAKLQlpZiAoYXJwX2ZpbmQoYnAgKyAxLCBza2IpKQotCQlyZXR1cm4gMTsKLQogCXJvdXRlID0gYXgyNV9nZXRfcm91dGUoZHN0LCBOVUxMKTsKIAlpZiAocm91dGUpIHsKIAkJZGlnaXBlYXQgPSByb3V0ZS0+ZGlnaXBlYXQ7CkBAIC0xMjksNiArMTI2LDcgQEAKIAkJZGV2ID0gc2tiLT5kZXY7CiAKIAlpZiAoKGF4MjVfZGV2ID0gYXgyNV9kZXZfYXgyNWRldihkZXYpKSA9PSBOVUxMKSB7CisJCWtmcmVlX3NrYihza2IpOwogCQlnb3RvIHB1dDsKIAl9CiAKQEAgLTIxMiwzMSArMjEwLDI5IEBACiAJaWYgKHJvdXRlKQogCQlheDI1X3B1dF9yb3V0ZShyb3V0ZSk7CiAKLQlyZXR1cm4gMTsKKwlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCiAjZWxzZQkvKiBJTkVUICovCiAKLWludCBheDI1X2hhcmRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwgY29uc3Qgdm9pZCAqZGFkZHIsCi0JCSAgICAgY29uc3Qgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGludCBsZW4pCitzdGF0aWMgaW50IGF4MjVfaGFyZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLCBjb25zdCB2b2lkICpkYWRkciwKKwkJCSAgICBjb25zdCB2b2lkICpzYWRkciwgdW5zaWduZWQgaW50IGxlbikKIHsKIAlyZXR1cm4gLUFYMjVfSEVBREVSX0xFTjsKIH0KIAotaW50IGF4MjVfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK25ldGRldl90eF90IGF4MjVfaXBfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXJldHVybiAxOworCWtmcmVlX3NrYihza2IpOworCXJldHVybiBORVRERVZfVFhfT0s7CiB9Ci0KICNlbmRpZgogCiBjb25zdCBzdHJ1Y3QgaGVhZGVyX29wcyBheDI1X2hlYWRlcl9vcHMgPSB7CiAJLmNyZWF0ZSA9IGF4MjVfaGFyZF9oZWFkZXIsCi0JLnJlYnVpbGQgPSBheDI1X3JlYnVpbGRfaGVhZGVyLAogfTsKIAotRVhQT1JUX1NZTUJPTChheDI1X2hhcmRfaGVhZGVyKTsKLUVYUE9SVF9TWU1CT0woYXgyNV9yZWJ1aWxkX2hlYWRlcik7CiBFWFBPUlRfU1lNQk9MKGF4MjVfaGVhZGVyX29wcyk7CitFWFBPUlRfU1lNQk9MKGF4MjVfaXBfeG1pdCk7CiAKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMgYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5jCmluZGV4IDI3NjQ5ZTguLjA5MDgyOGMgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuYwpAQCAtNTkyLDE1ICs1OTIsMTYgQEAKIAogCWN1cnJfZ3cgPSBiYXRhZHZfZ3dfZ2V0X3NlbGVjdGVkX2d3X25vZGUoYmF0X3ByaXYpOwogCi0JcmV0ID0gc2VxX3ByaW50ZihzZXEsICIlcyAlcE0gKCUzaSkgJXBNIFslMTBzXTogJXUuJXUvJXUuJXUgTUJpdFxuIiwKLQkJCSAoY3Vycl9ndyA9PSBnd19ub2RlID8gIj0+IiA6ICIgICIpLAotCQkJIGd3X25vZGUtPm9yaWdfbm9kZS0+b3JpZywKLQkJCSByb3V0ZXJfaWZpbmZvLT5iYXRfaXYudHFfYXZnLCByb3V0ZXItPmFkZHIsCi0JCQkgcm91dGVyLT5pZl9pbmNvbWluZy0+bmV0X2Rldi0+bmFtZSwKLQkJCSBnd19ub2RlLT5iYW5kd2lkdGhfZG93biAvIDEwLAotCQkJIGd3X25vZGUtPmJhbmR3aWR0aF9kb3duICUgMTAsCi0JCQkgZ3dfbm9kZS0+YmFuZHdpZHRoX3VwIC8gMTAsCi0JCQkgZ3dfbm9kZS0+YmFuZHdpZHRoX3VwICUgMTApOworCXNlcV9wcmludGYoc2VxLCAiJXMgJXBNICglM2kpICVwTSBbJTEwc106ICV1LiV1LyV1LiV1IE1CaXRcbiIsCisJCSAgIChjdXJyX2d3ID09IGd3X25vZGUgPyAiPT4iIDogIiAgIiksCisJCSAgIGd3X25vZGUtPm9yaWdfbm9kZS0+b3JpZywKKwkJICAgcm91dGVyX2lmaW5mby0+YmF0X2l2LnRxX2F2Zywgcm91dGVyLT5hZGRyLAorCQkgICByb3V0ZXItPmlmX2luY29taW5nLT5uZXRfZGV2LT5uYW1lLAorCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfZG93biAvIDEwLAorCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfZG93biAlIDEwLAorCQkgICBnd19ub2RlLT5iYW5kd2lkdGhfdXAgLyAxMCwKKwkJICAgZ3dfbm9kZS0+YmFuZHdpZHRoX3VwICUgMTApOworCXJldCA9IHNlcV9oYXNfb3ZlcmZsb3dlZChzZXEpID8gLTEgOiAwOwogCiAJaWYgKGN1cnJfZ3cpCiAJCWJhdGFkdl9nd19ub2RlX2ZyZWVfcmVmKGN1cnJfZ3cpOwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYyBiL25ldC9iYXRtYW4tYWR2L2hhcmQtaW50ZXJmYWNlLmMKaW5kZXggZmJkYTZiNS4uYmFmMWY5OCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvaGFyZC1pbnRlcmZhY2UuYworKysgYi9uZXQvYmF0bWFuLWFkdi9oYXJkLWludGVyZmFjZS5jCkBAIC04MywxMSArODMsMTIgQEAKIAkJcmV0dXJuIHRydWU7CiAKIAkvKiBubyBtb3JlIHBhcmVudHMuLnN0b3AgcmVjdXJzaW9uICovCi0JaWYgKG5ldF9kZXYtPmlmbGluayA9PSAwIHx8IG5ldF9kZXYtPmlmbGluayA9PSBuZXRfZGV2LT5pZmluZGV4KQorCWlmIChkZXZfZ2V0X2lmbGluayhuZXRfZGV2KSA9PSAwIHx8CisJICAgIGRldl9nZXRfaWZsaW5rKG5ldF9kZXYpID09IG5ldF9kZXYtPmlmaW5kZXgpCiAJCXJldHVybiBmYWxzZTsKIAogCS8qIHJlY3Vyc2Ugb3ZlciB0aGUgcGFyZW50IGRldmljZSAqLwotCXBhcmVudF9kZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgoJmluaXRfbmV0LCBuZXRfZGV2LT5pZmxpbmspOworCXBhcmVudF9kZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgoJmluaXRfbmV0LCBkZXZfZ2V0X2lmbGluayhuZXRfZGV2KSk7CiAJLyogaWYgd2UgZ290IGEgTlVMTCBwYXJlbnRfZGV2IHRoZXJlIGlzIHNvbWV0aGluZyBicm9rZW4uLiAqLwogCWlmIChXQVJOKCFwYXJlbnRfZGV2LCAiQ2Fubm90IGZpbmQgcGFyZW50IGRldmljZSIpKQogCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL0tjb25maWcgYi9uZXQvYmx1ZXRvb3RoL0tjb25maWcKaW5kZXggN2RlNzQ2My4uYjhjNzk0YiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9LY29uZmlnCisrKyBiL25ldC9ibHVldG9vdGgvS2NvbmZpZwpAQCAtOTEsNCArOTEsMTIgQEAKIAkgIFJ1biB0ZXN0IGNhc2VzIGZvciBTTVAgY3J5cHRvZ3JhcGhpYyBmdW5jdGlvbmFsaXR5LCBpbmNsdWRpbmcgYm90aAogCSAgbGVnYWN5IFNNUCBhcyB3ZWxsIGFzIHRoZSBTZWN1cmUgQ29ubmVjdGlvbnMgZmVhdHVyZXMuCiAKK2NvbmZpZyBCVF9ERUJVR0ZTCisJYm9vbCAiRXhwb3J0IEJsdWV0b290aCBpbnRlcm5hbHMgaW4gZGVidWdmcyIKKwlkZXBlbmRzIG9uIEJUICYmIERFQlVHX0ZTCisJZGVmYXVsdCB5CisJaGVscAorCSAgUHJvdmlkZSBleHRlbnNpdmUgaW5mb3JtYXRpb24gYWJvdXQgaW50ZXJuYWwgQmx1ZXRvb3RoIHN0YXRlcworCSAgaW4gZGVidWdmcy4KKwogc291cmNlICJkcml2ZXJzL2JsdWV0b290aC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9NYWtlZmlsZSBiL25ldC9ibHVldG9vdGgvTWFrZWZpbGUKaW5kZXggOGU5NmUzMC4uOWE4ZWEyMyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9NYWtlZmlsZQorKysgYi9uZXQvYmx1ZXRvb3RoL01ha2VmaWxlCkBAIC0xMyw4ICsxMyw5IEBACiAKIGJsdWV0b290aC15IDo9IGFmX2JsdWV0b290aC5vIGhjaV9jb3JlLm8gaGNpX2Nvbm4ubyBoY2lfZXZlbnQubyBtZ210Lm8gXAogCWhjaV9zb2NrLm8gaGNpX3N5c2ZzLm8gbDJjYXBfY29yZS5vIGwyY2FwX3NvY2subyBzbXAubyBzY28ubyBsaWIubyBcCi0JYTJtcC5vIGFtcC5vIGVjYy5vIGhjaV9yZXF1ZXN0Lm8gaGNpX2RlYnVnZnMubworCWEybXAubyBhbXAubyBlY2MubyBoY2lfcmVxdWVzdC5vIG1nbXRfdXRpbC5vCiAKK2JsdWV0b290aC0kKENPTkZJR19CVF9ERUJVR0ZTKSArPSBoY2lfZGVidWdmcy5vCiBibHVldG9vdGgtJChDT05GSUdfQlRfU0VMRlRFU1QpICs9IHNlbGZ0ZXN0Lm8KIAogc3ViZGlyLWNjZmxhZ3MteSArPSAtRF9fQ0hFQ0tfRU5ESUFOX18KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYTJtcC5jIGIvbmV0L2JsdWV0b290aC9hMm1wLmMKaW5kZXggY2VkZmJkYS4uNWEwNGViMSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9hMm1wLmMKKysrIGIvbmV0L2JsdWV0b290aC9hMm1wLmMKQEAgLTE5LDkgKzE5LDExIEBACiAjaW5jbHVkZSAiYTJtcC5oIgogI2luY2x1ZGUgImFtcC5oIgogCisjZGVmaW5lIEEyTVBfRkVBVF9FWFQJMHg4MDAwCisKIC8qIEdsb2JhbCBBTVAgTWFuYWdlciBsaXN0ICovCi1MSVNUX0hFQUQoYW1wX21ncl9saXN0KTsKLURFRklORV9NVVRFWChhbXBfbWdyX2xpc3RfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKGFtcF9tZ3JfbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKGFtcF9tZ3JfbGlzdF9sb2NrKTsKIAogLyogQTJNUCBidWlsZCAmIHNlbmQgY29tbWFuZCBoZWxwZXIgZnVuY3Rpb25zICovCiBzdGF0aWMgc3RydWN0IGEybXBfY21kICpfX2EybXBfYnVpbGQodTggY29kZSwgdTggaWRlbnQsIHUxNiBsZW4sIHZvaWQgKmRhdGEpCkBAIC00Myw3ICs0NSw3IEBACiAJcmV0dXJuIGNtZDsKIH0KIAotdm9pZCBhMm1wX3NlbmQoc3RydWN0IGFtcF9tZ3IgKm1nciwgdTggY29kZSwgdTggaWRlbnQsIHUxNiBsZW4sIHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBhMm1wX3NlbmQoc3RydWN0IGFtcF9tZ3IgKm1nciwgdTggY29kZSwgdTggaWRlbnQsIHUxNiBsZW4sIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4gPSBtZ3ItPmEybXBfY2hhbjsKIAlzdHJ1Y3QgYTJtcF9jbWQgKmNtZDsKQEAgLTY3LDcgKzY5LDcgQEAKIAlrZnJlZShjbWQpOwogfQogCi11OCBfX25leHRfaWRlbnQoc3RydWN0IGFtcF9tZ3IgKm1ncikKK3N0YXRpYyB1OCBfX25leHRfaWRlbnQoc3RydWN0IGFtcF9tZ3IgKm1ncikKIHsKIAlpZiAoKyttZ3ItPmlkZW50ID09IDApCiAJCW1nci0+aWRlbnQgPSAxOwpAQCAtNzUsNiArNzcsMjMgQEAKIAlyZXR1cm4gbWdyLT5pZGVudDsKIH0KIAorc3RhdGljIHN0cnVjdCBhbXBfbWdyICphbXBfbWdyX2xvb2t1cF9ieV9zdGF0ZSh1OCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgYW1wX21nciAqbWdyOworCisJbXV0ZXhfbG9jaygmYW1wX21ncl9saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkobWdyLCAmYW1wX21ncl9saXN0LCBsaXN0KSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoc3RhdGUsICZtZ3ItPnN0YXRlKSkgeworCQkJYW1wX21ncl9nZXQobWdyKTsKKwkJCW11dGV4X3VubG9jaygmYW1wX21ncl9saXN0X2xvY2spOworCQkJcmV0dXJuIG1ncjsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmFtcF9tZ3JfbGlzdF9sb2NrKTsKKworCXJldHVybiBOVUxMOworfQorCiAvKiBoY2lfZGV2X2xpc3Qgc2hhbGwgYmUgbG9ja2VkICovCiBzdGF0aWMgdm9pZCBfX2EybXBfYWRkX2NsKHN0cnVjdCBhbXBfbWdyICptZ3IsIHN0cnVjdCBhMm1wX2NsICpjbCkKIHsKQEAgLTg2MCwyMyArODc5LDYgQEAKIAlyZXR1cm4gbWdyLT5hMm1wX2NoYW47CiB9CiAKLXN0cnVjdCBhbXBfbWdyICphbXBfbWdyX2xvb2t1cF9ieV9zdGF0ZSh1OCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgYW1wX21nciAqbWdyOwotCi0JbXV0ZXhfbG9jaygmYW1wX21ncl9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkobWdyLCAmYW1wX21ncl9saXN0LCBsaXN0KSB7Ci0JCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoc3RhdGUsICZtZ3ItPnN0YXRlKSkgewotCQkJYW1wX21ncl9nZXQobWdyKTsKLQkJCW11dGV4X3VubG9jaygmYW1wX21ncl9saXN0X2xvY2spOwotCQkJcmV0dXJuIG1ncjsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJmFtcF9tZ3JfbGlzdF9sb2NrKTsKLQotCXJldHVybiBOVUxMOwotfQotCiB2b2lkIGEybXBfc2VuZF9nZXRpbmZvX3JzcChzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlzdHJ1Y3QgYW1wX21nciAqbWdyOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9hMm1wLmggYi9uZXQvYmx1ZXRvb3RoL2EybXAuaAppbmRleCA0ODdiNTRjLi4yOTZmNjY1IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2EybXAuaAorKysgYi9uZXQvYmx1ZXRvb3RoL2EybXAuaApAQCAtMTcsOCArMTcsNiBAQAogCiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9sMmNhcC5oPgogCi0jZGVmaW5lIEEyTVBfRkVBVF9FWFQJMHg4MDAwCi0KIGVudW0gYW1wX21ncl9zdGF0ZSB7CiAJUkVBRF9MT0NfQU1QX0lORk8sCiAJUkVBRF9MT0NfQU1QX0FTU09DLApAQCAtMTMxLDE2ICsxMjksMTAgQEAKICNkZWZpbmUgQTJNUF9TVEFUVVNfUEhZU19MSU5LX0VYSVNUUwkJMHgwNQogI2RlZmluZSBBMk1QX1NUQVRVU19TRUNVUklUWV9WSU9MQVRJT04JCTB4MDYKIAotZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgYW1wX21ncl9saXN0OwotZXh0ZXJuIHN0cnVjdCBtdXRleCBhbXBfbWdyX2xpc3RfbG9jazsKLQogc3RydWN0IGFtcF9tZ3IgKmFtcF9tZ3JfZ2V0KHN0cnVjdCBhbXBfbWdyICptZ3IpOwogaW50IGFtcF9tZ3JfcHV0KHN0cnVjdCBhbXBfbWdyICptZ3IpOwotdTggX19uZXh0X2lkZW50KHN0cnVjdCBhbXBfbWdyICptZ3IpOwogc3RydWN0IGwyY2FwX2NoYW4gKmEybXBfY2hhbm5lbF9jcmVhdGUoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sCiAJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwotc3RydWN0IGFtcF9tZ3IgKmFtcF9tZ3JfbG9va3VwX2J5X3N0YXRlKHU4IHN0YXRlKTsKLXZvaWQgYTJtcF9zZW5kKHN0cnVjdCBhbXBfbWdyICptZ3IsIHU4IGNvZGUsIHU4IGlkZW50LCB1MTYgbGVuLCB2b2lkICpkYXRhKTsKIHZvaWQgYTJtcF9kaXNjb3Zlcl9hbXAoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pOwogdm9pZCBhMm1wX3NlbmRfZ2V0aW5mb19yc3Aoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogdm9pZCBhMm1wX3NlbmRfZ2V0YW1wYXNzb2NfcnNwKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYyBiL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKaW5kZXggY2UyMmUwYy4uNzBmOWQ5NCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYworKysgYi9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCkBAIC0yMTAsOCArMjEwLDggQEAKIH0KIEVYUE9SVF9TWU1CT0woYnRfYWNjZXB0X2RlcXVldWUpOwogCi1pbnQgYnRfc29ja19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK2ludCBidF9zb2NrX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAorCQkgICAgaW50IGZsYWdzKQogewogCWludCBub2Jsb2NrID0gZmxhZ3MgJiBNU0dfRE9OVFdBSVQ7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CkBAIC0yODMsOCArMjgzLDggQEAKIAlyZXR1cm4gdGltZW87CiB9CiAKLWludCBidF9zb2NrX3N0cmVhbV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitpbnQgYnRfc29ja19zdHJlYW1fcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCWludCBlcnIgPSAwOwpAQCAtNzExLDEwICs3MTEsOSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBidF9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgZXJyOwogCi0JQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgYnRfc2tiX2NiKSA+IHNpemVvZihza2ItPmNiKSk7CisJc29ja19za2JfY2JfY2hlY2tfc2l6ZShzaXplb2Yoc3RydWN0IGJ0X3NrYl9jYikpOwogCiAJQlRfSU5GTygiQ29yZSB2ZXIgJXMiLCBWRVJTSU9OKTsKIApAQCAtNzUwLDYgKzc0OSwxMyBAQAogCQlnb3RvIHNvY2tfZXJyOwogCX0KIAorCWVyciA9IG1nbXRfaW5pdCgpOworCWlmIChlcnIgPCAwKSB7CisJCXNjb19leGl0KCk7CisJCWwyY2FwX2V4aXQoKTsKKwkJZ290byBzb2NrX2VycjsKKwl9CisKIAlyZXR1cm4gMDsKIAogc29ja19lcnI6CkBAIC03NjQsNiArNzcwLDggQEAKIAogc3RhdGljIHZvaWQgX19leGl0IGJ0X2V4aXQodm9pZCkKIHsKKwltZ210X2V4aXQoKTsKKwogCXNjb19leGl0KCk7CiAKIAlsMmNhcF9leGl0KCk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oIGIvbmV0L2JsdWV0b290aC9ibmVwL2JuZXAuaAppbmRleCA1YTViMTZmLi40MDg1NGM5IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2JuZXAvYm5lcC5oCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9ibmVwLmgKQEAgLTExMSw2ICsxMTEsMTAgQEAKICNkZWZpbmUgQk5FUENPTk5ERUwJX0lPVygnQicsIDIwMSwgaW50KQogI2RlZmluZSBCTkVQR0VUQ09OTkxJU1QJX0lPUignQicsIDIxMCwgaW50KQogI2RlZmluZSBCTkVQR0VUQ09OTklORk8JX0lPUignQicsIDIxMSwgaW50KQorI2RlZmluZSBCTkVQR0VUU1VQUEZFQVQJX0lPUignQicsIDIxMiwgaW50KQorCisjZGVmaW5lIEJORVBfU0VUVVBfUkVTUE9OU0UJMAorI2RlZmluZSBCTkVQX1NFVFVQX1JTUF9TRU5UCTEwCiAKIHN0cnVjdCBibmVwX2Nvbm5hZGRfcmVxIHsKIAlpbnQgICBzb2NrOwkJLyogQ29ubmVjdGVkIHNvY2tldCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKaW5kZXggMDVmNTdlNC4uMTY0MTM2NyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCkBAIC0yMzEsNyArMjMxLDE0IEBACiAJCWJyZWFrOwogCiAJY2FzZSBCTkVQX1NFVFVQX0NPTk5fUkVROgotCQllcnIgPSBibmVwX3NlbmRfcnNwKHMsIEJORVBfU0VUVVBfQ09OTl9SU1AsIEJORVBfQ09OTl9OT1RfQUxMT1dFRCk7CisJCS8qIFN1Y2Nlc3NmdWwgcmVzcG9uc2Ugc2hvdWxkIGJlIHNlbnQgb25seSBvbmNlICovCisJCWlmICh0ZXN0X2JpdChCTkVQX1NFVFVQX1JFU1BPTlNFLCAmcy0+ZmxhZ3MpICYmCisJCSAgICAhdGVzdF9hbmRfc2V0X2JpdChCTkVQX1NFVFVQX1JTUF9TRU5ULCAmcy0+ZmxhZ3MpKQorCQkJZXJyID0gYm5lcF9zZW5kX3JzcChzLCBCTkVQX1NFVFVQX0NPTk5fUlNQLAorCQkJCQkgICAgQk5FUF9TVUNDRVNTKTsKKwkJZWxzZQorCQkJZXJyID0gYm5lcF9zZW5kX3JzcChzLCBCTkVQX1NFVFVQX0NPTk5fUlNQLAorCQkJCQkgICAgQk5FUF9DT05OX05PVF9BTExPV0VEKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OiB7CkBAIC0yMzksNyArMjQ2LDcgQEAKIAkJCXBrdFswXSA9IEJORVBfQ09OVFJPTDsKIAkJCXBrdFsxXSA9IEJORVBfQ01EX05PVF9VTkRFUlNUT09EOwogCQkJcGt0WzJdID0gY21kOwotCQkJYm5lcF9zZW5kKHMsIHBrdCwgc2l6ZW9mKHBrdCkpOworCQkJZXJyID0gYm5lcF9zZW5kKHMsIHBrdCwgc2l6ZW9mKHBrdCkpOwogCQl9CiAJCWJyZWFrOwogCX0KQEAgLTI5MiwzMCArMjk5LDU2IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHMtPmRldjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKLQl1OCB0eXBlOworCXU4IHR5cGUsIGN0cmxfdHlwZTsKIAogCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gc2tiLT5sZW47CiAKIAl0eXBlID0gKih1OCAqKSBza2ItPmRhdGE7CiAJc2tiX3B1bGwoc2tiLCAxKTsKKwljdHJsX3R5cGUgPSAqKHU4ICopc2tiLT5kYXRhOwogCiAJaWYgKCh0eXBlICYgQk5FUF9UWVBFX01BU0spID49IHNpemVvZihfX2JuZXBfcnhfaGxlbikpCiAJCWdvdG8gYmFkZnJhbWU7CiAKIAlpZiAoKHR5cGUgJiBCTkVQX1RZUEVfTUFTSykgPT0gQk5FUF9DT05UUk9MKSB7Ci0JCWJuZXBfcnhfY29udHJvbChzLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybiAwOworCQlpZiAoYm5lcF9yeF9jb250cm9sKHMsIHNrYi0+ZGF0YSwgc2tiLT5sZW4pIDwgMCkgeworCQkJZGV2LT5zdGF0cy50eF9lcnJvcnMrKzsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoISh0eXBlICYgQk5FUF9FWFRfSEVBREVSKSkgeworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCS8qIFZlcmlmeSBhbmQgcHVsbCBjdHJsIG1lc3NhZ2Ugc2luY2UgaXQncyBhbHJlYWR5IHByb2Nlc3NlZCAqLworCQlzd2l0Y2ggKGN0cmxfdHlwZSkgeworCQljYXNlIEJORVBfU0VUVVBfQ09OTl9SRVE6CisJCQkvKiBQdWxsOiBjdHJsIHR5cGUgKDEgYiksIGxlbiAoMSBiKSwgZGF0YSAobGVuIGJ5dGVzKSAqLworCQkJaWYgKCFza2JfcHVsbChza2IsIDIgKyAqKHU4ICopKHNrYi0+ZGF0YSArIDEpICogMikpCisJCQkJZ290byBiYWRmcmFtZTsKKwkJCWJyZWFrOworCQljYXNlIEJORVBfRklMVEVSX01VTFRJX0FERFJfU0VUOgorCQljYXNlIEJORVBfRklMVEVSX05FVF9UWVBFX1NFVDoKKwkJCS8qIFB1bGw6IGN0cmwgdHlwZSAoMSBiKSwgbGVuICgyIGIpLCBkYXRhIChsZW4gYnl0ZXMpICovCisJCQlpZiAoIXNrYl9wdWxsKHNrYiwgMyArICoodTE2ICopKHNrYi0+ZGF0YSArIDEpICogMikpCisJCQkJZ290byBiYWRmcmFtZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gZWxzZSB7CisJCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CisKKwkJLyogVmVyaWZ5IGFuZCBwdWxsIG91dCBoZWFkZXIgKi8KKwkJaWYgKCFza2JfcHVsbChza2IsIF9fYm5lcF9yeF9obGVuW3R5cGUgJiBCTkVQX1RZUEVfTUFTS10pKQorCQkJZ290byBiYWRmcmFtZTsKKworCQlzLT5laC5oX3Byb3RvID0gZ2V0X3VuYWxpZ25lZCgoX19iZTE2ICopIChza2ItPmRhdGEgLSAyKSk7CiAJfQogCi0Jc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQotCS8qIFZlcmlmeSBhbmQgcHVsbCBvdXQgaGVhZGVyICovCi0JaWYgKCFza2JfcHVsbChza2IsIF9fYm5lcF9yeF9obGVuW3R5cGUgJiBCTkVQX1RZUEVfTUFTS10pKQotCQlnb3RvIGJhZGZyYW1lOwotCi0Jcy0+ZWguaF9wcm90byA9IGdldF91bmFsaWduZWQoKF9fYmUxNiAqKSAoc2tiLT5kYXRhIC0gMikpOwotCiAJaWYgKHR5cGUgJiBCTkVQX0VYVF9IRUFERVIpIHsKIAkJaWYgKGJuZXBfcnhfZXh0ZW5zaW9uKHMsIHNrYikgPCAwKQogCQkJZ290byBiYWRmcmFtZTsKQEAgLTUyNSw2ICs1NTgsNyBAQAogCiBpbnQgYm5lcF9hZGRfY29ubmVjdGlvbihzdHJ1Y3QgYm5lcF9jb25uYWRkX3JlcSAqcmVxLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogeworCXUzMiB2YWxpZF9mbGFncyA9IEJJVChCTkVQX1NFVFVQX1JFU1BPTlNFKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBibmVwX3Nlc3Npb24gKnMsICpzczsKIAl1OCBkc3RbRVRIX0FMRU5dLCBzcmNbRVRIX0FMRU5dOwpAQCAtNTM1LDYgKzU2OSw5IEBACiAJaWYgKCFsMmNhcF9pc19zb2NrZXQoc29jaykpCiAJCXJldHVybiAtRUJBREZEOwogCisJaWYgKHJlcS0+ZmxhZ3MgJiB+dmFsaWRfZmxhZ3MpCisJCXJldHVybiAtRUlOVkFMOworCiAJYmFzd2FwKCh2b2lkICopIGRzdCwgJmwyY2FwX3BpKHNvY2stPnNrKS0+Y2hhbi0+ZHN0KTsKIAliYXN3YXAoKHZvaWQgKikgc3JjLCAmbDJjYXBfcGkoc29jay0+c2spLT5jaGFuLT5zcmMpOwogCkBAIC01NjYsNiArNjAzLDcgQEAKIAlzLT5zb2NrICA9IHNvY2s7CiAJcy0+cm9sZSAgPSByZXEtPnJvbGU7CiAJcy0+c3RhdGUgPSBCVF9DT05ORUNURUQ7CisJcy0+ZmxhZ3MgPSByZXEtPmZsYWdzOwogCiAJcy0+bXNnLm1zZ19mbGFncyA9IE1TR19OT1NJR05BTDsKIApAQCAtNjExLDExICs2NDksMTUgQEAKIAogaW50IGJuZXBfZGVsX2Nvbm5lY3Rpb24oc3RydWN0IGJuZXBfY29ubmRlbF9yZXEgKnJlcSkKIHsKKwl1MzIgdmFsaWRfZmxhZ3MgPSAwOwogCXN0cnVjdCBibmVwX3Nlc3Npb24gKnM7CiAJaW50ICBlcnIgPSAwOwogCiAJQlRfREJHKCIiKTsKIAorCWlmIChyZXEtPmZsYWdzICYgfnZhbGlkX2ZsYWdzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWRvd25fcmVhZCgmYm5lcF9zZXNzaW9uX3NlbSk7CiAKIAlzID0gX19ibmVwX2dldF9zZXNzaW9uKHJlcS0+ZHN0KTsKQEAgLTYzMSwxMCArNjczLDEyIEBACiAKIHN0YXRpYyB2b2lkIF9fYm5lcF9jb3B5X2NpKHN0cnVjdCBibmVwX2Nvbm5pbmZvICpjaSwgc3RydWN0IGJuZXBfc2Vzc2lvbiAqcykKIHsKKwl1MzIgdmFsaWRfZmxhZ3MgPSBCSVQoQk5FUF9TRVRVUF9SRVNQT05TRSk7CisKIAltZW1zZXQoY2ksIDAsIHNpemVvZigqY2kpKTsKIAltZW1jcHkoY2ktPmRzdCwgcy0+ZWguaF9zb3VyY2UsIEVUSF9BTEVOKTsKIAlzdHJjcHkoY2ktPmRldmljZSwgcy0+ZGV2LT5uYW1lKTsKLQljaS0+ZmxhZ3MgPSBzLT5mbGFnczsKKwljaS0+ZmxhZ3MgPSBzLT5mbGFncyAmIHZhbGlkX2ZsYWdzOwogCWNpLT5zdGF0ZSA9IHMtPnN0YXRlOwogCWNpLT5yb2xlICA9IHMtPnJvbGU7CiB9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvbmV0ZGV2LmMKaW5kZXggNGI0ODhlYy4uNmNlYjVkMyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL25ldGRldi5jCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9uZXRkZXYuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiB2b2lkIGJuZXBfbmV0X3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAKLQltZW1zZXQoZGV2LT5icm9hZGNhc3QsIDB4ZmYsIEVUSF9BTEVOKTsKKwlldGhfYnJvYWRjYXN0X2FkZHIoZGV2LT5icm9hZGNhc3QpOwogCWRldi0+YWRkcl9sZW4gPSBFVEhfQUxFTjsKIAogCWV0aGVyX3NldHVwKGRldik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2JuZXAvc29jay5jIGIvbmV0L2JsdWV0b290aC9ibmVwL3NvY2suYwppbmRleCA1ZjA1MTI5Li5iZGUyYmRkIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2JuZXAvc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvYm5lcC9zb2NrLmMKQEAgLTU3LDYgKzU3LDcgQEAKIAlzdHJ1Y3QgYm5lcF9jb25uaW5mbyBjaTsKIAlzdHJ1Y3Qgc29ja2V0ICpuc29jazsKIAl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlfX3UzMiBzdXBwX2ZlYXQgPSBCSVQoQk5FUF9TRVRVUF9SRVNQT05TRSk7CiAJaW50IGVycjsKIAogCUJUX0RCRygiY21kICV4IGFyZyAlbHgiLCBjbWQsIGFyZyk7CkBAIC0xMjAsNiArMTIxLDEyIEBACiAKIAkJcmV0dXJuIGVycjsKIAorCWNhc2UgQk5FUEdFVFNVUFBGRUFUOgorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZzdXBwX2ZlYXQsIHNpemVvZihzdXBwX2ZlYXQpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiAwOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL2NhcGkuYyBiL25ldC9ibHVldG9vdGgvY210cC9jYXBpLmMKaW5kZXggNzViZDJjNC4uYjBjNmM2YSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9jbXRwL2NhcGkuYworKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY2FwaS5jCkBAIC0zMzMsNyArMzMzLDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmIChzZXNzaW9uLT5mbGFncyAmICgxIDw8IENNVFBfTE9PUEJBQ0spKSB7CisJaWYgKHNlc3Npb24tPmZsYWdzICYgQklUKENNVFBfTE9PUEJBQ0spKSB7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKaW5kZXggMjc4YTE5NC4uMjk4ZWQzNyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCkBAIC03NSwxMCArNzUsMTEgQEAKIAogc3RhdGljIHZvaWQgX19jbXRwX2NvcHlfc2Vzc2lvbihzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uLCBzdHJ1Y3QgY210cF9jb25uaW5mbyAqY2kpCiB7CisJdTMyIHZhbGlkX2ZsYWdzID0gQklUKENNVFBfTE9PUEJBQ0spOwogCW1lbXNldChjaSwgMCwgc2l6ZW9mKCpjaSkpOwogCWJhY3B5KCZjaS0+YmRhZGRyLCAmc2Vzc2lvbi0+YmRhZGRyKTsKIAotCWNpLT5mbGFncyA9IHNlc3Npb24tPmZsYWdzOworCWNpLT5mbGFncyA9IHNlc3Npb24tPmZsYWdzICYgdmFsaWRfZmxhZ3M7CiAJY2ktPnN0YXRlID0gc2Vzc2lvbi0+c3RhdGU7CiAKIAljaS0+bnVtID0gc2Vzc2lvbi0+bnVtOwpAQCAtMzEzLDcgKzMxNCw3IEBACiAKIAlkb3duX3dyaXRlKCZjbXRwX3Nlc3Npb25fc2VtKTsKIAotCWlmICghKHNlc3Npb24tPmZsYWdzICYgKDEgPDwgQ01UUF9MT09QQkFDSykpKQorCWlmICghKHNlc3Npb24tPmZsYWdzICYgQklUKENNVFBfTE9PUEJBQ0spKSkKIAkJY210cF9kZXRhY2hfZGV2aWNlKHNlc3Npb24pOwogCiAJZnB1dChzZXNzaW9uLT5zb2NrLT5maWxlKTsKQEAgLTMyOSw2ICszMzAsNyBAQAogCiBpbnQgY210cF9hZGRfY29ubmVjdGlvbihzdHJ1Y3QgY210cF9jb25uYWRkX3JlcSAqcmVxLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrKQogeworCXUzMiB2YWxpZF9mbGFncyA9IEJJVChDTVRQX0xPT1BCQUNLKTsKIAlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uLCAqczsKIAlpbnQgaSwgZXJyOwogCkBAIC0zMzcsNiArMzM5LDkgQEAKIAlpZiAoIWwyY2FwX2lzX3NvY2tldChzb2NrKSkKIAkJcmV0dXJuIC1FQkFERkQ7CiAKKwlpZiAocmVxLT5mbGFncyAmIH52YWxpZF9mbGFncykKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlzZXNzaW9uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNtdHBfc2Vzc2lvbiksIEdGUF9LRVJORUwpOwogCWlmICghc2Vzc2lvbikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0zODUsNyArMzkwLDcgQEAKIAkJZ290byB1bmxpbms7CiAJfQogCi0JaWYgKCEoc2Vzc2lvbi0+ZmxhZ3MgJiAoMSA8PCBDTVRQX0xPT1BCQUNLKSkpIHsKKwlpZiAoIShzZXNzaW9uLT5mbGFncyAmIEJJVChDTVRQX0xPT1BCQUNLKSkpIHsKIAkJZXJyID0gY210cF9hdHRhY2hfZGV2aWNlKHNlc3Npb24pOwogCQlpZiAoZXJyIDwgMCkgewogCQkJYXRvbWljX2luYygmc2Vzc2lvbi0+dGVybWluYXRlKTsKQEAgLTQwOSwxMSArNDE0LDE1IEBACiAKIGludCBjbXRwX2RlbF9jb25uZWN0aW9uKHN0cnVjdCBjbXRwX2Nvbm5kZWxfcmVxICpyZXEpCiB7CisJdTMyIHZhbGlkX2ZsYWdzID0gMDsKIAlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uOwogCWludCBlcnIgPSAwOwogCiAJQlRfREJHKCIiKTsKIAorCWlmIChyZXEtPmZsYWdzICYgfnZhbGlkX2ZsYWdzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWRvd25fcmVhZCgmY210cF9zZXNzaW9uX3NlbSk7CiAKIAlzZXNzaW9uID0gX19jbXRwX2dldF9zZXNzaW9uKCZyZXEtPmJkYWRkcik7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKaW5kZXggYzliOGZhNS4uZWU1ZTU5OCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwpAQCAtMzA5LDcgKzMwOSw3IEBACiAJCWVsc2UKIAkJCWhjaV9hZGRfc2NvKHNjbywgY29ubi0+aGFuZGxlKTsKIAl9IGVsc2UgewotCQloY2lfcHJvdG9fY29ubmVjdF9jZm0oc2NvLCBzdGF0dXMpOworCQloY2lfY29ubmVjdF9jZm0oc2NvLCBzdGF0dXMpOwogCQloY2lfY29ubl9kZWwoc2NvKTsKIAl9CiB9CkBAIC01NzEsNyArNTcxLDcgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmhjaV9kZXZfbGlzdCwgbGlzdCkgewogCQlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmQtPmZsYWdzKSB8fAotCQkgICAgdGVzdF9iaXQoSENJX1VTRVJfQ0hBTk5FTCwgJmQtPmRldl9mbGFncykgfHwKKwkJICAgIGhjaV9kZXZfdGVzdF9mbGFnKGQsIEhDSV9VU0VSX0NIQU5ORUwpIHx8CiAJCSAgICBkLT5kZXZfdHlwZSAhPSBIQ0lfQlJFRFIpCiAJCQljb250aW51ZTsKIApAQCAtNjE4LDcgKzYxOCw3IEBACiAJbWdtdF9jb25uZWN0X2ZhaWxlZChoZGV2LCAmY29ubi0+ZHN0LCBjb25uLT50eXBlLCBjb25uLT5kc3RfdHlwZSwKIAkJCSAgICBzdGF0dXMpOwogCi0JaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CisJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CiAKIAloY2lfY29ubl9kZWwoY29ubik7CiAKQEAgLTcwMCw3ICs3MDAsNyBAQAogCSAqIGFuZCB3cml0ZSBhIG5ldyByYW5kb20gYWRkcmVzcy4gVGhlIGZsYWcgd2lsbCBiZSBzZXQgYmFjayBvbgogCSAqIGFzIHNvb24gYXMgdGhlIFNFVF9BRFZfRU5BQkxFIEhDSSBjb21tYW5kIGNvbXBsZXRlcy4KIAkgKi8KLQljbGVhcl9iaXQoSENJX0xFX0FEViwgJmhkZXYtPmRldl9mbGFncyk7CisJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9MRV9BRFYpOwogCiAJLyogU2V0IHJlcXVpcmVfcHJpdmFjeSB0byBmYWxzZSBzbyB0aGF0IHRoZSByZW1vdGUgZGV2aWNlIGhhcyBhCiAJICogY2hhbmNlIG9mIGlkZW50aWZ5aW5nIHVzLgpAQCAtNzMzLDYgKzczMywxNCBAQAogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJaW50IGVycjsKIAorCS8qIExldCdzIG1ha2Ugc3VyZSB0aGF0IGxlIGlzIGVuYWJsZWQuKi8KKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9FTkFCTEVEKSkgeworCQlpZiAobG1wX2xlX2NhcGFibGUoaGRldikpCisJCQlyZXR1cm4gRVJSX1BUUigtRUNPTk5SRUZVU0VEKTsKKworCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisJfQorCiAJLyogU29tZSBkZXZpY2VzIHNlbmQgQVRUIG1lc3NhZ2VzIGFzIHNvb24gYXMgdGhlIHBoeXNpY2FsIGxpbmsgaXMKIAkgKiBlc3RhYmxpc2hlZC4gVG8gYmUgYWJsZSB0byBoYW5kbGUgdGhlc2UgQVRUIG1lc3NhZ2VzLCB0aGUgdXNlci0KIAkgKiBzcGFjZSBmaXJzdCBlc3RhYmxpc2hlcyB0aGUgY29ubmVjdGlvbiBhbmQgdGhlbiBzdGFydHMgdGhlIHBhaXJpbmcKQEAgLTc5MSw3ICs3OTksNyBAQAogCSAqIGFueXdheSBoYXZlIHRvIGRpc2FibGUgaXQgaW4gb3JkZXIgdG8gc3RhcnQgZGlyZWN0ZWQKIAkgKiBhZHZlcnRpc2luZy4KIAkgKi8KLQlpZiAodGVzdF9iaXQoSENJX0xFX0FEViwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0FEVikpIHsKIAkJdTggZW5hYmxlID0gMHgwMDsKIAkJaGNpX3JlcV9hZGQoJnJlcSwgSENJX09QX0xFX1NFVF9BRFZfRU5BQkxFLCBzaXplb2YoZW5hYmxlKSwKIAkJCSAgICAmZW5hYmxlKTsKQEAgLTgwMiw3ICs4MTAsNyBAQAogCQkvKiBJZiB3ZSdyZSBhY3RpdmUgc2Nhbm5pbmcgbW9zdCBjb250cm9sbGVycyBhcmUgdW5hYmxlCiAJCSAqIHRvIGluaXRpYXRlIGFkdmVydGlzaW5nLiBTaW1wbHkgcmVqZWN0IHRoZSBhdHRlbXB0LgogCQkgKi8KLQkJaWYgKHRlc3RfYml0KEhDSV9MRV9TQ0FOLCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgorCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX1NDQU4pICYmCiAJCSAgICBoZGV2LT5sZV9zY2FuX3R5cGUgPT0gTEVfU0NBTl9BQ1RJVkUpIHsKIAkJCXNrYl9xdWV1ZV9wdXJnZSgmcmVxLmNtZF9xKTsKIAkJCWhjaV9jb25uX2RlbChjb25uKTsKQEAgLTgzMiw5ICs4NDAsOSBAQAogCSAqIGhhbmRsZXIgZm9yIHNjYW4gZGlzYWJsaW5nIGtub3dzIHRvIHNldCB0aGUgY29ycmVjdCBkaXNjb3ZlcnkKIAkgKiBzdGF0ZS4KIAkgKi8KLQlpZiAodGVzdF9iaXQoSENJX0xFX1NDQU4sICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9TQ0FOKSkgewogCQloY2lfcmVxX2FkZF9sZV9zY2FuX2Rpc2FibGUoJnJlcSk7Ci0JCXNldF9iaXQoSENJX0xFX1NDQU5fSU5URVJSVVBURUQsICZoZGV2LT5kZXZfZmxhZ3MpOworCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9MRV9TQ0FOX0lOVEVSUlVQVEVEKTsKIAl9CiAKIAloY2lfcmVxX2FkZF9sZV9jcmVhdGVfY29ubigmcmVxLCBjb25uKTsKQEAgLTg1Niw4ICs4NjQsMTIgQEAKIHsKIAlzdHJ1Y3QgaGNpX2Nvbm4gKmFjbDsKIAotCWlmICghdGVzdF9iaXQoSENJX0JSRURSX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpKSB7CisJCWlmIChsbXBfYnJlZHJfY2FwYWJsZShoZGV2KSkKKwkJCXJldHVybiBFUlJfUFRSKC1FQ09OTlJFRlVTRUQpOworCiAJCXJldHVybiBFUlJfUFRSKC1FT1BOT1RTVVBQKTsKKwl9CiAKIAlhY2wgPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBBQ0xfTElOSywgZHN0KTsKIAlpZiAoIWFjbCkgewpAQCAtOTMwLDcgKzk0Miw3IEBACiAJICogQ29ubmVjdGlvbnMgaXMgdXNlZCBhbmQgdGhlIGxpbmsgaXMgZW5jcnlwdGVkIHdpdGggQUVTLUNDTQogCSAqIHVzaW5nIGEgUC0yNTYgYXV0aGVudGljYXRlZCBjb21iaW5hdGlvbiBrZXkuCiAJICovCi0JaWYgKHRlc3RfYml0KEhDSV9TQ19PTkxZLCAmY29ubi0+aGRldi0+ZmxhZ3MpKSB7CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGNvbm4tPmhkZXYsIEhDSV9TQ19PTkxZKSkgewogCQlpZiAoIWhjaV9jb25uX3NjX2VuYWJsZWQoY29ubikgfHwKIAkJICAgICF0ZXN0X2JpdChIQ0lfQ09OTl9BRVNfQ0NNLCAmY29ubi0+ZmxhZ3MpIHx8CiAJCSAgICBjb25uLT5rZXlfdHlwZSAhPSBIQ0lfTEtfQVVUSF9DT01CSU5BVElPTl9QMjU2KQpAQCAtMTEzOSw3ICsxMTUxLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYywgbiwgJmgtPmxpc3QsIGxpc3QpIHsKIAkJYy0+c3RhdGUgPSBCVF9DTE9TRUQ7CiAKLQkJaGNpX3Byb3RvX2Rpc2Nvbm5fY2ZtKGMsIEhDSV9FUlJPUl9MT0NBTF9IT1NUX1RFUk0pOworCQloY2lfZGlzY29ubl9jZm0oYywgSENJX0VSUk9SX0xPQ0FMX0hPU1RfVEVSTSk7CiAJCWhjaV9jb25uX2RlbChjKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKaW5kZXggMzMyMmQzZi4uNDc2NzA5YiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYwpAQCAtNTEsNyArNTEsNyBAQAogCiAvKiBIQ0kgY2FsbGJhY2sgbGlzdCAqLwogTElTVF9IRUFEKGhjaV9jYl9saXN0KTsKLURFRklORV9SV0xPQ0soaGNpX2NiX2xpc3RfbG9jayk7CitERUZJTkVfTVVURVgoaGNpX2NiX2xpc3RfbG9jayk7CiAKIC8qIEhDSSBJRCBOdW1iZXJpbmcgKi8KIHN0YXRpYyBERUZJTkVfSURBKGhjaV9pbmRleF9pZGEpOwpAQCAtODAsNyArODAsNyBAQAogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNoYXIgYnVmWzNdOwogCi0JYnVmWzBdID0gdGVzdF9iaXQoSENJX0RVVF9NT0RFLCAmaGRldi0+ZGJnX2ZsYWdzKSA/ICdZJzogJ04nOworCWJ1ZlswXSA9IGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9EVVRfTU9ERSkgPyAnWSc6ICdOJzsKIAlidWZbMV0gPSAnXG4nOwogCWJ1ZlsyXSA9ICdcMCc7CiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCAyKTsKQEAgLTEwNiw3ICsxMDYsNyBAQAogCWlmIChzdHJ0b2Jvb2woYnVmLCAmZW5hYmxlKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZW5hYmxlID09IHRlc3RfYml0KEhDSV9EVVRfTU9ERSwgJmhkZXYtPmRiZ19mbGFncykpCisJaWYgKGVuYWJsZSA9PSBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfRFVUX01PREUpKQogCQlyZXR1cm4gLUVBTFJFQURZOwogCiAJaGNpX3JlcV9sb2NrKGhkZXYpOwpAQCAtMTI3LDcgKzEyNyw3IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQljaGFuZ2VfYml0KEhDSV9EVVRfTU9ERSwgJmhkZXYtPmRiZ19mbGFncyk7CisJaGNpX2Rldl9jaGFuZ2VfZmxhZyhoZGV2LCBIQ0lfRFVUX01PREUpOwogCiAJcmV0dXJuIGNvdW50OwogfQpAQCAtMTQxLDEzICsxNDEsMTYgQEAKIAogLyogLS0tLSBIQ0kgcmVxdWVzdHMgLS0tLSAqLwogCi1zdGF0aWMgdm9pZCBoY2lfcmVxX3N5bmNfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHJlc3VsdCwgdTE2IG9wY29kZSkKK3N0YXRpYyB2b2lkIGhjaV9yZXFfc3luY19jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggcmVzdWx0LCB1MTYgb3Bjb2RlLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlCVF9EQkcoIiVzIHJlc3VsdCAweCUyLjJ4IiwgaGRldi0+bmFtZSwgcmVzdWx0KTsKIAogCWlmIChoZGV2LT5yZXFfc3RhdHVzID09IEhDSV9SRVFfUEVORCkgewogCQloZGV2LT5yZXFfcmVzdWx0ID0gcmVzdWx0OwogCQloZGV2LT5yZXFfc3RhdHVzID0gSENJX1JFUV9ET05FOworCQlpZiAoc2tiKQorCQkJaGRldi0+cmVxX3NrYiA9IHNrYl9nZXQoc2tiKTsKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZoZGV2LT5yZXFfd2FpdF9xKTsKIAl9CiB9CkBAIC0xNjMsNjYgKzE2NiwxMiBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBza19idWZmICpoY2lfZ2V0X2NtZF9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTE2IG9wY29kZSwKLQkJCQkJICAgIHU4IGV2ZW50KQotewotCXN0cnVjdCBoY2lfZXZfY21kX2NvbXBsZXRlICpldjsKLQlzdHJ1Y3QgaGNpX2V2ZW50X2hkciAqaGRyOwotCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQloY2lfZGV2X2xvY2soaGRldik7Ci0KLQlza2IgPSBoZGV2LT5yZWN2X2V2dDsKLQloZGV2LT5yZWN2X2V2dCA9IE5VTEw7Ci0KLQloY2lfZGV2X3VubG9jayhoZGV2KTsKLQotCWlmICghc2tiKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7Ci0KLQlpZiAoc2tiLT5sZW4gPCBzaXplb2YoKmhkcikpIHsKLQkJQlRfRVJSKCJUb28gc2hvcnQgSENJIGV2ZW50Iik7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCWhkciA9ICh2b2lkICopIHNrYi0+ZGF0YTsKLQlza2JfcHVsbChza2IsIEhDSV9FVkVOVF9IRFJfU0laRSk7Ci0KLQlpZiAoZXZlbnQpIHsKLQkJaWYgKGhkci0+ZXZ0ICE9IGV2ZW50KQotCQkJZ290byBmYWlsZWQ7Ci0JCXJldHVybiBza2I7Ci0JfQotCi0JaWYgKGhkci0+ZXZ0ICE9IEhDSV9FVl9DTURfQ09NUExFVEUpIHsKLQkJQlRfREJHKCJMYXN0IGV2ZW50IGlzIG5vdCBjbWQgY29tcGxldGUgKDB4JTIuMngpIiwgaGRyLT5ldnQpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlpZiAoc2tiLT5sZW4gPCBzaXplb2YoKmV2KSkgewotCQlCVF9FUlIoIlRvbyBzaG9ydCBjbWRfY29tcGxldGUgZXZlbnQiKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JZXYgPSAodm9pZCAqKSBza2ItPmRhdGE7Ci0Jc2tiX3B1bGwoc2tiLCBzaXplb2YoKmV2KSk7Ci0KLQlpZiAob3Bjb2RlID09IF9fbGUxNl90b19jcHUoZXYtPm9wY29kZSkpCi0JCXJldHVybiBza2I7Ci0KLQlCVF9EQkcoIm9wY29kZSBkb2Vzbid0IG1hdGNoICgweCUyLjJ4ICE9IDB4JTIuMngpIiwgb3Bjb2RlLAotCSAgICAgICBfX2xlMTZfdG9fY3B1KGV2LT5vcGNvZGUpKTsKLQotZmFpbGVkOgotCWtmcmVlX3NrYihza2IpOwotCXJldHVybiBFUlJfUFRSKC1FTk9EQVRBKTsKLX0KLQogc3RydWN0IHNrX2J1ZmYgKl9faGNpX2NtZF9zeW5jX2V2KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1MTYgb3Bjb2RlLCB1MzIgcGxlbiwKIAkJCQkgIGNvbnN0IHZvaWQgKnBhcmFtLCB1OCBldmVudCwgdTMyIHRpbWVvdXQpCiB7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CiAJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnIgPSAwOwogCiAJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOwpAQCAtMjM2LDcgKzE4NSw3IEBACiAJYWRkX3dhaXRfcXVldWUoJmhkZXYtPnJlcV93YWl0X3EsICZ3YWl0KTsKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCi0JZXJyID0gaGNpX3JlcV9ydW4oJnJlcSwgaGNpX3JlcV9zeW5jX2NvbXBsZXRlKTsKKwllcnIgPSBoY2lfcmVxX3J1bl9za2IoJnJlcSwgaGNpX3JlcV9zeW5jX2NvbXBsZXRlKTsKIAlpZiAoZXJyIDwgMCkgewogCQlyZW1vdmVfd2FpdF9xdWV1ZSgmaGRldi0+cmVxX3dhaXRfcSwgJndhaXQpOwogCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwpAQCAtMjY1LDEzICsyMTQsMjAgQEAKIAl9CiAKIAloZGV2LT5yZXFfc3RhdHVzID0gaGRldi0+cmVxX3Jlc3VsdCA9IDA7CisJc2tiID0gaGRldi0+cmVxX3NrYjsKKwloZGV2LT5yZXFfc2tiID0gTlVMTDsKIAogCUJUX0RCRygiJXMgZW5kOiBlcnIgJWQiLCBoZGV2LT5uYW1lLCBlcnIpOwogCi0JaWYgKGVyciA8IDApCisJaWYgKGVyciA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybiBFUlJfUFRSKGVycik7CisJfQogCi0JcmV0dXJuIGhjaV9nZXRfY21kX2NvbXBsZXRlKGhkZXYsIG9wY29kZSwgZXZlbnQpOworCWlmICghc2tiKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PREFUQSk7CisKKwlyZXR1cm4gc2tiOwogfQogRVhQT1JUX1NZTUJPTChfX2hjaV9jbWRfc3luY19ldik7CiAKQEAgLTMwMyw3ICsyNTksNyBAQAogCWFkZF93YWl0X3F1ZXVlKCZoZGV2LT5yZXFfd2FpdF9xLCAmd2FpdCk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAotCWVyciA9IGhjaV9yZXFfcnVuKCZyZXEsIGhjaV9yZXFfc3luY19jb21wbGV0ZSk7CisJZXJyID0gaGNpX3JlcV9ydW5fc2tiKCZyZXEsIGhjaV9yZXFfc3luY19jb21wbGV0ZSk7CiAJaWYgKGVyciA8IDApIHsKIAkJaGRldi0+cmVxX3N0YXR1cyA9IDA7CiAKQEAgLTM5MCw3ICszNDYsNyBAQAogCWhjaV9yZXFfYWRkKHJlcSwgSENJX09QX1JFQURfQkRfQUREUiwgMCwgTlVMTCk7CiB9CiAKLXN0YXRpYyB2b2lkIGFtcF9pbml0KHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxKQorc3RhdGljIHZvaWQgYW1wX2luaXQxKHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxKQogewogCXJlcS0+aGRldi0+Zmxvd19jdGxfbW9kZSA9IEhDSV9GTE9XX0NUTF9NT0RFX0JMT0NLX0JBU0VEOwogCkBAIC00MDAsOSArMzU2LDYgQEAKIAkvKiBSZWFkIExvY2FsIFN1cHBvcnRlZCBDb21tYW5kcyAqLwogCWhjaV9yZXFfYWRkKHJlcSwgSENJX09QX1JFQURfTE9DQUxfQ09NTUFORFMsIDAsIE5VTEwpOwogCi0JLyogUmVhZCBMb2NhbCBTdXBwb3J0ZWQgRmVhdHVyZXMgKi8KLQloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9SRUFEX0xPQ0FMX0ZFQVRVUkVTLCAwLCBOVUxMKTsKLQogCS8qIFJlYWQgTG9jYWwgQU1QIEluZm8gKi8KIAloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9SRUFEX0xPQ0FMX0FNUF9JTkZPLCAwLCBOVUxMKTsKIApAQCAtNDE2LDYgKzM2OSwxNiBAQAogCWhjaV9yZXFfYWRkKHJlcSwgSENJX09QX1JFQURfTE9DQVRJT05fREFUQSwgMCwgTlVMTCk7CiB9CiAKK3N0YXRpYyB2b2lkIGFtcF9pbml0MihzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSkKK3sKKwkvKiBSZWFkIExvY2FsIFN1cHBvcnRlZCBGZWF0dXJlcy4gTm90IGFsbCBBTVAgY29udHJvbGxlcnMKKwkgKiBzdXBwb3J0IHRoaXMgc28gaXQncyBwbGFjZWQgY29uZGl0aW9uYWxseSBpbiB0aGUgc2Vjb25kCisJICogc3RhZ2UgaW5pdC4KKwkgKi8KKwlpZiAocmVxLT5oZGV2LT5jb21tYW5kc1sxNF0gJiAweDIwKQorCQloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9SRUFEX0xPQ0FMX0ZFQVRVUkVTLCAwLCBOVUxMKTsKK30KKwogc3RhdGljIHZvaWQgaGNpX2luaXQxX3JlcShzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSwgdW5zaWduZWQgbG9uZyBvcHQpCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSByZXEtPmhkZXY7CkBAIC00MzIsNyArMzk1LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEhDSV9BTVA6Ci0JCWFtcF9pbml0KHJlcSk7CisJCWFtcF9pbml0MShyZXEpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC00OTQsNyArNDU3LDcgQEAKIAogCS8qIExFLW9ubHkgY29udHJvbGxlcnMgaGF2ZSBMRSBpbXBsaWNpdGx5IGVuYWJsZWQgKi8KIAlpZiAoIWxtcF9icmVkcl9jYXBhYmxlKGhkZXYpKQotCQlzZXRfYml0KEhDSV9MRV9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfTEVfRU5BQkxFRCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhjaV9zZXR1cF9ldmVudF9tYXNrKHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxKQpAQCAtNTc4LDEwICs1NDEsMTMgQEAKIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IHJlcS0+aGRldjsKIAorCWlmIChoZGV2LT5kZXZfdHlwZSA9PSBIQ0lfQU1QKQorCQlyZXR1cm4gYW1wX2luaXQyKHJlcSk7CisKIAlpZiAobG1wX2JyZWRyX2NhcGFibGUoaGRldikpCiAJCWJyZWRyX3NldHVwKHJlcSk7CiAJZWxzZQotCQljbGVhcl9iaXQoSENJX0JSRURSX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpOworCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpOwogCiAJaWYgKGxtcF9sZV9jYXBhYmxlKGhkZXYpKQogCQlsZV9zZXR1cChyZXEpOwpAQCAtNjA3LDcgKzU3Myw3IEBACiAJCSAqLwogCQloZGV2LT5tYXhfcGFnZSA9IDB4MDE7CiAKLQkJaWYgKHRlc3RfYml0KEhDSV9TU1BfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TU1BfRU5BQkxFRCkpIHsKIAkJCXU4IG1vZGUgPSAweDAxOwogCiAJCQloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9XUklURV9TU1BfTU9ERSwKQEAgLTY0Niw3ICs2MTIsNyBAQAogCQkJICAgIHNpemVvZihjcCksICZjcCk7CiAJfQogCi0JaWYgKHRlc3RfYml0KEhDSV9MSU5LX1NFQ1VSSVRZLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTElOS19TRUNVUklUWSkpIHsKIAkJdTggZW5hYmxlID0gMTsKIAkJaGNpX3JlcV9hZGQocmVxLCBIQ0lfT1BfV1JJVEVfQVVUSF9FTkFCTEUsIHNpemVvZihlbmFibGUpLAogCQkJICAgICZlbmFibGUpOwpAQCAtNjgzLDcgKzY0OSw3IEBACiAKIAltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKIAotCWlmICh0ZXN0X2JpdChIQ0lfTEVfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0VOQUJMRUQpKSB7CiAJCWNwLmxlID0gMHgwMTsKIAkJY3Auc2ltdWwgPSAweDAwOwogCX0KQEAgLTg3MSw3ICs4MzcsNyBAQAogCQloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9SRUFEX1NZTkNfVFJBSU5fUEFSQU1TLCAwLCBOVUxMKTsKIAogCS8qIEVuYWJsZSBTZWN1cmUgQ29ubmVjdGlvbnMgaWYgc3VwcG9ydGVkIGFuZCBjb25maWd1cmVkICovCi0JaWYgKHRlc3RfYml0KEhDSV9TU1BfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykgJiYKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NTUF9FTkFCTEVEKSAmJgogCSAgICBicmVkcl9zY19lbmFibGVkKGhkZXYpKSB7CiAJCXU4IHN1cHBvcnQgPSAweDAxOwogCkBAIC04OTEsMjIgKzg1NywyMiBAQAogCS8qIFRoZSBEZXZpY2UgVW5kZXIgVGVzdCAoRFVUKSBtb2RlIGlzIHNwZWNpYWwgYW5kIGF2YWlsYWJsZSBmb3IKIAkgKiBhbGwgY29udHJvbGxlciB0eXBlcy4gU28ganVzdCBjcmVhdGUgaXQgZWFybHkgb24uCiAJICovCi0JaWYgKHRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NFVFVQKSkgewogCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJkdXRfbW9kZSIsIDA2NDQsIGhkZXYtPmRlYnVnZnMsIGhkZXYsCiAJCQkJICAgICZkdXRfbW9kZV9mb3BzKTsKIAl9CiAKLQkvKiBIQ0lfQlJFRFIgY292ZXJzIGJvdGggc2luZ2xlLW1vZGUgTEUsIEJSL0VEUiBhbmQgZHVhbC1tb2RlCi0JICogQlIvRURSL0xFIHR5cGUgY29udHJvbGxlcnMuIEFNUCBjb250cm9sbGVycyBvbmx5IG5lZWQgdGhlCi0JICogZmlyc3Qgc3RhZ2UgaW5pdC4KLQkgKi8KLQlpZiAoaGRldi0+ZGV2X3R5cGUgIT0gSENJX0JSRURSKQotCQlyZXR1cm4gMDsKLQogCWVyciA9IF9faGNpX3JlcV9zeW5jKGhkZXYsIGhjaV9pbml0Ml9yZXEsIDAsIEhDSV9JTklUX1RJTUVPVVQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJLyogSENJX0JSRURSIGNvdmVycyBib3RoIHNpbmdsZS1tb2RlIExFLCBCUi9FRFIgYW5kIGR1YWwtbW9kZQorCSAqIEJSL0VEUi9MRSB0eXBlIGNvbnRyb2xsZXJzLiBBTVAgY29udHJvbGxlcnMgb25seSBuZWVkIHRoZQorCSAqIGZpcnN0IHR3byBzdGFnZXMgb2YgaW5pdC4KKwkgKi8KKwlpZiAoaGRldi0+ZGV2X3R5cGUgIT0gSENJX0JSRURSKQorCQlyZXR1cm4gMDsKKwogCWVyciA9IF9faGNpX3JlcV9zeW5jKGhkZXYsIGhjaV9pbml0M19yZXEsIDAsIEhDSV9JTklUX1RJTUVPVVQpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtOTI3LDggKzg5Myw4IEBACiAJICogU28gb25seSB3aGVuIGluIHNldHVwIHBoYXNlIG9yIGNvbmZpZyBwaGFzZSwgY3JlYXRlIHRoZSBkZWJ1Z2ZzCiAJICogZW50cmllcyBhbmQgcmVnaXN0ZXIgdGhlIFNNUCBjaGFubmVscy4KIAkgKi8KLQlpZiAoIXRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmRldl9mbGFncykgJiYKLQkgICAgIXRlc3RfYml0KEhDSV9DT05GSUcsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NFVFVQKSAmJgorCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0NPTkZJRykpCiAJCXJldHVybiAwOwogCiAJaGNpX2RlYnVnZnNfY3JlYXRlX2NvbW1vbihoZGV2KTsKQEAgLTEyOTAsMTIgKzEyNTYsMTIgQEAKIAlpZiAoIWhkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHRlc3RfYml0KEhDSV9VU0VSX0NIQU5ORUwsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VU0VSX0NIQU5ORUwpKSB7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBkb25lOwogCX0KIAotCWlmICh0ZXN0X2JpdChIQ0lfVU5DT05GSUdVUkVELCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVU5DT05GSUdVUkVEKSkgewogCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBkb25lOwogCX0KQEAgLTEzMDUsNyArMTI3MSw3IEBACiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAoIXRlc3RfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpKSB7CiAJCWVyciA9IC1FT1BOT1RTVVBQOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtMTM3NywxNyArMTM0MywxNyBAQAogCiAJaGNpX3JlcV9sb2NrKGhkZXYpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9VTlJFR0lTVEVSLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVU5SRUdJU1RFUikpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBkb25lOwogCX0KIAotCWlmICghdGVzdF9iaXQoSENJX1NFVFVQLCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgotCSAgICAhdGVzdF9iaXQoSENJX0NPTkZJRywgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TRVRVUCkgJiYKKwkgICAgIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9DT05GSUcpKSB7CiAJCS8qIENoZWNrIGZvciByZmtpbGwgYnV0IGFsbG93IHRoZSBIQ0kgc2V0dXAgc3RhZ2UgdG8KIAkJICogcHJvY2VlZCAod2hpY2ggaW4gaXRzZWxmIGRvZXNuJ3QgY2F1c2UgYW55IFJGIGFjdGl2aXR5KS4KIAkJICovCi0JCWlmICh0ZXN0X2JpdChIQ0lfUkZLSUxMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfUkZLSUxMRUQpKSB7CiAJCQlyZXQgPSAtRVJGS0lMTDsKIAkJCWdvdG8gZG9uZTsKIAkJfQpAQCAtMTQwNCw3ICsxMzcwLDcgQEAKIAkJICogVGhpcyBjaGVjayBpcyBvbmx5IHZhbGlkIGZvciBCUi9FRFIgY29udHJvbGxlcnMKIAkJICogc2luY2UgQU1QIGNvbnRyb2xsZXJzIGRvIG5vdCBoYXZlIGFuIGFkZHJlc3MuCiAJCSAqLwotCQlpZiAoIXRlc3RfYml0KEhDSV9VU0VSX0NIQU5ORUwsICZoZGV2LT5kZXZfZmxhZ3MpICYmCisJCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1VTRVJfQ0hBTk5FTCkgJiYKIAkJICAgIGhkZXYtPmRldl90eXBlID09IEhDSV9CUkVEUiAmJgogCQkgICAgIWJhY21wKCZoZGV2LT5iZGFkZHIsIEJEQUREUl9BTlkpICYmCiAJCSAgICAhYmFjbXAoJmhkZXYtPnN0YXRpY19hZGRyLCBCREFERFJfQU5ZKSkgewpAQCAtMTQyNiw3ICsxMzkyLDcgQEAKIAlhdG9taWNfc2V0KCZoZGV2LT5jbWRfY250LCAxKTsKIAlzZXRfYml0KEhDSV9JTklULCAmaGRldi0+ZmxhZ3MpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NFVFVQKSkgewogCQlpZiAoaGRldi0+c2V0dXApCiAJCQlyZXQgPSBoZGV2LT5zZXR1cChoZGV2KTsKIApAQCAtMTQzOCw3ICsxNDA0LDcgQEAKIAkJICovCiAJCWlmICh0ZXN0X2JpdChIQ0lfUVVJUktfRVhURVJOQUxfQ09ORklHLCAmaGRldi0+cXVpcmtzKSB8fAogCQkgICAgdGVzdF9iaXQoSENJX1FVSVJLX0lOVkFMSURfQkRBRERSLCAmaGRldi0+cXVpcmtzKSkKLQkJCXNldF9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncyk7CisJCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9VTkNPTkZJR1VSRUQpOwogCiAJCS8qIEZvciBhbiB1bmNvbmZpZ3VyZWQgY29udHJvbGxlciBpdCBpcyByZXF1aXJlZCB0bwogCQkgKiByZWFkIGF0IGxlYXN0IHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5CkBAIC0xNDQ4LDExICsxNDE0LDExIEBACiAJCSAqIGFsc28gdGhlIG9yaWdpbmFsIEJsdWV0b290aCBwdWJsaWMgZGV2aWNlIGFkZHJlc3MKIAkJICogd2lsbCBiZSByZWFkIHVzaW5nIHRoZSBSZWFkIEJEIEFkZHJlc3MgY29tbWFuZC4KIAkJICovCi0JCWlmICh0ZXN0X2JpdChIQ0lfVU5DT05GSUdVUkVELCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VTkNPTkZJR1VSRUQpKQogCQkJcmV0ID0gX19oY2lfdW5jb25mX2luaXQoaGRldik7CiAJfQogCi0JaWYgKHRlc3RfYml0KEhDSV9DT05GSUcsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9DT05GSUcpKSB7CiAJCS8qIElmIHB1YmxpYyBhZGRyZXNzIGNoYW5nZSBpcyBjb25maWd1cmVkLCBlbnN1cmUgdGhhdAogCQkgKiB0aGUgYWRkcmVzcyBnZXRzIHByb2dyYW1tZWQuIElmIHRoZSBkcml2ZXIgZG9lcyBub3QKIAkJICogc3VwcG9ydCBjaGFuZ2luZyB0aGUgcHVibGljIGFkZHJlc3MsIGZhaWwgdGhlIHBvd2VyCkBAIC0xNDY2LDggKzE0MzIsOCBAQAogCX0KIAogCWlmICghcmV0KSB7Ci0JCWlmICghdGVzdF9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncykgJiYKLQkJICAgICF0ZXN0X2JpdChIQ0lfVVNFUl9DSEFOTkVMLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwkJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVU5DT05GSUdVUkVEKSAmJgorCQkgICAgIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VU0VSX0NIQU5ORUwpKQogCQkJcmV0ID0gX19oY2lfaW5pdChoZGV2KTsKIAl9CiAKQEAgLTE0NzUsMTMgKzE0NDEsMTMgQEAKIAogCWlmICghcmV0KSB7CiAJCWhjaV9kZXZfaG9sZChoZGV2KTsKLQkJc2V0X2JpdChIQ0lfUlBBX0VYUElSRUQsICZoZGV2LT5kZXZfZmxhZ3MpOworCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9SUEFfRVhQSVJFRCk7CiAJCXNldF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpOwogCQloY2lfbm90aWZ5KGhkZXYsIEhDSV9ERVZfVVApOwotCQlpZiAoIXRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmRldl9mbGFncykgJiYKLQkJICAgICF0ZXN0X2JpdChIQ0lfQ09ORklHLCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgotCQkgICAgIXRlc3RfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZoZGV2LT5kZXZfZmxhZ3MpICYmCi0JCSAgICAhdGVzdF9iaXQoSENJX1VTRVJfQ0hBTk5FTCwgJmhkZXYtPmRldl9mbGFncykgJiYKKwkJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU0VUVVApICYmCisJCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0NPTkZJRykgJiYKKwkJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVU5DT05GSUdVUkVEKSAmJgorCQkgICAgIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VU0VSX0NIQU5ORUwpICYmCiAJCSAgICBoZGV2LT5kZXZfdHlwZSA9PSBIQ0lfQlJFRFIpIHsKIAkJCWhjaV9kZXZfbG9jayhoZGV2KTsKIAkJCW1nbXRfcG93ZXJlZChoZGV2LCAxKTsKQEAgLTE1MzMsOCArMTQ5OSw4IEBACiAJICogSENJX1VTRVJfQ0hBTk5FTCB3aWxsIGJlIHNldCBmaXJzdCBiZWZvcmUgYXR0ZW1wdGluZyB0bwogCSAqIG9wZW4gdGhlIGRldmljZS4KIAkgKi8KLQlpZiAodGVzdF9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncykgJiYKLQkgICAgIXRlc3RfYml0KEhDSV9VU0VSX0NIQU5ORUwsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VTkNPTkZJR1VSRUQpICYmCisJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVVNFUl9DSEFOTkVMKSkgewogCQllcnIgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBkb25lOwogCX0KQEAgLTE1NDQsNyArMTUxMCw3IEBACiAJICogcGFydGljdWxhcmx5IGltcG9ydGFudCBpZiB0aGUgc2V0dXAgcHJvY2VkdXJlIGhhcyBub3QgeWV0CiAJICogY29tcGxldGVkLgogCSAqLwotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0FVVE9fT0ZGLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsIEhDSV9BVVRPX09GRikpCiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmhkZXYtPnBvd2VyX29mZik7CiAKIAkvKiBBZnRlciB0aGlzIGNhbGwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IHRoZSBzZXR1cCBwcm9jZWR1cmUKQEAgLTE1NTksOSArMTUyNSw5IEBACiAJICogaXMgaW4gdXNlIHRoaXMgYml0IHdpbGwgYmUgY2xlYXJlZCBhZ2FpbiBhbmQgdXNlcnNwYWNlIGhhcwogCSAqIHRvIGV4cGxpY2l0bHkgZW5hYmxlIGl0LgogCSAqLwotCWlmICghdGVzdF9iaXQoSENJX1VTRVJfQ0hBTk5FTCwgJmhkZXYtPmRldl9mbGFncykgJiYKLQkgICAgIXRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZGV2X2ZsYWdzKSkKLQkJc2V0X2JpdChIQ0lfQk9OREFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpOworCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1VTRVJfQ0hBTk5FTCkgJiYKKwkgICAgIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9NR01UKSkKKwkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfQk9OREFCTEUpOwogCiAJZXJyID0gaGNpX2Rldl9kb19vcGVuKGhkZXYpOwogCkBAIC0xNTkxLDYgKzE1NTcsMTIgQEAKIHsKIAlCVF9EQkcoIiVzICVwIiwgaGRldi0+bmFtZSwgaGRldik7CiAKKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VTlJFR0lTVEVSKSkgeworCQkvKiBFeGVjdXRlIHZlbmRvciBzcGVjaWZpYyBzaHV0ZG93biByb3V0aW5lICovCisJCWlmIChoZGV2LT5zaHV0ZG93bikKKwkJCWhkZXYtPnNodXRkb3duKGhkZXYpOworCX0KKwogCWNhbmNlbF9kZWxheWVkX3dvcmsoJmhkZXYtPnBvd2VyX29mZik7CiAKIAloY2lfcmVxX2NhbmNlbChoZGV2LCBFTk9ERVYpOwpAQCAtMTYwOSwxNyArMTU4MSwxNyBAQAogCWlmIChoZGV2LT5kaXNjb3ZfdGltZW91dCA+IDApIHsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaGRldi0+ZGlzY292X29mZik7CiAJCWhkZXYtPmRpc2Nvdl90aW1lb3V0ID0gMDsKLQkJY2xlYXJfYml0KEhDSV9ESVNDT1ZFUkFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpOwotCQljbGVhcl9iaXQoSENJX0xJTUlURURfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9ESVNDT1ZFUkFCTEUpOworCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX0xJTUlURURfRElTQ09WRVJBQkxFKTsKIAl9CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9TRVJWSUNFX0NBQ0hFLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsIEhDSV9TRVJWSUNFX0NBQ0hFKSkKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaGRldi0+c2VydmljZV9jYWNoZSk7CiAKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmhkZXYtPmxlX3NjYW5fZGlzYWJsZSk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZoZGV2LT5sZV9zY2FuX3Jlc3RhcnQpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpKQogCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmhkZXYtPnJwYV9leHBpcmVkKTsKIAogCS8qIEF2b2lkIHBvdGVudGlhbCBsb2NrZGVwIHdhcm5pbmdzIGZyb20gdGhlICpfZmx1c2goKSBjYWxscyBieQpAQCAtMTYzMSw3ICsxNjAzLDcgQEAKIAogCWhjaV9kaXNjb3Zlcnlfc2V0X3N0YXRlKGhkZXYsIERJU0NPVkVSWV9TVE9QUEVEKTsKIAotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoIWhjaV9kZXZfdGVzdF9hbmRfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfQVVUT19PRkYpKSB7CiAJCWlmIChoZGV2LT5kZXZfdHlwZSA9PSBIQ0lfQlJFRFIpCiAJCQltZ210X3Bvd2VyZWQoaGRldiwgMCk7CiAJfQpAQCAtMTY1MSw4ICsxNjIzLDggQEAKIAkvKiBSZXNldCBkZXZpY2UgKi8KIAlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPmNtZF9xKTsKIAlhdG9taWNfc2V0KCZoZGV2LT5jbWRfY250LCAxKTsKLQlpZiAoIXRlc3RfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmRldl9mbGFncykgJiYKLQkgICAgIXRlc3RfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZoZGV2LT5kZXZfZmxhZ3MpICYmCisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQVVUT19PRkYpICYmCisJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVU5DT05GSUdVUkVEKSAmJgogCSAgICB0ZXN0X2JpdChIQ0lfUVVJUktfUkVTRVRfT05fQ0xPU0UsICZoZGV2LT5xdWlya3MpKSB7CiAJCXNldF9iaXQoSENJX0lOSVQsICZoZGV2LT5mbGFncyk7CiAJCV9faGNpX3JlcV9zeW5jKGhkZXYsIGhjaV9yZXNldF9yZXEsIDAsIEhDSV9DTURfVElNRU9VVCk7CkBAIC0xNjc0LDE2ICsxNjQ2LDEzIEBACiAJCWhkZXYtPnNlbnRfY21kID0gTlVMTDsKIAl9CiAKLQlrZnJlZV9za2IoaGRldi0+cmVjdl9ldnQpOwotCWhkZXYtPnJlY3ZfZXZ0ID0gTlVMTDsKLQogCS8qIEFmdGVyIHRoaXMgcG9pbnQgb3VyIHF1ZXVlcyBhcmUgZW1wdHkKIAkgKiBhbmQgbm8gdGFza3MgYXJlIHNjaGVkdWxlZC4gKi8KIAloZGV2LT5jbG9zZShoZGV2KTsKIAogCS8qIENsZWFyIGZsYWdzICovCiAJaGRldi0+ZmxhZ3MgJj0gQklUKEhDSV9SQVcpOwotCWhkZXYtPmRldl9mbGFncyAmPSB+SENJX1BFUlNJU1RFTlRfTUFTSzsKKwloY2lfZGV2X2NsZWFyX3ZvbGF0aWxlX2ZsYWdzKGhkZXYpOwogCiAJLyogQ29udHJvbGxlciByYWRpbyBpcyBhdmFpbGFibGUgYnV0IGlzIGN1cnJlbnRseSBwb3dlcmVkIGRvd24gKi8KIAloZGV2LT5hbXBfc3RhdHVzID0gQU1QX1NUQVRVU19QT1dFUkVEX0RPV047CkBAIC0xNzA3LDEyICsxNjc2LDEyIEBACiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICh0ZXN0X2JpdChIQ0lfVVNFUl9DSEFOTkVMLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVVNFUl9DSEFOTkVMKSkgewogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9hbmRfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfQVVUT19PRkYpKQogCQljYW5jZWxfZGVsYXllZF93b3JrKCZoZGV2LT5wb3dlcl9vZmYpOwogCiAJZXJyID0gaGNpX2Rldl9kb19jbG9zZShoZGV2KTsKQEAgLTE3NzAsMTIgKzE3MzksMTIgQEAKIAkJZ290byBkb25lOwogCX0KIAotCWlmICh0ZXN0X2JpdChIQ0lfVVNFUl9DSEFOTkVMLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVVNFUl9DSEFOTkVMKSkgewogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAodGVzdF9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1VOQ09ORklHVVJFRCkpIHsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC0xNzk2LDEyICsxNzY1LDEyIEBACiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICh0ZXN0X2JpdChIQ0lfVVNFUl9DSEFOTkVMLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVVNFUl9DSEFOTkVMKSkgewogCQlyZXQgPSAtRUJVU1k7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAodGVzdF9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1VOQ09ORklHVVJFRCkpIHsKIAkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC0xODIwLDI5ICsxNzg5LDI5IEBACiAJQlRfREJHKCIlcyBzY2FuIDB4JTAyeCIsIGhkZXYtPm5hbWUsIHNjYW4pOwogCiAJaWYgKChzY2FuICYgU0NBTl9QQUdFKSkKLQkJY29ubl9jaGFuZ2VkID0gIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5FQ1RBQkxFLAotCQkJCQkJICZoZGV2LT5kZXZfZmxhZ3MpOworCQljb25uX2NoYW5nZWQgPSAhaGNpX2Rldl90ZXN0X2FuZF9zZXRfZmxhZyhoZGV2LAorCQkJCQkJCSAgSENJX0NPTk5FQ1RBQkxFKTsKIAllbHNlCi0JCWNvbm5fY2hhbmdlZCA9IHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfQ09OTkVDVEFCTEUsCi0JCQkJCQkgICZoZGV2LT5kZXZfZmxhZ3MpOworCQljb25uX2NoYW5nZWQgPSBoY2lfZGV2X3Rlc3RfYW5kX2NsZWFyX2ZsYWcoaGRldiwKKwkJCQkJCQkgICBIQ0lfQ09OTkVDVEFCTEUpOwogCiAJaWYgKChzY2FuICYgU0NBTl9JTlFVSVJZKSkgewotCQlkaXNjb3ZfY2hhbmdlZCA9ICF0ZXN0X2FuZF9zZXRfYml0KEhDSV9ESVNDT1ZFUkFCTEUsCi0JCQkJCQkgICAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJZGlzY292X2NoYW5nZWQgPSAhaGNpX2Rldl90ZXN0X2FuZF9zZXRfZmxhZyhoZGV2LAorCQkJCQkJCSAgICBIQ0lfRElTQ09WRVJBQkxFKTsKIAl9IGVsc2UgewotCQljbGVhcl9iaXQoSENJX0xJTUlURURfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKLQkJZGlzY292X2NoYW5nZWQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0RJU0NPVkVSQUJMRSwKLQkJCQkJCSAgICAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9MSU1JVEVEX0RJU0NPVkVSQUJMRSk7CisJCWRpc2Nvdl9jaGFuZ2VkID0gaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsCisJCQkJCQkJICAgICBIQ0lfRElTQ09WRVJBQkxFKTsKIAl9CiAKLQlpZiAoIXRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9NR01UKSkKIAkJcmV0dXJuOwogCiAJaWYgKGNvbm5fY2hhbmdlZCB8fCBkaXNjb3ZfY2hhbmdlZCkgewogCQkvKiBJbiBjYXNlIHRoaXMgd2FzIGRpc2FibGVkIHRocm91Z2ggbWdtdCAqLwotCQlzZXRfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCk7CiAKLQkJaWYgKHRlc3RfYml0KEhDSV9MRV9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9FTkFCTEVEKSkKIAkJCW1nbXRfdXBkYXRlX2Fkdl9kYXRhKGhkZXYpOwogCiAJCW1nbXRfbmV3X3NldHRpbmdzKGhkZXYpOwpAQCAtMTg2MiwxMiArMTgzMSwxMiBAQAogCWlmICghaGRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAodGVzdF9iaXQoSENJX1VTRVJfQ0hBTk5FTCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1VTRVJfQ0hBTk5FTCkpIHsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIGRvbmU7CiAJfQogCi0JaWYgKHRlc3RfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VTkNPTkZJR1VSRUQpKSB7CiAJCWVyciA9IC1FT1BOT1RTVVBQOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtMTg3Nyw3ICsxODQ2LDcgQEAKIAkJZ290byBkb25lOwogCX0KIAotCWlmICghdGVzdF9iaXQoSENJX0JSRURSX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCkpIHsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC0xOTgxLDcgKzE5NTAsNyBAQAogCQkgKiBpcyBydW5uaW5nLCBidXQgaW4gdGhhdCBjYXNlIHN0aWxsIGluZGljYXRlIHRoYXQgdGhlCiAJCSAqIGRldmljZSBpcyBhY3R1YWxseSBkb3duLgogCQkgKi8KLQkJaWYgKHRlc3RfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmRldl9mbGFncykpCisJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQVVUT19PRkYpKQogCQkJZmxhZ3MgJj0gfkJJVChIQ0lfVVApOwogCiAJCShkciArIG4pLT5kZXZfaWQgID0gaGRldi0+aWQ7CkBAIC0yMDE5LDcgKzE5ODgsNyBAQAogCSAqIGlzIHJ1bm5pbmcsIGJ1dCBpbiB0aGF0IGNhc2Ugc3RpbGwgaW5kaWNhdGUgdGhhdCB0aGUKIAkgKiBkZXZpY2UgaXMgYWN0dWFsbHkgZG93bi4KIAkgKi8KLQlpZiAodGVzdF9iaXQoSENJX0FVVE9fT0ZGLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0FVVE9fT0ZGKSkKIAkJZmxhZ3MgPSBoZGV2LT5mbGFncyAmIH5CSVQoSENJX1VQKTsKIAllbHNlCiAJCWZsYWdzID0gaGRldi0+ZmxhZ3M7CkBAIC0yMDYyLDE2ICsyMDMxLDE2IEBACiAKIAlCVF9EQkcoIiVwIG5hbWUgJXMgYmxvY2tlZCAlZCIsIGhkZXYsIGhkZXYtPm5hbWUsIGJsb2NrZWQpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9VU0VSX0NIQU5ORUwsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVVNFUl9DSEFOTkVMKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCWlmIChibG9ja2VkKSB7Ci0JCXNldF9iaXQoSENJX1JGS0lMTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKLQkJaWYgKCF0ZXN0X2JpdChIQ0lfU0VUVVAsICZoZGV2LT5kZXZfZmxhZ3MpICYmCi0JCSAgICAhdGVzdF9iaXQoSENJX0NPTkZJRywgJmhkZXYtPmRldl9mbGFncykpCisJCWhjaV9kZXZfc2V0X2ZsYWcoaGRldiwgSENJX1JGS0lMTEVEKTsKKwkJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU0VUVVApICYmCisJCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0NPTkZJRykpCiAJCQloY2lfZGV2X2RvX2Nsb3NlKGhkZXYpOwogCX0gZWxzZSB7Ci0JCWNsZWFyX2JpdChIQ0lfUkZLSUxMRUQsICZoZGV2LT5kZXZfZmxhZ3MpOworCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX1JGS0lMTEVEKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTIxMDAsMjMgKzIwNjksMjMgQEAKIAkgKiBpZ25vcmVkIGFuZCB0aGV5IG5lZWQgdG8gYmUgY2hlY2tlZCBub3cuIElmIHRoZXkgYXJlIHN0aWxsCiAJICogdmFsaWQsIGl0IGlzIGltcG9ydGFudCB0byB0dXJuIHRoZSBkZXZpY2UgYmFjayBvZmYuCiAJICovCi0JaWYgKHRlc3RfYml0KEhDSV9SRktJTExFRCwgJmhkZXYtPmRldl9mbGFncykgfHwKLQkgICAgdGVzdF9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncykgfHwKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1JGS0lMTEVEKSB8fAorCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVU5DT05GSUdVUkVEKSB8fAogCSAgICAoaGRldi0+ZGV2X3R5cGUgPT0gSENJX0JSRURSICYmCiAJICAgICAhYmFjbXAoJmhkZXYtPmJkYWRkciwgQkRBRERSX0FOWSkgJiYKIAkgICAgICFiYWNtcCgmaGRldi0+c3RhdGljX2FkZHIsIEJEQUREUl9BTlkpKSkgewotCQljbGVhcl9iaXQoSENJX0FVVE9fT0ZGLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9BVVRPX09GRik7CiAJCWhjaV9kZXZfZG9fY2xvc2UoaGRldik7Ci0JfSBlbHNlIGlmICh0ZXN0X2JpdChIQ0lfQVVUT19PRkYsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJfSBlbHNlIGlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQVVUT19PRkYpKSB7CiAJCXF1ZXVlX2RlbGF5ZWRfd29yayhoZGV2LT5yZXFfd29ya3F1ZXVlLCAmaGRldi0+cG93ZXJfb2ZmLAogCQkJCSAgIEhDSV9BVVRPX09GRl9USU1FT1VUKTsKIAl9CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsIEhDSV9TRVRVUCkpIHsKIAkJLyogRm9yIHVuY29uZmlndXJlZCBkZXZpY2VzLCBzZXQgdGhlIEhDSV9SQVcgZmxhZwogCQkgKiBzbyB0aGF0IHVzZXJzcGFjZSBjYW4gZWFzaWx5IGlkZW50aWZ5IHRoZW0uCiAJCSAqLwotCQlpZiAodGVzdF9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncykpCisJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVU5DT05GSUdVUkVEKSkKIAkJCXNldF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKTsKIAogCQkvKiBGb3IgZnVsbHkgY29uZmlndXJlZCBkZXZpY2VzLCB0aGlzIHdpbGwgc2VuZApAQCAtMjEyNywxMSArMjA5NiwxMSBAQAogCQkgKiBhbmQgbm8gZXZlbnQgd2lsbCBiZSBzZW5kLgogCQkgKi8KIAkJbWdtdF9pbmRleF9hZGRlZChoZGV2KTsKLQl9IGVsc2UgaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfQ09ORklHLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCX0gZWxzZSBpZiAoaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsIEhDSV9DT05GSUcpKSB7CiAJCS8qIFdoZW4gdGhlIGNvbnRyb2xsZXIgaXMgbm93IGNvbmZpZ3VyZWQsIHRoZW4gaXQKIAkJICogaXMgaW1wb3J0YW50IHRvIGNsZWFyIHRoZSBIQ0lfUkFXIGZsYWcuCiAJCSAqLwotCQlpZiAoIXRlc3RfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCQlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VTkNPTkZJR1VSRUQpKQogCQkJY2xlYXJfYml0KEhDSV9SQVcsICZoZGV2LT5mbGFncyk7CiAKIAkJLyogUG93ZXJpbmcgb24gdGhlIGNvbnRyb2xsZXIgd2l0aCBIQ0lfQ09ORklHIHNldCBvbmx5CkBAIC0yNTAwLDYgKzI0NjksNDIgQEAKIAl9CiB9CiAKK2Jvb2wgaGNpX2JkYWRkcl9pc19wYWlyZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHR5cGUpCit7CisJc3RydWN0IHNtcF9sdGsgKms7CisJc3RydWN0IHNtcF9pcmsgKmlyazsKKwl1OCBhZGRyX3R5cGU7CisKKwlpZiAodHlwZSA9PSBCREFERFJfQlJFRFIpIHsKKwkJaWYgKGhjaV9maW5kX2xpbmtfa2V5KGhkZXYsIGJkYWRkcikpCisJCQlyZXR1cm4gdHJ1ZTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIENvbnZlcnQgdG8gSENJIGFkZHIgdHlwZSB3aGljaCBzdHJ1Y3Qgc21wX2x0ayB1c2VzICovCisJaWYgKHR5cGUgPT0gQkRBRERSX0xFX1BVQkxJQykKKwkJYWRkcl90eXBlID0gQUREUl9MRV9ERVZfUFVCTElDOworCWVsc2UKKwkJYWRkcl90eXBlID0gQUREUl9MRV9ERVZfUkFORE9NOworCisJaXJrID0gaGNpX2dldF9pcmsoaGRldiwgYmRhZGRyLCBhZGRyX3R5cGUpOworCWlmIChpcmspIHsKKwkJYmRhZGRyID0gJmlyay0+YmRhZGRyOworCQlhZGRyX3R5cGUgPSBpcmstPmFkZHJfdHlwZTsKKwl9CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoaywgJmhkZXYtPmxvbmdfdGVybV9rZXlzLCBsaXN0KSB7CisJCWlmIChrLT5iZGFkZHJfdHlwZSA9PSBhZGRyX3R5cGUgJiYgIWJhY21wKGJkYWRkciwgJmstPmJkYWRkcikpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qIEhDSSBjb21tYW5kIHRpbWVyIGZ1bmN0aW9uICovCiBzdGF0aWMgdm9pZCBoY2lfY21kX3RpbWVvdXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewpAQCAtMjgyMiw3ICsyODI3LDYgQEAKIHsKIAkvKiBHZW5lcmFsIGlucXVpcnkgYWNjZXNzIGNvZGUgKEdJQUMpICovCiAJdTggbGFwWzNdID0geyAweDMzLCAweDhiLCAweDllIH07Ci0Jc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKIAlzdHJ1Y3QgaGNpX2NwX2lucXVpcnkgY3A7CiAJaW50IGVycjsKIApAQCAtMjg0MSwyMSArMjg0NSwzNyBAQAogCQlicmVhazsKIAogCWNhc2UgRElTQ09WX1RZUEVfSU5URVJMRUFWRUQ6Ci0JCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKLQotCQltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKLQkJbWVtY3B5KCZjcC5sYXAsIGxhcCwgc2l6ZW9mKGNwLmxhcCkpOwotCQljcC5sZW5ndGggPSBESVNDT1ZfSU5URVJMRUFWRURfSU5RVUlSWV9MRU47Ci0JCWhjaV9yZXFfYWRkKCZyZXEsIEhDSV9PUF9JTlFVSVJZLCBzaXplb2YoY3ApLCAmY3ApOwotCiAJCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCQloY2lfaW5xdWlyeV9jYWNoZV9mbHVzaChoZGV2KTsKKwkJaWYgKHRlc3RfYml0KEhDSV9RVUlSS19TSU1VTFRBTkVPVVNfRElTQ09WRVJZLAorCQkJICAgICAmaGRldi0+cXVpcmtzKSkgeworCQkJLyogSWYgd2Ugd2VyZSBydW5uaW5nIExFIG9ubHkgc2NhbiwgY2hhbmdlIGRpc2NvdmVyeQorCQkJICogc3RhdGUuIElmIHdlIHdlcmUgcnVubmluZyBib3RoIExFIGFuZCBCUi9FRFIgaW5xdWlyeQorCQkJICogc2ltdWx0YW5lb3VzbHksIGFuZCBCUi9FRFIgaW5xdWlyeSBpcyBhbHJlYWR5CisJCQkgKiBmaW5pc2hlZCwgc3RvcCBkaXNjb3ZlcnksIG90aGVyd2lzZSBCUi9FRFIgaW5xdWlyeQorCQkJICogd2lsbCBzdG9wIGRpc2NvdmVyeSB3aGVuIGZpbmlzaGVkLgorCQkJICovCisJCQlpZiAoIXRlc3RfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpKQorCQkJCWhjaV9kaXNjb3Zlcnlfc2V0X3N0YXRlKGhkZXYsCisJCQkJCQkJRElTQ09WRVJZX1NUT1BQRUQpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKIAotCQllcnIgPSBoY2lfcmVxX3J1bigmcmVxLCBpbnF1aXJ5X2NvbXBsZXRlKTsKLQkJaWYgKGVycikgewotCQkJQlRfRVJSKCJJbnF1aXJ5IHJlcXVlc3QgZmFpbGVkOiBlcnIgJWQiLCBlcnIpOwotCQkJaGNpX2Rpc2NvdmVyeV9zZXRfc3RhdGUoaGRldiwgRElTQ09WRVJZX1NUT1BQRUQpOworCQkJaGNpX2lucXVpcnlfY2FjaGVfZmx1c2goaGRldik7CisKKwkJCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKKworCQkJbWVtc2V0KCZjcCwgMCwgc2l6ZW9mKGNwKSk7CisJCQltZW1jcHkoJmNwLmxhcCwgbGFwLCBzaXplb2YoY3AubGFwKSk7CisJCQljcC5sZW5ndGggPSBESVNDT1ZfSU5URVJMRUFWRURfSU5RVUlSWV9MRU47CisJCQloY2lfcmVxX2FkZCgmcmVxLCBIQ0lfT1BfSU5RVUlSWSwgc2l6ZW9mKGNwKSwgJmNwKTsKKworCQkJZXJyID0gaGNpX3JlcV9ydW4oJnJlcSwgaW5xdWlyeV9jb21wbGV0ZSk7CisJCQlpZiAoZXJyKSB7CisJCQkJQlRfRVJSKCJJbnF1aXJ5IHJlcXVlc3QgZmFpbGVkOiBlcnIgJWQiLCBlcnIpOworCQkJCWhjaV9kaXNjb3Zlcnlfc2V0X3N0YXRlKGhkZXYsCisJCQkJCQkJRElTQ09WRVJZX1NUT1BQRUQpOworCQkJfQogCQl9CiAKIAkJaGNpX2Rldl91bmxvY2soaGRldik7CkBAIC0yOTM0LDcgKzI5NTQsNyBAQAogCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKIAogCS8qIElmIGNvbnRyb2xsZXIgaXMgbm90IHNjYW5uaW5nIHdlIGFyZSBkb25lLiAqLwotCWlmICghdGVzdF9iaXQoSENJX0xFX1NDQU4sICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX1NDQU4pKQogCQlyZXR1cm47CiAKIAloY2lfcmVxX2luaXQoJnJlcSwgaGRldik7CkBAIC0yOTY3LDkgKzI5ODcsOSBAQAogdm9pZCBoY2lfY29weV9pZGVudGl0eV9hZGRyZXNzKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLAogCQkJICAgICAgIHU4ICpiZGFkZHJfdHlwZSkKIHsKLQlpZiAodGVzdF9iaXQoSENJX0ZPUkNFX1NUQVRJQ19BRERSLCAmaGRldi0+ZGJnX2ZsYWdzKSB8fAorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfRk9SQ0VfU1RBVElDX0FERFIpIHx8CiAJICAgICFiYWNtcCgmaGRldi0+YmRhZGRyLCBCREFERFJfQU5ZKSB8fAotCSAgICAoIXRlc3RfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgorCSAgICAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CUkVEUl9FTkFCTEVEKSAmJgogCSAgICAgYmFjbXAoJmhkZXYtPnN0YXRpY19hZGRyLCBCREFERFJfQU5ZKSkpIHsKIAkJYmFjcHkoYmRhZGRyLCAmaGRldi0+c3RhdGljX2FkZHIpOwogCQkqYmRhZGRyX3R5cGUgPSBBRERSX0xFX0RFVl9SQU5ET007CkBAIC0zMDU5LDYgKzMwNzksNyBAQAogCiAJaGNpX2luaXRfc3lzZnMoaGRldik7CiAJZGlzY292ZXJ5X2luaXQoaGRldik7CisJYWR2X2luZm9faW5pdChoZGV2KTsKIAogCXJldHVybiBoZGV2OwogfQpAQCAtMzEzNywxNiArMzE1OCwxNiBAQAogCX0KIAogCWlmIChoZGV2LT5yZmtpbGwgJiYgcmZraWxsX2Jsb2NrZWQoaGRldi0+cmZraWxsKSkKLQkJc2V0X2JpdChIQ0lfUkZLSUxMRUQsICZoZGV2LT5kZXZfZmxhZ3MpOworCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9SRktJTExFRCk7CiAKLQlzZXRfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmRldl9mbGFncyk7Ci0Jc2V0X2JpdChIQ0lfQVVUT19PRkYsICZoZGV2LT5kZXZfZmxhZ3MpOworCWhjaV9kZXZfc2V0X2ZsYWcoaGRldiwgSENJX1NFVFVQKTsKKwloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9BVVRPX09GRik7CiAKIAlpZiAoaGRldi0+ZGV2X3R5cGUgPT0gSENJX0JSRURSKSB7CiAJCS8qIEFzc3VtZSBCUi9FRFIgc3VwcG9ydCB1bnRpbCBwcm92ZW4gb3RoZXJ3aXNlIChzdWNoIGFzCiAJCSAqIHRocm91Z2ggcmVhZGluZyBzdXBwb3J0ZWQgZmVhdHVyZXMgZHVyaW5nIGluaXQuCiAJCSAqLwotCQlzZXRfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCk7CiAJfQogCiAJd3JpdGVfbG9jaygmaGNpX2Rldl9saXN0X2xvY2spOwpAQCAtMzE1Nyw3ICszMTc4LDcgQEAKIAkgKiBhbmQgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiBub3JtYWwgb3BlcmF0aW9uLgogCSAqLwogCWlmICh0ZXN0X2JpdChIQ0lfUVVJUktfUkFXX0RFVklDRSwgJmhkZXYtPnF1aXJrcykpCi0JCXNldF9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncyk7CisJCWhjaV9kZXZfc2V0X2ZsYWcoaGRldiwgSENJX1VOQ09ORklHVVJFRCk7CiAKIAloY2lfbm90aWZ5KGhkZXYsIEhDSV9ERVZfUkVHKTsKIAloY2lfZGV2X2hvbGQoaGRldik7CkBAIC0zMTc5LDExICszMjAwLDExIEBACiAvKiBVbnJlZ2lzdGVyIEhDSSBkZXZpY2UgKi8KIHZvaWQgaGNpX3VucmVnaXN0ZXJfZGV2KHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewotCWludCBpLCBpZDsKKwlpbnQgaWQ7CiAKIAlCVF9EQkcoIiVwIG5hbWUgJXMgYnVzICVkIiwgaGRldiwgaGRldi0+bmFtZSwgaGRldi0+YnVzKTsKIAotCXNldF9iaXQoSENJX1VOUkVHSVNURVIsICZoZGV2LT5kZXZfZmxhZ3MpOworCWhjaV9kZXZfc2V0X2ZsYWcoaGRldiwgSENJX1VOUkVHSVNURVIpOwogCiAJaWQgPSBoZGV2LT5pZDsKIApAQCAtMzE5MywxNCArMzIxNCwxMSBAQAogCiAJaGNpX2Rldl9kb19jbG9zZShoZGV2KTsKIAotCWZvciAoaSA9IDA7IGkgPCBOVU1fUkVBU1NFTUJMWTsgaSsrKQotCQlrZnJlZV9za2IoaGRldi0+cmVhc3NlbWJseVtpXSk7Ci0KIAljYW5jZWxfd29ya19zeW5jKCZoZGV2LT5wb3dlcl9vbik7CiAKIAlpZiAoIXRlc3RfYml0KEhDSV9JTklULCAmaGRldi0+ZmxhZ3MpICYmCi0JICAgICF0ZXN0X2JpdChIQ0lfU0VUVVAsICZoZGV2LT5kZXZfZmxhZ3MpICYmCi0JICAgICF0ZXN0X2JpdChIQ0lfQ09ORklHLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NFVFVQKSAmJgorCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0NPTkZJRykpIHsKIAkJaGNpX2Rldl9sb2NrKGhkZXYpOwogCQltZ210X2luZGV4X3JlbW92ZWQoaGRldik7CiAJCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwpAQCAtMzI5OSwxNTggKzMzMTcsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0woaGNpX3JlY3ZfZnJhbWUpOwogCi1zdGF0aWMgaW50IGhjaV9yZWFzc2VtYmx5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgdm9pZCAqZGF0YSwKLQkJCSAgaW50IGNvdW50LCBfX3U4IGluZGV4KQotewotCWludCBsZW4gPSAwOwotCWludCBobGVuID0gMDsKLQlpbnQgcmVtYWluID0gY291bnQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgYnRfc2tiX2NiICpzY2I7Ci0KLQlpZiAoKHR5cGUgPCBIQ0lfQUNMREFUQV9QS1QgfHwgdHlwZSA+IEhDSV9FVkVOVF9QS1QpIHx8Ci0JICAgIGluZGV4ID49IE5VTV9SRUFTU0VNQkxZKQotCQlyZXR1cm4gLUVJTFNFUTsKLQotCXNrYiA9IGhkZXYtPnJlYXNzZW1ibHlbaW5kZXhdOwotCi0JaWYgKCFza2IpIHsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCWNhc2UgSENJX0FDTERBVEFfUEtUOgotCQkJbGVuID0gSENJX01BWF9GUkFNRV9TSVpFOwotCQkJaGxlbiA9IEhDSV9BQ0xfSERSX1NJWkU7Ci0JCQlicmVhazsKLQkJY2FzZSBIQ0lfRVZFTlRfUEtUOgotCQkJbGVuID0gSENJX01BWF9FVkVOVF9TSVpFOwotCQkJaGxlbiA9IEhDSV9FVkVOVF9IRFJfU0laRTsKLQkJCWJyZWFrOwotCQljYXNlIEhDSV9TQ09EQVRBX1BLVDoKLQkJCWxlbiA9IEhDSV9NQVhfU0NPX1NJWkU7Ci0JCQlobGVuID0gSENJX1NDT19IRFJfU0laRTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc2tiID0gYnRfc2tiX2FsbG9jKGxlbiwgR0ZQX0FUT01JQyk7Ci0JCWlmICghc2tiKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJc2NiID0gKHZvaWQgKikgc2tiLT5jYjsKLQkJc2NiLT5leHBlY3QgPSBobGVuOwotCQlzY2ItPnBrdF90eXBlID0gdHlwZTsKLQotCQloZGV2LT5yZWFzc2VtYmx5W2luZGV4XSA9IHNrYjsKLQl9Ci0KLQl3aGlsZSAoY291bnQpIHsKLQkJc2NiID0gKHZvaWQgKikgc2tiLT5jYjsKLQkJbGVuID0gbWluX3QodWludCwgc2NiLT5leHBlY3QsIGNvdW50KTsKLQotCQltZW1jcHkoc2tiX3B1dChza2IsIGxlbiksIGRhdGEsIGxlbik7Ci0KLQkJY291bnQgLT0gbGVuOwotCQlkYXRhICs9IGxlbjsKLQkJc2NiLT5leHBlY3QgLT0gbGVuOwotCQlyZW1haW4gPSBjb3VudDsKLQotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJY2FzZSBIQ0lfRVZFTlRfUEtUOgotCQkJaWYgKHNrYi0+bGVuID09IEhDSV9FVkVOVF9IRFJfU0laRSkgewotCQkJCXN0cnVjdCBoY2lfZXZlbnRfaGRyICpoID0gaGNpX2V2ZW50X2hkcihza2IpOwotCQkJCXNjYi0+ZXhwZWN0ID0gaC0+cGxlbjsKLQotCQkJCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IHNjYi0+ZXhwZWN0KSB7Ci0JCQkJCWtmcmVlX3NrYihza2IpOwotCQkJCQloZGV2LT5yZWFzc2VtYmx5W2luZGV4XSA9IE5VTEw7Ci0JCQkJCXJldHVybiAtRU5PTUVNOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCi0JCWNhc2UgSENJX0FDTERBVEFfUEtUOgotCQkJaWYgKHNrYi0+bGVuICA9PSBIQ0lfQUNMX0hEUl9TSVpFKSB7Ci0JCQkJc3RydWN0IGhjaV9hY2xfaGRyICpoID0gaGNpX2FjbF9oZHIoc2tiKTsKLQkJCQlzY2ItPmV4cGVjdCA9IF9fbGUxNl90b19jcHUoaC0+ZGxlbik7Ci0KLQkJCQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBzY2ItPmV4cGVjdCkgewotCQkJCQlrZnJlZV9za2Ioc2tiKTsKLQkJCQkJaGRldi0+cmVhc3NlbWJseVtpbmRleF0gPSBOVUxMOwotCQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQotCQljYXNlIEhDSV9TQ09EQVRBX1BLVDoKLQkJCWlmIChza2ItPmxlbiA9PSBIQ0lfU0NPX0hEUl9TSVpFKSB7Ci0JCQkJc3RydWN0IGhjaV9zY29faGRyICpoID0gaGNpX3Njb19oZHIoc2tiKTsKLQkJCQlzY2ItPmV4cGVjdCA9IGgtPmRsZW47Ci0KLQkJCQlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCBzY2ItPmV4cGVjdCkgewotCQkJCQlrZnJlZV9za2Ioc2tiKTsKLQkJCQkJaGRldi0+cmVhc3NlbWJseVtpbmRleF0gPSBOVUxMOwotCQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCi0JCWlmIChzY2ItPmV4cGVjdCA9PSAwKSB7Ci0JCQkvKiBDb21wbGV0ZSBmcmFtZSAqLwotCi0JCQlidF9jYihza2IpLT5wa3RfdHlwZSA9IHR5cGU7Ci0JCQloY2lfcmVjdl9mcmFtZShoZGV2LCBza2IpOwotCi0JCQloZGV2LT5yZWFzc2VtYmx5W2luZGV4XSA9IE5VTEw7Ci0JCQlyZXR1cm4gcmVtYWluOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJlbWFpbjsKLX0KLQotI2RlZmluZSBTVFJFQU1fUkVBU1NFTUJMWSAwCi0KLWludCBoY2lfcmVjdl9zdHJlYW1fZnJhZ21lbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKmRhdGEsIGludCBjb3VudCkKLXsKLQlpbnQgdHlwZTsKLQlpbnQgcmVtID0gMDsKLQotCXdoaWxlIChjb3VudCkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaGRldi0+cmVhc3NlbWJseVtTVFJFQU1fUkVBU1NFTUJMWV07Ci0KLQkJaWYgKCFza2IpIHsKLQkJCXN0cnVjdCB7IGNoYXIgdHlwZTsgfSAqcGt0OwotCi0JCQkvKiBTdGFydCBvZiB0aGUgZnJhbWUgKi8KLQkJCXBrdCA9IGRhdGE7Ci0JCQl0eXBlID0gcGt0LT50eXBlOwotCi0JCQlkYXRhKys7Ci0JCQljb3VudC0tOwotCQl9IGVsc2UKLQkJCXR5cGUgPSBidF9jYihza2IpLT5wa3RfdHlwZTsKLQotCQlyZW0gPSBoY2lfcmVhc3NlbWJseShoZGV2LCB0eXBlLCBkYXRhLCBjb3VudCwKLQkJCQkgICAgIFNUUkVBTV9SRUFTU0VNQkxZKTsKLQkJaWYgKHJlbSA8IDApCi0JCQlyZXR1cm4gcmVtOwotCi0JCWRhdGEgKz0gKGNvdW50IC0gcmVtKTsKLQkJY291bnQgPSByZW07Ci0JfQotCi0JcmV0dXJuIHJlbTsKLX0KLUVYUE9SVF9TWU1CT0woaGNpX3JlY3Zfc3RyZWFtX2ZyYWdtZW50KTsKLQogLyogLS0tLSBJbnRlcmZhY2UgdG8gdXBwZXIgcHJvdG9jb2xzIC0tLS0gKi8KIAogaW50IGhjaV9yZWdpc3Rlcl9jYihzdHJ1Y3QgaGNpX2NiICpjYikKIHsKIAlCVF9EQkcoIiVwIG5hbWUgJXMiLCBjYiwgY2ItPm5hbWUpOwogCi0Jd3JpdGVfbG9jaygmaGNpX2NiX2xpc3RfbG9jayk7Ci0JbGlzdF9hZGQoJmNiLT5saXN0LCAmaGNpX2NiX2xpc3QpOwotCXdyaXRlX3VubG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CisJbXV0ZXhfbG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY2ItPmxpc3QsICZoY2lfY2JfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzQ2MCw5ICszMzM1LDkgQEAKIHsKIAlCVF9EQkcoIiVwIG5hbWUgJXMiLCBjYiwgY2ItPm5hbWUpOwogCi0Jd3JpdGVfbG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CisJbXV0ZXhfbG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CiAJbGlzdF9kZWwoJmNiLT5saXN0KTsKLQl3cml0ZV91bmxvY2soJmhjaV9jYl9saXN0X2xvY2spOworCW11dGV4X3VubG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTM0OTUsMTEgKzMzNzAsNiBAQAogCX0KIH0KIAotYm9vbCBoY2lfcmVxX3BlbmRpbmcoc3RydWN0IGhjaV9kZXYgKmhkZXYpCi17Ci0JcmV0dXJuIChoZGV2LT5yZXFfc3RhdHVzID09IEhDSV9SRVFfUEVORCk7Ci19Ci0KIC8qIFNlbmQgSENJIGNvbW1hbmQgKi8KIGludCBoY2lfc2VuZF9jbWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9wY29kZSwgX191MzIgcGxlbiwKIAkJIGNvbnN0IHZvaWQgKnBhcmFtKQpAQCAtMzg3NCw3ICszNzQ0LDcgQEAKIAogc3RhdGljIHZvaWQgX19jaGVja190aW1lb3V0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1bnNpZ25lZCBpbnQgY250KQogewotCWlmICghdGVzdF9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VTkNPTkZJR1VSRUQpKSB7CiAJCS8qIEFDTCB0eCB0aW1lb3V0IG11c3QgYmUgbG9uZ2VyIHRoYW4gbWF4aW11bQogCQkgKiBsaW5rIHN1cGVydmlzaW9uIHRpbWVvdXQgKDQwLjkgc2Vjb25kcykgKi8KIAkJaWYgKCFjbnQgJiYgdGltZV9hZnRlcihqaWZmaWVzLCBoZGV2LT5hY2xfbGFzdF90eCArCkBAIC00MDU3LDcgKzM5MjcsNyBAQAogCWlmICghaGNpX2Nvbm5fbnVtKGhkZXYsIExFX0xJTkspKQogCQlyZXR1cm47CiAKLQlpZiAoIXRlc3RfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVU5DT05GSUdVUkVEKSkgewogCQkvKiBMRSB0eCB0aW1lb3V0IG11c3QgYmUgbG9uZ2VyIHRoYW4gbWF4aW11bQogCQkgKiBsaW5rIHN1cGVydmlzaW9uIHRpbWVvdXQgKDQwLjkgc2Vjb25kcykgKi8KIAkJaWYgKCFoZGV2LT5sZV9jbnQgJiYgaGRldi0+bGVfcGt0cyAmJgpAQCAtNDEwNSw3ICszOTc1LDcgQEAKIAlCVF9EQkcoIiVzIGFjbCAlZCBzY28gJWQgbGUgJWQiLCBoZGV2LT5uYW1lLCBoZGV2LT5hY2xfY250LAogCSAgICAgICBoZGV2LT5zY29fY250LCBoZGV2LT5sZV9jbnQpOwogCi0JaWYgKCF0ZXN0X2JpdChIQ0lfVVNFUl9DSEFOTkVMLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1VTRVJfQ0hBTk5FTCkpIHsKIAkJLyogU2NoZWR1bGUgcXVldWVzIGFuZCBzZW5kIHN0dWZmIHRvIEhDSSBkcml2ZXIgKi8KIAkJaGNpX3NjaGVkX2FjbChoZGV2KTsKIAkJaGNpX3NjaGVkX3NjbyhoZGV2KTsKQEAgLTQyMjAsOSArNDA5MCwxMCBAQAogCXF1ZXVlX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+Y21kX3dvcmspOwogfQogCi12b2lkIGhjaV9yZXFfY21kX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1MTYgb3Bjb2RlLCB1OCBzdGF0dXMpCit2b2lkIGhjaV9yZXFfY21kX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1MTYgb3Bjb2RlLCB1OCBzdGF0dXMsCisJCQkgIGhjaV9yZXFfY29tcGxldGVfdCAqcmVxX2NvbXBsZXRlLAorCQkJICBoY2lfcmVxX2NvbXBsZXRlX3NrYl90ICpyZXFfY29tcGxldGVfc2tiKQogewotCWhjaV9yZXFfY29tcGxldGVfdCByZXFfY29tcGxldGUgPSBOVUxMOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtNDI1NCwxOCArNDEyNSwxNCBAQAogCSAqIGNhbGxiYWNrIHdvdWxkIGJlIGZvdW5kIGluIGhkZXYtPnNlbnRfY21kIGluc3RlYWQgb2YgdGhlCiAJICogY29tbWFuZCBxdWV1ZSAoaGRldi0+Y21kX3EpLgogCSAqLwotCWlmIChoZGV2LT5zZW50X2NtZCkgewotCQlyZXFfY29tcGxldGUgPSBidF9jYihoZGV2LT5zZW50X2NtZCktPnJlcS5jb21wbGV0ZTsKKwlpZiAoYnRfY2IoaGRldi0+c2VudF9jbWQpLT5yZXEuY29tcGxldGUpIHsKKwkJKnJlcV9jb21wbGV0ZSA9IGJ0X2NiKGhkZXYtPnNlbnRfY21kKS0+cmVxLmNvbXBsZXRlOworCQlyZXR1cm47CisJfQogCi0JCWlmIChyZXFfY29tcGxldGUpIHsKLQkJCS8qIFdlIG11c3Qgc2V0IHRoZSBjb21wbGV0ZSBjYWxsYmFjayB0byBOVUxMIHRvCi0JCQkgKiBhdm9pZCBjYWxsaW5nIHRoZSBjYWxsYmFjayBtb3JlIHRoYW4gb25jZSBpZgotCQkJICogdGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBhZ2Fpbi4KLQkJCSAqLwotCQkJYnRfY2IoaGRldi0+c2VudF9jbWQpLT5yZXEuY29tcGxldGUgPSBOVUxMOwotCi0JCQlnb3RvIGNhbGxfY29tcGxldGU7Ci0JCX0KKwlpZiAoYnRfY2IoaGRldi0+c2VudF9jbWQpLT5yZXEuY29tcGxldGVfc2tiKSB7CisJCSpyZXFfY29tcGxldGVfc2tiID0gYnRfY2IoaGRldi0+c2VudF9jbWQpLT5yZXEuY29tcGxldGVfc2tiOworCQlyZXR1cm47CiAJfQogCiAJLyogUmVtb3ZlIGFsbCBwZW5kaW5nIGNvbW1hbmRzIGJlbG9uZ2luZyB0byB0aGlzIHJlcXVlc3QgKi8KQEAgLTQyNzYsMTQgKzQxNDMsMTEgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcmVxX2NvbXBsZXRlID0gYnRfY2Ioc2tiKS0+cmVxLmNvbXBsZXRlOworCQkqcmVxX2NvbXBsZXRlID0gYnRfY2Ioc2tiKS0+cmVxLmNvbXBsZXRlOworCQkqcmVxX2NvbXBsZXRlX3NrYiA9IGJ0X2NiKHNrYiktPnJlcS5jb21wbGV0ZV9za2I7CiAJCWtmcmVlX3NrYihza2IpOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoZGV2LT5jbWRfcS5sb2NrLCBmbGFncyk7Ci0KLWNhbGxfY29tcGxldGU6Ci0JaWYgKHJlcV9jb21wbGV0ZSkKLQkJcmVxX2NvbXBsZXRlKGhkZXYsIHN0YXR1cywgc3RhdHVzID8gb3Bjb2RlIDogSENJX09QX05PUCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhjaV9yeF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTQzMDIsNyArNDE2Niw3IEBACiAJCQloY2lfc2VuZF90b19zb2NrKGhkZXYsIHNrYik7CiAJCX0KIAotCQlpZiAodGVzdF9iaXQoSENJX1VTRVJfQ0hBTk5FTCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VU0VSX0NIQU5ORUwpKSB7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCWNvbnRpbnVlOwogCQl9CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2hjaV9kZWJ1Z2ZzLmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9kZWJ1Z2ZzLmMKaW5kZXggNjUyNjFlNS4uN2RiNDIyMCAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfZGVidWdmcy5jCisrKyBiL25ldC9ibHVldG9vdGgvaGNpX2RlYnVnZnMuYwpAQCAtMjgsNiArMjgsNTQgQEAKIAogI2luY2x1ZGUgImhjaV9kZWJ1Z2ZzLmgiCiAKKyNkZWZpbmUgREVGSU5FX1FVSVJLX0FUVFJJQlVURShfX25hbWUsIF9fcXVpcmspCQkJCSAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IF9fbmFtZSAjIyBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwJCQkgICAgICBcCisJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAkJCSAgICAgIFwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykJCSAgICAgIFwKK3sJCQkJCQkJCQkgICAgICBcCisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CQkJICAgICAgXAorCWNoYXIgYnVmWzNdOwkJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisJYnVmWzBdID0gdGVzdF9iaXQoX19xdWlyaywgJmhkZXYtPnF1aXJrcykgPyAnWScgOiAnTic7CQkgICAgICBcCisJYnVmWzFdID0gJ1xuJzsJCQkJCQkJICAgICAgXAorCWJ1ZlsyXSA9ICdcMCc7CQkJCQkJCSAgICAgIFwKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIDIpOwkgICAgICBcCit9CQkJCQkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorc3RhdGljIHNzaXplX3QgX19uYW1lICMjIF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwJCQkgICAgICBcCisJCQkJIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwJCSAgICAgIFwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCQkgICAgICBcCit7CQkJCQkJCQkJICAgICAgXAorCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwkJCSAgICAgIFwKKwljaGFyIGJ1ZlszMl07CQkJCQkJCSAgICAgIFwKKwlzaXplX3QgYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsJCSAgICAgIFwKKwlib29sIGVuYWJsZTsJCQkJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorCWlmICh0ZXN0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncykpCQkJCSAgICAgIFwKKwkJcmV0dXJuIC1FQlVTWTsJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkJCQkgICAgICBcCisJCXJldHVybiAtRUZBVUxUOwkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKKwlidWZbYnVmX3NpemVdID0gJ1wwJzsJCQkJCQkgICAgICBcCisJaWYgKHN0cnRvYm9vbChidWYsICZlbmFibGUpKQkJCQkJICAgICAgXAorCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisJaWYgKGVuYWJsZSA9PSB0ZXN0X2JpdChfX3F1aXJrLCAmaGRldi0+cXVpcmtzKSkJCQkgICAgICBcCisJCXJldHVybiAtRUFMUkVBRFk7CQkJCQkgICAgICBcCisJCQkJCQkJCQkgICAgICBcCisJY2hhbmdlX2JpdChfX3F1aXJrLCAmaGRldi0+cXVpcmtzKTsJCQkJICAgICAgXAorCQkJCQkJCQkJICAgICAgXAorCXJldHVybiBjb3VudDsJCQkJCQkJICAgICAgXAorfQkJCQkJCQkJCSAgICAgIFwKKwkJCQkJCQkJCSAgICAgIFwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIF9fbmFtZSAjIyBfZm9wcyA9IHsJCQkgICAgICBcCisJLm9wZW4JCT0gc2ltcGxlX29wZW4sCQkJCQkgICAgICBcCisJLnJlYWQJCT0gX19uYW1lICMjIF9yZWFkLAkJCQkgICAgICBcCisJLndyaXRlCQk9IF9fbmFtZSAjIyBfd3JpdGUsCQkJCSAgICAgIFwKKwkubGxzZWVrCQk9IGRlZmF1bHRfbGxzZWVrLAkJCQkgICAgICBcCit9CQkJCQkJCQkJICAgICAgXAorCiBzdGF0aWMgaW50IGZlYXR1cmVzX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICpwdHIpCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBmLT5wcml2YXRlOwpAQCAtNjYsNiArMTE0LDMwIEBACiAJLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKIH07CiAKK3N0YXRpYyBpbnQgZGV2aWNlX2lkX3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICpwdHIpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBmLT5wcml2YXRlOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCXNlcV9wcmludGYoZiwgIiU0LjR4OiU0LjR4OiU0LjR4OiU0LjR4XG4iLCBoZGV2LT5kZXZpZF9zb3VyY2UsCisJCSAgaGRldi0+ZGV2aWRfdmVuZG9yLCBoZGV2LT5kZXZpZF9wcm9kdWN0LCBoZGV2LT5kZXZpZF92ZXJzaW9uKTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRldmljZV9pZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBkZXZpY2VfaWRfc2hvdywgaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldmljZV9pZF9mb3BzID0geworCS5vcGVuCQk9IGRldmljZV9pZF9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworCiBzdGF0aWMgaW50IGRldmljZV9saXN0X3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICpwdHIpCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBmLT5wcml2YXRlOwpAQCAtMTY2LDcgKzIzOCw3IEBACiAJCXNlcV9wcmludGYoZiwgIiVwTVIgKHR5cGUgJXUpICV1ICUqcGhOICUqcGhOICUqcGhOICUqcGhOXG4iLAogCQkJICAgJmRhdGEtPmJkYWRkciwgZGF0YS0+YmRhZGRyX3R5cGUsIGRhdGEtPnByZXNlbnQsCiAJCQkgICAxNiwgZGF0YS0+aGFzaDE5MiwgMTYsIGRhdGEtPnJhbmQxOTIsCi0JCQkgICAxNiwgZGF0YS0+aGFzaDI1NiwgMTksIGRhdGEtPnJhbmQyNTYpOworCQkJICAgMTYsIGRhdGEtPmhhc2gyNTYsIDE2LCBkYXRhLT5yYW5kMjU2KTsKIAl9CiAJaGNpX2Rldl91bmxvY2soaGRldik7CiAKQEAgLTI0Nyw3ICszMTksNyBAQAogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNoYXIgYnVmWzNdOwogCi0JYnVmWzBdID0gdGVzdF9iaXQoSENJX1VTRV9ERUJVR19LRVlTLCAmaGRldi0+ZGV2X2ZsYWdzKSA/ICdZJzogJ04nOworCWJ1ZlswXSA9IGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VU0VfREVCVUdfS0VZUykgPyAnWSc6ICdOJzsKIAlidWZbMV0gPSAnXG4nOwogCWJ1ZlsyXSA9ICdcMCc7CiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCAyKTsKQEAgLTI2NSw3ICszMzcsNyBAQAogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNoYXIgYnVmWzNdOwogCi0JYnVmWzBdID0gdGVzdF9iaXQoSENJX1NDX09OTFksICZoZGV2LT5kZXZfZmxhZ3MpID8gJ1knOiAnTic7CisJYnVmWzBdID0gaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NDX09OTFkpID8gJ1knOiAnTic7CiAJYnVmWzFdID0gJ1xuJzsKIAlidWZbMl0gPSAnXDAnOwogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgMik7CkBAIC0yODcsNiArMzU5LDggQEAKIAlkZWJ1Z2ZzX2NyZWF0ZV91MTYoImhjaV9yZXZpc2lvbiIsIDA0NDQsIGhkZXYtPmRlYnVnZnMsICZoZGV2LT5oY2lfcmV2KTsKIAlkZWJ1Z2ZzX2NyZWF0ZV91OCgiaGFyZHdhcmVfZXJyb3IiLCAwNDQ0LCBoZGV2LT5kZWJ1Z2ZzLAogCQkJICAmaGRldi0+aHdfZXJyb3JfY29kZSk7CisJZGVidWdmc19jcmVhdGVfZmlsZSgiZGV2aWNlX2lkIiwgMDQ0NCwgaGRldi0+ZGVidWdmcywgaGRldiwKKwkJCSAgICAmZGV2aWNlX2lkX2ZvcHMpOwogCiAJZGVidWdmc19jcmVhdGVfZmlsZSgiZGV2aWNlX2xpc3QiLCAwNDQ0LCBoZGV2LT5kZWJ1Z2ZzLCBoZGV2LAogCQkJICAgICZkZXZpY2VfbGlzdF9mb3BzKTsKQEAgLTY3OSw3ICs3NTMsNyBAQAogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCWNoYXIgYnVmWzNdOwogCi0JYnVmWzBdID0gdGVzdF9iaXQoSENJX0ZPUkNFX1NUQVRJQ19BRERSLCAmaGRldi0+ZGJnX2ZsYWdzKSA/ICdZJzogJ04nOworCWJ1ZlswXSA9IGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9GT1JDRV9TVEFUSUNfQUREUikgPyAnWSc6ICdOJzsKIAlidWZbMV0gPSAnXG4nOwogCWJ1ZlsyXSA9ICdcMCc7CiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCAyKTsKQEAgLTcwNCwxMCArNzc4LDEwIEBACiAJaWYgKHN0cnRvYm9vbChidWYsICZlbmFibGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChlbmFibGUgPT0gdGVzdF9iaXQoSENJX0ZPUkNFX1NUQVRJQ19BRERSLCAmaGRldi0+ZGJnX2ZsYWdzKSkKKwlpZiAoZW5hYmxlID09IGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9GT1JDRV9TVEFUSUNfQUREUikpCiAJCXJldHVybiAtRUFMUkVBRFk7CiAKLQljaGFuZ2VfYml0KEhDSV9GT1JDRV9TVEFUSUNfQUREUiwgJmhkZXYtPmRiZ19mbGFncyk7CisJaGNpX2Rldl9jaGFuZ2VfZmxhZyhoZGV2LCBIQ0lfRk9SQ0VfU1RBVElDX0FERFIpOwogCiAJcmV0dXJuIGNvdW50OwogfQpAQCAtOTk3LDYgKzEwNzEsMTEgQEAKIERFRklORV9TSU1QTEVfQVRUUklCVVRFKGFkdl9tYXhfaW50ZXJ2YWxfZm9wcywgYWR2X21heF9pbnRlcnZhbF9nZXQsCiAJCQlhZHZfbWF4X2ludGVydmFsX3NldCwgIiVsbHVcbiIpOwogCitERUZJTkVfUVVJUktfQVRUUklCVVRFKHF1aXJrX3N0cmljdF9kdXBsaWNhdGVfZmlsdGVyLAorCQkgICAgICAgSENJX1FVSVJLX1NUUklDVF9EVVBMSUNBVEVfRklMVEVSKTsKK0RFRklORV9RVUlSS19BVFRSSUJVVEUocXVpcmtfc2ltdWx0YW5lb3VzX2Rpc2NvdmVyeSwKKwkJICAgICAgIEhDSV9RVUlSS19TSU1VTFRBTkVPVVNfRElTQ09WRVJZKTsKKwogdm9pZCBoY2lfZGVidWdmc19jcmVhdGVfbGUoc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7CiAJZGVidWdmc19jcmVhdGVfZmlsZSgiaWRlbnRpdHkiLCAwNDAwLCBoZGV2LT5kZWJ1Z2ZzLCBoZGV2LApAQCAtMTA0MSw2ICsxMTIwLDEzIEBACiAJCQkgICAgJmFkdl9tYXhfaW50ZXJ2YWxfZm9wcyk7CiAJZGVidWdmc19jcmVhdGVfdTE2KCJkaXNjb3ZfaW50ZXJsZWF2ZWRfdGltZW91dCIsIDA2NDQsIGhkZXYtPmRlYnVnZnMsCiAJCQkgICAmaGRldi0+ZGlzY292X2ludGVybGVhdmVkX3RpbWVvdXQpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgicXVpcmtfc3RyaWN0X2R1cGxpY2F0ZV9maWx0ZXIiLCAwNjQ0LAorCQkJICAgIGhkZXYtPmRlYnVnZnMsIGhkZXYsCisJCQkgICAgJnF1aXJrX3N0cmljdF9kdXBsaWNhdGVfZmlsdGVyX2ZvcHMpOworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInF1aXJrX3NpbXVsdGFuZW91c19kaXNjb3ZlcnkiLCAwNjQ0LAorCQkJICAgIGhkZXYtPmRlYnVnZnMsIGhkZXYsCisJCQkgICAgJnF1aXJrX3NpbXVsdGFuZW91c19kaXNjb3ZlcnlfZm9wcyk7CiB9CiAKIHZvaWQgaGNpX2RlYnVnZnNfY3JlYXRlX2Nvbm4oc3RydWN0IGhjaV9jb25uICpjb25uKQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfZGVidWdmcy5oIGIvbmV0L2JsdWV0b290aC9oY2lfZGVidWdmcy5oCmluZGV4IGZiNjhlZmUuLjQ0NDRkYzggMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2RlYnVnZnMuaAorKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9kZWJ1Z2ZzLmgKQEAgLTIwLDcgKzIwLDI5IEBACiAgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgogKi8KIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX0JUX0RFQlVHRlMpCisKIHZvaWQgaGNpX2RlYnVnZnNfY3JlYXRlX2NvbW1vbihzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiB2b2lkIGhjaV9kZWJ1Z2ZzX2NyZWF0ZV9icmVkcihzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiB2b2lkIGhjaV9kZWJ1Z2ZzX2NyZWF0ZV9sZShzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiB2b2lkIGhjaV9kZWJ1Z2ZzX2NyZWF0ZV9jb25uKHN0cnVjdCBoY2lfY29ubiAqY29ubik7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoY2lfZGVidWdmc19jcmVhdGVfY29tbW9uKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2RlYnVnZnNfY3JlYXRlX2JyZWRyKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2RlYnVnZnNfY3JlYXRlX2xlKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2RlYnVnZnNfY3JlYXRlX2Nvbm4oc3RydWN0IGhjaV9jb25uICpjb25uKQoreworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCmluZGV4IGEzZmIwOTQuLjdiNjFiZTcgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwpAQCAtNzAsNyArNzAsNyBAQAogCWlmIChzdGF0dXMpCiAJCXJldHVybjsKIAotCXNldF9iaXQoSENJX1BFUklPRElDX0lOUSwgJmhkZXYtPmRldl9mbGFncyk7CisJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfUEVSSU9ESUNfSU5RKTsKIH0KIAogc3RhdGljIHZvaWQgaGNpX2NjX2V4aXRfcGVyaW9kaWNfaW5xKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtODIsNyArODIsNyBAQAogCWlmIChzdGF0dXMpCiAJCXJldHVybjsKIAotCWNsZWFyX2JpdChIQ0lfUEVSSU9ESUNfSU5RLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX1BFUklPRElDX0lOUSk7CiAKIAloY2lfY29ubl9jaGVja19wZW5kaW5nKGhkZXYpOwogfQpAQCAtMTk4LDcgKzE5OCw3IEBACiAJCXJldHVybjsKIAogCS8qIFJlc2V0IGFsbCBub24tcGVyc2lzdGVudCBmbGFncyAqLwotCWhkZXYtPmRldl9mbGFncyAmPSB+SENJX1BFUlNJU1RFTlRfTUFTSzsKKwloY2lfZGV2X2NsZWFyX3ZvbGF0aWxlX2ZsYWdzKGhkZXYpOwogCiAJaGNpX2Rpc2NvdmVyeV9zZXRfc3RhdGUoaGRldiwgRElTQ09WRVJZX1NUT1BQRUQpOwogCkBAIC0yNjUsNyArMjY1LDcgQEAKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWlmICh0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9NR01UKSkKIAkJbWdtdF9zZXRfbG9jYWxfbmFtZV9jb21wbGV0ZShoZGV2LCBzZW50LCBzdGF0dXMpOwogCWVsc2UgaWYgKCFzdGF0dXMpCiAJCW1lbWNweShoZGV2LT5kZXZfbmFtZSwgc2VudCwgSENJX01BWF9OQU1FX0xFTkdUSCk7CkBAIC0yODIsOCArMjgyLDggQEAKIAlpZiAocnAtPnN0YXR1cykKIAkJcmV0dXJuOwogCi0JaWYgKHRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmRldl9mbGFncykgfHwKLQkgICAgdGVzdF9iaXQoSENJX0NPTkZJRywgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TRVRVUCkgfHwKKwkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0NPTkZJRykpCiAJCW1lbWNweShoZGV2LT5kZXZfbmFtZSwgcnAtPm5hbWUsIEhDSV9NQVhfTkFNRV9MRU5HVEgpOwogfQogCkBAIC0zMDksNyArMzA5LDcgQEAKIAkJCWNsZWFyX2JpdChIQ0lfQVVUSCwgJmhkZXYtPmZsYWdzKTsKIAl9CiAKLQlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpCiAJCW1nbXRfYXV0aF9lbmFibGVfY29tcGxldGUoaGRldiwgc3RhdHVzKTsKIAogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwpAQCAtNDA0LDcgKzQwNCw3IEBACiAJaWYgKHN0YXR1cyA9PSAwKQogCQltZW1jcHkoaGRldi0+ZGV2X2NsYXNzLCBzZW50LCAzKTsKIAotCWlmICh0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9NR01UKSkKIAkJbWdtdF9zZXRfY2xhc3Nfb2ZfZGV2X2NvbXBsZXRlKGhkZXYsIHNlbnQsIHN0YXR1cyk7CiAKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKQEAgLTQ5NywxMyArNDk3LDEzIEBACiAJCQloZGV2LT5mZWF0dXJlc1sxXVswXSAmPSB+TE1QX0hPU1RfU1NQOwogCX0KIAotCWlmICh0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9NR01UKSkKIAkJbWdtdF9zc3BfZW5hYmxlX2NvbXBsZXRlKGhkZXYsIHNlbnQtPm1vZGUsIHN0YXR1cyk7CiAJZWxzZSBpZiAoIXN0YXR1cykgewogCQlpZiAoc2VudC0+bW9kZSkKLQkJCXNldF9iaXQoSENJX1NTUF9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJCWhjaV9kZXZfc2V0X2ZsYWcoaGRldiwgSENJX1NTUF9FTkFCTEVEKTsKIAkJZWxzZQotCQkJY2xlYXJfYml0KEhDSV9TU1BfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncyk7CisJCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX1NTUF9FTkFCTEVEKTsKIAl9CiAKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKQEAgLTUyOSwxMSArNTI5LDExIEBACiAJCQloZGV2LT5mZWF0dXJlc1sxXVswXSAmPSB+TE1QX0hPU1RfU0M7CiAJfQogCi0JaWYgKCF0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmRldl9mbGFncykgJiYgIXN0YXR1cykgeworCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpICYmICFzdGF0dXMpIHsKIAkJaWYgKHNlbnQtPnN1cHBvcnQpCi0JCQlzZXRfYml0KEhDSV9TQ19FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJCWhjaV9kZXZfc2V0X2ZsYWcoaGRldiwgSENJX1NDX0VOQUJMRUQpOwogCQllbHNlCi0JCQljbGVhcl9iaXQoSENJX1NDX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpOworCQkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9TQ19FTkFCTEVEKTsKIAl9CiAKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKQEAgLTU0OCw4ICs1NDgsOCBAQAogCWlmIChycC0+c3RhdHVzKQogCQlyZXR1cm47CiAKLQlpZiAodGVzdF9iaXQoSENJX1NFVFVQLCAmaGRldi0+ZGV2X2ZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChIQ0lfQ09ORklHLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU0VUVVApIHx8CisJICAgIGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9DT05GSUcpKSB7CiAJCWhkZXYtPmhjaV92ZXIgPSBycC0+aGNpX3ZlcjsKIAkJaGRldi0+aGNpX3JldiA9IF9fbGUxNl90b19jcHUocnAtPmhjaV9yZXYpOwogCQloZGV2LT5sbXBfdmVyID0gcnAtPmxtcF92ZXI7CkBAIC01NjgsOCArNTY4LDggQEAKIAlpZiAocnAtPnN0YXR1cykKIAkJcmV0dXJuOwogCi0JaWYgKHRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmRldl9mbGFncykgfHwKLQkgICAgdGVzdF9iaXQoSENJX0NPTkZJRywgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TRVRVUCkgfHwKKwkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0NPTkZJRykpCiAJCW1lbWNweShoZGV2LT5jb21tYW5kcywgcnAtPmNvbW1hbmRzLCBzaXplb2YoaGRldi0+Y29tbWFuZHMpKTsKIH0KIApAQCAtNjkxLDcgKzY5MSw3IEBACiAJaWYgKHRlc3RfYml0KEhDSV9JTklULCAmaGRldi0+ZmxhZ3MpKQogCQliYWNweSgmaGRldi0+YmRhZGRyLCAmcnAtPmJkYWRkcik7CiAKLQlpZiAodGVzdF9iaXQoSENJX1NFVFVQLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NFVFVQKSkKIAkJYmFjcHkoJmhkZXYtPnNldHVwX2FkZHIsICZycC0+YmRhZGRyKTsKIH0KIApAQCAtOTAwLDcgKzkwMCw3IEBACiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKLQlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpCiAJCW1nbXRfcGluX2NvZGVfcmVwbHlfY29tcGxldGUoaGRldiwgJnJwLT5iZGFkZHIsIHJwLT5zdGF0dXMpOwogCiAJaWYgKHJwLT5zdGF0dXMpCkBAIC05MjYsNyArOTI2LDcgQEAKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWlmICh0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9NR01UKSkKIAkJbWdtdF9waW5fY29kZV9uZWdfcmVwbHlfY29tcGxldGUoaGRldiwgJnJwLT5iZGFkZHIsCiAJCQkJCQkgcnAtPnN0YXR1cyk7CiAKQEAgLTk4NSw3ICs5ODUsNyBAQAogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpKQogCQltZ210X3VzZXJfY29uZmlybV9yZXBseV9jb21wbGV0ZShoZGV2LCAmcnAtPmJkYWRkciwgQUNMX0xJTkssIDAsCiAJCQkJCQkgcnAtPnN0YXR1cyk7CiAKQEAgLTEwMDEsNyArMTAwMSw3IEBACiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKLQlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpCiAJCW1nbXRfdXNlcl9jb25maXJtX25lZ19yZXBseV9jb21wbGV0ZShoZGV2LCAmcnAtPmJkYWRkciwKIAkJCQkJCSAgICAgQUNMX0xJTkssIDAsIHJwLT5zdGF0dXMpOwogCkBAIC0xMDE2LDcgKzEwMTYsNyBAQAogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpKQogCQltZ210X3VzZXJfcGFzc2tleV9yZXBseV9jb21wbGV0ZShoZGV2LCAmcnAtPmJkYWRkciwgQUNMX0xJTkssCiAJCQkJCQkgMCwgcnAtPnN0YXR1cyk7CiAKQEAgLTEwMzIsNyArMTAzMiw3IEBACiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKLQlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpCiAJCW1nbXRfdXNlcl9wYXNza2V5X25lZ19yZXBseV9jb21wbGV0ZShoZGV2LCAmcnAtPmJkYWRkciwKIAkJCQkJCSAgICAgQUNMX0xJTkssIDAsIHJwLT5zdGF0dXMpOwogCkBAIC0xMDQ1LDExICsxMDQ1LDYgQEAKIAlzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfb29iX2RhdGEgKnJwID0gKHZvaWQgKikgc2tiLT5kYXRhOwogCiAJQlRfREJHKCIlcyBzdGF0dXMgMHglMi4yeCIsIGhkZXYtPm5hbWUsIHJwLT5zdGF0dXMpOwotCi0JaGNpX2Rldl9sb2NrKGhkZXYpOwotCW1nbXRfcmVhZF9sb2NhbF9vb2JfZGF0YV9jb21wbGV0ZShoZGV2LCBycC0+aGFzaCwgcnAtPnJhbmQsIE5VTEwsIE5VTEwsCi0JCQkJCSAgcnAtPnN0YXR1cyk7Ci0JaGNpX2Rldl91bmxvY2soaGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGhjaV9jY19yZWFkX2xvY2FsX29vYl9leHRfZGF0YShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKQEAgLTEwNTgsMTUgKzEwNTMsOCBAQAogCXN0cnVjdCBoY2lfcnBfcmVhZF9sb2NhbF9vb2JfZXh0X2RhdGEgKnJwID0gKHZvaWQgKikgc2tiLT5kYXRhOwogCiAJQlRfREJHKCIlcyBzdGF0dXMgMHglMi4yeCIsIGhkZXYtPm5hbWUsIHJwLT5zdGF0dXMpOwotCi0JaGNpX2Rldl9sb2NrKGhkZXYpOwotCW1nbXRfcmVhZF9sb2NhbF9vb2JfZGF0YV9jb21wbGV0ZShoZGV2LCBycC0+aGFzaDE5MiwgcnAtPnJhbmQxOTIsCi0JCQkJCSAgcnAtPmhhc2gyNTYsIHJwLT5yYW5kMjU2LAotCQkJCQkgIHJwLT5zdGF0dXMpOwotCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCi0KIHN0YXRpYyB2b2lkIGhjaV9jY19sZV9zZXRfcmFuZG9tX2FkZHIoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJX191OCBzdGF0dXMgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CkBAIC0xMTA5LDcgKzEwOTcsNyBAQAogCWlmICgqc2VudCkgewogCQlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CiAKLQkJc2V0X2JpdChIQ0lfTEVfQURWLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfTEVfQURWKTsKIAogCQljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfc3RhdGUoaGRldiwgTEVfTElOSywgQlRfQ09OTkVDVCk7CiAJCWlmIChjb25uKQpAQCAtMTExNyw3ICsxMTA1LDcgQEAKIAkJCQkJICAgJmNvbm4tPmxlX2Nvbm5fdGltZW91dCwKIAkJCQkJICAgY29ubi0+Y29ubl90aW1lb3V0KTsKIAl9IGVsc2UgewotCQljbGVhcl9iaXQoSENJX0xFX0FEViwgJmhkZXYtPmRldl9mbGFncyk7CisJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfTEVfQURWKTsKIAl9CiAKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKQEAgLTExOTIsNyArMTE4MCw3IEBACiAKIAlzd2l0Y2ggKGNwLT5lbmFibGUpIHsKIAljYXNlIExFX1NDQU5fRU5BQkxFOgotCQlzZXRfYml0KEhDSV9MRV9TQ0FOLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfTEVfU0NBTik7CiAJCWlmIChoZGV2LT5sZV9zY2FuX3R5cGUgPT0gTEVfU0NBTl9BQ1RJVkUpCiAJCQljbGVhcl9wZW5kaW5nX2Fkdl9yZXBvcnQoaGRldik7CiAJCWJyZWFrOwpAQCAtMTIxNyw3ICsxMjA1LDcgQEAKIAkJICovCiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmhkZXYtPmxlX3NjYW5fZGlzYWJsZSk7CiAKLQkJY2xlYXJfYml0KEhDSV9MRV9TQ0FOLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9MRV9TQ0FOKTsKIAogCQkvKiBUaGUgSENJX0xFX1NDQU5fSU5URVJSVVBURUQgZmxhZyBpbmRpY2F0ZXMgdGhhdCB3ZQogCQkgKiBpbnRlcnJ1cHRlZCBzY2FubmluZyBkdWUgdG8gYSBjb25uZWN0IHJlcXVlc3QuIE1hcmsKQEAgLTEyMjYsMTAgKzEyMTQsOSBAQAogCQkgKiBiZWVuIGRpc2FibGVkIGJlY2F1c2Ugb2YgYWN0aXZlIHNjYW5uaW5nLCBzbwogCQkgKiByZS1lbmFibGUgaXQgYWdhaW4gaWYgbmVjZXNzYXJ5LgogCQkgKi8KLQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfTEVfU0NBTl9JTlRFUlJVUFRFRCwKLQkJCQkgICAgICAgJmhkZXYtPmRldl9mbGFncykpCisJCWlmIChoY2lfZGV2X3Rlc3RfYW5kX2NsZWFyX2ZsYWcoaGRldiwgSENJX0xFX1NDQU5fSU5URVJSVVBURUQpKQogCQkJaGNpX2Rpc2NvdmVyeV9zZXRfc3RhdGUoaGRldiwgRElTQ09WRVJZX1NUT1BQRUQpOwotCQllbHNlIGlmICghdGVzdF9iaXQoSENJX0xFX0FEViwgJmhkZXYtPmRldl9mbGFncykgJiYKKwkJZWxzZSBpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9BRFYpICYmCiAJCQkgaGRldi0+ZGlzY292ZXJ5LnN0YXRlID09IERJU0NPVkVSWV9GSU5ESU5HKQogCQkJbWdtdF9yZWVuYWJsZV9hZHZlcnRpc2luZyhoZGV2KTsKIApAQCAtMTM4OCwxMSArMTM3NSwxMSBAQAogCiAJaWYgKHNlbnQtPmxlKSB7CiAJCWhkZXYtPmZlYXR1cmVzWzFdWzBdIHw9IExNUF9IT1NUX0xFOwotCQlzZXRfYml0KEhDSV9MRV9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfTEVfRU5BQkxFRCk7CiAJfSBlbHNlIHsKIAkJaGRldi0+ZmVhdHVyZXNbMV1bMF0gJj0gfkxNUF9IT1NUX0xFOwotCQljbGVhcl9iaXQoSENJX0xFX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpOwotCQljbGVhcl9iaXQoSENJX0FEVkVSVElTSU5HLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9MRV9FTkFCTEVEKTsKKwkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lORyk7CiAJfQogCiAJaWYgKHNlbnQtPnNpbXVsKQpAQCAtMTUzNyw3ICsxNTI0LDcgQEAKIAkJaWYgKGNvbm4gJiYgY29ubi0+c3RhdGUgPT0gQlRfQ09OTkVDVCkgewogCQkJaWYgKHN0YXR1cyAhPSAweDBjIHx8IGNvbm4tPmF0dGVtcHQgPiAyKSB7CiAJCQkJY29ubi0+c3RhdGUgPSBCVF9DTE9TRUQ7Ci0JCQkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CisJCQkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CiAJCQkJaGNpX2Nvbm5fZGVsKGNvbm4pOwogCQkJfSBlbHNlCiAJCQkJY29ubi0+c3RhdGUgPSBCVF9DT05ORUNUMjsKQEAgLTE1ODEsNyArMTU2OCw3IEBACiAJCWlmIChzY28pIHsKIAkJCXNjby0+c3RhdGUgPSBCVF9DTE9TRUQ7CiAKLQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShzY28sIHN0YXR1cyk7CisJCQloY2lfY29ubmVjdF9jZm0oc2NvLCBzdGF0dXMpOwogCQkJaGNpX2Nvbm5fZGVsKHNjbyk7CiAJCX0KIAl9CkBAIC0xNjA4LDcgKzE1OTUsNyBAQAogCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgX19sZTE2X3RvX2NwdShjcC0+aGFuZGxlKSk7CiAJaWYgKGNvbm4pIHsKIAkJaWYgKGNvbm4tPnN0YXRlID09IEJUX0NPTkZJRykgewotCQkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CisJCQloY2lfY29ubmVjdF9jZm0oY29ubiwgc3RhdHVzKTsKIAkJCWhjaV9jb25uX2Ryb3AoY29ubik7CiAJCX0KIAl9CkBAIC0xNjM1LDcgKzE2MjIsNyBAQAogCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgX19sZTE2X3RvX2NwdShjcC0+aGFuZGxlKSk7CiAJaWYgKGNvbm4pIHsKIAkJaWYgKGNvbm4tPnN0YXRlID09IEJUX0NPTkZJRykgewotCQkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CisJCQloY2lfY29ubmVjdF9jZm0oY29ubiwgc3RhdHVzKTsKIAkJCWhjaV9jb25uX2Ryb3AoY29ubik7CiAJCX0KIAl9CkBAIC0xNzY5LDcgKzE3NTYsNyBAQAogCiAJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIEFDTF9MSU5LLCAmY3AtPmJkYWRkcik7CiAKLQlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpCiAJCWhjaV9jaGVja19wZW5kaW5nX25hbWUoaGRldiwgY29ubiwgJmNwLT5iZGFkZHIsIE5VTEwsIDApOwogCiAJaWYgKCFjb25uKQpAQCAtMTgxMSw3ICsxNzk4LDcgQEAKIAljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIF9fbGUxNl90b19jcHUoY3AtPmhhbmRsZSkpOwogCWlmIChjb25uKSB7CiAJCWlmIChjb25uLT5zdGF0ZSA9PSBCVF9DT05GSUcpIHsKLQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBzdGF0dXMpOworCQkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CiAJCQloY2lfY29ubl9kcm9wKGNvbm4pOwogCQl9CiAJfQpAQCAtMTgzOCw3ICsxODI1LDcgQEAKIAljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIF9fbGUxNl90b19jcHUoY3AtPmhhbmRsZSkpOwogCWlmIChjb25uKSB7CiAJCWlmIChjb25uLT5zdGF0ZSA9PSBCVF9DT05GSUcpIHsKLQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBzdGF0dXMpOworCQkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CiAJCQloY2lfY29ubl9kcm9wKGNvbm4pOwogCQl9CiAJfQpAQCAtMTg3Myw3ICsxODYwLDcgQEAKIAkJaWYgKHNjbykgewogCQkJc2NvLT5zdGF0ZSA9IEJUX0NMT1NFRDsKIAotCQkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKHNjbywgc3RhdHVzKTsKKwkJCWhjaV9jb25uZWN0X2NmbShzY28sIHN0YXR1cyk7CiAJCQloY2lfY29ubl9kZWwoc2NvKTsKIAkJfQogCX0KQEAgLTIwNDksNiArMjAzNiwzMyBAQAogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCitzdGF0aWMgdm9pZCBoY2lfY3NfbGVfcmVhZF9yZW1vdGVfZmVhdHVyZXMoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgaGNpX2NwX2xlX3JlYWRfcmVtb3RlX2ZlYXR1cmVzICpjcDsKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CisKKwlCVF9EQkcoIiVzIHN0YXR1cyAweCUyLjJ4IiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKKworCWlmICghc3RhdHVzKQorCQlyZXR1cm47CisKKwljcCA9IGhjaV9zZW50X2NtZF9kYXRhKGhkZXYsIEhDSV9PUF9MRV9SRUFEX1JFTU9URV9GRUFUVVJFUyk7CisJaWYgKCFjcCkKKwkJcmV0dXJuOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2hhbmRsZShoZGV2LCBfX2xlMTZfdG9fY3B1KGNwLT5oYW5kbGUpKTsKKwlpZiAoY29ubikgeworCQlpZiAoY29ubi0+c3RhdGUgPT0gQlRfQ09ORklHKSB7CisJCQloY2lfY29ubmVjdF9jZm0oY29ubiwgc3RhdHVzKTsKKwkJCWhjaV9jb25uX2Ryb3AoY29ubik7CisJCX0KKwl9CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKwogc3RhdGljIHZvaWQgaGNpX2NzX2xlX3N0YXJ0X2VuYyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzKQogewogCXN0cnVjdCBoY2lfY3BfbGVfc3RhcnRfZW5jICpjcDsKQEAgLTIxMTgsNyArMjEzMiw3IEBACiAJc21wX21iX19hZnRlcl9hdG9taWMoKTsgLyogd2FrZV91cF9iaXQgYWR2aXNlcyBhYm91dCB0aGlzIGJhcnJpZXIgKi8KIAl3YWtlX3VwX2JpdCgmaGRldi0+ZmxhZ3MsIEhDSV9JTlFVSVJZKTsKIAotCWlmICghdGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpKQogCQlyZXR1cm47CiAKIAloY2lfZGV2X2xvY2soaGRldik7CkBAIC0yMTI3LDcgKzIxNDEsMTYgQEAKIAkJZ290byB1bmxvY2s7CiAKIAlpZiAobGlzdF9lbXB0eSgmZGlzY292LT5yZXNvbHZlKSkgewotCQloY2lfZGlzY292ZXJ5X3NldF9zdGF0ZShoZGV2LCBESVNDT1ZFUllfU1RPUFBFRCk7CisJCS8qIFdoZW4gQlIvRURSIGlucXVpcnkgaXMgYWN0aXZlIGFuZCBubyBMRSBzY2FubmluZyBpcyBpbgorCQkgKiBwcm9ncmVzcywgdGhlbiBjaGFuZ2UgZGlzY292ZXJ5IHN0YXRlIHRvIGluZGljYXRlIGNvbXBsZXRpb24uCisJCSAqCisJCSAqIFdoZW4gcnVubmluZyBMRSBzY2FubmluZyBhbmQgQlIvRURSIGlucXVpcnkgc2ltdWx0YW5lb3VzbHkKKwkJICogYW5kIHRoZSBMRSBzY2FuIGFscmVhZHkgZmluaXNoZWQsIHRoZW4gY2hhbmdlIHRoZSBkaXNjb3ZlcnkKKwkJICogc3RhdGUgdG8gaW5kaWNhdGUgY29tcGxldGlvbi4KKwkJICovCisJCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX1NDQU4pIHx8CisJCSAgICAhdGVzdF9iaXQoSENJX1FVSVJLX1NJTVVMVEFORU9VU19ESVNDT1ZFUlksICZoZGV2LT5xdWlya3MpKQorCQkJaGNpX2Rpc2NvdmVyeV9zZXRfc3RhdGUoaGRldiwgRElTQ09WRVJZX1NUT1BQRUQpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTIxMzYsNyArMjE1OSwxNiBAQAogCQllLT5uYW1lX3N0YXRlID0gTkFNRV9QRU5ESU5HOwogCQloY2lfZGlzY292ZXJ5X3NldF9zdGF0ZShoZGV2LCBESVNDT1ZFUllfUkVTT0xWSU5HKTsKIAl9IGVsc2UgewotCQloY2lfZGlzY292ZXJ5X3NldF9zdGF0ZShoZGV2LCBESVNDT1ZFUllfU1RPUFBFRCk7CisJCS8qIFdoZW4gQlIvRURSIGlucXVpcnkgaXMgYWN0aXZlIGFuZCBubyBMRSBzY2FubmluZyBpcyBpbgorCQkgKiBwcm9ncmVzcywgdGhlbiBjaGFuZ2UgZGlzY292ZXJ5IHN0YXRlIHRvIGluZGljYXRlIGNvbXBsZXRpb24uCisJCSAqCisJCSAqIFdoZW4gcnVubmluZyBMRSBzY2FubmluZyBhbmQgQlIvRURSIGlucXVpcnkgc2ltdWx0YW5lb3VzbHkKKwkJICogYW5kIHRoZSBMRSBzY2FuIGFscmVhZHkgZmluaXNoZWQsIHRoZW4gY2hhbmdlIHRoZSBkaXNjb3ZlcnkKKwkJICogc3RhdGUgdG8gaW5kaWNhdGUgY29tcGxldGlvbi4KKwkJICovCisJCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX1NDQU4pIHx8CisJCSAgICAhdGVzdF9iaXQoSENJX1FVSVJLX1NJTVVMVEFORU9VU19ESVNDT1ZFUlksICZoZGV2LT5xdWlya3MpKQorCQkJaGNpX2Rpc2NvdmVyeV9zZXRfc3RhdGUoaGRldiwgRElTQ09WRVJZX1NUT1BQRUQpOwogCX0KIAogdW5sb2NrOgpAQCAtMjE1NCw3ICsyMTg2LDcgQEAKIAlpZiAoIW51bV9yc3ApCiAJCXJldHVybjsKIAotCWlmICh0ZXN0X2JpdChIQ0lfUEVSSU9ESUNfSU5RLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1BFUklPRElDX0lOUSkpCiAJCXJldHVybjsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKQEAgLTIyNTUsMTAgKzIyODcsMTAgQEAKIAkJaGNpX3Njb19zZXR1cChjb25uLCBldi0+c3RhdHVzKTsKIAogCWlmIChldi0+c3RhdHVzKSB7Ci0JCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBldi0+c3RhdHVzKTsKKwkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOwogCQloY2lfY29ubl9kZWwoY29ubik7CiAJfSBlbHNlIGlmIChldi0+bGlua190eXBlICE9IEFDTF9MSU5LKQotCQloY2lfcHJvdG9fY29ubmVjdF9jZm0oY29ubiwgZXYtPnN0YXR1cyk7CisJCWhjaV9jb25uZWN0X2NmbShjb25uLCBldi0+c3RhdHVzKTsKIAogdW5sb2NrOgogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwpAQCAtMjMwNCw4ICsyMzM2LDggQEAKIAkgKiBjb25uZWN0aW9uLiBUaGVzZSBmZWF0dXJlcyBhcmUgb25seSB0b3VjaGVkIHRocm91Z2ggbWdtdCBzbwogCSAqIG9ubHkgZG8gdGhlIGNoZWNrcyBpZiBIQ0lfTUdNVCBpcyBzZXQuCiAJICovCi0JaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgotCSAgICAhdGVzdF9iaXQoSENJX0NPTk5FQ1RBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkgJiYKKwkgICAgIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9DT05ORUNUQUJMRSkgJiYKIAkgICAgIWhjaV9iZGFkZHJfbGlzdF9sb29rdXAoJmhkZXYtPndoaXRlbGlzdCwgJmV2LT5iZGFkZHIsCiAJCQkJICAgIEJEQUREUl9CUkVEUikpIHsKIAkJICAgIGhjaV9yZWplY3RfY29ubihoZGV2LCAmZXYtPmJkYWRkcik7CkBAIC0yMzY2LDcgKzIzOTgsNyBAQAogCQkJICAgICAmY3ApOwogCX0gZWxzZSB7CiAJCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVDI7Ci0JCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCAwKTsKKwkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIDApOwogCX0KIH0KIApAQCAtMjQ0NCw3ICsyNDc2LDcgQEAKIAogCXR5cGUgPSBjb25uLT50eXBlOwogCi0JaGNpX3Byb3RvX2Rpc2Nvbm5fY2ZtKGNvbm4sIGV2LT5yZWFzb24pOworCWhjaV9kaXNjb25uX2NmbShjb25uLCBldi0+cmVhc29uKTsKIAloY2lfY29ubl9kZWwoY29ubik7CiAKIAkvKiBSZS1lbmFibGUgYWR2ZXJ0aXNpbmcgaWYgbmVjZXNzYXJ5LCBzaW5jZSBpdCBtaWdodApAQCAtMjUwMSw3ICsyNTMzLDcgQEAKIAkJCQkgICAgICZjcCk7CiAJCX0gZWxzZSB7CiAJCQljb25uLT5zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKLQkJCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBldi0+c3RhdHVzKTsKKwkJCWhjaV9jb25uZWN0X2NmbShjb25uLCBldi0+c3RhdHVzKTsKIAkJCWhjaV9jb25uX2Ryb3AoY29ubik7CiAJCX0KIAl9IGVsc2UgewpAQCAtMjU0Miw3ICsyNTc0LDcgQEAKIAogCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBBQ0xfTElOSywgJmV2LT5iZGFkZHIpOwogCi0JaWYgKCF0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpCiAJCWdvdG8gY2hlY2tfYXV0aDsKIAogCWlmIChldi0+c3RhdHVzID09IDApCkBAIC0yNjA4LDcgKzI2NDAsNyBAQAogCSAqIHdoZW5ldmVyIHRoZSBlbmNyeXB0aW9uIHByb2NlZHVyZSBmYWlscy4KIAkgKi8KIAlpZiAoZXYtPnN0YXR1cyAmJiBjb25uLT50eXBlID09IExFX0xJTkspCi0JCXNldF9iaXQoSENJX1JQQV9FWFBJUkVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfUlBBX0VYUElSRUQpOwogCiAJY2xlYXJfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmNvbm4tPmZsYWdzKTsKIApAQCAtMjYyNiwxNSArMjY1OCwxNSBAQAogCQkgKiBjb25uZWN0aW9ucyB0aGF0IGFyZSBub3QgZW5jcnlwdGVkIHdpdGggQUVTLUNDTQogCQkgKiB1c2luZyBhIFAtMjU2IGF1dGhlbnRpY2F0ZWQgY29tYmluYXRpb24ga2V5LgogCQkgKi8KLQkJaWYgKHRlc3RfYml0KEhDSV9TQ19PTkxZLCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgorCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NDX09OTFkpICYmCiAJCSAgICAoIXRlc3RfYml0KEhDSV9DT05OX0FFU19DQ00sICZjb25uLT5mbGFncykgfHwKIAkJICAgICBjb25uLT5rZXlfdHlwZSAhPSBIQ0lfTEtfQVVUSF9DT01CSU5BVElPTl9QMjU2KSkgewotCQkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIEhDSV9FUlJPUl9BVVRIX0ZBSUxVUkUpOworCQkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIEhDSV9FUlJPUl9BVVRIX0ZBSUxVUkUpOwogCQkJaGNpX2Nvbm5fZHJvcChjb25uKTsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CiAKLQkJaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOworCQloY2lfY29ubmVjdF9jZm0oY29ubiwgZXYtPnN0YXR1cyk7CiAJCWhjaV9jb25uX2Ryb3AoY29ubik7CiAJfSBlbHNlCiAJCWhjaV9lbmNyeXB0X2NmbShjb25uLCBldi0+c3RhdHVzLCBldi0+ZW5jcnlwdCk7CkBAIC0yNzA3LDcgKzI3MzksNyBAQAogCiAJaWYgKCFoY2lfb3V0Z29pbmdfYXV0aF9uZWVkZWQoaGRldiwgY29ubikpIHsKIAkJY29ubi0+c3RhdGUgPSBCVF9DT05ORUNURUQ7Ci0JCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBldi0+c3RhdHVzKTsKKwkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOwogCQloY2lfY29ubl9kcm9wKGNvbm4pOwogCX0KIApAQCAtMjcxNSwxNyArMjc0NywxOSBAQAogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCi1zdGF0aWMgdm9pZCBoY2lfY21kX2NvbXBsZXRlX2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIGhjaV9jbWRfY29tcGxldGVfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSB1MTYgKm9wY29kZSwgdTggKnN0YXR1cywKKwkJCQkgaGNpX3JlcV9jb21wbGV0ZV90ICpyZXFfY29tcGxldGUsCisJCQkJIGhjaV9yZXFfY29tcGxldGVfc2tiX3QgKnJlcV9jb21wbGV0ZV9za2IpCiB7CiAJc3RydWN0IGhjaV9ldl9jbWRfY29tcGxldGUgKmV2ID0gKHZvaWQgKikgc2tiLT5kYXRhOwotCXU4IHN0YXR1cyA9IHNrYi0+ZGF0YVtzaXplb2YoKmV2KV07Ci0JX191MTYgb3Bjb2RlOworCisJKm9wY29kZSA9IF9fbGUxNl90b19jcHUoZXYtPm9wY29kZSk7CisJKnN0YXR1cyA9IHNrYi0+ZGF0YVtzaXplb2YoKmV2KV07CiAKIAlza2JfcHVsbChza2IsIHNpemVvZigqZXYpKTsKIAotCW9wY29kZSA9IF9fbGUxNl90b19jcHUoZXYtPm9wY29kZSk7Ci0KLQlzd2l0Y2ggKG9wY29kZSkgeworCXN3aXRjaCAoKm9wY29kZSkgewogCWNhc2UgSENJX09QX0lOUVVJUllfQ0FOQ0VMOgogCQloY2lfY2NfaW5xdWlyeV9jYW5jZWwoaGRldiwgc2tiKTsKIAkJYnJlYWs7CkBAIC0zMDAzLDMyICszMDM3LDM2IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJQlRfREJHKCIlcyBvcGNvZGUgMHglNC40eCIsIGhkZXYtPm5hbWUsIG9wY29kZSk7CisJCUJUX0RCRygiJXMgb3Bjb2RlIDB4JTQuNHgiLCBoZGV2LT5uYW1lLCAqb3Bjb2RlKTsKIAkJYnJlYWs7CiAJfQogCi0JaWYgKG9wY29kZSAhPSBIQ0lfT1BfTk9QKQorCWlmICgqb3Bjb2RlICE9IEhDSV9PUF9OT1ApCiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmhkZXYtPmNtZF90aW1lcik7CiAKLQloY2lfcmVxX2NtZF9jb21wbGV0ZShoZGV2LCBvcGNvZGUsIHN0YXR1cyk7Ci0KLQlpZiAoZXYtPm5jbWQgJiYgIXRlc3RfYml0KEhDSV9SRVNFVCwgJmhkZXYtPmZsYWdzKSkgeworCWlmIChldi0+bmNtZCAmJiAhdGVzdF9iaXQoSENJX1JFU0VULCAmaGRldi0+ZmxhZ3MpKQogCQlhdG9taWNfc2V0KCZoZGV2LT5jbWRfY250LCAxKTsKLQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJmhkZXYtPmNtZF9xKSkKLQkJCXF1ZXVlX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+Y21kX3dvcmspOwotCX0KKworCWhjaV9yZXFfY21kX2NvbXBsZXRlKGhkZXYsICpvcGNvZGUsICpzdGF0dXMsIHJlcV9jb21wbGV0ZSwKKwkJCSAgICAgcmVxX2NvbXBsZXRlX3NrYik7CisKKwlpZiAoYXRvbWljX3JlYWQoJmhkZXYtPmNtZF9jbnQpICYmICFza2JfcXVldWVfZW1wdHkoJmhkZXYtPmNtZF9xKSkKKwkJcXVldWVfd29yayhoZGV2LT53b3JrcXVldWUsICZoZGV2LT5jbWRfd29yayk7CiB9CiAKLXN0YXRpYyB2b2lkIGhjaV9jbWRfc3RhdHVzX2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyB2b2lkIGhjaV9jbWRfc3RhdHVzX2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgICB1MTYgKm9wY29kZSwgdTggKnN0YXR1cywKKwkJCSAgICAgICBoY2lfcmVxX2NvbXBsZXRlX3QgKnJlcV9jb21wbGV0ZSwKKwkJCSAgICAgICBoY2lfcmVxX2NvbXBsZXRlX3NrYl90ICpyZXFfY29tcGxldGVfc2tiKQogewogCXN0cnVjdCBoY2lfZXZfY21kX3N0YXR1cyAqZXYgPSAodm9pZCAqKSBza2ItPmRhdGE7Ci0JX191MTYgb3Bjb2RlOwogCiAJc2tiX3B1bGwoc2tiLCBzaXplb2YoKmV2KSk7CiAKLQlvcGNvZGUgPSBfX2xlMTZfdG9fY3B1KGV2LT5vcGNvZGUpOworCSpvcGNvZGUgPSBfX2xlMTZfdG9fY3B1KGV2LT5vcGNvZGUpOworCSpzdGF0dXMgPSBldi0+c3RhdHVzOwogCi0Jc3dpdGNoIChvcGNvZGUpIHsKKwlzd2l0Y2ggKCpvcGNvZGUpIHsKIAljYXNlIEhDSV9PUF9JTlFVSVJZOgogCQloY2lfY3NfaW5xdWlyeShoZGV2LCBldi0+c3RhdHVzKTsKIAkJYnJlYWs7CkBAIC0zMDkzLDI3ICszMTMxLDM4IEBACiAJCWhjaV9jc19sZV9jcmVhdGVfY29ubihoZGV2LCBldi0+c3RhdHVzKTsKIAkJYnJlYWs7CiAKKwljYXNlIEhDSV9PUF9MRV9SRUFEX1JFTU9URV9GRUFUVVJFUzoKKwkJaGNpX2NzX2xlX3JlYWRfcmVtb3RlX2ZlYXR1cmVzKGhkZXYsIGV2LT5zdGF0dXMpOworCQlicmVhazsKKwogCWNhc2UgSENJX09QX0xFX1NUQVJUX0VOQzoKIAkJaGNpX2NzX2xlX3N0YXJ0X2VuYyhoZGV2LCBldi0+c3RhdHVzKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlCVF9EQkcoIiVzIG9wY29kZSAweCU0LjR4IiwgaGRldi0+bmFtZSwgb3Bjb2RlKTsKKwkJQlRfREJHKCIlcyBvcGNvZGUgMHglNC40eCIsIGhkZXYtPm5hbWUsICpvcGNvZGUpOwogCQlicmVhazsKIAl9CiAKLQlpZiAob3Bjb2RlICE9IEhDSV9PUF9OT1ApCisJaWYgKCpvcGNvZGUgIT0gSENJX09QX05PUCkKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaGRldi0+Y21kX3RpbWVyKTsKIAorCWlmIChldi0+bmNtZCAmJiAhdGVzdF9iaXQoSENJX1JFU0VULCAmaGRldi0+ZmxhZ3MpKQorCQlhdG9taWNfc2V0KCZoZGV2LT5jbWRfY250LCAxKTsKKworCS8qIEluZGljYXRlIHJlcXVlc3QgY29tcGxldGlvbiBpZiB0aGUgY29tbWFuZCBmYWlsZWQuIEFsc28sIGlmCisJICogd2UncmUgbm90IHdhaXRpbmcgZm9yIGEgc3BlY2lhbCBldmVudCBhbmQgd2UgZ2V0IGEgc3VjY2VzcworCSAqIGNvbW1hbmQgc3RhdHVzIHdlIHNob3VsZCB0cnkgdG8gZmxhZyB0aGUgcmVxdWVzdCBhcyBjb21wbGV0ZWQKKwkgKiAoc2luY2UgZm9yIHRoaXMga2luZCBvZiBjb21tYW5kcyB0aGVyZSB3aWxsIG5vdCBiZSBhIGNvbW1hbmQKKwkgKiBjb21wbGV0ZSBldmVudCkuCisJICovCiAJaWYgKGV2LT5zdGF0dXMgfHwKIAkgICAgKGhkZXYtPnNlbnRfY21kICYmICFidF9jYihoZGV2LT5zZW50X2NtZCktPnJlcS5ldmVudCkpCi0JCWhjaV9yZXFfY21kX2NvbXBsZXRlKGhkZXYsIG9wY29kZSwgZXYtPnN0YXR1cyk7CisJCWhjaV9yZXFfY21kX2NvbXBsZXRlKGhkZXYsICpvcGNvZGUsIGV2LT5zdGF0dXMsIHJlcV9jb21wbGV0ZSwKKwkJCQkgICAgIHJlcV9jb21wbGV0ZV9za2IpOwogCi0JaWYgKGV2LT5uY21kICYmICF0ZXN0X2JpdChIQ0lfUkVTRVQsICZoZGV2LT5mbGFncykpIHsKLQkJYXRvbWljX3NldCgmaGRldi0+Y21kX2NudCwgMSk7Ci0JCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZoZGV2LT5jbWRfcSkpCi0JCQlxdWV1ZV93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPmNtZF93b3JrKTsKLQl9CisJaWYgKGF0b21pY19yZWFkKCZoZGV2LT5jbWRfY250KSAmJiAhc2tiX3F1ZXVlX2VtcHR5KCZoZGV2LT5jbWRfcSkpCisJCXF1ZXVlX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+Y21kX3dvcmspOwogfQogCiBzdGF0aWMgdm9pZCBoY2lfaGFyZHdhcmVfZXJyb3JfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMzMzMSwxMSArMzM4MCwxMSBAQAogCQloY2lfY29ubl9kcm9wKGNvbm4pOwogCX0KIAotCWlmICghdGVzdF9iaXQoSENJX0JPTkRBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JPTkRBQkxFKSAmJgogCSAgICAhdGVzdF9iaXQoSENJX0NPTk5fQVVUSF9JTklUSUFUT1IsICZjb25uLT5mbGFncykpIHsKIAkJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9QSU5fQ09ERV9ORUdfUkVQTFksCiAJCQkgICAgIHNpemVvZihldi0+YmRhZGRyKSwgJmV2LT5iZGFkZHIpOwotCX0gZWxzZSBpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJfSBlbHNlIGlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpIHsKIAkJdTggc2VjdXJlOwogCiAJCWlmIChjb25uLT5wZW5kaW5nX3NlY19sZXZlbCA9PSBCVF9TRUNVUklUWV9ISUdIKQpAQCAtMzM5MSw3ICszNDQwLDcgQEAKIAogCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKIAotCWlmICghdGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpKQogCQlyZXR1cm47CiAKIAloY2lfZGV2X2xvY2soaGRldik7CkBAIC0zNDY1LDcgKzM1MTQsNyBAQAogCXNldF9iaXQoSENJX0NPTk5fTkVXX0xJTktfS0VZLCAmY29ubi0+ZmxhZ3MpOwogCWNvbm5fc2V0X2tleShjb25uLCBldi0+a2V5X3R5cGUsIGNvbm4tPnBpbl9sZW5ndGgpOwogCi0JaWYgKCF0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpCiAJCWdvdG8gdW5sb2NrOwogCiAJa2V5ID0gaGNpX2FkZF9saW5rX2tleShoZGV2LCBjb25uLCAmZXYtPmJkYWRkciwgZXYtPmxpbmtfa2V5LApAQCAtMzQ4Nyw3ICszNTM2LDcgQEAKIAkgKiBzdG9yZV9oaW50IGJlaW5nIDApLgogCSAqLwogCWlmIChrZXktPnR5cGUgPT0gSENJX0xLX0RFQlVHX0NPTUJJTkFUSU9OICYmCi0JICAgICF0ZXN0X2JpdChIQ0lfS0VFUF9ERUJVR19LRVlTLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0tFRVBfREVCVUdfS0VZUykpIHsKIAkJbGlzdF9kZWxfcmN1KCZrZXktPmxpc3QpOwogCQlrZnJlZV9yY3Uoa2V5LCByY3UpOwogCQlnb3RvIHVubG9jazsKQEAgLTM1NzAsNyArMzYxOSw3IEBACiAJaWYgKCFudW1fcnNwKQogCQlyZXR1cm47CiAKLQlpZiAodGVzdF9iaXQoSENJX1BFUklPRElDX0lOUSwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9QRVJJT0RJQ19JTlEpKQogCQlyZXR1cm47CiAKIAloY2lfZGV2X2xvY2soaGRldik7CkBAIC0zNjc5LDcgKzM3MjgsNyBAQAogCiAJaWYgKCFoY2lfb3V0Z29pbmdfYXV0aF9uZWVkZWQoaGRldiwgY29ubikpIHsKIAkJY29ubi0+c3RhdGUgPSBCVF9DT05ORUNURUQ7Ci0JCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBldi0+c3RhdHVzKTsKKwkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOwogCQloY2lfY29ubl9kcm9wKGNvbm4pOwogCX0KIApAQCAtMzczOCw3ICszNzg3LDcgQEAKIAkJYnJlYWs7CiAJfQogCi0JaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOworCWhjaV9jb25uZWN0X2NmbShjb25uLCBldi0+c3RhdHVzKTsKIAlpZiAoZXYtPnN0YXR1cykKIAkJaGNpX2Nvbm5fZGVsKGNvbm4pOwogCkBAIC0zNzc2LDcgKzM4MjUsNyBAQAogCWlmICghbnVtX3JzcCkKIAkJcmV0dXJuOwogCi0JaWYgKHRlc3RfYml0KEhDSV9QRVJJT0RJQ19JTlEsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfUEVSSU9ESUNfSU5RKSkKIAkJcmV0dXJuOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwpAQCAtMzc5NCw3ICszODQzLDcgQEAKIAkJZGF0YS5yc3NpCQk9IGluZm8tPnJzc2k7CiAJCWRhdGEuc3NwX21vZGUJCT0gMHgwMTsKIAotCQlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpKQogCQkJbmFtZV9rbm93biA9IGVpcl9oYXNfZGF0YV90eXBlKGluZm8tPmRhdGEsCiAJCQkJCQkgICAgICAgc2l6ZW9mKGluZm8tPmRhdGEpLAogCQkJCQkJICAgICAgIEVJUl9OQU1FX0NPTVBMRVRFKTsKQEAgLTM4NDksNyArMzg5OCw3IEBACiAJCWlmICghZXYtPnN0YXR1cykKIAkJCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVEVEOwogCi0JCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBldi0+c3RhdHVzKTsKKwkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOwogCQloY2lfY29ubl9kcm9wKGNvbm4pOwogCX0gZWxzZSB7CiAJCWhjaV9hdXRoX2NmbShjb25uLCBldi0+c3RhdHVzKTsKQEAgLTM4OTAsNDEgKzM5MzksMzcgQEAKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAweDAwOwogCi0JaWYgKGNvbm4tPm91dCB8fCB0ZXN0X2JpdChIQ0lfQ09OTl9SRU1PVEVfT09CLCAmY29ubi0+ZmxhZ3MpKSB7Ci0JCWlmIChicmVkcl9zY19lbmFibGVkKGhkZXYpKSB7Ci0JCQkvKiBXaGVuIFNlY3VyZSBDb25uZWN0aW9ucyBpcyBlbmFibGVkLCB0aGVuIGp1c3QKLQkJCSAqIHJldHVybiB0aGUgcHJlc2VudCB2YWx1ZSBzdG9yZWQgd2l0aCB0aGUgT09CCi0JCQkgKiBkYXRhLiBUaGUgc3RvcmVkIHZhbHVlIGNvbnRhaW5zIHRoZSByaWdodCBwcmVzZW50Ci0JCQkgKiBpbmZvcm1hdGlvbi4gSG93ZXZlciBpdCBjYW4gb25seSBiZSB0cnVzdGVkIHdoZW4KLQkJCSAqIG5vdCBpbiBTZWN1cmUgQ29ubmVjdGlvbiBPbmx5IG1vZGUuCi0JCQkgKi8KLQkJCWlmICghdGVzdF9iaXQoSENJX1NDX09OTFksICZoZGV2LT5kZXZfZmxhZ3MpKQotCQkJCXJldHVybiBkYXRhLT5wcmVzZW50OwotCi0JCQkvKiBXaGVuIFNlY3VyZSBDb25uZWN0aW9ucyBPbmx5IG1vZGUgaXMgZW5hYmxlZCwgdGhlbgotCQkJICogdGhlIFAtMjU2IHZhbHVlcyBhcmUgcmVxdWlyZWQuIElmIHRoZXkgYXJlIG5vdAotCQkJICogYXZhaWxhYmxlLCB0aGVuIGRvIG5vdCBkZWNsYXJlIHRoYXQgT09CIGRhdGEgaXMKLQkJCSAqIHByZXNlbnQuCi0JCQkgKi8KLQkJCWlmICghbWVtY21wKGRhdGEtPnJhbmQyNTYsIFpFUk9fS0VZLCAxNikgfHwKLQkJCSAgICAhbWVtY21wKGRhdGEtPmhhc2gyNTYsIFpFUk9fS0VZLCAxNikpCi0JCQkJcmV0dXJuIDB4MDA7Ci0KLQkJCXJldHVybiAweDAyOwotCQl9Ci0KLQkJLyogV2hlbiBTZWN1cmUgQ29ubmVjdGlvbnMgaXMgbm90IGVuYWJsZWQgb3IgYWN0dWFsbHkKLQkJICogbm90IHN1cHBvcnRlZCBieSB0aGUgaGFyZHdhcmUsIHRoZW4gY2hlY2sgdGhhdCBpZgotCQkgKiBQLTE5MiBkYXRhIHZhbHVlcyBhcmUgcHJlc2VudC4KKwlpZiAoYnJlZHJfc2NfZW5hYmxlZChoZGV2KSkgeworCQkvKiBXaGVuIFNlY3VyZSBDb25uZWN0aW9ucyBpcyBlbmFibGVkLCB0aGVuIGp1c3QKKwkJICogcmV0dXJuIHRoZSBwcmVzZW50IHZhbHVlIHN0b3JlZCB3aXRoIHRoZSBPT0IKKwkJICogZGF0YS4gVGhlIHN0b3JlZCB2YWx1ZSBjb250YWlucyB0aGUgcmlnaHQgcHJlc2VudAorCQkgKiBpbmZvcm1hdGlvbi4gSG93ZXZlciBpdCBjYW4gb25seSBiZSB0cnVzdGVkIHdoZW4KKwkJICogbm90IGluIFNlY3VyZSBDb25uZWN0aW9uIE9ubHkgbW9kZS4KIAkJICovCi0JCWlmICghbWVtY21wKGRhdGEtPnJhbmQxOTIsIFpFUk9fS0VZLCAxNikgfHwKLQkJICAgICFtZW1jbXAoZGF0YS0+aGFzaDE5MiwgWkVST19LRVksIDE2KSkKKwkJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU0NfT05MWSkpCisJCQlyZXR1cm4gZGF0YS0+cHJlc2VudDsKKworCQkvKiBXaGVuIFNlY3VyZSBDb25uZWN0aW9ucyBPbmx5IG1vZGUgaXMgZW5hYmxlZCwgdGhlbgorCQkgKiB0aGUgUC0yNTYgdmFsdWVzIGFyZSByZXF1aXJlZC4gSWYgdGhleSBhcmUgbm90CisJCSAqIGF2YWlsYWJsZSwgdGhlbiBkbyBub3QgZGVjbGFyZSB0aGF0IE9PQiBkYXRhIGlzCisJCSAqIHByZXNlbnQuCisJCSAqLworCQlpZiAoIW1lbWNtcChkYXRhLT5yYW5kMjU2LCBaRVJPX0tFWSwgMTYpIHx8CisJCSAgICAhbWVtY21wKGRhdGEtPmhhc2gyNTYsIFpFUk9fS0VZLCAxNikpCiAJCQlyZXR1cm4gMHgwMDsKIAotCQlyZXR1cm4gMHgwMTsKKwkJcmV0dXJuIDB4MDI7CiAJfQogCi0JcmV0dXJuIDB4MDA7CisJLyogV2hlbiBTZWN1cmUgQ29ubmVjdGlvbnMgaXMgbm90IGVuYWJsZWQgb3IgYWN0dWFsbHkKKwkgKiBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSwgdGhlbiBjaGVjayB0aGF0IGlmCisJICogUC0xOTIgZGF0YSB2YWx1ZXMgYXJlIHByZXNlbnQuCisJICovCisJaWYgKCFtZW1jbXAoZGF0YS0+cmFuZDE5MiwgWkVST19LRVksIDE2KSB8fAorCSAgICAhbWVtY21wKGRhdGEtPmhhc2gxOTIsIFpFUk9fS0VZLCAxNikpCisJCXJldHVybiAweDAwOworCisJcmV0dXJuIDB4MDE7CiB9CiAKIHN0YXRpYyB2b2lkIGhjaV9pb19jYXBhX3JlcXVlc3RfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMzk0MiwxMyArMzk4NywxMyBAQAogCiAJaGNpX2Nvbm5faG9sZChjb25uKTsKIAotCWlmICghdGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpKQogCQlnb3RvIHVubG9jazsKIAogCS8qIEFsbG93IHBhaXJpbmcgaWYgd2UncmUgcGFpcmFibGUsIHRoZSBpbml0aWF0b3JzIG9mIHRoZQogCSAqIHBhaXJpbmcgb3IgaWYgdGhlIHJlbW90ZSBpcyBub3QgcmVxdWVzdGluZyBib25kaW5nLgogCSAqLwotCWlmICh0ZXN0X2JpdChIQ0lfQk9OREFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpIHx8CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CT05EQUJMRSkgfHwKIAkgICAgdGVzdF9iaXQoSENJX0NPTk5fQVVUSF9JTklUSUFUT1IsICZjb25uLT5mbGFncykgfHwKIAkgICAgKGNvbm4tPnJlbW90ZV9hdXRoICYgfjB4MDEpID09IEhDSV9BVF9OT19CT05ESU5HKSB7CiAJCXN0cnVjdCBoY2lfY3BfaW9fY2FwYWJpbGl0eV9yZXBseSBjcDsKQEAgLTM5NzQsNyArNDAxOSw3IEBACiAJCS8qIElmIHdlJ3JlIG5vdCBib25kYWJsZSwgZm9yY2Ugb25lIG9mIHRoZSBub24tYm9uZGFibGUKIAkJICogYXV0aGVudGljYXRpb24gcmVxdWlyZW1lbnQgdmFsdWVzLgogCQkgKi8KLQkJaWYgKCF0ZXN0X2JpdChIQ0lfQk9OREFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpKQorCQlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CT05EQUJMRSkpCiAJCQljb25uLT5hdXRoX3R5cGUgJj0gSENJX0FUX05PX0JPTkRJTkdfTUlUTTsKIAogCQljcC5hdXRoZW50aWNhdGlvbiA9IGNvbm4tPmF1dGhfdHlwZTsKQEAgLTQwMTEsOCArNDA1Niw2IEBACiAKIAljb25uLT5yZW1vdGVfY2FwID0gZXYtPmNhcGFiaWxpdHk7CiAJY29ubi0+cmVtb3RlX2F1dGggPSBldi0+YXV0aGVudGljYXRpb247Ci0JaWYgKGV2LT5vb2JfZGF0YSkKLQkJc2V0X2JpdChIQ0lfQ09OTl9SRU1PVEVfT09CLCAmY29ubi0+ZmxhZ3MpOwogCiB1bmxvY2s6CiAJaGNpX2Rldl91bmxvY2soaGRldik7CkBAIC00MDI5LDcgKzQwNzIsNyBAQAogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JaWYgKCF0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpCiAJCWdvdG8gdW5sb2NrOwogCiAJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIEFDTF9MSU5LLCAmZXYtPmJkYWRkcik7CkBAIC00MTAwLDcgKzQxNDMsNyBAQAogCiAJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpKQogCQltZ210X3VzZXJfcGFzc2tleV9yZXF1ZXN0KGhkZXYsICZldi0+YmRhZGRyLCBBQ0xfTElOSywgMCk7CiB9CiAKQEAgLTQxMTksNyArNDE2Miw3IEBACiAJY29ubi0+cGFzc2tleV9ub3RpZnkgPSBfX2xlMzJfdG9fY3B1KGV2LT5wYXNza2V5KTsKIAljb25uLT5wYXNza2V5X2VudGVyZWQgPSAwOwogCi0JaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpKQogCQltZ210X3VzZXJfcGFzc2tleV9ub3RpZnkoaGRldiwgJmNvbm4tPmRzdCwgY29ubi0+dHlwZSwKIAkJCQkJIGNvbm4tPmRzdF90eXBlLCBjb25uLT5wYXNza2V5X25vdGlmeSwKIAkJCQkJIGNvbm4tPnBhc3NrZXlfZW50ZXJlZCk7CkBAIC00MTU3LDcgKzQyMDAsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpKQogCQltZ210X3VzZXJfcGFzc2tleV9ub3RpZnkoaGRldiwgJmNvbm4tPmRzdCwgY29ubi0+dHlwZSwKIAkJCQkJIGNvbm4tPmRzdF90eXBlLCBjb25uLT5wYXNza2V5X25vdGlmeSwKIAkJCQkJIGNvbm4tPnBhc3NrZXlfZW50ZXJlZCk7CkBAIC00MjI2LDcgKzQyNjksNyBAQAogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JaWYgKCF0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpCiAJCWdvdG8gdW5sb2NrOwogCiAJZGF0YSA9IGhjaV9maW5kX3JlbW90ZV9vb2JfZGF0YShoZGV2LCAmZXYtPmJkYWRkciwgQkRBRERSX0JSRURSKTsKQEAgLTQyNDMsNyArNDI4Niw3IEBACiAJCXN0cnVjdCBoY2lfY3BfcmVtb3RlX29vYl9leHRfZGF0YV9yZXBseSBjcDsKIAogCQliYWNweSgmY3AuYmRhZGRyLCAmZXYtPmJkYWRkcik7Ci0JCWlmICh0ZXN0X2JpdChIQ0lfU0NfT05MWSwgJmhkZXYtPmRldl9mbGFncykpIHsKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TQ19PTkxZKSkgewogCQkJbWVtc2V0KGNwLmhhc2gxOTIsIDAsIHNpemVvZihjcC5oYXNoMTkyKSk7CiAJCQltZW1zZXQoY3AucmFuZDE5MiwgMCwgc2l6ZW9mKGNwLnJhbmQxOTIpKTsKIAkJfSBlbHNlIHsKQEAgLTQ0MDksNyArNDQ1Miw3IEBACiAJLyogQWxsIGNvbnRyb2xsZXJzIGltcGxpY2l0bHkgc3RvcCBhZHZlcnRpc2luZyBpbiB0aGUgZXZlbnQgb2YgYQogCSAqIGNvbm5lY3Rpb24sIHNvIGVuc3VyZSB0aGF0IHRoZSBzdGF0ZSBiaXQgaXMgY2xlYXJlZC4KIAkgKi8KLQljbGVhcl9iaXQoSENJX0xFX0FEViwgJmhkZXYtPmRldl9mbGFncyk7CisJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9MRV9BRFYpOwogCiAJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX3N0YXRlKGhkZXYsIExFX0xJTkssIEJUX0NPTk5FQ1QpOwogCWlmICghY29ubikgewpAQCAtNDQzMiw3ICs0NDc1LDcgQEAKIAkJaWYgKGNvbm4tPm91dCkgewogCQkJY29ubi0+cmVzcF9hZGRyX3R5cGUgPSBldi0+YmRhZGRyX3R5cGU7CiAJCQliYWNweSgmY29ubi0+cmVzcF9hZGRyLCAmZXYtPmJkYWRkcik7Ci0JCQlpZiAodGVzdF9iaXQoSENJX1BSSVZBQ1ksICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1BSSVZBQ1kpKSB7CiAJCQkJY29ubi0+aW5pdF9hZGRyX3R5cGUgPSBBRERSX0xFX0RFVl9SQU5ET007CiAJCQkJYmFjcHkoJmNvbm4tPmluaXRfYWRkciwgJmhkZXYtPnJwYSk7CiAJCQl9IGVsc2UgewpAQCAtNDUwMyw3ICs0NTQ2LDcgQEAKIAogCWNvbm4tPnNlY19sZXZlbCA9IEJUX1NFQ1VSSVRZX0xPVzsKIAljb25uLT5oYW5kbGUgPSBfX2xlMTZfdG9fY3B1KGV2LT5oYW5kbGUpOwotCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVEVEOworCWNvbm4tPnN0YXRlID0gQlRfQ09ORklHOwogCiAJY29ubi0+bGVfY29ubl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGV2LT5pbnRlcnZhbCk7CiAJY29ubi0+bGVfY29ubl9sYXRlbmN5ID0gbGUxNl90b19jcHUoZXYtPmxhdGVuY3kpOwpAQCAtNDUxMiw3ICs0NTU1LDMzIEBACiAJaGNpX2RlYnVnZnNfY3JlYXRlX2Nvbm4oY29ubik7CiAJaGNpX2Nvbm5fYWRkX3N5c2ZzKGNvbm4pOwogCi0JaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOworCWlmICghZXYtPnN0YXR1cykgeworCQkvKiBUaGUgcmVtb3RlIGZlYXR1cmVzIHByb2NlZHVyZSBpcyBkZWZpbmVkIGZvciBtYXN0ZXIKKwkJICogcm9sZSBvbmx5LiBTbyBvbmx5IGluIGNhc2Ugb2YgYW4gaW5pdGlhdGVkIGNvbm5lY3Rpb24KKwkJICogcmVxdWVzdCB0aGUgcmVtb3RlIGZlYXR1cmVzLgorCQkgKgorCQkgKiBJZiB0aGUgbG9jYWwgY29udHJvbGxlciBzdXBwb3J0cyBzbGF2ZS1pbml0aWF0ZWQgZmVhdHVyZXMKKwkJICogZXhjaGFuZ2UsIHRoZW4gcmVxdWVzdGluZyB0aGUgcmVtb3RlIGZlYXR1cmVzIGluIHNsYXZlCisJCSAqIHJvbGUgaXMgcG9zc2libGUuIE90aGVyd2lzZSBqdXN0IHRyYW5zaXRpb24gaW50byB0aGUKKwkJICogY29ubmVjdGVkIHN0YXRlIHdpdGhvdXQgcmVxdWVzdGluZyB0aGUgcmVtb3RlIGZlYXR1cmVzLgorCQkgKi8KKwkJaWYgKGNvbm4tPm91dCB8fAorCQkgICAgKGhkZXYtPmxlX2ZlYXR1cmVzWzBdICYgSENJX0xFX1NMQVZFX0ZFQVRVUkVTKSkgeworCQkJc3RydWN0IGhjaV9jcF9sZV9yZWFkX3JlbW90ZV9mZWF0dXJlcyBjcDsKKworCQkJY3AuaGFuZGxlID0gX19jcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCisJCQloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX0xFX1JFQURfUkVNT1RFX0ZFQVRVUkVTLAorCQkJCSAgICAgc2l6ZW9mKGNwKSwgJmNwKTsKKworCQkJaGNpX2Nvbm5faG9sZChjb25uKTsKKwkJfSBlbHNlIHsKKwkJCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVEVEOworCQkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOworCQl9CisJfSBlbHNlIHsKKwkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIGV2LT5zdGF0dXMpOworCX0KIAogCXBhcmFtcyA9IGhjaV9wZW5kX2xlX2FjdGlvbl9sb29rdXAoJmhkZXYtPnBlbmRfbGVfY29ubnMsICZjb25uLT5kc3QsCiAJCQkJCSAgIGNvbm4tPmRzdF90eXBlKTsKQEAgLTQ2NTgsNyArNDcyNyw3IEBACiAJCS8qIElmIHRoZSBjb250cm9sbGVyIGlzIG5vdCB1c2luZyByZXNvbHZhYmxlIHJhbmRvbQogCQkgKiBhZGRyZXNzZXMsIHRoZW4gdGhpcyByZXBvcnQgY2FuIGJlIGlnbm9yZWQuCiAJCSAqLwotCQlpZiAoIXRlc3RfYml0KEhDSV9QUklWQUNZLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwkJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfUFJJVkFDWSkpCiAJCQlyZXR1cm47CiAKIAkJLyogSWYgdGhlIGxvY2FsIElSSyBvZiB0aGUgY29udHJvbGxlciBkb2VzIG5vdCBtYXRjaApAQCAtNDgxNCw2ICs0ODgzLDQ4IEBACiAJaGNpX2Rldl91bmxvY2soaGRldik7CiB9CiAKK3N0YXRpYyB2b2lkIGhjaV9sZV9yZW1vdGVfZmVhdF9jb21wbGV0ZV9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZXZfbGVfcmVtb3RlX2ZlYXRfY29tcGxldGUgKmV2ID0gKHZvaWQgKilza2ItPmRhdGE7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCisJQlRfREJHKCIlcyBzdGF0dXMgMHglMi4yeCIsIGhkZXYtPm5hbWUsIGV2LT5zdGF0dXMpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2hhbmRsZShoZGV2LCBfX2xlMTZfdG9fY3B1KGV2LT5oYW5kbGUpKTsKKwlpZiAoY29ubikgeworCQlpZiAoIWV2LT5zdGF0dXMpCisJCQltZW1jcHkoY29ubi0+ZmVhdHVyZXNbMF0sIGV2LT5mZWF0dXJlcywgOCk7CisKKwkJaWYgKGNvbm4tPnN0YXRlID09IEJUX0NPTkZJRykgeworCQkJX191OCBzdGF0dXM7CisKKwkJCS8qIElmIHRoZSBsb2NhbCBjb250cm9sbGVyIHN1cHBvcnRzIHNsYXZlLWluaXRpYXRlZAorCQkJICogZmVhdHVyZXMgZXhjaGFuZ2UsIGJ1dCB0aGUgcmVtb3RlIGNvbnRyb2xsZXIgZG9lcworCQkJICogbm90LCB0aGVuIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGVycm9yIGNvZGUgMHgxYQorCQkJICogZm9yIHVuc3VwcG9ydGVkIHJlbW90ZSBmZWF0dXJlIGdldHMgcmV0dXJuZWQuCisJCQkgKgorCQkJICogSW4gdGhpcyBzcGVjaWZpYyBjYXNlLCBhbGxvdyB0aGUgY29ubmVjdGlvbiB0bworCQkJICogdHJhbnNpdGlvbiBpbnRvIGNvbm5lY3RlZCBzdGF0ZSBhbmQgbWFyayBpdCBhcworCQkJICogc3VjY2Vzc2Z1bC4KKwkJCSAqLworCQkJaWYgKChoZGV2LT5sZV9mZWF0dXJlc1swXSAmIEhDSV9MRV9TTEFWRV9GRUFUVVJFUykgJiYKKwkJCSAgICAhY29ubi0+b3V0ICYmIGV2LT5zdGF0dXMgPT0gMHgxYSkKKwkJCQlzdGF0dXMgPSAweDAwOworCQkJZWxzZQorCQkJCXN0YXR1cyA9IGV2LT5zdGF0dXM7CisKKwkJCWNvbm4tPnN0YXRlID0gQlRfQ09OTkVDVEVEOworCQkJaGNpX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CisJCQloY2lfY29ubl9kcm9wKGNvbm4pOworCQl9CisJfQorCisJaGNpX2Rldl91bmxvY2soaGRldik7Cit9CisKIHN0YXRpYyB2b2lkIGhjaV9sZV9sdGtfcmVxdWVzdF9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGhjaV9ldl9sZV9sdGtfcmVxICpldiA9ICh2b2lkICopIHNrYi0+ZGF0YTsKQEAgLTQ5ODcsNiArNTA5OCwxMCBAQAogCQloY2lfbGVfYWR2X3JlcG9ydF9ldnQoaGRldiwgc2tiKTsKIAkJYnJlYWs7CiAKKwljYXNlIEhDSV9FVl9MRV9SRU1PVEVfRkVBVF9DT01QTEVURToKKwkJaGNpX2xlX3JlbW90ZV9mZWF0X2NvbXBsZXRlX2V2dChoZGV2LCBza2IpOworCQlicmVhazsKKwogCWNhc2UgSENJX0VWX0xFX0xUS19SRVE6CiAJCWhjaV9sZV9sdGtfcmVxdWVzdF9ldnQoaGRldiwgc2tiKTsKIAkJYnJlYWs7CkBAIC01MDIwLDMyICs1MTM1LDc5IEBACiAJYW1wX3JlYWRfbG9jX2Fzc29jX2ZpbmFsX2RhdGEoaGRldiwgaGNvbik7CiB9CiAKK3N0YXRpYyBib29sIGhjaV9nZXRfY21kX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1MTYgb3Bjb2RlLAorCQkJCSB1OCBldmVudCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX2V2X2NtZF9jb21wbGV0ZSAqZXY7CisJc3RydWN0IGhjaV9ldmVudF9oZHIgKmhkcjsKKworCWlmICghc2tiKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc2tiLT5sZW4gPCBzaXplb2YoKmhkcikpIHsKKwkJQlRfRVJSKCJUb28gc2hvcnQgSENJIGV2ZW50Iik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwloZHIgPSAodm9pZCAqKSBza2ItPmRhdGE7CisJc2tiX3B1bGwoc2tiLCBIQ0lfRVZFTlRfSERSX1NJWkUpOworCisJaWYgKGV2ZW50KSB7CisJCWlmIChoZHItPmV2dCAhPSBldmVudCkKKwkJCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJaWYgKGhkci0+ZXZ0ICE9IEhDSV9FVl9DTURfQ09NUExFVEUpIHsKKwkJQlRfREJHKCJMYXN0IGV2ZW50IGlzIG5vdCBjbWQgY29tcGxldGUgKDB4JTIuMngpIiwgaGRyLT5ldnQpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCpldikpIHsKKwkJQlRfRVJSKCJUb28gc2hvcnQgY21kX2NvbXBsZXRlIGV2ZW50Iik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlldiA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKwlza2JfcHVsbChza2IsIHNpemVvZigqZXYpKTsKKworCWlmIChvcGNvZGUgIT0gX19sZTE2X3RvX2NwdShldi0+b3Bjb2RlKSkgeworCQlCVF9EQkcoIm9wY29kZSBkb2Vzbid0IG1hdGNoICgweCUyLjJ4ICE9IDB4JTIuMngpIiwgb3Bjb2RlLAorCQkgICAgICAgX19sZTE2X3RvX2NwdShldi0+b3Bjb2RlKSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBoY2lfZXZlbnRfcGFja2V0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBoY2lfZXZlbnRfaGRyICpoZHIgPSAodm9pZCAqKSBza2ItPmRhdGE7Ci0JX191OCBldmVudCA9IGhkci0+ZXZ0OwotCi0JaGNpX2Rldl9sb2NrKGhkZXYpOwotCi0JLyogUmVjZWl2ZWQgZXZlbnRzIGFyZSAoY3VycmVudGx5KSBvbmx5IG5lZWRlZCB3aGVuIGEgcmVxdWVzdCBpcwotCSAqIG9uZ29pbmcgc28gYXZvaWQgdW5uZWNlc3NhcnkgbWVtb3J5IGFsbG9jYXRpb24uCi0JICovCi0JaWYgKGhjaV9yZXFfcGVuZGluZyhoZGV2KSkgewotCQlrZnJlZV9za2IoaGRldi0+cmVjdl9ldnQpOwotCQloZGV2LT5yZWN2X2V2dCA9IHNrYl9jbG9uZShza2IsIEdGUF9LRVJORUwpOwotCX0KLQotCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwotCi0Jc2tiX3B1bGwoc2tiLCBIQ0lfRVZFTlRfSERSX1NJWkUpOworCWhjaV9yZXFfY29tcGxldGVfdCByZXFfY29tcGxldGUgPSBOVUxMOworCWhjaV9yZXFfY29tcGxldGVfc2tiX3QgcmVxX2NvbXBsZXRlX3NrYiA9IE5VTEw7CisJc3RydWN0IHNrX2J1ZmYgKm9yaWdfc2tiID0gTlVMTDsKKwl1OCBzdGF0dXMgPSAwLCBldmVudCA9IGhkci0+ZXZ0LCByZXFfZXZ0ID0gMDsKKwl1MTYgb3Bjb2RlID0gSENJX09QX05PUDsKIAogCWlmIChoZGV2LT5zZW50X2NtZCAmJiBidF9jYihoZGV2LT5zZW50X2NtZCktPnJlcS5ldmVudCA9PSBldmVudCkgewogCQlzdHJ1Y3QgaGNpX2NvbW1hbmRfaGRyICpjbWRfaGRyID0gKHZvaWQgKikgaGRldi0+c2VudF9jbWQtPmRhdGE7Ci0JCXUxNiBvcGNvZGUgPSBfX2xlMTZfdG9fY3B1KGNtZF9oZHItPm9wY29kZSk7Ci0KLQkJaGNpX3JlcV9jbWRfY29tcGxldGUoaGRldiwgb3Bjb2RlLCAwKTsKKwkJb3Bjb2RlID0gX19sZTE2X3RvX2NwdShjbWRfaGRyLT5vcGNvZGUpOworCQloY2lfcmVxX2NtZF9jb21wbGV0ZShoZGV2LCBvcGNvZGUsIHN0YXR1cywgJnJlcV9jb21wbGV0ZSwKKwkJCQkgICAgICZyZXFfY29tcGxldGVfc2tiKTsKKwkJcmVxX2V2dCA9IGV2ZW50OwogCX0KIAorCS8qIElmIGl0IGxvb2tzIGxpa2Ugd2UgbWlnaHQgZW5kIHVwIGhhdmluZyB0byBjYWxsCisJICogcmVxX2NvbXBsZXRlX3NrYiwgc3RvcmUgYSBwcmlzdGluZSBjb3B5IG9mIHRoZSBza2Igc2luY2UgdGhlCisJICogdmFyaW91cyBoYW5kbGVycyBtYXkgbW9kaWZ5IHRoZSBvcmlnaW5hbCBvbmUgdGhyb3VnaAorCSAqIHNrYl9wdWxsKCkgY2FsbHMsIGV0Yy4KKwkgKi8KKwlpZiAocmVxX2NvbXBsZXRlX3NrYiB8fCBldmVudCA9PSBIQ0lfRVZfQ01EX1NUQVRVUyB8fAorCSAgICBldmVudCA9PSBIQ0lfRVZfQ01EX0NPTVBMRVRFKQorCQlvcmlnX3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9LRVJORUwpOworCisJc2tiX3B1bGwoc2tiLCBIQ0lfRVZFTlRfSERSX1NJWkUpOworCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgSENJX0VWX0lOUVVJUllfQ09NUExFVEU6CiAJCWhjaV9pbnF1aXJ5X2NvbXBsZXRlX2V2dChoZGV2LCBza2IpOwpAQCAtNTA4OCwxMSArNTI1MCwxMyBAQAogCQlicmVhazsKIAogCWNhc2UgSENJX0VWX0NNRF9DT01QTEVURToKLQkJaGNpX2NtZF9jb21wbGV0ZV9ldnQoaGRldiwgc2tiKTsKKwkJaGNpX2NtZF9jb21wbGV0ZV9ldnQoaGRldiwgc2tiLCAmb3Bjb2RlLCAmc3RhdHVzLAorCQkJCSAgICAgJnJlcV9jb21wbGV0ZSwgJnJlcV9jb21wbGV0ZV9za2IpOwogCQlicmVhazsKIAogCWNhc2UgSENJX0VWX0NNRF9TVEFUVVM6Ci0JCWhjaV9jbWRfc3RhdHVzX2V2dChoZGV2LCBza2IpOworCQloY2lfY21kX3N0YXR1c19ldnQoaGRldiwgc2tiLCAmb3Bjb2RlLCAmc3RhdHVzLCAmcmVxX2NvbXBsZXRlLAorCQkJCSAgICZyZXFfY29tcGxldGVfc2tiKTsKIAkJYnJlYWs7CiAKIAljYXNlIEhDSV9FVl9IQVJEV0FSRV9FUlJPUjoKQEAgLTUyMjQsNiArNTM4OCwxNyBAQAogCQlicmVhazsKIAl9CiAKKwlpZiAocmVxX2NvbXBsZXRlKSB7CisJCXJlcV9jb21wbGV0ZShoZGV2LCBzdGF0dXMsIG9wY29kZSk7CisJfSBlbHNlIGlmIChyZXFfY29tcGxldGVfc2tiKSB7CisJCWlmICghaGNpX2dldF9jbWRfY29tcGxldGUoaGRldiwgb3Bjb2RlLCByZXFfZXZ0LCBvcmlnX3NrYikpIHsKKwkJCWtmcmVlX3NrYihvcmlnX3NrYik7CisJCQlvcmlnX3NrYiA9IE5VTEw7CisJCX0KKwkJcmVxX2NvbXBsZXRlX3NrYihoZGV2LCBzdGF0dXMsIG9wY29kZSwgb3JpZ19za2IpOworCX0KKworCWtmcmVlX3NrYihvcmlnX3NrYik7CiAJa2ZyZWVfc2tiKHNrYik7CiAJaGRldi0+c3RhdC5ldnRfcngrKzsKIH0KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX3JlcXVlc3QuYyBiL25ldC9ibHVldG9vdGgvaGNpX3JlcXVlc3QuYwppbmRleCBiNTlmOTJjLi5kNjAyNWQ2IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9yZXF1ZXN0LmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfcmVxdWVzdC5jCkBAIC0zNCw3ICszNCw4IEBACiAJcmVxLT5lcnIgPSAwOwogfQogCi1pbnQgaGNpX3JlcV9ydW4oc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsIGhjaV9yZXFfY29tcGxldGVfdCBjb21wbGV0ZSkKK3N0YXRpYyBpbnQgcmVxX3J1bihzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSwgaGNpX3JlcV9jb21wbGV0ZV90IGNvbXBsZXRlLAorCQkgICBoY2lfcmVxX2NvbXBsZXRlX3NrYl90IGNvbXBsZXRlX3NrYikKIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IHJlcS0+aGRldjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtNTYsNiArNTcsNyBAQAogCiAJc2tiID0gc2tiX3BlZWtfdGFpbCgmcmVxLT5jbWRfcSk7CiAJYnRfY2Ioc2tiKS0+cmVxLmNvbXBsZXRlID0gY29tcGxldGU7CisJYnRfY2Ioc2tiKS0+cmVxLmNvbXBsZXRlX3NrYiA9IGNvbXBsZXRlX3NrYjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZoZGV2LT5jbWRfcS5sb2NrLCBmbGFncyk7CiAJc2tiX3F1ZXVlX3NwbGljZV90YWlsKCZyZXEtPmNtZF9xLCAmaGRldi0+Y21kX3EpOwpAQCAtNjYsNiArNjgsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGhjaV9yZXFfcnVuKHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLCBoY2lfcmVxX2NvbXBsZXRlX3QgY29tcGxldGUpCit7CisJcmV0dXJuIHJlcV9ydW4ocmVxLCBjb21wbGV0ZSwgTlVMTCk7Cit9CisKK2ludCBoY2lfcmVxX3J1bl9za2Ioc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsIGhjaV9yZXFfY29tcGxldGVfc2tiX3QgY29tcGxldGUpCit7CisJcmV0dXJuIHJlcV9ydW4ocmVxLCBOVUxMLCBjb21wbGV0ZSk7Cit9CisKIHN0cnVjdCBza19idWZmICpoY2lfcHJlcGFyZV9jbWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHUxNiBvcGNvZGUsIHUzMiBwbGVuLAogCQkJCWNvbnN0IHZvaWQgKnBhcmFtKQogewpAQCAtMjcwLDcgKzI4Miw3IEBACiAJICogYW5kIDB4MDEgKHdoaXRlbGlzdCBlbmFibGVkKSB1c2UgdGhlIG5ldyBmaWx0ZXIgcG9saWNpZXMKIAkgKiAweDAyIChubyB3aGl0ZWxpc3QpIGFuZCAweDAzICh3aGl0ZWxpc3QgZW5hYmxlZCkuCiAJICovCi0JaWYgKHRlc3RfYml0KEhDSV9QUklWQUNZLCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfUFJJVkFDWSkgJiYKIAkgICAgKGhkZXYtPmxlX2ZlYXR1cmVzWzBdICYgSENJX0xFX0VYVF9TQ0FOX1BPTElDWSkpCiAJCWZpbHRlcl9wb2xpY3kgfD0gMHgwMjsKIApAQCAtMzA0LDEwICszMTYsMTAgQEAKIAkgKiBJbiB0aGlzIGtpbmQgb2Ygc2NlbmFyaW8gc2tpcCB0aGUgdXBkYXRlIGFuZCBsZXQgdGhlIHJhbmRvbQogCSAqIGFkZHJlc3MgYmUgdXBkYXRlZCBhdCB0aGUgbmV4dCBjeWNsZS4KIAkgKi8KLQlpZiAodGVzdF9iaXQoSENJX0xFX0FEViwgJmhkZXYtPmRldl9mbGFncykgfHwKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0FEVikgfHwKIAkgICAgaGNpX2Nvbm5faGFzaF9sb29rdXBfc3RhdGUoaGRldiwgTEVfTElOSywgQlRfQ09OTkVDVCkpIHsKIAkJQlRfREJHKCJEZWZlcnJpbmcgcmFuZG9tIGFkZHJlc3MgdXBkYXRlIik7Ci0JCXNldF9iaXQoSENJX1JQQV9FWFBJUkVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfUlBBX0VYUElSRUQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0zMjQsMTIgKzMzNiwxMiBAQAogCSAqIGN1cnJlbnQgUlBBIGhhcyBleHBpcmVkIG9yIHRoZXJlIGlzIHNvbWV0aGluZyBlbHNlIHRoYW4KIAkgKiB0aGUgY3VycmVudCBSUEEgaW4gdXNlLCB0aGVuIGdlbmVyYXRlIGEgbmV3IG9uZS4KIAkgKi8KLQlpZiAodGVzdF9iaXQoSENJX1BSSVZBQ1ksICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9QUklWQUNZKSkgewogCQlpbnQgdG87CiAKIAkJKm93bl9hZGRyX3R5cGUgPSBBRERSX0xFX0RFVl9SQU5ET007CiAKLQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX1JQQV9FWFBJUkVELCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgorCQlpZiAoIWhjaV9kZXZfdGVzdF9hbmRfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfUlBBX0VYUElSRUQpICYmCiAJCSAgICAhYmFjbXAoJmhkZXYtPnJhbmRvbV9hZGRyLCAmaGRldi0+cnBhKSkKIAkJCXJldHVybiAwOwogCkBAIC0zODMsOSArMzk1LDkgQEAKIAkgKiBhbmQgYSBzdGF0aWMgYWRkcmVzcyBoYXMgYmVlbiBjb25maWd1cmVkLCB0aGVuIHVzZSB0aGF0CiAJICogYWRkcmVzcyBpbnN0ZWFkIG9mIHRoZSBwdWJsaWMgQlIvRURSIGFkZHJlc3MuCiAJICovCi0JaWYgKHRlc3RfYml0KEhDSV9GT1JDRV9TVEFUSUNfQUREUiwgJmhkZXYtPmRiZ19mbGFncykgfHwKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0ZPUkNFX1NUQVRJQ19BRERSKSB8fAogCSAgICAhYmFjbXAoJmhkZXYtPmJkYWRkciwgQkRBRERSX0FOWSkgfHwKLQkgICAgKCF0ZXN0X2JpdChIQ0lfQlJFRFJfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykgJiYKKwkgICAgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCkgJiYKIAkgICAgIGJhY21wKCZoZGV2LT5zdGF0aWNfYWRkciwgQkRBRERSX0FOWSkpKSB7CiAJCSpvd25fYWRkcl90eXBlID0gQUREUl9MRV9ERVZfUkFORE9NOwogCQlpZiAoYmFjbXAoJmhkZXYtPnN0YXRpY19hZGRyLCAmaGRldi0+cmFuZG9tX2FkZHIpKQpAQCAtNDI1LDcgKzQzNyw3IEBACiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSByZXEtPmhkZXY7CiAJdTggc2NhbjsKIAotCWlmICghdGVzdF9iaXQoSENJX0JSRURSX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpKQogCQlyZXR1cm47CiAKIAlpZiAoIWhkZXZfaXNfcG93ZXJlZChoZGV2KSkKQEAgLTQzNCw3ICs0NDYsNyBAQAogCWlmIChtZ210X3Bvd2VyaW5nX2Rvd24oaGRldikpCiAJCXJldHVybjsKIAotCWlmICh0ZXN0X2JpdChIQ0lfQ09OTkVDVEFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpIHx8CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9DT05ORUNUQUJMRSkgfHwKIAkgICAgZGlzY29ubmVjdGVkX3doaXRlbGlzdF9lbnRyaWVzKGhkZXYpKQogCQlzY2FuID0gU0NBTl9QQUdFOwogCWVsc2UKQEAgLTQ0Myw3ICs0NTUsNyBAQAogCWlmICh0ZXN0X2JpdChIQ0lfUFNDQU4sICZoZGV2LT5mbGFncykgPT0gISEoc2NhbiAmIFNDQU5fUEFHRSkpCiAJCXJldHVybjsKIAotCWlmICh0ZXN0X2JpdChIQ0lfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0RJU0NPVkVSQUJMRSkpCiAJCXNjYW4gfD0gU0NBTl9JTlFVSVJZOwogCiAJaGNpX3JlcV9hZGQocmVxLCBIQ0lfT1BfV1JJVEVfU0NBTl9FTkFCTEUsIDEsICZzY2FuKTsKQEAgLTQ3MSwxNCArNDgzLDE0IEBACiAKIAlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChIQ0lfSU5JVCwgJmhkZXYtPmZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChIQ0lfU0VUVVAsICZoZGV2LT5kZXZfZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KEhDSV9DT05GSUcsICZoZGV2LT5kZXZfZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmRldl9mbGFncykgfHwKLQkgICAgdGVzdF9iaXQoSENJX1VOUkVHSVNURVIsICZoZGV2LT5kZXZfZmxhZ3MpKQorCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU0VUVVApIHx8CisJICAgIGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9DT05GSUcpIHx8CisJICAgIGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9BVVRPX09GRikgfHwKKwkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1VOUkVHSVNURVIpKQogCQlyZXR1cm47CiAKIAkvKiBObyBwb2ludCBpbiBkb2luZyBzY2FubmluZyBpZiBMRSBzdXBwb3J0IGhhc24ndCBiZWVuIGVuYWJsZWQgKi8KLQlpZiAoIXRlc3RfYml0KEhDSV9MRV9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9FTkFCTEVEKSkKIAkJcmV0dXJuOwogCiAJLyogSWYgZGlzY292ZXJ5IGlzIGFjdGl2ZSBkb24ndCBpbnRlcmZlcmUgd2l0aCBpdCAqLwpAQCAtNTAyLDcgKzUxNCw3IEBACiAJCSAqLwogCiAJCS8qIElmIGNvbnRyb2xsZXIgaXMgbm90IHNjYW5uaW5nIHdlIGFyZSBkb25lLiAqLwotCQlpZiAoIXRlc3RfYml0KEhDSV9MRV9TQ0FOLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwkJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTEVfU0NBTikpCiAJCQlyZXR1cm47CiAKIAkJaGNpX3JlcV9hZGRfbGVfc2Nhbl9kaXNhYmxlKHJlcSk7CkBAIC01MjQsNyArNTM2LDcgQEAKIAkJLyogSWYgY29udHJvbGxlciBpcyBjdXJyZW50bHkgc2Nhbm5pbmcsIHdlIHN0b3AgaXQgdG8gZW5zdXJlIHdlCiAJCSAqIGRvbid0IG1pc3MgYW55IGFkdmVydGlzaW5nIChkdWUgdG8gZHVwbGljYXRlcyBmaWx0ZXIpLgogCQkgKi8KLQkJaWYgKHRlc3RfYml0KEhDSV9MRV9TQ0FOLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9TQ0FOKSkKIAkJCWhjaV9yZXFfYWRkX2xlX3NjYW5fZGlzYWJsZShyZXEpOwogCiAJCWhjaV9yZXFfYWRkX2xlX3Bhc3NpdmVfc2NhbihyZXEpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfcmVxdWVzdC5oIGIvbmV0L2JsdWV0b290aC9oY2lfcmVxdWVzdC5oCmluZGV4IGFkZjA3NGQuLmJmNmRmOTIgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3JlcXVlc3QuaAorKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9yZXF1ZXN0LmgKQEAgLTMyLDExICszMiwxNCBAQAogCiB2b2lkIGhjaV9yZXFfaW5pdChzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSwgc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogaW50IGhjaV9yZXFfcnVuKHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLCBoY2lfcmVxX2NvbXBsZXRlX3QgY29tcGxldGUpOworaW50IGhjaV9yZXFfcnVuX3NrYihzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSwgaGNpX3JlcV9jb21wbGV0ZV9za2JfdCBjb21wbGV0ZSk7CiB2b2lkIGhjaV9yZXFfYWRkKHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLCB1MTYgb3Bjb2RlLCB1MzIgcGxlbiwKIAkJIGNvbnN0IHZvaWQgKnBhcmFtKTsKIHZvaWQgaGNpX3JlcV9hZGRfZXYoc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsIHUxNiBvcGNvZGUsIHUzMiBwbGVuLAogCQkgICAgY29uc3Qgdm9pZCAqcGFyYW0sIHU4IGV2ZW50KTsKLXZvaWQgaGNpX3JlcV9jbWRfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHUxNiBvcGNvZGUsIHU4IHN0YXR1cyk7Cit2b2lkIGhjaV9yZXFfY21kX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1MTYgb3Bjb2RlLCB1OCBzdGF0dXMsCisJCQkgIGhjaV9yZXFfY29tcGxldGVfdCAqcmVxX2NvbXBsZXRlLAorCQkJICBoY2lfcmVxX2NvbXBsZXRlX3NrYl90ICpyZXFfY29tcGxldGVfc2tiKTsKIAogc3RydWN0IHNrX2J1ZmYgKmhjaV9wcmVwYXJlX2NtZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTE2IG9wY29kZSwgdTMyIHBsZW4sCiAJCQkJY29uc3Qgdm9pZCAqcGFyYW0pOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCmluZGV4IDFkNjVjNWIuLjU2ZjllZGIgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKQEAgLTMwLDYgKzMwLDEyIEBACiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfbW9uLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9tZ210Lmg+CisKKyNpbmNsdWRlICJtZ210X3V0aWwuaCIKKworc3RhdGljIExJU1RfSEVBRChtZ210X2NoYW5fbGlzdCk7CitzdGF0aWMgREVGSU5FX01VVEVYKG1nbXRfY2hhbl9saXN0X2xvY2spOwogCiBzdGF0aWMgYXRvbWljX3QgbW9uaXRvcl9wcm9taXNjID0gQVRPTUlDX0lOSVQoMCk7CiAKQEAgLTQ0LDExICs1MCwzMiBAQAogCXN0cnVjdCBoY2lfZmlsdGVyIGZpbHRlcjsKIAlfX3UzMiAgICAgICAgICAgICBjbXNnX21hc2s7CiAJdW5zaWduZWQgc2hvcnQgICAgY2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nICAgICBmbGFnczsKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IGhjaV90ZXN0X2JpdChpbnQgbnIsIHZvaWQgKmFkZHIpCit2b2lkIGhjaV9zb2NrX3NldF9mbGFnKHN0cnVjdCBzb2NrICpzaywgaW50IG5yKQogewotCXJldHVybiAqKChfX3UzMiAqKSBhZGRyICsgKG5yID4+IDUpKSAmICgoX191MzIpIDEgPDwgKG5yICYgMzEpKTsKKwlzZXRfYml0KG5yLCAmaGNpX3BpKHNrKS0+ZmxhZ3MpOworfQorCit2b2lkIGhjaV9zb2NrX2NsZWFyX2ZsYWcoc3RydWN0IHNvY2sgKnNrLCBpbnQgbnIpCit7CisJY2xlYXJfYml0KG5yLCAmaGNpX3BpKHNrKS0+ZmxhZ3MpOworfQorCitpbnQgaGNpX3NvY2tfdGVzdF9mbGFnKHN0cnVjdCBzb2NrICpzaywgaW50IG5yKQoreworCXJldHVybiB0ZXN0X2JpdChuciwgJmhjaV9waShzayktPmZsYWdzKTsKK30KKwordW5zaWduZWQgc2hvcnQgaGNpX3NvY2tfZ2V0X2NoYW5uZWwoc3RydWN0IHNvY2sgKnNrKQoreworCXJldHVybiBoY2lfcGkoc2spLT5jaGFubmVsOworfQorCitzdGF0aWMgaW5saW5lIGludCBoY2lfdGVzdF9iaXQoaW50IG5yLCBjb25zdCB2b2lkICphZGRyKQoreworCXJldHVybiAqKChjb25zdCBfX3UzMiAqKSBhZGRyICsgKG5yID4+IDUpKSAmICgoX191MzIpIDEgPDwgKG5yICYgMzEpKTsKIH0KIAogLyogU2VjdXJpdHkgZmlsdGVyICovCkBAIC0xODMsMTggKzIxMCwyMyBAQAogCWtmcmVlX3NrYihza2JfY29weSk7CiB9CiAKLS8qIFNlbmQgZnJhbWUgdG8gY29udHJvbCBzb2NrZXQgKi8KLXZvaWQgaGNpX3NlbmRfdG9fY29udHJvbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc29jayAqc2tpcF9zaykKKy8qIFNlbmQgZnJhbWUgdG8gc29ja2V0cyB3aXRoIHNwZWNpZmljIGNoYW5uZWwgKi8KK3ZvaWQgaGNpX3NlbmRfdG9fY2hhbm5lbCh1bnNpZ25lZCBzaG9ydCBjaGFubmVsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJIGludCBmbGFnLCBzdHJ1Y3Qgc29jayAqc2tpcF9zaykKIHsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAKLQlCVF9EQkcoImxlbiAlZCIsIHNrYi0+bGVuKTsKKwlCVF9EQkcoImNoYW5uZWwgJXUgbGVuICVkIiwgY2hhbm5lbCwgc2tiLT5sZW4pOwogCiAJcmVhZF9sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKIAogCXNrX2Zvcl9lYWNoKHNrLCAmaGNpX3NrX2xpc3QuaGVhZCkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAorCQkvKiBJZ25vcmUgc29ja2V0IHdpdGhvdXQgdGhlIGZsYWcgc2V0ICovCisJCWlmICghaGNpX3NvY2tfdGVzdF9mbGFnKHNrLCBmbGFnKSkKKwkJCWNvbnRpbnVlOworCiAJCS8qIFNraXAgdGhlIG9yaWdpbmFsIHNvY2tldCAqLwogCQlpZiAoc2sgPT0gc2tpcF9zaykKIAkJCWNvbnRpbnVlOwpAQCAtMjAyLDM1ICsyMzQsNyBAQAogCQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0JPVU5EKQogCQkJY29udGludWU7CiAKLQkJaWYgKGhjaV9waShzayktPmNoYW5uZWwgIT0gSENJX0NIQU5ORUxfQ09OVFJPTCkKLQkJCWNvbnRpbnVlOwotCi0JCW5za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFuc2tiKQotCQkJY29udGludWU7Ci0KLQkJaWYgKHNvY2tfcXVldWVfcmN2X3NrYihzaywgbnNrYikpCi0JCQlrZnJlZV9za2IobnNrYik7Ci0JfQotCi0JcmVhZF91bmxvY2soJmhjaV9za19saXN0LmxvY2spOwotfQotCi1zdGF0aWMgdm9pZCBxdWV1ZV9tb25pdG9yX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBzb2NrICpzazsKLQotCUJUX0RCRygibGVuICVkIiwgc2tiLT5sZW4pOwotCi0JcmVhZF9sb2NrKCZoY2lfc2tfbGlzdC5sb2NrKTsKLQotCXNrX2Zvcl9lYWNoKHNrLCAmaGNpX3NrX2xpc3QuaGVhZCkgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKLQotCQlpZiAoc2stPnNrX3N0YXRlICE9IEJUX0JPVU5EKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGhjaV9waShzayktPmNoYW5uZWwgIT0gSENJX0NIQU5ORUxfTU9OSVRPUikKKwkJaWYgKGhjaV9waShzayktPmNoYW5uZWwgIT0gY2hhbm5lbCkKIAkJCWNvbnRpbnVlOwogCiAJCW5za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKQEAgLTI5MCw3ICsyOTQsOCBAQAogCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihoZGV2LT5pZCk7CiAJaGRyLT5sZW4gPSBjcHVfdG9fbGUxNihza2ItPmxlbik7CiAKLQlxdWV1ZV9tb25pdG9yX3NrYihza2JfY29weSk7CisJaGNpX3NlbmRfdG9fY2hhbm5lbChIQ0lfQ0hBTk5FTF9NT05JVE9SLCBza2JfY29weSwKKwkJCSAgICBIQ0lfU09DS19UUlVTVEVELCBOVUxMKTsKIAlrZnJlZV9za2Ioc2tiX2NvcHkpOwogfQogCkBAIC0zOTcsNyArNDAyLDggQEAKIAogCQlza2IgPSBjcmVhdGVfbW9uaXRvcl9ldmVudChoZGV2LCBldmVudCk7CiAJCWlmIChza2IpIHsKLQkJCXF1ZXVlX21vbml0b3Jfc2tiKHNrYik7CisJCQloY2lfc2VuZF90b19jaGFubmVsKEhDSV9DSEFOTkVMX01PTklUT1IsIHNrYiwKKwkJCQkJICAgIEhDSV9TT0NLX1RSVVNURUQsIE5VTEwpOwogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCX0KIAl9CkBAIC00MjgsNiArNDM0LDU2IEBACiAJfQogfQogCitzdGF0aWMgc3RydWN0IGhjaV9tZ210X2NoYW4gKl9faGNpX21nbXRfY2hhbl9maW5kKHVuc2lnbmVkIHNob3J0IGNoYW5uZWwpCit7CisJc3RydWN0IGhjaV9tZ210X2NoYW4gKmM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZtZ210X2NoYW5fbGlzdCwgbGlzdCkgeworCQlpZiAoYy0+Y2hhbm5lbCA9PSBjaGFubmVsKQorCQkJcmV0dXJuIGM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGNpX21nbXRfY2hhbiAqaGNpX21nbXRfY2hhbl9maW5kKHVuc2lnbmVkIHNob3J0IGNoYW5uZWwpCit7CisJc3RydWN0IGhjaV9tZ210X2NoYW4gKmM7CisKKwltdXRleF9sb2NrKCZtZ210X2NoYW5fbGlzdF9sb2NrKTsKKwljID0gX19oY2lfbWdtdF9jaGFuX2ZpbmQoY2hhbm5lbCk7CisJbXV0ZXhfdW5sb2NrKCZtZ210X2NoYW5fbGlzdF9sb2NrKTsKKworCXJldHVybiBjOworfQorCitpbnQgaGNpX21nbXRfY2hhbl9yZWdpc3RlcihzdHJ1Y3QgaGNpX21nbXRfY2hhbiAqYykKK3sKKwlpZiAoYy0+Y2hhbm5lbCA8IEhDSV9DSEFOTkVMX0NPTlRST0wpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmbWdtdF9jaGFuX2xpc3RfbG9jayk7CisJaWYgKF9faGNpX21nbXRfY2hhbl9maW5kKGMtPmNoYW5uZWwpKSB7CisJCW11dGV4X3VubG9jaygmbWdtdF9jaGFuX2xpc3RfbG9jayk7CisJCXJldHVybiAtRUFMUkVBRFk7CisJfQorCisJbGlzdF9hZGRfdGFpbCgmYy0+bGlzdCwgJm1nbXRfY2hhbl9saXN0KTsKKworCW11dGV4X3VubG9jaygmbWdtdF9jaGFuX2xpc3RfbG9jayk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaGNpX21nbXRfY2hhbl9yZWdpc3Rlcik7CisKK3ZvaWQgaGNpX21nbXRfY2hhbl91bnJlZ2lzdGVyKHN0cnVjdCBoY2lfbWdtdF9jaGFuICpjKQoreworCW11dGV4X2xvY2soJm1nbXRfY2hhbl9saXN0X2xvY2spOworCWxpc3RfZGVsKCZjLT5saXN0KTsKKwltdXRleF91bmxvY2soJm1nbXRfY2hhbl9saXN0X2xvY2spOworfQorRVhQT1JUX1NZTUJPTChoY2lfbWdtdF9jaGFuX3VucmVnaXN0ZXIpOworCiBzdGF0aWMgaW50IGhjaV9zb2NrX3JlbGVhc2Uoc3RydWN0IHNvY2tldCAqc29jaykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKQEAgLTQ0OCw3ICs1MDQsNyBAQAogCWlmIChoZGV2KSB7CiAJCWlmIChoY2lfcGkoc2spLT5jaGFubmVsID09IEhDSV9DSEFOTkVMX1VTRVIpIHsKIAkJCW1nbXRfaW5kZXhfYWRkZWQoaGRldik7Ci0JCQljbGVhcl9iaXQoSENJX1VTRVJfQ0hBTk5FTCwgJmhkZXYtPmRldl9mbGFncyk7CisJCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX1VTRVJfQ0hBTk5FTCk7CiAJCQloY2lfZGV2X2Nsb3NlKGhkZXYtPmlkKTsKIAkJfQogCkBAIC01MDgsMTAgKzU2NCwxMCBAQAogCWlmICghaGRldikKIAkJcmV0dXJuIC1FQkFERkQ7CiAKLQlpZiAodGVzdF9iaXQoSENJX1VTRVJfQ0hBTk5FTCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VU0VSX0NIQU5ORUwpKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JaWYgKHRlc3RfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVU5DT05GSUdVUkVEKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJaWYgKGhkZXYtPmRldl90eXBlICE9IEhDSV9CUkVEUikKQEAgLTY4NywxNCArNzQzLDE0IEBACiAKIAkJaWYgKHRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSB8fAogCQkgICAgdGVzdF9iaXQoSENJX0lOSVQsICZoZGV2LT5mbGFncykgfHwKLQkJICAgIHRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmRldl9mbGFncykgfHwKLQkJICAgIHRlc3RfYml0KEhDSV9DT05GSUcsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU0VUVVApIHx8CisJCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQ09ORklHKSkgewogCQkJZXJyID0gLUVCVVNZOwogCQkJaGNpX2Rldl9wdXQoaGRldik7CiAJCQlnb3RvIGRvbmU7CiAJCX0KIAotCQlpZiAodGVzdF9hbmRfc2V0X2JpdChIQ0lfVVNFUl9DSEFOTkVMLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCQlpZiAoaGNpX2Rldl90ZXN0X2FuZF9zZXRfZmxhZyhoZGV2LCBIQ0lfVVNFUl9DSEFOTkVMKSkgewogCQkJZXJyID0gLUVVU0VSUzsKIAkJCWhjaV9kZXZfcHV0KGhkZXYpOwogCQkJZ290byBkb25lOwpAQCAtNzA0LDcgKzc2MCw3IEBACiAKIAkJZXJyID0gaGNpX2Rldl9vcGVuKGhkZXYtPmlkKTsKIAkJaWYgKGVycikgewotCQkJY2xlYXJfYml0KEhDSV9VU0VSX0NIQU5ORUwsICZoZGV2LT5kZXZfZmxhZ3MpOworCQkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9VU0VSX0NIQU5ORUwpOwogCQkJbWdtdF9pbmRleF9hZGRlZChoZGV2KTsKIAkJCWhjaV9kZXZfcHV0KGhkZXYpOwogCQkJZ290byBkb25lOwpAQCAtNzE1LDE5ICs3NzEsNiBAQAogCQloY2lfcGkoc2spLT5oZGV2ID0gaGRldjsKIAkJYnJlYWs7CiAKLQljYXNlIEhDSV9DSEFOTkVMX0NPTlRST0w6Ci0JCWlmIChoYWRkci5oY2lfZGV2ICE9IEhDSV9ERVZfTk9ORSkgewotCQkJZXJyID0gLUVJTlZBTDsKLQkJCWdvdG8gZG9uZTsKLQkJfQotCi0JCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgewotCQkJZXJyID0gLUVQRVJNOwotCQkJZ290byBkb25lOwotCQl9Ci0KLQkJYnJlYWs7Ci0KIAljYXNlIEhDSV9DSEFOTkVMX01PTklUT1I6CiAJCWlmIChoYWRkci5oY2lfZGV2ICE9IEhDSV9ERVZfTk9ORSkgewogCQkJZXJyID0gLUVJTlZBTDsKQEAgLTczOSwxNCArNzgyLDUxIEBACiAJCQlnb3RvIGRvbmU7CiAJCX0KIAorCQkvKiBUaGUgbW9uaXRvciBpbnRlcmZhY2UgaXMgcmVzdHJpY3RlZCB0byBDQVBfTkVUX1JBVworCQkgKiBjYXBhYmlsaXRpZXMgYW5kIHdpdGggdGhhdCBpbXBsaWNpdGx5IHRydXN0ZWQuCisJCSAqLworCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX1NPQ0tfVFJVU1RFRCk7CisKIAkJc2VuZF9tb25pdG9yX3JlcGxheShzayk7CiAKIAkJYXRvbWljX2luYygmbW9uaXRvcl9wcm9taXNjKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7CisJCWlmICghaGNpX21nbXRfY2hhbl9maW5kKGhhZGRyLmhjaV9jaGFubmVsKSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWlmIChoYWRkci5oY2lfZGV2ICE9IEhDSV9ERVZfTk9ORSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCS8qIFVzZXJzIHdpdGggQ0FQX05FVF9BRE1JTiBjYXBhYmlsaXRpZXMgYXJlIGFsbG93ZWQKKwkJICogYWNjZXNzIHRvIGFsbCBtYW5hZ2VtZW50IGNvbW1hbmRzIGFuZCBldmVudHMuIEZvcgorCQkgKiB1bnRydXN0ZWQgdXNlcnMgdGhlIGludGVyZmFjZSBpcyByZXN0cmljdGVkIGFuZAorCQkgKiBhbHNvIG9ubHkgdW50cnVzdGVkIGV2ZW50cyBhcmUgc2VudC4KKwkJICovCisJCWlmIChjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9TT0NLX1RSVVNURUQpOworCisJCS8qIEF0IHRoZSBtb21lbnQgdGhlIGluZGV4IGFuZCB1bmNvbmZpZ3VyZWQgaW5kZXggZXZlbnRzCisJCSAqIGFyZSBlbmFibGVkIHVuY29uZGl0aW9uYWxseS4gU2V0dGluZyB0aGVtIG9uIGVhY2gKKwkJICogc29ja2V0IHdoZW4gYmluZGluZyBrZWVwcyB0aGlzIGZ1bmN0aW9uYWxpdHkuIFRoZXkKKwkJICogaG93ZXZlciBtaWdodCBiZSBjbGVhcmVkIGxhdGVyIGFuZCB0aGVuIHNlbmRpbmcgb2YgdGhlc2UKKwkJICogZXZlbnRzIHdpbGwgYmUgZGlzYWJsZWQsIGJ1dCB0aGF0IGlzIHRoZW4gaW50ZW50aW9uYWwuCisJCSAqCisJCSAqIFRoaXMgYWxzbyBlbmFibGVzIGdlbmVyaWMgZXZlbnRzIHRoYXQgYXJlIHNhZmUgdG8gYmUKKwkJICogcmVjZWl2ZWQgYnkgdW50cnVzdGVkIHVzZXJzLiBFeGFtcGxlIGZvciBzdWNoIGV2ZW50cworCQkgKiBhcmUgY2hhbmdlcyB0byBzZXR0aW5ncywgY2xhc3Mgb2YgZGV2aWNlLCBuYW1lIGV0Yy4KKwkJICovCisJCWlmIChoYWRkci5oY2lfY2hhbm5lbCA9PSBIQ0lfQ0hBTk5FTF9DT05UUk9MKSB7CisJCQloY2lfc29ja19zZXRfZmxhZyhzaywgSENJX01HTVRfSU5ERVhfRVZFTlRTKTsKKwkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfTUdNVF9VTkNPTkZfSU5ERVhfRVZFTlRTKTsKKwkJCWhjaV9zb2NrX3NldF9mbGFnKHNrLCBIQ0lfTUdNVF9HRU5FUklDX0VWRU5UUyk7CisJCX0KKwkJYnJlYWs7CiAJfQogCiAKQEAgLTgyNiw4ICs5MDYsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCBoY2lfc29ja19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK3N0YXRpYyBpbnQgaGNpX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCisJCQkgICAgaW50IGZsYWdzKQogewogCWludCBub2Jsb2NrID0gZmxhZ3MgJiBNU0dfRE9OVFdBSVQ7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CkBAIC04NjAsMTAgKzk0MCwxMyBAQAogCQloY2lfc29ja19jbXNnKHNrLCBtc2csIHNrYik7CiAJCWJyZWFrOwogCWNhc2UgSENJX0NIQU5ORUxfVVNFUjoKLQljYXNlIEhDSV9DSEFOTkVMX0NPTlRST0w6CiAJY2FzZSBIQ0lfQ0hBTk5FTF9NT05JVE9SOgogCQlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc2ssIHNrYik7CiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChoY2lfbWdtdF9jaGFuX2ZpbmQoaGNpX3BpKHNrKS0+Y2hhbm5lbCkpCisJCQlzb2NrX3JlY3ZfdGltZXN0YW1wKG1zZywgc2ssIHNrYik7CisJCWJyZWFrOwogCX0KIAogCXNrYl9mcmVlX2RhdGFncmFtKHNrLCBza2IpOwpAQCAtODcxLDEwICs5NTQsMTIyIEBACiAJcmV0dXJuIGVyciA/IDogY29waWVkOwogfQogCi1zdGF0aWMgaW50IGhjaV9zb2NrX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgaGNpX21nbXRfY21kKHN0cnVjdCBoY2lfbWdtdF9jaGFuICpjaGFuLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBtc2dsZW4pCit7CisJdm9pZCAqYnVmOworCXU4ICpjcDsKKwlzdHJ1Y3QgbWdtdF9oZHIgKmhkcjsKKwl1MTYgb3Bjb2RlLCBpbmRleCwgbGVuOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaGNpX21nbXRfaGFuZGxlciAqaGFuZGxlcjsKKwlib29sIHZhcl9sZW4sIG5vX2hkZXY7CisJaW50IGVycjsKKworCUJUX0RCRygiZ290ICV6dSBieXRlcyIsIG1zZ2xlbik7CisKKwlpZiAobXNnbGVuIDwgc2l6ZW9mKCpoZHIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ1ZiA9IGttYWxsb2MobXNnbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobWVtY3B5X2Zyb21fbXNnKGJ1ZiwgbXNnLCBtc2dsZW4pKSB7CisJCWVyciA9IC1FRkFVTFQ7CisJCWdvdG8gZG9uZTsKKwl9CisKKwloZHIgPSBidWY7CisJb3Bjb2RlID0gX19sZTE2X3RvX2NwdShoZHItPm9wY29kZSk7CisJaW5kZXggPSBfX2xlMTZfdG9fY3B1KGhkci0+aW5kZXgpOworCWxlbiA9IF9fbGUxNl90b19jcHUoaGRyLT5sZW4pOworCisJaWYgKGxlbiAhPSBtc2dsZW4gLSBzaXplb2YoKmhkcikpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChvcGNvZGUgPj0gY2hhbi0+aGFuZGxlcl9jb3VudCB8fAorCSAgICBjaGFuLT5oYW5kbGVyc1tvcGNvZGVdLmZ1bmMgPT0gTlVMTCkgeworCQlCVF9EQkcoIlVua25vd24gb3AgJXUiLCBvcGNvZGUpOworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGluZGV4LCBvcGNvZGUsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfVU5LTk9XTl9DT01NQU5EKTsKKwkJZ290byBkb25lOworCX0KKworCWhhbmRsZXIgPSAmY2hhbi0+aGFuZGxlcnNbb3Bjb2RlXTsKKworCWlmICghaGNpX3NvY2tfdGVzdF9mbGFnKHNrLCBIQ0lfU09DS19UUlVTVEVEKSAmJgorCSAgICAhKGhhbmRsZXItPmZsYWdzICYgSENJX01HTVRfVU5UUlVTVEVEKSkgeworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGluZGV4LCBvcGNvZGUsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfUEVSTUlTU0lPTl9ERU5JRUQpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGluZGV4ICE9IE1HTVRfSU5ERVhfTk9ORSkgeworCQloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOworCQlpZiAoIWhkZXYpIHsKKwkJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaW5kZXgsIG9wY29kZSwKKwkJCQkJICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9JTkRFWCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NFVFVQKSB8fAorCQkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0NPTkZJRykgfHwKKwkJICAgIGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VU0VSX0NIQU5ORUwpKSB7CisJCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGluZGV4LCBvcGNvZGUsCisJCQkJCSAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfSU5ERVgpOworCQkJZ290byBkb25lOworCQl9CisKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VTkNPTkZJR1VSRUQpICYmCisJCSAgICAhKGhhbmRsZXItPmZsYWdzICYgSENJX01HTVRfVU5DT05GSUdVUkVEKSkgeworCQkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBpbmRleCwgb3Bjb2RlLAorCQkJCQkgICAgICBNR01UX1NUQVRVU19JTlZBTElEX0lOREVYKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKworCW5vX2hkZXYgPSAoaGFuZGxlci0+ZmxhZ3MgJiBIQ0lfTUdNVF9OT19IREVWKTsKKwlpZiAobm9faGRldiAhPSAhaGRldikgeworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGluZGV4LCBvcGNvZGUsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9JTkRFWCk7CisJCWdvdG8gZG9uZTsKKwl9CisKKwl2YXJfbGVuID0gKGhhbmRsZXItPmZsYWdzICYgSENJX01HTVRfVkFSX0xFTik7CisJaWYgKCh2YXJfbGVuICYmIGxlbiA8IGhhbmRsZXItPmRhdGFfbGVuKSB8fAorCSAgICAoIXZhcl9sZW4gJiYgbGVuICE9IGhhbmRsZXItPmRhdGFfbGVuKSkgeworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGluZGV4LCBvcGNvZGUsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGhkZXYgJiYgY2hhbi0+aGRldl9pbml0KQorCQljaGFuLT5oZGV2X2luaXQoc2ssIGhkZXYpOworCisJY3AgPSBidWYgKyBzaXplb2YoKmhkcik7CisKKwllcnIgPSBoYW5kbGVyLT5mdW5jKHNrLCBoZGV2LCBjcCwgbGVuKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBkb25lOworCisJZXJyID0gbXNnbGVuOworCitkb25lOgorCWlmIChoZGV2KQorCQloY2lfZGV2X3B1dChoZGV2KTsKKworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBoY2lfc29ja19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBoY2lfbWdtdF9jaGFuICpjaGFuOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGVycjsKQEAgLTg5NiwxNCArMTA5MSwxOCBAQAogCWNhc2UgSENJX0NIQU5ORUxfUkFXOgogCWNhc2UgSENJX0NIQU5ORUxfVVNFUjoKIAkJYnJlYWs7Ci0JY2FzZSBIQ0lfQ0hBTk5FTF9DT05UUk9MOgotCQllcnIgPSBtZ210X2NvbnRyb2woc2ssIG1zZywgbGVuKTsKLQkJZ290byBkb25lOwogCWNhc2UgSENJX0NIQU5ORUxfTU9OSVRPUjoKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gZG9uZTsKIAlkZWZhdWx0OgotCQllcnIgPSAtRUlOVkFMOworCQltdXRleF9sb2NrKCZtZ210X2NoYW5fbGlzdF9sb2NrKTsKKwkJY2hhbiA9IF9faGNpX21nbXRfY2hhbl9maW5kKGhjaV9waShzayktPmNoYW5uZWwpOworCQlpZiAoY2hhbikKKwkJCWVyciA9IGhjaV9tZ210X2NtZChjaGFuLCBzaywgbXNnLCBsZW4pOworCQllbHNlCisJCQllcnIgPSAtRUlOVkFMOworCisJCW11dGV4X3VubG9jaygmbWdtdF9jaGFuX2xpc3RfbG9jayk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCmluZGV4IDA3MzQ4ZTEuLmEwNWI5ZGIgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwpAQCAtNzAsMTAgKzcwLDExIEBACiAKIHN0YXRpYyB2b2lkIGhpZHBfY29weV9zZXNzaW9uKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sIHN0cnVjdCBoaWRwX2Nvbm5pbmZvICpjaSkKIHsKKwl1MzIgdmFsaWRfZmxhZ3MgPSAwOwogCW1lbXNldChjaSwgMCwgc2l6ZW9mKCpjaSkpOwogCWJhY3B5KCZjaS0+YmRhZGRyLCAmc2Vzc2lvbi0+YmRhZGRyKTsKIAotCWNpLT5mbGFncyA9IHNlc3Npb24tPmZsYWdzOworCWNpLT5mbGFncyA9IHNlc3Npb24tPmZsYWdzICYgdmFsaWRfZmxhZ3M7CiAJY2ktPnN0YXRlID0gQlRfQ09OTkVDVEVEOwogCiAJaWYgKHNlc3Npb24tPmlucHV0KSB7CkBAIC05MDcsNyArOTA4LDcgQEAKIAlrcmVmX2luaXQoJnNlc3Npb24tPnJlZik7CiAJYXRvbWljX3NldCgmc2Vzc2lvbi0+c3RhdGUsIEhJRFBfU0VTU0lPTl9JRExJTkcpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNlc3Npb24tPnN0YXRlX3F1ZXVlKTsKLQlzZXNzaW9uLT5mbGFncyA9IHJlcS0+ZmxhZ3MgJiAoMSA8PCBISURQX0JMVUVUT09USF9WRU5ET1JfSUQpOworCXNlc3Npb24tPmZsYWdzID0gcmVxLT5mbGFncyAmIEJJVChISURQX0JMVUVUT09USF9WRU5ET1JfSUQpOwogCiAJLyogY29ubmVjdGlvbiBtYW5hZ2VtZW50ICovCiAJYmFjcHkoJnNlc3Npb24tPmJkYWRkciwgYmRhZGRyKTsKQEAgLTEzMTIsNiArMTMxMyw3IEBACiAJCQlzdHJ1Y3Qgc29ja2V0ICpjdHJsX3NvY2ssCiAJCQlzdHJ1Y3Qgc29ja2V0ICppbnRyX3NvY2spCiB7CisJdTMyIHZhbGlkX2ZsYWdzID0gMDsKIAlzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uOwogCXN0cnVjdCBsMmNhcF9jb25uICpjb25uOwogCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuOwpAQCAtMTMyMSw2ICsxMzIzLDkgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJaWYgKHJlcS0+ZmxhZ3MgJiB+dmFsaWRfZmxhZ3MpCisJCXJldHVybiAtRUlOVkFMOworCiAJY2hhbiA9IGwyY2FwX3BpKGN0cmxfc29jay0+c2spLT5jaGFuOwogCWNvbm4gPSBOVUxMOwogCWwyY2FwX2NoYW5fbG9jayhjaGFuKTsKQEAgLTEzNTEsMTMgKzEzNTYsMTcgQEAKIAogaW50IGhpZHBfY29ubmVjdGlvbl9kZWwoc3RydWN0IGhpZHBfY29ubmRlbF9yZXEgKnJlcSkKIHsKKwl1MzIgdmFsaWRfZmxhZ3MgPSBCSVQoSElEUF9WSVJUVUFMX0NBQkxFX1VOUExVRyk7CiAJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbjsKIAorCWlmIChyZXEtPmZsYWdzICYgfnZhbGlkX2ZsYWdzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXNlc3Npb24gPSBoaWRwX3Nlc3Npb25fZmluZCgmcmVxLT5iZGFkZHIpOwogCWlmICghc2Vzc2lvbikKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKLQlpZiAocmVxLT5mbGFncyAmICgxIDw8IEhJRFBfVklSVFVBTF9DQUJMRV9VTlBMVUcpKQorCWlmIChyZXEtPmZsYWdzICYgQklUKEhJRFBfVklSVFVBTF9DQUJMRV9VTlBMVUcpKQogCQloaWRwX3NlbmRfY3RybF9tZXNzYWdlKHNlc3Npb24sCiAJCQkJICAgICAgIEhJRFBfVFJBTlNfSElEX0NPTlRST0wgfAogCQkJCSAgICAgICAgIEhJRFBfQ1RSTF9WSVJUVUFMX0NBQkxFX1VOUExVRywKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfY29yZS5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKaW5kZXggNmJhMzNmOS4uZGFkNDE5NyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMKQEAgLTI5Miw3ICsyOTIsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlza2JfcXVldWVfd2FsayhoZWFkLCBza2IpIHsKLQkJaWYgKGJ0X2NiKHNrYiktPmNvbnRyb2wudHhzZXEgPT0gc2VxKQorCQlpZiAoYnRfY2Ioc2tiKS0+bDJjYXAudHhzZXEgPT0gc2VxKQogCQkJcmV0dXJuIHNrYjsKIAl9CiAKQEAgLTk1NCwxMSArOTU0LDExIEBACiB7CiAJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpIHsKIAkJX191bnBhY2tfZXh0ZW5kZWRfY29udHJvbChnZXRfdW5hbGlnbmVkX2xlMzIoc2tiLT5kYXRhKSwKLQkJCQkJICAmYnRfY2Ioc2tiKS0+Y29udHJvbCk7CisJCQkJCSAgJmJ0X2NiKHNrYiktPmwyY2FwKTsKIAkJc2tiX3B1bGwoc2tiLCBMMkNBUF9FWFRfQ1RSTF9TSVpFKTsKIAl9IGVsc2UgewogCQlfX3VucGFja19lbmhhbmNlZF9jb250cm9sKGdldF91bmFsaWduZWRfbGUxNihza2ItPmRhdGEpLAotCQkJCQkgICZidF9jYihza2IpLT5jb250cm9sKTsKKwkJCQkJICAmYnRfY2Ioc2tiKS0+bDJjYXApOwogCQlza2JfcHVsbChza2IsIEwyQ0FQX0VOSF9DVFJMX1NJWkUpOwogCX0KIH0KQEAgLTEyMDAsOCArMTIwMCw4IEBACiAKIAljaGFuLT5yZXRyeV9jb3VudCA9IDA7CiAJc2tiX3F1ZXVlX3dhbGsoJmNoYW4tPnR4X3EsIHNrYikgewotCQlpZiAoYnRfY2Ioc2tiKS0+Y29udHJvbC5yZXRyaWVzKQotCQkJYnRfY2Ioc2tiKS0+Y29udHJvbC5yZXRyaWVzID0gMTsKKwkJaWYgKGJ0X2NiKHNrYiktPmwyY2FwLnJldHJpZXMpCisJCQlidF9jYihza2IpLT5sMmNhcC5yZXRyaWVzID0gMTsKIAkJZWxzZQogCQkJYnJlYWs7CiAJfQpAQCAtMTI0NCw2ICsxMjQ0LDEzIEBACiAKIHN0YXRpYyB2b2lkIGwyY2FwX2NoYW5fcmVhZHkoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCiB7CisJLyogVGhlIGNoYW5uZWwgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGZsYWdnZWQgYXMgY29ubmVjdGVkIGluCisJICogY2FzZSBvZiByZWNlaXZpbmcgZGF0YSBiZWZvcmUgdGhlIEwyQ0FQIGluZm8gcmVxL3JzcAorCSAqIHByb2NlZHVyZSBpcyBjb21wbGV0ZS4KKwkgKi8KKwlpZiAoY2hhbi0+c3RhdGUgPT0gQlRfQ09OTkVDVEVEKQorCQlyZXR1cm47CisKIAkvKiBUaGlzIGNsZWFycyBhbGwgY29uZiBmbGFncywgaW5jbHVkaW5nIENPTkZfTk9UX0NPTVBMRVRFICovCiAJY2hhbi0+Y29uZl9zdGF0ZSA9IDA7CiAJX19jbGVhcl9jaGFuX3RpbWVyKGNoYW4pOwpAQCAtMTgzOSw4ICsxODQ2LDggQEAKIAogCQlza2IgPSBza2JfZGVxdWV1ZSgmY2hhbi0+dHhfcSk7CiAKLQkJYnRfY2Ioc2tiKS0+Y29udHJvbC5yZXRyaWVzID0gMTsKLQkJY29udHJvbCA9ICZidF9jYihza2IpLT5jb250cm9sOworCQlidF9jYihza2IpLT5sMmNhcC5yZXRyaWVzID0gMTsKKwkJY29udHJvbCA9ICZidF9jYihza2IpLT5sMmNhcDsKIAogCQljb250cm9sLT5yZXFzZXEgPSAwOwogCQljb250cm9sLT50eHNlcSA9IGNoYW4tPm5leHRfdHhfc2VxOwpAQCAtMTg4NCw4ICsxODkxLDggQEAKIAogCQlza2IgPSBjaGFuLT50eF9zZW5kX2hlYWQ7CiAKLQkJYnRfY2Ioc2tiKS0+Y29udHJvbC5yZXRyaWVzID0gMTsKLQkJY29udHJvbCA9ICZidF9jYihza2IpLT5jb250cm9sOworCQlidF9jYihza2IpLT5sMmNhcC5yZXRyaWVzID0gMTsKKwkJY29udHJvbCA9ICZidF9jYihza2IpLT5sMmNhcDsKIAogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KENPTk5fU0VORF9GQklULCAmY2hhbi0+Y29ubl9zdGF0ZSkpCiAJCQljb250cm9sLT5maW5hbCA9IDE7CkBAIC0xOTU2LDExICsxOTYzLDExIEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWJ0X2NiKHNrYiktPmNvbnRyb2wucmV0cmllcysrOwotCQljb250cm9sID0gYnRfY2Ioc2tiKS0+Y29udHJvbDsKKwkJYnRfY2Ioc2tiKS0+bDJjYXAucmV0cmllcysrOworCQljb250cm9sID0gYnRfY2Ioc2tiKS0+bDJjYXA7CiAKIAkJaWYgKGNoYW4tPm1heF90eCAhPSAwICYmCi0JCSAgICBidF9jYihza2IpLT5jb250cm9sLnJldHJpZXMgPiBjaGFuLT5tYXhfdHgpIHsKKwkJICAgIGJ0X2NiKHNrYiktPmwyY2FwLnJldHJpZXMgPiBjaGFuLT5tYXhfdHgpIHsKIAkJCUJUX0RCRygiUmV0cnkgbGltaXQgZXhjZWVkZWQgKCVkKSIsIGNoYW4tPm1heF90eCk7CiAJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNoYW4sIEVDT05OUkVTRVQpOwogCQkJbDJjYXBfc2VxX2xpc3RfY2xlYXIoJmNoYW4tPnJldHJhbnNfbGlzdCk7CkBAIC0yMDM4LDcgKzIwNDUsNyBAQAogCiAJaWYgKGNoYW4tPnVuYWNrZWRfZnJhbWVzKSB7CiAJCXNrYl9xdWV1ZV93YWxrKCZjaGFuLT50eF9xLCBza2IpIHsKLQkJCWlmIChidF9jYihza2IpLT5jb250cm9sLnR4c2VxID09IGNvbnRyb2wtPnJlcXNlcSB8fAorCQkJaWYgKGJ0X2NiKHNrYiktPmwyY2FwLnR4c2VxID09IGNvbnRyb2wtPnJlcXNlcSB8fAogCQkJICAgIHNrYiA9PSBjaGFuLT50eF9zZW5kX2hlYWQpCiAJCQkJYnJlYWs7CiAJCX0KQEAgLTIwNDgsNyArMjA1NSw3IEBACiAJCQkJYnJlYWs7CiAKIAkJCWwyY2FwX3NlcV9saXN0X2FwcGVuZCgmY2hhbi0+cmV0cmFuc19saXN0LAotCQkJCQkgICAgICBidF9jYihza2IpLT5jb250cm9sLnR4c2VxKTsKKwkJCQkJICAgICAgYnRfY2Ioc2tiKS0+bDJjYXAudHhzZXEpOwogCQl9CiAKIAkJbDJjYXBfZXJ0bV9yZXNlbmQoY2hhbik7CkBAIC0yMjYwLDggKzIyNjcsOCBAQAogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCX0KIAotCWJ0X2NiKHNrYiktPmNvbnRyb2wuZmNzID0gY2hhbi0+ZmNzOwotCWJ0X2NiKHNrYiktPmNvbnRyb2wucmV0cmllcyA9IDA7CisJYnRfY2Ioc2tiKS0+bDJjYXAuZmNzID0gY2hhbi0+ZmNzOworCWJ0X2NiKHNrYiktPmwyY2FwLnJldHJpZXMgPSAwOwogCXJldHVybiBza2I7CiB9CiAKQEAgLTIzMTQsNyArMjMyMSw3IEBACiAJCQlyZXR1cm4gUFRSX0VSUihza2IpOwogCQl9CiAKLQkJYnRfY2Ioc2tiKS0+Y29udHJvbC5zYXIgPSBzYXI7CisJCWJ0X2NiKHNrYiktPmwyY2FwLnNhciA9IHNhcjsKIAkJX19za2JfcXVldWVfdGFpbChzZWdfcXVldWUsIHNrYik7CiAKIAkJbGVuIC09IHBkdV9sZW47CkBAIC0yODQ5LDcgKzI4NTYsNyBAQAogCQkJY29udGludWU7CiAKIAkJLyogRG9uJ3Qgc2VuZCBmcmFtZSB0byB0aGUgY2hhbm5lbCBpdCBjYW1lIGZyb20gKi8KLQkJaWYgKGJ0X2NiKHNrYiktPmNoYW4gPT0gY2hhbikKKwkJaWYgKGJ0X2NiKHNrYiktPmwyY2FwLmNoYW4gPT0gY2hhbikKIAkJCWNvbnRpbnVlOwogCiAJCW5za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfS0VSTkVMKTsKQEAgLTM4OTMsNyArMzkwMCw3IEBACiAJCXJldHVybiAtRVBST1RPOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwotCWlmICh0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmRldl9mbGFncykgJiYKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX01HTVQpICYmCiAJICAgICF0ZXN0X2FuZF9zZXRfYml0KEhDSV9DT05OX01HTVRfQ09OTkVDVEVELCAmaGNvbi0+ZmxhZ3MpKQogCQltZ210X2RldmljZV9jb25uZWN0ZWQoaGRldiwgaGNvbiwgMCwgTlVMTCwgMCk7CiAJaGNpX2Rldl91bmxvY2soaGRldik7CkBAIC01OTExLDcgKzU5MTgsNyBAQAogCiAJCXNrYl91bmxpbmsoc2tiLCAmY2hhbi0+c3Jlal9xKTsKIAkJY2hhbi0+YnVmZmVyX3NlcSA9IF9fbmV4dF9zZXEoY2hhbiwgY2hhbi0+YnVmZmVyX3NlcSk7Ci0JCWVyciA9IGwyY2FwX3JlYXNzZW1ibGVfc2R1KGNoYW4sIHNrYiwgJmJ0X2NiKHNrYiktPmNvbnRyb2wpOworCQllcnIgPSBsMmNhcF9yZWFzc2VtYmxlX3NkdShjaGFuLCBza2IsICZidF9jYihza2IpLT5sMmNhcCk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIAl9CkBAIC01OTQ1LDcgKzU5NTIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGNoYW4tPm1heF90eCAhPSAwICYmIGJ0X2NiKHNrYiktPmNvbnRyb2wucmV0cmllcyA+PSBjaGFuLT5tYXhfdHgpIHsKKwlpZiAoY2hhbi0+bWF4X3R4ICE9IDAgJiYgYnRfY2Ioc2tiKS0+bDJjYXAucmV0cmllcyA+PSBjaGFuLT5tYXhfdHgpIHsKIAkJQlRfREJHKCJSZXRyeSBsaW1pdCBleGNlZWRlZCAoJWQpIiwgY2hhbi0+bWF4X3R4KTsKIAkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjaGFuLCBFQ09OTlJFU0VUKTsKIAkJcmV0dXJuOwpAQCAtNTk5OCw3ICs2MDA1LDcgQEAKIAlza2IgPSBsMmNhcF9lcnRtX3NlcV9pbl9xdWV1ZSgmY2hhbi0+dHhfcSwgY29udHJvbC0+cmVxc2VxKTsKIAogCWlmIChjaGFuLT5tYXhfdHggJiYgc2tiICYmCi0JICAgIGJ0X2NiKHNrYiktPmNvbnRyb2wucmV0cmllcyA+PSBjaGFuLT5tYXhfdHgpIHsKKwkgICAgYnRfY2Ioc2tiKS0+bDJjYXAucmV0cmllcyA+PSBjaGFuLT5tYXhfdHgpIHsKIAkJQlRfREJHKCJSZXRyeSBsaW1pdCBleGNlZWRlZCAoJWQpIiwgY2hhbi0+bWF4X3R4KTsKIAkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjaGFuLCBFQ09OTlJFU0VUKTsKIAkJcmV0dXJuOwpAQCAtNjU1OCw3ICs2NTY1LDcgQEAKIAogc3RhdGljIGludCBsMmNhcF9kYXRhX3JjdihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgbDJjYXBfY3RybCAqY29udHJvbCA9ICZidF9jYihza2IpLT5jb250cm9sOworCXN0cnVjdCBsMmNhcF9jdHJsICpjb250cm9sID0gJmJ0X2NiKHNrYiktPmwyY2FwOwogCXUxNiBsZW47CiAJdTggZXZlbnQ7CiAKQEAgLTY3ODUsNiArNjc5MiwxMyBAQAogCiAJQlRfREJHKCJjaGFuICVwLCBsZW4gJWQiLCBjaGFuLCBza2ItPmxlbik7CiAKKwkvKiBJZiB3ZSByZWNlaXZlIGRhdGEgb24gYSBmaXhlZCBjaGFubmVsIGJlZm9yZSB0aGUgaW5mbyByZXEvcnNwCisJICogcHJvY2R1cmUgaXMgZG9uZSBzaW1wbHkgYXNzdW1lIHRoYXQgdGhlIGNoYW5uZWwgaXMgc3VwcG9ydGVkCisJICogYW5kIG1hcmsgaXQgYXMgcmVhZHkuCisJICovCisJaWYgKGNoYW4tPmNoYW5fdHlwZSA9PSBMMkNBUF9DSEFOX0ZJWEVEKQorCQlsMmNhcF9jaGFuX3JlYWR5KGNoYW4pOworCiAJaWYgKGNoYW4tPnN0YXRlICE9IEJUX0NPTk5FQ1RFRCkKIAkJZ290byBkcm9wOwogCkBAIC02ODUwLDggKzY4NjQsOCBAQAogCQlnb3RvIGRyb3A7CiAKIAkvKiBTdG9yZSByZW1vdGUgQkRfQUREUiBhbmQgUFNNIGZvciBtc2dfbmFtZSAqLwotCWJhY3B5KCZidF9jYihza2IpLT5iZGFkZHIsICZoY29uLT5kc3QpOwotCWJ0X2NiKHNrYiktPnBzbSA9IHBzbTsKKwliYWNweSgmYnRfY2Ioc2tiKS0+bDJjYXAuYmRhZGRyLCAmaGNvbi0+ZHN0KTsKKwlidF9jYihza2IpLT5sMmNhcC5wc20gPSBwc207CiAKIAlpZiAoIWNoYW4tPm9wcy0+cmVjdihjaGFuLCBza2IpKSB7CiAJCWwyY2FwX2NoYW5fcHV0KGNoYW4pOwpAQCAtNjk3MywxMiArNjk4NywxMiBAQAogCWNvbm4tPmxvY2FsX2ZpeGVkX2NoYW4gPSBMMkNBUF9GQ19TSUdfQlJFRFIgfCBMMkNBUF9GQ19DT05OTEVTUzsKIAogCWlmIChoY29uLT50eXBlID09IEFDTF9MSU5LICYmCi0JICAgIHRlc3RfYml0KEhDSV9IU19FTkFCTEVELCAmaGNvbi0+aGRldi0+ZGV2X2ZsYWdzKSkKKwkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoaGNvbi0+aGRldiwgSENJX0hTX0VOQUJMRUQpKQogCQljb25uLT5sb2NhbF9maXhlZF9jaGFuIHw9IEwyQ0FQX0ZDX0EyTVA7CiAKLQlpZiAodGVzdF9iaXQoSENJX0xFX0VOQUJMRUQsICZoY29uLT5oZGV2LT5kZXZfZmxhZ3MpICYmCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhjb24tPmhkZXYsIEhDSV9MRV9FTkFCTEVEKSAmJgogCSAgICAoYnJlZHJfc2NfZW5hYmxlZChoY29uLT5oZGV2KSB8fAotCSAgICAgdGVzdF9iaXQoSENJX0ZPUkNFX0JSRURSX1NNUCwgJmhjb24tPmhkZXYtPmRiZ19mbGFncykpKQorCSAgICAgaGNpX2Rldl90ZXN0X2ZsYWcoaGNvbi0+aGRldiwgSENJX0ZPUkNFX0JSRURSX1NNUCkpKQogCQljb25uLT5sb2NhbF9maXhlZF9jaGFuIHw9IEwyQ0FQX0ZDX1NNUF9CUkVEUjsKIAogCW11dGV4X2luaXQoJmNvbm4tPmlkZW50X2xvY2spOwpAQCAtNzA5OCw3ICs3MTEyLDcgQEAKIAkJZWxzZQogCQkJZHN0X3R5cGUgPSBBRERSX0xFX0RFVl9SQU5ET007CiAKLQkJaWYgKHRlc3RfYml0KEhDSV9BRFZFUlRJU0lORywgJmhkZXYtPmRldl9mbGFncykpCisJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkcpKQogCQkJcm9sZSA9IEhDSV9ST0xFX1NMQVZFOwogCQllbHNlCiAJCQlyb2xlID0gSENJX1JPTEVfTUFTVEVSOwpAQCAtNzIzOCwxMyArNzI1MiwxNiBAQAogCXJldHVybiBOVUxMOwogfQogCi12b2lkIGwyY2FwX2Nvbm5lY3RfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgdTggc3RhdHVzKQorc3RhdGljIHZvaWQgbDJjYXBfY29ubmVjdF9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCB1OCBzdGF0dXMpCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBoY29uLT5oZGV2OwogCXN0cnVjdCBsMmNhcF9jb25uICpjb25uOwogCXN0cnVjdCBsMmNhcF9jaGFuICpwY2hhbjsKIAl1OCBkc3RfdHlwZTsKIAorCWlmIChoY29uLT50eXBlICE9IEFDTF9MSU5LICYmIGhjb24tPnR5cGUgIT0gTEVfTElOSykKKwkJcmV0dXJuOworCiAJQlRfREJHKCJoY29uICVwIGJkYWRkciAlcE1SIHN0YXR1cyAlZCIsIGhjb24sICZoY29uLT5kc3QsIHN0YXR1cyk7CiAKIAlpZiAoc3RhdHVzKSB7CkBAIC03MzA3LDggKzczMjQsMTEgQEAKIAlyZXR1cm4gY29ubi0+ZGlzY19yZWFzb247CiB9CiAKLXZvaWQgbDJjYXBfZGlzY29ubl9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCB1OCByZWFzb24pCitzdGF0aWMgdm9pZCBsMmNhcF9kaXNjb25uX2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHU4IHJlYXNvbikKIHsKKwlpZiAoaGNvbi0+dHlwZSAhPSBBQ0xfTElOSyAmJiBoY29uLT50eXBlICE9IExFX0xJTkspCisJCXJldHVybjsKKwogCUJUX0RCRygiaGNvbiAlcCByZWFzb24gJWQiLCBoY29uLCByZWFzb24pOwogCiAJbDJjYXBfY29ubl9kZWwoaGNvbiwgYnRfdG9fZXJybm8ocmVhc29uKSk7CkBAIC03MzMxLDEzICs3MzUxLDEzIEBACiAJfQogfQogCi1pbnQgbDJjYXBfc2VjdXJpdHlfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgdTggc3RhdHVzLCB1OCBlbmNyeXB0KQorc3RhdGljIHZvaWQgbDJjYXBfc2VjdXJpdHlfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgdTggc3RhdHVzLCB1OCBlbmNyeXB0KQogewogCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gaGNvbi0+bDJjYXBfZGF0YTsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbjsKIAogCWlmICghY29ubikKLQkJcmV0dXJuIDA7CisJCXJldHVybjsKIAogCUJUX0RCRygiY29ubiAlcCBzdGF0dXMgMHglMi4yeCBlbmNyeXB0ICV1IiwgY29ubiwgc3RhdHVzLCBlbmNyeXB0KTsKIApAQCAtNzQyMCw4ICs3NDQwLDYgQEAKIAl9CiAKIAltdXRleF91bmxvY2soJmNvbm4tPmNoYW5fbG9jayk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogaW50IGwyY2FwX3JlY3ZfYWNsZGF0YShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHN0cnVjdCBza19idWZmICpza2IsIHUxNiBmbGFncykKQEAgLTc1MjksNiArNzU0NywxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGhjaV9jYiBsMmNhcF9jYiA9IHsKKwkubmFtZQkJPSAiTDJDQVAiLAorCS5jb25uZWN0X2NmbQk9IGwyY2FwX2Nvbm5lY3RfY2ZtLAorCS5kaXNjb25uX2NmbQk9IGwyY2FwX2Rpc2Nvbm5fY2ZtLAorCS5zZWN1cml0eV9jZm0JPSBsMmNhcF9zZWN1cml0eV9jZm0sCit9OworCiBzdGF0aWMgaW50IGwyY2FwX2RlYnVnZnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnApCiB7CiAJc3RydWN0IGwyY2FwX2NoYW4gKmM7CkBAIC03NTcwLDYgKzc1OTUsOCBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJaGNpX3JlZ2lzdGVyX2NiKCZsMmNhcF9jYik7CisKIAlpZiAoSVNfRVJSX09SX05VTEwoYnRfZGVidWdmcykpCiAJCXJldHVybiAwOwogCkBAIC03NTg3LDYgKzc2MTQsNyBAQAogdm9pZCBsMmNhcF9leGl0KHZvaWQpCiB7CiAJZGVidWdmc19yZW1vdmUobDJjYXBfZGVidWdmcyk7CisJaGNpX3VucmVnaXN0ZXJfY2IoJmwyY2FwX2NiKTsKIAlsMmNhcF9jbGVhbnVwX3NvY2tldHMoKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYwppbmRleCA2MDY5NGYwLi5hNzI3OGYwIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYworKysgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX3NvY2suYwpAQCAtOTQ0LDggKzk0NCw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBsMmNhcF9zb2NrX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCBsMmNhcF9zb2NrX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJICAgICAgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IGwyY2FwX3BpKHNrKS0+Y2hhbjsKQEAgLTk3Niw4ICs5NzYsOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbDJjYXBfc29ja19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IGZsYWdzKQorc3RhdGljIGludCBsMmNhcF9zb2NrX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJICAgICAgc2l6ZV90IGxlbiwgaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBsMmNhcF9waW5mbyAqcGkgPSBsMmNhcF9waShzayk7CkBAIC0xMDA0LDkgKzEwMDQsOSBAQAogCXJlbGVhc2Vfc29jayhzayk7CiAKIAlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1NUUkVBTSkKLQkJZXJyID0gYnRfc29ja19zdHJlYW1fcmVjdm1zZyhpb2NiLCBzb2NrLCBtc2csIGxlbiwgZmxhZ3MpOworCQllcnIgPSBidF9zb2NrX3N0cmVhbV9yZWN2bXNnKHNvY2ssIG1zZywgbGVuLCBmbGFncyk7CiAJZWxzZQotCQllcnIgPSBidF9zb2NrX3JlY3Ztc2coaW9jYiwgc29jaywgbXNnLCBsZW4sIGZsYWdzKTsKKwkJZXJyID0gYnRfc29ja19yZWN2bXNnKHNvY2ssIG1zZywgbGVuLCBmbGFncyk7CiAKIAlpZiAocGktPmNoYW4tPm1vZGUgIT0gTDJDQVBfTU9ERV9FUlRNKQogCQlyZXR1cm4gZXJyOwpAQCAtMTMzMCw3ICsxMzMwLDcgQEAKIAogCXNrYi0+cHJpb3JpdHkgPSBzay0+c2tfcHJpb3JpdHk7CiAKLQlidF9jYihza2IpLT5jaGFuID0gY2hhbjsKKwlidF9jYihza2IpLT5sMmNhcC5jaGFuID0gY2hhbjsKIAogCXJldHVybiBza2I7CiB9CkBAIC0xNDQ0LDggKzE0NDQsOCBAQAogCiAJbWVtc2V0KGxhLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2wyKSk7CiAJbGEtPmwyX2ZhbWlseSA9IEFGX0JMVUVUT09USDsKLQlsYS0+bDJfcHNtID0gYnRfY2Ioc2tiKS0+cHNtOwotCWJhY3B5KCZsYS0+bDJfYmRhZGRyLCAmYnRfY2Ioc2tiKS0+YmRhZGRyKTsKKwlsYS0+bDJfcHNtID0gYnRfY2Ioc2tiKS0+bDJjYXAucHNtOworCWJhY3B5KCZsYS0+bDJfYmRhZGRyLCAmYnRfY2Ioc2tiKS0+bDJjYXAuYmRhZGRyKTsKIAogCSptc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbDIpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9tZ210LmMgYi9uZXQvYmx1ZXRvb3RoL21nbXQuYwppbmRleCA5ZWM1MzkwLi43ZmQ4N2U3IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL21nbXQuYworKysgYi9uZXQvYmx1ZXRvb3RoL21nbXQuYwpAQCAtMjksMTQgKzI5LDE2IEBACiAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9sMmNhcC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvbWdtdC5oPgogCiAjaW5jbHVkZSAiaGNpX3JlcXVlc3QuaCIKICNpbmNsdWRlICJzbXAuaCIKKyNpbmNsdWRlICJtZ210X3V0aWwuaCIKIAogI2RlZmluZSBNR01UX1ZFUlNJT04JMQotI2RlZmluZSBNR01UX1JFVklTSU9OCTgKKyNkZWZpbmUgTUdNVF9SRVZJU0lPTgk5CiAKIHN0YXRpYyBjb25zdCB1MTYgbWdtdF9jb21tYW5kc1tdID0gewogCU1HTVRfT1BfUkVBRF9JTkRFWF9MSVNULApAQCAtOTUsNiArOTcsMTEgQEAKIAlNR01UX09QX1NFVF9FWFRFUk5BTF9DT05GSUcsCiAJTUdNVF9PUF9TRVRfUFVCTElDX0FERFJFU1MsCiAJTUdNVF9PUF9TVEFSVF9TRVJWSUNFX0RJU0NPVkVSWSwKKwlNR01UX09QX1JFQURfTE9DQUxfT09CX0VYVF9EQVRBLAorCU1HTVRfT1BfUkVBRF9FWFRfSU5ERVhfTElTVCwKKwlNR01UX09QX1JFQURfQURWX0ZFQVRVUkVTLAorCU1HTVRfT1BfQUREX0FEVkVSVElTSU5HLAorCU1HTVRfT1BfUkVNT1ZFX0FEVkVSVElTSU5HLAogfTsKIAogc3RhdGljIGNvbnN0IHUxNiBtZ210X2V2ZW50c1tdID0gewpAQCAtMTI3LDYgKzEzNCwzMiBAQAogCU1HTVRfRVZfVU5DT05GX0lOREVYX0FEREVELAogCU1HTVRfRVZfVU5DT05GX0lOREVYX1JFTU9WRUQsCiAJTUdNVF9FVl9ORVdfQ09ORklHX09QVElPTlMsCisJTUdNVF9FVl9FWFRfSU5ERVhfQURERUQsCisJTUdNVF9FVl9FWFRfSU5ERVhfUkVNT1ZFRCwKKwlNR01UX0VWX0xPQ0FMX09PQl9EQVRBX1VQREFURUQsCisJTUdNVF9FVl9BRFZFUlRJU0lOR19BRERFRCwKKwlNR01UX0VWX0FEVkVSVElTSU5HX1JFTU9WRUQsCit9OworCitzdGF0aWMgY29uc3QgdTE2IG1nbXRfdW50cnVzdGVkX2NvbW1hbmRzW10gPSB7CisJTUdNVF9PUF9SRUFEX0lOREVYX0xJU1QsCisJTUdNVF9PUF9SRUFEX0lORk8sCisJTUdNVF9PUF9SRUFEX1VOQ09ORl9JTkRFWF9MSVNULAorCU1HTVRfT1BfUkVBRF9DT05GSUdfSU5GTywKKwlNR01UX09QX1JFQURfRVhUX0lOREVYX0xJU1QsCit9OworCitzdGF0aWMgY29uc3QgdTE2IG1nbXRfdW50cnVzdGVkX2V2ZW50c1tdID0geworCU1HTVRfRVZfSU5ERVhfQURERUQsCisJTUdNVF9FVl9JTkRFWF9SRU1PVkVELAorCU1HTVRfRVZfTkVXX1NFVFRJTkdTLAorCU1HTVRfRVZfQ0xBU1NfT0ZfREVWX0NIQU5HRUQsCisJTUdNVF9FVl9MT0NBTF9OQU1FX0NIQU5HRUQsCisJTUdNVF9FVl9VTkNPTkZfSU5ERVhfQURERUQsCisJTUdNVF9FVl9VTkNPTkZfSU5ERVhfUkVNT1ZFRCwKKwlNR01UX0VWX05FV19DT05GSUdfT1BUSU9OUywKKwlNR01UX0VWX0VYVF9JTkRFWF9BRERFRCwKKwlNR01UX0VWX0VYVF9JTkRFWF9SRU1PVkVELAogfTsKIAogI2RlZmluZSBDQUNIRV9USU1FT1VUCW1zZWNzX3RvX2ppZmZpZXMoMiAqIDEwMDApCkBAIC0xMzQsMTcgKzE2Nyw2IEBACiAjZGVmaW5lIFpFUk9fS0VZICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIgXAogCQkgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgogCi1zdHJ1Y3QgcGVuZGluZ19jbWQgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1MTYgb3Bjb2RlOwotCWludCBpbmRleDsKLQl2b2lkICpwYXJhbTsKLQlzaXplX3QgcGFyYW1fbGVuOwotCXN0cnVjdCBzb2NrICpzazsKLQl2b2lkICp1c2VyX2RhdGE7Ci0JaW50ICgqY21kX2NvbXBsZXRlKShzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCwgdTggc3RhdHVzKTsKLX07Ci0KIC8qIEhDSSB0byBNR01UIGVycm9yIGNvZGUgY29udmVyc2lvbiB0YWJsZSAqLwogc3RhdGljIHU4IG1nbXRfc3RhdHVzX3RhYmxlW10gPSB7CiAJTUdNVF9TVEFUVVNfU1VDQ0VTUywKQEAgLTIxOCw5OCArMjQwLDMyIEBACiAJcmV0dXJuIE1HTVRfU1RBVFVTX0ZBSUxFRDsKIH0KIAotc3RhdGljIGludCBtZ210X2V2ZW50KHUxNiBldmVudCwgc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKmRhdGEsIHUxNiBkYXRhX2xlbiwKK3N0YXRpYyBpbnQgbWdtdF9pbmRleF9ldmVudCh1MTYgZXZlbnQsIHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkICpkYXRhLAorCQkJICAgIHUxNiBsZW4sIGludCBmbGFnKQoreworCXJldHVybiBtZ210X3NlbmRfZXZlbnQoZXZlbnQsIGhkZXYsIEhDSV9DSEFOTkVMX0NPTlRST0wsIGRhdGEsIGxlbiwKKwkJCSAgICAgICBmbGFnLCBOVUxMKTsKK30KKworc3RhdGljIGludCBtZ210X2xpbWl0ZWRfZXZlbnQodTE2IGV2ZW50LCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwKKwkJCSAgICAgIHUxNiBsZW4sIGludCBmbGFnLCBzdHJ1Y3Qgc29jayAqc2tpcF9zaykKK3sKKwlyZXR1cm4gbWdtdF9zZW5kX2V2ZW50KGV2ZW50LCBoZGV2LCBIQ0lfQ0hBTk5FTF9DT05UUk9MLCBkYXRhLCBsZW4sCisJCQkgICAgICAgZmxhZywgc2tpcF9zayk7Cit9CisKK3N0YXRpYyBpbnQgbWdtdF9nZW5lcmljX2V2ZW50KHUxNiBldmVudCwgc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKmRhdGEsCisJCQkgICAgICB1MTYgbGVuLCBzdHJ1Y3Qgc29jayAqc2tpcF9zaykKK3sKKwlyZXR1cm4gbWdtdF9zZW5kX2V2ZW50KGV2ZW50LCBoZGV2LCBIQ0lfQ0hBTk5FTF9DT05UUk9MLCBkYXRhLCBsZW4sCisJCQkgICAgICAgSENJX01HTVRfR0VORVJJQ19FVkVOVFMsIHNraXBfc2spOworfQorCitzdGF0aWMgaW50IG1nbXRfZXZlbnQodTE2IGV2ZW50LCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwgdTE2IGxlbiwKIAkJICAgICAgc3RydWN0IHNvY2sgKnNraXBfc2spCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgbWdtdF9oZHIgKmhkcjsKLQotCXNrYiA9IGFsbG9jX3NrYihzaXplb2YoKmhkcikgKyBkYXRhX2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFza2IpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaGRyID0gKHZvaWQgKikgc2tiX3B1dChza2IsIHNpemVvZigqaGRyKSk7Ci0JaGRyLT5vcGNvZGUgPSBjcHVfdG9fbGUxNihldmVudCk7Ci0JaWYgKGhkZXYpCi0JCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihoZGV2LT5pZCk7Ci0JZWxzZQotCQloZHItPmluZGV4ID0gY3B1X3RvX2xlMTYoTUdNVF9JTkRFWF9OT05FKTsKLQloZHItPmxlbiA9IGNwdV90b19sZTE2KGRhdGFfbGVuKTsKLQotCWlmIChkYXRhKQotCQltZW1jcHkoc2tiX3B1dChza2IsIGRhdGFfbGVuKSwgZGF0YSwgZGF0YV9sZW4pOwotCi0JLyogVGltZSBzdGFtcCAqLwotCV9fbmV0X3RpbWVzdGFtcChza2IpOwotCi0JaGNpX3NlbmRfdG9fY29udHJvbChza2IsIHNraXBfc2spOwotCWtmcmVlX3NrYihza2IpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY21kX3N0YXR1cyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdTE2IGNtZCwgdTggc3RhdHVzKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IG1nbXRfaGRyICpoZHI7Ci0Jc3RydWN0IG1nbXRfZXZfY21kX3N0YXR1cyAqZXY7Ci0JaW50IGVycjsKLQotCUJUX0RCRygic29jayAlcCwgaW5kZXggJXUsIGNtZCAldSwgc3RhdHVzICV1Iiwgc2ssIGluZGV4LCBjbWQsIHN0YXR1cyk7Ci0KLQlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKCpoZHIpICsgc2l6ZW9mKCpldiksIEdGUF9LRVJORUwpOwotCWlmICghc2tiKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWhkciA9ICh2b2lkICopIHNrYl9wdXQoc2tiLCBzaXplb2YoKmhkcikpOwotCi0JaGRyLT5vcGNvZGUgPSBjcHVfdG9fbGUxNihNR01UX0VWX0NNRF9TVEFUVVMpOwotCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCk7Ci0JaGRyLT5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKmV2KSk7Ci0KLQlldiA9ICh2b2lkICopIHNrYl9wdXQoc2tiLCBzaXplb2YoKmV2KSk7Ci0JZXYtPnN0YXR1cyA9IHN0YXR1czsKLQlldi0+b3Bjb2RlID0gY3B1X3RvX2xlMTYoY21kKTsKLQotCWVyciA9IHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKLQlpZiAoZXJyIDwgMCkKLQkJa2ZyZWVfc2tiKHNrYik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGNtZF9jb21wbGV0ZShzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdTE2IGNtZCwgdTggc3RhdHVzLAotCQkJdm9pZCAqcnAsIHNpemVfdCBycF9sZW4pCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgbWdtdF9oZHIgKmhkcjsKLQlzdHJ1Y3QgbWdtdF9ldl9jbWRfY29tcGxldGUgKmV2OwotCWludCBlcnI7Ci0KLQlCVF9EQkcoInNvY2sgJXAiLCBzayk7Ci0KLQlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKCpoZHIpICsgc2l6ZW9mKCpldikgKyBycF9sZW4sIEdGUF9LRVJORUwpOwotCWlmICghc2tiKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWhkciA9ICh2b2lkICopIHNrYl9wdXQoc2tiLCBzaXplb2YoKmhkcikpOwotCi0JaGRyLT5vcGNvZGUgPSBjcHVfdG9fbGUxNihNR01UX0VWX0NNRF9DT01QTEVURSk7Ci0JaGRyLT5pbmRleCA9IGNwdV90b19sZTE2KGluZGV4KTsKLQloZHItPmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqZXYpICsgcnBfbGVuKTsKLQotCWV2ID0gKHZvaWQgKikgc2tiX3B1dChza2IsIHNpemVvZigqZXYpICsgcnBfbGVuKTsKLQlldi0+b3Bjb2RlID0gY3B1X3RvX2xlMTYoY21kKTsKLQlldi0+c3RhdHVzID0gc3RhdHVzOwotCi0JaWYgKHJwKQotCQltZW1jcHkoZXYtPmRhdGEsIHJwLCBycF9sZW4pOwotCi0JZXJyID0gc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOwotCWlmIChlcnIgPCAwKQotCQlrZnJlZV9za2Ioc2tiKTsKLQotCXJldHVybiBlcnI7CisJcmV0dXJuIG1nbXRfc2VuZF9ldmVudChldmVudCwgaGRldiwgSENJX0NIQU5ORUxfQ09OVFJPTCwgZGF0YSwgbGVuLAorCQkJICAgICAgIEhDSV9TT0NLX1RSVVNURUQsIHNraXBfc2spOwogfQogCiBzdGF0aWMgaW50IHJlYWRfdmVyc2lvbihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkICpkYXRhLApAQCAtMzIyLDIyICsyNzgsMjggQEAKIAlycC52ZXJzaW9uID0gTUdNVF9WRVJTSU9OOwogCXJwLnJldmlzaW9uID0gY3B1X3RvX2xlMTYoTUdNVF9SRVZJU0lPTik7CiAKLQlyZXR1cm4gY21kX2NvbXBsZXRlKHNrLCBNR01UX0lOREVYX05PTkUsIE1HTVRfT1BfUkVBRF9WRVJTSU9OLCAwLCAmcnAsCi0JCQkgICAgc2l6ZW9mKHJwKSk7CisJcmV0dXJuIG1nbXRfY21kX2NvbXBsZXRlKHNrLCBNR01UX0lOREVYX05PTkUsIE1HTVRfT1BfUkVBRF9WRVJTSU9OLCAwLAorCQkJCSAmcnAsIHNpemVvZihycCkpOwogfQogCiBzdGF0aWMgaW50IHJlYWRfY29tbWFuZHMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwKIAkJCSB1MTYgZGF0YV9sZW4pCiB7CiAJc3RydWN0IG1nbXRfcnBfcmVhZF9jb21tYW5kcyAqcnA7Ci0JY29uc3QgdTE2IG51bV9jb21tYW5kcyA9IEFSUkFZX1NJWkUobWdtdF9jb21tYW5kcyk7Ci0JY29uc3QgdTE2IG51bV9ldmVudHMgPSBBUlJBWV9TSVpFKG1nbXRfZXZlbnRzKTsKLQlfX2xlMTYgKm9wY29kZTsKKwl1MTYgbnVtX2NvbW1hbmRzLCBudW1fZXZlbnRzOwogCXNpemVfdCBycF9zaXplOwogCWludCBpLCBlcnI7CiAKIAlCVF9EQkcoInNvY2sgJXAiLCBzayk7CiAKKwlpZiAoaGNpX3NvY2tfdGVzdF9mbGFnKHNrLCBIQ0lfU09DS19UUlVTVEVEKSkgeworCQludW1fY29tbWFuZHMgPSBBUlJBWV9TSVpFKG1nbXRfY29tbWFuZHMpOworCQludW1fZXZlbnRzID0gQVJSQVlfU0laRShtZ210X2V2ZW50cyk7CisJfSBlbHNlIHsKKwkJbnVtX2NvbW1hbmRzID0gQVJSQVlfU0laRShtZ210X3VudHJ1c3RlZF9jb21tYW5kcyk7CisJCW51bV9ldmVudHMgPSBBUlJBWV9TSVpFKG1nbXRfdW50cnVzdGVkX2V2ZW50cyk7CisJfQorCiAJcnBfc2l6ZSA9IHNpemVvZigqcnApICsgKChudW1fY29tbWFuZHMgKyBudW1fZXZlbnRzKSAqIHNpemVvZih1MTYpKTsKIAogCXJwID0ga21hbGxvYyhycF9zaXplLCBHRlBfS0VSTkVMKTsKQEAgLTM0NywxNCArMzA5LDI2IEBACiAJcnAtPm51bV9jb21tYW5kcyA9IGNwdV90b19sZTE2KG51bV9jb21tYW5kcyk7CiAJcnAtPm51bV9ldmVudHMgPSBjcHVfdG9fbGUxNihudW1fZXZlbnRzKTsKIAotCWZvciAoaSA9IDAsIG9wY29kZSA9IHJwLT5vcGNvZGVzOyBpIDwgbnVtX2NvbW1hbmRzOyBpKyssIG9wY29kZSsrKQotCQlwdXRfdW5hbGlnbmVkX2xlMTYobWdtdF9jb21tYW5kc1tpXSwgb3Bjb2RlKTsKKwlpZiAoaGNpX3NvY2tfdGVzdF9mbGFnKHNrLCBIQ0lfU09DS19UUlVTVEVEKSkgeworCQlfX2xlMTYgKm9wY29kZSA9IHJwLT5vcGNvZGVzOwogCi0JZm9yIChpID0gMDsgaSA8IG51bV9ldmVudHM7IGkrKywgb3Bjb2RlKyspCi0JCXB1dF91bmFsaWduZWRfbGUxNihtZ210X2V2ZW50c1tpXSwgb3Bjb2RlKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9jb21tYW5kczsgaSsrLCBvcGNvZGUrKykKKwkJCXB1dF91bmFsaWduZWRfbGUxNihtZ210X2NvbW1hbmRzW2ldLCBvcGNvZGUpOwogCi0JZXJyID0gY21kX2NvbXBsZXRlKHNrLCBNR01UX0lOREVYX05PTkUsIE1HTVRfT1BfUkVBRF9DT01NQU5EUywgMCwgcnAsCi0JCQkgICBycF9zaXplKTsKKwkJZm9yIChpID0gMDsgaSA8IG51bV9ldmVudHM7IGkrKywgb3Bjb2RlKyspCisJCQlwdXRfdW5hbGlnbmVkX2xlMTYobWdtdF9ldmVudHNbaV0sIG9wY29kZSk7CisJfSBlbHNlIHsKKwkJX19sZTE2ICpvcGNvZGUgPSBycC0+b3Bjb2RlczsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbW1hbmRzOyBpKyssIG9wY29kZSsrKQorCQkJcHV0X3VuYWxpZ25lZF9sZTE2KG1nbXRfdW50cnVzdGVkX2NvbW1hbmRzW2ldLCBvcGNvZGUpOworCisJCWZvciAoaSA9IDA7IGkgPCBudW1fZXZlbnRzOyBpKyssIG9wY29kZSsrKQorCQkJcHV0X3VuYWxpZ25lZF9sZTE2KG1nbXRfdW50cnVzdGVkX2V2ZW50c1tpXSwgb3Bjb2RlKTsKKwl9CisKKwllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgTUdNVF9JTkRFWF9OT05FLCBNR01UX09QX1JFQURfQ09NTUFORFMsIDAsCisJCQkJcnAsIHJwX3NpemUpOwogCWtmcmVlKHJwKTsKIAogCXJldHVybiBlcnI7CkBAIC0zNzYsNyArMzUwLDcgQEAKIAljb3VudCA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmaGNpX2Rldl9saXN0LCBsaXN0KSB7CiAJCWlmIChkLT5kZXZfdHlwZSA9PSBIQ0lfQlJFRFIgJiYKLQkJICAgICF0ZXN0X2JpdChIQ0lfVU5DT05GSUdVUkVELCAmZC0+ZGV2X2ZsYWdzKSkKKwkJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhkLCBIQ0lfVU5DT05GSUdVUkVEKSkKIAkJCWNvdW50Kys7CiAJfQogCkBAIC0zODksOSArMzYzLDkgQEAKIAogCWNvdW50ID0gMDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZoY2lfZGV2X2xpc3QsIGxpc3QpIHsKLQkJaWYgKHRlc3RfYml0KEhDSV9TRVRVUCwgJmQtPmRldl9mbGFncykgfHwKLQkJICAgIHRlc3RfYml0KEhDSV9DT05GSUcsICZkLT5kZXZfZmxhZ3MpIHx8Ci0JCSAgICB0ZXN0X2JpdChIQ0lfVVNFUl9DSEFOTkVMLCAmZC0+ZGV2X2ZsYWdzKSkKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGQsIEhDSV9TRVRVUCkgfHwKKwkJICAgIGhjaV9kZXZfdGVzdF9mbGFnKGQsIEhDSV9DT05GSUcpIHx8CisJCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhkLCBIQ0lfVVNFUl9DSEFOTkVMKSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIERldmljZXMgbWFya2VkIGFzIHJhdy1vbmx5IGFyZSBuZWl0aGVyIGNvbmZpZ3VyZWQKQEAgLTQwMSw3ICszNzUsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKGQtPmRldl90eXBlID09IEhDSV9CUkVEUiAmJgotCQkgICAgIXRlc3RfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZkLT5kZXZfZmxhZ3MpKSB7CisJCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoZCwgSENJX1VOQ09ORklHVVJFRCkpIHsKIAkJCXJwLT5pbmRleFtjb3VudCsrXSA9IGNwdV90b19sZTE2KGQtPmlkKTsKIAkJCUJUX0RCRygiQWRkZWQgaGNpJXUiLCBkLT5pZCk7CiAJCX0KQEAgLTQxMiw4ICszODYsOCBAQAogCiAJcmVhZF91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKIAotCWVyciA9IGNtZF9jb21wbGV0ZShzaywgTUdNVF9JTkRFWF9OT05FLCBNR01UX09QX1JFQURfSU5ERVhfTElTVCwgMCwgcnAsCi0JCQkgICBycF9sZW4pOworCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBNR01UX0lOREVYX05PTkUsIE1HTVRfT1BfUkVBRF9JTkRFWF9MSVNULAorCQkJCTAsIHJwLCBycF9sZW4pOwogCiAJa2ZyZWUocnApOwogCkBAIC00MzYsNyArNDEwLDcgQEAKIAljb3VudCA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmaGNpX2Rldl9saXN0LCBsaXN0KSB7CiAJCWlmIChkLT5kZXZfdHlwZSA9PSBIQ0lfQlJFRFIgJiYKLQkJICAgIHRlc3RfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZkLT5kZXZfZmxhZ3MpKQorCQkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoZCwgSENJX1VOQ09ORklHVVJFRCkpCiAJCQljb3VudCsrOwogCX0KIApAQCAtNDQ5LDkgKzQyMyw5IEBACiAKIAljb3VudCA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkLCAmaGNpX2Rldl9saXN0LCBsaXN0KSB7Ci0JCWlmICh0ZXN0X2JpdChIQ0lfU0VUVVAsICZkLT5kZXZfZmxhZ3MpIHx8Ci0JCSAgICB0ZXN0X2JpdChIQ0lfQ09ORklHLCAmZC0+ZGV2X2ZsYWdzKSB8fAotCQkgICAgdGVzdF9iaXQoSENJX1VTRVJfQ0hBTk5FTCwgJmQtPmRldl9mbGFncykpCisJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhkLCBIQ0lfU0VUVVApIHx8CisJCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhkLCBIQ0lfQ09ORklHKSB8fAorCQkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoZCwgSENJX1VTRVJfQ0hBTk5FTCkpCiAJCQljb250aW51ZTsKIAogCQkvKiBEZXZpY2VzIG1hcmtlZCBhcyByYXctb25seSBhcmUgbmVpdGhlciBjb25maWd1cmVkCkBAIC00NjEsNyArNDM1LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChkLT5kZXZfdHlwZSA9PSBIQ0lfQlJFRFIgJiYKLQkJICAgIHRlc3RfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZkLT5kZXZfZmxhZ3MpKSB7CisJCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhkLCBIQ0lfVU5DT05GSUdVUkVEKSkgewogCQkJcnAtPmluZGV4W2NvdW50KytdID0gY3B1X3RvX2xlMTYoZC0+aWQpOwogCQkJQlRfREJHKCJBZGRlZCBoY2kldSIsIGQtPmlkKTsKIAkJfQpAQCAtNDcyLDggKzQ0Niw4NCBAQAogCiAJcmVhZF91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKIAotCWVyciA9IGNtZF9jb21wbGV0ZShzaywgTUdNVF9JTkRFWF9OT05FLCBNR01UX09QX1JFQURfVU5DT05GX0lOREVYX0xJU1QsCi0JCQkgICAwLCBycCwgcnBfbGVuKTsKKwllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgTUdNVF9JTkRFWF9OT05FLAorCQkJCU1HTVRfT1BfUkVBRF9VTkNPTkZfSU5ERVhfTElTVCwgMCwgcnAsIHJwX2xlbik7CisKKwlrZnJlZShycCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJlYWRfZXh0X2luZGV4X2xpc3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCSAgICAgICB2b2lkICpkYXRhLCB1MTYgZGF0YV9sZW4pCit7CisJc3RydWN0IG1nbXRfcnBfcmVhZF9leHRfaW5kZXhfbGlzdCAqcnA7CisJc3RydWN0IGhjaV9kZXYgKmQ7CisJc2l6ZV90IHJwX2xlbjsKKwl1MTYgY291bnQ7CisJaW50IGVycjsKKworCUJUX0RCRygic29jayAlcCIsIHNrKTsKKworCXJlYWRfbG9jaygmaGNpX2Rldl9saXN0X2xvY2spOworCisJY291bnQgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmhjaV9kZXZfbGlzdCwgbGlzdCkgeworCQlpZiAoZC0+ZGV2X3R5cGUgPT0gSENJX0JSRURSIHx8IGQtPmRldl90eXBlID09IEhDSV9BTVApCisJCQljb3VudCsrOworCX0KKworCXJwX2xlbiA9IHNpemVvZigqcnApICsgKHNpemVvZihycC0+ZW50cnlbMF0pICogY291bnQpOworCXJwID0ga21hbGxvYyhycF9sZW4sIEdGUF9BVE9NSUMpOworCWlmICghcnApIHsKKwkJcmVhZF91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJY291bnQgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmhjaV9kZXZfbGlzdCwgbGlzdCkgeworCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoZCwgSENJX1NFVFVQKSB8fAorCQkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoZCwgSENJX0NPTkZJRykgfHwKKwkJICAgIGhjaV9kZXZfdGVzdF9mbGFnKGQsIEhDSV9VU0VSX0NIQU5ORUwpKQorCQkJY29udGludWU7CisKKwkJLyogRGV2aWNlcyBtYXJrZWQgYXMgcmF3LW9ubHkgYXJlIG5laXRoZXIgY29uZmlndXJlZAorCQkgKiBub3IgdW5jb25maWd1cmVkIGNvbnRyb2xsZXJzLgorCQkgKi8KKwkJaWYgKHRlc3RfYml0KEhDSV9RVUlSS19SQVdfREVWSUNFLCAmZC0+cXVpcmtzKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChkLT5kZXZfdHlwZSA9PSBIQ0lfQlJFRFIpIHsKKwkJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhkLCBIQ0lfVU5DT05GSUdVUkVEKSkKKwkJCQlycC0+ZW50cnlbY291bnRdLnR5cGUgPSAweDAxOworCQkJZWxzZQorCQkJCXJwLT5lbnRyeVtjb3VudF0udHlwZSA9IDB4MDA7CisJCX0gZWxzZSBpZiAoZC0+ZGV2X3R5cGUgPT0gSENJX0FNUCkgeworCQkJcnAtPmVudHJ5W2NvdW50XS50eXBlID0gMHgwMjsKKwkJfSBlbHNlIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcnAtPmVudHJ5W2NvdW50XS5idXMgPSBkLT5idXM7CisJCXJwLT5lbnRyeVtjb3VudCsrXS5pbmRleCA9IGNwdV90b19sZTE2KGQtPmlkKTsKKwkJQlRfREJHKCJBZGRlZCBoY2kldSIsIGQtPmlkKTsKKwl9CisKKwlycC0+bnVtX2NvbnRyb2xsZXJzID0gY3B1X3RvX2xlMTYoY291bnQpOworCXJwX2xlbiA9IHNpemVvZigqcnApICsgKHNpemVvZihycC0+ZW50cnlbMF0pICogY291bnQpOworCisJcmVhZF91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKKworCS8qIElmIHRoaXMgY29tbWFuZCBpcyBjYWxsZWQgYXQgbGVhc3Qgb25jZSwgdGhlbiBhbGwgdGhlCisJICogZGVmYXVsdCBpbmRleCBhbmQgdW5jb25maWd1cmVkIGluZGV4IGV2ZW50cyBhcmUgZGlzYWJsZWQKKwkgKiBhbmQgZnJvbSBub3cgb24gb25seSBleHRlbmRlZCBpbmRleCBldmVudHMgYXJlIHVzZWQuCisJICovCisJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9NR01UX0VYVF9JTkRFWF9FVkVOVFMpOworCWhjaV9zb2NrX2NsZWFyX2ZsYWcoc2ssIEhDSV9NR01UX0lOREVYX0VWRU5UUyk7CisJaGNpX3NvY2tfY2xlYXJfZmxhZyhzaywgSENJX01HTVRfVU5DT05GX0lOREVYX0VWRU5UUyk7CisKKwllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgTUdNVF9JTkRFWF9OT05FLAorCQkJCU1HTVRfT1BfUkVBRF9FWFRfSU5ERVhfTElTVCwgMCwgcnAsIHJwX2xlbik7CiAKIAlrZnJlZShycCk7CiAKQEAgLTQ4Myw3ICs1MzMsNyBAQAogc3RhdGljIGJvb2wgaXNfY29uZmlndXJlZChzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlpZiAodGVzdF9iaXQoSENJX1FVSVJLX0VYVEVSTkFMX0NPTkZJRywgJmhkZXYtPnF1aXJrcykgJiYKLQkgICAgIXRlc3RfYml0KEhDSV9FWFRfQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncykpCisJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfRVhUX0NPTkZJR1VSRUQpKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlpZiAodGVzdF9iaXQoSENJX1FVSVJLX0lOVkFMSURfQkRBRERSLCAmaGRldi0+cXVpcmtzKSAmJgpAQCAtNDk4LDcgKzU0OCw3IEBACiAJdTMyIG9wdGlvbnMgPSAwOwogCiAJaWYgKHRlc3RfYml0KEhDSV9RVUlSS19FWFRFUk5BTF9DT05GSUcsICZoZGV2LT5xdWlya3MpICYmCi0JICAgICF0ZXN0X2JpdChIQ0lfRVhUX0NPTkZJR1VSRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0VYVF9DT05GSUdVUkVEKSkKIAkJb3B0aW9ucyB8PSBNR01UX09QVElPTl9FWFRFUk5BTF9DT05GSUc7CiAKIAlpZiAodGVzdF9iaXQoSENJX1FVSVJLX0lOVkFMSURfQkRBRERSLCAmaGRldi0+cXVpcmtzKSAmJgpAQCAtNTEyLDE2ICs1NjIsMTYgQEAKIHsKIAlfX2xlMzIgb3B0aW9ucyA9IGdldF9taXNzaW5nX29wdGlvbnMoaGRldik7CiAKLQlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX05FV19DT05GSUdfT1BUSU9OUywgaGRldiwgJm9wdGlvbnMsCi0JCQkgIHNpemVvZihvcHRpb25zKSwgc2tpcCk7CisJcmV0dXJuIG1nbXRfZ2VuZXJpY19ldmVudChNR01UX0VWX05FV19DT05GSUdfT1BUSU9OUywgaGRldiwgJm9wdGlvbnMsCisJCQkJICBzaXplb2Yob3B0aW9ucyksIHNraXApOwogfQogCiBzdGF0aWMgaW50IHNlbmRfb3B0aW9uc19yc3Aoc3RydWN0IHNvY2sgKnNrLCB1MTYgb3Bjb2RlLCBzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlfX2xlMzIgb3B0aW9ucyA9IGdldF9taXNzaW5nX29wdGlvbnMoaGRldik7CiAKLQlyZXR1cm4gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgb3Bjb2RlLCAwLCAmb3B0aW9ucywKLQkJCSAgICBzaXplb2Yob3B0aW9ucykpOworCXJldHVybiBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIG9wY29kZSwgMCwgJm9wdGlvbnMsCisJCQkJIHNpemVvZihvcHRpb25zKSk7CiB9CiAKIHN0YXRpYyBpbnQgcmVhZF9jb25maWdfaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LApAQCAtNTQ4LDggKzU5OCw4IEBACiAKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKIAotCXJldHVybiBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFQURfQ09ORklHX0lORk8sIDAsICZycCwKLQkJCSAgICBzaXplb2YocnApKTsKKwlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFQURfQ09ORklHX0lORk8sIDAsCisJCQkJICZycCwgc2l6ZW9mKHJwKSk7CiB9CiAKIHN0YXRpYyB1MzIgZ2V0X3N1cHBvcnRlZF9zZXR0aW5ncyhzdHJ1Y3QgaGNpX2RldiAqaGRldikKQEAgLTU4Miw2ICs2MzIsNyBAQAogCQlzZXR0aW5ncyB8PSBNR01UX1NFVFRJTkdfQURWRVJUSVNJTkc7CiAJCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19TRUNVUkVfQ09OTjsKIAkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX1BSSVZBQ1k7CisJCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19TVEFUSUNfQUREUkVTUzsKIAl9CiAKIAlpZiAodGVzdF9iaXQoSENJX1FVSVJLX0VYVEVSTkFMX0NPTkZJRywgJmhkZXYtPnF1aXJrcykgfHwKQEAgLTU5OCw0NSArNjQ5LDY0IEBACiAJaWYgKGhkZXZfaXNfcG93ZXJlZChoZGV2KSkKIAkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX1BPV0VSRUQ7CiAKLQlpZiAodGVzdF9iaXQoSENJX0NPTk5FQ1RBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0NPTk5FQ1RBQkxFKSkKIAkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX0NPTk5FQ1RBQkxFOwogCi0JaWYgKHRlc3RfYml0KEhDSV9GQVNUX0NPTk5FQ1RBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0ZBU1RfQ09OTkVDVEFCTEUpKQogCQlzZXR0aW5ncyB8PSBNR01UX1NFVFRJTkdfRkFTVF9DT05ORUNUQUJMRTsKIAotCWlmICh0ZXN0X2JpdChIQ0lfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0RJU0NPVkVSQUJMRSkpCiAJCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19ESVNDT1ZFUkFCTEU7CiAKLQlpZiAodGVzdF9iaXQoSENJX0JPTkRBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JPTkRBQkxFKSkKIAkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX0JPTkRBQkxFOwogCi0JaWYgKHRlc3RfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpKQogCQlzZXR0aW5ncyB8PSBNR01UX1NFVFRJTkdfQlJFRFI7CiAKLQlpZiAodGVzdF9iaXQoSENJX0xFX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTEVfRU5BQkxFRCkpCiAJCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19MRTsKIAotCWlmICh0ZXN0X2JpdChIQ0lfTElOS19TRUNVUklUWSwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MSU5LX1NFQ1VSSVRZKSkKIAkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX0xJTktfU0VDVVJJVFk7CiAKLQlpZiAodGVzdF9iaXQoSENJX1NTUF9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NTUF9FTkFCTEVEKSkKIAkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX1NTUDsKIAotCWlmICh0ZXN0X2JpdChIQ0lfSFNfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9IU19FTkFCTEVEKSkKIAkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX0hTOwogCi0JaWYgKHRlc3RfYml0KEhDSV9BRFZFUlRJU0lORywgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lORykpCiAJCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19BRFZFUlRJU0lORzsKIAotCWlmICh0ZXN0X2JpdChIQ0lfU0NfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TQ19FTkFCTEVEKSkKIAkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX1NFQ1VSRV9DT05OOwogCi0JaWYgKHRlc3RfYml0KEhDSV9LRUVQX0RFQlVHX0tFWVMsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfS0VFUF9ERUJVR19LRVlTKSkKIAkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX0RFQlVHX0tFWVM7CiAKLQlpZiAodGVzdF9iaXQoSENJX1BSSVZBQ1ksICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfUFJJVkFDWSkpCiAJCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19QUklWQUNZOwogCisJLyogVGhlIGN1cnJlbnQgc2V0dGluZyBmb3Igc3RhdGljIGFkZHJlc3MgaGFzIHR3byBwdXJwb3Nlcy4gVGhlCisJICogZmlyc3QgaXMgdG8gaW5kaWNhdGUgaWYgdGhlIHN0YXRpYyBhZGRyZXNzIHdpbGwgYmUgdXNlZCBhbmQKKwkgKiB0aGUgc2Vjb25kIGlzIHRvIGluZGljYXRlIGlmIGl0IGlzIGFjdHVhbGx5IHNldC4KKwkgKgorCSAqIFRoaXMgbWVhbnMgaWYgdGhlIHN0YXRpYyBhZGRyZXNzIGlzIG5vdCBjb25maWd1cmVkLCB0aGlzIGZsYWcKKwkgKiB3aWxsIG5ldmVyIGJlIHNldC4gSWYgdGhlIGFkZHJlc3MgaXMgY29uZmlndXJlZCwgdGhlbiBpZiB0aGUKKwkgKiBhZGRyZXNzIGlzIGFjdHVhbGx5IHVzZWQgZGVjaWRlcyBpZiB0aGUgZmxhZyBpcyBzZXQgb3Igbm90LgorCSAqCisJICogRm9yIHNpbmdsZSBtb2RlIExFIG9ubHkgY29udHJvbGxlcnMgYW5kIGR1YWwtbW9kZSBjb250cm9sbGVycworCSAqIHdpdGggQlIvRURSIGRpc2FibGVkLCB0aGUgZXhpc3RlbmNlIG9mIHRoZSBzdGF0aWMgYWRkcmVzcyB3aWxsCisJICogYmUgZXZhbHVhdGVkLgorCSAqLworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfRk9SQ0VfU1RBVElDX0FERFIpIHx8CisJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCkgfHwKKwkgICAgIWJhY21wKCZoZGV2LT5iZGFkZHIsIEJEQUREUl9BTlkpKSB7CisJCWlmIChiYWNtcCgmaGRldi0+c3RhdGljX2FkZHIsIEJEQUREUl9BTlkpKQorCQkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX1NUQVRJQ19BRERSRVNTOworCX0KKwogCXJldHVybiBzZXR0aW5nczsKIH0KIApAQCAtNzUwLDM1ICs4MjAsMTkgQEAKIAlyZXR1cm4gcHRyOwogfQogCi1zdGF0aWMgc3RydWN0IHBlbmRpbmdfY21kICptZ210X3BlbmRpbmdfZmluZCh1MTYgb3Bjb2RlLCBzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3N0YXRpYyBzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqcGVuZGluZ19maW5kKHUxNiBvcGNvZGUsIHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjbWQsICZoZGV2LT5tZ210X3BlbmRpbmcsIGxpc3QpIHsKLQkJaWYgKGNtZC0+b3Bjb2RlID09IG9wY29kZSkKLQkJCXJldHVybiBjbWQ7Ci0JfQotCi0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIG1nbXRfcGVuZGluZ19maW5kKEhDSV9DSEFOTkVMX0NPTlRST0wsIG9wY29kZSwgaGRldik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGVuZGluZ19jbWQgKm1nbXRfcGVuZGluZ19maW5kX2RhdGEodTE2IG9wY29kZSwKK3N0YXRpYyBzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqcGVuZGluZ19maW5kX2RhdGEodTE2IG9wY29kZSwKIAkJCQkJCSAgc3RydWN0IGhjaV9kZXYgKmhkZXYsCiAJCQkJCQkgIGNvbnN0IHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNtZCwgJmhkZXYtPm1nbXRfcGVuZGluZywgbGlzdCkgewotCQlpZiAoY21kLT51c2VyX2RhdGEgIT0gZGF0YSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoY21kLT5vcGNvZGUgPT0gb3Bjb2RlKQotCQkJcmV0dXJuIGNtZDsKLQl9Ci0KLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gbWdtdF9wZW5kaW5nX2ZpbmRfZGF0YShIQ0lfQ0hBTk5FTF9DT05UUk9MLCBvcGNvZGUsIGhkZXYsIGRhdGEpOwogfQogCi1zdGF0aWMgdTggY3JlYXRlX3NjYW5fcnNwX2RhdGEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4ICpwdHIpCitzdGF0aWMgdTggY3JlYXRlX2RlZmF1bHRfc2Nhbl9yc3BfZGF0YShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggKnB0cikKIHsKIAl1OCBhZF9sZW4gPSAwOwogCXNpemVfdCBuYW1lX2xlbjsKQEAgLTgwNCwyMSArODU4LDM2IEBACiAJcmV0dXJuIGFkX2xlbjsKIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlX3NjYW5fcnNwX2RhdGEoc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEpCitzdGF0aWMgdTggY3JlYXRlX2luc3RhbmNlX3NjYW5fcnNwX2RhdGEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4ICpwdHIpCit7CisJLyogVE9ETzogU2V0IHRoZSBhcHByb3ByaWF0ZSBlbnRyaWVzIGJhc2VkIG9uIGFkdmVydGlzaW5nIGluc3RhbmNlIGZsYWdzCisJICogaGVyZSBvbmNlIGZsYWdzIG90aGVyIHRoYW4gMCBhcmUgc3VwcG9ydGVkLgorCSAqLworCW1lbWNweShwdHIsIGhkZXYtPmFkdl9pbnN0YW5jZS5zY2FuX3JzcF9kYXRhLAorCSAgICAgICBoZGV2LT5hZHZfaW5zdGFuY2Uuc2Nhbl9yc3BfbGVuKTsKKworCXJldHVybiBoZGV2LT5hZHZfaW5zdGFuY2Uuc2Nhbl9yc3BfbGVuOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfc2Nhbl9yc3BfZGF0YV9mb3JfaW5zdGFuY2Uoc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsCisJCQkJCSAgICAgIHU4IGluc3RhbmNlKQogewogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gcmVxLT5oZGV2OwogCXN0cnVjdCBoY2lfY3BfbGVfc2V0X3NjYW5fcnNwX2RhdGEgY3A7CiAJdTggbGVuOwogCi0JaWYgKCF0ZXN0X2JpdChIQ0lfTEVfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTEVfRU5BQkxFRCkpCiAJCXJldHVybjsKIAogCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOwogCi0JbGVuID0gY3JlYXRlX3NjYW5fcnNwX2RhdGEoaGRldiwgY3AuZGF0YSk7CisJaWYgKGluc3RhbmNlKQorCQlsZW4gPSBjcmVhdGVfaW5zdGFuY2Vfc2Nhbl9yc3BfZGF0YShoZGV2LCBjcC5kYXRhKTsKKwllbHNlCisJCWxlbiA9IGNyZWF0ZV9kZWZhdWx0X3NjYW5fcnNwX2RhdGEoaGRldiwgY3AuZGF0YSk7CiAKIAlpZiAoaGRldi0+c2Nhbl9yc3BfZGF0YV9sZW4gPT0gbGVuICYmCi0JICAgIG1lbWNtcChjcC5kYXRhLCBoZGV2LT5zY2FuX3JzcF9kYXRhLCBsZW4pID09IDApCisJICAgICFtZW1jbXAoY3AuZGF0YSwgaGRldi0+c2Nhbl9yc3BfZGF0YSwgbGVuKSkKIAkJcmV0dXJuOwogCiAJbWVtY3B5KGhkZXYtPnNjYW5fcnNwX2RhdGEsIGNwLmRhdGEsIHNpemVvZihjcC5kYXRhKSk7CkBAIC04MjksMTQgKzg5OCwzMyBAQAogCWhjaV9yZXFfYWRkKHJlcSwgSENJX09QX0xFX1NFVF9TQ0FOX1JTUF9EQVRBLCBzaXplb2YoY3ApLCAmY3ApOwogfQogCitzdGF0aWMgdm9pZCB1cGRhdGVfc2Nhbl9yc3BfZGF0YShzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IHJlcS0+aGRldjsKKwl1OCBpbnN0YW5jZTsKKworCS8qIFRoZSAiU2V0IEFkdmVydGlzaW5nIiBzZXR0aW5nIHN1cGVyc2VkZXMgdGhlICJBZGQgQWR2ZXJ0aXNpbmciCisJICogc2V0dGluZy4gSGVyZSB3ZSBzZXQgdGhlIHNjYW4gcmVzcG9uc2UgZGF0YSBiYXNlZCBvbiB3aGljaAorCSAqIHNldHRpbmcgd2FzIHNldC4gV2hlbiBuZWl0aGVyIGFwcGx5LCBkZWZhdWx0IHRvIHRoZSBnbG9iYWwgc2V0dGluZ3MsCisJICogcmVwcmVzZW50ZWQgYnkgaW5zdGFuY2UgIjAiLgorCSAqLworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkdfSU5TVEFOQ0UpICYmCisJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkcpKQorCQlpbnN0YW5jZSA9IDB4MDE7CisJZWxzZQorCQlpbnN0YW5jZSA9IDB4MDA7CisKKwl1cGRhdGVfc2Nhbl9yc3BfZGF0YV9mb3JfaW5zdGFuY2UocmVxLCBpbnN0YW5jZSk7Cit9CisKIHN0YXRpYyB1OCBnZXRfYWR2X2Rpc2Nvdl9mbGFncyhzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCiAJLyogSWYgdGhlcmUncyBhIHBlbmRpbmcgbWdtdCBjb21tYW5kIHRoZSBmbGFncyB3aWxsIG5vdCB5ZXQgaGF2ZQogCSAqIHRoZWlyIGZpbmFsIHZhbHVlcywgc28gY2hlY2sgZm9yIHRoaXMgZmlyc3QuCiAJICovCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2KTsKKwljbWQgPSBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2KTsKIAlpZiAoY21kKSB7CiAJCXN0cnVjdCBtZ210X21vZGUgKmNwID0gY21kLT5wYXJhbTsKIAkJaWYgKGNwLT52YWwgPT0gMHgwMSkKQEAgLTg0NCwzOSArOTMyLDEzMSBAQAogCQllbHNlIGlmIChjcC0+dmFsID09IDB4MDIpCiAJCQlyZXR1cm4gTEVfQURfTElNSVRFRDsKIAl9IGVsc2UgewotCQlpZiAodGVzdF9iaXQoSENJX0xJTUlURURfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MSU1JVEVEX0RJU0NPVkVSQUJMRSkpCiAJCQlyZXR1cm4gTEVfQURfTElNSVRFRDsKLQkJZWxzZSBpZiAodGVzdF9iaXQoSENJX0RJU0NPVkVSQUJMRSwgJmhkZXYtPmRldl9mbGFncykpCisJCWVsc2UgaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9ESVNDT1ZFUkFCTEUpKQogCQkJcmV0dXJuIExFX0FEX0dFTkVSQUw7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1OCBjcmVhdGVfYWR2X2RhdGEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4ICpwdHIpCitzdGF0aWMgdTggZ2V0X2N1cnJlbnRfYWR2X2luc3RhbmNlKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewotCXU4IGFkX2xlbiA9IDAsIGZsYWdzID0gMDsKKwkvKiBUaGUgIlNldCBBZHZlcnRpc2luZyIgc2V0dGluZyBzdXBlcnNlZGVzIHRoZSAiQWRkIEFkdmVydGlzaW5nIgorCSAqIHNldHRpbmcuIEhlcmUgd2Ugc2V0IHRoZSBhZHZlcnRpc2luZyBkYXRhIGJhc2VkIG9uIHdoaWNoCisJICogc2V0dGluZyB3YXMgc2V0LiBXaGVuIG5laXRoZXIgYXBwbHksIGRlZmF1bHQgdG8gdGhlIGdsb2JhbCBzZXR0aW5ncywKKwkgKiByZXByZXNlbnRlZCBieSBpbnN0YW5jZSAiMCIuCisJICovCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lOR19JTlNUQU5DRSkgJiYKKwkgICAgIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lORykpCisJCXJldHVybiAweDAxOwogCi0JZmxhZ3MgfD0gZ2V0X2Fkdl9kaXNjb3ZfZmxhZ3MoaGRldik7CisJcmV0dXJuIDB4MDA7Cit9CiAKLQlpZiAoIXRlc3RfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkKLQkJZmxhZ3MgfD0gTEVfQURfTk9fQlJFRFI7CitzdGF0aWMgYm9vbCBnZXRfY29ubmVjdGFibGUoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAotCWlmIChmbGFncykgewotCQlCVF9EQkcoImFkdiBmbGFncyAweCUwMngiLCBmbGFncyk7CisJLyogSWYgdGhlcmUncyBhIHBlbmRpbmcgbWdtdCBjb21tYW5kIHRoZSBmbGFnIHdpbGwgbm90IHlldCBoYXZlCisJICogaXQncyBmaW5hbCB2YWx1ZSwgc28gY2hlY2sgZm9yIHRoaXMgZmlyc3QuCisJICovCisJY21kID0gcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLCBoZGV2KTsKKwlpZiAoY21kKSB7CisJCXN0cnVjdCBtZ210X21vZGUgKmNwID0gY21kLT5wYXJhbTsKIAotCQlwdHJbMF0gPSAyOwotCQlwdHJbMV0gPSBFSVJfRkxBR1M7Ci0JCXB0clsyXSA9IGZsYWdzOwotCi0JCWFkX2xlbiArPSAzOwotCQlwdHIgKz0gMzsKKwkJcmV0dXJuIGNwLT52YWw7CiAJfQogCi0JaWYgKGhkZXYtPmFkdl90eF9wb3dlciAhPSBIQ0lfVFhfUE9XRVJfSU5WQUxJRCkgewotCQlwdHJbMF0gPSAyOworCXJldHVybiBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQ09OTkVDVEFCTEUpOworfQorCitzdGF0aWMgdTMyIGdldF9hZHZfaW5zdGFuY2VfZmxhZ3Moc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IGluc3RhbmNlKQoreworCXUzMiBmbGFnczsKKworCWlmIChpbnN0YW5jZSA+IDB4MDEpCisJCXJldHVybiAwOworCisJaWYgKGluc3RhbmNlID09IDB4MDEpCisJCXJldHVybiBoZGV2LT5hZHZfaW5zdGFuY2UuZmxhZ3M7CisKKwkvKiBJbnN0YW5jZSAwIGFsd2F5cyBtYW5hZ2VzIHRoZSAiVHggUG93ZXIiIGFuZCAiRmxhZ3MiIGZpZWxkcyAqLworCWZsYWdzID0gTUdNVF9BRFZfRkxBR19UWF9QT1dFUiB8IE1HTVRfQURWX0ZMQUdfTUFOQUdFRF9GTEFHUzsKKworCS8qIEZvciBpbnN0YW5jZSAwLCB0aGUgSENJX0FEVkVSVElTSU5HX0NPTk5FQ1RBQkxFIHNldHRpbmcgY29ycmVzcG9uZHMKKwkgKiB0byB0aGUgImNvbm5lY3RhYmxlIiBpbnN0YW5jZSBmbGFnLgorCSAqLworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkdfQ09OTkVDVEFCTEUpKQorCQlmbGFncyB8PSBNR01UX0FEVl9GTEFHX0NPTk5FQ1RBQkxFOworCisJcmV0dXJuIGZsYWdzOworfQorCitzdGF0aWMgdTggZ2V0X2Fkdl9pbnN0YW5jZV9zY2FuX3JzcF9sZW4oc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IGluc3RhbmNlKQoreworCS8qIElnbm9yZSBpbnN0YW5jZSAwIGFuZCBvdGhlciB1bnN1cHBvcnRlZCBpbnN0YW5jZXMgKi8KKwlpZiAoaW5zdGFuY2UgIT0gMHgwMSkKKwkJcmV0dXJuIDA7CisKKwkvKiBUT0RPOiBUYWtlIGludG8gYWNjb3VudCB0aGUgImFwcGVhcmFuY2UiIGFuZCAibG9jYWwtbmFtZSIgZmxhZ3MgaGVyZS4KKwkgKiBUaGVzZSBhcmUgY3VycmVudGx5IGJlaW5nIGlnbm9yZWQgYXMgdGhleSBhcmUgbm90IHN1cHBvcnRlZC4KKwkgKi8KKwlyZXR1cm4gaGRldi0+YWR2X2luc3RhbmNlLnNjYW5fcnNwX2xlbjsKK30KKworc3RhdGljIHU4IGNyZWF0ZV9pbnN0YW5jZV9hZHZfZGF0YShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggaW5zdGFuY2UsIHU4ICpwdHIpCit7CisJdTggYWRfbGVuID0gMCwgZmxhZ3MgPSAwOworCXUzMiBpbnN0YW5jZV9mbGFncyA9IGdldF9hZHZfaW5zdGFuY2VfZmxhZ3MoaGRldiwgaW5zdGFuY2UpOworCisJLyogVGhlIEFkZCBBZHZlcnRpc2luZyBjb21tYW5kIGFsbG93cyB1c2Vyc3BhY2UgdG8gc2V0IGJvdGggdGhlIGdlbmVyYWwKKwkgKiBhbmQgbGltaXRlZCBkaXNjb3ZlcmFibGUgZmxhZ3MuCisJICovCisJaWYgKGluc3RhbmNlX2ZsYWdzICYgTUdNVF9BRFZfRkxBR19ESVNDT1YpCisJCWZsYWdzIHw9IExFX0FEX0dFTkVSQUw7CisKKwlpZiAoaW5zdGFuY2VfZmxhZ3MgJiBNR01UX0FEVl9GTEFHX0xJTUlURURfRElTQ09WKQorCQlmbGFncyB8PSBMRV9BRF9MSU1JVEVEOworCisJaWYgKGZsYWdzIHx8IChpbnN0YW5jZV9mbGFncyAmIE1HTVRfQURWX0ZMQUdfTUFOQUdFRF9GTEFHUykpIHsKKwkJLyogSWYgYSBkaXNjb3ZlcnkgZmxhZyB3YXNuJ3QgcHJvdmlkZWQsIHNpbXBseSB1c2UgdGhlIGdsb2JhbAorCQkgKiBzZXR0aW5ncy4KKwkJICovCisJCWlmICghZmxhZ3MpCisJCQlmbGFncyB8PSBnZXRfYWR2X2Rpc2Nvdl9mbGFncyhoZGV2KTsKKworCQlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CUkVEUl9FTkFCTEVEKSkKKwkJCWZsYWdzIHw9IExFX0FEX05PX0JSRURSOworCisJCS8qIElmIGZsYWdzIHdvdWxkIHN0aWxsIGJlIGVtcHR5LCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQgdG8KKwkJICogaW5jbHVkZSB0aGUgIkZsYWdzIiBBRCBmaWVsZCIuCisJCSAqLworCQlpZiAoZmxhZ3MpIHsKKwkJCXB0clswXSA9IDB4MDI7CisJCQlwdHJbMV0gPSBFSVJfRkxBR1M7CisJCQlwdHJbMl0gPSBmbGFnczsKKworCQkJYWRfbGVuICs9IDM7CisJCQlwdHIgKz0gMzsKKwkJfQorCX0KKworCWlmIChpbnN0YW5jZSkgeworCQltZW1jcHkocHRyLCBoZGV2LT5hZHZfaW5zdGFuY2UuYWR2X2RhdGEsCisJCSAgICAgICBoZGV2LT5hZHZfaW5zdGFuY2UuYWR2X2RhdGFfbGVuKTsKKworCQlhZF9sZW4gKz0gaGRldi0+YWR2X2luc3RhbmNlLmFkdl9kYXRhX2xlbjsKKwkJcHRyICs9IGhkZXYtPmFkdl9pbnN0YW5jZS5hZHZfZGF0YV9sZW47CisJfQorCisJLyogUHJvdmlkZSBUeCBQb3dlciBvbmx5IGlmIHdlIGNhbiBwcm92aWRlIGEgdmFsaWQgdmFsdWUgZm9yIGl0ICovCisJaWYgKGhkZXYtPmFkdl90eF9wb3dlciAhPSBIQ0lfVFhfUE9XRVJfSU5WQUxJRCAmJgorCSAgICAoaW5zdGFuY2VfZmxhZ3MgJiBNR01UX0FEVl9GTEFHX1RYX1BPV0VSKSkgeworCQlwdHJbMF0gPSAweDAyOwogCQlwdHJbMV0gPSBFSVJfVFhfUE9XRVI7Ci0JCXB0clsyXSA9ICh1OCkgaGRldi0+YWR2X3R4X3Bvd2VyOworCQlwdHJbMl0gPSAodTgpaGRldi0+YWR2X3R4X3Bvd2VyOwogCiAJCWFkX2xlbiArPSAzOwogCQlwdHIgKz0gMzsKQEAgLTg4NSwxOSArMTA2NSwyMCBAQAogCXJldHVybiBhZF9sZW47CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9hZHZfZGF0YShzdHJ1Y3QgaGNpX3JlcXVlc3QgKnJlcSkKK3N0YXRpYyB2b2lkIHVwZGF0ZV9hZHZfZGF0YV9mb3JfaW5zdGFuY2Uoc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsIHU4IGluc3RhbmNlKQogewogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gcmVxLT5oZGV2OwogCXN0cnVjdCBoY2lfY3BfbGVfc2V0X2Fkdl9kYXRhIGNwOwogCXU4IGxlbjsKIAotCWlmICghdGVzdF9iaXQoSENJX0xFX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0VOQUJMRUQpKQogCQlyZXR1cm47CiAKIAltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKIAotCWxlbiA9IGNyZWF0ZV9hZHZfZGF0YShoZGV2LCBjcC5kYXRhKTsKKwlsZW4gPSBjcmVhdGVfaW5zdGFuY2VfYWR2X2RhdGEoaGRldiwgaW5zdGFuY2UsIGNwLmRhdGEpOwogCisJLyogVGhlcmUncyBub3RoaW5nIHRvIGRvIGlmIHRoZSBkYXRhIGhhc24ndCBjaGFuZ2VkICovCiAJaWYgKGhkZXYtPmFkdl9kYXRhX2xlbiA9PSBsZW4gJiYKIAkgICAgbWVtY21wKGNwLmRhdGEsIGhkZXYtPmFkdl9kYXRhLCBsZW4pID09IDApCiAJCXJldHVybjsKQEAgLTkxMCw2ICsxMDkxLDE0IEBACiAJaGNpX3JlcV9hZGQocmVxLCBIQ0lfT1BfTEVfU0VUX0FEVl9EQVRBLCBzaXplb2YoY3ApLCAmY3ApOwogfQogCitzdGF0aWMgdm9pZCB1cGRhdGVfYWR2X2RhdGEoc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSByZXEtPmhkZXY7CisJdTggaW5zdGFuY2UgPSBnZXRfY3VycmVudF9hZHZfaW5zdGFuY2UoaGRldik7CisKKwl1cGRhdGVfYWR2X2RhdGFfZm9yX2luc3RhbmNlKHJlcSwgaW5zdGFuY2UpOworfQorCiBpbnQgbWdtdF91cGRhdGVfYWR2X2RhdGEoc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7CiAJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKQEAgLTk3OSwxMCArMTE2OCwxMCBAQAogCWlmICghbG1wX2V4dF9pbnFfY2FwYWJsZShoZGV2KSkKIAkJcmV0dXJuOwogCi0JaWYgKCF0ZXN0X2JpdChIQ0lfU1NQX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NTUF9FTkFCTEVEKSkKIAkJcmV0dXJuOwogCi0JaWYgKHRlc3RfYml0KEhDSV9TRVJWSUNFX0NBQ0hFLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NFUlZJQ0VfQ0FDSEUpKQogCQlyZXR1cm47CiAKIAltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKQEAgLTEwMTgsMTcgKzEyMDcsMTcgQEAKIAlpZiAoIWhkZXZfaXNfcG93ZXJlZChoZGV2KSkKIAkJcmV0dXJuOwogCi0JaWYgKCF0ZXN0X2JpdChIQ0lfQlJFRFJfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCkpCiAJCXJldHVybjsKIAotCWlmICh0ZXN0X2JpdChIQ0lfU0VSVklDRV9DQUNIRSwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TRVJWSUNFX0NBQ0hFKSkKIAkJcmV0dXJuOwogCiAJY29kWzBdID0gaGRldi0+bWlub3JfY2xhc3M7CiAJY29kWzFdID0gaGRldi0+bWFqb3JfY2xhc3M7CiAJY29kWzJdID0gZ2V0X3NlcnZpY2VfY2xhc3NlcyhoZGV2KTsKIAotCWlmICh0ZXN0X2JpdChIQ0lfTElNSVRFRF9ESVNDT1ZFUkFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTElNSVRFRF9ESVNDT1ZFUkFCTEUpKQogCQljb2RbMV0gfD0gMHgyMDsKIAogCWlmIChtZW1jbXAoY29kLCBoZGV2LT5kZXZfY2xhc3MsIDMpID09IDApCkBAIC0xMDM3LDIyICsxMjI2LDYgQEAKIAloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9XUklURV9DTEFTU19PRl9ERVYsIHNpemVvZihjb2QpLCBjb2QpOwogfQogCi1zdGF0aWMgYm9vbCBnZXRfY29ubmVjdGFibGUoc3RydWN0IGhjaV9kZXYgKmhkZXYpCi17Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7Ci0KLQkvKiBJZiB0aGVyZSdzIGEgcGVuZGluZyBtZ210IGNvbW1hbmQgdGhlIGZsYWcgd2lsbCBub3QgeWV0IGhhdmUKLQkgKiBpdCdzIGZpbmFsIHZhbHVlLCBzbyBjaGVjayBmb3IgdGhpcyBmaXJzdC4KLQkgKi8KLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaGRldik7Ci0JaWYgKGNtZCkgewotCQlzdHJ1Y3QgbWdtdF9tb2RlICpjcCA9IGNtZC0+cGFyYW07Ci0JCXJldHVybiBjcC0+dmFsOwotCX0KLQotCXJldHVybiB0ZXN0X2JpdChIQ0lfQ09OTkVDVEFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpOwotfQotCiBzdGF0aWMgdm9pZCBkaXNhYmxlX2FkdmVydGlzaW5nKHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxKQogewogCXU4IGVuYWJsZSA9IDB4MDA7CkBAIC0xMDY2LDExICsxMjM5LDEzIEBACiAJc3RydWN0IGhjaV9jcF9sZV9zZXRfYWR2X3BhcmFtIGNwOwogCXU4IG93bl9hZGRyX3R5cGUsIGVuYWJsZSA9IDB4MDE7CiAJYm9vbCBjb25uZWN0YWJsZTsKKwl1OCBpbnN0YW5jZTsKKwl1MzIgZmxhZ3M7CiAKIAlpZiAoaGNpX2Nvbm5fbnVtKGhkZXYsIExFX0xJTkspID4gMCkKIAkJcmV0dXJuOwogCi0JaWYgKHRlc3RfYml0KEhDSV9MRV9BRFYsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTEVfQURWKSkKIAkJZGlzYWJsZV9hZHZlcnRpc2luZyhyZXEpOwogCiAJLyogQ2xlYXIgdGhlIEhDSV9MRV9BRFYgYml0IHRlbXBvcmFyaWx5IHNvIHRoYXQgdGhlCkBAIC0xMDc4LDkgKzEyNTMsMTYgQEAKIAkgKiBhbmQgd3JpdGUgYSBuZXcgcmFuZG9tIGFkZHJlc3MuIFRoZSBmbGFnIHdpbGwgYmUgc2V0IGJhY2sgb24KIAkgKiBhcyBzb29uIGFzIHRoZSBTRVRfQURWX0VOQUJMRSBIQ0kgY29tbWFuZCBjb21wbGV0ZXMuCiAJICovCi0JY2xlYXJfYml0KEhDSV9MRV9BRFYsICZoZGV2LT5kZXZfZmxhZ3MpOworCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfTEVfQURWKTsKIAotCWNvbm5lY3RhYmxlID0gZ2V0X2Nvbm5lY3RhYmxlKGhkZXYpOworCWluc3RhbmNlID0gZ2V0X2N1cnJlbnRfYWR2X2luc3RhbmNlKGhkZXYpOworCWZsYWdzID0gZ2V0X2Fkdl9pbnN0YW5jZV9mbGFncyhoZGV2LCBpbnN0YW5jZSk7CisKKwkvKiBJZiB0aGUgImNvbm5lY3RhYmxlIiBpbnN0YW5jZSBmbGFnIHdhcyBub3Qgc2V0LCB0aGVuIGNob29zZSBiZXR3ZWVuCisJICogQURWX0lORCBhbmQgQURWX05PTkNPTk5fSU5EIGJhc2VkIG9uIHRoZSBnbG9iYWwgY29ubmVjdGFibGUgc2V0dGluZy4KKwkgKi8KKwljb25uZWN0YWJsZSA9IChmbGFncyAmIE1HTVRfQURWX0ZMQUdfQ09OTkVDVEFCTEUpIHx8CisJCSAgICAgIGdldF9jb25uZWN0YWJsZShoZGV2KTsKIAogCS8qIFNldCByZXF1aXJlX3ByaXZhY3kgdG8gdHJ1ZSBvbmx5IHdoZW4gbm9uLWNvbm5lY3RhYmxlCiAJICogYWR2ZXJ0aXNpbmcgaXMgdXNlZC4gSW4gdGhhdCBjYXNlIGl0IGlzIGZpbmUgdG8gdXNlIGEKQEAgLTEwOTIsNyArMTI3NCwxNCBAQAogCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOwogCWNwLm1pbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KGhkZXYtPmxlX2Fkdl9taW5faW50ZXJ2YWwpOwogCWNwLm1heF9pbnRlcnZhbCA9IGNwdV90b19sZTE2KGhkZXYtPmxlX2Fkdl9tYXhfaW50ZXJ2YWwpOwotCWNwLnR5cGUgPSBjb25uZWN0YWJsZSA/IExFX0FEVl9JTkQgOiBMRV9BRFZfTk9OQ09OTl9JTkQ7CisKKwlpZiAoY29ubmVjdGFibGUpCisJCWNwLnR5cGUgPSBMRV9BRFZfSU5EOworCWVsc2UgaWYgKGdldF9hZHZfaW5zdGFuY2Vfc2Nhbl9yc3BfbGVuKGhkZXYsIGluc3RhbmNlKSkKKwkJY3AudHlwZSA9IExFX0FEVl9TQ0FOX0lORDsKKwllbHNlCisJCWNwLnR5cGUgPSBMRV9BRFZfTk9OQ09OTl9JTkQ7CisKIAljcC5vd25fYWRkcmVzc190eXBlID0gb3duX2FkZHJfdHlwZTsKIAljcC5jaGFubmVsX21hcCA9IGhkZXYtPmxlX2Fkdl9jaGFubmVsX21hcDsKIApAQCAtMTEwNyw3ICsxMjk2LDcgQEAKIAkJCQkJICAgIHNlcnZpY2VfY2FjaGUud29yayk7CiAJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKIAotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9TRVJWSUNFX0NBQ0hFLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoIWhjaV9kZXZfdGVzdF9hbmRfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfU0VSVklDRV9DQUNIRSkpCiAJCXJldHVybjsKIAogCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKQEAgLTExMzAsOSArMTMxOSw5IEBACiAKIAlCVF9EQkcoIiIpOwogCi0Jc2V0X2JpdChIQ0lfUlBBX0VYUElSRUQsICZoZGV2LT5kZXZfZmxhZ3MpOworCWhjaV9kZXZfc2V0X2ZsYWcoaGRldiwgSENJX1JQQV9FWFBJUkVEKTsKIAotCWlmICghdGVzdF9iaXQoSENJX0FEVkVSVElTSU5HLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lORykpCiAJCXJldHVybjsKIAogCS8qIFRoZSBnZW5lcmF0aW9uIG9mIGEgbmV3IFJQQSBhbmQgcHJvZ3JhbW1pbmcgaXQgaW50byB0aGUKQEAgLTExNDUsNyArMTMzNCw3IEBACiAKIHN0YXRpYyB2b2lkIG1nbXRfaW5pdF9oZGV2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7Ci0JaWYgKHRlc3RfYW5kX3NldF9iaXQoSENJX01HTVQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfYW5kX3NldF9mbGFnKGhkZXYsIEhDSV9NR01UKSkKIAkJcmV0dXJuOwogCiAJSU5JVF9ERUxBWUVEX1dPUksoJmhkZXYtPnNlcnZpY2VfY2FjaGUsIHNlcnZpY2VfY2FjaGVfb2ZmKTsKQEAgLTExNTYsNyArMTM0NSw3IEBACiAJICogZm9yIG1nbXQgd2UgcmVxdWlyZSB1c2VyLXNwYWNlIHRvIGV4cGxpY2l0bHkgZW5hYmxlCiAJICogaXQKIAkgKi8KLQljbGVhcl9iaXQoSENJX0JPTkRBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX0JPTkRBQkxFKTsKIH0KIAogc3RhdGljIGludCByZWFkX2NvbnRyb2xsZXJfaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LApAQCAtMTE4NSw3MyArMTM3NCwxNiBAQAogCiAJaGNpX2Rldl91bmxvY2soaGRldik7CiAKLQlyZXR1cm4gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9SRUFEX0lORk8sIDAsICZycCwKLQkJCSAgICBzaXplb2YocnApKTsKLX0KLQotc3RhdGljIHZvaWQgbWdtdF9wZW5kaW5nX2ZyZWUoc3RydWN0IHBlbmRpbmdfY21kICpjbWQpCi17Ci0Jc29ja19wdXQoY21kLT5zayk7Ci0Ja2ZyZWUoY21kLT5wYXJhbSk7Ci0Ja2ZyZWUoY21kKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwZW5kaW5nX2NtZCAqbWdtdF9wZW5kaW5nX2FkZChzdHJ1Y3Qgc29jayAqc2ssIHUxNiBvcGNvZGUsCi0JCQkJCSAgICBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwKLQkJCQkJICAgIHUxNiBsZW4pCi17Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7Ci0KLQljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjbWQpCi0JCXJldHVybiBOVUxMOwotCi0JY21kLT5vcGNvZGUgPSBvcGNvZGU7Ci0JY21kLT5pbmRleCA9IGhkZXYtPmlkOwotCi0JY21kLT5wYXJhbSA9IGttZW1kdXAoZGF0YSwgbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNtZC0+cGFyYW0pIHsKLQkJa2ZyZWUoY21kKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JY21kLT5wYXJhbV9sZW4gPSBsZW47Ci0KLQljbWQtPnNrID0gc2s7Ci0Jc29ja19ob2xkKHNrKTsKLQotCWxpc3RfYWRkKCZjbWQtPmxpc3QsICZoZGV2LT5tZ210X3BlbmRpbmcpOwotCi0JcmV0dXJuIGNtZDsKLX0KLQotc3RhdGljIHZvaWQgbWdtdF9wZW5kaW5nX2ZvcmVhY2godTE2IG9wY29kZSwgc3RydWN0IGhjaV9kZXYgKmhkZXYsCi0JCQkJIHZvaWQgKCpjYikoc3RydWN0IHBlbmRpbmdfY21kICpjbWQsCi0JCQkJCSAgICB2b2lkICpkYXRhKSwKLQkJCQkgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCwgKnRtcDsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWQsIHRtcCwgJmhkZXYtPm1nbXRfcGVuZGluZywgbGlzdCkgewotCQlpZiAob3Bjb2RlID4gMCAmJiBjbWQtPm9wY29kZSAhPSBvcGNvZGUpCi0JCQljb250aW51ZTsKLQotCQljYihjbWQsIGRhdGEpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgbWdtdF9wZW5kaW5nX3JlbW92ZShzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCkKLXsKLQlsaXN0X2RlbCgmY21kLT5saXN0KTsKLQltZ210X3BlbmRpbmdfZnJlZShjbWQpOworCXJldHVybiBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfUkVBRF9JTkZPLCAwLCAmcnAsCisJCQkJIHNpemVvZihycCkpOwogfQogCiBzdGF0aWMgaW50IHNlbmRfc2V0dGluZ3NfcnNwKHN0cnVjdCBzb2NrICpzaywgdTE2IG9wY29kZSwgc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7CiAJX19sZTMyIHNldHRpbmdzID0gY3B1X3RvX2xlMzIoZ2V0X2N1cnJlbnRfc2V0dGluZ3MoaGRldikpOwogCi0JcmV0dXJuIGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIG9wY29kZSwgMCwgJnNldHRpbmdzLAotCQkJICAgIHNpemVvZihzZXR0aW5ncykpOworCXJldHVybiBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIG9wY29kZSwgMCwgJnNldHRpbmdzLAorCQkJCSBzaXplb2Yoc2V0dGluZ3MpKTsKIH0KIAogc3RhdGljIHZvaWQgY2xlYW5fdXBfaGNpX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMsIHUxNiBvcGNvZGUpCkBAIC0xMjcyLDkgKzE0MDQsMTAgQEAKIAogCXN3aXRjaCAoaGRldi0+ZGlzY292ZXJ5LnN0YXRlKSB7CiAJY2FzZSBESVNDT1ZFUllfRklORElORzoKLQkJaWYgKHRlc3RfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpKSB7CisJCWlmICh0ZXN0X2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKSkKIAkJCWhjaV9yZXFfYWRkKHJlcSwgSENJX09QX0lOUVVJUllfQ0FOQ0VMLCAwLCBOVUxMKTsKLQkJfSBlbHNlIHsKKworCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX1NDQU4pKSB7CiAJCQljYW5jZWxfZGVsYXllZF93b3JrKCZoZGV2LT5sZV9zY2FuX2Rpc2FibGUpOwogCQkJaGNpX3JlcV9hZGRfbGVfc2Nhbl9kaXNhYmxlKHJlcSk7CiAJCX0KQEAgLTEyOTUsNyArMTQyOCw3IEBACiAKIAlkZWZhdWx0OgogCQkvKiBQYXNzaXZlIHNjYW5uaW5nICovCi0JCWlmICh0ZXN0X2JpdChIQ0lfTEVfU0NBTiwgJmhkZXYtPmRldl9mbGFncykpIHsKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9TQ0FOKSkgewogCQkJaGNpX3JlcV9hZGRfbGVfc2Nhbl9kaXNhYmxlKHJlcSk7CiAJCQlyZXR1cm4gdHJ1ZTsKIAkJfQpAQCAtMTMwNiw2ICsxNDM5LDQ5IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCitzdGF0aWMgdm9pZCBhZHZlcnRpc2luZ19hZGRlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJICAgICAgdTggaW5zdGFuY2UpCit7CisJc3RydWN0IG1nbXRfZXZfYWR2ZXJ0aXNpbmdfYWRkZWQgZXY7CisKKwlldi5pbnN0YW5jZSA9IGluc3RhbmNlOworCisJbWdtdF9ldmVudChNR01UX0VWX0FEVkVSVElTSU5HX0FEREVELCBoZGV2LCAmZXYsIHNpemVvZihldiksIHNrKTsKK30KKworc3RhdGljIHZvaWQgYWR2ZXJ0aXNpbmdfcmVtb3ZlZChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCXU4IGluc3RhbmNlKQoreworCXN0cnVjdCBtZ210X2V2X2FkdmVydGlzaW5nX3JlbW92ZWQgZXY7CisKKwlldi5pbnN0YW5jZSA9IGluc3RhbmNlOworCisJbWdtdF9ldmVudChNR01UX0VWX0FEVkVSVElTSU5HX1JFTU9WRUQsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwgc2spOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl9hZHZfaW5zdGFuY2Uoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKKworCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HX0lOU1RBTkNFKSkKKwkJcmV0dXJuOworCisJaWYgKGhkZXYtPmFkdl9pbnN0YW5jZS50aW1lb3V0KQorCQljYW5jZWxfZGVsYXllZF93b3JrKCZoZGV2LT5hZHZfaW5zdGFuY2UudGltZW91dF9leHApOworCisJbWVtc2V0KCZoZGV2LT5hZHZfaW5zdGFuY2UsIDAsIHNpemVvZihoZGV2LT5hZHZfaW5zdGFuY2UpKTsKKwlhZHZlcnRpc2luZ19yZW1vdmVkKE5VTEwsIGhkZXYsIDEpOworCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkdfSU5TVEFOQ0UpOworCisJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikgfHwKKwkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HKSkKKwkJcmV0dXJuOworCisJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOworCWRpc2FibGVfYWR2ZXJ0aXNpbmcoJnJlcSk7CisJaGNpX3JlcV9ydW4oJnJlcSwgTlVMTCk7Cit9CisKIHN0YXRpYyBpbnQgY2xlYW5fdXBfaGNpX3N0YXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CkBAIC0xMzIxLDcgKzE0OTcsMTAgQEAKIAkJaGNpX3JlcV9hZGQoJnJlcSwgSENJX09QX1dSSVRFX1NDQU5fRU5BQkxFLCAxLCAmc2Nhbik7CiAJfQogCi0JaWYgKHRlc3RfYml0KEhDSV9MRV9BRFYsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoZGV2LT5hZHZfaW5zdGFuY2UudGltZW91dCkKKwkJY2xlYXJfYWR2X2luc3RhbmNlKGhkZXYpOworCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9BRFYpKQogCQlkaXNhYmxlX2FkdmVydGlzaW5nKCZyZXEpOwogCiAJZGlzY292X3N0b3BwZWQgPSBoY2lfc3RvcF9kaXNjb3ZlcnkoJnJlcSk7CkBAIC0xMzY5LDI0ICsxNTQ4LDI0IEBACiAJCSAgICAgICB1MTYgbGVuKQogewogCXN0cnVjdCBtZ210X21vZGUgKmNwID0gZGF0YTsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCWludCBlcnI7CiAKIAlCVF9EQkcoInJlcXVlc3QgZm9yICVzIiwgaGRldi0+bmFtZSk7CiAKIAlpZiAoY3AtPnZhbCAhPSAweDAwICYmIGNwLT52YWwgIT0gMHgwMSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9QT1dFUkVELAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfUE9XRVJFRCwKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JaWYgKG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX1BPV0VSRUQsIGhkZXYpKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9QT1dFUkVELAotCQkJCSBNR01UX1NUQVRVU19CVVNZKTsKKwlpZiAocGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX1BPV0VSRUQsIGhkZXYpKSB7CisJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1BPV0VSRUQsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfQlVTWSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0FVVE9fT0ZGLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmIChoY2lfZGV2X3Rlc3RfYW5kX2NsZWFyX2ZsYWcoaGRldiwgSENJX0FVVE9fT0ZGKSkgewogCQljYW5jZWxfZGVsYXllZF93b3JrKCZoZGV2LT5wb3dlcl9vZmYpOwogCiAJCWlmIChjcC0+dmFsKSB7CkBAIC0xNDMzLDExICsxNjEyLDEwIEBACiAKIHN0YXRpYyBpbnQgbmV3X3NldHRpbmdzKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc29jayAqc2tpcCkKIHsKLQlfX2xlMzIgZXY7CisJX19sZTMyIGV2ID0gY3B1X3RvX2xlMzIoZ2V0X2N1cnJlbnRfc2V0dGluZ3MoaGRldikpOwogCi0JZXYgPSBjcHVfdG9fbGUzMihnZXRfY3VycmVudF9zZXR0aW5ncyhoZGV2KSk7Ci0KLQlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX05FV19TRVRUSU5HUywgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBza2lwKTsKKwlyZXR1cm4gbWdtdF9nZW5lcmljX2V2ZW50KE1HTVRfRVZfTkVXX1NFVFRJTkdTLCBoZGV2LCAmZXYsCisJCQkJICBzaXplb2YoZXYpLCBza2lwKTsKIH0KIAogaW50IG1nbXRfbmV3X3NldHRpbmdzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQpAQCAtMTQ1MSw3ICsxNjI5LDcgQEAKIAl1OCBtZ210X3N0YXR1czsKIH07CiAKLXN0YXRpYyB2b2lkIHNldHRpbmdzX3JzcChzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCwgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHNldHRpbmdzX3JzcChzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBjbWRfbG9va3VwICptYXRjaCA9IGRhdGE7CiAKQEAgLTE0NjcsMTUgKzE2NDUsMTUgQEAKIAltZ210X3BlbmRpbmdfZnJlZShjbWQpOwogfQogCi1zdGF0aWMgdm9pZCBjbWRfc3RhdHVzX3JzcChzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCwgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGNtZF9zdGF0dXNfcnNwKHN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQsIHZvaWQgKmRhdGEpCiB7CiAJdTggKnN0YXR1cyA9IGRhdGE7CiAKLQljbWRfc3RhdHVzKGNtZC0+c2ssIGNtZC0+aW5kZXgsIGNtZC0+b3Bjb2RlLCAqc3RhdHVzKTsKKwltZ210X2NtZF9zdGF0dXMoY21kLT5zaywgY21kLT5pbmRleCwgY21kLT5vcGNvZGUsICpzdGF0dXMpOwogCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIH0KIAotc3RhdGljIHZvaWQgY21kX2NvbXBsZXRlX3JzcChzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCwgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIGNtZF9jb21wbGV0ZV9yc3Aoc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZCwgdm9pZCAqZGF0YSkKIHsKIAlpZiAoY21kLT5jbWRfY29tcGxldGUpIHsKIAkJdTggKnN0YXR1cyA9IGRhdGE7CkBAIC0xNDg5LDIzICsxNjY3LDIzIEBACiAJY21kX3N0YXR1c19yc3AoY21kLCBkYXRhKTsKIH0KIAotc3RhdGljIGludCBnZW5lcmljX2NtZF9jb21wbGV0ZShzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCwgdTggc3RhdHVzKQorc3RhdGljIGludCBnZW5lcmljX2NtZF9jb21wbGV0ZShzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kLCB1OCBzdGF0dXMpCiB7Ci0JcmV0dXJuIGNtZF9jb21wbGV0ZShjbWQtPnNrLCBjbWQtPmluZGV4LCBjbWQtPm9wY29kZSwgc3RhdHVzLAotCQkJICAgIGNtZC0+cGFyYW0sIGNtZC0+cGFyYW1fbGVuKTsKKwlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoY21kLT5zaywgY21kLT5pbmRleCwgY21kLT5vcGNvZGUsIHN0YXR1cywKKwkJCQkgY21kLT5wYXJhbSwgY21kLT5wYXJhbV9sZW4pOwogfQogCi1zdGF0aWMgaW50IGFkZHJfY21kX2NvbXBsZXRlKHN0cnVjdCBwZW5kaW5nX2NtZCAqY21kLCB1OCBzdGF0dXMpCitzdGF0aWMgaW50IGFkZHJfY21kX2NvbXBsZXRlKHN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQsIHU4IHN0YXR1cykKIHsKLQlyZXR1cm4gY21kX2NvbXBsZXRlKGNtZC0+c2ssIGNtZC0+aW5kZXgsIGNtZC0+b3Bjb2RlLCBzdGF0dXMsIGNtZC0+cGFyYW0sCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBtZ210X2FkZHJfaW5mbykpOworCXJldHVybiBtZ210X2NtZF9jb21wbGV0ZShjbWQtPnNrLCBjbWQtPmluZGV4LCBjbWQtPm9wY29kZSwgc3RhdHVzLAorCQkJCSBjbWQtPnBhcmFtLCBzaXplb2Yoc3RydWN0IG1nbXRfYWRkcl9pbmZvKSk7CiB9CiAKIHN0YXRpYyB1OCBtZ210X2JyZWRyX3N1cHBvcnQoc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7CiAJaWYgKCFsbXBfYnJlZHJfY2FwYWJsZShoZGV2KSkKIAkJcmV0dXJuIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQ7Ci0JZWxzZSBpZiAoIXRlc3RfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwllbHNlIGlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpKQogCQlyZXR1cm4gTUdNVF9TVEFUVVNfUkVKRUNURUQ7CiAJZWxzZQogCQlyZXR1cm4gTUdNVF9TVEFUVVNfU1VDQ0VTUzsKQEAgLTE1MTUsNyArMTY5Myw3IEBACiB7CiAJaWYgKCFsbXBfbGVfY2FwYWJsZShoZGV2KSkKIAkJcmV0dXJuIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQ7Ci0JZWxzZSBpZiAoIXRlc3RfYml0KEhDSV9MRV9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwllbHNlIGlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0VOQUJMRUQpKQogCQlyZXR1cm4gTUdNVF9TVEFUVVNfUkVKRUNURUQ7CiAJZWxzZQogCQlyZXR1cm4gTUdNVF9TVEFUVVNfU1VDQ0VTUzsKQEAgLTE1MjQsNyArMTcwMiw3IEBACiBzdGF0aWMgdm9pZCBzZXRfZGlzY292ZXJhYmxlX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMsCiAJCQkJICAgICAgdTE2IG9wY29kZSkKIHsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBtZ210X21vZGUgKmNwOwogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJYm9vbCBjaGFuZ2VkOwpAQCAtMTUzMywyMSArMTcxMSwyMCBAQAogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2KTsKKwljbWQgPSBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2KTsKIAlpZiAoIWNtZCkKIAkJZ290byB1bmxvY2s7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCXU4IG1nbXRfZXJyID0gbWdtdF9zdGF0dXMoc3RhdHVzKTsKLQkJY21kX3N0YXR1cyhjbWQtPnNrLCBjbWQtPmluZGV4LCBjbWQtPm9wY29kZSwgbWdtdF9lcnIpOwotCQljbGVhcl9iaXQoSENJX0xJTUlURURfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJbWdtdF9jbWRfc3RhdHVzKGNtZC0+c2ssIGNtZC0+aW5kZXgsIGNtZC0+b3Bjb2RlLCBtZ210X2Vycik7CisJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfTElNSVRFRF9ESVNDT1ZFUkFCTEUpOwogCQlnb3RvIHJlbW92ZV9jbWQ7CiAJfQogCiAJY3AgPSBjbWQtPnBhcmFtOwogCWlmIChjcC0+dmFsKSB7Ci0JCWNoYW5nZWQgPSAhdGVzdF9hbmRfc2V0X2JpdChIQ0lfRElTQ09WRVJBQkxFLAotCQkJCQkgICAgJmhkZXYtPmRldl9mbGFncyk7CisJCWNoYW5nZWQgPSAhaGNpX2Rldl90ZXN0X2FuZF9zZXRfZmxhZyhoZGV2LCBIQ0lfRElTQ09WRVJBQkxFKTsKIAogCQlpZiAoaGRldi0+ZGlzY292X3RpbWVvdXQgPiAwKSB7CiAJCQlpbnQgdG8gPSBtc2Vjc190b19qaWZmaWVzKGhkZXYtPmRpc2Nvdl90aW1lb3V0ICogMTAwMCk7CkBAIC0xNTU1LDggKzE3MzIsNyBAQAogCQkJCQkgICB0byk7CiAJCX0KIAl9IGVsc2UgewotCQljaGFuZ2VkID0gdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9ESVNDT1ZFUkFCTEUsCi0JCQkJCSAgICAgJmhkZXYtPmRldl9mbGFncyk7CisJCWNoYW5nZWQgPSBoY2lfZGV2X3Rlc3RfYW5kX2NsZWFyX2ZsYWcoaGRldiwgSENJX0RJU0NPVkVSQUJMRSk7CiAJfQogCiAJc2VuZF9zZXR0aW5nc19yc3AoY21kLT5zaywgTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2KTsKQEAgLTE1ODUsNyArMTc2MSw3IEBACiAJCQkgICAgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgbWdtdF9jcF9zZXRfZGlzY292ZXJhYmxlICpjcCA9IGRhdGE7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAlzdHJ1Y3QgaGNpX3JlcXVlc3QgcmVxOwogCXUxNiB0aW1lb3V0OwogCXU4IHNjYW47CkBAIC0xNTkzLDE0ICsxNzY5LDE0IEBACiAKIAlCVF9EQkcoInJlcXVlc3QgZm9yICVzIiwgaGRldi0+bmFtZSk7CiAKLQlpZiAoIXRlc3RfYml0KEhDSV9MRV9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgotCSAgICAhdGVzdF9iaXQoSENJX0JSRURSX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwKLQkJCQkgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9FTkFCTEVEKSAmJgorCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpKQorCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19SRUpFQ1RFRCk7CiAKIAlpZiAoY3AtPnZhbCAhPSAweDAwICYmIGNwLT52YWwgIT0gMHgwMSAmJiBjcC0+dmFsICE9IDB4MDIpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAl0aW1lb3V0ID0gX19sZTE2X3RvX2NwdShjcC0+dGltZW91dCk7CiAKQEAgLTE2MDksMjcgKzE3ODUsMjcgQEAKIAkgKi8KIAlpZiAoKGNwLT52YWwgPT0gMHgwMCAmJiB0aW1lb3V0ID4gMCkgfHwKIAkgICAgKGNwLT52YWwgPT0gMHgwMiAmJiB0aW1lb3V0ID09IDApKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwKLQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikgJiYgdGltZW91dCA+IDApIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwKLQkJCQkgTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQpOworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9ESVNDT1ZFUkFCTEUsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2KSB8fAotCSAgICBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaGRldikpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwKLQkJCQkgTUdNVF9TVEFUVVNfQlVTWSk7CisJaWYgKHBlbmRpbmdfZmluZChNR01UX09QX1NFVF9ESVNDT1ZFUkFCTEUsIGhkZXYpIHx8CisJICAgIHBlbmRpbmdfZmluZChNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaGRldikpIHsKKwkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLAorCQkJCSAgICAgIE1HTVRfU1RBVFVTX0JVU1kpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlpZiAoIXRlc3RfYml0KEhDSV9DT05ORUNUQUJMRSwgJmhkZXYtPmRldl9mbGFncykpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwKLQkJCQkgTUdNVF9TVEFUVVNfUkVKRUNURUQpOworCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0NPTk5FQ1RBQkxFKSkgeworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9ESVNDT1ZFUkFCTEUsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfUkVKRUNURUQpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTE2NDAsOCArMTgxNiw4IEBACiAJCSAqIG5vdCBhIHZhbGlkIG9wZXJhdGlvbiBzaW5jZSBpdCByZXF1aXJlcyBhIHRpbWVvdXQKIAkJICogYW5kIHNvIG5vIG5lZWQgdG8gY2hlY2sgSENJX0xJTUlURURfRElTQ09WRVJBQkxFLgogCQkgKi8KLQkJaWYgKCEhY3AtPnZhbCAhPSB0ZXN0X2JpdChIQ0lfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKSkgewotCQkJY2hhbmdlX2JpdChIQ0lfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaWYgKCEhY3AtPnZhbCAhPSBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfRElTQ09WRVJBQkxFKSkgeworCQkJaGNpX2Rldl9jaGFuZ2VfZmxhZyhoZGV2LCBIQ0lfRElTQ09WRVJBQkxFKTsKIAkJCWNoYW5nZWQgPSB0cnVlOwogCQl9CiAKQEAgLTE2NTksOSArMTgzNSw5IEBACiAJICogdmFsdWUgd2l0aCB0aGUgbmV3IHZhbHVlLiBBbmQgaWYgb25seSB0aGUgdGltZW91dCBnZXRzIHVwZGF0ZWQsCiAJICogdGhlbiBubyBuZWVkIGZvciBhbnkgSENJIHRyYW5zYWN0aW9ucy4KIAkgKi8KLQlpZiAoISFjcC0+dmFsID09IHRlc3RfYml0KEhDSV9ESVNDT1ZFUkFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpICYmCi0JICAgIChjcC0+dmFsID09IDB4MDIpID09IHRlc3RfYml0KEhDSV9MSU1JVEVEX0RJU0NPVkVSQUJMRSwKLQkJCQkJICAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmICghIWNwLT52YWwgPT0gaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0RJU0NPVkVSQUJMRSkgJiYKKwkgICAgKGNwLT52YWwgPT0gMHgwMikgPT0gaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwKKwkJCQkJCSAgIEhDSV9MSU1JVEVEX0RJU0NPVkVSQUJMRSkpIHsKIAkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaGRldi0+ZGlzY292X29mZik7CiAJCWhkZXYtPmRpc2Nvdl90aW1lb3V0ID0gdGltZW91dDsKIApAQCAtMTY5MCwxNiArMTg2NiwxNiBAQAogCiAJLyogTGltaXRlZCBkaXNjb3ZlcmFibGUgbW9kZSAqLwogCWlmIChjcC0+dmFsID09IDB4MDIpCi0JCXNldF9iaXQoSENJX0xJTUlURURfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfTElNSVRFRF9ESVNDT1ZFUkFCTEUpOwogCWVsc2UKLQkJY2xlYXJfYml0KEhDSV9MSU1JVEVEX0RJU0NPVkVSQUJMRSwgJmhkZXYtPmRldl9mbGFncyk7CisJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfTElNSVRFRF9ESVNDT1ZFUkFCTEUpOwogCiAJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOwogCiAJLyogVGhlIHByb2NlZHVyZSBmb3IgTEUtb25seSBjb250cm9sbGVycyBpcyBtdWNoIHNpbXBsZXIgLSBqdXN0CiAJICogdXBkYXRlIHRoZSBhZHZlcnRpc2luZyBkYXRhLgogCSAqLwotCWlmICghdGVzdF9iaXQoSENJX0JSRURSX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpKQogCQlnb3RvIHVwZGF0ZV9hZDsKIAogCXNjYW4gPSBTQ0FOX1BBR0U7CkBAIC0xNzI5LDcgKzE5MDUsNyBAQAogCiAJCXNjYW4gfD0gU0NBTl9JTlFVSVJZOwogCX0gZWxzZSB7Ci0JCWNsZWFyX2JpdChIQ0lfTElNSVRFRF9ESVNDT1ZFUkFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpOworCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX0xJTUlURURfRElTQ09WRVJBQkxFKTsKIAl9CiAKIAloY2lfcmVxX2FkZCgmcmVxLCBIQ0lfT1BfV1JJVEVfU0NBTl9FTkFCTEUsIHNpemVvZihzY2FuKSwgJnNjYW4pOwpAQCAtMTc1Miw3ICsxOTI4LDcgQEAKIAlzdHJ1Y3QgaGNpX2NwX3dyaXRlX3BhZ2Vfc2Nhbl9hY3Rpdml0eSBhY3A7CiAJdTggdHlwZTsKIAotCWlmICghdGVzdF9iaXQoSENJX0JSRURSX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpKQogCQlyZXR1cm47CiAKIAlpZiAoaGRldi0+aGNpX3ZlciA8IEJMVUVUT09USF9WRVJfMV8yKQpAQCAtMTc4NCw3ICsxOTYwLDcgQEAKIHN0YXRpYyB2b2lkIHNldF9jb25uZWN0YWJsZV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzLAogCQkJCSAgICAgdTE2IG9wY29kZSkKIHsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBtZ210X21vZGUgKmNwOwogCWJvb2wgY29ubl9jaGFuZ2VkLCBkaXNjb3ZfY2hhbmdlZDsKIApAQCAtMTc5MiwyNiArMTk2OCwyNiBAQAogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsIGhkZXYpOworCWNtZCA9IHBlbmRpbmdfZmluZChNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaGRldik7CiAJaWYgKCFjbWQpCiAJCWdvdG8gdW5sb2NrOwogCiAJaWYgKHN0YXR1cykgewogCQl1OCBtZ210X2VyciA9IG1nbXRfc3RhdHVzKHN0YXR1cyk7Ci0JCWNtZF9zdGF0dXMoY21kLT5zaywgY21kLT5pbmRleCwgY21kLT5vcGNvZGUsIG1nbXRfZXJyKTsKKwkJbWdtdF9jbWRfc3RhdHVzKGNtZC0+c2ssIGNtZC0+aW5kZXgsIGNtZC0+b3Bjb2RlLCBtZ210X2Vycik7CiAJCWdvdG8gcmVtb3ZlX2NtZDsKIAl9CiAKIAljcCA9IGNtZC0+cGFyYW07CiAJaWYgKGNwLT52YWwpIHsKLQkJY29ubl9jaGFuZ2VkID0gIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5FQ1RBQkxFLAotCQkJCQkJICZoZGV2LT5kZXZfZmxhZ3MpOworCQljb25uX2NoYW5nZWQgPSAhaGNpX2Rldl90ZXN0X2FuZF9zZXRfZmxhZyhoZGV2LAorCQkJCQkJCSAgSENJX0NPTk5FQ1RBQkxFKTsKIAkJZGlzY292X2NoYW5nZWQgPSBmYWxzZTsKIAl9IGVsc2UgewotCQljb25uX2NoYW5nZWQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0NPTk5FQ1RBQkxFLAotCQkJCQkJICAmaGRldi0+ZGV2X2ZsYWdzKTsKLQkJZGlzY292X2NoYW5nZWQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0RJU0NPVkVSQUJMRSwKLQkJCQkJCSAgICAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJY29ubl9jaGFuZ2VkID0gaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsCisJCQkJCQkJICAgSENJX0NPTk5FQ1RBQkxFKTsKKwkJZGlzY292X2NoYW5nZWQgPSBoY2lfZGV2X3Rlc3RfYW5kX2NsZWFyX2ZsYWcoaGRldiwKKwkJCQkJCQkgICAgIEhDSV9ESVNDT1ZFUkFCTEUpOwogCX0KIAogCXNlbmRfc2V0dGluZ3NfcnNwKGNtZC0+c2ssIE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLCBoZGV2KTsKQEAgLTE4MzcsMTQgKzIwMTMsMTQgQEAKIAlib29sIGNoYW5nZWQgPSBmYWxzZTsKIAlpbnQgZXJyOwogCi0JaWYgKCEhdmFsICE9IHRlc3RfYml0KEhDSV9DT05ORUNUQUJMRSwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKCEhdmFsICE9IGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9DT05ORUNUQUJMRSkpCiAJCWNoYW5nZWQgPSB0cnVlOwogCiAJaWYgKHZhbCkgewotCQlzZXRfYml0KEhDSV9DT05ORUNUQUJMRSwgJmhkZXYtPmRldl9mbGFncyk7CisJCWhjaV9kZXZfc2V0X2ZsYWcoaGRldiwgSENJX0NPTk5FQ1RBQkxFKTsKIAl9IGVsc2UgewotCQljbGVhcl9iaXQoSENJX0NPTk5FQ1RBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKLQkJY2xlYXJfYml0KEhDSV9ESVNDT1ZFUkFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpOworCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX0NPTk5FQ1RBQkxFKTsKKwkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9ESVNDT1ZFUkFCTEUpOwogCX0KIAogCWVyciA9IHNlbmRfc2V0dGluZ3NfcnNwKHNrLCBNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaGRldik7CkBAIC0xODY0LDIxICsyMDQwLDIxIEBACiAJCQkgICB1MTYgbGVuKQogewogCXN0cnVjdCBtZ210X21vZGUgKmNwID0gZGF0YTsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJdTggc2NhbjsKIAlpbnQgZXJyOwogCiAJQlRfREJHKCJyZXF1ZXN0IGZvciAlcyIsIGhkZXYtPm5hbWUpOwogCi0JaWYgKCF0ZXN0X2JpdChIQ0lfTEVfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykgJiYKLQkgICAgIXRlc3RfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9DT05ORUNUQUJMRSwKLQkJCQkgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9FTkFCTEVEKSAmJgorCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpKQorCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKIAogCWlmIChjcC0+dmFsICE9IDB4MDAgJiYgY3AtPnZhbCAhPSAweDAxKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIApAQCAtMTg4NywxMCArMjA2MywxMCBAQAogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2KSB8fAotCSAgICBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaGRldikpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLAotCQkJCSBNR01UX1NUQVRVU19CVVNZKTsKKwlpZiAocGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwgaGRldikgfHwKKwkgICAgcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLCBoZGV2KSkgeworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9DT05ORUNUQUJMRSwKKwkJCQkgICAgICBNR01UX1NUQVRVU19CVVNZKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC0xOTA2LDEwICsyMDgyLDEwIEBACiAJICogYnktcHJvZHVjdCBvZiBkaXNhYmxpbmcgY29ubmVjdGFibGUsIHdlIG5lZWQgdG8gdXBkYXRlIHRoZQogCSAqIGFkdmVydGlzaW5nIGZsYWdzLgogCSAqLwotCWlmICghdGVzdF9iaXQoSENJX0JSRURSX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCkpIHsKIAkJaWYgKCFjcC0+dmFsKSB7Ci0JCQljbGVhcl9iaXQoSENJX0xJTUlURURfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKLQkJCWNsZWFyX2JpdChIQ0lfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfTElNSVRFRF9ESVNDT1ZFUkFCTEUpOworCQkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9ESVNDT1ZFUkFCTEUpOwogCQl9CiAJCXVwZGF0ZV9hZHZfZGF0YSgmcmVxKTsKIAl9IGVsc2UgaWYgKGNwLT52YWwgIT0gdGVzdF9iaXQoSENJX1BTQ0FOLCAmaGRldi0+ZmxhZ3MpKSB7CkBAIC0xOTM4LDE3ICsyMTE0LDkgQEAKIAl9CiAKIG5vX3NjYW5fdXBkYXRlOgotCS8qIElmIHdlJ3JlIGdvaW5nIGZyb20gbm9uLWNvbm5lY3RhYmxlIHRvIGNvbm5lY3RhYmxlIG9yCi0JICogdmljZS12ZXJzYSB3aGVuIGZhc3QgY29ubmVjdGFibGUgaXMgZW5hYmxlZCBlbnN1cmUgdGhhdCBmYXN0Ci0JICogY29ubmVjdGFibGUgZ2V0cyBkaXNhYmxlZC4gd3JpdGVfZmFzdF9jb25uZWN0YWJsZSB3b24ndCBkbwotCSAqIGFueXRoaW5nIGlmIHRoZSBwYWdlIHNjYW4gcGFyYW1ldGVycyBhcmUgYWxyZWFkeSB3aGF0IHRoZXkKLQkgKiBzaG91bGQgYmUuCi0JICovCi0JaWYgKGNwLT52YWwgfHwgdGVzdF9iaXQoSENJX0ZBU1RfQ09OTkVDVEFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpKQotCQl3cml0ZV9mYXN0X2Nvbm5lY3RhYmxlKCZyZXEsIGZhbHNlKTsKLQogCS8qIFVwZGF0ZSB0aGUgYWR2ZXJ0aXNpbmcgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnkgKi8KLQlpZiAodGVzdF9iaXQoSENJX0FEVkVSVElTSU5HLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HKSB8fAorCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkdfSU5TVEFOQ0UpKQogCQllbmFibGVfYWR2ZXJ0aXNpbmcoJnJlcSk7CiAKIAllcnIgPSBoY2lfcmVxX3J1bigmcmVxLCBzZXRfY29ubmVjdGFibGVfY29tcGxldGUpOwpAQCAtMTk3NSwxNSArMjE0MywxNSBAQAogCUJUX0RCRygicmVxdWVzdCBmb3IgJXMiLCBoZGV2LT5uYW1lKTsKIAogCWlmIChjcC0+dmFsICE9IDB4MDAgJiYgY3AtPnZhbCAhPSAweDAxKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0JPTkRBQkxFLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfQk9OREFCTEUsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWlmIChjcC0+dmFsKQotCQljaGFuZ2VkID0gIXRlc3RfYW5kX3NldF9iaXQoSENJX0JPTkRBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJY2hhbmdlZCA9ICFoY2lfZGV2X3Rlc3RfYW5kX3NldF9mbGFnKGhkZXYsIEhDSV9CT05EQUJMRSk7CiAJZWxzZQotCQljaGFuZ2VkID0gdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9CT05EQUJMRSwgJmhkZXYtPmRldl9mbGFncyk7CisJCWNoYW5nZWQgPSBoY2lfZGV2X3Rlc3RfYW5kX2NsZWFyX2ZsYWcoaGRldiwgSENJX0JPTkRBQkxFKTsKIAogCWVyciA9IHNlbmRfc2V0dGluZ3NfcnNwKHNrLCBNR01UX09QX1NFVF9CT05EQUJMRSwgaGRldik7CiAJaWYgKGVyciA8IDApCkBAIC0yMDAxLDcgKzIxNjksNyBAQAogCQkJICAgICB1MTYgbGVuKQogewogCXN0cnVjdCBtZ210X21vZGUgKmNwID0gZGF0YTsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXU4IHZhbCwgc3RhdHVzOwogCWludCBlcnI7CiAKQEAgLTIwMDksMjEgKzIxNzcsMjAgQEAKIAogCXN0YXR1cyA9IG1nbXRfYnJlZHJfc3VwcG9ydChoZGV2KTsKIAlpZiAoc3RhdHVzKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0xJTktfU0VDVVJJVFksCi0JCQkJICBzdGF0dXMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTElOS19TRUNVUklUWSwKKwkJCQkgICAgICAgc3RhdHVzKTsKIAogCWlmIChjcC0+dmFsICE9IDB4MDAgJiYgY3AtPnZhbCAhPSAweDAxKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0xJTktfU0VDVVJJVFksCi0JCQkJICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9MSU5LX1NFQ1VSSVRZLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAlpZiAoIWhkZXZfaXNfcG93ZXJlZChoZGV2KSkgewogCQlib29sIGNoYW5nZWQgPSBmYWxzZTsKIAotCQlpZiAoISFjcC0+dmFsICE9IHRlc3RfYml0KEhDSV9MSU5LX1NFQ1VSSVRZLAotCQkJCQkgICZoZGV2LT5kZXZfZmxhZ3MpKSB7Ci0JCQljaGFuZ2VfYml0KEhDSV9MSU5LX1NFQ1VSSVRZLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaWYgKCEhY3AtPnZhbCAhPSBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTElOS19TRUNVUklUWSkpIHsKKwkJCWhjaV9kZXZfY2hhbmdlX2ZsYWcoaGRldiwgSENJX0xJTktfU0VDVVJJVFkpOwogCQkJY2hhbmdlZCA9IHRydWU7CiAJCX0KIApAQCAtMjAzNyw5ICsyMjA0LDkgQEAKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JaWYgKG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0xJTktfU0VDVVJJVFksIGhkZXYpKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9MSU5LX1NFQ1VSSVRZLAotCQkJCSBNR01UX1NUQVRVU19CVVNZKTsKKwlpZiAocGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0xJTktfU0VDVVJJVFksIGhkZXYpKSB7CisJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0xJTktfU0VDVVJJVFksCisJCQkJICAgICAgTUdNVF9TVEFUVVNfQlVTWSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtMjA3MCw3ICsyMjM3LDcgQEAKIHN0YXRpYyBpbnQgc2V0X3NzcChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkICpkYXRhLCB1MTYgbGVuKQogewogCXN0cnVjdCBtZ210X21vZGUgKmNwID0gZGF0YTsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXU4IHN0YXR1czsKIAlpbnQgZXJyOwogCkBAIC0yMDc4LDE1ICsyMjQ1LDE1IEBACiAKIAlzdGF0dXMgPSBtZ210X2JyZWRyX3N1cHBvcnQoaGRldik7CiAJaWYgKHN0YXR1cykKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TU1AsIHN0YXR1cyk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TU1AsIHN0YXR1cyk7CiAKIAlpZiAoIWxtcF9zc3BfY2FwYWJsZShoZGV2KSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TU1AsCi0JCQkJICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1NTUCwKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCk7CiAKIAlpZiAoY3AtPnZhbCAhPSAweDAwICYmIGNwLT52YWwgIT0gMHgwMSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TU1AsCi0JCQkJICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TU1AsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIApAQCAtMjA5NCwxNiArMjI2MSwxNiBAQAogCQlib29sIGNoYW5nZWQ7CiAKIAkJaWYgKGNwLT52YWwpIHsKLQkJCWNoYW5nZWQgPSAhdGVzdF9hbmRfc2V0X2JpdChIQ0lfU1NQX0VOQUJMRUQsCi0JCQkJCQkgICAgJmhkZXYtPmRldl9mbGFncyk7CisJCQljaGFuZ2VkID0gIWhjaV9kZXZfdGVzdF9hbmRfc2V0X2ZsYWcoaGRldiwKKwkJCQkJCQkgICAgIEhDSV9TU1BfRU5BQkxFRCk7CiAJCX0gZWxzZSB7Ci0JCQljaGFuZ2VkID0gdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9TU1BfRU5BQkxFRCwKLQkJCQkJCSAgICAgJmhkZXYtPmRldl9mbGFncyk7CisJCQljaGFuZ2VkID0gaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsCisJCQkJCQkJICAgICAgSENJX1NTUF9FTkFCTEVEKTsKIAkJCWlmICghY2hhbmdlZCkKLQkJCQljaGFuZ2VkID0gdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9IU19FTkFCTEVELAotCQkJCQkJCSAgICAgJmhkZXYtPmRldl9mbGFncyk7CisJCQkJY2hhbmdlZCA9IGhjaV9kZXZfdGVzdF9hbmRfY2xlYXJfZmxhZyhoZGV2LAorCQkJCQkJCQkgICAgICBIQ0lfSFNfRU5BQkxFRCk7CiAJCQllbHNlCi0JCQkJY2xlYXJfYml0KEhDSV9IU19FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX0hTX0VOQUJMRUQpOwogCQl9CiAKIAkJZXJyID0gc2VuZF9zZXR0aW5nc19yc3Aoc2ssIE1HTVRfT1BfU0VUX1NTUCwgaGRldik7CkBAIC0yMTE2LDE0ICsyMjgzLDEzIEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9TU1AsIGhkZXYpIHx8Ci0JICAgIG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0hTLCBoZGV2KSkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfU1NQLAotCQkJCSBNR01UX1NUQVRVU19CVVNZKTsKKwlpZiAocGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX1NTUCwgaGRldikpIHsKKwkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfU1NQLAorCQkJCSAgICAgIE1HTVRfU1RBVFVTX0JVU1kpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlpZiAoISFjcC0+dmFsID09IHRlc3RfYml0KEhDSV9TU1BfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoISFjcC0+dmFsID09IGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TU1BfRU5BQkxFRCkpIHsKIAkJZXJyID0gc2VuZF9zZXR0aW5nc19yc3Aoc2ssIE1HTVRfT1BfU0VUX1NTUCwgaGRldik7CiAJCWdvdG8gZmFpbGVkOwogCX0KQEAgLTIxMzQsNyArMjMwMCw3IEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWlmICghY3AtPnZhbCAmJiB0ZXN0X2JpdChIQ0lfVVNFX0RFQlVHX0tFWVMsICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghY3AtPnZhbCAmJiBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVVNFX0RFQlVHX0tFWVMpKQogCQloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1dSSVRFX1NTUF9ERUJVR19NT0RFLAogCQkJICAgICBzaXplb2YoY3AtPnZhbCksICZjcC0+dmFsKTsKIApAQCAtMjE2MCwzMiArMjMyNiwzOCBAQAogCiAJc3RhdHVzID0gbWdtdF9icmVkcl9zdXBwb3J0KGhkZXYpOwogCWlmIChzdGF0dXMpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfSFMsIHN0YXR1cyk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9IUywgc3RhdHVzKTsKIAogCWlmICghbG1wX3NzcF9jYXBhYmxlKGhkZXYpKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0hTLAotCQkJCSAgTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9IUywKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCk7CiAKLQlpZiAoIXRlc3RfYml0KEhDSV9TU1BfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfSFMsCi0JCQkJICBNR01UX1NUQVRVU19SRUpFQ1RFRCk7CisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU1NQX0VOQUJMRUQpKQorCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfSFMsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKIAogCWlmIChjcC0+dmFsICE9IDB4MDAgJiYgY3AtPnZhbCAhPSAweDAxKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0hTLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfSFMsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAorCWlmIChwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfU1NQLCBoZGV2KSkgeworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9IUywKKwkJCQkgICAgICBNR01UX1NUQVRVU19CVVNZKTsKKwkJZ290byB1bmxvY2s7CisJfQorCiAJaWYgKGNwLT52YWwpIHsKLQkJY2hhbmdlZCA9ICF0ZXN0X2FuZF9zZXRfYml0KEhDSV9IU19FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJY2hhbmdlZCA9ICFoY2lfZGV2X3Rlc3RfYW5kX3NldF9mbGFnKGhkZXYsIEhDSV9IU19FTkFCTEVEKTsKIAl9IGVsc2UgewogCQlpZiAoaGRldl9pc19wb3dlcmVkKGhkZXYpKSB7Ci0JCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfSFMsCi0JCQkJCSBNR01UX1NUQVRVU19SRUpFQ1RFRCk7CisJCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9IUywKKwkJCQkJICAgICAgTUdNVF9TVEFUVVNfUkVKRUNURUQpOwogCQkJZ290byB1bmxvY2s7CiAJCX0KIAotCQljaGFuZ2VkID0gdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9IU19FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJY2hhbmdlZCA9IGhjaV9kZXZfdGVzdF9hbmRfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfSFNfRU5BQkxFRCk7CiAJfQogCiAJZXJyID0gc2VuZF9zZXR0aW5nc19yc3Aoc2ssIE1HTVRfT1BfU0VUX0hTLCBoZGV2KTsKQEAgLTIyMjYsNyArMjM5OCw3IEBACiAJICogaGFzIGFjdHVhbGx5IGJlZW4gZW5hYmxlZC4gRHVyaW5nIHBvd2VyIG9uLCB0aGUKIAkgKiB1cGRhdGUgaW4gcG93ZXJlZF91cGRhdGVfaGNpIHdpbGwgdGFrZSBjYXJlIG9mIGl0LgogCSAqLwotCWlmICh0ZXN0X2JpdChIQ0lfTEVfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0VOQUJMRUQpKSB7CiAJCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAKIAkJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOwpAQCAtMjI0NCw3ICsyNDE2LDcgQEAKIHsKIAlzdHJ1Y3QgbWdtdF9tb2RlICpjcCA9IGRhdGE7CiAJc3RydWN0IGhjaV9jcF93cml0ZV9sZV9ob3N0X3N1cHBvcnRlZCBoY2lfY3A7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAlzdHJ1Y3QgaGNpX3JlcXVlc3QgcmVxOwogCWludCBlcnI7CiAJdTggdmFsLCBlbmFibGVkOwpAQCAtMjI1MiwxNyArMjQyNCwyOSBAQAogCUJUX0RCRygicmVxdWVzdCBmb3IgJXMiLCBoZGV2LT5uYW1lKTsKIAogCWlmICghbG1wX2xlX2NhcGFibGUoaGRldikpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTEUsCi0JCQkJICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0xFLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKIAogCWlmIChjcC0+dmFsICE9IDB4MDAgJiYgY3AtPnZhbCAhPSAweDAxKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0xFLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTEUsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAotCS8qIExFLW9ubHkgZGV2aWNlcyBkbyBub3QgYWxsb3cgdG9nZ2xpbmcgTEUgb24vb2ZmICovCi0JaWYgKCF0ZXN0X2JpdChIQ0lfQlJFRFJfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTEUsCi0JCQkJICBNR01UX1NUQVRVU19SRUpFQ1RFRCk7CisJLyogQmx1ZXRvb3RoIHNpbmdsZSBtb2RlIExFIG9ubHkgY29udHJvbGxlcnMgb3IgZHVhbC1tb2RlCisJICogY29udHJvbGxlcnMgY29uZmlndXJlZCBhcyBMRSBvbmx5IGRldmljZXMsIGRvIG5vdCBhbGxvdworCSAqIHN3aXRjaGluZyBMRSBvZmYuIFRoZXNlIGhhdmUgZWl0aGVyIExFIGVuYWJsZWQgZXhwbGljaXRseQorCSAqIG9yIEJSL0VEUiBoYXMgYmVlbiBwcmV2aW91c2x5IHN3aXRjaGVkIG9mZi4KKwkgKgorCSAqIFdoZW4gdHJ5aW5nIHRvIGVuYWJsZSBhbiBhbHJlYWR5IGVuYWJsZWQgTEUsIHRoZW4gZ3JhY2VmdWxseQorCSAqIHNlbmQgYSBwb3NpdGl2ZSByZXNwb25zZS4gVHJ5aW5nIHRvIGRpc2FibGUgaXQgaG93ZXZlciB3aWxsCisJICogcmVzdWx0IGludG8gcmVqZWN0aW9uLgorCSAqLworCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JSRURSX0VOQUJMRUQpKSB7CisJCWlmIChjcC0+dmFsID09IDB4MDEpCisJCQlyZXR1cm4gc2VuZF9zZXR0aW5nc19yc3Aoc2ssIE1HTVRfT1BfU0VUX0xFLCBoZGV2KTsKKworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTEUsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKKwl9CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKQEAgLTIyNzIsMTMgKzI0NTYsMTMgQEAKIAlpZiAoIWhkZXZfaXNfcG93ZXJlZChoZGV2KSB8fCB2YWwgPT0gZW5hYmxlZCkgewogCQlib29sIGNoYW5nZWQgPSBmYWxzZTsKIAotCQlpZiAodmFsICE9IHRlc3RfYml0KEhDSV9MRV9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkgewotCQkJY2hhbmdlX2JpdChIQ0lfTEVfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncyk7CisJCWlmICh2YWwgIT0gaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0VOQUJMRUQpKSB7CisJCQloY2lfZGV2X2NoYW5nZV9mbGFnKGhkZXYsIEhDSV9MRV9FTkFCTEVEKTsKIAkJCWNoYW5nZWQgPSB0cnVlOwogCQl9CiAKLQkJaWYgKCF2YWwgJiYgdGVzdF9iaXQoSENJX0FEVkVSVElTSU5HLCAmaGRldi0+ZGV2X2ZsYWdzKSkgewotCQkJY2xlYXJfYml0KEhDSV9BRFZFUlRJU0lORywgJmhkZXYtPmRldl9mbGFncyk7CisJCWlmICghdmFsICYmIGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lORykpIHsKKwkJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkcpOwogCQkJY2hhbmdlZCA9IHRydWU7CiAJCX0KIApAQCAtMjI5MiwxMCArMjQ3NiwxMCBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfTEUsIGhkZXYpIHx8Ci0JICAgIG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0FEVkVSVElTSU5HLCBoZGV2KSkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTEUsCi0JCQkJIE1HTVRfU1RBVFVTX0JVU1kpOworCWlmIChwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfTEUsIGhkZXYpIHx8CisJICAgIHBlbmRpbmdfZmluZChNR01UX09QX1NFVF9BRFZFUlRJU0lORywgaGRldikpIHsKKwkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTEUsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfQlVTWSk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIApAQCAtMjMxMyw3ICsyNDk3LDcgQEAKIAkJaGNpX2NwLmxlID0gdmFsOwogCQloY2lfY3Auc2ltdWwgPSAweDAwOwogCX0gZWxzZSB7Ci0JCWlmICh0ZXN0X2JpdChIQ0lfTEVfQURWLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9BRFYpKQogCQkJZGlzYWJsZV9hZHZlcnRpc2luZygmcmVxKTsKIAl9CiAKQEAgLTIzMzcsNyArMjUyMSw3IEBACiAgKi8KIHN0YXRpYyBib29sIHBlbmRpbmdfZWlyX29yX2NsYXNzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNtZCwgJmhkZXYtPm1nbXRfcGVuZGluZywgbGlzdCkgewogCQlzd2l0Y2ggKGNtZC0+b3Bjb2RlKSB7CkBAIC0yMzczLDE2ICsyNTU3LDE2IEBACiAKIHN0YXRpYyB2b2lkIG1nbXRfY2xhc3NfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHUxNiBtZ210X29wLCB1OCBzdGF0dXMpCiB7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKG1nbXRfb3AsIGhkZXYpOworCWNtZCA9IHBlbmRpbmdfZmluZChtZ210X29wLCBoZGV2KTsKIAlpZiAoIWNtZCkKIAkJZ290byB1bmxvY2s7CiAKLQljbWRfY29tcGxldGUoY21kLT5zaywgY21kLT5pbmRleCwgY21kLT5vcGNvZGUsIG1nbXRfc3RhdHVzKHN0YXR1cyksCi0JCSAgICAgaGRldi0+ZGV2X2NsYXNzLCAzKTsKKwltZ210X2NtZF9jb21wbGV0ZShjbWQtPnNrLCBjbWQtPmluZGV4LCBjbWQtPm9wY29kZSwKKwkJCSAgbWdtdF9zdGF0dXMoc3RhdHVzKSwgaGRldi0+ZGV2X2NsYXNzLCAzKTsKIAogCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIApAQCAtMjQwMCw3ICsyNTg0LDcgQEAKIHN0YXRpYyBpbnQgYWRkX3V1aWQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgbWdtdF9jcF9hZGRfdXVpZCAqY3AgPSBkYXRhOwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKIAlzdHJ1Y3QgYnRfdXVpZCAqdXVpZDsKIAlpbnQgZXJyOwpAQCAtMjQxMCw4ICsyNTk0LDggQEAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAlpZiAocGVuZGluZ19laXJfb3JfY2xhc3MoaGRldikpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfQUREX1VVSUQsCi0JCQkJIE1HTVRfU1RBVFVTX0JVU1kpOworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0FERF9VVUlELAorCQkJCSAgICAgIE1HTVRfU1RBVFVTX0JVU1kpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTI0MzcsOCArMjYyMSw4IEBACiAJCWlmIChlcnIgIT0gLUVOT0RBVEEpCiAJCQlnb3RvIGZhaWxlZDsKIAotCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0FERF9VVUlELCAwLAotCQkJCSAgIGhkZXYtPmRldl9jbGFzcywgMyk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9BRERfVVVJRCwgMCwKKwkJCQkJaGRldi0+ZGV2X2NsYXNzLCAzKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC0yNDYwLDcgKzI2NDQsNyBAQAogCWlmICghaGRldl9pc19wb3dlcmVkKGhkZXYpKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX1NFUlZJQ0VfQ0FDSEUsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKCFoY2lfZGV2X3Rlc3RfYW5kX3NldF9mbGFnKGhkZXYsIEhDSV9TRVJWSUNFX0NBQ0hFKSkgewogCQlxdWV1ZV9kZWxheWVkX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+c2VydmljZV9jYWNoZSwKIAkJCQkgICBDQUNIRV9USU1FT1VUKTsKIAkJcmV0dXJuIHRydWU7CkBAIC0yNDgwLDcgKzI2NjQsNyBAQAogCQkgICAgICAgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgbWdtdF9jcF9yZW1vdmVfdXVpZCAqY3AgPSBkYXRhOwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IGJ0X3V1aWQgKm1hdGNoLCAqdG1wOwogCXU4IGJ0X3V1aWRfYW55W10gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKIAlzdHJ1Y3QgaGNpX3JlcXVlc3QgcmVxOwpAQCAtMjQ5MSw4ICsyNjc1LDggQEAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAlpZiAocGVuZGluZ19laXJfb3JfY2xhc3MoaGRldikpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfUkVNT1ZFX1VVSUQsCi0JCQkJIE1HTVRfU1RBVFVTX0JVU1kpOworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFTU9WRV9VVUlELAorCQkJCSAgICAgIE1HTVRfU1RBVFVTX0JVU1kpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTI1MDAsOCArMjY4NCw5IEBACiAJCWhjaV91dWlkc19jbGVhcihoZGV2KTsKIAogCQlpZiAoZW5hYmxlX3NlcnZpY2VfY2FjaGUoaGRldikpIHsKLQkJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfUkVNT1ZFX1VVSUQsCi0JCQkJCSAgIDAsIGhkZXYtPmRldl9jbGFzcywgMyk7CisJCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsCisJCQkJCQlNR01UX09QX1JFTU9WRV9VVUlELAorCQkJCQkJMCwgaGRldi0+ZGV2X2NsYXNzLCAzKTsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CiAKQEAgLTI1MjAsOCArMjcwNSw4IEBACiAJfQogCiAJaWYgKGZvdW5kID09IDApIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfUkVNT1ZFX1VVSUQsCi0JCQkJIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9SRU1PVkVfVVVJRCwKKwkJCQkgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIApAQCAtMjUzNiw4ICsyNzIxLDggQEAKIAkJaWYgKGVyciAhPSAtRU5PREFUQSkKIAkJCWdvdG8gdW5sb2NrOwogCi0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfUkVNT1ZFX1VVSUQsIDAsCi0JCQkJICAgaGRldi0+ZGV2X2NsYXNzLCAzKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFTU9WRV9VVUlELCAwLAorCQkJCQloZGV2LT5kZXZfY2xhc3MsIDMpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTI1NjUsMjcgKzI3NTAsMjcgQEAKIAkJCSB1MTYgbGVuKQogewogCXN0cnVjdCBtZ210X2NwX3NldF9kZXZfY2xhc3MgKmNwID0gZGF0YTsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJaW50IGVycjsKIAogCUJUX0RCRygicmVxdWVzdCBmb3IgJXMiLCBoZGV2LT5uYW1lKTsKIAogCWlmICghbG1wX2JyZWRyX2NhcGFibGUoaGRldikpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfREVWX0NMQVNTLAotCQkJCSAgTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9ERVZfQ0xBU1MsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKHBlbmRpbmdfZWlyX29yX2NsYXNzKGhkZXYpKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9ERVZfQ0xBU1MsCi0JCQkJIE1HTVRfU1RBVFVTX0JVU1kpOworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9ERVZfQ0xBU1MsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfQlVTWSk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIAogCWlmICgoY3AtPm1pbm9yICYgMHgwMykgIT0gMCB8fCAoY3AtPm1ham9yICYgMHhlMCkgIT0gMCkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfREVWX0NMQVNTLAotCQkJCSBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0RFVl9DTEFTUywKKwkJCQkgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIApAQCAtMjU5MywxNCArMjc3OCwxNCBAQAogCWhkZXYtPm1pbm9yX2NsYXNzID0gY3AtPm1pbm9yOwogCiAJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfREVWX0NMQVNTLCAwLAotCQkJCSAgIGhkZXYtPmRldl9jbGFzcywgMyk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfREVWX0NMQVNTLCAwLAorCQkJCQloZGV2LT5kZXZfY2xhc3MsIDMpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKIAloY2lfcmVxX2luaXQoJnJlcSwgaGRldik7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9TRVJWSUNFX0NBQ0hFLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmIChoY2lfZGV2X3Rlc3RfYW5kX2NsZWFyX2ZsYWcoaGRldiwgSENJX1NFUlZJQ0VfQ0FDSEUpKSB7CiAJCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmhkZXYtPnNlcnZpY2VfY2FjaGUpOwogCQloY2lfZGV2X2xvY2soaGRldik7CkBAIC0yNjE0LDggKzI3OTksOCBAQAogCQlpZiAoZXJyICE9IC1FTk9EQVRBKQogCQkJZ290byB1bmxvY2s7CiAKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfREVWX0NMQVNTLCAwLAotCQkJCSAgIGhkZXYtPmRldl9jbGFzcywgMyk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfREVWX0NMQVNTLCAwLAorCQkJCQloZGV2LT5kZXZfY2xhc3MsIDMpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTI2NDUsMTUgKzI4MzAsMTUgQEAKIAlCVF9EQkcoInJlcXVlc3QgZm9yICVzIiwgaGRldi0+bmFtZSk7CiAKIAlpZiAoIWxtcF9icmVkcl9jYXBhYmxlKGhkZXYpKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9MSU5LX0tFWVMsCi0JCQkJICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9MSU5LX0tFWVMsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOwogCiAJa2V5X2NvdW50ID0gX19sZTE2X3RvX2NwdShjcC0+a2V5X2NvdW50KTsKIAlpZiAoa2V5X2NvdW50ID4gbWF4X2tleV9jb3VudCkgewogCQlCVF9FUlIoImxvYWRfbGlua19rZXlzOiB0b28gYmlnIGtleV9jb3VudCB2YWx1ZSAldSIsCiAJCSAgICAgICBrZXlfY291bnQpOwotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9MSU5LX0tFWVMsCi0JCQkJICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0xPQURfTElOS19LRVlTLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJfQogCiAJZXhwZWN0ZWRfbGVuID0gc2l6ZW9mKCpjcCkgKyBrZXlfY291bnQgKgpAQCAtMjY2MSwxMyArMjg0NiwxMyBAQAogCWlmIChleHBlY3RlZF9sZW4gIT0gbGVuKSB7CiAJCUJUX0VSUigibG9hZF9saW5rX2tleXM6IGV4cGVjdGVkICV1IGJ5dGVzLCBnb3QgJXUgYnl0ZXMiLAogCQkgICAgICAgZXhwZWN0ZWRfbGVuLCBsZW4pOwotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9MSU5LX0tFWVMsCi0JCQkJICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0xPQURfTElOS19LRVlTLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJfQogCiAJaWYgKGNwLT5kZWJ1Z19rZXlzICE9IDB4MDAgJiYgY3AtPmRlYnVnX2tleXMgIT0gMHgwMSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0xPQURfTElOS19LRVlTLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0xJTktfS0VZUywKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJQlRfREJHKCIlcyBkZWJ1Z19rZXlzICV1IGtleV9jb3VudCAldSIsIGhkZXYtPm5hbWUsIGNwLT5kZWJ1Z19rZXlzLAogCSAgICAgICBrZXlfY291bnQpOwpAQCAtMjY3Niw4ICsyODYxLDkgQEAKIAkJc3RydWN0IG1nbXRfbGlua19rZXlfaW5mbyAqa2V5ID0gJmNwLT5rZXlzW2ldOwogCiAJCWlmIChrZXktPmFkZHIudHlwZSAhPSBCREFERFJfQlJFRFIgfHwga2V5LT50eXBlID4gMHgwOCkKLQkJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0xJTktfS0VZUywKLQkJCQkJICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwKKwkJCQkJICAgICAgIE1HTVRfT1BfTE9BRF9MSU5LX0tFWVMsCisJCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJfQogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwpAQCAtMjY4NSwxMSArMjg3MSwxMCBAQAogCWhjaV9saW5rX2tleXNfY2xlYXIoaGRldik7CiAKIAlpZiAoY3AtPmRlYnVnX2tleXMpCi0JCWNoYW5nZWQgPSAhdGVzdF9hbmRfc2V0X2JpdChIQ0lfS0VFUF9ERUJVR19LRVlTLAotCQkJCQkgICAgJmhkZXYtPmRldl9mbGFncyk7CisJCWNoYW5nZWQgPSAhaGNpX2Rldl90ZXN0X2FuZF9zZXRfZmxhZyhoZGV2LCBIQ0lfS0VFUF9ERUJVR19LRVlTKTsKIAllbHNlCi0JCWNoYW5nZWQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0tFRVBfREVCVUdfS0VZUywKLQkJCQkJICAgICAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJY2hhbmdlZCA9IGhjaV9kZXZfdGVzdF9hbmRfY2xlYXJfZmxhZyhoZGV2LAorCQkJCQkJICAgICAgSENJX0tFRVBfREVCVUdfS0VZUyk7CiAKIAlpZiAoY2hhbmdlZCkKIAkJbmV3X3NldHRpbmdzKGhkZXYsIE5VTEwpOwpAQCAtMjcwNyw3ICsyODkyLDcgQEAKIAkJCQkga2V5LT50eXBlLCBrZXktPnBpbl9sZW4sIE5VTEwpOwogCX0KIAotCWNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9MSU5LX0tFWVMsIDAsIE5VTEwsIDApOworCW1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0xJTktfS0VZUywgMCwgTlVMTCwgMCk7CiAKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKIApAQCAtMjczMiw3ICsyOTE3LDcgQEAKIAlzdHJ1Y3QgbWdtdF9jcF91bnBhaXJfZGV2aWNlICpjcCA9IGRhdGE7CiAJc3RydWN0IG1nbXRfcnBfdW5wYWlyX2RldmljZSBycDsKIAlzdHJ1Y3QgaGNpX2NwX2Rpc2Nvbm5lY3QgZGM7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CiAJaW50IGVycjsKIApAQCAtMjc0MSwyMCArMjkyNiwyMSBAQAogCXJwLmFkZHIudHlwZSA9IGNwLT5hZGRyLnR5cGU7CiAKIAlpZiAoIWJkYWRkcl90eXBlX2lzX3ZhbGlkKGNwLT5hZGRyLnR5cGUpKQotCQlyZXR1cm4gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9VTlBBSVJfREVWSUNFLAotCQkJCSAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywKLQkJCQkgICAgJnJwLCBzaXplb2YocnApKTsKKwkJcmV0dXJuIG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9VTlBBSVJfREVWSUNFLAorCQkJCQkgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCisJCQkJCSAmcnAsIHNpemVvZihycCkpOwogCiAJaWYgKGNwLT5kaXNjb25uZWN0ICE9IDB4MDAgJiYgY3AtPmRpc2Nvbm5lY3QgIT0gMHgwMSkKLQkJcmV0dXJuIGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfVU5QQUlSX0RFVklDRSwKLQkJCQkgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCi0JCQkJICAgICZycCwgc2l6ZW9mKHJwKSk7CisJCXJldHVybiBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfVU5QQUlSX0RFVklDRSwKKwkJCQkJIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAorCQkJCQkgJnJwLCBzaXplb2YocnApKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWlmICghaGRldl9pc19wb3dlcmVkKGhkZXYpKSB7Ci0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfVU5QQUlSX0RFVklDRSwKLQkJCQkgICBNR01UX1NUQVRVU19OT1RfUE9XRVJFRCwgJnJwLCBzaXplb2YocnApKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1VOUEFJUl9ERVZJQ0UsCisJCQkJCU1HTVRfU1RBVFVTX05PVF9QT1dFUkVELCAmcnAsCisJCQkJCXNpemVvZihycCkpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTI4MDQsOCArMjk5MCw5IEBACiAJfQogCiAJaWYgKGVyciA8IDApIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9VTlBBSVJfREVWSUNFLAotCQkJCSAgIE1HTVRfU1RBVFVTX05PVF9QQUlSRUQsICZycCwgc2l6ZW9mKHJwKSk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9VTlBBSVJfREVWSUNFLAorCQkJCQlNR01UX1NUQVRVU19OT1RfUEFJUkVELCAmcnAsCisJCQkJCXNpemVvZihycCkpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTI4MTMsOCArMzAwMCw4IEBACiAJICogbGluayBpcyByZXF1ZXN0ZWQuCiAJICovCiAJaWYgKCFjb25uKSB7Ci0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfVU5QQUlSX0RFVklDRSwgMCwKLQkJCQkgICAmcnAsIHNpemVvZihycCkpOworCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfVU5QQUlSX0RFVklDRSwgMCwKKwkJCQkJJnJwLCBzaXplb2YocnApKTsKIAkJZGV2aWNlX3VucGFpcmVkKGhkZXYsICZjcC0+YWRkci5iZGFkZHIsIGNwLT5hZGRyLnR5cGUsIHNrKTsKIAkJZ290byB1bmxvY2s7CiAJfQpAQCAtMjg0NCw3ICszMDMxLDcgQEAKIHsKIAlzdHJ1Y3QgbWdtdF9jcF9kaXNjb25uZWN0ICpjcCA9IGRhdGE7CiAJc3RydWN0IG1nbXRfcnBfZGlzY29ubmVjdCBycDsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKIAlpbnQgZXJyOwogCkBAIC0yODU1LDIxICszMDQyLDIyIEBACiAJcnAuYWRkci50eXBlID0gY3AtPmFkZHIudHlwZTsKIAogCWlmICghYmRhZGRyX3R5cGVfaXNfdmFsaWQoY3AtPmFkZHIudHlwZSkpCi0JCXJldHVybiBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0RJU0NPTk5FQ1QsCi0JCQkJICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAotCQkJCSAgICAmcnAsIHNpemVvZihycCkpOworCQlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0RJU0NPTk5FQ1QsCisJCQkJCSBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywKKwkJCQkJICZycCwgc2l6ZW9mKHJwKSk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkgewotCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0RJU0NPTk5FQ1QsCi0JCQkJICAgTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQsICZycCwgc2l6ZW9mKHJwKSk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9ESVNDT05ORUNULAorCQkJCQlNR01UX1NUQVRVU19OT1RfUE9XRVJFRCwgJnJwLAorCQkJCQlzaXplb2YocnApKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JaWYgKG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfRElTQ09OTkVDVCwgaGRldikpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9ESVNDT05ORUNULAotCQkJCSAgIE1HTVRfU1RBVFVTX0JVU1ksICZycCwgc2l6ZW9mKHJwKSk7CisJaWYgKHBlbmRpbmdfZmluZChNR01UX09QX0RJU0NPTk5FQ1QsIGhkZXYpKSB7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9ESVNDT05ORUNULAorCQkJCQlNR01UX1NUQVRVU19CVVNZLCAmcnAsIHNpemVvZihycCkpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTI4ODAsOCArMzA2OCw5IEBACiAJCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBMRV9MSU5LLCAmY3AtPmFkZHIuYmRhZGRyKTsKIAogCWlmICghY29ubiB8fCBjb25uLT5zdGF0ZSA9PSBCVF9PUEVOIHx8IGNvbm4tPnN0YXRlID09IEJUX0NMT1NFRCkgewotCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0RJU0NPTk5FQ1QsCi0JCQkJICAgTUdNVF9TVEFUVVNfTk9UX0NPTk5FQ1RFRCwgJnJwLCBzaXplb2YocnApKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0RJU0NPTk5FQ1QsCisJCQkJCU1HTVRfU1RBVFVTX05PVF9DT05ORUNURUQsICZycCwKKwkJCQkJc2l6ZW9mKHJwKSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtMjkzNSw4ICszMTI0LDggQEAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAlpZiAoIWhkZXZfaXNfcG93ZXJlZChoZGV2KSkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9HRVRfQ09OTkVDVElPTlMsCi0JCQkJIE1HTVRfU1RBVFVTX05PVF9QT1dFUkVEKTsKKwkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9HRVRfQ09OTkVDVElPTlMsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTI5NjksOCArMzE1OCw4IEBACiAJLyogUmVjYWxjdWxhdGUgbGVuZ3RoIGluIGNhc2Ugb2YgZmlsdGVyZWQgU0NPIGNvbm5lY3Rpb25zLCBldGMgKi8KIAlycF9sZW4gPSBzaXplb2YoKnJwKSArIChpICogc2l6ZW9mKHN0cnVjdCBtZ210X2FkZHJfaW5mbykpOwogCi0JZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9HRVRfQ09OTkVDVElPTlMsIDAsIHJwLAotCQkJICAgcnBfbGVuKTsKKwllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfR0VUX0NPTk5FQ1RJT05TLCAwLCBycCwKKwkJCQlycF9sZW4pOwogCiAJa2ZyZWUocnApOwogCkBAIC0yOTgyLDcgKzMxNzEsNyBAQAogc3RhdGljIGludCBzZW5kX3Bpbl9jb2RlX25lZ19yZXBseShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LAogCQkJCSAgIHN0cnVjdCBtZ210X2NwX3Bpbl9jb2RlX25lZ19yZXBseSAqY3ApCiB7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAlpbnQgZXJyOwogCiAJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9QSU5fQ09ERV9ORUdfUkVQTFksIGhkZXYsIGNwLApAQCAtMzAwNCw3ICszMTkzLDcgQEAKIAlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CiAJc3RydWN0IG1nbXRfY3BfcGluX2NvZGVfcmVwbHkgKmNwID0gZGF0YTsKIAlzdHJ1Y3QgaGNpX2NwX3Bpbl9jb2RlX3JlcGx5IHJlcGx5OwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAJaW50IGVycjsKIAogCUJUX0RCRygiIik7CkBAIC0zMDEyLDE1ICszMjAxLDE1IEBACiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfUElOX0NPREVfUkVQTFksCi0JCQkJIE1HTVRfU1RBVFVTX05PVF9QT1dFUkVEKTsKKwkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9QSU5fQ09ERV9SRVBMWSwKKwkJCQkgICAgICBNR01UX1NUQVRVU19OT1RfUE9XRVJFRCk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAogCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBBQ0xfTElOSywgJmNwLT5hZGRyLmJkYWRkcik7CiAJaWYgKCFjb25uKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1BJTl9DT0RFX1JFUExZLAotCQkJCSBNR01UX1NUQVRVU19OT1RfQ09OTkVDVEVEKTsKKwkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9QSU5fQ09ERV9SRVBMWSwKKwkJCQkgICAgICBNR01UX1NUQVRVU19OT1RfQ09OTkVDVEVEKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC0zMDMzLDggKzMyMjIsOCBAQAogCiAJCWVyciA9IHNlbmRfcGluX2NvZGVfbmVnX3JlcGx5KHNrLCBoZGV2LCAmbmNwKTsKIAkJaWYgKGVyciA+PSAwKQotCQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfUElOX0NPREVfUkVQTFksCi0JCQkJCSBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1BJTl9DT0RFX1JFUExZLAorCQkJCQkgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAkJZ290byBmYWlsZWQ7CiAJfQpAQCAtMzA2OCw4ICszMjU3LDggQEAKIAlCVF9EQkcoIiIpOwogCiAJaWYgKGNwLT5pb19jYXBhYmlsaXR5ID4gU01QX0lPX0tFWUJPQVJEX0RJU1BMQVkpCi0JCXJldHVybiBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9JT19DQVBBQklMSVRZLAotCQkJCSAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywgTlVMTCwgMCk7CisJCXJldHVybiBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0lPX0NBUEFCSUxJVFksCisJCQkJCSBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywgTlVMTCwgMCk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKQEAgLTMwODAsMTQgKzMyNjksMTQgQEAKIAogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCi0JcmV0dXJuIGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0lPX0NBUEFCSUxJVFksIDAsIE5VTEwsCi0JCQkgICAgMCk7CisJcmV0dXJuIG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfSU9fQ0FQQUJJTElUWSwgMCwKKwkJCQkgTlVMTCwgMCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGVuZGluZ19jbWQgKmZpbmRfcGFpcmluZyhzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCitzdGF0aWMgc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmZpbmRfcGFpcmluZyhzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNtZCwgJmhkZXYtPm1nbXRfcGVuZGluZywgbGlzdCkgewogCQlpZiAoY21kLT5vcGNvZGUgIT0gTUdNVF9PUF9QQUlSX0RFVklDRSkKQEAgLTMxMDIsNyArMzI5MSw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgcGFpcmluZ19jb21wbGV0ZShzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCwgdTggc3RhdHVzKQorc3RhdGljIGludCBwYWlyaW5nX2NvbXBsZXRlKHN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQsIHU4IHN0YXR1cykKIHsKIAlzdHJ1Y3QgbWdtdF9ycF9wYWlyX2RldmljZSBycDsKIAlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4gPSBjbWQtPnVzZXJfZGF0YTsKQEAgLTMxMTEsOCArMzMwMCw4IEBACiAJYmFjcHkoJnJwLmFkZHIuYmRhZGRyLCAmY29ubi0+ZHN0KTsKIAlycC5hZGRyLnR5cGUgPSBsaW5rX3RvX2JkYWRkcihjb25uLT50eXBlLCBjb25uLT5kc3RfdHlwZSk7CiAKLQllcnIgPSBjbWRfY29tcGxldGUoY21kLT5zaywgY21kLT5pbmRleCwgTUdNVF9PUF9QQUlSX0RFVklDRSwgc3RhdHVzLAotCQkJICAgJnJwLCBzaXplb2YocnApKTsKKwllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShjbWQtPnNrLCBjbWQtPmluZGV4LCBNR01UX09QX1BBSVJfREVWSUNFLAorCQkJCXN0YXR1cywgJnJwLCBzaXplb2YocnApKTsKIAogCS8qIFNvIHdlIGRvbid0IGdldCBmdXJ0aGVyIGNhbGxiYWNrcyBmb3IgdGhpcyBjb25uZWN0aW9uICovCiAJY29ubi0+Y29ubmVjdF9jZm1fY2IgPSBOVUxMOwpAQCAtMzEzNCw3ICszMzIzLDcgQEAKIHZvaWQgbWdtdF9zbXBfY29tcGxldGUoc3RydWN0IGhjaV9jb25uICpjb25uLCBib29sIGNvbXBsZXRlKQogewogCXU4IHN0YXR1cyA9IGNvbXBsZXRlID8gTUdNVF9TVEFUVVNfU1VDQ0VTUyA6IE1HTVRfU1RBVFVTX0ZBSUxFRDsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCiAJY21kID0gZmluZF9wYWlyaW5nKGNvbm4pOwogCWlmIChjbWQpIHsKQEAgLTMxNDUsNyArMzMzNCw3IEBACiAKIHN0YXRpYyB2b2lkIHBhaXJpbmdfY29tcGxldGVfY2Ioc3RydWN0IGhjaV9jb25uICpjb25uLCB1OCBzdGF0dXMpCiB7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAogCUJUX0RCRygic3RhdHVzICV1Iiwgc3RhdHVzKTsKIApAQCAtMzE2MSw3ICszMzUwLDcgQEAKIAogc3RhdGljIHZvaWQgbGVfcGFpcmluZ19jb21wbGV0ZV9jYihzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHU4IHN0YXR1cykKIHsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCiAJQlRfREJHKCJzdGF0dXMgJXUiLCBzdGF0dXMpOwogCkBAIC0zMTgzLDcgKzMzNzIsNyBAQAogewogCXN0cnVjdCBtZ210X2NwX3BhaXJfZGV2aWNlICpjcCA9IGRhdGE7CiAJc3RydWN0IG1nbXRfcnBfcGFpcl9kZXZpY2UgcnA7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAl1OCBzZWNfbGV2ZWwsIGF1dGhfdHlwZTsKIAlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CiAJaW50IGVycjsKQEAgLTMxOTUsMjAgKzMzODQsMjggQEAKIAlycC5hZGRyLnR5cGUgPSBjcC0+YWRkci50eXBlOwogCiAJaWYgKCFiZGFkZHJfdHlwZV9pc192YWxpZChjcC0+YWRkci50eXBlKSkKLQkJcmV0dXJuIGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfUEFJUl9ERVZJQ0UsCi0JCQkJICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAotCQkJCSAgICAmcnAsIHNpemVvZihycCkpOworCQlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1BBSVJfREVWSUNFLAorCQkJCQkgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCisJCQkJCSAmcnAsIHNpemVvZihycCkpOwogCiAJaWYgKGNwLT5pb19jYXAgPiBTTVBfSU9fS0VZQk9BUkRfRElTUExBWSkKLQkJcmV0dXJuIGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfUEFJUl9ERVZJQ0UsCi0JCQkJICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAotCQkJCSAgICAmcnAsIHNpemVvZihycCkpOworCQlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1BBSVJfREVWSUNFLAorCQkJCQkgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCisJCQkJCSAmcnAsIHNpemVvZihycCkpOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9QQUlSX0RFVklDRSwKLQkJCQkgICBNR01UX1NUQVRVU19OT1RfUE9XRVJFRCwgJnJwLCBzaXplb2YocnApKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1BBSVJfREVWSUNFLAorCQkJCQlNR01UX1NUQVRVU19OT1RfUE9XRVJFRCwgJnJwLAorCQkJCQlzaXplb2YocnApKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKGhjaV9iZGFkZHJfaXNfcGFpcmVkKGhkZXYsICZjcC0+YWRkci5iZGFkZHIsIGNwLT5hZGRyLnR5cGUpKSB7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9QQUlSX0RFVklDRSwKKwkJCQkJTUdNVF9TVEFUVVNfQUxSRUFEWV9QQUlSRUQsICZycCwKKwkJCQkJc2l6ZW9mKHJwKSk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIApAQCAtMzI0OSwxOSArMzQ0NiwyMiBAQAogCiAJCWlmIChQVFJfRVJSKGNvbm4pID09IC1FQlVTWSkKIAkJCXN0YXR1cyA9IE1HTVRfU1RBVFVTX0JVU1k7CisJCWVsc2UgaWYgKFBUUl9FUlIoY29ubikgPT0gLUVPUE5PVFNVUFApCisJCQlzdGF0dXMgPSBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEOworCQllbHNlIGlmIChQVFJfRVJSKGNvbm4pID09IC1FQ09OTlJFRlVTRUQpCisJCQlzdGF0dXMgPSBNR01UX1NUQVRVU19SRUpFQ1RFRDsKIAkJZWxzZQogCQkJc3RhdHVzID0gTUdNVF9TVEFUVVNfQ09OTkVDVF9GQUlMRUQ7CiAKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9QQUlSX0RFVklDRSwKLQkJCQkgICBzdGF0dXMsICZycCwKLQkJCQkgICBzaXplb2YocnApKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1BBSVJfREVWSUNFLAorCQkJCQlzdGF0dXMsICZycCwgc2l6ZW9mKHJwKSk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIAogCWlmIChjb25uLT5jb25uZWN0X2NmbV9jYikgewogCQloY2lfY29ubl9kcm9wKGNvbm4pOwotCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1BBSVJfREVWSUNFLAotCQkJCSAgIE1HTVRfU1RBVFVTX0JVU1ksICZycCwgc2l6ZW9mKHJwKSk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9QQUlSX0RFVklDRSwKKwkJCQkJTUdNVF9TVEFUVVNfQlVTWSwgJnJwLCBzaXplb2YocnApKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCkBAIC0zMzA1LDcgKzM1MDUsNyBAQAogCQkJICAgICAgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgbWdtdF9hZGRyX2luZm8gKmFkZHIgPSBkYXRhOwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IGhjaV9jb25uICpjb25uOwogCWludCBlcnI7CiAKQEAgLTMzMTQsMzEgKzM1MTQsMzEgQEAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAlpZiAoIWhkZXZfaXNfcG93ZXJlZChoZGV2KSkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9DQU5DRUxfUEFJUl9ERVZJQ0UsCi0JCQkJIE1HTVRfU1RBVFVTX05PVF9QT1dFUkVEKTsKKwkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9DQU5DRUxfUEFJUl9ERVZJQ0UsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1BBSVJfREVWSUNFLCBoZGV2KTsKKwljbWQgPSBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9QQUlSX0RFVklDRSwgaGRldik7CiAJaWYgKCFjbWQpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfQ0FOQ0VMX1BBSVJfREVWSUNFLAotCQkJCSBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfQ0FOQ0VMX1BBSVJfREVWSUNFLAorCQkJCSAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCiAJY29ubiA9IGNtZC0+dXNlcl9kYXRhOwogCiAJaWYgKGJhY21wKCZhZGRyLT5iZGFkZHIsICZjb25uLT5kc3QpICE9IDApIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfQ0FOQ0VMX1BBSVJfREVWSUNFLAotCQkJCSBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfQ0FOQ0VMX1BBSVJfREVWSUNFLAorCQkJCSAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCiAJY21kLT5jbWRfY29tcGxldGUoY21kLCBNR01UX1NUQVRVU19DQU5DRUxMRUQpOwogCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIAotCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfQ0FOQ0VMX1BBSVJfREVWSUNFLCAwLAotCQkJICAgYWRkciwgc2l6ZW9mKCphZGRyKSk7CisJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0NBTkNFTF9QQUlSX0RFVklDRSwgMCwKKwkJCQlhZGRyLCBzaXplb2YoKmFkZHIpKTsKIHVubG9jazoKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKIAlyZXR1cm4gZXJyOwpAQCAtMzM0OCwxNiArMzU0OCwxNiBAQAogCQkJICAgICBzdHJ1Y3QgbWdtdF9hZGRyX2luZm8gKmFkZHIsIHUxNiBtZ210X29wLAogCQkJICAgICB1MTYgaGNpX29wLCBfX2xlMzIgcGFzc2tleSkKIHsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKIAlpbnQgZXJyOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgbWdtdF9vcCwKLQkJCQkgICBNR01UX1NUQVRVU19OT1RfUE9XRVJFRCwgYWRkciwKLQkJCQkgICBzaXplb2YoKmFkZHIpKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBtZ210X29wLAorCQkJCQlNR01UX1NUQVRVU19OT1RfUE9XRVJFRCwgYWRkciwKKwkJCQkJc2l6ZW9mKCphZGRyKSk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTMzNjcsMjIgKzM1NjcsMjIgQEAKIAkJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIExFX0xJTkssICZhZGRyLT5iZGFkZHIpOwogCiAJaWYgKCFjb25uKSB7Ci0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIG1nbXRfb3AsCi0JCQkJICAgTUdNVF9TVEFUVVNfTk9UX0NPTk5FQ1RFRCwgYWRkciwKLQkJCQkgICBzaXplb2YoKmFkZHIpKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBtZ210X29wLAorCQkJCQlNR01UX1NUQVRVU19OT1RfQ09OTkVDVEVELCBhZGRyLAorCQkJCQlzaXplb2YoKmFkZHIpKTsKIAkJZ290byBkb25lOwogCX0KIAogCWlmIChhZGRyLT50eXBlID09IEJEQUREUl9MRV9QVUJMSUMgfHwgYWRkci0+dHlwZSA9PSBCREFERFJfTEVfUkFORE9NKSB7CiAJCWVyciA9IHNtcF91c2VyX2NvbmZpcm1fcmVwbHkoY29ubiwgbWdtdF9vcCwgcGFzc2tleSk7CiAJCWlmICghZXJyKQotCQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgbWdtdF9vcCwKLQkJCQkJICAgTUdNVF9TVEFUVVNfU1VDQ0VTUywgYWRkciwKLQkJCQkJICAgc2l6ZW9mKCphZGRyKSk7CisJCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIG1nbXRfb3AsCisJCQkJCQlNR01UX1NUQVRVU19TVUNDRVNTLCBhZGRyLAorCQkJCQkJc2l6ZW9mKCphZGRyKSk7CiAJCWVsc2UKLQkJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIG1nbXRfb3AsCi0JCQkJCSAgIE1HTVRfU1RBVFVTX0ZBSUxFRCwgYWRkciwKLQkJCQkJICAgc2l6ZW9mKCphZGRyKSk7CisJCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIG1nbXRfb3AsCisJCQkJCQlNR01UX1NUQVRVU19GQUlMRUQsIGFkZHIsCisJCQkJCQlzaXplb2YoKmFkZHIpKTsKIAogCQlnb3RvIGRvbmU7CiAJfQpAQCAtMzQzNCw4ICszNjM0LDggQEAKIAlCVF9EQkcoIiIpOwogCiAJaWYgKGxlbiAhPSBzaXplb2YoKmNwKSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1VTRVJfQ09ORklSTV9SRVBMWSwKLQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfVVNFUl9DT05GSVJNX1JFUExZLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAlyZXR1cm4gdXNlcl9wYWlyaW5nX3Jlc3Aoc2ssIGhkZXYsICZjcC0+YWRkciwKIAkJCQkgTUdNVF9PUF9VU0VSX0NPTkZJUk1fUkVQTFksCkBAIC0zNDkxLDI0ICszNjkxLDI0IEBACiBzdGF0aWMgdm9pZCBzZXRfbmFtZV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzLCB1MTYgb3Bjb2RlKQogewogCXN0cnVjdCBtZ210X2NwX3NldF9sb2NhbF9uYW1lICpjcDsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCiAJQlRfREJHKCJzdGF0dXMgMHglMDJ4Iiwgc3RhdHVzKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsIGhkZXYpOworCWNtZCA9IHBlbmRpbmdfZmluZChNR01UX09QX1NFVF9MT0NBTF9OQU1FLCBoZGV2KTsKIAlpZiAoIWNtZCkKIAkJZ290byB1bmxvY2s7CiAKIAljcCA9IGNtZC0+cGFyYW07CiAKIAlpZiAoc3RhdHVzKQotCQljbWRfc3RhdHVzKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLAotCQkJICAgbWdtdF9zdGF0dXMoc3RhdHVzKSk7CisJCW1nbXRfY21kX3N0YXR1cyhjbWQtPnNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTE9DQUxfTkFNRSwKKwkJCSAgICAgICAgbWdtdF9zdGF0dXMoc3RhdHVzKSk7CiAJZWxzZQotCQljbWRfY29tcGxldGUoY21kLT5zaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsIDAsCi0JCQkgICAgIGNwLCBzaXplb2YoKmNwKSk7CisJCW1nbXRfY21kX2NvbXBsZXRlKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLCAwLAorCQkJCSAgY3AsIHNpemVvZigqY3ApKTsKIAogCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIApAQCAtMzUyMCw3ICszNzIwLDcgQEAKIAkJCSAgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgbWdtdF9jcF9zZXRfbG9jYWxfbmFtZSAqY3AgPSBkYXRhOwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKIAlpbnQgZXJyOwogCkBAIC0zNTM0LDggKzM3MzQsOCBAQAogCWlmICghbWVtY21wKGhkZXYtPmRldl9uYW1lLCBjcC0+bmFtZSwgc2l6ZW9mKGhkZXYtPmRldl9uYW1lKSkgJiYKIAkgICAgIW1lbWNtcChoZGV2LT5zaG9ydF9uYW1lLCBjcC0+c2hvcnRfbmFtZSwKIAkJICAgIHNpemVvZihoZGV2LT5zaG9ydF9uYW1lKSkpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfTE9DQUxfTkFNRSwgMCwKLQkJCQkgICBkYXRhLCBsZW4pOworCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsIDAsCisJCQkJCWRhdGEsIGxlbik7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtMzU0NCwxMyArMzc0NCwxMyBAQAogCWlmICghaGRldl9pc19wb3dlcmVkKGhkZXYpKSB7CiAJCW1lbWNweShoZGV2LT5kZXZfbmFtZSwgY3AtPm5hbWUsIHNpemVvZihoZGV2LT5kZXZfbmFtZSkpOwogCi0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsIDAsCi0JCQkJICAgZGF0YSwgbGVuKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLCAwLAorCQkJCQlkYXRhLCBsZW4pOwogCQlpZiAoZXJyIDwgMCkKIAkJCWdvdG8gZmFpbGVkOwogCi0JCWVyciA9IG1nbXRfZXZlbnQoTUdNVF9FVl9MT0NBTF9OQU1FX0NIQU5HRUQsIGhkZXYsIGRhdGEsIGxlbiwKLQkJCQkgc2spOworCQllcnIgPSBtZ210X2dlbmVyaWNfZXZlbnQoTUdNVF9FVl9MT0NBTF9OQU1FX0NIQU5HRUQsIGhkZXYsCisJCQkJCSBkYXRhLCBsZW4sIHNrKTsKIAogCQlnb3RvIGZhaWxlZDsKIAl9CkBAIC0zNTg1LDEwICszNzg1LDcwIEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHZvaWQgcmVhZF9sb2NhbF9vb2JfZGF0YV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzLAorCQkJCSAgICAgICAgIHUxNiBvcGNvZGUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG1nbXRfcnBfcmVhZF9sb2NhbF9vb2JfZGF0YSBtZ210X3JwOworCXNpemVfdCBycF9zaXplID0gc2l6ZW9mKG1nbXRfcnApOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CisKKwlCVF9EQkcoIiVzIHN0YXR1cyAldSIsIGhkZXYtPm5hbWUsIHN0YXR1cyk7CisKKwljbWQgPSBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLCBoZGV2KTsKKwlpZiAoIWNtZCkKKwkJcmV0dXJuOworCisJaWYgKHN0YXR1cyB8fCAhc2tiKSB7CisJCW1nbXRfY21kX3N0YXR1cyhjbWQtPnNrLCBoZGV2LT5pZCwgTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLAorCQkJCXN0YXR1cyA/IG1nbXRfc3RhdHVzKHN0YXR1cykgOiBNR01UX1NUQVRVU19GQUlMRUQpOworCQlnb3RvIHJlbW92ZTsKKwl9CisKKwltZW1zZXQoJm1nbXRfcnAsIDAsIHNpemVvZihtZ210X3JwKSk7CisKKwlpZiAob3Bjb2RlID09IEhDSV9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBKSB7CisJCXN0cnVjdCBoY2lfcnBfcmVhZF9sb2NhbF9vb2JfZGF0YSAqcnAgPSAodm9pZCAqKSBza2ItPmRhdGE7CisKKwkJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCpycCkpIHsKKwkJCW1nbXRfY21kX3N0YXR1cyhjbWQtPnNrLCBoZGV2LT5pZCwKKwkJCQkJTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLAorCQkJCQlNR01UX1NUQVRVU19GQUlMRUQpOworCQkJZ290byByZW1vdmU7CisJCX0KKworCQltZW1jcHkobWdtdF9ycC5oYXNoMTkyLCBycC0+aGFzaCwgc2l6ZW9mKHJwLT5oYXNoKSk7CisJCW1lbWNweShtZ210X3JwLnJhbmQxOTIsIHJwLT5yYW5kLCBzaXplb2YocnAtPnJhbmQpKTsKKworCQlycF9zaXplIC09IHNpemVvZihtZ210X3JwLmhhc2gyNTYpICsgc2l6ZW9mKG1nbXRfcnAucmFuZDI1Nik7CisJfSBlbHNlIHsKKwkJc3RydWN0IGhjaV9ycF9yZWFkX2xvY2FsX29vYl9leHRfZGF0YSAqcnAgPSAodm9pZCAqKSBza2ItPmRhdGE7CisKKwkJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKCpycCkpIHsKKwkJCW1nbXRfY21kX3N0YXR1cyhjbWQtPnNrLCBoZGV2LT5pZCwKKwkJCQkJTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLAorCQkJCQlNR01UX1NUQVRVU19GQUlMRUQpOworCQkJZ290byByZW1vdmU7CisJCX0KKworCQltZW1jcHkobWdtdF9ycC5oYXNoMTkyLCBycC0+aGFzaDE5Miwgc2l6ZW9mKHJwLT5oYXNoMTkyKSk7CisJCW1lbWNweShtZ210X3JwLnJhbmQxOTIsIHJwLT5yYW5kMTkyLCBzaXplb2YocnAtPnJhbmQxOTIpKTsKKworCQltZW1jcHkobWdtdF9ycC5oYXNoMjU2LCBycC0+aGFzaDI1Niwgc2l6ZW9mKHJwLT5oYXNoMjU2KSk7CisJCW1lbWNweShtZ210X3JwLnJhbmQyNTYsIHJwLT5yYW5kMjU2LCBzaXplb2YocnAtPnJhbmQyNTYpKTsKKwl9CisKKwltZ210X2NtZF9jb21wbGV0ZShjbWQtPnNrLCBoZGV2LT5pZCwgTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLAorCQkJICBNR01UX1NUQVRVU19TVUNDRVNTLCAmbWdtdF9ycCwgcnBfc2l6ZSk7CisKK3JlbW92ZToKKwltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7Cit9CisKIHN0YXRpYyBpbnQgcmVhZF9sb2NhbF9vb2JfZGF0YShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBoY2lfZGV2ICpoZGV2LAogCQkJICAgICAgIHZvaWQgKmRhdGEsIHUxNiBkYXRhX2xlbikKIHsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJaW50IGVycjsKIAogCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKQEAgLTM1OTYsMjAgKzM4NTYsMjAgQEAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAlpZiAoIWhkZXZfaXNfcG93ZXJlZChoZGV2KSkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLAotCQkJCSBNR01UX1NUQVRVU19OT1RfUE9XRVJFRCk7CisJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfUkVBRF9MT0NBTF9PT0JfREFUQSwKKwkJCQkgICAgICBNR01UX1NUQVRVU19OT1RfUE9XRVJFRCk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIAogCWlmICghbG1wX3NzcF9jYXBhYmxlKGhkZXYpKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCi0JCQkJIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIAotCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsIGhkZXYpKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCi0JCQkJIE1HTVRfU1RBVFVTX0JVU1kpOworCWlmIChwZW5kaW5nX2ZpbmQoTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLCBoZGV2KSkgeworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfQlVTWSk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIApAQCAtMzYxOSwxMiArMzg3OSwxNCBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlpZiAoYnJlZHJfc2NfZW5hYmxlZChoZGV2KSkKLQkJZXJyID0gaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9SRUFEX0xPQ0FMX09PQl9FWFRfREFUQSwKLQkJCQkgICAwLCBOVUxMKTsKLQllbHNlCi0JCWVyciA9IGhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfUkVBRF9MT0NBTF9PT0JfREFUQSwgMCwgTlVMTCk7CisJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOwogCisJaWYgKGJyZWRyX3NjX2VuYWJsZWQoaGRldikpCisJCWhjaV9yZXFfYWRkKCZyZXEsIEhDSV9PUF9SRUFEX0xPQ0FMX09PQl9FWFRfREFUQSwgMCwgTlVMTCk7CisJZWxzZQorCQloY2lfcmVxX2FkZCgmcmVxLCBIQ0lfT1BfUkVBRF9MT0NBTF9PT0JfREFUQSwgMCwgTlVMTCk7CisKKwllcnIgPSBoY2lfcmVxX3J1bl9za2IoJnJlcSwgcmVhZF9sb2NhbF9vb2JfZGF0YV9jb21wbGV0ZSk7CiAJaWYgKGVyciA8IDApCiAJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIApAQCAtMzY0Miw5ICszOTA0LDEwIEBACiAJQlRfREJHKCIlcyAiLCBoZGV2LT5uYW1lKTsKIAogCWlmICghYmRhZGRyX3R5cGVfaXNfdmFsaWQoYWRkci0+dHlwZSkpCi0JCXJldHVybiBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0FERF9SRU1PVEVfT09CX0RBVEEsCi0JCQkJICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLCBhZGRyLAotCQkJCSAgICBzaXplb2YoKmFkZHIpKTsKKwkJcmV0dXJuIG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwKKwkJCQkJIE1HTVRfT1BfQUREX1JFTU9URV9PT0JfREFUQSwKKwkJCQkJIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAorCQkJCQkgYWRkciwgc2l6ZW9mKCphZGRyKSk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKQEAgLTM2NTMsMTAgKzM5MTYsMTAgQEAKIAkJdTggc3RhdHVzOwogCiAJCWlmIChjcC0+YWRkci50eXBlICE9IEJEQUREUl9CUkVEUikgewotCQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwKLQkJCQkJICAgTUdNVF9PUF9BRERfUkVNT1RFX09PQl9EQVRBLAotCQkJCQkgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywKLQkJCQkJICAgJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKKwkJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwKKwkJCQkJCU1HTVRfT1BfQUREX1JFTU9URV9PT0JfREFUQSwKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAorCQkJCQkJJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CiAKQEAgLTM2NjgsOCArMzkzMSw5IEBACiAJCWVsc2UKIAkJCXN0YXR1cyA9IE1HTVRfU1RBVFVTX1NVQ0NFU1M7CiAKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9BRERfUkVNT1RFX09PQl9EQVRBLAotCQkJCSAgIHN0YXR1cywgJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLAorCQkJCQlNR01UX09QX0FERF9SRU1PVEVfT09CX0RBVEEsIHN0YXR1cywKKwkJCQkJJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKIAl9IGVsc2UgaWYgKGxlbiA9PSBNR01UX0FERF9SRU1PVEVfT09CX0VYVF9EQVRBX1NJWkUpIHsKIAkJc3RydWN0IG1nbXRfY3BfYWRkX3JlbW90ZV9vb2JfZXh0X2RhdGEgKmNwID0gZGF0YTsKIAkJdTggKnJhbmQxOTIsICpoYXNoMTkyLCAqcmFuZDI1NiwgKmhhc2gyNTY7CkBAIC0zNjgxLDEwICszOTQ1LDEwIEBACiAJCQkgKi8KIAkJCWlmIChtZW1jbXAoY3AtPnJhbmQxOTIsIFpFUk9fS0VZLCAxNikgfHwKIAkJCSAgICBtZW1jbXAoY3AtPmhhc2gxOTIsIFpFUk9fS0VZLCAxNikpIHsKLQkJCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLAotCQkJCQkJICAgTUdNVF9PUF9BRERfUkVNT1RFX09PQl9EQVRBLAotCQkJCQkJICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCi0JCQkJCQkgICBhZGRyLCBzaXplb2YoKmFkZHIpKTsKKwkJCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsCisJCQkJCQkJTUdNVF9PUF9BRERfUkVNT1RFX09PQl9EQVRBLAorCQkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAorCQkJCQkJCWFkZHIsIHNpemVvZigqYWRkcikpOwogCQkJCWdvdG8gdW5sb2NrOwogCQkJfQogCkBAIC0zNzI0LDEyICszOTg4LDEzIEBACiAJCWVsc2UKIAkJCXN0YXR1cyA9IE1HTVRfU1RBVFVTX1NVQ0NFU1M7CiAKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9BRERfUkVNT1RFX09PQl9EQVRBLAotCQkJCSAgIHN0YXR1cywgJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLAorCQkJCQlNR01UX09QX0FERF9SRU1PVEVfT09CX0RBVEEsCisJCQkJCXN0YXR1cywgJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKIAl9IGVsc2UgewogCQlCVF9FUlIoImFkZF9yZW1vdGVfb29iX2RhdGE6IGludmFsaWQgbGVuZ3RoIG9mICV1IGJ5dGVzIiwgbGVuKTsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfQUREX1JFTU9URV9PT0JfREFUQSwKLQkJCQkgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0FERF9SRU1PVEVfT09CX0RBVEEsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCX0KIAogdW5sb2NrOgpAQCAtMzc0Nyw5ICs0MDEyLDEwIEBACiAJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOwogCiAJaWYgKGNwLT5hZGRyLnR5cGUgIT0gQkRBRERSX0JSRURSKQotCQlyZXR1cm4gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9SRU1PVkVfUkVNT1RFX09PQl9EQVRBLAotCQkJCSAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywKLQkJCQkgICAgJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKKwkJcmV0dXJuIG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwKKwkJCQkJIE1HTVRfT1BfUkVNT1ZFX1JFTU9URV9PT0JfREFUQSwKKwkJCQkJIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAorCQkJCQkgJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIApAQCAtMzc2NiwxMDAgKzQwMzIsMTM2IEBACiAJCXN0YXR1cyA9IE1HTVRfU1RBVFVTX1NVQ0NFU1M7CiAKIGRvbmU6Ci0JZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9SRU1PVkVfUkVNT1RFX09PQl9EQVRBLAotCQkJICAgc3RhdHVzLCAmY3AtPmFkZHIsIHNpemVvZihjcC0+YWRkcikpOworCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9SRU1PVkVfUkVNT1RFX09PQl9EQVRBLAorCQkJCXN0YXR1cywgJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKIAogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBib29sIHRyaWdnZXJfZGlzY292ZXJ5KHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLCB1OCAqc3RhdHVzKQorc3RhdGljIGJvb2wgdHJpZ2dlcl9icmVkcl9pbnF1aXJ5KHN0cnVjdCBoY2lfcmVxdWVzdCAqcmVxLCB1OCAqc3RhdHVzKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gcmVxLT5oZGV2OworCXN0cnVjdCBoY2lfY3BfaW5xdWlyeSBjcDsKKwkvKiBHZW5lcmFsIGlucXVpcnkgYWNjZXNzIGNvZGUgKEdJQUMpICovCisJdTggbGFwWzNdID0geyAweDMzLCAweDhiLCAweDllIH07CisKKwkqc3RhdHVzID0gbWdtdF9icmVkcl9zdXBwb3J0KGhkZXYpOworCWlmICgqc3RhdHVzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0lOUVVJUlkpKSB7CisJCSpzdGF0dXMgPSBNR01UX1NUQVRVU19CVVNZOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaGNpX2lucXVpcnlfY2FjaGVfZmx1c2goaGRldik7CisKKwltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKKwltZW1jcHkoJmNwLmxhcCwgbGFwLCBzaXplb2YoY3AubGFwKSk7CisJY3AubGVuZ3RoID0gRElTQ09WX0JSRURSX0lOUVVJUllfTEVOOworCisJaGNpX3JlcV9hZGQocmVxLCBIQ0lfT1BfSU5RVUlSWSwgc2l6ZW9mKGNwKSwgJmNwKTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCB0cmlnZ2VyX2xlX3NjYW4oc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsIHUxNiBpbnRlcnZhbCwgdTggKnN0YXR1cykKIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IHJlcS0+aGRldjsKIAlzdHJ1Y3QgaGNpX2NwX2xlX3NldF9zY2FuX3BhcmFtIHBhcmFtX2NwOwogCXN0cnVjdCBoY2lfY3BfbGVfc2V0X3NjYW5fZW5hYmxlIGVuYWJsZV9jcDsKLQlzdHJ1Y3QgaGNpX2NwX2lucXVpcnkgaW5xX2NwOwotCS8qIEdlbmVyYWwgaW5xdWlyeSBhY2Nlc3MgY29kZSAoR0lBQykgKi8KLQl1OCBsYXBbM10gPSB7IDB4MzMsIDB4OGIsIDB4OWUgfTsKIAl1OCBvd25fYWRkcl90eXBlOwogCWludCBlcnI7CiAKLQlzd2l0Y2ggKGhkZXYtPmRpc2NvdmVyeS50eXBlKSB7Ci0JY2FzZSBESVNDT1ZfVFlQRV9CUkVEUjoKLQkJKnN0YXR1cyA9IG1nbXRfYnJlZHJfc3VwcG9ydChoZGV2KTsKLQkJaWYgKCpzdGF0dXMpCi0JCQlyZXR1cm4gZmFsc2U7CisJKnN0YXR1cyA9IG1nbXRfbGVfc3VwcG9ydChoZGV2KTsKKwlpZiAoKnN0YXR1cykKKwkJcmV0dXJuIGZhbHNlOwogCi0JCWlmICh0ZXN0X2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKSkgewotCQkJKnN0YXR1cyA9IE1HTVRfU1RBVFVTX0JVU1k7CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9BRFYpKSB7CisJCS8qIERvbid0IGxldCBkaXNjb3ZlcnkgYWJvcnQgYW4gb3V0Z29pbmcgY29ubmVjdGlvbiBhdHRlbXB0CisJCSAqIHRoYXQncyB1c2luZyBkaXJlY3RlZCBhZHZlcnRpc2luZy4KKwkJICovCisJCWlmIChoY2lfY29ubl9oYXNoX2xvb2t1cF9zdGF0ZShoZGV2LCBMRV9MSU5LLCBCVF9DT05ORUNUKSkgeworCQkJKnN0YXR1cyA9IE1HTVRfU1RBVFVTX1JFSkVDVEVEOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKLQkJaGNpX2lucXVpcnlfY2FjaGVfZmx1c2goaGRldik7CisJCWRpc2FibGVfYWR2ZXJ0aXNpbmcocmVxKTsKKwl9CiAKLQkJbWVtc2V0KCZpbnFfY3AsIDAsIHNpemVvZihpbnFfY3ApKTsKLQkJbWVtY3B5KCZpbnFfY3AubGFwLCBsYXAsIHNpemVvZihpbnFfY3AubGFwKSk7Ci0JCWlucV9jcC5sZW5ndGggPSBESVNDT1ZfQlJFRFJfSU5RVUlSWV9MRU47Ci0JCWhjaV9yZXFfYWRkKHJlcSwgSENJX09QX0lOUVVJUlksIHNpemVvZihpbnFfY3ApLCAmaW5xX2NwKTsKKwkvKiBJZiBjb250cm9sbGVyIGlzIHNjYW5uaW5nLCBpdCBtZWFucyB0aGUgYmFja2dyb3VuZCBzY2FubmluZyBpcworCSAqIHJ1bm5pbmcuIFRodXMsIHdlIHNob3VsZCB0ZW1wb3JhcmlseSBzdG9wIGl0IGluIG9yZGVyIHRvIHNldCB0aGUKKwkgKiBkaXNjb3Zlcnkgc2Nhbm5pbmcgcGFyYW1ldGVycy4KKwkgKi8KKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX1NDQU4pKQorCQloY2lfcmVxX2FkZF9sZV9zY2FuX2Rpc2FibGUocmVxKTsKKworCS8qIEFsbCBhY3RpdmUgc2NhbnMgd2lsbCBiZSBkb25lIHdpdGggZWl0aGVyIGEgcmVzb2x2YWJsZSBwcml2YXRlCisJICogYWRkcmVzcyAod2hlbiBwcml2YWN5IGZlYXR1cmUgaGFzIGJlZW4gZW5hYmxlZCkgb3Igbm9uLXJlc29sdmFibGUKKwkgKiBwcml2YXRlIGFkZHJlc3MuCisJICovCisJZXJyID0gaGNpX3VwZGF0ZV9yYW5kb21fYWRkcmVzcyhyZXEsIHRydWUsICZvd25fYWRkcl90eXBlKTsKKwlpZiAoZXJyIDwgMCkgeworCQkqc3RhdHVzID0gTUdNVF9TVEFUVVNfRkFJTEVEOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJbWVtc2V0KCZwYXJhbV9jcCwgMCwgc2l6ZW9mKHBhcmFtX2NwKSk7CisJcGFyYW1fY3AudHlwZSA9IExFX1NDQU5fQUNUSVZFOworCXBhcmFtX2NwLmludGVydmFsID0gY3B1X3RvX2xlMTYoaW50ZXJ2YWwpOworCXBhcmFtX2NwLndpbmRvdyA9IGNwdV90b19sZTE2KERJU0NPVl9MRV9TQ0FOX1dJTik7CisJcGFyYW1fY3Aub3duX2FkZHJlc3NfdHlwZSA9IG93bl9hZGRyX3R5cGU7CisKKwloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9MRV9TRVRfU0NBTl9QQVJBTSwgc2l6ZW9mKHBhcmFtX2NwKSwKKwkJICAgICZwYXJhbV9jcCk7CisKKwltZW1zZXQoJmVuYWJsZV9jcCwgMCwgc2l6ZW9mKGVuYWJsZV9jcCkpOworCWVuYWJsZV9jcC5lbmFibGUgPSBMRV9TQ0FOX0VOQUJMRTsKKwllbmFibGVfY3AuZmlsdGVyX2R1cCA9IExFX1NDQU5fRklMVEVSX0RVUF9FTkFCTEU7CisKKwloY2lfcmVxX2FkZChyZXEsIEhDSV9PUF9MRV9TRVRfU0NBTl9FTkFCTEUsIHNpemVvZihlbmFibGVfY3ApLAorCQkgICAgJmVuYWJsZV9jcCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgdHJpZ2dlcl9kaXNjb3Zlcnkoc3RydWN0IGhjaV9yZXF1ZXN0ICpyZXEsIHU4ICpzdGF0dXMpCit7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSByZXEtPmhkZXY7CisKKwlzd2l0Y2ggKGhkZXYtPmRpc2NvdmVyeS50eXBlKSB7CisJY2FzZSBESVNDT1ZfVFlQRV9CUkVEUjoKKwkJaWYgKCF0cmlnZ2VyX2JyZWRyX2lucXVpcnkocmVxLCBzdGF0dXMpKQorCQkJcmV0dXJuIGZhbHNlOwogCQlicmVhazsKIAotCWNhc2UgRElTQ09WX1RZUEVfTEU6CiAJY2FzZSBESVNDT1ZfVFlQRV9JTlRFUkxFQVZFRDoKLQkJKnN0YXR1cyA9IG1nbXRfbGVfc3VwcG9ydChoZGV2KTsKLQkJaWYgKCpzdGF0dXMpCi0JCQlyZXR1cm4gZmFsc2U7CisJCWlmICh0ZXN0X2JpdChIQ0lfUVVJUktfU0lNVUxUQU5FT1VTX0RJU0NPVkVSWSwKKwkJCSAgICAgJmhkZXYtPnF1aXJrcykpIHsKKwkJCS8qIER1cmluZyBzaW11bHRhbmVvdXMgZGlzY292ZXJ5LCB3ZSBkb3VibGUgTEUgc2NhbgorCQkJICogaW50ZXJ2YWwuIFdlIG11c3QgbGVhdmUgc29tZSB0aW1lIGZvciB0aGUgY29udHJvbGxlcgorCQkJICogdG8gZG8gQlIvRURSIGlucXVpcnkuCisJCQkgKi8KKwkJCWlmICghdHJpZ2dlcl9sZV9zY2FuKHJlcSwgRElTQ09WX0xFX1NDQU5fSU5UICogMiwKKwkJCQkJICAgICBzdGF0dXMpKQorCQkJCXJldHVybiBmYWxzZTsKIAotCQlpZiAoaGRldi0+ZGlzY292ZXJ5LnR5cGUgPT0gRElTQ09WX1RZUEVfSU5URVJMRUFWRUQgJiYKLQkJICAgICF0ZXN0X2JpdChIQ0lfQlJFRFJfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwkJCWlmICghdHJpZ2dlcl9icmVkcl9pbnF1aXJ5KHJlcSwgc3RhdHVzKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCkpIHsKIAkJCSpzdGF0dXMgPSBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCi0JCWlmICh0ZXN0X2JpdChIQ0lfTEVfQURWLCAmaGRldi0+ZGV2X2ZsYWdzKSkgewotCQkJLyogRG9uJ3QgbGV0IGRpc2NvdmVyeSBhYm9ydCBhbiBvdXRnb2luZwotCQkJICogY29ubmVjdGlvbiBhdHRlbXB0IHRoYXQncyB1c2luZyBkaXJlY3RlZAotCQkJICogYWR2ZXJ0aXNpbmcuCi0JCQkgKi8KLQkJCWlmIChoY2lfY29ubl9oYXNoX2xvb2t1cF9zdGF0ZShoZGV2LCBMRV9MSU5LLAotCQkJCQkJICAgICAgIEJUX0NPTk5FQ1QpKSB7Ci0JCQkJKnN0YXR1cyA9IE1HTVRfU1RBVFVTX1JFSkVDVEVEOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJZGlzYWJsZV9hZHZlcnRpc2luZyhyZXEpOwotCQl9Ci0KLQkJLyogSWYgY29udHJvbGxlciBpcyBzY2FubmluZywgaXQgbWVhbnMgdGhlIGJhY2tncm91bmQgc2Nhbm5pbmcKLQkJICogaXMgcnVubmluZy4gVGh1cywgd2Ugc2hvdWxkIHRlbXBvcmFyaWx5IHN0b3AgaXQgaW4gb3JkZXIgdG8KLQkJICogc2V0IHRoZSBkaXNjb3Zlcnkgc2Nhbm5pbmcgcGFyYW1ldGVycy4KLQkJICovCi0JCWlmICh0ZXN0X2JpdChIQ0lfTEVfU0NBTiwgJmhkZXYtPmRldl9mbGFncykpCi0JCQloY2lfcmVxX2FkZF9sZV9zY2FuX2Rpc2FibGUocmVxKTsKLQotCQltZW1zZXQoJnBhcmFtX2NwLCAwLCBzaXplb2YocGFyYW1fY3ApKTsKLQotCQkvKiBBbGwgYWN0aXZlIHNjYW5zIHdpbGwgYmUgZG9uZSB3aXRoIGVpdGhlciBhIHJlc29sdmFibGUKLQkJICogcHJpdmF0ZSBhZGRyZXNzICh3aGVuIHByaXZhY3kgZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkKQotCQkgKiBvciBub24tcmVzb2x2YWJsZSBwcml2YXRlIGFkZHJlc3MuCi0JCSAqLwotCQllcnIgPSBoY2lfdXBkYXRlX3JhbmRvbV9hZGRyZXNzKHJlcSwgdHJ1ZSwgJm93bl9hZGRyX3R5cGUpOwotCQlpZiAoZXJyIDwgMCkgewotCQkJKnN0YXR1cyA9IE1HTVRfU1RBVFVTX0ZBSUxFRDsKKwljYXNlIERJU0NPVl9UWVBFX0xFOgorCQlpZiAoIXRyaWdnZXJfbGVfc2NhbihyZXEsIERJU0NPVl9MRV9TQ0FOX0lOVCwgc3RhdHVzKSkKIAkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXBhcmFtX2NwLnR5cGUgPSBMRV9TQ0FOX0FDVElWRTsKLQkJcGFyYW1fY3AuaW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihESVNDT1ZfTEVfU0NBTl9JTlQpOwotCQlwYXJhbV9jcC53aW5kb3cgPSBjcHVfdG9fbGUxNihESVNDT1ZfTEVfU0NBTl9XSU4pOwotCQlwYXJhbV9jcC5vd25fYWRkcmVzc190eXBlID0gb3duX2FkZHJfdHlwZTsKLQkJaGNpX3JlcV9hZGQocmVxLCBIQ0lfT1BfTEVfU0VUX1NDQU5fUEFSQU0sIHNpemVvZihwYXJhbV9jcCksCi0JCQkgICAgJnBhcmFtX2NwKTsKLQotCQltZW1zZXQoJmVuYWJsZV9jcCwgMCwgc2l6ZW9mKGVuYWJsZV9jcCkpOwotCQllbmFibGVfY3AuZW5hYmxlID0gTEVfU0NBTl9FTkFCTEU7Ci0JCWVuYWJsZV9jcC5maWx0ZXJfZHVwID0gTEVfU0NBTl9GSUxURVJfRFVQX0VOQUJMRTsKLQkJaGNpX3JlcV9hZGQocmVxLCBIQ0lfT1BfTEVfU0VUX1NDQU5fRU5BQkxFLCBzaXplb2YoZW5hYmxlX2NwKSwKLQkJCSAgICAmZW5hYmxlX2NwKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMzg3MywxNiArNDE3NSwxNiBAQAogc3RhdGljIHZvaWQgc3RhcnRfZGlzY292ZXJ5X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMsCiAJCQkJICAgICB1MTYgb3Bjb2RlKQogewotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCiAJQlRfREJHKCJzdGF0dXMgJWQiLCBzdGF0dXMpOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksIGhkZXYpOworCWNtZCA9IHBlbmRpbmdfZmluZChNR01UX09QX1NUQVJUX0RJU0NPVkVSWSwgaGRldik7CiAJaWYgKCFjbWQpCi0JCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU1RBUlRfU0VSVklDRV9ESVNDT1ZFUlksIGhkZXYpOworCQljbWQgPSBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TVEFSVF9TRVJWSUNFX0RJU0NPVkVSWSwgaGRldik7CiAKIAlpZiAoY21kKSB7CiAJCWNtZC0+Y21kX2NvbXBsZXRlKGNtZCwgbWdtdF9zdGF0dXMoc3RhdHVzKSk7CkBAIC0zOTA0LDcgKzQyMDYsMTggQEAKIAkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoRElTQ09WX0xFX1RJTUVPVVQpOwogCQlicmVhazsKIAljYXNlIERJU0NPVl9UWVBFX0lOVEVSTEVBVkVEOgotCQl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyhoZGV2LT5kaXNjb3ZfaW50ZXJsZWF2ZWRfdGltZW91dCk7CisJCSAvKiBXaGVuIHJ1bm5pbmcgc2ltdWx0YW5lb3VzIGRpc2NvdmVyeSwgdGhlIExFIHNjYW5uaW5nIHRpbWUKKwkJICogc2hvdWxkIG9jY3VweSB0aGUgd2hvbGUgZGlzY292ZXJ5IHRpbWUgc2luZSBCUi9FRFIgaW5xdWlyeQorCQkgKiBhbmQgTEUgc2Nhbm5pbmcgYXJlIHNjaGVkdWxlZCBieSB0aGUgY29udHJvbGxlci4KKwkJICoKKwkJICogRm9yIGludGVybGVhdmluZyBkaXNjb3ZlcnkgaW4gY29tcGFyaXNvbiwgQlIvRURSIGlucXVpcnkKKwkJICogYW5kIExFIHNjYW5uaW5nIGFyZSBkb25lIHNlcXVlbnRpYWxseSB3aXRoIHNlcGFyYXRlCisJCSAqIHRpbWVvdXRzLgorCQkgKi8KKwkJaWYgKHRlc3RfYml0KEhDSV9RVUlSS19TSU1VTFRBTkVPVVNfRElTQ09WRVJZLCAmaGRldi0+cXVpcmtzKSkKKwkJCXRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKERJU0NPVl9MRV9USU1FT1VUKTsKKwkJZWxzZQorCQkJdGltZW91dCA9IG1zZWNzX3RvX2ppZmZpZXMoaGRldi0+ZGlzY292X2ludGVybGVhdmVkX3RpbWVvdXQpOwogCQlicmVhazsKIAljYXNlIERJU0NPVl9UWVBFX0JSRURSOgogCQl0aW1lb3V0ID0gMDsKQEAgLTM5MjMsOCArNDIzNiw3IEBACiAJCSAqLwogCQlpZiAodGVzdF9iaXQoSENJX1FVSVJLX1NUUklDVF9EVVBMSUNBVEVfRklMVEVSLAogCQkJICAgICAmaGRldi0+cXVpcmtzKSAmJgotCQkgICAgKGhkZXYtPmRpc2NvdmVyeS51dWlkX2NvdW50ID4gMCB8fAotCQkgICAgIGhkZXYtPmRpc2NvdmVyeS5yc3NpICE9IEhDSV9SU1NJX0lOVkFMSUQpKSB7CisJCSAgICBoZGV2LT5kaXNjb3ZlcnkucmVzdWx0X2ZpbHRlcmluZykgewogCQkJaGRldi0+ZGlzY292ZXJ5LnNjYW5fc3RhcnQgPSBqaWZmaWVzOwogCQkJaGRldi0+ZGlzY292ZXJ5LnNjYW5fZHVyYXRpb24gPSB0aW1lb3V0OwogCQl9CkBAIC0zOTQxLDcgKzQyNTMsNyBAQAogCQkJICAgdm9pZCAqZGF0YSwgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgbWdtdF9jcF9zdGFydF9kaXNjb3ZlcnkgKmNwID0gZGF0YTsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJdTggc3RhdHVzOwogCWludCBlcnI7CkBAIC0zOTUxLDE3ICs0MjYzLDE3IEBACiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksCi0JCQkJICAgTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQsCi0JCQkJICAgJmNwLT50eXBlLCBzaXplb2YoY3AtPnR5cGUpKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NUQVJUX0RJU0NPVkVSWSwKKwkJCQkJTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQsCisJCQkJCSZjcC0+dHlwZSwgc2l6ZW9mKGNwLT50eXBlKSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAogCWlmIChoZGV2LT5kaXNjb3Zlcnkuc3RhdGUgIT0gRElTQ09WRVJZX1NUT1BQRUQgfHwKLQkgICAgdGVzdF9iaXQoSENJX1BFUklPRElDX0lOUSwgJmhkZXYtPmRldl9mbGFncykpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksCi0JCQkJICAgTUdNVF9TVEFUVVNfQlVTWSwgJmNwLT50eXBlLAotCQkJCSAgIHNpemVvZihjcC0+dHlwZSkpOworCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfUEVSSU9ESUNfSU5RKSkgeworCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfU1RBUlRfRElTQ09WRVJZLAorCQkJCQlNR01UX1NUQVRVU19CVVNZLCAmY3AtPnR5cGUsCisJCQkJCXNpemVvZihjcC0+dHlwZSkpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTM5ODQsOCArNDI5Niw4IEBACiAJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOwogCiAJaWYgKCF0cmlnZ2VyX2Rpc2NvdmVyeSgmcmVxLCAmc3RhdHVzKSkgewotCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NUQVJUX0RJU0NPVkVSWSwKLQkJCQkgICBzdGF0dXMsICZjcC0+dHlwZSwgc2l6ZW9mKGNwLT50eXBlKSk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksCisJCQkJCXN0YXR1cywgJmNwLT50eXBlLCBzaXplb2YoY3AtPnR5cGUpKTsKIAkJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwogCQlnb3RvIGZhaWxlZDsKIAl9CkBAIC00MDAzLDE3ICs0MzE1LDE4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBzZXJ2aWNlX2Rpc2NvdmVyeV9jbWRfY29tcGxldGUoc3RydWN0IHBlbmRpbmdfY21kICpjbWQsIHU4IHN0YXR1cykKK3N0YXRpYyBpbnQgc2VydmljZV9kaXNjb3ZlcnlfY21kX2NvbXBsZXRlKHN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQsCisJCQkJCSAgdTggc3RhdHVzKQogewotCXJldHVybiBjbWRfY29tcGxldGUoY21kLT5zaywgY21kLT5pbmRleCwgY21kLT5vcGNvZGUsIHN0YXR1cywKLQkJCSAgICBjbWQtPnBhcmFtLCAxKTsKKwlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoY21kLT5zaywgY21kLT5pbmRleCwgY21kLT5vcGNvZGUsIHN0YXR1cywKKwkJCQkgY21kLT5wYXJhbSwgMSk7CiB9CiAKIHN0YXRpYyBpbnQgc3RhcnRfc2VydmljZV9kaXNjb3Zlcnkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwKIAkJCQkgICB2b2lkICpkYXRhLCB1MTYgbGVuKQogewogCXN0cnVjdCBtZ210X2NwX3N0YXJ0X3NlcnZpY2VfZGlzY292ZXJ5ICpjcCA9IGRhdGE7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAlzdHJ1Y3QgaGNpX3JlcXVlc3QgcmVxOwogCWNvbnN0IHUxNiBtYXhfdXVpZF9jb3VudCA9ICgoVTE2X01BWCAtIHNpemVvZigqY3ApKSAvIDE2KTsKIAl1MTYgdXVpZF9jb3VudCwgZXhwZWN0ZWRfbGVuOwpAQCAtNDAyNSwxOSArNDMzOCwxOSBAQAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWlmICghaGRldl9pc19wb3dlcmVkKGhkZXYpKSB7Ci0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsCi0JCQkJICAgTUdNVF9PUF9TVEFSVF9TRVJWSUNFX0RJU0NPVkVSWSwKLQkJCQkgICBNR01UX1NUQVRVU19OT1RfUE9XRVJFRCwKLQkJCQkgICAmY3AtPnR5cGUsIHNpemVvZihjcC0+dHlwZSkpOworCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsCisJCQkJCU1HTVRfT1BfU1RBUlRfU0VSVklDRV9ESVNDT1ZFUlksCisJCQkJCU1HTVRfU1RBVFVTX05PVF9QT1dFUkVELAorCQkJCQkmY3AtPnR5cGUsIHNpemVvZihjcC0+dHlwZSkpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAlpZiAoaGRldi0+ZGlzY292ZXJ5LnN0YXRlICE9IERJU0NPVkVSWV9TVE9QUEVEIHx8Ci0JICAgIHRlc3RfYml0KEhDSV9QRVJJT0RJQ19JTlEsICZoZGV2LT5kZXZfZmxhZ3MpKSB7Ci0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsCi0JCQkJICAgTUdNVF9PUF9TVEFSVF9TRVJWSUNFX0RJU0NPVkVSWSwKLQkJCQkgICBNR01UX1NUQVRVU19CVVNZLCAmY3AtPnR5cGUsCi0JCQkJICAgc2l6ZW9mKGNwLT50eXBlKSk7CisJICAgIGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9QRVJJT0RJQ19JTlEpKSB7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwKKwkJCQkJTUdNVF9PUF9TVEFSVF9TRVJWSUNFX0RJU0NPVkVSWSwKKwkJCQkJTUdNVF9TVEFUVVNfQlVTWSwgJmNwLT50eXBlLAorCQkJCQlzaXplb2YoY3AtPnR5cGUpKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC00MDQ1LDEwICs0MzU4LDEwIEBACiAJaWYgKHV1aWRfY291bnQgPiBtYXhfdXVpZF9jb3VudCkgewogCQlCVF9FUlIoInNlcnZpY2VfZGlzY292ZXJ5OiB0b28gYmlnIHV1aWRfY291bnQgdmFsdWUgJXUiLAogCQkgICAgICAgdXVpZF9jb3VudCk7Ci0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsCi0JCQkJICAgTUdNVF9PUF9TVEFSVF9TRVJWSUNFX0RJU0NPVkVSWSwKLQkJCQkgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywgJmNwLT50eXBlLAotCQkJCSAgIHNpemVvZihjcC0+dHlwZSkpOworCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsCisJCQkJCU1HTVRfT1BfU1RBUlRfU0VSVklDRV9ESVNDT1ZFUlksCisJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLCAmY3AtPnR5cGUsCisJCQkJCXNpemVvZihjcC0+dHlwZSkpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKQEAgLTQwNTYsMTAgKzQzNjksMTAgQEAKIAlpZiAoZXhwZWN0ZWRfbGVuICE9IGxlbikgewogCQlCVF9FUlIoInNlcnZpY2VfZGlzY292ZXJ5OiBleHBlY3RlZCAldSBieXRlcywgZ290ICV1IGJ5dGVzIiwKIAkJICAgICAgIGV4cGVjdGVkX2xlbiwgbGVuKTsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwKLQkJCQkgICBNR01UX09QX1NUQVJUX1NFUlZJQ0VfRElTQ09WRVJZLAotCQkJCSAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLCAmY3AtPnR5cGUsCi0JCQkJICAgc2l6ZW9mKGNwLT50eXBlKSk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwKKwkJCQkJTUdNVF9PUF9TVEFSVF9TRVJWSUNFX0RJU0NPVkVSWSwKKwkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsICZjcC0+dHlwZSwKKwkJCQkJc2l6ZW9mKGNwLT50eXBlKSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNDA3Nyw2ICs0MzkwLDcgQEAKIAkgKi8KIAloY2lfZGlzY292ZXJ5X2ZpbHRlcl9jbGVhcihoZGV2KTsKIAorCWhkZXYtPmRpc2NvdmVyeS5yZXN1bHRfZmlsdGVyaW5nID0gdHJ1ZTsKIAloZGV2LT5kaXNjb3ZlcnkudHlwZSA9IGNwLT50eXBlOwogCWhkZXYtPmRpc2NvdmVyeS5yc3NpID0gY3AtPnJzc2k7CiAJaGRldi0+ZGlzY292ZXJ5LnV1aWRfY291bnQgPSB1dWlkX2NvdW50OwpAQCAtNDA4NSwxMCArNDM5OSwxMCBAQAogCQloZGV2LT5kaXNjb3ZlcnkudXVpZHMgPSBrbWVtZHVwKGNwLT51dWlkcywgdXVpZF9jb3VudCAqIDE2LAogCQkJCQkJR0ZQX0tFUk5FTCk7CiAJCWlmICghaGRldi0+ZGlzY292ZXJ5LnV1aWRzKSB7Ci0JCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLAotCQkJCQkgICBNR01UX09QX1NUQVJUX1NFUlZJQ0VfRElTQ09WRVJZLAotCQkJCQkgICBNR01UX1NUQVRVU19GQUlMRUQsCi0JCQkJCSAgICZjcC0+dHlwZSwgc2l6ZW9mKGNwLT50eXBlKSk7CisJCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsCisJCQkJCQlNR01UX09QX1NUQVJUX1NFUlZJQ0VfRElTQ09WRVJZLAorCQkJCQkJTUdNVF9TVEFUVVNfRkFJTEVELAorCQkJCQkJJmNwLT50eXBlLCBzaXplb2YoY3AtPnR5cGUpKTsKIAkJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIAkJCWdvdG8gZmFpbGVkOwogCQl9CkBAIC00MDk3LDkgKzQ0MTEsOSBAQAogCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKIAogCWlmICghdHJpZ2dlcl9kaXNjb3ZlcnkoJnJlcSwgJnN0YXR1cykpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwKLQkJCQkgICBNR01UX09QX1NUQVJUX1NFUlZJQ0VfRElTQ09WRVJZLAotCQkJCSAgIHN0YXR1cywgJmNwLT50eXBlLCBzaXplb2YoY3AtPnR5cGUpKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLAorCQkJCQlNR01UX09QX1NUQVJUX1NFUlZJQ0VfRElTQ09WRVJZLAorCQkJCQlzdGF0dXMsICZjcC0+dHlwZSwgc2l6ZW9mKGNwLT50eXBlKSk7CiAJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIAkJZ290byBmYWlsZWQ7CiAJfQpAQCAtNDExOSwxMyArNDQzMywxMyBAQAogCiBzdGF0aWMgdm9pZCBzdG9wX2Rpc2NvdmVyeV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzLCB1MTYgb3Bjb2RlKQogewotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAKIAlCVF9EQkcoInN0YXR1cyAlZCIsIHN0YXR1cyk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NUT1BfRElTQ09WRVJZLCBoZGV2KTsKKwljbWQgPSBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TVE9QX0RJU0NPVkVSWSwgaGRldik7CiAJaWYgKGNtZCkgewogCQljbWQtPmNtZF9jb21wbGV0ZShjbWQsIG1nbXRfc3RhdHVzKHN0YXR1cykpOwogCQltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CkBAIC00MTQxLDcgKzQ0NTUsNyBAQAogCQkJICB1MTYgbGVuKQogewogCXN0cnVjdCBtZ210X2NwX3N0b3BfZGlzY292ZXJ5ICptZ210X2NwID0gZGF0YTsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJaW50IGVycjsKIApAQCAtNDE1MCwxNiArNDQ2NCwxNiBAQAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWlmICghaGNpX2Rpc2NvdmVyeV9hY3RpdmUoaGRldikpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TVE9QX0RJU0NPVkVSWSwKLQkJCQkgICBNR01UX1NUQVRVU19SRUpFQ1RFRCwgJm1nbXRfY3AtPnR5cGUsCi0JCQkJICAgc2l6ZW9mKG1nbXRfY3AtPnR5cGUpKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NUT1BfRElTQ09WRVJZLAorCQkJCQlNR01UX1NUQVRVU19SRUpFQ1RFRCwgJm1nbXRfY3AtPnR5cGUsCisJCQkJCXNpemVvZihtZ210X2NwLT50eXBlKSk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIAogCWlmIChoZGV2LT5kaXNjb3ZlcnkudHlwZSAhPSBtZ210X2NwLT50eXBlKSB7Ci0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfU1RPUF9ESVNDT1ZFUlksCi0JCQkJICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsICZtZ210X2NwLT50eXBlLAotCQkJCSAgIHNpemVvZihtZ210X2NwLT50eXBlKSk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TVE9QX0RJU0NPVkVSWSwKKwkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCisJCQkJCSZtZ210X2NwLT50eXBlLCBzaXplb2YobWdtdF9jcC0+dHlwZSkpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTQxODUsOCArNDQ5OSw4IEBACiAKIAkvKiBJZiBubyBIQ0kgY29tbWFuZHMgd2VyZSBzZW50IHdlJ3JlIGRvbmUgKi8KIAlpZiAoZXJyID09IC1FTk9EQVRBKSB7Ci0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfU1RPUF9ESVNDT1ZFUlksIDAsCi0JCQkJICAgJm1nbXRfY3AtPnR5cGUsIHNpemVvZihtZ210X2NwLT50eXBlKSk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TVE9QX0RJU0NPVkVSWSwgMCwKKwkJCQkJJm1nbXRfY3AtPnR5cGUsIHNpemVvZihtZ210X2NwLT50eXBlKSk7CiAJCWhjaV9kaXNjb3Zlcnlfc2V0X3N0YXRlKGhkZXYsIERJU0NPVkVSWV9TVE9QUEVEKTsKIAl9CiAKQEAgLTQyMDcsMTcgKzQ1MjEsMTcgQEAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAlpZiAoIWhjaV9kaXNjb3ZlcnlfYWN0aXZlKGhkZXYpKSB7Ci0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfQ09ORklSTV9OQU1FLAotCQkJCSAgIE1HTVRfU1RBVFVTX0ZBSUxFRCwgJmNwLT5hZGRyLAotCQkJCSAgIHNpemVvZihjcC0+YWRkcikpOworCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfQ09ORklSTV9OQU1FLAorCQkJCQlNR01UX1NUQVRVU19GQUlMRUQsICZjcC0+YWRkciwKKwkJCQkJc2l6ZW9mKGNwLT5hZGRyKSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIAogCWUgPSBoY2lfaW5xdWlyeV9jYWNoZV9sb29rdXBfdW5rbm93bihoZGV2LCAmY3AtPmFkZHIuYmRhZGRyKTsKIAlpZiAoIWUpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9DT05GSVJNX05BTUUsCi0JCQkJICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsICZjcC0+YWRkciwKLQkJCQkgICBzaXplb2YoY3AtPmFkZHIpKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0NPTkZJUk1fTkFNRSwKKwkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsICZjcC0+YWRkciwKKwkJCQkJc2l6ZW9mKGNwLT5hZGRyKSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtNDIyOSw4ICs0NTQzLDggQEAKIAkJaGNpX2lucXVpcnlfY2FjaGVfdXBkYXRlX3Jlc29sdmUoaGRldiwgZSk7CiAJfQogCi0JZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9DT05GSVJNX05BTUUsIDAsICZjcC0+YWRkciwKLQkJCSAgIHNpemVvZihjcC0+YWRkcikpOworCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9DT05GSVJNX05BTUUsIDAsCisJCQkJJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKIAogZmFpbGVkOgogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwpAQCAtNDI0Nyw5ICs0NTYxLDkgQEAKIAlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CiAKIAlpZiAoIWJkYWRkcl90eXBlX2lzX3ZhbGlkKGNwLT5hZGRyLnR5cGUpKQotCQlyZXR1cm4gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9CTE9DS19ERVZJQ0UsCi0JCQkJICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAotCQkJCSAgICAmY3AtPmFkZHIsIHNpemVvZihjcC0+YWRkcikpOworCQlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0JMT0NLX0RFVklDRSwKKwkJCQkJIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAorCQkJCQkgJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIApAQCAtNDI2NSw4ICs0NTc5LDggQEAKIAlzdGF0dXMgPSBNR01UX1NUQVRVU19TVUNDRVNTOwogCiBkb25lOgotCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfQkxPQ0tfREVWSUNFLCBzdGF0dXMsCi0JCQkgICAmY3AtPmFkZHIsIHNpemVvZihjcC0+YWRkcikpOworCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9CTE9DS19ERVZJQ0UsIHN0YXR1cywKKwkJCQkmY3AtPmFkZHIsIHNpemVvZihjcC0+YWRkcikpOwogCiAJaGNpX2Rldl91bmxvY2soaGRldik7CiAKQEAgLTQyODMsOSArNDU5Nyw5IEBACiAJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOwogCiAJaWYgKCFiZGFkZHJfdHlwZV9pc192YWxpZChjcC0+YWRkci50eXBlKSkKLQkJcmV0dXJuIGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfVU5CTE9DS19ERVZJQ0UsCi0JCQkJICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAotCQkJCSAgICAmY3AtPmFkZHIsIHNpemVvZihjcC0+YWRkcikpOworCQlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1VOQkxPQ0tfREVWSUNFLAorCQkJCQkgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCisJCQkJCSAmY3AtPmFkZHIsIHNpemVvZihjcC0+YWRkcikpOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCkBAIC00MzAxLDggKzQ2MTUsOCBAQAogCXN0YXR1cyA9IE1HTVRfU1RBVFVTX1NVQ0NFU1M7CiAKIGRvbmU6Ci0JZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9VTkJMT0NLX0RFVklDRSwgc3RhdHVzLAotCQkJICAgJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKKwllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfVU5CTE9DS19ERVZJQ0UsIHN0YXR1cywKKwkJCQkmY3AtPmFkZHIsIHNpemVvZihjcC0+YWRkcikpOwogCiAJaGNpX2Rldl91bmxvY2soaGRldik7CiAKQEAgLTQzMjIsOCArNDYzNiw4IEBACiAJc291cmNlID0gX19sZTE2X3RvX2NwdShjcC0+c291cmNlKTsKIAogCWlmIChzb3VyY2UgPiAweDAwMDIpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfREVWSUNFX0lELAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfREVWSUNFX0lELAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKQEAgLTQzMzIsNyArNDY0Niw4IEBACiAJaGRldi0+ZGV2aWRfcHJvZHVjdCA9IF9fbGUxNl90b19jcHUoY3AtPnByb2R1Y3QpOwogCWhkZXYtPmRldmlkX3ZlcnNpb24gPSBfX2xlMTZfdG9fY3B1KGNwLT52ZXJzaW9uKTsKIAotCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0RFVklDRV9JRCwgMCwgTlVMTCwgMCk7CisJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9ERVZJQ0VfSUQsIDAsCisJCQkJTlVMTCwgMCk7CiAKIAloY2lfcmVxX2luaXQoJnJlcSwgaGRldik7CiAJdXBkYXRlX2VpcigmcmVxKTsKQEAgLTQzNDMsMTAgKzQ2NTgsMTcgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgdm9pZCBlbmFibGVfYWR2ZXJ0aXNpbmdfaW5zdGFuY2Uoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHN0YXR1cywKKwkJCQkJdTE2IG9wY29kZSkKK3sKKwlCVF9EQkcoInN0YXR1cyAlZCIsIHN0YXR1cyk7Cit9CisKIHN0YXRpYyB2b2lkIHNldF9hZHZlcnRpc2luZ19jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzLAogCQkJCSAgICAgdTE2IG9wY29kZSkKIHsKIAlzdHJ1Y3QgY21kX2xvb2t1cCBtYXRjaCA9IHsgTlVMTCwgaGRldiB9OworCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKQEAgLTQzNTgsMTAgKzQ2ODAsMTAgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JaWYgKHRlc3RfYml0KEhDSV9MRV9BRFYsICZoZGV2LT5kZXZfZmxhZ3MpKQotCQlzZXRfYml0KEhDSV9BRFZFUlRJU0lORywgJmhkZXYtPmRldl9mbGFncyk7CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9BRFYpKQorCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lORyk7CiAJZWxzZQotCQljbGVhcl9iaXQoSENJX0FEVkVSVElTSU5HLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lORyk7CiAKIAltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX1NFVF9BRFZFUlRJU0lORywgaGRldiwgc2V0dGluZ3NfcnNwLAogCQkJICAgICAmbWF0Y2gpOwpAQCAtNDM3MSw2ICs0NjkzLDIxIEBACiAJaWYgKG1hdGNoLnNrKQogCQlzb2NrX3B1dChtYXRjaC5zayk7CiAKKwkvKiBJZiAiU2V0IEFkdmVydGlzaW5nIiB3YXMganVzdCBkaXNhYmxlZCBhbmQgaW5zdGFuY2UgYWR2ZXJ0aXNpbmcgd2FzCisJICogc2V0IHVwIGVhcmxpZXIsIHRoZW4gZW5hYmxlIHRoZSBhZHZlcnRpc2luZyBpbnN0YW5jZS4KKwkgKi8KKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HKSB8fAorCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HX0lOU1RBTkNFKSkKKwkJZ290byB1bmxvY2s7CisKKwloY2lfcmVxX2luaXQoJnJlcSwgaGRldik7CisKKwl1cGRhdGVfYWR2X2RhdGEoJnJlcSk7CisJZW5hYmxlX2FkdmVydGlzaW5nKCZyZXEpOworCisJaWYgKGhjaV9yZXFfcnVuKCZyZXEsIGVuYWJsZV9hZHZlcnRpc2luZ19pbnN0YW5jZSkgPCAwKQorCQlCVF9FUlIoIkZhaWxlZCB0byByZS1jb25maWd1cmUgYWR2ZXJ0aXNpbmciKTsKKwogdW5sb2NrOgogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQpAQCAtNDM3OSw0MSArNDcxNiw0OCBAQAogCQkJICAgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgbWdtdF9tb2RlICpjcCA9IGRhdGE7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAlzdHJ1Y3QgaGNpX3JlcXVlc3QgcmVxOwotCXU4IHZhbCwgZW5hYmxlZCwgc3RhdHVzOworCXU4IHZhbCwgc3RhdHVzOwogCWludCBlcnI7CiAKIAlCVF9EQkcoInJlcXVlc3QgZm9yICVzIiwgaGRldi0+bmFtZSk7CiAKIAlzdGF0dXMgPSBtZ210X2xlX3N1cHBvcnQoaGRldik7CiAJaWYgKHN0YXR1cykKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9BRFZFUlRJU0lORywKLQkJCQkgIHN0YXR1cyk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9BRFZFUlRJU0lORywKKwkJCQkgICAgICAgc3RhdHVzKTsKIAotCWlmIChjcC0+dmFsICE9IDB4MDAgJiYgY3AtPnZhbCAhPSAweDAxKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0FEVkVSVElTSU5HLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCWlmIChjcC0+dmFsICE9IDB4MDAgJiYgY3AtPnZhbCAhPSAweDAxICYmIGNwLT52YWwgIT0gMHgwMikKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0FEVkVSVElTSU5HLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAl2YWwgPSAhIWNwLT52YWw7Ci0JZW5hYmxlZCA9IHRlc3RfYml0KEhDSV9BRFZFUlRJU0lORywgJmhkZXYtPmRldl9mbGFncyk7CiAKIAkvKiBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG9uZXMgd2hpY2ggbWVhbiB0aGF0IHdlIHNob3VsZAogCSAqIG5vdCBkbyBhbnkgSENJIGNvbW11bmljYXRpb24gYnV0IGRpcmVjdGx5IHNlbmQgYSBtZ210CiAJICogcmVzcG9uc2UgdG8gdXNlciBzcGFjZSAoYWZ0ZXIgdG9nZ2xpbmcgdGhlIGZsYWcgaWYKIAkgKiBuZWNlc3NhcnkpLgogCSAqLwotCWlmICghaGRldl9pc19wb3dlcmVkKGhkZXYpIHx8IHZhbCA9PSBlbmFibGVkIHx8CisJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikgfHwKKwkgICAgKHZhbCA9PSBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkcpICYmCisJICAgICAoY3AtPnZhbCA9PSAweDAyKSA9PSBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkdfQ09OTkVDVEFCTEUpKSB8fAogCSAgICBoY2lfY29ubl9udW0oaGRldiwgTEVfTElOSykgPiAwIHx8Ci0JICAgICh0ZXN0X2JpdChIQ0lfTEVfU0NBTiwgJmhkZXYtPmRldl9mbGFncykgJiYKKwkgICAgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9TQ0FOKSAmJgogCSAgICAgaGRldi0+bGVfc2Nhbl90eXBlID09IExFX1NDQU5fQUNUSVZFKSkgewotCQlib29sIGNoYW5nZWQgPSBmYWxzZTsKKwkJYm9vbCBjaGFuZ2VkOwogCi0JCWlmICh2YWwgIT0gdGVzdF9iaXQoSENJX0FEVkVSVElTSU5HLCAmaGRldi0+ZGV2X2ZsYWdzKSkgewotCQkJY2hhbmdlX2JpdChIQ0lfQURWRVJUSVNJTkcsICZoZGV2LT5kZXZfZmxhZ3MpOwotCQkJY2hhbmdlZCA9IHRydWU7CisJCWlmIChjcC0+dmFsKSB7CisJCQljaGFuZ2VkID0gIWhjaV9kZXZfdGVzdF9hbmRfc2V0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HKTsKKwkJCWlmIChjcC0+dmFsID09IDB4MDIpCisJCQkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkdfQ09OTkVDVEFCTEUpOworCQkJZWxzZQorCQkJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkdfQ09OTkVDVEFCTEUpOworCQl9IGVsc2UgeworCQkJY2hhbmdlZCA9IGhjaV9kZXZfdGVzdF9hbmRfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkcpOworCQkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lOR19DT05ORUNUQUJMRSk7CiAJCX0KIAogCQllcnIgPSBzZW5kX3NldHRpbmdzX3JzcChzaywgTUdNVF9PUF9TRVRfQURWRVJUSVNJTkcsIGhkZXYpOwpAQCAtNDQyNiwxMCArNDc3MCwxMCBAQAogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfQURWRVJUSVNJTkcsIGhkZXYpIHx8Ci0JICAgIG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0xFLCBoZGV2KSkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfQURWRVJUSVNJTkcsCi0JCQkJIE1HTVRfU1RBVFVTX0JVU1kpOworCWlmIChwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfQURWRVJUSVNJTkcsIGhkZXYpIHx8CisJICAgIHBlbmRpbmdfZmluZChNR01UX09QX1NFVF9MRSwgaGRldikpIHsKKwkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfQURWRVJUSVNJTkcsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfQlVTWSk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIApAQCAtNDQ0MSwxMCArNDc4NSwxOSBAQAogCiAJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOwogCi0JaWYgKHZhbCkKLQkJZW5hYmxlX2FkdmVydGlzaW5nKCZyZXEpOworCWlmIChjcC0+dmFsID09IDB4MDIpCisJCWhjaV9kZXZfc2V0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HX0NPTk5FQ1RBQkxFKTsKIAllbHNlCisJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkdfQ09OTkVDVEFCTEUpOworCisJaWYgKHZhbCkgeworCQkvKiBTd2l0Y2ggdG8gaW5zdGFuY2UgIjAiIGZvciB0aGUgU2V0IEFkdmVydGlzaW5nIHNldHRpbmcuICovCisJCXVwZGF0ZV9hZHZfZGF0YV9mb3JfaW5zdGFuY2UoJnJlcSwgMCk7CisJCXVwZGF0ZV9zY2FuX3JzcF9kYXRhX2Zvcl9pbnN0YW5jZSgmcmVxLCAwKTsKKwkJZW5hYmxlX2FkdmVydGlzaW5nKCZyZXEpOworCX0gZWxzZSB7CiAJCWRpc2FibGVfYWR2ZXJ0aXNpbmcoJnJlcSk7CisJfQogCiAJZXJyID0gaGNpX3JlcV9ydW4oJnJlcSwgc2V0X2FkdmVydGlzaW5nX2NvbXBsZXRlKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTQ0NjQsMzQgKzQ4MTcsMzggQEAKIAlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CiAKIAlpZiAoIWxtcF9sZV9jYXBhYmxlKGhkZXYpKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1NUQVRJQ19BRERSRVNTLAotCQkJCSAgTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TVEFUSUNfQUREUkVTUywKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCk7CiAKIAlpZiAoaGRldl9pc19wb3dlcmVkKGhkZXYpKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1NUQVRJQ19BRERSRVNTLAotCQkJCSAgTUdNVF9TVEFUVVNfUkVKRUNURUQpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfU1RBVElDX0FERFJFU1MsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKIAogCWlmIChiYWNtcCgmY3AtPmJkYWRkciwgQkRBRERSX0FOWSkpIHsKIAkJaWYgKCFiYWNtcCgmY3AtPmJkYWRkciwgQkRBRERSX05PTkUpKQotCQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLAotCQkJCQkgIE1HTVRfT1BfU0VUX1NUQVRJQ19BRERSRVNTLAotCQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLAorCQkJCQkgICAgICAgTUdNVF9PUF9TRVRfU1RBVElDX0FERFJFU1MsCisJCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAkJLyogVHdvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBzaGFsbCBiZSBzZXQgKi8KIAkJaWYgKChjcC0+YmRhZGRyLmJbNV0gJiAweGMwKSAhPSAweGMwKQotCQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLAotCQkJCQkgIE1HTVRfT1BfU0VUX1NUQVRJQ19BRERSRVNTLAotCQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLAorCQkJCQkgICAgICAgTUdNVF9PUF9TRVRfU1RBVElDX0FERFJFU1MsCisJCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJfQogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJYmFjcHkoJmhkZXYtPnN0YXRpY19hZGRyLCAmY3AtPmJkYWRkcik7CiAKLQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TVEFUSUNfQUREUkVTUywgMCwgTlVMTCwgMCk7CisJZXJyID0gc2VuZF9zZXR0aW5nc19yc3Aoc2ssIE1HTVRfT1BfU0VUX1NUQVRJQ19BRERSRVNTLCBoZGV2KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB1bmxvY2s7CiAKKwllcnIgPSBuZXdfc2V0dGluZ3MoaGRldiwgc2spOworCit1bmxvY2s6CiAJaGNpX2Rldl91bmxvY2soaGRldik7Ci0KIAlyZXR1cm4gZXJyOwogfQogCkBAIC00NTA1LDM2ICs0ODYyLDM3IEBACiAJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOwogCiAJaWYgKCFsbXBfbGVfY2FwYWJsZShoZGV2KSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TQ0FOX1BBUkFNUywKLQkJCQkgIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfU0NBTl9QQVJBTVMsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOwogCiAJaW50ZXJ2YWwgPSBfX2xlMTZfdG9fY3B1KGNwLT5pbnRlcnZhbCk7CiAKIAlpZiAoaW50ZXJ2YWwgPCAweDAwMDQgfHwgaW50ZXJ2YWwgPiAweDQwMDApCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfU0NBTl9QQVJBTVMsCi0JCQkJICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TQ0FOX1BBUkFNUywKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJd2luZG93ID0gX19sZTE2X3RvX2NwdShjcC0+d2luZG93KTsKIAogCWlmICh3aW5kb3cgPCAweDAwMDQgfHwgd2luZG93ID4gMHg0MDAwKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1NDQU5fUEFSQU1TLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfU0NBTl9QQVJBTVMsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWlmICh3aW5kb3cgPiBpbnRlcnZhbCkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TQ0FOX1BBUkFNUywKLQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1NDQU5fUEFSQU1TLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAloZGV2LT5sZV9zY2FuX2ludGVydmFsID0gaW50ZXJ2YWw7CiAJaGRldi0+bGVfc2Nhbl93aW5kb3cgPSB3aW5kb3c7CiAKLQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TQ0FOX1BBUkFNUywgMCwgTlVMTCwgMCk7CisJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TQ0FOX1BBUkFNUywgMCwKKwkJCQlOVUxMLCAwKTsKIAogCS8qIElmIGJhY2tncm91bmQgc2NhbiBpcyBydW5uaW5nLCByZXN0YXJ0IGl0IHNvIG5ldyBwYXJhbWV0ZXJzIGFyZQogCSAqIGxvYWRlZC4KIAkgKi8KLQlpZiAodGVzdF9iaXQoSENJX0xFX1NDQU4sICZoZGV2LT5kZXZfZmxhZ3MpICYmCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9TQ0FOKSAmJgogCSAgICBoZGV2LT5kaXNjb3Zlcnkuc3RhdGUgPT0gRElTQ09WRVJZX1NUT1BQRUQpIHsKIAkJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKIApAQCAtNDU1NCwyNiArNDkxMiwyNiBAQAogc3RhdGljIHZvaWQgZmFzdF9jb25uZWN0YWJsZV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzLAogCQkJCSAgICAgIHUxNiBvcGNvZGUpCiB7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAogCUJUX0RCRygic3RhdHVzIDB4JTAyeCIsIHN0YXR1cyk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9GQVNUX0NPTk5FQ1RBQkxFLCBoZGV2KTsKKwljbWQgPSBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfRkFTVF9DT05ORUNUQUJMRSwgaGRldik7CiAJaWYgKCFjbWQpCiAJCWdvdG8gdW5sb2NrOwogCiAJaWYgKHN0YXR1cykgewotCQljbWRfc3RhdHVzKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9GQVNUX0NPTk5FQ1RBQkxFLAotCQkJICAgbWdtdF9zdGF0dXMoc3RhdHVzKSk7CisJCW1nbXRfY21kX3N0YXR1cyhjbWQtPnNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfRkFTVF9DT05ORUNUQUJMRSwKKwkJCSAgICAgICAgbWdtdF9zdGF0dXMoc3RhdHVzKSk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IG1nbXRfbW9kZSAqY3AgPSBjbWQtPnBhcmFtOwogCiAJCWlmIChjcC0+dmFsKQotCQkJc2V0X2JpdChIQ0lfRkFTVF9DT05ORUNUQUJMRSwgJmhkZXYtPmRldl9mbGFncyk7CisJCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9GQVNUX0NPTk5FQ1RBQkxFKTsKIAkJZWxzZQotCQkJY2xlYXJfYml0KEhDSV9GQVNUX0NPTk5FQ1RBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfRkFTVF9DT05ORUNUQUJMRSk7CiAKIAkJc2VuZF9zZXR0aW5nc19yc3AoY21kLT5zaywgTUdNVF9PUF9TRVRfRkFTVF9DT05ORUNUQUJMRSwgaGRldik7CiAJCW5ld19zZXR0aW5ncyhoZGV2LCBjbWQtPnNrKTsKQEAgLTQ1ODksNDMgKzQ5NDcsNDMgQEAKIAkJCQl2b2lkICpkYXRhLCB1MTYgbGVuKQogewogCXN0cnVjdCBtZ210X21vZGUgKmNwID0gZGF0YTsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJaW50IGVycjsKIAogCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKIAotCWlmICghdGVzdF9iaXQoSENJX0JSRURSX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpIHx8CisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCkgfHwKIAkgICAgaGRldi0+aGNpX3ZlciA8IEJMVUVUT09USF9WRVJfMV8yKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0ZBU1RfQ09OTkVDVEFCTEUsCi0JCQkJICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0ZBU1RfQ09OTkVDVEFCTEUsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOwogCiAJaWYgKGNwLT52YWwgIT0gMHgwMCAmJiBjcC0+dmFsICE9IDB4MDEpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfRkFTVF9DT05ORUNUQUJMRSwKLQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKLQotCWlmICghaGRldl9pc19wb3dlcmVkKGhkZXYpKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0ZBU1RfQ09OTkVDVEFCTEUsCi0JCQkJICBNR01UX1NUQVRVU19OT1RfUE9XRVJFRCk7Ci0KLQlpZiAoIXRlc3RfYml0KEhDSV9DT05ORUNUQUJMRSwgJmhkZXYtPmRldl9mbGFncykpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfRkFTVF9DT05ORUNUQUJMRSwKLQkJCQkgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0ZBU1RfQ09OTkVDVEFCTEUsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9GQVNUX0NPTk5FQ1RBQkxFLCBoZGV2KSkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfRkFTVF9DT05ORUNUQUJMRSwKLQkJCQkgTUdNVF9TVEFUVVNfQlVTWSk7CisJaWYgKHBlbmRpbmdfZmluZChNR01UX09QX1NFVF9GQVNUX0NPTk5FQ1RBQkxFLCBoZGV2KSkgeworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9GQVNUX0NPTk5FQ1RBQkxFLAorCQkJCSAgICAgIE1HTVRfU1RBVFVTX0JVU1kpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlpZiAoISFjcC0+dmFsID09IHRlc3RfYml0KEhDSV9GQVNUX0NPTk5FQ1RBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmICghIWNwLT52YWwgPT0gaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0ZBU1RfQ09OTkVDVEFCTEUpKSB7CiAJCWVyciA9IHNlbmRfc2V0dGluZ3NfcnNwKHNrLCBNR01UX09QX1NFVF9GQVNUX0NPTk5FQ1RBQkxFLAogCQkJCQloZGV2KTsKIAkJZ290byB1bmxvY2s7CiAJfQogCisJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikpIHsKKwkJaGNpX2Rldl9jaGFuZ2VfZmxhZyhoZGV2LCBIQ0lfRkFTVF9DT05ORUNUQUJMRSk7CisJCWVyciA9IHNlbmRfc2V0dGluZ3NfcnNwKHNrLCBNR01UX09QX1NFVF9GQVNUX0NPTk5FQ1RBQkxFLAorCQkJCQloZGV2KTsKKwkJbmV3X3NldHRpbmdzKGhkZXYsIHNrKTsKKwkJZ290byB1bmxvY2s7CisJfQorCiAJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9TRVRfRkFTVF9DT05ORUNUQUJMRSwgaGRldiwKIAkJCSAgICAgICBkYXRhLCBsZW4pOwogCWlmICghY21kKSB7CkBAIC00NjM5LDggKzQ5OTcsOCBAQAogCiAJZXJyID0gaGNpX3JlcV9ydW4oJnJlcSwgZmFzdF9jb25uZWN0YWJsZV9jb21wbGV0ZSk7CiAJaWYgKGVyciA8IDApIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0ZBU1RfQ09OTkVDVEFCTEUsCi0JCQkJIE1HTVRfU1RBVFVTX0ZBSUxFRCk7CisJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0ZBU1RfQ09OTkVDVEFCTEUsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfRkFJTEVEKTsKIAkJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwogCX0KIApAQCAtNDY1MiwxMyArNTAxMCwxMyBAQAogCiBzdGF0aWMgdm9pZCBzZXRfYnJlZHJfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHN0YXR1cywgdTE2IG9wY29kZSkKIHsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCiAJQlRfREJHKCJzdGF0dXMgMHglMDJ4Iiwgc3RhdHVzKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0JSRURSLCBoZGV2KTsKKwljbWQgPSBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfQlJFRFIsIGhkZXYpOwogCWlmICghY21kKQogCQlnb3RvIHVubG9jazsKIApAQCAtNDY2OCw5ICs1MDI2LDkgQEAKIAkJLyogV2UgbmVlZCB0byByZXN0b3JlIHRoZSBmbGFnIGlmIHJlbGF0ZWQgSENJIGNvbW1hbmRzCiAJCSAqIGZhaWxlZC4KIAkJICovCi0JCWNsZWFyX2JpdChIQ0lfQlJFRFJfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncyk7CisJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCk7CiAKLQkJY21kX3N0YXR1cyhjbWQtPnNrLCBjbWQtPmluZGV4LCBjbWQtPm9wY29kZSwgbWdtdF9lcnIpOworCQltZ210X2NtZF9zdGF0dXMoY21kLT5zaywgY21kLT5pbmRleCwgY21kLT5vcGNvZGUsIG1nbXRfZXJyKTsKIAl9IGVsc2UgewogCQlzZW5kX3NldHRpbmdzX3JzcChjbWQtPnNrLCBNR01UX09QX1NFVF9CUkVEUiwgaGRldik7CiAJCW5ld19zZXR0aW5ncyhoZGV2LCBjbWQtPnNrKTsKQEAgLTQ2ODUsNDEgKzUwNDMsNDEgQEAKIHN0YXRpYyBpbnQgc2V0X2JyZWRyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKmRhdGEsIHUxNiBsZW4pCiB7CiAJc3RydWN0IG1nbXRfbW9kZSAqY3AgPSBkYXRhOwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKIAlpbnQgZXJyOwogCiAJQlRfREJHKCJyZXF1ZXN0IGZvciAlcyIsIGhkZXYtPm5hbWUpOwogCiAJaWYgKCFsbXBfYnJlZHJfY2FwYWJsZShoZGV2KSB8fCAhbG1wX2xlX2NhcGFibGUoaGRldikpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfQlJFRFIsCi0JCQkJICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0JSRURSLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKIAotCWlmICghdGVzdF9iaXQoSENJX0xFX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0JSRURSLAotCQkJCSAgTUdNVF9TVEFUVVNfUkVKRUNURUQpOworCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0VOQUJMRUQpKQorCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfQlJFRFIsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKIAogCWlmIChjcC0+dmFsICE9IDB4MDAgJiYgY3AtPnZhbCAhPSAweDAxKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0JSRURSLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfQlJFRFIsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWlmIChjcC0+dmFsID09IHRlc3RfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmIChjcC0+dmFsID09IGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CUkVEUl9FTkFCTEVEKSkgewogCQllcnIgPSBzZW5kX3NldHRpbmdzX3JzcChzaywgTUdNVF9PUF9TRVRfQlJFRFIsIGhkZXYpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKIAlpZiAoIWhkZXZfaXNfcG93ZXJlZChoZGV2KSkgewogCQlpZiAoIWNwLT52YWwpIHsKLQkJCWNsZWFyX2JpdChIQ0lfRElTQ09WRVJBQkxFLCAmaGRldi0+ZGV2X2ZsYWdzKTsKLQkJCWNsZWFyX2JpdChIQ0lfU1NQX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpOwotCQkJY2xlYXJfYml0KEhDSV9MSU5LX1NFQ1VSSVRZLCAmaGRldi0+ZGV2X2ZsYWdzKTsKLQkJCWNsZWFyX2JpdChIQ0lfRkFTVF9DT05ORUNUQUJMRSwgJmhkZXYtPmRldl9mbGFncyk7Ci0JCQljbGVhcl9iaXQoSENJX0hTX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpOworCQkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9ESVNDT1ZFUkFCTEUpOworCQkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9TU1BfRU5BQkxFRCk7CisJCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX0xJTktfU0VDVVJJVFkpOworCQkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9GQVNUX0NPTk5FQ1RBQkxFKTsKKwkJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfSFNfRU5BQkxFRCk7CiAJCX0KIAotCQljaGFuZ2VfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9jaGFuZ2VfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCk7CiAKIAkJZXJyID0gc2VuZF9zZXR0aW5nc19yc3Aoc2ssIE1HTVRfT1BfU0VUX0JSRURSLCBoZGV2KTsKIAkJaWYgKGVyciA8IDApCkBAIC00NzMxLDggKzUwODksOCBAQAogCiAJLyogUmVqZWN0IGRpc2FibGluZyB3aGVuIHBvd2VyZWQgb24gKi8KIAlpZiAoIWNwLT52YWwpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0JSRURSLAotCQkJCSBNR01UX1NUQVRVU19SRUpFQ1RFRCk7CisJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0JSRURSLAorCQkJCSAgICAgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKIAkJZ290byB1bmxvY2s7CiAJfSBlbHNlIHsKIAkJLyogV2hlbiBjb25maWd1cmluZyBhIGR1YWwtbW9kZSBjb250cm9sbGVyIHRvIG9wZXJhdGUKQEAgLTQ3NDksMTggKzUxMDcsMTggQEAKIAkJICogc3dpdGNoaW5nIEJSL0VEUiBiYWNrIG9uIHdoZW4gc2VjdXJlIGNvbm5lY3Rpb25zIGhhcyBiZWVuCiAJCSAqIGVuYWJsZWQgaXMgbm90IGEgc3VwcG9ydGVkIHRyYW5zYWN0aW9uLgogCQkgKi8KLQkJaWYgKCF0ZXN0X2JpdChIQ0lfQlJFRFJfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykgJiYKKwkJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCkgJiYKIAkJICAgIChiYWNtcCgmaGRldi0+c3RhdGljX2FkZHIsIEJEQUREUl9BTlkpIHx8Ci0JCSAgICAgdGVzdF9iaXQoSENJX1NDX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKSkgewotCQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0JSRURSLAotCQkJCQkgTUdNVF9TVEFUVVNfUkVKRUNURUQpOworCQkgICAgIGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TQ19FTkFCTEVEKSkpIHsKKwkJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0JSRURSLAorCQkJCQkgICAgICBNR01UX1NUQVRVU19SRUpFQ1RFRCk7CiAJCQlnb3RvIHVubG9jazsKIAkJfQogCX0KIAotCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9CUkVEUiwgaGRldikpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0JSRURSLAotCQkJCSBNR01UX1NUQVRVU19CVVNZKTsKKwlpZiAocGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0JSRURSLCBoZGV2KSkgeworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9CUkVEUiwKKwkJCQkgICAgICBNR01UX1NUQVRVU19CVVNZKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCkBAIC00NzczLDcgKzUxMzEsNyBAQAogCS8qIFdlIG5lZWQgdG8gZmxpcCB0aGUgYml0IGFscmVhZHkgaGVyZSBzbyB0aGF0IHVwZGF0ZV9hZHZfZGF0YQogCSAqIGdlbmVyYXRlcyB0aGUgY29ycmVjdCBmbGFncy4KIAkgKi8KLQlzZXRfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9CUkVEUl9FTkFCTEVEKTsKIAogCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKIApAQCAtNDc5NiwyMCArNTE1NCwyMCBAQAogCiBzdGF0aWMgdm9pZCBzY19lbmFibGVfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHN0YXR1cywgdTE2IG9wY29kZSkKIHsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBtZ210X21vZGUgKmNwOwogCiAJQlRfREJHKCIlcyBzdGF0dXMgJXUiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfU0VDVVJFX0NPTk4sIGhkZXYpOworCWNtZCA9IHBlbmRpbmdfZmluZChNR01UX09QX1NFVF9TRUNVUkVfQ09OTiwgaGRldik7CiAJaWYgKCFjbWQpCiAJCWdvdG8gdW5sb2NrOwogCiAJaWYgKHN0YXR1cykgewotCQljbWRfc3RhdHVzKGNtZC0+c2ssIGNtZC0+aW5kZXgsIGNtZC0+b3Bjb2RlLAotCQkJICAgbWdtdF9zdGF0dXMoc3RhdHVzKSk7CisJCW1nbXRfY21kX3N0YXR1cyhjbWQtPnNrLCBjbWQtPmluZGV4LCBjbWQtPm9wY29kZSwKKwkJCSAgICAgICAgbWdtdF9zdGF0dXMoc3RhdHVzKSk7CiAJCWdvdG8gcmVtb3ZlOwogCX0KIApAQCAtNDgxNywxNiArNTE3NSwxNiBAQAogCiAJc3dpdGNoIChjcC0+dmFsKSB7CiAJY2FzZSAweDAwOgotCQljbGVhcl9iaXQoSENJX1NDX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpOwotCQljbGVhcl9iaXQoSENJX1NDX09OTFksICZoZGV2LT5kZXZfZmxhZ3MpOworCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX1NDX0VOQUJMRUQpOworCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX1NDX09OTFkpOwogCQlicmVhazsKIAljYXNlIDB4MDE6Ci0JCXNldF9iaXQoSENJX1NDX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpOwotCQljbGVhcl9iaXQoSENJX1NDX09OTFksICZoZGV2LT5kZXZfZmxhZ3MpOworCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9TQ19FTkFCTEVEKTsKKwkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9TQ19PTkxZKTsKIAkJYnJlYWs7CiAJY2FzZSAweDAyOgotCQlzZXRfYml0KEhDSV9TQ19FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKLQkJc2V0X2JpdChIQ0lfU0NfT05MWSwgJmhkZXYtPmRldl9mbGFncyk7CisJCWhjaV9kZXZfc2V0X2ZsYWcoaGRldiwgSENJX1NDX0VOQUJMRUQpOworCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9TQ19PTkxZKTsKIAkJYnJlYWs7CiAJfQogCkBAIC00ODQzLDcgKzUyMDEsNyBAQAogCQkJICAgdm9pZCAqZGF0YSwgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgbWdtdF9tb2RlICpjcCA9IGRhdGE7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAlzdHJ1Y3QgaGNpX3JlcXVlc3QgcmVxOwogCXU4IHZhbDsKIAlpbnQgZXJyOwpAQCAtNDg1MSwzNyArNTIwOSwzNyBAQAogCUJUX0RCRygicmVxdWVzdCBmb3IgJXMiLCBoZGV2LT5uYW1lKTsKIAogCWlmICghbG1wX3NjX2NhcGFibGUoaGRldikgJiYKLQkgICAgIXRlc3RfYml0KEhDSV9MRV9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TRUNVUkVfQ09OTiwKLQkJCQkgIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOworCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0VOQUJMRUQpKQorCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfU0VDVVJFX0NPTk4sCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9CUkVEUl9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQlJFRFJfRU5BQkxFRCkgJiYKIAkgICAgbG1wX3NjX2NhcGFibGUoaGRldikgJiYKLQkgICAgIXRlc3RfYml0KEhDSV9TU1BfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfU0VDVVJFX0NPTk4sCi0JCQkJICBNR01UX1NUQVRVU19SRUpFQ1RFRCk7CisJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU1NQX0VOQUJMRUQpKQorCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfU0VDVVJFX0NPTk4sCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKIAogCWlmIChjcC0+dmFsICE9IDB4MDAgJiYgY3AtPnZhbCAhPSAweDAxICYmIGNwLT52YWwgIT0gMHgwMikKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TRUNVUkVfQ09OTiwKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1NFQ1VSRV9DT05OLAogCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikgfHwgIWxtcF9zY19jYXBhYmxlKGhkZXYpIHx8Ci0JICAgICF0ZXN0X2JpdChIQ0lfQlJFRFJfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwkgICAgIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CUkVEUl9FTkFCTEVEKSkgewogCQlib29sIGNoYW5nZWQ7CiAKIAkJaWYgKGNwLT52YWwpIHsKLQkJCWNoYW5nZWQgPSAhdGVzdF9hbmRfc2V0X2JpdChIQ0lfU0NfRU5BQkxFRCwKLQkJCQkJCSAgICAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJCWNoYW5nZWQgPSAhaGNpX2Rldl90ZXN0X2FuZF9zZXRfZmxhZyhoZGV2LAorCQkJCQkJCSAgICAgSENJX1NDX0VOQUJMRUQpOwogCQkJaWYgKGNwLT52YWwgPT0gMHgwMikKLQkJCQlzZXRfYml0KEhDSV9TQ19PTkxZLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9TQ19PTkxZKTsKIAkJCWVsc2UKLQkJCQljbGVhcl9iaXQoSENJX1NDX09OTFksICZoZGV2LT5kZXZfZmxhZ3MpOworCQkJCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfU0NfT05MWSk7CiAJCX0gZWxzZSB7Ci0JCQljaGFuZ2VkID0gdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9TQ19FTkFCTEVELAotCQkJCQkJICAgICAmaGRldi0+ZGV2X2ZsYWdzKTsKLQkJCWNsZWFyX2JpdChIQ0lfU0NfT05MWSwgJmhkZXYtPmRldl9mbGFncyk7CisJCQljaGFuZ2VkID0gaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsCisJCQkJCQkJICAgICAgSENJX1NDX0VOQUJMRUQpOworCQkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9TQ19PTkxZKTsKIAkJfQogCiAJCWVyciA9IHNlbmRfc2V0dGluZ3NfcnNwKHNrLCBNR01UX09QX1NFVF9TRUNVUkVfQ09OTiwgaGRldik7CkBAIC00ODk0LDE2ICs1MjUyLDE2IEBACiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9TRUNVUkVfQ09OTiwgaGRldikpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1NFQ1VSRV9DT05OLAotCQkJCSBNR01UX1NUQVRVU19CVVNZKTsKKwlpZiAocGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX1NFQ1VSRV9DT05OLCBoZGV2KSkgeworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9TRUNVUkVfQ09OTiwKKwkJCQkgICAgICBNR01UX1NUQVRVU19CVVNZKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCiAJdmFsID0gISFjcC0+dmFsOwogCi0JaWYgKHZhbCA9PSB0ZXN0X2JpdChIQ0lfU0NfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykgJiYKLQkgICAgKGNwLT52YWwgPT0gMHgwMikgPT0gdGVzdF9iaXQoSENJX1NDX09OTFksICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKHZhbCA9PSBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU0NfRU5BQkxFRCkgJiYKKwkgICAgKGNwLT52YWwgPT0gMHgwMikgPT0gaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NDX09OTFkpKSB7CiAJCWVyciA9IHNlbmRfc2V0dGluZ3NfcnNwKHNrLCBNR01UX09QX1NFVF9TRUNVUkVfQ09OTiwgaGRldik7CiAJCWdvdG8gZmFpbGVkOwogCX0KQEAgLTQ5MzcsMjcgKzUyOTUsMjYgQEAKIAlCVF9EQkcoInJlcXVlc3QgZm9yICVzIiwgaGRldi0+bmFtZSk7CiAKIAlpZiAoY3AtPnZhbCAhPSAweDAwICYmIGNwLT52YWwgIT0gMHgwMSAmJiBjcC0+dmFsICE9IDB4MDIpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfREVCVUdfS0VZUywKLQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0RFQlVHX0tFWVMsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWlmIChjcC0+dmFsKQotCQljaGFuZ2VkID0gIXRlc3RfYW5kX3NldF9iaXQoSENJX0tFRVBfREVCVUdfS0VZUywKLQkJCQkJICAgICZoZGV2LT5kZXZfZmxhZ3MpOworCQljaGFuZ2VkID0gIWhjaV9kZXZfdGVzdF9hbmRfc2V0X2ZsYWcoaGRldiwgSENJX0tFRVBfREVCVUdfS0VZUyk7CiAJZWxzZQotCQljaGFuZ2VkID0gdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9LRUVQX0RFQlVHX0tFWVMsCi0JCQkJCSAgICAgJmhkZXYtPmRldl9mbGFncyk7CisJCWNoYW5nZWQgPSBoY2lfZGV2X3Rlc3RfYW5kX2NsZWFyX2ZsYWcoaGRldiwKKwkJCQkJCSAgICAgIEhDSV9LRUVQX0RFQlVHX0tFWVMpOwogCiAJaWYgKGNwLT52YWwgPT0gMHgwMikKLQkJdXNlX2NoYW5nZWQgPSAhdGVzdF9hbmRfc2V0X2JpdChIQ0lfVVNFX0RFQlVHX0tFWVMsCi0JCQkJCQkmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJdXNlX2NoYW5nZWQgPSAhaGNpX2Rldl90ZXN0X2FuZF9zZXRfZmxhZyhoZGV2LAorCQkJCQkJCSBIQ0lfVVNFX0RFQlVHX0tFWVMpOwogCWVsc2UKLQkJdXNlX2NoYW5nZWQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX1VTRV9ERUJVR19LRVlTLAotCQkJCQkJICZoZGV2LT5kZXZfZmxhZ3MpOworCQl1c2VfY2hhbmdlZCA9IGhjaV9kZXZfdGVzdF9hbmRfY2xlYXJfZmxhZyhoZGV2LAorCQkJCQkJCSAgSENJX1VTRV9ERUJVR19LRVlTKTsKIAogCWlmIChoZGV2X2lzX3Bvd2VyZWQoaGRldikgJiYgdXNlX2NoYW5nZWQgJiYKLQkgICAgdGVzdF9iaXQoSENJX1NTUF9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU1NQX0VOQUJMRUQpKSB7CiAJCXU4IG1vZGUgPSAoY3AtPnZhbCA9PSAweDAyKSA/IDB4MDEgOiAweDAwOwogCQloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1dSSVRFX1NTUF9ERUJVR19NT0RFLAogCQkJICAgICBzaXplb2YobW9kZSksICZtb2RlKTsKQEAgLTQ5ODUsMzIgKzUzNDIsMzIgQEAKIAlCVF9EQkcoInJlcXVlc3QgZm9yICVzIiwgaGRldi0+bmFtZSk7CiAKIAlpZiAoIWxtcF9sZV9jYXBhYmxlKGhkZXYpKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1BSSVZBQ1ksCi0JCQkJICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1BSSVZBQ1ksCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOwogCiAJaWYgKGNwLT5wcml2YWN5ICE9IDB4MDAgJiYgY3AtPnByaXZhY3kgIT0gMHgwMSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9QUklWQUNZLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfUFJJVkFDWSwKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJaWYgKGhkZXZfaXNfcG93ZXJlZChoZGV2KSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9QUklWQUNZLAotCQkJCSAgTUdNVF9TVEFUVVNfUkVKRUNURUQpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfUFJJVkFDWSwKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfUkVKRUNURUQpOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJLyogSWYgdXNlciBzcGFjZSBzdXBwb3J0cyB0aGlzIGNvbW1hbmQgaXQgaXMgYWxzbyBleHBlY3RlZCB0bwogCSAqIGhhbmRsZSBJUktzLiBUaGVyZWZvcmUsIHNldCB0aGUgSENJX1JQQV9SRVNPTFZJTkcgZmxhZy4KIAkgKi8KLQlzZXRfYml0KEhDSV9SUEFfUkVTT0xWSU5HLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9SUEFfUkVTT0xWSU5HKTsKIAogCWlmIChjcC0+cHJpdmFjeSkgewotCQljaGFuZ2VkID0gIXRlc3RfYW5kX3NldF9iaXQoSENJX1BSSVZBQ1ksICZoZGV2LT5kZXZfZmxhZ3MpOworCQljaGFuZ2VkID0gIWhjaV9kZXZfdGVzdF9hbmRfc2V0X2ZsYWcoaGRldiwgSENJX1BSSVZBQ1kpOwogCQltZW1jcHkoaGRldi0+aXJrLCBjcC0+aXJrLCBzaXplb2YoaGRldi0+aXJrKSk7Ci0JCXNldF9iaXQoSENJX1JQQV9FWFBJUkVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfUlBBX0VYUElSRUQpOwogCX0gZWxzZSB7Ci0JCWNoYW5nZWQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX1BSSVZBQ1ksICZoZGV2LT5kZXZfZmxhZ3MpOworCQljaGFuZ2VkID0gaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsIEhDSV9QUklWQUNZKTsKIAkJbWVtc2V0KGhkZXYtPmlyaywgMCwgc2l6ZW9mKGhkZXYtPmlyaykpOwotCQljbGVhcl9iaXQoSENJX1JQQV9FWFBJUkVELCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9SUEFfRVhQSVJFRCk7CiAJfQogCiAJZXJyID0gc2VuZF9zZXR0aW5nc19yc3Aoc2ssIE1HTVRfT1BfU0VUX1BSSVZBQ1ksIGhkZXYpOwpAQCAtNTA1MywyMiArNTQxMCwyMiBAQAogCUJUX0RCRygicmVxdWVzdCBmb3IgJXMiLCBoZGV2LT5uYW1lKTsKIAogCWlmICghbG1wX2xlX2NhcGFibGUoaGRldikpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0lSS1MsCi0JCQkJICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9JUktTLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKIAogCWlya19jb3VudCA9IF9fbGUxNl90b19jcHUoY3AtPmlya19jb3VudCk7CiAJaWYgKGlya19jb3VudCA+IG1heF9pcmtfY291bnQpIHsKIAkJQlRfRVJSKCJsb2FkX2lya3M6IHRvbyBiaWcgaXJrX2NvdW50IHZhbHVlICV1IiwgaXJrX2NvdW50KTsKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0xPQURfSVJLUywKLQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9JUktTLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJfQogCiAJZXhwZWN0ZWRfbGVuID0gc2l6ZW9mKCpjcCkgKyBpcmtfY291bnQgKiBzaXplb2Yoc3RydWN0IG1nbXRfaXJrX2luZm8pOwogCWlmIChleHBlY3RlZF9sZW4gIT0gbGVuKSB7CiAJCUJUX0VSUigibG9hZF9pcmtzOiBleHBlY3RlZCAldSBieXRlcywgZ290ICV1IGJ5dGVzIiwKIAkJICAgICAgIGV4cGVjdGVkX2xlbiwgbGVuKTsKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0xPQURfSVJLUywKLQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9JUktTLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJfQogCiAJQlRfREJHKCIlcyBpcmtfY291bnQgJXUiLCBoZGV2LT5uYW1lLCBpcmtfY291bnQpOwpAQCAtNTA3Nyw5ICs1NDM0LDkgQEAKIAkJc3RydWN0IG1nbXRfaXJrX2luZm8gKmtleSA9ICZjcC0+aXJrc1tpXTsKIAogCQlpZiAoIWlya19pc192YWxpZChrZXkpKQotCQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLAotCQkJCQkgIE1HTVRfT1BfTE9BRF9JUktTLAotCQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLAorCQkJCQkgICAgICAgTUdNVF9PUF9MT0FEX0lSS1MsCisJCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJfQogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwpAQCAtNTA5OSw5ICs1NDU2LDkgQEAKIAkJCSAgICBCREFERFJfQU5ZKTsKIAl9CiAKLQlzZXRfYml0KEhDSV9SUEFfUkVTT0xWSU5HLCAmaGRldi0+ZGV2X2ZsYWdzKTsKKwloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9SUEFfUkVTT0xWSU5HKTsKIAotCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9JUktTLCAwLCBOVUxMLCAwKTsKKwllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9JUktTLCAwLCBOVUxMLCAwKTsKIAogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCkBAIC01MTM5LDE0ICs1NDk2LDE0IEBACiAJQlRfREJHKCJyZXF1ZXN0IGZvciAlcyIsIGhkZXYtPm5hbWUpOwogCiAJaWYgKCFsbXBfbGVfY2FwYWJsZShoZGV2KSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0xPQURfTE9OR19URVJNX0tFWVMsCi0JCQkJICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9MT05HX1RFUk1fS0VZUywKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCk7CiAKIAlrZXlfY291bnQgPSBfX2xlMTZfdG9fY3B1KGNwLT5rZXlfY291bnQpOwogCWlmIChrZXlfY291bnQgPiBtYXhfa2V5X2NvdW50KSB7CiAJCUJUX0VSUigibG9hZF9sdGtzOiB0b28gYmlnIGtleV9jb3VudCB2YWx1ZSAldSIsIGtleV9jb3VudCk7Ci0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0xPTkdfVEVSTV9LRVlTLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0xPTkdfVEVSTV9LRVlTLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJfQogCiAJZXhwZWN0ZWRfbGVuID0gc2l6ZW9mKCpjcCkgKyBrZXlfY291bnQgKgpAQCAtNTE1NCw4ICs1NTExLDggQEAKIAlpZiAoZXhwZWN0ZWRfbGVuICE9IGxlbikgewogCQlCVF9FUlIoImxvYWRfa2V5czogZXhwZWN0ZWQgJXUgYnl0ZXMsIGdvdCAldSBieXRlcyIsCiAJCSAgICAgICBleHBlY3RlZF9sZW4sIGxlbik7Ci0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0xPTkdfVEVSTV9LRVlTLAotCQkJCSAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0xPTkdfVEVSTV9LRVlTLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJfQogCiAJQlRfREJHKCIlcyBrZXlfY291bnQgJXUiLCBoZGV2LT5uYW1lLCBrZXlfY291bnQpOwpAQCAtNTE2NCw5ICs1NTIxLDkgQEAKIAkJc3RydWN0IG1nbXRfbHRrX2luZm8gKmtleSA9ICZjcC0+a2V5c1tpXTsKIAogCQlpZiAoIWx0a19pc192YWxpZChrZXkpKQotCQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLAotCQkJCQkgIE1HTVRfT1BfTE9BRF9MT05HX1RFUk1fS0VZUywKLQkJCQkJICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwKKwkJCQkJICAgICAgIE1HTVRfT1BfTE9BRF9MT05HX1RFUk1fS0VZUywKKwkJCQkJICAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAl9CiAKIAloY2lfZGV2X2xvY2soaGRldik7CkBAIC01MjExLDcgKzU1NjgsNyBAQAogCQkJICAgIGtleS0+cmFuZCk7CiAJfQogCi0JZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0xPTkdfVEVSTV9LRVlTLCAwLAorCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0xPTkdfVEVSTV9LRVlTLCAwLAogCQkJICAgTlVMTCwgMCk7CiAKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKQEAgLTUyMTksNyArNTU3Niw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBjb25uX2luZm9fY21kX2NvbXBsZXRlKHN0cnVjdCBwZW5kaW5nX2NtZCAqY21kLCB1OCBzdGF0dXMpCitzdGF0aWMgaW50IGNvbm5faW5mb19jbWRfY29tcGxldGUoc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZCwgdTggc3RhdHVzKQogewogCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IGNtZC0+dXNlcl9kYXRhOwogCXN0cnVjdCBtZ210X3JwX2dldF9jb25uX2luZm8gcnA7CkBAIC01MjM3LDggKzU1OTQsOCBAQAogCQlycC5tYXhfdHhfcG93ZXIgPSBIQ0lfVFhfUE9XRVJfSU5WQUxJRDsKIAl9CiAKLQllcnIgPSBjbWRfY29tcGxldGUoY21kLT5zaywgY21kLT5pbmRleCwgTUdNVF9PUF9HRVRfQ09OTl9JTkZPLCBzdGF0dXMsCi0JCQkgICAmcnAsIHNpemVvZihycCkpOworCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKGNtZC0+c2ssIGNtZC0+aW5kZXgsIE1HTVRfT1BfR0VUX0NPTk5fSU5GTywKKwkJCQlzdGF0dXMsICZycCwgc2l6ZW9mKHJwKSk7CiAKIAloY2lfY29ubl9kcm9wKGNvbm4pOwogCWhjaV9jb25uX3B1dChjb25uKTsKQEAgLTUyNTAsNyArNTYwNyw3IEBACiAJCQkJICAgICAgIHUxNiBvcGNvZGUpCiB7CiAJc3RydWN0IGhjaV9jcF9yZWFkX3Jzc2kgKmNwOwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IGhjaV9jb25uICpjb25uOwogCXUxNiBoYW5kbGU7CiAJdTggc3RhdHVzOwpAQCAtNTI4OCw3ICs1NjQ1LDcgQEAKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmRfZGF0YShNR01UX09QX0dFVF9DT05OX0lORk8sIGhkZXYsIGNvbm4pOworCWNtZCA9IHBlbmRpbmdfZmluZF9kYXRhKE1HTVRfT1BfR0VUX0NPTk5fSU5GTywgaGRldiwgY29ubik7CiAJaWYgKCFjbWQpCiAJCWdvdG8gdW5sb2NrOwogCkBAIC01MzE1LDE1ICs1NjcyLDE2IEBACiAJcnAuYWRkci50eXBlID0gY3AtPmFkZHIudHlwZTsKIAogCWlmICghYmRhZGRyX3R5cGVfaXNfdmFsaWQoY3AtPmFkZHIudHlwZSkpCi0JCXJldHVybiBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0dFVF9DT05OX0lORk8sCi0JCQkJICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAotCQkJCSAgICAmcnAsIHNpemVvZihycCkpOworCQlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0dFVF9DT05OX0lORk8sCisJCQkJCSBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywKKwkJCQkJICZycCwgc2l6ZW9mKHJwKSk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAlpZiAoIWhkZXZfaXNfcG93ZXJlZChoZGV2KSkgewotCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0dFVF9DT05OX0lORk8sCi0JCQkJICAgTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQsICZycCwgc2l6ZW9mKHJwKSk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9HRVRfQ09OTl9JTkZPLAorCQkJCQlNR01UX1NUQVRVU19OT1RfUE9XRVJFRCwgJnJwLAorCQkJCQlzaXplb2YocnApKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCkBAIC01MzM0LDE0ICs1NjkyLDE1IEBACiAJCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBMRV9MSU5LLCAmY3AtPmFkZHIuYmRhZGRyKTsKIAogCWlmICghY29ubiB8fCBjb25uLT5zdGF0ZSAhPSBCVF9DT05ORUNURUQpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9HRVRfQ09OTl9JTkZPLAotCQkJCSAgIE1HTVRfU1RBVFVTX05PVF9DT05ORUNURUQsICZycCwgc2l6ZW9mKHJwKSk7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9HRVRfQ09OTl9JTkZPLAorCQkJCQlNR01UX1NUQVRVU19OT1RfQ09OTkVDVEVELCAmcnAsCisJCQkJCXNpemVvZihycCkpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKLQlpZiAobWdtdF9wZW5kaW5nX2ZpbmRfZGF0YShNR01UX09QX0dFVF9DT05OX0lORk8sIGhkZXYsIGNvbm4pKSB7Ci0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfR0VUX0NPTk5fSU5GTywKLQkJCQkgICBNR01UX1NUQVRVU19CVVNZLCAmcnAsIHNpemVvZihycCkpOworCWlmIChwZW5kaW5nX2ZpbmRfZGF0YShNR01UX09QX0dFVF9DT05OX0lORk8sIGhkZXYsIGNvbm4pKSB7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9HRVRfQ09OTl9JTkZPLAorCQkJCQlNR01UX1NUQVRVU19CVVNZLCAmcnAsIHNpemVvZihycCkpOwogCQlnb3RvIHVubG9jazsKIAl9CiAKQEAgLTUzNjEsNyArNTcyMCw3IEBACiAJCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJCXN0cnVjdCBoY2lfY3BfcmVhZF90eF9wb3dlciByZXFfdHhwX2NwOwogCQlzdHJ1Y3QgaGNpX2NwX3JlYWRfcnNzaSByZXFfcnNzaV9jcDsKLQkJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAKIAkJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOwogCQlyZXFfcnNzaV9jcC5oYW5kbGUgPSBjcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOwpAQCAtNTQwOSw4ICs1NzY4LDggQEAKIAkJcnAudHhfcG93ZXIgPSBjb25uLT50eF9wb3dlcjsKIAkJcnAubWF4X3R4X3Bvd2VyID0gY29ubi0+bWF4X3R4X3Bvd2VyOwogCi0JCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfR0VUX0NPTk5fSU5GTywKLQkJCQkgICBNR01UX1NUQVRVU19TVUNDRVNTLCAmcnAsIHNpemVvZihycCkpOworCQllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfR0VUX0NPTk5fSU5GTywKKwkJCQkJTUdNVF9TVEFUVVNfU1VDQ0VTUywgJnJwLCBzaXplb2YocnApKTsKIAl9CiAKIHVubG9jazoKQEAgLTU0MTgsNyArNTc3Nyw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBjbG9ja19pbmZvX2NtZF9jb21wbGV0ZShzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCwgdTggc3RhdHVzKQorc3RhdGljIGludCBjbG9ja19pbmZvX2NtZF9jb21wbGV0ZShzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kLCB1OCBzdGF0dXMpCiB7CiAJc3RydWN0IGhjaV9jb25uICpjb25uID0gY21kLT51c2VyX2RhdGE7CiAJc3RydWN0IG1nbXRfcnBfZ2V0X2Nsb2NrX2luZm8gcnA7CkBAIC01NDQzLDggKzU4MDIsOCBAQAogCX0KIAogY29tcGxldGU6Ci0JZXJyID0gY21kX2NvbXBsZXRlKGNtZC0+c2ssIGNtZC0+aW5kZXgsIGNtZC0+b3Bjb2RlLCBzdGF0dXMsICZycCwKLQkJCSAgIHNpemVvZihycCkpOworCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKGNtZC0+c2ssIGNtZC0+aW5kZXgsIGNtZC0+b3Bjb2RlLCBzdGF0dXMsICZycCwKKwkJCQlzaXplb2YocnApKTsKIAogCWlmIChjb25uKSB7CiAJCWhjaV9jb25uX2Ryb3AoY29ubik7CkBAIC01NDU3LDcgKzU4MTYsNyBAQAogc3RhdGljIHZvaWQgZ2V0X2Nsb2NrX2luZm9fY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHN0YXR1cywgdTE2IG9wY29kZSkKIHsKIAlzdHJ1Y3QgaGNpX2NwX3JlYWRfY2xvY2sgKmhjaV9jcDsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKIAogCUJUX0RCRygiJXMgc3RhdHVzICV1IiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKQEAgLTU0NzUsNyArNTgzNCw3IEBACiAJCWNvbm4gPSBOVUxMOwogCX0KIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kX2RhdGEoTUdNVF9PUF9HRVRfQ0xPQ0tfSU5GTywgaGRldiwgY29ubik7CisJY21kID0gcGVuZGluZ19maW5kX2RhdGEoTUdNVF9PUF9HRVRfQ0xPQ0tfSU5GTywgaGRldiwgY29ubik7CiAJaWYgKCFjbWQpCiAJCWdvdG8gdW5sb2NrOwogCkBAIC01NDkyLDcgKzU4NTEsNyBAQAogCXN0cnVjdCBtZ210X2NwX2dldF9jbG9ja19pbmZvICpjcCA9IGRhdGE7CiAJc3RydWN0IG1nbXRfcnBfZ2V0X2Nsb2NrX2luZm8gcnA7CiAJc3RydWN0IGhjaV9jcF9yZWFkX2Nsb2NrIGhjaV9jcDsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJc3RydWN0IGhjaV9jb25uICpjb25uOwogCWludCBlcnI7CkBAIC01NTA0LDE1ICs1ODYzLDE2IEBACiAJcnAuYWRkci50eXBlID0gY3AtPmFkZHIudHlwZTsKIAogCWlmIChjcC0+YWRkci50eXBlICE9IEJEQUREUl9CUkVEUikKLQkJcmV0dXJuIGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfR0VUX0NMT0NLX0lORk8sCi0JCQkJICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAotCQkJCSAgICAmcnAsIHNpemVvZihycCkpOworCQlyZXR1cm4gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0dFVF9DTE9DS19JTkZPLAorCQkJCQkgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCisJCQkJCSAmcnAsIHNpemVvZihycCkpOwogCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikpIHsKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9HRVRfQ0xPQ0tfSU5GTywKLQkJCQkgICBNR01UX1NUQVRVU19OT1RfUE9XRVJFRCwgJnJwLCBzaXplb2YocnApKTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0dFVF9DTE9DS19JTkZPLAorCQkJCQlNR01UX1NUQVRVU19OT1RfUE9XRVJFRCwgJnJwLAorCQkJCQlzaXplb2YocnApKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCkBAIC01NTIwLDEwICs1ODgwLDEwIEBACiAJCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBBQ0xfTElOSywKIAkJCQkJICAgICAgICZjcC0+YWRkci5iZGFkZHIpOwogCQlpZiAoIWNvbm4gfHwgY29ubi0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEKSB7Ci0JCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLAotCQkJCQkgICBNR01UX09QX0dFVF9DTE9DS19JTkZPLAotCQkJCQkgICBNR01UX1NUQVRVU19OT1RfQ09OTkVDVEVELAotCQkJCQkgICAmcnAsIHNpemVvZihycCkpOworCQkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLAorCQkJCQkJTUdNVF9PUF9HRVRfQ0xPQ0tfSU5GTywKKwkJCQkJCU1HTVRfU1RBVFVTX05PVF9DT05ORUNURUQsCisJCQkJCQkmcnAsIHNpemVvZihycCkpOwogCQkJZ290byB1bmxvY2s7CiAJCX0KIAl9IGVsc2UgewpAQCAtNTYzNCwxMyArNTk5NCwxMyBAQAogCiBzdGF0aWMgdm9pZCBhZGRfZGV2aWNlX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMsIHUxNiBvcGNvZGUpCiB7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAogCUJUX0RCRygic3RhdHVzIDB4JTAyeCIsIHN0YXR1cyk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX0FERF9ERVZJQ0UsIGhkZXYpOworCWNtZCA9IHBlbmRpbmdfZmluZChNR01UX09QX0FERF9ERVZJQ0UsIGhkZXYpOwogCWlmICghY21kKQogCQlnb3RvIHVubG9jazsKIApAQCAtNTY1NSw3ICs2MDE1LDcgQEAKIAkJICAgICAgdm9pZCAqZGF0YSwgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgbWdtdF9jcF9hZGRfZGV2aWNlICpjcCA9IGRhdGE7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAlzdHJ1Y3QgaGNpX3JlcXVlc3QgcmVxOwogCXU4IGF1dG9fY29ubiwgYWRkcl90eXBlOwogCWludCBlcnI7CkBAIC01NjY0LDE0ICs2MDI0LDE0IEBACiAKIAlpZiAoIWJkYWRkcl90eXBlX2lzX3ZhbGlkKGNwLT5hZGRyLnR5cGUpIHx8CiAJICAgICFiYWNtcCgmY3AtPmFkZHIuYmRhZGRyLCBCREFERFJfQU5ZKSkKLQkJcmV0dXJuIGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfQUREX0RFVklDRSwKLQkJCQkgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCi0JCQkJICAgICZjcC0+YWRkciwgc2l6ZW9mKGNwLT5hZGRyKSk7CisJCXJldHVybiBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfQUREX0RFVklDRSwKKwkJCQkJIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAorCQkJCQkgJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKIAogCWlmIChjcC0+YWN0aW9uICE9IDB4MDAgJiYgY3AtPmFjdGlvbiAhPSAweDAxICYmIGNwLT5hY3Rpb24gIT0gMHgwMikKLQkJcmV0dXJuIGNtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfQUREX0RFVklDRSwKLQkJCQkgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCi0JCQkJICAgICZjcC0+YWRkciwgc2l6ZW9mKGNwLT5hZGRyKSk7CisJCXJldHVybiBtZ210X2NtZF9jb21wbGV0ZShzaywgaGRldi0+aWQsIE1HTVRfT1BfQUREX0RFVklDRSwKKwkJCQkJIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TLAorCQkJCQkgJmNwLT5hZGRyLCBzaXplb2YoY3AtPmFkZHIpKTsKIAogCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKIApAQCAtNTc1NywxMyArNjExNywxMyBAQAogCiBzdGF0aWMgdm9pZCByZW1vdmVfZGV2aWNlX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMsIHUxNiBvcGNvZGUpCiB7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKIAogCUJUX0RCRygic3RhdHVzIDB4JTAyeCIsIHN0YXR1cyk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1JFTU9WRV9ERVZJQ0UsIGhkZXYpOworCWNtZCA9IHBlbmRpbmdfZmluZChNR01UX09QX1JFTU9WRV9ERVZJQ0UsIGhkZXYpOwogCWlmICghY21kKQogCQlnb3RvIHVubG9jazsKIApAQCAtNTc3OCw3ICs2MTM4LDcgQEAKIAkJCSB2b2lkICpkYXRhLCB1MTYgbGVuKQogewogCXN0cnVjdCBtZ210X2NwX3JlbW92ZV9kZXZpY2UgKmNwID0gZGF0YTsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAJaW50IGVycjsKIApAQCAtNTkxMSwxNSArNjI3MSwxNSBAQAogCWludCBpOwogCiAJaWYgKCFsbXBfbGVfY2FwYWJsZShoZGV2KSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0xPQURfQ09OTl9QQVJBTSwKLQkJCQkgIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOworCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0NPTk5fUEFSQU0sCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQpOwogCiAJcGFyYW1fY291bnQgPSBfX2xlMTZfdG9fY3B1KGNwLT5wYXJhbV9jb3VudCk7CiAJaWYgKHBhcmFtX2NvdW50ID4gbWF4X3BhcmFtX2NvdW50KSB7CiAJCUJUX0VSUigibG9hZF9jb25uX3BhcmFtOiB0b28gYmlnIHBhcmFtX2NvdW50IHZhbHVlICV1IiwKIAkJICAgICAgIHBhcmFtX2NvdW50KTsKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0xPQURfQ09OTl9QQVJBTSwKLQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9DT05OX1BBUkFNLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJfQogCiAJZXhwZWN0ZWRfbGVuID0gc2l6ZW9mKCpjcCkgKyBwYXJhbV9jb3VudCAqCkBAIC01OTI3LDggKzYyODcsOCBAQAogCWlmIChleHBlY3RlZF9sZW4gIT0gbGVuKSB7CiAJCUJUX0VSUigibG9hZF9jb25uX3BhcmFtOiBleHBlY3RlZCAldSBieXRlcywgZ290ICV1IGJ5dGVzIiwKIAkJICAgICAgIGV4cGVjdGVkX2xlbiwgbGVuKTsKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX0xPQURfQ09OTl9QQVJBTSwKLQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfTE9BRF9DT05OX1BBUkFNLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJfQogCiAJQlRfREJHKCIlcyBwYXJhbV9jb3VudCAldSIsIGhkZXYtPm5hbWUsIHBhcmFtX2NvdW50KTsKQEAgLTU5ODMsNyArNjM0Myw4IEBACiAKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKIAotCXJldHVybiBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX0xPQURfQ09OTl9QQVJBTSwgMCwgTlVMTCwgMCk7CisJcmV0dXJuIG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9MT0FEX0NPTk5fUEFSQU0sIDAsCisJCQkJIE5VTEwsIDApOwogfQogCiBzdGF0aWMgaW50IHNldF9leHRlcm5hbF9jb25maWcoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwKQEAgLTU5OTYsMjUgKzYzNTcsMjMgQEAKIAlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CiAKIAlpZiAoaGRldl9pc19wb3dlcmVkKGhkZXYpKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0VYVEVSTkFMX0NPTkZJRywKLQkJCQkgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0VYVEVSTkFMX0NPTkZJRywKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfUkVKRUNURUQpOwogCiAJaWYgKGNwLT5jb25maWcgIT0gMHgwMCAmJiBjcC0+Y29uZmlnICE9IDB4MDEpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfRVhURVJOQUxfQ09ORklHLAotCQkJCSAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCXJldHVybiBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9FWFRFUk5BTF9DT05GSUcsCisJCQkJICAgICAgICAgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJaWYgKCF0ZXN0X2JpdChIQ0lfUVVJUktfRVhURVJOQUxfQ09ORklHLCAmaGRldi0+cXVpcmtzKSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9FWFRFUk5BTF9DT05GSUcsCi0JCQkJICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX0VYVEVSTkFMX0NPTkZJRywKKwkJCQkgICAgICAgTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKIAlpZiAoY3AtPmNvbmZpZykKLQkJY2hhbmdlZCA9ICF0ZXN0X2FuZF9zZXRfYml0KEhDSV9FWFRfQ09ORklHVVJFRCwKLQkJCQkJICAgICZoZGV2LT5kZXZfZmxhZ3MpOworCQljaGFuZ2VkID0gIWhjaV9kZXZfdGVzdF9hbmRfc2V0X2ZsYWcoaGRldiwgSENJX0VYVF9DT05GSUdVUkVEKTsKIAllbHNlCi0JCWNoYW5nZWQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0VYVF9DT05GSUdVUkVELAotCQkJCQkgICAgICZoZGV2LT5kZXZfZmxhZ3MpOworCQljaGFuZ2VkID0gaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsIEhDSV9FWFRfQ09ORklHVVJFRCk7CiAKIAllcnIgPSBzZW5kX29wdGlvbnNfcnNwKHNrLCBNR01UX09QX1NFVF9FWFRFUk5BTF9DT05GSUcsIGhkZXYpOwogCWlmIChlcnIgPCAwKQpAQCAtNjAyNSwxMiArNjM4NCwxMiBAQAogCiAJZXJyID0gbmV3X29wdGlvbnMoaGRldiwgc2spOwogCi0JaWYgKHRlc3RfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZoZGV2LT5kZXZfZmxhZ3MpID09IGlzX2NvbmZpZ3VyZWQoaGRldikpIHsKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1VOQ09ORklHVVJFRCkgPT0gaXNfY29uZmlndXJlZChoZGV2KSkgewogCQltZ210X2luZGV4X3JlbW92ZWQoaGRldik7CiAKLQkJaWYgKHRlc3RfYW5kX2NoYW5nZV9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncykpIHsKLQkJCXNldF9iaXQoSENJX0NPTkZJRywgJmhkZXYtPmRldl9mbGFncyk7Ci0JCQlzZXRfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmRldl9mbGFncyk7CisJCWlmIChoY2lfZGV2X3Rlc3RfYW5kX2NoYW5nZV9mbGFnKGhkZXYsIEhDSV9VTkNPTkZJR1VSRUQpKSB7CisJCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9DT05GSUcpOworCQkJaGNpX2Rldl9zZXRfZmxhZyhoZGV2LCBIQ0lfQVVUT19PRkYpOwogCiAJCQlxdWV1ZV93b3JrKGhkZXYtPnJlcV93b3JrcXVldWUsICZoZGV2LT5wb3dlcl9vbik7CiAJCX0gZWxzZSB7CkBAIC02MDU0LDE2ICs2NDEzLDE2IEBACiAJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOwogCiAJaWYgKGhkZXZfaXNfcG93ZXJlZChoZGV2KSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9QVUJMSUNfQUREUkVTUywKLQkJCQkgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1BVQkxJQ19BRERSRVNTLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19SRUpFQ1RFRCk7CiAKIAlpZiAoIWJhY21wKCZjcC0+YmRhZGRyLCBCREFERFJfQU5ZKSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9QVUJMSUNfQUREUkVTUywKLQkJCQkgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1BVQkxJQ19BRERSRVNTLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAlpZiAoIWhkZXYtPnNldF9iZGFkZHIpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfUFVCTElDX0FERFJFU1MsCi0JCQkJICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfU0VUX1BVQkxJQ19BRERSRVNTLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVEKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIApAQCAtNjA3NywxNiArNjQzNiwxNiBAQAogCWlmICghY2hhbmdlZCkKIAkJZ290byB1bmxvY2s7CiAKLQlpZiAodGVzdF9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VTkNPTkZJR1VSRUQpKQogCQllcnIgPSBuZXdfb3B0aW9ucyhoZGV2LCBzayk7CiAKIAlpZiAoaXNfY29uZmlndXJlZChoZGV2KSkgewogCQltZ210X2luZGV4X3JlbW92ZWQoaGRldik7CiAKLQkJY2xlYXJfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZoZGV2LT5kZXZfZmxhZ3MpOworCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX1VOQ09ORklHVVJFRCk7CiAKLQkJc2V0X2JpdChIQ0lfQ09ORklHLCAmaGRldi0+ZGV2X2ZsYWdzKTsKLQkJc2V0X2JpdChIQ0lfQVVUT19PRkYsICZoZGV2LT5kZXZfZmxhZ3MpOworCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9DT05GSUcpOworCQloY2lfZGV2X3NldF9mbGFnKGhkZXYsIEhDSV9BVVRPX09GRik7CiAKIAkJcXVldWVfd29yayhoZGV2LT5yZXFfd29ya3F1ZXVlLCAmaGRldi0+cG93ZXJfb24pOwogCX0KQEAgLTYwOTYsMjEzICs2NDU1LDg1MiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWdtdF9oYW5kbGVyIHsKLQlpbnQgKCpmdW5jKSAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdm9pZCAqZGF0YSwKLQkJICAgICB1MTYgZGF0YV9sZW4pOwotCWJvb2wgdmFyX2xlbjsKLQlzaXplX3QgZGF0YV9sZW47Ci19IG1nbXRfaGFuZGxlcnNbXSA9IHsKLQl7IE5VTEwgfSwgLyogMHgwMDAwIChubyBjb21tYW5kKSAqLwotCXsgcmVhZF92ZXJzaW9uLCAgICAgICAgICAgZmFsc2UsIE1HTVRfUkVBRF9WRVJTSU9OX1NJWkUgfSwKLQl7IHJlYWRfY29tbWFuZHMsICAgICAgICAgIGZhbHNlLCBNR01UX1JFQURfQ09NTUFORFNfU0laRSB9LAotCXsgcmVhZF9pbmRleF9saXN0LCAgICAgICAgZmFsc2UsIE1HTVRfUkVBRF9JTkRFWF9MSVNUX1NJWkUgfSwKLQl7IHJlYWRfY29udHJvbGxlcl9pbmZvLCAgIGZhbHNlLCBNR01UX1JFQURfSU5GT19TSVpFIH0sCi0JeyBzZXRfcG93ZXJlZCwgICAgICAgICAgICBmYWxzZSwgTUdNVF9TRVRUSU5HX1NJWkUgfSwKLQl7IHNldF9kaXNjb3ZlcmFibGUsICAgICAgIGZhbHNlLCBNR01UX1NFVF9ESVNDT1ZFUkFCTEVfU0laRSB9LAotCXsgc2V0X2Nvbm5lY3RhYmxlLCAgICAgICAgZmFsc2UsIE1HTVRfU0VUVElOR19TSVpFIH0sCi0JeyBzZXRfZmFzdF9jb25uZWN0YWJsZSwgICBmYWxzZSwgTUdNVF9TRVRUSU5HX1NJWkUgfSwKLQl7IHNldF9ib25kYWJsZSwgICAgICAgICAgIGZhbHNlLCBNR01UX1NFVFRJTkdfU0laRSB9LAotCXsgc2V0X2xpbmtfc2VjdXJpdHksICAgICAgZmFsc2UsIE1HTVRfU0VUVElOR19TSVpFIH0sCi0JeyBzZXRfc3NwLCAgICAgICAgICAgICAgICBmYWxzZSwgTUdNVF9TRVRUSU5HX1NJWkUgfSwKLQl7IHNldF9ocywgICAgICAgICAgICAgICAgIGZhbHNlLCBNR01UX1NFVFRJTkdfU0laRSB9LAotCXsgc2V0X2xlLCAgICAgICAgICAgICAgICAgZmFsc2UsIE1HTVRfU0VUVElOR19TSVpFIH0sCi0JeyBzZXRfZGV2X2NsYXNzLCAgICAgICAgICBmYWxzZSwgTUdNVF9TRVRfREVWX0NMQVNTX1NJWkUgfSwKLQl7IHNldF9sb2NhbF9uYW1lLCAgICAgICAgIGZhbHNlLCBNR01UX1NFVF9MT0NBTF9OQU1FX1NJWkUgfSwKLQl7IGFkZF91dWlkLCAgICAgICAgICAgICAgIGZhbHNlLCBNR01UX0FERF9VVUlEX1NJWkUgfSwKLQl7IHJlbW92ZV91dWlkLCAgICAgICAgICAgIGZhbHNlLCBNR01UX1JFTU9WRV9VVUlEX1NJWkUgfSwKLQl7IGxvYWRfbGlua19rZXlzLCAgICAgICAgIHRydWUsICBNR01UX0xPQURfTElOS19LRVlTX1NJWkUgfSwKLQl7IGxvYWRfbG9uZ190ZXJtX2tleXMsICAgIHRydWUsICBNR01UX0xPQURfTE9OR19URVJNX0tFWVNfU0laRSB9LAotCXsgZGlzY29ubmVjdCwgICAgICAgICAgICAgZmFsc2UsIE1HTVRfRElTQ09OTkVDVF9TSVpFIH0sCi0JeyBnZXRfY29ubmVjdGlvbnMsICAgICAgICBmYWxzZSwgTUdNVF9HRVRfQ09OTkVDVElPTlNfU0laRSB9LAotCXsgcGluX2NvZGVfcmVwbHksICAgICAgICAgZmFsc2UsIE1HTVRfUElOX0NPREVfUkVQTFlfU0laRSB9LAotCXsgcGluX2NvZGVfbmVnX3JlcGx5LCAgICAgZmFsc2UsIE1HTVRfUElOX0NPREVfTkVHX1JFUExZX1NJWkUgfSwKLQl7IHNldF9pb19jYXBhYmlsaXR5LCAgICAgIGZhbHNlLCBNR01UX1NFVF9JT19DQVBBQklMSVRZX1NJWkUgfSwKLQl7IHBhaXJfZGV2aWNlLCAgICAgICAgICAgIGZhbHNlLCBNR01UX1BBSVJfREVWSUNFX1NJWkUgfSwKLQl7IGNhbmNlbF9wYWlyX2RldmljZSwgICAgIGZhbHNlLCBNR01UX0NBTkNFTF9QQUlSX0RFVklDRV9TSVpFIH0sCi0JeyB1bnBhaXJfZGV2aWNlLCAgICAgICAgICBmYWxzZSwgTUdNVF9VTlBBSVJfREVWSUNFX1NJWkUgfSwKLQl7IHVzZXJfY29uZmlybV9yZXBseSwgICAgIGZhbHNlLCBNR01UX1VTRVJfQ09ORklSTV9SRVBMWV9TSVpFIH0sCi0JeyB1c2VyX2NvbmZpcm1fbmVnX3JlcGx5LCBmYWxzZSwgTUdNVF9VU0VSX0NPTkZJUk1fTkVHX1JFUExZX1NJWkUgfSwKLQl7IHVzZXJfcGFzc2tleV9yZXBseSwgICAgIGZhbHNlLCBNR01UX1VTRVJfUEFTU0tFWV9SRVBMWV9TSVpFIH0sCi0JeyB1c2VyX3Bhc3NrZXlfbmVnX3JlcGx5LCBmYWxzZSwgTUdNVF9VU0VSX1BBU1NLRVlfTkVHX1JFUExZX1NJWkUgfSwKLQl7IHJlYWRfbG9jYWxfb29iX2RhdGEsICAgIGZhbHNlLCBNR01UX1JFQURfTE9DQUxfT09CX0RBVEFfU0laRSB9LAotCXsgYWRkX3JlbW90ZV9vb2JfZGF0YSwgICAgdHJ1ZSwgIE1HTVRfQUREX1JFTU9URV9PT0JfREFUQV9TSVpFIH0sCi0JeyByZW1vdmVfcmVtb3RlX29vYl9kYXRhLCBmYWxzZSwgTUdNVF9SRU1PVkVfUkVNT1RFX09PQl9EQVRBX1NJWkUgfSwKLQl7IHN0YXJ0X2Rpc2NvdmVyeSwgICAgICAgIGZhbHNlLCBNR01UX1NUQVJUX0RJU0NPVkVSWV9TSVpFIH0sCi0JeyBzdG9wX2Rpc2NvdmVyeSwgICAgICAgICBmYWxzZSwgTUdNVF9TVE9QX0RJU0NPVkVSWV9TSVpFIH0sCi0JeyBjb25maXJtX25hbWUsICAgICAgICAgICBmYWxzZSwgTUdNVF9DT05GSVJNX05BTUVfU0laRSB9LAotCXsgYmxvY2tfZGV2aWNlLCAgICAgICAgICAgZmFsc2UsIE1HTVRfQkxPQ0tfREVWSUNFX1NJWkUgfSwKLQl7IHVuYmxvY2tfZGV2aWNlLCAgICAgICAgIGZhbHNlLCBNR01UX1VOQkxPQ0tfREVWSUNFX1NJWkUgfSwKLQl7IHNldF9kZXZpY2VfaWQsICAgICAgICAgIGZhbHNlLCBNR01UX1NFVF9ERVZJQ0VfSURfU0laRSB9LAotCXsgc2V0X2FkdmVydGlzaW5nLCAgICAgICAgZmFsc2UsIE1HTVRfU0VUVElOR19TSVpFIH0sCi0JeyBzZXRfYnJlZHIsICAgICAgICAgICAgICBmYWxzZSwgTUdNVF9TRVRUSU5HX1NJWkUgfSwKLQl7IHNldF9zdGF0aWNfYWRkcmVzcywgICAgIGZhbHNlLCBNR01UX1NFVF9TVEFUSUNfQUREUkVTU19TSVpFIH0sCi0JeyBzZXRfc2Nhbl9wYXJhbXMsICAgICAgICBmYWxzZSwgTUdNVF9TRVRfU0NBTl9QQVJBTVNfU0laRSB9LAotCXsgc2V0X3NlY3VyZV9jb25uLCAgICAgICAgZmFsc2UsIE1HTVRfU0VUVElOR19TSVpFIH0sCi0JeyBzZXRfZGVidWdfa2V5cywgICAgICAgICBmYWxzZSwgTUdNVF9TRVRUSU5HX1NJWkUgfSwKLQl7IHNldF9wcml2YWN5LCAgICAgICAgICAgIGZhbHNlLCBNR01UX1NFVF9QUklWQUNZX1NJWkUgfSwKLQl7IGxvYWRfaXJrcywgICAgICAgICAgICAgIHRydWUsICBNR01UX0xPQURfSVJLU19TSVpFIH0sCi0JeyBnZXRfY29ubl9pbmZvLCAgICAgICAgICBmYWxzZSwgTUdNVF9HRVRfQ09OTl9JTkZPX1NJWkUgfSwKLQl7IGdldF9jbG9ja19pbmZvLCAgICAgICAgIGZhbHNlLCBNR01UX0dFVF9DTE9DS19JTkZPX1NJWkUgfSwKLQl7IGFkZF9kZXZpY2UsICAgICAgICAgICAgIGZhbHNlLCBNR01UX0FERF9ERVZJQ0VfU0laRSB9LAotCXsgcmVtb3ZlX2RldmljZSwgICAgICAgICAgZmFsc2UsIE1HTVRfUkVNT1ZFX0RFVklDRV9TSVpFIH0sCi0JeyBsb2FkX2Nvbm5fcGFyYW0sICAgICAgICB0cnVlLCAgTUdNVF9MT0FEX0NPTk5fUEFSQU1fU0laRSB9LAotCXsgcmVhZF91bmNvbmZfaW5kZXhfbGlzdCwgZmFsc2UsIE1HTVRfUkVBRF9VTkNPTkZfSU5ERVhfTElTVF9TSVpFIH0sCi0JeyByZWFkX2NvbmZpZ19pbmZvLCAgICAgICBmYWxzZSwgTUdNVF9SRUFEX0NPTkZJR19JTkZPX1NJWkUgfSwKLQl7IHNldF9leHRlcm5hbF9jb25maWcsICAgIGZhbHNlLCBNR01UX1NFVF9FWFRFUk5BTF9DT05GSUdfU0laRSB9LAotCXsgc2V0X3B1YmxpY19hZGRyZXNzLCAgICAgZmFsc2UsIE1HTVRfU0VUX1BVQkxJQ19BRERSRVNTX1NJWkUgfSwKLQl7IHN0YXJ0X3NlcnZpY2VfZGlzY292ZXJ5LHRydWUsICBNR01UX1NUQVJUX1NFUlZJQ0VfRElTQ09WRVJZX1NJWkUgfSwKLX07Ci0KLWludCBtZ210X2NvbnRyb2woc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBtc2dsZW4pCitzdGF0aWMgaW5saW5lIHUxNiBlaXJfYXBwZW5kX2RhdGEodTggKmVpciwgdTE2IGVpcl9sZW4sIHU4IHR5cGUsIHU4ICpkYXRhLAorCQkJCSAgdTggZGF0YV9sZW4pCiB7Ci0Jdm9pZCAqYnVmOwotCXU4ICpjcDsKLQlzdHJ1Y3QgbWdtdF9oZHIgKmhkcjsKLQl1MTYgb3Bjb2RlLCBpbmRleCwgbGVuOwotCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgbWdtdF9oYW5kbGVyICpoYW5kbGVyOworCWVpcltlaXJfbGVuKytdID0gc2l6ZW9mKHR5cGUpICsgZGF0YV9sZW47CisJZWlyW2Vpcl9sZW4rK10gPSB0eXBlOworCW1lbWNweSgmZWlyW2Vpcl9sZW5dLCBkYXRhLCBkYXRhX2xlbik7CisJZWlyX2xlbiArPSBkYXRhX2xlbjsKKworCXJldHVybiBlaXJfbGVuOworfQorCitzdGF0aWMgdm9pZCByZWFkX2xvY2FsX29vYl9leHRfZGF0YV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzLAorCQkJCQkgICAgIHUxNiBvcGNvZGUsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJY29uc3Qgc3RydWN0IG1nbXRfY3BfcmVhZF9sb2NhbF9vb2JfZXh0X2RhdGEgKm1nbXRfY3A7CisJc3RydWN0IG1nbXRfcnBfcmVhZF9sb2NhbF9vb2JfZXh0X2RhdGEgKm1nbXRfcnA7CisJdTggKmgxOTIsICpyMTkyLCAqaDI1NiwgKnIyNTY7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKKwl1MTYgZWlyX2xlbjsKIAlpbnQgZXJyOwogCi0JQlRfREJHKCJnb3QgJXp1IGJ5dGVzIiwgbXNnbGVuKTsKKwlCVF9EQkcoIiVzIHN0YXR1cyAldSIsIGhkZXYtPm5hbWUsIHN0YXR1cyk7CiAKLQlpZiAobXNnbGVuIDwgc2l6ZW9mKCpoZHIpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwljbWQgPSBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9FWFRfREFUQSwgaGRldik7CisJaWYgKCFjbWQpCisJCXJldHVybjsKIAotCWJ1ZiA9IGttYWxsb2MobXNnbGVuLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKKwltZ210X2NwID0gY21kLT5wYXJhbTsKKworCWlmIChzdGF0dXMpIHsKKwkJc3RhdHVzID0gbWdtdF9zdGF0dXMoc3RhdHVzKTsKKwkJZWlyX2xlbiA9IDA7CisKKwkJaDE5MiA9IE5VTEw7CisJCXIxOTIgPSBOVUxMOworCQloMjU2ID0gTlVMTDsKKwkJcjI1NiA9IE5VTEw7CisJfSBlbHNlIGlmIChvcGNvZGUgPT0gSENJX09QX1JFQURfTE9DQUxfT09CX0RBVEEpIHsKKwkJc3RydWN0IGhjaV9ycF9yZWFkX2xvY2FsX29vYl9kYXRhICpycDsKKworCQlpZiAoc2tiLT5sZW4gIT0gc2l6ZW9mKCpycCkpIHsKKwkJCXN0YXR1cyA9IE1HTVRfU1RBVFVTX0ZBSUxFRDsKKwkJCWVpcl9sZW4gPSAwOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gTUdNVF9TVEFUVVNfU1VDQ0VTUzsKKwkJCXJwID0gKHZvaWQgKilza2ItPmRhdGE7CisKKwkJCWVpcl9sZW4gPSA1ICsgMTggKyAxODsKKwkJCWgxOTIgPSBycC0+aGFzaDsKKwkJCXIxOTIgPSBycC0+cmFuZDsKKwkJCWgyNTYgPSBOVUxMOworCQkJcjI1NiA9IE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQlzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfb29iX2V4dF9kYXRhICpycDsKKworCQlpZiAoc2tiLT5sZW4gIT0gc2l6ZW9mKCpycCkpIHsKKwkJCXN0YXR1cyA9IE1HTVRfU1RBVFVTX0ZBSUxFRDsKKwkJCWVpcl9sZW4gPSAwOworCQl9IGVsc2UgeworCQkJc3RhdHVzID0gTUdNVF9TVEFUVVNfU1VDQ0VTUzsKKwkJCXJwID0gKHZvaWQgKilza2ItPmRhdGE7CisKKwkJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU0NfT05MWSkpIHsKKwkJCQllaXJfbGVuID0gNSArIDE4ICsgMTg7CisJCQkJaDE5MiA9IE5VTEw7CisJCQkJcjE5MiA9IE5VTEw7CisJCQl9IGVsc2UgeworCQkJCWVpcl9sZW4gPSA1ICsgMTggKyAxOCArIDE4ICsgMTg7CisJCQkJaDE5MiA9IHJwLT5oYXNoMTkyOworCQkJCXIxOTIgPSBycC0+cmFuZDE5MjsKKwkJCX0KKworCQkJaDI1NiA9IHJwLT5oYXNoMjU2OworCQkJcjI1NiA9IHJwLT5yYW5kMjU2OworCQl9CisJfQorCisJbWdtdF9ycCA9IGttYWxsb2Moc2l6ZW9mKCptZ210X3JwKSArIGVpcl9sZW4sIEdGUF9LRVJORUwpOworCWlmICghbWdtdF9ycCkKKwkJZ290byBkb25lOworCisJaWYgKHN0YXR1cykKKwkJZ290byBzZW5kX3JzcDsKKworCWVpcl9sZW4gPSBlaXJfYXBwZW5kX2RhdGEobWdtdF9ycC0+ZWlyLCAwLCBFSVJfQ0xBU1NfT0ZfREVWLAorCQkJCSAgaGRldi0+ZGV2X2NsYXNzLCAzKTsKKworCWlmIChoMTkyICYmIHIxOTIpIHsKKwkJZWlyX2xlbiA9IGVpcl9hcHBlbmRfZGF0YShtZ210X3JwLT5laXIsIGVpcl9sZW4sCisJCQkJCSAgRUlSX1NTUF9IQVNIX0MxOTIsIGgxOTIsIDE2KTsKKwkJZWlyX2xlbiA9IGVpcl9hcHBlbmRfZGF0YShtZ210X3JwLT5laXIsIGVpcl9sZW4sCisJCQkJCSAgRUlSX1NTUF9SQU5EX1IxOTIsIHIxOTIsIDE2KTsKKwl9CisKKwlpZiAoaDI1NiAmJiByMjU2KSB7CisJCWVpcl9sZW4gPSBlaXJfYXBwZW5kX2RhdGEobWdtdF9ycC0+ZWlyLCBlaXJfbGVuLAorCQkJCQkgIEVJUl9TU1BfSEFTSF9DMjU2LCBoMjU2LCAxNik7CisJCWVpcl9sZW4gPSBlaXJfYXBwZW5kX2RhdGEobWdtdF9ycC0+ZWlyLCBlaXJfbGVuLAorCQkJCQkgIEVJUl9TU1BfUkFORF9SMjU2LCByMjU2LCAxNik7CisJfQorCitzZW5kX3JzcDoKKwltZ210X3JwLT50eXBlID0gbWdtdF9jcC0+dHlwZTsKKwltZ210X3JwLT5laXJfbGVuID0gY3B1X3RvX2xlMTYoZWlyX2xlbik7CisKKwllcnIgPSBtZ210X2NtZF9jb21wbGV0ZShjbWQtPnNrLCBoZGV2LT5pZCwKKwkJCQlNR01UX09QX1JFQURfTE9DQUxfT09CX0VYVF9EQVRBLCBzdGF0dXMsCisJCQkJbWdtdF9ycCwgc2l6ZW9mKCptZ210X3JwKSArIGVpcl9sZW4pOworCWlmIChlcnIgPCAwIHx8IHN0YXR1cykKKwkJZ290byBkb25lOworCisJaGNpX3NvY2tfc2V0X2ZsYWcoY21kLT5zaywgSENJX01HTVRfT09CX0RBVEFfRVZFTlRTKTsKKworCWVyciA9IG1nbXRfbGltaXRlZF9ldmVudChNR01UX0VWX0xPQ0FMX09PQl9EQVRBX1VQREFURUQsIGhkZXYsCisJCQkJIG1nbXRfcnAsIHNpemVvZigqbWdtdF9ycCkgKyBlaXJfbGVuLAorCQkJCSBIQ0lfTUdNVF9PT0JfREFUQV9FVkVOVFMsIGNtZC0+c2spOworZG9uZToKKwlrZnJlZShtZ210X3JwKTsKKwltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9sb2NhbF9zc3Bfb29iX3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNvY2sgKnNrLAorCQkJCSAgc3RydWN0IG1nbXRfY3BfcmVhZF9sb2NhbF9vb2JfZXh0X2RhdGEgKmNwKQoreworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKKwlpbnQgZXJyOworCisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9FWFRfREFUQSwgaGRldiwKKwkJCSAgICAgICBjcCwgc2l6ZW9mKCpjcCkpOworCWlmICghY21kKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChtZW1jcHlfZnJvbV9tc2coYnVmLCBtc2csIG1zZ2xlbikpIHsKLQkJZXJyID0gLUVGQVVMVDsKLQkJZ290byBkb25lOworCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKKworCWlmIChicmVkcl9zY19lbmFibGVkKGhkZXYpKQorCQloY2lfcmVxX2FkZCgmcmVxLCBIQ0lfT1BfUkVBRF9MT0NBTF9PT0JfRVhUX0RBVEEsIDAsIE5VTEwpOworCWVsc2UKKwkJaGNpX3JlcV9hZGQoJnJlcSwgSENJX09QX1JFQURfTE9DQUxfT09CX0RBVEEsIDAsIE5VTEwpOworCisJZXJyID0gaGNpX3JlcV9ydW5fc2tiKCZyZXEsIHJlYWRfbG9jYWxfb29iX2V4dF9kYXRhX2NvbXBsZXRlKTsKKwlpZiAoZXJyIDwgMCkgeworCQltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CisJCXJldHVybiBlcnI7CiAJfQogCi0JaGRyID0gYnVmOwotCW9wY29kZSA9IF9fbGUxNl90b19jcHUoaGRyLT5vcGNvZGUpOwotCWluZGV4ID0gX19sZTE2X3RvX2NwdShoZHItPmluZGV4KTsKLQlsZW4gPSBfX2xlMTZfdG9fY3B1KGhkci0+bGVuKTsKKwlyZXR1cm4gMDsKK30KIAotCWlmIChsZW4gIT0gbXNnbGVuIC0gc2l6ZW9mKCpoZHIpKSB7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKK3N0YXRpYyBpbnQgcmVhZF9sb2NhbF9vb2JfZXh0X2RhdGEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkgICB2b2lkICpkYXRhLCB1MTYgZGF0YV9sZW4pCit7CisJc3RydWN0IG1nbXRfY3BfcmVhZF9sb2NhbF9vb2JfZXh0X2RhdGEgKmNwID0gZGF0YTsKKwlzdHJ1Y3QgbWdtdF9ycF9yZWFkX2xvY2FsX29vYl9leHRfZGF0YSAqcnA7CisJc2l6ZV90IHJwX2xlbjsKKwl1MTYgZWlyX2xlbjsKKwl1OCBzdGF0dXMsIGZsYWdzLCByb2xlLCBhZGRyWzddLCBoYXNoWzE2XSwgcmFuZFsxNl07CisJaW50IGVycjsKKworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKworCWlmIChoZGV2X2lzX3Bvd2VyZWQoaGRldikpIHsKKwkJc3dpdGNoIChjcC0+dHlwZSkgeworCQljYXNlIEJJVChCREFERFJfQlJFRFIpOgorCQkJc3RhdHVzID0gbWdtdF9icmVkcl9zdXBwb3J0KGhkZXYpOworCQkJaWYgKHN0YXR1cykKKwkJCQllaXJfbGVuID0gMDsKKwkJCWVsc2UKKwkJCQllaXJfbGVuID0gNTsKKwkJCWJyZWFrOworCQljYXNlIChCSVQoQkRBRERSX0xFX1BVQkxJQykgfCBCSVQoQkRBRERSX0xFX1JBTkRPTSkpOgorCQkJc3RhdHVzID0gbWdtdF9sZV9zdXBwb3J0KGhkZXYpOworCQkJaWYgKHN0YXR1cykKKwkJCQllaXJfbGVuID0gMDsKKwkJCWVsc2UKKwkJCQllaXJfbGVuID0gOSArIDMgKyAxOCArIDE4ICsgMzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3RhdHVzID0gTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVM7CisJCQllaXJfbGVuID0gMDsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQ7CisJCWVpcl9sZW4gPSAwOwogCX0KIAotCWlmIChpbmRleCAhPSBNR01UX0lOREVYX05PTkUpIHsKLQkJaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKLQkJaWYgKCFoZGV2KSB7Ci0JCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgb3Bjb2RlLAotCQkJCQkgTUdNVF9TVEFUVVNfSU5WQUxJRF9JTkRFWCk7Ci0JCQlnb3RvIGRvbmU7CisJcnBfbGVuID0gc2l6ZW9mKCpycCkgKyBlaXJfbGVuOworCXJwID0ga21hbGxvYyhycF9sZW4sIEdGUF9BVE9NSUMpOworCWlmICghcnApCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHN0YXR1cykKKwkJZ290byBjb21wbGV0ZTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCWVpcl9sZW4gPSAwOworCXN3aXRjaCAoY3AtPnR5cGUpIHsKKwljYXNlIEJJVChCREFERFJfQlJFRFIpOgorCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NTUF9FTkFCTEVEKSkgeworCQkJZXJyID0gcmVhZF9sb2NhbF9zc3Bfb29iX3JlcShoZGV2LCBzaywgY3ApOworCQkJaGNpX2Rldl91bmxvY2soaGRldik7CisJCQlpZiAoIWVycikKKwkJCQlnb3RvIGRvbmU7CisKKwkJCXN0YXR1cyA9IE1HTVRfU1RBVFVTX0ZBSUxFRDsKKwkJCWdvdG8gY29tcGxldGU7CisJCX0gZWxzZSB7CisJCQllaXJfbGVuID0gZWlyX2FwcGVuZF9kYXRhKHJwLT5laXIsIGVpcl9sZW4sCisJCQkJCQkgIEVJUl9DTEFTU19PRl9ERVYsCisJCQkJCQkgIGhkZXYtPmRldl9jbGFzcywgMyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAoQklUKEJEQUREUl9MRV9QVUJMSUMpIHwgQklUKEJEQUREUl9MRV9SQU5ET00pKToKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TQ19FTkFCTEVEKSAmJgorCQkgICAgc21wX2dlbmVyYXRlX29vYihoZGV2LCBoYXNoLCByYW5kKSA8IDApIHsKKwkJCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCQkJc3RhdHVzID0gTUdNVF9TVEFUVVNfRkFJTEVEOworCQkJZ290byBjb21wbGV0ZTsKIAkJfQogCi0JCWlmICh0ZXN0X2JpdChIQ0lfU0VUVVAsICZoZGV2LT5kZXZfZmxhZ3MpIHx8Ci0JCSAgICB0ZXN0X2JpdChIQ0lfQ09ORklHLCAmaGRldi0+ZGV2X2ZsYWdzKSB8fAotCQkgICAgdGVzdF9iaXQoSENJX1VTRVJfQ0hBTk5FTCwgJmhkZXYtPmRldl9mbGFncykpIHsKLQkJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBvcGNvZGUsCi0JCQkJCSBNR01UX1NUQVRVU19JTlZBTElEX0lOREVYKTsKLQkJCWdvdG8gZG9uZTsKKwkJLyogVGhpcyBzaG91bGQgcmV0dXJuIHRoZSBhY3RpdmUgUlBBLCBidXQgc2luY2UgdGhlIFJQQQorCQkgKiBpcyBvbmx5IHByb2dyYW1tZWQgb24gZGVtYW5kLCBpdCBpcyByZWFsbHkgaGFyZCB0byBmaWxsCisJCSAqIHRoaXMgaW4gYXQgdGhlIG1vbWVudC4gRm9yIG5vdyBkaXNhbGxvdyByZXRyaWV2aW5nCisJCSAqIGxvY2FsIG91dC1vZi1iYW5kIGRhdGEgd2hlbiBwcml2YWN5IGlzIGluIHVzZS4KKwkJICoKKwkJICogUmV0dXJuaW5nIHRoZSBpZGVudGl0eSBhZGRyZXNzIHdpbGwgbm90IGhlbHAgaGVyZSBzaW5jZQorCQkgKiBwYWlyaW5nIGhhcHBlbnMgYmVmb3JlIHRoZSBpZGVudGl0eSByZXNvbHZpbmcga2V5IGlzCisJCSAqIGtub3duIGFuZCB0aHVzIHRoZSBjb25uZWN0aW9uIGVzdGFibGlzaG1lbnQgaGFwcGVucworCQkgKiBiYXNlZCBvbiB0aGUgUlBBIGFuZCBub3QgdGhlIGlkZW50aXR5IGFkZHJlc3MuCisJCSAqLworCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1BSSVZBQ1kpKSB7CisJCQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwkJCXN0YXR1cyA9IE1HTVRfU1RBVFVTX1JFSkVDVEVEOworCQkJZ290byBjb21wbGV0ZTsKIAkJfQogCi0JCWlmICh0ZXN0X2JpdChIQ0lfVU5DT05GSUdVUkVELCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgotCQkgICAgb3Bjb2RlICE9IE1HTVRfT1BfUkVBRF9DT05GSUdfSU5GTyAmJgotCQkgICAgb3Bjb2RlICE9IE1HTVRfT1BfU0VUX0VYVEVSTkFMX0NPTkZJRyAmJgotCQkgICAgb3Bjb2RlICE9IE1HTVRfT1BfU0VUX1BVQkxJQ19BRERSRVNTKSB7Ci0JCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgb3Bjb2RlLAotCQkJCQkgTUdNVF9TVEFUVVNfSU5WQUxJRF9JTkRFWCk7Ci0JCQlnb3RvIGRvbmU7CisJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfRk9SQ0VfU1RBVElDX0FERFIpIHx8CisJCSAgICFiYWNtcCgmaGRldi0+YmRhZGRyLCBCREFERFJfQU5ZKSB8fAorCQkgICAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CUkVEUl9FTkFCTEVEKSAmJgorCQkgICAgYmFjbXAoJmhkZXYtPnN0YXRpY19hZGRyLCBCREFERFJfQU5ZKSkpIHsKKwkJCW1lbWNweShhZGRyLCAmaGRldi0+c3RhdGljX2FkZHIsIDYpOworCQkJYWRkcls2XSA9IDB4MDE7CisJCX0gZWxzZSB7CisJCQltZW1jcHkoYWRkciwgJmhkZXYtPmJkYWRkciwgNik7CisJCQlhZGRyWzZdID0gMHgwMDsKIAkJfQorCisJCWVpcl9sZW4gPSBlaXJfYXBwZW5kX2RhdGEocnAtPmVpciwgZWlyX2xlbiwgRUlSX0xFX0JEQUREUiwKKwkJCQkJICBhZGRyLCBzaXplb2YoYWRkcikpOworCisJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkcpKQorCQkJcm9sZSA9IDB4MDI7CisJCWVsc2UKKwkJCXJvbGUgPSAweDAxOworCisJCWVpcl9sZW4gPSBlaXJfYXBwZW5kX2RhdGEocnAtPmVpciwgZWlyX2xlbiwgRUlSX0xFX1JPTEUsCisJCQkJCSAgJnJvbGUsIHNpemVvZihyb2xlKSk7CisKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TQ19FTkFCTEVEKSkgeworCQkJZWlyX2xlbiA9IGVpcl9hcHBlbmRfZGF0YShycC0+ZWlyLCBlaXJfbGVuLAorCQkJCQkJICBFSVJfTEVfU0NfQ09ORklSTSwKKwkJCQkJCSAgaGFzaCwgc2l6ZW9mKGhhc2gpKTsKKworCQkJZWlyX2xlbiA9IGVpcl9hcHBlbmRfZGF0YShycC0+ZWlyLCBlaXJfbGVuLAorCQkJCQkJICBFSVJfTEVfU0NfUkFORE9NLAorCQkJCQkJICByYW5kLCBzaXplb2YocmFuZCkpOworCQl9CisKKwkJZmxhZ3MgPSBnZXRfYWR2X2Rpc2Nvdl9mbGFncyhoZGV2KTsKKworCQlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CUkVEUl9FTkFCTEVEKSkKKwkJCWZsYWdzIHw9IExFX0FEX05PX0JSRURSOworCisJCWVpcl9sZW4gPSBlaXJfYXBwZW5kX2RhdGEocnAtPmVpciwgZWlyX2xlbiwgRUlSX0ZMQUdTLAorCQkJCQkgICZmbGFncywgc2l6ZW9mKGZsYWdzKSk7CisJCWJyZWFrOwogCX0KIAotCWlmIChvcGNvZGUgPj0gQVJSQVlfU0laRShtZ210X2hhbmRsZXJzKSB8fAotCSAgICBtZ210X2hhbmRsZXJzW29wY29kZV0uZnVuYyA9PSBOVUxMKSB7Ci0JCUJUX0RCRygiVW5rbm93biBvcCAldSIsIG9wY29kZSk7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBvcGNvZGUsCi0JCQkJIE1HTVRfU1RBVFVTX1VOS05PV05fQ09NTUFORCk7Ci0JCWdvdG8gZG9uZTsKLQl9CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAKLQlpZiAoaGRldiAmJiAob3Bjb2RlIDw9IE1HTVRfT1BfUkVBRF9JTkRFWF9MSVNUIHx8Ci0JCSAgICAgb3Bjb2RlID09IE1HTVRfT1BfUkVBRF9VTkNPTkZfSU5ERVhfTElTVCkpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIG9wY29kZSwKLQkJCQkgTUdNVF9TVEFUVVNfSU5WQUxJRF9JTkRFWCk7Ci0JCWdvdG8gZG9uZTsKLQl9CisJaGNpX3NvY2tfc2V0X2ZsYWcoc2ssIEhDSV9NR01UX09PQl9EQVRBX0VWRU5UUyk7CiAKLQlpZiAoIWhkZXYgJiYgKG9wY29kZSA+IE1HTVRfT1BfUkVBRF9JTkRFWF9MSVNUICYmCi0JCSAgICAgIG9wY29kZSAhPSBNR01UX09QX1JFQURfVU5DT05GX0lOREVYX0xJU1QpKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBvcGNvZGUsCi0JCQkJIE1HTVRfU1RBVFVTX0lOVkFMSURfSU5ERVgpOwotCQlnb3RvIGRvbmU7Ci0JfQorCXN0YXR1cyA9IE1HTVRfU1RBVFVTX1NVQ0NFU1M7CiAKLQloYW5kbGVyID0gJm1nbXRfaGFuZGxlcnNbb3Bjb2RlXTsKK2NvbXBsZXRlOgorCXJwLT50eXBlID0gY3AtPnR5cGU7CisJcnAtPmVpcl9sZW4gPSBjcHVfdG9fbGUxNihlaXJfbGVuKTsKIAotCWlmICgoaGFuZGxlci0+dmFyX2xlbiAmJiBsZW4gPCBoYW5kbGVyLT5kYXRhX2xlbikgfHwKLQkgICAgKCFoYW5kbGVyLT52YXJfbGVuICYmIGxlbiAhPSBoYW5kbGVyLT5kYXRhX2xlbikpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIG9wY29kZSwKLQkJCQkgTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JaWYgKGhkZXYpCi0JCW1nbXRfaW5pdF9oZGV2KHNrLCBoZGV2KTsKLQotCWNwID0gYnVmICsgc2l6ZW9mKCpoZHIpOwotCi0JZXJyID0gaGFuZGxlci0+ZnVuYyhzaywgaGRldiwgY3AsIGxlbik7Ci0JaWYgKGVyciA8IDApCisJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFQURfTE9DQUxfT09CX0VYVF9EQVRBLAorCQkJCXN0YXR1cywgcnAsIHNpemVvZigqcnApICsgZWlyX2xlbik7CisJaWYgKGVyciA8IDAgfHwgc3RhdHVzKQogCQlnb3RvIGRvbmU7CiAKLQllcnIgPSBtc2dsZW47CisJZXJyID0gbWdtdF9saW1pdGVkX2V2ZW50KE1HTVRfRVZfTE9DQUxfT09CX0RBVEFfVVBEQVRFRCwgaGRldiwKKwkJCQkgcnAsIHNpemVvZigqcnApICsgZWlyX2xlbiwKKwkJCQkgSENJX01HTVRfT09CX0RBVEFfRVZFTlRTLCBzayk7CiAKIGRvbmU6Ci0JaWYgKGhkZXYpCi0JCWhjaV9kZXZfcHV0KGhkZXYpOworCWtmcmVlKHJwKTsKIAotCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHUzMiBnZXRfc3VwcG9ydGVkX2Fkdl9mbGFncyhzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwl1MzIgZmxhZ3MgPSAwOworCisJZmxhZ3MgfD0gTUdNVF9BRFZfRkxBR19DT05ORUNUQUJMRTsKKwlmbGFncyB8PSBNR01UX0FEVl9GTEFHX0RJU0NPVjsKKwlmbGFncyB8PSBNR01UX0FEVl9GTEFHX0xJTUlURURfRElTQ09WOworCWZsYWdzIHw9IE1HTVRfQURWX0ZMQUdfTUFOQUdFRF9GTEFHUzsKKworCWlmIChoZGV2LT5hZHZfdHhfcG93ZXIgIT0gSENJX1RYX1BPV0VSX0lOVkFMSUQpCisJCWZsYWdzIHw9IE1HTVRfQURWX0ZMQUdfVFhfUE9XRVI7CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9hZHZfZmVhdHVyZXMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCSAgICAgdm9pZCAqZGF0YSwgdTE2IGRhdGFfbGVuKQoreworCXN0cnVjdCBtZ210X3JwX3JlYWRfYWR2X2ZlYXR1cmVzICpycDsKKwlzaXplX3QgcnBfbGVuOworCWludCBlcnI7CisJYm9vbCBpbnN0YW5jZTsKKwl1MzIgc3VwcG9ydGVkX2ZsYWdzOworCisJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOworCisJaWYgKCFsbXBfbGVfY2FwYWJsZShoZGV2KSkKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfUkVBRF9BRFZfRkVBVFVSRVMsCisJCQkJICAgICAgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCXJwX2xlbiA9IHNpemVvZigqcnApOworCisJLyogQ3VycmVudGx5IG9ubHkgb25lIGluc3RhbmNlIGlzIHN1cHBvcnRlZCwgc28ganVzdCBhZGQgMSB0byB0aGUKKwkgKiByZXNwb25zZSBsZW5ndGguCisJICovCisJaW5zdGFuY2UgPSBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkdfSU5TVEFOQ0UpOworCWlmIChpbnN0YW5jZSkKKwkJcnBfbGVuKys7CisKKwlycCA9IGttYWxsb2MocnBfbGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXJwKSB7CisJCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzdXBwb3J0ZWRfZmxhZ3MgPSBnZXRfc3VwcG9ydGVkX2Fkdl9mbGFncyhoZGV2KTsKKworCXJwLT5zdXBwb3J0ZWRfZmxhZ3MgPSBjcHVfdG9fbGUzMihzdXBwb3J0ZWRfZmxhZ3MpOworCXJwLT5tYXhfYWR2X2RhdGFfbGVuID0gSENJX01BWF9BRF9MRU5HVEg7CisJcnAtPm1heF9zY2FuX3JzcF9sZW4gPSBIQ0lfTUFYX0FEX0xFTkdUSDsKKwlycC0+bWF4X2luc3RhbmNlcyA9IDE7CisKKwkvKiBDdXJyZW50bHkgb25seSBvbmUgaW5zdGFuY2UgaXMgc3VwcG9ydGVkLCBzbyBzaW1wbHkgcmV0dXJuIHRoZQorCSAqIGN1cnJlbnQgaW5zdGFuY2UgbnVtYmVyLgorCSAqLworCWlmIChpbnN0YW5jZSkgeworCQlycC0+bnVtX2luc3RhbmNlcyA9IDE7CisJCXJwLT5pbnN0YW5jZVswXSA9IDE7CisJfSBlbHNlIHsKKwkJcnAtPm51bV9pbnN0YW5jZXMgPSAwOworCX0KKworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCisJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFQURfQURWX0ZFQVRVUkVTLAorCQkJCU1HTVRfU1RBVFVTX1NVQ0NFU1MsIHJwLCBycF9sZW4pOworCisJa2ZyZWUocnApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGJvb2wgdGx2X2RhdGFfaXNfdmFsaWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHUzMiBhZHZfZmxhZ3MsIHU4ICpkYXRhLAorCQkJICAgICAgdTggbGVuLCBib29sIGlzX2Fkdl9kYXRhKQoreworCXU4IG1heF9sZW4gPSBIQ0lfTUFYX0FEX0xFTkdUSDsKKwlpbnQgaSwgY3VyX2xlbjsKKwlib29sIGZsYWdzX21hbmFnZWQgPSBmYWxzZTsKKwlib29sIHR4X3Bvd2VyX21hbmFnZWQgPSBmYWxzZTsKKwl1MzIgZmxhZ3NfcGFyYW1zID0gTUdNVF9BRFZfRkxBR19ESVNDT1YgfCBNR01UX0FEVl9GTEFHX0xJTUlURURfRElTQ09WIHwKKwkJCSAgIE1HTVRfQURWX0ZMQUdfTUFOQUdFRF9GTEFHUzsKKworCWlmIChpc19hZHZfZGF0YSAmJiAoYWR2X2ZsYWdzICYgZmxhZ3NfcGFyYW1zKSkgeworCQlmbGFnc19tYW5hZ2VkID0gdHJ1ZTsKKwkJbWF4X2xlbiAtPSAzOworCX0KKworCWlmIChpc19hZHZfZGF0YSAmJiAoYWR2X2ZsYWdzICYgTUdNVF9BRFZfRkxBR19UWF9QT1dFUikpIHsKKwkJdHhfcG93ZXJfbWFuYWdlZCA9IHRydWU7CisJCW1heF9sZW4gLT0gMzsKKwl9CisKKwlpZiAobGVuID4gbWF4X2xlbikKKwkJcmV0dXJuIGZhbHNlOworCisJLyogTWFrZSBzdXJlIHRoYXQgdGhlIGRhdGEgaXMgY29ycmVjdGx5IGZvcm1hdHRlZC4gKi8KKwlmb3IgKGkgPSAwLCBjdXJfbGVuID0gMDsgaSA8IGxlbjsgaSArPSAoY3VyX2xlbiArIDEpKSB7CisJCWN1cl9sZW4gPSBkYXRhW2ldOworCisJCWlmIChmbGFnc19tYW5hZ2VkICYmIGRhdGFbaSArIDFdID09IEVJUl9GTEFHUykKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAodHhfcG93ZXJfbWFuYWdlZCAmJiBkYXRhW2kgKyAxXSA9PSBFSVJfVFhfUE9XRVIpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJLyogSWYgdGhlIGN1cnJlbnQgZmllbGQgbGVuZ3RoIHdvdWxkIGV4Y2VlZCB0aGUgdG90YWwgZGF0YQorCQkgKiBsZW5ndGgsIHRoZW4gaXQncyBpbnZhbGlkLgorCQkgKi8KKwkJaWYgKGkgKyBjdXJfbGVuID49IGxlbikKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYWRkX2FkdmVydGlzaW5nX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMsCisJCQkJICAgICB1MTYgb3Bjb2RlKQoreworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IG1nbXRfcnBfYWRkX2FkdmVydGlzaW5nIHJwOworCisJQlRfREJHKCJzdGF0dXMgJWQiLCBzdGF0dXMpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJY21kID0gcGVuZGluZ19maW5kKE1HTVRfT1BfQUREX0FEVkVSVElTSU5HLCBoZGV2KTsKKworCWlmIChzdGF0dXMpIHsKKwkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lOR19JTlNUQU5DRSk7CisJCW1lbXNldCgmaGRldi0+YWR2X2luc3RhbmNlLCAwLCBzaXplb2YoaGRldi0+YWR2X2luc3RhbmNlKSk7CisJCWFkdmVydGlzaW5nX3JlbW92ZWQoY21kID8gY21kLT5zayA6IE5VTEwsIGhkZXYsIDEpOworCX0KKworCWlmICghY21kKQorCQlnb3RvIHVubG9jazsKKworCXJwLmluc3RhbmNlID0gMHgwMTsKKworCWlmIChzdGF0dXMpCisJCW1nbXRfY21kX3N0YXR1cyhjbWQtPnNrLCBjbWQtPmluZGV4LCBjbWQtPm9wY29kZSwKKwkJCQltZ210X3N0YXR1cyhzdGF0dXMpKTsKKwllbHNlCisJCW1nbXRfY21kX2NvbXBsZXRlKGNtZC0+c2ssIGNtZC0+aW5kZXgsIGNtZC0+b3Bjb2RlLAorCQkJCSAgbWdtdF9zdGF0dXMoc3RhdHVzKSwgJnJwLCBzaXplb2YocnApKTsKKworCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKKwordW5sb2NrOgorCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworfQorCitzdGF0aWMgdm9pZCBhZHZfdGltZW91dF9leHBpcmVkKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaGNpX2RldiwKKwkJCQkJICAgIGFkdl9pbnN0YW5jZS50aW1lb3V0X2V4cC53b3JrKTsKKworCWhkZXYtPmFkdl9pbnN0YW5jZS50aW1lb3V0ID0gMDsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKwljbGVhcl9hZHZfaW5zdGFuY2UoaGRldik7CisJaGNpX2Rldl91bmxvY2soaGRldik7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2FkdmVydGlzaW5nKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkgICB2b2lkICpkYXRhLCB1MTYgZGF0YV9sZW4pCit7CisJc3RydWN0IG1nbXRfY3BfYWRkX2FkdmVydGlzaW5nICpjcCA9IGRhdGE7CisJc3RydWN0IG1nbXRfcnBfYWRkX2FkdmVydGlzaW5nIHJwOworCXUzMiBmbGFnczsKKwl1MzIgc3VwcG9ydGVkX2ZsYWdzOworCXU4IHN0YXR1czsKKwl1MTYgdGltZW91dDsKKwlpbnQgZXJyOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CisJc3RydWN0IGhjaV9yZXF1ZXN0IHJlcTsKKworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKworCXN0YXR1cyA9IG1nbXRfbGVfc3VwcG9ydChoZGV2KTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9BRERfQURWRVJUSVNJTkcsCisJCQkJICAgICAgIHN0YXR1cyk7CisKKwlmbGFncyA9IF9fbGUzMl90b19jcHUoY3AtPmZsYWdzKTsKKwl0aW1lb3V0ID0gX19sZTE2X3RvX2NwdShjcC0+dGltZW91dCk7CisKKwkvKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1cHBvcnRzIGFkZGluZyBvbmUgaW5zdGFuY2UgYW5kIG9ubHkKKwkgKiBhIHN1YnNldCBvZiB0aGUgc3BlY2lmaWVkIGZsYWdzLgorCSAqLworCXN1cHBvcnRlZF9mbGFncyA9IGdldF9zdXBwb3J0ZWRfYWR2X2ZsYWdzKGhkZXYpOworCWlmIChjcC0+aW5zdGFuY2UgIT0gMHgwMSB8fCAoZmxhZ3MgJiB+c3VwcG9ydGVkX2ZsYWdzKSkKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfQUREX0FEVkVSVElTSU5HLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwlpZiAodGltZW91dCAmJiAhaGRldl9pc19wb3dlcmVkKGhkZXYpKSB7CisJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfQUREX0FEVkVSVElTSU5HLAorCQkJCSAgICAgIE1HTVRfU1RBVFVTX1JFSkVDVEVEKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaWYgKHBlbmRpbmdfZmluZChNR01UX09QX0FERF9BRFZFUlRJU0lORywgaGRldikgfHwKKwkgICAgcGVuZGluZ19maW5kKE1HTVRfT1BfUkVNT1ZFX0FEVkVSVElTSU5HLCBoZGV2KSB8fAorCSAgICBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfTEUsIGhkZXYpKSB7CisJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfQUREX0FEVkVSVElTSU5HLAorCQkJCSAgICAgIE1HTVRfU1RBVFVTX0JVU1kpOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAoIXRsdl9kYXRhX2lzX3ZhbGlkKGhkZXYsIGZsYWdzLCBjcC0+ZGF0YSwgY3AtPmFkdl9kYXRhX2xlbiwgdHJ1ZSkgfHwKKwkgICAgIXRsdl9kYXRhX2lzX3ZhbGlkKGhkZXYsIGZsYWdzLCBjcC0+ZGF0YSArIGNwLT5hZHZfZGF0YV9sZW4sCisJCQkgICAgICAgY3AtPnNjYW5fcnNwX2xlbiwgZmFsc2UpKSB7CisJCWVyciA9IG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfQUREX0FEVkVSVElTSU5HLAorCQkJCSAgICAgIE1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJSU5JVF9ERUxBWUVEX1dPUksoJmhkZXYtPmFkdl9pbnN0YW5jZS50aW1lb3V0X2V4cCwgYWR2X3RpbWVvdXRfZXhwaXJlZCk7CisKKwloZGV2LT5hZHZfaW5zdGFuY2UuZmxhZ3MgPSBmbGFnczsKKwloZGV2LT5hZHZfaW5zdGFuY2UuYWR2X2RhdGFfbGVuID0gY3AtPmFkdl9kYXRhX2xlbjsKKwloZGV2LT5hZHZfaW5zdGFuY2Uuc2Nhbl9yc3BfbGVuID0gY3AtPnNjYW5fcnNwX2xlbjsKKworCWlmIChjcC0+YWR2X2RhdGFfbGVuKQorCQltZW1jcHkoaGRldi0+YWR2X2luc3RhbmNlLmFkdl9kYXRhLCBjcC0+ZGF0YSwgY3AtPmFkdl9kYXRhX2xlbik7CisKKwlpZiAoY3AtPnNjYW5fcnNwX2xlbikKKwkJbWVtY3B5KGhkZXYtPmFkdl9pbnN0YW5jZS5zY2FuX3JzcF9kYXRhLAorCQkgICAgICAgY3AtPmRhdGEgKyBjcC0+YWR2X2RhdGFfbGVuLCBjcC0+c2Nhbl9yc3BfbGVuKTsKKworCWlmIChoZGV2LT5hZHZfaW5zdGFuY2UudGltZW91dCkKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaGRldi0+YWR2X2luc3RhbmNlLnRpbWVvdXRfZXhwKTsKKworCWhkZXYtPmFkdl9pbnN0YW5jZS50aW1lb3V0ID0gdGltZW91dDsKKworCWlmICh0aW1lb3V0KQorCQlxdWV1ZV9kZWxheWVkX3dvcmsoaGRldi0+d29ya3F1ZXVlLAorCQkJCSAgICZoZGV2LT5hZHZfaW5zdGFuY2UudGltZW91dF9leHAsCisJCQkJICAgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0ICogMTAwMCkpOworCisJaWYgKCFoY2lfZGV2X3Rlc3RfYW5kX3NldF9mbGFnKGhkZXYsIEhDSV9BRFZFUlRJU0lOR19JTlNUQU5DRSkpCisJCWFkdmVydGlzaW5nX2FkZGVkKHNrLCBoZGV2LCAxKTsKKworCS8qIElmIHRoZSBIQ0lfQURWRVJUSVNJTkcgZmxhZyBpcyBzZXQgb3IgdGhlIGRldmljZSBpc24ndCBwb3dlcmVkIHRoZW4KKwkgKiB3ZSBoYXZlIG5vIEhDSSBjb21tdW5pY2F0aW9uIHRvIG1ha2UuIFNpbXBseSByZXR1cm4uCisJICovCisJaWYgKCFoZGV2X2lzX3Bvd2VyZWQoaGRldikgfHwKKwkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HKSkgeworCQlycC5pbnN0YW5jZSA9IDB4MDE7CisJCWVyciA9IG1nbXRfY21kX2NvbXBsZXRlKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9BRERfQURWRVJUSVNJTkcsCisJCQkJCU1HTVRfU1RBVFVTX1NVQ0NFU1MsICZycCwgc2l6ZW9mKHJwKSk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCS8qIFdlJ3JlIGdvb2QgdG8gZ28sIHVwZGF0ZSBhZHZlcnRpc2luZyBkYXRhLCBwYXJhbWV0ZXJzLCBhbmQgc3RhcnQKKwkgKiBhZHZlcnRpc2luZy4KKwkgKi8KKwljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBNR01UX09QX0FERF9BRFZFUlRJU0lORywgaGRldiwgZGF0YSwKKwkJCSAgICAgICBkYXRhX2xlbik7CisJaWYgKCFjbWQpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOworCisJdXBkYXRlX2Fkdl9kYXRhKCZyZXEpOworCXVwZGF0ZV9zY2FuX3JzcF9kYXRhKCZyZXEpOworCWVuYWJsZV9hZHZlcnRpc2luZygmcmVxKTsKKworCWVyciA9IGhjaV9yZXFfcnVuKCZyZXEsIGFkZF9hZHZlcnRpc2luZ19jb21wbGV0ZSk7CisJaWYgKGVyciA8IDApCisJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKKwordW5sb2NrOgorCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2FkdmVydGlzaW5nX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMsCisJCQkJCXUxNiBvcGNvZGUpCit7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9ycF9yZW1vdmVfYWR2ZXJ0aXNpbmcgcnA7CisKKwlCVF9EQkcoInN0YXR1cyAlZCIsIHN0YXR1cyk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwkvKiBBIGZhaWx1cmUgc3RhdHVzIGhlcmUgb25seSBtZWFucyB0aGF0IHdlIGZhaWxlZCB0byBkaXNhYmxlCisJICogYWR2ZXJ0aXNpbmcuIE90aGVyd2lzZSwgdGhlIGFkdmVydGlzaW5nIGluc3RhbmNlIGhhcyBiZWVuIHJlbW92ZWQsCisJICogc28gcmVwb3J0IHN1Y2Nlc3MuCisJICovCisJY21kID0gcGVuZGluZ19maW5kKE1HTVRfT1BfUkVNT1ZFX0FEVkVSVElTSU5HLCBoZGV2KTsKKwlpZiAoIWNtZCkKKwkJZ290byB1bmxvY2s7CisKKwlycC5pbnN0YW5jZSA9IDE7CisKKwltZ210X2NtZF9jb21wbGV0ZShjbWQtPnNrLCBjbWQtPmluZGV4LCBjbWQtPm9wY29kZSwgTUdNVF9TVEFUVVNfU1VDQ0VTUywKKwkJCSAgJnJwLCBzaXplb2YocnApKTsKKwltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CisKK3VubG9jazoKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworc3RhdGljIGludCByZW1vdmVfYWR2ZXJ0aXNpbmcoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCSAgICAgIHZvaWQgKmRhdGEsIHUxNiBkYXRhX2xlbikKK3sKKwlzdHJ1Y3QgbWdtdF9jcF9yZW1vdmVfYWR2ZXJ0aXNpbmcgKmNwID0gZGF0YTsKKwlzdHJ1Y3QgbWdtdF9ycF9yZW1vdmVfYWR2ZXJ0aXNpbmcgcnA7CisJaW50IGVycjsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CisKKwlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CisKKwkvKiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IGFsbG93cyBtb2RpZnlpbmcgaW5zdGFuY2Ugbm8gMS4gQQorCSAqIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoYXQgYWxsIGluc3RhbmNlcyBzaG91bGQgYmUgY2xlYXJlZC4KKwkgKi8KKwlpZiAoY3AtPmluc3RhbmNlID4gMSkKKwkJcmV0dXJuIG1nbXRfY21kX3N0YXR1cyhzaywgaGRldi0+aWQsIE1HTVRfT1BfUkVNT1ZFX0FEVkVSVElTSU5HLAorCQkJCSAgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwlpZiAocGVuZGluZ19maW5kKE1HTVRfT1BfQUREX0FEVkVSVElTSU5HLCBoZGV2KSB8fAorCSAgICBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9SRU1PVkVfQURWRVJUSVNJTkcsIGhkZXYpIHx8CisJICAgIHBlbmRpbmdfZmluZChNR01UX09QX1NFVF9MRSwgaGRldikpIHsKKwkJZXJyID0gbWdtdF9jbWRfc3RhdHVzKHNrLCBoZGV2LT5pZCwgTUdNVF9PUF9SRU1PVkVfQURWRVJUSVNJTkcsCisJCQkJICAgICAgTUdNVF9TVEFUVVNfQlVTWSk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HX0lOU1RBTkNFKSkgeworCQllcnIgPSBtZ210X2NtZF9zdGF0dXMoc2ssIGhkZXYtPmlkLCBNR01UX09QX1JFTU9WRV9BRFZFUlRJU0lORywKKwkJCQkgICAgICBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCWlmIChoZGV2LT5hZHZfaW5zdGFuY2UudGltZW91dCkKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaGRldi0+YWR2X2luc3RhbmNlLnRpbWVvdXRfZXhwKTsKKworCW1lbXNldCgmaGRldi0+YWR2X2luc3RhbmNlLCAwLCBzaXplb2YoaGRldi0+YWR2X2luc3RhbmNlKSk7CisKKwlhZHZlcnRpc2luZ19yZW1vdmVkKHNrLCBoZGV2LCAxKTsKKworCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkdfSU5TVEFOQ0UpOworCisJLyogSWYgdGhlIEhDSV9BRFZFUlRJU0lORyBmbGFnIGlzIHNldCBvciB0aGUgZGV2aWNlIGlzbid0IHBvd2VyZWQgdGhlbgorCSAqIHdlIGhhdmUgbm8gSENJIGNvbW11bmljYXRpb24gdG8gbWFrZS4gU2ltcGx5IHJldHVybi4KKwkgKi8KKwlpZiAoIWhkZXZfaXNfcG93ZXJlZChoZGV2KSB8fAorCSAgICBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkcpKSB7CisJCXJwLmluc3RhbmNlID0gMTsKKwkJZXJyID0gbWdtdF9jbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLAorCQkJCQlNR01UX09QX1JFTU9WRV9BRFZFUlRJU0lORywKKwkJCQkJTUdNVF9TVEFUVVNfU1VDQ0VTUywgJnJwLCBzaXplb2YocnApKTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9SRU1PVkVfQURWRVJUSVNJTkcsIGhkZXYsIGRhdGEsCisJCQkgICAgICAgZGF0YV9sZW4pOworCWlmICghY21kKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gdW5sb2NrOworCX0KKworCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKKwlkaXNhYmxlX2FkdmVydGlzaW5nKCZyZXEpOworCisJZXJyID0gaGNpX3JlcV9ydW4oJnJlcSwgcmVtb3ZlX2FkdmVydGlzaW5nX2NvbXBsZXRlKTsKKwlpZiAoZXJyIDwgMCkKKwkJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOworCit1bmxvY2s6CisJaGNpX2Rldl91bmxvY2soaGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhjaV9tZ210X2hhbmRsZXIgbWdtdF9oYW5kbGVyc1tdID0geworCXsgTlVMTCB9LCAvKiAweDAwMDAgKG5vIGNvbW1hbmQpICovCisJeyByZWFkX3ZlcnNpb24sICAgICAgICAgICAgTUdNVF9SRUFEX1ZFUlNJT05fU0laRSwKKwkJCQkJCUhDSV9NR01UX05PX0hERVYgfAorCQkJCQkJSENJX01HTVRfVU5UUlVTVEVEIH0sCisJeyByZWFkX2NvbW1hbmRzLCAgICAgICAgICAgTUdNVF9SRUFEX0NPTU1BTkRTX1NJWkUsCisJCQkJCQlIQ0lfTUdNVF9OT19IREVWIHwKKwkJCQkJCUhDSV9NR01UX1VOVFJVU1RFRCB9LAorCXsgcmVhZF9pbmRleF9saXN0LCAgICAgICAgIE1HTVRfUkVBRF9JTkRFWF9MSVNUX1NJWkUsCisJCQkJCQlIQ0lfTUdNVF9OT19IREVWIHwKKwkJCQkJCUhDSV9NR01UX1VOVFJVU1RFRCB9LAorCXsgcmVhZF9jb250cm9sbGVyX2luZm8sICAgIE1HTVRfUkVBRF9JTkZPX1NJWkUsCisJCQkJCQlIQ0lfTUdNVF9VTlRSVVNURUQgfSwKKwl7IHNldF9wb3dlcmVkLCAgICAgICAgICAgICBNR01UX1NFVFRJTkdfU0laRSB9LAorCXsgc2V0X2Rpc2NvdmVyYWJsZSwgICAgICAgIE1HTVRfU0VUX0RJU0NPVkVSQUJMRV9TSVpFIH0sCisJeyBzZXRfY29ubmVjdGFibGUsICAgICAgICAgTUdNVF9TRVRUSU5HX1NJWkUgfSwKKwl7IHNldF9mYXN0X2Nvbm5lY3RhYmxlLCAgICBNR01UX1NFVFRJTkdfU0laRSB9LAorCXsgc2V0X2JvbmRhYmxlLCAgICAgICAgICAgIE1HTVRfU0VUVElOR19TSVpFIH0sCisJeyBzZXRfbGlua19zZWN1cml0eSwgICAgICAgTUdNVF9TRVRUSU5HX1NJWkUgfSwKKwl7IHNldF9zc3AsICAgICAgICAgICAgICAgICBNR01UX1NFVFRJTkdfU0laRSB9LAorCXsgc2V0X2hzLCAgICAgICAgICAgICAgICAgIE1HTVRfU0VUVElOR19TSVpFIH0sCisJeyBzZXRfbGUsICAgICAgICAgICAgICAgICAgTUdNVF9TRVRUSU5HX1NJWkUgfSwKKwl7IHNldF9kZXZfY2xhc3MsICAgICAgICAgICBNR01UX1NFVF9ERVZfQ0xBU1NfU0laRSB9LAorCXsgc2V0X2xvY2FsX25hbWUsICAgICAgICAgIE1HTVRfU0VUX0xPQ0FMX05BTUVfU0laRSB9LAorCXsgYWRkX3V1aWQsICAgICAgICAgICAgICAgIE1HTVRfQUREX1VVSURfU0laRSB9LAorCXsgcmVtb3ZlX3V1aWQsICAgICAgICAgICAgIE1HTVRfUkVNT1ZFX1VVSURfU0laRSB9LAorCXsgbG9hZF9saW5rX2tleXMsICAgICAgICAgIE1HTVRfTE9BRF9MSU5LX0tFWVNfU0laRSwKKwkJCQkJCUhDSV9NR01UX1ZBUl9MRU4gfSwKKwl7IGxvYWRfbG9uZ190ZXJtX2tleXMsICAgICBNR01UX0xPQURfTE9OR19URVJNX0tFWVNfU0laRSwKKwkJCQkJCUhDSV9NR01UX1ZBUl9MRU4gfSwKKwl7IGRpc2Nvbm5lY3QsICAgICAgICAgICAgICBNR01UX0RJU0NPTk5FQ1RfU0laRSB9LAorCXsgZ2V0X2Nvbm5lY3Rpb25zLCAgICAgICAgIE1HTVRfR0VUX0NPTk5FQ1RJT05TX1NJWkUgfSwKKwl7IHBpbl9jb2RlX3JlcGx5LCAgICAgICAgICBNR01UX1BJTl9DT0RFX1JFUExZX1NJWkUgfSwKKwl7IHBpbl9jb2RlX25lZ19yZXBseSwgICAgICBNR01UX1BJTl9DT0RFX05FR19SRVBMWV9TSVpFIH0sCisJeyBzZXRfaW9fY2FwYWJpbGl0eSwgICAgICAgTUdNVF9TRVRfSU9fQ0FQQUJJTElUWV9TSVpFIH0sCisJeyBwYWlyX2RldmljZSwgICAgICAgICAgICAgTUdNVF9QQUlSX0RFVklDRV9TSVpFIH0sCisJeyBjYW5jZWxfcGFpcl9kZXZpY2UsICAgICAgTUdNVF9DQU5DRUxfUEFJUl9ERVZJQ0VfU0laRSB9LAorCXsgdW5wYWlyX2RldmljZSwgICAgICAgICAgIE1HTVRfVU5QQUlSX0RFVklDRV9TSVpFIH0sCisJeyB1c2VyX2NvbmZpcm1fcmVwbHksICAgICAgTUdNVF9VU0VSX0NPTkZJUk1fUkVQTFlfU0laRSB9LAorCXsgdXNlcl9jb25maXJtX25lZ19yZXBseSwgIE1HTVRfVVNFUl9DT05GSVJNX05FR19SRVBMWV9TSVpFIH0sCisJeyB1c2VyX3Bhc3NrZXlfcmVwbHksICAgICAgTUdNVF9VU0VSX1BBU1NLRVlfUkVQTFlfU0laRSB9LAorCXsgdXNlcl9wYXNza2V5X25lZ19yZXBseSwgIE1HTVRfVVNFUl9QQVNTS0VZX05FR19SRVBMWV9TSVpFIH0sCisJeyByZWFkX2xvY2FsX29vYl9kYXRhLCAgICAgTUdNVF9SRUFEX0xPQ0FMX09PQl9EQVRBX1NJWkUgfSwKKwl7IGFkZF9yZW1vdGVfb29iX2RhdGEsICAgICBNR01UX0FERF9SRU1PVEVfT09CX0RBVEFfU0laRSwKKwkJCQkJCUhDSV9NR01UX1ZBUl9MRU4gfSwKKwl7IHJlbW92ZV9yZW1vdGVfb29iX2RhdGEsICBNR01UX1JFTU9WRV9SRU1PVEVfT09CX0RBVEFfU0laRSB9LAorCXsgc3RhcnRfZGlzY292ZXJ5LCAgICAgICAgIE1HTVRfU1RBUlRfRElTQ09WRVJZX1NJWkUgfSwKKwl7IHN0b3BfZGlzY292ZXJ5LCAgICAgICAgICBNR01UX1NUT1BfRElTQ09WRVJZX1NJWkUgfSwKKwl7IGNvbmZpcm1fbmFtZSwgICAgICAgICAgICBNR01UX0NPTkZJUk1fTkFNRV9TSVpFIH0sCisJeyBibG9ja19kZXZpY2UsICAgICAgICAgICAgTUdNVF9CTE9DS19ERVZJQ0VfU0laRSB9LAorCXsgdW5ibG9ja19kZXZpY2UsICAgICAgICAgIE1HTVRfVU5CTE9DS19ERVZJQ0VfU0laRSB9LAorCXsgc2V0X2RldmljZV9pZCwgICAgICAgICAgIE1HTVRfU0VUX0RFVklDRV9JRF9TSVpFIH0sCisJeyBzZXRfYWR2ZXJ0aXNpbmcsICAgICAgICAgTUdNVF9TRVRUSU5HX1NJWkUgfSwKKwl7IHNldF9icmVkciwgICAgICAgICAgICAgICBNR01UX1NFVFRJTkdfU0laRSB9LAorCXsgc2V0X3N0YXRpY19hZGRyZXNzLCAgICAgIE1HTVRfU0VUX1NUQVRJQ19BRERSRVNTX1NJWkUgfSwKKwl7IHNldF9zY2FuX3BhcmFtcywgICAgICAgICBNR01UX1NFVF9TQ0FOX1BBUkFNU19TSVpFIH0sCisJeyBzZXRfc2VjdXJlX2Nvbm4sICAgICAgICAgTUdNVF9TRVRUSU5HX1NJWkUgfSwKKwl7IHNldF9kZWJ1Z19rZXlzLCAgICAgICAgICBNR01UX1NFVFRJTkdfU0laRSB9LAorCXsgc2V0X3ByaXZhY3ksICAgICAgICAgICAgIE1HTVRfU0VUX1BSSVZBQ1lfU0laRSB9LAorCXsgbG9hZF9pcmtzLCAgICAgICAgICAgICAgIE1HTVRfTE9BRF9JUktTX1NJWkUsCisJCQkJCQlIQ0lfTUdNVF9WQVJfTEVOIH0sCisJeyBnZXRfY29ubl9pbmZvLCAgICAgICAgICAgTUdNVF9HRVRfQ09OTl9JTkZPX1NJWkUgfSwKKwl7IGdldF9jbG9ja19pbmZvLCAgICAgICAgICBNR01UX0dFVF9DTE9DS19JTkZPX1NJWkUgfSwKKwl7IGFkZF9kZXZpY2UsICAgICAgICAgICAgICBNR01UX0FERF9ERVZJQ0VfU0laRSB9LAorCXsgcmVtb3ZlX2RldmljZSwgICAgICAgICAgIE1HTVRfUkVNT1ZFX0RFVklDRV9TSVpFIH0sCisJeyBsb2FkX2Nvbm5fcGFyYW0sICAgICAgICAgTUdNVF9MT0FEX0NPTk5fUEFSQU1fU0laRSwKKwkJCQkJCUhDSV9NR01UX1ZBUl9MRU4gfSwKKwl7IHJlYWRfdW5jb25mX2luZGV4X2xpc3QsICBNR01UX1JFQURfVU5DT05GX0lOREVYX0xJU1RfU0laRSwKKwkJCQkJCUhDSV9NR01UX05PX0hERVYgfAorCQkJCQkJSENJX01HTVRfVU5UUlVTVEVEIH0sCisJeyByZWFkX2NvbmZpZ19pbmZvLCAgICAgICAgTUdNVF9SRUFEX0NPTkZJR19JTkZPX1NJWkUsCisJCQkJCQlIQ0lfTUdNVF9VTkNPTkZJR1VSRUQgfAorCQkJCQkJSENJX01HTVRfVU5UUlVTVEVEIH0sCisJeyBzZXRfZXh0ZXJuYWxfY29uZmlnLCAgICAgTUdNVF9TRVRfRVhURVJOQUxfQ09ORklHX1NJWkUsCisJCQkJCQlIQ0lfTUdNVF9VTkNPTkZJR1VSRUQgfSwKKwl7IHNldF9wdWJsaWNfYWRkcmVzcywgICAgICBNR01UX1NFVF9QVUJMSUNfQUREUkVTU19TSVpFLAorCQkJCQkJSENJX01HTVRfVU5DT05GSUdVUkVEIH0sCisJeyBzdGFydF9zZXJ2aWNlX2Rpc2NvdmVyeSwgTUdNVF9TVEFSVF9TRVJWSUNFX0RJU0NPVkVSWV9TSVpFLAorCQkJCQkJSENJX01HTVRfVkFSX0xFTiB9LAorCXsgcmVhZF9sb2NhbF9vb2JfZXh0X2RhdGEsIE1HTVRfUkVBRF9MT0NBTF9PT0JfRVhUX0RBVEFfU0laRSB9LAorCXsgcmVhZF9leHRfaW5kZXhfbGlzdCwgICAgIE1HTVRfUkVBRF9FWFRfSU5ERVhfTElTVF9TSVpFLAorCQkJCQkJSENJX01HTVRfTk9fSERFViB8CisJCQkJCQlIQ0lfTUdNVF9VTlRSVVNURUQgfSwKKwl7IHJlYWRfYWR2X2ZlYXR1cmVzLCAgICAgICBNR01UX1JFQURfQURWX0ZFQVRVUkVTX1NJWkUgfSwKKwl7IGFkZF9hZHZlcnRpc2luZywJICAgTUdNVF9BRERfQURWRVJUSVNJTkdfU0laRSwKKwkJCQkJCUhDSV9NR01UX1ZBUl9MRU4gfSwKKwl7IHJlbW92ZV9hZHZlcnRpc2luZywJICAgTUdNVF9SRU1PVkVfQURWRVJUSVNJTkdfU0laRSB9LAorfTsKKwogdm9pZCBtZ210X2luZGV4X2FkZGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewotCWlmIChoZGV2LT5kZXZfdHlwZSAhPSBIQ0lfQlJFRFIpCi0JCXJldHVybjsKKwlzdHJ1Y3QgbWdtdF9ldl9leHRfaW5kZXggZXY7CiAKIAlpZiAodGVzdF9iaXQoSENJX1FVSVJLX1JBV19ERVZJQ0UsICZoZGV2LT5xdWlya3MpKQogCQlyZXR1cm47CiAKLQlpZiAodGVzdF9iaXQoSENJX1VOQ09ORklHVVJFRCwgJmhkZXYtPmRldl9mbGFncykpCi0JCW1nbXRfZXZlbnQoTUdNVF9FVl9VTkNPTkZfSU5ERVhfQURERUQsIGhkZXYsIE5VTEwsIDAsIE5VTEwpOwotCWVsc2UKLQkJbWdtdF9ldmVudChNR01UX0VWX0lOREVYX0FEREVELCBoZGV2LCBOVUxMLCAwLCBOVUxMKTsKKwlzd2l0Y2ggKGhkZXYtPmRldl90eXBlKSB7CisJY2FzZSBIQ0lfQlJFRFI6CisJCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfVU5DT05GSUdVUkVEKSkgeworCQkJbWdtdF9pbmRleF9ldmVudChNR01UX0VWX1VOQ09ORl9JTkRFWF9BRERFRCwgaGRldiwKKwkJCQkJIE5VTEwsIDAsIEhDSV9NR01UX1VOQ09ORl9JTkRFWF9FVkVOVFMpOworCQkJZXYudHlwZSA9IDB4MDE7CisJCX0gZWxzZSB7CisJCQltZ210X2luZGV4X2V2ZW50KE1HTVRfRVZfSU5ERVhfQURERUQsIGhkZXYsIE5VTEwsIDAsCisJCQkJCSBIQ0lfTUdNVF9JTkRFWF9FVkVOVFMpOworCQkJZXYudHlwZSA9IDB4MDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBIQ0lfQU1QOgorCQlldi50eXBlID0gMHgwMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCX0KKworCWV2LmJ1cyA9IGhkZXYtPmJ1czsKKworCW1nbXRfaW5kZXhfZXZlbnQoTUdNVF9FVl9FWFRfSU5ERVhfQURERUQsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwKKwkJCSBIQ0lfTUdNVF9FWFRfSU5ERVhfRVZFTlRTKTsKIH0KIAogdm9pZCBtZ210X2luZGV4X3JlbW92ZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7CisJc3RydWN0IG1nbXRfZXZfZXh0X2luZGV4IGV2OwogCXU4IHN0YXR1cyA9IE1HTVRfU1RBVFVTX0lOVkFMSURfSU5ERVg7CiAKLQlpZiAoaGRldi0+ZGV2X3R5cGUgIT0gSENJX0JSRURSKQotCQlyZXR1cm47Ci0KIAlpZiAodGVzdF9iaXQoSENJX1FVSVJLX1JBV19ERVZJQ0UsICZoZGV2LT5xdWlya3MpKQogCQlyZXR1cm47CiAKLQltZ210X3BlbmRpbmdfZm9yZWFjaCgwLCBoZGV2LCBjbWRfY29tcGxldGVfcnNwLCAmc3RhdHVzKTsKKwlzd2l0Y2ggKGhkZXYtPmRldl90eXBlKSB7CisJY2FzZSBIQ0lfQlJFRFI6CisJCW1nbXRfcGVuZGluZ19mb3JlYWNoKDAsIGhkZXYsIGNtZF9jb21wbGV0ZV9yc3AsICZzdGF0dXMpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9VTkNPTkZJR1VSRUQsICZoZGV2LT5kZXZfZmxhZ3MpKQotCQltZ210X2V2ZW50KE1HTVRfRVZfVU5DT05GX0lOREVYX1JFTU9WRUQsIGhkZXYsIE5VTEwsIDAsIE5VTEwpOwotCWVsc2UKLQkJbWdtdF9ldmVudChNR01UX0VWX0lOREVYX1JFTU9WRUQsIGhkZXYsIE5VTEwsIDAsIE5VTEwpOworCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1VOQ09ORklHVVJFRCkpIHsKKwkJCW1nbXRfaW5kZXhfZXZlbnQoTUdNVF9FVl9VTkNPTkZfSU5ERVhfUkVNT1ZFRCwgaGRldiwKKwkJCQkJIE5VTEwsIDAsIEhDSV9NR01UX1VOQ09ORl9JTkRFWF9FVkVOVFMpOworCQkJZXYudHlwZSA9IDB4MDE7CisJCX0gZWxzZSB7CisJCQltZ210X2luZGV4X2V2ZW50KE1HTVRfRVZfSU5ERVhfUkVNT1ZFRCwgaGRldiwgTlVMTCwgMCwKKwkJCQkJIEhDSV9NR01UX0lOREVYX0VWRU5UUyk7CisJCQlldi50eXBlID0gMHgwMDsKKwkJfQorCQlicmVhazsKKwljYXNlIEhDSV9BTVA6CisJCWV2LnR5cGUgPSAweDAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJZXYuYnVzID0gaGRldi0+YnVzOworCisJbWdtdF9pbmRleF9ldmVudChNR01UX0VWX0VYVF9JTkRFWF9SRU1PVkVELCBoZGV2LCAmZXYsIHNpemVvZihldiksCisJCQkgSENJX01HTVRfRVhUX0lOREVYX0VWRU5UUyk7CiB9CiAKIC8qIFRoaXMgZnVuY3Rpb24gcmVxdWlyZXMgdGhlIGNhbGxlciBob2xkcyBoZGV2LT5sb2NrICovCkBAIC02MzY3LDcgKzczNjUsNyBAQAogCiAJaGNpX3JlcV9pbml0KCZyZXEsIGhkZXYpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9TU1BfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykgJiYKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NTUF9FTkFCTEVEKSAmJgogCSAgICAhbG1wX2hvc3Rfc3NwX2NhcGFibGUoaGRldikpIHsKIAkJdTggbW9kZSA9IDB4MDE7CiAKQEAgLTYzODEsNyArNzM3OSw3IEBACiAJCX0KIAl9CiAKLQlpZiAodGVzdF9iaXQoSENJX0xFX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpICYmCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9FTkFCTEVEKSAmJgogCSAgICBsbXBfYnJlZHJfY2FwYWJsZShoZGV2KSkgewogCQlzdHJ1Y3QgaGNpX2NwX3dyaXRlX2xlX2hvc3Rfc3VwcG9ydGVkIGNwOwogCkBAIC02NDAyLDI0ICs3NDAwLDI4IEBACiAJCSAqIGFkdmVydGlzaW5nIGRhdGEuIFRoaXMgYWxzbyBhcHBsaWVzIHRvIHRoZSBjYXNlCiAJCSAqIHdoZXJlIEJSL0VEUiB3YXMgdG9nZ2xlZCBkdXJpbmcgdGhlIEFVVE9fT0ZGIHBoYXNlLgogCQkgKi8KLQkJaWYgKHRlc3RfYml0KEhDSV9MRV9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX0VOQUJMRUQpKSB7CiAJCQl1cGRhdGVfYWR2X2RhdGEoJnJlcSk7CiAJCQl1cGRhdGVfc2Nhbl9yc3BfZGF0YSgmcmVxKTsKIAkJfQogCi0JCWlmICh0ZXN0X2JpdChIQ0lfQURWRVJUSVNJTkcsICZoZGV2LT5kZXZfZmxhZ3MpKQorCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HKSB8fAorCQkgICAgaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0FEVkVSVElTSU5HX0lOU1RBTkNFKSkKIAkJCWVuYWJsZV9hZHZlcnRpc2luZygmcmVxKTsKIAogCQlyZXN0YXJ0X2xlX2FjdGlvbnMoJnJlcSk7CiAJfQogCi0JbGlua19zZWMgPSB0ZXN0X2JpdChIQ0lfTElOS19TRUNVUklUWSwgJmhkZXYtPmRldl9mbGFncyk7CisJbGlua19zZWMgPSBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTElOS19TRUNVUklUWSk7CiAJaWYgKGxpbmtfc2VjICE9IHRlc3RfYml0KEhDSV9BVVRILCAmaGRldi0+ZmxhZ3MpKQogCQloY2lfcmVxX2FkZCgmcmVxLCBIQ0lfT1BfV1JJVEVfQVVUSF9FTkFCTEUsCiAJCQkgICAgc2l6ZW9mKGxpbmtfc2VjKSwgJmxpbmtfc2VjKTsKIAogCWlmIChsbXBfYnJlZHJfY2FwYWJsZShoZGV2KSkgewotCQl3cml0ZV9mYXN0X2Nvbm5lY3RhYmxlKCZyZXEsIGZhbHNlKTsKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9GQVNUX0NPTk5FQ1RBQkxFKSkKKwkJCXdyaXRlX2Zhc3RfY29ubmVjdGFibGUoJnJlcSwgdHJ1ZSk7CisJCWVsc2UKKwkJCXdyaXRlX2Zhc3RfY29ubmVjdGFibGUoJnJlcSwgZmFsc2UpOwogCQlfX2hjaV91cGRhdGVfcGFnZV9zY2FuKCZyZXEpOwogCQl1cGRhdGVfY2xhc3MoJnJlcSk7CiAJCXVwZGF0ZV9uYW1lKCZyZXEpOwpAQCAtNjQzNSw3ICs3NDM3LDcgQEAKIAl1OCBzdGF0dXMsIHplcm9fY29kW10gPSB7IDAsIDAsIDAgfTsKIAlpbnQgZXJyOwogCi0JaWYgKCF0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfTUdNVCkpCiAJCXJldHVybiAwOwogCiAJaWYgKHBvd2VyZWQpIHsKQEAgLTY0NTYsNyArNzQ1OCw3IEBACiAJICogYmVlbiB0cmlnZ2VyZWQsIHBvdGVudGlhbGx5IGNhdXNpbmcgbWlzbGVhZGluZyBESVNDT05ORUNURUQKIAkgKiBzdGF0dXMgcmVzcG9uc2VzLgogCSAqLwotCWlmICh0ZXN0X2JpdChIQ0lfVU5SRUdJU1RFUiwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VTlJFR0lTVEVSKSkKIAkJc3RhdHVzID0gTUdNVF9TVEFUVVNfSU5WQUxJRF9JTkRFWDsKIAllbHNlCiAJCXN0YXR1cyA9IE1HTVRfU1RBVFVTX05PVF9QT1dFUkVEOwpAQCAtNjQ2NCw4ICs3NDY2LDggQEAKIAltZ210X3BlbmRpbmdfZm9yZWFjaCgwLCBoZGV2LCBjbWRfY29tcGxldGVfcnNwLCAmc3RhdHVzKTsKIAogCWlmIChtZW1jbXAoaGRldi0+ZGV2X2NsYXNzLCB6ZXJvX2NvZCwgc2l6ZW9mKHplcm9fY29kKSkgIT0gMCkKLQkJbWdtdF9ldmVudChNR01UX0VWX0NMQVNTX09GX0RFVl9DSEFOR0VELCBoZGV2LAotCQkJICAgemVyb19jb2QsIHNpemVvZih6ZXJvX2NvZCksIE5VTEwpOworCQltZ210X2dlbmVyaWNfZXZlbnQoTUdNVF9FVl9DTEFTU19PRl9ERVZfQ0hBTkdFRCwgaGRldiwKKwkJCQkgICB6ZXJvX2NvZCwgc2l6ZW9mKHplcm9fY29kKSwgTlVMTCk7CiAKIG5ld19zZXR0aW5nczoKIAllcnIgPSBuZXdfc2V0dGluZ3MoaGRldiwgbWF0Y2guc2spOwpAQCAtNjQ3OCwxMCArNzQ4MCwxMCBAQAogCiB2b2lkIG1nbXRfc2V0X3Bvd2VyZWRfZmFpbGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgZXJyKQogewotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAJdTggc3RhdHVzOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfUE9XRVJFRCwgaGRldik7CisJY21kID0gcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX1BPV0VSRUQsIGhkZXYpOwogCWlmICghY21kKQogCQlyZXR1cm47CiAKQEAgLTY0OTAsNyArNzQ5Miw3IEBACiAJZWxzZQogCQlzdGF0dXMgPSBNR01UX1NUQVRVU19GQUlMRUQ7CiAKLQljbWRfc3RhdHVzKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9QT1dFUkVELCBzdGF0dXMpOworCW1nbXRfY21kX3N0YXR1cyhjbWQtPnNrLCBoZGV2LT5pZCwgTUdNVF9PUF9TRVRfUE9XRVJFRCwgc3RhdHVzKTsKIAogCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIH0KQEAgLTY1MDYsMTcgKzc1MDgsMjMgQEAKIAkgKiBvZiBhIHRpbWVvdXQgdHJpZ2dlcmVkIGZyb20gZ2VuZXJhbCBkaXNjb3ZlcmFibGUsIGl0IGlzCiAJICogc2FmZSB0byB1bmNvbmRpdGlvbmFsbHkgY2xlYXIgdGhlIGZsYWcuCiAJICovCi0JY2xlYXJfYml0KEhDSV9MSU1JVEVEX0RJU0NPVkVSQUJMRSwgJmhkZXYtPmRldl9mbGFncyk7Ci0JY2xlYXJfYml0KEhDSV9ESVNDT1ZFUkFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpOworCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfTElNSVRFRF9ESVNDT1ZFUkFCTEUpOworCWhjaV9kZXZfY2xlYXJfZmxhZyhoZGV2LCBIQ0lfRElTQ09WRVJBQkxFKTsKIAogCWhjaV9yZXFfaW5pdCgmcmVxLCBoZGV2KTsKLQlpZiAodGVzdF9iaXQoSENJX0JSRURSX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CUkVEUl9FTkFCTEVEKSkgewogCQl1OCBzY2FuID0gU0NBTl9QQUdFOwogCQloY2lfcmVxX2FkZCgmcmVxLCBIQ0lfT1BfV1JJVEVfU0NBTl9FTkFCTEUsCiAJCQkgICAgc2l6ZW9mKHNjYW4pLCAmc2Nhbik7CiAJfQogCXVwZGF0ZV9jbGFzcygmcmVxKTsKLQl1cGRhdGVfYWR2X2RhdGEoJnJlcSk7CisKKwkvKiBBZHZlcnRpc2luZyBpbnN0YW5jZXMgZG9uJ3QgdXNlIHRoZSBnbG9iYWwgZGlzY292ZXJhYmxlIHNldHRpbmcsIHNvCisJICogb25seSB1cGRhdGUgQUQgaWYgYWR2ZXJ0aXNpbmcgd2FzIGVuYWJsZWQgdXNpbmcgU2V0IEFkdmVydGlzaW5nLgorCSAqLworCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkcpKQorCQl1cGRhdGVfYWR2X2RhdGEoJnJlcSk7CisKIAloY2lfcmVxX3J1bigmcmVxLCBOVUxMKTsKIAogCWhkZXYtPmRpc2Nvdl90aW1lb3V0ID0gMDsKQEAgLTY2NTQsNyArNzY2Miw3IEBACiAKIAliYWNweSgmZXYua2V5LmFkZHIuYmRhZGRyLCAmY3Nyay0+YmRhZGRyKTsKIAlldi5rZXkuYWRkci50eXBlID0gbGlua190b19iZGFkZHIoTEVfTElOSywgY3Nyay0+YmRhZGRyX3R5cGUpOwotCWV2LmtleS5tYXN0ZXIgPSBjc3JrLT5tYXN0ZXI7CisJZXYua2V5LnR5cGUgPSBjc3JrLT50eXBlOwogCW1lbWNweShldi5rZXkudmFsLCBjc3JrLT52YWwsIHNpemVvZihjc3JrLT52YWwpKTsKIAogCW1nbXRfZXZlbnQoTUdNVF9FVl9ORVdfQ1NSSywgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKQEAgLTY2ODEsMTcgKzc2ODksNiBAQAogCW1nbXRfZXZlbnQoTUdNVF9FVl9ORVdfQ09OTl9QQVJBTSwgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKIH0KIAotc3RhdGljIGlubGluZSB1MTYgZWlyX2FwcGVuZF9kYXRhKHU4ICplaXIsIHUxNiBlaXJfbGVuLCB1OCB0eXBlLCB1OCAqZGF0YSwKLQkJCQkgIHU4IGRhdGFfbGVuKQotewotCWVpcltlaXJfbGVuKytdID0gc2l6ZW9mKHR5cGUpICsgZGF0YV9sZW47Ci0JZWlyW2Vpcl9sZW4rK10gPSB0eXBlOwotCW1lbWNweSgmZWlyW2Vpcl9sZW5dLCBkYXRhLCBkYXRhX2xlbik7Ci0JZWlyX2xlbiArPSBkYXRhX2xlbjsKLQotCXJldHVybiBlaXJfbGVuOwotfQotCiB2b2lkIG1nbXRfZGV2aWNlX2Nvbm5lY3RlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IGhjaV9jb25uICpjb25uLAogCQkJICAgdTMyIGZsYWdzLCB1OCAqbmFtZSwgdTggbmFtZV9sZW4pCiB7CkBAIC02NzI5LDcgKzc3MjYsNyBAQAogCQkgICAgc2l6ZW9mKCpldikgKyBlaXJfbGVuLCBOVUxMKTsKIH0KIAotc3RhdGljIHZvaWQgZGlzY29ubmVjdF9yc3Aoc3RydWN0IHBlbmRpbmdfY21kICpjbWQsIHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBkaXNjb25uZWN0X3JzcChzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBzb2NrICoqc2sgPSBkYXRhOwogCkBAIC02NzQxLDcgKzc3MzgsNyBAQAogCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIH0KIAotc3RhdGljIHZvaWQgdW5wYWlyX2RldmljZV9yc3Aoc3RydWN0IHBlbmRpbmdfY21kICpjbWQsIHZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCB1bnBhaXJfZGV2aWNlX3JzcChzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gZGF0YTsKIAlzdHJ1Y3QgbWdtdF9jcF91bnBhaXJfZGV2aWNlICpjcCA9IGNtZC0+cGFyYW07CkBAIC02NzU0LDEwICs3NzUxLDEwIEBACiAKIGJvb2wgbWdtdF9wb3dlcmluZ19kb3duKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IG1nbXRfbW9kZSAqY3A7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9QT1dFUkVELCBoZGV2KTsKKwljbWQgPSBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfUE9XRVJFRCwgaGRldik7CiAJaWYgKCFjbWQpCiAJCXJldHVybiBmYWxzZTsKIApAQCAtNjgwOSwxMiArNzgwNiwxMiBAQAogewogCXU4IGJkYWRkcl90eXBlID0gbGlua190b19iZGFkZHIobGlua190eXBlLCBhZGRyX3R5cGUpOwogCXN0cnVjdCBtZ210X2NwX2Rpc2Nvbm5lY3QgKmNwOwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAKIAltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX1VOUEFJUl9ERVZJQ0UsIGhkZXYsIHVucGFpcl9kZXZpY2VfcnNwLAogCQkJICAgICBoZGV2KTsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfRElTQ09OTkVDVCwgaGRldik7CisJY21kID0gcGVuZGluZ19maW5kKE1HTVRfT1BfRElTQ09OTkVDVCwgaGRldik7CiAJaWYgKCFjbWQpCiAJCXJldHVybjsKIApAQCAtNjg2NCw5ICs3ODYxLDkgQEAKIHZvaWQgbWdtdF9waW5fY29kZV9yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwKIAkJCQkgIHU4IHN0YXR1cykKIHsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9QSU5fQ09ERV9SRVBMWSwgaGRldik7CisJY21kID0gcGVuZGluZ19maW5kKE1HTVRfT1BfUElOX0NPREVfUkVQTFksIGhkZXYpOwogCWlmICghY21kKQogCQlyZXR1cm47CiAKQEAgLTY4NzcsOSArNzg3NCw5IEBACiB2b2lkIG1nbXRfcGluX2NvZGVfbmVnX3JlcGx5X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLAogCQkJCSAgICAgIHU4IHN0YXR1cykKIHsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9QSU5fQ09ERV9ORUdfUkVQTFksIGhkZXYpOworCWNtZCA9IHBlbmRpbmdfZmluZChNR01UX09QX1BJTl9DT0RFX05FR19SRVBMWSwgaGRldik7CiAJaWYgKCFjbWQpCiAJCXJldHVybjsKIApAQCAtNjkyMiw5ICs3OTE5LDkgQEAKIAkJCQkgICAgICB1OCBsaW5rX3R5cGUsIHU4IGFkZHJfdHlwZSwgdTggc3RhdHVzLAogCQkJCSAgICAgIHU4IG9wY29kZSkKIHsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQob3Bjb2RlLCBoZGV2KTsKKwljbWQgPSBwZW5kaW5nX2ZpbmQob3Bjb2RlLCBoZGV2KTsKIAlpZiAoIWNtZCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKQEAgLTY5ODMsNyArNzk4MCw3IEBACiB2b2lkIG1nbXRfYXV0aF9mYWlsZWQoc3RydWN0IGhjaV9jb25uICpjb25uLCB1OCBoY2lfc3RhdHVzKQogewogCXN0cnVjdCBtZ210X2V2X2F1dGhfZmFpbGVkIGV2OwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQ7CiAJdTggc3RhdHVzID0gbWdtdF9zdGF0dXMoaGNpX3N0YXR1cyk7CiAKIAliYWNweSgmZXYuYWRkci5iZGFkZHIsICZjb25uLT5kc3QpOwpAQCAtNzAxNCwxMSArODAxMSw5IEBACiAJfQogCiAJaWYgKHRlc3RfYml0KEhDSV9BVVRILCAmaGRldi0+ZmxhZ3MpKQotCQljaGFuZ2VkID0gIXRlc3RfYW5kX3NldF9iaXQoSENJX0xJTktfU0VDVVJJVFksCi0JCQkJCSAgICAmaGRldi0+ZGV2X2ZsYWdzKTsKKwkJY2hhbmdlZCA9ICFoY2lfZGV2X3Rlc3RfYW5kX3NldF9mbGFnKGhkZXYsIEhDSV9MSU5LX1NFQ1VSSVRZKTsKIAllbHNlCi0JCWNoYW5nZWQgPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0xJTktfU0VDVVJJVFksCi0JCQkJCSAgICAgJmhkZXYtPmRldl9mbGFncyk7CisJCWNoYW5nZWQgPSBoY2lfZGV2X3Rlc3RfYW5kX2NsZWFyX2ZsYWcoaGRldiwgSENJX0xJTktfU0VDVVJJVFkpOwogCiAJbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9TRVRfTElOS19TRUNVUklUWSwgaGRldiwgc2V0dGluZ3NfcnNwLAogCQkJICAgICAmbWF0Y2gpOwpAQCAtNzA1NCw5ICs4MDQ5LDkgQEAKIAlpZiAoc3RhdHVzKSB7CiAJCXU4IG1nbXRfZXJyID0gbWdtdF9zdGF0dXMoc3RhdHVzKTsKIAotCQlpZiAoZW5hYmxlICYmIHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfU1NQX0VOQUJMRUQsCi0JCQkJCQkgJmhkZXYtPmRldl9mbGFncykpIHsKLQkJCWNsZWFyX2JpdChIQ0lfSFNfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncyk7CisJCWlmIChlbmFibGUgJiYgaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsCisJCQkJCQkJICBIQ0lfU1NQX0VOQUJMRUQpKSB7CisJCQloY2lfZGV2X2NsZWFyX2ZsYWcoaGRldiwgSENJX0hTX0VOQUJMRUQpOwogCQkJbmV3X3NldHRpbmdzKGhkZXYsIE5VTEwpOwogCQl9CiAKQEAgLTcwNjYsMTQgKzgwNjEsMTQgQEAKIAl9CiAKIAlpZiAoZW5hYmxlKSB7Ci0JCWNoYW5nZWQgPSAhdGVzdF9hbmRfc2V0X2JpdChIQ0lfU1NQX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpOworCQljaGFuZ2VkID0gIWhjaV9kZXZfdGVzdF9hbmRfc2V0X2ZsYWcoaGRldiwgSENJX1NTUF9FTkFCTEVEKTsKIAl9IGVsc2UgewotCQljaGFuZ2VkID0gdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9TU1BfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncyk7CisJCWNoYW5nZWQgPSBoY2lfZGV2X3Rlc3RfYW5kX2NsZWFyX2ZsYWcoaGRldiwgSENJX1NTUF9FTkFCTEVEKTsKIAkJaWYgKCFjaGFuZ2VkKQotCQkJY2hhbmdlZCA9IHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfSFNfRU5BQkxFRCwKLQkJCQkJCSAgICAgJmhkZXYtPmRldl9mbGFncyk7CisJCQljaGFuZ2VkID0gaGNpX2Rldl90ZXN0X2FuZF9jbGVhcl9mbGFnKGhkZXYsCisJCQkJCQkJICAgICAgSENJX0hTX0VOQUJMRUQpOwogCQllbHNlCi0JCQljbGVhcl9iaXQoSENJX0hTX0VOQUJMRUQsICZoZGV2LT5kZXZfZmxhZ3MpOworCQkJaGNpX2Rldl9jbGVhcl9mbGFnKGhkZXYsIEhDSV9IU19FTkFCTEVEKTsKIAl9CiAKIAltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX1NFVF9TU1AsIGhkZXYsIHNldHRpbmdzX3JzcCwgJm1hdGNoKTsKQEAgLTcwODYsOCArODA4MSw4IEBACiAKIAloY2lfcmVxX2luaXQoJnJlcSwgaGRldik7CiAKLQlpZiAodGVzdF9iaXQoSENJX1NTUF9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkgewotCQlpZiAodGVzdF9iaXQoSENJX1VTRV9ERUJVR19LRVlTLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NTUF9FTkFCTEVEKSkgeworCQlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1VTRV9ERUJVR19LRVlTKSkKIAkJCWhjaV9yZXFfYWRkKCZyZXEsIEhDSV9PUF9XUklURV9TU1BfREVCVUdfTU9ERSwKIAkJCQkgICAgc2l6ZW9mKGVuYWJsZSksICZlbmFibGUpOwogCQl1cGRhdGVfZWlyKCZyZXEpOwpAQCAtNzA5OCw3ICs4MDkzLDcgQEAKIAloY2lfcmVxX3J1bigmcmVxLCBOVUxMKTsKIH0KIAotc3RhdGljIHZvaWQgc2tfbG9va3VwKHN0cnVjdCBwZW5kaW5nX2NtZCAqY21kLCB2b2lkICpkYXRhKQorc3RhdGljIHZvaWQgc2tfbG9va3VwKHN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNtZF9sb29rdXAgKm1hdGNoID0gZGF0YTsKIApAQCAtNzExOCw4ICs4MTEzLDggQEAKIAltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX1JFTU9WRV9VVUlELCBoZGV2LCBza19sb29rdXAsICZtYXRjaCk7CiAKIAlpZiAoIXN0YXR1cykKLQkJbWdtdF9ldmVudChNR01UX0VWX0NMQVNTX09GX0RFVl9DSEFOR0VELCBoZGV2LCBkZXZfY2xhc3MsIDMsCi0JCQkgICBOVUxMKTsKKwkJbWdtdF9nZW5lcmljX2V2ZW50KE1HTVRfRVZfQ0xBU1NfT0ZfREVWX0NIQU5HRUQsIGhkZXYsCisJCQkJICAgZGV2X2NsYXNzLCAzLCBOVUxMKTsKIAogCWlmIChtYXRjaC5zaykKIAkJc29ja19wdXQobWF0Y2guc2spOwpAQCAtNzEyOCw3ICs4MTIzLDcgQEAKIHZvaWQgbWdtdF9zZXRfbG9jYWxfbmFtZV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggKm5hbWUsIHU4IHN0YXR1cykKIHsKIAlzdHJ1Y3QgbWdtdF9jcF9zZXRfbG9jYWxfbmFtZSBldjsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOwogCiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuOwpAQCAtNzEzNyw1NSArODEzMiwxOSBAQAogCW1lbWNweShldi5uYW1lLCBuYW1lLCBIQ0lfTUFYX05BTUVfTEVOR1RIKTsKIAltZW1jcHkoZXYuc2hvcnRfbmFtZSwgaGRldi0+c2hvcnRfbmFtZSwgSENJX01BWF9TSE9SVF9OQU1FX0xFTkdUSCk7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9MT0NBTF9OQU1FLCBoZGV2KTsKKwljbWQgPSBwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfTE9DQUxfTkFNRSwgaGRldik7CiAJaWYgKCFjbWQpIHsKIAkJbWVtY3B5KGhkZXYtPmRldl9uYW1lLCBuYW1lLCBzaXplb2YoaGRldi0+ZGV2X25hbWUpKTsKIAogCQkvKiBJZiB0aGlzIGlzIGEgSENJIGNvbW1hbmQgcmVsYXRlZCB0byBwb3dlcmluZyBvbiB0aGUKIAkJICogSENJIGRldiBkb24ndCBzZW5kIGFueSBtZ210IHNpZ25hbHMuCiAJCSAqLwotCQlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfUE9XRVJFRCwgaGRldikpCisJCWlmIChwZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfUE9XRVJFRCwgaGRldikpCiAJCQlyZXR1cm47CiAJfQogCi0JbWdtdF9ldmVudChNR01UX0VWX0xPQ0FMX05BTUVfQ0hBTkdFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLAotCQkgICBjbWQgPyBjbWQtPnNrIDogTlVMTCk7Ci19Ci0KLXZvaWQgbWdtdF9yZWFkX2xvY2FsX29vYl9kYXRhX2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqaGFzaDE5MiwKLQkJCQkgICAgICAgdTggKnJhbmQxOTIsIHU4ICpoYXNoMjU2LCB1OCAqcmFuZDI1NiwKLQkJCQkgICAgICAgdTggc3RhdHVzKQotewotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwotCi0JQlRfREJHKCIlcyBzdGF0dXMgJXUiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOwotCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLCBoZGV2KTsKLQlpZiAoIWNtZCkKLQkJcmV0dXJuOwotCi0JaWYgKHN0YXR1cykgewotCQljbWRfc3RhdHVzKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCi0JCQkgICBtZ210X3N0YXR1cyhzdGF0dXMpKTsKLQl9IGVsc2UgewotCQlzdHJ1Y3QgbWdtdF9ycF9yZWFkX2xvY2FsX29vYl9kYXRhIHJwOwotCQlzaXplX3QgcnBfc2l6ZSA9IHNpemVvZihycCk7Ci0KLQkJbWVtY3B5KHJwLmhhc2gxOTIsIGhhc2gxOTIsIHNpemVvZihycC5oYXNoMTkyKSk7Ci0JCW1lbWNweShycC5yYW5kMTkyLCByYW5kMTkyLCBzaXplb2YocnAucmFuZDE5MikpOwotCi0JCWlmIChicmVkcl9zY19lbmFibGVkKGhkZXYpICYmIGhhc2gyNTYgJiYgcmFuZDI1NikgewotCQkJbWVtY3B5KHJwLmhhc2gyNTYsIGhhc2gyNTYsIHNpemVvZihycC5oYXNoMjU2KSk7Ci0JCQltZW1jcHkocnAucmFuZDI1NiwgcmFuZDI1Niwgc2l6ZW9mKHJwLnJhbmQyNTYpKTsKLQkJfSBlbHNlIHsKLQkJCXJwX3NpemUgLT0gc2l6ZW9mKHJwLmhhc2gyNTYpICsgc2l6ZW9mKHJwLnJhbmQyNTYpOwotCQl9Ci0KLQkJY21kX2NvbXBsZXRlKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsIDAsCi0JCQkgICAgICZycCwgcnBfc2l6ZSk7Ci0JfQotCi0JbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOworCW1nbXRfZ2VuZXJpY19ldmVudChNR01UX0VWX0xPQ0FMX05BTUVfQ0hBTkdFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLAorCQkJICAgY21kID8gY21kLT5zayA6IE5VTEwpOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaGFzX3V1aWQodTggKnV1aWQsIHUxNiB1dWlkX2NvdW50LCB1OCAoKnV1aWRzKVsxNl0pCkBAIC03MjU4LDcgKzgyMTcsNyBAQAogc3RhdGljIHZvaWQgcmVzdGFydF9sZV9zY2FuKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewogCS8qIElmIGNvbnRyb2xsZXIgaXMgbm90IHNjYW5uaW5nIHdlIGFyZSBkb25lLiAqLwotCWlmICghdGVzdF9iaXQoSENJX0xFX1NDQU4sICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0xFX1NDQU4pKQogCQlyZXR1cm47CiAKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzICsgRElTQ09WX0xFX1JFU1RBUlRfREVMQVksCkBAIC03MjcwLDE0ICs4MjI5LDU4IEBACiAJCQkgICBESVNDT1ZfTEVfUkVTVEFSVF9ERUxBWSk7CiB9CiAKK3N0YXRpYyBib29sIGlzX2ZpbHRlcl9tYXRjaChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgczggcnNzaSwgdTggKmVpciwKKwkJCSAgICB1MTYgZWlyX2xlbiwgdTggKnNjYW5fcnNwLCB1OCBzY2FuX3JzcF9sZW4pCit7CisJLyogSWYgYSBSU1NJIHRocmVzaG9sZCBoYXMgYmVlbiBzcGVjaWZpZWQsIGFuZAorCSAqIEhDSV9RVUlSS19TVFJJQ1RfRFVQTElDQVRFX0ZJTFRFUiBpcyBub3Qgc2V0LCB0aGVuIGFsbCByZXN1bHRzIHdpdGgKKwkgKiBhIFJTU0kgc21hbGxlciB0aGFuIHRoZSBSU1NJIHRocmVzaG9sZCB3aWxsIGJlIGRyb3BwZWQuIElmIHRoZSBxdWlyaworCSAqIGlzIHNldCwgbGV0IGl0IHRocm91Z2ggZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZywgYXMgd2UgbWlnaHQgbmVlZCB0bworCSAqIHJlc3RhcnQgdGhlIHNjYW4uCisJICoKKwkgKiBGb3IgQlIvRURSIGRldmljZXMgKHByZSAxLjIpIHByb3ZpZGluZyBubyBSU1NJIGR1cmluZyBpbnF1aXJ5LAorCSAqIHRoZSByZXN1bHRzIGFyZSBhbHNvIGRyb3BwZWQuCisJICovCisJaWYgKGhkZXYtPmRpc2NvdmVyeS5yc3NpICE9IEhDSV9SU1NJX0lOVkFMSUQgJiYKKwkgICAgKHJzc2kgPT0gSENJX1JTU0lfSU5WQUxJRCB8fAorCSAgICAocnNzaSA8IGhkZXYtPmRpc2NvdmVyeS5yc3NpICYmCisJICAgICAhdGVzdF9iaXQoSENJX1FVSVJLX1NUUklDVF9EVVBMSUNBVEVfRklMVEVSLCAmaGRldi0+cXVpcmtzKSkpKQorCQlyZXR1cm4gIGZhbHNlOworCisJaWYgKGhkZXYtPmRpc2NvdmVyeS51dWlkX2NvdW50ICE9IDApIHsKKwkJLyogSWYgYSBsaXN0IG9mIFVVSURzIGlzIHByb3ZpZGVkIGluIGZpbHRlciwgcmVzdWx0cyB3aXRoIG5vCisJCSAqIG1hdGNoaW5nIFVVSUQgc2hvdWxkIGJlIGRyb3BwZWQuCisJCSAqLworCQlpZiAoIWVpcl9oYXNfdXVpZHMoZWlyLCBlaXJfbGVuLCBoZGV2LT5kaXNjb3ZlcnkudXVpZF9jb3VudCwKKwkJCQkgICBoZGV2LT5kaXNjb3ZlcnkudXVpZHMpICYmCisJCSAgICAhZWlyX2hhc191dWlkcyhzY2FuX3JzcCwgc2Nhbl9yc3BfbGVuLAorCQkJCSAgIGhkZXYtPmRpc2NvdmVyeS51dWlkX2NvdW50LAorCQkJCSAgIGhkZXYtPmRpc2NvdmVyeS51dWlkcykpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogSWYgZHVwbGljYXRlIGZpbHRlcmluZyBkb2VzIG5vdCByZXBvcnQgUlNTSSBjaGFuZ2VzLCB0aGVuIHJlc3RhcnQKKwkgKiBzY2FubmluZyB0byBlbnN1cmUgdXBkYXRlZCByZXN1bHQgd2l0aCB1cGRhdGVkIFJTU0kgdmFsdWVzLgorCSAqLworCWlmICh0ZXN0X2JpdChIQ0lfUVVJUktfU1RSSUNUX0RVUExJQ0FURV9GSUxURVIsICZoZGV2LT5xdWlya3MpKSB7CisJCXJlc3RhcnRfbGVfc2NhbihoZGV2KTsKKworCQkvKiBWYWxpZGF0ZSBSU1NJIHZhbHVlIGFnYWluc3QgdGhlIFJTU0kgdGhyZXNob2xkIG9uY2UgbW9yZS4gKi8KKwkJaWYgKGhkZXYtPmRpc2NvdmVyeS5yc3NpICE9IEhDSV9SU1NJX0lOVkFMSUQgJiYKKwkJICAgIHJzc2kgPCBoZGV2LT5kaXNjb3ZlcnkucnNzaSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBtZ210X2RldmljZV9mb3VuZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgdTggbGlua190eXBlLAogCQkgICAgICAgdTggYWRkcl90eXBlLCB1OCAqZGV2X2NsYXNzLCBzOCByc3NpLCB1MzIgZmxhZ3MsCiAJCSAgICAgICB1OCAqZWlyLCB1MTYgZWlyX2xlbiwgdTggKnNjYW5fcnNwLCB1OCBzY2FuX3JzcF9sZW4pCiB7CiAJY2hhciBidWZbNTEyXTsKLQlzdHJ1Y3QgbWdtdF9ldl9kZXZpY2VfZm91bmQgKmV2ID0gKHZvaWQgKikgYnVmOworCXN0cnVjdCBtZ210X2V2X2RldmljZV9mb3VuZCAqZXYgPSAodm9pZCAqKWJ1ZjsKIAlzaXplX3QgZXZfc2l6ZTsKLQlib29sIG1hdGNoOwogCiAJLyogRG9uJ3Qgc2VuZCBldmVudHMgZm9yIGEgbm9uLWtlcm5lbCBpbml0aWF0ZWQgZGlzY292ZXJ5LiBXaXRoCiAJICogTEUgb25lIGV4Y2VwdGlvbiBpcyBpZiB3ZSBoYXZlIHBlbmRfbGVfcmVwb3J0cyA+IDAgaW4gd2hpY2gKQEAgLTcyOTAsMjEgKzgyOTMsMTIgQEAKIAkJCXJldHVybjsKIAl9CiAKLQkvKiBXaGVuIHVzaW5nIHNlcnZpY2UgZGlzY292ZXJ5IHdpdGggYSBSU1NJIHRocmVzaG9sZCwgdGhlbiBjaGVjawotCSAqIGlmIHN1Y2ggYSBSU1NJIHRocmVzaG9sZCBpcyBzcGVjaWZpZWQuIElmIGEgUlNTSSB0aHJlc2hvbGQgaGFzCi0JICogYmVlbiBzcGVjaWZpZWQsIGFuZCBIQ0lfUVVJUktfU1RSSUNUX0RVUExJQ0FURV9GSUxURVIgaXMgbm90IHNldCwKLQkgKiB0aGVuIGFsbCByZXN1bHRzIHdpdGggYSBSU1NJIHNtYWxsZXIgdGhhbiB0aGUgUlNTSSB0aHJlc2hvbGQgd2lsbCBiZQotCSAqIGRyb3BwZWQuIElmIHRoZSBxdWlyayBpcyBzZXQsIGxldCBpdCB0aHJvdWdoIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcsCi0JICogYXMgd2UgbWlnaHQgbmVlZCB0byByZXN0YXJ0IHRoZSBzY2FuLgotCSAqCi0JICogRm9yIEJSL0VEUiBkZXZpY2VzIChwcmUgMS4yKSBwcm92aWRpbmcgbm8gUlNTSSBkdXJpbmcgaW5xdWlyeSwKLQkgKiB0aGUgcmVzdWx0cyBhcmUgYWxzbyBkcm9wcGVkLgotCSAqLwotCWlmIChoZGV2LT5kaXNjb3ZlcnkucnNzaSAhPSBIQ0lfUlNTSV9JTlZBTElEICYmCi0JICAgIChyc3NpID09IEhDSV9SU1NJX0lOVkFMSUQgfHwKLQkgICAgKHJzc2kgPCBoZGV2LT5kaXNjb3ZlcnkucnNzaSAmJgotCSAgICAgIXRlc3RfYml0KEhDSV9RVUlSS19TVFJJQ1RfRFVQTElDQVRFX0ZJTFRFUiwgJmhkZXYtPnF1aXJrcykpKSkKLQkJcmV0dXJuOworCWlmIChoZGV2LT5kaXNjb3ZlcnkucmVzdWx0X2ZpbHRlcmluZykgeworCQkvKiBXZSBhcmUgdXNpbmcgc2VydmljZSBkaXNjb3ZlcnkgKi8KKwkJaWYgKCFpc19maWx0ZXJfbWF0Y2goaGRldiwgcnNzaSwgZWlyLCBlaXJfbGVuLCBzY2FuX3JzcCwKKwkJCQkgICAgIHNjYW5fcnNwX2xlbikpCisJCQlyZXR1cm47CisJfQogCiAJLyogTWFrZSBzdXJlIHRoYXQgdGhlIGJ1ZmZlciBpcyBiaWcgZW5vdWdoLiBUaGUgNSBleHRyYSBieXRlcwogCSAqIGFyZSBmb3IgdGhlIHBvdGVudGlhbCBDb0QgZmllbGQuCkBAIC03MzMxLDg3ICs4MzI1LDE3IEBACiAJZXYtPnJzc2kgPSByc3NpOwogCWV2LT5mbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKIAotCWlmIChlaXJfbGVuID4gMCkgewotCQkvKiBXaGVuIHVzaW5nIHNlcnZpY2UgZGlzY292ZXJ5IGFuZCBhIGxpc3Qgb2YgVVVJRCBpcwotCQkgKiBwcm92aWRlZCwgcmVzdWx0cyB3aXRoIG5vIG1hdGNoaW5nIFVVSUQgc2hvdWxkIGJlCi0JCSAqIGRyb3BwZWQuIEluIGNhc2UgdGhlcmUgaXMgYSBtYXRjaCB0aGUgcmVzdWx0IGlzCi0JCSAqIGtlcHQgYW5kIGNoZWNraW5nIHBvc3NpYmxlIHNjYW4gcmVzcG9uc2UgZGF0YQotCQkgKiB3aWxsIGJlIHNraXBwZWQuCi0JCSAqLwotCQlpZiAoaGRldi0+ZGlzY292ZXJ5LnV1aWRfY291bnQgPiAwKSB7Ci0JCQltYXRjaCA9IGVpcl9oYXNfdXVpZHMoZWlyLCBlaXJfbGVuLAotCQkJCQkgICAgICBoZGV2LT5kaXNjb3ZlcnkudXVpZF9jb3VudCwKLQkJCQkJICAgICAgaGRldi0+ZGlzY292ZXJ5LnV1aWRzKTsKLQkJCS8qIElmIGR1cGxpY2F0ZSBmaWx0ZXJpbmcgZG9lcyBub3QgcmVwb3J0IFJTU0kgY2hhbmdlcywKLQkJCSAqIHRoZW4gcmVzdGFydCBzY2FubmluZyB0byBlbnN1cmUgdXBkYXRlZCByZXN1bHQgd2l0aAotCQkJICogdXBkYXRlZCBSU1NJIHZhbHVlcy4KLQkJCSAqLwotCQkJaWYgKG1hdGNoICYmIHRlc3RfYml0KEhDSV9RVUlSS19TVFJJQ1RfRFVQTElDQVRFX0ZJTFRFUiwKLQkJCQkJICAgICAgJmhkZXYtPnF1aXJrcykpCi0JCQkJcmVzdGFydF9sZV9zY2FuKGhkZXYpOwotCQl9IGVsc2UgewotCQkJbWF0Y2ggPSB0cnVlOwotCQl9Ci0KLQkJaWYgKCFtYXRjaCAmJiAhc2Nhbl9yc3BfbGVuKQotCQkJcmV0dXJuOwotCisJaWYgKGVpcl9sZW4gPiAwKQogCQkvKiBDb3B5IEVJUiBvciBhZHZlcnRpc2luZyBkYXRhIGludG8gZXZlbnQgKi8KIAkJbWVtY3B5KGV2LT5laXIsIGVpciwgZWlyX2xlbik7Ci0JfSBlbHNlIHsKLQkJLyogV2hlbiB1c2luZyBzZXJ2aWNlIGRpc2NvdmVyeSBhbmQgYSBsaXN0IG9mIFVVSUQgaXMKLQkJICogcHJvdmlkZWQsIHJlc3VsdHMgd2l0aCBlbXB0eSBFSVIgb3IgYWR2ZXJ0aXNpbmcgZGF0YQotCQkgKiBzaG91bGQgYmUgZHJvcHBlZCBzaW5jZSB0aGV5IGRvIG5vdCBtYXRjaCBhbnkgVVVJRC4KLQkJICovCi0JCWlmIChoZGV2LT5kaXNjb3ZlcnkudXVpZF9jb3VudCA+IDAgJiYgIXNjYW5fcnNwX2xlbikKLQkJCXJldHVybjsKLQotCQltYXRjaCA9IGZhbHNlOwotCX0KIAogCWlmIChkZXZfY2xhc3MgJiYgIWVpcl9oYXNfZGF0YV90eXBlKGV2LT5laXIsIGVpcl9sZW4sIEVJUl9DTEFTU19PRl9ERVYpKQogCQllaXJfbGVuID0gZWlyX2FwcGVuZF9kYXRhKGV2LT5laXIsIGVpcl9sZW4sIEVJUl9DTEFTU19PRl9ERVYsCiAJCQkJCSAgZGV2X2NsYXNzLCAzKTsKIAotCWlmIChzY2FuX3JzcF9sZW4gPiAwKSB7Ci0JCS8qIFdoZW4gdXNpbmcgc2VydmljZSBkaXNjb3ZlcnkgYW5kIGEgbGlzdCBvZiBVVUlEIGlzCi0JCSAqIHByb3ZpZGVkLCByZXN1bHRzIHdpdGggbm8gbWF0Y2hpbmcgVVVJRCBzaG91bGQgYmUKLQkJICogZHJvcHBlZCBpZiB0aGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCBmcm9tIHRoZQotCQkgKiBhZHZlcnRpc2luZyBkYXRhLgotCQkgKi8KLQkJaWYgKGhkZXYtPmRpc2NvdmVyeS51dWlkX2NvdW50ID4gMCkgewotCQkJaWYgKCFtYXRjaCAmJiAhZWlyX2hhc191dWlkcyhzY2FuX3JzcCwgc2Nhbl9yc3BfbGVuLAotCQkJCQkJICAgICBoZGV2LT5kaXNjb3ZlcnkudXVpZF9jb3VudCwKLQkJCQkJCSAgICAgaGRldi0+ZGlzY292ZXJ5LnV1aWRzKSkKLQkJCQlyZXR1cm47Ci0KLQkJCS8qIElmIGR1cGxpY2F0ZSBmaWx0ZXJpbmcgZG9lcyBub3QgcmVwb3J0IFJTU0kgY2hhbmdlcywKLQkJCSAqIHRoZW4gcmVzdGFydCBzY2FubmluZyB0byBlbnN1cmUgdXBkYXRlZCByZXN1bHQgd2l0aAotCQkJICogdXBkYXRlZCBSU1NJIHZhbHVlcy4KLQkJCSAqLwotCQkJaWYgKHRlc3RfYml0KEhDSV9RVUlSS19TVFJJQ1RfRFVQTElDQVRFX0ZJTFRFUiwKLQkJCQkgICAgICZoZGV2LT5xdWlya3MpKQotCQkJCXJlc3RhcnRfbGVfc2NhbihoZGV2KTsKLQkJfQotCisJaWYgKHNjYW5fcnNwX2xlbiA+IDApCiAJCS8qIEFwcGVuZCBzY2FuIHJlc3BvbnNlIGRhdGEgdG8gZXZlbnQgKi8KIAkJbWVtY3B5KGV2LT5laXIgKyBlaXJfbGVuLCBzY2FuX3JzcCwgc2Nhbl9yc3BfbGVuKTsKLQl9IGVsc2UgewotCQkvKiBXaGVuIHVzaW5nIHNlcnZpY2UgZGlzY292ZXJ5IGFuZCBhIGxpc3Qgb2YgVVVJRCBpcwotCQkgKiBwcm92aWRlZCwgcmVzdWx0cyB3aXRoIGVtcHR5IHNjYW4gcmVzcG9uc2UgYW5kIG5vCi0JCSAqIHByZXZpb3VzIG1hdGNoZWQgYWR2ZXJ0aXNpbmcgZGF0YSBzaG91bGQgYmUgZHJvcHBlZC4KLQkJICovCi0JCWlmIChoZGV2LT5kaXNjb3ZlcnkudXVpZF9jb3VudCA+IDAgJiYgIW1hdGNoKQotCQkJcmV0dXJuOwotCX0KLQotCS8qIFZhbGlkYXRlIHRoZSByZXBvcnRlZCBSU1NJIHZhbHVlIGFnYWluc3QgdGhlIFJTU0kgdGhyZXNob2xkIG9uY2UgbW9yZQotCSAqIGluY2FzZSBIQ0lfUVVJUktfU1RSSUNUX0RVUExJQ0FURV9GSUxURVIgZm9yY2VkIGEgcmVzdGFydCBvZiBMRQotCSAqIHNjYW5uaW5nLgotCSAqLwotCWlmIChoZGV2LT5kaXNjb3ZlcnkucnNzaSAhPSBIQ0lfUlNTSV9JTlZBTElEICYmCi0JICAgIHJzc2kgPCBoZGV2LT5kaXNjb3ZlcnkucnNzaSkKLQkJcmV0dXJuOwogCiAJZXYtPmVpcl9sZW4gPSBjcHVfdG9fbGUxNihlaXJfbGVuICsgc2Nhbl9yc3BfbGVuKTsKIAlldl9zaXplID0gc2l6ZW9mKCpldikgKyBlaXJfbGVuICsgc2Nhbl9yc3BfbGVuOwpAQCAtNzQ2NCwxMCArODM4OCwyOCBAQAogewogCXN0cnVjdCBoY2lfcmVxdWVzdCByZXE7CiAKLQlpZiAoIXRlc3RfYml0KEhDSV9BRFZFUlRJU0lORywgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkcpICYmCisJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfQURWRVJUSVNJTkdfSU5TVEFOQ0UpKQogCQlyZXR1cm47CiAKIAloY2lfcmVxX2luaXQoJnJlcSwgaGRldik7CiAJZW5hYmxlX2FkdmVydGlzaW5nKCZyZXEpOwogCWhjaV9yZXFfcnVuKCZyZXEsIGFkdl9lbmFibGVfY29tcGxldGUpOwogfQorCitzdGF0aWMgc3RydWN0IGhjaV9tZ210X2NoYW4gY2hhbiA9IHsKKwkuY2hhbm5lbAk9IEhDSV9DSEFOTkVMX0NPTlRST0wsCisJLmhhbmRsZXJfY291bnQJPSBBUlJBWV9TSVpFKG1nbXRfaGFuZGxlcnMpLAorCS5oYW5kbGVycwk9IG1nbXRfaGFuZGxlcnMsCisJLmhkZXZfaW5pdAk9IG1nbXRfaW5pdF9oZGV2LAorfTsKKworaW50IG1nbXRfaW5pdCh2b2lkKQoreworCXJldHVybiBoY2lfbWdtdF9jaGFuX3JlZ2lzdGVyKCZjaGFuKTsKK30KKwordm9pZCBtZ210X2V4aXQodm9pZCkKK3sKKwloY2lfbWdtdF9jaGFuX3VucmVnaXN0ZXIoJmNoYW4pOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9tZ210X3V0aWwuYyBiL25ldC9ibHVldG9vdGgvbWdtdF91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzMGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9ibHVldG9vdGgvbWdtdF91dGlsLmMKQEAgLTAsMCArMSwyMTAgQEAKKy8qCisgICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKKworICAgQ29weXJpZ2h0IChDKSAyMDE1ICBJbnRlbCBDb3Jwb3JhdGlvbgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworCisgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICAgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4KKyAgIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEFORCBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkKKyAgIENMQUlNLCBPUiBBTlkgU1BFQ0lBTCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMsIE9SIEFOWSBEQU1BR0VTCisgICBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAgIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgICBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorCisgICBBTEwgTElBQklMSVRZLCBJTkNMVURJTkcgTElBQklMSVRZIEZPUiBJTkZSSU5HRU1FTlQgT0YgQU5ZIFBBVEVOVFMsCisgICBDT1BZUklHSFRTLCBUUkFERU1BUktTIE9SIE9USEVSIFJJR0hUUywgUkVMQVRJTkcgVE8gVVNFIE9GIFRISVMKKyAgIFNPRlRXQVJFIElTIERJU0NMQUlNRUQuCisqLworCisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CisjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9tZ210Lmg+CisKKyNpbmNsdWRlICJtZ210X3V0aWwuaCIKKworaW50IG1nbXRfc2VuZF9ldmVudCh1MTYgZXZlbnQsIHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1bnNpZ25lZCBzaG9ydCBjaGFubmVsLAorCQkgICAgdm9pZCAqZGF0YSwgdTE2IGRhdGFfbGVuLCBpbnQgZmxhZywgc3RydWN0IHNvY2sgKnNraXBfc2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbWdtdF9oZHIgKmhkcjsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplb2YoKmhkcikgKyBkYXRhX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJaGRyID0gKHZvaWQgKikgc2tiX3B1dChza2IsIHNpemVvZigqaGRyKSk7CisJaGRyLT5vcGNvZGUgPSBjcHVfdG9fbGUxNihldmVudCk7CisJaWYgKGhkZXYpCisJCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihoZGV2LT5pZCk7CisJZWxzZQorCQloZHItPmluZGV4ID0gY3B1X3RvX2xlMTYoTUdNVF9JTkRFWF9OT05FKTsKKwloZHItPmxlbiA9IGNwdV90b19sZTE2KGRhdGFfbGVuKTsKKworCWlmIChkYXRhKQorCQltZW1jcHkoc2tiX3B1dChza2IsIGRhdGFfbGVuKSwgZGF0YSwgZGF0YV9sZW4pOworCisJLyogVGltZSBzdGFtcCAqLworCV9fbmV0X3RpbWVzdGFtcChza2IpOworCisJaGNpX3NlbmRfdG9fY2hhbm5lbChjaGFubmVsLCBza2IsIGZsYWcsIHNraXBfc2spOworCWtmcmVlX3NrYihza2IpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtZ210X2NtZF9zdGF0dXMoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHUxNiBjbWQsIHU4IHN0YXR1cykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBtZ210X2hkciAqaGRyOworCXN0cnVjdCBtZ210X2V2X2NtZF9zdGF0dXMgKmV2OworCWludCBlcnI7CisKKwlCVF9EQkcoInNvY2sgJXAsIGluZGV4ICV1LCBjbWQgJXUsIHN0YXR1cyAldSIsIHNrLCBpbmRleCwgY21kLCBzdGF0dXMpOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemVvZigqaGRyKSArIHNpemVvZigqZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloZHIgPSAodm9pZCAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKCpoZHIpKTsKKworCWhkci0+b3Bjb2RlID0gY3B1X3RvX2xlMTYoTUdNVF9FVl9DTURfU1RBVFVTKTsKKwloZHItPmluZGV4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOworCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpldikpOworCisJZXYgPSAodm9pZCAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKCpldikpOworCWV2LT5zdGF0dXMgPSBzdGF0dXM7CisJZXYtPm9wY29kZSA9IGNwdV90b19sZTE2KGNtZCk7CisKKwllcnIgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CisJaWYgKGVyciA8IDApCisJCWtmcmVlX3NrYihza2IpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IG1nbXRfY21kX2NvbXBsZXRlKHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB1MTYgY21kLCB1OCBzdGF0dXMsCisJCSAgICAgIHZvaWQgKnJwLCBzaXplX3QgcnBfbGVuKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG1nbXRfaGRyICpoZHI7CisJc3RydWN0IG1nbXRfZXZfY21kX2NvbXBsZXRlICpldjsKKwlpbnQgZXJyOworCisJQlRfREJHKCJzb2NrICVwIiwgc2spOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemVvZigqaGRyKSArIHNpemVvZigqZXYpICsgcnBfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloZHIgPSAodm9pZCAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKCpoZHIpKTsKKworCWhkci0+b3Bjb2RlID0gY3B1X3RvX2xlMTYoTUdNVF9FVl9DTURfQ09NUExFVEUpOworCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihpbmRleCk7CisJaGRyLT5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKmV2KSArIHJwX2xlbik7CisKKwlldiA9ICh2b2lkICopIHNrYl9wdXQoc2tiLCBzaXplb2YoKmV2KSArIHJwX2xlbik7CisJZXYtPm9wY29kZSA9IGNwdV90b19sZTE2KGNtZCk7CisJZXYtPnN0YXR1cyA9IHN0YXR1czsKKworCWlmIChycCkKKwkJbWVtY3B5KGV2LT5kYXRhLCBycCwgcnBfbGVuKTsKKworCWVyciA9IHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKKwlpZiAoZXJyIDwgMCkKKwkJa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqbWdtdF9wZW5kaW5nX2ZpbmQodW5zaWduZWQgc2hvcnQgY2hhbm5lbCwgdTE2IG9wY29kZSwKKwkJCQkJICAgc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY21kLCAmaGRldi0+bWdtdF9wZW5kaW5nLCBsaXN0KSB7CisJCWlmIChoY2lfc29ja19nZXRfY2hhbm5lbChjbWQtPnNrKSAhPSBjaGFubmVsKQorCQkJY29udGludWU7CisJCWlmIChjbWQtPm9wY29kZSA9PSBvcGNvZGUpCisJCQlyZXR1cm4gY21kOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqbWdtdF9wZW5kaW5nX2ZpbmRfZGF0YSh1bnNpZ25lZCBzaG9ydCBjaGFubmVsLAorCQkJCQkJdTE2IG9wY29kZSwKKwkJCQkJCXN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCQkJY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbWQsICZoZGV2LT5tZ210X3BlbmRpbmcsIGxpc3QpIHsKKwkJaWYgKGNtZC0+dXNlcl9kYXRhICE9IGRhdGEpCisJCQljb250aW51ZTsKKwkJaWYgKGNtZC0+b3Bjb2RlID09IG9wY29kZSkKKwkJCXJldHVybiBjbWQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgbWdtdF9wZW5kaW5nX2ZvcmVhY2godTE2IG9wY29kZSwgc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkgIHZvaWQgKCpjYikoc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZCwgdm9pZCAqZGF0YSksCisJCQkgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZCwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjbWQsIHRtcCwgJmhkZXYtPm1nbXRfcGVuZGluZywgbGlzdCkgeworCQlpZiAob3Bjb2RlID4gMCAmJiBjbWQtPm9wY29kZSAhPSBvcGNvZGUpCisJCQljb250aW51ZTsKKworCQljYihjbWQsIGRhdGEpOworCX0KK30KKworc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKm1nbXRfcGVuZGluZ19hZGQoc3RydWN0IHNvY2sgKnNrLCB1MTYgb3Bjb2RlLAorCQkJCQkgIHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCQkgIHZvaWQgKmRhdGEsIHUxNiBsZW4pCit7CisJc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZDsKKworCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtZCkKKwkJcmV0dXJuIE5VTEw7CisKKwljbWQtPm9wY29kZSA9IG9wY29kZTsKKwljbWQtPmluZGV4ID0gaGRldi0+aWQ7CisKKwljbWQtPnBhcmFtID0ga21lbWR1cChkYXRhLCBsZW4sIEdGUF9LRVJORUwpOworCWlmICghY21kLT5wYXJhbSkgeworCQlrZnJlZShjbWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwljbWQtPnBhcmFtX2xlbiA9IGxlbjsKKworCWNtZC0+c2sgPSBzazsKKwlzb2NrX2hvbGQoc2spOworCisJbGlzdF9hZGQoJmNtZC0+bGlzdCwgJmhkZXYtPm1nbXRfcGVuZGluZyk7CisKKwlyZXR1cm4gY21kOworfQorCit2b2lkIG1nbXRfcGVuZGluZ19mcmVlKHN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQpCit7CisJc29ja19wdXQoY21kLT5zayk7CisJa2ZyZWUoY21kLT5wYXJhbSk7CisJa2ZyZWUoY21kKTsKK30KKwordm9pZCBtZ210X3BlbmRpbmdfcmVtb3ZlKHN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQpCit7CisJbGlzdF9kZWwoJmNtZC0+bGlzdCk7CisJbWdtdF9wZW5kaW5nX2ZyZWUoY21kKTsKK30KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbWdtdF91dGlsLmggYi9uZXQvYmx1ZXRvb3RoL21nbXRfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTlmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvYmx1ZXRvb3RoL21nbXRfdXRpbC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgICBCbHVlWiAtIEJsdWV0b290aCBwcm90b2NvbCBzdGFjayBmb3IgTGludXgKKyAgIENvcHlyaWdodCAoQykgMjAxNSAgSW50ZWwgQ29yb3ByYXRpb24KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKworICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRCBQQVJUWSBSSUdIVFMuCisgICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBBTkQgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZCisgICBDTEFJTSwgT1IgQU5ZIFNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUworICAgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgICBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICAgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworICAgQUxMIExJQUJJTElUWSwgSU5DTFVESU5HIExJQUJJTElUWSBGT1IgSU5GUklOR0VNRU5UIE9GIEFOWSBQQVRFTlRTLAorICAgQ09QWVJJR0hUUywgVFJBREVNQVJLUyBPUiBPVEhFUiBSSUdIVFMsIFJFTEFUSU5HIFRPIFVTRSBPRiBUSElTCisgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgorKi8KKworc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1MTYgb3Bjb2RlOworCWludCBpbmRleDsKKwl2b2lkICpwYXJhbTsKKwlzaXplX3QgcGFyYW1fbGVuOworCXN0cnVjdCBzb2NrICpzazsKKwl2b2lkICp1c2VyX2RhdGE7CisJaW50ICgqY21kX2NvbXBsZXRlKShzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqY21kLCB1OCBzdGF0dXMpOworfTsKKworaW50IG1nbXRfc2VuZF9ldmVudCh1MTYgZXZlbnQsIHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1bnNpZ25lZCBzaG9ydCBjaGFubmVsLAorCQkgICAgdm9pZCAqZGF0YSwgdTE2IGRhdGFfbGVuLCBpbnQgZmxhZywgc3RydWN0IHNvY2sgKnNraXBfc2spOworaW50IG1nbXRfY21kX3N0YXR1cyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdTE2IGNtZCwgdTggc3RhdHVzKTsKK2ludCBtZ210X2NtZF9jb21wbGV0ZShzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdTE2IGNtZCwgdTggc3RhdHVzLAorCQkgICAgICB2b2lkICpycCwgc2l6ZV90IHJwX2xlbik7CisKK3N0cnVjdCBtZ210X3BlbmRpbmdfY21kICptZ210X3BlbmRpbmdfZmluZCh1bnNpZ25lZCBzaG9ydCBjaGFubmVsLCB1MTYgb3Bjb2RlLAorCQkJCQkgICBzdHJ1Y3QgaGNpX2RldiAqaGRldik7CitzdHJ1Y3QgbWdtdF9wZW5kaW5nX2NtZCAqbWdtdF9wZW5kaW5nX2ZpbmRfZGF0YSh1bnNpZ25lZCBzaG9ydCBjaGFubmVsLAorCQkJCQkJdTE2IG9wY29kZSwKKwkJCQkJCXN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCQkJY29uc3Qgdm9pZCAqZGF0YSk7Cit2b2lkIG1nbXRfcGVuZGluZ19mb3JlYWNoKHUxNiBvcGNvZGUsIHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJICB2b2lkICgqY2IpKHN0cnVjdCBtZ210X3BlbmRpbmdfY21kICpjbWQsIHZvaWQgKmRhdGEpLAorCQkJICB2b2lkICpkYXRhKTsKK3N0cnVjdCBtZ210X3BlbmRpbmdfY21kICptZ210X3BlbmRpbmdfYWRkKHN0cnVjdCBzb2NrICpzaywgdTE2IG9wY29kZSwKKwkJCQkJICBzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJICB2b2lkICpkYXRhLCB1MTYgbGVuKTsKK3ZvaWQgbWdtdF9wZW5kaW5nX2ZyZWUoc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZCk7Cit2b2lkIG1nbXRfcGVuZGluZ19yZW1vdmUoc3RydWN0IG1nbXRfcGVuZGluZ19jbWQgKmNtZCk7CmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKaW5kZXggM2M2ZDJjOC4uODI1ZThmYiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYwpAQCAtNTQ5LDggKzU0OSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmZjb21tX3NvY2tfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCByZmNvbW1fc29ja19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCByZmNvbW1fZGxjICpkID0gcmZjb21tX3BpKHNrKS0+ZGxjOwpAQCAtNjE1LDggKzYxNSw4IEBACiAJcmV0dXJuIHNlbnQ7CiB9CiAKLXN0YXRpYyBpbnQgcmZjb21tX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorc3RhdGljIGludCByZmNvbW1fc29ja19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCByZmNvbW1fZGxjICpkID0gcmZjb21tX3BpKHNrKS0+ZGxjOwpAQCAtNjI3LDcgKzYyNyw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCWxlbiA9IGJ0X3NvY2tfc3RyZWFtX3JlY3Ztc2coaW9jYiwgc29jaywgbXNnLCBzaXplLCBmbGFncyk7CisJbGVuID0gYnRfc29ja19zdHJlYW1fcmVjdm1zZyhzb2NrLCBtc2csIHNpemUsIGZsYWdzKTsKIAogCWxvY2tfc29jayhzayk7CiAJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykgJiYgbGVuID4gMCkKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvc2NvLmMgYi9uZXQvYmx1ZXRvb3RoL3Njby5jCmluZGV4IDc2MzIxYjUuLjQzMjJjODMgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvc2NvLmMKKysrIGIvbmV0L2JsdWV0b290aC9zY28uYwpAQCAtNjg4LDggKzY4OCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2NvX3NvY2tfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCBzY29fc29ja19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCWludCBlcnI7CkBAIC03NTgsOCArNzU4LDggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgc2NvX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IHNjb19zb2NrX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJICAgIHNpemVfdCBsZW4sIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3Qgc2NvX3BpbmZvICpwaSA9IHNjb19waShzayk7CkBAIC03NzcsNyArNzc3LDcgQEAKIAogCXJlbGVhc2Vfc29jayhzayk7CiAKLQlyZXR1cm4gYnRfc29ja19yZWN2bXNnKGlvY2IsIHNvY2ssIG1zZywgbGVuLCBmbGFncyk7CisJcmV0dXJuIGJ0X3NvY2tfcmVjdm1zZyhzb2NrLCBtc2csIGxlbiwgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW50IHNjb19zb2NrX3NldHNvY2tvcHQoc3RydWN0IHNvY2tldCAqc29jaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKQEAgLTEwODMsOSArMTA4MywxMyBAQAogCXJldHVybiBsbTsKIH0KIAotdm9pZCBzY29fY29ubmVjdF9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCBfX3U4IHN0YXR1cykKK3N0YXRpYyB2b2lkIHNjb19jb25uZWN0X2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIF9fdTggc3RhdHVzKQogeworCWlmIChoY29uLT50eXBlICE9IFNDT19MSU5LICYmIGhjb24tPnR5cGUgIT0gRVNDT19MSU5LKQorCQlyZXR1cm47CisKIAlCVF9EQkcoImhjb24gJXAgYmRhZGRyICVwTVIgc3RhdHVzICVkIiwgaGNvbiwgJmhjb24tPmRzdCwgc3RhdHVzKTsKKwogCWlmICghc3RhdHVzKSB7CiAJCXN0cnVjdCBzY29fY29ubiAqY29ubjsKIApAQCAtMTA5Niw4ICsxMTAwLDExIEBACiAJCXNjb19jb25uX2RlbChoY29uLCBidF90b19lcnJubyhzdGF0dXMpKTsKIH0KIAotdm9pZCBzY29fZGlzY29ubl9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCBfX3U4IHJlYXNvbikKK3N0YXRpYyB2b2lkIHNjb19kaXNjb25uX2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIF9fdTggcmVhc29uKQogeworCWlmIChoY29uLT50eXBlICE9IFNDT19MSU5LICYmIGhjb24tPnR5cGUgIT0gRVNDT19MSU5LKQorCQlyZXR1cm47CisKIAlCVF9EQkcoImhjb24gJXAgcmVhc29uICVkIiwgaGNvbiwgcmVhc29uKTsKIAogCXNjb19jb25uX2RlbChoY29uLCBidF90b19lcnJubyhyZWFzb24pKTsKQEAgLTExMjIsNiArMTEyOSwxMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGhjaV9jYiBzY29fY2IgPSB7CisJLm5hbWUJCT0gIlNDTyIsCisJLmNvbm5lY3RfY2ZtCT0gc2NvX2Nvbm5lY3RfY2ZtLAorCS5kaXNjb25uX2NmbQk9IHNjb19kaXNjb25uX2NmbSwKK307CisKIHN0YXRpYyBpbnQgc2NvX2RlYnVnZnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnApCiB7CiAJc3RydWN0IHNvY2sgKnNrOwpAQCAtMTIwMyw2ICsxMjE2LDggQEAKIAogCUJUX0lORk8oIlNDTyBzb2NrZXQgbGF5ZXIgaW5pdGlhbGl6ZWQiKTsKIAorCWhjaV9yZWdpc3Rlcl9jYigmc2NvX2NiKTsKKwogCWlmIChJU19FUlJfT1JfTlVMTChidF9kZWJ1Z2ZzKSkKIAkJcmV0dXJuIDA7CiAKQEAgLTEyMTYsMTIgKzEyMzEsMTQgQEAKIAlyZXR1cm4gZXJyOwogfQogCi12b2lkIF9fZXhpdCBzY29fZXhpdCh2b2lkKQordm9pZCBzY29fZXhpdCh2b2lkKQogewogCWJ0X3Byb2Nmc19jbGVhbnVwKCZpbml0X25ldCwgInNjbyIpOwogCiAJZGVidWdmc19yZW1vdmUoc2NvX2RlYnVnZnMpOwogCisJaGNpX3VucmVnaXN0ZXJfY2IoJnNjb19jYik7CisKIAlidF9zb2NrX3VucmVnaXN0ZXIoQlRQUk9UT19TQ08pOwogCiAJcHJvdG9fdW5yZWdpc3Rlcigmc2NvX3Byb3RvKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvc2VsZnRlc3QuYyBiL25ldC9ibHVldG9vdGgvc2VsZnRlc3QuYwppbmRleCAzNzhmNDA2Li5kYzY4OGYxIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3NlbGZ0ZXN0LmMKKysrIGIvbmV0L2JsdWV0b290aC9zZWxmdGVzdC5jCkBAIC0yMSw2ICsyMSw4IEBACiAgICBTT0ZUV0FSRSBJUyBESVNDTEFJTUVELgogKi8KIAorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKwogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgogCkBAIC0xNTQsNiArMTU2LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjaGFyIHRlc3RfZWNkaF9idWZmZXJbMzJdOworCitzdGF0aWMgc3NpemVfdCB0ZXN0X2VjZGhfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgdGVzdF9lY2RoX2J1ZmZlciwKKwkJCQkgICAgICAgc3RybGVuKHRlc3RfZWNkaF9idWZmZXIpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGVzdF9lY2RoX2ZvcHMgPSB7CisJLm9wZW4JCT0gc2ltcGxlX29wZW4sCisJLnJlYWQJCT0gdGVzdF9lY2RoX3JlYWQsCisJLmxsc2VlawkJPSBkZWZhdWx0X2xsc2VlaywKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHRlc3RfZWNkaCh2b2lkKQogewogCWt0aW1lX3QgY2FsbHRpbWUsIGRlbHRhLCByZXR0aW1lOwpAQCAtMTY1LDE5ICsxODIsMTkgQEAKIAllcnIgPSB0ZXN0X2VjZGhfc2FtcGxlKHByaXZfYV8xLCBwcml2X2JfMSwgcHViX2FfMSwgcHViX2JfMSwgZGhrZXlfMSk7CiAJaWYgKGVycikgewogCQlCVF9FUlIoIkVDREggc2FtcGxlIDEgZmFpbGVkIik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZG9uZTsKIAl9CiAKIAllcnIgPSB0ZXN0X2VjZGhfc2FtcGxlKHByaXZfYV8yLCBwcml2X2JfMiwgcHViX2FfMiwgcHViX2JfMiwgZGhrZXlfMik7CiAJaWYgKGVycikgewogCQlCVF9FUlIoIkVDREggc2FtcGxlIDIgZmFpbGVkIik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZG9uZTsKIAl9CiAKIAllcnIgPSB0ZXN0X2VjZGhfc2FtcGxlKHByaXZfYV8zLCBwcml2X2FfMywgcHViX2FfMywgcHViX2FfMywgZGhrZXlfMyk7CiAJaWYgKGVycikgewogCQlCVF9FUlIoIkVDREggc2FtcGxlIDMgZmFpbGVkIik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZG9uZTsKIAl9CiAKIAlyZXR0aW1lID0ga3RpbWVfZ2V0KCk7CkBAIC0xODYsNyArMjAzLDE3IEBACiAKIAlCVF9JTkZPKCJFQ0RIIHRlc3QgcGFzc2VkIGluICVsbHUgdXNlY3MiLCBkdXJhdGlvbik7CiAKLQlyZXR1cm4gMDsKK2RvbmU6CisJaWYgKCFlcnIpCisJCXNucHJpbnRmKHRlc3RfZWNkaF9idWZmZXIsIHNpemVvZih0ZXN0X2VjZGhfYnVmZmVyKSwKKwkJCSAiUEFTUyAoJWxsdSB1c2VjcylcbiIsIGR1cmF0aW9uKTsKKwllbHNlCisJCXNucHJpbnRmKHRlc3RfZWNkaF9idWZmZXIsIHNpemVvZih0ZXN0X2VjZGhfYnVmZmVyKSwgIkZBSUxcbiIpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgic2VsZnRlc3RfZWNkaCIsIDA0NDQsIGJ0X2RlYnVnZnMsIE5VTEwsCisJCQkgICAgJnRlc3RfZWNkaF9mb3BzKTsKKworCXJldHVybiBlcnI7CiB9CiAKICNlbHNlCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3NtcC5jIGIvbmV0L2JsdWV0b290aC9zbXAuYwppbmRleCBjMDlhODIxLi4xYWIzZGM5IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3NtcC5jCisrKyBiL25ldC9ibHVldG9vdGgvc21wLmMKQEAgLTUyLDcgKzUyLDcgQEAKIAogI2RlZmluZSBTTVBfVElNRU9VVAltc2Vjc190b19qaWZmaWVzKDMwMDAwKQogCi0jZGVmaW5lIEFVVEhfUkVRX01BU0soZGV2KQkodGVzdF9iaXQoSENJX1NDX0VOQUJMRUQsICYoZGV2KS0+ZGV2X2ZsYWdzKSA/IFwKKyNkZWZpbmUgQVVUSF9SRVFfTUFTSyhkZXYpCShoY2lfZGV2X3Rlc3RfZmxhZyhkZXYsIEhDSV9TQ19FTkFCTEVEKSA/IFwKIAkJCQkgMHgxZiA6IDB4MDcpCiAjZGVmaW5lIEtFWV9ESVNUX01BU0sJCTB4MDcKIApAQCAtNzAsNyArNzAsMTkgQEAKIAlTTVBfRkxBR19ERUJVR19LRVksCiAJU01QX0ZMQUdfV0FJVF9VU0VSLAogCVNNUF9GTEFHX0RIS0VZX1BFTkRJTkcsCi0JU01QX0ZMQUdfT09CLAorCVNNUF9GTEFHX1JFTU9URV9PT0IsCisJU01QX0ZMQUdfTE9DQUxfT09CLAorfTsKKworc3RydWN0IHNtcF9kZXYgeworCS8qIFNlY3VyZSBDb25uZWN0aW9ucyBPT0IgZGF0YSAqLworCXU4CQkJbG9jYWxfcGtbNjRdOworCXU4CQkJbG9jYWxfc2tbMzJdOworCXU4CQkJbG9jYWxfcmFuZFsxNl07CisJYm9vbAkJCWRlYnVnX2tleTsKKworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyCSp0Zm1fYWVzOworCXN0cnVjdCBjcnlwdG9faGFzaAkqdGZtX2NtYWM7CiB9OwogCiBzdHJ1Y3Qgc21wX2NoYW4gewpAQCAtODQsNyArOTYsOCBAQAogCXU4CQlycm5kWzE2XTsgLyogU01QIFBhaXJpbmcgUmFuZG9tIChyZW1vdGUpICovCiAJdTgJCXBjbmZbMTZdOyAvKiBTTVAgUGFpcmluZyBDb25maXJtICovCiAJdTgJCXRrWzE2XTsgLyogU01QIFRlbXBvcmFyeSBLZXkgKi8KLQl1OAkJcnJbMTZdOworCXU4CQlyclsxNl07IC8qIFJlbW90ZSBPT0IgcmEvcmIgdmFsdWUgKi8KKwl1OAkJbHJbMTZdOyAvKiBMb2NhbCBPT0IgcmEvcmIgdmFsdWUgKi8KIAl1OAkJZW5jX2tleV9zaXplOwogCXU4CQlyZW1vdGVfa2V5X2Rpc3Q7CiAJYmRhZGRyX3QJaWRfYWRkcjsKQEAgLTQ3OCwxOCArNDkxLDE4IEBACiAJCSAgICAgY29uc3QgYmRhZGRyX3QgKmJkYWRkcikKIHsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IGhkZXYtPnNtcF9kYXRhOwotCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm07CisJc3RydWN0IHNtcF9kZXYgKnNtcDsKIAl1OCBoYXNoWzNdOwogCWludCBlcnI7CiAKIAlpZiAoIWNoYW4gfHwgIWNoYW4tPmRhdGEpCiAJCXJldHVybiBmYWxzZTsKIAotCXRmbSA9IGNoYW4tPmRhdGE7CisJc21wID0gY2hhbi0+ZGF0YTsKIAogCUJUX0RCRygiUlBBICVwTVIgSVJLICUqcGhOIiwgYmRhZGRyLCAxNiwgaXJrKTsKIAotCWVyciA9IHNtcF9haCh0Zm0sIGlyaywgJmJkYWRkci0+YlszXSwgaGFzaCk7CisJZXJyID0gc21wX2FoKHNtcC0+dGZtX2FlcywgaXJrLCAmYmRhZGRyLT5iWzNdLCBoYXNoKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZmFsc2U7CiAKQEAgLTQ5OSwyMCArNTEyLDIwIEBACiBpbnQgc21wX2dlbmVyYXRlX3JwYShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgY29uc3QgdTggaXJrWzE2XSwgYmRhZGRyX3QgKnJwYSkKIHsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IGhkZXYtPnNtcF9kYXRhOwotCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm07CisJc3RydWN0IHNtcF9kZXYgKnNtcDsKIAlpbnQgZXJyOwogCiAJaWYgKCFjaGFuIHx8ICFjaGFuLT5kYXRhKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQl0Zm0gPSBjaGFuLT5kYXRhOworCXNtcCA9IGNoYW4tPmRhdGE7CiAKIAlnZXRfcmFuZG9tX2J5dGVzKCZycGEtPmJbM10sIDMpOwogCiAJcnBhLT5iWzVdICY9IDB4M2Y7CS8qIENsZWFyIHR3byBtb3N0IHNpZ25pZmljYW50IGJpdHMgKi8KIAlycGEtPmJbNV0gfD0gMHg0MDsJLyogU2V0IHNlY29uZCBtb3N0IHNpZ25pZmljYW50IGJpdCAqLwogCi0JZXJyID0gc21wX2FoKHRmbSwgaXJrLCAmcnBhLT5iWzNdLCBycGEtPmIpOworCWVyciA9IHNtcF9haChzbXAtPnRmbV9hZXMsIGlyaywgJnJwYS0+YlszXSwgcnBhLT5iKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNTIxLDYgKzUzNCw1MyBAQAogCXJldHVybiAwOwogfQogCitpbnQgc21wX2dlbmVyYXRlX29vYihzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggaGFzaFsxNl0sIHU4IHJhbmRbMTZdKQoreworCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuID0gaGRldi0+c21wX2RhdGE7CisJc3RydWN0IHNtcF9kZXYgKnNtcDsKKwlpbnQgZXJyOworCisJaWYgKCFjaGFuIHx8ICFjaGFuLT5kYXRhKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzbXAgPSBjaGFuLT5kYXRhOworCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VU0VfREVCVUdfS0VZUykpIHsKKwkJQlRfREJHKCJVc2luZyBkZWJ1ZyBrZXlzIik7CisJCW1lbWNweShzbXAtPmxvY2FsX3BrLCBkZWJ1Z19waywgNjQpOworCQltZW1jcHkoc21wLT5sb2NhbF9zaywgZGVidWdfc2ssIDMyKTsKKwkJc21wLT5kZWJ1Z19rZXkgPSB0cnVlOworCX0gZWxzZSB7CisJCXdoaWxlICh0cnVlKSB7CisJCQkvKiBHZW5lcmF0ZSBsb2NhbCBrZXkgcGFpciBmb3IgU2VjdXJlIENvbm5lY3Rpb25zICovCisJCQlpZiAoIWVjY19tYWtlX2tleShzbXAtPmxvY2FsX3BrLCBzbXAtPmxvY2FsX3NrKSkKKwkJCQlyZXR1cm4gLUVJTzsKKworCQkJLyogVGhpcyBpcyB1bmxpa2VseSwgYnV0IHdlIG5lZWQgdG8gY2hlY2sgdGhhdAorCQkJICogd2UgZGlkbid0IGFjY2lkZW50aWFsbHkgZ2VuZXJhdGUgYSBkZWJ1ZyBrZXkuCisJCQkgKi8KKwkJCWlmIChtZW1jbXAoc21wLT5sb2NhbF9zaywgZGVidWdfc2ssIDMyKSkKKwkJCQlicmVhazsKKwkJfQorCQlzbXAtPmRlYnVnX2tleSA9IGZhbHNlOworCX0KKworCVNNUF9EQkcoIk9PQiBQdWJsaWMgS2V5IFg6ICUzMnBoTiIsIHNtcC0+bG9jYWxfcGspOworCVNNUF9EQkcoIk9PQiBQdWJsaWMgS2V5IFk6ICUzMnBoTiIsIHNtcC0+bG9jYWxfcGsgKyAzMik7CisJU01QX0RCRygiT09CIFByaXZhdGUgS2V5OiAgJTMycGhOIiwgc21wLT5sb2NhbF9zayk7CisKKwlnZXRfcmFuZG9tX2J5dGVzKHNtcC0+bG9jYWxfcmFuZCwgMTYpOworCisJZXJyID0gc21wX2Y0KHNtcC0+dGZtX2NtYWMsIHNtcC0+bG9jYWxfcGssIHNtcC0+bG9jYWxfcGssCisJCSAgICAgc21wLT5sb2NhbF9yYW5kLCAwLCBoYXNoKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCW1lbWNweShyYW5kLCBzbXAtPmxvY2FsX3JhbmQsIDE2KTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBzbXBfc2VuZF9jbWQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHU4IGNvZGUsIHUxNiBsZW4sIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4gPSBjb25uLT5zbXA7CkBAIC01ODksNyArNjQ5LDcgQEAKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGhjb24tPmhkZXY7CiAJdTggbG9jYWxfZGlzdCA9IDAsIHJlbW90ZV9kaXN0ID0gMCwgb29iX2ZsYWcgPSBTTVBfT09CX05PVF9QUkVTRU5UOwogCi0JaWYgKHRlc3RfYml0KEhDSV9CT05EQUJMRSwgJmNvbm4tPmhjb24tPmhkZXYtPmRldl9mbGFncykpIHsKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JPTkRBQkxFKSkgewogCQlsb2NhbF9kaXN0ID0gU01QX0RJU1RfRU5DX0tFWSB8IFNNUF9ESVNUX1NJR047CiAJCXJlbW90ZV9kaXN0ID0gU01QX0RJU1RfRU5DX0tFWSB8IFNNUF9ESVNUX1NJR047CiAJCWF1dGhyZXEgfD0gU01QX0FVVEhfQk9ORElORzsKQEAgLTU5NywxOCArNjU3LDE4IEBACiAJCWF1dGhyZXEgJj0gflNNUF9BVVRIX0JPTkRJTkc7CiAJfQogCi0JaWYgKHRlc3RfYml0KEhDSV9SUEFfUkVTT0xWSU5HLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1JQQV9SRVNPTFZJTkcpKQogCQlyZW1vdGVfZGlzdCB8PSBTTVBfRElTVF9JRF9LRVk7CiAKLQlpZiAodGVzdF9iaXQoSENJX1BSSVZBQ1ksICZoZGV2LT5kZXZfZmxhZ3MpKQorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfUFJJVkFDWSkpCiAJCWxvY2FsX2Rpc3QgfD0gU01QX0RJU1RfSURfS0VZOwogCi0JaWYgKHRlc3RfYml0KEhDSV9TQ19FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSAmJgorCWlmIChoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU0NfRU5BQkxFRCkgJiYKIAkgICAgKGF1dGhyZXEgJiBTTVBfQVVUSF9TQykpIHsKIAkJc3RydWN0IG9vYl9kYXRhICpvb2JfZGF0YTsKIAkJdTggYmRhZGRyX3R5cGU7CiAKLQkJaWYgKHRlc3RfYml0KEhDSV9TU1BfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpIHsKKwkJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TU1BfRU5BQkxFRCkpIHsKIAkJCWxvY2FsX2Rpc3QgfD0gU01QX0RJU1RfTElOS19LRVk7CiAJCQlyZW1vdGVfZGlzdCB8PSBTTVBfRElTVF9MSU5LX0tFWTsKIAkJfQpAQCAtNjIxLDEwICs2ODEsMTIgQEAKIAkJb29iX2RhdGEgPSBoY2lfZmluZF9yZW1vdGVfb29iX2RhdGEoaGRldiwgJmhjb24tPmRzdCwKIAkJCQkJCSAgICBiZGFkZHJfdHlwZSk7CiAJCWlmIChvb2JfZGF0YSAmJiBvb2JfZGF0YS0+cHJlc2VudCkgewotCQkJc2V0X2JpdChTTVBfRkxBR19PT0IsICZzbXAtPmZsYWdzKTsKKwkJCXNldF9iaXQoU01QX0ZMQUdfUkVNT1RFX09PQiwgJnNtcC0+ZmxhZ3MpOwogCQkJb29iX2ZsYWcgPSBTTVBfT09CX1BSRVNFTlQ7CiAJCQltZW1jcHkoc21wLT5yciwgb29iX2RhdGEtPnJhbmQyNTYsIDE2KTsKIAkJCW1lbWNweShzbXAtPnBjbmYsIG9vYl9kYXRhLT5oYXNoMjU2LCAxNik7CisJCQlTTVBfREJHKCJPT0IgUmVtb3RlIENvbmZpcm1hdGlvbjogJTE2cGhOIiwgc21wLT5wY25mKTsKKwkJCVNNUF9EQkcoIk9PQiBSZW1vdGUgUmFuZG9tOiAlMTZwaE4iLCBzbXAtPnJyKTsKIAkJfQogCiAJfSBlbHNlIHsKQEAgLTY4MSw5ICs3NDMsOSBAQAogCWNvbXBsZXRlID0gdGVzdF9iaXQoU01QX0ZMQUdfQ09NUExFVEUsICZzbXAtPmZsYWdzKTsKIAltZ210X3NtcF9jb21wbGV0ZShoY29uLCBjb21wbGV0ZSk7CiAKLQlrZnJlZShzbXAtPmNzcmspOwotCWtmcmVlKHNtcC0+c2xhdmVfY3Nyayk7Ci0Ja2ZyZWUoc21wLT5saW5rX2tleSk7CisJa3pmcmVlKHNtcC0+Y3Nyayk7CisJa3pmcmVlKHNtcC0+c2xhdmVfY3Nyayk7CisJa3pmcmVlKHNtcC0+bGlua19rZXkpOwogCiAJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHNtcC0+dGZtX2Flcyk7CiAJY3J5cHRvX2ZyZWVfaGFzaChzbXAtPnRmbV9jbWFjKTsKQEAgLTY5Miw3ICs3NTQsNyBAQAogCSAqIHN1cHBvcnQgaGFzbid0IGJlZW4gZXhwbGljaXRseSBlbmFibGVkLgogCSAqLwogCWlmIChzbXAtPmx0ayAmJiBzbXAtPmx0ay0+dHlwZSA9PSBTTVBfTFRLX1AyNTZfREVCVUcgJiYKLQkgICAgIXRlc3RfYml0KEhDSV9LRUVQX0RFQlVHX0tFWVMsICZoY29uLT5oZGV2LT5kZXZfZmxhZ3MpKSB7CisJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhoY29uLT5oZGV2LCBIQ0lfS0VFUF9ERUJVR19LRVlTKSkgewogCQlsaXN0X2RlbF9yY3UoJnNtcC0+bHRrLT5saXN0KTsKIAkJa2ZyZWVfcmN1KHNtcC0+bHRrLCByY3UpOwogCQlzbXAtPmx0ayA9IE5VTEw7CkBAIC03MTcsNyArNzc5LDcgQEAKIAl9CiAKIAljaGFuLT5kYXRhID0gTlVMTDsKLQlrZnJlZShzbXApOworCWt6ZnJlZShzbXApOwogCWhjaV9jb25uX2Ryb3AoaGNvbik7CiB9CiAKQEAgLTgxOCw2ICs4ODAsMTIgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJLyogSWYgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBTQyAtPiBsZWdhY3kgZmFsbGJhY2sgd2UKKwkgKiBjYW4gb25seSByZWNvdmVyIHRoZSBqdXN0LXdvcmtzIGNhc2UuCisJICovCisJaWYgKHRlc3RfYml0KFNNUF9GTEFHX1NDLCAmc21wLT5mbGFncykpCisJCXJldHVybiAtRUlOVkFMOworCiAJLyogTm90IEp1c3QgV29ya3MvQ29uZmlybSByZXN1bHRzIGluIE1JVE0gQXV0aGVudGljYXRpb24gKi8KIAlpZiAoc21wLT5tZXRob2QgIT0gSlVTVF9DRk0pIHsKIAkJc2V0X2JpdChTTVBfRkxBR19NSVRNX0FVVEgsICZzbXAtPmZsYWdzKTsKQEAgLTEwNTIsNyArMTEyMCw3IEBACiAJCQkvKiBEb24ndCBrZWVwIGRlYnVnIGtleXMgYXJvdW5kIGlmIHRoZSByZWxldmFudAogCQkJICogZmxhZyBpcyBub3Qgc2V0LgogCQkJICovCi0JCQlpZiAoIXRlc3RfYml0KEhDSV9LRUVQX0RFQlVHX0tFWVMsICZoZGV2LT5kZXZfZmxhZ3MpICYmCisJCQlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9LRUVQX0RFQlVHX0tFWVMpICYmCiAJCQkgICAga2V5LT50eXBlID09IEhDSV9MS19ERUJVR19DT01CSU5BVElPTikgewogCQkJCWxpc3RfZGVsX3JjdSgma2V5LT5saXN0KTsKIAkJCQlrZnJlZV9yY3Uoa2V5LCByY3UpOwpAQCAtMTA5NywxMyArMTE2NSwxMyBAQAogCQlyZXR1cm47CiAKIAlpZiAoc21wX2g2KHNtcC0+dGZtX2NtYWMsIHNtcC0+dGssIHRtcDEsIHNtcC0+bGlua19rZXkpKSB7Ci0JCWtmcmVlKHNtcC0+bGlua19rZXkpOworCQlremZyZWUoc21wLT5saW5rX2tleSk7CiAJCXNtcC0+bGlua19rZXkgPSBOVUxMOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKHNtcF9oNihzbXAtPnRmbV9jbWFjLCBzbXAtPmxpbmtfa2V5LCBsZWJyLCBzbXAtPmxpbmtfa2V5KSkgewotCQlrZnJlZShzbXAtPmxpbmtfa2V5KTsKKwkJa3pmcmVlKHNtcC0+bGlua19rZXkpOwogCQlzbXAtPmxpbmtfa2V5ID0gTlVMTDsKIAkJcmV0dXJuOwogCX0KQEAgLTEyNTIsNyArMTMyMCwxMCBAQAogCiAJCWNzcmsgPSBremFsbG9jKHNpemVvZigqY3NyayksIEdGUF9LRVJORUwpOwogCQlpZiAoY3NyaykgewotCQkJY3Nyay0+bWFzdGVyID0gMHgwMDsKKwkJCWlmIChoY29uLT5zZWNfbGV2ZWwgPiBCVF9TRUNVUklUWV9NRURJVU0pCisJCQkJY3Nyay0+dHlwZSA9IE1HTVRfQ1NSS19MT0NBTF9BVVRIRU5USUNBVEVEOworCQkJZWxzZQorCQkJCWNzcmstPnR5cGUgPSBNR01UX0NTUktfTE9DQUxfVU5BVVRIRU5USUNBVEVEOwogCQkJbWVtY3B5KGNzcmstPnZhbCwgc2lnbi5jc3JrLCBzaXplb2YoY3Nyay0+dmFsKSk7CiAJCX0KIAkJc21wLT5zbGF2ZV9jc3JrID0gY3NyazsKQEAgLTEyOTcsNyArMTM2OCw3IEBACiAJc21wLT50Zm1fYWVzID0gY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigiZWNiKGFlcykiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKIAlpZiAoSVNfRVJSKHNtcC0+dGZtX2FlcykpIHsKIAkJQlRfRVJSKCJVbmFibGUgdG8gY3JlYXRlIEVDQiBjcnlwdG8gY29udGV4dCIpOwotCQlrZnJlZShzbXApOworCQlremZyZWUoc21wKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC0xMzA1LDcgKzEzNzYsNyBAQAogCWlmIChJU19FUlIoc21wLT50Zm1fY21hYykpIHsKIAkJQlRfRVJSKCJVbmFibGUgdG8gY3JlYXRlIENNQUMgY3J5cHRvIGNvbnRleHQiKTsKIAkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHNtcC0+dGZtX2Flcyk7Ci0JCWtmcmVlKHNtcCk7CisJCWt6ZnJlZShzbXApOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTE2MDEsMTUgKzE2NzIsMTUgQEAKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhjb24tPmhkZXY7CiAJdTggbG9jYWxfZGlzdCA9IDAsIHJlbW90ZV9kaXN0ID0gMDsKIAotCWlmICh0ZXN0X2JpdChIQ0lfQk9OREFCTEUsICZoZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CT05EQUJMRSkpIHsKIAkJbG9jYWxfZGlzdCA9IFNNUF9ESVNUX0VOQ19LRVkgfCBTTVBfRElTVF9TSUdOOwogCQlyZW1vdGVfZGlzdCA9IFNNUF9ESVNUX0VOQ19LRVkgfCBTTVBfRElTVF9TSUdOOwogCX0KIAotCWlmICh0ZXN0X2JpdChIQ0lfUlBBX1JFU09MVklORywgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9SUEFfUkVTT0xWSU5HKSkKIAkJcmVtb3RlX2Rpc3QgfD0gU01QX0RJU1RfSURfS0VZOwogCi0JaWYgKHRlc3RfYml0KEhDSV9QUklWQUNZLCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1BSSVZBQ1kpKQogCQlsb2NhbF9kaXN0IHw9IFNNUF9ESVNUX0lEX0tFWTsKIAogCWlmICghcnNwKSB7CkBAIC0xNjYxLDIyICsxNzMyLDI5IEBACiAJLyogV2UgZGlkbid0IHN0YXJ0IHRoZSBwYWlyaW5nLCBzbyBtYXRjaCByZW1vdGUgKi8KIAlhdXRoID0gcmVxLT5hdXRoX3JlcSAmIEFVVEhfUkVRX01BU0soaGRldik7CiAKLQlpZiAoIXRlc3RfYml0KEhDSV9CT05EQUJMRSwgJmhkZXYtPmRldl9mbGFncykgJiYKKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9CT05EQUJMRSkgJiYKIAkgICAgKGF1dGggJiBTTVBfQVVUSF9CT05ESU5HKSkKIAkJcmV0dXJuIFNNUF9QQUlSSU5HX05PVFNVUFA7CiAKLQlpZiAodGVzdF9iaXQoSENJX1NDX09OTFksICZoZGV2LT5kZXZfZmxhZ3MpICYmICEoYXV0aCAmIFNNUF9BVVRIX1NDKSkKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NDX09OTFkpICYmICEoYXV0aCAmIFNNUF9BVVRIX1NDKSkKIAkJcmV0dXJuIFNNUF9BVVRIX1JFUVVJUkVNRU5UUzsKIAogCXNtcC0+cHJlcVswXSA9IFNNUF9DTURfUEFJUklOR19SRVE7CiAJbWVtY3B5KCZzbXAtPnByZXFbMV0sIHJlcSwgc2l6ZW9mKCpyZXEpKTsKIAlza2JfcHVsbChza2IsIHNpemVvZigqcmVxKSk7CiAKKwkvKiBJZiB0aGUgcmVtb3RlIHNpZGUncyBPT0IgZmxhZyBpcyBzZXQgaXQgbWVhbnMgaXQgaGFzCisJICogc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIG91ciBsb2NhbCBPT0IgZGF0YSAtIHRoZXJlZm9yZSBzZXQgdGhlCisJICogZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGxvY2FsIE9PQiBpcyBpbiB1c2UuCisJICovCisJaWYgKHJlcS0+b29iX2ZsYWcgPT0gU01QX09PQl9QUkVTRU5UKQorCQlzZXRfYml0KFNNUF9GTEFHX0xPQ0FMX09PQiwgJnNtcC0+ZmxhZ3MpOworCiAJLyogU01QIG92ZXIgQlIvRURSIHJlcXVpcmVzIHNwZWNpYWwgdHJlYXRtZW50ICovCiAJaWYgKGNvbm4tPmhjb24tPnR5cGUgPT0gQUNMX0xJTkspIHsKIAkJLyogV2UgbXVzdCBoYXZlIGEgQlIvRURSIFNDIGxpbmsgKi8KIAkJaWYgKCF0ZXN0X2JpdChIQ0lfQ09OTl9BRVNfQ0NNLCAmY29ubi0+aGNvbi0+ZmxhZ3MpICYmCi0JCSAgICAhdGVzdF9iaXQoSENJX0ZPUkNFX0JSRURSX1NNUCwgJmhkZXYtPmRiZ19mbGFncykpCisJCSAgICAhaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0ZPUkNFX0JSRURSX1NNUCkpCiAJCQlyZXR1cm4gU01QX0NST1NTX1RSQU5TUF9OT1RfQUxMT1dFRDsKIAogCQlzZXRfYml0KFNNUF9GTEFHX1NDLCAmc21wLT5mbGFncyk7CkBAIC0xNzM0LDE0ICsxODEyLDE5IEBACiAKIAljbGVhcl9iaXQoU01QX0ZMQUdfSU5JVElBVE9SLCAmc21wLT5mbGFncyk7CiAKKwkvKiBTdHJpY3RseSBzcGVha2luZyB3ZSBzaG91bGRuJ3QgYWxsb3cgUGFpcmluZyBDb25maXJtIGZvciB0aGUKKwkgKiBTQyBjYXNlLCBob3dldmVyIHNvbWUgaW1wbGVtZW50YXRpb25zIGluY29ycmVjdGx5IGNvcHkgUkZVIGF1dGgKKwkgKiByZXEgYml0cyBmcm9tIG91ciBzZWN1cml0eSByZXF1ZXN0LCB3aGljaCBtYXkgY3JlYXRlIGEgZmFsc2UKKwkgKiBwb3NpdGl2ZSBTQyBlbmFibGVtZW50LgorCSAqLworCVNNUF9BTExPV19DTUQoc21wLCBTTVBfQ01EX1BBSVJJTkdfQ09ORklSTSk7CisKIAlpZiAodGVzdF9iaXQoU01QX0ZMQUdfU0MsICZzbXAtPmZsYWdzKSkgewogCQlTTVBfQUxMT1dfQ01EKHNtcCwgU01QX0NNRF9QVUJMSUNfS0VZKTsKIAkJLyogQ2xlYXIgYml0cyB3aGljaCBhcmUgZ2VuZXJhdGVkIGJ1dCBub3QgZGlzdHJpYnV0ZWQgKi8KIAkJc21wLT5yZW1vdGVfa2V5X2Rpc3QgJj0gflNNUF9TQ19OT19ESVNUOwogCQkvKiBXYWl0IGZvciBQdWJsaWMgS2V5IGZyb20gSW5pdGlhdGluZyBEZXZpY2UgKi8KIAkJcmV0dXJuIDA7Ci0JfSBlbHNlIHsKLQkJU01QX0FMTE9XX0NNRChzbXAsIFNNUF9DTURfUEFJUklOR19DT05GSVJNKTsKIAl9CiAKIAkvKiBSZXF1ZXN0IHNldHVwIG9mIFRLICovCkBAIC0xNzU4LDcgKzE4NDEsMjYgQEAKIAogCUJUX0RCRygiIik7CiAKLQlpZiAodGVzdF9iaXQoSENJX1VTRV9ERUJVR19LRVlTLCAmaGRldi0+ZGV2X2ZsYWdzKSkgeworCWlmICh0ZXN0X2JpdChTTVBfRkxBR19MT0NBTF9PT0IsICZzbXAtPmZsYWdzKSkgeworCQlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IGhkZXYtPnNtcF9kYXRhOworCQlzdHJ1Y3Qgc21wX2RldiAqc21wX2RldjsKKworCQlpZiAoIWNoYW4gfHwgIWNoYW4tPmRhdGEpCisJCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOworCisJCXNtcF9kZXYgPSBjaGFuLT5kYXRhOworCisJCW1lbWNweShzbXAtPmxvY2FsX3BrLCBzbXBfZGV2LT5sb2NhbF9waywgNjQpOworCQltZW1jcHkoc21wLT5sb2NhbF9zaywgc21wX2Rldi0+bG9jYWxfc2ssIDMyKTsKKwkJbWVtY3B5KHNtcC0+bHIsIHNtcF9kZXYtPmxvY2FsX3JhbmQsIDE2KTsKKworCQlpZiAoc21wX2Rldi0+ZGVidWdfa2V5KQorCQkJc2V0X2JpdChTTVBfRkxBR19ERUJVR19LRVksICZzbXAtPmZsYWdzKTsKKworCQlnb3RvIGRvbmU7CisJfQorCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9VU0VfREVCVUdfS0VZUykpIHsKIAkJQlRfREJHKCJVc2luZyBkZWJ1ZyBrZXlzIik7CiAJCW1lbWNweShzbXAtPmxvY2FsX3BrLCBkZWJ1Z19waywgNjQpOwogCQltZW1jcHkoc21wLT5sb2NhbF9zaywgZGVidWdfc2ssIDMyKTsKQEAgLTE3NzcsOCArMTg3OSw5IEBACiAJCX0KIAl9CiAKK2RvbmU6CiAJU01QX0RCRygiTG9jYWwgUHVibGljIEtleSBYOiAlMzJwaE4iLCBzbXAtPmxvY2FsX3BrKTsKLQlTTVBfREJHKCJMb2NhbCBQdWJsaWMgS2V5IFk6ICUzMnBoTiIsICZzbXAtPmxvY2FsX3BrWzMyXSk7CisJU01QX0RCRygiTG9jYWwgUHVibGljIEtleSBZOiAlMzJwaE4iLCBzbXAtPmxvY2FsX3BrICsgMzIpOwogCVNNUF9EQkcoIkxvY2FsIFByaXZhdGUgS2V5OiAgJTMycGhOIiwgc21wLT5sb2NhbF9zayk7CiAKIAlzbXBfc2VuZF9jbWQoc21wLT5jb25uLCBTTVBfQ01EX1BVQkxJQ19LRVksIDY0LCBzbXAtPmxvY2FsX3BrKTsKQEAgLTE4MTMsOSArMTkxNiwxNiBAQAogCiAJYXV0aCA9IHJzcC0+YXV0aF9yZXEgJiBBVVRIX1JFUV9NQVNLKGhkZXYpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9TQ19PTkxZLCAmaGRldi0+ZGV2X2ZsYWdzKSAmJiAhKGF1dGggJiBTTVBfQVVUSF9TQykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TQ19PTkxZKSAmJiAhKGF1dGggJiBTTVBfQVVUSF9TQykpCiAJCXJldHVybiBTTVBfQVVUSF9SRVFVSVJFTUVOVFM7CiAKKwkvKiBJZiB0aGUgcmVtb3RlIHNpZGUncyBPT0IgZmxhZyBpcyBzZXQgaXQgbWVhbnMgaXQgaGFzCisJICogc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIG91ciBsb2NhbCBPT0IgZGF0YSAtIHRoZXJlZm9yZSBzZXQgdGhlCisJICogZmxhZyB0byBpbmRpY2F0ZSB0aGF0IGxvY2FsIE9PQiBpcyBpbiB1c2UuCisJICovCisJaWYgKHJzcC0+b29iX2ZsYWcgPT0gU01QX09PQl9QUkVTRU5UKQorCQlzZXRfYml0KFNNUF9GTEFHX0xPQ0FMX09PQiwgJnNtcC0+ZmxhZ3MpOworCiAJc21wLT5wcnNwWzBdID0gU01QX0NNRF9QQUlSSU5HX1JTUDsKIAltZW1jcHkoJnNtcC0+cHJzcFsxXSwgcnNwLCBzaXplb2YoKnJzcCkpOwogCkBAIC0xODgyLDEwICsxOTkyLDYgQEAKIAogCUJUX0RCRygiIik7CiAKLQkvKiBQdWJsaWMgS2V5IGV4Y2hhbmdlIG11c3QgaGFwcGVuIGJlZm9yZSBhbnkgb3RoZXIgc3RlcHMgKi8KLQlpZiAoIXRlc3RfYml0KFNNUF9GTEFHX1JFTU9URV9QSywgJnNtcC0+ZmxhZ3MpKQotCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOwotCiAJaWYgKHNtcC0+bWV0aG9kID09IFJFUV9QQVNTS0VZIHx8IHNtcC0+bWV0aG9kID09IERTUF9QQVNTS0VZKQogCQlyZXR1cm4gc2NfcGFzc2tleV9yb3VuZChzbXAsIFNNUF9DTURfUEFJUklOR19DT05GSVJNKTsKIApAQCAtMTg5OCw2ICsyMDA0LDQ3IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIFdvcmstYXJvdW5kIGZvciBzb21lIGltcGxlbWVudGF0aW9ucyB0aGF0IGluY29ycmVjdGx5IGNvcHkgUkZVIGJpdHMKKyAqIGZyb20gb3VyIHNlY3VyaXR5IHJlcXVlc3QgYW5kIHRoZXJlYnkgY3JlYXRlIHRoZSBpbXByZXNzaW9uIHRoYXQKKyAqIHdlJ3JlIGRvaW5nIFNDIHdoZW4gaW4gZmFjdCB0aGUgcmVtb3RlIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KKyAqLworc3RhdGljIGludCBmaXh1cF9zY19mYWxzZV9wb3NpdGl2ZShzdHJ1Y3Qgc21wX2NoYW4gKnNtcCkKK3sKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IHNtcC0+Y29ubjsKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24gPSBjb25uLT5oY29uOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gaGNvbi0+aGRldjsKKwlzdHJ1Y3Qgc21wX2NtZF9wYWlyaW5nICpyZXEsICpyc3A7CisJdTggYXV0aDsKKworCS8qIFRoZSBpc3N1ZSBpcyBvbmx5IG9ic2VydmVkIHdoZW4gd2UncmUgaW4gc2xhdmUgcm9sZSAqLworCWlmIChoY29uLT5vdXQpCisJCXJldHVybiBTTVBfVU5TUEVDSUZJRUQ7CisKKwlpZiAoaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX1NDX09OTFkpKSB7CisJCUJUX0VSUigiUmVmdXNpbmcgU01QIFNDIC0+IGxlZ2FjeSBmYWxsYmFjayBpbiBTQy1vbmx5IG1vZGUiKTsKKwkJcmV0dXJuIFNNUF9VTlNQRUNJRklFRDsKKwl9CisKKwlCVF9FUlIoIlRyeWluZyB0byBmYWxsIGJhY2sgdG8gbGVnYWN5IFNNUCIpOworCisJcmVxID0gKHZvaWQgKikgJnNtcC0+cHJlcVsxXTsKKwlyc3AgPSAodm9pZCAqKSAmc21wLT5wcnNwWzFdOworCisJLyogUmVidWlsZCBrZXkgZGlzdCBmbGFncyB3aGljaCBtYXkgaGF2ZSBiZWVuIGNsZWFyZWQgZm9yIFNDICovCisJc21wLT5yZW1vdGVfa2V5X2Rpc3QgPSAocmVxLT5pbml0X2tleV9kaXN0ICYgcnNwLT5yZXNwX2tleV9kaXN0KTsKKworCWF1dGggPSByZXEtPmF1dGhfcmVxICYgQVVUSF9SRVFfTUFTSyhoZGV2KTsKKworCWlmICh0a19yZXF1ZXN0KGNvbm4sIDAsIGF1dGgsIHJzcC0+aW9fY2FwYWJpbGl0eSwgcmVxLT5pb19jYXBhYmlsaXR5KSkgeworCQlCVF9FUlIoIkZhaWxlZCB0byBmYWxsIGJhY2sgdG8gbGVnYWN5IFNNUCIpOworCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOworCX0KKworCWNsZWFyX2JpdChTTVBfRkxBR19TQywgJnNtcC0+ZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB1OCBzbXBfY21kX3BhaXJpbmdfY29uZmlybShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IGNvbm4tPnNtcDsKQEAgLTE5MTEsOCArMjA1OCwxOSBAQAogCW1lbWNweShzbXAtPnBjbmYsIHNrYi0+ZGF0YSwgc2l6ZW9mKHNtcC0+cGNuZikpOwogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHNtcC0+cGNuZikpOwogCi0JaWYgKHRlc3RfYml0KFNNUF9GTEFHX1NDLCAmc21wLT5mbGFncykpCi0JCXJldHVybiBzY19jaGVja19jb25maXJtKHNtcCk7CisJaWYgKHRlc3RfYml0KFNNUF9GTEFHX1NDLCAmc21wLT5mbGFncykpIHsKKwkJaW50IHJldDsKKworCQkvKiBQdWJsaWMgS2V5IGV4Y2hhbmdlIG11c3QgaGFwcGVuIGJlZm9yZSBhbnkgb3RoZXIgc3RlcHMgKi8KKwkJaWYgKHRlc3RfYml0KFNNUF9GTEFHX1JFTU9URV9QSywgJnNtcC0+ZmxhZ3MpKQorCQkJcmV0dXJuIHNjX2NoZWNrX2NvbmZpcm0oc21wKTsKKworCQlCVF9FUlIoIlVuZXhwZWN0ZWQgU01QIFBhaXJpbmcgQ29uZmlybSIpOworCisJCXJldCA9IGZpeHVwX3NjX2ZhbHNlX3Bvc2l0aXZlKHNtcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KIAogCWlmIChjb25uLT5oY29uLT5vdXQpIHsKIAkJc21wX3NlbmRfY21kKGNvbm4sIFNNUF9DTURfUEFJUklOR19SQU5ET00sIHNpemVvZihzbXAtPnBybmQpLApAQCAtMTkyMyw4ICsyMDgxLDggQEAKIAogCWlmICh0ZXN0X2JpdChTTVBfRkxBR19US19WQUxJRCwgJnNtcC0+ZmxhZ3MpKQogCQlyZXR1cm4gc21wX2NvbmZpcm0oc21wKTsKLQllbHNlCi0JCXNldF9iaXQoU01QX0ZMQUdfQ0ZNX1BFTkRJTkcsICZzbXAtPmZsYWdzKTsKKworCXNldF9iaXQoU01QX0ZMQUdfQ0ZNX1BFTkRJTkcsICZzbXAtPmZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjA4Myw3ICsyMjQxLDcgQEAKIAogCWF1dGggPSBycC0+YXV0aF9yZXEgJiBBVVRIX1JFUV9NQVNLKGhkZXYpOwogCi0JaWYgKHRlc3RfYml0KEhDSV9TQ19PTkxZLCAmaGRldi0+ZGV2X2ZsYWdzKSAmJiAhKGF1dGggJiBTTVBfQVVUSF9TQykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9TQ19PTkxZKSAmJiAhKGF1dGggJiBTTVBfQVVUSF9TQykpCiAJCXJldHVybiBTTVBfQVVUSF9SRVFVSVJFTUVOVFM7CiAKIAlpZiAoaGNvbi0+aW9fY2FwYWJpbGl0eSA9PSBIQ0lfSU9fTk9fSU5QVVRfT1VUUFVUKQpAQCAtMjEwNCw3ICsyMjYyLDcgQEAKIAlpZiAoIXNtcCkKIAkJcmV0dXJuIFNNUF9VTlNQRUNJRklFRDsKIAotCWlmICghdGVzdF9iaXQoSENJX0JPTkRBQkxFLCAmaGNvbi0+aGRldi0+ZGV2X2ZsYWdzKSAmJgorCWlmICghaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0JPTkRBQkxFKSAmJgogCSAgICAoYXV0aCAmIFNNUF9BVVRIX0JPTkRJTkcpKQogCQlyZXR1cm4gU01QX1BBSVJJTkdfTk9UU1VQUDsKIApAQCAtMjEzOCw3ICsyMjk2LDcgQEAKIAogCWNoYW4gPSBjb25uLT5zbXA7CiAKLQlpZiAoIXRlc3RfYml0KEhDSV9MRV9FTkFCTEVELCAmaGNvbi0+aGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhjb24tPmhkZXYsIEhDSV9MRV9FTkFCTEVEKSkKIAkJcmV0dXJuIDE7CiAKIAlpZiAoc21wX3N1ZmZpY2llbnRfc2VjdXJpdHkoaGNvbiwgc2VjX2xldmVsLCBTTVBfVVNFX0xUSykpCkBAIC0yMTY3LDcgKzIzMjUsNyBAQAogCiAJYXV0aHJlcSA9IHNlY2xldmVsX3RvX2F1dGhyZXEoc2VjX2xldmVsKTsKIAotCWlmICh0ZXN0X2JpdChIQ0lfU0NfRU5BQkxFRCwgJmhjb24tPmhkZXYtPmRldl9mbGFncykpCisJaWYgKGhjaV9kZXZfdGVzdF9mbGFnKGhjb24tPmhkZXYsIEhDSV9TQ19FTkFCTEVEKSkKIAkJYXV0aHJlcSB8PSBTTVBfQVVUSF9TQzsKIAogCS8qIFJlcXVpcmUgTUlUTSBpZiBJTyBDYXBhYmlsaXR5IGFsbG93cyBvciB0aGUgc2VjdXJpdHkgbGV2ZWwKQEAgLTIzNTIsNyArMjUxMCwxMCBAQAogCiAJY3NyayA9IGt6YWxsb2Moc2l6ZW9mKCpjc3JrKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNzcmspIHsKLQkJY3Nyay0+bWFzdGVyID0gMHgwMTsKKwkJaWYgKGNvbm4tPmhjb24tPnNlY19sZXZlbCA+IEJUX1NFQ1VSSVRZX01FRElVTSkKKwkJCWNzcmstPnR5cGUgPSBNR01UX0NTUktfUkVNT1RFX0FVVEhFTlRJQ0FURUQ7CisJCWVsc2UKKwkJCWNzcmstPnR5cGUgPSBNR01UX0NTUktfUkVNT1RFX1VOQVVUSEVOVElDQVRFRDsKIAkJbWVtY3B5KGNzcmstPnZhbCwgcnAtPmNzcmssIHNpemVvZihjc3JrLT52YWwpKTsKIAl9CiAJc21wLT5jc3JrID0gY3NyazsKQEAgLTIzNjgsNyArMjUyOSw4IEBACiAJc3RydWN0IHNtcF9jbWRfcGFpcmluZyAqbG9jYWwsICpyZW1vdGU7CiAJdTggbG9jYWxfbWl0bSwgcmVtb3RlX21pdG0sIGxvY2FsX2lvLCByZW1vdGVfaW8sIG1ldGhvZDsKIAotCWlmICh0ZXN0X2JpdChTTVBfRkxBR19PT0IsICZzbXAtPmZsYWdzKSkKKwlpZiAodGVzdF9iaXQoU01QX0ZMQUdfUkVNT1RFX09PQiwgJnNtcC0+ZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KFNNUF9GTEFHX0xPQ0FMX09PQiwgJnNtcC0+ZmxhZ3MpKQogCQlyZXR1cm4gUkVRX09PQjsKIAogCS8qIFRoZSBwcmVxL3Byc3AgY29udGFpbiB0aGUgcmF3IFBhaXJpbmcgUmVxdWVzdC9SZXNwb25zZSBQRFVzCkBAIC0yNDIyLDYgKzI1ODQsMTYgQEAKIAogCW1lbWNweShzbXAtPnJlbW90ZV9waywga2V5LCA2NCk7CiAKKwlpZiAodGVzdF9iaXQoU01QX0ZMQUdfUkVNT1RFX09PQiwgJnNtcC0+ZmxhZ3MpKSB7CisJCWVyciA9IHNtcF9mNChzbXAtPnRmbV9jbWFjLCBzbXAtPnJlbW90ZV9waywgc21wLT5yZW1vdGVfcGssCisJCQkgICAgIHNtcC0+cnIsIDAsIGNmbS5jb25maXJtX3ZhbCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOworCisJCWlmIChtZW1jbXAoY2ZtLmNvbmZpcm1fdmFsLCBzbXAtPnBjbmYsIDE2KSkKKwkJCXJldHVybiBTTVBfQ09ORklSTV9GQUlMRUQ7CisJfQorCiAJLyogTm9uLWluaXRpYXRpbmcgZGV2aWNlIHNlbmRzIGl0cyBwdWJsaWMga2V5IGFmdGVyIHJlY2VpdmluZwogCSAqIHRoZSBrZXkgZnJvbSB0aGUgaW5pdGlhdGluZyBkZXZpY2UuCiAJICovCkBAIC0yNDMyLDcgKzI2MDQsNyBAQAogCX0KIAogCVNNUF9EQkcoIlJlbW90ZSBQdWJsaWMgS2V5IFg6ICUzMnBoTiIsIHNtcC0+cmVtb3RlX3BrKTsKLQlTTVBfREJHKCJSZW1vdGUgUHVibGljIEtleSBZOiAlMzJwaE4iLCAmc21wLT5yZW1vdGVfcGtbMzJdKTsKKwlTTVBfREJHKCJSZW1vdGUgUHVibGljIEtleSBZOiAlMzJwaE4iLCBzbXAtPnJlbW90ZV9wayArIDMyKTsKIAogCWlmICghZWNkaF9zaGFyZWRfc2VjcmV0KHNtcC0+cmVtb3RlX3BrLCBzbXAtPmxvY2FsX3NrLCBzbXAtPmRoa2V5KSkKIAkJcmV0dXJuIFNNUF9VTlNQRUNJRklFRDsKQEAgLTI0NzAsMTQgKzI2NDIsNiBAQAogCX0KIAogCWlmIChzbXAtPm1ldGhvZCA9PSBSRVFfT09CKSB7Ci0JCWVyciA9IHNtcF9mNChzbXAtPnRmbV9jbWFjLCBzbXAtPnJlbW90ZV9waywgc21wLT5yZW1vdGVfcGssCi0JCQkgICAgIHNtcC0+cnIsIDAsIGNmbS5jb25maXJtX3ZhbCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gU01QX1VOU1BFQ0lGSUVEOwotCi0JCWlmIChtZW1jbXAoY2ZtLmNvbmZpcm1fdmFsLCBzbXAtPnBjbmYsIDE2KSkKLQkJCXJldHVybiBTTVBfQ09ORklSTV9GQUlMRUQ7Ci0KIAkJaWYgKGhjb24tPm91dCkKIAkJCXNtcF9zZW5kX2NtZChjb25uLCBTTVBfQ01EX1BBSVJJTkdfUkFORE9NLAogCQkJCSAgICAgc2l6ZW9mKHNtcC0+cHJuZCksIHNtcC0+cHJuZCk7CkBAIC0yNTUwLDYgKzI3MTQsOCBAQAogCiAJaWYgKHNtcC0+bWV0aG9kID09IFJFUV9QQVNTS0VZIHx8IHNtcC0+bWV0aG9kID09IERTUF9QQVNTS0VZKQogCQlwdXRfdW5hbGlnbmVkX2xlMzIoaGNvbi0+cGFzc2tleV9ub3RpZnksIHIpOworCWVsc2UgaWYgKHNtcC0+bWV0aG9kID09IFJFUV9PT0IpCisJCW1lbWNweShyLCBzbXAtPmxyLCAxNik7CiAKIAllcnIgPSBzbXBfZjYoc21wLT50Zm1fY21hYywgc21wLT5tYWNrZXksIHNtcC0+cnJuZCwgc21wLT5wcm5kLCByLAogCQkgICAgIGlvX2NhcCwgcmVtb3RlX2FkZHIsIGxvY2FsX2FkZHIsIGUpOwpAQCAtMjYwMCw3ICsyNzY2LDcgQEAKIAlpZiAoc2tiLT5sZW4gPCAxKQogCQlyZXR1cm4gLUVJTFNFUTsKIAotCWlmICghdGVzdF9iaXQoSENJX0xFX0VOQUJMRUQsICZoY29uLT5oZGV2LT5kZXZfZmxhZ3MpKSB7CisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoY29uLT5oZGV2LCBIQ0lfTEVfRU5BQkxFRCkpIHsKIAkJcmVhc29uID0gU01QX1BBSVJJTkdfTk9UU1VQUDsKIAkJZ290byBkb25lOwogCX0KQEAgLTI3MzgsMTYgKzI5MDQsMTYgQEAKIAkJcmV0dXJuOwogCiAJLyogU2VjdXJlIENvbm5lY3Rpb25zIHN1cHBvcnQgbXVzdCBiZSBlbmFibGVkICovCi0JaWYgKCF0ZXN0X2JpdChIQ0lfU0NfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykpCisJaWYgKCFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfU0NfRU5BQkxFRCkpCiAJCXJldHVybjsKIAogCS8qIEJSL0VEUiBtdXN0IHVzZSBTZWN1cmUgQ29ubmVjdGlvbnMgZm9yIFNNUCAqLwogCWlmICghdGVzdF9iaXQoSENJX0NPTk5fQUVTX0NDTSwgJmhjb24tPmZsYWdzKSAmJgotCSAgICAhdGVzdF9iaXQoSENJX0ZPUkNFX0JSRURSX1NNUCwgJmhkZXYtPmRiZ19mbGFncykpCisJICAgICFoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfRk9SQ0VfQlJFRFJfU01QKSkKIAkJcmV0dXJuOwogCiAJLyogSWYgb3VyIExFIHN1cHBvcnQgaXMgbm90IGVuYWJsZWQgZG9uJ3QgZG8gYW55dGhpbmcgKi8KLQlpZiAoIXRlc3RfYml0KEhDSV9MRV9FTkFCTEVELCAmaGRldi0+ZGV2X2ZsYWdzKSkKKwlpZiAoIWhjaV9kZXZfdGVzdF9mbGFnKGhkZXYsIEhDSV9MRV9FTkFCTEVEKSkKIAkJcmV0dXJuOwogCiAJLyogRG9uJ3QgYm90aGVyIGlmIHJlbW90ZSBMRSBzdXBwb3J0IGlzIG5vdCBlbmFibGVkICovCkBAIC0yODUxLDcgKzMwMTcsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCXNrYi0+cHJpb3JpdHkgPSBIQ0lfUFJJT19NQVg7Ci0JYnRfY2Ioc2tiKS0+Y2hhbiA9IGNoYW47CisJYnRfY2Ioc2tiKS0+bDJjYXAuY2hhbiA9IGNoYW47CiAKIAlyZXR1cm4gc2tiOwogfQpAQCAtMjkyNCw1MSArMzA5MCw2MyBAQAogc3RhdGljIHN0cnVjdCBsMmNhcF9jaGFuICpzbXBfYWRkX2NpZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTE2IGNpZCkKIHsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbjsKLQlzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlcgkqdGZtX2FlczsKKwlzdHJ1Y3Qgc21wX2RldiAqc21wOworCXN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm1fYWVzOworCXN0cnVjdCBjcnlwdG9faGFzaCAqdGZtX2NtYWM7CiAKIAlpZiAoY2lkID09IEwyQ0FQX0NJRF9TTVBfQlJFRFIpIHsKLQkJdGZtX2FlcyA9IE5VTEw7CisJCXNtcCA9IE5VTEw7CiAJCWdvdG8gY3JlYXRlX2NoYW47CiAJfQogCi0JdGZtX2FlcyA9IGNyeXB0b19hbGxvY19ibGtjaXBoZXIoImVjYihhZXMpIiwgMCwgMCk7CisJc21wID0ga3phbGxvYyhzaXplb2YoKnNtcCksIEdGUF9LRVJORUwpOworCWlmICghc21wKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXRmbV9hZXMgPSBjcnlwdG9fYWxsb2NfYmxrY2lwaGVyKCJlY2IoYWVzKSIsIDAsIENSWVBUT19BTEdfQVNZTkMpOwogCWlmIChJU19FUlIodGZtX2FlcykpIHsKLQkJQlRfRVJSKCJVbmFibGUgdG8gY3JlYXRlIGNyeXB0byBjb250ZXh0Iik7CisJCUJUX0VSUigiVW5hYmxlIHRvIGNyZWF0ZSBFQ0IgY3J5cHRvIGNvbnRleHQiKTsKKwkJa3pmcmVlKHNtcCk7CiAJCXJldHVybiBFUlJfQ0FTVCh0Zm1fYWVzKTsKIAl9CiAKKwl0Zm1fY21hYyA9IGNyeXB0b19hbGxvY19oYXNoKCJjbWFjKGFlcykiLCAwLCBDUllQVE9fQUxHX0FTWU5DKTsKKwlpZiAoSVNfRVJSKHRmbV9jbWFjKSkgeworCQlCVF9FUlIoIlVuYWJsZSB0byBjcmVhdGUgQ01BQyBjcnlwdG8gY29udGV4dCIpOworCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIodGZtX2Flcyk7CisJCWt6ZnJlZShzbXApOworCQlyZXR1cm4gRVJSX0NBU1QodGZtX2NtYWMpOworCX0KKworCXNtcC0+dGZtX2FlcyA9IHRmbV9hZXM7CisJc21wLT50Zm1fY21hYyA9IHRmbV9jbWFjOworCiBjcmVhdGVfY2hhbjoKIAljaGFuID0gbDJjYXBfY2hhbl9jcmVhdGUoKTsKIAlpZiAoIWNoYW4pIHsKLQkJY3J5cHRvX2ZyZWVfYmxrY2lwaGVyKHRmbV9hZXMpOworCQlpZiAoc21wKSB7CisJCQljcnlwdG9fZnJlZV9ibGtjaXBoZXIoc21wLT50Zm1fYWVzKTsKKwkJCWNyeXB0b19mcmVlX2hhc2goc21wLT50Zm1fY21hYyk7CisJCQlremZyZWUoc21wKTsKKwkJfQogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CiAKLQljaGFuLT5kYXRhID0gdGZtX2FlczsKKwljaGFuLT5kYXRhID0gc21wOwogCiAJbDJjYXBfYWRkX3NjaWQoY2hhbiwgY2lkKTsKIAogCWwyY2FwX2NoYW5fc2V0X2RlZmF1bHRzKGNoYW4pOwogCiAJaWYgKGNpZCA9PSBMMkNBUF9DSURfU01QKSB7Ci0JCS8qIElmIHVzYWdlIG9mIHN0YXRpYyBhZGRyZXNzIGlzIGZvcmNlZCBvciBpZiB0aGUgZGV2aWNlcwotCQkgKiBkb2VzIG5vdCBoYXZlIGEgcHVibGljIGFkZHJlc3MsIHRoZW4gbGlzdGVuIG9uIHRoZSBzdGF0aWMKLQkJICogYWRkcmVzcy4KLQkJICoKLQkJICogSW4gY2FzZSBCUi9FRFIgaGFzIGJlZW4gZGlzYWJsZWQgb24gYSBkdWFsLW1vZGUgY29udHJvbGxlcgotCQkgKiBhbmQgYSBzdGF0aWMgYWRkcmVzcyBoYXMgYmVlbiBjb25maWd1ZWQsIHRoZW4gbGlzdGVuIG9uCi0JCSAqIHRoZSBzdGF0aWMgYWRkcmVzcyBpbnN0ZWFkLgotCQkgKi8KLQkJaWYgKHRlc3RfYml0KEhDSV9GT1JDRV9TVEFUSUNfQUREUiwgJmhkZXYtPmRiZ19mbGFncykgfHwKLQkJICAgICFiYWNtcCgmaGRldi0+YmRhZGRyLCBCREFERFJfQU5ZKSB8fAotCQkgICAgKCF0ZXN0X2JpdChIQ0lfQlJFRFJfRU5BQkxFRCwgJmhkZXYtPmRldl9mbGFncykgJiYKLQkJICAgICBiYWNtcCgmaGRldi0+c3RhdGljX2FkZHIsIEJEQUREUl9BTlkpKSkgewotCQkJYmFjcHkoJmNoYW4tPnNyYywgJmhkZXYtPnN0YXRpY19hZGRyKTsKLQkJCWNoYW4tPnNyY190eXBlID0gQkRBRERSX0xFX1JBTkRPTTsKLQkJfSBlbHNlIHsKLQkJCWJhY3B5KCZjaGFuLT5zcmMsICZoZGV2LT5iZGFkZHIpOworCQl1OCBiZGFkZHJfdHlwZTsKKworCQloY2lfY29weV9pZGVudGl0eV9hZGRyZXNzKGhkZXYsICZjaGFuLT5zcmMsICZiZGFkZHJfdHlwZSk7CisKKwkJaWYgKGJkYWRkcl90eXBlID09IEFERFJfTEVfREVWX1BVQkxJQykKIAkJCWNoYW4tPnNyY190eXBlID0gQkRBRERSX0xFX1BVQkxJQzsKLQkJfQorCQllbHNlCisJCQljaGFuLT5zcmNfdHlwZSA9IEJEQUREUl9MRV9SQU5ET007CiAJfSBlbHNlIHsKIAkJYmFjcHkoJmNoYW4tPnNyYywgJmhkZXYtPmJkYWRkcik7CiAJCWNoYW4tPnNyY190eXBlID0gQkRBRERSX0JSRURSOwpAQCAtMjk4NywxNCArMzE2NSwxOCBAQAogCiBzdGF0aWMgdm9pZCBzbXBfZGVsX2NoYW4oc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCiB7Ci0Jc3RydWN0IGNyeXB0b19ibGtjaXBoZXIJKnRmbV9hZXM7CisJc3RydWN0IHNtcF9kZXYgKnNtcDsKIAogCUJUX0RCRygiY2hhbiAlcCIsIGNoYW4pOwogCi0JdGZtX2FlcyA9IGNoYW4tPmRhdGE7Ci0JaWYgKHRmbV9hZXMpIHsKKwlzbXAgPSBjaGFuLT5kYXRhOworCWlmIChzbXApIHsKIAkJY2hhbi0+ZGF0YSA9IE5VTEw7Ci0JCWNyeXB0b19mcmVlX2Jsa2NpcGhlcih0Zm1fYWVzKTsKKwkJaWYgKHNtcC0+dGZtX2FlcykKKwkJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihzbXAtPnRmbV9hZXMpOworCQlpZiAoc21wLT50Zm1fY21hYykKKwkJCWNyeXB0b19mcmVlX2hhc2goc21wLT50Zm1fY21hYyk7CisJCWt6ZnJlZShzbXApOwogCX0KIAogCWwyY2FwX2NoYW5fcHV0KGNoYW4pOwpAQCAtMzAwNyw3ICszMTg5LDcgQEAKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAljaGFyIGJ1ZlszXTsKIAotCWJ1ZlswXSA9IHRlc3RfYml0KEhDSV9GT1JDRV9CUkVEUl9TTVAsICZoZGV2LT5kYmdfZmxhZ3MpID8gJ1knOiAnTic7CisJYnVmWzBdID0gaGNpX2Rldl90ZXN0X2ZsYWcoaGRldiwgSENJX0ZPUkNFX0JSRURSX1NNUCkgPyAnWSc6ICdOJzsKIAlidWZbMV0gPSAnXG4nOwogCWJ1ZlsyXSA9ICdcMCc7CiAJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCAyKTsKQEAgLTMwMjksNyArMzIxMSw3IEBACiAJaWYgKHN0cnRvYm9vbChidWYsICZlbmFibGUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChlbmFibGUgPT0gdGVzdF9iaXQoSENJX0ZPUkNFX0JSRURSX1NNUCwgJmhkZXYtPmRiZ19mbGFncykpCisJaWYgKGVuYWJsZSA9PSBoY2lfZGV2X3Rlc3RfZmxhZyhoZGV2LCBIQ0lfRk9SQ0VfQlJFRFJfU01QKSkKIAkJcmV0dXJuIC1FQUxSRUFEWTsKIAogCWlmIChlbmFibGUpIHsKQEAgLTMwNDgsNyArMzIzMCw3IEBACiAJCXNtcF9kZWxfY2hhbihjaGFuKTsKIAl9CiAKLQljaGFuZ2VfYml0KEhDSV9GT1JDRV9CUkVEUl9TTVAsICZoZGV2LT5kYmdfZmxhZ3MpOworCWhjaV9kZXZfY2hhbmdlX2ZsYWcoaGRldiwgSENJX0ZPUkNFX0JSRURSX1NNUCk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0zMzY3LDYgKzM1NDksMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNoYXIgdGVzdF9zbXBfYnVmZmVyWzMyXTsKKworc3RhdGljIHNzaXplX3QgdGVzdF9zbXBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCB0ZXN0X3NtcF9idWZmZXIsCisJCQkJICAgICAgIHN0cmxlbih0ZXN0X3NtcF9idWZmZXIpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGVzdF9zbXBfZm9wcyA9IHsKKwkub3BlbgkJPSBzaW1wbGVfb3BlbiwKKwkucmVhZAkJPSB0ZXN0X3NtcF9yZWFkLAorCS5sbHNlZWsJCT0gZGVmYXVsdF9sbHNlZWssCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBydW5fc2VsZnRlc3RzKHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm1fYWVzLAogCQkJCXN0cnVjdCBjcnlwdG9faGFzaCAqdGZtX2NtYWMpCiB7CkBAIC0zMzc5LDQ5ICszNTc2LDQ5IEBACiAJZXJyID0gdGVzdF9haCh0Zm1fYWVzKTsKIAlpZiAoZXJyKSB7CiAJCUJUX0VSUigic21wX2FoIHRlc3QgZmFpbGVkIik7Ci0JCXJldHVybiBlcnI7CisJCWdvdG8gZG9uZTsKIAl9CiAKIAllcnIgPSB0ZXN0X2MxKHRmbV9hZXMpOwogCWlmIChlcnIpIHsKIAkJQlRfRVJSKCJzbXBfYzEgdGVzdCBmYWlsZWQiKTsKLQkJcmV0dXJuIGVycjsKKwkJZ290byBkb25lOwogCX0KIAogCWVyciA9IHRlc3RfczEodGZtX2Flcyk7CiAJaWYgKGVycikgewogCQlCVF9FUlIoInNtcF9zMSB0ZXN0IGZhaWxlZCIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIGRvbmU7CiAJfQogCiAJZXJyID0gdGVzdF9mNCh0Zm1fY21hYyk7CiAJaWYgKGVycikgewogCQlCVF9FUlIoInNtcF9mNCB0ZXN0IGZhaWxlZCIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIGRvbmU7CiAJfQogCiAJZXJyID0gdGVzdF9mNSh0Zm1fY21hYyk7CiAJaWYgKGVycikgewogCQlCVF9FUlIoInNtcF9mNSB0ZXN0IGZhaWxlZCIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIGRvbmU7CiAJfQogCiAJZXJyID0gdGVzdF9mNih0Zm1fY21hYyk7CiAJaWYgKGVycikgewogCQlCVF9FUlIoInNtcF9mNiB0ZXN0IGZhaWxlZCIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIGRvbmU7CiAJfQogCiAJZXJyID0gdGVzdF9nMih0Zm1fY21hYyk7CiAJaWYgKGVycikgewogCQlCVF9FUlIoInNtcF9nMiB0ZXN0IGZhaWxlZCIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIGRvbmU7CiAJfQogCiAJZXJyID0gdGVzdF9oNih0Zm1fY21hYyk7CiAJaWYgKGVycikgewogCQlCVF9FUlIoInNtcF9oNiB0ZXN0IGZhaWxlZCIpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIGRvbmU7CiAJfQogCiAJcmV0dGltZSA9IGt0aW1lX2dldCgpOwpAQCAtMzQzMCw3ICszNjI3LDE3IEBACiAKIAlCVF9JTkZPKCJTTVAgdGVzdCBwYXNzZWQgaW4gJWxsdSB1c2VjcyIsIGR1cmF0aW9uKTsKIAotCXJldHVybiAwOworZG9uZToKKwlpZiAoIWVycikKKwkJc25wcmludGYodGVzdF9zbXBfYnVmZmVyLCBzaXplb2YodGVzdF9zbXBfYnVmZmVyKSwKKwkJCSAiUEFTUyAoJWxsdSB1c2VjcylcbiIsIGR1cmF0aW9uKTsKKwllbHNlCisJCXNucHJpbnRmKHRlc3Rfc21wX2J1ZmZlciwgc2l6ZW9mKHRlc3Rfc21wX2J1ZmZlciksICJGQUlMXG4iKTsKKworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInNlbGZ0ZXN0X3NtcCIsIDA0NDQsIGJ0X2RlYnVnZnMsIE5VTEwsCisJCQkgICAgJnRlc3Rfc21wX2ZvcHMpOworCisJcmV0dXJuIGVycjsKIH0KIAogaW50IF9faW5pdCBidF9zZWxmdGVzdF9zbXAodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvc21wLmggYi9uZXQvYmx1ZXRvb3RoL3NtcC5oCmluZGV4IDYwYzViNzMuLjZjZjg3MjUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvc21wLmgKKysrIGIvbmV0L2JsdWV0b290aC9zbXAuaApAQCAtMTg4LDYgKzE4OCw3IEBACiBib29sIHNtcF9pcmtfbWF0Y2hlcyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgY29uc3QgdTggaXJrWzE2XSwKIAkJICAgICBjb25zdCBiZGFkZHJfdCAqYmRhZGRyKTsKIGludCBzbXBfZ2VuZXJhdGVfcnBhKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBjb25zdCB1OCBpcmtbMTZdLCBiZGFkZHJfdCAqcnBhKTsKK2ludCBzbXBfZ2VuZXJhdGVfb29iKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBoYXNoWzE2XSwgdTggcmFuZFsxNl0pOwogCiBpbnQgc21wX3JlZ2lzdGVyKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIHZvaWQgc21wX3VucmVnaXN0ZXIoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKaW5kZXggZmZkMzc5ZC4uNGZmNzdhMSAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9kZXZpY2UuYworKysgYi9uZXQvYnJpZGdlL2JyX2RldmljZS5jCkBAIC0yNSw2ICsyNSw5IEBACiAjZGVmaW5lIENPTU1PTl9GRUFUVVJFUyAoTkVUSUZfRl9TRyB8IE5FVElGX0ZfRlJBR0xJU1QgfCBORVRJRl9GX0hJR0hETUEgfCBcCiAJCQkgTkVUSUZfRl9HU09fTUFTSyB8IE5FVElGX0ZfSFdfQ1NVTSkKIAorY29uc3Qgc3RydWN0IG5mX2JyX29wcyBfX3JjdSAqbmZfYnJfb3BzIF9fcmVhZF9tb3N0bHk7CitFWFBPUlRfU1lNQk9MX0dQTChuZl9icl9vcHMpOworCiAvKiBuZXQgZGV2aWNlIHRyYW5zbWl0IGFsd2F5cyBjYWxsZWQgd2l0aCBCSCBkaXNhYmxlZCAqLwogbmV0ZGV2X3R4X3QgYnJfZGV2X3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTMzLDE2ICszNiwxNSBAQAogCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZHN0OwogCXN0cnVjdCBuZXRfYnJpZGdlX21kYl9lbnRyeSAqbWRzdDsKIAlzdHJ1Y3QgcGNwdV9zd19uZXRzdGF0cyAqYnJzdGF0cyA9IHRoaXNfY3B1X3B0cihici0+c3RhdHMpOworCWNvbnN0IHN0cnVjdCBuZl9icl9vcHMgKm5mX29wczsKIAl1MTYgdmlkID0gMDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19CUklER0VfTkVURklMVEVSKQotCWlmIChza2ItPm5mX2JyaWRnZSAmJiAoc2tiLT5uZl9icmlkZ2UtPm1hc2sgJiBCUk5GX0JSSURHRURfRE5BVCkpIHsKLQkJYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoX2JyaWRnZV9zbG93KHNrYik7CisJbmZfb3BzID0gcmN1X2RlcmVmZXJlbmNlKG5mX2JyX29wcyk7CisJaWYgKG5mX29wcyAmJiBuZl9vcHMtPmJyX2Rldl94bWl0X2hvb2soc2tiKSkgewogCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9Ci0jZW5kaWYKIAogCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJmJyc3RhdHMtPnN5bmNwKTsKIAlicnN0YXRzLT50eF9wYWNrZXRzKys7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2ZvcndhcmQuYyBiL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCmluZGV4IGY5NjkzM2EuLmU5NzU3MmIgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCisrKyBiL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jCkBAIC0zNSwxMSArMzUsOSBAQAogCQlwLT5zdGF0ZSA9PSBCUl9TVEFURV9GT1JXQVJESU5HOwogfQogCi1pbnQgYnJfZGV2X3F1ZXVlX3B1c2hfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IGJyX2Rldl9xdWV1ZV9wdXNoX3htaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCS8qIGlwX2ZyYWdtZW50IGRvZXNuJ3QgY29weSB0aGUgTUFDIGhlYWRlciAqLwotCWlmIChuZl9icmlkZ2VfbWF5YmVfY29weV9oZWFkZXIoc2tiKSB8fAotCSAgICAhaXNfc2tiX2ZvcndhcmRhYmxlKHNrYi0+ZGV2LCBza2IpKSB7CisJaWYgKCFpc19za2JfZm9yd2FyZGFibGUoc2tiLT5kZXYsIHNrYikpIHsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJfSBlbHNlIHsKIAkJc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CkBAIC01MSw5ICs0OSwxMCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoYnJfZGV2X3F1ZXVlX3B1c2hfeG1pdCk7CiAKLWludCBicl9mb3J3YXJkX2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IGJyX2ZvcndhcmRfZmluaXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0JSSURHRSwgTkZfQlJfUE9TVF9ST1VUSU5HLCBza2IsIE5VTEwsIHNrYi0+ZGV2LAorCXJldHVybiBORl9IT09LKE5GUFJPVE9fQlJJREdFLCBORl9CUl9QT1NUX1JPVVRJTkcsIHNrLCBza2IsCisJCSAgICAgICBOVUxMLCBza2ItPmRldiwKIAkJICAgICAgIGJyX2Rldl9xdWV1ZV9wdXNoX3htaXQpOwogCiB9CkBAIC03Nyw3ICs3Niw4IEBACiAJCXJldHVybjsKIAl9CiAKLQlORl9IT09LKE5GUFJPVE9fQlJJREdFLCBORl9CUl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgc2tiLT5kZXYsCisJTkZfSE9PSyhORlBST1RPX0JSSURHRSwgTkZfQlJfTE9DQUxfT1VULCBOVUxMLCBza2IsCisJCU5VTEwsIHNrYi0+ZGV2LAogCQlicl9mb3J3YXJkX2ZpbmlzaCk7CiB9CiAKQEAgLTk4LDcgKzk4LDggQEAKIAlza2ItPmRldiA9IHRvLT5kZXY7CiAJc2tiX2ZvcndhcmRfY3N1bShza2IpOwogCi0JTkZfSE9PSyhORlBST1RPX0JSSURHRSwgTkZfQlJfRk9SV0FSRCwgc2tiLCBpbmRldiwgc2tiLT5kZXYsCisJTkZfSE9PSyhORlBST1RPX0JSSURHRSwgTkZfQlJfRk9SV0FSRCwgTlVMTCwgc2tiLAorCQlpbmRldiwgc2tiLT5kZXYsCiAJCWJyX2ZvcndhcmRfZmluaXNoKTsKIH0KIApAQCAtMTg4LDYgKzE4OSw5IEBACiAJCS8qIERvIG5vdCBmbG9vZCB0byBwb3J0cyB0aGF0IGVuYWJsZSBwcm94eSBBUlAgKi8KIAkJaWYgKHAtPmZsYWdzICYgQlJfUFJPWFlBUlApCiAJCQljb250aW51ZTsKKwkJaWYgKChwLT5mbGFncyAmIEJSX1BST1hZQVJQX1dJRkkpICYmCisJCSAgICBCUl9JTlBVVF9TS0JfQ0Ioc2tiKS0+cHJveHlhcnBfcmVwbGllZCkKKwkJCWNvbnRpbnVlOwogCiAJCXByZXYgPSBtYXliZV9kZWxpdmVyKHByZXYsIHAsIHNrYiwgX19wYWNrZXRfaG9vayk7CiAJCWlmIChJU19FUlIocHJldikpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lmLmMgYi9uZXQvYnJpZGdlL2JyX2lmLmMKaW5kZXggYjA4N2QyNy4uMTg0OWQ5NiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pZi5jCisrKyBiL25ldC9icmlkZ2UvYnJfaWYuYwpAQCAtNTYzLDYgKzU2Myw4IEBACiAJICovCiAJZGVsX25icChwKTsKIAorCWRldl9zZXRfbXR1KGJyLT5kZXYsIGJyX21pbl9tdHUoYnIpKTsKKwogCXNwaW5fbG9ja19iaCgmYnItPmxvY2spOwogCWNoYW5nZWRfYWRkciA9IGJyX3N0cF9yZWNhbGN1bGF0ZV9icmlkZ2VfaWQoYnIpOwogCXNwaW5fdW5sb2NrX2JoKCZici0+bG9jayk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2lucHV0LmMgYi9uZXQvYnJpZGdlL2JyX2lucHV0LmMKaW5kZXggZTJhYTdiZS4uZjkyMWE1ZCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9pbnB1dC5jCisrKyBiL25ldC9icmlkZ2UvYnJfaW5wdXQuYwpAQCAtNTUsMTIgKzU1LDEzIEBACiAJaWYgKCFza2IpCiAJCXJldHVybiBORVRfUlhfRFJPUDsKIAotCXJldHVybiBORl9IT09LKE5GUFJPVE9fQlJJREdFLCBORl9CUl9MT0NBTF9JTiwgc2tiLCBpbmRldiwgTlVMTCwKLQkJICAgICAgIG5ldGlmX3JlY2VpdmVfc2tiKTsKKwlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0JSSURHRSwgTkZfQlJfTE9DQUxfSU4sIE5VTEwsIHNrYiwKKwkJICAgICAgIGluZGV2LCBOVUxMLAorCQkgICAgICAgbmV0aWZfcmVjZWl2ZV9za2Jfc2spOwogfQogCiBzdGF0aWMgdm9pZCBicl9kb19wcm94eV9hcnAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9icmlkZ2UgKmJyLAotCQkJICAgIHUxNiB2aWQpCisJCQkgICAgdTE2IHZpZCwgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYnItPmRldjsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuOwpAQCAtNjgsNiArNjksOCBAQAogCXU4ICphcnBwdHIsICpzaGE7CiAJX19iZTMyIHNpcCwgdGlwOwogCisJQlJfSU5QVVRfU0tCX0NCKHNrYiktPnByb3h5YXJwX3JlcGxpZWQgPSBmYWxzZTsKKwogCWlmIChkZXYtPmZsYWdzICYgSUZGX05PQVJQKQogCQlyZXR1cm47CiAKQEAgLTEwNSwxNiArMTA4LDE5IEBACiAJCX0KIAogCQlmID0gX19icl9mZGJfZ2V0KGJyLCBuLT5oYSwgdmlkKTsKLQkJaWYgKGYpCisJCWlmIChmICYmICgocC0+ZmxhZ3MgJiBCUl9QUk9YWUFSUCkgfHwKKwkJCSAgKGYtPmRzdCAmJiAoZi0+ZHN0LT5mbGFncyAmIEJSX1BST1hZQVJQX1dJRkkpKSkpIHsKIAkJCWFycF9zZW5kKEFSUE9QX1JFUExZLCBFVEhfUF9BUlAsIHNpcCwgc2tiLT5kZXYsIHRpcCwKIAkJCQkgc2hhLCBuLT5oYSwgc2hhKTsKKwkJCUJSX0lOUFVUX1NLQl9DQihza2IpLT5wcm94eWFycF9yZXBsaWVkID0gdHJ1ZTsKKwkJfQogCiAJCW5laWdoX3JlbGVhc2Uobik7CiAJfQogfQogCiAvKiBub3RlOiBhbHJlYWR5IGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2sgKi8KLWludCBicl9oYW5kbGVfZnJhbWVfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCitpbnQgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJY29uc3QgdW5zaWduZWQgY2hhciAqZGVzdCA9IGV0aF9oZHIoc2tiKS0+aF9kZXN0OwogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnAgPSBicl9wb3J0X2dldF9yY3Uoc2tiLT5kZXYpOwpAQCAtMTUzLDEyICsxNTksMTAgQEAKIAogCWRzdCA9IE5VTEw7CiAKLQlpZiAoaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoZGVzdCkpIHsKLQkJaWYgKElTX0VOQUJMRUQoQ09ORklHX0lORVQpICYmCi0JCSAgICBwLT5mbGFncyAmIEJSX1BST1hZQVJQICYmCi0JCSAgICBza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0FSUCkpCi0JCQlicl9kb19wcm94eV9hcnAoc2tiLCBiciwgdmlkKTsKKwlpZiAoSVNfRU5BQkxFRChDT05GSUdfSU5FVCkgJiYgc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9BUlApKQorCQlicl9kb19wcm94eV9hcnAoc2tiLCBiciwgdmlkLCBwKTsKIAorCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewogCQlza2IyID0gc2tiOwogCQl1bmljYXN0ID0gZmFsc2U7CiAJfSBlbHNlIGlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihkZXN0KSkgewpAQCAtMjA0LDcgKzIwOCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChicl9oYW5kbGVfZnJhbWVfZmluaXNoKTsKIAogLyogbm90ZTogYWxyZWFkeSBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrICovCi1zdGF0aWMgaW50IGJyX2hhbmRsZV9sb2NhbF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgYnJfaGFuZGxlX2xvY2FsX2ZpbmlzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCA9IGJyX3BvcnRfZ2V0X3JjdShza2ItPmRldik7CiAJdTE2IHZpZCA9IDA7CkBAIC0yNzQsOCArMjc4LDggQEAKIAkJfQogCiAJCS8qIERlbGl2ZXIgcGFja2V0IHRvIGxvY2FsIGhvc3Qgb25seSAqLwotCQlpZiAoTkZfSE9PSyhORlBST1RPX0JSSURHRSwgTkZfQlJfTE9DQUxfSU4sIHNrYiwgc2tiLT5kZXYsCi0JCQkgICAgTlVMTCwgYnJfaGFuZGxlX2xvY2FsX2ZpbmlzaCkpIHsKKwkJaWYgKE5GX0hPT0soTkZQUk9UT19CUklER0UsIE5GX0JSX0xPQ0FMX0lOLCBOVUxMLCBza2IsCisJCQkgICAgc2tiLT5kZXYsIE5VTEwsIGJyX2hhbmRsZV9sb2NhbF9maW5pc2gpKSB7CiAJCQlyZXR1cm4gUlhfSEFORExFUl9DT05TVU1FRDsgLyogY29uc3VtZWQgYnkgZmlsdGVyICovCiAJCX0gZWxzZSB7CiAJCQkqcHNrYiA9IHNrYjsKQEAgLTI5OSw3ICszMDMsOCBAQAogCQlpZiAoZXRoZXJfYWRkcl9lcXVhbChwLT5ici0+ZGV2LT5kZXZfYWRkciwgZGVzdCkpCiAJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAKLQkJTkZfSE9PSyhORlBST1RPX0JSSURHRSwgTkZfQlJfUFJFX1JPVVRJTkcsIHNrYiwgc2tiLT5kZXYsIE5VTEwsCisJCU5GX0hPT0soTkZQUk9UT19CUklER0UsIE5GX0JSX1BSRV9ST1VUSU5HLCBOVUxMLCBza2IsCisJCQlza2ItPmRldiwgTlVMTCwKIAkJCWJyX2hhbmRsZV9mcmFtZV9maW5pc2gpOwogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9tdWx0aWNhc3QuYyBiL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMKaW5kZXggYzQ2NTg3Ni4uNGI2NzIyZiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9tdWx0aWNhc3QuYworKysgYi9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jCkBAIC04MTQsNyArODE0LDggQEAKIAogCWlmIChwb3J0KSB7CiAJCXNrYi0+ZGV2ID0gcG9ydC0+ZGV2OwotCQlORl9IT09LKE5GUFJPVE9fQlJJREdFLCBORl9CUl9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgc2tiLT5kZXYsCisJCU5GX0hPT0soTkZQUk9UT19CUklER0UsIE5GX0JSX0xPQ0FMX09VVCwgTlVMTCwgc2tiLAorCQkJTlVMTCwgc2tiLT5kZXYsCiAJCQlicl9kZXZfcXVldWVfcHVzaF94bWl0KTsKIAl9IGVsc2UgewogCQlicl9tdWx0aWNhc3Rfc2VsZWN0X293bl9xdWVyaWVyKGJyLCBpcCwgc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCmluZGV4IDBlZTQ1M2YuLmFiNTVlMjQgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYwpAQCAtMzcsMTcgKzM3LDE2IEBACiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9icl9uZXRmaWx0ZXIuaD4KIAorI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX0NPTk5UUkFDSykKKyNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjZW5kaWYKIAotI2RlZmluZSBza2Jfb3JpZ2FkZHIoc2tiKQkgKCgoc3RydWN0IGJyaWRnZV9za2JfY2IgKikgXAotCQkJCSAoc2tiLT5uZl9icmlkZ2UtPmRhdGEpKS0+ZGFkZHIuaXB2NCkKLSNkZWZpbmUgc3RvcmVfb3JpZ19kc3RhZGRyKHNrYikJIChza2Jfb3JpZ2FkZHIoc2tiKSA9IGlwX2hkcihza2IpLT5kYWRkcikKLSNkZWZpbmUgZG5hdF90b29rX3BsYWNlKHNrYikJIChza2Jfb3JpZ2FkZHIoc2tiKSAhPSBpcF9oZHIoc2tiKS0+ZGFkZHIpCi0KICNpZmRlZiBDT05GSUdfU1lTQ1RMCiBzdGF0aWMgc3RydWN0IGN0bF90YWJsZV9oZWFkZXIgKmJybmZfc3lzY3RsX2hlYWRlcjsKIHN0YXRpYyBpbnQgYnJuZl9jYWxsX2lwdGFibGVzIF9fcmVhZF9tb3N0bHkgPSAxOwpAQCAtMTEyLDYgKzExMSwyNCBAQAogCSBwcHBvZV9wcm90byhza2IpID09IGh0b25zKFBQUF9JUFY2KSAmJiBcCiAJIGJybmZfZmlsdGVyX3BwcG9lX3RhZ2dlZCkKIAorLyogbGFyZ2VzdCBwb3NzaWJsZSBMMiBoZWFkZXIsIHNlZSBicl9uZl9kZXZfcXVldWVfeG1pdCgpICovCisjZGVmaW5lIE5GX0JSSURHRV9NQVhfTUFDX0hFQURFUl9MRU5HVEggKFBQUE9FX1NFU19ITEVOICsgRVRIX0hMRU4pCisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9ERUZSQUdfSVBWNCkKK3N0cnVjdCBicm5mX2ZyYWdfZGF0YSB7CisJY2hhciBtYWNbTkZfQlJJREdFX01BWF9NQUNfSEVBREVSX0xFTkdUSF07CisJdTggZW5jYXBfc2l6ZTsKKwl1OCBzaXplOworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBicm5mX2ZyYWdfZGF0YSwgYnJuZl9mcmFnX2RhdGFfc3RvcmFnZSk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlX2luZm9fZ2V0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHNrYi0+bmZfYnJpZGdlOworfQorCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBydGFibGUgKmJyaWRnZV9wYXJlbnRfcnRhYmxlKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydDsKQEAgLTE1NCw2ICsxNzEsMTggQEAKIAlyZXR1cm4gbmZfYnJpZGdlOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IG5mX2JyaWRnZV9lbmNhcF9oZWFkZXJfbGVuKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CisJY2FzZSBfX2NwdV90b19iZTE2KEVUSF9QXzgwMjFRKToKKwkJcmV0dXJuIFZMQU5fSExFTjsKKwljYXNlIF9fY3B1X3RvX2JlMTYoRVRIX1BfUFBQX1NFUyk6CisJCXJldHVybiBQUFBPRV9TRVNfSExFTjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZl9icmlkZ2VfcHVzaF9lbmNhcF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAl1bnNpZ25lZCBpbnQgbGVuID0gbmZfYnJpZGdlX2VuY2FwX2hlYWRlcl9sZW4oc2tiKTsKQEAgLTE3OCwxNCArMjA3LDYgQEAKIAlza2ItPm5ldHdvcmtfaGVhZGVyICs9IGxlbjsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG5mX2JyaWRnZV9zYXZlX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWludCBoZWFkZXJfc2l6ZSA9IEVUSF9ITEVOICsgbmZfYnJpZGdlX2VuY2FwX2hlYWRlcl9sZW4oc2tiKTsKLQotCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgLWhlYWRlcl9zaXplLAotCQkJCQkgc2tiLT5uZl9icmlkZ2UtPmRhdGEsIGhlYWRlcl9zaXplKTsKLX0KLQogLyogV2hlbiBoYW5kaW5nIGEgcGFja2V0IG92ZXIgdG8gdGhlIElQIGxheWVyCiAgKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYSBza2IgdGhhdCBpcyBpbiB0aGUKICAqIGV4cGVjdGVkIGZvcm1hdApAQCAtMjM5LDE3ICsyNjAsMzEgQEAKIAlyZXR1cm4gLTE7CiB9CiAKK3N0YXRpYyB2b2lkIG5mX2JyaWRnZV91cGRhdGVfcHJvdG9jb2woc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzd2l0Y2ggKHNrYi0+bmZfYnJpZGdlLT5vcmlnX3Byb3RvKSB7CisJY2FzZSBCUk5GX1BST1RPXzgwMjFROgorCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyMVEpOworCQlicmVhazsKKwljYXNlIEJSTkZfUFJPVE9fUFBQT0U6CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9QUFBfU0VTKTsKKwkJYnJlYWs7CisJY2FzZSBCUk5GX1BST1RPX1VOQ0hBTkdFRDoKKwkJYnJlYWs7CisJfQorfQorCiAvKiBQRl9CUklER0UvUFJFX1JPVVRJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVW5kbyB0aGUgY2hhbmdlcyBtYWRlIGZvciBpcDZ0YWJsZXMgUFJFUk9VVElORyBhbmQgY29udGludWUgdGhlCiAgKiBicmlkZ2UgUFJFX1JPVVRJTkcgaG9vay4gKi8KLXN0YXRpYyBpbnQgYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoX2lwdjYoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoX2lwdjYoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7CisJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2UgPSBuZl9icmlkZ2VfaW5mb19nZXQoc2tiKTsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKIAotCWlmIChuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX1BLVF9UWVBFKSB7CisJaWYgKG5mX2JyaWRnZS0+cGt0X290aGVyaG9zdCkgewogCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX09USEVSSE9TVDsKLQkJbmZfYnJpZGdlLT5tYXNrIF49IEJSTkZfUEtUX1RZUEU7CisJCW5mX2JyaWRnZS0+cGt0X290aGVyaG9zdCA9IGZhbHNlOwogCX0KIAluZl9icmlkZ2UtPm1hc2sgXj0gQlJORl9ORl9CUklER0VfUFJFUk9VVElORzsKIApAQCAtMjYzLDcgKzI5OCw4IEBACiAJc2tiLT5kZXYgPSBuZl9icmlkZ2UtPnBoeXNpbmRldjsKIAluZl9icmlkZ2VfdXBkYXRlX3Byb3RvY29sKHNrYik7CiAJbmZfYnJpZGdlX3B1c2hfZW5jYXBfaGVhZGVyKHNrYik7Ci0JTkZfSE9PS19USFJFU0goTkZQUk9UT19CUklER0UsIE5GX0JSX1BSRV9ST1VUSU5HLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCU5GX0hPT0tfVEhSRVNIKE5GUFJPVE9fQlJJREdFLCBORl9CUl9QUkVfUk9VVElORywgc2ssIHNrYiwKKwkJICAgICAgIHNrYi0+ZGV2LCBOVUxMLAogCQkgICAgICAgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaCwgMSk7CiAKIAlyZXR1cm4gMDsKQEAgLTI3NCw5ICszMTAsOCBAQAogICogZG9uJ3QsIHdlIHVzZSB0aGUgbmVpZ2hib3VyIGZyYW1ld29yayB0byBmaW5kIG91dC4gSW4gYm90aCBjYXNlcywgd2UgbWFrZQogICogc3VyZSB0aGF0IGJyX2hhbmRsZV9mcmFtZV9maW5pc2goKSBpcyBjYWxsZWQgYWZ0ZXJ3YXJkcy4KICAqLwotc3RhdGljIGludCBicl9uZl9wcmVfcm91dGluZ19maW5pc2hfYnJpZGdlKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IGJyX25mX3ByZV9yb3V0aW5nX2ZpbmlzaF9icmlkZ2Uoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7CiAJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCkBAIC0yODYsMTIgKzMyMSwxMyBAQAogCWRzdCA9IHNrYl9kc3Qoc2tiKTsKIAluZWlnaCA9IGRzdF9uZWlnaF9sb29rdXBfc2tiKGRzdCwgc2tiKTsKIAlpZiAobmVpZ2gpIHsKKwkJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2UgPSBuZl9icmlkZ2VfaW5mb19nZXQoc2tiKTsKIAkJaW50IHJldDsKIAogCQlpZiAobmVpZ2gtPmhoLmhoX2xlbikgewogCQkJbmVpZ2hfaGhfYnJpZGdlKCZuZWlnaC0+aGgsIHNrYik7CiAJCQlza2ItPmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2OwotCQkJcmV0ID0gYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaChza2IpOworCQkJcmV0ID0gYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaChzaywgc2tiKTsKIAkJfSBlbHNlIHsKIAkJCS8qIHRoZSBuZWlnaGJvdXIgZnVuY3Rpb24gYmVsb3cgb3ZlcndyaXRlcyB0aGUgY29tcGxldGUKIAkJCSAqIE1BQyBoZWFkZXIsIHNvIHdlIHNhdmUgdGhlIEV0aGVybmV0IHNvdXJjZSBhZGRyZXNzIGFuZApAQCAtMjk5LDcgKzMzNSw3IEBACiAJCQkgKi8KIAkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwKIAkJCQkJCQkgLShFVEhfSExFTi1FVEhfQUxFTiksCi0JCQkJCQkJIHNrYi0+bmZfYnJpZGdlLT5kYXRhLAorCQkJCQkJCSBuZl9icmlkZ2UtPm5laWdoX2hlYWRlciwKIAkJCQkJCQkgRVRIX0hMRU4tRVRIX0FMRU4pOwogCQkJLyogdGVsbCBicl9kZXZfeG1pdCB0byBjb250aW51ZSB3aXRoIGZvcndhcmRpbmcgKi8KIAkJCW5mX2JyaWRnZS0+bWFzayB8PSBCUk5GX0JSSURHRURfRE5BVDsKQEAgLTMxNCw2ICszNTAsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGJvb2wgZG5hdF90b29rX3BsYWNlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCit7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLKQorCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOworCXN0cnVjdCBuZl9jb25uICpjdDsKKworCWN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CisJaWYgKCFjdCB8fCBuZl9jdF9pc191bnRyYWNrZWQoY3QpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdGVzdF9iaXQoSVBTX0RTVF9OQVRfQklULCAmY3QtPnN0YXR1cyk7CisjZWxzZQorCXJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorCiAvKiBUaGlzIHJlcXVpcmVzIHNvbWUgZXhwbGFpbmluZy4gSWYgRE5BVCBoYXMgdGFrZW4gcGxhY2UsCiAgKiB3ZSB3aWxsIG5lZWQgdG8gZml4IHVwIHRoZSBkZXN0aW5hdGlvbiBFdGhlcm5ldCBhZGRyZXNzLgogICoKQEAgLTM1MiwxMSArNDA0LDExIEBACiAgKiBkZXZpY2UsIHdlIHByb2NlZWQgYXMgaWYgaXBfcm91dGVfaW5wdXQoKSBzdWNjZWVkZWQuIElmIGl0IGRpZmZlcnMgZnJvbSB0aGUKICAqIGxvZ2ljYWwgYnJpZGdlIHBvcnQgb3IgaWYgaXBfcm91dGVfb3V0cHV0X2tleSgpIGZhaWxzIHdlIGRyb3AgdGhlIHBhY2tldC4KICAqLwotc3RhdGljIGludCBicl9uZl9wcmVfcm91dGluZ19maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7CiAJc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKLQlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZSA9IHNrYi0+bmZfYnJpZGdlOworCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gbmZfYnJpZGdlX2luZm9fZ2V0KHNrYik7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7CiAJaW50IGVycjsKIAlpbnQgZnJhZ19tYXhfc2l6ZTsKQEAgLTM2NCw5ICs0MTYsOSBAQAogCWZyYWdfbWF4X3NpemUgPSBJUENCKHNrYiktPmZyYWdfbWF4X3NpemU7CiAJQlJfSU5QVVRfU0tCX0NCKHNrYiktPmZyYWdfbWF4X3NpemUgPSBmcmFnX21heF9zaXplOwogCi0JaWYgKG5mX2JyaWRnZS0+bWFzayAmIEJSTkZfUEtUX1RZUEUpIHsKKwlpZiAobmZfYnJpZGdlLT5wa3Rfb3RoZXJob3N0KSB7CiAJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwotCQluZl9icmlkZ2UtPm1hc2sgXj0gQlJORl9QS1RfVFlQRTsKKwkJbmZfYnJpZGdlLT5wa3Rfb3RoZXJob3N0ID0gZmFsc2U7CiAJfQogCW5mX2JyaWRnZS0+bWFzayBePSBCUk5GX05GX0JSSURHRV9QUkVST1VUSU5HOwogCWlmIChkbmF0X3Rvb2tfcGxhY2Uoc2tiKSkgewpAQCAtNDA1LDcgKzQ1Nyw3IEBACiAJCQkJbmZfYnJpZGdlX3B1c2hfZW5jYXBfaGVhZGVyKHNrYik7CiAJCQkJTkZfSE9PS19USFJFU0goTkZQUk9UT19CUklER0UsCiAJCQkJCSAgICAgICBORl9CUl9QUkVfUk9VVElORywKLQkJCQkJICAgICAgIHNrYiwgc2tiLT5kZXYsIE5VTEwsCisJCQkJCSAgICAgICBzaywgc2tiLCBza2ItPmRldiwgTlVMTCwKIAkJCQkJICAgICAgIGJyX25mX3ByZV9yb3V0aW5nX2ZpbmlzaF9icmlkZ2UsCiAJCQkJCSAgICAgICAxKTsKIAkJCQlyZXR1cm4gMDsKQEAgLTQyNSw3ICs0NzcsOCBAQAogCXNrYi0+ZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7CiAJbmZfYnJpZGdlX3VwZGF0ZV9wcm90b2NvbChza2IpOwogCW5mX2JyaWRnZV9wdXNoX2VuY2FwX2hlYWRlcihza2IpOwotCU5GX0hPT0tfVEhSRVNIKE5GUFJPVE9fQlJJREdFLCBORl9CUl9QUkVfUk9VVElORywgc2tiLCBza2ItPmRldiwgTlVMTCwKKwlORl9IT09LX1RIUkVTSChORlBST1RPX0JSSURHRSwgTkZfQlJfUFJFX1JPVVRJTkcsIHNrLCBza2IsCisJCSAgICAgICBza2ItPmRldiwgTlVMTCwKIAkJICAgICAgIGJyX2hhbmRsZV9mcmFtZV9maW5pc2gsIDEpOwogCiAJcmV0dXJuIDA7CkBAIC00NDgsMjAgKzUwMSwyMSBAQAogLyogU29tZSBjb21tb24gY29kZSBmb3IgSVB2NC9JUHY2ICovCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKnNldHVwX3ByZV9yb3V0aW5nKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZTsKKwlzdHJ1Y3QgbmZfYnJpZGdlX2luZm8gKm5mX2JyaWRnZSA9IG5mX2JyaWRnZV9pbmZvX2dldChza2IpOwogCiAJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkgewogCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7Ci0JCW5mX2JyaWRnZS0+bWFzayB8PSBCUk5GX1BLVF9UWVBFOworCQluZl9icmlkZ2UtPnBrdF9vdGhlcmhvc3QgPSB0cnVlOwogCX0KIAogCW5mX2JyaWRnZS0+bWFzayB8PSBCUk5GX05GX0JSSURHRV9QUkVST1VUSU5HOwogCW5mX2JyaWRnZS0+cGh5c2luZGV2ID0gc2tiLT5kZXY7CiAJc2tiLT5kZXYgPSBicm5mX2dldF9sb2dpY2FsX2Rldihza2IsIHNrYi0+ZGV2KTsKKwogCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkKLQkJbmZfYnJpZGdlLT5tYXNrIHw9IEJSTkZfODAyMVE7CisJCW5mX2JyaWRnZS0+b3JpZ19wcm90byA9IEJSTkZfUFJPVE9fODAyMVE7CiAJZWxzZSBpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9QUFBfU0VTKSkKLQkJbmZfYnJpZGdlLT5tYXNrIHw9IEJSTkZfUFBQb0U7CisJCW5mX2JyaWRnZS0+b3JpZ19wcm90byA9IEJSTkZfUFJPVE9fUFBQT0U7CiAKIAkvKiBNdXN0IGRyb3Agc29ja2V0IG5vdyBiZWNhdXNlIG9mIHRwcm94eS4gKi8KIAlza2Jfb3JwaGFuKHNrYik7CkBAIC01MjcsOSArNTgxLDcgQEAKICAqIHRvIGlwNnRhYmxlcywgd2hpY2ggZG9lc24ndCBzdXBwb3J0IE5BVCwgc28gdGhpbmdzIGFyZSBmYWlybHkgc2ltcGxlLiAqLwogc3RhdGljIHVuc2lnbmVkIGludCBicl9uZl9wcmVfcm91dGluZ19pcHY2KGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJCSAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCQkgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmhkcjsKIAl1MzIgcGt0X2xlbjsKQEAgLTU2Myw3ICs2MTUsOCBAQAogCQlyZXR1cm4gTkZfRFJPUDsKIAogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKLQlORl9IT09LKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9QUkVfUk9VVElORywgc2tiLCBza2ItPmRldiwgTlVMTCwKKwlORl9IT09LKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9QUkVfUk9VVElORywgc3RhdGUtPnNrLCBza2IsCisJCXNrYi0+ZGV2LCBOVUxMLAogCQlicl9uZl9wcmVfcm91dGluZ19maW5pc2hfaXB2Nik7CiAKIAlyZXR1cm4gTkZfU1RPTEVOOwpAQCAtNTc3LDkgKzYzMCw3IEBACiAgKiBhZGRyZXNzIHRvIGJlIGFibGUgdG8gZGV0ZWN0IEROQVQgYWZ0ZXJ3YXJkcy4gKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgYnJfbmZfcHJlX3JvdXRpbmcoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnI7CkBAIC01ODgsNyArNjM5LDcgQEAKIAlpZiAodW5saWtlbHkoIXBza2JfbWF5X3B1bGwoc2tiLCBsZW4pKSkKIAkJcmV0dXJuIE5GX0RST1A7CiAKLQlwID0gYnJfcG9ydF9nZXRfcmN1KGluKTsKKwlwID0gYnJfcG9ydF9nZXRfcmN1KHN0YXRlLT5pbik7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIE5GX0RST1A7CiAJYnIgPSBwLT5icjsKQEAgLTU5OCw3ICs2NDksNyBAQAogCQkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCQluZl9icmlkZ2VfcHVsbF9lbmNhcF9oZWFkZXJfcmNzdW0oc2tiKTsKLQkJcmV0dXJuIGJyX25mX3ByZV9yb3V0aW5nX2lwdjYob3BzLCBza2IsIGluLCBvdXQsIG9rZm4pOworCQlyZXR1cm4gYnJfbmZfcHJlX3JvdXRpbmdfaXB2NihvcHMsIHNrYiwgc3RhdGUpOwogCX0KIAogCWlmICghYnJuZl9jYWxsX2lwdGFibGVzICYmICFici0+bmZfY2FsbF9pcHRhYmxlcykKQEAgLTYxNywxMCArNjY4LDExIEBACiAJCXJldHVybiBORl9EUk9QOwogCWlmICghc2V0dXBfcHJlX3JvdXRpbmcoc2tiKSkKIAkJcmV0dXJuIE5GX0RST1A7Ci0Jc3RvcmVfb3JpZ19kc3RhZGRyKHNrYik7CisKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwogCi0JTkZfSE9PSyhORlBST1RPX0lQVjQsIE5GX0lORVRfUFJFX1JPVVRJTkcsIHNrYiwgc2tiLT5kZXYsIE5VTEwsCisJTkZfSE9PSyhORlBST1RPX0lQVjQsIE5GX0lORVRfUFJFX1JPVVRJTkcsIHN0YXRlLT5zaywgc2tiLAorCQlza2ItPmRldiwgTlVMTCwKIAkJYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoKTsKIAogCXJldHVybiBORl9TVE9MRU47CkBAIC02MzYsMjUgKzY4OCwzMCBAQAogICogcHJldmVudCB0aGlzIGZyb20gaGFwcGVuaW5nLiAqLwogc3RhdGljIHVuc2lnbmVkIGludCBicl9uZl9sb2NhbF9pbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCSAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKIAlicl9kcm9wX2Zha2VfcnRhYmxlKHNrYik7CiAJcmV0dXJuIE5GX0FDQ0VQVDsKIH0KIAogLyogUEZfQlJJREdFL0ZPUldBUkQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgYnJfbmZfZm9yd2FyZF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgYnJfbmZfZm9yd2FyZF9maW5pc2goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7CisJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2UgPSBuZl9icmlkZ2VfaW5mb19nZXQoc2tiKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqaW47CiAKIAlpZiAoIUlTX0FSUChza2IpICYmICFJU19WTEFOX0FSUChza2IpKSB7CisJCWludCBmcmFnX21heF9zaXplOworCisJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSkgeworCQkJZnJhZ19tYXhfc2l6ZSA9IElQQ0Ioc2tiKS0+ZnJhZ19tYXhfc2l6ZTsKKwkJCUJSX0lOUFVUX1NLQl9DQihza2IpLT5mcmFnX21heF9zaXplID0gZnJhZ19tYXhfc2l6ZTsKKwkJfQorCiAJCWluID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7Ci0JCWlmIChuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX1BLVF9UWVBFKSB7CisJCWlmIChuZl9icmlkZ2UtPnBrdF9vdGhlcmhvc3QpIHsKIAkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfT1RIRVJIT1NUOwotCQkJbmZfYnJpZGdlLT5tYXNrIF49IEJSTkZfUEtUX1RZUEU7CisJCQluZl9icmlkZ2UtPnBrdF9vdGhlcmhvc3QgPSBmYWxzZTsKIAkJfQogCQluZl9icmlkZ2VfdXBkYXRlX3Byb3RvY29sKHNrYik7CiAJfSBlbHNlIHsKQEAgLTY2Miw4ICs3MTksOCBAQAogCX0KIAluZl9icmlkZ2VfcHVzaF9lbmNhcF9oZWFkZXIoc2tiKTsKIAotCU5GX0hPT0tfVEhSRVNIKE5GUFJPVE9fQlJJREdFLCBORl9CUl9GT1JXQVJELCBza2IsIGluLAotCQkgICAgICAgc2tiLT5kZXYsIGJyX2ZvcndhcmRfZmluaXNoLCAxKTsKKwlORl9IT09LX1RIUkVTSChORlBST1RPX0JSSURHRSwgTkZfQlJfRk9SV0FSRCwgc2ssIHNrYiwKKwkJICAgICAgIGluLCBza2ItPmRldiwgYnJfZm9yd2FyZF9maW5pc2gsIDEpOwogCXJldHVybiAwOwogfQogCkBAIC02NzUsOSArNzMyLDcgQEAKICAqIGJyaWRnZSBwb3J0cy4gKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgYnJfbmZfZm9yd2FyZF9pcChjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2U7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnBhcmVudDsKQEAgLTY5MSw3ICs3NDYsMTEgQEAKIAlpZiAoIW5mX2JyaWRnZV91bnNoYXJlKHNrYikpCiAJCXJldHVybiBORl9EUk9QOwogCi0JcGFyZW50ID0gYnJpZGdlX3BhcmVudChvdXQpOworCW5mX2JyaWRnZSA9IG5mX2JyaWRnZV9pbmZvX2dldChza2IpOworCWlmICghbmZfYnJpZGdlKQorCQlyZXR1cm4gTkZfRFJPUDsKKworCXBhcmVudCA9IGJyaWRnZV9wYXJlbnQoc3RhdGUtPm91dCk7CiAJaWYgKCFwYXJlbnQpCiAJCXJldHVybiBORl9EUk9QOwogCkBAIC03MDQsNDAgKzc2Myw0MiBAQAogCiAJbmZfYnJpZGdlX3B1bGxfZW5jYXBfaGVhZGVyKHNrYik7CiAKLQluZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZTsKIAlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfT1RIRVJIT1NUKSB7CiAJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKLQkJbmZfYnJpZGdlLT5tYXNrIHw9IEJSTkZfUEtUX1RZUEU7CisJCW5mX2JyaWRnZS0+cGt0X290aGVyaG9zdCA9IHRydWU7CiAJfQogCi0JaWYgKHBmID09IE5GUFJPVE9fSVBWNCAmJiBicl9wYXJzZV9pcF9vcHRpb25zKHNrYikpCi0JCXJldHVybiBORl9EUk9QOworCWlmIChwZiA9PSBORlBST1RPX0lQVjQpIHsKKwkJaW50IGZyYWdfbWF4ID0gQlJfSU5QVVRfU0tCX0NCKHNrYiktPmZyYWdfbWF4X3NpemU7CiAKLQkvKiBUaGUgcGh5c2RldiBtb2R1bGUgY2hlY2tzIG9uIHRoaXMgKi8KLQluZl9icmlkZ2UtPm1hc2sgfD0gQlJORl9CUklER0VEOworCQlpZiAoYnJfcGFyc2VfaXBfb3B0aW9ucyhza2IpKQorCQkJcmV0dXJuIE5GX0RST1A7CisKKwkJSVBDQihza2IpLT5mcmFnX21heF9zaXplID0gZnJhZ19tYXg7CisJfQorCiAJbmZfYnJpZGdlLT5waHlzb3V0ZGV2ID0gc2tiLT5kZXY7CiAJaWYgKHBmID09IE5GUFJPVE9fSVBWNCkKIAkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKIAllbHNlCiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKIAotCU5GX0hPT0socGYsIE5GX0lORVRfRk9SV0FSRCwgc2tiLCBicm5mX2dldF9sb2dpY2FsX2Rldihza2IsIGluKSwgcGFyZW50LAotCQlicl9uZl9mb3J3YXJkX2ZpbmlzaCk7CisJTkZfSE9PSyhwZiwgTkZfSU5FVF9GT1JXQVJELCBOVUxMLCBza2IsCisJCWJybmZfZ2V0X2xvZ2ljYWxfZGV2KHNrYiwgc3RhdGUtPmluKSwKKwkJcGFyZW50LAlicl9uZl9mb3J3YXJkX2ZpbmlzaCk7CiAKIAlyZXR1cm4gTkZfU1RPTEVOOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGJyX25mX2ZvcndhcmRfYXJwKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7CiAJc3RydWN0IG5ldF9icmlkZ2UgKmJyOwogCXN0cnVjdCBuZXRfZGV2aWNlICoqZCA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKikoc2tiLT5jYik7CiAKLQlwID0gYnJfcG9ydF9nZXRfcmN1KG91dCk7CisJcCA9IGJyX3BvcnRfZ2V0X3JjdShzdGF0ZS0+b3V0KTsKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTkZfQUNDRVBUOwogCWJyID0gcC0+YnI7CkBAIC03NTYsNTUgKzgxNyw5MyBAQAogCQkJbmZfYnJpZGdlX3B1c2hfZW5jYXBfaGVhZGVyKHNrYik7CiAJCXJldHVybiBORl9BQ0NFUFQ7CiAJfQotCSpkID0gKHN0cnVjdCBuZXRfZGV2aWNlICopaW47Ci0JTkZfSE9PSyhORlBST1RPX0FSUCwgTkZfQVJQX0ZPUldBUkQsIHNrYiwgKHN0cnVjdCBuZXRfZGV2aWNlICopaW4sCi0JCShzdHJ1Y3QgbmV0X2RldmljZSAqKW91dCwgYnJfbmZfZm9yd2FyZF9maW5pc2gpOworCSpkID0gc3RhdGUtPmluOworCU5GX0hPT0soTkZQUk9UT19BUlAsIE5GX0FSUF9GT1JXQVJELCBzdGF0ZS0+c2ssIHNrYiwKKwkJc3RhdGUtPmluLCBzdGF0ZS0+b3V0LCBicl9uZl9mb3J3YXJkX2ZpbmlzaCk7CiAKIAlyZXR1cm4gTkZfU1RPTEVOOwogfQogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfREVGUkFHX0lQVjQpCi1zdGF0aWMgaW50IGJyX25mX2Rldl9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IGJyX25mX3B1c2hfZnJhZ194bWl0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgYnJuZl9mcmFnX2RhdGEgKmRhdGE7CisJaW50IGVycjsKKworCWRhdGEgPSB0aGlzX2NwdV9wdHIoJmJybmZfZnJhZ19kYXRhX3N0b3JhZ2UpOworCWVyciA9IHNrYl9jb3dfaGVhZChza2IsIGRhdGEtPnNpemUpOworCisJaWYgKGVycikgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwgLWRhdGEtPnNpemUsIGRhdGEtPm1hYywgZGF0YS0+c2l6ZSk7CisJX19za2JfcHVzaChza2IsIGRhdGEtPmVuY2FwX3NpemUpOworCisJcmV0dXJuIGJyX2Rldl9xdWV1ZV9wdXNoX3htaXQoc2ssIHNrYik7Cit9CisKK3N0YXRpYyBpbnQgYnJfbmZfZGV2X3F1ZXVlX3htaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCByZXQ7CiAJaW50IGZyYWdfbWF4X3NpemU7CisJdW5zaWduZWQgaW50IG10dV9yZXNlcnZlZDsKIAorCWlmIChza2JfaXNfZ3NvKHNrYikgfHwgc2tiLT5wcm90b2NvbCAhPSBodG9ucyhFVEhfUF9JUCkpCisJCXJldHVybiBicl9kZXZfcXVldWVfcHVzaF94bWl0KHNrLCBza2IpOworCisJbXR1X3Jlc2VydmVkID0gbmZfYnJpZGdlX210dV9yZWR1Y3Rpb24oc2tiKTsKIAkvKiBUaGlzIGlzIHdyb25nISBXZSBzaG91bGQgcHJlc2VydmUgdGhlIG9yaWdpbmFsIGZyYWdtZW50CiAJICogYm91bmRhcmllcyBieSBwcmVzZXJ2aW5nIGZyYWdfbGlzdCByYXRoZXIgdGhhbiByZWZyYWdtZW50aW5nLgogCSAqLwotCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQKSAmJgotCSAgICBza2ItPmxlbiArIG5mX2JyaWRnZV9tdHVfcmVkdWN0aW9uKHNrYikgPiBza2ItPmRldi0+bXR1ICYmCi0JICAgICFza2JfaXNfZ3NvKHNrYikpIHsKKwlpZiAoc2tiLT5sZW4gKyBtdHVfcmVzZXJ2ZWQgPiBza2ItPmRldi0+bXR1KSB7CisJCXN0cnVjdCBicm5mX2ZyYWdfZGF0YSAqZGF0YTsKKwogCQlmcmFnX21heF9zaXplID0gQlJfSU5QVVRfU0tCX0NCKHNrYiktPmZyYWdfbWF4X3NpemU7CiAJCWlmIChicl9wYXJzZV9pcF9vcHRpb25zKHNrYikpCiAJCQkvKiBEcm9wIGludmFsaWQgcGFja2V0ICovCiAJCQlyZXR1cm4gTkZfRFJPUDsKIAkJSVBDQihza2IpLT5mcmFnX21heF9zaXplID0gZnJhZ19tYXhfc2l6ZTsKLQkJcmV0ID0gaXBfZnJhZ21lbnQoc2tiLCBicl9kZXZfcXVldWVfcHVzaF94bWl0KTsKLQl9IGVsc2UKLQkJcmV0ID0gYnJfZGV2X3F1ZXVlX3B1c2hfeG1pdChza2IpOworCisJCW5mX2JyaWRnZV91cGRhdGVfcHJvdG9jb2woc2tiKTsKKworCQlkYXRhID0gdGhpc19jcHVfcHRyKCZicm5mX2ZyYWdfZGF0YV9zdG9yYWdlKTsKKwkJZGF0YS0+ZW5jYXBfc2l6ZSA9IG5mX2JyaWRnZV9lbmNhcF9oZWFkZXJfbGVuKHNrYik7CisJCWRhdGEtPnNpemUgPSBFVEhfSExFTiArIGRhdGEtPmVuY2FwX3NpemU7CisKKwkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YV9vZmZzZXQoc2tiLCAtZGF0YS0+c2l6ZSwgZGF0YS0+bWFjLAorCQkJCQkJIGRhdGEtPnNpemUpOworCisJCXJldCA9IGlwX2ZyYWdtZW50KHNrLCBza2IsIGJyX25mX3B1c2hfZnJhZ194bWl0KTsKKwl9IGVsc2UgeworCQlyZXQgPSBicl9kZXZfcXVldWVfcHVzaF94bWl0KHNrLCBza2IpOworCX0KIAogCXJldHVybiByZXQ7CiB9CiAjZWxzZQotc3RhdGljIGludCBicl9uZl9kZXZfcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBicl9uZl9kZXZfcXVldWVfeG1pdChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0gICAgICAgIHJldHVybiBicl9kZXZfcXVldWVfcHVzaF94bWl0KHNrYik7CisgICAgICAgIHJldHVybiBicl9kZXZfcXVldWVfcHVzaF94bWl0KHNrLCBza2IpOwogfQogI2VuZGlmCiAKIC8qIFBGX0JSSURHRS9QT1NUX1JPVVRJTkcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdW5zaWduZWQgaW50IGJyX25mX3Bvc3Rfcm91dGluZyhjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewotCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7CisJc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2UgPSBuZl9icmlkZ2VfaW5mb19nZXQoc2tiKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbG91dGRldiA9IGJyaWRnZV9wYXJlbnQoc2tiLT5kZXYpOwogCXVfaW50OF90IHBmOwogCi0JaWYgKCFuZl9icmlkZ2UgfHwgIShuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX0JSSURHRUQpKQorCS8qIGlmIG5mX2JyaWRnZSBpcyBzZXQsIGJ1dCAtPnBoeXNvdXRkZXYgaXMgTlVMTCwgdGhpcyBwYWNrZXQgY2FtZSBpbgorCSAqIG9uIGEgYnJpZGdlLCBidXQgd2FzIGRlbGl2ZXJlZCBsb2NhbGx5IGFuZCBpcyBub3cgYmVpbmcgcm91dGVkOgorCSAqCisJICogUE9TVF9ST1VUSU5HIHdhcyBhbHJlYWR5IGludm9rZWQgZnJvbSB0aGUgaXAgc3RhY2suCisJICovCisJaWYgKCFuZl9icmlkZ2UgfHwgIW5mX2JyaWRnZS0+cGh5c291dGRldikKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAogCWlmICghcmVhbG91dGRldikKQEAgLTgyMSwxNyArOTIwLDE3IEBACiAJICogYWJvdXQgdGhlIHZhbHVlIG9mIHNrYi0+cGt0X3R5cGUuICovCiAJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkgewogCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7Ci0JCW5mX2JyaWRnZS0+bWFzayB8PSBCUk5GX1BLVF9UWVBFOworCQluZl9icmlkZ2UtPnBrdF9vdGhlcmhvc3QgPSB0cnVlOwogCX0KIAogCW5mX2JyaWRnZV9wdWxsX2VuY2FwX2hlYWRlcihza2IpOwotCW5mX2JyaWRnZV9zYXZlX2hlYWRlcihza2IpOwogCWlmIChwZiA9PSBORlBST1RPX0lQVjQpCiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CiAJZWxzZQogCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CiAKLQlORl9IT09LKHBmLCBORl9JTkVUX1BPU1RfUk9VVElORywgc2tiLCBOVUxMLCByZWFsb3V0ZGV2LAorCU5GX0hPT0socGYsIE5GX0lORVRfUE9TVF9ST1VUSU5HLCBzdGF0ZS0+c2ssIHNrYiwKKwkJTlVMTCwgcmVhbG91dGRldiwKIAkJYnJfbmZfZGV2X3F1ZXVlX3htaXQpOwogCiAJcmV0dXJuIE5GX1NUT0xFTjsKQEAgLTg0Miw5ICs5NDEsNyBAQAogICogZm9yIHRoZSBzZWNvbmQgdGltZS4gKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXBfc2Fib3RhZ2VfaW4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJaWYgKHNrYi0+bmZfYnJpZGdlICYmCiAJICAgICEoc2tiLT5uZl9icmlkZ2UtPm1hc2sgJiBCUk5GX05GX0JSSURHRV9QUkVST1VUSU5HKSkgewpAQCAtODU0LDYgKzk1MSw0NCBAQAogCXJldHVybiBORl9BQ0NFUFQ7CiB9CiAKKy8qIFRoaXMgaXMgY2FsbGVkIHdoZW4gYnJfbmV0ZmlsdGVyIGhhcyBjYWxsZWQgaW50byBpcHRhYmxlcy9uZXRmaWx0ZXIsCisgKiBhbmQgRE5BVCBoYXMgdGFrZW4gcGxhY2Ugb24gYSBicmlkZ2UtZm9yd2FyZGVkIHBhY2tldC4KKyAqCisgKiBuZWlnaC0+b3V0cHV0IGhhcyBjcmVhdGVkIGEgbmV3IE1BQyBoZWFkZXIsIHdpdGggbG9jYWwgYnIwIE1BQworICogYXMgc2FkZHIuCisgKgorICogVGhpcyByZXN0b3JlcyB0aGUgb3JpZ2luYWwgTUFDIHNhZGRyIG9mIHRoZSBicmlkZ2VkIHBhY2tldAorICogYmVmb3JlIGludm9raW5nIGJyaWRnZSBmb3J3YXJkIGxvZ2ljIHRvIHRyYW5zbWl0IHRoZSBwYWNrZXQuCisgKi8KK3N0YXRpYyB2b2lkIGJyX25mX3ByZV9yb3V0aW5nX2ZpbmlzaF9icmlkZ2Vfc2xvdyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gbmZfYnJpZGdlX2luZm9fZ2V0KHNrYik7CisKKwlza2JfcHVsbChza2IsIEVUSF9ITEVOKTsKKwluZl9icmlkZ2UtPm1hc2sgJj0gfkJSTkZfQlJJREdFRF9ETkFUOworCisJQlVJTERfQlVHX09OKHNpemVvZihuZl9icmlkZ2UtPm5laWdoX2hlYWRlcikgIT0gKEVUSF9ITEVOIC0gRVRIX0FMRU4pKTsKKworCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChza2IsIC0oRVRIX0hMRU4gLSBFVEhfQUxFTiksCisJCQkJICAgICAgIG5mX2JyaWRnZS0+bmVpZ2hfaGVhZGVyLAorCQkJCSAgICAgICBFVEhfSExFTiAtIEVUSF9BTEVOKTsKKwlza2ItPmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2OworCWJyX2hhbmRsZV9mcmFtZV9maW5pc2goTlVMTCwgc2tiKTsKK30KKworc3RhdGljIGludCBicl9uZl9kZXZfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWlmIChza2ItPm5mX2JyaWRnZSAmJiAoc2tiLT5uZl9icmlkZ2UtPm1hc2sgJiBCUk5GX0JSSURHRURfRE5BVCkpIHsKKwkJYnJfbmZfcHJlX3JvdXRpbmdfZmluaXNoX2JyaWRnZV9zbG93KHNrYik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZl9icl9vcHMgYnJfb3BzID0geworCS5icl9kZXZfeG1pdF9ob29rID0JYnJfbmZfZGV2X3htaXQsCit9OworCiB2b2lkIGJyX25ldGZpbHRlcl9lbmFibGUodm9pZCkKIHsKIH0KQEAgLTk5MSwxMiArMTEyNiwxNCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAjZW5kaWYKKwlSQ1VfSU5JVF9QT0lOVEVSKG5mX2JyX29wcywgJmJyX29wcyk7CiAJcHJpbnRrKEtFUk5fTk9USUNFICJCcmlkZ2UgZmlyZXdhbGxpbmcgcmVnaXN0ZXJlZFxuIik7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBicl9uZXRmaWx0ZXJfZmluaSh2b2lkKQogeworCVJDVV9JTklUX1BPSU5URVIobmZfYnJfb3BzLCBOVUxMKTsKIAluZl91bnJlZ2lzdGVyX2hvb2tzKGJyX25mX29wcywgQVJSQVlfU0laRShicl9uZl9vcHMpKTsKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAJdW5yZWdpc3Rlcl9uZXRfc3lzY3RsX3RhYmxlKGJybmZfc3lzY3RsX2hlYWRlcik7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX25ldGxpbmsuYyBiL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCmluZGV4IDRmYmNlYTAuLjBlNGRkYjggMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCkBAIC0yMiw2ICsyMiw4NSBAQAogI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKICNpbmNsdWRlICJicl9wcml2YXRlX3N0cC5oIgogCitzdGF0aWMgaW50IGJyX2dldF9udW1fdmxhbl9pbmZvcyhjb25zdCBzdHJ1Y3QgbmV0X3BvcnRfdmxhbnMgKnB2LAorCQkJCSB1MzIgZmlsdGVyX21hc2spCit7CisJdTE2IHZpZF9yYW5nZV9zdGFydCA9IDAsIHZpZF9yYW5nZV9lbmQgPSAwOworCXUxNiB2aWRfcmFuZ2VfZmxhZ3MgPSAwOworCXUxNiBwdmlkLCB2aWQsIGZsYWdzOworCWludCBudW1fdmxhbnMgPSAwOworCisJaWYgKGZpbHRlcl9tYXNrICYgUlRFWFRfRklMVEVSX0JSVkxBTikKKwkJcmV0dXJuIHB2LT5udW1fdmxhbnM7CisKKwlpZiAoIShmaWx0ZXJfbWFzayAmIFJURVhUX0ZJTFRFUl9CUlZMQU5fQ09NUFJFU1NFRCkpCisJCXJldHVybiAwOworCisJLyogQ291bnQgbnVtYmVyIG9mIHZsYW4gaW5mbydzCisJICovCisJcHZpZCA9IGJyX2dldF9wdmlkKHB2KTsKKwlmb3JfZWFjaF9zZXRfYml0KHZpZCwgcHYtPnZsYW5fYml0bWFwLCBWTEFOX05fVklEKSB7CisJCWZsYWdzID0gMDsKKwkJaWYgKHZpZCA9PSBwdmlkKQorCQkJZmxhZ3MgfD0gQlJJREdFX1ZMQU5fSU5GT19QVklEOworCisJCWlmICh0ZXN0X2JpdCh2aWQsIHB2LT51bnRhZ2dlZF9iaXRtYXApKQorCQkJZmxhZ3MgfD0gQlJJREdFX1ZMQU5fSU5GT19VTlRBR0dFRDsKKworCQlpZiAodmlkX3JhbmdlX3N0YXJ0ID09IDApIHsKKwkJCWdvdG8gaW5pdHZhcnM7CisJCX0gZWxzZSBpZiAoKHZpZCAtIHZpZF9yYW5nZV9lbmQpID09IDEgJiYKKwkJCWZsYWdzID09IHZpZF9yYW5nZV9mbGFncykgeworCQkJdmlkX3JhbmdlX2VuZCA9IHZpZDsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgeworCQkJaWYgKCh2aWRfcmFuZ2VfZW5kIC0gdmlkX3JhbmdlX3N0YXJ0KSA+IDApCisJCQkJbnVtX3ZsYW5zICs9IDI7CisJCQllbHNlCisJCQkJbnVtX3ZsYW5zICs9IDE7CisJCX0KK2luaXR2YXJzOgorCQl2aWRfcmFuZ2Vfc3RhcnQgPSB2aWQ7CisJCXZpZF9yYW5nZV9lbmQgPSB2aWQ7CisJCXZpZF9yYW5nZV9mbGFncyA9IGZsYWdzOworCX0KKworCWlmICh2aWRfcmFuZ2Vfc3RhcnQgIT0gMCkgeworCQlpZiAoKHZpZF9yYW5nZV9lbmQgLSB2aWRfcmFuZ2Vfc3RhcnQpID4gMCkKKwkJCW51bV92bGFucyArPSAyOworCQllbHNlCisJCQludW1fdmxhbnMgKz0gMTsKKwl9CisKKwlyZXR1cm4gbnVtX3ZsYW5zOworfQorCitzdGF0aWMgc2l6ZV90IGJyX2dldF9saW5rX2FmX3NpemVfZmlsdGVyZWQoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgdTMyIGZpbHRlcl9tYXNrKQoreworCXN0cnVjdCBuZXRfcG9ydF92bGFucyAqcHY7CisJaW50IG51bV92bGFuX2luZm9zOworCisJcmN1X3JlYWRfbG9jaygpOworCWlmIChicl9wb3J0X2V4aXN0cyhkZXYpKQorCQlwdiA9IG5icF9nZXRfdmxhbl9pbmZvKGJyX3BvcnRfZ2V0X3JjdShkZXYpKTsKKwllbHNlIGlmIChkZXYtPnByaXZfZmxhZ3MgJiBJRkZfRUJSSURHRSkKKwkJcHYgPSBicl9nZXRfdmxhbl9pbmZvKChzdHJ1Y3QgbmV0X2JyaWRnZSAqKW5ldGRldl9wcml2KGRldikpOworCWVsc2UKKwkJcHYgPSBOVUxMOworCWlmIChwdikKKwkJbnVtX3ZsYW5faW5mb3MgPSBicl9nZXRfbnVtX3ZsYW5faW5mb3MocHYsIGZpbHRlcl9tYXNrKTsKKwllbHNlCisJCW51bV92bGFuX2luZm9zID0gMDsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmICghbnVtX3ZsYW5faW5mb3MpCisJCXJldHVybiAwOworCisJLyogRWFjaCBWTEFOIGlzIHJldHVybmVkIGluIGJyaWRnZV92bGFuX2luZm8gYWxvbmcgd2l0aCBmbGFncyAqLworCXJldHVybiBudW1fdmxhbl9pbmZvcyAqIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgYnJpZGdlX3ZsYW5faW5mbykpOworfQorCiBzdGF0aWMgaW5saW5lIHNpemVfdCBicl9wb3J0X2luZm9fc2l6ZSh2b2lkKQogewogCXJldHVybiBubGFfdG90YWxfc2l6ZSgxKQkvKiBJRkxBX0JSUE9SVF9TVEFURSAgKi8KQEAgLTM2LDcgKzExNSw3IEBACiAJCSsgMDsKIH0KIAotc3RhdGljIGlubGluZSBzaXplX3QgYnJfbmxtc2dfc2l6ZSh2b2lkKQorc3RhdGljIGlubGluZSBzaXplX3QgYnJfbmxtc2dfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmlsdGVyX21hc2spCiB7CiAJcmV0dXJuIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgaWZpbmZvbXNnKSkKIAkJKyBubGFfdG90YWxfc2l6ZShJRk5BTVNJWikgLyogSUZMQV9JRk5BTUUgKi8KQEAgLTQ1LDcgKzEyNCw5IEBACiAJCSsgbmxhX3RvdGFsX3NpemUoNCkgLyogSUZMQV9NVFUgKi8KIAkJKyBubGFfdG90YWxfc2l6ZSg0KSAvKiBJRkxBX0xJTksgKi8KIAkJKyBubGFfdG90YWxfc2l6ZSgxKSAvKiBJRkxBX09QRVJTVEFURSAqLwotCQkrIG5sYV90b3RhbF9zaXplKGJyX3BvcnRfaW5mb19zaXplKCkpOyAvKiBJRkxBX1BST1RJTkZPICovCisJCSsgbmxhX3RvdGFsX3NpemUoYnJfcG9ydF9pbmZvX3NpemUoKSkgLyogSUZMQV9QUk9USU5GTyAqLworCQkrIG5sYV90b3RhbF9zaXplKGJyX2dldF9saW5rX2FmX3NpemVfZmlsdGVyZWQoZGV2LAorCQkJCSBmaWx0ZXJfbWFzaykpOyAvKiBJRkxBX0FGX1NQRUMgKi8KIH0KIAogc3RhdGljIGludCBicl9wb3J0X2ZpbGxfYXR0cnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTYyLDcgKzE0Myw5IEBACiAJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0JSUE9SVF9GQVNUX0xFQVZFLCAhIShwLT5mbGFncyAmIEJSX01VTFRJQ0FTVF9GQVNUX0xFQVZFKSkgfHwKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX0xFQVJOSU5HLCAhIShwLT5mbGFncyAmIEJSX0xFQVJOSU5HKSkgfHwKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX1VOSUNBU1RfRkxPT0QsICEhKHAtPmZsYWdzICYgQlJfRkxPT0QpKSB8fAotCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9CUlBPUlRfUFJPWFlBUlAsICEhKHAtPmZsYWdzICYgQlJfUFJPWFlBUlApKSkKKwkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX1BST1hZQVJQLCAhIShwLT5mbGFncyAmIEJSX1BST1hZQVJQKSkgfHwKKwkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQlJQT1JUX1BST1hZQVJQX1dJRkksCisJCSAgICAgICAhIShwLT5mbGFncyAmIEJSX1BST1hZQVJQX1dJRkkpKSkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAogCXJldHVybiAwOwpAQCAtMjIyLDggKzMwNSw4IEBACiAJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX09QRVJTVEFURSwgb3BlcnN0YXRlKSB8fAogCSAgICAoZGV2LT5hZGRyX2xlbiAmJgogCSAgICAgbmxhX3B1dChza2IsIElGTEFfQUREUkVTUywgZGV2LT5hZGRyX2xlbiwgZGV2LT5kZXZfYWRkcikpIHx8Ci0JICAgIChkZXYtPmlmaW5kZXggIT0gZGV2LT5pZmxpbmsgJiYKLQkgICAgIG5sYV9wdXRfdTMyKHNrYiwgSUZMQV9MSU5LLCBkZXYtPmlmbGluaykpKQorCSAgICAoZGV2LT5pZmluZGV4ICE9IGRldl9nZXRfaWZsaW5rKGRldikgJiYKKwkgICAgIG5sYV9wdXRfdTMyKHNrYiwgSUZMQV9MSU5LLCBkZXZfZ2V0X2lmbGluayhkZXYpKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJaWYgKGV2ZW50ID09IFJUTV9ORVdMSU5LICYmIHBvcnQpIHsKQEAgLTI4MCw2ICszNjMsNyBAQAogCXN0cnVjdCBuZXQgKm5ldDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnIgPSAtRU5PQlVGUzsKKwl1MzIgZmlsdGVyID0gUlRFWFRfRklMVEVSX0JSVkxBTl9DT01QUkVTU0VEOwogCiAJaWYgKCFwb3J0KQogCQlyZXR1cm47CkBAIC0yODgsMTEgKzM3MiwxMSBAQAogCWJyX2RlYnVnKHBvcnQtPmJyLCAicG9ydCAldSglcykgZXZlbnQgJWRcbiIsCiAJCSAodW5zaWduZWQgaW50KXBvcnQtPnBvcnRfbm8sIHBvcnQtPmRldi0+bmFtZSwgZXZlbnQpOwogCi0Jc2tiID0gbmxtc2dfbmV3KGJyX25sbXNnX3NpemUoKSwgR0ZQX0FUT01JQyk7CisJc2tiID0gbmxtc2dfbmV3KGJyX25sbXNnX3NpemUocG9ydC0+ZGV2LCBmaWx0ZXIpLCBHRlBfQVRPTUlDKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyb3V0OwogCi0JZXJyID0gYnJfZmlsbF9pZmluZm8oc2tiLCBwb3J0LCAwLCAwLCBldmVudCwgMCwgMCwgcG9ydC0+ZGV2KTsKKwllcnIgPSBicl9maWxsX2lmaW5mbyhza2IsIHBvcnQsIDAsIDAsIGV2ZW50LCAwLCBmaWx0ZXIsIHBvcnQtPmRldik7CiAJaWYgKGVyciA8IDApIHsKIAkJLyogLUVNU0dTSVpFIGltcGxpZXMgQlVHIGluIGJyX25sbXNnX3NpemUoKSAqLwogCQlXQVJOX09OKGVyciA9PSAtRU1TR1NJWkUpOwpAQCAtNDcxLDYgKzU1NSw3IEBACiAJYnJfc2V0X3BvcnRfZmxhZyhwLCB0YiwgSUZMQV9CUlBPUlRfTEVBUk5JTkcsIEJSX0xFQVJOSU5HKTsKIAlicl9zZXRfcG9ydF9mbGFnKHAsIHRiLCBJRkxBX0JSUE9SVF9VTklDQVNUX0ZMT09ELCBCUl9GTE9PRCk7CiAJYnJfc2V0X3BvcnRfZmxhZyhwLCB0YiwgSUZMQV9CUlBPUlRfUFJPWFlBUlAsIEJSX1BST1hZQVJQKTsKKwlicl9zZXRfcG9ydF9mbGFnKHAsIHRiLCBJRkxBX0JSUE9SVF9QUk9YWUFSUF9XSUZJLCBCUl9QUk9YWUFSUF9XSUZJKTsKIAogCWlmICh0YltJRkxBX0JSUE9SVF9DT1NUXSkgewogCQllcnIgPSBicl9zdHBfc2V0X3BhdGhfY29zdChwLCBubGFfZ2V0X3UzMih0YltJRkxBX0JSUE9SVF9DT1NUXSkpOwpAQCAtNjQ4LDYgKzczMyw5IEBACiAJW0lGTEFfQlJfRk9SV0FSRF9ERUxBWV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtJRkxBX0JSX0hFTExPX1RJTUVdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbSUZMQV9CUl9NQVhfQUdFXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW0lGTEFfQlJfQUdFSU5HX1RJTUVdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbSUZMQV9CUl9TVFBfU1RBVEVdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbSUZMQV9CUl9QUklPUklUWV0gPSB7IC50eXBlID0gTkxBX1UxNiB9LAogfTsKIAogc3RhdGljIGludCBicl9jaGFuZ2VsaW5rKHN0cnVjdCBuZXRfZGV2aWNlICpicmRldiwgc3RydWN0IG5sYXR0ciAqdGJbXSwKQEAgLTY3Nyw2ICs3NjUsMjQgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCisJaWYgKGRhdGFbSUZMQV9CUl9BR0VJTkdfVElNRV0pIHsKKwkJdTMyIGFnZWluZ190aW1lID0gbmxhX2dldF91MzIoZGF0YVtJRkxBX0JSX0FHRUlOR19USU1FXSk7CisKKwkJYnItPmFnZWluZ190aW1lID0gY2xvY2tfdF90b19qaWZmaWVzKGFnZWluZ190aW1lKTsKKwl9CisKKwlpZiAoZGF0YVtJRkxBX0JSX1NUUF9TVEFURV0pIHsKKwkJdTMyIHN0cF9lbmFibGVkID0gbmxhX2dldF91MzIoZGF0YVtJRkxBX0JSX1NUUF9TVEFURV0pOworCisJCWJyX3N0cF9zZXRfZW5hYmxlZChiciwgc3RwX2VuYWJsZWQpOworCX0KKworCWlmIChkYXRhW0lGTEFfQlJfUFJJT1JJVFldKSB7CisJCXUzMiBwcmlvcml0eSA9IG5sYV9nZXRfdTE2KGRhdGFbSUZMQV9CUl9QUklPUklUWV0pOworCisJCWJyX3N0cF9zZXRfYnJpZGdlX3ByaW9yaXR5KGJyLCBwcmlvcml0eSk7CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY4NSw2ICs3OTEsOSBAQAogCXJldHVybiBubGFfdG90YWxfc2l6ZShzaXplb2YodTMyKSkgKwkvKiBJRkxBX0JSX0ZPUldBUkRfREVMQVkgICovCiAJICAgICAgIG5sYV90b3RhbF9zaXplKHNpemVvZih1MzIpKSArCS8qIElGTEFfQlJfSEVMTE9fVElNRSAqLwogCSAgICAgICBubGFfdG90YWxfc2l6ZShzaXplb2YodTMyKSkgKwkvKiBJRkxBX0JSX01BWF9BR0UgKi8KKwkgICAgICAgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHUzMikpICsgICAgLyogSUZMQV9CUl9BR0VJTkdfVElNRSAqLworCSAgICAgICBubGFfdG90YWxfc2l6ZShzaXplb2YodTMyKSkgKyAgICAvKiBJRkxBX0JSX1NUUF9TVEFURSAqLworCSAgICAgICBubGFfdG90YWxfc2l6ZShzaXplb2YodTE2KSkgKyAgICAvKiBJRkxBX0JSX1BSSU9SSVRZICovCiAJICAgICAgIDA7CiB9CiAKQEAgLTY5NCwxMCArODAzLDE2IEBACiAJdTMyIGZvcndhcmRfZGVsYXkgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoYnItPmZvcndhcmRfZGVsYXkpOwogCXUzMiBoZWxsb190aW1lID0gamlmZmllc190b19jbG9ja190KGJyLT5oZWxsb190aW1lKTsKIAl1MzIgYWdlX3RpbWUgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoYnItPm1heF9hZ2UpOworCXUzMiBhZ2VpbmdfdGltZSA9IGppZmZpZXNfdG9fY2xvY2tfdChici0+YWdlaW5nX3RpbWUpOworCXUzMiBzdHBfZW5hYmxlZCA9IGJyLT5zdHBfZW5hYmxlZDsKKwl1MTYgcHJpb3JpdHkgPSAoYnItPmJyaWRnZV9pZC5wcmlvWzBdIDw8IDgpIHwgYnItPmJyaWRnZV9pZC5wcmlvWzFdOwogCiAJaWYgKG5sYV9wdXRfdTMyKHNrYiwgSUZMQV9CUl9GT1JXQVJEX0RFTEFZLCBmb3J3YXJkX2RlbGF5KSB8fAogCSAgICBubGFfcHV0X3UzMihza2IsIElGTEFfQlJfSEVMTE9fVElNRSwgaGVsbG9fdGltZSkgfHwKLQkgICAgbmxhX3B1dF91MzIoc2tiLCBJRkxBX0JSX01BWF9BR0UsIGFnZV90aW1lKSkKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBJRkxBX0JSX01BWF9BR0UsIGFnZV90aW1lKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIElGTEFfQlJfQUdFSU5HX1RJTUUsIGFnZWluZ190aW1lKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIElGTEFfQlJfU1RQX1NUQVRFLCBzdHBfZW5hYmxlZCkgfHwKKwkgICAgbmxhX3B1dF91MTYoc2tiLCBJRkxBX0JSX1BSSU9SSVRZLCBwcmlvcml0eSkpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmZfY29yZS5jIGIvbmV0L2JyaWRnZS9icl9uZl9jb3JlLmMKaW5kZXggMzg3Y2IzYi4uMjBjYmI3MiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZl9jb3JlLmMKKysrIGIvbmV0L2JyaWRnZS9icl9uZl9jb3JlLmMKQEAgLTU0LDcgKzU0LDYgQEAKIAogc3RhdGljIHN0cnVjdCBkc3Rfb3BzIGZha2VfZHN0X29wcyA9IHsKIAkuZmFtaWx5CQk9IEFGX0lORVQsCi0JLnByb3RvY29sCT0gY3B1X3RvX2JlMTYoRVRIX1BfSVApLAogCS51cGRhdGVfcG10dQk9IGZha2VfdXBkYXRlX3BtdHUsCiAJLnJlZGlyZWN0CT0gZmFrZV9yZWRpcmVjdCwKIAkuY293X21ldHJpY3MJPSBmYWtlX2Nvd19tZXRyaWNzLApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9wcml2YXRlLmggYi9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaAppbmRleCBkZTA5MTk5Li42Y2EwMjUxIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaAorKysgYi9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaApAQCAtMzA1LDYgKzMwNSw3IEBACiAjZW5kaWYKIAogCXUxNiBmcmFnX21heF9zaXplOworCWJvb2wgcHJveHlhcnBfcmVwbGllZDsKIAogI2lmZGVmIENPTkZJR19CUklER0VfVkxBTl9GSUxURVJJTkcKIAlib29sIHZsYW5fZmlsdGVyZWQ7CkBAIC00MDksMTAgKzQxMCwxMCBAQAogCiAvKiBicl9mb3J3YXJkLmMgKi8KIHZvaWQgYnJfZGVsaXZlcihjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICp0bywgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1pbnQgYnJfZGV2X3F1ZXVlX3B1c2hfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBicl9kZXZfcXVldWVfcHVzaF94bWl0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkIGJyX2ZvcndhcmQoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqdG8sCiAJCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICpza2IwKTsKLWludCBicl9mb3J3YXJkX2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2ludCBicl9mb3J3YXJkX2ZpbmlzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBicl9mbG9vZF9kZWxpdmVyKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCB1bmljYXN0KTsKIHZvaWQgYnJfZmxvb2RfZm9yd2FyZChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IyLCBib29sIHVuaWNhc3QpOwpAQCAtNDMwLDcgKzQzMSw3IEBACiB2b2lkIGJyX21hbmFnZV9wcm9taXNjKHN0cnVjdCBuZXRfYnJpZGdlICpicik7CiAKIC8qIGJyX2lucHV0LmMgKi8KLWludCBicl9oYW5kbGVfZnJhbWVfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpOworaW50IGJyX2hhbmRsZV9mcmFtZV9maW5pc2goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHJ4X2hhbmRsZXJfcmVzdWx0X3QgYnJfaGFuZGxlX2ZyYW1lKHN0cnVjdCBza19idWZmICoqcHNrYik7CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBicl9yeF9oYW5kbGVyX2NoZWNrX3JjdShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNzYyLDYgKzc2MywxMSBAQAogfQogI2VuZGlmCiAKK3N0cnVjdCBuZl9icl9vcHMgeworCWludCAoKmJyX2Rldl94bWl0X2hvb2spKHN0cnVjdCBza19idWZmICpza2IpOworfTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgbmZfYnJfb3BzIF9fcmN1ICpuZl9icl9vcHM7CisKIC8qIGJyX25ldGZpbHRlci5jICovCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQlJJREdFX05FVEZJTFRFUikKIGludCBicl9uZl9jb3JlX2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N0cF9icGR1LmMgYi9uZXQvYnJpZGdlL2JyX3N0cF9icGR1LmMKaW5kZXggYmRiNDU5ZC4uNTM0ZmM0YyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9zdHBfYnBkdS5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3RwX2JwZHUuYwpAQCAtNTQsOCArNTQsOSBAQAogCiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAotCU5GX0hPT0soTkZQUk9UT19CUklER0UsIE5GX0JSX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBza2ItPmRldiwKLQkJZGV2X3F1ZXVlX3htaXQpOworCU5GX0hPT0soTkZQUk9UT19CUklER0UsIE5GX0JSX0xPQ0FMX09VVCwgTlVMTCwgc2tiLAorCQlOVUxMLCBza2ItPmRldiwKKwkJZGV2X3F1ZXVlX3htaXRfc2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYnJfc2V0X3RpY2tzKHVuc2lnbmVkIGNoYXIgKmRlc3QsIGludCBqKQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9zeXNmc19pZi5jIGIvbmV0L2JyaWRnZS9icl9zeXNmc19pZi5jCmluZGV4IDJkZTVkOTEuLjQ5MDU4NDUgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfc3lzZnNfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX3N5c2ZzX2lmLmMKQEAgLTE3MSw2ICsxNzEsNyBAQAogQlJQT1JUX0FUVFJfRkxBRyhsZWFybmluZywgQlJfTEVBUk5JTkcpOwogQlJQT1JUX0FUVFJfRkxBRyh1bmljYXN0X2Zsb29kLCBCUl9GTE9PRCk7CiBCUlBPUlRfQVRUUl9GTEFHKHByb3h5YXJwLCBCUl9QUk9YWUFSUCk7CitCUlBPUlRfQVRUUl9GTEFHKHByb3h5YXJwX3dpZmksIEJSX1BST1hZQVJQX1dJRkkpOwogCiAjaWZkZWYgQ09ORklHX0JSSURHRV9JR01QX1NOT09QSU5HCiBzdGF0aWMgc3NpemVfdCBzaG93X211bHRpY2FzdF9yb3V0ZXIoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwgY2hhciAqYnVmKQpAQCAtMjE1LDYgKzIxNiw3IEBACiAJJmJycG9ydF9hdHRyX211bHRpY2FzdF9mYXN0X2xlYXZlLAogI2VuZGlmCiAJJmJycG9ydF9hdHRyX3Byb3h5YXJwLAorCSZicnBvcnRfYXR0cl9wcm94eWFycF93aWZpLAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfZmlsdGVyLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX2ZpbHRlci5jCmluZGV4IGNlMjA1YWEuLjhhM2Y2M2IgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9maWx0ZXIuYwpAQCAtNTgsMjAgKzU4LDE4IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGVidF9pbl9ob29rKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCSAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JcmV0dXJuIGVidF9kb190YWJsZShvcHMtPmhvb2tudW0sIHNrYiwgaW4sIG91dCwKLQkJCSAgICBkZXZfbmV0KGluKS0+eHQuZnJhbWVfZmlsdGVyKTsKKwlyZXR1cm4gZWJ0X2RvX3RhYmxlKG9wcy0+aG9va251bSwgc2tiLCBzdGF0ZS0+aW4sIHN0YXRlLT5vdXQsCisJCQkgICAgZGV2X25ldChzdGF0ZS0+aW4pLT54dC5mcmFtZV9maWx0ZXIpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CiBlYnRfb3V0X2hvb2soY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsIHN0cnVjdCBza19idWZmICpza2IsCi0JICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKLQlyZXR1cm4gZWJ0X2RvX3RhYmxlKG9wcy0+aG9va251bSwgc2tiLCBpbiwgb3V0LAotCQkJICAgIGRldl9uZXQob3V0KS0+eHQuZnJhbWVfZmlsdGVyKTsKKwlyZXR1cm4gZWJ0X2RvX3RhYmxlKG9wcy0+aG9va251bSwgc2tiLCBzdGF0ZS0+aW4sIHN0YXRlLT5vdXQsCisJCQkgICAgZGV2X25ldChzdGF0ZS0+b3V0KS0+eHQuZnJhbWVfZmlsdGVyKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBlYnRfb3BzX2ZpbHRlcltdIF9fcmVhZF9tb3N0bHkgPSB7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX25hdC5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0YWJsZV9uYXQuYwppbmRleCBhMGFjMjk4Li5jNWVmNWIxIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRhYmxlX25hdC5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidGFibGVfbmF0LmMKQEAgLTU4LDIwICs1OCwxOCBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50CiBlYnRfbmF0X2luKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JcmV0dXJuIGVidF9kb190YWJsZShvcHMtPmhvb2tudW0sIHNrYiwgaW4sIG91dCwKLQkJCSAgICBkZXZfbmV0KGluKS0+eHQuZnJhbWVfbmF0KTsKKwlyZXR1cm4gZWJ0X2RvX3RhYmxlKG9wcy0+aG9va251bSwgc2tiLCBzdGF0ZS0+aW4sIHN0YXRlLT5vdXQsCisJCQkgICAgZGV2X25ldChzdGF0ZS0+aW4pLT54dC5mcmFtZV9uYXQpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CiBlYnRfbmF0X291dChjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewotCXJldHVybiBlYnRfZG9fdGFibGUob3BzLT5ob29rbnVtLCBza2IsIGluLCBvdXQsCi0JCQkgICAgZGV2X25ldChvdXQpLT54dC5mcmFtZV9uYXQpOworCXJldHVybiBlYnRfZG9fdGFibGUob3BzLT5ob29rbnVtLCBza2IsIHN0YXRlLT5pbiwgc3RhdGUtPm91dCwKKwkJCSAgICBkZXZfbmV0KHN0YXRlLT5vdXQpLT54dC5mcmFtZV9uYXQpOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGVidF9vcHNfbmF0W10gX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mX3RhYmxlc19icmlkZ2UuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mX3RhYmxlc19icmlkZ2UuYwppbmRleCAxOTQ3M2E5Li5hMzQzZTYyIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL25ldGZpbHRlci9uZl90YWJsZXNfYnJpZGdlLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZfdGFibGVzX2JyaWRnZS5jCkBAIC02Nyw0NyArNjcsNDMgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZnRfYnJpZGdlX3NldF9wa3RpbmZvX2lwdjQoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCiAJCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0KQorCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCWlmIChuZnRfYnJpZGdlX2lwaGRyX3ZhbGlkYXRlKHNrYikpCi0JCW5mdF9zZXRfcGt0aW5mb19pcHY0KHBrdCwgb3BzLCBza2IsIGluLCBvdXQpOworCQluZnRfc2V0X3BrdGluZm9faXB2NChwa3QsIG9wcywgc2tiLCBzdGF0ZSk7CiAJZWxzZQotCQluZnRfc2V0X3BrdGluZm8ocGt0LCBvcHMsIHNrYiwgaW4sIG91dCk7CisJCW5mdF9zZXRfcGt0aW5mbyhwa3QsIG9wcywgc2tiLCBzdGF0ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZnRfYnJpZGdlX3NldF9wa3RpbmZvX2lwdjYoc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCi0JCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAotCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQpCisJCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKKwkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlpZiAobmZ0X2JyaWRnZV9pcDZoZHJfdmFsaWRhdGUoc2tiKSAmJgotCSAgICBuZnRfc2V0X3BrdGluZm9faXB2Nihwa3QsIG9wcywgc2tiLCBpbiwgb3V0KSA9PSAwKQorCSAgICBuZnRfc2V0X3BrdGluZm9faXB2Nihwa3QsIG9wcywgc2tiLCBzdGF0ZSkgPT0gMCkKIAkJcmV0dXJuOwogI2VuZGlmCi0JbmZ0X3NldF9wa3RpbmZvKHBrdCwgb3BzLCBza2IsIGluLCBvdXQpOworCW5mdF9zZXRfcGt0aW5mbyhwa3QsIG9wcywgc2tiLCBzdGF0ZSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIG5mdF9kb19jaGFpbl9icmlkZ2UoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBuZnRfcGt0aW5mbyBwa3Q7CiAKIAlzd2l0Y2ggKGV0aF9oZHIoc2tiKS0+aF9wcm90bykgewogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgotCQluZnRfYnJpZGdlX3NldF9wa3RpbmZvX2lwdjQoJnBrdCwgb3BzLCBza2IsIGluLCBvdXQpOworCQluZnRfYnJpZGdlX3NldF9wa3RpbmZvX2lwdjQoJnBrdCwgb3BzLCBza2IsIHN0YXRlKTsKIAkJYnJlYWs7CiAJY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKLQkJbmZ0X2JyaWRnZV9zZXRfcGt0aW5mb19pcHY2KCZwa3QsIG9wcywgc2tiLCBpbiwgb3V0KTsKKwkJbmZ0X2JyaWRnZV9zZXRfcGt0aW5mb19pcHY2KCZwa3QsIG9wcywgc2tiLCBzdGF0ZSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCW5mdF9zZXRfcGt0aW5mbygmcGt0LCBvcHMsIHNrYiwgaW4sIG91dCk7CisJCW5mdF9zZXRfcGt0aW5mbygmcGt0LCBvcHMsIHNrYiwgc3RhdGUpOwogCQlicmVhazsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mdF9tZXRhX2JyaWRnZS5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X21ldGFfYnJpZGdlLmMKaW5kZXggNGYwMjEwOS4uYTIxMjY5YiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X21ldGFfYnJpZGdlLmMKKysrIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X21ldGFfYnJpZGdlLmMKQEAgLTE5LDEyICsxOSwxMiBAQAogI2luY2x1ZGUgIi4uL2JyX3ByaXZhdGUuaCIKIAogc3RhdGljIHZvaWQgbmZ0X21ldGFfYnJpZGdlX2dldF9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKLQkJCQkgICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkJICAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X21ldGEgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiA9IHBrdC0+aW4sICpvdXQgPSBwa3QtPm91dDsKLQlzdHJ1Y3QgbmZ0X2RhdGEgKmRlc3QgPSAmZGF0YVtwcml2LT5kcmVnXTsKKwl1MzIgKmRlc3QgPSAmcmVncy0+ZGF0YVtwcml2LT5kcmVnXTsKIAljb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwOwogCiAJc3dpdGNoIChwcml2LT5rZXkpIHsKQEAgLTQwLDEyICs0MCwxMiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlzdHJuY3B5KChjaGFyICopZGVzdC0+ZGF0YSwgcC0+YnItPmRldi0+bmFtZSwgc2l6ZW9mKGRlc3QtPmRhdGEpKTsKKwlzdHJuY3B5KChjaGFyICopZGVzdCwgcC0+YnItPmRldi0+bmFtZSwgSUZOQU1TSVopOwogCXJldHVybjsKIG91dDoKLQlyZXR1cm4gbmZ0X21ldGFfZ2V0X2V2YWwoZXhwciwgZGF0YSwgcGt0KTsKKwlyZXR1cm4gbmZ0X21ldGFfZ2V0X2V2YWwoZXhwciwgcmVncywgcGt0KTsKIGVycjoKLQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GVF9CUkVBSzsKKwlyZWdzLT52ZXJkaWN0LmNvZGUgPSBORlRfQlJFQUs7CiB9CiAKIHN0YXRpYyBpbnQgbmZ0X21ldGFfYnJpZGdlX2dldF9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCkBAIC01MywyNyArNTMsMjEgQEAKIAkJCQkgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7CiAJc3RydWN0IG5mdF9tZXRhICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKLQlpbnQgZXJyOworCXVuc2lnbmVkIGludCBsZW47CiAKIAlwcml2LT5rZXkgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9NRVRBX0tFWV0pKTsKIAlzd2l0Y2ggKHByaXYtPmtleSkgewogCWNhc2UgTkZUX01FVEFfQlJJX0lJRk5BTUU6CiAJY2FzZSBORlRfTUVUQV9CUklfT0lGTkFNRToKKwkJbGVuID0gSUZOQU1TSVo7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiBuZnRfbWV0YV9nZXRfaW5pdChjdHgsIGV4cHIsIHRiKTsKIAl9CiAKLQlwcml2LT5kcmVnID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTUVUQV9EUkVHXSkpOwotCWVyciA9IG5mdF92YWxpZGF0ZV9vdXRwdXRfcmVnaXN0ZXIocHJpdi0+ZHJlZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBuZnRfdmFsaWRhdGVfZGF0YV9sb2FkKGN0eCwgcHJpdi0+ZHJlZywgTlVMTCwgTkZUX0RBVEFfVkFMVUUpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIDA7CisJcHJpdi0+ZHJlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX01FVEFfRFJFR10pOworCXJldHVybiBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfc3RvcmUoY3R4LCBwcml2LT5kcmVnLCBOVUxMLAorCQkJCQkgICBORlRfREFUQV9WQUxVRSwgbGVuKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9tZXRhX2JyaWRnZV90eXBlOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9icmlkZ2UuYyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL25mdF9yZWplY3RfYnJpZGdlLmMKaW5kZXggMzI0NGFlYS4uODU4ZDg0OCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9icmlkZ2UuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9uZnRfcmVqZWN0X2JyaWRnZS5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni5oPgogI2luY2x1ZGUgIi4uL2JyX3ByaXZhdGUuaCIKIAogc3RhdGljIHZvaWQgbmZ0X3JlamVjdF9icl9wdXNoX2V0aGVyaGRyKHN0cnVjdCBza19idWZmICpvbGRza2IsCkBAIC0zNiw3ICszNywxMiBAQAogCXNrYl9wdWxsKG5za2IsIEVUSF9ITEVOKTsKIH0KIAotc3RhdGljIHZvaWQgbmZ0X3JlamVjdF9icl9zZW5kX3Y0X3RjcF9yZXNldChzdHJ1Y3Qgc2tfYnVmZiAqb2xkc2tiLCBpbnQgaG9vaykKKy8qIFdlIGNhbm5vdCB1c2Ugb2xkc2tiLT5kZXYsIGl0IGNhbiBiZSBlaXRoZXIgYnJpZGdlIGRldmljZSAoTkZfQlJJREdFIElOUFVUKQorICogb3IgdGhlIGJyaWRnZSBwb3J0IChORl9CUklER0UgUFJFUk9VVElORykuCisgKi8KK3N0YXRpYyB2b2lkIG5mdF9yZWplY3RfYnJfc2VuZF92NF90Y3BfcmVzZXQoc3RydWN0IHNrX2J1ZmYgKm9sZHNrYiwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICBpbnQgaG9vaykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAlzdHJ1Y3QgaXBoZHIgKm5pcGg7CkBAIC02NSwxMSArNzEsMTIgQEAKIAogCW5mdF9yZWplY3RfYnJfcHVzaF9ldGhlcmhkcihvbGRza2IsIG5za2IpOwogCi0JYnJfZGVsaXZlcihicl9wb3J0X2dldF9yY3Uob2xkc2tiLT5kZXYpLCBuc2tiKTsKKwlicl9kZWxpdmVyKGJyX3BvcnRfZ2V0X3JjdShkZXYpLCBuc2tiKTsKIH0KIAotc3RhdGljIHZvaWQgbmZ0X3JlamVjdF9icl9zZW5kX3Y0X3VucmVhY2goc3RydWN0IHNrX2J1ZmYgKm9sZHNrYiwgaW50IGhvb2ssCi0JCQkJCSAgdTggY29kZSkKK3N0YXRpYyB2b2lkIG5mdF9yZWplY3RfYnJfc2VuZF92NF91bnJlYWNoKHN0cnVjdCBza19idWZmICpvbGRza2IsCisJCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICBpbnQgaG9vaywgdTggY29kZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAlzdHJ1Y3QgaXBoZHIgKm5pcGg7CkBAIC03Nyw4ICs4NCw5IEBACiAJdW5zaWduZWQgaW50IGxlbjsKIAl2b2lkICpwYXlsb2FkOwogCV9fd3N1bSBjc3VtOworCXU4IHByb3RvOwogCi0JaWYgKCFuZnRfYnJpZGdlX2lwaGRyX3ZhbGlkYXRlKG9sZHNrYikpCisJaWYgKG9sZHNrYi0+Y3N1bV9iYWQgfHwgIW5mdF9icmlkZ2VfaXBoZHJfdmFsaWRhdGUob2xkc2tiKSkKIAkJcmV0dXJuOwogCiAJLyogSVAgaGVhZGVyIGNoZWNrczogZnJhZ21lbnQuICovCkBAIC05MSw3ICs5OSwxNyBAQAogCWlmICghcHNrYl9tYXlfcHVsbChvbGRza2IsIGxlbikpCiAJCXJldHVybjsKIAotCWlmIChuZl9pcF9jaGVja3N1bShvbGRza2IsIGhvb2ssIGlwX2hkcmxlbihvbGRza2IpLCAwKSkKKwlpZiAocHNrYl90cmltX3Jjc3VtKG9sZHNrYiwgbnRvaHMoaXBfaGRyKG9sZHNrYiktPnRvdF9sZW4pKSkKKwkJcmV0dXJuOworCisJaWYgKGlwX2hkcihvbGRza2IpLT5wcm90b2NvbCA9PSBJUFBST1RPX1RDUCB8fAorCSAgICBpcF9oZHIob2xkc2tiKS0+cHJvdG9jb2wgPT0gSVBQUk9UT19VRFApCisJCXByb3RvID0gaXBfaGRyKG9sZHNrYiktPnByb3RvY29sOworCWVsc2UKKwkJcHJvdG8gPSAwOworCisJaWYgKCFza2JfY3N1bV91bm5lY2Vzc2FyeShvbGRza2IpICYmCisJICAgIG5mX2lwX2NoZWNrc3VtKG9sZHNrYiwgaG9vaywgaXBfaGRybGVuKG9sZHNrYiksIHByb3RvKSkKIAkJcmV0dXJuOwogCiAJbnNrYiA9IGFsbG9jX3NrYihzaXplb2Yoc3RydWN0IGlwaGRyKSArIHNpemVvZihzdHJ1Y3QgaWNtcGhkcikgKwpAQCAtMTIwLDExICsxMzgsMTMgQEAKIAogCW5mdF9yZWplY3RfYnJfcHVzaF9ldGhlcmhkcihvbGRza2IsIG5za2IpOwogCi0JYnJfZGVsaXZlcihicl9wb3J0X2dldF9yY3Uob2xkc2tiLT5kZXYpLCBuc2tiKTsKKwlicl9kZWxpdmVyKGJyX3BvcnRfZ2V0X3JjdShkZXYpLCBuc2tiKTsKIH0KIAogc3RhdGljIHZvaWQgbmZ0X3JlamVjdF9icl9zZW5kX3Y2X3RjcF9yZXNldChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqb2xkc2tiLCBpbnQgaG9vaykKKwkJCQkJICAgIHN0cnVjdCBza19idWZmICpvbGRza2IsCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgICAgaW50IGhvb2spCiB7CiAJc3RydWN0IHNrX2J1ZmYgKm5za2I7CiAJY29uc3Qgc3RydWN0IHRjcGhkciAqb3RoOwpAQCAtMTUyLDEyICsxNzIsMzcgQEAKIAogCW5mdF9yZWplY3RfYnJfcHVzaF9ldGhlcmhkcihvbGRza2IsIG5za2IpOwogCi0JYnJfZGVsaXZlcihicl9wb3J0X2dldF9yY3Uob2xkc2tiLT5kZXYpLCBuc2tiKTsKKwlicl9kZWxpdmVyKGJyX3BvcnRfZ2V0X3JjdShkZXYpLCBuc2tiKTsKK30KKworc3RhdGljIGJvb2wgcmVqZWN0Nl9icl9jc3VtX29rKHN0cnVjdCBza19idWZmICpza2IsIGludCBob29rKQoreworCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoID0gaXB2Nl9oZHIoc2tiKTsKKwlpbnQgdGhvZmY7CisJX19iZTE2IGZvOworCXU4IHByb3RvID0gaXA2aC0+bmV4dGhkcjsKKworCWlmIChza2ItPmNzdW1fYmFkKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSkKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoaXA2aC0+cGF5bG9hZF9sZW4gJiYKKwkgICAgcHNrYl90cmltX3Jjc3VtKHNrYiwgbnRvaHMoaXA2aC0+cGF5bG9hZF9sZW4pICsgc2l6ZW9mKCppcDZoKSkpCisJCXJldHVybiBmYWxzZTsKKworCXRob2ZmID0gaXB2Nl9za2lwX2V4dGhkcihza2IsICgodTgqKShpcDZoKzEpIC0gc2tiLT5kYXRhKSwgJnByb3RvLCAmZm8pOworCWlmICh0aG9mZiA8IDAgfHwgdGhvZmYgPj0gc2tiLT5sZW4gfHwgKGZvICYgaHRvbnMofjB4NykpICE9IDApCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiBuZl9pcDZfY2hlY2tzdW0oc2tiLCBob29rLCB0aG9mZiwgcHJvdG8pID09IDA7CiB9CiAKIHN0YXRpYyB2b2lkIG5mdF9yZWplY3RfYnJfc2VuZF92Nl91bnJlYWNoKHN0cnVjdCBuZXQgKm5ldCwKLQkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqb2xkc2tiLCBpbnQgaG9vaywKLQkJCQkJICB1OCBjb2RlKQorCQkJCQkgIHN0cnVjdCBza19idWZmICpvbGRza2IsCisJCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICBpbnQgaG9vaywgdTggY29kZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYjsKIAlzdHJ1Y3QgaXB2NmhkciAqbmlwNmg7CkBAIC0xNzYsNiArMjIxLDkgQEAKIAlpZiAoIXBza2JfbWF5X3B1bGwob2xkc2tiLCBsZW4pKQogCQlyZXR1cm47CiAKKwlpZiAoIXJlamVjdDZfYnJfY3N1bV9vayhvbGRza2IsIGhvb2spKQorCQlyZXR1cm47CisKIAluc2tiID0gYWxsb2Nfc2tiKHNpemVvZihzdHJ1Y3QgaXBoZHIpICsgc2l6ZW9mKHN0cnVjdCBpY21wNmhkcikgKwogCQkJIExMX01BWF9IRUFERVIgKyBsZW4sIEdGUF9BVE9NSUMpOwogCWlmICghbnNrYikKQEAgLTIwNSwxMiArMjUzLDEyIEBACiAKIAluZnRfcmVqZWN0X2JyX3B1c2hfZXRoZXJoZHIob2xkc2tiLCBuc2tiKTsKIAotCWJyX2RlbGl2ZXIoYnJfcG9ydF9nZXRfcmN1KG9sZHNrYi0+ZGV2KSwgbnNrYik7CisJYnJfZGVsaXZlcihicl9wb3J0X2dldF9yY3UoZGV2KSwgbnNrYik7CiB9CiAKIHN0YXRpYyB2b2lkIG5mdF9yZWplY3RfYnJpZGdlX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJCSBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAotCQkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKKwkJCQkgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkJICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCiB7CiAJc3RydWN0IG5mdF9yZWplY3QgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoKHBrdC0+aW4gIT0gTlVMTCkgPyBwa3QtPmluIDogcGt0LT5vdXQpOwpAQCAtMjI0LDE2ICsyNzIsMTYgQEAKIAljYXNlIGh0b25zKEVUSF9QX0lQKToKIAkJc3dpdGNoIChwcml2LT50eXBlKSB7CiAJCWNhc2UgTkZUX1JFSkVDVF9JQ01QX1VOUkVBQ0g6Ci0JCQluZnRfcmVqZWN0X2JyX3NlbmRfdjRfdW5yZWFjaChwa3QtPnNrYiwKKwkJCW5mdF9yZWplY3RfYnJfc2VuZF92NF91bnJlYWNoKHBrdC0+c2tiLCBwa3QtPmluLAogCQkJCQkJICAgICAgcGt0LT5vcHMtPmhvb2tudW0sCiAJCQkJCQkgICAgICBwcml2LT5pY21wX2NvZGUpOwogCQkJYnJlYWs7CiAJCWNhc2UgTkZUX1JFSkVDVF9UQ1BfUlNUOgotCQkJbmZ0X3JlamVjdF9icl9zZW5kX3Y0X3RjcF9yZXNldChwa3QtPnNrYiwKKwkJCW5mdF9yZWplY3RfYnJfc2VuZF92NF90Y3BfcmVzZXQocGt0LT5za2IsIHBrdC0+aW4sCiAJCQkJCQkJcGt0LT5vcHMtPmhvb2tudW0pOwogCQkJYnJlYWs7CiAJCWNhc2UgTkZUX1JFSkVDVF9JQ01QWF9VTlJFQUNIOgotCQkJbmZ0X3JlamVjdF9icl9zZW5kX3Y0X3VucmVhY2gocGt0LT5za2IsCisJCQluZnRfcmVqZWN0X2JyX3NlbmRfdjRfdW5yZWFjaChwa3QtPnNrYiwgcGt0LT5pbiwKIAkJCQkJCSAgICAgIHBrdC0+b3BzLT5ob29rbnVtLAogCQkJCQkJICAgICAgbmZ0X3JlamVjdF9pY21wX2NvZGUocHJpdi0+aWNtcF9jb2RlKSk7CiAJCQlicmVhazsKQEAgLTI0MiwxNiArMjkwLDE2IEBACiAJY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKIAkJc3dpdGNoIChwcml2LT50eXBlKSB7CiAJCWNhc2UgTkZUX1JFSkVDVF9JQ01QX1VOUkVBQ0g6Ci0JCQluZnRfcmVqZWN0X2JyX3NlbmRfdjZfdW5yZWFjaChuZXQsIHBrdC0+c2tiLAorCQkJbmZ0X3JlamVjdF9icl9zZW5kX3Y2X3VucmVhY2gobmV0LCBwa3QtPnNrYiwgcGt0LT5pbiwKIAkJCQkJCSAgICAgIHBrdC0+b3BzLT5ob29rbnVtLAogCQkJCQkJICAgICAgcHJpdi0+aWNtcF9jb2RlKTsKIAkJCWJyZWFrOwogCQljYXNlIE5GVF9SRUpFQ1RfVENQX1JTVDoKLQkJCW5mdF9yZWplY3RfYnJfc2VuZF92Nl90Y3BfcmVzZXQobmV0LCBwa3QtPnNrYiwKKwkJCW5mdF9yZWplY3RfYnJfc2VuZF92Nl90Y3BfcmVzZXQobmV0LCBwa3QtPnNrYiwgcGt0LT5pbiwKIAkJCQkJCQlwa3QtPm9wcy0+aG9va251bSk7CiAJCQlicmVhazsKIAkJY2FzZSBORlRfUkVKRUNUX0lDTVBYX1VOUkVBQ0g6Ci0JCQluZnRfcmVqZWN0X2JyX3NlbmRfdjZfdW5yZWFjaChuZXQsIHBrdC0+c2tiLAorCQkJbmZ0X3JlamVjdF9icl9zZW5kX3Y2X3VucmVhY2gobmV0LCBwa3QtPnNrYiwgcGt0LT5pbiwKIAkJCQkJCSAgICAgIHBrdC0+b3BzLT5ob29rbnVtLAogCQkJCQkJICAgICAgbmZ0X3JlamVjdF9pY21wdjZfY29kZShwcml2LT5pY21wX2NvZGUpKTsKIAkJCWJyZWFrOwpAQCAtMjYyLDcgKzMxMCw3IEBACiAJCWJyZWFrOwogCX0KIG91dDoKLQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GX0RST1A7CisJcmVncy0+dmVyZGljdC5jb2RlID0gTkZfRFJPUDsKIH0KIAogc3RhdGljIGludCBuZnRfcmVqZWN0X2JyaWRnZV92YWxpZGF0ZShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LApAQCAtMzIzLDYgKzM3MSw4IEBACiAJCWlmIChubGFfcHV0X3U4KHNrYiwgTkZUQV9SRUpFQ1RfSUNNUF9DT0RFLCBwcml2LT5pY21wX2NvZGUpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2FpZl9zb2NrZXQuYyBiL25ldC9jYWlmL2NhaWZfc29ja2V0LmMKaW5kZXggNzY5YjE4NS4uNGVjMGM4MCAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2FpZl9zb2NrZXQuYworKysgYi9uZXQvY2FpZi9jYWlmX3NvY2tldC5jCkBAIC0yNzEsOCArMjcxLDggQEAKICAqIENvcGllZCBmcm9tIHVuaXhfZGdyYW1fcmVjdm1zZywgYnV0IHJlbW92ZWQgY3JlZGl0IGNoZWNrcywKICAqIGNoYW5nZWQgbG9ja2luZywgYWRkcmVzcyBoYW5kbGluZyBhbmQgYWRkZWQgTVNHX1RSVU5DLgogICovCi1zdGF0aWMgaW50IGNhaWZfc2VxcGt0X3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCBsZW4sIGludCBmbGFncykKK3N0YXRpYyBpbnQgY2FpZl9zZXFwa3RfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLAorCQkJICAgICAgIHNpemVfdCBsZW4sIGludCBmbGFncykKIAogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwpAQCAtMjgxLDcgKzI4MSw3IEBACiAJaW50IGNvcHlsZW47CiAKIAlyZXQgPSAtRU9QTk9UU1VQUDsKLQlpZiAobS0+bXNnX2ZsYWdzJk1TR19PT0IpCisJaWYgKGZsYWdzICYgTVNHX09PQikKIAkJZ290byByZWFkX2Vycm9yOwogCiAJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzLCAwICwgJnJldCk7CkBAIC0zNDMsOSArMzQzLDggQEAKICAqIENvcGllZCBmcm9tIHVuaXhfc3RyZWFtX3JlY3Ztc2csIGJ1dCByZW1vdmVkIGNyZWRpdCBjaGVja3MsCiAgKiBjaGFuZ2VkIGxvY2tpbmcgY2FsbHMsIGNoYW5nZWQgYWRkcmVzcyBoYW5kbGluZy4KICAqLwotc3RhdGljIGludCBjYWlmX3N0cmVhbV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLAotCQkJICAgICAgIGludCBmbGFncykKK3N0YXRpYyBpbnQgY2FpZl9zdHJlYW1fcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlpbnQgY29waWVkID0gMDsKQEAgLTUxMSw4ICs1MTAsOCBAQAogfQogCiAvKiBDb3BpZWQgZnJvbSBhZl91bml4OnVuaXhfZGdyYW1fc2VuZG1zZywgYW5kIGFkYXB0ZWQgdG8gQ0FJRiAqLwotc3RhdGljIGludCBjYWlmX3NlcXBrdF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqa2lvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCBjYWlmX3NlcXBrdF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBjYWlmc29jayAqY2Zfc2sgPSBjb250YWluZXJfb2Yoc2ssIHN0cnVjdCBjYWlmc29jaywgc2spOwpAQCAtNTg2LDggKzU4NSw4IEBACiAgKiBDaGFuZ2VkIHJlbW92ZWQgcGVybWlzc2lvbiBoYW5kbGluZyBhbmQgYWRkZWQgd2FpdGluZyBmb3IgZmxvdyBvbgogICogYW5kIG90aGVyIG1pbm9yIGFkYXB0YXRpb25zLgogICovCi1zdGF0aWMgaW50IGNhaWZfc3RyZWFtX3NlbmRtc2coc3RydWN0IGtpb2NiICpraW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGNhaWZfc3RyZWFtX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJICAgICAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGNhaWZzb2NrICpjZl9zayA9IGNvbnRhaW5lcl9vZihzaywgc3RydWN0IGNhaWZzb2NrLCBzayk7CmRpZmYgLS1naXQgYS9uZXQvY2FuL2JjbS5jIGIvbmV0L2Nhbi9iY20uYwppbmRleCBlZTlmZmQ5Li5iNTIzNDUzIDEwMDY0NAotLS0gYS9uZXQvY2FuL2JjbS5jCisrKyBiL25ldC9jYW4vYmNtLmMKQEAgLTMyOCw3ICszMjgsNyBAQAogCSAqICBjb250YWluaW5nIHRoZSBpbnRlcmZhY2UgaW5kZXguCiAJICovCiAKLQlCVUlMRF9CVUdfT04oc2l6ZW9mKHNrYi0+Y2IpIDwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9jYW4pKTsKKwlzb2NrX3NrYl9jYl9jaGVja19zaXplKHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfY2FuKSk7CiAJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfY2FuICopc2tiLT5jYjsKIAltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKCphZGRyKSk7CiAJYWRkci0+Y2FuX2ZhbWlseSAgPSBBRl9DQU47CkBAIC0xMjMxLDggKzEyMzEsNyBAQAogLyoKICAqIGJjbV9zZW5kbXNnIC0gcHJvY2VzcyBCQ00gY29tbWFuZHMgKG9wY29kZXMpIGZyb20gdGhlIHVzZXJzcGFjZQogICovCi1zdGF0aWMgaW50IGJjbV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCitzdGF0aWMgaW50IGJjbV9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGJjbV9zb2NrICpibyA9IGJjbV9zayhzayk7CkBAIC0xNTM1LDggKzE1MzQsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJjbV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3N0YXRpYyBpbnQgYmNtX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwKKwkJICAgICAgIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpkaWZmIC0tZ2l0IGEvbmV0L2Nhbi9yYXcuYyBiL25ldC9jYW4vcmF3LmMKaW5kZXggMDBjMTNlZi4uMzFiOTc0OCAxMDA2NDQKLS0tIGEvbmV0L2Nhbi9yYXcuYworKysgYi9uZXQvY2FuL3Jhdy5jCkBAIC03NCw2ICs3NCwxMiBAQAogICogc3RvcmluZyB0aGUgc2luZ2xlIGZpbHRlciBpbiBkZmlsdGVyLCB0byBhdm9pZCB1c2luZyBkeW5hbWljIG1lbW9yeS4KICAqLwogCitzdHJ1Y3QgdW5pcWZyYW1lIHsKKwlrdGltZV90IHRzdGFtcDsKKwljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXVuc2lnbmVkIGludCBqb2luX3J4X2NvdW50OworfTsKKwogc3RydWN0IHJhd19zb2NrIHsKIAlzdHJ1Y3Qgc29jayBzazsKIAlpbnQgYm91bmQ7CkBAIC04MiwxMCArODgsMTIgQEAKIAlpbnQgbG9vcGJhY2s7CiAJaW50IHJlY3Zfb3duX21zZ3M7CiAJaW50IGZkX2ZyYW1lczsKKwlpbnQgam9pbl9maWx0ZXJzOwogCWludCBjb3VudDsgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBhY3RpdmUgZmlsdGVycyAqLwogCXN0cnVjdCBjYW5fZmlsdGVyIGRmaWx0ZXI7IC8qIGRlZmF1bHQvc2luZ2xlIGZpbHRlciAqLwogCXN0cnVjdCBjYW5fZmlsdGVyICpmaWx0ZXI7IC8qIHBvaW50ZXIgdG8gZmlsdGVyKHMpICovCiAJY2FuX2Vycl9tYXNrX3QgZXJyX21hc2s7CisJc3RydWN0IHVuaXFmcmFtZSBfX3BlcmNwdSAqdW5pcTsKIH07CiAKIC8qCkBAIC05NSw4ICsxMDMsOCBAQAogICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCAqcmF3X2ZsYWdzKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JQlVJTERfQlVHX09OKHNpemVvZihza2ItPmNiKSA8PSAoc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9jYW4pICsKLQkJCQkJIHNpemVvZih1bnNpZ25lZCBpbnQpKSk7CisJc29ja19za2JfY2JfY2hlY2tfc2l6ZShzaXplb2Yoc3RydWN0IHNvY2thZGRyX2NhbikgKworCQkJICAgICAgIHNpemVvZih1bnNpZ25lZCBpbnQpKTsKIAogCS8qIHJldHVybiBwb2ludGVyIGFmdGVyIHN0cnVjdCBzb2NrYWRkcl9jYW4gKi8KIAlyZXR1cm4gKHVuc2lnbmVkIGludCAqKSgmKChzdHJ1Y3Qgc29ja2FkZHJfY2FuICopc2tiLT5jYilbMV0pOwpAQCAtMTIzLDYgKzEzMSwyNiBAQAogCWlmICghcm8tPmZkX2ZyYW1lcyAmJiBvc2tiLT5sZW4gIT0gQ0FOX01UVSkKIAkJcmV0dXJuOwogCisJLyogZWxpbWluYXRlIG11bHRpcGxlIGZpbHRlciBtYXRjaGVzIGZvciB0aGUgc2FtZSBza2IgKi8KKwlpZiAodGhpc19jcHVfcHRyKHJvLT51bmlxKS0+c2tiID09IG9za2IgJiYKKwkgICAga3RpbWVfZXF1YWwodGhpc19jcHVfcHRyKHJvLT51bmlxKS0+dHN0YW1wLCBvc2tiLT50c3RhbXApKSB7CisJCWlmIChyby0+am9pbl9maWx0ZXJzKSB7CisJCQl0aGlzX2NwdV9pbmMocm8tPnVuaXEtPmpvaW5fcnhfY291bnQpOworCQkJLyogZHJvcCBmcmFtZSB1bnRpbCBhbGwgZW5hYmxlZCBmaWx0ZXJzIG1hdGNoZWQgKi8KKwkJCWlmICh0aGlzX2NwdV9wdHIocm8tPnVuaXEpLT5qb2luX3J4X2NvdW50IDwgcm8tPmNvdW50KQorCQkJCXJldHVybjsKKwkJfSBlbHNlIHsKKwkJCXJldHVybjsKKwkJfQorCX0gZWxzZSB7CisJCXRoaXNfY3B1X3B0cihyby0+dW5pcSktPnNrYiA9IG9za2I7CisJCXRoaXNfY3B1X3B0cihyby0+dW5pcSktPnRzdGFtcCA9IG9za2ItPnRzdGFtcDsKKwkJdGhpc19jcHVfcHRyKHJvLT51bmlxKS0+am9pbl9yeF9jb3VudCA9IDE7CisJCS8qIGRyb3AgZmlyc3QgZnJhbWUgdG8gY2hlY2sgYWxsIGVuYWJsZWQgZmlsdGVycz8gKi8KKwkJaWYgKHJvLT5qb2luX2ZpbHRlcnMgJiYgcm8tPmNvdW50ID4gMSkKKwkJCXJldHVybjsKKwl9CisKIAkvKiBjbG9uZSB0aGUgZ2l2ZW4gc2tiIHRvIGJlIGFibGUgdG8gZW5xdWV1ZSBpdCBpbnRvIHRoZSByY3YgcXVldWUgKi8KIAlza2IgPSBza2JfY2xvbmUob3NrYiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFza2IpCkBAIC0xMzUsNyArMTYzLDcgQEAKIAkgKiAgY29udGFpbmluZyB0aGUgaW50ZXJmYWNlIGluZGV4LgogCSAqLwogCi0JQlVJTERfQlVHX09OKHNpemVvZihza2ItPmNiKSA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfY2FuKSk7CisJc29ja19za2JfY2JfY2hlY2tfc2l6ZShzaXplb2Yoc3RydWN0IHNvY2thZGRyX2NhbikpOwogCWFkZHIgPSAoc3RydWN0IHNvY2thZGRyX2NhbiAqKXNrYi0+Y2I7CiAJbWVtc2V0KGFkZHIsIDAsIHNpemVvZigqYWRkcikpOwogCWFkZHItPmNhbl9mYW1pbHkgID0gQUZfQ0FOOwpAQCAtMjk2LDYgKzMyNCwxMiBAQAogCXJvLT5sb29wYmFjayAgICAgICAgID0gMTsKIAlyby0+cmVjdl9vd25fbXNncyAgICA9IDA7CiAJcm8tPmZkX2ZyYW1lcyAgICAgICAgPSAwOworCXJvLT5qb2luX2ZpbHRlcnMgICAgID0gMDsKKworCS8qIGFsbG9jX3BlcmNwdSBwcm92aWRlcyB6ZXJvJ2VkIG1lbW9yeSAqLworCXJvLT51bmlxID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB1bmlxZnJhbWUpOworCWlmICh1bmxpa2VseSghcm8tPnVuaXEpKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIHNldCBub3RpZmllciAqLwogCXJvLT5ub3RpZmllci5ub3RpZmllcl9jYWxsID0gcmF3X25vdGlmaWVyOwpAQCAtMzM5LDYgKzM3Myw3IEBACiAJcm8tPmlmaW5kZXggPSAwOwogCXJvLT5ib3VuZCAgID0gMDsKIAlyby0+Y291bnQgICA9IDA7CisJZnJlZV9wZXJjcHUocm8tPnVuaXEpOwogCiAJc29ja19vcnBoYW4oc2spOwogCXNvY2stPnNrID0gTlVMTDsKQEAgLTU4Myw2ICs2MTgsMTUgQEAKIAogCQlicmVhazsKIAorCWNhc2UgQ0FOX1JBV19KT0lOX0ZJTFRFUlM6CisJCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHJvLT5qb2luX2ZpbHRlcnMpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZyby0+am9pbl9maWx0ZXJzLCBvcHR2YWwsIG9wdGxlbikpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAJfQpAQCAtNjQ3LDYgKzY5MSwxMiBAQAogCQl2YWwgPSAmcm8tPmZkX2ZyYW1lczsKIAkJYnJlYWs7CiAKKwljYXNlIENBTl9SQVdfSk9JTl9GSUxURVJTOgorCQlpZiAobGVuID4gc2l6ZW9mKGludCkpCisJCQlsZW4gPSBzaXplb2YoaW50KTsKKwkJdmFsID0gJnJvLT5qb2luX2ZpbHRlcnM7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9CkBAIC02NTgsOCArNzA4LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYXdfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplKQorc3RhdGljIGludCByYXdfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCByYXdfc29jayAqcm8gPSByYXdfc2soc2spOwpAQCAtNzI4LDggKzc3Nyw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByYXdfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IHJhd19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsCisJCSAgICAgICBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKZGlmZiAtLWdpdCBhL25ldC9jZXBoL21lc3Nlbmdlci5jIGIvbmV0L2NlcGgvbWVzc2VuZ2VyLmMKaW5kZXggNmIzZjU0ZS4uYTlmNGFlNCAxMDA2NDQKLS0tIGEvbmV0L2NlcGgvbWVzc2VuZ2VyLmMKKysrIGIvbmV0L2NlcGgvbWVzc2VuZ2VyLmMKQEAgLTQ4NCw3ICs0ODQsNyBAQAogCQkJICAgICAgIElQUFJPVE9fVENQLCAmc29jayk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQlzb2NrLT5zay0+c2tfYWxsb2NhdGlvbiA9IEdGUF9OT0ZTIHwgX19HRlBfTUVNQUxMT0M7CisJc29jay0+c2stPnNrX2FsbG9jYXRpb24gPSBHRlBfTk9GUzsKIAogI2lmZGVmIENPTkZJR19MT0NLREVQCiAJbG9ja2RlcF9zZXRfY2xhc3MoJnNvY2stPnNrLT5za19sb2NrLCAmc29ja2V0X2NsYXNzKTsKQEAgLTUyMCw4ICs1MjAsNiBAQAogCQkJICAgICAgIHJldCk7CiAJfQogCi0Jc2tfc2V0X21lbWFsbG9jKHNvY2stPnNrKTsKLQogCWNvbi0+c29jayA9IHNvY2s7CiAJcmV0dXJuIDA7CiB9CkBAIC0yODA4LDExICsyODA2LDggQEAKIHsKIAlzdHJ1Y3QgY2VwaF9jb25uZWN0aW9uICpjb24gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGNlcGhfY29ubmVjdGlvbiwKIAkJCQkJCSAgIHdvcmsud29yayk7Ci0JdW5zaWduZWQgbG9uZyBwZmxhZ3MgPSBjdXJyZW50LT5mbGFnczsKIAlib29sIGZhdWx0OwogCi0JY3VycmVudC0+ZmxhZ3MgfD0gUEZfTUVNQUxMT0M7Ci0KIAltdXRleF9sb2NrKCZjb24tPm11dGV4KTsKIAl3aGlsZSAodHJ1ZSkgewogCQlpbnQgcmV0OwpAQCAtMjg2Niw4ICsyODYxLDYgQEAKIAkJY29uX2ZhdWx0X2ZpbmlzaChjb24pOwogCiAJY29uLT5vcHMtPnB1dChjb24pOwotCi0JdHNrX3Jlc3RvcmVfZmxhZ3MoY3VycmVudCwgcGZsYWdzLCBQRl9NRU1BTExPQyk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9uZXQvY29tcGF0LmMgYi9uZXQvY29tcGF0LmMKaW5kZXggOTRkM2Q1ZS4uNWNmZDI2YSAxMDA2NDQKLS0tIGEvbmV0L2NvbXBhdC5jCisrKyBiL25ldC9jb21wYXQuYwpAQCAtMzEsMTAgKzMxLDEwIEBACiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxuZXQvY29tcGF0Lmg+CiAKLXNzaXplX3QgZ2V0X2NvbXBhdF9tc2doZHIoc3RydWN0IG1zZ2hkciAqa21zZywKLQkJCSAgc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICp1bXNnLAotCQkJICBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICoqc2F2ZV9hZGRyLAotCQkJICBzdHJ1Y3QgaW92ZWMgKippb3YpCitpbnQgZ2V0X2NvbXBhdF9tc2doZHIoc3RydWN0IG1zZ2hkciAqa21zZywKKwkJICAgICAgc3RydWN0IGNvbXBhdF9tc2doZHIgX191c2VyICp1bXNnLAorCQkgICAgICBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICoqc2F2ZV9hZGRyLAorCQkgICAgICBzdHJ1Y3QgaW92ZWMgKippb3YpCiB7CiAJY29tcGF0X3VwdHJfdCB1YWRkciwgdWlvdiwgdG1wMzsKIAljb21wYXRfc2l6ZV90IG5yX3NlZ3M7CkBAIC00OSw2ICs0OSwxMyBAQAogCSAgICBfX2dldF91c2VyKGttc2ctPm1zZ19jb250cm9sbGVuLCAmdW1zZy0+bXNnX2NvbnRyb2xsZW4pIHx8CiAJICAgIF9fZ2V0X3VzZXIoa21zZy0+bXNnX2ZsYWdzLCAmdW1zZy0+bXNnX2ZsYWdzKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIXVhZGRyKQorCQlrbXNnLT5tc2dfbmFtZWxlbiA9IDA7CisKKwlpZiAoa21zZy0+bXNnX25hbWVsZW4gPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChrbXNnLT5tc2dfbmFtZWxlbiA+IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSkpCiAJCWttc2ctPm1zZ19uYW1lbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKTsKIAlrbXNnLT5tc2dfY29udHJvbCA9IGNvbXBhdF9wdHIodG1wMyk7CkBAIC03MiwxMyArNzksMTEgQEAKIAlpZiAobnJfc2VncyA+IFVJT19NQVhJT1YpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKLQllcnIgPSBjb21wYXRfcndfY29weV9jaGVja191dmVjdG9yKHNhdmVfYWRkciA/IFJFQUQgOiBXUklURSwKLQkJCQkJICAgY29tcGF0X3B0cih1aW92KSwgbnJfc2VncywKLQkJCQkJICAgVUlPX0ZBU1RJT1YsICppb3YsIGlvdik7Ci0JaWYgKGVyciA+PSAwKQotCQlpb3ZfaXRlcl9pbml0KCZrbXNnLT5tc2dfaXRlciwgc2F2ZV9hZGRyID8gUkVBRCA6IFdSSVRFLAotCQkJICAgICAgKmlvdiwgbnJfc2VncywgZXJyKTsKLQlyZXR1cm4gZXJyOworCWttc2ctPm1zZ19pb2NiID0gTlVMTDsKKworCXJldHVybiBjb21wYXRfaW1wb3J0X2lvdmVjKHNhdmVfYWRkciA/IFJFQUQgOiBXUklURSwKKwkJCQkgICBjb21wYXRfcHRyKHVpb3YpLCBucl9zZWdzLAorCQkJCSAgIFVJT19GQVNUSU9WLCBpb3YsICZrbXNnLT5tc2dfaXRlcik7CiB9CiAKIC8qIEJsZWVjaC4uLiAqLwpAQCAtNTA4LDI1ICs1MTMsMjUgQEAKIHN0cnVjdCBjb21wYXRfZ3JvdXBfcmVxIHsKIAlfX3UzMgkJCQkgZ3JfaW50ZXJmYWNlOwogCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdyX2dyb3VwCi0JCV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7CisJCV9fYWxpZ25lZCg0KTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBjb21wYXRfZ3JvdXBfc291cmNlX3JlcSB7CiAJX191MzIJCQkJIGdzcl9pbnRlcmZhY2U7CiAJc3RydWN0IF9fa2VybmVsX3NvY2thZGRyX3N0b3JhZ2UgZ3NyX2dyb3VwCi0JCV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7CisJCV9fYWxpZ25lZCg0KTsKIAlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSBnc3Jfc291cmNlCi0JCV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7CisJCV9fYWxpZ25lZCg0KTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBjb21wYXRfZ3JvdXBfZmlsdGVyIHsKIAlfX3UzMgkJCQkgZ2ZfaW50ZXJmYWNlOwogCXN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlIGdmX2dyb3VwCi0JCV9fYXR0cmlidXRlX18gKChhbGlnbmVkKDQpKSk7CisJCV9fYWxpZ25lZCg0KTsKIAlfX3UzMgkJCQkgZ2ZfZm1vZGU7CiAJX191MzIJCQkJIGdmX251bXNyYzsKIAlzdHJ1Y3QgX19rZXJuZWxfc29ja2FkZHJfc3RvcmFnZSBnZl9zbGlzdFsxXQotCQlfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg0KSkpOworCQlfX2FsaWduZWQoNCk7CiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIF9fQ09NUEFUX0dGMF9TSVpFIChzaXplb2Yoc3RydWN0IGNvbXBhdF9ncm91cF9maWx0ZXIpIC0gXApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGF0YWdyYW0uYyBiL25ldC9jb3JlL2RhdGFncmFtLmMKaW5kZXggZGY0OTNkNi4uYjgwZmI5MSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZGF0YWdyYW0uYworKysgYi9uZXQvY29yZS9kYXRhZ3JhbS5jCkBAIC02NzMsNyArNjczLDcgQEAKIAlpZiAoIWNodW5rKQogCQlyZXR1cm4gMDsKIAotCWlmIChpb3ZfaXRlcl9jb3VudCgmbXNnLT5tc2dfaXRlcikgPCBjaHVuaykgeworCWlmIChtc2dfZGF0YV9sZWZ0KG1zZykgPCBjaHVuaykgewogCQlpZiAoX19za2JfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJCWdvdG8gY3N1bV9lcnJvcjsKIAkJaWYgKHNrYl9jb3B5X2RhdGFncmFtX21zZyhza2IsIGhsZW4sIG1zZywgY2h1bmspKQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCA5NjJlZTlkLi5hZjRhMWIwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtNjYwLDYgKzY2MCwyNyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCisgKglkZXZfZ2V0X2lmbGluawktIGdldCAnaWZsaW5rJyB2YWx1ZSBvZiBhIGludGVyZmFjZQorICoJQGRldjogdGFyZ2V0ZWQgaW50ZXJmYWNlCisgKgorICoJSW5kaWNhdGVzIHRoZSBpZmluZGV4IHRoZSBpbnRlcmZhY2UgaXMgbGlua2VkIHRvLgorICoJUGh5c2ljYWwgaW50ZXJmYWNlcyBoYXZlIHRoZSBzYW1lICdpZmluZGV4JyBhbmQgJ2lmbGluaycgdmFsdWVzLgorICovCisKK2ludCBkZXZfZ2V0X2lmbGluayhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChkZXYtPm5ldGRldl9vcHMgJiYgZGV2LT5uZXRkZXZfb3BzLT5uZG9fZ2V0X2lmbGluaykKKwkJcmV0dXJuIGRldi0+bmV0ZGV2X29wcy0+bmRvX2dldF9pZmxpbmsoZGV2KTsKKworCS8qIElmIGRldi0+cnRubF9saW5rX29wcyBpcyBzZXQsIGl0J3MgYSB2aXJ0dWFsIGludGVyZmFjZS4gKi8KKwlpZiAoZGV2LT5ydG5sX2xpbmtfb3BzKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBkZXYtPmlmaW5kZXg7Cit9CitFWFBPUlRfU1lNQk9MKGRldl9nZXRfaWZsaW5rKTsKKworLyoqCiAgKglfX2Rldl9nZXRfYnlfbmFtZQktIGZpbmQgYSBkZXZpY2UgYnkgaXRzIG5hbWUKICAqCUBuZXQ6IHRoZSBhcHBsaWNhYmxlIG5ldCBuYW1lc3BhY2UKICAqCUBuYW1lOiBuYW1lIHRvIGZpbmQKQEAgLTEzODUsNyArMTQwNiw3IEBACiAJcmV0dXJuIHJldHZhbDsKIH0KIAotc3RhdGljIGludCBkZXZfY2xvc2VfbWFueShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoraW50IGRldl9jbG9zZV9tYW55KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGJvb2wgdW5saW5rKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsICp0bXA7CiAKQEAgLTEzOTksMTEgKzE0MjAsMTMgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGV2LCB0bXAsIGhlYWQsIGNsb3NlX2xpc3QpIHsKIAkJcnRtc2dfaWZpbmZvKFJUTV9ORVdMSU5LLCBkZXYsIElGRl9VUHxJRkZfUlVOTklORywgR0ZQX0tFUk5FTCk7CiAJCWNhbGxfbmV0ZGV2aWNlX25vdGlmaWVycyhORVRERVZfRE9XTiwgZGV2KTsKLQkJbGlzdF9kZWxfaW5pdCgmZGV2LT5jbG9zZV9saXN0KTsKKwkJaWYgKHVubGluaykKKwkJCWxpc3RfZGVsX2luaXQoJmRldi0+Y2xvc2VfbGlzdCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGRldl9jbG9zZV9tYW55KTsKIAogLyoqCiAgKglkZXZfY2xvc2UgLSBzaHV0ZG93biBhbiBpbnRlcmZhY2UuCkBAIC0xNDIwLDcgKzE0NDMsNyBAQAogCQlMSVNUX0hFQUQoc2luZ2xlKTsKIAogCQlsaXN0X2FkZCgmZGV2LT5jbG9zZV9saXN0LCAmc2luZ2xlKTsKLQkJZGV2X2Nsb3NlX21hbnkoJnNpbmdsZSk7CisJCWRldl9jbG9zZV9tYW55KCZzaW5nbGUsIHRydWUpOwogCQlsaXN0X2RlbCgmc2luZ2xlKTsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNjA3LDYgKzE2MzAsMjIgQEAKIH0KIEVYUE9SVF9TWU1CT0woY2FsbF9uZXRkZXZpY2Vfbm90aWZpZXJzKTsKIAorI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAorc3RhdGljIHN0cnVjdCBzdGF0aWNfa2V5IGluZ3Jlc3NfbmVlZGVkIF9fcmVhZF9tb3N0bHk7CisKK3ZvaWQgbmV0X2luY19pbmdyZXNzX3F1ZXVlKHZvaWQpCit7CisJc3RhdGljX2tleV9zbG93X2luYygmaW5ncmVzc19uZWVkZWQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmV0X2luY19pbmdyZXNzX3F1ZXVlKTsKKwordm9pZCBuZXRfZGVjX2luZ3Jlc3NfcXVldWUodm9pZCkKK3sKKwlzdGF0aWNfa2V5X3Nsb3dfZGVjKCZpbmdyZXNzX25lZWRlZCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZXRfZGVjX2luZ3Jlc3NfcXVldWUpOworI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3Qgc3RhdGljX2tleSBuZXRzdGFtcF9uZWVkZWQgX19yZWFkX21vc3RseTsKICNpZmRlZiBIQVZFX0pVTVBfTEFCRUwKIC8qIFdlIGFyZSBub3QgYWxsb3dlZCB0byBjYWxsIHN0YXRpY19rZXlfc2xvd19kZWMoKSBmcm9tIGlycSBjb250ZXh0CkBAIC0xNjk0LDYgKzE3MzMsNyBAQAogCX0KIAogCXNrYl9zY3J1Yl9wYWNrZXQoc2tiLCB0cnVlKTsKKwlza2ItPnByaW9yaXR5ID0gMDsKIAlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCXNrYl9wb3N0cHVsbF9yY3N1bShza2IsIGV0aF9oZHIoc2tiKSwgRVRIX0hMRU4pOwogCkBAIC0xNzM3LDcgKzE3NzcsOCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGVsaXZlcl9wdHlwZV9saXN0X3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgIHN0cnVjdCBwYWNrZXRfdHlwZSAqKnB0LAotCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fYmUxNiB0eXBlLAorCQkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldiwKKwkJCQkJICBfX2JlMTYgdHlwZSwKIAkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpwdHlwZV9saXN0KQogewogCXN0cnVjdCBwYWNrZXRfdHlwZSAqcHR5cGUsICpwdF9wcmV2ID0gKnB0OwpAQCAtMTc0Niw3ICsxNzg3LDcgQEAKIAkJaWYgKHB0eXBlLT50eXBlICE9IHR5cGUpCiAJCQljb250aW51ZTsKIAkJaWYgKHB0X3ByZXYpCi0JCQlkZWxpdmVyX3NrYihza2IsIHB0X3ByZXYsIGRldik7CisJCQlkZWxpdmVyX3NrYihza2IsIHB0X3ByZXYsIG9yaWdfZGV2KTsKIAkJcHRfcHJldiA9IHB0eXBlOwogCX0KIAkqcHQgPSBwdF9wcmV2OwpAQCAtMjU1OSwxMiArMjYwMCwyNiBAQAogCXJldHVybiBmZWF0dXJlczsKIH0KIAorbmV0ZGV2X2ZlYXR1cmVzX3QgcGFzc3RocnVfZmVhdHVyZXNfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQoreworCXJldHVybiBmZWF0dXJlczsKK30KK0VYUE9SVF9TWU1CT0wocGFzc3RocnVfZmVhdHVyZXNfY2hlY2spOworCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgZGZsdF9mZWF0dXJlc19jaGVjayhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCit7CisJcmV0dXJuIHZsYW5fZmVhdHVyZXNfY2hlY2soc2tiLCBmZWF0dXJlcyk7Cit9CisKIG5ldGRldl9mZWF0dXJlc190IG5ldGlmX3NrYl9mZWF0dXJlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKIAluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcyA9IGRldi0+ZmVhdHVyZXM7CiAJdTE2IGdzb19zZWdzID0gc2tiX3NoaW5mbyhza2IpLT5nc29fc2VnczsKLQlfX2JlMTYgcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOwogCiAJaWYgKGdzb19zZWdzID4gZGV2LT5nc29fbWF4X3NlZ3MgfHwgZ3NvX3NlZ3MgPCBkZXYtPmdzb19taW5fc2VncykKIAkJZmVhdHVyZXMgJj0gfk5FVElGX0ZfR1NPX01BU0s7CkBAIC0yNTc2LDM0ICsyNjMxLDE3IEBACiAJaWYgKHNrYi0+ZW5jYXBzdWxhdGlvbikKIAkJZmVhdHVyZXMgJj0gZGV2LT5od19lbmNfZmVhdHVyZXM7CiAKLQlpZiAoIXNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikpIHsKLQkJaWYgKHVubGlrZWx5KHByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSB8fAotCQkJICAgICBwcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxQUQpKSkgewotCQkJc3RydWN0IHZsYW5fZXRoaGRyICp2ZWggPSAoc3RydWN0IHZsYW5fZXRoaGRyICopc2tiLT5kYXRhOwotCQkJcHJvdG9jb2wgPSB2ZWgtPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87Ci0JCX0gZWxzZSB7Ci0JCQlnb3RvIGZpbmFsaXplOwotCQl9Ci0JfQotCi0JZmVhdHVyZXMgPSBuZXRkZXZfaW50ZXJzZWN0X2ZlYXR1cmVzKGZlYXR1cmVzLAotCQkJCQkgICAgIGRldi0+dmxhbl9mZWF0dXJlcyB8Ci0JCQkJCSAgICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfAotCQkJCQkgICAgIE5FVElGX0ZfSFdfVkxBTl9TVEFHX1RYKTsKLQotCWlmIChwcm90b2NvbCA9PSBodG9ucyhFVEhfUF84MDIxUSkgfHwgcHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMUFEKSkKKwlpZiAoc2tiX3ZsYW5fdGFnZ2VkKHNrYikpCiAJCWZlYXR1cmVzID0gbmV0ZGV2X2ludGVyc2VjdF9mZWF0dXJlcyhmZWF0dXJlcywKLQkJCQkJCSAgICAgTkVUSUZfRl9TRyB8Ci0JCQkJCQkgICAgIE5FVElGX0ZfSElHSERNQSB8Ci0JCQkJCQkgICAgIE5FVElGX0ZfRlJBR0xJU1QgfAotCQkJCQkJICAgICBORVRJRl9GX0dFTl9DU1VNIHwKKwkJCQkJCSAgICAgZGV2LT52bGFuX2ZlYXR1cmVzIHwKIAkJCQkJCSAgICAgTkVUSUZfRl9IV19WTEFOX0NUQUdfVFggfAogCQkJCQkJICAgICBORVRJRl9GX0hXX1ZMQU5fU1RBR19UWCk7CiAKLWZpbmFsaXplOgogCWlmIChkZXYtPm5ldGRldl9vcHMtPm5kb19mZWF0dXJlc19jaGVjaykKIAkJZmVhdHVyZXMgJj0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fZmVhdHVyZXNfY2hlY2soc2tiLCBkZXYsCiAJCQkJCQkJCWZlYXR1cmVzKTsKKwllbHNlCisJCWZlYXR1cmVzICY9IGRmbHRfZmVhdHVyZXNfY2hlY2soc2tiLCBkZXYsIGZlYXR1cmVzKTsKIAogCXJldHVybiBoYXJtb25pemVfZmVhdHVyZXMoc2tiLCBmZWF0dXJlcyk7CiB9CkBAIC0yODQ4LDE0ICsyODg2LDE2IEBACiAjZGVmaW5lIHNrYl91cGRhdGVfcHJpbyhza2IpCiAjZW5kaWYKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgeG1pdF9yZWN1cnNpb24pOworREVGSU5FX1BFUl9DUFUoaW50LCB4bWl0X3JlY3Vyc2lvbik7CitFWFBPUlRfU1lNQk9MKHhtaXRfcmVjdXJzaW9uKTsKKwogI2RlZmluZSBSRUNVUlNJT05fTElNSVQgMTAKIAogLyoqCiAgKglkZXZfbG9vcGJhY2tfeG1pdCAtIGxvb3AgYmFjayBAc2tiCiAgKglAc2tiOiBidWZmZXIgdG8gdHJhbnNtaXQKICAqLwotaW50IGRldl9sb29wYmFja194bWl0KHN0cnVjdCBza19idWZmICpza2IpCitpbnQgZGV2X2xvb3BiYWNrX3htaXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJX19za2JfcHVsbChza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpKTsKQEAgLTI5OTMsMTEgKzMwMzMsMTEgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBkZXZfcXVldWVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IGRldl9xdWV1ZV94bWl0X3NrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlyZXR1cm4gX19kZXZfcXVldWVfeG1pdChza2IsIE5VTEwpOwogfQotRVhQT1JUX1NZTUJPTChkZXZfcXVldWVfeG1pdCk7CitFWFBPUlRfU1lNQk9MKGRldl9xdWV1ZV94bWl0X3NrKTsKIAogaW50IGRldl9xdWV1ZV94bWl0X2FjY2VsKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKmFjY2VsX3ByaXYpCiB7CkBAIC0zNTIzLDcgKzM1NjMsNyBAQAogCXN0cnVjdCBuZXRkZXZfcXVldWUgKnJ4cSA9IHJjdV9kZXJlZmVyZW5jZShza2ItPmRldi0+aW5ncmVzc19xdWV1ZSk7CiAKIAlpZiAoIXJ4cSB8fCByY3VfYWNjZXNzX3BvaW50ZXIocnhxLT5xZGlzYykgPT0gJm5vb3BfcWRpc2MpCi0JCWdvdG8gb3V0OworCQlyZXR1cm4gc2tiOwogCiAJaWYgKCpwdF9wcmV2KSB7CiAJCSpyZXQgPSBkZWxpdmVyX3NrYihza2IsICpwdF9wcmV2LCBvcmlnX2Rldik7CkBAIC0zNTM3LDggKzM1NzcsNiBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLW91dDoKLQlza2ItPnRjX3ZlcmQgPSAwOwogCXJldHVybiBza2I7CiB9CiAjZW5kaWYKQEAgLTM2NzQsMTIgKzM3MTIsMTUgQEAKIAogc2tpcF90YXBzOgogI2lmZGVmIENPTkZJR19ORVRfQ0xTX0FDVAotCXNrYiA9IGhhbmRsZV9pbmcoc2tiLCAmcHRfcHJldiwgJnJldCwgb3JpZ19kZXYpOwotCWlmICghc2tiKQotCQlnb3RvIHVubG9jazsKKwlpZiAoc3RhdGljX2tleV9mYWxzZSgmaW5ncmVzc19uZWVkZWQpKSB7CisJCXNrYiA9IGhhbmRsZV9pbmcoc2tiLCAmcHRfcHJldiwgJnJldCwgb3JpZ19kZXYpOworCQlpZiAoIXNrYikKKwkJCWdvdG8gdW5sb2NrOworCX0KKworCXNrYi0+dGNfdmVyZCA9IDA7CiBuY2xzOgogI2VuZGlmCi0KIAlpZiAocGZtZW1hbGxvYyAmJiAhc2tiX3BmbWVtYWxsb2NfcHJvdG9jb2woc2tiKSkKIAkJZ290byBkcm9wOwogCkBAIC0zODI5LDEzICszODcwLDEzIEBACiAgKglORVRfUlhfU1VDQ0VTUzogbm8gY29uZ2VzdGlvbgogICoJTkVUX1JYX0RST1A6IHBhY2tldCB3YXMgZHJvcHBlZAogICovCi1pbnQgbmV0aWZfcmVjZWl2ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBuZXRpZl9yZWNlaXZlX3NrYl9zayhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdHJhY2VfbmV0aWZfcmVjZWl2ZV9za2JfZW50cnkoc2tiKTsKIAogCXJldHVybiBuZXRpZl9yZWNlaXZlX3NrYl9pbnRlcm5hbChza2IpOwogfQotRVhQT1JUX1NZTUJPTChuZXRpZl9yZWNlaXZlX3NrYik7CitFWFBPUlRfU1lNQk9MKG5ldGlmX3JlY2VpdmVfc2tiX3NrKTsKIAogLyogTmV0d29yayBkZXZpY2UgaXMgZ29pbmcgYXdheSwgZmx1c2ggYW55IHBhY2tldHMgc3RpbGwgcGVuZGluZwogICogQ2FsbGVkIHdpdGggaXJxcyBkaXNhYmxlZC4KQEAgLTU5MTIsNiArNTk1MywyNCBAQAogRVhQT1JUX1NZTUJPTChkZXZfZ2V0X3BoeXNfcG9ydF9pZCk7CiAKIC8qKgorICoJZGV2X2dldF9waHlzX3BvcnRfbmFtZSAtIEdldCBkZXZpY2UgcGh5c2ljYWwgcG9ydCBuYW1lCisgKglAZGV2OiBkZXZpY2UKKyAqCUBuYW1lOiBwb3J0IG5hbWUKKyAqCisgKglHZXQgZGV2aWNlIHBoeXNpY2FsIHBvcnQgbmFtZQorICovCitpbnQgZGV2X2dldF9waHlzX3BvcnRfbmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgY2hhciAqbmFtZSwgc2l6ZV90IGxlbikKK3sKKwljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IGRldi0+bmV0ZGV2X29wczsKKworCWlmICghb3BzLT5uZG9fZ2V0X3BoeXNfcG9ydF9uYW1lKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJcmV0dXJuIG9wcy0+bmRvX2dldF9waHlzX3BvcnRfbmFtZShkZXYsIG5hbWUsIGxlbik7Cit9CitFWFBPUlRfU1lNQk9MKGRldl9nZXRfcGh5c19wb3J0X25hbWUpOworCisvKioKICAqCWRldl9uZXdfaW5kZXgJLQlhbGxvY2F0ZSBhbiBpZmluZGV4CiAgKglAbmV0OiB0aGUgYXBwbGljYWJsZSBuZXQgbmFtZXNwYWNlCiAgKgpAQCAtNTk2OCw3ICs2MDI3LDcgQEAKIAkvKiBJZiBkZXZpY2UgaXMgcnVubmluZywgY2xvc2UgaXQgZmlyc3QuICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsIGhlYWQsIHVucmVnX2xpc3QpCiAJCWxpc3RfYWRkX3RhaWwoJmRldi0+Y2xvc2VfbGlzdCwgJmNsb3NlX2hlYWQpOwotCWRldl9jbG9zZV9tYW55KCZjbG9zZV9oZWFkKTsKKwlkZXZfY2xvc2VfbWFueSgmY2xvc2VfaGVhZCwgdHJ1ZSk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgaGVhZCwgdW5yZWdfbGlzdCkgewogCQkvKiBBbmQgdW5saW5rIGl0IGZyb20gZGV2aWNlIGNoYWluLiAqLwpAQCAtNjI5NSw4ICs2MzU0LDYgQEAKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5hZGRyX2xpc3RfbG9jayk7CiAJbmV0ZGV2X3NldF9hZGRyX2xvY2tkZXBfY2xhc3MoZGV2KTsKIAotCWRldi0+aWZsaW5rID0gLTE7Ci0KIAlyZXQgPSBkZXZfZ2V0X3ZhbGlkX25hbWUobmV0LCBkZXYsIGRldi0+bmFtZSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwpAQCAtNjMyNiw5ICs2MzgzLDYgQEAKIAllbHNlIGlmIChfX2Rldl9nZXRfYnlfaW5kZXgobmV0LCBkZXYtPmlmaW5kZXgpKQogCQlnb3RvIGVycl91bmluaXQ7CiAKLQlpZiAoZGV2LT5pZmxpbmsgPT0gLTEpCi0JCWRldi0+aWZsaW5rID0gZGV2LT5pZmluZGV4OwotCiAJLyogVHJhbnNmZXIgY2hhbmdlYWJsZSBmZWF0dXJlcyB0byB3YW50ZWRfZmVhdHVyZXMgYW5kIGVuYWJsZQogCSAqIHNvZnR3YXJlIG9mZmxvYWRzIChHU08gYW5kIEdSTykuCiAJICovCkBAIC02ODQxLDggKzY4OTUsNiBAQAogewogCXN0cnVjdCBuYXBpX3N0cnVjdCAqcCwgKm47CiAKLQlyZWxlYXNlX25ldChkZXZfbmV0KGRldikpOwotCiAJbmV0aWZfZnJlZV90eF9xdWV1ZXMoZGV2KTsKICNpZmRlZiBDT05GSUdfU1lTRlMKIAlrdmZyZWUoZGV2LT5fcngpOwpAQCAtNzA0MywxMiArNzA5NSw4IEBACiAJZGV2X25ldF9zZXQoZGV2LCBuZXQpOwogCiAJLyogSWYgdGhlcmUgaXMgYW4gaWZpbmRleCBjb25mbGljdCBhc3NpZ24gYSBuZXcgb25lICovCi0JaWYgKF9fZGV2X2dldF9ieV9pbmRleChuZXQsIGRldi0+aWZpbmRleCkpIHsKLQkJaW50IGlmbGluayA9IChkZXYtPmlmbGluayA9PSBkZXYtPmlmaW5kZXgpOworCWlmIChfX2Rldl9nZXRfYnlfaW5kZXgobmV0LCBkZXYtPmlmaW5kZXgpKQogCQlkZXYtPmlmaW5kZXggPSBkZXZfbmV3X2luZGV4KG5ldCk7Ci0JCWlmIChpZmxpbmspCi0JCQlkZXYtPmlmbGluayA9IGRldi0+aWZpbmRleDsKLQl9CiAKIAkvKiBTZW5kIGEgbmV0ZGV2LWFkZCB1ZXZlbnQgdG8gdGhlIG5ldyBuYW1lc3BhY2UgKi8KIAlrb2JqZWN0X3VldmVudCgmZGV2LT5kZXYua29iaiwgS09CSl9BREQpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZXRodG9vbC5jIGIvbmV0L2NvcmUvZXRodG9vbC5jCmluZGV4IGFhMzc4ZWMuLjFkMDBiODkgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2V0aHRvb2wuYworKysgYi9uZXQvY29yZS9ldGh0b29sLmMKQEAgLTc5MCw3ICs3OTAsNyBAQAogCWlmIChvcHMtPmdldF9yeGZoX2luZGlyX3NpemUpCiAJCWRldl9pbmRpcl9zaXplID0gb3BzLT5nZXRfcnhmaF9pbmRpcl9zaXplKGRldik7CiAJaWYgKG9wcy0+Z2V0X3J4Zmhfa2V5X3NpemUpCi0JCWRldl9rZXlfc2l6ZSA9IGRldi0+ZXRodG9vbF9vcHMtPmdldF9yeGZoX2tleV9zaXplKGRldik7CisJCWRldl9rZXlfc2l6ZSA9IG9wcy0+Z2V0X3J4Zmhfa2V5X3NpemUoZGV2KTsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmcnhmaCwgdXNlcmFkZHIsIHNpemVvZihyeGZoKSkpCiAJCXJldHVybiAtRUZBVUxUOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmliX3J1bGVzLmMgYi9uZXQvY29yZS9maWJfcnVsZXMuYwppbmRleCA0NDcwNmU4Li45YTEyNjY4IDEwMDY0NAotLS0gYS9uZXQvY29yZS9maWJfcnVsZXMuYworKysgYi9uZXQvY29yZS9maWJfcnVsZXMuYwpAQCAtMzEsNyArMzEsNyBAQAogCXItPnByZWYgPSBwcmVmOwogCXItPnRhYmxlID0gdGFibGU7CiAJci0+ZmxhZ3MgPSBmbGFnczsKLQlyLT5mcl9uZXQgPSBob2xkX25ldChvcHMtPmZyb19uZXQpOworCXItPmZyX25ldCA9IG9wcy0+ZnJvX25ldDsKIAogCXItPnN1cHByZXNzX3ByZWZpeGxlbiA9IC0xOwogCXItPnN1cHByZXNzX2lmZ3JvdXAgPSAtMTsKQEAgLTExNiw3ICsxMTYsNiBAQAogCQlpZiAob3BzLT5mYW1pbHkgPT0gby0+ZmFtaWx5KQogCQkJZ290byBlcnJvdXQ7CiAKLQlob2xkX25ldChuZXQpOwogCWxpc3RfYWRkX3RhaWxfcmN1KCZvcHMtPmxpc3QsICZuZXQtPnJ1bGVzX29wcyk7CiAJZXJyID0gMDsKIGVycm91dDoKQEAgLTE2MCwyNSArMTU5LDE2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBmaWJfcnVsZXNfcHV0X3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGZpYl9ydWxlc19vcHMgKm9wcyA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgZmliX3J1bGVzX29wcywgcmN1KTsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBvcHMtPmZyb19uZXQ7Ci0KLQlyZWxlYXNlX25ldChuZXQpOwotCWtmcmVlKG9wcyk7Ci19Ci0KIHZvaWQgZmliX3J1bGVzX3VucmVnaXN0ZXIoc3RydWN0IGZpYl9ydWxlc19vcHMgKm9wcykKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBvcHMtPmZyb19uZXQ7CiAKIAlzcGluX2xvY2soJm5ldC0+cnVsZXNfbW9kX2xvY2spOwogCWxpc3RfZGVsX3JjdSgmb3BzLT5saXN0KTsKLQlmaWJfcnVsZXNfY2xlYW51cF9vcHMob3BzKTsKIAlzcGluX3VubG9jaygmbmV0LT5ydWxlc19tb2RfbG9jayk7CiAKLQljYWxsX3JjdSgmb3BzLT5yY3UsIGZpYl9ydWxlc19wdXRfcmN1KTsKKwlmaWJfcnVsZXNfY2xlYW51cF9vcHMob3BzKTsKKwlrZnJlZV9yY3Uob3BzLCByY3UpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZmliX3J1bGVzX3VucmVnaXN0ZXIpOwogCkBAIC0zMDMsNyArMjkzLDcgQEAKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnJvdXQ7CiAJfQotCXJ1bGUtPmZyX25ldCA9IGhvbGRfbmV0KG5ldCk7CisJcnVsZS0+ZnJfbmV0ID0gbmV0OwogCiAJaWYgKHRiW0ZSQV9QUklPUklUWV0pCiAJCXJ1bGUtPnByZWYgPSBubGFfZ2V0X3UzMih0YltGUkFfUFJJT1JJVFldKTsKQEAgLTQyMyw3ICs0MTMsNiBAQAogCXJldHVybiAwOwogCiBlcnJvdXRfZnJlZToKLQlyZWxlYXNlX25ldChydWxlLT5mcl9uZXQpOwogCWtmcmVlKHJ1bGUpOwogZXJyb3V0OgogCXJ1bGVzX29wc19wdXQob3BzKTsKQEAgLTQ5Miw2ICs0ODEsMTIgQEAKIAkJCWdvdG8gZXJyb3V0OwogCQl9CiAKKwkJaWYgKG9wcy0+ZGVsZXRlKSB7CisJCQllcnIgPSBvcHMtPmRlbGV0ZShydWxlKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJvdXQ7CisJCX0KKwogCQlsaXN0X2RlbF9yY3UoJnJ1bGUtPmxpc3QpOwogCiAJCWlmIChydWxlLT5hY3Rpb24gPT0gRlJfQUNUX0dPVE8pIHsKQEAgLTUxNyw4ICs1MTIsNiBAQAogCiAJCW5vdGlmeV9ydWxlX2NoYW5nZShSVE1fREVMUlVMRSwgcnVsZSwgb3BzLCBubGgsCiAJCQkJICAgTkVUTElOS19DQihza2IpLnBvcnRpZCk7Ci0JCWlmIChvcHMtPmRlbGV0ZSkKLQkJCW9wcy0+ZGVsZXRlKHJ1bGUpOwogCQlmaWJfcnVsZV9wdXQocnVsZSk7CiAJCWZsdXNoX3JvdXRlX2NhY2hlKG9wcyk7CiAJCXJ1bGVzX29wc19wdXQob3BzKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2ZpbHRlci5jIGIvbmV0L2NvcmUvZmlsdGVyLmMKaW5kZXggZjZiZGMyYi4uYjY2OWU3NSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZmlsdGVyLmMKKysrIGIvbmV0L2NvcmUvZmlsdGVyLmMKQEAgLTE1MCwxMCArMTUwLDYyIEBACiAJcmV0dXJuIHByYW5kb21fdTMyKCk7CiB9CiAKK3N0YXRpYyB1MzIgY29udmVydF9za2JfYWNjZXNzKGludCBza2JfZmllbGQsIGludCBkc3RfcmVnLCBpbnQgc3JjX3JlZywKKwkJCSAgICAgIHN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpCit7CisJc3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7CisKKwlzd2l0Y2ggKHNrYl9maWVsZCkgeworCWNhc2UgU0tGX0FEX01BUks6CisJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIG1hcmspICE9IDQpOworCisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfVywgZHN0X3JlZywgc3JjX3JlZywKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgbWFyaykpOworCQlicmVhazsKKworCWNhc2UgU0tGX0FEX1BLVFRZUEU6CisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfQiwgZHN0X3JlZywgc3JjX3JlZywgUEtUX1RZUEVfT0ZGU0VUKCkpOworCQkqaW5zbisrID0gQlBGX0FMVTMyX0lNTShCUEZfQU5ELCBkc3RfcmVnLCBQS1RfVFlQRV9NQVgpOworI2lmZGVmIF9fQklHX0VORElBTl9CSVRGSUVMRAorCQkqaW5zbisrID0gQlBGX0FMVTMyX0lNTShCUEZfUlNILCBkc3RfcmVnLCA1KTsKKyNlbmRpZgorCQlicmVhazsKKworCWNhc2UgU0tGX0FEX1FVRVVFOgorCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBxdWV1ZV9tYXBwaW5nKSAhPSAyKTsKKworCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0gsIGRzdF9yZWcsIHNyY19yZWcsCisJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIHF1ZXVlX21hcHBpbmcpKTsKKwkJYnJlYWs7CisKKwljYXNlIFNLRl9BRF9WTEFOX1RBRzoKKwljYXNlIFNLRl9BRF9WTEFOX1RBR19QUkVTRU5UOgorCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCB2bGFuX3RjaSkgIT0gMik7CisJCUJVSUxEX0JVR19PTihWTEFOX1RBR19QUkVTRU5UICE9IDB4MTAwMCk7CisKKwkJLyogZHN0X3JlZyA9ICoodTE2ICopIChzcmNfcmVnICsgb2Zmc2V0b2Yodmxhbl90Y2kpKSAqLworCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0gsIGRzdF9yZWcsIHNyY19yZWcsCisJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIHZsYW5fdGNpKSk7CisJCWlmIChza2JfZmllbGQgPT0gU0tGX0FEX1ZMQU5fVEFHKSB7CisJCQkqaW5zbisrID0gQlBGX0FMVTMyX0lNTShCUEZfQU5ELCBkc3RfcmVnLAorCQkJCQkJflZMQU5fVEFHX1BSRVNFTlQpOworCQl9IGVsc2UgeworCQkJLyogZHN0X3JlZyA+Pj0gMTIgKi8KKwkJCSppbnNuKysgPSBCUEZfQUxVMzJfSU1NKEJQRl9SU0gsIGRzdF9yZWcsIDEyKTsKKwkJCS8qIGRzdF9yZWcgJj0gMSAqLworCQkJKmluc24rKyA9IEJQRl9BTFUzMl9JTU0oQlBGX0FORCwgZHN0X3JlZywgMSk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGluc24gLSBpbnNuX2J1ZjsKK30KKwogc3RhdGljIGJvb2wgY29udmVydF9icGZfZXh0ZW5zaW9ucyhzdHJ1Y3Qgc29ja19maWx0ZXIgKmZwLAogCQkJCSAgIHN0cnVjdCBicGZfaW5zbiAqKmluc25wKQogewogCXN0cnVjdCBicGZfaW5zbiAqaW5zbiA9ICppbnNucDsKKwl1MzIgY250OwogCiAJc3dpdGNoIChmcC0+aykgewogCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9QUk9UT0NPTDoKQEAgLTE2NywxMyArMjE5LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfUEtUVFlQRToKLQkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9CLCBCUEZfUkVHX0EsIEJQRl9SRUdfQ1RYLAotCQkJCSAgICAgIFBLVF9UWVBFX09GRlNFVCgpKTsKLQkJKmluc24gPSBCUEZfQUxVMzJfSU1NKEJQRl9BTkQsIEJQRl9SRUdfQSwgUEtUX1RZUEVfTUFYKTsKLSNpZmRlZiBfX0JJR19FTkRJQU5fQklURklFTEQKLQkJaW5zbisrOwotICAgICAgICAgICAgICAgICppbnNuID0gQlBGX0FMVTMyX0lNTShCUEZfUlNILCBCUEZfUkVHX0EsIDUpOwotI2VuZGlmCisJCWNudCA9IGNvbnZlcnRfc2tiX2FjY2VzcyhTS0ZfQURfUEtUVFlQRSwgQlBGX1JFR19BLCBCUEZfUkVHX0NUWCwgaW5zbik7CisJCWluc24gKz0gY250IC0gMTsKIAkJYnJlYWs7CiAKIAljYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfSUZJTkRFWDoKQEAgLTE5NywxMCArMjQ0LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfTUFSSzoKLQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgbWFyaykgIT0gNCk7Ci0KLQkJKmluc24gPSBCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR19BLCBCUEZfUkVHX0NUWCwKLQkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIG1hcmspKTsKKwkJY250ID0gY29udmVydF9za2JfYWNjZXNzKFNLRl9BRF9NQVJLLCBCUEZfUkVHX0EsIEJQRl9SRUdfQ1RYLCBpbnNuKTsKKwkJaW5zbiArPSBjbnQgLSAxOwogCQlicmVhazsKIAogCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9SWEhBU0g6CkBAIC0yMTEsMjkgKzI1NiwzMCBAQAogCQlicmVhazsKIAogCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9RVUVVRToKLQkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgcXVldWVfbWFwcGluZykgIT0gMik7Ci0KLQkJKmluc24gPSBCUEZfTERYX01FTShCUEZfSCwgQlBGX1JFR19BLCBCUEZfUkVHX0NUWCwKLQkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIHF1ZXVlX21hcHBpbmcpKTsKKwkJY250ID0gY29udmVydF9za2JfYWNjZXNzKFNLRl9BRF9RVUVVRSwgQlBGX1JFR19BLCBCUEZfUkVHX0NUWCwgaW5zbik7CisJCWluc24gKz0gY250IC0gMTsKIAkJYnJlYWs7CiAKIAljYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfVkxBTl9UQUc6Ci0JY2FzZSBTS0ZfQURfT0ZGICsgU0tGX0FEX1ZMQU5fVEFHX1BSRVNFTlQ6Ci0JCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIHZsYW5fdGNpKSAhPSAyKTsKLQkJQlVJTERfQlVHX09OKFZMQU5fVEFHX1BSRVNFTlQgIT0gMHgxMDAwKTsKKwkJY250ID0gY29udmVydF9za2JfYWNjZXNzKFNLRl9BRF9WTEFOX1RBRywKKwkJCQkJIEJQRl9SRUdfQSwgQlBGX1JFR19DVFgsIGluc24pOworCQlpbnNuICs9IGNudCAtIDE7CisJCWJyZWFrOwogCi0JCS8qIEEgPSAqKHUxNiAqKSAoQ1RYICsgb2Zmc2V0b2Yodmxhbl90Y2kpKSAqLworCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9WTEFOX1RBR19QUkVTRU5UOgorCQljbnQgPSBjb252ZXJ0X3NrYl9hY2Nlc3MoU0tGX0FEX1ZMQU5fVEFHX1BSRVNFTlQsCisJCQkJCSBCUEZfUkVHX0EsIEJQRl9SRUdfQ1RYLCBpbnNuKTsKKwkJaW5zbiArPSBjbnQgLSAxOworCQlicmVhazsKKworCWNhc2UgU0tGX0FEX09GRiArIFNLRl9BRF9WTEFOX1RQSUQ6CisJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIHZsYW5fcHJvdG8pICE9IDIpOworCisJCS8qIEEgPSAqKHUxNiAqKSAoQ1RYICsgb2Zmc2V0b2Yodmxhbl9wcm90bykpICovCiAJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfSCwgQlBGX1JFR19BLCBCUEZfUkVHX0NUWCwKLQkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgdmxhbl90Y2kpKTsKLQkJaWYgKGZwLT5rID09IFNLRl9BRF9PRkYgKyBTS0ZfQURfVkxBTl9UQUcpIHsKLQkJCSppbnNuID0gQlBGX0FMVTMyX0lNTShCUEZfQU5ELCBCUEZfUkVHX0EsCi0JCQkJCSAgICAgIH5WTEFOX1RBR19QUkVTRU5UKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEEgPj49IDEyICovCi0JCQkqaW5zbisrID0gQlBGX0FMVTMyX0lNTShCUEZfUlNILCBCUEZfUkVHX0EsIDEyKTsKLQkJCS8qIEEgJj0gMSAqLwotCQkJKmluc24gPSBCUEZfQUxVMzJfSU1NKEJQRl9BTkQsIEJQRl9SRUdfQSwgMSk7Ci0JCX0KKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgdmxhbl9wcm90bykpOworCQkvKiBBID0gbnRvaHMoQSkgW2VtaXR0aW5nIGEgbm9wIG9yIHN3YXAxNl0gKi8KKwkJKmluc24gPSBCUEZfRU5ESUFOKEJQRl9GUk9NX0JFLCBCUEZfUkVHX0EsIDE2KTsKIAkJYnJlYWs7CiAKIAljYXNlIFNLRl9BRF9PRkYgKyBTS0ZfQURfUEFZX09GRlNFVDoKQEAgLTgxNCw3ICs4NjAsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2JwZl9wcm9nX3JlbGVhc2Uoc3RydWN0IGJwZl9wcm9nICpwcm9nKQogewotCWlmIChwcm9nLT5hdXgtPnByb2dfdHlwZSA9PSBCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIpIHsKKwlpZiAocHJvZy0+dHlwZSA9PSBCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIpIHsKIAkJYnBmX3Byb2dfcHV0KHByb2cpOwogCX0gZWxzZSB7CiAJCWJwZl9yZWxlYXNlX29yaWdfZmlsdGVyKHByb2cpOwpAQCAtMTAxOSw2ICsxMDY1LDMyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChicGZfcHJvZ19kZXN0cm95KTsKIAorc3RhdGljIGludCBfX3NrX2F0dGFjaF9wcm9nKHN0cnVjdCBicGZfcHJvZyAqcHJvZywgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19maWx0ZXIgKmZwLCAqb2xkX2ZwOworCisJZnAgPSBrbWFsbG9jKHNpemVvZigqZnApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZwLT5wcm9nID0gcHJvZzsKKwlhdG9taWNfc2V0KCZmcC0+cmVmY250LCAwKTsKKworCWlmICghc2tfZmlsdGVyX2NoYXJnZShzaywgZnApKSB7CisJCWtmcmVlKGZwKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJb2xkX2ZwID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzay0+c2tfZmlsdGVyLAorCQkJCQkgICBzb2NrX293bmVkX2J5X3VzZXIoc2spKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoc2stPnNrX2ZpbHRlciwgZnApOworCisJaWYgKG9sZF9mcCkKKwkJc2tfZmlsdGVyX3VuY2hhcmdlKHNrLCBvbGRfZnApOworCisJcmV0dXJuIDA7Cit9CisKIC8qKgogICoJc2tfYXR0YWNoX2ZpbHRlciAtIGF0dGFjaCBhIHNvY2tldCBmaWx0ZXIKICAqCUBmcHJvZzogdGhlIGZpbHRlciBwcm9ncmFtCkBAIC0xMDMxLDcgKzExMDMsNiBAQAogICovCiBpbnQgc2tfYXR0YWNoX2ZpbHRlcihzdHJ1Y3Qgc29ja19mcHJvZyAqZnByb2csIHN0cnVjdCBzb2NrICpzaykKIHsKLQlzdHJ1Y3Qgc2tfZmlsdGVyICpmcCwgKm9sZF9mcDsKIAl1bnNpZ25lZCBpbnQgZnNpemUgPSBicGZfY2xhc3NpY19wcm9nbGVuKGZwcm9nKTsKIAl1bnNpZ25lZCBpbnQgYnBmX2ZzaXplID0gYnBmX3Byb2dfc2l6ZShmcHJvZy0+bGVuKTsKIAlzdHJ1Y3QgYnBmX3Byb2cgKnByb2c7CkBAIC0xMDY4LDM2ICsxMTM5LDIwIEBACiAJaWYgKElTX0VSUihwcm9nKSkKIAkJcmV0dXJuIFBUUl9FUlIocHJvZyk7CiAKLQlmcCA9IGttYWxsb2Moc2l6ZW9mKCpmcCksIEdGUF9LRVJORUwpOwotCWlmICghZnApIHsKKwllcnIgPSBfX3NrX2F0dGFjaF9wcm9nKHByb2csIHNrKTsKKwlpZiAoZXJyIDwgMCkgewogCQlfX2JwZl9wcm9nX3JlbGVhc2UocHJvZyk7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyZXR1cm4gZXJyOwogCX0KLQlmcC0+cHJvZyA9IHByb2c7Ci0KLQlhdG9taWNfc2V0KCZmcC0+cmVmY250LCAwKTsKLQotCWlmICghc2tfZmlsdGVyX2NoYXJnZShzaywgZnApKSB7Ci0JCV9fc2tfZmlsdGVyX3JlbGVhc2UoZnApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlvbGRfZnAgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHNrLT5za19maWx0ZXIsCi0JCQkJCSAgIHNvY2tfb3duZWRfYnlfdXNlcihzaykpOwotCXJjdV9hc3NpZ25fcG9pbnRlcihzay0+c2tfZmlsdGVyLCBmcCk7Ci0KLQlpZiAob2xkX2ZwKQotCQlza19maWx0ZXJfdW5jaGFyZ2Uoc2ssIG9sZF9mcCk7CiAKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNrX2F0dGFjaF9maWx0ZXIpOwogCi0jaWZkZWYgQ09ORklHX0JQRl9TWVNDQUxMCiBpbnQgc2tfYXR0YWNoX2JwZih1MzIgdWZkLCBzdHJ1Y3Qgc29jayAqc2spCiB7Ci0Jc3RydWN0IHNrX2ZpbHRlciAqZnAsICpvbGRfZnA7CiAJc3RydWN0IGJwZl9wcm9nICpwcm9nOworCWludCBlcnI7CiAKIAlpZiAoc29ja19mbGFnKHNrLCBTT0NLX0ZJTFRFUl9MT0NLRUQpKQogCQlyZXR1cm4gLUVQRVJNOwpAQCAtMTEwNiw0MCArMTE2MSwxNjggQEAKIAlpZiAoSVNfRVJSKHByb2cpKQogCQlyZXR1cm4gUFRSX0VSUihwcm9nKTsKIAotCWlmIChwcm9nLT5hdXgtPnByb2dfdHlwZSAhPSBCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIpIHsKLQkJLyogdmFsaWQgZmQsIGJ1dCBpbnZhbGlkIHByb2dyYW0gdHlwZSAqLworCWlmIChwcm9nLT50eXBlICE9IEJQRl9QUk9HX1RZUEVfU09DS0VUX0ZJTFRFUikgewogCQlicGZfcHJvZ19wdXQocHJvZyk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWZwID0ga21hbGxvYyhzaXplb2YoKmZwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFmcCkgeworCWVyciA9IF9fc2tfYXR0YWNoX3Byb2cocHJvZywgc2spOworCWlmIChlcnIgPCAwKSB7CiAJCWJwZl9wcm9nX3B1dChwcm9nKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldHVybiBlcnI7CiAJfQotCWZwLT5wcm9nID0gcHJvZzsKLQotCWF0b21pY19zZXQoJmZwLT5yZWZjbnQsIDApOwotCi0JaWYgKCFza19maWx0ZXJfY2hhcmdlKHNrLCBmcCkpIHsKLQkJX19za19maWx0ZXJfcmVsZWFzZShmcCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCW9sZF9mcCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2stPnNrX2ZpbHRlciwKLQkJCQkJICAgc29ja19vd25lZF9ieV91c2VyKHNrKSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKHNrLT5za19maWx0ZXIsIGZwKTsKLQotCWlmIChvbGRfZnApCi0JCXNrX2ZpbHRlcl91bmNoYXJnZShzaywgb2xkX2ZwKTsKIAogCXJldHVybiAwOwogfQogCi0vKiBhbGxvdyBzb2NrZXQgZmlsdGVycyB0byBjYWxsCi0gKiBicGZfbWFwX2xvb2t1cF9lbGVtKCksIGJwZl9tYXBfdXBkYXRlX2VsZW0oKSwgYnBmX21hcF9kZWxldGVfZWxlbSgpCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gKnNvY2tfZmlsdGVyX2Z1bmNfcHJvdG8oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkKQorI2RlZmluZSBCUEZfUkVDT01QVVRFX0NTVU0oZmxhZ3MpCSgoZmxhZ3MpICYgMSkKKworc3RhdGljIHU2NCBicGZfc2tiX3N0b3JlX2J5dGVzKHU2NCByMSwgdTY0IHIyLCB1NjQgcjMsIHU2NCByNCwgdTY0IGZsYWdzKQoreworCXN0cnVjdCBza19idWZmICpza2IgPSAoc3RydWN0IHNrX2J1ZmYgKikgKGxvbmcpIHIxOworCXVuc2lnbmVkIGludCBvZmZzZXQgPSAodW5zaWduZWQgaW50KSByMjsKKwl2b2lkICpmcm9tID0gKHZvaWQgKikgKGxvbmcpIHIzOworCXVuc2lnbmVkIGludCBsZW4gPSAodW5zaWduZWQgaW50KSByNDsKKwljaGFyIGJ1ZlsxNl07CisJdm9pZCAqcHRyOworCisJLyogYnBmIHZlcmlmaWVyIGd1YXJhbnRlZXMgdGhhdDoKKwkgKiAnZnJvbScgcG9pbnRlciBwb2ludHMgdG8gYnBmIHByb2dyYW0gc3RhY2sKKwkgKiAnbGVuJyBieXRlcyBvZiBpdCB3ZXJlIGluaXRpYWxpemVkCisJICogJ2xlbicgPiAwCisJICogJ3NrYicgaXMgYSB2YWxpZCBwb2ludGVyIHRvICdzdHJ1Y3Qgc2tfYnVmZicKKwkgKgorCSAqIHNvIGNoZWNrIGZvciBpbnZhbGlkICdvZmZzZXQnIGFuZCB0b28gbGFyZ2UgJ2xlbicKKwkgKi8KKwlpZiAodW5saWtlbHkob2Zmc2V0ID4gMHhmZmZmIHx8IGxlbiA+IHNpemVvZihidWYpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoc2tiX2Nsb25lZChza2IpICYmICFza2JfY2xvbmVfd3JpdGFibGUoc2tiLCBvZmZzZXQgKyBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXB0ciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgbGVuLCBidWYpOworCWlmICh1bmxpa2VseSghcHRyKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoQlBGX1JFQ09NUFVURV9DU1VNKGZsYWdzKSkKKwkJc2tiX3Bvc3RwdWxsX3Jjc3VtKHNrYiwgcHRyLCBsZW4pOworCisJbWVtY3B5KHB0ciwgZnJvbSwgbGVuKTsKKworCWlmIChwdHIgPT0gYnVmKQorCQkvKiBza2Jfc3RvcmVfYml0cyBjYW5ub3QgcmV0dXJuIC1FRkFVTFQgaGVyZSAqLworCQlza2Jfc3RvcmVfYml0cyhza2IsIG9mZnNldCwgcHRyLCBsZW4pOworCisJaWYgKEJQRl9SRUNPTVBVVEVfQ1NVTShmbGFncykgJiYgc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCisJCXNrYi0+Y3N1bSA9IGNzdW1fYWRkKHNrYi0+Y3N1bSwgY3N1bV9wYXJ0aWFsKHB0ciwgbGVuLCAwKSk7CisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfc2tiX3N0b3JlX2J5dGVzX3Byb3RvID0geworCS5mdW5jCQk9IGJwZl9za2Jfc3RvcmVfYnl0ZXMsCisJLmdwbF9vbmx5CT0gZmFsc2UsCisJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCisJLmFyZzFfdHlwZQk9IEFSR19QVFJfVE9fQ1RYLAorCS5hcmcyX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCisJLmFyZzNfdHlwZQk9IEFSR19QVFJfVE9fU1RBQ0ssCisJLmFyZzRfdHlwZQk9IEFSR19DT05TVF9TVEFDS19TSVpFLAorCS5hcmc1X3R5cGUJPSBBUkdfQU5ZVEhJTkcsCit9OworCisjZGVmaW5lIEJQRl9IRUFERVJfRklFTERfU0laRShmbGFncykJKChmbGFncykgJiAweDBmKQorI2RlZmluZSBCUEZfSVNfUFNFVURPX0hFQURFUihmbGFncykJKChmbGFncykgJiAweDEwKQorCitzdGF0aWMgdTY0IGJwZl9sM19jc3VtX3JlcGxhY2UodTY0IHIxLCB1NjQgb2Zmc2V0LCB1NjQgZnJvbSwgdTY0IHRvLCB1NjQgZmxhZ3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7CisJX19zdW0xNiBzdW0sICpwdHI7CisKKwlpZiAodW5saWtlbHkob2Zmc2V0ID4gMHhmZmZmKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoc2tiX2Nsb25lZChza2IpICYmICFza2JfY2xvbmVfd3JpdGFibGUoc2tiLCBvZmZzZXQgKyBzaXplb2Yoc3VtKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJcHRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgb2Zmc2V0LCBzaXplb2Yoc3VtKSwgJnN1bSk7CisJaWYgKHVubGlrZWx5KCFwdHIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoQlBGX0hFQURFUl9GSUVMRF9TSVpFKGZsYWdzKSkgeworCWNhc2UgMjoKKwkJY3N1bV9yZXBsYWNlMihwdHIsIGZyb20sIHRvKTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQljc3VtX3JlcGxhY2U0KHB0ciwgZnJvbSwgdG8pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocHRyID09ICZzdW0pCisJCS8qIHNrYl9zdG9yZV9iaXRzIGd1YXJhbnRlZWQgdG8gbm90IHJldHVybiAtRUZBVUxUIGhlcmUgKi8KKwkJc2tiX3N0b3JlX2JpdHMoc2tiLCBvZmZzZXQsIHB0ciwgc2l6ZW9mKHN1bSkpOworCisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0cnVjdCBicGZfZnVuY19wcm90byBicGZfbDNfY3N1bV9yZXBsYWNlX3Byb3RvID0geworCS5mdW5jCQk9IGJwZl9sM19jc3VtX3JlcGxhY2UsCisJLmdwbF9vbmx5CT0gZmFsc2UsCisJLnJldF90eXBlCT0gUkVUX0lOVEVHRVIsCisJLmFyZzFfdHlwZQk9IEFSR19QVFJfVE9fQ1RYLAorCS5hcmcyX3R5cGUJPSBBUkdfQU5ZVEhJTkcsCisJLmFyZzNfdHlwZQk9IEFSR19BTllUSElORywKKwkuYXJnNF90eXBlCT0gQVJHX0FOWVRISU5HLAorCS5hcmc1X3R5cGUJPSBBUkdfQU5ZVEhJTkcsCit9OworCitzdGF0aWMgdTY0IGJwZl9sNF9jc3VtX3JlcGxhY2UodTY0IHIxLCB1NjQgb2Zmc2V0LCB1NjQgZnJvbSwgdTY0IHRvLCB1NjQgZmxhZ3MpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IChzdHJ1Y3Qgc2tfYnVmZiAqKSAobG9uZykgcjE7CisJdTMyIGlzX3BzZXVkbyA9IEJQRl9JU19QU0VVRE9fSEVBREVSKGZsYWdzKTsKKwlfX3N1bTE2IHN1bSwgKnB0cjsKKworCWlmICh1bmxpa2VseShvZmZzZXQgPiAweGZmZmYpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChza2JfY2xvbmVkKHNrYikgJiYgIXNrYl9jbG9uZV93cml0YWJsZShza2IsIG9mZnNldCArIHNpemVvZihzdW0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlwdHIgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBvZmZzZXQsIHNpemVvZihzdW0pLCAmc3VtKTsKKwlpZiAodW5saWtlbHkoIXB0cikpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChCUEZfSEVBREVSX0ZJRUxEX1NJWkUoZmxhZ3MpKSB7CisJY2FzZSAyOgorCQlpbmV0X3Byb3RvX2NzdW1fcmVwbGFjZTIocHRyLCBza2IsIGZyb20sIHRvLCBpc19wc2V1ZG8pOworCQlicmVhazsKKwljYXNlIDQ6CisJCWluZXRfcHJvdG9fY3N1bV9yZXBsYWNlNChwdHIsIHNrYiwgZnJvbSwgdG8sIGlzX3BzZXVkbyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwdHIgPT0gJnN1bSkKKwkJLyogc2tiX3N0b3JlX2JpdHMgZ3VhcmFudGVlZCB0byBub3QgcmV0dXJuIC1FRkFVTFQgaGVyZSAqLworCQlza2Jfc3RvcmVfYml0cyhza2IsIG9mZnNldCwgcHRyLCBzaXplb2Yoc3VtKSk7CisKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IGJwZl9mdW5jX3Byb3RvIGJwZl9sNF9jc3VtX3JlcGxhY2VfcHJvdG8gPSB7CisJLmZ1bmMJCT0gYnBmX2w0X2NzdW1fcmVwbGFjZSwKKwkuZ3BsX29ubHkJPSBmYWxzZSwKKwkucmV0X3R5cGUJPSBSRVRfSU5URUdFUiwKKwkuYXJnMV90eXBlCT0gQVJHX1BUUl9UT19DVFgsCisJLmFyZzJfdHlwZQk9IEFSR19BTllUSElORywKKwkuYXJnM190eXBlCT0gQVJHX0FOWVRISU5HLAorCS5hcmc0X3R5cGUJPSBBUkdfQU5ZVEhJTkcsCisJLmFyZzVfdHlwZQk9IEFSR19BTllUSElORywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gKgorc2tfZmlsdGVyX2Z1bmNfcHJvdG8oZW51bSBicGZfZnVuY19pZCBmdW5jX2lkKQogewogCXN3aXRjaCAoZnVuY19pZCkgewogCWNhc2UgQlBGX0ZVTkNfbWFwX2xvb2t1cF9lbGVtOgpAQCAtMTE0OCwzOSArMTMzMSwxNDQgQEAKIAkJcmV0dXJuICZicGZfbWFwX3VwZGF0ZV9lbGVtX3Byb3RvOwogCWNhc2UgQlBGX0ZVTkNfbWFwX2RlbGV0ZV9lbGVtOgogCQlyZXR1cm4gJmJwZl9tYXBfZGVsZXRlX2VsZW1fcHJvdG87CisJY2FzZSBCUEZfRlVOQ19nZXRfcHJhbmRvbV91MzI6CisJCXJldHVybiAmYnBmX2dldF9wcmFuZG9tX3UzMl9wcm90bzsKKwljYXNlIEJQRl9GVU5DX2dldF9zbXBfcHJvY2Vzc29yX2lkOgorCQlyZXR1cm4gJmJwZl9nZXRfc21wX3Byb2Nlc3Nvcl9pZF9wcm90bzsKIAlkZWZhdWx0OgogCQlyZXR1cm4gTlVMTDsKIAl9CiB9CiAKLXN0YXRpYyBib29sIHNvY2tfZmlsdGVyX2lzX3ZhbGlkX2FjY2VzcyhpbnQgb2ZmLCBpbnQgc2l6ZSwgZW51bSBicGZfYWNjZXNzX3R5cGUgdHlwZSkKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnBmX2Z1bmNfcHJvdG8gKgordGNfY2xzX2FjdF9mdW5jX3Byb3RvKGVudW0gYnBmX2Z1bmNfaWQgZnVuY19pZCkKIHsKLQkvKiBza2IgZmllbGRzIGNhbm5vdCBiZSBhY2Nlc3NlZCB5ZXQgKi8KLQlyZXR1cm4gZmFsc2U7CisJc3dpdGNoIChmdW5jX2lkKSB7CisJY2FzZSBCUEZfRlVOQ19za2Jfc3RvcmVfYnl0ZXM6CisJCXJldHVybiAmYnBmX3NrYl9zdG9yZV9ieXRlc19wcm90bzsKKwljYXNlIEJQRl9GVU5DX2wzX2NzdW1fcmVwbGFjZToKKwkJcmV0dXJuICZicGZfbDNfY3N1bV9yZXBsYWNlX3Byb3RvOworCWNhc2UgQlBGX0ZVTkNfbDRfY3N1bV9yZXBsYWNlOgorCQlyZXR1cm4gJmJwZl9sNF9jc3VtX3JlcGxhY2VfcHJvdG87CisJZGVmYXVsdDoKKwkJcmV0dXJuIHNrX2ZpbHRlcl9mdW5jX3Byb3RvKGZ1bmNfaWQpOworCX0KIH0KIAotc3RhdGljIHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIHNvY2tfZmlsdGVyX29wcyA9IHsKLQkuZ2V0X2Z1bmNfcHJvdG8gPSBzb2NrX2ZpbHRlcl9mdW5jX3Byb3RvLAotCS5pc192YWxpZF9hY2Nlc3MgPSBzb2NrX2ZpbHRlcl9pc192YWxpZF9hY2Nlc3MsCitzdGF0aWMgYm9vbCBza19maWx0ZXJfaXNfdmFsaWRfYWNjZXNzKGludCBvZmYsIGludCBzaXplLAorCQkJCSAgICAgIGVudW0gYnBmX2FjY2Vzc190eXBlIHR5cGUpCit7CisJLyogb25seSByZWFkIGlzIGFsbG93ZWQgKi8KKwlpZiAodHlwZSAhPSBCUEZfUkVBRCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogY2hlY2sgYm91bmRzICovCisJaWYgKG9mZiA8IDAgfHwgb2ZmID49IHNpemVvZihzdHJ1Y3QgX19za19idWZmKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogZGlzYWxsb3cgbWlzYWxpZ25lZCBhY2Nlc3MgKi8KKwlpZiAob2ZmICUgc2l6ZSAhPSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBhbGwgX19za19idWZmIGZpZWxkcyBhcmUgX191MzIgKi8KKwlpZiAoc2l6ZSAhPSA0KQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHUzMiBza19maWx0ZXJfY29udmVydF9jdHhfYWNjZXNzKGludCBkc3RfcmVnLCBpbnQgc3JjX3JlZywgaW50IGN0eF9vZmYsCisJCQkJCXN0cnVjdCBicGZfaW5zbiAqaW5zbl9idWYpCit7CisJc3RydWN0IGJwZl9pbnNuICppbnNuID0gaW5zbl9idWY7CisKKwlzd2l0Y2ggKGN0eF9vZmYpIHsKKwljYXNlIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIGxlbik6CisJCUJVSUxEX0JVR19PTihGSUVMRF9TSVpFT0Yoc3RydWN0IHNrX2J1ZmYsIGxlbikgIT0gNCk7CisKKwkJKmluc24rKyA9IEJQRl9MRFhfTUVNKEJQRl9XLCBkc3RfcmVnLCBzcmNfcmVnLAorCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBza19idWZmLCBsZW4pKTsKKwkJYnJlYWs7CisKKwljYXNlIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIHByb3RvY29sKToKKwkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgcHJvdG9jb2wpICE9IDIpOworCisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfSCwgZHN0X3JlZywgc3JjX3JlZywKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgcHJvdG9jb2wpKTsKKwkJYnJlYWs7CisKKwljYXNlIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIHZsYW5fcHJvdG8pOgorCQlCVUlMRF9CVUdfT04oRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCB2bGFuX3Byb3RvKSAhPSAyKTsKKworCQkqaW5zbisrID0gQlBGX0xEWF9NRU0oQlBGX0gsIGRzdF9yZWcsIHNyY19yZWcsCisJCQkJICAgICAgb2Zmc2V0b2Yoc3RydWN0IHNrX2J1ZmYsIHZsYW5fcHJvdG8pKTsKKwkJYnJlYWs7CisKKwljYXNlIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIHByaW9yaXR5KToKKwkJQlVJTERfQlVHX09OKEZJRUxEX1NJWkVPRihzdHJ1Y3Qgc2tfYnVmZiwgcHJpb3JpdHkpICE9IDQpOworCisJCSppbnNuKysgPSBCUEZfTERYX01FTShCUEZfVywgZHN0X3JlZywgc3JjX3JlZywKKwkJCQkgICAgICBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgcHJpb3JpdHkpKTsKKwkJYnJlYWs7CisKKwljYXNlIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIG1hcmspOgorCQlyZXR1cm4gY29udmVydF9za2JfYWNjZXNzKFNLRl9BRF9NQVJLLCBkc3RfcmVnLCBzcmNfcmVnLCBpbnNuKTsKKworCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgcGt0X3R5cGUpOgorCQlyZXR1cm4gY29udmVydF9za2JfYWNjZXNzKFNLRl9BRF9QS1RUWVBFLCBkc3RfcmVnLCBzcmNfcmVnLCBpbnNuKTsKKworCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgcXVldWVfbWFwcGluZyk6CisJCXJldHVybiBjb252ZXJ0X3NrYl9hY2Nlc3MoU0tGX0FEX1FVRVVFLCBkc3RfcmVnLCBzcmNfcmVnLCBpbnNuKTsKKworCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgdmxhbl9wcmVzZW50KToKKwkJcmV0dXJuIGNvbnZlcnRfc2tiX2FjY2VzcyhTS0ZfQURfVkxBTl9UQUdfUFJFU0VOVCwKKwkJCQkJICBkc3RfcmVnLCBzcmNfcmVnLCBpbnNuKTsKKworCWNhc2Ugb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgdmxhbl90Y2kpOgorCQlyZXR1cm4gY29udmVydF9za2JfYWNjZXNzKFNLRl9BRF9WTEFOX1RBRywKKwkJCQkJICBkc3RfcmVnLCBzcmNfcmVnLCBpbnNuKTsKKwl9CisKKwlyZXR1cm4gaW5zbiAtIGluc25fYnVmOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJwZl92ZXJpZmllcl9vcHMgc2tfZmlsdGVyX29wcyA9IHsKKwkuZ2V0X2Z1bmNfcHJvdG8gPSBza19maWx0ZXJfZnVuY19wcm90bywKKwkuaXNfdmFsaWRfYWNjZXNzID0gc2tfZmlsdGVyX2lzX3ZhbGlkX2FjY2VzcywKKwkuY29udmVydF9jdHhfYWNjZXNzID0gc2tfZmlsdGVyX2NvbnZlcnRfY3R4X2FjY2VzcywKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgYnBmX3Byb2dfdHlwZV9saXN0IHRsID0gewotCS5vcHMgPSAmc29ja19maWx0ZXJfb3BzLAorc3RhdGljIGNvbnN0IHN0cnVjdCBicGZfdmVyaWZpZXJfb3BzIHRjX2Nsc19hY3Rfb3BzID0geworCS5nZXRfZnVuY19wcm90byA9IHRjX2Nsc19hY3RfZnVuY19wcm90bywKKwkuaXNfdmFsaWRfYWNjZXNzID0gc2tfZmlsdGVyX2lzX3ZhbGlkX2FjY2VzcywKKwkuY29udmVydF9jdHhfYWNjZXNzID0gc2tfZmlsdGVyX2NvbnZlcnRfY3R4X2FjY2VzcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnBmX3Byb2dfdHlwZV9saXN0IHNrX2ZpbHRlcl90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CisJLm9wcyA9ICZza19maWx0ZXJfb3BzLAogCS50eXBlID0gQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcmVnaXN0ZXJfc29ja19maWx0ZXJfb3BzKHZvaWQpCitzdGF0aWMgc3RydWN0IGJwZl9wcm9nX3R5cGVfbGlzdCBzY2hlZF9jbHNfdHlwZSBfX3JlYWRfbW9zdGx5ID0geworCS5vcHMgPSAmdGNfY2xzX2FjdF9vcHMsCisJLnR5cGUgPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUywKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnBmX3Byb2dfdHlwZV9saXN0IHNjaGVkX2FjdF90eXBlIF9fcmVhZF9tb3N0bHkgPSB7CisJLm9wcyA9ICZ0Y19jbHNfYWN0X29wcywKKwkudHlwZSA9IEJQRl9QUk9HX1RZUEVfU0NIRURfQUNULAorfTsKKworc3RhdGljIGludCBfX2luaXQgcmVnaXN0ZXJfc2tfZmlsdGVyX29wcyh2b2lkKQogewotCWJwZl9yZWdpc3Rlcl9wcm9nX3R5cGUoJnRsKTsKKwlicGZfcmVnaXN0ZXJfcHJvZ190eXBlKCZza19maWx0ZXJfdHlwZSk7CisJYnBmX3JlZ2lzdGVyX3Byb2dfdHlwZSgmc2NoZWRfY2xzX3R5cGUpOworCWJwZl9yZWdpc3Rlcl9wcm9nX3R5cGUoJnNjaGVkX2FjdF90eXBlKTsKKwogCXJldHVybiAwOwogfQotbGF0ZV9pbml0Y2FsbChyZWdpc3Rlcl9zb2NrX2ZpbHRlcl9vcHMpOwotI2Vsc2UKLWludCBza19hdHRhY2hfYnBmKHUzMiB1ZmQsIHN0cnVjdCBzb2NrICpzaykKLXsKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0jZW5kaWYKK2xhdGVfaW5pdGNhbGwocmVnaXN0ZXJfc2tfZmlsdGVyX29wcyk7CisKIGludCBza19kZXRhY2hfZmlsdGVyKHN0cnVjdCBzb2NrICpzaykKIHsKIAlpbnQgcmV0ID0gLUVOT0VOVDsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2xpbmtfd2F0Y2guYyBiL25ldC9jb3JlL2xpbmtfd2F0Y2guYwppbmRleCA0OWE5ZTNlLi45ODI4NjE2IDEwMDY0NAotLS0gYS9uZXQvY29yZS9saW5rX3dhdGNoLmMKKysrIGIvbmV0L2NvcmUvbGlua193YXRjaC5jCkBAIC00MCw3ICs0MCw3IEBACiBzdGF0aWMgdW5zaWduZWQgY2hhciBkZWZhdWx0X29wZXJzdGF0ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWlmICghbmV0aWZfY2Fycmllcl9vayhkZXYpKQotCQlyZXR1cm4gKGRldi0+aWZpbmRleCAhPSBkZXYtPmlmbGluayA/CisJCXJldHVybiAoZGV2LT5pZmluZGV4ICE9IGRldl9nZXRfaWZsaW5rKGRldikgPwogCQkJSUZfT1BFUl9MT1dFUkxBWUVSRE9XTiA6IElGX09QRVJfRE9XTik7CiAKIAlpZiAobmV0aWZfZG9ybWFudChkZXYpKQpAQCAtODksNyArODksNyBAQAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoZGV2LT5pZmluZGV4ICE9IGRldi0+aWZsaW5rKQorCWlmIChkZXYtPmlmaW5kZXggIT0gZGV2X2dldF9pZmxpbmsoZGV2KSkKIAkJcmV0dXJuIHRydWU7CiAKIAlpZiAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX1RFQU1fUE9SVCkKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25laWdoYm91ci5jIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKaW5kZXggNzBmZTllMS4uM2RlNjU0MiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmVpZ2hib3VyLmMKKysrIGIvbmV0L2NvcmUvbmVpZ2hib3VyLmMKQEAgLTM5NywyNSArMzk3LDE1IEBACiAJCQkgICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuOwotCWludCBrZXlfbGVuID0gdGJsLT5rZXlfbGVuOwotCXUzMiBoYXNoX3ZhbDsKLQlzdHJ1Y3QgbmVpZ2hfaGFzaF90YWJsZSAqbmh0OwogCiAJTkVJR0hfQ0FDSEVfU1RBVF9JTkModGJsLCBsb29rdXBzKTsKIAogCXJjdV9yZWFkX2xvY2tfYmgoKTsKLQluaHQgPSByY3VfZGVyZWZlcmVuY2VfYmgodGJsLT5uaHQpOwotCWhhc2hfdmFsID0gdGJsLT5oYXNoKHBrZXksIGRldiwgbmh0LT5oYXNoX3JuZCkgPj4gKDMyIC0gbmh0LT5oYXNoX3NoaWZ0KTsKLQotCWZvciAobiA9IHJjdV9kZXJlZmVyZW5jZV9iaChuaHQtPmhhc2hfYnVja2V0c1toYXNoX3ZhbF0pOwotCSAgICAgbiAhPSBOVUxMOwotCSAgICAgbiA9IHJjdV9kZXJlZmVyZW5jZV9iaChuLT5uZXh0KSkgewotCQlpZiAoZGV2ID09IG4tPmRldiAmJiAhbWVtY21wKG4tPnByaW1hcnlfa2V5LCBwa2V5LCBrZXlfbGVuKSkgewotCQkJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZuLT5yZWZjbnQpKQotCQkJCW4gPSBOVUxMOwotCQkJTkVJR0hfQ0FDSEVfU1RBVF9JTkModGJsLCBoaXRzKTsKLQkJCWJyZWFrOwotCQl9CisJbiA9IF9fbmVpZ2hfbG9va3VwX25vcmVmKHRibCwgcGtleSwgZGV2KTsKKwlpZiAobikgeworCQlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJm4tPnJlZmNudCkpCisJCQluID0gTlVMTDsKKwkJTkVJR0hfQ0FDSEVfU1RBVF9JTkModGJsLCBoaXRzKTsKIAl9CiAKIAlyY3VfcmVhZF91bmxvY2tfYmgoKTsKQEAgLTYwMSw3ICs1OTEsNyBAQAogCWlmICghbikKIAkJZ290byBvdXQ7CiAKLQl3cml0ZV9wbmV0KCZuLT5uZXQsIGhvbGRfbmV0KG5ldCkpOworCXdyaXRlX3BuZXQoJm4tPm5ldCwgbmV0KTsKIAltZW1jcHkobi0+a2V5LCBwa2V5LCBrZXlfbGVuKTsKIAluLT5kZXYgPSBkZXY7CiAJaWYgKGRldikKQEAgLTYxMCw3ICs2MDAsNiBAQAogCWlmICh0YmwtPnBjb25zdHJ1Y3RvciAmJiB0YmwtPnBjb25zdHJ1Y3RvcihuKSkgewogCQlpZiAoZGV2KQogCQkJZGV2X3B1dChkZXYpOwotCQlyZWxlYXNlX25ldChuZXQpOwogCQlrZnJlZShuKTsKIAkJbiA9IE5VTEw7CiAJCWdvdG8gb3V0OwpAQCAtNjQ0LDcgKzYzMyw2IEBACiAJCQkJdGJsLT5wZGVzdHJ1Y3RvcihuKTsKIAkJCWlmIChuLT5kZXYpCiAJCQkJZGV2X3B1dChuLT5kZXYpOwotCQkJcmVsZWFzZV9uZXQocG5laWdoX25ldChuKSk7CiAJCQlrZnJlZShuKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC02NjcsNyArNjU1LDYgQEAKIAkJCQkJdGJsLT5wZGVzdHJ1Y3RvcihuKTsKIAkJCQlpZiAobi0+ZGV2KQogCQkJCQlkZXZfcHV0KG4tPmRldik7Ci0JCQkJcmVsZWFzZV9uZXQocG5laWdoX25ldChuKSk7CiAJCQkJa2ZyZWUobik7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC04MzAsMTAgKzgxNyw5IEBACiBzdGF0aWMgX19pbmxpbmVfXyBpbnQgbmVpZ2hfbWF4X3Byb2JlcyhzdHJ1Y3QgbmVpZ2hib3VyICpuKQogewogCXN0cnVjdCBuZWlnaF9wYXJtcyAqcCA9IG4tPnBhcm1zOwotCWludCBtYXhfcHJvYmVzID0gTkVJR0hfVkFSKHAsIFVDQVNUX1BST0JFUykgKyBORUlHSF9WQVIocCwgQVBQX1BST0JFUyk7Ci0JaWYgKCEobi0+bnVkX3N0YXRlICYgTlVEX1BST0JFKSkKLQkJbWF4X3Byb2JlcyArPSBORUlHSF9WQVIocCwgTUNBU1RfUFJPQkVTKTsKLQlyZXR1cm4gbWF4X3Byb2JlczsKKwlyZXR1cm4gTkVJR0hfVkFSKHAsIFVDQVNUX1BST0JFUykgKyBORUlHSF9WQVIocCwgQVBQX1BST0JFUykgKworCSAgICAgICAobi0+bnVkX3N0YXRlICYgTlVEX1BST0JFID8gTkVJR0hfVkFSKHAsIE1DQVNUX1JFUFJPQkVTKSA6CisJICAgICAgICBORUlHSF9WQVIocCwgTUNBU1RfUFJPQkVTKSk7CiB9CiAKIHN0YXRpYyB2b2lkIG5laWdoX2ludmFsaWRhdGUoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gpCkBAIC0xMjYzLDEwICsxMjQ5LDEwIEBACiBFWFBPUlRfU1lNQk9MKG5laWdoX2V2ZW50X25zKTsKIAogLyogY2FsbGVkIHdpdGggcmVhZF9sb2NrX2JoKCZuLT5sb2NrKTsgKi8KLXN0YXRpYyB2b2lkIG5laWdoX2hoX2luaXQoc3RydWN0IG5laWdoYm91ciAqbiwgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQorc3RhdGljIHZvaWQgbmVpZ2hfaGhfaW5pdChzdHJ1Y3QgbmVpZ2hib3VyICpuKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkc3QtPmRldjsKLQlfX2JlMTYgcHJvdCA9IGRzdC0+b3BzLT5wcm90b2NvbDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbi0+ZGV2OworCV9fYmUxNiBwcm90ID0gbi0+dGJsLT5wcm90b2NvbDsKIAlzdHJ1Y3QgaGhfY2FjaGUJKmhoID0gJm4tPmhoOwogCiAJd3JpdGVfbG9ja19iaCgmbi0+bG9jayk7CkBAIC0xMjgwLDQzICsxMjY2LDE5IEBACiAJd3JpdGVfdW5sb2NrX2JoKCZuLT5sb2NrKTsKIH0KIAotLyogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiBjb250ZXh0cywgd2hlcmUgb25seSBvbGQgZGV2X3F1ZXVlX3htaXQKLSAqIHdvcmtlZCwgZi5lLiBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSBub3JtYWwgb3V0cHV0IHBhdGggKGVxbCwgc2hhcGVyKSwKLSAqIGJ1dCByZXNvbHV0aW9uIGlzIG5vdCBtYWRlIHlldC4KLSAqLwotCi1pbnQgbmVpZ2hfY29tcGF0X291dHB1dChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7Ci0KLQlfX3NrYl9wdWxsKHNrYiwgc2tiX25ldHdvcmtfb2Zmc2V0KHNrYikpOwotCi0JaWYgKGRldl9oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksIE5VTEwsIE5VTEwsCi0JCQkgICAgc2tiLT5sZW4pIDwgMCAmJgotCSAgICBkZXZfcmVidWlsZF9oZWFkZXIoc2tiKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gZGV2X3F1ZXVlX3htaXQoc2tiKTsKLX0KLUVYUE9SVF9TWU1CT0wobmVpZ2hfY29tcGF0X291dHB1dCk7Ci0KIC8qIFNsb3cgYW5kIGNhcmVmdWwuICovCiAKIGludCBuZWlnaF9yZXNvbHZlX291dHB1dChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7CiAJaW50IHJjID0gMDsKIAotCWlmICghZHN0KQotCQlnb3RvIGRpc2NhcmQ7Ci0KIAlpZiAoIW5laWdoX2V2ZW50X3NlbmQobmVpZ2gsIHNrYikpIHsKIAkJaW50IGVycjsKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CiAJCXVuc2lnbmVkIGludCBzZXE7CiAKIAkJaWYgKGRldi0+aGVhZGVyX29wcy0+Y2FjaGUgJiYgIW5laWdoLT5oaC5oaF9sZW4pCi0JCQluZWlnaF9oaF9pbml0KG5laWdoLCBkc3QpOworCQkJbmVpZ2hfaGhfaW5pdChuZWlnaCk7CiAKIAkJZG8gewogCQkJX19za2JfcHVsbChza2IsIHNrYl9uZXR3b3JrX29mZnNldChza2IpKTsKQEAgLTEzMzIsOCArMTI5NCw2IEBACiAJfQogb3V0OgogCXJldHVybiByYzsKLWRpc2NhcmQ6Ci0JbmVpZ2hfZGJnKDEsICIlczogZHN0PSVwIG5laWdoPSVwXG4iLCBfX2Z1bmNfXywgZHN0LCBuZWlnaCk7CiBvdXRfa2ZyZWVfc2tiOgogCXJjID0gLUVJTlZBTDsKIAlrZnJlZV9za2Ioc2tiKTsKQEAgLTE0NjQsMTEgKzE0MjQsMTAgQEAKIAkJCQluZWlnaF9yYW5kX3JlYWNoX3RpbWUoTkVJR0hfVkFSKHAsIEJBU0VfUkVBQ0hBQkxFX1RJTUUpKTsKIAkJZGV2X2hvbGQoZGV2KTsKIAkJcC0+ZGV2ID0gZGV2OwotCQl3cml0ZV9wbmV0KCZwLT5uZXQsIGhvbGRfbmV0KG5ldCkpOworCQl3cml0ZV9wbmV0KCZwLT5uZXQsIG5ldCk7CiAJCXAtPnN5c2N0bF90YWJsZSA9IE5VTEw7CiAKIAkJaWYgKG9wcy0+bmRvX25laWdoX3NldHVwICYmIG9wcy0+bmRvX25laWdoX3NldHVwKGRldiwgcCkpIHsKLQkJCXJlbGVhc2VfbmV0KG5ldCk7CiAJCQlkZXZfcHV0KGRldik7CiAJCQlrZnJlZShwKTsKIAkJCXJldHVybiBOVUxMOwpAQCAtMTUwOCw3ICsxNDY3LDYgQEAKIAogc3RhdGljIHZvaWQgbmVpZ2hfcGFybXNfZGVzdHJveShzdHJ1Y3QgbmVpZ2hfcGFybXMgKnBhcm1zKQogewotCXJlbGVhc2VfbmV0KG5laWdoX3Bhcm1zX25ldChwYXJtcykpOwogCWtmcmVlKHBhcm1zKTsKIH0KIApAQCAtMTc4Myw2ICsxNzQxLDggQEAKIAkJCU5FSUdIX1ZBUihwYXJtcywgVUNBU1RfUFJPQkVTKSkgfHwKIAkgICAgbmxhX3B1dF91MzIoc2tiLCBORFRQQV9NQ0FTVF9QUk9CRVMsCiAJCQlORUlHSF9WQVIocGFybXMsIE1DQVNUX1BST0JFUykpIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwgTkRUUEFfTUNBU1RfUkVQUk9CRVMsCisJCQlORUlHSF9WQVIocGFybXMsIE1DQVNUX1JFUFJPQkVTKSkgfHwKIAkgICAgbmxhX3B1dF9tc2Vjcyhza2IsIE5EVFBBX1JFQUNIQUJMRV9USU1FLCBwYXJtcy0+cmVhY2hhYmxlX3RpbWUpIHx8CiAJICAgIG5sYV9wdXRfbXNlY3Moc2tiLCBORFRQQV9CQVNFX1JFQUNIQUJMRV9USU1FLAogCQkJICBORUlHSF9WQVIocGFybXMsIEJBU0VfUkVBQ0hBQkxFX1RJTUUpKSB8fApAQCAtMTk0Miw2ICsxOTAyLDcgQEAKIAlbTkRUUEFfQVBQX1BST0JFU10JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbTkRUUEFfVUNBU1RfUFJPQkVTXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtORFRQQV9NQ0FTVF9QUk9CRVNdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05EVFBBX01DQVNUX1JFUFJPQkVTXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtORFRQQV9CQVNFX1JFQUNIQUJMRV9USU1FXQk9IHsgLnR5cGUgPSBOTEFfVTY0IH0sCiAJW05EVFBBX0dDX1NUQUxFVElNRV0JCT0geyAudHlwZSA9IE5MQV9VNjQgfSwKIAlbTkRUUEFfREVMQVlfUFJPQkVfVElNRV0JPSB7IC50eXBlID0gTkxBX1U2NCB9LApAQCAtMjA0Miw2ICsyMDAzLDEwIEBACiAJCQkJTkVJR0hfVkFSX1NFVChwLCBNQ0FTVF9QUk9CRVMsCiAJCQkJCSAgICAgIG5sYV9nZXRfdTMyKHRicFtpXSkpOwogCQkJCWJyZWFrOworCQkJY2FzZSBORFRQQV9NQ0FTVF9SRVBST0JFUzoKKwkJCQlORUlHSF9WQVJfU0VUKHAsIE1DQVNUX1JFUFJPQkVTLAorCQkJCQkgICAgICBubGFfZ2V0X3UzMih0YnBbaV0pKTsKKwkJCQlicmVhazsKIAkJCWNhc2UgTkRUUEFfQkFTRV9SRUFDSEFCTEVfVElNRToKIAkJCQlORUlHSF9WQVJfU0VUKHAsIEJBU0VfUkVBQ0hBQkxFX1RJTUUsCiAJCQkJCSAgICAgIG5sYV9nZXRfbXNlY3ModGJwW2ldKSk7CkBAIC0yNDI3LDYgKzIzOTIsNDAgQEAKIH0KIEVYUE9SVF9TWU1CT0woX19uZWlnaF9mb3JfZWFjaF9yZWxlYXNlKTsKIAoraW50IG5laWdoX3htaXQoaW50IGluZGV4LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCSAgICAgICBjb25zdCB2b2lkICphZGRyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBlcnIgPSAtRUFGTk9TVVBQT1JUOworCWlmIChsaWtlbHkoaW5kZXggPCBORUlHSF9OUl9UQUJMRVMpKSB7CisJCXN0cnVjdCBuZWlnaF90YWJsZSAqdGJsOworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKKworCQl0YmwgPSBuZWlnaF90YWJsZXNbaW5kZXhdOworCQlpZiAoIXRibCkKKwkJCWdvdG8gb3V0OworCQluZWlnaCA9IF9fbmVpZ2hfbG9va3VwX25vcmVmKHRibCwgYWRkciwgZGV2KTsKKwkJaWYgKCFuZWlnaCkKKwkJCW5laWdoID0gX19uZWlnaF9jcmVhdGUodGJsLCBhZGRyLCBkZXYsIGZhbHNlKTsKKwkJZXJyID0gUFRSX0VSUihuZWlnaCk7CisJCWlmIChJU19FUlIobmVpZ2gpKQorCQkJZ290byBvdXRfa2ZyZWVfc2tiOworCQllcnIgPSBuZWlnaC0+b3V0cHV0KG5laWdoLCBza2IpOworCX0KKwllbHNlIGlmIChpbmRleCA9PSBORUlHSF9MSU5LX1RBQkxFKSB7CisJCWVyciA9IGRldl9oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksCisJCQkJICAgICAgYWRkciwgTlVMTCwgc2tiLT5sZW4pOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gb3V0X2tmcmVlX3NrYjsKKwkJZXJyID0gZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwl9CitvdXQ6CisJcmV0dXJuIGVycjsKK291dF9rZnJlZV9za2I6CisJa2ZyZWVfc2tiKHNrYik7CisJZ290byBvdXQ7Cit9CitFWFBPUlRfU1lNQk9MKG5laWdoX3htaXQpOworCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAogc3RhdGljIHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoX2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSkKQEAgLTI5OTQsNiArMjk5Myw3IEBACiAJCU5FSUdIX1NZU0NUTF9aRVJPX0lOVE1BWF9FTlRSWShNQ0FTVF9QUk9CRVMsICJtY2FzdF9zb2xpY2l0IiksCiAJCU5FSUdIX1NZU0NUTF9aRVJPX0lOVE1BWF9FTlRSWShVQ0FTVF9QUk9CRVMsICJ1Y2FzdF9zb2xpY2l0IiksCiAJCU5FSUdIX1NZU0NUTF9aRVJPX0lOVE1BWF9FTlRSWShBUFBfUFJPQkVTLCAiYXBwX3NvbGljaXQiKSwKKwkJTkVJR0hfU1lTQ1RMX1pFUk9fSU5UTUFYX0VOVFJZKE1DQVNUX1JFUFJPQkVTLCAibWNhc3RfcmVzb2xpY2l0IiksCiAJCU5FSUdIX1NZU0NUTF9VU0VSSFpfSklGRklFU19FTlRSWShSRVRSQU5TX1RJTUUsICJyZXRyYW5zX3RpbWUiKSwKIAkJTkVJR0hfU1lTQ1RMX0pJRkZJRVNfRU5UUlkoQkFTRV9SRUFDSEFCTEVfVElNRSwgImJhc2VfcmVhY2hhYmxlX3RpbWUiKSwKIAkJTkVJR0hfU1lTQ1RMX0pJRkZJRVNfRU5UUlkoREVMQVlfUFJPQkVfVElNRSwgImRlbGF5X2ZpcnN0X3Byb2JlX3RpbWUiKSwKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC1zeXNmcy5jIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKaW5kZXggZjJhYTczYi4uNDIzOGQ2ZCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXN5c2ZzLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAKICNpbmNsdWRlICJuZXQtc3lzZnMuaCIKIApAQCAtMTA4LDExICsxMDksMTkgQEAKIE5FVERFVklDRV9TSE9XX1JPKGRldl9wb3J0LCBmbXRfZGVjKTsKIE5FVERFVklDRV9TSE9XX1JPKGFkZHJfYXNzaWduX3R5cGUsIGZtdF9kZWMpOwogTkVUREVWSUNFX1NIT1dfUk8oYWRkcl9sZW4sIGZtdF9kZWMpOwotTkVUREVWSUNFX1NIT1dfUk8oaWZsaW5rLCBmbXRfZGVjKTsKIE5FVERFVklDRV9TSE9XX1JPKGlmaW5kZXgsIGZtdF9kZWMpOwogTkVUREVWSUNFX1NIT1dfUk8odHlwZSwgZm10X2RlYyk7CiBORVRERVZJQ0VfU0hPV19STyhsaW5rX21vZGUsIGZtdF9kZWMpOwogCitzdGF0aWMgc3NpemVfdCBpZmxpbmtfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gdG9fbmV0X2RldihkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCBmbXRfZGVjLCBkZXZfZ2V0X2lmbGluayhuZGV2KSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oaWZsaW5rKTsKKwogc3RhdGljIHNzaXplX3QgZm9ybWF0X25hbWVfYXNzaWduX3R5cGUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY2hhciAqYnVmKQogewogCXJldHVybiBzcHJpbnRmKGJ1ZiwgZm10X2RlYywgZGV2LT5uYW1lX2Fzc2lnbl90eXBlKTsKQEAgLTQxNyw2ICs0MjYsMjggQEAKIH0KIHN0YXRpYyBERVZJQ0VfQVRUUl9STyhwaHlzX3BvcnRfaWQpOwogCitzdGF0aWMgc3NpemVfdCBwaHlzX3BvcnRfbmFtZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSB0b19uZXRfZGV2KGRldik7CisJc3NpemVfdCByZXQgPSAtRUlOVkFMOworCisJaWYgKCFydG5sX3RyeWxvY2soKSkKKwkJcmV0dXJuIHJlc3RhcnRfc3lzY2FsbCgpOworCisJaWYgKGRldl9pc2FsaXZlKG5ldGRldikpIHsKKwkJY2hhciBuYW1lW0lGTkFNU0laXTsKKworCQlyZXQgPSBkZXZfZ2V0X3BoeXNfcG9ydF9uYW1lKG5ldGRldiwgbmFtZSwgc2l6ZW9mKG5hbWUpKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBuYW1lKTsKKwl9CisJcnRubF91bmxvY2soKTsKKworCXJldHVybiByZXQ7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8ocGh5c19wb3J0X25hbWUpOworCiBzdGF0aWMgc3NpemVfdCBwaHlzX3N3aXRjaF9pZF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQogewpAQCAtNDY0LDYgKzQ5NSw3IEBACiAJJmRldl9hdHRyX3R4X3F1ZXVlX2xlbi5hdHRyLAogCSZkZXZfYXR0cl9ncm9fZmx1c2hfdGltZW91dC5hdHRyLAogCSZkZXZfYXR0cl9waHlzX3BvcnRfaWQuYXR0ciwKKwkmZGV2X2F0dHJfcGh5c19wb3J0X25hbWUuYXR0ciwKIAkmZGV2X2F0dHJfcGh5c19zd2l0Y2hfaWQuYXR0ciwKIAlOVUxMLAogfTsKQEAgLTk1MCw2ICs5ODIsNjAgQEAKIAlyZXR1cm4gc3ByaW50ZihidWYsICIlbHUiLCB0cmFuc190aW1lb3V0KTsKIH0KIAorI2lmZGVmIENPTkZJR19YUFMKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9uZXRkZXZfcXVldWVfaW5kZXgoc3RydWN0IG5ldGRldl9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHF1ZXVlLT5kZXY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fdHhfcXVldWVzOyBpKyspCisJCWlmIChxdWV1ZSA9PSAmZGV2LT5fdHhbaV0pCisJCQlicmVhazsKKworCUJVR19PTihpID49IGRldi0+bnVtX3R4X3F1ZXVlcyk7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd190eF9tYXhyYXRlKHN0cnVjdCBuZXRkZXZfcXVldWUgKnF1ZXVlLAorCQkJICAgICAgIHN0cnVjdCBuZXRkZXZfcXVldWVfYXR0cmlidXRlICphdHRyaWJ1dGUsCisJCQkgICAgICAgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVsdVxuIiwgcXVldWUtPnR4X21heHJhdGUpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdHhfbWF4cmF0ZShzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpxdWV1ZSwKKwkJCSAgICAgIHN0cnVjdCBuZXRkZXZfcXVldWVfYXR0cmlidXRlICphdHRyaWJ1dGUsCisJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHF1ZXVlLT5kZXY7CisJaW50IGVyciwgaW5kZXggPSBnZXRfbmV0ZGV2X3F1ZXVlX2luZGV4KHF1ZXVlKTsKKwl1MzIgcmF0ZSA9IDA7CisKKwllcnIgPSBrc3RydG91MzIoYnVmLCAxMCwgJnJhdGUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCFydG5sX3RyeWxvY2soKSkKKwkJcmV0dXJuIHJlc3RhcnRfc3lzY2FsbCgpOworCisJZXJyID0gLUVPUE5PVFNVUFA7CisJaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX3NldF90eF9tYXhyYXRlKQorCQllcnIgPSBkZXYtPm5ldGRldl9vcHMtPm5kb19zZXRfdHhfbWF4cmF0ZShkZXYsIGluZGV4LCByYXRlKTsKKworCXJ0bmxfdW5sb2NrKCk7CisJaWYgKCFlcnIpIHsKKwkJcXVldWUtPnR4X21heHJhdGUgPSByYXRlOworCQlyZXR1cm4gbGVuOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IG5ldGRldl9xdWV1ZV9hdHRyaWJ1dGUgcXVldWVfdHhfbWF4cmF0ZSA9CisJX19BVFRSKHR4X21heHJhdGUsIFNfSVJVR08gfCBTX0lXVVNSLAorCSAgICAgICBzaG93X3R4X21heHJhdGUsIHNldF90eF9tYXhyYXRlKTsKKyNlbmRpZgorCiBzdGF0aWMgc3RydWN0IG5ldGRldl9xdWV1ZV9hdHRyaWJ1dGUgcXVldWVfdHJhbnNfdGltZW91dCA9CiAJX19BVFRSKHR4X3RpbWVvdXQsIFNfSVJVR08sIHNob3dfdHJhbnNfdGltZW91dCwgTlVMTCk7CiAKQEAgLTEwNjQsMTggKzExNTAsNiBAQAogI2VuZGlmIC8qIENPTkZJR19CUUwgKi8KIAogI2lmZGVmIENPTkZJR19YUFMKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X25ldGRldl9xdWV1ZV9pbmRleChzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpxdWV1ZSkKLXsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcXVldWUtPmRldjsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWkgPSBxdWV1ZSAtIGRldi0+X3R4OwotCUJVR19PTihpID49IGRldi0+bnVtX3R4X3F1ZXVlcyk7Ci0KLQlyZXR1cm4gaTsKLX0KLQotCiBzdGF0aWMgc3NpemVfdCBzaG93X3hwc19tYXAoc3RydWN0IG5ldGRldl9xdWV1ZSAqcXVldWUsCiAJCQkgICAgc3RydWN0IG5ldGRldl9xdWV1ZV9hdHRyaWJ1dGUgKmF0dHJpYnV0ZSwgY2hhciAqYnVmKQogewpAQCAtMTE1Miw2ICsxMjI2LDcgQEAKIAkmcXVldWVfdHJhbnNfdGltZW91dC5hdHRyLAogI2lmZGVmIENPTkZJR19YUFMKIAkmeHBzX2NwdXNfYXR0cmlidXRlLmF0dHIsCisJJnF1ZXVlX3R4X21heHJhdGUuYXR0ciwKICNlbmRpZgogCU5VTEwKIH07CkBAIC0xMzc0LDYgKzE0NDksMzAgQEAKIAkubmFtZXNwYWNlID0gbmV0X25hbWVzcGFjZSwKIH07CiAKKyNpZmRlZiBDT05GSUdfT0ZfTkVUCitzdGF0aWMgaW50IG9mX2Rldl9ub2RlX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChkZXYtPnBhcmVudCkKKwkJcmV0ID0gZGV2LT5wYXJlbnQtPm9mX25vZGUgPT0gZGF0YTsKKworCXJldHVybiByZXQgPT0gMCA/IGRldi0+b2Zfbm9kZSA9PSBkYXRhIDogcmV0OworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqb2ZfZmluZF9uZXRfZGV2aWNlX2J5X25vZGUoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisKKwlkZXYgPSBjbGFzc19maW5kX2RldmljZSgmbmV0X2NsYXNzLCBOVUxMLCBucCwgb2ZfZGV2X25vZGVfbWF0Y2gpOworCWlmICghZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiB0b19uZXRfZGV2KGRldik7Cit9CitFWFBPUlRfU1lNQk9MKG9mX2ZpbmRfbmV0X2RldmljZV9ieV9ub2RlKTsKKyNlbmRpZgorCiAvKiBEZWxldGUgc3lzZnMgZW50cmllcyBidXQgaG9sZCBrb2JqZWN0IHJlZmVyZW5jZSB1bnRpbCBhZnRlciBhbGwKICAqIG5ldGRldiByZWZlcmVuY2VzIGFyZSBnb25lLgogICovCmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMgYi9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKaW5kZXggY2I1MjkwYi4uYTNhYmI3MTkgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldF9uYW1lc3BhY2UuYworKysgYi9uZXQvY29yZS9uZXRfbmFtZXNwYWNlLmMKQEAgLTE0OCw5ICsxNDgsMTEgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bmxfbmV0X25vdGlmeWlkKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5ldCAqcGVlciwgaW50IGNtZCwKKwkJCSAgICAgIGludCBpZCk7CiBzdGF0aWMgaW50IGFsbG9jX25ldGlkKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5ldCAqcGVlciwgaW50IHJlcWlkKQogewotCWludCBtaW4gPSAwLCBtYXggPSAwOworCWludCBtaW4gPSAwLCBtYXggPSAwLCBpZDsKIAogCUFTU0VSVF9SVE5MKCk7CiAKQEAgLTE1OSw3ICsxNjEsMTEgQEAKIAkJbWF4ID0gcmVxaWQgKyAxOwogCX0KIAotCXJldHVybiBpZHJfYWxsb2MoJm5ldC0+bmV0bnNfaWRzLCBwZWVyLCBtaW4sIG1heCwgR0ZQX0tFUk5FTCk7CisJaWQgPSBpZHJfYWxsb2MoJm5ldC0+bmV0bnNfaWRzLCBwZWVyLCBtaW4sIG1heCwgR0ZQX0tFUk5FTCk7CisJaWYgKGlkID49IDApCisJCXJ0bmxfbmV0X25vdGlmeWlkKG5ldCwgcGVlciwgUlRNX05FV05TSUQsIGlkKTsKKworCXJldHVybiBpZDsKIH0KIAogLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGlkcl9mb3JfZWFjaCgpLiBJZiBuZXQgaXMgZXF1YWwgdG8gcGVlciwgdGhlCkBAIC0xOTgsOCArMjA0LDEwIEBACiAgKi8KIGludCBwZWVybmV0MmlkKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5ldCAqcGVlcikKIHsKLQlpbnQgaWQgPSBfX3BlZXJuZXQyaWQobmV0LCBwZWVyLCB0cnVlKTsKKwlib29sIGFsbG9jID0gYXRvbWljX3JlYWQoJnBlZXItPmNvdW50KSA9PSAwID8gZmFsc2UgOiB0cnVlOworCWludCBpZDsKIAorCWlkID0gX19wZWVybmV0MmlkKG5ldCwgcGVlciwgYWxsb2MpOwogCXJldHVybiBpZCA+PSAwID8gaWQgOiBORVROU0FfTlNJRF9OT1RfQVNTSUdORUQ7CiB9CiBFWFBPUlRfU1lNQk9MKHBlZXJuZXQyaWQpOwpAQCAtMjM2LDEwICsyNDQsNiBAQAogCW5ldC0+dXNlcl9ucyA9IHVzZXJfbnM7CiAJaWRyX2luaXQoJm5ldC0+bmV0bnNfaWRzKTsKIAotI2lmZGVmIE5FVE5TX1JFRkNOVF9ERUJVRwotCWF0b21pY19zZXQoJm5ldC0+dXNlX2NvdW50LCAwKTsKLSNlbmRpZgotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZwZXJuZXRfbGlzdCwgbGlzdCkgewogCQllcnJvciA9IG9wc19pbml0KG9wcywgbmV0KTsKIAkJaWYgKGVycm9yIDwgMCkKQEAgLTI5NCwxMyArMjk4LDYgQEAKIAogc3RhdGljIHZvaWQgbmV0X2ZyZWUoc3RydWN0IG5ldCAqbmV0KQogewotI2lmZGVmIE5FVE5TX1JFRkNOVF9ERUJVRwotCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmbmV0LT51c2VfY291bnQpICE9IDApKSB7Ci0JCXByX2VtZXJnKCJuZXR3b3JrIG5hbWVzcGFjZSBub3QgZnJlZSEgVXNhZ2U6ICVkXG4iLAotCQkJIGF0b21pY19yZWFkKCZuZXQtPnVzZV9jb3VudCkpOwotCQlyZXR1cm47Ci0JfQotI2VuZGlmCiAJa2ZyZWUocmN1X2FjY2Vzc19wb2ludGVyKG5ldC0+Z2VuKSk7CiAJa21lbV9jYWNoZV9mcmVlKG5ldF9jYWNoZXAsIG5ldCk7CiB9CkBAIC0zNjgsOCArMzY1LDEwIEBACiAJCWZvcl9lYWNoX25ldCh0bXApIHsKIAkJCWludCBpZCA9IF9fcGVlcm5ldDJpZCh0bXAsIG5ldCwgZmFsc2UpOwogCi0JCQlpZiAoaWQgPj0gMCkKKwkJCWlmIChpZCA+PSAwKSB7CisJCQkJcnRubF9uZXRfbm90aWZ5aWQodG1wLCBuZXQsIFJUTV9ERUxOU0lELCBpZCk7CiAJCQkJaWRyX3JlbW92ZSgmdG1wLT5uZXRuc19pZHMsIGlkKTsKKwkJCX0KIAkJfQogCQlpZHJfZGVzdHJveSgmbmV0LT5uZXRuc19pZHMpOwogCkBAIC01NDAsNyArNTM5LDggQEAKIH0KIAogc3RhdGljIGludCBydG5sX25ldF9maWxsKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwb3J0aWQsIHUzMiBzZXEsIGludCBmbGFncywKLQkJCSBpbnQgY21kLCBzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZXQgKnBlZXIpCisJCQkgaW50IGNtZCwgc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmV0ICpwZWVyLAorCQkJIGludCBuc2lkKQogewogCXN0cnVjdCBubG1zZ2hkciAqbmxoOwogCXN0cnVjdCBydGdlbm1zZyAqcnRoOwpAQCAtNTU1LDkgKzU1NSwxMyBAQAogCXJ0aCA9IG5sbXNnX2RhdGEobmxoKTsKIAlydGgtPnJ0Z2VuX2ZhbWlseSA9IEFGX1VOU1BFQzsKIAotCWlkID0gX19wZWVybmV0MmlkKG5ldCwgcGVlciwgZmFsc2UpOwotCWlmICAoaWQgPCAwKQotCQlpZCA9IE5FVE5TQV9OU0lEX05PVF9BU1NJR05FRDsKKwlpZiAobnNpZCA+PSAwKSB7CisJCWlkID0gbnNpZDsKKwl9IGVsc2UgeworCQlpZCA9IF9fcGVlcm5ldDJpZChuZXQsIHBlZXIsIGZhbHNlKTsKKwkJaWYgIChpZCA8IDApCisJCQlpZCA9IE5FVE5TQV9OU0lEX05PVF9BU1NJR05FRDsKKwl9CiAJaWYgKG5sYV9wdXRfczMyKHNrYiwgTkVUTlNBX05TSUQsIGlkKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKQEAgLTU3NCw4ICs1NzgsOCBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwogCXN0cnVjdCBubGF0dHIgKnRiW05FVE5TQV9NQVggKyAxXTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwotCWludCBlcnIgPSAtRU5PQlVGUzsKIAlzdHJ1Y3QgbmV0ICpwZWVyOworCWludCBlcnI7CiAKIAllcnIgPSBubG1zZ19wYXJzZShubGgsIHNpemVvZihzdHJ1Y3QgcnRnZW5tc2cpLCB0YiwgTkVUTlNBX01BWCwKIAkJCSAgcnRubF9uZXRfcG9saWN5KTsKQEAgLTU5OCw3ICs2MDIsNyBAQAogCX0KIAogCWVyciA9IHJ0bmxfbmV0X2ZpbGwobXNnLCBORVRMSU5LX0NCKHNrYikucG9ydGlkLCBubGgtPm5sbXNnX3NlcSwgMCwKLQkJCSAgICBSVE1fR0VUTlNJRCwgbmV0LCBwZWVyKTsKKwkJCSAgICBSVE1fR0VUTlNJRCwgbmV0LCBwZWVyLCAtMSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyX291dDsKIApAQCAtNjEyLDYgKzYxNiw3NSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0cnVjdCBydG5sX25ldF9kdW1wX2NiIHsKKwlzdHJ1Y3QgbmV0ICpuZXQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2I7CisJaW50IGlkeDsKKwlpbnQgc19pZHg7Cit9OworCitzdGF0aWMgaW50IHJ0bmxfbmV0X2R1bXBpZF9vbmUoaW50IGlkLCB2b2lkICpwZWVyLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBydG5sX25ldF9kdW1wX2NiICpuZXRfY2IgPSAoc3RydWN0IHJ0bmxfbmV0X2R1bXBfY2IgKilkYXRhOworCWludCByZXQ7CisKKwlpZiAobmV0X2NiLT5pZHggPCBuZXRfY2ItPnNfaWR4KQorCQlnb3RvIGNvbnQ7CisKKwlyZXQgPSBydG5sX25ldF9maWxsKG5ldF9jYi0+c2tiLCBORVRMSU5LX0NCKG5ldF9jYi0+Y2ItPnNrYikucG9ydGlkLAorCQkJICAgIG5ldF9jYi0+Y2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwKKwkJCSAgICBSVE1fTkVXTlNJRCwgbmV0X2NiLT5uZXQsIHBlZXIsIGlkKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworY29udDoKKwluZXRfY2ItPmlkeCsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0bmxfbmV0X2R1bXBpZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CisJc3RydWN0IHJ0bmxfbmV0X2R1bXBfY2IgbmV0X2NiID0geworCQkubmV0ID0gbmV0LAorCQkuc2tiID0gc2tiLAorCQkuY2IgPSBjYiwKKwkJLmlkeCA9IDAsCisJCS5zX2lkeCA9IGNiLT5hcmdzWzBdLAorCX07CisKKwlBU1NFUlRfUlROTCgpOworCisJaWRyX2Zvcl9lYWNoKCZuZXQtPm5ldG5zX2lkcywgcnRubF9uZXRfZHVtcGlkX29uZSwgJm5ldF9jYik7CisKKwljYi0+YXJnc1swXSA9IG5ldF9jYi5pZHg7CisJcmV0dXJuIHNrYi0+bGVuOworfQorCitzdGF0aWMgdm9pZCBydG5sX25ldF9ub3RpZnlpZChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZXQgKnBlZXIsIGludCBjbWQsCisJCQkgICAgICBpbnQgaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKm1zZzsKKwlpbnQgZXJyID0gLUVOT01FTTsKKworCW1zZyA9IG5sbXNnX25ldyhydG5sX25ldF9nZXRfc2l6ZSgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykKKwkJZ290byBvdXQ7CisKKwllcnIgPSBydG5sX25ldF9maWxsKG1zZywgMCwgMCwgMCwgY21kLCBuZXQsIHBlZXIsIGlkKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfb3V0OworCisJcnRubF9ub3RpZnkobXNnLCBuZXQsIDAsIFJUTkxHUlBfTlNJRCwgTlVMTCwgMCk7CisJcmV0dXJuOworCitlcnJfb3V0OgorCW5sbXNnX2ZyZWUobXNnKTsKK291dDoKKwlydG5sX3NldF9za19lcnIobmV0LCBSVE5MR1JQX05TSUQsIGVycik7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IG5ldF9uc19pbml0KHZvaWQpCiB7CiAJc3RydWN0IG5ldF9nZW5lcmljICpuZzsKQEAgLTY0Niw3ICs3MTksOCBAQAogCXJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm5ldF9uc19vcHMpOwogCiAJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9ORVdOU0lELCBydG5sX25ldF9uZXdpZCwgTlVMTCwgTlVMTCk7Ci0JcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVROU0lELCBydG5sX25ldF9nZXRpZCwgTlVMTCwgTlVMTCk7CisJcnRubF9yZWdpc3RlcihQRl9VTlNQRUMsIFJUTV9HRVROU0lELCBydG5sX25ldF9nZXRpZCwgcnRubF9uZXRfZHVtcGlkLAorCQkgICAgICBOVUxMKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcmVxdWVzdF9zb2NrLmMgYi9uZXQvY29yZS9yZXF1ZXN0X3NvY2suYwppbmRleCAwNGRiMzE4Li44N2IyMmMwIDEwMDY0NAotLS0gYS9uZXQvY29yZS9yZXF1ZXN0X3NvY2suYworKysgYi9uZXQvY29yZS9yZXF1ZXN0X3NvY2suYwpAQCAtNTgsMTQgKzU4LDE0IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZ2V0X3JhbmRvbV9ieXRlcygmbG9wdC0+aGFzaF9ybmQsIHNpemVvZihsb3B0LT5oYXNoX3JuZCkpOwotCXJ3bG9ja19pbml0KCZxdWV1ZS0+c3luX3dhaXRfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJnF1ZXVlLT5zeW5fd2FpdF9sb2NrKTsKIAlxdWV1ZS0+cnNrcV9hY2NlcHRfaGVhZCA9IE5VTEw7CiAJbG9wdC0+bnJfdGFibGVfZW50cmllcyA9IG5yX3RhYmxlX2VudHJpZXM7CiAJbG9wdC0+bWF4X3FsZW5fbG9nID0gaWxvZzIobnJfdGFibGVfZW50cmllcyk7CiAKLQl3cml0ZV9sb2NrX2JoKCZxdWV1ZS0+c3luX3dhaXRfbG9jayk7CisJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+c3luX3dhaXRfbG9jayk7CiAJcXVldWUtPmxpc3Rlbl9vcHQgPSBsb3B0OwotCXdyaXRlX3VubG9ja19iaCgmcXVldWUtPnN5bl93YWl0X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+c3luX3dhaXRfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgxLDEwICs4MSwxMCBAQAogewogCXN0cnVjdCBsaXN0ZW5fc29jayAqbG9wdDsKIAotCXdyaXRlX2xvY2tfYmgoJnF1ZXVlLT5zeW5fd2FpdF9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJnF1ZXVlLT5zeW5fd2FpdF9sb2NrKTsKIAlsb3B0ID0gcXVldWUtPmxpc3Rlbl9vcHQ7CiAJcXVldWUtPmxpc3Rlbl9vcHQgPSBOVUxMOwotCXdyaXRlX3VubG9ja19iaCgmcXVldWUtPnN5bl93YWl0X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZxdWV1ZS0+c3luX3dhaXRfbG9jayk7CiAKIAlyZXR1cm4gbG9wdDsKIH0KQEAgLTk0LDIxICs5NCwyNiBAQAogCS8qIG1ha2UgYWxsIHRoZSBsaXN0ZW5fb3B0IGxvY2FsIHRvIHVzICovCiAJc3RydWN0IGxpc3Rlbl9zb2NrICpsb3B0ID0gcmVxc2tfcXVldWVfeWFua19saXN0ZW5fc2socXVldWUpOwogCi0JaWYgKGxvcHQtPnFsZW4gIT0gMCkgeworCWlmIChsaXN0ZW5fc29ja19xbGVuKGxvcHQpICE9IDApIHsKIAkJdW5zaWduZWQgaW50IGk7CiAKIAkJZm9yIChpID0gMDsgaSA8IGxvcHQtPm5yX3RhYmxlX2VudHJpZXM7IGkrKykgewogCQkJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxOwogCisJCQlzcGluX2xvY2tfYmgoJnF1ZXVlLT5zeW5fd2FpdF9sb2NrKTsKIAkJCXdoaWxlICgocmVxID0gbG9wdC0+c3luX3RhYmxlW2ldKSAhPSBOVUxMKSB7CiAJCQkJbG9wdC0+c3luX3RhYmxlW2ldID0gcmVxLT5kbF9uZXh0OwotCQkJCWxvcHQtPnFsZW4tLTsKLQkJCQlyZXFza19mcmVlKHJlcSk7CisJCQkJYXRvbWljX2luYygmbG9wdC0+cWxlbl9kZWMpOworCQkJCWlmIChkZWxfdGltZXIoJnJlcS0+cnNrX3RpbWVyKSkKKwkJCQkJcmVxc2tfcHV0KHJlcSk7CisJCQkJcmVxc2tfcHV0KHJlcSk7CiAJCQl9CisJCQlzcGluX3VubG9ja19iaCgmcXVldWUtPnN5bl93YWl0X2xvY2spOwogCQl9CiAJfQogCi0JV0FSTl9PTihsb3B0LT5xbGVuICE9IDApOworCWlmIChXQVJOX09OKGxpc3Rlbl9zb2NrX3FsZW4obG9wdCkgIT0gMCkpCisJCXByX2VycigicWxlbiAldVxuIiwgbGlzdGVuX3NvY2tfcWxlbihsb3B0KSk7CiAJa3ZmcmVlKGxvcHQpOwogfQogCkBAIC0xNTMsMjQgKzE1OCwyMiBAQAogICogY2FzZSBtaWdodCBhbHNvIGV4aXN0IGluIHRjcF92NF9obmRfcmVxKCkgdGhhdCB3aWxsIHRyaWdnZXIgdGhpcyBsb2NraW5nCiAgKiBvcmRlci4KICAqCi0gKiBXaGVuIGEgVEZPIHJlcSBpcyBjcmVhdGVkLCBpdCBuZWVkcyB0byBzb2NrX2hvbGQgaXRzIGxpc3RlbmVyIHRvIHByZXZlbnQKLSAqIHRoZSBsYXR0ZXIgZGF0YSBzdHJ1Y3R1cmUgZnJvbSBnb2luZyBhd2F5LgotICoKLSAqIFRoaXMgZnVuY3Rpb24gYWxzbyBzZXRzICJ0cmVxLT5saXN0ZW5lciIgdG8gTlVMTCBhbmQgdW5yZWZlcmVuY2UgbGlzdGVuZXIKLSAqIHNvY2tldC4gdHJlcS0+bGlzdGVuZXIgaXMgdXNlZCBieSB0aGUgbGlzdGVuZXIgc28gaXQgaXMgcHJvdGVjdGVkIGJ5IHRoZQorICogVGhpcyBmdW5jdGlvbiBhbHNvIHNldHMgInRyZXEtPnRmb19saXN0ZW5lciIgdG8gZmFsc2UuCisgKiB0cmVxLT50Zm9fbGlzdGVuZXIgaXMgdXNlZCBieSB0aGUgbGlzdGVuZXIgc28gaXQgaXMgcHJvdGVjdGVkIGJ5IHRoZQogICogZmFzdG9wZW5xLT5sb2NrIGluIHRoaXMgZnVuY3Rpb24uCiAgKi8KIHZvaWQgcmVxc2tfZmFzdG9wZW5fcmVtb3ZlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAogCQkJICAgYm9vbCByZXNldCkKIHsKLQlzdHJ1Y3Qgc29jayAqbHNrID0gdGNwX3JzayhyZXEpLT5saXN0ZW5lcjsKLQlzdHJ1Y3QgZmFzdG9wZW5fcXVldWUgKmZhc3RvcGVucSA9Ci0JICAgIGluZXRfY3NrKGxzayktPmljc2tfYWNjZXB0X3F1ZXVlLmZhc3RvcGVucTsKKwlzdHJ1Y3Qgc29jayAqbHNrID0gcmVxLT5yc2tfbGlzdGVuZXI7CisJc3RydWN0IGZhc3RvcGVuX3F1ZXVlICpmYXN0b3BlbnE7CisKKwlmYXN0b3BlbnEgPSBpbmV0X2Nzayhsc2spLT5pY3NrX2FjY2VwdF9xdWV1ZS5mYXN0b3BlbnE7CiAKIAl0Y3Bfc2soc2spLT5mYXN0b3Blbl9yc2sgPSBOVUxMOwogCXNwaW5fbG9ja19iaCgmZmFzdG9wZW5xLT5sb2NrKTsKIAlmYXN0b3BlbnEtPnFsZW4tLTsKLQl0Y3BfcnNrKHJlcSktPmxpc3RlbmVyID0gTlVMTDsKKwl0Y3BfcnNrKHJlcSktPnRmb19saXN0ZW5lciA9IGZhbHNlOwogCWlmIChyZXEtPnNrKQkvKiB0aGUgY2hpbGQgc29ja2V0IGhhc24ndCBiZWVuIGFjY2VwdGVkIHlldCAqLwogCQlnb3RvIG91dDsKIApAQCAtMTc5LDggKzE4Miw3IEBACiAJCSAqIHNwZWNpYWwgUlNUIGhhbmRsaW5nIGJlbG93LgogCQkgKi8KIAkJc3Bpbl91bmxvY2tfYmgoJmZhc3RvcGVucS0+bG9jayk7Ci0JCXNvY2tfcHV0KGxzayk7Ci0JCXJlcXNrX2ZyZWUocmVxKTsKKwkJcmVxc2tfcHV0KHJlcSk7CiAJCXJldHVybjsKIAl9CiAJLyogV2FpdCBmb3IgNjBzZWNzIGJlZm9yZSByZW1vdmluZyBhIHJlcSB0aGF0IGhhcyB0cmlnZ2VyZWQgUlNULgpAQCAtMTkwLDcgKzE5Miw3IEBACiAJICoKIAkgKiBGb3IgbW9yZSBkZXRhaWxzIHNlZSBDb05leHQnMTEgIlRDUCBGYXN0IE9wZW4iIHBhcGVyLgogCSAqLwotCXJlcS0+ZXhwaXJlcyA9IGppZmZpZXMgKyA2MCpIWjsKKwlyZXEtPnJza190aW1lci5leHBpcmVzID0gamlmZmllcyArIDYwKkhaOwogCWlmIChmYXN0b3BlbnEtPnJza3FfcnN0X2hlYWQgPT0gTlVMTCkKIAkJZmFzdG9wZW5xLT5yc2txX3JzdF9oZWFkID0gcmVxOwogCWVsc2UKQEAgLTIwMSw1ICsyMDMsNCBAQAogCWZhc3RvcGVucS0+cWxlbisrOwogb3V0OgogCXNwaW5fdW5sb2NrX2JoKCZmYXN0b3BlbnEtPmxvY2spOwotCXNvY2tfcHV0KGxzayk7CiB9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9ydG5ldGxpbmsuYyBiL25ldC9jb3JlL3J0bmV0bGluay5jCmluZGV4IDI1YjRiNWQuLjM1OGQ1MmEgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3J0bmV0bGluay5jCisrKyBiL25ldC9jb3JlL3J0bmV0bGluay5jCkBAIC04MTgsNyArODE4LDggQEAKIAkJCSBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGlmbGFfdmZfdmxhbikpICsKIAkJCSBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGlmbGFfdmZfc3Bvb2ZjaGspKSArCiAJCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3JhdGUpKSArCi0JCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX2xpbmtfc3RhdGUpKSk7CisJCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX2xpbmtfc3RhdGUpKSArCisJCQkgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3Jzc19xdWVyeV9lbikpKTsKIAkJcmV0dXJuIHNpemU7CiAJfSBlbHNlCiAJCXJldHVybiAwOwpAQCAtOTgyLDYgKzk4MywyNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHJ0bmxfcGh5c19wb3J0X25hbWVfZmlsbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJaW50IGVycjsKKworCWVyciA9IGRldl9nZXRfcGh5c19wb3J0X25hbWUoZGV2LCBuYW1lLCBzaXplb2YobmFtZSkpOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChubGFfcHV0KHNrYiwgSUZMQV9QSFlTX1BPUlRfTkFNRSwgc3RybGVuKG5hbWUpLCBuYW1lKSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHJ0bmxfcGh5c19zd2l0Y2hfaWRfZmlsbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCBlcnI7CkBAIC0xMDM3LDggKzEwNTYsOCBAQAogI2lmZGVmIENPTkZJR19SUFMKIAkgICAgbmxhX3B1dF91MzIoc2tiLCBJRkxBX05VTV9SWF9RVUVVRVMsIGRldi0+bnVtX3J4X3F1ZXVlcykgfHwKICNlbmRpZgotCSAgICAoZGV2LT5pZmluZGV4ICE9IGRldi0+aWZsaW5rICYmCi0JICAgICBubGFfcHV0X3UzMihza2IsIElGTEFfTElOSywgZGV2LT5pZmxpbmspKSB8fAorCSAgICAoZGV2LT5pZmluZGV4ICE9IGRldl9nZXRfaWZsaW5rKGRldikgJiYKKwkgICAgIG5sYV9wdXRfdTMyKHNrYiwgSUZMQV9MSU5LLCBkZXZfZ2V0X2lmbGluayhkZXYpKSkgfHwKIAkgICAgKHVwcGVyX2RldiAmJgogCSAgICAgbmxhX3B1dF91MzIoc2tiLCBJRkxBX01BU1RFUiwgdXBwZXJfZGV2LT5pZmluZGV4KSkgfHwKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfQ0FSUklFUiwgbmV0aWZfY2Fycmllcl9vayhkZXYpKSB8fApAQCAtMTA3Miw2ICsxMDkxLDkgQEAKIAlpZiAocnRubF9waHlzX3BvcnRfaWRfZmlsbChza2IsIGRldikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCisJaWYgKHJ0bmxfcGh5c19wb3J0X25hbWVfZmlsbChza2IsIGRldikpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCiAJaWYgKHJ0bmxfcGh5c19zd2l0Y2hfaWRfZmlsbChza2IsIGRldikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCkBAIC0xMTExLDE0ICsxMTMzLDE2IEBACiAJCQlzdHJ1Y3QgaWZsYV92Zl90eF9yYXRlIHZmX3R4X3JhdGU7CiAJCQlzdHJ1Y3QgaWZsYV92Zl9zcG9vZmNoayB2Zl9zcG9vZmNoazsKIAkJCXN0cnVjdCBpZmxhX3ZmX2xpbmtfc3RhdGUgdmZfbGlua3N0YXRlOworCQkJc3RydWN0IGlmbGFfdmZfcnNzX3F1ZXJ5X2VuIHZmX3Jzc19xdWVyeV9lbjsKIAogCQkJLyoKIAkJCSAqIE5vdCBhbGwgU1ItSU9WIGNhcGFibGUgZHJpdmVycyBzdXBwb3J0IHRoZQotCQkJICogc3Bvb2ZjaGVjayBxdWVyeS4gIFByZXNldCB0byAtMSBzbyB0aGUgdXNlcgotCQkJICogc3BhY2UgdG9vbCBjYW4gZGV0ZWN0IHRoYXQgdGhlIGRyaXZlciBkaWRuJ3QKLQkJCSAqIHJlcG9ydCBhbnl0aGluZy4KKwkJCSAqIHNwb29mY2hlY2sgYW5kICJSU1MgcXVlcnkgZW5hYmxlIiBxdWVyeS4gIFByZXNldCB0bworCQkJICogLTEgc28gdGhlIHVzZXIgc3BhY2UgdG9vbCBjYW4gZGV0ZWN0IHRoYXQgdGhlIGRyaXZlcgorCQkJICogZGlkbid0IHJlcG9ydCBhbnl0aGluZy4KIAkJCSAqLwogCQkJaXZpLnNwb29mY2hrID0gLTE7CisJCQlpdmkucnNzX3F1ZXJ5X2VuID0gLTE7CiAJCQltZW1zZXQoaXZpLm1hYywgMCwgc2l6ZW9mKGl2aS5tYWMpKTsKIAkJCS8qIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBWRiBsaW5rIHN0YXRlIGlzICJhdXRvIgogCQkJICogSUZMQV9WRl9MSU5LX1NUQVRFX0FVVE8gd2hpY2ggZXF1YWxzIHplcm8KQEAgLTExMzEsNyArMTE1NSw4IEBACiAJCQkJdmZfcmF0ZS52ZiA9CiAJCQkJdmZfdHhfcmF0ZS52ZiA9CiAJCQkJdmZfc3Bvb2ZjaGsudmYgPQotCQkJCXZmX2xpbmtzdGF0ZS52ZiA9IGl2aS52ZjsKKwkJCQl2Zl9saW5rc3RhdGUudmYgPQorCQkJCXZmX3Jzc19xdWVyeV9lbi52ZiA9IGl2aS52ZjsKIAogCQkJbWVtY3B5KHZmX21hYy5tYWMsIGl2aS5tYWMsIHNpemVvZihpdmkubWFjKSk7CiAJCQl2Zl92bGFuLnZsYW4gPSBpdmkudmxhbjsKQEAgLTExNDEsNiArMTE2Niw3IEBACiAJCQl2Zl9yYXRlLm1heF90eF9yYXRlID0gaXZpLm1heF90eF9yYXRlOwogCQkJdmZfc3Bvb2ZjaGsuc2V0dGluZyA9IGl2aS5zcG9vZmNoazsKIAkJCXZmX2xpbmtzdGF0ZS5saW5rX3N0YXRlID0gaXZpLmxpbmtzdGF0ZTsKKwkJCXZmX3Jzc19xdWVyeV9lbi5zZXR0aW5nID0gaXZpLnJzc19xdWVyeV9lbjsKIAkJCXZmID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBJRkxBX1ZGX0lORk8pOwogCQkJaWYgKCF2ZikgewogCQkJCW5sYV9uZXN0X2NhbmNlbChza2IsIHZmaW5mbyk7CkBAIC0xMTU1LDcgKzExODEsMTAgQEAKIAkJCSAgICBubGFfcHV0KHNrYiwgSUZMQV9WRl9TUE9PRkNISywgc2l6ZW9mKHZmX3Nwb29mY2hrKSwKIAkJCQkgICAgJnZmX3Nwb29mY2hrKSB8fAogCQkJICAgIG5sYV9wdXQoc2tiLCBJRkxBX1ZGX0xJTktfU1RBVEUsIHNpemVvZih2Zl9saW5rc3RhdGUpLAotCQkJCSAgICAmdmZfbGlua3N0YXRlKSkKKwkJCQkgICAgJnZmX2xpbmtzdGF0ZSkgfHwKKwkJCSAgICBubGFfcHV0KHNrYiwgSUZMQV9WRl9SU1NfUVVFUllfRU4sCisJCQkJICAgIHNpemVvZih2Zl9yc3NfcXVlcnlfZW4pLAorCQkJCSAgICAmdmZfcnNzX3F1ZXJ5X2VuKSkKIAkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAkJCW5sYV9uZXN0X2VuZChza2IsIHZmKTsKIAkJfQpAQCAtMTI2OSw2ICsxMjk4LDcgQEAKIAlbSUZMQV9WRl9TUE9PRkNIS10JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGlmbGFfdmZfc3Bvb2ZjaGspIH0sCiAJW0lGTEFfVkZfUkFURV0JCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3JhdGUpIH0sCiAJW0lGTEFfVkZfTElOS19TVEFURV0JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IGlmbGFfdmZfbGlua19zdGF0ZSkgfSwKKwlbSUZMQV9WRl9SU1NfUVVFUllfRU5dCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCBpZmxhX3ZmX3Jzc19xdWVyeV9lbikgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBpZmxhX3BvcnRfcG9saWN5W0lGTEFfUE9SVF9NQVgrMV0gPSB7CkBAIC0xNDc5LDYgKzE1MDksMTcgQEAKIAkJCQkJCQkJIGl2bC0+bGlua19zdGF0ZSk7CiAJCQlicmVhazsKIAkJfQorCQljYXNlIElGTEFfVkZfUlNTX1FVRVJZX0VOOiB7CisJCQlzdHJ1Y3QgaWZsYV92Zl9yc3NfcXVlcnlfZW4gKml2cnNzcV9lbjsKKworCQkJaXZyc3NxX2VuID0gbmxhX2RhdGEodmYpOworCQkJZXJyID0gLUVPUE5PVFNVUFA7CisJCQlpZiAob3BzLT5uZG9fc2V0X3ZmX3Jzc19xdWVyeV9lbikKKwkJCQllcnIgPSBvcHMtPm5kb19zZXRfdmZfcnNzX3F1ZXJ5X2VuKGRldiwKKwkJCQkJCQkgICAgaXZyc3NxX2VuLT52ZiwKKwkJCQkJCQkgICAgaXZyc3NxX2VuLT5zZXR0aW5nKTsKKwkJCWJyZWFrOworCQl9CiAJCWRlZmF1bHQ6CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJYnJlYWs7CkBAIC0xODE1LDYgKzE4NTYsNDIgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IHJ0bmxfZ3JvdXBfZGVsbGluayhjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGludCBncm91cCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAqYXV4OworCUxJU1RfSEVBRChsaXN0X2tpbGwpOworCWJvb2wgZm91bmQgPSBmYWxzZTsKKworCWlmICghZ3JvdXApCisJCXJldHVybiAtRVBFUk07CisKKwlmb3JfZWFjaF9uZXRkZXYobmV0LCBkZXYpIHsKKwkJaWYgKGRldi0+Z3JvdXAgPT0gZ3JvdXApIHsKKwkJCWNvbnN0IHN0cnVjdCBydG5sX2xpbmtfb3BzICpvcHM7CisKKwkJCWZvdW5kID0gdHJ1ZTsKKwkJCW9wcyA9IGRldi0+cnRubF9saW5rX29wczsKKwkJCWlmICghb3BzIHx8ICFvcHMtPmRlbGxpbmspCisJCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQl9CisJfQorCisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlmb3JfZWFjaF9uZXRkZXZfc2FmZShuZXQsIGRldiwgYXV4KSB7CisJCWlmIChkZXYtPmdyb3VwID09IGdyb3VwKSB7CisJCQljb25zdCBzdHJ1Y3QgcnRubF9saW5rX29wcyAqb3BzOworCisJCQlvcHMgPSBkZXYtPnJ0bmxfbGlua19vcHM7CisJCQlvcHMtPmRlbGxpbmsoZGV2LCAmbGlzdF9raWxsKTsKKwkJfQorCX0KKwl1bnJlZ2lzdGVyX25ldGRldmljZV9tYW55KCZsaXN0X2tpbGwpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcnRubF9kZWxsaW5rKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwpAQCAtMTgzOCw2ICsxOTE1LDggQEAKIAkJZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZtLT5pZmlfaW5kZXgpOwogCWVsc2UgaWYgKHRiW0lGTEFfSUZOQU1FXSkKIAkJZGV2ID0gX19kZXZfZ2V0X2J5X25hbWUobmV0LCBpZm5hbWUpOworCWVsc2UgaWYgKHRiW0lGTEFfR1JPVVBdKQorCQlyZXR1cm4gcnRubF9ncm91cF9kZWxsaW5rKG5ldCwgbmxhX2dldF91MzIodGJbSUZMQV9HUk9VUF0pKTsKIAllbHNlCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xODczLDcgKzE5NTIsNyBAQAogRVhQT1JUX1NZTUJPTChydG5sX2NvbmZpZ3VyZV9saW5rKTsKIAogc3RydWN0IG5ldF9kZXZpY2UgKnJ0bmxfY3JlYXRlX2xpbmsoc3RydWN0IG5ldCAqbmV0LAotCWNoYXIgKmlmbmFtZSwgdW5zaWduZWQgY2hhciBuYW1lX2Fzc2lnbl90eXBlLAorCWNvbnN0IGNoYXIgKmlmbmFtZSwgdW5zaWduZWQgY2hhciBuYW1lX2Fzc2lnbl90eXBlLAogCWNvbnN0IHN0cnVjdCBydG5sX2xpbmtfb3BzICpvcHMsIHN0cnVjdCBubGF0dHIgKnRiW10pCiB7CiAJaW50IGVycjsKQEAgLTE5MzIsMTAgKzIwMTEsMTAgQEAKIAkJc3RydWN0IGlmaW5mb21zZyAqaWZtLAogCQlzdHJ1Y3QgbmxhdHRyICoqdGIpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCAqYXV4OwogCWludCBlcnI7CiAKLQlmb3JfZWFjaF9uZXRkZXYobmV0LCBkZXYpIHsKKwlmb3JfZWFjaF9uZXRkZXZfc2FmZShuZXQsIGRldiwgYXV4KSB7CiAJCWlmIChkZXYtPmdyb3VwID09IGdyb3VwKSB7CiAJCQllcnIgPSBkb19zZXRsaW5rKHNrYiwgZGV2LCBpZm0sIHRiLCBOVUxMLCAwKTsKIAkJCWlmIChlcnIgPCAwKQpAQCAtMjE2NiwyOCArMjI0NSwyOCBAQAogCQkJfQogCQl9CiAJCWVyciA9IHJ0bmxfY29uZmlndXJlX2xpbmsoZGV2LCBpZm0pOwotCQlpZiAoZXJyIDwgMCkgewotCQkJaWYgKG9wcy0+bmV3bGluaykgewotCQkJCUxJU1RfSEVBRChsaXN0X2tpbGwpOwotCi0JCQkJb3BzLT5kZWxsaW5rKGRldiwgJmxpc3Rfa2lsbCk7Ci0JCQkJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfbWFueSgmbGlzdF9raWxsKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKLQkJCX0KLQkJCWdvdG8gb3V0OwotCQl9Ci0KKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dF91bnJlZ2lzdGVyOwogCQlpZiAobGlua19uZXQpIHsKIAkJCWVyciA9IGRldl9jaGFuZ2VfbmV0X25hbWVzcGFjZShkZXYsIGRlc3RfbmV0LCBpZm5hbWUpOwogCQkJaWYgKGVyciA8IDApCi0JCQkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwkJCQlnb3RvIG91dF91bnJlZ2lzdGVyOwogCQl9CiBvdXQ6CiAJCWlmIChsaW5rX25ldCkKIAkJCXB1dF9uZXQobGlua19uZXQpOwogCQlwdXRfbmV0KGRlc3RfbmV0KTsKIAkJcmV0dXJuIGVycjsKK291dF91bnJlZ2lzdGVyOgorCQlpZiAob3BzLT5uZXdsaW5rKSB7CisJCQlMSVNUX0hFQUQobGlzdF9raWxsKTsKKworCQkJb3BzLT5kZWxsaW5rKGRldiwgJmxpc3Rfa2lsbCk7CisJCQl1bnJlZ2lzdGVyX25ldGRldmljZV9tYW55KCZsaXN0X2tpbGwpOworCQl9IGVsc2UgeworCQkJdW5yZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwkJfQorCQlnb3RvIG91dDsKIAl9CiB9CiAKQEAgLTIzNDUsNyArMjQyNCw3IEBACiAKIHN0YXRpYyBpbnQgbmxtc2dfcG9wdWxhdGVfZmRiX2ZpbGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCSAgIHU4ICphZGRyLCB1MzIgcGlkLCB1MzIgc2VxLAorCQkJCSAgIHU4ICphZGRyLCB1MTYgdmlkLCB1MzIgcGlkLCB1MzIgc2VxLAogCQkJCSAgIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCiAJCQkJICAgaW50IG5sZmxhZ3MpCiB7CkBAIC0yMzY3LDYgKzI0NDYsOSBAQAogCiAJaWYgKG5sYV9wdXQoc2tiLCBOREFfTExBRERSLCBFVEhfQUxFTiwgYWRkcikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmICh2aWQpCisJCWlmIChubGFfcHV0KHNrYiwgTkRBX1ZMQU4sIHNpemVvZih1MTYpLCAmdmlkKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJbmxtc2dfZW5kKHNrYiwgbmxoKTsKIAlyZXR1cm4gMDsKQEAgLTIzODEsNyArMjQ2Myw3IEBACiAJcmV0dXJuIE5MTVNHX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmRtc2cpKSArIG5sYV90b3RhbF9zaXplKEVUSF9BTEVOKTsKIH0KIAotc3RhdGljIHZvaWQgcnRubF9mZGJfbm90aWZ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICphZGRyLCBpbnQgdHlwZSkKK3N0YXRpYyB2b2lkIHJ0bmxfZmRiX25vdGlmeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqYWRkciwgdTE2IHZpZCwgaW50IHR5cGUpCiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChkZXYpOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0yMzkxLDcgKzI0NzMsOCBAQAogCWlmICghc2tiKQogCQlnb3RvIGVycm91dDsKIAotCWVyciA9IG5sbXNnX3BvcHVsYXRlX2ZkYl9maWxsKHNrYiwgZGV2LCBhZGRyLCAwLCAwLCB0eXBlLCBOVEZfU0VMRiwgMCk7CisJZXJyID0gbmxtc2dfcG9wdWxhdGVfZmRiX2ZpbGwoc2tiLCBkZXYsIGFkZHIsIHZpZCwKKwkJCQkgICAgICAwLCAwLCB0eXBlLCBOVEZfU0VMRiwgMCk7CiAJaWYgKGVyciA8IDApIHsKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCWdvdG8gZXJyb3V0OwpAQCAtMjUyNiw3ICsyNjA5LDcgQEAKIAkJCQkJICAgICAgIG5saC0+bmxtc2dfZmxhZ3MpOwogCiAJCWlmICghZXJyKSB7Ci0JCQlydG5sX2ZkYl9ub3RpZnkoZGV2LCBhZGRyLCBSVE1fTkVXTkVJR0gpOworCQkJcnRubF9mZGJfbm90aWZ5KGRldiwgYWRkciwgdmlkLCBSVE1fTkVXTkVJR0gpOwogCQkJbmRtLT5uZG1fZmxhZ3MgJj0gfk5URl9TRUxGOwogCQl9CiAJfQpAQCAtMjYyNyw3ICsyNzEwLDcgQEAKIAkJCWVyciA9IG5kb19kZmx0X2ZkYl9kZWwobmRtLCB0YiwgZGV2LCBhZGRyLCB2aWQpOwogCiAJCWlmICghZXJyKSB7Ci0JCQlydG5sX2ZkYl9ub3RpZnkoZGV2LCBhZGRyLCBSVE1fREVMTkVJR0gpOworCQkJcnRubF9mZGJfbm90aWZ5KGRldiwgYWRkciwgdmlkLCBSVE1fREVMTkVJR0gpOwogCQkJbmRtLT5uZG1fZmxhZ3MgJj0gfk5URl9TRUxGOwogCQl9CiAJfQpAQCAtMjY1Miw3ICsyNzM1LDcgQEAKIAkJaWYgKCppZHggPCBjYi0+YXJnc1swXSkKIAkJCWdvdG8gc2tpcDsKIAotCQllcnIgPSBubG1zZ19wb3B1bGF0ZV9mZGJfZmlsbChza2IsIGRldiwgaGEtPmFkZHIsCisJCWVyciA9IG5sbXNnX3BvcHVsYXRlX2ZkYl9maWxsKHNrYiwgZGV2LCBoYS0+YWRkciwgMCwKIAkJCQkJICAgICAgcG9ydGlkLCBzZXEsCiAJCQkJCSAgICAgIFJUTV9ORVdORUlHSCwgTlRGX1NFTEYsCiAJCQkJCSAgICAgIE5MTV9GX01VTFRJKTsKQEAgLTI2OTUsNyArMjc3OCw2IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbmxhdHRyICp0YltJRkxBX01BWCsxXTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqYmRldiA9IE5VTEw7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmJyX2RldiA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqY29wcyA9IE5VTEw7CkBAIC0yNzE5LDcgKzI4MDEsNiBAQAogCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJb3BzID0gYnJfZGV2LT5uZXRkZXZfb3BzOwotCQliZGV2ID0gYnJfZGV2OwogCX0KIAogCWZvcl9lYWNoX25ldGRldihuZXQsIGRldikgewpAQCAtMjczMiw3ICsyODEzLDYgQEAKIAkJCQljb3BzID0gYnJfZGV2LT5uZXRkZXZfb3BzOwogCQkJfQogCi0JCQliZGV2ID0gZGV2OwogCQl9IGVsc2UgewogCQkJaWYgKGRldiAhPSBicl9kZXYgJiYKIAkJCSAgICAhKGRldi0+cHJpdl9mbGFncyAmIElGRl9CUklER0VfUE9SVCkpCkBAIC0yNzQyLDcgKzI4MjIsNiBAQAogCQkJICAgICEoZGV2LT5wcml2X2ZsYWdzICYgSUZGX0VCUklER0UpKQogCQkJCWNvbnRpbnVlOwogCi0JCQliZGV2ID0gYnJfZGV2OwogCQkJY29wcyA9IG9wczsKIAkJfQogCkBAIC0yODA0LDggKzI4ODMsOCBAQAogCSAgICAgbmxhX3B1dF91MzIoc2tiLCBJRkxBX01BU1RFUiwgYnJfZGV2LT5pZmluZGV4KSkgfHwKIAkgICAgKGRldi0+YWRkcl9sZW4gJiYKIAkgICAgIG5sYV9wdXQoc2tiLCBJRkxBX0FERFJFU1MsIGRldi0+YWRkcl9sZW4sIGRldi0+ZGV2X2FkZHIpKSB8fAotCSAgICAoZGV2LT5pZmluZGV4ICE9IGRldi0+aWZsaW5rICYmCi0JICAgICBubGFfcHV0X3UzMihza2IsIElGTEFfTElOSywgZGV2LT5pZmxpbmspKSkKKwkgICAgKGRldi0+aWZpbmRleCAhPSBkZXZfZ2V0X2lmbGluayhkZXYpICYmCisJICAgICBubGFfcHV0X3UzMihza2IsIElGTEFfTElOSywgZGV2X2dldF9pZmxpbmsoZGV2KSkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCWJyX2Fmc3BlYyA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgSUZMQV9BRl9TUEVDKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKaW5kZXggZjgwNTA3OC4uM2I2ZTU4MyAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2tidWZmLmMKKysrIGIvbmV0L2NvcmUvc2tidWZmLmMKQEAgLTI4NjUsNyArMjg2NSw2IEBACiAgKiBAZnJvbTogc2VhcmNoIG9mZnNldAogICogQHRvOiBzZWFyY2ggbGltaXQKICAqIEBjb25maWc6IHRleHRzZWFyY2ggY29uZmlndXJhdGlvbgotICogQHN0YXRlOiB1bmluaXRpYWxpemVkIHRleHRzZWFyY2ggc3RhdGUgdmFyaWFibGUKICAqCiAgKiBGaW5kcyBhIHBhdHRlcm4gaW4gdGhlIHNrYiBkYXRhIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCiAgKiB0ZXh0c2VhcmNoIGNvbmZpZ3VyYXRpb24uIFVzZSB0ZXh0c2VhcmNoX25leHQoKSB0byByZXRyaWV2ZQpAQCAtMjg3MywxNyArMjg3MiwxNyBAQAogICogdG8gdGhlIGZpcnN0IG9jY3VycmVuY2Ugb3IgVUlOVF9NQVggaWYgbm8gbWF0Y2ggd2FzIGZvdW5kLgogICovCiB1bnNpZ25lZCBpbnQgc2tiX2ZpbmRfdGV4dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgZnJvbSwKLQkJCSAgIHVuc2lnbmVkIGludCB0bywgc3RydWN0IHRzX2NvbmZpZyAqY29uZmlnLAotCQkJICAgc3RydWN0IHRzX3N0YXRlICpzdGF0ZSkKKwkJCSAgIHVuc2lnbmVkIGludCB0bywgc3RydWN0IHRzX2NvbmZpZyAqY29uZmlnKQogeworCXN0cnVjdCB0c19zdGF0ZSBzdGF0ZTsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCiAJY29uZmlnLT5nZXRfbmV4dF9ibG9jayA9IHNrYl90c19nZXRfbmV4dF9ibG9jazsKIAljb25maWctPmZpbmlzaCA9IHNrYl90c19maW5pc2g7CiAKLQlza2JfcHJlcGFyZV9zZXFfcmVhZChza2IsIGZyb20sIHRvLCBUU19TS0JfQ0Ioc3RhdGUpKTsKKwlza2JfcHJlcGFyZV9zZXFfcmVhZChza2IsIGZyb20sIHRvLCBUU19TS0JfQ0IoJnN0YXRlKSk7CiAKLQlyZXQgPSB0ZXh0c2VhcmNoX2ZpbmQoY29uZmlnLCBzdGF0ZSk7CisJcmV0ID0gdGV4dHNlYXJjaF9maW5kKGNvbmZpZywgJnN0YXRlKTsKIAlyZXR1cm4gKHJldCA8PSB0byAtIGZyb20gPyByZXQgOiBVSU5UX01BWCk7CiB9CiBFWFBPUlRfU1lNQk9MKHNrYl9maW5kX3RleHQpOwpAQCAtMzIwNywxMCArMzIwNiw5IEBACiAJc3RydWN0IHNrYl9zaGFyZWRfaW5mbyAqcGluZm8sICpza2JpbmZvID0gc2tiX3NoaW5mbyhza2IpOwogCXVuc2lnbmVkIGludCBvZmZzZXQgPSBza2JfZ3JvX29mZnNldChza2IpOwogCXVuc2lnbmVkIGludCBoZWFkbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwgKmxwLCAqcCA9ICpoZWFkOwogCXVuc2lnbmVkIGludCBsZW4gPSBza2JfZ3JvX2xlbihza2IpOworCXN0cnVjdCBza19idWZmICpscCwgKnAgPSAqaGVhZDsKIAl1bnNpZ25lZCBpbnQgZGVsdGFfdHJ1ZXNpemU7Ci0JdW5zaWduZWQgaW50IGhlYWRyb29tOwogCiAJaWYgKHVubGlrZWx5KHAtPmxlbiArIGxlbiA+PSA2NTUzNikpCiAJCXJldHVybiAtRTJCSUc7CkBAIC0zMjc3LDQ4ICszMjc1LDYgQEAKIAkJTkFQSV9HUk9fQ0Ioc2tiKS0+ZnJlZSA9IE5BUElfR1JPX0ZSRUVfU1RPTEVOX0hFQUQ7CiAJCWdvdG8gZG9uZTsKIAl9Ci0JLyogc3dpdGNoIGJhY2sgdG8gaGVhZCBzaGluZm8gKi8KLQlwaW5mbyA9IHNrYl9zaGluZm8ocCk7Ci0KLQlpZiAocGluZm8tPmZyYWdfbGlzdCkKLQkJZ290byBtZXJnZTsKLQlpZiAoc2tiX2dyb19sZW4ocCkgIT0gcGluZm8tPmdzb19zaXplKQotCQlyZXR1cm4gLUUyQklHOwotCi0JaGVhZHJvb20gPSBza2JfaGVhZHJvb20ocCk7Ci0JbnNrYiA9IGFsbG9jX3NrYihoZWFkcm9vbSArIHNrYl9ncm9fb2Zmc2V0KHApLCBHRlBfQVRPTUlDKTsKLQlpZiAodW5saWtlbHkoIW5za2IpKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCV9fY29weV9za2JfaGVhZGVyKG5za2IsIHApOwotCW5za2ItPm1hY19sZW4gPSBwLT5tYWNfbGVuOwotCi0Jc2tiX3Jlc2VydmUobnNrYiwgaGVhZHJvb20pOwotCV9fc2tiX3B1dChuc2tiLCBza2JfZ3JvX29mZnNldChwKSk7Ci0KLQlza2Jfc2V0X21hY19oZWFkZXIobnNrYiwgc2tiX21hY19oZWFkZXIocCkgLSBwLT5kYXRhKTsKLQlza2Jfc2V0X25ldHdvcmtfaGVhZGVyKG5za2IsIHNrYl9uZXR3b3JrX29mZnNldChwKSk7Ci0Jc2tiX3NldF90cmFuc3BvcnRfaGVhZGVyKG5za2IsIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHApKTsKLQotCV9fc2tiX3B1bGwocCwgc2tiX2dyb19vZmZzZXQocCkpOwotCW1lbWNweShza2JfbWFjX2hlYWRlcihuc2tiKSwgc2tiX21hY19oZWFkZXIocCksCi0JICAgICAgIHAtPmRhdGEgLSBza2JfbWFjX2hlYWRlcihwKSk7Ci0KLQlza2Jfc2hpbmZvKG5za2IpLT5mcmFnX2xpc3QgPSBwOwotCXNrYl9zaGluZm8obnNrYiktPmdzb19zaXplID0gcGluZm8tPmdzb19zaXplOwotCXBpbmZvLT5nc29fc2l6ZSA9IDA7Ci0JX19za2JfaGVhZGVyX3JlbGVhc2UocCk7Ci0JTkFQSV9HUk9fQ0IobnNrYiktPmxhc3QgPSBwOwotCi0JbnNrYi0+ZGF0YV9sZW4gKz0gcC0+bGVuOwotCW5za2ItPnRydWVzaXplICs9IHAtPnRydWVzaXplOwotCW5za2ItPmxlbiArPSBwLT5sZW47Ci0KLQkqaGVhZCA9IG5za2I7Ci0JbnNrYi0+bmV4dCA9IHAtPm5leHQ7Ci0JcC0+bmV4dCA9IE5VTEw7Ci0KLQlwID0gbnNrYjsKIAogbWVyZ2U6CiAJZGVsdGFfdHJ1ZXNpemUgPSBza2ItPnRydWVzaXplOwpAQCAtMzczMyw5ICszNjg5LDEzIEBACiAJCSAgICAgc3RydWN0IHNvY2sgKnNrLCBpbnQgdHN0eXBlKQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JYm9vbCB0c29ubHkgPSBzay0+c2tfdHNmbGFncyAmIFNPRl9USU1FU1RBTVBJTkdfT1BUX1RTT05MWTsKKwlib29sIHRzb25seTsKIAotCWlmICghc2sgfHwgIXNrYl9tYXlfdHhfdGltZXN0YW1wKHNrLCB0c29ubHkpKQorCWlmICghc2spCisJCXJldHVybjsKKworCXRzb25seSA9IHNrLT5za190c2ZsYWdzICYgU09GX1RJTUVTVEFNUElOR19PUFRfVFNPTkxZOworCWlmICghc2tiX21heV90eF90aW1lc3RhbXAoc2ssIHRzb25seSkpCiAJCXJldHVybjsKIAogCWlmICh0c29ubHkpCkBAIC0zNzkyLDcgKzM3NTIsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2tiX2NvbXBsZXRlX3dpZmlfYWNrKTsKIAotCiAvKioKICAqIHNrYl9wYXJ0aWFsX2NzdW1fc2V0IC0gc2V0IHVwIGFuZCB2ZXJpZnkgcGFydGlhbCBjc3VtIHZhbHVlcyBmb3IgcGFja2V0CiAgKiBAc2tiOiB0aGUgc2tiIHRvIHNldApAQCAtNDE3Myw3ICs0MTMyLDcgQEAKIAlza2ItPmlnbm9yZV9kZiA9IDA7CiAJc2tiX2RzdF9kcm9wKHNrYik7CiAJc2tiLT5tYXJrID0gMDsKLQlza2ItPnNlbmRlcl9jcHUgPSAwOworCXNrYl9zZW5kZXJfY3B1X2NsZWFyKHNrYik7CiAJc2tiX2luaXRfc2VjbWFyayhza2IpOwogCXNlY3BhdGhfcmVzZXQoc2tiKTsKIAluZl9yZXNldChza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc29jay5jIGIvbmV0L2NvcmUvc29jay5jCmluZGV4IDkzYzhiMjAuLmU4OTFiY2YgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NvY2suYworKysgYi9uZXQvY29yZS9zb2NrLmMKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCXNrYl9kc3RfZm9yY2Uoc2tiKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZsaXN0LT5sb2NrLCBmbGFncyk7Ci0Jc2tiLT5kcm9wY291bnQgPSBhdG9taWNfcmVhZCgmc2stPnNrX2Ryb3BzKTsKKwlzb2NrX3NrYl9zZXRfZHJvcGNvdW50KHNrLCBza2IpOwogCV9fc2tiX3F1ZXVlX3RhaWwobGlzdCwgc2tiKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0LT5sb2NrLCBmbGFncyk7CiAKQEAgLTY1Myw2ICs2NTMsMjUgQEAKIAkJc29ja19yZXNldF9mbGFnKHNrLCBiaXQpOwogfQogCitib29sIHNrX21jX2xvb3Aoc3RydWN0IHNvY2sgKnNrKQoreworCWlmIChkZXZfcmVjdXJzaW9uX2xldmVsKCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoIXNrKQorCQlyZXR1cm4gdHJ1ZTsKKwlzd2l0Y2ggKHNrLT5za19mYW1pbHkpIHsKKwljYXNlIEFGX0lORVQ6CisJCXJldHVybiBpbmV0X3NrKHNrKS0+bWNfbG9vcDsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQorCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBpbmV0Nl9zayhzayktPm1jX2xvb3A7CisjZW5kaWYKKwl9CisJV0FSTl9PTigxKTsKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0woc2tfbWNfbG9vcCk7CisKIC8qCiAgKglUaGlzIGlzIG1lYW50IGZvciBhbGwgcHJvdG9jb2xzIHRvIHVzZSBhbmQgY292ZXJzIGdvaW5ncyBvbgogICoJYXQgdGhlIHNvY2tldCBsZXZlbC4gRXZlcnl0aGluZyBoZXJlIGlzIGdlbmVyaWMuCkBAIC05MjgsOCArOTQ3LDYgQEAKIAkJCXNrLT5za19tYXJrID0gdmFsOwogCQlicmVhazsKIAotCQkvKiBXZSBpbXBsZW1lbnQgdGhlIFNPX1NORExPV0FUIGV0YyB0bwotCQkgICBub3QgYmUgc2V0dGFibGUgKDEwMDMuMWcgNS4zKSAqLwogCWNhc2UgU09fUlhRX09WRkw6CiAJCXNvY2tfdmFsYm9vbF9mbGFnKHNrLCBTT0NLX1JYUV9PVkZMLCB2YWxib29sKTsKIAkJYnJlYWs7CkBAIC0xMjM0LDYgKzEyNTEsOSBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6CisJCS8qIFdlIGltcGxlbWVudCB0aGUgU09fU05ETE9XQVQgZXRjIHRvIG5vdCBiZSBzZXR0YWJsZQorCQkgKiAoMTAwMy4xZyA3KS4KKwkJICovCiAJCXJldHVybiAtRU5PUFJPVE9PUFQ7CiAJfQogCkBAIC0xNDU0LDkgKzE0NzQsOCBAQAogCQlyZXR1cm47CiAKIAlzb2NrX2hvbGQoc2spOwotCXNvY2tfcmVsZWFzZShzay0+c2tfc29ja2V0KTsKLQlyZWxlYXNlX25ldChzb2NrX25ldChzaykpOwogCXNvY2tfbmV0X3NldChzaywgZ2V0X25ldCgmaW5pdF9uZXQpKTsKKwlzb2NrX3JlbGVhc2Uoc2stPnNrX3NvY2tldCk7CiAJc29ja19wdXQoc2spOwogfQogRVhQT1JUX1NZTUJPTChza19yZWxlYXNlX2tlcm5lbCk7CkBAIC0xNTM4LDYgKzE1NTcsNyBAQAogCQluZXdzay0+c2tfZXJyCSAgID0gMDsKIAkJbmV3c2stPnNrX3ByaW9yaXR5ID0gMDsKIAkJbmV3c2stPnNrX2luY29taW5nX2NwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisJCWF0b21pYzY0X3NldCgmbmV3c2stPnNrX2Nvb2tpZSwgMCk7CiAJCS8qCiAJCSAqIEJlZm9yZSB1cGRhdGluZyBza19yZWZjbnQsIHdlIG11c3QgY29tbWl0IHByaW9yIGNoYW5nZXMgdG8gbWVtb3J5CiAJCSAqIChEb2N1bWVudGF0aW9uL1JDVS9yY3VsaXN0X251bGxzLnR4dCBmb3IgZGV0YWlscykKQEAgLTE2NTUsMjUgKzE2NzUsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0woc29ja19yZnJlZSk7CiAKKy8qCisgKiBCdWZmZXIgZGVzdHJ1Y3RvciBmb3Igc2ticyB0aGF0IGFyZSBub3QgdXNlZCBkaXJlY3RseSBpbiByZWFkIG9yIHdyaXRlCisgKiBwYXRoLCBlLmcuIGZvciBlcnJvciBoYW5kbGVyIHNrYnMuIEF1dG9tYXRpY2FsbHkgY2FsbGVkIGZyb20ga2ZyZWVfc2tiLgorICovCiB2b2lkIHNvY2tfZWZyZWUoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzb2NrX3B1dChza2ItPnNrKTsKIH0KIEVYUE9SVF9TWU1CT0woc29ja19lZnJlZSk7CiAKLSNpZmRlZiBDT05GSUdfSU5FVAotdm9pZCBzb2NrX2VkZW11eChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBzb2NrICpzayA9IHNrYi0+c2s7Ci0KLQlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9USU1FX1dBSVQpCi0JCWluZXRfdHdza19wdXQoaW5ldF90d3NrKHNrKSk7Ci0JZWxzZQotCQlzb2NrX3B1dChzayk7Ci19Ci1FWFBPUlRfU1lNQk9MKHNvY2tfZWRlbXV4KTsKLSNlbmRpZgotCiBrdWlkX3Qgc29ja19pX3VpZChzdHJ1Y3Qgc29jayAqc2spCiB7CiAJa3VpZF90IHVpZDsKQEAgLTIxNjMsMTUgKzIxNzQsMTQgQEAKIH0KIEVYUE9SVF9TWU1CT0woc29ja19ub19nZXRzb2Nrb3B0KTsKIAotaW50IHNvY2tfbm9fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sCi0JCSAgICBzaXplX3QgbGVuKQoraW50IHNvY2tfbm9fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgbGVuKQogewogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIEVYUE9SVF9TWU1CT0woc29ja19ub19zZW5kbXNnKTsKIAotaW50IHNvY2tfbm9fcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sCi0JCSAgICBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCitpbnQgc29ja19ub19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCBsZW4sCisJCSAgICBpbnQgZmxhZ3MpCiB7CiAJcmV0dXJuIC1FT1BOT1RTVVBQOwogfQpAQCAtMjU0MywxNCArMjU1MywxNCBAQAogRVhQT1JUX1NZTUJPTChjb21wYXRfc29ja19jb21tb25fZ2V0c29ja29wdCk7CiAjZW5kaWYKIAotaW50IHNvY2tfY29tbW9uX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoraW50IHNvY2tfY29tbW9uX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwKKwkJCWludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlpbnQgYWRkcl9sZW4gPSAwOwogCWludCBlcnI7CiAKLQllcnIgPSBzay0+c2tfcHJvdC0+cmVjdm1zZyhpb2NiLCBzaywgbXNnLCBzaXplLCBmbGFncyAmIE1TR19ET05UV0FJVCwKKwllcnIgPSBzay0+c2tfcHJvdC0+cmVjdm1zZyhzaywgbXNnLCBzaXplLCBmbGFncyAmIE1TR19ET05UV0FJVCwKIAkJCQkgICBmbGFncyAmIH5NU0dfRE9OVFdBSVQsICZhZGRyX2xlbik7CiAJaWYgKGVyciA+PSAwKQogCQltc2ctPm1zZ19uYW1lbGVuID0gYWRkcl9sZW47CkBAIC0yNzI3LDYgKzI3MzcsNDIgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgdm9pZCByZXFfcHJvdF9jbGVhbnVwKHN0cnVjdCByZXF1ZXN0X3NvY2tfb3BzICpyc2tfcHJvdCkKK3sKKwlpZiAoIXJza19wcm90KQorCQlyZXR1cm47CisJa2ZyZWUocnNrX3Byb3QtPnNsYWJfbmFtZSk7CisJcnNrX3Byb3QtPnNsYWJfbmFtZSA9IE5VTEw7CisJaWYgKHJza19wcm90LT5zbGFiKSB7CisJCWttZW1fY2FjaGVfZGVzdHJveShyc2tfcHJvdC0+c2xhYik7CisJCXJza19wcm90LT5zbGFiID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcmVxX3Byb3RfaW5pdChjb25zdCBzdHJ1Y3QgcHJvdG8gKnByb3QpCit7CisJc3RydWN0IHJlcXVlc3Rfc29ja19vcHMgKnJza19wcm90ID0gcHJvdC0+cnNrX3Byb3Q7CisKKwlpZiAoIXJza19wcm90KQorCQlyZXR1cm4gMDsKKworCXJza19wcm90LT5zbGFiX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgInJlcXVlc3Rfc29ja18lcyIsCisJCQkJCXByb3QtPm5hbWUpOworCWlmICghcnNrX3Byb3QtPnNsYWJfbmFtZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyc2tfcHJvdC0+c2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKHJza19wcm90LT5zbGFiX25hbWUsCisJCQkJCSAgIHJza19wcm90LT5vYmpfc2l6ZSwgMCwKKwkJCQkJICAgMCwgTlVMTCk7CisKKwlpZiAoIXJza19wcm90LT5zbGFiKSB7CisJCXByX2NyaXQoIiVzOiBDYW4ndCBjcmVhdGUgcmVxdWVzdCBzb2NrIFNMQUIgY2FjaGUhXG4iLAorCQkJcHJvdC0+bmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKwogaW50IHByb3RvX3JlZ2lzdGVyKHN0cnVjdCBwcm90byAqcHJvdCwgaW50IGFsbG9jX3NsYWIpCiB7CiAJaWYgKGFsbG9jX3NsYWIpIHsKQEAgLTI3NDAsMjEgKzI3ODYsOCBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQlpZiAocHJvdC0+cnNrX3Byb3QgIT0gTlVMTCkgewotCQkJcHJvdC0+cnNrX3Byb3QtPnNsYWJfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAicmVxdWVzdF9zb2NrXyVzIiwgcHJvdC0+bmFtZSk7Ci0JCQlpZiAocHJvdC0+cnNrX3Byb3QtPnNsYWJfbmFtZSA9PSBOVUxMKQotCQkJCWdvdG8gb3V0X2ZyZWVfc29ja19zbGFiOwotCi0JCQlwcm90LT5yc2tfcHJvdC0+c2xhYiA9IGttZW1fY2FjaGVfY3JlYXRlKHByb3QtPnJza19wcm90LT5zbGFiX25hbWUsCi0JCQkJCQkJCSBwcm90LT5yc2tfcHJvdC0+b2JqX3NpemUsIDAsCi0JCQkJCQkJCSBTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOwotCi0JCQlpZiAocHJvdC0+cnNrX3Byb3QtPnNsYWIgPT0gTlVMTCkgewotCQkJCXByX2NyaXQoIiVzOiBDYW4ndCBjcmVhdGUgcmVxdWVzdCBzb2NrIFNMQUIgY2FjaGUhXG4iLAotCQkJCQlwcm90LT5uYW1lKTsKLQkJCQlnb3RvIG91dF9mcmVlX3JlcXVlc3Rfc29ja19zbGFiX25hbWU7Ci0JCQl9Ci0JCX0KKwkJaWYgKHJlcV9wcm90X2luaXQocHJvdCkpCisJCQlnb3RvIG91dF9mcmVlX3JlcXVlc3Rfc29ja19zbGFiOwogCiAJCWlmIChwcm90LT50d3NrX3Byb3QgIT0gTlVMTCkgewogCQkJcHJvdC0+dHdza19wcm90LT50d3NrX3NsYWJfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAidHdfc29ja18lcyIsIHByb3QtPm5hbWUpOwpAQCAtMjc2Niw4ICsyNzk5LDcgQEAKIAkJCQlrbWVtX2NhY2hlX2NyZWF0ZShwcm90LT50d3NrX3Byb3QtPnR3c2tfc2xhYl9uYW1lLAogCQkJCQkJICBwcm90LT50d3NrX3Byb3QtPnR3c2tfb2JqX3NpemUsCiAJCQkJCQkgIDAsCi0JCQkJCQkgIFNMQUJfSFdDQUNIRV9BTElHTiB8Ci0JCQkJCQkJcHJvdC0+c2xhYl9mbGFncywKKwkJCQkJCSAgcHJvdC0+c2xhYl9mbGFncywKIAkJCQkJCSAgTlVMTCk7CiAJCQlpZiAocHJvdC0+dHdza19wcm90LT50d3NrX3NsYWIgPT0gTlVMTCkKIAkJCQlnb3RvIG91dF9mcmVlX3RpbWV3YWl0X3NvY2tfc2xhYl9uYW1lOwpAQCAtMjc4MywxNCArMjgxNSw4IEBACiBvdXRfZnJlZV90aW1ld2FpdF9zb2NrX3NsYWJfbmFtZToKIAlrZnJlZShwcm90LT50d3NrX3Byb3QtPnR3c2tfc2xhYl9uYW1lKTsKIG91dF9mcmVlX3JlcXVlc3Rfc29ja19zbGFiOgotCWlmIChwcm90LT5yc2tfcHJvdCAmJiBwcm90LT5yc2tfcHJvdC0+c2xhYikgewotCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocHJvdC0+cnNrX3Byb3QtPnNsYWIpOwotCQlwcm90LT5yc2tfcHJvdC0+c2xhYiA9IE5VTEw7Ci0JfQotb3V0X2ZyZWVfcmVxdWVzdF9zb2NrX3NsYWJfbmFtZToKLQlpZiAocHJvdC0+cnNrX3Byb3QpCi0JCWtmcmVlKHByb3QtPnJza19wcm90LT5zbGFiX25hbWUpOwotb3V0X2ZyZWVfc29ja19zbGFiOgorCXJlcV9wcm90X2NsZWFudXAocHJvdC0+cnNrX3Byb3QpOworCiAJa21lbV9jYWNoZV9kZXN0cm95KHByb3QtPnNsYWIpOwogCXByb3QtPnNsYWIgPSBOVUxMOwogb3V0OgpAQCAtMjgxMCwxMSArMjgzNiw3IEBACiAJCXByb3QtPnNsYWIgPSBOVUxMOwogCX0KIAotCWlmIChwcm90LT5yc2tfcHJvdCAhPSBOVUxMICYmIHByb3QtPnJza19wcm90LT5zbGFiICE9IE5VTEwpIHsKLQkJa21lbV9jYWNoZV9kZXN0cm95KHByb3QtPnJza19wcm90LT5zbGFiKTsKLQkJa2ZyZWUocHJvdC0+cnNrX3Byb3QtPnNsYWJfbmFtZSk7Ci0JCXByb3QtPnJza19wcm90LT5zbGFiID0gTlVMTDsKLQl9CisJcmVxX3Byb3RfY2xlYW51cChwcm90LT5yc2tfcHJvdCk7CiAKIAlpZiAocHJvdC0+dHdza19wcm90ICE9IE5VTEwgJiYgcHJvdC0+dHdza19wcm90LT50d3NrX3NsYWIgIT0gTlVMTCkgewogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocHJvdC0+dHdza19wcm90LT50d3NrX3NsYWIpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc29ja19kaWFnLmMgYi9uZXQvY29yZS9zb2NrX2RpYWcuYwppbmRleCBhZDcwNGM3Li43NGRkZGY4IDEwMDY0NAotLS0gYS9uZXQvY29yZS9zb2NrX2RpYWcuYworKysgYi9uZXQvY29yZS9zb2NrX2RpYWcuYwpAQCAtMTMsMjIgKzEzLDM5IEBACiBzdGF0aWMgaW50ICgqaW5ldF9yY3ZfY29tcGF0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCk7CiBzdGF0aWMgREVGSU5FX01VVEVYKHNvY2tfZGlhZ190YWJsZV9tdXRleCk7CiAKLWludCBzb2NrX2RpYWdfY2hlY2tfY29va2llKHZvaWQgKnNrLCBfX3UzMiAqY29va2llKQorc3RhdGljIHU2NCBzb2NrX2dlbl9jb29raWUoc3RydWN0IHNvY2sgKnNrKQogewotCWlmICgoY29va2llWzBdICE9IElORVRfRElBR19OT0NPT0tJRSB8fAotCSAgICAgY29va2llWzFdICE9IElORVRfRElBR19OT0NPT0tJRSkgJiYKLQkgICAgKCh1MzIpKHVuc2lnbmVkIGxvbmcpc2sgIT0gY29va2llWzBdIHx8Ci0JICAgICAodTMyKSgoKCh1bnNpZ25lZCBsb25nKXNrKSA+PiAzMSkgPj4gMSkgIT0gY29va2llWzFdKSkKLQkJcmV0dXJuIC1FU1RBTEU7Ci0JZWxzZQorCXdoaWxlICgxKSB7CisJCXU2NCByZXMgPSBhdG9taWM2NF9yZWFkKCZzay0+c2tfY29va2llKTsKKworCQlpZiAocmVzKQorCQkJcmV0dXJuIHJlczsKKwkJcmVzID0gYXRvbWljNjRfaW5jX3JldHVybigmc29ja19uZXQoc2spLT5jb29raWVfZ2VuKTsKKwkJYXRvbWljNjRfY21weGNoZygmc2stPnNrX2Nvb2tpZSwgMCwgcmVzKTsKKwl9Cit9CisKK2ludCBzb2NrX2RpYWdfY2hlY2tfY29va2llKHN0cnVjdCBzb2NrICpzaywgY29uc3QgX191MzIgKmNvb2tpZSkKK3sKKwl1NjQgcmVzOworCisJaWYgKGNvb2tpZVswXSA9PSBJTkVUX0RJQUdfTk9DT09LSUUgJiYgY29va2llWzFdID09IElORVRfRElBR19OT0NPT0tJRSkKIAkJcmV0dXJuIDA7CisKKwlyZXMgPSBzb2NrX2dlbl9jb29raWUoc2spOworCWlmICgodTMyKXJlcyAhPSBjb29raWVbMF0gfHwgKHUzMikocmVzID4+IDMyKSAhPSBjb29raWVbMV0pCisJCXJldHVybiAtRVNUQUxFOworCisJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzb2NrX2RpYWdfY2hlY2tfY29va2llKTsKIAotdm9pZCBzb2NrX2RpYWdfc2F2ZV9jb29raWUodm9pZCAqc2ssIF9fdTMyICpjb29raWUpCit2b2lkIHNvY2tfZGlhZ19zYXZlX2Nvb2tpZShzdHJ1Y3Qgc29jayAqc2ssIF9fdTMyICpjb29raWUpCiB7Ci0JY29va2llWzBdID0gKHUzMikodW5zaWduZWQgbG9uZylzazsKLQljb29raWVbMV0gPSAodTMyKSgoKHVuc2lnbmVkIGxvbmcpc2sgPj4gMzEpID4+IDEpOworCXU2NCByZXMgPSBzb2NrX2dlbl9jb29raWUoc2spOworCisJY29va2llWzBdID0gKHUzMilyZXM7CisJY29va2llWzFdID0gKHUzMikocmVzID4+IDMyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNvY2tfZGlhZ19zYXZlX2Nvb2tpZSk7CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jIGIvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMKaW5kZXggNDMzNDI0OC4uOTViNjEzOSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMKKysrIGIvbmV0L2NvcmUvc3lzY3RsX25ldF9jb3JlLmMKQEAgLTI0LDcgKzI0LDggQEAKIAogc3RhdGljIGludCB6ZXJvID0gMDsKIHN0YXRpYyBpbnQgb25lID0gMTsKLXN0YXRpYyBpbnQgdXNob3J0X21heCA9IFVTSFJUX01BWDsKK3N0YXRpYyBpbnQgbWluX3NuZGJ1ZiA9IFNPQ0tfTUlOX1NOREJVRjsKK3N0YXRpYyBpbnQgbWluX3JjdmJ1ZiA9IFNPQ0tfTUlOX1JDVkJVRjsKIAogc3RhdGljIGludCBuZXRfbXNnX3dhcm47CS8qIFVudXNlZCwgYnV0IHN0aWxsIGEgc3lzY3RsICovCiAKQEAgLTIzNyw3ICsyMzgsNyBAQAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19taW5tYXgsCi0JCS5leHRyYTEJCT0gJm9uZSwKKwkJLmV4dHJhMQkJPSAmbWluX3NuZGJ1ZiwKIAl9LAogCXsKIAkJLnByb2NuYW1lCT0gInJtZW1fbWF4IiwKQEAgLTI0NSw3ICsyNDYsNyBAQAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19taW5tYXgsCi0JCS5leHRyYTEJCT0gJm9uZSwKKwkJLmV4dHJhMQkJPSAmbWluX3JjdmJ1ZiwKIAl9LAogCXsKIAkJLnByb2NuYW1lCT0gIndtZW1fZGVmYXVsdCIsCkBAIC0yNTMsNyArMjU0LDcgQEAKIAkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4LAotCQkuZXh0cmExCQk9ICZvbmUsCisJCS5leHRyYTEJCT0gJm1pbl9zbmRidWYsCiAJfSwKIAl7CiAJCS5wcm9jbmFtZQk9ICJybWVtX2RlZmF1bHQiLApAQCAtMjYxLDcgKzI2Miw3IEBACiAJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCS5tb2RlCQk9IDA2NDQsCiAJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21pbm1heCwKLQkJLmV4dHJhMQkJPSAmb25lLAorCQkuZXh0cmExCQk9ICZtaW5fcmN2YnVmLAogCX0sCiAJewogCQkucHJvY25hbWUJPSAiZGV2X3dlaWdodCIsCkBAIC00MDEsNyArNDAyLDYgQEAKIAkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLmV4dHJhMQkJPSAmemVybywKLQkJLmV4dHJhMgkJPSAmdXNob3J0X21heCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfbWlubWF4CiAJfSwKIAl7IH0KZGlmZiAtLWdpdCBhL25ldC9kY2IvZGNibmwuYyBiL25ldC9kY2IvZGNibmwuYwppbmRleCA5M2VhODAxLi41YjIxZjZmIDEwMDY0NAotLS0gYS9uZXQvZGNiL2RjYm5sLmMKKysrIGIvbmV0L2RjYi9kY2JubC5jCkBAIC0xNzcsNiArMTc3LDggQEAKIAlbRENCX0FUVFJfSUVFRV9QRkNdCSAgICA9IHsubGVuID0gc2l6ZW9mKHN0cnVjdCBpZWVlX3BmYyl9LAogCVtEQ0JfQVRUUl9JRUVFX0FQUF9UQUJMRV0gICA9IHsudHlwZSA9IE5MQV9ORVNURUR9LAogCVtEQ0JfQVRUUl9JRUVFX01BWFJBVEVdICAgPSB7LmxlbiA9IHNpemVvZihzdHJ1Y3QgaWVlZV9tYXhyYXRlKX0sCisJW0RDQl9BVFRSX0lFRUVfUUNOXSAgICAgICAgID0gey5sZW4gPSBzaXplb2Yoc3RydWN0IGllZWVfcWNuKX0sCisJW0RDQl9BVFRSX0lFRUVfUUNOX1NUQVRTXSAgID0gey5sZW4gPSBzaXplb2Yoc3RydWN0IGllZWVfcWNuX3N0YXRzKX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgZGNibmxfaWVlZV9hcHBbRENCX0FUVFJfSUVFRV9BUFBfTUFYICsgMV0gPSB7CkBAIC0xMDMwLDcgKzEwMzIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qIEhhbmRsZSBJRUVFIDgwMi4xUWF6IEdFVCBjb21tYW5kcy4gKi8KKy8qIEhhbmRsZSBJRUVFIDgwMi4xUWF6LzgwMi4xUWF1LzgwMi4xUWJiIEdFVCBjb21tYW5kcy4gKi8KIHN0YXRpYyBpbnQgZGNibmxfaWVlZV9maWxsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IG5sYXR0ciAqaWVlZSwgKmFwcDsKQEAgLTEwNjcsNiArMTA2OSwzMiBAQAogCQl9CiAJfQogCisJaWYgKG9wcy0+aWVlZV9nZXRxY24pIHsKKwkJc3RydWN0IGllZWVfcWNuIHFjbjsKKworCQltZW1zZXQoJnFjbiwgMCwgc2l6ZW9mKHFjbikpOworCQllcnIgPSBvcHMtPmllZWVfZ2V0cWNuKG5ldGRldiwgJnFjbik7CisJCWlmICghZXJyKSB7CisJCQllcnIgPSBubGFfcHV0KHNrYiwgRENCX0FUVFJfSUVFRV9RQ04sCisJCQkJICAgICAgc2l6ZW9mKHFjbiksICZxY24pOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gLUVNU0dTSVpFOworCQl9CisJfQorCisJaWYgKG9wcy0+aWVlZV9nZXRxY25zdGF0cykgeworCQlzdHJ1Y3QgaWVlZV9xY25fc3RhdHMgcWNuX3N0YXRzOworCisJCW1lbXNldCgmcWNuX3N0YXRzLCAwLCBzaXplb2YocWNuX3N0YXRzKSk7CisJCWVyciA9IG9wcy0+aWVlZV9nZXRxY25zdGF0cyhuZXRkZXYsICZxY25fc3RhdHMpOworCQlpZiAoIWVycikgeworCQkJZXJyID0gbmxhX3B1dChza2IsIERDQl9BVFRSX0lFRUVfUUNOX1NUQVRTLAorCQkJCSAgICAgIHNpemVvZihxY25fc3RhdHMpLCAmcWNuX3N0YXRzKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIC1FTVNHU0laRTsKKwkJfQorCX0KKwogCWlmIChvcHMtPmllZWVfZ2V0cGZjKSB7CiAJCXN0cnVjdCBpZWVlX3BmYyBwZmM7CiAJCW1lbXNldCgmcGZjLCAwLCBzaXplb2YocGZjKSk7CkBAIC0xMzc5LDggKzE0MDcsOSBAQAogfQogRVhQT1JUX1NZTUJPTChkY2JubF9jZWVfbm90aWZ5KTsKIAotLyogSGFuZGxlIElFRUUgODAyLjFRYXogU0VUIGNvbW1hbmRzLiBJZiBhbnkgcmVxdWVzdGVkIG9wZXJhdGlvbiBjYW4gbm90Ci0gKiBiZSBjb21wbGV0ZWQgdGhlIGVudGlyZSBtc2cgaXMgYWJvcnRlZCBhbmQgZXJyb3IgdmFsdWUgaXMgcmV0dXJuZWQuCisvKiBIYW5kbGUgSUVFRSA4MDIuMVFhei84MDIuMVFhdS84MDIuMVFiYiBTRVQgY29tbWFuZHMuCisgKiBJZiBhbnkgcmVxdWVzdGVkIG9wZXJhdGlvbiBjYW4gbm90IGJlIGNvbXBsZXRlZAorICogdGhlIGVudGlyZSBtc2cgaXMgYWJvcnRlZCBhbmQgZXJyb3IgdmFsdWUgaXMgcmV0dXJuZWQuCiAgKiBObyBhdHRlbXB0IGlzIG1hZGUgdG8gcmVjb25jaWxlIHRoZSBjYXNlIHdoZXJlIG9ubHkgcGFydCBvZiB0aGUKICAqIGNtZCBjYW4gYmUgY29tcGxldGVkLgogICovCkBAIC0xNDE3LDYgKzE0NDYsMTUgQEAKIAkJCWdvdG8gZXJyOwogCX0KIAorCWlmIChpZWVlW0RDQl9BVFRSX0lFRUVfUUNOXSAmJiBvcHMtPmllZWVfc2V0cWNuKSB7CisJCXN0cnVjdCBpZWVlX3FjbiAqcWNuID0KKwkJCW5sYV9kYXRhKGllZWVbRENCX0FUVFJfSUVFRV9RQ05dKTsKKworCQllcnIgPSBvcHMtPmllZWVfc2V0cWNuKG5ldGRldiwgcWNuKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyOworCX0KKwogCWlmIChpZWVlW0RDQl9BVFRSX0lFRUVfUEZDXSAmJiBvcHMtPmllZWVfc2V0cGZjKSB7CiAJCXN0cnVjdCBpZWVlX3BmYyAqcGZjID0gbmxhX2RhdGEoaWVlZVtEQ0JfQVRUUl9JRUVFX1BGQ10pOwogCQllcnIgPSBvcHMtPmllZWVfc2V0cGZjKG5ldGRldiwgcGZjKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2RjY3AuaCBiL25ldC9kY2NwL2RjY3AuaAppbmRleCBlNGMxNDRmLi5iZWJjNzM1IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9kY2NwLmgKKysrIGIvbmV0L2RjY3AvZGNjcC5oCkBAIC0yODAsOCArMjgwLDcgQEAKIAkJCQkgICAgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAogCQkJCSAgICAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogc3RydWN0IHNvY2sgKmRjY3BfY2hlY2tfcmVxKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqKnByZXYpOworCQkJICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSk7CiAKIGludCBkY2NwX2NoaWxkX3Byb2Nlc3Moc3RydWN0IHNvY2sgKnBhcmVudCwgc3RydWN0IHNvY2sgKmNoaWxkLAogCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYik7CkBAIC0zMTAsMTYgKzMwOSwxNSBAQAogCQkJICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbik7CiAjZW5kaWYKIGludCBkY2NwX2lvY3RsKHN0cnVjdCBzb2NrICpzaywgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwotaW50IGRjY3Bfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkgc2l6ZV90IHNpemUpOwotaW50IGRjY3BfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IG5vbmJsb2NrLCBpbnQgZmxhZ3MsCi0JCSBpbnQgKmFkZHJfbGVuKTsKK2ludCBkY2NwX3NlbmRtc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplKTsKK2ludCBkY2NwX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBub25ibG9jaywKKwkJIGludCBmbGFncywgaW50ICphZGRyX2xlbik7CiB2b2lkIGRjY3Bfc2h1dGRvd24oc3RydWN0IHNvY2sgKnNrLCBpbnQgaG93KTsKIGludCBpbmV0X2RjY3BfbGlzdGVuKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCBiYWNrbG9nKTsKIHVuc2lnbmVkIGludCBkY2NwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCiAJCSAgICAgICBwb2xsX3RhYmxlICp3YWl0KTsKIGludCBkY2NwX3Y0X2Nvbm5lY3Qoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2FkZHIgKnVhZGRyLCBpbnQgYWRkcl9sZW4pOwordm9pZCBkY2NwX3JlcV9lcnIoc3RydWN0IHNvY2sgKnNrLCB1NjQgc2VxKTsKIAogc3RydWN0IHNrX2J1ZmYgKmRjY3BfY3RsX21ha2VfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBkY2NwX3NlbmRfcmVzZXQoc3RydWN0IHNvY2sgKnNrLCBlbnVtIGRjY3BfcmVzZXRfY29kZXMgY29kZSk7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9kaWFnLmMgYi9uZXQvZGNjcC9kaWFnLmMKaW5kZXggMDI4ZmM0My4uNWE0NWY4ZCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvZGlhZy5jCisrKyBiL25ldC9kY2NwL2RpYWcuYwpAQCAtNDksMTMgKzQ5LDE0IEBACiB9CiAKIHN0YXRpYyB2b2lkIGRjY3BfZGlhZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKLQkJc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIsIHN0cnVjdCBubGF0dHIgKmJjKQorCQkJICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIsIHN0cnVjdCBubGF0dHIgKmJjKQogewogCWluZXRfZGlhZ19kdW1wX2ljc2soJmRjY3BfaGFzaGluZm8sIHNrYiwgY2IsIHIsIGJjKTsKIH0KIAotc3RhdGljIGludCBkY2NwX2RpYWdfZHVtcF9vbmUoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCi0JCXN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpCitzdGF0aWMgaW50IGRjY3BfZGlhZ19kdW1wX29uZShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxKQogewogCXJldHVybiBpbmV0X2RpYWdfZHVtcF9vbmVfaWNzaygmZGNjcF9oYXNoaW5mbywgaW5fc2tiLCBubGgsIHJlcSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY0LmMgYi9uZXQvZGNjcC9pcHY0LmMKaW5kZXggZTQ1Yjk2OC4uMmI0ZjIxZCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2NC5jCisrKyBiL25ldC9kY2NwL2lwdjQuYwpAQCAtODksMTAgKzg5LDkgQEAKIAogCWlmIChpbmV0LT5pbmV0X3NhZGRyID09IDApCiAJCWluZXQtPmluZXRfc2FkZHIgPSBmbDQtPnNhZGRyOwotCWluZXQtPmluZXRfcmN2X3NhZGRyID0gaW5ldC0+aW5ldF9zYWRkcjsKLQorCXNrX3Jjdl9zYWRkcl9zZXQoc2ssIGluZXQtPmluZXRfc2FkZHIpOwogCWluZXQtPmluZXRfZHBvcnQgPSB1c2luLT5zaW5fcG9ydDsKLQlpbmV0LT5pbmV0X2RhZGRyID0gZGFkZHI7CisJc2tfZGFkZHJfc2V0KHNrLCBkYWRkcik7CiAKIAlpbmV0X2NzayhzayktPmljc2tfZXh0X2hkcl9sZW4gPSAwOwogCWlmIChpbmV0X29wdCkKQEAgLTE5Niw2ICsxOTUsMzIgQEAKIAkJZHN0LT5vcHMtPnJlZGlyZWN0KGRzdCwgc2ssIHNrYik7CiB9CiAKK3ZvaWQgZGNjcF9yZXFfZXJyKHN0cnVjdCBzb2NrICpzaywgdTY0IHNlcSkKKwl7CisJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxID0gaW5ldF9yZXFzayhzayk7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOworCisJLyoKKwkgKiBJQ01QcyBhcmUgbm90IGJhY2tsb2dnZWQsIGhlbmNlIHdlIGNhbm5vdCBnZXQgYW4gZXN0YWJsaXNoZWQKKwkgKiBzb2NrZXQgaGVyZS4KKwkgKi8KKwlXQVJOX09OKHJlcS0+c2spOworCisJaWYgKCFiZXR3ZWVuNDgoc2VxLCBkY2NwX3JzayhyZXEpLT5kcmVxX2lzcywgZGNjcF9yc2socmVxKS0+ZHJlcV9nc3MpKSB7CisJCU5FVF9JTkNfU1RBVFNfQkgobmV0LCBMSU5VWF9NSUJfT1VUT0ZXSU5ET1dJQ01QUyk7CisJCXJlcXNrX3B1dChyZXEpOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFN0aWxsIGluIFJFU1BPTkQsIGp1c3QgcmVtb3ZlIGl0IHNpbGVudGx5LgorCQkgKiBUaGVyZSBpcyBubyBnb29kIHdheSB0byBwYXNzIHRoZSBlcnJvciB0byB0aGUgbmV3bHkKKwkJICogY3JlYXRlZCBzb2NrZXQsIGFuZCBQT1NJWCBkb2VzIG5vdCB3YW50IG5ldHdvcmsKKwkJICogZXJyb3JzIHJldHVybmVkIGZyb20gYWNjZXB0KCkuCisJCSAqLworCQlpbmV0X2Nza19yZXFza19xdWV1ZV9kcm9wKHJlcS0+cnNrX2xpc3RlbmVyLCByZXEpOworCX0KK30KK0VYUE9SVF9TWU1CT0woZGNjcF9yZXFfZXJyKTsKKwogLyoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIElDTVAgbW9kdWxlIHdoZW4gaXQgZ2V0cyBzb21lIHNvcnQgb2YgZXJyb3IKICAqIGNvbmRpdGlvbi4gSWYgZXJyIDwgMCB0aGVuIHRoZSBzb2NrZXQgc2hvdWxkIGJlIGNsb3NlZCBhbmQgdGhlIGVycm9yCkBAIC0yMjgsMTAgKzI1MywxMSBAQAogCQlyZXR1cm47CiAJfQogCi0Jc2sgPSBpbmV0X2xvb2t1cChuZXQsICZkY2NwX2hhc2hpbmZvLAotCQkJaXBoLT5kYWRkciwgZGgtPmRjY3BoX2Rwb3J0LAotCQkJaXBoLT5zYWRkciwgZGgtPmRjY3BoX3Nwb3J0LCBpbmV0X2lpZihza2IpKTsKLQlpZiAoc2sgPT0gTlVMTCkgeworCXNrID0gX19pbmV0X2xvb2t1cF9lc3RhYmxpc2hlZChuZXQsICZkY2NwX2hhc2hpbmZvLAorCQkJCSAgICAgICBpcGgtPmRhZGRyLCBkaC0+ZGNjcGhfZHBvcnQsCisJCQkJICAgICAgIGlwaC0+c2FkZHIsIG50b2hzKGRoLT5kY2NwaF9zcG9ydCksCisJCQkJICAgICAgIGluZXRfaWlmKHNrYikpOworCWlmICghc2spIHsKIAkJSUNNUF9JTkNfU1RBVFNfQkgobmV0LCBJQ01QX01JQl9JTkVSUk9SUyk7CiAJCXJldHVybjsKIAl9CkBAIC0yNDAsNiArMjY2LDkgQEAKIAkJaW5ldF90d3NrX3B1dChpbmV0X3R3c2soc2spKTsKIAkJcmV0dXJuOwogCX0KKwlzZXEgPSBkY2NwX2hkcl9zZXEoZGgpOworCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9ORVdfU1lOX1JFQ1YpCisJCXJldHVybiBkY2NwX3JlcV9lcnIoc2ssIHNlcSk7CiAKIAliaF9sb2NrX3NvY2soc2spOwogCS8qIElmIHRvbyBtYW55IElDTVBzIGdldCBkcm9wcGVkIG9uIGJ1c3kKQEAgLTI1Miw3ICsyODEsNiBAQAogCQlnb3RvIG91dDsKIAogCWRwID0gZGNjcF9zayhzayk7Ci0Jc2VxID0gZGNjcF9oZHJfc2VxKGRoKTsKIAlpZiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmIH4oRENDUEZfUkVRVUVTVElORyB8IERDQ1BGX0xJU1RFTikgJiYKIAkgICAgIWJldHdlZW40OChzZXEsIGRwLT5kY2Nwc19hd2wsIGRwLT5kY2Nwc19hd2gpKSB7CiAJCU5FVF9JTkNfU1RBVFNfQkgobmV0LCBMSU5VWF9NSUJfT1VUT0ZXSU5ET1dJQ01QUyk7CkBAIC0yODksMzUgKzMxNyw2IEBACiAJfQogCiAJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKLQkJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxICwgKipwcmV2OwotCWNhc2UgRENDUF9MSVNURU46Ci0JCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKQotCQkJZ290byBvdXQ7Ci0JCXJlcSA9IGluZXRfY3NrX3NlYXJjaF9yZXEoc2ssICZwcmV2LCBkaC0+ZGNjcGhfZHBvcnQsCi0JCQkJCSAgaXBoLT5kYWRkciwgaXBoLT5zYWRkcik7Ci0JCWlmICghcmVxKQotCQkJZ290byBvdXQ7Ci0KLQkJLyoKLQkJICogSUNNUHMgYXJlIG5vdCBiYWNrbG9nZ2VkLCBoZW5jZSB3ZSBjYW5ub3QgZ2V0IGFuIGVzdGFibGlzaGVkCi0JCSAqIHNvY2tldCBoZXJlLgotCQkgKi8KLQkJV0FSTl9PTihyZXEtPnNrKTsKLQotCQlpZiAoIWJldHdlZW40OChzZXEsIGRjY3BfcnNrKHJlcSktPmRyZXFfaXNzLAotCQkJCSAgICBkY2NwX3JzayhyZXEpLT5kcmVxX2dzcykpIHsKLQkJCU5FVF9JTkNfU1RBVFNfQkgobmV0LCBMSU5VWF9NSUJfT1VUT0ZXSU5ET1dJQ01QUyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCQkvKgotCQkgKiBTdGlsbCBpbiBSRVNQT05ELCBqdXN0IHJlbW92ZSBpdCBzaWxlbnRseS4KLQkJICogVGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gcGFzcyB0aGUgZXJyb3IgdG8gdGhlIG5ld2x5Ci0JCSAqIGNyZWF0ZWQgc29ja2V0LCBhbmQgUE9TSVggZG9lcyBub3Qgd2FudCBuZXR3b3JrCi0JCSAqIGVycm9ycyByZXR1cm5lZCBmcm9tIGFjY2VwdCgpLgotCQkgKi8KLQkJaW5ldF9jc2tfcmVxc2tfcXVldWVfZHJvcChzaywgcmVxLCBwcmV2KTsKLQkJZ290byBvdXQ7Ci0KIAljYXNlIERDQ1BfUkVRVUVTVElORzoKIAljYXNlIERDQ1BfUkVTUE9ORDoKIAkJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CkBAIC00MDgsOCArNDA3LDggQEAKIAogCW5ld2luZXQJCSAgID0gaW5ldF9zayhuZXdzayk7CiAJaXJlcQkJICAgPSBpbmV0X3JzayhyZXEpOwotCW5ld2luZXQtPmluZXRfZGFkZHIJPSBpcmVxLT5pcl9ybXRfYWRkcjsKLQluZXdpbmV0LT5pbmV0X3Jjdl9zYWRkciA9IGlyZXEtPmlyX2xvY19hZGRyOworCXNrX2RhZGRyX3NldChuZXdzaywgaXJlcS0+aXJfcm10X2FkZHIpOworCXNrX3Jjdl9zYWRkcl9zZXQobmV3c2ssIGlyZXEtPmlyX2xvY19hZGRyKTsKIAluZXdpbmV0LT5pbmV0X3NhZGRyCT0gaXJlcS0+aXJfbG9jX2FkZHI7CiAJbmV3aW5ldC0+aW5ldF9vcHQJPSBpcmVxLT5vcHQ7CiAJaXJlcS0+b3B0CSAgID0gTlVMTDsKQEAgLTQ0OSwxNCArNDQ4LDE0IEBACiAJY29uc3Qgc3RydWN0IGRjY3BfaGRyICpkaCA9IGRjY3BfaGRyKHNrYik7CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlzdHJ1Y3Qgc29jayAqbnNrOwotCXN0cnVjdCByZXF1ZXN0X3NvY2sgKipwcmV2OwogCS8qIEZpbmQgcG9zc2libGUgY29ubmVjdGlvbiByZXF1ZXN0cy4gKi8KLQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEgPSBpbmV0X2Nza19zZWFyY2hfcmVxKHNrLCAmcHJldiwKLQkJCQkJCSAgICAgICBkaC0+ZGNjcGhfc3BvcnQsCisJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxID0gaW5ldF9jc2tfc2VhcmNoX3JlcShzaywgZGgtPmRjY3BoX3Nwb3J0LAogCQkJCQkJICAgICAgIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIpOwotCWlmIChyZXEgIT0gTlVMTCkKLQkJcmV0dXJuIGRjY3BfY2hlY2tfcmVxKHNrLCBza2IsIHJlcSwgcHJldik7Ci0KKwlpZiAocmVxKSB7CisJCW5zayA9IGRjY3BfY2hlY2tfcmVxKHNrLCBza2IsIHJlcSk7CisJCXJlcXNrX3B1dChyZXEpOworCQlyZXR1cm4gbnNrOworCX0KIAluc2sgPSBpbmV0X2xvb2t1cF9lc3RhYmxpc2hlZChzb2NrX25ldChzayksICZkY2NwX2hhc2hpbmZvLAogCQkJCSAgICAgIGlwaC0+c2FkZHIsIGRoLT5kY2NwaF9zcG9ydCwKIAkJCQkgICAgICBpcGgtPmRhZGRyLCBkaC0+ZGNjcGhfZHBvcnQsCkBAIC01NzUsNyArNTc0LDcgQEAKIAlrZnJlZShpbmV0X3JzayhyZXEpLT5vcHQpOwogfQogCi12b2lkIGRjY3Bfc3luX2Fja190aW1lb3V0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQordm9pZCBkY2NwX3N5bl9hY2tfdGltZW91dChjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCiB7CiB9CiBFWFBPUlRfU1lNQk9MKGRjY3Bfc3luX2Fja190aW1lb3V0KTsKQEAgLTYyNCw3ICs2MjMsNyBAQAogCWlmIChza19hY2NlcHRxX2lzX2Z1bGwoc2spICYmIGluZXRfY3NrX3JlcXNrX3F1ZXVlX3lvdW5nKHNrKSA+IDEpCiAJCWdvdG8gZHJvcDsKIAotCXJlcSA9IGluZXRfcmVxc2tfYWxsb2MoJmRjY3BfcmVxdWVzdF9zb2NrX29wcyk7CisJcmVxID0gaW5ldF9yZXFza19hbGxvYygmZGNjcF9yZXF1ZXN0X3NvY2tfb3BzLCBzayk7CiAJaWYgKHJlcSA9PSBOVUxMKQogCQlnb3RvIGRyb3A7CiAKQEAgLTYzOSw4ICs2MzgsMTAgQEAKIAkJZ290byBkcm9wX2FuZF9mcmVlOwogCiAJaXJlcSA9IGluZXRfcnNrKHJlcSk7Ci0JaXJlcS0+aXJfbG9jX2FkZHIgPSBpcF9oZHIoc2tiKS0+ZGFkZHI7Ci0JaXJlcS0+aXJfcm10X2FkZHIgPSBpcF9oZHIoc2tiKS0+c2FkZHI7CisJc2tfcmN2X3NhZGRyX3NldChyZXFfdG9fc2socmVxKSwgaXBfaGRyKHNrYiktPmRhZGRyKTsKKwlza19kYWRkcl9zZXQocmVxX3RvX3NrKHJlcSksIGlwX2hkcihza2IpLT5zYWRkcik7CisJaXJlcS0+aXJlcV9mYW1pbHkgPSBBRl9JTkVUOworCWlyZXEtPmlyX2lpZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7CiAKIAkvKgogCSAqIFN0ZXAgMzogUHJvY2VzcyBMSVNURU4gc3RhdGUKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lwdjYuYyBiL25ldC9kY2NwL2lwdjYuYwppbmRleCA2YmNhYTMzLi45ZDA1NTEwIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pcHY2LmMKKysrIGIvbmV0L2RjY3AvaXB2Ni5jCkBAIC00MCwxOSArNDAsNiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29ja19hZl9vcHMgZGNjcF9pcHY2X21hcHBlZDsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2tfYWZfb3BzIGRjY3BfaXB2Nl9hZl9vcHM7CiAKLXN0YXRpYyB2b2lkIGRjY3BfdjZfaGFzaChzdHJ1Y3Qgc29jayAqc2spCi17Ci0JaWYgKHNrLT5za19zdGF0ZSAhPSBEQ0NQX0NMT1NFRCkgewotCQlpZiAoaW5ldF9jc2soc2spLT5pY3NrX2FmX29wcyA9PSAmZGNjcF9pcHY2X21hcHBlZCkgewotCQkJaW5ldF9oYXNoKHNrKTsKLQkJCXJldHVybjsKLQkJfQotCQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JCV9faW5ldDZfaGFzaChzaywgTlVMTCk7Ci0JCWxvY2FsX2JoX2VuYWJsZSgpOwotCX0KLX0KLQogLyogYWRkIHBzZXVkby1oZWFkZXIgdG8gRENDUCBjaGVja3N1bSBzdG9yZWQgaW4gc2tiLT5jc3VtICovCiBzdGF0aWMgaW5saW5lIF9fc3VtMTYgZGNjcF92Nl9jc3VtX2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCkBAIC05OCwxMSArODUsMTIgQEAKIAkJcmV0dXJuOwogCX0KIAotCXNrID0gaW5ldDZfbG9va3VwKG5ldCwgJmRjY3BfaGFzaGluZm8sCi0JCQkmaGRyLT5kYWRkciwgZGgtPmRjY3BoX2Rwb3J0LAotCQkJJmhkci0+c2FkZHIsIGRoLT5kY2NwaF9zcG9ydCwgaW5ldDZfaWlmKHNrYikpOworCXNrID0gX19pbmV0Nl9sb29rdXBfZXN0YWJsaXNoZWQobmV0LCAmZGNjcF9oYXNoaW5mbywKKwkJCQkJJmhkci0+ZGFkZHIsIGRoLT5kY2NwaF9kcG9ydCwKKwkJCQkJJmhkci0+c2FkZHIsIG50b2hzKGRoLT5kY2NwaF9zcG9ydCksCisJCQkJCWluZXQ2X2lpZihza2IpKTsKIAotCWlmIChzayA9PSBOVUxMKSB7CisJaWYgKCFzaykgewogCQlJQ01QNl9JTkNfU1RBVFNfQkgobmV0LCBfX2luNl9kZXZfZ2V0KHNrYi0+ZGV2KSwKIAkJCQkgICBJQ01QNl9NSUJfSU5FUlJPUlMpOwogCQlyZXR1cm47CkBAIC0xMTIsNiArMTAwLDkgQEAKIAkJaW5ldF90d3NrX3B1dChpbmV0X3R3c2soc2spKTsKIAkJcmV0dXJuOwogCX0KKwlzZXEgPSBkY2NwX2hkcl9zZXEoZGgpOworCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9ORVdfU1lOX1JFQ1YpCisJCXJldHVybiBkY2NwX3JlcV9lcnIoc2ssIHNlcSk7CiAKIAliaF9sb2NrX3NvY2soc2spOwogCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKQpAQCAtMTIxLDcgKzExMiw2IEBACiAJCWdvdG8gb3V0OwogCiAJZHAgPSBkY2NwX3NrKHNrKTsKLQlzZXEgPSBkY2NwX2hkcl9zZXEoZGgpOwogCWlmICgoMSA8PCBzay0+c2tfc3RhdGUpICYgfihEQ0NQRl9SRVFVRVNUSU5HIHwgRENDUEZfTElTVEVOKSAmJgogCSAgICAhYmV0d2VlbjQ4KHNlcSwgZHAtPmRjY3BzX2F3bCwgZHAtPmRjY3BzX2F3aCkpIHsKIAkJTkVUX0lOQ19TVEFUU19CSChuZXQsIExJTlVYX01JQl9PVVRPRldJTkRPV0lDTVBTKTsKQEAgLTE2MiwzMiArMTUyLDYgQEAKIAogCS8qIE1pZ2h0IGJlIGZvciBhbiByZXF1ZXN0X3NvY2sgKi8KIAlzd2l0Y2ggKHNrLT5za19zdGF0ZSkgewotCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsICoqcHJldjsKLQljYXNlIERDQ1BfTElTVEVOOgotCQlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkKLQkJCWdvdG8gb3V0OwotCi0JCXJlcSA9IGluZXQ2X2Nza19zZWFyY2hfcmVxKHNrLCAmcHJldiwgZGgtPmRjY3BoX2Rwb3J0LAotCQkJCQkgICAmaGRyLT5kYWRkciwgJmhkci0+c2FkZHIsCi0JCQkJCSAgIGluZXQ2X2lpZihza2IpKTsKLQkJaWYgKHJlcSA9PSBOVUxMKQotCQkJZ290byBvdXQ7Ci0KLQkJLyoKLQkJICogSUNNUHMgYXJlIG5vdCBiYWNrbG9nZ2VkLCBoZW5jZSB3ZSBjYW5ub3QgZ2V0IGFuIGVzdGFibGlzaGVkCi0JCSAqIHNvY2tldCBoZXJlLgotCQkgKi8KLQkJV0FSTl9PTihyZXEtPnNrICE9IE5VTEwpOwotCi0JCWlmICghYmV0d2VlbjQ4KHNlcSwgZGNjcF9yc2socmVxKS0+ZHJlcV9pc3MsCi0JCQkJICAgIGRjY3BfcnNrKHJlcSktPmRyZXFfZ3NzKSkgewotCQkJTkVUX0lOQ19TVEFUU19CSChuZXQsIExJTlVYX01JQl9PVVRPRldJTkRPV0lDTVBTKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaW5ldF9jc2tfcmVxc2tfcXVldWVfZHJvcChzaywgcmVxLCBwcmV2KTsKLQkJZ290byBvdXQ7Ci0KIAljYXNlIERDQ1BfUkVRVUVTVElORzoKIAljYXNlIERDQ1BfUkVTUE9ORDogIC8qIENhbm5vdCBoYXBwZW4uCiAJCQkgICAgICAgSXQgY2FuLCBpdCBTWU5zIGFyZSBjcm9zc2VkLiAtLUFOSyAqLwpAQCAtMzMwLDE3ICsyOTQsMTYgQEAKIHsKIAljb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoID0gZGNjcF9oZHIoc2tiKTsKIAljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKKwlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXE7CiAJc3RydWN0IHNvY2sgKm5zazsKLQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqcHJldjsKLQkvKiBGaW5kIHBvc3NpYmxlIGNvbm5lY3Rpb24gcmVxdWVzdHMuICovCi0Jc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxID0gaW5ldDZfY3NrX3NlYXJjaF9yZXEoc2ssICZwcmV2LAotCQkJCQkJCWRoLT5kY2NwaF9zcG9ydCwKLQkJCQkJCQkmaXBoLT5zYWRkciwKLQkJCQkJCQkmaXBoLT5kYWRkciwKLQkJCQkJCQlpbmV0Nl9paWYoc2tiKSk7Ci0JaWYgKHJlcSAhPSBOVUxMKQotCQlyZXR1cm4gZGNjcF9jaGVja19yZXEoc2ssIHNrYiwgcmVxLCBwcmV2KTsKIAorCXJlcSA9IGluZXQ2X2Nza19zZWFyY2hfcmVxKHNrLCBkaC0+ZGNjcGhfc3BvcnQsICZpcGgtPnNhZGRyLAorCQkJCSAgICZpcGgtPmRhZGRyLCBpbmV0Nl9paWYoc2tiKSk7CisJaWYgKHJlcSkgeworCQluc2sgPSBkY2NwX2NoZWNrX3JlcShzaywgc2tiLCByZXEpOworCQlyZXFza19wdXQocmVxKTsKKwkJcmV0dXJuIG5zazsKKwl9CiAJbnNrID0gX19pbmV0Nl9sb29rdXBfZXN0YWJsaXNoZWQoc29ja19uZXQoc2spLCAmZGNjcF9oYXNoaW5mbywKIAkJCQkJICZpcGgtPnNhZGRyLCBkaC0+ZGNjcGhfc3BvcnQsCiAJCQkJCSAmaXBoLT5kYWRkciwgbnRvaHMoZGgtPmRjY3BoX2Rwb3J0KSwKQEAgLTM4Niw3ICszNDksNyBAQAogCWlmIChza19hY2NlcHRxX2lzX2Z1bGwoc2spICYmIGluZXRfY3NrX3JlcXNrX3F1ZXVlX3lvdW5nKHNrKSA+IDEpCiAJCWdvdG8gZHJvcDsKIAotCXJlcSA9IGluZXRfcmVxc2tfYWxsb2MoJmRjY3A2X3JlcXVlc3Rfc29ja19vcHMpOworCXJlcSA9IGluZXRfcmVxc2tfYWxsb2MoJmRjY3A2X3JlcXVlc3Rfc29ja19vcHMsIHNrKTsKIAlpZiAocmVxID09IE5VTEwpCiAJCWdvdG8gZHJvcDsKIApAQCAtNDAzLDYgKzM2Niw3IEBACiAJaXJlcSA9IGluZXRfcnNrKHJlcSk7CiAJaXJlcS0+aXJfdjZfcm10X2FkZHIgPSBpcHY2X2hkcihza2IpLT5zYWRkcjsKIAlpcmVxLT5pcl92Nl9sb2NfYWRkciA9IGlwdjZfaGRyKHNrYiktPmRhZGRyOworCWlyZXEtPmlyZXFfZmFtaWx5ID0gQUZfSU5FVDY7CiAKIAlpZiAoaXB2Nl9vcHRfYWNjZXB0ZWQoc2ssIHNrYiwgSVA2Q0Ioc2tiKSkgfHwKIAkgICAgbnAtPnJ4b3B0LmJpdHMucnhpbmZvIHx8IG5wLT5yeG9wdC5iaXRzLnJ4b2luZm8gfHwKQEAgLTQ2OSwxMSArNDMzLDcgQEAKIAogCQltZW1jcHkobmV3bnAsIG5wLCBzaXplb2Yoc3RydWN0IGlwdjZfcGluZm8pKTsKIAotCQlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKG5ld2luZXQtPmluZXRfZGFkZHIsICZuZXdzay0+c2tfdjZfZGFkZHIpOwotCi0JCWlwdjZfYWRkcl9zZXRfdjRtYXBwZWQobmV3aW5ldC0+aW5ldF9zYWRkciwgJm5ld25wLT5zYWRkcik7Ci0KLQkJbmV3c2stPnNrX3Y2X3Jjdl9zYWRkciA9IG5ld25wLT5zYWRkcjsKKwkJbmV3bnAtPnNhZGRyID0gbmV3c2stPnNrX3Y2X3Jjdl9zYWRkcjsKIAogCQlpbmV0X2NzayhuZXdzayktPmljc2tfYWZfb3BzID0gJmRjY3BfaXB2Nl9tYXBwZWQ7CiAJCW5ld3NrLT5za19iYWNrbG9nX3JjdiA9IGRjY3BfdjRfZG9fcmN2OwpAQCAtNTkxLDcgKzU1MSw3IEBACiAJCWRjY3BfZG9uZShuZXdzayk7CiAJCWdvdG8gb3V0OwogCX0KLQlfX2luZXQ2X2hhc2gobmV3c2ssIE5VTEwpOworCV9faW5ldF9oYXNoKG5ld3NrLCBOVUxMKTsKIAogCXJldHVybiBuZXdzazsKIApAQCAtOTE2LDkgKzg3Niw3IEBACiAJCQlzay0+c2tfYmFja2xvZ19yY3YgPSBkY2NwX3Y2X2RvX3JjdjsKIAkJCWdvdG8gZmFpbHVyZTsKIAkJfQotCQlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKGluZXQtPmluZXRfc2FkZHIsICZucC0+c2FkZHIpOwotCQlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKGluZXQtPmluZXRfcmN2X3NhZGRyLCAmc2stPnNrX3Y2X3Jjdl9zYWRkcik7Ci0KKwkJbnAtPnNhZGRyID0gc2stPnNrX3Y2X3Jjdl9zYWRkcjsKIAkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTEwNjEsNyArMTAxOSw3IEBACiAJLnNlbmRtc2cJICAgPSBkY2NwX3NlbmRtc2csCiAJLnJlY3Ztc2cJICAgPSBkY2NwX3JlY3Ztc2csCiAJLmJhY2tsb2dfcmN2CSAgID0gZGNjcF92Nl9kb19yY3YsCi0JLmhhc2gJCSAgID0gZGNjcF92Nl9oYXNoLAorCS5oYXNoCQkgICA9IGluZXRfaGFzaCwKIAkudW5oYXNoCQkgICA9IGluZXRfdW5oYXNoLAogCS5hY2NlcHQJCSAgID0gaW5ldF9jc2tfYWNjZXB0LAogCS5nZXRfcG9ydAkgICA9IGluZXRfY3NrX2dldF9wb3J0LApkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvbWluaXNvY2tzLmMgYi9uZXQvZGNjcC9taW5pc29ja3MuYwppbmRleCBiNTBkYzQzLi41ZjU2NjY2IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9taW5pc29ja3MuYworKysgYi9uZXQvZGNjcC9taW5pc29ja3MuYwpAQCAtMjcsMjggKzI3LDE2IEBACiAKIHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyBkY2NwX2RlYXRoX3JvdyA9IHsKIAkuc3lzY3RsX21heF90d19idWNrZXRzID0gTlJfRklMRSAqIDIsCi0JLnBlcmlvZAkJPSBEQ0NQX1RJTUVXQUlUX0xFTiAvIElORVRfVFdEUl9UV0tJTExfU0xPVFMsCi0JLmRlYXRoX2xvY2sJPSBfX1NQSU5fTE9DS19VTkxPQ0tFRChkY2NwX2RlYXRoX3Jvdy5kZWF0aF9sb2NrKSwKIAkuaGFzaGluZm8JPSAmZGNjcF9oYXNoaW5mbywKLQkudHdfdGltZXIJPSBUSU1FUl9JTklUSUFMSVpFUihpbmV0X3R3ZHJfaGFuZ21hbiwgMCwKLQkJCQkJICAgICh1bnNpZ25lZCBsb25nKSZkY2NwX2RlYXRoX3JvdyksCi0JLnR3a2lsbF93b3JrCT0gX19XT1JLX0lOSVRJQUxJWkVSKGRjY3BfZGVhdGhfcm93LnR3a2lsbF93b3JrLAotCQkJCQkgICAgIGluZXRfdHdkcl90d2tpbGxfd29yayksCi0vKiBTaG9ydC10aW1lIHRpbWV3YWl0IGNhbGVuZGFyICovCi0KLQkudHdjYWxfaGFuZAk9IC0xLAotCS50d2NhbF90aW1lcgk9IFRJTUVSX0lOSVRJQUxJWkVSKGluZXRfdHdkcl90d2NhbF90aWNrLCAwLAotCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpJmRjY3BfZGVhdGhfcm93KSwKIH07CiAKIEVYUE9SVF9TWU1CT0xfR1BMKGRjY3BfZGVhdGhfcm93KTsKIAogdm9pZCBkY2NwX3RpbWVfd2FpdChzdHJ1Y3Qgc29jayAqc2ssIGludCBzdGF0ZSwgaW50IHRpbWVvKQogewotCXN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3ID0gTlVMTDsKKwlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dzsKIAotCWlmIChkY2NwX2RlYXRoX3Jvdy50d19jb3VudCA8IGRjY3BfZGVhdGhfcm93LnN5c2N0bF9tYXhfdHdfYnVja2V0cykKLQkJdHcgPSBpbmV0X3R3c2tfYWxsb2Moc2ssIHN0YXRlKTsKKwl0dyA9IGluZXRfdHdza19hbGxvYyhzaywgJmRjY3BfZGVhdGhfcm93LCBzdGF0ZSk7CiAKIAlpZiAodHcgIT0gTlVMTCkgewogCQljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CkBAIC03MSw4ICs1OSw3IEBACiAJCWlmIChzdGF0ZSA9PSBEQ0NQX1RJTUVfV0FJVCkKIAkJCXRpbWVvID0gRENDUF9USU1FV0FJVF9MRU47CiAKLQkJaW5ldF90d3NrX3NjaGVkdWxlKHR3LCAmZGNjcF9kZWF0aF9yb3csIHRpbWVvLAotCQkJCSAgIERDQ1BfVElNRVdBSVRfTEVOKTsKKwkJaW5ldF90d3NrX3NjaGVkdWxlKHR3LCB0aW1lbyk7CiAJCWluZXRfdHdza19wdXQodHcpOwogCX0gZWxzZSB7CiAJCS8qIFNvcnJ5LCBpZiB3ZSdyZSBvdXQgb2YgbWVtb3J5LCBqdXN0IENMT1NFIHRoaXMKQEAgLTE1Miw4ICsxMzksNyBAQAogICogYXMgYW4gcmVxdWVzdF9zb2NrLgogICovCiBzdHJ1Y3Qgc29jayAqZGNjcF9jaGVja19yZXEoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKLQkJCSAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqcHJldikKKwkJCSAgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCiB7CiAJc3RydWN0IHNvY2sgKmNoaWxkID0gTlVMTDsKIAlzdHJ1Y3QgZGNjcF9yZXF1ZXN0X3NvY2sgKmRyZXEgPSBkY2NwX3JzayhyZXEpOwpAQCAtMjAwLDcgKzE4Niw3IEBACiAJaWYgKGNoaWxkID09IE5VTEwpCiAJCWdvdG8gbGlzdGVuX292ZXJmbG93OwogCi0JaW5ldF9jc2tfcmVxc2tfcXVldWVfdW5saW5rKHNrLCByZXEsIHByZXYpOworCWluZXRfY3NrX3JlcXNrX3F1ZXVlX3VubGluayhzaywgcmVxKTsKIAlpbmV0X2Nza19yZXFza19xdWV1ZV9yZW1vdmVkKHNrLCByZXEpOwogCWluZXRfY3NrX3JlcXNrX3F1ZXVlX2FkZChzaywgcmVxLCBjaGlsZCk7CiBvdXQ6CkBAIC0yMTIsNyArMTk4LDcgQEAKIAlpZiAoZGNjcF9oZHIoc2tiKS0+ZGNjcGhfdHlwZSAhPSBEQ0NQX1BLVF9SRVNFVCkKIAkJcmVxLT5yc2tfb3BzLT5zZW5kX3Jlc2V0KHNrLCBza2IpOwogCi0JaW5ldF9jc2tfcmVxc2tfcXVldWVfZHJvcChzaywgcmVxLCBwcmV2KTsKKwlpbmV0X2Nza19yZXFza19xdWV1ZV9kcm9wKHNrLCByZXEpOwogCWdvdG8gb3V0OwogfQogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9wcm9iZS5jIGIvbmV0L2RjY3AvcHJvYmUuYwppbmRleCA1OTVkZGYwLi5kODM0NmQwIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9wcm9iZS5jCisrKyBiL25ldC9kY2NwL3Byb2JlLmMKQEAgLTcyLDggKzcyLDcgQEAKIAl3YWtlX3VwKCZkY2Nwdy53YWl0KTsKIH0KIAotc3RhdGljIGludCBqZGNjcF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLAotCQkJIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCitzdGF0aWMgaW50IGpkY2NwX3NlbmRtc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplKQogewogCWNvbnN0IHN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlzdHJ1Y3QgY2NpZDNfaGNfdHhfc29jayAqaGMgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvcHJvdG8uYyBiL25ldC9kY2NwL3Byb3RvLmMKaW5kZXggZTE3MWI3OC4uNTJhOTQwMSAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvcHJvdG8uYworKysgYi9uZXQvZGNjcC9wcm90by5jCkBAIC03NDEsOCArNzQxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGRjY3Bfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkgc2l6ZV90IGxlbikKK2ludCBkY2NwX3NlbmRtc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CiAJY29uc3Qgc3RydWN0IGRjY3Bfc29jayAqZHAgPSBkY2NwX3NrKHNrKTsKIAljb25zdCBpbnQgZmxhZ3MgPSBtc2ctPm1zZ19mbGFnczsKQEAgLTgwNiw4ICs4MDUsOCBAQAogCiBFWFBPUlRfU1lNQk9MX0dQTChkY2NwX3NlbmRtc2cpOwogCi1pbnQgZGNjcF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCi0JCSBzaXplX3QgbGVuLCBpbnQgbm9uYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKK2ludCBkY2NwX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBub25ibG9jaywKKwkJIGludCBmbGFncywgaW50ICphZGRyX2xlbikKIHsKIAljb25zdCBzdHJ1Y3QgZGNjcF9oZHIgKmRoOwogCWxvbmcgdGltZW87CmRpZmYgLS1naXQgYS9uZXQvZGNjcC90aW1lci5jIGIvbmV0L2RjY3AvdGltZXIuYwppbmRleCAxY2Q0NmEzLi4zZWY3YWNlIDEwMDY0NAotLS0gYS9uZXQvZGNjcC90aW1lci5jCisrKyBiL25ldC9kY2NwL3RpbWVyLmMKQEAgLTE2MSwzMyArMTYxLDExIEBACiAJc29ja19wdXQoc2spOwogfQogCi0vKgotICoJVGltZXIgZm9yIGxpc3RlbmluZyBzb2NrZXRzCi0gKi8KLXN0YXRpYyB2b2lkIGRjY3BfcmVzcG9uc2VfdGltZXIoc3RydWN0IHNvY2sgKnNrKQotewotCWluZXRfY3NrX3JlcXNrX3F1ZXVlX3BydW5lKHNrLCBUQ1BfU1lOUV9JTlRFUlZBTCwgRENDUF9USU1FT1VUX0lOSVQsCi0JCQkJICAgRENDUF9SVE9fTUFYKTsKLX0KLQogc3RhdGljIHZvaWQgZGNjcF9rZWVwYWxpdmVfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKWRhdGE7CiAKLQkvKiBPbmx5IHByb2Nlc3MgaWYgc29ja2V0IGlzIG5vdCBpbiB1c2UuICovCi0JYmhfbG9ja19zb2NrKHNrKTsKLQlpZiAoc29ja19vd25lZF9ieV91c2VyKHNrKSkgewotCQkvKiBUcnkgYWdhaW4gbGF0ZXIuICovCi0JCWluZXRfY3NrX3Jlc2V0X2tlZXBhbGl2ZV90aW1lcihzaywgSFogLyAyMCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChzay0+c2tfc3RhdGUgPT0gRENDUF9MSVNURU4pIHsKLQkJZGNjcF9yZXNwb25zZV90aW1lcihzayk7Ci0JCWdvdG8gb3V0OwotCX0KLW91dDoKLQliaF91bmxvY2tfc29jayhzayk7CisJcHJfZXJyKCJkY2NwIHNob3VsZCBub3QgdXNlIGEga2VlcGFsaXZlIHRpbWVyICFcbiIpOwogCXNvY2tfcHV0KHNrKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9hZl9kZWNuZXQuYyBiL25ldC9kZWNuZXQvYWZfZGVjbmV0LmMKaW5kZXggODEwMjI4Ni4uNzU0NDg0YiAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9hZl9kZWNuZXQuYworKysgYi9uZXQvZGVjbmV0L2FmX2RlY25ldC5jCkBAIC0xNjY5LDggKzE2NjksOCBAQAogfQogCiAKLXN0YXRpYyBpbnQgZG5fcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0Jc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorc3RhdGljIGludCBkbl9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsCisJCSAgICAgIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CkBAIC0xOTA1LDggKzE5MDUsNyBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyBpbnQgZG5fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCSAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCitzdGF0aWMgaW50IGRuX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgZG5fc2NwICpzY3AgPSBETl9TSyhzayk7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX25laWdoLmMgYi9uZXQvZGVjbmV0L2RuX25laWdoLmMKaW5kZXggN2NhN2MzMS4uNDUwN2IxOCAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9uZWlnaC5jCisrKyBiL25ldC9kZWNuZXQvZG5fbmVpZ2guYwpAQCAtNDksNDEgKzQ5LDE3IEBACiAjaW5jbHVkZSA8bmV0L2RuX3JvdXRlLmg+CiAKIHN0YXRpYyBpbnQgZG5fbmVpZ2hfY29uc3RydWN0KHN0cnVjdCBuZWlnaGJvdXIgKik7Ci1zdGF0aWMgdm9pZCBkbl9sb25nX2Vycm9yX3JlcG9ydChzdHJ1Y3QgbmVpZ2hib3VyICosIHN0cnVjdCBza19idWZmICopOwotc3RhdGljIHZvaWQgZG5fc2hvcnRfZXJyb3JfcmVwb3J0KHN0cnVjdCBuZWlnaGJvdXIgKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci1zdGF0aWMgaW50IGRuX2xvbmdfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci1zdGF0aWMgaW50IGRuX3Nob3J0X291dHB1dChzdHJ1Y3QgbmVpZ2hib3VyICosIHN0cnVjdCBza19idWZmICopOwotc3RhdGljIGludCBkbl9waGFzZTNfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKiwgc3RydWN0IHNrX2J1ZmYgKik7Ci0KK3N0YXRpYyB2b2lkIGRuX25laWdoX2Vycm9yX3JlcG9ydChzdHJ1Y3QgbmVpZ2hib3VyICosIHN0cnVjdCBza19idWZmICopOworc3RhdGljIGludCBkbl9uZWlnaF9vdXRwdXQoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBza19idWZmICpza2IpOwogCiAvKgotICogRm9yIHRhbGtpbmcgdG8gYnJvYWRjYXN0IGRldmljZXM6IEV0aGVybmV0ICYgUFBQCisgKiBPcGVyYXRpb25zIGZvciBhZGRpbmcgdGhlIGxpbmsgbGF5ZXIgaGVhZGVyLgogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5laWdoX29wcyBkbl9sb25nX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmVpZ2hfb3BzIGRuX25laWdoX29wcyA9IHsKIAkuZmFtaWx5ID0JCUFGX0RFQ25ldCwKLQkuZXJyb3JfcmVwb3J0ID0JCWRuX2xvbmdfZXJyb3JfcmVwb3J0LAotCS5vdXRwdXQgPQkJZG5fbG9uZ19vdXRwdXQsCi0JLmNvbm5lY3RlZF9vdXRwdXQgPQlkbl9sb25nX291dHB1dCwKLX07Ci0KLS8qCi0gKiBGb3IgdGFsa2luZyB0byBwb2ludG9wb2ludCBhbmQgbXVsdGlkcm9wIGRldmljZXM6IEREQ01QIGFuZCBYLjI1Ci0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmVpZ2hfb3BzIGRuX3Nob3J0X29wcyA9IHsKLQkuZmFtaWx5ID0JCUFGX0RFQ25ldCwKLQkuZXJyb3JfcmVwb3J0ID0JCWRuX3Nob3J0X2Vycm9yX3JlcG9ydCwKLQkub3V0cHV0ID0JCWRuX3Nob3J0X291dHB1dCwKLQkuY29ubmVjdGVkX291dHB1dCA9CWRuX3Nob3J0X291dHB1dCwKLX07Ci0KLS8qCi0gKiBGb3IgdGFsa2luZyB0byBERUNuZXQgcGhhc2UgSUlJIG5vZGVzCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbmVpZ2hfb3BzIGRuX3BoYXNlM19vcHMgPSB7Ci0JLmZhbWlseSA9CQlBRl9ERUNuZXQsCi0JLmVycm9yX3JlcG9ydCA9CQlkbl9zaG9ydF9lcnJvcl9yZXBvcnQsIC8qIENhbiB1c2Ugc2hvcnQgdmVyc2lvbiBoZXJlICovCi0JLm91dHB1dCA9CQlkbl9waGFzZTNfb3V0cHV0LAotCS5jb25uZWN0ZWRfb3V0cHV0ID0JZG5fcGhhc2UzX291dHB1dCwKKwkuZXJyb3JfcmVwb3J0ID0JCWRuX25laWdoX2Vycm9yX3JlcG9ydCwKKwkub3V0cHV0ID0JCWRuX25laWdoX291dHB1dCwKKwkuY29ubmVjdGVkX291dHB1dCA9CWRuX25laWdoX291dHB1dCwKIH07CiAKIHN0YXRpYyB1MzIgZG5fbmVpZ2hfaGFzaChjb25zdCB2b2lkICpwa2V5LApAQCAtOTMsMTEgKzY5LDE4IEBACiAJcmV0dXJuIGpoYXNoXzJ3b3JkcygqKF9fdTE2ICopcGtleSwgMCwgaGFzaF9ybmRbMF0pOwogfQogCitzdGF0aWMgYm9vbCBkbl9rZXlfZXEoY29uc3Qgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIGNvbnN0IHZvaWQgKnBrZXkpCit7CisJcmV0dXJuIG5laWdoX2tleV9lcTE2KG5laWdoLCBwa2V5KTsKK30KKwogc3RydWN0IG5laWdoX3RhYmxlIGRuX25laWdoX3RhYmxlID0gewogCS5mYW1pbHkgPQkJCVBGX0RFQ25ldCwKIAkuZW50cnlfc2l6ZSA9CQkJTkVJR0hfRU5UUllfU0laRShzaXplb2Yoc3RydWN0IGRuX25laWdoKSksCiAJLmtleV9sZW4gPQkJCXNpemVvZihfX2xlMTYpLAorCS5wcm90b2NvbCA9CQkJY3B1X3RvX2JlMTYoRVRIX1BfRE5BX1JUKSwKIAkuaGFzaCA9CQkJCWRuX25laWdoX2hhc2gsCisJLmtleV9lcSA9CQkJZG5fa2V5X2VxLAogCS5jb25zdHJ1Y3RvciA9CQkJZG5fbmVpZ2hfY29uc3RydWN0LAogCS5pZCA9CQkJCSJkbl9uZWlnaF9jYWNoZSIsCiAJLnBhcm1zID17CkBAIC0xNDYsMTYgKzEyOSw5IEBACiAKIAlfX25laWdoX3Bhcm1zX3B1dChuZWlnaC0+cGFybXMpOwogCW5laWdoLT5wYXJtcyA9IG5laWdoX3Bhcm1zX2Nsb25lKHBhcm1zKTsKLQotCWlmIChkbl9kYi0+dXNlX2xvbmcpCi0JCW5laWdoLT5vcHMgPSAmZG5fbG9uZ19vcHM7Ci0JZWxzZQotCQluZWlnaC0+b3BzID0gJmRuX3Nob3J0X29wczsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCWlmIChkbi0+ZmxhZ3MgJiBETl9OREZMQUdfUDMpCi0JCW5laWdoLT5vcHMgPSAmZG5fcGhhc2UzX29wczsKLQorCW5laWdoLT5vcHMgPSAmZG5fbmVpZ2hfb3BzOwogCW5laWdoLT5udWRfc3RhdGUgPSBOVURfTk9BUlA7CiAJbmVpZ2gtPm91dHB1dCA9IG5laWdoLT5vcHMtPmNvbm5lY3RlZF9vdXRwdXQ7CiAKQEAgLTE4NywyNCArMTYzLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRuX2xvbmdfZXJyb3JfcmVwb3J0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgZG5fbmVpZ2hfZXJyb3JfcmVwb3J0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXByaW50ayhLRVJOX0RFQlVHICJkbl9sb25nX2Vycm9yX3JlcG9ydDogY2FsbGVkXG4iKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiZG5fbmVpZ2hfZXJyb3JfcmVwb3J0OiBjYWxsZWRcbiIpOwogCWtmcmVlX3NrYihza2IpOwogfQogCi0KLXN0YXRpYyB2b2lkIGRuX3Nob3J0X2Vycm9yX3JlcG9ydChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlwcmludGsoS0VSTl9ERUJVRyAiZG5fc2hvcnRfZXJyb3JfcmVwb3J0OiBjYWxsZWRcbiIpOwotCWtmcmVlX3NrYihza2IpOwotfQotCi1zdGF0aWMgaW50IGRuX25laWdoX291dHB1dF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgZG5fbmVpZ2hfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKIAlzdHJ1Y3QgZG5fcm91dGUgKnJ0ID0gKHN0cnVjdCBkbl9yb3V0ZSAqKWRzdDsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IHJ0LT5uOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OwogCWNoYXIgbWFjX2FkZHJbRVRIX0FMRU5dOwogCXVuc2lnbmVkIGludCBzZXE7CkBAIC0yMjYsNyArMTk0LDIwIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBkbl9sb25nX291dHB1dChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgZG5fbmVpZ2hfb3V0cHV0X3BhY2tldChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOworCXN0cnVjdCBkbl9yb3V0ZSAqcnQgPSAoc3RydWN0IGRuX3JvdXRlICopZHN0OworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gcnQtPm47CisKKwlyZXR1cm4gbmVpZ2gtPm91dHB1dChuZWlnaCwgc2tiKTsKK30KKworLyoKKyAqIEZvciB0YWxraW5nIHRvIGJyb2FkY2FzdCBkZXZpY2VzOiBFdGhlcm5ldCAmIFBQUAorICovCitzdGF0aWMgaW50IGRuX2xvbmdfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CiAJaW50IGhlYWRyb29tID0gZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyBzaXplb2Yoc3RydWN0IGRuX2xvbmdfcGFja2V0KSArIDM7CkBAIC0yNjUsMTEgKzI0NiwxNSBAQAogCiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKLQlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0RFQ05FVCwgTkZfRE5fUE9TVF9ST1VUSU5HLCBza2IsIE5VTEwsCi0JCSAgICAgICBuZWlnaC0+ZGV2LCBkbl9uZWlnaF9vdXRwdXRfcGFja2V0KTsKKwlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0RFQ05FVCwgTkZfRE5fUE9TVF9ST1VUSU5HLCBzaywgc2tiLAorCQkgICAgICAgTlVMTCwgbmVpZ2gtPmRldiwgZG5fbmVpZ2hfb3V0cHV0X3BhY2tldCk7CiB9CiAKLXN0YXRpYyBpbnQgZG5fc2hvcnRfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorLyoKKyAqIEZvciB0YWxraW5nIHRvIHBvaW50b3BvaW50IGFuZCBtdWx0aWRyb3AgZGV2aWNlczogRERDTVAgYW5kIFguMjUKKyAqLworc3RhdGljIGludCBkbl9zaG9ydF9vdXRwdXQoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBzb2NrICpzaywKKwkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG5laWdoLT5kZXY7CiAJaW50IGhlYWRyb29tID0gZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyBzaXplb2Yoc3RydWN0IGRuX3Nob3J0X3BhY2tldCkgKyAyOwpAQCAtMzAxLDE1ICsyODYsMTcgQEAKIAogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCi0JcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX1BPU1RfUk9VVElORywgc2tiLCBOVUxMLAotCQkgICAgICAgbmVpZ2gtPmRldiwgZG5fbmVpZ2hfb3V0cHV0X3BhY2tldCk7CisJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX1BPU1RfUk9VVElORywgc2ssIHNrYiwKKwkJICAgICAgIE5VTEwsIG5laWdoLT5kZXYsIGRuX25laWdoX291dHB1dF9wYWNrZXQpOwogfQogCiAvKgotICogUGhhc2UgMyBvdXRwdXQgaXMgdGhlIHNhbWUgaXMgc2hvcnQgb3V0cHV0LCBleGVjcHQgdGhhdAorICogRm9yIHRhbGtpbmcgdG8gREVDbmV0IHBoYXNlIElJSSBub2RlcworICogUGhhc2UgMyBvdXRwdXQgaXMgdGhlIHNhbWUgYXMgc2hvcnQgb3V0cHV0LCBleGVjcHQgdGhhdAogICogaXQgY2xlYXJzIHRoZSBhcmVhIGJpdHMgYmVmb3JlIHRyYW5zbWlzc2lvbi4KICAqLwotc3RhdGljIGludCBkbl9waGFzZTNfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBkbl9waGFzZTNfb3V0cHV0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKIAlpbnQgaGVhZHJvb20gPSBkZXYtPmhhcmRfaGVhZGVyX2xlbiArIHNpemVvZihzdHJ1Y3QgZG5fc2hvcnRfcGFja2V0KSArIDI7CkBAIC0zNDAsOCArMzI3LDM0IEBACiAKIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAotCXJldHVybiBORl9IT09LKE5GUFJPVE9fREVDTkVULCBORl9ETl9QT1NUX1JPVVRJTkcsIHNrYiwgTlVMTCwKLQkJICAgICAgIG5laWdoLT5kZXYsIGRuX25laWdoX291dHB1dF9wYWNrZXQpOworCXJldHVybiBORl9IT09LKE5GUFJPVE9fREVDTkVULCBORl9ETl9QT1NUX1JPVVRJTkcsIHNrLCBza2IsCisJCSAgICAgICBOVUxMLCBuZWlnaC0+ZGV2LCBkbl9uZWlnaF9vdXRwdXRfcGFja2V0KTsKK30KKworaW50IGRuX3RvX25laWdoX291dHB1dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOworCXN0cnVjdCBkbl9yb3V0ZSAqcnQgPSAoc3RydWN0IGRuX3JvdXRlICopIGRzdDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCA9IHJ0LT5uOworCXN0cnVjdCBkbl9uZWlnaCAqZG4gPSAoc3RydWN0IGRuX25laWdoICopbmVpZ2g7CisJc3RydWN0IGRuX2RldiAqZG5fZGI7CisJYm9vbCB1c2VfbG9uZzsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlkbl9kYiA9IHJjdV9kZXJlZmVyZW5jZShuZWlnaC0+ZGV2LT5kbl9wdHIpOworCWlmIChkbl9kYiA9PSBOVUxMKSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdXNlX2xvbmcgPSBkbl9kYi0+dXNlX2xvbmc7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoZG4tPmZsYWdzICYgRE5fTkRGTEFHX1AzKQorCQlyZXR1cm4gZG5fcGhhc2UzX291dHB1dChuZWlnaCwgc2ssIHNrYik7CisJaWYgKHVzZV9sb25nKQorCQlyZXR1cm4gZG5fbG9uZ19vdXRwdXQobmVpZ2gsIHNrLCBza2IpOworCWVsc2UKKwkJcmV0dXJuIGRuX3Nob3J0X291dHB1dChuZWlnaCwgc2ssIHNrYik7CiB9CiAKIC8qCkBAIC0zNjIsNyArMzc1LDcgQEAKIC8qCiAgKiBFdGhlcm5ldCByb3V0ZXIgaGVsbG8gbWVzc2FnZSByZWNlaXZlZAogICovCi1pbnQgZG5fbmVpZ2hfcm91dGVyX2hlbGxvKHN0cnVjdCBza19idWZmICpza2IpCitpbnQgZG5fbmVpZ2hfcm91dGVyX2hlbGxvKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgcnRub2RlX2hlbGxvX21lc3NhZ2UgKm1zZyA9IChzdHJ1Y3QgcnRub2RlX2hlbGxvX21lc3NhZ2UgKilza2ItPmRhdGE7CiAKQEAgLTQyNCw3ICs0MzcsNyBAQAogLyoKICAqIEVuZG5vZGUgaGVsbG8gbWVzc2FnZSByZWNlaXZlZAogICovCi1pbnQgZG5fbmVpZ2hfZW5kbm9kZV9oZWxsbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IGRuX25laWdoX2VuZG5vZGVfaGVsbG8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBlbmRub2RlX2hlbGxvX21lc3NhZ2UgKm1zZyA9IChzdHJ1Y3QgZW5kbm9kZV9oZWxsb19tZXNzYWdlICopc2tiLT5kYXRhOwogCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOwpkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9uc3BfaW4uYyBiL25ldC9kZWNuZXQvZG5fbnNwX2luLmMKaW5kZXggZmU1ZjAxNC4uYTMyMWVhYyAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl9uc3BfaW4uYworKysgYi9uZXQvZGVjbmV0L2RuX25zcF9pbi5jCkBAIC03MTQsNyArNzE0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGRuX25zcF9yeF9wYWNrZXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgZG5fbnNwX3J4X3BhY2tldChzdHJ1Y3Qgc29jayAqc2syLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkbl9za2JfY2IgKmNiID0gRE5fU0tCX0NCKHNrYik7CiAJc3RydWN0IHNvY2sgKnNrID0gTlVMTDsKQEAgLTgxNCw3ICs4MTQsOCBAQAogCiBpbnQgZG5fbnNwX3J4KHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX0xPQ0FMX0lOLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCXJldHVybiBORl9IT09LKE5GUFJPVE9fREVDTkVULCBORl9ETl9MT0NBTF9JTiwgTlVMTCwgc2tiLAorCQkgICAgICAgc2tiLT5kZXYsIE5VTEwsCiAJCSAgICAgICBkbl9uc3BfcnhfcGFja2V0KTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9yb3V0ZS5jIGIvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCmluZGV4IDNiODEwOTIuLjAzMjI3ZmYgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fcm91dGUuYworKysgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKQEAgLTEzNiw3ICsxMzYsNiBAQAogCiBzdGF0aWMgc3RydWN0IGRzdF9vcHMgZG5fZHN0X29wcyA9IHsKIAkuZmFtaWx5ID0JCVBGX0RFQ25ldCwKLQkucHJvdG9jb2wgPQkJY3B1X3RvX2JlMTYoRVRIX1BfRE5BX1JUKSwKIAkuZ2NfdGhyZXNoID0JCTEyOCwKIAkuZ2MgPQkJCWRuX2RzdF9nYywKIAkuY2hlY2sgPQkJZG5fZHN0X2NoZWNrLApAQCAtNTEzLDcgKzUxMiw3IEBACiAgKgogICogUmV0dXJuczogcmVzdWx0IG9mIGlucHV0IGZ1bmN0aW9uIGlmIHJvdXRlIGlzIGZvdW5kLCBlcnJvciBjb2RlIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW50IGRuX3JvdXRlX3J4X3BhY2tldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBkbl9yb3V0ZV9yeF9wYWNrZXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkbl9za2JfY2IgKmNiOwogCWludCBlcnI7CkBAIC01NzQsNyArNTczLDggQEAKIAlwdHIrKzsKIAljYi0+aG9wcyA9ICpwdHIrKzsgLyogVmlzaXQgQ291bnQgKi8KIAotCXJldHVybiBORl9IT09LKE5GUFJPVE9fREVDTkVULCBORl9ETl9QUkVfUk9VVElORywgc2tiLCBza2ItPmRldiwgTlVMTCwKKwlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0RFQ05FVCwgTkZfRE5fUFJFX1JPVVRJTkcsIE5VTEwsIHNrYiwKKwkJICAgICAgIHNrYi0+ZGV2LCBOVUxMLAogCQkgICAgICAgZG5fcm91dGVfcnhfcGFja2V0KTsKIAogZHJvcF9pdDoKQEAgLTYwMSw3ICs2MDEsOCBAQAogCXB0ciArPSAyOwogCWNiLT5ob3BzID0gKnB0ciAmIDB4M2Y7CiAKLQlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0RFQ05FVCwgTkZfRE5fUFJFX1JPVVRJTkcsIHNrYiwgc2tiLT5kZXYsIE5VTEwsCisJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX1BSRV9ST1VUSU5HLCBOVUxMLCBza2IsCisJCSAgICAgICBza2ItPmRldiwgTlVMTCwKIAkJICAgICAgIGRuX3JvdXRlX3J4X3BhY2tldCk7CiAKIGRyb3BfaXQ6CkBAIC02MDksNyArNjEwLDcgQEAKIAlyZXR1cm4gTkVUX1JYX0RST1A7CiB9CiAKLXN0YXRpYyBpbnQgZG5fcm91dGVfZGlzY2FyZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBkbl9yb3V0ZV9kaXNjYXJkKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAkvKgogCSAqIEkga25vdyB3ZSBkcm9wIHRoZSBwYWNrZXQgaGVyZSwgYnV0IHRoYXRzIGNvbnNpZGVyZWQgc3VjY2VzcyBpbgpAQCAtNjE5LDcgKzYyMCw3IEBACiAJcmV0dXJuIE5FVF9SWF9TVUNDRVNTOwogfQogCi1zdGF0aWMgaW50IGRuX3JvdXRlX3B0cF9oZWxsbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBkbl9yb3V0ZV9wdHBfaGVsbG8oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWRuX2Rldl9oZWxsbyhza2IpOwogCWRuX25laWdoX3BvaW50b3BvaW50X2hlbGxvKHNrYik7CkBAIC03MDUsMjIgKzcwNiwyMiBAQAogCQlzd2l0Y2ggKGZsYWdzICYgRE5fUlRfQ05UTF9NU0spIHsKIAkJY2FzZSBETl9SVF9QS1RfSEVMTzoKIAkJCXJldHVybiBORl9IT09LKE5GUFJPVE9fREVDTkVULCBORl9ETl9IRUxMTywKLQkJCQkgICAgICAgc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJCQkgICAgICAgTlVMTCwgc2tiLCBza2ItPmRldiwgTlVMTCwKIAkJCQkgICAgICAgZG5fcm91dGVfcHRwX2hlbGxvKTsKIAogCQljYXNlIEROX1JUX1BLVF9MMVJUOgogCQljYXNlIEROX1JUX1BLVF9MMlJUOgogCQkJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX1JPVVRFLAotCQkJCSAgICAgICBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCQkJCSAgICAgICBOVUxMLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAogCQkJCSAgICAgICBkbl9yb3V0ZV9kaXNjYXJkKTsKIAkJY2FzZSBETl9SVF9QS1RfRVJUSDoKIAkJCXJldHVybiBORl9IT09LKE5GUFJPVE9fREVDTkVULCBORl9ETl9IRUxMTywKLQkJCQkgICAgICAgc2tiLCBza2ItPmRldiwgTlVMTCwKKwkJCQkgICAgICAgTlVMTCwgc2tiLCBza2ItPmRldiwgTlVMTCwKIAkJCQkgICAgICAgZG5fbmVpZ2hfcm91dGVyX2hlbGxvKTsKIAogCQljYXNlIEROX1JUX1BLVF9FRURIOgogCQkJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX0hFTExPLAotCQkJCSAgICAgICBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCQkJCSAgICAgICBOVUxMLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAogCQkJCSAgICAgICBkbl9uZWlnaF9lbmRub2RlX2hlbGxvKTsKIAkJfQogCX0gZWxzZSB7CkBAIC03NDMsMTUgKzc0NCw2IEBACiAJcmV0dXJuIE5FVF9SWF9EUk9QOwogfQogCi1zdGF0aWMgaW50IGRuX3RvX25laWdoX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKLQlzdHJ1Y3QgZG5fcm91dGUgKnJ0ID0gKHN0cnVjdCBkbl9yb3V0ZSAqKSBkc3Q7Ci0Jc3RydWN0IG5laWdoYm91ciAqbiA9IHJ0LT5uOwotCi0JcmV0dXJuIG4tPm91dHB1dChuLCBza2IpOwotfQotCiBzdGF0aWMgaW50IGRuX291dHB1dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOwpAQCAtNzc4LDcgKzc3MCw4IEBACiAJY2ItPnJ0X2ZsYWdzIHw9IEROX1JUX0ZfSUU7CiAJY2ItPmhvcHMgPSAwOwogCi0JcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBkZXYsCisJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19ERUNORVQsIE5GX0ROX0xPQ0FMX09VVCwgc2ssIHNrYiwKKwkJICAgICAgIE5VTEwsIGRldiwKIAkJICAgICAgIGRuX3RvX25laWdoX291dHB1dCk7CiAKIGVycm9yOgpAQCAtODI2LDcgKzgxOSw4IEBACiAJaWYgKHJ0LT5ydF9mbGFncyAmIFJUQ0ZfRE9SRURJUkVDVCkKIAkJY2ItPnJ0X2ZsYWdzIHw9IEROX1JUX0ZfSUU7CiAKLQlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0RFQ05FVCwgTkZfRE5fRk9SV0FSRCwgc2tiLCBkZXYsIHNrYi0+ZGV2LAorCXJldHVybiBORl9IT09LKE5GUFJPVE9fREVDTkVULCBORl9ETl9GT1JXQVJELCBOVUxMLCBza2IsCisJCSAgICAgICBkZXYsIHNrYi0+ZGV2LAogCQkgICAgICAgZG5fdG9fbmVpZ2hfb3V0cHV0KTsKIAogZHJvcDoKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fcnVsZXMuYyBiL25ldC9kZWNuZXQvZG5fcnVsZXMuYwppbmRleCBmYWY3Y2MzLi45ZDY2YTBmIDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX3J1bGVzLmMKKysrIGIvbmV0L2RlY25ldC9kbl9ydWxlcy5jCkBAIC0yNDgsNyArMjQ4LDkgQEAKIAogdm9pZCBfX2V4aXQgZG5fZmliX3J1bGVzX2NsZWFudXAodm9pZCkKIHsKKwlydG5sX2xvY2soKTsKIAlmaWJfcnVsZXNfdW5yZWdpc3Rlcihkbl9maWJfcnVsZXNfb3BzKTsKKwlydG5sX3VubG9jaygpOwogCXJjdV9iYXJyaWVyKCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvbmV0ZmlsdGVyL2RuX3J0bXNnLmMgYi9uZXQvZGVjbmV0L25ldGZpbHRlci9kbl9ydG1zZy5jCmluZGV4IGU0ZDk1NjAuLmFmMzRmYzkgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvbmV0ZmlsdGVyL2RuX3J0bXNnLmMKKysrIGIvbmV0L2RlY25ldC9uZXRmaWx0ZXIvZG5fcnRtc2cuYwpAQCAtODksOSArODksNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGRucm1nX2hvb2soY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCWludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCWRucm1nX3NlbmRfcGVlcihza2IpOwogCXJldHVybiBORl9BQ0NFUFQ7CmRpZmYgLS1naXQgYS9uZXQvZHNhL0tjb25maWcgYi9uZXQvZHNhL0tjb25maWcKaW5kZXggNWY4YWM0MC4uZmY3NzM2ZiAxMDA2NDQKLS0tIGEvbmV0L2RzYS9LY29uZmlnCisrKyBiL25ldC9kc2EvS2NvbmZpZwpAQCAtNSw5ICs1LDEyIEBACiAjIERyaXZlcnMgbXVzdCBzZWxlY3QgTkVUX0RTQSBhbmQgdGhlIGFwcHJvcHJpYXRlIHRhZ2dpbmcgZm9ybWF0CiAKIGNvbmZpZyBORVRfRFNBCi0JdHJpc3RhdGUKLQlkZXBlbmRzIG9uIEhBVkVfTkVUX0RTQQorCXRyaXN0YXRlICJEaXN0cmlidXRlZCBTd2l0Y2ggQXJjaGl0ZWN0dXJlIgorCWRlcGVuZHMgb24gSEFWRV9ORVRfRFNBICYmIE5FVF9TV0lUQ0hERVYKIAlzZWxlY3QgUEhZTElCCisJLS0taGVscC0tLQorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBoYXJkd2FyZSBzd2l0Y2hlcyBzdXBwb3J0ZWQKKwkgIGJ5IHRoZSBEaXN0cmlidXRlZCBTd2l0Y2ggQXJjaGl0ZWN0dXJlLgogCiBpZiBORVRfRFNBCiAKZGlmZiAtLWdpdCBhL25ldC9kc2EvZHNhLmMgYi9uZXQvZHNhL2RzYS5jCmluZGV4IDIxNzM0MDIuLjVlYWFkYWIgMTAwNjQ0Ci0tLSBhL25ldC9kc2EvZHNhLmMKKysrIGIvbmV0L2RzYS9kc2EuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfbWRpby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlICJkc2FfcHJpdi5oIgogCkBAIC0xNzUsNDMgKzE3NiwxNCBAQAogI2VuZGlmIC8qIENPTkZJR19ORVRfRFNBX0hXTU9OICovCiAKIC8qIGJhc2ljIHN3aXRjaCBvcGVyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RhdGljIHN0cnVjdCBkc2Ffc3dpdGNoICoKLWRzYV9zd2l0Y2hfc2V0dXAoc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0LCBpbnQgaW5kZXgsCi0JCSBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHN0cnVjdCBkZXZpY2UgKmhvc3RfZGV2KQorc3RhdGljIGludCBkc2Ffc3dpdGNoX3NldHVwX29uZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKIHsKLQlzdHJ1Y3QgZHNhX2NoaXBfZGF0YSAqcGQgPSBkc3QtPnBkLT5jaGlwICsgaW5kZXg7Ci0Jc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICpkcnY7Ci0Jc3RydWN0IGRzYV9zd2l0Y2ggKmRzOwotCWludCByZXQ7Ci0JY2hhciAqbmFtZTsKLQlpbnQgaTsKKwlzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKmRydiA9IGRzLT5kcnY7CisJc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0ID0gZHMtPmRzdDsKKwlzdHJ1Y3QgZHNhX2NoaXBfZGF0YSAqcGQgPSBkcy0+cGQ7CiAJYm9vbCB2YWxpZF9uYW1lX2ZvdW5kID0gZmFsc2U7Ci0KLQkvKgotCSAqIFByb2JlIGZvciBzd2l0Y2ggbW9kZWwuCi0JICovCi0JZHJ2ID0gZHNhX3N3aXRjaF9wcm9iZShob3N0X2RldiwgcGQtPnN3X2FkZHIsICZuYW1lKTsKLQlpZiAoZHJ2ID09IE5VTEwpIHsKLQkJbmV0ZGV2X2Vycihkc3QtPm1hc3Rlcl9uZXRkZXYsICJbJWRdOiBjb3VsZCBub3QgZGV0ZWN0IGF0dGFjaGVkIHN3aXRjaFxuIiwKLQkJCSAgIGluZGV4KTsKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Ci0JfQotCW5ldGRldl9pbmZvKGRzdC0+bWFzdGVyX25ldGRldiwgIlslZF06IGRldGVjdGVkIGEgJXMgc3dpdGNoXG4iLAotCQkgICAgaW5kZXgsIG5hbWUpOwotCi0KLQkvKgotCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIHN3aXRjaCBzdGF0ZS4KLQkgKi8KLQlkcyA9IGt6YWxsb2Moc2l6ZW9mKCpkcykgKyBkcnYtPnByaXZfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRzID09IE5VTEwpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0JZHMtPmRzdCA9IGRzdDsKLQlkcy0+aW5kZXggPSBpbmRleDsKLQlkcy0+cGQgPSBkc3QtPnBkLT5jaGlwICsgaW5kZXg7Ci0JZHMtPmRydiA9IGRydjsKLQlkcy0+bWFzdGVyX2RldiA9IGhvc3RfZGV2OworCWludCBpbmRleCA9IGRzLT5pbmRleDsKKwlpbnQgaSwgcmV0OwogCiAJLyoKIAkgKiBWYWxpZGF0ZSBzdXBwbGllZCBzd2l0Y2ggY29uZmlndXJhdGlvbi4KQEAgLTI1Niw3ICsyMjgsNyBAQAogCSAqIHN3aXRjaC4KIAkgKi8KIAlpZiAoZHN0LT5jcHVfc3dpdGNoID09IGluZGV4KSB7Ci0JCXN3aXRjaCAoZHJ2LT50YWdfcHJvdG9jb2wpIHsKKwkJc3dpdGNoIChkcy0+dGFnX3Byb3RvY29sKSB7CiAjaWZkZWYgQ09ORklHX05FVF9EU0FfVEFHX0RTQQogCQljYXNlIERTQV9UQUdfUFJPVE9fRFNBOgogCQkJZHN0LT5yY3YgPSBkc2FfbmV0ZGV2X29wcy5yY3Y7CkBAIC0yODQsNyArMjU2LDcgQEAKIAkJCWdvdG8gb3V0OwogCQl9CiAKLQkJZHN0LT50YWdfcHJvdG9jb2wgPSBkcnYtPnRhZ19wcm90b2NvbDsKKwkJZHN0LT50YWdfcHJvdG9jb2wgPSBkcy0+dGFnX3Byb3RvY29sOwogCX0KIAogCS8qCkBAIC0zMTQsMTkgKzI4NiwxNSBAQAogCSAqIENyZWF0ZSBuZXR3b3JrIGRldmljZXMgZm9yIHBoeXNpY2FsIHN3aXRjaCBwb3J0cy4KIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgRFNBX01BWF9QT1JUUzsgaSsrKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXY7Ci0KIAkJaWYgKCEoZHMtPnBoeXNfcG9ydF9tYXNrICYgKDEgPDwgaSkpKQogCQkJY29udGludWU7CiAKLQkJc2xhdmVfZGV2ID0gZHNhX3NsYXZlX2NyZWF0ZShkcywgcGFyZW50LCBpLCBwZC0+cG9ydF9uYW1lc1tpXSk7Ci0JCWlmIChzbGF2ZV9kZXYgPT0gTlVMTCkgeworCQlyZXQgPSBkc2Ffc2xhdmVfY3JlYXRlKGRzLCBwYXJlbnQsIGksIHBkLT5wb3J0X25hbWVzW2ldKTsKKwkJaWYgKHJldCA8IDApIHsKIAkJCW5ldGRldl9lcnIoZHN0LT5tYXN0ZXJfbmV0ZGV2LCAiWyVkXTogY2FuJ3QgY3JlYXRlIGRzYSBzbGF2ZSBkZXZpY2UgZm9yIHBvcnQgJWQoJXMpXG4iLAogCQkJCSAgIGluZGV4LCBpLCBwZC0+cG9ydF9uYW1lc1tpXSk7Ci0JCQljb250aW51ZTsKKwkJCXJldCA9IDA7CiAJCX0KLQotCQlkcy0+cG9ydHNbaV0gPSBzbGF2ZV9kZXY7CiAJfQogCiAjaWZkZWYgQ09ORklHX05FVF9EU0FfSFdNT04KQEAgLTM1NCwxMyArMzIyLDU3IEBACiAJfQogI2VuZGlmIC8qIENPTkZJR19ORVRfRFNBX0hXTU9OICovCiAKLQlyZXR1cm4gZHM7CisJcmV0dXJuIHJldDsKIAogb3V0X2ZyZWU6CiAJbWRpb2J1c19mcmVlKGRzLT5zbGF2ZV9taWlfYnVzKTsKIG91dDoKIAlrZnJlZShkcyk7Ci0JcmV0dXJuIEVSUl9QVFIocmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2ggKgorZHNhX3N3aXRjaF9zZXR1cChzdHJ1Y3QgZHNhX3N3aXRjaF90cmVlICpkc3QsIGludCBpbmRleCwKKwkJIHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgc3RydWN0IGRldmljZSAqaG9zdF9kZXYpCit7CisJc3RydWN0IGRzYV9jaGlwX2RhdGEgKnBkID0gZHN0LT5wZC0+Y2hpcCArIGluZGV4OworCXN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqZHJ2OworCXN0cnVjdCBkc2Ffc3dpdGNoICpkczsKKwlpbnQgcmV0OworCWNoYXIgKm5hbWU7CisKKwkvKgorCSAqIFByb2JlIGZvciBzd2l0Y2ggbW9kZWwuCisJICovCisJZHJ2ID0gZHNhX3N3aXRjaF9wcm9iZShob3N0X2RldiwgcGQtPnN3X2FkZHIsICZuYW1lKTsKKwlpZiAoZHJ2ID09IE5VTEwpIHsKKwkJbmV0ZGV2X2Vycihkc3QtPm1hc3Rlcl9uZXRkZXYsICJbJWRdOiBjb3VsZCBub3QgZGV0ZWN0IGF0dGFjaGVkIHN3aXRjaFxuIiwKKwkJCSAgIGluZGV4KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCW5ldGRldl9pbmZvKGRzdC0+bWFzdGVyX25ldGRldiwgIlslZF06IGRldGVjdGVkIGEgJXMgc3dpdGNoXG4iLAorCQkgICAgaW5kZXgsIG5hbWUpOworCisKKwkvKgorCSAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXNlIHN3aXRjaCBzdGF0ZS4KKwkgKi8KKwlkcyA9IGt6YWxsb2Moc2l6ZW9mKCpkcykgKyBkcnYtPnByaXZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZHMtPmRzdCA9IGRzdDsKKwlkcy0+aW5kZXggPSBpbmRleDsKKwlkcy0+cGQgPSBwZDsKKwlkcy0+ZHJ2ID0gZHJ2OworCWRzLT50YWdfcHJvdG9jb2wgPSBkcnYtPnRhZ19wcm90b2NvbDsKKwlkcy0+bWFzdGVyX2RldiA9IGhvc3RfZGV2OworCisJcmV0ID0gZHNhX3N3aXRjaF9zZXR1cF9vbmUoZHMsIHBhcmVudCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZHM7CiB9CiAKIHN0YXRpYyB2b2lkIGRzYV9zd2l0Y2hfZGVzdHJveShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpCkBAIC0zNzgsNyArMzkwLDcgQEAKIAogCS8qIFN1c3BlbmQgc2xhdmUgbmV0d29yayBkZXZpY2VzICovCiAJZm9yIChpID0gMDsgaSA8IERTQV9NQVhfUE9SVFM7IGkrKykgewotCQlpZiAoIShkcy0+cGh5c19wb3J0X21hc2sgJiAoMSA8PCBpKSkpCisJCWlmICghZHNhX2lzX3BvcnRfaW5pdGlhbGl6ZWQoZHMsIGkpKQogCQkJY29udGludWU7CiAKIAkJcmV0ID0gZHNhX3NsYXZlX3N1c3BlbmQoZHMtPnBvcnRzW2ldKTsKQEAgLTQwNCw3ICs0MTYsNyBAQAogCiAJLyogUmVzdW1lIHNsYXZlIG5ldHdvcmsgZGV2aWNlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBEU0FfTUFYX1BPUlRTOyBpKyspIHsKLQkJaWYgKCEoZHMtPnBoeXNfcG9ydF9tYXNrICYgKDEgPDwgaSkpKQorCQlpZiAoIWRzYV9pc19wb3J0X2luaXRpYWxpemVkKGRzLCBpKSkKIAkJCWNvbnRpbnVlOwogCiAJCXJldCA9IGRzYV9zbGF2ZV9yZXN1bWUoZHMtPnBvcnRzW2ldKTsKQEAgLTUwMSwxMiArNTEzLDEwIEBACiAjaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgaW50IGRzYV9vZl9zZXR1cF9yb3V0aW5nX3RhYmxlKHN0cnVjdCBkc2FfcGxhdGZvcm1fZGF0YSAqcGQsCiAJCQkJCXN0cnVjdCBkc2FfY2hpcF9kYXRhICpjZCwKLQkJCQkJaW50IGNoaXBfaW5kZXgsCisJCQkJCWludCBjaGlwX2luZGV4LCBpbnQgcG9ydF9pbmRleCwKIAkJCQkJc3RydWN0IGRldmljZV9ub2RlICpsaW5rKQogewotCWludCByZXQ7CiAJY29uc3QgX19iZTMyICpyZWc7Ci0JaW50IGxpbmtfcG9ydF9hZGRyOwogCWludCBsaW5rX3N3X2FkZHI7CiAJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnRfc3c7CiAJaW50IGxlbjsKQEAgLTUxOSw2ICs1MjksMTAgQEAKIAlpZiAoIXJlZyB8fCAobGVuICE9IHNpemVvZigqcmVnKSAqIDIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qCisJICogR2V0IHRoZSBkZXN0aW5hdGlvbiBzd2l0Y2ggbnVtYmVyIGZyb20gdGhlIHNlY29uZCBmaWVsZCBvZiBpdHMgJ3JlZycKKwkgKiBwcm9wZXJ0eSwgaS5lLiBmb3IgInJlZyA9IDwweDE5IDE+IiBzd19hZGRyIGlzICcxJy4KKwkgKi8KIAlsaW5rX3N3X2FkZHIgPSBiZTMyX3RvX2NwdXAocmVnICsgMSk7CiAKIAlpZiAobGlua19zd19hZGRyID49IHBkLT5ucl9jaGlwcykKQEAgLTUzNSwyMCArNTQ5LDkgQEAKIAkJbWVtc2V0KGNkLT5ydGFibGUsIC0xLCBwZC0+bnJfY2hpcHMgKiBzaXplb2YoczgpKTsKIAl9CiAKLQlyZWcgPSBvZl9nZXRfcHJvcGVydHkobGluaywgInJlZyIsIE5VTEwpOwotCWlmICghcmVnKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWxpbmtfcG9ydF9hZGRyID0gYmUzMl90b19jcHVwKHJlZyk7Ci0KLQljZC0+cnRhYmxlW2xpbmtfc3dfYWRkcl0gPSBsaW5rX3BvcnRfYWRkcjsKKwljZC0+cnRhYmxlW2xpbmtfc3dfYWRkcl0gPSBwb3J0X2luZGV4OwogCiAJcmV0dXJuIDA7Ci1vdXQ6Ci0Ja2ZyZWUoY2QtPnJ0YWJsZSk7Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgZHNhX29mX2ZyZWVfcGxhdGZvcm1fZGF0YShzdHJ1Y3QgZHNhX3BsYXRmb3JtX2RhdGEgKnBkKQpAQCAtNTY3LDEyICs1NzAsMTIgQEAKIAlrZnJlZShwZC0+Y2hpcCk7CiB9CiAKLXN0YXRpYyBpbnQgZHNhX29mX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IGRzYV9vZl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7CiAJc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCwgKm1kaW8sICpldGhlcm5ldCwgKnBvcnQsICpsaW5rOwogCXN0cnVjdCBtaWlfYnVzICptZGlvX2J1czsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpldGhlcm5ldF9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKmV0aGVybmV0X2RldjsKIAlzdHJ1Y3QgZHNhX3BsYXRmb3JtX2RhdGEgKnBkOwogCXN0cnVjdCBkc2FfY2hpcF9kYXRhICpjZDsKIAljb25zdCBjaGFyICpwb3J0X25hbWU7CkBAIC01ODcsMjIgKzU5MCwyMiBAQAogCiAJbWRpb19idXMgPSBvZl9tZGlvX2ZpbmRfYnVzKG1kaW8pOwogCWlmICghbWRpb19idXMpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gLUVQUk9CRV9ERUZFUjsKIAogCWV0aGVybmV0ID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgImRzYSxldGhlcm5ldCIsIDApOwogCWlmICghZXRoZXJuZXQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZXRoZXJuZXRfZGV2ID0gb2ZfZmluZF9kZXZpY2VfYnlfbm9kZShldGhlcm5ldCk7CisJZXRoZXJuZXRfZGV2ID0gb2ZfZmluZF9uZXRfZGV2aWNlX2J5X25vZGUoZXRoZXJuZXQpOwogCWlmICghZXRoZXJuZXRfZGV2KQotCQlyZXR1cm4gLUVOT0RFVjsKKwkJcmV0dXJuIC1FUFJPQkVfREVGRVI7CiAKIAlwZCA9IGt6YWxsb2Moc2l6ZW9mKCpwZCksIEdGUF9LRVJORUwpOwogCWlmICghcGQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEgPSBwZDsKLQlwZC0+bmV0ZGV2ID0gJmV0aGVybmV0X2Rldi0+ZGV2OworCWRldi0+cGxhdGZvcm1fZGF0YSA9IHBkOworCXBkLT5vZl9uZXRkZXYgPSBldGhlcm5ldF9kZXY7CiAJcGQtPm5yX2NoaXBzID0gb2ZfZ2V0X2F2YWlsYWJsZV9jaGlsZF9jb3VudChucCk7CiAJaWYgKHBkLT5ucl9jaGlwcyA+IERTQV9NQVhfU1dJVENIRVMpCiAJCXBkLT5ucl9jaGlwcyA9IERTQV9NQVhfU1dJVENIRVM7CkBAIC02NTgsNyArNjYxLDcgQEAKIAkJCWlmICghc3RyY21wKHBvcnRfbmFtZSwgImRzYSIpICYmIGxpbmsgJiYKIAkJCQkJcGQtPm5yX2NoaXBzID4gMSkgewogCQkJCXJldCA9IGRzYV9vZl9zZXR1cF9yb3V0aW5nX3RhYmxlKHBkLCBjZCwKLQkJCQkJCWNoaXBfaW5kZXgsIGxpbmspOworCQkJCQkJY2hpcF9pbmRleCwgcG9ydF9pbmRleCwgbGluayk7CiAJCQkJaWYgKHJldCkKIAkJCQkJZ290byBvdXRfZnJlZV9jaGlwOwogCQkJfQpAQCAtNjc0LDcyICs2NzcsMzUgQEAKIAlkc2Ffb2ZfZnJlZV9wbGF0Zm9ybV9kYXRhKHBkKTsKIG91dF9mcmVlOgogCWtmcmVlKHBkKTsKLQlwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSA9IE5VTEw7CisJZGV2LT5wbGF0Zm9ybV9kYXRhID0gTlVMTDsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBkc2Ffb2ZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgdm9pZCBkc2Ffb2ZfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgZHNhX3BsYXRmb3JtX2RhdGEgKnBkID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IGRzYV9wbGF0Zm9ybV9kYXRhICpwZCA9IGRldi0+cGxhdGZvcm1fZGF0YTsKIAotCWlmICghcGRldi0+ZGV2Lm9mX25vZGUpCisJaWYgKCFkZXYtPm9mX25vZGUpCiAJCXJldHVybjsKIAogCWRzYV9vZl9mcmVlX3BsYXRmb3JtX2RhdGEocGQpOwogCWtmcmVlKHBkKTsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBkc2Ffb2ZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbmxpbmUgaW50IGRzYV9vZl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkc2Ffb2ZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW5saW5lIHZvaWQgZHNhX29mX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBkc2FfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIGRzYV9zZXR1cF9kc3Qoc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQsIHN0cnVjdCBkc2FfcGxhdGZvcm1fZGF0YSAqcGQpCiB7Ci0Jc3RydWN0IGRzYV9wbGF0Zm9ybV9kYXRhICpwZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0OwotCWludCBpLCByZXQ7Ci0KLQlwcl9ub3RpY2Vfb25jZSgiRGlzdHJpYnV0ZWQgU3dpdGNoIEFyY2hpdGVjdHVyZSBkcml2ZXIgdmVyc2lvbiAlc1xuIiwKLQkJICAgICAgIGRzYV9kcml2ZXJfdmVyc2lvbik7Ci0KLQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpIHsKLQkJcmV0ID0gZHNhX29mX3Byb2JlKHBkZXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlwZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCX0KLQotCWlmIChwZCA9PSBOVUxMIHx8IHBkLT5uZXRkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlkZXYgPSBkZXZfdG9fbmV0X2RldmljZShwZC0+bmV0ZGV2KTsKLQlpZiAoZGV2ID09IE5VTEwpIHsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGRldi0+ZHNhX3B0ciAhPSBOVUxMKSB7Ci0JCWRldl9wdXQoZGV2KTsKLQkJcmV0ID0gLUVFWElTVDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZHN0ID0ga3phbGxvYyhzaXplb2YoKmRzdCksIEdGUF9LRVJORUwpOwotCWlmIChkc3QgPT0gTlVMTCkgewotCQlkZXZfcHV0KGRldik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRzdCk7CisJaW50IGk7CiAKIAlkc3QtPnBkID0gcGQ7CiAJZHN0LT5tYXN0ZXJfbmV0ZGV2ID0gZGV2OwpAQCAtNzQ5LDcgKzcxNSw3IEBACiAJZm9yIChpID0gMDsgaSA8IHBkLT5ucl9jaGlwczsgaSsrKSB7CiAJCXN0cnVjdCBkc2Ffc3dpdGNoICpkczsKIAotCQlkcyA9IGRzYV9zd2l0Y2hfc2V0dXAoZHN0LCBpLCAmcGRldi0+ZGV2LCBwZC0+Y2hpcFtpXS5ob3N0X2Rldik7CisJCWRzID0gZHNhX3N3aXRjaF9zZXR1cChkc3QsIGksIHBhcmVudCwgcGQtPmNoaXBbaV0uaG9zdF9kZXYpOwogCQlpZiAoSVNfRVJSKGRzKSkgewogCQkJbmV0ZGV2X2VycihkZXYsICJbJWRdOiBjb3VsZG4ndCBjcmVhdGUgZHNhIHN3aXRjaCBpbnN0YW5jZSAoZXJyb3IgJWxkKVxuIiwKIAkJCQkgICBpLCBQVFJfRVJSKGRzKSk7CkBAIC03NzcsMTggKzc0Myw2NyBAQAogCQlkc3QtPmxpbmtfcG9sbF90aW1lci5leHBpcmVzID0gcm91bmRfamlmZmllcyhqaWZmaWVzICsgSFopOwogCQlhZGRfdGltZXIoJmRzdC0+bGlua19wb2xsX3RpbWVyKTsKIAl9Cit9CisKK3N0YXRpYyBpbnQgZHNhX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRzYV9wbGF0Zm9ybV9kYXRhICpwZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0OworCWludCByZXQ7CisKKwlwcl9ub3RpY2Vfb25jZSgiRGlzdHJpYnV0ZWQgU3dpdGNoIEFyY2hpdGVjdHVyZSBkcml2ZXIgdmVyc2lvbiAlc1xuIiwKKwkJICAgICAgIGRzYV9kcml2ZXJfdmVyc2lvbik7CisKKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpIHsKKwkJcmV0ID0gZHNhX29mX3Byb2JlKCZwZGV2LT5kZXYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlwZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCX0KKworCWlmIChwZCA9PSBOVUxMIHx8IChwZC0+bmV0ZGV2ID09IE5VTEwgJiYgcGQtPm9mX25ldGRldiA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGQtPm9mX25ldGRldikgeworCQlkZXYgPSBwZC0+b2ZfbmV0ZGV2OworCQlkZXZfaG9sZChkZXYpOworCX0gZWxzZSB7CisJCWRldiA9IGRldl90b19uZXRfZGV2aWNlKHBkLT5uZXRkZXYpOworCX0KKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGRldi0+ZHNhX3B0ciAhPSBOVUxMKSB7CisJCWRldl9wdXQoZGV2KTsKKwkJcmV0ID0gLUVFWElTVDsKKwkJZ290byBvdXQ7CisJfQorCisJZHN0ID0ga3phbGxvYyhzaXplb2YoKmRzdCksIEdGUF9LRVJORUwpOworCWlmIChkc3QgPT0gTlVMTCkgeworCQlkZXZfcHV0KGRldik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRzdCk7CisKKwlkc2Ffc2V0dXBfZHN0KGRzdCwgZGV2LCAmcGRldi0+ZGV2LCBwZCk7CiAKIAlyZXR1cm4gMDsKIAogb3V0OgotCWRzYV9vZl9yZW1vdmUocGRldik7CisJZHNhX29mX3JlbW92ZSgmcGRldi0+ZGV2KTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZHNhX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorc3RhdGljIHZvaWQgZHNhX3JlbW92ZV9kc3Qoc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0KQogewotCXN0cnVjdCBkc2Ffc3dpdGNoX3RyZWUgKmRzdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBpOwogCiAJaWYgKGRzdC0+bGlua19wb2xsX25lZWRlZCkKQEAgLTgwMiw4ICs4MTcsMTQgQEAKIAkJaWYgKGRzICE9IE5VTEwpCiAJCQlkc2Ffc3dpdGNoX2Rlc3Ryb3koZHMpOwogCX0KK30KIAotCWRzYV9vZl9yZW1vdmUocGRldik7CitzdGF0aWMgaW50IGRzYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZHNhX3N3aXRjaF90cmVlICpkc3QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRzYV9yZW1vdmVfZHN0KGRzdCk7CisJZHNhX29mX3JlbW92ZSgmcGRldi0+ZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtODMwLDYgKzg1MSwxMCBAQAogCS5mdW5jCT0gZHNhX3N3aXRjaF9yY3YsCiB9OwogCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGRzYV9uZXRkZXZpY2VfbmIgX19yZWFkX21vc3RseSA9IHsKKwkubm90aWZpZXJfY2FsbAk9IGRzYV9zbGF2ZV9uZXRkZXZpY2VfZXZlbnQsCit9OworCiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiBzdGF0aWMgaW50IGRzYV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmQpCiB7CkBAIC04ODgsNiArOTEzLDggQEAKIHsKIAlpbnQgcmM7CiAKKwlyZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJmRzYV9uZXRkZXZpY2VfbmIpOworCiAJcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRzYV9kcml2ZXIpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwpAQCAtOTAwLDYgKzkyNyw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBkc2FfY2xlYW51cF9tb2R1bGUodm9pZCkKIHsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmZHNhX25ldGRldmljZV9uYik7CiAJZGV2X3JlbW92ZV9wYWNrKCZkc2FfcGFja190eXBlKTsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHNhX2RyaXZlcik7CiB9CmRpZmYgLS1naXQgYS9uZXQvZHNhL2RzYV9wcml2LmggYi9uZXQvZHNhL2RzYV9wcml2LmgKaW5kZXggZGM5NzU2ZC4uZDVmMWY5YiAxMDA2NDQKLS0tIGEvbmV0L2RzYS9kc2FfcHJpdi5oCisrKyBiL25ldC9kc2EvZHNhX3ByaXYuaApAQCAtNDUsNiArNDUsOCBAQAogCWludAkJCW9sZF9saW5rOwogCWludAkJCW9sZF9wYXVzZTsKIAlpbnQJCQlvbGRfZHVwbGV4OworCisJc3RydWN0IG5ldF9kZXZpY2UJKmJyaWRnZV9kZXY7CiB9OwogCiAvKiBkc2EuYyAqLwpAQCAtNTMsMTEgKzU1LDEyIEBACiAvKiBzbGF2ZS5jICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGRzYV9kZXZpY2Vfb3BzIG5vdGFnX25ldGRldl9vcHM7CiB2b2lkIGRzYV9zbGF2ZV9taWlfYnVzX2luaXQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKLXN0cnVjdCBuZXRfZGV2aWNlICpkc2Ffc2xhdmVfY3JlYXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKLQkJCQkgICAgc3RydWN0IGRldmljZSAqcGFyZW50LAotCQkJCSAgICBpbnQgcG9ydCwgY2hhciAqbmFtZSk7CitpbnQgZHNhX3NsYXZlX2NyZWF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJICAgICBpbnQgcG9ydCwgY2hhciAqbmFtZSk7CiBpbnQgZHNhX3NsYXZlX3N1c3BlbmQoc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2Rldik7CiBpbnQgZHNhX3NsYXZlX3Jlc3VtZShzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KTsKK2ludCBkc2Ffc2xhdmVfbmV0ZGV2aWNlX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdW51c2VkLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKTsKIAogLyogdGFnX2RzYS5jICovCiBleHRlcm4gY29uc3Qgc3RydWN0IGRzYV9kZXZpY2Vfb3BzIGRzYV9uZXRkZXZfb3BzOwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9zbGF2ZS5jIGIvbmV0L2RzYS9zbGF2ZS5jCmluZGV4IGYyM2RlYWQuLjgyN2NkYTU2IDEwMDY0NAotLS0gYS9uZXQvZHNhL3NsYXZlLmMKKysrIGIvbmV0L2RzYS9zbGF2ZS5jCkBAIC0xMCwxMCArMTAsMTQgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeV9maXhlZC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L29mX21kaW8uaD4KKyNpbmNsdWRlIDxuZXQvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3N3aXRjaGRldi5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPgogI2luY2x1ZGUgImRzYV9wcml2LmgiCiAKIC8qIHNsYXZlIG1paV9idXMgaGFuZGxpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtNTEsMTMgKzU1LDE2IEBACiAKIAogLyogc2xhdmUgZGV2aWNlIGhhbmRsaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgaW50IGRzYV9zbGF2ZV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGRzYV9zbGF2ZV9nZXRfaWZsaW5rKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWRldi0+aWZsaW5rID0gcC0+cGFyZW50LT5kc3QtPm1hc3Rlcl9uZXRkZXYtPmlmaW5kZXg7CisJcmV0dXJuIHAtPnBhcmVudC0+ZHN0LT5tYXN0ZXJfbmV0ZGV2LT5pZmluZGV4OworfQogCi0JcmV0dXJuIDA7CitzdGF0aWMgaW5saW5lIGJvb2wgZHNhX3BvcnRfaXNfYnJpZGdlZChzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnApCit7CisJcmV0dXJuICEhcC0+YnJpZGdlX2RldjsKIH0KIAogc3RhdGljIGludCBkc2Ffc2xhdmVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNjUsNiArNzIsOCBAQAogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlciA9IHAtPnBhcmVudC0+ZHN0LT5tYXN0ZXJfbmV0ZGV2OwogCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKKwl1OCBzdHBfc3RhdGUgPSBkc2FfcG9ydF9pc19icmlkZ2VkKHApID8KKwkJCUJSX1NUQVRFX0JMT0NLSU5HIDogQlJfU1RBVEVfRk9SV0FSRElORzsKIAlpbnQgZXJyOwogCiAJaWYgKCEobWFzdGVyLT5mbGFncyAmIElGRl9VUCkpCkBAIC05Myw2ICsxMDIsOSBAQAogCQkJZ290byBjbGVhcl9wcm9taXNjOwogCX0KIAorCWlmIChkcy0+ZHJ2LT5wb3J0X3N0cF91cGRhdGUpCisJCWRzLT5kcnYtPnBvcnRfc3RwX3VwZGF0ZShkcywgcC0+cG9ydCwgc3RwX3N0YXRlKTsKKwogCWlmIChwLT5waHkpCiAJCXBoeV9zdGFydChwLT5waHkpOwogCkBAIC0xMzMsNiArMTQ1LDkgQEAKIAlpZiAoZHMtPmRydi0+cG9ydF9kaXNhYmxlKQogCQlkcy0+ZHJ2LT5wb3J0X2Rpc2FibGUoZHMsIHAtPnBvcnQsIHAtPnBoeSk7CiAKKwlpZiAoZHMtPmRydi0+cG9ydF9zdHBfdXBkYXRlKQorCQlkcy0+ZHJ2LT5wb3J0X3N0cF91cGRhdGUoZHMsIHAtPnBvcnQsIEJSX1NUQVRFX0RJU0FCTEVEKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xODQsNiArMTk5LDEwNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGRzYV9zbGF2ZV9mZGJfYWRkKHN0cnVjdCBuZG1zZyAqbmRtLCBzdHJ1Y3QgbmxhdHRyICp0YltdLAorCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICphZGRyLCB1MTYgdmlkLCB1MTYgbmxtX2ZsYWdzKQoreworCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OworCWludCByZXQgPSAtRU9QTk9UU1VQUDsKKworCWlmIChkcy0+ZHJ2LT5mZGJfYWRkKQorCQlyZXQgPSBkcy0+ZHJ2LT5mZGJfYWRkKGRzLCBwLT5wb3J0LCBhZGRyLCB2aWQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2Ffc2xhdmVfZmRiX2RlbChzdHJ1Y3QgbmRtc2cgKm5kbSwgc3RydWN0IG5sYXR0ciAqdGJbXSwKKwkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkciwgdTE2IHZpZCkKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlpZiAoZHMtPmRydi0+ZmRiX2RlbCkKKwkJcmV0ID0gZHMtPmRydi0+ZmRiX2RlbChkcywgcC0+cG9ydCwgYWRkciwgdmlkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHNhX3NsYXZlX2ZpbGxfaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFkZHIsIHUxNiB2aWQsCisJCQkgICAgICAgYm9vbCBpc19zdGF0aWMsCisJCQkgICAgICAgdTMyIHBvcnRpZCwgdTMyIHNlcSwgaW50IHR5cGUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXN0cnVjdCBuZG1zZyAqbmRtOworCisJbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIHR5cGUsIHNpemVvZigqbmRtKSwgZmxhZ3MpOworCWlmICghbmxoKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJbmRtID0gbmxtc2dfZGF0YShubGgpOworCW5kbS0+bmRtX2ZhbWlseQkgPSBBRl9CUklER0U7CisJbmRtLT5uZG1fcGFkMSAgICA9IDA7CisJbmRtLT5uZG1fcGFkMiAgICA9IDA7CisJbmRtLT5uZG1fZmxhZ3MJID0gTlRGX0VYVF9MRUFSTkVEOworCW5kbS0+bmRtX3R5cGUJID0gMDsKKwluZG0tPm5kbV9pZmluZGV4ID0gZGV2LT5pZmluZGV4OworCW5kbS0+bmRtX3N0YXRlICAgPSBpc19zdGF0aWMgPyBOVURfTk9BUlAgOiBOVURfUkVBQ0hBQkxFOworCisJaWYgKG5sYV9wdXQoc2tiLCBOREFfTExBRERSLCBFVEhfQUxFTiwgYWRkcikpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKHZpZCAmJiBubGFfcHV0X3UxNihza2IsIE5EQV9WTEFOLCB2aWQpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCW5sbXNnX2VuZChza2IsIG5saCk7CisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlubG1zZ19jYW5jZWwoc2tiLCBubGgpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKKy8qIER1bXAgaW5mb3JtYXRpb24gYWJvdXQgZW50cmllcywgaW4gcmVzcG9uc2UgdG8gR0VUTkVJR0ggKi8KK3N0YXRpYyBpbnQgZHNhX3NsYXZlX2ZkYl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZmlsdGVyX2RldiwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKKwl1bnNpZ25lZCBjaGFyIGFkZHJbRVRIX0FMRU5dID0geyAwIH07CisJaW50IHJldDsKKworCWlmICghZHMtPmRydi0+ZmRiX2dldG5leHQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWZvciAoOyA7IGlkeCsrKSB7CisJCWJvb2wgaXNfc3RhdGljOworCisJCXJldCA9IGRzLT5kcnYtPmZkYl9nZXRuZXh0KGRzLCBwLT5wb3J0LCBhZGRyLCAmaXNfc3RhdGljKTsKKwkJaWYgKHJldCA8IDApCisJCQlicmVhazsKKworCQlpZiAoaWR4IDwgY2ItPmFyZ3NbMF0pCisJCQljb250aW51ZTsKKworCQlyZXQgPSBkc2Ffc2xhdmVfZmlsbF9pbmZvKGRldiwgc2tiLCBhZGRyLCAwLAorCQkJCQkgIGlzX3N0YXRpYywKKwkJCQkJICBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKKwkJCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsCisJCQkJCSAgUlRNX05FV05FSUdILCBOTE1fRl9NVUxUSSk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGlkeDsKK30KKwogc3RhdGljIGludCBkc2Ffc2xhdmVfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGlmcmVxICppZnIsIGludCBjbWQpCiB7CiAJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKQEAgLTE5NCw2ICszMDgsOTIgQEAKIAlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKKy8qIFJldHVybiBhIGJpdG1hc2sgb2YgYWxsIHBvcnRzIGJlaW5nIGN1cnJlbnRseSBicmlkZ2VkIHdpdGhpbiBhIGdpdmVuIGJyaWRnZQorICogZGV2aWNlLiBOb3RlIHRoYXQgb24gbGVhdmUsIHRoZSBtYXNrIHdpbGwgc3RpbGwgcmV0dXJuIHRoZSBiaXRtYXNrIG9mIHBvcnRzCisgKiBjdXJyZW50bHkgYnJpZGdlZCwgcHJpb3IgdG8gcG9ydCByZW1vdmFsLCBhbmQgdGhpcyBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudC4KKyAqLworc3RhdGljIHUzMiBkc2Ffc2xhdmVfYnJfcG9ydF9tYXNrKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpicmlkZ2UpCit7CisJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwOworCXVuc2lnbmVkIGludCBwb3J0OworCXUzMiBtYXNrID0gMDsKKworCWZvciAocG9ydCA9IDA7IHBvcnQgPCBEU0FfTUFYX1BPUlRTOyBwb3J0KyspIHsKKwkJaWYgKCFkc2FfaXNfcG9ydF9pbml0aWFsaXplZChkcywgcG9ydCkpCisJCQljb250aW51ZTsKKworCQlwID0gbmV0ZGV2X3ByaXYoZHMtPnBvcnRzW3BvcnRdKTsKKworCQlpZiAoZHMtPnBvcnRzW3BvcnRdLT5wcml2X2ZsYWdzICYgSUZGX0JSSURHRV9QT1JUICYmCisJCSAgICBwLT5icmlkZ2VfZGV2ID09IGJyaWRnZSkKKwkJCW1hc2sgfD0gMSA8PCBwb3J0OworCX0KKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGRzYV9zbGF2ZV9zdHBfdXBkYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IHN0YXRlKQoreworCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OworCWludCByZXQgPSAtRU9QTk9UU1VQUDsKKworCWlmIChkcy0+ZHJ2LT5wb3J0X3N0cF91cGRhdGUpCisJCXJldCA9IGRzLT5kcnYtPnBvcnRfc3RwX3VwZGF0ZShkcywgcC0+cG9ydCwgc3RhdGUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkc2Ffc2xhdmVfYnJpZGdlX3BvcnRfam9pbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpicikKK3sKKwlzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgKnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBkc2Ffc3dpdGNoICpkcyA9IHAtPnBhcmVudDsKKwlpbnQgcmV0ID0gLUVPUE5PVFNVUFA7CisKKwlwLT5icmlkZ2VfZGV2ID0gYnI7CisKKwlpZiAoZHMtPmRydi0+cG9ydF9qb2luX2JyaWRnZSkKKwkJcmV0ID0gZHMtPmRydi0+cG9ydF9qb2luX2JyaWRnZShkcywgcC0+cG9ydCwKKwkJCQkJCWRzYV9zbGF2ZV9icl9wb3J0X21hc2soZHMsIGJyKSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzYV9zbGF2ZV9icmlkZ2VfcG9ydF9sZWF2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGRzYV9zd2l0Y2ggKmRzID0gcC0+cGFyZW50OworCWludCByZXQgPSAtRU9QTk9UU1VQUDsKKworCisJaWYgKGRzLT5kcnYtPnBvcnRfbGVhdmVfYnJpZGdlKQorCQlyZXQgPSBkcy0+ZHJ2LT5wb3J0X2xlYXZlX2JyaWRnZShkcywgcC0+cG9ydCwKKwkJCQkJCSBkc2Ffc2xhdmVfYnJfcG9ydF9tYXNrKGRzLCBwLT5icmlkZ2VfZGV2KSk7CisKKwlwLT5icmlkZ2VfZGV2ID0gTlVMTDsKKworCS8qIFBvcnQgbGVmdCB0aGUgYnJpZGdlLCBwdXQgaW4gQlJfU1RBVEVfRElTQUJMRUQgYnkgdGhlIGJyaWRnZSBsYXllciwKKwkgKiBzbyBhbGxvdyBpdCB0byBiZSBpbiBCUl9TVEFURV9GT1JXQVJESU5HIHRvIGJlIGtlcHQgZnVuY3Rpb25hbAorCSAqLworCWRzYV9zbGF2ZV9zdHBfdXBkYXRlKGRldiwgQlJfU1RBVEVfRk9SV0FSRElORyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzYV9zbGF2ZV9wYXJlbnRfaWRfZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgc3RydWN0IG5ldGRldl9waHlzX2l0ZW1faWQgKnBzaWQpCit7CisJc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CisKKwlwc2lkLT5pZF9sZW4gPSBzaXplb2YoZHMtPmluZGV4KTsKKwltZW1jcHkoJnBzaWQtPmlkLCAmZHMtPmluZGV4LCBwc2lkLT5pZF9sZW4pOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBuZXRkZXZfdHhfdCBkc2Ffc2xhdmVfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CkBAIC00NjIsMTQgKzY2MiwyMiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBkc2Ffc2xhdmVfbmV0ZGV2X29wcyA9IHsKLQkubmRvX2luaXQJCT0gZHNhX3NsYXZlX2luaXQsCiAJLm5kb19vcGVuCSAJPSBkc2Ffc2xhdmVfb3BlbiwKIAkubmRvX3N0b3AJCT0gZHNhX3NsYXZlX2Nsb3NlLAogCS5uZG9fc3RhcnRfeG1pdAkJPSBkc2Ffc2xhdmVfeG1pdCwKIAkubmRvX2NoYW5nZV9yeF9mbGFncwk9IGRzYV9zbGF2ZV9jaGFuZ2VfcnhfZmxhZ3MsCiAJLm5kb19zZXRfcnhfbW9kZQk9IGRzYV9zbGF2ZV9zZXRfcnhfbW9kZSwKIAkubmRvX3NldF9tYWNfYWRkcmVzcwk9IGRzYV9zbGF2ZV9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb19mZGJfYWRkCQk9IGRzYV9zbGF2ZV9mZGJfYWRkLAorCS5uZG9fZmRiX2RlbAkJPSBkc2Ffc2xhdmVfZmRiX2RlbCwKKwkubmRvX2ZkYl9kdW1wCQk9IGRzYV9zbGF2ZV9mZGJfZHVtcCwKIAkubmRvX2RvX2lvY3RsCQk9IGRzYV9zbGF2ZV9pb2N0bCwKKwkubmRvX2dldF9pZmxpbmsJCT0gZHNhX3NsYXZlX2dldF9pZmxpbmssCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHN3ZGV2X29wcyBkc2Ffc2xhdmVfc3dkZXZfb3BzID0geworCS5zd2Rldl9wYXJlbnRfaWRfZ2V0ID0gZHNhX3NsYXZlX3BhcmVudF9pZF9nZXQsCisJLnN3ZGV2X3BvcnRfc3RwX3VwZGF0ZSA9IGRzYV9zbGF2ZV9zdHBfdXBkYXRlLAogfTsKIAogc3RhdGljIHZvaWQgZHNhX3NsYXZlX2FkanVzdF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC01MTMsNiArNzIxLDI0IEBACiB9CiAKIC8qIHNsYXZlIGRldmljZSBzZXR1cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBkc2Ffc2xhdmVfcGh5X2Nvbm5lY3Qoc3RydWN0IGRzYV9zbGF2ZV9wcml2ICpwLAorCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2LAorCQkJCSBpbnQgYWRkcikKK3sKKwlzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMgPSBwLT5wYXJlbnQ7CisKKwlwLT5waHkgPSBkcy0+c2xhdmVfbWlpX2J1cy0+cGh5X21hcFthZGRyXTsKKwlpZiAoIXAtPnBoeSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBVc2UgYWxyZWFkeSBjb25maWd1cmVkIHBoeSBtb2RlICovCisJcC0+cGh5X2ludGVyZmFjZSA9IHAtPnBoeS0+aW50ZXJmYWNlOworCXBoeV9jb25uZWN0X2RpcmVjdChzbGF2ZV9kZXYsIHAtPnBoeSwgZHNhX3NsYXZlX2FkanVzdF9saW5rLAorCQkJICAgcC0+cGh5X2ludGVyZmFjZSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBkc2Ffc2xhdmVfcGh5X3NldHVwKHN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCwKIAkJCQlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQogewpAQCAtNTQ2LDEwICs3NzIsMjUgQEAKIAlpZiAoZHMtPmRydi0+Z2V0X3BoeV9mbGFncykKIAkJcGh5X2ZsYWdzID0gZHMtPmRydi0+Z2V0X3BoeV9mbGFncyhkcywgcC0+cG9ydCk7CiAKLQlpZiAocGh5X2RuKQotCQlwLT5waHkgPSBvZl9waHlfY29ubmVjdChzbGF2ZV9kZXYsIHBoeV9kbiwKLQkJCQkJZHNhX3NsYXZlX2FkanVzdF9saW5rLCBwaHlfZmxhZ3MsCi0JCQkJCXAtPnBoeV9pbnRlcmZhY2UpOworCWlmIChwaHlfZG4pIHsKKwkJcmV0ID0gb2ZfbWRpb19wYXJzZV9hZGRyKCZzbGF2ZV9kZXYtPmRldiwgcGh5X2RuKTsKKwkJLyogSWYgdGhpcyBQSFkgYWRkcmVzcyBpcyBwYXJ0IG9mIHBoeXNfbWlpX21hc2ssIHdoaWNoIG1lYW5zCisJCSAqIHRoYXQgd2UgbmVlZCB0byBkaXZlcnQgcmVhZHMgYW5kIHdyaXRlcyB0by9mcm9tIGl0LCB0aGVuIHdlCisJCSAqIHdhbnQgdG8gYmluZCB0aGlzIGRldmljZSB1c2luZyB0aGUgc2xhdmUgTUlJIGJ1cyBjcmVhdGVkIGJ5CisJCSAqIERTQSB0byBtYWtlIHRoYXQgaGFwcGVuLgorCQkgKi8KKwkJaWYgKCFwaHlfaXNfZml4ZWQgJiYgcmV0ID49IDAgJiYKKwkJICAgIChkcy0+cGh5c19taWlfbWFzayAmICgxIDw8IHJldCkpKSB7CisJCQlyZXQgPSBkc2Ffc2xhdmVfcGh5X2Nvbm5lY3QocCwgc2xhdmVfZGV2LCByZXQpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgeworCQkJcC0+cGh5ID0gb2ZfcGh5X2Nvbm5lY3Qoc2xhdmVfZGV2LCBwaHlfZG4sCisJCQkJCQlkc2Ffc2xhdmVfYWRqdXN0X2xpbmssCisJCQkJCQlwaHlfZmxhZ3MsCisJCQkJCQlwLT5waHlfaW50ZXJmYWNlKTsKKwkJfQorCX0KIAogCWlmIChwLT5waHkgJiYgcGh5X2lzX2ZpeGVkKQogCQlmaXhlZF9waHlfc2V0X2xpbmtfdXBkYXRlKHAtPnBoeSwgZHNhX3NsYXZlX2ZpeGVkX2xpbmtfdXBkYXRlKTsKQEAgLTU1OCwxNCArNzk5LDkgQEAKIAkgKiBNRElPIGJ1cyBpbnN0ZWFkCiAJICovCiAJaWYgKCFwLT5waHkpIHsKLQkJcC0+cGh5ID0gZHMtPnNsYXZlX21paV9idXMtPnBoeV9tYXBbcC0+cG9ydF07Ci0JCWlmICghcC0+cGh5KQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkJLyogVXNlIGFscmVhZHkgY29uZmlndXJlZCBwaHkgbW9kZSAqLwotCQlwLT5waHlfaW50ZXJmYWNlID0gcC0+cGh5LT5pbnRlcmZhY2U7Ci0JCXBoeV9jb25uZWN0X2RpcmVjdChzbGF2ZV9kZXYsIHAtPnBoeSwgZHNhX3NsYXZlX2FkanVzdF9saW5rLAotCQkJCSAgIHAtPnBoeV9pbnRlcmZhY2UpOworCQlyZXQgPSBkc2Ffc2xhdmVfcGh5X2Nvbm5lY3QocCwgc2xhdmVfZGV2LCBwLT5wb3J0KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfSBlbHNlIHsKIAkJbmV0ZGV2X2luZm8oc2xhdmVfZGV2LCAiYXR0YWNoZWQgUEhZIGF0IGFkZHJlc3MgJWQgWyVzXVxuIiwKIAkJCSAgICBwLT5waHktPmFkZHIsIHAtPnBoeS0+ZHJ2LT5uYW1lKTsKQEAgLTYwNSw5ICs4NDEsOCBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgbmV0X2RldmljZSAqCi1kc2Ffc2xhdmVfY3JlYXRlKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgc3RydWN0IGRldmljZSAqcGFyZW50LAotCQkgaW50IHBvcnQsIGNoYXIgKm5hbWUpCitpbnQgZHNhX3NsYXZlX2NyZWF0ZShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHN0cnVjdCBkZXZpY2UgKnBhcmVudCwKKwkJICAgICBpbnQgcG9ydCwgY2hhciAqbmFtZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyID0gZHMtPmRzdC0+bWFzdGVyX25ldGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2OwpAQCAtNjE3LDEzICs4NTIsMTQgQEAKIAlzbGF2ZV9kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBkc2Ffc2xhdmVfcHJpdiksIG5hbWUsCiAJCQkJIE5FVF9OQU1FX1VOS05PV04sIGV0aGVyX3NldHVwKTsKIAlpZiAoc2xhdmVfZGV2ID09IE5VTEwpCi0JCXJldHVybiBzbGF2ZV9kZXY7CisJCXJldHVybiAtRU5PTUVNOwogCiAJc2xhdmVfZGV2LT5mZWF0dXJlcyA9IG1hc3Rlci0+dmxhbl9mZWF0dXJlczsKIAlzbGF2ZV9kZXYtPmV0aHRvb2xfb3BzID0gJmRzYV9zbGF2ZV9ldGh0b29sX29wczsKIAlldGhfaHdfYWRkcl9pbmhlcml0KHNsYXZlX2RldiwgbWFzdGVyKTsKIAlzbGF2ZV9kZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CiAJc2xhdmVfZGV2LT5uZXRkZXZfb3BzID0gJmRzYV9zbGF2ZV9uZXRkZXZfb3BzOworCXNsYXZlX2Rldi0+c3dkZXZfb3BzID0gJmRzYV9zbGF2ZV9zd2Rldl9vcHM7CiAKIAlTRVRfTkVUREVWX0RFVihzbGF2ZV9kZXYsIHBhcmVudCk7CiAJc2xhdmVfZGV2LT5kZXYub2Zfbm9kZSA9IGRzLT5wZC0+cG9ydF9kbltwb3J0XTsKQEAgLTY2NywxOSArOTAzLDY0IEBACiAJcmV0ID0gZHNhX3NsYXZlX3BoeV9zZXR1cChwLCBzbGF2ZV9kZXYpOwogCWlmIChyZXQpIHsKIAkJZnJlZV9uZXRkZXYoc2xhdmVfZGV2KTsKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiByZXQ7CiAJfQogCisJZHMtPnBvcnRzW3BvcnRdID0gc2xhdmVfZGV2OwogCXJldCA9IHJlZ2lzdGVyX25ldGRldihzbGF2ZV9kZXYpOwogCWlmIChyZXQpIHsKIAkJbmV0ZGV2X2VycihtYXN0ZXIsICJlcnJvciAlZCByZWdpc3RlcmluZyBpbnRlcmZhY2UgJXNcbiIsCiAJCQkgICByZXQsIHNsYXZlX2Rldi0+bmFtZSk7CiAJCXBoeV9kaXNjb25uZWN0KHAtPnBoeSk7CisJCWRzLT5wb3J0c1twb3J0XSA9IE5VTEw7CiAJCWZyZWVfbmV0ZGV2KHNsYXZlX2Rldik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm4gcmV0OwogCX0KIAogCW5ldGlmX2NhcnJpZXJfb2ZmKHNsYXZlX2Rldik7CiAKLQlyZXR1cm4gc2xhdmVfZGV2OworCXJldHVybiAwOworfQorCitzdGF0aWMgYm9vbCBkc2Ffc2xhdmVfZGV2X2NoZWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldi0+bmV0ZGV2X29wcyA9PSAmZHNhX3NsYXZlX25ldGRldl9vcHM7Cit9CisKK3N0YXRpYyBpbnQgZHNhX3NsYXZlX21hc3Rlcl9jaGFuZ2VkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm1hc3RlciA9IG5ldGRldl9tYXN0ZXJfdXBwZXJfZGV2X2dldChkZXYpOworCXN0cnVjdCBkc2Ffc2xhdmVfcHJpdiAqcCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVyciA9IDA7CisKKwlpZiAobWFzdGVyICYmIG1hc3Rlci0+cnRubF9saW5rX29wcyAmJgorCSAgICAhc3RyY21wKG1hc3Rlci0+cnRubF9saW5rX29wcy0+a2luZCwgImJyaWRnZSIpKQorCQllcnIgPSBkc2Ffc2xhdmVfYnJpZGdlX3BvcnRfam9pbihkZXYsIG1hc3Rlcik7CisJZWxzZSBpZiAoZHNhX3BvcnRfaXNfYnJpZGdlZChwKSkKKwkJZXJyID0gZHNhX3NsYXZlX2JyaWRnZV9wb3J0X2xlYXZlKGRldik7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZHNhX3NsYXZlX25ldGRldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCWludCBlcnIgPSAwOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX0NIQU5HRVVQUEVSOgorCQlkZXYgPSBuZXRkZXZfbm90aWZpZXJfaW5mb190b19kZXYocHRyKTsKKwkJaWYgKCFkc2Ffc2xhdmVfZGV2X2NoZWNrKGRldikpCisJCQlnb3RvIG91dDsKKworCQllcnIgPSBkc2Ffc2xhdmVfbWFzdGVyX2NoYW5nZWQoZGV2KTsKKwkJaWYgKGVycikKKwkJCW5ldGRldl93YXJuKGRldiwgImZhaWxlZCB0byByZWZsZWN0IG1hc3RlciBjaGFuZ2VcbiIpOworCisJCWJyZWFrOworCX0KKworb3V0OgorCXJldHVybiBOT1RJRllfRE9ORTsKIH0KZGlmZiAtLWdpdCBhL25ldC9ldGhlcm5ldC9ldGguYyBiL25ldC9ldGhlcm5ldC9ldGguYwppbmRleCAyMzhmMzhkLi5mM2JhZDQxIDEwMDY0NAotLS0gYS9uZXQvZXRoZXJuZXQvZXRoLmMKKysrIGIvbmV0L2V0aGVybmV0L2V0aC5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAkgKi8KIAogCWlmIChkZXYtPmZsYWdzICYgKElGRl9MT09QQkFDSyB8IElGRl9OT0FSUCkpIHsKLQkJbWVtc2V0KGV0aC0+aF9kZXN0LCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIoZXRoLT5oX2Rlc3QpOwogCQlyZXR1cm4gRVRIX0hMRU47CiAJfQogCkBAIC0xMTMsMzkgKzExMyw2IEBACiBFWFBPUlRfU1lNQk9MKGV0aF9oZWFkZXIpOwogCiAvKioKLSAqIGV0aF9yZWJ1aWxkX2hlYWRlci0gcmVidWlsZCB0aGUgRXRoZXJuZXQgTUFDIGhlYWRlci4KLSAqIEBza2I6IHNvY2tldCBidWZmZXIgdG8gdXBkYXRlCi0gKgotICogVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYW4gQVJQIG9yIElQVjYgbmRpc2MgaXQncyByZXNvbHV0aW9uIG9uIHRoaXMKLSAqIHNrX2J1ZmYuIFdlIG5vdyBsZXQgcHJvdG9jb2wgKEFSUCkgZmlsbCBpbiB0aGUgb3RoZXIgZmllbGRzLgotICoKLSAqIFRoaXMgcm91dGluZSBDQU5OT1QgdXNlIGNhY2hlZCBkc3QtPm5laWdoIQotICogUmVhbGx5LCBpdCBpcyB1c2VkIG9ubHkgd2hlbiBkc3QtPm5laWdoIGlzIHdyb25nLgotICovCi1pbnQgZXRoX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGV0aGhkciAqZXRoID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwotCi0Jc3dpdGNoIChldGgtPmhfcHJvdG8pIHsKLSNpZmRlZiBDT05GSUdfSU5FVAotCWNhc2UgaHRvbnMoRVRIX1BfSVApOgotCQlyZXR1cm4gYXJwX2ZpbmQoZXRoLT5oX2Rlc3QsIHNrYik7Ci0jZW5kaWYKLQlkZWZhdWx0OgotCQluZXRkZXZfZGJnKGRldiwKLQkJICAgICAgICIlczogdW5hYmxlIHRvIHJlc29sdmUgdHlwZSAlWCBhZGRyZXNzZXMuXG4iLAotCQkgICAgICAgZGV2LT5uYW1lLCBudG9ocyhldGgtPmhfcHJvdG8pKTsKLQotCQltZW1jcHkoZXRoLT5oX3NvdXJjZSwgZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZXRoX3JlYnVpbGRfaGVhZGVyKTsKLQotLyoqCiAgKiBldGhfZ2V0X2hlYWRsZW4gLSBkZXRlcm1pbmUgdGhlIHRoZSBsZW5ndGggb2YgaGVhZGVyIGZvciBhbiBldGhlcm5ldCBmcmFtZQogICogQGRhdGE6IHBvaW50ZXIgdG8gc3RhcnQgb2YgZnJhbWUKICAqIEBsZW46IHRvdGFsIGxlbmd0aCBvZiBmcmFtZQpAQCAtMzY5LDcgKzMzNiw2IEBACiBjb25zdCBzdHJ1Y3QgaGVhZGVyX29wcyBldGhfaGVhZGVyX29wcyBfX19fY2FjaGVsaW5lX2FsaWduZWQgPSB7CiAJLmNyZWF0ZQkJPSBldGhfaGVhZGVyLAogCS5wYXJzZQkJPSBldGhfaGVhZGVyX3BhcnNlLAotCS5yZWJ1aWxkCT0gZXRoX3JlYnVpbGRfaGVhZGVyLAogCS5jYWNoZQkJPSBldGhfaGVhZGVyX2NhY2hlLAogCS5jYWNoZV91cGRhdGUJPSBldGhfaGVhZGVyX2NhY2hlX3VwZGF0ZSwKIH07CkBAIC0zOTEsNyArMzU3LDcgQEAKIAlkZXYtPmZsYWdzCQk9IElGRl9CUk9BRENBU1R8SUZGX01VTFRJQ0FTVDsKIAlkZXYtPnByaXZfZmxhZ3MJCXw9IElGRl9UWF9TS0JfU0hBUklORzsKIAotCW1lbXNldChkZXYtPmJyb2FkY2FzdCwgMHhGRiwgRVRIX0FMRU4pOworCWV0aF9icm9hZGNhc3RfYWRkcihkZXYtPmJyb2FkY2FzdCk7CiAKIH0KIEVYUE9SVF9TWU1CT0woZXRoZXJfc2V0dXApOwpkaWZmIC0tZ2l0IGEvbmV0L2llZWU4MDIxNTQvNmxvd3Bhbi9jb3JlLmMgYi9uZXQvaWVlZTgwMjE1NC82bG93cGFuL2NvcmUuYwppbmRleCAwNTVmYmI3Li4wYWU1ODIyIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjE1NC82bG93cGFuL2NvcmUuYworKysgYi9uZXQvaWVlZTgwMjE1NC82bG93cGFuL2NvcmUuYwpAQCAtMTEzLDcgKzExMyw3IEBACiB7CiAJZGV2LT5hZGRyX2xlbgkJPSBJRUVFODAyMTU0X0FERFJfTEVOOwogCW1lbXNldChkZXYtPmJyb2FkY2FzdCwgMHhmZiwgSUVFRTgwMjE1NF9BRERSX0xFTik7Ci0JZGV2LT50eXBlCQk9IEFSUEhSRF9JRUVFODAyMTU0OworCWRldi0+dHlwZQkJPSBBUlBIUkRfNkxPV1BBTjsKIAkvKiBGcmFtZSBDb250cm9sICsgU2VxdWVuY2UgTnVtYmVyICsgQWRkcmVzcyBmaWVsZHMgKyBTZWN1cml0eSBIZWFkZXIgKi8KIAlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IDIgKyAxICsgMjAgKyAxNDsKIAlkZXYtPm5lZWRlZF90YWlscm9vbQk9IDI7IC8qIEZDUyAqLwpAQCAtMTI2LDYgKzEyNiw3IEBACiAJZGV2LT5oZWFkZXJfb3BzCQk9ICZsb3dwYW5faGVhZGVyX29wczsKIAlkZXYtPm1sX3ByaXYJCT0gJmxvd3Bhbl9tbG1lOwogCWRldi0+ZGVzdHJ1Y3RvcgkJPSBmcmVlX25ldGRldjsKKwlkZXYtPmZlYXR1cmVzCQl8PSBORVRJRl9GX05FVE5TX0xPQ0FMOwogfQogCiBzdGF0aWMgaW50IGxvd3Bhbl92YWxpZGF0ZShzdHJ1Y3QgbmxhdHRyICp0YltdLCBzdHJ1Y3QgbmxhdHRyICpkYXRhW10pCkBAIC0xNDgsMTAgKzE0OSwxMSBAQAogCiAJcHJfZGVidWcoImFkZGluZyBuZXcgbGlua1xuIik7CiAKLQlpZiAoIXRiW0lGTEFfTElOS10pCisJaWYgKCF0YltJRkxBX0xJTktdIHx8CisJICAgICFuZXRfZXEoZGV2X25ldChkZXYpLCAmaW5pdF9uZXQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAkvKiBmaW5kIGFuZCBob2xkIHJlYWwgd3BhbiBkZXZpY2UgKi8KLQlyZWFsX2RldiA9IGRldl9nZXRfYnlfaW5kZXgoc3JjX25ldCwgbmxhX2dldF91MzIodGJbSUZMQV9MSU5LXSkpOworCXJlYWxfZGV2ID0gZGV2X2dldF9ieV9pbmRleChkZXZfbmV0KGRldiksIG5sYV9nZXRfdTMyKHRiW0lGTEFfTElOS10pKTsKIAlpZiAoIXJlYWxfZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAocmVhbF9kZXYtPnR5cGUgIT0gQVJQSFJEX0lFRUU4MDIxNTQpIHsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L2NvcmUuYyBiL25ldC9pZWVlODAyMTU0L2NvcmUuYwppbmRleCAxOGJjN2U3Li4yZWUwMGU4IDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjE1NC9jb3JlLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvY29yZS5jCkBAIC0yNSw2ICsyNSw5IEBACiAjaW5jbHVkZSAic3lzZnMuaCIKICNpbmNsdWRlICJjb3JlLmgiCiAKKy8qIG5hbWUgZm9yIHN5c2ZzLCAlZCBpcyBhcHBlbmRlZCAqLworI2RlZmluZSBQSFlfTkFNRSAicGh5IgorCiAvKiBSQ1UtcHJvdGVjdGVkIChhbmQgUlROTCBmb3Igd3JpdGVycykgKi8KIExJU1RfSEVBRChjZmc4MDIxNTRfcmRldl9saXN0KTsKIGludCBjZmc4MDIxNTRfcmRldl9saXN0X2dlbmVyYXRpb247CkBAIC0xMjIsNyArMTI1LDcgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT53cGFuX2Rldl9saXN0KTsKIAlkZXZpY2VfaW5pdGlhbGl6ZSgmcmRldi0+d3Bhbl9waHkuZGV2KTsKLQlkZXZfc2V0X25hbWUoJnJkZXYtPndwYW5fcGh5LmRldiwgIndwYW4tcGh5JWQiLCByZGV2LT53cGFuX3BoeV9pZHgpOworCWRldl9zZXRfbmFtZSgmcmRldi0+d3Bhbl9waHkuZGV2LCBQSFlfTkFNRSAiJWQiLCByZGV2LT53cGFuX3BoeV9pZHgpOwogCiAJcmRldi0+d3Bhbl9waHkuZGV2LmNsYXNzID0gJndwYW5fcGh5X2NsYXNzOwogCXJkZXYtPndwYW5fcGh5LmRldi5wbGF0Zm9ybV9kYXRhID0gcmRldjsKQEAgLTIyNSw2ICsyMjgsNyBAQAogCXN3aXRjaCAoc3RhdGUpIHsKIAkJLyogVE9ETyBORVRERVZfREVWVFlQRSAqLwogCWNhc2UgTkVUREVWX1JFR0lTVEVSOgorCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTkVUTlNfTE9DQUw7CiAJCXdwYW5fZGV2LT5pZGVudGlmaWVyID0gKytyZGV2LT53cGFuX2Rldl9pZDsKIAkJbGlzdF9hZGRfcmN1KCZ3cGFuX2Rldi0+bGlzdCwgJnJkZXYtPndwYW5fZGV2X2xpc3QpOwogCQlyZGV2LT5kZXZsaXN0X2dlbmVyYXRpb24rKzsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L25sLW1hYy5jIGIvbmV0L2llZWU4MDIxNTQvbmwtbWFjLmMKaW5kZXggOTEwNTI2NS4uMmI0OTU1ZCAxMDA2NDQKLS0tIGEvbmV0L2llZWU4MDIxNTQvbmwtbWFjLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvbmwtbWFjLmMKQEAgLTc2LDcgKzc2LDYgQEAKIAlubG1zZ19mcmVlKG1zZyk7CiAJcmV0dXJuIC1FTk9CVUZTOwogfQotRVhQT1JUX1NZTUJPTChpZWVlODAyMTU0X25sX3N0YXJ0X2NvbmZpcm0pOwogCiBzdGF0aWMgaW50IGllZWU4MDIxNTRfbmxfZmlsbF9pZmFjZShzdHJ1Y3Qgc2tfYnVmZiAqbXNnLCB1MzIgcG9ydGlkLAogCQkJCSAgICB1MzIgc2VxLCBpbnQgZmxhZ3MsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjE1NC9zb2NrZXQuYyBiL25ldC9pZWVlODAyMTU0L3NvY2tldC5jCmluZGV4IDI4NzhkOGMuLmI2MGM2NWYgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTU0L3NvY2tldC5jCisrKyBiL25ldC9pZWVlODAyMTU0L3NvY2tldC5jCkBAIC05OCwxMiArOTgsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpZWVlODAyMTU0X3NvY2tfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCBpZWVlODAyMTU0X3NvY2tfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkJICAgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAotCXJldHVybiBzay0+c2tfcHJvdC0+c2VuZG1zZyhpb2NiLCBzaywgbXNnLCBsZW4pOworCXJldHVybiBzay0+c2tfcHJvdC0+c2VuZG1zZyhzaywgbXNnLCBsZW4pOwogfQogCiBzdGF0aWMgaW50IGllZWU4MDIxNTRfc29ja19iaW5kKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrYWRkciAqdWFkZHIsCkBAIC0yNTUsOCArMjU1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByYXdfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCitzdGF0aWMgaW50IHJhd19zZW5kbXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXVuc2lnbmVkIGludCBtdHU7CkBAIC0zMjcsOCArMzI2LDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHJhd19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCi0JCSAgICAgICBzaXplX3QgbGVuLCBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQorc3RhdGljIGludCByYXdfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJICAgICAgIGludCBub2Jsb2NrLCBpbnQgZmxhZ3MsIGludCAqYWRkcl9sZW4pCiB7CiAJc2l6ZV90IGNvcGllZCA9IDA7CiAJaW50IGVyciA9IC1FT1BOT1RTVVBQOwpAQCAtNjE1LDggKzYxNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZGdyYW1fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJCSBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplKQorc3RhdGljIGludCBkZ3JhbV9zZW5kbXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXVuc2lnbmVkIGludCBtdHU7CkBAIC03MTUsOSArNzEzLDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGRncmFtX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgbm9ibG9jaywKLQkJCSBpbnQgZmxhZ3MsIGludCAqYWRkcl9sZW4pCitzdGF0aWMgaW50IGRncmFtX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCisJCQkgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKIHsKIAlzaXplX3QgY29waWVkID0gMDsKIAlpbnQgZXJyID0gLUVPUE5PVFNVUFA7CmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjE1NC9zeXNmcy5jIGIvbmV0L2llZWU4MDIxNTQvc3lzZnMuYwppbmRleCBkZmY1NWMyLi4xMzNiNDI4IDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjE1NC9zeXNmcy5jCisrKyBiL25ldC9pZWVlODAyMTU0L3N5c2ZzLmMKQEAgLTQ4LDQ5ICs0OCw2IEBACiB9CiBzdGF0aWMgREVWSUNFX0FUVFJfUk8obmFtZSk7CiAKLSNkZWZpbmUgTUFTVEVSX1NIT1dfQ09NUExFWChuYW1lLCBmb3JtYXRfc3RyaW5nLCBhcmdzLi4uKQkJXAotc3RhdGljIHNzaXplX3QgbmFtZSAjIyBfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCVwKLXsJCQkJCQkJCQlcCi0Jc3RydWN0IHdwYW5fcGh5ICpwaHkgPSBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgd3Bhbl9waHksIGRldik7CVwKLQlpbnQgcmV0OwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JbXV0ZXhfbG9jaygmcGh5LT5waWJfbG9jayk7CQkJCQlcCi0JcmV0ID0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsIGZvcm1hdF9zdHJpbmcgIlxuIiwgYXJncyk7CVwKLQltdXRleF91bmxvY2soJnBoeS0+cGliX2xvY2spOwkJCQkJXAotCXJldHVybiByZXQ7CQkJCQkJCVwKLX0JCQkJCQkJCQlcCi1zdGF0aWMgREVWSUNFX0FUVFJfUk8obmFtZSkKLQotI2RlZmluZSBNQVNURVJfU0hPVyhmaWVsZCwgZm9ybWF0X3N0cmluZykJCQkJXAotCU1BU1RFUl9TSE9XX0NPTVBMRVgoZmllbGQsIGZvcm1hdF9zdHJpbmcsIHBoeS0+ZmllbGQpCi0KLU1BU1RFUl9TSE9XKGN1cnJlbnRfY2hhbm5lbCwgIiVkIik7Ci1NQVNURVJfU0hPVyhjdXJyZW50X3BhZ2UsICIlZCIpOwotTUFTVEVSX1NIT1codHJhbnNtaXRfcG93ZXIsICIlZCArLSAxIGRCIik7Ci1NQVNURVJfU0hPV19DT01QTEVYKGNjYV9tb2RlLCAiJWQiLCBwaHktPmNjYS5tb2RlKTsKLQotc3RhdGljIHNzaXplX3QgY2hhbm5lbHNfc3VwcG9ydGVkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgICAgICAgY2hhciAqYnVmKQotewotCXN0cnVjdCB3cGFuX3BoeSAqcGh5ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHdwYW5fcGh5LCBkZXYpOwotCWludCByZXQ7Ci0JaW50IGksIGxlbiA9IDA7Ci0KLQltdXRleF9sb2NrKCZwaHktPnBpYl9sb2NrKTsKLQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotCQlyZXQgPSBzbnByaW50ZihidWYgKyBsZW4sIFBBR0VfU0laRSAtIGxlbiwKLQkJCSAgICAgICAiJSMwOXhcbiIsIHBoeS0+Y2hhbm5lbHNfc3VwcG9ydGVkW2ldKTsKLQkJaWYgKHJldCA8IDApCi0JCQlicmVhazsKLQkJbGVuICs9IHJldDsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwaHktPnBpYl9sb2NrKTsKLQlyZXR1cm4gbGVuOwotfQotc3RhdGljIERFVklDRV9BVFRSX1JPKGNoYW5uZWxzX3N1cHBvcnRlZCk7Ci0KIHN0YXRpYyB2b2lkIHdwYW5fcGh5X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBjZmc4MDIxNTRfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBkZXZfdG9fcmRldihkZXYpOwpAQCAtMTAxLDEyICs1OCw2IEBACiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcG1pYl9hdHRyc1tdID0gewogCSZkZXZfYXR0cl9pbmRleC5hdHRyLAogCSZkZXZfYXR0cl9uYW1lLmF0dHIsCi0JLyogYmVsb3cgd2lsbCBiZSByZW1vdmVkIHNvb24gKi8KLQkmZGV2X2F0dHJfY3VycmVudF9jaGFubmVsLmF0dHIsCi0JJmRldl9hdHRyX2N1cnJlbnRfcGFnZS5hdHRyLAotCSZkZXZfYXR0cl9jaGFubmVsc19zdXBwb3J0ZWQuYXR0ciwKLQkmZGV2X2F0dHJfdHJhbnNtaXRfcG93ZXIuYXR0ciwKLQkmZGV2X2F0dHJfY2NhX21vZGUuYXR0ciwKIAlOVUxMLAogfTsKIEFUVFJJQlVURV9HUk9VUFMocG1pYik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9hZl9pbmV0LmMgYi9uZXQvaXB2NC9hZl9pbmV0LmMKaW5kZXggZDJlNDliYS4uOGI0N2E0ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvYWZfaW5ldC5jCisrKyBiL25ldC9pcHY0L2FmX2luZXQuYwpAQCAtMjE3LDcgKzIxNyw3IEBACiAJCSAqIHNodXRkb3duKCkgKHJhdGhlciB0aGFuIGNsb3NlKCkpLgogCQkgKi8KIAkJaWYgKChzeXNjdGxfdGNwX2Zhc3RvcGVuICYgVEZPX1NFUlZFUl9FTkFCTEUpICE9IDAgJiYKLQkJICAgIGluZXRfY3NrKHNrKS0+aWNza19hY2NlcHRfcXVldWUuZmFzdG9wZW5xID09IE5VTEwpIHsKKwkJICAgICFpbmV0X2NzayhzayktPmljc2tfYWNjZXB0X3F1ZXVlLmZhc3RvcGVucSkgewogCQkJaWYgKChzeXNjdGxfdGNwX2Zhc3RvcGVuICYgVEZPX1NFUlZFUl9XT19TT0NLT1BUMSkgIT0gMCkKIAkJCQllcnIgPSBmYXN0b3Blbl9pbml0X3F1ZXVlKHNrLCBiYWNrbG9nKTsKIAkJCWVsc2UgaWYgKChzeXNjdGxfdGNwX2Zhc3RvcGVuICYKQEAgLTMxNCwxMSArMzE0LDExIEBACiAJYW5zd2VyX2ZsYWdzID0gYW5zd2VyLT5mbGFnczsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAotCVdBUk5fT04oYW5zd2VyX3Byb3QtPnNsYWIgPT0gTlVMTCk7CisJV0FSTl9PTighYW5zd2VyX3Byb3QtPnNsYWIpOwogCiAJZXJyID0gLUVOT0JVRlM7CiAJc2sgPSBza19hbGxvYyhuZXQsIFBGX0lORVQsIEdGUF9LRVJORUwsIGFuc3dlcl9wcm90KTsKLQlpZiAoc2sgPT0gTlVMTCkKKwlpZiAoIXNrKQogCQlnb3RvIG91dDsKIAogCWVyciA9IDA7CkBAIC03MTYsOCArNzE2LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woaW5ldF9nZXRuYW1lKTsKIAotaW50IGluZXRfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJIHNpemVfdCBzaXplKQoraW50IGluZXRfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCkBAIC03MjgsNyArNzI3LDcgQEAKIAkgICAgaW5ldF9hdXRvYmluZChzaykpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JcmV0dXJuIHNrLT5za19wcm90LT5zZW5kbXNnKGlvY2IsIHNrLCBtc2csIHNpemUpOworCXJldHVybiBzay0+c2tfcHJvdC0+c2VuZG1zZyhzaywgbXNnLCBzaXplKTsKIH0KIEVYUE9SVF9TWU1CT0woaW5ldF9zZW5kbXNnKTsKIApAQCAtNzUwLDggKzc0OSw4IEBACiB9CiBFWFBPUlRfU1lNQk9MKGluZXRfc2VuZHBhZ2UpOwogCi1pbnQgaW5ldF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkgc2l6ZV90IHNpemUsIGludCBmbGFncykKK2ludCBpbmV0X3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwKKwkJIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlpbnQgYWRkcl9sZW4gPSAwOwpAQCAtNzU5LDcgKzc1OCw3IEBACiAKIAlzb2NrX3Jwc19yZWNvcmRfZmxvdyhzayk7CiAKLQllcnIgPSBzay0+c2tfcHJvdC0+cmVjdm1zZyhpb2NiLCBzaywgbXNnLCBzaXplLCBmbGFncyAmIE1TR19ET05UV0FJVCwKKwllcnIgPSBzay0+c2tfcHJvdC0+cmVjdm1zZyhzaywgbXNnLCBzaXplLCBmbGFncyAmIE1TR19ET05UV0FJVCwKIAkJCQkgICBmbGFncyAmIH5NU0dfRE9OVFdBSVQsICZhZGRyX2xlbik7CiAJaWYgKGVyciA+PSAwKQogCQltc2ctPm1zZ19uYW1lbGVuID0gYWRkcl9sZW47CkBAIC0xMjcwLDcgKzEyNjksNyBAQAogCQlpZiAodWRwZnJhZykgewogCQkJaXBoLT5pZCA9IGh0b25zKGlkKTsKIAkJCWlwaC0+ZnJhZ19vZmYgPSBodG9ucyhvZmZzZXQgPj4gMyk7Ci0JCQlpZiAoc2tiLT5uZXh0ICE9IE5VTEwpCisJCQlpZiAoc2tiLT5uZXh0KQogCQkJCWlwaC0+ZnJhZ19vZmYgfD0gaHRvbnMoSVBfTUYpOwogCQkJb2Zmc2V0ICs9IHNrYi0+bGVuIC0gbmhvZmYgLSBpaGw7CiAJCX0gZWxzZSB7CkBAIC0xNjc1LDcgKzE2NzQsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgKnI7CiAJaW50IHJjID0gLUVJTlZBTDsKIAotCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IGluZXRfc2tiX3Bhcm0pID4gRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBjYikpOworCXNvY2tfc2tiX2NiX2NoZWNrX3NpemUoc2l6ZW9mKHN0cnVjdCBpbmV0X3NrYl9wYXJtKSk7CiAKIAlyYyA9IHByb3RvX3JlZ2lzdGVyKCZ0Y3BfcHJvdCwgMSk7CiAJaWYgKHJjKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYXJwLmMgYi9uZXQvaXB2NC9hcnAuYwppbmRleCAyMDVlMTQ3Li45MzNhOTI4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hcnAuYworKysgYi9uZXQvaXB2NC9hcnAuYwpAQCAtMTIyLDYgKzEyMiw3IEBACiAgKglJbnRlcmZhY2UgdG8gZ2VuZXJpYyBuZWlnaGJvdXIgY2FjaGUuCiAgKi8KIHN0YXRpYyB1MzIgYXJwX2hhc2goY29uc3Qgdm9pZCAqcGtleSwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MzIgKmhhc2hfcm5kKTsKK3N0YXRpYyBib29sIGFycF9rZXlfZXEoY29uc3Qgc3RydWN0IG5laWdoYm91ciAqbiwgY29uc3Qgdm9pZCAqcGtleSk7CiBzdGF0aWMgaW50IGFycF9jb25zdHJ1Y3RvcihzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCk7CiBzdGF0aWMgdm9pZCBhcnBfc29saWNpdChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBzdGF0aWMgdm9pZCBhcnBfZXJyb3JfcmVwb3J0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTE0OSwxOCArMTUwLDEyIEBACiAJLmNvbm5lY3RlZF9vdXRwdXQgPQluZWlnaF9kaXJlY3Rfb3V0cHV0LAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBuZWlnaF9vcHMgYXJwX2Jyb2tlbl9vcHMgPSB7Ci0JLmZhbWlseSA9CQlBRl9JTkVULAotCS5zb2xpY2l0ID0JCWFycF9zb2xpY2l0LAotCS5lcnJvcl9yZXBvcnQgPQkJYXJwX2Vycm9yX3JlcG9ydCwKLQkub3V0cHV0ID0JCW5laWdoX2NvbXBhdF9vdXRwdXQsCi0JLmNvbm5lY3RlZF9vdXRwdXQgPQluZWlnaF9jb21wYXRfb3V0cHV0LAotfTsKLQogc3RydWN0IG5laWdoX3RhYmxlIGFycF90YmwgPSB7CiAJLmZhbWlseQkJPSBBRl9JTkVULAogCS5rZXlfbGVuCT0gNCwKKwkucHJvdG9jb2wJPSBjcHVfdG9fYmUxNihFVEhfUF9JUCksCiAJLmhhc2gJCT0gYXJwX2hhc2gsCisJLmtleV9lcQkJPSBhcnBfa2V5X2VxLAogCS5jb25zdHJ1Y3Rvcgk9IGFycF9jb25zdHJ1Y3RvciwKIAkucHJveHlfcmVkbwk9IHBhcnBfcmVkbywKIAkuaWQJCT0gImFycF9jYWNoZSIsCkBAIC0yMTYsNyArMjExLDEyIEBACiAJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkgICAgX191MzIgKmhhc2hfcm5kKQogewotCXJldHVybiBhcnBfaGFzaGZuKCoodTMyICopcGtleSwgZGV2LCAqaGFzaF9ybmQpOworCXJldHVybiBhcnBfaGFzaGZuKHBrZXksIGRldiwgaGFzaF9ybmQpOworfQorCitzdGF0aWMgYm9vbCBhcnBfa2V5X2VxKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBjb25zdCB2b2lkICpwa2V5KQoreworCXJldHVybiBuZWlnaF9rZXlfZXEzMihuZWlnaCwgcGtleSk7CiB9CiAKIHN0YXRpYyBpbnQgYXJwX2NvbnN0cnVjdG9yKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQpAQCAtMjI4LDcgKzIyOCw3IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShkZXYpOwotCWlmIChpbl9kZXYgPT0gTlVMTCkgeworCWlmICghaW5fZGV2KSB7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yNjAsMzUgKzI2MCw2IEBACiAJCSAgIGluIG9sZCBwYXJhZGlnbS4KIAkJICovCiAKLSNpZiAxCi0JCS8qIFNvLi4uIHRoZXNlICJhbWF0ZXVyIiBkZXZpY2VzIGFyZSBob3BlbGVzcy4KLQkJICAgVGhlIG9ubHkgdGhpbmcsIHRoYXQgSSBjYW4gc2F5IG5vdzoKLQkJICAgSXQgaXMgdmVyeSBzYWQgdGhhdCB3ZSBuZWVkIHRvIGtlZXAgdWdseSBvYnNvbGV0ZQotCQkgICBjb2RlIHRvIG1ha2UgdGhlbSBoYXBweS4KLQotCQkgICBUaGV5IHNob3VsZCBiZSBtb3ZlZCB0byBtb3JlIHJlYXNvbmFibGUgc3RhdGUsIG5vdwotCQkgICB0aGV5IHVzZSByZWJ1aWxkX2hlYWRlciBJTlNURUFEIE9GIGhhcmRfc3RhcnRfeG1pdCEhIQotCQkgICBCZXNpZGVzIHRoYXQsIHRoZXkgYXJlIHNvcnQgb2Ygb3V0IG9mIGRhdGUKLQkJICAgKGEgbG90IG9mIHJlZHVuZGFudCBjbG9uZXMvY29waWVzLCB1c2VsZXNzIGluIDIuMSksCi0JCSAgIEkgd29uZGVyIHdoeSBwZW9wbGUgYmVsaWV2ZSB0aGF0IHRoZXkgd29yay4KLQkJICovCi0JCXN3aXRjaCAoZGV2LT50eXBlKSB7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJY2FzZSBBUlBIUkRfUk9TRToKLSNpZiBJU19FTkFCTEVEKENPTkZJR19BWDI1KQotCQljYXNlIEFSUEhSRF9BWDI1OgotI2lmIElTX0VOQUJMRUQoQ09ORklHX05FVFJPTSkKLQkJY2FzZSBBUlBIUkRfTkVUUk9NOgotI2VuZGlmCi0JCQluZWlnaC0+b3BzID0gJmFycF9icm9rZW5fb3BzOwotCQkJbmVpZ2gtPm91dHB1dCA9IG5laWdoLT5vcHMtPm91dHB1dDsKLQkJCXJldHVybiAwOwotI2Vsc2UKLQkJCWJyZWFrOwotI2VuZGlmCi0JCX0KLSNlbmRpZgogCQlpZiAobmVpZ2gtPnR5cGUgPT0gUlROX01VTFRJQ0FTVCkgewogCQkJbmVpZ2gtPm51ZF9zdGF0ZSA9IE5VRF9OT0FSUDsKIAkJCWFycF9tY19tYXAoYWRkciwgbmVpZ2gtPmhhLCBkZXYsIDEpOwpAQCAtNDMzLDcxICs0MDQsNiBAQAogCXJldHVybiBmbGFnOwogfQogCi0vKiBPQlNPTEVURSBGVU5DVElPTlMgKi8KLQotLyoKLSAqCUZpbmQgYW4gYXJwIG1hcHBpbmcgaW4gdGhlIGNhY2hlLiBJZiBub3QgZm91bmQsIHBvc3QgYSByZXF1ZXN0LgotICoKLSAqCUl0IGlzIHZlcnkgVUdMWSByb3V0aW5lOiBpdCBET0VTIE5PVCB1c2Ugc2tiLT5kc3QtPm5laWdoYm91ciwKLSAqCWV2ZW4gaWYgaXQgZXhpc3RzLiBJdCBpcyBzdXBwb3NlZCB0aGF0IHNrYi0+ZGV2IHdhcyBtYW5nbGVkCi0gKglieSBhIHZpcnR1YWwgZGV2aWNlIChlcWwsIHNoYXBlcikuIE5vYm9keSBidXQgYnJva2VuIGRldmljZXMKLSAqCWlzIGFsbG93ZWQgdG8gdXNlIHRoaXMgZnVuY3Rpb24sIGl0IGlzIHNjaGVkdWxlZCB0byBiZSByZW1vdmVkLiAtLUFOSwotICovCi0KLXN0YXRpYyBpbnQgYXJwX3NldF9wcmVkZWZpbmVkKGludCBhZGRyX2hpbnQsIHVuc2lnbmVkIGNoYXIgKmhhZGRyLAotCQkJICAgICAgX19iZTMyIHBhZGRyLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN3aXRjaCAoYWRkcl9oaW50KSB7Ci0JY2FzZSBSVE5fTE9DQUw6Ci0JCXByX2RlYnVnKCJhcnAgY2FsbGVkIGZvciBvd24gSVAgYWRkcmVzc1xuIik7Ci0JCW1lbWNweShoYWRkciwgZGV2LT5kZXZfYWRkciwgZGV2LT5hZGRyX2xlbik7Ci0JCXJldHVybiAxOwotCWNhc2UgUlROX01VTFRJQ0FTVDoKLQkJYXJwX21jX21hcChwYWRkciwgaGFkZHIsIGRldiwgMSk7Ci0JCXJldHVybiAxOwotCWNhc2UgUlROX0JST0FEQ0FTVDoKLQkJbWVtY3B5KGhhZGRyLCBkZXYtPmJyb2FkY2FzdCwgZGV2LT5hZGRyX2xlbik7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotCi1pbnQgYXJwX2ZpbmQodW5zaWduZWQgY2hhciAqaGFkZHIsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwotCV9fYmUzMiBwYWRkcjsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuOwotCi0JaWYgKCFza2JfZHN0KHNrYikpIHsKLQkJcHJfZGVidWcoImFycF9maW5kIGlzIGNhbGxlZCB3aXRoIGRzdD09TlVMTFxuIik7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlwYWRkciA9IHJ0X25leHRob3Aoc2tiX3J0YWJsZShza2IpLCBpcF9oZHIoc2tiKS0+ZGFkZHIpOwotCWlmIChhcnBfc2V0X3ByZWRlZmluZWQoaW5ldF9hZGRyX3R5cGUoZGV2X25ldChkZXYpLCBwYWRkciksIGhhZGRyLAotCQkJICAgICAgIHBhZGRyLCBkZXYpKQotCQlyZXR1cm4gMDsKLQotCW4gPSBfX25laWdoX2xvb2t1cCgmYXJwX3RibCwgJnBhZGRyLCBkZXYsIDEpOwotCi0JaWYgKG4pIHsKLQkJbi0+dXNlZCA9IGppZmZpZXM7Ci0JCWlmIChuLT5udWRfc3RhdGUgJiBOVURfVkFMSUQgfHwgbmVpZ2hfZXZlbnRfc2VuZChuLCBza2IpID09IDApIHsKLQkJCW5laWdoX2hhX3NuYXBzaG90KGhhZGRyLCBuLCBkZXYpOwotCQkJbmVpZ2hfcmVsZWFzZShuKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCW5laWdoX3JlbGVhc2Uobik7Ci0JfSBlbHNlCi0JCWtmcmVlX3NrYihza2IpOwotCXJldHVybiAxOwotfQotRVhQT1JUX1NZTUJPTChhcnBfZmluZCk7Ci0KLS8qIEVORCBPRiBPQlNPTEVURSBGVU5DVElPTlMgKi8KLQogLyoKICAqIENoZWNrIGlmIHdlIGNhbiB1c2UgcHJveHkgQVJQIGZvciB0aGlzIHBhdGgKICAqLwpAQCAtNTY5LDcgKzQ3NSw3IEBACiAgKi8KIAogLyoKLSAqCUNyZWF0ZSBhbiBhcnAgcGFja2V0LiBJZiAoZGVzdF9odyA9PSBOVUxMKSwgd2UgY3JlYXRlIGEgYnJvYWRjYXN0CisgKglDcmVhdGUgYW4gYXJwIHBhY2tldC4gSWYgZGVzdF9odyBpcyBub3Qgc2V0LCB3ZSBjcmVhdGUgYSBicm9hZGNhc3QKICAqCW1lc3NhZ2UuCiAgKi8KIHN0cnVjdCBza19idWZmICphcnBfY3JlYXRlKGludCB0eXBlLCBpbnQgcHR5cGUsIF9fYmUzMiBkZXN0X2lwLApAQCAtNTg5LDcgKzQ5NSw3IEBACiAJICovCiAKIAlza2IgPSBhbGxvY19za2IoYXJwX2hkcl9sZW4oZGV2KSArIGhsZW4gKyB0bGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCXJldHVybiBOVUxMOwogCiAJc2tiX3Jlc2VydmUoc2tiLCBobGVuKTsKQEAgLTU5Nyw5ICs1MDMsOSBAQAogCWFycCA9IChzdHJ1Y3QgYXJwaGRyICopIHNrYl9wdXQoc2tiLCBhcnBfaGRyX2xlbihkZXYpKTsKIAlza2ItPmRldiA9IGRldjsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfQVJQKTsKLQlpZiAoc3JjX2h3ID09IE5VTEwpCisJaWYgKCFzcmNfaHcpCiAJCXNyY19odyA9IGRldi0+ZGV2X2FkZHI7Ci0JaWYgKGRlc3RfaHcgPT0gTlVMTCkKKwlpZiAoIWRlc3RfaHcpCiAJCWRlc3RfaHcgPSBkZXYtPmJyb2FkY2FzdDsKIAogCS8qCkBAIC02NjMsNyArNTY5LDcgQEAKIAkJYnJlYWs7CiAjZW5kaWYKIAlkZWZhdWx0OgotCQlpZiAodGFyZ2V0X2h3ICE9IE5VTEwpCisJCWlmICh0YXJnZXRfaHcpCiAJCQltZW1jcHkoYXJwX3B0ciwgdGFyZ2V0X2h3LCBkZXYtPmFkZHJfbGVuKTsKIAkJZWxzZQogCQkJbWVtc2V0KGFycF9wdHIsIDAsIGRldi0+YWRkcl9sZW4pOwpAQCAtNjg1LDcgKzU5MSw4IEBACiB2b2lkIGFycF94bWl0KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJLyogU2VuZCBpdCBvZmYsIG1heWJlIGZpbHRlciBpdCB1c2luZyBmaXJld2FsbGluZyBmaXJzdC4gICovCi0JTkZfSE9PSyhORlBST1RPX0FSUCwgTkZfQVJQX09VVCwgc2tiLCBOVUxMLCBza2ItPmRldiwgZGV2X3F1ZXVlX3htaXQpOworCU5GX0hPT0soTkZQUk9UT19BUlAsIE5GX0FSUF9PVVQsIE5VTEwsIHNrYiwKKwkJTlVMTCwgc2tiLT5kZXYsIGRldl9xdWV1ZV94bWl0X3NrKTsKIH0KIEVYUE9SVF9TWU1CT0woYXJwX3htaXQpOwogCkBAIC03MDgsNyArNjE1LDcgQEAKIAogCXNrYiA9IGFycF9jcmVhdGUodHlwZSwgcHR5cGUsIGRlc3RfaXAsIGRldiwgc3JjX2lwLAogCQkJIGRlc3RfaHcsIHNyY19odywgdGFyZ2V0X2h3KTsKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCXJldHVybjsKIAogCWFycF94bWl0KHNrYik7CkBAIC03MTksNyArNjI2LDcgQEAKICAqCVByb2Nlc3MgYW4gYXJwIHJlcXVlc3QuCiAgKi8KIAotc3RhdGljIGludCBhcnBfcHJvY2VzcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBhcnBfcHJvY2VzcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNrYi0+ZGV2OwogCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldiA9IF9faW5fZGV2X2dldF9yY3UoZGV2KTsKQEAgLTczOCw3ICs2NDUsNyBAQAogCSAqIGlzIEFSUCdhYmxlLgogCSAqLwogCi0JaWYgKGluX2RldiA9PSBOVUxMKQorCWlmICghaW5fZGV2KQogCQlnb3RvIG91dDsKIAogCWFycCA9IGFycF9oZHIoc2tiKTsKQEAgLTkwMiw3ICs4MDksNyBAQAogCQlpc19nYXJwID0gYXJwLT5hcl9vcCA9PSBodG9ucyhBUlBPUF9SRVFVRVNUKSAmJiB0aXAgPT0gc2lwICYmCiAJCQkgIGluZXRfYWRkcl90eXBlKG5ldCwgc2lwKSA9PSBSVE5fVU5JQ0FTVDsKIAotCQlpZiAobiA9PSBOVUxMICYmCisJCWlmICghbiAmJgogCQkgICAgKChhcnAtPmFyX29wID09IGh0b25zKEFSUE9QX1JFUExZKSAgJiYKIAkJICAgICAgaW5ldF9hZGRyX3R5cGUobmV0LCBzaXApID09IFJUTl9VTklDQVNUKSB8fCBpc19nYXJwKSkKIAkJCW4gPSBfX25laWdoX2xvb2t1cCgmYXJwX3RibCwgJnNpcCwgZGV2LCAxKTsKQEAgLTk0MCw3ICs4NDcsNyBAQAogCiBzdGF0aWMgdm9pZCBwYXJwX3JlZG8oc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlhcnBfcHJvY2Vzcyhza2IpOworCWFycF9wcm9jZXNzKE5VTEwsIHNrYik7CiB9CiAKIApAQCAtOTczLDcgKzg4MCw4IEBACiAKIAltZW1zZXQoTkVJR0hfQ0Ioc2tiKSwgMCwgc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXJfY2IpKTsKIAotCXJldHVybiBORl9IT09LKE5GUFJPVE9fQVJQLCBORl9BUlBfSU4sIHNrYiwgZGV2LCBOVUxMLCBhcnBfcHJvY2Vzcyk7CisJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19BUlAsIE5GX0FSUF9JTiwgTlVMTCwgc2tiLAorCQkgICAgICAgZGV2LCBOVUxMLCBhcnBfcHJvY2Vzcyk7CiAKIGNvbnN1bWVza2I6CiAJY29uc3VtZV9za2Ioc2tiKTsKQEAgLTk5NCw3ICs5MDIsNyBAQAogCiBzdGF0aWMgaW50IGFycF9yZXFfc2V0X3Byb3h5KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IG9uKQogewotCWlmIChkZXYgPT0gTlVMTCkgeworCWlmICghZGV2KSB7CiAJCUlQVjRfREVWQ09ORl9BTEwobmV0LCBQUk9YWV9BUlApID0gb247CiAJCXJldHVybiAwOwogCX0KQEAgLTEwMjAsNyArOTI4LDcgQEAKIAkJCXJldHVybiAtRU5PREVWOwogCX0KIAlpZiAobWFzaykgewotCQlpZiAocG5laWdoX2xvb2t1cCgmYXJwX3RibCwgbmV0LCAmaXAsIGRldiwgMSkgPT0gTlVMTCkKKwkJaWYgKCFwbmVpZ2hfbG9va3VwKCZhcnBfdGJsLCBuZXQsICZpcCwgZGV2LCAxKSkKIAkJCXJldHVybiAtRU5PQlVGUzsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMTA0MSw3ICs5NDksNyBAQAogCWlwID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmci0+YXJwX3BhKS0+c2luX2FkZHIuc19hZGRyOwogCWlmIChyLT5hcnBfZmxhZ3MgJiBBVEZfUEVSTSkKIAkJci0+YXJwX2ZsYWdzIHw9IEFURl9DT007Ci0JaWYgKGRldiA9PSBOVUxMKSB7CisJaWYgKCFkZXYpIHsKIAkJc3RydWN0IHJ0YWJsZSAqcnQgPSBpcF9yb3V0ZV9vdXRwdXQobmV0LCBpcCwgMCwgUlRPX09OTElOSywgMCk7CiAKIAkJaWYgKElTX0VSUihydCkpCkBAIC0xMTYxLDcgKzEwNjksNyBAQAogCQlyZXR1cm4gYXJwX3JlcV9kZWxldGVfcHVibGljKG5ldCwgciwgZGV2KTsKIAogCWlwID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmci0+YXJwX3BhKS0+c2luX2FkZHIuc19hZGRyOwotCWlmIChkZXYgPT0gTlVMTCkgeworCWlmICghZGV2KSB7CiAJCXN0cnVjdCBydGFibGUgKnJ0ID0gaXBfcm91dGVfb3V0cHV0KG5ldCwgaXAsIDAsIFJUT19PTkxJTkssIDApOwogCQlpZiAoSVNfRVJSKHJ0KSkKIAkJCXJldHVybiBQVFJfRVJSKHJ0KTsKQEAgLTEyMTAsNyArMTExOCw3IEBACiAJaWYgKHIuYXJwX2RldlswXSkgewogCQllcnIgPSAtRU5PREVWOwogCQlkZXYgPSBfX2Rldl9nZXRfYnlfbmFtZShuZXQsIHIuYXJwX2Rldik7Ci0JCWlmIChkZXYgPT0gTlVMTCkKKwkJaWYgKCFkZXYpCiAJCQlnb3RvIG91dDsKIAogCQkvKiBNbW1tLi4uIEl0IGlzIHdyb25nLi4uIEFSUEhSRF9ORVRST009PTAgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2NpcHNvX2lwdjQuYyBiL25ldC9pcHY0L2NpcHNvX2lwdjQuYwppbmRleCBlMzYxZWE2Li5iZGIyYTA3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9jaXBzb19pcHY0LmMKKysrIGIvbmV0L2lwdjQvY2lwc29faXB2NC5jCkBAIC0yNTUsNyArMjU1LDcgQEAKIAljaXBzb192NF9jYWNoZSA9IGtjYWxsb2MoQ0lQU09fVjRfQ0FDSEVfQlVDS0VUUywKIAkJCQkgc2l6ZW9mKHN0cnVjdCBjaXBzb192NF9tYXBfY2FjaGVfYmt0KSwKIAkJCQkgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNpcHNvX3Y0X2NhY2hlID09IE5VTEwpCisJaWYgKCFjaXBzb192NF9jYWNoZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgQ0lQU09fVjRfQ0FDSEVfQlVDS0VUUzsgaXRlcisrKSB7CkBAIC0zMzksNyArMzM5LDcgQEAKIAkJCXNlY2F0dHItPmNhY2hlID0gZW50cnktPmxzbV9kYXRhOwogCQkJc2VjYXR0ci0+ZmxhZ3MgfD0gTkVUTEJMX1NFQ0FUVFJfQ0FDSEU7CiAJCQlzZWNhdHRyLT50eXBlID0gTkVUTEJMX05MVFlQRV9DSVBTT1Y0OwotCQkJaWYgKHByZXZfZW50cnkgPT0gTlVMTCkgeworCQkJaWYgKCFwcmV2X2VudHJ5KSB7CiAJCQkJc3Bpbl91bmxvY2tfYmgoJmNpcHNvX3Y0X2NhY2hlW2JrdF0ubG9jayk7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CkBAIC0zOTMsMTAgKzM5MywxMCBAQAogCWNpcHNvX3B0cl9sZW4gPSBjaXBzb19wdHJbMV07CiAKIAllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9BVE9NSUMpOwotCWlmIChlbnRyeSA9PSBOVUxMKQorCWlmICghZW50cnkpCiAJCXJldHVybiAtRU5PTUVNOwogCWVudHJ5LT5rZXkgPSBrbWVtZHVwKGNpcHNvX3B0ciwgY2lwc29fcHRyX2xlbiwgR0ZQX0FUT01JQyk7Ci0JaWYgKGVudHJ5LT5rZXkgPT0gTlVMTCkgeworCWlmICghZW50cnktPmtleSkgewogCQlyZXRfdmFsID0gLUVOT01FTTsKIAkJZ290byBjYWNoZV9hZGRfZmFpbHVyZTsKIAl9CkBAIC01MDIsNyArNTAyLDcgQEAKIAlhdG9taWNfc2V0KCZkb2lfZGVmLT5yZWZjb3VudCwgMSk7CiAKIAlzcGluX2xvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwotCWlmIChjaXBzb192NF9kb2lfc2VhcmNoKGRvaV9kZWYtPmRvaSkgIT0gTlVMTCkgeworCWlmIChjaXBzb192NF9kb2lfc2VhcmNoKGRvaV9kZWYtPmRvaSkpIHsKIAkJc3Bpbl91bmxvY2soJmNpcHNvX3Y0X2RvaV9saXN0X2xvY2spOwogCQlyZXRfdmFsID0gLUVFWElTVDsKIAkJZ290byBkb2lfYWRkX3JldHVybjsKQEAgLTUxMyw3ICs1MTMsNyBAQAogCiBkb2lfYWRkX3JldHVybjoKIAlhdWRpdF9idWYgPSBuZXRsYmxfYXVkaXRfc3RhcnQoQVVESVRfTUFDX0NJUFNPVjRfQURELCBhdWRpdF9pbmZvKTsKLQlpZiAoYXVkaXRfYnVmICE9IE5VTEwpIHsKKwlpZiAoYXVkaXRfYnVmKSB7CiAJCWNvbnN0IGNoYXIgKnR5cGVfc3RyOwogCQlzd2l0Y2ggKGRvaV90eXBlKSB7CiAJCWNhc2UgQ0lQU09fVjRfTUFQX1RSQU5TOgpAQCAtNTQ3LDcgKzU0Nyw3IEBACiAgKi8KIHZvaWQgY2lwc29fdjRfZG9pX2ZyZWUoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZikKIHsKLQlpZiAoZG9pX2RlZiA9PSBOVUxMKQorCWlmICghZG9pX2RlZikKIAkJcmV0dXJuOwogCiAJc3dpdGNoIChkb2lfZGVmLT50eXBlKSB7CkBAIC01OTgsNyArNTk4LDcgQEAKIAogCXNwaW5fbG9jaygmY2lwc29fdjRfZG9pX2xpc3RfbG9jayk7CiAJZG9pX2RlZiA9IGNpcHNvX3Y0X2RvaV9zZWFyY2goZG9pKTsKLQlpZiAoZG9pX2RlZiA9PSBOVUxMKSB7CisJaWYgKCFkb2lfZGVmKSB7CiAJCXNwaW5fdW5sb2NrKCZjaXBzb192NF9kb2lfbGlzdF9sb2NrKTsKIAkJcmV0X3ZhbCA9IC1FTk9FTlQ7CiAJCWdvdG8gZG9pX3JlbW92ZV9yZXR1cm47CkBAIC02MTcsNyArNjE3LDcgQEAKIAogZG9pX3JlbW92ZV9yZXR1cm46CiAJYXVkaXRfYnVmID0gbmV0bGJsX2F1ZGl0X3N0YXJ0KEFVRElUX01BQ19DSVBTT1Y0X0RFTCwgYXVkaXRfaW5mbyk7Ci0JaWYgKGF1ZGl0X2J1ZiAhPSBOVUxMKSB7CisJaWYgKGF1ZGl0X2J1ZikgewogCQlhdWRpdF9sb2dfZm9ybWF0KGF1ZGl0X2J1ZiwKIAkJCQkgIiBjaXBzb19kb2k9JXUgcmVzPSV1IiwKIAkJCQkgZG9pLCByZXRfdmFsID09IDAgPyAxIDogMCk7CkBAIC02NDQsNyArNjQ0LDcgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlkb2lfZGVmID0gY2lwc29fdjRfZG9pX3NlYXJjaChkb2kpOwotCWlmIChkb2lfZGVmID09IE5VTEwpCisJaWYgKCFkb2lfZGVmKQogCQlnb3RvIGRvaV9nZXRkZWZfcmV0dXJuOwogCWlmICghYXRvbWljX2luY19ub3RfemVybygmZG9pX2RlZi0+cmVmY291bnQpKQogCQlkb2lfZGVmID0gTlVMTDsKQEAgLTY2NCw3ICs2NjQsNyBAQAogICovCiB2b2lkIGNpcHNvX3Y0X2RvaV9wdXRkZWYoc3RydWN0IGNpcHNvX3Y0X2RvaSAqZG9pX2RlZikKIHsKLQlpZiAoZG9pX2RlZiA9PSBOVUxMKQorCWlmICghZG9pX2RlZikKIAkJcmV0dXJuOwogCiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZkb2lfZGVmLT5yZWZjb3VudCkpCkBAIC0xNjQyLDcgKzE2NDIsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWRvaV9kZWYgPSBjaXBzb192NF9kb2lfc2VhcmNoKGdldF91bmFsaWduZWRfYmUzMigmb3B0WzJdKSk7Ci0JaWYgKGRvaV9kZWYgPT0gTlVMTCkgeworCWlmICghZG9pX2RlZikgewogCQllcnJfb2Zmc2V0ID0gMjsKIAkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOwogCX0KQEAgLTE3MzYsNyArMTczNiw3IEBACiAJCQkgKiBub3QgdGhlIGxvb3BiYWNrIGRldmljZSBkcm9wIHRoZSBwYWNrZXQuIEZ1cnRoZXIsCiAJCQkgKiB0aGVyZSBpcyBubyBsZWdpdGltYXRlIHJlYXNvbiBmb3Igc2V0dGluZyB0aGlzIGZyb20KIAkJCSAqIHVzZXJzcGFjZSBzbyByZWplY3QgaXQgaWYgc2tiIGlzIE5VTEwuICovCi0JCQlpZiAoc2tiID09IE5VTEwgfHwgIShza2ItPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKSB7CisJCQlpZiAoIXNrYiB8fCAhKHNrYi0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykpIHsKIAkJCQllcnJfb2Zmc2V0ID0gb3B0X2l0ZXI7CiAJCQkJZ290byB2YWxpZGF0ZV9yZXR1cm5fbG9ja2VkOwogCQkJfQpAQCAtMTg5Nyw3ICsxODk3LDcgQEAKIAkgKiBkZWZpbmVkIHlldCBidXQgaXQgaXMgbm90IGEgcHJvYmxlbSBhcyB0aGUgb25seSB1c2VycyBvZiB0aGVzZQogCSAqICJsaXRlIiBQRl9JTkVUIHNvY2tldHMgYXJlIGZ1bmN0aW9ucyB3aGljaCBkbyBhbiBhY2NlcHQoKSBjYWxsCiAJICogYWZ0ZXJ3YXJkcyBzbyB3ZSB3aWxsIGxhYmVsIHRoZSBzb2NrZXQgYXMgcGFydCBvZiB0aGUgYWNjZXB0KCkuICovCi0JaWYgKHNrID09IE5VTEwpCisJaWYgKCFzaykKIAkJcmV0dXJuIDA7CiAKIAkvKiBXZSBhbGxvY2F0ZSB0aGUgbWF4aW11bSBDSVBTTyBvcHRpb24gc2l6ZSBoZXJlIHNvIHdlIGFyZSBwcm9iYWJseQpAQCAtMTkwNSw3ICsxOTA1LDcgQEAKIAkgKiBvbiBhbmQgYWZ0ZXIgYWxsIHdlIGFyZSBvbmx5IHRhbGtpbmcgYWJvdXQgNDAgYnl0ZXMuICovCiAJYnVmX2xlbiA9IENJUFNPX1Y0X09QVF9MRU5fTUFYOwogCWJ1ZiA9IGttYWxsb2MoYnVmX2xlbiwgR0ZQX0FUT01JQyk7Ci0JaWYgKGJ1ZiA9PSBOVUxMKSB7CisJaWYgKCFidWYpIHsKIAkJcmV0X3ZhbCA9IC1FTk9NRU07CiAJCWdvdG8gc29ja2V0X3NldGF0dHJfZmFpbHVyZTsKIAl9CkBAIC0xOTIxLDcgKzE5MjEsNyBAQAogCSAqIHNldCB0aGUgSVBPUFRfQ0lQU08gb3B0aW9uLiAqLwogCW9wdF9sZW4gPSAoYnVmX2xlbiArIDMpICYgfjM7CiAJb3B0ID0ga3phbGxvYyhzaXplb2YoKm9wdCkgKyBvcHRfbGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAob3B0ID09IE5VTEwpIHsKKwlpZiAoIW9wdCkgewogCQlyZXRfdmFsID0gLUVOT01FTTsKIAkJZ290byBzb2NrZXRfc2V0YXR0cl9mYWlsdXJlOwogCX0KQEAgLTE5ODEsNyArMTk4MSw3IEBACiAJICogb24gYW5kIGFmdGVyIGFsbCB3ZSBhcmUgb25seSB0YWxraW5nIGFib3V0IDQwIGJ5dGVzLiAqLwogCWJ1Zl9sZW4gPSBDSVBTT19WNF9PUFRfTEVOX01BWDsKIAlidWYgPSBrbWFsbG9jKGJ1Zl9sZW4sIEdGUF9BVE9NSUMpOwotCWlmIChidWYgPT0gTlVMTCkgeworCWlmICghYnVmKSB7CiAJCXJldF92YWwgPSAtRU5PTUVNOwogCQlnb3RvIHJlcV9zZXRhdHRyX2ZhaWx1cmU7CiAJfQpAQCAtMTk5Nyw3ICsxOTk3LDcgQEAKIAkgKiBzZXQgdGhlIElQT1BUX0NJUFNPIG9wdGlvbi4gKi8KIAlvcHRfbGVuID0gKGJ1Zl9sZW4gKyAzKSAmIH4zOwogCW9wdCA9IGt6YWxsb2Moc2l6ZW9mKCpvcHQpICsgb3B0X2xlbiwgR0ZQX0FUT01JQyk7Ci0JaWYgKG9wdCA9PSBOVUxMKSB7CisJaWYgKCFvcHQpIHsKIAkJcmV0X3ZhbCA9IC1FTk9NRU07CiAJCWdvdG8gcmVxX3NldGF0dHJfZmFpbHVyZTsKIAl9CkBAIC0yMTAyLDcgKzIxMDIsNyBAQAogCiAJc2tfaW5ldCA9IGluZXRfc2soc2spOwogCW9wdCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2tfaW5ldC0+aW5ldF9vcHQsIDEpOwotCWlmIChvcHQgPT0gTlVMTCB8fCBvcHQtPm9wdC5jaXBzbyA9PSAwKQorCWlmICghb3B0IHx8IG9wdC0+b3B0LmNpcHNvID09IDApCiAJCXJldHVybjsKIAogCWhkcl9kZWx0YSA9IGNpcHNvX3Y0X2RlbG9wdCgmc2tfaW5ldC0+aW5ldF9vcHQpOwpAQCAtMjEyOCw3ICsyMTI4LDcgQEAKIAogCXJlcV9pbmV0ID0gaW5ldF9yc2socmVxKTsKIAlvcHQgPSByZXFfaW5ldC0+b3B0OwotCWlmIChvcHQgPT0gTlVMTCB8fCBvcHQtPm9wdC5jaXBzbyA9PSAwKQorCWlmICghb3B0IHx8IG9wdC0+b3B0LmNpcHNvID09IDApCiAJCXJldHVybjsKIAogCWNpcHNvX3Y0X2RlbG9wdCgmcmVxX2luZXQtPm9wdCk7CkBAIC0yMTU3LDcgKzIxNTcsNyBAQAogCWRvaSA9IGdldF91bmFsaWduZWRfYmUzMigmY2lwc29bMl0pOwogCXJjdV9yZWFkX2xvY2soKTsKIAlkb2lfZGVmID0gY2lwc29fdjRfZG9pX3NlYXJjaChkb2kpOwotCWlmIChkb2lfZGVmID09IE5VTEwpCisJaWYgKCFkb2lfZGVmKQogCQlnb3RvIGdldGF0dHJfcmV0dXJuOwogCS8qIFhYWCAtIFRoaXMgY29kZSBhc3N1bWVzIG9ubHkgb25lIHRhZyBwZXIgQ0lQU08gb3B0aW9uIHdoaWNoIGlzbid0CiAJICogcmVhbGx5IGEgZ29vZCBhc3N1bXB0aW9uIHRvIG1ha2UgYnV0IHNpbmNlIHdlIG9ubHkgc3VwcG9ydCB0aGUgTUFDCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9kZXZpbmV0LmMgYi9uZXQvaXB2NC9kZXZpbmV0LmMKaW5kZXggM2E4OTg1Yy4uNDE5ZDIzYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZGV2aW5ldC5jCisrKyBiL25ldC9pcHY0L2RldmluZXQuYwpAQCAtMTA3LDcgKzEwNyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCBpbmV0X2FkZHJfbHN0W0lONF9BRERSX0hTSVpFXTsKIAotc3RhdGljIHUzMiBpbmV0X2FkZHJfaGFzaChzdHJ1Y3QgbmV0ICpuZXQsIF9fYmUzMiBhZGRyKQorc3RhdGljIHUzMiBpbmV0X2FkZHJfaGFzaChjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIF9fYmUzMiBhZGRyKQogewogCXUzMiB2YWwgPSAoX19mb3JjZSB1MzIpIGFkZHIgXiBuZXRfaGFzaF9taXgobmV0KTsKIApAQCAtNTQ4LDYgKzU0OCwyNiBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgaW50IGlwX21jX2NvbmZpZyhzdHJ1Y3Qgc29jayAqc2ssIGJvb2wgam9pbiwgY29uc3Qgc3RydWN0IGluX2lmYWRkciAqaWZhKQoreworCXN0cnVjdCBpcF9tcmVxbiBtcmVxID0geworCQkuaW1yX211bHRpYWRkci5zX2FkZHIgPSBpZmEtPmlmYV9hZGRyZXNzLAorCQkuaW1yX2lmaW5kZXggPSBpZmEtPmlmYV9kZXYtPmRldi0+aWZpbmRleCwKKwl9OworCWludCByZXQ7CisKKwlBU1NFUlRfUlROTCgpOworCisJbG9ja19zb2NrKHNrKTsKKwlpZiAoam9pbikKKwkJcmV0ID0gaXBfbWNfam9pbl9ncm91cChzaywgJm1yZXEpOworCWVsc2UKKwkJcmV0ID0gaXBfbWNfbGVhdmVfZ3JvdXAoc2ssICZtcmVxKTsKKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBpbmV0X3J0bV9kZWxhZGRyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOwpAQCAtNTY1LDcgKzU4NSw3IEBACiAKIAlpZm0gPSBubG1zZ19kYXRhKG5saCk7CiAJaW5fZGV2ID0gaW5ldGRldl9ieV9pbmRleChuZXQsIGlmbS0+aWZhX2luZGV4KTsKLQlpZiAoaW5fZGV2ID09IE5VTEwpIHsKKwlpZiAoIWluX2RldikgewogCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIGVycm91dDsKIAl9CkBAIC01NzMsNyArNTkzLDcgQEAKIAlmb3IgKGlmYXAgPSAmaW5fZGV2LT5pZmFfbGlzdDsgKGlmYSA9ICppZmFwKSAhPSBOVUxMOwogCSAgICAgaWZhcCA9ICZpZmEtPmlmYV9uZXh0KSB7CiAJCWlmICh0YltJRkFfTE9DQUxdICYmCi0JCSAgICBpZmEtPmlmYV9sb2NhbCAhPSBubGFfZ2V0X2JlMzIodGJbSUZBX0xPQ0FMXSkpCisJCSAgICBpZmEtPmlmYV9sb2NhbCAhPSBubGFfZ2V0X2luX2FkZHIodGJbSUZBX0xPQ0FMXSkpCiAJCQljb250aW51ZTsKIAogCQlpZiAodGJbSUZBX0xBQkVMXSAmJiBubGFfc3RyY21wKHRiW0lGQV9MQUJFTF0sIGlmYS0+aWZhX2xhYmVsKSkKQEAgLTU4MSw5ICs2MDEsMTEgQEAKIAogCQlpZiAodGJbSUZBX0FERFJFU1NdICYmCiAJCSAgICAoaWZtLT5pZmFfcHJlZml4bGVuICE9IGlmYS0+aWZhX3ByZWZpeGxlbiB8fAotCQkgICAgIWluZXRfaWZhX21hdGNoKG5sYV9nZXRfYmUzMih0YltJRkFfQUREUkVTU10pLCBpZmEpKSkKKwkJICAgICFpbmV0X2lmYV9tYXRjaChubGFfZ2V0X2luX2FkZHIodGJbSUZBX0FERFJFU1NdKSwgaWZhKSkpCiAJCQljb250aW51ZTsKIAorCQlpZiAoaXB2NF9pc19tdWx0aWNhc3QoaWZhLT5pZmFfYWRkcmVzcykpCisJCQlpcF9tY19jb25maWcobmV0LT5pcHY0Lm1jX2F1dG9qb2luX3NrLCBmYWxzZSwgaWZhKTsKIAkJX19pbmV0X2RlbF9pZmEoaW5fZGV2LCBpZmFwLCAxLCBubGgsIE5FVExJTktfQ0Ioc2tiKS5wb3J0aWQpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC03MzMsMjEgKzc1NSwyMSBAQAogCiAJaWZtID0gbmxtc2dfZGF0YShubGgpOwogCWVyciA9IC1FSU5WQUw7Ci0JaWYgKGlmbS0+aWZhX3ByZWZpeGxlbiA+IDMyIHx8IHRiW0lGQV9MT0NBTF0gPT0gTlVMTCkKKwlpZiAoaWZtLT5pZmFfcHJlZml4bGVuID4gMzIgfHwgIXRiW0lGQV9MT0NBTF0pCiAJCWdvdG8gZXJyb3V0OwogCiAJZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZtLT5pZmFfaW5kZXgpOwogCWVyciA9IC1FTk9ERVY7Ci0JaWYgKGRldiA9PSBOVUxMKQorCWlmICghZGV2KQogCQlnb3RvIGVycm91dDsKIAogCWluX2RldiA9IF9faW5fZGV2X2dldF9ydG5sKGRldik7CiAJZXJyID0gLUVOT0JVRlM7Ci0JaWYgKGluX2RldiA9PSBOVUxMKQorCWlmICghaW5fZGV2KQogCQlnb3RvIGVycm91dDsKIAogCWlmYSA9IGluZXRfYWxsb2NfaWZhKCk7Ci0JaWYgKGlmYSA9PSBOVUxMKQorCWlmICghaWZhKQogCQkvKgogCQkgKiBBIHBvdGVudGlhbCBpbmRldiBhbGxvY2F0aW9uIGNhbiBiZSBsZWZ0IGFsaXZlLCBpdCBzdGF5cwogCQkgKiBhc3NpZ25lZCB0byBpdHMgZGV2aWNlIGFuZCBpcyBkZXN0cm95IHdpdGggaXQuCkBAIC03NTgsNyArNzgwLDcgQEAKIAluZWlnaF9wYXJtc19kYXRhX3N0YXRlX3NldGFsbChpbl9kZXYtPmFycF9wYXJtcyk7CiAJaW5fZGV2X2hvbGQoaW5fZGV2KTsKIAotCWlmICh0YltJRkFfQUREUkVTU10gPT0gTlVMTCkKKwlpZiAoIXRiW0lGQV9BRERSRVNTXSkKIAkJdGJbSUZBX0FERFJFU1NdID0gdGJbSUZBX0xPQ0FMXTsKIAogCUlOSVRfSExJU1RfTk9ERSgmaWZhLT5oYXNoKTsKQEAgLTc2OSwxMSArNzkxLDExIEBACiAJaWZhLT5pZmFfc2NvcGUgPSBpZm0tPmlmYV9zY29wZTsKIAlpZmEtPmlmYV9kZXYgPSBpbl9kZXY7CiAKLQlpZmEtPmlmYV9sb2NhbCA9IG5sYV9nZXRfYmUzMih0YltJRkFfTE9DQUxdKTsKLQlpZmEtPmlmYV9hZGRyZXNzID0gbmxhX2dldF9iZTMyKHRiW0lGQV9BRERSRVNTXSk7CisJaWZhLT5pZmFfbG9jYWwgPSBubGFfZ2V0X2luX2FkZHIodGJbSUZBX0xPQ0FMXSk7CisJaWZhLT5pZmFfYWRkcmVzcyA9IG5sYV9nZXRfaW5fYWRkcih0YltJRkFfQUREUkVTU10pOwogCiAJaWYgKHRiW0lGQV9CUk9BRENBU1RdKQotCQlpZmEtPmlmYV9icm9hZGNhc3QgPSBubGFfZ2V0X2JlMzIodGJbSUZBX0JST0FEQ0FTVF0pOworCQlpZmEtPmlmYV9icm9hZGNhc3QgPSBubGFfZ2V0X2luX2FkZHIodGJbSUZBX0JST0FEQ0FTVF0pOwogCiAJaWYgKHRiW0lGQV9MQUJFTF0pCiAJCW5sYV9zdHJsY3B5KGlmYS0+aWZhX2xhYmVsLCB0YltJRkFfTEFCRUxdLCBJRk5BTVNJWik7CkBAIC04MzgsNiArODYwLDE1IEBACiAJCSAqIHVzZXJzcGFjZSBhbHJlYWR5IHJlbGllcyBvbiBub3QgaGF2aW5nIHRvIHByb3ZpZGUgdGhpcy4KIAkJICovCiAJCXNldF9pZmFfbGlmZXRpbWUoaWZhLCB2YWxpZF9sZnQsIHByZWZlcmVkX2xmdCk7CisJCWlmIChpZmEtPmlmYV9mbGFncyAmIElGQV9GX01DQVVUT0pPSU4pIHsKKwkJCWludCByZXQgPSBpcF9tY19jb25maWcobmV0LT5pcHY0Lm1jX2F1dG9qb2luX3NrLAorCQkJCQkgICAgICAgdHJ1ZSwgaWZhKTsKKworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlpbmV0X2ZyZWVfaWZhKGlmYSk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQogCQlyZXR1cm4gX19pbmV0X2luc2VydF9pZmEoaWZhLCBubGgsIE5FVExJTktfQ0Ioc2tiKS5wb3J0aWQpOwogCX0gZWxzZSB7CiAJCWluZXRfZnJlZV9pZmEoaWZhKTsKQEAgLTEyNTksNyArMTI5MCw3IEBACiAJX19iZTMyIGFkZHIgPSAwOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAKLQlpZiAoaW5fZGV2ICE9IE5VTEwpCisJaWYgKGluX2RldikKIAkJcmV0dXJuIGNvbmZpcm1fYWRkcl9pbmRldihpbl9kZXYsIGRzdCwgbG9jYWwsIHNjb3BlKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKQEAgLTEzMDksNyArMTM0MCw3IEBACiAJCWlmIChuYW1lZCsrID09IDApCiAJCQlnb3RvIHNraXA7CiAJCWRvdCA9IHN0cmNocihvbGQsICc6Jyk7Ci0JCWlmIChkb3QgPT0gTlVMTCkgeworCQlpZiAoIWRvdCkgewogCQkJc3ByaW50ZihvbGQsICI6JWQiLCBuYW1lZCk7CiAJCQlkb3QgPSBvbGQ7CiAJCX0KQEAgLTE0NzgsNyArMTUwOSw3IEBACiAJdTMyIHByZWZlcnJlZCwgdmFsaWQ7CiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgZXZlbnQsIHNpemVvZigqaWZtKSwgZmxhZ3MpOwotCWlmIChubGggPT0gTlVMTCkKKwlpZiAoIW5saCkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAogCWlmbSA9IG5sbXNnX2RhdGEobmxoKTsKQEAgLTE1MTAsMTEgKzE1NDEsMTEgQEAKIAkJdmFsaWQgPSBJTkZJTklUWV9MSUZFX1RJTUU7CiAJfQogCWlmICgoaWZhLT5pZmFfYWRkcmVzcyAmJgotCSAgICAgbmxhX3B1dF9iZTMyKHNrYiwgSUZBX0FERFJFU1MsIGlmYS0+aWZhX2FkZHJlc3MpKSB8fAorCSAgICAgbmxhX3B1dF9pbl9hZGRyKHNrYiwgSUZBX0FERFJFU1MsIGlmYS0+aWZhX2FkZHJlc3MpKSB8fAogCSAgICAoaWZhLT5pZmFfbG9jYWwgJiYKLQkgICAgIG5sYV9wdXRfYmUzMihza2IsIElGQV9MT0NBTCwgaWZhLT5pZmFfbG9jYWwpKSB8fAorCSAgICAgbmxhX3B1dF9pbl9hZGRyKHNrYiwgSUZBX0xPQ0FMLCBpZmEtPmlmYV9sb2NhbCkpIHx8CiAJICAgIChpZmEtPmlmYV9icm9hZGNhc3QgJiYKLQkgICAgIG5sYV9wdXRfYmUzMihza2IsIElGQV9CUk9BRENBU1QsIGlmYS0+aWZhX2Jyb2FkY2FzdCkpIHx8CisJICAgICBubGFfcHV0X2luX2FkZHIoc2tiLCBJRkFfQlJPQURDQVNULCBpZmEtPmlmYV9icm9hZGNhc3QpKSB8fAogCSAgICAoaWZhLT5pZmFfbGFiZWxbMF0gJiYKIAkgICAgIG5sYV9wdXRfc3RyaW5nKHNrYiwgSUZBX0xBQkVMLCBpZmEtPmlmYV9sYWJlbCkpIHx8CiAJICAgIG5sYV9wdXRfdTMyKHNrYiwgSUZBX0ZMQUdTLCBpZmEtPmlmYV9mbGFncykgfHwKQEAgLTE1OTcsNyArMTYyOCw3IEBACiAKIAluZXQgPSBkZXZfbmV0KGlmYS0+aWZhX2Rldi0+ZGV2KTsKIAlza2IgPSBubG1zZ19uZXcoaW5ldF9ubG1zZ19zaXplKCksIEdGUF9LRVJORUwpOwotCWlmIChza2IgPT0gTlVMTCkKKwlpZiAoIXNrYikKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0X2ZpbGxfaWZhZGRyKHNrYiwgaWZhLCBwb3J0aWQsIHNlcSwgZXZlbnQsIDApOwpAQCAtMTYzNCw3ICsxNjY1LDcgQEAKIAkJcmV0dXJuIC1FTk9EQVRBOwogCiAJbmxhID0gbmxhX3Jlc2VydmUoc2tiLCBJRkxBX0lORVRfQ09ORiwgSVBWNF9ERVZDT05GX01BWCAqIDQpOwotCWlmIChubGEgPT0gTlVMTCkKKwlpZiAoIW5sYSkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAogCWZvciAoaSA9IDA7IGkgPCBJUFY0X0RFVkNPTkZfTUFYOyBpKyspCkBAIC0xNzIzLDcgKzE3NTQsNyBAQAogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIGV2ZW50LCBzaXplb2Yoc3RydWN0IG5ldGNvbmZtc2cpLAogCQkJZmxhZ3MpOwotCWlmIChubGggPT0gTlVMTCkKKwlpZiAoIW5saCkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAogCW5jbSA9IG5sbXNnX2RhdGEobmxoKTsKQEAgLTE3NjUsNyArMTc5Niw3IEBACiAJaW50IGVyciA9IC1FTk9CVUZTOwogCiAJc2tiID0gbmxtc2dfbmV3KGluZXRfbmV0Y29uZl9tc2dzaXplX2RldmNvbmYodHlwZSksIEdGUF9BVE9NSUMpOwotCWlmIChza2IgPT0gTlVMTCkKKwlpZiAoIXNrYikKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0X25ldGNvbmZfZmlsbF9kZXZjb25mKHNrYiwgaWZpbmRleCwgZGV2Y29uZiwgMCwgMCwKQEAgLTE4MjIsMTAgKzE4NTMsMTAgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZpbmRleCk7Ci0JCWlmIChkZXYgPT0gTlVMTCkKKwkJaWYgKCFkZXYpCiAJCQlnb3RvIGVycm91dDsKIAkJaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3J0bmwoZGV2KTsKLQkJaWYgKGluX2RldiA9PSBOVUxMKQorCQlpZiAoIWluX2RldikKIAkJCWdvdG8gZXJyb3V0OwogCQlkZXZjb25mID0gJmluX2Rldi0+Y25mOwogCQlicmVhazsKQEAgLTE4MzMsNyArMTg2NCw3IEBACiAKIAllcnIgPSAtRU5PQlVGUzsKIAlza2IgPSBubG1zZ19uZXcoaW5ldF9uZXRjb25mX21zZ3NpemVfZGV2Y29uZigtMSksIEdGUF9BVE9NSUMpOwotCWlmIChza2IgPT0gTlVMTCkKKwlpZiAoIXNrYikKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0X25ldGNvbmZfZmlsbF9kZXZjb25mKHNrYiwgaWZpbmRleCwgZGV2Y29uZiwKQEAgLTIxODQsNyArMjIxNSw3IEBACiB7CiAJc3RydWN0IGRldmluZXRfc3lzY3RsX3RhYmxlICp0ID0gY25mLT5zeXNjdGw7CiAKLQlpZiAodCA9PSBOVUxMKQorCWlmICghdCkKIAkJcmV0dXJuOwogCiAJY25mLT5zeXNjdGwgPSBOVUxMOwpAQCAtMjI0NSwxNiArMjI3NiwxNiBAQAogCiAJaWYgKCFuZXRfZXEobmV0LCAmaW5pdF9uZXQpKSB7CiAJCWFsbCA9IGttZW1kdXAoYWxsLCBzaXplb2YoaXB2NF9kZXZjb25mKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChhbGwgPT0gTlVMTCkKKwkJaWYgKCFhbGwpCiAJCQlnb3RvIGVycl9hbGxvY19hbGw7CiAKIAkJZGZsdCA9IGttZW1kdXAoZGZsdCwgc2l6ZW9mKGlwdjRfZGV2Y29uZl9kZmx0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChkZmx0ID09IE5VTEwpCisJCWlmICghZGZsdCkKIAkJCWdvdG8gZXJyX2FsbG9jX2RmbHQ7CiAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAJCXRibCA9IGttZW1kdXAodGJsLCBzaXplb2YoY3RsX2ZvcndhcmRfZW50cnkpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHRibCA9PSBOVUxMKQorCQlpZiAoIXRibCkKIAkJCWdvdG8gZXJyX2FsbG9jX2N0bDsKIAogCQl0YmxbMF0uZGF0YSA9ICZhbGwtPmRhdGFbSVBWNF9ERVZDT05GX0ZPUldBUkRJTkcgLSAxXTsKQEAgLTIyNzQsNyArMjMwNSw3IEBACiAKIAllcnIgPSAtRU5PTUVNOwogCWZvcndfaGRyID0gcmVnaXN0ZXJfbmV0X3N5c2N0bChuZXQsICJuZXQvaXB2NCIsIHRibCk7Ci0JaWYgKGZvcndfaGRyID09IE5VTEwpCisJaWYgKCFmb3J3X2hkcikKIAkJZ290byBlcnJfcmVnX2N0bDsKIAluZXQtPmlwdjQuZm9yd19oZHIgPSBmb3J3X2hkcjsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZXNwNC5jIGIvbmV0L2lwdjQvZXNwNC5jCmluZGV4IDYwMTczZDQuLjQyMWE4MGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2VzcDQuYworKysgYi9uZXQvaXB2NC9lc3A0LmMKQEAgLTU1Myw3ICs1NTMsNyBAQAogCWludCBlcnI7CiAKIAllcnIgPSAtRUlOVkFMOwotCWlmICh4LT5lYWxnID09IE5VTEwpCisJaWYgKCF4LT5lYWxnKQogCQlnb3RvIGVycm9yOwogCiAJZXJyID0gLUVOQU1FVE9PTE9ORzsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9mcm9udGVuZC5jIGIvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKaW5kZXggNTdiZTcxZC4uODcyNDk0ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKKysrIGIvbmV0L2lwdjQvZmliX2Zyb250ZW5kLmMKQEAgLTUyLDEyICs1MiwxMiBAQAogewogCXN0cnVjdCBmaWJfdGFibGUgKmxvY2FsX3RhYmxlLCAqbWFpbl90YWJsZTsKIAotCWxvY2FsX3RhYmxlID0gZmliX3RyaWVfdGFibGUoUlRfVEFCTEVfTE9DQUwpOwotCWlmIChsb2NhbF90YWJsZSA9PSBOVUxMKQorCW1haW5fdGFibGUgID0gZmliX3RyaWVfdGFibGUoUlRfVEFCTEVfTUFJTiwgTlVMTCk7CisJaWYgKCFtYWluX3RhYmxlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1haW5fdGFibGUgID0gZmliX3RyaWVfdGFibGUoUlRfVEFCTEVfTUFJTik7Ci0JaWYgKG1haW5fdGFibGUgPT0gTlVMTCkKKwlsb2NhbF90YWJsZSA9IGZpYl90cmllX3RhYmxlKFJUX1RBQkxFX0xPQ0FMLCBtYWluX3RhYmxlKTsKKwlpZiAoIWxvY2FsX3RhYmxlKQogCQlnb3RvIGZhaWw7CiAKIAlobGlzdF9hZGRfaGVhZF9yY3UoJmxvY2FsX3RhYmxlLT50Yl9obGlzdCwKQEAgLTY3LDE0ICs2NywxNCBAQAogCXJldHVybiAwOwogCiBmYWlsOgotCWZpYl9mcmVlX3RhYmxlKGxvY2FsX3RhYmxlKTsKKwlmaWJfZnJlZV90YWJsZShtYWluX3RhYmxlKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KICNlbHNlCiAKIHN0cnVjdCBmaWJfdGFibGUgKmZpYl9uZXdfdGFibGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgaWQpCiB7Ci0Jc3RydWN0IGZpYl90YWJsZSAqdGI7CisJc3RydWN0IGZpYl90YWJsZSAqdGIsICphbGlhcyA9IE5VTEw7CiAJdW5zaWduZWQgaW50IGg7CiAKIAlpZiAoaWQgPT0gMCkKQEAgLTgzLDIzICs4MywyMyBAQAogCWlmICh0YikKIAkJcmV0dXJuIHRiOwogCi0JdGIgPSBmaWJfdHJpZV90YWJsZShpZCk7CisJaWYgKGlkID09IFJUX1RBQkxFX0xPQ0FMKQorCQlhbGlhcyA9IGZpYl9uZXdfdGFibGUobmV0LCBSVF9UQUJMRV9NQUlOKTsKKworCXRiID0gZmliX3RyaWVfdGFibGUoaWQsIGFsaWFzKTsKIAlpZiAoIXRiKQogCQlyZXR1cm4gTlVMTDsKIAogCXN3aXRjaCAoaWQpIHsKIAljYXNlIFJUX1RBQkxFX0xPQ0FMOgotCQluZXQtPmlwdjQuZmliX2xvY2FsID0gdGI7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPmlwdjQuZmliX2xvY2FsLCB0Yik7CiAJCWJyZWFrOwotCiAJY2FzZSBSVF9UQUJMRV9NQUlOOgotCQluZXQtPmlwdjQuZmliX21haW4gPSB0YjsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+aXB2NC5maWJfbWFpbiwgdGIpOwogCQlicmVhazsKLQogCWNhc2UgUlRfVEFCTEVfREVGQVVMVDoKLQkJbmV0LT5pcHY0LmZpYl9kZWZhdWx0ID0gdGI7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihuZXQtPmlwdjQuZmliX2RlZmF1bHQsIHRiKTsKIAkJYnJlYWs7Ci0KIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC0xMjksOSArMTI5LDcxIEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0lQX01VTFRJUExFX1RBQkxFUyAqLwogCitzdGF0aWMgdm9pZCBmaWJfcmVwbGFjZV90YWJsZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmaWJfdGFibGUgKm9sZCwKKwkJCSAgICAgIHN0cnVjdCBmaWJfdGFibGUgKm5ldykKK3sKKyNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCisJc3dpdGNoIChuZXctPnRiX2lkKSB7CisJY2FzZSBSVF9UQUJMRV9MT0NBTDoKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+aXB2NC5maWJfbG9jYWwsIG5ldyk7CisJCWJyZWFrOworCWNhc2UgUlRfVEFCTEVfTUFJTjoKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+aXB2NC5maWJfbWFpbiwgbmV3KTsKKwkJYnJlYWs7CisJY2FzZSBSVF9UQUJMRV9ERUZBVUxUOgorCQlyY3VfYXNzaWduX3BvaW50ZXIobmV0LT5pcHY0LmZpYl9kZWZhdWx0LCBuZXcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKyNlbmRpZgorCS8qIHJlcGxhY2UgdGhlIG9sZCB0YWJsZSBpbiB0aGUgaGxpc3QgKi8KKwlobGlzdF9yZXBsYWNlX3JjdSgmb2xkLT50Yl9obGlzdCwgJm5ldy0+dGJfaGxpc3QpOworfQorCitpbnQgZmliX3VubWVyZ2Uoc3RydWN0IG5ldCAqbmV0KQoreworCXN0cnVjdCBmaWJfdGFibGUgKm9sZCwgKm5ldzsKKworCS8qIGF0dGVtcHQgdG8gZmV0Y2ggbG9jYWwgdGFibGUgaWYgaXQgaGFzIGJlZW4gYWxsb2NhdGVkICovCisJb2xkID0gZmliX2dldF90YWJsZShuZXQsIFJUX1RBQkxFX0xPQ0FMKTsKKwlpZiAoIW9sZCkKKwkJcmV0dXJuIDA7CisKKwluZXcgPSBmaWJfdHJpZV91bm1lcmdlKG9sZCk7CisJaWYgKCFuZXcpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogcmVwbGFjZSBtZXJnZWQgdGFibGUgd2l0aCBjbGVhbiB0YWJsZSAqLworCWlmIChuZXcgIT0gb2xkKSB7CisJCWZpYl9yZXBsYWNlX3RhYmxlKG5ldCwgb2xkLCBuZXcpOworCQlmaWJfZnJlZV90YWJsZShvbGQpOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBmaWJfZmx1c2goc3RydWN0IG5ldCAqbmV0KQogewogCWludCBmbHVzaGVkID0gMDsKKwl1bnNpZ25lZCBpbnQgaDsKKworCWZvciAoaCA9IDA7IGggPCBGSUJfVEFCTEVfSEFTSFNaOyBoKyspIHsKKwkJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmbmV0LT5pcHY0LmZpYl90YWJsZV9oYXNoW2hdOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOworCQlzdHJ1Y3QgZmliX3RhYmxlICp0YjsKKworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRiLCB0bXAsIGhlYWQsIHRiX2hsaXN0KQorCQkJZmx1c2hlZCArPSBmaWJfdGFibGVfZmx1c2godGIpOworCX0KKworCWlmIChmbHVzaGVkKQorCQlydF9jYWNoZV9mbHVzaChuZXQpOworfQorCit2b2lkIGZpYl9mbHVzaF9leHRlcm5hbChzdHJ1Y3QgbmV0ICpuZXQpCit7CiAJc3RydWN0IGZpYl90YWJsZSAqdGI7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJdW5zaWduZWQgaW50IGg7CkBAIC0xMzksMTEgKzIwMSw4IEBACiAJZm9yIChoID0gMDsgaCA8IEZJQl9UQUJMRV9IQVNIU1o7IGgrKykgewogCQloZWFkID0gJm5ldC0+aXB2NC5maWJfdGFibGVfaGFzaFtoXTsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnkodGIsIGhlYWQsIHRiX2hsaXN0KQotCQkJZmx1c2hlZCArPSBmaWJfdGFibGVfZmx1c2godGIpOworCQkJZmliX3RhYmxlX2ZsdXNoX2V4dGVybmFsKHRiKTsKIAl9Ci0KLQlpZiAoZmx1c2hlZCkKLQkJcnRfY2FjaGVfZmx1c2gobmV0KTsKIH0KIAogLyoKQEAgLTQyNyw3ICs0ODYsNyBAQAogCQkJZm9yIChpZmEgPSBpbl9kZXYtPmlmYV9saXN0OyBpZmE7IGlmYSA9IGlmYS0+aWZhX25leHQpCiAJCQkJaWYgKHN0cmNtcChpZmEtPmlmYV9sYWJlbCwgZGV2bmFtZSkgPT0gMCkKIAkJCQkJYnJlYWs7Ci0JCQlpZiAoaWZhID09IE5VTEwpCisJCQlpZiAoIWlmYSkKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCWNmZy0+ZmNfcHJlZnNyYyA9IGlmYS0+aWZhX2xvY2FsOwogCQl9CkBAIC00NTUsNyArNTE0LDcgQEAKIAkJaW50IGxlbiA9IDA7CiAKIAkJbXggPSBremFsbG9jKDMgKiBubGFfdG90YWxfc2l6ZSg0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChteCA9PSBOVUxMKQorCQlpZiAoIW14KQogCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJaWYgKHJ0LT5ydF9mbGFncyAmIFJURl9NVFUpCkBAIC02MTcsNyArNjc2LDcgQEAKIAkJZ290byBlcnJvdXQ7CiAKIAl0YiA9IGZpYl9nZXRfdGFibGUobmV0LCBjZmcuZmNfdGFibGUpOwotCWlmICh0YiA9PSBOVUxMKSB7CisJaWYgKCF0YikgewogCQllcnIgPSAtRVNSQ0g7CiAJCWdvdG8gZXJyb3V0OwogCX0KQEAgLTYzOSw3ICs2OTgsNyBAQAogCQlnb3RvIGVycm91dDsKIAogCXRiID0gZmliX25ld190YWJsZShuZXQsIGNmZy5mY190YWJsZSk7Ci0JaWYgKHRiID09IE5VTEwpIHsKKwlpZiAoIXRiKSB7CiAJCWVyciA9IC1FTk9CVUZTOwogCQlnb3RvIGVycm91dDsKIAl9CkBAIC02NjUsMTAgKzcyNCwxMiBAQAogCXNfaCA9IGNiLT5hcmdzWzBdOwogCXNfZSA9IGNiLT5hcmdzWzFdOwogCisJcmN1X3JlYWRfbG9jaygpOworCiAJZm9yIChoID0gc19oOyBoIDwgRklCX1RBQkxFX0hBU0hTWjsgaCsrLCBzX2UgPSAwKSB7CiAJCWUgPSAwOwogCQloZWFkID0gJm5ldC0+aXB2NC5maWJfdGFibGVfaGFzaFtoXTsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnkodGIsIGhlYWQsIHRiX2hsaXN0KSB7CisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0YiwgaGVhZCwgdGJfaGxpc3QpIHsKIAkJCWlmIChlIDwgc19lKQogCQkJCWdvdG8gbmV4dDsKIAkJCWlmIChkdW1wZWQpCkBAIC02ODIsNiArNzQzLDggQEAKIAkJfQogCX0KIG91dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwogCWNiLT5hcmdzWzFdID0gZTsKIAljYi0+YXJnc1swXSA9IGg7CiAKQEAgLTcxNiw3ICs3NzksNyBAQAogCWVsc2UKIAkJdGIgPSBmaWJfbmV3X3RhYmxlKG5ldCwgUlRfVEFCTEVfTE9DQUwpOwogCi0JaWYgKHRiID09IE5VTEwpCisJaWYgKCF0YikKIAkJcmV0dXJuOwogCiAJY2ZnLmZjX3RhYmxlID0gdGItPnRiX2lkOwpAQCAtNzQzLDcgKzgwNiw3IEBACiAKIAlpZiAoaWZhLT5pZmFfZmxhZ3MgJiBJRkFfRl9TRUNPTkRBUlkpIHsKIAkJcHJpbSA9IGluZXRfaWZhX2J5cHJlZml4KGluX2RldiwgcHJlZml4LCBtYXNrKTsKLQkJaWYgKHByaW0gPT0gTlVMTCkgeworCQlpZiAoIXByaW0pIHsKIAkJCXByX3dhcm4oIiVzOiBidWc6IHByaW0gPT0gTlVMTFxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwogCQl9CkBAIC03OTcsNyArODYwLDcgQEAKIAogCWlmIChpZmEtPmlmYV9mbGFncyAmIElGQV9GX1NFQ09OREFSWSkgewogCQlwcmltID0gaW5ldF9pZmFfYnlwcmVmaXgoaW5fZGV2LCBhbnksIGlmYS0+aWZhX21hc2spOwotCQlpZiAocHJpbSA9PSBOVUxMKSB7CisJCWlmICghcHJpbSkgewogCQkJcHJfd2FybigiJXM6IGJ1ZzogcHJpbSA9PSBOVUxMXG4iLCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTk2Nyw3ICsxMDMwLDcgQEAKIAkJcmV0dXJuOwogCiAJc2tiID0gbmV0bGlua19za2JfY2xvbmUoc2tiLCBHRlBfS0VSTkVMKTsKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCXJldHVybjsKIAlubGggPSBubG1zZ19oZHIoc2tiKTsKIApAQCAtOTg4LDcgKzEwNTEsNyBAQAogCX07CiAKIAlzayA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZShuZXQsIE5FVExJTktfRklCX0xPT0tVUCwgJmNmZyk7Ci0JaWYgKHNrID09IE5VTEwpCisJaWYgKCFzaykKIAkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CiAJbmV0LT5pcHY0LmZpYm5sID0gc2s7CiAJcmV0dXJuIDA7CkBAIC0xMDI2LDcgKzEwODksNyBAQAogCWNhc2UgTkVUREVWX0RPV046CiAJCWZpYl9kZWxfaWZhZGRyKGlmYSwgTlVMTCk7CiAJCWF0b21pY19pbmMoJm5ldC0+aXB2NC5kZXZfYWRkcl9nZW5pZCk7Ci0JCWlmIChpZmEtPmlmYV9kZXYtPmlmYV9saXN0ID09IE5VTEwpIHsKKwkJaWYgKCFpZmEtPmlmYV9kZXYtPmlmYV9saXN0KSB7CiAJCQkvKiBMYXN0IGFkZHJlc3Mgd2FzIGRlbGV0ZWQgZnJvbSB0aGlzIGludGVyZmFjZS4KIAkJCSAqIERpc2FibGUgSVAuCiAJCQkgKi8KQEAgLTEwOTQsNyArMTE1Nyw3IEBACiAJc2l6ZSA9IG1heF90KHNpemVfdCwgc2l6ZSwgTDFfQ0FDSEVfQllURVMpOwogCiAJbmV0LT5pcHY0LmZpYl90YWJsZV9oYXNoID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAobmV0LT5pcHY0LmZpYl90YWJsZV9oYXNoID09IE5VTEwpCisJaWYgKCFuZXQtPmlwdjQuZmliX3RhYmxlX2hhc2gpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJZXJyID0gZmliNF9ydWxlc19pbml0KG5ldCk7CkBAIC0xMTExLDIzICsxMTc0LDI3IEBACiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLSNpZmRlZiBDT05GSUdfSVBfTVVMVElQTEVfVEFCTEVTCi0JZmliNF9ydWxlc19leGl0KG5ldCk7Ci0jZW5kaWYKLQogCXJ0bmxfbG9jaygpOworI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKKwlSQ1VfSU5JVF9QT0lOVEVSKG5ldC0+aXB2NC5maWJfbG9jYWwsIE5VTEwpOworCVJDVV9JTklUX1BPSU5URVIobmV0LT5pcHY0LmZpYl9tYWluLCBOVUxMKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKG5ldC0+aXB2NC5maWJfZGVmYXVsdCwgTlVMTCk7CisjZW5kaWYKIAlmb3IgKGkgPSAwOyBpIDwgRklCX1RBQkxFX0hBU0hTWjsgaSsrKSB7Ci0JCXN0cnVjdCBmaWJfdGFibGUgKnRiOwotCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwkJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmbmV0LT5pcHY0LmZpYl90YWJsZV9oYXNoW2ldOwogCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOworCQlzdHJ1Y3QgZmliX3RhYmxlICp0YjsKIAotCQloZWFkID0gJm5ldC0+aXB2NC5maWJfdGFibGVfaGFzaFtpXTsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0YiwgdG1wLCBoZWFkLCB0Yl9obGlzdCkgewogCQkJaGxpc3RfZGVsKCZ0Yi0+dGJfaGxpc3QpOwogCQkJZmliX3RhYmxlX2ZsdXNoKHRiKTsKIAkJCWZpYl9mcmVlX3RhYmxlKHRiKTsKIAkJfQogCX0KKworI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKKwlmaWI0X3J1bGVzX2V4aXQobmV0KTsKKyNlbmRpZgogCXJ0bmxfdW5sb2NrKCk7CiAJa2ZyZWUobmV0LT5pcHY0LmZpYl90YWJsZV9oYXNoKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9sb29rdXAuaCBiL25ldC9pcHY0L2ZpYl9sb29rdXAuaAppbmRleCA4MjU5ODFiLi5jNjIxMWVkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9maWJfbG9va3VwLmgKKysrIGIvbmV0L2lwdjQvZmliX2xvb2t1cC5oCkBAIC02LDExICs2LDEzIEBACiAjaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgogCiBzdHJ1Y3QgZmliX2FsaWFzIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWZhX2xpc3Q7CisJc3RydWN0IGhsaXN0X25vZGUJZmFfbGlzdDsKIAlzdHJ1Y3QgZmliX2luZm8JCSpmYV9pbmZvOwogCXU4CQkJZmFfdG9zOwogCXU4CQkJZmFfdHlwZTsKIAl1OAkJCWZhX3N0YXRlOworCXU4CQkJZmFfc2xlbjsKKwl1MzIJCQl0Yl9pZDsKIAlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKIH07CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZpYl9ydWxlcy5jIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKaW5kZXggZDNkYjcxOC4uNTYxNTE5OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZmliX3J1bGVzLmMKKysrIGIvbmV0L2lwdjQvZmliX3J1bGVzLmMKQEAgLTE1Myw3ICsxNTMsNyBAQAogCXUzMiBpZDsKIAogCWZvciAoaWQgPSAxOyBpZCA8PSBSVF9UQUJMRV9NQVg7IGlkKyspCi0JCWlmIChmaWJfZ2V0X3RhYmxlKG5ldCwgaWQpID09IE5VTEwpCisJCWlmICghZmliX2dldF90YWJsZShuZXQsIGlkKSkKIAkJCXJldHVybiBmaWJfbmV3X3RhYmxlKG5ldCwgaWQpOwogCXJldHVybiBOVUxMOwogfQpAQCAtMTc0LDEyICsxNzQsMTcgQEAKIAlpZiAoZnJoLT50b3MgJiB+SVBUT1NfVE9TX01BU0spCiAJCWdvdG8gZXJyb3V0OwogCisJLyogc3BsaXQgbG9jYWwvbWFpbiBpZiB0aGV5IGFyZSBub3QgYWxyZWFkeSBzcGxpdCAqLworCWVyciA9IGZpYl91bm1lcmdlKG5ldCk7CisJaWYgKGVycikKKwkJZ290byBlcnJvdXQ7CisKIAlpZiAocnVsZS0+dGFibGUgPT0gUlRfVEFCTEVfVU5TUEVDKSB7CiAJCWlmIChydWxlLT5hY3Rpb24gPT0gRlJfQUNUX1RPX1RCTCkgewogCQkJc3RydWN0IGZpYl90YWJsZSAqdGFibGU7CiAKIAkJCXRhYmxlID0gZmliX2VtcHR5X3RhYmxlKG5ldCk7Ci0JCQlpZiAodGFibGUgPT0gTlVMTCkgeworCQkJaWYgKCF0YWJsZSkgewogCQkJCWVyciA9IC1FTk9CVUZTOwogCQkJCWdvdG8gZXJyb3V0OwogCQkJfQpAQCAtMTg5LDEwICsxOTQsMTAgQEAKIAl9CiAKIAlpZiAoZnJoLT5zcmNfbGVuKQotCQlydWxlNC0+c3JjID0gbmxhX2dldF9iZTMyKHRiW0ZSQV9TUkNdKTsKKwkJcnVsZTQtPnNyYyA9IG5sYV9nZXRfaW5fYWRkcih0YltGUkFfU1JDXSk7CiAKIAlpZiAoZnJoLT5kc3RfbGVuKQotCQlydWxlNC0+ZHN0ID0gbmxhX2dldF9iZTMyKHRiW0ZSQV9EU1RdKTsKKwkJcnVsZTQtPmRzdCA9IG5sYV9nZXRfaW5fYWRkcih0YltGUkFfRFNUXSk7CiAKICNpZmRlZiBDT05GSUdfSVBfUk9VVEVfQ0xBU1NJRAogCWlmICh0YltGUkFfRkxPV10pIHsKQEAgLTIwOSwyMSArMjE0LDMxIEBACiAJcnVsZTQtPnRvcyA9IGZyaC0+dG9zOwogCiAJbmV0LT5pcHY0LmZpYl9oYXNfY3VzdG9tX3J1bGVzID0gdHJ1ZTsKKwlmaWJfZmx1c2hfZXh0ZXJuYWwocnVsZS0+ZnJfbmV0KTsKKwogCWVyciA9IDA7CiBlcnJvdXQ6CiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgZmliNF9ydWxlX2RlbGV0ZShzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUpCitzdGF0aWMgaW50IGZpYjRfcnVsZV9kZWxldGUoc3RydWN0IGZpYl9ydWxlICpydWxlKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IHJ1bGUtPmZyX25ldDsKLSNpZmRlZiBDT05GSUdfSVBfUk9VVEVfQ0xBU1NJRAotCXN0cnVjdCBmaWI0X3J1bGUgKnJ1bGU0ID0gKHN0cnVjdCBmaWI0X3J1bGUgKikgcnVsZTsKKwlpbnQgZXJyOwogCi0JaWYgKHJ1bGU0LT50Y2xhc3NpZCkKKwkvKiBzcGxpdCBsb2NhbC9tYWluIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHNwbGl0ICovCisJZXJyID0gZmliX3VubWVyZ2UobmV0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm91dDsKKworI2lmZGVmIENPTkZJR19JUF9ST1VURV9DTEFTU0lECisJaWYgKCgoc3RydWN0IGZpYjRfcnVsZSAqKXJ1bGUpLT50Y2xhc3NpZCkKIAkJbmV0LT5pcHY0LmZpYl9udW1fdGNsYXNzaWRfdXNlcnMtLTsKICNlbmRpZgogCW5ldC0+aXB2NC5maWJfaGFzX2N1c3RvbV9ydWxlcyA9IHRydWU7CisJZmliX2ZsdXNoX2V4dGVybmFsKHJ1bGUtPmZyX25ldCk7CitlcnJvdXQ6CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBmaWI0X3J1bGVfY29tcGFyZShzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsIHN0cnVjdCBmaWJfcnVsZV9oZHIgKmZyaCwKQEAgLTI0NSwxMCArMjYwLDEwIEBACiAJCXJldHVybiAwOwogI2VuZGlmCiAKLQlpZiAoZnJoLT5zcmNfbGVuICYmIChydWxlNC0+c3JjICE9IG5sYV9nZXRfYmUzMih0YltGUkFfU1JDXSkpKQorCWlmIChmcmgtPnNyY19sZW4gJiYgKHJ1bGU0LT5zcmMgIT0gbmxhX2dldF9pbl9hZGRyKHRiW0ZSQV9TUkNdKSkpCiAJCXJldHVybiAwOwogCi0JaWYgKGZyaC0+ZHN0X2xlbiAmJiAocnVsZTQtPmRzdCAhPSBubGFfZ2V0X2JlMzIodGJbRlJBX0RTVF0pKSkKKwlpZiAoZnJoLT5kc3RfbGVuICYmIChydWxlNC0+ZHN0ICE9IG5sYV9nZXRfaW5fYWRkcih0YltGUkFfRFNUXSkpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwpAQCAtMjY0LDkgKzI3OSw5IEBACiAJZnJoLT50b3MgPSBydWxlNC0+dG9zOwogCiAJaWYgKChydWxlNC0+ZHN0X2xlbiAmJgotCSAgICAgbmxhX3B1dF9iZTMyKHNrYiwgRlJBX0RTVCwgcnVsZTQtPmRzdCkpIHx8CisJICAgICBubGFfcHV0X2luX2FkZHIoc2tiLCBGUkFfRFNULCBydWxlNC0+ZHN0KSkgfHwKIAkgICAgKHJ1bGU0LT5zcmNfbGVuICYmCi0JICAgICBubGFfcHV0X2JlMzIoc2tiLCBGUkFfU1JDLCBydWxlNC0+c3JjKSkpCisJICAgICBubGFfcHV0X2luX2FkZHIoc2tiLCBGUkFfU1JDLCBydWxlNC0+c3JjKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogI2lmZGVmIENPTkZJR19JUF9ST1VURV9DTEFTU0lECiAJaWYgKHJ1bGU0LT50Y2xhc3NpZCAmJgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jIGIvbmV0L2lwdjQvZmliX3NlbWFudGljcy5jCmluZGV4IDFlMjA5MGUuLjhkNjk1YjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9zZW1hbnRpY3MuYworKysgYi9uZXQvaXB2NC9maWJfc2VtYW50aWNzLmMKQEAgLTIxMyw3ICsyMTMsNiBAQAogCQlydF9maWJpbmZvX2ZyZWUoJm5leHRob3BfbmgtPm5oX3J0aF9pbnB1dCk7CiAJfSBlbmRmb3JfbmV4dGhvcHMoZmkpOwogCi0JcmVsZWFzZV9uZXQoZmktPmZpYl9uZXQpOwogCWlmIChmaS0+ZmliX21ldHJpY3MgIT0gKHUzMiAqKSBkc3RfZGVmYXVsdF9tZXRyaWNzKQogCQlrZnJlZShmaS0+ZmliX21ldHJpY3MpOwogCWtmcmVlKGZpKTsKQEAgLTM5MSw3ICszOTAsNyBAQAogCWludCBlcnIgPSAtRU5PQlVGUzsKIAogCXNrYiA9IG5sbXNnX25ldyhmaWJfbmxtc2dfc2l6ZShmYS0+ZmFfaW5mbyksIEdGUF9LRVJORUwpOwotCWlmIChza2IgPT0gTlVMTCkKKwlpZiAoIXNrYikKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBmaWJfZHVtcF9pbmZvKHNrYiwgaW5mby0+cG9ydGlkLCBzZXEsIGV2ZW50LCB0Yl9pZCwKQEAgLTQ2OSw3ICs0NjgsNyBAQAogCQkJc3RydWN0IG5sYXR0ciAqbmxhLCAqYXR0cnMgPSBydG5oX2F0dHJzKHJ0bmgpOwogCiAJCQlubGEgPSBubGFfZmluZChhdHRycywgYXR0cmxlbiwgUlRBX0dBVEVXQVkpOwotCQkJbmV4dGhvcF9uaC0+bmhfZ3cgPSBubGEgPyBubGFfZ2V0X2JlMzIobmxhKSA6IDA7CisJCQluZXh0aG9wX25oLT5uaF9ndyA9IG5sYSA/IG5sYV9nZXRfaW5fYWRkcihubGEpIDogMDsKICNpZmRlZiBDT05GSUdfSVBfUk9VVEVfQ0xBU1NJRAogCQkJbmxhID0gbmxhX2ZpbmQoYXR0cnMsIGF0dHJsZW4sIFJUQV9GTE9XKTsKIAkJCW5leHRob3BfbmgtPm5oX3RjbGFzc2lkID0gbmxhID8gbmxhX2dldF91MzIobmxhKSA6IDA7CkBAIC01MDQsNyArNTAzLDcgQEAKIAl9CiAKICNpZmRlZiBDT05GSUdfSVBfUk9VVEVfTVVMVElQQVRICi0JaWYgKGNmZy0+ZmNfbXAgPT0gTlVMTCkKKwlpZiAoIWNmZy0+ZmNfbXApCiAJCXJldHVybiAwOwogCiAJcnRuaCA9IGNmZy0+ZmNfbXA7CkBAIC01MjQsNyArNTIzLDcgQEAKIAkJCXN0cnVjdCBubGF0dHIgKm5sYSwgKmF0dHJzID0gcnRuaF9hdHRycyhydG5oKTsKIAogCQkJbmxhID0gbmxhX2ZpbmQoYXR0cnMsIGF0dHJsZW4sIFJUQV9HQVRFV0FZKTsKLQkJCWlmIChubGEgJiYgbmxhX2dldF9iZTMyKG5sYSkgIT0gbmgtPm5oX2d3KQorCQkJaWYgKG5sYSAmJiBubGFfZ2V0X2luX2FkZHIobmxhKSAhPSBuaC0+bmhfZ3cpCiAJCQkJcmV0dXJuIDE7CiAjaWZkZWYgQ09ORklHX0lQX1JPVVRFX0NMQVNTSUQKIAkJCW5sYSA9IG5sYV9maW5kKGF0dHJzLCBhdHRybGVuLCBSVEFfRkxPVyk7CkBAIC02NDcsNyArNjQ2LDcgQEAKIAkJcmN1X3JlYWRfbG9jaygpOwogCQllcnIgPSAtRU5PREVWOwogCQlpbl9kZXYgPSBpbmV0ZGV2X2J5X2luZGV4KG5ldCwgbmgtPm5oX29pZik7Ci0JCWlmIChpbl9kZXYgPT0gTlVMTCkKKwkJaWYgKCFpbl9kZXYpCiAJCQlnb3RvIG91dDsKIAkJZXJyID0gLUVORVRET1dOOwogCQlpZiAoIShpbl9kZXYtPmRldi0+ZmxhZ3MgJiBJRkZfVVApKQpAQCAtODA0LDcgKzgwMyw3IEBACiAJfQogCiAJZmkgPSBremFsbG9jKHNpemVvZigqZmkpK25ocypzaXplb2Yoc3RydWN0IGZpYl9uaCksIEdGUF9LRVJORUwpOwotCWlmIChmaSA9PSBOVUxMKQorCWlmICghZmkpCiAJCWdvdG8gZmFpbHVyZTsKIAlmaWJfaW5mb19jbnQrKzsKIAlpZiAoY2ZnLT5mY19teCkgewpAQCAtODE0LDcgKzgxMyw3IEBACiAJfSBlbHNlCiAJCWZpLT5maWJfbWV0cmljcyA9ICh1MzIgKikgZHN0X2RlZmF1bHRfbWV0cmljczsKIAotCWZpLT5maWJfbmV0ID0gaG9sZF9uZXQobmV0KTsKKwlmaS0+ZmliX25ldCA9IG5ldDsKIAlmaS0+ZmliX3Byb3RvY29sID0gY2ZnLT5mY19wcm90b2NvbDsKIAlmaS0+ZmliX3Njb3BlID0gY2ZnLT5mY19zY29wZTsKIAlmaS0+ZmliX2ZsYWdzID0gY2ZnLT5mY19mbGFnczsKQEAgLTkyMiw3ICs5MjEsNyBAQAogCQluaC0+bmhfc2NvcGUgPSBSVF9TQ09QRV9OT1dIRVJFOwogCQluaC0+bmhfZGV2ID0gZGV2X2dldF9ieV9pbmRleChuZXQsIGZpLT5maWJfbmgtPm5oX29pZik7CiAJCWVyciA9IC1FTk9ERVY7Ci0JCWlmIChuaC0+bmhfZGV2ID09IE5VTEwpCisJCWlmICghbmgtPm5oX2RldikKIAkJCWdvdG8gZmFpbHVyZTsKIAl9IGVsc2UgewogCQljaGFuZ2VfbmV4dGhvcHMoZmkpIHsKQEAgLTk5Niw3ICs5OTUsNyBAQAogCXN0cnVjdCBydG1zZyAqcnRtOwogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnJ0bSksIGZsYWdzKTsKLQlpZiAobmxoID09IE5VTEwpCisJaWYgKCFubGgpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlydG0gPSBubG1zZ19kYXRhKG5saCk7CkBAIC0xMDE2LDcgKzEwMTUsNyBAQAogCXJ0bS0+cnRtX3Byb3RvY29sID0gZmktPmZpYl9wcm90b2NvbDsKIAogCWlmIChydG0tPnJ0bV9kc3RfbGVuICYmCi0JICAgIG5sYV9wdXRfYmUzMihza2IsIFJUQV9EU1QsIGRzdCkpCisJICAgIG5sYV9wdXRfaW5fYWRkcihza2IsIFJUQV9EU1QsIGRzdCkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCWlmIChmaS0+ZmliX3ByaW9yaXR5ICYmCiAJICAgIG5sYV9wdXRfdTMyKHNrYiwgUlRBX1BSSU9SSVRZLCBmaS0+ZmliX3ByaW9yaXR5KSkKQEAgLTEwMjUsMTEgKzEwMjQsMTEgQEAKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAlpZiAoZmktPmZpYl9wcmVmc3JjICYmCi0JICAgIG5sYV9wdXRfYmUzMihza2IsIFJUQV9QUkVGU1JDLCBmaS0+ZmliX3ByZWZzcmMpKQorCSAgICBubGFfcHV0X2luX2FkZHIoc2tiLCBSVEFfUFJFRlNSQywgZmktPmZpYl9wcmVmc3JjKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJaWYgKGZpLT5maWJfbmhzID09IDEpIHsKIAkJaWYgKGZpLT5maWJfbmgtPm5oX2d3ICYmCi0JCSAgICBubGFfcHV0X2JlMzIoc2tiLCBSVEFfR0FURVdBWSwgZmktPmZpYl9uaC0+bmhfZ3cpKQorCQkgICAgbmxhX3B1dF9pbl9hZGRyKHNrYiwgUlRBX0dBVEVXQVksIGZpLT5maWJfbmgtPm5oX2d3KSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQlpZiAoZmktPmZpYl9uaC0+bmhfb2lmICYmCiAJCSAgICBubGFfcHV0X3UzMihza2IsIFJUQV9PSUYsIGZpLT5maWJfbmgtPm5oX29pZikpCkBAIC0xMDQ2LDEyICsxMDQ1LDEyIEBACiAJCXN0cnVjdCBubGF0dHIgKm1wOwogCiAJCW1wID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBSVEFfTVVMVElQQVRIKTsKLQkJaWYgKG1wID09IE5VTEwpCisJCWlmICghbXApCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCQlmb3JfbmV4dGhvcHMoZmkpIHsKIAkJCXJ0bmggPSBubGFfcmVzZXJ2ZV9ub2hkcihza2IsIHNpemVvZigqcnRuaCkpOwotCQkJaWYgKHJ0bmggPT0gTlVMTCkKKwkJCWlmICghcnRuaCkKIAkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCQkJcnRuaC0+cnRuaF9mbGFncyA9IG5oLT5uaF9mbGFncyAmIDB4RkY7CkBAIC0xMDU5LDcgKzEwNTgsNyBAQAogCQkJcnRuaC0+cnRuaF9pZmluZGV4ID0gbmgtPm5oX29pZjsKIAogCQkJaWYgKG5oLT5uaF9ndyAmJgotCQkJICAgIG5sYV9wdXRfYmUzMihza2IsIFJUQV9HQVRFV0FZLCBuaC0+bmhfZ3cpKQorCQkJICAgIG5sYV9wdXRfaW5fYWRkcihza2IsIFJUQV9HQVRFV0FZLCBuaC0+bmhfZ3cpKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogI2lmZGVmIENPTkZJR19JUF9ST1VURV9DTEFTU0lECiAJCQlpZiAobmgtPm5oX3RjbGFzc2lkICYmCkBAIC0xMDk0LDcgKzEwOTMsNyBAQAogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gJmZpYl9pbmZvX2xhZGRyaGFzaFtoYXNoXTsKIAlzdHJ1Y3QgZmliX2luZm8gKmZpOwogCi0JaWYgKGZpYl9pbmZvX2xhZGRyaGFzaCA9PSBOVUxMIHx8IGxvY2FsID09IDApCisJaWYgKCFmaWJfaW5mb19sYWRkcmhhc2ggfHwgbG9jYWwgPT0gMCkKIAkJcmV0dXJuIDA7CiAKIAlobGlzdF9mb3JfZWFjaF9lbnRyeShmaSwgaGVhZCwgZmliX2xoYXNoKSB7CkBAIC0xMTYzLDEyICsxMTYyLDEyIEBACiB2b2lkIGZpYl9zZWxlY3RfZGVmYXVsdChzdHJ1Y3QgZmliX3Jlc3VsdCAqcmVzKQogewogCXN0cnVjdCBmaWJfaW5mbyAqZmkgPSBOVUxMLCAqbGFzdF9yZXNvcnQgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKmZhX2hlYWQgPSByZXMtPmZhX2hlYWQ7CisJc3RydWN0IGhsaXN0X2hlYWQgKmZhX2hlYWQgPSByZXMtPmZhX2hlYWQ7CiAJc3RydWN0IGZpYl90YWJsZSAqdGIgPSByZXMtPnRhYmxlOwogCWludCBvcmRlciA9IC0xLCBsYXN0X2lkeCA9IC0xOwogCXN0cnVjdCBmaWJfYWxpYXMgKmZhOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZmEsIGZhX2hlYWQsIGZhX2xpc3QpIHsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZmEsIGZhX2hlYWQsIGZhX2xpc3QpIHsKIAkJc3RydWN0IGZpYl9pbmZvICpuZXh0X2ZpID0gZmEtPmZhX2luZm87CiAKIAkJaWYgKG5leHRfZmktPmZpYl9zY29wZSAhPSByZXMtPnNjb3BlIHx8CkBAIC0xMTgzLDcgKzExODIsNyBAQAogCiAJCWZpYl9hbGlhc19hY2Nlc3NlZChmYSk7CiAKLQkJaWYgKGZpID09IE5VTEwpIHsKKwkJaWYgKCFmaSkgewogCQkJaWYgKG5leHRfZmkgIT0gcmVzLT5maSkKIAkJCQlicmVhazsKIAkJfSBlbHNlIGlmICghZmliX2RldGVjdF9kZWF0aChmaSwgb3JkZXIsICZsYXN0X3Jlc29ydCwKQEAgLTExOTYsNyArMTE5NSw3IEBACiAJCW9yZGVyKys7CiAJfQogCi0JaWYgKG9yZGVyIDw9IDAgfHwgZmkgPT0gTlVMTCkgeworCWlmIChvcmRlciA8PSAwIHx8ICFmaSkgewogCQl0Yi0+dGJfZGVmYXVsdCA9IC0xOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xMjUyLDcgKzEyNTEsNyBAQAogCQkJCWFsaXZlKys7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlpZiAobmV4dGhvcF9uaC0+bmhfZGV2ID09IE5VTEwgfHwKKwkJCWlmICghbmV4dGhvcF9uaC0+bmhfZGV2IHx8CiAJCQkgICAgIShuZXh0aG9wX25oLT5uaF9kZXYtPmZsYWdzICYgSUZGX1VQKSkKIAkJCQljb250aW51ZTsKIAkJCWlmIChuZXh0aG9wX25oLT5uaF9kZXYgIT0gZGV2IHx8CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfdHJpZS5jIGIvbmV0L2lwdjQvZmliX3RyaWUuYwppbmRleCAzZGFmMDIyLi5lMTNmY2M2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9maWJfdHJpZS5jCisrKyBiL25ldC9pcHY0L2ZpYl90cmllLmMKQEAgLTc5LDYgKzc5LDcgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvaXBfZmliLmg+CisjaW5jbHVkZSA8bmV0L3N3aXRjaGRldi5oPgogI2luY2x1ZGUgImZpYl9sb29rdXAuaCIKIAogI2RlZmluZSBNQVhfU1RBVF9ERVBUSCAzMgpAQCAtODgsMzggKzg5LDM1IEBACiAKIHR5cGVkZWYgdW5zaWduZWQgaW50IHRfa2V5OwogCi0jZGVmaW5lIElTX1ROT0RFKG4pICgobiktPmJpdHMpCi0jZGVmaW5lIElTX0xFQUYobikgKCEobiktPmJpdHMpCisjZGVmaW5lIElTX1RSSUUobikJKChuKS0+cG9zID49IEtFWUxFTkdUSCkKKyNkZWZpbmUgSVNfVE5PREUobikJKChuKS0+Yml0cykKKyNkZWZpbmUgSVNfTEVBRihuKQkoIShuKS0+Yml0cykKIAotI2RlZmluZSBnZXRfaW5kZXgoX2tleSwgX2t2KSAoKChfa2V5KSBeIChfa3YpLT5rZXkpID4+IChfa3YpLT5wb3MpCi0KLXN0cnVjdCB0bm9kZSB7CitzdHJ1Y3Qga2V5X3ZlY3RvciB7CiAJdF9rZXkga2V5OwotCXVuc2lnbmVkIGNoYXIgYml0czsJCS8qIDJsb2coS0VZTEVOR1RIKSBiaXRzIG5lZWRlZCAqLwogCXVuc2lnbmVkIGNoYXIgcG9zOwkJLyogMmxvZyhLRVlMRU5HVEgpIGJpdHMgbmVlZGVkICovCisJdW5zaWduZWQgY2hhciBiaXRzOwkJLyogMmxvZyhLRVlMRU5HVEgpIGJpdHMgbmVlZGVkICovCiAJdW5zaWduZWQgY2hhciBzbGVuOwotCXN0cnVjdCB0bm9kZSBfX3JjdSAqcGFyZW50OwotCXN0cnVjdCByY3VfaGVhZCByY3U7CiAJdW5pb24gewotCQkvKiBUaGUgZmllbGRzIGluIHRoaXMgc3RydWN0IGFyZSB2YWxpZCBpZiBiaXRzID4gMCAoVE5PREUpICovCi0JCXN0cnVjdCB7Ci0JCQl0X2tleSBlbXB0eV9jaGlsZHJlbjsgLyogS0VZTEVOR1RIIGJpdHMgbmVlZGVkICovCi0JCQl0X2tleSBmdWxsX2NoaWxkcmVuOyAgLyogS0VZTEVOR1RIIGJpdHMgbmVlZGVkICovCi0JCQlzdHJ1Y3QgdG5vZGUgX19yY3UgKmNoaWxkWzBdOwotCQl9OwotCQkvKiBUaGlzIGxpc3QgcG9pbnRlciBpZiB2YWxpZCBpZiBiaXRzID09IDAgKExFQUYpICovCi0JCXN0cnVjdCBobGlzdF9oZWFkIGxpc3Q7CisJCS8qIFRoaXMgbGlzdCBwb2ludGVyIGlmIHZhbGlkIGlmIChwb3MgfCBiaXRzKSA9PSAwIChMRUFGKSAqLworCQlzdHJ1Y3QgaGxpc3RfaGVhZCBsZWFmOworCQkvKiBUaGlzIGFycmF5IGlzIHZhbGlkIGlmIChwb3MgfCBiaXRzKSA+IDAgKFROT0RFKSAqLworCQlzdHJ1Y3Qga2V5X3ZlY3RvciBfX3JjdSAqdG5vZGVbMF07CiAJfTsKIH07CiAKLXN0cnVjdCBsZWFmX2luZm8gewotCXN0cnVjdCBobGlzdF9ub2RlIGhsaXN0OwotCWludCBwbGVuOwotCXUzMiBtYXNrX3BsZW47IC8qIG50b2hsKGluZXRfbWFrZV9tYXNrKHBsZW4pKSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgZmFsaDsKK3N0cnVjdCB0bm9kZSB7CiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwl0X2tleSBlbXB0eV9jaGlsZHJlbjsJCS8qIEtFWUxFTkdUSCBiaXRzIG5lZWRlZCAqLworCXRfa2V5IGZ1bGxfY2hpbGRyZW47CQkvKiBLRVlMRU5HVEggYml0cyBuZWVkZWQgKi8KKwlzdHJ1Y3Qga2V5X3ZlY3RvciBfX3JjdSAqcGFyZW50OworCXN0cnVjdCBrZXlfdmVjdG9yIGt2WzFdOworI2RlZmluZSB0bl9iaXRzIGt2WzBdLmJpdHMKIH07CiAKKyNkZWZpbmUgVE5PREVfU0laRShuKQlvZmZzZXRvZihzdHJ1Y3QgdG5vZGUsIGt2WzBdLnRub2RlW25dKQorI2RlZmluZSBMRUFGX1NJWkUJVE5PREVfU0laRSgxKQorCiAjaWZkZWYgQ09ORklHX0lQX0ZJQl9UUklFX1NUQVRTCiBzdHJ1Y3QgdHJpZV91c2Vfc3RhdHMgewogCXVuc2lnbmVkIGludCBnZXRzOwpAQCAtMTQyLDEzICsxNDAsMTMgQEAKIH07CiAKIHN0cnVjdCB0cmllIHsKLQlzdHJ1Y3QgdG5vZGUgX19yY3UgKnRyaWU7CisJc3RydWN0IGtleV92ZWN0b3Iga3ZbMV07CiAjaWZkZWYgQ09ORklHX0lQX0ZJQl9UUklFX1NUQVRTCiAJc3RydWN0IHRyaWVfdXNlX3N0YXRzIF9fcGVyY3B1ICpzdGF0czsKICNlbmRpZgogfTsKIAotc3RhdGljIHZvaWQgcmVzaXplKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuKTsKK3N0YXRpYyBzdHJ1Y3Qga2V5X3ZlY3RvciAqcmVzaXplKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3Qga2V5X3ZlY3RvciAqdG4pOwogc3RhdGljIHNpemVfdCB0bm9kZV9mcmVlX3NpemU7CiAKIC8qCkBAIC0xNjEsNDEgKzE1OSw0NiBAQAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpmbl9hbGlhc19rbWVtIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnRyaWVfbGVhZl9rbWVtIF9fcmVhZF9tb3N0bHk7CiAKLS8qIGNhbGxlciBtdXN0IGhvbGQgUlROTCAqLwotI2RlZmluZSBub2RlX3BhcmVudChuKSBydG5sX2RlcmVmZXJlbmNlKChuKS0+cGFyZW50KQotCi0vKiBjYWxsZXIgbXVzdCBob2xkIFJDVSByZWFkIGxvY2sgb3IgUlROTCAqLwotI2RlZmluZSBub2RlX3BhcmVudF9yY3UobikgcmN1X2RlcmVmZXJlbmNlX3J0bmwoKG4pLT5wYXJlbnQpCi0KLS8qIHdyYXBwZXIgZm9yIHJjdV9hc3NpZ25fcG9pbnRlciAqLwotc3RhdGljIGlubGluZSB2b2lkIG5vZGVfc2V0X3BhcmVudChzdHJ1Y3QgdG5vZGUgKm4sIHN0cnVjdCB0bm9kZSAqdHApCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0bm9kZSAqdG5faW5mbyhzdHJ1Y3Qga2V5X3ZlY3RvciAqa3YpCiB7Ci0JaWYgKG4pCi0JCXJjdV9hc3NpZ25fcG9pbnRlcihuLT5wYXJlbnQsIHRwKTsKKwlyZXR1cm4gY29udGFpbmVyX29mKGt2LCBzdHJ1Y3QgdG5vZGUsIGt2WzBdKTsKIH0KIAotI2RlZmluZSBOT0RFX0lOSVRfUEFSRU5UKG4sIHApIFJDVV9JTklUX1BPSU5URVIoKG4pLT5wYXJlbnQsIHApCisvKiBjYWxsZXIgbXVzdCBob2xkIFJUTkwgKi8KKyNkZWZpbmUgbm9kZV9wYXJlbnQodG4pIHJ0bmxfZGVyZWZlcmVuY2UodG5faW5mbyh0biktPnBhcmVudCkKKyNkZWZpbmUgZ2V0X2NoaWxkKHRuLCBpKSBydG5sX2RlcmVmZXJlbmNlKCh0biktPnRub2RlW2ldKQorCisvKiBjYWxsZXIgbXVzdCBob2xkIFJDVSByZWFkIGxvY2sgb3IgUlROTCAqLworI2RlZmluZSBub2RlX3BhcmVudF9yY3UodG4pIHJjdV9kZXJlZmVyZW5jZV9ydG5sKHRuX2luZm8odG4pLT5wYXJlbnQpCisjZGVmaW5lIGdldF9jaGlsZF9yY3UodG4sIGkpIHJjdV9kZXJlZmVyZW5jZV9ydG5sKCh0biktPnRub2RlW2ldKQorCisvKiB3cmFwcGVyIGZvciByY3VfYXNzaWduX3BvaW50ZXIgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBub2RlX3NldF9wYXJlbnQoc3RydWN0IGtleV92ZWN0b3IgKm4sIHN0cnVjdCBrZXlfdmVjdG9yICp0cCkKK3sKKwlpZiAobikKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHRuX2luZm8obiktPnBhcmVudCwgdHApOworfQorCisjZGVmaW5lIE5PREVfSU5JVF9QQVJFTlQobiwgcCkgUkNVX0lOSVRfUE9JTlRFUih0bl9pbmZvKG4pLT5wYXJlbnQsIHApCiAKIC8qIFRoaXMgcHJvdmlkZXMgdXMgd2l0aCB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIGluIHRoaXMgbm9kZSwgaW4gdGhlIGNhc2Ugb2YgYQogICogbGVhZiB0aGlzIHdpbGwgcmV0dXJuIDAgbWVhbmluZyBub25lIG9mIHRoZSBjaGlsZHJlbiBhcmUgYWNjZXNzaWJsZS4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRub2RlX2NoaWxkX2xlbmd0aChjb25zdCBzdHJ1Y3QgdG5vZGUgKnRuKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNoaWxkX2xlbmd0aChjb25zdCBzdHJ1Y3Qga2V5X3ZlY3RvciAqdG4pCiB7CiAJcmV0dXJuICgxdWwgPDwgdG4tPmJpdHMpICYgfigxdWwpOwogfQogCi0vKiBjYWxsZXIgbXVzdCBob2xkIFJUTkwgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHRub2RlICp0bm9kZV9nZXRfY2hpbGQoY29uc3Qgc3RydWN0IHRub2RlICp0biwKLQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgaSkKLXsKLQlyZXR1cm4gcnRubF9kZXJlZmVyZW5jZSh0bi0+Y2hpbGRbaV0pOwotfQorI2RlZmluZSBnZXRfY2luZGV4KGtleSwga3YpICgoKGtleSkgXiAoa3YpLT5rZXkpID4+IChrdiktPnBvcykKIAotLyogY2FsbGVyIG11c3QgaG9sZCBSQ1UgcmVhZCBsb2NrIG9yIFJUTkwgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHRub2RlICp0bm9kZV9nZXRfY2hpbGRfcmN1KGNvbnN0IHN0cnVjdCB0bm9kZSAqdG4sCi0JCQkJCQl1bnNpZ25lZCBsb25nIGkpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2luZGV4KHRfa2V5IGtleSwgc3RydWN0IGtleV92ZWN0b3IgKmt2KQogewotCXJldHVybiByY3VfZGVyZWZlcmVuY2VfcnRubCh0bi0+Y2hpbGRbaV0pOworCXVuc2lnbmVkIGxvbmcgaW5kZXggPSBrZXkgXiBrdi0+a2V5OworCisJaWYgKChCSVRTX1BFUl9MT05HIDw9IEtFWUxFTkdUSCkgJiYgKEtFWUxFTkdUSCA9PSBrdi0+cG9zKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaW5kZXggPj4ga3YtPnBvczsKIH0KIAogLyogVG8gdW5kZXJzdGFuZCB0aGlzIHN0dWZmLCBhbiB1bmRlcnN0YW5kaW5nIG9mIGtleXMgYW5kIGFsbCB0aGVpciBiaXRzIGlzCkBAIC0yNzQsMTA2ICsyNzcsMTA0IEBACiB9CiAKICNkZWZpbmUgVE5PREVfS01BTExPQ19NQVggXAotCWlsb2cyKChQQUdFX1NJWkUgLSBzaXplb2Yoc3RydWN0IHRub2RlKSkgLyBzaXplb2Yoc3RydWN0IHRub2RlICopKQorCWlsb2cyKChQQUdFX1NJWkUgLSBUTk9ERV9TSVpFKDApKSAvIHNpemVvZihzdHJ1Y3Qga2V5X3ZlY3RvciAqKSkKKyNkZWZpbmUgVE5PREVfVk1BTExPQ19NQVggXAorCWlsb2cyKChTSVpFX01BWCAtIFROT0RFX1NJWkUoMCkpIC8gc2l6ZW9mKHN0cnVjdCBrZXlfdmVjdG9yICopKQogCiBzdGF0aWMgdm9pZCBfX25vZGVfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQogewogCXN0cnVjdCB0bm9kZSAqbiA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgdG5vZGUsIHJjdSk7CiAKLQlpZiAoSVNfTEVBRihuKSkKKwlpZiAoIW4tPnRuX2JpdHMpCiAJCWttZW1fY2FjaGVfZnJlZSh0cmllX2xlYWZfa21lbSwgbik7Ci0JZWxzZSBpZiAobi0+Yml0cyA8PSBUTk9ERV9LTUFMTE9DX01BWCkKKwllbHNlIGlmIChuLT50bl9iaXRzIDw9IFROT0RFX0tNQUxMT0NfTUFYKQogCQlrZnJlZShuKTsKIAllbHNlCiAJCXZmcmVlKG4pOwogfQogCi0jZGVmaW5lIG5vZGVfZnJlZShuKSBjYWxsX3JjdSgmbi0+cmN1LCBfX25vZGVfZnJlZV9yY3UpCisjZGVmaW5lIG5vZGVfZnJlZShuKSBjYWxsX3JjdSgmdG5faW5mbyhuKS0+cmN1LCBfX25vZGVfZnJlZV9yY3UpCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBmcmVlX2xlYWZfaW5mbyhzdHJ1Y3QgbGVhZl9pbmZvICpsZWFmKQorc3RhdGljIHN0cnVjdCB0bm9kZSAqdG5vZGVfYWxsb2MoaW50IGJpdHMpCiB7Ci0Ja2ZyZWVfcmN1KGxlYWYsIHJjdSk7Ci19CisJc2l6ZV90IHNpemU7CiAKLXN0YXRpYyBzdHJ1Y3QgdG5vZGUgKnRub2RlX2FsbG9jKHNpemVfdCBzaXplKQoteworCS8qIHZlcmlmeSBiaXRzIGlzIHdpdGhpbiBib3VuZHMgKi8KKwlpZiAoYml0cyA+IFROT0RFX1ZNQUxMT0NfTUFYKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGRldGVybWluZSBzaXplIGFuZCB2ZXJpZnkgaXQgaXMgbm9uLXplcm8gYW5kIGRpZG4ndCBvdmVyZmxvdyAqLworCXNpemUgPSBUTk9ERV9TSVpFKDF1bCA8PCBiaXRzKTsKKwogCWlmIChzaXplIDw9IFBBR0VfU0laRSkKIAkJcmV0dXJuIGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJZWxzZQogCQlyZXR1cm4gdnphbGxvYyhzaXplKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGVtcHR5X2NoaWxkX2luYyhzdHJ1Y3QgdG5vZGUgKm4pCitzdGF0aWMgaW5saW5lIHZvaWQgZW1wdHlfY2hpbGRfaW5jKHN0cnVjdCBrZXlfdmVjdG9yICpuKQogewotCSsrbi0+ZW1wdHlfY2hpbGRyZW4gPyA6ICsrbi0+ZnVsbF9jaGlsZHJlbjsKKwkrK3RuX2luZm8obiktPmVtcHR5X2NoaWxkcmVuID8gOiArK3RuX2luZm8obiktPmZ1bGxfY2hpbGRyZW47CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlbXB0eV9jaGlsZF9kZWMoc3RydWN0IHRub2RlICpuKQorc3RhdGljIGlubGluZSB2b2lkIGVtcHR5X2NoaWxkX2RlYyhzdHJ1Y3Qga2V5X3ZlY3RvciAqbikKIHsKLQluLT5lbXB0eV9jaGlsZHJlbi0tID8gOiBuLT5mdWxsX2NoaWxkcmVuLS07CisJdG5faW5mbyhuKS0+ZW1wdHlfY2hpbGRyZW4tLSA/IDogdG5faW5mbyhuKS0+ZnVsbF9jaGlsZHJlbi0tOwogfQogCi1zdGF0aWMgc3RydWN0IHRub2RlICpsZWFmX25ldyh0X2tleSBrZXkpCitzdGF0aWMgc3RydWN0IGtleV92ZWN0b3IgKmxlYWZfbmV3KHRfa2V5IGtleSwgc3RydWN0IGZpYl9hbGlhcyAqZmEpCiB7Ci0Jc3RydWN0IHRub2RlICpsID0ga21lbV9jYWNoZV9hbGxvYyh0cmllX2xlYWZfa21lbSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGwpIHsKLQkJbC0+cGFyZW50ID0gTlVMTDsKLQkJLyogc2V0IGtleSBhbmQgcG9zIHRvIHJlZmxlY3QgZnVsbCBrZXkgdmFsdWUKLQkJICogYW55IHRyYWlsaW5nIHplcm9zIGluIHRoZSBrZXkgc2hvdWxkIGJlIGlnbm9yZWQKLQkJICogYXMgdGhlIG5vZGVzIGFyZSBzZWFyY2hlZAotCQkgKi8KLQkJbC0+a2V5ID0ga2V5OwotCQlsLT5zbGVuID0gMDsKLQkJbC0+cG9zID0gMDsKLQkJLyogc2V0IGJpdHMgdG8gMCBpbmRpY2F0aW5nIHdlIGFyZSBub3QgYSB0bm9kZSAqLwotCQlsLT5iaXRzID0gMDsKKwlzdHJ1Y3QgdG5vZGUgKmt2ID0ga21lbV9jYWNoZV9hbGxvYyh0cmllX2xlYWZfa21lbSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IGtleV92ZWN0b3IgKmwgPSBrdi0+a3Y7CiAKLQkJSU5JVF9ITElTVF9IRUFEKCZsLT5saXN0KTsKLQl9CisJaWYgKCFrdikKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBpbml0aWFsaXplIGtleSB2ZWN0b3IgKi8KKwlsLT5rZXkgPSBrZXk7CisJbC0+cG9zID0gMDsKKwlsLT5iaXRzID0gMDsKKwlsLT5zbGVuID0gZmEtPmZhX3NsZW47CisKKwkvKiBsaW5rIGxlYWYgdG8gZmliIGFsaWFzICovCisJSU5JVF9ITElTVF9IRUFEKCZsLT5sZWFmKTsKKwlobGlzdF9hZGRfaGVhZCgmZmEtPmZhX2xpc3QsICZsLT5sZWFmKTsKKwogCXJldHVybiBsOwogfQogCi1zdGF0aWMgc3RydWN0IGxlYWZfaW5mbyAqbGVhZl9pbmZvX25ldyhpbnQgcGxlbikKK3N0YXRpYyBzdHJ1Y3Qga2V5X3ZlY3RvciAqdG5vZGVfbmV3KHRfa2V5IGtleSwgaW50IHBvcywgaW50IGJpdHMpCiB7Ci0Jc3RydWN0IGxlYWZfaW5mbyAqbGkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbGVhZl9pbmZvKSwgIEdGUF9LRVJORUwpOwotCWlmIChsaSkgewotCQlsaS0+cGxlbiA9IHBsZW47Ci0JCWxpLT5tYXNrX3BsZW4gPSBudG9obChpbmV0X21ha2VfbWFzayhwbGVuKSk7Ci0JCUlOSVRfTElTVF9IRUFEKCZsaS0+ZmFsaCk7Ci0JfQotCXJldHVybiBsaTsKLX0KLQotc3RhdGljIHN0cnVjdCB0bm9kZSAqdG5vZGVfbmV3KHRfa2V5IGtleSwgaW50IHBvcywgaW50IGJpdHMpCi17Ci0Jc2l6ZV90IHN6ID0gb2Zmc2V0b2Yoc3RydWN0IHRub2RlLCBjaGlsZFsxdWwgPDwgYml0c10pOwotCXN0cnVjdCB0bm9kZSAqdG4gPSB0bm9kZV9hbGxvYyhzeik7CisJc3RydWN0IHRub2RlICp0bm9kZSA9IHRub2RlX2FsbG9jKGJpdHMpOwogCXVuc2lnbmVkIGludCBzaGlmdCA9IHBvcyArIGJpdHM7CisJc3RydWN0IGtleV92ZWN0b3IgKnRuID0gdG5vZGUtPmt2OwogCiAJLyogdmVyaWZ5IGJpdHMgYW5kIHBvcyB0aGVpciBtc2IgYml0cyBjbGVhciBhbmQgdmFsdWVzIGFyZSB2YWxpZCAqLwogCUJVR19PTighYml0cyB8fCAoc2hpZnQgPiBLRVlMRU5HVEgpKTsKIAotCWlmICh0bikgewotCQl0bi0+cGFyZW50ID0gTlVMTDsKLQkJdG4tPnNsZW4gPSBwb3M7Ci0JCXRuLT5wb3MgPSBwb3M7Ci0JCXRuLT5iaXRzID0gYml0czsKLQkJdG4tPmtleSA9IChzaGlmdCA8IEtFWUxFTkdUSCkgPyAoa2V5ID4+IHNoaWZ0KSA8PCBzaGlmdCA6IDA7Ci0JCWlmIChiaXRzID09IEtFWUxFTkdUSCkKLQkJCXRuLT5mdWxsX2NoaWxkcmVuID0gMTsKLQkJZWxzZQotCQkJdG4tPmVtcHR5X2NoaWxkcmVuID0gMXVsIDw8IGJpdHM7Ci0JfQorCXByX2RlYnVnKCJBVCAlcCBzPSV6dSAlenVcbiIsIHRub2RlLCBUTk9ERV9TSVpFKDApLAorCQkgc2l6ZW9mKHN0cnVjdCBrZXlfdmVjdG9yICopIDw8IGJpdHMpOwogCi0JcHJfZGVidWcoIkFUICVwIHM9JXp1ICV6dVxuIiwgdG4sIHNpemVvZihzdHJ1Y3QgdG5vZGUpLAotCQkgc2l6ZW9mKHN0cnVjdCB0bm9kZSAqKSA8PCBiaXRzKTsKKwlpZiAoIXRub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChiaXRzID09IEtFWUxFTkdUSCkKKwkJdG5vZGUtPmZ1bGxfY2hpbGRyZW4gPSAxOworCWVsc2UKKwkJdG5vZGUtPmVtcHR5X2NoaWxkcmVuID0gMXVsIDw8IGJpdHM7CisKKwl0bi0+a2V5ID0gKHNoaWZ0IDwgS0VZTEVOR1RIKSA/IChrZXkgPj4gc2hpZnQpIDw8IHNoaWZ0IDogMDsKKwl0bi0+cG9zID0gcG9zOworCXRuLT5iaXRzID0gYml0czsKKwl0bi0+c2xlbiA9IHBvczsKKwogCXJldHVybiB0bjsKIH0KIAogLyogQ2hlY2sgd2hldGhlciBhIHRub2RlICduJyBpcyAiZnVsbCIsIGkuZS4gaXQgaXMgYW4gaW50ZXJuYWwgbm9kZQogICogYW5kIG5vIGJpdHMgYXJlIHNraXBwZWQuIFNlZSBkaXNjdXNzaW9uIGluIGR5bnRyZWUgcGFwZXIgcC4gNgogICovCi1zdGF0aWMgaW5saW5lIGludCB0bm9kZV9mdWxsKGNvbnN0IHN0cnVjdCB0bm9kZSAqdG4sIGNvbnN0IHN0cnVjdCB0bm9kZSAqbikKK3N0YXRpYyBpbmxpbmUgaW50IHRub2RlX2Z1bGwoc3RydWN0IGtleV92ZWN0b3IgKnRuLCBzdHJ1Y3Qga2V5X3ZlY3RvciAqbikKIHsKIAlyZXR1cm4gbiAmJiAoKG4tPnBvcyArIG4tPmJpdHMpID09IHRuLT5wb3MpICYmIElTX1ROT0RFKG4pOwogfQpAQCAtMzgxLDE3ICszODIsMTggQEAKIC8qIEFkZCBhIGNoaWxkIGF0IHBvc2l0aW9uIGkgb3ZlcndyaXRpbmcgdGhlIG9sZCB2YWx1ZS4KICAqIFVwZGF0ZSB0aGUgdmFsdWUgb2YgZnVsbF9jaGlsZHJlbiBhbmQgZW1wdHlfY2hpbGRyZW4uCiAgKi8KLXN0YXRpYyB2b2lkIHB1dF9jaGlsZChzdHJ1Y3QgdG5vZGUgKnRuLCB1bnNpZ25lZCBsb25nIGksIHN0cnVjdCB0bm9kZSAqbikKK3N0YXRpYyB2b2lkIHB1dF9jaGlsZChzdHJ1Y3Qga2V5X3ZlY3RvciAqdG4sIHVuc2lnbmVkIGxvbmcgaSwKKwkJICAgICAgc3RydWN0IGtleV92ZWN0b3IgKm4pCiB7Ci0Jc3RydWN0IHRub2RlICpjaGkgPSB0bm9kZV9nZXRfY2hpbGQodG4sIGkpOworCXN0cnVjdCBrZXlfdmVjdG9yICpjaGkgPSBnZXRfY2hpbGQodG4sIGkpOwogCWludCBpc2Z1bGwsIHdhc2Z1bGw7CiAKLQlCVUdfT04oaSA+PSB0bm9kZV9jaGlsZF9sZW5ndGgodG4pKTsKKwlCVUdfT04oaSA+PSBjaGlsZF9sZW5ndGgodG4pKTsKIAogCS8qIHVwZGF0ZSBlbXB0eUNoaWxkcmVuLCBvdmVyZmxvdyBpbnRvIGZ1bGxDaGlsZHJlbiAqLwotCWlmIChuID09IE5VTEwgJiYgY2hpICE9IE5VTEwpCisJaWYgKCFuICYmIGNoaSkKIAkJZW1wdHlfY2hpbGRfaW5jKHRuKTsKLQlpZiAobiAhPSBOVUxMICYmIGNoaSA9PSBOVUxMKQorCWlmIChuICYmICFjaGkpCiAJCWVtcHR5X2NoaWxkX2RlYyh0bik7CiAKIAkvKiB1cGRhdGUgZnVsbENoaWxkcmVuICovCkBAIC0zOTksMjMgKzQwMSwyMyBAQAogCWlzZnVsbCA9IHRub2RlX2Z1bGwodG4sIG4pOwogCiAJaWYgKHdhc2Z1bGwgJiYgIWlzZnVsbCkKLQkJdG4tPmZ1bGxfY2hpbGRyZW4tLTsKKwkJdG5faW5mbyh0biktPmZ1bGxfY2hpbGRyZW4tLTsKIAllbHNlIGlmICghd2FzZnVsbCAmJiBpc2Z1bGwpCi0JCXRuLT5mdWxsX2NoaWxkcmVuKys7CisJCXRuX2luZm8odG4pLT5mdWxsX2NoaWxkcmVuKys7CiAKIAlpZiAobiAmJiAodG4tPnNsZW4gPCBuLT5zbGVuKSkKIAkJdG4tPnNsZW4gPSBuLT5zbGVuOwogCi0JcmN1X2Fzc2lnbl9wb2ludGVyKHRuLT5jaGlsZFtpXSwgbik7CisJcmN1X2Fzc2lnbl9wb2ludGVyKHRuLT50bm9kZVtpXSwgbik7CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9jaGlsZHJlbihzdHJ1Y3QgdG5vZGUgKnRuKQorc3RhdGljIHZvaWQgdXBkYXRlX2NoaWxkcmVuKHN0cnVjdCBrZXlfdmVjdG9yICp0bikKIHsKIAl1bnNpZ25lZCBsb25nIGk7CiAKIAkvKiB1cGRhdGUgYWxsIG9mIHRoZSBjaGlsZCBwYXJlbnQgcG9pbnRlcnMgKi8KLQlmb3IgKGkgPSB0bm9kZV9jaGlsZF9sZW5ndGgodG4pOyBpOykgewotCQlzdHJ1Y3QgdG5vZGUgKmlub2RlID0gdG5vZGVfZ2V0X2NoaWxkKHRuLCAtLWkpOworCWZvciAoaSA9IGNoaWxkX2xlbmd0aCh0bik7IGk7KSB7CisJCXN0cnVjdCBrZXlfdmVjdG9yICppbm9kZSA9IGdldF9jaGlsZCh0biwgLS1pKTsKIAogCQlpZiAoIWlub2RlKQogCQkJY29udGludWU7CkBAIC00MzEsMzYgKzQzMywzNyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHB1dF9jaGlsZF9yb290KHN0cnVjdCB0bm9kZSAqdHAsIHN0cnVjdCB0cmllICp0LAotCQkJCSAgdF9rZXkga2V5LCBzdHJ1Y3QgdG5vZGUgKm4pCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2NoaWxkX3Jvb3Qoc3RydWN0IGtleV92ZWN0b3IgKnRwLCB0X2tleSBrZXksCisJCQkJICBzdHJ1Y3Qga2V5X3ZlY3RvciAqbikKIHsKLQlpZiAodHApCi0JCXB1dF9jaGlsZCh0cCwgZ2V0X2luZGV4KGtleSwgdHApLCBuKTsKKwlpZiAoSVNfVFJJRSh0cCkpCisJCXJjdV9hc3NpZ25fcG9pbnRlcih0cC0+dG5vZGVbMF0sIG4pOwogCWVsc2UKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKHQtPnRyaWUsIG4pOworCQlwdXRfY2hpbGQodHAsIGdldF9pbmRleChrZXksIHRwKSwgbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0bm9kZV9mcmVlX2luaXQoc3RydWN0IHRub2RlICp0bikKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bm9kZV9mcmVlX2luaXQoc3RydWN0IGtleV92ZWN0b3IgKnRuKQogewotCXRuLT5yY3UubmV4dCA9IE5VTEw7CisJdG5faW5mbyh0biktPnJjdS5uZXh0ID0gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRub2RlX2ZyZWVfYXBwZW5kKHN0cnVjdCB0bm9kZSAqdG4sIHN0cnVjdCB0bm9kZSAqbikKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bm9kZV9mcmVlX2FwcGVuZChzdHJ1Y3Qga2V5X3ZlY3RvciAqdG4sCisJCQkJICAgICBzdHJ1Y3Qga2V5X3ZlY3RvciAqbikKIHsKLQluLT5yY3UubmV4dCA9IHRuLT5yY3UubmV4dDsKLQl0bi0+cmN1Lm5leHQgPSAmbi0+cmN1OworCXRuX2luZm8obiktPnJjdS5uZXh0ID0gdG5faW5mbyh0biktPnJjdS5uZXh0OworCXRuX2luZm8odG4pLT5yY3UubmV4dCA9ICZ0bl9pbmZvKG4pLT5yY3U7CiB9CiAKLXN0YXRpYyB2b2lkIHRub2RlX2ZyZWUoc3RydWN0IHRub2RlICp0bikKK3N0YXRpYyB2b2lkIHRub2RlX2ZyZWUoc3RydWN0IGtleV92ZWN0b3IgKnRuKQogewotCXN0cnVjdCBjYWxsYmFja19oZWFkICpoZWFkID0gJnRuLT5yY3U7CisJc3RydWN0IGNhbGxiYWNrX2hlYWQgKmhlYWQgPSAmdG5faW5mbyh0biktPnJjdTsKIAogCXdoaWxlIChoZWFkKSB7CiAJCWhlYWQgPSBoZWFkLT5uZXh0OwotCQl0bm9kZV9mcmVlX3NpemUgKz0gb2Zmc2V0b2Yoc3RydWN0IHRub2RlLCBjaGlsZFsxIDw8IHRuLT5iaXRzXSk7CisJCXRub2RlX2ZyZWVfc2l6ZSArPSBUTk9ERV9TSVpFKDF1bCA8PCB0bi0+Yml0cyk7CiAJCW5vZGVfZnJlZSh0bik7CiAKLQkJdG4gPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHRub2RlLCByY3UpOworCQl0biA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgdG5vZGUsIHJjdSktPmt2OwogCX0KIAogCWlmICh0bm9kZV9mcmVlX3NpemUgPj0gUEFHRV9TSVpFICogc3luY19wYWdlcykgewpAQCAtNDY5LDE0ICs0NzIsMTYgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHJlcGxhY2Uoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqb2xkdG5vZGUsIHN0cnVjdCB0bm9kZSAqdG4pCitzdGF0aWMgc3RydWN0IGtleV92ZWN0b3IgKnJlcGxhY2Uoc3RydWN0IHRyaWUgKnQsCisJCQkJICBzdHJ1Y3Qga2V5X3ZlY3RvciAqb2xkdG5vZGUsCisJCQkJICBzdHJ1Y3Qga2V5X3ZlY3RvciAqdG4pCiB7Ci0Jc3RydWN0IHRub2RlICp0cCA9IG5vZGVfcGFyZW50KG9sZHRub2RlKTsKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqdHAgPSBub2RlX3BhcmVudChvbGR0bm9kZSk7CiAJdW5zaWduZWQgbG9uZyBpOwogCiAJLyogc2V0dXAgdGhlIHBhcmVudCBwb2ludGVyIG91dCBvZiBhbmQgYmFjayBpbnRvIHRoaXMgbm9kZSAqLwogCU5PREVfSU5JVF9QQVJFTlQodG4sIHRwKTsKLQlwdXRfY2hpbGRfcm9vdCh0cCwgdCwgdG4tPmtleSwgdG4pOworCXB1dF9jaGlsZF9yb290KHRwLCB0bi0+a2V5LCB0bik7CiAKIAkvKiB1cGRhdGUgYWxsIG9mIHRoZSBjaGlsZCBwYXJlbnQgcG9pbnRlcnMgKi8KIAl1cGRhdGVfY2hpbGRyZW4odG4pOwpAQCAtNDg1LDE4ICs0OTAsMjEgQEAKIAl0bm9kZV9mcmVlKG9sZHRub2RlKTsKIAogCS8qIHJlc2l6ZSBjaGlsZHJlbiBub3cgdGhhdCBvbGR0bm9kZSBpcyBmcmVlZCAqLwotCWZvciAoaSA9IHRub2RlX2NoaWxkX2xlbmd0aCh0bik7IGk7KSB7Ci0JCXN0cnVjdCB0bm9kZSAqaW5vZGUgPSB0bm9kZV9nZXRfY2hpbGQodG4sIC0taSk7CisJZm9yIChpID0gY2hpbGRfbGVuZ3RoKHRuKTsgaTspIHsKKwkJc3RydWN0IGtleV92ZWN0b3IgKmlub2RlID0gZ2V0X2NoaWxkKHRuLCAtLWkpOwogCiAJCS8qIHJlc2l6ZSBjaGlsZCBub2RlICovCiAJCWlmICh0bm9kZV9mdWxsKHRuLCBpbm9kZSkpCi0JCQlyZXNpemUodCwgaW5vZGUpOworCQkJdG4gPSByZXNpemUodCwgaW5vZGUpOwogCX0KKworCXJldHVybiB0cDsKIH0KIAotc3RhdGljIGludCBpbmZsYXRlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKm9sZHRub2RlKQorc3RhdGljIHN0cnVjdCBrZXlfdmVjdG9yICppbmZsYXRlKHN0cnVjdCB0cmllICp0LAorCQkJCSAgc3RydWN0IGtleV92ZWN0b3IgKm9sZHRub2RlKQogewotCXN0cnVjdCB0bm9kZSAqdG47CisJc3RydWN0IGtleV92ZWN0b3IgKnRuOwogCXVuc2lnbmVkIGxvbmcgaTsKIAl0X2tleSBtOwogCkBAIC01MDQsNyArNTEyLDcgQEAKIAogCXRuID0gdG5vZGVfbmV3KG9sZHRub2RlLT5rZXksIG9sZHRub2RlLT5wb3MgLSAxLCBvbGR0bm9kZS0+Yml0cyArIDEpOwogCWlmICghdG4pCi0JCXJldHVybiAtRU5PTUVNOworCQlnb3RvIG5vdG5vZGU7CiAKIAkvKiBwcmVwYXJlIG9sZHRub2RlIHRvIGJlIGZyZWVkICovCiAJdG5vZGVfZnJlZV9pbml0KG9sZHRub2RlKTsKQEAgLTUxNCwxMyArNTIyLDEzIEBACiAJICogcG9pbnQgdG8gZXhpc3RpbmcgdG5vZGVzIGFuZCB0aGUgbGlua3MgYmV0d2VlbiBvdXIgYWxsb2NhdGVkCiAJICogbm9kZXMuCiAJICovCi0JZm9yIChpID0gdG5vZGVfY2hpbGRfbGVuZ3RoKG9sZHRub2RlKSwgbSA9IDF1IDw8IHRuLT5wb3M7IGk7KSB7Ci0JCXN0cnVjdCB0bm9kZSAqaW5vZGUgPSB0bm9kZV9nZXRfY2hpbGQob2xkdG5vZGUsIC0taSk7Ci0JCXN0cnVjdCB0bm9kZSAqbm9kZTAsICpub2RlMTsKKwlmb3IgKGkgPSBjaGlsZF9sZW5ndGgob2xkdG5vZGUpLCBtID0gMXUgPDwgdG4tPnBvczsgaTspIHsKKwkJc3RydWN0IGtleV92ZWN0b3IgKmlub2RlID0gZ2V0X2NoaWxkKG9sZHRub2RlLCAtLWkpOworCQlzdHJ1Y3Qga2V5X3ZlY3RvciAqbm9kZTAsICpub2RlMTsKIAkJdW5zaWduZWQgbG9uZyBqLCBrOwogCiAJCS8qIEFuIGVtcHR5IGNoaWxkICovCi0JCWlmIChpbm9kZSA9PSBOVUxMKQorCQlpZiAoIWlub2RlKQogCQkJY29udGludWU7CiAKIAkJLyogQSBsZWFmIG9yIGFuIGludGVybmFsIG5vZGUgd2l0aCBza2lwcGVkIGJpdHMgKi8KQEAgLTUzNCw4ICs1NDIsOCBAQAogCiAJCS8qIEFuIGludGVybmFsIG5vZGUgd2l0aCB0d28gY2hpbGRyZW4gKi8KIAkJaWYgKGlub2RlLT5iaXRzID09IDEpIHsKLQkJCXB1dF9jaGlsZCh0biwgMiAqIGkgKyAxLCB0bm9kZV9nZXRfY2hpbGQoaW5vZGUsIDEpKTsKLQkJCXB1dF9jaGlsZCh0biwgMiAqIGksIHRub2RlX2dldF9jaGlsZChpbm9kZSwgMCkpOworCQkJcHV0X2NoaWxkKHRuLCAyICogaSArIDEsIGdldF9jaGlsZChpbm9kZSwgMSkpOworCQkJcHV0X2NoaWxkKHRuLCAyICogaSwgZ2V0X2NoaWxkKGlub2RlLCAwKSk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC01NjQsMTEgKzU3MiwxMSBAQAogCQl0bm9kZV9mcmVlX2FwcGVuZCh0biwgbm9kZTApOwogCiAJCS8qIHBvcHVsYXRlIGNoaWxkIHBvaW50ZXJzIGluIG5ldyBub2RlcyAqLwotCQlmb3IgKGsgPSB0bm9kZV9jaGlsZF9sZW5ndGgoaW5vZGUpLCBqID0gayAvIDI7IGo7KSB7Ci0JCQlwdXRfY2hpbGQobm9kZTEsIC0taiwgdG5vZGVfZ2V0X2NoaWxkKGlub2RlLCAtLWspKTsKLQkJCXB1dF9jaGlsZChub2RlMCwgaiwgdG5vZGVfZ2V0X2NoaWxkKGlub2RlLCBqKSk7Ci0JCQlwdXRfY2hpbGQobm9kZTEsIC0taiwgdG5vZGVfZ2V0X2NoaWxkKGlub2RlLCAtLWspKTsKLQkJCXB1dF9jaGlsZChub2RlMCwgaiwgdG5vZGVfZ2V0X2NoaWxkKGlub2RlLCBqKSk7CisJCWZvciAoayA9IGNoaWxkX2xlbmd0aChpbm9kZSksIGogPSBrIC8gMjsgajspIHsKKwkJCXB1dF9jaGlsZChub2RlMSwgLS1qLCBnZXRfY2hpbGQoaW5vZGUsIC0taykpOworCQkJcHV0X2NoaWxkKG5vZGUwLCBqLCBnZXRfY2hpbGQoaW5vZGUsIGopKTsKKwkJCXB1dF9jaGlsZChub2RlMSwgLS1qLCBnZXRfY2hpbGQoaW5vZGUsIC0taykpOworCQkJcHV0X2NoaWxkKG5vZGUwLCBqLCBnZXRfY2hpbGQoaW5vZGUsIGopKTsKIAkJfQogCiAJCS8qIGxpbmsgbmV3IG5vZGVzIHRvIHBhcmVudCAqLwpAQCAtNTgxLDI1ICs1ODksMjUgQEAKIAl9CiAKIAkvKiBzZXR1cCB0aGUgcGFyZW50IHBvaW50ZXJzIGludG8gYW5kIG91dCBvZiB0aGlzIG5vZGUgKi8KLQlyZXBsYWNlKHQsIG9sZHRub2RlLCB0bik7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmVwbGFjZSh0LCBvbGR0bm9kZSwgdG4pOwogbm9tZW06CiAJLyogYWxsIHBvaW50ZXJzIHNob3VsZCBiZSBjbGVhbiBzbyB3ZSBhcmUgZG9uZSAqLwogCXRub2RlX2ZyZWUodG4pOwotCXJldHVybiAtRU5PTUVNOworbm90bm9kZToKKwlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBoYWx2ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IHRub2RlICpvbGR0bm9kZSkKK3N0YXRpYyBzdHJ1Y3Qga2V5X3ZlY3RvciAqaGFsdmUoc3RydWN0IHRyaWUgKnQsCisJCQkJc3RydWN0IGtleV92ZWN0b3IgKm9sZHRub2RlKQogewotCXN0cnVjdCB0bm9kZSAqdG47CisJc3RydWN0IGtleV92ZWN0b3IgKnRuOwogCXVuc2lnbmVkIGxvbmcgaTsKIAogCXByX2RlYnVnKCJJbiBoYWx2ZVxuIik7CiAKIAl0biA9IHRub2RlX25ldyhvbGR0bm9kZS0+a2V5LCBvbGR0bm9kZS0+cG9zICsgMSwgb2xkdG5vZGUtPmJpdHMgLSAxKTsKIAlpZiAoIXRuKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJZ290byBub3Rub2RlOwogCiAJLyogcHJlcGFyZSBvbGR0bm9kZSB0byBiZSBmcmVlZCAqLwogCXRub2RlX2ZyZWVfaW5pdChvbGR0bm9kZSk7CkBAIC02MDksMTAgKzYxNywxMCBAQAogCSAqIHBvaW50IHRvIGV4aXN0aW5nIHRub2RlcyBhbmQgdGhlIGxpbmtzIGJldHdlZW4gb3VyIGFsbG9jYXRlZAogCSAqIG5vZGVzLgogCSAqLwotCWZvciAoaSA9IHRub2RlX2NoaWxkX2xlbmd0aChvbGR0bm9kZSk7IGk7KSB7Ci0JCXN0cnVjdCB0bm9kZSAqbm9kZTEgPSB0bm9kZV9nZXRfY2hpbGQob2xkdG5vZGUsIC0taSk7Ci0JCXN0cnVjdCB0bm9kZSAqbm9kZTAgPSB0bm9kZV9nZXRfY2hpbGQob2xkdG5vZGUsIC0taSk7Ci0JCXN0cnVjdCB0bm9kZSAqaW5vZGU7CisJZm9yIChpID0gY2hpbGRfbGVuZ3RoKG9sZHRub2RlKTsgaTspIHsKKwkJc3RydWN0IGtleV92ZWN0b3IgKm5vZGUxID0gZ2V0X2NoaWxkKG9sZHRub2RlLCAtLWkpOworCQlzdHJ1Y3Qga2V5X3ZlY3RvciAqbm9kZTAgPSBnZXRfY2hpbGQob2xkdG5vZGUsIC0taSk7CisJCXN0cnVjdCBrZXlfdmVjdG9yICppbm9kZTsKIAogCQkvKiBBdCBsZWFzdCBvbmUgb2YgdGhlIGNoaWxkcmVuIGlzIGVtcHR5ICovCiAJCWlmICghbm9kZTEgfHwgIW5vZGUwKSB7CkBAIC02MjIsMTAgKzYzMCw4IEBACiAKIAkJLyogVHdvIG5vbmVtcHR5IGNoaWxkcmVuICovCiAJCWlub2RlID0gdG5vZGVfbmV3KG5vZGUwLT5rZXksIG9sZHRub2RlLT5wb3MsIDEpOwotCQlpZiAoIWlub2RlKSB7Ci0JCQl0bm9kZV9mcmVlKHRuKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9CisJCWlmICghaW5vZGUpCisJCQlnb3RvIG5vbWVtOwogCQl0bm9kZV9mcmVlX2FwcGVuZCh0biwgaW5vZGUpOwogCiAJCS8qIGluaXRpYWxpemUgcG9pbnRlcnMgb3V0IG9mIG5vZGUgKi8KQEAgLTYzOCwzMCArNjQ0LDM2IEBACiAJfQogCiAJLyogc2V0dXAgdGhlIHBhcmVudCBwb2ludGVycyBpbnRvIGFuZCBvdXQgb2YgdGhpcyBub2RlICovCi0JcmVwbGFjZSh0LCBvbGR0bm9kZSwgdG4pOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJlcGxhY2UodCwgb2xkdG5vZGUsIHRuKTsKK25vbWVtOgorCS8qIGFsbCBwb2ludGVycyBzaG91bGQgYmUgY2xlYW4gc28gd2UgYXJlIGRvbmUgKi8KKwl0bm9kZV9mcmVlKHRuKTsKK25vdG5vZGU6CisJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbGxhcHNlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKm9sZHRub2RlKQorc3RhdGljIHN0cnVjdCBrZXlfdmVjdG9yICpjb2xsYXBzZShzdHJ1Y3QgdHJpZSAqdCwKKwkJCQkgICBzdHJ1Y3Qga2V5X3ZlY3RvciAqb2xkdG5vZGUpCiB7Ci0Jc3RydWN0IHRub2RlICpuLCAqdHA7CisJc3RydWN0IGtleV92ZWN0b3IgKm4sICp0cDsKIAl1bnNpZ25lZCBsb25nIGk7CiAKIAkvKiBzY2FuIHRoZSB0bm9kZSBsb29raW5nIGZvciB0aGF0IG9uZSBjaGlsZCB0aGF0IG1pZ2h0IHN0aWxsIGV4aXN0ICovCi0JZm9yIChuID0gTlVMTCwgaSA9IHRub2RlX2NoaWxkX2xlbmd0aChvbGR0bm9kZSk7ICFuICYmIGk7KQotCQluID0gdG5vZGVfZ2V0X2NoaWxkKG9sZHRub2RlLCAtLWkpOworCWZvciAobiA9IE5VTEwsIGkgPSBjaGlsZF9sZW5ndGgob2xkdG5vZGUpOyAhbiAmJiBpOykKKwkJbiA9IGdldF9jaGlsZChvbGR0bm9kZSwgLS1pKTsKIAogCS8qIGNvbXByZXNzIG9uZSBsZXZlbCAqLwogCXRwID0gbm9kZV9wYXJlbnQob2xkdG5vZGUpOwotCXB1dF9jaGlsZF9yb290KHRwLCB0LCBvbGR0bm9kZS0+a2V5LCBuKTsKKwlwdXRfY2hpbGRfcm9vdCh0cCwgb2xkdG5vZGUtPmtleSwgbik7CiAJbm9kZV9zZXRfcGFyZW50KG4sIHRwKTsKIAogCS8qIGRyb3AgZGVhZCBub2RlICovCiAJbm9kZV9mcmVlKG9sZHRub2RlKTsKKworCXJldHVybiB0cDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGNoYXIgdXBkYXRlX3N1ZmZpeChzdHJ1Y3QgdG5vZGUgKnRuKQorc3RhdGljIHVuc2lnbmVkIGNoYXIgdXBkYXRlX3N1ZmZpeChzdHJ1Y3Qga2V5X3ZlY3RvciAqdG4pCiB7CiAJdW5zaWduZWQgY2hhciBzbGVuID0gdG4tPnBvczsKIAl1bnNpZ25lZCBsb25nIHN0cmlkZSwgaTsKQEAgLTY3MSw4ICs2ODMsOCBAQAogCSAqIHdoeSB3ZSBzdGFydCB3aXRoIGEgc3RyaWRlIG9mIDIgc2luY2UgYSBzdHJpZGUgb2YgMSB3b3VsZAogCSAqIHJlcHJlc2VudCB0aGUgbm9kZXMgd2l0aCBzdWZmaXggbGVuZ3RoIGVxdWFsIHRvIHRuLT5wb3MKIAkgKi8KLQlmb3IgKGkgPSAwLCBzdHJpZGUgPSAweDJ1bCA7IGkgPCB0bm9kZV9jaGlsZF9sZW5ndGgodG4pOyBpICs9IHN0cmlkZSkgewotCQlzdHJ1Y3QgdG5vZGUgKm4gPSB0bm9kZV9nZXRfY2hpbGQodG4sIGkpOworCWZvciAoaSA9IDAsIHN0cmlkZSA9IDB4MnVsIDsgaSA8IGNoaWxkX2xlbmd0aCh0bik7IGkgKz0gc3RyaWRlKSB7CisJCXN0cnVjdCBrZXlfdmVjdG9yICpuID0gZ2V0X2NoaWxkKHRuLCBpKTsKIAogCQlpZiAoIW4gfHwgKG4tPnNsZW4gPD0gc2xlbikpCiAJCQljb250aW51ZTsKQEAgLTcwNCwxMiArNzE2LDEyIEBACiAgKgogICogJ2hpZ2gnIGluIHRoaXMgaW5zdGFuY2UgaXMgdGhlIHZhcmlhYmxlICdpbmZsYXRlX3RocmVzaG9sZCcuIEl0CiAgKiBpcyBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlLCBzbyB3ZSBtdWx0aXBseSBpdCB3aXRoCi0gKiB0bm9kZV9jaGlsZF9sZW5ndGgoKSBhbmQgaW5zdGVhZCBvZiBtdWx0aXBseWluZyBieSAyIChzaW5jZSB0aGUKKyAqIGNoaWxkX2xlbmd0aCgpIGFuZCBpbnN0ZWFkIG9mIG11bHRpcGx5aW5nIGJ5IDIgKHNpbmNlIHRoZQogICogY2hpbGQgYXJyYXkgd2lsbCBiZSBkb3VibGVkIGJ5IGluZmxhdGUoKSkgYW5kIG11bHRpcGx5aW5nCiAgKiB0aGUgbGVmdC1oYW5kIHNpZGUgYnkgMTAwICh0byBoYW5kbGUgdGhlIHBlcmNlbnRhZ2UgdGhpbmcpIHdlCiAgKiBtdWx0aXBseSB0aGUgbGVmdC1oYW5kIHNpZGUgYnkgNTAuCiAgKgotICogVGhlIGxlZnQtaGFuZCBzaWRlIG1heSBsb29rIGEgYml0IHdlaXJkOiB0bm9kZV9jaGlsZF9sZW5ndGgodG4pCisgKiBUaGUgbGVmdC1oYW5kIHNpZGUgbWF5IGxvb2sgYSBiaXQgd2VpcmQ6IGNoaWxkX2xlbmd0aCh0bikKICAqIC0gdG4tPmVtcHR5X2NoaWxkcmVuIGlzIG9mIGNvdXJzZSB0aGUgbnVtYmVyIG9mIG5vbi1udWxsIGNoaWxkcmVuCiAgKiBpbiB0aGUgY3VycmVudCBub2RlLiB0bi0+ZnVsbF9jaGlsZHJlbiBpcyB0aGUgbnVtYmVyIG9mICJmdWxsIgogICogY2hpbGRyZW4sIHRoYXQgaXMgbm9uLW51bGwgdG5vZGVzIHdpdGggYSBza2lwIHZhbHVlIG9mIDAuCkBAIC03MTksMTAgKzczMSwxMCBAQAogICogQSBjbGVhcmVyIHdheSB0byB3cml0ZSB0aGlzIHdvdWxkIGJlOgogICoKICAqIHRvX2JlX2RvdWJsZWQgPSB0bi0+ZnVsbF9jaGlsZHJlbjsKLSAqIG5vdF90b19iZV9kb3VibGVkID0gdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSAtIHRuLT5lbXB0eV9jaGlsZHJlbiAtCisgKiBub3RfdG9fYmVfZG91YmxlZCA9IGNoaWxkX2xlbmd0aCh0bikgLSB0bi0+ZW1wdHlfY2hpbGRyZW4gLQogICogICAgIHRuLT5mdWxsX2NoaWxkcmVuOwogICoKLSAqIG5ld19jaGlsZF9sZW5ndGggPSB0bm9kZV9jaGlsZF9sZW5ndGgodG4pICogMjsKKyAqIG5ld19jaGlsZF9sZW5ndGggPSBjaGlsZF9sZW5ndGgodG4pICogMjsKICAqCiAgKiBuZXdfZmlsbF9mYWN0b3IgPSAxMDAgKiAobm90X3RvX2JlX2RvdWJsZWQgKyAyKnRvX2JlX2RvdWJsZWQpIC8KICAqICAgICAgbmV3X2NoaWxkX2xlbmd0aDsKQEAgLTczOSw1NyArNzUxLDU3IEBACiAgKiAgICAgIGluZmxhdGVfdGhyZXNob2xkICogbmV3X2NoaWxkX2xlbmd0aAogICoKICAqIGV4cGFuZCBub3RfdG9fYmVfZG91YmxlZCBhbmQgdG9fYmVfZG91YmxlZCwgYW5kIHNob3J0ZW46Ci0gKiAxMDAgKiAodG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSAtIHRuLT5lbXB0eV9jaGlsZHJlbiArCisgKiAxMDAgKiAoY2hpbGRfbGVuZ3RoKHRuKSAtIHRuLT5lbXB0eV9jaGlsZHJlbiArCiAgKiAgICB0bi0+ZnVsbF9jaGlsZHJlbikgPj0gaW5mbGF0ZV90aHJlc2hvbGQgKiBuZXdfY2hpbGRfbGVuZ3RoCiAgKgogICogZXhwYW5kIG5ld19jaGlsZF9sZW5ndGg6Ci0gKiAxMDAgKiAodG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSAtIHRuLT5lbXB0eV9jaGlsZHJlbiArCisgKiAxMDAgKiAoY2hpbGRfbGVuZ3RoKHRuKSAtIHRuLT5lbXB0eV9jaGlsZHJlbiArCiAgKiAgICB0bi0+ZnVsbF9jaGlsZHJlbikgPj0KLSAqICAgICAgaW5mbGF0ZV90aHJlc2hvbGQgKiB0bm9kZV9jaGlsZF9sZW5ndGgodG4pICogMgorICogICAgICBpbmZsYXRlX3RocmVzaG9sZCAqIGNoaWxkX2xlbmd0aCh0bikgKiAyCiAgKgogICogc2hvcnRlbiBhZ2FpbjoKLSAqIDUwICogKHRuLT5mdWxsX2NoaWxkcmVuICsgdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKSAtCisgKiA1MCAqICh0bi0+ZnVsbF9jaGlsZHJlbiArIGNoaWxkX2xlbmd0aCh0bikgLQogICogICAgdG4tPmVtcHR5X2NoaWxkcmVuKSA+PSBpbmZsYXRlX3RocmVzaG9sZCAqCi0gKiAgICB0bm9kZV9jaGlsZF9sZW5ndGgodG4pCisgKiAgICBjaGlsZF9sZW5ndGgodG4pCiAgKgogICovCi1zdGF0aWMgYm9vbCBzaG91bGRfaW5mbGF0ZShjb25zdCBzdHJ1Y3QgdG5vZGUgKnRwLCBjb25zdCBzdHJ1Y3QgdG5vZGUgKnRuKQorc3RhdGljIGlubGluZSBib29sIHNob3VsZF9pbmZsYXRlKHN0cnVjdCBrZXlfdmVjdG9yICp0cCwgc3RydWN0IGtleV92ZWN0b3IgKnRuKQogewotCXVuc2lnbmVkIGxvbmcgdXNlZCA9IHRub2RlX2NoaWxkX2xlbmd0aCh0bik7CisJdW5zaWduZWQgbG9uZyB1c2VkID0gY2hpbGRfbGVuZ3RoKHRuKTsKIAl1bnNpZ25lZCBsb25nIHRocmVzaG9sZCA9IHVzZWQ7CiAKIAkvKiBLZWVwIHJvb3Qgbm9kZSBsYXJnZXIgKi8KLQl0aHJlc2hvbGQgKj0gdHAgPyBpbmZsYXRlX3RocmVzaG9sZCA6IGluZmxhdGVfdGhyZXNob2xkX3Jvb3Q7Ci0JdXNlZCAtPSB0bi0+ZW1wdHlfY2hpbGRyZW47Ci0JdXNlZCArPSB0bi0+ZnVsbF9jaGlsZHJlbjsKKwl0aHJlc2hvbGQgKj0gSVNfVFJJRSh0cCkgPyBpbmZsYXRlX3RocmVzaG9sZF9yb290IDogaW5mbGF0ZV90aHJlc2hvbGQ7CisJdXNlZCAtPSB0bl9pbmZvKHRuKS0+ZW1wdHlfY2hpbGRyZW47CisJdXNlZCArPSB0bl9pbmZvKHRuKS0+ZnVsbF9jaGlsZHJlbjsKIAogCS8qIGlmIGJpdHMgPT0gS0VZTEVOR1RIIHRoZW4gcG9zID0gMCwgYW5kIHdpbGwgZmFpbCBiZWxvdyAqLwogCiAJcmV0dXJuICh1c2VkID4gMSkgJiYgdG4tPnBvcyAmJiAoKDUwICogdXNlZCkgPj0gdGhyZXNob2xkKTsKIH0KIAotc3RhdGljIGJvb2wgc2hvdWxkX2hhbHZlKGNvbnN0IHN0cnVjdCB0bm9kZSAqdHAsIGNvbnN0IHN0cnVjdCB0bm9kZSAqdG4pCitzdGF0aWMgaW5saW5lIGJvb2wgc2hvdWxkX2hhbHZlKHN0cnVjdCBrZXlfdmVjdG9yICp0cCwgc3RydWN0IGtleV92ZWN0b3IgKnRuKQogewotCXVuc2lnbmVkIGxvbmcgdXNlZCA9IHRub2RlX2NoaWxkX2xlbmd0aCh0bik7CisJdW5zaWduZWQgbG9uZyB1c2VkID0gY2hpbGRfbGVuZ3RoKHRuKTsKIAl1bnNpZ25lZCBsb25nIHRocmVzaG9sZCA9IHVzZWQ7CiAKIAkvKiBLZWVwIHJvb3Qgbm9kZSBsYXJnZXIgKi8KLQl0aHJlc2hvbGQgKj0gdHAgPyBoYWx2ZV90aHJlc2hvbGQgOiBoYWx2ZV90aHJlc2hvbGRfcm9vdDsKLQl1c2VkIC09IHRuLT5lbXB0eV9jaGlsZHJlbjsKKwl0aHJlc2hvbGQgKj0gSVNfVFJJRSh0cCkgPyBoYWx2ZV90aHJlc2hvbGRfcm9vdCA6IGhhbHZlX3RocmVzaG9sZDsKKwl1c2VkIC09IHRuX2luZm8odG4pLT5lbXB0eV9jaGlsZHJlbjsKIAogCS8qIGlmIGJpdHMgPT0gS0VZTEVOR1RIIHRoZW4gdXNlZCA9IDEwMCUgb24gd3JhcCwgYW5kIHdpbGwgZmFpbCBiZWxvdyAqLwogCiAJcmV0dXJuICh1c2VkID4gMSkgJiYgKHRuLT5iaXRzID4gMSkgJiYgKCgxMDAgKiB1c2VkKSA8IHRocmVzaG9sZCk7CiB9CiAKLXN0YXRpYyBib29sIHNob3VsZF9jb2xsYXBzZShjb25zdCBzdHJ1Y3QgdG5vZGUgKnRuKQorc3RhdGljIGlubGluZSBib29sIHNob3VsZF9jb2xsYXBzZShzdHJ1Y3Qga2V5X3ZlY3RvciAqdG4pCiB7Ci0JdW5zaWduZWQgbG9uZyB1c2VkID0gdG5vZGVfY2hpbGRfbGVuZ3RoKHRuKTsKKwl1bnNpZ25lZCBsb25nIHVzZWQgPSBjaGlsZF9sZW5ndGgodG4pOwogCi0JdXNlZCAtPSB0bi0+ZW1wdHlfY2hpbGRyZW47CisJdXNlZCAtPSB0bl9pbmZvKHRuKS0+ZW1wdHlfY2hpbGRyZW47CiAKIAkvKiBhY2NvdW50IGZvciBiaXRzID09IEtFWUxFTkdUSCBjYXNlICovCi0JaWYgKCh0bi0+Yml0cyA9PSBLRVlMRU5HVEgpICYmIHRuLT5mdWxsX2NoaWxkcmVuKQorCWlmICgodG4tPmJpdHMgPT0gS0VZTEVOR1RIKSAmJiB0bl9pbmZvKHRuKS0+ZnVsbF9jaGlsZHJlbikKIAkJdXNlZCAtPSBLRVlfTUFYOwogCiAJLyogT25lIGNoaWxkIG9yIG5vbmUsIHRpbWUgdG8gZHJvcCB1cyBmcm9tIHRoZSB0cmllICovCkBAIC03OTcsMTAgKzgwOSwxMyBAQAogfQogCiAjZGVmaW5lIE1BWF9XT1JLIDEwCi1zdGF0aWMgdm9pZCByZXNpemUoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqdG4pCitzdGF0aWMgc3RydWN0IGtleV92ZWN0b3IgKnJlc2l6ZShzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IGtleV92ZWN0b3IgKnRuKQogewotCXN0cnVjdCB0bm9kZSAqdHAgPSBub2RlX3BhcmVudCh0bik7Ci0Jc3RydWN0IHRub2RlIF9fcmN1ICoqY3B0cjsKKyNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMKKwlzdHJ1Y3QgdHJpZV91c2Vfc3RhdHMgX19wZXJjcHUgKnN0YXRzID0gdC0+c3RhdHM7CisjZW5kaWYKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqdHAgPSBub2RlX3BhcmVudCh0bik7CisJdW5zaWduZWQgbG9uZyBjaW5kZXggPSBnZXRfaW5kZXgodG4tPmtleSwgdHApOwogCWludCBtYXhfd29yayA9IE1BWF9XT1JLOwogCiAJcHJfZGVidWcoIkluIHRub2RlX3Jlc2l6ZSAlcCBpbmZsYXRlX3RocmVzaG9sZD0lZCB0aHJlc2hvbGQ9JWRcbiIsCkBAIC04MTAsMTgzICs4MjUsMTI4IEBACiAJICogZG9pbmcgaXQgb3Vyc2VsdmVzLiAgVGhpcyB3YXkgd2UgY2FuIGxldCBSQ1UgZnVsbHkgZG8gaXRzCiAJICogdGhpbmcgd2l0aG91dCB1cyBpbnRlcmZlcmluZwogCSAqLwotCWNwdHIgPSB0cCA/ICZ0cC0+Y2hpbGRbZ2V0X2luZGV4KHRuLT5rZXksIHRwKV0gOiAmdC0+dHJpZTsKLQlCVUdfT04odG4gIT0gcnRubF9kZXJlZmVyZW5jZSgqY3B0cikpOworCUJVR19PTih0biAhPSBnZXRfY2hpbGQodHAsIGNpbmRleCkpOwogCiAJLyogRG91YmxlIGFzIGxvbmcgYXMgdGhlIHJlc3VsdGluZyBub2RlIGhhcyBhIG51bWJlciBvZgogCSAqIG5vbmVtcHR5IG5vZGVzIHRoYXQgYXJlIGFib3ZlIHRoZSB0aHJlc2hvbGQuCiAJICovCiAJd2hpbGUgKHNob3VsZF9pbmZsYXRlKHRwLCB0bikgJiYgbWF4X3dvcmspIHsKLQkJaWYgKGluZmxhdGUodCwgdG4pKSB7CisJCXRwID0gaW5mbGF0ZSh0LCB0bik7CisJCWlmICghdHApIHsKICNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMKLQkJCXRoaXNfY3B1X2luYyh0LT5zdGF0cy0+cmVzaXplX25vZGVfc2tpcHBlZCk7CisJCQl0aGlzX2NwdV9pbmMoc3RhdHMtPnJlc2l6ZV9ub2RlX3NraXBwZWQpOwogI2VuZGlmCiAJCQlicmVhazsKIAkJfQogCiAJCW1heF93b3JrLS07Ci0JCXRuID0gcnRubF9kZXJlZmVyZW5jZSgqY3B0cik7CisJCXRuID0gZ2V0X2NoaWxkKHRwLCBjaW5kZXgpOwogCX0KIAorCS8qIHVwZGF0ZSBwYXJlbnQgaW4gY2FzZSBpbmZsYXRlIGZhaWxlZCAqLworCXRwID0gbm9kZV9wYXJlbnQodG4pOworCiAJLyogUmV0dXJuIGlmIGF0IGxlYXN0IG9uZSBpbmZsYXRlIGlzIHJ1biAqLwogCWlmIChtYXhfd29yayAhPSBNQVhfV09SSykKLQkJcmV0dXJuOworCQlyZXR1cm4gdHA7CiAKIAkvKiBIYWx2ZSBhcyBsb25nIGFzIHRoZSBudW1iZXIgb2YgZW1wdHkgY2hpbGRyZW4gaW4gdGhpcwogCSAqIG5vZGUgaXMgYWJvdmUgdGhyZXNob2xkLgogCSAqLwogCXdoaWxlIChzaG91bGRfaGFsdmUodHAsIHRuKSAmJiBtYXhfd29yaykgewotCQlpZiAoaGFsdmUodCwgdG4pKSB7CisJCXRwID0gaGFsdmUodCwgdG4pOworCQlpZiAoIXRwKSB7CiAjaWZkZWYgQ09ORklHX0lQX0ZJQl9UUklFX1NUQVRTCi0JCQl0aGlzX2NwdV9pbmModC0+c3RhdHMtPnJlc2l6ZV9ub2RlX3NraXBwZWQpOworCQkJdGhpc19jcHVfaW5jKHN0YXRzLT5yZXNpemVfbm9kZV9za2lwcGVkKTsKICNlbmRpZgogCQkJYnJlYWs7CiAJCX0KIAogCQltYXhfd29yay0tOwotCQl0biA9IHJ0bmxfZGVyZWZlcmVuY2UoKmNwdHIpOworCQl0biA9IGdldF9jaGlsZCh0cCwgY2luZGV4KTsKIAl9CiAKIAkvKiBPbmx5IG9uZSBjaGlsZCByZW1haW5zICovCi0JaWYgKHNob3VsZF9jb2xsYXBzZSh0bikpIHsKLQkJY29sbGFwc2UodCwgdG4pOwotCQlyZXR1cm47Ci0JfQorCWlmIChzaG91bGRfY29sbGFwc2UodG4pKQorCQlyZXR1cm4gY29sbGFwc2UodCwgdG4pOworCisJLyogdXBkYXRlIHBhcmVudCBpbiBjYXNlIGhhbHZlIGZhaWxlZCAqLworCXRwID0gbm9kZV9wYXJlbnQodG4pOwogCiAJLyogUmV0dXJuIGlmIGF0IGxlYXN0IG9uZSBkZWZsYXRlIHdhcyBydW4gKi8KIAlpZiAobWF4X3dvcmsgIT0gTUFYX1dPUkspCi0JCXJldHVybjsKKwkJcmV0dXJuIHRwOwogCiAJLyogcHVzaCB0aGUgc3VmZml4IGxlbmd0aCB0byB0aGUgcGFyZW50IG5vZGUgKi8KIAlpZiAodG4tPnNsZW4gPiB0bi0+cG9zKSB7CiAJCXVuc2lnbmVkIGNoYXIgc2xlbiA9IHVwZGF0ZV9zdWZmaXgodG4pOwogCi0JCWlmICh0cCAmJiAoc2xlbiA+IHRwLT5zbGVuKSkKKwkJaWYgKHNsZW4gPiB0cC0+c2xlbikKIAkJCXRwLT5zbGVuID0gc2xlbjsKIAl9CisKKwlyZXR1cm4gdHA7CiB9CiAKLS8qIHJlYWRzaWRlIG11c3QgdXNlIHJjdV9yZWFkX2xvY2sgY3VycmVudGx5IGR1bXAgcm91dGluZXMKLSB2aWEgZ2V0X2ZhX2hlYWQgYW5kIGR1bXAgKi8KLQotc3RhdGljIHN0cnVjdCBsZWFmX2luZm8gKmZpbmRfbGVhZl9pbmZvKHN0cnVjdCB0bm9kZSAqbCwgaW50IHBsZW4pCitzdGF0aWMgdm9pZCBsZWFmX3B1bGxfc3VmZml4KHN0cnVjdCBrZXlfdmVjdG9yICp0cCwgc3RydWN0IGtleV92ZWN0b3IgKmwpCiB7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSAmbC0+bGlzdDsKLQlzdHJ1Y3QgbGVhZl9pbmZvICpsaTsKLQotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShsaSwgaGVhZCwgaGxpc3QpCi0JCWlmIChsaS0+cGxlbiA9PSBwbGVuKQotCQkJcmV0dXJuIGxpOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGxpc3RfaGVhZCAqZ2V0X2ZhX2hlYWQoc3RydWN0IHRub2RlICpsLCBpbnQgcGxlbikKLXsKLQlzdHJ1Y3QgbGVhZl9pbmZvICpsaSA9IGZpbmRfbGVhZl9pbmZvKGwsIHBsZW4pOwotCi0JaWYgKCFsaSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gJmxpLT5mYWxoOwotfQotCi1zdGF0aWMgdm9pZCBsZWFmX3B1bGxfc3VmZml4KHN0cnVjdCB0bm9kZSAqbCkKLXsKLQlzdHJ1Y3QgdG5vZGUgKnRwID0gbm9kZV9wYXJlbnQobCk7Ci0KLQl3aGlsZSAodHAgJiYgKHRwLT5zbGVuID4gdHAtPnBvcykgJiYgKHRwLT5zbGVuID4gbC0+c2xlbikpIHsKKwl3aGlsZSAoKHRwLT5zbGVuID4gdHAtPnBvcykgJiYgKHRwLT5zbGVuID4gbC0+c2xlbikpIHsKIAkJaWYgKHVwZGF0ZV9zdWZmaXgodHApID4gbC0+c2xlbikKIAkJCWJyZWFrOwogCQl0cCA9IG5vZGVfcGFyZW50KHRwKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGxlYWZfcHVzaF9zdWZmaXgoc3RydWN0IHRub2RlICpsKQorc3RhdGljIHZvaWQgbGVhZl9wdXNoX3N1ZmZpeChzdHJ1Y3Qga2V5X3ZlY3RvciAqdG4sIHN0cnVjdCBrZXlfdmVjdG9yICpsKQogewotCXN0cnVjdCB0bm9kZSAqdG4gPSBub2RlX3BhcmVudChsKTsKLQogCS8qIGlmIHRoaXMgaXMgYSBuZXcgbGVhZiB0aGVuIHRuIHdpbGwgYmUgTlVMTCBhbmQgd2UgY2FuIHNvcnQKIAkgKiBvdXQgcGFyZW50IHN1ZmZpeCBsZW5ndGhzIGFzIGEgcGFydCBvZiB0cmllX3JlYmFsYW5jZQogCSAqLwotCXdoaWxlICh0biAmJiAodG4tPnNsZW4gPCBsLT5zbGVuKSkgeworCXdoaWxlICh0bi0+c2xlbiA8IGwtPnNsZW4pIHsKIAkJdG4tPnNsZW4gPSBsLT5zbGVuOwogCQl0biA9IG5vZGVfcGFyZW50KHRuKTsKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHJlbW92ZV9sZWFmX2luZm8oc3RydWN0IHRub2RlICpsLCBzdHJ1Y3QgbGVhZl9pbmZvICpvbGQpCi17Ci0JLyogcmVjb3JkIHRoZSBsb2NhdGlvbiBvZiB0aGUgcHJldmlvdXMgbGlzdF9pbmZvIGVudHJ5ICovCi0Jc3RydWN0IGhsaXN0X25vZGUgKipwcHJldiA9IG9sZC0+aGxpc3QucHByZXY7Ci0Jc3RydWN0IGxlYWZfaW5mbyAqbGkgPSBobGlzdF9lbnRyeShwcHJldiwgdHlwZW9mKCpsaSksIGhsaXN0Lm5leHQpOwotCi0JLyogcmVtb3ZlIHRoZSBsZWFmIGluZm8gZnJvbSB0aGUgbGlzdCAqLwotCWhsaXN0X2RlbF9yY3UoJm9sZC0+aGxpc3QpOwotCi0JLyogb25seSBhY2Nlc3MgbGkgaWYgaXQgaXMgcG9pbnRpbmcgYXQgdGhlIGxhc3QgdmFsaWQgaGxpc3Rfbm9kZSAqLwotCWlmIChobGlzdF9lbXB0eSgmbC0+bGlzdCkgfHwgKCpwcHJldikpCi0JCXJldHVybjsKLQotCS8qIHVwZGF0ZSB0aGUgdHJpZSB3aXRoIHRoZSBsYXRlc3Qgc3VmZml4IGxlbmd0aCAqLwotCWwtPnNsZW4gPSBLRVlMRU5HVEggLSBsaS0+cGxlbjsKLQlsZWFmX3B1bGxfc3VmZml4KGwpOwotfQotCi1zdGF0aWMgdm9pZCBpbnNlcnRfbGVhZl9pbmZvKHN0cnVjdCB0bm9kZSAqbCwgc3RydWN0IGxlYWZfaW5mbyAqbmV3KQotewotCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gJmwtPmxpc3Q7Ci0Jc3RydWN0IGxlYWZfaW5mbyAqbGkgPSBOVUxMLCAqbGFzdCA9IE5VTEw7Ci0KLQlpZiAoaGxpc3RfZW1wdHkoaGVhZCkpIHsKLQkJaGxpc3RfYWRkX2hlYWRfcmN1KCZuZXctPmhsaXN0LCBoZWFkKTsKLQl9IGVsc2UgewotCQlobGlzdF9mb3JfZWFjaF9lbnRyeShsaSwgaGVhZCwgaGxpc3QpIHsKLQkJCWlmIChuZXctPnBsZW4gPiBsaS0+cGxlbikKLQkJCQlicmVhazsKLQotCQkJbGFzdCA9IGxpOwotCQl9Ci0JCWlmIChsYXN0KQotCQkJaGxpc3RfYWRkX2JlaGluZF9yY3UoJm5ldy0+aGxpc3QsICZsYXN0LT5obGlzdCk7Ci0JCWVsc2UKLQkJCWhsaXN0X2FkZF9iZWZvcmVfcmN1KCZuZXctPmhsaXN0LCAmbGktPmhsaXN0KTsKLQl9Ci0KLQkvKiBpZiB3ZSBhZGRlZCB0byB0aGUgdGFpbCBub2RlIHRoZW4gd2UgbmVlZCB0byB1cGRhdGUgc2xlbiAqLwotCWlmIChsLT5zbGVuIDwgKEtFWUxFTkdUSCAtIG5ldy0+cGxlbikpIHsKLQkJbC0+c2xlbiA9IEtFWUxFTkdUSCAtIG5ldy0+cGxlbjsKLQkJbGVhZl9wdXNoX3N1ZmZpeChsKTsKLQl9Ci19Ci0KIC8qIHJjdV9yZWFkX2xvY2sgbmVlZHMgdG8gYmUgaG9sZCBieSBjYWxsZXIgZnJvbSByZWFkc2lkZSAqLwotc3RhdGljIHN0cnVjdCB0bm9kZSAqZmliX2ZpbmRfbm9kZShzdHJ1Y3QgdHJpZSAqdCwgdTMyIGtleSkKK3N0YXRpYyBzdHJ1Y3Qga2V5X3ZlY3RvciAqZmliX2ZpbmRfbm9kZShzdHJ1Y3QgdHJpZSAqdCwKKwkJCQkJc3RydWN0IGtleV92ZWN0b3IgKip0cCwgdTMyIGtleSkKIHsKLQlzdHJ1Y3QgdG5vZGUgKm4gPSByY3VfZGVyZWZlcmVuY2VfcnRubCh0LT50cmllKTsKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqcG4sICpuID0gdC0+a3Y7CisJdW5zaWduZWQgbG9uZyBpbmRleCA9IDA7CiAKLQl3aGlsZSAobikgewotCQl1bnNpZ25lZCBsb25nIGluZGV4ID0gZ2V0X2luZGV4KGtleSwgbik7CisJZG8geworCQlwbiA9IG47CisJCW4gPSBnZXRfY2hpbGRfcmN1KG4sIGluZGV4KTsKKworCQlpZiAoIW4pCisJCQlicmVhazsKKworCQlpbmRleCA9IGdldF9jaW5kZXgoa2V5LCBuKTsKIAogCQkvKiBUaGlzIGJpdCBvZiBjb2RlIGlzIGEgYml0IHRyaWNreSBidXQgaXQgY29tYmluZXMgbXVsdGlwbGUKIAkJICogY2hlY2tzIGludG8gYSBzaW5nbGUgY2hlY2suICBUaGUgcHJlZml4IGNvbnNpc3RzIG9mIHRoZQogCQkgKiBwcmVmaXggcGx1cyB6ZXJvcyBmb3IgdGhlIGJpdHMgaW4gdGhlIGNpbmRleC4gVGhlIGluZGV4CiAJCSAqIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGtleSBhbmQgdGhpcyB2YWx1ZS4gIEZyb20KIAkJICogdGhpcyB3ZSBjYW4gYWN0dWFsbHkgZGVyaXZlIHNldmVyYWwgcGllY2VzIG9mIGRhdGEuCi0JCSAqICAgaWYgKGluZGV4ICYgKH4wdWwgPDwgYml0cykpCisJCSAqICAgaWYgKGluZGV4ID49ICgxdWwgPDwgYml0cykpCiAJCSAqICAgICB3ZSBoYXZlIGEgbWlzbWF0Y2ggaW4gc2tpcCBiaXRzIGFuZCBmYWlsZWQKIAkJICogICBlbHNlCiAJCSAqICAgICB3ZSBrbm93IHRoZSB2YWx1ZSBpcyBjaW5kZXgKKwkJICoKKwkJICogVGhpcyBjaGVjayBpcyBzYWZlIGV2ZW4gaWYgYml0cyA9PSBLRVlMRU5HVEggZHVlIHRvIHRoZQorCQkgKiBmYWN0IHRoYXQgd2UgY2FuIG9ubHkgYWxsb2NhdGUgYSBub2RlIHdpdGggMzIgYml0cyBpZiBhCisJCSAqIGxvbmcgaXMgZ3JlYXRlciB0aGFuIDMyIGJpdHMuCiAJCSAqLwotCQlpZiAoaW5kZXggJiAofjB1bCA8PCBuLT5iaXRzKSkKLQkJCXJldHVybiBOVUxMOwotCi0JCS8qIHdlIGhhdmUgZm91bmQgYSBsZWFmLiBQcmVmaXhlcyBoYXZlIGFscmVhZHkgYmVlbiBjb21wYXJlZCAqLwotCQlpZiAoSVNfTEVBRihuKSkKKwkJaWYgKGluZGV4ID49ICgxdWwgPDwgbi0+Yml0cykpIHsKKwkJCW4gPSBOVUxMOwogCQkJYnJlYWs7CisJCX0KIAotCQluID0gdG5vZGVfZ2V0X2NoaWxkX3JjdShuLCBpbmRleCk7Ci0JfQorCQkvKiBrZWVwIHNlYXJjaGluZyB1bnRpbCB3ZSBmaW5kIGEgcGVyZmVjdCBtYXRjaCBsZWFmIG9yIE5VTEwgKi8KKwl9IHdoaWxlIChJU19UTk9ERShuKSk7CisKKwkqdHAgPSBwbjsKIAogCXJldHVybiBuOwogfQpAQCAtOTk0LDE0ICs5NTQsMjMgQEAKIC8qIFJldHVybiB0aGUgZmlyc3QgZmliIGFsaWFzIG1hdGNoaW5nIFRPUyB3aXRoCiAgKiBwcmlvcml0eSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gUFJJTy4KICAqLwotc3RhdGljIHN0cnVjdCBmaWJfYWxpYXMgKmZpYl9maW5kX2FsaWFzKHN0cnVjdCBsaXN0X2hlYWQgKmZhaCwgdTggdG9zLCB1MzIgcHJpbykKK3N0YXRpYyBzdHJ1Y3QgZmliX2FsaWFzICpmaWJfZmluZF9hbGlhcyhzdHJ1Y3QgaGxpc3RfaGVhZCAqZmFoLCB1OCBzbGVuLAorCQkJCQl1OCB0b3MsIHUzMiBwcmlvLCB1MzIgdGJfaWQpCiB7CiAJc3RydWN0IGZpYl9hbGlhcyAqZmE7CiAKIAlpZiAoIWZhaCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZhLCBmYWgsIGZhX2xpc3QpIHsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShmYSwgZmFoLCBmYV9saXN0KSB7CisJCWlmIChmYS0+ZmFfc2xlbiA8IHNsZW4pCisJCQljb250aW51ZTsKKwkJaWYgKGZhLT5mYV9zbGVuICE9IHNsZW4pCisJCQlicmVhazsKKwkJaWYgKGZhLT50Yl9pZCA+IHRiX2lkKQorCQkJY29udGludWU7CisJCWlmIChmYS0+dGJfaWQgIT0gdGJfaWQpCisJCQlicmVhazsKIAkJaWYgKGZhLT5mYV90b3MgPiB0b3MpCiAJCQljb250aW51ZTsKIAkJaWYgKGZhLT5mYV9pbmZvLT5maWJfcHJpb3JpdHkgPj0gcHJpbyB8fCBmYS0+ZmFfdG9zIDwgdG9zKQpAQCAtMTAxMSw3NyArOTgwLDIzIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHRyaWVfcmViYWxhbmNlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3QgdG5vZGUgKnRuKQorc3RhdGljIHZvaWQgdHJpZV9yZWJhbGFuY2Uoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCBrZXlfdmVjdG9yICp0bikKIHsKLQlzdHJ1Y3QgdG5vZGUgKnRwOwotCi0Jd2hpbGUgKCh0cCA9IG5vZGVfcGFyZW50KHRuKSkgIT0gTlVMTCkgewotCQlyZXNpemUodCwgdG4pOwotCQl0biA9IHRwOwotCX0KLQotCS8qIEhhbmRsZSBsYXN0ICh0b3ApIHRub2RlICovCi0JaWYgKElTX1ROT0RFKHRuKSkKLQkJcmVzaXplKHQsIHRuKTsKKwl3aGlsZSAoIUlTX1RSSUUodG4pKQorCQl0biA9IHJlc2l6ZSh0LCB0bik7CiB9CiAKLS8qIG9ubHkgdXNlZCBmcm9tIHVwZGF0ZXItc2lkZSAqLwotCi1zdGF0aWMgc3RydWN0IGxpc3RfaGVhZCAqZmliX2luc2VydF9ub2RlKHN0cnVjdCB0cmllICp0LCB1MzIga2V5LCBpbnQgcGxlbikKK3N0YXRpYyBpbnQgZmliX2luc2VydF9ub2RlKHN0cnVjdCB0cmllICp0LCBzdHJ1Y3Qga2V5X3ZlY3RvciAqdHAsCisJCQkgICBzdHJ1Y3QgZmliX2FsaWFzICpuZXcsIHRfa2V5IGtleSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpmYV9oZWFkID0gTlVMTDsKLQlzdHJ1Y3QgdG5vZGUgKmwsICpuLCAqdHAgPSBOVUxMOwotCXN0cnVjdCBsZWFmX2luZm8gKmxpOworCXN0cnVjdCBrZXlfdmVjdG9yICpuLCAqbDsKIAotCWxpID0gbGVhZl9pbmZvX25ldyhwbGVuKTsKLQlpZiAoIWxpKQotCQlyZXR1cm4gTlVMTDsKLQlmYV9oZWFkID0gJmxpLT5mYWxoOworCWwgPSBsZWFmX25ldyhrZXksIG5ldyk7CisJaWYgKCFsKQorCQlnb3RvIG5vbGVhZjsKIAotCW4gPSBydG5sX2RlcmVmZXJlbmNlKHQtPnRyaWUpOwotCi0JLyogSWYgd2UgcG9pbnQgdG8gTlVMTCwgc3RvcC4gRWl0aGVyIHRoZSB0cmVlIGlzIGVtcHR5IGFuZCB3ZSBzaG91bGQKLQkgKiBqdXN0IHB1dCBhIG5ldyBsZWFmIGluIGlmLCBvciB3ZSBoYXZlIHJlYWNoZWQgYW4gZW1wdHkgY2hpbGQgc2xvdCwKLQkgKiBhbmQgd2Ugc2hvdWxkIGp1c3QgcHV0IG91ciBuZXcgbGVhZiBpbiB0aGF0LgotCSAqCi0JICogSWYgd2UgaGl0IGEgbm9kZSB3aXRoIGEga2V5IHRoYXQgZG9lcyd0IG1hdGNoIHRoZW4gd2Ugc2hvdWxkIHN0b3AKLQkgKiBhbmQgY3JlYXRlIGEgbmV3IHRub2RlIHRvIHJlcGxhY2UgdGhhdCBub2RlIGFuZCBpbnNlcnQgb3Vyc2VsdmVzCi0JICogYW5kIHRoZSBvdGhlciBub2RlIGludG8gdGhlIG5ldyB0bm9kZS4KLQkgKi8KLQl3aGlsZSAobikgewotCQl1bnNpZ25lZCBsb25nIGluZGV4ID0gZ2V0X2luZGV4KGtleSwgbik7Ci0KLQkJLyogVGhpcyBiaXQgb2YgY29kZSBpcyBhIGJpdCB0cmlja3kgYnV0IGl0IGNvbWJpbmVzIG11bHRpcGxlCi0JCSAqIGNoZWNrcyBpbnRvIGEgc2luZ2xlIGNoZWNrLiAgVGhlIHByZWZpeCBjb25zaXN0cyBvZiB0aGUKLQkJICogcHJlZml4IHBsdXMgemVyb3MgZm9yIHRoZSAiYml0cyIgaW4gdGhlIHByZWZpeC4gVGhlIGluZGV4Ci0JCSAqIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGtleSBhbmQgdGhpcyB2YWx1ZS4gIEZyb20KLQkJICogdGhpcyB3ZSBjYW4gYWN0dWFsbHkgZGVyaXZlIHNldmVyYWwgcGllY2VzIG9mIGRhdGEuCi0JCSAqICAgaWYgIShpbmRleCA+PiBiaXRzKQotCQkgKiAgICAgd2Uga25vdyB0aGUgdmFsdWUgaXMgY2hpbGQgaW5kZXgKLQkJICogICBlbHNlCi0JCSAqICAgICB3ZSBoYXZlIGEgbWlzbWF0Y2ggaW4gc2tpcCBiaXRzIGFuZCBmYWlsZWQKLQkJICovCi0JCWlmIChpbmRleCA+PiBuLT5iaXRzKQotCQkJYnJlYWs7Ci0KLQkJLyogd2UgaGF2ZSBmb3VuZCBhIGxlYWYuIFByZWZpeGVzIGhhdmUgYWxyZWFkeSBiZWVuIGNvbXBhcmVkICovCi0JCWlmIChJU19MRUFGKG4pKSB7Ci0JCQkvKiBDYXNlIDE6IG4gaXMgYSBsZWFmLCBhbmQgcHJlZml4ZXMgbWF0Y2gqLwotCQkJaW5zZXJ0X2xlYWZfaW5mbyhuLCBsaSk7Ci0JCQlyZXR1cm4gZmFfaGVhZDsKLQkJfQotCi0JCXRwID0gbjsKLQkJbiA9IHRub2RlX2dldF9jaGlsZF9yY3UobiwgaW5kZXgpOwotCX0KLQotCWwgPSBsZWFmX25ldyhrZXkpOwotCWlmICghbCkgewotCQlmcmVlX2xlYWZfaW5mbyhsaSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWluc2VydF9sZWFmX2luZm8obCwgbGkpOworCS8qIHJldHJpZXZlIGNoaWxkIGZyb20gcGFyZW50IG5vZGUgKi8KKwluID0gZ2V0X2NoaWxkKHRwLCBnZXRfaW5kZXgoa2V5LCB0cCkpOwogCiAJLyogQ2FzZSAyOiBuIGlzIGEgTEVBRiBvciBhIFROT0RFIGFuZCB0aGUga2V5IGRvZXNuJ3QgbWF0Y2guCiAJICoKQEAgLTEwOTAsMjEgKzEwMDUsMTggQEAKIAkgKiAgbGVhdmVzIHVzIGluIHBvc2l0aW9uIGZvciBoYW5kbGluZyBhcyBjYXNlIDMKIAkgKi8KIAlpZiAobikgewotCQlzdHJ1Y3QgdG5vZGUgKnRuOworCQlzdHJ1Y3Qga2V5X3ZlY3RvciAqdG47CiAKIAkJdG4gPSB0bm9kZV9uZXcoa2V5LCBfX2ZscyhrZXkgXiBuLT5rZXkpLCAxKTsKLQkJaWYgKCF0bikgewotCQkJZnJlZV9sZWFmX2luZm8obGkpOwotCQkJbm9kZV9mcmVlKGwpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKwkJaWYgKCF0bikKKwkJCWdvdG8gbm90bm9kZTsKIAogCQkvKiBpbml0aWFsaXplIHJvdXRlcyBvdXQgb2Ygbm9kZSAqLwogCQlOT0RFX0lOSVRfUEFSRU5UKHRuLCB0cCk7CiAJCXB1dF9jaGlsZCh0biwgZ2V0X2luZGV4KGtleSwgdG4pIF4gMSwgbik7CiAKIAkJLyogc3RhcnQgYWRkaW5nIHJvdXRlcyBpbnRvIHRoZSBub2RlICovCi0JCXB1dF9jaGlsZF9yb290KHRwLCB0LCBrZXksIHRuKTsKKwkJcHV0X2NoaWxkX3Jvb3QodHAsIGtleSwgdG4pOwogCQlub2RlX3NldF9wYXJlbnQobiwgdG4pOwogCiAJCS8qIHBhcmVudCBub3cgaGFzIGEgTlVMTCBzcG90IHdoZXJlIHRoZSBsZWFmIGNhbiBnbyAqLwpAQCAtMTExMiw2OSArMTAyNCw5MyBAQAogCX0KIAogCS8qIENhc2UgMzogbiBpcyBOVUxMLCBhbmQgd2lsbCBqdXN0IGluc2VydCBhIG5ldyBsZWFmICovCi0JaWYgKHRwKSB7Ci0JCU5PREVfSU5JVF9QQVJFTlQobCwgdHApOwotCQlwdXRfY2hpbGQodHAsIGdldF9pbmRleChrZXksIHRwKSwgbCk7Ci0JCXRyaWVfcmViYWxhbmNlKHQsIHRwKTsKLQl9IGVsc2UgewotCQlyY3VfYXNzaWduX3BvaW50ZXIodC0+dHJpZSwgbCk7Ci0JfQorCU5PREVfSU5JVF9QQVJFTlQobCwgdHApOworCXB1dF9jaGlsZF9yb290KHRwLCBrZXksIGwpOworCXRyaWVfcmViYWxhbmNlKHQsIHRwKTsKIAotCXJldHVybiBmYV9oZWFkOworCXJldHVybiAwOworbm90bm9kZToKKwlub2RlX2ZyZWUobCk7Citub2xlYWY6CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKLS8qCi0gKiBDYWxsZXIgbXVzdCBob2xkIFJUTkwuCi0gKi8KK3N0YXRpYyBpbnQgZmliX2luc2VydF9hbGlhcyhzdHJ1Y3QgdHJpZSAqdCwgc3RydWN0IGtleV92ZWN0b3IgKnRwLAorCQkJICAgIHN0cnVjdCBrZXlfdmVjdG9yICpsLCBzdHJ1Y3QgZmliX2FsaWFzICpuZXcsCisJCQkgICAgc3RydWN0IGZpYl9hbGlhcyAqZmEsIHRfa2V5IGtleSkKK3sKKwlpZiAoIWwpCisJCXJldHVybiBmaWJfaW5zZXJ0X25vZGUodCwgdHAsIG5ldywga2V5KTsKKworCWlmIChmYSkgeworCQlobGlzdF9hZGRfYmVmb3JlX3JjdSgmbmV3LT5mYV9saXN0LCAmZmEtPmZhX2xpc3QpOworCX0gZWxzZSB7CisJCXN0cnVjdCBmaWJfYWxpYXMgKmxhc3Q7CisKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkobGFzdCwgJmwtPmxlYWYsIGZhX2xpc3QpIHsKKwkJCWlmIChuZXctPmZhX3NsZW4gPCBsYXN0LT5mYV9zbGVuKQorCQkJCWJyZWFrOworCQkJaWYgKChuZXctPmZhX3NsZW4gPT0gbGFzdC0+ZmFfc2xlbikgJiYKKwkJCSAgICAobmV3LT50Yl9pZCA+IGxhc3QtPnRiX2lkKSkKKwkJCQlicmVhazsKKwkJCWZhID0gbGFzdDsKKwkJfQorCisJCWlmIChmYSkKKwkJCWhsaXN0X2FkZF9iZWhpbmRfcmN1KCZuZXctPmZhX2xpc3QsICZmYS0+ZmFfbGlzdCk7CisJCWVsc2UKKwkJCWhsaXN0X2FkZF9oZWFkX3JjdSgmbmV3LT5mYV9saXN0LCAmbC0+bGVhZik7CisJfQorCisJLyogaWYgd2UgYWRkZWQgdG8gdGhlIHRhaWwgbm9kZSB0aGVuIHdlIG5lZWQgdG8gdXBkYXRlIHNsZW4gKi8KKwlpZiAobC0+c2xlbiA8IG5ldy0+ZmFfc2xlbikgeworCQlsLT5zbGVuID0gbmV3LT5mYV9zbGVuOworCQlsZWFmX3B1c2hfc3VmZml4KHRwLCBsKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCBSVE5MLiAqLwogaW50IGZpYl90YWJsZV9pbnNlcnQoc3RydWN0IGZpYl90YWJsZSAqdGIsIHN0cnVjdCBmaWJfY29uZmlnICpjZmcpCiB7Ci0Jc3RydWN0IHRyaWUgKnQgPSAoc3RydWN0IHRyaWUgKikgdGItPnRiX2RhdGE7CisJc3RydWN0IHRyaWUgKnQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKIAlzdHJ1Y3QgZmliX2FsaWFzICpmYSwgKm5ld19mYTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpmYV9oZWFkID0gTlVMTDsKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqbCwgKnRwOwogCXN0cnVjdCBmaWJfaW5mbyAqZmk7Ci0JaW50IHBsZW4gPSBjZmctPmZjX2RzdF9sZW47CisJdTggcGxlbiA9IGNmZy0+ZmNfZHN0X2xlbjsKKwl1OCBzbGVuID0gS0VZTEVOR1RIIC0gcGxlbjsKIAl1OCB0b3MgPSBjZmctPmZjX3RvczsKLQl1MzIga2V5LCBtYXNrOworCXUzMiBrZXk7CiAJaW50IGVycjsKLQlzdHJ1Y3QgdG5vZGUgKmw7CiAKLQlpZiAocGxlbiA+IDMyKQorCWlmIChwbGVuID4gS0VZTEVOR1RIKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWtleSA9IG50b2hsKGNmZy0+ZmNfZHN0KTsKIAogCXByX2RlYnVnKCJJbnNlcnQgdGFibGU9JXUgJTA4eC8lZFxuIiwgdGItPnRiX2lkLCBrZXksIHBsZW4pOwogCi0JbWFzayA9IG50b2hsKGluZXRfbWFrZV9tYXNrKHBsZW4pKTsKLQotCWlmIChrZXkgJiB+bWFzaykKKwlpZiAoKHBsZW4gPCBLRVlMRU5HVEgpICYmIChrZXkgPDwgcGxlbikpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Ja2V5ID0ga2V5ICYgbWFzazsKLQogCWZpID0gZmliX2NyZWF0ZV9pbmZvKGNmZyk7CiAJaWYgKElTX0VSUihmaSkpIHsKIAkJZXJyID0gUFRSX0VSUihmaSk7CiAJCWdvdG8gZXJyOwogCX0KIAotCWwgPSBmaWJfZmluZF9ub2RlKHQsIGtleSk7Ci0JZmEgPSBOVUxMOwotCi0JaWYgKGwpIHsKLQkJZmFfaGVhZCA9IGdldF9mYV9oZWFkKGwsIHBsZW4pOwotCQlmYSA9IGZpYl9maW5kX2FsaWFzKGZhX2hlYWQsIHRvcywgZmktPmZpYl9wcmlvcml0eSk7Ci0JfQorCWwgPSBmaWJfZmluZF9ub2RlKHQsICZ0cCwga2V5KTsKKwlmYSA9IGwgPyBmaWJfZmluZF9hbGlhcygmbC0+bGVhZiwgc2xlbiwgdG9zLCBmaS0+ZmliX3ByaW9yaXR5LAorCQkJCXRiLT50Yl9pZCkgOiBOVUxMOwogCiAJLyogTm93IGZhLCBpZiBub24tTlVMTCwgcG9pbnRzIHRvIHRoZSBmaXJzdCBmaWIgYWxpYXMKIAkgKiB3aXRoIHRoZSBzYW1lIGtleXMgW3ByZWZpeCx0b3MscHJpb3JpdHldLCBpZiBzdWNoIGtleSBhbHJlYWR5CiAJICogZXhpc3RzIG9yIHRvIHRoZSBub2RlIGJlZm9yZSB3aGljaCB3ZSB3aWxsIGluc2VydCBuZXcgb25lLgogCSAqCiAJICogSWYgZmEgaXMgTlVMTCwgd2Ugd2lsbCBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IG9uZSBhbmQKLQkgKiBpbnNlcnQgdG8gdGhlIGhlYWQgb2YgZi4KLQkgKgotCSAqIElmIGYgaXMgTlVMTCwgbm8gZmliIG5vZGUgbWF0Y2hlZCB0aGUgZGVzdGluYXRpb24ga2V5Ci0JICogYW5kIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBuZXcgb25lIG9mIHRob3NlIGFzIHdlbGwuCisJICogaW5zZXJ0IHRvIHRoZSB0YWlsIG9mIHRoZSBzZWN0aW9uIG1hdGNoaW5nIHRoZSBzdWZmaXggbGVuZ3RoCisJICogb2YgdGhlIG5ldyBhbGlhcy4KIAkgKi8KIAogCWlmIChmYSAmJiBmYS0+ZmFfdG9zID09IHRvcyAmJgpAQCAtMTE5Miw5ICsxMTI4LDEwIEBACiAJCSAqLwogCQlmYV9tYXRjaCA9IE5VTEw7CiAJCWZhX2ZpcnN0ID0gZmE7Ci0JCWZhID0gbGlzdF9lbnRyeShmYS0+ZmFfbGlzdC5wcmV2LCBzdHJ1Y3QgZmliX2FsaWFzLCBmYV9saXN0KTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShmYSwgZmFfaGVhZCwgZmFfbGlzdCkgewotCQkJaWYgKGZhLT5mYV90b3MgIT0gdG9zKQorCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKGZhLCBmYV9saXN0KSB7CisJCQlpZiAoKGZhLT5mYV9zbGVuICE9IHNsZW4pIHx8CisJCQkgICAgKGZhLT50Yl9pZCAhPSB0Yi0+dGJfaWQpIHx8CisJCQkgICAgKGZhLT5mYV90b3MgIT0gdG9zKSkKIAkJCQlicmVhazsKIAkJCWlmIChmYS0+ZmFfaW5mby0+ZmliX3ByaW9yaXR5ICE9IGZpLT5maWJfcHJpb3JpdHkpCiAJCQkJYnJlYWs7CkBAIC0xMjE3LDcgKzExNTQsNyBAQAogCQkJfQogCQkJZXJyID0gLUVOT0JVRlM7CiAJCQluZXdfZmEgPSBrbWVtX2NhY2hlX2FsbG9jKGZuX2FsaWFzX2ttZW0sIEdGUF9LRVJORUwpOwotCQkJaWYgKG5ld19mYSA9PSBOVUxMKQorCQkJaWYgKCFuZXdfZmEpCiAJCQkJZ290byBvdXQ7CiAKIAkJCWZpX2Ryb3AgPSBmYS0+ZmFfaW5mbzsKQEAgLTEyMjYsOCArMTE2MywyMSBAQAogCQkJbmV3X2ZhLT5mYV90eXBlID0gY2ZnLT5mY190eXBlOwogCQkJc3RhdGUgPSBmYS0+ZmFfc3RhdGU7CiAJCQluZXdfZmEtPmZhX3N0YXRlID0gc3RhdGUgJiB+RkFfU19BQ0NFU1NFRDsKKwkJCW5ld19mYS0+ZmFfc2xlbiA9IGZhLT5mYV9zbGVuOwogCi0JCQlsaXN0X3JlcGxhY2VfcmN1KCZmYS0+ZmFfbGlzdCwgJm5ld19mYS0+ZmFfbGlzdCk7CisJCQllcnIgPSBuZXRkZXZfc3dpdGNoX2ZpYl9pcHY0X2FkZChrZXksIHBsZW4sIGZpLAorCQkJCQkJCSBuZXdfZmEtPmZhX3RvcywKKwkJCQkJCQkgY2ZnLT5mY190eXBlLAorCQkJCQkJCSBjZmctPmZjX25sZmxhZ3MsCisJCQkJCQkJIHRiLT50Yl9pZCk7CisJCQlpZiAoZXJyKSB7CisJCQkJbmV0ZGV2X3N3aXRjaF9maWJfaXB2NF9hYm9ydChmaSk7CisJCQkJa21lbV9jYWNoZV9mcmVlKGZuX2FsaWFzX2ttZW0sIG5ld19mYSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWhsaXN0X3JlcGxhY2VfcmN1KCZmYS0+ZmFfbGlzdCwgJm5ld19mYS0+ZmFfbGlzdCk7CisKIAkJCWFsaWFzX2ZyZWVfbWVtX3JjdShmYSk7CiAKIAkJCWZpYl9yZWxlYXNlX2luZm8oZmlfZHJvcCk7CkBAIC0xMjU0LDM3ICsxMjA0LDQyIEBACiAKIAllcnIgPSAtRU5PQlVGUzsKIAluZXdfZmEgPSBrbWVtX2NhY2hlX2FsbG9jKGZuX2FsaWFzX2ttZW0sIEdGUF9LRVJORUwpOwotCWlmIChuZXdfZmEgPT0gTlVMTCkKKwlpZiAoIW5ld19mYSkKIAkJZ290byBvdXQ7CiAKIAluZXdfZmEtPmZhX2luZm8gPSBmaTsKIAluZXdfZmEtPmZhX3RvcyA9IHRvczsKIAluZXdfZmEtPmZhX3R5cGUgPSBjZmctPmZjX3R5cGU7CiAJbmV3X2ZhLT5mYV9zdGF0ZSA9IDA7Ci0JLyoKLQkgKiBJbnNlcnQgbmV3IGVudHJ5IHRvIHRoZSBsaXN0LgotCSAqLworCW5ld19mYS0+ZmFfc2xlbiA9IHNsZW47CisJbmV3X2ZhLT50Yl9pZCA9IHRiLT50Yl9pZDsKIAotCWlmICghZmFfaGVhZCkgewotCQlmYV9oZWFkID0gZmliX2luc2VydF9ub2RlKHQsIGtleSwgcGxlbik7Ci0JCWlmICh1bmxpa2VseSghZmFfaGVhZCkpIHsKLQkJCWVyciA9IC1FTk9NRU07Ci0JCQlnb3RvIG91dF9mcmVlX25ld19mYTsKLQkJfQorCS8qIChPcHRpb25hbGx5KSBvZmZsb2FkIGZpYiBlbnRyeSB0byBzd2l0Y2ggaGFyZHdhcmUuICovCisJZXJyID0gbmV0ZGV2X3N3aXRjaF9maWJfaXB2NF9hZGQoa2V5LCBwbGVuLCBmaSwgdG9zLAorCQkJCQkgY2ZnLT5mY190eXBlLAorCQkJCQkgY2ZnLT5mY19ubGZsYWdzLAorCQkJCQkgdGItPnRiX2lkKTsKKwlpZiAoZXJyKSB7CisJCW5ldGRldl9zd2l0Y2hfZmliX2lwdjRfYWJvcnQoZmkpOworCQlnb3RvIG91dF9mcmVlX25ld19mYTsKIAl9CiAKKwkvKiBJbnNlcnQgbmV3IGVudHJ5IHRvIHRoZSBsaXN0LiAqLworCWVyciA9IGZpYl9pbnNlcnRfYWxpYXModCwgdHAsIGwsIG5ld19mYSwgZmEsIGtleSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfc3dfZmliX2RlbDsKKwogCWlmICghcGxlbikKIAkJdGItPnRiX251bV9kZWZhdWx0Kys7CiAKLQlsaXN0X2FkZF90YWlsX3JjdSgmbmV3X2ZhLT5mYV9saXN0LAotCQkJICAoZmEgPyAmZmEtPmZhX2xpc3QgOiBmYV9oZWFkKSk7Ci0KIAlydF9jYWNoZV9mbHVzaChjZmctPmZjX25saW5mby5ubF9uZXQpOwotCXJ0bXNnX2ZpYihSVE1fTkVXUk9VVEUsIGh0b25sKGtleSksIG5ld19mYSwgcGxlbiwgdGItPnRiX2lkLAorCXJ0bXNnX2ZpYihSVE1fTkVXUk9VVEUsIGh0b25sKGtleSksIG5ld19mYSwgcGxlbiwgbmV3X2ZhLT50Yl9pZCwKIAkJICAmY2ZnLT5mY19ubGluZm8sIDApOwogc3VjY2VlZGVkOgogCXJldHVybiAwOwogCitvdXRfc3dfZmliX2RlbDoKKwluZXRkZXZfc3dpdGNoX2ZpYl9pcHY0X2RlbChrZXksIHBsZW4sIGZpLCB0b3MsIGNmZy0+ZmNfdHlwZSwgdGItPnRiX2lkKTsKIG91dF9mcmVlX25ld19mYToKIAlrbWVtX2NhY2hlX2ZyZWUoZm5fYWxpYXNfa21lbSwgbmV3X2ZhKTsKIG91dDoKQEAgLTEyOTMsNyArMTI0OCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGlubGluZSB0X2tleSBwcmVmaXhfbWlzbWF0Y2godF9rZXkga2V5LCBzdHJ1Y3QgdG5vZGUgKm4pCitzdGF0aWMgaW5saW5lIHRfa2V5IHByZWZpeF9taXNtYXRjaCh0X2tleSBrZXksIHN0cnVjdCBrZXlfdmVjdG9yICpuKQogewogCXRfa2V5IHByZWZpeCA9IG4tPmtleTsKIApAQCAtMTMwNCwxNiArMTI1OSwyMCBAQAogaW50IGZpYl90YWJsZV9sb29rdXAoc3RydWN0IGZpYl90YWJsZSAqdGIsIGNvbnN0IHN0cnVjdCBmbG93aTQgKmZscCwKIAkJICAgICBzdHJ1Y3QgZmliX3Jlc3VsdCAqcmVzLCBpbnQgZmliX2ZsYWdzKQogewotCXN0cnVjdCB0cmllICp0ID0gKHN0cnVjdCB0cmllICopdGItPnRiX2RhdGE7CisJc3RydWN0IHRyaWUgKnQgPSAoc3RydWN0IHRyaWUgKikgdGItPnRiX2RhdGE7CiAjaWZkZWYgQ09ORklHX0lQX0ZJQl9UUklFX1NUQVRTCiAJc3RydWN0IHRyaWVfdXNlX3N0YXRzIF9fcGVyY3B1ICpzdGF0cyA9IHQtPnN0YXRzOwogI2VuZGlmCiAJY29uc3QgdF9rZXkga2V5ID0gbnRvaGwoZmxwLT5kYWRkcik7Ci0Jc3RydWN0IHRub2RlICpuLCAqcG47Ci0Jc3RydWN0IGxlYWZfaW5mbyAqbGk7CisJc3RydWN0IGtleV92ZWN0b3IgKm4sICpwbjsKKwlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKKwl1bnNpZ25lZCBsb25nIGluZGV4OwogCXRfa2V5IGNpbmRleDsKIAotCW4gPSByY3VfZGVyZWZlcmVuY2UodC0+dHJpZSk7CisJcG4gPSB0LT5rdjsKKwljaW5kZXggPSAwOworCisJbiA9IGdldF9jaGlsZF9yY3UocG4sIGNpbmRleCk7CiAJaWYgKCFuKQogCQlyZXR1cm4gLUVBR0FJTjsKIApAQCAtMTMyMSwyNCArMTI4MCwyNSBAQAogCXRoaXNfY3B1X2luYyhzdGF0cy0+Z2V0cyk7CiAjZW5kaWYKIAotCXBuID0gbjsKLQljaW5kZXggPSAwOwotCiAJLyogU3RlcCAxOiBUcmF2ZWwgdG8gdGhlIGxvbmdlc3QgcHJlZml4IG1hdGNoIGluIHRoZSB0cmllICovCiAJZm9yICg7OykgewotCQl1bnNpZ25lZCBsb25nIGluZGV4ID0gZ2V0X2luZGV4KGtleSwgbik7CisJCWluZGV4ID0gZ2V0X2NpbmRleChrZXksIG4pOwogCiAJCS8qIFRoaXMgYml0IG9mIGNvZGUgaXMgYSBiaXQgdHJpY2t5IGJ1dCBpdCBjb21iaW5lcyBtdWx0aXBsZQogCQkgKiBjaGVja3MgaW50byBhIHNpbmdsZSBjaGVjay4gIFRoZSBwcmVmaXggY29uc2lzdHMgb2YgdGhlCiAJCSAqIHByZWZpeCBwbHVzIHplcm9zIGZvciB0aGUgImJpdHMiIGluIHRoZSBwcmVmaXguIFRoZSBpbmRleAogCQkgKiBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBrZXkgYW5kIHRoaXMgdmFsdWUuICBGcm9tCiAJCSAqIHRoaXMgd2UgY2FuIGFjdHVhbGx5IGRlcml2ZSBzZXZlcmFsIHBpZWNlcyBvZiBkYXRhLgotCQkgKiAgIGlmIChpbmRleCAmICh+MHVsIDw8IGJpdHMpKQorCQkgKiAgIGlmIChpbmRleCA+PSAoMXVsIDw8IGJpdHMpKQogCQkgKiAgICAgd2UgaGF2ZSBhIG1pc21hdGNoIGluIHNraXAgYml0cyBhbmQgZmFpbGVkCiAJCSAqICAgZWxzZQogCQkgKiAgICAgd2Uga25vdyB0aGUgdmFsdWUgaXMgY2luZGV4CisJCSAqCisJCSAqIFRoaXMgY2hlY2sgaXMgc2FmZSBldmVuIGlmIGJpdHMgPT0gS0VZTEVOR1RIIGR1ZSB0byB0aGUKKwkJICogZmFjdCB0aGF0IHdlIGNhbiBvbmx5IGFsbG9jYXRlIGEgbm9kZSB3aXRoIDMyIGJpdHMgaWYgYQorCQkgKiBsb25nIGlzIGdyZWF0ZXIgdGhhbiAzMiBiaXRzLgogCQkgKi8KLQkJaWYgKGluZGV4ICYgKH4wdWwgPDwgbi0+Yml0cykpCisJCWlmIChpbmRleCA+PSAoMXVsIDw8IG4tPmJpdHMpKQogCQkJYnJlYWs7CiAKIAkJLyogd2UgaGF2ZSBmb3VuZCBhIGxlYWYuIFByZWZpeGVzIGhhdmUgYWxyZWFkeSBiZWVuIGNvbXBhcmVkICovCkBAIC0xMzUzLDcgKzEzMTMsNyBAQAogCQkJY2luZGV4ID0gaW5kZXg7CiAJCX0KIAotCQluID0gdG5vZGVfZ2V0X2NoaWxkX3JjdShuLCBpbmRleCk7CisJCW4gPSBnZXRfY2hpbGRfcmN1KG4sIGluZGV4KTsKIAkJaWYgKHVubGlrZWx5KCFuKSkKIAkJCWdvdG8gYmFja3RyYWNlOwogCX0KQEAgLTEzNjEsNyArMTMyMSw3IEBACiAJLyogU3RlcCAyOiBTb3J0IG91dCBsZWF2ZXMgYW5kIGJlZ2luIGJhY2t0cmFjaW5nIGZvciBsb25nZXN0IHByZWZpeCAqLwogCWZvciAoOzspIHsKIAkJLyogcmVjb3JkIHRoZSBwb2ludGVyIHdoZXJlIG91ciBuZXh0IG5vZGUgcG9pbnRlciBpcyBzdG9yZWQgKi8KLQkJc3RydWN0IHRub2RlIF9fcmN1ICoqY3B0ciA9IG4tPmNoaWxkOworCQlzdHJ1Y3Qga2V5X3ZlY3RvciBfX3JjdSAqKmNwdHIgPSBuLT50bm9kZTsKIAogCQkvKiBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBub25lIG9mIHRoZSBiaXRzIHRoYXQgZGlmZmVyCiAJCSAqIGJldHdlZW4gdGhlIGtleSBhbmQgdGhlIHByZWZpeCBleGlzdCBpbiB0aGUgcmVnaW9uIG9mCkBAIC0xMzkzLDEzICsxMzUzLDE3IEBACiAJCQl3aGlsZSAoIWNpbmRleCkgewogCQkJCXRfa2V5IHBrZXkgPSBwbi0+a2V5OwogCi0JCQkJcG4gPSBub2RlX3BhcmVudF9yY3UocG4pOwotCQkJCWlmICh1bmxpa2VseSghcG4pKQorCQkJCS8qIElmIHdlIGRvbid0IGhhdmUgYSBwYXJlbnQgdGhlbiB0aGVyZSBpcworCQkJCSAqIG5vdGhpbmcgZm9yIHVzIHRvIGRvIGFzIHdlIGRvIG5vdCBoYXZlIGFueQorCQkJCSAqIGZ1cnRoZXIgbm9kZXMgdG8gcGFyc2UuCisJCQkJICovCisJCQkJaWYgKElTX1RSSUUocG4pKQogCQkJCQlyZXR1cm4gLUVBR0FJTjsKICNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMKIAkJCQl0aGlzX2NwdV9pbmMoc3RhdHMtPmJhY2t0cmFjayk7CiAjZW5kaWYKIAkJCQkvKiBHZXQgQ2hpbGQncyBpbmRleCAqLworCQkJCXBuID0gbm9kZV9wYXJlbnRfcmN1KHBuKTsKIAkJCQljaW5kZXggPSBnZXRfaW5kZXgocGtleSwgcG4pOwogCQkJfQogCkBAIC0xNDA3LDEzOCArMTM3MSwxMzQgQEAKIAkJCWNpbmRleCAmPSBjaW5kZXggLSAxOwogCiAJCQkvKiBncmFiIHBvaW50ZXIgZm9yIG5leHQgY2hpbGQgbm9kZSAqLwotCQkJY3B0ciA9ICZwbi0+Y2hpbGRbY2luZGV4XTsKKwkJCWNwdHIgPSAmcG4tPnRub2RlW2NpbmRleF07CiAJCX0KIAl9CiAKIGZvdW5kOgorCS8qIHRoaXMgbGluZSBjYXJyaWVzIGZvcndhcmQgdGhlIHhvciBmcm9tIGVhcmxpZXIgaW4gdGhlIGZ1bmN0aW9uICovCisJaW5kZXggPSBrZXkgXiBuLT5rZXk7CisKIAkvKiBTdGVwIDM6IFByb2Nlc3MgdGhlIGxlYWYsIGlmIHRoYXQgZmFpbHMgZmFsbCBiYWNrIHRvIGJhY2t0cmFjaW5nICovCi0JaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGxpLCAmbi0+bGlzdCwgaGxpc3QpIHsKLQkJc3RydWN0IGZpYl9hbGlhcyAqZmE7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGZhLCAmbi0+bGVhZiwgZmFfbGlzdCkgeworCQlzdHJ1Y3QgZmliX2luZm8gKmZpID0gZmEtPmZhX2luZm87CisJCWludCBuaHNlbCwgZXJyOwogCi0JCWlmICgoa2V5IF4gbi0+a2V5KSAmIGxpLT5tYXNrX3BsZW4pCisJCWlmICgoaW5kZXggPj0gKDF1bCA8PCBmYS0+ZmFfc2xlbikpICYmCisJCSAgICAoKEJJVFNfUEVSX0xPTkcgPiBLRVlMRU5HVEgpIHx8IChmYS0+ZmFfc2xlbiAhPSBLRVlMRU5HVEgpKSkKIAkJCWNvbnRpbnVlOwotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGZhLCAmbGktPmZhbGgsIGZhX2xpc3QpIHsKLQkJCXN0cnVjdCBmaWJfaW5mbyAqZmkgPSBmYS0+ZmFfaW5mbzsKLQkJCWludCBuaHNlbCwgZXJyOwotCi0JCQlpZiAoZmEtPmZhX3RvcyAmJiBmYS0+ZmFfdG9zICE9IGZscC0+Zmxvd2k0X3RvcykKLQkJCQljb250aW51ZTsKLQkJCWlmIChmaS0+ZmliX2RlYWQpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoZmEtPmZhX2luZm8tPmZpYl9zY29wZSA8IGZscC0+Zmxvd2k0X3Njb3BlKQotCQkJCWNvbnRpbnVlOwotCQkJZmliX2FsaWFzX2FjY2Vzc2VkKGZhKTsKLQkJCWVyciA9IGZpYl9wcm9wc1tmYS0+ZmFfdHlwZV0uZXJyb3I7Ci0JCQlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKKwkJaWYgKGZhLT5mYV90b3MgJiYgZmEtPmZhX3RvcyAhPSBmbHAtPmZsb3dpNF90b3MpCisJCQljb250aW51ZTsKKwkJaWYgKGZpLT5maWJfZGVhZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZmEtPmZhX2luZm8tPmZpYl9zY29wZSA8IGZscC0+Zmxvd2k0X3Njb3BlKQorCQkJY29udGludWU7CisJCWZpYl9hbGlhc19hY2Nlc3NlZChmYSk7CisJCWVyciA9IGZpYl9wcm9wc1tmYS0+ZmFfdHlwZV0uZXJyb3I7CisJCWlmICh1bmxpa2VseShlcnIgPCAwKSkgewogI2lmZGVmIENPTkZJR19JUF9GSUJfVFJJRV9TVEFUUwotCQkJCXRoaXNfY3B1X2luYyhzdGF0cy0+c2VtYW50aWNfbWF0Y2hfcGFzc2VkKTsKKwkJCXRoaXNfY3B1X2luYyhzdGF0cy0+c2VtYW50aWNfbWF0Y2hfcGFzc2VkKTsKICNlbmRpZgotCQkJCXJldHVybiBlcnI7Ci0JCQl9Ci0JCQlpZiAoZmktPmZpYl9mbGFncyAmIFJUTkhfRl9ERUFEKQotCQkJCWNvbnRpbnVlOwotCQkJZm9yIChuaHNlbCA9IDA7IG5oc2VsIDwgZmktPmZpYl9uaHM7IG5oc2VsKyspIHsKLQkJCQljb25zdCBzdHJ1Y3QgZmliX25oICpuaCA9ICZmaS0+ZmliX25oW25oc2VsXTsKLQotCQkJCWlmIChuaC0+bmhfZmxhZ3MgJiBSVE5IX0ZfREVBRCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGZscC0+Zmxvd2k0X29pZiAmJiBmbHAtPmZsb3dpNF9vaWYgIT0gbmgtPm5oX29pZikKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoIShmaWJfZmxhZ3MgJiBGSUJfTE9PS1VQX05PUkVGKSkKLQkJCQkJYXRvbWljX2luYygmZmktPmZpYl9jbG50cmVmKTsKLQotCQkJCXJlcy0+cHJlZml4bGVuID0gbGktPnBsZW47Ci0JCQkJcmVzLT5uaF9zZWwgPSBuaHNlbDsKLQkJCQlyZXMtPnR5cGUgPSBmYS0+ZmFfdHlwZTsKLQkJCQlyZXMtPnNjb3BlID0gZmktPmZpYl9zY29wZTsKLQkJCQlyZXMtPmZpID0gZmk7Ci0JCQkJcmVzLT50YWJsZSA9IHRiOwotCQkJCXJlcy0+ZmFfaGVhZCA9ICZsaS0+ZmFsaDsKLSNpZmRlZiBDT05GSUdfSVBfRklCX1RSSUVfU1RBVFMKLQkJCQl0aGlzX2NwdV9pbmMoc3RhdHMtPnNlbWFudGljX21hdGNoX3Bhc3NlZCk7Ci0jZW5kaWYKLQkJCQlyZXR1cm4gZXJyOwotCQkJfQorCQkJcmV0dXJuIGVycjsKIAkJfQorCQlpZiAoZmktPmZpYl9mbGFncyAmIFJUTkhfRl9ERUFEKQorCQkJY29udGludWU7CisJCWZvciAobmhzZWwgPSAwOyBuaHNlbCA8IGZpLT5maWJfbmhzOyBuaHNlbCsrKSB7CisJCQljb25zdCBzdHJ1Y3QgZmliX25oICpuaCA9ICZmaS0+ZmliX25oW25oc2VsXTsKIAorCQkJaWYgKG5oLT5uaF9mbGFncyAmIFJUTkhfRl9ERUFEKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGZscC0+Zmxvd2k0X29pZiAmJiBmbHAtPmZsb3dpNF9vaWYgIT0gbmgtPm5oX29pZikKKwkJCQljb250aW51ZTsKKworCQkJaWYgKCEoZmliX2ZsYWdzICYgRklCX0xPT0tVUF9OT1JFRikpCisJCQkJYXRvbWljX2luYygmZmktPmZpYl9jbG50cmVmKTsKKworCQkJcmVzLT5wcmVmaXhsZW4gPSBLRVlMRU5HVEggLSBmYS0+ZmFfc2xlbjsKKwkJCXJlcy0+bmhfc2VsID0gbmhzZWw7CisJCQlyZXMtPnR5cGUgPSBmYS0+ZmFfdHlwZTsKKwkJCXJlcy0+c2NvcGUgPSBmaS0+ZmliX3Njb3BlOworCQkJcmVzLT5maSA9IGZpOworCQkJcmVzLT50YWJsZSA9IHRiOworCQkJcmVzLT5mYV9oZWFkID0gJm4tPmxlYWY7CiAjaWZkZWYgQ09ORklHX0lQX0ZJQl9UUklFX1NUQVRTCi0JCXRoaXNfY3B1X2luYyhzdGF0cy0+c2VtYW50aWNfbWF0Y2hfbWlzcyk7CisJCQl0aGlzX2NwdV9pbmMoc3RhdHMtPnNlbWFudGljX21hdGNoX3Bhc3NlZCk7CiAjZW5kaWYKKwkJCXJldHVybiBlcnI7CisJCX0KIAl9CisjaWZkZWYgQ09ORklHX0lQX0ZJQl9UUklFX1NUQVRTCisJdGhpc19jcHVfaW5jKHN0YXRzLT5zZW1hbnRpY19tYXRjaF9taXNzKTsKKyNlbmRpZgogCWdvdG8gYmFja3RyYWNlOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZmliX3RhYmxlX2xvb2t1cCk7CiAKLS8qCi0gKiBSZW1vdmUgdGhlIGxlYWYgYW5kIHJldHVybiBwYXJlbnQuCi0gKi8KLXN0YXRpYyB2b2lkIHRyaWVfbGVhZl9yZW1vdmUoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0bm9kZSAqbCkKK3N0YXRpYyB2b2lkIGZpYl9yZW1vdmVfYWxpYXMoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCBrZXlfdmVjdG9yICp0cCwKKwkJCSAgICAgc3RydWN0IGtleV92ZWN0b3IgKmwsIHN0cnVjdCBmaWJfYWxpYXMgKm9sZCkKIHsKLQlzdHJ1Y3QgdG5vZGUgKnRwID0gbm9kZV9wYXJlbnQobCk7CisJLyogcmVjb3JkIHRoZSBsb2NhdGlvbiBvZiB0aGUgcHJldmlvdXMgbGlzdF9pbmZvIGVudHJ5ICovCisJc3RydWN0IGhsaXN0X25vZGUgKipwcHJldiA9IG9sZC0+ZmFfbGlzdC5wcHJldjsKKwlzdHJ1Y3QgZmliX2FsaWFzICpmYSA9IGhsaXN0X2VudHJ5KHBwcmV2LCB0eXBlb2YoKmZhKSwgZmFfbGlzdC5uZXh0KTsKIAotCXByX2RlYnVnKCJlbnRlcmluZyB0cmllX2xlYWZfcmVtb3ZlKCVwKVxuIiwgbCk7CisJLyogcmVtb3ZlIHRoZSBmaWJfYWxpYXMgZnJvbSB0aGUgbGlzdCAqLworCWhsaXN0X2RlbF9yY3UoJm9sZC0+ZmFfbGlzdCk7CiAKLQlpZiAodHApIHsKLQkJcHV0X2NoaWxkKHRwLCBnZXRfaW5kZXgobC0+a2V5LCB0cCksIE5VTEwpOworCS8qIGlmIHdlIGVtcHRpZWQgdGhlIGxpc3QgdGhpcyBsZWFmIHdpbGwgYmUgZnJlZWQgYW5kIHdlIGNhbiBzb3J0CisJICogb3V0IHBhcmVudCBzdWZmaXggbGVuZ3RocyBhcyBhIHBhcnQgb2YgdHJpZV9yZWJhbGFuY2UKKwkgKi8KKwlpZiAoaGxpc3RfZW1wdHkoJmwtPmxlYWYpKSB7CisJCXB1dF9jaGlsZF9yb290KHRwLCBsLT5rZXksIE5VTEwpOworCQlub2RlX2ZyZWUobCk7CiAJCXRyaWVfcmViYWxhbmNlKHQsIHRwKTsKLQl9IGVsc2UgewotCQlSQ1VfSU5JVF9QT0lOVEVSKHQtPnRyaWUsIE5VTEwpOworCQlyZXR1cm47CiAJfQogCi0Jbm9kZV9mcmVlKGwpOworCS8qIG9ubHkgYWNjZXNzIGZhIGlmIGl0IGlzIHBvaW50aW5nIGF0IHRoZSBsYXN0IHZhbGlkIGhsaXN0X25vZGUgKi8KKwlpZiAoKnBwcmV2KQorCQlyZXR1cm47CisKKwkvKiB1cGRhdGUgdGhlIHRyaWUgd2l0aCB0aGUgbGF0ZXN0IHN1ZmZpeCBsZW5ndGggKi8KKwlsLT5zbGVuID0gZmEtPmZhX3NsZW47CisJbGVhZl9wdWxsX3N1ZmZpeCh0cCwgbCk7CiB9CiAKLS8qCi0gKiBDYWxsZXIgbXVzdCBob2xkIFJUTkwuCi0gKi8KKy8qIENhbGxlciBtdXN0IGhvbGQgUlROTC4gKi8KIGludCBmaWJfdGFibGVfZGVsZXRlKHN0cnVjdCBmaWJfdGFibGUgKnRiLCBzdHJ1Y3QgZmliX2NvbmZpZyAqY2ZnKQogewogCXN0cnVjdCB0cmllICp0ID0gKHN0cnVjdCB0cmllICopIHRiLT50Yl9kYXRhOwotCXUzMiBrZXksIG1hc2s7Ci0JaW50IHBsZW4gPSBjZmctPmZjX2RzdF9sZW47Ci0JdTggdG9zID0gY2ZnLT5mY190b3M7CiAJc3RydWN0IGZpYl9hbGlhcyAqZmEsICpmYV90b19kZWxldGU7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZmFfaGVhZDsKLQlzdHJ1Y3QgdG5vZGUgKmw7Ci0Jc3RydWN0IGxlYWZfaW5mbyAqbGk7CisJc3RydWN0IGtleV92ZWN0b3IgKmwsICp0cDsKKwl1OCBwbGVuID0gY2ZnLT5mY19kc3RfbGVuOworCXU4IHNsZW4gPSBLRVlMRU5HVEggLSBwbGVuOworCXU4IHRvcyA9IGNmZy0+ZmNfdG9zOworCXUzMiBrZXk7CiAKLQlpZiAocGxlbiA+IDMyKQorCWlmIChwbGVuID4gS0VZTEVOR1RIKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWtleSA9IG50b2hsKGNmZy0+ZmNfZHN0KTsKLQltYXNrID0gbnRvaGwoaW5ldF9tYWtlX21hc2socGxlbikpOwogCi0JaWYgKGtleSAmIH5tYXNrKQorCWlmICgocGxlbiA8IEtFWUxFTkdUSCkgJiYgKGtleSA8PCBwbGVuKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlrZXkgPSBrZXkgJiBtYXNrOwotCWwgPSBmaWJfZmluZF9ub2RlKHQsIGtleSk7Ci0KKwlsID0gZmliX2ZpbmRfbm9kZSh0LCAmdHAsIGtleSk7CiAJaWYgKCFsKQogCQlyZXR1cm4gLUVTUkNIOwogCi0JbGkgPSBmaW5kX2xlYWZfaW5mbyhsLCBwbGVuKTsKLQotCWlmICghbGkpCi0JCXJldHVybiAtRVNSQ0g7Ci0KLQlmYV9oZWFkID0gJmxpLT5mYWxoOwotCWZhID0gZmliX2ZpbmRfYWxpYXMoZmFfaGVhZCwgdG9zLCAwKTsKLQorCWZhID0gZmliX2ZpbmRfYWxpYXMoJmwtPmxlYWYsIHNsZW4sIHRvcywgMCwgdGItPnRiX2lkKTsKIAlpZiAoIWZhKQogCQlyZXR1cm4gLUVTUkNIOwogCiAJcHJfZGVidWcoIkRlbGV0aW5nICUwOHgvJWQgdG9zPSVkIHQ9JXBcbiIsIGtleSwgcGxlbiwgdG9zLCB0KTsKIAogCWZhX3RvX2RlbGV0ZSA9IE5VTEw7Ci0JZmEgPSBsaXN0X2VudHJ5KGZhLT5mYV9saXN0LnByZXYsIHN0cnVjdCBmaWJfYWxpYXMsIGZhX2xpc3QpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUoZmEsIGZhX2hlYWQsIGZhX2xpc3QpIHsKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKGZhLCBmYV9saXN0KSB7CiAJCXN0cnVjdCBmaWJfaW5mbyAqZmkgPSBmYS0+ZmFfaW5mbzsKIAotCQlpZiAoZmEtPmZhX3RvcyAhPSB0b3MpCisJCWlmICgoZmEtPmZhX3NsZW4gIT0gc2xlbikgfHwKKwkJICAgIChmYS0+dGJfaWQgIT0gdGItPnRiX2lkKSB8fAorCQkgICAgKGZhLT5mYV90b3MgIT0gdG9zKSkKIAkJCWJyZWFrOwogCiAJCWlmICgoIWNmZy0+ZmNfdHlwZSB8fCBmYS0+ZmFfdHlwZSA9PSBjZmctPmZjX3R5cGUpICYmCkBAIC0xNTU3LDI0MCArMTUxNywzOTcgQEAKIAlpZiAoIWZhX3RvX2RlbGV0ZSkKIAkJcmV0dXJuIC1FU1JDSDsKIAotCWZhID0gZmFfdG9fZGVsZXRlOwotCXJ0bXNnX2ZpYihSVE1fREVMUk9VVEUsIGh0b25sKGtleSksIGZhLCBwbGVuLCB0Yi0+dGJfaWQsCi0JCSAgJmNmZy0+ZmNfbmxpbmZvLCAwKTsKKwluZXRkZXZfc3dpdGNoX2ZpYl9pcHY0X2RlbChrZXksIHBsZW4sIGZhX3RvX2RlbGV0ZS0+ZmFfaW5mbywgdG9zLAorCQkJCSAgIGNmZy0+ZmNfdHlwZSwgdGItPnRiX2lkKTsKIAotCWxpc3RfZGVsX3JjdSgmZmEtPmZhX2xpc3QpOworCXJ0bXNnX2ZpYihSVE1fREVMUk9VVEUsIGh0b25sKGtleSksIGZhX3RvX2RlbGV0ZSwgcGxlbiwgdGItPnRiX2lkLAorCQkgICZjZmctPmZjX25saW5mbywgMCk7CiAKIAlpZiAoIXBsZW4pCiAJCXRiLT50Yl9udW1fZGVmYXVsdC0tOwogCi0JaWYgKGxpc3RfZW1wdHkoZmFfaGVhZCkpIHsKLQkJcmVtb3ZlX2xlYWZfaW5mbyhsLCBsaSk7Ci0JCWZyZWVfbGVhZl9pbmZvKGxpKTsKLQl9CisJZmliX3JlbW92ZV9hbGlhcyh0LCB0cCwgbCwgZmFfdG9fZGVsZXRlKTsKIAotCWlmIChobGlzdF9lbXB0eSgmbC0+bGlzdCkpCi0JCXRyaWVfbGVhZl9yZW1vdmUodCwgbCk7Ci0KLQlpZiAoZmEtPmZhX3N0YXRlICYgRkFfU19BQ0NFU1NFRCkKKwlpZiAoZmFfdG9fZGVsZXRlLT5mYV9zdGF0ZSAmIEZBX1NfQUNDRVNTRUQpCiAJCXJ0X2NhY2hlX2ZsdXNoKGNmZy0+ZmNfbmxpbmZvLm5sX25ldCk7CiAKLQlmaWJfcmVsZWFzZV9pbmZvKGZhLT5mYV9pbmZvKTsKLQlhbGlhc19mcmVlX21lbV9yY3UoZmEpOworCWZpYl9yZWxlYXNlX2luZm8oZmFfdG9fZGVsZXRlLT5mYV9pbmZvKTsKKwlhbGlhc19mcmVlX21lbV9yY3UoZmFfdG9fZGVsZXRlKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0cmllX2ZsdXNoX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKKy8qIFNjYW4gZm9yIHRoZSBuZXh0IGxlYWYgc3RhcnRpbmcgYXQgdGhlIHByb3ZpZGVkIGtleSB2YWx1ZSAqLworc3RhdGljIHN0cnVjdCBrZXlfdmVjdG9yICpsZWFmX3dhbGtfcmN1KHN0cnVjdCBrZXlfdmVjdG9yICoqdG4sIHRfa2V5IGtleSkKIHsKLQlzdHJ1Y3QgZmliX2FsaWFzICpmYSwgKmZhX25vZGU7CisJc3RydWN0IGtleV92ZWN0b3IgKnBuLCAqbiA9ICp0bjsKKwl1bnNpZ25lZCBsb25nIGNpbmRleDsKKworCS8qIHRoaXMgbG9vcCBpcyBtZWFudCB0byB0cnkgYW5kIGZpbmQgdGhlIGtleSBpbiB0aGUgdHJpZSAqLworCWRvIHsKKwkJLyogcmVjb3JkIHBhcmVudCBhbmQgbmV4dCBjaGlsZCBpbmRleCAqLworCQlwbiA9IG47CisJCWNpbmRleCA9IGtleSA/IGdldF9pbmRleChrZXksIHBuKSA6IDA7CisKKwkJaWYgKGNpbmRleCA+PiBwbi0+Yml0cykKKwkJCWJyZWFrOworCisJCS8qIGRlc2NlbmQgaW50byB0aGUgbmV4dCBjaGlsZCAqLworCQluID0gZ2V0X2NoaWxkX3JjdShwbiwgY2luZGV4KyspOworCQlpZiAoIW4pCisJCQlicmVhazsKKworCQkvKiBndWFyYW50ZWUgZm9yd2FyZCBwcm9ncmVzcyBvbiB0aGUga2V5cyAqLworCQlpZiAoSVNfTEVBRihuKSAmJiAobi0+a2V5ID49IGtleSkpCisJCQlnb3RvIGZvdW5kOworCX0gd2hpbGUgKElTX1ROT0RFKG4pKTsKKworCS8qIHRoaXMgbG9vcCB3aWxsIHNlYXJjaCBmb3IgdGhlIG5leHQgbGVhZiB3aXRoIGEgZ3JlYXRlciBrZXkgKi8KKwl3aGlsZSAoIUlTX1RSSUUocG4pKSB7CisJCS8qIGlmIHdlIGV4aGF1c3RlZCB0aGUgcGFyZW50IG5vZGUgd2Ugd2lsbCBuZWVkIHRvIGNsaW1iICovCisJCWlmIChjaW5kZXggPj0gKDF1bCA8PCBwbi0+Yml0cykpIHsKKwkJCXRfa2V5IHBrZXkgPSBwbi0+a2V5OworCisJCQlwbiA9IG5vZGVfcGFyZW50X3JjdShwbik7CisJCQljaW5kZXggPSBnZXRfaW5kZXgocGtleSwgcG4pICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogZ3JhYiB0aGUgbmV4dCBhdmFpbGFibGUgbm9kZSAqLworCQluID0gZ2V0X2NoaWxkX3JjdShwbiwgY2luZGV4KyspOworCQlpZiAoIW4pCisJCQljb250aW51ZTsKKworCQkvKiBubyBuZWVkIHRvIGNvbXBhcmUga2V5cyBzaW5jZSB3ZSBidW1wZWQgdGhlIGluZGV4ICovCisJCWlmIChJU19MRUFGKG4pKQorCQkJZ290byBmb3VuZDsKKworCQkvKiBSZXNjYW4gc3RhcnQgc2Nhbm5pbmcgaW4gbmV3IG5vZGUgKi8KKwkJcG4gPSBuOworCQljaW5kZXggPSAwOworCX0KKworCSp0biA9IHBuOworCXJldHVybiBOVUxMOyAvKiBSb290IG9mIHRyaWUgKi8KK2ZvdW5kOgorCS8qIGlmIHdlIGFyZSBhdCB0aGUgbGltaXQgZm9yIGtleXMganVzdCByZXR1cm4gTlVMTCBmb3IgdGhlIHRub2RlICovCisJKnRuID0gcG47CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyB2b2lkIGZpYl90cmllX2ZyZWUoc3RydWN0IGZpYl90YWJsZSAqdGIpCit7CisJc3RydWN0IHRyaWUgKnQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqcG4gPSB0LT5rdjsKKwl1bnNpZ25lZCBsb25nIGNpbmRleCA9IDE7CisJc3RydWN0IGhsaXN0X25vZGUgKnRtcDsKKwlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKKworCS8qIHdhbGsgdHJpZSBpbiByZXZlcnNlIG9yZGVyIGFuZCBmcmVlIGV2ZXJ5dGhpbmcgKi8KKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBrZXlfdmVjdG9yICpuOworCisJCWlmICghKGNpbmRleC0tKSkgeworCQkJdF9rZXkgcGtleSA9IHBuLT5rZXk7CisKKwkJCWlmIChJU19UUklFKHBuKSkKKwkJCQlicmVhazsKKworCQkJbiA9IHBuOworCQkJcG4gPSBub2RlX3BhcmVudChwbik7CisKKwkJCS8qIGRyb3AgZW1wdGllZCB0bm9kZSAqLworCQkJcHV0X2NoaWxkX3Jvb3QocG4sIG4tPmtleSwgTlVMTCk7CisJCQlub2RlX2ZyZWUobik7CisKKwkJCWNpbmRleCA9IGdldF9pbmRleChwa2V5LCBwbik7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogZ3JhYiB0aGUgbmV4dCBhdmFpbGFibGUgbm9kZSAqLworCQluID0gZ2V0X2NoaWxkKHBuLCBjaW5kZXgpOworCQlpZiAoIW4pCisJCQljb250aW51ZTsKKworCQlpZiAoSVNfVE5PREUobikpIHsKKwkJCS8qIHJlY29yZCBwbiBhbmQgY2luZGV4IGZvciBsZWFmIHdhbGtpbmcgKi8KKwkJCXBuID0gbjsKKwkJCWNpbmRleCA9IDF1bCA8PCBuLT5iaXRzOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmEsIHRtcCwgJm4tPmxlYWYsIGZhX2xpc3QpIHsKKwkJCWhsaXN0X2RlbF9yY3UoJmZhLT5mYV9saXN0KTsKKwkJCWFsaWFzX2ZyZWVfbWVtX3JjdShmYSk7CisJCX0KKworCQlwdXRfY2hpbGRfcm9vdChwbiwgbi0+a2V5LCBOVUxMKTsKKwkJbm9kZV9mcmVlKG4pOworCX0KKworI2lmZGVmIENPTkZJR19JUF9GSUJfVFJJRV9TVEFUUworCWZyZWVfcGVyY3B1KHQtPnN0YXRzKTsKKyNlbmRpZgorCWtmcmVlKHRiKTsKK30KKworc3RydWN0IGZpYl90YWJsZSAqZmliX3RyaWVfdW5tZXJnZShzdHJ1Y3QgZmliX3RhYmxlICpvbGR0YikKK3sKKwlzdHJ1Y3QgdHJpZSAqb3QgPSAoc3RydWN0IHRyaWUgKilvbGR0Yi0+dGJfZGF0YTsKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqbCwgKnRwID0gb3QtPmt2OworCXN0cnVjdCBmaWJfdGFibGUgKmxvY2FsX3RiOworCXN0cnVjdCBmaWJfYWxpYXMgKmZhOworCXN0cnVjdCB0cmllICpsdDsKKwl0X2tleSBrZXkgPSAwOworCisJaWYgKG9sZHRiLT50Yl9kYXRhID09IG9sZHRiLT5fX2RhdGEpCisJCXJldHVybiBvbGR0YjsKKworCWxvY2FsX3RiID0gZmliX3RyaWVfdGFibGUoUlRfVEFCTEVfTE9DQUwsIE5VTEwpOworCWlmICghbG9jYWxfdGIpCisJCXJldHVybiBOVUxMOworCisJbHQgPSAoc3RydWN0IHRyaWUgKilsb2NhbF90Yi0+dGJfZGF0YTsKKworCXdoaWxlICgobCA9IGxlYWZfd2Fsa19yY3UoJnRwLCBrZXkpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBrZXlfdmVjdG9yICpsb2NhbF9sID0gTlVMTCwgKmxvY2FsX3RwOworCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShmYSwgJmwtPmxlYWYsIGZhX2xpc3QpIHsKKwkJCXN0cnVjdCBmaWJfYWxpYXMgKm5ld19mYTsKKworCQkJaWYgKGxvY2FsX3RiLT50Yl9pZCAhPSBmYS0+dGJfaWQpCisJCQkJY29udGludWU7CisKKwkJCS8qIGNsb25lIGZhIGZvciBuZXcgbG9jYWwgdGFibGUgKi8KKwkJCW5ld19mYSA9IGttZW1fY2FjaGVfYWxsb2MoZm5fYWxpYXNfa21lbSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIW5ld19mYSkKKwkJCQlnb3RvIG91dDsKKworCQkJbWVtY3B5KG5ld19mYSwgZmEsIHNpemVvZigqZmEpKTsKKworCQkJLyogaW5zZXJ0IGNsb25lIGludG8gdGFibGUgKi8KKwkJCWlmICghbG9jYWxfbCkKKwkJCQlsb2NhbF9sID0gZmliX2ZpbmRfbm9kZShsdCwgJmxvY2FsX3RwLCBsLT5rZXkpOworCisJCQlpZiAoZmliX2luc2VydF9hbGlhcyhsdCwgbG9jYWxfdHAsIGxvY2FsX2wsIG5ld19mYSwKKwkJCQkJICAgICBOVUxMLCBsLT5rZXkpKQorCQkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogc3RvcCBsb29wIGlmIGtleSB3cmFwcGVkIGJhY2sgdG8gMCAqLworCQlrZXkgPSBsLT5rZXkgKyAxOworCQlpZiAoa2V5IDwgbC0+a2V5KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGxvY2FsX3RiOworb3V0OgorCWZpYl90cmllX2ZyZWUobG9jYWxfdGIpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENhbGxlciBtdXN0IGhvbGQgUlROTCAqLwordm9pZCBmaWJfdGFibGVfZmx1c2hfZXh0ZXJuYWwoc3RydWN0IGZpYl90YWJsZSAqdGIpCit7CisJc3RydWN0IHRyaWUgKnQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqcG4gPSB0LT5rdjsKKwl1bnNpZ25lZCBsb25nIGNpbmRleCA9IDE7CisJc3RydWN0IGhsaXN0X25vZGUgKnRtcDsKKwlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKKworCS8qIHdhbGsgdHJpZSBpbiByZXZlcnNlIG9yZGVyICovCisJZm9yICg7OykgeworCQl1bnNpZ25lZCBjaGFyIHNsZW4gPSAwOworCQlzdHJ1Y3Qga2V5X3ZlY3RvciAqbjsKKworCQlpZiAoIShjaW5kZXgtLSkpIHsKKwkJCXRfa2V5IHBrZXkgPSBwbi0+a2V5OworCisJCQkvKiBjYW5ub3QgcmVzaXplIHRoZSB0cmllIHZlY3RvciAqLworCQkJaWYgKElTX1RSSUUocG4pKQorCQkJCWJyZWFrOworCisJCQkvKiByZXNpemUgY29tcGxldGVkIG5vZGUgKi8KKwkJCXBuID0gcmVzaXplKHQsIHBuKTsKKwkJCWNpbmRleCA9IGdldF9pbmRleChwa2V5LCBwbik7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogZ3JhYiB0aGUgbmV4dCBhdmFpbGFibGUgbm9kZSAqLworCQluID0gZ2V0X2NoaWxkKHBuLCBjaW5kZXgpOworCQlpZiAoIW4pCisJCQljb250aW51ZTsKKworCQlpZiAoSVNfVE5PREUobikpIHsKKwkJCS8qIHJlY29yZCBwbiBhbmQgY2luZGV4IGZvciBsZWFmIHdhbGtpbmcgKi8KKwkJCXBuID0gbjsKKwkJCWNpbmRleCA9IDF1bCA8PCBuLT5iaXRzOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmEsIHRtcCwgJm4tPmxlYWYsIGZhX2xpc3QpIHsKKwkJCXN0cnVjdCBmaWJfaW5mbyAqZmkgPSBmYS0+ZmFfaW5mbzsKKworCQkJLyogaWYgYWxpYXMgd2FzIGNsb25lZCB0byBsb2NhbCB0aGVuIHdlIGp1c3QKKwkJCSAqIG5lZWQgdG8gcmVtb3ZlIHRoZSBsb2NhbCBjb3B5IGZyb20gbWFpbgorCQkJICovCisJCQlpZiAodGItPnRiX2lkICE9IGZhLT50Yl9pZCkgeworCQkJCWhsaXN0X2RlbF9yY3UoJmZhLT5mYV9saXN0KTsKKwkJCQlhbGlhc19mcmVlX21lbV9yY3UoZmEpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiByZWNvcmQgbG9jYWwgc2xlbiAqLworCQkJc2xlbiA9IGZhLT5mYV9zbGVuOworCisJCQlpZiAoIWZpIHx8ICEoZmktPmZpYl9mbGFncyAmIFJUTkhfRl9FWFRFUk5BTCkpCisJCQkJY29udGludWU7CisKKwkJCW5ldGRldl9zd2l0Y2hfZmliX2lwdjRfZGVsKG4tPmtleSwKKwkJCQkJCSAgIEtFWUxFTkdUSCAtIGZhLT5mYV9zbGVuLAorCQkJCQkJICAgZmksIGZhLT5mYV90b3MsCisJCQkJCQkgICBmYS0+ZmFfdHlwZSwgdGItPnRiX2lkKTsKKwkJfQorCisJCS8qIHVwZGF0ZSBsZWFmIHNsZW4gKi8KKwkJbi0+c2xlbiA9IHNsZW47CisKKwkJaWYgKGhsaXN0X2VtcHR5KCZuLT5sZWFmKSkgeworCQkJcHV0X2NoaWxkX3Jvb3QocG4sIG4tPmtleSwgTlVMTCk7CisJCQlub2RlX2ZyZWUobik7CisJCX0gZWxzZSB7CisJCQlsZWFmX3B1bGxfc3VmZml4KHBuLCBuKTsKKwkJfQorCX0KK30KKworLyogQ2FsbGVyIG11c3QgaG9sZCBSVE5MLiAqLworaW50IGZpYl90YWJsZV9mbHVzaChzdHJ1Y3QgZmliX3RhYmxlICp0YikKK3sKKwlzdHJ1Y3QgdHJpZSAqdCA9IChzdHJ1Y3QgdHJpZSAqKXRiLT50Yl9kYXRhOworCXN0cnVjdCBrZXlfdmVjdG9yICpwbiA9IHQtPmt2OworCXVuc2lnbmVkIGxvbmcgY2luZGV4ID0gMTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOworCXN0cnVjdCBmaWJfYWxpYXMgKmZhOwogCWludCBmb3VuZCA9IDA7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmEsIGZhX25vZGUsIGhlYWQsIGZhX2xpc3QpIHsKLQkJc3RydWN0IGZpYl9pbmZvICpmaSA9IGZhLT5mYV9pbmZvOworCS8qIHdhbGsgdHJpZSBpbiByZXZlcnNlIG9yZGVyICovCisJZm9yICg7OykgeworCQl1bnNpZ25lZCBjaGFyIHNsZW4gPSAwOworCQlzdHJ1Y3Qga2V5X3ZlY3RvciAqbjsKIAotCQlpZiAoZmkgJiYgKGZpLT5maWJfZmxhZ3MgJiBSVE5IX0ZfREVBRCkpIHsKLQkJCWxpc3RfZGVsX3JjdSgmZmEtPmZhX2xpc3QpOworCQlpZiAoIShjaW5kZXgtLSkpIHsKKwkJCXRfa2V5IHBrZXkgPSBwbi0+a2V5OworCisJCQkvKiBjYW5ub3QgcmVzaXplIHRoZSB0cmllIHZlY3RvciAqLworCQkJaWYgKElTX1RSSUUocG4pKQorCQkJCWJyZWFrOworCisJCQkvKiByZXNpemUgY29tcGxldGVkIG5vZGUgKi8KKwkJCXBuID0gcmVzaXplKHQsIHBuKTsKKwkJCWNpbmRleCA9IGdldF9pbmRleChwa2V5LCBwbik7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogZ3JhYiB0aGUgbmV4dCBhdmFpbGFibGUgbm9kZSAqLworCQluID0gZ2V0X2NoaWxkKHBuLCBjaW5kZXgpOworCQlpZiAoIW4pCisJCQljb250aW51ZTsKKworCQlpZiAoSVNfVE5PREUobikpIHsKKwkJCS8qIHJlY29yZCBwbiBhbmQgY2luZGV4IGZvciBsZWFmIHdhbGtpbmcgKi8KKwkJCXBuID0gbjsKKwkJCWNpbmRleCA9IDF1bCA8PCBuLT5iaXRzOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmEsIHRtcCwgJm4tPmxlYWYsIGZhX2xpc3QpIHsKKwkJCXN0cnVjdCBmaWJfaW5mbyAqZmkgPSBmYS0+ZmFfaW5mbzsKKworCQkJaWYgKCFmaSB8fCAhKGZpLT5maWJfZmxhZ3MgJiBSVE5IX0ZfREVBRCkpIHsKKwkJCQlzbGVuID0gZmEtPmZhX3NsZW47CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCW5ldGRldl9zd2l0Y2hfZmliX2lwdjRfZGVsKG4tPmtleSwKKwkJCQkJCSAgIEtFWUxFTkdUSCAtIGZhLT5mYV9zbGVuLAorCQkJCQkJICAgZmksIGZhLT5mYV90b3MsCisJCQkJCQkgICBmYS0+ZmFfdHlwZSwgdGItPnRiX2lkKTsKKwkJCWhsaXN0X2RlbF9yY3UoJmZhLT5mYV9saXN0KTsKIAkJCWZpYl9yZWxlYXNlX2luZm8oZmEtPmZhX2luZm8pOwogCQkJYWxpYXNfZnJlZV9tZW1fcmN1KGZhKTsKIAkJCWZvdW5kKys7CiAJCX0KLQl9Ci0JcmV0dXJuIGZvdW5kOwotfQogCi1zdGF0aWMgaW50IHRyaWVfZmx1c2hfbGVhZihzdHJ1Y3QgdG5vZGUgKmwpCi17Ci0JaW50IGZvdW5kID0gMDsKLQlzdHJ1Y3QgaGxpc3RfaGVhZCAqbGloID0gJmwtPmxpc3Q7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKnRtcDsKLQlzdHJ1Y3QgbGVhZl9pbmZvICpsaSA9IE5VTEw7Ci0JdW5zaWduZWQgY2hhciBwbGVuID0gS0VZTEVOR1RIOworCQkvKiB1cGRhdGUgbGVhZiBzbGVuICovCisJCW4tPnNsZW4gPSBzbGVuOwogCi0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsaSwgdG1wLCBsaWgsIGhsaXN0KSB7Ci0JCWZvdW5kICs9IHRyaWVfZmx1c2hfbGlzdCgmbGktPmZhbGgpOwotCi0JCWlmIChsaXN0X2VtcHR5KCZsaS0+ZmFsaCkpIHsKLQkJCWhsaXN0X2RlbF9yY3UoJmxpLT5obGlzdCk7Ci0JCQlmcmVlX2xlYWZfaW5mbyhsaSk7Ci0JCQljb250aW51ZTsKKwkJaWYgKGhsaXN0X2VtcHR5KCZuLT5sZWFmKSkgeworCQkJcHV0X2NoaWxkX3Jvb3QocG4sIG4tPmtleSwgTlVMTCk7CisJCQlub2RlX2ZyZWUobik7CisJCX0gZWxzZSB7CisJCQlsZWFmX3B1bGxfc3VmZml4KHBuLCBuKTsKIAkJfQotCi0JCXBsZW4gPSBsaS0+cGxlbjsKLQl9Ci0KLQlsLT5zbGVuID0gS0VZTEVOR1RIIC0gcGxlbjsKLQotCXJldHVybiBmb3VuZDsKLX0KLQotLyoKLSAqIFNjYW4gZm9yIHRoZSBuZXh0IHJpZ2h0IGxlYWYgc3RhcnRpbmcgYXQgbm9kZSBwLT5jaGlsZFtpZHhdCi0gKiBTaW5jZSB3ZSBoYXZlIGJhY2sgcG9pbnRlciwgbm8gcmVjdXJzaW9uIG5lY2Vzc2FyeS4KLSAqLwotc3RhdGljIHN0cnVjdCB0bm9kZSAqbGVhZl93YWxrX3JjdShzdHJ1Y3QgdG5vZGUgKnAsIHN0cnVjdCB0bm9kZSAqYykKLXsKLQlkbyB7Ci0JCXVuc2lnbmVkIGxvbmcgaWR4ID0gYyA/IGlkeCA9IGdldF9pbmRleChjLT5rZXksIHApICsgMSA6IDA7Ci0KLQkJd2hpbGUgKGlkeCA8IHRub2RlX2NoaWxkX2xlbmd0aChwKSkgewotCQkJYyA9IHRub2RlX2dldF9jaGlsZF9yY3UocCwgaWR4KyspOwotCQkJaWYgKCFjKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoSVNfTEVBRihjKSkKLQkJCQlyZXR1cm4gYzsKLQotCQkJLyogUmVzY2FuIHN0YXJ0IHNjYW5uaW5nIGluIG5ldyBub2RlICovCi0JCQlwID0gYzsKLQkJCWlkeCA9IDA7Ci0JCX0KLQotCQkvKiBOb2RlIGVtcHR5LCB3YWxrIGJhY2sgdXAgdG8gcGFyZW50ICovCi0JCWMgPSBwOwotCX0gd2hpbGUgKChwID0gbm9kZV9wYXJlbnRfcmN1KGMpKSAhPSBOVUxMKTsKLQotCXJldHVybiBOVUxMOyAvKiBSb290IG9mIHRyaWUgKi8KLX0KLQotc3RhdGljIHN0cnVjdCB0bm9kZSAqdHJpZV9maXJzdGxlYWYoc3RydWN0IHRyaWUgKnQpCi17Ci0Jc3RydWN0IHRub2RlICpuID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwodC0+dHJpZSk7Ci0KLQlpZiAoIW4pCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKElTX0xFQUYobikpICAgICAgICAgIC8qIHRyaWUgaXMganVzdCBhIGxlYWYgKi8KLQkJcmV0dXJuIG47Ci0KLQlyZXR1cm4gbGVhZl93YWxrX3JjdShuLCBOVUxMKTsKLX0KLQotc3RhdGljIHN0cnVjdCB0bm9kZSAqdHJpZV9uZXh0bGVhZihzdHJ1Y3QgdG5vZGUgKmwpCi17Ci0Jc3RydWN0IHRub2RlICpwID0gbm9kZV9wYXJlbnRfcmN1KGwpOwotCi0JaWYgKCFwKQotCQlyZXR1cm4gTlVMTDsJLyogdHJpZSB3aXRoIGp1c3Qgb25lIGxlYWYgKi8KLQotCXJldHVybiBsZWFmX3dhbGtfcmN1KHAsIGwpOwotfQotCi1zdGF0aWMgc3RydWN0IHRub2RlICp0cmllX2xlYWZpbmRleChzdHJ1Y3QgdHJpZSAqdCwgaW50IGluZGV4KQotewotCXN0cnVjdCB0bm9kZSAqbCA9IHRyaWVfZmlyc3RsZWFmKHQpOwotCi0Jd2hpbGUgKGwgJiYgaW5kZXgtLSA+IDApCi0JCWwgPSB0cmllX25leHRsZWFmKGwpOwotCi0JcmV0dXJuIGw7Ci19Ci0KLQotLyoKLSAqIENhbGxlciBtdXN0IGhvbGQgUlROTC4KLSAqLwotaW50IGZpYl90YWJsZV9mbHVzaChzdHJ1Y3QgZmliX3RhYmxlICp0YikKLXsKLQlzdHJ1Y3QgdHJpZSAqdCA9IChzdHJ1Y3QgdHJpZSAqKSB0Yi0+dGJfZGF0YTsKLQlzdHJ1Y3QgdG5vZGUgKmwsICpsbCA9IE5VTEw7Ci0JaW50IGZvdW5kID0gMDsKLQotCWZvciAobCA9IHRyaWVfZmlyc3RsZWFmKHQpOyBsOyBsID0gdHJpZV9uZXh0bGVhZihsKSkgewotCQlmb3VuZCArPSB0cmllX2ZsdXNoX2xlYWYobCk7Ci0KLQkJaWYgKGxsKSB7Ci0JCQlpZiAoaGxpc3RfZW1wdHkoJmxsLT5saXN0KSkKLQkJCQl0cmllX2xlYWZfcmVtb3ZlKHQsIGxsKTsKLQkJCWVsc2UKLQkJCQlsZWFmX3B1bGxfc3VmZml4KGxsKTsKLQkJfQotCi0JCWxsID0gbDsKLQl9Ci0KLQlpZiAobGwpIHsKLQkJaWYgKGhsaXN0X2VtcHR5KCZsbC0+bGlzdCkpCi0JCQl0cmllX2xlYWZfcmVtb3ZlKHQsIGxsKTsKLQkJZWxzZQotCQkJbGVhZl9wdWxsX3N1ZmZpeChsbCk7CiAJfQogCiAJcHJfZGVidWcoInRyaWVfZmx1c2ggZm91bmQ9JWRcbiIsIGZvdW5kKTsKIAlyZXR1cm4gZm91bmQ7CiB9CiAKLXZvaWQgZmliX2ZyZWVfdGFibGUoc3RydWN0IGZpYl90YWJsZSAqdGIpCitzdGF0aWMgdm9pZCBfX3RyaWVfZnJlZV9yY3Uoc3RydWN0IHJjdV9oZWFkICpoZWFkKQogeworCXN0cnVjdCBmaWJfdGFibGUgKnRiID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBmaWJfdGFibGUsIHJjdSk7CiAjaWZkZWYgQ09ORklHX0lQX0ZJQl9UUklFX1NUQVRTCiAJc3RydWN0IHRyaWUgKnQgPSAoc3RydWN0IHRyaWUgKil0Yi0+dGJfZGF0YTsKIAotCWZyZWVfcGVyY3B1KHQtPnN0YXRzKTsKKwlpZiAodGItPnRiX2RhdGEgPT0gdGItPl9fZGF0YSkKKwkJZnJlZV9wZXJjcHUodC0+c3RhdHMpOwogI2VuZGlmIC8qIENPTkZJR19JUF9GSUJfVFJJRV9TVEFUUyAqLwogCWtmcmVlKHRiKTsKIH0KIAotc3RhdGljIGludCBmbl90cmllX2R1bXBfZmEodF9rZXkga2V5LCBpbnQgcGxlbiwgc3RydWN0IGxpc3RfaGVhZCAqZmFoLAotCQkJICAgc3RydWN0IGZpYl90YWJsZSAqdGIsCi0JCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit2b2lkIGZpYl9mcmVlX3RhYmxlKHN0cnVjdCBmaWJfdGFibGUgKnRiKQogewotCWludCBpLCBzX2k7Ci0Jc3RydWN0IGZpYl9hbGlhcyAqZmE7Ci0JX19iZTMyIHhrZXkgPSBodG9ubChrZXkpOworCWNhbGxfcmN1KCZ0Yi0+cmN1LCBfX3RyaWVfZnJlZV9yY3UpOworfQogCi0Jc19pID0gY2ItPmFyZ3NbNV07CitzdGF0aWMgaW50IGZuX3RyaWVfZHVtcF9sZWFmKHN0cnVjdCBrZXlfdmVjdG9yICpsLCBzdHJ1Y3QgZmliX3RhYmxlICp0YiwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCV9fYmUzMiB4a2V5ID0gaHRvbmwobC0+a2V5KTsKKwlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKKwlpbnQgaSwgc19pOworCisJc19pID0gY2ItPmFyZ3NbNF07CiAJaSA9IDA7CiAKIAkvKiByY3VfcmVhZF9sb2NrIGlzIGhvbGQgYnkgY2FsbGVyICovCi0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShmYSwgZmFoLCBmYV9saXN0KSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGZhLCAmbC0+bGVhZiwgZmFfbGlzdCkgewogCQlpZiAoaSA8IHNfaSkgewogCQkJaSsrOwogCQkJY29udGludWU7CiAJCX0KIAorCQlpZiAodGItPnRiX2lkICE9IGZhLT50Yl9pZCkgeworCQkJaSsrOworCQkJY29udGludWU7CisJCX0KKwogCQlpZiAoZmliX2R1bXBfaW5mbyhza2IsIE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAogCQkJCSAgY2ItPm5saC0+bmxtc2dfc2VxLAogCQkJCSAgUlRNX05FV1JPVVRFLAogCQkJCSAgdGItPnRiX2lkLAogCQkJCSAgZmEtPmZhX3R5cGUsCiAJCQkJICB4a2V5LAotCQkJCSAgcGxlbiwKKwkJCQkgIEtFWUxFTkdUSCAtIGZhLT5mYV9zbGVuLAogCQkJCSAgZmEtPmZhX3RvcywKIAkJCQkgIGZhLT5mYV9pbmZvLCBOTE1fRl9NVUxUSSkgPCAwKSB7Ci0JCQljYi0+YXJnc1s1XSA9IGk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJaSsrOwotCX0KLQljYi0+YXJnc1s1XSA9IGk7Ci0JcmV0dXJuIHNrYi0+bGVuOwotfQotCi1zdGF0aWMgaW50IGZuX3RyaWVfZHVtcF9sZWFmKHN0cnVjdCB0bm9kZSAqbCwgc3RydWN0IGZpYl90YWJsZSAqdGIsCi0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCi17Ci0Jc3RydWN0IGxlYWZfaW5mbyAqbGk7Ci0JaW50IGksIHNfaTsKLQotCXNfaSA9IGNiLT5hcmdzWzRdOwotCWkgPSAwOwotCi0JLyogcmN1X3JlYWRfbG9jayBpcyBob2xkIGJ5IGNhbGxlciAqLwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShsaSwgJmwtPmxpc3QsIGhsaXN0KSB7Ci0JCWlmIChpIDwgc19pKSB7Ci0JCQlpKys7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChpID4gc19pKQotCQkJY2ItPmFyZ3NbNV0gPSAwOwotCi0JCWlmIChsaXN0X2VtcHR5KCZsaS0+ZmFsaCkpCi0JCQljb250aW51ZTsKLQotCQlpZiAoZm5fdHJpZV9kdW1wX2ZhKGwtPmtleSwgbGktPnBsZW4sICZsaS0+ZmFsaCwgdGIsIHNrYiwgY2IpIDwgMCkgewogCQkJY2ItPmFyZ3NbNF0gPSBpOwogCQkJcmV0dXJuIC0xOwogCQl9CkBAIC0xODAxLDQ0ICsxOTE4LDM4IEBACiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCisvKiByY3VfcmVhZF9sb2NrIG5lZWRzIHRvIGJlIGhvbGQgYnkgY2FsbGVyIGZyb20gcmVhZHNpZGUgKi8KIGludCBmaWJfdGFibGVfZHVtcChzdHJ1Y3QgZmliX3RhYmxlICp0Yiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQogewotCXN0cnVjdCB0bm9kZSAqbDsKLQlzdHJ1Y3QgdHJpZSAqdCA9IChzdHJ1Y3QgdHJpZSAqKSB0Yi0+dGJfZGF0YTsKLQl0X2tleSBrZXkgPSBjYi0+YXJnc1syXTsKLQlpbnQgY291bnQgPSBjYi0+YXJnc1szXTsKLQotCXJjdV9yZWFkX2xvY2soKTsKKwlzdHJ1Y3QgdHJpZSAqdCA9IChzdHJ1Y3QgdHJpZSAqKXRiLT50Yl9kYXRhOworCXN0cnVjdCBrZXlfdmVjdG9yICpsLCAqdHAgPSB0LT5rdjsKIAkvKiBEdW1wIHN0YXJ0aW5nIGF0IGxhc3Qga2V5LgogCSAqIE5vdGU6IDAuMC4wLjAvMCAoaWUgZGVmYXVsdCkgaXMgZmlyc3Qga2V5LgogCSAqLwotCWlmIChjb3VudCA9PSAwKQotCQlsID0gdHJpZV9maXJzdGxlYWYodCk7Ci0JZWxzZSB7Ci0JCS8qIE5vcm1hbGx5LCBjb250aW51ZSBmcm9tIGxhc3Qga2V5LCBidXQgaWYgdGhhdCBpcyBtaXNzaW5nCi0JCSAqIGZhbGxiYWNrIHRvIHVzaW5nIHNsb3cgcmVzY2FuCi0JCSAqLwotCQlsID0gZmliX2ZpbmRfbm9kZSh0LCBrZXkpOwotCQlpZiAoIWwpCi0JCQlsID0gdHJpZV9sZWFmaW5kZXgodCwgY291bnQpOwotCX0KKwlpbnQgY291bnQgPSBjYi0+YXJnc1syXTsKKwl0X2tleSBrZXkgPSBjYi0+YXJnc1szXTsKIAotCXdoaWxlIChsKSB7Ci0JCWNiLT5hcmdzWzJdID0gbC0+a2V5OworCXdoaWxlICgobCA9IGxlYWZfd2Fsa19yY3UoJnRwLCBrZXkpKSAhPSBOVUxMKSB7CiAJCWlmIChmbl90cmllX2R1bXBfbGVhZihsLCB0Yiwgc2tiLCBjYikgPCAwKSB7Ci0JCQljYi0+YXJnc1szXSA9IGNvdW50OwotCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQljYi0+YXJnc1szXSA9IGtleTsKKwkJCWNiLT5hcmdzWzJdID0gY291bnQ7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAogCQkrK2NvdW50OwotCQlsID0gdHJpZV9uZXh0bGVhZihsKTsKKwkJa2V5ID0gbC0+a2V5ICsgMTsKKwogCQltZW1zZXQoJmNiLT5hcmdzWzRdLCAwLAogCQkgICAgICAgc2l6ZW9mKGNiLT5hcmdzKSAtIDQqc2l6ZW9mKGNiLT5hcmdzWzBdKSk7CisKKwkJLyogc3RvcCBsb29wIGlmIGtleSB3cmFwcGVkIGJhY2sgdG8gMCAqLworCQlpZiAoa2V5IDwgbC0+a2V5KQorCQkJYnJlYWs7CiAJfQotCWNiLT5hcmdzWzNdID0gY291bnQ7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisKKwljYi0+YXJnc1szXSA9IGtleTsKKwljYi0+YXJnc1syXSA9IGNvdW50OwogCiAJcmV0dXJuIHNrYi0+bGVuOwogfQpAQCAtMTg1MCwyOCArMTk2MSwzNCBAQAogCQkJCQkgIDAsIFNMQUJfUEFOSUMsIE5VTEwpOwogCiAJdHJpZV9sZWFmX2ttZW0gPSBrbWVtX2NhY2hlX2NyZWF0ZSgiaXBfZmliX3RyaWUiLAotCQkJCQkgICBtYXgoc2l6ZW9mKHN0cnVjdCB0bm9kZSksCi0JCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGxlYWZfaW5mbykpLAorCQkJCQkgICBMRUFGX1NJWkUsCiAJCQkJCSAgIDAsIFNMQUJfUEFOSUMsIE5VTEwpOwogfQogCi0KLXN0cnVjdCBmaWJfdGFibGUgKmZpYl90cmllX3RhYmxlKHUzMiBpZCkKK3N0cnVjdCBmaWJfdGFibGUgKmZpYl90cmllX3RhYmxlKHUzMiBpZCwgc3RydWN0IGZpYl90YWJsZSAqYWxpYXMpCiB7CiAJc3RydWN0IGZpYl90YWJsZSAqdGI7CiAJc3RydWN0IHRyaWUgKnQ7CisJc2l6ZV90IHN6ID0gc2l6ZW9mKCp0Yik7CiAKLQl0YiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmaWJfdGFibGUpICsgc2l6ZW9mKHN0cnVjdCB0cmllKSwKLQkJICAgICBHRlBfS0VSTkVMKTsKLQlpZiAodGIgPT0gTlVMTCkKKwlpZiAoIWFsaWFzKQorCQlzeiArPSBzaXplb2Yoc3RydWN0IHRyaWUpOworCisJdGIgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRiKQogCQlyZXR1cm4gTlVMTDsKIAogCXRiLT50Yl9pZCA9IGlkOwogCXRiLT50Yl9kZWZhdWx0ID0gLTE7CiAJdGItPnRiX251bV9kZWZhdWx0ID0gMDsKKwl0Yi0+dGJfZGF0YSA9IChhbGlhcyA/IGFsaWFzLT5fX2RhdGEgOiB0Yi0+X19kYXRhKTsKKworCWlmIChhbGlhcykKKwkJcmV0dXJuIHRiOwogCiAJdCA9IChzdHJ1Y3QgdHJpZSAqKSB0Yi0+dGJfZGF0YTsKLQlSQ1VfSU5JVF9QT0lOVEVSKHQtPnRyaWUsIE5VTEwpOworCXQtPmt2WzBdLnBvcyA9IEtFWUxFTkdUSDsKKwl0LT5rdlswXS5zbGVuID0gS0VZTEVOR1RIOwogI2lmZGVmIENPTkZJR19JUF9GSUJfVFJJRV9TVEFUUwogCXQtPnN0YXRzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCB0cmllX3VzZV9zdGF0cyk7CiAJaWYgKCF0LT5zdGF0cykgewpAQCAtMTg4OCw2NSArMjAwNSw2MyBAQAogc3RydWN0IGZpYl90cmllX2l0ZXIgewogCXN0cnVjdCBzZXFfbmV0X3ByaXZhdGUgcDsKIAlzdHJ1Y3QgZmliX3RhYmxlICp0YjsKLQlzdHJ1Y3QgdG5vZGUgKnRub2RlOworCXN0cnVjdCBrZXlfdmVjdG9yICp0bm9kZTsKIAl1bnNpZ25lZCBpbnQgaW5kZXg7CiAJdW5zaWduZWQgaW50IGRlcHRoOwogfTsKIAotc3RhdGljIHN0cnVjdCB0bm9kZSAqZmliX3RyaWVfZ2V0X25leHQoc3RydWN0IGZpYl90cmllX2l0ZXIgKml0ZXIpCitzdGF0aWMgc3RydWN0IGtleV92ZWN0b3IgKmZpYl90cmllX2dldF9uZXh0KHN0cnVjdCBmaWJfdHJpZV9pdGVyICppdGVyKQogewogCXVuc2lnbmVkIGxvbmcgY2luZGV4ID0gaXRlci0+aW5kZXg7Ci0Jc3RydWN0IHRub2RlICp0biA9IGl0ZXItPnRub2RlOwotCXN0cnVjdCB0bm9kZSAqcDsKLQotCS8qIEEgc2luZ2xlIGVudHJ5IHJvdXRpbmcgdGFibGUgKi8KLQlpZiAoIXRuKQotCQlyZXR1cm4gTlVMTDsKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqcG4gPSBpdGVyLT50bm9kZTsKKwl0X2tleSBwa2V5OwogCiAJcHJfZGVidWcoImdldF9uZXh0IGl0ZXI9e25vZGU9JXAgaW5kZXg9JWQgZGVwdGg9JWR9XG4iLAogCQkgaXRlci0+dG5vZGUsIGl0ZXItPmluZGV4LCBpdGVyLT5kZXB0aCk7Ci1yZXNjYW46Ci0Jd2hpbGUgKGNpbmRleCA8IHRub2RlX2NoaWxkX2xlbmd0aCh0bikpIHsKLQkJc3RydWN0IHRub2RlICpuID0gdG5vZGVfZ2V0X2NoaWxkX3JjdSh0biwgY2luZGV4KTsKIAotCQlpZiAobikgeworCXdoaWxlICghSVNfVFJJRShwbikpIHsKKwkJd2hpbGUgKGNpbmRleCA8IGNoaWxkX2xlbmd0aChwbikpIHsKKwkJCXN0cnVjdCBrZXlfdmVjdG9yICpuID0gZ2V0X2NoaWxkX3JjdShwbiwgY2luZGV4KyspOworCisJCQlpZiAoIW4pCisJCQkJY29udGludWU7CisKIAkJCWlmIChJU19MRUFGKG4pKSB7Ci0JCQkJaXRlci0+dG5vZGUgPSB0bjsKLQkJCQlpdGVyLT5pbmRleCA9IGNpbmRleCArIDE7CisJCQkJaXRlci0+dG5vZGUgPSBwbjsKKwkJCQlpdGVyLT5pbmRleCA9IGNpbmRleDsKIAkJCX0gZWxzZSB7CiAJCQkJLyogcHVzaCBkb3duIG9uZSBsZXZlbCAqLwogCQkJCWl0ZXItPnRub2RlID0gbjsKIAkJCQlpdGVyLT5pbmRleCA9IDA7CiAJCQkJKytpdGVyLT5kZXB0aDsKIAkJCX0KKwogCQkJcmV0dXJuIG47CiAJCX0KIAotCQkrK2NpbmRleDsKLQl9Ci0KLQkvKiBDdXJyZW50IG5vZGUgZXhoYXVzdGVkLCBwb3AgYmFjayB1cCAqLwotCXAgPSBub2RlX3BhcmVudF9yY3UodG4pOwotCWlmIChwKSB7Ci0JCWNpbmRleCA9IGdldF9pbmRleCh0bi0+a2V5LCBwKSArIDE7Ci0JCXRuID0gcDsKKwkJLyogQ3VycmVudCBub2RlIGV4aGF1c3RlZCwgcG9wIGJhY2sgdXAgKi8KKwkJcGtleSA9IHBuLT5rZXk7CisJCXBuID0gbm9kZV9wYXJlbnRfcmN1KHBuKTsKKwkJY2luZGV4ID0gZ2V0X2luZGV4KHBrZXksIHBuKSArIDE7CiAJCS0taXRlci0+ZGVwdGg7Ci0JCWdvdG8gcmVzY2FuOwogCX0KIAotCS8qIGdvdCByb290PyAqLworCS8qIHJlY29yZCByb290IG5vZGUgc28gZnVydGhlciBzZWFyY2hlcyBrbm93IHdlIGFyZSBkb25lICovCisJaXRlci0+dG5vZGUgPSBwbjsKKwlpdGVyLT5pbmRleCA9IDA7CisKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCB0bm9kZSAqZmliX3RyaWVfZ2V0X2ZpcnN0KHN0cnVjdCBmaWJfdHJpZV9pdGVyICppdGVyLAotCQkJCSAgICAgICBzdHJ1Y3QgdHJpZSAqdCkKK3N0YXRpYyBzdHJ1Y3Qga2V5X3ZlY3RvciAqZmliX3RyaWVfZ2V0X2ZpcnN0KHN0cnVjdCBmaWJfdHJpZV9pdGVyICppdGVyLAorCQkJCQkgICAgIHN0cnVjdCB0cmllICp0KQogewotCXN0cnVjdCB0bm9kZSAqbjsKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqbiwgKnBuID0gdC0+a3Y7CiAKIAlpZiAoIXQpCiAJCXJldHVybiBOVUxMOwogCi0JbiA9IHJjdV9kZXJlZmVyZW5jZSh0LT50cmllKTsKKwluID0gcmN1X2RlcmVmZXJlbmNlKHBuLT50bm9kZVswXSk7CiAJaWYgKCFuKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTk1NSw3ICsyMDcwLDcgQEAKIAkJaXRlci0+aW5kZXggPSAwOwogCQlpdGVyLT5kZXB0aCA9IDE7CiAJfSBlbHNlIHsKLQkJaXRlci0+dG5vZGUgPSBOVUxMOworCQlpdGVyLT50bm9kZSA9IHBuOwogCQlpdGVyLT5pbmRleCA9IDA7CiAJCWl0ZXItPmRlcHRoID0gMDsKIAl9CkBAIC0xOTY1LDcgKzIwODAsNyBAQAogCiBzdGF0aWMgdm9pZCB0cmllX2NvbGxlY3Rfc3RhdHMoc3RydWN0IHRyaWUgKnQsIHN0cnVjdCB0cmllX3N0YXQgKnMpCiB7Ci0Jc3RydWN0IHRub2RlICpuOworCXN0cnVjdCBrZXlfdmVjdG9yICpuOwogCXN0cnVjdCBmaWJfdHJpZV9pdGVyIGl0ZXI7CiAKIAltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CkBAIC0xOTczLDIwICsyMDg4LDIwIEBACiAJcmN1X3JlYWRfbG9jaygpOwogCWZvciAobiA9IGZpYl90cmllX2dldF9maXJzdCgmaXRlciwgdCk7IG47IG4gPSBmaWJfdHJpZV9nZXRfbmV4dCgmaXRlcikpIHsKIAkJaWYgKElTX0xFQUYobikpIHsKLQkJCXN0cnVjdCBsZWFmX2luZm8gKmxpOworCQkJc3RydWN0IGZpYl9hbGlhcyAqZmE7CiAKIAkJCXMtPmxlYXZlcysrOwogCQkJcy0+dG90ZGVwdGggKz0gaXRlci5kZXB0aDsKIAkJCWlmIChpdGVyLmRlcHRoID4gcy0+bWF4ZGVwdGgpCiAJCQkJcy0+bWF4ZGVwdGggPSBpdGVyLmRlcHRoOwogCi0JCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobGksICZuLT5saXN0LCBobGlzdCkKKwkJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShmYSwgJm4tPmxlYWYsIGZhX2xpc3QpCiAJCQkJKytzLT5wcmVmaXhlczsKIAkJfSBlbHNlIHsKIAkJCXMtPnRub2RlcysrOwogCQkJaWYgKG4tPmJpdHMgPCBNQVhfU1RBVF9ERVBUSCkKIAkJCQlzLT5ub2Rlc2l6ZXNbbi0+Yml0c10rKzsKLQkJCXMtPm51bGxwb2ludGVycyArPSBuLT5lbXB0eV9jaGlsZHJlbjsKKwkJCXMtPm51bGxwb2ludGVycyArPSB0bl9pbmZvKG4pLT5lbXB0eV9jaGlsZHJlbjsKIAkJfQogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTIwMDksMTMgKzIxMjQsMTMgQEAKIAlzZXFfcHJpbnRmKHNlcSwgIlx0TWF4IGRlcHRoOiAgICAgICV1XG4iLCBzdGF0LT5tYXhkZXB0aCk7CiAKIAlzZXFfcHJpbnRmKHNlcSwgIlx0TGVhdmVzOiAgICAgICAgICV1XG4iLCBzdGF0LT5sZWF2ZXMpOwotCWJ5dGVzID0gc2l6ZW9mKHN0cnVjdCB0bm9kZSkgKiBzdGF0LT5sZWF2ZXM7CisJYnl0ZXMgPSBMRUFGX1NJWkUgKiBzdGF0LT5sZWF2ZXM7CiAKIAlzZXFfcHJpbnRmKHNlcSwgIlx0UHJlZml4ZXM6ICAgICAgICV1XG4iLCBzdGF0LT5wcmVmaXhlcyk7Ci0JYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCBsZWFmX2luZm8pICogc3RhdC0+cHJlZml4ZXM7CisJYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCBmaWJfYWxpYXMpICogc3RhdC0+cHJlZml4ZXM7CiAKIAlzZXFfcHJpbnRmKHNlcSwgIlx0SW50ZXJuYWwgbm9kZXM6ICV1XG5cdCIsIHN0YXQtPnRub2Rlcyk7Ci0JYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCB0bm9kZSkgKiBzdGF0LT50bm9kZXM7CisJYnl0ZXMgKz0gVE5PREVfU0laRSgwKSAqIHN0YXQtPnRub2RlczsKIAogCW1heCA9IE1BWF9TVEFUX0RFUFRIOwogCXdoaWxlIChtYXggPiAwICYmIHN0YXQtPm5vZGVzaXplc1ttYXgtMV0gPT0gMCkKQEAgLTIwMzAsNyArMjE0NSw3IEBACiAJc2VxX3B1dGMoc2VxLCAnXG4nKTsKIAlzZXFfcHJpbnRmKHNlcSwgIlx0UG9pbnRlcnM6ICV1XG4iLCBwb2ludGVycyk7CiAKLQlieXRlcyArPSBzaXplb2Yoc3RydWN0IHRub2RlICopICogcG9pbnRlcnM7CisJYnl0ZXMgKz0gc2l6ZW9mKHN0cnVjdCBrZXlfdmVjdG9yICopICogcG9pbnRlcnM7CiAJc2VxX3ByaW50ZihzZXEsICJOdWxsIHB0cnM6ICV1XG4iLCBzdGF0LT5udWxscG9pbnRlcnMpOwogCXNlcV9wcmludGYoc2VxLCAiVG90YWwgc2l6ZTogJXUgIGtCXG4iLCAoYnl0ZXMgKyAxMDIzKSAvIDEwMjQpOwogfQpAQCAtMjA4NCw3ICsyMTk5LDcgQEAKIAlzZXFfcHJpbnRmKHNlcSwKIAkJICAgIkJhc2ljIGluZm86IHNpemUgb2YgbGVhZjoiCiAJCSAgICIgJVpkIGJ5dGVzLCBzaXplIG9mIHRub2RlOiAlWmQgYnl0ZXMuXG4iLAotCQkgICBzaXplb2Yoc3RydWN0IHRub2RlKSwgc2l6ZW9mKHN0cnVjdCB0bm9kZSkpOworCQkgICBMRUFGX1NJWkUsIFROT0RFX1NJWkUoMCkpOwogCiAJZm9yIChoID0gMDsgaCA8IEZJQl9UQUJMRV9IQVNIU1o7IGgrKykgewogCQlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZCA9ICZuZXQtPmlwdjQuZmliX3RhYmxlX2hhc2hbaF07CkBAIC0yMTIzLDcgKzIyMzgsNyBAQAogCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2VfbmV0LAogfTsKIAotc3RhdGljIHN0cnVjdCB0bm9kZSAqZmliX3RyaWVfZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKK3N0YXRpYyBzdHJ1Y3Qga2V5X3ZlY3RvciAqZmliX3RyaWVfZ2V0X2lkeChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKIHsKIAlzdHJ1Y3QgZmliX3RyaWVfaXRlciAqaXRlciA9IHNlcS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9uZXQoc2VxKTsKQEAgLTIxMzUsNyArMjI1MCw3IEBACiAJCXN0cnVjdCBmaWJfdGFibGUgKnRiOwogCiAJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0YiwgaGVhZCwgdGJfaGxpc3QpIHsKLQkJCXN0cnVjdCB0bm9kZSAqbjsKKwkJCXN0cnVjdCBrZXlfdmVjdG9yICpuOwogCiAJCQlmb3IgKG4gPSBmaWJfdHJpZV9nZXRfZmlyc3QoaXRlciwKIAkJCQkJCSAgICAoc3RydWN0IHRyaWUgKikgdGItPnRiX2RhdGEpOwpAQCAtMjE2NCw3ICsyMjc5LDcgQEAKIAlzdHJ1Y3QgZmliX3RhYmxlICp0YiA9IGl0ZXItPnRiOwogCXN0cnVjdCBobGlzdF9ub2RlICp0Yl9ub2RlOwogCXVuc2lnbmVkIGludCBoOwotCXN0cnVjdCB0bm9kZSAqbjsKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqbjsKIAogCSsrKnBvczsKIAkvKiBuZXh0IG5vZGUgaW4gc2FtZSB0YWJsZSAqLwpAQCAtMjI1MCw5ICsyMzY1LDkgQEAKIHN0YXRpYyBpbnQgZmliX3RyaWVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7CiAJY29uc3Qgc3RydWN0IGZpYl90cmllX2l0ZXIgKml0ZXIgPSBzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IHRub2RlICpuID0gdjsKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqbiA9IHY7CiAKLQlpZiAoIW5vZGVfcGFyZW50X3JjdShuKSkKKwlpZiAoSVNfVFJJRShub2RlX3BhcmVudF9yY3UobikpKQogCQlmaWJfdGFibGVfcHJpbnQoc2VxLCBpdGVyLT50Yik7CiAKIAlpZiAoSVNfVE5PREUobikpIHsKQEAgLTIyNjEsMzAgKzIzNzYsMjggQEAKIAkJc2VxX2luZGVudChzZXEsIGl0ZXItPmRlcHRoLTEpOwogCQlzZXFfcHJpbnRmKHNlcSwgIiAgKy0tICVwSTQvJXp1ICV1ICV1ICV1XG4iLAogCQkJICAgJnByZiwgS0VZTEVOR1RIIC0gbi0+cG9zIC0gbi0+Yml0cywgbi0+Yml0cywKLQkJCSAgIG4tPmZ1bGxfY2hpbGRyZW4sIG4tPmVtcHR5X2NoaWxkcmVuKTsKKwkJCSAgIHRuX2luZm8obiktPmZ1bGxfY2hpbGRyZW4sCisJCQkgICB0bl9pbmZvKG4pLT5lbXB0eV9jaGlsZHJlbik7CiAJfSBlbHNlIHsKLQkJc3RydWN0IGxlYWZfaW5mbyAqbGk7CiAJCV9fYmUzMiB2YWwgPSBodG9ubChuLT5rZXkpOworCQlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKIAogCQlzZXFfaW5kZW50KHNlcSwgaXRlci0+ZGVwdGgpOwogCQlzZXFfcHJpbnRmKHNlcSwgIiAgfC0tICVwSTRcbiIsICZ2YWwpOwogCi0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShsaSwgJm4tPmxpc3QsIGhsaXN0KSB7Ci0JCQlzdHJ1Y3QgZmliX2FsaWFzICpmYTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGZhLCAmbi0+bGVhZiwgZmFfbGlzdCkgeworCQkJY2hhciBidWYxWzMyXSwgYnVmMlszMl07CiAKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGZhLCAmbGktPmZhbGgsIGZhX2xpc3QpIHsKLQkJCQljaGFyIGJ1ZjFbMzJdLCBidWYyWzMyXTsKLQotCQkJCXNlcV9pbmRlbnQoc2VxLCBpdGVyLT5kZXB0aCsxKTsKLQkJCQlzZXFfcHJpbnRmKHNlcSwgIiAgLyVkICVzICVzIiwgbGktPnBsZW4sCi0JCQkJCSAgIHJ0bl9zY29wZShidWYxLCBzaXplb2YoYnVmMSksCi0JCQkJCQkgICAgIGZhLT5mYV9pbmZvLT5maWJfc2NvcGUpLAotCQkJCQkgICBydG5fdHlwZShidWYyLCBzaXplb2YoYnVmMiksCi0JCQkJCQkgICAgZmEtPmZhX3R5cGUpKTsKLQkJCQlpZiAoZmEtPmZhX3RvcykKLQkJCQkJc2VxX3ByaW50ZihzZXEsICIgdG9zPSVkIiwgZmEtPmZhX3Rvcyk7Ci0JCQkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKLQkJCX0KKwkJCXNlcV9pbmRlbnQoc2VxLCBpdGVyLT5kZXB0aCArIDEpOworCQkJc2VxX3ByaW50ZihzZXEsICIgIC8lenUgJXMgJXMiLAorCQkJCSAgIEtFWUxFTkdUSCAtIGZhLT5mYV9zbGVuLAorCQkJCSAgIHJ0bl9zY29wZShidWYxLCBzaXplb2YoYnVmMSksCisJCQkJCSAgICAgZmEtPmZhX2luZm8tPmZpYl9zY29wZSksCisJCQkJICAgcnRuX3R5cGUoYnVmMiwgc2l6ZW9mKGJ1ZjIpLAorCQkJCQkgICAgZmEtPmZhX3R5cGUpKTsKKwkJCWlmIChmYS0+ZmFfdG9zKQorCQkJCXNlcV9wcmludGYoc2VxLCAiIHRvcz0lZCIsIGZhLT5mYV90b3MpOworCQkJc2VxX3B1dGMoc2VxLCAnXG4nKTsKIAkJfQogCX0KIApAQCAtMjMxNCwzMSArMjQyNyw0NyBAQAogCiBzdHJ1Y3QgZmliX3JvdXRlX2l0ZXIgewogCXN0cnVjdCBzZXFfbmV0X3ByaXZhdGUgcDsKLQlzdHJ1Y3QgdHJpZSAqbWFpbl90cmllOworCXN0cnVjdCBmaWJfdGFibGUgKm1haW5fdGI7CisJc3RydWN0IGtleV92ZWN0b3IgKnRub2RlOwogCWxvZmZfdAlwb3M7CiAJdF9rZXkJa2V5OwogfTsKIAotc3RhdGljIHN0cnVjdCB0bm9kZSAqZmliX3JvdXRlX2dldF9pZHgoc3RydWN0IGZpYl9yb3V0ZV9pdGVyICppdGVyLCBsb2ZmX3QgcG9zKQorc3RhdGljIHN0cnVjdCBrZXlfdmVjdG9yICpmaWJfcm91dGVfZ2V0X2lkeChzdHJ1Y3QgZmliX3JvdXRlX2l0ZXIgKml0ZXIsCisJCQkJCSAgICBsb2ZmX3QgcG9zKQogewotCXN0cnVjdCB0bm9kZSAqbCA9IE5VTEw7Ci0Jc3RydWN0IHRyaWUgKnQgPSBpdGVyLT5tYWluX3RyaWU7CisJc3RydWN0IGZpYl90YWJsZSAqdGIgPSBpdGVyLT5tYWluX3RiOworCXN0cnVjdCBrZXlfdmVjdG9yICpsLCAqKnRwID0gJml0ZXItPnRub2RlOworCXN0cnVjdCB0cmllICp0OworCXRfa2V5IGtleTsKIAotCS8qIHVzZSBjYWNoZSBsb2NhdGlvbiBvZiBsYXN0IGZvdW5kIGtleSAqLwotCWlmIChpdGVyLT5wb3MgPiAwICYmIHBvcyA+PSBpdGVyLT5wb3MgJiYgKGwgPSBmaWJfZmluZF9ub2RlKHQsIGl0ZXItPmtleSkpKQorCS8qIHVzZSBjYWNoZSBsb2NhdGlvbiBvZiBuZXh0LXRvLWZpbmQga2V5ICovCisJaWYgKGl0ZXItPnBvcyA+IDAgJiYgcG9zID49IGl0ZXItPnBvcykgewogCQlwb3MgLT0gaXRlci0+cG9zOwotCWVsc2UgeworCQlrZXkgPSBpdGVyLT5rZXk7CisJfSBlbHNlIHsKKwkJdCA9IChzdHJ1Y3QgdHJpZSAqKXRiLT50Yl9kYXRhOworCQlpdGVyLT50bm9kZSA9IHQtPmt2OwogCQlpdGVyLT5wb3MgPSAwOwotCQlsID0gdHJpZV9maXJzdGxlYWYodCk7CisJCWtleSA9IDA7CiAJfQogCi0Jd2hpbGUgKGwgJiYgcG9zLS0gPiAwKSB7CisJd2hpbGUgKChsID0gbGVhZl93YWxrX3JjdSh0cCwga2V5KSkgIT0gTlVMTCkgeworCQlrZXkgPSBsLT5rZXkgKyAxOwogCQlpdGVyLT5wb3MrKzsKLQkJbCA9IHRyaWVfbmV4dGxlYWYobCk7CisKKwkJaWYgKHBvcy0tIDw9IDApCisJCQlicmVhazsKKworCQlsID0gTlVMTDsKKworCQkvKiBoYW5kbGUgdW5saWtlbHkgY2FzZSBvZiBhIGtleSB3cmFwICovCisJCWlmICgha2V5KQorCQkJYnJlYWs7CiAJfQogCiAJaWYgKGwpCi0JCWl0ZXItPmtleSA9IHBvczsJLyogcmVtZW1iZXIgaXQgKi8KKwkJaXRlci0+a2V5ID0ga2V5OwkvKiByZW1lbWJlciBpdCAqLwogCWVsc2UKIAkJaXRlci0+cG9zID0gMDsJCS8qIGZvcmdldCBpdCAqLwogCkBAIC0yMzUwLDM3ICsyNDc5LDQ2IEBACiB7CiAJc3RydWN0IGZpYl9yb3V0ZV9pdGVyICppdGVyID0gc2VxLT5wcml2YXRlOwogCXN0cnVjdCBmaWJfdGFibGUgKnRiOworCXN0cnVjdCB0cmllICp0OwogCiAJcmN1X3JlYWRfbG9jaygpOworCiAJdGIgPSBmaWJfZ2V0X3RhYmxlKHNlcV9maWxlX25ldChzZXEpLCBSVF9UQUJMRV9NQUlOKTsKIAlpZiAoIXRiKQogCQlyZXR1cm4gTlVMTDsKIAotCWl0ZXItPm1haW5fdHJpZSA9IChzdHJ1Y3QgdHJpZSAqKSB0Yi0+dGJfZGF0YTsKLQlpZiAoKnBvcyA9PSAwKQotCQlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwotCWVsc2UKLQkJcmV0dXJuIGZpYl9yb3V0ZV9nZXRfaWR4KGl0ZXIsICpwb3MgLSAxKTsKKwlpdGVyLT5tYWluX3RiID0gdGI7CisKKwlpZiAoKnBvcyAhPSAwKQorCQlyZXR1cm4gZmliX3JvdXRlX2dldF9pZHgoaXRlciwgKnBvcyk7CisKKwl0ID0gKHN0cnVjdCB0cmllICopdGItPnRiX2RhdGE7CisJaXRlci0+dG5vZGUgPSB0LT5rdjsKKwlpdGVyLT5wb3MgPSAwOworCWl0ZXItPmtleSA9IDA7CisKKwlyZXR1cm4gU0VRX1NUQVJUX1RPS0VOOwogfQogCiBzdGF0aWMgdm9pZCAqZmliX3JvdXRlX3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykKIHsKIAlzdHJ1Y3QgZmliX3JvdXRlX2l0ZXIgKml0ZXIgPSBzZXEtPnByaXZhdGU7Ci0Jc3RydWN0IHRub2RlICpsID0gdjsKKwlzdHJ1Y3Qga2V5X3ZlY3RvciAqbCA9IE5VTEw7CisJdF9rZXkga2V5ID0gaXRlci0+a2V5OwogCiAJKysqcG9zOwotCWlmICh2ID09IFNFUV9TVEFSVF9UT0tFTikgewotCQlpdGVyLT5wb3MgPSAwOwotCQlsID0gdHJpZV9maXJzdGxlYWYoaXRlci0+bWFpbl90cmllKTsKLQl9IGVsc2UgeworCisJLyogb25seSBhbGxvdyBrZXkgb2YgMCBmb3Igc3RhcnQgb2Ygc2VxdWVuY2UgKi8KKwlpZiAoKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB8fCBrZXkpCisJCWwgPSBsZWFmX3dhbGtfcmN1KCZpdGVyLT50bm9kZSwga2V5KTsKKworCWlmIChsKSB7CisJCWl0ZXItPmtleSA9IGwtPmtleSArIDE7CiAJCWl0ZXItPnBvcysrOwotCQlsID0gdHJpZV9uZXh0bGVhZihsKTsKKwl9IGVsc2UgeworCQlpdGVyLT5wb3MgPSAwOwogCX0KIAotCWlmIChsKQotCQlpdGVyLT5rZXkgPSBsLT5rZXk7Ci0JZWxzZQotCQlpdGVyLT5wb3MgPSAwOwogCXJldHVybiBsOwogfQogCkBAIC0yNDEyLDggKzI1NTAsMTEgQEAKICAqLwogc3RhdGljIGludCBmaWJfcm91dGVfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IHRub2RlICpsID0gdjsKLQlzdHJ1Y3QgbGVhZl9pbmZvICpsaTsKKwlzdHJ1Y3QgZmliX3JvdXRlX2l0ZXIgKml0ZXIgPSBzZXEtPnByaXZhdGU7CisJc3RydWN0IGZpYl90YWJsZSAqdGIgPSBpdGVyLT5tYWluX3RiOworCXN0cnVjdCBmaWJfYWxpYXMgKmZhOworCXN0cnVjdCBrZXlfdmVjdG9yICpsID0gdjsKKwlfX2JlMzIgcHJlZml4OwogCiAJaWYgKHYgPT0gU0VRX1NUQVJUX1RPS0VOKSB7CiAJCXNlcV9wcmludGYoc2VxLCAiJS0xMjdzXG4iLCAiSWZhY2VcdERlc3RpbmF0aW9uXHRHYXRld2F5ICIKQEAgLTI0MjIsNDUgKzI1NjMsNDMgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGxpLCAmbC0+bGlzdCwgaGxpc3QpIHsKLQkJc3RydWN0IGZpYl9hbGlhcyAqZmE7Ci0JCV9fYmUzMiBtYXNrLCBwcmVmaXg7CisJcHJlZml4ID0gaHRvbmwobC0+a2V5KTsKIAotCQltYXNrID0gaW5ldF9tYWtlX21hc2sobGktPnBsZW4pOwotCQlwcmVmaXggPSBodG9ubChsLT5rZXkpOworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShmYSwgJmwtPmxlYWYsIGZhX2xpc3QpIHsKKwkJY29uc3Qgc3RydWN0IGZpYl9pbmZvICpmaSA9IGZhLT5mYV9pbmZvOworCQlfX2JlMzIgbWFzayA9IGluZXRfbWFrZV9tYXNrKEtFWUxFTkdUSCAtIGZhLT5mYV9zbGVuKTsKKwkJdW5zaWduZWQgaW50IGZsYWdzID0gZmliX2ZsYWdfdHJhbnMoZmEtPmZhX3R5cGUsIG1hc2ssIGZpKTsKIAotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShmYSwgJmxpLT5mYWxoLCBmYV9saXN0KSB7Ci0JCQljb25zdCBzdHJ1Y3QgZmliX2luZm8gKmZpID0gZmEtPmZhX2luZm87Ci0JCQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBmaWJfZmxhZ190cmFucyhmYS0+ZmFfdHlwZSwgbWFzaywgZmkpOworCQlpZiAoKGZhLT5mYV90eXBlID09IFJUTl9CUk9BRENBU1QpIHx8CisJCSAgICAoZmEtPmZhX3R5cGUgPT0gUlROX01VTFRJQ0FTVCkpCisJCQljb250aW51ZTsKIAotCQkJaWYgKGZhLT5mYV90eXBlID09IFJUTl9CUk9BRENBU1QKLQkJCSAgICB8fCBmYS0+ZmFfdHlwZSA9PSBSVE5fTVVMVElDQVNUKQotCQkJCWNvbnRpbnVlOworCQlpZiAoZmEtPnRiX2lkICE9IHRiLT50Yl9pZCkKKwkJCWNvbnRpbnVlOwogCi0JCQlzZXFfc2V0d2lkdGgoc2VxLCAxMjcpOworCQlzZXFfc2V0d2lkdGgoc2VxLCAxMjcpOwogCi0JCQlpZiAoZmkpCi0JCQkJc2VxX3ByaW50ZihzZXEsCi0JCQkJCSAiJXNcdCUwOFhcdCUwOFhcdCUwNFhcdCVkXHQldVx0IgotCQkJCQkgIiVkXHQlMDhYXHQlZFx0JXVcdCV1IiwKLQkJCQkJIGZpLT5maWJfZGV2ID8gZmktPmZpYl9kZXYtPm5hbWUgOiAiKiIsCi0JCQkJCSBwcmVmaXgsCi0JCQkJCSBmaS0+ZmliX25oLT5uaF9ndywgZmxhZ3MsIDAsIDAsCi0JCQkJCSBmaS0+ZmliX3ByaW9yaXR5LAotCQkJCQkgbWFzaywKLQkJCQkJIChmaS0+ZmliX2Fkdm1zcyA/Ci0JCQkJCSAgZmktPmZpYl9hZHZtc3MgKyA0MCA6IDApLAotCQkJCQkgZmktPmZpYl93aW5kb3csCi0JCQkJCSBmaS0+ZmliX3J0dCA+PiAzKTsKLQkJCWVsc2UKLQkJCQlzZXFfcHJpbnRmKHNlcSwKLQkJCQkJICIqXHQlMDhYXHQlMDhYXHQlMDRYXHQlZFx0JXVcdCIKLQkJCQkJICIlZFx0JTA4WFx0JWRcdCV1XHQldSIsCi0JCQkJCSBwcmVmaXgsIDAsIGZsYWdzLCAwLCAwLCAwLAotCQkJCQkgbWFzaywgMCwgMCwgMCk7CisJCWlmIChmaSkKKwkJCXNlcV9wcmludGYoc2VxLAorCQkJCSAgICIlc1x0JTA4WFx0JTA4WFx0JTA0WFx0JWRcdCV1XHQiCisJCQkJICAgIiVkXHQlMDhYXHQlZFx0JXVcdCV1IiwKKwkJCQkgICBmaS0+ZmliX2RldiA/IGZpLT5maWJfZGV2LT5uYW1lIDogIioiLAorCQkJCSAgIHByZWZpeCwKKwkJCQkgICBmaS0+ZmliX25oLT5uaF9ndywgZmxhZ3MsIDAsIDAsCisJCQkJICAgZmktPmZpYl9wcmlvcml0eSwKKwkJCQkgICBtYXNrLAorCQkJCSAgIChmaS0+ZmliX2Fkdm1zcyA/CisJCQkJICAgIGZpLT5maWJfYWR2bXNzICsgNDAgOiAwKSwKKwkJCQkgICBmaS0+ZmliX3dpbmRvdywKKwkJCQkgICBmaS0+ZmliX3J0dCA+PiAzKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzZXEsCisJCQkJICAgIipcdCUwOFhcdCUwOFhcdCUwNFhcdCVkXHQldVx0IgorCQkJCSAgICIlZFx0JTA4WFx0JWRcdCV1XHQldSIsCisJCQkJICAgcHJlZml4LCAwLCBmbGFncywgMCwgMCwgMCwKKwkJCQkgICBtYXNrLCAwLCAwLCAwKTsKIAotCQkJc2VxX3BhZChzZXEsICdcbicpOwotCQl9CisJCXNlcV9wYWQoc2VxLCAnXG4nKTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2ZvdS5jIGIvbmV0L2lwdjQvZm91LmMKaW5kZXggZmYwNjlmNi4uYWYxNTBiNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZm91LmMKKysrIGIvbmV0L2lwdjQvZm91LmMKQEAgLTE2LDE0ICsxNiwxMiBAQAogI2luY2x1ZGUgPHVhcGkvbGludXgvZm91Lmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9nZW5ldGxpbmsuaD4KIAotc3RhdGljIERFRklORV9TUElOTE9DSyhmb3VfbG9jayk7Ci1zdGF0aWMgTElTVF9IRUFEKGZvdV9saXN0KTsKLQogc3RydWN0IGZvdSB7CiAJc3RydWN0IHNvY2tldCAqc29jazsKIAl1OCBwcm90b2NvbDsKIAl1OCBmbGFnczsKLQl1MTYgcG9ydDsKKwlfX2JlMTYgcG9ydDsKKwl1MTYgdHlwZTsKIAlzdHJ1Y3QgdWRwX29mZmxvYWQgdWRwX29mZmxvYWRzOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CkBAIC0zNyw2ICszNSwxMyBAQAogCXN0cnVjdCB1ZHBfcG9ydF9jZmcgdWRwX2NvbmZpZzsKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZm91X25ldF9pZDsKKworc3RydWN0IGZvdV9uZXQgeworCXN0cnVjdCBsaXN0X2hlYWQgZm91X2xpc3Q7CisJc3RydWN0IG11dGV4IGZvdV9sb2NrOworfTsKKwogc3RhdGljIGlubGluZSBzdHJ1Y3QgZm91ICpmb3VfZnJvbV9zb2NrKHN0cnVjdCBzb2NrICpzaykKIHsKIAlyZXR1cm4gc2stPnNrX3VzZXJfZGF0YTsKQEAgLTM4NywyMCArMzkyLDIxIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBmb3VfYWRkX3RvX3BvcnRfbGlzdChzdHJ1Y3QgZm91ICpmb3UpCitzdGF0aWMgaW50IGZvdV9hZGRfdG9fcG9ydF9saXN0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGZvdSAqZm91KQogeworCXN0cnVjdCBmb3VfbmV0ICpmbiA9IG5ldF9nZW5lcmljKG5ldCwgZm91X25ldF9pZCk7CiAJc3RydWN0IGZvdSAqZm91dDsKIAotCXNwaW5fbG9jaygmZm91X2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZm91dCwgJmZvdV9saXN0LCBsaXN0KSB7CisJbXV0ZXhfbG9jaygmZm4tPmZvdV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZvdXQsICZmbi0+Zm91X2xpc3QsIGxpc3QpIHsKIAkJaWYgKGZvdS0+cG9ydCA9PSBmb3V0LT5wb3J0KSB7Ci0JCQlzcGluX3VubG9jaygmZm91X2xvY2spOworCQkJbXV0ZXhfdW5sb2NrKCZmbi0+Zm91X2xvY2spOwogCQkJcmV0dXJuIC1FQUxSRUFEWTsKIAkJfQogCX0KIAotCWxpc3RfYWRkKCZmb3UtPmxpc3QsICZmb3VfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJmZvdV9sb2NrKTsKKwlsaXN0X2FkZCgmZm91LT5saXN0LCAmZm4tPmZvdV9saXN0KTsKKwltdXRleF91bmxvY2soJmZuLT5mb3VfbG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQxMCwxNCArNDE2LDEwIEBACiAJc3RydWN0IHNvY2tldCAqc29jayA9IGZvdS0+c29jazsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAotCXVkcF9kZWxfb2ZmbG9hZCgmZm91LT51ZHBfb2ZmbG9hZHMpOwotCisJaWYgKHNrLT5za19mYW1pbHkgPT0gQUZfSU5FVCkKKwkJdWRwX2RlbF9vZmZsb2FkKCZmb3UtPnVkcF9vZmZsb2Fkcyk7CiAJbGlzdF9kZWwoJmZvdS0+bGlzdCk7Ci0KLQkvKiBSZW1vdmUgaG9va3MgaW50byB0dW5uZWwgc29ja2V0ICovCi0Jc2stPnNrX3VzZXJfZGF0YSA9IE5VTEw7Ci0KLQlzb2NrX3JlbGVhc2Uoc29jayk7CisJdWRwX3R1bm5lbF9zb2NrX3JlbGVhc2Uoc29jayk7CiAKIAlrZnJlZShmb3UpOwogfQpAQCAtNDQ3LDEwICs0NDksMTAgQEAKIHN0YXRpYyBpbnQgZm91X2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmb3VfY2ZnICpjZmcsCiAJCSAgICAgIHN0cnVjdCBzb2NrZXQgKipzb2NrcCkKIHsKLQlzdHJ1Y3QgZm91ICpmb3UgPSBOVUxMOwotCWludCBlcnI7CiAJc3RydWN0IHNvY2tldCAqc29jayA9IE5VTEw7CisJc3RydWN0IGZvdSAqZm91ID0gTlVMTDsKIAlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGVycjsKIAogCS8qIE9wZW4gVURQIHNvY2tldCAqLwogCWVyciA9IHVkcF9zb2NrX2NyZWF0ZShuZXQsICZjZmctPnVkcF9jb25maWcsICZzb2NrKTsKQEAgLTQ4Niw2ICs0ODgsOCBAQAogCQlnb3RvIGVycm9yOwogCX0KIAorCWZvdS0+dHlwZSA9IGNmZy0+dHlwZTsKKwogCXVkcF9zayhzayktPmVuY2FwX3R5cGUgPSAxOwogCXVkcF9lbmNhcF9lbmFibGUoKTsKIApAQCAtNTAyLDcgKzUwNiw3IEBACiAJCQlnb3RvIGVycm9yOwogCX0KIAotCWVyciA9IGZvdV9hZGRfdG9fcG9ydF9saXN0KGZvdSk7CisJZXJyID0gZm91X2FkZF90b19wb3J0X2xpc3QobmV0LCBmb3UpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTUxNCwyNyArNTE4LDI3IEBACiBlcnJvcjoKIAlrZnJlZShmb3UpOwogCWlmIChzb2NrKQotCQlzb2NrX3JlbGVhc2Uoc29jayk7CisJCXVkcF90dW5uZWxfc29ja19yZWxlYXNlKHNvY2spOwogCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBmb3VfZGVzdHJveShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmb3VfY2ZnICpjZmcpCiB7Ci0Jc3RydWN0IGZvdSAqZm91OwotCXUxNiBwb3J0ID0gY2ZnLT51ZHBfY29uZmlnLmxvY2FsX3VkcF9wb3J0OworCXN0cnVjdCBmb3VfbmV0ICpmbiA9IG5ldF9nZW5lcmljKG5ldCwgZm91X25ldF9pZCk7CisJX19iZTE2IHBvcnQgPSBjZmctPnVkcF9jb25maWcubG9jYWxfdWRwX3BvcnQ7CiAJaW50IGVyciA9IC1FSU5WQUw7CisJc3RydWN0IGZvdSAqZm91OwogCi0Jc3Bpbl9sb2NrKCZmb3VfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShmb3UsICZmb3VfbGlzdCwgbGlzdCkgeworCW11dGV4X2xvY2soJmZuLT5mb3VfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmb3UsICZmbi0+Zm91X2xpc3QsIGxpc3QpIHsKIAkJaWYgKGZvdS0+cG9ydCA9PSBwb3J0KSB7Ci0JCQl1ZHBfZGVsX29mZmxvYWQoJmZvdS0+dWRwX29mZmxvYWRzKTsKIAkJCWZvdV9yZWxlYXNlKGZvdSk7CiAJCQllcnIgPSAwOwogCQkJYnJlYWs7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJmZvdV9sb2NrKTsKKwltdXRleF91bmxvY2soJmZuLT5mb3VfbG9jayk7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTczLDcgKzU3Nyw3IEBACiAJfQogCiAJaWYgKGluZm8tPmF0dHJzW0ZPVV9BVFRSX1BPUlRdKSB7Ci0JCXUxNiBwb3J0ID0gbmxhX2dldF91MTYoaW5mby0+YXR0cnNbRk9VX0FUVFJfUE9SVF0pOworCQlfX2JlMTYgcG9ydCA9IG5sYV9nZXRfYmUxNihpbmZvLT5hdHRyc1tGT1VfQVRUUl9QT1JUXSk7CiAKIAkJY2ZnLT51ZHBfY29uZmlnLmxvY2FsX3VkcF9wb3J0ID0gcG9ydDsKIAl9CkBAIC01OTIsNiArNTk2LDcgQEAKIAogc3RhdGljIGludCBmb3VfbmxfY21kX2FkZF9wb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CisJc3RydWN0IG5ldCAqbmV0ID0gZ2VubF9pbmZvX25ldChpbmZvKTsKIAlzdHJ1Y3QgZm91X2NmZyBjZmc7CiAJaW50IGVycjsKIApAQCAtNTk5LDE2ICs2MDQsMTIwIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCXJldHVybiBmb3VfY3JlYXRlKCZpbml0X25ldCwgJmNmZywgTlVMTCk7CisJcmV0dXJuIGZvdV9jcmVhdGUobmV0LCAmY2ZnLCBOVUxMKTsKIH0KIAogc3RhdGljIGludCBmb3VfbmxfY21kX3JtX3BvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBnZW5sX2luZm9fbmV0KGluZm8pOwogCXN0cnVjdCBmb3VfY2ZnIGNmZzsKKwlpbnQgZXJyOwogCi0JcGFyc2VfbmxfY29uZmlnKGluZm8sICZjZmcpOworCWVyciA9IHBhcnNlX25sX2NvbmZpZyhpbmZvLCAmY2ZnKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCi0JcmV0dXJuIGZvdV9kZXN0cm95KCZpbml0X25ldCwgJmNmZyk7CisJcmV0dXJuIGZvdV9kZXN0cm95KG5ldCwgJmNmZyk7Cit9CisKK3N0YXRpYyBpbnQgZm91X2ZpbGxfaW5mbyhzdHJ1Y3QgZm91ICpmb3UsIHN0cnVjdCBza19idWZmICptc2cpCit7CisJaWYgKG5sYV9wdXRfdTgobXNnLCBGT1VfQVRUUl9BRiwgZm91LT5zb2NrLT5zay0+c2tfZmFtaWx5KSB8fAorCSAgICBubGFfcHV0X2JlMTYobXNnLCBGT1VfQVRUUl9QT1JULCBmb3UtPnBvcnQpIHx8CisJICAgIG5sYV9wdXRfdTgobXNnLCBGT1VfQVRUUl9JUFBST1RPLCBmb3UtPnByb3RvY29sKSB8fAorCSAgICBubGFfcHV0X3U4KG1zZywgRk9VX0FUVFJfVFlQRSwgZm91LT50eXBlKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKGZvdS0+ZmxhZ3MgJiBGT1VfRl9SRU1DU1VNX05PUEFSVElBTCkKKwkJaWYgKG5sYV9wdXRfZmxhZyhtc2csIEZPVV9BVFRSX1JFTUNTVU1fTk9QQVJUSUFMKSkKKwkJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmb3VfZHVtcF9pbmZvKHN0cnVjdCBmb3UgKmZvdSwgdTMyIHBvcnRpZCwgdTMyIHNlcSwKKwkJCSB1MzIgZmxhZ3MsIHN0cnVjdCBza19idWZmICpza2IsIHU4IGNtZCkKK3sKKwl2b2lkICpoZHI7CisKKwloZHIgPSBnZW5sbXNnX3B1dChza2IsIHBvcnRpZCwgc2VxLCAmZm91X25sX2ZhbWlseSwgZmxhZ3MsIGNtZCk7CisJaWYgKCFoZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKGZvdV9maWxsX2luZm8oZm91LCBza2IpIDwgMCkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisKKwlnZW5sbXNnX2VuZChza2IsIGhkcik7CisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChza2IsIGhkcik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCBmb3VfbmxfY21kX2dldF9wb3J0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5ldCAqbmV0ID0gZ2VubF9pbmZvX25ldChpbmZvKTsKKwlzdHJ1Y3QgZm91X25ldCAqZm4gPSBuZXRfZ2VuZXJpYyhuZXQsIGZvdV9uZXRfaWQpOworCXN0cnVjdCBza19idWZmICptc2c7CisJc3RydWN0IGZvdV9jZmcgY2ZnOworCXN0cnVjdCBmb3UgKmZvdXQ7CisJX19iZTE2IHBvcnQ7CisJaW50IHJldDsKKworCXJldCA9IHBhcnNlX25sX2NvbmZpZyhpbmZvLCAmY2ZnKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXBvcnQgPSBjZmcudWRwX2NvbmZpZy5sb2NhbF91ZHBfcG9ydDsKKwlpZiAocG9ydCA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IC1FU1JDSDsKKwltdXRleF9sb2NrKCZmbi0+Zm91X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZm91dCwgJmZuLT5mb3VfbGlzdCwgbGlzdCkgeworCQlpZiAocG9ydCA9PSBmb3V0LT5wb3J0KSB7CisJCQlyZXQgPSBmb3VfZHVtcF9pbmZvKGZvdXQsIGluZm8tPnNuZF9wb3J0aWQsCisJCQkJCSAgICBpbmZvLT5zbmRfc2VxLCAwLCBtc2csCisJCQkJCSAgICBpbmZvLT5nZW5saGRyLT5jbWQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZmbi0+Zm91X2xvY2spOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJcmV0dXJuIGdlbmxtc2dfcmVwbHkobXNnLCBpbmZvKTsKKworb3V0X2ZyZWU6CisJbmxtc2dfZnJlZShtc2cpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZm91X25sX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrYi0+c2spOworCXN0cnVjdCBmb3VfbmV0ICpmbiA9IG5ldF9nZW5lcmljKG5ldCwgZm91X25ldF9pZCk7CisJc3RydWN0IGZvdSAqZm91dDsKKwlpbnQgaWR4ID0gMCwgcmV0OworCisJbXV0ZXhfbG9jaygmZm4tPmZvdV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZvdXQsICZmbi0+Zm91X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGlkeCsrIDwgY2ItPmFyZ3NbMF0pCisJCQljb250aW51ZTsKKwkJcmV0ID0gZm91X2R1bXBfaW5mbyhmb3V0LCBORVRMSU5LX0NCKGNiLT5za2IpLnBvcnRpZCwKKwkJCQkgICAgY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwKKwkJCQkgICAgc2tiLCBGT1VfQ01EX0dFVCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGRvbmU7CisJfQorCW11dGV4X3VubG9jaygmZm4tPmZvdV9sb2NrKTsKKworZG9uZToKKwljYi0+YXJnc1swXSA9IGlkeDsKKwlyZXR1cm4gc2tiLT5sZW47CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZ2VubF9vcHMgZm91X25sX29wc1tdID0gewpAQCAtNjI0LDYgKzczMywxMiBAQAogCQkucG9saWN5ID0gZm91X25sX3BvbGljeSwKIAkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAogCX0sCisJeworCQkuY21kID0gRk9VX0NNRF9HRVQsCisJCS5kb2l0ID0gZm91X25sX2NtZF9nZXRfcG9ydCwKKwkJLmR1bXBpdCA9IGZvdV9ubF9kdW1wLAorCQkucG9saWN5ID0gZm91X25sX3BvbGljeSwKKwl9LAogfTsKIAogc2l6ZV90IGZvdV9lbmNhcF9obGVuKHN0cnVjdCBpcF90dW5uZWxfZW5jYXAgKmUpCkBAIC03NzEsMTIgKzg4NiwxMiBAQAogCiAjaWZkZWYgQ09ORklHX05FVF9GT1VfSVBfVFVOTkVMUwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9lbmNhcF9vcHMgX19yZWFkX21vc3RseSBmb3VfaXB0dW5fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBpcF90dW5uZWxfZW5jYXBfb3BzIGZvdV9pcHR1bl9vcHMgPSB7CiAJLmVuY2FwX2hsZW4gPSBmb3VfZW5jYXBfaGxlbiwKIAkuYnVpbGRfaGVhZGVyID0gZm91X2J1aWxkX2hlYWRlciwKIH07CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXBfdHVubmVsX2VuY2FwX29wcyBfX3JlYWRfbW9zdGx5IGd1ZV9pcHR1bl9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlwX3R1bm5lbF9lbmNhcF9vcHMgZ3VlX2lwdHVuX29wcyA9IHsKIAkuZW5jYXBfaGxlbiA9IGd1ZV9lbmNhcF9obGVuLAogCS5idWlsZF9oZWFkZXIgPSBndWVfYnVpbGRfaGVhZGVyLAogfTsKQEAgLTgyMCwzOCArOTM1LDYzIEBACiAKICNlbmRpZgogCitzdGF0aWMgX19uZXRfaW5pdCBpbnQgZm91X2luaXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgZm91X25ldCAqZm4gPSBuZXRfZ2VuZXJpYyhuZXQsIGZvdV9uZXRfaWQpOworCisJSU5JVF9MSVNUX0hFQUQoJmZuLT5mb3VfbGlzdCk7CisJbXV0ZXhfaW5pdCgmZm4tPmZvdV9sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fbmV0X2V4aXQgdm9pZCBmb3VfZXhpdF9uZXQoc3RydWN0IG5ldCAqbmV0KQoreworCXN0cnVjdCBmb3VfbmV0ICpmbiA9IG5ldF9nZW5lcmljKG5ldCwgZm91X25ldF9pZCk7CisJc3RydWN0IGZvdSAqZm91LCAqbmV4dDsKKworCS8qIENsb3NlIGFsbCB0aGUgRk9VIHNvY2tldHMgKi8KKwltdXRleF9sb2NrKCZmbi0+Zm91X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmb3UsIG5leHQsICZmbi0+Zm91X2xpc3QsIGxpc3QpCisJCWZvdV9yZWxlYXNlKGZvdSk7CisJbXV0ZXhfdW5sb2NrKCZmbi0+Zm91X2xvY2spOworfQorCitzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIGZvdV9uZXRfb3BzID0geworCS5pbml0ID0gZm91X2luaXRfbmV0LAorCS5leGl0ID0gZm91X2V4aXRfbmV0LAorCS5pZCAgID0gJmZvdV9uZXRfaWQsCisJLnNpemUgPSBzaXplb2Yoc3RydWN0IGZvdV9uZXQpLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgZm91X2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwogCi0JcmV0ID0gZ2VubF9yZWdpc3Rlcl9mYW1pbHlfd2l0aF9vcHMoJmZvdV9ubF9mYW1pbHksCi0JCQkJCSAgICBmb3Vfbmxfb3BzKTsKLQotCWlmIChyZXQgPCAwKQorCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9kZXZpY2UoJmZvdV9uZXRfb3BzKTsKKwlpZiAocmV0KQogCQlnb3RvIGV4aXQ7CiAKLQlyZXQgPSBpcF90dW5uZWxfZW5jYXBfYWRkX2ZvdV9vcHMoKTsKKwlyZXQgPSBnZW5sX3JlZ2lzdGVyX2ZhbWlseV93aXRoX29wcygmZm91X25sX2ZhbWlseSwKKwkJCQkJICAgIGZvdV9ubF9vcHMpOwogCWlmIChyZXQgPCAwKQotCQlnZW5sX3VucmVnaXN0ZXJfZmFtaWx5KCZmb3VfbmxfZmFtaWx5KTsKKwkJZ290byB1bnJlZ2lzdGVyOwogCisJcmV0ID0gaXBfdHVubmVsX2VuY2FwX2FkZF9mb3Vfb3BzKCk7CisJaWYgKHJldCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkoJmZvdV9ubF9mYW1pbHkpOwordW5yZWdpc3RlcjoKKwl1bnJlZ2lzdGVyX3Blcm5ldF9kZXZpY2UoJmZvdV9uZXRfb3BzKTsKIGV4aXQ6CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IGZvdV9maW5pKHZvaWQpCiB7Ci0Jc3RydWN0IGZvdSAqZm91LCAqbmV4dDsKLQogCWlwX3R1bm5lbF9lbmNhcF9kZWxfZm91X29wcygpOwotCiAJZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmZm91X25sX2ZhbWlseSk7Ci0KLQkvKiBDbG9zZSBhbGwgdGhlIEZPVSBzb2NrZXRzICovCi0KLQlzcGluX2xvY2soJmZvdV9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZm91LCBuZXh0LCAmZm91X2xpc3QsIGxpc3QpCi0JCWZvdV9yZWxlYXNlKGZvdSk7Ci0Jc3Bpbl91bmxvY2soJmZvdV9sb2NrKTsKKwl1bnJlZ2lzdGVyX3Blcm5ldF9kZXZpY2UoJmZvdV9uZXRfb3BzKTsKIH0KIAogbW9kdWxlX2luaXQoZm91X2luaXQpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvZ2VuZXZlLmMgYi9uZXQvaXB2NC9nZW5ldmUuYwppbmRleCA1YTQ4MjhiLi44OTg2ZTYzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9nZW5ldmUuYworKysgYi9uZXQvaXB2NC9nZW5ldmUuYwpAQCAtMTEzLDEwICsxMTMsNiBAQAogCWludCBtaW5faGVhZHJvb207CiAJaW50IGVycjsKIAotCXNrYiA9IHVkcF90dW5uZWxfaGFuZGxlX29mZmxvYWRzKHNrYiwgY3N1bSk7Ci0JaWYgKElTX0VSUihza2IpKQotCQlyZXR1cm4gUFRSX0VSUihza2IpOwotCiAJbWluX2hlYWRyb29tID0gTExfUkVTRVJWRURfU1BBQ0UocnQtPmRzdC5kZXYpICsgcnQtPmRzdC5oZWFkZXJfbGVuCiAJCQkrIEdFTkVWRV9CQVNFX0hMRU4gKyBvcHRfbGVuICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikKIAkJCSsgKHNrYl92bGFuX3RhZ19wcmVzZW50KHNrYikgPyBWTEFOX0hMRU4gOiAwKTsKQEAgLTEzMSwxMiArMTI3LDE2IEBACiAJaWYgKHVubGlrZWx5KCFza2IpKQogCQlyZXR1cm4gLUVOT01FTTsKIAorCXNrYiA9IHVkcF90dW5uZWxfaGFuZGxlX29mZmxvYWRzKHNrYiwgY3N1bSk7CisJaWYgKElTX0VSUihza2IpKQorCQlyZXR1cm4gUFRSX0VSUihza2IpOworCiAJZ252aCA9IChzdHJ1Y3QgZ2VuZXZlaGRyICopX19za2JfcHVzaChza2IsIHNpemVvZigqZ252aCkgKyBvcHRfbGVuKTsKIAlnZW5ldmVfYnVpbGRfaGVhZGVyKGdudmgsIHR1bl9mbGFncywgdm5pLCBvcHRfbGVuLCBvcHQpOwogCiAJc2tiX3NldF9pbm5lcl9wcm90b2NvbChza2IsIGh0b25zKEVUSF9QX1RFQikpOwogCi0JcmV0dXJuIHVkcF90dW5uZWxfeG1pdF9za2IocnQsIHNrYiwgc3JjLCBkc3QsCisJcmV0dXJuIHVkcF90dW5uZWxfeG1pdF9za2IocnQsIGdzLT5zb2NrLT5zaywgc2tiLCBzcmMsIGRzdCwKIAkJCQkgICB0b3MsIHR0bCwgZGYsIHNyY19wb3J0LCBkc3RfcG9ydCwgeG5ldCwKIAkJCQkgICAhY3N1bSk7CiB9CkBAIC0xOTYsNyArMTk2LDcgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlwdHlwZSA9IGdyb19maW5kX3JlY2VpdmVfYnlfdHlwZSh0eXBlKTsKLQlpZiAocHR5cGUgPT0gTlVMTCkgeworCWlmICghcHR5cGUpIHsKIAkJZmx1c2ggPSAxOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQpAQCAtMjMwLDcgKzIzMCw3IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJcHR5cGUgPSBncm9fZmluZF9jb21wbGV0ZV9ieV90eXBlKHR5cGUpOwotCWlmIChwdHlwZSAhPSBOVUxMKQorCWlmIChwdHlwZSkKIAkJZXJyID0gcHR5cGUtPmNhbGxiYWNrcy5ncm9fY29tcGxldGUoc2tiLCBuaG9mZiArIGdoX2xlbik7CiAKIAlyY3VfcmVhZF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2dyZV9vZmZsb2FkLmMgYi9uZXQvaXB2NC9ncmVfb2ZmbG9hZC5jCmluZGV4IDUxOTczZGQuLjVhYTQ2ZDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2dyZV9vZmZsb2FkLmMKKysrIGIvbmV0L2lwdjQvZ3JlX29mZmxvYWQuYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJcHR5cGUgPSBncm9fZmluZF9yZWNlaXZlX2J5X3R5cGUodHlwZSk7Ci0JaWYgKHB0eXBlID09IE5VTEwpCisJaWYgKCFwdHlwZSkKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJZ3JlaGxlbiA9IEdSRV9IRUFERVJfU0VDVElPTjsKQEAgLTI0Myw3ICsyNDMsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCXB0eXBlID0gZ3JvX2ZpbmRfY29tcGxldGVfYnlfdHlwZSh0eXBlKTsKLQlpZiAocHR5cGUgIT0gTlVMTCkKKwlpZiAocHR5cGUpCiAJCWVyciA9IHB0eXBlLT5jYWxsYmFja3MuZ3JvX2NvbXBsZXRlKHNrYiwgbmhvZmYgKyBncmVobGVuKTsKIAogCXJjdV9yZWFkX3VubG9jaygpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWNtcC5jIGIvbmV0L2lwdjQvaWNtcC5jCmluZGV4IDVlNTY0MDEuLmY1MjAzZmIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ljbXAuYworKysgYi9uZXQvaXB2NC9pY21wLmMKQEAgLTM5OSw3ICszOTksNyBAQAogCQlyZXR1cm47CiAKIAlzayA9IGljbXBfeG1pdF9sb2NrKG5ldCk7Ci0JaWYgKHNrID09IE5VTEwpCisJaWYgKCFzaykKIAkJcmV0dXJuOwogCWluZXQgPSBpbmV0X3NrKHNrKTsKIApAQCAtNjA5LDcgKzYwOSw3IEBACiAJCQkJCQkgc2tiX2luLT5kYXRhLAogCQkJCQkJIHNpemVvZihfaW5uZXJfdHlwZSksCiAJCQkJCQkgJl9pbm5lcl90eXBlKTsKLQkJCWlmIChpdHAgPT0gTlVMTCkKKwkJCWlmICghaXRwKQogCQkJCWdvdG8gb3V0OwogCiAJCQkvKgpAQCAtNjI3LDcgKzYyNyw3IEBACiAJCXJldHVybjsKIAogCXNrID0gaWNtcF94bWl0X2xvY2sobmV0KTsKLQlpZiAoc2sgPT0gTlVMTCkKKwlpZiAoIXNrKQogCQlnb3RvIG91dF9mcmVlOwogCiAJLyoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lnbXAuYyBiL25ldC9pcHY0L2lnbXAuYwppbmRleCA2NjZjZjM2Li5hM2E2OTdmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pZ21wLmMKKysrIGIvbmV0L2lwdjQvaWdtcC5jCkBAIC05Nyw2ICs5Nyw3IEBACiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KICNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKyNpbmNsdWRlIDxuZXQvaW5ldF9jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgogI2lmZGVmIENPTkZJR19JUF9NUk9VVEUKICNpbmNsdWRlIDxsaW51eC9tcm91dGUuaD4KQEAgLTM2OSw3ICszNzAsNyBAQAogCXBpcC0+c2FkZHIgICAgPSBmbDQuc2FkZHI7CiAJcGlwLT5wcm90b2NvbCA9IElQUFJPVE9fSUdNUDsKIAlwaXAtPnRvdF9sZW4gID0gMDsJLyogZmlsbGVkIGluIGxhdGVyICovCi0JaXBfc2VsZWN0X2lkZW50KHNrYiwgTlVMTCk7CisJaXBfc2VsZWN0X2lkZW50KG5ldCwgc2tiLCBOVUxMKTsKIAkoKHU4ICopJnBpcFsxXSlbMF0gPSBJUE9QVF9SQTsKIAkoKHU4ICopJnBpcFsxXSlbMV0gPSA0OwogCSgodTggKikmcGlwWzFdKVsyXSA9IDA7CkBAIC02OTEsNyArNjkyLDcgQEAKIAlobGVuID0gTExfUkVTRVJWRURfU1BBQ0UoZGV2KTsKIAl0bGVuID0gZGV2LT5uZWVkZWRfdGFpbHJvb207CiAJc2tiID0gYWxsb2Nfc2tiKElHTVBfU0laRSArIGhsZW4gKyB0bGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoc2tiID09IE5VTEwpIHsKKwlpZiAoIXNrYikgewogCQlpcF9ydF9wdXQocnQpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtNzEzLDcgKzcxNCw3IEBACiAJaXBoLT5kYWRkciAgICA9IGRzdDsKIAlpcGgtPnNhZGRyICAgID0gZmw0LnNhZGRyOwogCWlwaC0+cHJvdG9jb2wgPSBJUFBST1RPX0lHTVA7Ci0JaXBfc2VsZWN0X2lkZW50KHNrYiwgTlVMTCk7CisJaXBfc2VsZWN0X2lkZW50KG5ldCwgc2tiLCBOVUxMKTsKIAkoKHU4ICopJmlwaFsxXSlbMF0gPSBJUE9QVF9SQTsKIAkoKHU4ICopJmlwaFsxXSlbMV0gPSA0OwogCSgodTggKikmaXBoWzFdKVsyXSA9IDA7CkBAIC05ODAsNyArOTgxLDcgQEAKIAlpbnQgbGVuID0gc2tiLT5sZW47CiAJYm9vbCBkcm9wcGVkID0gdHJ1ZTsKIAotCWlmIChpbl9kZXYgPT0gTlVMTCkKKwlpZiAoIWluX2RldikKIAkJZ290byBkcm9wOwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBpZ21waGRyKSkpCkBAIC0xODQ5LDMwICsxODUwLDI4IEBACiAJcG1jLT5zZmNvdW50W01DQVNUX0VYQ0xVREVdID0gMTsKIH0KIAotCi0vKgotICogSm9pbiBhIG11bHRpY2FzdCBncm91cAorLyogSm9pbiBhIG11bHRpY2FzdCBncm91cAogICovCi1pbnQgaXBfbWNfam9pbl9ncm91cChzdHJ1Y3Qgc29jayAqc2sgLCBzdHJ1Y3QgaXBfbXJlcW4gKmltcikKKworaW50IGlwX21jX2pvaW5fZ3JvdXAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaXBfbXJlcW4gKmltcikKIHsKLQlpbnQgZXJyOwogCV9fYmUzMiBhZGRyID0gaW1yLT5pbXJfbXVsdGlhZGRyLnNfYWRkcjsKLQlzdHJ1Y3QgaXBfbWNfc29ja2xpc3QgKmltbCA9IE5VTEwsICppOworCXN0cnVjdCBpcF9tY19zb2NrbGlzdCAqaW1sLCAqaTsKIAlzdHJ1Y3QgaW5fZGV2aWNlICppbl9kZXY7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKIAlpbnQgaWZpbmRleDsKIAlpbnQgY291bnQgPSAwOworCWludCBlcnI7CisKKwlBU1NFUlRfUlROTCgpOwogCiAJaWYgKCFpcHY0X2lzX211bHRpY2FzdChhZGRyKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlydG5sX2xvY2soKTsKLQogCWluX2RldiA9IGlwX21jX2ZpbmRfZGV2KG5ldCwgaW1yKTsKIAogCWlmICghaW5fZGV2KSB7Ci0JCWltbCA9IE5VTEw7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC0xODg5LDcgKzE4ODgsNyBAQAogCWlmIChjb3VudCA+PSBzeXNjdGxfaWdtcF9tYXhfbWVtYmVyc2hpcHMpCiAJCWdvdG8gZG9uZTsKIAlpbWwgPSBzb2NrX2ttYWxsb2Moc2ssIHNpemVvZigqaW1sKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGltbCA9PSBOVUxMKQorCWlmICghaW1sKQogCQlnb3RvIGRvbmU7CiAKIAltZW1jcHkoJmltbC0+bXVsdGksIGltciwgc2l6ZW9mKCppbXIpKTsKQEAgLTE5MDAsNyArMTg5OSw2IEBACiAJaXBfbWNfaW5jX2dyb3VwKGluX2RldiwgYWRkcik7CiAJZXJyID0gMDsKIGRvbmU6Ci0JcnRubF91bmxvY2soKTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTChpcF9tY19qb2luX2dyb3VwKTsKQEAgLTE5MTEsNyArMTkwOSw3IEBACiAJc3RydWN0IGlwX3NmX3NvY2tsaXN0ICpwc2YgPSBydG5sX2RlcmVmZXJlbmNlKGltbC0+c2ZsaXN0KTsKIAlpbnQgZXJyOwogCi0JaWYgKHBzZiA9PSBOVUxMKSB7CisJaWYgKCFwc2YpIHsKIAkJLyogYW55LXNvdXJjZSBlbXB0eSBleGNsdWRlIGNhc2UgKi8KIAkJcmV0dXJuIGlwX21jX2RlbF9zcmMoaW5fZGV2LCAmaW1sLT5tdWx0aS5pbXJfbXVsdGlhZGRyLnNfYWRkciwKIAkJCWltbC0+c2Ztb2RlLCAwLCBOVUxMLCAwKTsKQEAgLTE5MjUsMTAgKzE5MjMsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qCi0gKglBc2sgYSBzb2NrZXQgdG8gbGVhdmUgYSBncm91cC4KLSAqLwotCiBpbnQgaXBfbWNfbGVhdmVfZ3JvdXAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaXBfbXJlcW4gKmltcikKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CkBAIC0xOTQwLDcgKzE5MzQsOCBAQAogCXUzMiBpZmluZGV4OwogCWludCByZXQgPSAtRUFERFJOT1RBVkFJTDsKIAotCXJ0bmxfbG9jaygpOworCUFTU0VSVF9SVE5MKCk7CisKIAlpbl9kZXYgPSBpcF9tY19maW5kX2RldihuZXQsIGltcik7CiAJaWYgKCFpbl9kZXYpIHsKIAkJcmV0ID0gLUVOT0RFVjsKQEAgLTE5NjQsMTQgKzE5NTksMTMgQEAKIAkJKmltbHAgPSBpbWwtPm5leHRfcmN1OwogCiAJCWlwX21jX2RlY19ncm91cChpbl9kZXYsIGdyb3VwKTsKLQkJcnRubF91bmxvY2soKTsKKwogCQkvKiBkZWNyZWFzZSBtZW0gbm93IHRvIGF2b2lkIHRoZSBtZW1sZWFrIHdhcm5pbmcgKi8KIAkJYXRvbWljX3N1YihzaXplb2YoKmltbCksICZzay0+c2tfb21lbV9hbGxvYyk7CiAJCWtmcmVlX3JjdShpbWwsIHJjdSk7CiAJCXJldHVybiAwOwogCX0KIG91dDoKLQlydG5sX3VubG9jaygpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGlwX21jX2xlYXZlX2dyb3VwKTsKQEAgLTE5OTMsNyArMTk4Nyw3IEBACiAJaWYgKCFpcHY0X2lzX211bHRpY2FzdChhZGRyKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlydG5sX2xvY2soKTsKKwlBU1NFUlRfUlROTCgpOwogCiAJaW1yLmltcl9tdWx0aWFkZHIuc19hZGRyID0gbXJlcXMtPmltcl9tdWx0aWFkZHI7CiAJaW1yLmltcl9hZGRyZXNzLnNfYWRkciA9IG1yZXFzLT5pbXJfaW50ZXJmYWNlOwpAQCAtMjEwNyw5ICsyMTAxLDggQEAKIAlpcF9tY19hZGRfc3JjKGluX2RldiwgJm1yZXFzLT5pbXJfbXVsdGlhZGRyLCBvbW9kZSwgMSwKIAkJJm1yZXFzLT5pbXJfc291cmNlYWRkciwgMSk7CiBkb25lOgotCXJ0bmxfdW5sb2NrKCk7CiAJaWYgKGxlYXZlZ3JvdXApCi0JCXJldHVybiBpcF9tY19sZWF2ZV9ncm91cChzaywgJmltcik7CisJCWVyciA9IGlwX21jX2xlYXZlX2dyb3VwKHNrLCAmaW1yKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMTMxLDcgKzIxMjQsNyBAQAogCSAgICBtc2YtPmltc2ZfZm1vZGUgIT0gTUNBU1RfRVhDTFVERSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlydG5sX2xvY2soKTsKKwlBU1NFUlRfUlROTCgpOwogCiAJaW1yLmltcl9tdWx0aWFkZHIuc19hZGRyID0gbXNmLT5pbXNmX211bHRpYWRkcjsKIAlpbXIuaW1yX2FkZHJlc3Muc19hZGRyID0gbXNmLT5pbXNmX2ludGVyZmFjZTsKQEAgLTIxOTMsNyArMjE4Niw2IEBACiAJcG1jLT5zZm1vZGUgPSBtc2YtPmltc2ZfZm1vZGU7CiAJZXJyID0gMDsKIGRvbmU6Ci0JcnRubF91bmxvY2soKTsKIAlpZiAobGVhdmVncm91cCkKIAkJZXJyID0gaXBfbWNfbGVhdmVfZ3JvdXAoc2ssICZpbXIpOwogCXJldHVybiBlcnI7CkBAIC0yMzY4LDcgKzIzNjAsNyBAQAogCXN0cnVjdCBpcF9tY19zb2NrbGlzdCAqaW1sOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKIAotCWlmIChpbmV0LT5tY19saXN0ID09IE5VTEwpCisJaWYgKCFpbmV0LT5tY19saXN0KQogCQlyZXR1cm47CiAKIAlydG5sX2xvY2soKTsKQEAgLTIzNzgsNyArMjM3MCw3IEBACiAJCWluZXQtPm1jX2xpc3QgPSBpbWwtPm5leHRfcmN1OwogCQlpbl9kZXYgPSBpbmV0ZGV2X2J5X2luZGV4KG5ldCwgaW1sLT5tdWx0aS5pbXJfaWZpbmRleCk7CiAJCSh2b2lkKSBpcF9tY19sZWF2ZV9zcmMoc2ssIGltbCwgaW5fZGV2KTsKLQkJaWYgKGluX2RldiAhPSBOVUxMKQorCQlpZiAoaW5fZGV2KQogCQkJaXBfbWNfZGVjX2dyb3VwKGluX2RldiwgaW1sLT5tdWx0aS5pbXJfbXVsdGlhZGRyLnNfYWRkcik7CiAJCS8qIGRlY3JlYXNlIG1lbSBub3cgdG8gYXZvaWQgdGhlIG1lbWxlYWsgd2FybmluZyAqLwogCQlhdG9taWNfc3ViKHNpemVvZigqaW1sKSwgJnNrLT5za19vbWVtX2FsbG9jKTsKQEAgLTI1OTUsMTMgKzI1ODcsMTMgQEAKIAlmb3JfZWFjaF9uZXRkZXZfcmN1KG5ldCwgc3RhdGUtPmRldikgewogCQlzdHJ1Y3QgaW5fZGV2aWNlICppZGV2OwogCQlpZGV2ID0gX19pbl9kZXZfZ2V0X3JjdShzdGF0ZS0+ZGV2KTsKLQkJaWYgKHVubGlrZWx5KGlkZXYgPT0gTlVMTCkpCisJCWlmICh1bmxpa2VseSghaWRldikpCiAJCQljb250aW51ZTsKIAkJaW0gPSByY3VfZGVyZWZlcmVuY2UoaWRldi0+bWNfbGlzdCk7Ci0JCWlmIChsaWtlbHkoaW0gIT0gTlVMTCkpIHsKKwkJaWYgKGxpa2VseShpbSkpIHsKIAkJCXNwaW5fbG9ja19iaCgmaW0tPmxvY2spOwogCQkJcHNmID0gaW0tPnNvdXJjZXM7Ci0JCQlpZiAobGlrZWx5KHBzZiAhPSBOVUxMKSkgeworCQkJaWYgKGxpa2VseShwc2YpKSB7CiAJCQkJc3RhdGUtPmltID0gaW07CiAJCQkJc3RhdGUtPmlkZXYgPSBpZGV2OwogCQkJCWJyZWFrOwpAQCAtMjY3MSw3ICsyNjYzLDcgQEAKIAlfX3JlbGVhc2VzKHJjdSkKIHsKIAlzdHJ1Y3QgaWdtcF9tY2ZfaXRlcl9zdGF0ZSAqc3RhdGUgPSBpZ21wX21jZl9zZXFfcHJpdmF0ZShzZXEpOwotCWlmIChsaWtlbHkoc3RhdGUtPmltICE9IE5VTEwpKSB7CisJaWYgKGxpa2VseShzdGF0ZS0+aW0pKSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZS0+aW0tPmxvY2spOwogCQlzdGF0ZS0+aW0gPSBOVUxMOwogCX0KQEAgLTI3MjQsNiArMjcxNiw3IEBACiBzdGF0aWMgaW50IF9fbmV0X2luaXQgaWdtcF9uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZGU7CisJaW50IGVycjsKIAogCXBkZSA9IHByb2NfY3JlYXRlKCJpZ21wIiwgU19JUlVHTywgbmV0LT5wcm9jX25ldCwgJmlnbXBfbWNfc2VxX2ZvcHMpOwogCWlmICghcGRlKQpAQCAtMjczMiw4ICsyNzI1LDE4IEBACiAJCQkgICZpZ21wX21jZl9zZXFfZm9wcyk7CiAJaWYgKCFwZGUpCiAJCWdvdG8gb3V0X21jZmlsdGVyOworCWVyciA9IGluZXRfY3RsX3NvY2tfY3JlYXRlKCZuZXQtPmlwdjQubWNfYXV0b2pvaW5fc2ssIEFGX0lORVQsCisJCQkJICAgU09DS19ER1JBTSwgMCwgbmV0KTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBJR01QIGF1dG9qb2luIHNvY2tldCAoZXJyICVkKVxuIiwKKwkJICAgICAgIGVycik7CisJCWdvdG8gb3V0X3NvY2s7CisJfQorCiAJcmV0dXJuIDA7CiAKK291dF9zb2NrOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJtY2ZpbHRlciIsIG5ldC0+cHJvY19uZXQpOwogb3V0X21jZmlsdGVyOgogCXJlbW92ZV9wcm9jX2VudHJ5KCJpZ21wIiwgbmV0LT5wcm9jX25ldCk7CiBvdXRfaWdtcDoKQEAgLTI3NDQsNiArMjc0Nyw3IEBACiB7CiAJcmVtb3ZlX3Byb2NfZW50cnkoIm1jZmlsdGVyIiwgbmV0LT5wcm9jX25ldCk7CiAJcmVtb3ZlX3Byb2NfZW50cnkoImlnbXAiLCBuZXQtPnByb2NfbmV0KTsKKwlpbmV0X2N0bF9zb2NrX2Rlc3Ryb3kobmV0LT5pcHY0Lm1jX2F1dG9qb2luX3NrKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBpZ21wX25ldF9vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jIGIvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYwppbmRleCAxNGQwMmVhLi41YzNkZDYyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jCisrKyBiL25ldC9pcHY0L2luZXRfY29ubmVjdGlvbl9zb2NrLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxuZXQvcm91dGUuaD4KICNpbmNsdWRlIDxuZXQvdGNwX3N0YXRlcy5oPgogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CisjaW5jbHVkZSA8bmV0L3RjcC5oPgogCiAjaWZkZWYgSU5FVF9DU0tfREVCVUcKIGNvbnN0IGNoYXIgaW5ldF9jc2tfdGltZXJfYnVnX21zZ1tdID0gImluZXRfY3NrIEJVRzogdW5rbm93biB0aW1lciB2YWx1ZVxuIjsKQEAgLTI2OCw2ICsyNjksNyBAQAogCQlyZWxlYXNlX3NvY2soc2spOwogCQlpZiAocmVxc2tfcXVldWVfZW1wdHkoJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlKSkKIAkJCXRpbWVvID0gc2NoZWR1bGVfdGltZW91dCh0aW1lbyk7CisJCXNjaGVkX2Fubm90YXRlX3NsZWVwKCk7CiAJCWxvY2tfc29jayhzayk7CiAJCWVyciA9IDA7CiAJCWlmICghcmVxc2tfcXVldWVfZW1wdHkoJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlKSkKQEAgLTI5Myw4ICsyOTUsOCBAQAogewogCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlICpxdWV1ZSA9ICZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZTsKLQlzdHJ1Y3Qgc29jayAqbmV3c2s7CiAJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxOworCXN0cnVjdCBzb2NrICpuZXdzazsKIAlpbnQgZXJyb3I7CiAKIAlsb2NrX3NvY2soc2spOwpAQCAtMzIzLDkgKzMyNSwxMSBAQAogCW5ld3NrID0gcmVxLT5zazsKIAogCXNrX2FjY2VwdHFfcmVtb3ZlZChzayk7Ci0JaWYgKHNrLT5za19wcm90b2NvbCA9PSBJUFBST1RPX1RDUCAmJiBxdWV1ZS0+ZmFzdG9wZW5xICE9IE5VTEwpIHsKKwlpZiAoc2stPnNrX3Byb3RvY29sID09IElQUFJPVE9fVENQICYmCisJICAgIHRjcF9yc2socmVxKS0+dGZvX2xpc3RlbmVyICYmCisJICAgIHF1ZXVlLT5mYXN0b3BlbnEpIHsKIAkJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+ZmFzdG9wZW5xLT5sb2NrKTsKLQkJaWYgKHRjcF9yc2socmVxKS0+bGlzdGVuZXIpIHsKKwkJaWYgKHRjcF9yc2socmVxKS0+dGZvX2xpc3RlbmVyKSB7CiAJCQkvKiBXZSBhcmUgc3RpbGwgd2FpdGluZyBmb3IgdGhlIGZpbmFsIEFDSyBmcm9tIDNXSFMKIAkJCSAqIHNvIGNhbid0IGZyZWUgcmVxIG5vdy4gSW5zdGVhZCwgd2Ugc2V0IHJlcS0+c2sgdG8KIAkJCSAqIE5VTEwgdG8gc2lnbmlmeSB0aGF0IHRoZSBjaGlsZCBzb2NrZXQgaXMgdGFrZW4KQEAgLTM0MCw3ICszNDQsNyBAQAogb3V0OgogCXJlbGVhc2Vfc29jayhzayk7CiAJaWYgKHJlcSkKLQkJX19yZXFza19mcmVlKHJlcSk7CisJCXJlcXNrX3B1dChyZXEpOwogCXJldHVybiBuZXdzazsKIG91dF9lcnI6CiAJbmV3c2sgPSBOVUxMOwpAQCAtMzk5LDE4ICs0MDMsMTcgQEAKIAkJCQkgICAgIHN0cnVjdCBmbG93aTQgKmZsNCwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKIHsKLQlzdHJ1Y3QgcnRhYmxlICpydDsKIAljb25zdCBzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXEgPSBpbmV0X3JzayhyZXEpOwotCXN0cnVjdCBpcF9vcHRpb25zX3JjdSAqb3B0ID0gaW5ldF9yc2socmVxKS0+b3B0OwotCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKLQlpbnQgZmxhZ3MgPSBpbmV0X3NrX2Zsb3dpX2ZsYWdzKHNrKTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSByZWFkX3BuZXQoJmlyZXEtPmlyZXFfbmV0KTsKKwlzdHJ1Y3QgaXBfb3B0aW9uc19yY3UgKm9wdCA9IGlyZXEtPm9wdDsKKwlzdHJ1Y3QgcnRhYmxlICpydDsKIAotCWZsb3dpNF9pbml0X291dHB1dChmbDQsIHNrLT5za19ib3VuZF9kZXZfaWYsIGlyZXEtPmlyX21hcmssCisJZmxvd2k0X2luaXRfb3V0cHV0KGZsNCwgaXJlcS0+aXJfaWlmLCBpcmVxLT5pcl9tYXJrLAogCQkJICAgUlRfQ09OTl9GTEFHUyhzayksIFJUX1NDT1BFX1VOSVZFUlNFLAotCQkJICAgc2stPnNrX3Byb3RvY29sLAotCQkJICAgZmxhZ3MsCisJCQkgICBzay0+c2tfcHJvdG9jb2wsIGluZXRfc2tfZmxvd2lfZmxhZ3Moc2spLAogCQkJICAgKG9wdCAmJiBvcHQtPm9wdC5zcnIpID8gb3B0LT5vcHQuZmFkZHIgOiBpcmVxLT5pcl9ybXRfYWRkciwKLQkJCSAgIGlyZXEtPmlyX2xvY19hZGRyLCBpcmVxLT5pcl9ybXRfcG9ydCwgaW5ldF9zayhzayktPmluZXRfc3BvcnQpOworCQkJICAgaXJlcS0+aXJfbG9jX2FkZHIsIGlyZXEtPmlyX3JtdF9wb3J0LAorCQkJICAgaHRvbnMoaXJlcS0+aXJfbnVtKSk7CiAJc2VjdXJpdHlfcmVxX2NsYXNzaWZ5X2Zsb3cocmVxLCBmbG93aTRfdG9fZmxvd2koZmw0KSk7CiAJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfZmxvdyhuZXQsIGZsNCwgc2spOwogCWlmIChJU19FUlIocnQpKQpAQCAtNDMyLDkgKzQzNSw5IEBACiAJCQkJCSAgICBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEpCiB7CiAJY29uc3Qgc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppcmVxID0gaW5ldF9yc2socmVxKTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSByZWFkX3BuZXQoJmlyZXEtPmlyZXFfbmV0KTsKIAlzdHJ1Y3QgaW5ldF9zb2NrICpuZXdpbmV0ID0gaW5ldF9zayhuZXdzayk7CiAJc3RydWN0IGlwX29wdGlvbnNfcmN1ICpvcHQ7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCXN0cnVjdCBmbG93aTQgKmZsNDsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKIApAQCAtNDQyLDExICs0NDUsMTIgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlvcHQgPSByY3VfZGVyZWZlcmVuY2UobmV3aW5ldC0+aW5ldF9vcHQpOwotCWZsb3dpNF9pbml0X291dHB1dChmbDQsIHNrLT5za19ib3VuZF9kZXZfaWYsIGluZXRfcnNrKHJlcSktPmlyX21hcmssCisJZmxvd2k0X2luaXRfb3V0cHV0KGZsNCwgaXJlcS0+aXJfaWlmLCBpcmVxLT5pcl9tYXJrLAogCQkJICAgUlRfQ09OTl9GTEFHUyhzayksIFJUX1NDT1BFX1VOSVZFUlNFLAogCQkJICAgc2stPnNrX3Byb3RvY29sLCBpbmV0X3NrX2Zsb3dpX2ZsYWdzKHNrKSwKIAkJCSAgIChvcHQgJiYgb3B0LT5vcHQuc3JyKSA/IG9wdC0+b3B0LmZhZGRyIDogaXJlcS0+aXJfcm10X2FkZHIsCi0JCQkgICBpcmVxLT5pcl9sb2NfYWRkciwgaXJlcS0+aXJfcm10X3BvcnQsIGluZXRfc2soc2spLT5pbmV0X3Nwb3J0KTsKKwkJCSAgIGlyZXEtPmlyX2xvY19hZGRyLCBpcmVxLT5pcl9ybXRfcG9ydCwKKwkJCSAgIGh0b25zKGlyZXEtPmlyX251bSkpOwogCXNlY3VyaXR5X3JlcV9jbGFzc2lmeV9mbG93KHJlcSwgZmxvd2k0X3RvX2Zsb3dpKGZsNCkpOwogCXJ0ID0gaXBfcm91dGVfb3V0cHV0X2Zsb3cobmV0LCBmbDQsIHNrKTsKIAlpZiAoSVNfRVJSKHJ0KSkKQEAgLTQ3NCwzMyArNDc4LDM3IEBACiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKICNkZWZpbmUgQUZfSU5FVF9GQU1JTFkoZmFtKSAoKGZhbSkgPT0gQUZfSU5FVCkKICNlbHNlCi0jZGVmaW5lIEFGX0lORVRfRkFNSUxZKGZhbSkgMQorI2RlZmluZSBBRl9JTkVUX0ZBTUlMWShmYW0pIHRydWUKICNlbmRpZgogCi1zdHJ1Y3QgcmVxdWVzdF9zb2NrICppbmV0X2Nza19zZWFyY2hfcmVxKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkJIHN0cnVjdCByZXF1ZXN0X3NvY2sgKioqcHJldnAsCi0JCQkJCSBjb25zdCBfX2JlMTYgcnBvcnQsIGNvbnN0IF9fYmUzMiByYWRkciwKKy8qIE5vdGU6IHRoaXMgaXMgdGVtcG9yYXJ5IDoKKyAqIHJlcSBzb2NrIHdpbGwgbm8gbG9uZ2VyIGJlIGluIGxpc3RlbmVyIGhhc2ggdGFibGUKKyovCitzdHJ1Y3QgcmVxdWVzdF9zb2NrICppbmV0X2Nza19zZWFyY2hfcmVxKHN0cnVjdCBzb2NrICpzaywKKwkJCQkJIGNvbnN0IF9fYmUxNiBycG9ydCwKKwkJCQkJIGNvbnN0IF9fYmUzMiByYWRkciwKIAkJCQkJIGNvbnN0IF9fYmUzMiBsYWRkcikKIHsKLQljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CisJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCXN0cnVjdCBsaXN0ZW5fc29jayAqbG9wdCA9IGljc2stPmljc2tfYWNjZXB0X3F1ZXVlLmxpc3Rlbl9vcHQ7Ci0Jc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLCAqKnByZXY7CisJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxOworCXUzMiBoYXNoID0gaW5ldF9zeW5xX2hhc2gocmFkZHIsIHJwb3J0LCBsb3B0LT5oYXNoX3JuZCwKKwkJCQkgIGxvcHQtPm5yX3RhYmxlX2VudHJpZXMpOwogCi0JZm9yIChwcmV2ID0gJmxvcHQtPnN5bl90YWJsZVtpbmV0X3N5bnFfaGFzaChyYWRkciwgcnBvcnQsIGxvcHQtPmhhc2hfcm5kLAotCQkJCQkJICAgIGxvcHQtPm5yX3RhYmxlX2VudHJpZXMpXTsKLQkgICAgIChyZXEgPSAqcHJldikgIT0gTlVMTDsKLQkgICAgIHByZXYgPSAmcmVxLT5kbF9uZXh0KSB7CisJc3Bpbl9sb2NrKCZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5zeW5fd2FpdF9sb2NrKTsKKwlmb3IgKHJlcSA9IGxvcHQtPnN5bl90YWJsZVtoYXNoXTsgcmVxICE9IE5VTEw7IHJlcSA9IHJlcS0+ZGxfbmV4dCkgewogCQljb25zdCBzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXEgPSBpbmV0X3JzayhyZXEpOwogCiAJCWlmIChpcmVxLT5pcl9ybXRfcG9ydCA9PSBycG9ydCAmJgogCQkgICAgaXJlcS0+aXJfcm10X2FkZHIgPT0gcmFkZHIgJiYKIAkJICAgIGlyZXEtPmlyX2xvY19hZGRyID09IGxhZGRyICYmCiAJCSAgICBBRl9JTkVUX0ZBTUlMWShyZXEtPnJza19vcHMtPmZhbWlseSkpIHsKKwkJCWF0b21pY19pbmMoJnJlcS0+cnNrX3JlZmNudCk7CiAJCQlXQVJOX09OKHJlcS0+c2spOwotCQkJKnByZXZwID0gcHJldjsKIAkJCWJyZWFrOwogCQl9CiAJfQorCXNwaW5fdW5sb2NrKCZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5zeW5fd2FpdF9sb2NrKTsKIAogCXJldHVybiByZXE7CiB9CkBAIC01NTYsMjMgKzU2NCwyNCBAQAogfQogRVhQT1JUX1NZTUJPTChpbmV0X3J0eF9zeW5fYWNrKTsKIAotdm9pZCBpbmV0X2Nza19yZXFza19xdWV1ZV9wcnVuZShzdHJ1Y3Qgc29jayAqcGFyZW50LAotCQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwsCi0JCQkJY29uc3QgdW5zaWduZWQgbG9uZyB0aW1lb3V0LAotCQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWF4X3J0bykKK3N0YXRpYyB2b2lkIHJlcXNrX3RpbWVyX2hhbmRsZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHBhcmVudCk7CisJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxID0gKHN0cnVjdCByZXF1ZXN0X3NvY2sgKilkYXRhOworCXN0cnVjdCBzb2NrICpza19saXN0ZW5lciA9IHJlcS0+cnNrX2xpc3RlbmVyOworCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrX2xpc3RlbmVyKTsKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrX3F1ZXVlICpxdWV1ZSA9ICZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZTsKIAlzdHJ1Y3QgbGlzdGVuX3NvY2sgKmxvcHQgPSBxdWV1ZS0+bGlzdGVuX29wdDsKLQlpbnQgbWF4X3JldHJpZXMgPSBpY3NrLT5pY3NrX3N5bl9yZXRyaWVzID8gOiBzeXNjdGxfdGNwX3N5bmFja19yZXRyaWVzOwotCWludCB0aHJlc2ggPSBtYXhfcmV0cmllczsKLQl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7Ci0Jc3RydWN0IHJlcXVlc3Rfc29jayAqKnJlcXAsICpyZXE7Ci0JaW50IGksIGJ1ZGdldDsKKwlpbnQgcWxlbiwgZXhwaXJlID0gMCwgcmVzZW5kID0gMDsKKwlpbnQgbWF4X3JldHJpZXMsIHRocmVzaDsKKwl1OCBkZWZlcl9hY2NlcHQ7CiAKLQlpZiAobG9wdCA9PSBOVUxMIHx8IGxvcHQtPnFsZW4gPT0gMCkKKwlpZiAoc2tfbGlzdGVuZXItPnNrX3N0YXRlICE9IFRDUF9MSVNURU4gfHwgIWxvcHQpIHsKKwkJcmVxc2tfcHV0KHJlcSk7CiAJCXJldHVybjsKKwl9CiAKKwltYXhfcmV0cmllcyA9IGljc2stPmljc2tfc3luX3JldHJpZXMgPyA6IHN5c2N0bF90Y3Bfc3luYWNrX3JldHJpZXM7CisJdGhyZXNoID0gbWF4X3JldHJpZXM7CiAJLyogTm9ybWFsbHkgYWxsIHRoZSBvcGVucmVxcyBhcmUgeW91bmcgYW5kIGJlY29tZSBtYXR1cmUKIAkgKiAoaS5lLiBjb252ZXJ0ZWQgdG8gZXN0YWJsaXNoZWQgc29ja2V0KSBmb3IgZmlyc3QgdGltZW91dC4KIAkgKiBJZiBzeW5hY2sgd2FzIG5vdCBhY2tub3dsZWRnZWQgZm9yIDEgc2Vjb25kLCBpdCBtZWFucwpAQCAtNTkwLDY3ICs1OTksNjUgQEAKIAkgKiBlbWJyaW9uczsgYW5kIGFib3J0IG9sZCBvbmVzIHdpdGhvdXQgcGl0eSwgaWYgb2xkCiAJICogb25lcyBhcmUgYWJvdXQgdG8gY2xvZyBvdXIgdGFibGUuCiAJICovCi0JaWYgKGxvcHQtPnFsZW4+Pihsb3B0LT5tYXhfcWxlbl9sb2ctMSkpIHsKLQkJaW50IHlvdW5nID0gKGxvcHQtPnFsZW5feW91bmc8PDEpOworCXFsZW4gPSBsaXN0ZW5fc29ja19xbGVuKGxvcHQpOworCWlmIChxbGVuID4+IChsb3B0LT5tYXhfcWxlbl9sb2cgLSAxKSkgeworCQlpbnQgeW91bmcgPSBsaXN0ZW5fc29ja195b3VuZyhsb3B0KSA8PCAxOwogCiAJCXdoaWxlICh0aHJlc2ggPiAyKSB7Ci0JCQlpZiAobG9wdC0+cWxlbiA8IHlvdW5nKQorCQkJaWYgKHFsZW4gPCB5b3VuZykKIAkJCQlicmVhazsKIAkJCXRocmVzaC0tOwogCQkJeW91bmcgPDw9IDE7CiAJCX0KIAl9CisJZGVmZXJfYWNjZXB0ID0gUkVBRF9PTkNFKHF1ZXVlLT5yc2txX2RlZmVyX2FjY2VwdCk7CisJaWYgKGRlZmVyX2FjY2VwdCkKKwkJbWF4X3JldHJpZXMgPSBkZWZlcl9hY2NlcHQ7CisJc3luX2Fja19yZWNhbGMocmVxLCB0aHJlc2gsIG1heF9yZXRyaWVzLCBkZWZlcl9hY2NlcHQsCisJCSAgICAgICAmZXhwaXJlLCAmcmVzZW5kKTsKKwlyZXEtPnJza19vcHMtPnN5bl9hY2tfdGltZW91dChyZXEpOworCWlmICghZXhwaXJlICYmCisJICAgICghcmVzZW5kIHx8CisJICAgICAhaW5ldF9ydHhfc3luX2Fjayhza19saXN0ZW5lciwgcmVxKSB8fAorCSAgICAgaW5ldF9yc2socmVxKS0+YWNrZWQpKSB7CisJCXVuc2lnbmVkIGxvbmcgdGltZW87CiAKLQlpZiAocXVldWUtPnJza3FfZGVmZXJfYWNjZXB0KQotCQltYXhfcmV0cmllcyA9IHF1ZXVlLT5yc2txX2RlZmVyX2FjY2VwdDsKLQotCWJ1ZGdldCA9IDIgKiAobG9wdC0+bnJfdGFibGVfZW50cmllcyAvICh0aW1lb3V0IC8gaW50ZXJ2YWwpKTsKLQlpID0gbG9wdC0+Y2xvY2tfaGFuZDsKLQotCWRvIHsKLQkJcmVxcD0mbG9wdC0+c3luX3RhYmxlW2ldOwotCQl3aGlsZSAoKHJlcSA9ICpyZXFwKSAhPSBOVUxMKSB7Ci0JCQlpZiAodGltZV9hZnRlcl9lcShub3csIHJlcS0+ZXhwaXJlcykpIHsKLQkJCQlpbnQgZXhwaXJlID0gMCwgcmVzZW5kID0gMDsKLQotCQkJCXN5bl9hY2tfcmVjYWxjKHJlcSwgdGhyZXNoLCBtYXhfcmV0cmllcywKLQkJCQkJICAgICAgIHF1ZXVlLT5yc2txX2RlZmVyX2FjY2VwdCwKLQkJCQkJICAgICAgICZleHBpcmUsICZyZXNlbmQpOwotCQkJCXJlcS0+cnNrX29wcy0+c3luX2Fja190aW1lb3V0KHBhcmVudCwgcmVxKTsKLQkJCQlpZiAoIWV4cGlyZSAmJgotCQkJCSAgICAoIXJlc2VuZCB8fAotCQkJCSAgICAgIWluZXRfcnR4X3N5bl9hY2socGFyZW50LCByZXEpIHx8Ci0JCQkJICAgICBpbmV0X3JzayhyZXEpLT5hY2tlZCkpIHsKLQkJCQkJdW5zaWduZWQgbG9uZyB0aW1lbzsKLQotCQkJCQlpZiAocmVxLT5udW1fdGltZW91dCsrID09IDApCi0JCQkJCQlsb3B0LT5xbGVuX3lvdW5nLS07Ci0JCQkJCXRpbWVvID0gbWluKHRpbWVvdXQgPDwgcmVxLT5udW1fdGltZW91dCwKLQkJCQkJCSAgICBtYXhfcnRvKTsKLQkJCQkJcmVxLT5leHBpcmVzID0gbm93ICsgdGltZW87Ci0JCQkJCXJlcXAgPSAmcmVxLT5kbF9uZXh0OwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvKiBEcm9wIHRoaXMgcmVxdWVzdCAqLwotCQkJCWluZXRfY3NrX3JlcXNrX3F1ZXVlX3VubGluayhwYXJlbnQsIHJlcSwgcmVxcCk7Ci0JCQkJcmVxc2tfcXVldWVfcmVtb3ZlZChxdWV1ZSwgcmVxKTsKLQkJCQlyZXFza19mcmVlKHJlcSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZXFwID0gJnJlcS0+ZGxfbmV4dDsKLQkJfQotCi0JCWkgPSAoaSArIDEpICYgKGxvcHQtPm5yX3RhYmxlX2VudHJpZXMgLSAxKTsKLQotCX0gd2hpbGUgKC0tYnVkZ2V0ID4gMCk7Ci0KLQlsb3B0LT5jbG9ja19oYW5kID0gaTsKLQotCWlmIChsb3B0LT5xbGVuKQotCQlpbmV0X2Nza19yZXNldF9rZWVwYWxpdmVfdGltZXIocGFyZW50LCBpbnRlcnZhbCk7CisJCWlmIChyZXEtPm51bV90aW1lb3V0KysgPT0gMCkKKwkJCWF0b21pY19pbmMoJmxvcHQtPnlvdW5nX2RlYyk7CisJCXRpbWVvID0gbWluKFRDUF9USU1FT1VUX0lOSVQgPDwgcmVxLT5udW1fdGltZW91dCwgVENQX1JUT19NQVgpOworCQltb2RfdGltZXJfcGlubmVkKCZyZXEtPnJza190aW1lciwgamlmZmllcyArIHRpbWVvKTsKKwkJcmV0dXJuOworCX0KKwlpbmV0X2Nza19yZXFza19xdWV1ZV9kcm9wKHNrX2xpc3RlbmVyLCByZXEpOworCXJlcXNrX3B1dChyZXEpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF9jc2tfcmVxc2tfcXVldWVfcHJ1bmUpOworCit2b2lkIHJlcXNrX3F1ZXVlX2hhc2hfcmVxKHN0cnVjdCByZXF1ZXN0X3NvY2tfcXVldWUgKnF1ZXVlLAorCQkJICB1MzIgaGFzaCwgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorCQkJICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJc3RydWN0IGxpc3Rlbl9zb2NrICpsb3B0ID0gcXVldWUtPmxpc3Rlbl9vcHQ7CisKKwlyZXEtPm51bV9yZXRyYW5zID0gMDsKKwlyZXEtPm51bV90aW1lb3V0ID0gMDsKKwlyZXEtPnNrID0gTlVMTDsKKworCS8qIGJlZm9yZSBsZXR0aW5nIGxvb2t1cHMgZmluZCB1cywgbWFrZSBzdXJlIGFsbCByZXEgZmllbGRzCisJICogYXJlIGNvbW1pdHRlZCB0byBtZW1vcnkgYW5kIHJlZmNudCBpbml0aWFsaXplZC4KKwkgKi8KKwlzbXBfd21iKCk7CisJYXRvbWljX3NldCgmcmVxLT5yc2tfcmVmY250LCAyKTsKKwlzZXR1cF90aW1lcigmcmVxLT5yc2tfdGltZXIsIHJlcXNrX3RpbWVyX2hhbmRsZXIsICh1bnNpZ25lZCBsb25nKXJlcSk7CisJcmVxLT5yc2tfaGFzaCA9IGhhc2g7CisKKwlzcGluX2xvY2soJnF1ZXVlLT5zeW5fd2FpdF9sb2NrKTsKKwlyZXEtPmRsX25leHQgPSBsb3B0LT5zeW5fdGFibGVbaGFzaF07CisJbG9wdC0+c3luX3RhYmxlW2hhc2hdID0gcmVxOworCXNwaW5fdW5sb2NrKCZxdWV1ZS0+c3luX3dhaXRfbG9jayk7CisKKwltb2RfdGltZXJfcGlubmVkKCZyZXEtPnJza190aW1lciwgamlmZmllcyArIHRpbWVvdXQpOworfQorRVhQT1JUX1NZTUJPTChyZXFza19xdWV1ZV9oYXNoX3JlcSk7CiAKIC8qKgogICoJaW5ldF9jc2tfY2xvbmVfbG9jayAtIGNsb25lIGFuIGluZXQgc29ja2V0LCBhbmQgbG9jayBpdHMgY2xvbmUKQEAgLTY2Niw3ICs2NzMsNyBAQAogewogCXN0cnVjdCBzb2NrICpuZXdzayA9IHNrX2Nsb25lX2xvY2soc2ssIHByaW9yaXR5KTsKIAotCWlmIChuZXdzayAhPSBOVUxMKSB7CisJaWYgKG5ld3NrKSB7CiAJCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqbmV3aWNzayA9IGluZXRfY3NrKG5ld3NrKTsKIAogCQluZXdzay0+c2tfc3RhdGUgPSBUQ1BfU1lOX1JFQ1Y7CkBAIC02NzgsNiArNjg1LDggQEAKIAkJbmV3c2stPnNrX3dyaXRlX3NwYWNlID0gc2tfc3RyZWFtX3dyaXRlX3NwYWNlOwogCiAJCW5ld3NrLT5za19tYXJrID0gaW5ldF9yc2socmVxKS0+aXJfbWFyazsKKwkJYXRvbWljNjRfc2V0KCZuZXdzay0+c2tfY29va2llLAorCQkJICAgICBhdG9taWM2NF9yZWFkKCZpbmV0X3JzayhyZXEpLT5pcl9jb29raWUpKTsKIAogCQluZXdpY3NrLT5pY3NrX3JldHJhbnNtaXRzID0gMDsKIAkJbmV3aWNzay0+aWNza19iYWNrb2ZmCSAgPSAwOwpAQCAtNzg0LDggKzc5Myw2IEBACiAJc3RydWN0IHJlcXVlc3Rfc29jayAqYWNjX3JlcTsKIAlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXE7CiAKLQlpbmV0X2Nza19kZWxldGVfa2VlcGFsaXZlX3RpbWVyKHNrKTsKLQogCS8qIG1ha2UgYWxsIHRoZSBsaXN0ZW5fb3B0IGxvY2FsIHRvIHVzICovCiAJYWNjX3JlcSA9IHJlcXNrX3F1ZXVlX3lhbmtfYWNjZXB0cShxdWV1ZSk7CiAKQEAgLTgxNSw5ICs4MjIsOSBAQAogCiAJCXBlcmNwdV9jb3VudGVyX2luYyhzay0+c2tfcHJvdC0+b3JwaGFuX2NvdW50KTsKIAotCQlpZiAoc2stPnNrX3Byb3RvY29sID09IElQUFJPVE9fVENQICYmIHRjcF9yc2socmVxKS0+bGlzdGVuZXIpIHsKKwkJaWYgKHNrLT5za19wcm90b2NvbCA9PSBJUFBST1RPX1RDUCAmJiB0Y3BfcnNrKHJlcSktPnRmb19saXN0ZW5lcikgewogCQkJQlVHX09OKHRjcF9zayhjaGlsZCktPmZhc3RvcGVuX3JzayAhPSByZXEpOwotCQkJQlVHX09OKHNrICE9IHRjcF9yc2socmVxKS0+bGlzdGVuZXIpOworCQkJQlVHX09OKHNrICE9IHJlcS0+cnNrX2xpc3RlbmVyKTsKIAogCQkJLyogUGFyYW5vaWQsIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb24gaWYKIAkJCSAqIGFuIGluYm91bmQgcGt0IGRlc3RpbmVkIGZvciBjaGlsZCBpcwpAQCAtODI2LDcgKzgzMyw2IEBACiAJCQkgKiB0Y3BfdjRfZGVzdHJveV9zb2NrKCkuCiAJCQkgKi8KIAkJCXRjcF9zayhjaGlsZCktPmZhc3RvcGVuX3JzayA9IE5VTEw7Ci0JCQlzb2NrX3B1dChzayk7CiAJCX0KIAkJaW5ldF9jc2tfZGVzdHJveV9zb2NrKGNoaWxkKTsKIApAQCAtODM1LDkgKzg0MSw5IEBACiAJCXNvY2tfcHV0KGNoaWxkKTsKIAogCQlza19hY2NlcHRxX3JlbW92ZWQoc2spOwotCQlfX3JlcXNrX2ZyZWUocmVxKTsKKwkJcmVxc2tfcHV0KHJlcSk7CiAJfQotCWlmIChxdWV1ZS0+ZmFzdG9wZW5xICE9IE5VTEwpIHsKKwlpZiAocXVldWUtPmZhc3RvcGVucSkgewogCQkvKiBGcmVlIGFsbCB0aGUgcmVxcyBxdWV1ZWQgaW4gcnNrcV9yc3RfaGVhZC4gKi8KIAkJc3Bpbl9sb2NrX2JoKCZxdWV1ZS0+ZmFzdG9wZW5xLT5sb2NrKTsKIAkJYWNjX3JlcSA9IHF1ZXVlLT5mYXN0b3BlbnEtPnJza3FfcnN0X2hlYWQ7CkBAIC04NDUsNyArODUxLDcgQEAKIAkJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlLT5mYXN0b3BlbnEtPmxvY2spOwogCQl3aGlsZSAoKHJlcSA9IGFjY19yZXEpICE9IE5VTEwpIHsKIAkJCWFjY19yZXEgPSByZXEtPmRsX25leHQ7Ci0JCQlfX3JlcXNrX2ZyZWUocmVxKTsKKwkJCXJlcXNrX3B1dChyZXEpOwogCQl9CiAJfQogCVdBUk5fT04oc2stPnNrX2Fja19iYWNrbG9nKTsKQEAgLTg2OSw3ICs4NzUsNyBAQAogewogCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAotCWlmIChpY3NrLT5pY3NrX2FmX29wcy0+Y29tcGF0X2dldHNvY2tvcHQgIT0gTlVMTCkKKwlpZiAoaWNzay0+aWNza19hZl9vcHMtPmNvbXBhdF9nZXRzb2Nrb3B0KQogCQlyZXR1cm4gaWNzay0+aWNza19hZl9vcHMtPmNvbXBhdF9nZXRzb2Nrb3B0KHNrLCBsZXZlbCwgb3B0bmFtZSwKIAkJCQkJCQkgICAgb3B0dmFsLCBvcHRsZW4pOwogCXJldHVybiBpY3NrLT5pY3NrX2FmX29wcy0+Z2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsCkBAIC04ODIsNyArODg4LDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2Nzayhzayk7CiAKLQlpZiAoaWNzay0+aWNza19hZl9vcHMtPmNvbXBhdF9zZXRzb2Nrb3B0ICE9IE5VTEwpCisJaWYgKGljc2stPmljc2tfYWZfb3BzLT5jb21wYXRfc2V0c29ja29wdCkKIAkJcmV0dXJuIGljc2stPmljc2tfYWZfb3BzLT5jb21wYXRfc2V0c29ja29wdChzaywgbGV2ZWwsIG9wdG5hbWUsCiAJCQkJCQkJICAgIG9wdHZhbCwgb3B0bGVuKTsKIAlyZXR1cm4gaWNzay0+aWNza19hZl9vcHMtPnNldHNvY2tvcHQoc2ssIGxldmVsLCBvcHRuYW1lLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9kaWFnLmMgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwppbmRleCA4MTc1MWYxLi43MGU4YjNjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pbmV0X2RpYWcuYworKysgYi9uZXQvaXB2NC9pbmV0X2RpYWcuYwpAQCAtMzgsMTYgKzM4LDEyIEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICoqaW5ldF9kaWFnX3RhYmxlOwogCiBzdHJ1Y3QgaW5ldF9kaWFnX2VudHJ5IHsKLQlfX2JlMzIgKnNhZGRyOwotCV9fYmUzMiAqZGFkZHI7CisJY29uc3QgX19iZTMyICpzYWRkcjsKKwljb25zdCBfX2JlMzIgKmRhZGRyOwogCXUxNiBzcG9ydDsKIAl1MTYgZHBvcnQ7CiAJdTE2IGZhbWlseTsKIAl1MTYgdXNlcmxvY2tzOwotI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0Jc3RydWN0IGluNl9hZGRyIHNhZGRyX3N0b3JhZ2U7CS8qIGZvciBJUHY0LW1hcHBlZC1JUHY2IGFkZHJlc3NlcyAqLwotCXN0cnVjdCBpbjZfYWRkciBkYWRkcl9zdG9yYWdlOwkvKiBmb3IgSVB2NC1tYXBwZWQtSVB2NiBhZGRyZXNzZXMgKi8KLSNlbmRpZgogfTsKIAogc3RhdGljIERFRklORV9NVVRFWChpbmV0X2RpYWdfdGFibGVfbXV0ZXgpOwpAQCAtNjUsMjggKzYxLDY1IEBACiAJcmV0dXJuIGluZXRfZGlhZ190YWJsZVtwcm90b107CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpbmV0X2RpYWdfdW5sb2NrX2hhbmRsZXIoCi0JY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyKQorc3RhdGljIHZvaWQgaW5ldF9kaWFnX3VubG9ja19oYW5kbGVyKGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciAqaGFuZGxlcikKIHsKIAltdXRleF91bmxvY2soJmluZXRfZGlhZ190YWJsZV9tdXRleCk7CiB9CiAKK3N0YXRpYyB2b2lkIGluZXRfZGlhZ19tc2dfY29tbW9uX2ZpbGwoc3RydWN0IGluZXRfZGlhZ19tc2cgKnIsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlyLT5pZGlhZ19mYW1pbHkgPSBzay0+c2tfZmFtaWx5OworCisJci0+aWQuaWRpYWdfc3BvcnQgPSBodG9ucyhzay0+c2tfbnVtKTsKKwlyLT5pZC5pZGlhZ19kcG9ydCA9IHNrLT5za19kcG9ydDsKKwlyLT5pZC5pZGlhZ19pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7CisJc29ja19kaWFnX3NhdmVfY29va2llKHNrLCByLT5pZC5pZGlhZ19jb29raWUpOworCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKwlpZiAoc2stPnNrX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkqKHN0cnVjdCBpbjZfYWRkciAqKXItPmlkLmlkaWFnX3NyYyA9IHNrLT5za192Nl9yY3Zfc2FkZHI7CisJCSooc3RydWN0IGluNl9hZGRyICopci0+aWQuaWRpYWdfZHN0ID0gc2stPnNrX3Y2X2RhZGRyOworCX0gZWxzZQorI2VuZGlmCisJeworCW1lbXNldCgmci0+aWQuaWRpYWdfc3JjLCAwLCBzaXplb2Yoci0+aWQuaWRpYWdfc3JjKSk7CisJbWVtc2V0KCZyLT5pZC5pZGlhZ19kc3QsIDAsIHNpemVvZihyLT5pZC5pZGlhZ19kc3QpKTsKKworCXItPmlkLmlkaWFnX3NyY1swXSA9IHNrLT5za19yY3Zfc2FkZHI7CisJci0+aWQuaWRpYWdfZHN0WzBdID0gc2stPnNrX2RhZGRyOworCX0KK30KKworc3RhdGljIHNpemVfdCBpbmV0X3NrX2F0dHJfc2l6ZSh2b2lkKQoreworCXJldHVybgkgIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgdGNwX2luZm8pKQorCQkrIG5sYV90b3RhbF9zaXplKDEpIC8qIElORVRfRElBR19TSFVURE9XTiAqLworCQkrIG5sYV90b3RhbF9zaXplKDEpIC8qIElORVRfRElBR19UT1MgKi8KKwkJKyBubGFfdG90YWxfc2l6ZSgxKSAvKiBJTkVUX0RJQUdfVENMQVNTICovCisJCSsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfbWVtaW5mbykpCisJCSsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfbXNnKSkKKwkJKyBubGFfdG90YWxfc2l6ZShTS19NRU1JTkZPX1ZBUlMgKiBzaXplb2YodTMyKSkKKwkJKyBubGFfdG90YWxfc2l6ZShUQ1BfQ0FfTkFNRV9NQVgpCisJCSsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCB0Y3B2ZWdhc19pbmZvKSkKKwkJKyA2NDsKK30KKwogaW50IGluZXRfc2tfZGlhZ19maWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrLAotCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKLQkJCSAgICAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywJCSAgICAgIAkKLQkJCSAgICAgIHUzMiBwb3J0aWQsIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKKwkJICAgICAgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAorCQkgICAgICB1MzIgcG9ydGlkLCB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKIHsKIAljb25zdCBzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyOworCWludCBleHQgPSByZXEtPmlkaWFnX2V4dDsKIAlzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqcjsKIAlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7CiAJc3RydWN0IG5sYXR0ciAqYXR0cjsKIAl2b2lkICppbmZvID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX2hhbmRsZXIgKmhhbmRsZXI7Ci0JaW50IGV4dCA9IHJlcS0+aWRpYWdfZXh0OwogCiAJaGFuZGxlciA9IGluZXRfZGlhZ190YWJsZVtyZXEtPnNkaWFnX3Byb3RvY29sXTsKLQlCVUdfT04oaGFuZGxlciA9PSBOVUxMKTsKKwlCVUdfT04oIWhhbmRsZXIpOwogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIHVubGgtPm5sbXNnX3R5cGUsIHNpemVvZigqciksCiAJCQlubG1zZ19mbGFncyk7CkBAIC05NCwyNSArMTI3LDEzIEBACiAJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlyID0gbmxtc2dfZGF0YShubGgpOwotCUJVR19PTihzay0+c2tfc3RhdGUgPT0gVENQX1RJTUVfV0FJVCk7CisJQlVHX09OKCFza19mdWxsc29jayhzaykpOwogCi0Jci0+aWRpYWdfZmFtaWx5ID0gc2stPnNrX2ZhbWlseTsKKwlpbmV0X2RpYWdfbXNnX2NvbW1vbl9maWxsKHIsIHNrKTsKIAlyLT5pZGlhZ19zdGF0ZSA9IHNrLT5za19zdGF0ZTsKIAlyLT5pZGlhZ190aW1lciA9IDA7CiAJci0+aWRpYWdfcmV0cmFucyA9IDA7CiAKLQlyLT5pZC5pZGlhZ19pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7Ci0Jc29ja19kaWFnX3NhdmVfY29va2llKHNrLCByLT5pZC5pZGlhZ19jb29raWUpOwotCi0Jci0+aWQuaWRpYWdfc3BvcnQgPSBpbmV0LT5pbmV0X3Nwb3J0OwotCXItPmlkLmlkaWFnX2Rwb3J0ID0gaW5ldC0+aW5ldF9kcG9ydDsKLQotCW1lbXNldCgmci0+aWQuaWRpYWdfc3JjLCAwLCBzaXplb2Yoci0+aWQuaWRpYWdfc3JjKSk7Ci0JbWVtc2V0KCZyLT5pZC5pZGlhZ19kc3QsIDAsIHNpemVvZihyLT5pZC5pZGlhZ19kc3QpKTsKLQotCXItPmlkLmlkaWFnX3NyY1swXSA9IGluZXQtPmluZXRfcmN2X3NhZGRyOwotCXItPmlkLmlkaWFnX2RzdFswXSA9IGluZXQtPmluZXRfZGFkZHI7Ci0KIAlpZiAobmxhX3B1dF91OChza2IsIElORVRfRElBR19TSFVURE9XTiwgc2stPnNrX3NodXRkb3duKSkKIAkJZ290byBlcnJvdXQ7CiAKQEAgLTEyNSwxMCArMTQ2LDYgQEAKIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJaWYgKHItPmlkaWFnX2ZhbWlseSA9PSBBRl9JTkVUNikgewotCi0JCSooc3RydWN0IGluNl9hZGRyICopci0+aWQuaWRpYWdfc3JjID0gc2stPnNrX3Y2X3Jjdl9zYWRkcjsKLQkJKihzdHJ1Y3QgaW42X2FkZHIgKilyLT5pZC5pZGlhZ19kc3QgPSBzay0+c2tfdjZfZGFkZHI7Ci0KIAkJaWYgKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfVENMQVNTIC0gMSkpKQogCQkJaWYgKG5sYV9wdXRfdTgoc2tiLCBJTkVUX0RJQUdfVENMQVNTLAogCQkJCSAgICAgICBpbmV0Nl9zayhzayktPnRjbGFzcykgPCAwKQpAQCAtMTU1LDcgKzE3Miw3IEBACiAJCWlmIChzb2NrX2RpYWdfcHV0X21lbWluZm8oc2ssIHNrYiwgSU5FVF9ESUFHX1NLTUVNSU5GTykpCiAJCQlnb3RvIGVycm91dDsKIAotCWlmIChpY3NrID09IE5VTEwpIHsKKwlpZiAoIWljc2spIHsKIAkJaGFuZGxlci0+aWRpYWdfZ2V0X2luZm8oc2ssIHIsIE5VTEwpOwogCQlnb3RvIG91dDsKIAl9CkBAIC0yMTMsMjMgKzIzMCwyNSBAQAogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF9za19kaWFnX2ZpbGwpOwogCiBzdGF0aWMgaW50IGluZXRfY3NrX2RpYWdfZmlsbChzdHJ1Y3Qgc29jayAqc2ssCi0JCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEsCiAJCQkgICAgICBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMsCiAJCQkgICAgICB1MzIgcG9ydGlkLCB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgpCiB7Ci0JcmV0dXJuIGluZXRfc2tfZGlhZ19maWxsKHNrLCBpbmV0X2NzayhzayksCi0JCQlza2IsIHJlcSwgdXNlcl9ucywgcG9ydGlkLCBzZXEsIG5sbXNnX2ZsYWdzLCB1bmxoKTsKKwlyZXR1cm4gaW5ldF9za19kaWFnX2ZpbGwoc2ssIGluZXRfY3NrKHNrKSwgc2tiLCByZXEsCisJCQkJIHVzZXJfbnMsIHBvcnRpZCwgc2VxLCBubG1zZ19mbGFncywgdW5saCk7CiB9CiAKLXN0YXRpYyBpbnQgaW5ldF90d3NrX2RpYWdfZmlsbChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dywKLQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxLAorc3RhdGljIGludCBpbmV0X3R3c2tfZGlhZ19maWxsKHN0cnVjdCBzb2NrICpzaywKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICAgIHUzMiBwb3J0aWQsIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgpCiB7Ci0JczMyIHRtbzsKKwlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dyA9IGluZXRfdHdzayhzayk7CiAJc3RydWN0IGluZXRfZGlhZ19tc2cgKnI7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CisJbG9uZyB0bW87CiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgdW5saC0+bmxtc2dfdHlwZSwgc2l6ZW9mKCpyKSwKIAkJCW5sbXNnX2ZsYWdzKTsKQEAgLTIzOSwyNSArMjU4LDEzIEBACiAJciA9IG5sbXNnX2RhdGEobmxoKTsKIAlCVUdfT04odHctPnR3X3N0YXRlICE9IFRDUF9USU1FX1dBSVQpOwogCi0JdG1vID0gdHctPnR3X3R0ZCAtIGluZXRfdHdfdGltZV9zdGFtcCgpOworCXRtbyA9IHR3LT50d190aW1lci5leHBpcmVzIC0gamlmZmllczsKIAlpZiAodG1vIDwgMCkKIAkJdG1vID0gMDsKIAotCXItPmlkaWFnX2ZhbWlseQkgICAgICA9IHR3LT50d19mYW1pbHk7CisJaW5ldF9kaWFnX21zZ19jb21tb25fZmlsbChyLCBzayk7CiAJci0+aWRpYWdfcmV0cmFucyAgICAgID0gMDsKIAotCXItPmlkLmlkaWFnX2lmCSAgICAgID0gdHctPnR3X2JvdW5kX2Rldl9pZjsKLQlzb2NrX2RpYWdfc2F2ZV9jb29raWUodHcsIHItPmlkLmlkaWFnX2Nvb2tpZSk7Ci0KLQlyLT5pZC5pZGlhZ19zcG9ydCAgICAgPSB0dy0+dHdfc3BvcnQ7Ci0Jci0+aWQuaWRpYWdfZHBvcnQgICAgID0gdHctPnR3X2Rwb3J0OwotCi0JbWVtc2V0KCZyLT5pZC5pZGlhZ19zcmMsIDAsIHNpemVvZihyLT5pZC5pZGlhZ19zcmMpKTsKLQltZW1zZXQoJnItPmlkLmlkaWFnX2RzdCwgMCwgc2l6ZW9mKHItPmlkLmlkaWFnX2RzdCkpOwotCi0Jci0+aWQuaWRpYWdfc3JjWzBdICAgID0gdHctPnR3X3Jjdl9zYWRkcjsKLQlyLT5pZC5pZGlhZ19kc3RbMF0gICAgPSB0dy0+dHdfZGFkZHI7Ci0KIAlyLT5pZGlhZ19zdGF0ZQkgICAgICA9IHR3LT50d19zdWJzdGF0ZTsKIAlyLT5pZGlhZ190aW1lcgkgICAgICA9IDM7CiAJci0+aWRpYWdfZXhwaXJlcyAgICAgID0gamlmZmllc190b19tc2Vjcyh0bW8pOwpAQCAtMjY1LDcwICsyNzIsOTggQEAKIAlyLT5pZGlhZ193cXVldWUJICAgICAgPSAwOwogCXItPmlkaWFnX3VpZAkgICAgICA9IDA7CiAJci0+aWRpYWdfaW5vZGUJICAgICAgPSAwOwotI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JaWYgKHR3LT50d19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLQkJKihzdHJ1Y3QgaW42X2FkZHIgKilyLT5pZC5pZGlhZ19zcmMgPSB0dy0+dHdfdjZfcmN2X3NhZGRyOwotCQkqKHN0cnVjdCBpbjZfYWRkciAqKXItPmlkLmlkaWFnX2RzdCA9IHR3LT50d192Nl9kYWRkcjsKLQl9Ci0jZW5kaWYKKworCW5sbXNnX2VuZChza2IsIG5saCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5ldF9yZXFfZGlhZ19maWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgIHUzMiBwb3J0aWQsIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKK3sKKwlzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqcjsKKwlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlsb25nIHRtbzsKKworCW5saCA9IG5sbXNnX3B1dChza2IsIHBvcnRpZCwgc2VxLCB1bmxoLT5ubG1zZ190eXBlLCBzaXplb2YoKnIpLAorCQkJbmxtc2dfZmxhZ3MpOworCWlmICghbmxoKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJciA9IG5sbXNnX2RhdGEobmxoKTsKKwlpbmV0X2RpYWdfbXNnX2NvbW1vbl9maWxsKHIsIHNrKTsKKwlyLT5pZGlhZ19zdGF0ZSA9IFRDUF9TWU5fUkVDVjsKKwlyLT5pZGlhZ190aW1lciA9IDE7CisJci0+aWRpYWdfcmV0cmFucyA9IGluZXRfcmVxc2soc2spLT5udW1fcmV0cmFuczsKKworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2ssIGlyX2Nvb2tpZSkgIT0KKwkJICAgICBvZmZzZXRvZihzdHJ1Y3Qgc29jaywgc2tfY29va2llKSk7CisKKwl0bW8gPSBpbmV0X3JlcXNrKHNrKS0+cnNrX3RpbWVyLmV4cGlyZXMgLSBqaWZmaWVzOworCXItPmlkaWFnX2V4cGlyZXMgPSAodG1vID49IDApID8gamlmZmllc190b19tc2Vjcyh0bW8pIDogMDsKKwlyLT5pZGlhZ19ycXVldWUJPSAwOworCXItPmlkaWFnX3dxdWV1ZQk9IDA7CisJci0+aWRpYWdfdWlkCT0gMDsKKwlyLT5pZGlhZ19pbm9kZQk9IDA7CiAKIAlubG1zZ19lbmQoc2tiLCBubGgpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNrX2RpYWdfZmlsbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwKKwkJCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLAogCQkJc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zLAogCQkJdTMyIHBvcnRpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAogCQkJY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKQogewogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX1RJTUVfV0FJVCkKLQkJcmV0dXJuIGluZXRfdHdza19kaWFnX2ZpbGwoaW5ldF90d3NrKHNrKSwgc2tiLCByLCBwb3J0aWQsIHNlcSwKKwkJcmV0dXJuIGluZXRfdHdza19kaWFnX2ZpbGwoc2ssIHNrYiwgcG9ydGlkLCBzZXEsCiAJCQkJCSAgIG5sbXNnX2ZsYWdzLCB1bmxoKTsKIAorCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX05FV19TWU5fUkVDVikKKwkJcmV0dXJuIGluZXRfcmVxX2RpYWdfZmlsbChzaywgc2tiLCBwb3J0aWQsIHNlcSwKKwkJCQkJICBubG1zZ19mbGFncywgdW5saCk7CisKIAlyZXR1cm4gaW5ldF9jc2tfZGlhZ19maWxsKHNrLCBza2IsIHIsIHVzZXJfbnMsIHBvcnRpZCwgc2VxLAogCQkJCSAgbmxtc2dfZmxhZ3MsIHVubGgpOwogfQogCi1pbnQgaW5ldF9kaWFnX2R1bXBfb25lX2ljc2soc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAotCQljb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSkKK2ludCBpbmV0X2RpYWdfZHVtcF9vbmVfaWNzayhzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaGFzaGluZm8sCisJCQkgICAgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxKQogewotCWludCBlcnI7Ci0Jc3RydWN0IHNvY2sgKnNrOwotCXN0cnVjdCBza19idWZmICpyZXA7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoaW5fc2tiLT5zayk7CisJc3RydWN0IHNrX2J1ZmYgKnJlcDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJaW50IGVycjsKIAogCWVyciA9IC1FSU5WQUw7Ci0JaWYgKHJlcS0+c2RpYWdfZmFtaWx5ID09IEFGX0lORVQpIHsKKwlpZiAocmVxLT5zZGlhZ19mYW1pbHkgPT0gQUZfSU5FVCkKIAkJc2sgPSBpbmV0X2xvb2t1cChuZXQsIGhhc2hpbmZvLCByZXEtPmlkLmlkaWFnX2RzdFswXSwKIAkJCQkgcmVxLT5pZC5pZGlhZ19kcG9ydCwgcmVxLT5pZC5pZGlhZ19zcmNbMF0sCiAJCQkJIHJlcS0+aWQuaWRpYWdfc3BvcnQsIHJlcS0+aWQuaWRpYWdfaWYpOwotCX0KICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCWVsc2UgaWYgKHJlcS0+c2RpYWdfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJZWxzZSBpZiAocmVxLT5zZGlhZ19mYW1pbHkgPT0gQUZfSU5FVDYpCiAJCXNrID0gaW5ldDZfbG9va3VwKG5ldCwgaGFzaGluZm8sCiAJCQkJICAoc3RydWN0IGluNl9hZGRyICopcmVxLT5pZC5pZGlhZ19kc3QsCiAJCQkJICByZXEtPmlkLmlkaWFnX2Rwb3J0LAogCQkJCSAgKHN0cnVjdCBpbjZfYWRkciAqKXJlcS0+aWQuaWRpYWdfc3JjLAogCQkJCSAgcmVxLT5pZC5pZGlhZ19zcG9ydCwKIAkJCQkgIHJlcS0+aWQuaWRpYWdfaWYpOwotCX0KICNlbmRpZgotCWVsc2UgeworCWVsc2UKIAkJZ290byBvdXRfbm9zazsKLQl9CiAKIAllcnIgPSAtRU5PRU5UOwotCWlmIChzayA9PSBOVUxMKQorCWlmICghc2spCiAJCWdvdG8gb3V0X25vc2s7CiAKIAllcnIgPSBzb2NrX2RpYWdfY2hlY2tfY29va2llKHNrLCByZXEtPmlkLmlkaWFnX2Nvb2tpZSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKLQlyZXAgPSBubG1zZ19uZXcoc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfbXNnKSArCi0JCQlzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19tZW1pbmZvKSArCi0JCQlzaXplb2Yoc3RydWN0IHRjcF9pbmZvKSArIDY0LCBHRlBfS0VSTkVMKTsKKwlyZXAgPSBubG1zZ19uZXcoaW5ldF9za19hdHRyX3NpemUoKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZXApIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CkBAIC0zNTksNyArMzk0LDcgQEAKIAogc3RhdGljIGludCBpbmV0X2RpYWdfZ2V0X2V4YWN0KHN0cnVjdCBza19idWZmICppbl9za2IsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCi0JCQkgICAgICAgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSkKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxKQogewogCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciAqaGFuZGxlcjsKIAlpbnQgZXJyOwpAQCAtNDAwLDkgKzQzNSw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLQogc3RhdGljIGludCBpbmV0X2RpYWdfYmNfcnVuKGNvbnN0IHN0cnVjdCBubGF0dHIgKl9iYywKLQkJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19lbnRyeSAqZW50cnkpCisJCQkgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19lbnRyeSAqZW50cnkpCiB7CiAJY29uc3Qgdm9pZCAqYmMgPSBubGFfZGF0YShfYmMpOwogCWludCBsZW4gPSBubGFfbGVuKF9iYyk7CkBAIC00MzQsMTAgKzQ2OCwxMCBAQAogCQkJYnJlYWs7CiAJCWNhc2UgSU5FVF9ESUFHX0JDX1NfQ09ORDoKIAkJY2FzZSBJTkVUX0RJQUdfQkNfRF9DT05EOiB7Ci0JCQlzdHJ1Y3QgaW5ldF9kaWFnX2hvc3Rjb25kICpjb25kOwotCQkJX19iZTMyICphZGRyOworCQkJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19ob3N0Y29uZCAqY29uZDsKKwkJCWNvbnN0IF9fYmUzMiAqYWRkcjsKIAotCQkJY29uZCA9IChzdHJ1Y3QgaW5ldF9kaWFnX2hvc3Rjb25kICopKG9wICsgMSk7CisJCQljb25kID0gKGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaG9zdGNvbmQgKikob3AgKyAxKTsKIAkJCWlmIChjb25kLT5wb3J0ICE9IC0xICYmCiAJCQkgICAgY29uZC0+cG9ydCAhPSAob3AtPmNvZGUgPT0gSU5FVF9ESUFHX0JDX1NfQ09ORCA/CiAJCQkJCSAgICAgZW50cnktPnNwb3J0IDogZW50cnktPmRwb3J0KSkgewpAQCAtNDg2LDI5ICs1MjAsMzYgQEAKIAlyZXR1cm4gbGVuID09IDA7CiB9CiAKLWludCBpbmV0X2RpYWdfYmNfc2soY29uc3Qgc3RydWN0IG5sYXR0ciAqYmMsIHN0cnVjdCBzb2NrICpzaykKKy8qIFRoaXMgaGVscGVyIGlzIGF2YWlsYWJsZSBmb3IgYWxsIHNvY2tldHMgKEVTVEFCTElTSCwgVElNRVdBSVQsIFNZTl9SRUNWKQorICovCitzdGF0aWMgdm9pZCBlbnRyeV9maWxsX2FkZHJzKHN0cnVjdCBpbmV0X2RpYWdfZW50cnkgKmVudHJ5LAorCQkJICAgICBjb25zdCBzdHJ1Y3Qgc29jayAqc2spCiB7Ci0Jc3RydWN0IGluZXRfZGlhZ19lbnRyeSBlbnRyeTsKLQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7Ci0KLQlpZiAoYmMgPT0gTlVMTCkKLQkJcmV0dXJuIDE7Ci0KLQllbnRyeS5mYW1pbHkgPSBzay0+c2tfZmFtaWx5OwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JaWYgKGVudHJ5LmZhbWlseSA9PSBBRl9JTkVUNikgewotCi0JCWVudHJ5LnNhZGRyID0gc2stPnNrX3Y2X3Jjdl9zYWRkci5zNl9hZGRyMzI7Ci0JCWVudHJ5LmRhZGRyID0gc2stPnNrX3Y2X2RhZGRyLnM2X2FkZHIzMjsKKwlpZiAoc2stPnNrX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQllbnRyeS0+c2FkZHIgPSBzay0+c2tfdjZfcmN2X3NhZGRyLnM2X2FkZHIzMjsKKwkJZW50cnktPmRhZGRyID0gc2stPnNrX3Y2X2RhZGRyLnM2X2FkZHIzMjsKIAl9IGVsc2UKICNlbmRpZgogCXsKLQkJZW50cnkuc2FkZHIgPSAmaW5ldC0+aW5ldF9yY3Zfc2FkZHI7Ci0JCWVudHJ5LmRhZGRyID0gJmluZXQtPmluZXRfZGFkZHI7CisJCWVudHJ5LT5zYWRkciA9ICZzay0+c2tfcmN2X3NhZGRyOworCQllbnRyeS0+ZGFkZHIgPSAmc2stPnNrX2RhZGRyOwogCX0KK30KKworaW50IGluZXRfZGlhZ19iY19zayhjb25zdCBzdHJ1Y3QgbmxhdHRyICpiYywgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKwlzdHJ1Y3QgaW5ldF9kaWFnX2VudHJ5IGVudHJ5OworCisJaWYgKCFiYykKKwkJcmV0dXJuIDE7CisKKwllbnRyeS5mYW1pbHkgPSBzay0+c2tfZmFtaWx5OworCWVudHJ5X2ZpbGxfYWRkcnMoJmVudHJ5LCBzayk7CiAJZW50cnkuc3BvcnQgPSBpbmV0LT5pbmV0X251bTsKIAllbnRyeS5kcG9ydCA9IG50b2hzKGluZXQtPmluZXRfZHBvcnQpOwotCWVudHJ5LnVzZXJsb2NrcyA9IHNrLT5za191c2VybG9ja3M7CisJZW50cnkudXNlcmxvY2tzID0gc2tfZnVsbHNvY2soc2spID8gc2stPnNrX3VzZXJsb2NrcyA6IDA7CiAKIAlyZXR1cm4gaW5ldF9kaWFnX2JjX3J1bihiYywgJmVudHJ5KTsKIH0KQEAgLTUzNSw4ICs1NzYsOCBAQAogc3RhdGljIGJvb2wgdmFsaWRfaG9zdGNvbmQoY29uc3Qgc3RydWN0IGluZXRfZGlhZ19iY19vcCAqb3AsIGludCBsZW4sCiAJCQkgICBpbnQgKm1pbl9sZW4pCiB7Ci0JaW50IGFkZHJfbGVuOwogCXN0cnVjdCBpbmV0X2RpYWdfaG9zdGNvbmQgKmNvbmQ7CisJaW50IGFkZHJfbGVuOwogCiAJLyogQ2hlY2sgaG9zdGNvbmQgc3BhY2UuICovCiAJKm1pbl9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfaG9zdGNvbmQpOwpAQCAtNTcwLDggKzYxMSw4IEBACiB9CiAKIC8qIFZhbGlkYXRlIGEgcG9ydCBjb21wYXJpc29uIG9wZXJhdG9yLiAqLwotc3RhdGljIGlubGluZSBib29sIHZhbGlkX3BvcnRfY29tcGFyaXNvbihjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wICpvcCwKLQkJCQkJIGludCBsZW4sIGludCAqbWluX2xlbikKK3N0YXRpYyBib29sIHZhbGlkX3BvcnRfY29tcGFyaXNvbihjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wICpvcCwKKwkJCQkgIGludCBsZW4sIGludCAqbWluX2xlbikKIHsKIAkvKiBQb3J0IGNvbXBhcmlzb25zIHB1dCB0aGUgcG9ydCBpbiBhIGZvbGxvdy1vbiBpbmV0X2RpYWdfYmNfb3AuICovCiAJKm1pbl9sZW4gKz0gc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfYmNfb3ApOwpAQCAtNTg2LDEwICs2MjcsOSBAQAogCWludCAgbGVuID0gYnl0ZWNvZGVfbGVuOwogCiAJd2hpbGUgKGxlbiA+IDApIHsKLQkJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19iY19vcCAqb3AgPSBiYzsKIAkJaW50IG1pbl9sZW4gPSBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19iY19vcCk7CisJCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfYmNfb3AgKm9wID0gYmM7CiAKLS8vcHJpbnRrKCJCQzogJWQgJWQgJWQgeyVkfSAvICVkXG4iLCBvcC0+Y29kZSwgb3AtPnllcywgb3AtPm5vLCBvcFsxXS5ubywgbGVuKTsKIAkJc3dpdGNoIChvcC0+Y29kZSkgewogCQljYXNlIElORVRfRElBR19CQ19TX0NPTkQ6CiAJCWNhc2UgSU5FVF9ESUFHX0JDX0RfQ09ORDoKQEAgLTYzMCw3ICs2NzAsNyBAQAogc3RhdGljIGludCBpbmV0X2Nza19kaWFnX2R1bXAoc3RydWN0IHNvY2sgKnNrLAogCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKLQkJCSAgICAgIHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICpiYykKIHsKIAlpZiAoIWluZXRfZGlhZ19iY19zayhiYywgc2spKQpAQCAtNjQyLDEzOSArNjgyLDQyIEBACiAJCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBjYi0+bmxoKTsKIH0KIAotc3RhdGljIGludCBpbmV0X3R3c2tfZGlhZ19kdW1wKHN0cnVjdCBzb2NrICpzaywKLQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKLQkJCSAgICAgICBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICpiYykKK3N0YXRpYyB2b2lkIHR3c2tfYnVpbGRfYXNzZXJ0KHZvaWQpCiB7Ci0Jc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcgPSBpbmV0X3R3c2soc2spOworCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrLCB0d19mYW1pbHkpICE9CisJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHNvY2ssIHNrX2ZhbWlseSkpOwogCi0JaWYgKGJjICE9IE5VTEwpIHsKLQkJc3RydWN0IGluZXRfZGlhZ19lbnRyeSBlbnRyeTsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGluZXRfdGltZXdhaXRfc29jaywgdHdfbnVtKSAhPQorCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpbmV0X3NvY2ssIGluZXRfbnVtKSk7CiAKLQkJZW50cnkuZmFtaWx5ID0gdHctPnR3X2ZhbWlseTsKLSNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQotCQlpZiAodHctPnR3X2ZhbWlseSA9PSBBRl9JTkVUNikgewotCQkJZW50cnkuc2FkZHIgPSB0dy0+dHdfdjZfcmN2X3NhZGRyLnM2X2FkZHIzMjsKLQkJCWVudHJ5LmRhZGRyID0gdHctPnR3X3Y2X2RhZGRyLnM2X2FkZHIzMjsKLQkJfSBlbHNlCi0jZW5kaWYKLQkJewotCQkJZW50cnkuc2FkZHIgPSAmdHctPnR3X3Jjdl9zYWRkcjsKLQkJCWVudHJ5LmRhZGRyID0gJnR3LT50d19kYWRkcjsKLQkJfQotCQllbnRyeS5zcG9ydCA9IHR3LT50d19udW07Ci0JCWVudHJ5LmRwb3J0ID0gbnRvaHModHctPnR3X2Rwb3J0KTsKLQkJZW50cnkudXNlcmxvY2tzID0gMDsKKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGluZXRfdGltZXdhaXRfc29jaywgdHdfZHBvcnQpICE9CisJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IGluZXRfc29jaywgaW5ldF9kcG9ydCkpOwogCi0JCWlmICghaW5ldF9kaWFnX2JjX3J1bihiYywgJmVudHJ5KSkKLQkJCXJldHVybiAwOwotCX0KKwlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGluZXRfdGltZXdhaXRfc29jaywgdHdfcmN2X3NhZGRyKSAhPQorCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpbmV0X3NvY2ssIGluZXRfcmN2X3NhZGRyKSk7CiAKLQlyZXR1cm4gaW5ldF90d3NrX2RpYWdfZmlsbCh0dywgc2tiLCByLAotCQkJCSAgIE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAotCQkJCSAgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIGNiLT5ubGgpOwotfQotCi0vKiBHZXQgdGhlIElQdjQsIElQdjYsIG9yIElQdjQtbWFwcGVkLUlQdjYgbG9jYWwgYW5kIHJlbW90ZSBhZGRyZXNzZXMKLSAqIGZyb20gYSByZXF1ZXN0X3NvY2suIEZvciBJUHY0LW1hcHBlZC1JUHY2IHdlIG11c3QgbWFwIElQdjQgdG8gSVB2Ni4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGluZXRfZGlhZ19yZXFfYWRkcnMoY29uc3Qgc3RydWN0IHNvY2sgKnNrLAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkJICAgICAgIHN0cnVjdCBpbmV0X2RpYWdfZW50cnkgKmVudHJ5KQotewotCXN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaXJlcSA9IGluZXRfcnNrKHJlcSk7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2ssIHR3X2RhZGRyKSAhPQorCQkgICAgIG9mZnNldG9mKHN0cnVjdCBpbmV0X3NvY2ssIGluZXRfZGFkZHIpKTsKIAogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JaWYgKHNrLT5za19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKLQkJaWYgKHJlcS0+cnNrX29wcy0+ZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0JCQllbnRyeS0+c2FkZHIgPSBpcmVxLT5pcl92Nl9sb2NfYWRkci5zNl9hZGRyMzI7Ci0JCQllbnRyeS0+ZGFkZHIgPSBpcmVxLT5pcl92Nl9ybXRfYWRkci5zNl9hZGRyMzI7Ci0JCX0gZWxzZSBpZiAocmVxLT5yc2tfb3BzLT5mYW1pbHkgPT0gQUZfSU5FVCkgewotCQkJaXB2Nl9hZGRyX3NldF92NG1hcHBlZChpcmVxLT5pcl9sb2NfYWRkciwKLQkJCQkJICAgICAgICZlbnRyeS0+c2FkZHJfc3RvcmFnZSk7Ci0JCQlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKGlyZXEtPmlyX3JtdF9hZGRyLAotCQkJCQkgICAgICAgJmVudHJ5LT5kYWRkcl9zdG9yYWdlKTsKLQkJCWVudHJ5LT5zYWRkciA9IGVudHJ5LT5zYWRkcl9zdG9yYWdlLnM2X2FkZHIzMjsKLQkJCWVudHJ5LT5kYWRkciA9IGVudHJ5LT5kYWRkcl9zdG9yYWdlLnM2X2FkZHIzMjsKLQkJfQotCX0gZWxzZQorCUJVSUxEX0JVR19PTihvZmZzZXRvZihzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrLCB0d192Nl9yY3Zfc2FkZHIpICE9CisJCSAgICAgb2Zmc2V0b2Yoc3RydWN0IHNvY2ssIHNrX3Y2X3Jjdl9zYWRkcikpOworCisJQlVJTERfQlVHX09OKG9mZnNldG9mKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2ssIHR3X3Y2X2RhZGRyKSAhPQorCQkgICAgIG9mZnNldG9mKHN0cnVjdCBzb2NrLCBza192Nl9kYWRkcikpOwogI2VuZGlmCi0JewotCQllbnRyeS0+c2FkZHIgPSAmaXJlcS0+aXJfbG9jX2FkZHI7Ci0JCWVudHJ5LT5kYWRkciA9ICZpcmVxLT5pcl9ybXRfYWRkcjsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgaW5ldF9kaWFnX2ZpbGxfcmVxKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaywKLQkJCSAgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKLQkJCSAgICAgIHN0cnVjdCB1c2VyX25hbWVzcGFjZSAqdXNlcl9ucywKLQkJCSAgICAgIHUzMiBwb3J0aWQsIHUzMiBzZXEsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgpCi17Ci0JY29uc3Qgc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppcmVxID0gaW5ldF9yc2socmVxKTsKLQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7Ci0Jc3RydWN0IGluZXRfZGlhZ19tc2cgKnI7Ci0Jc3RydWN0IG5sbXNnaGRyICpubGg7Ci0JbG9uZyB0bW87Ci0KLQlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgdW5saC0+bmxtc2dfdHlwZSwgc2l6ZW9mKCpyKSwKLQkJCU5MTV9GX01VTFRJKTsKLQlpZiAoIW5saCkKLQkJcmV0dXJuIC1FTVNHU0laRTsKLQotCXIgPSBubG1zZ19kYXRhKG5saCk7Ci0Jci0+aWRpYWdfZmFtaWx5ID0gc2stPnNrX2ZhbWlseTsKLQlyLT5pZGlhZ19zdGF0ZSA9IFRDUF9TWU5fUkVDVjsKLQlyLT5pZGlhZ190aW1lciA9IDE7Ci0Jci0+aWRpYWdfcmV0cmFucyA9IHJlcS0+bnVtX3JldHJhbnM7Ci0KLQlyLT5pZC5pZGlhZ19pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7Ci0Jc29ja19kaWFnX3NhdmVfY29va2llKHJlcSwgci0+aWQuaWRpYWdfY29va2llKTsKLQotCXRtbyA9IHJlcS0+ZXhwaXJlcyAtIGppZmZpZXM7Ci0JaWYgKHRtbyA8IDApCi0JCXRtbyA9IDA7Ci0KLQlyLT5pZC5pZGlhZ19zcG9ydCA9IGluZXQtPmluZXRfc3BvcnQ7Ci0Jci0+aWQuaWRpYWdfZHBvcnQgPSBpcmVxLT5pcl9ybXRfcG9ydDsKLQotCW1lbXNldCgmci0+aWQuaWRpYWdfc3JjLCAwLCBzaXplb2Yoci0+aWQuaWRpYWdfc3JjKSk7Ci0JbWVtc2V0KCZyLT5pZC5pZGlhZ19kc3QsIDAsIHNpemVvZihyLT5pZC5pZGlhZ19kc3QpKTsKLQotCXItPmlkLmlkaWFnX3NyY1swXSA9IGlyZXEtPmlyX2xvY19hZGRyOwotCXItPmlkLmlkaWFnX2RzdFswXSA9IGlyZXEtPmlyX3JtdF9hZGRyOwotCi0Jci0+aWRpYWdfZXhwaXJlcyA9IGppZmZpZXNfdG9fbXNlY3ModG1vKTsKLQlyLT5pZGlhZ19ycXVldWUgPSAwOwotCXItPmlkaWFnX3dxdWV1ZSA9IDA7Ci0Jci0+aWRpYWdfdWlkID0gZnJvbV9rdWlkX211bmdlZCh1c2VyX25zLCBzb2NrX2lfdWlkKHNrKSk7Ci0Jci0+aWRpYWdfaW5vZGUgPSAwOwotI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCi0JaWYgKHItPmlkaWFnX2ZhbWlseSA9PSBBRl9JTkVUNikgewotCQlzdHJ1Y3QgaW5ldF9kaWFnX2VudHJ5IGVudHJ5OwotCQlpbmV0X2RpYWdfcmVxX2FkZHJzKHNrLCByZXEsICZlbnRyeSk7Ci0JCW1lbWNweShyLT5pZC5pZGlhZ19zcmMsIGVudHJ5LnNhZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7Ci0JCW1lbWNweShyLT5pZC5pZGlhZ19kc3QsIGVudHJ5LmRhZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7Ci0JfQotI2VuZGlmCi0KLQlubG1zZ19lbmQoc2tiLCBubGgpOwotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGluZXRfZGlhZ19kdW1wX3JlcXMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrLAogCQkJICAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKLQkJCSAgICAgICBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICpiYykKIHsKLQlzdHJ1Y3QgaW5ldF9kaWFnX2VudHJ5IGVudHJ5OwogCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKLQlzdHJ1Y3QgbGlzdGVuX3NvY2sgKmxvcHQ7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwotCWludCBqLCBzX2o7Ci0JaW50IHJlcW51bSwgc19yZXFudW07CisJc3RydWN0IGluZXRfZGlhZ19lbnRyeSBlbnRyeTsKKwlpbnQgaiwgc19qLCByZXFudW0sIHNfcmVxbnVtOworCXN0cnVjdCBsaXN0ZW5fc29jayAqbG9wdDsKIAlpbnQgZXJyID0gMDsKIAogCXNfaiA9IGNiLT5hcmdzWzNdOwpAQCAtNzg1LDEzICs3MjgsMTMgQEAKIAogCWVudHJ5LmZhbWlseSA9IHNrLT5za19mYW1pbHk7CiAKLQlyZWFkX2xvY2tfYmgoJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnN5bl93YWl0X2xvY2spOworCXNwaW5fbG9ja19iaCgmaWNzay0+aWNza19hY2NlcHRfcXVldWUuc3luX3dhaXRfbG9jayk7CiAKIAlsb3B0ID0gaWNzay0+aWNza19hY2NlcHRfcXVldWUubGlzdGVuX29wdDsKLQlpZiAoIWxvcHQgfHwgIWxvcHQtPnFsZW4pCisJaWYgKCFsb3B0IHx8ICFsaXN0ZW5fc29ja19xbGVuKGxvcHQpKQogCQlnb3RvIG91dDsKIAotCWlmIChiYyAhPSBOVUxMKSB7CisJaWYgKGJjKSB7CiAJCWVudHJ5LnNwb3J0ID0gaW5ldC0+aW5ldF9udW07CiAJCWVudHJ5LnVzZXJsb2NrcyA9IHNrLT5za191c2VybG9ja3M7CiAJfQpAQCAtODEwLDE3ICs3NTMsMTggQEAKIAkJCQljb250aW51ZTsKIAogCQkJaWYgKGJjKSB7Ci0JCQkJaW5ldF9kaWFnX3JlcV9hZGRycyhzaywgcmVxLCAmZW50cnkpOworCQkJCS8qIE5vdGU6IGVudHJ5LnNwb3J0IGFuZCBlbnRyeS51c2VybG9ja3MgYXJlIGFscmVhZHkgc2V0ICovCisJCQkJZW50cnlfZmlsbF9hZGRycygmZW50cnksIHJlcV90b19zayhyZXEpKTsKIAkJCQllbnRyeS5kcG9ydCA9IG50b2hzKGlyZXEtPmlyX3JtdF9wb3J0KTsKIAogCQkJCWlmICghaW5ldF9kaWFnX2JjX3J1bihiYywgJmVudHJ5KSkKIAkJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCWVyciA9IGluZXRfZGlhZ19maWxsX3JlcShza2IsIHNrLCByZXEsCi0JCQkJCSAgICAgICBza191c2VyX25zKE5FVExJTktfQ0IoY2ItPnNrYikuc2spLAotCQkJCQkgICAgICAgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCi0JCQkJCSAgICAgICBjYi0+bmxoLT5ubG1zZ19zZXEsIGNiLT5ubGgpOworCQkJZXJyID0gaW5ldF9yZXFfZGlhZ19maWxsKHJlcV90b19zayhyZXEpLCBza2IsCisJCQkJCQkgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCisJCQkJCQkgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkJIE5MTV9GX01VTFRJLCBjYi0+bmxoKTsKIAkJCWlmIChlcnIgPCAwKSB7CiAJCQkJY2ItPmFyZ3NbM10gPSBqICsgMTsKIAkJCQljYi0+YXJnc1s0XSA9IHJlcW51bTsKQEAgLTgzMiwxNyArNzc2LDE3IEBACiAJfQogCiBvdXQ6Ci0JcmVhZF91bmxvY2tfYmgoJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnN5bl93YWl0X2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5zeW5fd2FpdF9sb2NrKTsKIAogCXJldHVybiBlcnI7CiB9CiAKIHZvaWQgaW5ldF9kaWFnX2R1bXBfaWNzayhzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaGFzaGluZm8sIHN0cnVjdCBza19idWZmICpza2IsCi0JCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIsIHN0cnVjdCBubGF0dHIgKmJjKQorCQkJIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCSBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwgc3RydWN0IG5sYXR0ciAqYmMpCiB7Ci0JaW50IGksIG51bTsKLQlpbnQgc19pLCBzX251bTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKKwlpbnQgaSwgbnVtLCBzX2ksIHNfbnVtOwogCiAJc19pID0gY2ItPmFyZ3NbMV07CiAJc19udW0gPSBudW0gPSBjYi0+YXJnc1syXTsKQEAgLTg1Miw5ICs3OTYsOSBAQAogCQkJZ290byBza2lwX2xpc3Rlbl9odDsKIAogCQlmb3IgKGkgPSBzX2k7IGkgPCBJTkVUX0xIVEFCTEVfU0laRTsgaSsrKSB7Ci0JCQlzdHJ1Y3Qgc29jayAqc2s7Ci0JCQlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbm9kZTsKIAkJCXN0cnVjdCBpbmV0X2xpc3Rlbl9oYXNoYnVja2V0ICppbGI7CisJCQlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbm9kZTsKKwkJCXN0cnVjdCBzb2NrICpzazsKIAogCQkJbnVtID0gMDsKIAkJCWlsYiA9ICZoYXNoaW5mby0+bGlzdGVuaW5nX2hhc2hbaV07CkBAIC04NzEsNyArODE1LDcgQEAKIAkJCQl9CiAKIAkJCQlpZiAoci0+c2RpYWdfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJgotCQkJCQkJc2stPnNrX2ZhbWlseSAhPSByLT5zZGlhZ19mYW1pbHkpCisJCQkJICAgIHNrLT5za19mYW1pbHkgIT0gci0+c2RpYWdfZmFtaWx5KQogCQkJCQlnb3RvIG5leHRfbGlzdGVuOwogCiAJCQkJaWYgKHItPmlkLmlkaWFnX3Nwb3J0ICE9IGluZXQtPmluZXRfc3BvcnQgJiYKQEAgLTkxOSw4ICs4NjMsOCBAQAogCWZvciAoaSA9IHNfaTsgaSA8PSBoYXNoaW5mby0+ZWhhc2hfbWFzazsgaSsrKSB7CiAJCXN0cnVjdCBpbmV0X2VoYXNoX2J1Y2tldCAqaGVhZCA9ICZoYXNoaW5mby0+ZWhhc2hbaV07CiAJCXNwaW5sb2NrX3QgKmxvY2sgPSBpbmV0X2VoYXNoX2xvY2twKGhhc2hpbmZvLCBpKTsKLQkJc3RydWN0IHNvY2sgKnNrOwogCQlzdHJ1Y3QgaGxpc3RfbnVsbHNfbm9kZSAqbm9kZTsKKwkJc3RydWN0IHNvY2sgKnNrOwogCiAJCW51bSA9IDA7CiAKQEAgLTkzMiw4ICs4NzYsNyBAQAogCiAJCXNwaW5fbG9ja19iaChsb2NrKTsKIAkJc2tfbnVsbHNfZm9yX2VhY2goc2ssIG5vZGUsICZoZWFkLT5jaGFpbikgewotCQkJaW50IHJlczsKLQkJCWludCBzdGF0ZTsKKwkJCWludCBzdGF0ZSwgcmVzOwogCiAJCQlpZiAoIW5ldF9lcShzb2NrX25ldChzayksIG5ldCkpCiAJCQkJY29udGludWU7CkBAIC05NTIsMTAgKzg5NSwxNiBAQAogCQkJaWYgKHItPmlkLmlkaWFnX2Rwb3J0ICE9IHNrLT5za19kcG9ydCAmJgogCQkJICAgIHItPmlkLmlkaWFnX2Rwb3J0KQogCQkJCWdvdG8gbmV4dF9ub3JtYWw7Ci0JCQlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9USU1FX1dBSVQpCi0JCQkJcmVzID0gaW5ldF90d3NrX2RpYWdfZHVtcChzaywgc2tiLCBjYiwgciwgYmMpOwotCQkJZWxzZQotCQkJCXJlcyA9IGluZXRfY3NrX2RpYWdfZHVtcChzaywgc2tiLCBjYiwgciwgYmMpOworCQkJdHdza19idWlsZF9hc3NlcnQoKTsKKworCQkJaWYgKCFpbmV0X2RpYWdfYmNfc2soYmMsIHNrKSkKKwkJCQlnb3RvIG5leHRfbm9ybWFsOworCisJCQlyZXMgPSBza19kaWFnX2ZpbGwoc2ssIHNrYiwgciwKKwkJCQkJICAgc2tfdXNlcl9ucyhORVRMSU5LX0NCKGNiLT5za2IpLnNrKSwKKwkJCQkJICAgTkVUTElOS19DQihjYi0+c2tiKS5wb3J0aWQsCisJCQkJCSAgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksCisJCQkJCSAgIGNiLT5ubGgpOwogCQkJaWYgKHJlcyA8IDApIHsKIAkJCQlzcGluX3VubG9ja19iaChsb2NrKTsKIAkJCQlnb3RvIGRvbmU7CkBAIC05NzYsNyArOTI1LDggQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfZGlhZ19kdW1wX2ljc2spOwogCiBzdGF0aWMgaW50IF9faW5ldF9kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAotCQlzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwgc3RydWN0IG5sYXR0ciAqYmMpCisJCQkgICAgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIsCisJCQkgICAgc3RydWN0IG5sYXR0ciAqYmMpCiB7CiAJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyOwogCWludCBlcnIgPSAwOwpAQCAtOTkzLDggKzk0Myw4IEBACiAKIHN0YXRpYyBpbnQgaW5ldF9kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQogewotCXN0cnVjdCBubGF0dHIgKmJjID0gTlVMTDsKIAlpbnQgaGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyKTsKKwlzdHJ1Y3QgbmxhdHRyICpiYyA9IE5VTEw7CiAKIAlpZiAobmxtc2dfYXR0cmxlbihjYi0+bmxoLCBoZHJsZW4pKQogCQliYyA9IG5sbXNnX2ZpbmRfYXR0cihjYi0+bmxoLCBoZHJsZW4sIElORVRfRElBR19SRVFfQllURUNPREUpOwpAQCAtMTAwMiw3ICs5NTIsNyBAQAogCXJldHVybiBfX2luZXRfZGlhZ19kdW1wKHNrYiwgY2IsIG5sbXNnX2RhdGEoY2ItPm5saCksIGJjKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgaW5ldF9kaWFnX3R5cGUycHJvdG8oaW50IHR5cGUpCitzdGF0aWMgaW50IGluZXRfZGlhZ190eXBlMnByb3RvKGludCB0eXBlKQogewogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgVENQRElBR19HRVRTT0NLOgpAQCAtMTAxNCwxMiArOTY0LDEzIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGluZXRfZGlhZ19kdW1wX2NvbXBhdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCitzdGF0aWMgaW50IGluZXRfZGlhZ19kdW1wX2NvbXBhdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7CiAJc3RydWN0IGluZXRfZGlhZ19yZXEgKnJjID0gbmxtc2dfZGF0YShjYi0+bmxoKTsKKwlpbnQgaGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfcmVxKTsKIAlzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiByZXE7CiAJc3RydWN0IG5sYXR0ciAqYmMgPSBOVUxMOwotCWludCBoZHJsZW4gPSBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19yZXEpOwogCiAJcmVxLnNkaWFnX2ZhbWlseSA9IEFGX1VOU1BFQzsgLyogY29tcGF0aWJpbGl0eSAqLwogCXJlcS5zZGlhZ19wcm90b2NvbCA9IGluZXRfZGlhZ190eXBlMnByb3RvKGNiLT5ubGgtPm5sbXNnX3R5cGUpOwpAQCAtMTAzNCw3ICs5ODUsNyBAQAogfQogCiBzdGF0aWMgaW50IGluZXRfZGlhZ19nZXRfZXhhY3RfY29tcGF0KHN0cnVjdCBza19idWZmICppbl9za2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgpCisJCQkJICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgpCiB7CiAJc3RydWN0IGluZXRfZGlhZ19yZXEgKnJjID0gbmxtc2dfZGF0YShubGgpOwogCXN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyIHJlcTsKQEAgLTEwNjMsNyArMTAxNCw3IEBACiAKIAkJCWF0dHIgPSBubG1zZ19maW5kX2F0dHIobmxoLCBoZHJsZW4sCiAJCQkJCSAgICAgICBJTkVUX0RJQUdfUkVRX0JZVEVDT0RFKTsKLQkJCWlmIChhdHRyID09IE5VTEwgfHwKKwkJCWlmICghYXR0ciB8fAogCQkJICAgIG5sYV9sZW4oYXR0cikgPCBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19iY19vcCkgfHwKIAkJCSAgICBpbmV0X2RpYWdfYmNfYXVkaXQobmxhX2RhdGEoYXR0ciksIG5sYV9sZW4oYXR0cikpKQogCQkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTA5MCw5ICsxMDQxLDEwIEBACiAJaWYgKGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkgewogCQlpZiAobmxtc2dfYXR0cmxlbihoLCBoZHJsZW4pKSB7CiAJCQlzdHJ1Y3QgbmxhdHRyICphdHRyOworCiAJCQlhdHRyID0gbmxtc2dfZmluZF9hdHRyKGgsIGhkcmxlbiwKIAkJCQkJICAgICAgIElORVRfRElBR19SRVFfQllURUNPREUpOwotCQkJaWYgKGF0dHIgPT0gTlVMTCB8fAorCQkJaWYgKCFhdHRyIHx8CiAJCQkgICAgbmxhX2xlbihhdHRyKSA8IHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKSB8fAogCQkJICAgIGluZXRfZGlhZ19iY19hdWRpdChubGFfZGF0YShhdHRyKSwgbmxhX2xlbihhdHRyKSkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTI4LDcgKzEwODAsNyBAQAogCiAJbXV0ZXhfbG9jaygmaW5ldF9kaWFnX3RhYmxlX211dGV4KTsKIAllcnIgPSAtRUVYSVNUOwotCWlmIChpbmV0X2RpYWdfdGFibGVbdHlwZV0gPT0gTlVMTCkgeworCWlmICghaW5ldF9kaWFnX3RhYmxlW3R5cGVdKSB7CiAJCWluZXRfZGlhZ190YWJsZVt0eXBlXSA9IGg7CiAJCWVyciA9IDA7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaW5ldF9mcmFnbWVudC5jIGIvbmV0L2lwdjQvaW5ldF9mcmFnbWVudC5jCmluZGV4IGU3OTIwMzUuLjVlMzQ2YTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfZnJhZ21lbnQuYworKysgYi9uZXQvaXB2NC9pbmV0X2ZyYWdtZW50LmMKQEAgLTM4NSw3ICszODUsNyBAQAogCX0KIAogCXEgPSBrbWVtX2NhY2hlX3phbGxvYyhmLT5mcmFnc19jYWNoZXAsIEdGUF9BVE9NSUMpOwotCWlmIChxID09IE5VTEwpCisJaWYgKCFxKQogCQlyZXR1cm4gTlVMTDsKIAogCXEtPm5ldCA9IG5mOwpAQCAtNDA2LDcgKzQwNiw3IEBACiAJc3RydWN0IGluZXRfZnJhZ19xdWV1ZSAqcTsKIAogCXEgPSBpbmV0X2ZyYWdfYWxsb2MobmYsIGYsIGFyZyk7Ci0JaWYgKHEgPT0gTlVMTCkKKwlpZiAoIXEpCiAJCXJldHVybiBOVUxMOwogCiAJcmV0dXJuIGluZXRfZnJhZ19pbnRlcm4obmYsIHEsIGYsIGFyZyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pbmV0X2hhc2h0YWJsZXMuYyBiL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCmluZGV4IDkxMTFhNGUuLmM2ZmI4MGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCisrKyBiL25ldC9pcHY0L2luZXRfaGFzaHRhYmxlcy5jCkBAIC0yNCw5ICsyNCw5IEBACiAjaW5jbHVkZSA8bmV0L3NlY3VyZV9zZXEuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KIAotc3RhdGljIHVuc2lnbmVkIGludCBpbmV0X2VoYXNoZm4oc3RydWN0IG5ldCAqbmV0LCBjb25zdCBfX2JlMzIgbGFkZHIsCi0JCQkJIGNvbnN0IF9fdTE2IGxwb3J0LCBjb25zdCBfX2JlMzIgZmFkZHIsCi0JCQkJIGNvbnN0IF9fYmUxNiBmcG9ydCkKK3N0YXRpYyB1MzIgaW5ldF9laGFzaGZuKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgY29uc3QgX19iZTMyIGxhZGRyLAorCQkJY29uc3QgX191MTYgbHBvcnQsIGNvbnN0IF9fYmUzMiBmYWRkciwKKwkJCWNvbnN0IF9fYmUxNiBmcG9ydCkKIHsKIAlzdGF0aWMgdTMyIGluZXRfZWhhc2hfc2VjcmV0IF9fcmVhZF9tb3N0bHk7CiAKQEAgLTM2LDE3ICszNiwyMSBAQAogCQkJICAgICAgaW5ldF9laGFzaF9zZWNyZXQgKyBuZXRfaGFzaF9taXgobmV0KSk7CiB9CiAKLQotc3RhdGljIHVuc2lnbmVkIGludCBpbmV0X3NrX2VoYXNoZm4oY29uc3Qgc3RydWN0IHNvY2sgKnNrKQorLyogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGluZXRfc29jaywgYnV0IGFsc28gdGltZXdhaXQgYW5kIHJlcXVlc3Qgc29ja2V0cworICogZm9yIElQdjQvSVB2Ni4KKyAqLwordTMyIHNrX2VoYXNoZm4oY29uc3Qgc3RydWN0IHNvY2sgKnNrKQogewotCWNvbnN0IHN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKLQljb25zdCBfX2JlMzIgbGFkZHIgPSBpbmV0LT5pbmV0X3Jjdl9zYWRkcjsKLQljb25zdCBfX3UxNiBscG9ydCA9IGluZXQtPmluZXRfbnVtOwotCWNvbnN0IF9fYmUzMiBmYWRkciA9IGluZXQtPmluZXRfZGFkZHI7Ci0JY29uc3QgX19iZTE2IGZwb3J0ID0gaW5ldC0+aW5ldF9kcG9ydDsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7Ci0KLQlyZXR1cm4gaW5ldF9laGFzaGZuKG5ldCwgbGFkZHIsIGxwb3J0LCBmYWRkciwgZnBvcnQpOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJaWYgKHNrLT5za19mYW1pbHkgPT0gQUZfSU5FVDYgJiYKKwkgICAgIWlwdjZfYWRkcl92NG1hcHBlZCgmc2stPnNrX3Y2X2RhZGRyKSkKKwkJcmV0dXJuIGluZXQ2X2VoYXNoZm4oc29ja19uZXQoc2spLAorCQkJCSAgICAgJnNrLT5za192Nl9yY3Zfc2FkZHIsIHNrLT5za19udW0sCisJCQkJICAgICAmc2stPnNrX3Y2X2RhZGRyLCBzay0+c2tfZHBvcnQpOworI2VuZGlmCisJcmV0dXJuIGluZXRfZWhhc2hmbihzb2NrX25ldChzayksCisJCQkgICAgc2stPnNrX3Jjdl9zYWRkciwgc2stPnNrX251bSwKKwkJCSAgICBzay0+c2tfZGFkZHIsIHNrLT5za19kcG9ydCk7CiB9CiAKIC8qCkBAIC02MCw4ICs2NCw4IEBACiB7CiAJc3RydWN0IGluZXRfYmluZF9idWNrZXQgKnRiID0ga21lbV9jYWNoZV9hbGxvYyhjYWNoZXAsIEdGUF9BVE9NSUMpOwogCi0JaWYgKHRiICE9IE5VTEwpIHsKLQkJd3JpdGVfcG5ldCgmdGItPmliX25ldCwgaG9sZF9uZXQobmV0KSk7CisJaWYgKHRiKSB7CisJCXdyaXRlX3BuZXQoJnRiLT5pYl9uZXQsIG5ldCk7CiAJCXRiLT5wb3J0ICAgICAgPSBzbnVtOwogCQl0Yi0+ZmFzdHJldXNlID0gMDsKIAkJdGItPmZhc3RyZXVzZXBvcnQgPSAwOwpAQCAtNzksNyArODMsNiBAQAogewogCWlmIChobGlzdF9lbXB0eSgmdGItPm93bmVycykpIHsKIAkJX19obGlzdF9kZWwoJnRiLT5ub2RlKTsKLQkJcmVsZWFzZV9uZXQoaWJfbmV0KHRiKSk7CiAJCWttZW1fY2FjaGVfZnJlZShjYWNoZXAsIHRiKTsKIAl9CiB9CkBAIC0yNjMsMTEgKzI2NiwxOSBAQAogCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfVElNRV9XQUlUKQogCQlpbmV0X3R3c2tfZnJlZShpbmV0X3R3c2soc2spKTsKKwllbHNlIGlmIChzay0+c2tfc3RhdGUgPT0gVENQX05FV19TWU5fUkVDVikKKwkJcmVxc2tfZnJlZShpbmV0X3JlcXNrKHNrKSk7CiAJZWxzZQogCQlza19mcmVlKHNrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNvY2tfZ2VuX3B1dCk7CiAKK3ZvaWQgc29ja19lZGVtdXgoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzb2NrX2dlbl9wdXQoc2tiLT5zayk7Cit9CitFWFBPUlRfU1lNQk9MKHNvY2tfZWRlbXV4KTsKKwogc3RydWN0IHNvY2sgKl9faW5ldF9sb29rdXBfZXN0YWJsaXNoZWQoc3RydWN0IG5ldCAqbmV0LAogCQkJCSAgc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLAogCQkJCSAgY29uc3QgX19iZTMyIHNhZGRyLCBjb25zdCBfX2JlMTYgc3BvcnQsCkBAIC0zNzcsNyArMzg4LDcgQEAKIAkJKnR3cCA9IHR3OwogCX0gZWxzZSBpZiAodHcpIHsKIAkJLyogU2lsbHkuIFNob3VsZCBoYXNoLWRhbmNlIGluc3RlYWQuLi4gKi8KLQkJaW5ldF90d3NrX2Rlc2NoZWR1bGUodHcsIGRlYXRoX3Jvdyk7CisJCWluZXRfdHdza19kZXNjaGVkdWxlKHR3KTsKIAogCQlpbmV0X3R3c2tfcHV0KHR3KTsKIAl9CkBAIC00MDAsMTMgKzQxMSwxMyBAQAogewogCXN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbyA9IHNrLT5za19wcm90LT5oLmhhc2hpbmZvOwogCXN0cnVjdCBobGlzdF9udWxsc19oZWFkICpsaXN0OwotCXNwaW5sb2NrX3QgKmxvY2s7CiAJc3RydWN0IGluZXRfZWhhc2hfYnVja2V0ICpoZWFkOworCXNwaW5sb2NrX3QgKmxvY2s7CiAJaW50IHR3cmVmY250ID0gMDsKIAogCVdBUk5fT04oIXNrX3VuaGFzaGVkKHNrKSk7CiAKLQlzay0+c2tfaGFzaCA9IGluZXRfc2tfZWhhc2hmbihzayk7CisJc2stPnNrX2hhc2ggPSBza19laGFzaGZuKHNrKTsKIAloZWFkID0gaW5ldF9laGFzaF9idWNrZXQoaGFzaGluZm8sIHNrLT5za19oYXNoKTsKIAlsaXN0ID0gJmhlYWQtPmNoYWluOwogCWxvY2sgPSBpbmV0X2VoYXNoX2xvY2twKGhhc2hpbmZvLCBzay0+c2tfaGFzaCk7CkBAIC00MjMsMTUgKzQzNCwxMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19pbmV0X2hhc2hfbm9saXN0ZW4pOwogCi1zdGF0aWMgdm9pZCBfX2luZXRfaGFzaChzdHJ1Y3Qgc29jayAqc2spCitpbnQgX19pbmV0X2hhc2goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dykKIHsKIAlzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaGFzaGluZm8gPSBzay0+c2tfcHJvdC0+aC5oYXNoaW5mbzsKIAlzdHJ1Y3QgaW5ldF9saXN0ZW5faGFzaGJ1Y2tldCAqaWxiOwogCi0JaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfTElTVEVOKSB7Ci0JCV9faW5ldF9oYXNoX25vbGlzdGVuKHNrLCBOVUxMKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9MSVNURU4pCisJCXJldHVybiBfX2luZXRfaGFzaF9ub2xpc3RlbihzaywgdHcpOwogCiAJV0FSTl9PTighc2tfdW5oYXNoZWQoc2spKTsKIAlpbGIgPSAmaGFzaGluZm8tPmxpc3RlbmluZ19oYXNoW2luZXRfc2tfbGlzdGVuX2hhc2hmbihzayldOwpAQCAtNDQwLDEzICs0NDksMTUgQEAKIAlfX3NrX251bGxzX2FkZF9ub2RlX3JjdShzaywgJmlsYi0+aGVhZCk7CiAJc29ja19wcm90X2ludXNlX2FkZChzb2NrX25ldChzayksIHNrLT5za19wcm90LCAxKTsKIAlzcGluX3VubG9jaygmaWxiLT5sb2NrKTsKKwlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0woX19pbmV0X2hhc2gpOwogCiB2b2lkIGluZXRfaGFzaChzdHJ1Y3Qgc29jayAqc2spCiB7CiAJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpIHsKIAkJbG9jYWxfYmhfZGlzYWJsZSgpOwotCQlfX2luZXRfaGFzaChzayk7CisJCV9faW5ldF9oYXNoKHNrLCBOVUxMKTsKIAkJbG9jYWxfYmhfZW5hYmxlKCk7CiAJfQogfQpAQCAtNDc3LDggKzQ4OCw3IEBACiBpbnQgX19pbmV0X2hhc2hfY29ubmVjdChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgKmRlYXRoX3JvdywKIAkJc3RydWN0IHNvY2sgKnNrLCB1MzIgcG9ydF9vZmZzZXQsCiAJCWludCAoKmNoZWNrX2VzdGFibGlzaGVkKShzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgKiwKLQkJCXN0cnVjdCBzb2NrICosIF9fdTE2LCBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICoqKSwKLQkJaW50ICgqaGFzaCkoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0d3ApKQorCQkJc3RydWN0IHNvY2sgKiwgX191MTYsIHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKiopKQogewogCXN0cnVjdCBpbmV0X2hhc2hpbmZvICpoaW5mbyA9IGRlYXRoX3Jvdy0+aGFzaGluZm87CiAJY29uc3QgdW5zaWduZWQgc2hvcnQgc251bSA9IGluZXRfc2soc2spLT5pbmV0X251bTsKQEAgLTU0OCwxNCArNTU4LDE0IEBACiAJCWluZXRfYmluZF9oYXNoKHNrLCB0YiwgcG9ydCk7CiAJCWlmIChza191bmhhc2hlZChzaykpIHsKIAkJCWluZXRfc2soc2spLT5pbmV0X3Nwb3J0ID0gaHRvbnMocG9ydCk7Ci0JCQl0d3JlZmNudCArPSBoYXNoKHNrLCB0dyk7CisJCQl0d3JlZmNudCArPSBfX2luZXRfaGFzaF9ub2xpc3RlbihzaywgdHcpOwogCQl9CiAJCWlmICh0dykKIAkJCXR3cmVmY250ICs9IGluZXRfdHdza19iaW5kX3VuaGFzaCh0dywgaGluZm8pOwogCQlzcGluX3VubG9jaygmaGVhZC0+bG9jayk7CiAKIAkJaWYgKHR3KSB7Ci0JCQlpbmV0X3R3c2tfZGVzY2hlZHVsZSh0dywgZGVhdGhfcm93KTsKKwkJCWluZXRfdHdza19kZXNjaGVkdWxlKHR3KTsKIAkJCXdoaWxlICh0d3JlZmNudCkgewogCQkJCXR3cmVmY250LS07CiAJCQkJaW5ldF90d3NrX3B1dCh0dyk7CkBAIC01NzAsNyArNTgwLDcgQEAKIAl0YiAgPSBpbmV0X2NzayhzayktPmljc2tfYmluZF9oYXNoOwogCXNwaW5fbG9ja19iaCgmaGVhZC0+bG9jayk7CiAJaWYgKHNrX2hlYWQoJnRiLT5vd25lcnMpID09IHNrICYmICFzay0+c2tfYmluZF9ub2RlLm5leHQpIHsKLQkJaGFzaChzaywgTlVMTCk7CisJCV9faW5ldF9oYXNoX25vbGlzdGVuKHNrLCBOVUxMKTsKIAkJc3Bpbl91bmxvY2tfYmgoJmhlYWQtPmxvY2spOwogCQlyZXR1cm4gMDsKIAl9IGVsc2UgewpAQCAtNTkwLDcgKzYwMCw3IEBACiAJCSAgICAgIHN0cnVjdCBzb2NrICpzaykKIHsKIAlyZXR1cm4gX19pbmV0X2hhc2hfY29ubmVjdChkZWF0aF9yb3csIHNrLCBpbmV0X3NrX3BvcnRfb2Zmc2V0KHNrKSwKLQkJCV9faW5ldF9jaGVja19lc3RhYmxpc2hlZCwgX19pbmV0X2hhc2hfbm9saXN0ZW4pOworCQkJCSAgIF9faW5ldF9jaGVja19lc3RhYmxpc2hlZCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpbmV0X2hhc2hfY29ubmVjdCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRfdGltZXdhaXRfc29jay5jIGIvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKaW5kZXggNmQ1OTJmOC4uMDBlYzhkNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKKysrIGIvbmV0L2lwdjQvaW5ldF90aW1ld2FpdF9zb2NrLmMKQEAgLTY3LDkgKzY3LDkgQEAKIH0KIAogLyogTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NhbGx5IGRpc2FibGVkIEJIcy4gKi8KLXN0YXRpYyB2b2lkIF9faW5ldF90d3NrX2tpbGwoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcsCi0JCQkgICAgIHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbykKK3N0YXRpYyB2b2lkIGluZXRfdHdza19raWxsKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KQogeworCXN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbyA9IHR3LT50d19kci0+aGFzaGluZm87CiAJc3RydWN0IGluZXRfYmluZF9oYXNoYnVja2V0ICpiaGVhZDsKIAlpbnQgcmVmY250OwogCS8qIFVubGluayBmcm9tIGVzdGFibGlzaGVkIGhhc2hlcy4gKi8KQEAgLTg5LDYgKzg5LDggQEAKIAogCUJVR19PTihyZWZjbnQgPj0gYXRvbWljX3JlYWQoJnR3LT50d19yZWZjbnQpKTsKIAlhdG9taWNfc3ViKHJlZmNudCwgJnR3LT50d19yZWZjbnQpOworCWF0b21pY19kZWMoJnR3LT50d19kci0+dHdfY291bnQpOworCWluZXRfdHdza19wdXQodHcpOwogfQogCiB2b2lkIGluZXRfdHdza19mcmVlKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3KQpAQCAtOTgsNyArMTAwLDYgQEAKICNpZmRlZiBTT0NLX1JFRkNOVF9ERUJVRwogCXByX2RlYnVnKCIlcyB0aW1ld2FpdF9zb2NrICVwIHJlbGVhc2VkXG4iLCB0dy0+dHdfcHJvdC0+bmFtZSwgdHcpOwogI2VuZGlmCi0JcmVsZWFzZV9uZXQodHdza19uZXQodHcpKTsKIAlrbWVtX2NhY2hlX2ZyZWUodHctPnR3X3Byb3QtPnR3c2tfcHJvdC0+dHdza19zbGFiLCB0dyk7CiAJbW9kdWxlX3B1dChvd25lcik7CiB9CkBAIC0xNjksMTYgKzE3MCwzNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19pbmV0X3R3c2tfaGFzaGRhbmNlKTsKIAotc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqaW5ldF90d3NrX2FsbG9jKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3QgaW50IHN0YXRlKQordm9pZCB0d190aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKLQlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dyA9Ci0JCWttZW1fY2FjaGVfYWxsb2Moc2stPnNrX3Byb3RfY3JlYXRvci0+dHdza19wcm90LT50d3NrX3NsYWIsCi0JCQkJIEdGUF9BVE9NSUMpOwotCWlmICh0dyAhPSBOVUxMKSB7CisJc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcgPSAoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqKWRhdGE7CisKKwlpZiAodHctPnR3X2tpbGwpCisJCU5FVF9JTkNfU1RBVFNfQkgodHdza19uZXQodHcpLCBMSU5VWF9NSUJfVElNRVdBSVRLSUxMRUQpOworCWVsc2UKKwkJTkVUX0lOQ19TVEFUU19CSCh0d3NrX25ldCh0dyksIExJTlVYX01JQl9USU1FV0FJVEVEKTsKKwlpbmV0X3R3c2tfa2lsbCh0dyk7Cit9CisKK3N0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKmluZXRfdHdza19hbGxvYyhjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCSAgIHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqZHIsCisJCQkJCSAgIGNvbnN0IGludCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dzsKKworCWlmIChhdG9taWNfcmVhZCgmZHItPnR3X2NvdW50KSA+PSBkci0+c3lzY3RsX21heF90d19idWNrZXRzKQorCQlyZXR1cm4gTlVMTDsKKworCXR3ID0ga21lbV9jYWNoZV9hbGxvYyhzay0+c2tfcHJvdF9jcmVhdG9yLT50d3NrX3Byb3QtPnR3c2tfc2xhYiwKKwkJCSAgICAgIEdGUF9BVE9NSUMpOworCWlmICh0dykgewogCQljb25zdCBzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAKIAkJa21lbWNoZWNrX2Fubm90YXRlX2JpdGZpZWxkKHR3LCBmbGFncyk7CiAKKwkJdHctPnR3X2RyCSAgICA9IGRyOwogCQkvKiBHaXZlIHVzIGFuIGlkZW50aXR5LiAqLwogCQl0dy0+dHdfZGFkZHIJICAgID0gaW5ldC0+aW5ldF9kYWRkcjsKIAkJdHctPnR3X3Jjdl9zYWRkciAgICA9IGluZXQtPmluZXRfcmN2X3NhZGRyOwpAQCAtMTk1LDE0ICsyMTQsMTYgQEAKIAkJdHctPnR3X2lwdjZvbmx5CSAgICA9IDA7CiAJCXR3LT50d190cmFuc3BhcmVudCAgPSBpbmV0LT50cmFuc3BhcmVudDsKIAkJdHctPnR3X3Byb3QJICAgID0gc2stPnNrX3Byb3RfY3JlYXRvcjsKLQkJdHdza19uZXRfc2V0KHR3LCBob2xkX25ldChzb2NrX25ldChzaykpKTsKKwkJYXRvbWljNjRfc2V0KCZ0dy0+dHdfY29va2llLCBhdG9taWM2NF9yZWFkKCZzay0+c2tfY29va2llKSk7CisJCXR3c2tfbmV0X3NldCh0dywgc29ja19uZXQoc2spKTsKKwkJc2V0dXBfdGltZXIoJnR3LT50d190aW1lciwgdHdfdGltZXJfaGFuZGxlciwgKHVuc2lnbmVkIGxvbmcpdHcpOwogCQkvKgogCQkgKiBCZWNhdXNlIHdlIHVzZSBSQ1UgbG9va3Vwcywgd2Ugc2hvdWxkIG5vdCBzZXQgdHdfcmVmY250CiAJCSAqIHRvIGEgbm9uIG51bGwgdmFsdWUgYmVmb3JlIGV2ZXJ5dGhpbmcgaXMgc2V0dXAgZm9yIHRoaXMKIAkJICogdGltZXdhaXQgc29ja2V0LgogCQkgKi8KIAkJYXRvbWljX3NldCgmdHctPnR3X3JlZmNudCwgMCk7Ci0JCWluZXRfdHdza19kZWFkX25vZGVfaW5pdCh0dyk7CisKIAkJX19tb2R1bGVfZ2V0KHR3LT50d19wcm90LT5vd25lcik7CiAJfQogCkBAIC0yMTAsMTM5ICsyMzEsMjAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfdHdza19hbGxvYyk7CiAKLS8qIFJldHVybnMgbm9uLXplcm8gaWYgcXVvdGEgZXhjZWVkZWQuICAqLwotc3RhdGljIGludCBpbmV0X3R3ZHJfZG9fdHdraWxsX3dvcmsoc3RydWN0IGluZXRfdGltZXdhaXRfZGVhdGhfcm93ICp0d2RyLAotCQkJCSAgICBjb25zdCBpbnQgc2xvdCkKLXsKLQlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dzsKLQl1bnNpZ25lZCBpbnQga2lsbGVkOwotCWludCByZXQ7Ci0KLQkvKiBOT1RFOiBjb21wYXJlIHRoaXMgdG8gcHJldmlvdXMgdmVyc2lvbiB3aGVyZSBsb2NrCi0JICogd2FzIHJlbGVhc2VkIGFmdGVyIGRldGFjaGluZyBjaGFpbi4gSXQgd2FzIHJhY3ksCi0JICogYmVjYXVzZSB0dyBidWNrZXRzIGFyZSBzY2hlZHVsZWQgaW4gbm90IHNlcmlhbGl6ZWQgY29udGV4dAotCSAqIGluIDIuMyAod2l0aCBuZXRmaWx0ZXIpLCBhbmQgd2l0aCBzb2Z0bmV0IGl0IGlzIGNvbW1vbiwgYmVjYXVzZQotCSAqIHNvZnQgaXJxcyBhcmUgbm90IHNlcXVlbmNlZC4KLQkgKi8KLQlraWxsZWQgPSAwOwotCXJldCA9IDA7Ci1yZXNjYW46Ci0JaW5ldF90d3NrX2Zvcl9lYWNoX2lubWF0ZSh0dywgJnR3ZHItPmNlbGxzW3Nsb3RdKSB7Ci0JCV9faW5ldF90d3NrX2RlbF9kZWFkX25vZGUodHcpOwotCQlzcGluX3VubG9jaygmdHdkci0+ZGVhdGhfbG9jayk7Ci0JCV9faW5ldF90d3NrX2tpbGwodHcsIHR3ZHItPmhhc2hpbmZvKTsKLSNpZmRlZiBDT05GSUdfTkVUX05TCi0JCU5FVF9JTkNfU1RBVFNfQkgodHdza19uZXQodHcpLCBMSU5VWF9NSUJfVElNRVdBSVRFRCk7Ci0jZW5kaWYKLQkJaW5ldF90d3NrX3B1dCh0dyk7Ci0JCWtpbGxlZCsrOwotCQlzcGluX2xvY2soJnR3ZHItPmRlYXRoX2xvY2spOwotCQlpZiAoa2lsbGVkID4gSU5FVF9UV0RSX1RXS0lMTF9RVU9UQSkgewotCQkJcmV0ID0gMTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogV2hpbGUgd2UgZHJvcHBlZCB0d2RyLT5kZWF0aF9sb2NrLCBhbm90aGVyIGNwdSBtYXkgaGF2ZQotCQkgKiBraWxsZWQgb2ZmIHRoZSBuZXh0IFRXIGJ1Y2tldCBpbiB0aGUgbGlzdCwgdGhlcmVmb3JlCi0JCSAqIGRvIGEgZnJlc2ggcmUtcmVhZCBvZiB0aGUgaGxpc3QgaGVhZCBub2RlIHdpdGggdGhlCi0JCSAqIGxvY2sgcmVhY3F1aXJlZC4gIFdlIHN0aWxsIHVzZSB0aGUgaGxpc3QgdHJhdmVyc2FsCi0JCSAqIG1hY3JvIGluIG9yZGVyIHRvIGdldCB0aGUgcHJlZmV0Y2hlcy4KLQkJICovCi0JCWdvdG8gcmVzY2FuOwotCX0KLQotCXR3ZHItPnR3X2NvdW50IC09IGtpbGxlZDsKLSNpZm5kZWYgQ09ORklHX05FVF9OUwotCU5FVF9BRERfU1RBVFNfQkgoJmluaXRfbmV0LCBMSU5VWF9NSUJfVElNRVdBSVRFRCwga2lsbGVkKTsKLSNlbmRpZgotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaW5ldF90d2RyX2hhbmdtYW4odW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqdHdkcjsKLQl1bnNpZ25lZCBpbnQgbmVlZF90aW1lcjsKLQotCXR3ZHIgPSAoc3RydWN0IGluZXRfdGltZXdhaXRfZGVhdGhfcm93ICopZGF0YTsKLQlzcGluX2xvY2soJnR3ZHItPmRlYXRoX2xvY2spOwotCi0JaWYgKHR3ZHItPnR3X2NvdW50ID09IDApCi0JCWdvdG8gb3V0OwotCi0JbmVlZF90aW1lciA9IDA7Ci0JaWYgKGluZXRfdHdkcl9kb190d2tpbGxfd29yayh0d2RyLCB0d2RyLT5zbG90KSkgewotCQl0d2RyLT50aHJlYWRfc2xvdHMgfD0gKDEgPDwgdHdkci0+c2xvdCk7Ci0JCXNjaGVkdWxlX3dvcmsoJnR3ZHItPnR3a2lsbF93b3JrKTsKLQkJbmVlZF90aW1lciA9IDE7Ci0JfSBlbHNlIHsKLQkJLyogV2UgcHVyZ2VkIHRoZSBlbnRpcmUgc2xvdCwgYW55dGhpbmcgbGVmdD8gICovCi0JCWlmICh0d2RyLT50d19jb3VudCkKLQkJCW5lZWRfdGltZXIgPSAxOwotCQl0d2RyLT5zbG90ID0gKCh0d2RyLT5zbG90ICsgMSkgJiAoSU5FVF9UV0RSX1RXS0lMTF9TTE9UUyAtIDEpKTsKLQl9Ci0JaWYgKG5lZWRfdGltZXIpCi0JCW1vZF90aW1lcigmdHdkci0+dHdfdGltZXIsIGppZmZpZXMgKyB0d2RyLT5wZXJpb2QpOwotb3V0OgotCXNwaW5fdW5sb2NrKCZ0d2RyLT5kZWF0aF9sb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGluZXRfdHdkcl9oYW5nbWFuKTsKLQotdm9pZCBpbmV0X3R3ZHJfdHdraWxsX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqdHdkciA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3csIHR3a2lsbF93b3JrKTsKLQlpbnQgaTsKLQotCUJVSUxEX0JVR19PTigoSU5FVF9UV0RSX1RXS0lMTF9TTE9UUyAtIDEpID4KLQkJCShzaXplb2YodHdkci0+dGhyZWFkX3Nsb3RzKSAqIDgpKTsKLQotCXdoaWxlICh0d2RyLT50aHJlYWRfc2xvdHMpIHsKLQkJc3Bpbl9sb2NrX2JoKCZ0d2RyLT5kZWF0aF9sb2NrKTsKLQkJZm9yIChpID0gMDsgaSA8IElORVRfVFdEUl9UV0tJTExfU0xPVFM7IGkrKykgewotCQkJaWYgKCEodHdkci0+dGhyZWFkX3Nsb3RzICYgKDEgPDwgaSkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQl3aGlsZSAoaW5ldF90d2RyX2RvX3R3a2lsbF93b3JrKHR3ZHIsIGkpICE9IDApIHsKLQkJCQlpZiAobmVlZF9yZXNjaGVkKCkpIHsKLQkJCQkJc3Bpbl91bmxvY2tfYmgoJnR3ZHItPmRlYXRoX2xvY2spOwotCQkJCQlzY2hlZHVsZSgpOwotCQkJCQlzcGluX2xvY2tfYmgoJnR3ZHItPmRlYXRoX2xvY2spOwotCQkJCX0KLQkJCX0KLQotCQkJdHdkci0+dGhyZWFkX3Nsb3RzICY9IH4oMSA8PCBpKTsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmdHdkci0+ZGVhdGhfbG9jayk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF90d2RyX3R3a2lsbF93b3JrKTsKLQogLyogVGhlc2UgYXJlIGFsd2F5cyBjYWxsZWQgZnJvbSBCSCBjb250ZXh0LiAgU2VlIGNhbGxlcnMgaW4KICAqIHRjcF9pbnB1dC5jIHRvIHZlcmlmeSB0aGlzLgogICovCiAKIC8qIFRoaXMgaXMgZm9yIGhhbmRsaW5nIGVhcmx5LWtpbGxzIG9mIFRJTUVfV0FJVCBzb2NrZXRzLiAqLwotdm9pZCBpbmV0X3R3c2tfZGVzY2hlZHVsZShzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dywKLQkJCSAgc3RydWN0IGluZXRfdGltZXdhaXRfZGVhdGhfcm93ICp0d2RyKQordm9pZCBpbmV0X3R3c2tfZGVzY2hlZHVsZShzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dykKIHsKLQlzcGluX2xvY2soJnR3ZHItPmRlYXRoX2xvY2spOwotCWlmIChpbmV0X3R3c2tfZGVsX2RlYWRfbm9kZSh0dykpIHsKLQkJaW5ldF90d3NrX3B1dCh0dyk7Ci0JCWlmICgtLXR3ZHItPnR3X2NvdW50ID09IDApCi0JCQlkZWxfdGltZXIoJnR3ZHItPnR3X3RpbWVyKTsKLQl9Ci0Jc3Bpbl91bmxvY2soJnR3ZHItPmRlYXRoX2xvY2spOwotCV9faW5ldF90d3NrX2tpbGwodHcsIHR3ZHItPmhhc2hpbmZvKTsKKwlpZiAoZGVsX3RpbWVyX3N5bmMoJnR3LT50d190aW1lcikpCisJCWluZXRfdHdza19raWxsKHR3KTsKIH0KIEVYUE9SVF9TWU1CT0woaW5ldF90d3NrX2Rlc2NoZWR1bGUpOwogCi12b2lkIGluZXRfdHdza19zY2hlZHVsZShzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dywKLQkJICAgICAgIHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqdHdkciwKLQkJICAgICAgIGNvbnN0IGludCB0aW1lbywgY29uc3QgaW50IHRpbWV3YWl0X2xlbikKK3ZvaWQgaW5ldF90d3NrX3NjaGVkdWxlKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3LCBjb25zdCBpbnQgdGltZW8pCiB7Ci0Jc3RydWN0IGhsaXN0X2hlYWQgKmxpc3Q7Ci0JaW50IHNsb3Q7Ci0KIAkvKiB0aW1lb3V0IDo9IFJUTyAqIDMuNQogCSAqCiAJICogMy41ID0gMSsyKzAuNSB0byB3YWl0IGZvciB0d28gcmV0cmFuc21pdHMuCkBAIC0zNjcsMTE1ICsyNjksMTUgQEAKIAkgKiBpcyBncmVhdGVyIHRoYW4gVFMgdGljayEpIGFuZCBkZXRlY3Qgb2xkIGR1cGxpY2F0ZXMgd2l0aCBoZWxwCiAJICogb2YgUEFXUy4KIAkgKi8KLQlzbG90ID0gKHRpbWVvICsgKDEgPDwgSU5FVF9UV0RSX1JFQ1lDTEVfVElDSykgLSAxKSA+PiBJTkVUX1RXRFJfUkVDWUNMRV9USUNLOwogCi0Jc3Bpbl9sb2NrKCZ0d2RyLT5kZWF0aF9sb2NrKTsKLQotCS8qIFVubGluayBpdCwgaWYgaXQgd2FzIHNjaGVkdWxlZCAqLwotCWlmIChpbmV0X3R3c2tfZGVsX2RlYWRfbm9kZSh0dykpCi0JCXR3ZHItPnR3X2NvdW50LS07Ci0JZWxzZQorCXR3LT50d19raWxsID0gdGltZW8gPD0gNCpIWjsKKwlpZiAoIW1vZF90aW1lcl9waW5uZWQoJnR3LT50d190aW1lciwgamlmZmllcyArIHRpbWVvKSkgewogCQlhdG9taWNfaW5jKCZ0dy0+dHdfcmVmY250KTsKLQotCWlmIChzbG90ID49IElORVRfVFdEUl9SRUNZQ0xFX1NMT1RTKSB7Ci0JCS8qIFNjaGVkdWxlIHRvIHNsb3cgdGltZXIgKi8KLQkJaWYgKHRpbWVvID49IHRpbWV3YWl0X2xlbikgewotCQkJc2xvdCA9IElORVRfVFdEUl9UV0tJTExfU0xPVFMgLSAxOwotCQl9IGVsc2UgewotCQkJc2xvdCA9IERJVl9ST1VORF9VUCh0aW1lbywgdHdkci0+cGVyaW9kKTsKLQkJCWlmIChzbG90ID49IElORVRfVFdEUl9UV0tJTExfU0xPVFMpCi0JCQkJc2xvdCA9IElORVRfVFdEUl9UV0tJTExfU0xPVFMgLSAxOwotCQl9Ci0JCXR3LT50d190dGQgPSBpbmV0X3R3X3RpbWVfc3RhbXAoKSArIHRpbWVvOwotCQlzbG90ID0gKHR3ZHItPnNsb3QgKyBzbG90KSAmIChJTkVUX1RXRFJfVFdLSUxMX1NMT1RTIC0gMSk7Ci0JCWxpc3QgPSAmdHdkci0+Y2VsbHNbc2xvdF07Ci0JfSBlbHNlIHsKLQkJdHctPnR3X3R0ZCA9IGluZXRfdHdfdGltZV9zdGFtcCgpICsgKHNsb3QgPDwgSU5FVF9UV0RSX1JFQ1lDTEVfVElDSyk7Ci0KLQkJaWYgKHR3ZHItPnR3Y2FsX2hhbmQgPCAwKSB7Ci0JCQl0d2RyLT50d2NhbF9oYW5kID0gMDsKLQkJCXR3ZHItPnR3Y2FsX2ppZmZpZSA9IGppZmZpZXM7Ci0JCQl0d2RyLT50d2NhbF90aW1lci5leHBpcmVzID0gdHdkci0+dHdjYWxfamlmZmllICsKLQkJCQkJICAgICAgKHNsb3QgPDwgSU5FVF9UV0RSX1JFQ1lDTEVfVElDSyk7Ci0JCQlhZGRfdGltZXIoJnR3ZHItPnR3Y2FsX3RpbWVyKTsKLQkJfSBlbHNlIHsKLQkJCWlmICh0aW1lX2FmdGVyKHR3ZHItPnR3Y2FsX3RpbWVyLmV4cGlyZXMsCi0JCQkJICAgICAgIGppZmZpZXMgKyAoc2xvdCA8PCBJTkVUX1RXRFJfUkVDWUNMRV9USUNLKSkpCi0JCQkJbW9kX3RpbWVyKCZ0d2RyLT50d2NhbF90aW1lciwKLQkJCQkJICBqaWZmaWVzICsgKHNsb3QgPDwgSU5FVF9UV0RSX1JFQ1lDTEVfVElDSykpOwotCQkJc2xvdCA9ICh0d2RyLT50d2NhbF9oYW5kICsgc2xvdCkgJiAoSU5FVF9UV0RSX1JFQ1lDTEVfU0xPVFMgLSAxKTsKLQkJfQotCQlsaXN0ID0gJnR3ZHItPnR3Y2FsX3Jvd1tzbG90XTsKKwkJYXRvbWljX2luYygmdHctPnR3X2RyLT50d19jb3VudCk7CiAJfQotCi0JaGxpc3RfYWRkX2hlYWQoJnR3LT50d19kZWF0aF9ub2RlLCBsaXN0KTsKLQotCWlmICh0d2RyLT50d19jb3VudCsrID09IDApCi0JCW1vZF90aW1lcigmdHdkci0+dHdfdGltZXIsIGppZmZpZXMgKyB0d2RyLT5wZXJpb2QpOwotCXNwaW5fdW5sb2NrKCZ0d2RyLT5kZWF0aF9sb2NrKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXRfdHdza19zY2hlZHVsZSk7CiAKLXZvaWQgaW5ldF90d2RyX3R3Y2FsX3RpY2sodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyAqdHdkcjsKLQlpbnQgbiwgc2xvdDsKLQl1bnNpZ25lZCBsb25nIGo7Ci0JdW5zaWduZWQgbG9uZyBub3cgPSBqaWZmaWVzOwotCWludCBraWxsZWQgPSAwOwotCWludCBhZHYgPSAwOwotCi0JdHdkciA9IChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgKilkYXRhOwotCi0Jc3Bpbl9sb2NrKCZ0d2RyLT5kZWF0aF9sb2NrKTsKLQlpZiAodHdkci0+dHdjYWxfaGFuZCA8IDApCi0JCWdvdG8gb3V0OwotCi0Jc2xvdCA9IHR3ZHItPnR3Y2FsX2hhbmQ7Ci0JaiA9IHR3ZHItPnR3Y2FsX2ppZmZpZTsKLQotCWZvciAobiA9IDA7IG4gPCBJTkVUX1RXRFJfUkVDWUNMRV9TTE9UUzsgbisrKSB7Ci0JCWlmICh0aW1lX2JlZm9yZV9lcShqLCBub3cpKSB7Ci0JCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqc2FmZTsKLQkJCXN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3OwotCi0JCQlpbmV0X3R3c2tfZm9yX2VhY2hfaW5tYXRlX3NhZmUodHcsIHNhZmUsCi0JCQkJCQkgICAgICAgJnR3ZHItPnR3Y2FsX3Jvd1tzbG90XSkgewotCQkJCV9faW5ldF90d3NrX2RlbF9kZWFkX25vZGUodHcpOwotCQkJCV9faW5ldF90d3NrX2tpbGwodHcsIHR3ZHItPmhhc2hpbmZvKTsKLSNpZmRlZiBDT05GSUdfTkVUX05TCi0JCQkJTkVUX0lOQ19TVEFUU19CSCh0d3NrX25ldCh0dyksIExJTlVYX01JQl9USU1FV0FJVEtJTExFRCk7Ci0jZW5kaWYKLQkJCQlpbmV0X3R3c2tfcHV0KHR3KTsKLQkJCQlraWxsZWQrKzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICghYWR2KSB7Ci0JCQkJYWR2ID0gMTsKLQkJCQl0d2RyLT50d2NhbF9qaWZmaWUgPSBqOwotCQkJCXR3ZHItPnR3Y2FsX2hhbmQgPSBzbG90OwotCQkJfQotCi0JCQlpZiAoIWhsaXN0X2VtcHR5KCZ0d2RyLT50d2NhbF9yb3dbc2xvdF0pKSB7Ci0JCQkJbW9kX3RpbWVyKCZ0d2RyLT50d2NhbF90aW1lciwgaik7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCX0KLQkJaiArPSAxIDw8IElORVRfVFdEUl9SRUNZQ0xFX1RJQ0s7Ci0JCXNsb3QgPSAoc2xvdCArIDEpICYgKElORVRfVFdEUl9SRUNZQ0xFX1NMT1RTIC0gMSk7Ci0JfQotCXR3ZHItPnR3Y2FsX2hhbmQgPSAtMTsKLQotb3V0OgotCWlmICgodHdkci0+dHdfY291bnQgLT0ga2lsbGVkKSA9PSAwKQotCQlkZWxfdGltZXIoJnR3ZHItPnR3X3RpbWVyKTsKLSNpZm5kZWYgQ09ORklHX05FVF9OUwotCU5FVF9BRERfU1RBVFNfQkgoJmluaXRfbmV0LCBMSU5VWF9NSUJfVElNRVdBSVRLSUxMRUQsIGtpbGxlZCk7Ci0jZW5kaWYKLQlzcGluX3VubG9jaygmdHdkci0+ZGVhdGhfbG9jayk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpbmV0X3R3ZHJfdHdjYWxfdGljayk7Ci0KIHZvaWQgaW5ldF90d3NrX3B1cmdlKHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbywKIAkJICAgICBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9kZWF0aF9yb3cgKnR3ZHIsIGludCBmYW1pbHkpCiB7CkBAIC00ODcsNiArMjg5LDcgQEAKIAlmb3IgKHNsb3QgPSAwOyBzbG90IDw9IGhhc2hpbmZvLT5laGFzaF9tYXNrOyBzbG90KyspIHsKIAkJc3RydWN0IGluZXRfZWhhc2hfYnVja2V0ICpoZWFkID0gJmhhc2hpbmZvLT5laGFzaFtzbG90XTsKIHJlc3RhcnRfcmN1OgorCQljb25kX3Jlc2NoZWQoKTsKIAkJcmN1X3JlYWRfbG9jaygpOwogcmVzdGFydDoKIAkJc2tfbnVsbHNfZm9yX2VhY2hfcmN1KHNrLCBub2RlLCAmaGVhZC0+Y2hhaW4pIHsKQEAgLTUwOCw3ICszMTEsNyBAQAogCiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQkJCWluZXRfdHdza19kZXNjaGVkdWxlKHR3LCB0d2RyKTsKKwkJCWluZXRfdHdza19kZXNjaGVkdWxlKHR3KTsKIAkJCWxvY2FsX2JoX2VuYWJsZSgpOwogCQkJaW5ldF90d3NrX3B1dCh0dyk7CiAJCQlnb3RvIHJlc3RhcnRfcmN1OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZm9yd2FyZC5jIGIvbmV0L2lwdjQvaXBfZm9yd2FyZC5jCmluZGV4IDc4N2IzYzIuLjkzOTk5MmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2ZvcndhcmQuYworKysgYi9uZXQvaXB2NC9pcF9mb3J3YXJkLmMKQEAgLTU3LDcgKzU3LDcgQEAKIH0KIAogCi1zdGF0aWMgaW50IGlwX2ZvcndhcmRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IGlwX2ZvcndhcmRfZmluaXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaXBfb3B0aW9ucyAqb3B0CT0gJihJUENCKHNrYiktPm9wdCk7CiAKQEAgLTY3LDcgKzY3LDggQEAKIAlpZiAodW5saWtlbHkob3B0LT5vcHRsZW4pKQogCQlpcF9mb3J3YXJkX29wdGlvbnMoc2tiKTsKIAotCXJldHVybiBkc3Rfb3V0cHV0KHNrYik7CisJc2tiX3NlbmRlcl9jcHVfY2xlYXIoc2tiKTsKKwlyZXR1cm4gZHN0X291dHB1dF9zayhzaywgc2tiKTsKIH0KIAogaW50IGlwX2ZvcndhcmQoc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTEzNSw4ICsxMzYsOCBAQAogCiAJc2tiLT5wcmlvcml0eSA9IHJ0X3RvczJwcmlvcml0eShpcGgtPnRvcyk7CiAKLQlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0lQVjQsIE5GX0lORVRfRk9SV0FSRCwgc2tiLCBza2ItPmRldiwKLQkJICAgICAgIHJ0LT5kc3QuZGV2LCBpcF9mb3J3YXJkX2ZpbmlzaCk7CisJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19JUFY0LCBORl9JTkVUX0ZPUldBUkQsIE5VTEwsIHNrYiwKKwkJICAgICAgIHNrYi0+ZGV2LCBydC0+ZHN0LmRldiwgaXBfZm9yd2FyZF9maW5pc2gpOwogCiBzcl9mYWlsZWQ6CiAJLyoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMgYi9uZXQvaXB2NC9pcF9mcmFnbWVudC5jCmluZGV4IDE0NWE1MGMuLmNjMWRhNmQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2ZyYWdtZW50LmMKKysrIGIvbmV0L2lwdjQvaXBfZnJhZ21lbnQuYwpAQCAtMzcyLDcgKzM3Miw3IEBACiAJCWdvdG8gZXJyOwogCiAJZXJyID0gLUVOT01FTTsKLQlpZiAocHNrYl9wdWxsKHNrYiwgaWhsKSA9PSBOVUxMKQorCWlmICghcHNrYl9wdWxsKHNrYiwgaWhsKSkKIAkJZ290byBlcnI7CiAKIAllcnIgPSBwc2tiX3RyaW1fcmNzdW0oc2tiLCBlbmQgLSBvZmZzZXQpOwpAQCAtNTM3LDcgKzUzNyw3IEBACiAJCXFwLT5xLmZyYWdtZW50cyA9IGhlYWQ7CiAJfQogCi0JV0FSTl9PTihoZWFkID09IE5VTEwpOworCVdBUk5fT04oIWhlYWQpOwogCVdBUk5fT04oRlJBR19DQihoZWFkKS0+b2Zmc2V0ICE9IDApOwogCiAJLyogQWxsb2NhdGUgYSBuZXcgYnVmZmVyIGZvciB0aGUgZGF0YWdyYW0uICovCkBAIC01NTksNyArNTU5LDggQEAKIAkJc3RydWN0IHNrX2J1ZmYgKmNsb25lOwogCQlpbnQgaSwgcGxlbiA9IDA7CiAKLQkJaWYgKChjbG9uZSA9IGFsbG9jX3NrYigwLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwkJY2xvbmUgPSBhbGxvY19za2IoMCwgR0ZQX0FUT01JQyk7CisJCWlmICghY2xvbmUpCiAJCQlnb3RvIG91dF9ub21lbTsKIAkJY2xvbmUtPm5leHQgPSBoZWFkLT5uZXh0OwogCQloZWFkLT5uZXh0ID0gY2xvbmU7CkBAIC02MzgsNyArNjM5LDggQEAKIAlJUF9JTkNfU1RBVFNfQkgobmV0LCBJUFNUQVRTX01JQl9SRUFTTVJFUURTKTsKIAogCS8qIExvb2t1cCAob3IgY3JlYXRlKSBxdWV1ZSBoZWFkZXIgKi8KLQlpZiAoKHFwID0gaXBfZmluZChuZXQsIGlwX2hkcihza2IpLCB1c2VyKSkgIT0gTlVMTCkgeworCXFwID0gaXBfZmluZChuZXQsIGlwX2hkcihza2IpLCB1c2VyKTsKKwlpZiAocXApIHsKIAkJaW50IHJldDsKIAogCQlzcGluX2xvY2soJnFwLT5xLmxvY2spOwpAQCAtNzU0LDcgKzc1Niw3IEBACiAJdGFibGUgPSBpcDRfZnJhZ3NfbnNfY3RsX3RhYmxlOwogCWlmICghbmV0X2VxKG5ldCwgJmluaXRfbmV0KSkgewogCQl0YWJsZSA9IGttZW1kdXAodGFibGUsIHNpemVvZihpcDRfZnJhZ3NfbnNfY3RsX3RhYmxlKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICh0YWJsZSA9PSBOVUxMKQorCQlpZiAoIXRhYmxlKQogCQkJZ290byBlcnJfYWxsb2M7CiAKIAkJdGFibGVbMF0uZGF0YSA9ICZuZXQtPmlwdjQuZnJhZ3MuaGlnaF90aHJlc2g7CkBAIC03NzAsNyArNzcyLDcgQEAKIAl9CiAKIAloZHIgPSByZWdpc3Rlcl9uZXRfc3lzY3RsKG5ldCwgIm5ldC9pcHY0IiwgdGFibGUpOwotCWlmIChoZHIgPT0gTlVMTCkKKwlpZiAoIWhkcikKIAkJZ290byBlcnJfcmVnOwogCiAJbmV0LT5pcHY0LmZyYWdzX2hkciA9IGhkcjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX2dyZS5jIGIvbmV0L2lwdjQvaXBfZ3JlLmMKaW5kZXggNjIwNzI3NWYuLjVmZDcwNjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2dyZS5jCisrKyBiL25ldC9pcHY0L2lwX2dyZS5jCkBAIC0xODIsNyArMTgyLDcgQEAKIAl0ID0gaXBfdHVubmVsX2xvb2t1cChpdG4sIHNrYi0+ZGV2LT5pZmluZGV4LCB0cGktPmZsYWdzLAogCQkJICAgICBpcGgtPmRhZGRyLCBpcGgtPnNhZGRyLCB0cGktPmtleSk7CiAKLQlpZiAodCA9PSBOVUxMKQorCWlmICghdCkKIAkJcmV0dXJuIFBBQ0tFVF9SRUpFQ1Q7CiAKIAlpZiAodC0+cGFybXMuaXBoLmRhZGRyID09IDAgfHwKQEAgLTQyMyw3ICs0MjMsNyBAQAogCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCQlkZXYgPSBydC0+ZHN0LmRldjsKIAkJaXBfcnRfcHV0KHJ0KTsKLQkJaWYgKF9faW5fZGV2X2dldF9ydG5sKGRldikgPT0gTlVMTCkKKwkJaWYgKCFfX2luX2Rldl9nZXRfcnRubChkZXYpKQogCQkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCQl0LT5tbGluayA9IGRldi0+aWZpbmRleDsKIAkJaXBfbWNfaW5jX2dyb3VwKF9faW5fZGV2X2dldF9ydG5sKGRldiksIHQtPnBhcm1zLmlwaC5kYWRkcik7CkBAIC00NTYsNiArNDU2LDcgQEAKIAkubmRvX2RvX2lvY3RsCQk9IGlwZ3JlX3R1bm5lbF9pb2N0bCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gaXBfdHVubmVsX2NoYW5nZV9tdHUsCiAJLm5kb19nZXRfc3RhdHM2NAk9IGlwX3R1bm5lbF9nZXRfc3RhdHM2NCwKKwkubmRvX2dldF9pZmxpbmsJCT0gaXBfdHVubmVsX2dldF9pZmxpbmssCiB9OwogCiAjZGVmaW5lIEdSRV9GRUFUVVJFUyAoTkVUSUZfRl9TRyB8CQlcCkBAIC02MjEsMTAgKzYyMiwxMCBAQAogCQlwYXJtcy0+b19rZXkgPSBubGFfZ2V0X2JlMzIoZGF0YVtJRkxBX0dSRV9PS0VZXSk7CiAKIAlpZiAoZGF0YVtJRkxBX0dSRV9MT0NBTF0pCi0JCXBhcm1zLT5pcGguc2FkZHIgPSBubGFfZ2V0X2JlMzIoZGF0YVtJRkxBX0dSRV9MT0NBTF0pOworCQlwYXJtcy0+aXBoLnNhZGRyID0gbmxhX2dldF9pbl9hZGRyKGRhdGFbSUZMQV9HUkVfTE9DQUxdKTsKIAogCWlmIChkYXRhW0lGTEFfR1JFX1JFTU9URV0pCi0JCXBhcm1zLT5pcGguZGFkZHIgPSBubGFfZ2V0X2JlMzIoZGF0YVtJRkxBX0dSRV9SRU1PVEVdKTsKKwkJcGFybXMtPmlwaC5kYWRkciA9IG5sYV9nZXRfaW5fYWRkcihkYXRhW0lGTEFfR1JFX1JFTU9URV0pOwogCiAJaWYgKGRhdGFbSUZMQV9HUkVfVFRMXSkKIAkJcGFybXMtPmlwaC50dGwgPSBubGFfZ2V0X3U4KGRhdGFbSUZMQV9HUkVfVFRMXSk7CkBAIC02ODYsNiArNjg3LDcgQEAKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKIAkubmRvX2NoYW5nZV9tdHUJCT0gaXBfdHVubmVsX2NoYW5nZV9tdHUsCiAJLm5kb19nZXRfc3RhdHM2NAk9IGlwX3R1bm5lbF9nZXRfc3RhdHM2NCwKKwkubmRvX2dldF9pZmxpbmsJCT0gaXBfdHVubmVsX2dldF9pZmxpbmssCiB9OwogCiBzdGF0aWMgdm9pZCBpcGdyZV90YXBfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTc3Niw4ICs3NzgsOCBAQAogCSAgICBubGFfcHV0X2JlMTYoc2tiLCBJRkxBX0dSRV9PRkxBR1MsIHRubF9mbGFnc190b19ncmVfZmxhZ3MocC0+b19mbGFncykpIHx8CiAJICAgIG5sYV9wdXRfYmUzMihza2IsIElGTEFfR1JFX0lLRVksIHAtPmlfa2V5KSB8fAogCSAgICBubGFfcHV0X2JlMzIoc2tiLCBJRkxBX0dSRV9PS0VZLCBwLT5vX2tleSkgfHwKLQkgICAgbmxhX3B1dF9iZTMyKHNrYiwgSUZMQV9HUkVfTE9DQUwsIHAtPmlwaC5zYWRkcikgfHwKLQkgICAgbmxhX3B1dF9iZTMyKHNrYiwgSUZMQV9HUkVfUkVNT1RFLCBwLT5pcGguZGFkZHIpIHx8CisJICAgIG5sYV9wdXRfaW5fYWRkcihza2IsIElGTEFfR1JFX0xPQ0FMLCBwLT5pcGguc2FkZHIpIHx8CisJICAgIG5sYV9wdXRfaW5fYWRkcihza2IsIElGTEFfR1JFX1JFTU9URSwgcC0+aXBoLmRhZGRyKSB8fAogCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9HUkVfVFRMLCBwLT5pcGgudHRsKSB8fAogCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9HUkVfVE9TLCBwLT5pcGgudG9zKSB8fAogCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9HUkVfUE1UVURJU0MsCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9pbnB1dC5jIGIvbmV0L2lwdjQvaXBfaW5wdXQuYwppbmRleCAzZDRkYTJjLi4yZGI0Yzg3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L2lwX2lucHV0LmMKQEAgLTE4Nyw3ICsxODcsNyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGludCBpcF9sb2NhbF9kZWxpdmVyX2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBpcF9sb2NhbF9kZWxpdmVyX2ZpbmlzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChza2ItPmRldik7CiAKQEAgLTIwMyw3ICsyMDMsNyBAQAogCQlyYXcgPSByYXdfbG9jYWxfZGVsaXZlcihza2IsIHByb3RvY29sKTsKIAogCQlpcHByb3QgPSByY3VfZGVyZWZlcmVuY2UoaW5ldF9wcm90b3NbcHJvdG9jb2xdKTsKLQkJaWYgKGlwcHJvdCAhPSBOVUxMKSB7CisJCWlmIChpcHByb3QpIHsKIAkJCWludCByZXQ7CiAKIAkJCWlmICghaXBwcm90LT5ub19wb2xpY3kpIHsKQEAgLTI1Myw3ICsyNTMsOCBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JcmV0dXJuIE5GX0hPT0soTkZQUk9UT19JUFY0LCBORl9JTkVUX0xPQ0FMX0lOLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCXJldHVybiBORl9IT09LKE5GUFJPVE9fSVBWNCwgTkZfSU5FVF9MT0NBTF9JTiwgTlVMTCwgc2tiLAorCQkgICAgICAgc2tiLT5kZXYsIE5VTEwsCiAJCSAgICAgICBpcF9sb2NhbF9kZWxpdmVyX2ZpbmlzaCk7CiB9CiAKQEAgLTMwOSwxMiArMzEwLDEyIEBACiBpbnQgc3lzY3RsX2lwX2Vhcmx5X2RlbXV4IF9fcmVhZF9tb3N0bHkgPSAxOwogRVhQT1JUX1NZTUJPTChzeXNjdGxfaXBfZWFybHlfZGVtdXgpOwogCi1zdGF0aWMgaW50IGlwX3Jjdl9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgaXBfcmN2X2ZpbmlzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKIAotCWlmIChzeXNjdGxfaXBfZWFybHlfZGVtdXggJiYgIXNrYl9kc3Qoc2tiKSAmJiBza2ItPnNrID09IE5VTEwpIHsKKwlpZiAoc3lzY3RsX2lwX2Vhcmx5X2RlbXV4ICYmICFza2JfZHN0KHNrYikgJiYgIXNrYi0+c2spIHsKIAkJY29uc3Qgc3RydWN0IG5ldF9wcm90b2NvbCAqaXBwcm90OwogCQlpbnQgcHJvdG9jb2wgPSBpcGgtPnByb3RvY29sOwogCkBAIC0zODcsNyArMzg4LDggQEAKIAogCUlQX1VQRF9QT19TVEFUU19CSChkZXZfbmV0KGRldiksIElQU1RBVFNfTUlCX0lOLCBza2ItPmxlbik7CiAKLQlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpIHsKIAkJSVBfSU5DX1NUQVRTX0JIKGRldl9uZXQoZGV2KSwgSVBTVEFUU19NSUJfSU5ESVNDQVJEUyk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQ1MCw3ICs0NTIsOCBAQAogCS8qIE11c3QgZHJvcCBzb2NrZXQgbm93IGJlY2F1c2Ugb2YgdHByb3h5LiAqLwogCXNrYl9vcnBoYW4oc2tiKTsKIAotCXJldHVybiBORl9IT09LKE5GUFJPVE9fSVBWNCwgTkZfSU5FVF9QUkVfUk9VVElORywgc2tiLCBkZXYsIE5VTEwsCisJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19JUFY0LCBORl9JTkVUX1BSRV9ST1VUSU5HLCBOVUxMLCBza2IsCisJCSAgICAgICBkZXYsIE5VTEwsCiAJCSAgICAgICBpcF9yY3ZfZmluaXNoKTsKIAogY3N1bV9lcnJvcjoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX29wdGlvbnMuYyBiL25ldC9pcHY0L2lwX29wdGlvbnMuYwppbmRleCA1YjNkOTFiLi5iZDI0Njc5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vcHRpb25zLmMKKysrIGIvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCkBAIC0yNjQsNyArMjY0LDcgQEAKIAl1bnNpZ25lZCBjaGFyICppcGg7CiAJaW50IG9wdGxlbiwgbDsKIAotCWlmIChza2IgIT0gTlVMTCkgeworCWlmIChza2IpIHsKIAkJcnQgPSBza2JfcnRhYmxlKHNrYik7CiAJCW9wdHB0ciA9ICh1bnNpZ25lZCBjaGFyICopJihpcF9oZHIoc2tiKVsxXSk7CiAJfSBlbHNlCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9vdXRwdXQuYyBiL25ldC9pcHY0L2lwX291dHB1dC5jCmluZGV4IGE3YWVhMjAuLmM2NWI5M2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L2lwX291dHB1dC5jCkBAIC05MSwxNCArOTEsMTkgQEAKIH0KIEVYUE9SVF9TWU1CT0woaXBfc2VuZF9jaGVjayk7CiAKLWludCBfX2lwX2xvY2FsX291dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IF9faXBfbG9jYWxfb3V0X3NrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOwogCWlwX3NlbmRfY2hlY2soaXBoKTsKLQlyZXR1cm4gbmZfaG9vayhORlBST1RPX0lQVjQsIE5GX0lORVRfTE9DQUxfT1VULCBza2IsIE5VTEwsCi0JCSAgICAgICBza2JfZHN0KHNrYiktPmRldiwgZHN0X291dHB1dCk7CisJcmV0dXJuIG5mX2hvb2soTkZQUk9UT19JUFY0LCBORl9JTkVUX0xPQ0FMX09VVCwgc2ssIHNrYiwgTlVMTCwKKwkJICAgICAgIHNrYl9kc3Qoc2tiKS0+ZGV2LCBkc3Rfb3V0cHV0X3NrKTsKK30KKworaW50IF9faXBfbG9jYWxfb3V0KHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIF9faXBfbG9jYWxfb3V0X3NrKHNrYi0+c2ssIHNrYik7CiB9CiAKIGludCBpcF9sb2NhbF9vdXRfc2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTQ4LDcgKzE1Myw3IEBACiAJaXBoLT5kYWRkciAgICA9IChvcHQgJiYgb3B0LT5vcHQuc3JyID8gb3B0LT5vcHQuZmFkZHIgOiBkYWRkcik7CiAJaXBoLT5zYWRkciAgICA9IHNhZGRyOwogCWlwaC0+cHJvdG9jb2wgPSBzay0+c2tfcHJvdG9jb2w7Ci0JaXBfc2VsZWN0X2lkZW50KHNrYiwgc2spOworCWlwX3NlbGVjdF9pZGVudChzb2NrX25ldChzayksIHNrYiwgc2spOwogCiAJaWYgKG9wdCAmJiBvcHQtPm9wdC5vcHRsZW4pIHsKIAkJaXBoLT5paGwgKz0gb3B0LT5vcHQub3B0bGVuPj4yOwpAQCAtMTYzLDcgKzE2OCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpcF9idWlsZF9hbmRfc2VuZF9wa3QpOwogCi1zdGF0aWMgaW5saW5lIGludCBpcF9maW5pc2hfb3V0cHV0MihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGlubGluZSBpbnQgaXBfZmluaXNoX291dHB1dDIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKIAlzdHJ1Y3QgcnRhYmxlICpydCA9IChzdHJ1Y3QgcnRhYmxlICopZHN0OwpAQCAtMTgyLDcgKzE4Nyw3IEBACiAJCXN0cnVjdCBza19idWZmICpza2IyOwogCiAJCXNrYjIgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOwotCQlpZiAoc2tiMiA9PSBOVUxMKSB7CisJCWlmICghc2tiMikgewogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQpAQCAtMjExLDcgKzIxNiw3IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgaXBfZmluaXNoX291dHB1dF9nc28oc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgaXBfZmluaXNoX291dHB1dF9nc28oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzOwogCXN0cnVjdCBza19idWZmICpzZWdzOwpAQCAtMjIwLDcgKzIyNSw3IEBACiAJLyogY29tbW9uIGNhc2U6IGxvY2FsbHkgY3JlYXRlZCBza2Igb3Igc2VnbGVuIGlzIDw9IG10dSAqLwogCWlmICgoKElQQ0Ioc2tiKS0+ZmxhZ3MgJiBJUFNLQl9GT1JXQVJERUQpID09IDApIHx8CiAJICAgICAgc2tiX2dzb19uZXR3b3JrX3NlZ2xlbihza2IpIDw9IGlwX3NrYl9kc3RfbXR1KHNrYikpCi0JCXJldHVybiBpcF9maW5pc2hfb3V0cHV0Mihza2IpOworCQlyZXR1cm4gaXBfZmluaXNoX291dHB1dDIoc2ssIHNrYik7CiAKIAkvKiBTbG93cGF0aCAtICBHU08gc2VnbWVudCBsZW5ndGggaXMgZXhjZWVkaW5nIHRoZSBkc3QgTVRVLgogCSAqCkBAIC0yNDMsNyArMjQ4LDcgQEAKIAkJaW50IGVycjsKIAogCQlzZWdzLT5uZXh0ID0gTlVMTDsKLQkJZXJyID0gaXBfZnJhZ21lbnQoc2VncywgaXBfZmluaXNoX291dHB1dDIpOworCQllcnIgPSBpcF9mcmFnbWVudChzaywgc2VncywgaXBfZmluaXNoX291dHB1dDIpOwogCiAJCWlmIChlcnIgJiYgcmV0ID09IDApCiAJCQlyZXQgPSBlcnI7CkBAIC0yNTMsMjIgKzI1OCwyMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaXBfZmluaXNoX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBpcF9maW5pc2hfb3V0cHV0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKICNpZiBkZWZpbmVkKENPTkZJR19ORVRGSUxURVIpICYmIGRlZmluZWQoQ09ORklHX1hGUk0pCiAJLyogUG9saWN5IGxvb2t1cCBhZnRlciBTTkFUIHlpZWxkZWQgYSBuZXcgcG9saWN5ICovCi0JaWYgKHNrYl9kc3Qoc2tiKS0+eGZybSAhPSBOVUxMKSB7CisJaWYgKHNrYl9kc3Qoc2tiKS0+eGZybSkgewogCQlJUENCKHNrYiktPmZsYWdzIHw9IElQU0tCX1JFUk9VVEVEOwotCQlyZXR1cm4gZHN0X291dHB1dChza2IpOworCQlyZXR1cm4gZHN0X291dHB1dF9zayhzaywgc2tiKTsKIAl9CiAjZW5kaWYKIAlpZiAoc2tiX2lzX2dzbyhza2IpKQotCQlyZXR1cm4gaXBfZmluaXNoX291dHB1dF9nc28oc2tiKTsKKwkJcmV0dXJuIGlwX2ZpbmlzaF9vdXRwdXRfZ3NvKHNrLCBza2IpOwogCiAJaWYgKHNrYi0+bGVuID4gaXBfc2tiX2RzdF9tdHUoc2tiKSkKLQkJcmV0dXJuIGlwX2ZyYWdtZW50KHNrYiwgaXBfZmluaXNoX291dHB1dDIpOworCQlyZXR1cm4gaXBfZnJhZ21lbnQoc2ssIHNrYiwgaXBfZmluaXNoX291dHB1dDIpOwogCi0JcmV0dXJuIGlwX2ZpbmlzaF9vdXRwdXQyKHNrYik7CisJcmV0dXJuIGlwX2ZpbmlzaF9vdXRwdXQyKHNrLCBza2IpOwogfQogCiBpbnQgaXBfbWNfb3V0cHV0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTMwNyw3ICszMTIsNyBAQAogCQkJc3RydWN0IHNrX2J1ZmYgKm5ld3NrYiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpOwogCQkJaWYgKG5ld3NrYikKIAkJCQlORl9IT09LKE5GUFJPVE9fSVBWNCwgTkZfSU5FVF9QT1NUX1JPVVRJTkcsCi0JCQkJCW5ld3NrYiwgTlVMTCwgbmV3c2tiLT5kZXYsCisJCQkJCXNrLCBuZXdza2IsIE5VTEwsIG5ld3NrYi0+ZGV2LAogCQkJCQlkZXZfbG9vcGJhY2tfeG1pdCk7CiAJCX0KIApAQCAtMzIyLDExICszMjcsMTEgQEAKIAlpZiAocnQtPnJ0X2ZsYWdzJlJUQ0ZfQlJPQURDQVNUKSB7CiAJCXN0cnVjdCBza19idWZmICpuZXdza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKG5ld3NrYikKLQkJCU5GX0hPT0soTkZQUk9UT19JUFY0LCBORl9JTkVUX1BPU1RfUk9VVElORywgbmV3c2tiLAorCQkJTkZfSE9PSyhORlBST1RPX0lQVjQsIE5GX0lORVRfUE9TVF9ST1VUSU5HLCBzaywgbmV3c2tiLAogCQkJCU5VTEwsIG5ld3NrYi0+ZGV2LCBkZXZfbG9vcGJhY2tfeG1pdCk7CiAJfQogCi0JcmV0dXJuIE5GX0hPT0tfQ09ORChORlBST1RPX0lQVjQsIE5GX0lORVRfUE9TVF9ST1VUSU5HLCBza2IsIE5VTEwsCisJcmV0dXJuIE5GX0hPT0tfQ09ORChORlBST1RPX0lQVjQsIE5GX0lORVRfUE9TVF9ST1VUSU5HLCBzaywgc2tiLCBOVUxMLAogCQkJICAgIHNrYi0+ZGV2LCBpcF9maW5pc2hfb3V0cHV0LAogCQkJICAgICEoSVBDQihza2IpLT5mbGFncyAmIElQU0tCX1JFUk9VVEVEKSk7CiB9CkBAIC0zNDAsNyArMzQ1LDggQEAKIAlza2ItPmRldiA9IGRldjsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVApOwogCi0JcmV0dXJuIE5GX0hPT0tfQ09ORChORlBST1RPX0lQVjQsIE5GX0lORVRfUE9TVF9ST1VUSU5HLCBza2IsIE5VTEwsIGRldiwKKwlyZXR1cm4gTkZfSE9PS19DT05EKE5GUFJPVE9fSVBWNCwgTkZfSU5FVF9QT1NUX1JPVVRJTkcsIHNrLCBza2IsCisJCQkgICAgTlVMTCwgZGV2LAogCQkJICAgIGlwX2ZpbmlzaF9vdXRwdXQsCiAJCQkgICAgIShJUENCKHNrYiktPmZsYWdzICYgSVBTS0JfUkVST1VURUQpKTsKIH0KQEAgLTM3NiwxMiArMzgyLDEyIEBACiAJaW5ldF9vcHQgPSByY3VfZGVyZWZlcmVuY2UoaW5ldC0+aW5ldF9vcHQpOwogCWZsNCA9ICZmbC0+dS5pcDQ7CiAJcnQgPSBza2JfcnRhYmxlKHNrYik7Ci0JaWYgKHJ0ICE9IE5VTEwpCisJaWYgKHJ0KQogCQlnb3RvIHBhY2tldF9yb3V0ZWQ7CiAKIAkvKiBNYWtlIHN1cmUgd2UgY2FuIHJvdXRlIHRoaXMgcGFja2V0LiAqLwogCXJ0ID0gKHN0cnVjdCBydGFibGUgKilfX3NrX2RzdF9jaGVjayhzaywgMCk7Ci0JaWYgKHJ0ID09IE5VTEwpIHsKKwlpZiAoIXJ0KSB7CiAJCV9fYmUzMiBkYWRkcjsKIAogCQkvKiBVc2UgY29ycmVjdCBkZXN0aW5hdGlvbiBhZGRyZXNzIGlmIHdlIGhhdmUgb3B0aW9ucy4gKi8KQEAgLTQzMCw3ICs0MzYsOCBAQAogCQlpcF9vcHRpb25zX2J1aWxkKHNrYiwgJmluZXRfb3B0LT5vcHQsIGluZXQtPmluZXRfZGFkZHIsIHJ0LCAwKTsKIAl9CiAKLQlpcF9zZWxlY3RfaWRlbnRfc2Vncyhza2IsIHNrLCBza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID86IDEpOworCWlwX3NlbGVjdF9pZGVudF9zZWdzKHNvY2tfbmV0KHNrKSwgc2tiLCBzaywKKwkJCSAgICAgc2tiX3NoaW5mbyhza2IpLT5nc29fc2VncyA/OiAxKTsKIAogCS8qIFRPRE8gOiBzaG91bGQgd2UgdXNlIHNrYi0+c2sgaGVyZSBpbnN0ZWFkIG9mIHNrID8gKi8KIAlza2ItPnByaW9yaXR5ID0gc2stPnNrX3ByaW9yaXR5OwpAQCAtNDQ4LDcgKzQ1NSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlwX3F1ZXVlX3htaXQpOwogCi0KIHN0YXRpYyB2b2lkIGlwX2NvcHlfbWV0YWRhdGEoc3RydWN0IHNrX2J1ZmYgKnRvLCBzdHJ1Y3Qgc2tfYnVmZiAqZnJvbSkKIHsKIAl0by0+cGt0X3R5cGUgPSBmcm9tLT5wa3RfdHlwZTsKQEAgLTQ3OSw3ICs0ODUsOCBAQAogICoJc2luZ2xlIGRldmljZSBmcmFtZSwgYW5kIHF1ZXVlIHN1Y2ggYSBmcmFtZSBmb3Igc2VuZGluZy4KICAqLwogCi1pbnQgaXBfZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICgqb3V0cHV0KShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK2ludCBpcF9mcmFnbWVudChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCisJCWludCAoKm91dHB1dCkoc3RydWN0IHNvY2sgKiwgc3RydWN0IHNrX2J1ZmYgKikpCiB7CiAJc3RydWN0IGlwaGRyICppcGg7CiAJaW50IHB0cjsKQEAgLTU4NiwxMyArNTkzLDEzIEBACiAJCQkJCWlwX29wdGlvbnNfZnJhZ21lbnQoZnJhZyk7CiAJCQkJb2Zmc2V0ICs9IHNrYi0+bGVuIC0gaGxlbjsKIAkJCQlpcGgtPmZyYWdfb2ZmID0gaHRvbnMob2Zmc2V0Pj4zKTsKLQkJCQlpZiAoZnJhZy0+bmV4dCAhPSBOVUxMKQorCQkJCWlmIChmcmFnLT5uZXh0KQogCQkJCQlpcGgtPmZyYWdfb2ZmIHw9IGh0b25zKElQX01GKTsKIAkJCQkvKiBSZWFkeSwgY29tcGxldGUgY2hlY2tzdW0gKi8KIAkJCQlpcF9zZW5kX2NoZWNrKGlwaCk7CiAJCQl9CiAKLQkJCWVyciA9IG91dHB1dChza2IpOworCQkJZXJyID0gb3V0cHV0KHNrLCBza2IpOwogCiAJCQlpZiAoIWVycikKIAkJCQlJUF9JTkNfU1RBVFMoZGV2X25ldChkZXYpLCBJUFNUQVRTX01JQl9GUkFHQ1JFQVRFUyk7CkBAIC02MzYsMTAgKzY0Myw3IEBACiAJbGVmdCA9IHNrYi0+bGVuIC0gaGxlbjsJCS8qIFNwYWNlIHBlciBmcmFtZSAqLwogCXB0ciA9IGhsZW47CQkvKiBXaGVyZSB0byBzdGFydCBmcm9tICovCiAKLQkvKiBmb3IgYnJpZGdlZCBJUCB0cmFmZmljIGVuY2Fwc3VsYXRlZCBpbnNpZGUgZi5lLiBhIHZsYW4gaGVhZGVyLAotCSAqIHdlIG5lZWQgdG8gbWFrZSByb29tIGZvciB0aGUgZW5jYXBzdWxhdGluZyBoZWFkZXIKLQkgKi8KLQlsbF9ycyA9IExMX1JFU0VSVkVEX1NQQUNFX0VYVFJBKHJ0LT5kc3QuZGV2LCBuZl9icmlkZ2VfcGFkKHNrYikpOworCWxsX3JzID0gTExfUkVTRVJWRURfU1BBQ0UocnQtPmRzdC5kZXYpOwogCiAJLyoKIAkgKglGcmFnbWVudCB0aGUgZGF0YWdyYW0uCkBAIC03MzIsNyArNzM2LDcgQEAKIAogCQlpcF9zZW5kX2NoZWNrKGlwaCk7CiAKLQkJZXJyID0gb3V0cHV0KHNrYjIpOworCQllcnIgPSBvdXRwdXQoc2ssIHNrYjIpOwogCQlpZiAoZXJyKQogCQkJZ290byBmYWlsOwogCkBAIC03OTIsMTIgKzc5NiwxMyBAQAogCSAqIGRldmljZSwgc28gY3JlYXRlIG9uZSBzaW5nbGUgc2tiIHBhY2tldCBjb250YWluaW5nIGNvbXBsZXRlCiAJICogdWRwIGRhdGFncmFtCiAJICovCi0JaWYgKChza2IgPSBza2JfcGVla190YWlsKHF1ZXVlKSkgPT0gTlVMTCkgeworCXNrYiA9IHNrYl9wZWVrX3RhaWwocXVldWUpOworCWlmICghc2tiKSB7CiAJCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCiAJCQloaF9sZW4gKyBmcmFnaGVhZGVybGVuICsgdHJhbnNoZHJsZW4gKyAyMCwKIAkJCShmbGFncyAmIE1TR19ET05UV0FJVCksICZlcnIpOwogCi0JCWlmIChza2IgPT0gTlVMTCkKKwkJaWYgKCFza2IpCiAJCQlyZXR1cm4gZXJyOwogCiAJCS8qIHJlc2VydmUgc3BhY2UgZm9yIEhhcmR3YXJlIGhlYWRlciAqLwpAQCAtODE0LDcgKzgxOSw2IEBACiAKIAkJc2tiLT5jc3VtID0gMDsKIAotCiAJCV9fc2tiX3F1ZXVlX3RhaWwocXVldWUsIHNrYik7CiAJfSBlbHNlIGlmIChza2JfaXNfZ3NvKHNrYikpIHsKIAkJZ290byBhcHBlbmQ7CkBAIC05NjMsMTAgKzk2NywxMCBAQAogCQkJCQlza2IgPSBzb2NrX3dtYWxsb2Moc2ssCiAJCQkJCQkJICAgYWxsb2NsZW4gKyBoaF9sZW4gKyAxNSwgMSwKIAkJCQkJCQkgICBzay0+c2tfYWxsb2NhdGlvbik7Ci0JCQkJaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkKKwkJCQlpZiAodW5saWtlbHkoIXNrYikpCiAJCQkJCWVyciA9IC1FTk9CVUZTOwogCQkJfQotCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJaWYgKCFza2IpCiAJCQkJZ290byBlcnJvcjsKIAogCQkJLyoKQEAgLTEwOTAsMTAgKzEwOTQsMTAgQEAKIAkgKi8KIAlvcHQgPSBpcGMtPm9wdDsKIAlpZiAob3B0KSB7Ci0JCWlmIChjb3JrLT5vcHQgPT0gTlVMTCkgeworCQlpZiAoIWNvcmstPm9wdCkgewogCQkJY29yay0+b3B0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGlwX29wdGlvbnMpICsgNDAsCiAJCQkJCSAgICBzay0+c2tfYWxsb2NhdGlvbik7Ci0JCQlpZiAodW5saWtlbHkoY29yay0+b3B0ID09IE5VTEwpKQorCQkJaWYgKHVubGlrZWx5KCFjb3JrLT5vcHQpKQogCQkJCXJldHVybiAtRU5PQlVGUzsKIAkJfQogCQltZW1jcHkoY29yay0+b3B0LCAmb3B0LT5vcHQsIHNpemVvZihzdHJ1Y3QgaXBfb3B0aW9ucykgKyBvcHQtPm9wdC5vcHRsZW4pOwpAQCAtMTIwMCw3ICsxMjA0LDggQEAKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAl9CiAKLQlpZiAoKHNrYiA9IHNrYl9wZWVrX3RhaWwoJnNrLT5za193cml0ZV9xdWV1ZSkpID09IE5VTEwpCisJc2tiID0gc2tiX3BlZWtfdGFpbCgmc2stPnNrX3dyaXRlX3F1ZXVlKTsKKwlpZiAoIXNrYikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljb3JrLT5sZW5ndGggKz0gc2l6ZTsKQEAgLTEyMTEsNyArMTIxNiw2IEBACiAJCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3R5cGUgPSBTS0JfR1NPX1VEUDsKIAl9CiAKLQogCXdoaWxlIChzaXplID4gMCkgewogCQlpbnQgaTsKIApAQCAtMTMzMSw3ICsxMzM1LDggQEAKIAlfX2JlMTYgZGYgPSAwOwogCV9fdTggdHRsOwogCi0JaWYgKChza2IgPSBfX3NrYl9kZXF1ZXVlKHF1ZXVlKSkgPT0gTlVMTCkKKwlza2IgPSBfX3NrYl9kZXF1ZXVlKHF1ZXVlKTsKKwlpZiAoIXNrYikKIAkJZ290byBvdXQ7CiAJdGFpbF9za2IgPSAmKHNrYl9zaGluZm8oc2tiKS0+ZnJhZ19saXN0KTsKIApAQCAtMTM4Miw3ICsxMzg3LDcgQEAKIAlpcGgtPnR0bCA9IHR0bDsKIAlpcGgtPnByb3RvY29sID0gc2stPnNrX3Byb3RvY29sOwogCWlwX2NvcHlfYWRkcnMoaXBoLCBmbDQpOwotCWlwX3NlbGVjdF9pZGVudChza2IsIHNrKTsKKwlpcF9zZWxlY3RfaWRlbnQobmV0LCBza2IsIHNrKTsKIAogCWlmIChvcHQpIHsKIAkJaXBoLT5paGwgKz0gb3B0LT5vcHRsZW4+PjI7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwppbmRleCA1Y2Q5OTI3Li43Y2ZiMDg5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCisrKyBiL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKQEAgLTM1MSw3ICszNTEsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0JaWYgKG5ld19yYSA9PSBOVUxMKSB7CisJaWYgKCFuZXdfcmEpIHsKIAkJc3Bpbl91bmxvY2tfYmgoJmlwX3JhX2xvY2spOwogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQpAQCAtMzg3LDcgKzM4Nyw3IEBACiAJCQkJICAgc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7CiAJc2Vyci0+cG9ydCA9IHBvcnQ7CiAKLQlpZiAoc2tiX3B1bGwoc2tiLCBwYXlsb2FkIC0gc2tiLT5kYXRhKSAhPSBOVUxMKSB7CisJaWYgKHNrYl9wdWxsKHNrYiwgcGF5bG9hZCAtIHNrYi0+ZGF0YSkpIHsKIAkJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKIAkJaWYgKHNvY2tfcXVldWVfZXJyX3NrYihzaywgc2tiKSA9PSAwKQogCQkJcmV0dXJuOwpAQCAtNDgyLDcgKzQ4Miw3IEBACiAKIAllcnIgPSAtRUFHQUlOOwogCXNrYiA9IHNvY2tfZGVxdWV1ZV9lcnJfc2tiKHNrKTsKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCWdvdG8gb3V0OwogCiAJY29waWVkID0gc2tiLT5sZW47CkBAIC01MzYsMTIgKzUzNiwzNCBAQAogICoJU29ja2V0IG9wdGlvbiBjb2RlIGZvciBJUC4gVGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBsaW5lIGFmdGVyIGFueQogICoJVENQLFVEUCBldGMgb3B0aW9ucyBvbiBhbiBJUCBzb2NrZXQuCiAgKi8KK3N0YXRpYyBib29sIHNldHNvY2tvcHRfbmVlZHNfcnRubChpbnQgb3B0bmFtZSkKK3sKKwlzd2l0Y2ggKG9wdG5hbWUpIHsKKwljYXNlIElQX0FERF9NRU1CRVJTSElQOgorCWNhc2UgSVBfQUREX1NPVVJDRV9NRU1CRVJTSElQOgorCWNhc2UgSVBfQkxPQ0tfU09VUkNFOgorCWNhc2UgSVBfRFJPUF9NRU1CRVJTSElQOgorCWNhc2UgSVBfRFJPUF9TT1VSQ0VfTUVNQkVSU0hJUDoKKwljYXNlIElQX01TRklMVEVSOgorCWNhc2UgSVBfVU5CTE9DS19TT1VSQ0U6CisJY2FzZSBNQ0FTVF9CTE9DS19TT1VSQ0U6CisJY2FzZSBNQ0FTVF9NU0ZJTFRFUjoKKwljYXNlIE1DQVNUX0pPSU5fR1JPVVA6CisJY2FzZSBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUDoKKwljYXNlIE1DQVNUX0xFQVZFX0dST1VQOgorCWNhc2UgTUNBU1RfTEVBVkVfU09VUkNFX0dST1VQOgorCWNhc2UgTUNBU1RfVU5CTE9DS19TT1VSQ0U6CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CiAKIHN0YXRpYyBpbnQgZG9faXBfc2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwKIAkJCSAgICBpbnQgb3B0bmFtZSwgY2hhciBfX3VzZXIgKm9wdHZhbCwgdW5zaWduZWQgaW50IG9wdGxlbikKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJaW50IHZhbCA9IDAsIGVycjsKKwlib29sIG5lZWRzX3J0bmwgPSBzZXRzb2Nrb3B0X25lZWRzX3J0bmwob3B0bmFtZSk7CiAKIAlzd2l0Y2ggKG9wdG5hbWUpIHsKIAljYXNlIElQX1BLVElORk86CkBAIC01ODQsNiArNjA2LDggQEAKIAkJcmV0dXJuIGlwX21yb3V0ZV9zZXRzb2Nrb3B0KHNrLCBvcHRuYW1lLCBvcHR2YWwsIG9wdGxlbik7CiAKIAllcnIgPSAwOworCWlmIChuZWVkc19ydG5sKQorCQlydG5sX2xvY2soKTsKIAlsb2NrX3NvY2soc2spOwogCiAJc3dpdGNoIChvcHRuYW1lKSB7CkBAIC0xMTE4LDEwICsxMTQyLDE0IEBACiAJCWJyZWFrOwogCX0KIAlyZWxlYXNlX3NvY2soc2spOworCWlmIChuZWVkc19ydG5sKQorCQlydG5sX3VubG9jaygpOwogCXJldHVybiBlcnI7CiAKIGVfaW52YWw6CiAJcmVsZWFzZV9zb2NrKHNrKTsKKwlpZiAobmVlZHNfcnRubCkKKwkJcnRubF91bmxvY2soKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfdHVubmVsLmMgYi9uZXQvaXB2NC9pcF90dW5uZWwuYwppbmRleCAyY2QwODI4Li40YzJjM2JhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF90dW5uZWwuYworKysgYi9uZXQvaXB2NC9pcF90dW5uZWwuYwpAQCAtMzg5LDcgKzM4OSw2IEBACiAJCWhsZW4gPSB0ZGV2LT5oYXJkX2hlYWRlcl9sZW4gKyB0ZGV2LT5uZWVkZWRfaGVhZHJvb207CiAJCW10dSA9IHRkZXYtPm10dTsKIAl9Ci0JZGV2LT5pZmxpbmsgPSB0dW5uZWwtPnBhcm1zLmxpbms7CiAKIAlkZXYtPm5lZWRlZF9oZWFkcm9vbSA9IHRfaGxlbiArIGhsZW47CiAJbXR1IC09IChkZXYtPmhhcmRfaGVhZGVyX2xlbiArIHRfaGxlbik7CkBAIC02NTUsNyArNjU0LDcgQEAKIAlpZiAoZHN0ID09IDApIHsKIAkJLyogTkJNQSB0dW5uZWwgKi8KIAotCQlpZiAoc2tiX2RzdChza2IpID09IE5VTEwpIHsKKwkJaWYgKCFza2JfZHN0KHNrYikpIHsKIAkJCWRldi0+c3RhdHMudHhfZmlmb19lcnJvcnMrKzsKIAkJCWdvdG8gdHhfZXJyb3I7CiAJCX0KQEAgLTY3Myw3ICs2NzIsNyBAQAogCiAJCQluZWlnaCA9IGRzdF9uZWlnaF9sb29rdXAoc2tiX2RzdChza2IpLAogCQkJCQkJICZpcHY2X2hkcihza2IpLT5kYWRkcik7Ci0JCQlpZiAobmVpZ2ggPT0gTlVMTCkKKwkJCWlmICghbmVpZ2gpCiAJCQkJZ290byB0eF9lcnJvcjsKIAogCQkJYWRkcjYgPSAoY29uc3Qgc3RydWN0IGluNl9hZGRyICopJm5laWdoLT5wcmltYXJ5X2tleTsKQEAgLTc4Myw3ICs3ODIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JZXJyID0gaXB0dW5uZWxfeG1pdChza2ItPnNrLCBydCwgc2tiLCBmbDQuc2FkZHIsIGZsNC5kYWRkciwgcHJvdG9jb2wsCisJZXJyID0gaXB0dW5uZWxfeG1pdChOVUxMLCBydCwgc2tiLCBmbDQuc2FkZHIsIGZsNC5kYWRkciwgcHJvdG9jb2wsCiAJCQkgICAgdG9zLCB0dGwsIGRmLCAhbmV0X2VxKHR1bm5lbC0+bmV0LCBkZXZfbmV0KGRldikpKTsKIAlpcHR1bm5lbF94bWl0X3N0YXRzKGVyciwgJmRldi0+c3RhdHMsIGRldi0+dHN0YXRzKTsKIApAQCAtODQ0LDcgKzg0Myw3IEBACiAJY2FzZSBTSU9DR0VUVFVOTkVMOgogCQlpZiAoZGV2ID09IGl0bi0+ZmJfdHVubmVsX2RldikgewogCQkJdCA9IGlwX3R1bm5lbF9maW5kKGl0biwgcCwgaXRuLT5mYl90dW5uZWxfZGV2LT50eXBlKTsKLQkJCWlmICh0ID09IE5VTEwpCisJCQlpZiAoIXQpCiAJCQkJdCA9IG5ldGRldl9wcml2KGRldik7CiAJCX0KIAkJbWVtY3B5KHAsICZ0LT5wYXJtcywgc2l6ZW9mKCpwKSk7CkBAIC04NzcsNyArODc2LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChkZXYgIT0gaXRuLT5mYl90dW5uZWxfZGV2ICYmIGNtZCA9PSBTSU9DQ0hHVFVOTkVMKSB7Ci0JCQlpZiAodCAhPSBOVUxMKSB7CisJCQlpZiAodCkgewogCQkJCWlmICh0LT5kZXYgIT0gZGV2KSB7CiAJCQkJCWVyciA9IC1FRVhJU1Q7CiAJCQkJCWJyZWFrOwpAQCAtOTE1LDcgKzkxNCw3IEBACiAJCWlmIChkZXYgPT0gaXRuLT5mYl90dW5uZWxfZGV2KSB7CiAJCQllcnIgPSAtRU5PRU5UOwogCQkJdCA9IGlwX3R1bm5lbF9maW5kKGl0biwgcCwgaXRuLT5mYl90dW5uZWxfZGV2LT50eXBlKTsKLQkJCWlmICh0ID09IE5VTEwpCisJCQlpZiAoIXQpCiAJCQkJZ290byBkb25lOwogCQkJZXJyID0gLUVQRVJNOwogCQkJaWYgKHQgPT0gbmV0ZGV2X3ByaXYoaXRuLT5mYl90dW5uZWxfZGV2KSkKQEAgLTk4MCw2ICs5NzksMTQgQEAKIH0KIEVYUE9SVF9TWU1CT0woaXBfdHVubmVsX2dldF9saW5rX25ldCk7CiAKK2ludCBpcF90dW5uZWxfZ2V0X2lmbGluayhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IG5ldGRldl9wcml2KGRldik7CisKKwlyZXR1cm4gdHVubmVsLT5wYXJtcy5saW5rOworfQorRVhQT1JUX1NZTUJPTChpcF90dW5uZWxfZ2V0X2lmbGluayk7CisKIGludCBpcF90dW5uZWxfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0LCBpbnQgaXBfdG5sX25ldF9pZCwKIAkJCQkgIHN0cnVjdCBydG5sX2xpbmtfb3BzICpvcHMsIGNoYXIgKmRldm5hbWUpCiB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF90dW5uZWxfY29yZS5jIGIvbmV0L2lwdjQvaXBfdHVubmVsX2NvcmUuYwppbmRleCA4OGMzODZjLi5jZTYzYWIyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF90dW5uZWxfY29yZS5jCisrKyBiL25ldC9pcHY0L2lwX3R1bm5lbF9jb3JlLmMKQEAgLTc0LDcgKzc0LDggQEAKIAlpcGgtPmRhZGRyCT0JZHN0OwogCWlwaC0+c2FkZHIJPQlzcmM7CiAJaXBoLT50dGwJPQl0dGw7Ci0JX19pcF9zZWxlY3RfaWRlbnQoaXBoLCBza2Jfc2hpbmZvKHNrYiktPmdzb19zZWdzID86IDEpOworCV9faXBfc2VsZWN0X2lkZW50KGRldl9uZXQocnQtPmRzdC5kZXYpLCBpcGgsCisJCQkgIHNrYl9zaGluZm8oc2tiKS0+Z3NvX3NlZ3MgPzogMSk7CiAKIAllcnIgPSBpcF9sb2NhbF9vdXRfc2soc2ssIHNrYik7CiAJaWYgKHVubGlrZWx5KG5ldF94bWl0X2V2YWwoZXJyKSkpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF92dGkuYyBiL25ldC9pcHY0L2lwX3Z0aS5jCmluZGV4IDk0ZWZlMTQuLjlmNzI2OWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3Z0aS5jCisrKyBiL25ldC9pcHY0L2lwX3Z0aS5jCkBAIC02MCw3ICs2MCw3IEBACiAKIAl0dW5uZWwgPSBpcF90dW5uZWxfbG9va3VwKGl0biwgc2tiLT5kZXYtPmlmaW5kZXgsIFRVTk5FTF9OT19LRVksCiAJCQkJICBpcGgtPnNhZGRyLCBpcGgtPmRhZGRyLCAwKTsKLQlpZiAodHVubmVsICE9IE5VTEwpIHsKKwlpZiAodHVubmVsKSB7CiAJCWlmICgheGZybTRfcG9saWN5X2NoZWNrKE5VTEwsIFhGUk1fUE9MSUNZX0lOLCBza2IpKQogCQkJZ290byBkcm9wOwogCkBAIC0zNDEsNiArMzQxLDcgQEAKIAkubmRvX2RvX2lvY3RsCT0gdnRpX3R1bm5lbF9pb2N0bCwKIAkubmRvX2NoYW5nZV9tdHUJPSBpcF90dW5uZWxfY2hhbmdlX210dSwKIAkubmRvX2dldF9zdGF0czY0ID0gaXBfdHVubmVsX2dldF9zdGF0czY0LAorCS5uZG9fZ2V0X2lmbGluayA9IGlwX3R1bm5lbF9nZXRfaWZsaW5rLAogfTsKIAogc3RhdGljIHZvaWQgdnRpX3R1bm5lbF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMzYxLDcgKzM2Miw2IEBACiAJZGV2LT5oYXJkX2hlYWRlcl9sZW4JPSBMTF9NQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcGhkcik7CiAJZGV2LT5tdHUJCT0gRVRIX0RBVEFfTEVOOwogCWRldi0+ZmxhZ3MJCT0gSUZGX05PQVJQOwotCWRldi0+aWZsaW5rCQk9IDA7CiAJZGV2LT5hZGRyX2xlbgkJPSA0OwogCWRldi0+ZmVhdHVyZXMJCXw9IE5FVElGX0ZfTExUWDsKIAluZXRpZl9rZWVwX2RzdChkZXYpOwpAQCAtNDU2LDEwICs0NTYsMTAgQEAKIAkJcGFybXMtPm9fa2V5ID0gbmxhX2dldF9iZTMyKGRhdGFbSUZMQV9WVElfT0tFWV0pOwogCiAJaWYgKGRhdGFbSUZMQV9WVElfTE9DQUxdKQotCQlwYXJtcy0+aXBoLnNhZGRyID0gbmxhX2dldF9iZTMyKGRhdGFbSUZMQV9WVElfTE9DQUxdKTsKKwkJcGFybXMtPmlwaC5zYWRkciA9IG5sYV9nZXRfaW5fYWRkcihkYXRhW0lGTEFfVlRJX0xPQ0FMXSk7CiAKIAlpZiAoZGF0YVtJRkxBX1ZUSV9SRU1PVEVdKQotCQlwYXJtcy0+aXBoLmRhZGRyID0gbmxhX2dldF9iZTMyKGRhdGFbSUZMQV9WVElfUkVNT1RFXSk7CisJCXBhcm1zLT5pcGguZGFkZHIgPSBubGFfZ2V0X2luX2FkZHIoZGF0YVtJRkxBX1ZUSV9SRU1PVEVdKTsKIAogfQogCkBAIC01MDUsOCArNTA1LDggQEAKIAlubGFfcHV0X3UzMihza2IsIElGTEFfVlRJX0xJTkssIHAtPmxpbmspOwogCW5sYV9wdXRfYmUzMihza2IsIElGTEFfVlRJX0lLRVksIHAtPmlfa2V5KTsKIAlubGFfcHV0X2JlMzIoc2tiLCBJRkxBX1ZUSV9PS0VZLCBwLT5vX2tleSk7Ci0JbmxhX3B1dF9iZTMyKHNrYiwgSUZMQV9WVElfTE9DQUwsIHAtPmlwaC5zYWRkcik7Ci0JbmxhX3B1dF9iZTMyKHNrYiwgSUZMQV9WVElfUkVNT1RFLCBwLT5pcGguZGFkZHIpOworCW5sYV9wdXRfaW5fYWRkcihza2IsIElGTEFfVlRJX0xPQ0FMLCBwLT5pcGguc2FkZHIpOworCW5sYV9wdXRfaW5fYWRkcihza2IsIElGTEFfVlRJX1JFTU9URSwgcC0+aXBoLmRhZGRyKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBjb21wLmMgYi9uZXQvaXB2NC9pcGNvbXAuYwppbmRleCBjMDg1NWQ1Li5kOTdmNGYyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGNvbXAuYworKysgYi9uZXQvaXB2NC9pcGNvbXAuYwpAQCAtNjMsNyArNjMsNyBAQAogCXN0cnVjdCB4ZnJtX3N0YXRlICp0OwogCiAJdCA9IHhmcm1fc3RhdGVfYWxsb2MobmV0KTsKLQlpZiAodCA9PSBOVUxMKQorCWlmICghdCkKIAkJZ290byBvdXQ7CiAKIAl0LT5pZC5wcm90byA9IElQUFJPVE9fSVBJUDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwY29uZmlnLmMgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCmluZGV4IGIyNjM3NmUuLjhlNzMyOGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwY29uZmlnLmMKKysrIGIvbmV0L2lwdjQvaXBjb25maWcuYwpAQCAtNTA0LDcgKzUwNCw4IEBACiAJaWYgKCFuZXRfZXEoZGV2X25ldChkZXYpLCAmaW5pdF9uZXQpKQogCQlnb3RvIGRyb3A7CiAKLQlpZiAoKHNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKQorCXNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQogCQlyZXR1cm4gTkVUX1JYX0RST1A7CiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGFycGhkcikpKQpAQCAtOTU4LDcgKzk1OSw4IEBACiAJaWYgKHNrYi0+cGt0X3R5cGUgPT0gUEFDS0VUX09USEVSSE9TVCkKIAkJZ290byBkcm9wOwogCi0JaWYgKChza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwlza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwaXAuYyBiL25ldC9pcHY0L2lwaXAuYwppbmRleCA5MTVkMjE1Li5mZjk2Mzk2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcGlwLmMKKysrIGIvbmV0L2lwdjQvaXBpcC5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKIAllcnIgPSAtRU5PRU5UOwogCXQgPSBpcF90dW5uZWxfbG9va3VwKGl0biwgc2tiLT5kZXYtPmlmaW5kZXgsIFRVTk5FTF9OT19LRVksCiAJCQkgICAgIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsIDApOwotCWlmICh0ID09IE5VTEwpCisJaWYgKCF0KQogCQlnb3RvIG91dDsKIAogCWlmICh0eXBlID09IElDTVBfREVTVF9VTlJFQUNIICYmIGNvZGUgPT0gSUNNUF9GUkFHX05FRURFRCkgewpAQCAtMjcyLDYgKzI3Miw3IEBACiAJLm5kb19kb19pb2N0bAk9IGlwaXBfdHVubmVsX2lvY3RsLAogCS5uZG9fY2hhbmdlX210dSA9IGlwX3R1bm5lbF9jaGFuZ2VfbXR1LAogCS5uZG9fZ2V0X3N0YXRzNjQgPSBpcF90dW5uZWxfZ2V0X3N0YXRzNjQsCisJLm5kb19nZXRfaWZsaW5rID0gaXBfdHVubmVsX2dldF9pZmxpbmssCiB9OwogCiAjZGVmaW5lIElQSVBfRkVBVFVSRVMgKE5FVElGX0ZfU0cgfAkJXApAQCAtMjg2LDcgKzI4Nyw2IEBACiAKIAlkZXYtPnR5cGUJCT0gQVJQSFJEX1RVTk5FTDsKIAlkZXYtPmZsYWdzCQk9IElGRl9OT0FSUDsKLQlkZXYtPmlmbGluawkJPSAwOwogCWRldi0+YWRkcl9sZW4JCT0gNDsKIAlkZXYtPmZlYXR1cmVzCQl8PSBORVRJRl9GX0xMVFg7CiAJbmV0aWZfa2VlcF9kc3QoZGV2KTsKQEAgLTMyNSwxMCArMzI1LDEwIEBACiAJCXBhcm1zLT5saW5rID0gbmxhX2dldF91MzIoZGF0YVtJRkxBX0lQVFVOX0xJTktdKTsKIAogCWlmIChkYXRhW0lGTEFfSVBUVU5fTE9DQUxdKQotCQlwYXJtcy0+aXBoLnNhZGRyID0gbmxhX2dldF9iZTMyKGRhdGFbSUZMQV9JUFRVTl9MT0NBTF0pOworCQlwYXJtcy0+aXBoLnNhZGRyID0gbmxhX2dldF9pbl9hZGRyKGRhdGFbSUZMQV9JUFRVTl9MT0NBTF0pOwogCiAJaWYgKGRhdGFbSUZMQV9JUFRVTl9SRU1PVEVdKQotCQlwYXJtcy0+aXBoLmRhZGRyID0gbmxhX2dldF9iZTMyKGRhdGFbSUZMQV9JUFRVTl9SRU1PVEVdKTsKKwkJcGFybXMtPmlwaC5kYWRkciA9IG5sYV9nZXRfaW5fYWRkcihkYXRhW0lGTEFfSVBUVU5fUkVNT1RFXSk7CiAKIAlpZiAoZGF0YVtJRkxBX0lQVFVOX1RUTF0pIHsKIAkJcGFybXMtPmlwaC50dGwgPSBubGFfZ2V0X3U4KGRhdGFbSUZMQV9JUFRVTl9UVExdKTsKQEAgLTQ1MCw4ICs0NTAsOCBAQAogCXN0cnVjdCBpcF90dW5uZWxfcGFybSAqcGFybSA9ICZ0dW5uZWwtPnBhcm1zOwogCiAJaWYgKG5sYV9wdXRfdTMyKHNrYiwgSUZMQV9JUFRVTl9MSU5LLCBwYXJtLT5saW5rKSB8fAotCSAgICBubGFfcHV0X2JlMzIoc2tiLCBJRkxBX0lQVFVOX0xPQ0FMLCBwYXJtLT5pcGguc2FkZHIpIHx8Ci0JICAgIG5sYV9wdXRfYmUzMihza2IsIElGTEFfSVBUVU5fUkVNT1RFLCBwYXJtLT5pcGguZGFkZHIpIHx8CisJICAgIG5sYV9wdXRfaW5fYWRkcihza2IsIElGTEFfSVBUVU5fTE9DQUwsIHBhcm0tPmlwaC5zYWRkcikgfHwKKwkgICAgbmxhX3B1dF9pbl9hZGRyKHNrYiwgSUZMQV9JUFRVTl9SRU1PVEUsIHBhcm0tPmlwaC5kYWRkcikgfHwKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfSVBUVU5fVFRMLCBwYXJtLT5pcGgudHRsKSB8fAogCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9JUFRVTl9UT1MsIHBhcm0tPmlwaC50b3MpIHx8CiAJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0lQVFVOX1BNVFVESVNDLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBtci5jIGIvbmV0L2lwdjQvaXBtci5jCmluZGV4IDlkNzg0MjcuLjNhMmMwMTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwbXIuYworKysgYi9uZXQvaXB2NC9pcG1yLmMKQEAgLTczLDkgKzczLDcgQEAKIAogc3RydWN0IG1yX3RhYmxlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Ci0jaWZkZWYgQ09ORklHX05FVF9OUwotCXN0cnVjdCBuZXQJCSpuZXQ7Ci0jZW5kaWYKKwlwb3NzaWJsZV9uZXRfdAkJbmV0OwogCXUzMgkJCWlkOwogCXN0cnVjdCBzb2NrIF9fcmN1CSptcm91dGVfc2s7CiAJc3RydWN0IHRpbWVyX2xpc3QJaXBtcl9leHBpcmVfdGltZXI7CkBAIC0xOTEsNyArMTg5LDcgQEAKIAl9CiAKIAltcnQgPSBpcG1yX2dldF90YWJsZShydWxlLT5mcl9uZXQsIHJ1bGUtPnRhYmxlKTsKLQlpZiAobXJ0ID09IE5VTEwpCisJaWYgKCFtcnQpCiAJCXJldHVybiAtRUFHQUlOOwogCXJlcy0+bXJ0ID0gbXJ0OwogCXJldHVybiAwOwpAQCAtMjU1LDcgKzI1Myw3IEBACiAJSU5JVF9MSVNUX0hFQUQoJm5ldC0+aXB2NC5tcl90YWJsZXMpOwogCiAJbXJ0ID0gaXBtcl9uZXdfdGFibGUobmV0LCBSVF9UQUJMRV9ERUZBVUxUKTsKLQlpZiAobXJ0ID09IE5VTEwpIHsKKwlpZiAoIW1ydCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGVycjE7CiAJfQpAQCAtMjY4LDcgKzI2Niw3IEBACiAJcmV0dXJuIDA7CiAKIGVycjI6Ci0Ja2ZyZWUobXJ0KTsKKwlpcG1yX2ZyZWVfdGFibGUobXJ0KTsKIGVycjE6CiAJZmliX3J1bGVzX3VucmVnaXN0ZXIob3BzKTsKIAlyZXR1cm4gZXJyOwpAQCAtMjc4LDExICsyNzYsMTMgQEAKIHsKIAlzdHJ1Y3QgbXJfdGFibGUgKm1ydCwgKm5leHQ7CiAKKwlydG5sX2xvY2soKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXJ0LCBuZXh0LCAmbmV0LT5pcHY0Lm1yX3RhYmxlcywgbGlzdCkgewogCQlsaXN0X2RlbCgmbXJ0LT5saXN0KTsKIAkJaXBtcl9mcmVlX3RhYmxlKG1ydCk7CiAJfQogCWZpYl9ydWxlc191bnJlZ2lzdGVyKG5ldC0+aXB2NC5tcl9ydWxlc19vcHMpOworCXJ0bmxfdW5sb2NrKCk7CiB9CiAjZWxzZQogI2RlZmluZSBpcG1yX2Zvcl9lYWNoX3RhYmxlKG1ydCwgbmV0KSBcCkBAIC0zMDgsNyArMzA4LDEwIEBACiAKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgaXBtcl9ydWxlc19leGl0KHN0cnVjdCBuZXQgKm5ldCkKIHsKKwlydG5sX2xvY2soKTsKIAlpcG1yX2ZyZWVfdGFibGUobmV0LT5pcHY0Lm1ydCk7CisJbmV0LT5pcHY0Lm1ydCA9IE5VTEw7CisJcnRubF91bmxvY2soKTsKIH0KICNlbmRpZgogCkBAIC0zMTgsMTEgKzMyMSwxMSBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJbXJ0ID0gaXBtcl9nZXRfdGFibGUobmV0LCBpZCk7Ci0JaWYgKG1ydCAhPSBOVUxMKQorCWlmIChtcnQpCiAJCXJldHVybiBtcnQ7CiAKIAltcnQgPSBremFsbG9jKHNpemVvZigqbXJ0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG1ydCA9PSBOVUxMKQorCWlmICghbXJ0KQogCQlyZXR1cm4gTlVMTDsKIAl3cml0ZV9wbmV0KCZtcnQtPm5ldCwgbmV0KTsKIAltcnQtPmlkID0gaWQ7CkBAIC00MjQsNyArNDI3LDcgQEAKIAkJCWRldi0+ZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKIAogCQkJaW5fZGV2ID0gX19pbl9kZXZfZ2V0X3J0bmwoZGV2KTsKLQkJCWlmIChpbl9kZXYgPT0gTlVMTCkKKwkJCWlmICghaW5fZGV2KQogCQkJCWdvdG8gZmFpbHVyZTsKIAogCQkJaXB2NF9kZXZjb25mX3NldGFsbChpbl9kZXYpOwpAQCAtNDc1LDggKzQ3OCwxNCBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKK3N0YXRpYyBpbnQgcmVnX3ZpZl9nZXRfaWZsaW5rKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcmVnX3ZpZl9uZXRkZXZfb3BzID0gewogCS5uZG9fc3RhcnRfeG1pdAk9IHJlZ192aWZfeG1pdCwKKwkubmRvX2dldF9pZmxpbmsgPSByZWdfdmlmX2dldF9pZmxpbmssCiB9OwogCiBzdGF0aWMgdm9pZCByZWdfdmlmX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC01MDIsNyArNTExLDcgQEAKIAogCWRldiA9IGFsbG9jX25ldGRldigwLCBuYW1lLCBORVRfTkFNRV9VTktOT1dOLCByZWdfdmlmX3NldHVwKTsKIAotCWlmIChkZXYgPT0gTlVMTCkKKwlpZiAoIWRldikKIAkJcmV0dXJuIE5VTEw7CiAKIAlkZXZfbmV0X3NldChkZXYsIG5ldCk7CkBAIC01MTEsNyArNTIwLDYgQEAKIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWRldi0+aWZsaW5rID0gMDsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlpbl9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KGRldik7CkBAIC03NTksNyArNzY3LDcgQEAKIAljYXNlIDA6CiAJCWlmICh2aWZjLT52aWZjX2ZsYWdzID09IFZJRkZfVVNFX0lGSU5ERVgpIHsKIAkJCWRldiA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCB2aWZjLT52aWZjX2xjbF9pZmluZGV4KTsKLQkJCWlmIChkZXYgJiYgX19pbl9kZXZfZ2V0X3J0bmwoZGV2KSA9PSBOVUxMKSB7CisJCQlpZiAoZGV2ICYmICFfX2luX2Rldl9nZXRfcnRubChkZXYpKSB7CiAJCQkJZGV2X3B1dChkZXYpOwogCQkJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKIAkJCX0KQEAgLTgwMyw3ICs4MTEsNyBAQAogCXYtPnBrdF9vdXQgPSAwOwogCXYtPmxpbmsgPSBkZXYtPmlmaW5kZXg7CiAJaWYgKHYtPmZsYWdzICYgKFZJRkZfVFVOTkVMIHwgVklGRl9SRUdJU1RFUikpCi0JCXYtPmxpbmsgPSBkZXYtPmlmbGluazsKKwkJdi0+bGluayA9IGRldl9nZXRfaWZsaW5rKGRldik7CiAKIAkvKiBBbmQgZmluaXNoIHVwZGF0ZSB3cml0aW5nIGNyaXRpY2FsIGRhdGEgKi8KIAl3cml0ZV9sb2NrX2JoKCZtcnRfbG9jayk7CkBAIC0xMDA1LDcgKzEwMTMsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCW1yb3V0ZV9zayA9IHJjdV9kZXJlZmVyZW5jZShtcnQtPm1yb3V0ZV9zayk7Ci0JaWYgKG1yb3V0ZV9zayA9PSBOVUxMKSB7CisJaWYgKCFtcm91dGVfc2spIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTExNTgsNyArMTE2Niw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJYyA9IGlwbXJfY2FjaGVfYWxsb2MoKTsKLQlpZiAoYyA9PSBOVUxMKQorCWlmICghYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAljLT5tZmNfb3JpZ2luID0gbWZjLT5tZmNjX29yaWdpbi5zX2FkZHI7CkBAIC0xMjgwLDcgKzEyODgsNyBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAltcnQgPSBpcG1yX2dldF90YWJsZShuZXQsIHJhd19zayhzayktPmlwbXJfdGFibGUgPyA6IFJUX1RBQkxFX0RFRkFVTFQpOwotCWlmIChtcnQgPT0gTlVMTCkKKwlpZiAoIW1ydCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlpZiAob3B0bmFtZSAhPSBNUlRfSU5JVCkgewpAQCAtMTQ0Myw3ICsxNDUxLDcgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCiAJbXJ0ID0gaXBtcl9nZXRfdGFibGUobmV0LCByYXdfc2soc2spLT5pcG1yX3RhYmxlID8gOiBSVF9UQUJMRV9ERUZBVUxUKTsKLQlpZiAobXJ0ID09IE5VTEwpCisJaWYgKCFtcnQpCiAJCXJldHVybiAtRU5PRU5UOwogCiAJaWYgKG9wdG5hbWUgIT0gTVJUX1ZFUlNJT04gJiYKQEAgLTE0ODksNyArMTQ5Nyw3IEBACiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CiAKIAltcnQgPSBpcG1yX2dldF90YWJsZShuZXQsIHJhd19zayhzayktPmlwbXJfdGFibGUgPyA6IFJUX1RBQkxFX0RFRkFVTFQpOwotCWlmIChtcnQgPT0gTlVMTCkKKwlpZiAoIW1ydCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtMTU2Myw3ICsxNTcxLDcgQEAKIAlzdHJ1Y3QgbXJfdGFibGUgKm1ydDsKIAogCW1ydCA9IGlwbXJfZ2V0X3RhYmxlKG5ldCwgcmF3X3NrKHNrKS0+aXBtcl90YWJsZSA/IDogUlRfVEFCTEVfREVGQVVMVCk7Ci0JaWYgKG1ydCA9PSBOVUxMKQorCWlmICghbXJ0KQogCQlyZXR1cm4gLUVOT0VOVDsKIAogCXN3aXRjaCAoY21kKSB7CkBAIC0xNjQ0LDcgKzE2NTIsOCBAQAogICoJaW1wb3J0YW50IGZvciBtdWx0aWNhc3QgdmlkZW8uCiAgKi8KIAotc3RhdGljIHZvaWQgaXBfZW5jYXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIpCitzdGF0aWMgdm9pZCBpcF9lbmNhcChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsCisJCSAgICAgX19iZTMyIHNhZGRyLCBfX2JlMzIgZGFkZHIpCiB7CiAJc3RydWN0IGlwaGRyICppcGg7CiAJY29uc3Qgc3RydWN0IGlwaGRyICpvbGRfaXBoID0gaXBfaGRyKHNrYik7CkBAIC0xNjYzLDE0ICsxNjcyLDE0IEBACiAJaXBoLT5wcm90b2NvbAk9CUlQUFJPVE9fSVBJUDsKIAlpcGgtPmlobAk9CTU7CiAJaXBoLT50b3RfbGVuCT0JaHRvbnMoc2tiLT5sZW4pOwotCWlwX3NlbGVjdF9pZGVudChza2IsIE5VTEwpOworCWlwX3NlbGVjdF9pZGVudChuZXQsIHNrYiwgTlVMTCk7CiAJaXBfc2VuZF9jaGVjayhpcGgpOwogCiAJbWVtc2V0KCYoSVBDQihza2IpLT5vcHQpLCAwLCBzaXplb2YoSVBDQihza2IpLT5vcHQpKTsKIAluZl9yZXNldChza2IpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpcG1yX2ZvcndhcmRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIGludCBpcG1yX2ZvcndhcmRfZmluaXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaXBfb3B0aW9ucyAqb3B0ID0gJihJUENCKHNrYiktPm9wdCk7CiAKQEAgLTE2ODAsNyArMTY4OSw3IEBACiAJaWYgKHVubGlrZWx5KG9wdC0+b3B0bGVuKSkKIAkJaXBfZm9yd2FyZF9vcHRpb25zKHNrYik7CiAKLQlyZXR1cm4gZHN0X291dHB1dChza2IpOworCXJldHVybiBkc3Rfb3V0cHV0X3NrKHNrLCBza2IpOwogfQogCiAvKgpAQCAtMTY5Nyw3ICsxNzA2LDcgQEAKIAlzdHJ1Y3QgZmxvd2k0IGZsNDsKIAlpbnQgICAgZW5jYXAgPSAwOwogCi0JaWYgKHZpZi0+ZGV2ID09IE5VTEwpCisJaWYgKCF2aWYtPmRldikKIAkJZ290byBvdXRfZnJlZTsKIAogI2lmZGVmIENPTkZJR19JUF9QSU1TTQpAQCAtMTc2MCw3ICsxNzY5LDcgQEAKIAkgKiBXaGF0IGRvIHdlIGRvIHdpdGggbmV0ZmlsdGVyPyAtLSBSUgogCSAqLwogCWlmICh2aWYtPmZsYWdzICYgVklGRl9UVU5ORUwpIHsKLQkJaXBfZW5jYXAoc2tiLCB2aWYtPmxvY2FsLCB2aWYtPnJlbW90ZSk7CisJCWlwX2VuY2FwKG5ldCwgc2tiLCB2aWYtPmxvY2FsLCB2aWYtPnJlbW90ZSk7CiAJCS8qIEZJWE1FOiBleHRyYSBvdXRwdXQgZmlyZXdhbGwgc3RlcCB1c2VkIHRvIGJlIGhlcmUuIC0tUlIgKi8KIAkJdmlmLT5kZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKIAkJdmlmLT5kZXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwpAQCAtMTc3OSw3ICsxNzg4LDggQEAKIAkgKiBub3QgbXJvdXRlcikgY2Fubm90IGpvaW4gdG8gbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UgLSBpdCB3aWxsCiAJICogcmVzdWx0IGluIHJlY2VpdmluZyBtdWx0aXBsZSBwYWNrZXRzLgogCSAqLwotCU5GX0hPT0soTkZQUk9UT19JUFY0LCBORl9JTkVUX0ZPUldBUkQsIHNrYiwgc2tiLT5kZXYsIGRldiwKKwlORl9IT09LKE5GUFJPVE9fSVBWNCwgTkZfSU5FVF9GT1JXQVJELCBOVUxMLCBza2IsCisJCXNrYi0+ZGV2LCBkZXYsCiAJCWlwbXJfZm9yd2FyZF9maW5pc2gpOwogCXJldHVybjsKIApAQCAtMTk4OCw3ICsxOTk4LDcgQEAKIAogCS8qIGFscmVhZHkgdW5kZXIgcmN1X3JlYWRfbG9jaygpICovCiAJY2FjaGUgPSBpcG1yX2NhY2hlX2ZpbmQobXJ0LCBpcF9oZHIoc2tiKS0+c2FkZHIsIGlwX2hkcihza2IpLT5kYWRkcik7Ci0JaWYgKGNhY2hlID09IE5VTEwpIHsKKwlpZiAoIWNhY2hlKSB7CiAJCWludCB2aWYgPSBpcG1yX2ZpbmRfdmlmKG1ydCwgc2tiLT5kZXYpOwogCiAJCWlmICh2aWYgPj0gMCkKQEAgLTE5OTksMTMgKzIwMDksMTMgQEAKIAkvKgogCSAqCU5vIHVzYWJsZSBjYWNoZSBlbnRyeQogCSAqLwotCWlmIChjYWNoZSA9PSBOVUxMKSB7CisJaWYgKCFjYWNoZSkgewogCQlpbnQgdmlmOwogCiAJCWlmIChsb2NhbCkgewogCQkJc3RydWN0IHNrX2J1ZmYgKnNrYjIgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAkJCWlwX2xvY2FsX2RlbGl2ZXIoc2tiKTsKLQkJCWlmIChza2IyID09IE5VTEwpCisJCQlpZiAoIXNrYjIpCiAJCQkJcmV0dXJuIC1FTk9CVUZTOwogCQkJc2tiID0gc2tiMjsKIAkJfQpAQCAtMjA2NCw3ICsyMDc0LDcgQEAKIAkJcmVnX2RldiA9IG1ydC0+dmlmX3RhYmxlW21ydC0+bXJvdXRlX3JlZ192aWZfbnVtXS5kZXY7CiAJcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKIAotCWlmIChyZWdfZGV2ID09IE5VTEwpCisJaWYgKCFyZWdfZGV2KQogCQlyZXR1cm4gMTsKIAogCXNrYi0+bWFjX2hlYWRlciA9IHNrYi0+bmV0d29ya19oZWFkZXI7CkBAIC0yMTk0LDE4ICsyMjA0LDE4IEBACiAJaW50IGVycjsKIAogCW1ydCA9IGlwbXJfZ2V0X3RhYmxlKG5ldCwgUlRfVEFCTEVfREVGQVVMVCk7Ci0JaWYgKG1ydCA9PSBOVUxMKQorCWlmICghbXJ0KQogCQlyZXR1cm4gLUVOT0VOVDsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAljYWNoZSA9IGlwbXJfY2FjaGVfZmluZChtcnQsIHNhZGRyLCBkYWRkcik7Ci0JaWYgKGNhY2hlID09IE5VTEwgJiYgc2tiLT5kZXYpIHsKKwlpZiAoIWNhY2hlICYmIHNrYi0+ZGV2KSB7CiAJCWludCB2aWYgPSBpcG1yX2ZpbmRfdmlmKG1ydCwgc2tiLT5kZXYpOwogCiAJCWlmICh2aWYgPj0gMCkKIAkJCWNhY2hlID0gaXBtcl9jYWNoZV9maW5kX2FueShtcnQsIGRhZGRyLCB2aWYpOwogCX0KLQlpZiAoY2FjaGUgPT0gTlVMTCkgeworCWlmICghY2FjaGUpIHsKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CiAJCXN0cnVjdCBpcGhkciAqaXBoOwogCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwpAQCAtMjI2Myw3ICsyMjczLDcgQEAKIAlpbnQgZXJyOwogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIGNtZCwgc2l6ZW9mKCpydG0pLCBmbGFncyk7Ci0JaWYgKG5saCA9PSBOVUxMKQorCWlmICghbmxoKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJcnRtID0gbmxtc2dfZGF0YShubGgpOwpAQCAtMjI4Miw4ICsyMjkyLDggQEAKIAkJcnRtLT5ydG1fcHJvdG9jb2wgPSBSVFBST1RfTVJPVVRFRDsKIAlydG0tPnJ0bV9mbGFncyAgICA9IDA7CiAKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgUlRBX1NSQywgYy0+bWZjX29yaWdpbikgfHwKLQkgICAgbmxhX3B1dF9iZTMyKHNrYiwgUlRBX0RTVCwgYy0+bWZjX21jYXN0Z3JwKSkKKwlpZiAobmxhX3B1dF9pbl9hZGRyKHNrYiwgUlRBX1NSQywgYy0+bWZjX29yaWdpbikgfHwKKwkgICAgbmxhX3B1dF9pbl9hZGRyKHNrYiwgUlRBX0RTVCwgYy0+bWZjX21jYXN0Z3JwKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJZXJyID0gX19pcG1yX2ZpbGxfbXJvdXRlKG1ydCwgc2tiLCBjLCBydG0pOwogCS8qIGRvIG5vdCBicmVhayB0aGUgZHVtcCBpZiBjYWNoZSBpcyB1bnJlc29sdmVkICovCkBAIC0yMzI4LDcgKzIzMzgsNyBAQAogCiAJc2tiID0gbmxtc2dfbmV3KG1yb3V0ZV9tc2dzaXplKG1mYy0+bWZjX3BhcmVudCA+PSBNQVhWSUZTLCBtcnQtPm1heHZpZiksCiAJCQlHRlBfQVRPTUlDKTsKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gaXBtcl9maWxsX21yb3V0ZShtcnQsIHNrYiwgMCwgMCwgbWZjLCBjbWQsIDApOwpAQCAtMjQ0Myw3ICsyNDUzLDcgQEAKIAlzdHJ1Y3QgbXJfdGFibGUgKm1ydDsKIAogCW1ydCA9IGlwbXJfZ2V0X3RhYmxlKG5ldCwgUlRfVEFCTEVfREVGQVVMVCk7Ci0JaWYgKG1ydCA9PSBOVUxMKQorCWlmICghbXJ0KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIAogCWl0ZXItPm1ydCA9IG1ydDsKQEAgLTI1NjIsNyArMjU3Miw3IEBACiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CiAKIAltcnQgPSBpcG1yX2dldF90YWJsZShuZXQsIFJUX1RBQkxFX0RFRkFVTFQpOwotCWlmIChtcnQgPT0gTlVMTCkKKwlpZiAoIW1ydCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiAKIAlpdC0+bXJ0ID0gbXJ0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIuYwppbmRleCA3ZWJkNmUzLi42NWRlMDY4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIuYwpAQCAtOTQsNyArOTQsNyBAQAogewogCXN0cnVjdCBpcF9ydF9pbmZvICpydF9pbmZvID0gbmZfcXVldWVfZW50cnlfcmVyb3V0ZShlbnRyeSk7CiAKLQlpZiAoZW50cnktPmhvb2sgPT0gTkZfSU5FVF9MT0NBTF9PVVQpIHsKKwlpZiAoZW50cnktPnN0YXRlLmhvb2sgPT0gTkZfSU5FVF9MT0NBTF9PVVQpIHsKIAkJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAogCQlydF9pbmZvLT50b3MgPSBpcGgtPnRvczsKQEAgLTEwOSw3ICsxMDksNyBAQAogewogCWNvbnN0IHN0cnVjdCBpcF9ydF9pbmZvICpydF9pbmZvID0gbmZfcXVldWVfZW50cnlfcmVyb3V0ZShlbnRyeSk7CiAKLQlpZiAoZW50cnktPmhvb2sgPT0gTkZfSU5FVF9MT0NBTF9PVVQpIHsKKwlpZiAoZW50cnktPnN0YXRlLmhvb2sgPT0gTkZfSU5FVF9MT0NBTF9PVVQpIHsKIAkJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAogCQlpZiAoIShpcGgtPnRvcyA9PSBydF9pbmZvLT50b3MgJiYKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9LY29uZmlnIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggNTlmODgzZC4uZmIyMGYzNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcKQEAgLTM2LDYgKzM2LDM3IEBACiAKIAkgIElmIHVuc3VyZSwgc2F5IFkuCiAKK2lmIE5GX1RBQkxFUworCitjb25maWcgTkZfVEFCTEVTX0lQVjQKKwl0cmlzdGF0ZSAiSVB2NCBuZl90YWJsZXMgc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBJUHY0IHN1cHBvcnQgZm9yIG5mX3RhYmxlcy4KKworaWYgTkZfVEFCTEVTX0lQVjQKKworY29uZmlnIE5GVF9DSEFJTl9ST1VURV9JUFY0CisJdHJpc3RhdGUgIklQdjQgbmZfdGFibGVzIHJvdXRlIGNoYWluIHN1cHBvcnQiCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgInJvdXRlIiBjaGFpbiBmb3IgSVB2NCBpbiBuZl90YWJsZXMuIFRoaXMKKwkgIGNoYWluIHR5cGUgaXMgdXNlZCB0byBmb3JjZSBwYWNrZXQgcmUtcm91dGluZyBhZnRlciBtYW5nbGluZyBoZWFkZXIKKwkgIGZpZWxkcyBzdWNoIGFzIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uLCB0eXBlIG9mIHNlcnZpY2UgYW5kCisJICB0aGUgcGFja2V0IG1hcmsuCisKK2NvbmZpZyBORlRfUkVKRUNUX0lQVjQKKwlzZWxlY3QgTkZfUkVKRUNUX0lQVjQKKwlkZWZhdWx0IE5GVF9SRUpFQ1QKKwl0cmlzdGF0ZQorCitlbmRpZiAjIE5GX1RBQkxFU19JUFY0CisKK2NvbmZpZyBORl9UQUJMRVNfQVJQCisJdHJpc3RhdGUgIkFSUCBuZl90YWJsZXMgc3VwcG9ydCIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBBUlAgc3VwcG9ydCBmb3IgbmZfdGFibGVzLgorCitlbmRpZiAjIE5GX1RBQkxFUworCiBjb25maWcgTkZfTE9HX0FSUAogCXRyaXN0YXRlICJBUlAgcGFja2V0IGxvZ2dpbmciCiAJZGVmYXVsdCBtIGlmIE5FVEZJTFRFUl9BRFZBTkNFRD1uCkBAIC00NiwzNyArNzcsMTAgQEAKIAlkZWZhdWx0IG0gaWYgTkVURklMVEVSX0FEVkFOQ0VEPW4KIAlzZWxlY3QgTkZfTE9HX0NPTU1PTgogCi1jb25maWcgTkZfVEFCTEVTX0lQVjQKLQlkZXBlbmRzIG9uIE5GX1RBQkxFUwotCXRyaXN0YXRlICJJUHY0IG5mX3RhYmxlcyBzdXBwb3J0IgotCWhlbHAKLQkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIElQdjQgc3VwcG9ydCBmb3IgbmZfdGFibGVzLgotCi1jb25maWcgTkZUX0NIQUlOX1JPVVRFX0lQVjQKLQlkZXBlbmRzIG9uIE5GX1RBQkxFU19JUFY0Ci0JdHJpc3RhdGUgIklQdjQgbmZfdGFibGVzIHJvdXRlIGNoYWluIHN1cHBvcnQiCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgInJvdXRlIiBjaGFpbiBmb3IgSVB2NCBpbiBuZl90YWJsZXMuIFRoaXMKLQkgIGNoYWluIHR5cGUgaXMgdXNlZCB0byBmb3JjZSBwYWNrZXQgcmUtcm91dGluZyBhZnRlciBtYW5nbGluZyBoZWFkZXIKLQkgIGZpZWxkcyBzdWNoIGFzIHRoZSBzb3VyY2UsIGRlc3RpbmF0aW9uLCB0eXBlIG9mIHNlcnZpY2UgYW5kCi0JICB0aGUgcGFja2V0IG1hcmsuCi0KIGNvbmZpZyBORl9SRUpFQ1RfSVBWNAogCXRyaXN0YXRlICJJUHY0IHBhY2tldCByZWplY3Rpb24iCiAJZGVmYXVsdCBtIGlmIE5FVEZJTFRFUl9BRFZBTkNFRD1uCiAKLWNvbmZpZyBORlRfUkVKRUNUX0lQVjQKLQlkZXBlbmRzIG9uIE5GX1RBQkxFU19JUFY0Ci0Jc2VsZWN0IE5GX1JFSkVDVF9JUFY0Ci0JZGVmYXVsdCBORlRfUkVKRUNUCi0JdHJpc3RhdGUKLQotY29uZmlnIE5GX1RBQkxFU19BUlAKLQlkZXBlbmRzIG9uIE5GX1RBQkxFUwotCXRyaXN0YXRlICJBUlAgbmZfdGFibGVzIHN1cHBvcnQiCi0JaGVscAotCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgQVJQIHN1cHBvcnQgZm9yIG5mX3RhYmxlcy4KLQogY29uZmlnIE5GX05BVF9JUFY0CiAJdHJpc3RhdGUgIklQdjQgTkFUIgogCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLX0lQVjQKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwX3RhYmxlcy5jCmluZGV4IGY5NWI2ZjkuLjEzYmZlODQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9hcnBfdGFibGVzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycF90YWJsZXMuYwpAQCAtMjQ4LDggKzI0OCw3IEBACiAKIHVuc2lnbmVkIGludCBhcnB0X2RvX3RhYmxlKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICB1bnNpZ25lZCBpbnQgaG9vaywKLQkJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJCQkgICBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKQogewogCXN0YXRpYyBjb25zdCBjaGFyIG51bGxkZXZuYW1lW0lGTkFNU0laXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKHNpemVvZihsb25nKSkpKTsKQEAgLTI2NSw4ICsyNjQsOCBAQAogCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGFycF9oZHJfbGVuKHNrYi0+ZGV2KSkpCiAJCXJldHVybiBORl9EUk9QOwogCi0JaW5kZXYgPSBpbiA/IGluLT5uYW1lIDogbnVsbGRldm5hbWU7Ci0Jb3V0ZGV2ID0gb3V0ID8gb3V0LT5uYW1lIDogbnVsbGRldm5hbWU7CisJaW5kZXYgPSBzdGF0ZS0+aW4gPyBzdGF0ZS0+aW4tPm5hbWUgOiBudWxsZGV2bmFtZTsKKwlvdXRkZXYgPSBzdGF0ZS0+b3V0ID8gc3RhdGUtPm91dC0+bmFtZSA6IG51bGxkZXZuYW1lOwogCiAJbG9jYWxfYmhfZGlzYWJsZSgpOwogCWFkZGVuZCA9IHh0X3dyaXRlX3JlY3NlcV9iZWdpbigpOwpAQCAtMjgxLDggKzI4MCw4IEBACiAJZSA9IGdldF9lbnRyeSh0YWJsZV9iYXNlLCBwcml2YXRlLT5ob29rX2VudHJ5W2hvb2tdKTsKIAliYWNrID0gZ2V0X2VudHJ5KHRhYmxlX2Jhc2UsIHByaXZhdGUtPnVuZGVyZmxvd1tob29rXSk7CiAKLQlhY3Bhci5pbiAgICAgID0gaW47Ci0JYWNwYXIub3V0ICAgICA9IG91dDsKKwlhY3Bhci5pbiAgICAgID0gc3RhdGUtPmluOworCWFjcGFyLm91dCAgICAgPSBzdGF0ZS0+b3V0OwogCWFjcGFyLmhvb2tudW0gPSBob29rOwogCWFjcGFyLmZhbWlseSAgPSBORlBST1RPX0FSUDsKIAlhY3Bhci5ob3Rkcm9wID0gZmFsc2U7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdGFibGVfZmlsdGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvYXJwdGFibGVfZmlsdGVyLmMKaW5kZXggODAyZGRlYy4uOTM4NzZkMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2FycHRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9hcnB0YWJsZV9maWx0ZXIuYwpAQCAtMjgsMTIgKzI4LDExIEBACiAvKiBUaGUgd29yayBjb21lcyBpbiBoZXJlIGZyb20gbmV0ZmlsdGVyLmMgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGFycHRhYmxlX2ZpbHRlcl9ob29rKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JY29uc3Qgc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldCgoaW4gIT0gTlVMTCkgPyBpbiA6IG91dCk7CisJY29uc3Qgc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChzdGF0ZS0+aW4gPyBzdGF0ZS0+aW4gOiBzdGF0ZS0+b3V0KTsKIAotCXJldHVybiBhcnB0X2RvX3RhYmxlKHNrYiwgb3BzLT5ob29rbnVtLCBpbiwgb3V0LAorCXJldHVybiBhcnB0X2RvX3RhYmxlKHNrYiwgb3BzLT5ob29rbnVtLCBzdGF0ZSwKIAkJCSAgICAgbmV0LT5pcHY0LmFycHRhYmxlX2ZpbHRlcik7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcF90YWJsZXMuYwppbmRleCA5OWU4MTBmLi5jNjlkYjdmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfdGFibGVzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3RhYmxlcy5jCkBAIC0yNzIsOSArMjcyLDkgQEAKIAkJICAgICZjaGFpbm5hbWUsICZjb21tZW50LCAmcnVsZW51bSkgIT0gMCkKIAkJCWJyZWFrOwogCi0JbmZfbG9nX3BhY2tldChuZXQsIEFGX0lORVQsIGhvb2ssIHNrYiwgaW4sIG91dCwgJnRyYWNlX2xvZ2luZm8sCi0JCSAgICAgICJUUkFDRTogJXM6JXM6JXM6JXUgIiwKLQkJICAgICAgdGFibGVuYW1lLCBjaGFpbm5hbWUsIGNvbW1lbnQsIHJ1bGVudW0pOworCW5mX2xvZ190cmFjZShuZXQsIEFGX0lORVQsIGhvb2ssIHNrYiwgaW4sIG91dCwgJnRyYWNlX2xvZ2luZm8sCisJCSAgICAgIlRSQUNFOiAlczolczolczoldSAiLAorCQkgICAgIHRhYmxlbmFtZSwgY2hhaW5uYW1lLCBjb21tZW50LCBydWxlbnVtKTsKIH0KICNlbmRpZgogCkBAIC0yODgsOCArMjg4LDcgQEAKIHVuc2lnbmVkIGludAogaXB0X2RvX3RhYmxlKHN0cnVjdCBza19idWZmICpza2IsCiAJICAgICB1bnNpZ25lZCBpbnQgaG9vaywKLQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJICAgICBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKQogewogCXN0YXRpYyBjb25zdCBjaGFyIG51bGxkZXZuYW1lW0lGTkFNU0laXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKHNpemVvZihsb25nKSkpKTsKQEAgLTMwNiw4ICszMDUsOCBAQAogCiAJLyogSW5pdGlhbGl6YXRpb24gKi8KIAlpcCA9IGlwX2hkcihza2IpOwotCWluZGV2ID0gaW4gPyBpbi0+bmFtZSA6IG51bGxkZXZuYW1lOwotCW91dGRldiA9IG91dCA/IG91dC0+bmFtZSA6IG51bGxkZXZuYW1lOworCWluZGV2ID0gc3RhdGUtPmluID8gc3RhdGUtPmluLT5uYW1lIDogbnVsbGRldm5hbWU7CisJb3V0ZGV2ID0gc3RhdGUtPm91dCA/IHN0YXRlLT5vdXQtPm5hbWUgOiBudWxsZGV2bmFtZTsKIAkvKiBXZSBoYW5kbGUgZnJhZ21lbnRzIGJ5IGRlYWxpbmcgd2l0aCB0aGUgZmlyc3QgZnJhZ21lbnQgYXMKIAkgKiBpZiBpdCB3YXMgYSBub3JtYWwgcGFja2V0LiAgQWxsIG90aGVyIGZyYWdtZW50cyBhcmUgdHJlYXRlZAogCSAqIG5vcm1hbGx5LCBleGNlcHQgdGhhdCB0aGV5IHdpbGwgTkVWRVIgbWF0Y2ggcnVsZXMgdGhhdCBhc2sKQEAgLTMxNyw4ICszMTYsOCBAQAogCWFjcGFyLmZyYWdvZmYgPSBudG9ocyhpcC0+ZnJhZ19vZmYpICYgSVBfT0ZGU0VUOwogCWFjcGFyLnRob2ZmICAgPSBpcF9oZHJsZW4oc2tiKTsKIAlhY3Bhci5ob3Rkcm9wID0gZmFsc2U7Ci0JYWNwYXIuaW4gICAgICA9IGluOwotCWFjcGFyLm91dCAgICAgPSBvdXQ7CisJYWNwYXIuaW4gICAgICA9IHN0YXRlLT5pbjsKKwlhY3Bhci5vdXQgICAgID0gc3RhdGUtPm91dDsKIAlhY3Bhci5mYW1pbHkgID0gTkZQUk9UT19JUFY0OwogCWFjcGFyLmhvb2tudW0gPSBob29rOwogCkBAIC0zNzAsNyArMzY5LDcgQEAKICNpZiBJU19FTkFCTEVEKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RSQUNFKQogCQkvKiBUaGUgcGFja2V0IGlzIHRyYWNlZDogbG9nIGl0ICovCiAJCWlmICh1bmxpa2VseShza2ItPm5mX3RyYWNlKSkKLQkJCXRyYWNlX3BhY2tldChza2IsIGhvb2ssIGluLCBvdXQsCisJCQl0cmFjZV9wYWNrZXQoc2tiLCBob29rLCBzdGF0ZS0+aW4sIHN0YXRlLT5vdXQsCiAJCQkJICAgICB0YWJsZS0+bmFtZSwgcHJpdmF0ZSwgZSk7CiAjZW5kaWYKIAkJLyogU3RhbmRhcmQgdGFyZ2V0PyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfQ0xVU1RFUklQLmMKaW5kZXggZTkwZjgzYS4uNzcxYWIzZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9DTFVTVEVSSVAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X0NMVVNURVJJUC5jCkBAIC00MTgsNiArNDE4LDEzIEBACiAJaWYgKHJldCA8IDApCiAJCXByX2luZm8oImNhbm5vdCBsb2FkIGNvbm50cmFjayBzdXBwb3J0IGZvciBwcm90bz0ldVxuIiwKIAkJCXBhci0+ZmFtaWx5KTsKKworCWlmICghcGFyLT5uZXQtPnh0LmNsdXN0ZXJpcF9kZXByZWNhdGVkX3dhcm5pbmcpIHsKKwkJcHJfaW5mbygiaXB0X0NMVVNURVJJUCBpcyBkZXByZWNhdGVkIGFuZCBpdCB3aWxsIHJlbW92ZWQgc29vbiwgIgorCQkJInVzZSB4dF9jbHVzdGVyIGluc3RlYWRcbiIpOworCQlwYXItPm5ldC0+eHQuY2x1c3RlcmlwX2RlcHJlY2F0ZWRfd2FybmluZyA9IHRydWU7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDk3LDE0ICs1MDQsMTIgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGFycF9tYW5nbGUoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJc3RydWN0IGFycGhkciAqYXJwID0gYXJwX2hkcihza2IpOwogCXN0cnVjdCBhcnBfcGF5bG9hZCAqcGF5bG9hZDsKIAlzdHJ1Y3QgY2x1c3RlcmlwX2NvbmZpZyAqYzsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGluID8gaW4gOiBvdXQpOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc3RhdGUtPmluID8gc3RhdGUtPmluIDogc3RhdGUtPm91dCk7CiAKIAkvKiB3ZSBkb24ndCBjYXJlIGFib3V0IG5vbi1ldGhlcm5ldCBhbmQgbm9uLWlwdjQgQVJQICovCiAJaWYgKGFycC0+YXJfaHJkICE9IGh0b25zKEFSUEhSRF9FVEhFUikgfHwKQEAgLTUyOSwxMCArNTM0LDEwIEBACiAJICogYWRkcmVzc2VzIG9uIGRpZmZlcmVudCBpbnRlcmZhY3MuICBIb3dldmVyLCBpbiB0aGUgQ0xVU1RFUklQIGNhc2UKIAkgKiB0aGlzIHdvdWxkbid0IHdvcmssIHNpbmNlIHdlIGRpZG4ndCBzdWJzY3JpYmUgdGhlIG1jYXN0IGdyb3VwIG9uCiAJICogb3RoZXIgaW50ZXJmYWNlcyAqLwotCWlmIChjLT5kZXYgIT0gb3V0KSB7CisJaWYgKGMtPmRldiAhPSBzdGF0ZS0+b3V0KSB7CiAJCXByX2RlYnVnKCJub3QgbWFuZ2xpbmcgYXJwIHJlcGx5IG9uIGRpZmZlcmVudCAiCiAJCQkgImludGVyZmFjZTogY2lwJyVzJy1za2InJXMnXG4iLAotCQkJIGMtPmRldi0+bmFtZSwgb3V0LT5uYW1lKTsKKwkJCSBjLT5kZXYtPm5hbWUsIHN0YXRlLT5vdXQtPm5hbWUpOwogCQljbHVzdGVyaXBfY29uZmlnX3B1dChjKTsKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRUpFQ1QuYwppbmRleCA4ZjQ4ZjU1Li44NzkwN2Q0IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFSkVDVC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVKRUNULmMKQEAgLTM0LDMxICszNCwzMiBAQAogcmVqZWN0X3RnKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKIHsKIAljb25zdCBzdHJ1Y3QgaXB0X3JlamVjdF9pbmZvICpyZWplY3QgPSBwYXItPnRhcmdpbmZvOworCWludCBob29rID0gcGFyLT5ob29rbnVtOwogCiAJc3dpdGNoIChyZWplY3QtPndpdGgpIHsKIAljYXNlIElQVF9JQ01QX05FVF9VTlJFQUNIQUJMRToKLQkJbmZfc2VuZF91bnJlYWNoKHNrYiwgSUNNUF9ORVRfVU5SRUFDSCk7CisJCW5mX3NlbmRfdW5yZWFjaChza2IsIElDTVBfTkVUX1VOUkVBQ0gsIGhvb2spOwogCQlicmVhazsKIAljYXNlIElQVF9JQ01QX0hPU1RfVU5SRUFDSEFCTEU6Ci0JCW5mX3NlbmRfdW5yZWFjaChza2IsIElDTVBfSE9TVF9VTlJFQUNIKTsKKwkJbmZfc2VuZF91bnJlYWNoKHNrYiwgSUNNUF9IT1NUX1VOUkVBQ0gsIGhvb2spOwogCQlicmVhazsKIAljYXNlIElQVF9JQ01QX1BST1RfVU5SRUFDSEFCTEU6Ci0JCW5mX3NlbmRfdW5yZWFjaChza2IsIElDTVBfUFJPVF9VTlJFQUNIKTsKKwkJbmZfc2VuZF91bnJlYWNoKHNrYiwgSUNNUF9QUk9UX1VOUkVBQ0gsIGhvb2spOwogCQlicmVhazsKIAljYXNlIElQVF9JQ01QX1BPUlRfVU5SRUFDSEFCTEU6Ci0JCW5mX3NlbmRfdW5yZWFjaChza2IsIElDTVBfUE9SVF9VTlJFQUNIKTsKKwkJbmZfc2VuZF91bnJlYWNoKHNrYiwgSUNNUF9QT1JUX1VOUkVBQ0gsIGhvb2spOwogCQlicmVhazsKIAljYXNlIElQVF9JQ01QX05FVF9QUk9ISUJJVEVEOgotCQluZl9zZW5kX3VucmVhY2goc2tiLCBJQ01QX05FVF9BTk8pOworCQluZl9zZW5kX3VucmVhY2goc2tiLCBJQ01QX05FVF9BTk8sIGhvb2spOwogCQlicmVhazsKIAljYXNlIElQVF9JQ01QX0hPU1RfUFJPSElCSVRFRDoKLQkJbmZfc2VuZF91bnJlYWNoKHNrYiwgSUNNUF9IT1NUX0FOTyk7CisJCW5mX3NlbmRfdW5yZWFjaChza2IsIElDTVBfSE9TVF9BTk8sIGhvb2spOwogCQlicmVhazsKIAljYXNlIElQVF9JQ01QX0FETUlOX1BST0hJQklURUQ6Ci0JCW5mX3NlbmRfdW5yZWFjaChza2IsIElDTVBfUEtUX0ZJTFRFUkVEKTsKKwkJbmZfc2VuZF91bnJlYWNoKHNrYiwgSUNNUF9QS1RfRklMVEVSRUQsIGhvb2spOwogCQlicmVhazsKIAljYXNlIElQVF9UQ1BfUkVTRVQ6Ci0JCW5mX3NlbmRfcmVzZXQoc2tiLCBwYXItPmhvb2tudW0pOworCQluZl9zZW5kX3Jlc2V0KHNrYiwgaG9vayk7CiAJY2FzZSBJUFRfSUNNUF9FQ0hPUkVQTFk6CiAJCS8qIERvZXNuJ3QgaGFwcGVuLiAqLwogCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfU1lOUFJPWFkuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfU1lOUFJPWFkuYwppbmRleCBhMzEzYzNmLi5lOWU2Nzc5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1NZTlBST1hZLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9TWU5QUk9YWS5jCkBAIC0zMDAsMTEgKzMwMCw5IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXB2NF9zeW5wcm94eV9ob29rKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqbmhzKQogewotCXN0cnVjdCBzeW5wcm94eV9uZXQgKnNuZXQgPSBzeW5wcm94eV9wZXJuZXQoZGV2X25ldChpbiA/IDogb3V0KSk7CisJc3RydWN0IHN5bnByb3h5X25ldCAqc25ldCA9IHN5bnByb3h5X3Blcm5ldChkZXZfbmV0KG5ocy0+aW4gPyA6IG5ocy0+b3V0KSk7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCXN0cnVjdCBuZl9jb25uX3N5bnByb3h5ICpzeW5wcm94eTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKaW5kZXggZTA4YTc0YS4uYTBmM2JlYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfZmlsdGVyLmMKQEAgLTM0LDggKzM0LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludAogaXB0YWJsZV9maWx0ZXJfaG9vayhjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCWNvbnN0IHN0cnVjdCBuZXQgKm5ldDsKIApAQCAtNDUsOSArNDQsOCBAQAogCQkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAotCW5ldCA9IGRldl9uZXQoKGluICE9IE5VTEwpID8gaW4gOiBvdXQpOwotCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBvcHMtPmhvb2tudW0sIGluLCBvdXQsCi0JCQkgICAgbmV0LT5pcHY0LmlwdGFibGVfZmlsdGVyKTsKKwluZXQgPSBkZXZfbmV0KHN0YXRlLT5pbiA/IHN0YXRlLT5pbiA6IHN0YXRlLT5vdXQpOworCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBvcHMtPmhvb2tudW0sIHN0YXRlLCBuZXQtPmlwdjQuaXB0YWJsZV9maWx0ZXIpOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzICpmaWx0ZXJfb3BzIF9fcmVhZF9tb3N0bHk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9tYW5nbGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCmluZGV4IDZhNTA3OWMuLjYyY2JiOGMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX21hbmdsZS5jCkBAIC0zNyw4ICszNyw5IEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1pcHRfbWFuZ2xlX291dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0KQoraXB0X21hbmdsZV9vdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogeworCXN0cnVjdCBuZXRfZGV2aWNlICpvdXQgPSBzdGF0ZS0+b3V0OwogCXVuc2lnbmVkIGludCByZXQ7CiAJY29uc3Qgc3RydWN0IGlwaGRyICppcGg7CiAJdV9pbnQ4X3QgdG9zOwpAQCAtNTgsNyArNTksNyBAQAogCWRhZGRyID0gaXBoLT5kYWRkcjsKIAl0b3MgPSBpcGgtPnRvczsKIAotCXJldCA9IGlwdF9kb190YWJsZShza2IsIE5GX0lORVRfTE9DQUxfT1VULCBOVUxMLCBvdXQsCisJcmV0ID0gaXB0X2RvX3RhYmxlKHNrYiwgTkZfSU5FVF9MT0NBTF9PVVQsIHN0YXRlLAogCQkJICAgZGV2X25ldChvdXQpLT5pcHY0LmlwdGFibGVfbWFuZ2xlKTsKIAkvKiBSZXJvdXRlIGZvciBBTlkgY2hhbmdlLiAqLwogCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOKSB7CkBAIC04MSwxOCArODIsMTYgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGlwdGFibGVfbWFuZ2xlX2hvb2soY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJaWYgKG9wcy0+aG9va251bSA9PSBORl9JTkVUX0xPQ0FMX09VVCkKLQkJcmV0dXJuIGlwdF9tYW5nbGVfb3V0KHNrYiwgb3V0KTsKKwkJcmV0dXJuIGlwdF9tYW5nbGVfb3V0KHNrYiwgc3RhdGUpOwogCWlmIChvcHMtPmhvb2tudW0gPT0gTkZfSU5FVF9QT1NUX1JPVVRJTkcpCi0JCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBvcHMtPmhvb2tudW0sIGluLCBvdXQsCi0JCQkJICAgIGRldl9uZXQob3V0KS0+aXB2NC5pcHRhYmxlX21hbmdsZSk7CisJCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBvcHMtPmhvb2tudW0sIHN0YXRlLAorCQkJCSAgICBkZXZfbmV0KHN0YXRlLT5vdXQpLT5pcHY0LmlwdGFibGVfbWFuZ2xlKTsKIAkvKiBQUkVST1VUSU5HL0lOUFVUL0ZPUldBUkQ6ICovCi0JcmV0dXJuIGlwdF9kb190YWJsZShza2IsIG9wcy0+aG9va251bSwgaW4sIG91dCwKLQkJCSAgICBkZXZfbmV0KGluKS0+aXB2NC5pcHRhYmxlX21hbmdsZSk7CisJcmV0dXJuIGlwdF9kb190YWJsZShza2IsIG9wcy0+aG9va251bSwgc3RhdGUsCisJCQkgICAgZGV2X25ldChzdGF0ZS0+aW4pLT5pcHY0LmlwdGFibGVfbWFuZ2xlKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyAqbWFuZ2xlX29wcyBfX3JlYWRfbW9zdGx5OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfbmF0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9uYXQuYwppbmRleCA2YjY3ZDdlLi4wZDRkOWNkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9uYXQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9uYXQuYwpAQCAtMzAsNDkgKzMwLDQwIEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXB0YWJsZV9uYXRfZG9fY2hhaW4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkJIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkJCQkJIHN0cnVjdCBuZl9jb25uICpjdCkKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCi0JcmV0dXJuIGlwdF9kb190YWJsZShza2IsIG9wcy0+aG9va251bSwgaW4sIG91dCwgbmV0LT5pcHY0Lm5hdF90YWJsZSk7CisJcmV0dXJuIGlwdF9kb190YWJsZShza2IsIG9wcy0+aG9va251bSwgc3RhdGUsIG5ldC0+aXB2NC5uYXRfdGFibGUpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlwdGFibGVfbmF0X2lwdjRfZm4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkJaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJCWNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKLQlyZXR1cm4gbmZfbmF0X2lwdjRfZm4ob3BzLCBza2IsIGluLCBvdXQsIGlwdGFibGVfbmF0X2RvX2NoYWluKTsKKwlyZXR1cm4gbmZfbmF0X2lwdjRfZm4ob3BzLCBza2IsIHN0YXRlLCBpcHRhYmxlX25hdF9kb19jaGFpbik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXB0YWJsZV9uYXRfaXB2NF9pbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewotCXJldHVybiBuZl9uYXRfaXB2NF9pbihvcHMsIHNrYiwgaW4sIG91dCwgaXB0YWJsZV9uYXRfZG9fY2hhaW4pOworCXJldHVybiBuZl9uYXRfaXB2NF9pbihvcHMsIHNrYiwgc3RhdGUsIGlwdGFibGVfbmF0X2RvX2NoYWluKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBpcHRhYmxlX25hdF9pcHY0X291dChjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCQkgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJCSBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JcmV0dXJuIG5mX25hdF9pcHY0X291dChvcHMsIHNrYiwgaW4sIG91dCwgaXB0YWJsZV9uYXRfZG9fY2hhaW4pOworCXJldHVybiBuZl9uYXRfaXB2NF9vdXQob3BzLCBza2IsIHN0YXRlLCBpcHRhYmxlX25hdF9kb19jaGFpbik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXB0YWJsZV9uYXRfaXB2NF9sb2NhbF9mbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkJICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewotCXJldHVybiBuZl9uYXRfaXB2NF9sb2NhbF9mbihvcHMsIHNrYiwgaW4sIG91dCwgaXB0YWJsZV9uYXRfZG9fY2hhaW4pOworCXJldHVybiBuZl9uYXRfaXB2NF9sb2NhbF9mbihvcHMsIHNrYiwgc3RhdGUsIGlwdGFibGVfbmF0X2RvX2NoYWluKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyBuZl9uYXRfaXB2NF9vcHNbXSBfX3JlYWRfbW9zdGx5ID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfcmF3LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYwppbmRleCBiMmY3ZThmLi4wMzU2ZTZkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9yYXcuYwpAQCAtMjEsOCArMjEsNyBAQAogLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLwogc3RhdGljIHVuc2lnbmVkIGludAogaXB0YWJsZV9yYXdfaG9vayhjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCWNvbnN0IHN0cnVjdCBuZXQgKm5ldDsKIApAQCAtMzIsOCArMzEsOCBAQAogCQkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAotCW5ldCA9IGRldl9uZXQoKGluICE9IE5VTEwpID8gaW4gOiBvdXQpOwotCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBvcHMtPmhvb2tudW0sIGluLCBvdXQsIG5ldC0+aXB2NC5pcHRhYmxlX3Jhdyk7CisJbmV0ID0gZGV2X25ldChzdGF0ZS0+aW4gPyBzdGF0ZS0+aW4gOiBzdGF0ZS0+b3V0KTsKKwlyZXR1cm4gaXB0X2RvX3RhYmxlKHNrYiwgb3BzLT5ob29rbnVtLCBzdGF0ZSwgbmV0LT5pcHY0LmlwdGFibGVfcmF3KTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZl9ob29rX29wcyAqcmF3dGFibGVfb3BzIF9fcmVhZF9tb3N0bHk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9zZWN1cml0eS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdGFibGVfc2VjdXJpdHkuYwppbmRleCBjODY2NDdlLi40YmNlMzk4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9zZWN1cml0eS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX3NlY3VyaXR5LmMKQEAgLTM4LDkgKzM4LDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludAogaXB0YWJsZV9zZWN1cml0eV9ob29rKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJY29uc3Qgc3RydWN0IG5ldCAqbmV0OwogCkBAIC01MCw4ICs0OCw4IEBACiAJCS8qIFNvbWVib2R5IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAotCW5ldCA9IGRldl9uZXQoKGluICE9IE5VTEwpID8gaW4gOiBvdXQpOwotCXJldHVybiBpcHRfZG9fdGFibGUoc2tiLCBvcHMtPmhvb2tudW0sIGluLCBvdXQsCisJbmV0ID0gZGV2X25ldChzdGF0ZS0+aW4gPyBzdGF0ZS0+aW4gOiBzdGF0ZS0+b3V0KTsKKwlyZXR1cm4gaXB0X2RvX3RhYmxlKHNrYiwgb3BzLT5ob29rbnVtLCBzdGF0ZSwKIAkJCSAgICBuZXQtPmlwdjQuaXB0YWJsZV9zZWN1cml0eSk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NC5jCmluZGV4IDVjNjEzMjguLjMwYWQ5NTUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjQuYwpAQCAtOTQsOSArOTQsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlwdjRfaGVscGVyKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKQEAgLTEyMyw5ICsxMjEsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlwdjRfY29uZmlybShjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBuZl9jb25uICpjdDsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKQEAgLTE0OSwyNCArMTQ1LDIwIEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXB2NF9jb25udHJhY2tfaW4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JcmV0dXJuIG5mX2Nvbm50cmFja19pbihkZXZfbmV0KGluKSwgUEZfSU5FVCwgb3BzLT5ob29rbnVtLCBza2IpOworCXJldHVybiBuZl9jb25udHJhY2tfaW4oZGV2X25ldChzdGF0ZS0+aW4pLCBQRl9JTkVULCBvcHMtPmhvb2tudW0sIHNrYik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXB2NF9jb25udHJhY2tfbG9jYWwoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCQkgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCS8qIHJvb3QgaXMgcGxheWluZyB3aXRoIHJhdyBzb2NrZXRzLiAqLwogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpIHx8CiAJICAgIGlwX2hkcmxlbihza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCiAJCXJldHVybiBORl9BQ0NFUFQ7Ci0JcmV0dXJuIG5mX2Nvbm50cmFja19pbihkZXZfbmV0KG91dCksIFBGX0lORVQsIG9wcy0+aG9va251bSwgc2tiKTsKKwlyZXR1cm4gbmZfY29ubnRyYWNrX2luKGRldl9uZXQoc3RhdGUtPm91dCksIFBGX0lORVQsIG9wcy0+aG9va251bSwgc2tiKTsKIH0KIAogLyogQ29ubmVjdGlvbiB0cmFja2luZyBtYXkgZHJvcCBwYWNrZXRzLCBidXQgbmV2ZXIgYWx0ZXJzIHRoZW0sIHNvCkBAIC0zMjIsOCArMzE0LDggQEAKIHN0YXRpYyBpbnQgaXB2NF90dXBsZV90b19ubGF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSkKIHsKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgQ1RBX0lQX1Y0X1NSQywgdHVwbGUtPnNyYy51My5pcCkgfHwKLQkgICAgbmxhX3B1dF9iZTMyKHNrYiwgQ1RBX0lQX1Y0X0RTVCwgdHVwbGUtPmRzdC51My5pcCkpCisJaWYgKG5sYV9wdXRfaW5fYWRkcihza2IsIENUQV9JUF9WNF9TUkMsIHR1cGxlLT5zcmMudTMuaXApIHx8CisJICAgIG5sYV9wdXRfaW5fYWRkcihza2IsIENUQV9JUF9WNF9EU1QsIHR1cGxlLT5kc3QudTMuaXApKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlyZXR1cm4gMDsKIApAQCAtMzQyLDggKzMzNCw4IEBACiAJaWYgKCF0YltDVEFfSVBfVjRfU1JDXSB8fCAhdGJbQ1RBX0lQX1Y0X0RTVF0pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdC0+c3JjLnUzLmlwID0gbmxhX2dldF9iZTMyKHRiW0NUQV9JUF9WNF9TUkNdKTsKLQl0LT5kc3QudTMuaXAgPSBubGFfZ2V0X2JlMzIodGJbQ1RBX0lQX1Y0X0RTVF0pOworCXQtPnNyYy51My5pcCA9IG5sYV9nZXRfaW5fYWRkcih0YltDVEFfSVBfVjRfU1JDXSk7CisJdC0+ZHN0LnUzLmlwID0gbmxhX2dldF9pbl9hZGRyKHRiW0NUQV9JUF9WNF9EU1RdKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjRfY29tcGF0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NF9jb21wYXQuYwppbmRleCBhNDYwYTg3Li5mMGRmZTkyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NF9jb21wYXQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2NF9jb21wYXQuYwpAQCAtMzAwLDcgKzMwMCw5IEBACiAJCSAgICBfX25mX2N0X2wzcHJvdG9fZmluZChleHAtPnR1cGxlLnNyYy5sM251bSksCiAJCSAgICBfX25mX2N0X2w0cHJvdG9fZmluZChleHAtPnR1cGxlLnNyYy5sM251bSwKIAkJCQkJIGV4cC0+dHVwbGUuZHN0LnByb3RvbnVtKSk7Ci0JcmV0dXJuIHNlcV9wdXRjKHMsICdcbicpOworCXNlcV9wdXRjKHMsICdcbicpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgZXhwX3NlcV9vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfZGVmcmFnX2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2NC5jCmluZGV4IDdlNWNhNmYuLmM4OGI3ZDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2NC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2NC5jCkBAIC02Myw5ICs2Myw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXB2NF9jb25udHJhY2tfZGVmcmFnKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJCSAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNrYi0+c2s7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2tiLT5zayk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbG9nX2FycC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19hcnAuYwppbmRleCBkMDU5MTgyLi5lN2FkOTUwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbG9nX2FycC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9sb2dfYXJwLmMKQEAgLTEwLDggKzEwLDEwIEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKwogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTI3LDcgKzI5LDcgQEAKIAkudHlwZQk9IE5GX0xPR19UWVBFX0xPRywKIAkudSA9IHsKIAkJLmxvZyA9IHsKLQkJCS5sZXZlbAkgID0gNSwKKwkJCS5sZXZlbAkgID0gTE9HTEVWRUxfTk9USUNFLAogCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX01BU0ssCiAJCX0sCiAJfSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9sb2dfaXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19pcHY0LmMKaW5kZXggNzUxMDE5OC4uMDc2YWFkZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX2xvZ19pcHY0LmMKQEAgLTUsOCArNSwxMCBAQAogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCisKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CkBAIC0yNiw3ICsyOCw3IEBACiAJLnR5cGUJPSBORl9MT0dfVFlQRV9MT0csCiAJLnUgPSB7CiAJCS5sb2cgPSB7Ci0JCQkubGV2ZWwJICA9IDUsCisJCQkubGV2ZWwJICA9IExPR0xFVkVMX05PVElDRSwKIAkJCS5sb2dmbGFncyA9IE5GX0xPR19NQVNLLAogCQl9LAogCX0sCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2wzcHJvdG9faXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9sM3Byb3RvX2lwdjQuYwppbmRleCBmYzM3NzExLi5lNTljYzA1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2wzcHJvdG9faXB2NC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfbDNwcm90b19pcHY0LmMKQEAgLTI1NiwxMSArMjU2LDEwIEBACiAKIHVuc2lnbmVkIGludAogbmZfbmF0X2lwdjRfZm4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsIHN0cnVjdCBza19idWZmICpza2IsCi0JICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCSAgICAgICB1bnNpZ25lZCBpbnQgKCpkb19jaGFpbikoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkJCQlzdHJ1Y3QgbmZfY29ubiAqY3QpKQogewogCXN0cnVjdCBuZl9jb25uICpjdDsKQEAgLTMwOSw3ICszMDgsNyBAQAogCQlpZiAoIW5mX25hdF9pbml0aWFsaXplZChjdCwgbWFuaXB0eXBlKSkgewogCQkJdW5zaWduZWQgaW50IHJldDsKIAotCQkJcmV0ID0gZG9fY2hhaW4ob3BzLCBza2IsIGluLCBvdXQsIGN0KTsKKwkJCXJldCA9IGRvX2NoYWluKG9wcywgc2tiLCBzdGF0ZSwgY3QpOwogCQkJaWYgKHJldCAhPSBORl9BQ0NFUFQpCiAJCQkJcmV0dXJuIHJldDsKIApAQCAtMzIzLDcgKzMyMiw4IEBACiAJCQlwcl9kZWJ1ZygiQWxyZWFkeSBzZXR1cCBtYW5pcCAlcyBmb3IgY3QgJXBcbiIsCiAJCQkJIG1hbmlwdHlwZSA9PSBORl9OQVRfTUFOSVBfU1JDID8gIlNSQyIgOiAiRFNUIiwKIAkJCQkgY3QpOwotCQkJaWYgKG5mX25hdF9vaWZfY2hhbmdlZChvcHMtPmhvb2tudW0sIGN0aW5mbywgbmF0LCBvdXQpKQorCQkJaWYgKG5mX25hdF9vaWZfY2hhbmdlZChvcHMtPmhvb2tudW0sIGN0aW5mbywgbmF0LAorCQkJCQkgICAgICAgc3RhdGUtPm91dCkpCiAJCQkJZ290byBvaWZfY2hhbmdlZDsKIAkJfQogCQlicmVhazsKQEAgLTMzMiw3ICszMzIsNyBAQAogCQkvKiBFU1RBQkxJU0hFRCAqLwogCQlORl9DVF9BU1NFUlQoY3RpbmZvID09IElQX0NUX0VTVEFCTElTSEVEIHx8CiAJCQkgICAgIGN0aW5mbyA9PSBJUF9DVF9FU1RBQkxJU0hFRF9SRVBMWSk7Ci0JCWlmIChuZl9uYXRfb2lmX2NoYW5nZWQob3BzLT5ob29rbnVtLCBjdGluZm8sIG5hdCwgb3V0KSkKKwkJaWYgKG5mX25hdF9vaWZfY2hhbmdlZChvcHMtPmhvb2tudW0sIGN0aW5mbywgbmF0LCBzdGF0ZS0+b3V0KSkKIAkJCWdvdG8gb2lmX2NoYW5nZWQ7CiAJfQogCkBAIC0zNDYsMTcgKzM0NiwxNiBAQAogCiB1bnNpZ25lZCBpbnQKIG5mX25hdF9pcHY0X2luKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkgICAgICAgdW5zaWduZWQgaW50ICgqZG9fY2hhaW4pKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJCSBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJCQkJCSBzdHJ1Y3QgbmZfY29ubiAqY3QpKQogewogCXVuc2lnbmVkIGludCByZXQ7CiAJX19iZTMyIGRhZGRyID0gaXBfaGRyKHNrYiktPmRhZGRyOwogCi0JcmV0ID0gbmZfbmF0X2lwdjRfZm4ob3BzLCBza2IsIGluLCBvdXQsIGRvX2NoYWluKTsKKwlyZXQgPSBuZl9uYXRfaXB2NF9mbihvcHMsIHNrYiwgc3RhdGUsIGRvX2NoYWluKTsKIAlpZiAocmV0ICE9IE5GX0RST1AgJiYgcmV0ICE9IE5GX1NUT0xFTiAmJgogCSAgICBkYWRkciAhPSBpcF9oZHIoc2tiKS0+ZGFkZHIpCiAJCXNrYl9kc3RfZHJvcChza2IpOwpAQCAtMzY3LDExICszNjYsMTAgQEAKIAogdW5zaWduZWQgaW50CiBuZl9uYXRfaXB2NF9vdXQoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsIHN0cnVjdCBza19idWZmICpza2IsCi0JCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQl1bnNpZ25lZCBpbnQgKCpkb19jaGFpbikoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJCQkJCSAgc3RydWN0IG5mX2Nvbm4gKmN0KSkKIHsKICNpZmRlZiBDT05GSUdfWEZSTQpAQCAtMzg2LDcgKzM4NCw3IEBACiAJICAgIGlwX2hkcmxlbihza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKLQlyZXQgPSBuZl9uYXRfaXB2NF9mbihvcHMsIHNrYiwgaW4sIG91dCwgZG9fY2hhaW4pOworCXJldCA9IG5mX25hdF9pcHY0X2ZuKG9wcywgc2tiLCBzdGF0ZSwgZG9fY2hhaW4pOwogI2lmZGVmIENPTkZJR19YRlJNCiAJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4gJiYKIAkgICAgIShJUENCKHNrYiktPmZsYWdzICYgSVBTS0JfWEZSTV9UUkFOU0ZPUk1FRCkgJiYKQEAgLTQxMCwxMSArNDA4LDEwIEBACiAKIHVuc2lnbmVkIGludAogbmZfbmF0X2lwdjRfbG9jYWxfZm4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkJICAgICB1bnNpZ25lZCBpbnQgKCpkb19jaGFpbikoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkJCQkJICAgICAgIHN0cnVjdCBuZl9jb25uICpjdCkpCiB7CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0OwpAQCAtNDI3LDcgKzQyNCw3IEBACiAJICAgIGlwX2hkcmxlbihza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKLQlyZXQgPSBuZl9uYXRfaXB2NF9mbihvcHMsIHNrYiwgaW4sIG91dCwgZG9fY2hhaW4pOworCXJldCA9IG5mX25hdF9pcHY0X2ZuKG9wcywgc2tiLCBzdGF0ZSwgZG9fY2hhaW4pOwogCWlmIChyZXQgIT0gTkZfRFJPUCAmJiByZXQgIT0gTkZfU1RPTEVOICYmCiAJICAgIChjdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pKSAhPSBOVUxMKSB7CiAJCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIgPSBDVElORk8yRElSKGN0aW5mbyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfcmVqZWN0X2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9yZWplY3RfaXB2NC5jCmluZGV4IDUzNmRhN2IuLjMyNjJlNDEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9yZWplY3RfaXB2NC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9yZWplY3RfaXB2NC5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bmV0L2RzdC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2NC9uZl9yZWplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjQvbmZfcmVqZWN0Lmg+CiAKIGNvbnN0IHN0cnVjdCB0Y3BoZHIgKm5mX3JlamVjdF9pcF90Y3BoZHJfZ2V0KHN0cnVjdCBza19idWZmICpvbGRza2IsCkBAIC00Myw3ICs0NCw3IEBACiAKIHN0cnVjdCBpcGhkciAqbmZfcmVqZWN0X2lwaGRyX3B1dChzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpvbGRza2IsCi0JCQkJICBfX2JlMTYgcHJvdG9jb2wsIGludCB0dGwpCisJCQkJICBfX3U4IHByb3RvY29sLCBpbnQgdHRsKQogewogCXN0cnVjdCBpcGhkciAqbmlwaCwgKm9pcGggPSBpcF9oZHIob2xkc2tiKTsKIApAQCAtMTQ2LDcgKzE0Nyw4IEBACiAJICovCiAJaWYgKG9sZHNrYi0+bmZfYnJpZGdlKSB7CiAJCXN0cnVjdCBldGhoZHIgKm9ldGggPSBldGhfaGRyKG9sZHNrYik7Ci0JCW5za2ItPmRldiA9IG9sZHNrYi0+bmZfYnJpZGdlLT5waHlzaW5kZXY7CisKKwkJbnNrYi0+ZGV2ID0gbmZfYnJpZGdlX2dldF9waHlzaW5kZXYob2xkc2tiKTsKIAkJbmlwaC0+dG90X2xlbiA9IGh0b25zKG5za2ItPmxlbik7CiAJCWlwX3NlbmRfY2hlY2sobmlwaCk7CiAJCWlmIChkZXZfaGFyZF9oZWFkZXIobnNrYiwgbnNrYi0+ZGV2LCBudG9ocyhuc2tiLT5wcm90b2NvbCksCkBAIC0xNjQsNCArMTY2LDI3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChuZl9zZW5kX3Jlc2V0KTsKIAordm9pZCBuZl9zZW5kX3VucmVhY2goc3RydWN0IHNrX2J1ZmYgKnNrYl9pbiwgaW50IGNvZGUsIGludCBob29rKQoreworCXN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYl9pbik7CisJdTggcHJvdG87CisKKwlpZiAoc2tiX2luLT5jc3VtX2JhZCB8fCBpcGgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKSkKKwkJcmV0dXJuOworCisJaWYgKHNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYl9pbikpIHsKKwkJaWNtcF9zZW5kKHNrYl9pbiwgSUNNUF9ERVNUX1VOUkVBQ0gsIGNvZGUsIDApOworCQlyZXR1cm47CisJfQorCisJaWYgKGlwaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1AgfHwgaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCkKKwkJcHJvdG8gPSBpcGgtPnByb3RvY29sOworCWVsc2UKKwkJcHJvdG8gPSAwOworCisJaWYgKG5mX2lwX2NoZWNrc3VtKHNrYl9pbiwgaG9vaywgaXBfaGRybGVuKHNrYl9pbiksIHByb3RvKSA9PSAwKQorCQlpY21wX3NlbmQoc2tiX2luLCBJQ01QX0RFU1RfVU5SRUFDSCwgY29kZSwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZl9zZW5kX3VucmVhY2gpOworCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FycC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX3RhYmxlc19hcnAuYwppbmRleCAxOTQxMmE0Li44NDEyMjY4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FycC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl90YWJsZXNfYXJwLmMKQEAgLTE3LDEzICsxNywxMSBAQAogc3RhdGljIHVuc2lnbmVkIGludAogbmZ0X2RvX2NoYWluX2FycChjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKIAlzdHJ1Y3QgbmZ0X3BrdGluZm8gcGt0OwogCi0JbmZ0X3NldF9wa3RpbmZvKCZwa3QsIG9wcywgc2tiLCBpbiwgb3V0KTsKKwluZnRfc2V0X3BrdGluZm8oJnBrdCwgb3BzLCBza2IsIHN0YXRlKTsKIAogCXJldHVybiBuZnRfZG9fY2hhaW4oJnBrdCwgb3BzKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl90YWJsZXNfaXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY0LmMKaW5kZXggNjgyMGM4Yy4uYWExODBkMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX3RhYmxlc19pcHY0LmMKQEAgLTIwLDIyICsyMCwxOCBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IG5mdF9kb19jaGFpbl9pcHY0KGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBuZnRfcGt0aW5mbyBwa3Q7CiAKLQluZnRfc2V0X3BrdGluZm9faXB2NCgmcGt0LCBvcHMsIHNrYiwgaW4sIG91dCk7CisJbmZ0X3NldF9wa3RpbmZvX2lwdjQoJnBrdCwgb3BzLCBza2IsIHN0YXRlKTsKIAogCXJldHVybiBuZnRfZG9fY2hhaW4oJnBrdCwgb3BzKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBuZnRfaXB2NF9vdXRwdXQoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKIAlpZiAodW5saWtlbHkoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwaGRyKSB8fAogCQkgICAgIGlwX2hkcihza2IpLT5paGwgPCBzaXplb2Yoc3RydWN0IGlwaGRyKSAvIDQpKSB7CkBAIC00NSw3ICs0MSw3IEBACiAJCXJldHVybiBORl9BQ0NFUFQ7CiAJfQogCi0JcmV0dXJuIG5mdF9kb19jaGFpbl9pcHY0KG9wcywgc2tiLCBpbiwgb3V0LCBva2ZuKTsKKwlyZXR1cm4gbmZ0X2RvX2NoYWluX2lwdjQob3BzLCBza2IsIHN0YXRlKTsKIH0KIAogc3RydWN0IG5mdF9hZl9pbmZvIG5mdF9hZl9pcHY0IF9fcmVhZF9tb3N0bHkgPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX25hdF9pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX25hdF9pcHY0LmMKaW5kZXggZGY1NDdiZjUuLmJmNWMzMGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZnRfY2hhaW5fbmF0X2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX25hdF9pcHY0LmMKQEAgLTI4LDUxICsyOCw0MiBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IG5mdF9uYXRfZG9fY2hhaW4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJCQkJICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0KQogewogCXN0cnVjdCBuZnRfcGt0aW5mbyBwa3Q7CiAKLQluZnRfc2V0X3BrdGluZm9faXB2NCgmcGt0LCBvcHMsIHNrYiwgaW4sIG91dCk7CisJbmZ0X3NldF9wa3RpbmZvX2lwdjQoJnBrdCwgb3BzLCBza2IsIHN0YXRlKTsKIAogCXJldHVybiBuZnRfZG9fY2hhaW4oJnBrdCwgb3BzKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBuZnRfbmF0X2lwdjRfZm4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKLQlyZXR1cm4gbmZfbmF0X2lwdjRfZm4ob3BzLCBza2IsIGluLCBvdXQsIG5mdF9uYXRfZG9fY2hhaW4pOworCXJldHVybiBuZl9uYXRfaXB2NF9mbihvcHMsIHNrYiwgc3RhdGUsIG5mdF9uYXRfZG9fY2hhaW4pOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IG5mdF9uYXRfaXB2NF9pbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewotCXJldHVybiBuZl9uYXRfaXB2NF9pbihvcHMsIHNrYiwgaW4sIG91dCwgbmZ0X25hdF9kb19jaGFpbik7CisJcmV0dXJuIG5mX25hdF9pcHY0X2luKG9wcywgc2tiLCBzdGF0ZSwgbmZ0X25hdF9kb19jaGFpbik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmZ0X25hdF9pcHY0X291dChjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JcmV0dXJuIG5mX25hdF9pcHY0X291dChvcHMsIHNrYiwgaW4sIG91dCwgbmZ0X25hdF9kb19jaGFpbik7CisJcmV0dXJuIG5mX25hdF9pcHY0X291dChvcHMsIHNrYiwgc3RhdGUsIG5mdF9uYXRfZG9fY2hhaW4pOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IG5mdF9uYXRfaXB2NF9sb2NhbF9mbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCQkgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCQkgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKLQlyZXR1cm4gbmZfbmF0X2lwdjRfbG9jYWxfZm4ob3BzLCBza2IsIGluLCBvdXQsIG5mdF9uYXRfZG9fY2hhaW4pOworCXJldHVybiBuZl9uYXRfaXB2NF9sb2NhbF9mbihvcHMsIHNrYiwgc3RhdGUsIG5mdF9uYXRfZG9fY2hhaW4pOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5mX2NoYWluX3R5cGUgbmZ0X2NoYWluX25hdF9pcHY0ID0gewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9jaGFpbl9yb3V0ZV9pcHY0LmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjQuYwppbmRleCAxMjViNjY3Li5lMzM1YjBhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjQuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjQuYwpAQCAtMjMsOSArMjMsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IG5mX3JvdXRlX3RhYmxlX2hvb2soY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkJaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJCWNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKIAl1bnNpZ25lZCBpbnQgcmV0OwogCXN0cnVjdCBuZnRfcGt0aW5mbyBwa3Q7CkBAIC0zOSw3ICszNyw3IEBACiAJICAgIGlwX2hkcmxlbihza2IpIDwgc2l6ZW9mKHN0cnVjdCBpcGhkcikpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKLQluZnRfc2V0X3BrdGluZm9faXB2NCgmcGt0LCBvcHMsIHNrYiwgaW4sIG91dCk7CisJbmZ0X3NldF9wa3RpbmZvX2lwdjQoJnBrdCwgb3BzLCBza2IsIHN0YXRlKTsKIAogCW1hcmsgPSBza2ItPm1hcms7CiAJaXBoID0gaXBfaGRyKHNrYik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X21hc3FfaXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9tYXNxX2lwdjQuYwppbmRleCA2NjVkZTA2Li40MGU0MTRjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X21hc3FfaXB2NC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZnRfbWFzcV9pcHY0LmMKQEAgLTE3LDIwICsxNywxNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2NC9uZl9uYXRfbWFzcXVlcmFkZS5oPgogCiBzdGF0aWMgdm9pZCBuZnRfbWFzcV9pcHY0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkgICAgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCXN0cnVjdCBuZnRfbWFzcSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZTsKLQl1bnNpZ25lZCBpbnQgdmVyZGljdDsKIAogCW1lbXNldCgmcmFuZ2UsIDAsIHNpemVvZihyYW5nZSkpOwogCXJhbmdlLmZsYWdzID0gcHJpdi0+ZmxhZ3M7CiAKLQl2ZXJkaWN0ID0gbmZfbmF0X21hc3F1ZXJhZGVfaXB2NChwa3QtPnNrYiwgcGt0LT5vcHMtPmhvb2tudW0sCi0JCQkJCSAmcmFuZ2UsIHBrdC0+b3V0KTsKLQotCWRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0ID0gdmVyZGljdDsKKwlyZWdzLT52ZXJkaWN0LmNvZGUgPSBuZl9uYXRfbWFzcXVlcmFkZV9pcHY0KHBrdC0+c2tiLCBwa3QtPm9wcy0+aG9va251bSwKKwkJCQkJCSAgICAmcmFuZ2UsIHBrdC0+b3V0KTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9tYXNxX2lwdjRfdHlwZTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZnRfcmVkaXJfaXB2NC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9yZWRpcl9pcHY0LmMKaW5kZXggNmVjZmNlNi4uZDhkNzk1ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9yZWRpcl9pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9yZWRpcl9pcHY0LmMKQEAgLTE4LDI2ICsxOCwyNSBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZ0X3JlZGlyLmg+CiAKIHN0YXRpYyB2b2lkIG5mdF9yZWRpcl9pcHY0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJCXN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkJc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkJCWNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCXN0cnVjdCBuZnRfcmVkaXIgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwogCXN0cnVjdCBuZl9uYXRfaXB2NF9tdWx0aV9yYW5nZV9jb21wYXQgbXI7Ci0JdW5zaWduZWQgaW50IHZlcmRpY3Q7CiAKIAltZW1zZXQoJm1yLCAwLCBzaXplb2YobXIpKTsKIAlpZiAocHJpdi0+c3JlZ19wcm90b19taW4pIHsKIAkJbXIucmFuZ2VbMF0ubWluLmFsbCA9Ci0JCQkqKF9fYmUxNiAqKSZkYXRhW3ByaXYtPnNyZWdfcHJvdG9fbWluXS5kYXRhWzBdOworCQkJKihfX2JlMTYgKikmcmVncy0+ZGF0YVtwcml2LT5zcmVnX3Byb3RvX21pbl07CiAJCW1yLnJhbmdlWzBdLm1heC5hbGwgPQotCQkJKihfX2JlMTYgKikmZGF0YVtwcml2LT5zcmVnX3Byb3RvX21heF0uZGF0YVswXTsKKwkJCSooX19iZTE2ICopJnJlZ3MtPmRhdGFbcHJpdi0+c3JlZ19wcm90b19tYXhdOwogCQltci5yYW5nZVswXS5mbGFncyB8PSBORl9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOwogCX0KIAogCW1yLnJhbmdlWzBdLmZsYWdzIHw9IHByaXYtPmZsYWdzOwogCi0JdmVyZGljdCA9IG5mX25hdF9yZWRpcmVjdF9pcHY0KHBrdC0+c2tiLCAmbXIsIHBrdC0+b3BzLT5ob29rbnVtKTsKLQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IHZlcmRpY3Q7CisJcmVncy0+dmVyZGljdC5jb2RlID0gbmZfbmF0X3JlZGlyZWN0X2lwdjQocGt0LT5za2IsICZtciwKKwkJCQkJCSAgcGt0LT5vcHMtPmhvb2tudW0pOwogfQogCiBzdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3JlZGlyX2lwdjRfdHlwZTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjQuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjQuYwppbmRleCBkNzI5NTQyLi5iMDdlNThiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY0LmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2NC5jCkBAIC0yMCwyMSArMjAsMjQgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mdF9yZWplY3QuaD4KIAogc3RhdGljIHZvaWQgbmZ0X3JlamVjdF9pcHY0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJCSBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJCSBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCiAJCQkJIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCXN0cnVjdCBuZnRfcmVqZWN0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKIAogCXN3aXRjaCAocHJpdi0+dHlwZSkgewogCWNhc2UgTkZUX1JFSkVDVF9JQ01QX1VOUkVBQ0g6Ci0JCW5mX3NlbmRfdW5yZWFjaChwa3QtPnNrYiwgcHJpdi0+aWNtcF9jb2RlKTsKKwkJbmZfc2VuZF91bnJlYWNoKHBrdC0+c2tiLCBwcml2LT5pY21wX2NvZGUsCisJCQkJcGt0LT5vcHMtPmhvb2tudW0pOwogCQlicmVhazsKIAljYXNlIE5GVF9SRUpFQ1RfVENQX1JTVDoKIAkJbmZfc2VuZF9yZXNldChwa3QtPnNrYiwgcGt0LT5vcHMtPmhvb2tudW0pOwogCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAKLQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GX0RST1A7CisJcmVncy0+dmVyZGljdC5jb2RlID0gTkZfRFJPUDsKIH0KIAogc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9yZWplY3RfaXB2NF90eXBlOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcGluZy5jIGIvbmV0L2lwdjQvcGluZy5jCmluZGV4IDIwOGQ1NDMuLmE5M2YyNjAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3BpbmcuYworKysgYi9uZXQvaXB2NC9waW5nLmMKQEAgLTY0LDExICs2NCwxMSBAQAogCiBzdGF0aWMgdTE2IHBpbmdfcG9ydF9yb3ZlcjsKIAotc3RhdGljIGlubGluZSBpbnQgcGluZ19oYXNoZm4oc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgbnVtLCB1bnNpZ25lZCBpbnQgbWFzaykKK3N0YXRpYyBpbmxpbmUgdTMyIHBpbmdfaGFzaGZuKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgdTMyIG51bSwgdTMyIG1hc2spCiB7Ci0JaW50IHJlcyA9IChudW0gKyBuZXRfaGFzaF9taXgobmV0KSkgJiBtYXNrOworCXUzMiByZXMgPSAobnVtICsgbmV0X2hhc2hfbWl4KG5ldCkpICYgbWFzazsKIAotCXByX2RlYnVnKCJoYXNoKCVkKSA9ICVkXG4iLCBudW0sIHJlcyk7CisJcHJfZGVidWcoImhhc2goJXUpID0gJXVcbiIsIG51bSwgcmVzKTsKIAlyZXR1cm4gcmVzOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocGluZ19oYXNoKTsKQEAgLTUxNiw3ICs1MTYsNyBAQAogCQkgbnRvaHMoaWNtcGgtPnVuLmVjaG8uc2VxdWVuY2UpKTsKIAogCXNrID0gcGluZ19sb29rdXAobmV0LCBza2IsIG50b2hzKGljbXBoLT51bi5lY2hvLmlkKSk7Ci0JaWYgKHNrID09IE5VTEwpIHsKKwlpZiAoIXNrKSB7CiAJCXByX2RlYnVnKCJubyBzb2NrZXQsIGRyb3BwaW5nXG4iKTsKIAkJcmV0dXJuOwkvKiBObyBzb2NrZXQgZm9yIGVycm9yICovCiAJfQpAQCAtNjkyLDggKzY5Miw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwaW5nX2NvbW1vbl9zZW5kbXNnKTsKIAotc3RhdGljIGludCBwaW5nX3Y0X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJCSAgIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IHBpbmdfdjRfc2VuZG1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJc3RydWN0IGZsb3dpNCBmbDQ7CkBAIC04NDksOCArODQ4LDggQEAKIAlnb3RvIG91dDsKIH0KIAotaW50IHBpbmdfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkgc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKK2ludCBwaW5nX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBub2Jsb2NrLAorCQkgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmlzayA9IGluZXRfc2soc2spOwogCWludCBmYW1pbHkgPSBzay0+c2tfZmFtaWx5OwpAQCAtOTcyLDcgKzk3MSw3IEBACiAJc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSAodTggKilpY21waCk7CiAKIAlzayA9IHBpbmdfbG9va3VwKG5ldCwgc2tiLCBudG9ocyhpY21waC0+dW4uZWNoby5pZCkpOwotCWlmIChzayAhPSBOVUxMKSB7CisJaWYgKHNrKSB7CiAJCXN0cnVjdCBza19idWZmICpza2IyID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiAKIAkJcHJfZGVidWcoInJjdiBvbiBzb2NrZXQgJXBcbiIsIHNrKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Byb2MuYyBiL25ldC9pcHY0L3Byb2MuYwppbmRleCBkODk1M2VmLi5lMWYzYjkxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9wcm9jLmMKKysrIGIvbmV0L2lwdjQvcHJvYy5jCkBAIC02Myw3ICs2Myw3IEBACiAJc29ja2V0X3NlcV9zaG93KHNlcSk7CiAJc2VxX3ByaW50ZihzZXEsICJUQ1A6IGludXNlICVkIG9ycGhhbiAlZCB0dyAlZCBhbGxvYyAlZCBtZW0gJWxkXG4iLAogCQkgICBzb2NrX3Byb3RfaW51c2VfZ2V0KG5ldCwgJnRjcF9wcm90KSwgb3JwaGFucywKLQkJICAgdGNwX2RlYXRoX3Jvdy50d19jb3VudCwgc29ja2V0cywKKwkJICAgYXRvbWljX3JlYWQoJnRjcF9kZWF0aF9yb3cudHdfY291bnQpLCBzb2NrZXRzLAogCQkgICBwcm90b19tZW1vcnlfYWxsb2NhdGVkKCZ0Y3BfcHJvdCkpOwogCXNlcV9wcmludGYoc2VxLCAiVURQOiBpbnVzZSAlZCBtZW0gJWxkXG4iLAogCQkgICBzb2NrX3Byb3RfaW51c2VfZ2V0KG5ldCwgJnVkcF9wcm90KSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Jhdy5jIGIvbmV0L2lwdjQvcmF3LmMKaW5kZXggZjAyN2E3MC4uNTYxY2Q0YiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcmF3LmMKKysrIGIvbmV0L2lwdjQvcmF3LmMKQEAgLTQ2LDcgKzQ2LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9haW8uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpAQCAtMjkzLDcgKzI5Miw3IEBACiAKIAlyZWFkX2xvY2soJnJhd192NF9oYXNoaW5mby5sb2NrKTsKIAlyYXdfc2sgPSBza19oZWFkKCZyYXdfdjRfaGFzaGluZm8uaHRbaGFzaF0pOwotCWlmIChyYXdfc2sgIT0gTlVMTCkgeworCWlmIChyYXdfc2spIHsKIAkJaXBoID0gKGNvbnN0IHN0cnVjdCBpcGhkciAqKXNrYi0+ZGF0YTsKIAkJbmV0ID0gZGV2X25ldChza2ItPmRldik7CiAKQEAgLTM2Myw3ICszNjIsNyBAQAogCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCiAJCQkJICBsZW5ndGggKyBobGVuICsgdGxlbiArIDE1LAogCQkJCSAgZmxhZ3MgJiBNU0dfRE9OVFdBSVQsICZlcnIpOwotCWlmIChza2IgPT0gTlVMTCkKKwlpZiAoIXNrYikKIAkJZ290byBlcnJvcjsKIAlza2JfcmVzZXJ2ZShza2IsIGhsZW4pOwogCkBAIC00MDQsNyArNDAzLDcgQEAKIAkJaXBoLT5jaGVjayAgID0gMDsKIAkJaXBoLT50b3RfbGVuID0gaHRvbnMobGVuZ3RoKTsKIAkJaWYgKCFpcGgtPmlkKQotCQkJaXBfc2VsZWN0X2lkZW50KHNrYiwgTlVMTCk7CisJCQlpcF9zZWxlY3RfaWRlbnQobmV0LCBza2IsIE5VTEwpOwogCiAJCWlwaC0+Y2hlY2sgPSBpcF9mYXN0X2NzdW0oKHVuc2lnbmVkIGNoYXIgKilpcGgsIGlwaC0+aWhsKTsKIAl9CkBAIC00MTIsOCArNDExLDggQEAKIAkJaWNtcF9vdXRfY291bnQobmV0LCAoKHN0cnVjdCBpY21waGRyICopCiAJCQlza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpKS0+dHlwZSk7CiAKLQllcnIgPSBORl9IT09LKE5GUFJPVE9fSVBWNCwgTkZfSU5FVF9MT0NBTF9PVVQsIHNrYiwgTlVMTCwKLQkJICAgICAgcnQtPmRzdC5kZXYsIGRzdF9vdXRwdXQpOworCWVyciA9IE5GX0hPT0soTkZQUk9UT19JUFY0LCBORl9JTkVUX0xPQ0FMX09VVCwgc2ssIHNrYiwKKwkJICAgICAgTlVMTCwgcnQtPmRzdC5kZXYsIGRzdF9vdXRwdXRfc2spOwogCWlmIChlcnIgPiAwKQogCQllcnIgPSBuZXRfeG1pdF9lcnJubyhlcnIpOwogCWlmIChlcnIpCkBAIC00ODEsOCArNDgwLDcgQEAKIAlyZXR1cm4gaXBfZ2VuZXJpY19nZXRmcmFnKHJmdi0+bXNnLCB0bywgb2Zmc2V0LCBsZW4sIG9kZCwgc2tiKTsKIH0KIAotc3RhdGljIGludCByYXdfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkgICAgICAgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgcmF3X3NlbmRtc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBpcGNtX2Nvb2tpZSBpcGM7CkBAIC03MDksOCArNzA3LDggQEAKICAqCXdlIHJldHVybiBpdCwgb3RoZXJ3aXNlIHdlIGJsb2NrLgogICovCiAKLXN0YXRpYyBpbnQgcmF3X3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJICAgICAgIHNpemVfdCBsZW4sIGludCBub2Jsb2NrLCBpbnQgZmxhZ3MsIGludCAqYWRkcl9sZW4pCitzdGF0aWMgaW50IHJhd19yZWN2bXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAorCQkgICAgICAgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc2l6ZV90IGNvcGllZCA9IDA7CkBAIC04NzMsNyArODcxLDcgQEAKIAogCQlzcGluX2xvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogCQlza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpOwotCQlpZiAoc2tiICE9IE5VTEwpCisJCWlmIChza2IpCiAJCQlhbW91bnQgPSBza2ItPmxlbjsKIAkJc3Bpbl91bmxvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogCQlyZXR1cm4gcHV0X3VzZXIoYW1vdW50LCAoaW50IF9fdXNlciAqKWFyZyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9yb3V0ZS5jIGIvbmV0L2lwdjQvcm91dGUuYwppbmRleCBhZDUwNjQzLi5hNzg1NDBmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9yb3V0ZS5jCisrKyBiL25ldC9pcHY0L3JvdXRlLmMKQEAgLTE1Miw3ICsxNTIsNiBAQAogCiBzdGF0aWMgc3RydWN0IGRzdF9vcHMgaXB2NF9kc3Rfb3BzID0gewogCS5mYW1pbHkgPQkJQUZfSU5FVCwKLQkucHJvdG9jb2wgPQkJY3B1X3RvX2JlMTYoRVRIX1BfSVApLAogCS5jaGVjayA9CQlpcHY0X2RzdF9jaGVjaywKIAkuZGVmYXVsdF9hZHZtc3MgPQlpcHY0X2RlZmF1bHRfYWR2bXNzLAogCS5tdHUgPQkJCWlwdjRfbXR1LApAQCAtNDgzLDcgKzQ4Miw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGlwX2lkZW50c19yZXNlcnZlKTsKIAotdm9pZCBfX2lwX3NlbGVjdF9pZGVudChzdHJ1Y3QgaXBoZHIgKmlwaCwgaW50IHNlZ3MpCit2b2lkIF9faXBfc2VsZWN0X2lkZW50KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IGlwaGRyICppcGgsIGludCBzZWdzKQogewogCXN0YXRpYyB1MzIgaXBfaWRlbnRzX2hhc2hybmQgX19yZWFkX21vc3RseTsKIAl1MzIgaGFzaCwgaWQ7CkBAIC00OTIsNyArNDkxLDcgQEAKIAogCWhhc2ggPSBqaGFzaF8zd29yZHMoKF9fZm9yY2UgdTMyKWlwaC0+ZGFkZHIsCiAJCQkgICAgKF9fZm9yY2UgdTMyKWlwaC0+c2FkZHIsCi0JCQkgICAgaXBoLT5wcm90b2NvbCwKKwkJCSAgICBpcGgtPnByb3RvY29sIF4gbmV0X2hhc2hfbWl4KG5ldCksCiAJCQkgICAgaXBfaWRlbnRzX2hhc2hybmQpOwogCWlkID0gaXBfaWRlbnRzX3Jlc2VydmUoaGFzaCwgc2Vncyk7CiAJaXBoLT5pZCA9IGh0b25zKGlkKTsKQEAgLTEwNTcsNyArMTA1Niw3IEBACiAJX19idWlsZF9mbG93X2tleSgmZmw0LCBzaywgaXBoLCAwLCAwLCAwLCAwLCAwKTsKIAogCXJ0ID0gKHN0cnVjdCBydGFibGUgKilvZHN0OwotCWlmIChvZHN0LT5vYnNvbGV0ZSAmJiBvZHN0LT5vcHMtPmNoZWNrKG9kc3QsIDApID09IE5VTEwpIHsKKwlpZiAob2RzdC0+b2Jzb2xldGUgJiYgIW9kc3QtPm9wcy0+Y2hlY2sob2RzdCwgMCkpIHsKIAkJcnQgPSBpcF9yb3V0ZV9vdXRwdXRfZmxvdyhzb2NrX25ldChzayksICZmbDQsIHNrKTsKIAkJaWYgKElTX0VSUihydCkpCiAJCQlnb3RvIG91dDsKQEAgLTE0NTEsNyArMTQ1MCw3IEBACiAKIAkvKiBQcmltYXJ5IHNhbml0eSBjaGVja3MuICovCiAKLQlpZiAoaW5fZGV2ID09IE5VTEwpCisJaWYgKCFpbl9kZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGlwdjRfaXNfbXVsdGljYXN0KHNhZGRyKSB8fCBpcHY0X2lzX2xiY2FzdChzYWRkcikgfHwKQEAgLTE1NTQsNyArMTU1Myw3IEBACiAKIAkvKiBnZXQgYSB3b3JraW5nIHJlZmVyZW5jZSB0byB0aGUgb3V0cHV0IGRldmljZSAqLwogCW91dF9kZXYgPSBfX2luX2Rldl9nZXRfcmN1KEZJQl9SRVNfREVWKCpyZXMpKTsKLQlpZiAob3V0X2RldiA9PSBOVUxMKSB7CisJaWYgKCFvdXRfZGV2KSB7CiAJCW5ldF9jcml0X3JhdGVsaW1pdGVkKCJCdWcgaW4gaXBfcm91dGVfaW5wdXRfc2xvdygpLiBQbGVhc2UgcmVwb3J0LlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE1OTIsNyArMTU5MSw3IEBACiAKIAlmbmhlID0gZmluZF9leGNlcHRpb24oJkZJQl9SRVNfTkgoKnJlcyksIGRhZGRyKTsKIAlpZiAoZG9fY2FjaGUpIHsKLQkJaWYgKGZuaGUgIT0gTlVMTCkKKwkJaWYgKGZuaGUpCiAJCQlydGggPSByY3VfZGVyZWZlcmVuY2UoZm5oZS0+Zm5oZV9ydGhfaW5wdXQpOwogCQllbHNlCiAJCQlydGggPSByY3VfZGVyZWZlcmVuY2UoRklCX1JFU19OSCgqcmVzKS5uaF9ydGhfaW5wdXQpOwpAQCAtMjA1NSw3ICsyMDU0LDcgQEAKIAkJICAgICBpcHY0X2lzX2xiY2FzdChmbDQtPmRhZGRyKSkpIHsKIAkJCS8qIEl0IGlzIGVxdWl2YWxlbnQgdG8gaW5ldF9hZGRyX3R5cGUoc2FkZHIpID09IFJUTl9MT0NBTCAqLwogCQkJZGV2X291dCA9IF9faXBfZGV2X2ZpbmQobmV0LCBmbDQtPnNhZGRyLCBmYWxzZSk7Ci0JCQlpZiAoZGV2X291dCA9PSBOVUxMKQorCQkJaWYgKCFkZXZfb3V0KQogCQkJCWdvdG8gb3V0OwogCiAJCQkvKiBTcGVjaWFsIGhhY2s6IHVzZXIgY2FuIGRpcmVjdCBtdWx0aWNhc3RzCkBAIC0yMDg4LDcgKzIwODcsNyBAQAogCWlmIChmbDQtPmZsb3dpNF9vaWYpIHsKIAkJZGV2X291dCA9IGRldl9nZXRfYnlfaW5kZXhfcmN1KG5ldCwgZmw0LT5mbG93aTRfb2lmKTsKIAkJcnRoID0gRVJSX1BUUigtRU5PREVWKTsKLQkJaWYgKGRldl9vdXQgPT0gTlVMTCkKKwkJaWYgKCFkZXZfb3V0KQogCQkJZ290byBvdXQ7CiAKIAkJLyogUkFDRTogQ2hlY2sgcmV0dXJuIHZhbHVlIG9mIGluZXRfc2VsZWN0X2FkZHIgaW5zdGVhZC4gKi8KQEAgLTIyMjUsNyArMjIyNCw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZHN0X29wcyBpcHY0X2RzdF9ibGFja2hvbGVfb3BzID0gewogCS5mYW1pbHkJCQk9CUFGX0lORVQsCi0JLnByb3RvY29sCQk9CWNwdV90b19iZTE2KEVUSF9QX0lQKSwKIAkuY2hlY2sJCQk9CWlwdjRfYmxhY2tob2xlX2RzdF9jaGVjaywKIAkubXR1CQkJPQlpcHY0X2JsYWNraG9sZV9tdHUsCiAJLmRlZmF1bHRfYWR2bXNzCQk9CWlwdjRfZGVmYXVsdF9hZHZtc3MsCkBAIC0yMzAxLDcgKzIyOTksNyBAQAogCXUzMiBtZXRyaWNzW1JUQVhfTUFYXTsKIAogCW5saCA9IG5sbXNnX3B1dChza2IsIHBvcnRpZCwgc2VxLCBldmVudCwgc2l6ZW9mKCpyKSwgZmxhZ3MpOwotCWlmIChubGggPT0gTlVMTCkKKwlpZiAoIW5saCkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAogCXIgPSBubG1zZ19kYXRhKG5saCk7CkBAIC0yMzIxLDExICsyMzE5LDExIEBACiAJaWYgKElQQ0Ioc2tiKS0+ZmxhZ3MgJiBJUFNLQl9ET1JFRElSRUNUKQogCQlyLT5ydG1fZmxhZ3MgfD0gUlRDRl9ET1JFRElSRUNUOwogCi0JaWYgKG5sYV9wdXRfYmUzMihza2IsIFJUQV9EU1QsIGRzdCkpCisJaWYgKG5sYV9wdXRfaW5fYWRkcihza2IsIFJUQV9EU1QsIGRzdCkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCWlmIChzcmMpIHsKIAkJci0+cnRtX3NyY19sZW4gPSAzMjsKLQkJaWYgKG5sYV9wdXRfYmUzMihza2IsIFJUQV9TUkMsIHNyYykpCisJCWlmIChubGFfcHV0X2luX2FkZHIoc2tiLCBSVEFfU1JDLCBzcmMpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJfQogCWlmIChydC0+ZHN0LmRldiAmJgpAQCAtMjMzOCwxMSArMjMzNiwxMSBAQAogI2VuZGlmCiAJaWYgKCFydF9pc19pbnB1dF9yb3V0ZShydCkgJiYKIAkgICAgZmw0LT5zYWRkciAhPSBzcmMpIHsKLQkJaWYgKG5sYV9wdXRfYmUzMihza2IsIFJUQV9QUkVGU1JDLCBmbDQtPnNhZGRyKSkKKwkJaWYgKG5sYV9wdXRfaW5fYWRkcihza2IsIFJUQV9QUkVGU1JDLCBmbDQtPnNhZGRyKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCX0KIAlpZiAocnQtPnJ0X3VzZXNfZ2F0ZXdheSAmJgotCSAgICBubGFfcHV0X2JlMzIoc2tiLCBSVEFfR0FURVdBWSwgcnQtPnJ0X2dhdGV3YXkpKQorCSAgICBubGFfcHV0X2luX2FkZHIoc2tiLCBSVEFfR0FURVdBWSwgcnQtPnJ0X2dhdGV3YXkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCWV4cGlyZXMgPSBydC0+ZHN0LmV4cGlyZXM7CkBAIC0yNDIzLDcgKzI0MjEsNyBAQAogCXJ0bSA9IG5sbXNnX2RhdGEobmxoKTsKIAogCXNrYiA9IGFsbG9jX3NrYihOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNrYiA9PSBOVUxMKSB7CisJaWYgKCFza2IpIHsKIAkJZXJyID0gLUVOT0JVRlM7CiAJCWdvdG8gZXJyb3V0OwogCX0KQEAgLTI0MzgsOCArMjQzNiw4IEBACiAJaXBfaGRyKHNrYiktPnByb3RvY29sID0gSVBQUk9UT19JQ01QOwogCXNrYl9yZXNlcnZlKHNrYiwgTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKIAotCXNyYyA9IHRiW1JUQV9TUkNdID8gbmxhX2dldF9iZTMyKHRiW1JUQV9TUkNdKSA6IDA7Ci0JZHN0ID0gdGJbUlRBX0RTVF0gPyBubGFfZ2V0X2JlMzIodGJbUlRBX0RTVF0pIDogMDsKKwlzcmMgPSB0YltSVEFfU1JDXSA/IG5sYV9nZXRfaW5fYWRkcih0YltSVEFfU1JDXSkgOiAwOworCWRzdCA9IHRiW1JUQV9EU1RdID8gbmxhX2dldF9pbl9hZGRyKHRiW1JUQV9EU1RdKSA6IDA7CiAJaWlmID0gdGJbUlRBX0lJRl0gPyBubGFfZ2V0X3UzMih0YltSVEFfSUlGXSkgOiAwOwogCW1hcmsgPSB0YltSVEFfTUFSS10gPyBubGFfZ2V0X3UzMih0YltSVEFfTUFSS10pIDogMDsKIApAQCAtMjQ1NCw3ICsyNDUyLDcgQEAKIAkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAogCQlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobmV0LCBpaWYpOwotCQlpZiAoZGV2ID09IE5VTEwpIHsKKwkJaWYgKCFkZXYpIHsKIAkJCWVyciA9IC1FTk9ERVY7CiAJCQlnb3RvIGVycm91dF9mcmVlOwogCQl9CkBAIC0yNjUzLDcgKzI2NTEsNyBAQAogCXRibCA9IGlwdjRfcm91dGVfZmx1c2hfdGFibGU7CiAJaWYgKCFuZXRfZXEobmV0LCAmaW5pdF9uZXQpKSB7CiAJCXRibCA9IGttZW1kdXAodGJsLCBzaXplb2YoaXB2NF9yb3V0ZV9mbHVzaF90YWJsZSksIEdGUF9LRVJORUwpOwotCQlpZiAodGJsID09IE5VTEwpCisJCWlmICghdGJsKQogCQkJZ290byBlcnJfZHVwOwogCiAJCS8qIERvbid0IGV4cG9ydCBzeXNjdGxzIHRvIHVucHJpdmlsZWdlZCB1c2VycyAqLwpAQCAtMjY2Myw3ICsyNjYxLDcgQEAKIAl0YmxbMF0uZXh0cmExID0gbmV0OwogCiAJbmV0LT5pcHY0LnJvdXRlX2hkciA9IHJlZ2lzdGVyX25ldF9zeXNjdGwobmV0LCAibmV0L2lwdjQvcm91dGUiLCB0YmwpOwotCWlmIChuZXQtPmlwdjQucm91dGVfaGRyID09IE5VTEwpCisJaWYgKCFuZXQtPmlwdjQucm91dGVfaGRyKQogCQlnb3RvIGVycl9yZWc7CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3N5bmNvb2tpZXMuYyBiL25ldC9pcHY0L3N5bmNvb2tpZXMuYwppbmRleCA0NWZlNjBjLi5kZjg0OWU1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9zeW5jb29raWVzLmMKKysrIGIvbmV0L2lwdjQvc3luY29va2llcy5jCkBAIC0yMTksMTkgKzIxOSwyMCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19jb29raWVfdjRfY2hlY2spOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrICpnZXRfY29va2llX3NvY2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkJCSAgIHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqZ2V0X2Nvb2tpZV9zb2NrKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorCQkJCSAgICBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCiB7CiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCXN0cnVjdCBzb2NrICpjaGlsZDsKIAogCWNoaWxkID0gaWNzay0+aWNza19hZl9vcHMtPnN5bl9yZWN2X3NvY2soc2ssIHNrYiwgcmVxLCBkc3QpOwotCWlmIChjaGlsZCkKKwlpZiAoY2hpbGQpIHsKKwkJYXRvbWljX3NldCgmcmVxLT5yc2tfcmVmY250LCAxKTsKIAkJaW5ldF9jc2tfcmVxc2tfcXVldWVfYWRkKHNrLCByZXEsIGNoaWxkKTsKLQllbHNlCisJfSBlbHNlIHsKIAkJcmVxc2tfZnJlZShyZXEpOwotCisJfQogCXJldHVybiBjaGlsZDsKIH0KIApAQCAtMzI1LDcgKzMyNiw3IEBACiAJCWdvdG8gb3V0OwogCiAJcmV0ID0gTlVMTDsKLQlyZXEgPSBpbmV0X3JlcXNrX2FsbG9jKCZ0Y3BfcmVxdWVzdF9zb2NrX29wcyk7IC8qIGZvciBzYWZldHkgKi8KKwlyZXEgPSBpbmV0X3JlcXNrX2FsbG9jKCZ0Y3BfcmVxdWVzdF9zb2NrX29wcywgc2spOyAvKiBmb3Igc2FmZXR5ICovCiAJaWYgKCFyZXEpCiAJCWdvdG8gb3V0OwogCkBAIC0zMzYsOCArMzM3LDggQEAKIAlyZXEtPm1zcwkJPSBtc3M7CiAJaXJlcS0+aXJfbnVtCQk9IG50b2hzKHRoLT5kZXN0KTsKIAlpcmVxLT5pcl9ybXRfcG9ydAk9IHRoLT5zb3VyY2U7Ci0JaXJlcS0+aXJfbG9jX2FkZHIJPSBpcF9oZHIoc2tiKS0+ZGFkZHI7Ci0JaXJlcS0+aXJfcm10X2FkZHIJPSBpcF9oZHIoc2tiKS0+c2FkZHI7CisJc2tfcmN2X3NhZGRyX3NldChyZXFfdG9fc2socmVxKSwgaXBfaGRyKHNrYiktPmRhZGRyKTsKKwlza19kYWRkcl9zZXQocmVxX3RvX3NrKHJlcSksIGlwX2hkcihza2IpLT5zYWRkcik7CiAJaXJlcS0+aXJfbWFyawkJPSBpbmV0X3JlcXVlc3RfbWFyayhzaywgc2tiKTsKIAlpcmVxLT5zbmRfd3NjYWxlCT0gdGNwX29wdC5zbmRfd3NjYWxlOwogCWlyZXEtPnNhY2tfb2sJCT0gdGNwX29wdC5zYWNrX29rOwpAQCAtMzQ1LDcgKzM0Niw5IEBACiAJaXJlcS0+dHN0YW1wX29rCQk9IHRjcF9vcHQuc2F3X3RzdGFtcDsKIAlyZXEtPnRzX3JlY2VudAkJPSB0Y3Bfb3B0LnNhd190c3RhbXAgPyB0Y3Bfb3B0LnJjdl90c3ZhbCA6IDA7CiAJdHJlcS0+c250X3N5bmFjawk9IHRjcF9vcHQuc2F3X3RzdGFtcCA/IHRjcF9vcHQucmN2X3RzZWNyIDogMDsKLQl0cmVxLT5saXN0ZW5lcgkJPSBOVUxMOworCXRyZXEtPnRmb19saXN0ZW5lcgk9IGZhbHNlOworCisJaXJlcS0+aXJfaWlmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKIAogCS8qIFdlIHRocm93ZWQgdGhlIG9wdGlvbnMgb2YgdGhlIGluaXRpYWwgU1lOIGF3YXksIHNvIHdlIGhvcGUKIAkgKiB0aGUgQUNLIGNhcnJpZXMgdGhlIHNhbWUgb3B0aW9ucyBhZ2FpbiAoc2VlIFJGQzExMjIgNC4yLjMuOCkKQEAgLTM1Nyw3ICszNjAsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlyZXEtPmV4cGlyZXMJPSAwVUw7CiAJcmVxLT5udW1fcmV0cmFucyA9IDA7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMgYi9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYwppbmRleCBkMTUxNTM5Li5jMzg1MmE3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYworKysgYi9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYwpAQCAtODgzLDYgKzg4MywyMCBAQAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAl9LAorCXsKKwkJLnByb2NuYW1lCT0gInRjcF9wcm9iZV90aHJlc2hvbGQiLAorCQkuZGF0YQkJPSAmaW5pdF9uZXQuaXB2NC5zeXNjdGxfdGNwX3Byb2JlX3RocmVzaG9sZCwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJ0Y3BfcHJvYmVfaW50ZXJ2YWwiLAorCQkuZGF0YQkJPSAmaW5pdF9uZXQuaXB2NC5zeXNjdGxfdGNwX3Byb2JlX2ludGVydmFsLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKKwl9LAogCXsgfQogfTsKIApAQCAtODk1LDcgKzkwOSw3IEBACiAJCWludCBpOwogCiAJCXRhYmxlID0ga21lbWR1cCh0YWJsZSwgc2l6ZW9mKGlwdjRfbmV0X3RhYmxlKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICh0YWJsZSA9PSBOVUxMKQorCQlpZiAoIXRhYmxlKQogCQkJZ290byBlcnJfYWxsb2M7CiAKIAkJLyogVXBkYXRlIHRoZSB2YXJpYWJsZXMgdG8gcG9pbnQgaW50byB0aGUgY3VycmVudCBzdHJ1Y3QgbmV0ICovCkBAIC05MDQsNyArOTE4LDcgQEAKIAl9CiAKIAluZXQtPmlwdjQuaXB2NF9oZHIgPSByZWdpc3Rlcl9uZXRfc3lzY3RsKG5ldCwgIm5ldC9pcHY0IiwgdGFibGUpOwotCWlmIChuZXQtPmlwdjQuaXB2NF9oZHIgPT0gTlVMTCkKKwlpZiAoIW5ldC0+aXB2NC5pcHY0X2hkcikKIAkJZ290byBlcnJfcmVnOwogCiAJbmV0LT5pcHY0LnN5c2N0bF9sb2NhbF9yZXNlcnZlZF9wb3J0cyA9IGt6YWxsb2MoNjU1MzYgLyA4LCBHRlBfS0VSTkVMKTsKQEAgLTk0Miw3ICs5NTYsNyBAQAogCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpoZHI7CiAKIAloZHIgPSByZWdpc3Rlcl9uZXRfc3lzY3RsKCZpbml0X25ldCwgIm5ldC9pcHY0IiwgaXB2NF90YWJsZSk7Ci0JaWYgKGhkciA9PSBOVUxMKQorCWlmICghaGRyKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChyZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZpcHY0X3N5c2N0bF9vcHMpKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3AuYyBiL25ldC9pcHY0L3RjcC5jCmluZGV4IDk5NWEyMjUuLjE4ZTNhMTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcC5jCisrKyBiL25ldC9pcHY0L3RjcC5jCkBAIC00OTYsNyArNDk2LDcgQEAKIAogCS8qIENvbm5lY3RlZCBvciBwYXNzaXZlIEZhc3QgT3BlbiBzb2NrZXQ/ICovCiAJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfU1lOX1NFTlQgJiYKLQkgICAgKHNrLT5za19zdGF0ZSAhPSBUQ1BfU1lOX1JFQ1YgfHwgdHAtPmZhc3RvcGVuX3JzayAhPSBOVUxMKSkgeworCSAgICAoc2stPnNrX3N0YXRlICE9IFRDUF9TWU5fUkVDViB8fCB0cC0+ZmFzdG9wZW5fcnNrKSkgewogCQlpbnQgdGFyZ2V0ID0gc29ja19yY3Zsb3dhdChzaywgMCwgSU5UX01BWCk7CiAKIAkJaWYgKHRwLT51cmdfc2VxID09IHRwLT5jb3BpZWRfc2VxICYmCkBAIC0xMDI4LDcgKzEwMjgsNyBAQAogCiB2b2lkIHRjcF9mcmVlX2Zhc3RvcGVuX3JlcShzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewotCWlmICh0cC0+ZmFzdG9wZW5fcmVxICE9IE5VTEwpIHsKKwlpZiAodHAtPmZhc3RvcGVuX3JlcSkgewogCQlrZnJlZSh0cC0+ZmFzdG9wZW5fcmVxKTsKIAkJdHAtPmZhc3RvcGVuX3JlcSA9IE5VTEw7CiAJfQpAQCAtMTA0MiwxMiArMTA0MiwxMiBAQAogCiAJaWYgKCEoc3lzY3RsX3RjcF9mYXN0b3BlbiAmIFRGT19DTElFTlRfRU5BQkxFKSkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCWlmICh0cC0+ZmFzdG9wZW5fcmVxICE9IE5VTEwpCisJaWYgKHRwLT5mYXN0b3Blbl9yZXEpCiAJCXJldHVybiAtRUFMUkVBRFk7IC8qIEFub3RoZXIgRmFzdCBPcGVuIGlzIGluIHByb2dyZXNzICovCiAKIAl0cC0+ZmFzdG9wZW5fcmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRjcF9mYXN0b3Blbl9yZXF1ZXN0KSwKIAkJCQkgICBzay0+c2tfYWxsb2NhdGlvbik7Ci0JaWYgKHVubGlrZWx5KHRwLT5mYXN0b3Blbl9yZXEgPT0gTlVMTCkpCisJaWYgKHVubGlrZWx5KCF0cC0+ZmFzdG9wZW5fcmVxKSkKIAkJcmV0dXJuIC1FTk9CVUZTOwogCXRwLT5mYXN0b3Blbl9yZXEtPmRhdGEgPSBtc2c7CiAJdHAtPmZhc3RvcGVuX3JlcS0+c2l6ZSA9IHNpemU7CkBAIC0xMDYwLDggKzEwNjAsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCB0Y3Bfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQlzaXplX3Qgc2l6ZSkKK2ludCB0Y3Bfc2VuZG1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTExMjAsNyArMTExOSw3IEBACiAKIAlzZyA9ICEhKHNrLT5za19yb3V0ZV9jYXBzICYgTkVUSUZfRl9TRyk7CiAKLQl3aGlsZSAoaW92X2l0ZXJfY291bnQoJm1zZy0+bXNnX2l0ZXIpKSB7CisJd2hpbGUgKG1zZ19kYXRhX2xlZnQobXNnKSkgewogCQlpbnQgY29weSA9IDA7CiAJCWludCBtYXggPSBzaXplX2dvYWw7CiAKQEAgLTExNjQsOCArMTE2Myw4IEBACiAJCX0KIAogCQkvKiBUcnkgdG8gYXBwZW5kIGRhdGEgdG8gdGhlIGVuZCBvZiBza2IuICovCi0JCWlmIChjb3B5ID4gaW92X2l0ZXJfY291bnQoJm1zZy0+bXNnX2l0ZXIpKQotCQkJY29weSA9IGlvdl9pdGVyX2NvdW50KCZtc2ctPm1zZ19pdGVyKTsKKwkJaWYgKGNvcHkgPiBtc2dfZGF0YV9sZWZ0KG1zZykpCisJCQljb3B5ID0gbXNnX2RhdGFfbGVmdChtc2cpOwogCiAJCS8qIFdoZXJlIHRvIGNvcHkgdG8/ICovCiAJCWlmIChza2JfYXZhaWxyb29tKHNrYikgPiAwKSB7CkBAIC0xMjIyLDcgKzEyMjEsNyBAQAogCQl0Y3Bfc2tiX3Bjb3VudF9zZXQoc2tiLCAwKTsKIAogCQljb3BpZWQgKz0gY29weTsKLQkJaWYgKCFpb3ZfaXRlcl9jb3VudCgmbXNnLT5tc2dfaXRlcikpIHsKKwkJaWYgKCFtc2dfZGF0YV9sZWZ0KG1zZykpIHsKIAkJCXRjcF90eF90aW1lc3RhbXAoc2ssIHNrYik7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTUzOSw4ICsxNTM4LDggQEAKICAqCVByb2JhYmx5LCBjb2RlIGNhbiBiZSBlYXNpbHkgaW1wcm92ZWQgZXZlbiBtb3JlLgogICovCiAKLWludCB0Y3BfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQlzaXplX3QgbGVuLCBpbnQgbm9uYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKK2ludCB0Y3BfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IG5vbmJsb2NrLAorCQlpbnQgZmxhZ3MsIGludCAqYWRkcl9sZW4pCiB7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJaW50IGNvcGllZCA9IDA7CkBAIC0xOTE0LDE4ICsxOTEzLDE5IEBACiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG5ld19zdGF0ZVsxNl0gPSB7CiAgIC8qIGN1cnJlbnQgc3RhdGU6ICAgICAgICBuZXcgc3RhdGU6ICAgICAgYWN0aW9uOgkqLwotICAvKiAoSW52YWxpZCkJCSovIFRDUF9DTE9TRSwKLSAgLyogVENQX0VTVEFCTElTSEVECSovIFRDUF9GSU5fV0FJVDEgfCBUQ1BfQUNUSU9OX0ZJTiwKLSAgLyogVENQX1NZTl9TRU5UCSovIFRDUF9DTE9TRSwKLSAgLyogVENQX1NZTl9SRUNWCSovIFRDUF9GSU5fV0FJVDEgfCBUQ1BfQUNUSU9OX0ZJTiwKLSAgLyogVENQX0ZJTl9XQUlUMQkqLyBUQ1BfRklOX1dBSVQxLAotICAvKiBUQ1BfRklOX1dBSVQyCSovIFRDUF9GSU5fV0FJVDIsCi0gIC8qIFRDUF9USU1FX1dBSVQJKi8gVENQX0NMT1NFLAotICAvKiBUQ1BfQ0xPU0UJCSovIFRDUF9DTE9TRSwKLSAgLyogVENQX0NMT1NFX1dBSVQJKi8gVENQX0xBU1RfQUNLICB8IFRDUF9BQ1RJT05fRklOLAotICAvKiBUQ1BfTEFTVF9BQ0sJKi8gVENQX0xBU1RfQUNLLAotICAvKiBUQ1BfTElTVEVOCQkqLyBUQ1BfQ0xPU0UsCi0gIC8qIFRDUF9DTE9TSU5HCSovIFRDUF9DTE9TSU5HLAorICBbMCAvKiAoSW52YWxpZCkgKi9dCT0gVENQX0NMT1NFLAorICBbVENQX0VTVEFCTElTSEVEXQk9IFRDUF9GSU5fV0FJVDEgfCBUQ1BfQUNUSU9OX0ZJTiwKKyAgW1RDUF9TWU5fU0VOVF0JPSBUQ1BfQ0xPU0UsCisgIFtUQ1BfU1lOX1JFQ1ZdCT0gVENQX0ZJTl9XQUlUMSB8IFRDUF9BQ1RJT05fRklOLAorICBbVENQX0ZJTl9XQUlUMV0JPSBUQ1BfRklOX1dBSVQxLAorICBbVENQX0ZJTl9XQUlUMl0JPSBUQ1BfRklOX1dBSVQyLAorICBbVENQX1RJTUVfV0FJVF0JPSBUQ1BfQ0xPU0UsCisgIFtUQ1BfQ0xPU0VdCQk9IFRDUF9DTE9TRSwKKyAgW1RDUF9DTE9TRV9XQUlUXQk9IFRDUF9MQVNUX0FDSyAgfCBUQ1BfQUNUSU9OX0ZJTiwKKyAgW1RDUF9MQVNUX0FDS10JPSBUQ1BfTEFTVF9BQ0ssCisgIFtUQ1BfTElTVEVOXQkJPSBUQ1BfQ0xPU0UsCisgIFtUQ1BfQ0xPU0lOR10JCT0gVENQX0NMT1NJTkcsCisgIFtUQ1BfTkVXX1NZTl9SRUNWXQk9IFRDUF9DTE9TRSwJLyogc2hvdWxkIG5vdCBoYXBwZW4gISAqLwogfTsKIAogc3RhdGljIGludCB0Y3BfY2xvc2Vfc3RhdGUoc3RydWN0IHNvY2sgKnNrKQpAQCAtMjEzOCw3ICsyMTM4LDcgQEAKIAkJICogYWJvcnRlZCAoZS5nLiwgY2xvc2VkIHdpdGggdW5yZWFkIGRhdGEpIGJlZm9yZSAzV0hTCiAJCSAqIGZpbmlzaGVzLgogCQkgKi8KLQkJaWYgKHJlcSAhPSBOVUxMKQorCQlpZiAocmVxKQogCQkJcmVxc2tfZmFzdG9wZW5fcmVtb3ZlKHNrLCByZXEsIGZhbHNlKTsKIAkJaW5ldF9jc2tfZGVzdHJveV9zb2NrKHNrKTsKIAl9CkBAIC0yNzc2LDcgKzI3NzYsNyBAQAogCQlicmVhazsKIAogCWNhc2UgVENQX0ZBU1RPUEVOOgotCQlpZiAoaWNzay0+aWNza19hY2NlcHRfcXVldWUuZmFzdG9wZW5xICE9IE5VTEwpCisJCWlmIChpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5mYXN0b3BlbnEpCiAJCQl2YWwgPSBpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5mYXN0b3BlbnEtPm1heF9xbGVuOwogCQllbHNlCiAJCQl2YWwgPSAwOwpAQCAtMjk2MCw3ICsyOTYwLDcgQEAKIAogCXRjcF9zZXRfc3RhdGUoc2ssIFRDUF9DTE9TRSk7CiAJdGNwX2NsZWFyX3htaXRfdGltZXJzKHNrKTsKLQlpZiAocmVxICE9IE5VTEwpCisJaWYgKHJlcSkKIAkJcmVxc2tfZmFzdG9wZW5fcmVtb3ZlKHNrLCByZXEsIGZhbHNlKTsKIAogCXNrLT5za19zaHV0ZG93biA9IFNIVVRET1dOX01BU0s7CkBAIC0zMDAxLDEyICszMDAxLDExIEBACiAKIHZvaWQgX19pbml0IHRjcF9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBsaW1pdDsKIAlpbnQgbWF4X3JzaGFyZSwgbWF4X3dzaGFyZSwgY250OwogCXVuc2lnbmVkIGludCBpOwogCi0JQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgdGNwX3NrYl9jYikgPiBzaXplb2Yoc2tiLT5jYikpOworCXNvY2tfc2tiX2NiX2NoZWNrX3NpemUoc2l6ZW9mKHN0cnVjdCB0Y3Bfc2tiX2NiKSk7CiAKIAlwZXJjcHVfY291bnRlcl9pbml0KCZ0Y3Bfc29ja2V0c19hbGxvY2F0ZWQsIDAsIEdGUF9LRVJORUwpOwogCXBlcmNwdV9jb3VudGVyX2luaXQoJnRjcF9vcnBoYW5fY291bnQsIDAsIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2NvbmcuYyBiL25ldC9pcHY0L3RjcF9jb25nLmMKaW5kZXggZDY5NDA4OC4uN2E1YWU1MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2NvbmcuYworKysgYi9uZXQvaXB2NC90Y3BfY29uZy5jCkBAIC04Myw3ICs4Myw3IEBACiAJCXJldCA9IC1FRVhJU1Q7CiAJfSBlbHNlIHsKIAkJbGlzdF9hZGRfdGFpbF9yY3UoJmNhLT5saXN0LCAmdGNwX2NvbmdfbGlzdCk7Ci0JCXByX2luZm8oIiVzIHJlZ2lzdGVyZWRcbiIsIGNhLT5uYW1lKTsKKwkJcHJfZGVidWcoIiVzIHJlZ2lzdGVyZWRcbiIsIGNhLT5uYW1lKTsKIAl9CiAJc3Bpbl91bmxvY2soJnRjcF9jb25nX2xpc3RfbG9jayk7CiAKQEAgLTM3OCw2ICszNzgsMTIgQEAKICAqLwogdm9pZCB0Y3BfY29uZ19hdm9pZF9haShzdHJ1Y3QgdGNwX3NvY2sgKnRwLCB1MzIgdywgdTMyIGFja2VkKQogeworCS8qIElmIGNyZWRpdHMgYWNjdW11bGF0ZWQgYXQgYSBoaWdoZXIgdywgYXBwbHkgdGhlbSBnZW50bHkgbm93LiAqLworCWlmICh0cC0+c25kX2N3bmRfY250ID49IHcpIHsKKwkJdHAtPnNuZF9jd25kX2NudCA9IDA7CisJCXRwLT5zbmRfY3duZCsrOworCX0KKwogCXRwLT5zbmRfY3duZF9jbnQgKz0gYWNrZWQ7CiAJaWYgKHRwLT5zbmRfY3duZF9jbnQgPj0gdykgewogCQl1MzIgZGVsdGEgPSB0cC0+c25kX2N3bmRfY250IC8gdzsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9jdWJpYy5jIGIvbmV0L2lwdjQvdGNwX2N1YmljLmMKaW5kZXggNGIyNzZkMS4uMDZkM2Q2NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2N1YmljLmMKKysrIGIvbmV0L2lwdjQvdGNwX2N1YmljLmMKQEAgLTMwNiw4ICszMDYsMTAgQEAKIAkJfQogCX0KIAotCWlmIChjYS0+Y250ID09IDApCQkJLyogY2Fubm90IGJlIHplcm8gKi8KLQkJY2EtPmNudCA9IDE7CisJLyogVGhlIG1heGltdW0gcmF0ZSBvZiBjd25kIGluY3JlYXNlIENVQklDIGFsbG93cyBpcyAxIHBhY2tldCBwZXIKKwkgKiAyIHBhY2tldHMgQUNLZWQsIG1lYW5pbmcgY3duZCBncm93cyBhdCAxLjV4IHBlciBSVFQuCisJICovCisJY2EtPmNudCA9IG1heChjYS0+Y250LCAyVSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJpY3RjcF9jb25nX2F2b2lkKHN0cnVjdCBzb2NrICpzaywgdTMyIGFjaywgdTMyIGFja2VkKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2RpYWcuYyBiL25ldC9pcHY0L3RjcF9kaWFnLmMKaW5kZXggMGQ3M2Y5ZC4uNzliMzRhMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2RpYWcuYworKysgYi9uZXQvaXB2NC90Y3BfZGlhZy5jCkBAIC0yOSwxOCArMjksMTggQEAKIAkJci0+aWRpYWdfcnF1ZXVlID0gbWF4X3QoaW50LCB0cC0+cmN2X254dCAtIHRwLT5jb3BpZWRfc2VxLCAwKTsKIAkJci0+aWRpYWdfd3F1ZXVlID0gdHAtPndyaXRlX3NlcSAtIHRwLT5zbmRfdW5hOwogCX0KLQlpZiAoaW5mbyAhPSBOVUxMKQorCWlmIChpbmZvKQogCQl0Y3BfZ2V0X2luZm8oc2ssIGluZm8pOwogfQogCiBzdGF0aWMgdm9pZCB0Y3BfZGlhZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKLQkJCSAgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnIsIHN0cnVjdCBubGF0dHIgKmJjKQorCQkJICBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwgc3RydWN0IG5sYXR0ciAqYmMpCiB7CiAJaW5ldF9kaWFnX2R1bXBfaWNzaygmdGNwX2hhc2hpbmZvLCBza2IsIGNiLCByLCBiYyk7CiB9CiAKIHN0YXRpYyBpbnQgdGNwX2RpYWdfZHVtcF9vbmUoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCi0JCQkgICAgIHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpCiB7CiAJcmV0dXJuIGluZXRfZGlhZ19kdW1wX29uZV9pY3NrKCZ0Y3BfaGFzaGluZm8sIGluX3NrYiwgbmxoLCByZXEpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2Zhc3RvcGVuLmMgYi9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYwppbmRleCBlYTgyZmQ0Li5lM2Q4N2FjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYworKysgYi9uZXQvaXB2NC90Y3BfZmFzdG9wZW4uYwpAQCAtMTQxLDcgKzE0MSw3IEBACiAJcmVxLT5zayA9IE5VTEw7CiAKIAljaGlsZCA9IGluZXRfY3NrKHNrKS0+aWNza19hZl9vcHMtPnN5bl9yZWN2X3NvY2soc2ssIHNrYiwgcmVxLCBOVUxMKTsKLQlpZiAoY2hpbGQgPT0gTlVMTCkKKwlpZiAoIWNoaWxkKQogCQlyZXR1cm4gZmFsc2U7CiAKIAlzcGluX2xvY2soJnF1ZXVlLT5mYXN0b3BlbnEtPmxvY2spOwpAQCAtMTU1LDEyICsxNTUsNyBAQAogCXRwID0gdGNwX3NrKGNoaWxkKTsKIAogCXRwLT5mYXN0b3Blbl9yc2sgPSByZXE7Ci0JLyogRG8gYSBob2xkIG9uIHRoZSBsaXN0bmVyIHNrIHNvIHRoYXQgaWYgdGhlIGxpc3RlbmVyIGlzIGJlaW5nCi0JICogY2xvc2VkLCB0aGUgY2hpbGQgdGhhdCBoYXMgYmVlbiBhY2NlcHRlZCBjYW4gbGl2ZSBvbiBhbmQgc3RpbGwKLQkgKiBhY2Nlc3MgbGlzdGVuX2xvY2suCi0JICovCi0Jc29ja19ob2xkKHNrKTsKLQl0Y3BfcnNrKHJlcSktPmxpc3RlbmVyID0gc2s7CisJdGNwX3JzayhyZXEpLT50Zm9fbGlzdGVuZXIgPSB0cnVlOwogCiAJLyogUkZDMTMyMzogVGhlIHdpbmRvdyBpbiBTWU4gJiBTWU4vQUNLIHNlZ21lbnRzIGlzIG5ldmVyCiAJICogc2NhbGVkLiBTbyBjb3JyZWN0IGl0IGFwcHJvcHJpYXRlbHkuCkBAIC0xNzQsNiArMTY5LDcgQEAKIAlpbmV0X2Nza19yZXNldF94bWl0X3RpbWVyKGNoaWxkLCBJQ1NLX1RJTUVfUkVUUkFOUywKIAkJCQkgIFRDUF9USU1FT1VUX0lOSVQsIFRDUF9SVE9fTUFYKTsKIAorCWF0b21pY19zZXQoJnJlcS0+cnNrX3JlZmNudCwgMSk7CiAJLyogQWRkIHRoZSBjaGlsZCBzb2NrZXQgZGlyZWN0bHkgaW50byB0aGUgYWNjZXB0IHF1ZXVlICovCiAJaW5ldF9jc2tfcmVxc2tfcXVldWVfYWRkKHNrLCByZXEsIGNoaWxkKTsKIApAQCAtMjE4LDEwICsyMTQsOSBAQAogCXNrLT5za19kYXRhX3JlYWR5KHNrKTsKIAliaF91bmxvY2tfc29jayhjaGlsZCk7CiAJc29ja19wdXQoY2hpbGQpOwotCVdBUk5fT04ocmVxLT5zayA9PSBOVUxMKTsKKwlXQVJOX09OKCFyZXEtPnNrKTsKIAlyZXR1cm4gdHJ1ZTsKIH0KLUVYUE9SVF9TWU1CT0wodGNwX2Zhc3RvcGVuX2NyZWF0ZV9jaGlsZCk7CiAKIHN0YXRpYyBib29sIHRjcF9mYXN0b3Blbl9xdWV1ZV9jaGVjayhzdHJ1Y3Qgc29jayAqc2spCiB7CkBAIC0yMzgsMTQgKzIzMywxNCBAQAogCSAqIHRlbXBvcmFyaWx5IHZzIGEgc2VydmVyIG5vdCBzdXBwb3J0aW5nIEZhc3QgT3BlbiBhdCBhbGwuCiAJICovCiAJZmFzdG9wZW5xID0gaW5ldF9jc2soc2spLT5pY3NrX2FjY2VwdF9xdWV1ZS5mYXN0b3BlbnE7Ci0JaWYgKGZhc3RvcGVucSA9PSBOVUxMIHx8IGZhc3RvcGVucS0+bWF4X3FsZW4gPT0gMCkKKwlpZiAoIWZhc3RvcGVucSB8fCBmYXN0b3BlbnEtPm1heF9xbGVuID09IDApCiAJCXJldHVybiBmYWxzZTsKIAogCWlmIChmYXN0b3BlbnEtPnFsZW4gPj0gZmFzdG9wZW5xLT5tYXhfcWxlbikgewogCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXExOwogCQlzcGluX2xvY2soJmZhc3RvcGVucS0+bG9jayk7CiAJCXJlcTEgPSBmYXN0b3BlbnEtPnJza3FfcnN0X2hlYWQ7Ci0JCWlmICgocmVxMSA9PSBOVUxMKSB8fCB0aW1lX2FmdGVyKHJlcTEtPmV4cGlyZXMsIGppZmZpZXMpKSB7CisJCWlmICghcmVxMSB8fCB0aW1lX2FmdGVyKHJlcTEtPnJza190aW1lci5leHBpcmVzLCBqaWZmaWVzKSkgewogCQkJc3Bpbl91bmxvY2soJmZhc3RvcGVucS0+bG9jayk7CiAJCQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwKIAkJCQkJIExJTlVYX01JQl9UQ1BGQVNUT1BFTkxJU1RFTk9WRVJGTE9XKTsKQEAgLTI1NCw3ICsyNDksNyBAQAogCQlmYXN0b3BlbnEtPnJza3FfcnN0X2hlYWQgPSByZXExLT5kbF9uZXh0OwogCQlmYXN0b3BlbnEtPnFsZW4tLTsKIAkJc3Bpbl91bmxvY2soJmZhc3RvcGVucS0+bG9jayk7Ci0JCXJlcXNrX2ZyZWUocmVxMSk7CisJCXJlcXNrX3B1dChyZXExKTsKIAl9CiAJcmV0dXJuIHRydWU7CiB9CkBAIC0zMDgsNiArMzAzLDcgQEAKIAl9IGVsc2UgaWYgKGZvYy0+bGVuID4gMCkgLyogQ2xpZW50IHByZXNlbnRzIGFuIGludmFsaWQgY29va2llICovCiAJCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfVENQRkFTVE9QRU5QQVNTSVZFRkFJTCk7CiAKKwl2YWxpZF9mb2MuZXhwID0gZm9jLT5leHA7CiAJKmZvYyA9IHZhbGlkX2ZvYzsKIAlyZXR1cm4gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaW5wdXQuYyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCmluZGV4IGZiNGNmOGIuLmE3ZWY2NzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCkBAIC04NjYsNyArODY2LDcgQEAKIC8qIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGxvc3Rfb3V0IGlzIGluY3JlbWVudGVkICovCiBzdGF0aWMgdm9pZCB0Y3BfdmVyaWZ5X3JldHJhbnNtaXRfaGludChzdHJ1Y3QgdGNwX3NvY2sgKnRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmICgodHAtPnJldHJhbnNtaXRfc2tiX2hpbnQgPT0gTlVMTCkgfHwKKwlpZiAoIXRwLT5yZXRyYW5zbWl0X3NrYl9oaW50IHx8CiAJICAgIGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwKIAkJICAgVENQX1NLQl9DQih0cC0+cmV0cmFuc21pdF9za2JfaGludCktPnNlcSkpCiAJCXRwLT5yZXRyYW5zbWl0X3NrYl9oaW50ID0gc2tiOwpAQCAtMTI1Niw3ICsxMjU2LDcgQEAKIAkJZmFja19jb3VudCArPSBwY291bnQ7CiAKIAkJLyogTG9zdCBtYXJrZXIgaGludCBwYXN0IFNBQ0tlZD8gVHdlYWsgUkZDMzUxNyBjbnQgKi8KLQkJaWYgKCF0Y3BfaXNfZmFjayh0cCkgJiYgKHRwLT5sb3N0X3NrYl9oaW50ICE9IE5VTEwpICYmCisJCWlmICghdGNwX2lzX2ZhY2sodHApICYmIHRwLT5sb3N0X3NrYl9oaW50ICYmCiAJCSAgICBiZWZvcmUoc3RhcnRfc2VxLCBUQ1BfU0tCX0NCKHRwLT5sb3N0X3NrYl9oaW50KS0+c2VxKSkKIAkJCXRwLT5sb3N0X2NudF9oaW50ICs9IHBjb3VudDsKIApAQCAtMTUzNSw3ICsxNTM1LDcgQEAKIAkJaWYgKCFiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIGVuZF9zZXEpKQogCQkJYnJlYWs7CiAKLQkJaWYgKChuZXh0X2R1cCAhPSBOVUxMKSAmJgorCQlpZiAobmV4dF9kdXAgICYmCiAJCSAgICBiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIG5leHRfZHVwLT5lbmRfc2VxKSkgewogCQkJaW5fc2FjayA9IHRjcF9tYXRjaF9za2JfdG9fc2Fjayhzaywgc2tiLAogCQkJCQkJCW5leHRfZHVwLT5zdGFydF9zZXEsCkBAIC0xNTUxLDcgKzE1NTEsNyBAQAogCQlpZiAoaW5fc2FjayA8PSAwKSB7CiAJCQl0bXAgPSB0Y3Bfc2hpZnRfc2tiX2RhdGEoc2ssIHNrYiwgc3RhdGUsCiAJCQkJCQkgc3RhcnRfc2VxLCBlbmRfc2VxLCBkdXBfc2Fjayk7Ci0JCQlpZiAodG1wICE9IE5VTEwpIHsKKwkJCWlmICh0bXApIHsKIAkJCQlpZiAodG1wICE9IHNrYikgewogCQkJCQlza2IgPSB0bXA7CiAJCQkJCWNvbnRpbnVlOwpAQCAtMTYxNCw3ICsxNjE0LDcgQEAKIAkJCQkJCXN0cnVjdCB0Y3Bfc2Fja3RhZ19zdGF0ZSAqc3RhdGUsCiAJCQkJCQl1MzIgc2tpcF90b19zZXEpCiB7Ci0JaWYgKG5leHRfZHVwID09IE5VTEwpCisJaWYgKCFuZXh0X2R1cCkKIAkJcmV0dXJuIHNrYjsKIAogCWlmIChiZWZvcmUobmV4dF9kdXAtPnN0YXJ0X3NlcSwgc2tpcF90b19zZXEpKSB7CkBAIC0xNzgzLDcgKzE3ODMsNyBAQAogCQkJaWYgKHRjcF9oaWdoZXN0X3NhY2tfc2VxKHRwKSA9PSBjYWNoZS0+ZW5kX3NlcSkgewogCQkJCS8qIC4uLmJ1dCBiZXR0ZXIgZW50cnlwb2ludCBleGlzdHMhICovCiAJCQkJc2tiID0gdGNwX2hpZ2hlc3Rfc2Fjayhzayk7Ci0JCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJCWlmICghc2tiKQogCQkJCQlicmVhazsKIAkJCQlzdGF0ZS5mYWNrX2NvdW50ID0gdHAtPmZhY2tldHNfb3V0OwogCQkJCWNhY2hlKys7CkBAIC0xNzk4LDcgKzE3OTgsNyBAQAogCiAJCWlmICghYmVmb3JlKHN0YXJ0X3NlcSwgdGNwX2hpZ2hlc3Rfc2Fja19zZXEodHApKSkgewogCQkJc2tiID0gdGNwX2hpZ2hlc3Rfc2Fjayhzayk7Ci0JCQlpZiAoc2tiID09IE5VTEwpCisJCQlpZiAoIXNrYikKIAkJCQlicmVhazsKIAkJCXN0YXRlLmZhY2tfY291bnQgPSB0cC0+ZmFja2V0c19vdXQ7CiAJCX0KQEAgLTMwOTksMTQgKzMwOTksMTMgQEAKIAkJCWlmIChzYWNrZWQgJiBUQ1BDQl9TQUNLRURfUkVUUkFOUykKIAkJCQl0cC0+cmV0cmFuc19vdXQgLT0gYWNrZWRfcGNvdW50OwogCQkJZmxhZyB8PSBGTEFHX1JFVFJBTlNfREFUQV9BQ0tFRDsKLQkJfSBlbHNlIHsKKwkJfSBlbHNlIGlmICghKHNhY2tlZCAmIFRDUENCX1NBQ0tFRF9BQ0tFRCkpIHsKIAkJCWxhc3RfYWNrdCA9IHNrYi0+c2tiX21zdGFtcDsKIAkJCVdBUk5fT05fT05DRShsYXN0X2Fja3QudjY0ID09IDApOwogCQkJaWYgKCFmaXJzdF9hY2t0LnY2NCkKIAkJCQlmaXJzdF9hY2t0ID0gbGFzdF9hY2t0OwogCi0JCQlpZiAoIShzYWNrZWQgJiBUQ1BDQl9TQUNLRURfQUNLRUQpKQotCQkJCXJlb3JkID0gbWluKHBrdHNfYWNrZWQsIHJlb3JkKTsKKwkJCXJlb3JkID0gbWluKHBrdHNfYWNrZWQsIHJlb3JkKTsKIAkJCWlmICghYWZ0ZXIoc2NiLT5lbmRfc2VxLCB0cC0+aGlnaF9zZXEpKQogCQkJCWZsYWcgfD0gRkxBR19PUklHX1NBQ0tfQUNLRUQ7CiAJCX0KQEAgLTMzMjEsNiArMzMyMCwzNiBAQAogCXJldHVybiBmbGFnOwogfQogCisvKiBSZXR1cm4gdHJ1ZSBpZiB3ZSdyZSBjdXJyZW50bHkgcmF0ZS1saW1pdGluZyBvdXQtb2Ytd2luZG93IEFDS3MgYW5kCisgKiB0aHVzIHNob3VsZG4ndCBzZW5kIGEgZHVwYWNrIHJpZ2h0IG5vdy4gV2UgcmF0ZS1saW1pdCBkdXBhY2tzIGluCisgKiByZXNwb25zZSB0byBvdXQtb2Ytd2luZG93IFNZTnMgb3IgQUNLcyB0byBtaXRpZ2F0ZSBBQ0sgbG9vcHMgb3IgRG9TCisgKiBhdHRhY2tzIHRoYXQgc2VuZCByZXBlYXRlZCBTWU5zIG9yIEFDS3MgZm9yIHRoZSBzYW1lIGNvbm5lY3Rpb24uIFRvCisgKiBkbyB0aGlzLCB3ZSBkbyBub3Qgc2VuZCBhIGR1cGxpY2F0ZSBTWU5BQ0sgb3IgQUNLIGlmIHRoZSByZW1vdGUKKyAqIGVuZHBvaW50IGlzIHNlbmRpbmcgb3V0LW9mLXdpbmRvdyBTWU5zIG9yIHB1cmUgQUNLcyBhdCBhIGhpZ2ggcmF0ZS4KKyAqLworYm9vbCB0Y3Bfb293X3JhdGVfbGltaXRlZChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkgIGludCBtaWJfaWR4LCB1MzIgKmxhc3Rfb293X2Fja190aW1lKQoreworCS8qIERhdGEgcGFja2V0cyB3aXRob3V0IFNZTnMgYXJlIG5vdCBsaWtlbHkgcGFydCBvZiBhbiBBQ0sgbG9vcC4gKi8KKwlpZiAoKFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICE9IFRDUF9TS0JfQ0Ioc2tiKS0+ZW5kX3NlcSkgJiYKKwkgICAgIXRjcF9oZHIoc2tiKS0+c3luKQorCQlnb3RvIG5vdF9yYXRlX2xpbWl0ZWQ7CisKKwlpZiAoKmxhc3Rfb293X2Fja190aW1lKSB7CisJCXMzMiBlbGFwc2VkID0gKHMzMikodGNwX3RpbWVfc3RhbXAgLSAqbGFzdF9vb3dfYWNrX3RpbWUpOworCisJCWlmICgwIDw9IGVsYXBzZWQgJiYgZWxhcHNlZCA8IHN5c2N0bF90Y3BfaW52YWxpZF9yYXRlbGltaXQpIHsKKwkJCU5FVF9JTkNfU1RBVFNfQkgobmV0LCBtaWJfaWR4KTsKKwkJCXJldHVybiB0cnVlOwkvKiByYXRlLWxpbWl0ZWQ6IGRvbid0IHNlbmQgeWV0ISAqLworCQl9CisJfQorCisJKmxhc3Rfb293X2Fja190aW1lID0gdGNwX3RpbWVfc3RhbXA7CisKK25vdF9yYXRlX2xpbWl0ZWQ6CisJcmV0dXJuIGZhbHNlOwkvKiBub3QgcmF0ZS1saW1pdGVkOiBnbyBhaGVhZCwgc2VuZCBkdXBhY2sgbm93ISAqLworfQorCiAvKiBSRkMgNTk2MSA3IFtBQ0sgVGhyb3R0bGluZ10gKi8KIHN0YXRpYyB2b2lkIHRjcF9zZW5kX2NoYWxsZW5nZV9hY2soc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtMzU3Miw2ICszNjAxLDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHRjcF9wYXJzZV9mYXN0b3Blbl9vcHRpb24oaW50IGxlbiwgY29uc3QgdW5zaWduZWQgY2hhciAqY29va2llLAorCQkJCSAgICAgIGJvb2wgc3luLCBzdHJ1Y3QgdGNwX2Zhc3RvcGVuX2Nvb2tpZSAqZm9jLAorCQkJCSAgICAgIGJvb2wgZXhwX29wdCkKK3sKKwkvKiBWYWxpZCBvbmx5IGluIFNZTiBvciBTWU4tQUNLIHdpdGggYW4gZXZlbiBsZW5ndGguICAqLworCWlmICghZm9jIHx8ICFzeW4gfHwgbGVuIDwgMCB8fCAobGVuICYgMSkpCisJCXJldHVybjsKKworCWlmIChsZW4gPj0gVENQX0ZBU1RPUEVOX0NPT0tJRV9NSU4gJiYKKwkgICAgbGVuIDw9IFRDUF9GQVNUT1BFTl9DT09LSUVfTUFYKQorCQltZW1jcHkoZm9jLT52YWwsIGNvb2tpZSwgbGVuKTsKKwllbHNlIGlmIChsZW4gIT0gMCkKKwkJbGVuID0gLTE7CisJZm9jLT5sZW4gPSBsZW47CisJZm9jLT5leHAgPSBleHBfb3B0OworfQorCiAvKiBMb29rIGZvciB0Y3Agb3B0aW9ucy4gTm9ybWFsbHkgb25seSBjYWxsZWQgb24gU1lOIGFuZCBTWU5BQ0sgcGFja2V0cy4KICAqIEJ1dCwgdGhpcyBjYW4gYWxzbyBiZSBjYWxsZWQgb24gcGFja2V0cyBpbiB0aGUgZXN0YWJsaXNoZWQgZmxvdyB3aGVuCiAgKiB0aGUgZmFzdCB2ZXJzaW9uIGJlbG93IGZhaWxzLgpAQCAtMzY2MSwyMSArMzcwNywyMiBAQAogCQkJCSAqLwogCQkJCWJyZWFrOwogI2VuZGlmCisJCQljYXNlIFRDUE9QVF9GQVNUT1BFTjoKKwkJCQl0Y3BfcGFyc2VfZmFzdG9wZW5fb3B0aW9uKAorCQkJCQlvcHNpemUgLSBUQ1BPTEVOX0ZBU1RPUEVOX0JBU0UsCisJCQkJCXB0ciwgdGgtPnN5biwgZm9jLCBmYWxzZSk7CisJCQkJYnJlYWs7CisKIAkJCWNhc2UgVENQT1BUX0VYUDoKIAkJCQkvKiBGYXN0IE9wZW4gb3B0aW9uIHNoYXJlcyBjb2RlIDI1NCB1c2luZyBhCi0JCQkJICogMTYgYml0cyBtYWdpYyBudW1iZXIuIEl0J3MgdmFsaWQgb25seSBpbgotCQkJCSAqIFNZTiBvciBTWU4tQUNLIHdpdGggYW4gZXZlbiBzaXplLgorCQkJCSAqIDE2IGJpdHMgbWFnaWMgbnVtYmVyLgogCQkJCSAqLwotCQkJCWlmIChvcHNpemUgPCBUQ1BPTEVOX0VYUF9GQVNUT1BFTl9CQVNFIHx8Ci0JCQkJICAgIGdldF91bmFsaWduZWRfYmUxNihwdHIpICE9IFRDUE9QVF9GQVNUT1BFTl9NQUdJQyB8fAotCQkJCSAgICBmb2MgPT0gTlVMTCB8fCAhdGgtPnN5biB8fCAob3BzaXplICYgMSkpCi0JCQkJCWJyZWFrOwotCQkJCWZvYy0+bGVuID0gb3BzaXplIC0gVENQT0xFTl9FWFBfRkFTVE9QRU5fQkFTRTsKLQkJCQlpZiAoZm9jLT5sZW4gPj0gVENQX0ZBU1RPUEVOX0NPT0tJRV9NSU4gJiYKLQkJCQkgICAgZm9jLT5sZW4gPD0gVENQX0ZBU1RPUEVOX0NPT0tJRV9NQVgpCi0JCQkJCW1lbWNweShmb2MtPnZhbCwgcHRyICsgMiwgZm9jLT5sZW4pOwotCQkJCWVsc2UgaWYgKGZvYy0+bGVuICE9IDApCi0JCQkJCWZvYy0+bGVuID0gLTE7CisJCQkJaWYgKG9wc2l6ZSA+PSBUQ1BPTEVOX0VYUF9GQVNUT1BFTl9CQVNFICYmCisJCQkJICAgIGdldF91bmFsaWduZWRfYmUxNihwdHIpID09CisJCQkJICAgIFRDUE9QVF9GQVNUT1BFTl9NQUdJQykKKwkJCQkJdGNwX3BhcnNlX2Zhc3RvcGVuX29wdGlvbihvcHNpemUgLQorCQkJCQkJVENQT0xFTl9FWFBfRkFTVE9QRU5fQkFTRSwKKwkJCQkJCXB0ciArIDIsIHRoLT5zeW4sIGZvYywgdHJ1ZSk7CiAJCQkJYnJlYWs7CiAKIAkJCX0KQEAgLTQ2MzksNyArNDY4Niw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKmhlYWQ7CiAJdTMyIHN0YXJ0LCBlbmQ7CiAKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCXJldHVybjsKIAogCXN0YXJ0ID0gVENQX1NLQl9DQihza2IpLT5zZXE7CkBAIC01MDk0LDcgKzUxNDEsNyBAQAogewogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCi0JaWYgKHVubGlrZWx5KHNrLT5za19yeF9kc3QgPT0gTlVMTCkpCisJaWYgKHVubGlrZWx5KCFzay0+c2tfcnhfZHN0KSkKIAkJaW5ldF9jc2soc2spLT5pY3NrX2FmX29wcy0+c2tfcnhfZHN0X3NldChzaywgc2tiKTsKIAkvKgogCSAqCUhlYWRlciBwcmVkaWN0aW9uLgpAQCAtNTI5MSw3ICs1MzM4LDcgQEAKIAogCXRjcF9zZXRfc3RhdGUoc2ssIFRDUF9FU1RBQkxJU0hFRCk7CiAKLQlpZiAoc2tiICE9IE5VTEwpIHsKKwlpZiAoc2tiKSB7CiAJCWljc2stPmljc2tfYWZfb3BzLT5za19yeF9kc3Rfc2V0KHNrLCBza2IpOwogCQlzZWN1cml0eV9pbmV0X2Nvbm5fZXN0YWJsaXNoZWQoc2ssIHNrYik7CiAJfQpAQCAtNTMyOSw4ICs1Mzc2LDggQEAKIHsKIAlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqZGF0YSA9IHRwLT5zeW5fZGF0YSA/IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKSA6IE5VTEw7Ci0JdTE2IG1zcyA9IHRwLT5yeF9vcHQubXNzX2NsYW1wOwotCWJvb2wgc3luX2Ryb3A7CisJdTE2IG1zcyA9IHRwLT5yeF9vcHQubXNzX2NsYW1wLCB0cnlfZXhwID0gMDsKKwlib29sIHN5bl9kcm9wID0gZmFsc2U7CiAKIAlpZiAobXNzID09IHRwLT5yeF9vcHQudXNlcl9tc3MpIHsKIAkJc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkIG9wdDsKQEAgLTUzNDIsMTYgKzUzODksMjUgQEAKIAkJbXNzID0gb3B0Lm1zc19jbGFtcDsKIAl9CiAKLQlpZiAoIXRwLT5zeW5fZmFzdG9wZW4pICAvKiBJZ25vcmUgYW4gdW5zb2xpY2l0ZWQgY29va2llICovCisJaWYgKCF0cC0+c3luX2Zhc3RvcGVuKSB7CisJCS8qIElnbm9yZSBhbiB1bnNvbGljaXRlZCBjb29raWUgKi8KIAkJY29va2llLT5sZW4gPSAtMTsKKwl9IGVsc2UgaWYgKHRwLT50b3RhbF9yZXRyYW5zKSB7CisJCS8qIFNZTiB0aW1lZCBvdXQgYW5kIHRoZSBTWU4tQUNLIG5laXRoZXIgaGFzIGEgY29va2llIG5vcgorCQkgKiBhY2tub3dsZWRnZXMgZGF0YS4gUHJlc3VtYWJseSB0aGUgcmVtb3RlIHJlY2VpdmVkIG9ubHkKKwkJICogdGhlIHJldHJhbnNtaXR0ZWQgKHJlZ3VsYXIpIFNZTnM6IGVpdGhlciB0aGUgb3JpZ2luYWwKKwkJICogU1lOLWRhdGEgb3IgdGhlIGNvcnJlc3BvbmRpbmcgU1lOLUFDSyB3YXMgZHJvcHBlZC4KKwkJICovCisJCXN5bl9kcm9wID0gKGNvb2tpZS0+bGVuIDwgMCAmJiBkYXRhKTsKKwl9IGVsc2UgaWYgKGNvb2tpZS0+bGVuIDwgMCAmJiAhdHAtPnN5bl9kYXRhKSB7CisJCS8qIFdlIHJlcXVlc3RlZCBhIGNvb2tpZSBidXQgZGlkbid0IGdldCBpdC4gSWYgd2UgZGlkIG5vdCB1c2UKKwkJICogdGhlIChvbGQpIGV4cCBvcHQgZm9ybWF0IHRoZW4gdHJ5IHNvIG5leHQgdGltZSAodHJ5X2V4cD0xKS4KKwkJICogT3RoZXJ3aXNlIHdlIGdvIGJhY2sgdG8gdXNlIHRoZSBSRkM3NDEzIG9wdCAodHJ5X2V4cD0yKS4KKwkJICovCisJCXRyeV9leHAgPSB0cC0+c3luX2Zhc3RvcGVuX2V4cCA/IDIgOiAxOworCX0KIAotCS8qIFRoZSBTWU4tQUNLIG5laXRoZXIgaGFzIGNvb2tpZSBub3IgYWNrbm93bGVkZ2VzIHRoZSBkYXRhLiBQcmVzdW1hYmx5Ci0JICogdGhlIHJlbW90ZSByZWNlaXZlcyBvbmx5IHRoZSByZXRyYW5zbWl0dGVkIChyZWd1bGFyKSBTWU5zOiBlaXRoZXIKLQkgKiB0aGUgb3JpZ2luYWwgU1lOLWRhdGEgb3IgdGhlIGNvcnJlc3BvbmRpbmcgU1lOLUFDSyBpcyBsb3N0LgotCSAqLwotCXN5bl9kcm9wID0gKGNvb2tpZS0+bGVuIDw9IDAgJiYgZGF0YSAmJiB0cC0+dG90YWxfcmV0cmFucyk7Ci0KLQl0Y3BfZmFzdG9wZW5fY2FjaGVfc2V0KHNrLCBtc3MsIGNvb2tpZSwgc3luX2Ryb3ApOworCXRjcF9mYXN0b3Blbl9jYWNoZV9zZXQoc2ssIG1zcywgY29va2llLCBzeW5fZHJvcCwgdHJ5X2V4cCk7CiAKIAlpZiAoZGF0YSkgeyAvKiBSZXRyYW5zbWl0IHVuYWNrZWQgZGF0YSBpbiBTWU4gKi8KIAkJdGNwX2Zvcl93cml0ZV9xdWV1ZV9mcm9tKGRhdGEsIHNrKSB7CkBAIC01NjYwLDExICs1NzE2LDExIEBACiAJfQogCiAJcmVxID0gdHAtPmZhc3RvcGVuX3JzazsKLQlpZiAocmVxICE9IE5VTEwpIHsKKwlpZiAocmVxKSB7CiAJCVdBUk5fT05fT05DRShzay0+c2tfc3RhdGUgIT0gVENQX1NZTl9SRUNWICYmCiAJCSAgICBzay0+c2tfc3RhdGUgIT0gVENQX0ZJTl9XQUlUMSk7CiAKLQkJaWYgKHRjcF9jaGVja19yZXEoc2ssIHNrYiwgcmVxLCBOVUxMLCB0cnVlKSA9PSBOVUxMKQorCQlpZiAoIXRjcF9jaGVja19yZXEoc2ssIHNrYiwgcmVxLCB0cnVlKSkKIAkJCWdvdG8gZGlzY2FyZDsKIAl9CiAKQEAgLTU3NTAsNyArNTgwNiw3IEBACiAJCSAqIEFDSyB3ZSBoYXZlIHJlY2VpdmVkLCB0aGlzIHdvdWxkIGhhdmUgYWNrbm93bGVkZ2VkCiAJCSAqIG91ciBTWU5BQ0sgc28gc3RvcCB0aGUgU1lOQUNLIHRpbWVyLgogCQkgKi8KLQkJaWYgKHJlcSAhPSBOVUxMKSB7CisJCWlmIChyZXEpIHsKIAkJCS8qIFJldHVybiBSU1QgaWYgYWNrX3NlcSBpcyBpbnZhbGlkLgogCQkJICogTm90ZSB0aGF0IFJGQzc5MyBvbmx5IHNheXMgdG8gZ2VuZXJhdGUgYQogCQkJICogRFVQQUNLIGZvciBpdCBidXQgZm9yIFRDUCBGYXN0IE9wZW4gaXQgc2VlbXMKQEAgLTU5MTIsNiArNTk2OCw4MCBAQAogCQlpbmV0X3JzayhyZXEpLT5lY25fb2sgPSAxOwogfQogCitzdGF0aWMgdm9pZCB0Y3Bfb3BlbnJlcV9pbml0KHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkICpyeF9vcHQsCisJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXEgPSBpbmV0X3JzayhyZXEpOworCisJcmVxLT5yY3Zfd25kID0gMDsJCS8qIFNvIHRoYXQgdGNwX3NlbmRfc3luYWNrKCkga25vd3MhICovCisJcmVxLT5jb29raWVfdHMgPSAwOworCXRjcF9yc2socmVxKS0+cmN2X2lzbiA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOworCXRjcF9yc2socmVxKS0+cmN2X254dCA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxICsgMTsKKwl0Y3BfcnNrKHJlcSktPnNudF9zeW5hY2sgPSB0Y3BfdGltZV9zdGFtcDsKKwl0Y3BfcnNrKHJlcSktPmxhc3Rfb293X2Fja190aW1lID0gMDsKKwlyZXEtPm1zcyA9IHJ4X29wdC0+bXNzX2NsYW1wOworCXJlcS0+dHNfcmVjZW50ID0gcnhfb3B0LT5zYXdfdHN0YW1wID8gcnhfb3B0LT5yY3ZfdHN2YWwgOiAwOworCWlyZXEtPnRzdGFtcF9vayA9IHJ4X29wdC0+dHN0YW1wX29rOworCWlyZXEtPnNhY2tfb2sgPSByeF9vcHQtPnNhY2tfb2s7CisJaXJlcS0+c25kX3dzY2FsZSA9IHJ4X29wdC0+c25kX3dzY2FsZTsKKwlpcmVxLT53c2NhbGVfb2sgPSByeF9vcHQtPndzY2FsZV9vazsKKwlpcmVxLT5hY2tlZCA9IDA7CisJaXJlcS0+ZWNuX29rID0gMDsKKwlpcmVxLT5pcl9ybXRfcG9ydCA9IHRjcF9oZHIoc2tiKS0+c291cmNlOworCWlyZXEtPmlyX251bSA9IG50b2hzKHRjcF9oZHIoc2tiKS0+ZGVzdCk7CisJaXJlcS0+aXJfbWFyayA9IGluZXRfcmVxdWVzdF9tYXJrKHNrLCBza2IpOworfQorCitzdHJ1Y3QgcmVxdWVzdF9zb2NrICppbmV0X3JlcXNrX2FsbG9jKGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2tfb3BzICpvcHMsCisJCQkJICAgICAgc3RydWN0IHNvY2sgKnNrX2xpc3RlbmVyKQoreworCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSA9IHJlcXNrX2FsbG9jKG9wcywgc2tfbGlzdGVuZXIpOworCisJaWYgKHJlcSkgeworCQlzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgKmlyZXEgPSBpbmV0X3JzayhyZXEpOworCisJCWttZW1jaGVja19hbm5vdGF0ZV9iaXRmaWVsZChpcmVxLCBmbGFncyk7CisJCWlyZXEtPm9wdCA9IE5VTEw7CisJCWF0b21pYzY0X3NldCgmaXJlcS0+aXJfY29va2llLCAwKTsKKwkJaXJlcS0+aXJlcV9zdGF0ZSA9IFRDUF9ORVdfU1lOX1JFQ1Y7CisJCXdyaXRlX3BuZXQoJmlyZXEtPmlyZXFfbmV0LCBzb2NrX25ldChza19saXN0ZW5lcikpOworCQlpcmVxLT5pcmVxX2ZhbWlseSA9IHNrX2xpc3RlbmVyLT5za19mYW1pbHk7CisJfQorCisJcmV0dXJuIHJlcTsKK30KK0VYUE9SVF9TWU1CT0woaW5ldF9yZXFza19hbGxvYyk7CisKKy8qCisgKiBSZXR1cm4gdHJ1ZSBpZiBhIHN5bmNvb2tpZSBzaG91bGQgYmUgc2VudAorICovCitzdGF0aWMgYm9vbCB0Y3Bfc3luX2Zsb29kX2FjdGlvbihzdHJ1Y3Qgc29jayAqc2ssCisJCQkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIGNvbnN0IGNoYXIgKnByb3RvKQoreworCWNvbnN0IGNoYXIgKm1zZyA9ICJEcm9wcGluZyByZXF1ZXN0IjsKKwlib29sIHdhbnRfY29va2llID0gZmFsc2U7CisJc3RydWN0IGxpc3Rlbl9zb2NrICpsb3B0OworCisjaWZkZWYgQ09ORklHX1NZTl9DT09LSUVTCisJaWYgKHN5c2N0bF90Y3Bfc3luY29va2llcykgeworCQltc2cgPSAiU2VuZGluZyBjb29raWVzIjsKKwkJd2FudF9jb29raWUgPSB0cnVlOworCQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUFJFUVFGVUxMRE9DT09LSUVTKTsKKwl9IGVsc2UKKyNlbmRpZgorCQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUFJFUVFGVUxMRFJPUCk7CisKKwlsb3B0ID0gaW5ldF9jc2soc2spLT5pY3NrX2FjY2VwdF9xdWV1ZS5saXN0ZW5fb3B0OworCWlmICghbG9wdC0+c3luZmxvb2Rfd2FybmVkICYmIHN5c2N0bF90Y3Bfc3luY29va2llcyAhPSAyKSB7CisJCWxvcHQtPnN5bmZsb29kX3dhcm5lZCA9IDE7CisJCXByX2luZm8oIiVzOiBQb3NzaWJsZSBTWU4gZmxvb2Rpbmcgb24gcG9ydCAlZC4gJXMuICBDaGVjayBTTk1QIGNvdW50ZXJzLlxuIiwKKwkJCXByb3RvLCBudG9ocyh0Y3BfaGRyKHNrYiktPmRlc3QpLCBtc2cpOworCX0KKwlyZXR1cm4gd2FudF9jb29raWU7Cit9CisKIGludCB0Y3BfY29ubl9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3NvY2tfb3BzICpyc2tfb3BzLAogCQkgICAgIGNvbnN0IHN0cnVjdCB0Y3BfcmVxdWVzdF9zb2NrX29wcyAqYWZfb3BzLAogCQkgICAgIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTU5NDksNyArNjA3OSw3IEBACiAJCWdvdG8gZHJvcDsKIAl9CiAKLQlyZXEgPSBpbmV0X3JlcXNrX2FsbG9jKHJza19vcHMpOworCXJlcSA9IGluZXRfcmVxc2tfYWxsb2MocnNrX29wcywgc2spOwogCWlmICghcmVxKQogCQlnb3RvIGRyb3A7CiAKQEAgLTU5NjYsNiArNjA5Niw5IEBACiAJdG1wX29wdC50c3RhbXBfb2sgPSB0bXBfb3B0LnNhd190c3RhbXA7CiAJdGNwX29wZW5yZXFfaW5pdChyZXEsICZ0bXBfb3B0LCBza2IsIHNrKTsKIAorCS8qIE5vdGU6IHRjcF92Nl9pbml0X3JlcSgpIG1pZ2h0IG92ZXJyaWRlIGlyX2lpZiBmb3IgbGluayBsb2NhbHMgKi8KKwlpbmV0X3JzayhyZXEpLT5pcl9paWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCiAJYWZfb3BzLT5pbml0X3JlcShyZXEsIHNrLCBza2IpOwogCiAJaWYgKHNlY3VyaXR5X2luZXRfY29ubl9yZXF1ZXN0KHNrLCBza2IsIHJlcSkpCkBAIC02MDM4LDcgKzYxNzEsNyBAQAogCQlpZiAoZXJyIHx8IHdhbnRfY29va2llKQogCQkJZ290byBkcm9wX2FuZF9mcmVlOwogCi0JCXRjcF9yc2socmVxKS0+bGlzdGVuZXIgPSBOVUxMOworCQl0Y3BfcnNrKHJlcSktPnRmb19saXN0ZW5lciA9IGZhbHNlOwogCQlhZl9vcHMtPnF1ZXVlX2hhc2hfYWRkKHNrLCByZXEsIFRDUF9USU1FT1VUX0lOSVQpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX2lwdjQuYyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKaW5kZXggNWEyZGZlZC4uMzU3MWYyYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX2lwdjQuYworKysgYi9uZXQvaXB2NC90Y3BfaXB2NC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKIAkgICBhbmQgdXNlIGluaXRpYWwgdGltZXN0YW1wIHJldHJpZXZlZCBmcm9tIHBlZXIgdGFibGUuCiAJICovCiAJaWYgKHRjcHR3LT50d190c19yZWNlbnRfc3RhbXAgJiYKLQkgICAgKHR3cCA9PSBOVUxMIHx8IChzeXNjdGxfdGNwX3R3X3JldXNlICYmCisJICAgICghdHdwIHx8IChzeXNjdGxfdGNwX3R3X3JldXNlICYmCiAJCQkgICAgIGdldF9zZWNvbmRzKCkgLSB0Y3B0dy0+dHdfdHNfcmVjZW50X3N0YW1wID4gMSkpKSB7CiAJCXRwLT53cml0ZV9zZXEgPSB0Y3B0dy0+dHdfc25kX254dCArIDY1NTM1ICsgMjsKIAkJaWYgKHRwLT53cml0ZV9zZXEgPT0gMCkKQEAgLTE4OSw3ICsxODksNyBAQAogCiAJaWYgKCFpbmV0LT5pbmV0X3NhZGRyKQogCQlpbmV0LT5pbmV0X3NhZGRyID0gZmw0LT5zYWRkcjsKLQlpbmV0LT5pbmV0X3Jjdl9zYWRkciA9IGluZXQtPmluZXRfc2FkZHI7CisJc2tfcmN2X3NhZGRyX3NldChzaywgaW5ldC0+aW5ldF9zYWRkcik7CiAKIAlpZiAodHAtPnJ4X29wdC50c19yZWNlbnRfc3RhbXAgJiYgaW5ldC0+aW5ldF9kYWRkciAhPSBkYWRkcikgewogCQkvKiBSZXNldCBpbmhlcml0ZWQgc3RhdGUgKi8KQEAgLTIwNCw3ICsyMDQsNyBAQAogCQl0Y3BfZmV0Y2hfdGltZXdhaXRfc3RhbXAoc2ssICZydC0+ZHN0KTsKIAogCWluZXQtPmluZXRfZHBvcnQgPSB1c2luLT5zaW5fcG9ydDsKLQlpbmV0LT5pbmV0X2RhZGRyID0gZGFkZHI7CisJc2tfZGFkZHJfc2V0KHNrLCBkYWRkcik7CiAKIAlpbmV0X2NzayhzayktPmljc2tfZXh0X2hkcl9sZW4gPSAwOwogCWlmIChpbmV0X29wdCkKQEAgLTMxMCw2ICszMTAsMzQgQEAKIAkJZHN0LT5vcHMtPnJlZGlyZWN0KGRzdCwgc2ssIHNrYik7CiB9CiAKKworLyogaGFuZGxlIElDTVAgbWVzc2FnZXMgb24gVENQX05FV19TWU5fUkVDViByZXF1ZXN0IHNvY2tldHMgKi8KK3ZvaWQgdGNwX3JlcV9lcnIoc3RydWN0IHNvY2sgKnNrLCB1MzIgc2VxKQoreworCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSA9IGluZXRfcmVxc2soc2spOworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKKworCS8qIElDTVBzIGFyZSBub3QgYmFja2xvZ2dlZCwgaGVuY2Ugd2UgY2Fubm90IGdldAorCSAqIGFuIGVzdGFibGlzaGVkIHNvY2tldCBoZXJlLgorCSAqLworCVdBUk5fT04ocmVxLT5zayk7CisKKwlpZiAoc2VxICE9IHRjcF9yc2socmVxKS0+c250X2lzbikgeworCQlORVRfSU5DX1NUQVRTX0JIKG5ldCwgTElOVVhfTUlCX09VVE9GV0lORE9XSUNNUFMpOworCQlyZXFza19wdXQocmVxKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTdGlsbCBpbiBTWU5fUkVDViwganVzdCByZW1vdmUgaXQgc2lsZW50bHkuCisJCSAqIFRoZXJlIGlzIG5vIGdvb2Qgd2F5IHRvIHBhc3MgdGhlIGVycm9yIHRvIHRoZSBuZXdseQorCQkgKiBjcmVhdGVkIHNvY2tldCwgYW5kIFBPU0lYIGRvZXMgbm90IHdhbnQgbmV0d29yaworCQkgKiBlcnJvcnMgcmV0dXJuZWQgZnJvbSBhY2NlcHQoKS4KKwkJICovCisJCU5FVF9JTkNfU1RBVFNfQkgobmV0LCBMSU5VWF9NSUJfTElTVEVORFJPUFMpOworCQlpbmV0X2Nza19yZXFza19xdWV1ZV9kcm9wKHJlcS0+cnNrX2xpc3RlbmVyLCByZXEpOworCX0KK30KK0VYUE9SVF9TWU1CT0wodGNwX3JlcV9lcnIpOworCiAvKgogICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgSUNNUCBtb2R1bGUgd2hlbiBpdCBnZXRzIHNvbWUKICAqIHNvcnQgb2YgZXJyb3IgY29uZGl0aW9uLiAgSWYgZXJyIDwgMCB0aGVuIHRoZSBzb2NrZXQgc2hvdWxkCkBAIC0zNDMsOCArMzcxLDkgQEAKIAlpbnQgZXJyOwogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoaWNtcF9za2ItPmRldik7CiAKLQlzayA9IGluZXRfbG9va3VwKG5ldCwgJnRjcF9oYXNoaW5mbywgaXBoLT5kYWRkciwgdGgtPmRlc3QsCi0JCQlpcGgtPnNhZGRyLCB0aC0+c291cmNlLCBpbmV0X2lpZihpY21wX3NrYikpOworCXNrID0gX19pbmV0X2xvb2t1cF9lc3RhYmxpc2hlZChuZXQsICZ0Y3BfaGFzaGluZm8sIGlwaC0+ZGFkZHIsCisJCQkJICAgICAgIHRoLT5kZXN0LCBpcGgtPnNhZGRyLCBudG9ocyh0aC0+c291cmNlKSwKKwkJCQkgICAgICAgaW5ldF9paWYoaWNtcF9za2IpKTsKIAlpZiAoIXNrKSB7CiAJCUlDTVBfSU5DX1NUQVRTX0JIKG5ldCwgSUNNUF9NSUJfSU5FUlJPUlMpOwogCQlyZXR1cm47CkBAIC0zNTMsNiArMzgyLDkgQEAKIAkJaW5ldF90d3NrX3B1dChpbmV0X3R3c2soc2spKTsKIAkJcmV0dXJuOwogCX0KKwlzZXEgPSBudG9obCh0aC0+c2VxKTsKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9ORVdfU1lOX1JFQ1YpCisJCXJldHVybiB0Y3BfcmVxX2Vycihzaywgc2VxKTsKIAogCWJoX2xvY2tfc29jayhzayk7CiAJLyogSWYgdG9vIG1hbnkgSUNNUHMgZ2V0IGRyb3BwZWQgb24gYnVzeQpAQCAtMzc0LDcgKzQwNiw2IEBACiAKIAlpY3NrID0gaW5ldF9jc2soc2spOwogCXRwID0gdGNwX3NrKHNrKTsKLQlzZXEgPSBudG9obCh0aC0+c2VxKTsKIAkvKiBYWFggKFRGTykgLSB0cC0+c25kX3VuYSBzaG91bGQgYmUgSVNOICh0Y3BfY3JlYXRlX29wZW5yZXFfY2hpbGQoKSAqLwogCWZhc3RvcGVuID0gdHAtPmZhc3RvcGVuX3JzazsKIAlzbmRfdW5hID0gZmFzdG9wZW4gPyB0Y3BfcnNrKGZhc3RvcGVuKS0+c250X2lzbiA6IHRwLT5zbmRfdW5hOwpAQCAtNDU4LDQyICs0ODksMTIgQEAKIAl9CiAKIAlzd2l0Y2ggKHNrLT5za19zdGF0ZSkgewotCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsICoqcHJldjsKLQljYXNlIFRDUF9MSVNURU46Ci0JCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKQotCQkJZ290byBvdXQ7Ci0KLQkJcmVxID0gaW5ldF9jc2tfc2VhcmNoX3JlcShzaywgJnByZXYsIHRoLT5kZXN0LAotCQkJCQkgIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIpOwotCQlpZiAoIXJlcSkKLQkJCWdvdG8gb3V0OwotCi0JCS8qIElDTVBzIGFyZSBub3QgYmFja2xvZ2dlZCwgaGVuY2Ugd2UgY2Fubm90IGdldAotCQkgICBhbiBlc3RhYmxpc2hlZCBzb2NrZXQgaGVyZS4KLQkJICovCi0JCVdBUk5fT04ocmVxLT5zayk7Ci0KLQkJaWYgKHNlcSAhPSB0Y3BfcnNrKHJlcSktPnNudF9pc24pIHsKLQkJCU5FVF9JTkNfU1RBVFNfQkgobmV0LCBMSU5VWF9NSUJfT1VUT0ZXSU5ET1dJQ01QUyk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCi0JCS8qCi0JCSAqIFN0aWxsIGluIFNZTl9SRUNWLCBqdXN0IHJlbW92ZSBpdCBzaWxlbnRseS4KLQkJICogVGhlcmUgaXMgbm8gZ29vZCB3YXkgdG8gcGFzcyB0aGUgZXJyb3IgdG8gdGhlIG5ld2x5Ci0JCSAqIGNyZWF0ZWQgc29ja2V0LCBhbmQgUE9TSVggZG9lcyBub3Qgd2FudCBuZXR3b3JrCi0JCSAqIGVycm9ycyByZXR1cm5lZCBmcm9tIGFjY2VwdCgpLgotCQkgKi8KLQkJaW5ldF9jc2tfcmVxc2tfcXVldWVfZHJvcChzaywgcmVxLCBwcmV2KTsKLQkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9MSVNURU5EUk9QUyk7Ci0JCWdvdG8gb3V0OwotCiAJY2FzZSBUQ1BfU1lOX1NFTlQ6CiAJY2FzZSBUQ1BfU1lOX1JFQ1Y6CiAJCS8qIE9ubHkgaW4gZmFzdCBvciBzaW11bHRhbmVvdXMgb3Blbi4gSWYgYSBmYXN0IG9wZW4gc29ja2V0IGlzCiAJCSAqIGlzIGFscmVhZHkgYWNjZXB0ZWQgaXQgaXMgdHJlYXRlZCBhcyBhIGNvbm5lY3RlZCBvbmUgYmVsb3cuCiAJCSAqLwotCQlpZiAoZmFzdG9wZW4gJiYgZmFzdG9wZW4tPnNrID09IE5VTEwpCisJCWlmIChmYXN0b3BlbiAmJiAhZmFzdG9wZW4tPnNrKQogCQkJYnJlYWs7CiAKIAkJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CkBAIC02NDcsNyArNjQ4LDcgQEAKIAkJaWYgKCFrZXkpCiAJCQlnb3RvIHJlbGVhc2Vfc2sxOwogCi0JCWdlbmhhc2ggPSB0Y3BfdjRfbWQ1X2hhc2hfc2tiKG5ld2hhc2gsIGtleSwgTlVMTCwgTlVMTCwgc2tiKTsKKwkJZ2VuaGFzaCA9IHRjcF92NF9tZDVfaGFzaF9za2IobmV3aGFzaCwga2V5LCBOVUxMLCBza2IpOwogCQlpZiAoZ2VuaGFzaCB8fCBtZW1jbXAoaGFzaF9sb2NhdGlvbiwgbmV3aGFzaCwgMTYpICE9IDApCiAJCQlnb3RvIHJlbGVhc2Vfc2sxOwogCX0gZWxzZSB7CkBAIC04NTUsMzUgKzg1Niw2IEBACiAJa2ZyZWUoaW5ldF9yc2socmVxKS0+b3B0KTsKIH0KIAotLyoKLSAqIFJldHVybiB0cnVlIGlmIGEgc3luY29va2llIHNob3VsZCBiZSBzZW50Ci0gKi8KLWJvb2wgdGNwX3N5bl9mbG9vZF9hY3Rpb24oc3RydWN0IHNvY2sgKnNrLAotCQkJIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgY29uc3QgY2hhciAqcHJvdG8pCi17Ci0JY29uc3QgY2hhciAqbXNnID0gIkRyb3BwaW5nIHJlcXVlc3QiOwotCWJvb2wgd2FudF9jb29raWUgPSBmYWxzZTsKLQlzdHJ1Y3QgbGlzdGVuX3NvY2sgKmxvcHQ7Ci0KLSNpZmRlZiBDT05GSUdfU1lOX0NPT0tJRVMKLQlpZiAoc3lzY3RsX3RjcF9zeW5jb29raWVzKSB7Ci0JCW1zZyA9ICJTZW5kaW5nIGNvb2tpZXMiOwotCQl3YW50X2Nvb2tpZSA9IHRydWU7Ci0JCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfVENQUkVRUUZVTExET0NPT0tJRVMpOwotCX0gZWxzZQotI2VuZGlmCi0JCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfVENQUkVRUUZVTExEUk9QKTsKLQotCWxvcHQgPSBpbmV0X2NzayhzayktPmljc2tfYWNjZXB0X3F1ZXVlLmxpc3Rlbl9vcHQ7Ci0JaWYgKCFsb3B0LT5zeW5mbG9vZF93YXJuZWQgJiYgc3lzY3RsX3RjcF9zeW5jb29raWVzICE9IDIpIHsKLQkJbG9wdC0+c3luZmxvb2Rfd2FybmVkID0gMTsKLQkJcHJfaW5mbygiJXM6IFBvc3NpYmxlIFNZTiBmbG9vZGluZyBvbiBwb3J0ICVkLiAlcy4gIENoZWNrIFNOTVAgY291bnRlcnMuXG4iLAotCQkJcHJvdG8sIG50b2hzKHRjcF9oZHIoc2tiKS0+ZGVzdCksIG1zZyk7Ci0JfQotCXJldHVybiB3YW50X2Nvb2tpZTsKLX0KLUVYUE9SVF9TWU1CT0wodGNwX3N5bl9mbG9vZF9hY3Rpb24pOwogCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKIC8qCkBAIC04OTcsMTAgKzg2OSwxMCBAQAogCQkJCQkgY29uc3QgdW5pb24gdGNwX21kNV9hZGRyICphZGRyLAogCQkJCQkgaW50IGZhbWlseSkKIHsKLQlzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKmtleTsKIAl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaW5fYWRkcik7Ci0Jc3RydWN0IHRjcF9tZDVzaWdfaW5mbyAqbWQ1c2lnOworCWNvbnN0IHN0cnVjdCB0Y3BfbWQ1c2lnX2luZm8gKm1kNXNpZzsKIAogCS8qIGNhbGxlciBlaXRoZXIgaG9sZHMgcmN1X3JlYWRfbG9jaygpIG9yIHNvY2tldCBsb2NrICovCiAJbWQ1c2lnID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHRwLT5tZDVzaWdfaW5mbywKQEAgLTkyMywyNCArODk1LDE1IEBACiBFWFBPUlRfU1lNQk9MKHRjcF9tZDVfZG9fbG9va3VwKTsKIAogc3RydWN0IHRjcF9tZDVzaWdfa2V5ICp0Y3BfdjRfbWQ1X2xvb2t1cChzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCSBzdHJ1Y3Qgc29jayAqYWRkcl9zaykKKwkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrICphZGRyX3NrKQogewotCXVuaW9uIHRjcF9tZDVfYWRkciAqYWRkcjsKKwljb25zdCB1bmlvbiB0Y3BfbWQ1X2FkZHIgKmFkZHI7CiAKLQlhZGRyID0gKHVuaW9uIHRjcF9tZDVfYWRkciAqKSZpbmV0X3NrKGFkZHJfc2spLT5pbmV0X2RhZGRyOworCWFkZHIgPSAoY29uc3QgdW5pb24gdGNwX21kNV9hZGRyICopJmFkZHJfc2stPnNrX2RhZGRyOwogCXJldHVybiB0Y3BfbWQ1X2RvX2xvb2t1cChzaywgYWRkciwgQUZfSU5FVCk7CiB9CiBFWFBPUlRfU1lNQk9MKHRjcF92NF9tZDVfbG9va3VwKTsKIAotc3RhdGljIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqdGNwX3Y0X3JlcXNrX21kNV9sb29rdXAoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJICAgICAgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQotewotCXVuaW9uIHRjcF9tZDVfYWRkciAqYWRkcjsKLQotCWFkZHIgPSAodW5pb24gdGNwX21kNV9hZGRyICopJmluZXRfcnNrKHJlcSktPmlyX3JtdF9hZGRyOwotCXJldHVybiB0Y3BfbWQ1X2RvX2xvb2t1cChzaywgYWRkciwgQUZfSU5FVCk7Ci19Ci0KIC8qIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBhIG5ld2x5IGNyZWF0ZWQgc29ja2V0LCBmcm9tIG90aGVyIGZpbGVzICovCiBpbnQgdGNwX21kNV9kb19hZGQoc3RydWN0IHNvY2sgKnNrLCBjb25zdCB1bmlvbiB0Y3BfbWQ1X2FkZHIgKmFkZHIsCiAJCSAgIGludCBmYW1pbHksIGNvbnN0IHU4ICpuZXdrZXksIHU4IG5ld2tleWxlbiwgZ2ZwX3QgZ2ZwKQpAQCAtMTEwMSw4ICsxMDY0LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotaW50IHRjcF92NF9tZDVfaGFzaF9za2IoY2hhciAqbWQ1X2hhc2gsIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5LAotCQkJY29uc3Qgc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCitpbnQgdGNwX3Y0X21kNV9oYXNoX3NrYihjaGFyICptZDVfaGFzaCwgY29uc3Qgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICprZXksCisJCQljb25zdCBzdHJ1Y3Qgc29jayAqc2ssCiAJCQljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB0Y3BfbWQ1c2lnX3Bvb2wgKmhwOwpAQCAtMTExMCwxMiArMTA3Myw5IEBACiAJY29uc3Qgc3RydWN0IHRjcGhkciAqdGggPSB0Y3BfaGRyKHNrYik7CiAJX19iZTMyIHNhZGRyLCBkYWRkcjsKIAotCWlmIChzaykgewotCQlzYWRkciA9IGluZXRfc2soc2spLT5pbmV0X3NhZGRyOwotCQlkYWRkciA9IGluZXRfc2soc2spLT5pbmV0X2RhZGRyOwotCX0gZWxzZSBpZiAocmVxKSB7Ci0JCXNhZGRyID0gaW5ldF9yc2socmVxKS0+aXJfbG9jX2FkZHI7Ci0JCWRhZGRyID0gaW5ldF9yc2socmVxKS0+aXJfcm10X2FkZHI7CisJaWYgKHNrKSB7IC8qIHZhbGlkIGZvciBlc3RhYmxpc2gvcmVxdWVzdCBzb2NrZXRzICovCisJCXNhZGRyID0gc2stPnNrX3Jjdl9zYWRkcjsKKwkJZGFkZHIgPSBzay0+c2tfZGFkZHI7CiAJfSBlbHNlIHsKIAkJY29uc3Qgc3RydWN0IGlwaGRyICppcGggPSBpcF9oZHIoc2tiKTsKIAkJc2FkZHIgPSBpcGgtPnNhZGRyOwpAQCAtMTE1Miw4ICsxMTEyLDkgQEAKIH0KIEVYUE9SVF9TWU1CT0wodGNwX3Y0X21kNV9oYXNoX3NrYik7CiAKLXN0YXRpYyBib29sIF9fdGNwX3Y0X2luYm91bmRfbWQ1X2hhc2goc3RydWN0IHNvY2sgKnNrLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCisvKiBDYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrKCkgKi8KK3N0YXRpYyBib29sIHRjcF92NF9pbmJvdW5kX21kNV9oYXNoKHN0cnVjdCBzb2NrICpzaywKKwkJCQkgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAkvKgogCSAqIFRoaXMgZ2V0cyBjYWxsZWQgZm9yIGVhY2ggVENQIHNlZ21lbnQgdGhhdCBhcnJpdmVzCkBAIC0xMTkzLDcgKzExNTQsNyBAQAogCSAqLwogCWdlbmhhc2ggPSB0Y3BfdjRfbWQ1X2hhc2hfc2tiKG5ld2hhc2gsCiAJCQkJICAgICAgaGFzaF9leHBlY3RlZCwKLQkJCQkgICAgICBOVUxMLCBOVUxMLCBza2IpOworCQkJCSAgICAgIE5VTEwsIHNrYik7CiAKIAlpZiAoZ2VuaGFzaCB8fCBtZW1jbXAoaGFzaF9sb2NhdGlvbiwgbmV3aGFzaCwgMTYpICE9IDApIHsKIAkJbmV0X2luZm9fcmF0ZWxpbWl0ZWQoIk1ENSBIYXNoIGZhaWxlZCBmb3IgKCVwSTQsICVkKS0+KCVwSTQsICVkKSVzXG4iLApAQCAtMTIwNSwyOCArMTE2NiwxNiBAQAogCX0KIAlyZXR1cm4gZmFsc2U7CiB9Ci0KLXN0YXRpYyBib29sIHRjcF92NF9pbmJvdW5kX21kNV9oYXNoKHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlib29sIHJldDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlyZXQgPSBfX3RjcF92NF9pbmJvdW5kX21kNV9oYXNoKHNrLCBza2IpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHRjcF92NF9pbml0X3JlcShzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsIHN0cnVjdCBzb2NrICpzaywKK3N0YXRpYyB2b2lkIHRjcF92NF9pbml0X3JlcShzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsIHN0cnVjdCBzb2NrICpza19saXN0ZW5lciwKIAkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaXJlcSA9IGluZXRfcnNrKHJlcSk7CiAKLQlpcmVxLT5pcl9sb2NfYWRkciA9IGlwX2hkcihza2IpLT5kYWRkcjsKLQlpcmVxLT5pcl9ybXRfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKLQlpcmVxLT5ub19zcmNjaGVjayA9IGluZXRfc2soc2spLT50cmFuc3BhcmVudDsKKwlza19yY3Zfc2FkZHJfc2V0KHJlcV90b19zayhyZXEpLCBpcF9oZHIoc2tiKS0+ZGFkZHIpOworCXNrX2RhZGRyX3NldChyZXFfdG9fc2socmVxKSwgaXBfaGRyKHNrYiktPnNhZGRyKTsKKwlpcmVxLT5ub19zcmNjaGVjayA9IGluZXRfc2soc2tfbGlzdGVuZXIpLT50cmFuc3BhcmVudDsKIAlpcmVxLT5vcHQgPSB0Y3BfdjRfc2F2ZV9vcHRpb25zKHNrYik7CiB9CiAKQEAgLTEyNTksNyArMTIwOCw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2tfb3BzIHRjcF9yZXF1ZXN0X3NvY2tfaXB2NF9vcHMgPSB7CiAJLm1zc19jbGFtcAk9CVRDUF9NU1NfREVGQVVMVCwKICNpZmRlZiBDT05GSUdfVENQX01ENVNJRwotCS5tZDVfbG9va3VwCT0JdGNwX3Y0X3JlcXNrX21kNV9sb29rdXAsCisJLnJlcV9tZDVfbG9va3VwCT0JdGNwX3Y0X21kNV9sb29rdXAsCiAJLmNhbGNfbWQ1X2hhc2gJPQl0Y3BfdjRfbWQ1X2hhc2hfc2tiLAogI2VuZGlmCiAJLmluaXRfcmVxCT0JdGNwX3Y0X2luaXRfcmVxLApAQCAtMTMxOCw4ICsxMjY3LDggQEAKIAluZXd0cAkJICAgICAgPSB0Y3Bfc2sobmV3c2spOwogCW5ld2luZXQJCSAgICAgID0gaW5ldF9zayhuZXdzayk7CiAJaXJlcQkJICAgICAgPSBpbmV0X3JzayhyZXEpOwotCW5ld2luZXQtPmluZXRfZGFkZHIgICA9IGlyZXEtPmlyX3JtdF9hZGRyOwotCW5ld2luZXQtPmluZXRfcmN2X3NhZGRyID0gaXJlcS0+aXJfbG9jX2FkZHI7CisJc2tfZGFkZHJfc2V0KG5ld3NrLCBpcmVxLT5pcl9ybXRfYWRkcik7CisJc2tfcmN2X3NhZGRyX3NldChuZXdzaywgaXJlcS0+aXJfbG9jX2FkZHIpOwogCW5ld2luZXQtPmluZXRfc2FkZHIJICAgICAgPSBpcmVxLT5pcl9sb2NfYWRkcjsKIAlpbmV0X29wdAkgICAgICA9IGlyZXEtPm9wdDsKIAlyY3VfYXNzaWduX3BvaW50ZXIobmV3aW5ldC0+aW5ldF9vcHQsIGluZXRfb3B0KTsKQEAgLTEzNTYsNyArMTMwNSw3IEBACiAJLyogQ29weSBvdmVyIHRoZSBNRDUga2V5IGZyb20gdGhlIG9yaWdpbmFsIHNvY2tldCAqLwogCWtleSA9IHRjcF9tZDVfZG9fbG9va3VwKHNrLCAodW5pb24gdGNwX21kNV9hZGRyICopJm5ld2luZXQtPmluZXRfZGFkZHIsCiAJCQkJQUZfSU5FVCk7Ci0JaWYgKGtleSAhPSBOVUxMKSB7CisJaWYgKGtleSkgewogCQkvKgogCQkgKiBXZSdyZSB1c2luZyBvbmUsIHNvIGNyZWF0ZSBhIG1hdGNoaW5nIGtleQogCQkgKiBvbiB0aGUgbmV3c2sgc3RydWN0dXJlLiBJZiB3ZSBmYWlsIHRvIGdldApAQCAtMTM5MSwxNSArMTM0MCwxNyBAQAogCiBzdGF0aWMgc3RydWN0IHNvY2sgKnRjcF92NF9obmRfcmVxKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKKwljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOworCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcTsKIAlzdHJ1Y3Qgc29jayAqbnNrOwotCXN0cnVjdCByZXF1ZXN0X3NvY2sgKipwcmV2OwotCS8qIEZpbmQgcG9zc2libGUgY29ubmVjdGlvbiByZXF1ZXN0cy4gKi8KLQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEgPSBpbmV0X2Nza19zZWFyY2hfcmVxKHNrLCAmcHJldiwgdGgtPnNvdXJjZSwKLQkJCQkJCSAgICAgICBpcGgtPnNhZGRyLCBpcGgtPmRhZGRyKTsKLQlpZiAocmVxKQotCQlyZXR1cm4gdGNwX2NoZWNrX3JlcShzaywgc2tiLCByZXEsIHByZXYsIGZhbHNlKTsKKworCXJlcSA9IGluZXRfY3NrX3NlYXJjaF9yZXEoc2ssIHRoLT5zb3VyY2UsIGlwaC0+c2FkZHIsIGlwaC0+ZGFkZHIpOworCWlmIChyZXEpIHsKKwkJbnNrID0gdGNwX2NoZWNrX3JlcShzaywgc2tiLCByZXEsIGZhbHNlKTsKKwkJcmVxc2tfcHV0KHJlcSk7CisJCXJldHVybiBuc2s7CisJfQogCiAJbnNrID0gaW5ldF9sb29rdXBfZXN0YWJsaXNoZWQoc29ja19uZXQoc2spLCAmdGNwX2hhc2hpbmZvLCBpcGgtPnNhZGRyLAogCQkJdGgtPnNvdXJjZSwgaXBoLT5kYWRkciwgdGgtPmRlc3QsIGluZXRfaWlmKHNrYikpOwpAQCAtMTQzOSw3ICsxMzkwLDcgQEAKIAkJc2tfbWFya19uYXBpX2lkKHNrLCBza2IpOwogCQlpZiAoZHN0KSB7CiAJCQlpZiAoaW5ldF9zayhzayktPnJ4X2RzdF9pZmluZGV4ICE9IHNrYi0+c2tiX2lpZiB8fAotCQkJICAgIGRzdC0+b3BzLT5jaGVjayhkc3QsIDApID09IE5VTEwpIHsKKwkJCSAgICAhZHN0LT5vcHMtPmNoZWNrKGRzdCwgMCkpIHsKIAkJCQlkc3RfcmVsZWFzZShkc3QpOwogCQkJCXNrLT5za19yeF9kc3QgPSBOVUxMOwogCQkJfQpAQCAtMTUxNyw4ICsxNDY4LDggQEAKIAlpZiAoc2spIHsKIAkJc2tiLT5zayA9IHNrOwogCQlza2ItPmRlc3RydWN0b3IgPSBzb2NrX2VkZW11eDsKLQkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfVElNRV9XQUlUKSB7Ci0JCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBzay0+c2tfcnhfZHN0OworCQlpZiAoc2tfZnVsbHNvY2soc2spKSB7CisJCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBSRUFEX09OQ0Uoc2stPnNrX3J4X2RzdCk7CiAKIAkJCWlmIChkc3QpCiAJCQkJZHN0ID0gZHN0X2NoZWNrKGRzdCwgMCk7CkBAIC0xNzM0LDcgKzE2ODUsNyBAQAogCQkJCQkJCWlwaC0+ZGFkZHIsIHRoLT5kZXN0LAogCQkJCQkJCWluZXRfaWlmKHNrYikpOwogCQlpZiAoc2syKSB7Ci0JCQlpbmV0X3R3c2tfZGVzY2hlZHVsZShpbmV0X3R3c2soc2spLCAmdGNwX2RlYXRoX3Jvdyk7CisJCQlpbmV0X3R3c2tfZGVzY2hlZHVsZShpbmV0X3R3c2soc2spKTsKIAkJCWluZXRfdHdza19wdXQoaW5ldF90d3NrKHNrKSk7CiAJCQlzayA9IHNrMjsKIAkJCWdvdG8gcHJvY2VzczsKQEAgLTE4NDYsNyArMTc5Nyw3IEBACiAJaWYgKGluZXRfY3NrKHNrKS0+aWNza19iaW5kX2hhc2gpCiAJCWluZXRfcHV0X3BvcnQoc2spOwogCi0JQlVHX09OKHRwLT5mYXN0b3Blbl9yc2sgIT0gTlVMTCk7CisJQlVHX09OKHRwLT5mYXN0b3Blbl9yc2spOwogCiAJLyogSWYgc29ja2V0IGlzIGFib3J0ZWQgZHVyaW5nIGNvbm5lY3Qgb3BlcmF0aW9uICovCiAJdGNwX2ZyZWVfZmFzdG9wZW5fcmVxKHRwKTsKQEAgLTE5MDQsMTMgKzE4NTUsMTMgQEAKIAkJfQogCQlzawkgID0gc2tfbnVsbHNfbmV4dChzdC0+c3luX3dhaXRfc2spOwogCQlzdC0+c3RhdGUgPSBUQ1BfU0VRX1NUQVRFX0xJU1RFTklORzsKLQkJcmVhZF91bmxvY2tfYmgoJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnN5bl93YWl0X2xvY2spOworCQlzcGluX3VubG9ja19iaCgmaWNzay0+aWNza19hY2NlcHRfcXVldWUuc3luX3dhaXRfbG9jayk7CiAJfSBlbHNlIHsKIAkJaWNzayA9IGluZXRfY3NrKHNrKTsKLQkJcmVhZF9sb2NrX2JoKCZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5zeW5fd2FpdF9sb2NrKTsKKwkJc3Bpbl9sb2NrX2JoKCZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5zeW5fd2FpdF9sb2NrKTsKIAkJaWYgKHJlcXNrX3F1ZXVlX2xlbigmaWNzay0+aWNza19hY2NlcHRfcXVldWUpKQogCQkJZ290byBzdGFydF9yZXE7Ci0JCXJlYWRfdW5sb2NrX2JoKCZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5zeW5fd2FpdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnN5bl93YWl0X2xvY2spOwogCQlzayA9IHNrX251bGxzX25leHQoc2spOwogCX0KIGdldF9zazoKQEAgLTE5MjIsNyArMTg3Myw3IEBACiAJCQlnb3RvIG91dDsKIAkJfQogCQlpY3NrID0gaW5ldF9jc2soc2spOwotCQlyZWFkX2xvY2tfYmgoJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnN5bl93YWl0X2xvY2spOworCQlzcGluX2xvY2tfYmgoJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnN5bl93YWl0X2xvY2spOwogCQlpZiAocmVxc2tfcXVldWVfbGVuKCZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZSkpIHsKIHN0YXJ0X3JlcToKIAkJCXN0LT51aWQJCT0gc29ja19pX3VpZChzayk7CkBAIC0xOTMxLDcgKzE4ODIsNyBAQAogCQkJc3QtPnNidWNrZXQJPSAwOwogCQkJZ290byBnZXRfcmVxOwogCQl9Ci0JCXJlYWRfdW5sb2NrX2JoKCZpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5zeW5fd2FpdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnN5bl93YWl0X2xvY2spOwogCX0KIAlzcGluX3VubG9ja19iaCgmaWxiLT5sb2NrKTsKIAlzdC0+b2Zmc2V0ID0gMDsKQEAgLTIxNTAsNyArMjEwMSw3IEBACiAJY2FzZSBUQ1BfU0VRX1NUQVRFX09QRU5SRVE6CiAJCWlmICh2KSB7CiAJCQlzdHJ1Y3QgaW5ldF9jb25uZWN0aW9uX3NvY2sgKmljc2sgPSBpbmV0X2NzayhzdC0+c3luX3dhaXRfc2spOwotCQkJcmVhZF91bmxvY2tfYmgoJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnN5bl93YWl0X2xvY2spOworCQkJc3Bpbl91bmxvY2tfYmgoJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnN5bl93YWl0X2xvY2spOwogCQl9CiAJY2FzZSBUQ1BfU0VRX1NUQVRFX0xJU1RFTklORzoKIAkJaWYgKHYgIT0gU0VRX1NUQVJUX1RPS0VOKQpAQCAtMjIwNCwxNyArMjE1NSwxNyBAQAogfQogRVhQT1JUX1NZTUJPTCh0Y3BfcHJvY191bnJlZ2lzdGVyKTsKIAotc3RhdGljIHZvaWQgZ2V0X29wZW5yZXE0KGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorc3RhdGljIHZvaWQgZ2V0X29wZW5yZXE0KGNvbnN0IHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKIAkJCSBzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIGludCBpLCBrdWlkX3QgdWlkKQogewogCWNvbnN0IHN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaXJlcSA9IGluZXRfcnNrKHJlcSk7Ci0JbG9uZyBkZWx0YSA9IHJlcS0+ZXhwaXJlcyAtIGppZmZpZXM7CisJbG9uZyBkZWx0YSA9IHJlcS0+cnNrX3RpbWVyLmV4cGlyZXMgLSBqaWZmaWVzOwogCiAJc2VxX3ByaW50ZihmLCAiJTRkOiAlMDhYOiUwNFggJTA4WDolMDRYIgogCQkiICUwMlggJTA4WDolMDhYICUwMlg6JTA4bFggJTA4WCAlNXUgJThkICV1ICVkICVwSyIsCiAJCWksCiAJCWlyZXEtPmlyX2xvY19hZGRyLAotCQludG9ocyhpbmV0X3NrKHNrKS0+aW5ldF9zcG9ydCksCisJCWlyZXEtPmlyX251bSwKIAkJaXJlcS0+aXJfcm10X2FkZHIsCiAJCW50b2hzKGlyZXEtPmlyX3JtdF9wb3J0KSwKIAkJVENQX1NZTl9SRUNWLApAQCAtMjIyNSw3ICsyMTc2LDcgQEAKIAkJZnJvbV9rdWlkX211bmdlZChzZXFfdXNlcl9ucyhmKSwgdWlkKSwKIAkJMCwgIC8qIG5vbiBzdGFuZGFyZCB0aW1lciAqLwogCQkwLCAvKiBvcGVuX3JlcXVlc3RzIGhhdmUgbm8gaW5vZGUgKi8KLQkJYXRvbWljX3JlYWQoJnNrLT5za19yZWZjbnQpLAorCQkwLAogCQlyZXEpOwogfQogCkBAIC0yMjkxLDkgKzIyNDIsOSBAQAogc3RhdGljIHZvaWQgZ2V0X3RpbWV3YWl0NF9zb2NrKGNvbnN0IHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3LAogCQkJICAgICAgIHN0cnVjdCBzZXFfZmlsZSAqZiwgaW50IGkpCiB7CisJbG9uZyBkZWx0YSA9IHR3LT50d190aW1lci5leHBpcmVzIC0gamlmZmllczsKIAlfX2JlMzIgZGVzdCwgc3JjOwogCV9fdTE2IGRlc3RwLCBzcmNwOwotCXMzMiBkZWx0YSA9IHR3LT50d190dGQgLSBpbmV0X3R3X3RpbWVfc3RhbXAoKTsKIAogCWRlc3QgID0gdHctPnR3X2RhZGRyOwogCXNyYyAgID0gdHctPnR3X3Jjdl9zYWRkcjsKQEAgLTIzMzIsNyArMjI4Myw3IEBACiAJCQlnZXRfdGNwNF9zb2NrKHYsIHNlcSwgc3QtPm51bSk7CiAJCWJyZWFrOwogCWNhc2UgVENQX1NFUV9TVEFURV9PUEVOUkVROgotCQlnZXRfb3BlbnJlcTQoc3QtPnN5bl93YWl0X3NrLCB2LCBzZXEsIHN0LT5udW0sIHN0LT51aWQpOworCQlnZXRfb3BlbnJlcTQodiwgc2VxLCBzdC0+bnVtLCBzdC0+dWlkKTsKIAkJYnJlYWs7CiAJfQogb3V0OgpAQCAtMjQ2MCw2ICsyNDExLDggQEAKIAl9CiAJbmV0LT5pcHY0LnN5c2N0bF90Y3BfZWNuID0gMjsKIAluZXQtPmlwdjQuc3lzY3RsX3RjcF9iYXNlX21zcyA9IFRDUF9CQVNFX01TUzsKKwluZXQtPmlwdjQuc3lzY3RsX3RjcF9wcm9iZV90aHJlc2hvbGQgPSBUQ1BfUFJPQkVfVEhSRVNIT0xEOworCW5ldC0+aXB2NC5zeXNjdGxfdGNwX3Byb2JlX2ludGVydmFsID0gVENQX1BST0JFX0lOVEVSVkFMOwogCXJldHVybiAwOwogCiBmYWlsOgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX21ldHJpY3MuYyBiL25ldC9pcHY0L3RjcF9tZXRyaWNzLmMKaW5kZXggZTVmNDFiZC4uYTUxZDYzYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX21ldHJpY3MuYworKysgYi9uZXQvaXB2NC90Y3BfbWV0cmljcy5jCkBAIC0yOCw3ICsyOCw4IEBACiAKIHN0cnVjdCB0Y3BfZmFzdG9wZW5fbWV0cmljcyB7CiAJdTE2CW1zczsKLQl1MTYJc3luX2xvc3M6MTA7CQkvKiBSZWN1cnJpbmcgRmFzdCBPcGVuIFNZTiBsb3NzZXMgKi8KKwl1MTYJc3luX2xvc3M6MTAsCQkvKiBSZWN1cnJpbmcgRmFzdCBPcGVuIFNZTiBsb3NzZXMgKi8KKwkJdHJ5X2V4cDoyOwkJLyogUmVxdWVzdCB3LyBleHAuIG9wdGlvbiAob25jZSkgKi8KIAl1bnNpZ25lZCBsb25nCWxhc3Rfc3luX2xvc3M7CS8qIExhc3QgRmFzdCBPcGVuIFNZTiBsb3NzICovCiAJc3RydWN0CXRjcF9mYXN0b3Blbl9jb29raWUJY29va2llOwogfTsKQEAgLTQwLDYgKzQxLDcgQEAKIAogc3RydWN0IHRjcF9tZXRyaWNzX2Jsb2NrIHsKIAlzdHJ1Y3QgdGNwX21ldHJpY3NfYmxvY2sgX19yY3UJKnRjcG1fbmV4dDsKKwlwb3NzaWJsZV9uZXRfdAkJCXRjcG1fbmV0OwogCXN0cnVjdCBpbmV0cGVlcl9hZGRyCQl0Y3BtX3NhZGRyOwogCXN0cnVjdCBpbmV0cGVlcl9hZGRyCQl0Y3BtX2RhZGRyOwogCXVuc2lnbmVkIGxvbmcJCQl0Y3BtX3N0YW1wOwpAQCAtNTIsNiArNTQsMTEgQEAKIAlzdHJ1Y3QgcmN1X2hlYWQJCQlyY3VfaGVhZDsKIH07CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldCAqdG1fbmV0KHN0cnVjdCB0Y3BfbWV0cmljc19ibG9jayAqdG0pCit7CisJcmV0dXJuIHJlYWRfcG5ldCgmdG0tPnRjcG1fbmV0KTsKK30KKwogc3RhdGljIGJvb2wgdGNwX21ldHJpY19sb2NrZWQoc3RydWN0IHRjcF9tZXRyaWNzX2Jsb2NrICp0bSwKIAkJCSAgICAgIGVudW0gdGNwX21ldHJpY19pbmRleCBpZHgpCiB7CkBAIC03NCwyMyArODEsMjAgQEAKIHN0YXRpYyBib29sIGFkZHJfc2FtZShjb25zdCBzdHJ1Y3QgaW5ldHBlZXJfYWRkciAqYSwKIAkJICAgICAgY29uc3Qgc3RydWN0IGluZXRwZWVyX2FkZHIgKmIpCiB7Ci0JY29uc3Qgc3RydWN0IGluNl9hZGRyICphNiwgKmI2OwotCiAJaWYgKGEtPmZhbWlseSAhPSBiLT5mYW1pbHkpCiAJCXJldHVybiBmYWxzZTsKIAlpZiAoYS0+ZmFtaWx5ID09IEFGX0lORVQpCiAJCXJldHVybiBhLT5hZGRyLmE0ID09IGItPmFkZHIuYTQ7Ci0KLQlhNiA9IChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKikgJmEtPmFkZHIuYTZbMF07Ci0JYjYgPSAoY29uc3Qgc3RydWN0IGluNl9hZGRyICopICZiLT5hZGRyLmE2WzBdOwotCi0JcmV0dXJuIGlwdjZfYWRkcl9lcXVhbChhNiwgYjYpOworCXJldHVybiBpcHY2X2FkZHJfZXF1YWwoJmEtPmFkZHIuaW42LCAmYi0+YWRkci5pbjYpOwogfQogCiBzdHJ1Y3QgdGNwbV9oYXNoX2J1Y2tldCB7CiAJc3RydWN0IHRjcF9tZXRyaWNzX2Jsb2NrIF9fcmN1CSpjaGFpbjsKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdGNwbV9oYXNoX2J1Y2tldAkqdGNwX21ldHJpY3NfaGFzaCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHVuc2lnbmVkIGludAkJdGNwX21ldHJpY3NfaGFzaF9sb2cgX19yZWFkX21vc3RseTsKKwogc3RhdGljIERFRklORV9TUElOTE9DSyh0Y3BfbWV0cmljc19sb2NrKTsKIAogc3RhdGljIHZvaWQgdGNwbV9zdWNrX2RzdChzdHJ1Y3QgdGNwX21ldHJpY3NfYmxvY2sgKnRtLApAQCAtMTI4LDYgKzEzMiw4IEBACiAJaWYgKGZhc3RvcGVuX2NsZWFyKSB7CiAJCXRtLT50Y3BtX2Zhc3RvcGVuLm1zcyA9IDA7CiAJCXRtLT50Y3BtX2Zhc3RvcGVuLnN5bl9sb3NzID0gMDsKKwkJdG0tPnRjcG1fZmFzdG9wZW4udHJ5X2V4cCA9IDA7CisJCXRtLT50Y3BtX2Zhc3RvcGVuLmNvb2tpZS5leHAgPSBmYWxzZTsKIAkJdG0tPnRjcG1fZmFzdG9wZW4uY29va2llLmxlbiA9IDA7CiAJfQogfQpAQCAtMTQzLDYgKzE0OSw5IEBACiAjZGVmaW5lIFRDUF9NRVRSSUNTX1JFQ0xBSU1fREVQVEgJNQogI2RlZmluZSBUQ1BfTUVUUklDU19SRUNMQUlNX1BUUgkJKHN0cnVjdCB0Y3BfbWV0cmljc19ibG9jayAqKSAweDFVTAogCisjZGVmaW5lIGRlcmVmX2xvY2tlZChwKQlcCisJcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwLCBsb2NrZGVwX2lzX2hlbGQoJnRjcF9tZXRyaWNzX2xvY2spKQorCiBzdGF0aWMgc3RydWN0IHRjcF9tZXRyaWNzX2Jsb2NrICp0Y3BtX25ldyhzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsCiAJCQkJCSAgc3RydWN0IGluZXRwZWVyX2FkZHIgKnNhZGRyLAogCQkJCQkgIHN0cnVjdCBpbmV0cGVlcl9hZGRyICpkYWRkciwKQEAgLTE3MSw5ICsxODAsOSBAQAogCWlmICh1bmxpa2VseShyZWNsYWltKSkgewogCQlzdHJ1Y3QgdGNwX21ldHJpY3NfYmxvY2sgKm9sZGVzdDsKIAotCQlvbGRlc3QgPSByY3VfZGVyZWZlcmVuY2UobmV0LT5pcHY0LnRjcF9tZXRyaWNzX2hhc2hbaGFzaF0uY2hhaW4pOwotCQlmb3IgKHRtID0gcmN1X2RlcmVmZXJlbmNlKG9sZGVzdC0+dGNwbV9uZXh0KTsgdG07Ci0JCSAgICAgdG0gPSByY3VfZGVyZWZlcmVuY2UodG0tPnRjcG1fbmV4dCkpIHsKKwkJb2xkZXN0ID0gZGVyZWZfbG9ja2VkKHRjcF9tZXRyaWNzX2hhc2hbaGFzaF0uY2hhaW4pOworCQlmb3IgKHRtID0gZGVyZWZfbG9ja2VkKG9sZGVzdC0+dGNwbV9uZXh0KTsgdG07CisJCSAgICAgdG0gPSBkZXJlZl9sb2NrZWQodG0tPnRjcG1fbmV4dCkpIHsKIAkJCWlmICh0aW1lX2JlZm9yZSh0bS0+dGNwbV9zdGFtcCwgb2xkZXN0LT50Y3BtX3N0YW1wKSkKIAkJCQlvbGRlc3QgPSB0bTsKIAkJfQpAQCAtMTgzLDE0ICsxOTIsMTUgQEAKIAkJaWYgKCF0bSkKIAkJCWdvdG8gb3V0X3VubG9jazsKIAl9CisJd3JpdGVfcG5ldCgmdG0tPnRjcG1fbmV0LCBuZXQpOwogCXRtLT50Y3BtX3NhZGRyID0gKnNhZGRyOwogCXRtLT50Y3BtX2RhZGRyID0gKmRhZGRyOwogCiAJdGNwbV9zdWNrX2RzdCh0bSwgZHN0LCB0cnVlKTsKIAogCWlmIChsaWtlbHkoIXJlY2xhaW0pKSB7Ci0JCXRtLT50Y3BtX25leHQgPSBuZXQtPmlwdjQudGNwX21ldHJpY3NfaGFzaFtoYXNoXS5jaGFpbjsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+aXB2NC50Y3BfbWV0cmljc19oYXNoW2hhc2hdLmNoYWluLCB0bSk7CisJCXRtLT50Y3BtX25leHQgPSB0Y3BfbWV0cmljc19oYXNoW2hhc2hdLmNoYWluOworCQlyY3VfYXNzaWduX3BvaW50ZXIodGNwX21ldHJpY3NfaGFzaFtoYXNoXS5jaGFpbiwgdG0pOwogCX0KIAogb3V0X3VubG9jazoKQEAgLTIxNCwxMCArMjI0LDExIEBACiAJc3RydWN0IHRjcF9tZXRyaWNzX2Jsb2NrICp0bTsKIAlpbnQgZGVwdGggPSAwOwogCi0JZm9yICh0bSA9IHJjdV9kZXJlZmVyZW5jZShuZXQtPmlwdjQudGNwX21ldHJpY3NfaGFzaFtoYXNoXS5jaGFpbik7IHRtOworCWZvciAodG0gPSByY3VfZGVyZWZlcmVuY2UodGNwX21ldHJpY3NfaGFzaFtoYXNoXS5jaGFpbik7IHRtOwogCSAgICAgdG0gPSByY3VfZGVyZWZlcmVuY2UodG0tPnRjcG1fbmV4dCkpIHsKIAkJaWYgKGFkZHJfc2FtZSgmdG0tPnRjcG1fc2FkZHIsIHNhZGRyKSAmJgotCQkgICAgYWRkcl9zYW1lKCZ0bS0+dGNwbV9kYWRkciwgZGFkZHIpKQorCQkgICAgYWRkcl9zYW1lKCZ0bS0+dGNwbV9kYWRkciwgZGFkZHIpICYmCisJCSAgICBuZXRfZXEodG1fbmV0KHRtKSwgbmV0KSkKIAkJCWJyZWFrOwogCQlkZXB0aCsrOwogCX0KQEAgLTI0Miw4ICsyNTMsOCBAQAogCQlicmVhazsKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgQUZfSU5FVDY6Ci0JCSooc3RydWN0IGluNl9hZGRyICopc2FkZHIuYWRkci5hNiA9IGluZXRfcnNrKHJlcSktPmlyX3Y2X2xvY19hZGRyOwotCQkqKHN0cnVjdCBpbjZfYWRkciAqKWRhZGRyLmFkZHIuYTYgPSBpbmV0X3JzayhyZXEpLT5pcl92Nl9ybXRfYWRkcjsKKwkJc2FkZHIuYWRkci5pbjYgPSBpbmV0X3JzayhyZXEpLT5pcl92Nl9sb2NfYWRkcjsKKwkJZGFkZHIuYWRkci5pbjYgPSBpbmV0X3JzayhyZXEpLT5pcl92Nl9ybXRfYWRkcjsKIAkJaGFzaCA9IGlwdjZfYWRkcl9oYXNoKCZpbmV0X3JzayhyZXEpLT5pcl92Nl9ybXRfYWRkcik7CiAJCWJyZWFrOwogI2VuZGlmCkBAIC0yNTIsMTIgKzI2MywxNCBAQAogCX0KIAogCW5ldCA9IGRldl9uZXQoZHN0LT5kZXYpOwotCWhhc2ggPSBoYXNoXzMyKGhhc2gsIG5ldC0+aXB2NC50Y3BfbWV0cmljc19oYXNoX2xvZyk7CisJaGFzaCBePSBuZXRfaGFzaF9taXgobmV0KTsKKwloYXNoID0gaGFzaF8zMihoYXNoLCB0Y3BfbWV0cmljc19oYXNoX2xvZyk7CiAKLQlmb3IgKHRtID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+aXB2NC50Y3BfbWV0cmljc19oYXNoW2hhc2hdLmNoYWluKTsgdG07CisJZm9yICh0bSA9IHJjdV9kZXJlZmVyZW5jZSh0Y3BfbWV0cmljc19oYXNoW2hhc2hdLmNoYWluKTsgdG07CiAJICAgICB0bSA9IHJjdV9kZXJlZmVyZW5jZSh0bS0+dGNwbV9uZXh0KSkgewogCQlpZiAoYWRkcl9zYW1lKCZ0bS0+dGNwbV9zYWRkciwgJnNhZGRyKSAmJgotCQkgICAgYWRkcl9zYW1lKCZ0bS0+dGNwbV9kYWRkciwgJmRhZGRyKSkKKwkJICAgIGFkZHJfc2FtZSgmdG0tPnRjcG1fZGFkZHIsICZkYWRkcikgJiYKKwkJICAgIG5ldF9lcSh0bV9uZXQodG0pLCBuZXQpKQogCQkJYnJlYWs7CiAJfQogCXRjcG1fY2hlY2tfc3RhbXAodG0sIGRzdCk7CkBAIC0yODgsOSArMzAxLDkgQEAKIAkJCWhhc2ggPSAoX19mb3JjZSB1bnNpZ25lZCBpbnQpIGRhZGRyLmFkZHIuYTQ7CiAJCX0gZWxzZSB7CiAJCQlzYWRkci5mYW1pbHkgPSBBRl9JTkVUNjsKLQkJCSooc3RydWN0IGluNl9hZGRyICopc2FkZHIuYWRkci5hNiA9IHR3LT50d192Nl9yY3Zfc2FkZHI7CisJCQlzYWRkci5hZGRyLmluNiA9IHR3LT50d192Nl9yY3Zfc2FkZHI7CiAJCQlkYWRkci5mYW1pbHkgPSBBRl9JTkVUNjsKLQkJCSooc3RydWN0IGluNl9hZGRyICopZGFkZHIuYWRkci5hNiA9IHR3LT50d192Nl9kYWRkcjsKKwkJCWRhZGRyLmFkZHIuaW42ID0gdHctPnR3X3Y2X2RhZGRyOwogCQkJaGFzaCA9IGlwdjZfYWRkcl9oYXNoKCZ0dy0+dHdfdjZfZGFkZHIpOwogCQl9CiAJfQpAQCAtMjk5LDEyICszMTIsMTQgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAluZXQgPSB0d3NrX25ldCh0dyk7Ci0JaGFzaCA9IGhhc2hfMzIoaGFzaCwgbmV0LT5pcHY0LnRjcF9tZXRyaWNzX2hhc2hfbG9nKTsKKwloYXNoIF49IG5ldF9oYXNoX21peChuZXQpOworCWhhc2ggPSBoYXNoXzMyKGhhc2gsIHRjcF9tZXRyaWNzX2hhc2hfbG9nKTsKIAotCWZvciAodG0gPSByY3VfZGVyZWZlcmVuY2UobmV0LT5pcHY0LnRjcF9tZXRyaWNzX2hhc2hbaGFzaF0uY2hhaW4pOyB0bTsKKwlmb3IgKHRtID0gcmN1X2RlcmVmZXJlbmNlKHRjcF9tZXRyaWNzX2hhc2hbaGFzaF0uY2hhaW4pOyB0bTsKIAkgICAgIHRtID0gcmN1X2RlcmVmZXJlbmNlKHRtLT50Y3BtX25leHQpKSB7CiAJCWlmIChhZGRyX3NhbWUoJnRtLT50Y3BtX3NhZGRyLCAmc2FkZHIpICYmCi0JCSAgICBhZGRyX3NhbWUoJnRtLT50Y3BtX2RhZGRyLCAmZGFkZHIpKQorCQkgICAgYWRkcl9zYW1lKCZ0bS0+dGNwbV9kYWRkciwgJmRhZGRyKSAmJgorCQkgICAgbmV0X2VxKHRtX25ldCh0bSksIG5ldCkpCiAJCQlicmVhazsKIAl9CiAJcmV0dXJuIHRtOwpAQCAtMzM2LDkgKzM1MSw5IEBACiAJCQloYXNoID0gKF9fZm9yY2UgdW5zaWduZWQgaW50KSBkYWRkci5hZGRyLmE0OwogCQl9IGVsc2UgewogCQkJc2FkZHIuZmFtaWx5ID0gQUZfSU5FVDY7Ci0JCQkqKHN0cnVjdCBpbjZfYWRkciAqKXNhZGRyLmFkZHIuYTYgPSBzay0+c2tfdjZfcmN2X3NhZGRyOworCQkJc2FkZHIuYWRkci5pbjYgPSBzay0+c2tfdjZfcmN2X3NhZGRyOwogCQkJZGFkZHIuZmFtaWx5ID0gQUZfSU5FVDY7Ci0JCQkqKHN0cnVjdCBpbjZfYWRkciAqKWRhZGRyLmFkZHIuYTYgPSBzay0+c2tfdjZfZGFkZHI7CisJCQlkYWRkci5hZGRyLmluNiA9IHNrLT5za192Nl9kYWRkcjsKIAkJCWhhc2ggPSBpcHY2X2FkZHJfaGFzaCgmc2stPnNrX3Y2X2RhZGRyKTsKIAkJfQogCX0KQEAgLTM0Nyw3ICszNjIsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAogCW5ldCA9IGRldl9uZXQoZHN0LT5kZXYpOwotCWhhc2ggPSBoYXNoXzMyKGhhc2gsIG5ldC0+aXB2NC50Y3BfbWV0cmljc19oYXNoX2xvZyk7CisJaGFzaCBePSBuZXRfaGFzaF9taXgobmV0KTsKKwloYXNoID0gaGFzaF8zMihoYXNoLCB0Y3BfbWV0cmljc19oYXNoX2xvZyk7CiAKIAl0bSA9IF9fdGNwX2dldF9tZXRyaWNzKCZzYWRkciwgJmRhZGRyLCBuZXQsIGhhc2gpOwogCWlmICh0bSA9PSBUQ1BfTUVUUklDU19SRUNMQUlNX1BUUikKQEAgLTQ5Miw3ICs1MDgsNyBAQAogCXN0cnVjdCB0Y3BfbWV0cmljc19ibG9jayAqdG07CiAJdTMyIHZhbCwgY3J0dCA9IDA7IC8qIGNhY2hlZCBSVFQgc2NhbGVkIGJ5IDggKi8KIAotCWlmIChkc3QgPT0gTlVMTCkKKwlpZiAoIWRzdCkKIAkJZ290byByZXNldDsKIAogCWRzdF9jb25maXJtKGRzdCk7CkBAIC03MDAsNiArNzE2LDggQEAKIAkJCWlmICh0Zm9tLT5tc3MpCiAJCQkJKm1zcyA9IHRmb20tPm1zczsKIAkJCSpjb29raWUgPSB0Zm9tLT5jb29raWU7CisJCQlpZiAoY29va2llLT5sZW4gPD0gMCAmJiB0Zm9tLT50cnlfZXhwID09IDEpCisJCQkJY29va2llLT5leHAgPSB0cnVlOwogCQkJKnN5bl9sb3NzID0gdGZvbS0+c3luX2xvc3M7CiAJCQkqbGFzdF9zeW5fbG9zcyA9ICpzeW5fbG9zcyA/IHRmb20tPmxhc3Rfc3luX2xvc3MgOiAwOwogCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZmYXN0b3Blbl9zZXFsb2NrLCBzZXEpKTsKQEAgLTcwOCw3ICs3MjYsOCBAQAogfQogCiB2b2lkIHRjcF9mYXN0b3Blbl9jYWNoZV9zZXQoc3RydWN0IHNvY2sgKnNrLCB1MTYgbXNzLAotCQkJICAgIHN0cnVjdCB0Y3BfZmFzdG9wZW5fY29va2llICpjb29raWUsIGJvb2wgc3luX2xvc3QpCisJCQkgICAgc3RydWN0IHRjcF9mYXN0b3Blbl9jb29raWUgKmNvb2tpZSwgYm9vbCBzeW5fbG9zdCwKKwkJCSAgICB1MTYgdHJ5X2V4cCkKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBfX3NrX2RzdF9nZXQoc2spOwogCXN0cnVjdCB0Y3BfbWV0cmljc19ibG9jayAqdG07CkBAIC03MjUsNiArNzQ0LDkgQEAKIAkJCXRmb20tPm1zcyA9IG1zczsKIAkJaWYgKGNvb2tpZSAmJiBjb29raWUtPmxlbiA+IDApCiAJCQl0Zm9tLT5jb29raWUgPSAqY29va2llOworCQllbHNlIGlmICh0cnlfZXhwID4gdGZvbS0+dHJ5X2V4cCAmJgorCQkJIHRmb20tPmNvb2tpZS5sZW4gPD0gMCAmJiAhdGZvbS0+Y29va2llLmV4cCkKKwkJCXRmb20tPnRyeV9leHAgPSB0cnlfZXhwOwogCQlpZiAoc3luX2xvc3QpIHsKIAkJCSsrdGZvbS0+c3luX2xvc3M7CiAJCQl0Zm9tLT5sYXN0X3N5bl9sb3NzID0gamlmZmllczsKQEAgLTc3MywxOSArNzk1LDE5IEBACiAKIAlzd2l0Y2ggKHRtLT50Y3BtX2RhZGRyLmZhbWlseSkgewogCWNhc2UgQUZfSU5FVDoKLQkJaWYgKG5sYV9wdXRfYmUzMihtc2csIFRDUF9NRVRSSUNTX0FUVFJfQUREUl9JUFY0LAotCQkJCXRtLT50Y3BtX2RhZGRyLmFkZHIuYTQpIDwgMCkKKwkJaWYgKG5sYV9wdXRfaW5fYWRkcihtc2csIFRDUF9NRVRSSUNTX0FUVFJfQUREUl9JUFY0LAorCQkJCSAgICB0bS0+dGNwbV9kYWRkci5hZGRyLmE0KSA8IDApCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJaWYgKG5sYV9wdXRfYmUzMihtc2csIFRDUF9NRVRSSUNTX0FUVFJfU0FERFJfSVBWNCwKLQkJCQl0bS0+dGNwbV9zYWRkci5hZGRyLmE0KSA8IDApCisJCWlmIChubGFfcHV0X2luX2FkZHIobXNnLCBUQ1BfTUVUUklDU19BVFRSX1NBRERSX0lQVjQsCisJCQkJICAgIHRtLT50Y3BtX3NhZGRyLmFkZHIuYTQpIDwgMCkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQlicmVhazsKIAljYXNlIEFGX0lORVQ2OgotCQlpZiAobmxhX3B1dChtc2csIFRDUF9NRVRSSUNTX0FUVFJfQUREUl9JUFY2LCAxNiwKLQkJCSAgICB0bS0+dGNwbV9kYWRkci5hZGRyLmE2KSA8IDApCisJCWlmIChubGFfcHV0X2luNl9hZGRyKG1zZywgVENQX01FVFJJQ1NfQVRUUl9BRERSX0lQVjYsCisJCQkJICAgICAmdG0tPnRjcG1fZGFkZHIuYWRkci5pbjYpIDwgMCkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCQlpZiAobmxhX3B1dChtc2csIFRDUF9NRVRSSUNTX0FUVFJfU0FERFJfSVBWNiwgMTYsCi0JCQkgICAgdG0tPnRjcG1fc2FkZHIuYWRkci5hNikgPCAwKQorCQlpZiAobmxhX3B1dF9pbjZfYWRkcihtc2csIFRDUF9NRVRSSUNTX0FUVFJfU0FERFJfSVBWNiwKKwkJCQkgICAgICZ0bS0+dGNwbV9zYWRkci5hZGRyLmluNikgPCAwKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC04OTgsMTcgKzkyMCwxOSBAQAogCQkJICAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKLQl1bnNpZ25lZCBpbnQgbWF4X3Jvd3MgPSAxVSA8PCBuZXQtPmlwdjQudGNwX21ldHJpY3NfaGFzaF9sb2c7CisJdW5zaWduZWQgaW50IG1heF9yb3dzID0gMVUgPDwgdGNwX21ldHJpY3NfaGFzaF9sb2c7CiAJdW5zaWduZWQgaW50IHJvdywgc19yb3cgPSBjYi0+YXJnc1swXTsKIAlpbnQgc19jb2wgPSBjYi0+YXJnc1sxXSwgY29sID0gc19jb2w7CiAKIAlmb3IgKHJvdyA9IHNfcm93OyByb3cgPCBtYXhfcm93czsgcm93KyssIHNfY29sID0gMCkgewogCQlzdHJ1Y3QgdGNwX21ldHJpY3NfYmxvY2sgKnRtOwotCQlzdHJ1Y3QgdGNwbV9oYXNoX2J1Y2tldCAqaGIgPSBuZXQtPmlwdjQudGNwX21ldHJpY3NfaGFzaCArIHJvdzsKKwkJc3RydWN0IHRjcG1faGFzaF9idWNrZXQgKmhiID0gdGNwX21ldHJpY3NfaGFzaCArIHJvdzsKIAogCQlyY3VfcmVhZF9sb2NrKCk7CiAJCWZvciAoY29sID0gMCwgdG0gPSByY3VfZGVyZWZlcmVuY2UoaGItPmNoYWluKTsgdG07CiAJCSAgICAgdG0gPSByY3VfZGVyZWZlcmVuY2UodG0tPnRjcG1fbmV4dCksIGNvbCsrKSB7CisJCQlpZiAoIW5ldF9lcSh0bV9uZXQodG0pLCBuZXQpKQorCQkJCWNvbnRpbnVlOwogCQkJaWYgKGNvbCA8IHNfY29sKQogCQkJCWNvbnRpbnVlOwogCQkJaWYgKHRjcF9tZXRyaWNzX2R1bXBfaW5mbyhza2IsIGNiLCB0bSkgPCAwKSB7CkBAIC05MzMsNyArOTU3LDcgQEAKIAlhID0gaW5mby0+YXR0cnNbdjRdOwogCWlmIChhKSB7CiAJCWFkZHItPmZhbWlseSA9IEFGX0lORVQ7Ci0JCWFkZHItPmFkZHIuYTQgPSBubGFfZ2V0X2JlMzIoYSk7CisJCWFkZHItPmFkZHIuYTQgPSBubGFfZ2V0X2luX2FkZHIoYSk7CiAJCWlmIChoYXNoKQogCQkJKmhhc2ggPSAoX19mb3JjZSB1bnNpZ25lZCBpbnQpIGFkZHItPmFkZHIuYTQ7CiAJCXJldHVybiAwOwpAQCAtOTQzLDkgKzk2Nyw5IEBACiAJCWlmIChubGFfbGVuKGEpICE9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWFkZHItPmZhbWlseSA9IEFGX0lORVQ2OwotCQltZW1jcHkoYWRkci0+YWRkci5hNiwgbmxhX2RhdGEoYSksIHNpemVvZihhZGRyLT5hZGRyLmE2KSk7CisJCWFkZHItPmFkZHIuaW42ID0gbmxhX2dldF9pbjZfYWRkcihhKTsKIAkJaWYgKGhhc2gpCi0JCQkqaGFzaCA9IGlwdjZfYWRkcl9oYXNoKChzdHJ1Y3QgaW42X2FkZHIgKikgYWRkci0+YWRkci5hNik7CisJCQkqaGFzaCA9IGlwdjZfYWRkcl9oYXNoKCZhZGRyLT5hZGRyLmluNik7CiAJCXJldHVybiAwOwogCX0KIAlyZXR1cm4gb3B0aW9uYWwgPyAxIDogLUVBRk5PU1VQUE9SVDsKQEAgLTk5NCwxMyArMTAxOCwxNSBAQAogCWlmICghcmVwbHkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JaGFzaCA9IGhhc2hfMzIoaGFzaCwgbmV0LT5pcHY0LnRjcF9tZXRyaWNzX2hhc2hfbG9nKTsKKwloYXNoIF49IG5ldF9oYXNoX21peChuZXQpOworCWhhc2ggPSBoYXNoXzMyKGhhc2gsIHRjcF9tZXRyaWNzX2hhc2hfbG9nKTsKIAlyZXQgPSAtRVNSQ0g7CiAJcmN1X3JlYWRfbG9jaygpOwotCWZvciAodG0gPSByY3VfZGVyZWZlcmVuY2UobmV0LT5pcHY0LnRjcF9tZXRyaWNzX2hhc2hbaGFzaF0uY2hhaW4pOyB0bTsKKwlmb3IgKHRtID0gcmN1X2RlcmVmZXJlbmNlKHRjcF9tZXRyaWNzX2hhc2hbaGFzaF0uY2hhaW4pOyB0bTsKIAkgICAgIHRtID0gcmN1X2RlcmVmZXJlbmNlKHRtLT50Y3BtX25leHQpKSB7CiAJCWlmIChhZGRyX3NhbWUoJnRtLT50Y3BtX2RhZGRyLCAmZGFkZHIpICYmCi0JCSAgICAoIXNyYyB8fCBhZGRyX3NhbWUoJnRtLT50Y3BtX3NhZGRyLCAmc2FkZHIpKSkgeworCQkgICAgKCFzcmMgfHwgYWRkcl9zYW1lKCZ0bS0+dGNwbV9zYWRkciwgJnNhZGRyKSkgJiYKKwkJICAgIG5ldF9lcSh0bV9uZXQodG0pLCBuZXQpKSB7CiAJCQlyZXQgPSB0Y3BfbWV0cmljc19maWxsX2luZm8obXNnLCB0bSk7CiAJCQlicmVhazsKIAkJfQpAQCAtMTAyMCwzNCArMTA0NiwyNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLSNkZWZpbmUgZGVyZWZfbG9ja2VkX2dlbmwocCkJXAotCXJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocCwgbG9ja2RlcF9nZW5sX2lzX2hlbGQoKSAmJiBcCi0JCQkJICAgICBsb2NrZGVwX2lzX2hlbGQoJnRjcF9tZXRyaWNzX2xvY2spKQotCi0jZGVmaW5lIGRlcmVmX2dlbmwocCkJcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwLCBsb2NrZGVwX2dlbmxfaXNfaGVsZCgpKQotCi1zdGF0aWMgaW50IHRjcF9tZXRyaWNzX2ZsdXNoX2FsbChzdHJ1Y3QgbmV0ICpuZXQpCitzdGF0aWMgdm9pZCB0Y3BfbWV0cmljc19mbHVzaF9hbGwoc3RydWN0IG5ldCAqbmV0KQogewotCXVuc2lnbmVkIGludCBtYXhfcm93cyA9IDFVIDw8IG5ldC0+aXB2NC50Y3BfbWV0cmljc19oYXNoX2xvZzsKLQlzdHJ1Y3QgdGNwbV9oYXNoX2J1Y2tldCAqaGIgPSBuZXQtPmlwdjQudGNwX21ldHJpY3NfaGFzaDsKKwl1bnNpZ25lZCBpbnQgbWF4X3Jvd3MgPSAxVSA8PCB0Y3BfbWV0cmljc19oYXNoX2xvZzsKKwlzdHJ1Y3QgdGNwbV9oYXNoX2J1Y2tldCAqaGIgPSB0Y3BfbWV0cmljc19oYXNoOwogCXN0cnVjdCB0Y3BfbWV0cmljc19ibG9jayAqdG07CiAJdW5zaWduZWQgaW50IHJvdzsKIAogCWZvciAocm93ID0gMDsgcm93IDwgbWF4X3Jvd3M7IHJvdysrLCBoYisrKSB7CisJCXN0cnVjdCB0Y3BfbWV0cmljc19ibG9jayBfX3JjdSAqKnBwOwogCQlzcGluX2xvY2tfYmgoJnRjcF9tZXRyaWNzX2xvY2spOwotCQl0bSA9IGRlcmVmX2xvY2tlZF9nZW5sKGhiLT5jaGFpbik7Ci0JCWlmICh0bSkKLQkJCWhiLT5jaGFpbiA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrX2JoKCZ0Y3BfbWV0cmljc19sb2NrKTsKLQkJd2hpbGUgKHRtKSB7Ci0JCQlzdHJ1Y3QgdGNwX21ldHJpY3NfYmxvY2sgKm5leHQ7Ci0KLQkJCW5leHQgPSBkZXJlZl9nZW5sKHRtLT50Y3BtX25leHQpOwotCQkJa2ZyZWVfcmN1KHRtLCByY3VfaGVhZCk7Ci0JCQl0bSA9IG5leHQ7CisJCXBwID0gJmhiLT5jaGFpbjsKKwkJZm9yICh0bSA9IGRlcmVmX2xvY2tlZCgqcHApOyB0bTsgdG0gPSBkZXJlZl9sb2NrZWQoKnBwKSkgeworCQkJaWYgKG5ldF9lcSh0bV9uZXQodG0pLCBuZXQpKSB7CisJCQkJKnBwID0gdG0tPnRjcG1fbmV4dDsKKwkJCQlrZnJlZV9yY3UodG0sIHJjdV9oZWFkKTsKKwkJCX0gZWxzZSB7CisJCQkJcHAgPSAmdG0tPnRjcG1fbmV4dDsKKwkJCX0KIAkJfQorCQlzcGluX3VubG9ja19iaCgmdGNwX21ldHJpY3NfbG9jayk7CiAJfQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHRjcF9tZXRyaWNzX25sX2NtZF9kZWwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKQEAgLTEwNjQsMTkgKzEwODMsMjMgQEAKIAlyZXQgPSBwYXJzZV9ubF9hZGRyKGluZm8sICZkYWRkciwgJmhhc2gsIDEpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwotCWlmIChyZXQgPiAwKQotCQlyZXR1cm4gdGNwX21ldHJpY3NfZmx1c2hfYWxsKG5ldCk7CisJaWYgKHJldCA+IDApIHsKKwkJdGNwX21ldHJpY3NfZmx1c2hfYWxsKG5ldCk7CisJCXJldHVybiAwOworCX0KIAlyZXQgPSBwYXJzZV9ubF9zYWRkcihpbmZvLCAmc2FkZHIpOwogCWlmIChyZXQgPCAwKQogCQlzcmMgPSBmYWxzZTsKIAotCWhhc2ggPSBoYXNoXzMyKGhhc2gsIG5ldC0+aXB2NC50Y3BfbWV0cmljc19oYXNoX2xvZyk7Ci0JaGIgPSBuZXQtPmlwdjQudGNwX21ldHJpY3NfaGFzaCArIGhhc2g7CisJaGFzaCBePSBuZXRfaGFzaF9taXgobmV0KTsKKwloYXNoID0gaGFzaF8zMihoYXNoLCB0Y3BfbWV0cmljc19oYXNoX2xvZyk7CisJaGIgPSB0Y3BfbWV0cmljc19oYXNoICsgaGFzaDsKIAlwcCA9ICZoYi0+Y2hhaW47CiAJc3Bpbl9sb2NrX2JoKCZ0Y3BfbWV0cmljc19sb2NrKTsKLQlmb3IgKHRtID0gZGVyZWZfbG9ja2VkX2dlbmwoKnBwKTsgdG07IHRtID0gZGVyZWZfbG9ja2VkX2dlbmwoKnBwKSkgeworCWZvciAodG0gPSBkZXJlZl9sb2NrZWQoKnBwKTsgdG07IHRtID0gZGVyZWZfbG9ja2VkKCpwcCkpIHsKIAkJaWYgKGFkZHJfc2FtZSgmdG0tPnRjcG1fZGFkZHIsICZkYWRkcikgJiYKLQkJICAgICghc3JjIHx8IGFkZHJfc2FtZSgmdG0tPnRjcG1fc2FkZHIsICZzYWRkcikpKSB7CisJCSAgICAoIXNyYyB8fCBhZGRyX3NhbWUoJnRtLT50Y3BtX3NhZGRyLCAmc2FkZHIpKSAmJgorCQkgICAgbmV0X2VxKHRtX25ldCh0bSksIG5ldCkpIHsKIAkJCSpwcCA9IHRtLT50Y3BtX25leHQ7CiAJCQlrZnJlZV9yY3UodG0sIHJjdV9oZWFkKTsKIAkJCWZvdW5kID0gdHJ1ZTsKQEAgLTExMjYsNiArMTE0OSw5IEBACiAJc2l6ZV90IHNpemU7CiAJdW5zaWduZWQgaW50IHNsb3RzOwogCisJaWYgKCFuZXRfZXEobmV0LCAmaW5pdF9uZXQpKQorCQlyZXR1cm4gMDsKKwogCXNsb3RzID0gdGNwbWhhc2hfZW50cmllczsKIAlpZiAoIXNsb3RzKSB7CiAJCWlmICh0b3RhbHJhbV9wYWdlcyA+PSAxMjggKiAxMDI0KQpAQCAtMTEzNCwxNCArMTE2MCwxNCBAQAogCQkJc2xvdHMgPSA4ICogMTAyNDsKIAl9CiAKLQluZXQtPmlwdjQudGNwX21ldHJpY3NfaGFzaF9sb2cgPSBvcmRlcl9iYXNlXzIoc2xvdHMpOwotCXNpemUgPSBzaXplb2Yoc3RydWN0IHRjcG1faGFzaF9idWNrZXQpIDw8IG5ldC0+aXB2NC50Y3BfbWV0cmljc19oYXNoX2xvZzsKKwl0Y3BfbWV0cmljc19oYXNoX2xvZyA9IG9yZGVyX2Jhc2VfMihzbG90cyk7CisJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGNwbV9oYXNoX2J1Y2tldCkgPDwgdGNwX21ldHJpY3NfaGFzaF9sb2c7CiAKLQluZXQtPmlwdjQudGNwX21ldHJpY3NfaGFzaCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7Ci0JaWYgKCFuZXQtPmlwdjQudGNwX21ldHJpY3NfaGFzaCkKLQkJbmV0LT5pcHY0LnRjcF9tZXRyaWNzX2hhc2ggPSB2emFsbG9jKHNpemUpOworCXRjcF9tZXRyaWNzX2hhc2ggPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pOworCWlmICghdGNwX21ldHJpY3NfaGFzaCkKKwkJdGNwX21ldHJpY3NfaGFzaCA9IHZ6YWxsb2Moc2l6ZSk7CiAKLQlpZiAoIW5ldC0+aXB2NC50Y3BfbWV0cmljc19oYXNoKQorCWlmICghdGNwX21ldHJpY3NfaGFzaCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlyZXR1cm4gMDsKQEAgLTExNDksMTkgKzExNzUsNyBAQAogCiBzdGF0aWMgdm9pZCBfX25ldF9leGl0IHRjcF9uZXRfbWV0cmljc19leGl0KHN0cnVjdCBuZXQgKm5ldCkKIHsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAoMVUgPDwgbmV0LT5pcHY0LnRjcF9tZXRyaWNzX2hhc2hfbG9nKSA7IGkrKykgewotCQlzdHJ1Y3QgdGNwX21ldHJpY3NfYmxvY2sgKnRtLCAqbmV4dDsKLQotCQl0bSA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobmV0LT5pcHY0LnRjcF9tZXRyaWNzX2hhc2hbaV0uY2hhaW4sIDEpOwotCQl3aGlsZSAodG0pIHsKLQkJCW5leHQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHRtLT50Y3BtX25leHQsIDEpOwotCQkJa2ZyZWUodG0pOwotCQkJdG0gPSBuZXh0OwotCQl9Ci0JfQotCWt2ZnJlZShuZXQtPmlwdjQudGNwX21ldHJpY3NfaGFzaCk7CisJdGNwX21ldHJpY3NfZmx1c2hfYWxsKG5ldCk7CiB9CiAKIHN0YXRpYyBfX25ldF9pbml0ZGF0YSBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgdGNwX25ldF9tZXRyaWNzX29wcyA9IHsKQEAgLTExNzUsMTYgKzExODksMTAgQEAKIAogCXJldCA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJnRjcF9uZXRfbWV0cmljc19vcHMpOwogCWlmIChyZXQgPCAwKQotCQlnb3RvIGNsZWFudXA7CisJCXBhbmljKCJDb3VsZCBub3QgYWxsb2NhdGUgdGhlIHRjcF9tZXRyaWNzIGhhc2ggdGFibGVcbiIpOworCiAJcmV0ID0gZ2VubF9yZWdpc3Rlcl9mYW1pbHlfd2l0aF9vcHMoJnRjcF9tZXRyaWNzX25sX2ZhbWlseSwKIAkJCQkJICAgIHRjcF9tZXRyaWNzX25sX29wcyk7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gY2xlYW51cF9zdWJzeXM7Ci0JcmV0dXJuOwotCi1jbGVhbnVwX3N1YnN5czoKLQl1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJnRjcF9uZXRfbWV0cmljc19vcHMpOwotCi1jbGVhbnVwOgotCXJldHVybjsKKwkJcGFuaWMoIkNvdWxkIG5vdCByZWdpc3RlciB0Y3BfbWV0cmljcyBnZW5lcmljIG5ldGxpbmtcbiIpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jIGIvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCmluZGV4IGRkMTFhYzcuLjYzZDYzMTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYworKysgYi9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKQEAgLTM0LDE4ICszNCw3IEBACiAKIHN0cnVjdCBpbmV0X3RpbWV3YWl0X2RlYXRoX3JvdyB0Y3BfZGVhdGhfcm93ID0gewogCS5zeXNjdGxfbWF4X3R3X2J1Y2tldHMgPSBOUl9GSUxFICogMiwKLQkucGVyaW9kCQk9IFRDUF9USU1FV0FJVF9MRU4gLyBJTkVUX1RXRFJfVFdLSUxMX1NMT1RTLAotCS5kZWF0aF9sb2NrCT0gX19TUElOX0xPQ0tfVU5MT0NLRUQodGNwX2RlYXRoX3Jvdy5kZWF0aF9sb2NrKSwKIAkuaGFzaGluZm8JPSAmdGNwX2hhc2hpbmZvLAotCS50d190aW1lcgk9IFRJTUVSX0lOSVRJQUxJWkVSKGluZXRfdHdkcl9oYW5nbWFuLCAwLAotCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpJnRjcF9kZWF0aF9yb3cpLAotCS50d2tpbGxfd29yawk9IF9fV09SS19JTklUSUFMSVpFUih0Y3BfZGVhdGhfcm93LnR3a2lsbF93b3JrLAotCQkJCQkgICAgIGluZXRfdHdkcl90d2tpbGxfd29yayksCi0vKiBTaG9ydC10aW1lIHRpbWV3YWl0IGNhbGVuZGFyICovCi0KLQkudHdjYWxfaGFuZAk9IC0xLAotCS50d2NhbF90aW1lcgk9IFRJTUVSX0lOSVRJQUxJWkVSKGluZXRfdHdkcl90d2NhbF90aWNrLCAwLAotCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpJnRjcF9kZWF0aF9yb3cpLAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKHRjcF9kZWF0aF9yb3cpOwogCkBAIC0xNTgsNyArMTQ3LDcgQEAKIAkJaWYgKCF0aC0+ZmluIHx8CiAJCSAgICBUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXEgIT0gdGNwdHctPnR3X3Jjdl9ueHQgKyAxKSB7CiBraWxsX3dpdGhfcnN0OgotCQkJaW5ldF90d3NrX2Rlc2NoZWR1bGUodHcsICZ0Y3BfZGVhdGhfcm93KTsKKwkJCWluZXRfdHdza19kZXNjaGVkdWxlKHR3KTsKIAkJCWluZXRfdHdza19wdXQodHcpOwogCQkJcmV0dXJuIFRDUF9UV19SU1Q7CiAJCX0KQEAgLTE3NCwxMSArMTYzLDkgQEAKIAkJaWYgKHRjcF9kZWF0aF9yb3cuc3lzY3RsX3R3X3JlY3ljbGUgJiYKIAkJICAgIHRjcHR3LT50d190c19yZWNlbnRfc3RhbXAgJiYKIAkJICAgIHRjcF90d19yZW1lbWJlcl9zdGFtcCh0dykpCi0JCQlpbmV0X3R3c2tfc2NoZWR1bGUodHcsICZ0Y3BfZGVhdGhfcm93LCB0dy0+dHdfdGltZW91dCwKLQkJCQkJICAgVENQX1RJTUVXQUlUX0xFTik7CisJCQlpbmV0X3R3c2tfc2NoZWR1bGUodHcsIHR3LT50d190aW1lb3V0KTsKIAkJZWxzZQotCQkJaW5ldF90d3NrX3NjaGVkdWxlKHR3LCAmdGNwX2RlYXRoX3JvdywgVENQX1RJTUVXQUlUX0xFTiwKLQkJCQkJICAgVENQX1RJTUVXQUlUX0xFTik7CisJCQlpbmV0X3R3c2tfc2NoZWR1bGUodHcsIFRDUF9USU1FV0FJVF9MRU4pOwogCQlyZXR1cm4gVENQX1RXX0FDSzsKIAl9CiAKQEAgLTIxMSwxMyArMTk4LDEyIEBACiAJCQkgKi8KIAkJCWlmIChzeXNjdGxfdGNwX3JmYzEzMzcgPT0gMCkgewoga2lsbDoKLQkJCQlpbmV0X3R3c2tfZGVzY2hlZHVsZSh0dywgJnRjcF9kZWF0aF9yb3cpOworCQkJCWluZXRfdHdza19kZXNjaGVkdWxlKHR3KTsKIAkJCQlpbmV0X3R3c2tfcHV0KHR3KTsKIAkJCQlyZXR1cm4gVENQX1RXX1NVQ0NFU1M7CiAJCQl9CiAJCX0KLQkJaW5ldF90d3NrX3NjaGVkdWxlKHR3LCAmdGNwX2RlYXRoX3JvdywgVENQX1RJTUVXQUlUX0xFTiwKLQkJCQkgICBUQ1BfVElNRVdBSVRfTEVOKTsKKwkJaW5ldF90d3NrX3NjaGVkdWxlKHR3LCBUQ1BfVElNRVdBSVRfTEVOKTsKIAogCQlpZiAodG1wX29wdC5zYXdfdHN0YW1wKSB7CiAJCQl0Y3B0dy0+dHdfdHNfcmVjZW50CSAgPSB0bXBfb3B0LnJjdl90c3ZhbDsKQEAgLTI2Nyw4ICsyNTMsNyBAQAogCQkgKiBEbyBub3QgcmVzY2hlZHVsZSBpbiB0aGUgbGFzdCBjYXNlLgogCQkgKi8KIAkJaWYgKHBhd3NfcmVqZWN0IHx8IHRoLT5hY2spCi0JCQlpbmV0X3R3c2tfc2NoZWR1bGUodHcsICZ0Y3BfZGVhdGhfcm93LCBUQ1BfVElNRVdBSVRfTEVOLAotCQkJCQkgICBUQ1BfVElNRVdBSVRfTEVOKTsKKwkJCWluZXRfdHdza19zY2hlZHVsZSh0dywgVENQX1RJTUVXQUlUX0xFTik7CiAKIAkJcmV0dXJuIHRjcF90aW1ld2FpdF9jaGVja19vb3dfcmF0ZV9saW1pdCgKIAkJCXR3LCBza2IsIExJTlVYX01JQl9UQ1BBQ0tTS0lQUEVEVElNRVdBSVQpOwpAQCAtMjgzLDE4ICsyNjgsMTcgQEAKICAqLwogdm9pZCB0Y3BfdGltZV93YWl0KHN0cnVjdCBzb2NrICpzaywgaW50IHN0YXRlLCBpbnQgdGltZW8pCiB7Ci0Jc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcgPSBOVUxMOwogCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKKwlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dzsKIAlib29sIHJlY3ljbGVfb2sgPSBmYWxzZTsKIAogCWlmICh0Y3BfZGVhdGhfcm93LnN5c2N0bF90d19yZWN5Y2xlICYmIHRwLT5yeF9vcHQudHNfcmVjZW50X3N0YW1wKQogCQlyZWN5Y2xlX29rID0gdGNwX3JlbWVtYmVyX3N0YW1wKHNrKTsKIAotCWlmICh0Y3BfZGVhdGhfcm93LnR3X2NvdW50IDwgdGNwX2RlYXRoX3Jvdy5zeXNjdGxfbWF4X3R3X2J1Y2tldHMpCi0JCXR3ID0gaW5ldF90d3NrX2FsbG9jKHNrLCBzdGF0ZSk7CisJdHcgPSBpbmV0X3R3c2tfYWxsb2Moc2ssICZ0Y3BfZGVhdGhfcm93LCBzdGF0ZSk7CiAKLQlpZiAodHcgIT0gTlVMTCkgeworCWlmICh0dykgewogCQlzdHJ1Y3QgdGNwX3RpbWV3YWl0X3NvY2sgKnRjcHR3ID0gdGNwX3R3c2soKHN0cnVjdCBzb2NrICopdHcpOwogCQljb25zdCBpbnQgcnRvID0gKGljc2stPmljc2tfcnRvIDw8IDIpIC0gKGljc2stPmljc2tfcnRvID4+IDEpOwogCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CkBAIC0zMzIsNyArMzE2LDcgQEAKIAkJCXN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5OwogCQkJdGNwdHctPnR3X21kNV9rZXkgPSBOVUxMOwogCQkJa2V5ID0gdHAtPmFmX3NwZWNpZmljLT5tZDVfbG9va3VwKHNrLCBzayk7Ci0JCQlpZiAoa2V5ICE9IE5VTEwpIHsKKwkJCWlmIChrZXkpIHsKIAkJCQl0Y3B0dy0+dHdfbWQ1X2tleSA9IGttZW1kdXAoa2V5LCBzaXplb2YoKmtleSksIEdGUF9BVE9NSUMpOwogCQkJCWlmICh0Y3B0dy0+dHdfbWQ1X2tleSAmJiAhdGNwX2FsbG9jX21kNXNpZ19wb29sKCkpCiAJCQkJCUJVRygpOwpAQCAtMzU1LDggKzMzOSw3IEBACiAJCQkJdGltZW8gPSBUQ1BfVElNRVdBSVRfTEVOOwogCQl9CiAKLQkJaW5ldF90d3NrX3NjaGVkdWxlKHR3LCAmdGNwX2RlYXRoX3JvdywgdGltZW8sCi0JCQkJICAgVENQX1RJTUVXQUlUX0xFTik7CisJCWluZXRfdHdza19zY2hlZHVsZSh0dywgdGltZW8pOwogCQlpbmV0X3R3c2tfcHV0KHR3KTsKIAl9IGVsc2UgewogCQkvKiBTb3JyeSwgaWYgd2UncmUgb3V0IG9mIG1lbW9yeSwganVzdCBDTE9TRSB0aGlzCkBAIC00NTQsNyArNDM3LDcgQEAKIHsKIAlzdHJ1Y3Qgc29jayAqbmV3c2sgPSBpbmV0X2Nza19jbG9uZV9sb2NrKHNrLCByZXEsIEdGUF9BVE9NSUMpOwogCi0JaWYgKG5ld3NrICE9IE5VTEwpIHsKKwlpZiAobmV3c2spIHsKIAkJY29uc3Qgc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppcmVxID0gaW5ldF9yc2socmVxKTsKIAkJc3RydWN0IHRjcF9yZXF1ZXN0X3NvY2sgKnRyZXEgPSB0Y3BfcnNrKHJlcSk7CiAJCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqbmV3aWNzayA9IGluZXRfY3NrKG5ld3NrKTsKQEAgLTU3Miw3ICs1NTUsNiBAQAogCiBzdHJ1Y3Qgc29jayAqdGNwX2NoZWNrX3JlcShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkgICBzdHJ1Y3QgcmVxdWVzdF9zb2NrICoqcHJldiwKIAkJCSAgIGJvb2wgZmFzdG9wZW4pCiB7CiAJc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkIHRtcF9vcHQ7CkBAIC02MjksOSArNjExLDE2IEBACiAJCQkJCSAgTElOVVhfTUlCX1RDUEFDS1NLSVBQRURTWU5SRUNWLAogCQkJCQkgICZ0Y3BfcnNrKHJlcSktPmxhc3Rfb293X2Fja190aW1lKSAmJgogCi0JCSAgICAhaW5ldF9ydHhfc3luX2FjayhzaywgcmVxKSkKLQkJCXJlcS0+ZXhwaXJlcyA9IG1pbihUQ1BfVElNRU9VVF9JTklUIDw8IHJlcS0+bnVtX3RpbWVvdXQsCi0JCQkJCSAgIFRDUF9SVE9fTUFYKSArIGppZmZpZXM7CisJCSAgICAhaW5ldF9ydHhfc3luX2FjayhzaywgcmVxKSkgeworCQkJdW5zaWduZWQgbG9uZyBleHBpcmVzID0gamlmZmllczsKKworCQkJZXhwaXJlcyArPSBtaW4oVENQX1RJTUVPVVRfSU5JVCA8PCByZXEtPm51bV90aW1lb3V0LAorCQkJCSAgICAgICBUQ1BfUlRPX01BWCk7CisJCQlpZiAoIWZhc3RvcGVuKQorCQkJCW1vZF90aW1lcl9wZW5kaW5nKCZyZXEtPnJza190aW1lciwgZXhwaXJlcyk7CisJCQllbHNlCisJCQkJcmVxLT5yc2tfdGltZXIuZXhwaXJlcyA9IGV4cGlyZXM7CisJCX0KIAkJcmV0dXJuIE5VTEw7CiAJfQogCkBAIC03NjMsMTAgKzc1MiwxMCBAQAogCSAqIHNvY2tldCBpcyBjcmVhdGVkLCB3YWl0IGZvciB0cm91Ymxlcy4KIAkgKi8KIAljaGlsZCA9IGluZXRfY3NrKHNrKS0+aWNza19hZl9vcHMtPnN5bl9yZWN2X3NvY2soc2ssIHNrYiwgcmVxLCBOVUxMKTsKLQlpZiAoY2hpbGQgPT0gTlVMTCkKKwlpZiAoIWNoaWxkKQogCQlnb3RvIGxpc3Rlbl9vdmVyZmxvdzsKIAotCWluZXRfY3NrX3JlcXNrX3F1ZXVlX3VubGluayhzaywgcmVxLCBwcmV2KTsKKwlpbmV0X2Nza19yZXFza19xdWV1ZV91bmxpbmsoc2ssIHJlcSk7CiAJaW5ldF9jc2tfcmVxc2tfcXVldWVfcmVtb3ZlZChzaywgcmVxKTsKIAogCWluZXRfY3NrX3JlcXNrX3F1ZXVlX2FkZChzaywgcmVxLCBjaGlsZCk7CkBAIC03OTEsNyArNzgwLDcgQEAKIAkJdGNwX3Jlc2V0KHNrKTsKIAl9CiAJaWYgKCFmYXN0b3BlbikgewotCQlpbmV0X2Nza19yZXFza19xdWV1ZV9kcm9wKHNrLCByZXEsIHByZXYpOworCQlpbmV0X2Nza19yZXFza19xdWV1ZV9kcm9wKHNrLCByZXEpOwogCQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX0VNQlJZT05JQ1JTVFMpOwogCX0KIAlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9vZmZsb2FkLmMgYi9uZXQvaXB2NC90Y3Bfb2ZmbG9hZC5jCmluZGV4IDlkNzkzMGIuLjNmN2MyZmMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9vZmZsb2FkLmMKKysrIGIvbmV0L2lwdjQvdGNwX29mZmxvYWQuYwpAQCAtMjksOCArMjksOCBAQAogCX0KIH0KIAotc3RydWN0IHNrX2J1ZmYgKnRjcDRfZ3NvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnRjcDRfZ3NvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKSkKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMgYi9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKaW5kZXggYTJhNzk2Yy4uOGM4ZDdlMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX291dHB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwpAQCAtNTE4LDE3ICs1MTgsMjYgQEAKIAogCWlmICh1bmxpa2VseShPUFRJT05fRkFTVF9PUEVOX0NPT0tJRSAmIG9wdGlvbnMpKSB7CiAJCXN0cnVjdCB0Y3BfZmFzdG9wZW5fY29va2llICpmb2MgPSBvcHRzLT5mYXN0b3Blbl9jb29raWU7CisJCXU4ICpwID0gKHU4ICopcHRyOworCQl1MzIgbGVuOyAvKiBGYXN0IE9wZW4gb3B0aW9uIGxlbmd0aCAqLwogCi0JCSpwdHIrKyA9IGh0b25sKChUQ1BPUFRfRVhQIDw8IDI0KSB8Ci0JCQkgICAgICAgKChUQ1BPTEVOX0VYUF9GQVNUT1BFTl9CQVNFICsgZm9jLT5sZW4pIDw8IDE2KSB8Ci0JCQkgICAgICAgVENQT1BUX0ZBU1RPUEVOX01BR0lDKTsKLQotCQltZW1jcHkocHRyLCBmb2MtPnZhbCwgZm9jLT5sZW4pOwotCQlpZiAoKGZvYy0+bGVuICYgMykgPT0gMikgewotCQkJdTggKmFsaWduID0gKCh1OCAqKXB0cikgKyBmb2MtPmxlbjsKLQkJCWFsaWduWzBdID0gYWxpZ25bMV0gPSBUQ1BPUFRfTk9QOworCQlpZiAoZm9jLT5leHApIHsKKwkJCWxlbiA9IFRDUE9MRU5fRVhQX0ZBU1RPUEVOX0JBU0UgKyBmb2MtPmxlbjsKKwkJCSpwdHIgPSBodG9ubCgoVENQT1BUX0VYUCA8PCAyNCkgfCAobGVuIDw8IDE2KSB8CisJCQkJICAgICBUQ1BPUFRfRkFTVE9QRU5fTUFHSUMpOworCQkJcCArPSBUQ1BPTEVOX0VYUF9GQVNUT1BFTl9CQVNFOworCQl9IGVsc2UgeworCQkJbGVuID0gVENQT0xFTl9GQVNUT1BFTl9CQVNFICsgZm9jLT5sZW47CisJCQkqcCsrID0gVENQT1BUX0ZBU1RPUEVOOworCQkJKnArKyA9IGxlbjsKIAkJfQotCQlwdHIgKz0gKGZvYy0+bGVuICsgMykgPj4gMjsKKworCQltZW1jcHkocCwgZm9jLT52YWwsIGZvYy0+bGVuKTsKKwkJaWYgKChsZW4gJiAzKSA9PSAyKSB7CisJCQlwW2ZvYy0+bGVuXSA9IFRDUE9QVF9OT1A7CisJCQlwW2ZvYy0+bGVuICsgMV0gPSBUQ1BPUFRfTk9QOworCQl9CisJCXB0ciArPSAobGVuICsgMykgPj4gMjsKIAl9CiB9CiAKQEAgLTU2NSw3ICs1NzQsNyBAQAogCW9wdHMtPm1zcyA9IHRjcF9hZHZlcnRpc2VfbXNzKHNrKTsKIAlyZW1haW5pbmcgLT0gVENQT0xFTl9NU1NfQUxJR05FRDsKIAotCWlmIChsaWtlbHkoc3lzY3RsX3RjcF90aW1lc3RhbXBzICYmICptZDUgPT0gTlVMTCkpIHsKKwlpZiAobGlrZWx5KHN5c2N0bF90Y3BfdGltZXN0YW1wcyAmJiAhKm1kNSkpIHsKIAkJb3B0cy0+b3B0aW9ucyB8PSBPUFRJT05fVFM7CiAJCW9wdHMtPnRzdmFsID0gdGNwX3NrYl90aW1lc3RhbXAoc2tiKSArIHRwLT50c29mZnNldDsKIAkJb3B0cy0+dHNlY3IgPSB0cC0+cnhfb3B0LnRzX3JlY2VudDsKQEAgLTU4MywxMyArNTkyLDE3IEBACiAJfQogCiAJaWYgKGZhc3RvcGVuICYmIGZhc3RvcGVuLT5jb29raWUubGVuID49IDApIHsKLQkJdTMyIG5lZWQgPSBUQ1BPTEVOX0VYUF9GQVNUT1BFTl9CQVNFICsgZmFzdG9wZW4tPmNvb2tpZS5sZW47CisJCXUzMiBuZWVkID0gZmFzdG9wZW4tPmNvb2tpZS5sZW47CisKKwkJbmVlZCArPSBmYXN0b3Blbi0+Y29va2llLmV4cCA/IFRDUE9MRU5fRVhQX0ZBU1RPUEVOX0JBU0UgOgorCQkJCQkgICAgICAgVENQT0xFTl9GQVNUT1BFTl9CQVNFOwogCQluZWVkID0gKG5lZWQgKyAzKSAmIH4zVTsgIC8qIEFsaWduIHRvIDMyIGJpdHMgKi8KIAkJaWYgKHJlbWFpbmluZyA+PSBuZWVkKSB7CiAJCQlvcHRzLT5vcHRpb25zIHw9IE9QVElPTl9GQVNUX09QRU5fQ09PS0lFOwogCQkJb3B0cy0+ZmFzdG9wZW5fY29va2llID0gJmZhc3RvcGVuLT5jb29raWU7CiAJCQlyZW1haW5pbmcgLT0gbmVlZDsKIAkJCXRwLT5zeW5fZmFzdG9wZW4gPSAxOworCQkJdHAtPnN5bl9mYXN0b3Blbl9leHAgPSBmYXN0b3Blbi0+Y29va2llLmV4cCA/IDEgOiAwOwogCQl9CiAJfQogCkBAIC02MDEsMTUgKzYxNCwxNCBAQAogCQkJCSAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwKIAkJCQkgICB1bnNpZ25lZCBpbnQgbXNzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgIHN0cnVjdCB0Y3Bfb3V0X29wdGlvbnMgKm9wdHMsCi0JCQkJICAgc3RydWN0IHRjcF9tZDVzaWdfa2V5ICoqbWQ1LAorCQkJCSAgIGNvbnN0IHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqbWQ1LAogCQkJCSAgIHN0cnVjdCB0Y3BfZmFzdG9wZW5fY29va2llICpmb2MpCiB7CiAJc3RydWN0IGluZXRfcmVxdWVzdF9zb2NrICppcmVxID0gaW5ldF9yc2socmVxKTsKIAl1bnNpZ25lZCBpbnQgcmVtYWluaW5nID0gTUFYX1RDUF9PUFRJT05fU1BBQ0U7CiAKICNpZmRlZiBDT05GSUdfVENQX01ENVNJRwotCSptZDUgPSB0Y3BfcnNrKHJlcSktPmFmX3NwZWNpZmljLT5tZDVfbG9va3VwKHNrLCByZXEpOwotCWlmICgqbWQ1KSB7CisJaWYgKG1kNSkgewogCQlvcHRzLT5vcHRpb25zIHw9IE9QVElPTl9NRDU7CiAJCXJlbWFpbmluZyAtPSBUQ1BPTEVOX01ENVNJR19BTElHTkVEOwogCkBAIC02MjAsOCArNjMyLDYgQEAKIAkJICovCiAJCWlyZXEtPnRzdGFtcF9vayAmPSAhaXJlcS0+c2Fja19vazsKIAl9Ci0jZWxzZQotCSptZDUgPSBOVUxMOwogI2VuZGlmCiAKIAkvKiBXZSBhbHdheXMgc2VuZCBhbiBNU1Mgb3B0aW9uLiAqLwpAQCAtNjQ1LDcgKzY1NSwxMCBAQAogCQkJcmVtYWluaW5nIC09IFRDUE9MRU5fU0FDS1BFUk1fQUxJR05FRDsKIAl9CiAJaWYgKGZvYyAhPSBOVUxMICYmIGZvYy0+bGVuID49IDApIHsKLQkJdTMyIG5lZWQgPSBUQ1BPTEVOX0VYUF9GQVNUT1BFTl9CQVNFICsgZm9jLT5sZW47CisJCXUzMiBuZWVkID0gZm9jLT5sZW47CisKKwkJbmVlZCArPSBmb2MtPmV4cCA/IFRDUE9MRU5fRVhQX0ZBU1RPUEVOX0JBU0UgOgorCQkJCSAgIFRDUE9MRU5fRkFTVE9QRU5fQkFTRTsKIAkJbmVlZCA9IChuZWVkICsgMykgJiB+M1U7ICAvKiBBbGlnbiB0byAzMiBiaXRzICovCiAJCWlmIChyZW1haW5pbmcgPj0gbmVlZCkgewogCQkJb3B0cy0+b3B0aW9ucyB8PSBPUFRJT05fRkFTVF9PUEVOX0NPT0tJRTsKQEAgLTk4OSw3ICsxMDAyLDcgQEAKIAlpZiAobWQ1KSB7CiAJCXNrX25vY2Fwc19hZGQoc2ssIE5FVElGX0ZfR1NPX01BU0spOwogCQl0cC0+YWZfc3BlY2lmaWMtPmNhbGNfbWQ1X2hhc2gob3B0cy5oYXNoX2xvY2F0aW9uLAotCQkJCQkgICAgICAgbWQ1LCBzaywgTlVMTCwgc2tiKTsKKwkJCQkJICAgICAgIG1kNSwgc2ssIHNrYik7CiAJfQogI2VuZGlmCiAKQEAgLTExNTEsNyArMTE2NCw3IEBACiAKIAkvKiBHZXQgYSBuZXcgc2tiLi4uIGZvcmNlIGZsYWcgb24uICovCiAJYnVmZiA9IHNrX3N0cmVhbV9hbGxvY19za2Ioc2ssIG5zaXplLCBnZnApOwotCWlmIChidWZmID09IE5VTEwpCisJaWYgKCFidWZmKQogCQlyZXR1cm4gLUVOT01FTTsgLyogV2UnbGwganVzdCB0cnkgYWdhaW4gbGF0ZXIuICovCiAKIAlzay0+c2tfd21lbV9xdWV1ZWQgKz0gYnVmZi0+dHJ1ZXNpemU7CkBAIC0xMzU0LDYgKzEzNjcsOCBAQAogCQkJICAgICAgIGljc2stPmljc2tfYWZfb3BzLT5uZXRfaGVhZGVyX2xlbjsKIAlpY3NrLT5pY3NrX210dXAuc2VhcmNoX2xvdyA9IHRjcF9tc3NfdG9fbXR1KHNrLCBuZXQtPmlwdjQuc3lzY3RsX3RjcF9iYXNlX21zcyk7CiAJaWNzay0+aWNza19tdHVwLnByb2JlX3NpemUgPSAwOworCWlmIChpY3NrLT5pY3NrX210dXAuZW5hYmxlZCkKKwkJaWNzay0+aWNza19tdHVwLnByb2JlX3RpbWVzdGFtcCA9IHRjcF90aW1lX3N0YW1wOwogfQogRVhQT1JUX1NZTUJPTCh0Y3BfbXR1cF9pbml0KTsKIApAQCAtMTcwOCw3ICsxNzIzLDcgQEAKIAkJcmV0dXJuIHRjcF9mcmFnbWVudChzaywgc2tiLCBsZW4sIG1zc19ub3csIGdmcCk7CiAKIAlidWZmID0gc2tfc3RyZWFtX2FsbG9jX3NrYihzaywgMCwgZ2ZwKTsKLQlpZiAodW5saWtlbHkoYnVmZiA9PSBOVUxMKSkKKwlpZiAodW5saWtlbHkoIWJ1ZmYpKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNrLT5za193bWVtX3F1ZXVlZCArPSBidWZmLT50cnVlc2l6ZTsKQEAgLTE3NTIsMjAgKzE3NjcsMjMgQEAKIHN0YXRpYyBib29sIHRjcF90c29fc2hvdWxkX2RlZmVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgYm9vbCAqaXNfY3duZF9saW1pdGVkLCB1MzIgbWF4X3NlZ3MpCiB7Ci0Jc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwotCXUzMiBzZW5kX3dpbiwgY29uZ193aW4sIGxpbWl0LCBpbl9mbGlnaHQ7CisJdTMyIGFnZSwgc2VuZF93aW4sIGNvbmdfd2luLCBsaW1pdCwgaW5fZmxpZ2h0OworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBza2JfbXN0YW1wIG5vdzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqaGVhZDsKIAlpbnQgd2luX2Rpdmlzb3I7CiAKIAlpZiAoVENQX1NLQl9DQihza2IpLT50Y3BfZmxhZ3MgJiBUQ1BIRFJfRklOKQogCQlnb3RvIHNlbmRfbm93OwogCi0JaWYgKGljc2stPmljc2tfY2Ffc3RhdGUgIT0gVENQX0NBX09wZW4pCisJaWYgKCEoKDEgPDwgaWNzay0+aWNza19jYV9zdGF0ZSkgJiAoVENQRl9DQV9PcGVuIHwgVENQRl9DQV9DV1IpKSkKIAkJZ290byBzZW5kX25vdzsKIAotCS8qIERlZmVyIGZvciBsZXNzIHRoYW4gdHdvIGNsb2NrIHRpY2tzLiAqLwotCWlmICh0cC0+dHNvX2RlZmVycmVkICYmCi0JICAgICgoKHUzMilqaWZmaWVzIDw8IDEpID4+IDEpIC0gKHRwLT50c29fZGVmZXJyZWQgPj4gMSkgPiAxKQorCS8qIEF2b2lkIGJ1cnN0eSBiZWhhdmlvciBieSBhbGxvd2luZyBkZWZlcgorCSAqIG9ubHkgaWYgdGhlIGxhc3Qgd3JpdGUgd2FzIHJlY2VudC4KKwkgKi8KKwlpZiAoKHMzMikodGNwX3RpbWVfc3RhbXAgLSB0cC0+bHNuZHRpbWUpID4gMCkKIAkJZ290byBzZW5kX25vdzsKIAogCWluX2ZsaWdodCA9IHRjcF9wYWNrZXRzX2luX2ZsaWdodCh0cCk7CkBAIC0xODA3LDExICsxODI1LDE0IEBACiAJCQlnb3RvIHNlbmRfbm93OwogCX0KIAotCS8qIE9rLCBpdCBsb29rcyBsaWtlIGl0IGlzIGFkdmlzYWJsZSB0byBkZWZlci4KLQkgKiBEbyBub3QgcmVhcm0gdGhlIHRpbWVyIGlmIGFscmVhZHkgc2V0IHRvIG5vdCBicmVhayBUQ1AgQUNLIGNsb2NraW5nLgotCSAqLwotCWlmICghdHAtPnRzb19kZWZlcnJlZCkKLQkJdHAtPnRzb19kZWZlcnJlZCA9IDEgfCAoamlmZmllcyA8PCAxKTsKKwloZWFkID0gdGNwX3dyaXRlX3F1ZXVlX2hlYWQoc2spOworCXNrYl9tc3RhbXBfZ2V0KCZub3cpOworCWFnZSA9IHNrYl9tc3RhbXBfdXNfZGVsdGEoJm5vdywgJmhlYWQtPnNrYl9tc3RhbXApOworCS8qIElmIG5leHQgQUNLIGlzIGxpa2VseSB0byBjb21lIHRvbyBsYXRlIChoYWxmIHNydHQpLCBkbyBub3QgZGVmZXIgKi8KKwlpZiAoYWdlIDwgKHRwLT5zcnR0X3VzID4+IDQpKQorCQlnb3RvIHNlbmRfbm93OworCisJLyogT2ssIGl0IGxvb2tzIGxpa2UgaXQgaXMgYWR2aXNhYmxlIHRvIGRlZmVyLiAqLwogCiAJaWYgKGNvbmdfd2luIDwgc2VuZF93aW4gJiYgY29uZ193aW4gPCBza2ItPmxlbikKIAkJKmlzX2N3bmRfbGltaXRlZCA9IHRydWU7CkBAIC0xODE5LDEwICsxODQwLDM0IEBACiAJcmV0dXJuIHRydWU7CiAKIHNlbmRfbm93OgotCXRwLT50c29fZGVmZXJyZWQgPSAwOwogCXJldHVybiBmYWxzZTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHRjcF9tdHVfY2hlY2tfcmVwcm9iZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOworCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOworCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKKwl1MzIgaW50ZXJ2YWw7CisJczMyIGRlbHRhOworCisJaW50ZXJ2YWwgPSBuZXQtPmlwdjQuc3lzY3RsX3RjcF9wcm9iZV9pbnRlcnZhbDsKKwlkZWx0YSA9IHRjcF90aW1lX3N0YW1wIC0gaWNzay0+aWNza19tdHVwLnByb2JlX3RpbWVzdGFtcDsKKwlpZiAodW5saWtlbHkoZGVsdGEgPj0gaW50ZXJ2YWwgKiBIWikpIHsKKwkJaW50IG1zcyA9IHRjcF9jdXJyZW50X21zcyhzayk7CisKKwkJLyogVXBkYXRlIGN1cnJlbnQgc2VhcmNoIHJhbmdlICovCisJCWljc2stPmljc2tfbXR1cC5wcm9iZV9zaXplID0gMDsKKwkJaWNzay0+aWNza19tdHVwLnNlYXJjaF9oaWdoID0gdHAtPnJ4X29wdC5tc3NfY2xhbXAgKworCQkJc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpICsKKwkJCWljc2stPmljc2tfYWZfb3BzLT5uZXRfaGVhZGVyX2xlbjsKKwkJaWNzay0+aWNza19tdHVwLnNlYXJjaF9sb3cgPSB0Y3BfbXNzX3RvX210dShzaywgbXNzKTsKKworCQkvKiBVcGRhdGUgcHJvYmUgdGltZSBzdGFtcCAqLworCQlpY3NrLT5pY3NrX210dXAucHJvYmVfdGltZXN0YW1wID0gdGNwX3RpbWVfc3RhbXA7CisJfQorfQorCiAvKiBDcmVhdGUgYSBuZXcgTVRVIHByb2JlIGlmIHdlIGFyZSByZWFkeS4KICAqIE1UVSBwcm9iZSBpcyByZWd1bGFybHkgYXR0ZW1wdGluZyB0byBpbmNyZWFzZSB0aGUgcGF0aCBNVFUgYnkKICAqIGRlbGliZXJhdGVseSBzZW5kaW5nIGxhcmdlciBwYWNrZXRzLiAgVGhpcyBkaXNjb3ZlcnMgcm91dGluZwpAQCAtMTgzNywxMSArMTg4MiwxMyBAQAogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwogCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqbnNrYiwgKm5leHQ7CisJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCWludCBsZW47CiAJaW50IHByb2JlX3NpemU7CiAJaW50IHNpemVfbmVlZGVkOwogCWludCBjb3B5OwogCWludCBtc3Nfbm93OworCWludCBpbnRlcnZhbDsKIAogCS8qIE5vdCBjdXJyZW50bHkgcHJvYmluZy92ZXJpZnlpbmcsCiAJICogbm90IGluIHJlY292ZXJ5LApAQCAtMTg1NCwxMiArMTkwMSwyNSBAQAogCSAgICB0cC0+cnhfb3B0Lm51bV9zYWNrcyB8fCB0cC0+cnhfb3B0LmRzYWNrKQogCQlyZXR1cm4gLTE7CiAKLQkvKiBWZXJ5IHNpbXBsZSBzZWFyY2ggc3RyYXRlZ3k6IGp1c3QgZG91YmxlIHRoZSBNU1MuICovCisJLyogVXNlIGJpbmFyeSBzZWFyY2ggZm9yIHByb2JlX3NpemUgYmV0d2VlbiB0Y3BfbXNzX2Jhc2UsCisJICogYW5kIGN1cnJlbnQgbXNzX2NsYW1wLiBpZiAoc2VhcmNoX2hpZ2ggLSBzZWFyY2hfbG93KQorCSAqIHNtYWxsZXIgdGhhbiBhIHRocmVzaG9sZCwgYmFja29mZiBmcm9tIHByb2JpbmcuCisJICovCiAJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzayk7Ci0JcHJvYmVfc2l6ZSA9IDIgKiB0cC0+bXNzX2NhY2hlOworCXByb2JlX3NpemUgPSB0Y3BfbXR1X3RvX21zcyhzaywgKGljc2stPmljc2tfbXR1cC5zZWFyY2hfaGlnaCArCisJCQkJICAgIGljc2stPmljc2tfbXR1cC5zZWFyY2hfbG93KSA+PiAxKTsKIAlzaXplX25lZWRlZCA9IHByb2JlX3NpemUgKyAodHAtPnJlb3JkZXJpbmcgKyAxKSAqIHRwLT5tc3NfY2FjaGU7Ci0JaWYgKHByb2JlX3NpemUgPiB0Y3BfbXR1X3RvX21zcyhzaywgaWNzay0+aWNza19tdHVwLnNlYXJjaF9oaWdoKSkgewotCQkvKiBUT0RPOiBzZXQgdGltZXIgZm9yIHByb2JlX2NvbnZlcmdlX2V2ZW50ICovCisJaW50ZXJ2YWwgPSBpY3NrLT5pY3NrX210dXAuc2VhcmNoX2hpZ2ggLSBpY3NrLT5pY3NrX210dXAuc2VhcmNoX2xvdzsKKwkvKiBXaGVuIG1pc2ZvcnR1bmUgaGFwcGVucywgd2UgYXJlIHJlcHJvYmluZyBhY3RpdmVseSwKKwkgKiBhbmQgdGhlbiByZXByb2JlIHRpbWVyIGhhcyBleHBpcmVkLiBXZSBzdGljayB3aXRoIGN1cnJlbnQKKwkgKiBwcm9iaW5nIHByb2Nlc3MgYnkgbm90IHJlc2V0dGluZyBzZWFyY2ggcmFuZ2UgdG8gaXRzIG9yaWduYWwuCisJICovCisJaWYgKHByb2JlX3NpemUgPiB0Y3BfbXR1X3RvX21zcyhzaywgaWNzay0+aWNza19tdHVwLnNlYXJjaF9oaWdoKSB8fAorCQlpbnRlcnZhbCA8IG5ldC0+aXB2NC5zeXNjdGxfdGNwX3Byb2JlX3RocmVzaG9sZCkgeworCQkvKiBDaGVjayB3aGV0aGVyIGVub3VnaCB0aW1lIGhhcyBlbGFwbGFzZWQgZm9yCisJCSAqIGFub3RoZXIgcm91bmQgb2YgcHJvYmluZy4KKwkJICovCisJCXRjcF9tdHVfY2hlY2tfcmVwcm9iZShzayk7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTE4ODEsNyArMTk0MSw4IEBACiAJfQogCiAJLyogV2UncmUgYWxsb3dlZCB0byBwcm9iZS4gIEJ1aWxkIGl0IG5vdy4gKi8KLQlpZiAoKG5za2IgPSBza19zdHJlYW1fYWxsb2Nfc2tiKHNrLCBwcm9iZV9zaXplLCBHRlBfQVRPTUlDKSkgPT0gTlVMTCkKKwluc2tiID0gc2tfc3RyZWFtX2FsbG9jX3NrYihzaywgcHJvYmVfc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKCFuc2tiKQogCQlyZXR1cm4gLTE7CiAJc2stPnNrX3dtZW1fcXVldWVkICs9IG5za2ItPnRydWVzaXplOwogCXNrX21lbV9jaGFyZ2Uoc2ssIG5za2ItPnRydWVzaXplKTsKQEAgLTIxNzksNyArMjI0MCw3IEBACiAJaW50IG1zcyA9IHRjcF9jdXJyZW50X21zcyhzayk7CiAJaW50IGVyciA9IC0xOwogCi0JaWYgKHRjcF9zZW5kX2hlYWQoc2spICE9IE5VTEwpIHsKKwlpZiAodGNwX3NlbmRfaGVhZChzaykpIHsKIAkJZXJyID0gdGNwX3dyaXRlX3htaXQoc2ssIG1zcywgVENQX05BR0xFX09GRiwgMiwgR0ZQX0FUT01JQyk7CiAJCWdvdG8gcmVhcm1fdGltZXI7CiAJfQpAQCAtMjY4OSw3ICsyNzUwLDcgQEAKIAkJaWYgKHNrYiA9PSB0Y3Bfc2VuZF9oZWFkKHNrKSkKIAkJCWJyZWFrOwogCQkvKiB3ZSBjb3VsZCBkbyBiZXR0ZXIgdGhhbiB0byBhc3NpZ24gZWFjaCB0aW1lICovCi0JCWlmIChob2xlID09IE5VTEwpCisJCWlmICghaG9sZSkKIAkJCXRwLT5yZXRyYW5zbWl0X3NrYl9oaW50ID0gc2tiOwogCiAJCS8qIEFzc3VtZSB0aGlzIHJldHJhbnNtaXQgd2lsbCBnZW5lcmF0ZQpAQCAtMjcxMyw3ICsyNzc0LDcgQEAKIAkJCWlmICghdGNwX2Nhbl9mb3J3YXJkX3JldHJhbnNtaXQoc2spKQogCQkJCWJyZWFrOwogCQkJLyogQmFja3RyYWNrIGlmIG5lY2Vzc2FyeSB0byBub24tTCdlZCBza2IgKi8KLQkJCWlmIChob2xlICE9IE5VTEwpIHsKKwkJCWlmIChob2xlKSB7CiAJCQkJc2tiID0gaG9sZTsKIAkJCQlob2xlID0gTlVMTDsKIAkJCX0KQEAgLTI3MjEsNyArMjc4Miw3IEBACiAJCQlnb3RvIGJlZ2luX2Z3ZDsKIAogCQl9IGVsc2UgaWYgKCEoc2Fja2VkICYgVENQQ0JfTE9TVCkpIHsKLQkJCWlmIChob2xlID09IE5VTEwgJiYgIShzYWNrZWQgJiAoVENQQ0JfU0FDS0VEX1JFVFJBTlN8VENQQ0JfU0FDS0VEX0FDS0VEKSkpCisJCQlpZiAoIWhvbGUgJiYgIShzYWNrZWQgJiAoVENQQ0JfU0FDS0VEX1JFVFJBTlN8VENQQ0JfU0FDS0VEX0FDS0VEKSkpCiAJCQkJaG9sZSA9IHNrYjsKIAkJCWNvbnRpbnVlOwogCkBAIC0yNzY2LDIyICsyODI3LDE4IEBACiAJICovCiAJbXNzX25vdyA9IHRjcF9jdXJyZW50X21zcyhzayk7CiAKLQlpZiAodGNwX3NlbmRfaGVhZChzaykgIT0gTlVMTCkgeworCWlmICh0Y3Bfc2VuZF9oZWFkKHNrKSkgewogCQlUQ1BfU0tCX0NCKHNrYiktPnRjcF9mbGFncyB8PSBUQ1BIRFJfRklOOwogCQlUQ1BfU0tCX0NCKHNrYiktPmVuZF9zZXErKzsKIAkJdHAtPndyaXRlX3NlcSsrOwogCX0gZWxzZSB7CiAJCS8qIFNvY2tldCBpcyBsb2NrZWQsIGtlZXAgdHJ5aW5nIHVudGlsIG1lbW9yeSBpcyBhdmFpbGFibGUuICovCiAJCWZvciAoOzspIHsKLQkJCXNrYiA9IGFsbG9jX3NrYl9mY2xvbmUoTUFYX1RDUF9IRUFERVIsCi0JCQkJCSAgICAgICBzay0+c2tfYWxsb2NhdGlvbik7CisJCQlza2IgPSBza19zdHJlYW1fYWxsb2Nfc2tiKHNrLCAwLCBzay0+c2tfYWxsb2NhdGlvbik7CiAJCQlpZiAoc2tiKQogCQkJCWJyZWFrOwogCQkJeWllbGQoKTsKIAkJfQotCi0JCS8qIFJlc2VydmUgc3BhY2UgZm9yIGhlYWRlcnMgYW5kIHByZXBhcmUgY29udHJvbCBiaXRzLiAqLwotCQlza2JfcmVzZXJ2ZShza2IsIE1BWF9UQ1BfSEVBREVSKTsKIAkJLyogRklOIGVhdHMgYSBzZXF1ZW5jZSBieXRlLCB3cml0ZV9zZXEgYWR2YW5jZWQgYnkgdGNwX3F1ZXVlX3NrYigpLiAqLwogCQl0Y3BfaW5pdF9ub25kYXRhX3NrYihza2IsIHRwLT53cml0ZV9zZXEsCiAJCQkJICAgICBUQ1BIRFJfQUNLIHwgVENQSERSX0ZJTik7CkBAIC0yODI4LDE0ICsyODg1LDE0IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCXNrYiA9IHRjcF93cml0ZV9xdWV1ZV9oZWFkKHNrKTsKLQlpZiAoc2tiID09IE5VTEwgfHwgIShUQ1BfU0tCX0NCKHNrYiktPnRjcF9mbGFncyAmIFRDUEhEUl9TWU4pKSB7CisJaWYgKCFza2IgfHwgIShUQ1BfU0tCX0NCKHNrYiktPnRjcF9mbGFncyAmIFRDUEhEUl9TWU4pKSB7CiAJCXByX2RlYnVnKCIlczogd3JvbmcgcXVldWUgc3RhdGVcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQogCWlmICghKFRDUF9TS0JfQ0Ioc2tiKS0+dGNwX2ZsYWdzICYgVENQSERSX0FDSykpIHsKIAkJaWYgKHNrYl9jbG9uZWQoc2tiKSkgewogCQkJc3RydWN0IHNrX2J1ZmYgKm5za2IgPSBza2JfY29weShza2IsIEdGUF9BVE9NSUMpOwotCQkJaWYgKG5za2IgPT0gTlVMTCkKKwkJCWlmICghbnNrYikKIAkJCQlyZXR1cm4gLUVOT01FTTsKIAkJCXRjcF91bmxpbmtfd3JpdGVfcXVldWUoc2tiLCBzayk7CiAJCQlfX3NrYl9oZWFkZXJfcmVsZWFzZShuc2tiKTsKQEAgLTI4NzAsNyArMjkyNyw3IEBACiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHRjcGhkciAqdGg7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKm1kNTsKKwlzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKm1kNSA9IE5VTEw7CiAJaW50IHRjcF9oZWFkZXJfc2l6ZTsKIAlpbnQgbXNzOwogCkBAIC0yODgzLDcgKzI5NDAsNiBAQAogCXNrYl9yZXNlcnZlKHNrYiwgTUFYX1RDUF9IRUFERVIpOwogCiAJc2tiX2RzdF9zZXQoc2tiLCBkc3QpOwotCXNlY3VyaXR5X3NrYl9vd25lZF9ieShza2IsIHNrKTsKIAogCW1zcyA9IGRzdF9tZXRyaWNfYWR2bXNzKGRzdCk7CiAJaWYgKHRwLT5yeF9vcHQudXNlcl9tc3MgJiYgdHAtPnJ4X29wdC51c2VyX21zcyA8IG1zcykKQEAgLTI4OTYsNyArMjk1MiwxMiBAQAogCWVsc2UKICNlbmRpZgogCXNrYl9tc3RhbXBfZ2V0KCZza2ItPnNrYl9tc3RhbXApOwotCXRjcF9oZWFkZXJfc2l6ZSA9IHRjcF9zeW5hY2tfb3B0aW9ucyhzaywgcmVxLCBtc3MsIHNrYiwgJm9wdHMsICZtZDUsCisKKyNpZmRlZiBDT05GSUdfVENQX01ENVNJRworCXJjdV9yZWFkX2xvY2soKTsKKwltZDUgPSB0Y3BfcnNrKHJlcSktPmFmX3NwZWNpZmljLT5yZXFfbWQ1X2xvb2t1cChzaywgcmVxX3RvX3NrKHJlcSkpOworI2VuZGlmCisJdGNwX2hlYWRlcl9zaXplID0gdGNwX3N5bmFja19vcHRpb25zKHNrLCByZXEsIG1zcywgc2tiLCAmb3B0cywgbWQ1LAogCQkJCQkgICAgIGZvYykgKyBzaXplb2YoKnRoKTsKIAogCXNrYl9wdXNoKHNrYiwgdGNwX2hlYWRlcl9zaXplKTsKQEAgLTI5MjcsMTIgKzI5ODgsMTQgQEAKIAogI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCiAJLyogT2theSwgd2UgaGF2ZSBhbGwgd2UgbmVlZCAtIGRvIHRoZSBtZDUgaGFzaCBpZiBuZWVkZWQgKi8KLQlpZiAobWQ1KSB7CisJaWYgKG1kNSkKIAkJdGNwX3JzayhyZXEpLT5hZl9zcGVjaWZpYy0+Y2FsY19tZDVfaGFzaChvcHRzLmhhc2hfbG9jYXRpb24sCi0JCQkJCSAgICAgICBtZDUsIE5VTEwsIHJlcSwgc2tiKTsKLQl9CisJCQkJCSAgICAgICBtZDUsIHJlcV90b19zayhyZXEpLCBza2IpOworCXJjdV9yZWFkX3VubG9jaygpOwogI2VuZGlmCiAKKwkvKiBEbyBub3QgZm9vbCB0Y3BkdW1wIChpZiBhbnkpLCBjbGVhbiBvdXIgZGVicmlzICovCisJc2tiLT50c3RhbXAudHY2NCA9IDA7CiAJcmV0dXJuIHNrYjsKIH0KIEVYUE9SVF9TWU1CT0wodGNwX21ha2Vfc3luYWNrKTsKQEAgLTI5NzAsNyArMzAzMyw3IEBACiAJCShzeXNjdGxfdGNwX3RpbWVzdGFtcHMgPyBUQ1BPTEVOX1RTVEFNUF9BTElHTkVEIDogMCk7CiAKICNpZmRlZiBDT05GSUdfVENQX01ENVNJRwotCWlmICh0cC0+YWZfc3BlY2lmaWMtPm1kNV9sb29rdXAoc2ssIHNrKSAhPSBOVUxMKQorCWlmICh0cC0+YWZfc3BlY2lmaWMtPm1kNV9sb29rdXAoc2ssIHNrKSkKIAkJdHAtPnRjcF9oZWFkZXJfbGVuICs9IFRDUE9MRU5fTUQ1U0lHX0FMSUdORUQ7CiAjZW5kaWYKIApAQCAtMzI1Niw3ICszMzE5LDcgQEAKIAkgKiBzb2NrLgogCSAqLwogCWJ1ZmYgPSBhbGxvY19za2IoTUFYX1RDUF9IRUFERVIsIHNrX2dmcF9hdG9taWMoc2ssIEdGUF9BVE9NSUMpKTsKLQlpZiAoYnVmZiA9PSBOVUxMKSB7CisJaWYgKCFidWZmKSB7CiAJCWluZXRfY3NrX3NjaGVkdWxlX2Fjayhzayk7CiAJCWluZXRfY3NrKHNrKS0+aWNza19hY2suYXRvID0gVENQX0FUT19NSU47CiAJCWluZXRfY3NrX3Jlc2V0X3htaXRfdGltZXIoc2ssIElDU0tfVElNRV9EQUNLLApAQCAtMzMwMCw3ICszMzYzLDcgQEAKIAogCS8qIFdlIGRvbid0IHF1ZXVlIGl0LCB0Y3BfdHJhbnNtaXRfc2tiKCkgc2V0cyBvd25lcnNoaXAuICovCiAJc2tiID0gYWxsb2Nfc2tiKE1BWF9UQ1BfSEVBREVSLCBza19nZnBfYXRvbWljKHNrLCBHRlBfQVRPTUlDKSk7Ci0JaWYgKHNrYiA9PSBOVUxMKQorCWlmICghc2tiKQogCQlyZXR1cm4gLTE7CiAKIAkvKiBSZXNlcnZlIHNwYWNlIGZvciBoZWFkZXJzIGFuZCBzZXQgY29udHJvbCBiaXRzLiAqLwpAQCAtMzMzMSw4ICszMzk0LDggQEAKIAlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9DTE9TRSkKIAkJcmV0dXJuIC0xOwogCi0JaWYgKChza2IgPSB0Y3Bfc2VuZF9oZWFkKHNrKSkgIT0gTlVMTCAmJgotCSAgICBiZWZvcmUoVENQX1NLQl9DQihza2IpLT5zZXEsIHRjcF93bmRfZW5kKHRwKSkpIHsKKwlza2IgPSB0Y3Bfc2VuZF9oZWFkKHNrKTsKKwlpZiAoc2tiICYmIGJlZm9yZShUQ1BfU0tCX0NCKHNrYiktPnNlcSwgdGNwX3duZF9lbmQodHApKSkgewogCQlpbnQgZXJyOwogCQl1bnNpZ25lZCBpbnQgbXNzID0gdGNwX2N1cnJlbnRfbXNzKHNrKTsKIAkJdW5zaWduZWQgaW50IHNlZ19zaXplID0gdGNwX3duZF9lbmQodHApIC0gVENQX1NLQl9DQihza2IpLT5zZXE7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfdGltZXIuYyBiL25ldC9pcHY0L3RjcF90aW1lci5jCmluZGV4IDA3MzJiNzguLjhjNjVkYzEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF90aW1lci5jCisrKyBiL25ldC9pcHY0L3RjcF90aW1lci5jCkBAIC0xMDcsNiArMTA3LDcgQEAKIAlpZiAobmV0LT5pcHY0LnN5c2N0bF90Y3BfbXR1X3Byb2JpbmcpIHsKIAkJaWYgKCFpY3NrLT5pY3NrX210dXAuZW5hYmxlZCkgewogCQkJaWNzay0+aWNza19tdHVwLmVuYWJsZWQgPSAxOworCQkJaWNzay0+aWNza19tdHVwLnByb2JlX3RpbWVzdGFtcCA9IHRjcF90aW1lX3N0YW1wOwogCQkJdGNwX3N5bmNfbXNzKHNrLCBpY3NrLT5pY3NrX3BtdHVfY29va2llKTsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCBuZXQgKm5ldCA9IHNvY2tfbmV0KHNrKTsKQEAgLTE2Niw3ICsxNjcsNyBAQAogCQlpZiAoaWNzay0+aWNza19yZXRyYW5zbWl0cykgewogCQkJZHN0X25lZ2F0aXZlX2FkdmljZShzayk7CiAJCQlpZiAodHAtPnN5bl9mYXN0b3BlbiB8fCB0cC0+c3luX2RhdGEpCi0JCQkJdGNwX2Zhc3RvcGVuX2NhY2hlX3NldChzaywgMCwgTlVMTCwgdHJ1ZSk7CisJCQkJdGNwX2Zhc3RvcGVuX2NhY2hlX3NldChzaywgMCwgTlVMTCwgdHJ1ZSwgMCk7CiAJCQlpZiAodHAtPnN5bl9kYXRhKQogCQkJCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLAogCQkJCQkJIExJTlVYX01JQl9UQ1BGQVNUT1BFTkFDVElWRUZBSUwpOwpAQCAtMzI2LDcgKzMyNyw3IEBACiAJc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxOwogCiAJcmVxID0gdGNwX3NrKHNrKS0+ZmFzdG9wZW5fcnNrOwotCXJlcS0+cnNrX29wcy0+c3luX2Fja190aW1lb3V0KHNrLCByZXEpOworCXJlcS0+cnNrX29wcy0+c3luX2Fja190aW1lb3V0KHJlcSk7CiAKIAlpZiAocmVxLT5udW1fdGltZW91dCA+PSBtYXhfcmV0cmllcykgewogCQl0Y3Bfd3JpdGVfZXJyKHNrKTsKQEAgLTUzOCwxOSArNTM5LDExIEBACiAJc29ja19wdXQoc2spOwogfQogCi0vKgotICoJVGltZXIgZm9yIGxpc3RlbmluZyBzb2NrZXRzCi0gKi8KLQotc3RhdGljIHZvaWQgdGNwX3N5bmFja190aW1lcihzdHJ1Y3Qgc29jayAqc2spCit2b2lkIHRjcF9zeW5fYWNrX3RpbWVvdXQoY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxKQogewotCWluZXRfY3NrX3JlcXNrX3F1ZXVlX3BydW5lKHNrLCBUQ1BfU1lOUV9JTlRFUlZBTCwKLQkJCQkgICBUQ1BfVElNRU9VVF9JTklULCBUQ1BfUlRPX01BWCk7Ci19CisJc3RydWN0IG5ldCAqbmV0ID0gcmVhZF9wbmV0KCZpbmV0X3JzayhyZXEpLT5pcmVxX25ldCk7CiAKLXZvaWQgdGNwX3N5bl9hY2tfdGltZW91dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKLXsKLQlORVRfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgTElOVVhfTUlCX1RDUFRJTUVPVVRTKTsKKwlORVRfSU5DX1NUQVRTX0JIKG5ldCwgTElOVVhfTUlCX1RDUFRJTUVPVVRTKTsKIH0KIEVYUE9SVF9TWU1CT0wodGNwX3N5bl9hY2tfdGltZW91dCk7CiAKQEAgLTU4Miw3ICs1NzUsNyBAQAogCX0KIAogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgewotCQl0Y3Bfc3luYWNrX3RpbWVyKHNrKTsKKwkJcHJfZXJyKCJIbW0uLi4ga2VlcGFsaXZlIG9uIGEgTElTVEVOID8/P1xuIik7CiAJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwppbmRleCA5N2VmMWY4Yi4uZDEwYjdlMCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdWRwLmMKKysrIGIvbmV0L2lwdjQvdWRwLmMKQEAgLTMxOCw4ICszMTgsOCBAQAogCQkgICBpbmV0MS0+aW5ldF9yY3Zfc2FkZHIgPT0gaW5ldDItPmluZXRfcmN2X3NhZGRyKSk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdWRwNF9wb3J0YWRkcl9oYXNoKHN0cnVjdCBuZXQgKm5ldCwgX19iZTMyIHNhZGRyLAotCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgcG9ydCkKK3N0YXRpYyB1MzIgdWRwNF9wb3J0YWRkcl9oYXNoKGNvbnN0IHN0cnVjdCBuZXQgKm5ldCwgX19iZTMyIHNhZGRyLAorCQkJICAgICAgdW5zaWduZWQgaW50IHBvcnQpCiB7CiAJcmV0dXJuIGpoYXNoXzF3b3JkKChfX2ZvcmNlIHUzMilzYWRkciwgbmV0X2hhc2hfbWl4KG5ldCkpIF4gcG9ydDsKIH0KQEAgLTQyMSw5ICs0MjEsOSBAQAogCXJldHVybiBzY29yZTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCB1ZHBfZWhhc2hmbihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IF9fYmUzMiBsYWRkciwKLQkJCQkgY29uc3QgX191MTYgbHBvcnQsIGNvbnN0IF9fYmUzMiBmYWRkciwKLQkJCQkgY29uc3QgX19iZTE2IGZwb3J0KQorc3RhdGljIHUzMiB1ZHBfZWhhc2hmbihjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IF9fYmUzMiBsYWRkciwKKwkJICAgICAgIGNvbnN0IF9fdTE2IGxwb3J0LCBjb25zdCBfX2JlMzIgZmFkZHIsCisJCSAgICAgICBjb25zdCBfX2JlMTYgZnBvcnQpCiB7CiAJc3RhdGljIHUzMiB1ZHBfZWhhc2hfc2VjcmV0IF9fcmVhZF9tb3N0bHk7CiAKQEAgLTQzMyw3ICs0MzMsNiBAQAogCQkJICAgICAgdWRwX2VoYXNoX3NlY3JldCArIG5ldF9oYXNoX21peChuZXQpKTsKIH0KIAotCiAvKiBjYWxsZWQgd2l0aCByZWFkX3JjdV9sb2NrKCkgKi8KIHN0YXRpYyBzdHJ1Y3Qgc29jayAqdWRwNF9saWJfbG9va3VwMihzdHJ1Y3QgbmV0ICpuZXQsCiAJCV9fYmUzMiBzYWRkciwgX19iZTE2IHNwb3J0LApAQCAtNjMzLDcgKzYzMiw3IEBACiAKIAlzayA9IF9fdWRwNF9saWJfbG9va3VwKG5ldCwgaXBoLT5kYWRkciwgdWgtPmRlc3QsCiAJCQlpcGgtPnNhZGRyLCB1aC0+c291cmNlLCBza2ItPmRldi0+aWZpbmRleCwgdWRwdGFibGUpOwotCWlmIChzayA9PSBOVUxMKSB7CisJaWYgKCFzaykgewogCQlJQ01QX0lOQ19TVEFUU19CSChuZXQsIElDTVBfTUlCX0lORVJST1JTKTsKIAkJcmV0dXJuOwkvKiBObyBzb2NrZXQgZm9yIGVycm9yICovCiAJfQpAQCAtODczLDggKzg3Miw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHVkcF9wdXNoX3BlbmRpbmdfZnJhbWVzKTsKIAotaW50IHVkcF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCi0JCXNpemVfdCBsZW4pCitpbnQgdWRwX3NlbmRtc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCB1ZHBfc29jayAqdXAgPSB1ZHBfc2soc2spOwpAQCAtMTAxMiw3ICsxMDEwLDcgQEAKIAlpZiAoY29ubmVjdGVkKQogCQlydCA9IChzdHJ1Y3QgcnRhYmxlICopc2tfZHN0X2NoZWNrKHNrLCAwKTsKIAotCWlmIChydCA9PSBOVUxMKSB7CisJaWYgKCFydCkgewogCQlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAKIAkJZmw0ID0gJmZsNF9zdGFjazsKQEAgLTExMzYsNyArMTEzNCw3IEBACiAJCSAqIHNlbmRwYWdlIGludGVyZmFjZSBjYW4ndCBwYXNzLgogCQkgKiBUaGlzIHdpbGwgc3VjY2VlZCBvbmx5IHdoZW4gdGhlIHNvY2tldCBpcyBjb25uZWN0ZWQuCiAJCSAqLwotCQlyZXQgPSB1ZHBfc2VuZG1zZyhOVUxMLCBzaywgJm1zZywgMCk7CisJCXJldCA9IHVkcF9zZW5kbXNnKHNrLCAmbXNnLCAwKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KQEAgLTExNzIsNyArMTE3MCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotCiAvKioKICAqCWZpcnN0X3BhY2tldF9sZW5ndGgJLSByZXR1cm4gbGVuZ3RoIG9mIGZpcnN0IHBhY2tldCBpbiByZWNlaXZlIHF1ZXVlCiAgKglAc2s6IHNvY2tldApAQCAtMTI1NCw4ICsxMjUxLDggQEAKICAqIAlyZXR1cm4gaXQsIG90aGVyd2lzZSB3ZSBibG9jay4KICAqLwogCi1pbnQgdWRwX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKK2ludCB1ZHBfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssCisJCWludCBmbGFncywgaW50ICphZGRyX2xlbikKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJREVDTEFSRV9TT0NLQUREUihzdHJ1Y3Qgc29ja2FkZHJfaW4gKiwgc2luLCBtc2ctPm1zZ19uYW1lKTsKQEAgLTEzNTYsNyArMTM1Myw2IEBACiAJZ290byB0cnlfYWdhaW47CiB9CiAKLQogaW50IHVkcF9kaXNjb25uZWN0KHN0cnVjdCBzb2NrICpzaywgaW50IGZsYWdzKQogewogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKQEAgLTE1MjMsNyArMTUxOSw3IEBACiAKIAkJLyogaWYgd2UncmUgb3Zlcmx5IHNob3J0LCBsZXQgVURQIGhhbmRsZSBpdCAqLwogCQllbmNhcF9yY3YgPSBBQ0NFU1NfT05DRSh1cC0+ZW5jYXBfcmN2KTsKLQkJaWYgKHNrYi0+bGVuID4gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICYmIGVuY2FwX3JjdiAhPSBOVUxMKSB7CisJCWlmIChza2ItPmxlbiA+IHNpemVvZihzdHJ1Y3QgdWRwaGRyKSAmJiBlbmNhcF9yY3YpIHsKIAkJCWludCByZXQ7CiAKIAkJCS8qIFZlcmlmeSBjaGVja3N1bSBiZWZvcmUgZ2l2aW5nIHRvIGVuY2FwICovCkBAIC0xNTgwLDcgKzE1NzYsNiBAQAogCSAgICB1ZHBfbGliX2NoZWNrc3VtX2NvbXBsZXRlKHNrYikpCiAJCWdvdG8gY3N1bV9lcnJvcjsKIAotCiAJaWYgKHNrX3JjdnF1ZXVlc19mdWxsKHNrLCBzay0+c2tfcmN2YnVmKSkgewogCQlVRFBfSU5DX1NUQVRTX0JIKHNvY2tfbmV0KHNrKSwgVURQX01JQl9SQ1ZCVUZFUlJPUlMsCiAJCQkJIGlzX3VkcGxpdGUpOwpAQCAtMTYxMCw3ICsxNjA1LDYgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLQogc3RhdGljIHZvaWQgZmx1c2hfc3RhY2soc3RydWN0IHNvY2sgKipzdGFjaywgdW5zaWduZWQgaW50IGNvdW50LAogCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgdW5zaWduZWQgaW50IGZpbmFsKQogewpAQCAtMTYyMCw3ICsxNjE0LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCXNrID0gc3RhY2tbaV07Ci0JCWlmIChsaWtlbHkoc2tiMSA9PSBOVUxMKSkKKwkJaWYgKGxpa2VseSghc2tiMSkpCiAJCQlza2IxID0gKGkgPT0gZmluYWwpID8gc2tiIDogc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiAKIAkJaWYgKCFza2IxKSB7CkBAIC0xODAzLDcgKzE3OTcsNyBAQAogCQkJCQkJc2FkZHIsIGRhZGRyLCB1ZHB0YWJsZSwgcHJvdG8pOwogCiAJc2sgPSBfX3VkcDRfbGliX2xvb2t1cF9za2Ioc2tiLCB1aC0+c291cmNlLCB1aC0+ZGVzdCwgdWRwdGFibGUpOwotCWlmIChzayAhPSBOVUxMKSB7CisJaWYgKHNrKSB7CiAJCWludCByZXQ7CiAKIAkJaWYgKGluZXRfZ2V0X2NvbnZlcnRfY3N1bShzaykgJiYgdWgtPmNoZWNrICYmICFJU19VRFBMSVRFKHNrKSkKQEAgLTI1MjUsNiArMjUxOSwxNiBAQAogCX0KIH0KIAordTMyIHVkcF9mbG93X2hhc2hybmQodm9pZCkKK3sKKwlzdGF0aWMgdTMyIGhhc2hybmQgX19yZWFkX21vc3RseTsKKworCW5ldF9nZXRfcmFuZG9tX29uY2UoJmhhc2hybmQsIHNpemVvZihoYXNocm5kKSk7CisKKwlyZXR1cm4gaGFzaHJuZDsKK30KK0VYUE9SVF9TWU1CT0wodWRwX2Zsb3dfaGFzaHJuZCk7CisKIHZvaWQgX19pbml0IHVkcF9pbml0KHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBsaW1pdDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcF9kaWFnLmMgYi9uZXQvaXB2NC91ZHBfZGlhZy5jCmluZGV4IDRhMDAwZjEuLmI3NjNjMzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcF9kaWFnLmMKKysrIGIvbmV0L2lwdjQvdWRwX2RpYWcuYwpAQCAtMTgsOCArMTgsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NvY2tfZGlhZy5oPgogCiBzdGF0aWMgaW50IHNrX2RpYWdfZHVtcChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCi0JCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwgc3RydWN0IGluZXRfZGlhZ19yZXFfdjIgKnJlcSwKLQkJc3RydWN0IG5sYXR0ciAqYmMpCisJCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCQljb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqcmVxLAorCQkJc3RydWN0IG5sYXR0ciAqYmMpCiB7CiAJaWYgKCFpbmV0X2RpYWdfYmNfc2soYmMsIHNrKSkKIAkJcmV0dXJuIDA7CkBAIC0zMSw3ICszMiw4IEBACiB9CiAKIHN0YXRpYyBpbnQgdWRwX2R1bXBfb25lKHN0cnVjdCB1ZHBfdGFibGUgKnRibCwgc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwKLQkJY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpCisJCQljb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpCiB7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAJc3RydWN0IHNvY2sgKnNrOwpAQCAtNTYsNyArNTgsNyBAQAogCQlnb3RvIG91dF9ub3NrOwogCiAJZXJyID0gLUVOT0VOVDsKLQlpZiAoc2sgPT0gTlVMTCkKKwlpZiAoIXNrKQogCQlnb3RvIG91dF9ub3NrOwogCiAJZXJyID0gc29ja19kaWFnX2NoZWNrX2Nvb2tpZShzaywgcmVxLT5pZC5pZGlhZ19jb29raWUpOwpAQCAtOTAsOCArOTIsOSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHVkcF9kdW1wKHN0cnVjdCB1ZHBfdGFibGUgKnRhYmxlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCi0JCXN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLCBzdHJ1Y3QgbmxhdHRyICpiYykKK3N0YXRpYyB2b2lkIHVkcF9kdW1wKHN0cnVjdCB1ZHBfdGFibGUgKnRhYmxlLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwgc3RydWN0IG5sYXR0ciAqYmMpCiB7CiAJaW50IG51bSwgc19udW0sIHNsb3QsIHNfc2xvdDsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKQEAgLTE0NCwxMyArMTQ3LDEzIEBACiB9CiAKIHN0YXRpYyB2b2lkIHVkcF9kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAotCQlzdHJ1Y3QgaW5ldF9kaWFnX3JlcV92MiAqciwgc3RydWN0IG5sYXR0ciAqYmMpCisJCQkgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLCBzdHJ1Y3QgbmxhdHRyICpiYykKIHsKIAl1ZHBfZHVtcCgmdWRwX3RhYmxlLCBza2IsIGNiLCByLCBiYyk7CiB9CiAKIHN0YXRpYyBpbnQgdWRwX2RpYWdfZHVtcF9vbmUoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCi0JCXN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpCisJCQkgICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpCiB7CiAJcmV0dXJuIHVkcF9kdW1wX29uZSgmdWRwX3RhYmxlLCBpbl9za2IsIG5saCwgcmVxKTsKIH0KQEAgLTE3MCwxMyArMTczLDE0IEBACiB9OwogCiBzdGF0aWMgdm9pZCB1ZHBsaXRlX2RpYWdfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCi0JCXN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLCBzdHJ1Y3QgbmxhdHRyICpiYykKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyLAorCQkJICAgICAgc3RydWN0IG5sYXR0ciAqYmMpCiB7CiAJdWRwX2R1bXAoJnVkcGxpdGVfdGFibGUsIHNrYiwgY2IsIHIsIGJjKTsKIH0KIAogc3RhdGljIGludCB1ZHBsaXRlX2RpYWdfZHVtcF9vbmUoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCi0JCXN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpCisJCQkJIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfcmVxX3YyICpyZXEpCiB7CiAJcmV0dXJuIHVkcF9kdW1wX29uZSgmdWRwbGl0ZV90YWJsZSwgaW5fc2tiLCBubGgsIHJlcSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC91ZHBfaW1wbC5oIGIvbmV0L2lwdjQvdWRwX2ltcGwuaAppbmRleCBmM2MyNzg5Li43ZTBmZTRiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHBfaW1wbC5oCisrKyBiL25ldC9pcHY0L3VkcF9pbXBsLmgKQEAgLTIxLDggKzIxLDggQEAKIGludCBjb21wYXRfdWRwX2dldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkJICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOwogI2VuZGlmCi1pbnQgdWRwX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbik7CitpbnQgdWRwX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBub2Jsb2NrLAorCQlpbnQgZmxhZ3MsIGludCAqYWRkcl9sZW4pOwogaW50IHVkcF9zZW5kcGFnZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKIAkJIGludCBmbGFncyk7CiBpbnQgdWRwX3F1ZXVlX3Jjdl9za2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcF9vZmZsb2FkLmMgYi9uZXQvaXB2NC91ZHBfb2ZmbG9hZC5jCmluZGV4IDQ5MTVkODIuLmY5Mzg2MTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3VkcF9vZmZsb2FkLmMKKysrIGIvbmV0L2lwdjQvdWRwX29mZmxvYWQuYwpAQCAtMjg1LDcgKzI4NSw3IEBACiAJcHJfd2FybigidWRwX2RlbF9vZmZsb2FkOiBkaWRuJ3QgZmluZCBvZmZsb2FkIGZvciBwb3J0ICVkXG4iLCBudG9ocyh1by0+cG9ydCkpOwogdW5sb2NrOgogCXNwaW5fdW5sb2NrKCZ1ZHBfb2ZmbG9hZF9sb2NrKTsKLQlpZiAodW9fcHJpdiAhPSBOVUxMKQorCWlmICh1b19wcml2KQogCQljYWxsX3JjdSgmdW9fcHJpdi0+cmN1LCB1ZHBfb2ZmbG9hZF9mcmVlX3JvdXRpbmUpOwogfQogRVhQT1JUX1NZTUJPTCh1ZHBfZGVsX29mZmxvYWQpOwpAQCAtMzk0LDcgKzM5NCw3IEBACiAJCQlicmVhazsKIAl9CiAKLQlpZiAodW9fcHJpdiAhPSBOVUxMKSB7CisJaWYgKHVvX3ByaXYpIHsKIAkJTkFQSV9HUk9fQ0Ioc2tiKS0+cHJvdG8gPSB1b19wcml2LT5vZmZsb2FkLT5pcHByb3RvOwogCQllcnIgPSB1b19wcml2LT5vZmZsb2FkLT5jYWxsYmFja3MuZ3JvX2NvbXBsZXRlKHNrYiwKIAkJCQluaG9mZiArIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3VkcF90dW5uZWwuYyBiL25ldC9pcHY0L3VkcF90dW5uZWwuYwppbmRleCBjODNiMzU0Li42YmI5OGNjIDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHBfdHVubmVsLmMKKysrIGIvbmV0L2lwdjQvdWRwX3R1bm5lbC5jCkBAIC03NSw3ICs3NSw3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzZXR1cF91ZHBfdHVubmVsX3NvY2spOwogCi1pbnQgdWRwX3R1bm5lbF94bWl0X3NrYihzdHJ1Y3QgcnRhYmxlICpydCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2ludCB1ZHBfdHVubmVsX3htaXRfc2tiKHN0cnVjdCBydGFibGUgKnJ0LCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCiAJCQlfX2JlMzIgc3JjLCBfX2JlMzIgZHN0LCBfX3U4IHRvcywgX191OCB0dGwsCiAJCQlfX2JlMTYgZGYsIF9fYmUxNiBzcmNfcG9ydCwgX19iZTE2IGRzdF9wb3J0LAogCQkJYm9vbCB4bmV0LCBib29sIG5vY2hlY2spCkBAIC05Miw3ICs5Miw3IEBACiAKIAl1ZHBfc2V0X2NzdW0obm9jaGVjaywgc2tiLCBzcmMsIGRzdCwgc2tiLT5sZW4pOwogCi0JcmV0dXJuIGlwdHVubmVsX3htaXQoc2tiLT5zaywgcnQsIHNrYiwgc3JjLCBkc3QsIElQUFJPVE9fVURQLAorCXJldHVybiBpcHR1bm5lbF94bWl0KHNrLCBydCwgc2tiLCBzcmMsIGRzdCwgSVBQUk9UT19VRFAsCiAJCQkgICAgIHRvcywgdHRsLCBkZiwgeG5ldCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1ZHBfdHVubmVsX3htaXRfc2tiKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X2lucHV0LmMgYi9uZXQvaXB2NC94ZnJtNF9pbnB1dC5jCmluZGV4IGFhYzYxOTcuLjYwYjAzMmYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X2lucHV0LmMKKysrIGIvbmV0L2lwdjQveGZybTRfaW5wdXQuYwpAQCAtMjIsOSArMjIsOSBAQAogCXJldHVybiB4ZnJtNF9leHRyYWN0X2hlYWRlcihza2IpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB4ZnJtNF9yY3ZfZW5jYXBfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIGludCB4ZnJtNF9yY3ZfZW5jYXBfZmluaXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpZiAoc2tiX2RzdChza2IpID09IE5VTEwpIHsKKwlpZiAoIXNrYl9kc3Qoc2tiKSkgewogCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaCA9IGlwX2hkcihza2IpOwogCiAJCWlmIChpcF9yb3V0ZV9pbnB1dF9ub3JlZihza2IsIGlwaC0+ZGFkZHIsIGlwaC0+c2FkZHIsCkBAIC01Miw3ICs1Miw4IEBACiAJaXBoLT50b3RfbGVuID0gaHRvbnMoc2tiLT5sZW4pOwogCWlwX3NlbmRfY2hlY2soaXBoKTsKIAotCU5GX0hPT0soTkZQUk9UT19JUFY0LCBORl9JTkVUX1BSRV9ST1VUSU5HLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCU5GX0hPT0soTkZQUk9UT19JUFY0LCBORl9JTkVUX1BSRV9ST1VUSU5HLCBOVUxMLCBza2IsCisJCXNrYi0+ZGV2LCBOVUxMLAogCQl4ZnJtNF9yY3ZfZW5jYXBfZmluaXNoKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3hmcm00X21vZGVfdHVubmVsLmMgYi9uZXQvaXB2NC94ZnJtNF9tb2RlX3R1bm5lbC5jCmluZGV4IDkxNzcxYTcuLjM1ZmVkYTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X21vZGVfdHVubmVsLmMKKysrIGIvbmV0L2lwdjQveGZybTRfbW9kZV90dW5uZWwuYwpAQCAtNjMsNyArNjMsNyBAQAogCiAJdG9wX2lwaC0+c2FkZHIgPSB4LT5wcm9wcy5zYWRkci5hNDsKIAl0b3BfaXBoLT5kYWRkciA9IHgtPmlkLmRhZGRyLmE0OwotCWlwX3NlbGVjdF9pZGVudChza2IsIE5VTEwpOworCWlwX3NlbGVjdF9pZGVudChkZXZfbmV0KGRzdC0+ZGV2KSwgc2tiLCBOVUxMKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQveGZybTRfb3V0cHV0LmMgYi9uZXQvaXB2NC94ZnJtNF9vdXRwdXQuYwppbmRleCBkNWY2YmQ5Li4yODc4ZGJmIDEwMDY0NAotLS0gYS9uZXQvaXB2NC94ZnJtNF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC94ZnJtNF9vdXRwdXQuYwpAQCAtNjMsNDAgKzYzLDQwIEBACiAJCXJldHVybiBlcnI7CiAKIAlJUENCKHNrYiktPmZsYWdzIHw9IElQU0tCX1hGUk1fVFVOTkVMX1NJWkU7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKIAogCXJldHVybiB4LT5vdXRlcl9tb2RlLT5vdXRwdXQyKHgsIHNrYik7CiB9CiBFWFBPUlRfU1lNQk9MKHhmcm00X3ByZXBhcmVfb3V0cHV0KTsKIAotaW50IHhmcm00X291dHB1dF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCB4ZnJtNF9vdXRwdXRfZmluaXNoKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAltZW1zZXQoSVBDQihza2IpLCAwLCBzaXplb2YoKklQQ0Ioc2tiKSkpOwotCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CiAKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCiAJSVBDQihza2IpLT5mbGFncyB8PSBJUFNLQl9YRlJNX1RSQU5TRk9STUVEOwogI2VuZGlmCiAKLQlyZXR1cm4geGZybV9vdXRwdXQoc2tiKTsKKwlyZXR1cm4geGZybV9vdXRwdXQoc2ssIHNrYik7CiB9CiAKLXN0YXRpYyBpbnQgX194ZnJtNF9vdXRwdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgX194ZnJtNF9vdXRwdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB4ZnJtX3N0YXRlICp4ID0gc2tiX2RzdChza2IpLT54ZnJtOwogCiAjaWZkZWYgQ09ORklHX05FVEZJTFRFUgogCWlmICgheCkgewogCQlJUENCKHNrYiktPmZsYWdzIHw9IElQU0tCX1JFUk9VVEVEOwotCQlyZXR1cm4gZHN0X291dHB1dChza2IpOworCQlyZXR1cm4gZHN0X291dHB1dF9zayhzaywgc2tiKTsKIAl9CiAjZW5kaWYKIAotCXJldHVybiB4LT5vdXRlcl9tb2RlLT5hZmluZm8tPm91dHB1dF9maW5pc2goc2tiKTsKKwlyZXR1cm4geC0+b3V0ZXJfbW9kZS0+YWZpbmZvLT5vdXRwdXRfZmluaXNoKHNrLCBza2IpOwogfQogCiBpbnQgeGZybTRfb3V0cHV0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gTkZfSE9PS19DT05EKE5GUFJPVE9fSVBWNCwgTkZfSU5FVF9QT1NUX1JPVVRJTkcsIHNrYiwKKwlyZXR1cm4gTkZfSE9PS19DT05EKE5GUFJPVE9fSVBWNCwgTkZfSU5FVF9QT1NUX1JPVVRJTkcsIHNrLCBza2IsCiAJCQkgICAgTlVMTCwgc2tiX2RzdChza2IpLT5kZXYsIF9feGZybTRfb3V0cHV0LAogCQkJICAgICEoSVBDQihza2IpLT5mbGFncyAmIElQU0tCX1JFUk9VVEVEKSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF9wb2xpY3kuYyBiL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCmluZGV4IDYxNTZmNjguLmJmZjY5NzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCisrKyBiL25ldC9pcHY0L3hmcm00X3BvbGljeS5jCkBAIC0yMzIsNyArMjMyLDYgQEAKIAogc3RhdGljIHN0cnVjdCBkc3Rfb3BzIHhmcm00X2RzdF9vcHMgPSB7CiAJLmZhbWlseSA9CQlBRl9JTkVULAotCS5wcm90b2NvbCA9CQljcHVfdG9fYmUxNihFVEhfUF9JUCksCiAJLmdjID0JCQl4ZnJtNF9nYXJiYWdlX2NvbGxlY3QsCiAJLnVwZGF0ZV9wbXR1ID0JCXhmcm00X3VwZGF0ZV9wbXR1LAogCS5yZWRpcmVjdCA9CQl4ZnJtNF9yZWRpcmVjdCwKQEAgLTI5OSw3ICsyOTgsNyBAQAogewogCXN0cnVjdCBjdGxfdGFibGUgKnRhYmxlOwogCi0JaWYgKG5ldC0+aXB2NC54ZnJtNF9oZHIgPT0gTlVMTCkKKwlpZiAoIW5ldC0+aXB2NC54ZnJtNF9oZHIpCiAJCXJldHVybjsKIAogCXRhYmxlID0gbmV0LT5pcHY0Lnhmcm00X2hkci0+Y3RsX3RhYmxlX2FyZzsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IGI2MDMwMDIuLjM3YjcwZTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KICNpbmNsdWRlIDxsaW51eC9uZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW42Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgpAQCAtMTAyLDYgKzEwMyw5IEBACiAKICNkZWZpbmUJSU5GSU5JVFlfTElGRV9USU1FCTB4RkZGRkZGRkYKIAorI2RlZmluZSBJUFY2X01BWF9TVFJMRU4gXAorCXNpemVvZigiZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6MjU1LjI1NS4yNTUuMjU1IikKKwogc3RhdGljIGlubGluZSB1MzIgY3N0YW1wX2RlbHRhKHVuc2lnbmVkIGxvbmcgY3N0YW1wKQogewogCXJldHVybiAoY3N0YW1wIC0gSU5JVElBTF9KSUZGSUVTKSAqIDEwMFVMIC8gSFo7CkBAIC0xMjcsNiArMTMxLDkgQEAKIAogc3RhdGljIGludCBpcHY2X2dlbmVyYXRlX2V1aTY0KHU4ICpldWksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIGludCBpcHY2X2NvdW50X2FkZHJlc3NlcyhzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2KTsKK3N0YXRpYyBpbnQgaXB2Nl9nZW5lcmF0ZV9zdGFibGVfYWRkcmVzcyhzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCisJCQkJCXU4IGRhZF9jb3VudCwKKwkJCQkJY29uc3Qgc3RydWN0IGluZXQ2X2RldiAqaWRldik7CiAKIC8qCiAgKglDb25maWd1cmVkIHVuaWNhc3QgYWRkcmVzcyBoYXNoIHRhYmxlCkBAIC0yMDIsNiArMjA5LDkgQEAKIAkuYWNjZXB0X2RhZAkJPSAxLAogCS5zdXBwcmVzc19mcmFnX25kaXNjCT0gMSwKIAkuYWNjZXB0X3JhX210dQkJPSAxLAorCS5zdGFibGVfc2VjcmV0CQk9IHsKKwkJLmluaXRpYWxpemVkID0gZmFsc2UsCisJfQogfTsKIAogc3RhdGljIHN0cnVjdCBpcHY2X2RldmNvbmYgaXB2Nl9kZXZjb25mX2RmbHQgX19yZWFkX21vc3RseSA9IHsKQEAgLTI0MCw2ICsyNTAsOSBAQAogCS5hY2NlcHRfZGFkCQk9IDEsCiAJLnN1cHByZXNzX2ZyYWdfbmRpc2MJPSAxLAogCS5hY2NlcHRfcmFfbXR1CQk9IDEsCisJLnN0YWJsZV9zZWNyZXQJCT0geworCQkuaW5pdGlhbGl6ZWQgPSBmYWxzZSwKKwl9LAogfTsKIAogLyogQ2hlY2sgaWYgYSB2YWxpZCBxZGlzYyBpcyBhdmFpbGFibGUgKi8KQEAgLTMyMSw3ICszMzQsNyBAQAogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAogCW5kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaW5ldDZfZGV2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKG5kZXYgPT0gTlVMTCkKKwlpZiAoIW5kZXYpCiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAKIAlyd2xvY2tfaW5pdCgmbmRldi0+bG9jayk7CkBAIC0zMzMsNyArMzQ2LDcgQEAKIAluZGV2LT5jbmYubXR1NiA9IGRldi0+bXR1OwogCW5kZXYtPmNuZi5zeXNjdGwgPSBOVUxMOwogCW5kZXYtPm5kX3Bhcm1zID0gbmVpZ2hfcGFybXNfYWxsb2MoZGV2LCAmbmRfdGJsKTsKLQlpZiAobmRldi0+bmRfcGFybXMgPT0gTlVMTCkgeworCWlmICghbmRldi0+bmRfcGFybXMpIHsKIAkJa2ZyZWUobmRldik7CiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAJfQpAQCAtNDY4LDcgKzQ4MSw3IEBACiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgbmV0Y29uZm1zZyksCiAJCQlmbGFncyk7Ci0JaWYgKG5saCA9PSBOVUxMKQorCWlmICghbmxoKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJbmNtID0gbmxtc2dfZGF0YShubGgpOwpAQCAtNTA2LDcgKzUxOSw3IEBACiAJaW50IGVyciA9IC1FTk9CVUZTOwogCiAJc2tiID0gbmxtc2dfbmV3KGluZXQ2X25ldGNvbmZfbXNnc2l6ZV9kZXZjb25mKHR5cGUpLCBHRlBfQVRPTUlDKTsKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gaW5ldDZfbmV0Y29uZl9maWxsX2RldmNvbmYoc2tiLCBpZmluZGV4LCBkZXZjb25mLCAwLCAwLApAQCAtNTYxLDEwICs1NzQsMTAgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZpbmRleCk7Ci0JCWlmIChkZXYgPT0gTlVMTCkKKwkJaWYgKCFkZXYpCiAJCQlnb3RvIGVycm91dDsKIAkJaW42X2RldiA9IF9faW42X2Rldl9nZXQoZGV2KTsKLQkJaWYgKGluNl9kZXYgPT0gTlVMTCkKKwkJaWYgKCFpbjZfZGV2KQogCQkJZ290byBlcnJvdXQ7CiAJCWRldmNvbmYgPSAmaW42X2Rldi0+Y25mOwogCQlicmVhazsKQEAgLTU3Miw3ICs1ODUsNyBAQAogCiAJZXJyID0gLUVOT0JVRlM7CiAJc2tiID0gbmxtc2dfbmV3KGluZXQ2X25ldGNvbmZfbXNnc2l6ZV9kZXZjb25mKC0xKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHNrYiA9PSBOVUxMKQorCWlmICghc2tiKQogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IGluZXQ2X25ldGNvbmZfZmlsbF9kZXZjb25mKHNrYiwgaWZpbmRleCwgZGV2Y29uZiwKQEAgLTg0MSw3ICs4NTQsNyBAQAogCiAJaWZhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGluZXQ2X2lmYWRkciksIEdGUF9BVE9NSUMpOwogCi0JaWYgKGlmYSA9PSBOVUxMKSB7CisJaWYgKCFpZmEpIHsKIAkJQURCRygiaXB2Nl9hZGRfYWRkcjogbWFsbG9jIGZhaWxlZFxuIik7CiAJCWVyciA9IC1FTk9CVUZTOwogCQlnb3RvIG91dDsKQEAgLTg2MCw3ICs4NzMsNiBAQAogCQlpZmEtPnBlZXJfYWRkciA9ICpwZWVyX2FkZHI7CiAKIAlzcGluX2xvY2tfaW5pdCgmaWZhLT5sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmaWZhLT5zdGF0ZV9sb2NrKTsKIAlJTklUX0RFTEFZRURfV09SSygmaWZhLT5kYWRfd29yaywgYWRkcmNvbmZfZGFkX3dvcmspOwogCUlOSVRfSExJU1RfTk9ERSgmaWZhLT5hZGRyX2xzdCk7CiAJaWZhLT5zY29wZSA9IHNjb3BlOwpAQCAtMTAwMywxMCArMTAxNSwxMCBAQAogCiAJQVNTRVJUX1JUTkwoKTsKIAotCXNwaW5fbG9ja19iaCgmaWZwLT5zdGF0ZV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmlmcC0+bG9jayk7CiAJc3RhdGUgPSBpZnAtPnN0YXRlOwogCWlmcC0+c3RhdGUgPSBJTkVUNl9JRkFERFJfU1RBVEVfREVBRDsKLQlzcGluX3VubG9ja19iaCgmaWZwLT5zdGF0ZV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKIAogCWlmIChzdGF0ZSA9PSBJTkVUNl9JRkFERFJfU1RBVEVfREVBRCkKIAkJZ290byBvdXQ7CkBAIC0xNTQ2LDcgKzE1NTgsNyBAQAogCQkJICAgIDogaWZwLT5mbGFnczsKIAkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmaWZwLT5hZGRyLCBhZGRyKSAmJgogCQkgICAgIShpZnBfZmxhZ3MmYmFubmVkX2ZsYWdzKSAmJgotCQkgICAgKGRldiA9PSBOVUxMIHx8IGlmcC0+aWRldi0+ZGV2ID09IGRldiB8fAorCQkgICAgKCFkZXYgfHwgaWZwLT5pZGV2LT5kZXYgPT0gZGV2IHx8CiAJCSAgICAgIShpZnAtPnNjb3BlJihJRkFfTElOS3xJRkFfSE9TVCkgfHwgc3RyaWN0KSkpIHsKIAkJCXJjdV9yZWFkX3VubG9ja19iaCgpOwogCQkJcmV0dXJuIDE7CkBAIC0xNTY4LDcgKzE1ODAsNyBAQAogCQlpZiAoIW5ldF9lcShkZXZfbmV0KGlmcC0+aWRldi0+ZGV2KSwgbmV0KSkKIAkJCWNvbnRpbnVlOwogCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZpZnAtPmFkZHIsIGFkZHIpKSB7Ci0JCQlpZiAoZGV2ID09IE5VTEwgfHwgaWZwLT5pZGV2LT5kZXYgPT0gZGV2KQorCQkJaWYgKCFkZXYgfHwgaWZwLT5pZGV2LT5kZXYgPT0gZGV2KQogCQkJCXJldHVybiB0cnVlOwogCQl9CiAJfQpAQCAtMTYzNyw3ICsxNjQ5LDcgQEAKIAkJaWYgKCFuZXRfZXEoZGV2X25ldChpZnAtPmlkZXYtPmRldiksIG5ldCkpCiAJCQljb250aW51ZTsKIAkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmaWZwLT5hZGRyLCBhZGRyKSkgewotCQkJaWYgKGRldiA9PSBOVUxMIHx8IGlmcC0+aWRldi0+ZGV2ID09IGRldiB8fAorCQkJaWYgKCFkZXYgfHwgaWZwLT5pZGV2LT5kZXYgPT0gZGV2IHx8CiAJCQkgICAgIShpZnAtPnNjb3BlJihJRkFfTElOS3xJRkFfSE9TVCkgfHwgc3RyaWN0KSkgewogCQkJCXJlc3VsdCA9IGlmcDsKIAkJCQlpbjZfaWZhX2hvbGQoaWZwKTsKQEAgLTE2ODYsMTkgKzE2OTgsMjEgQEAKIHsKIAlpbnQgZXJyID0gLUVOT0VOVDsKIAotCXNwaW5fbG9ja19iaCgmaWZwLT5zdGF0ZV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmlmcC0+bG9jayk7CiAJaWYgKGlmcC0+c3RhdGUgPT0gSU5FVDZfSUZBRERSX1NUQVRFX0RBRCkgewogCQlpZnAtPnN0YXRlID0gSU5FVDZfSUZBRERSX1NUQVRFX1BPU1REQUQ7CiAJCWVyciA9IDA7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZpZnAtPnN0YXRlX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZpZnAtPmxvY2spOwogCiAJcmV0dXJuIGVycjsKIH0KIAogdm9pZCBhZGRyY29uZl9kYWRfZmFpbHVyZShzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnApCiB7CisJc3RydWN0IGluNl9hZGRyIGFkZHI7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IGlmcC0+aWRldjsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGlmcC0+aWRldi0+ZGV2KTsKIAogCWlmIChhZGRyY29uZl9kYWRfZW5kKGlmcCkpIHsKIAkJaW42X2lmYV9wdXQoaWZwKTsKQEAgLTE3MDgsOSArMTcyMiw1NyBAQAogCW5ldF9pbmZvX3JhdGVsaW1pdGVkKCIlczogSVB2NiBkdXBsaWNhdGUgYWRkcmVzcyAlcEk2YyBkZXRlY3RlZCFcbiIsCiAJCQkgICAgIGlmcC0+aWRldi0+ZGV2LT5uYW1lLCAmaWZwLT5hZGRyKTsKIAotCWlmIChpZGV2LT5jbmYuYWNjZXB0X2RhZCA+IDEgJiYgIWlkZXYtPmNuZi5kaXNhYmxlX2lwdjYpIHsKLQkJc3RydWN0IGluNl9hZGRyIGFkZHI7CisJc3Bpbl9sb2NrX2JoKCZpZnAtPmxvY2spOwogCisJaWYgKGlmcC0+ZmxhZ3MgJiBJRkFfRl9TVEFCTEVfUFJJVkFDWSkgeworCQlpbnQgc2NvcGUgPSBpZnAtPnNjb3BlOworCQl1MzIgZmxhZ3MgPSBpZnAtPmZsYWdzOworCQlzdHJ1Y3QgaW42X2FkZHIgbmV3X2FkZHI7CisJCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDI7CisJCXUzMiB2YWxpZF9sZnQsIHByZWZlcnJlZF9sZnQ7CisJCWludCBwZnhsZW4gPSBpZnAtPnByZWZpeF9sZW47CisJCWludCByZXRyaWVzID0gaWZwLT5zdGFibGVfcHJpdmFjeV9yZXRyeSArIDE7CisKKwkJaWYgKHJldHJpZXMgPiBuZXQtPmlwdjYuc3lzY3RsLmlkZ2VuX3JldHJpZXMpIHsKKwkJCW5ldF9pbmZvX3JhdGVsaW1pdGVkKCIlczogcHJpdmFjeSBzdGFibGUgYWRkcmVzcyBnZW5lcmF0aW9uIGZhaWxlZCBiZWNhdXNlIG9mIERBRCBjb25mbGljdHMhXG4iLAorCQkJCQkgICAgIGlmcC0+aWRldi0+ZGV2LT5uYW1lKTsKKwkJCWdvdG8gZXJyZGFkOworCQl9CisKKwkJbmV3X2FkZHIgPSBpZnAtPmFkZHI7CisJCWlmIChpcHY2X2dlbmVyYXRlX3N0YWJsZV9hZGRyZXNzKCZuZXdfYWRkciwgcmV0cmllcywKKwkJCQkJCSBpZGV2KSkKKwkJCWdvdG8gZXJyZGFkOworCisJCXZhbGlkX2xmdCA9IGlmcC0+dmFsaWRfbGZ0OworCQlwcmVmZXJyZWRfbGZ0ID0gaWZwLT5wcmVmZXJlZF9sZnQ7CisKKwkJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CisKKwkJaWYgKGlkZXYtPmNuZi5tYXhfYWRkcmVzc2VzICYmCisJCSAgICBpcHY2X2NvdW50X2FkZHJlc3NlcyhpZGV2KSA+PQorCQkgICAgaWRldi0+Y25mLm1heF9hZGRyZXNzZXMpCisJCQlnb3RvIGxvY2tfZXJyZGFkOworCisJCW5ldF9pbmZvX3JhdGVsaW1pdGVkKCIlczogZ2VuZXJhdGluZyBuZXcgc3RhYmxlIHByaXZhY3kgYWRkcmVzcyBiZWNhdXNlIG9mIERBRCBjb25mbGljdFxuIiwKKwkJCQkgICAgIGlmcC0+aWRldi0+ZGV2LT5uYW1lKTsKKworCQlpZnAyID0gaXB2Nl9hZGRfYWRkcihpZGV2LCAmbmV3X2FkZHIsIE5VTEwsIHBmeGxlbiwKKwkJCQkgICAgIHNjb3BlLCBmbGFncywgdmFsaWRfbGZ0LAorCQkJCSAgICAgcHJlZmVycmVkX2xmdCk7CisJCWlmIChJU19FUlIoaWZwMikpCisJCQlnb3RvIGxvY2tfZXJyZGFkOworCisJCXNwaW5fbG9ja19iaCgmaWZwMi0+bG9jayk7CisJCWlmcDItPnN0YWJsZV9wcml2YWN5X3JldHJ5ID0gcmV0cmllczsKKwkJaWZwMi0+c3RhdGUgPSBJTkVUNl9JRkFERFJfU1RBVEVfUFJFREFEOworCQlzcGluX3VubG9ja19iaCgmaWZwMi0+bG9jayk7CisKKwkJYWRkcmNvbmZfbW9kX2RhZF93b3JrKGlmcDIsIG5ldC0+aXB2Ni5zeXNjdGwuaWRnZW5fZGVsYXkpOworCQlpbjZfaWZhX3B1dChpZnAyKTsKK2xvY2tfZXJyZGFkOgorCQlzcGluX2xvY2tfYmgoJmlmcC0+bG9jayk7CisJfSBlbHNlIGlmIChpZGV2LT5jbmYuYWNjZXB0X2RhZCA+IDEgJiYgIWlkZXYtPmNuZi5kaXNhYmxlX2lwdjYpIHsKIAkJYWRkci5zNl9hZGRyMzJbMF0gPSBodG9ubCgweGZlODAwMDAwKTsKIAkJYWRkci5zNl9hZGRyMzJbMV0gPSAwOwogCkBAIC0xNzI0LDEwICsxNzg2LDEwIEBACiAJCX0KIAl9CiAKLQlzcGluX2xvY2tfYmgoJmlmcC0+c3RhdGVfbG9jayk7CitlcnJkYWQ6CiAJLyogdHJhbnNpdGlvbiBmcm9tIF9QT1NUREFEIHRvIF9FUlJEQUQgKi8KIAlpZnAtPnN0YXRlID0gSU5FVDZfSUZBRERSX1NUQVRFX0VSUkRBRDsKLQlzcGluX3VubG9ja19iaCgmaWZwLT5zdGF0ZV9sb2NrKTsKKwlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKIAogCWFkZHJjb25mX21vZF9kYWRfd29yayhpZnAsIDApOwogfQpAQCAtMjA1Miw3ICsyMTE0LDcgQEAKIAlzdHJ1Y3QgZmliNl90YWJsZSAqdGFibGU7CiAKIAl0YWJsZSA9IGZpYjZfZ2V0X3RhYmxlKGRldl9uZXQoZGV2KSwgUlQ2X1RBQkxFX1BSRUZJWCk7Ci0JaWYgKHRhYmxlID09IE5VTEwpCisJaWYgKCF0YWJsZSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZWFkX2xvY2tfYmgoJnRhYmxlLT50YjZfbG9jayk7CkBAIC0yMTg2LDYgKzIyNDgsNyBAQAogCV9fdTMyIHZhbGlkX2xmdDsKIAlfX3UzMiBwcmVmZXJlZF9sZnQ7CiAJaW50IGFkZHJfdHlwZTsKKwl1MzIgYWRkcl9mbGFncyA9IDA7CiAJc3RydWN0IGluZXQ2X2RldiAqaW42X2RldjsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7CiAKQEAgLTIyMTUsNyArMjI3OCw3IEBACiAKIAlpbjZfZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKIAotCWlmIChpbjZfZGV2ID09IE5VTEwpIHsKKwlpZiAoIWluNl9kZXYpIHsKIAkJbmV0X2RiZ19yYXRlbGltaXRlZCgiYWRkcmNvbmY6IGRldmljZSAlcyBub3QgY29uZmlndXJlZFxuIiwKIAkJCQkgICAgZGV2LT5uYW1lKTsKIAkJcmV0dXJuOwpAQCAtMjI5Miw2ICsyMzU1LDEyIEBACiAJCQkJICAgICAgIGluNl9kZXYtPnRva2VuLnM2X2FkZHIgKyA4LCA4KTsKIAkJCQlyZWFkX3VubG9ja19iaCgmaW42X2Rldi0+bG9jayk7CiAJCQkJdG9rZW5pemVkID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAoaW42X2Rldi0+YWRkcl9nZW5fbW9kZSA9PQorCQkJCSAgIElONl9BRERSX0dFTl9NT0RFX1NUQUJMRV9QUklWQUNZICYmCisJCQkJICAgIWlwdjZfZ2VuZXJhdGVfc3RhYmxlX2FkZHJlc3MoJmFkZHIsIDAsCisJCQkJCQkJCSBpbjZfZGV2KSkgeworCQkJCWFkZHJfZmxhZ3MgfD0gSUZBX0ZfU1RBQkxFX1BSSVZBQ1k7CisJCQkJZ290byBvazsKIAkJCX0gZWxzZSBpZiAoaXB2Nl9nZW5lcmF0ZV9ldWk2NChhZGRyLnM2X2FkZHIgKyA4LCBkZXYpICYmCiAJCQkJICAgaXB2Nl9pbmhlcml0X2V1aTY0KGFkZHIuczZfYWRkciArIDgsIGluNl9kZXYpKSB7CiAJCQkJaW42X2Rldl9wdXQoaW42X2Rldik7CkBAIC0yMzA4LDkgKzIzNzcsOCBAQAogCiAJCWlmcCA9IGlwdjZfZ2V0X2lmYWRkcihuZXQsICZhZGRyLCBkZXYsIDEpOwogCi0JCWlmIChpZnAgPT0gTlVMTCAmJiB2YWxpZF9sZnQpIHsKKwkJaWYgKCFpZnAgJiYgdmFsaWRfbGZ0KSB7CiAJCQlpbnQgbWF4X2FkZHJlc3NlcyA9IGluNl9kZXYtPmNuZi5tYXhfYWRkcmVzc2VzOwotCQkJdTMyIGFkZHJfZmxhZ3MgPSAwOwogCiAjaWZkZWYgQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQKIAkJCWlmIChpbjZfZGV2LT5jbmYub3B0aW1pc3RpY19kYWQgJiYKQEAgLTIzNTAsNyArMjQxOCw3IEBACiAJCQl1MzIgc3RvcmVkX2xmdDsKIAogCQkJLyogdXBkYXRlIGxpZmV0aW1lIChSRkMyNDYyIDUuNS4zIGUpICovCi0JCQlzcGluX2xvY2soJmlmcC0+bG9jayk7CisJCQlzcGluX2xvY2tfYmgoJmlmcC0+bG9jayk7CiAJCQlub3cgPSBqaWZmaWVzOwogCQkJaWYgKGlmcC0+dmFsaWRfbGZ0ID4gKG5vdyAtIGlmcC0+dHN0YW1wKSAvIEhaKQogCQkJCXN0b3JlZF9sZnQgPSBpZnAtPnZhbGlkX2xmdCAtIChub3cgLSBpZnAtPnRzdGFtcCkgLyBIWjsKQEAgLTIzODAsMTIgKzI0NDgsMTIgQEAKIAkJCQlpZnAtPnRzdGFtcCA9IG5vdzsKIAkJCQlmbGFncyA9IGlmcC0+ZmxhZ3M7CiAJCQkJaWZwLT5mbGFncyAmPSB+SUZBX0ZfREVQUkVDQVRFRDsKLQkJCQlzcGluX3VubG9jaygmaWZwLT5sb2NrKTsKKwkJCQlzcGluX3VubG9ja19iaCgmaWZwLT5sb2NrKTsKIAogCQkJCWlmICghKGZsYWdzJklGQV9GX1RFTlRBVElWRSkpCiAJCQkJCWlwdjZfaWZhX25vdGlmeSgwLCBpZnApOwogCQkJfSBlbHNlCi0JCQkJc3Bpbl91bmxvY2soJmlmcC0+bG9jayk7CisJCQkJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CiAKIAkJCW1hbmFnZV90ZW1wYWRkcnMoaW42X2RldiwgaWZwLCB2YWxpZF9sZnQsIHByZWZlcmVkX2xmdCwKIAkJCQkJIGNyZWF0ZSwgbm93KTsKQEAgLTI0MTgsNyArMjQ4Niw3IEBACiAJZGV2ID0gX19kZXZfZ2V0X2J5X2luZGV4KG5ldCwgaXJlcS5pZnI2X2lmaW5kZXgpOwogCiAJZXJyID0gLUVOT0RFVjsKLQlpZiAoZGV2ID09IE5VTEwpCisJaWYgKCFkZXYpCiAJCWdvdG8gZXJyX2V4aXQ7CiAKICNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2X1NJVCkKQEAgLTI0NjQsNiArMjUzMiwyMyBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgaXB2Nl9tY19jb25maWcoc3RydWN0IHNvY2sgKnNrLCBib29sIGpvaW4sCisJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkciwgaW50IGlmaW5kZXgpCit7CisJaW50IHJldDsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlsb2NrX3NvY2soc2spOworCWlmIChqb2luKQorCQlyZXQgPSBpcHY2X3NvY2tfbWNfam9pbihzaywgaWZpbmRleCwgYWRkcik7CisJZWxzZQorCQlyZXQgPSBpcHY2X3NvY2tfbWNfZHJvcChzaywgaWZpbmRleCwgYWRkcik7CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKglNYW51YWwgY29uZmlndXJhdGlvbiBvZiBhZGRyZXNzIG9uIGFuIGludGVyZmFjZQogICovCkBAIC0yNDc2LDEwICsyNTYxLDEwIEBACiAJc3RydWN0IGluZXQ2X2lmYWRkciAqaWZwOwogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJY2xvY2tfdCBleHBpcmVzOwogCWludCBzY29wZTsKIAl1MzIgZmxhZ3M7Ci0JY2xvY2tfdCBleHBpcmVzOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAogCUFTU0VSVF9SVE5MKCk7CiAKQEAgLTI1MDEsNiArMjU4NiwxNCBAQAogCWlmIChJU19FUlIoaWRldikpCiAJCXJldHVybiBQVFJfRVJSKGlkZXYpOwogCisJaWYgKGlmYV9mbGFncyAmIElGQV9GX01DQVVUT0pPSU4pIHsKKwkJaW50IHJldCA9IGlwdjZfbWNfY29uZmlnKG5ldC0+aXB2Ni5tY19hdXRvam9pbl9zaywKKwkJCQkJIHRydWUsIHBmeCwgaWZpbmRleCk7CisKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwogCXNjb3BlID0gaXB2Nl9hZGRyX3Njb3BlKHBmeCk7CiAKIAl0aW1lb3V0ID0gYWRkcmNvbmZfdGltZW91dF9maXh1cCh2YWxpZF9sZnQsIEhaKTsKQEAgLTI1NDIsNiArMjYzNSw5IEBACiAJCWluNl9pZmFfcHV0KGlmcCk7CiAJCWFkZHJjb25mX3ZlcmlmeV9ydG5sKCk7CiAJCXJldHVybiAwOworCX0gZWxzZSBpZiAoaWZhX2ZsYWdzICYgSUZBX0ZfTUNBVVRPSk9JTikgeworCQlpcHY2X21jX2NvbmZpZyhuZXQtPmlwdjYubWNfYXV0b2pvaW5fc2ssCisJCQkgICAgICAgZmFsc2UsIHBmeCwgaWZpbmRleCk7CiAJfQogCiAJcmV0dXJuIFBUUl9FUlIoaWZwKTsKQEAgLTI1NjIsNyArMjY1OCw3IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJaWRldiA9IF9faW42X2Rldl9nZXQoZGV2KTsKLQlpZiAoaWRldiA9PSBOVUxMKQorCWlmICghaWRldikKIAkJcmV0dXJuIC1FTlhJTzsKIAogCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7CkBAIC0yNTc4LDYgKzI2NzQsMTAgQEAKIAkJCQkJCSBqaWZmaWVzKTsKIAkJCWlwdjZfZGVsX2FkZHIoaWZwKTsKIAkJCWFkZHJjb25mX3ZlcmlmeV9ydG5sKCk7CisJCQlpZiAoaXB2Nl9hZGRyX2lzX211bHRpY2FzdChwZngpKSB7CisJCQkJaXB2Nl9tY19jb25maWcobmV0LT5pcHY2Lm1jX2F1dG9qb2luX3NrLAorCQkJCQkgICAgICAgZmFsc2UsIHBmeCwgZGV2LT5pZmluZGV4KTsKKwkJCX0KIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtMjcxMCw3ICsyODEwLDcgQEAKIAlBU1NFUlRfUlROTCgpOwogCiAJaWRldiA9IGlwdjZfZmluZF9pZGV2KGRldik7Ci0JaWYgKGlkZXYgPT0gTlVMTCkgeworCWlmICghaWRldikgewogCQlwcl9kZWJ1ZygiJXM6IGFkZF9kZXYgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CkBAIC0yNzU3LDEwICsyODU3LDExIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhZGRyY29uZl9hZGRfbGlua2xvY2FsKHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYsIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcikKK3N0YXRpYyB2b2lkIGFkZHJjb25mX2FkZF9saW5rbG9jYWwoc3RydWN0IGluZXQ2X2RldiAqaWRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZnA7Ci0JdTMyIGFkZHJfZmxhZ3MgPSBJRkFfRl9QRVJNQU5FTlQ7CisJdTMyIGFkZHJfZmxhZ3MgPSBmbGFncyB8IElGQV9GX1BFUk1BTkVOVDsKIAogI2lmZGVmIENPTkZJR19JUFY2X09QVElNSVNUSUNfREFECiAJaWYgKGlkZXYtPmNuZi5vcHRpbWlzdGljX2RhZCAmJgpAQCAtMjc2OCw3ICsyODY5LDYgQEAKIAkJYWRkcl9mbGFncyB8PSBJRkFfRl9PUFRJTUlTVElDOwogI2VuZGlmCiAKLQogCWlmcCA9IGlwdjZfYWRkX2FkZHIoaWRldiwgYWRkciwgTlVMTCwgNjQsIElGQV9MSU5LLCBhZGRyX2ZsYWdzLAogCQkJICAgIElORklOSVRZX0xJRkVfVElNRSwgSU5GSU5JVFlfTElGRV9USU1FKTsKIAlpZiAoIUlTX0VSUihpZnApKSB7CkBAIC0yNzc4LDE4ICsyODc4LDEwMyBAQAogCX0KIH0KIAorc3RhdGljIGJvb2wgaXB2Nl9yZXNlcnZlZF9pbnRlcmZhY2VpZChzdHJ1Y3QgaW42X2FkZHIgYWRkcmVzcykKK3sKKwlpZiAoKGFkZHJlc3MuczZfYWRkcjMyWzJdIHwgYWRkcmVzcy5zNl9hZGRyMzJbM10pID09IDApCisJCXJldHVybiB0cnVlOworCisJaWYgKGFkZHJlc3MuczZfYWRkcjMyWzJdID09IGh0b25sKDB4MDIwMDVlZmYpICYmCisJICAgICgoYWRkcmVzcy5zNl9hZGRyMzJbM10gJiBodG9ubCgweGZlMDAwMDAwKSkgPT0gaHRvbmwoMHhmZTAwMDAwMCkpKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChhZGRyZXNzLnM2X2FkZHIzMlsyXSA9PSBodG9ubCgweGZkZmZmZmZmKSAmJgorCSAgICAoKGFkZHJlc3MuczZfYWRkcjMyWzNdICYgaHRvbmwoMHhmZmZmZmY4MCkpID09IGh0b25sKDB4ZmZmZmZmODApKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgaXB2Nl9nZW5lcmF0ZV9zdGFibGVfYWRkcmVzcyhzdHJ1Y3QgaW42X2FkZHIgKmFkZHJlc3MsCisJCQkJCXU4IGRhZF9jb3VudCwKKwkJCQkJY29uc3Qgc3RydWN0IGluZXQ2X2RldiAqaWRldikKK3sKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOworCXN0YXRpYyBfX3UzMiBkaWdlc3RbU0hBX0RJR0VTVF9XT1JEU107CisJc3RhdGljIF9fdTMyIHdvcmtzcGFjZVtTSEFfV09SS1NQQUNFX1dPUkRTXTsKKworCXN0YXRpYyB1bmlvbiB7CisJCWNoYXIgX19kYXRhW1NIQV9NRVNTQUdFX0JZVEVTXTsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBpbjZfYWRkciBzZWNyZXQ7CisJCQlfX2JlMzIgcHJlZml4WzJdOworCQkJdW5zaWduZWQgY2hhciBod2FkZHJbTUFYX0FERFJfTEVOXTsKKwkJCXU4IGRhZF9jb3VudDsKKwkJfSBfX3BhY2tlZDsKKwl9IGRhdGE7CisKKwlzdHJ1Y3QgaW42X2FkZHIgc2VjcmV0OworCXN0cnVjdCBpbjZfYWRkciB0ZW1wOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoaWRldi0+ZGV2KTsKKworCUJVSUxEX0JVR19PTihzaXplb2YoZGF0YS5fX2RhdGEpICE9IHNpemVvZihkYXRhKSk7CisKKwlpZiAoaWRldi0+Y25mLnN0YWJsZV9zZWNyZXQuaW5pdGlhbGl6ZWQpCisJCXNlY3JldCA9IGlkZXYtPmNuZi5zdGFibGVfc2VjcmV0LnNlY3JldDsKKwllbHNlIGlmIChuZXQtPmlwdjYuZGV2Y29uZl9kZmx0LT5zdGFibGVfc2VjcmV0LmluaXRpYWxpemVkKQorCQlzZWNyZXQgPSBuZXQtPmlwdjYuZGV2Y29uZl9kZmx0LT5zdGFibGVfc2VjcmV0LnNlY3JldDsKKwllbHNlCisJCXJldHVybiAtMTsKKworcmV0cnk6CisJc3Bpbl9sb2NrX2JoKCZsb2NrKTsKKworCXNoYV9pbml0KGRpZ2VzdCk7CisJbWVtc2V0KCZkYXRhLCAwLCBzaXplb2YoZGF0YSkpOworCW1lbXNldCh3b3Jrc3BhY2UsIDAsIHNpemVvZih3b3Jrc3BhY2UpKTsKKwltZW1jcHkoZGF0YS5od2FkZHIsIGlkZXYtPmRldi0+cGVybV9hZGRyLCBpZGV2LT5kZXYtPmFkZHJfbGVuKTsKKwlkYXRhLnByZWZpeFswXSA9IGFkZHJlc3MtPnM2X2FkZHIzMlswXTsKKwlkYXRhLnByZWZpeFsxXSA9IGFkZHJlc3MtPnM2X2FkZHIzMlsxXTsKKwlkYXRhLnNlY3JldCA9IHNlY3JldDsKKwlkYXRhLmRhZF9jb3VudCA9IGRhZF9jb3VudDsKKworCXNoYV90cmFuc2Zvcm0oZGlnZXN0LCBkYXRhLl9fZGF0YSwgd29ya3NwYWNlKTsKKworCXRlbXAgPSAqYWRkcmVzczsKKwl0ZW1wLnM2X2FkZHIzMlsyXSA9IChfX2ZvcmNlIF9fYmUzMilkaWdlc3RbMF07CisJdGVtcC5zNl9hZGRyMzJbM10gPSAoX19mb3JjZSBfX2JlMzIpZGlnZXN0WzFdOworCisJc3Bpbl91bmxvY2tfYmgoJmxvY2spOworCisJaWYgKGlwdjZfcmVzZXJ2ZWRfaW50ZXJmYWNlaWQodGVtcCkpIHsKKwkJZGFkX2NvdW50Kys7CisJCWlmIChkYWRfY291bnQgPiBkZXZfbmV0KGlkZXYtPmRldiktPmlwdjYuc3lzY3RsLmlkZ2VuX3JldHJpZXMpCisJCQlyZXR1cm4gLTE7CisJCWdvdG8gcmV0cnk7CisJfQorCisJKmFkZHJlc3MgPSB0ZW1wOworCXJldHVybiAwOworfQorCiBzdGF0aWMgdm9pZCBhZGRyY29uZl9hZGRyX2dlbihzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LCBib29sIHByZWZpeF9yb3V0ZSkKIHsKLQlpZiAoaWRldi0+YWRkcl9nZW5fbW9kZSA9PSBJTjZfQUREUl9HRU5fTU9ERV9FVUk2NCkgewotCQlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKKwlzdHJ1Y3QgaW42X2FkZHIgYWRkcjsKIAotCQlpcHY2X2FkZHJfc2V0KCZhZGRyLCAgaHRvbmwoMHhGRTgwMDAwMCksIDAsIDAsIDApOworCWlwdjZfYWRkcl9zZXQoJmFkZHIsIGh0b25sKDB4RkU4MDAwMDApLCAwLCAwLCAwKTsKKworCWlmIChpZGV2LT5hZGRyX2dlbl9tb2RlID09IElONl9BRERSX0dFTl9NT0RFX1NUQUJMRV9QUklWQUNZKSB7CisJCWlmICghaXB2Nl9nZW5lcmF0ZV9zdGFibGVfYWRkcmVzcygmYWRkciwgMCwgaWRldikpCisJCQlhZGRyY29uZl9hZGRfbGlua2xvY2FsKGlkZXYsICZhZGRyLAorCQkJCQkgICAgICAgSUZBX0ZfU1RBQkxFX1BSSVZBQ1kpOworCQllbHNlIGlmIChwcmVmaXhfcm91dGUpCisJCQlhZGRyY29uZl9wcmVmaXhfcm91dGUoJmFkZHIsIDY0LCBpZGV2LT5kZXYsIDAsIDApOworCX0gZWxzZSBpZiAoaWRldi0+YWRkcl9nZW5fbW9kZSA9PSBJTjZfQUREUl9HRU5fTU9ERV9FVUk2NCkgewogCQkvKiBhZGRyY29uZl9hZGRfbGlua2xvY2FsIGFsc28gYWRkcyBhIHByZWZpeF9yb3V0ZSBhbmQgd2UKIAkJICogb25seSBuZWVkIHRvIGNhcmUgYWJvdXQgcHJlZml4IHJvdXRlcyBpZiBpcHY2X2dlbmVyYXRlX2V1aTY0CiAJCSAqIGNvdWxkbid0IGdlbmVyYXRlIG9uZS4KIAkJICovCiAJCWlmIChpcHY2X2dlbmVyYXRlX2V1aTY0KGFkZHIuczZfYWRkciArIDgsIGlkZXYtPmRldikgPT0gMCkKLQkJCWFkZHJjb25mX2FkZF9saW5rbG9jYWwoaWRldiwgJmFkZHIpOworCQkJYWRkcmNvbmZfYWRkX2xpbmtsb2NhbChpZGV2LCAmYWRkciwgMCk7CiAJCWVsc2UgaWYgKHByZWZpeF9yb3V0ZSkKIAkJCWFkZHJjb25mX3ByZWZpeF9yb3V0ZSgmYWRkciwgNjQsIGlkZXYtPmRldiwgMCwgMCk7CiAJfQpAQCAtMjgzNCw3ICszMDE5LDcgQEAKIAkgKi8KIAogCWlkZXYgPSBpcHY2X2ZpbmRfaWRldihkZXYpOwotCWlmIChpZGV2ID09IE5VTEwpIHsKKwlpZiAoIWlkZXYpIHsKIAkJcHJfZGVidWcoIiVzOiBhZGRfZGV2IGZhaWxlZFxuIiwgX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQpAQCAtMjg1OSw3ICszMDQ0LDcgQEAKIAlBU1NFUlRfUlROTCgpOwogCiAJaWRldiA9IGlwdjZfZmluZF9pZGV2KGRldik7Ci0JaWYgKGlkZXYgPT0gTlVMTCkgeworCWlmICghaWRldikgewogCQlwcl9kZWJ1ZygiJXM6IGFkZF9kZXYgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CkBAIC0zMDU2LDcgKzMyNDEsNyBAQAogCW5laWdoX2lmZG93bigmbmRfdGJsLCBkZXYpOwogCiAJaWRldiA9IF9faW42X2Rldl9nZXQoZGV2KTsKLQlpZiAoaWRldiA9PSBOVUxMKQorCWlmICghaWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKgpAQCAtMzEyNywxMCArMzMxMiwxMCBAQAogCiAJCXdyaXRlX3VubG9ja19iaCgmaWRldi0+bG9jayk7CiAKLQkJc3Bpbl9sb2NrX2JoKCZpZmEtPnN0YXRlX2xvY2spOworCQlzcGluX2xvY2tfYmgoJmlmYS0+bG9jayk7CiAJCXN0YXRlID0gaWZhLT5zdGF0ZTsKIAkJaWZhLT5zdGF0ZSA9IElORVQ2X0lGQUREUl9TVEFURV9ERUFEOwotCQlzcGluX3VubG9ja19iaCgmaWZhLT5zdGF0ZV9sb2NrKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlmYS0+bG9jayk7CiAKIAkJaWYgKHN0YXRlICE9IElORVQ2X0lGQUREUl9TVEFURV9ERUFEKSB7CiAJCQlfX2lwdjZfaWZhX25vdGlmeShSVE1fREVMQUREUiwgaWZhKTsKQEAgLTMyODgsMTIgKzM0NzMsMTIgQEAKIHsKIAlib29sIGJlZ2luX2RhZCA9IGZhbHNlOwogCi0Jc3Bpbl9sb2NrX2JoKCZpZnAtPnN0YXRlX2xvY2spOworCXNwaW5fbG9ja19iaCgmaWZwLT5sb2NrKTsKIAlpZiAoaWZwLT5zdGF0ZSAhPSBJTkVUNl9JRkFERFJfU1RBVEVfREVBRCkgewogCQlpZnAtPnN0YXRlID0gSU5FVDZfSUZBRERSX1NUQVRFX1BSRURBRDsKIAkJYmVnaW5fZGFkID0gdHJ1ZTsKIAl9Ci0Jc3Bpbl91bmxvY2tfYmgoJmlmcC0+c3RhdGVfbG9jayk7CisJc3Bpbl91bmxvY2tfYmgoJmlmcC0+bG9jayk7CiAKIAlpZiAoYmVnaW5fZGFkKQogCQlhZGRyY29uZl9tb2RfZGFkX3dvcmsoaWZwLCAwKTsKQEAgLTMzMTUsNyArMzUwMCw3IEBACiAKIAlydG5sX2xvY2soKTsKIAotCXNwaW5fbG9ja19iaCgmaWZwLT5zdGF0ZV9sb2NrKTsKKwlzcGluX2xvY2tfYmgoJmlmcC0+bG9jayk7CiAJaWYgKGlmcC0+c3RhdGUgPT0gSU5FVDZfSUZBRERSX1NUQVRFX1BSRURBRCkgewogCQlhY3Rpb24gPSBEQURfQkVHSU47CiAJCWlmcC0+c3RhdGUgPSBJTkVUNl9JRkFERFJfU1RBVEVfREFEOwpAQCAtMzMyMyw3ICszNTA4LDcgQEAKIAkJYWN0aW9uID0gREFEX0FCT1JUOwogCQlpZnAtPnN0YXRlID0gSU5FVDZfSUZBRERSX1NUQVRFX1BPU1REQUQ7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZpZnAtPnN0YXRlX2xvY2spOworCXNwaW5fdW5sb2NrX2JoKCZpZnAtPmxvY2spOwogCiAJaWYgKGFjdGlvbiA9PSBEQURfQkVHSU4pIHsKIAkJYWRkcmNvbmZfZGFkX2JlZ2luKGlmcCk7CkBAIC0zODExLDcgKzM5OTYsNyBAQAogCiAJaWZtID0gbmxtc2dfZGF0YShubGgpOwogCXBmeCA9IGV4dHJhY3RfYWRkcih0YltJRkFfQUREUkVTU10sIHRiW0lGQV9MT0NBTF0sICZwZWVyX3BmeCk7Ci0JaWYgKHBmeCA9PSBOVUxMKQorCWlmICghcGZ4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmYV9mbGFncyA9IHRiW0lGQV9GTEFHU10gPyBubGFfZ2V0X3UzMih0YltJRkFfRkxBR1NdKSA6IGlmbS0+aWZhX2ZsYWdzOwpAQCAtMzkyMyw3ICs0MTA4LDcgQEAKIAogCWlmbSA9IG5sbXNnX2RhdGEobmxoKTsKIAlwZnggPSBleHRyYWN0X2FkZHIodGJbSUZBX0FERFJFU1NdLCB0YltJRkFfTE9DQUxdLCAmcGVlcl9wZngpOwotCWlmIChwZnggPT0gTlVMTCkKKwlpZiAoIXBmeCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAodGJbSUZBX0NBQ0hFSU5GT10pIHsKQEAgLTM5MzgsMTcgKzQxMjMsMTcgQEAKIAl9CiAKIAlkZXYgPSAgX19kZXZfZ2V0X2J5X2luZGV4KG5ldCwgaWZtLT5pZmFfaW5kZXgpOwotCWlmIChkZXYgPT0gTlVMTCkKKwlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAlpZmFfZmxhZ3MgPSB0YltJRkFfRkxBR1NdID8gbmxhX2dldF91MzIodGJbSUZBX0ZMQUdTXSkgOiBpZm0tPmlmYV9mbGFnczsKIAogCS8qIFdlIGlnbm9yZSBvdGhlciBmbGFncyBzbyBmYXIuICovCiAJaWZhX2ZsYWdzICY9IElGQV9GX05PREFEIHwgSUZBX0ZfSE9NRUFERFJFU1MgfCBJRkFfRl9NQU5BR0VURU1QQUREUiB8Ci0JCSAgICAgSUZBX0ZfTk9QUkVGSVhST1VURTsKKwkJICAgICBJRkFfRl9OT1BSRUZJWFJPVVRFIHwgSUZBX0ZfTUNBVVRPSk9JTjsKIAogCWlmYSA9IGlwdjZfZ2V0X2lmYWRkcihuZXQsIHBmeCwgZGV2LCAxKTsKLQlpZiAoaWZhID09IE5VTEwpIHsKKwlpZiAoIWlmYSkgewogCQkvKgogCQkgKiBJdCB3b3VsZCBiZSBiZXN0IHRvIGNoZWNrIGZvciAhTkxNX0ZfQ1JFQVRFIGhlcmUgYnV0CiAJCSAqIHVzZXJzcGFjZSBhbHJlYWR5IHJlbGllcyBvbiBub3QgaGF2aW5nIHRvIHByb3ZpZGUgdGhpcy4KQEAgLTQwMjMsNyArNDIwOCw3IEBACiAJdTMyIHByZWZlcnJlZCwgdmFsaWQ7CiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSwgZmxhZ3MpOwotCWlmIChubGggPT0gTlVMTCkKKwlpZiAoIW5saCkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAogCXB1dF9pZmFkZHJtc2cobmxoLCBpZmEtPnByZWZpeF9sZW4sIGlmYS0+ZmxhZ3MsIHJ0X3Njb3BlKGlmYS0+c2NvcGUpLApAQCAtNDA1MiwxMSArNDIzNywxMSBAQAogCX0KIAogCWlmICghaXB2Nl9hZGRyX2FueSgmaWZhLT5wZWVyX2FkZHIpKSB7Ci0JCWlmIChubGFfcHV0KHNrYiwgSUZBX0xPQ0FMLCAxNiwgJmlmYS0+YWRkcikgPCAwIHx8Ci0JCSAgICBubGFfcHV0KHNrYiwgSUZBX0FERFJFU1MsIDE2LCAmaWZhLT5wZWVyX2FkZHIpIDwgMCkKKwkJaWYgKG5sYV9wdXRfaW42X2FkZHIoc2tiLCBJRkFfTE9DQUwsICZpZmEtPmFkZHIpIDwgMCB8fAorCQkgICAgbmxhX3B1dF9pbjZfYWRkcihza2IsIElGQV9BRERSRVNTLCAmaWZhLT5wZWVyX2FkZHIpIDwgMCkKIAkJCWdvdG8gZXJyb3I7CiAJfSBlbHNlCi0JCWlmIChubGFfcHV0KHNrYiwgSUZBX0FERFJFU1MsIDE2LCAmaWZhLT5hZGRyKSA8IDApCisJCWlmIChubGFfcHV0X2luNl9hZGRyKHNrYiwgSUZBX0FERFJFU1MsICZpZmEtPmFkZHIpIDwgMCkKIAkJCWdvdG8gZXJyb3I7CiAKIAlpZiAocHV0X2NhY2hlaW5mbyhza2IsIGlmYS0+Y3N0YW1wLCBpZmEtPnRzdGFtcCwgcHJlZmVycmVkLCB2YWxpZCkgPCAwKQpAQCAtNDA4NCwxMSArNDI2OSwxMSBAQAogCQlzY29wZSA9IFJUX1NDT1BFX1NJVEU7CiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgZXZlbnQsIHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSwgZmxhZ3MpOwotCWlmIChubGggPT0gTlVMTCkKKwlpZiAoIW5saCkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAogCXB1dF9pZmFkZHJtc2cobmxoLCAxMjgsIElGQV9GX1BFUk1BTkVOVCwgc2NvcGUsIGlmaW5kZXgpOwotCWlmIChubGFfcHV0KHNrYiwgSUZBX01VTFRJQ0FTVCwgMTYsICZpZm1jYS0+bWNhX2FkZHIpIDwgMCB8fAorCWlmIChubGFfcHV0X2luNl9hZGRyKHNrYiwgSUZBX01VTFRJQ0FTVCwgJmlmbWNhLT5tY2FfYWRkcikgPCAwIHx8CiAJICAgIHB1dF9jYWNoZWluZm8oc2tiLCBpZm1jYS0+bWNhX2NzdGFtcCwgaWZtY2EtPm1jYV90c3RhbXAsCiAJCQkgIElORklOSVRZX0xJRkVfVElNRSwgSU5GSU5JVFlfTElGRV9USU1FKSA8IDApIHsKIAkJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKQEAgLTQxMTAsMTEgKzQyOTUsMTEgQEAKIAkJc2NvcGUgPSBSVF9TQ09QRV9TSVRFOwogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIGV2ZW50LCBzaXplb2Yoc3RydWN0IGlmYWRkcm1zZyksIGZsYWdzKTsKLQlpZiAobmxoID09IE5VTEwpCisJaWYgKCFubGgpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlwdXRfaWZhZGRybXNnKG5saCwgMTI4LCBJRkFfRl9QRVJNQU5FTlQsIHNjb3BlLCBpZmluZGV4KTsKLQlpZiAobmxhX3B1dChza2IsIElGQV9BTllDQVNULCAxNiwgJmlmYWNhLT5hY2FfYWRkcikgPCAwIHx8CisJaWYgKG5sYV9wdXRfaW42X2FkZHIoc2tiLCBJRkFfQU5ZQ0FTVCwgJmlmYWNhLT5hY2FfYWRkcikgPCAwIHx8CiAJICAgIHB1dF9jYWNoZWluZm8oc2tiLCBpZmFjYS0+YWNhX2NzdGFtcCwgaWZhY2EtPmFjYV90c3RhbXAsCiAJCQkgIElORklOSVRZX0xJRkVfVElNRSwgSU5GSU5JVFlfTElGRV9USU1FKSA8IDApIHsKIAkJbmxtc2dfY2FuY2VsKHNrYiwgbmxoKTsKQEAgLTQyODMsNyArNDQ2OCw3IEBACiAJCWdvdG8gZXJyb3V0OwogCiAJYWRkciA9IGV4dHJhY3RfYWRkcih0YltJRkFfQUREUkVTU10sIHRiW0lGQV9MT0NBTF0sICZwZWVyKTsKLQlpZiAoYWRkciA9PSBOVUxMKSB7CisJaWYgKCFhZGRyKSB7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXJyb3V0OwogCX0KQEAgLTQzMjYsNyArNDUxMSw3IEBACiAJaW50IGVyciA9IC1FTk9CVUZTOwogCiAJc2tiID0gbmxtc2dfbmV3KGluZXQ2X2lmYWRkcl9tc2dzaXplKCksIEdGUF9BVE9NSUMpOwotCWlmIChza2IgPT0gTlVMTCkKKwlpZiAoIXNrYikKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0Nl9maWxsX2lmYWRkcihza2IsIGlmYSwgMCwgMCwgZXZlbnQsIDApOwpAQCAtNDM5OCw2ICs0NTgzLDcgQEAKIAlhcnJheVtERVZDT05GX1NVUFBSRVNTX0ZSQUdfTkRJU0NdID0gY25mLT5zdXBwcmVzc19mcmFnX25kaXNjOwogCWFycmF5W0RFVkNPTkZfQUNDRVBUX1JBX0ZST01fTE9DQUxdID0gY25mLT5hY2NlcHRfcmFfZnJvbV9sb2NhbDsKIAlhcnJheVtERVZDT05GX0FDQ0VQVF9SQV9NVFVdID0gY25mLT5hY2NlcHRfcmFfbXR1OworCS8qIHdlIG9taXQgREVWQ09ORl9TVEFCTEVfU0VDUkVUIGZvciBub3cgKi8KIH0KIAogc3RhdGljIGlubGluZSBzaXplX3QgaW5ldDZfaWZsYTZfc2l6ZSh2b2lkKQpAQCAtNDQ3OCwyNCArNDY2NCwyNCBAQAogCWlmIChubGFfcHV0KHNrYiwgSUZMQV9JTkVUNl9DQUNIRUlORk8sIHNpemVvZihjaSksICZjaSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCW5sYSA9IG5sYV9yZXNlcnZlKHNrYiwgSUZMQV9JTkVUNl9DT05GLCBERVZDT05GX01BWCAqIHNpemVvZihzMzIpKTsKLQlpZiAobmxhID09IE5VTEwpCisJaWYgKCFubGEpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCWlwdjZfc3RvcmVfZGV2Y29uZigmaWRldi0+Y25mLCBubGFfZGF0YShubGEpLCBubGFfbGVuKG5sYSkpOwogCiAJLyogWFhYIC0gTUMgbm90IGltcGxlbWVudGVkICovCiAKIAlubGEgPSBubGFfcmVzZXJ2ZShza2IsIElGTEFfSU5FVDZfU1RBVFMsIElQU1RBVFNfTUlCX01BWCAqIHNpemVvZih1NjQpKTsKLQlpZiAobmxhID09IE5VTEwpCisJaWYgKCFubGEpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCXNubXA2X2ZpbGxfc3RhdHMobmxhX2RhdGEobmxhKSwgaWRldiwgSUZMQV9JTkVUNl9TVEFUUywgbmxhX2xlbihubGEpKTsKIAogCW5sYSA9IG5sYV9yZXNlcnZlKHNrYiwgSUZMQV9JTkVUNl9JQ01QNlNUQVRTLCBJQ01QNl9NSUJfTUFYICogc2l6ZW9mKHU2NCkpOwotCWlmIChubGEgPT0gTlVMTCkKKwlpZiAoIW5sYSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJc25tcDZfZmlsbF9zdGF0cyhubGFfZGF0YShubGEpLCBpZGV2LCBJRkxBX0lORVQ2X0lDTVA2U1RBVFMsIG5sYV9sZW4obmxhKSk7CiAKIAlubGEgPSBubGFfcmVzZXJ2ZShza2IsIElGTEFfSU5FVDZfVE9LRU4sIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKLQlpZiAobmxhID09IE5VTEwpCisJaWYgKCFubGEpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJaWYgKG5sYV9wdXRfdTgoc2tiLCBJRkxBX0lORVQ2X0FERFJfR0VOX01PREUsIGlkZXYtPmFkZHJfZ2VuX21vZGUpKQpAQCAtNDU0MSw3ICs0NzI3LDcgQEAKIAogCUFTU0VSVF9SVE5MKCk7CiAKLQlpZiAodG9rZW4gPT0gTlVMTCkKKwlpZiAoIXRva2VuKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoaXB2Nl9hZGRyX2FueSh0b2tlbikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNDYzMiw4ICs0ODE4LDE1IEBACiAJCXU4IG1vZGUgPSBubGFfZ2V0X3U4KHRiW0lGTEFfSU5FVDZfQUREUl9HRU5fTU9ERV0pOwogCiAJCWlmIChtb2RlICE9IElONl9BRERSX0dFTl9NT0RFX0VVSTY0ICYmCi0JCSAgICBtb2RlICE9IElONl9BRERSX0dFTl9NT0RFX05PTkUpCisJCSAgICBtb2RlICE9IElONl9BRERSX0dFTl9NT0RFX05PTkUgJiYKKwkJICAgIG1vZGUgIT0gSU42X0FERFJfR0VOX01PREVfU1RBQkxFX1BSSVZBQ1kpCiAJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAobW9kZSA9PSBJTjZfQUREUl9HRU5fTU9ERV9TVEFCTEVfUFJJVkFDWSAmJgorCQkgICAgIWlkZXYtPmNuZi5zdGFibGVfc2VjcmV0LmluaXRpYWxpemVkICYmCisJCSAgICAhZGV2X25ldChkZXYpLT5pcHY2LmRldmNvbmZfZGZsdC0+c3RhYmxlX3NlY3JldC5pbml0aWFsaXplZCkKKwkJCXJldHVybiAtRUlOVkFMOworCiAJCWlkZXYtPmFkZHJfZ2VuX21vZGUgPSBtb2RlOwogCQllcnIgPSAwOwogCX0KQEAgLTQ2NTAsNyArNDg0Myw3IEBACiAJdm9pZCAqcHJvdG9pbmZvOwogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKmhkciksIGZsYWdzKTsKLQlpZiAobmxoID09IE5VTEwpCisJaWYgKCFubGgpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKIAloZHIgPSBubG1zZ19kYXRhKG5saCk7CkBAIC00NjY1LDExICs0ODU4LDExIEBACiAJICAgIChkZXYtPmFkZHJfbGVuICYmCiAJICAgICBubGFfcHV0KHNrYiwgSUZMQV9BRERSRVNTLCBkZXYtPmFkZHJfbGVuLCBkZXYtPmRldl9hZGRyKSkgfHwKIAkgICAgbmxhX3B1dF91MzIoc2tiLCBJRkxBX01UVSwgZGV2LT5tdHUpIHx8Ci0JICAgIChkZXYtPmlmaW5kZXggIT0gZGV2LT5pZmxpbmsgJiYKLQkgICAgIG5sYV9wdXRfdTMyKHNrYiwgSUZMQV9MSU5LLCBkZXYtPmlmbGluaykpKQorCSAgICAoZGV2LT5pZmluZGV4ICE9IGRldl9nZXRfaWZsaW5rKGRldikgJiYKKwkgICAgIG5sYV9wdXRfdTMyKHNrYiwgSUZMQV9MSU5LLCBkZXZfZ2V0X2lmbGluayhkZXYpKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCXByb3RvaW5mbyA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgSUZMQV9QUk9USU5GTyk7Ci0JaWYgKHByb3RvaW5mbyA9PSBOVUxMKQorCWlmICghcHJvdG9pbmZvKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCWlmIChpbmV0Nl9maWxsX2lmbGE2X2F0dHJzKHNrYiwgaWRldikgPCAwKQpAQCAtNDczMCw3ICs0OTIzLDcgQEAKIAlpbnQgZXJyID0gLUVOT0JVRlM7CiAKIAlza2IgPSBubG1zZ19uZXcoaW5ldDZfaWZfbmxtc2dfc2l6ZSgpLCBHRlBfQVRPTUlDKTsKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCWdvdG8gZXJyb3V0OwogCiAJZXJyID0gaW5ldDZfZmlsbF9pZmluZm8oc2tiLCBpZGV2LCAwLCAwLCBldmVudCwgMCk7CkBAIC00NzYzLDcgKzQ5NTYsNyBAQAogCXN0cnVjdCBwcmVmaXhfY2FjaGVpbmZvCWNpOwogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKnBtc2cpLCBmbGFncyk7Ci0JaWYgKG5saCA9PSBOVUxMKQorCWlmICghbmxoKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJcG1zZyA9IG5sbXNnX2RhdGEobmxoKTsKQEAgLTQ4MDIsNyArNDk5NSw3IEBACiAJaW50IGVyciA9IC1FTk9CVUZTOwogCiAJc2tiID0gbmxtc2dfbmV3KGluZXQ2X3ByZWZpeF9ubG1zZ19zaXplKCksIEdGUF9BVE9NSUMpOwotCWlmIChza2IgPT0gTlVMTCkKKwlpZiAoIXNrYikKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBpbmV0Nl9maWxsX3ByZWZpeChza2IsIGlkZXYsIHBpbmZvLCAwLCAwLCBldmVudCwgMCk7CkBAIC01MDQyLDYgKzUyMzUsNzQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGFkZHJjb25mX3N5c2N0bF9zdGFibGVfc2VjcmV0KHN0cnVjdCBjdGxfdGFibGUgKmN0bCwgaW50IHdyaXRlLAorCQkJCQkgdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLAorCQkJCQkgbG9mZl90ICpwcG9zKQoreworCWludCBlcnI7CisJc3RydWN0IGluNl9hZGRyIGFkZHI7CisJY2hhciBzdHJbSVBWNl9NQVhfU1RSTEVOXTsKKwlzdHJ1Y3QgY3RsX3RhYmxlIGxjdGwgPSAqY3RsOworCXN0cnVjdCBuZXQgKm5ldCA9IGN0bC0+ZXh0cmEyOworCXN0cnVjdCBpcHY2X3N0YWJsZV9zZWNyZXQgKnNlY3JldCA9IGN0bC0+ZGF0YTsKKworCWlmICgmbmV0LT5pcHY2LmRldmNvbmZfYWxsLT5zdGFibGVfc2VjcmV0ID09IGN0bC0+ZGF0YSkKKwkJcmV0dXJuIC1FSU87CisKKwlsY3RsLm1heGxlbiA9IElQVjZfTUFYX1NUUkxFTjsKKwlsY3RsLmRhdGEgPSBzdHI7CisKKwlpZiAoIXJ0bmxfdHJ5bG9jaygpKQorCQlyZXR1cm4gcmVzdGFydF9zeXNjYWxsKCk7CisKKwlpZiAoIXdyaXRlICYmICFzZWNyZXQtPmluaXRpYWxpemVkKSB7CisJCWVyciA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCWlmICghd3JpdGUpIHsKKwkJZXJyID0gc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiVwSTYiLAorCQkJICAgICAgICZzZWNyZXQtPnNlY3JldCk7CisJCWlmIChlcnIgPj0gc2l6ZW9mKHN0cikpIHsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCWVyciA9IHByb2NfZG9zdHJpbmcoJmxjdGwsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWlmIChlcnIgfHwgIXdyaXRlKQorCQlnb3RvIG91dDsKKworCWlmIChpbjZfcHRvbihzdHIsIC0xLCBhZGRyLmluNl91LnU2X2FkZHI4LCAtMSwgTlVMTCkgIT0gMSkgeworCQllcnIgPSAtRUlPOworCQlnb3RvIG91dDsKKwl9CisKKwlzZWNyZXQtPmluaXRpYWxpemVkID0gdHJ1ZTsKKwlzZWNyZXQtPnNlY3JldCA9IGFkZHI7CisKKwlpZiAoJm5ldC0+aXB2Ni5kZXZjb25mX2RmbHQtPnN0YWJsZV9zZWNyZXQgPT0gY3RsLT5kYXRhKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwkJZm9yX2VhY2hfbmV0ZGV2KG5ldCwgZGV2KSB7CisJCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gX19pbjZfZGV2X2dldChkZXYpOworCisJCQlpZiAoaWRldikgeworCQkJCWlkZXYtPmFkZHJfZ2VuX21vZGUgPQorCQkJCQlJTjZfQUREUl9HRU5fTU9ERV9TVEFCTEVfUFJJVkFDWTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYgPSBjdGwtPmV4dHJhMTsKKworCQlpZGV2LT5hZGRyX2dlbl9tb2RlID0gSU42X0FERFJfR0VOX01PREVfU1RBQkxFX1BSSVZBQ1k7CisJfQorCitvdXQ6CisJcnRubF91bmxvY2soKTsKKworCXJldHVybiBlcnI7Cit9CiAKIHN0YXRpYyBzdHJ1Y3QgYWRkcmNvbmZfc3lzY3RsX3RhYmxlCiB7CkBAIC01MzE1LDYgKzU1NzYsMTMgQEAKIAkJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCQl9LAogCQl7CisJCQkucHJvY25hbWUJPSAic3RhYmxlX3NlY3JldCIsCisJCQkuZGF0YQkJPSAmaXB2Nl9kZXZjb25mLnN0YWJsZV9zZWNyZXQsCisJCQkubWF4bGVuCQk9IElQVjZfTUFYX1NUUkxFTiwKKwkJCS5tb2RlCQk9IDA2MDAsCisJCQkucHJvY19oYW5kbGVyCT0gYWRkcmNvbmZfc3lzY3RsX3N0YWJsZV9zZWNyZXQsCisJCX0sCisJCXsKIAkJCS8qIHNlbnRpbmVsICovCiAJCX0KIAl9LApAQCAtNTMyOCw3ICs1NTk2LDcgQEAKIAljaGFyIHBhdGhbc2l6ZW9mKCJuZXQvaXB2Ni9jb25mLyIpICsgSUZOQU1TSVpdOwogCiAJdCA9IGttZW1kdXAoJmFkZHJjb25mX3N5c2N0bCwgc2l6ZW9mKCp0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHQgPT0gTlVMTCkKKwlpZiAoIXQpCiAJCWdvdG8gb3V0OwogCiAJZm9yIChpID0gMDsgdC0+YWRkcmNvbmZfdmFyc1tpXS5kYXRhOyBpKyspIHsKQEAgLTUzNDAsNyArNTYwOCw3IEBACiAJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAibmV0L2lwdjYvY29uZi8lcyIsIGRldl9uYW1lKTsKIAogCXQtPnN5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9uZXRfc3lzY3RsKG5ldCwgcGF0aCwgdC0+YWRkcmNvbmZfdmFycyk7Ci0JaWYgKHQtPnN5c2N0bF9oZWFkZXIgPT0gTlVMTCkKKwlpZiAoIXQtPnN5c2N0bF9oZWFkZXIpCiAJCWdvdG8gZnJlZTsKIAogCXAtPnN5c2N0bCA9IHQ7CkBAIC01MzU2LDcgKzU2MjQsNyBAQAogewogCXN0cnVjdCBhZGRyY29uZl9zeXNjdGxfdGFibGUgKnQ7CiAKLQlpZiAocC0+c3lzY3RsID09IE5VTEwpCisJaWYgKCFwLT5zeXNjdGwpCiAJCXJldHVybjsKIAogCXQgPSBwLT5zeXNjdGw7CkBAIC01Mzk5LDE3ICs1NjY3LDIwIEBACiAJc3RydWN0IGlwdjZfZGV2Y29uZiAqYWxsLCAqZGZsdDsKIAogCWFsbCA9IGttZW1kdXAoJmlwdjZfZGV2Y29uZiwgc2l6ZW9mKGlwdjZfZGV2Y29uZiksIEdGUF9LRVJORUwpOwotCWlmIChhbGwgPT0gTlVMTCkKKwlpZiAoIWFsbCkKIAkJZ290byBlcnJfYWxsb2NfYWxsOwogCiAJZGZsdCA9IGttZW1kdXAoJmlwdjZfZGV2Y29uZl9kZmx0LCBzaXplb2YoaXB2Nl9kZXZjb25mX2RmbHQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZGZsdCA9PSBOVUxMKQorCWlmICghZGZsdCkKIAkJZ290byBlcnJfYWxsb2NfZGZsdDsKIAogCS8qIHRoZXNlIHdpbGwgYmUgaW5oZXJpdGVkIGJ5IGFsbCBuYW1lc3BhY2VzICovCiAJZGZsdC0+YXV0b2NvbmYgPSBpcHY2X2RlZmF1bHRzLmF1dG9jb25mOwogCWRmbHQtPmRpc2FibGVfaXB2NiA9IGlwdjZfZGVmYXVsdHMuZGlzYWJsZV9pcHY2OwogCisJZGZsdC0+c3RhYmxlX3NlY3JldC5pbml0aWFsaXplZCA9IGZhbHNlOworCWFsbC0+c3RhYmxlX3NlY3JldC5pbml0aWFsaXplZCA9IGZhbHNlOworCiAJbmV0LT5pcHY2LmRldmNvbmZfYWxsID0gYWxsOwogCW5ldC0+aXB2Ni5kZXZjb25mX2RmbHQgPSBkZmx0OwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9hZGRyY29uZl9jb3JlLmMgYi9uZXQvaXB2Ni9hZGRyY29uZl9jb3JlLmMKaW5kZXggOThjYzRjZC4uZDg3M2NlZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmNvbmZfY29yZS5jCisrKyBiL25ldC9pcHY2L2FkZHJjb25mX2NvcmUuYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGlkZXYtPmRldjsKIAogCVdBUk5fT04oIWxpc3RfZW1wdHkoJmlkZXYtPmFkZHJfbGlzdCkpOwotCVdBUk5fT04oaWRldi0+bWNfbGlzdCAhPSBOVUxMKTsKKwlXQVJOX09OKGlkZXYtPm1jX2xpc3QpOwogCVdBUk5fT04odGltZXJfcGVuZGluZygmaWRldi0+cnNfdGltZXIpKTsKIAogI2lmZGVmIE5FVF9SRUZDTlRfREVCVUcKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJsYWJlbC5jIGIvbmV0L2lwdjYvYWRkcmxhYmVsLmMKaW5kZXggZTQzZTc5ZC4uODgyMTI0ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWRkcmxhYmVsLmMKKysrIGIvbmV0L2lwdjYvYWRkcmxhYmVsLmMKQEAgLTI5LDkgKzI5LDcgQEAKICAqIFBvbGljeSBUYWJsZQogICovCiBzdHJ1Y3QgaXA2YWRkcmxibF9lbnRyeSB7Ci0jaWZkZWYgQ09ORklHX05FVF9OUwotCXN0cnVjdCBuZXQgKmxibF9uZXQ7Ci0jZW5kaWYKKwlwb3NzaWJsZV9uZXRfdCBsYmxfbmV0OwogCXN0cnVjdCBpbjZfYWRkciBwcmVmaXg7CiAJaW50IHByZWZpeGxlbjsKIAlpbnQgaWZpbmRleDsKQEAgLTEyOSw5ICsxMjcsNiBAQAogLyogT2JqZWN0IG1hbmFnZW1lbnQgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBpcDZhZGRybGJsX2ZyZWUoc3RydWN0IGlwNmFkZHJsYmxfZW50cnkgKnApCiB7Ci0jaWZkZWYgQ09ORklHX05FVF9OUwotCXJlbGVhc2VfbmV0KHAtPmxibF9uZXQpOwotI2VuZGlmCiAJa2ZyZWUocCk7CiB9CiAKQEAgLTI0MCw5ICsyMzUsNyBAQAogCW5ld3AtPmFkZHJ0eXBlID0gYWRkcnR5cGU7CiAJbmV3cC0+bGFiZWwgPSBsYWJlbDsKIAlJTklUX0hMSVNUX05PREUoJm5ld3AtPmxpc3QpOwotI2lmZGVmIENPTkZJR19ORVRfTlMKLQluZXdwLT5sYmxfbmV0ID0gaG9sZF9uZXQobmV0KTsKLSNlbmRpZgorCXdyaXRlX3BuZXQoJm5ld3AtPmxibF9uZXQsIG5ldCk7CiAJYXRvbWljX3NldCgmbmV3cC0+cmVmY250LCAxKTsKIAlyZXR1cm4gbmV3cDsKIH0KQEAgLTQ4NCw3ICs0NzcsNyBAQAogCiAJaXA2YWRkcmxibF9wdXRtc2cobmxoLCBwLT5wcmVmaXhsZW4sIHAtPmlmaW5kZXgsIGxzZXEpOwogCi0JaWYgKG5sYV9wdXQoc2tiLCBJRkFMX0FERFJFU1MsIDE2LCAmcC0+cHJlZml4KSA8IDAgfHwKKwlpZiAobmxhX3B1dF9pbjZfYWRkcihza2IsIElGQUxfQUREUkVTUywgJnAtPnByZWZpeCkgPCAwIHx8CiAJICAgIG5sYV9wdXRfdTMyKHNrYiwgSUZBTF9MQUJFTCwgcC0+bGFiZWwpIDwgMCkgewogCQlubG1zZ19jYW5jZWwoc2tiLCBubGgpOwogCQlyZXR1cm4gLUVNU0dTSVpFOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWZfaW5ldDYuYyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKaW5kZXggZThjNDQwMC4uZWVmNjNiMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWZfaW5ldDYuYworKysgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCkBAIC0xNjQsMTEgKzE2NCwxMSBAQAogCWFuc3dlcl9mbGFncyA9IGFuc3dlci0+ZmxhZ3M7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlXQVJOX09OKGFuc3dlcl9wcm90LT5zbGFiID09IE5VTEwpOworCVdBUk5fT04oIWFuc3dlcl9wcm90LT5zbGFiKTsKIAogCWVyciA9IC1FTk9CVUZTOwogCXNrID0gc2tfYWxsb2MobmV0LCBQRl9JTkVUNiwgR0ZQX0tFUk5FTCwgYW5zd2VyX3Byb3QpOwotCWlmIChzayA9PSBOVUxMKQorCWlmICghc2spCiAJCWdvdG8gb3V0OwogCiAJc29ja19pbml0X2RhdGEoc29jaywgc2spOwpAQCAtMzkxLDcgKzM5MSw3IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAKLQlpZiAoc2sgPT0gTlVMTCkKKwlpZiAoIXNrKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEZyZWUgbWMgbGlzdHMgKi8KQEAgLTQxMywxMSArNDEzLDExIEBACiAJLyogUmVsZWFzZSByeCBvcHRpb25zICovCiAKIAlza2IgPSB4Y2hnKCZucC0+cGt0b3B0aW9ucywgTlVMTCk7Ci0JaWYgKHNrYiAhPSBOVUxMKQorCWlmIChza2IpCiAJCWtmcmVlX3NrYihza2IpOwogCiAJc2tiID0geGNoZygmbnAtPnJ4cG10dSwgTlVMTCk7Ci0JaWYgKHNrYiAhPSBOVUxMKQorCWlmIChza2IpCiAJCWtmcmVlX3NrYihza2IpOwogCiAJLyogRnJlZSBmbG93bGFiZWxzICovCkBAIC00MjYsNyArNDI2LDcgQEAKIAkvKiBGcmVlIHR4IG9wdGlvbnMgKi8KIAogCW9wdCA9IHhjaGcoJm5wLT5vcHQsIE5VTEwpOwotCWlmIChvcHQgIT0gTlVMTCkKKwlpZiAob3B0KQogCQlzb2NrX2tmcmVlX3Moc2ssIG9wdCwgb3B0LT50b3RfbGVuKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXQ2X2Rlc3Ryb3lfc29jayk7CkBAIC02NDAsNyArNjQwLDcgQEAKIAogCWRzdCA9IF9fc2tfZHN0X2NoZWNrKHNrLCBucC0+ZHN0X2Nvb2tpZSk7CiAKLQlpZiAoZHN0ID09IE5VTEwpIHsKKwlpZiAoIWRzdCkgewogCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJCXN0cnVjdCBpbjZfYWRkciAqZmluYWxfcCwgZmluYWw7CiAJCXN0cnVjdCBmbG93aTYgZmw2OwpAQCAtNzY2LDYgKzc2Niw4IEBACiAJbmV0LT5pcHY2LnN5c2N0bC5pY21wdjZfdGltZSA9IDEqSFo7CiAJbmV0LT5pcHY2LnN5c2N0bC5mbG93bGFiZWxfY29uc2lzdGVuY3kgPSAxOwogCW5ldC0+aXB2Ni5zeXNjdGwuYXV0b19mbG93bGFiZWxzID0gMDsKKwluZXQtPmlwdjYuc3lzY3RsLmlkZ2VuX3JldHJpZXMgPSAzOworCW5ldC0+aXB2Ni5zeXNjdGwuaWRnZW5fZGVsYXkgPSAxICogSFo7CiAJYXRvbWljX3NldCgmbmV0LT5pcHY2LmZpYjZfc2VybnVtLCAxKTsKIAogCWVyciA9IGlwdjZfaW5pdF9taWJzKG5ldCk7CkBAIC04MjQsNyArODI2LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkICpyOwogCWludCBlcnIgPSAwOwogCi0JQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0pID4gRklFTERfU0laRU9GKHN0cnVjdCBza19idWZmLCBjYikpOworCXNvY2tfc2tiX2NiX2NoZWNrX3NpemUoc2l6ZW9mKHN0cnVjdCBpbmV0Nl9za2JfcGFybSkpOwogCiAJLyogUmVnaXN0ZXIgdGhlIHNvY2tldC1zaWRlIGluZm9ybWF0aW9uIGZvciBpbmV0Nl9jcmVhdGUuICAqLwogCWZvciAociA9ICZpbmV0c3c2WzBdOyByIDwgJmluZXRzdzZbU09DS19NQVhdOyArK3IpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9haDYuYyBiL25ldC9pcHY2L2FoNi5jCmluZGV4IGE2NzI3YWQuLmVkN2Q0ZTNmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9haDYuYworKysgYi9uZXQvaXB2Ni9haDYuYwpAQCAtNjgxLDcgKzY4MSw3IEBACiAJCWdvdG8gZXJyb3I7CiAKIAlhaHAgPSBremFsbG9jKHNpemVvZigqYWhwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGFocCA9PSBOVUxMKQorCWlmICghYWhwKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCWFoYXNoID0gY3J5cHRvX2FsbG9jX2FoYXNoKHgtPmFhbGctPmFsZ19uYW1lLCAwLCAwKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FueWNhc3QuYyBiL25ldC9pcHY2L2FueWNhc3QuYwppbmRleCBiYWYyNzQyLi41MTRhYzI1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hbnljYXN0LmMKKysrIGIvbmV0L2lwdjYvYW55Y2FzdC5jCkBAIC02MCw2ICs2MCw4IEBACiAJaW50CWlzaG9zdCA9ICFuZXQtPmlwdjYuZGV2Y29uZl9hbGwtPmZvcndhcmRpbmc7CiAJaW50CWVyciA9IDA7CiAKKwlBU1NFUlRfUlROTCgpOworCiAJaWYgKCFuc19jYXBhYmxlKG5ldC0+dXNlcl9ucywgQ0FQX05FVF9BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoYWRkcikpCkBAIC02OCwxMiArNzAsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlwYWMgPSBzb2NrX2ttYWxsb2Moc2ssIHNpemVvZihzdHJ1Y3QgaXB2Nl9hY19zb2NrbGlzdCksIEdGUF9LRVJORUwpOwotCWlmIChwYWMgPT0gTlVMTCkKKwlpZiAoIXBhYykKIAkJcmV0dXJuIC1FTk9NRU07CiAJcGFjLT5hY2xfbmV4dCA9IE5VTEw7CiAJcGFjLT5hY2xfYWRkciA9ICphZGRyOwogCi0JcnRubF9sb2NrKCk7CiAJaWYgKGlmaW5kZXggPT0gMCkgewogCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwogCkBAIC05Miw3ICs5Myw3IEBACiAJfSBlbHNlCiAJCWRldiA9IF9fZGV2X2dldF9ieV9pbmRleChuZXQsIGlmaW5kZXgpOwogCi0JaWYgKGRldiA9PSBOVUxMKSB7CisJaWYgKCFkZXYpIHsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJvcjsKIAl9CkBAIC0xMzAsNyArMTMxLDYgQEAKIAl9CiAKIGVycm9yOgotCXJ0bmxfdW5sb2NrKCk7CiAJaWYgKHBhYykKIAkJc29ja19rZnJlZV9zKHNrLCBwYWMsIHNpemVvZigqcGFjKSk7CiAJcmV0dXJuIGVycjsKQEAgLTE0Niw3ICsxNDYsOCBAQAogCXN0cnVjdCBpcHY2X2FjX3NvY2tsaXN0ICpwYWMsICpwcmV2X3BhYzsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAKLQlydG5sX2xvY2soKTsKKwlBU1NFUlRfUlROTCgpOworCiAJcHJldl9wYWMgPSBOVUxMOwogCWZvciAocGFjID0gbnAtPmlwdjZfYWNfbGlzdDsgcGFjOyBwYWMgPSBwYWMtPmFjbF9uZXh0KSB7CiAJCWlmICgoaWZpbmRleCA9PSAwIHx8IHBhYy0+YWNsX2lmaW5kZXggPT0gaWZpbmRleCkgJiYKQEAgLTE1NCwxMCArMTU1LDggQEAKIAkJCWJyZWFrOwogCQlwcmV2X3BhYyA9IHBhYzsKIAl9Ci0JaWYgKCFwYWMpIHsKLQkJcnRubF91bmxvY2soKTsKKwlpZiAoIXBhYykKIAkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQogCWlmIChwcmV2X3BhYykKIAkJcHJldl9wYWMtPmFjbF9uZXh0ID0gcGFjLT5hY2xfbmV4dDsKIAllbHNlCkBAIC0xNjYsNyArMTY1LDYgQEAKIAlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobmV0LCBwYWMtPmFjbF9pZmluZGV4KTsKIAlpZiAoZGV2KQogCQlpcHY2X2Rldl9hY19kZWMoZGV2LCAmcGFjLT5hY2xfYWRkcik7Ci0JcnRubF91bmxvY2soKTsKIAogCXNvY2tfa2ZyZWVfcyhzaywgcGFjLCBzaXplb2YoKnBhYykpOwogCXJldHVybiAwOwpAQCAtMjI0LDcgKzIyMiw3IEBACiAJc3RydWN0IGlmYWNhZGRyNiAqYWNhOwogCiAJYWNhID0ga3phbGxvYyhzaXplb2YoKmFjYSksIEdGUF9BVE9NSUMpOwotCWlmIChhY2EgPT0gTlVMTCkKKwlpZiAoIWFjYSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlhY2EtPmFjYV9hZGRyID0gKmFkZHI7CkBAIC0yNzAsNyArMjY4LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCWFjYSA9IGFjYV9hbGxvYyhydCwgYWRkcik7Ci0JaWYgKGFjYSA9PSBOVUxMKSB7CisJaWYgKCFhY2EpIHsKIAkJaXA2X3J0X3B1dChydCk7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpAQCAtMzM5LDcgKzMzNyw3IEBACiB7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IF9faW42X2Rldl9nZXQoZGV2KTsKIAotCWlmIChpZGV2ID09IE5VTEwpCisJaWYgKCFpZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAlyZXR1cm4gX19pcHY2X2Rldl9hY19kZWMoaWRldiwgYWRkcik7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9kYXRhZ3JhbS5jIGIvbmV0L2lwdjYvZGF0YWdyYW0uYwppbmRleCBhY2U4ZGFjLi43NjJhNThjIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9kYXRhZ3JhbS5jCisrKyBiL25ldC9pcHY2L2RhdGFncmFtLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAkJZmw2LmZsb3dsYWJlbCA9IHVzaW4tPnNpbjZfZmxvd2luZm8mSVBWNl9GTE9XSU5GT19NQVNLOwogCQlpZiAoZmw2LmZsb3dsYWJlbCZJUFY2X0ZMT1dMQUJFTF9NQVNLKSB7CiAJCQlmbG93bGFiZWwgPSBmbDZfc29ja19sb29rdXAoc2ssIGZsNi5mbG93bGFiZWwpOwotCQkJaWYgKGZsb3dsYWJlbCA9PSBOVUxMKQorCQkJaWYgKCFmbG93bGFiZWwpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CkBAIC0zNzMsNyArMzczLDcgQEAKIAogCWVyciA9IC1FQUdBSU47CiAJc2tiID0gc29ja19kZXF1ZXVlX2Vycl9za2Ioc2spOwotCWlmIChza2IgPT0gTlVMTCkKKwlpZiAoIXNrYikKIAkJZ290byBvdXQ7CiAKIAljb3BpZWQgPSBza2ItPmxlbjsKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCiAJZXJyID0gLUVBR0FJTjsKIAlza2IgPSB4Y2hnKCZucC0+cnhwbXR1LCBOVUxMKTsKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCWdvdG8gb3V0OwogCiAJY29waWVkID0gc2tiLT5sZW47CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9lc3A2LmMgYi9uZXQvaXB2Ni9lc3A2LmMKaW5kZXggZTQ4ZjJjNy4uMzFmMWI1ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZXNwNi5jCisrKyBiL25ldC9pcHY2L2VzcDYuYwpAQCAtNDk1LDcgKzQ5NSw3IEBACiAJaW50IGVycjsKIAogCWVyciA9IC1FSU5WQUw7Ci0JaWYgKHgtPmVhbGcgPT0gTlVMTCkKKwlpZiAoIXgtPmVhbGcpCiAJCWdvdG8gZXJyb3I7CiAKIAllcnIgPSAtRU5BTUVUT09MT05HOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZXh0aGRyc19jb3JlLmMgYi9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYwppbmRleCA4YWYzZWI1Li41YzVkMjNlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYworKysgYi9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYwpAQCAtODIsNyArODIsNyBAQAogCQlpZiAobmV4dGhkciA9PSBORVhUSERSX05PTkUpCiAJCQlyZXR1cm4gLTE7CiAJCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc3RhcnQsIHNpemVvZihfaGRyKSwgJl9oZHIpOwotCQlpZiAoaHAgPT0gTlVMTCkKKwkJaWYgKCFocCkKIAkJCXJldHVybiAtMTsKIAkJaWYgKG5leHRoZHIgPT0gTkVYVEhEUl9GUkFHTUVOVCkgewogCQkJX19iZTE2IF9mcmFnX29mZiwgKmZwOwpAQCAtOTEsNyArOTEsNyBAQAogCQkJCQkJCSAgICAgICBmcmFnX29mZiksCiAJCQkJCQlzaXplb2YoX2ZyYWdfb2ZmKSwKIAkJCQkJCSZfZnJhZ19vZmYpOwotCQkJaWYgKGZwID09IE5VTEwpCisJCQlpZiAoIWZwKQogCQkJCXJldHVybiAtMTsKIAogCQkJKmZyYWdfb2ZmcCA9ICpmcDsKQEAgLTIxOCw3ICsyMTgsNyBAQAogCQl9CiAKIAkJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBzdGFydCwgc2l6ZW9mKF9oZHIpLCAmX2hkcik7Ci0JCWlmIChocCA9PSBOVUxMKQorCQlpZiAoIWhwKQogCQkJcmV0dXJuIC1FQkFETVNHOwogCiAJCWlmIChuZXh0aGRyID09IE5FWFRIRFJfUk9VVElORykgewpAQCAtMjI2LDcgKzIyNiw3IEBACiAKIAkJCXJoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgc3RhcnQsIHNpemVvZihfcmgpLAogCQkJCQkJJl9yaCk7Ci0JCQlpZiAocmggPT0gTlVMTCkKKwkJCWlmICghcmgpCiAJCQkJcmV0dXJuIC1FQkFETVNHOwogCiAJCQlpZiAoZmxhZ3MgJiYgKCpmbGFncyAmIElQNl9GSF9GX1NLSVBfUkgpICYmCkBAIC0yNDUsNyArMjQ1LDcgQEAKIAkJCQkJCQkgICAgICAgZnJhZ19vZmYpLAogCQkJCQkJc2l6ZW9mKF9mcmFnX29mZiksCiAJCQkJCQkmX2ZyYWdfb2ZmKTsKLQkJCWlmIChmcCA9PSBOVUxMKQorCQkJaWYgKCFmcCkKIAkJCQlyZXR1cm4gLUVCQURNU0c7CiAKIAkJCV9mcmFnX29mZiA9IG50b2hzKCpmcCkgJiB+MHg3OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZmliNl9ydWxlcy5jIGIvbmV0L2lwdjYvZmliNl9ydWxlcy5jCmluZGV4IGI0ZDVlMWQuLjIzNjdhMTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2ZpYjZfcnVsZXMuYworKysgYi9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKQEAgLTEwNCw2ICsxMDQsNyBAQAogCQkJCWdvdG8gYWdhaW47CiAJCQlmbHA2LT5zYWRkciA9IHNhZGRyOwogCQl9CisJCWVyciA9IHJ0LT5kc3QuZXJyb3I7CiAJCWdvdG8gb3V0OwogCX0KIGFnYWluOgpAQCAtMTk4LDEyICsxOTksMTAgQEAKIAl9CiAKIAlpZiAoZnJoLT5zcmNfbGVuKQotCQlubGFfbWVtY3B5KCZydWxlNi0+c3JjLmFkZHIsIHRiW0ZSQV9TUkNdLAotCQkJICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlydWxlNi0+c3JjLmFkZHIgPSBubGFfZ2V0X2luNl9hZGRyKHRiW0ZSQV9TUkNdKTsKIAogCWlmIChmcmgtPmRzdF9sZW4pCi0JCW5sYV9tZW1jcHkoJnJ1bGU2LT5kc3QuYWRkciwgdGJbRlJBX0RTVF0sCi0JCQkgICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCXJ1bGU2LT5kc3QuYWRkciA9IG5sYV9nZXRfaW42X2FkZHIodGJbRlJBX0RTVF0pOwogCiAJcnVsZTYtPnNyYy5wbGVuID0gZnJoLT5zcmNfbGVuOwogCXJ1bGU2LT5kc3QucGxlbiA9IGZyaC0+ZHN0X2xlbjsKQEAgLTI0OSwxMSArMjQ4LDkgQEAKIAlmcmgtPnRvcyA9IHJ1bGU2LT50Y2xhc3M7CiAKIAlpZiAoKHJ1bGU2LT5kc3QucGxlbiAmJgotCSAgICAgbmxhX3B1dChza2IsIEZSQV9EU1QsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAotCQkgICAgICZydWxlNi0+ZHN0LmFkZHIpKSB8fAorCSAgICAgbmxhX3B1dF9pbjZfYWRkcihza2IsIEZSQV9EU1QsICZydWxlNi0+ZHN0LmFkZHIpKSB8fAogCSAgICAocnVsZTYtPnNyYy5wbGVuICYmCi0JICAgICBubGFfcHV0KHNrYiwgRlJBX1NSQywgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCi0JCSAgICAgJnJ1bGU2LT5zcmMuYWRkcikpKQorCSAgICAgbmxhX3B1dF9pbjZfYWRkcihza2IsIEZSQV9TUkMsICZydWxlNi0+c3JjLmFkZHIpKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJcmV0dXJuIDA7CiAKQEAgLTI5OCwxOSArMjk1LDE2IEBACiAJb3BzID0gZmliX3J1bGVzX3JlZ2lzdGVyKCZmaWI2X3J1bGVzX29wc190ZW1wbGF0ZSwgbmV0KTsKIAlpZiAoSVNfRVJSKG9wcykpCiAJCXJldHVybiBQVFJfRVJSKG9wcyk7CisKKwllcnIgPSBmaWJfZGVmYXVsdF9ydWxlX2FkZChvcHMsIDAsIFJUNl9UQUJMRV9MT0NBTCwgMCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZmliNl9ydWxlc19vcHM7CisKKwllcnIgPSBmaWJfZGVmYXVsdF9ydWxlX2FkZChvcHMsIDB4N0ZGRSwgUlQ2X1RBQkxFX01BSU4sIDApOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZpYjZfcnVsZXNfb3BzOworCiAJbmV0LT5pcHY2LmZpYjZfcnVsZXNfb3BzID0gb3BzOwotCi0KLQllcnIgPSBmaWJfZGVmYXVsdF9ydWxlX2FkZChuZXQtPmlwdjYuZmliNl9ydWxlc19vcHMsIDAsCi0JCQkJICAgUlQ2X1RBQkxFX0xPQ0FMLCAwKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9maWI2X3J1bGVzX29wczsKLQotCWVyciA9IGZpYl9kZWZhdWx0X3J1bGVfYWRkKG5ldC0+aXB2Ni5maWI2X3J1bGVzX29wcywKLQkJCQkgICAweDdGRkUsIFJUNl9UQUJMRV9NQUlOLCAwKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9maWI2X3J1bGVzX29wczsKLQogb3V0OgogCXJldHVybiBlcnI7CiAKQEAgLTMyMSw3ICszMTUsOSBAQAogCiBzdGF0aWMgdm9pZCBfX25ldF9leGl0IGZpYjZfcnVsZXNfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQogeworCXJ0bmxfbG9jaygpOwogCWZpYl9ydWxlc191bnJlZ2lzdGVyKG5ldC0+aXB2Ni5maWI2X3J1bGVzX29wcyk7CisJcnRubF91bmxvY2soKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwZXJuZXRfb3BlcmF0aW9ucyBmaWI2X3J1bGVzX25ldF9vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pY21wLmMgYi9uZXQvaXB2Ni9pY21wLmMKaW5kZXggYTVlOTUxOS4uMmMyYjVkNSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaWNtcC5jCisrKyBiL25ldC9pcHY2L2ljbXAuYwpAQCAtMTYwLDggKzE2MCw3IEBACiAJCXRwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKIAkJCXB0citvZmZzZXRvZihzdHJ1Y3QgaWNtcDZoZHIsIGljbXA2X3R5cGUpLAogCQkJc2l6ZW9mKF90eXBlKSwgJl90eXBlKTsKLQkJaWYgKHRwID09IE5VTEwgfHwKLQkJICAgICEoKnRwICYgSUNNUFY2X0lORk9NU0dfTUFTSykpCisJCWlmICghdHAgfHwgISgqdHAgJiBJQ01QVjZfSU5GT01TR19NQVNLKSkKIAkJCXJldHVybiB0cnVlOwogCX0KIAlyZXR1cm4gZmFsc2U7CkBAIC0yMzEsNyArMjMwLDcgQEAKIAogCW9mZnNldCArPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKIAlvcCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9vcHR2YWwpLCAmX29wdHZhbCk7Ci0JaWYgKG9wID09IE5VTEwpCisJaWYgKCFvcCkKIAkJcmV0dXJuIHRydWU7CiAJcmV0dXJuICgqb3AgJiAweEMwKSA9PSAweDgwOwogfQpAQCAtMjQ0LDcgKzI0Myw3IEBACiAJaW50IGVyciA9IDA7CiAKIAlza2IgPSBza2JfcGVlaygmc2stPnNrX3dyaXRlX3F1ZXVlKTsKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCWdvdG8gb3V0OwogCiAJaWNtcDZoID0gaWNtcDZfaGRyKHNrYik7CkBAIC00NzksNyArNDc4LDcgQEAKIAlzZWN1cml0eV9za2JfY2xhc3NpZnlfZmxvdyhza2IsIGZsb3dpNl90b19mbG93aSgmZmw2KSk7CiAKIAlzayA9IGljbXB2Nl94bWl0X2xvY2sobmV0KTsKLQlpZiAoc2sgPT0gTlVMTCkKKwlpZiAoIXNrKQogCQlyZXR1cm47CiAJc2stPnNrX21hcmsgPSBtYXJrOwogCW5wID0gaW5ldDZfc2soc2spOwpAQCAtNTgyLDcgKzU4MSw3IEBACiAJc2VjdXJpdHlfc2tiX2NsYXNzaWZ5X2Zsb3coc2tiLCBmbG93aTZfdG9fZmxvd2koJmZsNikpOwogCiAJc2sgPSBpY21wdjZfeG1pdF9sb2NrKG5ldCk7Ci0JaWYgKHNrID09IE5VTEwpCisJaWYgKCFzaykKIAkJcmV0dXJuOwogCXNrLT5za19tYXJrID0gbWFyazsKIAlucCA9IGluZXQ2X3NrKHNrKTsKQEAgLTgzOSw3ICs4MzgsNyBAQAogCiAJbmV0LT5pcHY2LmljbXBfc2sgPQogCQlremFsbG9jKG5yX2NwdV9pZHMgKiBzaXplb2Yoc3RydWN0IHNvY2sgKiksIEdGUF9LRVJORUwpOwotCWlmIChuZXQtPmlwdjYuaWNtcF9zayA9PSBOVUxMKQorCWlmICghbmV0LT5pcHY2LmljbXBfc2spCiAJCXJldHVybiAtRU5PTUVNOwogCiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5jIGIvbmV0L2lwdjYvaW5ldDZfY29ubmVjdGlvbl9zb2NrLmMKaW5kZXggMjliMzIyMC4uNjkyN2YzZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaW5ldDZfY29ubmVjdGlvbl9zb2NrLmMKKysrIGIvbmV0L2lwdjYvaW5ldDZfY29ubmVjdGlvbl9zb2NrLmMKQEAgLTExMiwyMiArMTEyLDIwIEBACiAJcmV0dXJuIGMgJiAoc3lucV9oc2l6ZSAtIDEpOwogfQogCi1zdHJ1Y3QgcmVxdWVzdF9zb2NrICppbmV0Nl9jc2tfc2VhcmNoX3JlcShjb25zdCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJCSAgc3RydWN0IHJlcXVlc3Rfc29jayAqKipwcmV2cCwKK3N0cnVjdCByZXF1ZXN0X3NvY2sgKmluZXQ2X2Nza19zZWFyY2hfcmVxKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICBjb25zdCBfX2JlMTYgcnBvcnQsCiAJCQkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpyYWRkciwKIAkJCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmxhZGRyLAogCQkJCQkgIGNvbnN0IGludCBpaWYpCiB7Ci0JY29uc3Qgc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOworCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAlzdHJ1Y3QgbGlzdGVuX3NvY2sgKmxvcHQgPSBpY3NrLT5pY3NrX2FjY2VwdF9xdWV1ZS5saXN0ZW5fb3B0OwotCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwgKipwcmV2OworCXN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcTsKKwl1MzIgaGFzaCA9IGluZXQ2X3N5bnFfaGFzaChyYWRkciwgcnBvcnQsIGxvcHQtPmhhc2hfcm5kLAorCQkJCSAgIGxvcHQtPm5yX3RhYmxlX2VudHJpZXMpOwogCi0JZm9yIChwcmV2ID0gJmxvcHQtPnN5bl90YWJsZVtpbmV0Nl9zeW5xX2hhc2gocmFkZHIsIHJwb3J0LAotCQkJCQkJICAgICBsb3B0LT5oYXNoX3JuZCwKLQkJCQkJCSAgICAgbG9wdC0+bnJfdGFibGVfZW50cmllcyldOwotCSAgICAgKHJlcSA9ICpwcmV2KSAhPSBOVUxMOwotCSAgICAgcHJldiA9ICZyZXEtPmRsX25leHQpIHsKKwlzcGluX2xvY2soJmljc2stPmljc2tfYWNjZXB0X3F1ZXVlLnN5bl93YWl0X2xvY2spOworCWZvciAocmVxID0gbG9wdC0+c3luX3RhYmxlW2hhc2hdOyByZXEgIT0gTlVMTDsgcmVxID0gcmVxLT5kbF9uZXh0KSB7CiAJCWNvbnN0IHN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaXJlcSA9IGluZXRfcnNrKHJlcSk7CiAKIAkJaWYgKGlyZXEtPmlyX3JtdF9wb3J0ID09IHJwb3J0ICYmCkBAIC0xMzUsMTMgKzEzMywxNCBAQAogCQkgICAgaXB2Nl9hZGRyX2VxdWFsKCZpcmVxLT5pcl92Nl9ybXRfYWRkciwgcmFkZHIpICYmCiAJCSAgICBpcHY2X2FkZHJfZXF1YWwoJmlyZXEtPmlyX3Y2X2xvY19hZGRyLCBsYWRkcikgJiYKIAkJICAgICghaXJlcS0+aXJfaWlmIHx8IGlyZXEtPmlyX2lpZiA9PSBpaWYpKSB7CisJCQlhdG9taWNfaW5jKCZyZXEtPnJza19yZWZjbnQpOwogCQkJV0FSTl9PTihyZXEtPnNrICE9IE5VTEwpOwotCQkJKnByZXZwID0gcHJldjsKLQkJCXJldHVybiByZXE7CisJCQlicmVhazsKIAkJfQogCX0KKwlzcGluX3VubG9jaygmaWNzay0+aWNza19hY2NlcHRfcXVldWUuc3luX3dhaXRfbG9jayk7CiAKLQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcmVxOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldDZfY3NrX3NlYXJjaF9yZXEpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pbmV0Nl9oYXNodGFibGVzLmMgYi9uZXQvaXB2Ni9pbmV0Nl9oYXNodGFibGVzLmMKaW5kZXggMDUxZGZmYi4uODcxNjQxYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaW5ldDZfaGFzaHRhYmxlcy5jCisrKyBiL25ldC9pcHY2L2luZXQ2X2hhc2h0YWJsZXMuYwpAQCAtMjMsMTEgKzIzLDkgQEAKICNpbmNsdWRlIDxuZXQvc2VjdXJlX3NlcS5oPgogI2luY2x1ZGUgPG5ldC9pcC5oPgogCi1zdGF0aWMgdW5zaWduZWQgaW50IGluZXQ2X2VoYXNoZm4oc3RydWN0IG5ldCAqbmV0LAotCQkJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpsYWRkciwKLQkJCQkgIGNvbnN0IHUxNiBscG9ydCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZmFkZHIsCi0JCQkJICBjb25zdCBfX2JlMTYgZnBvcnQpCit1MzIgaW5ldDZfZWhhc2hmbihjb25zdCBzdHJ1Y3QgbmV0ICpuZXQsCisJCSAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpsYWRkciwgY29uc3QgdTE2IGxwb3J0LAorCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZmFkZHIsIGNvbnN0IF9fYmUxNiBmcG9ydCkKIHsKIAlzdGF0aWMgdTMyIGluZXQ2X2VoYXNoX3NlY3JldCBfX3JlYWRfbW9zdGx5OwogCXN0YXRpYyB1MzIgaXB2Nl9oYXNoX3NlY3JldCBfX3JlYWRfbW9zdGx5OwpAQCAtNDQsNTQgKzQyLDYgQEAKIAkJCSAgICAgICBpbmV0Nl9laGFzaF9zZWNyZXQgKyBuZXRfaGFzaF9taXgobmV0KSk7CiB9CiAKLXN0YXRpYyBpbnQgaW5ldDZfc2tfZWhhc2hmbihjb25zdCBzdHJ1Y3Qgc29jayAqc2spCi17Ci0JY29uc3Qgc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwotCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbGFkZHIgPSAmc2stPnNrX3Y2X3Jjdl9zYWRkcjsKLQljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmZhZGRyID0gJnNrLT5za192Nl9kYWRkcjsKLQljb25zdCBfX3UxNiBscG9ydCA9IGluZXQtPmluZXRfbnVtOwotCWNvbnN0IF9fYmUxNiBmcG9ydCA9IGluZXQtPmluZXRfZHBvcnQ7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwotCi0JcmV0dXJuIGluZXQ2X2VoYXNoZm4obmV0LCBsYWRkciwgbHBvcnQsIGZhZGRyLCBmcG9ydCk7Ci19Ci0KLWludCBfX2luZXQ2X2hhc2goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dykKLXsKLQlzdHJ1Y3QgaW5ldF9oYXNoaW5mbyAqaGFzaGluZm8gPSBzay0+c2tfcHJvdC0+aC5oYXNoaW5mbzsKLQlpbnQgdHdyZWZjbnQgPSAwOwotCi0JV0FSTl9PTighc2tfdW5oYXNoZWQoc2spKTsKLQotCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgewotCQlzdHJ1Y3QgaW5ldF9saXN0ZW5faGFzaGJ1Y2tldCAqaWxiOwotCi0JCWlsYiA9ICZoYXNoaW5mby0+bGlzdGVuaW5nX2hhc2hbaW5ldF9za19saXN0ZW5faGFzaGZuKHNrKV07Ci0JCXNwaW5fbG9jaygmaWxiLT5sb2NrKTsKLQkJX19za19udWxsc19hZGRfbm9kZV9yY3Uoc2ssICZpbGItPmhlYWQpOwotCQlzcGluX3VubG9jaygmaWxiLT5sb2NrKTsKLQl9IGVsc2UgewotCQl1bnNpZ25lZCBpbnQgaGFzaDsKLQkJc3RydWN0IGhsaXN0X251bGxzX2hlYWQgKmxpc3Q7Ci0JCXNwaW5sb2NrX3QgKmxvY2s7Ci0KLQkJc2stPnNrX2hhc2ggPSBoYXNoID0gaW5ldDZfc2tfZWhhc2hmbihzayk7Ci0JCWxpc3QgPSAmaW5ldF9laGFzaF9idWNrZXQoaGFzaGluZm8sIGhhc2gpLT5jaGFpbjsKLQkJbG9jayA9IGluZXRfZWhhc2hfbG9ja3AoaGFzaGluZm8sIGhhc2gpOwotCQlzcGluX2xvY2sobG9jayk7Ci0JCV9fc2tfbnVsbHNfYWRkX25vZGVfcmN1KHNrLCBsaXN0KTsKLQkJaWYgKHR3KSB7Ci0JCQlXQVJOX09OKHNrLT5za19oYXNoICE9IHR3LT50d19oYXNoKTsKLQkJCXR3cmVmY250ID0gaW5ldF90d3NrX3VuaGFzaCh0dyk7Ci0JCX0KLQkJc3Bpbl91bmxvY2sobG9jayk7Ci0JfQotCi0Jc29ja19wcm90X2ludXNlX2FkZChzb2NrX25ldChzayksIHNrLT5za19wcm90LCAxKTsKLQlyZXR1cm4gdHdyZWZjbnQ7Ci19Ci1FWFBPUlRfU1lNQk9MKF9faW5ldDZfaGFzaCk7Ci0KIC8qCiAgKiBTb2NrZXRzIGluIFRDUF9DTE9TRSBzdGF0ZSBhcmUgX2Fsd2F5c18gdGFrZW4gb3V0IG9mIHRoZSBoYXNoLCBzbwogICogd2UgbmVlZCBub3QgY2hlY2sgaXQgZm9yIFRDUCBsb29rdXBzIGFueW1vcmUsIHRoYW5rcyBBbGV4ZXkuIC1EYXZlTQpAQCAtMjk2LDcgKzI0Niw3IEBACiAJCSp0d3AgPSB0dzsKIAl9IGVsc2UgaWYgKHR3KSB7CiAJCS8qIFNpbGx5LiBTaG91bGQgaGFzaC1kYW5jZSBpbnN0ZWFkLi4uICovCi0JCWluZXRfdHdza19kZXNjaGVkdWxlKHR3LCBkZWF0aF9yb3cpOworCQlpbmV0X3R3c2tfZGVzY2hlZHVsZSh0dyk7CiAKIAkJaW5ldF90d3NrX3B1dCh0dyk7CiAJfQpAQCAtMzIwLDYgKzI3MCw2IEBACiAJCSAgICAgICBzdHJ1Y3Qgc29jayAqc2spCiB7CiAJcmV0dXJuIF9faW5ldF9oYXNoX2Nvbm5lY3QoZGVhdGhfcm93LCBzaywgaW5ldDZfc2tfcG9ydF9vZmZzZXQoc2spLAotCQkJX19pbmV0Nl9jaGVja19lc3RhYmxpc2hlZCwgX19pbmV0Nl9oYXNoKTsKKwkJCQkgICBfX2luZXQ2X2NoZWNrX2VzdGFibGlzaGVkKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGluZXQ2X2hhc2hfY29ubmVjdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfZmliLmMgYi9uZXQvaXB2Ni9pcDZfZmliLmMKaW5kZXggMjYzZWY0MS4uOTZkYmZmZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X2ZpYi5jCisrKyBiL25ldC9pcHY2L2lwNl9maWIuYwpAQCAtMTIwNiw3ICsxMjA2LDcgQEAKIAogCQlXQVJOX09OKGZuLT5mbl9mbGFncyAmIFJUTl9SVElORk8pOwogCQlXQVJOX09OKGZuLT5mbl9mbGFncyAmIFJUTl9UTF9ST09UKTsKLQkJV0FSTl9PTihmbi0+bGVhZiAhPSBOVUxMKTsKKwkJV0FSTl9PTihmbi0+bGVhZik7CiAKIAkJY2hpbGRyZW4gPSAwOwogCQljaGlsZCA9IE5VTEw7CkBAIC0xMzYxLDcgKzEzNjEsNyBAQAogCiAjaWYgUlQ2X0RFQlVHID49IDIKIAlpZiAocnQtPmRzdC5vYnNvbGV0ZSA+IDApIHsKLQkJV0FSTl9PTihmbiAhPSBOVUxMKTsKKwkJV0FSTl9PTihmbik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jIGIvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCmluZGV4IGY0NWQ2ZGIuLmQ0OTExMjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYworKysgYi9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKQEAgLTEwMCw3ICsxMDAsNiBAQAogCWlmIChmbCkgewogCQlpZiAoZmwtPnNoYXJlID09IElQVjZfRkxfU19QUk9DRVNTKQogCQkJcHV0X3BpZChmbC0+b3duZXIucGlkKTsKLQkJcmVsZWFzZV9uZXQoZmwtPmZsX25ldCk7CiAJCWtmcmVlKGZsLT5vcHQpOwogCQlrZnJlZV9yY3UoZmwsIHJjdSk7CiAJfQpAQCAtMjA2LDcgKzIwNSw3IEBACiAJCQlmbC0+bGFiZWwgPSBodG9ubChwcmFuZG9tX3UzMigpKSZJUFY2X0ZMT1dMQUJFTF9NQVNLOwogCQkJaWYgKGZsLT5sYWJlbCkgewogCQkJCWxmbCA9IF9fZmxfbG9va3VwKG5ldCwgZmwtPmxhYmVsKTsKLQkJCQlpZiAobGZsID09IE5VTEwpCisJCQkJaWYgKCFsZmwpCiAJCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0yMjAsNyArMjE5LDcgQEAKIAkJICogd2l0aCB0aGUgc2FtZSBsYWJlbCBjYW4gb25seSBhcHBlYXIgb24gYW5vdGhlciBzb2NrCiAJCSAqLwogCQlsZmwgPSBfX2ZsX2xvb2t1cChuZXQsIGZsLT5sYWJlbCk7Ci0JCWlmIChsZmwgIT0gTlVMTCkgeworCQlpZiAobGZsKSB7CiAJCQlhdG9taWNfaW5jKCZsZmwtPnVzZXJzKTsKIAkJCXNwaW5fdW5sb2NrX2JoKCZpcDZfZmxfbG9jayk7CiAJCQlyZXR1cm4gbGZsOwpAQCAtMjk4LDEwICsyOTcsMTAgQEAKIHsKIAlzdHJ1Y3QgaXB2Nl90eG9wdGlvbnMgKmZsX29wdCA9IGZsLT5vcHQ7CiAKLQlpZiAoZm9wdCA9PSBOVUxMIHx8IGZvcHQtPm9wdF9mbGVuID09IDApCisJaWYgKCFmb3B0IHx8IGZvcHQtPm9wdF9mbGVuID09IDApCiAJCXJldHVybiBmbF9vcHQ7CiAKLQlpZiAoZmxfb3B0ICE9IE5VTEwpIHsKKwlpZiAoZmxfb3B0KSB7CiAJCW9wdF9zcGFjZS0+aG9wb3B0ID0gZmxfb3B0LT5ob3BvcHQ7CiAJCW9wdF9zcGFjZS0+ZHN0MG9wdCA9IGZsX29wdC0+ZHN0MG9wdDsKIAkJb3B0X3NwYWNlLT5zcmNydCA9IGZsX29wdC0+c3JjcnQ7CkBAIC0zNjcsNyArMzY2LDcgQEAKIAogCWVyciA9IC1FTk9NRU07CiAJZmwgPSBremFsbG9jKHNpemVvZigqZmwpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZmwgPT0gTlVMTCkKKwlpZiAoIWZsKQogCQlnb3RvIGRvbmU7CiAKIAlpZiAob2xlbiA+IDApIHsKQEAgLTM3Nyw3ICszNzYsNyBAQAogCiAJCWVyciA9IC1FTk9NRU07CiAJCWZsLT5vcHQgPSBrbWFsbG9jKHNpemVvZigqZmwtPm9wdCkgKyBvbGVuLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGZsLT5vcHQgPT0gTlVMTCkKKwkJaWYgKCFmbC0+b3B0KQogCQkJZ290byBkb25lOwogCiAJCW1lbXNldChmbC0+b3B0LCAwLCBzaXplb2YoKmZsLT5vcHQpKTsKQEAgLTQwMyw3ICs0MDIsNyBAQAogCQl9CiAJfQogCi0JZmwtPmZsX25ldCA9IGhvbGRfbmV0KG5ldCk7CisJZmwtPmZsX25ldCA9IG5ldDsKIAlmbC0+ZXhwaXJlcyA9IGppZmZpZXM7CiAJZXJyID0gZmw2X3JlbmV3KGZsLCBmcmVxLT5mbHJfbGluZ2VyLCBmcmVxLT5mbHJfZXhwaXJlcyk7CiAJaWYgKGVycikKQEAgLTU5Nyw3ICs1OTYsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJZmwgPSBmbF9jcmVhdGUobmV0LCBzaywgJmZyZXEsIG9wdHZhbCwgb3B0bGVuLCAmZXJyKTsKLQkJaWYgKGZsID09IE5VTEwpCisJCWlmICghZmwpCiAJCQlyZXR1cm4gZXJyOwogCQlzZmwxID0ga21hbGxvYyhzaXplb2YoKnNmbDEpLCBHRlBfS0VSTkVMKTsKIApAQCAtNjE3LDcgKzYxNiw3IEBACiAJCQl9CiAJCQlyY3VfcmVhZF91bmxvY2tfYmgoKTsKIAotCQkJaWYgKGZsMSA9PSBOVUxMKQorCQkJaWYgKCFmbDEpCiAJCQkJZmwxID0gZmxfbG9va3VwKG5ldCwgZnJlcS5mbHJfbGFiZWwpOwogCQkJaWYgKGZsMSkgewogcmVjaGVjazoKQEAgLTYzNCw3ICs2MzMsNyBAQAogCQkJCQlnb3RvIHJlbGVhc2U7CiAKIAkJCQllcnIgPSAtRU5PTUVNOwotCQkJCWlmIChzZmwxID09IE5VTEwpCisJCQkJaWYgKCFzZmwxKQogCQkJCQlnb3RvIHJlbGVhc2U7CiAJCQkJaWYgKGZsLT5saW5nZXIgPiBmbDEtPmxpbmdlcikKIAkJCQkJZmwxLT5saW5nZXIgPSBmbC0+bGluZ2VyOwpAQCAtNjU0LDcgKzY1Myw3IEBACiAJCQlnb3RvIGRvbmU7CiAKIAkJZXJyID0gLUVOT01FTTsKLQkJaWYgKHNmbDEgPT0gTlVMTCkKKwkJaWYgKCFzZmwxKQogCQkJZ290byBkb25lOwogCiAJCWVyciA9IG1lbV9jaGVjayhzayk7CkBAIC02NjIsNyArNjYxLDcgQEAKIAkJCWdvdG8gZG9uZTsKIAogCQlmbDEgPSBmbF9pbnRlcm4obmV0LCBmbCwgZnJlcS5mbHJfbGFiZWwpOwotCQlpZiAoZmwxICE9IE5VTEwpCisJCWlmIChmbDEpCiAJCQlnb3RvIHJlY2hlY2s7CiAKIAkJaWYgKCFmcmVxLmZscl9sYWJlbCkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2dyZS5jIGIvbmV0L2lwdjYvaXA2X2dyZS5jCmluZGV4IGJjMjhiN2QuLmI1ZTZjYzEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9ncmUuYworKysgYi9uZXQvaXB2Ni9pcDZfZ3JlLmMKQEAgLTIyMyw3ICsyMjMsNyBAQAogCQl9CiAJfQogCi0JaWYgKGNhbmQgIT0gTlVMTCkKKwlpZiAoY2FuZCkKIAkJcmV0dXJuIGNhbmQ7CiAKIAlkZXYgPSBpZ24tPmZiX3R1bm5lbF9kZXY7CkBAIC0zOTUsNyArMzk1LDcgQEAKIAkJCQlmbGFncyAmIEdSRV9LRVkgPwogCQkJCSooKChfX2JlMzIgKilwKSArIChncmVobGVuIC8gNCkgLSAxKSA6IDAsCiAJCQkJcFsxXSk7Ci0JaWYgKHQgPT0gTlVMTCkKKwlpZiAoIXQpCiAJCXJldHVybjsKIAogCXN3aXRjaCAodHlwZSkgewpAQCAtNzYwLDcgKzc2MCw3IEBACiAKIAlza2Jfc2V0X2lubmVyX3Byb3RvY29sKHNrYiwgcHJvdG9jb2wpOwogCi0JaXA2dHVubmVsX3htaXQoc2tiLCBkZXYpOworCWlwNnR1bm5lbF94bWl0KE5VTEwsIHNrYiwgZGV2KTsKIAlpZiAobmRzdCkKIAkJaXA2X3RubF9kc3Rfc3RvcmUodHVubmVsLCBuZHN0KTsKIAlyZXR1cm4gMDsKQEAgLTk4MCw3ICs5ODAsNyBAQAogCQkJCQkJICZwLT5yYWRkciwgJnAtPmxhZGRyLAogCQkJCQkJIHAtPmxpbmssIHN0cmljdCk7CiAKLQkJaWYgKHJ0ID09IE5VTEwpCisJCWlmICghcnQpCiAJCQlyZXR1cm47CiAKIAkJaWYgKHJ0LT5kc3QuZGV2KSB7CkBAIC0xMDczLDcgKzEwNzMsNyBAQAogCQkJfQogCQkJaXA2Z3JlX3RubF9wYXJtX2Zyb21fdXNlcigmcDEsICZwKTsKIAkJCXQgPSBpcDZncmVfdHVubmVsX2xvY2F0ZShuZXQsICZwMSwgMCk7Ci0JCQlpZiAodCA9PSBOVUxMKQorCQkJaWYgKCF0KQogCQkJCXQgPSBuZXRkZXZfcHJpdihkZXYpOwogCQl9CiAJCW1lbXNldCgmcCwgMCwgc2l6ZW9mKHApKTsKQEAgLTExMDUsNyArMTEwNSw3IEBACiAJCXQgPSBpcDZncmVfdHVubmVsX2xvY2F0ZShuZXQsICZwMSwgY21kID09IFNJT0NBRERUVU5ORUwpOwogCiAJCWlmIChkZXYgIT0gaWduLT5mYl90dW5uZWxfZGV2ICYmIGNtZCA9PSBTSU9DQ0hHVFVOTkVMKSB7Ci0JCQlpZiAodCAhPSBOVUxMKSB7CisJCQlpZiAodCkgewogCQkJCWlmICh0LT5kZXYgIT0gZGV2KSB7CiAJCQkJCWVyciA9IC1FRVhJU1Q7CiAJCQkJCWJyZWFrOwpAQCAtMTE0NCw3ICsxMTQ0LDcgQEAKIAkJCWVyciA9IC1FTk9FTlQ7CiAJCQlpcDZncmVfdG5sX3Bhcm1fZnJvbV91c2VyKCZwMSwgJnApOwogCQkJdCA9IGlwNmdyZV90dW5uZWxfbG9jYXRlKG5ldCwgJnAxLCAwKTsKLQkJCWlmICh0ID09IE5VTEwpCisJCQlpZiAoIXQpCiAJCQkJZ290byBkb25lOwogCQkJZXJyID0gLUVQRVJNOwogCQkJaWYgKHQgPT0gbmV0ZGV2X3ByaXYoaWduLT5mYl90dW5uZWxfZGV2KSkKQEAgLTEyMTYsNiArMTIxNiw3IEBACiAJLm5kb19kb19pb2N0bAkJPSBpcDZncmVfdHVubmVsX2lvY3RsLAogCS5uZG9fY2hhbmdlX210dQkJPSBpcDZncmVfdHVubmVsX2NoYW5nZV9tdHUsCiAJLm5kb19nZXRfc3RhdHM2NAk9IGlwX3R1bm5lbF9nZXRfc3RhdHM2NCwKKwkubmRvX2dldF9pZmxpbmsJCT0gaXA2X3RubF9nZXRfaWZsaW5rLAogfTsKIAogc3RhdGljIHZvaWQgaXA2Z3JlX2Rldl9mcmVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xMjM4LDcgKzEyMzksNiBAQAogCWlmICghKHQtPnBhcm1zLmZsYWdzICYgSVA2X1ROTF9GX0lHTl9FTkNBUF9MSU1JVCkpCiAJCWRldi0+bXR1IC09IDg7CiAJZGV2LT5mbGFncyB8PSBJRkZfTk9BUlA7Ci0JZGV2LT5pZmxpbmsgPSAwOwogCWRldi0+YWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTsKIAluZXRpZl9rZWVwX2RzdChkZXYpOwogfQpAQCAtMTI3MCw4ICsxMjcwLDYgQEAKIAkJdTY0X3N0YXRzX2luaXQoJmlwNmdyZV90dW5uZWxfc3RhdHMtPnN5bmNwKTsKIAl9CiAKLQlkZXYtPmlmbGluayA9IHR1bm5lbC0+cGFybXMubGluazsKLQogCXJldHVybiAwOwogfQogCkBAIC0xMzEzLDcgKzEzMTEsNyBAQAogCiAJCQl0ID0gcnRubF9kZXJlZmVyZW5jZShpZ24tPnR1bm5lbHNbcHJpb11baF0pOwogCi0JCQl3aGlsZSAodCAhPSBOVUxMKSB7CisJCQl3aGlsZSAodCkgewogCQkJCS8qIElmIGRldiBpcyBpbiB0aGUgc2FtZSBuZXRucywgaXQgaGFzIGFscmVhZHkKIAkJCQkgKiBiZWVuIGFkZGVkIHRvIHRoZSBsaXN0IGJ5IHRoZSBwcmV2aW91cyBsb29wLgogCQkJCSAqLwpAQCAtMTQxMiw3ICsxNDEwLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlpZiAoZGF0YVtJRkxBX0dSRV9SRU1PVEVdKSB7Ci0JCW5sYV9tZW1jcHkoJmRhZGRyLCBkYXRhW0lGTEFfR1JFX1JFTU9URV0sIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJZGFkZHIgPSBubGFfZ2V0X2luNl9hZGRyKGRhdGFbSUZMQV9HUkVfUkVNT1RFXSk7CiAJCWlmIChpcHY2X2FkZHJfYW55KCZkYWRkcikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xNDQ2LDEwICsxNDQ0LDEwIEBACiAJCXBhcm1zLT5vX2tleSA9IG5sYV9nZXRfYmUzMihkYXRhW0lGTEFfR1JFX09LRVldKTsKIAogCWlmIChkYXRhW0lGTEFfR1JFX0xPQ0FMXSkKLQkJbmxhX21lbWNweSgmcGFybXMtPmxhZGRyLCBkYXRhW0lGTEFfR1JFX0xPQ0FMXSwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlwYXJtcy0+bGFkZHIgPSBubGFfZ2V0X2luNl9hZGRyKGRhdGFbSUZMQV9HUkVfTE9DQUxdKTsKIAogCWlmIChkYXRhW0lGTEFfR1JFX1JFTU9URV0pCi0JCW5sYV9tZW1jcHkoJnBhcm1zLT5yYWRkciwgZGF0YVtJRkxBX0dSRV9SRU1PVEVdLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CisJCXBhcm1zLT5yYWRkciA9IG5sYV9nZXRfaW42X2FkZHIoZGF0YVtJRkxBX0dSRV9SRU1PVEVdKTsKIAogCWlmIChkYXRhW0lGTEFfR1JFX1RUTF0pCiAJCXBhcm1zLT5ob3BfbGltaXQgPSBubGFfZ2V0X3U4KGRhdGFbSUZMQV9HUkVfVFRMXSk7CkBAIC0xNDgwLDggKzE0NzgsNiBAQAogCWlmICghZGV2LT50c3RhdHMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZGV2LT5pZmxpbmsgPSB0dW5uZWwtPnBhcm1zLmxpbms7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQ5Myw2ICsxNDg5LDcgQEAKIAkubmRvX3ZhbGlkYXRlX2FkZHIgPSBldGhfdmFsaWRhdGVfYWRkciwKIAkubmRvX2NoYW5nZV9tdHUgPSBpcDZncmVfdHVubmVsX2NoYW5nZV9tdHUsCiAJLm5kb19nZXRfc3RhdHM2NCA9IGlwX3R1bm5lbF9nZXRfc3RhdHM2NCwKKwkubmRvX2dldF9pZmxpbmsgPSBpcDZfdG5sX2dldF9pZmxpbmssCiB9OwogCiBzdGF0aWMgdm9pZCBpcDZncmVfdGFwX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xNTAzLDcgKzE1MDAsNiBAQAogCWRldi0+bmV0ZGV2X29wcyA9ICZpcDZncmVfdGFwX25ldGRldl9vcHM7CiAJZGV2LT5kZXN0cnVjdG9yID0gaXA2Z3JlX2Rldl9mcmVlOwogCi0JZGV2LT5pZmxpbmsgPSAwOwogCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ORVROU19MT0NBTDsKIH0KIApAQCAtMTYyMiw4ICsxNjE4LDggQEAKIAkgICAgbmxhX3B1dF9iZTE2KHNrYiwgSUZMQV9HUkVfT0ZMQUdTLCBwLT5vX2ZsYWdzKSB8fAogCSAgICBubGFfcHV0X2JlMzIoc2tiLCBJRkxBX0dSRV9JS0VZLCBwLT5pX2tleSkgfHwKIAkgICAgbmxhX3B1dF9iZTMyKHNrYiwgSUZMQV9HUkVfT0tFWSwgcC0+b19rZXkpIHx8Ci0JICAgIG5sYV9wdXQoc2tiLCBJRkxBX0dSRV9MT0NBTCwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksICZwLT5sYWRkcikgfHwKLQkgICAgbmxhX3B1dChza2IsIElGTEFfR1JFX1JFTU9URSwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksICZwLT5yYWRkcikgfHwKKwkgICAgbmxhX3B1dF9pbjZfYWRkcihza2IsIElGTEFfR1JFX0xPQ0FMLCAmcC0+bGFkZHIpIHx8CisJICAgIG5sYV9wdXRfaW42X2FkZHIoc2tiLCBJRkxBX0dSRV9SRU1PVEUsICZwLT5yYWRkcikgfHwKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfR1JFX1RUTCwgcC0+aG9wX2xpbWl0KSB8fAogCSAgICAvKm5sYV9wdXRfdTgoc2tiLCBJRkxBX0dSRV9UT1MsIHQtPnByaW9yaXR5KSB8fCovCiAJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0dSRV9FTkNBUF9MSU1JVCwgcC0+ZW5jYXBfbGltaXQpIHx8CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfaW5wdXQuYyBiL25ldC9pcHY2L2lwNl9pbnB1dC5jCmluZGV4IGFhY2RjYjQuLmYyZTQ2NGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9pbnB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9pbnB1dC5jCkBAIC00Niw4ICs0Niw3IEBACiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KICNpbmNsdWRlIDxuZXQvaW5ldF9lY24uaD4KIAotCi1pbnQgaXA2X3Jjdl9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBpcDZfcmN2X2ZpbmlzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKHN5c2N0bF9pcF9lYXJseV9kZW11eCAmJiAhc2tiX2RzdChza2IpICYmIHNrYi0+c2sgPT0gTlVMTCkgewogCQljb25zdCBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgKmlwcHJvdDsKQEAgLTE4Myw3ICsxODIsOCBAQAogCS8qIE11c3QgZHJvcCBzb2NrZXQgbm93IGJlY2F1c2Ugb2YgdHByb3h5LiAqLwogCXNrYl9vcnBoYW4oc2tiKTsKIAotCXJldHVybiBORl9IT09LKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9QUkVfUk9VVElORywgc2tiLCBkZXYsIE5VTEwsCisJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX1BSRV9ST1VUSU5HLCBOVUxMLCBza2IsCisJCSAgICAgICBkZXYsIE5VTEwsCiAJCSAgICAgICBpcDZfcmN2X2ZpbmlzaCk7CiBlcnI6CiAJSVA2X0lOQ19TVEFUU19CSChuZXQsIGlkZXYsIElQU1RBVFNfTUlCX0lOSERSRVJST1JTKTsKQEAgLTE5OCw3ICsxOTgsNyBAQAogICovCiAKIAotc3RhdGljIGludCBpcDZfaW5wdXRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IGlwNl9pbnB1dF9maW5pc2goc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiX2RzdChza2IpLT5kZXYpOwogCWNvbnN0IHN0cnVjdCBpbmV0Nl9wcm90b2NvbCAqaXBwcm90OwpAQCAtMjIxLDcgKzIyMSw3IEBACiAKIAlyYXcgPSByYXc2X2xvY2FsX2RlbGl2ZXIoc2tiLCBuZXh0aGRyKTsKIAlpcHByb3QgPSByY3VfZGVyZWZlcmVuY2UoaW5ldDZfcHJvdG9zW25leHRoZHJdKTsKLQlpZiAoaXBwcm90ICE9IE5VTEwpIHsKKwlpZiAoaXBwcm90KSB7CiAJCWludCByZXQ7CiAKIAkJaWYgKGlwcHJvdC0+ZmxhZ3MgJiBJTkVUNl9QUk9UT19GSU5BTCkgewpAQCAtMjc3LDcgKzI3Nyw4IEBACiAKIGludCBpcDZfaW5wdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfSU4sIHNrYiwgc2tiLT5kZXYsIE5VTEwsCisJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX0xPQ0FMX0lOLCBOVUxMLCBza2IsCisJCSAgICAgICBza2ItPmRldiwgTlVMTCwKIAkJICAgICAgIGlwNl9pbnB1dF9maW5pc2gpOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfb2ZmbG9hZC5jIGIvbmV0L2lwdjYvaXA2X29mZmxvYWQuYwppbmRleCA0NmQ0NTJhLi5lODkzY2QxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfb2ZmbG9hZC5jCisrKyBiL25ldC9pcHY2L2lwNl9vZmZsb2FkLmMKQEAgLTEyNCw3ICsxMjQsNyBAQAogCQkJdW5mcmFnX2lwNmhsZW4gPSBpcDZfZmluZF8xc3RmcmFnb3B0KHNrYiwgJnByZXZoZHIpOwogCQkJZnB0ciA9IChzdHJ1Y3QgZnJhZ19oZHIgKikoKHU4ICopaXB2NmggKyB1bmZyYWdfaXA2aGxlbik7CiAJCQlmcHRyLT5mcmFnX29mZiA9IGh0b25zKG9mZnNldCk7Ci0JCQlpZiAoc2tiLT5uZXh0ICE9IE5VTEwpCisJCQlpZiAoc2tiLT5uZXh0KQogCQkJCWZwdHItPmZyYWdfb2ZmIHw9IGh0b25zKElQNl9NRik7CiAJCQlvZmZzZXQgKz0gKG50b2hzKGlwdjZoLT5wYXlsb2FkX2xlbikgLQogCQkJCSAgIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl9vdXRwdXQuYyBiL25ldC9pcHY2L2lwNl9vdXRwdXQuYwppbmRleCAwYTA0YTM3Li43ZmRlMWYyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCkBAIC01Niw3ICs1Niw3IEBACiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bGludXgvbXJvdXRlNi5oPgogCi1zdGF0aWMgaW50IGlwNl9maW5pc2hfb3V0cHV0MihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBpcDZfZmluaXNoX291dHB1dDIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZHN0LT5kZXY7CkBAIC03MCw3ICs3MCw3IEBACiAJaWYgKGlwdjZfYWRkcl9pc19tdWx0aWNhc3QoJmlwdjZfaGRyKHNrYiktPmRhZGRyKSkgewogCQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaXA2X2RzdF9pZGV2KHNrYl9kc3Qoc2tiKSk7CiAKLQkJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgJiYgc2tfbWNfbG9vcChza2ItPnNrKSAmJgorCQlpZiAoIShkZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSAmJiBza19tY19sb29wKHNrKSAmJgogCQkgICAgKChtcm91dGU2X3NvY2tldChkZXZfbmV0KGRldiksIHNrYikgJiYKIAkJICAgICAhKElQNkNCKHNrYiktPmZsYWdzICYgSVA2U0tCX0ZPUldBUkRFRCkpIHx8CiAJCSAgICAgaXB2Nl9jaGtfbWNhc3RfYWRkcihkZXYsICZpcHY2X2hkcihza2IpLT5kYWRkciwKQEAgLTgyLDcgKzgyLDcgQEAKIAkJCSAqLwogCQkJaWYgKG5ld3NrYikKIAkJCQlORl9IT09LKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9QT1NUX1JPVVRJTkcsCi0JCQkJCW5ld3NrYiwgTlVMTCwgbmV3c2tiLT5kZXYsCisJCQkJCXNrLCBuZXdza2IsIE5VTEwsIG5ld3NrYi0+ZGV2LAogCQkJCQlkZXZfbG9vcGJhY2tfeG1pdCk7CiAKIAkJCWlmIChpcHY2X2hkcihza2IpLT5ob3BfbGltaXQgPT0gMCkgewpAQCAtMTIyLDE0ICsxMjIsMTQgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBpcDZfZmluaXNoX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBpcDZfZmluaXNoX291dHB1dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaWYgKChza2ItPmxlbiA+IGlwNl9za2JfZHN0X210dShza2IpICYmICFza2JfaXNfZ3NvKHNrYikpIHx8CiAJICAgIGRzdF9hbGxmcmFnKHNrYl9kc3Qoc2tiKSkgfHwKIAkgICAgKElQNkNCKHNrYiktPmZyYWdfbWF4X3NpemUgJiYgc2tiLT5sZW4gPiBJUDZDQihza2IpLT5mcmFnX21heF9zaXplKSkKLQkJcmV0dXJuIGlwNl9mcmFnbWVudChza2IsIGlwNl9maW5pc2hfb3V0cHV0Mik7CisJCXJldHVybiBpcDZfZnJhZ21lbnQoc2ssIHNrYiwgaXA2X2ZpbmlzaF9vdXRwdXQyKTsKIAllbHNlCi0JCXJldHVybiBpcDZfZmluaXNoX291dHB1dDIoc2tiKTsKKwkJcmV0dXJuIGlwNl9maW5pc2hfb3V0cHV0Mihzaywgc2tiKTsKIH0KIAogaW50IGlwNl9vdXRwdXQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTQzLDcgKzE0Myw4IEBACiAJCXJldHVybiAwOwogCX0KIAotCXJldHVybiBORl9IT09LX0NPTkQoTkZQUk9UT19JUFY2LCBORl9JTkVUX1BPU1RfUk9VVElORywgc2tiLCBOVUxMLCBkZXYsCisJcmV0dXJuIE5GX0hPT0tfQ09ORChORlBST1RPX0lQVjYsIE5GX0lORVRfUE9TVF9ST1VUSU5HLCBzaywgc2tiLAorCQkJICAgIE5VTEwsIGRldiwKIAkJCSAgICBpcDZfZmluaXNoX291dHB1dCwKIAkJCSAgICAhKElQNkNCKHNrYiktPmZsYWdzICYgSVA2U0tCX1JFUk9VVEVEKSk7CiB9CkBAIC0xNzcsNyArMTc4LDcgQEAKIAogCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBoZWFkX3Jvb20pIHsKIAkJCXN0cnVjdCBza19idWZmICpza2IyID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBoZWFkX3Jvb20pOwotCQkJaWYgKHNrYjIgPT0gTlVMTCkgeworCQkJaWYgKCFza2IyKSB7CiAJCQkJSVA2X0lOQ19TVEFUUyhuZXQsIGlwNl9kc3RfaWRldihza2JfZHN0KHNrYikpLAogCQkJCQkgICAgICBJUFNUQVRTX01JQl9PVVRESVNDQVJEUyk7CiAJCQkJa2ZyZWVfc2tiKHNrYik7CkBAIC0yMjMsOCArMjI0LDggQEAKIAlpZiAoKHNrYi0+bGVuIDw9IG10dSkgfHwgc2tiLT5pZ25vcmVfZGYgfHwgc2tiX2lzX2dzbyhza2IpKSB7CiAJCUlQNl9VUERfUE9fU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoc2tiX2RzdChza2IpKSwKIAkJCSAgICAgIElQU1RBVFNfTUlCX09VVCwgc2tiLT5sZW4pOwotCQlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfT1VULCBza2IsIE5VTEwsCi0JCQkgICAgICAgZHN0LT5kZXYsIGRzdF9vdXRwdXQpOworCQlyZXR1cm4gTkZfSE9PSyhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfT1VULCBzaywgc2tiLAorCQkJICAgICAgIE5VTEwsIGRzdC0+ZGV2LCBkc3Rfb3V0cHV0X3NrKTsKIAl9CiAKIAlza2ItPmRldiA9IGRzdC0+ZGV2OwpAQCAtMzE2LDkgKzMxNywxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBpcDZfZm9yd2FyZF9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgaW50IGlwNl9mb3J3YXJkX2ZpbmlzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIGRzdF9vdXRwdXQoc2tiKTsKKwlza2Jfc2VuZGVyX2NwdV9jbGVhcihza2IpOworCXJldHVybiBkc3Rfb3V0cHV0X3NrKHNrLCBza2IpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlwNl9kc3RfbXR1X2ZvcndhcmQoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQpAQCAtNTEwLDcgKzUxMiw4IEBACiAKIAlJUDZfSU5DX1NUQVRTX0JIKG5ldCwgaXA2X2RzdF9pZGV2KGRzdCksIElQU1RBVFNfTUlCX09VVEZPUldEQVRBR1JBTVMpOwogCUlQNl9BRERfU1RBVFNfQkgobmV0LCBpcDZfZHN0X2lkZXYoZHN0KSwgSVBTVEFUU19NSUJfT1VUT0NURVRTLCBza2ItPmxlbik7Ci0JcmV0dXJuIE5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX0ZPUldBUkQsIHNrYiwgc2tiLT5kZXYsIGRzdC0+ZGV2LAorCXJldHVybiBORl9IT09LKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9GT1JXQVJELCBOVUxMLCBza2IsCisJCSAgICAgICBza2ItPmRldiwgZHN0LT5kZXYsCiAJCSAgICAgICBpcDZfZm9yd2FyZF9maW5pc2gpOwogCiBlcnJvcjoKQEAgLTUzNywxMSArNTQwLDEzIEBACiAJc2tiX2NvcHlfc2VjbWFyayh0bywgZnJvbSk7CiB9CiAKLWludCBpcDZfZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50ICgqb3V0cHV0KShzdHJ1Y3Qgc2tfYnVmZiAqKSkKK2ludCBpcDZfZnJhZ21lbnQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgaW50ICgqb3V0cHV0KShzdHJ1Y3Qgc29jayAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqZnJhZzsKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gKHN0cnVjdCBydDZfaW5mbyAqKXNrYl9kc3Qoc2tiKTsKLQlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBza2ItPnNrID8gaW5ldDZfc2soc2tiLT5zaykgOiBOVUxMOworCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IHNrYi0+c2sgJiYgIWRldl9yZWN1cnNpb25fbGV2ZWwoKSA/CisJCQkJaW5ldDZfc2soc2tiLT5zaykgOiBOVUxMOwogCXN0cnVjdCBpcHY2aGRyICp0bXBfaGRyOwogCXN0cnVjdCBmcmFnX2hkciAqZmg7CiAJdW5zaWduZWQgaW50IG10dSwgaGxlbiwgbGVmdCwgbGVuOwpAQCAtNjI3LDcgKzYzMiw3IEBACiAJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCQltZW1jcHkoc2tiX25ldHdvcmtfaGVhZGVyKHNrYiksIHRtcF9oZHIsIGhsZW4pOwogCi0JCWlwdjZfc2VsZWN0X2lkZW50KGZoLCBydCk7CisJCWlwdjZfc2VsZWN0X2lkZW50KG5ldCwgZmgsIHJ0KTsKIAkJZmgtPm5leHRoZHIgPSBuZXh0aGRyOwogCQlmaC0+cmVzZXJ2ZWQgPSAwOwogCQlmaC0+ZnJhZ19vZmYgPSBodG9ucyhJUDZfTUYpOwpAQCAtNjU2LDcgKzY2MSw3IEBACiAJCQkJZmgtPm5leHRoZHIgPSBuZXh0aGRyOwogCQkJCWZoLT5yZXNlcnZlZCA9IDA7CiAJCQkJZmgtPmZyYWdfb2ZmID0gaHRvbnMob2Zmc2V0KTsKLQkJCQlpZiAoZnJhZy0+bmV4dCAhPSBOVUxMKQorCQkJCWlmIChmcmFnLT5uZXh0KQogCQkJCQlmaC0+ZnJhZ19vZmYgfD0gaHRvbnMoSVA2X01GKTsKIAkJCQlmaC0+aWRlbnRpZmljYXRpb24gPSBmcmFnX2lkOwogCQkJCWlwdjZfaGRyKGZyYWcpLT5wYXlsb2FkX2xlbiA9CkBAIC02NjUsNyArNjcwLDcgQEAKIAkJCQlpcDZfY29weV9tZXRhZGF0YShmcmFnLCBza2IpOwogCQkJfQogCi0JCQllcnIgPSBvdXRwdXQoc2tiKTsKKwkJCWVyciA9IG91dHB1dChzaywgc2tiKTsKIAkJCWlmICghZXJyKQogCQkJCUlQNl9JTkNfU1RBVFMobmV0LCBpcDZfZHN0X2lkZXYoJnJ0LT5kc3QpLAogCQkJCQkgICAgICBJUFNUQVRTX01JQl9GUkFHQ1JFQVRFUyk7CkBAIC03NzQsNyArNzc5LDcgQEAKIAkJZmgtPm5leHRoZHIgPSBuZXh0aGRyOwogCQlmaC0+cmVzZXJ2ZWQgPSAwOwogCQlpZiAoIWZyYWdfaWQpIHsKLQkJCWlwdjZfc2VsZWN0X2lkZW50KGZoLCBydCk7CisJCQlpcHY2X3NlbGVjdF9pZGVudChuZXQsIGZoLCBydCk7CiAJCQlmcmFnX2lkID0gZmgtPmlkZW50aWZpY2F0aW9uOwogCQl9IGVsc2UKIAkJCWZoLT5pZGVudGlmaWNhdGlvbiA9IGZyYWdfaWQ7CkBAIC03OTgsNyArODAzLDcgQEAKIAkJLyoKIAkJICoJUHV0IHRoaXMgZnJhZ21lbnQgaW50byB0aGUgc2VuZGluZyBxdWV1ZS4KIAkJICovCi0JCWVyciA9IG91dHB1dChmcmFnKTsKKwkJZXJyID0gb3V0cHV0KHNrLCBmcmFnKTsKIAkJaWYgKGVycikKIAkJCWdvdG8gZmFpbDsKIApAQCAtODIyLDcgKzgyNyw3IEBACiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyX2NhY2hlKQogewogCXJldHVybiAocnRfa2V5LT5wbGVuICE9IDEyOCB8fCAhaXB2Nl9hZGRyX2VxdWFsKGZsX2FkZHIsICZydF9rZXktPmFkZHIpKSAmJgotCQkoYWRkcl9jYWNoZSA9PSBOVUxMIHx8ICFpcHY2X2FkZHJfZXF1YWwoZmxfYWRkciwgYWRkcl9jYWNoZSkpOworCQkoIWFkZHJfY2FjaGUgfHwgIWlwdjZfYWRkcl9lcXVhbChmbF9hZGRyLCBhZGRyX2NhY2hlKSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICppcDZfc2tfZHN0X2NoZWNrKHN0cnVjdCBzb2NrICpzaywKQEAgLTg4MSw3ICs4ODYsNyBAQAogI2VuZGlmCiAJaW50IGVycjsKIAotCWlmICgqZHN0ID09IE5VTEwpCisJaWYgKCEqZHN0KQogCQkqZHN0ID0gaXA2X3JvdXRlX291dHB1dChuZXQsIHNrLCBmbDYpOwogCiAJZXJyID0gKCpkc3QpLT5lcnJvcjsKQEAgLTEwNDQsMTEgKzEwNDksMTEgQEAKIAkgKiB1ZHAgZGF0YWdyYW0KIAkgKi8KIAlza2IgPSBza2JfcGVla190YWlsKHF1ZXVlKTsKLQlpZiAoc2tiID09IE5VTEwpIHsKKwlpZiAoIXNrYikgewogCQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLAogCQkJaGhfbGVuICsgZnJhZ2hlYWRlcmxlbiArIHRyYW5zaGRybGVuICsgMjAsCiAJCQkoZmxhZ3MgJiBNU0dfRE9OVFdBSVQpLCAmZXJyKTsKLQkJaWYgKHNrYiA9PSBOVUxMKQorCQlpZiAoIXNrYikKIAkJCXJldHVybiBlcnI7CiAKIAkJLyogcmVzZXJ2ZSBzcGFjZSBmb3IgSGFyZHdhcmUgaGVhZGVyICovCkBAIC0xMDc4LDcgKzEwODMsNyBAQAogCXNrYl9zaGluZm8oc2tiKS0+Z3NvX3NpemUgPSAobXR1IC0gZnJhZ2hlYWRlcmxlbiAtCiAJCQkJICAgICBzaXplb2Yoc3RydWN0IGZyYWdfaGRyKSkgJiB+NzsKIAlza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlID0gU0tCX0dTT19VRFA7Ci0JaXB2Nl9zZWxlY3RfaWRlbnQoJmZoZHIsIHJ0KTsKKwlpcHY2X3NlbGVjdF9pZGVudChzb2NrX25ldChzayksICZmaGRyLCBydCk7CiAJc2tiX3NoaW5mbyhza2IpLT5pcDZfZnJhZ19pZCA9IGZoZHIuaWRlbnRpZmljYXRpb247CiAKIGFwcGVuZDoKQEAgLTExMDYsNyArMTExMSw3IEBACiAJCQkJdW5zaWduZWQgaW50IG9yaWdfbXR1KQogewogCWlmICghKHJ0LT5kc3QuZmxhZ3MgJiBEU1RfWEZSTV9UVU5ORUwpKSB7Ci0JCWlmIChza2IgPT0gTlVMTCkgeworCQlpZiAoIXNrYikgewogCQkJLyogZmlyc3QgZnJhZ21lbnQsIHJlc2VydmUgaGVhZGVyX2xlbiAqLwogCQkJKm10dSA9IG9yaWdfbXR1IC0gcnQtPmRzdC5oZWFkZXJfbGVuOwogCkBAIC0xMTM4LDcgKzExNDMsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJdjZfY29yay0+b3B0ID0ga3phbGxvYyhvcHQtPnRvdF9sZW4sIHNrLT5za19hbGxvY2F0aW9uKTsKLQkJaWYgKHVubGlrZWx5KHY2X2NvcmstPm9wdCA9PSBOVUxMKSkKKwkJaWYgKHVubGlrZWx5KCF2Nl9jb3JrLT5vcHQpKQogCQkJcmV0dXJuIC1FTk9CVUZTOwogCiAJCXY2X2NvcmstPm9wdC0+dG90X2xlbiA9IG9wdC0+dG90X2xlbjsKQEAgLTEzMzAsNyArMTMzNSw3IEBACiAJCQllbHNlCiAJCQkJZnJhZ2dhcCA9IDA7CiAJCQkvKiB1cGRhdGUgbXR1IGFuZCBtYXhmcmFnbGVuIGlmIG5lY2Vzc2FyeSAqLwotCQkJaWYgKHNrYiA9PSBOVUxMIHx8IHNrYl9wcmV2ID09IE5VTEwpCisJCQlpZiAoIXNrYiB8fCAhc2tiX3ByZXYpCiAJCQkJaXA2X2FwcGVuZF9kYXRhX210dSgmbXR1LCAmbWF4ZnJhZ2xlbiwKIAkJCQkJCSAgICBmcmFnaGVhZGVybGVuLCBza2IsIHJ0LAogCQkJCQkJICAgIG9yaWdfbXR1KTsKQEAgLTEzODIsMTAgKzEzODcsMTAgQEAKIAkJCQkJc2tiID0gc29ja193bWFsbG9jKHNrLAogCQkJCQkJCSAgIGFsbG9jbGVuICsgaGhfbGVuLCAxLAogCQkJCQkJCSAgIHNrLT5za19hbGxvY2F0aW9uKTsKLQkJCQlpZiAodW5saWtlbHkoc2tiID09IE5VTEwpKQorCQkJCWlmICh1bmxpa2VseSghc2tiKSkKIAkJCQkJZXJyID0gLUVOT0JVRlM7CiAJCQl9Ci0JCQlpZiAoc2tiID09IE5VTEwpCisJCQlpZiAoIXNrYikKIAkJCQlnb3RvIGVycm9yOwogCQkJLyoKIAkJCSAqCUZpbGwgaW4gdGhlIGNvbnRyb2wgc3RydWN0dXJlcwpAQCAtMTU3Nyw3ICsxNTgyLDcgQEAKIAl1bnNpZ25lZCBjaGFyIHByb3RvID0gZmw2LT5mbG93aTZfcHJvdG87CiAKIAlza2IgPSBfX3NrYl9kZXF1ZXVlKHF1ZXVlKTsKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCWdvdG8gb3V0OwogCXRhaWxfc2tiID0gJihza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl90dW5uZWwuYyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwppbmRleCAyNjZhMjY0Li41Y2FmZDkyIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCkBAIC02NCwxMiArNjQsNiBAQAogTU9EVUxFX0FMSUFTX1JUTkxfTElOSygiaXA2dG5sIik7CiBNT0RVTEVfQUxJQVNfTkVUREVWKCJpcDZ0bmwwIik7CiAKLSNpZmRlZiBJUDZfVE5MX0RFQlVHCi0jZGVmaW5lIElQNl9UTkxfVFJBQ0UoeC4uLikgcHJfZGVidWcoIiVzOiIgeCAiXG4iLCBfX2Z1bmNfXykKLSNlbHNlCi0jZGVmaW5lIElQNl9UTkxfVFJBQ0UoeC4uLikgZG8gezt9IHdoaWxlKDApCi0jZW5kaWYKLQogI2RlZmluZSBIQVNIX1NJWkVfU0hJRlQgIDUKICNkZWZpbmUgSEFTSF9TSVpFICgxIDw8IEhBU0hfU0laRV9TSElGVCkKIApAQCAtMTM3LDcgKzEzMSw3IEBACiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gdC0+ZHN0X2NhY2hlOwogCiAJaWYgKGRzdCAmJiBkc3QtPm9ic29sZXRlICYmCi0JICAgIGRzdC0+b3BzLT5jaGVjayhkc3QsIHQtPmRzdF9jb29raWUpID09IE5VTEwpIHsKKwkgICAgIWRzdC0+b3BzLT5jaGVjayhkc3QsIHQtPmRzdF9jb29raWUpKSB7CiAJCXQtPmRzdF9jYWNoZSA9IE5VTEw7CiAJCWRzdF9yZWxlYXNlKGRzdCk7CiAJCXJldHVybiBOVUxMOwpAQCAtMzE0LDcgKzMwOCw3IEBACiAgKiAgIENyZWF0ZSB0dW5uZWwgbWF0Y2hpbmcgZ2l2ZW4gcGFyYW1ldGVycy4KICAqCiAgKiBSZXR1cm46Ci0gKiAgIGNyZWF0ZWQgdHVubmVsIG9yIE5VTEwKKyAqICAgY3JlYXRlZCB0dW5uZWwgb3IgZXJyb3IgcG9pbnRlcgogICoqLwogCiBzdGF0aWMgc3RydWN0IGlwNl90bmwgKmlwNl90bmxfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IF9faXA2X3RubF9wYXJtICpwKQpAQCAtMzIyLDcgKzMxNiw3IEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgaXA2X3RubCAqdDsKIAljaGFyIG5hbWVbSUZOQU1TSVpdOwotCWludCBlcnI7CisJaW50IGVyciA9IC1FTk9NRU07CiAKIAlpZiAocC0+bmFtZVswXSkKIAkJc3RybGNweShuYW1lLCBwLT5uYW1lLCBJRk5BTVNJWik7CkBAIC0zMzEsNyArMzI1LDcgQEAKIAogCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnQpLCBuYW1lLCBORVRfTkFNRV9VTktOT1dOLAogCQkJICAgaXA2X3RubF9kZXZfc2V0dXApOwotCWlmIChkZXYgPT0gTlVMTCkKKwlpZiAoIWRldikKIAkJZ290byBmYWlsZWQ7CiAKIAlkZXZfbmV0X3NldChkZXYsIG5ldCk7CkBAIC0zNDgsNyArMzQyLDcgQEAKIGZhaWxlZF9mcmVlOgogCWlwNl9kZXZfZnJlZShkZXYpOwogZmFpbGVkOgotCXJldHVybiBOVUxMOworCXJldHVybiBFUlJfUFRSKGVycik7CiB9CiAKIC8qKgpAQCAtMzYyLDcgKzM1Niw3IEBACiAgKiAgIHR1bm5lbCBkZXZpY2UgaXMgY3JlYXRlZCBhbmQgcmVnaXN0ZXJlZCBmb3IgdXNlLgogICoKICAqIFJldHVybjoKLSAqICAgbWF0Y2hpbmcgdHVubmVsIG9yIE5VTEwKKyAqICAgbWF0Y2hpbmcgdHVubmVsIG9yIGVycm9yIHBvaW50ZXIKICAqKi8KIAogc3RhdGljIHN0cnVjdCBpcDZfdG5sICppcDZfdG5sX2xvY2F0ZShzdHJ1Y3QgbmV0ICpuZXQsCkBAIC0zODAsMTMgKzM3NCwxMyBAQAogCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKGxvY2FsLCAmdC0+cGFybXMubGFkZHIpICYmCiAJCSAgICBpcHY2X2FkZHJfZXF1YWwocmVtb3RlLCAmdC0+cGFybXMucmFkZHIpKSB7CiAJCQlpZiAoY3JlYXRlKQotCQkJCXJldHVybiBOVUxMOworCQkJCXJldHVybiBFUlJfUFRSKC1FRVhJU1QpOwogCiAJCQlyZXR1cm4gdDsKIAkJfQogCX0KIAlpZiAoIWNyZWF0ZSkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwogCXJldHVybiBpcDZfdG5sX2NyZWF0ZShuZXQsIHApOwogfQogCkBAIC01MDIsNyArNDk2LDcgQEAKIAogCXJjdV9yZWFkX2xvY2soKTsKIAl0ID0gaXA2X3RubF9sb29rdXAoZGV2X25ldChza2ItPmRldiksICZpcHY2aC0+ZGFkZHIsICZpcHY2aC0+c2FkZHIpOwotCWlmICh0ID09IE5VTEwpCisJaWYgKCF0KQogCQlnb3RvIG91dDsKIAogCXRwcm90byA9IEFDQ0VTU19PTkNFKHQtPnBhcm1zLnByb3RvKTsKQEAgLTgxMyw3ICs4MDcsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCXQgPSBpcDZfdG5sX2xvb2t1cChkZXZfbmV0KHNrYi0+ZGV2KSwgJmlwdjZoLT5zYWRkciwgJmlwdjZoLT5kYWRkcik7Ci0JaWYgKHQgIT0gTlVMTCkgeworCWlmICh0KSB7CiAJCXN0cnVjdCBwY3B1X3N3X25ldHN0YXRzICp0c3RhdHM7CiAKIAkJdHByb3RvID0gQUNDRVNTX09OQ0UodC0+cGFybXMucHJvdG8pOwpAQCAtMTEwNiw3ICsxMTAwLDcgQEAKIAlpcHY2aC0+bmV4dGhkciA9IHByb3RvOwogCWlwdjZoLT5zYWRkciA9IGZsNi0+c2FkZHI7CiAJaXB2NmgtPmRhZGRyID0gZmw2LT5kYWRkcjsKLQlpcDZ0dW5uZWxfeG1pdChza2IsIGRldik7CisJaXA2dHVubmVsX3htaXQoTlVMTCwgc2tiLCBkZXYpOwogCWlmIChuZHN0KQogCQlpcDZfdG5sX2RzdF9zdG9yZSh0LCBuZHN0KTsKIAlyZXR1cm4gMDsKQEAgLTEyNzAsOCArMTI2NCw2IEBACiAJZWxzZQogCQlkZXYtPmZsYWdzICY9IH5JRkZfUE9JTlRPUE9JTlQ7CiAKLQlkZXYtPmlmbGluayA9IHAtPmxpbms7Ci0KIAlpZiAocC0+ZmxhZ3MgJiBJUDZfVE5MX0ZfQ0FQX1hNSVQpIHsKIAkJaW50IHN0cmljdCA9IChpcHY2X2FkZHJfdHlwZSgmcC0+cmFkZHIpICYKIAkJCSAgICAgIChJUFY2X0FERFJfTVVMVElDQVNUfElQVjZfQUREUl9MSU5LTE9DQUwpKTsKQEAgLTEyODAsNyArMTI3Miw3IEBACiAJCQkJCQkgJnAtPnJhZGRyLCAmcC0+bGFkZHIsCiAJCQkJCQkgcC0+bGluaywgc3RyaWN0KTsKIAotCQlpZiAocnQgPT0gTlVMTCkKKwkJaWYgKCFydCkKIAkJCXJldHVybjsKIAogCQlpZiAocnQtPmRzdC5kZXYpIHsKQEAgLTE0MjAsNyArMTQxMiw3IEBACiAJCQl9CiAJCQlpcDZfdG5sX3Bhcm1fZnJvbV91c2VyKCZwMSwgJnApOwogCQkJdCA9IGlwNl90bmxfbG9jYXRlKG5ldCwgJnAxLCAwKTsKLQkJCWlmICh0ID09IE5VTEwpCisJCQlpZiAoSVNfRVJSKHQpKQogCQkJCXQgPSBuZXRkZXZfcHJpdihkZXYpOwogCQl9IGVsc2UgewogCQkJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOwpAQCAtMTQ0NSw3ICsxNDM3LDcgQEAKIAkJaXA2X3RubF9wYXJtX2Zyb21fdXNlcigmcDEsICZwKTsKIAkJdCA9IGlwNl90bmxfbG9jYXRlKG5ldCwgJnAxLCBjbWQgPT0gU0lPQ0FERFRVTk5FTCk7CiAJCWlmIChjbWQgPT0gU0lPQ0NIR1RVTk5FTCkgewotCQkJaWYgKHQgIT0gTlVMTCkgeworCQkJaWYgKCFJU19FUlIodCkpIHsKIAkJCQlpZiAodC0+ZGV2ICE9IGRldikgewogCQkJCQllcnIgPSAtRUVYSVNUOwogCQkJCQlicmVhazsKQEAgLTE0NTcsMTQgKzE0NDksMTUgQEAKIAkJCWVsc2UKIAkJCQllcnIgPSBpcDZfdG5sX3VwZGF0ZSh0LCAmcDEpOwogCQl9Ci0JCWlmICh0KSB7CisJCWlmICghSVNfRVJSKHQpKSB7CiAJCQllcnIgPSAwOwogCQkJaXA2X3RubF9wYXJtX3RvX3VzZXIoJnAsICZ0LT5wYXJtcyk7CiAJCQlpZiAoY29weV90b191c2VyKGlmci0+aWZyX2lmcnUuaWZydV9kYXRhLCAmcCwgc2l6ZW9mKHApKSkKIAkJCQllcnIgPSAtRUZBVUxUOwogCi0JCX0gZWxzZQotCQkJZXJyID0gKGNtZCA9PSBTSU9DQUREVFVOTkVMID8gLUVOT0JVRlMgOiAtRU5PRU5UKTsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IFBUUl9FUlIodCk7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBTSU9DREVMVFVOTkVMOgogCQllcnIgPSAtRVBFUk07CkBAIC0xNDc4LDcgKzE0NzEsNyBAQAogCQkJZXJyID0gLUVOT0VOVDsKIAkJCWlwNl90bmxfcGFybV9mcm9tX3VzZXIoJnAxLCAmcCk7CiAJCQl0ID0gaXA2X3RubF9sb2NhdGUobmV0LCAmcDEsIDApOwotCQkJaWYgKHQgPT0gTlVMTCkKKwkJCWlmIChJU19FUlIodCkpCiAJCQkJYnJlYWs7CiAJCQllcnIgPSAtRVBFUk07CiAJCQlpZiAodC0+ZGV2ID09IGlwNm4tPmZiX3RubF9kZXYpCkBAIC0xNTIyLDYgKzE1MTUsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGlwNl90bmxfZ2V0X2lmbGluayhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpcDZfdG5sICp0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXJldHVybiB0LT5wYXJtcy5saW5rOworfQorRVhQT1JUX1NZTUJPTChpcDZfdG5sX2dldF9pZmxpbmspOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGlwNl90bmxfbmV0ZGV2X29wcyA9IHsKIAkubmRvX2luaXQJPSBpcDZfdG5sX2Rldl9pbml0LApAQCAtMTUzMCw2ICsxNTMwLDcgQEAKIAkubmRvX2RvX2lvY3RsCT0gaXA2X3RubF9pb2N0bCwKIAkubmRvX2NoYW5nZV9tdHUgPSBpcDZfdG5sX2NoYW5nZV9tdHUsCiAJLm5kb19nZXRfc3RhdHMJPSBpcDZfZ2V0X3N0YXRzLAorCS5uZG9fZ2V0X2lmbGluayA9IGlwNl90bmxfZ2V0X2lmbGluaywKIH07CiAKIApAQCAtMTY0NSwxMiArMTY0NiwxMCBAQAogCQlwYXJtcy0+bGluayA9IG5sYV9nZXRfdTMyKGRhdGFbSUZMQV9JUFRVTl9MSU5LXSk7CiAKIAlpZiAoZGF0YVtJRkxBX0lQVFVOX0xPQ0FMXSkKLQkJbmxhX21lbWNweSgmcGFybXMtPmxhZGRyLCBkYXRhW0lGTEFfSVBUVU5fTE9DQUxdLAotCQkJICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlwYXJtcy0+bGFkZHIgPSBubGFfZ2V0X2luNl9hZGRyKGRhdGFbSUZMQV9JUFRVTl9MT0NBTF0pOwogCiAJaWYgKGRhdGFbSUZMQV9JUFRVTl9SRU1PVEVdKQotCQlubGFfbWVtY3B5KCZwYXJtcy0+cmFkZHIsIGRhdGFbSUZMQV9JUFRVTl9SRU1PVEVdLAotCQkJICAgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlwYXJtcy0+cmFkZHIgPSBubGFfZ2V0X2luNl9hZGRyKGRhdGFbSUZMQV9JUFRVTl9SRU1PVEVdKTsKIAogCWlmIChkYXRhW0lGTEFfSVBUVU5fVFRMXSkKIAkJcGFybXMtPmhvcF9saW1pdCA9IG5sYV9nZXRfdTgoZGF0YVtJRkxBX0lQVFVOX1RUTF0pOwpAQCAtMTY3MiwxMiArMTY3MSwxMyBAQAogCQkJICAgc3RydWN0IG5sYXR0ciAqdGJbXSwgc3RydWN0IG5sYXR0ciAqZGF0YVtdKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKLQlzdHJ1Y3QgaXA2X3RubCAqbnQ7CisJc3RydWN0IGlwNl90bmwgKm50LCAqdDsKIAogCW50ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpcDZfdG5sX25ldGxpbmtfcGFybXMoZGF0YSwgJm50LT5wYXJtcyk7CiAKLQlpZiAoaXA2X3RubF9sb2NhdGUobmV0LCAmbnQtPnBhcm1zLCAwKSkKKwl0ID0gaXA2X3RubF9sb2NhdGUobmV0LCAmbnQtPnBhcm1zLCAwKTsKKwlpZiAoIUlTX0VSUih0KSkKIAkJcmV0dXJuIC1FRVhJU1Q7CiAKIAlyZXR1cm4gaXA2X3RubF9jcmVhdGUyKGRldik7CkBAIC0xNjk3LDggKzE2OTcsNyBAQAogCWlwNl90bmxfbmV0bGlua19wYXJtcyhkYXRhLCAmcCk7CiAKIAl0ID0gaXA2X3RubF9sb2NhdGUobmV0LCAmcCwgMCk7Ci0KLQlpZiAodCkgeworCWlmICghSVNfRVJSKHQpKSB7CiAJCWlmICh0LT5kZXYgIT0gZGV2KQogCQkJcmV0dXJuIC1FRVhJU1Q7CiAJfSBlbHNlCkBAIC0xNzQ0LDEwICsxNzQzLDggQEAKIAlzdHJ1Y3QgX19pcDZfdG5sX3Bhcm0gKnBhcm0gPSAmdHVubmVsLT5wYXJtczsKIAogCWlmIChubGFfcHV0X3UzMihza2IsIElGTEFfSVBUVU5fTElOSywgcGFybS0+bGluaykgfHwKLQkgICAgbmxhX3B1dChza2IsIElGTEFfSVBUVU5fTE9DQUwsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAotCQkgICAgJnBhcm0tPmxhZGRyKSB8fAotCSAgICBubGFfcHV0KHNrYiwgSUZMQV9JUFRVTl9SRU1PVEUsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAotCQkgICAgJnBhcm0tPnJhZGRyKSB8fAorCSAgICBubGFfcHV0X2luNl9hZGRyKHNrYiwgSUZMQV9JUFRVTl9MT0NBTCwgJnBhcm0tPmxhZGRyKSB8fAorCSAgICBubGFfcHV0X2luNl9hZGRyKHNrYiwgSUZMQV9JUFRVTl9SRU1PVEUsICZwYXJtLT5yYWRkcikgfHwKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfSVBUVU5fVFRMLCBwYXJtLT5ob3BfbGltaXQpIHx8CiAJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0lQVFVOX0VOQ0FQX0xJTUlULCBwYXJtLT5lbmNhcF9saW1pdCkgfHwKIAkgICAgbmxhX3B1dF9iZTMyKHNrYiwgSUZMQV9JUFRVTl9GTE9XSU5GTywgcGFybS0+Zmxvd2luZm8pIHx8CkBAIC0xODIwLDcgKzE4MTcsNyBAQAogCiAJZm9yIChoID0gMDsgaCA8IEhBU0hfU0laRTsgaCsrKSB7CiAJCXQgPSBydG5sX2RlcmVmZXJlbmNlKGlwNm4tPnRubHNfcl9sW2hdKTsKLQkJd2hpbGUgKHQgIT0gTlVMTCkgeworCQl3aGlsZSAodCkgewogCQkJLyogSWYgZGV2IGlzIGluIHRoZSBzYW1lIG5ldG5zLCBpdCBoYXMgYWxyZWFkeQogCQkJICogYmVlbiBhZGRlZCB0byB0aGUgbGlzdCBieSB0aGUgcHJldmlvdXMgbG9vcC4KIAkJCSAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X3VkcF90dW5uZWwuYyBiL25ldC9pcHY2L2lwNl91ZHBfdHVubmVsLmMKaW5kZXggMzJkOWIyNi4uYmJhODkwMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3VkcF90dW5uZWwuYworKysgYi9uZXQvaXB2Ni9pcDZfdWRwX3R1bm5lbC5jCkBAIC02Miw3ICs2Miw4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1ZHBfc29ja19jcmVhdGU2KTsKIAotaW50IHVkcF90dW5uZWw2X3htaXRfc2tiKHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2ludCB1ZHBfdHVubmVsNl94bWl0X3NrYihzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHN0cnVjdCBzb2NrICpzaywKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsCiAJCQkgc3RydWN0IGluNl9hZGRyICpkYWRkciwKIAkJCSBfX3U4IHByaW8sIF9fdTggdHRsLCBfX2JlMTYgc3JjX3BvcnQsCkBAIC05Nyw3ICs5OCw3IEBACiAJaXA2aC0+ZGFkZHIJICA9ICpkYWRkcjsKIAlpcDZoLT5zYWRkcgkgID0gKnNhZGRyOwogCi0JaXA2dHVubmVsX3htaXQoc2tiLCBkZXYpOworCWlwNnR1bm5lbF94bWl0KHNrLCBza2IsIGRldik7CiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh1ZHBfdHVubmVsNl94bWl0X3NrYik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfdnRpLmMgYi9uZXQvaXB2Ni9pcDZfdnRpLmMKaW5kZXggNWZiOWUyMS4uZWQ5ZDY4MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXA2X3Z0aS5jCisrKyBiL25ldC9pcHY2L2lwNl92dGkuYwpAQCAtMjE4LDcgKzIxOCw3IEBACiAJCXNwcmludGYobmFtZSwgImlwNl92dGklJWQiKTsKIAogCWRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnQpLCBuYW1lLCBORVRfTkFNRV9VTktOT1dOLCB2dGk2X2Rldl9zZXR1cCk7Ci0JaWYgKGRldiA9PSBOVUxMKQorCWlmICghZGV2KQogCQlnb3RvIGZhaWxlZDsKIAogCWRldl9uZXRfc2V0KGRldiwgbmV0KTsKQEAgLTI4OCw4ICsyODgsNyBAQAogc3RhdGljIHZvaWQgdnRpNl9kZXZfdW5pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGlwNl90bmwgKnQgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKLQlzdHJ1Y3QgdnRpNl9uZXQgKmlwNm4gPSBuZXRfZ2VuZXJpYyhuZXQsIHZ0aTZfbmV0X2lkKTsKKwlzdHJ1Y3QgdnRpNl9uZXQgKmlwNm4gPSBuZXRfZ2VuZXJpYyh0LT5uZXQsIHZ0aTZfbmV0X2lkKTsKIAogCWlmIChkZXYgPT0gaXA2bi0+ZmJfdG5sX2RldikKIAkJUkNVX0lOSVRfUE9JTlRFUihpcDZuLT50bmxzX3djWzBdLCBOVUxMKTsKQEAgLTMwNSw3ICszMDQsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCXQgPSB2dGk2X3RubF9sb29rdXAoZGV2X25ldChza2ItPmRldiksICZpcHY2aC0+c2FkZHIsICZpcHY2aC0+ZGFkZHIpOwotCWlmICh0ICE9IE5VTEwpIHsKKwlpZiAodCkgewogCQlpZiAodC0+cGFybXMucHJvdG8gIT0gSVBQUk9UT19JUFY2ICYmIHQtPnBhcm1zLnByb3RvICE9IDApIHsKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJZ290byBkaXNjYXJkOwpAQCAtNjAxLDggKzYwMCw2IEBACiAJCWRldi0+ZmxhZ3MgfD0gSUZGX1BPSU5UT1BPSU5UOwogCWVsc2UKIAkJZGV2LT5mbGFncyAmPSB+SUZGX1BPSU5UT1BPSU5UOwotCi0JZGV2LT5pZmxpbmsgPSBwLT5saW5rOwogfQogCiAvKioKQEAgLTcxNiw3ICs3MTMsNyBAQAogCQl9IGVsc2UgewogCQkJbWVtc2V0KCZwLCAwLCBzaXplb2YocCkpOwogCQl9Ci0JCWlmICh0ID09IE5VTEwpCisJCWlmICghdCkKIAkJCXQgPSBuZXRkZXZfcHJpdihkZXYpOwogCQl2dGk2X3Bhcm1fdG9fdXNlcigmcCwgJnQtPnBhcm1zKTsKIAkJaWYgKGNvcHlfdG9fdXNlcihpZnItPmlmcl9pZnJ1LmlmcnVfZGF0YSwgJnAsIHNpemVvZihwKSkpCkBAIC03MzYsNyArNzMzLDcgQEAKIAkJdnRpNl9wYXJtX2Zyb21fdXNlcigmcDEsICZwKTsKIAkJdCA9IHZ0aTZfbG9jYXRlKG5ldCwgJnAxLCBjbWQgPT0gU0lPQ0FERFRVTk5FTCk7CiAJCWlmIChkZXYgIT0gaXA2bi0+ZmJfdG5sX2RldiAmJiBjbWQgPT0gU0lPQ0NIR1RVTk5FTCkgewotCQkJaWYgKHQgIT0gTlVMTCkgeworCQkJaWYgKHQpIHsKIAkJCQlpZiAodC0+ZGV2ICE9IGRldikgewogCQkJCQllcnIgPSAtRUVYSVNUOwogCQkJCQlicmVhazsKQEAgLTc2Nyw3ICs3NjQsNyBAQAogCQkJZXJyID0gLUVOT0VOVDsKIAkJCXZ0aTZfcGFybV9mcm9tX3VzZXIoJnAxLCAmcCk7CiAJCQl0ID0gdnRpNl9sb2NhdGUobmV0LCAmcDEsIDApOwotCQkJaWYgKHQgPT0gTlVMTCkKKwkJCWlmICghdCkKIAkJCQlicmVhazsKIAkJCWVyciA9IC1FUEVSTTsKIAkJCWlmICh0LT5kZXYgPT0gaXA2bi0+ZmJfdG5sX2RldikKQEAgLTgwOCw2ICs4MDUsNyBAQAogCS5uZG9fZG9faW9jdGwJPSB2dGk2X2lvY3RsLAogCS5uZG9fY2hhbmdlX210dSA9IHZ0aTZfY2hhbmdlX210dSwKIAkubmRvX2dldF9zdGF0czY0ID0gaXBfdHVubmVsX2dldF9zdGF0czY0LAorCS5uZG9fZ2V0X2lmbGluayA9IGlwNl90bmxfZ2V0X2lmbGluaywKIH07CiAKIC8qKgpAQCAtODk3LDEyICs4OTUsMTAgQEAKIAkJcGFybXMtPmxpbmsgPSBubGFfZ2V0X3UzMihkYXRhW0lGTEFfVlRJX0xJTktdKTsKIAogCWlmIChkYXRhW0lGTEFfVlRJX0xPQ0FMXSkKLQkJbmxhX21lbWNweSgmcGFybXMtPmxhZGRyLCBkYXRhW0lGTEFfVlRJX0xPQ0FMXSwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJcGFybXMtPmxhZGRyID0gbmxhX2dldF9pbjZfYWRkcihkYXRhW0lGTEFfVlRJX0xPQ0FMXSk7CiAKIAlpZiAoZGF0YVtJRkxBX1ZUSV9SRU1PVEVdKQotCQlubGFfbWVtY3B5KCZwYXJtcy0+cmFkZHIsIGRhdGFbSUZMQV9WVElfUkVNT1RFXSwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJcGFybXMtPnJhZGRyID0gbmxhX2dldF9pbjZfYWRkcihkYXRhW0lGTEFfVlRJX1JFTU9URV0pOwogCiAJaWYgKGRhdGFbSUZMQV9WVElfSUtFWV0pCiAJCXBhcm1zLT5pX2tleSA9IG5sYV9nZXRfYmUzMihkYXRhW0lGTEFfVlRJX0lLRVldKTsKQEAgLTk4MywxMCArOTc5LDggQEAKIAlzdHJ1Y3QgX19pcDZfdG5sX3Bhcm0gKnBhcm0gPSAmdHVubmVsLT5wYXJtczsKIAogCWlmIChubGFfcHV0X3UzMihza2IsIElGTEFfVlRJX0xJTkssIHBhcm0tPmxpbmspIHx8Ci0JICAgIG5sYV9wdXQoc2tiLCBJRkxBX1ZUSV9MT0NBTCwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCi0JCSAgICAmcGFybS0+bGFkZHIpIHx8Ci0JICAgIG5sYV9wdXQoc2tiLCBJRkxBX1ZUSV9SRU1PVEUsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAotCQkgICAgJnBhcm0tPnJhZGRyKSB8fAorCSAgICBubGFfcHV0X2luNl9hZGRyKHNrYiwgSUZMQV9WVElfTE9DQUwsICZwYXJtLT5sYWRkcikgfHwKKwkgICAgbmxhX3B1dF9pbjZfYWRkcihza2IsIElGTEFfVlRJX1JFTU9URSwgJnBhcm0tPnJhZGRyKSB8fAogCSAgICBubGFfcHV0X2JlMzIoc2tiLCBJRkxBX1ZUSV9JS0VZLCBwYXJtLT5pX2tleSkgfHwKIAkgICAgbmxhX3B1dF9iZTMyKHNrYiwgSUZMQV9WVElfT0tFWSwgcGFybS0+b19rZXkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKQEAgLTEwMjcsNyArMTAyMSw3IEBACiAKIAlmb3IgKGggPSAwOyBoIDwgSEFTSF9TSVpFOyBoKyspIHsKIAkJdCA9IHJ0bmxfZGVyZWZlcmVuY2UoaXA2bi0+dG5sc19yX2xbaF0pOwotCQl3aGlsZSAodCAhPSBOVUxMKSB7CisJCXdoaWxlICh0KSB7CiAJCQl1bnJlZ2lzdGVyX25ldGRldmljZV9xdWV1ZSh0LT5kZXYsICZsaXN0KTsKIAkJCXQgPSBydG5sX2RlcmVmZXJlbmNlKHQtPm5leHQpOwogCQl9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZtci5jIGIvbmV0L2lwdjYvaXA2bXIuYwppbmRleCAzNGI2ODI2Li43NGNlYjczIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZtci5jCisrKyBiL25ldC9pcHY2L2lwNm1yLmMKQEAgLTU2LDkgKzU2LDcgQEAKIAogc3RydWN0IG1yNl90YWJsZSB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotI2lmZGVmIENPTkZJR19ORVRfTlMKLQlzdHJ1Y3QgbmV0CQkqbmV0OwotI2VuZGlmCisJcG9zc2libGVfbmV0X3QJCW5ldDsKIAl1MzIJCQlpZDsKIAlzdHJ1Y3Qgc29jawkJKm1yb3V0ZTZfc2s7CiAJc3RydWN0IHRpbWVyX2xpc3QJaXBtcl9leHBpcmVfdGltZXI7CkBAIC0xNzUsNyArMTczLDcgQEAKIAl9CiAKIAltcnQgPSBpcDZtcl9nZXRfdGFibGUocnVsZS0+ZnJfbmV0LCBydWxlLT50YWJsZSk7Ci0JaWYgKG1ydCA9PSBOVUxMKQorCWlmICghbXJ0KQogCQlyZXR1cm4gLUVBR0FJTjsKIAlyZXMtPm1ydCA9IG1ydDsKIAlyZXR1cm4gMDsKQEAgLTIzOSw3ICsyMzcsNyBAQAogCUlOSVRfTElTVF9IRUFEKCZuZXQtPmlwdjYubXI2X3RhYmxlcyk7CiAKIAltcnQgPSBpcDZtcl9uZXdfdGFibGUobmV0LCBSVDZfVEFCTEVfREZMVCk7Ci0JaWYgKG1ydCA9PSBOVUxMKSB7CisJaWYgKCFtcnQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBlcnIxOwogCX0KQEAgLTI1Miw3ICsyNTAsNyBAQAogCXJldHVybiAwOwogCiBlcnIyOgotCWtmcmVlKG1ydCk7CisJaXA2bXJfZnJlZV90YWJsZShtcnQpOwogZXJyMToKIAlmaWJfcnVsZXNfdW5yZWdpc3RlcihvcHMpOwogCXJldHVybiBlcnI7CkBAIC0yNjcsOCArMjY1LDggQEAKIAkJbGlzdF9kZWwoJm1ydC0+bGlzdCk7CiAJCWlwNm1yX2ZyZWVfdGFibGUobXJ0KTsKIAl9Ci0JcnRubF91bmxvY2soKTsKIAlmaWJfcnVsZXNfdW5yZWdpc3RlcihuZXQtPmlwdjYubXI2X3J1bGVzX29wcyk7CisJcnRubF91bmxvY2soKTsKIH0KICNlbHNlCiAjZGVmaW5lIGlwNm1yX2Zvcl9lYWNoX3RhYmxlKG1ydCwgbmV0KSBcCkBAIC0zMDcsMTEgKzMwNSwxMSBAQAogCXVuc2lnbmVkIGludCBpOwogCiAJbXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgaWQpOwotCWlmIChtcnQgIT0gTlVMTCkKKwlpZiAobXJ0KQogCQlyZXR1cm4gbXJ0OwogCiAJbXJ0ID0ga3phbGxvYyhzaXplb2YoKm1ydCksIEdGUF9LRVJORUwpOwotCWlmIChtcnQgPT0gTlVMTCkKKwlpZiAoIW1ydCkKIAkJcmV0dXJuIE5VTEw7CiAJbXJ0LT5pZCA9IGlkOwogCXdyaXRlX3BuZXQoJm1ydC0+bmV0LCBuZXQpOwpAQCAtMzM2LDcgKzMzNCw3IEBACiAKIHN0YXRpYyB2b2lkIGlwNm1yX2ZyZWVfdGFibGUoc3RydWN0IG1yNl90YWJsZSAqbXJ0KQogewotCWRlbF90aW1lcigmbXJ0LT5pcG1yX2V4cGlyZV90aW1lcik7CisJZGVsX3RpbWVyX3N5bmMoJm1ydC0+aXBtcl9leHBpcmVfdGltZXIpOwogCW1yb3V0ZV9jbGVhbl90YWJsZXMobXJ0KTsKIAlrZnJlZShtcnQpOwogfQpAQCAtNDEwLDcgKzQwOCw3IEBACiAJc3RydWN0IG1yNl90YWJsZSAqbXJ0OwogCiAJbXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgUlQ2X1RBQkxFX0RGTFQpOwotCWlmIChtcnQgPT0gTlVMTCkKKwlpZiAoIW1ydCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT0VOVCk7CiAKIAlpdGVyLT5tcnQgPSBtcnQ7CkBAIC00OTQsNyArNDkyLDcgQEAKIAlzdHJ1Y3QgbXI2X3RhYmxlICptcnQ7CiAKIAltcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCBSVDZfVEFCTEVfREZMVCk7Ci0JaWYgKG1ydCA9PSBOVUxMKQorCWlmICghbXJ0KQogCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKIAogCWl0LT5tcnQgPSBtcnQ7CkBAIC02NjcsNyArNjY1LDcgQEAKIAkJZGV2X2hvbGQocmVnX2Rldik7CiAJcmVhZF91bmxvY2soJm1ydF9sb2NrKTsKIAotCWlmIChyZWdfZGV2ID09IE5VTEwpCisJaWYgKCFyZWdfZGV2KQogCQlnb3RvIGRyb3A7CiAKIAlza2ItPm1hY19oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOwpAQCAtNzIwLDggKzcxOCwxNCBAQAogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKK3N0YXRpYyBpbnQgcmVnX3ZpZl9nZXRfaWZsaW5rKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcmVnX3ZpZl9uZXRkZXZfb3BzID0gewogCS5uZG9fc3RhcnRfeG1pdAk9IHJlZ192aWZfeG1pdCwKKwkubmRvX2dldF9pZmxpbmsgPSByZWdfdmlmX2dldF9pZmxpbmssCiB9OwogCiBzdGF0aWMgdm9pZCByZWdfdmlmX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC03NDUsNyArNzQ5LDcgQEAKIAkJc3ByaW50ZihuYW1lLCAicGltNnJlZyV1IiwgbXJ0LT5pZCk7CiAKIAlkZXYgPSBhbGxvY19uZXRkZXYoMCwgbmFtZSwgTkVUX05BTUVfVU5LTk9XTiwgcmVnX3ZpZl9zZXR1cCk7Ci0JaWYgKGRldiA9PSBOVUxMKQorCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKIAogCWRldl9uZXRfc2V0KGRldiwgbmV0KTsKQEAgLTc1NCw3ICs3NTgsNiBAQAogCQlmcmVlX25ldGRldihkZXYpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JZGV2LT5pZmxpbmsgPSAwOwogCiAJaWYgKGRldl9vcGVuKGRldikpCiAJCWdvdG8gZmFpbHVyZTsKQEAgLTk5NCw3ICs5OTcsNyBAQAogCXYtPnBrdF9vdXQgPSAwOwogCXYtPmxpbmsgPSBkZXYtPmlmaW5kZXg7CiAJaWYgKHYtPmZsYWdzICYgTUlGRl9SRUdJU1RFUikKLQkJdi0+bGluayA9IGRldi0+aWZsaW5rOworCQl2LT5saW5rID0gZGV2X2dldF9pZmxpbmsoZGV2KTsKIAogCS8qIEFuZCBmaW5pc2ggdXBkYXRlIHdyaXRpbmcgY3JpdGljYWwgZGF0YSAqLwogCXdyaXRlX2xvY2tfYmgoJm1ydF9sb2NrKTsKQEAgLTEwNzQsNyArMTA3Nyw3IEBACiBzdGF0aWMgc3RydWN0IG1mYzZfY2FjaGUgKmlwNm1yX2NhY2hlX2FsbG9jKHZvaWQpCiB7CiAJc3RydWN0IG1mYzZfY2FjaGUgKmMgPSBrbWVtX2NhY2hlX3phbGxvYyhtcnRfY2FjaGVwLCBHRlBfS0VSTkVMKTsKLQlpZiAoYyA9PSBOVUxMKQorCWlmICghYykKIAkJcmV0dXJuIE5VTEw7CiAJYy0+bWZjX3VuLnJlcy5taW52aWYgPSBNQVhNSUZTOwogCXJldHVybiBjOwpAQCAtMTA4Myw3ICsxMDg2LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgbWZjNl9jYWNoZSAqaXA2bXJfY2FjaGVfYWxsb2NfdW5yZXModm9pZCkKIHsKIAlzdHJ1Y3QgbWZjNl9jYWNoZSAqYyA9IGttZW1fY2FjaGVfemFsbG9jKG1ydF9jYWNoZXAsIEdGUF9BVE9NSUMpOwotCWlmIChjID09IE5VTEwpCisJaWYgKCFjKQogCQlyZXR1cm4gTlVMTDsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZjLT5tZmNfdW4udW5yZXMudW5yZXNvbHZlZCk7CiAJYy0+bWZjX3VuLnVucmVzLmV4cGlyZXMgPSBqaWZmaWVzICsgMTAgKiBIWjsKQEAgLTEyMDAsNyArMTIwMyw3IEBACiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9VTk5FQ0VTU0FSWTsKIAl9CiAKLQlpZiAobXJ0LT5tcm91dGU2X3NrID09IE5VTEwpIHsKKwlpZiAoIW1ydC0+bXJvdXRlNl9zaykgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTQ5NSw3ICsxNDk4LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljID0gaXA2bXJfY2FjaGVfYWxsb2MoKTsKLQlpZiAoYyA9PSBOVUxMKQorCWlmICghYykKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAljLT5tZjZjX29yaWdpbiA9IG1mYy0+bWY2Y2Nfb3JpZ2luLnNpbjZfYWRkcjsKQEAgLTE2NjUsNyArMTY2OCw3IEBACiAJc3RydWN0IG1yNl90YWJsZSAqbXJ0OwogCiAJbXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgcmF3Nl9zayhzayktPmlwNm1yX3RhYmxlID8gOiBSVDZfVEFCTEVfREZMVCk7Ci0JaWYgKG1ydCA9PSBOVUxMKQorCWlmICghbXJ0KQogCQlyZXR1cm4gLUVOT0VOVDsKIAogCWlmIChvcHRuYW1lICE9IE1SVDZfSU5JVCkgewpAQCAtMTgxNCw3ICsxODE3LDcgQEAKIAlzdHJ1Y3QgbXI2X3RhYmxlICptcnQ7CiAKIAltcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS0+aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTsKLQlpZiAobXJ0ID09IE5VTEwpCisJaWYgKCFtcnQpCiAJCXJldHVybiAtRU5PRU5UOwogCiAJc3dpdGNoIChvcHRuYW1lKSB7CkBAIC0xODYxLDcgKzE4NjQsNyBAQAogCXN0cnVjdCBtcjZfdGFibGUgKm1ydDsKIAogCW1ydCA9IGlwNm1yX2dldF90YWJsZShuZXQsIHJhdzZfc2soc2spLT5pcDZtcl90YWJsZSA/IDogUlQ2X1RBQkxFX0RGTFQpOwotCWlmIChtcnQgPT0gTlVMTCkKKwlpZiAoIW1ydCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlzd2l0Y2ggKGNtZCkgewpAQCAtMTkzNSw3ICsxOTM4LDcgQEAKIAlzdHJ1Y3QgbXI2X3RhYmxlICptcnQ7CiAKIAltcnQgPSBpcDZtcl9nZXRfdGFibGUobmV0LCByYXc2X3NrKHNrKS0+aXA2bXJfdGFibGUgPyA6IFJUNl9UQUJMRV9ERkxUKTsKLQlpZiAobXJ0ID09IE5VTEwpCisJaWYgKCFtcnQpCiAJCXJldHVybiAtRU5PRU5UOwogCiAJc3dpdGNoIChjbWQpIHsKQEAgLTE5ODMsMTMgKzE5ODYsMTMgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgaW5saW5lIGludCBpcDZtcl9mb3J3YXJkMl9maW5pc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgaW50IGlwNm1yX2ZvcndhcmQyX2ZpbmlzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJSVA2X0lOQ19TVEFUU19CSChkZXZfbmV0KHNrYl9kc3Qoc2tiKS0+ZGV2KSwgaXA2X2RzdF9pZGV2KHNrYl9kc3Qoc2tiKSksCiAJCQkgSVBTVEFUU19NSUJfT1VURk9SV0RBVEFHUkFNUyk7CiAJSVA2X0FERF9TVEFUU19CSChkZXZfbmV0KHNrYl9kc3Qoc2tiKS0+ZGV2KSwgaXA2X2RzdF9pZGV2KHNrYl9kc3Qoc2tiKSksCiAJCQkgSVBTVEFUU19NSUJfT1VUT0NURVRTLCBza2ItPmxlbik7Ci0JcmV0dXJuIGRzdF9vdXRwdXQoc2tiKTsKKwlyZXR1cm4gZHN0X291dHB1dF9zayhzaywgc2tiKTsKIH0KIAogLyoKQEAgLTIwMDUsNyArMjAwOCw3IEBACiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCXN0cnVjdCBmbG93aTYgZmw2OwogCi0JaWYgKHZpZi0+ZGV2ID09IE5VTEwpCisJaWYgKCF2aWYtPmRldikKIAkJZ290byBvdXRfZnJlZTsKIAogI2lmZGVmIENPTkZJR19JUFY2X1BJTVNNX1YyCkBAIC0yMDYxLDcgKzIwNjQsOCBAQAogCiAJSVA2Q0Ioc2tiKS0+ZmxhZ3MgfD0gSVA2U0tCX0ZPUldBUkRFRDsKIAotCXJldHVybiBORl9IT09LKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9GT1JXQVJELCBza2IsIHNrYi0+ZGV2LCBkZXYsCisJcmV0dXJuIE5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX0ZPUldBUkQsIE5VTEwsIHNrYiwKKwkJICAgICAgIHNrYi0+ZGV2LCBkZXYsCiAJCSAgICAgICBpcDZtcl9mb3J3YXJkMl9maW5pc2gpOwogCiBvdXRfZnJlZToKQEAgLTIxOTQsNyArMjE5OCw3IEBACiAJcmVhZF9sb2NrKCZtcnRfbG9jayk7CiAJY2FjaGUgPSBpcDZtcl9jYWNoZV9maW5kKG1ydCwKIAkJCQkgJmlwdjZfaGRyKHNrYiktPnNhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOwotCWlmIChjYWNoZSA9PSBOVUxMKSB7CisJaWYgKCFjYWNoZSkgewogCQlpbnQgdmlmID0gaXA2bXJfZmluZF92aWYobXJ0LCBza2ItPmRldik7CiAKIAkJaWYgKHZpZiA+PSAwKQpAQCAtMjIwNiw3ICsyMjEwLDcgQEAKIAkvKgogCSAqCU5vIHVzYWJsZSBjYWNoZSBlbnRyeQogCSAqLwotCWlmIChjYWNoZSA9PSBOVUxMKSB7CisJaWYgKCFjYWNoZSkgewogCQlpbnQgdmlmOwogCiAJCXZpZiA9IGlwNm1yX2ZpbmRfdmlmKG1ydCwgc2tiLT5kZXYpOwpAQCAtMjI0NSwxMyArMjI0OSwxMyBAQAogCSAgICBubGFfcHV0X3UzMihza2IsIFJUQV9JSUYsIG1ydC0+dmlmNl90YWJsZVtjLT5tZjZjX3BhcmVudF0uZGV2LT5pZmluZGV4KSA8IDApCiAJCXJldHVybiAtRU1TR1NJWkU7CiAJbXBfYXR0ciA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgUlRBX01VTFRJUEFUSCk7Ci0JaWYgKG1wX2F0dHIgPT0gTlVMTCkKKwlpZiAoIW1wX2F0dHIpCiAJCXJldHVybiAtRU1TR1NJWkU7CiAKIAlmb3IgKGN0ID0gYy0+bWZjX3VuLnJlcy5taW52aWY7IGN0IDwgYy0+bWZjX3VuLnJlcy5tYXh2aWY7IGN0KyspIHsKIAkJaWYgKE1JRl9FWElTVFMobXJ0LCBjdCkgJiYgYy0+bWZjX3VuLnJlcy50dGxzW2N0XSA8IDI1NSkgewogCQkJbmhwID0gbmxhX3Jlc2VydmVfbm9oZHIoc2tiLCBzaXplb2YoKm5ocCkpOwotCQkJaWYgKG5ocCA9PSBOVUxMKSB7CisJCQlpZiAoIW5ocCkgewogCQkJCW5sYV9uZXN0X2NhbmNlbChza2IsIG1wX2F0dHIpOwogCQkJCXJldHVybiAtRU1TR1NJWkU7CiAJCQl9CkBAIC0yMjg0LDcgKzIyODgsNyBAQAogCXN0cnVjdCBydDZfaW5mbyAqcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopc2tiX2RzdChza2IpOwogCiAJbXJ0ID0gaXA2bXJfZ2V0X3RhYmxlKG5ldCwgUlQ2X1RBQkxFX0RGTFQpOwotCWlmIChtcnQgPT0gTlVMTCkKKwlpZiAoIW1ydCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlyZWFkX2xvY2soJm1ydF9sb2NrKTsKQEAgLTIzMDksNyArMjMxMyw3IEBACiAJCX0KIAogCQlkZXYgPSBza2ItPmRldjsKLQkJaWYgKGRldiA9PSBOVUxMIHx8ICh2aWYgPSBpcDZtcl9maW5kX3ZpZihtcnQsIGRldikpIDwgMCkgeworCQlpZiAoIWRldiB8fCAodmlmID0gaXA2bXJfZmluZF92aWYobXJ0LCBkZXYpKSA8IDApIHsKIAkJCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQpAQCAtMjM2MSw3ICsyMzY1LDcgQEAKIAlpbnQgZXJyOwogCiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcG9ydGlkLCBzZXEsIGNtZCwgc2l6ZW9mKCpydG0pLCBmbGFncyk7Ci0JaWYgKG5saCA9PSBOVUxMKQorCWlmICghbmxoKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJcnRtID0gbmxtc2dfZGF0YShubGgpOwpAQCAtMjM4MCw4ICsyMzg0LDggQEAKIAkJcnRtLT5ydG1fcHJvdG9jb2wgPSBSVFBST1RfTVJPVVRFRDsKIAlydG0tPnJ0bV9mbGFncyAgICA9IDA7CiAKLQlpZiAobmxhX3B1dChza2IsIFJUQV9TUkMsIDE2LCAmYy0+bWY2Y19vcmlnaW4pIHx8Ci0JICAgIG5sYV9wdXQoc2tiLCBSVEFfRFNULCAxNiwgJmMtPm1mNmNfbWNhc3RncnApKQorCWlmIChubGFfcHV0X2luNl9hZGRyKHNrYiwgUlRBX1NSQywgJmMtPm1mNmNfb3JpZ2luKSB8fAorCSAgICBubGFfcHV0X2luNl9hZGRyKHNrYiwgUlRBX0RTVCwgJmMtPm1mNmNfbWNhc3RncnApKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAllcnIgPSBfX2lwNm1yX2ZpbGxfbXJvdXRlKG1ydCwgc2tiLCBjLCBydG0pOwogCS8qIGRvIG5vdCBicmVhayB0aGUgZHVtcCBpZiBjYWNoZSBpcyB1bnJlc29sdmVkICovCkBAIC0yNDI2LDcgKzI0MzAsNyBAQAogCiAJc2tiID0gbmxtc2dfbmV3KG1yNl9tc2dzaXplKG1mYy0+bWY2Y19wYXJlbnQgPj0gTUFYTUlGUywgbXJ0LT5tYXh2aWYpLAogCQkJR0ZQX0FUT01JQyk7Ci0JaWYgKHNrYiA9PSBOVUxMKQorCWlmICghc2tiKQogCQlnb3RvIGVycm91dDsKIAogCWVyciA9IGlwNm1yX2ZpbGxfbXJvdXRlKG1ydCwgc2tiLCAwLCAwLCBtZmMsIGNtZCwgMCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMgYi9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKaW5kZXggOGQ3NjZkOS4uNjNlNjk1NiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCisrKyBiL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwpAQCAtODUsNyArODUsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAl9Ci0JaWYgKG5ld19yYSA9PSBOVUxMKSB7CisJaWYgKCFuZXdfcmEpIHsKIAkJd3JpdGVfdW5sb2NrX2JoKCZpcDZfcmFfbG9jayk7CiAJCXJldHVybiAtRU5PQlVGUzsKIAl9CkBAIC0xMTcsNiArMTE3LDI1IEBACiAJcmV0dXJuIG9wdDsKIH0KIAorc3RhdGljIGJvb2wgc2V0c29ja29wdF9uZWVkc19ydG5sKGludCBvcHRuYW1lKQoreworCXN3aXRjaCAob3B0bmFtZSkgeworCWNhc2UgSVBWNl9BRERfTUVNQkVSU0hJUDoKKwljYXNlIElQVjZfRFJPUF9NRU1CRVJTSElQOgorCWNhc2UgSVBWNl9KT0lOX0FOWUNBU1Q6CisJY2FzZSBJUFY2X0xFQVZFX0FOWUNBU1Q6CisJY2FzZSBNQ0FTVF9KT0lOX0dST1VQOgorCWNhc2UgTUNBU1RfTEVBVkVfR1JPVVA6CisJY2FzZSBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUDoKKwljYXNlIE1DQVNUX0xFQVZFX1NPVVJDRV9HUk9VUDoKKwljYXNlIE1DQVNUX0JMT0NLX1NPVVJDRToKKwljYXNlIE1DQVNUX1VOQkxPQ0tfU09VUkNFOgorCWNhc2UgTUNBU1RfTVNGSUxURVI6CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBpbnQgZG9faXB2Nl9zZXRzb2Nrb3B0KHN0cnVjdCBzb2NrICpzaywgaW50IGxldmVsLCBpbnQgb3B0bmFtZSwKIAkJICAgIGNoYXIgX191c2VyICpvcHR2YWwsIHVuc2lnbmVkIGludCBvcHRsZW4pCiB7CkBAIC0xMjQsOCArMTQzLDkgQEAKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJaW50IHZhbCwgdmFsYm9vbDsKIAlpbnQgcmV0diA9IC1FTk9QUk9UT09QVDsKKwlib29sIG5lZWRzX3J0bmwgPSBzZXRzb2Nrb3B0X25lZWRzX3J0bmwob3B0bmFtZSk7CiAKLQlpZiAob3B0dmFsID09IE5VTEwpCisJaWYgKCFvcHR2YWwpCiAJCXZhbCA9IDA7CiAJZWxzZSB7CiAJCWlmIChvcHRsZW4gPj0gc2l6ZW9mKGludCkpIHsKQEAgLTE0MCw2ICsxNjAsOCBAQAogCWlmIChpcDZfbXJvdXRlX29wdChvcHRuYW1lKSkKIAkJcmV0dXJuIGlwNl9tcm91dGVfc2V0c29ja29wdChzaywgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pOwogCisJaWYgKG5lZWRzX3J0bmwpCisJCXJ0bmxfbG9jaygpOwogCWxvY2tfc29jayhzayk7CiAKIAlzd2l0Y2ggKG9wdG5hbWUpIHsKQEAgLTM3MCw3ICszOTIsNyBAQAogCQkgKi8KIAkJaWYgKG9wdGxlbiA9PSAwKQogCQkJb3B0dmFsID0gTlVMTDsKLQkJZWxzZSBpZiAob3B0dmFsID09IE5VTEwpCisJCWVsc2UgaWYgKCFvcHR2YWwpCiAJCQlnb3RvIGVfaW52YWw7CiAJCWVsc2UgaWYgKG9wdGxlbiA8IHNpemVvZihzdHJ1Y3QgaXB2Nl9vcHRfaGRyKSB8fAogCQkJIG9wdGxlbiAmIDB4NyB8fCBvcHRsZW4gPiA4ICogMjU1KQpAQCAtNDIxLDcgKzQ0Myw3IEBACiAKIAkJaWYgKG9wdGxlbiA9PSAwKQogCQkJZ290byBlX2ludmFsOwotCQllbHNlIGlmIChvcHRsZW4gPCBzaXplb2Yoc3RydWN0IGluNl9wa3RpbmZvKSB8fCBvcHR2YWwgPT0gTlVMTCkKKwkJZWxzZSBpZiAob3B0bGVuIDwgc2l6ZW9mKHN0cnVjdCBpbjZfcGt0aW5mbykgfHwgIW9wdHZhbCkKIAkJCWdvdG8gZV9pbnZhbDsKIAogCQlpZiAoY29weV9mcm9tX3VzZXIoJnBrdCwgb3B0dmFsLCBzaXplb2Yoc3RydWN0IGluNl9wa3RpbmZvKSkpIHsKQEAgLTQ2MCw3ICs0ODIsNyBAQAogCiAJCW9wdCA9IHNvY2tfa21hbGxvYyhzaywgc2l6ZW9mKCpvcHQpICsgb3B0bGVuLCBHRlBfS0VSTkVMKTsKIAkJcmV0diA9IC1FTk9CVUZTOwotCQlpZiAob3B0ID09IE5VTEwpCisJCWlmICghb3B0KQogCQkJYnJlYWs7CiAKIAkJbWVtc2V0KG9wdCwgMCwgc2l6ZW9mKCpvcHQpKTsKQEAgLTYyNCwxMCArNjQ2LDEwIEBACiAJCXBzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikmZ3JlcS5ncl9ncm91cDsKIAkJaWYgKG9wdG5hbWUgPT0gTUNBU1RfSk9JTl9HUk9VUCkKIAkJCXJldHYgPSBpcHY2X3NvY2tfbWNfam9pbihzaywgZ3JlcS5ncl9pbnRlcmZhY2UsCi0JCQkJJnBzaW42LT5zaW42X2FkZHIpOworCQkJCQkJICZwc2luNi0+c2luNl9hZGRyKTsKIAkJZWxzZQogCQkJcmV0diA9IGlwdjZfc29ja19tY19kcm9wKHNrLCBncmVxLmdyX2ludGVyZmFjZSwKLQkJCQkmcHNpbjYtPnNpbjZfYWRkcik7CisJCQkJCQkgJnBzaW42LT5zaW42X2FkZHIpOwogCQlicmVhazsKIAl9CiAJY2FzZSBNQ0FTVF9KT0lOX1NPVVJDRV9HUk9VUDoKQEAgLTY2MCw3ICs2ODIsNyBAQAogCiAJCQlwc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopJmdyZXFzLmdzcl9ncm91cDsKIAkJCXJldHYgPSBpcHY2X3NvY2tfbWNfam9pbihzaywgZ3JlcXMuZ3NyX2ludGVyZmFjZSwKLQkJCQkmcHNpbjYtPnNpbjZfYWRkcik7CisJCQkJCQkgJnBzaW42LT5zaW42X2FkZHIpOwogCQkJLyogcHJpb3Igam9pbiB3LyBkaWZmZXJlbnQgc291cmNlIGlzIG9rICovCiAJCQlpZiAocmV0diAmJiByZXR2ICE9IC1FQUREUklOVVNFKQogCQkJCWJyZWFrOwpAQCAtODM3LDExICs4NTksMTUgQEAKIAl9CiAKIAlyZWxlYXNlX3NvY2soc2spOworCWlmIChuZWVkc19ydG5sKQorCQlydG5sX3VubG9jaygpOwogCiAJcmV0dXJuIHJldHY7CiAKIGVfaW52YWw6CiAJcmVsZWFzZV9zb2NrKHNrKTsKKwlpZiAobmVlZHNfcnRubCkKKwkJcnRubF91bmxvY2soKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbWNhc3QuYyBiL25ldC9pcHY2L21jYXN0LmMKaW5kZXggNWNlMTA3Yy4uMDgzYjI5MiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbWNhc3QuYworKysgYi9uZXQvaXB2Ni9tY2FzdC5jCkBAIC0xNDAsNiArMTQwLDggQEAKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CiAJaW50IGVycjsKIAorCUFTU0VSVF9SVE5MKCk7CisKIAlpZiAoIWlwdjZfYWRkcl9pc19tdWx0aWNhc3QoYWRkcikpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xNTUsMTMgKzE1NywxMiBAQAogCiAJbWNfbHN0ID0gc29ja19rbWFsbG9jKHNrLCBzaXplb2Yoc3RydWN0IGlwdjZfbWNfc29ja2xpc3QpLCBHRlBfS0VSTkVMKTsKIAotCWlmIChtY19sc3QgPT0gTlVMTCkKKwlpZiAoIW1jX2xzdCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAltY19sc3QtPm5leHQgPSBOVUxMOwogCW1jX2xzdC0+YWRkciA9ICphZGRyOwogCi0JcnRubF9sb2NrKCk7CiAJaWYgKGlmaW5kZXggPT0gMCkgewogCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0OwogCQlydCA9IHJ0Nl9sb29rdXAobmV0LCBhZGRyLCBOVUxMLCAwLCAwKTsKQEAgLTE3Miw4ICsxNzMsNyBAQAogCX0gZWxzZQogCQlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobmV0LCBpZmluZGV4KTsKIAotCWlmIChkZXYgPT0gTlVMTCkgewotCQlydG5sX3VubG9jaygpOworCWlmICghZGV2KSB7CiAJCXNvY2tfa2ZyZWVfcyhzaywgbWNfbHN0LCBzaXplb2YoKm1jX2xzdCkpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CkBAIC0xOTAsNyArMTkwLDYgQEAKIAllcnIgPSBpcHY2X2Rldl9tY19pbmMoZGV2LCBhZGRyKTsKIAogCWlmIChlcnIpIHsKLQkJcnRubF91bmxvY2soKTsKIAkJc29ja19rZnJlZV9zKHNrLCBtY19sc3QsIHNpemVvZigqbWNfbHN0KSk7CiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMTk4LDEwICsxOTcsOSBAQAogCW1jX2xzdC0+bmV4dCA9IG5wLT5pcHY2X21jX2xpc3Q7CiAJcmN1X2Fzc2lnbl9wb2ludGVyKG5wLT5pcHY2X21jX2xpc3QsIG1jX2xzdCk7CiAKLQlydG5sX3VubG9jaygpOwotCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGlwdjZfc29ja19tY19qb2luKTsKIAogLyoKICAqCXNvY2tldCBsZWF2ZSBvbiBtdWx0aWNhc3QgZ3JvdXAKQEAgLTIxMywxMCArMjExLDExIEBACiAJc3RydWN0IGlwdjZfbWNfc29ja2xpc3QgX19yY3UgKipsbms7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCisJQVNTRVJUX1JUTkwoKTsKKwogCWlmICghaXB2Nl9hZGRyX2lzX211bHRpY2FzdChhZGRyKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlydG5sX2xvY2soKTsKIAlmb3IgKGxuayA9ICZucC0+aXB2Nl9tY19saXN0OwogCSAgICAgKG1jX2xzdCA9IHJ0bmxfZGVyZWZlcmVuY2UoKmxuaykpICE9IE5VTEw7CiAJICAgICAgbG5rID0gJm1jX2xzdC0+bmV4dCkgewpAQCAtMjI3LDcgKzIyNiw3IEBACiAJCQkqbG5rID0gbWNfbHN0LT5uZXh0OwogCiAJCQlkZXYgPSBfX2Rldl9nZXRfYnlfaW5kZXgobmV0LCBtY19sc3QtPmlmaW5kZXgpOwotCQkJaWYgKGRldiAhPSBOVUxMKSB7CisJCQlpZiAoZGV2KSB7CiAJCQkJc3RydWN0IGluZXQ2X2RldiAqaWRldiA9IF9faW42X2Rldl9nZXQoZGV2KTsKIAogCQkJCSh2b2lkKSBpcDZfbWNfbGVhdmVfc3JjKHNrLCBtY19sc3QsIGlkZXYpOwpAQCAtMjM1LDE3ICsyMzQsMTYgQEAKIAkJCQkJX19pcHY2X2Rldl9tY19kZWMoaWRldiwgJm1jX2xzdC0+YWRkcik7CiAJCQl9IGVsc2UKIAkJCQkodm9pZCkgaXA2X21jX2xlYXZlX3NyYyhzaywgbWNfbHN0LCBOVUxMKTsKLQkJCXJ0bmxfdW5sb2NrKCk7CiAKIAkJCWF0b21pY19zdWIoc2l6ZW9mKCptY19sc3QpLCAmc2stPnNrX29tZW1fYWxsb2MpOwogCQkJa2ZyZWVfcmN1KG1jX2xzdCwgcmN1KTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQotCXJ0bmxfdW5sb2NrKCk7CiAKIAlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CiB9CitFWFBPUlRfU1lNQk9MKGlwdjZfc29ja19tY19kcm9wKTsKIAogLyogY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jaygpICovCiBzdGF0aWMgc3RydWN0IGluZXQ2X2RldiAqaXA2X21jX2ZpbmRfZGV2X3JjdShzdHJ1Y3QgbmV0ICpuZXQsCkBAIC00MzgsNyArNDM2LDcgQEAKIAlyZWFkX3VubG9ja19iaCgmaWRldi0+bG9jayk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJaWYgKGxlYXZlZ3JvdXApCi0JCXJldHVybiBpcHY2X3NvY2tfbWNfZHJvcChzaywgcGdzci0+Z3NyX2ludGVyZmFjZSwgZ3JvdXApOworCQllcnIgPSBpcHY2X3NvY2tfbWNfZHJvcChzaywgcGdzci0+Z3NyX2ludGVyZmFjZSwgZ3JvdXApOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTgyNSw3ICs4MjMsNyBAQAogCXN0cnVjdCBpZm1jYWRkcjYgKm1jOwogCiAJbWMgPSBremFsbG9jKHNpemVvZigqbWMpLCBHRlBfQVRPTUlDKTsKLQlpZiAobWMgPT0gTlVMTCkKKwlpZiAoIW1jKQogCQlyZXR1cm4gTlVMTDsKIAogCXNldHVwX3RpbWVyKCZtYy0+bWNhX3RpbWVyLCBpZ21wNl90aW1lcl9oYW5kbGVyLCAodW5zaWduZWQgbG9uZyltYyk7CkBAIC04NjIsNyArODYwLDcgQEAKIAkvKiB3ZSBuZWVkIHRvIHRha2UgYSByZWZlcmVuY2Ugb24gaWRldiAqLwogCWlkZXYgPSBpbjZfZGV2X2dldChkZXYpOwogCi0JaWYgKGlkZXYgPT0gTlVMTCkKKwlpZiAoIWlkZXYpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJd3JpdGVfbG9ja19iaCgmaWRldi0+bG9jayk7CkBAIC0xMzMwLDcgKzEzMjgsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlkZXYgPSBfX2luNl9kZXZfZ2V0KHNrYi0+ZGV2KTsKLQlpZiAoaWRldiA9PSBOVUxMKQorCWlmICghaWRldikKIAkJcmV0dXJuIDA7CiAKIAltbGQgPSAoc3RydWN0IG1sZF9tc2cgKilpY21wNl9oZHIoc2tiKTsKQEAgLTE0NDUsNyArMTQ0Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWRldiA9IF9faW42X2Rldl9nZXQoc2tiLT5kZXYpOwotCWlmIChpZGV2ID09IE5VTEwpCisJaWYgKCFpZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qCkBAIC0xNjQ2LDggKzE2NDQsOSBAQAogCiAJcGF5bG9hZF9sZW4gPSBza2ItPmxlbjsKIAotCWVyciA9IE5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBza2ItPmRldiwKLQkJICAgICAgZHN0X291dHB1dCk7CisJZXJyID0gTkZfSE9PSyhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfT1VULAorCQkgICAgICBuZXQtPmlwdjYuaWdtcF9zaywgc2tiLCBOVUxMLCBza2ItPmRldiwKKwkJICAgICAgZHN0X291dHB1dF9zayk7CiBvdXQ6CiAJaWYgKCFlcnIpIHsKIAkJSUNNUDZNU0dPVVRfSU5DX1NUQVRTKG5ldCwgaWRldiwgSUNNUFY2X01MRDJfUkVQT1JUKTsKQEAgLTE5NjQsNyArMTk2Myw3IEBACiAKIAlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBobGVuICsgdGxlbiArIGZ1bGxfbGVuLCAxLCAmZXJyKTsKIAotCWlmIChza2IgPT0gTlVMTCkgeworCWlmICghc2tiKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJSVA2X0lOQ19TVEFUUyhuZXQsIF9faW42X2Rldl9nZXQoZGV2KSwKIAkJCSAgICAgIElQU1RBVFNfTUlCX09VVERJU0NBUkRTKTsKQEAgLTIwMDksOCArMjAwOCw4IEBACiAJfQogCiAJc2tiX2RzdF9zZXQoc2tiLCBkc3QpOwotCWVyciA9IE5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX0xPQ0FMX09VVCwgc2tiLCBOVUxMLCBza2ItPmRldiwKLQkJICAgICAgZHN0X291dHB1dCk7CisJZXJyID0gTkZfSE9PSyhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfT1VULCBzaywgc2tiLAorCQkgICAgICBOVUxMLCBza2ItPmRldiwgZHN0X291dHB1dF9zayk7CiBvdXQ6CiAJaWYgKCFlcnIpIHsKIAkJSUNNUDZNU0dPVVRfSU5DX1NUQVRTKG5ldCwgaWRldiwgdHlwZSk7CkBAIC0yNjEzLDcgKzI2MTIsNyBAQAogCiAJaW0gPSBpbS0+bmV4dDsKIAl3aGlsZSAoIWltKSB7Ci0JCWlmIChsaWtlbHkoc3RhdGUtPmlkZXYgIT0gTlVMTCkpCisJCWlmIChsaWtlbHkoc3RhdGUtPmlkZXYpKQogCQkJcmVhZF91bmxvY2tfYmgoJnN0YXRlLT5pZGV2LT5sb2NrKTsKIAogCQlzdGF0ZS0+ZGV2ID0gbmV4dF9uZXRfZGV2aWNlX3JjdShzdGF0ZS0+ZGV2KTsKQEAgLTI2NTksNyArMjY1OCw3IEBACiB7CiAJc3RydWN0IGlnbXA2X21jX2l0ZXJfc3RhdGUgKnN0YXRlID0gaWdtcDZfbWNfc2VxX3ByaXZhdGUoc2VxKTsKIAotCWlmIChsaWtlbHkoc3RhdGUtPmlkZXYgIT0gTlVMTCkpIHsKKwlpZiAobGlrZWx5KHN0YXRlLT5pZGV2KSkgewogCQlyZWFkX3VubG9ja19iaCgmc3RhdGUtPmlkZXYtPmxvY2spOwogCQlzdGF0ZS0+aWRldiA9IE5VTEw7CiAJfQpAQCAtMjcyOCwxMCArMjcyNywxMCBAQAogCQkJY29udGludWU7CiAJCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7CiAJCWltID0gaWRldi0+bWNfbGlzdDsKLQkJaWYgKGxpa2VseShpbSAhPSBOVUxMKSkgeworCQlpZiAobGlrZWx5KGltKSkgewogCQkJc3Bpbl9sb2NrX2JoKCZpbS0+bWNhX2xvY2spOwogCQkJcHNmID0gaW0tPm1jYV9zb3VyY2VzOwotCQkJaWYgKGxpa2VseShwc2YgIT0gTlVMTCkpIHsKKwkJCWlmIChsaWtlbHkocHNmKSkgewogCQkJCXN0YXRlLT5pbSA9IGltOwogCQkJCXN0YXRlLT5pZGV2ID0gaWRldjsKIAkJCQlicmVhazsKQEAgLTI3NTIsNyArMjc1MSw3IEBACiAJCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZS0+aW0tPm1jYV9sb2NrKTsKIAkJc3RhdGUtPmltID0gc3RhdGUtPmltLT5uZXh0OwogCQl3aGlsZSAoIXN0YXRlLT5pbSkgewotCQkJaWYgKGxpa2VseShzdGF0ZS0+aWRldiAhPSBOVUxMKSkKKwkJCWlmIChsaWtlbHkoc3RhdGUtPmlkZXYpKQogCQkJCXJlYWRfdW5sb2NrX2JoKCZzdGF0ZS0+aWRldi0+bG9jayk7CiAKIAkJCXN0YXRlLT5kZXYgPSBuZXh0X25ldF9kZXZpY2VfcmN1KHN0YXRlLT5kZXYpOwpAQCAtMjgwNiwxMSArMjgwNSwxMSBAQAogCV9fcmVsZWFzZXMoUkNVKQogewogCXN0cnVjdCBpZ21wNl9tY2ZfaXRlcl9zdGF0ZSAqc3RhdGUgPSBpZ21wNl9tY2Zfc2VxX3ByaXZhdGUoc2VxKTsKLQlpZiAobGlrZWx5KHN0YXRlLT5pbSAhPSBOVUxMKSkgeworCWlmIChsaWtlbHkoc3RhdGUtPmltKSkgewogCQlzcGluX3VubG9ja19iaCgmc3RhdGUtPmltLT5tY2FfbG9jayk7CiAJCXN0YXRlLT5pbSA9IE5VTEw7CiAJfQotCWlmIChsaWtlbHkoc3RhdGUtPmlkZXYgIT0gTlVMTCkpIHsKKwlpZiAobGlrZWx5KHN0YXRlLT5pZGV2KSkgewogCQlyZWFkX3VubG9ja19iaCgmc3RhdGUtPmlkZXYtPmxvY2spOwogCQlzdGF0ZS0+aWRldiA9IE5VTEw7CiAJfQpAQCAtMjkwNywyMCArMjkwNiwzMiBAQAogCiAJaW5ldDZfc2sobmV0LT5pcHY2LmlnbXBfc2spLT5ob3BfbGltaXQgPSAxOwogCisJZXJyID0gaW5ldF9jdGxfc29ja19jcmVhdGUoJm5ldC0+aXB2Ni5tY19hdXRvam9pbl9zaywgUEZfSU5FVDYsCisJCQkJICAgU09DS19SQVcsIElQUFJPVE9fSUNNUFY2LCBuZXQpOworCWlmIChlcnIgPCAwKSB7CisJCXByX2VycigiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIElHTVA2IGF1dG9qb2luIHNvY2tldCAoZXJyICVkKVxuIiwKKwkJICAgICAgIGVycik7CisJCWdvdG8gb3V0X3NvY2tfY3JlYXRlOworCX0KKwogCWVyciA9IGlnbXA2X3Byb2NfaW5pdChuZXQpOwogCWlmIChlcnIpCi0JCWdvdG8gb3V0X3NvY2tfY3JlYXRlOwotb3V0OgotCXJldHVybiBlcnI7CisJCWdvdG8gb3V0X3NvY2tfY3JlYXRlX2F1dG9qb2luOwogCisJcmV0dXJuIDA7CisKK291dF9zb2NrX2NyZWF0ZV9hdXRvam9pbjoKKwlpbmV0X2N0bF9zb2NrX2Rlc3Ryb3kobmV0LT5pcHY2Lm1jX2F1dG9qb2luX3NrKTsKIG91dF9zb2NrX2NyZWF0ZToKIAlpbmV0X2N0bF9zb2NrX2Rlc3Ryb3kobmV0LT5pcHY2LmlnbXBfc2spOwotCWdvdG8gb3V0Oworb3V0OgorCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyB2b2lkIF9fbmV0X2V4aXQgaWdtcDZfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQogewogCWluZXRfY3RsX3NvY2tfZGVzdHJveShuZXQtPmlwdjYuaWdtcF9zayk7CisJaW5ldF9jdGxfc29ja19kZXN0cm95KG5ldC0+aXB2Ni5tY19hdXRvam9pbl9zayk7CiAJaWdtcDZfcHJvY19leGl0KG5ldCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCmluZGV4IDQ3MWVkMjQuLjk2ZjE1M2MgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25kaXNjLmMKKysrIGIvbmV0L2lwdjYvbmRpc2MuYwpAQCAtODQsNiArODQsNyBAQAogc3RhdGljIHUzMiBuZGlzY19oYXNoKGNvbnN0IHZvaWQgKnBrZXksCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCSAgICAgIF9fdTMyICpoYXNoX3JuZCk7CitzdGF0aWMgYm9vbCBuZGlzY19rZXlfZXEoY29uc3Qgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIGNvbnN0IHZvaWQgKnBrZXkpOwogc3RhdGljIGludCBuZGlzY19jb25zdHJ1Y3RvcihzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCk7CiBzdGF0aWMgdm9pZCBuZGlzY19zb2xpY2l0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0YXRpYyB2b2lkIG5kaXNjX2Vycm9yX3JlcG9ydChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CkBAIC0xMTcsNyArMTE4LDkgQEAKIHN0cnVjdCBuZWlnaF90YWJsZSBuZF90YmwgPSB7CiAJLmZhbWlseSA9CUFGX0lORVQ2LAogCS5rZXlfbGVuID0Jc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCisJLnByb3RvY29sID0JY3B1X3RvX2JlMTYoRVRIX1BfSVBWNiksCiAJLmhhc2ggPQkJbmRpc2NfaGFzaCwKKwkua2V5X2VxID0JbmRpc2Nfa2V5X2VxLAogCS5jb25zdHJ1Y3RvciA9CW5kaXNjX2NvbnN0cnVjdG9yLAogCS5wY29uc3RydWN0b3IgPQlwbmRpc2NfY29uc3RydWN0b3IsCiAJLnBkZXN0cnVjdG9yID0JcG5kaXNjX2Rlc3RydWN0b3IsCkBAIC0yOTQsNiArMjk3LDExIEBACiAJcmV0dXJuIG5kaXNjX2hhc2hmbihwa2V5LCBkZXYsIGhhc2hfcm5kKTsKIH0KIAorc3RhdGljIGJvb2wgbmRpc2Nfa2V5X2VxKGNvbnN0IHN0cnVjdCBuZWlnaGJvdXIgKm4sIGNvbnN0IHZvaWQgKnBrZXkpCit7CisJcmV0dXJuIG5laWdoX2tleV9lcTEyOChuLCBwa2V5KTsKK30KKwogc3RhdGljIGludCBuZGlzY19jb25zdHJ1Y3RvcihzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKIHsKIAlzdHJ1Y3QgaW42X2FkZHIgKmFkZHIgPSAoc3RydWN0IGluNl9hZGRyICopJm5laWdoLT5wcmltYXJ5X2tleTsKQEAgLTMwMyw3ICszMTEsNyBAQAogCWJvb2wgaXNfbXVsdGljYXN0ID0gaXB2Nl9hZGRyX2lzX211bHRpY2FzdChhZGRyKTsKIAogCWluNl9kZXYgPSBpbjZfZGV2X2dldChkZXYpOwotCWlmIChpbjZfZGV2ID09IE5VTEwpIHsKKwlpZiAoIWluNl9kZXYpIHsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0zNDgsNyArMzU2LDcgQEAKIAlzdHJ1Y3QgaW42X2FkZHIgbWFkZHI7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IG4tPmRldjsKIAotCWlmIChkZXYgPT0gTlVMTCB8fCBfX2luNl9kZXZfZ2V0KGRldikgPT0gTlVMTCkKKwlpZiAoIWRldiB8fCAhX19pbjZfZGV2X2dldChkZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAlhZGRyY29uZl9hZGRyX3NvbGljdF9tdWx0KGFkZHIsICZtYWRkcik7CiAJaXB2Nl9kZXZfbWNfaW5jKGRldiwgJm1hZGRyKTsKQEAgLTM2MSw3ICszNjksNyBAQAogCXN0cnVjdCBpbjZfYWRkciBtYWRkcjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbi0+ZGV2OwogCi0JaWYgKGRldiA9PSBOVUxMIHx8IF9faW42X2Rldl9nZXQoZGV2KSA9PSBOVUxMKQorCWlmICghZGV2IHx8ICFfX2luNl9kZXZfZ2V0KGRldikpCiAJCXJldHVybjsKIAlhZGRyY29uZl9hZGRyX3NvbGljdF9tdWx0KGFkZHIsICZtYWRkcik7CiAJaXB2Nl9kZXZfbWNfZGVjKGRldiwgJm1hZGRyKTsKQEAgLTQ1NSw4ICs0NjMsOSBAQAogCWlkZXYgPSBfX2luNl9kZXZfZ2V0KGRzdC0+ZGV2KTsKIAlJUDZfVVBEX1BPX1NUQVRTKG5ldCwgaWRldiwgSVBTVEFUU19NSUJfT1VULCBza2ItPmxlbik7CiAKLQllcnIgPSBORl9IT09LKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgZHN0LT5kZXYsCi0JCSAgICAgIGRzdF9vdXRwdXQpOworCWVyciA9IE5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX0xPQ0FMX09VVCwgc2ssIHNrYiwKKwkJICAgICAgTlVMTCwgZHN0LT5kZXYsCisJCSAgICAgIGRzdF9vdXRwdXRfc2spOwogCWlmICghZXJyKSB7CiAJCUlDTVA2TVNHT1VUX0lOQ19TVEFUUyhuZXQsIGlkZXYsIHR5cGUpOwogCQlJQ01QNl9JTkNfU1RBVFMobmV0LCBpZGV2LCBJQ01QNl9NSUJfT1VUTVNHUyk7CkBAIC01NTIsNyArNTYxLDcgQEAKIAlpbnQgb3B0bGVuID0gMDsKIAlzdHJ1Y3QgbmRfbXNnICptc2c7CiAKLQlpZiAoc2FkZHIgPT0gTlVMTCkgeworCWlmICghc2FkZHIpIHsKIAkJaWYgKGlwdjZfZ2V0X2xsYWRkcihkZXYsICZhZGRyX2J1ZiwKIAkJCQkgICAoSUZBX0ZfVEVOVEFUSVZFfElGQV9GX09QVElNSVNUSUMpKSkKIAkJCXJldHVybjsKQEAgLTEwMjIsMTMgKzEwMzEsMTMgQEAKIAlzaXplX3QgbXNnX3NpemUgPSBiYXNlX3NpemUgKyBubGFfdG90YWxfc2l6ZShzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CiAKIAlza2IgPSBubG1zZ19uZXcobXNnX3NpemUsIEdGUF9BVE9NSUMpOwotCWlmIChza2IgPT0gTlVMTCkgeworCWlmICghc2tiKSB7CiAJCWVyciA9IC1FTk9CVUZTOwogCQlnb3RvIGVycm91dDsKIAl9CiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCAwLCAwLCBSVE1fTkVXTkRVU0VST1BULCBiYXNlX3NpemUsIDApOwotCWlmIChubGggPT0gTlVMTCkgeworCWlmICghbmxoKSB7CiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCX0KIApAQCAtMTA0MSw4ICsxMDUwLDcgQEAKIAogCW1lbWNweShuZG1zZyArIDEsIG9wdCwgb3B0LT5uZF9vcHRfbGVuIDw8IDMpOwogCi0JaWYgKG5sYV9wdXQoc2tiLCBORFVTRVJPUFRfU1JDQUREUiwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCi0JCSAgICAmaXB2Nl9oZHIocmEpLT5zYWRkcikpCisJaWYgKG5sYV9wdXRfaW42X2FkZHIoc2tiLCBORFVTRVJPUFRfU1JDQUREUiwgJmlwdjZfaGRyKHJhKS0+c2FkZHIpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlubG1zZ19lbmQoc2tiLCBubGgpOwogCkBAIC0xMDk2LDcgKzExMDQsNyBAQAogCSAqLwogCiAJaW42X2RldiA9IF9faW42X2Rldl9nZXQoc2tiLT5kZXYpOwotCWlmIChpbjZfZGV2ID09IE5VTEwpIHsKKwlpZiAoIWluNl9kZXYpIHsKIAkJTkRfUFJJTlRLKDAsIGVyciwgIlJBOiBjYW4ndCBmaW5kIGluZXQ2IGRldmljZSBmb3IgJXNcbiIsCiAJCQkgIHNrYi0+ZGV2LT5uYW1lKTsKIAkJcmV0dXJuOwpAQCAtMTE5MSwxMSArMTE5OSwxMSBAQAogCiAJTkRfUFJJTlRLKDMsIGluZm8sICJSQTogcnQ6ICVwICBsaWZldGltZTogJWQsIGZvciBkZXY6ICVzXG4iLAogCQkgIHJ0LCBsaWZldGltZSwgc2tiLT5kZXYtPm5hbWUpOwotCWlmIChydCA9PSBOVUxMICYmIGxpZmV0aW1lKSB7CisJaWYgKCFydCAmJiBsaWZldGltZSkgewogCQlORF9QUklOVEsoMywgaW5mbywgIlJBOiBhZGRpbmcgZGVmYXVsdCByb3V0ZXJcbiIpOwogCiAJCXJ0ID0gcnQ2X2FkZF9kZmx0X3JvdXRlcigmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIHNrYi0+ZGV2LCBwcmVmKTsKLQkJaWYgKHJ0ID09IE5VTEwpIHsKKwkJaWYgKCFydCkgewogCQkJTkRfUFJJTlRLKDAsIGVyciwKIAkJCQkgICJSQTogJXMgZmFpbGVkIHRvIGFkZCBkZWZhdWx0IHJvdXRlXG4iLAogCQkJCSAgX19mdW5jX18pOwpAQCAtMTIwMyw3ICsxMjExLDcgQEAKIAkJfQogCiAJCW5laWdoID0gZHN0X25laWdoX2xvb2t1cCgmcnQtPmRzdCwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKLQkJaWYgKG5laWdoID09IE5VTEwpIHsKKwkJaWYgKCFuZWlnaCkgewogCQkJTkRfUFJJTlRLKDAsIGVyciwKIAkJCQkgICJSQTogJXMgZ290IGRlZmF1bHQgcm91dGVyIHdpdGhvdXQgbmVpZ2hib3VyXG4iLAogCQkJCSAgX19mdW5jX18pOwpAQCAtMTIxOCw3ICsxMjI2LDE0IEBACiAJaWYgKHJ0KQogCQlydDZfc2V0X2V4cGlyZXMocnQsIGppZmZpZXMgKyAoSFogKiBsaWZldGltZSkpOwogCWlmIChyYV9tc2ctPmljbXBoLmljbXA2X2hvcF9saW1pdCkgewotCQlpbjZfZGV2LT5jbmYuaG9wX2xpbWl0ID0gcmFfbXNnLT5pY21waC5pY21wNl9ob3BfbGltaXQ7CisJCS8qIE9ubHkgc2V0IGhvcF9saW1pdCBvbiB0aGUgaW50ZXJmYWNlIGlmIGl0IGlzIGhpZ2hlciB0aGFuCisJCSAqIHRoZSBjdXJyZW50IGhvcF9saW1pdC4KKwkJICovCisJCWlmIChpbjZfZGV2LT5jbmYuaG9wX2xpbWl0IDwgcmFfbXNnLT5pY21waC5pY21wNl9ob3BfbGltaXQpIHsKKwkJCWluNl9kZXYtPmNuZi5ob3BfbGltaXQgPSByYV9tc2ctPmljbXBoLmljbXA2X2hvcF9saW1pdDsKKwkJfSBlbHNlIHsKKwkJCU5EX1BSSU5USygyLCB3YXJuLCAiUkE6IEdvdCByb3V0ZSBhZHZlcnRpc2VtZW50IHdpdGggbG93ZXIgaG9wX2xpbWl0IHRoYW4gY3VycmVudFxuIik7CisJCX0KIAkJaWYgKHJ0KQogCQkJZHN0X21ldHJpY19zZXQoJnJ0LT5kc3QsIFJUQVhfSE9QTElNSVQsCiAJCQkJICAgICAgIHJhX21zZy0+aWNtcGguaWNtcDZfaG9wX2xpbWl0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKaW5kZXggMzk4Mzc3YS4uZDk1ODcxOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyLmMKQEAgLTg0LDcgKzg0LDcgQEAKIHsKIAlzdHJ1Y3QgaXA2X3J0X2luZm8gKnJ0X2luZm8gPSBuZl9xdWV1ZV9lbnRyeV9yZXJvdXRlKGVudHJ5KTsKIAotCWlmIChlbnRyeS0+aG9vayA9PSBORl9JTkVUX0xPQ0FMX09VVCkgeworCWlmIChlbnRyeS0+c3RhdGUuaG9vayA9PSBORl9JTkVUX0xPQ0FMX09VVCkgewogCQljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKIAogCQlydF9pbmZvLT5kYWRkciA9IGlwaC0+ZGFkZHI7CkBAIC05OCw3ICs5OCw3IEBACiB7CiAJc3RydWN0IGlwNl9ydF9pbmZvICpydF9pbmZvID0gbmZfcXVldWVfZW50cnlfcmVyb3V0ZShlbnRyeSk7CiAKLQlpZiAoZW50cnktPmhvb2sgPT0gTkZfSU5FVF9MT0NBTF9PVVQpIHsKKwlpZiAoZW50cnktPnN0YXRlLmhvb2sgPT0gTkZfSU5FVF9MT0NBTF9PVVQpIHsKIAkJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwaCA9IGlwdjZfaGRyKHNrYik7CiAJCWlmICghaXB2Nl9hZGRyX2VxdWFsKCZpcGgtPmRhZGRyLCAmcnRfaW5mby0+ZGFkZHIpIHx8CiAJCSAgICAhaXB2Nl9hZGRyX2VxdWFsKCZpcGgtPnNhZGRyLCAmcnRfaW5mby0+c2FkZHIpIHx8CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCmluZGV4IGEwNjk4MjIuLmNhNjk5ODMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCkBAIC0yNSwxNCArMjUsMTYgQEAKIAogCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCiAKK2lmIE5GX1RBQkxFUworCiBjb25maWcgTkZfVEFCTEVTX0lQVjYKLQlkZXBlbmRzIG9uIE5GX1RBQkxFUwogCXRyaXN0YXRlICJJUHY2IG5mX3RhYmxlcyBzdXBwb3J0IgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIElQdjYgc3VwcG9ydCBmb3IgbmZfdGFibGVzLgogCitpZiBORl9UQUJMRVNfSVBWNgorCiBjb25maWcgTkZUX0NIQUlOX1JPVVRFX0lQVjYKLQlkZXBlbmRzIG9uIE5GX1RBQkxFU19JUFY2CiAJdHJpc3RhdGUgIklQdjYgbmZfdGFibGVzIHJvdXRlIGNoYWluIHN1cHBvcnQiCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgInJvdXRlIiBjaGFpbiBmb3IgSVB2NiBpbiBuZl90YWJsZXMuIFRoaXMKQEAgLTQwLDE2ICs0MiwxOCBAQAogCSAgZmllbGRzIHN1Y2ggYXMgdGhlIHNvdXJjZSwgZGVzdGluYXRpb24sIGZsb3dsYWJlbCwgaG9wLWxpbWl0IGFuZAogCSAgdGhlIHBhY2tldCBtYXJrLgogCi1jb25maWcgTkZfUkVKRUNUX0lQVjYKLQl0cmlzdGF0ZSAiSVB2NiBwYWNrZXQgcmVqZWN0aW9uIgotCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgotCiBjb25maWcgTkZUX1JFSkVDVF9JUFY2Ci0JZGVwZW5kcyBvbiBORl9UQUJMRVNfSVBWNgogCXNlbGVjdCBORl9SRUpFQ1RfSVBWNgogCWRlZmF1bHQgTkZUX1JFSkVDVAogCXRyaXN0YXRlCiAKK2VuZGlmICMgTkZfVEFCTEVTX0lQVjYKK2VuZGlmICMgTkZfVEFCTEVTCisKK2NvbmZpZyBORl9SRUpFQ1RfSVBWNgorCXRyaXN0YXRlICJJUHY2IHBhY2tldCByZWplY3Rpb24iCisJZGVmYXVsdCBtIGlmIE5FVEZJTFRFUl9BRFZBTkNFRD1uCisKIGNvbmZpZyBORl9MT0dfSVBWNgogCXRyaXN0YXRlICJJUHY2IHBhY2tldCBsb2dnaW5nIgogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfdGFibGVzLmMKaW5kZXggZTA4MGZiYi4uMWE3MzJhMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl90YWJsZXMuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3RhYmxlcy5jCkBAIC05LDcgKzksMTAgQEAKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCiAgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KICAqLworCiAjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTIzNCw3ICsyMzcsNyBAQAogCS50eXBlID0gTkZfTE9HX1RZUEVfTE9HLAogCS51ID0gewogCQkubG9nID0gewotCQkJLmxldmVsID0gNCwKKwkJCS5sZXZlbCA9IExPR0xFVkVMX1dBUk5JTkcsCiAJCQkubG9nZmxhZ3MgPSBORl9MT0dfTUFTSywKIAkJfSwKIAl9LApAQCAtMjk4LDkgKzMwMSw5IEBACiAJCSAgICAmY2hhaW5uYW1lLCAmY29tbWVudCwgJnJ1bGVudW0pICE9IDApCiAJCQlicmVhazsKIAotCW5mX2xvZ19wYWNrZXQobmV0LCBBRl9JTkVUNiwgaG9vaywgc2tiLCBpbiwgb3V0LCAmdHJhY2VfbG9naW5mbywKLQkJICAgICAgIlRSQUNFOiAlczolczolczoldSAiLAotCQkgICAgICB0YWJsZW5hbWUsIGNoYWlubmFtZSwgY29tbWVudCwgcnVsZW51bSk7CisJbmZfbG9nX3RyYWNlKG5ldCwgQUZfSU5FVDYsIGhvb2ssIHNrYiwgaW4sIG91dCwgJnRyYWNlX2xvZ2luZm8sCisJCSAgICAgIlRSQUNFOiAlczolczolczoldSAiLAorCQkgICAgIHRhYmxlbmFtZSwgY2hhaW5uYW1lLCBjb21tZW50LCBydWxlbnVtKTsKIH0KICNlbmRpZgogCkBAIC0zMTQsOCArMzE3LDcgQEAKIHVuc2lnbmVkIGludAogaXA2dF9kb190YWJsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCSAgICAgIHVuc2lnbmVkIGludCBob29rLAotCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkgICAgICBzdHJ1Y3QgeHRfdGFibGUgKnRhYmxlKQogewogCXN0YXRpYyBjb25zdCBjaGFyIG51bGxkZXZuYW1lW0lGTkFNU0laXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKHNpemVvZihsb25nKSkpKTsKQEAgLTMzMCw4ICszMzIsOCBAQAogCXVuc2lnbmVkIGludCBhZGRlbmQ7CiAKIAkvKiBJbml0aWFsaXphdGlvbiAqLwotCWluZGV2ID0gaW4gPyBpbi0+bmFtZSA6IG51bGxkZXZuYW1lOwotCW91dGRldiA9IG91dCA/IG91dC0+bmFtZSA6IG51bGxkZXZuYW1lOworCWluZGV2ID0gc3RhdGUtPmluID8gc3RhdGUtPmluLT5uYW1lIDogbnVsbGRldm5hbWU7CisJb3V0ZGV2ID0gc3RhdGUtPm91dCA/IHN0YXRlLT5vdXQtPm5hbWUgOiBudWxsZGV2bmFtZTsKIAkvKiBXZSBoYW5kbGUgZnJhZ21lbnRzIGJ5IGRlYWxpbmcgd2l0aCB0aGUgZmlyc3QgZnJhZ21lbnQgYXMKIAkgKiBpZiBpdCB3YXMgYSBub3JtYWwgcGFja2V0LiAgQWxsIG90aGVyIGZyYWdtZW50cyBhcmUgdHJlYXRlZAogCSAqIG5vcm1hbGx5LCBleGNlcHQgdGhhdCB0aGV5IHdpbGwgTkVWRVIgbWF0Y2ggcnVsZXMgdGhhdCBhc2sKQEAgLTMzOSw4ICszNDEsOCBAQAogCSAqIHJ1bGUgaXMgYWxzbyBhIGZyYWdtZW50LXNwZWNpZmljIHJ1bGUsIG5vbi1mcmFnbWVudHMgd29uJ3QKIAkgKiBtYXRjaCBpdC4gKi8KIAlhY3Bhci5ob3Rkcm9wID0gZmFsc2U7Ci0JYWNwYXIuaW4gICAgICA9IGluOwotCWFjcGFyLm91dCAgICAgPSBvdXQ7CisJYWNwYXIuaW4gICAgICA9IHN0YXRlLT5pbjsKKwlhY3Bhci5vdXQgICAgID0gc3RhdGUtPm91dDsKIAlhY3Bhci5mYW1pbHkgID0gTkZQUk9UT19JUFY2OwogCWFjcGFyLmhvb2tudW0gPSBob29rOwogCkBAIC0zOTAsNyArMzkyLDcgQEAKICNpZiBJU19FTkFCTEVEKENPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX1RSQUNFKQogCQkvKiBUaGUgcGFja2V0IGlzIHRyYWNlZDogbG9nIGl0ICovCiAJCWlmICh1bmxpa2VseShza2ItPm5mX3RyYWNlKSkKLQkJCXRyYWNlX3BhY2tldChza2IsIGhvb2ssIGluLCBvdXQsCisJCQl0cmFjZV9wYWNrZXQoc2tiLCBob29rLCBzdGF0ZS0+aW4sIHN0YXRlLT5vdXQsCiAJCQkJICAgICB0YWJsZS0+bmFtZSwgcHJpdmF0ZSwgZSk7CiAjZW5kaWYKIAkJLyogU3RhbmRhcmQgdGFyZ2V0PyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwppbmRleCA1NDRiMGE5Li4xMjMzMWVmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9SRUpFQ1QuYwpAQCAtODMsNyArODMsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9IGVsc2UgaWYgKHJlamluZm8tPndpdGggPT0gSVA2VF9UQ1BfUkVTRVQpIHsKIAkJLyogTXVzdCBzcGVjaWZ5IHRoYXQgaXQncyBhIFRDUCBwYWNrZXQgKi8KLQkJaWYgKGUtPmlwdjYucHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwKKwkJaWYgKCEoZS0+aXB2Ni5mbGFncyAmIElQNlRfRl9QUk9UTykgfHwKKwkJICAgIGUtPmlwdjYucHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwKIAkJICAgIChlLT5pcHY2LmludmZsYWdzICYgWFRfSU5WX1BST1RPKSkgewogCQkJcHJfaW5mbygiVENQX1JFU0VUIGlsbGVnYWwgZm9yIG5vbi10Y3BcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9TWU5QUk9YWS5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfU1lOUFJPWFkuYwppbmRleCBhMGQxNzI3Li42ZWRiN2IxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9TWU5QUk9YWS5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X1NZTlBST1hZLmMKQEAgLTMxNSwxMSArMzE1LDkgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBpcHY2X3N5bnByb3h5X2hvb2soY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkgICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpuaHMpCiB7Ci0Jc3RydWN0IHN5bnByb3h5X25ldCAqc25ldCA9IHN5bnByb3h5X3Blcm5ldChkZXZfbmV0KGluID8gOiBvdXQpKTsKKwlzdHJ1Y3Qgc3lucHJveHlfbmV0ICpzbmV0ID0gc3lucHJveHlfcGVybmV0KGRldl9uZXQobmhzLT5pbiA/IDogbmhzLT5vdXQpKTsKIAllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJc3RydWN0IG5mX2Nvbm5fc3lucHJveHkgKnN5bnByb3h5OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCmluZGV4IGNhN2Y2YzEuLjVjMzNkOGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMKQEAgLTMzLDEzICszMywxMSBAQAogLyogVGhlIHdvcmsgY29tZXMgaW4gaGVyZSBmcm9tIG5ldGZpbHRlci5jLiAqLwogc3RhdGljIHVuc2lnbmVkIGludAogaXA2dGFibGVfZmlsdGVyX2hvb2soY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKLQljb25zdCBzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KChpbiAhPSBOVUxMKSA/IGluIDogb3V0KTsKKwljb25zdCBzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KHN0YXRlLT5pbiA/IHN0YXRlLT5pbiA6IHN0YXRlLT5vdXQpOwogCi0JcmV0dXJuIGlwNnRfZG9fdGFibGUoc2tiLCBvcHMtPmhvb2tudW0sIGluLCBvdXQsCi0JCQkgICAgIG5ldC0+aXB2Ni5pcDZ0YWJsZV9maWx0ZXIpOworCXJldHVybiBpcDZ0X2RvX3RhYmxlKHNrYiwgb3BzLT5ob29rbnVtLCBzdGF0ZSwgbmV0LT5pcHY2LmlwNnRhYmxlX2ZpbHRlcik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgKmZpbHRlcl9vcHMgX19yZWFkX21vc3RseTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9tYW5nbGUuYwppbmRleCAzMDdiYmI3Li5iNTUxZjViIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbWFuZ2xlLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX21hbmdsZS5jCkBAIC0zMiw3ICszMiw3IEBACiB9OwogCiBzdGF0aWMgdW5zaWduZWQgaW50Ci1pcDZ0X21hbmdsZV9vdXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCkKK2lwNnRfbWFuZ2xlX291dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJdW5zaWduZWQgaW50IHJldDsKIAlzdHJ1Y3QgaW42X2FkZHIgc2FkZHIsIGRhZGRyOwpAQCAtNTcsOCArNTcsOCBAQAogCS8qIGZsb3dsYWJlbCBhbmQgcHJpbyAoaW5jbHVkZXMgdmVyc2lvbiwgd2hpY2ggc2hvdWxkbid0IGNoYW5nZSBlaXRoZXIgKi8KIAlmbG93bGFiZWwgPSAqKCh1X2ludDMyX3QgKilpcHY2X2hkcihza2IpKTsKIAotCXJldCA9IGlwNnRfZG9fdGFibGUoc2tiLCBORl9JTkVUX0xPQ0FMX09VVCwgTlVMTCwgb3V0LAotCQkJICAgIGRldl9uZXQob3V0KS0+aXB2Ni5pcDZ0YWJsZV9tYW5nbGUpOworCXJldCA9IGlwNnRfZG9fdGFibGUoc2tiLCBORl9JTkVUX0xPQ0FMX09VVCwgc3RhdGUsCisJCQkgICAgZGV2X25ldChzdGF0ZS0+b3V0KS0+aXB2Ni5pcDZ0YWJsZV9tYW5nbGUpOwogCiAJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4gJiYKIAkgICAgKCFpcHY2X2FkZHJfZXF1YWwoJmlwdjZfaGRyKHNrYiktPnNhZGRyLCAmc2FkZHIpIHx8CkBAIC03NywxNyArNzcsMTYgQEAKIC8qIFRoZSB3b3JrIGNvbWVzIGluIGhlcmUgZnJvbSBuZXRmaWx0ZXIuYy4gKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGlwNnRhYmxlX21hbmdsZV9ob29rKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJaWYgKG9wcy0+aG9va251bSA9PSBORl9JTkVUX0xPQ0FMX09VVCkKLQkJcmV0dXJuIGlwNnRfbWFuZ2xlX291dChza2IsIG91dCk7CisJCXJldHVybiBpcDZ0X21hbmdsZV9vdXQoc2tiLCBzdGF0ZSk7CiAJaWYgKG9wcy0+aG9va251bSA9PSBORl9JTkVUX1BPU1RfUk9VVElORykKLQkJcmV0dXJuIGlwNnRfZG9fdGFibGUoc2tiLCBvcHMtPmhvb2tudW0sIGluLCBvdXQsCi0JCQkJICAgICBkZXZfbmV0KG91dCktPmlwdjYuaXA2dGFibGVfbWFuZ2xlKTsKKwkJcmV0dXJuIGlwNnRfZG9fdGFibGUoc2tiLCBvcHMtPmhvb2tudW0sIHN0YXRlLAorCQkJCSAgICAgZGV2X25ldChzdGF0ZS0+b3V0KS0+aXB2Ni5pcDZ0YWJsZV9tYW5nbGUpOwogCS8qIElOUFVUL0ZPUldBUkQgKi8KLQlyZXR1cm4gaXA2dF9kb190YWJsZShza2IsIG9wcy0+aG9va251bSwgaW4sIG91dCwKLQkJCSAgICAgZGV2X25ldChpbiktPmlwdjYuaXA2dGFibGVfbWFuZ2xlKTsKKwlyZXR1cm4gaXA2dF9kb190YWJsZShza2IsIG9wcy0+aG9va251bSwgc3RhdGUsCisJCQkgICAgIGRldl9uZXQoc3RhdGUtPmluKS0+aXB2Ni5pcDZ0YWJsZV9tYW5nbGUpOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzICptYW5nbGVfb3BzIF9fcmVhZF9tb3N0bHk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbmF0LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfbmF0LmMKaW5kZXggYjA2MzRhYy4uYzNhN2Y3YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX25hdC5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9uYXQuYwpAQCAtMzIsNDkgKzMyLDQwIEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2dGFibGVfbmF0X2RvX2NoYWluKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJCSAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkJCQkgIHN0cnVjdCBuZl9jb25uICpjdCkKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCi0JcmV0dXJuIGlwNnRfZG9fdGFibGUoc2tiLCBvcHMtPmhvb2tudW0sIGluLCBvdXQsIG5ldC0+aXB2Ni5pcDZ0YWJsZV9uYXQpOworCXJldHVybiBpcDZ0X2RvX3RhYmxlKHNrYiwgb3BzLT5ob29rbnVtLCBzdGF0ZSwgbmV0LT5pcHY2LmlwNnRhYmxlX25hdCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2dGFibGVfbmF0X2ZuKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JcmV0dXJuIG5mX25hdF9pcHY2X2ZuKG9wcywgc2tiLCBpbiwgb3V0LCBpcDZ0YWJsZV9uYXRfZG9fY2hhaW4pOworCXJldHVybiBuZl9uYXRfaXB2Nl9mbihvcHMsIHNrYiwgc3RhdGUsIGlwNnRhYmxlX25hdF9kb19jaGFpbik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2dGFibGVfbmF0X2luKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JcmV0dXJuIG5mX25hdF9pcHY2X2luKG9wcywgc2tiLCBpbiwgb3V0LCBpcDZ0YWJsZV9uYXRfZG9fY2hhaW4pOworCXJldHVybiBuZl9uYXRfaXB2Nl9pbihvcHMsIHNrYiwgc3RhdGUsIGlwNnRhYmxlX25hdF9kb19jaGFpbik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2dGFibGVfbmF0X291dChjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JcmV0dXJuIG5mX25hdF9pcHY2X291dChvcHMsIHNrYiwgaW4sIG91dCwgaXA2dGFibGVfbmF0X2RvX2NoYWluKTsKKwlyZXR1cm4gbmZfbmF0X2lwdjZfb3V0KG9wcywgc2tiLCBzdGF0ZSwgaXA2dGFibGVfbmF0X2RvX2NoYWluKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBpcDZ0YWJsZV9uYXRfbG9jYWxfZm4oY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkJICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkJICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JcmV0dXJuIG5mX25hdF9pcHY2X2xvY2FsX2ZuKG9wcywgc2tiLCBpbiwgb3V0LCBpcDZ0YWJsZV9uYXRfZG9fY2hhaW4pOworCXJldHVybiBuZl9uYXRfaXB2Nl9sb2NhbF9mbihvcHMsIHNrYiwgc3RhdGUsIGlwNnRhYmxlX25hdF9kb19jaGFpbik7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZfaG9va19vcHMgbmZfbmF0X2lwdjZfb3BzW10gX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9yYXcuYwppbmRleCA1Mjc0NzQwLi4wYjMzY2FhIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfcmF3LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3Jhdy5jCkBAIC0yMCwxMyArMjAsMTEgQEAKIC8qIFRoZSB3b3JrIGNvbWVzIGluIGhlcmUgZnJvbSBuZXRmaWx0ZXIuYy4gKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGlwNnRhYmxlX3Jhd19ob29rKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JY29uc3Qgc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldCgoaW4gIT0gTlVMTCkgPyBpbiA6IG91dCk7CisJY29uc3Qgc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChzdGF0ZS0+aW4gPyBzdGF0ZS0+aW4gOiBzdGF0ZS0+b3V0KTsKIAotCXJldHVybiBpcDZ0X2RvX3RhYmxlKHNrYiwgb3BzLT5ob29rbnVtLCBpbiwgb3V0LAotCQkJICAgICBuZXQtPmlwdjYuaXA2dGFibGVfcmF3KTsKKwlyZXR1cm4gaXA2dF9kb190YWJsZShza2IsIG9wcy0+aG9va251bSwgc3RhdGUsIG5ldC0+aXB2Ni5pcDZ0YWJsZV9yYXcpOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzICpyYXd0YWJsZV9vcHMgX19yZWFkX21vc3RseTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9zZWN1cml0eS5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3NlY3VyaXR5LmMKaW5kZXggYWIzYjAyMS4uZmNlZjgzYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3NlY3VyaXR5LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX3NlY3VyaXR5LmMKQEAgLTM3LDEzICszNywxMSBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50CiBpcDZ0YWJsZV9zZWN1cml0eV9ob29rKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewotCWNvbnN0IHN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoKGluICE9IE5VTEwpID8gaW4gOiBvdXQpOworCWNvbnN0IHN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc3RhdGUtPmluID8gc3RhdGUtPmluIDogc3RhdGUtPm91dCk7CiAKLQlyZXR1cm4gaXA2dF9kb190YWJsZShza2IsIG9wcy0+aG9va251bSwgaW4sIG91dCwKKwlyZXR1cm4gaXA2dF9kb190YWJsZShza2IsIG9wcy0+aG9va251bSwgc3RhdGUsCiAJCQkgICAgIG5ldC0+aXB2Ni5pcDZ0YWJsZV9zZWN1cml0eSk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2wzcHJvdG9faXB2Ni5jCmluZGV4IGI2OGQwZTUuLjRiYTBjMzQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90b19pcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19sM3Byb3RvX2lwdjYuYwpAQCAtOTcsOSArOTcsNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlwdjZfaGVscGVyKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBuZl9jb25uICpjdDsKIAljb25zdCBzdHJ1Y3QgbmZfY29ubl9oZWxwICpoZWxwOwpAQCAtMTM1LDkgKzEzMyw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXB2Nl9jb25maXJtKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCSBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwpAQCAtMTcxLDI1ICsxNjcsMjEgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBpcHY2X2Nvbm50cmFja19pbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKLQlyZXR1cm4gbmZfY29ubnRyYWNrX2luKGRldl9uZXQoaW4pLCBQRl9JTkVUNiwgb3BzLT5ob29rbnVtLCBza2IpOworCXJldHVybiBuZl9jb25udHJhY2tfaW4oZGV2X25ldChzdGF0ZS0+aW4pLCBQRl9JTkVUNiwgb3BzLT5ob29rbnVtLCBza2IpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IGlwdjZfY29ubnRyYWNrX2xvY2FsKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkJIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKIAkvKiByb290IGlzIHBsYXlpbmcgd2l0aCByYXcgc29ja2V0cy4gKi8KIAlpZiAoc2tiLT5sZW4gPCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSB7CiAJCW5ldF9ub3RpY2VfcmF0ZWxpbWl0ZWQoImlwdjZfY29ubnRyYWNrX2xvY2FsOiBwYWNrZXQgdG9vIHNob3J0XG4iKTsKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAl9Ci0JcmV0dXJuIG5mX2Nvbm50cmFja19pbihkZXZfbmV0KG91dCksIFBGX0lORVQ2LCBvcHMtPmhvb2tudW0sIHNrYik7CisJcmV0dXJuIG5mX2Nvbm50cmFja19pbihkZXZfbmV0KHN0YXRlLT5vdXQpLCBQRl9JTkVUNiwgb3BzLT5ob29rbnVtLCBza2IpOwogfQogCiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzIGlwdjZfY29ubnRyYWNrX29wc1tdIF9fcmVhZF9tb3N0bHkgPSB7CkBAIC0yOTAsMTAgKzI4Miw4IEBACiBzdGF0aWMgaW50IGlwdjZfdHVwbGVfdG9fbmxhdHRyKHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUpCiB7Ci0JaWYgKG5sYV9wdXQoc2tiLCBDVEFfSVBfVjZfU1JDLCBzaXplb2YodV9pbnQzMl90KSAqIDQsCi0JCSAgICAmdHVwbGUtPnNyYy51My5pcDYpIHx8Ci0JICAgIG5sYV9wdXQoc2tiLCBDVEFfSVBfVjZfRFNULCBzaXplb2YodV9pbnQzMl90KSAqIDQsCi0JCSAgICAmdHVwbGUtPmRzdC51My5pcDYpKQorCWlmIChubGFfcHV0X2luNl9hZGRyKHNrYiwgQ1RBX0lQX1Y2X1NSQywgJnR1cGxlLT5zcmMudTMuaW42KSB8fAorCSAgICBubGFfcHV0X2luNl9hZGRyKHNrYiwgQ1RBX0lQX1Y2X0RTVCwgJnR1cGxlLT5kc3QudTMuaW42KSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJcmV0dXJuIDA7CiAKQEAgLTMxMiwxMCArMzAyLDggQEAKIAlpZiAoIXRiW0NUQV9JUF9WNl9TUkNdIHx8ICF0YltDVEFfSVBfVjZfRFNUXSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltZW1jcHkoJnQtPnNyYy51My5pcDYsIG5sYV9kYXRhKHRiW0NUQV9JUF9WNl9TUkNdKSwKLQkgICAgICAgc2l6ZW9mKHVfaW50MzJfdCkgKiA0KTsKLQltZW1jcHkoJnQtPmRzdC51My5pcDYsIG5sYV9kYXRhKHRiW0NUQV9JUF9WNl9EU1RdKSwKLQkgICAgICAgc2l6ZW9mKHVfaW50MzJfdCkgKiA0KTsKKwl0LT5zcmMudTMuaW42ID0gbmxhX2dldF9pbjZfYWRkcih0YltDVEFfSVBfVjZfU1JDXSk7CisJdC0+ZHN0LnUzLmluNiA9IG5sYV9nZXRfaW42X2FkZHIodGJbQ1RBX0lQX1Y2X0RTVF0pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfZGVmcmFnX2lwdjZfaG9va3MuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2Nl9ob29rcy5jCmluZGV4IGU3MDM4MmUuLmE0NWRiMGIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2Nl9ob29rcy5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl9kZWZyYWdfaXB2Nl9ob29rcy5jCkBAIC01NCw5ICs1NCw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaXB2Nl9kZWZyYWcoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQljb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnJlYXNtOwogCkBAIC03Nyw5ICs3NSw5IEBACiAKIAluZl9jdF9mcmFnNl9jb25zdW1lX29yaWcocmVhc20pOwogCi0JTkZfSE9PS19USFJFU0goTkZQUk9UT19JUFY2LCBvcHMtPmhvb2tudW0sIHJlYXNtLAotCQkgICAgICAgKHN0cnVjdCBuZXRfZGV2aWNlICopIGluLCAoc3RydWN0IG5ldF9kZXZpY2UgKikgb3V0LAotCQkgICAgICAgb2tmbiwgTkZfSVA2X1BSSV9DT05OVFJBQ0tfREVGUkFHICsgMSk7CisJTkZfSE9PS19USFJFU0goTkZQUk9UT19JUFY2LCBvcHMtPmhvb2tudW0sIHN0YXRlLT5zaywgcmVhc20sCisJCSAgICAgICBzdGF0ZS0+aW4sIHN0YXRlLT5vdXQsCisJCSAgICAgICBzdGF0ZS0+b2tmbiwgTkZfSVA2X1BSSV9DT05OVFJBQ0tfREVGUkFHICsgMSk7CiAKIAlyZXR1cm4gTkZfU1RPTEVOOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX2xvZ19pcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfbG9nX2lwdjYuYwppbmRleCBkZGYwN2U2Li44ZGQ4Njk2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfbG9nX2lwdjYuYworKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfbG9nX2lwdjYuYwpAQCAtNSw4ICs1LDEwIEBACiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KKwogI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAogCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTI3LDcgKzI5LDcgQEAKIAkudHlwZQk9IE5GX0xPR19UWVBFX0xPRywKIAkudSA9IHsKIAkJLmxvZyA9IHsKLQkJCS5sZXZlbAkgID0gNSwKKwkJCS5sZXZlbAkgID0gTE9HTEVWRUxfTk9USUNFLAogCQkJLmxvZ2ZsYWdzID0gTkZfTE9HX01BU0ssCiAJCX0sCiAJfSwKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9uYXRfbDNwcm90b19pcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfbmF0X2wzcHJvdG9faXB2Ni5jCmluZGV4IGM1ODEyZTEuLmU3NjkwMGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9uYXRfbDNwcm90b19pcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX25hdF9sM3Byb3RvX2lwdjYuYwpAQCAtMjYzLDExICsyNjMsMTAgQEAKIAogdW5zaWduZWQgaW50CiBuZl9uYXRfaXB2Nl9mbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJICAgICAgIHVuc2lnbmVkIGludCAoKmRvX2NoYWluKShjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJCQljb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJCQkJCXN0cnVjdCBuZl9jb25uICpjdCkpCiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwpAQCAtMzE4LDcgKzMxNyw3IEBACiAJCWlmICghbmZfbmF0X2luaXRpYWxpemVkKGN0LCBtYW5pcHR5cGUpKSB7CiAJCQl1bnNpZ25lZCBpbnQgcmV0OwogCi0JCQlyZXQgPSBkb19jaGFpbihvcHMsIHNrYiwgaW4sIG91dCwgY3QpOworCQkJcmV0ID0gZG9fY2hhaW4ob3BzLCBza2IsIHN0YXRlLCBjdCk7CiAJCQlpZiAocmV0ICE9IE5GX0FDQ0VQVCkKIAkJCQlyZXR1cm4gcmV0OwogCkBAIC0zMzIsNyArMzMxLDcgQEAKIAkJCXByX2RlYnVnKCJBbHJlYWR5IHNldHVwIG1hbmlwICVzIGZvciBjdCAlcFxuIiwKIAkJCQkgbWFuaXB0eXBlID09IE5GX05BVF9NQU5JUF9TUkMgPyAiU1JDIiA6ICJEU1QiLAogCQkJCSBjdCk7Ci0JCQlpZiAobmZfbmF0X29pZl9jaGFuZ2VkKG9wcy0+aG9va251bSwgY3RpbmZvLCBuYXQsIG91dCkpCisJCQlpZiAobmZfbmF0X29pZl9jaGFuZ2VkKG9wcy0+aG9va251bSwgY3RpbmZvLCBuYXQsIHN0YXRlLT5vdXQpKQogCQkJCWdvdG8gb2lmX2NoYW5nZWQ7CiAJCX0KIAkJYnJlYWs7CkBAIC0zNDEsNyArMzQwLDcgQEAKIAkJLyogRVNUQUJMSVNIRUQgKi8KIAkJTkZfQ1RfQVNTRVJUKGN0aW5mbyA9PSBJUF9DVF9FU1RBQkxJU0hFRCB8fAogCQkJICAgICBjdGluZm8gPT0gSVBfQ1RfRVNUQUJMSVNIRURfUkVQTFkpOwotCQlpZiAobmZfbmF0X29pZl9jaGFuZ2VkKG9wcy0+aG9va251bSwgY3RpbmZvLCBuYXQsIG91dCkpCisJCWlmIChuZl9uYXRfb2lmX2NoYW5nZWQob3BzLT5ob29rbnVtLCBjdGluZm8sIG5hdCwgc3RhdGUtPm91dCkpCiAJCQlnb3RvIG9pZl9jaGFuZ2VkOwogCX0KIApAQCAtMzU1LDE3ICszNTQsMTYgQEAKIAogdW5zaWduZWQgaW50CiBuZl9uYXRfaXB2Nl9pbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkgICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJICAgICAgIHVuc2lnbmVkIGludCAoKmRvX2NoYWluKShjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJCQljb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJCQkJCXN0cnVjdCBuZl9jb25uICpjdCkpCiB7CiAJdW5zaWduZWQgaW50IHJldDsKIAlzdHJ1Y3QgaW42X2FkZHIgZGFkZHIgPSBpcHY2X2hkcihza2IpLT5kYWRkcjsKIAotCXJldCA9IG5mX25hdF9pcHY2X2ZuKG9wcywgc2tiLCBpbiwgb3V0LCBkb19jaGFpbik7CisJcmV0ID0gbmZfbmF0X2lwdjZfZm4ob3BzLCBza2IsIHN0YXRlLCBkb19jaGFpbik7CiAJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4gJiYKIAkgICAgaXB2Nl9hZGRyX2NtcCgmZGFkZHIsICZpcHY2X2hkcihza2IpLT5kYWRkcikpCiAJCXNrYl9kc3RfZHJvcChza2IpOwpAQCAtMzc2LDExICszNzQsMTAgQEAKIAogdW5zaWduZWQgaW50CiBuZl9uYXRfaXB2Nl9vdXQoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsIHN0cnVjdCBza19idWZmICpza2IsCi0JCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQl1bnNpZ25lZCBpbnQgKCpkb19jaGFpbikoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKKwkJCQkJIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwKIAkJCQkJIHN0cnVjdCBuZl9jb25uICpjdCkpCiB7CiAjaWZkZWYgQ09ORklHX1hGUk0KQEAgLTM5NCw3ICszOTEsNyBAQAogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpCiAJCXJldHVybiBORl9BQ0NFUFQ7CiAKLQlyZXQgPSBuZl9uYXRfaXB2Nl9mbihvcHMsIHNrYiwgaW4sIG91dCwgZG9fY2hhaW4pOworCXJldCA9IG5mX25hdF9pcHY2X2ZuKG9wcywgc2tiLCBzdGF0ZSwgZG9fY2hhaW4pOwogI2lmZGVmIENPTkZJR19YRlJNCiAJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4gJiYKIAkgICAgIShJUDZDQihza2IpLT5mbGFncyAmIElQNlNLQl9YRlJNX1RSQU5TRk9STUVEKSAmJgpAQCAtNDE4LDExICs0MTUsMTAgQEAKIAogdW5zaWduZWQgaW50CiBuZl9uYXRfaXB2Nl9sb2NhbF9mbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCSAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAogCQkgICAgIHVuc2lnbmVkIGludCAoKmRvX2NoYWluKShjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAorCQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJCQkJCSAgICAgIHN0cnVjdCBuZl9jb25uICpjdCkpCiB7CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0OwpAQCAtNDM0LDcgKzQzMCw3IEBACiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAotCXJldCA9IG5mX25hdF9pcHY2X2ZuKG9wcywgc2tiLCBpbiwgb3V0LCBkb19jaGFpbik7CisJcmV0ID0gbmZfbmF0X2lwdjZfZm4ob3BzLCBza2IsIHN0YXRlLCBkb19jaGFpbik7CiAJaWYgKHJldCAhPSBORl9EUk9QICYmIHJldCAhPSBORl9TVE9MRU4gJiYKIAkgICAgKGN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbykpICE9IE5VTEwpIHsKIAkJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZl9yZWplY3RfaXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX3JlamVjdF9pcHY2LmMKaW5kZXggZDA1YjM2NC4uOTRiNGM2ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX3JlamVjdF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mX3JlamVjdF9pcHY2LmMKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxuZXQvaXA2X2NoZWNrc3VtLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9pcHY2L25mX3JlamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9yZWplY3QuaD4KIAogY29uc3Qgc3RydWN0IHRjcGhkciAqbmZfcmVqZWN0X2lwNl90Y3BoZHJfZ2V0KHN0cnVjdCBza19idWZmICpvbGRza2IsCkBAIC02NSw3ICs2Niw3IEBACiAKIHN0cnVjdCBpcHY2aGRyICpuZl9yZWplY3RfaXA2aGRyX3B1dChzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpvbGRza2IsCi0JCQkJICAgICBfX2JlMTYgcHJvdG9jb2wsIGludCBob3BsaW1pdCkKKwkJCQkgICAgIF9fdTggcHJvdG9jb2wsIGludCBob3BsaW1pdCkKIHsKIAlzdHJ1Y3QgaXB2NmhkciAqaXA2aDsKIAljb25zdCBzdHJ1Y3QgaXB2NmhkciAqb2lwNmggPSBpcHY2X2hkcihvbGRza2IpOwpAQCAtMTk1LDcgKzE5Niw4IEBACiAJICovCiAJaWYgKG9sZHNrYi0+bmZfYnJpZGdlKSB7CiAJCXN0cnVjdCBldGhoZHIgKm9ldGggPSBldGhfaGRyKG9sZHNrYik7Ci0JCW5za2ItPmRldiA9IG9sZHNrYi0+bmZfYnJpZGdlLT5waHlzaW5kZXY7CisKKwkJbnNrYi0+ZGV2ID0gbmZfYnJpZGdlX2dldF9waHlzaW5kZXYob2xkc2tiKTsKIAkJbnNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKIAkJaXA2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhzaXplb2Yoc3RydWN0IHRjcGhkcikpOwogCQlpZiAoZGV2X2hhcmRfaGVhZGVyKG5za2IsIG5za2ItPmRldiwgbnRvaHMobnNrYi0+cHJvdG9jb2wpLApAQCAtMjA4LDQgKzIxMCwzOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfc2VuZF9yZXNldDYpOwogCitzdGF0aWMgYm9vbCByZWplY3Q2X2NzdW1fb2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhvb2spCit7CisJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmggPSBpcHY2X2hkcihza2IpOworCWludCB0aG9mZjsKKwlfX2JlMTYgZm87CisJdTggcHJvdG87CisKKwlpZiAoc2tiLT5jc3VtX2JhZCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHNrYl9jc3VtX3VubmVjZXNzYXJ5KHNrYikpCisJCXJldHVybiB0cnVlOworCisJcHJvdG8gPSBpcDZoLT5uZXh0aGRyOworCXRob2ZmID0gaXB2Nl9za2lwX2V4dGhkcihza2IsICgodTgqKShpcDZoKzEpIC0gc2tiLT5kYXRhKSwgJnByb3RvLCAmZm8pOworCisJaWYgKHRob2ZmIDwgMCB8fCB0aG9mZiA+PSBza2ItPmxlbiB8fCAoZm8gJiBodG9ucyh+MHg3KSkgIT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIG5mX2lwNl9jaGVja3N1bShza2IsIGhvb2ssIHRob2ZmLCBwcm90bykgPT0gMDsKK30KKwordm9pZCBuZl9zZW5kX3VucmVhY2g2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYl9pbiwKKwkJICAgICAgdW5zaWduZWQgY2hhciBjb2RlLCB1bnNpZ25lZCBpbnQgaG9va251bSkKK3sKKwlpZiAoIXJlamVjdDZfY3N1bV9vayhza2JfaW4sIGhvb2tudW0pKQorCQlyZXR1cm47CisKKwlpZiAoaG9va251bSA9PSBORl9JTkVUX0xPQ0FMX09VVCAmJiBza2JfaW4tPmRldiA9PSBOVUxMKQorCQlza2JfaW4tPmRldiA9IG5ldC0+bG9vcGJhY2tfZGV2OworCisJaWNtcHY2X3NlbmQoc2tiX2luLCBJQ01QVjZfREVTVF9VTlJFQUNILCBjb2RlLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mX3NlbmRfdW5yZWFjaDYpOworCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZfdGFibGVzX2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5jCmluZGV4IDBkODEyYjMuLmM4MTQ4YmEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZl90YWJsZXNfaXB2Ni5jCkBAIC0xOCwxNCArMTgsMTIgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBuZnRfZG9fY2hhaW5faXB2Nihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKIAlzdHJ1Y3QgbmZ0X3BrdGluZm8gcGt0OwogCiAJLyogbWFsZm9ybWVkIHBhY2tldCwgZHJvcCBpdCAqLwotCWlmIChuZnRfc2V0X3BrdGluZm9faXB2NigmcGt0LCBvcHMsIHNrYiwgaW4sIG91dCkgPCAwKQorCWlmIChuZnRfc2V0X3BrdGluZm9faXB2NigmcGt0LCBvcHMsIHNrYiwgc3RhdGUpIDwgMCkKIAkJcmV0dXJuIE5GX0RST1A7CiAKIAlyZXR1cm4gbmZ0X2RvX2NoYWluKCZwa3QsIG9wcyk7CkBAIC0zMyw5ICszMSw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmZ0X2lwdjZfb3V0cHV0KGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSkpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKQEAgLTQ0LDcgKzQwLDcgQEAKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAl9CiAKLQlyZXR1cm4gbmZ0X2RvX2NoYWluX2lwdjYob3BzLCBza2IsIGluLCBvdXQsIG9rZm4pOworCXJldHVybiBuZnRfZG9fY2hhaW5faXB2NihvcHMsIHNrYiwgc3RhdGUpOwogfQogCiBzdHJ1Y3QgbmZ0X2FmX2luZm8gbmZ0X2FmX2lwdjYgX19yZWFkX21vc3RseSA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fbmF0X2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fbmF0X2lwdjYuYwppbmRleCAxYzRiNzVkLi45NTFiYjQ1IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X2NoYWluX25hdF9pcHY2LmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9jaGFpbl9uYXRfaXB2Ni5jCkBAIC0yNiw1MSArMjYsNDIgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBuZnRfbmF0X2RvX2NoYWluKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUsCiAJCQkJICAgICBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7CiAJc3RydWN0IG5mdF9wa3RpbmZvIHBrdDsKIAotCW5mdF9zZXRfcGt0aW5mb19pcHY2KCZwa3QsIG9wcywgc2tiLCBpbiwgb3V0KTsKKwluZnRfc2V0X3BrdGluZm9faXB2NigmcGt0LCBvcHMsIHNrYiwgc3RhdGUpOwogCiAJcmV0dXJuIG5mdF9kb19jaGFpbigmcGt0LCBvcHMpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IG5mdF9uYXRfaXB2Nl9mbihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCSAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewotCXJldHVybiBuZl9uYXRfaXB2Nl9mbihvcHMsIHNrYiwgaW4sIG91dCwgbmZ0X25hdF9kb19jaGFpbik7CisJcmV0dXJuIG5mX25hdF9pcHY2X2ZuKG9wcywgc2tiLCBzdGF0ZSwgbmZ0X25hdF9kb19jaGFpbik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmZ0X25hdF9pcHY2X2luKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCQkJICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCSAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7Ci0JcmV0dXJuIG5mX25hdF9pcHY2X2luKG9wcywgc2tiLCBpbiwgb3V0LCBuZnRfbmF0X2RvX2NoYWluKTsKKwlyZXR1cm4gbmZfbmF0X2lwdjZfaW4ob3BzLCBza2IsIHN0YXRlLCBuZnRfbmF0X2RvX2NoYWluKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBuZnRfbmF0X2lwdjZfb3V0KGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKLQlyZXR1cm4gbmZfbmF0X2lwdjZfb3V0KG9wcywgc2tiLCBpbiwgb3V0LCBuZnRfbmF0X2RvX2NoYWluKTsKKwlyZXR1cm4gbmZfbmF0X2lwdjZfb3V0KG9wcywgc2tiLCBzdGF0ZSwgbmZ0X25hdF9kb19jaGFpbik7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmZ0X25hdF9pcHY2X2xvY2FsX2ZuKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLAogCQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCQkJCSAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJCSAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewotCXJldHVybiBuZl9uYXRfaXB2Nl9sb2NhbF9mbihvcHMsIHNrYiwgaW4sIG91dCwgbmZ0X25hdF9kb19jaGFpbik7CisJcmV0dXJuIG5mX25hdF9pcHY2X2xvY2FsX2ZuKG9wcywgc2tiLCBzdGF0ZSwgbmZ0X25hdF9kb19jaGFpbik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZfY2hhaW5fdHlwZSBuZnRfY2hhaW5fbmF0X2lwdjYgPSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X2NoYWluX3JvdXRlX2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2Ni5jCmluZGV4IDQyMDMxMjkuLjBkYWZkYWEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfY2hhaW5fcm91dGVfaXB2Ni5jCkBAIC0yNCw5ICsyNCw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbmZfcm91dGVfdGFibGVfaG9vayhjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXVuc2lnbmVkIGludCByZXQ7CiAJc3RydWN0IG5mdF9wa3RpbmZvIHBrdDsKQEAgLTM1LDcgKzMzLDcgQEAKIAl1MzIgbWFyaywgZmxvd2xhYmVsOwogCiAJLyogbWFsZm9ybWVkIHBhY2tldCwgZHJvcCBpdCAqLwotCWlmIChuZnRfc2V0X3BrdGluZm9faXB2NigmcGt0LCBvcHMsIHNrYiwgaW4sIG91dCkgPCAwKQorCWlmIChuZnRfc2V0X3BrdGluZm9faXB2NigmcGt0LCBvcHMsIHNrYiwgc3RhdGUpIDwgMCkKIAkJcmV0dXJuIE5GX0RST1A7CiAKIAkvKiBzYXZlIHNvdXJjZS9kZXN0IGFkZHJlc3MsIG1hcmssIGhvcGxpbWl0LCBmbG93bGFiZWwsIHByaW9yaXR5ICovCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X21hc3FfaXB2Ni5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9tYXNxX2lwdjYuYwppbmRleCA1MjljMTE5Li5jZDFhYzE2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X21hc3FfaXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfbWFzcV9pcHY2LmMKQEAgLTE4LDE5ICsxOCwxNiBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9uYXRfbWFzcXVlcmFkZS5oPgogCiBzdGF0aWMgdm9pZCBuZnRfbWFzcV9pcHY2X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkgICAgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCXN0cnVjdCBuZnRfbWFzcSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAJc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZTsKLQl1bnNpZ25lZCBpbnQgdmVyZGljdDsKIAogCW1lbXNldCgmcmFuZ2UsIDAsIHNpemVvZihyYW5nZSkpOwogCXJhbmdlLmZsYWdzID0gcHJpdi0+ZmxhZ3M7CiAKLQl2ZXJkaWN0ID0gbmZfbmF0X21hc3F1ZXJhZGVfaXB2Nihwa3QtPnNrYiwgJnJhbmdlLCBwa3QtPm91dCk7Ci0KLQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IHZlcmRpY3Q7CisJcmVncy0+dmVyZGljdC5jb2RlID0gbmZfbmF0X21hc3F1ZXJhZGVfaXB2Nihwa3QtPnNrYiwgJnJhbmdlLCBwa3QtPm91dCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfbWFzcV9pcHY2X3R5cGU7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X3JlZGlyX2lwdjYuYyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfcmVkaXJfaXB2Ni5jCmluZGV4IDExODIwYjYuLmVmZmQzOTMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9uZnRfcmVkaXJfaXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfcmVkaXJfaXB2Ni5jCkBAIC0xOCwyNiArMTgsMjUgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdF9yZWRpcmVjdC5oPgogCiBzdGF0aWMgdm9pZCBuZnRfcmVkaXJfaXB2Nl9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKLQkJCQlzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJCXN0cnVjdCBuZnRfcmVncyAqcmVncywKIAkJCQljb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKIHsKIAlzdHJ1Y3QgbmZ0X3JlZGlyICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKIAlzdHJ1Y3QgbmZfbmF0X3JhbmdlIHJhbmdlOwotCXVuc2lnbmVkIGludCB2ZXJkaWN0OwogCiAJbWVtc2V0KCZyYW5nZSwgMCwgc2l6ZW9mKHJhbmdlKSk7CiAJaWYgKHByaXYtPnNyZWdfcHJvdG9fbWluKSB7CiAJCXJhbmdlLm1pbl9wcm90by5hbGwgPQotCQkJKihfX2JlMTYgKikmZGF0YVtwcml2LT5zcmVnX3Byb3RvX21pbl0uZGF0YVswXTsKKwkJCSooX19iZTE2ICopJnJlZ3MtPmRhdGFbcHJpdi0+c3JlZ19wcm90b19taW5dLAogCQlyYW5nZS5tYXhfcHJvdG8uYWxsID0KLQkJCSooX19iZTE2ICopJmRhdGFbcHJpdi0+c3JlZ19wcm90b19tYXhdLmRhdGFbMF07CisJCQkqKF9fYmUxNiAqKSZyZWdzLT5kYXRhW3ByaXYtPnNyZWdfcHJvdG9fbWF4XSwKIAkJcmFuZ2UuZmxhZ3MgfD0gTkZfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRDsKIAl9CiAKIAlyYW5nZS5mbGFncyB8PSBwcml2LT5mbGFnczsKIAotCXZlcmRpY3QgPSBuZl9uYXRfcmVkaXJlY3RfaXB2Nihwa3QtPnNrYiwgJnJhbmdlLCBwa3QtPm9wcy0+aG9va251bSk7Ci0JZGF0YVtORlRfUkVHX1ZFUkRJQ1RdLnZlcmRpY3QgPSB2ZXJkaWN0OworCXJlZ3MtPnZlcmRpY3QuY29kZSA9IG5mX25hdF9yZWRpcmVjdF9pcHY2KHBrdC0+c2tiLCAmcmFuZ2UsCisJCQkJCQkgIHBrdC0+b3BzLT5ob29rbnVtKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9yZWRpcl9pcHY2X3R5cGU7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY2LmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pcHY2LmMKaW5kZXggZjczMjg1OS4uZDBkMTU0MCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL25mdF9yZWplY3RfaXB2Ni5jCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9uZnRfcmVqZWN0X2lwdjYuYwpAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9yZWplY3QuaD4KIAogc3RhdGljIHZvaWQgbmZ0X3JlamVjdF9pcHY2X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJCSBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJCSBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCiAJCQkJIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCXN0cnVjdCBuZnRfcmVqZWN0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKQEAgLTM0LDkgKzM0LDExIEBACiAJY2FzZSBORlRfUkVKRUNUX1RDUF9SU1Q6CiAJCW5mX3NlbmRfcmVzZXQ2KG5ldCwgcGt0LT5za2IsIHBrdC0+b3BzLT5ob29rbnVtKTsKIAkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCi0JZGF0YVtORlRfUkVHX1ZFUkRJQ1RdLnZlcmRpY3QgPSBORl9EUk9QOworCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GX0RST1A7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfcmVqZWN0X2lwdjZfdHlwZTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L291dHB1dF9jb3JlLmMgYi9uZXQvaXB2Ni9vdXRwdXRfY29yZS5jCmluZGV4IDc0NTgxZjcuLjg1ODkyYWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L291dHB1dF9jb3JlLmMKKysrIGIvbmV0L2lwdjYvb3V0cHV0X2NvcmUuYwpAQCAtOSwxMyArOSwxNCBAQAogI2luY2x1ZGUgPG5ldC9hZGRyY29uZi5oPgogI2luY2x1ZGUgPG5ldC9zZWN1cmVfc2VxLmg+CiAKLXN0YXRpYyB1MzIgX19pcHY2X3NlbGVjdF9pZGVudCh1MzIgaGFzaHJuZCwgc3RydWN0IGluNl9hZGRyICpkc3QsCi0JCQkgICAgICAgc3RydWN0IGluNl9hZGRyICpzcmMpCitzdGF0aWMgdTMyIF9faXB2Nl9zZWxlY3RfaWRlbnQoc3RydWN0IG5ldCAqbmV0LCB1MzIgaGFzaHJuZCwKKwkJCSAgICAgICBzdHJ1Y3QgaW42X2FkZHIgKmRzdCwgc3RydWN0IGluNl9hZGRyICpzcmMpCiB7CiAJdTMyIGhhc2gsIGlkOwogCiAJaGFzaCA9IF9faXB2Nl9hZGRyX2poYXNoKGRzdCwgaGFzaHJuZCk7CiAJaGFzaCA9IF9faXB2Nl9hZGRyX2poYXNoKHNyYywgaGFzaCk7CisJaGFzaCBePSBuZXRfaGFzaF9taXgobmV0KTsKIAogCS8qIFRyZWF0IGlkIG9mIDAgYXMgdW5zZXQgYW5kIGlmIHdlIGdldCAwIGJhY2sgZnJvbSBpcF9pZGVudHNfcmVzZXJ2ZSwKIAkgKiBzZXQgdGhlIGhpZ2h0IG9yZGVyIGluc3RlYWQgdGh1cyBtaW5pbWl6aW5nIHBvc3NpYmxlIGZ1dHVyZQpAQCAtMzYsNyArMzcsNyBAQAogICoKICAqIFRoZSBuZXR3b3JrIGhlYWRlciBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzLgogICovCi12b2lkIGlwdjZfcHJveHlfc2VsZWN0X2lkZW50KHN0cnVjdCBza19idWZmICpza2IpCit2b2lkIGlwdjZfcHJveHlfc2VsZWN0X2lkZW50KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdGF0aWMgdTMyIGlwNl9wcm94eV9pZGVudHNfaGFzaHJuZCBfX3JlYWRfbW9zdGx5OwogCXN0cnVjdCBpbjZfYWRkciBidWZbMl07CkBAIC01MywyMCArNTQsMjEgQEAKIAluZXRfZ2V0X3JhbmRvbV9vbmNlKCZpcDZfcHJveHlfaWRlbnRzX2hhc2hybmQsCiAJCQkgICAgc2l6ZW9mKGlwNl9wcm94eV9pZGVudHNfaGFzaHJuZCkpOwogCi0JaWQgPSBfX2lwdjZfc2VsZWN0X2lkZW50KGlwNl9wcm94eV9pZGVudHNfaGFzaHJuZCwKKwlpZCA9IF9faXB2Nl9zZWxlY3RfaWRlbnQobmV0LCBpcDZfcHJveHlfaWRlbnRzX2hhc2hybmQsCiAJCQkJICZhZGRyc1sxXSwgJmFkZHJzWzBdKTsKIAlza2Jfc2hpbmZvKHNrYiktPmlwNl9mcmFnX2lkID0gaHRvbmwoaWQpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaXB2Nl9wcm94eV9zZWxlY3RfaWRlbnQpOwogCi12b2lkIGlwdjZfc2VsZWN0X2lkZW50KHN0cnVjdCBmcmFnX2hkciAqZmhkciwgc3RydWN0IHJ0Nl9pbmZvICpydCkKK3ZvaWQgaXB2Nl9zZWxlY3RfaWRlbnQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgZnJhZ19oZHIgKmZoZHIsCisJCSAgICAgICBzdHJ1Y3QgcnQ2X2luZm8gKnJ0KQogewogCXN0YXRpYyB1MzIgaXA2X2lkZW50c19oYXNocm5kIF9fcmVhZF9tb3N0bHk7CiAJdTMyIGlkOwogCiAJbmV0X2dldF9yYW5kb21fb25jZSgmaXA2X2lkZW50c19oYXNocm5kLCBzaXplb2YoaXA2X2lkZW50c19oYXNocm5kKSk7CiAKLQlpZCA9IF9faXB2Nl9zZWxlY3RfaWRlbnQoaXA2X2lkZW50c19oYXNocm5kLCAmcnQtPnJ0NmlfZHN0LmFkZHIsCisJaWQgPSBfX2lwdjZfc2VsZWN0X2lkZW50KG5ldCwgaXA2X2lkZW50c19oYXNocm5kLCAmcnQtPnJ0NmlfZHN0LmFkZHIsCiAJCQkJICZydC0+cnQ2aV9zcmMuYWRkcik7CiAJZmhkci0+aWRlbnRpZmljYXRpb24gPSBodG9ubChpZCk7CiB9CkBAIC0xMzQsNyArMTM2LDcgQEAKIEVYUE9SVF9TWU1CT0woaXA2X2RzdF9ob3BsaW1pdCk7CiAjZW5kaWYKIAotaW50IF9faXA2X2xvY2FsX291dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBfX2lwNl9sb2NhbF9vdXRfc2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBsZW47CiAKQEAgLTE0NCwxOSArMTQ2LDMwIEBACiAJaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4gPSBodG9ucyhsZW4pOwogCUlQNkNCKHNrYiktPm5ob2ZmID0gb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsIG5leHRoZHIpOwogCi0JcmV0dXJuIG5mX2hvb2soTkZQUk9UT19JUFY2LCBORl9JTkVUX0xPQ0FMX09VVCwgc2tiLCBOVUxMLAotCQkgICAgICAgc2tiX2RzdChza2IpLT5kZXYsIGRzdF9vdXRwdXQpOworCXJldHVybiBuZl9ob29rKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9MT0NBTF9PVVQsIHNrLCBza2IsCisJCSAgICAgICBOVUxMLCBza2JfZHN0KHNrYiktPmRldiwgZHN0X291dHB1dF9zayk7Cit9CisKK2ludCBfX2lwNl9sb2NhbF9vdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gX19pcDZfbG9jYWxfb3V0X3NrKHNrYi0+c2ssIHNrYik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2lwNl9sb2NhbF9vdXQpOwogCi1pbnQgaXA2X2xvY2FsX291dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IGlwNl9sb2NhbF9vdXRfc2soc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWludCBlcnI7CiAKLQllcnIgPSBfX2lwNl9sb2NhbF9vdXQoc2tiKTsKKwllcnIgPSBfX2lwNl9sb2NhbF9vdXRfc2soc2ssIHNrYik7CiAJaWYgKGxpa2VseShlcnIgPT0gMSkpCi0JCWVyciA9IGRzdF9vdXRwdXQoc2tiKTsKKwkJZXJyID0gZHN0X291dHB1dF9zayhzaywgc2tiKTsKIAogCXJldHVybiBlcnI7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChpcDZfbG9jYWxfb3V0X3NrKTsKKworaW50IGlwNl9sb2NhbF9vdXQoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gaXA2X2xvY2FsX291dF9zayhza2ItPnNrLCBza2IpOworfQogRVhQT1JUX1NZTUJPTF9HUEwoaXA2X2xvY2FsX291dCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9waW5nLmMgYi9uZXQvaXB2Ni9waW5nLmMKaW5kZXggYTJkZmZmNi4uMjYzYTUxNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcGluZy5jCisrKyBiL25ldC9pcHY2L3BpbmcuYwpAQCAtNzcsOCArNzcsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcGluZ192Nl9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCi0JCSAgICBzaXplX3QgbGVuKQoraW50IHBpbmdfdjZfc2VuZG1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmF3LmMgYi9uZXQvaXB2Ni9yYXcuYwppbmRleCBkYWU3ZjFhLi44MDcyYmQ0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yYXcuYworKysgYi9uZXQvaXB2Ni9yYXcuYwpAQCAtMzIsNyArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvY3Rscy5oPgogCiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KQEAgLTE3Miw3ICsxNzIsNyBAQAogCXJlYWRfbG9jaygmcmF3X3Y2X2hhc2hpbmZvLmxvY2spOwogCXNrID0gc2tfaGVhZCgmcmF3X3Y2X2hhc2hpbmZvLmh0W2hhc2hdKTsKIAotCWlmIChzayA9PSBOVUxMKQorCWlmICghc2spCiAJCWdvdG8gb3V0OwogCiAJbmV0ID0gZGV2X25ldChza2ItPmRldik7CkBAIC0zNjcsNyArMzY3LDcgQEAKIAogCXJlYWRfbG9jaygmcmF3X3Y2X2hhc2hpbmZvLmxvY2spOwogCXNrID0gc2tfaGVhZCgmcmF3X3Y2X2hhc2hpbmZvLmh0W2hhc2hdKTsKLQlpZiAoc2sgIT0gTlVMTCkgeworCWlmIChzaykgewogCQkvKiBOb3RlOiBpcHY2X2hkcihza2IpICE9IHNrYi0+ZGF0YSAqLwogCQljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXA2aCA9IChjb25zdCBzdHJ1Y3QgaXB2NmhkciAqKXNrYi0+ZGF0YTsKIAkJc2FkZHIgPSAmaXA2aC0+c2FkZHI7CkBAIC00NTYsOSArNDU2LDggQEAKICAqCXdlIHJldHVybiBpdCwgb3RoZXJ3aXNlIHdlIGJsb2NrLgogICovCiAKLXN0YXRpYyBpbnQgcmF3djZfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCi0JCSAgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKK3N0YXRpYyBpbnQgcmF3djZfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCSBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQogewogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKIAlERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl9pbjYgKiwgc2luNiwgbXNnLT5tc2dfbmFtZSk7CkBAIC02MzEsNyArNjMwLDcgQEAKIAlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLAogCQkJCSAgbGVuZ3RoICsgaGxlbiArIHRsZW4gKyAxNSwKIAkJCQkgIGZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKTsKLQlpZiAoc2tiID09IE5VTEwpCisJaWYgKCFza2IpCiAJCWdvdG8gZXJyb3I7CiAJc2tiX3Jlc2VydmUoc2tiLCBobGVuKTsKIApAQCAtNjUzLDggKzY1Miw4IEBACiAJCWdvdG8gZXJyb3JfZmF1bHQ7CiAKIAlJUDZfVVBEX1BPX1NUQVRTKHNvY2tfbmV0KHNrKSwgcnQtPnJ0NmlfaWRldiwgSVBTVEFUU19NSUJfT1VULCBza2ItPmxlbik7Ci0JZXJyID0gTkZfSE9PSyhORlBST1RPX0lQVjYsIE5GX0lORVRfTE9DQUxfT1VULCBza2IsIE5VTEwsCi0JCSAgICAgIHJ0LT5kc3QuZGV2LCBkc3Rfb3V0cHV0KTsKKwllcnIgPSBORl9IT09LKE5GUFJPVE9fSVBWNiwgTkZfSU5FVF9MT0NBTF9PVVQsIHNrLCBza2IsCisJCSAgICAgIE5VTEwsIHJ0LT5kc3QuZGV2LCBkc3Rfb3V0cHV0X3NrKTsKIAlpZiAoZXJyID4gMCkKIAkJZXJyID0gbmV0X3htaXRfZXJybm8oZXJyKTsKIAlpZiAoZXJyKQpAQCAtNzMwLDggKzcyOSw3IEBACiAJcmV0dXJuIGlwX2dlbmVyaWNfZ2V0ZnJhZyhyZnYtPm1zZywgdG8sIG9mZnNldCwgbGVuLCBvZGQsIHNrYik7CiB9CiAKLXN0YXRpYyBpbnQgcmF3djZfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCByYXd2Nl9zZW5kbXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBpcHY2X3R4b3B0aW9ucyBvcHRfc3BhY2U7CiAJREVDTEFSRV9TT0NLQUREUihzdHJ1Y3Qgc29ja2FkZHJfaW42ICosIHNpbjYsIG1zZy0+bXNnX25hbWUpOwpAQCAtNzkxLDcgKzc4OSw3IEBACiAJCQlmbDYuZmxvd2xhYmVsID0gc2luNi0+c2luNl9mbG93aW5mbyZJUFY2X0ZMT1dJTkZPX01BU0s7CiAJCQlpZiAoZmw2LmZsb3dsYWJlbCZJUFY2X0ZMT1dMQUJFTF9NQVNLKSB7CiAJCQkJZmxvd2xhYmVsID0gZmw2X3NvY2tfbG9va3VwKHNrLCBmbDYuZmxvd2xhYmVsKTsKLQkJCQlpZiAoZmxvd2xhYmVsID09IE5VTEwpCisJCQkJaWYgKCFmbG93bGFiZWwpCiAJCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CkBAIC04MzMsMTMgKzgzMSwxMyBAQAogCQl9CiAJCWlmICgoZmw2LmZsb3dsYWJlbCZJUFY2X0ZMT1dMQUJFTF9NQVNLKSAmJiAhZmxvd2xhYmVsKSB7CiAJCQlmbG93bGFiZWwgPSBmbDZfc29ja19sb29rdXAoc2ssIGZsNi5mbG93bGFiZWwpOwotCQkJaWYgKGZsb3dsYWJlbCA9PSBOVUxMKQorCQkJaWYgKCFmbG93bGFiZWwpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJaWYgKCEob3B0LT5vcHRfbmZsZW58b3B0LT5vcHRfZmxlbikpCiAJCQlvcHQgPSBOVUxMOwogCX0KLQlpZiAob3B0ID09IE5VTEwpCisJaWYgKCFvcHQpCiAJCW9wdCA9IG5wLT5vcHQ7CiAJaWYgKGZsb3dsYWJlbCkKIAkJb3B0ID0gZmw2X21lcmdlX29wdGlvbnMoJm9wdF9zcGFjZSwgZmxvd2xhYmVsLCBvcHQpOwpAQCAtMTEzMiw3ICsxMTMwLDcgQEAKIAogCQlzcGluX2xvY2tfYmgoJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogCQlza2IgPSBza2JfcGVlaygmc2stPnNrX3JlY2VpdmVfcXVldWUpOwotCQlpZiAoc2tiICE9IE5VTEwpCisJCWlmIChza2IpCiAJCQlhbW91bnQgPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLQogCQkJCXNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYik7CiAJCXNwaW5fdW5sb2NrX2JoKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYyBiL25ldC9pcHY2L3JlYXNzZW1ibHkuYwppbmRleCBkN2Q3MGU2Li44ZmZhMmM4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKKysrIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCkBAIC00MzAsNyArNDMwLDcgQEAKIAkJaW50IGksIHBsZW4gPSAwOwogCiAJCWNsb25lID0gYWxsb2Nfc2tiKDAsIEdGUF9BVE9NSUMpOwotCQlpZiAoY2xvbmUgPT0gTlVMTCkKKwkJaWYgKCFjbG9uZSkKIAkJCWdvdG8gb3V0X29vbTsKIAkJY2xvbmUtPm5leHQgPSBoZWFkLT5uZXh0OwogCQloZWFkLT5uZXh0ID0gY2xvbmU7CkBAIC01NTIsNyArNTUyLDcgQEAKIAogCWZxID0gZnFfZmluZChuZXQsIGZoZHItPmlkZW50aWZpY2F0aW9uLCAmaGRyLT5zYWRkciwgJmhkci0+ZGFkZHIsCiAJCSAgICAgaXA2X2ZyYWdfZWNuKGhkcikpOwotCWlmIChmcSAhPSBOVUxMKSB7CisJaWYgKGZxKSB7CiAJCWludCByZXQ7CiAKIAkJc3Bpbl9sb2NrKCZmcS0+cS5sb2NrKTsKQEAgLTYzMiw3ICs2MzIsNyBAQAogCXRhYmxlID0gaXA2X2ZyYWdzX25zX2N0bF90YWJsZTsKIAlpZiAoIW5ldF9lcShuZXQsICZpbml0X25ldCkpIHsKIAkJdGFibGUgPSBrbWVtZHVwKHRhYmxlLCBzaXplb2YoaXA2X2ZyYWdzX25zX2N0bF90YWJsZSksIEdGUF9LRVJORUwpOwotCQlpZiAodGFibGUgPT0gTlVMTCkKKwkJaWYgKCF0YWJsZSkKIAkJCWdvdG8gZXJyX2FsbG9jOwogCiAJCXRhYmxlWzBdLmRhdGEgPSAmbmV0LT5pcHY2LmZyYWdzLmhpZ2hfdGhyZXNoOwpAQCAtNjQ4LDcgKzY0OCw3IEBACiAJfQogCiAJaGRyID0gcmVnaXN0ZXJfbmV0X3N5c2N0bChuZXQsICJuZXQvaXB2NiIsIHRhYmxlKTsKLQlpZiAoaGRyID09IE5VTEwpCisJaWYgKCFoZHIpCiAJCWdvdG8gZXJyX3JlZzsKIAogCW5ldC0+aXB2Ni5zeXNjdGwuZnJhZ3NfaGRyID0gaGRyOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcm91dGUuYyBiL25ldC9pcHY2L3JvdXRlLmMKaW5kZXggNDY4OGJkNC4uNWM0ODI5MyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvcm91dGUuYworKysgYi9uZXQvaXB2Ni9yb3V0ZS5jCkBAIC0xOTQsNyArMTk0LDYgQEAKIAogc3RhdGljIHN0cnVjdCBkc3Rfb3BzIGlwNl9kc3Rfb3BzX3RlbXBsYXRlID0gewogCS5mYW1pbHkJCQk9CUFGX0lORVQ2LAotCS5wcm90b2NvbAkJPQljcHVfdG9fYmUxNihFVEhfUF9JUFY2KSwKIAkuZ2MJCQk9CWlwNl9kc3RfZ2MsCiAJLmdjX3RocmVzaAkJPQkxMDI0LAogCS5jaGVjawkJCT0JaXA2X2RzdF9jaGVjaywKQEAgLTIzNiw3ICsyMzUsNiBAQAogCiBzdGF0aWMgc3RydWN0IGRzdF9vcHMgaXA2X2RzdF9ibGFja2hvbGVfb3BzID0gewogCS5mYW1pbHkJCQk9CUFGX0lORVQ2LAotCS5wcm90b2NvbAkJPQljcHVfdG9fYmUxNihFVEhfUF9JUFY2KSwKIAkuZGVzdHJveQkJPQlpcDZfZHN0X2Rlc3Ryb3ksCiAJLmNoZWNrCQkJPQlpcDZfZHN0X2NoZWNrLAogCS5tdHUJCQk9CWlwNl9ibGFja2hvbGVfbXR1LApAQCAtMTQ3OCw3ICsxNDc2LDcgQEAKIAlpbnQgcmVtYWluaW5nOwogCXUzMiAqbXA7CiAKLQlpZiAoY2ZnLT5mY19teCA9PSBOVUxMKQorCWlmICghY2ZnLT5mY19teCkKIAkJcmV0dXJuIDA7CiAKIAltcCA9IGt6YWxsb2Moc2l6ZW9mKHUzMikgKiBSVEFYX01BWCwgR0ZQX0tFUk5FTCk7CkBAIC0yNDAwLDYgKzIzOTgsNyBAQAogCVtSVEFfUFJJT1JJVFldICAgICAgICAgID0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbUlRBX01FVFJJQ1NdICAgICAgICAgICA9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCiAJW1JUQV9NVUxUSVBBVEhdCQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgcnRuZXh0aG9wKSB9LAorCVtSVEFfUFJFRl0gICAgICAgICAgICAgID0geyAudHlwZSA9IE5MQV9VOCB9LAogfTsKIAogc3RhdGljIGludCBydG1fdG9fZmliNl9jb25maWcoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgsCkBAIC0yNDA3LDYgKzI0MDYsNyBAQAogewogCXN0cnVjdCBydG1zZyAqcnRtOwogCXN0cnVjdCBubGF0dHIgKnRiW1JUQV9NQVgrMV07CisJdW5zaWduZWQgaW50IHByZWY7CiAJaW50IGVycjsKIAogCWVyciA9IG5sbXNnX3BhcnNlKG5saCwgc2l6ZW9mKCpydG0pLCB0YiwgUlRBX01BWCwgcnRtX2lwdjZfcG9saWN5KTsKQEAgLTI0MzgsNyArMjQzOCw3IEBACiAJY2ZnLT5mY19ubGluZm8ubmxfbmV0ID0gc29ja19uZXQoc2tiLT5zayk7CiAKIAlpZiAodGJbUlRBX0dBVEVXQVldKSB7Ci0JCW5sYV9tZW1jcHkoJmNmZy0+ZmNfZ2F0ZXdheSwgdGJbUlRBX0dBVEVXQVldLCAxNik7CisJCWNmZy0+ZmNfZ2F0ZXdheSA9IG5sYV9nZXRfaW42X2FkZHIodGJbUlRBX0dBVEVXQVldKTsKIAkJY2ZnLT5mY19mbGFncyB8PSBSVEZfR0FURVdBWTsKIAl9CiAKQEAgLTI0NjEsNyArMjQ2MSw3IEBACiAJfQogCiAJaWYgKHRiW1JUQV9QUkVGU1JDXSkKLQkJbmxhX21lbWNweSgmY2ZnLT5mY19wcmVmc3JjLCB0YltSVEFfUFJFRlNSQ10sIDE2KTsKKwkJY2ZnLT5mY19wcmVmc3JjID0gbmxhX2dldF9pbjZfYWRkcih0YltSVEFfUFJFRlNSQ10pOwogCiAJaWYgKHRiW1JUQV9PSUZdKQogCQljZmctPmZjX2lmaW5kZXggPSBubGFfZ2V0X3UzMih0YltSVEFfT0lGXSk7CkBAIC0yNDgyLDYgKzI0ODIsMTQgQEAKIAkJY2ZnLT5mY19tcF9sZW4gPSBubGFfbGVuKHRiW1JUQV9NVUxUSVBBVEhdKTsKIAl9CiAKKwlpZiAodGJbUlRBX1BSRUZdKSB7CisJCXByZWYgPSBubGFfZ2V0X3U4KHRiW1JUQV9QUkVGXSk7CisJCWlmIChwcmVmICE9IElDTVBWNl9ST1VURVJfUFJFRl9MT1cgJiYKKwkJICAgIHByZWYgIT0gSUNNUFY2X1JPVVRFUl9QUkVGX0hJR0gpCisJCQlwcmVmID0gSUNNUFY2X1JPVVRFUl9QUkVGX01FRElVTTsKKwkJY2ZnLT5mY19mbGFncyB8PSBSVEZfUFJFRihwcmVmKTsKKwl9CisKIAllcnIgPSAwOwogZXJyb3V0OgogCXJldHVybiBlcnI7CkBAIC0yNTExLDcgKzI1MTksNyBAQAogCiAJCQlubGEgPSBubGFfZmluZChhdHRycywgYXR0cmxlbiwgUlRBX0dBVEVXQVkpOwogCQkJaWYgKG5sYSkgewotCQkJCW5sYV9tZW1jcHkoJnJfY2ZnLmZjX2dhdGV3YXksIG5sYSwgMTYpOworCQkJCXJfY2ZnLmZjX2dhdGV3YXkgPSBubGFfZ2V0X2luNl9hZGRyKG5sYSk7CiAJCQkJcl9jZmcuZmNfZmxhZ3MgfD0gUlRGX0dBVEVXQVk7CiAJCQl9CiAJCX0KQEAgLTI1ODUsNyArMjU5Myw4IEBACiAJICAgICAgICsgbmxhX3RvdGFsX3NpemUoNCkgLyogUlRBX1BSSU9SSVRZICovCiAJICAgICAgICsgUlRBWF9NQVggKiBubGFfdG90YWxfc2l6ZSg0KSAvKiBSVEFfTUVUUklDUyAqLwogCSAgICAgICArIG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgcnRhX2NhY2hlaW5mbykpCi0JICAgICAgICsgbmxhX3RvdGFsX3NpemUoVENQX0NBX05BTUVfTUFYKTsgLyogUlRBWF9DQ19BTEdPICovCisJICAgICAgICsgbmxhX3RvdGFsX3NpemUoVENQX0NBX05BTUVfTUFYKSAvKiBSVEFYX0NDX0FMR08gKi8KKwkgICAgICAgKyBubGFfdG90YWxfc2l6ZSgxKTsgLyogUlRBX1BSRUYgKi8KIH0KIAogc3RhdGljIGludCBydDZfZmlsbF9ub2RlKHN0cnVjdCBuZXQgKm5ldCwKQEAgLTI2NjAsMTkgKzI2NjksMTkgQEAKIAkJcnRtLT5ydG1fZmxhZ3MgfD0gUlRNX0ZfQ0xPTkVEOwogCiAJaWYgKGRzdCkgewotCQlpZiAobmxhX3B1dChza2IsIFJUQV9EU1QsIDE2LCBkc3QpKQorCQlpZiAobmxhX3B1dF9pbjZfYWRkcihza2IsIFJUQV9EU1QsIGRzdCkpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAkJcnRtLT5ydG1fZHN0X2xlbiA9IDEyODsKIAl9IGVsc2UgaWYgKHJ0bS0+cnRtX2RzdF9sZW4pCi0JCWlmIChubGFfcHV0KHNrYiwgUlRBX0RTVCwgMTYsICZydC0+cnQ2aV9kc3QuYWRkcikpCisJCWlmIChubGFfcHV0X2luNl9hZGRyKHNrYiwgUlRBX0RTVCwgJnJ0LT5ydDZpX2RzdC5hZGRyKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCiAJaWYgKHNyYykgewotCQlpZiAobmxhX3B1dChza2IsIFJUQV9TUkMsIDE2LCBzcmMpKQorCQlpZiAobmxhX3B1dF9pbjZfYWRkcihza2IsIFJUQV9TUkMsIHNyYykpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAkJcnRtLT5ydG1fc3JjX2xlbiA9IDEyODsKIAl9IGVsc2UgaWYgKHJ0bS0+cnRtX3NyY19sZW4gJiYKLQkJICAgbmxhX3B1dChza2IsIFJUQV9TUkMsIDE2LCAmcnQtPnJ0Nmlfc3JjLmFkZHIpKQorCQkgICBubGFfcHV0X2luNl9hZGRyKHNrYiwgUlRBX1NSQywgJnJ0LT5ydDZpX3NyYy5hZGRyKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAjZW5kaWYKIAlpZiAoaWlmKSB7CkBAIC0yNjk2LDE0ICsyNzA1LDE0IEBACiAJfSBlbHNlIGlmIChkc3QpIHsKIAkJc3RydWN0IGluNl9hZGRyIHNhZGRyX2J1ZjsKIAkJaWYgKGlwNl9yb3V0ZV9nZXRfc2FkZHIobmV0LCBydCwgZHN0LCAwLCAmc2FkZHJfYnVmKSA9PSAwICYmCi0JCSAgICBubGFfcHV0KHNrYiwgUlRBX1BSRUZTUkMsIDE2LCAmc2FkZHJfYnVmKSkKKwkJICAgIG5sYV9wdXRfaW42X2FkZHIoc2tiLCBSVEFfUFJFRlNSQywgJnNhZGRyX2J1ZikpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAl9CiAKIAlpZiAocnQtPnJ0NmlfcHJlZnNyYy5wbGVuKSB7CiAJCXN0cnVjdCBpbjZfYWRkciBzYWRkcl9idWY7CiAJCXNhZGRyX2J1ZiA9IHJ0LT5ydDZpX3ByZWZzcmMuYWRkcjsKLQkJaWYgKG5sYV9wdXQoc2tiLCBSVEFfUFJFRlNSQywgMTYsICZzYWRkcl9idWYpKQorCQlpZiAobmxhX3B1dF9pbjZfYWRkcihza2IsIFJUQV9QUkVGU1JDLCAmc2FkZHJfYnVmKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCX0KIApAQCAtMjcxMSw3ICsyNzIwLDcgQEAKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAlpZiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfR0FURVdBWSkgewotCQlpZiAobmxhX3B1dChza2IsIFJUQV9HQVRFV0FZLCAxNiwgJnJ0LT5ydDZpX2dhdGV3YXkpIDwgMCkKKwkJaWYgKG5sYV9wdXRfaW42X2FkZHIoc2tiLCBSVEFfR0FURVdBWSwgJnJ0LT5ydDZpX2dhdGV3YXkpIDwgMCkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCX0KIApAQCAtMjcyNiw2ICsyNzM1LDkgQEAKIAlpZiAocnRubF9wdXRfY2FjaGVpbmZvKHNrYiwgJnJ0LT5kc3QsIDAsIGV4cGlyZXMsIHJ0LT5kc3QuZXJyb3IpIDwgMCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKKwlpZiAobmxhX3B1dF91OChza2IsIFJUQV9QUkVGLCBJUFY2X0VYVFJBQ1RfUFJFRihydC0+cnQ2aV9mbGFncykpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwogCW5sbXNnX2VuZChza2IsIG5saCk7CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3NpdC5jIGIvbmV0L2lwdjYvc2l0LmMKaW5kZXggZTRjYmQ1Ny4uYWMzNWEyOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvc2l0LmMKKysrIGIvbmV0L2lwdjYvc2l0LmMKQEAgLTExOCw3ICsxMTgsNyBAQAogCQkJcmV0dXJuIHQ7CiAJfQogCXQgPSByY3VfZGVyZWZlcmVuY2Uoc2l0bi0+dHVubmVsc193Y1swXSk7Ci0JaWYgKCh0ICE9IE5VTEwpICYmICh0LT5kZXYtPmZsYWdzICYgSUZGX1VQKSkKKwlpZiAodCAmJiAodC0+ZGV2LT5mbGFncyAmIElGRl9VUCkpCiAJCXJldHVybiB0OwogCXJldHVybiBOVUxMOwogfQpAQCAtMjUxLDcgKzI1MSw3IEBACiAKIAlkZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKCp0KSwgbmFtZSwgTkVUX05BTUVfVU5LTk9XTiwKIAkJCSAgIGlwaXA2X3R1bm5lbF9zZXR1cCk7Ci0JaWYgKGRldiA9PSBOVUxMKQorCWlmICghZGV2KQogCQlyZXR1cm4gTlVMTDsKIAogCWRldl9uZXRfc2V0KGRldiwgbmV0KTsKQEAgLTU1NSw3ICs1NTUsNyBAQAogCQkJCXNrYi0+ZGV2LAogCQkJCWlwaC0+ZGFkZHIsCiAJCQkJaXBoLT5zYWRkcik7Ci0JaWYgKHQgPT0gTlVMTCkKKwlpZiAoIXQpCiAJCWdvdG8gb3V0OwogCiAJaWYgKHR5cGUgPT0gSUNNUF9ERVNUX1VOUkVBQ0ggJiYgY29kZSA9PSBJQ01QX0ZSQUdfTkVFREVEKSB7CkBAIC02NzEsNyArNjcxLDcgQEAKIAogCXR1bm5lbCA9IGlwaXA2X3R1bm5lbF9sb29rdXAoZGV2X25ldChza2ItPmRldiksIHNrYi0+ZGV2LAogCQkJCSAgICAgaXBoLT5zYWRkciwgaXBoLT5kYWRkcik7Ci0JaWYgKHR1bm5lbCAhPSBOVUxMKSB7CisJaWYgKHR1bm5lbCkgewogCQlzdHJ1Y3QgcGNwdV9zd19uZXRzdGF0cyAqdHN0YXRzOwogCiAJCWlmICh0dW5uZWwtPnBhcm1zLmlwaC5wcm90b2NvbCAhPSBJUFBST1RPX0lQVjYgJiYKQEAgLTczMyw3ICs3MzMsNyBAQAogCWlwaCA9IGlwX2hkcihza2IpOwogCXR1bm5lbCA9IGlwaXA2X3R1bm5lbF9sb29rdXAoZGV2X25ldChza2ItPmRldiksIHNrYi0+ZGV2LAogCQkJCSAgICAgaXBoLT5zYWRkciwgaXBoLT5kYWRkcik7Ci0JaWYgKHR1bm5lbCAhPSBOVUxMKSB7CisJaWYgKHR1bm5lbCkgewogCQlpZiAodHVubmVsLT5wYXJtcy5pcGgucHJvdG9jb2wgIT0gSVBQUk9UT19JUElQICYmCiAJCSAgICB0dW5uZWwtPnBhcm1zLmlwaC5wcm90b2NvbCAhPSAwKQogCQkJZ290byBkcm9wOwpAQCAtODM4LDcgKzgzOCw3IEBACiAJCWlmIChza2JfZHN0KHNrYikpCiAJCQluZWlnaCA9IGRzdF9uZWlnaF9sb29rdXAoc2tiX2RzdChza2IpLCAmaXBoNi0+ZGFkZHIpOwogCi0JCWlmIChuZWlnaCA9PSBOVUxMKSB7CisJCWlmICghbmVpZ2gpIHsKIAkJCW5ldF9kYmdfcmF0ZWxpbWl0ZWQoIm5leHRob3AgPT0gTlVMTFxuIik7CiAJCQlnb3RvIHR4X2Vycm9yOwogCQl9CkBAIC04NjcsNyArODY3LDcgQEAKIAkJaWYgKHNrYl9kc3Qoc2tiKSkKIAkJCW5laWdoID0gZHN0X25laWdoX2xvb2t1cChza2JfZHN0KHNrYiksICZpcGg2LT5kYWRkcik7CiAKLQkJaWYgKG5laWdoID09IE5VTEwpIHsKKwkJaWYgKCFuZWlnaCkgewogCQkJbmV0X2RiZ19yYXRlbGltaXRlZCgibmV4dGhvcCA9PSBOVUxMXG4iKTsKIAkJCWdvdG8gdHhfZXJyb3I7CiAJCX0KQEAgLTk4Myw3ICs5ODMsNyBAQAogCiAJc2tiX3NldF9pbm5lcl9pcHByb3RvKHNrYiwgSVBQUk9UT19JUFY2KTsKIAotCWVyciA9IGlwdHVubmVsX3htaXQoc2tiLT5zaywgcnQsIHNrYiwgZmw0LnNhZGRyLCBmbDQuZGFkZHIsCisJZXJyID0gaXB0dW5uZWxfeG1pdChOVUxMLCBydCwgc2tiLCBmbDQuc2FkZHIsIGZsNC5kYWRkciwKIAkJCSAgICBwcm90b2NvbCwgdG9zLCB0dGwsIGRmLAogCQkJICAgICFuZXRfZXEodHVubmVsLT5uZXQsIGRldl9uZXQoZGV2KSkpOwogCWlwdHVubmVsX3htaXRfc3RhdHMoZXJyLCAmZGV2LT5zdGF0cywgZGV2LT50c3RhdHMpOwpAQCAtMTA3Niw3ICsxMDc2LDYgQEAKIAkJaWYgKGRldi0+bXR1IDwgSVBWNl9NSU5fTVRVKQogCQkJZGV2LT5tdHUgPSBJUFY2X01JTl9NVFU7CiAJfQotCWRldi0+aWZsaW5rID0gdHVubmVsLT5wYXJtcy5saW5rOwogfQogCiBzdGF0aWMgdm9pZCBpcGlwNl90dW5uZWxfdXBkYXRlKHN0cnVjdCBpcF90dW5uZWwgKnQsIHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcCkKQEAgLTExNTgsNyArMTE1Nyw3IEBACiAJCQkJYnJlYWs7CiAJCQl9CiAJCQl0ID0gaXBpcDZfdHVubmVsX2xvY2F0ZShuZXQsICZwLCAwKTsKLQkJCWlmICh0ID09IE5VTEwpCisJCQlpZiAoIXQpCiAJCQkJdCA9IG5ldGRldl9wcml2KGRldik7CiAJCX0KIApAQCAtMTIwNiw3ICsxMjA1LDcgQEAKIAkJdCA9IGlwaXA2X3R1bm5lbF9sb2NhdGUobmV0LCAmcCwgY21kID09IFNJT0NBRERUVU5ORUwpOwogCiAJCWlmIChkZXYgIT0gc2l0bi0+ZmJfdHVubmVsX2RldiAmJiBjbWQgPT0gU0lPQ0NIR1RVTk5FTCkgewotCQkJaWYgKHQgIT0gTlVMTCkgeworCQkJaWYgKHQpIHsKIAkJCQlpZiAodC0+ZGV2ICE9IGRldikgewogCQkJCQllcnIgPSAtRUVYSVNUOwogCQkJCQlicmVhazsKQEAgLTEyNDIsNyArMTI0MSw3IEBACiAJCQkJZ290byBkb25lOwogCQkJZXJyID0gLUVOT0VOVDsKIAkJCXQgPSBpcGlwNl90dW5uZWxfbG9jYXRlKG5ldCwgJnAsIDApOwotCQkJaWYgKHQgPT0gTlVMTCkKKwkJCWlmICghdCkKIAkJCQlnb3RvIGRvbmU7CiAJCQllcnIgPSAtRVBFUk07CiAJCQlpZiAodCA9PSBuZXRkZXZfcHJpdihzaXRuLT5mYl90dW5uZWxfZGV2KSkKQEAgLTEzMzYsNiArMTMzNSw3IEBACiAJLm5kb19kb19pb2N0bAk9IGlwaXA2X3R1bm5lbF9pb2N0bCwKIAkubmRvX2NoYW5nZV9tdHUJPSBpcGlwNl90dW5uZWxfY2hhbmdlX210dSwKIAkubmRvX2dldF9zdGF0czY0ID0gaXBfdHVubmVsX2dldF9zdGF0czY0LAorCS5uZG9fZ2V0X2lmbGluayA9IGlwX3R1bm5lbF9nZXRfaWZsaW5rLAogfTsKIAogc3RhdGljIHZvaWQgaXBpcDZfZGV2X2ZyZWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTEzNjYsNyArMTM2Niw2IEBACiAJZGV2LT5tdHUJCT0gRVRIX0RBVEFfTEVOIC0gdF9obGVuOwogCWRldi0+ZmxhZ3MJCT0gSUZGX05PQVJQOwogCW5ldGlmX2tlZXBfZHN0KGRldik7Ci0JZGV2LT5pZmxpbmsJCT0gMDsKIAlkZXYtPmFkZHJfbGVuCQk9IDQ7CiAJZGV2LT5mZWF0dXJlcwkJfD0gTkVUSUZfRl9MTFRYOwogCWRldi0+ZmVhdHVyZXMJCXw9IFNJVF9GRUFUVVJFUzsKQEAgLTE1MzAsOCArMTUyOSw3IEBACiAKIAlpZiAoZGF0YVtJRkxBX0lQVFVOXzZSRF9QUkVGSVhdKSB7CiAJCXJldCA9IHRydWU7Ci0JCW5sYV9tZW1jcHkoJmlwNnJkLT5wcmVmaXgsIGRhdGFbSUZMQV9JUFRVTl82UkRfUFJFRklYXSwKLQkJCSAgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJaXA2cmQtPnByZWZpeCA9IG5sYV9nZXRfaW42X2FkZHIoZGF0YVtJRkxBX0lQVFVOXzZSRF9QUkVGSVhdKTsKIAl9CiAKIAlpZiAoZGF0YVtJRkxBX0lQVFVOXzZSRF9SRUxBWV9QUkVGSVhdKSB7CkBAIC0xNjgzLDggKzE2ODEsOCBAQAogCXN0cnVjdCBpcF90dW5uZWxfcGFybSAqcGFybSA9ICZ0dW5uZWwtPnBhcm1zOwogCiAJaWYgKG5sYV9wdXRfdTMyKHNrYiwgSUZMQV9JUFRVTl9MSU5LLCBwYXJtLT5saW5rKSB8fAotCSAgICBubGFfcHV0X2JlMzIoc2tiLCBJRkxBX0lQVFVOX0xPQ0FMLCBwYXJtLT5pcGguc2FkZHIpIHx8Ci0JICAgIG5sYV9wdXRfYmUzMihza2IsIElGTEFfSVBUVU5fUkVNT1RFLCBwYXJtLT5pcGguZGFkZHIpIHx8CisJICAgIG5sYV9wdXRfaW5fYWRkcihza2IsIElGTEFfSVBUVU5fTE9DQUwsIHBhcm0tPmlwaC5zYWRkcikgfHwKKwkgICAgbmxhX3B1dF9pbl9hZGRyKHNrYiwgSUZMQV9JUFRVTl9SRU1PVEUsIHBhcm0tPmlwaC5kYWRkcikgfHwKIAkgICAgbmxhX3B1dF91OChza2IsIElGTEFfSVBUVU5fVFRMLCBwYXJtLT5pcGgudHRsKSB8fAogCSAgICBubGFfcHV0X3U4KHNrYiwgSUZMQV9JUFRVTl9UT1MsIHBhcm0tPmlwaC50b3MpIHx8CiAJICAgIG5sYV9wdXRfdTgoc2tiLCBJRkxBX0lQVFVOX1BNVFVESVNDLApAQCAtMTY5NCwxMCArMTY5MiwxMCBAQAogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogI2lmZGVmIENPTkZJR19JUFY2X1NJVF82UkQKLQlpZiAobmxhX3B1dChza2IsIElGTEFfSVBUVU5fNlJEX1BSRUZJWCwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCi0JCSAgICAmdHVubmVsLT5pcDZyZC5wcmVmaXgpIHx8Ci0JICAgIG5sYV9wdXRfYmUzMihza2IsIElGTEFfSVBUVU5fNlJEX1JFTEFZX1BSRUZJWCwKLQkJCSB0dW5uZWwtPmlwNnJkLnJlbGF5X3ByZWZpeCkgfHwKKwlpZiAobmxhX3B1dF9pbjZfYWRkcihza2IsIElGTEFfSVBUVU5fNlJEX1BSRUZJWCwKKwkJCSAgICAgJnR1bm5lbC0+aXA2cmQucHJlZml4KSB8fAorCSAgICBubGFfcHV0X2luX2FkZHIoc2tiLCBJRkxBX0lQVFVOXzZSRF9SRUxBWV9QUkVGSVgsCisJCQkgICAgdHVubmVsLT5pcDZyZC5yZWxheV9wcmVmaXgpIHx8CiAJICAgIG5sYV9wdXRfdTE2KHNrYiwgSUZMQV9JUFRVTl82UkRfUFJFRklYTEVOLAogCQkJdHVubmVsLT5pcDZyZC5wcmVmaXhsZW4pIHx8CiAJICAgIG5sYV9wdXRfdTE2KHNrYiwgSUZMQV9JUFRVTl82UkRfUkVMQVlfUFJFRklYTEVOLApAQCAtMTc5NSw3ICsxNzkzLDcgQEAKIAkJCXN0cnVjdCBpcF90dW5uZWwgKnQ7CiAKIAkJCXQgPSBydG5sX2RlcmVmZXJlbmNlKHNpdG4tPnR1bm5lbHNbcHJpb11baF0pOwotCQkJd2hpbGUgKHQgIT0gTlVMTCkgeworCQkJd2hpbGUgKHQpIHsKIAkJCQkvKiBJZiBkZXYgaXMgaW4gdGhlIHNhbWUgbmV0bnMsIGl0IGhhcyBhbHJlYWR5CiAJCQkJICogYmVlbiBhZGRlZCB0byB0aGUgbGlzdCBieSB0aGUgcHJldmlvdXMgbG9vcC4KIAkJCQkgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L3N5bmNvb2tpZXMuYyBiL25ldC9pcHY2L3N5bmNvb2tpZXMuYwppbmRleCA3MzM3ZmM3Li4yMWJjMmViIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zeW5jb29raWVzLmMKKysrIGIvbmV0L2lwdjYvc3luY29va2llcy5jCkBAIC00OSwxMSArNDksMTIgQEAKIAlzdHJ1Y3Qgc29jayAqY2hpbGQ7CiAKIAljaGlsZCA9IGljc2stPmljc2tfYWZfb3BzLT5zeW5fcmVjdl9zb2NrKHNrLCBza2IsIHJlcSwgZHN0KTsKLQlpZiAoY2hpbGQpCisJaWYgKGNoaWxkKSB7CisJCWF0b21pY19zZXQoJnJlcS0+cnNrX3JlZmNudCwgMSk7CiAJCWluZXRfY3NrX3JlcXNrX3F1ZXVlX2FkZChzaywgcmVxLCBjaGlsZCk7Ci0JZWxzZQorCX0gZWxzZSB7CiAJCXJlcXNrX2ZyZWUocmVxKTsKLQorCX0KIAlyZXR1cm4gY2hpbGQ7CiB9CiAKQEAgLTE4OSwxMyArMTkwLDEzIEBACiAJCWdvdG8gb3V0OwogCiAJcmV0ID0gTlVMTDsKLQlyZXEgPSBpbmV0X3JlcXNrX2FsbG9jKCZ0Y3A2X3JlcXVlc3Rfc29ja19vcHMpOworCXJlcSA9IGluZXRfcmVxc2tfYWxsb2MoJnRjcDZfcmVxdWVzdF9zb2NrX29wcywgc2spOwogCWlmICghcmVxKQogCQlnb3RvIG91dDsKIAogCWlyZXEgPSBpbmV0X3JzayhyZXEpOwogCXRyZXEgPSB0Y3BfcnNrKHJlcSk7Ci0JdHJlcS0+bGlzdGVuZXIgPSBOVUxMOworCXRyZXEtPnRmb19saXN0ZW5lciA9IGZhbHNlOwogCiAJaWYgKHNlY3VyaXR5X2luZXRfY29ubl9yZXF1ZXN0KHNrLCBza2IsIHJlcSkpCiAJCWdvdG8gb3V0X2ZyZWU7CkBAIC0yMjAsNyArMjIxLDYgQEAKIAogCWlyZXEtPmlyX21hcmsgPSBpbmV0X3JlcXVlc3RfbWFyayhzaywgc2tiKTsKIAotCXJlcS0+ZXhwaXJlcyA9IDBVTDsKIAlyZXEtPm51bV9yZXRyYW5zID0gMDsKIAlpcmVxLT5zbmRfd3NjYWxlCT0gdGNwX29wdC5zbmRfd3NjYWxlOwogCWlyZXEtPnNhY2tfb2sJCT0gdGNwX29wdC5zYWNrX29rOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc3lzY3RsX25ldF9pcHY2LmMgYi9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYwppbmRleCBjNWMxMGZhLi5hYmNjNzlmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYworKysgYi9uZXQvaXB2Ni9zeXNjdGxfbmV0X2lwdjYuYwpAQCAtNTQsNiArNTQsMjAgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMKIAl9LAorCXsKKwkJLnByb2NuYW1lCT0gImlkZ2VuX3JldHJpZXMiLAorCQkuZGF0YQkJPSAmaW5pdF9uZXQuaXB2Ni5zeXNjdGwuaWRnZW5fcmV0cmllcywKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJpZGdlbl9kZWxheSIsCisJCS5kYXRhCQk9ICZpbml0X25ldC5pcHY2LnN5c2N0bC5pZGdlbl9kZWxheSwKKwkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKKwl9LAogCXsgfQogfTsKIApAQCAtOTMsNiArMTA3LDggQEAKIAlpcHY2X3RhYmxlWzJdLmRhdGEgPSAmbmV0LT5pcHY2LnN5c2N0bC5mbG93bGFiZWxfY29uc2lzdGVuY3k7CiAJaXB2Nl90YWJsZVszXS5kYXRhID0gJm5ldC0+aXB2Ni5zeXNjdGwuYXV0b19mbG93bGFiZWxzOwogCWlwdjZfdGFibGVbNF0uZGF0YSA9ICZuZXQtPmlwdjYuc3lzY3RsLmZ3bWFya19yZWZsZWN0OworCWlwdjZfdGFibGVbNV0uZGF0YSA9ICZuZXQtPmlwdjYuc3lzY3RsLmlkZ2VuX3JldHJpZXM7CisJaXB2Nl90YWJsZVs2XS5kYXRhID0gJm5ldC0+aXB2Ni5zeXNjdGwuaWRnZW5fZGVsYXk7CiAKIAlpcHY2X3JvdXRlX3RhYmxlID0gaXB2Nl9yb3V0ZV9zeXNjdGxfaW5pdChuZXQpOwogCWlmICghaXB2Nl9yb3V0ZV90YWJsZSkKQEAgLTE2Myw3ICsxNzksNyBAQAogCWludCBlcnIgPSAtRU5PTUVNOwogCiAJaXA2X2hlYWRlciA9IHJlZ2lzdGVyX25ldF9zeXNjdGwoJmluaXRfbmV0LCAibmV0L2lwdjYiLCBpcHY2X3JvdGFibGUpOwotCWlmIChpcDZfaGVhZGVyID09IE5VTEwpCisJaWYgKCFpcDZfaGVhZGVyKQogCQlnb3RvIG91dDsKIAogCWVyciA9IHJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJmlwdjZfc3lzY3RsX25ldF9vcHMpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwX2lwdjYuYyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKaW5kZXggNWQ0NjgzMi4uYWQ1MWRmOCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdGNwX2lwdjYuYworKysgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCkBAIC0xMDQsMTkgKzEwNCw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB0Y3BfdjZfaGFzaChzdHJ1Y3Qgc29jayAqc2spCi17Ci0JaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfQ0xPU0UpIHsKLQkJaWYgKGluZXRfY3NrKHNrKS0+aWNza19hZl9vcHMgPT0gJmlwdjZfbWFwcGVkKSB7Ci0JCQl0Y3BfcHJvdC5oYXNoKHNrKTsKLQkJCXJldHVybjsKLQkJfQotCQlsb2NhbF9iaF9kaXNhYmxlKCk7Ci0JCV9faW5ldDZfaGFzaChzaywgTlVMTCk7Ci0JCWxvY2FsX2JoX2VuYWJsZSgpOwotCX0KLX0KLQogc3RhdGljIF9fdTMyIHRjcF92Nl9pbml0X3NlcXVlbmNlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIHNlY3VyZV90Y3B2Nl9zZXF1ZW5jZV9udW1iZXIoaXB2Nl9oZHIoc2tiKS0+ZGFkZHIuczZfYWRkcjMyLApAQCAtMTU0LDcgKzE0MSw3IEBACiAJCWlmIChmbDYuZmxvd2xhYmVsJklQVjZfRkxPV0xBQkVMX01BU0spIHsKIAkJCXN0cnVjdCBpcDZfZmxvd2xhYmVsICpmbG93bGFiZWw7CiAJCQlmbG93bGFiZWwgPSBmbDZfc29ja19sb29rdXAoc2ssIGZsNi5mbG93bGFiZWwpOwotCQkJaWYgKGZsb3dsYWJlbCA9PSBOVUxMKQorCQkJaWYgKCFmbG93bGFiZWwpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlmbDZfc29ja19yZWxlYXNlKGZsb3dsYWJlbCk7CiAJCX0KQEAgLTIzMywxMSArMjIwLDggQEAKIAkJCXRwLT5hZl9zcGVjaWZpYyA9ICZ0Y3Bfc29ja19pcHY2X3NwZWNpZmljOwogI2VuZGlmCiAJCQlnb3RvIGZhaWx1cmU7Ci0JCX0gZWxzZSB7Ci0JCQlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKGluZXQtPmluZXRfc2FkZHIsICZucC0+c2FkZHIpOwotCQkJaXB2Nl9hZGRyX3NldF92NG1hcHBlZChpbmV0LT5pbmV0X3Jjdl9zYWRkciwKLQkJCQkJICAgICAgICZzay0+c2tfdjZfcmN2X3NhZGRyKTsKIAkJfQorCQlucC0+c2FkZHIgPSBzay0+c2tfdjZfcmN2X3NhZGRyOwogCiAJCXJldHVybiBlcnI7CiAJfQpAQCAtMjYzLDcgKzI0Nyw3IEBACiAJCWdvdG8gZmFpbHVyZTsKIAl9CiAKLQlpZiAoc2FkZHIgPT0gTlVMTCkgeworCWlmICghc2FkZHIpIHsKIAkJc2FkZHIgPSAmZmw2LnNhZGRyOwogCQlzay0+c2tfdjZfcmN2X3NhZGRyID0gKnNhZGRyOwogCX0KQEAgLTM0MCwxOCArMzI0LDIwIEBACiB7CiAJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmhkciA9IChjb25zdCBzdHJ1Y3QgaXB2NmhkciAqKXNrYi0+ZGF0YTsKIAljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYi0+ZGF0YStvZmZzZXQpOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoc2tiLT5kZXYpOworCXN0cnVjdCByZXF1ZXN0X3NvY2sgKmZhc3RvcGVuOwogCXN0cnVjdCBpcHY2X3BpbmZvICpucDsKKwlzdHJ1Y3QgdGNwX3NvY2sgKnRwOworCV9fdTMyIHNlcSwgc25kX3VuYTsKIAlzdHJ1Y3Qgc29jayAqc2s7CiAJaW50IGVycjsKLQlzdHJ1Y3QgdGNwX3NvY2sgKnRwOwotCXN0cnVjdCByZXF1ZXN0X3NvY2sgKmZhc3RvcGVuOwotCV9fdTMyIHNlcSwgc25kX3VuYTsKLQlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KHNrYi0+ZGV2KTsKIAotCXNrID0gaW5ldDZfbG9va3VwKG5ldCwgJnRjcF9oYXNoaW5mbywgJmhkci0+ZGFkZHIsCi0JCQl0aC0+ZGVzdCwgJmhkci0+c2FkZHIsIHRoLT5zb3VyY2UsIHNrYi0+ZGV2LT5pZmluZGV4KTsKKwlzayA9IF9faW5ldDZfbG9va3VwX2VzdGFibGlzaGVkKG5ldCwgJnRjcF9oYXNoaW5mbywKKwkJCQkJJmhkci0+ZGFkZHIsIHRoLT5kZXN0LAorCQkJCQkmaGRyLT5zYWRkciwgbnRvaHModGgtPnNvdXJjZSksCisJCQkJCXNrYi0+ZGV2LT5pZmluZGV4KTsKIAotCWlmIChzayA9PSBOVUxMKSB7CisJaWYgKCFzaykgewogCQlJQ01QNl9JTkNfU1RBVFNfQkgobmV0LCBfX2luNl9kZXZfZ2V0KHNrYi0+ZGV2KSwKIAkJCQkgICBJQ01QNl9NSUJfSU5FUlJPUlMpOwogCQlyZXR1cm47CkBAIC0zNjEsNiArMzQ3LDkgQEAKIAkJaW5ldF90d3NrX3B1dChpbmV0X3R3c2soc2spKTsKIAkJcmV0dXJuOwogCX0KKwlzZXEgPSBudG9obCh0aC0+c2VxKTsKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9ORVdfU1lOX1JFQ1YpCisJCXJldHVybiB0Y3BfcmVxX2Vycihzaywgc2VxKTsKIAogCWJoX2xvY2tfc29jayhzayk7CiAJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykgJiYgdHlwZSAhPSBJQ01QVjZfUEtUX1RPT0JJRykKQEAgLTM3NSw3ICszNjQsNiBAQAogCX0KIAogCXRwID0gdGNwX3NrKHNrKTsKLQlzZXEgPSBudG9obCh0aC0+c2VxKTsKIAkvKiBYWFggKFRGTykgLSB0cC0+c25kX3VuYSBzaG91bGQgYmUgSVNOICh0Y3BfY3JlYXRlX29wZW5yZXFfY2hpbGQoKSAqLwogCWZhc3RvcGVuID0gdHAtPmZhc3RvcGVuX3JzazsKIAlzbmRfdW5hID0gZmFzdG9wZW4gPyB0Y3BfcnNrKGZhc3RvcGVuKS0+c250X2lzbiA6IHRwLT5zbmRfdW5hOwpAQCAtNDE5LDM3ICs0MDcsMTIgQEAKIAogCS8qIE1pZ2h0IGJlIGZvciBhbiByZXF1ZXN0X3NvY2sgKi8KIAlzd2l0Y2ggKHNrLT5za19zdGF0ZSkgewotCQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsICoqcHJldjsKLQljYXNlIFRDUF9MSVNURU46Ci0JCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKQotCQkJZ290byBvdXQ7Ci0KLQkJLyogTm90ZSA6IFdlIHVzZSBpbmV0Nl9paWYoKSBoZXJlLCBub3QgdGNwX3Y2X2lpZigpICovCi0JCXJlcSA9IGluZXQ2X2Nza19zZWFyY2hfcmVxKHNrLCAmcHJldiwgdGgtPmRlc3QsICZoZHItPmRhZGRyLAotCQkJCQkgICAmaGRyLT5zYWRkciwgaW5ldDZfaWlmKHNrYikpOwotCQlpZiAoIXJlcSkKLQkJCWdvdG8gb3V0OwotCi0JCS8qIElDTVBzIGFyZSBub3QgYmFja2xvZ2dlZCwgaGVuY2Ugd2UgY2Fubm90IGdldAotCQkgKiBhbiBlc3RhYmxpc2hlZCBzb2NrZXQgaGVyZS4KLQkJICovCi0JCVdBUk5fT04ocmVxLT5zayAhPSBOVUxMKTsKLQotCQlpZiAoc2VxICE9IHRjcF9yc2socmVxKS0+c250X2lzbikgewotCQkJTkVUX0lOQ19TVEFUU19CSChuZXQsIExJTlVYX01JQl9PVVRPRldJTkRPV0lDTVBTKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJaW5ldF9jc2tfcmVxc2tfcXVldWVfZHJvcChzaywgcmVxLCBwcmV2KTsKLQkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9MSVNURU5EUk9QUyk7Ci0JCWdvdG8gb3V0OwotCiAJY2FzZSBUQ1BfU1lOX1NFTlQ6CiAJY2FzZSBUQ1BfU1lOX1JFQ1Y6CiAJCS8qIE9ubHkgaW4gZmFzdCBvciBzaW11bHRhbmVvdXMgb3Blbi4gSWYgYSBmYXN0IG9wZW4gc29ja2V0IGlzCiAJCSAqIGlzIGFscmVhZHkgYWNjZXB0ZWQgaXQgaXMgdHJlYXRlZCBhcyBhIGNvbm5lY3RlZCBvbmUgYmVsb3cuCiAJCSAqLwotCQlpZiAoZmFzdG9wZW4gJiYgZmFzdG9wZW4tPnNrID09IE5VTEwpCisJCWlmIChmYXN0b3BlbiAmJiAhZmFzdG9wZW4tPnNrKQogCQkJYnJlYWs7CiAKIAkJaWYgKCFzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7CkBAIC00OTcsNyArNDYwLDcgQEAKIAkJCQkgICAgJmlyZXEtPmlyX3Y2X3JtdF9hZGRyKTsKIAogCQlmbDYtPmRhZGRyID0gaXJlcS0+aXJfdjZfcm10X2FkZHI7Ci0JCWlmIChucC0+cmVwZmxvdyAmJiAoaXJlcS0+cGt0b3B0cyAhPSBOVUxMKSkKKwkJaWYgKG5wLT5yZXBmbG93ICYmIGlyZXEtPnBrdG9wdHMpCiAJCQlmbDYtPmZsb3dsYWJlbCA9IGlwNl9mbG93bGFiZWwoaXB2Nl9oZHIoaXJlcS0+cGt0b3B0cykpOwogCiAJCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIHF1ZXVlX21hcHBpbmcpOwpAQCAtNTIzLDE3ICs0ODYsMTEgQEAKIH0KIAogc3RhdGljIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqdGNwX3Y2X21kNV9sb29rdXAoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkJc3RydWN0IHNvY2sgKmFkZHJfc2spCisJCQkJCQljb25zdCBzdHJ1Y3Qgc29jayAqYWRkcl9zaykKIHsKIAlyZXR1cm4gdGNwX3Y2X21kNV9kb19sb29rdXAoc2ssICZhZGRyX3NrLT5za192Nl9kYWRkcik7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgdGNwX21kNXNpZ19rZXkgKnRjcF92Nl9yZXFza19tZDVfbG9va3VwKHN0cnVjdCBzb2NrICpzaywKLQkJCQkJCSAgICAgIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSkKLXsKLQlyZXR1cm4gdGNwX3Y2X21kNV9kb19sb29rdXAoc2ssICZpbmV0X3JzayhyZXEpLT5pcl92Nl9ybXRfYWRkcik7Ci19Ci0KIHN0YXRpYyBpbnQgdGNwX3Y2X3BhcnNlX21kNV9rZXlzKHN0cnVjdCBzb2NrICpzaywgY2hhciBfX3VzZXIgKm9wdHZhbCwKIAkJCQkgaW50IG9wdGxlbikKIHsKQEAgLTYxOSw5ICs1NzYsOSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IHRjcF92Nl9tZDVfaGFzaF9za2IoY2hhciAqbWQ1X2hhc2gsIHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5LAorc3RhdGljIGludCB0Y3BfdjZfbWQ1X2hhc2hfc2tiKGNoYXIgKm1kNV9oYXNoLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCB0Y3BfbWQ1c2lnX2tleSAqa2V5LAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCAqZGFkZHI7CkBAIC02MjksMTIgKzU4Niw5IEBACiAJc3RydWN0IGhhc2hfZGVzYyAqZGVzYzsKIAljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKIAotCWlmIChzaykgewotCQlzYWRkciA9ICZpbmV0Nl9zayhzayktPnNhZGRyOworCWlmIChzaykgeyAvKiB2YWxpZCBmb3IgZXN0YWJsaXNoL3JlcXVlc3Qgc29ja2V0cyAqLworCQlzYWRkciA9ICZzay0+c2tfdjZfcmN2X3NhZGRyOwogCQlkYWRkciA9ICZzay0+c2tfdjZfZGFkZHI7Ci0JfSBlbHNlIGlmIChyZXEpIHsKLQkJc2FkZHIgPSAmaW5ldF9yc2socmVxKS0+aXJfdjZfbG9jX2FkZHI7Ci0JCWRhZGRyID0gJmluZXRfcnNrKHJlcSktPmlyX3Y2X3JtdF9hZGRyOwogCX0gZWxzZSB7CiAJCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDZoID0gaXB2Nl9oZHIoc2tiKTsKIAkJc2FkZHIgPSAmaXA2aC0+c2FkZHI7CkBAIC02NzAsOCArNjI0LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBfX3RjcF92Nl9pbmJvdW5kX21kNV9oYXNoKHN0cnVjdCBzb2NrICpzaywKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgYm9vbCB0Y3BfdjZfaW5ib3VuZF9tZDVfaGFzaChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJY29uc3QgX191OCAqaGFzaF9sb2NhdGlvbiA9IE5VTEw7CiAJc3RydWN0IHRjcF9tZDVzaWdfa2V5ICpoYXNoX2V4cGVjdGVkOwpAQCAtNjg1LDQ0ICs2MzgsMzIgQEAKIAogCS8qIFdlJ3ZlIHBhcnNlZCB0aGUgb3B0aW9ucyAtIGRvIHdlIGhhdmUgYSBoYXNoPyAqLwogCWlmICghaGFzaF9leHBlY3RlZCAmJiAhaGFzaF9sb2NhdGlvbikKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAogCWlmIChoYXNoX2V4cGVjdGVkICYmICFoYXNoX2xvY2F0aW9uKSB7CiAJCU5FVF9JTkNfU1RBVFNfQkgoc29ja19uZXQoc2spLCBMSU5VWF9NSUJfVENQTUQ1Tk9URk9VTkQpOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAJfQogCiAJaWYgKCFoYXNoX2V4cGVjdGVkICYmIGhhc2hfbG9jYXRpb24pIHsKIAkJTkVUX0lOQ19TVEFUU19CSChzb2NrX25ldChzayksIExJTlVYX01JQl9UQ1BNRDVVTkVYUEVDVEVEKTsKLQkJcmV0dXJuIDE7CisJCXJldHVybiB0cnVlOwogCX0KIAogCS8qIGNoZWNrIHRoZSBzaWduYXR1cmUgKi8KIAlnZW5oYXNoID0gdGNwX3Y2X21kNV9oYXNoX3NrYihuZXdoYXNoLAogCQkJCSAgICAgIGhhc2hfZXhwZWN0ZWQsCi0JCQkJICAgICAgTlVMTCwgTlVMTCwgc2tiKTsKKwkJCQkgICAgICBOVUxMLCBza2IpOwogCiAJaWYgKGdlbmhhc2ggfHwgbWVtY21wKGhhc2hfbG9jYXRpb24sIG5ld2hhc2gsIDE2KSAhPSAwKSB7CiAJCW5ldF9pbmZvX3JhdGVsaW1pdGVkKCJNRDUgSGFzaCAlcyBmb3IgWyVwSTZjXToldS0+WyVwSTZjXToldVxuIiwKIAkJCQkgICAgIGdlbmhhc2ggPyAiZmFpbGVkIiA6ICJtaXNtYXRjaCIsCiAJCQkJICAgICAmaXA2aC0+c2FkZHIsIG50b2hzKHRoLT5zb3VyY2UpLAogCQkJCSAgICAgJmlwNmgtPmRhZGRyLCBudG9ocyh0aC0+ZGVzdCkpOwotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHRydWU7CiAJfQotCXJldHVybiAwOworCXJldHVybiBmYWxzZTsKIH0KLQotc3RhdGljIGludCB0Y3BfdjZfaW5ib3VuZF9tZDVfaGFzaChzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JaW50IHJldDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQlyZXQgPSBfX3RjcF92Nl9pbmJvdW5kX21kNV9oYXNoKHNrLCBza2IpOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHJldDsKLX0KLQogI2VuZGlmCiAKIHN0YXRpYyB2b2lkIHRjcF92Nl9pbml0X3JlcShzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsIHN0cnVjdCBzb2NrICpzaywKQEAgLTczNCw4ICs2NzUsNiBAQAogCWlyZXEtPmlyX3Y2X3JtdF9hZGRyID0gaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CiAJaXJlcS0+aXJfdjZfbG9jX2FkZHIgPSBpcHY2X2hkcihza2IpLT5kYWRkcjsKIAotCWlyZXEtPmlyX2lpZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7Ci0KIAkvKiBTbyB0aGF0IGxpbmsgbG9jYWxzIGhhdmUgbWVhbmluZyAqLwogCWlmICghc2stPnNrX2JvdW5kX2Rldl9pZiAmJgogCSAgICBpcHY2X2FkZHJfdHlwZSgmaXJlcS0+aXJfdjZfcm10X2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKQEAgLTc3NCw3ICs3MTMsNyBAQAogCS5tc3NfY2xhbXAJPQlJUFY2X01JTl9NVFUgLSBzaXplb2Yoc3RydWN0IHRjcGhkcikgLQogCQkJCXNpemVvZihzdHJ1Y3QgaXB2NmhkciksCiAjaWZkZWYgQ09ORklHX1RDUF9NRDVTSUcKLQkubWQ1X2xvb2t1cAk9CXRjcF92Nl9yZXFza19tZDVfbG9va3VwLAorCS5yZXFfbWQ1X2xvb2t1cAk9CXRjcF92Nl9tZDVfbG9va3VwLAogCS5jYWxjX21kNV9oYXNoCT0JdGNwX3Y2X21kNV9oYXNoX3NrYiwKICNlbmRpZgogCS5pbml0X3JlcQk9CXRjcF92Nl9pbml0X3JlcSwKQEAgLTgxMSw3ICs3NTAsNyBAQAogCiAJYnVmZiA9IGFsbG9jX3NrYihNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArIHRvdF9sZW4sCiAJCQkgR0ZQX0FUT01JQyk7Ci0JaWYgKGJ1ZmYgPT0gTlVMTCkKKwlpZiAoIWJ1ZmYpCiAJCXJldHVybjsKIAogCXNrYl9yZXNlcnZlKGJ1ZmYsIE1BWF9IRUFERVIgKyBzaXplb2Yoc3RydWN0IGlwdjZoZHIpICsgdG90X2xlbik7CkBAIC05MzEsNyArODcwLDcgQEAKIAkJaWYgKCFrZXkpCiAJCQlnb3RvIHJlbGVhc2Vfc2sxOwogCi0JCWdlbmhhc2ggPSB0Y3BfdjZfbWQ1X2hhc2hfc2tiKG5ld2hhc2gsIGtleSwgTlVMTCwgTlVMTCwgc2tiKTsKKwkJZ2VuaGFzaCA9IHRjcF92Nl9tZDVfaGFzaF9za2IobmV3aGFzaCwga2V5LCBOVUxMLCBza2IpOwogCQlpZiAoZ2VuaGFzaCB8fCBtZW1jbXAoaGFzaF9sb2NhdGlvbiwgbmV3aGFzaCwgMTYpICE9IDApCiAJCQlnb3RvIHJlbGVhc2Vfc2sxOwogCX0gZWxzZSB7CkBAIC05OTcsMTcgKzkzNiwxOSBAQAogCiBzdGF0aWMgc3RydWN0IHNvY2sgKnRjcF92Nl9obmRfcmVxKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsICoqcHJldjsKIAljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aCA9IHRjcF9oZHIoc2tiKTsKKwlzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXE7CiAJc3RydWN0IHNvY2sgKm5zazsKIAogCS8qIEZpbmQgcG9zc2libGUgY29ubmVjdGlvbiByZXF1ZXN0cy4gKi8KLQlyZXEgPSBpbmV0Nl9jc2tfc2VhcmNoX3JlcShzaywgJnByZXYsIHRoLT5zb3VyY2UsCisJcmVxID0gaW5ldDZfY3NrX3NlYXJjaF9yZXEoc2ssIHRoLT5zb3VyY2UsCiAJCQkJICAgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAogCQkJCSAgICZpcHY2X2hkcihza2IpLT5kYWRkciwgdGNwX3Y2X2lpZihza2IpKTsKLQlpZiAocmVxKQotCQlyZXR1cm4gdGNwX2NoZWNrX3JlcShzaywgc2tiLCByZXEsIHByZXYsIGZhbHNlKTsKLQorCWlmIChyZXEpIHsKKwkJbnNrID0gdGNwX2NoZWNrX3JlcShzaywgc2tiLCByZXEsIGZhbHNlKTsKKwkJcmVxc2tfcHV0KHJlcSk7CisJCXJldHVybiBuc2s7CisJfQogCW5zayA9IF9faW5ldDZfbG9va3VwX2VzdGFibGlzaGVkKHNvY2tfbmV0KHNrKSwgJnRjcF9oYXNoaW5mbywKIAkJCQkJICZpcHY2X2hkcihza2IpLT5zYWRkciwgdGgtPnNvdXJjZSwKIAkJCQkJICZpcHY2X2hkcihza2IpLT5kYWRkciwgbnRvaHModGgtPmRlc3QpLApAQCAtMTA2Nyw3ICsxMDA4LDcgQEAKIAogCQluZXdzayA9IHRjcF92NF9zeW5fcmVjdl9zb2NrKHNrLCBza2IsIHJlcSwgZHN0KTsKIAotCQlpZiAobmV3c2sgPT0gTlVMTCkKKwkJaWYgKCFuZXdzaykKIAkJCXJldHVybiBOVUxMOwogCiAJCW5ld3RjcDZzayA9IChzdHJ1Y3QgdGNwNl9zb2NrICopbmV3c2s7CkBAIC0xMDc5LDExICsxMDIwLDcgQEAKIAogCQltZW1jcHkobmV3bnAsIG5wLCBzaXplb2Yoc3RydWN0IGlwdjZfcGluZm8pKTsKIAotCQlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKG5ld2luZXQtPmluZXRfZGFkZHIsICZuZXdzay0+c2tfdjZfZGFkZHIpOwotCi0JCWlwdjZfYWRkcl9zZXRfdjRtYXBwZWQobmV3aW5ldC0+aW5ldF9zYWRkciwgJm5ld25wLT5zYWRkcik7Ci0KLQkJbmV3c2stPnNrX3Y2X3Jjdl9zYWRkciA9IG5ld25wLT5zYWRkcjsKKwkJbmV3bnAtPnNhZGRyID0gbmV3c2stPnNrX3Y2X3Jjdl9zYWRkcjsKIAogCQlpbmV0X2NzayhuZXdzayktPmljc2tfYWZfb3BzID0gJmlwdjZfbWFwcGVkOwogCQluZXdzay0+c2tfYmFja2xvZ19yY3YgPSB0Y3BfdjRfZG9fcmN2OwpAQCAtMTEyOCw3ICsxMDY1LDcgQEAKIAl9CiAKIAluZXdzayA9IHRjcF9jcmVhdGVfb3BlbnJlcV9jaGlsZChzaywgcmVxLCBza2IpOwotCWlmIChuZXdzayA9PSBOVUxMKQorCWlmICghbmV3c2spCiAJCWdvdG8gb3V0X25vbmV3c2s7CiAKIAkvKgpAQCAtMTE3MCw3ICsxMTA3LDcgQEAKIAogCS8qIENsb25lIHBrdG9wdGlvbnMgcmVjZWl2ZWQgd2l0aCBTWU4gKi8KIAluZXducC0+cGt0b3B0aW9ucyA9IE5VTEw7Ci0JaWYgKGlyZXEtPnBrdG9wdHMgIT0gTlVMTCkgeworCWlmIChpcmVxLT5wa3RvcHRzKSB7CiAJCW5ld25wLT5wa3RvcHRpb25zID0gc2tiX2Nsb25lKGlyZXEtPnBrdG9wdHMsCiAJCQkJCSAgICAgIHNrX2dmcF9hdG9taWMoc2ssIEdGUF9BVE9NSUMpKTsKIAkJY29uc3VtZV9za2IoaXJlcS0+cGt0b3B0cyk7CkBAIC0xMjE1LDcgKzExNTIsNyBAQAogI2lmZGVmIENPTkZJR19UQ1BfTUQ1U0lHCiAJLyogQ29weSBvdmVyIHRoZSBNRDUga2V5IGZyb20gdGhlIG9yaWdpbmFsIHNvY2tldCAqLwogCWtleSA9IHRjcF92Nl9tZDVfZG9fbG9va3VwKHNrLCAmbmV3c2stPnNrX3Y2X2RhZGRyKTsKLQlpZiAoa2V5ICE9IE5VTEwpIHsKKwlpZiAoa2V5KSB7CiAJCS8qIFdlJ3JlIHVzaW5nIG9uZSwgc28gY3JlYXRlIGEgbWF0Y2hpbmcga2V5CiAJCSAqIG9uIHRoZSBuZXdzayBzdHJ1Y3R1cmUuIElmIHdlIGZhaWwgdG8gZ2V0CiAJCSAqIG1lbW9yeSwgdGhlbiB3ZSBlbmQgdXAgbm90IGNvcHlpbmcgdGhlIGtleQpAQCAtMTIzMiw3ICsxMTY5LDcgQEAKIAkJdGNwX2RvbmUobmV3c2spOwogCQlnb3RvIG91dDsKIAl9Ci0JX19pbmV0Nl9oYXNoKG5ld3NrLCBOVUxMKTsKKwlfX2luZXRfaGFzaChuZXdzaywgTlVMTCk7CiAKIAlyZXR1cm4gbmV3c2s7CiAKQEAgLTE0MTEsNiArMTM0OCwxNSBAQAogCVRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkID0gMDsKIH0KIAorc3RhdGljIHZvaWQgdGNwX3Y2X3Jlc3RvcmVfY2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKiBXZSBuZWVkIHRvIG1vdmUgaGVhZGVyIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBpZiB4ZnJtNl9wb2xpY3lfY2hlY2soKQorCSAqIGFuZCB0Y3BfdjZfZmlsbF9jYigpIGFyZSBnb2luZyB0byBiZSBjYWxsZWQgYWdhaW4uCisJICovCisJbWVtbW92ZShJUDZDQihza2IpLCAmVENQX1NLQl9DQihza2IpLT5oZWFkZXIuaDYsCisJCXNpemVvZihzdHJ1Y3QgaW5ldDZfc2tiX3Bhcm0pKTsKK30KKwogc3RhdGljIGludCB0Y3BfdjZfcmN2KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJY29uc3Qgc3RydWN0IHRjcGhkciAqdGg7CkBAIC0xNTM4LDExICsxNDg0LDEyIEBACiAJCQkJCSAgICAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIHRoLT5zb3VyY2UsCiAJCQkJCSAgICAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCiAJCQkJCSAgICBudG9ocyh0aC0+ZGVzdCksIHRjcF92Nl9paWYoc2tiKSk7Ci0JCWlmIChzazIgIT0gTlVMTCkgeworCQlpZiAoc2syKSB7CiAJCQlzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dyA9IGluZXRfdHdzayhzayk7Ci0JCQlpbmV0X3R3c2tfZGVzY2hlZHVsZSh0dywgJnRjcF9kZWF0aF9yb3cpOworCQkJaW5ldF90d3NrX2Rlc2NoZWR1bGUodHcpOwogCQkJaW5ldF90d3NrX3B1dCh0dyk7CiAJCQlzayA9IHNrMjsKKwkJCXRjcF92Nl9yZXN0b3JlX2NiKHNrYik7CiAJCQlnb3RvIHByb2Nlc3M7CiAJCX0KIAkJLyogRmFsbCB0aHJvdWdoIHRvIEFDSyAqLwpAQCAtMTU1MSw2ICsxNDk4LDcgQEAKIAkJdGNwX3Y2X3RpbWV3YWl0X2Fjayhzaywgc2tiKTsKIAkJYnJlYWs7CiAJY2FzZSBUQ1BfVFdfUlNUOgorCQl0Y3BfdjZfcmVzdG9yZV9jYihza2IpOwogCQlnb3RvIG5vX3RjcF9zb2NrZXQ7CiAJY2FzZSBUQ1BfVFdfU1VDQ0VTUzoKIAkJOwpAQCAtMTU4NCw4ICsxNTMyLDggQEAKIAlpZiAoc2spIHsKIAkJc2tiLT5zayA9IHNrOwogCQlza2ItPmRlc3RydWN0b3IgPSBzb2NrX2VkZW11eDsKLQkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfVElNRV9XQUlUKSB7Ci0JCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBzay0+c2tfcnhfZHN0OworCQlpZiAoc2tfZnVsbHNvY2soc2spKSB7CisJCQlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBSRUFEX09OQ0Uoc2stPnNrX3J4X2RzdCk7CiAKIAkJCWlmIChkc3QpCiAJCQkJZHN0ID0gZHN0X2NoZWNrKGRzdCwgaW5ldDZfc2soc2spLT5yeF9kc3RfY29va2llKTsKQEAgLTE2ODksOSArMTYzNyw5IEBACiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIC8qIFByb2MgZmlsZXN5c3RlbSBUQ1B2NiBzb2NrIGxpc3QgZHVtcGluZy4gKi8KIHN0YXRpYyB2b2lkIGdldF9vcGVucmVxNihzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKLQkJCSBjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCByZXF1ZXN0X3NvY2sgKnJlcSwgaW50IGksIGt1aWRfdCB1aWQpCisJCQkgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLCBpbnQgaSwga3VpZF90IHVpZCkKIHsKLQlpbnQgdHRkID0gcmVxLT5leHBpcmVzIC0gamlmZmllczsKKwlsb25nIHR0ZCA9IHJlcS0+cnNrX3RpbWVyLmV4cGlyZXMgLSBqaWZmaWVzOwogCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc3JjID0gJmluZXRfcnNrKHJlcSktPmlyX3Y2X2xvY19hZGRyOwogCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGVzdCA9ICZpbmV0X3JzayhyZXEpLT5pcl92Nl9ybXRfYWRkcjsKIApAQCAtMTc4MCw5ICsxNzI4LDkgQEAKIHN0YXRpYyB2b2lkIGdldF90aW1ld2FpdDZfc29jayhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKIAkJCSAgICAgICBzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0dywgaW50IGkpCiB7CisJbG9uZyBkZWx0YSA9IHR3LT50d190aW1lci5leHBpcmVzIC0gamlmZmllczsKIAljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRlc3QsICpzcmM7CiAJX191MTYgZGVzdHAsIHNyY3A7Ci0JczMyIGRlbHRhID0gdHctPnR3X3R0ZCAtIGluZXRfdHdfdGltZV9zdGFtcCgpOwogCiAJZGVzdCA9ICZ0dy0+dHdfdjZfZGFkZHI7CiAJc3JjICA9ICZ0dy0+dHdfdjZfcmN2X3NhZGRyOwpAQCAtMTgyNyw3ICsxNzc1LDcgQEAKIAkJCWdldF90Y3A2X3NvY2soc2VxLCB2LCBzdC0+bnVtKTsKIAkJYnJlYWs7CiAJY2FzZSBUQ1BfU0VRX1NUQVRFX09QRU5SRVE6Ci0JCWdldF9vcGVucmVxNihzZXEsIHN0LT5zeW5fd2FpdF9zaywgdiwgc3QtPm51bSwgc3QtPnVpZCk7CisJCWdldF9vcGVucmVxNihzZXEsIHYsIHN0LT5udW0sIHN0LT51aWQpOwogCQlicmVhazsKIAl9CiBvdXQ6CkBAIC0xODkxLDcgKzE4MzksNyBAQAogCS5zZW5kcGFnZQkJPSB0Y3Bfc2VuZHBhZ2UsCiAJLmJhY2tsb2dfcmN2CQk9IHRjcF92Nl9kb19yY3YsCiAJLnJlbGVhc2VfY2IJCT0gdGNwX3JlbGVhc2VfY2IsCi0JLmhhc2gJCQk9IHRjcF92Nl9oYXNoLAorCS5oYXNoCQkJPSBpbmV0X2hhc2gsCiAJLnVuaGFzaAkJCT0gaW5ldF91bmhhc2gsCiAJLmdldF9wb3J0CQk9IGluZXRfY3NrX2dldF9wb3J0LAogCS5lbnRlcl9tZW1vcnlfcHJlc3N1cmUJPSB0Y3BfZW50ZXJfbWVtb3J5X3ByZXNzdXJlLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwdjZfb2ZmbG9hZC5jIGIvbmV0L2lwdjYvdGNwdjZfb2ZmbG9hZC5jCmluZGV4IGMxYWI3NzEuLmQ4ODNjOTIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3RjcHY2X29mZmxvYWQuYworKysgYi9uZXQvaXB2Ni90Y3B2Nl9vZmZsb2FkLmMKQEAgLTQxLDggKzQxLDggQEAKIAlyZXR1cm4gdGNwX2dyb19jb21wbGV0ZShza2IpOwogfQogCi1zdHJ1Y3Qgc2tfYnVmZiAqdGNwNl9nc29fc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdGNwNl9nc29fc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgdGNwaGRyICp0aDsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdWRwLmMgYi9uZXQvaXB2Ni91ZHAuYwppbmRleCBkMDQ4ZDQ2Li4zNDc3YzkxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHAuYworKysgYi9uZXQvaXB2Ni91ZHAuYwpAQCAtNTMsMTEgKzUzLDExIEBACiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NrYi5oPgogI2luY2x1ZGUgInVkcF9pbXBsLmgiCiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgdWRwNl9laGFzaGZuKHN0cnVjdCBuZXQgKm5ldCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbGFkZHIsCi0JCQkJICBjb25zdCB1MTYgbHBvcnQsCi0JCQkJICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmZhZGRyLAotCQkJCSAgY29uc3QgX19iZTE2IGZwb3J0KQorc3RhdGljIHUzMiB1ZHA2X2VoYXNoZm4oY29uc3Qgc3RydWN0IG5ldCAqbmV0LAorCQkJY29uc3Qgc3RydWN0IGluNl9hZGRyICpsYWRkciwKKwkJCWNvbnN0IHUxNiBscG9ydCwKKwkJCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZmFkZHIsCisJCQljb25zdCBfX2JlMTYgZnBvcnQpCiB7CiAJc3RhdGljIHUzMiB1ZHA2X2VoYXNoX3NlY3JldCBfX3JlYWRfbW9zdGx5OwogCXN0YXRpYyB1MzIgdWRwX2lwdjZfaGFzaF9zZWNyZXQgX19yZWFkX21vc3RseTsKQEAgLTEwNCw5ICsxMDQsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHVkcDZfcG9ydGFkZHJfaGFzaChzdHJ1Y3QgbmV0ICpuZXQsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcjYsCi0JCQkJICAgICAgIHVuc2lnbmVkIGludCBwb3J0KQorc3RhdGljIHUzMiB1ZHA2X3BvcnRhZGRyX2hhc2goY29uc3Qgc3RydWN0IG5ldCAqbmV0LAorCQkJICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyNiwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBwb3J0KQogewogCXVuc2lnbmVkIGludCBoYXNoLCBtaXggPSBuZXRfaGFzaF9taXgobmV0KTsKIApAQCAtMTIwLDcgKzEyMCw2IEBACiAJcmV0dXJuIGhhc2ggXiBwb3J0OwogfQogCi0KIGludCB1ZHBfdjZfZ2V0X3BvcnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBzaG9ydCBzbnVtKQogewogCXVuc2lnbmVkIGludCBoYXNoMl9udWxsYWRkciA9CkBAIC0zODUsMTQgKzM4NCwxMiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwodWRwNl9saWJfbG9va3VwKTsKIAotCiAvKgogICoJVGhpcyBzaG91bGQgYmUgZWFzeSwgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlIHdlCiAgKglyZXR1cm4gaXQsIG90aGVyd2lzZSB3ZSBibG9jay4KICAqLwogCi1pbnQgdWRwdjZfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCitpbnQgdWRwdjZfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKIAkJICBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQogewogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKQEAgLTU1MSw3ICs1NDgsNyBAQAogCiAJc2sgPSBfX3VkcDZfbGliX2xvb2t1cChuZXQsIGRhZGRyLCB1aC0+ZGVzdCwKIAkJCSAgICAgICBzYWRkciwgdWgtPnNvdXJjZSwgaW5ldDZfaWlmKHNrYiksIHVkcHRhYmxlKTsKLQlpZiAoc2sgPT0gTlVMTCkgeworCWlmICghc2spIHsKIAkJSUNNUDZfSU5DX1NUQVRTX0JIKG5ldCwgX19pbjZfZGV2X2dldChza2ItPmRldiksCiAJCQkJICAgSUNNUDZfTUlCX0lORVJST1JTKTsKIAkJcmV0dXJuOwpAQCAtNjQ5LDcgKzY0Niw3IEBACiAKIAkJLyogaWYgd2UncmUgb3Zlcmx5IHNob3J0LCBsZXQgVURQIGhhbmRsZSBpdCAqLwogCQllbmNhcF9yY3YgPSBBQ0NFU1NfT05DRSh1cC0+ZW5jYXBfcmN2KTsKLQkJaWYgKHNrYi0+bGVuID4gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpICYmIGVuY2FwX3JjdiAhPSBOVUxMKSB7CisJCWlmIChza2ItPmxlbiA+IHNpemVvZihzdHJ1Y3QgdWRwaGRyKSAmJiBlbmNhcF9yY3YpIHsKIAkJCWludCByZXQ7CiAKIAkJCS8qIFZlcmlmeSBjaGVja3N1bSBiZWZvcmUgZ2l2aW5nIHRvIGVuY2FwICovCkBAIC03NTAsNyArNzQ3LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAJCXNrID0gc3RhY2tbaV07Ci0JCWlmIChsaWtlbHkoc2tiMSA9PSBOVUxMKSkKKwkJaWYgKGxpa2VseSghc2tiMSkpCiAJCQlza2IxID0gKGkgPT0gZmluYWwpID8gc2tiIDogc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiAJCWlmICghc2tiMSkgewogCQkJYXRvbWljX2luYygmc2stPnNrX2Ryb3BzKTsKQEAgLTkwMCw3ICs4OTcsNyBAQAogCSAqIGZvciBzb2NrIGNhY2hlcy4uLiBpJ2xsIHNraXAgdGhpcyBmb3Igbm93LgogCSAqLwogCXNrID0gX191ZHA2X2xpYl9sb29rdXBfc2tiKHNrYiwgdWgtPnNvdXJjZSwgdWgtPmRlc3QsIHVkcHRhYmxlKTsKLQlpZiAoc2sgIT0gTlVMTCkgeworCWlmIChzaykgewogCQlpbnQgcmV0OwogCiAJCWlmICghdWgtPmNoZWNrICYmICF1ZHBfc2soc2spLT5ub19jaGVjazZfcngpIHsKQEAgLTExMDEsOCArMTA5OCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IHVkcHY2X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCi0JCSAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoraW50IHVkcHY2X3NlbmRtc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlwdjZfdHhvcHRpb25zIG9wdF9zcGFjZTsKIAlzdHJ1Y3QgdWRwX3NvY2sgKnVwID0gdWRwX3NrKHNrKTsKQEAgLTExNjQsMTIgKzExNjAsMTIgQEAKIGRvX3VkcF9zZW5kbXNnOgogCQkJaWYgKF9faXB2Nl9vbmx5X3NvY2soc2spKQogCQkJCXJldHVybiAtRU5FVFVOUkVBQ0g7Ci0JCQlyZXR1cm4gdWRwX3NlbmRtc2coaW9jYiwgc2ssIG1zZywgbGVuKTsKKwkJCXJldHVybiB1ZHBfc2VuZG1zZyhzaywgbXNnLCBsZW4pOwogCQl9CiAJfQogCiAJaWYgKHVwLT5wZW5kaW5nID09IEFGX0lORVQpCi0JCXJldHVybiB1ZHBfc2VuZG1zZyhpb2NiLCBzaywgbXNnLCBsZW4pOworCQlyZXR1cm4gdWRwX3NlbmRtc2coc2ssIG1zZywgbGVuKTsKIAogCS8qIFJvdWdoIGNoZWNrIG9uIGFyaXRobWV0aWMgb3ZlcmZsb3csCiAJICAgYmV0dGVyIGNoZWNrIGlzIG1hZGUgaW4gaXA2X2FwcGVuZF9kYXRhKCkuCkBAIC0xMjA5LDcgKzEyMDUsNyBAQAogCQkJZmw2LmZsb3dsYWJlbCA9IHNpbjYtPnNpbjZfZmxvd2luZm8mSVBWNl9GTE9XSU5GT19NQVNLOwogCQkJaWYgKGZsNi5mbG93bGFiZWwmSVBWNl9GTE9XTEFCRUxfTUFTSykgewogCQkJCWZsb3dsYWJlbCA9IGZsNl9zb2NrX2xvb2t1cChzaywgZmw2LmZsb3dsYWJlbCk7Ci0JCQkJaWYgKGZsb3dsYWJlbCA9PSBOVUxMKQorCQkJCWlmICghZmxvd2xhYmVsKQogCQkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJfQpAQCAtMTI1NywxNCArMTI1MywxNCBAQAogCQl9CiAJCWlmICgoZmw2LmZsb3dsYWJlbCZJUFY2X0ZMT1dMQUJFTF9NQVNLKSAmJiAhZmxvd2xhYmVsKSB7CiAJCQlmbG93bGFiZWwgPSBmbDZfc29ja19sb29rdXAoc2ssIGZsNi5mbG93bGFiZWwpOwotCQkJaWYgKGZsb3dsYWJlbCA9PSBOVUxMKQorCQkJaWYgKCFmbG93bGFiZWwpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJaWYgKCEob3B0LT5vcHRfbmZsZW58b3B0LT5vcHRfZmxlbikpCiAJCQlvcHQgPSBOVUxMOwogCQljb25uZWN0ZWQgPSAwOwogCX0KLQlpZiAob3B0ID09IE5VTEwpCisJaWYgKCFvcHQpCiAJCW9wdCA9IG5wLT5vcHQ7CiAJaWYgKGZsb3dsYWJlbCkKIAkJb3B0ID0gZmw2X21lcmdlX29wdGlvbnMoJm9wdF9zcGFjZSwgZmxvd2xhYmVsLCBvcHQpOwpAQCAtMTU1Nyw3ICsxNTUzLDYgQEAKIAkuZmxhZ3MgPSAgICAgSU5FVF9QUk9UT1NXX1BFUk1BTkVOVCwKIH07CiAKLQogaW50IF9faW5pdCB1ZHB2Nl9pbml0KHZvaWQpCiB7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcF9pbXBsLmggYi9uZXQvaXB2Ni91ZHBfaW1wbC5oCmluZGV4IGM3NzljM2MuLjA2ODJjMDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3VkcF9pbXBsLmgKKysrIGIvbmV0L2lwdjYvdWRwX2ltcGwuaApAQCAtMjMsMTAgKzIzLDkgQEAKIGludCBjb21wYXRfdWRwdjZfZ2V0c29ja29wdChzdHJ1Y3Qgc29jayAqc2ssIGludCBsZXZlbCwgaW50IG9wdG5hbWUsCiAJCQkgICAgY2hhciBfX3VzZXIgKm9wdHZhbCwgaW50IF9fdXNlciAqb3B0bGVuKTsKICNlbmRpZgotaW50IHVkcHY2X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJICBzaXplX3QgbGVuKTsKLWludCB1ZHB2Nl9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCi0JCSAgc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbik7CitpbnQgdWRwdjZfc2VuZG1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbik7CitpbnQgdWRwdjZfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssCisJCSAgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKTsKIGludCB1ZHB2Nl9xdWV1ZV9yY3Zfc2tiKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiB2b2lkIHVkcHY2X2Rlc3Ryb3lfc29jayhzdHJ1Y3Qgc29jayAqc2spOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni91ZHBfb2ZmbG9hZC5jIGIvbmV0L2lwdjYvdWRwX29mZmxvYWQuYwppbmRleCBhYjg4OWJiLi43NDQxZTFlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni91ZHBfb2ZmbG9hZC5jCisrKyBiL25ldC9pcHY2L3VkcF9vZmZsb2FkLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAogCQkvKiBTZXQgdGhlIElQdjYgZnJhZ21lbnQgaWQgaWYgbm90IHNldCB5ZXQgKi8KIAkJaWYgKCFza2Jfc2hpbmZvKHNrYiktPmlwNl9mcmFnX2lkKQotCQkJaXB2Nl9wcm94eV9zZWxlY3RfaWRlbnQoc2tiKTsKKwkJCWlwdjZfcHJveHlfc2VsZWN0X2lkZW50KGRldl9uZXQoc2tiLT5kZXYpLCBza2IpOwogCiAJCXNlZ3MgPSBOVUxMOwogCQlnb3RvIG91dDsKQEAgLTExMiwxMSArMTEyLDkgQEAKIAkJZnB0ciA9IChzdHJ1Y3QgZnJhZ19oZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyB1bmZyYWdfaXA2aGxlbik7CiAJCWZwdHItPm5leHRoZHIgPSBuZXh0aGRyOwogCQlmcHRyLT5yZXNlcnZlZCA9IDA7Ci0JCWlmIChza2Jfc2hpbmZvKHNrYiktPmlwNl9mcmFnX2lkKQotCQkJZnB0ci0+aWRlbnRpZmljYXRpb24gPSBza2Jfc2hpbmZvKHNrYiktPmlwNl9mcmFnX2lkOwotCQllbHNlCi0JCQlpcHY2X3NlbGVjdF9pZGVudChmcHRyLAotCQkJCQkgIChzdHJ1Y3QgcnQ2X2luZm8gKilza2JfZHN0KHNrYikpOworCQlpZiAoIXNrYl9zaGluZm8oc2tiKS0+aXA2X2ZyYWdfaWQpCisJCQlpcHY2X3Byb3h5X3NlbGVjdF9pZGVudChkZXZfbmV0KHNrYi0+ZGV2KSwgc2tiKTsKKwkJZnB0ci0+aWRlbnRpZmljYXRpb24gPSBza2Jfc2hpbmZvKHNrYiktPmlwNl9mcmFnX2lkOwogCiAJCS8qIEZyYWdtZW50IHRoZSBza2IuIGlwdjYgaGVhZGVyIGFuZCB0aGUgcmVtYWluaW5nIGZpZWxkcyBvZiB0aGUKIAkJICogZnJhZ21lbnQgaGVhZGVyIGFyZSB1cGRhdGVkIGluIGlwdjZfZ3NvX3NlZ21lbnQoKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfaW5wdXQuYyBiL25ldC9pcHY2L3hmcm02X2lucHV0LmMKaW5kZXggZjQ4ZmJlNC4uNzRiZDE3OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfaW5wdXQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9pbnB1dC5jCkBAIC00Miw3ICs0Miw4IEBACiAJaXB2Nl9oZHIoc2tiKS0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbik7CiAJX19za2JfcHVzaChza2IsIHNrYi0+ZGF0YSAtIHNrYl9uZXR3b3JrX2hlYWRlcihza2IpKTsKIAotCU5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX1BSRV9ST1VUSU5HLCBza2IsIHNrYi0+ZGV2LCBOVUxMLAorCU5GX0hPT0soTkZQUk9UT19JUFY2LCBORl9JTkVUX1BSRV9ST1VUSU5HLCBOVUxMLCBza2IsCisJCXNrYi0+ZGV2LCBOVUxMLAogCQlpcDZfcmN2X2ZpbmlzaCk7CiAJcmV0dXJuIC0xOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfbW9kZV9iZWV0LmMgYi9uZXQvaXB2Ni94ZnJtNl9tb2RlX2JlZXQuYwppbmRleCA5OTQ5YTM1Li4xZTIwNWMzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9tb2RlX2JlZXQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9tb2RlX2JlZXQuYwpAQCAtOTUsOCArOTUsOCBAQAogCiAJaXA2aCA9IGlwdjZfaGRyKHNrYik7CiAJaXA2aC0+cGF5bG9hZF9sZW4gPSBodG9ucyhza2ItPmxlbiAtIHNpemUpOwotCWlwNmgtPmRhZGRyID0gKihzdHJ1Y3QgaW42X2FkZHIgKikmeC0+c2VsLmRhZGRyLmE2OwotCWlwNmgtPnNhZGRyID0gKihzdHJ1Y3QgaW42X2FkZHIgKikmeC0+c2VsLnNhZGRyLmE2OworCWlwNmgtPmRhZGRyID0geC0+c2VsLmRhZGRyLmluNjsKKwlpcDZoLT5zYWRkciA9IHgtPnNlbC5zYWRkci5pbjY7CiAJZXJyID0gMDsKIG91dDoKIAlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfb3V0cHV0LmMgYi9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYwppbmRleCBjYTNmMjliLi4wOWM3NmE3IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYwpAQCAtMTE0LDI0ICsxMTQsMjQgQEAKIAkJcmV0dXJuIGVycjsKIAogCXNrYi0+aWdub3JlX2RmID0gMTsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CiAKIAlyZXR1cm4geC0+b3V0ZXJfbW9kZS0+b3V0cHV0Mih4LCBza2IpOwogfQogRVhQT1JUX1NZTUJPTCh4ZnJtNl9wcmVwYXJlX291dHB1dCk7CiAKLWludCB4ZnJtNl9vdXRwdXRfZmluaXNoKHN0cnVjdCBza19idWZmICpza2IpCitpbnQgeGZybTZfb3V0cHV0X2ZpbmlzaChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJbWVtc2V0KElQNkNCKHNrYiksIDAsIHNpemVvZigqSVA2Q0Ioc2tiKSkpOwotCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKIAogI2lmZGVmIENPTkZJR19ORVRGSUxURVIKIAlJUDZDQihza2IpLT5mbGFncyB8PSBJUDZTS0JfWEZSTV9UUkFOU0ZPUk1FRDsKICNlbmRpZgogCi0JcmV0dXJuIHhmcm1fb3V0cHV0KHNrYik7CisJcmV0dXJuIHhmcm1fb3V0cHV0KHNrLCBza2IpOwogfQogCi1zdGF0aWMgaW50IF9feGZybTZfb3V0cHV0KHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IF9feGZybTZfb3V0cHV0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7CiAJc3RydWN0IHhmcm1fc3RhdGUgKnggPSBkc3QtPnhmcm07CkBAIC0xNDAsNyArMTQwLDcgQEAKICNpZmRlZiBDT05GSUdfTkVURklMVEVSCiAJaWYgKCF4KSB7CiAJCUlQNkNCKHNrYiktPmZsYWdzIHw9IElQNlNLQl9SRVJPVVRFRDsKLQkJcmV0dXJuIGRzdF9vdXRwdXQoc2tiKTsKKwkJcmV0dXJuIGRzdF9vdXRwdXRfc2soc2ssIHNrYik7CiAJfQogI2VuZGlmCiAKQEAgLTE2MCwxNCArMTYwLDE1IEBACiAJaWYgKHgtPnByb3BzLm1vZGUgPT0gWEZSTV9NT0RFX1RVTk5FTCAmJgogCSAgICAoKHNrYi0+bGVuID4gbXR1ICYmICFza2JfaXNfZ3NvKHNrYikpIHx8CiAJCWRzdF9hbGxmcmFnKHNrYl9kc3Qoc2tiKSkpKSB7Ci0JCQlyZXR1cm4gaXA2X2ZyYWdtZW50KHNrYiwgeC0+b3V0ZXJfbW9kZS0+YWZpbmZvLT5vdXRwdXRfZmluaXNoKTsKKwkJcmV0dXJuIGlwNl9mcmFnbWVudChzaywgc2tiLAorCQkJCSAgICB4LT5vdXRlcl9tb2RlLT5hZmluZm8tPm91dHB1dF9maW5pc2gpOwogCX0KLQlyZXR1cm4geC0+b3V0ZXJfbW9kZS0+YWZpbmZvLT5vdXRwdXRfZmluaXNoKHNrYik7CisJcmV0dXJuIHgtPm91dGVyX21vZGUtPmFmaW5mby0+b3V0cHV0X2ZpbmlzaChzaywgc2tiKTsKIH0KIAogaW50IHhmcm02X291dHB1dChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIE5GX0hPT0tfQ09ORChORlBST1RPX0lQVjYsIE5GX0lORVRfUE9TVF9ST1VUSU5HLCBza2IsCisJcmV0dXJuIE5GX0hPT0tfQ09ORChORlBST1RPX0lQVjYsIE5GX0lORVRfUE9TVF9ST1VUSU5HLCBzaywgc2tiLAogCQkJICAgIE5VTEwsIHNrYl9kc3Qoc2tiKS0+ZGV2LCBfX3hmcm02X291dHB1dCwKIAkJCSAgICAhKElQNkNCKHNrYiktPmZsYWdzICYgSVA2U0tCX1JFUk9VVEVEKSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYyBiL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCmluZGV4IDQ4YmY1YTAuLmYzMzdhOTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCisrKyBiL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCkBAIC02MSw5ICs2MSw3IEBACiAJCXJldHVybiAtRUhPU1RVTlJFQUNIOwogCiAJZGV2ID0gaXA2X2RzdF9pZGV2KGRzdCktPmRldjsKLQlpcHY2X2Rldl9nZXRfc2FkZHIoZGV2X25ldChkZXYpLCBkZXYsCi0JCQkgICAoc3RydWN0IGluNl9hZGRyICopJmRhZGRyLT5hNiwgMCwKLQkJCSAgIChzdHJ1Y3QgaW42X2FkZHIgKikmc2FkZHItPmE2KTsKKwlpcHY2X2Rldl9nZXRfc2FkZHIoZGV2X25ldChkZXYpLCBkZXYsICZkYWRkci0+aW42LCAwLCAmc2FkZHItPmluNik7CiAJZHN0X3JlbGVhc2UoZHN0KTsKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMCw2ICsxOTgsNyBAQAogCiAjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNl9NSVA2KQogCQljYXNlIElQUFJPVE9fTUg6CisJCQlvZmZzZXQgKz0gaXB2Nl9vcHRsZW4oZXh0aGRyKTsKIAkJCWlmICghb25seXByb3RvICYmIHBza2JfbWF5X3B1bGwoc2tiLCBuaCArIG9mZnNldCArIDMgLSBza2ItPmRhdGEpKSB7CiAJCQkJc3RydWN0IGlwNl9taCAqbWg7CiAKQEAgLTI5Miw3ICsyOTEsNiBAQAogCiBzdGF0aWMgc3RydWN0IGRzdF9vcHMgeGZybTZfZHN0X29wcyA9IHsKIAkuZmFtaWx5ID0JCUFGX0lORVQ2LAotCS5wcm90b2NvbCA9CQljcHVfdG9fYmUxNihFVEhfUF9JUFY2KSwKIAkuZ2MgPQkJCXhmcm02X2dhcmJhZ2VfY29sbGVjdCwKIAkudXBkYXRlX3BtdHUgPQkJeGZybTZfdXBkYXRlX3BtdHUsCiAJLnJlZGlyZWN0ID0JCXhmcm02X3JlZGlyZWN0LApAQCAtMzcwLDcgKzM2OCw3IEBACiB7CiAJc3RydWN0IGN0bF90YWJsZSAqdGFibGU7CiAKLQlpZiAobmV0LT5pcHY2LnN5c2N0bC54ZnJtNl9oZHIgPT0gTlVMTCkKKwlpZiAoIW5ldC0+aXB2Ni5zeXNjdGwueGZybTZfaGRyKQogCQlyZXR1cm47CiAKIAl0YWJsZSA9IG5ldC0+aXB2Ni5zeXNjdGwueGZybTZfaGRyLT5jdGxfdGFibGVfYXJnOwpkaWZmIC0tZ2l0IGEvbmV0L2lweC9hZl9pcHguYyBiL25ldC9pcHgvYWZfaXB4LmMKaW5kZXggZjExYWQxZC4uNGVhNWQ3NCAxMDA2NDQKLS0tIGEvbmV0L2lweC9hZl9pcHguYworKysgYi9uZXQvaXB4L2FmX2lweC5jCkBAIC0xNjg4LDggKzE2ODgsNyBAQAogCXJldHVybiByYzsKIH0KIAotc3RhdGljIGludCBpcHhfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0Jc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCBpcHhfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGlweF9zb2NrICppcHhzID0gaXB4X3NrKHNrKTsKQEAgLTE3NTQsOCArMTc1Myw4IEBACiB9CiAKIAotc3RhdGljIGludCBpcHhfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3N0YXRpYyBpbnQgaXB4X3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwKKwkJICAgICAgIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgaXB4X3NvY2sgKmlweHMgPSBpcHhfc2soc2spOwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvYWZfaXJkYS5jIGIvbmV0L2lyZGEvYWZfaXJkYS5jCmluZGV4IDU2OGVkYzcuLmVlMGVhMjUgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2FmX2lyZGEuYworKysgYi9uZXQvaXJkYS9hZl9pcmRhLmMKQEAgLTEyNTYsMTQgKzEyNTYsMTMgQEAKIH0KIAogLyoKLSAqIEZ1bmN0aW9uIGlyZGFfc2VuZG1zZyAoaW9jYiwgc29jaywgbXNnLCBsZW4pCisgKiBGdW5jdGlvbiBpcmRhX3NlbmRtc2cgKHNvY2ssIG1zZywgbGVuKQogICoKICAqICAgIFNlbmQgbWVzc2FnZSBkb3duIHRvIFRpbnlUUC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBib3RoIFNUUkVBTSBhbmQKICAqICAgIFNFUVBBQ0sgc2VydmljZXMuIFRoaXMgaXMgcG9zc2libGUgc2luY2UgaXQgZm9yY2VzIHRoZSBjbGllbnQgdG8KICAqICAgIGZyYWdtZW50IHRoZSBtZXNzYWdlIGlmIG5lY2Vzc2FyeQogICovCi1zdGF0aWMgaW50IGlyZGFfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGlyZGFfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKQEAgLTEzNDgsMTMgKzEzNDcsMTMgQEAKIH0KIAogLyoKLSAqIEZ1bmN0aW9uIGlyZGFfcmVjdm1zZ19kZ3JhbSAoaW9jYiwgc29jaywgbXNnLCBzaXplLCBmbGFncykKKyAqIEZ1bmN0aW9uIGlyZGFfcmVjdm1zZ19kZ3JhbSAoc29jaywgbXNnLCBzaXplLCBmbGFncykKICAqCiAgKiAgICBUcnkgdG8gcmVjZWl2ZSBtZXNzYWdlIGFuZCBjb3B5IGl0IHRvIHVzZXIuIFRoZSBmcmFtZSBpcyBkaXNjYXJkZWQKICAqICAgIGFmdGVyIGJlaW5nIHJlYWQsIHJlZ2FyZGxlc3Mgb2YgaG93IG11Y2ggdGhlIHVzZXIgYWN0dWFsbHkgcmVhZAogICovCi1zdGF0aWMgaW50IGlyZGFfcmVjdm1zZ19kZ3JhbShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IGlyZGFfcmVjdm1zZ19kZ3JhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgICBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGYgPSBpcmRhX3NrKHNrKTsKQEAgLTEzOTgsMTAgKzEzOTcsMTAgQEAKIH0KIAogLyoKLSAqIEZ1bmN0aW9uIGlyZGFfcmVjdm1zZ19zdHJlYW0gKGlvY2IsIHNvY2ssIG1zZywgc2l6ZSwgZmxhZ3MpCisgKiBGdW5jdGlvbiBpcmRhX3JlY3Ztc2dfc3RyZWFtIChzb2NrLCBtc2csIHNpemUsIGZsYWdzKQogICovCi1zdGF0aWMgaW50IGlyZGFfcmVjdm1zZ19zdHJlYW0oc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3N0YXRpYyBpbnQgaXJkYV9yZWN2bXNnX3N0cmVhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgaXJkYV9zb2NrICpzZWxmID0gaXJkYV9zayhzayk7CkBAIC0xNTE1LDE0ICsxNTE0LDE0IEBACiB9CiAKIC8qCi0gKiBGdW5jdGlvbiBpcmRhX3NlbmRtc2dfZGdyYW0gKGlvY2IsIHNvY2ssIG1zZywgbGVuKQorICogRnVuY3Rpb24gaXJkYV9zZW5kbXNnX2RncmFtIChzb2NrLCBtc2csIGxlbikKICAqCiAgKiAgICBTZW5kIG1lc3NhZ2UgZG93biB0byBUaW55VFAgZm9yIHRoZSB1bnJlbGlhYmxlIHNlcXVlbmNlZAogICogICAgcGFja2V0IHNlcnZpY2UuLi4KICAqCiAgKi8KLXN0YXRpYyBpbnQgaXJkYV9zZW5kbXNnX2RncmFtKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgaXJkYV9zZW5kbXNnX2RncmFtKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IGlyZGFfc29jayAqc2VsZjsKQEAgLTE1OTQsMTQgKzE1OTMsMTQgQEAKIH0KIAogLyoKLSAqIEZ1bmN0aW9uIGlyZGFfc2VuZG1zZ191bHRyYSAoaW9jYiwgc29jaywgbXNnLCBsZW4pCisgKiBGdW5jdGlvbiBpcmRhX3NlbmRtc2dfdWx0cmEgKHNvY2ssIG1zZywgbGVuKQogICoKICAqICAgIFNlbmQgbWVzc2FnZSBkb3duIHRvIElyTE1QIGZvciB0aGUgdW5yZWxpYWJsZSBVbHRyYQogICogICAgcGFja2V0IHNlcnZpY2UuLi4KICAqLwogI2lmZGVmIENPTkZJR19JUkRBX1VMVFJBCi1zdGF0aWMgaW50IGlyZGFfc2VuZG1zZ191bHRyYShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGlyZGFfc2VuZG1zZ191bHRyYShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBpcmRhX3NvY2sgKnNlbGY7CmRpZmYgLS1naXQgYS9uZXQvaXVjdi9hZl9pdWN2LmMgYi9uZXQvaXVjdi9hZl9pdWN2LmMKaW5kZXggMmU5OTUzYi4uNmRhYTUyYSAxMDA2NDQKLS0tIGEvbmV0L2l1Y3YvYWZfaXVjdi5jCisrKyBiL25ldC9pdWN2L2FmX2l1Y3YuYwpAQCAtMTAyNiw4ICsxMDI2LDggQEAKIAkJCQkgKHZvaWQgKikgcHJtZGF0YSwgOCk7CiB9CiAKLXN0YXRpYyBpbnQgaXVjdl9zb2NrX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGl1Y3Zfc29ja19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICAgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgaXVjdl9zb2NrICppdWN2ID0gaXVjdl9zayhzayk7CkBAIC0xMTE0LDEwICsxMTE0LDggQEAKIAkJCW5vYmxvY2ssICZlcnIpOwogCWVsc2UKIAkJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgbGVuLCBub2Jsb2NrLCAmZXJyKTsKLQlpZiAoIXNrYikgewotCQllcnIgPSAtRU5PTUVNOworCWlmICghc2tiKQogCQlnb3RvIG91dDsKLQl9CiAJaWYgKGl1Y3YtPnRyYW5zcG9ydCA9PSBBRl9JVUNWX1RSQU5TX0hJUEVSKQogCQlza2JfcmVzZXJ2ZShza2IsIHNpemVvZihzdHJ1Y3QgYWZfaXVjdl90cmFuc19oZHIpICsgRVRIX0hMRU4pOwogCWlmIChtZW1jcHlfZnJvbV9tc2coc2tiX3B1dChza2IsIGxlbiksIG1zZywgbGVuKSkgewpAQCAtMTMxNyw4ICsxMzE1LDggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgaXVjdl9zb2NrX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK3N0YXRpYyBpbnQgaXVjdl9zb2NrX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJICAgICBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCiB7CiAJaW50IG5vYmxvY2sgPSBmbGFncyAmIE1TR19ET05UV0FJVDsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKZGlmZiAtLWdpdCBhL25ldC9rZXkvYWZfa2V5LmMgYi9uZXQva2V5L2FmX2tleS5jCmluZGV4IGY4YWM5MzkuLmYwZDUyZDcgMTAwNjQ0Ci0tLSBhL25ldC9rZXkvYWZfa2V5LmMKKysrIGIvbmV0L2tleS9hZl9rZXkuYwpAQCAtNzA5LDcgKzcwOSw3IEBACiAJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAJCXNpbjYtPnNpbjZfcG9ydCA9IHBvcnQ7CiAJCXNpbjYtPnNpbjZfZmxvd2luZm8gPSAwOwotCQlzaW42LT5zaW42X2FkZHIgPSAqKHN0cnVjdCBpbjZfYWRkciAqKXhhZGRyLT5hNjsKKwkJc2luNi0+c2luNl9hZGRyID0geGFkZHItPmluNjsKIAkJc2luNi0+c2luNl9zY29wZV9pZCA9IDA7CiAJCXJldHVybiAxMjg7CiAJICAgIH0KQEAgLTM1ODgsOCArMzU4OCw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGludCBwZmtleV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqa2lvY2IsCi0JCQkgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCBwZmtleV9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKQEAgLTM2MzAsOCArMzYyOSw3IEBACiAJcmV0dXJuIGVyciA/IDogbGVuOwogfQogCi1zdGF0aWMgaW50IHBma2V5X3JlY3Ztc2coc3RydWN0IGtpb2NiICpraW9jYiwKLQkJCSBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCitzdGF0aWMgaW50IHBma2V5X3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAogCQkJIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfY29yZS5jIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmMKaW5kZXggODk1MzQ4ZS4uYTI5YTUwNCAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9jb3JlLmMKKysrIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmMKQEAgLTE4NzEsNiArMTg3MSw3IEBACiAJbDJ0cF93cSA9IGFsbG9jX3dvcmtxdWV1ZSgibDJ0cCIsIFdRX1VOQk9VTkQsIDApOwogCWlmICghbDJ0cF93cSkgewogCQlwcl9lcnIoImFsbG9jX3dvcmtxdWV1ZSBmYWlsZWRcbiIpOworCQl1bnJlZ2lzdGVyX3Blcm5ldF9kZXZpY2UoJmwydHBfbmV0X29wcyk7CiAJCXJjID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2wydHAvbDJ0cF9ldGguYyBiL25ldC9sMnRwL2wydHBfZXRoLmMKaW5kZXggNzgxYjNhMi4uNGI1NTI4NyAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9ldGguYworKysgYi9uZXQvbDJ0cC9sMnRwX2V0aC5jCkBAIC03NCw3ICs3NCw3IEBACiAKIAlwcml2LT5kZXYgPSBkZXY7CiAJZXRoX2h3X2FkZHJfcmFuZG9tKGRldik7Ci0JbWVtc2V0KCZkZXYtPmJyb2FkY2FzdFswXSwgMHhmZiwgNik7CisJZXRoX2Jyb2FkY2FzdF9hZGRyKGRldi0+YnJvYWRjYXN0KTsKIAlkZXYtPnFkaXNjX3R4X2J1c3lsb2NrID0gJmwydHBfZXRoX3R4X2J1c3lsb2NrOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2wydHAvbDJ0cF9pcC5jIGIvbmV0L2wydHAvbDJ0cF9pcC5jCmluZGV4IDA1ZGZjOGEuLjc5NjQ5OTMgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfaXAuYworKysgYi9uZXQvbDJ0cC9sMnRwX2lwLmMKQEAgLTM4NSw3ICszODUsNyBAQAogLyogVXNlcnNwYWNlIHdpbGwgY2FsbCBzZW5kbXNnKCkgb24gdGhlIHR1bm5lbCBzb2NrZXQgdG8gc2VuZCBMMlRQCiAgKiBjb250cm9sIGZyYW1lcy4KICAqLwotc3RhdGljIGludCBsMnRwX2lwX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgbDJ0cF9pcF9zZW5kbXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IHJjOwpAQCAtNTA2LDcgKzUwNiw3IEBACiAJZ290byBvdXQ7CiB9CiAKLXN0YXRpYyBpbnQgbDJ0cF9pcF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csCitzdGF0aWMgaW50IGwydHBfaXBfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywKIAkJCSAgIHNpemVfdCBsZW4sIGludCBub2Jsb2NrLCBpbnQgZmxhZ3MsIGludCAqYWRkcl9sZW4pCiB7CiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwpkaWZmIC0tZ2l0IGEvbmV0L2wydHAvbDJ0cF9pcDYuYyBiL25ldC9sMnRwL2wydHBfaXA2LmMKaW5kZXggODYxMWYxYi4uZDFkZWQzNyAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9pcDYuYworKysgYi9uZXQvbDJ0cC9sMnRwX2lwNi5jCkBAIC00ODAsOCArNDgwLDcgQEAKIC8qIFVzZXJzcGFjZSB3aWxsIGNhbGwgc2VuZG1zZygpIG9uIHRoZSB0dW5uZWwgc29ja2V0IHRvIHNlbmQgTDJUUAogICogY29udHJvbCBmcmFtZXMuCiAgKi8KLXN0YXRpYyBpbnQgbDJ0cF9pcDZfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJCSAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGwydHBfaXA2X3NlbmRtc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IGlwdjZfdHhvcHRpb25zIG9wdF9zcGFjZTsKIAlERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl9sMnRwaXA2ICosIGxzYSwgbXNnLT5tc2dfbmFtZSk7CkBAIC02NDMsOSArNjQyLDggQEAKIAlnb3RvIGRvbmU7CiB9CiAKLXN0YXRpYyBpbnQgbDJ0cF9pcDZfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJCSAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBub2Jsb2NrLAotCQkJICAgIGludCBmbGFncywgaW50ICphZGRyX2xlbikKK3N0YXRpYyBpbnQgbDJ0cF9pcDZfcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCSAgICBpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQogewogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKIAlERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl9sMnRwaXA2ICosIGxzYSwgbXNnLT5tc2dfbmFtZSk7CmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX25ldGxpbmsuYyBiL25ldC9sMnRwL2wydHBfbmV0bGluay5jCmluZGV4IGI0ZTkyM2YuLjllMTNjMmYgMTAwNjQ0Ci0tLSBhL25ldC9sMnRwL2wydHBfbmV0bGluay5jCisrKyBiL25ldC9sMnRwL2wydHBfbmV0bGluay5jCkBAIC0yMDUsOSArMjA1LDkgQEAKICNlbmRpZgogCQlpZiAoaW5mby0+YXR0cnNbTDJUUF9BVFRSX0lQX1NBRERSXSAmJgogCQkgICAgaW5mby0+YXR0cnNbTDJUUF9BVFRSX0lQX0RBRERSXSkgewotCQkJY2ZnLmxvY2FsX2lwLnNfYWRkciA9IG5sYV9nZXRfYmUzMigKKwkJCWNmZy5sb2NhbF9pcC5zX2FkZHIgPSBubGFfZ2V0X2luX2FkZHIoCiAJCQkJaW5mby0+YXR0cnNbTDJUUF9BVFRSX0lQX1NBRERSXSk7Ci0JCQljZmcucGVlcl9pcC5zX2FkZHIgPSBubGFfZ2V0X2JlMzIoCisJCQljZmcucGVlcl9pcC5zX2FkZHIgPSBubGFfZ2V0X2luX2FkZHIoCiAJCQkJaW5mby0+YXR0cnNbTDJUUF9BVFRSX0lQX0RBRERSXSk7CiAJCX0gZWxzZSB7CiAJCQlyZXQgPSAtRUlOVkFMOwpAQCAtMzc2LDE1ICszNzYsMTcgQEAKIAljYXNlIEwyVFBfRU5DQVBUWVBFX0lQOgogI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCWlmIChucCkgewotCQkJaWYgKG5sYV9wdXQoc2tiLCBMMlRQX0FUVFJfSVA2X1NBRERSLCBzaXplb2YobnAtPnNhZGRyKSwKLQkJCQkgICAgJm5wLT5zYWRkcikgfHwKLQkJCSAgICBubGFfcHV0KHNrYiwgTDJUUF9BVFRSX0lQNl9EQUREUiwgc2l6ZW9mKHNrLT5za192Nl9kYWRkciksCi0JCQkJICAgICZzay0+c2tfdjZfZGFkZHIpKQorCQkJaWYgKG5sYV9wdXRfaW42X2FkZHIoc2tiLCBMMlRQX0FUVFJfSVA2X1NBRERSLAorCQkJCQkgICAgICZucC0+c2FkZHIpIHx8CisJCQkgICAgbmxhX3B1dF9pbjZfYWRkcihza2IsIEwyVFBfQVRUUl9JUDZfREFERFIsCisJCQkJCSAgICAgJnNrLT5za192Nl9kYWRkcikpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0gZWxzZQogI2VuZGlmCi0JCWlmIChubGFfcHV0X2JlMzIoc2tiLCBMMlRQX0FUVFJfSVBfU0FERFIsIGluZXQtPmluZXRfc2FkZHIpIHx8Ci0JCSAgICBubGFfcHV0X2JlMzIoc2tiLCBMMlRQX0FUVFJfSVBfREFERFIsIGluZXQtPmluZXRfZGFkZHIpKQorCQlpZiAobmxhX3B1dF9pbl9hZGRyKHNrYiwgTDJUUF9BVFRSX0lQX1NBRERSLAorCQkJCSAgICBpbmV0LT5pbmV0X3NhZGRyKSB8fAorCQkgICAgbmxhX3B1dF9pbl9hZGRyKHNrYiwgTDJUUF9BVFRSX0lQX0RBRERSLAorCQkJCSAgICBpbmV0LT5pbmV0X2RhZGRyKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9uZXQvbDJ0cC9sMnRwX3BwcC5jIGIvbmV0L2wydHAvbDJ0cF9wcHAuYwppbmRleCBjYzdhODI4Li5lOWIwZGVjIDEwMDY0NAotLS0gYS9uZXQvbDJ0cC9sMnRwX3BwcC5jCisrKyBiL25ldC9sMnRwL2wydHBfcHBwLmMKQEAgLTE4NSw5ICsxODUsOCBAQAogCiAvKiBSZWNlaXZlIG1lc3NhZ2UuIFRoaXMgaXMgdGhlIHJlY3Ztc2cgZm9yIHRoZSBQUFBvTDJUUCBzb2NrZXQuCiAgKi8KLXN0YXRpYyBpbnQgcHBwb2wydHBfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAotCQkJICAgIGludCBmbGFncykKK3N0YXRpYyBpbnQgcHBwb2wydHBfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgc2l6ZV90IGxlbiwgaW50IGZsYWdzKQogewogCWludCBlcnI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTI5NSw3ICsyOTQsNyBAQAogICogd2hlbiBhIHVzZXIgYXBwbGljYXRpb24gZG9lcyBhIHNlbmRtc2coKSBvbiB0aGUgc2Vzc2lvbiBzb2NrZXQuIEwyVFAgYW5kCiAgKiBQUFAgaGVhZGVycyBtdXN0IGJlIGluc2VydGVkIGludG8gdGhlIHVzZXIncyBkYXRhLgogICovCi1zdGF0aWMgaW50IHBwcG9sMnRwX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLAorc3RhdGljIGludCBwcHBvbDJ0cF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sCiAJCQkgICAgc2l6ZV90IHRvdGFsX2xlbikKIHsKIAlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBwcHBoWzJdID0geyAweGZmLCAweDAzIH07CmRpZmYgLS1naXQgYS9uZXQvbGxjL2FmX2xsYy5jIGIvbmV0L2xsYy9hZl9sbGMuYwppbmRleCAyYzBiODNjLi4xN2E4ZGZmIDEwMDY0NAotLS0gYS9uZXQvbGxjL2FmX2xsYy5jCisrKyBiL25ldC9sbGMvYWZfbGxjLmMKQEAgLTcwNCw4ICs3MDQsOCBAQAogICoJQ29weSByZWNlaXZlZCBkYXRhIHRvIHRoZSBzb2NrZXQgdXNlci4KICAqCVJldHVybnMgbm9uLW5lZ2F0aXZlIHVwb24gc3VjY2VzcywgbmVnYXRpdmUgb3RoZXJ3aXNlLgogICovCi1zdGF0aWMgaW50IGxsY191aV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IGxsY191aV9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCSAgaW50IGZsYWdzKQogewogCURFQ0xBUkVfU09DS0FERFIoc3RydWN0IHNvY2thZGRyX2xsYyAqLCB1YWRkciwgbXNnLT5tc2dfbmFtZSk7CiAJY29uc3QgaW50IG5vbmJsb2NrID0gZmxhZ3MgJiBNU0dfRE9OVFdBSVQ7CkBAIC04NzgsOCArODc4LDcgQEAKICAqCVRyYW5zbWl0IGRhdGEgcHJvdmlkZWQgYnkgdGhlIHNvY2tldCB1c2VyLgogICoJUmV0dXJucyBub24tbmVnYXRpdmUgdXBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBvdGhlcndpc2UuCiAgKi8KLXN0YXRpYyBpbnQgbGxjX3VpX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGxsY191aV9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgbGxjX3NvY2sgKmxsYyA9IGxsY19zayhzayk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvYWVzX2NjbS5jIGIvbmV0L21hYzgwMjExL2Flc19jY20uYwppbmRleCA3ODY5YmI0Li4yMDhkZjdjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvYWVzX2NjbS5jCisrKyBiL25ldC9tYWM4MDIxMS9hZXNfY2NtLmMKQEAgLTg1LDExICs4NSwxNSBAQAogCQlyZXR1cm4gdGZtOwogCiAJZXJyID0gY3J5cHRvX2FlYWRfc2V0a2V5KHRmbSwga2V5LCBrZXlfbGVuKTsKLQlpZiAoIWVycikKLQkJZXJyID0gY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUodGZtLCBtaWNfbGVuKTsKLQlpZiAoIWVycikKLQkJcmV0dXJuIHRmbTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfYWVhZDsKKwllcnIgPSBjcnlwdG9fYWVhZF9zZXRhdXRoc2l6ZSh0Zm0sIG1pY19sZW4pOworCWlmIChlcnIpCisJCWdvdG8gZnJlZV9hZWFkOwogCisJcmV0dXJuIHRmbTsKKworZnJlZV9hZWFkOgogCWNyeXB0b19mcmVlX2FlYWQodGZtKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2Flc19nY20uYyBiL25ldC9tYWM4MDIxMS9hZXNfZ2NtLmMKaW5kZXggYzJiZjY2OS4uZmQyNzhiYiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2Flc19nY20uYworKysgYi9uZXQvbWFjODAyMTEvYWVzX2djbS5jCkBAIC04MCwxMSArODAsMTUgQEAKIAkJcmV0dXJuIHRmbTsKIAogCWVyciA9IGNyeXB0b19hZWFkX3NldGtleSh0Zm0sIGtleSwga2V5X2xlbik7Ci0JaWYgKCFlcnIpCi0JCWVyciA9IGNyeXB0b19hZWFkX3NldGF1dGhzaXplKHRmbSwgSUVFRTgwMjExX0dDTVBfTUlDX0xFTik7Ci0JaWYgKCFlcnIpCi0JCXJldHVybiB0Zm07CisJaWYgKGVycikKKwkJZ290byBmcmVlX2FlYWQ7CisJZXJyID0gY3J5cHRvX2FlYWRfc2V0YXV0aHNpemUodGZtLCBJRUVFODAyMTFfR0NNUF9NSUNfTEVOKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfYWVhZDsKIAorCXJldHVybiB0Zm07CisKK2ZyZWVfYWVhZDoKIAljcnlwdG9fZnJlZV9hZWFkKHRmbSk7CiAJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9hZXNfZ21hYy5jIGIvbmV0L21hYzgwMjExL2Flc19nbWFjLmMKaW5kZXggMWM3MmVkYy4uZjEzMjFiNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2Flc19nbWFjLmMKKysrIGIvbmV0L21hYzgwMjExL2Flc19nbWFjLmMKQEAgLTcwLDkgKzcwLDkgQEAKIAogCWVyciA9IGNyeXB0b19hZWFkX3NldGtleSh0Zm0sIGtleSwga2V5X2xlbik7CiAJaWYgKCFlcnIpCi0JCXJldHVybiB0Zm07Ci0JaWYgKCFlcnIpCiAJCWVyciA9IGNyeXB0b19hZWFkX3NldGF1dGhzaXplKHRmbSwgR01BQ19NSUNfTEVOKTsKKwlpZiAoIWVycikKKwkJcmV0dXJuIHRmbTsKIAogCWNyeXB0b19mcmVlX2FlYWQodGZtKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy1yeC5jIGIvbmV0L21hYzgwMjExL2FnZy1yeC5jCmluZGV4IGE0OGJhZDQuLjVjNTY0YTYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctcnguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXJ4LmMKQEAgLTQ5LDggKzQ5LDYgQEAKIAkJY29udGFpbmVyX29mKGgsIHN0cnVjdCB0aWRfYW1wZHVfcngsIHJjdV9oZWFkKTsKIAlpbnQgaTsKIAotCWRlbF90aW1lcl9zeW5jKCZ0aWRfcngtPnJlb3JkZXJfdGltZXIpOwotCiAJZm9yIChpID0gMDsgaSA8IHRpZF9yeC0+YnVmX3NpemU7IGkrKykKIAkJX19za2JfcXVldWVfcHVyZ2UoJnRpZF9yeC0+cmVvcmRlcl9idWZbaV0pOwogCWtmcmVlKHRpZF9yeC0+cmVvcmRlcl9idWYpOwpAQCAtOTMsNiArOTEsMTIgQEAKIAogCWRlbF90aW1lcl9zeW5jKCZ0aWRfcngtPnNlc3Npb25fdGltZXIpOwogCisJLyogbWFrZSBzdXJlIGllZWU4MDIxMV9zdGFfcmVvcmRlcl9yZWxlYXNlKCkgZG9lc24ndCByZS1hcm0gdGhlIHRpbWVyICovCisJc3Bpbl9sb2NrX2JoKCZ0aWRfcngtPnJlb3JkZXJfbG9jayk7CisJdGlkX3J4LT5yZW1vdmVkID0gdHJ1ZTsKKwlzcGluX3VubG9ja19iaCgmdGlkX3J4LT5yZW9yZGVyX2xvY2spOworCWRlbF90aW1lcl9zeW5jKCZ0aWRfcngtPnJlb3JkZXJfdGltZXIpOworCiAJY2FsbF9yY3UoJnRpZF9yeC0+cmN1X2hlYWQsIGllZWU4MDIxMV9mcmVlX3RpZF9yeCk7CiB9CiAKQEAgLTIzNCw2ICsyMzgsMTQgQEAKIAlpbnQgaSwgcmV0ID0gLUVPUE5PVFNVUFA7CiAJdTE2IHN0YXR1cyA9IFdMQU5fU1RBVFVTX1JFUVVFU1RfREVDTElORUQ7CiAKKwlpZiAoIXN0YS0+c3RhLmh0X2NhcC5odF9zdXBwb3J0ZWQpIHsKKwkJaHRfZGJnKHN0YS0+c2RhdGEsCisJCSAgICAgICAiU1RBICVwTSBlcnJvbmVvdXNseSByZXF1ZXN0cyBCQSBzZXNzaW9uIG9uIHRpZCAlZCB3L28gUW9TXG4iLAorCQkgICAgICAgc3RhLT5zdGEuYWRkciwgdGlkKTsKKwkJLyogc2VuZCBhIHJlc3BvbnNlIGFueXdheSwgaXQncyBhbiBlcnJvciBjYXNlIGlmIHdlIGdldCBoZXJlICovCisJCWdvdG8gZW5kX25vX2xvY2s7CisJfQorCiAJaWYgKHRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9CTE9DS19CQSkpIHsKIAkJaHRfZGJnKHN0YS0+c2RhdGEsCiAJCSAgICAgICAiU3VzcGVuZCBpbiBwcm9ncmVzcyAtIERlbnlpbmcgQUREQkEgcmVxdWVzdCAoJXBNIHRpZCAlZClcbiIsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvYWdnLXR4LmMgYi9uZXQvbWFjODAyMTEvYWdnLXR4LmMKaW5kZXggYTM2MGMxNS4uY2NlOWQ0MiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2FnZy10eC5jCisrKyBiL25ldC9tYWM4MDIxMS9hZ2ctdHguYwpAQCAtMTg4LDYgKzE4OCw0MyBAQAogCV9fcmVsZWFzZShhZ2dfcXVldWUpOwogfQogCitzdGF0aWMgdm9pZAoraWVlZTgwMjExX2FnZ19zdG9wX3R4cShzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgaW50IHRpZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqdHhxID0gc3RhLT5zdGEudHhxW3RpZF07CisJc3RydWN0IHR4cV9pbmZvICp0eHFpOworCisJaWYgKCF0eHEpCisJCXJldHVybjsKKworCXR4cWkgPSB0b190eHFfaW5mbyh0eHEpOworCisJLyogTG9jayBoZXJlIHRvIHByb3RlY3QgYWdhaW5zdCBmdXJ0aGVyIHNlcW5vIHVwZGF0ZXMgb24gZGVxdWV1ZSAqLworCXNwaW5fbG9ja19iaCgmdHhxaS0+cXVldWUubG9jayk7CisJc2V0X2JpdChJRUVFODAyMTFfVFhRX1NUT1AsICZ0eHFpLT5mbGFncyk7CisJc3Bpbl91bmxvY2tfYmgoJnR4cWktPnF1ZXVlLmxvY2spOworfQorCitzdGF0aWMgdm9pZAoraWVlZTgwMjExX2FnZ19zdGFydF90eHEoc3RydWN0IHN0YV9pbmZvICpzdGEsIGludCB0aWQsIGJvb2wgZW5hYmxlKQoreworCXN0cnVjdCBpZWVlODAyMTFfdHhxICp0eHEgPSBzdGEtPnN0YS50eHFbdGlkXTsKKwlzdHJ1Y3QgdHhxX2luZm8gKnR4cWk7CisKKwlpZiAoIXR4cSkKKwkJcmV0dXJuOworCisJdHhxaSA9IHRvX3R4cV9pbmZvKHR4cSk7CisKKwlpZiAoZW5hYmxlKQorCQlzZXRfYml0KElFRUU4MDIxMV9UWFFfQU1QRFUsICZ0eHFpLT5mbGFncyk7CisJZWxzZQorCQljbGVhcl9iaXQoSUVFRTgwMjExX1RYUV9BTVBEVSwgJnR4cWktPmZsYWdzKTsKKworCWNsZWFyX2JpdChJRUVFODAyMTFfVFhRX1NUT1AsICZ0eHFpLT5mbGFncyk7CisJZHJ2X3dha2VfdHhfcXVldWUoc3RhLT5zZGF0YS0+bG9jYWwsIHR4cWkpOworfQorCiAvKgogICogc3BsaWNlIHBhY2tldHMgZnJvbSB0aGUgU1RBJ3MgcGVuZGluZyB0byB0aGUgbG9jYWwgcGVuZGluZywKICAqIHJlcXVpcmVzIGEgY2FsbCB0byBpZWVlODAyMTFfYWdnX3NwbGljZV9maW5pc2ggbGF0ZXIKQEAgLTI0Nyw2ICsyODQsNyBAQAogCWllZWU4MDIxMV9hc3NpZ25fdGlkX3R4KHN0YSwgdGlkLCBOVUxMKTsKIAogCWllZWU4MDIxMV9hZ2dfc3BsaWNlX2ZpbmlzaChzdGEtPnNkYXRhLCB0aWQpOworCWllZWU4MDIxMV9hZ2dfc3RhcnRfdHhxKHN0YSwgdGlkLCBmYWxzZSk7CiAKIAlrZnJlZV9yY3UodGlkX3R4LCByY3VfaGVhZCk7CiB9CkBAIC00MTgsNiArNDU2LDggQEAKIAkgKi8KIAljbGVhcl9iaXQoSFRfQUdHX1NUQVRFX1dBTlRfU1RBUlQsICZ0aWRfdHgtPnN0YXRlKTsKIAorCWllZWU4MDIxMV9hZ2dfc3RvcF90eHEoc3RhLCB0aWQpOworCiAJLyoKIAkgKiBNYWtlIHN1cmUgbm8gcGFja2V0cyBhcmUgYmVpbmcgcHJvY2Vzc2VkLiBUaGlzIGVuc3VyZXMgdGhhdAogCSAqIHdlIGhhdmUgYSB2YWxpZCBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIgYW5kIHRoYXQgaW4tZmxpZ2h0CkBAIC00NDAsNiArNDgwLDggQEAKIAkJaWVlZTgwMjExX2FnZ19zcGxpY2VfZmluaXNoKHNkYXRhLCB0aWQpOwogCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKIAorCQlpZWVlODAyMTFfYWdnX3N0YXJ0X3R4cShzdGEsIHRpZCwgZmFsc2UpOworCiAJCWtmcmVlX3JjdSh0aWRfdHgsIHJjdV9oZWFkKTsKIAkJcmV0dXJuOwogCX0KQEAgLTUwOSwxMSArNTUxLDE0IEBACiAJc3RydWN0IHRpZF9hbXBkdV90eCAqdGlkX3R4OwogCWludCByZXQgPSAwOwogCisJdHJhY2VfYXBpX3N0YXJ0X3R4X2JhX3Nlc3Npb24ocHVic3RhLCB0aWQpOworCiAJaWYgKFdBUk4oc3RhLT5yZXNlcnZlZF90aWQgPT0gdGlkLAogCQkgIlJlcXVlc3RlZCB0byBzdGFydCBCQSBzZXNzaW9uIG9uIHJlc2VydmVkIHRpZD0lZCIsIHRpZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JdHJhY2VfYXBpX3N0YXJ0X3R4X2JhX3Nlc3Npb24ocHVic3RhLCB0aWQpOworCWlmICghcHVic3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChXQVJOX09OX09OQ0UoIWxvY2FsLT5vcHMtPmFtcGR1X2FjdGlvbikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNjY2LDYgKzcxMSw4IEBACiAJaWVlZTgwMjExX2FnZ19zcGxpY2VfZmluaXNoKHN0YS0+c2RhdGEsIHRpZCk7CiAKIAlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKKworCWllZWU4MDIxMV9hZ2dfc3RhcnRfdHhxKHN0YSwgdGlkLCB0cnVlKTsKIH0KIAogdm9pZCBpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2Ioc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTggKnJhLCB1MTYgdGlkKQpAQCAtNzkzLDYgKzg0MCw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJc3RydWN0IHRpZF9hbXBkdV90eCAqdGlkX3R4OworCWJvb2wgc2VuZF9kZWxiYSA9IGZhbHNlOwogCiAJdHJhY2VfYXBpX3N0b3BfdHhfYmFfY2Ioc2RhdGEsIHJhLCB0aWQpOwogCkBAIC04MjQsMTMgKzg3MiwxNyBAQAogCX0KIAogCWlmICh0aWRfdHgtPnN0b3BfaW5pdGlhdG9yID09IFdMQU5fQkFDS19JTklUSUFUT1IgJiYgdGlkX3R4LT50eF9zdG9wKQotCQlpZWVlODAyMTFfc2VuZF9kZWxiYShzdGEtPnNkYXRhLCByYSwgdGlkLAotCQkJV0xBTl9CQUNLX0lOSVRJQVRPUiwgV0xBTl9SRUFTT05fUVNUQV9OT1RfVVNFKTsKKwkJc2VuZF9kZWxiYSA9IHRydWU7CiAKIAlpZWVlODAyMTFfcmVtb3ZlX3RpZF90eChzdGEsIHRpZCk7CiAKICB1bmxvY2tfc3RhOgogCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCisJaWYgKHNlbmRfZGVsYmEpCisJCWllZWU4MDIxMV9zZW5kX2RlbGJhKHNkYXRhLCByYSwgdGlkLAorCQkJV0xBTl9CQUNLX0lOSVRJQVRPUiwgV0xBTl9SRUFTT05fUVNUQV9OT1RfVVNFKTsKKwogCW11dGV4X3VubG9jaygmc3RhLT5hbXBkdV9tbG1lLm10eCk7CiAgdW5sb2NrOgogCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2NmZy5jIGIvbmV0L21hYzgwMjExL2NmZy5jCmluZGV4IGRkNGZmMzYuLjI2NWU0MjcgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9jZmcuYworKysgYi9uZXQvbWFjODAyMTEvY2ZnLmMKQEAgLTI0LDYgKzI0LDcgQEAKIAogc3RhdGljIHN0cnVjdCB3aXJlbGVzc19kZXYgKmllZWU4MDIxMV9hZGRfaWZhY2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkJCWNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCQl1bnNpZ25lZCBjaGFyIG5hbWVfYXNzaWduX3R5cGUsCiAJCQkJCQllbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCiAJCQkJCQl1MzIgKmZsYWdzLAogCQkJCQkJc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKQEAgLTMzLDcgKzM0LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKIAlpbnQgZXJyOwogCi0JZXJyID0gaWVlZTgwMjExX2lmX2FkZChsb2NhbCwgbmFtZSwgJndkZXYsIHR5cGUsIHBhcmFtcyk7CisJZXJyID0gaWVlZTgwMjExX2lmX2FkZChsb2NhbCwgbmFtZSwgbmFtZV9hc3NpZ25fdHlwZSwgJndkZXYsIHR5cGUsIHBhcmFtcyk7CiAJaWYgKGVycikKIAkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIApAQCAtOTc3LDYgKzk3OCwxNCBAQAogCWlmIChtYXNrICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVNTT0NJQVRFRCkgJiYKIAkgICAgc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVNTT0NJQVRFRCkgJiYKIAkgICAgIXRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BU1NPQykpIHsKKwkJLyoKKwkJICogV2hlbiBwZWVyIGJlY29tZXMgYXNzb2NpYXRlZCwgaW5pdCByYXRlIGNvbnRyb2wgYXMKKwkJICogd2VsbC4gU29tZSBkcml2ZXJzIHJlcXVpcmUgcmF0ZSBjb250cm9sIGluaXRpYWxpemVkCisJCSAqIGJlZm9yZSBkcnZfc3RhX3N0YXRlKCkgaXMgY2FsbGVkLgorCQkgKi8KKwkJaWYgKHRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9URExTX1BFRVIpKQorCQkJcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEpOworCiAJCXJldCA9IHN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FTU09DKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CkBAIC0xMDUwLDYgKzEwNTksMTAgQEAKIAkJfQogCX0KIAorCWlmIChtYXNrICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSAmJgorCSAgICBsb2NhbC0+aHcucXVldWVzID49IElFRUU4MDIxMV9OVU1fQUNTKQorCQlzdGEtPnN0YS53bWUgPSBzZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19XTUUpOworCiAJLyogYXV0aCBmbGFncyB3aWxsIGJlIHNldCBsYXRlciBmb3IgVERMUyBzdGF0aW9ucyAqLwogCWlmICghdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUikpIHsKIAkJcmV0ID0gc3RhX2FwcGx5X2F1dGhfZmxhZ3MobG9jYWwsIHN0YSwgbWFzaywgc2V0KTsKQEAgLTEwNjQsMTAgKzEwNzcsOCBAQAogCQkJY2xlYXJfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9TSE9SVF9QUkVBTUJMRSk7CiAJfQogCi0JaWYgKG1hc2sgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19XTUUpKQotCQlzdGEtPnN0YS53bWUgPSBzZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19XTUUpOwotCiAJaWYgKG1hc2sgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19NRlApKSB7CisJCXN0YS0+c3RhLm1mcCA9ICEhKHNldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX01GUCkpOwogCQlpZiAoc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfTUZQKSkKIAkJCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX01GUCk7CiAJCWVsc2UKQEAgLTEzNzcsMTEgKzEzODgsNiBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2VycjsKIAotCS8qIFdoZW4gcGVlciBiZWNvbWVzIGF1dGhvcml6ZWQsIGluaXQgcmF0ZSBjb250cm9sIGFzIHdlbGwgKi8KLQlpZiAodGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUikgJiYKLQkgICAgdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEhPUklaRUQpKQotCQlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7Ci0KIAltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKIAogCWlmICgoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQIHx8CkBAIC0xNDg4LDcgKzE0OTQsNyBAQAogCWlmIChuZXh0X2hvcF9zdGEpCiAJCW1lbWNweShuZXh0X2hvcCwgbmV4dF9ob3Bfc3RhLT5zdGEuYWRkciwgRVRIX0FMRU4pOwogCWVsc2UKLQkJbWVtc2V0KG5leHRfaG9wLCAwLCBFVEhfQUxFTik7CisJCWV0aF96ZXJvX2FkZHIobmV4dF9ob3ApOwogCiAJbWVtc2V0KHBpbmZvLCAwLCBzaXplb2YoKnBpbmZvKSk7CiAKQEAgLTIyNzMsNyArMjI3OSw2IEBACiB7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJZW51bSBpZWVlODAyMTFfc21wc19tb2RlIG9sZF9yZXE7Ci0JaW50IGk7CiAKIAlpZiAoV0FSTl9PTl9PTkNFKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI5Nyw1MiArMjMwMiw0NCBAQAogCX0KIAogCWh0X2RiZyhzZGF0YSwKLQkgICAgICAgIlNNU1AgJWQgcmVxdWVzdGVkIGluIEFQIG1vZGUsIHNlbmRpbmcgQWN0aW9uIGZyYW1lIHRvICVkIHN0YXRpb25zXG4iLAorCSAgICAgICAiU01QUyAlZCByZXF1ZXN0ZWQgaW4gQVAgbW9kZSwgc2VuZGluZyBBY3Rpb24gZnJhbWUgdG8gJWQgc3RhdGlvbnNcbiIsCiAJICAgICAgIHNtcHNfbW9kZSwgYXRvbWljX3JlYWQoJnNkYXRhLT51LmFwLm51bV9tY2FzdF9zdGEpKTsKIAogCW11dGV4X2xvY2soJnNkYXRhLT5sb2NhbC0+c3RhX210eCk7Ci0JZm9yIChpID0gMDsgaSA8IFNUQV9IQVNIX1NJWkU7IGkrKykgewotCQlmb3IgKHN0YSA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2RhdGEtPmxvY2FsLT5zdGFfaGFzaFtpXSwKLQkJCQlsb2NrZGVwX2lzX2hlbGQoJnNkYXRhLT5sb2NhbC0+c3RhX210eCkpOwotCQkgICAgIHN0YTsKLQkJICAgICBzdGEgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHN0YS0+aG5leHQsCi0JCQkJbG9ja2RlcF9pc19oZWxkKCZzZGF0YS0+bG9jYWwtPnN0YV9tdHgpKSkgewotCQkJLyoKLQkJCSAqIE9ubHkgc3RhdGlvbnMgYXNzb2NpYXRlZCB0byBvdXIgQVAgYW5kCi0JCQkgKiBhc3NvY2lhdGVkIFZMQU5zCi0JCQkgKi8KLQkJCWlmIChzdGEtPnNkYXRhLT5ic3MgIT0gJnNkYXRhLT51LmFwKQotCQkJCWNvbnRpbnVlOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3RhLCAmc2RhdGEtPmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgeworCQkvKgorCQkgKiBPbmx5IHN0YXRpb25zIGFzc29jaWF0ZWQgdG8gb3VyIEFQIGFuZAorCQkgKiBhc3NvY2lhdGVkIFZMQU5zCisJCSAqLworCQlpZiAoc3RhLT5zZGF0YS0+YnNzICE9ICZzZGF0YS0+dS5hcCkKKwkJCWNvbnRpbnVlOwogCi0JCQkvKiBUaGlzIHN0YXRpb24gZG9lc24ndCBzdXBwb3J0IE1JTU8gLSBza2lwIGl0ICovCi0JCQlpZiAoc3RhX2luZm9fdHhfc3RyZWFtcyhzdGEpID09IDEpCi0JCQkJY29udGludWU7CisJCS8qIFRoaXMgc3RhdGlvbiBkb2Vzbid0IHN1cHBvcnQgTUlNTyAtIHNraXAgaXQgKi8KKwkJaWYgKHN0YV9pbmZvX3R4X3N0cmVhbXMoc3RhKSA9PSAxKQorCQkJY29udGludWU7CiAKLQkJCS8qCi0JCQkgKiBEb24ndCB3YWtlIHVwIGEgU1RBIGp1c3QgdG8gc2VuZCB0aGUgYWN0aW9uIGZyYW1lCi0JCQkgKiB1bmxlc3Mgd2UgYXJlIGdldHRpbmcgbW9yZSByZXN0cmljdGl2ZS4KLQkJCSAqLwotCQkJaWYgKHRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9QU19TVEEpICYmCi0JCQkgICAgIWllZWU4MDIxMV9zbXBzX2lzX3Jlc3RyaWN0aXZlKHN0YS0+a25vd25fc21wc19tb2RlLAotCQkJCQkJCSAgIHNtcHNfbW9kZSkpIHsKLQkJCQlodF9kYmcoc2RhdGEsCi0JCQkJICAgICAgICJXb24ndCBzZW5kIFNNUFMgdG8gc2xlZXBpbmcgU1RBICVwTVxuIiwKLQkJCQkgICAgICAgc3RhLT5zdGEuYWRkcik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBJZiB0aGUgU1RBIGlzIG5vdCBhdXRob3JpemVkLCB3YWl0IHVudGlsIGl0IGdldHMKLQkJCSAqIGF1dGhvcml6ZWQgYW5kIHRoZSBhY3Rpb24gZnJhbWUgd2lsbCBiZSBzZW50IHRoZW4uCi0JCQkgKi8KLQkJCWlmICghdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEhPUklaRUQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlodF9kYmcoc2RhdGEsICJTZW5kaW5nIFNNUFMgdG8gJXBNXG4iLCBzdGEtPnN0YS5hZGRyKTsKLQkJCWllZWU4MDIxMV9zZW5kX3NtcHNfYWN0aW9uKHNkYXRhLCBzbXBzX21vZGUsCi0JCQkJCQkgICBzdGEtPnN0YS5hZGRyLAotCQkJCQkJICAgc2RhdGEtPnZpZi5ic3NfY29uZi5ic3NpZCk7CisJCS8qCisJCSAqIERvbid0IHdha2UgdXAgYSBTVEEganVzdCB0byBzZW5kIHRoZSBhY3Rpb24gZnJhbWUKKwkJICogdW5sZXNzIHdlIGFyZSBnZXR0aW5nIG1vcmUgcmVzdHJpY3RpdmUuCisJCSAqLworCQlpZiAodGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1BTX1NUQSkgJiYKKwkJICAgICFpZWVlODAyMTFfc21wc19pc19yZXN0cmljdGl2ZShzdGEtPmtub3duX3NtcHNfbW9kZSwKKwkJCQkJCSAgIHNtcHNfbW9kZSkpIHsKKwkJCWh0X2RiZyhzZGF0YSwgIldvbid0IHNlbmQgU01QUyB0byBzbGVlcGluZyBTVEEgJXBNXG4iLAorCQkJICAgICAgIHN0YS0+c3RhLmFkZHIpOworCQkJY29udGludWU7CiAJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgU1RBIGlzIG5vdCBhdXRob3JpemVkLCB3YWl0IHVudGlsIGl0IGdldHMKKwkJICogYXV0aG9yaXplZCBhbmQgdGhlIGFjdGlvbiBmcmFtZSB3aWxsIGJlIHNlbnQgdGhlbi4KKwkJICovCisJCWlmICghdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEhPUklaRUQpKQorCQkJY29udGludWU7CisKKwkJaHRfZGJnKHNkYXRhLCAiU2VuZGluZyBTTVBTIHRvICVwTVxuIiwgc3RhLT5zdGEuYWRkcik7CisJCWllZWU4MDIxMV9zZW5kX3NtcHNfYWN0aW9uKHNkYXRhLCBzbXBzX21vZGUsIHN0YS0+c3RhLmFkZHIsCisJCQkJCSAgIHNkYXRhLT52aWYuYnNzX2NvbmYuYnNzaWQpOwogCX0KIAltdXRleF91bmxvY2soJnNkYXRhLT5sb2NhbC0+c3RhX210eCk7CiAKQEAgLTM1ODEsNyArMzU3OCw3IEBACiAJCW51bGxmdW5jLT5xb3NfY3RybCA9IGNwdV90b19sZTE2KDcpOwogCiAJbG9jYWxfYmhfZGlzYWJsZSgpOwotCWllZWU4MDIxMV94bWl0KHNkYXRhLCBza2IpOworCWllZWU4MDIxMV94bWl0KHNkYXRhLCBzdGEsIHNrYik7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMgYi9uZXQvbWFjODAyMTEvZGVidWdmcy5jCmluZGV4IGVlYjBiYmQuLjIzODEzZWIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnMuYwpAQCAtMTgsMTcyICsxOCw2IEBACiAKICNkZWZpbmUgREVCVUdGU19GT1JNQVRfQlVGRkVSX1NJWkUgMTAwCiAKLSNkZWZpbmUgVFhfTEFURU5DWV9CSU5fREVMSU1URVJfQyAnLCcKLSNkZWZpbmUgVFhfTEFURU5DWV9CSU5fREVMSU1URVJfUyAiLCIKLSNkZWZpbmUgVFhfTEFURU5DWV9CSU5TX0RJU0FCTEVEICJlbmFibGUoYmlucyBkaXNhYmxlZClcbiIKLSNkZWZpbmUgVFhfTEFURU5DWV9ESVNBQkxFRCAiZGlzYWJsZVxuIgotCi0KLS8qCi0gKiBEaXNwbGF5IGlmIFR4IGxhdGVuY3kgc3RhdGlzdGljcyAmIGJpbnMgYXJlIGVuYWJsZWQvZGlzYWJsZWQKLSAqLwotc3RhdGljIHNzaXplX3Qgc3RhX3R4X2xhdGVuY3lfc3RhdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljaGFyIF9fdXNlciAqdXNlcmJ1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9sYXRlbmN5X2Jpbl9yYW5nZXMgICp0eF9sYXRlbmN5OwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3osIGksIHJldDsKLQlpbnQgcG9zID0gMDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCXR4X2xhdGVuY3kgPSByY3VfZGVyZWZlcmVuY2UobG9jYWwtPnR4X2xhdGVuY3kpOwotCi0JaWYgKHR4X2xhdGVuY3kgJiYgdHhfbGF0ZW5jeS0+bl9yYW5nZXMpIHsKLQkJYnVmc3ogPSB0eF9sYXRlbmN5LT5uX3JhbmdlcyAqIDE1OwotCQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFidWYpCi0JCQlnb3RvIGVycjsKLQotCQlmb3IgKGkgPSAwOyBpIDwgdHhfbGF0ZW5jeS0+bl9yYW5nZXM7IGkrKykKLQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVkLCIsCi0JCQkJCSB0eF9sYXRlbmN5LT5yYW5nZXNbaV0pOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwotCX0gZWxzZSBpZiAodHhfbGF0ZW5jeSkgewotCQlidWZzeiA9IHNpemVvZihUWF9MQVRFTkNZX0JJTlNfRElTQUJMRUQpICsgMTsKLQkJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0FUT01JQyk7Ci0JCWlmICghYnVmKQotCQkJZ290byBlcnI7Ci0KLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXNcbiIsCi0JCQkJIFRYX0xBVEVOQ1lfQklOU19ESVNBQkxFRCk7Ci0JfSBlbHNlIHsKLQkJYnVmc3ogPSBzaXplb2YoVFhfTEFURU5DWV9ESVNBQkxFRCkgKyAxOwotCQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFidWYpCi0JCQlnb3RvIGVycjsKLQotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlc1xuIiwKLQkJCQkgVFhfTEFURU5DWV9ESVNBQkxFRCk7Ci0JfQotCi0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0KLQlyZXR1cm4gcmV0OwotZXJyOgotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiAtRU5PTUVNOwotfQotCi0vKgotICogUmVjZWl2ZSBpbnB1dCBmcm9tIHVzZXIgcmVnYXJkaW5nIFR4IGxhdGVuY3kgc3RhdGlzdGljcwotICogVGhlIGlucHV0IHNob3VsZCBpbmRpY2F0ZSBpZiBUeCBsYXRlbmN5IHN0YXRpc3RpY3MgYW5kIGJpbnMgYXJlCi0gKiBlbmFibGVkL2Rpc2FibGVkLgotICogSWYgYmlucyBhcmUgZW5hYmxlZCBpbnB1dCBzaG91bGQgaW5kaWNhdGUgdGhlIGFtb3VudCBvZiBkaWZmZXJlbnQgYmlucyBhbmQKLSAqIHRoZWlyIHJhbmdlcy4gRWFjaCBiaW4gd2lsbCBjb3VudCBob3cgbWFueSBUeCBmcmFtZXMgdHJhbnNtaXR0ZWQgd2l0aGluIHRoZQotICogYXBwcm9wcmlhdGUgbGF0ZW5jeS4KLSAqIExlZ2FsIGlucHV0IGlzOgotICogYSkgImVuYWJsZShiaW5zIGRpc2FibGVkKSIgLSB0byBlbmFibGUgb25seSBnZW5lcmFsIHN0YXRpc3RpY3MKLSAqIGIpICJhLGIsYyxkLC4uLnoiIC0gdG8gZW5hYmxlIGdlbmVyYWwgc3RhdGlzdGljcyBhbmQgYmlucywgd2hlcmUgYWxsIGFyZQotICogbnVtYmVycyBhbmQgYSA8IGIgPCBjIDwgZC4uIDwgegotICogYykgImRpc2FibGUiIC0gZGlzYWJsZSBhbGwgc3RhdGlzdGljcwotICogTk9URTogbXVzdCBjb25maWd1cmUgVHggbGF0ZW5jeSBzdGF0aXN0aWNzIGJpbnMgYmVmb3JlIHN0YXRpb25zIGNvbm5lY3RlZC4KLSAqLwotCi1zdGF0aWMgc3NpemVfdCBzdGFfdHhfbGF0ZW5jeV9zdGF0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1ZlsxMjhdID0ge307Ci0JY2hhciAqYmlucyA9IGJ1ZjsKLQljaGFyICp0b2tlbjsKLQlpbnQgYnVmX3NpemUsIGksIGFsbG9jX3NpemU7Ci0JaW50IHByZXZfYmluID0gMDsKLQlpbnQgbl9yYW5nZXMgPSAwOwotCWludCByZXQgPSBjb3VudDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2xhdGVuY3lfYmluX3JhbmdlcyAgKnR4X2xhdGVuY3k7Ci0KLQlpZiAoc2l6ZW9mKGJ1ZikgPD0gY291bnQpCi0JCXJldHVybiAtRUlOVkFMOwotCWJ1Zl9zaXplID0gY291bnQ7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcmJ1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCW11dGV4X2xvY2soJmxvY2FsLT5zdGFfbXR4KTsKLQotCS8qIGNhbm5vdCBjaGFuZ2UgY29uZmlnIG9uY2Ugd2UgaGF2ZSBzdGF0aW9ucyAqLwotCWlmIChsb2NhbC0+bnVtX3N0YSkKLQkJZ290byB1bmxvY2s7Ci0KLQl0eF9sYXRlbmN5ID0KLQkJcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChsb2NhbC0+dHhfbGF0ZW5jeSwKLQkJCQkJICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7Ci0KLQkvKiBkaXNhYmxlIFR4IHN0YXRpc3RpY3MgKi8KLQlpZiAoIXN0cmNtcChidWYsIFRYX0xBVEVOQ1lfRElTQUJMRUQpKSB7Ci0JCWlmICghdHhfbGF0ZW5jeSkKLQkJCWdvdG8gdW5sb2NrOwotCQlSQ1VfSU5JVF9QT0lOVEVSKGxvY2FsLT50eF9sYXRlbmN5LCBOVUxMKTsKLQkJc3luY2hyb25pemVfcmN1KCk7Ci0JCWtmcmVlKHR4X2xhdGVuY3kpOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQkvKiBUeCBsYXRlbmN5IGFscmVhZHkgZW5hYmxlZCAqLwotCWlmICh0eF9sYXRlbmN5KQotCQlnb3RvIHVubG9jazsKLQotCWlmIChzdHJjbXAoVFhfTEFURU5DWV9CSU5TX0RJU0FCTEVELCBidWYpKSB7Ci0JCS8qIGNoZWNrIGhvdyBtYW55IGJpbnMgYW5kIGJldHdlZW4gd2hhdCByYW5nZXMgdXNlciByZXF1ZXN0ZWQgKi8KLQkJdG9rZW4gPSBidWY7Ci0JCXdoaWxlICgqdG9rZW4gIT0gJ1wwJykgewotCQkJaWYgKCp0b2tlbiA9PSBUWF9MQVRFTkNZX0JJTl9ERUxJTVRFUl9DKQotCQkJCW5fcmFuZ2VzKys7Ci0JCQl0b2tlbisrOwotCQl9Ci0JCW5fcmFuZ2VzKys7Ci0JfQotCi0JYWxsb2Nfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3R4X2xhdGVuY3lfYmluX3JhbmdlcykgKwotCQkgICAgIG5fcmFuZ2VzICogc2l6ZW9mKHUzMik7Ci0JdHhfbGF0ZW5jeSA9IGt6YWxsb2MoYWxsb2Nfc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCF0eF9sYXRlbmN5KSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQl0eF9sYXRlbmN5LT5uX3JhbmdlcyA9IG5fcmFuZ2VzOwotCWZvciAoaSA9IDA7IGkgPCBuX3JhbmdlczsgaSsrKSB7IC8qIHNldHRpbmcgYmluIHJhbmdlcyAqLwotCQl0b2tlbiA9IHN0cnNlcCgmYmlucywgVFhfTEFURU5DWV9CSU5fREVMSU1URVJfUyk7Ci0JCXNzY2FuZih0b2tlbiwgIiVkIiwgJnR4X2xhdGVuY3ktPnJhbmdlc1tpXSk7Ci0JCS8qIGJpbnMgdmFsdWVzIHNob3VsZCBiZSBpbiBhc2NlbmRpbmcgb3JkZXIgKi8KLQkJaWYgKHByZXZfYmluID49IHR4X2xhdGVuY3ktPnJhbmdlc1tpXSkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWtmcmVlKHR4X2xhdGVuY3kpOwotCQkJZ290byB1bmxvY2s7Ci0JCX0KLQkJcHJldl9iaW4gPSB0eF9sYXRlbmN5LT5yYW5nZXNbaV07Ci0JfQotCXJjdV9hc3NpZ25fcG9pbnRlcihsb2NhbC0+dHhfbGF0ZW5jeSwgdHhfbGF0ZW5jeSk7Ci0KLXVubG9jazoKLQltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN0YXRzX3R4X2xhdGVuY3lfb3BzID0gewotCS53cml0ZSA9IHN0YV90eF9sYXRlbmN5X3N0YXRfd3JpdGUsCi0JLnJlYWQgPSBzdGFfdHhfbGF0ZW5jeV9zdGF0X3JlYWQsCi0JLm9wZW4gPSBzaW1wbGVfb3BlbiwKLQkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywKLX07Ci0KIGludCBtYWM4MDIxMV9mb3JtYXRfYnVmZmVyKGNoYXIgX191c2VyICp1c2VyYnVmLCBzaXplX3QgY291bnQsCiAJCQkJICBsb2ZmX3QgKnBwb3MsIGNoYXIgKmZtdCwgLi4uKQogewpAQCAtNDQwLDggKzI3NCw2IEBACiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHX0NPVU5URVJTCiAJREVCVUdGU19TVEFUU19BREQodHhfaGFuZGxlcnNfZHJvcCwgbG9jYWwtPnR4X2hhbmRsZXJzX2Ryb3ApOwogCURFQlVHRlNfU1RBVFNfQUREKHR4X2hhbmRsZXJzX3F1ZXVlZCwgbG9jYWwtPnR4X2hhbmRsZXJzX3F1ZXVlZCk7Ci0JREVCVUdGU19TVEFUU19BREQodHhfaGFuZGxlcnNfZHJvcF91bmVuY3J5cHRlZCwKLQkJbG9jYWwtPnR4X2hhbmRsZXJzX2Ryb3BfdW5lbmNyeXB0ZWQpOwogCURFQlVHRlNfU1RBVFNfQUREKHR4X2hhbmRsZXJzX2Ryb3BfZnJhZ21lbnQsCiAJCWxvY2FsLT50eF9oYW5kbGVyc19kcm9wX2ZyYWdtZW50KTsKIAlERUJVR0ZTX1NUQVRTX0FERCh0eF9oYW5kbGVyc19kcm9wX3dlcCwKQEAgLTQ3NSw2ICszMDcsNCBAQAogCURFQlVHRlNfREVWU1RBVFNfQUREKGRvdDExUlRTRmFpbHVyZUNvdW50KTsKIAlERUJVR0ZTX0RFVlNUQVRTX0FERChkb3QxMUZDU0Vycm9yQ291bnQpOwogCURFQlVHRlNfREVWU1RBVFNfQUREKGRvdDExUlRTU3VjY2Vzc0NvdW50KTsKLQotCURFQlVHRlNfREVWU1RBVFNfQUREKHR4X2xhdGVuY3kpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMgYi9uZXQvbWFjODAyMTEvZGVidWdmc19uZXRkZXYuYwppbmRleCBjNjg4OTZhLi4yOTIzNmU4IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvZGVidWdmc19uZXRkZXYuYworKysgYi9uZXQvbWFjODAyMTEvZGVidWdmc19uZXRkZXYuYwpAQCAtMTc3LDcgKzE3Nyw2IEBACiAJSUVFRTgwMjExX0lGX0ZJTEVfUihuYW1lKQogCiAvKiBjb21tb24gYXR0cmlidXRlcyAqLwotSUVFRTgwMjExX0lGX0ZJTEUoZHJvcF91bmVuY3J5cHRlZCwgZHJvcF91bmVuY3J5cHRlZCwgREVDKTsKIElFRUU4MDIxMV9JRl9GSUxFKHJjX3JhdGVpZHhfbWFza18yZ2h6LCByY19yYXRlaWR4X21hc2tbSUVFRTgwMjExX0JBTkRfMkdIWl0sCiAJCSAgSEVYKTsKIElFRUU4MDIxMV9JRl9GSUxFKHJjX3JhdGVpZHhfbWFza181Z2h6LCByY19yYXRlaWR4X21hc2tbSUVFRTgwMjExX0JBTkRfNUdIWl0sCkBAIC01NjIsNyArNTYxLDYgQEAKIAogc3RhdGljIHZvaWQgYWRkX2NvbW1vbl9maWxlcyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQlERUJVR0ZTX0FERChkcm9wX3VuZW5jcnlwdGVkKTsKIAlERUJVR0ZTX0FERChyY19yYXRlaWR4X21hc2tfMmdoeik7CiAJREVCVUdGU19BREQocmNfcmF0ZWlkeF9tYXNrXzVnaHopOwogCURFQlVHRlNfQUREKHJjX3JhdGVpZHhfbWNzX21hc2tfMmdoeik7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZGVidWdmc19zdGEuYyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCmluZGV4IDk0YzcwMDkuLjI1Mjg1OWUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCisrKyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jCkBAIC0zOSwxMyArMzksNiBAQAogCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkJCQkJXAogfQogCi0jZGVmaW5lIFNUQV9PUFNfVyhuYW1lKQkJCQkJCQlcCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdGFfICMjbmFtZSMjIF9vcHMgPSB7CQlcCi0JLndyaXRlID0gc3RhXyMjbmFtZSMjX3dyaXRlLAkJCQkJXAotCS5vcGVuID0gc2ltcGxlX29wZW4sCQkJCQkJXAotCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkJCQkJXAotfQotCiAjZGVmaW5lIFNUQV9PUFNfUlcobmFtZSkJCQkJCQlcCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzdGFfICMjbmFtZSMjIF9vcHMgPSB7CQlcCiAJLnJlYWQgPSBzdGFfIyNuYW1lIyNfcmVhZCwJCQkJCVwKQEAgLTM5OCwxMzEgKzM5MSw2IEBACiB9CiBTVEFfT1BTKGxhc3RfcnhfcmF0ZSk7CiAKLXN0YXRpYyBpbnQKLXN0YV90eF9sYXRlbmN5X3N0YXRfaGVhZGVyKHN0cnVjdCBpZWVlODAyMTFfdHhfbGF0ZW5jeV9iaW5fcmFuZ2VzICp0eF9sYXRlbmN5LAotCQkJICAgY2hhciAqYnVmLCBpbnQgcG9zLCBpbnQgYnVmc3opCi17Ci0JaW50IGk7Ci0JaW50IHJhbmdlX2NvdW50ID0gdHhfbGF0ZW5jeS0+bl9yYW5nZXM7Ci0JdTMyICpiaW5fcmFuZ2VzID0gdHhfbGF0ZW5jeS0+cmFuZ2VzOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICAiU3RhdGlvblx0XHRcdFRJRFx0TWF4XHRBdmciKTsKLQlpZiAocmFuZ2VfY291bnQpIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSAgIlx0PD0lZCIsIGJpbl9yYW5nZXNbMF0pOwotCQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2VfY291bnQgLSAxOyBpKyspCi0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdCVkLSVkIiwKLQkJCQkJICBiaW5fcmFuZ2VzW2ldLCBiaW5fcmFuZ2VzW2krMV0pOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJICAiXHQlZDwiLCBiaW5fcmFuZ2VzW3JhbmdlX2NvdW50IC0gMV0pOwotCX0KLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0KLQlyZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgaW50Ci1zdGFfdHhfbGF0ZW5jeV9zdGF0X3RhYmxlKHN0cnVjdCBpZWVlODAyMTFfdHhfbGF0ZW5jeV9iaW5fcmFuZ2VzICp0eF9sYXRfcmFuZ2UsCi0JCQkgIHN0cnVjdCBpZWVlODAyMTFfdHhfbGF0ZW5jeV9zdGF0ICp0eF9sYXQsCi0JCQkgIGNoYXIgKmJ1ZiwgaW50IHBvcywgaW50IGJ1ZnN6LCBpbnQgdGlkKQotewotCXUzMiBhdmcgPSAwOwotCWludCBqOwotCWludCBiaW5fY291bnQgPSB0eF9sYXQtPmJpbl9jb3VudDsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0XHRcdCVkIiwgdGlkKTsKLQkvKiBtYWtlIHN1cmUgeW91IGRvbid0IGRpdmlkZSBpbiAwICovCi0JaWYgKHR4X2xhdC0+Y291bnRlcikKLQkJYXZnID0gdHhfbGF0LT5zdW0gLyB0eF9sYXQtPmNvdW50ZXI7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdCVkXHQlZCIsCi0JCQkgIHR4X2xhdC0+bWF4LCBhdmcpOwotCi0JaWYgKHR4X2xhdF9yYW5nZS0+bl9yYW5nZXMgJiYgdHhfbGF0LT5iaW5zKQotCQlmb3IgKGogPSAwOyBqIDwgYmluX2NvdW50OyBqKyspCi0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJCSAgIlx0JWQiLCB0eF9sYXQtPmJpbnNbal0pOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0KLQlyZXR1cm4gcG9zOwotfQotCi0vKgotICogT3V0cHV0IFR4IGxhdGVuY3kgc3RhdGlzdGljcyBzdGF0aW9uICYmIHJlc3RhcnQgYWxsIHN0YXRpc3RpY3MgaW5mb3JtYXRpb24KLSAqLwotc3RhdGljIHNzaXplX3Qgc3RhX3R4X2xhdGVuY3lfc3RhdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljaGFyIF9fdXNlciAqdXNlcmJ1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzdGEtPmxvY2FsOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfbGF0ZW5jeV9iaW5fcmFuZ2VzICp0eF9sYXRlbmN5OwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3osIHJldCwgaTsKLQlpbnQgcG9zID0gMDsKLQotCWJ1ZnN6ID0gMjAgKiBJRUVFODAyMTFfTlVNX1RJRFMgKgotCQlzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eF9sYXRlbmN5X3N0YXQpOwotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQotCXR4X2xhdGVuY3kgPSByY3VfZGVyZWZlcmVuY2UobG9jYWwtPnR4X2xhdGVuY3kpOwotCi0JaWYgKCFzdGEtPnR4X2xhdCkgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJICJUeCBsYXRlbmN5IHN0YXRpc3RpY3MgYXJlIG5vdCBlbmFibGVkXG4iKTsKLQkJZ290byB1bmxvY2s7Ci0JfQotCi0JcG9zID0gc3RhX3R4X2xhdGVuY3lfc3RhdF9oZWFkZXIodHhfbGF0ZW5jeSwgYnVmLCBwb3MsIGJ1ZnN6KTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVwTVxuIiwgc3RhLT5zdGEuYWRkcik7Ci0JZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9OVU1fVElEUzsgaSsrKQotCQlwb3MgPSBzdGFfdHhfbGF0ZW5jeV9zdGF0X3RhYmxlKHR4X2xhdGVuY3ksICZzdGEtPnR4X2xhdFtpXSwKLQkJCQkJCWJ1ZiwgcG9zLCBidWZzeiwgaSk7Ci11bmxvY2s6Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0KLQlyZXR1cm4gcmV0OwotfQotU1RBX09QUyh0eF9sYXRlbmN5X3N0YXQpOwotCi1zdGF0aWMgc3NpemVfdCBzdGFfdHhfbGF0ZW5jeV9zdGF0X3Jlc2V0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsCi0JCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQl1MzIgKmJpbnM7Ci0JaW50IGJpbl9jb3VudDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgaTsKLQotCWlmICghc3RhLT50eF9sYXQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9OVU1fVElEUzsgaSsrKSB7Ci0JCWJpbnMgPSBzdGEtPnR4X2xhdFtpXS5iaW5zOwotCQliaW5fY291bnQgPSBzdGEtPnR4X2xhdFtpXS5iaW5fY291bnQ7Ci0KLQkJc3RhLT50eF9sYXRbaV0ubWF4ID0gMDsKLQkJc3RhLT50eF9sYXRbaV0uc3VtID0gMDsKLQkJc3RhLT50eF9sYXRbaV0uY291bnRlciA9IDA7Ci0KLQkJaWYgKGJpbl9jb3VudCkKLQkJCW1lbXNldChiaW5zLCAwLCBiaW5fY291bnQgKiBzaXplb2YodTMyKSk7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotU1RBX09QU19XKHR4X2xhdGVuY3lfc3RhdF9yZXNldCk7Ci0KICNkZWZpbmUgREVCVUdGU19BREQobmFtZSkgXAogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoI25hbWUsIDA0MDAsIFwKIAkJc3RhLT5kZWJ1Z2ZzLmRpciwgc3RhLCAmc3RhXyAjI25hbWUjIyBfb3BzKTsKQEAgLTU3Niw4ICs0NDQsNiBAQAogCURFQlVHRlNfQUREKGxhc3RfYWNrX3NpZ25hbCk7CiAJREVCVUdGU19BREQoY3VycmVudF90eF9yYXRlKTsKIAlERUJVR0ZTX0FERChsYXN0X3J4X3JhdGUpOwotCURFQlVHRlNfQUREKHR4X2xhdGVuY3lfc3RhdCk7Ci0JREVCVUdGU19BREQodHhfbGF0ZW5jeV9zdGF0X3Jlc2V0KTsKIAogCURFQlVHRlNfQUREX0NPVU5URVIocnhfcGFja2V0cywgcnhfcGFja2V0cyk7CiAJREVCVUdGU19BRERfQ09VTlRFUih0eF9wYWNrZXRzLCB0eF9wYWNrZXRzKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmggYi9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oCmluZGV4IGZkZWRhMTcuLjI2ZTFjYTggMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmgKKysrIGIvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaApAQCAtOTQxLDEzICs5NDEsMTMgQEAKIAl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZHJ2X3Jzc2lfY2FsbGJhY2soc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkgICAgIGNvbnN0IGVudW0gaWVlZTgwMjExX3Jzc2lfZXZlbnQgZXZlbnQpCitzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X2V2ZW50X2NhbGxiYWNrKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfZXZlbnQgKmV2ZW50KQogewotCXRyYWNlX2Rydl9yc3NpX2NhbGxiYWNrKGxvY2FsLCBzZGF0YSwgZXZlbnQpOwotCWlmIChsb2NhbC0+b3BzLT5yc3NpX2NhbGxiYWNrKQotCQlsb2NhbC0+b3BzLT5yc3NpX2NhbGxiYWNrKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCBldmVudCk7CisJdHJhY2VfZHJ2X2V2ZW50X2NhbGxiYWNrKGxvY2FsLCBzZGF0YSwgZXZlbnQpOworCWlmIChsb2NhbC0+b3BzLT5ldmVudF9jYWxsYmFjaykKKwkJbG9jYWwtPm9wcy0+ZXZlbnRfY2FsbGJhY2soJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIGV2ZW50KTsKIAl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOwogfQogCkBAIC0xMzY3LDQgKzEzNjcsMTYgQEAKIAl0cmFjZV9kcnZfcmV0dXJuX3ZvaWQobG9jYWwpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X3dha2VfdHhfcXVldWUoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJICAgICBzdHJ1Y3QgdHhxX2luZm8gKnR4cSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHZpZl90b19zZGF0YSh0eHEtPnR4cS52aWYpOworCisJaWYgKCFjaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpKQorCQlyZXR1cm47CisKKwl0cmFjZV9kcnZfd2FrZV90eF9xdWV1ZShsb2NhbCwgc2RhdGEsIHR4cSk7CisJbG9jYWwtPm9wcy0+d2FrZV90eF9xdWV1ZSgmbG9jYWwtPmh3LCAmdHhxLT50eHEpOworfQorCiAjZW5kaWYgLyogX19NQUM4MDIxMV9EUklWRVJfT1BTICovCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaHQuYyBiL25ldC9tYWM4MDIxMS9odC5jCmluZGV4IGZmNjMwYmUuLjdhNzZjZTYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9odC5jCisrKyBiL25ldC9tYWM4MDIxMS9odC5jCkBAIC0yNTIsOCArMjUyLDYgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKGJ3ICE9IHN0YS0+c3RhLmJhbmR3aWR0aCkKLQkJY2hhbmdlZCA9IHRydWU7CiAJc3RhLT5zdGEuYmFuZHdpZHRoID0gYnc7CiAKIAlzdGEtPmN1cl9tYXhfYmFuZHdpZHRoID0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pYnNzLmMgYi9uZXQvbWFjODAyMTEvaWJzcy5jCmluZGV4IGI2MDZiNTMuLmJmZWYxYjIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pYnNzLmMKKysrIGIvbmV0L21hYzgwMjExL2lic3MuYwpAQCAtMTg4LDYgKzE4OCwxNiBAQAogCQkgKi8KIAkJcG9zID0gaWVlZTgwMjExX2llX2J1aWxkX2h0X29wZXIocG9zLCAmc2JhbmQtPmh0X2NhcCwKIAkJCQkJCSBjaGFuZGVmLCAwKTsKKworCQkvKiBhZGQgVkhUIGNhcGFiaWxpdHkgYW5kIGluZm9ybWF0aW9uIElFcyAqLworCQlpZiAoY2hhbmRlZi0+d2lkdGggIT0gTkw4MDIxMV9DSEFOX1dJRFRIXzIwICYmCisJCSAgICBjaGFuZGVmLT53aWR0aCAhPSBOTDgwMjExX0NIQU5fV0lEVEhfNDAgJiYKKwkJICAgIHNiYW5kLT52aHRfY2FwLnZodF9zdXBwb3J0ZWQpIHsKKwkJCXBvcyA9IGllZWU4MDIxMV9pZV9idWlsZF92aHRfY2FwKHBvcywgJnNiYW5kLT52aHRfY2FwLAorCQkJCQkJCSBzYmFuZC0+dmh0X2NhcC5jYXApOworCQkJcG9zID0gaWVlZTgwMjExX2llX2J1aWxkX3ZodF9vcGVyKHBvcywgJnNiYW5kLT52aHRfY2FwLAorCQkJCQkJCSAgY2hhbmRlZik7CisJCX0KIAl9CiAKIAlpZiAobG9jYWwtPmh3LnF1ZXVlcyA+PSBJRUVFODAyMTFfTlVNX0FDUykKQEAgLTI0OSw4ICsyNTksNiBAQAogCWlmIChwcmVzcCkKIAkJa2ZyZWVfcmN1KHByZXNwLCByY3VfaGVhZCk7CiAKLQlzZGF0YS0+ZHJvcF91bmVuY3J5cHRlZCA9IGNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSA/IDEgOiAwOwotCiAJLyogbWFrZSBhIGNvcHkgb2YgdGhlIGNoYW5kZWYsIGl0IGNvdWxkIGJlIG1vZGlmaWVkIGJlbG93LiAqLwogCWNoYW5kZWYgPSAqcmVxX2NoYW5kZWY7CiAJY2hhbiA9IGNoYW5kZWYuY2hhbjsKQEAgLTQxNyw2ICs0MjUsMTEgQEAKIAkJCQkJTkw4MDIxMV9DSEFOX1dJRFRIXzIwX05PSFQpOwogCQljaGFuZGVmLndpZHRoID0gc2RhdGEtPnUuaWJzcy5jaGFuZGVmLndpZHRoOwogCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF84MDoKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF8xNjA6CisJCWNoYW5kZWYgPSBzZGF0YS0+dS5pYnNzLmNoYW5kZWY7CisJCWNoYW5kZWYuY2hhbiA9IGNic3MtPmNoYW5uZWw7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIGZhbGwgYmFjayB0byAyMCBNSHogZm9yIHVuc3VwcG9ydGVkIG1vZGVzICovCiAJCWNmZzgwMjExX2NoYW5kZWZfY3JlYXRlKCZjaGFuZGVmLCBjYnNzLT5jaGFubmVsLApAQCAtNDcwLDIyICs0ODMsMTkgQEAKIAlzdHJ1Y3QgYmVhY29uX2RhdGEgKnByZXNwLCAqb2xkX3ByZXNwOwogCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmNic3M7CiAJY29uc3Qgc3RydWN0IGNmZzgwMjExX2Jzc19pZXMgKmllczsKLQl1MTYgY2FwYWJpbGl0eTsKKwl1MTYgY2FwYWJpbGl0eSA9IDA7CiAJdTY0IHRzZjsKIAlpbnQgcmV0ID0gMDsKIAogCXNkYXRhX2Fzc2VydF9sb2NrKHNkYXRhKTsKIAotCWNhcGFiaWxpdHkgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKLQogCWlmIChpZmlic3MtPnByaXZhY3kpCi0JCWNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1k7CisJCWNhcGFiaWxpdHkgPSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWTsKIAogCWNic3MgPSBjZmc4MDIxMV9nZXRfYnNzKHNkYXRhLT5sb2NhbC0+aHcud2lwaHksIGlmaWJzcy0+Y2hhbmRlZi5jaGFuLAogCQkJCWlmaWJzcy0+YnNzaWQsIGlmaWJzcy0+c3NpZCwKLQkJCQlpZmlic3MtPnNzaWRfbGVuLCBXTEFOX0NBUEFCSUxJVFlfSUJTUyB8Ci0JCQkJV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1ksCi0JCQkJY2FwYWJpbGl0eSk7CisJCQkJaWZpYnNzLT5zc2lkX2xlbiwgSUVFRTgwMjExX0JTU19UWVBFX0lCU1MsCisJCQkJSUVFRTgwMjExX1BSSVZBQ1koaWZpYnNzLT5wcml2YWN5KSk7CiAKIAlpZiAoV0FSTl9PTighY2JzcykpIHsKIAkJcmV0ID0gLUVJTlZBTDsKQEAgLTUyNSwyMyArNTM1LDE3IEBACiAJc3RydWN0IGllZWU4MDIxMV9pZl9pYnNzICppZmlic3MgPSAmc2RhdGEtPnUuaWJzczsKIAlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpjYnNzOwogCWludCBlcnIsIGNoYW5nZWQgPSAwOwotCXUxNiBjYXBhYmlsaXR5OwogCiAJc2RhdGFfYXNzZXJ0X2xvY2soc2RhdGEpOwogCiAJLyogdXBkYXRlIGNmZzgwMjExIGJzcyBpbmZvcm1hdGlvbiB3aXRoIHRoZSBuZXcgY2hhbm5lbCAqLwogCWlmICghaXNfemVyb19ldGhlcl9hZGRyKGlmaWJzcy0+YnNzaWQpKSB7Ci0JCWNhcGFiaWxpdHkgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKLQotCQlpZiAoaWZpYnNzLT5wcml2YWN5KQotCQkJY2FwYWJpbGl0eSB8PSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWTsKLQogCQljYnNzID0gY2ZnODAyMTFfZ2V0X2JzcyhzZGF0YS0+bG9jYWwtPmh3LndpcGh5LAogCQkJCQlpZmlic3MtPmNoYW5kZWYuY2hhbiwKIAkJCQkJaWZpYnNzLT5ic3NpZCwgaWZpYnNzLT5zc2lkLAotCQkJCQlpZmlic3MtPnNzaWRfbGVuLCBXTEFOX0NBUEFCSUxJVFlfSUJTUyB8Ci0JCQkJCVdMQU5fQ0FQQUJJTElUWV9QUklWQUNZLAotCQkJCQljYXBhYmlsaXR5KTsKKwkJCQkJaWZpYnNzLT5zc2lkX2xlbiwKKwkJCQkJSUVFRTgwMjExX0JTU19UWVBFX0lCU1MsCisJCQkJCUlFRUU4MDIxMV9QUklWQUNZKGlmaWJzcy0+cHJpdmFjeSkpOwogCQkvKiBYWFg6IHNob3VsZCBub3QgcmVhbGx5IG1vZGlmeSBjZmc4MDIxMSBkYXRhICovCiAJCWlmIChjYnNzKSB7CiAJCQljYnNzLT5jaGFubmVsID0gc2RhdGEtPmNzYV9jaGFuZGVmLmNoYW47CkBAIC02ODIsMTkgKzY4NiwxMyBAQAogCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmNic3M7CiAJc3RydWN0IGJlYWNvbl9kYXRhICpwcmVzcDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKLQl1MTYgY2FwYWJpbGl0eTsKIAogCWlmICghaXNfemVyb19ldGhlcl9hZGRyKGlmaWJzcy0+YnNzaWQpKSB7Ci0JCWNhcGFiaWxpdHkgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKLQotCQlpZiAoaWZpYnNzLT5wcml2YWN5KQotCQkJY2FwYWJpbGl0eSB8PSBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWTsKLQogCQljYnNzID0gY2ZnODAyMTFfZ2V0X2Jzcyhsb2NhbC0+aHcud2lwaHksIGlmaWJzcy0+Y2hhbmRlZi5jaGFuLAogCQkJCQlpZmlic3MtPmJzc2lkLCBpZmlic3MtPnNzaWQsCi0JCQkJCWlmaWJzcy0+c3NpZF9sZW4sIFdMQU5fQ0FQQUJJTElUWV9JQlNTIHwKLQkJCQkJV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1ksCi0JCQkJCWNhcGFiaWxpdHkpOworCQkJCQlpZmlic3MtPnNzaWRfbGVuLAorCQkJCQlJRUVFODAyMTFfQlNTX1RZUEVfSUJTUywKKwkJCQkJSUVFRTgwMjExX1BSSVZBQ1koaWZpYnNzLT5wcml2YWN5KSk7CiAKIAkJaWYgKGNic3MpIHsKIAkJCWNmZzgwMjExX3VubGlua19ic3MobG9jYWwtPmh3LndpcGh5LCBjYnNzKTsKQEAgLTk4MCw2ICs5NzgsMTIxIEBACiAJCQkgICAgbWdtdC0+c2EsIHNkYXRhLT51Lmlic3MuYnNzaWQsIE5VTEwsIDAsIDAsIDApOwogfQogCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfdXBkYXRlX3N0YV9pbmZvKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCwgc2l6ZV90IGxlbiwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqcnhfc3RhdHVzLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICplbGVtcywKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kID0gcnhfc3RhdHVzLT5iYW5kOworCWVudW0gbmw4MDIxMV9ic3Nfc2Nhbl93aWR0aCBzY2FuX3dpZHRoOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tiYW5kXTsKKwlib29sIHJhdGVzX3VwZGF0ZWQgPSBmYWxzZTsKKwl1MzIgc3VwcF9yYXRlcyA9IDA7CisKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKQorCQlyZXR1cm47CisKKwlpZiAoIWV0aGVyX2FkZHJfZXF1YWwobWdtdC0+YnNzaWQsIHNkYXRhLT51Lmlic3MuYnNzaWQpKQorCQlyZXR1cm47CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBtZ210LT5zYSk7CisKKwlpZiAoZWxlbXMtPnN1cHBfcmF0ZXMpIHsKKwkJc3VwcF9yYXRlcyA9IGllZWU4MDIxMV9zdGFfZ2V0X3JhdGVzKHNkYXRhLCBlbGVtcywKKwkJCQkJCSAgICAgYmFuZCwgTlVMTCk7CisJCWlmIChzdGEpIHsKKwkJCXUzMiBwcmV2X3JhdGVzOworCisJCQlwcmV2X3JhdGVzID0gc3RhLT5zdGEuc3VwcF9yYXRlc1tiYW5kXTsKKwkJCS8qIG1ha2Ugc3VyZSBtYW5kYXRvcnkgcmF0ZXMgYXJlIGFsd2F5cyBhZGRlZCAqLworCQkJc2Nhbl93aWR0aCA9IE5MODAyMTFfQlNTX0NIQU5fV0lEVEhfMjA7CisJCQlpZiAocnhfc3RhdHVzLT5mbGFnICYgUlhfRkxBR181TUhaKQorCQkJCXNjYW5fd2lkdGggPSBOTDgwMjExX0JTU19DSEFOX1dJRFRIXzU7CisJCQlpZiAocnhfc3RhdHVzLT5mbGFnICYgUlhfRkxBR18xME1IWikKKwkJCQlzY2FuX3dpZHRoID0gTkw4MDIxMV9CU1NfQ0hBTl9XSURUSF8xMDsKKworCQkJc3RhLT5zdGEuc3VwcF9yYXRlc1tiYW5kXSA9IHN1cHBfcmF0ZXMgfAorCQkJCWllZWU4MDIxMV9tYW5kYXRvcnlfcmF0ZXMoc2JhbmQsIHNjYW5fd2lkdGgpOworCQkJaWYgKHN0YS0+c3RhLnN1cHBfcmF0ZXNbYmFuZF0gIT0gcHJldl9yYXRlcykgeworCQkJCWlic3NfZGJnKHNkYXRhLAorCQkJCQkgInVwZGF0ZWQgc3VwcF9yYXRlcyBzZXQgZm9yICVwTSBiYXNlZCBvbiBiZWFjb24vcHJvYmVfcmVzcCAoMHgleCAtPiAweCV4KVxuIiwKKwkJCQkJIHN0YS0+c3RhLmFkZHIsIHByZXZfcmF0ZXMsCisJCQkJCSBzdGEtPnN0YS5zdXBwX3JhdGVzW2JhbmRdKTsKKwkJCQlyYXRlc191cGRhdGVkID0gdHJ1ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJc3RhID0gaWVlZTgwMjExX2lic3NfYWRkX3N0YShzZGF0YSwgbWdtdC0+YnNzaWQsCisJCQkJCQkgICAgIG1nbXQtPnNhLCBzdXBwX3JhdGVzKTsKKwkJfQorCX0KKworCWlmIChzdGEgJiYgZWxlbXMtPndtbV9pbmZvICYmIGxvY2FsLT5ody5xdWV1ZXMgPj0gSUVFRTgwMjExX05VTV9BQ1MpCisJCXN0YS0+c3RhLndtZSA9IHRydWU7CisKKwlpZiAoc3RhICYmIGVsZW1zLT5odF9vcGVyYXRpb24gJiYgZWxlbXMtPmh0X2NhcF9lbGVtICYmCisJICAgIHNkYXRhLT51Lmlic3MuY2hhbmRlZi53aWR0aCAhPSBOTDgwMjExX0NIQU5fV0lEVEhfMjBfTk9IVCAmJgorCSAgICBzZGF0YS0+dS5pYnNzLmNoYW5kZWYud2lkdGggIT0gTkw4MDIxMV9DSEFOX1dJRFRIXzUgJiYKKwkgICAgc2RhdGEtPnUuaWJzcy5jaGFuZGVmLndpZHRoICE9IE5MODAyMTFfQ0hBTl9XSURUSF8xMCkgeworCQkvKiB3ZSBib3RoIHVzZSBIVCAqLworCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodGNhcF9pZTsKKwkJc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmIGNoYW5kZWY7CisJCWVudW0gaWVlZTgwMjExX3N0YV9yeF9iYW5kd2lkdGggYncgPSBzdGEtPnN0YS5iYW5kd2lkdGg7CisKKwkJaWVlZTgwMjExX2h0X29wZXJfdG9fY2hhbmRlZihjaGFubmVsLAorCQkJCQkgICAgIGVsZW1zLT5odF9vcGVyYXRpb24sCisJCQkJCSAgICAgJmNoYW5kZWYpOworCisJCW1lbWNweSgmaHRjYXBfaWUsIGVsZW1zLT5odF9jYXBfZWxlbSwgc2l6ZW9mKGh0Y2FwX2llKSk7CisJCXJhdGVzX3VwZGF0ZWQgfD0gaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHNkYXRhLCBzYmFuZCwKKwkJCQkJCQkJICAgJmh0Y2FwX2llLAorCQkJCQkJCQkgICBzdGEpOworCisJCWlmIChlbGVtcy0+dmh0X29wZXJhdGlvbiAmJiBlbGVtcy0+dmh0X2NhcF9lbGVtICYmCisJCSAgICBzZGF0YS0+dS5pYnNzLmNoYW5kZWYud2lkdGggIT0gTkw4MDIxMV9DSEFOX1dJRFRIXzIwICYmCisJCSAgICBzZGF0YS0+dS5pYnNzLmNoYW5kZWYud2lkdGggIT0gTkw4MDIxMV9DSEFOX1dJRFRIXzQwKSB7CisJCQkvKiB3ZSBib3RoIHVzZSBWSFQgKi8KKwkJCXN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcCBjYXBfaWU7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YV92aHRfY2FwIGNhcCA9IHN0YS0+c3RhLnZodF9jYXA7CisKKwkJCWllZWU4MDIxMV92aHRfb3Blcl90b19jaGFuZGVmKGNoYW5uZWwsCisJCQkJCQkgICAgICBlbGVtcy0+dmh0X29wZXJhdGlvbiwKKwkJCQkJCSAgICAgICZjaGFuZGVmKTsKKwkJCW1lbWNweSgmY2FwX2llLCBlbGVtcy0+dmh0X2NhcF9lbGVtLCBzaXplb2YoY2FwX2llKSk7CisJCQlpZWVlODAyMTFfdmh0X2NhcF9pZV90b19zdGFfdmh0X2NhcChzZGF0YSwgc2JhbmQsCisJCQkJCQkJICAgICZjYXBfaWUsIHN0YSk7CisJCQlpZiAobWVtY21wKCZjYXAsICZzdGEtPnN0YS52aHRfY2FwLCBzaXplb2YoY2FwKSkpCisJCQkJcmF0ZXNfdXBkYXRlZCB8PSB0cnVlOworCQl9CisKKwkJaWYgKGJ3ICE9IHN0YS0+c3RhLmJhbmR3aWR0aCkKKwkJCXJhdGVzX3VwZGF0ZWQgfD0gdHJ1ZTsKKworCQlpZiAoIWNmZzgwMjExX2NoYW5kZWZfY29tcGF0aWJsZSgmc2RhdGEtPnUuaWJzcy5jaGFuZGVmLAorCQkJCQkJICZjaGFuZGVmKSkKKwkJCVdBUk5fT05fT05DRSgxKTsKKwl9CisKKwlpZiAoc3RhICYmIHJhdGVzX3VwZGF0ZWQpIHsKKwkJdTMyIGNoYW5nZWQgPSBJRUVFODAyMTFfUkNfU1VQUF9SQVRFU19DSEFOR0VEOworCQl1OCByeF9uc3MgPSBzdGEtPnN0YS5yeF9uc3M7CisKKwkJLyogRm9yY2UgcnhfbnNzIHJlY2FsY3VsYXRpb24gKi8KKwkJc3RhLT5zdGEucnhfbnNzID0gMDsKKwkJcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEpOworCQlpZiAoc3RhLT5zdGEucnhfbnNzICE9IHJ4X25zcykKKwkJCWNoYW5nZWQgfD0gSUVFRTgwMjExX1JDX05TU19DSEFOR0VEOworCisJCWRydl9zdGFfcmNfdXBkYXRlKGxvY2FsLCBzZGF0YSwgJnN0YS0+c3RhLCBjaGFuZ2VkKTsKKwl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKwogc3RhdGljIHZvaWQgaWVlZTgwMjExX3J4X2Jzc19pbmZvKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LCBzaXplX3QgbGVuLAogCQkJCSAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnJ4X3N0YXR1cywKQEAgLTk4OCwxMDEgKzExMDEsMTYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpjYnNzOwogCXN0cnVjdCBpZWVlODAyMTFfYnNzICpic3M7Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOwogCXU2NCBiZWFjb25fdGltZXN0YW1wLCByeF90aW1lc3RhbXA7CiAJdTMyIHN1cHBfcmF0ZXMgPSAwOwogCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCA9IHJ4X3N0YXR1cy0+YmFuZDsKLQllbnVtIG5sODAyMTFfYnNzX3NjYW5fd2lkdGggc2Nhbl93aWR0aDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbYmFuZF07Ci0JYm9vbCByYXRlc191cGRhdGVkID0gZmFsc2U7CiAKIAljaGFubmVsID0gaWVlZTgwMjExX2dldF9jaGFubmVsKGxvY2FsLT5ody53aXBoeSwgcnhfc3RhdHVzLT5mcmVxKTsKIAlpZiAoIWNoYW5uZWwpCiAJCXJldHVybjsKIAotCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKLQkgICAgZXRoZXJfYWRkcl9lcXVhbChtZ210LT5ic3NpZCwgc2RhdGEtPnUuaWJzcy5ic3NpZCkpIHsKLQotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgbWdtdC0+c2EpOwotCi0JCWlmIChlbGVtcy0+c3VwcF9yYXRlcykgewotCQkJc3VwcF9yYXRlcyA9IGllZWU4MDIxMV9zdGFfZ2V0X3JhdGVzKHNkYXRhLCBlbGVtcywKLQkJCQkJCQkgICAgIGJhbmQsIE5VTEwpOwotCQkJaWYgKHN0YSkgewotCQkJCXUzMiBwcmV2X3JhdGVzOwotCi0JCQkJcHJldl9yYXRlcyA9IHN0YS0+c3RhLnN1cHBfcmF0ZXNbYmFuZF07Ci0JCQkJLyogbWFrZSBzdXJlIG1hbmRhdG9yeSByYXRlcyBhcmUgYWx3YXlzIGFkZGVkICovCi0JCQkJc2Nhbl93aWR0aCA9IE5MODAyMTFfQlNTX0NIQU5fV0lEVEhfMjA7Ci0JCQkJaWYgKHJ4X3N0YXR1cy0+ZmxhZyAmIFJYX0ZMQUdfNU1IWikKLQkJCQkJc2Nhbl93aWR0aCA9IE5MODAyMTFfQlNTX0NIQU5fV0lEVEhfNTsKLQkJCQlpZiAocnhfc3RhdHVzLT5mbGFnICYgUlhfRkxBR18xME1IWikKLQkJCQkJc2Nhbl93aWR0aCA9IE5MODAyMTFfQlNTX0NIQU5fV0lEVEhfMTA7Ci0KLQkJCQlzdGEtPnN0YS5zdXBwX3JhdGVzW2JhbmRdID0gc3VwcF9yYXRlcyB8Ci0JCQkJCWllZWU4MDIxMV9tYW5kYXRvcnlfcmF0ZXMoc2JhbmQsCi0JCQkJCQkJCSAgc2Nhbl93aWR0aCk7Ci0JCQkJaWYgKHN0YS0+c3RhLnN1cHBfcmF0ZXNbYmFuZF0gIT0gcHJldl9yYXRlcykgewotCQkJCQlpYnNzX2RiZyhzZGF0YSwKLQkJCQkJCSAidXBkYXRlZCBzdXBwX3JhdGVzIHNldCBmb3IgJXBNIGJhc2VkIG9uIGJlYWNvbi9wcm9iZV9yZXNwICgweCV4IC0+IDB4JXgpXG4iLAotCQkJCQkJIHN0YS0+c3RhLmFkZHIsIHByZXZfcmF0ZXMsCi0JCQkJCQkgc3RhLT5zdGEuc3VwcF9yYXRlc1tiYW5kXSk7Ci0JCQkJCXJhdGVzX3VwZGF0ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQkJc3RhID0gaWVlZTgwMjExX2lic3NfYWRkX3N0YShzZGF0YSwgbWdtdC0+YnNzaWQsCi0JCQkJCQltZ210LT5zYSwgc3VwcF9yYXRlcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3RhICYmIGVsZW1zLT53bW1faW5mbykKLQkJCXN0YS0+c3RhLndtZSA9IHRydWU7Ci0KLQkJaWYgKHN0YSAmJiBlbGVtcy0+aHRfb3BlcmF0aW9uICYmIGVsZW1zLT5odF9jYXBfZWxlbSAmJgotCQkgICAgc2RhdGEtPnUuaWJzcy5jaGFuZGVmLndpZHRoICE9IE5MODAyMTFfQ0hBTl9XSURUSF8yMF9OT0hUICYmCi0JCSAgICBzZGF0YS0+dS5pYnNzLmNoYW5kZWYud2lkdGggIT0gTkw4MDIxMV9DSEFOX1dJRFRIXzUgJiYKLQkJICAgIHNkYXRhLT51Lmlic3MuY2hhbmRlZi53aWR0aCAhPSBOTDgwMjExX0NIQU5fV0lEVEhfMTApIHsKLQkJCS8qIHdlIGJvdGggdXNlIEhUICovCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodGNhcF9pZTsKLQkJCXN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiBjaGFuZGVmOwotCi0JCQlpZWVlODAyMTFfaHRfb3Blcl90b19jaGFuZGVmKGNoYW5uZWwsCi0JCQkJCQkgICAgIGVsZW1zLT5odF9vcGVyYXRpb24sCi0JCQkJCQkgICAgICZjaGFuZGVmKTsKLQotCQkJbWVtY3B5KCZodGNhcF9pZSwgZWxlbXMtPmh0X2NhcF9lbGVtLCBzaXplb2YoaHRjYXBfaWUpKTsKLQotCQkJLyoKLQkJCSAqIGZhbGwgYmFjayB0byBIVDIwIGlmIHdlIGRvbid0IHVzZSBvciB1c2UKLQkJCSAqIHRoZSBvdGhlciBleHRlbnNpb24gY2hhbm5lbAotCQkJICovCi0JCQlpZiAoY2hhbmRlZi5jZW50ZXJfZnJlcTEgIT0KLQkJCSAgICBzZGF0YS0+dS5pYnNzLmNoYW5kZWYuY2VudGVyX2ZyZXExKQotCQkJCWh0Y2FwX2llLmNhcF9pbmZvICY9Ci0JCQkJCWNwdV90b19sZTE2KH5JRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCk7Ci0KLQkJCXJhdGVzX3VwZGF0ZWQgfD0gaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKAotCQkJCQkJc2RhdGEsIHNiYW5kLCAmaHRjYXBfaWUsIHN0YSk7Ci0JCX0KLQotCQlpZiAoc3RhICYmIHJhdGVzX3VwZGF0ZWQpIHsKLQkJCXUzMiBjaGFuZ2VkID0gSUVFRTgwMjExX1JDX1NVUFBfUkFURVNfQ0hBTkdFRDsKLQkJCXU4IHJ4X25zcyA9IHN0YS0+c3RhLnJ4X25zczsKLQotCQkJLyogRm9yY2UgcnhfbnNzIHJlY2FsY3VsYXRpb24gKi8KLQkJCXN0YS0+c3RhLnJ4X25zcyA9IDA7Ci0JCQlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7Ci0JCQlpZiAoc3RhLT5zdGEucnhfbnNzICE9IHJ4X25zcykKLQkJCQljaGFuZ2VkIHw9IElFRUU4MDIxMV9SQ19OU1NfQ0hBTkdFRDsKLQotCQkJZHJ2X3N0YV9yY191cGRhdGUobG9jYWwsIHNkYXRhLCAmc3RhLT5zdGEsIGNoYW5nZWQpOwotCQl9Ci0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JfQorCWllZWU4MDIxMV91cGRhdGVfc3RhX2luZm8oc2RhdGEsIG1nbXQsIGxlbiwgcnhfc3RhdHVzLCBlbGVtcywgY2hhbm5lbCk7CiAKIAlic3MgPSBpZWVlODAyMTFfYnNzX2luZm9fdXBkYXRlKGxvY2FsLCByeF9zdGF0dXMsIG1nbXQsIGxlbiwgZWxlbXMsCiAJCQkJCWNoYW5uZWwpOwpAQCAtMTI3Myw3ICsxMzAxLDcgQEAKIAogCXNjYW5fd2lkdGggPSBjZmc4MDIxMV9jaGFuZGVmX3RvX3NjYW5fd2lkdGgoJmlmaWJzcy0+Y2hhbmRlZik7CiAJaWVlZTgwMjExX3JlcXVlc3RfaWJzc19zY2FuKHNkYXRhLCBpZmlic3MtPnNzaWQsIGlmaWJzcy0+c3NpZF9sZW4sCi0JCQkJICAgIE5VTEwsIHNjYW5fd2lkdGgpOworCQkJCSAgICBOVUxMLCAwLCBzY2FuX3dpZHRoKTsKIH0KIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX3N0YV9jcmVhdGVfaWJzcyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKQEAgLTEzMDQsMTQgKzEzMzIsODIgQEAKIAogCWlmIChpZmlic3MtPnByaXZhY3kpCiAJCWNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1k7Ci0JZWxzZQotCQlzZGF0YS0+ZHJvcF91bmVuY3J5cHRlZCA9IDA7CiAKIAlfX2llZWU4MDIxMV9zdGFfam9pbl9pYnNzKHNkYXRhLCBic3NpZCwgc2RhdGEtPnZpZi5ic3NfY29uZi5iZWFjb25faW50LAogCQkJCSAgJmlmaWJzcy0+Y2hhbmRlZiwgaWZpYnNzLT5iYXNpY19yYXRlcywKIAkJCQkgIGNhcGFiaWxpdHksIDAsIHRydWUpOwogfQogCitzdGF0aWMgdW5zaWduZWQgaWJzc19zZXR1cF9jaGFubmVscyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKipjaGFubmVscywKKwkJCQkgICAgdW5zaWduZWQgaW50IGNoYW5uZWxzX21heCwKKwkJCQkgICAgdTMyIGNlbnRlcl9mcmVxLCB1MzIgd2lkdGgpCit7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgbl9jaGFuID0gMDsKKwl1MzIgc3RhcnRfZnJlcSwgZW5kX2ZyZXEsIGZyZXE7CisKKwlpZiAod2lkdGggPD0gMjApIHsKKwkJc3RhcnRfZnJlcSA9IGNlbnRlcl9mcmVxOworCQllbmRfZnJlcSA9IGNlbnRlcl9mcmVxOworCX0gZWxzZSB7CisJCXN0YXJ0X2ZyZXEgPSBjZW50ZXJfZnJlcSAtIHdpZHRoIC8gMiArIDEwOworCQllbmRfZnJlcSA9IGNlbnRlcl9mcmVxICsgd2lkdGggLyAyIC0gMTA7CisJfQorCisJZm9yIChmcmVxID0gc3RhcnRfZnJlcTsgZnJlcSA8PSBlbmRfZnJlcTsgZnJlcSArPSAyMCkgeworCQljaGFuID0gaWVlZTgwMjExX2dldF9jaGFubmVsKHdpcGh5LCBmcmVxKTsKKwkJaWYgKCFjaGFuKQorCQkJY29udGludWU7CisJCWlmIChuX2NoYW4gPj0gY2hhbm5lbHNfbWF4KQorCQkJcmV0dXJuIG5fY2hhbjsKKworCQljaGFubmVsc1tuX2NoYW5dID0gY2hhbjsKKwkJbl9jaGFuKys7CisJfQorCisJcmV0dXJuIG5fY2hhbjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraWVlZTgwMjExX2lic3Nfc2V0dXBfc2Nhbl9jaGFubmVscyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKipjaGFubmVscywKKwkJCQkgICB1bnNpZ25lZCBpbnQgY2hhbm5lbHNfbWF4KQoreworCXVuc2lnbmVkIGludCBuX2NoYW4gPSAwOworCXUzMiB3aWR0aCwgY2YxLCBjZjIgPSAwOworCisJc3dpdGNoIChjaGFuZGVmLT53aWR0aCkgeworCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzQwOgorCQl3aWR0aCA9IDQwOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF84MFA4MDoKKwkJY2YyID0gY2hhbmRlZi0+Y2VudGVyX2ZyZXEyOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF84MDoKKwkJd2lkdGggPSA4MDsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfMTYwOgorCQl3aWR0aCA9IDE2MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJd2lkdGggPSAyMDsKKwkJYnJlYWs7CisJfQorCisJY2YxID0gY2hhbmRlZi0+Y2VudGVyX2ZyZXExOworCisJbl9jaGFuID0gaWJzc19zZXR1cF9jaGFubmVscyh3aXBoeSwgY2hhbm5lbHMsIGNoYW5uZWxzX21heCwgY2YxLCB3aWR0aCk7CisKKwlpZiAoY2YyKQorCQluX2NoYW4gKz0gaWJzc19zZXR1cF9jaGFubmVscyh3aXBoeSwgJmNoYW5uZWxzW25fY2hhbl0sCisJCQkJCSAgICAgIGNoYW5uZWxzX21heCAtIG5fY2hhbiwgY2YyLAorCQkJCQkgICAgICB3aWR0aCk7CisKKwlyZXR1cm4gbl9jaGFuOworfQorCiAvKgogICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBzdGF0ZSA9PSBJRUVFODAyMTFfSUJTU19NTE1FX1NFQVJDSAogICovCkBAIC0xMzI1LDcgKzE0MjEsNiBAQAogCWNvbnN0IHU4ICpic3NpZCA9IE5VTEw7CiAJZW51bSBubDgwMjExX2Jzc19zY2FuX3dpZHRoIHNjYW5fd2lkdGg7CiAJaW50IGFjdGl2ZV9pYnNzOwotCXUxNiBjYXBhYmlsaXR5OwogCiAJc2RhdGFfYXNzZXJ0X2xvY2soc2RhdGEpOwogCkBAIC0xMzM1LDkgKzE0MzAsNiBAQAogCWlmIChhY3RpdmVfaWJzcykKIAkJcmV0dXJuOwogCi0JY2FwYWJpbGl0eSA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOwotCWlmIChpZmlic3MtPnByaXZhY3kpCi0JCWNhcGFiaWxpdHkgfD0gV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1k7CiAJaWYgKGlmaWJzcy0+Zml4ZWRfYnNzaWQpCiAJCWJzc2lkID0gaWZpYnNzLT5ic3NpZDsKIAlpZiAoaWZpYnNzLT5maXhlZF9jaGFubmVsKQpAQCAtMTM0Niw4ICsxNDM4LDggQEAKIAkJYnNzaWQgPSBpZmlic3MtPmJzc2lkOwogCWNic3MgPSBjZmc4MDIxMV9nZXRfYnNzKGxvY2FsLT5ody53aXBoeSwgY2hhbiwgYnNzaWQsCiAJCQkJaWZpYnNzLT5zc2lkLCBpZmlic3MtPnNzaWRfbGVuLAotCQkJCVdMQU5fQ0FQQUJJTElUWV9JQlNTIHwgV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1ksCi0JCQkJY2FwYWJpbGl0eSk7CisJCQkJSUVFRTgwMjExX0JTU19UWVBFX0lCU1MsCisJCQkJSUVFRTgwMjExX1BSSVZBQ1koaWZpYnNzLT5wcml2YWN5KSk7CiAKIAlpZiAoY2JzcykgewogCQlzdHJ1Y3QgaWVlZTgwMjExX2JzcyAqYnNzOwpAQCAtMTM4MSwxMSArMTQ3MywxOCBAQAogCS8qIFNlbGVjdGVkIElCU1Mgbm90IGZvdW5kIGluIGN1cnJlbnQgc2NhbiByZXN1bHRzIC0gdHJ5IHRvIHNjYW4gKi8KIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBpZmlic3MtPmxhc3Rfc2Nhbl9jb21wbGV0ZWQgKwogCQkJCQlJRUVFODAyMTFfU0NBTl9JTlRFUlZBTCkpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsc1s4XTsKKwkJdW5zaWduZWQgaW50IG51bTsKKwogCQlzZGF0YV9pbmZvKHNkYXRhLCAiVHJpZ2dlciBuZXcgc2NhbiB0byBmaW5kIGFuIElCU1MgdG8gam9pblxuIik7CiAKKwkJbnVtID0gaWVlZTgwMjExX2lic3Nfc2V0dXBfc2Nhbl9jaGFubmVscyhsb2NhbC0+aHcud2lwaHksCisJCQkJCQkJICZpZmlic3MtPmNoYW5kZWYsCisJCQkJCQkJIGNoYW5uZWxzLAorCQkJCQkJCSBBUlJBWV9TSVpFKGNoYW5uZWxzKSk7CiAJCXNjYW5fd2lkdGggPSBjZmc4MDIxMV9jaGFuZGVmX3RvX3NjYW5fd2lkdGgoJmlmaWJzcy0+Y2hhbmRlZik7CiAJCWllZWU4MDIxMV9yZXF1ZXN0X2lic3Nfc2NhbihzZGF0YSwgaWZpYnNzLT5zc2lkLAotCQkJCQkgICAgaWZpYnNzLT5zc2lkX2xlbiwgY2hhbiwKKwkJCQkJICAgIGlmaWJzcy0+c3NpZF9sZW4sIGNoYW5uZWxzLCBudW0sCiAJCQkJCSAgICBzY2FuX3dpZHRoKTsKIAl9IGVsc2UgewogCQlpbnQgaW50ZXJ2YWwgPSBJRUVFODAyMTFfU0NBTl9JTlRFUlZBTDsKQEAgLTE3NDIsNyArMTg0MSw3IEBACiAKIAlpZWVlODAyMTFfaWJzc19kaXNjb25uZWN0KHNkYXRhKTsKIAlpZmlic3MtPnNzaWRfbGVuID0gMDsKLQltZW1zZXQoaWZpYnNzLT5ic3NpZCwgMCwgRVRIX0FMRU4pOworCWV0aF96ZXJvX2FkZHIoaWZpYnNzLT5ic3NpZCk7CiAKIAkvKiByZW1vdmUgYmVhY29uICovCiAJa2ZyZWUoc2RhdGEtPnUuaWJzcy5pZSk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaCBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCmluZGV4IDNhZmUzNjguLmFiNDZhYjQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCisrKyBiL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvcmhhc2h0YWJsZS5oPgogI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KQEAgLTU4LDEzICs1OSwyNCBAQAogI2RlZmluZSBJRUVFODAyMTFfVU5TRVRfUE9XRVJfTEVWRUwJSU5UX01JTgogCiAvKgotICogU29tZSBBUHMgZXhwZXJpZW5jZSBwcm9ibGVtcyB3aGVuIHdvcmtpbmcgd2l0aCBVLUFQU0QuIERlY3JlYXNlIHRoZQotICogcHJvYmFiaWxpdHkgb2YgdGhhdCBoYXBwZW5pbmcgYnkgdXNpbmcgbGVnYWN5IG1vZGUgZm9yIGFsbCBBQ3MgYnV0IFZPLgotICogVGhlIEFQIHRoYXQgY2F1c2VkIHVzIHRyb3VibGUgd2FzIGEgQ2lzY28gNDQxME4uIEl0IGlnbm9yZXMgb3VyCi0gKiBzZXR0aW5nLCBhbmQgYWx3YXlzIHRyZWF0cyBub24tVk8gQUNzIGFzIGxlZ2FjeS4KKyAqIFNvbWUgQVBzIGV4cGVyaWVuY2UgcHJvYmxlbXMgd2hlbiB3b3JraW5nIHdpdGggVS1BUFNELiBEZWNyZWFzaW5nIHRoZQorICogcHJvYmFiaWxpdHkgb2YgdGhhdCBoYXBwZW5pbmcgYnkgdXNpbmcgbGVnYWN5IG1vZGUgZm9yIGFsbCBBQ3MgYnV0IFZPIGlzbid0CisgKiBlbm91Z2guCisgKgorICogQ2lzY28gNDQxME4gb3JpZ2luYWxseSBmb3JjZWQgdXMgdG8gZW5hYmxlIFZPIGJ5IGRlZmF1bHQgb25seSBiZWNhdXNlIGl0CisgKiB0cmVhdGVkIG5vbi1WTyBBQ3MgYXMgbGVnYWN5LgorICoKKyAqIEhvd2V2ZXIgc29tZSBBUHMgKG5vdGFibHkgTmV0Z2VhciBSNzAwMCkgc2lsZW50bHkgcmVjbGFzc2lmeSBwYWNrZXRzIHRvCisgKiBkaWZmZXJlbnQgQUNzLiBTaW5jZSB1LUFQU0QgQUNzIHJlcXVpcmUgdHJpZ2dlciBmcmFtZXMgZm9yIGZyYW1lIHJldHJpZXZhbAorICogY2xpZW50cyB3b3VsZCBuZXZlciBzZWUgc29tZSBmcmFtZXMgKGUuZy4gQVJQIHJlc3BvbnNlcykgb3Igd291bGQgZmV0Y2ggdGhlbQorICogYWNjaWRlbnRhbGx5IGFmdGVyIGEgbG9uZyB0aW1lLgorICoKKyAqIEl0IG1ha2VzIGxpdHRsZSBzZW5zZSB0byBlbmFibGUgdS1BUFNEIHF1ZXVlcyBieSBkZWZhdWx0IGJlY2F1c2UgaXQgbmVlZHMKKyAqIHVzZXJzcGFjZSBhcHBsaWNhdGlvbnMgdG8gYmUgYXdhcmUgb2YgaXQgdG8gYWN0dWFsbHkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlCisgKiBwb3NzaWJsZSBhZGRpdGlvbmFsIHBvd2Vyc2F2aW5ncy4gSW1wbGljaXRseSBkZXBlbmRpbmcgb24gZHJpdmVyIGF1dG90cmlnZ2VyCisgKiBmcmFtZSBzdXBwb3J0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLgogICovCi0jZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX1VBUFNEX1FVRVVFUyBcCi0JSUVFRTgwMjExX1dNTV9JRV9TVEFfUU9TSU5GT19BQ19WTworI2RlZmluZSBJRUVFODAyMTFfREVGQVVMVF9VQVBTRF9RVUVVRVMgMAogCiAjZGVmaW5lIElFRUU4MDIxMV9ERUZBVUxUX01BWF9TUF9MRU4JCVwKIAlJRUVFODAyMTFfV01NX0lFX1NUQV9RT1NJTkZPX1NQX0FMTApAQCAtNDUzLDYgKzQ2NSw3IEBACiAJdW5zaWduZWQgaW50IGZsYWdzOwogCiAJYm9vbCBjc2Ffd2FpdGluZ19iY247CisJYm9vbCBjc2FfaWdub3JlZF9zYW1lX2NoYW47CiAKIAlib29sIGJlYWNvbl9jcmNfdmFsaWQ7CiAJdTMyIGJlYWNvbl9jcmM7CkBAIC03OTgsNiArODExLDE5IEBACiAJc3RydWN0IHJjdV9oZWFkIHJjdV9oZWFkOwogfTsKIAorZW51bSB0eHFfaW5mb19mbGFncyB7CisJSUVFRTgwMjExX1RYUV9TVE9QLAorCUlFRUU4MDIxMV9UWFFfQU1QRFUsCit9OworCitzdHJ1Y3QgdHhxX2luZm8geworCXN0cnVjdCBza19idWZmX2hlYWQgcXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGtlZXAgbGFzdCEgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3R4cSB0eHE7Cit9OworCiBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAKQEAgLTgxOCw4ICs4NDQsNiBAQAogCiAJdW5zaWduZWQgbG9uZyBzdGF0ZTsKIAotCWludCBkcm9wX3VuZW5jcnlwdGVkOwotCiAJY2hhciBuYW1lW0lGTkFNU0laXTsKIAogCS8qIEZyYWdtZW50IHRhYmxlIGZvciBob3N0LWJhc2VkIHJlYXNzZW1ibHkgKi8KQEAgLTg0Miw2ICs4NjYsNyBAQAogCWJvb2wgY29udHJvbF9wb3J0X25vX2VuY3J5cHQ7CiAJaW50IGVuY3J5cHRfaGVhZHJvb207CiAKKwlhdG9taWNfdCB0eHFzX2xlbltJRUVFODAyMTFfTlVNX0FDU107CiAJc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgdHhfY29uZltJRUVFODAyMTFfTlVNX0FDU107CiAJc3RydWN0IG1hYzgwMjExX3Fvc19tYXAgX19yY3UgKnFvc19tYXA7CiAKQEAgLTEwMzAsMjQgKzEwNTUsNiBAQAogfTsKICNlbmRpZgogCi0vKgotICogc3RydWN0IGllZWU4MDIxMV90eF9sYXRlbmN5X2Jpbl9yYW5nZXMgLSBUeCBsYXRlbmN5IHN0YXRpc3RpY3MgYmlucyByYW5nZXMKLSAqCi0gKiBNZWFzdXJpbmcgVHggbGF0ZW5jeSBzdGF0aXN0aWNzLiBDb3VudHMgaG93IG1hbnkgVHggZnJhbWVzIHRyYW5zbWl0dGVkIGluIGEKLSAqIGNlcnRhaW4gbGF0ZW5jeSByYW5nZSAoaW4gTWlsbGlzZWNvbmRzKS4gRWFjaCBzdGF0aW9uIHRoYXQgdXNlcyB0aGVzZQotICogcmFuZ2VzIHdpbGwgaGF2ZSBiaW5zIHRvIGNvdW50IHRoZSBhbW91bnQgb2YgZnJhbWVzIHJlY2VpdmVkIGluIHRoYXQgcmFuZ2UuCi0gKiBUaGUgdXNlciBjYW4gY29uZmlndXJlIHRoZSByYW5nZXMgdmlhIGRlYnVnZnMuCi0gKiBJZiByYW5nZXMgaXMgTlVMTCB0aGVuIFR4IGxhdGVuY3kgc3RhdGlzdGljcyBiaW5zIGFyZSBkaXNhYmxlZCBmb3IgYWxsCi0gKiBzdGF0aW9ucy4KLSAqCi0gKiBAbl9yYW5nZXM6IG51bWJlciBvZiByYW5nZXMgdGhhdCBhcmUgdGFrZW4gaW4gYWNjb3VudAotICogQHJhbmdlczogdGhlIHJhbmdlcyB0aGF0IHRoZSB1c2VyIHJlcXVlc3RlZCBvciBOVUxMIGlmIGRpc2FibGVkLgotICovCi1zdHJ1Y3QgaWVlZTgwMjExX3R4X2xhdGVuY3lfYmluX3JhbmdlcyB7Ci0JaW50IG5fcmFuZ2VzOwotCXUzMiByYW5nZXNbXTsKLX07Ci0KIC8qKgogICogbWFjODAyMTEgc2NhbiBmbGFncyAtIGN1cnJlbnRseSBhY3RpdmUgc2NhbiBtb2RlCiAgKgpAQCAtMTE5NSwxNiArMTIwMiwxMCBAQAogCXNwaW5sb2NrX3QgdGltX2xvY2s7CiAJdW5zaWduZWQgbG9uZyBudW1fc3RhOwogCXN0cnVjdCBsaXN0X2hlYWQgc3RhX2xpc3Q7Ci0Jc3RydWN0IHN0YV9pbmZvIF9fcmN1ICpzdGFfaGFzaFtTVEFfSEFTSF9TSVpFXTsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZSBzdGFfaGFzaDsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBzdGFfY2xlYW51cDsKIAlpbnQgc3RhX2dlbmVyYXRpb247CiAKLQkvKgotCSAqIFR4IGxhdGVuY3kgc3RhdGlzdGljcyBwYXJhbWV0ZXJzIGZvciBhbGwgc3RhdGlvbnMuCi0JICogQ2FuIGVuYWJsZSB2aWEgZGVidWdmcyAoTlVMTCB3aGVuIGRpc2FibGVkKS4KLQkgKi8KLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2xhdGVuY3lfYmluX3JhbmdlcyBfX3JjdSAqdHhfbGF0ZW5jeTsKLQogCXN0cnVjdCBza19idWZmX2hlYWQgcGVuZGluZ1tJRUVFODAyMTFfTUFYX1FVRVVFU107CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0IHR4X3BlbmRpbmdfdGFza2xldDsKIApAQCAtMTI4Niw3ICsxMjg3LDYgQEAKIAkvKiBUWC9SWCBoYW5kbGVyIHN0YXRpc3RpY3MgKi8KIAl1bnNpZ25lZCBpbnQgdHhfaGFuZGxlcnNfZHJvcDsKIAl1bnNpZ25lZCBpbnQgdHhfaGFuZGxlcnNfcXVldWVkOwotCXVuc2lnbmVkIGludCB0eF9oYW5kbGVyc19kcm9wX3VuZW5jcnlwdGVkOwogCXVuc2lnbmVkIGludCB0eF9oYW5kbGVyc19kcm9wX2ZyYWdtZW50OwogCXVuc2lnbmVkIGludCB0eF9oYW5kbGVyc19kcm9wX3dlcDsKIAl1bnNpZ25lZCBpbnQgdHhfaGFuZGxlcnNfZHJvcF9ub3RfYXNzb2M7CkBAIC0xNDY0LDYgKzE0NjQsMTAgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKGh3LCBzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsLCBodyk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHR4cV9pbmZvICp0b190eHFfaW5mbyhzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqdHhxKQoreworCXJldHVybiBjb250YWluZXJfb2YodHhxLCBzdHJ1Y3QgdHhxX2luZm8sIHR4cSk7Cit9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGllZWU4MDIxMV9ic3NpZF9tYXRjaChjb25zdCB1OCAqcmFkZHIsIGNvbnN0IHU4ICphZGRyKQogewpAQCAtMTU1Niw3ICsxNTYwLDggQEAKIHZvaWQgaWVlZTgwMjExX3NjYW5fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogaW50IGllZWU4MDIxMV9yZXF1ZXN0X2lic3Nfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCQljb25zdCB1OCAqc3NpZCwgdTggc3NpZF9sZW4sCi0JCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqKmNoYW5uZWxzLAorCQkJCXVuc2lnbmVkIGludCBuX2NoYW5uZWxzLAogCQkJCWVudW0gbmw4MDIxMV9ic3Nfc2Nhbl93aWR0aCBzY2FuX3dpZHRoKTsKIGludCBpZWVlODAyMTFfcmVxdWVzdF9zY2FuKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKTsKQEAgLTE2MDUsNiArMTYxMCw3IEBACiBpbnQgaWVlZTgwMjExX2lmYWNlX2luaXQodm9pZCk7CiB2b2lkIGllZWU4MDIxMV9pZmFjZV9leGl0KHZvaWQpOwogaW50IGllZWU4MDIxMV9pZl9hZGQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIGNvbnN0IGNoYXIgKm5hbWUsCisJCSAgICAgdW5zaWduZWQgY2hhciBuYW1lX2Fzc2lnbl90eXBlLAogCQkgICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKipuZXdfd2RldiwgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAogCQkgICAgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpOwogaW50IGllZWU4MDIxMV9pZl9jaGFuZ2VfdHlwZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKQEAgLTE3NzIsNyArMTc3OCw4IEBACiAJCQkJICAgICBnZnBfdCBnZnApOwogdm9pZCBpZWVlODAyMTFfc2V0X3dtbV9kZWZhdWx0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJICAgICAgIGJvb2wgYnNzX25vdGlmeSk7Ci12b2lkIGllZWU4MDIxMV94bWl0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3ZvaWQgaWVlZTgwMjExX3htaXQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSAgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKIHZvaWQgX19pZWVlODAyMTFfdHhfc2tiX3RpZF9iYW5kKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdGlkLApAQCAtMTkxNyw2ICsxOTI0LDkgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAordm9pZCBpZWVlODAyMTFfaW5pdF90eF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCSAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEsCisJCQkgICAgIHN0cnVjdCB0eHFfaW5mbyAqdHhxLCBpbnQgdGlkKTsKIHZvaWQgaWVlZTgwMjExX3NlbmRfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCSB1MTYgdHJhbnNhY3Rpb24sIHUxNiBhdXRoX2FsZywgdTE2IHN0YXR1cywKIAkJCSBjb25zdCB1OCAqZXh0cmEsIHNpemVfdCBleHRyYV9sZW4sIGNvbnN0IHU4ICpic3NpZCwKQEAgLTE5NTUsMTAgKzE5NjUsNiBAQAogdm9pZCBpZWVlODAyMTFfcmVjYWxjX3NtcHMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBpZWVlODAyMTFfcmVjYWxjX21pbl9jaGFuZGVmKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIAotc2l6ZV90IGllZWU4MDIxMV9pZV9zcGxpdF9yaWMoY29uc3QgdTggKmllcywgc2l6ZV90IGllbGVuLAotCQkJICAgICAgY29uc3QgdTggKmlkcywgaW50IG5faWRzLAotCQkJICAgICAgY29uc3QgdTggKmFmdGVyX3JpYywgaW50IG5fYWZ0ZXJfcmljLAotCQkJICAgICAgc2l6ZV90IG9mZnNldCk7CiBzaXplX3QgaWVlZTgwMjExX2llX3NwbGl0X3ZlbmRvcihjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVsZW4sIHNpemVfdCBvZmZzZXQpOwogdTggKmllZWU4MDIxMV9pZV9idWlsZF9odF9jYXAodTggKnBvcywgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAsCiAJCQkgICAgICB1MTYgY2FwKTsKQEAgLTE5NjcsNiArMTk3Myw4IEBACiAJCQkgICAgICAgdTE2IHByb3RfbW9kZSk7CiB1OCAqaWVlZTgwMjExX2llX2J1aWxkX3ZodF9jYXAodTggKnBvcywgc3RydWN0IGllZWU4MDIxMV9zdGFfdmh0X2NhcCAqdmh0X2NhcCwKIAkJCSAgICAgICB1MzIgY2FwKTsKK3U4ICppZWVlODAyMTFfaWVfYnVpbGRfdmh0X29wZXIodTggKnBvcywgc3RydWN0IGllZWU4MDIxMV9zdGFfdmh0X2NhcCAqdmh0X2NhcCwKKwkJCQljb25zdCBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpOwogaW50IGllZWU4MDIxMV9wYXJzZV9iaXRyYXRlcyhzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAogCQkJICAgICBjb25zdCB1OCAqc3JhdGVzLCBpbnQgc3JhdGVzX2xlbiwgdTMyICpyYXRlcyk7CkBAIC0xOTgyLDYgKzE5OTAsOSBAQAogdm9pZCBpZWVlODAyMTFfaHRfb3Blcl90b19jaGFuZGVmKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY29udHJvbF9jaGFuLAogCQkJCSAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9odF9vcGVyYXRpb24gKmh0X29wZXIsCiAJCQkJICBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpOwordm9pZCBpZWVlODAyMTFfdmh0X29wZXJfdG9fY2hhbmRlZihzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNvbnRyb2xfY2hhbiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3ZodF9vcGVyYXRpb24gKm9wZXIsCisJCQkJICAgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmKTsKIHUzMiBpZWVlODAyMTFfY2hhbmRlZl9kb3duZ3JhZGUoc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjKTsKIAogaW50IF9fbXVzdF9jaGVjawpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2lmYWNlLmMgYi9uZXQvbWFjODAyMTEvaWZhY2UuYwppbmRleCA4MWEyNzUxLi5iNGFjNTk2IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvaWZhY2UuYworKysgYi9uZXQvbWFjODAyMTEvaWZhY2UuYwpAQCAtOTY5LDYgKzk2OSwxMyBAQAogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+cXVldWVfc3RvcF9yZWFzb25fbG9jaywgZmxhZ3MpOwogCisJaWYgKHNkYXRhLT52aWYudHhxKSB7CisJCXN0cnVjdCB0eHFfaW5mbyAqdHhxaSA9IHRvX3R4cV9pbmZvKHNkYXRhLT52aWYudHhxKTsKKworCQlpZWVlODAyMTFfcHVyZ2VfdHhfcXVldWUoJmxvY2FsLT5odywgJnR4cWktPnF1ZXVlKTsKKwkJYXRvbWljX3NldCgmc2RhdGEtPnR4cXNfbGVuW3R4cWktPnR4cS5hY10sIDApOworCX0KKwogCWlmIChsb2NhbC0+b3Blbl9jb3VudCA9PSAwKQogCQlpZWVlODAyMTFfY2xlYXJfdHhfcGVuZGluZyhsb2NhbCk7CiAKQEAgLTE1MDgsNyArMTUxNSw2IEBACiAJfQogCiAJLyogcmVzZXQgc29tZSB2YWx1ZXMgdGhhdCBzaG91bGRuJ3QgYmUga2VwdCBhY3Jvc3MgdHlwZSBjaGFuZ2VzICovCi0Jc2RhdGEtPmRyb3BfdW5lbmNyeXB0ZWQgPSAwOwogCWlmICh0eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCXNkYXRhLT51Lm1nZC51c2VfNGFkZHIgPSBmYWxzZTsKIApAQCAtMTY0OSwxMSArMTY1NSwxMyBAQAogfQogCiBpbnQgaWVlZTgwMjExX2lmX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgY29uc3QgY2hhciAqbmFtZSwKKwkJICAgICB1bnNpZ25lZCBjaGFyIG5hbWVfYXNzaWduX3R5cGUsCiAJCSAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqKm5ld193ZGV2LCBlbnVtIG5sODAyMTFfaWZ0eXBlIHR5cGUsCiAJCSAgICAgc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IE5VTEw7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBOVUxMOworCXN0cnVjdCB0eHFfaW5mbyAqdHhxaTsKIAlpbnQgcmV0LCBpOwogCWludCB0eHFzID0gMTsKIApAQCAtMTY3MywxMSArMTY4MSwxOSBAQAogCQlpZWVlODAyMTFfYXNzaWduX3Blcm1fYWRkcihsb2NhbCwgd2Rldi0+YWRkcmVzcywgdHlwZSk7CiAJCW1lbWNweShzZGF0YS0+dmlmLmFkZHIsIHdkZXYtPmFkZHJlc3MsIEVUSF9BTEVOKTsKIAl9IGVsc2UgeworCQlpbnQgc2l6ZSA9IEFMSUdOKHNpemVvZigqc2RhdGEpICsgbG9jYWwtPmh3LnZpZl9kYXRhX3NpemUsCisJCQkJIHNpemVvZih2b2lkICopKTsKKwkJaW50IHR4cV9zaXplID0gMDsKKworCQlpZiAobG9jYWwtPm9wcy0+d2FrZV90eF9xdWV1ZSkKKwkJCXR4cV9zaXplICs9IHNpemVvZihzdHJ1Y3QgdHhxX2luZm8pICsKKwkJCQkgICAgbG9jYWwtPmh3LnR4cV9kYXRhX3NpemU7CisKIAkJaWYgKGxvY2FsLT5ody5xdWV1ZXMgPj0gSUVFRTgwMjExX05VTV9BQ1MpCiAJCQl0eHFzID0gSUVFRTgwMjExX05VTV9BQ1M7CiAKLQkJbmRldiA9IGFsbG9jX25ldGRldl9tcXMoc2l6ZW9mKCpzZGF0YSkgKyBsb2NhbC0+aHcudmlmX2RhdGFfc2l6ZSwKLQkJCQkJbmFtZSwgTkVUX05BTUVfVU5LTk9XTiwKKwkJbmRldiA9IGFsbG9jX25ldGRldl9tcXMoc2l6ZSArIHR4cV9zaXplLAorCQkJCQluYW1lLCBuYW1lX2Fzc2lnbl90eXBlLAogCQkJCQlpZWVlODAyMTFfaWZfc2V0dXAsIHR4cXMsIDEpOwogCQlpZiAoIW5kZXYpCiAJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTE3MTEsNiArMTcyNywxMSBAQAogCQltZW1jcHkoc2RhdGEtPnZpZi5hZGRyLCBuZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOwogCQltZW1jcHkoc2RhdGEtPm5hbWUsIG5kZXYtPm5hbWUsIElGTkFNU0laKTsKIAorCQlpZiAodHhxX3NpemUpIHsKKwkJCXR4cWkgPSBuZXRkZXZfcHJpdihuZGV2KSArIHNpemU7CisJCQlpZWVlODAyMTFfaW5pdF90eF9xdWV1ZShzZGF0YSwgTlVMTCwgdHhxaSwgMCk7CisJCX0KKwogCQlzZGF0YS0+ZGV2ID0gbmRldjsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9rZXkuYyBiL25ldC9tYWM4MDIxMS9rZXkuYwppbmRleCAwODI1ZDc2Li4yMjkxY2Q3IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEva2V5LmMKKysrIGIvbmV0L21hYzgwMjExL2tleS5jCkBAIC00OTIsNiArNDkyLDcgQEAKIAkJCQlmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspCiAJCQkJCWtleS0+dS5nZW4ucnhfcG5baV1bal0gPQogCQkJCQkJCXNlcVtsZW4gLSBqIC0gMV07CisJCQlrZXktPmZsYWdzIHw9IEtFWV9GTEFHX0NJUEhFUl9TQ0hFTUU7CiAJCX0KIAl9CiAJbWVtY3B5KGtleS0+Y29uZi5rZXksIGtleV9kYXRhLCBrZXlfbGVuKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9rZXkuaCBiL25ldC9tYWM4MDIxMS9rZXkuaAppbmRleCBkNTdhOTkxNS4uYzVhMzE4MyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2tleS5oCisrKyBiL25ldC9tYWM4MDIxMS9rZXkuaApAQCAtMzAsMTAgKzMwLDEyIEBACiAgKiBAS0VZX0ZMQUdfVVBMT0FERURfVE9fSEFSRFdBUkU6IEluZGljYXRlcyB0aGF0IHRoaXMga2V5IGlzIHByZXNlbnQKICAqCWluIHRoZSBoYXJkd2FyZSBmb3IgVFggY3J5cHRvIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KICAqIEBLRVlfRkxBR19UQUlOVEVEOiBLZXkgaXMgdGFpbnRlZCBhbmQgcGFja2V0cyBzaG91bGQgYmUgZHJvcHBlZC4KKyAqIEBLRVlfRkxBR19DSVBIRVJfU0NIRU1FOiBUaGlzIGtleSBpcyBmb3IgYSBoYXJkd2FyZSBjaXBoZXIgc2NoZW1lCiAgKi8KIGVudW0gaWVlZTgwMjExX2ludGVybmFsX2tleV9mbGFncyB7CiAJS0VZX0ZMQUdfVVBMT0FERURfVE9fSEFSRFdBUkUJPSBCSVQoMCksCiAJS0VZX0ZMQUdfVEFJTlRFRAkJPSBCSVQoMSksCisJS0VZX0ZMQUdfQ0lQSEVSX1NDSEVNRQkJPSBCSVQoMiksCiB9OwogCiBlbnVtIGllZWU4MDIxMV9pbnRlcm5hbF90a2lwX3N0YXRlIHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tYWluLmMgYi9uZXQvbWFjODAyMTEvbWFpbi5jCmluZGV4IDVlMDlkMzUuLmRmMzA1MWQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tYWluLmMKKysrIGIvbmV0L21hYzgwMjExL21haW4uYwpAQCAtNTU3LDYgKzU1Nyw5IEBACiAKIAlsb2NhbCA9IHdpcGh5X3ByaXYod2lwaHkpOwogCisJaWYgKHN0YV9pbmZvX2luaXQobG9jYWwpKQorCQlnb3RvIGVycl9mcmVlOworCiAJbG9jYWwtPmh3LndpcGh5ID0gd2lwaHk7CiAKIAlsb2NhbC0+aHcucHJpdiA9IChjaGFyICopbG9jYWwgKyBBTElHTihzaXplb2YoKmxvY2FsKSwgTkVUREVWX0FMSUdOKTsKQEAgLTYyOSw4ICs2MzIsNiBAQAogCXNwaW5fbG9ja19pbml0KCZsb2NhbC0+YWNrX3N0YXR1c19sb2NrKTsKIAlpZHJfaW5pdCgmbG9jYWwtPmFja19zdGF0dXNfZnJhbWVzKTsKIAotCXN0YV9pbmZvX2luaXQobG9jYWwpOwotCiAJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9NQVhfUVVFVUVTOyBpKyspIHsKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbG9jYWwtPnBlbmRpbmdbaV0pOwogCQlhdG9taWNfc2V0KCZsb2NhbC0+YWdnX3F1ZXVlX3N0b3BbaV0sIDApOwpAQCAtNjUwLDYgKzY1MSw5IEBACiAJaWVlZTgwMjExX3JvY19zZXR1cChsb2NhbCk7CiAKIAlyZXR1cm4gJmxvY2FsLT5odzsKKyBlcnJfZnJlZToKKwl3aXBoeV9mcmVlKHdpcGh5KTsKKwlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX2FsbG9jX2h3X25tKTsKIApAQCAtMTAzNSw2ICsxMDM5LDkgQEAKIAogCWxvY2FsLT5keW5hbWljX3BzX2ZvcmNlZF90aW1lb3V0ID0gLTE7CiAKKwlpZiAoIWxvY2FsLT5ody50eHFfYWNfbWF4X3BlbmRpbmcpCisJCWxvY2FsLT5ody50eHFfYWNfbWF4X3BlbmRpbmcgPSA2NDsKKwogCXJlc3VsdCA9IGllZWU4MDIxMV93ZXBfaW5pdChsb2NhbCk7CiAJaWYgKHJlc3VsdCA8IDApCiAJCXdpcGh5X2RlYnVnKGxvY2FsLT5ody53aXBoeSwgIkZhaWxlZCB0byBpbml0aWFsaXplIHdlcDogJWRcbiIsCkBAIC0xMDU3LDcgKzEwNjQsNyBAQAogCS8qIGFkZCBvbmUgZGVmYXVsdCBTVEEgaW50ZXJmYWNlIGlmIHN1cHBvcnRlZCAqLwogCWlmIChsb2NhbC0+aHcud2lwaHktPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSAmJgogCSAgICAhKGh3LT5mbGFncyAmIElFRUU4MDIxMV9IV19OT19BVVRPX1ZJRikpIHsKLQkJcmVzdWx0ID0gaWVlZTgwMjExX2lmX2FkZChsb2NhbCwgIndsYW4lZCIsIE5VTEwsCisJCXJlc3VsdCA9IGllZWU4MDIxMV9pZl9hZGQobG9jYWwsICJ3bGFuJWQiLCBORVRfTkFNRV9FTlVNLCBOVUxMLAogCQkJCQkgIE5MODAyMTFfSUZUWVBFX1NUQVRJT04sIE5VTEwpOwogCQlpZiAocmVzdWx0KQogCQkJd2lwaHlfd2Fybihsb2NhbC0+aHcud2lwaHksCkBAIC0xMTczLDcgKzExODAsNiBAQAogCiAJZGVzdHJveV93b3JrcXVldWUobG9jYWwtPndvcmtxdWV1ZSk7CiAJd2lwaHlfdW5yZWdpc3Rlcihsb2NhbC0+aHcud2lwaHkpOwotCXN0YV9pbmZvX3N0b3AobG9jYWwpOwogCWllZWU4MDIxMV93ZXBfZnJlZShsb2NhbCk7CiAJaWVlZTgwMjExX2xlZF9leGl0KGxvY2FsKTsKIAlrZnJlZShsb2NhbC0+aW50X3NjYW5fcmVxKTsKQEAgLTEyMDEsOCArMTIwNyw2IEBACiAJCSAgICAgaWVlZTgwMjExX2ZyZWVfYWNrX2ZyYW1lLCBOVUxMKTsKIAlpZHJfZGVzdHJveSgmbG9jYWwtPmFja19zdGF0dXNfZnJhbWVzKTsKIAotCWtmcmVlKHJjdV9hY2Nlc3NfcG9pbnRlcihsb2NhbC0+dHhfbGF0ZW5jeSkpOwotCiAJc3RhX2luZm9fc3RvcChsb2NhbCk7CiAKIAl3aXBoeV9mcmVlKGxvY2FsLT5ody53aXBoeSk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaC5jIGIvbmV0L21hYzgwMjExL21lc2guYwppbmRleCAwYzhiMmE3Li5kNDY4NDI0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaC5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoLmMKQEAgLTUyMCw3ICs1MjAsNyBAQAogCX0gZWxzZSB7CiAJCSpmYyB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTKTsKIAkJLyogUkEgVEEgREEgU0EgKi8KLQkJbWVtc2V0KGhkci0+YWRkcjEsIDAsIEVUSF9BTEVOKTsgICAvKiBSQSBpcyByZXNvbHZlZCBsYXRlciAqLworCQlldGhfemVyb19hZGRyKGhkci0+YWRkcjEpOyAgIC8qIFJBIGlzIHJlc29sdmVkIGxhdGVyICovCiAJCW1lbWNweShoZHItPmFkZHIyLCBtZXNoc2EsIEVUSF9BTEVOKTsKIAkJbWVtY3B5KGhkci0+YWRkcjMsIG1lc2hkYSwgRVRIX0FMRU4pOwogCQltZW1jcHkoaGRyLT5hZGRyNCwgbWVzaHNhLCBFVEhfQUxFTik7CkBAIC01NzQsNyArNTc0LDggQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2lmX21lc2ggKmlmbXNoID0gJnNkYXRhLT51Lm1lc2g7CiAJdTMyIGNoYW5nZWQ7CiAKLQlpZWVlODAyMTFfc3RhX2V4cGlyZShzZGF0YSwgaWZtc2gtPm1zaGNmZy5wbGlua190aW1lb3V0ICogSFopOworCWlmIChpZm1zaC0+bXNoY2ZnLnBsaW5rX3RpbWVvdXQgPiAwKQorCQlpZWVlODAyMTFfc3RhX2V4cGlyZShzZGF0YSwgaWZtc2gtPm1zaGNmZy5wbGlua190aW1lb3V0ICogSFopOwogCW1lc2hfcGF0aF9leHBpcmUoc2RhdGEpOwogCiAJY2hhbmdlZCA9IG1lc2hfYWNjZXB0X3BsaW5rc191cGRhdGUoc2RhdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfcGxpbmsuYyBiL25ldC9tYWM4MDIxMS9tZXNoX3BsaW5rLmMKaW5kZXggYjQ4OGUxOC4uNjBkNzM3ZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21lc2hfcGxpbmsuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9wbGluay5jCkBAIC0xNyw3ICsxNyw3IEBACiAjZGVmaW5lIFBMSU5LX0dFVF9QTElEKHApIChwICsgNCkKIAogI2RlZmluZSBtb2RfcGxpbmtfdGltZXIocywgdCkgKG1vZF90aW1lcigmcy0+cGxpbmtfdGltZXIsIFwKLQkJCQlqaWZmaWVzICsgSFogKiB0IC8gMTAwMCkpCisJCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModCkpKQogCiBlbnVtIHBsaW5rX2V2ZW50IHsKIAlQTElOS19VTkRFRklORUQsCkBAIC0zODIsNiArMzgyLDcgQEAKIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQgPSBpZWVlODAyMTFfZ2V0X3NkYXRhX2JhbmQoc2RhdGEpOwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwogCXUzMiByYXRlcywgYmFzaWNfcmF0ZXMgPSAwLCBjaGFuZ2VkID0gMDsKKwllbnVtIGllZWU4MDIxMV9zdGFfcnhfYmFuZHdpZHRoIGJ3ID0gc3RhLT5zdGEuYmFuZHdpZHRoOwogCiAJc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2JhbmRdOwogCXJhdGVzID0gaWVlZTgwMjExX3N0YV9nZXRfcmF0ZXMoc2RhdGEsIGVsZW1zLCBiYW5kLCAmYmFzaWNfcmF0ZXMpOwpAQCAtNDAxLDYgKzQwMiw5IEBACiAJCQkJCSAgICAgIGVsZW1zLT5odF9jYXBfZWxlbSwgc3RhKSkKIAkJY2hhbmdlZCB8PSBJRUVFODAyMTFfUkNfQldfQ0hBTkdFRDsKIAorCWlmIChidyAhPSBzdGEtPnN0YS5iYW5kd2lkdGgpCisJCWNoYW5nZWQgfD0gSUVFRTgwMjExX1JDX0JXX0NIQU5HRUQ7CisKIAkvKiBIVCBwZWVyIGlzIG9wZXJhdGluZyAyME1Iei1vbmx5ICovCiAJaWYgKGVsZW1zLT5odF9vcGVyYXRpb24gJiYKIAkgICAgIShlbGVtcy0+aHRfb3BlcmF0aW9uLT5odF9wYXJhbSAmCkBAIC02MjEsOSArNjI1LDkgQEAKIAkJCQkgICAgc3RhLT5sbGlkLCBzdGEtPnBsaWQsIHJlYXNvbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtZXNoX3BsaW5rX3RpbWVyX3NldChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgaW50IHRpbWVvdXQpCitzdGF0aWMgaW5saW5lIHZvaWQgbWVzaF9wbGlua190aW1lcl9zZXQoc3RydWN0IHN0YV9pbmZvICpzdGEsIHUzMiB0aW1lb3V0KQogewotCXN0YS0+cGxpbmtfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogKiB0aW1lb3V0IC8gMTAwMCk7CisJc3RhLT5wbGlua190aW1lci5leHBpcmVzID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCk7CiAJc3RhLT5wbGlua190aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIHN0YTsKIAlzdGEtPnBsaW5rX3RpbWVyLmZ1bmN0aW9uID0gbWVzaF9wbGlua190aW1lcjsKIAlzdGEtPnBsaW5rX3RpbWVvdXQgPSB0aW1lb3V0OwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21sbWUuYyBiL25ldC9tYWM4MDIxMS9tbG1lLmMKaW5kZXggMTBhYzYzMi4uMjYwNTNiZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL21sbWUuYworKysgYi9uZXQvbWFjODAyMTEvbWxtZS5jCkBAIC0xMTUwLDYgKzExNTAsMTcgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlmIChjZmc4MDIxMV9jaGFuZGVmX2lkZW50aWNhbCgmY3NhX2llLmNoYW5kZWYsCisJCQkJICAgICAgICZzZGF0YS0+dmlmLmJzc19jb25mLmNoYW5kZWYpKSB7CisJCWlmIChpZm1nZC0+Y3NhX2lnbm9yZWRfc2FtZV9jaGFuKQorCQkJcmV0dXJuOworCQlzZGF0YV9pbmZvKHNkYXRhLAorCQkJICAgIkFQICVwTSB0cmllcyB0byBjaGFuc3dpdGNoIHRvIHNhbWUgY2hhbm5lbCwgaWdub3JlXG4iLAorCQkJICAgaWZtZ2QtPmFzc29jaWF0ZWQtPmJzc2lkKTsKKwkJaWZtZ2QtPmNzYV9pZ25vcmVkX3NhbWVfY2hhbiA9IHRydWU7CisJCXJldHVybjsKKwl9CisKIAltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKIAltdXRleF9sb2NrKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOwogCWNvbmYgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHNkYXRhLT52aWYuY2hhbmN0eF9jb25mLApAQCAtMTE1NywxMSArMTE2OCw3IEBACiAJaWYgKCFjb25mKSB7CiAJCXNkYXRhX2luZm8oc2RhdGEsCiAJCQkgICAibm8gY2hhbm5lbCBjb250ZXh0IGFzc2lnbmVkIHRvIHZpZj8sIGRpc2Nvbm5lY3RpbmdcbiIpOwotCQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LAotCQkJCSAgICAgJmlmbWdkLT5jc2FfY29ubmVjdGlvbl9kcm9wX3dvcmspOwotCQltdXRleF91bmxvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7Ci0JCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7Ci0JCXJldHVybjsKKwkJZ290byBkcm9wX2Nvbm5lY3Rpb247CiAJfQogCiAJY2hhbmN0eCA9IGNvbnRhaW5lcl9vZihjb25mLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHgsIGNvbmYpOwpAQCAtMTE3MCwxMSArMTE3Nyw3IEBACiAJICAgICEobG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX0NIQU5DVFhfU1RBX0NTQSkpIHsKIAkJc2RhdGFfaW5mbyhzZGF0YSwKIAkJCSAgICJkcml2ZXIgZG9lc24ndCBzdXBwb3J0IGNoYW4tc3dpdGNoIHdpdGggY2hhbm5lbCBjb250ZXh0c1xuIik7Ci0JCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsCi0JCQkJICAgICAmaWZtZ2QtPmNzYV9jb25uZWN0aW9uX2Ryb3Bfd29yayk7Ci0JCW11dGV4X3VubG9jaygmbG9jYWwtPmNoYW5jdHhfbXR4KTsKLQkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKLQkJcmV0dXJuOworCQlnb3RvIGRyb3BfY29ubmVjdGlvbjsKIAl9CiAKIAljaF9zd2l0Y2gudGltZXN0YW1wID0gdGltZXN0YW1wOwpAQCAtMTE4NiwxMSArMTE4OSw3IEBACiAJaWYgKGRydl9wcmVfY2hhbm5lbF9zd2l0Y2goc2RhdGEsICZjaF9zd2l0Y2gpKSB7CiAJCXNkYXRhX2luZm8oc2RhdGEsCiAJCQkgICAicHJlcGFyaW5nIGZvciBjaGFubmVsIHN3aXRjaCBmYWlsZWQsIGRpc2Nvbm5lY3RpbmdcbiIpOwotCQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LAotCQkJCSAgICAgJmlmbWdkLT5jc2FfY29ubmVjdGlvbl9kcm9wX3dvcmspOwotCQltdXRleF91bmxvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7Ci0JCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7Ci0JCXJldHVybjsKKwkJZ290byBkcm9wX2Nvbm5lY3Rpb247CiAJfQogCiAJcmVzID0gaWVlZTgwMjExX3ZpZl9yZXNlcnZlX2NoYW5jdHgoc2RhdGEsICZjc2FfaWUuY2hhbmRlZiwKQEAgLTExOTksMTcgKzExOTgsMTQgQEAKIAkJc2RhdGFfaW5mbyhzZGF0YSwKIAkJCSAgICJmYWlsZWQgdG8gcmVzZXJ2ZSBjaGFubmVsIGNvbnRleHQgZm9yIGNoYW5uZWwgc3dpdGNoLCBkaXNjb25uZWN0aW5nIChlcnI9JWQpXG4iLAogCQkJICAgcmVzKTsKLQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywKLQkJCQkgICAgICZpZm1nZC0+Y3NhX2Nvbm5lY3Rpb25fZHJvcF93b3JrKTsKLQkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+Y2hhbmN0eF9tdHgpOwotCQltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOwotCQlyZXR1cm47CisJCWdvdG8gZHJvcF9jb25uZWN0aW9uOwogCX0KIAltdXRleF91bmxvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7CiAKIAlzZGF0YS0+dmlmLmNzYV9hY3RpdmUgPSB0cnVlOwogCXNkYXRhLT5jc2FfY2hhbmRlZiA9IGNzYV9pZS5jaGFuZGVmOwogCXNkYXRhLT5jc2FfYmxvY2tfdHggPSBjc2FfaWUubW9kZTsKKwlpZm1nZC0+Y3NhX2lnbm9yZWRfc2FtZV9jaGFuID0gZmFsc2U7CiAKIAlpZiAoc2RhdGEtPmNzYV9ibG9ja190eCkKIAkJaWVlZTgwMjExX3N0b3BfdmlmX3F1ZXVlcyhsb2NhbCwgc2RhdGEsCkBAIC0xMjMyLDYgKzEyMjgsMTEgQEAKIAkJbW9kX3RpbWVyKCZpZm1nZC0+Y2hzd2l0Y2hfdGltZXIsCiAJCQkgIFRVX1RPX0VYUF9USU1FKChjc2FfaWUuY291bnQgLSAxKSAqCiAJCQkJCSBjYnNzLT5iZWFjb25faW50ZXJ2YWwpKTsKKwlyZXR1cm47CisgZHJvcF9jb25uZWN0aW9uOgorCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZpZm1nZC0+Y3NhX2Nvbm5lY3Rpb25fZHJvcF93b3JrKTsKKwltdXRleF91bmxvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7CisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIH0KIAogc3RhdGljIGJvb2wKQEAgLTEzNDcsMTUgKzEzNDgsMTUgQEAKIAkgKi8KIAlpZiAoaGFzXzgwMjExaF9wd3IgJiYKIAkgICAgKCFoYXNfY2lzY29fcHdyIHx8IHB3cl9sZXZlbF84MDIxMWggPD0gcHdyX2xldmVsX2Npc2NvKSkgewotCQlzZGF0YV9pbmZvKHNkYXRhLAotCQkJICAgIkxpbWl0aW5nIFRYIHBvd2VyIHRvICVkICglZCAtICVkKSBkQm0gYXMgYWR2ZXJ0aXNlZCBieSAlcE1cbiIsCi0JCQkgICBwd3JfbGV2ZWxfODAyMTFoLCBjaGFuX3B3ciwgcHdyX3JlZHVjdGlvbl84MDIxMWgsCi0JCQkgICBzZGF0YS0+dS5tZ2QuYnNzaWQpOworCQlzZGF0YV9kYmcoc2RhdGEsCisJCQkgICJMaW1pdGluZyBUWCBwb3dlciB0byAlZCAoJWQgLSAlZCkgZEJtIGFzIGFkdmVydGlzZWQgYnkgJXBNXG4iLAorCQkJICBwd3JfbGV2ZWxfODAyMTFoLCBjaGFuX3B3ciwgcHdyX3JlZHVjdGlvbl84MDIxMWgsCisJCQkgIHNkYXRhLT51Lm1nZC5ic3NpZCk7CiAJCW5ld19hcF9sZXZlbCA9IHB3cl9sZXZlbF84MDIxMWg7CiAJfSBlbHNlIHsgIC8qIGhhc19jaXNjb19wd3IgaXMgYWx3YXlzIHRydWUgaGVyZS4gKi8KLQkJc2RhdGFfaW5mbyhzZGF0YSwKLQkJCSAgICJMaW1pdGluZyBUWCBwb3dlciB0byAlZCBkQm0gYXMgYWR2ZXJ0aXNlZCBieSAlcE1cbiIsCi0JCQkgICBwd3JfbGV2ZWxfY2lzY28sIHNkYXRhLT51Lm1nZC5ic3NpZCk7CisJCXNkYXRhX2RiZyhzZGF0YSwKKwkJCSAgIkxpbWl0aW5nIFRYIHBvd2VyIHRvICVkIGRCbSBhcyBhZHZlcnRpc2VkIGJ5ICVwTVxuIiwKKwkJCSAgcHdyX2xldmVsX2Npc2NvLCBzZGF0YS0+dS5tZ2QuYnNzaWQpOwogCQluZXdfYXBfbGV2ZWwgPSBwd3JfbGV2ZWxfY2lzY287CiAJfQogCkBAIC0xNjIxLDkgKzE2MjIsNiBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gKHZvaWQgKikgZGF0YTsKIAotCWlmIChsb2NhbC0+cXVpZXNjaW5nIHx8IGxvY2FsLT5zdXNwZW5kZWQpCi0JCXJldHVybjsKLQogCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZsb2NhbC0+ZHluYW1pY19wc19lbmFibGVfd29yayk7CiB9CiAKQEAgLTIwMzMsNyArMjAzMSw3IEBACiAJCWllZWU4MDIxMV9mbHVzaF9xdWV1ZXMobG9jYWwsIHNkYXRhLCBmYWxzZSk7CiAKIAkvKiBjbGVhciBic3NpZCBvbmx5IGFmdGVyIGJ1aWxkaW5nIHRoZSBuZWVkZWQgbWdtdCBmcmFtZXMgKi8KLQltZW1zZXQoaWZtZ2QtPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihpZm1nZC0+YnNzaWQpOwogCiAJLyogcmVtb3ZlIEFQIGFuZCBURExTIHBlZXJzICovCiAJc3RhX2luZm9fZmx1c2goc2RhdGEpOwpAQCAtMjA5MCw2ICsyMDg4LDcgQEAKIAogCXNkYXRhLT52aWYuY3NhX2FjdGl2ZSA9IGZhbHNlOwogCWlmbWdkLT5jc2Ffd2FpdGluZ19iY24gPSBmYWxzZTsKKwlpZm1nZC0+Y3NhX2lnbm9yZWRfc2FtZV9jaGFuID0gZmFsc2U7CiAJaWYgKHNkYXRhLT5jc2FfYmxvY2tfdHgpIHsKIAkJaWVlZTgwMjExX3dha2VfdmlmX3F1ZXVlcyhsb2NhbCwgc2RhdGEsCiAJCQkJCSAgSUVFRTgwMjExX1FVRVVFX1NUT1BfUkVBU09OX0NTQSk7CkBAIC0yMjQ3LDcgKzIyNDYsNyBAQAogCQllbHNlCiAJCQlzc2lkX2xlbiA9IHNzaWRbMV07CiAKLQkJaWVlZTgwMjExX3NlbmRfcHJvYmVfcmVxKHNkYXRhLCBzZGF0YS0+dmlmLmFkZHIsIE5VTEwsCisJCWllZWU4MDIxMV9zZW5kX3Byb2JlX3JlcShzZGF0YSwgc2RhdGEtPnZpZi5hZGRyLCBkc3QsCiAJCQkJCSBzc2lkICsgMiwgc3NpZF9sZW4sIE5VTEwsCiAJCQkJCSAwLCAodTMyKSAtMSwgdHJ1ZSwgMCwKIAkJCQkJIGlmbWdkLT5hc3NvY2lhdGVkLT5jaGFubmVsLCBmYWxzZSk7CkBAIC0yMzU5LDYgKzIzNTgsMjQgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX2FwX3Byb2JlcmVxX2dldCk7CiAKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9yZXBvcnRfZGlzY29ubmVjdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkJY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgYm9vbCB0eCwKKwkJCQkJdTE2IHJlYXNvbikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2V2ZW50IGV2ZW50ID0geworCQkudHlwZSA9IE1MTUVfRVZFTlQsCisJCS51Lm1sbWUuZGF0YSA9IHR4ID8gREVBVVRIX1RYX0VWRU5UIDogREVBVVRIX1JYX0VWRU5ULAorCQkudS5tbG1lLnJlYXNvbiA9IHJlYXNvbiwKKwl9OworCisJaWYgKHR4KQorCQljZmc4MDIxMV90eF9tbG1lX21nbXQoc2RhdGEtPmRldiwgYnVmLCBsZW4pOworCWVsc2UKKwkJY2ZnODAyMTFfcnhfbWxtZV9tZ210KHNkYXRhLT5kZXYsIGJ1ZiwgbGVuKTsKKworCWRydl9ldmVudF9jYWxsYmFjayhzZGF0YS0+bG9jYWwsIHNkYXRhLCAmZXZlbnQpOworfQorCiBzdGF0aWMgdm9pZCBfX2llZWU4MDIxMV9kaXNjb25uZWN0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwpAQCAtMjM4NCw4ICsyNDAxLDkgQEAKIAl9CiAJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIAotCWNmZzgwMjExX3R4X21sbWVfbWdtdChzZGF0YS0+ZGV2LCBmcmFtZV9idWYsCi0JCQkgICAgICBJRUVFODAyMTFfREVBVVRIX0ZSQU1FX0xFTik7CisJaWVlZTgwMjExX3JlcG9ydF9kaXNjb25uZWN0KHNkYXRhLCBmcmFtZV9idWYsIHNpemVvZihmcmFtZV9idWYpLCB0cnVlLAorCQkJCSAgICBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSk7CisKIAlzZGF0YV91bmxvY2soc2RhdGEpOwogfQogCkBAIC0yNDY0LDcgKzI0ODIsNyBAQAogCQlkZWxfdGltZXJfc3luYygmc2RhdGEtPnUubWdkLnRpbWVyKTsKIAkJc3RhX2luZm9fZGVzdHJveV9hZGRyKHNkYXRhLCBhdXRoX2RhdGEtPmJzcy0+YnNzaWQpOwogCi0JCW1lbXNldChzZGF0YS0+dS5tZ2QuYnNzaWQsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcihzZGF0YS0+dS5tZ2QuYnNzaWQpOwogCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgQlNTX0NIQU5HRURfQlNTSUQpOwogCQlzZGF0YS0+dS5tZ2QuZmxhZ3MgPSAwOwogCQltdXRleF9sb2NrKCZzZGF0YS0+bG9jYWwtPm10eCk7CkBAIC0yNTA5LDYgKzI1MjcsMTAgQEAKIAl1OCBic3NpZFtFVEhfQUxFTl07CiAJdTE2IGF1dGhfYWxnLCBhdXRoX3RyYW5zYWN0aW9uLCBzdGF0dXNfY29kZTsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2V2ZW50IGV2ZW50ID0geworCQkudHlwZSA9IE1MTUVfRVZFTlQsCisJCS51Lm1sbWUuZGF0YSA9IEFVVEhfRVZFTlQsCisJfTsKIAogCXNkYXRhX2Fzc2VydF9sb2NrKHNkYXRhKTsKIApAQCAtMjU0MSw2ICsyNTYzLDkgQEAKIAkJCSAgIG1nbXQtPnNhLCBzdGF0dXNfY29kZSk7CiAJCWllZWU4MDIxMV9kZXN0cm95X2F1dGhfZGF0YShzZGF0YSwgZmFsc2UpOwogCQljZmc4MDIxMV9yeF9tbG1lX21nbXQoc2RhdGEtPmRldiwgKHU4ICopbWdtdCwgbGVuKTsKKwkJZXZlbnQudS5tbG1lLnN0YXR1cyA9IE1MTUVfREVOSUVEOworCQlldmVudC51Lm1sbWUucmVhc29uID0gc3RhdHVzX2NvZGU7CisJCWRydl9ldmVudF9jYWxsYmFjayhzZGF0YS0+bG9jYWwsIHNkYXRhLCAmZXZlbnQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNTYzLDYgKzI1ODgsOCBAQAogCQlyZXR1cm47CiAJfQogCisJZXZlbnQudS5tbG1lLnN0YXR1cyA9IE1MTUVfU1VDQ0VTUzsKKwlkcnZfZXZlbnRfY2FsbGJhY2soc2RhdGEtPmxvY2FsLCBzZGF0YSwgJmV2ZW50KTsKIAlzZGF0YV9pbmZvKHNkYXRhLCAiYXV0aGVudGljYXRlZFxuIik7CiAJaWZtZ2QtPmF1dGhfZGF0YS0+ZG9uZSA9IHRydWU7CiAJaWZtZ2QtPmF1dGhfZGF0YS0+dGltZW91dCA9IGppZmZpZXMgKyBJRUVFODAyMTFfQVVUSF9XQUlUX0FTU09DOwpAQCAtMjY4MSw3ICsyNzA4LDcgQEAKIAogCWllZWU4MDIxMV9zZXRfZGlzYXNzb2Moc2RhdGEsIDAsIDAsIGZhbHNlLCBOVUxMKTsKIAotCWNmZzgwMjExX3J4X21sbWVfbWdtdChzZGF0YS0+ZGV2LCAodTggKiltZ210LCBsZW4pOworCWllZWU4MDIxMV9yZXBvcnRfZGlzY29ubmVjdChzZGF0YSwgKHU4ICopbWdtdCwgbGVuLCBmYWxzZSwgcmVhc29uX2NvZGUpOwogfQogCiAKQEAgLTI3MDcsNyArMjczNCw3IEBACiAKIAlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKHNkYXRhLCAwLCAwLCBmYWxzZSwgTlVMTCk7CiAKLQljZmc4MDIxMV9yeF9tbG1lX21nbXQoc2RhdGEtPmRldiwgKHU4ICopbWdtdCwgbGVuKTsKKwlpZWVlODAyMTFfcmVwb3J0X2Rpc2Nvbm5lY3Qoc2RhdGEsICh1OCAqKW1nbXQsIGxlbiwgZmFsc2UsIHJlYXNvbl9jb2RlKTsKIH0KIAogc3RhdGljIHZvaWQgaWVlZTgwMjExX2dldF9yYXRlcyhzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKQEAgLTI3NzcsNyArMjgwNCw3IEBACiAJCWRlbF90aW1lcl9zeW5jKCZzZGF0YS0+dS5tZ2QudGltZXIpOwogCQlzdGFfaW5mb19kZXN0cm95X2FkZHIoc2RhdGEsIGFzc29jX2RhdGEtPmJzcy0+YnNzaWQpOwogCi0JCW1lbXNldChzZGF0YS0+dS5tZ2QuYnNzaWQsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcihzZGF0YS0+dS5tZ2QuYnNzaWQpOwogCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgQlNTX0NIQU5HRURfQlNTSUQpOwogCQlzZGF0YS0+dS5tZ2QuZmxhZ3MgPSAwOwogCQltdXRleF9sb2NrKCZzZGF0YS0+bG9jYWwtPm10eCk7CkBAIC0yOTY5LDEwICsyOTk2LDE0IEBACiAKIAlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7CiAKLQlpZiAoaWZtZ2QtPmZsYWdzICYgSUVFRTgwMjExX1NUQV9NRlBfRU5BQkxFRCkKKwlpZiAoaWZtZ2QtPmZsYWdzICYgSUVFRTgwMjExX1NUQV9NRlBfRU5BQkxFRCkgewogCQlzZXRfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9NRlApOworCQlzdGEtPnN0YS5tZnAgPSB0cnVlOworCX0gZWxzZSB7CisJCXN0YS0+c3RhLm1mcCA9IGZhbHNlOworCX0KIAotCXN0YS0+c3RhLndtZSA9IGVsZW1zLndtbV9wYXJhbTsKKwlzdGEtPnN0YS53bWUgPSBlbGVtcy53bW1fcGFyYW0gJiYgbG9jYWwtPmh3LnF1ZXVlcyA+PSBJRUVFODAyMTFfTlVNX0FDUzsKIAogCWVyciA9IHN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FTU09DKTsKIAlpZiAoIWVyciAmJiAhKGlmbWdkLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfQ09OVFJPTF9QT1JUKSkKQEAgLTMwNDIsNiArMzA3MywxMCBAQAogCXU4ICpwb3M7CiAJYm9vbCByZWFzc29jOwogCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2V2ZW50IGV2ZW50ID0geworCQkudHlwZSA9IE1MTUVfRVZFTlQsCisJCS51Lm1sbWUuZGF0YSA9IEFTU09DX0VWRU5ULAorCX07CiAKIAlzZGF0YV9hc3NlcnRfbG9jayhzZGF0YSk7CiAKQEAgLTMwOTMsNiArMzEyOCw5IEBACiAJCXNkYXRhX2luZm8oc2RhdGEsICIlcE0gZGVuaWVkIGFzc29jaWF0aW9uIChjb2RlPSVkKVxuIiwKIAkJCSAgIG1nbXQtPnNhLCBzdGF0dXNfY29kZSk7CiAJCWllZWU4MDIxMV9kZXN0cm95X2Fzc29jX2RhdGEoc2RhdGEsIGZhbHNlKTsKKwkJZXZlbnQudS5tbG1lLnN0YXR1cyA9IE1MTUVfREVOSUVEOworCQlldmVudC51Lm1sbWUucmVhc29uID0gc3RhdHVzX2NvZGU7CisJCWRydl9ldmVudF9jYWxsYmFjayhzZGF0YS0+bG9jYWwsIHNkYXRhLCAmZXZlbnQpOwogCX0gZWxzZSB7CiAJCWlmICghaWVlZTgwMjExX2Fzc29jX3N1Y2Nlc3Moc2RhdGEsIGJzcywgbWdtdCwgbGVuKSkgewogCQkJLyogb29wcyAtLSBpbnRlcm5hbCBlcnJvciAtLSBzZW5kIHRpbWVvdXQgZm9yIG5vdyAqLwpAQCAtMzEwMCw2ICszMTM4LDggQEAKIAkJCWNmZzgwMjExX2Fzc29jX3RpbWVvdXQoc2RhdGEtPmRldiwgYnNzKTsKIAkJCXJldHVybjsKIAkJfQorCQlldmVudC51Lm1sbWUuc3RhdHVzID0gTUxNRV9TVUNDRVNTOworCQlkcnZfZXZlbnRfY2FsbGJhY2soc2RhdGEtPmxvY2FsLCBzZGF0YSwgJmV2ZW50KTsKIAkJc2RhdGFfaW5mbyhzZGF0YSwgImFzc29jaWF0ZWRcbiIpOwogCiAJCS8qCkBAIC0zMjA0LDcgKzMyNDQsOCBAQAogCSgxVUxMIDw8IFdMQU5fRUlEX0NIQU5ORUxfU1dJVENIKSB8CiAJKDFVTEwgPDwgV0xBTl9FSURfUFdSX0NPTlNUUkFJTlQpIHwKIAkoMVVMTCA8PCBXTEFOX0VJRF9IVF9DQVBBQklMSVRZKSB8Ci0JKDFVTEwgPDwgV0xBTl9FSURfSFRfT1BFUkFUSU9OKTsKKwkoMVVMTCA8PCBXTEFOX0VJRF9IVF9PUEVSQVRJT04pIHwKKwkoMVVMTCA8PCBXTEFOX0VJRF9FWFRfQ0hBTlNXSVRDSF9BTk4pOwogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfcnhfbWdtdF9iZWFjb24oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHNpemVfdCBsZW4sCkBAIC0zMzAxLDYgKzMzNDIsOSBAQAogCSAgICBpZm1nZC0+Y291bnRfYmVhY29uX3NpZ25hbCA+PSBJRUVFODAyMTFfU0lHTkFMX0FWRV9NSU5fQ09VTlQpIHsKIAkJaW50IHNpZyA9IGlmbWdkLT5hdmVfYmVhY29uX3NpZ25hbDsKIAkJaW50IGxhc3Rfc2lnID0gaWZtZ2QtPmxhc3RfYXZlX2JlYWNvbl9zaWduYWw7CisJCXN0cnVjdCBpZWVlODAyMTFfZXZlbnQgZXZlbnQgPSB7CisJCQkudHlwZSA9IFJTU0lfRVZFTlQsCisJCX07CiAKIAkJLyoKIAkJICogaWYgc2lnbmFsIGNyb3NzZXMgZWl0aGVyIG9mIHRoZSBib3VuZGFyaWVzLCBpbnZva2UgY2FsbGJhY2sKQEAgLTMzMDksMTIgKzMzNTMsMTQgQEAKIAkJaWYgKHNpZyA+IGlmbWdkLT5yc3NpX21heF90aG9sZCAmJgogCQkgICAgKGxhc3Rfc2lnIDw9IGlmbWdkLT5yc3NpX21pbl90aG9sZCB8fCBsYXN0X3NpZyA9PSAwKSkgewogCQkJaWZtZ2QtPmxhc3RfYXZlX2JlYWNvbl9zaWduYWwgPSBzaWc7Ci0JCQlkcnZfcnNzaV9jYWxsYmFjayhsb2NhbCwgc2RhdGEsIFJTU0lfRVZFTlRfSElHSCk7CisJCQlldmVudC51LnJzc2kuZGF0YSA9IFJTU0lfRVZFTlRfSElHSDsKKwkJCWRydl9ldmVudF9jYWxsYmFjayhsb2NhbCwgc2RhdGEsICZldmVudCk7CiAJCX0gZWxzZSBpZiAoc2lnIDwgaWZtZ2QtPnJzc2lfbWluX3Rob2xkICYmCiAJCQkgICAobGFzdF9zaWcgPj0gaWZtZ2QtPnJzc2lfbWF4X3Rob2xkIHx8CiAJCQkgICBsYXN0X3NpZyA9PSAwKSkgewogCQkJaWZtZ2QtPmxhc3RfYXZlX2JlYWNvbl9zaWduYWwgPSBzaWc7Ci0JCQlkcnZfcnNzaV9jYWxsYmFjayhsb2NhbCwgc2RhdGEsIFJTU0lfRVZFTlRfTE9XKTsKKwkJCWV2ZW50LnUucnNzaS5kYXRhID0gUlNTSV9FVkVOVF9MT1c7CisJCQlkcnZfZXZlbnRfY2FsbGJhY2sobG9jYWwsIHNkYXRhLCAmZXZlbnQpOwogCQl9CiAJfQogCkBAIC0zNDE5LDYgKzM0NjUsMjYgQEAKIAlpZiAoaWZtZ2QtPmNzYV93YWl0aW5nX2JjbikKIAkJaWVlZTgwMjExX2Noc3dpdGNoX3Bvc3RfYmVhY29uKHNkYXRhKTsKIAorCS8qCisJICogVXBkYXRlIGJlYWNvbiB0aW1pbmcgYW5kIGR0aW0gY291bnQgb24gZXZlcnkgYmVhY29uIGFwcGVhcmFuY2UuIFRoaXMKKwkgKiB3aWxsIGFsbG93IHRoZSBkcml2ZXIgdG8gdXNlIHRoZSBtb3N0IHVwZGF0ZWQgdmFsdWVzLiBEbyBpdCBiZWZvcmUKKwkgKiBjb21wYXJpbmcgdGhpcyBvbmUgd2l0aCBsYXN0IHJlY2VpdmVkIGJlYWNvbi4KKwkgKiBJTVBPUlRBTlQ6IFRoZXNlIHBhcmFtZXRlcnMgd291bGQgcG9zc2libHkgYmUgb3V0IG9mIHN5bmMgYnkgdGhlIHRpbWUKKwkgKiB0aGUgZHJpdmVyIHdpbGwgdXNlIHRoZW0uIFRoZSBzeW5jaHJvbml6ZWQgdmlldyBpcyBjdXJyZW50bHkKKwkgKiBndWFyYW50ZWVkIG9ubHkgaW4gY2VydGFpbiBjYWxsYmFja3MuCisJICovCisJaWYgKGxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV19USU1JTkdfQkVBQ09OX09OTFkpIHsKKwkJc2RhdGEtPnZpZi5ic3NfY29uZi5zeW5jX3RzZiA9CisJCQlsZTY0X3RvX2NwdShtZ210LT51LmJlYWNvbi50aW1lc3RhbXApOworCQlzZGF0YS0+dmlmLmJzc19jb25mLnN5bmNfZGV2aWNlX3RzID0KKwkJCXJ4X3N0YXR1cy0+ZGV2aWNlX3RpbWVzdGFtcDsKKwkJaWYgKGVsZW1zLnRpbSkKKwkJCXNkYXRhLT52aWYuYnNzX2NvbmYuc3luY19kdGltX2NvdW50ID0KKwkJCQllbGVtcy50aW0tPmR0aW1fY291bnQ7CisJCWVsc2UKKwkJCXNkYXRhLT52aWYuYnNzX2NvbmYuc3luY19kdGltX2NvdW50ID0gMDsKKwl9CisKIAlpZiAobmNyYyA9PSBpZm1nZC0+YmVhY29uX2NyYyAmJiBpZm1nZC0+YmVhY29uX2NyY192YWxpZCkKIAkJcmV0dXJuOwogCWlmbWdkLT5iZWFjb25fY3JjID0gbmNyYzsKQEAgLTM0NDYsMTggKzM1MTIsNiBAQAogCQllbHNlCiAJCQlic3NfY29uZi0+ZHRpbV9wZXJpb2QgPSAxOwogCi0JCWlmIChsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTFfSFdfVElNSU5HX0JFQUNPTl9PTkxZKSB7Ci0JCQlzZGF0YS0+dmlmLmJzc19jb25mLnN5bmNfdHNmID0KLQkJCQlsZTY0X3RvX2NwdShtZ210LT51LmJlYWNvbi50aW1lc3RhbXApOwotCQkJc2RhdGEtPnZpZi5ic3NfY29uZi5zeW5jX2RldmljZV90cyA9Ci0JCQkJcnhfc3RhdHVzLT5kZXZpY2VfdGltZXN0YW1wOwotCQkJaWYgKGVsZW1zLnRpbSkKLQkJCQlzZGF0YS0+dmlmLmJzc19jb25mLnN5bmNfZHRpbV9jb3VudCA9Ci0JCQkJCWVsZW1zLnRpbS0+ZHRpbV9jb3VudDsKLQkJCWVsc2UKLQkJCQlzZGF0YS0+dmlmLmJzc19jb25mLnN5bmNfZHRpbV9jb3VudCA9IDA7Ci0JCX0KLQogCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0JFQUNPTl9JTkZPOwogCQlpZm1nZC0+aGF2ZV9iZWFjb24gPSB0cnVlOwogCkBAIC0zNDg4LDggKzM1NDIsOSBAQAogCQlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKHNkYXRhLCBJRUVFODAyMTFfU1RZUEVfREVBVVRILAogCQkJCSAgICAgICBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORywKIAkJCQkgICAgICAgdHJ1ZSwgZGVhdXRoX2J1Zik7Ci0JCWNmZzgwMjExX3R4X21sbWVfbWdtdChzZGF0YS0+ZGV2LCBkZWF1dGhfYnVmLAotCQkJCSAgICAgIHNpemVvZihkZWF1dGhfYnVmKSk7CisJCWllZWU4MDIxMV9yZXBvcnRfZGlzY29ubmVjdChzZGF0YSwgZGVhdXRoX2J1ZiwKKwkJCQkJICAgIHNpemVvZihkZWF1dGhfYnVmKSwgdHJ1ZSwKKwkJCQkJICAgIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzYwNyw4ICszNjYyLDggQEAKIAlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKHNkYXRhLCBJRUVFODAyMTFfU1RZUEVfREVBVVRILCByZWFzb24sCiAJCQkgICAgICAgdHgsIGZyYW1lX2J1Zik7CiAKLQljZmc4MDIxMV90eF9tbG1lX21nbXQoc2RhdGEtPmRldiwgZnJhbWVfYnVmLAotCQkJICAgICAgSUVFRTgwMjExX0RFQVVUSF9GUkFNRV9MRU4pOworCWllZWU4MDIxMV9yZXBvcnRfZGlzY29ubmVjdChzZGF0YSwgZnJhbWVfYnVmLCBzaXplb2YoZnJhbWVfYnVmKSwgdHJ1ZSwKKwkJCQkgICAgcmVhc29uKTsKIH0KIAogc3RhdGljIGludCBpZWVlODAyMTFfcHJvYmVfYXV0aChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKQEAgLTM4MDIsMTIgKzM4NTcsMTggQEAKIAkJCWllZWU4MDIxMV9kZXN0cm95X2F1dGhfZGF0YShzZGF0YSwgZmFsc2UpOwogCQl9IGVsc2UgaWYgKGllZWU4MDIxMV9wcm9iZV9hdXRoKHNkYXRhKSkgewogCQkJdTggYnNzaWRbRVRIX0FMRU5dOworCQkJc3RydWN0IGllZWU4MDIxMV9ldmVudCBldmVudCA9IHsKKwkJCQkudHlwZSA9IE1MTUVfRVZFTlQsCisJCQkJLnUubWxtZS5kYXRhID0gQVVUSF9FVkVOVCwKKwkJCQkudS5tbG1lLnN0YXR1cyA9IE1MTUVfVElNRU9VVCwKKwkJCX07CiAKIAkJCW1lbWNweShic3NpZCwgaWZtZ2QtPmF1dGhfZGF0YS0+YnNzLT5ic3NpZCwgRVRIX0FMRU4pOwogCiAJCQlpZWVlODAyMTFfZGVzdHJveV9hdXRoX2RhdGEoc2RhdGEsIGZhbHNlKTsKIAogCQkJY2ZnODAyMTFfYXV0aF90aW1lb3V0KHNkYXRhLT5kZXYsIGJzc2lkKTsKKwkJCWRydl9ldmVudF9jYWxsYmFjayhzZGF0YS0+bG9jYWwsIHNkYXRhLCAmZXZlbnQpOwogCQl9CiAJfSBlbHNlIGlmIChpZm1nZC0+YXV0aF9kYXRhICYmIGlmbWdkLT5hdXRoX2RhdGEtPnRpbWVvdXRfc3RhcnRlZCkKIAkJcnVuX2FnYWluKHNkYXRhLCBpZm1nZC0+YXV0aF9kYXRhLT50aW1lb3V0KTsKQEAgLTM4MTcsOSArMzg3OCwxNSBAQAogCQlpZiAoKGlmbWdkLT5hc3NvY19kYXRhLT5uZWVkX2JlYWNvbiAmJiAhaWZtZ2QtPmhhdmVfYmVhY29uKSB8fAogCQkgICAgaWVlZTgwMjExX2RvX2Fzc29jKHNkYXRhKSkgewogCQkJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzID0gaWZtZ2QtPmFzc29jX2RhdGEtPmJzczsKKwkJCXN0cnVjdCBpZWVlODAyMTFfZXZlbnQgZXZlbnQgPSB7CisJCQkJLnR5cGUgPSBNTE1FX0VWRU5ULAorCQkJCS51Lm1sbWUuZGF0YSA9IEFTU09DX0VWRU5ULAorCQkJCS51Lm1sbWUuc3RhdHVzID0gTUxNRV9USU1FT1VULAorCQkJfTsKIAogCQkJaWVlZTgwMjExX2Rlc3Ryb3lfYXNzb2NfZGF0YShzZGF0YSwgZmFsc2UpOwogCQkJY2ZnODAyMTFfYXNzb2NfdGltZW91dChzZGF0YS0+ZGV2LCBic3MpOworCQkJZHJ2X2V2ZW50X2NhbGxiYWNrKHNkYXRhLT5sb2NhbCwgc2RhdGEsICZldmVudCk7CiAJCX0KIAl9IGVsc2UgaWYgKGlmbWdkLT5hc3NvY19kYXRhICYmIGlmbWdkLT5hc3NvY19kYXRhLT50aW1lb3V0X3N0YXJ0ZWQpCiAJCXJ1bl9hZ2FpbihzZGF0YSwgaWZtZ2QtPmFzc29jX2RhdGEtPnRpbWVvdXQpOwpAQCAtMzg5MSwxMiArMzk1OCw4IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPQogCQkoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqKSBkYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2QgPSAmc2RhdGEtPnUubWdkOwogCi0JaWYgKGxvY2FsLT5xdWllc2NpbmcpCi0JCXJldHVybjsKLQogCWlmIChzZGF0YS0+dmlmLmNzYV9hY3RpdmUgJiYgIWlmbWdkLT5jc2Ffd2FpdGluZ19iY24pCiAJCXJldHVybjsKIApAQCAtMzkxMiw5ICszOTc1LDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2lmX21hbmFnZWQgKmlmbWdkID0gJnNkYXRhLT51Lm1nZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAotCWlmIChsb2NhbC0+cXVpZXNjaW5nKQotCQlyZXR1cm47Ci0KIAlpZiAoc2RhdGEtPnZpZi5jc2FfYWN0aXZlICYmICFpZm1nZC0+Y3NhX3dhaXRpbmdfYmNuKQogCQlyZXR1cm47CiAKQEAgLTM5NzcsNiArNDAzNywzNCBAQAogCQkJCSAgICAgIElFRUU4MDIxMV9ERUFVVEhfRlJBTUVfTEVOKTsKIAl9CiAKKwkvKiBUaGlzIGlzIGEgYml0IG9mIGEgaGFjayAtIHdlIHNob3VsZCBmaW5kIGEgYmV0dGVyIGFuZCBtb3JlIGdlbmVyaWMKKwkgKiBzb2x1dGlvbiB0byB0aGlzLiBOb3JtYWxseSB3aGVuIHN1c3BlbmRpbmcsIGNmZzgwMjExIHdpbGwgaW4gZmFjdAorCSAqIGRlYXV0aGVudGljYXRlLiBIb3dldmVyLCBpdCBkb2Vzbid0IChhbmQgY2Fubm90KSBzdG9wIGFuIG9uZ29pbmcKKwkgKiBhdXRoIChub3Qgc28gaW1wb3J0YW50KSBvciBhc3NvYyAodGhpcyBpcyB0aGUgcHJvYmxlbSkgcHJvY2Vzcy4KKwkgKgorCSAqIEFzIGEgY29uc2VxdWVuY2UsIGl0IGNhbiBoYXBwZW4gdGhhdCB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2YgYm90aAorCSAqIGFzc29jaWF0aW5nIGFuZCBzdXNwZW5kaW5nLCBhbmQgcmVjZWl2ZSBhbiBhc3NvY2lhdGlvbiByZXNwb25zZQorCSAqIGFmdGVyIGNmZzgwMjExIGhhcyBjaGVja2VkIGlmIGl0IG5lZWRzIHRvIGRpc2Nvbm5lY3QsIGJ1dCBiZWZvcmUKKwkgKiB3ZSBhY3R1YWxseSBzZXQgdGhlIGZsYWcgdG8gZHJvcCBpbmNvbWluZyBmcmFtZXMuIFRoaXMgd2lsbCB0aGVuCisJICogY2F1c2UgdGhlIHdvcmtxdWV1ZSBmbHVzaCB0byBwcm9jZXNzIHRoZSBhc3NvY2lhdGlvbiByZXNwb25zZSBpbgorCSAqIHRoZSBzdXNwZW5kLCByZXN1bHRpbmcgaW4gYSBzdWNjZXNzZnVsIGFzc29jaWF0aW9uIGp1c3QgYmVmb3JlIGl0CisJICogdHJpZXMgdG8gcmVtb3ZlIHRoZSBpbnRlcmZhY2UgZnJvbSB0aGUgZHJpdmVyLCB3aGljaCBub3cgdGhvdWdoCisJICogaGFzIGEgY2hhbm5lbCBjb250ZXh0IGFzc2lnbmVkIC4uLiB0aGlzIHJlc3VsdHMgaW4gaXNzdWVzLgorCSAqCisJICogVG8gd29yayBhcm91bmQgdGhpcyAoZm9yIG5vdykgc2ltcGx5IGRlYXV0aCBoZXJlIGFnYWluIGlmIHdlJ3JlCisJICogbm93IGNvbm5lY3RlZC4KKwkgKi8KKwlpZiAoaWZtZ2QtPmFzc29jaWF0ZWQgJiYgIXNkYXRhLT5sb2NhbC0+d293bGFuKSB7CisJCXU4IGJzc2lkW0VUSF9BTEVOXTsKKwkJc3RydWN0IGNmZzgwMjExX2RlYXV0aF9yZXF1ZXN0IHJlcSA9IHsKKwkJCS5yZWFzb25fY29kZSA9IFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HLAorCQkJLmJzc2lkID0gYnNzaWQsCisJCX07CisKKwkJbWVtY3B5KGJzc2lkLCBpZm1nZC0+YXNzb2NpYXRlZC0+YnNzaWQsIEVUSF9BTEVOKTsKKwkJaWVlZTgwMjExX21nZF9kZWF1dGgoc2RhdGEsICZyZXEpOworCX0KKwogCXNkYXRhX3VubG9jayhzZGF0YSk7CiB9CiAKQEAgLTQzNjUsNiArNDQ1MywxMCBAQAogCX0gZWxzZQogCQlXQVJOX09OX09OQ0UoIWV0aGVyX2FkZHJfZXF1YWwoaWZtZ2QtPmJzc2lkLCBjYnNzLT5ic3NpZCkpOwogCisJLyogQ2FuY2VsIHNjYW4gdG8gZW5zdXJlIHRoYXQgbm90aGluZyBpbnRlcmZlcmVzIHdpdGggY29ubmVjdGlvbiAqLworCWlmIChsb2NhbC0+c2Nhbm5pbmcpCisJCWllZWU4MDIxMV9zY2FuX2NhbmNlbChsb2NhbCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDQ1Myw4ICs0NTQ1LDkgQEAKIAkJCQkgICAgICAgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQsCiAJCQkJICAgICAgIGZhbHNlLCBmcmFtZV9idWYpOwogCi0JCWNmZzgwMjExX3R4X21sbWVfbWdtdChzZGF0YS0+ZGV2LCBmcmFtZV9idWYsCi0JCQkJICAgICAgc2l6ZW9mKGZyYW1lX2J1ZikpOworCQlpZWVlODAyMTFfcmVwb3J0X2Rpc2Nvbm5lY3Qoc2RhdGEsIGZyYW1lX2J1ZiwKKwkJCQkJICAgIHNpemVvZihmcmFtZV9idWYpLCB0cnVlLAorCQkJCQkgICAgV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQpOwogCX0KIAogCXNkYXRhX2luZm8oc2RhdGEsICJhdXRoZW50aWNhdGUgd2l0aCAlcE1cbiIsIHJlcS0+YnNzLT5ic3NpZCk7CkBAIC00NDc0LDcgKzQ1NjcsNyBAQAogCXJldHVybiAwOwogCiAgZXJyX2NsZWFyOgotCW1lbXNldChpZm1nZC0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwlldGhfemVyb19hZGRyKGlmbWdkLT5ic3NpZCk7CiAJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIEJTU19DSEFOR0VEX0JTU0lEKTsKIAlpZm1nZC0+YXV0aF9kYXRhID0gTlVMTDsKICBlcnJfZnJlZToKQEAgLTQ1NTQsOCArNDY0Nyw5IEBACiAJCQkJICAgICAgIFdMQU5fUkVBU09OX1VOU1BFQ0lGSUVELAogCQkJCSAgICAgICBmYWxzZSwgZnJhbWVfYnVmKTsKIAotCQljZmc4MDIxMV90eF9tbG1lX21nbXQoc2RhdGEtPmRldiwgZnJhbWVfYnVmLAotCQkJCSAgICAgIHNpemVvZihmcmFtZV9idWYpKTsKKwkJaWVlZTgwMjExX3JlcG9ydF9kaXNjb25uZWN0KHNkYXRhLCBmcmFtZV9idWYsCisJCQkJCSAgICBzaXplb2YoZnJhbWVfYnVmKSwgdHJ1ZSwKKwkJCQkJICAgIFdMQU5fUkVBU09OX1VOU1BFQ0lGSUVEKTsKIAl9CiAKIAlpZiAoaWZtZ2QtPmF1dGhfZGF0YSAmJiAhaWZtZ2QtPmF1dGhfZGF0YS0+ZG9uZSkgewpAQCAtNDgxNyw3ICs0OTExLDcgQEAKIAogCXJldHVybiAwOwogIGVycl9jbGVhcjoKLQltZW1zZXQoaWZtZ2QtPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJZXRoX3plcm9fYWRkcihpZm1nZC0+YnNzaWQpOwogCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBCU1NfQ0hBTkdFRF9CU1NJRCk7CiAJaWZtZ2QtPmFzc29jX2RhdGEgPSBOVUxMOwogIGVycl9mcmVlOgpAQCAtNDg0NSw4ICs0OTM5LDkgQEAKIAkJCQkJICAgICAgIHJlcS0+cmVhc29uX2NvZGUsIHR4LAogCQkJCQkgICAgICAgZnJhbWVfYnVmKTsKIAkJaWVlZTgwMjExX2Rlc3Ryb3lfYXV0aF9kYXRhKHNkYXRhLCBmYWxzZSk7Ci0JCWNmZzgwMjExX3R4X21sbWVfbWdtdChzZGF0YS0+ZGV2LCBmcmFtZV9idWYsCi0JCQkJICAgICAgSUVFRTgwMjExX0RFQVVUSF9GUkFNRV9MRU4pOworCQlpZWVlODAyMTFfcmVwb3J0X2Rpc2Nvbm5lY3Qoc2RhdGEsIGZyYW1lX2J1ZiwKKwkJCQkJICAgIHNpemVvZihmcmFtZV9idWYpLCB0cnVlLAorCQkJCQkgICAgcmVxLT5yZWFzb25fY29kZSk7CiAKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNDg2MCw4ICs0OTU1LDkgQEAKIAogCQlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKHNkYXRhLCBJRUVFODAyMTFfU1RZUEVfREVBVVRILAogCQkJCSAgICAgICByZXEtPnJlYXNvbl9jb2RlLCB0eCwgZnJhbWVfYnVmKTsKLQkJY2ZnODAyMTFfdHhfbWxtZV9tZ210KHNkYXRhLT5kZXYsIGZyYW1lX2J1ZiwKLQkJCQkgICAgICBJRUVFODAyMTFfREVBVVRIX0ZSQU1FX0xFTik7CisJCWllZWU4MDIxMV9yZXBvcnRfZGlzY29ubmVjdChzZGF0YSwgZnJhbWVfYnVmLAorCQkJCQkgICAgc2l6ZW9mKGZyYW1lX2J1ZiksIHRydWUsCisJCQkJCSAgICByZXEtPnJlYXNvbl9jb2RlKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC00ODkzLDggKzQ5ODksOCBAQAogCQkJICAgICAgIHJlcS0+cmVhc29uX2NvZGUsICFyZXEtPmxvY2FsX3N0YXRlX2NoYW5nZSwKIAkJCSAgICAgICBmcmFtZV9idWYpOwogCi0JY2ZnODAyMTFfdHhfbWxtZV9tZ210KHNkYXRhLT5kZXYsIGZyYW1lX2J1ZiwKLQkJCSAgICAgIElFRUU4MDIxMV9ERUFVVEhfRlJBTUVfTEVOKTsKKwlpZWVlODAyMTFfcmVwb3J0X2Rpc2Nvbm5lY3Qoc2RhdGEsIGZyYW1lX2J1Ziwgc2l6ZW9mKGZyYW1lX2J1ZiksIHRydWUsCisJCQkJICAgIHJlcS0+cmVhc29uX2NvZGUpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcG0uYyBiL25ldC9tYWM4MDIxMS9wbS5jCmluZGV4IGNhNDA1YjYuLmFjNmFkNjIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9wbS5jCisrKyBiL25ldC9tYWM4MDIxMS9wbS5jCkBAIC01OSw5ICs1OSwyNiBAQAogCWNhbmNlbF93b3JrX3N5bmMoJmxvY2FsLT5keW5hbWljX3BzX2VuYWJsZV93b3JrKTsKIAlkZWxfdGltZXJfc3luYygmbG9jYWwtPmR5bmFtaWNfcHNfdGltZXIpOwogCi0JbG9jYWwtPndvd2xhbiA9IHdvd2xhbiAmJiBsb2NhbC0+b3Blbl9jb3VudDsKKwlsb2NhbC0+d293bGFuID0gd293bGFuOwogCWlmIChsb2NhbC0+d293bGFuKSB7Ci0JCWludCBlcnIgPSBkcnZfc3VzcGVuZChsb2NhbCwgd293bGFuKTsKKwkJaW50IGVycjsKKworCQkvKiBEcml2ZXJzIGRvbid0IGV4cGVjdCB0byBzdXNwZW5kIHdoaWxlIHNvbWUgb3BlcmF0aW9ucyBsaWtlCisJCSAqIGF1dGhlbnRpY2F0aW5nIG9yIGFzc29jaWF0aW5nIGFyZSBpbiBwcm9ncmVzcy4gSXQgZG9lc24ndAorCQkgKiBtYWtlIHNlbnNlIGFueXdheSB0byBhY2NlcHQgdGhhdCwgc2luY2UgdGhlIGF1dGhlbnRpY2F0aW9uCisJCSAqIG9yIGFzc29jaWF0aW9uIHdvdWxkIG5ldmVyIGZpbmlzaCBzaW5jZSB0aGUgZHJpdmVyIGNhbid0IGRvCisJCSAqIHRoYXQgb24gaXRzIG93bi4KKwkJICogVGh1cywgY2xlYW4gdXAgaW4tcHJvZ3Jlc3MgYXV0aC9hc3NvYyBmaXJzdC4KKwkJICovCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgeworCQkJaWYgKCFpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCisJCQkJY29udGludWU7CisJCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCisJCQkJY29udGludWU7CisJCQlpZWVlODAyMTFfbWdkX3F1aWVzY2Uoc2RhdGEpOworCQl9CisKKwkJZXJyID0gZHJ2X3N1c3BlbmQobG9jYWwsIHdvd2xhbik7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlsb2NhbC0+cXVpZXNjaW5nID0gZmFsc2U7CiAJCQlsb2NhbC0+d293bGFuID0gZmFsc2U7CkBAIC04MCw2ICs5NywxMyBAQAogCQkJcmV0dXJuIGVycjsKIAkJfSBlbHNlIGlmIChlcnIgPiAwKSB7CiAJCQlXQVJOX09OKGVyciAhPSAxKTsKKwkJCS8qIGNmZzgwMjExIHdpbGwgY2FsbCBiYWNrIGludG8gbWFjODAyMTEgdG8gZGlzY29ubmVjdAorCQkJICogYWxsIGludGVyZmFjZXMsIGFsbG93IHRoYXQgdG8gcHJvY2VlZCBwcm9wZXJseQorCQkJICovCisJCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXNfYnlfcmVhc29uKGh3LAorCQkJCQlJRUVFODAyMTFfTUFYX1FVRVVFX01BUCwKKwkJCQkJSUVFRTgwMjExX1FVRVVFX1NUT1BfUkVBU09OX1NVU1BFTkQsCisJCQkJCWZhbHNlKTsKIAkJCXJldHVybiBlcnI7CiAJCX0gZWxzZSB7CiAJCQlnb3RvIHN1c3BlbmQ7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYwppbmRleCBlZjZlOGE2Li4yNDc1NTJhIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmMKQEAgLTY5LDE0ICs2OSwzOSBAQAogCXJldHVybiBpOwogfQogCisvKiByZXR1cm4gY3VycmVudCBFTVdBIHRocm91Z2hwdXQgKi8KK2ludCBtaW5zdHJlbF9nZXRfdHBfYXZnKHN0cnVjdCBtaW5zdHJlbF9yYXRlICptciwgaW50IHByb2JfZXdtYSkKK3sKKwlpbnQgdXNlY3M7CisKKwl1c2VjcyA9IG1yLT5wZXJmZWN0X3R4X3RpbWU7CisJaWYgKCF1c2VjcykKKwkJdXNlY3MgPSAxMDAwMDAwOworCisJLyogcmVzZXQgdGhyLiBiZWxvdyAxMCUgc3VjY2VzcyAqLworCWlmIChtci0+c3RhdHMucHJvYl9ld21hIDwgTUlOU1RSRUxfRlJBQygxMCwgMTAwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocHJvYl9ld21hID4gTUlOU1RSRUxfRlJBQyg5MCwgMTAwKSkKKwkJcmV0dXJuIE1JTlNUUkVMX1RSVU5DKDEwMDAwMCAqIChNSU5TVFJFTF9GUkFDKDkwLCAxMDApIC8gdXNlY3MpKTsKKwllbHNlCisJCXJldHVybiBNSU5TVFJFTF9UUlVOQygxMDAwMDAgKiAocHJvYl9ld21hIC8gdXNlY3MpKTsKK30KKwogLyogZmluZCAmIHNvcnQgdG9wbW9zdCB0aHJvdWdocHV0IHJhdGVzICovCiBzdGF0aWMgaW5saW5lIHZvaWQKIG1pbnN0cmVsX3NvcnRfYmVzdF90cF9yYXRlcyhzdHJ1Y3QgbWluc3RyZWxfc3RhX2luZm8gKm1pLCBpbnQgaSwgdTggKnRwX2xpc3QpCiB7CiAJaW50IGogPSBNQVhfVEhSX1JBVEVTOworCXN0cnVjdCBtaW5zdHJlbF9yYXRlX3N0YXRzICp0bXBfbXJzID0gJm1pLT5yW2ogLSAxXS5zdGF0czsKKwlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqY3VyX21ycyA9ICZtaS0+cltpXS5zdGF0czsKIAotCXdoaWxlIChqID4gMCAmJiBtaS0+cltpXS5zdGF0cy5jdXJfdHAgPiBtaS0+clt0cF9saXN0W2ogLSAxXV0uc3RhdHMuY3VyX3RwKQorCXdoaWxlIChqID4gMCAmJiAobWluc3RyZWxfZ2V0X3RwX2F2ZygmbWktPnJbaV0sIGN1cl9tcnMtPnByb2JfZXdtYSkgPgorCSAgICAgICBtaW5zdHJlbF9nZXRfdHBfYXZnKCZtaS0+clt0cF9saXN0W2ogLSAxXV0sIHRtcF9tcnMtPnByb2JfZXdtYSkpKSB7CiAJCWotLTsKKwkJdG1wX21ycyA9ICZtaS0+clt0cF9saXN0W2ogLSAxXV0uc3RhdHM7CisJfQorCiAJaWYgKGogPCBNQVhfVEhSX1JBVEVTIC0gMSkKIAkJbWVtbW92ZSgmdHBfbGlzdFtqICsgMV0sICZ0cF9saXN0W2pdLCBNQVhfVEhSX1JBVEVTIC0gKGogKyAxKSk7CiAJaWYgKGogPCBNQVhfVEhSX1JBVEVTKQpAQCAtMTI3LDEzICsxNTIsNDcgQEAKIAlyYXRlX2NvbnRyb2xfc2V0X3JhdGVzKG1wLT5odywgbWktPnN0YSwgcmF0ZXRibCk7CiB9CiAKKy8qCisqIFJlY2FsY3VsYXRlIHN0YXRpc3RpY3MgYW5kIGNvdW50ZXJzIG9mIGEgZ2l2ZW4gcmF0ZQorKi8KK3ZvaWQKK21pbnN0cmVsX2NhbGNfcmF0ZV9zdGF0cyhzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXJzKQoreworCWlmICh1bmxpa2VseShtcnMtPmF0dGVtcHRzID4gMCkpIHsKKwkJbXJzLT5zYW1wbGVfc2tpcHBlZCA9IDA7CisJCW1ycy0+Y3VyX3Byb2IgPSBNSU5TVFJFTF9GUkFDKG1ycy0+c3VjY2VzcywgbXJzLT5hdHRlbXB0cyk7CisJCWlmICh1bmxpa2VseSghbXJzLT5hdHRfaGlzdCkpIHsKKwkJCW1ycy0+cHJvYl9ld21hID0gbXJzLT5jdXJfcHJvYjsKKwkJfSBlbHNlIHsKKwkJCS8qIHVwZGF0ZSBleHBvbmVudGlhbCB3ZWlnaHRlZCBtb3ZpbmcgdmFyaWFuY2UgKi8KKwkJCW1ycy0+cHJvYl9ld21zZCA9IG1pbnN0cmVsX2V3bXNkKG1ycy0+cHJvYl9ld21zZCwKKwkJCQkJCQkgbXJzLT5jdXJfcHJvYiwKKwkJCQkJCQkgbXJzLT5wcm9iX2V3bWEsCisJCQkJCQkJIEVXTUFfTEVWRUwpOworCisJCQkvKnVwZGF0ZSBleHBvbmVudGlhbCB3ZWlnaHRlZCBtb3ZpbmcgYXZhcmFnZSAqLworCQkJbXJzLT5wcm9iX2V3bWEgPSBtaW5zdHJlbF9ld21hKG1ycy0+cHJvYl9ld21hLAorCQkJCQkJICAgICAgIG1ycy0+Y3VyX3Byb2IsCisJCQkJCQkgICAgICAgRVdNQV9MRVZFTCk7CisJCX0KKwkJbXJzLT5hdHRfaGlzdCArPSBtcnMtPmF0dGVtcHRzOworCQltcnMtPnN1Y2NfaGlzdCArPSBtcnMtPnN1Y2Nlc3M7CisJfSBlbHNlIHsKKwkJbXJzLT5zYW1wbGVfc2tpcHBlZCsrOworCX0KKworCW1ycy0+bGFzdF9zdWNjZXNzID0gbXJzLT5zdWNjZXNzOworCW1ycy0+bGFzdF9hdHRlbXB0cyA9IG1ycy0+YXR0ZW1wdHM7CisJbXJzLT5zdWNjZXNzID0gMDsKKwltcnMtPmF0dGVtcHRzID0gMDsKK30KKwogc3RhdGljIHZvaWQKIG1pbnN0cmVsX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgbWluc3RyZWxfcHJpdiAqbXAsIHN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWkpCiB7CiAJdTggdG1wX3RwX3JhdGVbTUFYX1RIUl9SQVRFU107CiAJdTggdG1wX3Byb2JfcmF0ZSA9IDA7Ci0JdTMyIHVzZWNzOwotCWludCBpOworCWludCBpLCB0bXBfY3VyX3RwLCB0bXBfcHJvYl90cDsKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfVEhSX1JBVEVTOyBpKyspCiAJICAgIHRtcF90cF9yYXRlW2ldID0gMDsKQEAgLTE0MSwzOCArMjAwLDE1IEBACiAJZm9yIChpID0gMDsgaSA8IG1pLT5uX3JhdGVzOyBpKyspIHsKIAkJc3RydWN0IG1pbnN0cmVsX3JhdGUgKm1yID0gJm1pLT5yW2ldOwogCQlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXJzID0gJm1pLT5yW2ldLnN0YXRzOworCQlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqdG1wX21ycyA9ICZtaS0+clt0bXBfcHJvYl9yYXRlXS5zdGF0czsKIAotCQl1c2VjcyA9IG1yLT5wZXJmZWN0X3R4X3RpbWU7Ci0JCWlmICghdXNlY3MpCi0JCQl1c2VjcyA9IDEwMDAwMDA7Ci0KLQkJaWYgKHVubGlrZWx5KG1ycy0+YXR0ZW1wdHMgPiAwKSkgewotCQkJbXJzLT5zYW1wbGVfc2tpcHBlZCA9IDA7Ci0JCQltcnMtPmN1cl9wcm9iID0gTUlOU1RSRUxfRlJBQyhtcnMtPnN1Y2Nlc3MsCi0JCQkJCQkgICAgICBtcnMtPmF0dGVtcHRzKTsKLQkJCW1ycy0+c3VjY19oaXN0ICs9IG1ycy0+c3VjY2VzczsKLQkJCW1ycy0+YXR0X2hpc3QgKz0gbXJzLT5hdHRlbXB0czsKLQkJCW1ycy0+cHJvYmFiaWxpdHkgPSBtaW5zdHJlbF9ld21hKG1ycy0+cHJvYmFiaWxpdHksCi0JCQkJCQkJIG1ycy0+Y3VyX3Byb2IsCi0JCQkJCQkJIEVXTUFfTEVWRUwpOwotCQl9IGVsc2UKLQkJCW1ycy0+c2FtcGxlX3NraXBwZWQrKzsKLQotCQltcnMtPmxhc3Rfc3VjY2VzcyA9IG1ycy0+c3VjY2VzczsKLQkJbXJzLT5sYXN0X2F0dGVtcHRzID0gbXJzLT5hdHRlbXB0czsKLQkJbXJzLT5zdWNjZXNzID0gMDsKLQkJbXJzLT5hdHRlbXB0cyA9IDA7Ci0KLQkJLyogVXBkYXRlIHRocm91Z2hwdXQgcGVyIHJhdGUsIHJlc2V0IHRoci4gYmVsb3cgMTAlIHN1Y2Nlc3MgKi8KLQkJaWYgKG1ycy0+cHJvYmFiaWxpdHkgPCBNSU5TVFJFTF9GUkFDKDEwLCAxMDApKQotCQkJbXJzLT5jdXJfdHAgPSAwOwotCQllbHNlCi0JCQltcnMtPmN1cl90cCA9IG1ycy0+cHJvYmFiaWxpdHkgKiAoMTAwMDAwMCAvIHVzZWNzKTsKKwkJLyogVXBkYXRlIHN0YXRpc3RpY3Mgb2Ygc3VjY2VzcyBwcm9iYWJpbGl0eSBwZXIgcmF0ZSAqLworCQltaW5zdHJlbF9jYWxjX3JhdGVfc3RhdHMobXJzKTsKIAogCQkvKiBTYW1wbGUgbGVzcyBvZnRlbiBiZWxvdyB0aGUgMTAlIGNoYW5jZSBvZiBzdWNjZXNzLgogCQkgKiBTYW1wbGUgbGVzcyBvZnRlbiBhYm92ZSB0aGUgOTUlIGNoYW5jZSBvZiBzdWNjZXNzLiAqLwotCQlpZiAobXJzLT5wcm9iYWJpbGl0eSA+IE1JTlNUUkVMX0ZSQUMoOTUsIDEwMCkgfHwKLQkJICAgIG1ycy0+cHJvYmFiaWxpdHkgPCBNSU5TVFJFTF9GUkFDKDEwLCAxMDApKSB7CisJCWlmIChtcnMtPnByb2JfZXdtYSA+IE1JTlNUUkVMX0ZSQUMoOTUsIDEwMCkgfHwKKwkJICAgIG1ycy0+cHJvYl9ld21hIDwgTUlOU1RSRUxfRlJBQygxMCwgMTAwKSkgewogCQkJbXItPmFkanVzdGVkX3JldHJ5X2NvdW50ID0gbXJzLT5yZXRyeV9jb3VudCA+PiAxOwogCQkJaWYgKG1yLT5hZGp1c3RlZF9yZXRyeV9jb3VudCA+IDIpCiAJCQkJbXItPmFkanVzdGVkX3JldHJ5X2NvdW50ID0gMjsKQEAgLTE5MiwxMSArMjI4LDE0IEBACiAJCSAqIGNob29zZSB0aGUgbWF4aW11bSB0aHJvdWdocHV0IHJhdGUgYXMgbWF4X3Byb2JfcmF0ZQogCQkgKiAoMikgaWYgYWxsIHN1Y2Nlc3MgcHJvYmFiaWxpdGllcyA8IDk1JSwgdGhlIHJhdGUgd2l0aAogCQkgKiBoaWdoZXN0IHN1Y2Nlc3MgcHJvYmFiaWxpdHkgaXMgY2hvc2VuIGFzIG1heF9wcm9iX3JhdGUgKi8KLQkJaWYgKG1ycy0+cHJvYmFiaWxpdHkgPj0gTUlOU1RSRUxfRlJBQyg5NSwgMTAwKSkgewotCQkJaWYgKG1ycy0+Y3VyX3RwID49IG1pLT5yW3RtcF9wcm9iX3JhdGVdLnN0YXRzLmN1cl90cCkKKwkJaWYgKG1ycy0+cHJvYl9ld21hID49IE1JTlNUUkVMX0ZSQUMoOTUsIDEwMCkpIHsKKwkJCXRtcF9jdXJfdHAgPSBtaW5zdHJlbF9nZXRfdHBfYXZnKG1yLCBtcnMtPnByb2JfZXdtYSk7CisJCQl0bXBfcHJvYl90cCA9IG1pbnN0cmVsX2dldF90cF9hdmcoJm1pLT5yW3RtcF9wcm9iX3JhdGVdLAorCQkJCQkJCSAgdG1wX21ycy0+cHJvYl9ld21hKTsKKwkJCWlmICh0bXBfY3VyX3RwID49IHRtcF9wcm9iX3RwKQogCQkJCXRtcF9wcm9iX3JhdGUgPSBpOwogCQl9IGVsc2UgewotCQkJaWYgKG1ycy0+cHJvYmFiaWxpdHkgPj0gbWktPnJbdG1wX3Byb2JfcmF0ZV0uc3RhdHMucHJvYmFiaWxpdHkpCisJCQlpZiAobXJzLT5wcm9iX2V3bWEgPj0gdG1wX21ycy0+cHJvYl9ld21hKQogCQkJCXRtcF9wcm9iX3JhdGUgPSBpOwogCQl9CiAJfQpAQCAtMjE1LDcgKzI1NCw3IEBACiAjZW5kaWYKIAogCS8qIFJlc2V0IHVwZGF0ZSB0aW1lciAqLwotCW1pLT5zdGF0c191cGRhdGUgPSBqaWZmaWVzOworCW1pLT5sYXN0X3N0YXRzX3VwZGF0ZSA9IGppZmZpZXM7CiAKIAltaW5zdHJlbF91cGRhdGVfcmF0ZXMobXAsIG1pKTsKIH0KQEAgLTI1Myw3ICsyOTIsNyBAQAogCWlmIChtaS0+c2FtcGxlX2RlZmVycmVkID4gMCkKIAkJbWktPnNhbXBsZV9kZWZlcnJlZC0tOwogCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbWktPnN0YXRzX3VwZGF0ZSArCisJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgbWktPmxhc3Rfc3RhdHNfdXBkYXRlICsKIAkJCQkobXAtPnVwZGF0ZV9pbnRlcnZhbCAqIEhaKSAvIDEwMDApKQogCQltaW5zdHJlbF91cGRhdGVfc3RhdHMobXAsIG1pKTsKIH0KQEAgLTM4NSw3ICs0MjQsNyBAQAogCSAqIGhhcyBhIHByb2JhYmlsaXR5IG9mID45NSUsIHdlIHNob3VsZG4ndCBiZSBhdHRlbXB0aW5nCiAJICogdG8gdXNlIGl0LCBhcyB0aGlzIG9ubHkgd2FzdGVzIHByZWNpb3VzIGFpcnRpbWUgKi8KIAlpZiAoIW1ycl9jYXBhYmxlICYmCi0JICAgKG1pLT5yW25keF0uc3RhdHMucHJvYmFiaWxpdHkgPiBNSU5TVFJFTF9GUkFDKDk1LCAxMDApKSkKKwkgICAobWktPnJbbmR4XS5zdGF0cy5wcm9iX2V3bWEgPiBNSU5TVFJFTF9GUkFDKDk1LCAxMDApKSkKIAkJcmV0dXJuOwogCiAJbWktPnByZXZfc2FtcGxlID0gdHJ1ZTsKQEAgLTUxOSw3ICs1NTgsNyBAQAogCX0KIAogCW1pLT5uX3JhdGVzID0gbjsKLQltaS0+c3RhdHNfdXBkYXRlID0gamlmZmllczsKKwltaS0+bGFzdF9zdGF0c191cGRhdGUgPSBqaWZmaWVzOwogCiAJaW5pdF9zYW1wbGVfdGFibGUobWkpOwogCW1pbnN0cmVsX3VwZGF0ZV9yYXRlcyhtcCwgbWkpOwpAQCAtNTUzLDcgKzU5Miw3IEBACiAJaWYgKCFtaS0+c2FtcGxlX3RhYmxlKQogCQlnb3RvIGVycm9yMTsKIAotCW1pLT5zdGF0c191cGRhdGUgPSBqaWZmaWVzOworCW1pLT5sYXN0X3N0YXRzX3VwZGF0ZSA9IGppZmZpZXM7CiAJcmV0dXJuIG1pOwogCiBlcnJvcjE6CkBAIC02NjMsMTIgKzcwMiwxOCBAQAogc3RhdGljIHUzMiBtaW5zdHJlbF9nZXRfZXhwZWN0ZWRfdGhyb3VnaHB1dCh2b2lkICpwcml2X3N0YSkKIHsKIAlzdHJ1Y3QgbWluc3RyZWxfc3RhX2luZm8gKm1pID0gcHJpdl9zdGE7CisJc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKnRtcF9tcnM7CiAJaW50IGlkeCA9IG1pLT5tYXhfdHBfcmF0ZVswXTsKKwlpbnQgdG1wX2N1cl90cDsKIAogCS8qIGNvbnZlcnQgcGt0IHBlciBzZWMgaW4ga2JwcyAoMTIwMCBpcyB0aGUgYXZlcmFnZSBwa3Qgc2l6ZSB1c2VkIGZvcgogCSAqIGNvbXB1dGluZyBjdXJfdHAKIAkgKi8KLQlyZXR1cm4gTUlOU1RSRUxfVFJVTkMobWktPnJbaWR4XS5zdGF0cy5jdXJfdHApICogMTIwMCAqIDggLyAxMDI0OworCXRtcF9tcnMgPSAmbWktPnJbaWR4XS5zdGF0czsKKwl0bXBfY3VyX3RwID0gbWluc3RyZWxfZ2V0X3RwX2F2ZygmbWktPnJbaWR4XSwgdG1wX21ycy0+cHJvYl9ld21hKTsKKwl0bXBfY3VyX3RwID0gdG1wX2N1cl90cCAqIDEyMDAgKiA4IC8gMTAyNDsKKworCXJldHVybiB0bXBfY3VyX3RwOwogfQogCiBjb25zdCBzdHJ1Y3QgcmF0ZV9jb250cm9sX29wcyBtYWM4MDIxMV9taW5zdHJlbCA9IHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmggYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5oCmluZGV4IDQxMGVmZTYuLmMyMzBiYmUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmgKKysrIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuaApAQCAtMTMsNyArMTMsNiBAQAogI2RlZmluZSBFV01BX0RJVgkxMjgKICNkZWZpbmUgU0FNUExFX0NPTFVNTlMJMTAJLyogbnVtYmVyIG9mIGNvbHVtbnMgaW4gc2FtcGxlIHRhYmxlICovCiAKLQogLyogc2NhbGVkIGZyYWN0aW9uIHZhbHVlcyAqLwogI2RlZmluZSBNSU5TVFJFTF9TQ0FMRSAgMTYKICNkZWZpbmUgTUlOU1RSRUxfRlJBQyh2YWwsIGRpdikgKCgodmFsKSA8PCBNSU5TVFJFTF9TQ0FMRSkgLyBkaXYpCkBAIC0yNCwxMSArMjMsMzQgQEAKIAogLyoKICAqIFBlcmZvcm0gRVdNQSAoRXhwb25lbnRpYWxseSBXZWlnaHRlZCBNb3ZpbmcgQXZlcmFnZSkgY2FsY3VsYXRpb24KLSAgKi8KKyAqLwogc3RhdGljIGlubGluZSBpbnQKIG1pbnN0cmVsX2V3bWEoaW50IG9sZCwgaW50IG5ldywgaW50IHdlaWdodCkKIHsKLQlyZXR1cm4gKG5ldyAqIChFV01BX0RJViAtIHdlaWdodCkgKyBvbGQgKiB3ZWlnaHQpIC8gRVdNQV9ESVY7CisJaW50IGRpZmYsIGluY3I7CisKKwlkaWZmID0gbmV3IC0gb2xkOworCWluY3IgPSAoRVdNQV9ESVYgLSB3ZWlnaHQpICogZGlmZiAvIEVXTUFfRElWOworCisJcmV0dXJuIG9sZCArIGluY3I7Cit9CisKKy8qCisgKiBQZXJmb3JtIEVXTVNEIChFeHBvbmVudGlhbGx5IFdlaWdodGVkIE1vdmluZyBTdGFuZGFyZCBEZXZpYXRpb24pIGNhbGN1bGF0aW9uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CittaW5zdHJlbF9ld21zZChpbnQgb2xkX2V3bXNkLCBpbnQgY3VyX3Byb2IsIGludCBwcm9iX2V3bWEsIGludCB3ZWlnaHQpCit7CisJaW50IGRpZmYsIGluY3IsIHRtcF92YXI7CisKKwkvKiBjYWxjdWxhdGUgZXhwb25lbnRpYWwgd2VpZ2h0ZWQgbW92aW5nIHZhcmlhbmNlICovCisJZGlmZiA9IE1JTlNUUkVMX1RSVU5DKChjdXJfcHJvYiAtIHByb2JfZXdtYSkgKiAxMDAwMDAwKTsKKwlpbmNyID0gKEVXTUFfRElWIC0gd2VpZ2h0KSAqIGRpZmYgLyBFV01BX0RJVjsKKwl0bXBfdmFyID0gb2xkX2V3bXNkICogb2xkX2V3bXNkOworCXRtcF92YXIgPSB3ZWlnaHQgKiAodG1wX3ZhciArIGRpZmYgKiBpbmNyIC8gMTAwMDAwMCkgLyBFV01BX0RJVjsKKworCS8qIHJldHVybiBzdGFuZGFyZCBkZXZpYXRpb24gKi8KKwlyZXR1cm4gKHUxNikgaW50X3NxcnQodG1wX3Zhcik7CiB9CiAKIHN0cnVjdCBtaW5zdHJlbF9yYXRlX3N0YXRzIHsKQEAgLTM5LDExICs2MSwxMyBAQAogCS8qIHRvdGFsIGF0dGVtcHRzL3N1Y2Nlc3MgY291bnRlcnMgKi8KIAl1NjQgYXR0X2hpc3QsIHN1Y2NfaGlzdDsKIAotCS8qIGN1cnJlbnQgdGhyb3VnaHB1dCAqLwotCXVuc2lnbmVkIGludCBjdXJfdHA7Ci0KLQkvKiBwYWNrZXQgZGVsaXZlcnkgcHJvYmFiaWxpdGllcyAqLwotCXVuc2lnbmVkIGludCBjdXJfcHJvYiwgcHJvYmFiaWxpdHk7CisJLyogc3RhdGlzdGlzIG9mIHBhY2tldCBkZWxpdmVyeSBwcm9iYWJpbGl0eQorCSAqICBjdXJfcHJvYiAgLSBjdXJyZW50IHByb2Igd2l0aGluIGxhc3QgdXBkYXRlIGludGVydmFsbAorCSAqICBwcm9iX2V3bWEgLSBleHBvbmVudGlhbCB3ZWlnaHRlZCBtb3ZpbmcgYXZlcmFnZSBvZiBwcm9iCisJICogIHByb2JfZXdtc2QgLSBleHAuIHdlaWdodGVkIG1vdmluZyBzdGFuZGFyZCBkZXZpYXRpb24gb2YgcHJvYiAqLworCXVuc2lnbmVkIGludCBjdXJfcHJvYjsKKwl1bnNpZ25lZCBpbnQgcHJvYl9ld21hOworCXUxNiBwcm9iX2V3bXNkOwogCiAJLyogbWF4aW11bSByZXRyeSBjb3VudHMgKi8KIAl1OCByZXRyeV9jb3VudDsKQEAgLTcxLDcgKzk1LDcgQEAKIHN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyB7CiAJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKIAotCXVuc2lnbmVkIGxvbmcgc3RhdHNfdXBkYXRlOworCXVuc2lnbmVkIGxvbmcgbGFzdF9zdGF0c191cGRhdGU7CiAJdW5zaWduZWQgaW50IHNwX2Fja19kdXI7CiAJdW5zaWduZWQgaW50IHJhdGVfYXZnOwogCkBAIC05NSw2ICsxMTksNyBAQAogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKIAlzdHJ1Y3QgZGVudHJ5ICpkYmdfc3RhdHM7CisJc3RydWN0IGRlbnRyeSAqZGJnX3N0YXRzX2NzdjsKICNlbmRpZgogfTsKIApAQCAtMTIxLDcgKzE0Niw2IEBACiAJdTMyIGZpeGVkX3JhdGVfaWR4OwogCXN0cnVjdCBkZW50cnkgKmRiZ19maXhlZF9yYXRlOwogI2VuZGlmCi0KIH07CiAKIHN0cnVjdCBtaW5zdHJlbF9kZWJ1Z2ZzX2luZm8gewpAQCAtMTMzLDggKzE1NywxMyBAQAogdm9pZCBtaW5zdHJlbF9hZGRfc3RhX2RlYnVnZnModm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEsIHN0cnVjdCBkZW50cnkgKmRpcik7CiB2b2lkIG1pbnN0cmVsX3JlbW92ZV9zdGFfZGVidWdmcyh2b2lkICpwcml2LCB2b2lkICpwcml2X3N0YSk7CiAKKy8qIFJlY2FsY3VsYXRlIHN1Y2Nlc3MgcHJvYmFiaWxpdGllcyBhbmQgY291bnRlcnMgZm9yIGEgZ2l2ZW4gcmF0ZSB1c2luZyBFV01BICovCit2b2lkIG1pbnN0cmVsX2NhbGNfcmF0ZV9zdGF0cyhzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXJzKTsKK2ludCBtaW5zdHJlbF9nZXRfdHBfYXZnKHN0cnVjdCBtaW5zdHJlbF9yYXRlICptciwgaW50IHByb2JfZXdtYSk7CisKIC8qIGRlYnVnZnMgKi8KIGludCBtaW5zdHJlbF9zdGF0c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK2ludCBtaW5zdHJlbF9zdGF0c19jc3Zfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzc2l6ZV90IG1pbnN0cmVsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcyk7CiBpbnQgbWluc3RyZWxfc3RhdHNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2RlYnVnZnMuYyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2RlYnVnZnMuYwppbmRleCAyYWNhYjFiLi4xZGI1ZjdjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9kZWJ1Z2ZzLmMKKysrIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfZGVidWdmcy5jCkBAIC01NCw1OSArNTQsNiBAQAogI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgogI2luY2x1ZGUgInJjODAyMTFfbWluc3RyZWwuaCIKIAotaW50Ci1taW5zdHJlbF9zdGF0c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWkgPSBpbm9kZS0+aV9wcml2YXRlOwotCXN0cnVjdCBtaW5zdHJlbF9kZWJ1Z2ZzX2luZm8gKm1zOwotCXVuc2lnbmVkIGludCBpLCB0cCwgcHJvYiwgZXByb2I7Ci0JY2hhciAqcDsKLQotCW1zID0ga21hbGxvYygyMDQ4LCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1zKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZpbGUtPnByaXZhdGVfZGF0YSA9IG1zOwotCXAgPSBtcy0+YnVmOwotCXAgKz0gc3ByaW50ZihwLCAicmF0ZSAgICAgICAgICB0cHQgZXByb2IgKnByb2IiCi0JCQkiICAqb2soKmN1bSkgICAgICAgIG9rKCAgICAgIGN1bSlcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBtaS0+bl9yYXRlczsgaSsrKSB7Ci0JCXN0cnVjdCBtaW5zdHJlbF9yYXRlICptciA9ICZtaS0+cltpXTsKLQkJc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1ycyA9ICZtaS0+cltpXS5zdGF0czsKLQotCQkqKHArKykgPSAoaSA9PSBtaS0+bWF4X3RwX3JhdGVbMF0pID8gJ0EnIDogJyAnOwotCQkqKHArKykgPSAoaSA9PSBtaS0+bWF4X3RwX3JhdGVbMV0pID8gJ0InIDogJyAnOwotCQkqKHArKykgPSAoaSA9PSBtaS0+bWF4X3RwX3JhdGVbMl0pID8gJ0MnIDogJyAnOwotCQkqKHArKykgPSAoaSA9PSBtaS0+bWF4X3RwX3JhdGVbM10pID8gJ0QnIDogJyAnOwotCQkqKHArKykgPSAoaSA9PSBtaS0+bWF4X3Byb2JfcmF0ZSkgPyAnUCcgOiAnICc7Ci0JCXAgKz0gc3ByaW50ZihwLCAiJTN1JXMiLCBtci0+Yml0cmF0ZSAvIDIsCi0JCQkJKG1yLT5iaXRyYXRlICYgMSA/ICIuNSIgOiAiICAiKSk7Ci0KLQkJdHAgPSBNSU5TVFJFTF9UUlVOQyhtcnMtPmN1cl90cCAvIDEwKTsKLQkJcHJvYiA9IE1JTlNUUkVMX1RSVU5DKG1ycy0+Y3VyX3Byb2IgKiAxMDAwKTsKLQkJZXByb2IgPSBNSU5TVFJFTF9UUlVOQyhtcnMtPnByb2JhYmlsaXR5ICogMTAwMCk7Ci0KLQkJcCArPSBzcHJpbnRmKHAsICIgJTR1LiUxdSAlM3UuJTF1ICUzdS4lMXUiCi0JCQkJIiAlNHUoJTR1KSAlOWxsdSglOWxsdSlcbiIsCi0JCQkJdHAgLyAxMCwgdHAgJSAxMCwKLQkJCQllcHJvYiAvIDEwLCBlcHJvYiAlIDEwLAotCQkJCXByb2IgLyAxMCwgcHJvYiAlIDEwLAotCQkJCW1ycy0+bGFzdF9zdWNjZXNzLAotCQkJCW1ycy0+bGFzdF9hdHRlbXB0cywKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1ycy0+c3VjY19oaXN0LAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbXJzLT5hdHRfaGlzdCk7Ci0JfQotCXAgKz0gc3ByaW50ZihwLCAiXG5Ub3RhbCBwYWNrZXQgY291bnQ6OiAgICBpZGVhbCAlZCAgICAgICIKLQkJCSJsb29rYXJvdW5kICVkXG5cbiIsCi0JCQltaS0+dG90YWxfcGFja2V0cyAtIG1pLT5zYW1wbGVfcGFja2V0cywKLQkJCW1pLT5zYW1wbGVfcGFja2V0cyk7Ci0JbXMtPmxlbiA9IHAgLSBtcy0+YnVmOwotCi0JV0FSTl9PTihtcy0+bGVuICsgc2l6ZW9mKCptcykgPiAyMDQ4KTsKLQotCXJldHVybiAwOwotfQotCiBzc2l6ZV90CiBtaW5zdHJlbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0xMjMsNiArNzAsNzMgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50CittaW5zdHJlbF9zdGF0c19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWkgPSBpbm9kZS0+aV9wcml2YXRlOworCXN0cnVjdCBtaW5zdHJlbF9kZWJ1Z2ZzX2luZm8gKm1zOworCXVuc2lnbmVkIGludCBpLCB0cF9tYXgsIHRwX2F2ZywgcHJvYiwgZXByb2I7CisJY2hhciAqcDsKKworCW1zID0ga21hbGxvYygyMDQ4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IG1zOworCXAgPSBtcy0+YnVmOworCXAgKz0gc3ByaW50ZihwLCAiXG4iKTsKKwlwICs9IHNwcmludGYocCwgImJlc3QgICBfX19fX19fX19fcmF0ZV9fX19fX19fXyAgICBfX19fX18iCisJCQkic3RhdGlzdGljc19fX19fXyAgICBfX19fX19fX2xhc3RfX19fX19fICAgICIKKwkJCSJfX19fX19zdW0tb2ZfX19fX19fX1xuIik7CisJcCArPSBzcHJpbnRmKHAsICJyYXRlICBbbmFtZSBpZHggYWlydGltZSBtYXhfdHBdICBbIMO4KHRwKSDDuChwcm9iKSAiCisJCQkic2QocHJvYildICBbcHJvYi58cmV0cnl8c3VjfGF0dF0gICIKKwkJCSJbI3N1Y2Nlc3MgfCAjYXR0ZW1wdHNdXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBtaS0+bl9yYXRlczsgaSsrKSB7CisJCXN0cnVjdCBtaW5zdHJlbF9yYXRlICptciA9ICZtaS0+cltpXTsKKwkJc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1ycyA9ICZtaS0+cltpXS5zdGF0czsKKworCQkqKHArKykgPSAoaSA9PSBtaS0+bWF4X3RwX3JhdGVbMF0pID8gJ0EnIDogJyAnOworCQkqKHArKykgPSAoaSA9PSBtaS0+bWF4X3RwX3JhdGVbMV0pID8gJ0InIDogJyAnOworCQkqKHArKykgPSAoaSA9PSBtaS0+bWF4X3RwX3JhdGVbMl0pID8gJ0MnIDogJyAnOworCQkqKHArKykgPSAoaSA9PSBtaS0+bWF4X3RwX3JhdGVbM10pID8gJ0QnIDogJyAnOworCQkqKHArKykgPSAoaSA9PSBtaS0+bWF4X3Byb2JfcmF0ZSkgPyAnUCcgOiAnICc7CisKKwkJcCArPSBzcHJpbnRmKHAsICIgJTN1JXMgIiwgbXItPmJpdHJhdGUgLyAyLAorCQkJCShtci0+Yml0cmF0ZSAmIDEgPyAiLjUiIDogIiAgIikpOworCQlwICs9IHNwcmludGYocCwgIiUzdSAgIiwgaSk7CisJCXAgKz0gc3ByaW50ZihwLCAiJTZ1ICIsIG1yLT5wZXJmZWN0X3R4X3RpbWUpOworCisJCXRwX21heCA9IG1pbnN0cmVsX2dldF90cF9hdmcobXIsIE1JTlNUUkVMX0ZSQUMoMTAwLDEwMCkpOworCQl0cF9hdmcgPSBtaW5zdHJlbF9nZXRfdHBfYXZnKG1yLCBtcnMtPnByb2JfZXdtYSk7CisJCXByb2IgPSBNSU5TVFJFTF9UUlVOQyhtcnMtPmN1cl9wcm9iICogMTAwMCk7CisJCWVwcm9iID0gTUlOU1RSRUxfVFJVTkMobXJzLT5wcm9iX2V3bWEgKiAxMDAwKTsKKworCQlwICs9IHNwcmludGYocCwgIiU0dS4lMXUgICAlNHUuJTF1ICAgJTN1LiUxdSAgICAlM3UuJTF1IgorCQkJCSIgICAgICUzdS4lMXUgJTN1ICAgJTN1ICUtM3UgICAiCisJCQkJIiU5bGx1ICAgJS05bGx1XG4iLAorCQkJCXRwX21heCAvIDEwLCB0cF9tYXggJSAxMCwKKwkJCQl0cF9hdmcgLyAxMCwgdHBfYXZnICUgMTAsCisJCQkJZXByb2IgLyAxMCwgZXByb2IgJSAxMCwKKwkJCQltcnMtPnByb2JfZXdtc2QgLyAxMCwgbXJzLT5wcm9iX2V3bXNkICUgMTAsCisJCQkJcHJvYiAvIDEwLCBwcm9iICUgMTAsCisJCQkJbXJzLT5yZXRyeV9jb3VudCwKKwkJCQltcnMtPmxhc3Rfc3VjY2VzcywKKwkJCQltcnMtPmxhc3RfYXR0ZW1wdHMsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyltcnMtPnN1Y2NfaGlzdCwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1ycy0+YXR0X2hpc3QpOworCX0KKwlwICs9IHNwcmludGYocCwgIlxuVG90YWwgcGFja2V0IGNvdW50OjogICAgaWRlYWwgJWQgICAgICAiCisJCQkibG9va2Fyb3VuZCAlZFxuXG4iLAorCQkJbWktPnRvdGFsX3BhY2tldHMgLSBtaS0+c2FtcGxlX3BhY2tldHMsCisJCQltaS0+c2FtcGxlX3BhY2tldHMpOworCW1zLT5sZW4gPSBwIC0gbXMtPmJ1ZjsKKworCVdBUk5fT04obXMtPmxlbiArIHNpemVvZigqbXMpID4gMjA0OCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWluc3RyZWxfc3RhdF9mb3BzID0gewogCS5vd25lciA9IFRISVNfTU9EVUxFLAogCS5vcGVuID0gbWluc3RyZWxfc3RhdHNfb3BlbiwKQEAgLTEzMSw2ICsxNDUsNzIgQEAKIAkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCiB9OwogCitpbnQKK21pbnN0cmVsX3N0YXRzX2Nzdl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBtaW5zdHJlbF9zdGFfaW5mbyAqbWkgPSBpbm9kZS0+aV9wcml2YXRlOworCXN0cnVjdCBtaW5zdHJlbF9kZWJ1Z2ZzX2luZm8gKm1zOworCXVuc2lnbmVkIGludCBpLCB0cF9tYXgsIHRwX2F2ZywgcHJvYiwgZXByb2I7CisJY2hhciAqcDsKKworCW1zID0ga21hbGxvYygyMDQ4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IG1zOworCXAgPSBtcy0+YnVmOworCisJZm9yIChpID0gMDsgaSA8IG1pLT5uX3JhdGVzOyBpKyspIHsKKwkJc3RydWN0IG1pbnN0cmVsX3JhdGUgKm1yID0gJm1pLT5yW2ldOworCQlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXJzID0gJm1pLT5yW2ldLnN0YXRzOworCisJCXAgKz0gc3ByaW50ZihwLCAiJXMiICwoKGkgPT0gbWktPm1heF90cF9yYXRlWzBdKSA/ICJBIiA6ICIiKSk7CisJCXAgKz0gc3ByaW50ZihwLCAiJXMiICwoKGkgPT0gbWktPm1heF90cF9yYXRlWzFdKSA/ICJCIiA6ICIiKSk7CisJCXAgKz0gc3ByaW50ZihwLCAiJXMiICwoKGkgPT0gbWktPm1heF90cF9yYXRlWzJdKSA/ICJDIiA6ICIiKSk7CisJCXAgKz0gc3ByaW50ZihwLCAiJXMiICwoKGkgPT0gbWktPm1heF90cF9yYXRlWzNdKSA/ICJEIiA6ICIiKSk7CisJCXAgKz0gc3ByaW50ZihwLCAiJXMiICwoKGkgPT0gbWktPm1heF9wcm9iX3JhdGUpID8gIlAiIDogIiIpKTsKKworCQlwICs9IHNwcmludGYocCwgIiwldSVzIiwgbXItPmJpdHJhdGUgLyAyLAorCQkJCShtci0+Yml0cmF0ZSAmIDEgPyAiLjUsIiA6ICIsIikpOworCQlwICs9IHNwcmludGYocCwgIiV1LCIsIGkpOworCQlwICs9IHNwcmludGYocCwgIiV1LCIsbXItPnBlcmZlY3RfdHhfdGltZSk7CisKKwkJdHBfbWF4ID0gbWluc3RyZWxfZ2V0X3RwX2F2ZyhtciwgTUlOU1RSRUxfRlJBQygxMDAsMTAwKSk7CisJCXRwX2F2ZyA9IG1pbnN0cmVsX2dldF90cF9hdmcobXIsIG1ycy0+cHJvYl9ld21hKTsKKwkJcHJvYiA9IE1JTlNUUkVMX1RSVU5DKG1ycy0+Y3VyX3Byb2IgKiAxMDAwKTsKKwkJZXByb2IgPSBNSU5TVFJFTF9UUlVOQyhtcnMtPnByb2JfZXdtYSAqIDEwMDApOworCisJCXAgKz0gc3ByaW50ZihwLCAiJXUuJXUsJXUuJXUsJXUuJXUsJXUuJXUsJXUuJXUsJXUsJXUsJXUsIgorCQkJCSIlbGx1LCVsbHUsJWQsJWRcbiIsCisJCQkJdHBfbWF4IC8gMTAsIHRwX21heCAlIDEwLAorCQkJCXRwX2F2ZyAvIDEwLCB0cF9hdmcgJSAxMCwKKwkJCQllcHJvYiAvIDEwLCBlcHJvYiAlIDEwLAorCQkJCW1ycy0+cHJvYl9ld21zZCAvIDEwLCBtcnMtPnByb2JfZXdtc2QgJSAxMCwKKwkJCQlwcm9iIC8gMTAsIHByb2IgJSAxMCwKKwkJCQltcnMtPnJldHJ5X2NvdW50LAorCQkJCW1ycy0+bGFzdF9zdWNjZXNzLAorCQkJCW1ycy0+bGFzdF9hdHRlbXB0cywKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1ycy0+c3VjY19oaXN0LAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbXJzLT5hdHRfaGlzdCwKKwkJCQltaS0+dG90YWxfcGFja2V0cyAtIG1pLT5zYW1wbGVfcGFja2V0cywKKwkJCQltaS0+c2FtcGxlX3BhY2tldHMpOworCisJfQorCW1zLT5sZW4gPSBwIC0gbXMtPmJ1ZjsKKworCVdBUk5fT04obXMtPmxlbiArIHNpemVvZigqbXMpID4gMjA0OCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWluc3RyZWxfc3RhdF9jc3ZfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IG1pbnN0cmVsX3N0YXRzX2Nzdl9vcGVuLAorCS5yZWFkID0gbWluc3RyZWxfc3RhdHNfcmVhZCwKKwkucmVsZWFzZSA9IG1pbnN0cmVsX3N0YXRzX3JlbGVhc2UsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKwogdm9pZAogbWluc3RyZWxfYWRkX3N0YV9kZWJ1Z2ZzKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhLCBzdHJ1Y3QgZGVudHJ5ICpkaXIpCiB7CkBAIC0xMzgsNiArMjE4LDkgQEAKIAogCW1pLT5kYmdfc3RhdHMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyY19zdGF0cyIsIFNfSVJVR08sIGRpciwgbWksCiAJCQkmbWluc3RyZWxfc3RhdF9mb3BzKTsKKworCW1pLT5kYmdfc3RhdHNfY3N2ID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmNfc3RhdHNfY3N2IiwgU19JUlVHTywgZGlyLAorCQkJbWksICZtaW5zdHJlbF9zdGF0X2Nzdl9mb3BzKTsKIH0KIAogdm9pZApAQCAtMTQ2LDQgKzIyOSw2IEBACiAJc3RydWN0IG1pbnN0cmVsX3N0YV9pbmZvICptaSA9IHByaXZfc3RhOwogCiAJZGVidWdmc19yZW1vdmUobWktPmRiZ19zdGF0cyk7CisKKwlkZWJ1Z2ZzX3JlbW92ZShtaS0+ZGJnX3N0YXRzX2Nzdik7CiB9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHQuYwppbmRleCA4MDQ1MmNmLi43NDMwYTFkIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0LmMKQEAgLTE3LDEwICsxNywxMSBAQAogI2luY2x1ZGUgInJjODAyMTFfbWluc3RyZWwuaCIKICNpbmNsdWRlICJyYzgwMjExX21pbnN0cmVsX2h0LmgiCiAKKyNkZWZpbmUgQVZHX0FNUERVX1NJWkUJMTYKICNkZWZpbmUgQVZHX1BLVF9TSVpFCTEyMDAKIAogLyogTnVtYmVyIG9mIGJpdHMgZm9yIGFuIGF2ZXJhZ2Ugc2l6ZWQgcGFja2V0ICovCi0jZGVmaW5lIE1DU19OQklUUyAoQVZHX1BLVF9TSVpFIDw8IDMpCisjZGVmaW5lIE1DU19OQklUUyAoKEFWR19QS1RfU0laRSAqIEFWR19BTVBEVV9TSVpFKSA8PCAzKQogCiAvKiBOdW1iZXIgb2Ygc3ltYm9scyBmb3IgYSBwYWNrZXQgd2l0aCAoYnBzKSBiaXRzIHBlciBzeW1ib2wgKi8KICNkZWZpbmUgTUNTX05TWU1TKGJwcykgRElWX1JPVU5EX1VQKE1DU19OQklUUywgKGJwcykpCkBAIC0zMyw3ICszNCw4IEBACiAJKQogCiAvKiBUcmFuc21pdCBkdXJhdGlvbiBmb3IgdGhlIHJhdyBkYXRhIHBhcnQgb2YgYW4gYXZlcmFnZSBzaXplZCBwYWNrZXQgKi8KLSNkZWZpbmUgTUNTX0RVUkFUSU9OKHN0cmVhbXMsIHNnaSwgYnBzKSBNQ1NfU1lNQk9MX1RJTUUoc2dpLCBNQ1NfTlNZTVMoKHN0cmVhbXMpICogKGJwcykpKQorI2RlZmluZSBNQ1NfRFVSQVRJT04oc3RyZWFtcywgc2dpLCBicHMpIFwKKwkoTUNTX1NZTUJPTF9USU1FKHNnaSwgTUNTX05TWU1TKChzdHJlYW1zKSAqIChicHMpKSkgLyBBVkdfQU1QRFVfU0laRSkKIAogI2RlZmluZSBCV18yMAkJCTAKICNkZWZpbmUgQldfNDAJCQkxCkBAIC0zMTEsNjcgKzMxMywzNSBAQAogCXJldHVybiAmbWktPmdyb3Vwc1tpbmRleCAvIE1DU19HUk9VUF9SQVRFU10ucmF0ZXNbaW5kZXggJSBNQ1NfR1JPVVBfUkFURVNdOwogfQogCi0KIC8qCi0gKiBSZWNhbGN1bGF0ZSBzdWNjZXNzIHByb2JhYmlsaXRpZXMgYW5kIGNvdW50ZXJzIGZvciBhIHJhdGUgdXNpbmcgRVdNQQorICogUmV0dXJuIGN1cnJlbnQgdGhyb3VnaHB1dCBiYXNlZCBvbiB0aGUgYXZlcmFnZSBBLU1QRFUgbGVuZ3RoLCB0YWtpbmcgaW50bworICogYWNjb3VudCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyBhbmQgdGhlaXIgZXhwZWN0ZWQgbGVuZ3RoCiAgKi8KLXN0YXRpYyB2b2lkCi1taW5zdHJlbF9jYWxjX3JhdGVfZXdtYShzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXIpCitpbnQKK21pbnN0cmVsX2h0X2dldF90cF9hdmcoc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWksIGludCBncm91cCwgaW50IHJhdGUsCisJCSAgICAgICBpbnQgcHJvYl9ld21hKQogewotCWlmICh1bmxpa2VseShtci0+YXR0ZW1wdHMgPiAwKSkgewotCQltci0+c2FtcGxlX3NraXBwZWQgPSAwOwotCQltci0+Y3VyX3Byb2IgPSBNSU5TVFJFTF9GUkFDKG1yLT5zdWNjZXNzLCBtci0+YXR0ZW1wdHMpOwotCQlpZiAoIW1yLT5hdHRfaGlzdCkKLQkJCW1yLT5wcm9iYWJpbGl0eSA9IG1yLT5jdXJfcHJvYjsKLQkJZWxzZQotCQkJbXItPnByb2JhYmlsaXR5ID0gbWluc3RyZWxfZXdtYShtci0+cHJvYmFiaWxpdHksCi0JCQkJbXItPmN1cl9wcm9iLCBFV01BX0xFVkVMKTsKLQkJbXItPmF0dF9oaXN0ICs9IG1yLT5hdHRlbXB0czsKLQkJbXItPnN1Y2NfaGlzdCArPSBtci0+c3VjY2VzczsKLQl9IGVsc2UgewotCQltci0+c2FtcGxlX3NraXBwZWQrKzsKLQl9Ci0JbXItPmxhc3Rfc3VjY2VzcyA9IG1yLT5zdWNjZXNzOwotCW1yLT5sYXN0X2F0dGVtcHRzID0gbXItPmF0dGVtcHRzOwotCW1yLT5zdWNjZXNzID0gMDsKLQltci0+YXR0ZW1wdHMgPSAwOwotfQotCi0vKgotICogQ2FsY3VsYXRlIHRocm91Z2hwdXQgYmFzZWQgb24gdGhlIGF2ZXJhZ2UgQS1NUERVIGxlbmd0aCwgdGFraW5nIGludG8gYWNjb3VudAotICogdGhlIGV4cGVjdGVkIG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgYW5kIHRoZWlyIGV4cGVjdGVkIGxlbmd0aAotICovCi1zdGF0aWMgdm9pZAotbWluc3RyZWxfaHRfY2FsY190cChzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSwgaW50IGdyb3VwLCBpbnQgcmF0ZSkKLXsKLQlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXI7CiAJdW5zaWduZWQgaW50IG5zZWNzID0gMDsKLQl1bnNpZ25lZCBpbnQgdHA7Ci0JdW5zaWduZWQgaW50IHByb2I7CiAKLQltciA9ICZtaS0+Z3JvdXBzW2dyb3VwXS5yYXRlc1tyYXRlXTsKLQlwcm9iID0gbXItPnByb2JhYmlsaXR5OwotCi0JaWYgKHByb2IgPCBNSU5TVFJFTF9GUkFDKDEsIDEwKSkgewotCQltci0+Y3VyX3RwID0gMDsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogRm9yIHRoZSB0aHJvdWdocHV0IGNhbGN1bGF0aW9uLCBsaW1pdCB0aGUgcHJvYmFiaWxpdHkgdmFsdWUgdG8gOTAlIHRvCi0JICogYWNjb3VudCBmb3IgY29sbGlzaW9uIHJlbGF0ZWQgcGFja2V0IGVycm9yIHJhdGUgZmx1Y3R1YXRpb24KLQkgKi8KLQlpZiAocHJvYiA+IE1JTlNUUkVMX0ZSQUMoOSwgMTApKQotCQlwcm9iID0gTUlOU1RSRUxfRlJBQyg5LCAxMCk7CisJLyogZG8gbm90IGFjY291bnQgdGhyb3VnaHB1dCBpZiBzdWNlc3MgcHJvYiBpcyBiZWxvdyAxMCUgKi8KKwlpZiAocHJvYl9ld21hIDwgTUlOU1RSRUxfRlJBQygxMCwgMTAwKSkKKwkJcmV0dXJuIDA7CiAKIAlpZiAoZ3JvdXAgIT0gTUlOU1RSRUxfQ0NLX0dST1VQKQogCQluc2VjcyA9IDEwMDAgKiBtaS0+b3ZlcmhlYWQgLyBNSU5TVFJFTF9UUlVOQyhtaS0+YXZnX2FtcGR1X2xlbik7CiAKIAluc2VjcyArPSBtaW5zdHJlbF9tY3NfZ3JvdXBzW2dyb3VwXS5kdXJhdGlvbltyYXRlXTsKIAotCS8qIHByb2IgaXMgc2NhbGVkIC0gc2VlIE1JTlNUUkVMX0ZSQUMgYWJvdmUgKi8KLQl0cCA9IDEwMDAwMDAgKiAoKHByb2IgKiAxMDAwKSAvIG5zZWNzKTsKLQltci0+Y3VyX3RwID0gTUlOU1RSRUxfVFJVTkModHApOworCS8qCisJICogRm9yIHRoZSB0aHJvdWdocHV0IGNhbGN1bGF0aW9uLCBsaW1pdCB0aGUgcHJvYmFiaWxpdHkgdmFsdWUgdG8gOTAlIHRvCisJICogYWNjb3VudCBmb3IgY29sbGlzaW9uIHJlbGF0ZWQgcGFja2V0IGVycm9yIHJhdGUgZmx1Y3R1YXRpb24KKwkgKiAocHJvYiBpcyBzY2FsZWQgLSBzZWUgTUlOU1RSRUxfRlJBQyBhYm92ZSkKKwkgKi8KKwlpZiAocHJvYl9ld21hID4gTUlOU1RSRUxfRlJBQyg5MCwgMTAwKSkKKwkJcmV0dXJuIE1JTlNUUkVMX1RSVU5DKDEwMDAwMCAqICgoTUlOU1RSRUxfRlJBQyg5MCwgMTAwKSAqIDEwMDApCisJCQkJCQkJCSAgICAgIC8gbnNlY3MpKTsKKwllbHNlCisJCXJldHVybiBNSU5TVFJFTF9UUlVOQygxMDAwMDAgKiAoKHByb2JfZXdtYSAqIDEwMDApIC8gbnNlY3MpKTsKIH0KIAogLyoKQEAgLTM4NSwyMiArMzU1LDIzIEBACiBtaW5zdHJlbF9odF9zb3J0X2Jlc3RfdHBfcmF0ZXMoc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWksIHUxNiBpbmRleCwKIAkJCSAgICAgICB1MTYgKnRwX2xpc3QpCiB7Ci0JaW50IGN1cl9ncm91cCwgY3VyX2lkeCwgY3VyX3RociwgY3VyX3Byb2I7Ci0JaW50IHRtcF9ncm91cCwgdG1wX2lkeCwgdG1wX3RociwgdG1wX3Byb2I7CisJaW50IGN1cl9ncm91cCwgY3VyX2lkeCwgY3VyX3RwX2F2ZywgY3VyX3Byb2I7CisJaW50IHRtcF9ncm91cCwgdG1wX2lkeCwgdG1wX3RwX2F2ZywgdG1wX3Byb2I7CiAJaW50IGogPSBNQVhfVEhSX1JBVEVTOwogCiAJY3VyX2dyb3VwID0gaW5kZXggLyBNQ1NfR1JPVVBfUkFURVM7CiAJY3VyX2lkeCA9IGluZGV4ICAlIE1DU19HUk9VUF9SQVRFUzsKLQljdXJfdGhyID0gbWktPmdyb3Vwc1tjdXJfZ3JvdXBdLnJhdGVzW2N1cl9pZHhdLmN1cl90cDsKLQljdXJfcHJvYiA9IG1pLT5ncm91cHNbY3VyX2dyb3VwXS5yYXRlc1tjdXJfaWR4XS5wcm9iYWJpbGl0eTsKKwljdXJfcHJvYiA9IG1pLT5ncm91cHNbY3VyX2dyb3VwXS5yYXRlc1tjdXJfaWR4XS5wcm9iX2V3bWE7CisJY3VyX3RwX2F2ZyA9IG1pbnN0cmVsX2h0X2dldF90cF9hdmcobWksIGN1cl9ncm91cCwgY3VyX2lkeCwgY3VyX3Byb2IpOwogCiAJZG8gewogCQl0bXBfZ3JvdXAgPSB0cF9saXN0W2ogLSAxXSAvIE1DU19HUk9VUF9SQVRFUzsKIAkJdG1wX2lkeCA9IHRwX2xpc3RbaiAtIDFdICUgTUNTX0dST1VQX1JBVEVTOwotCQl0bXBfdGhyID0gbWktPmdyb3Vwc1t0bXBfZ3JvdXBdLnJhdGVzW3RtcF9pZHhdLmN1cl90cDsKLQkJdG1wX3Byb2IgPSBtaS0+Z3JvdXBzW3RtcF9ncm91cF0ucmF0ZXNbdG1wX2lkeF0ucHJvYmFiaWxpdHk7Ci0JCWlmIChjdXJfdGhyIDwgdG1wX3RociB8fAotCQkgICAgKGN1cl90aHIgPT0gdG1wX3RociAmJiBjdXJfcHJvYiA8PSB0bXBfcHJvYikpCisJCXRtcF9wcm9iID0gbWktPmdyb3Vwc1t0bXBfZ3JvdXBdLnJhdGVzW3RtcF9pZHhdLnByb2JfZXdtYTsKKwkJdG1wX3RwX2F2ZyA9IG1pbnN0cmVsX2h0X2dldF90cF9hdmcobWksIHRtcF9ncm91cCwgdG1wX2lkeCwKKwkJCQkJCSAgICB0bXBfcHJvYik7CisJCWlmIChjdXJfdHBfYXZnIDwgdG1wX3RwX2F2ZyB8fAorCQkgICAgKGN1cl90cF9hdmcgPT0gdG1wX3RwX2F2ZyAmJiBjdXJfcHJvYiA8PSB0bXBfcHJvYikpCiAJCQlicmVhazsKIAkJai0tOwogCX0gd2hpbGUgKGogPiAwKTsKQEAgLTQyMCwxNiArMzkxLDIxIEBACiBtaW5zdHJlbF9odF9zZXRfYmVzdF9wcm9iX3JhdGUoc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWksIHUxNiBpbmRleCkKIHsKIAlzdHJ1Y3QgbWluc3RyZWxfbWNzX2dyb3VwX2RhdGEgKm1nOwotCXN0cnVjdCBtaW5zdHJlbF9yYXRlX3N0YXRzICptcjsKLQlpbnQgdG1wX2dyb3VwLCB0bXBfaWR4LCB0bXBfdHAsIHRtcF9wcm9iLCBtYXhfdHBfZ3JvdXA7CisJc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1yczsKKwlpbnQgdG1wX2dyb3VwLCB0bXBfaWR4LCB0bXBfdHBfYXZnLCB0bXBfcHJvYjsKKwlpbnQgbWF4X3RwX2dyb3VwLCBjdXJfdHBfYXZnLCBjdXJfZ3JvdXAsIGN1cl9pZHg7CisJaW50IG1heF9ncHJfZ3JvdXAsIG1heF9ncHJfaWR4OworCWludCBtYXhfZ3ByX3RwX2F2ZywgbWF4X2dwcl9wcm9iOwogCisJY3VyX2dyb3VwID0gaW5kZXggLyBNQ1NfR1JPVVBfUkFURVM7CisJY3VyX2lkeCA9IGluZGV4ICUgTUNTX0dST1VQX1JBVEVTOwogCW1nID0gJm1pLT5ncm91cHNbaW5kZXggLyBNQ1NfR1JPVVBfUkFURVNdOwotCW1yID0gJm1nLT5yYXRlc1tpbmRleCAlIE1DU19HUk9VUF9SQVRFU107CisJbXJzID0gJm1nLT5yYXRlc1tpbmRleCAlIE1DU19HUk9VUF9SQVRFU107CiAKIAl0bXBfZ3JvdXAgPSBtaS0+bWF4X3Byb2JfcmF0ZSAvIE1DU19HUk9VUF9SQVRFUzsKIAl0bXBfaWR4ID0gbWktPm1heF9wcm9iX3JhdGUgJSBNQ1NfR1JPVVBfUkFURVM7Ci0JdG1wX3RwID0gbWktPmdyb3Vwc1t0bXBfZ3JvdXBdLnJhdGVzW3RtcF9pZHhdLmN1cl90cDsKLQl0bXBfcHJvYiA9IG1pLT5ncm91cHNbdG1wX2dyb3VwXS5yYXRlc1t0bXBfaWR4XS5wcm9iYWJpbGl0eTsKKwl0bXBfcHJvYiA9IG1pLT5ncm91cHNbdG1wX2dyb3VwXS5yYXRlc1t0bXBfaWR4XS5wcm9iX2V3bWE7CisJdG1wX3RwX2F2ZyA9IG1pbnN0cmVsX2h0X2dldF90cF9hdmcobWksIHRtcF9ncm91cCwgdG1wX2lkeCwgdG1wX3Byb2IpOwogCiAJLyogaWYgbWF4X3RwX3JhdGVbMF0gaXMgZnJvbSBNQ1NfR1JPVVAgbWF4X3Byb2JfcmF0ZSBnZXQgc2VsZWN0ZWQgZnJvbQogCSAqIE1DU19HUk9VUCBhcyB3ZWxsIGFzIENDS19HUk9VUCByYXRlcyBkbyBub3QgYWxsb3cgYWdncmVnYXRpb24gKi8KQEAgLTQzOCwxNSArNDE0LDI0IEBACiAJICAgIChtYXhfdHBfZ3JvdXAgIT0gTUlOU1RSRUxfQ0NLX0dST1VQKSkKIAkJcmV0dXJuOwogCi0JaWYgKG1yLT5wcm9iYWJpbGl0eSA+IE1JTlNUUkVMX0ZSQUMoNzUsIDEwMCkpIHsKLQkJaWYgKG1yLT5jdXJfdHAgPiB0bXBfdHApCisJaWYgKG1ycy0+cHJvYl9ld21hID4gTUlOU1RSRUxfRlJBQyg3NSwgMTAwKSkgeworCQljdXJfdHBfYXZnID0gbWluc3RyZWxfaHRfZ2V0X3RwX2F2ZyhtaSwgY3VyX2dyb3VwLCBjdXJfaWR4LAorCQkJCQkJICAgIG1ycy0+cHJvYl9ld21hKTsKKwkJaWYgKGN1cl90cF9hdmcgPiB0bXBfdHBfYXZnKQogCQkJbWktPm1heF9wcm9iX3JhdGUgPSBpbmRleDsKLQkJaWYgKG1yLT5jdXJfdHAgPiBtZy0+cmF0ZXNbbWctPm1heF9ncm91cF9wcm9iX3JhdGVdLmN1cl90cCkKKworCQltYXhfZ3ByX2dyb3VwID0gbWctPm1heF9ncm91cF9wcm9iX3JhdGUgLyBNQ1NfR1JPVVBfUkFURVM7CisJCW1heF9ncHJfaWR4ID0gbWctPm1heF9ncm91cF9wcm9iX3JhdGUgJQlNQ1NfR1JPVVBfUkFURVM7CisJCW1heF9ncHJfcHJvYiA9IG1pLT5ncm91cHNbbWF4X2dwcl9ncm91cF0ucmF0ZXNbbWF4X2dwcl9pZHhdLnByb2JfZXdtYTsKKwkJbWF4X2dwcl90cF9hdmcgPSBtaW5zdHJlbF9odF9nZXRfdHBfYXZnKG1pLCBtYXhfZ3ByX2dyb3VwLAorCQkJCQkJCW1heF9ncHJfaWR4LAorCQkJCQkJCW1heF9ncHJfcHJvYik7CisJCWlmIChjdXJfdHBfYXZnID4gbWF4X2dwcl90cF9hdmcpCiAJCQltZy0+bWF4X2dyb3VwX3Byb2JfcmF0ZSA9IGluZGV4OwogCX0gZWxzZSB7Ci0JCWlmIChtci0+cHJvYmFiaWxpdHkgPiB0bXBfcHJvYikKKwkJaWYgKG1ycy0+cHJvYl9ld21hID4gdG1wX3Byb2IpCiAJCQltaS0+bWF4X3Byb2JfcmF0ZSA9IGluZGV4OwotCQlpZiAobXItPnByb2JhYmlsaXR5ID4gbWctPnJhdGVzW21nLT5tYXhfZ3JvdXBfcHJvYl9yYXRlXS5wcm9iYWJpbGl0eSkKKwkJaWYgKG1ycy0+cHJvYl9ld21hID4gbWctPnJhdGVzW21nLT5tYXhfZ3JvdXBfcHJvYl9yYXRlXS5wcm9iX2V3bWEpCiAJCQltZy0+bWF4X2dyb3VwX3Byb2JfcmF0ZSA9IGluZGV4OwogCX0KIH0KQEAgLTQ2MywxNiArNDQ4LDE4IEBACiAJCQkJIHUxNiB0bXBfbWNzX3RwX3JhdGVbTUFYX1RIUl9SQVRFU10sCiAJCQkJIHUxNiB0bXBfY2NrX3RwX3JhdGVbTUFYX1RIUl9SQVRFU10pCiB7Ci0JdW5zaWduZWQgaW50IHRtcF9ncm91cCwgdG1wX2lkeCwgdG1wX2Nja190cCwgdG1wX21jc190cDsKKwl1bnNpZ25lZCBpbnQgdG1wX2dyb3VwLCB0bXBfaWR4LCB0bXBfY2NrX3RwLCB0bXBfbWNzX3RwLCB0bXBfcHJvYjsKIAlpbnQgaTsKIAogCXRtcF9ncm91cCA9IHRtcF9jY2tfdHBfcmF0ZVswXSAvIE1DU19HUk9VUF9SQVRFUzsKIAl0bXBfaWR4ID0gdG1wX2Nja190cF9yYXRlWzBdICUgTUNTX0dST1VQX1JBVEVTOwotCXRtcF9jY2tfdHAgPSBtaS0+Z3JvdXBzW3RtcF9ncm91cF0ucmF0ZXNbdG1wX2lkeF0uY3VyX3RwOworCXRtcF9wcm9iID0gbWktPmdyb3Vwc1t0bXBfZ3JvdXBdLnJhdGVzW3RtcF9pZHhdLnByb2JfZXdtYTsKKwl0bXBfY2NrX3RwID0gbWluc3RyZWxfaHRfZ2V0X3RwX2F2ZyhtaSwgdG1wX2dyb3VwLCB0bXBfaWR4LCB0bXBfcHJvYik7CiAKIAl0bXBfZ3JvdXAgPSB0bXBfbWNzX3RwX3JhdGVbMF0gLyBNQ1NfR1JPVVBfUkFURVM7CiAJdG1wX2lkeCA9IHRtcF9tY3NfdHBfcmF0ZVswXSAlIE1DU19HUk9VUF9SQVRFUzsKLQl0bXBfbWNzX3RwID0gbWktPmdyb3Vwc1t0bXBfZ3JvdXBdLnJhdGVzW3RtcF9pZHhdLmN1cl90cDsKKwl0bXBfcHJvYiA9IG1pLT5ncm91cHNbdG1wX2dyb3VwXS5yYXRlc1t0bXBfaWR4XS5wcm9iX2V3bWE7CisJdG1wX21jc190cCA9IG1pbnN0cmVsX2h0X2dldF90cF9hdmcobWksIHRtcF9ncm91cCwgdG1wX2lkeCwgdG1wX3Byb2IpOwogCiAJaWYgKHRtcF9jY2tfdHAgPiB0bXBfbWNzX3RwKSB7CiAJCWZvcihpID0gMDsgaSA8IE1BWF9USFJfUkFURVM7IGkrKykgewpAQCAtNDkxLDggKzQ3OCw3IEBACiBtaW5zdHJlbF9odF9wcm9iX3JhdGVfcmVkdWNlX3N0cmVhbXMoc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWkpCiB7CiAJc3RydWN0IG1pbnN0cmVsX21jc19ncm91cF9kYXRhICptZzsKLQlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXI7Ci0JaW50IHRtcF9tYXhfc3RyZWFtcywgZ3JvdXA7CisJaW50IHRtcF9tYXhfc3RyZWFtcywgZ3JvdXAsIHRtcF9pZHgsIHRtcF9wcm9iOwogCWludCB0bXBfdHAgPSAwOwogCiAJdG1wX21heF9zdHJlYW1zID0gbWluc3RyZWxfbWNzX2dyb3Vwc1ttaS0+bWF4X3RwX3JhdGVbMF0gLwpAQCAtNTAxLDExICs0ODcsMTYgQEAKIAkJbWcgPSAmbWktPmdyb3Vwc1tncm91cF07CiAJCWlmICghbWctPnN1cHBvcnRlZCB8fCBncm91cCA9PSBNSU5TVFJFTF9DQ0tfR1JPVVApCiAJCQljb250aW51ZTsKLQkJbXIgPSBtaW5zdHJlbF9nZXRfcmF0ZXN0YXRzKG1pLCBtZy0+bWF4X2dyb3VwX3Byb2JfcmF0ZSk7Ci0JCWlmICh0bXBfdHAgPCBtci0+Y3VyX3RwICYmCisKKwkJdG1wX2lkeCA9IG1nLT5tYXhfZ3JvdXBfcHJvYl9yYXRlICUgTUNTX0dST1VQX1JBVEVTOworCQl0bXBfcHJvYiA9IG1pLT5ncm91cHNbZ3JvdXBdLnJhdGVzW3RtcF9pZHhdLnByb2JfZXdtYTsKKworCQlpZiAodG1wX3RwIDwgbWluc3RyZWxfaHRfZ2V0X3RwX2F2ZyhtaSwgZ3JvdXAsIHRtcF9pZHgsIHRtcF9wcm9iKSAmJgogCQkgICAobWluc3RyZWxfbWNzX2dyb3Vwc1tncm91cF0uc3RyZWFtcyA8IHRtcF9tYXhfc3RyZWFtcykpIHsKIAkJCQltaS0+bWF4X3Byb2JfcmF0ZSA9IG1nLT5tYXhfZ3JvdXBfcHJvYl9yYXRlOwotCQkJCXRtcF90cCA9IG1yLT5jdXJfdHA7CisJCQkJdG1wX3RwID0gbWluc3RyZWxfaHRfZ2V0X3RwX2F2ZyhtaSwgZ3JvdXAsCisJCQkJCQkJCXRtcF9pZHgsCisJCQkJCQkJCXRtcF9wcm9iKTsKIAkJfQogCX0KIH0KQEAgLTUyMyw4ICs1MTQsOCBAQAogbWluc3RyZWxfaHRfdXBkYXRlX3N0YXRzKHN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCwgc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWkpCiB7CiAJc3RydWN0IG1pbnN0cmVsX21jc19ncm91cF9kYXRhICptZzsKLQlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXI7Ci0JaW50IGdyb3VwLCBpLCBqOworCXN0cnVjdCBtaW5zdHJlbF9yYXRlX3N0YXRzICptcnM7CisJaW50IGdyb3VwLCBpLCBqLCBjdXJfcHJvYjsKIAl1MTYgdG1wX21jc190cF9yYXRlW01BWF9USFJfUkFURVNdLCB0bXBfZ3JvdXBfdHBfcmF0ZVtNQVhfVEhSX1JBVEVTXTsKIAl1MTYgdG1wX2Nja190cF9yYXRlW01BWF9USFJfUkFURVNdLCBpbmRleDsKIApAQCAtNTYzLDEyICs1NTQsMTIgQEAKIAogCQkJaW5kZXggPSBNQ1NfR1JPVVBfUkFURVMgKiBncm91cCArIGk7CiAKLQkJCW1yID0gJm1nLT5yYXRlc1tpXTsKLQkJCW1yLT5yZXRyeV91cGRhdGVkID0gZmFsc2U7Ci0JCQltaW5zdHJlbF9jYWxjX3JhdGVfZXdtYShtcik7Ci0JCQltaW5zdHJlbF9odF9jYWxjX3RwKG1pLCBncm91cCwgaSk7CisJCQltcnMgPSAmbWctPnJhdGVzW2ldOworCQkJbXJzLT5yZXRyeV91cGRhdGVkID0gZmFsc2U7CisJCQltaW5zdHJlbF9jYWxjX3JhdGVfc3RhdHMobXJzKTsKKwkJCWN1cl9wcm9iID0gbXJzLT5wcm9iX2V3bWE7CiAKLQkJCWlmICghbXItPmN1cl90cCkKKwkJCWlmIChtaW5zdHJlbF9odF9nZXRfdHBfYXZnKG1pLCBncm91cCwgaSwgY3VyX3Byb2IpID09IDApCiAJCQkJY29udGludWU7CiAKIAkJCS8qIEZpbmQgbWF4IHRocm91Z2hwdXQgcmF0ZSBzZXQgKi8KQEAgLTYxMiw3ICs2MDMsNyBAQAogI2VuZGlmCiAKIAkvKiBSZXNldCB1cGRhdGUgdGltZXIgKi8KLQltaS0+c3RhdHNfdXBkYXRlID0gamlmZmllczsKKwltaS0+bGFzdF9zdGF0c191cGRhdGUgPSBqaWZmaWVzOwogfQogCiBzdGF0aWMgYm9vbApAQCAtNjM1LDcgKzYyNiw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1taW5zdHJlbF9uZXh0X3NhbXBsZV9pZHgoc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWkpCittaW5zdHJlbF9zZXRfbmV4dF9zYW1wbGVfaWR4KHN0cnVjdCBtaW5zdHJlbF9odF9zdGEgKm1pKQogewogCXN0cnVjdCBtaW5zdHJlbF9tY3NfZ3JvdXBfZGF0YSAqbWc7CiAKQEAgLTc3Niw3ICs3NjcsOCBAQAogCQl1cGRhdGUgPSB0cnVlOwogCX0KIAotCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG1pLT5zdGF0c191cGRhdGUgKyAobXAtPnVwZGF0ZV9pbnRlcnZhbCAvIDIgKiBIWikgLyAxMDAwKSkgeworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIG1pLT5sYXN0X3N0YXRzX3VwZGF0ZSArCisJCQkJKG1wLT51cGRhdGVfaW50ZXJ2YWwgLyAyICogSFopIC8gMTAwMCkpIHsKIAkJdXBkYXRlID0gdHJ1ZTsKIAkJbWluc3RyZWxfaHRfdXBkYXRlX3N0YXRzKG1wLCBtaSk7CiAJfQpAQCAtNzg5LDcgKzc4MSw3IEBACiBtaW5zdHJlbF9jYWxjX3JldHJhbnNtaXQoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpCiB7Ci0Jc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1yOworCXN0cnVjdCBtaW5zdHJlbF9yYXRlX3N0YXRzICptcnM7CiAJY29uc3Qgc3RydWN0IG1jc19ncm91cCAqZ3JvdXA7CiAJdW5zaWduZWQgaW50IHR4X3RpbWUsIHR4X3RpbWVfcnRzY3RzLCB0eF90aW1lX2RhdGE7CiAJdW5zaWduZWQgaW50IGN3ID0gbXAtPmN3X21pbjsKQEAgLTc5OCwxNiArNzkwLDE2IEBACiAJdW5zaWduZWQgaW50IGFtcGR1X2xlbiA9IE1JTlNUUkVMX1RSVU5DKG1pLT5hdmdfYW1wZHVfbGVuKTsKIAl1bnNpZ25lZCBpbnQgb3ZlcmhlYWQgPSAwLCBvdmVyaGVhZF9ydHNjdHMgPSAwOwogCi0JbXIgPSBtaW5zdHJlbF9nZXRfcmF0ZXN0YXRzKG1pLCBpbmRleCk7Ci0JaWYgKG1yLT5wcm9iYWJpbGl0eSA8IE1JTlNUUkVMX0ZSQUMoMSwgMTApKSB7Ci0JCW1yLT5yZXRyeV9jb3VudCA9IDE7Ci0JCW1yLT5yZXRyeV9jb3VudF9ydHNjdHMgPSAxOworCW1ycyA9IG1pbnN0cmVsX2dldF9yYXRlc3RhdHMobWksIGluZGV4KTsKKwlpZiAobXJzLT5wcm9iX2V3bWEgPCBNSU5TVFJFTF9GUkFDKDEsIDEwKSkgeworCQltcnMtPnJldHJ5X2NvdW50ID0gMTsKKwkJbXJzLT5yZXRyeV9jb3VudF9ydHNjdHMgPSAxOwogCQlyZXR1cm47CiAJfQogCi0JbXItPnJldHJ5X2NvdW50ID0gMjsKLQltci0+cmV0cnlfY291bnRfcnRzY3RzID0gMjsKLQltci0+cmV0cnlfdXBkYXRlZCA9IHRydWU7CisJbXJzLT5yZXRyeV9jb3VudCA9IDI7CisJbXJzLT5yZXRyeV9jb3VudF9ydHNjdHMgPSAyOworCW1ycy0+cmV0cnlfdXBkYXRlZCA9IHRydWU7CiAKIAlncm91cCA9ICZtaW5zdHJlbF9tY3NfZ3JvdXBzW2luZGV4IC8gTUNTX0dST1VQX1JBVEVTXTsKIAl0eF90aW1lX2RhdGEgPSBncm91cC0+ZHVyYXRpb25baW5kZXggJSBNQ1NfR1JPVVBfUkFURVNdICogYW1wZHVfbGVuIC8gMTAwMDsKQEAgLTgzOCw5ICs4MzAsOSBAQAogCQl0eF90aW1lX3J0c2N0cyArPSBjdGltZSArIG92ZXJoZWFkX3J0c2N0cyArIHR4X3RpbWVfZGF0YTsKIAogCQlpZiAodHhfdGltZV9ydHNjdHMgPCBtcC0+c2VnbWVudF9zaXplKQotCQkJbXItPnJldHJ5X2NvdW50X3J0c2N0cysrOworCQkJbXJzLT5yZXRyeV9jb3VudF9ydHNjdHMrKzsKIAl9IHdoaWxlICgodHhfdGltZSA8IG1wLT5zZWdtZW50X3NpemUpICYmCi0JICAgICAgICAgKCsrbXItPnJldHJ5X2NvdW50IDwgbXAtPm1heF9yZXRyeSkpOworCSAgICAgICAgICgrK21ycy0+cmV0cnlfY291bnQgPCBtcC0+bWF4X3JldHJ5KSk7CiB9CiAKIApAQCAtODQ5LDIyICs4NDEsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX3JhdGVzICpyYXRldGJsLCBpbnQgb2Zmc2V0LCBpbnQgaW5kZXgpCiB7CiAJY29uc3Qgc3RydWN0IG1jc19ncm91cCAqZ3JvdXAgPSAmbWluc3RyZWxfbWNzX2dyb3Vwc1tpbmRleCAvIE1DU19HUk9VUF9SQVRFU107Ci0Jc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1yOworCXN0cnVjdCBtaW5zdHJlbF9yYXRlX3N0YXRzICptcnM7CiAJdTggaWR4OwogCXUxNiBmbGFncyA9IGdyb3VwLT5mbGFnczsKIAotCW1yID0gbWluc3RyZWxfZ2V0X3JhdGVzdGF0cyhtaSwgaW5kZXgpOwotCWlmICghbXItPnJldHJ5X3VwZGF0ZWQpCisJbXJzID0gbWluc3RyZWxfZ2V0X3JhdGVzdGF0cyhtaSwgaW5kZXgpOworCWlmICghbXJzLT5yZXRyeV91cGRhdGVkKQogCQltaW5zdHJlbF9jYWxjX3JldHJhbnNtaXQobXAsIG1pLCBpbmRleCk7CiAKLQlpZiAobXItPnByb2JhYmlsaXR5IDwgTUlOU1RSRUxfRlJBQygyMCwgMTAwKSB8fCAhbXItPnJldHJ5X2NvdW50KSB7CisJaWYgKG1ycy0+cHJvYl9ld21hIDwgTUlOU1RSRUxfRlJBQygyMCwgMTAwKSB8fCAhbXJzLT5yZXRyeV9jb3VudCkgewogCQlyYXRldGJsLT5yYXRlW29mZnNldF0uY291bnQgPSAyOwogCQlyYXRldGJsLT5yYXRlW29mZnNldF0uY291bnRfcnRzID0gMjsKIAkJcmF0ZXRibC0+cmF0ZVtvZmZzZXRdLmNvdW50X2N0cyA9IDI7CiAJfSBlbHNlIHsKLQkJcmF0ZXRibC0+cmF0ZVtvZmZzZXRdLmNvdW50ID0gbXItPnJldHJ5X2NvdW50OwotCQlyYXRldGJsLT5yYXRlW29mZnNldF0uY291bnRfY3RzID0gbXItPnJldHJ5X2NvdW50OwotCQlyYXRldGJsLT5yYXRlW29mZnNldF0uY291bnRfcnRzID0gbXItPnJldHJ5X2NvdW50X3J0c2N0czsKKwkJcmF0ZXRibC0+cmF0ZVtvZmZzZXRdLmNvdW50ID0gbXJzLT5yZXRyeV9jb3VudDsKKwkJcmF0ZXRibC0+cmF0ZVtvZmZzZXRdLmNvdW50X2N0cyA9IG1ycy0+cmV0cnlfY291bnQ7CisJCXJhdGV0YmwtPnJhdGVbb2Zmc2V0XS5jb3VudF9ydHMgPSBtcnMtPnJldHJ5X2NvdW50X3J0c2N0czsKIAl9CiAKIAlpZiAoaW5kZXggLyBNQ1NfR1JPVVBfUkFURVMgPT0gTUlOU1RSRUxfQ0NLX0dST1VQKQpAQCAtOTIyLDcgKzkxNCw3IEBACiBzdGF0aWMgaW50CiBtaW5zdHJlbF9nZXRfc2FtcGxlX3JhdGUoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSkKIHsKLQlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXI7CisJc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1yczsKIAlzdHJ1Y3QgbWluc3RyZWxfbWNzX2dyb3VwX2RhdGEgKm1nOwogCXVuc2lnbmVkIGludCBzYW1wbGVfZHVyLCBzYW1wbGVfZ3JvdXAsIGN1cl9tYXhfdHBfc3RyZWFtczsKIAlpbnQgc2FtcGxlX2lkeCA9IDA7CkBAIC05MzgsMTIgKzkzMCwxMiBAQAogCXNhbXBsZV9ncm91cCA9IG1pLT5zYW1wbGVfZ3JvdXA7CiAJbWcgPSAmbWktPmdyb3Vwc1tzYW1wbGVfZ3JvdXBdOwogCXNhbXBsZV9pZHggPSBzYW1wbGVfdGFibGVbbWctPmNvbHVtbl1bbWctPmluZGV4XTsKLQltaW5zdHJlbF9uZXh0X3NhbXBsZV9pZHgobWkpOworCW1pbnN0cmVsX3NldF9uZXh0X3NhbXBsZV9pZHgobWkpOwogCiAJaWYgKCEobWctPnN1cHBvcnRlZCAmIEJJVChzYW1wbGVfaWR4KSkpCiAJCXJldHVybiAtMTsKIAotCW1yID0gJm1nLT5yYXRlc1tzYW1wbGVfaWR4XTsKKwltcnMgPSAmbWctPnJhdGVzW3NhbXBsZV9pZHhdOwogCXNhbXBsZV9pZHggKz0gc2FtcGxlX2dyb3VwICogTUNTX0dST1VQX1JBVEVTOwogCiAJLyoKQEAgLTk2MCw3ICs5NTIsNyBAQAogCSAqIERvIG5vdCBzYW1wbGUgaWYgdGhlIHByb2JhYmlsaXR5IGlzIGFscmVhZHkgaGlnaGVyIHRoYW4gOTUlCiAJICogdG8gYXZvaWQgd2FzdGluZyBhaXJ0aW1lLgogCSAqLwotCWlmIChtci0+cHJvYmFiaWxpdHkgPiBNSU5TVFJFTF9GUkFDKDk1LCAxMDApKQorCWlmIChtcnMtPnByb2JfZXdtYSA+IE1JTlNUUkVMX0ZSQUMoOTUsIDEwMCkpCiAJCXJldHVybiAtMTsKIAogCS8qCkBAIC05NzUsNyArOTY3LDcgQEAKIAkgICAgKGN1cl9tYXhfdHBfc3RyZWFtcyAtIDEgPAogCSAgICAgbWluc3RyZWxfbWNzX2dyb3Vwc1tzYW1wbGVfZ3JvdXBdLnN0cmVhbXMgfHwKIAkgICAgIHNhbXBsZV9kdXIgPj0gbWluc3RyZWxfZ2V0X2R1cmF0aW9uKG1pLT5tYXhfcHJvYl9yYXRlKSkpIHsKLQkJaWYgKG1yLT5zYW1wbGVfc2tpcHBlZCA8IDIwKQorCQlpZiAobXJzLT5zYW1wbGVfc2tpcHBlZCA8IDIwKQogCQkJcmV0dXJuIC0xOwogCiAJCWlmIChtaS0+c2FtcGxlX3Nsb3crKyA+IDIpCkBAIC0xMTI5LDcgKzExMjEsNyBAQAogCW1lbXNldChtaSwgMCwgc2l6ZW9mKCptaSkpOwogCiAJbWktPnN0YSA9IHN0YTsKLQltaS0+c3RhdHNfdXBkYXRlID0gamlmZmllczsKKwltaS0+bGFzdF9zdGF0c191cGRhdGUgPSBqaWZmaWVzOwogCiAJYWNrX2R1ciA9IGllZWU4MDIxMV9mcmFtZV9kdXJhdGlvbihzYmFuZC0+YmFuZCwgMTAsIDYwLCAxLCAxLCAwKTsKIAltaS0+b3ZlcmhlYWQgPSBpZWVlODAyMTFfZnJhbWVfZHVyYXRpb24oc2JhbmQtPmJhbmQsIDAsIDYwLCAxLCAxLCAwKTsKQEAgLTEzMjYsMTYgKzEzMTgsMTkgQEAKIHsKIAlzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhX3ByaXYgKm1zcCA9IHByaXZfc3RhOwogCXN0cnVjdCBtaW5zdHJlbF9odF9zdGEgKm1pID0gJm1zcC0+aHQ7Ci0JaW50IGksIGo7CisJaW50IGksIGosIHByb2IsIHRwX2F2ZzsKIAogCWlmICghbXNwLT5pc19odCkKIAkJcmV0dXJuIG1hYzgwMjExX21pbnN0cmVsLmdldF9leHBlY3RlZF90aHJvdWdocHV0KHByaXZfc3RhKTsKIAogCWkgPSBtaS0+bWF4X3RwX3JhdGVbMF0gLyBNQ1NfR1JPVVBfUkFURVM7CiAJaiA9IG1pLT5tYXhfdHBfcmF0ZVswXSAlIE1DU19HUk9VUF9SQVRFUzsKKwlwcm9iID0gbWktPmdyb3Vwc1tpXS5yYXRlc1tqXS5wcm9iX2V3bWE7CiAKLQkvKiBjb252ZXJ0IGN1cl90cCBmcm9tIHBrdCBwZXIgc2Vjb25kIGluIGticHMgKi8KLQlyZXR1cm4gbWktPmdyb3Vwc1tpXS5yYXRlc1tqXS5jdXJfdHAgKiBBVkdfUEtUX1NJWkUgKiA4IC8gMTAyNDsKKwkvKiBjb252ZXJ0IHRwX2F2ZyBmcm9tIHBrdCBwZXIgc2Vjb25kIGluIGticHMgKi8KKwl0cF9hdmcgPSBtaW5zdHJlbF9odF9nZXRfdHBfYXZnKG1pLCBpLCBqLCBwcm9iKSAqIEFWR19QS1RfU0laRSAqIDggLyAxMDI0OworCisJcmV0dXJuIHRwX2F2ZzsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCByYXRlX2NvbnRyb2xfb3BzIG1hYzgwMjExX21pbnN0cmVsX2h0ID0gewpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHQuaCBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0LmgKaW5kZXggZjIyMTdkNi4uZThiNTJhOSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHQuaAorKysgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5oCkBAIC03OCw3ICs3OCw3IEBACiAJdTE2IG1heF9wcm9iX3JhdGU7CiAKIAkvKiB0aW1lIG9mIGxhc3Qgc3RhdHVzIHVwZGF0ZSAqLwotCXVuc2lnbmVkIGxvbmcgc3RhdHNfdXBkYXRlOworCXVuc2lnbmVkIGxvbmcgbGFzdF9zdGF0c191cGRhdGU7CiAKIAkvKiBvdmVyaGVhZCB0aW1lIGluIHVzZWMgZm9yIGVhY2ggZnJhbWUgKi8KIAl1bnNpZ25lZCBpbnQgb3ZlcmhlYWQ7CkBAIC0xMTIsNiArMTEyLDcgQEAKIAl9OwogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCiAJc3RydWN0IGRlbnRyeSAqZGJnX3N0YXRzOworCXN0cnVjdCBkZW50cnkgKmRiZ19zdGF0c19jc3Y7CiAjZW5kaWYKIAl2b2lkICpyYXRlbGlzdDsKIAl2b2lkICpzYW1wbGVfdGFibGU7CkBAIC0xMjAsNSArMTIxLDcgQEAKIAogdm9pZCBtaW5zdHJlbF9odF9hZGRfc3RhX2RlYnVnZnModm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEsIHN0cnVjdCBkZW50cnkgKmRpcik7CiB2b2lkIG1pbnN0cmVsX2h0X3JlbW92ZV9zdGFfZGVidWdmcyh2b2lkICpwcml2LCB2b2lkICpwcml2X3N0YSk7CitpbnQgbWluc3RyZWxfaHRfZ2V0X3RwX2F2ZyhzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSwgaW50IGdyb3VwLCBpbnQgcmF0ZSwKKwkJCSAgIGludCBwcm9iX2V3bWEpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0X2RlYnVnZnMuYyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0X2RlYnVnZnMuYwppbmRleCAyMGM2NzZiLi42ODIyY2UwIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odF9kZWJ1Z2ZzLmMKKysrIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHRfZGVidWdmcy5jCkBAIC0xOSw3ICsxOSw3IEBACiBtaW5zdHJlbF9odF9zdGF0c19kdW1wKHN0cnVjdCBtaW5zdHJlbF9odF9zdGEgKm1pLCBpbnQgaSwgY2hhciAqcCkKIHsKIAljb25zdCBzdHJ1Y3QgbWNzX2dyb3VwICptZzsKLQl1bnNpZ25lZCBpbnQgaiwgdHAsIHByb2IsIGVwcm9iOworCXVuc2lnbmVkIGludCBqLCB0cF9tYXgsIHRwX2F2ZywgcHJvYiwgZXByb2IsIHR4X3RpbWU7CiAJY2hhciBodG1vZGUgPSAnMic7CiAJY2hhciBnaW1vZGUgPSAnTCc7CiAJdTMyIGdmbGFnczsKQEAgLTM4LDE5ICszOCwyNiBAQAogCQlnaW1vZGUgPSAnUyc7CiAKIAlmb3IgKGogPSAwOyBqIDwgTUNTX0dST1VQX1JBVEVTOyBqKyspIHsKLQkJc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1yID0gJm1pLT5ncm91cHNbaV0ucmF0ZXNbal07CisJCXN0cnVjdCBtaW5zdHJlbF9yYXRlX3N0YXRzICptcnMgPSAmbWktPmdyb3Vwc1tpXS5yYXRlc1tqXTsKIAkJc3RhdGljIGNvbnN0IGludCBiaXRyYXRlc1s0XSA9IHsgMTAsIDIwLCA1NSwgMTEwIH07CiAJCWludCBpZHggPSBpICogTUNTX0dST1VQX1JBVEVTICsgajsKIAogCQlpZiAoIShtaS0+Z3JvdXBzW2ldLnN1cHBvcnRlZCAmIEJJVChqKSkpCiAJCQljb250aW51ZTsKIAotCQlpZiAoZ2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykKLQkJCXAgKz0gc3ByaW50ZihwLCAiIEhUJWMwLyVjR0kgIiwgaHRtb2RlLCBnaW1vZGUpOwotCQllbHNlIGlmIChnZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVkhUX01DUykKLQkJCXAgKz0gc3ByaW50ZihwLCAiVkhUJWMwLyVjR0kgIiwgaHRtb2RlLCBnaW1vZGUpOwotCQllbHNlCi0JCQlwICs9IHNwcmludGYocCwgIiBDQ0svJWNQICAgIiwgaiA8IDQgPyAnTCcgOiAnUycpOworCQlpZiAoZ2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykgeworCQkJcCArPSBzcHJpbnRmKHAsICJIVCVjMCAgIiwgaHRtb2RlKTsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJWNHSSAgIiwgZ2ltb2RlKTsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJWQgICIsIG1nLT5zdHJlYW1zKTsKKwkJfSBlbHNlIGlmIChnZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVkhUX01DUykgeworCQkJcCArPSBzcHJpbnRmKHAsICJWSFQlYzAgIiwgaHRtb2RlKTsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJWNHSSAiLCBnaW1vZGUpOworCQkJcCArPSBzcHJpbnRmKHAsICIlZCAgIiwgbWctPnN0cmVhbXMpOworCQl9IGVsc2UgeworCQkJcCArPSBzcHJpbnRmKHAsICJDQ0sgICAgIik7CisJCQlwICs9IHNwcmludGYocCwgIiVjUCAgIiwgaiA8IDQgPyAnTCcgOiAnUycpOworCQkJcCArPSBzcHJpbnRmKHAsICIxICIpOworCQl9CiAKIAkJKihwKyspID0gKGlkeCA9PSBtaS0+bWF4X3RwX3JhdGVbMF0pID8gJ0EnIDogJyAnOwogCQkqKHArKykgPSAoaWR4ID09IG1pLT5tYXhfdHBfcmF0ZVsxXSkgPyAnQicgOiAnICc7CkBAIC01OSwyOSArNjYsMzkgQEAKIAkJKihwKyspID0gKGlkeCA9PSBtaS0+bWF4X3Byb2JfcmF0ZSkgPyAnUCcgOiAnICc7CiAKIAkJaWYgKGdmbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHsKLQkJCXAgKz0gc3ByaW50ZihwLCAiIE1DUyUtMnUgIiwgKG1nLT5zdHJlYW1zIC0gMSkgKiA4ICsgaik7CisJCQlwICs9IHNwcmludGYocCwgIiAgTUNTJS0ydSIsIChtZy0+c3RyZWFtcyAtIDEpICogOCArIGopOwogCQl9IGVsc2UgaWYgKGdmbGFncyAmIElFRUU4MDIxMV9UWF9SQ19WSFRfTUNTKSB7Ci0JCQlwICs9IHNwcmludGYocCwgIiBNQ1MlLTF1LyUxdSIsIGosIG1nLT5zdHJlYW1zKTsKKwkJCXAgKz0gc3ByaW50ZihwLCAiICBNQ1MlLTF1LyUxdSIsIGosIG1nLT5zdHJlYW1zKTsKIAkJfSBlbHNlIHsKIAkJCWludCByID0gYml0cmF0ZXNbaiAlIDRdOwogCi0JCQlwICs9IHNwcmludGYocCwgIiAlMnUuJTF1TSAiLCByIC8gMTAsIHIgJSAxMCk7CisJCQlwICs9IHNwcmludGYocCwgIiAgICUydS4lMXVNIiwgciAvIDEwLCByICUgMTApOwogCQl9CiAKLQkJdHAgPSBtci0+Y3VyX3RwIC8gMTA7Ci0JCXByb2IgPSBNSU5TVFJFTF9UUlVOQyhtci0+Y3VyX3Byb2IgKiAxMDAwKTsKLQkJZXByb2IgPSBNSU5TVFJFTF9UUlVOQyhtci0+cHJvYmFiaWxpdHkgKiAxMDAwKTsKKwkJcCArPSBzcHJpbnRmKHAsICIgICUzdSAgIiwgaWR4KTsKIAotCQlwICs9IHNwcmludGYocCwgIiAlNHUuJTF1ICUzdS4lMXUgJTN1LiUxdSAiCi0JCQkJIiUzdSAlNHUoJTR1KSAlOWxsdSglOWxsdSlcbiIsCi0JCQkJdHAgLyAxMCwgdHAgJSAxMCwKKwkJLyogdHhfdGltZVtyYXRlKGkpXSBpbiB1c2VjICovCisJCXR4X3RpbWUgPSBESVZfUk9VTkRfQ0xPU0VTVChtZy0+ZHVyYXRpb25bal0sIDEwMDApOworCQlwICs9IHNwcmludGYocCwgIiU2dSAgIiwgdHhfdGltZSk7CisKKwkJdHBfbWF4ID0gbWluc3RyZWxfaHRfZ2V0X3RwX2F2ZyhtaSwgaSwgaiwgTUlOU1RSRUxfRlJBQygxMDAsIDEwMCkpOworCQl0cF9hdmcgPSBtaW5zdHJlbF9odF9nZXRfdHBfYXZnKG1pLCBpLCBqLCBtcnMtPnByb2JfZXdtYSk7CisJCXByb2IgPSBNSU5TVFJFTF9UUlVOQyhtcnMtPmN1cl9wcm9iICogMTAwMCk7CisJCWVwcm9iID0gTUlOU1RSRUxfVFJVTkMobXJzLT5wcm9iX2V3bWEgKiAxMDAwKTsKKworCQlwICs9IHNwcmludGYocCwgIiU0dS4lMXUgICAlNHUuJTF1ICAgJTN1LiUxdSAgICAlM3UuJTF1IgorCQkJCSIgICAgICUzdS4lMXUgJTN1ICAgJTN1ICUtM3UgICAiCisJCQkJIiU5bGx1ICAgJS05bGx1XG4iLAorCQkJCXRwX21heCAvIDEwLCB0cF9tYXggJSAxMCwKKwkJCQl0cF9hdmcgLyAxMCwgdHBfYXZnICUgMTAsCiAJCQkJZXByb2IgLyAxMCwgZXByb2IgJSAxMCwKKwkJCQltcnMtPnByb2JfZXdtc2QgLyAxMCwgbXJzLT5wcm9iX2V3bXNkICUgMTAsCiAJCQkJcHJvYiAvIDEwLCBwcm9iICUgMTAsCi0JCQkJbXItPnJldHJ5X2NvdW50LAotCQkJCW1yLT5sYXN0X3N1Y2Nlc3MsCi0JCQkJbXItPmxhc3RfYXR0ZW1wdHMsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyltci0+c3VjY19oaXN0LAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbXItPmF0dF9oaXN0KTsKKwkJCQltcnMtPnJldHJ5X2NvdW50LAorCQkJCW1ycy0+bGFzdF9zdWNjZXNzLAorCQkJCW1ycy0+bGFzdF9hdHRlbXB0cywKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1ycy0+c3VjY19oaXN0LAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbXJzLT5hdHRfaGlzdCk7CiAJfQogCiAJcmV0dXJuIHA7CkBAIC05NCw4ICsxMTEsOCBAQAogCXN0cnVjdCBtaW5zdHJlbF9odF9zdGEgKm1pID0gJm1zcC0+aHQ7CiAJc3RydWN0IG1pbnN0cmVsX2RlYnVnZnNfaW5mbyAqbXM7CiAJdW5zaWduZWQgaW50IGk7Ci0JY2hhciAqcDsKIAlpbnQgcmV0OworCWNoYXIgKnA7CiAKIAlpZiAoIW1zcC0+aXNfaHQpIHsKIAkJaW5vZGUtPmlfcHJpdmF0ZSA9ICZtc3AtPmxlZ2FjeTsKQEAgLTExMCw4ICsxMjcsMTQgQEAKIAogCWZpbGUtPnByaXZhdGVfZGF0YSA9IG1zOwogCXAgPSBtcy0+YnVmOwotCXAgKz0gc3ByaW50ZihwLCAiIHR5cGUgICAgICAgICAgIHJhdGUgICAgICB0cHQgZXByb2IgKnByb2IgIgotCQkJInJldCAgKm9rKCpjdW0pICAgICAgICBvayggICAgICBjdW0pXG4iKTsKKworCXAgKz0gc3ByaW50ZihwLCAiXG4iKTsKKwlwICs9IHNwcmludGYocCwgIiAgICAgICAgICAgICAgYmVzdCAgIF9fX19fX19fX19fX3JhdGVfX19fX19fX19fICAgICIKKwkJCSJfX19fX19zdGF0aXN0aWNzX19fX19fICAgIF9fX19fX19fbGFzdF9fX19fX18gICAgIgorCQkJIl9fX19fX3N1bS1vZl9fX19fX19fXG4iKTsKKwlwICs9IHNwcmludGYocCwgIm1vZGUgZ3VhcmQgIyAgcmF0ZSAgW25hbWUgICBpZHggYWlydGltZSAgbWF4X3RwXSAgIgorCQkJIlsgw7godHApIMO4KHByb2IpIHNkKHByb2IpXSAgW3Byb2IufHJldHJ5fHN1Y3xhdHRdICBbI3N1Y2Nlc3MgfCAiCisJCQkiI2F0dGVtcHRzXVxuIik7CiAKIAlwID0gbWluc3RyZWxfaHRfc3RhdHNfZHVtcChtaSwgTUlOU1RSRUxfQ0NLX0dST1VQLCBwKTsKIAlmb3IgKGkgPSAwOyBpIDwgTUlOU1RSRUxfQ0NLX0dST1VQOyBpKyspCkBAIC0xMjMsMTEgKzE0NiwxMCBAQAogCQkJImxvb2thcm91bmQgJWRcbiIsCiAJCQltYXgoMCwgKGludCkgbWktPnRvdGFsX3BhY2tldHMgLSAoaW50KSBtaS0+c2FtcGxlX3BhY2tldHMpLAogCQkJbWktPnNhbXBsZV9wYWNrZXRzKTsKLQlwICs9IHNwcmludGYocCwgIkF2ZXJhZ2UgQS1NUERVIGxlbmd0aDogJWQuJWRcbiIsCisJcCArPSBzcHJpbnRmKHAsICJBdmVyYWdlICMgb2YgYWdncmVnYXRlZCBmcmFtZXMgcGVyIEEtTVBEVTogJWQuJWRcbiIsCiAJCU1JTlNUUkVMX1RSVU5DKG1pLT5hdmdfYW1wZHVfbGVuKSwKIAkJTUlOU1RSRUxfVFJVTkMobWktPmF2Z19hbXBkdV9sZW4gKiAxMCkgJSAxMCk7CiAJbXMtPmxlbiA9IHAgLSBtcy0+YnVmOwotCiAJV0FSTl9PTihtcy0+bGVuICsgc2l6ZW9mKCptcykgPiAzMjc2OCk7CiAKIAlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CkBAIC0xNDEsNiArMTYzLDE0MyBAQAogCS5sbHNlZWsgPSBub19sbHNlZWssCiB9OwogCitzdGF0aWMgY2hhciAqCittaW5zdHJlbF9odF9zdGF0c19jc3ZfZHVtcChzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSwgaW50IGksIGNoYXIgKnApCit7CisJY29uc3Qgc3RydWN0IG1jc19ncm91cCAqbWc7CisJdW5zaWduZWQgaW50IGosIHRwX21heCwgdHBfYXZnLCBwcm9iLCBlcHJvYiwgdHhfdGltZTsKKwljaGFyIGh0bW9kZSA9ICcyJzsKKwljaGFyIGdpbW9kZSA9ICdMJzsKKwl1MzIgZ2ZsYWdzOworCisJaWYgKCFtaS0+Z3JvdXBzW2ldLnN1cHBvcnRlZCkKKwkJcmV0dXJuIHA7CisKKwltZyA9ICZtaW5zdHJlbF9tY3NfZ3JvdXBzW2ldOworCWdmbGFncyA9IG1nLT5mbGFnczsKKworCWlmIChnZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIKQorCQlodG1vZGUgPSAnNCc7CisJZWxzZSBpZiAoZ2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDXzgwX01IWl9XSURUSCkKKwkJaHRtb2RlID0gJzgnOworCWlmIChnZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kpCisJCWdpbW9kZSA9ICdTJzsKKworCWZvciAoaiA9IDA7IGogPCBNQ1NfR1JPVVBfUkFURVM7IGorKykgeworCQlzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXJzID0gJm1pLT5ncm91cHNbaV0ucmF0ZXNbal07CisJCXN0YXRpYyBjb25zdCBpbnQgYml0cmF0ZXNbNF0gPSB7IDEwLCAyMCwgNTUsIDExMCB9OworCQlpbnQgaWR4ID0gaSAqIE1DU19HUk9VUF9SQVRFUyArIGo7CisKKwkJaWYgKCEobWktPmdyb3Vwc1tpXS5zdXBwb3J0ZWQgJiBCSVQoaikpKQorCQkJY29udGludWU7CisKKwkJaWYgKGdmbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHsKKwkJCXAgKz0gc3ByaW50ZihwLCAiSFQlYzAsIiwgaHRtb2RlKTsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJWNHSSwiLCBnaW1vZGUpOworCQkJcCArPSBzcHJpbnRmKHAsICIlZCwiLCBtZy0+c3RyZWFtcyk7CisJCX0gZWxzZSBpZiAoZ2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1ZIVF9NQ1MpIHsKKwkJCXAgKz0gc3ByaW50ZihwLCAiVkhUJWMwLCIsIGh0bW9kZSk7CisJCQlwICs9IHNwcmludGYocCwgIiVjR0ksIiwgZ2ltb2RlKTsKKwkJCXAgKz0gc3ByaW50ZihwLCAiJWQsIiwgbWctPnN0cmVhbXMpOworCQl9IGVsc2UgeworCQkJcCArPSBzcHJpbnRmKHAsICJDQ0ssIik7CisJCQlwICs9IHNwcmludGYocCwgIiVjUCwiLCBqIDwgNCA/ICdMJyA6ICdTJyk7CisJCQlwICs9IHNwcmludGYocCwgIjEsIik7CisJCX0KKworCQlwICs9IHNwcmludGYocCwgIiVzIiAsKChpZHggPT0gbWktPm1heF90cF9yYXRlWzBdKSA/ICJBIiA6ICIiKSk7CisJCXAgKz0gc3ByaW50ZihwLCAiJXMiICwoKGlkeCA9PSBtaS0+bWF4X3RwX3JhdGVbMV0pID8gIkIiIDogIiIpKTsKKwkJcCArPSBzcHJpbnRmKHAsICIlcyIgLCgoaWR4ID09IG1pLT5tYXhfdHBfcmF0ZVsyXSkgPyAiQyIgOiAiIikpOworCQlwICs9IHNwcmludGYocCwgIiVzIiAsKChpZHggPT0gbWktPm1heF90cF9yYXRlWzNdKSA/ICJEIiA6ICIiKSk7CisJCXAgKz0gc3ByaW50ZihwLCAiJXMiICwoKGlkeCA9PSBtaS0+bWF4X3Byb2JfcmF0ZSkgPyAiUCIgOiAiIikpOworCisJCWlmIChnZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKSB7CisJCQlwICs9IHNwcmludGYocCwgIixNQ1MlLTJ1LCIsIChtZy0+c3RyZWFtcyAtIDEpICogOCArIGopOworCQl9IGVsc2UgaWYgKGdmbGFncyAmIElFRUU4MDIxMV9UWF9SQ19WSFRfTUNTKSB7CisJCQlwICs9IHNwcmludGYocCwgIixNQ1MlLTF1LyUxdSwiLCBqLCBtZy0+c3RyZWFtcyk7CisJCX0gZWxzZSB7CisJCQlpbnQgciA9IGJpdHJhdGVzW2ogJSA0XTsKKwkJCXAgKz0gc3ByaW50ZihwLCAiLCUydS4lMXVNLCIsIHIgLyAxMCwgciAlIDEwKTsKKwkJfQorCisJCXAgKz0gc3ByaW50ZihwLCAiJXUsIiwgaWR4KTsKKwkJdHhfdGltZSA9IERJVl9ST1VORF9DTE9TRVNUKG1nLT5kdXJhdGlvbltqXSwgMTAwMCk7CisJCXAgKz0gc3ByaW50ZihwLCAiJXUsIiwgdHhfdGltZSk7CisKKwkJdHBfbWF4ID0gbWluc3RyZWxfaHRfZ2V0X3RwX2F2ZyhtaSwgaSwgaiwgTUlOU1RSRUxfRlJBQygxMDAsIDEwMCkpOworCQl0cF9hdmcgPSBtaW5zdHJlbF9odF9nZXRfdHBfYXZnKG1pLCBpLCBqLCBtcnMtPnByb2JfZXdtYSk7CisJCXByb2IgPSBNSU5TVFJFTF9UUlVOQyhtcnMtPmN1cl9wcm9iICogMTAwMCk7CisJCWVwcm9iID0gTUlOU1RSRUxfVFJVTkMobXJzLT5wcm9iX2V3bWEgKiAxMDAwKTsKKworCQlwICs9IHNwcmludGYocCwgIiV1LiV1LCV1LiV1LCV1LiV1LCV1LiV1LCV1LiV1LCV1LCV1LCIKKwkJCQkiJXUsJWxsdSwlbGx1LCIsCisJCQkJdHBfbWF4IC8gMTAsIHRwX21heCAlIDEwLAorCQkJCXRwX2F2ZyAvIDEwLCB0cF9hdmcgJSAxMCwKKwkJCQllcHJvYiAvIDEwLCBlcHJvYiAlIDEwLAorCQkJCW1ycy0+cHJvYl9ld21zZCAvIDEwLCBtcnMtPnByb2JfZXdtc2QgJSAxMCwKKwkJCQlwcm9iIC8gMTAsIHByb2IgJSAxMCwKKwkJCQltcnMtPnJldHJ5X2NvdW50LAorCQkJCW1ycy0+bGFzdF9zdWNjZXNzLAorCQkJCW1ycy0+bGFzdF9hdHRlbXB0cywKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKW1ycy0+c3VjY19oaXN0LAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbXJzLT5hdHRfaGlzdCk7CisJCXAgKz0gc3ByaW50ZihwLCAiJWQsJWQsJWQuJWRcbiIsCisJCQkJbWF4KDAsIChpbnQpIG1pLT50b3RhbF9wYWNrZXRzIC0KKwkJCQkoaW50KSBtaS0+c2FtcGxlX3BhY2tldHMpLAorCQkJCW1pLT5zYW1wbGVfcGFja2V0cywKKwkJCQlNSU5TVFJFTF9UUlVOQyhtaS0+YXZnX2FtcGR1X2xlbiksCisJCQkJTUlOU1RSRUxfVFJVTkMobWktPmF2Z19hbXBkdV9sZW4gKiAxMCkgJSAxMCk7CisJfQorCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBpbnQKK21pbnN0cmVsX2h0X3N0YXRzX2Nzdl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBtaW5zdHJlbF9odF9zdGFfcHJpdiAqbXNwID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSA9ICZtc3AtPmh0OworCXN0cnVjdCBtaW5zdHJlbF9kZWJ1Z2ZzX2luZm8gKm1zOworCXVuc2lnbmVkIGludCBpOworCWludCByZXQ7CisJY2hhciAqcDsKKworCWlmICghbXNwLT5pc19odCkgeworCQlpbm9kZS0+aV9wcml2YXRlID0gJm1zcC0+bGVnYWN5OworCQlyZXQgPSBtaW5zdHJlbF9zdGF0c19jc3Zfb3Blbihpbm9kZSwgZmlsZSk7CisJCWlub2RlLT5pX3ByaXZhdGUgPSBtc3A7CisJCXJldHVybiByZXQ7CisJfQorCisJbXMgPSBrbWFsbG9jKDMyNzY4LCBHRlBfS0VSTkVMKTsKKworCWlmICghbXMpCisJCXJldHVybiAtRU5PTUVNOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gbXM7CisKKwlwID0gbXMtPmJ1ZjsKKworCXAgPSBtaW5zdHJlbF9odF9zdGF0c19jc3ZfZHVtcChtaSwgTUlOU1RSRUxfQ0NLX0dST1VQLCBwKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUlOU1RSRUxfQ0NLX0dST1VQOyBpKyspCisJCXAgPSBtaW5zdHJlbF9odF9zdGF0c19jc3ZfZHVtcChtaSwgaSwgcCk7CisJZm9yIChpKys7IGkgPCBBUlJBWV9TSVpFKG1pLT5ncm91cHMpOyBpKyspCisJCXAgPSBtaW5zdHJlbF9odF9zdGF0c19jc3ZfZHVtcChtaSwgaSwgcCk7CisKKwltcy0+bGVuID0gcCAtIG1zLT5idWY7CisJV0FSTl9PTihtcy0+bGVuICsgc2l6ZW9mKCptcykgPiAzMjc2OCk7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pbnN0cmVsX2h0X3N0YXRfY3N2X2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSBtaW5zdHJlbF9odF9zdGF0c19jc3Zfb3BlbiwKKwkucmVhZCA9IG1pbnN0cmVsX3N0YXRzX3JlYWQsCisJLnJlbGVhc2UgPSBtaW5zdHJlbF9zdGF0c19yZWxlYXNlLAorCS5sbHNlZWsgPSBub19sbHNlZWssCit9OworCiB2b2lkCiBtaW5zdHJlbF9odF9hZGRfc3RhX2RlYnVnZnModm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEsIHN0cnVjdCBkZW50cnkgKmRpcikKIHsKQEAgLTE0OCw2ICszMDcsOCBAQAogCiAJbXNwLT5kYmdfc3RhdHMgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyY19zdGF0cyIsIFNfSVJVR08sIGRpciwgbXNwLAogCQkJJm1pbnN0cmVsX2h0X3N0YXRfZm9wcyk7CisJbXNwLT5kYmdfc3RhdHNfY3N2ID0gZGVidWdmc19jcmVhdGVfZmlsZSgicmNfc3RhdHNfY3N2IiwgU19JUlVHTywKKwkJCSAgICAgZGlyLCBtc3AsICZtaW5zdHJlbF9odF9zdGF0X2Nzdl9mb3BzKTsKIH0KIAogdm9pZApAQCAtMTU2LDQgKzMxNyw1IEBACiAJc3RydWN0IG1pbnN0cmVsX2h0X3N0YV9wcml2ICptc3AgPSBwcml2X3N0YTsKIAogCWRlYnVnZnNfcmVtb3ZlKG1zcC0+ZGJnX3N0YXRzKTsKKwlkZWJ1Z2ZzX3JlbW92ZShtc3AtPmRiZ19zdGF0c19jc3YpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3J4LmMgYi9uZXQvbWFjODAyMTEvcnguYwppbmRleCAxMTAxNTYzLi4yNjBlZWQ0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcnguYworKysgYi9uZXQvbWFjODAyMTEvcnguYwpAQCAtODczLDkgKzg3MywxMCBAQAogCiAgc2V0X3JlbGVhc2VfdGltZXI6CiAKLQkJbW9kX3RpbWVyKCZ0aWRfYWdnX3J4LT5yZW9yZGVyX3RpbWVyLAotCQkJICB0aWRfYWdnX3J4LT5yZW9yZGVyX3RpbWVbal0gKyAxICsKLQkJCSAgSFRfUlhfUkVPUkRFUl9CVUZfVElNRU9VVCk7CisJCWlmICghdGlkX2FnZ19yeC0+cmVtb3ZlZCkKKwkJCW1vZF90aW1lcigmdGlkX2FnZ19yeC0+cmVvcmRlcl90aW1lciwKKwkJCQkgIHRpZF9hZ2dfcngtPnJlb3JkZXJfdGltZVtqXSArIDEgKworCQkJCSAgSFRfUlhfUkVPUkRFUl9CVUZfVElNRU9VVCk7CiAJfSBlbHNlIHsKIAkJZGVsX3RpbWVyKCZ0aWRfYWdnX3J4LT5yZW9yZGVyX3RpbWVyKTsKIAl9CkBAIC0xMTg0LDYgKzExODUsNyBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3QgcHNfZGF0YSAqcHM7CisJaW50IHRpZDsKIAogCWlmIChzdGEtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAogCSAgICBzdGEtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKQpAQCAtMTE5Nyw2ICsxMTk5LDE4IEBACiAJCWRydl9zdGFfbm90aWZ5KGxvY2FsLCBzZGF0YSwgU1RBX05PVElGWV9TTEVFUCwgJnN0YS0+c3RhKTsKIAlwc19kYmcoc2RhdGEsICJTVEEgJXBNIGFpZCAlZCBlbnRlcnMgcG93ZXIgc2F2ZSBtb2RlXG4iLAogCSAgICAgICBzdGEtPnN0YS5hZGRyLCBzdGEtPnN0YS5haWQpOworCisJaWYgKCFzdGEtPnN0YS50eHFbMF0pCisJCXJldHVybjsKKworCWZvciAodGlkID0gMDsgdGlkIDwgQVJSQVlfU0laRShzdGEtPnN0YS50eHEpOyB0aWQrKykgeworCQlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSB0b190eHFfaW5mbyhzdGEtPnN0YS50eHFbdGlkXSk7CisKKwkJaWYgKCFza2JfcXVldWVfbGVuKCZ0eHFpLT5xdWV1ZSkpCisJCQlzZXRfYml0KHRpZCwgJnN0YS0+dHhxX2J1ZmZlcmVkX3RpZHMpOworCQllbHNlCisJCQljbGVhcl9iaXQodGlkLCAmc3RhLT50eHFfYnVmZmVyZWRfdGlkcyk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBzdGFfcHNfZW5kKHN0cnVjdCBzdGFfaW5mbyAqc3RhKQpAQCAtMTkxMiw4ICsxOTI2LDcgQEAKIAkvKiBEcm9wIHVuZW5jcnlwdGVkIGZyYW1lcyBpZiBrZXkgaXMgc2V0LiAqLwogCWlmICh1bmxpa2VseSghaWVlZTgwMjExX2hhc19wcm90ZWN0ZWQoZmMpICYmCiAJCSAgICAgIWllZWU4MDIxMV9pc19udWxsZnVuYyhmYykgJiYKLQkJICAgICBpZWVlODAyMTFfaXNfZGF0YShmYykgJiYKLQkJICAgICAocngtPmtleSB8fCByeC0+c2RhdGEtPmRyb3BfdW5lbmNyeXB0ZWQpKSkKKwkJICAgICBpZWVlODAyMTFfaXNfZGF0YShmYykgJiYgcngtPmtleSkpCiAJCXJldHVybiAtRUFDQ0VTOwogCiAJcmV0dXJuIDA7CkBAIC0yMDQzLDYgKzIwNTYsOSBAQAogCXN0cnVjdCBzdGFfaW5mbyAqZHN0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENCKHJ4LT5za2IpOwogCisJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7CisJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByeC0+c2tiLT5sZW47CisKIAlza2IgPSByeC0+c2tiOwogCXhtaXRfc2tiID0gTlVMTDsKIApAQCAtMjE3Myw4ICsyMTg5LDYgQEAKIAkJCWRldl9rZnJlZV9za2IocngtPnNrYik7CiAJCQljb250aW51ZTsKIAkJfQotCQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSByeC0+c2tiLT5sZW47CiAKIAkJaWVlZTgwMjExX2RlbGl2ZXJfc2tiKHJ4KTsKIAl9CkBAIC0yMjE0LDYgKzIyMjgsOSBAQAogCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJbWVzaF9oZHIgPSAoc3RydWN0IGllZWU4MDIxMXNfaGRyICopIChza2ItPmRhdGEgKyBoZHJsZW4pOwogCisJaWYgKGllZWU4MDIxMV9kcm9wX3VuZW5jcnlwdGVkKHJ4LCBoZHItPmZyYW1lX2NvbnRyb2wpKQorCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOworCiAJLyogZnJhbWUgaXMgaW4gUk1DLCBkb24ndCBmb3J3YXJkICovCiAJaWYgKGllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKIAkgICAgaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSkgJiYKQEAgLTIzOTcsOSArMjQxNCw2IEBACiAKIAlyeC0+c2tiLT5kZXYgPSBkZXY7CiAKLQlkZXYtPnN0YXRzLnJ4X3BhY2tldHMrKzsKLQlkZXYtPnN0YXRzLnJ4X2J5dGVzICs9IHJ4LT5za2ItPmxlbjsKLQogCWlmIChsb2NhbC0+cHNfc2RhdGEgJiYgbG9jYWwtPmh3LmNvbmYuZHluYW1pY19wc190aW1lb3V0ID4gMCAmJgogCSAgICAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoCiAJCSAgICAoKHN0cnVjdCBldGhoZHIgKilyeC0+c2tiLT5kYXRhKS0+aF9kZXN0KSAmJgpAQCAtMzEyNSw2ICszMTM5LDEyIEBACiAJCQlnb3RvIHJ4aF9uZXh0OyAgXAogCX0gd2hpbGUgKDApOwogCisJLyogTG9jayBoZXJlIHRvIGF2b2lkIGhpdHRpbmcgYWxsIG9mIHRoZSBkYXRhIHVzZWQgaW4gdGhlIFJYCisJICogcGF0aCAoZS5nLiBrZXkgZGF0YSwgc3RhdGlvbiBkYXRhLCAuLi4pIGNvbmN1cnJlbnRseSB3aGVuCisJICogYSBmcmFtZSBpcyByZWxlYXNlZCBmcm9tIHRoZSByZW9yZGVyIGJ1ZmZlciBkdWUgdG8gdGltZW91dAorCSAqIGZyb20gdGhlIHRpbWVyLCBwb3RlbnRpYWxseSBjb25jdXJyZW50bHkgd2l0aCBSWCBmcm9tIHRoZQorCSAqIGRyaXZlci4KKwkgKi8KIAlzcGluX2xvY2tfYmgoJnJ4LT5sb2NhbC0+cnhfcGF0aF9sb2NrKTsKIAogCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZShmcmFtZXMpKSkgewpAQCAtMzQxNyw3ICszNDM3LDggQEAKIAlfX2xlMTYgZmM7CiAJc3RydWN0IGllZWU4MDIxMV9yeF9kYXRhIHJ4OwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnByZXY7Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGEsICp0bXAsICpwcmV2X3N0YTsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgKnByZXZfc3RhOworCXN0cnVjdCByaGFzaF9oZWFkICp0bXA7CiAJaW50IGVyciA9IDA7CiAKIAlmYyA9ICgoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGEpLT5mcmFtZV9jb250cm9sOwpAQCAtMzQ1Miw5ICszNDczLDEzIEBACiAJCWllZWU4MDIxMV9zY2FuX3J4KGxvY2FsLCBza2IpOwogCiAJaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgeworCQljb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CisKIAkJcHJldl9zdGEgPSBOVUxMOwogCi0JCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBoZHItPmFkZHIyLCBzdGEsIHRtcCkgeworCQl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGxvY2FsLT5zdGFfaGFzaC50YmwsICZsb2NhbC0+c3RhX2hhc2gpOworCisJCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCB0YmwsIGhkci0+YWRkcjIsIHN0YSwgdG1wKSB7CiAJCQlpZiAoIXByZXZfc3RhKSB7CiAJCQkJcHJldl9zdGEgPSBzdGE7CiAJCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc2Nhbi5jIGIvbmV0L21hYzgwMjExL3NjYW4uYwppbmRleCAwNWYwZDcxLi43YmI2YTkzIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc2Nhbi5jCisrKyBiL25ldC9tYWM4MDIxMS9zY2FuLmMKQEAgLTkyOCwxMSArOTI4LDEyIEBACiAKIGludCBpZWVlODAyMTFfcmVxdWVzdF9pYnNzX3NjYW4oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJY29uc3QgdTggKnNzaWQsIHU4IHNzaWRfbGVuLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKipjaGFubmVscywKKwkJCQl1bnNpZ25lZCBpbnQgbl9jaGFubmVscywKIAkJCQllbnVtIG5sODAyMTFfYnNzX3NjYW5fd2lkdGggc2Nhbl93aWR0aCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQlpbnQgcmV0ID0gLUVCVVNZOworCWludCByZXQgPSAtRUJVU1ksIGksIG5fY2ggPSAwOwogCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKIAogCW11dGV4X2xvY2soJmxvY2FsLT5tdHgpOwpAQCAtOTQyLDkgKzk0Myw4IEBACiAJCWdvdG8gdW5sb2NrOwogCiAJLyogZmlsbCBpbnRlcm5hbCBzY2FuIHJlcXVlc3QgKi8KLQlpZiAoIWNoYW4pIHsKLQkJaW50IGksIG1heF9uOwotCQlpbnQgbl9jaCA9IDA7CisJaWYgKCFjaGFubmVscykgeworCQlpbnQgbWF4X247CiAKIAkJZm9yIChiYW5kID0gMDsgYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGJhbmQrKykgewogCQkJaWYgKCFsb2NhbC0+aHcud2lwaHktPmJhbmRzW2JhbmRdKQpAQCAtOTY5LDEyICs5NjksMTkgQEAKIAogCQlsb2NhbC0+aW50X3NjYW5fcmVxLT5uX2NoYW5uZWxzID0gbl9jaDsKIAl9IGVsc2UgewotCQlpZiAoV0FSTl9PTl9PTkNFKGNoYW4tPmZsYWdzICYgKElFRUU4MDIxMV9DSEFOX05PX0lSIHwKLQkJCQkJCUlFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSkpCisJCWZvciAoaSA9IDA7IGkgPCBuX2NoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChjaGFubmVsc1tpXS0+ZmxhZ3MgJiAoSUVFRTgwMjExX0NIQU5fTk9fSVIgfAorCQkJCQkJICBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkpCisJCQkJY29udGludWU7CisKKwkJCWxvY2FsLT5pbnRfc2Nhbl9yZXEtPmNoYW5uZWxzW25fY2hdID0gY2hhbm5lbHNbaV07CisJCQluX2NoKys7CisJCX0KKworCQlpZiAoV0FSTl9PTl9PTkNFKG5fY2ggPT0gMCkpCiAJCQlnb3RvIHVubG9jazsKIAotCQlsb2NhbC0+aW50X3NjYW5fcmVxLT5jaGFubmVsc1swXSA9IGNoYW47Ci0JCWxvY2FsLT5pbnRfc2Nhbl9yZXEtPm5fY2hhbm5lbHMgPSAxOworCQlsb2NhbC0+aW50X3NjYW5fcmVxLT5uX2NoYW5uZWxzID0gbl9jaDsKIAl9CiAKIAlsb2NhbC0+aW50X3NjYW5fcmVxLT5zc2lkcyA9ICZsb2NhbC0+c2Nhbl9zc2lkOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uYwppbmRleCAwMGNhOGRjLi4xMjk3MWI3IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uYworKysgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uYwpAQCAtNjQsMzIgKzY0LDIwIEBACiAgKiBmcmVlZCBiZWZvcmUgdGhleSBhcmUgZG9uZSB1c2luZyBpdC4KICAqLwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHN0YV9yaHRfcGFyYW1zID0geworCS5uZWxlbV9oaW50ID0gMywgLyogc3RhcnQgc21hbGwgKi8KKwkuaGVhZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc3RhX2luZm8sIGhhc2hfbm9kZSksCisJLmtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc3RhX2luZm8sIHN0YS5hZGRyKSwKKwkua2V5X2xlbiA9IEVUSF9BTEVOLAorCS5oYXNoZm4gPSBzdGFfYWRkcl9oYXNoLAorfTsKKwogLyogQ2FsbGVyIG11c3QgaG9sZCBsb2NhbC0+c3RhX210eCAqLwogc3RhdGljIGludCBzdGFfaW5mb19oYXNoX2RlbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCSAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7Ci0Jc3RydWN0IHN0YV9pbmZvICpzOwotCi0JcyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKHN0YS0+c3RhLmFkZHIpXSwKLQkJCQkgICAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7Ci0JaWYgKCFzKQotCQlyZXR1cm4gLUVOT0VOVDsKLQlpZiAocyA9PSBzdGEpIHsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChzdGEtPnN0YS5hZGRyKV0sCi0JCQkJICAgcy0+aG5leHQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl3aGlsZSAocmN1X2FjY2Vzc19wb2ludGVyKHMtPmhuZXh0KSAmJgotCSAgICAgICByY3VfYWNjZXNzX3BvaW50ZXIocy0+aG5leHQpICE9IHN0YSkKLQkJcyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocy0+aG5leHQsCi0JCQkJCWxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9tdHgpKTsKLQlpZiAocmN1X2FjY2Vzc19wb2ludGVyKHMtPmhuZXh0KSkgewotCQlyY3VfYXNzaWduX3BvaW50ZXIocy0+aG5leHQsIHN0YS0+aG5leHQpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gLUVOT0VOVDsKKwlyZXR1cm4gcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmbG9jYWwtPnN0YV9oYXNoLCAmc3RhLT5oYXNoX25vZGUsCisJCQkJICAgICAgc3RhX3JodF9wYXJhbXMpOwogfQogCiBzdGF0aWMgdm9pZCBfX2NsZWFudXBfc2luZ2xlX3N0YShzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKQEAgLTExOCw2ICsxMDYsMTYgQEAKIAkJYXRvbWljX2RlYygmcHMtPm51bV9zdGFfcHMpOwogCX0KIAorCWlmIChzdGEtPnN0YS50eHFbMF0pIHsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhLT5zdGEudHhxKTsgaSsrKSB7CisJCQlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSB0b190eHFfaW5mbyhzdGEtPnN0YS50eHFbaV0pOworCQkJaW50IG4gPSBza2JfcXVldWVfbGVuKCZ0eHFpLT5xdWV1ZSk7CisKKwkJCWllZWU4MDIxMV9wdXJnZV90eF9xdWV1ZSgmbG9jYWwtPmh3LCAmdHhxaS0+cXVldWUpOworCQkJYXRvbWljX3N1YihuLCAmc2RhdGEtPnR4cXNfbGVuW3R4cWktPnR4cS5hY10pOworCQl9CisJfQorCiAJZm9yIChhYyA9IDA7IGFjIDwgSUVFRTgwMjExX05VTV9BQ1M7IGFjKyspIHsKIAkJbG9jYWwtPnRvdGFsX3BzX2J1ZmZlcmVkIC09IHNrYl9xdWV1ZV9sZW4oJnN0YS0+cHNfdHhfYnVmW2FjXSk7CiAJCWllZWU4MDIxMV9wdXJnZV90eF9xdWV1ZSgmbG9jYWwtPmh3LCAmc3RhLT5wc190eF9idWZbYWNdKTsKQEAgLTE1OSwxOCArMTU3LDggQEAKIAkJCSAgICAgIGNvbnN0IHU4ICphZGRyKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCi0Jc3RhID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChhZGRyKV0sCi0JCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9tdHgpKTsKLQl3aGlsZSAoc3RhKSB7Ci0JCWlmIChzdGEtPnNkYXRhID09IHNkYXRhICYmCi0JCSAgICBldGhlcl9hZGRyX2VxdWFsKHN0YS0+c3RhLmFkZHIsIGFkZHIpKQotCQkJYnJlYWs7Ci0JCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhzdGEtPmhuZXh0LAotCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX210eCkpOwotCX0KLQlyZXR1cm4gc3RhOworCXJldHVybiByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZsb2NhbC0+c3RhX2hhc2gsIGFkZHIsIHN0YV9yaHRfcGFyYW1zKTsKIH0KIAogLyoKQEAgLTE4MiwxOCArMTcwLDI0IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CisJc3RydWN0IHJoYXNoX2hlYWQgKnRtcDsKKwljb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CiAKLQlzdGEgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2sobG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKGFkZHIpXSwKLQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX210eCkpOwotCXdoaWxlIChzdGEpIHsKLQkJaWYgKChzdGEtPnNkYXRhID09IHNkYXRhIHx8Ci0JCSAgICAgKHN0YS0+c2RhdGEtPmJzcyAmJiBzdGEtPnNkYXRhLT5ic3MgPT0gc2RhdGEtPmJzcykpICYmCi0JCSAgICBldGhlcl9hZGRyX2VxdWFsKHN0YS0+c3RhLmFkZHIsIGFkZHIpKQotCQkJYnJlYWs7Ci0JCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhzdGEtPmhuZXh0LAotCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX210eCkpOworCXJjdV9yZWFkX2xvY2soKTsKKwl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGxvY2FsLT5zdGFfaGFzaC50YmwsICZsb2NhbC0+c3RhX2hhc2gpOworCisJZm9yX2VhY2hfc3RhX2luZm8obG9jYWwsIHRibCwgYWRkciwgc3RhLCB0bXApIHsKKwkJaWYgKHN0YS0+c2RhdGEgPT0gc2RhdGEgfHwKKwkJICAgIChzdGEtPnNkYXRhLT5ic3MgJiYgc3RhLT5zZGF0YS0+YnNzID09IHNkYXRhLT5ic3MpKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCS8qIHRoaXMgaXMgc2FmZSBhcyB0aGUgY2FsbGVyIG11c3QgYWxyZWFkeSBob2xkCisJCQkgKiBhbm90aGVyIHJjdSByZWFkIHNlY3Rpb24gb3IgdGhlIG11dGV4CisJCQkgKi8KKwkJCXJldHVybiBzdGE7CisJCX0KIAl9Ci0JcmV0dXJuIHN0YTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RydWN0IHN0YV9pbmZvICpzdGFfaW5mb19nZXRfYnlfaWR4KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApAQCAtMjI5LDE5ICsyMjMsMTMgQEAKICAqLwogdm9pZCBzdGFfaW5mb19mcmVlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKLQlpbnQgaTsKLQogCWlmIChzdGEtPnJhdGVfY3RybCkKIAkJcmF0ZV9jb250cm9sX2ZyZWVfc3RhKHN0YSk7CiAKLQlpZiAoc3RhLT50eF9sYXQpIHsKLQkJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9OVU1fVElEUzsgaSsrKQotCQkJa2ZyZWUoc3RhLT50eF9sYXRbaV0uYmlucyk7Ci0JCWtmcmVlKHN0YS0+dHhfbGF0KTsKLQl9Ci0KIAlzdGFfZGJnKHN0YS0+c2RhdGEsICJEZXN0cm95ZWQgU1RBICVwTVxuIiwgc3RhLT5zdGEuYWRkcik7CiAKKwlpZiAoc3RhLT5zdGEudHhxWzBdKQorCQlrZnJlZSh0b190eHFfaW5mbyhzdGEtPnN0YS50eHFbMF0pKTsKIAlrZnJlZShyY3VfZGVyZWZlcmVuY2VfcmF3KHN0YS0+c3RhLnJhdGVzKSk7CiAJa2ZyZWUoc3RhKTsKIH0KQEAgLTI1MCw5ICsyMzgsOCBAQAogc3RhdGljIHZvaWQgc3RhX2luZm9faGFzaF9hZGQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkgICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+c3RhX210eCk7Ci0Jc3RhLT5obmV4dCA9IGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChzdGEtPnN0YS5hZGRyKV07Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChzdGEtPnN0YS5hZGRyKV0sIHN0YSk7CisJcmhhc2h0YWJsZV9pbnNlcnRfZmFzdCgmbG9jYWwtPnN0YV9oYXNoLCAmc3RhLT5oYXNoX25vZGUsCisJCQkgICAgICAgc3RhX3JodF9wYXJhbXMpOwogfQogCiBzdGF0aWMgdm9pZCBzdGFfZGVsaXZlcl9wc19mcmFtZXMoc3RydWN0IHdvcmtfc3RydWN0ICp3aykKQEAgLTI5Myw0NCArMjgwLDE1IEBACiAJCQkJY29uc3QgdTggKmFkZHIsIGdmcF90IGdmcCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9ICZsb2NhbC0+aHc7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAJc3RydWN0IHRpbWVzcGVjIHVwdGltZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2xhdGVuY3lfYmluX3JhbmdlcyAqdHhfbGF0ZW5jeTsKIAlpbnQgaTsKIAotCXN0YSA9IGt6YWxsb2Moc2l6ZW9mKCpzdGEpICsgbG9jYWwtPmh3LnN0YV9kYXRhX3NpemUsIGdmcCk7CisJc3RhID0ga3phbGxvYyhzaXplb2YoKnN0YSkgKyBody0+c3RhX2RhdGFfc2l6ZSwgZ2ZwKTsKIAlpZiAoIXN0YSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JdHhfbGF0ZW5jeSA9IHJjdV9kZXJlZmVyZW5jZShsb2NhbC0+dHhfbGF0ZW5jeSk7Ci0JLyogaW5pdCBzdGF0aW9ucyBUeCBsYXRlbmN5IHN0YXRpc3RpY3MgJiYgVElEIGJpbnMgKi8KLQlpZiAodHhfbGF0ZW5jeSkgewotCQlzdGEtPnR4X2xhdCA9IGt6YWxsb2MoSUVFRTgwMjExX05VTV9USURTICoKLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90eF9sYXRlbmN5X3N0YXQpLAotCQkJCSAgICAgIEdGUF9BVE9NSUMpOwotCQlpZiAoIXN0YS0+dHhfbGF0KSB7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCWdvdG8gZnJlZTsKLQkJfQotCi0JCWlmICh0eF9sYXRlbmN5LT5uX3JhbmdlcykgewotCQkJZm9yIChpID0gMDsgaSA8IElFRUU4MDIxMV9OVU1fVElEUzsgaSsrKSB7Ci0JCQkJLyogc2l6ZSBvZiBiaW5zIGlzIHNpemUgb2YgdGhlIHJhbmdlcyArMSAqLwotCQkJCXN0YS0+dHhfbGF0W2ldLmJpbl9jb3VudCA9Ci0JCQkJCXR4X2xhdGVuY3ktPm5fcmFuZ2VzICsgMTsKLQkJCQlzdGEtPnR4X2xhdFtpXS5iaW5zID0KLQkJCQkJa2NhbGxvYyhzdGEtPnR4X2xhdFtpXS5iaW5fY291bnQsCi0JCQkJCQlzaXplb2YodTMyKSwgR0ZQX0FUT01JQyk7Ci0JCQkJaWYgKCFzdGEtPnR4X2xhdFtpXS5iaW5zKSB7Ci0JCQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJCQlnb3RvIGZyZWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCiAJc3Bpbl9sb2NrX2luaXQoJnN0YS0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnN0YS0+cHNfbG9jayk7CiAJSU5JVF9XT1JLKCZzdGEtPmRydl9kZWxpdmVyX3drLCBzdGFfZGVsaXZlcl9wc19mcmFtZXMpOwpAQCAtMzU5LDggKzMxNywyNCBAQAogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YS0+Y2hhaW5fc2lnbmFsX2F2Zyk7IGkrKykKIAkJZXdtYV9pbml0KCZzdGEtPmNoYWluX3NpZ25hbF9hdmdbaV0sIDEwMjQsIDgpOwogCisJaWYgKGxvY2FsLT5vcHMtPndha2VfdHhfcXVldWUpIHsKKwkJdm9pZCAqdHhxX2RhdGE7CisJCWludCBzaXplID0gc2l6ZW9mKHN0cnVjdCB0eHFfaW5mbykgKworCQkJICAgQUxJR04oaHctPnR4cV9kYXRhX3NpemUsIHNpemVvZih2b2lkICopKTsKKworCQl0eHFfZGF0YSA9IGtjYWxsb2MoQVJSQVlfU0laRShzdGEtPnN0YS50eHEpLCBzaXplLCBnZnApOworCQlpZiAoIXR4cV9kYXRhKQorCQkJZ290byBmcmVlOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YS0+c3RhLnR4cSk7IGkrKykgeworCQkJc3RydWN0IHR4cV9pbmZvICp0eHEgPSB0eHFfZGF0YSArIGkgKiBzaXplOworCisJCQlpZWVlODAyMTFfaW5pdF90eF9xdWV1ZShzZGF0YSwgc3RhLCB0eHEsIGkpOworCQl9CisJfQorCiAJaWYgKHN0YV9wcmVwYXJlX3JhdGVfY29udHJvbChsb2NhbCwgc3RhLCBnZnApKQotCQlnb3RvIGZyZWU7CisJCWdvdG8gZnJlZV90eHE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX05VTV9USURTOyBpKyspIHsKIAkJLyoKQEAgLTM4Miw3ICszNTYsNyBAQAogCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKIAkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pIHsKIAkJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQgPQotCQkJbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tpZWVlODAyMTFfZ2V0X3NkYXRhX2JhbmQoc2RhdGEpXTsKKwkJCWh3LT53aXBoeS0+YmFuZHNbaWVlZTgwMjExX2dldF9zZGF0YV9iYW5kKHNkYXRhKV07CiAJCXU4IHNtcHMgPSAoc2JhbmQtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKSA+PgogCQkJCUlFRUU4MDIxMV9IVF9DQVBfU01fUFNfU0hJRlQ7CiAJCS8qCkBAIC00MDUsMTQgKzM3OSwxMyBAQAogCX0KIAogCXN0YV9kYmcoc2RhdGEsICJBbGxvY2F0ZWQgU1RBICVwTVxuIiwgc3RhLT5zdGEuYWRkcik7CisKIAlyZXR1cm4gc3RhOwogCitmcmVlX3R4cToKKwlpZiAoc3RhLT5zdGEudHhxWzBdKQorCQlrZnJlZSh0b190eHFfaW5mbyhzdGEtPnN0YS50eHFbMF0pKTsKIGZyZWU6Ci0JaWYgKHN0YS0+dHhfbGF0KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTlVNX1RJRFM7IGkrKykKLQkJCWtmcmVlKHN0YS0+dHhfbGF0W2ldLmJpbnMpOwotCQlrZnJlZShzdGEtPnR4X2xhdCk7Ci0JfQogCWtmcmVlKHN0YSk7CiAJcmV0dXJuIE5VTEw7CiB9CkBAIC02ODQsNiArNjU3LDggQEAKIAogCQlpbmRpY2F0ZV90aW0gfD0KIAkJCXN0YS0+ZHJpdmVyX2J1ZmZlcmVkX3RpZHMgJiB0aWRzOworCQlpbmRpY2F0ZV90aW0gfD0KKwkJCXN0YS0+dHhxX2J1ZmZlcmVkX3RpZHMgJiB0aWRzOwogCX0KIAogIGRvbmU6CkBAIC05OTIsMTkgKzk2NywzMiBAQAogCQkgIHJvdW5kX2ppZmZpZXMoamlmZmllcyArIFNUQV9JTkZPX0NMRUFOVVBfSU5URVJWQUwpKTsKIH0KIAotdm9pZCBzdGFfaW5mb19pbml0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQordTMyIHN0YV9hZGRyX2hhc2goY29uc3Qgdm9pZCAqa2V5LCB1MzIgbGVuZ3RoLCB1MzIgc2VlZCkKIHsKKwlyZXR1cm4gamhhc2goa2V5LCBFVEhfQUxFTiwgc2VlZCk7Cit9CisKK2ludCBzdGFfaW5mb19pbml0KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQoreworCWludCBlcnI7CisKKwllcnIgPSByaGFzaHRhYmxlX2luaXQoJmxvY2FsLT5zdGFfaGFzaCwgJnN0YV9yaHRfcGFyYW1zKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCiAJc3Bpbl9sb2NrX2luaXQoJmxvY2FsLT50aW1fbG9jayk7CiAJbXV0ZXhfaW5pdCgmbG9jYWwtPnN0YV9tdHgpOwogCUlOSVRfTElTVF9IRUFEKCZsb2NhbC0+c3RhX2xpc3QpOwogCiAJc2V0dXBfdGltZXIoJmxvY2FsLT5zdGFfY2xlYW51cCwgc3RhX2luZm9fY2xlYW51cCwKIAkJICAgICh1bnNpZ25lZCBsb25nKWxvY2FsKTsKKwlyZXR1cm4gMDsKIH0KIAogdm9pZCBzdGFfaW5mb19zdG9wKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKQogewogCWRlbF90aW1lcl9zeW5jKCZsb2NhbC0+c3RhX2NsZWFudXApOworCXJoYXNodGFibGVfZGVzdHJveSgmbG9jYWwtPnN0YV9oYXNoKTsKIH0KIAogCkBAIC0xMDY4LDE2ICsxMDU2LDIxIEBACiB9CiAKIHN0cnVjdCBpZWVlODAyMTFfc3RhICppZWVlODAyMTFfZmluZF9zdGFfYnlfaWZhZGRyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCQkgICAgICAgY29uc3QgdTggKmFkZHIsCi0JCQkJCSAgICAgICBjb25zdCB1OCAqbG9jYWxhZGRyKQorCQkJCQkJICAgY29uc3QgdTggKmFkZHIsCisJCQkJCQkgICBjb25zdCB1OCAqbG9jYWxhZGRyKQogewotCXN0cnVjdCBzdGFfaW5mbyAqc3RhLCAqbnh0OworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCXN0cnVjdCByaGFzaF9oZWFkICp0bXA7CisJY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOworCisJdGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdShsb2NhbC0+c3RhX2hhc2gudGJsLCAmbG9jYWwtPnN0YV9oYXNoKTsKIAogCS8qCiAJICogSnVzdCByZXR1cm4gYSByYW5kb20gc3RhdGlvbiBpZiBsb2NhbGFkZHIgaXMgTlVMTAogCSAqIC4uLiBmaXJzdCBpbiBsaXN0LgogCSAqLwotCWZvcl9lYWNoX3N0YV9pbmZvKGh3X3RvX2xvY2FsKGh3KSwgYWRkciwgc3RhLCBueHQpIHsKKwlmb3JfZWFjaF9zdGFfaW5mbyhsb2NhbCwgdGJsLCBhZGRyLCBzdGEsIHRtcCkgewogCQlpZiAobG9jYWxhZGRyICYmCiAJCSAgICAhZXRoZXJfYWRkcl9lcXVhbChzdGEtPnNkYXRhLT52aWYuYWRkciwgbG9jYWxhZGRyKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTExNSw3ICsxMTA4LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHN0YS0+c2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBwZW5kaW5nOwotCWludCBmaWx0ZXJlZCA9IDAsIGJ1ZmZlcmVkID0gMCwgYWM7CisJaW50IGZpbHRlcmVkID0gMCwgYnVmZmVyZWQgPSAwLCBhYywgaTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBwc19kYXRhICpwczsKIApAQCAtMTEzNCwxMCArMTEyNywyMiBAQAogCiAJQlVJTERfQlVHX09OKEJJVFNfVE9fTE9OR1MoSUVFRTgwMjExX05VTV9USURTKSA+IDEpOwogCXN0YS0+ZHJpdmVyX2J1ZmZlcmVkX3RpZHMgPSAwOworCXN0YS0+dHhxX2J1ZmZlcmVkX3RpZHMgPSAwOwogCiAJaWYgKCEobG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX0FQX0xJTktfUFMpKQogCQlkcnZfc3RhX25vdGlmeShsb2NhbCwgc2RhdGEsIFNUQV9OT1RJRllfQVdBS0UsICZzdGEtPnN0YSk7CiAKKwlpZiAoc3RhLT5zdGEudHhxWzBdKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0YS0+c3RhLnR4cSk7IGkrKykgeworCQkJc3RydWN0IHR4cV9pbmZvICp0eHFpID0gdG9fdHhxX2luZm8oc3RhLT5zdGEudHhxW2ldKTsKKworCQkJaWYgKCFza2JfcXVldWVfbGVuKCZ0eHFpLT5xdWV1ZSkpCisJCQkJY29udGludWU7CisKKwkJCWRydl93YWtlX3R4X3F1ZXVlKGxvY2FsLCB0eHFpKTsKKwkJfQorCX0KKwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnBlbmRpbmcpOwogCiAJLyogc3luYyB3aXRoIGllZWU4MDIxMV90eF9oX3VuaWNhc3RfcHNfYnVmICovCkBAIC0xMjc1LDcgKzEyODAsNyBAQAogCX0KIAogCWluZm8tPmJhbmQgPSBjaGFuY3R4X2NvbmYtPmRlZi5jaGFuLT5iYW5kOwotCWllZWU4MDIxMV94bWl0KHNkYXRhLCBza2IpOworCWllZWU4MDIxMV94bWl0KHNkYXRhLCBzdGEsIHNrYik7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKQEAgLTEzMTksOCArMTMyNCwxMCBAQAogCQkvKiBpZiB3ZSBhbHJlYWR5IGhhdmUgZnJhbWVzIGZyb20gc29mdHdhcmUsIHRoZW4gd2UgY2FuJ3QgYWxzbwogCQkgKiByZWxlYXNlIGZyb20gaGFyZHdhcmUgcXVldWVzCiAJCSAqLwotCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZmcmFtZXMpKQorCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZmcmFtZXMpKSB7CiAJCQlkcml2ZXJfcmVsZWFzZV90aWRzIHw9IHN0YS0+ZHJpdmVyX2J1ZmZlcmVkX3RpZHMgJiB0aWRzOworCQkJZHJpdmVyX3JlbGVhc2VfdGlkcyB8PSBzdGEtPnR4cV9idWZmZXJlZF90aWRzICYgdGlkczsKKwkJfQogCiAJCWlmIChkcml2ZXJfcmVsZWFzZV90aWRzKSB7CiAJCQkvKiBJZiB0aGUgZHJpdmVyIGhhcyBkYXRhIG9uIG1vcmUgdGhhbiBvbmUgVElEIHRoZW4KQEAgLTE0OTEsNiArMTQ5OCw5IEBACiAKIAkJc3RhX2luZm9fcmVjYWxjX3RpbShzdGEpOwogCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgdGlkcyA9IHN0YS0+dHhxX2J1ZmZlcmVkX3RpZHMgJiBkcml2ZXJfcmVsZWFzZV90aWRzOworCQlpbnQgdGlkOworCiAJCS8qCiAJCSAqIFdlIG5lZWQgdG8gcmVsZWFzZSBhIGZyYW1lIHRoYXQgaXMgYnVmZmVyZWQgc29tZXdoZXJlIGluIHRoZQogCQkgKiBkcml2ZXIgLi4uIGl0J2xsIGhhdmUgdG8gaGFuZGxlIHRoYXQuCkBAIC0xNTEwLDggKzE1MjAsMjIgQEAKIAkJICogdGhhdCB0aGUgVElEKHMpIGJlY2FtZSBlbXB0eSBiZWZvcmUgcmV0dXJuaW5nIGhlcmUgZnJvbSB0aGUKIAkJICogcmVsZWFzZSBmdW5jdGlvbi4KIAkJICogRWl0aGVyIHdheSwgaG93ZXZlciwgd2hlbiB0aGUgZHJpdmVyIHRlbGxzIHVzIHRoYXQgdGhlIFRJRChzKQotCQkgKiBiZWNhbWUgZW1wdHkgd2UnbGwgZG8gdGhlIFRJTSByZWNhbGN1bGF0aW9uLgorCQkgKiBiZWNhbWUgZW1wdHkgb3Igd2UgZmluZCB0aGF0IGEgdHhxIGJlY2FtZSBlbXB0eSwgd2UnbGwgZG8gdGhlCisJCSAqIFRJTSByZWNhbGN1bGF0aW9uLgogCQkgKi8KKworCQlpZiAoIXN0YS0+c3RhLnR4cVswXSkKKwkJCXJldHVybjsKKworCQlmb3IgKHRpZCA9IDA7IHRpZCA8IEFSUkFZX1NJWkUoc3RhLT5zdGEudHhxKTsgdGlkKyspIHsKKwkJCXN0cnVjdCB0eHFfaW5mbyAqdHhxaSA9IHRvX3R4cV9pbmZvKHN0YS0+c3RhLnR4cVt0aWRdKTsKKworCQkJaWYgKCEodGlkcyAmIEJJVCh0aWQpKSB8fCBza2JfcXVldWVfbGVuKCZ0eHFpLT5xdWV1ZSkpCisJCQkJY29udGludWU7CisKKwkJCXN0YV9pbmZvX3JlY2FsY190aW0oc3RhKTsKKwkJCWJyZWFrOworCQl9CiAJfQogfQogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uaCBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCmluZGV4IDkyNWU2OGYuLjVjMTY0ZmIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCisrKyBiL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oCkBAIC0xNiw2ICsxNiw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvYXZlcmFnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcmhhc2h0YWJsZS5oPgogI2luY2x1ZGUgImtleS5oIgogCiAvKioKQEAgLTE3NSw2ICsxNzYsNyBAQAogICogQHJlb3JkZXJfbG9jazogc2VyaWFsaXplcyBhY2Nlc3MgdG8gcmVvcmRlciBidWZmZXIsIHNlZSBiZWxvdy4KICAqIEBhdXRvX3NlcTogdXNlZCBmb3Igb2ZmbG9hZGVkIEJBIHNlc3Npb25zIHRvIGF1dG9tYXRpY2FsbHkgcGljayBoZWFkX3NlcV9hbmQKICAqCWFuZCBzc24uCisgKiBAcmVtb3ZlZDogdGhpcyBzZXNzaW9uIGlzIHJlbW92ZWQgKGJ1dCBtaWdodCBoYXZlIGJlZW4gZm91bmQgZHVlIHRvIFJDVSkKICAqCiAgKiBUaGlzIHN0cnVjdHVyZSdzIGxpZmV0aW1lIGlzIG1hbmFnZWQgYnkgUkNVLCBhc3NpZ25tZW50cyB0bwogICogdGhlIGFycmF5IGhvbGRpbmcgaXQgbXVzdCBob2xkIHRoZSBhZ2dyZWdhdGlvbiBtdXRleC4KQEAgLTE5OSw2ICsyMDEsNyBAQAogCXUxNiB0aW1lb3V0OwogCXU4IGRpYWxvZ190b2tlbjsKIAlib29sIGF1dG9fc2VxOworCWJvb2wgcmVtb3ZlZDsKIH07CiAKIC8qKgpAQCAtMjM0LDI1ICsyMzcsNiBAQAogCXU4IGRpYWxvZ190b2tlbl9hbGxvY2F0b3I7CiB9OwogCi0vKgotICogc3RydWN0IGllZWU4MDIxMV90eF9sYXRlbmN5X3N0YXQgLSBUeCBsYXRlbmN5IHN0YXRpc3RpY3MKLSAqCi0gKiBNZWFzdXJlcyBUWCBsYXRlbmN5IGFuZCBqaXR0ZXIgZm9yIGEgc3RhdGlvbiBwZXIgVElELgotICoKLSAqIEBtYXg6IHdvcnN0IGNhc2UgbGF0ZW5jeQotICogQHN1bTogc3VtIG9mIGFsbCBsYXRlbmNpZXMKLSAqIEBjb3VudGVyOiBhbW91bnQgb2YgVHggZnJhbWVzIHNlbnQgZnJvbSBpbnRlcmZhY2UKLSAqIEBiaW5zOiBlYWNoIGJpbiBjb3VudHMgaG93IG1hbnkgZnJhbWVzIHRyYW5zbWl0dGVkIHdpdGhpbiBhIGNlcnRhaW4KLSAqIGxhdGVuY3kgcmFuZ2UuIHdoZW4gZGlzYWJsZWQgaXQgaXMgTlVMTC4KLSAqIEBiaW5fY291bnQ6IGFtb3VudCBvZiBiaW5zLgotICovCi1zdHJ1Y3QgaWVlZTgwMjExX3R4X2xhdGVuY3lfc3RhdCB7Ci0JdTMyIG1heDsKLQl1MzIgc3VtOwotCXUzMiBjb3VudGVyOwotCXUzMiAqYmluczsKLQl1MzIgYmluX2NvdW50OwotfTsKIAogLyogVmFsdWUgdG8gaW5kaWNhdGUgbm8gVElEIHJlc2VydmF0aW9uICovCiAjZGVmaW5lIElFRUU4MDIxMV9USURfVU5SRVNFUlZFRAkweGZmCkBAIC0yNjUsNyArMjQ5LDcgQEAKICAqCiAgKiBAbGlzdDogZ2xvYmFsIGxpbmtlZCBsaXN0IGVudHJ5CiAgKiBAZnJlZV9saXN0OiBsaXN0IGVudHJ5IGZvciBrZWVwaW5nIHRyYWNrIG9mIHN0YXRpb25zIHRvIGZyZWUKLSAqIEBobmV4dDogaGFzaCB0YWJsZSBsaW5rZWQgbGlzdCBwb2ludGVyCisgKiBAaGFzaF9ub2RlOiBoYXNoIG5vZGUgZm9yIHJoYXNodGFibGUKICAqIEBsb2NhbDogcG9pbnRlciB0byB0aGUgZ2xvYmFsIGluZm9ybWF0aW9uCiAgKiBAc2RhdGE6IHZpcnR1YWwgaW50ZXJmYWNlIHRoaXMgc3RhdGlvbiBiZWxvbmdzIHRvCiAgKiBAcHRrOiBwZWVyIGtleXMgbmVnb3RpYXRlZCB3aXRoIHRoaXMgc3RhdGlvbiwgaWYgYW55CkBAIC0yOTMsNiArMjc3LDcgQEAKICAqCWVudGVyZWQgcG93ZXIgc2F2aW5nIHN0YXRlLCB0aGVzZSBhcmUgYWxzbyBkZWxpdmVyZWQgdG8KICAqCXRoZSBzdGF0aW9uIHdoZW4gaXQgbGVhdmVzIHBvd2Vyc2F2ZSBvciBwb2xscyBmb3IgZnJhbWVzCiAgKiBAZHJpdmVyX2J1ZmZlcmVkX3RpZHM6IGJpdG1hcCBvZiBUSURzIHRoZSBkcml2ZXIgaGFzIGRhdGEgYnVmZmVyZWQgb24KKyAqIEB0eHFfYnVmZmVyZWRfdGlkczogYml0bWFwIG9mIFRJRHMgdGhhdCBtYWM4MDIxMSBoYXMgdHhxIGRhdGEgYnVmZmVyZWQgb24KICAqIEByeF9wYWNrZXRzOiBOdW1iZXIgb2YgTVNEVXMgcmVjZWl2ZWQgZnJvbSB0aGlzIFNUQQogICogQHJ4X2J5dGVzOiBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgZnJvbSB0aGlzIFNUQQogICogQGxhc3Rfcng6IHRpbWUgKGluIGppZmZpZXMpIHdoZW4gbGFzdCBmcmFtZSB3YXMgcmVjZWl2ZWQgZnJvbSB0aGlzIFNUQQpAQCAtMzE0LDcgKzI5OSw2IEBACiAgKiBAdGlkX3NlcTogcGVyLVRJRCBzZXF1ZW5jZSBudW1iZXJzIGZvciBzZW5kaW5nIHRvIHRoaXMgU1RBCiAgKiBAYW1wZHVfbWxtZTogQS1NUERVIHN0YXRlIG1hY2hpbmUgc3RhdGUKICAqIEB0aW1lcl90b190aWQ6IGlkZW50aXR5IG1hcHBpbmcgdG8gSUQgdGltZXJzCi0gKiBAdHhfbGF0OiBUeCBsYXRlbmN5IHN0YXRpc3RpY3MKICAqIEBsbGlkOiBMb2NhbCBsaW5rIElECiAgKiBAcGxpZDogUGVlciBsaW5rIElECiAgKiBAcmVhc29uOiBDYW5jZWwgcmVhc29uIG9uIFBMSU5LX0hPTERJTkcgc3RhdGUKQEAgLTM1OSw3ICszNDMsNyBAQAogCS8qIEdlbmVyYWwgaW5mb3JtYXRpb24sIG1vc3RseSBzdGF0aWMgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3QsIGZyZWVfbGlzdDsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7Ci0Jc3RydWN0IHN0YV9pbmZvIF9fcmN1ICpobmV4dDsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCBoYXNoX25vZGU7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9rZXkgX19yY3UgKmd0a1tOVU1fREVGQVVMVF9LRVlTICsgTlVNX0RFRkFVTFRfTUdNVF9LRVlTXTsKQEAgLTM4OCw2ICszNzIsNyBAQAogCXN0cnVjdCBza19idWZmX2hlYWQgcHNfdHhfYnVmW0lFRUU4MDIxMV9OVU1fQUNTXTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X2ZpbHRlcmVkW0lFRUU4MDIxMV9OVU1fQUNTXTsKIAl1bnNpZ25lZCBsb25nIGRyaXZlcl9idWZmZXJlZF90aWRzOworCXVuc2lnbmVkIGxvbmcgdHhxX2J1ZmZlcmVkX3RpZHM7CiAKIAkvKiBVcGRhdGVkIGZyb20gUlggcGF0aCBvbmx5LCBubyBsb2NraW5nIHJlcXVpcmVtZW50cyAqLwogCXVuc2lnbmVkIGxvbmcgcnhfcGFja2V0czsKQEAgLTQzNSw4ICs0MjAsNiBAQAogCXN0cnVjdCBzdGFfYW1wZHVfbWxtZSBhbXBkdV9tbG1lOwogCXU4IHRpbWVyX3RvX3RpZFtJRUVFODAyMTFfTlVNX1RJRFNdOwogCi0Jc3RydWN0IGllZWU4MDIxMV90eF9sYXRlbmN5X3N0YXQgKnR4X2xhdDsKLQogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNICiAJLyoKIAkgKiBNZXNoIHBlZXIgbGluayBhdHRyaWJ1dGVzCkBAIC01NTcsMTAgKzU0MCw2IEBACiAJCQkJCSBsb2NrZGVwX2lzX2hlbGQoJnN0YS0+YW1wZHVfbWxtZS5tdHgpKTsKIH0KIAotI2RlZmluZSBTVEFfSEFTSF9TSVpFIDI1NgotI2RlZmluZSBTVEFfSEFTSChzdGEpIChzdGFbNV0pCi0KLQogLyogTWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHRvIGJ1ZmZlciBwZXIgcG93ZXIgc2F2aW5nIHN0YXRpb24gcGVyIEFDICovCiAjZGVmaW5lIFNUQV9NQVhfVFhfQlVGRkVSCTY0CiAKQEAgLTU4MSwyNiArNTYwLDE1IEBACiBzdHJ1Y3Qgc3RhX2luZm8gKnN0YV9pbmZvX2dldF9ic3Moc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJICBjb25zdCB1OCAqYWRkcik7CiAKLXN0YXRpYyBpbmxpbmUKLXZvaWQgZm9yX2VhY2hfc3RhX2luZm9fdHlwZV9jaGVjayhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkgIGNvbnN0IHU4ICphZGRyLAotCQkJCSAgc3RydWN0IHN0YV9pbmZvICpzdGEsCi0JCQkJICBzdHJ1Y3Qgc3RhX2luZm8gKm54dCkKLXsKLX0KK3UzMiBzdGFfYWRkcl9oYXNoKGNvbnN0IHZvaWQgKmtleSwgdTMyIGxlbmd0aCwgdTMyIHNlZWQpOwogCi0jZGVmaW5lIGZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBfYWRkciwgX3N0YSwgbnh0KQkJCVwKLQlmb3IgKAkvKiBpbml0aWFsaXNlIGxvb3AgKi8JCQkJCVwKLQkJX3N0YSA9IHJjdV9kZXJlZmVyZW5jZShsb2NhbC0+c3RhX2hhc2hbU1RBX0hBU0goX2FkZHIpXSksXAotCQlueHQgPSBfc3RhID8gcmN1X2RlcmVmZXJlbmNlKF9zdGEtPmhuZXh0KSA6IE5VTEw7CVwKLQkJLyogdHlwZWNoZWNrICovCQkJCQkJXAotCQlmb3JfZWFjaF9zdGFfaW5mb190eXBlX2NoZWNrKGxvY2FsLCAoX2FkZHIpLCBfc3RhLCBueHQpLFwKLQkJLyogY29udGludWUgY29uZGl0aW9uICovCQkJCVwKLQkJX3N0YTsJCQkJCQkJXAotCQkvKiBhZHZhbmNlIGxvb3AgKi8JCQkJCVwKLQkJX3N0YSA9IG54dCwJCQkJCQlcCi0JCW54dCA9IF9zdGEgPyByY3VfZGVyZWZlcmVuY2UoX3N0YS0+aG5leHQpIDogTlVMTAlcCi0JICAgICApCQkJCQkJCQlcCisjZGVmaW5lIF9zdGFfYnVja2V0X2lkeChfdGJsLCBfYSkJCQkJCVwKKwlyaHRfYnVja2V0X2luZGV4KF90YmwsIHN0YV9hZGRyX2hhc2goX2EsIEVUSF9BTEVOLCAoX3RibCktPmhhc2hfcm5kKSkKKworI2RlZmluZSBmb3JfZWFjaF9zdGFfaW5mbyhsb2NhbCwgdGJsLCBfYWRkciwgX3N0YSwgX3RtcCkJCVwKKwlyaHRfZm9yX2VhY2hfZW50cnlfcmN1KF9zdGEsIF90bXAsIHRibCwgCQkJXAorCQkJICAgICAgIF9zdGFfYnVja2V0X2lkeCh0YmwsIF9hZGRyKSwJCVwKKwkJCSAgICAgICBoYXNoX25vZGUpCQkJCVwKIAkvKiBjb21wYXJlIGFkZHJlc3MgYW5kIHJ1biBjb2RlIG9ubHkgaWYgaXQgbWF0Y2hlcyAqLwkJXAogCWlmIChldGhlcl9hZGRyX2VxdWFsKF9zdGEtPnN0YS5hZGRyLCAoX2FkZHIpKSkKIApAQCAtNjM3LDcgKzYwNSw3IEBACiAKIHZvaWQgc3RhX2luZm9fcmVjYWxjX3RpbShzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CiAKLXZvaWQgc3RhX2luZm9faW5pdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCk7CitpbnQgc3RhX2luZm9faW5pdChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCk7CiB2b2lkIHN0YV9pbmZvX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zdGF0dXMuYyBiL25ldC9tYWM4MDIxMS9zdGF0dXMuYwppbmRleCBlNjc5YjdjLi4wMDVmZGJlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhdHVzLmMKKysrIGIvbmV0L21hYzgwMjExL3N0YXR1cy5jCkBAIC0xMiw3ICsxMiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKQEAgLTUxNSw3MyArNTE0LDYgQEAKIH0KIAogLyoKLSAqIE1lYXN1cmUgVHggZnJhbWUgY29tcGxldGlvbiBhbmQgcmVtb3ZhbCB0aW1lIGZvciBUeCBsYXRlbmN5IHN0YXRpc3RpY3MKLSAqIGNhbGN1bGF0aW9uLiBBIHNpbmdsZSBUeCBmcmFtZSBsYXRlbmN5IHNob3VsZCBiZSBtZWFzdXJlZCBmcm9tIHdoZW4gaXQKLSAqIGlzIGVudGVyaW5nIHRoZSBLZXJuZWwgdW50aWwgd2UgcmVjZWl2ZSBUeCBjb21wbGV0ZSBjb25maXJtYXRpb24gaW5kaWNhdGlvbgotICogYW5kIHJlbW92ZSB0aGUgc2tiLgotICovCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfdHhfbGF0ZW5jeV9lbmRfbXNybW50KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLAotCQkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcikKLXsKLQl1MzIgbXNybW50OwotCXUxNiB0aWQ7Ci0JdTggKnFjOwotCWludCBpLCBiaW5fcmFuZ2VfY291bnQ7Ci0JdTMyICpiaW5fcmFuZ2VzOwotCV9fbGUxNiBmYzsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2xhdGVuY3lfc3RhdCAqdHhfbGF0OwotCXN0cnVjdCBpZWVlODAyMTFfdHhfbGF0ZW5jeV9iaW5fcmFuZ2VzICp0eF9sYXRlbmN5OwotCWt0aW1lX3Qgc2tiX2FydiA9IHNrYi0+dHN0YW1wOwotCi0JdHhfbGF0ZW5jeSA9IHJjdV9kZXJlZmVyZW5jZShsb2NhbC0+dHhfbGF0ZW5jeSk7Ci0KLQkvKiBhc3NlcnQgVHggbGF0ZW5jeSBzdGF0cyBhcmUgZW5hYmxlZCAmIGZyYW1lIGFycml2ZWQgd2hlbiBlbmFibGVkICovCi0JaWYgKCF0eF9sYXRlbmN5IHx8ICFrdGltZV90b19ucyhza2JfYXJ2KSkKLQkJcmV0dXJuOwotCi0JZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0KLQlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGZjKSkgLyogbWFrZSBzdXJlIGl0IGlzIGEgZGF0YSBmcmFtZSAqLwotCQlyZXR1cm47Ci0KLQkvKiBnZXQgZnJhbWUgdGlkICovCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0JCXRpZCA9IHFjWzBdICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0s7Ci0JfSBlbHNlIHsKLQkJdGlkID0gMDsKLQl9Ci0KLQl0eF9sYXQgPSAmc3RhLT50eF9sYXRbdGlkXTsKLQotCS8qIENhbGN1bGF0ZSB0aGUgbGF0ZW5jeSAqLwotCW1zcm1udCA9IGt0aW1lX3RvX21zKGt0aW1lX3N1YihrdGltZV9nZXQoKSwgc2tiX2FydikpOwotCi0JaWYgKHR4X2xhdC0+bWF4IDwgbXNybW50KSAvKiB1cGRhdGUgc3RhdHMgKi8KLQkJdHhfbGF0LT5tYXggPSBtc3JtbnQ7Ci0JdHhfbGF0LT5jb3VudGVyKys7Ci0JdHhfbGF0LT5zdW0gKz0gbXNybW50OwotCi0JaWYgKCF0eF9sYXQtPmJpbnMpIC8qIGJpbnMgbm90IGFjdGl2YXRlZCAqLwotCQlyZXR1cm47Ci0KLQkvKiBjb3VudCBob3cgbWFueSBUeCBmcmFtZXMgdHJhbnNtaXR0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgbGF0ZW5jeSAqLwotCWJpbl9yYW5nZV9jb3VudCA9IHR4X2xhdGVuY3ktPm5fcmFuZ2VzOwotCWJpbl9yYW5nZXMgPSB0eF9sYXRlbmN5LT5yYW5nZXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYmluX3JhbmdlX2NvdW50OyBpKyspIHsKLQkJaWYgKG1zcm1udCA8PSBiaW5fcmFuZ2VzW2ldKSB7Ci0JCQl0eF9sYXQtPmJpbnNbaV0rKzsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChpID09IGJpbl9yYW5nZV9jb3VudCkgLyogbXNybW50IGlzIGJpZ2dlciB0aGFuIHRoZSBiaWdnZXN0IHJhbmdlICovCi0JCXR4X2xhdC0+Ymluc1tpXSsrOwotfQotCi0vKgogICogVXNlIGEgc3RhdGljIHRocmVzaG9sZCBmb3Igbm93LCBiZXN0IHZhbHVlIHRvIGJlIGRldGVybWluZWQKICAqIGJ5IHRlc3RpbmcgLi4uCiAgKiBTaG91bGQgaXQgZGVwZW5kIG9uOgpAQCAtNzIyLDcgKzY1NCw4IEBACiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnByZXZfZGV2ID0gTlVMTDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgKnRtcDsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCAqdG1wOwogCWludCByZXRyeV9jb3VudDsKIAlpbnQgcmF0ZXNfaWR4OwogCWJvb2wgc2VuZF90b19jb29rZWQ7CkBAIC03MzEsNiArNjY0LDcgQEAKIAlpbnQgcnRhcF9sZW47CiAJaW50IHNoaWZ0ID0gMDsKIAlpbnQgdGlkID0gSUVFRTgwMjExX05VTV9USURTOworCWNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKIAogCXJhdGVzX2lkeCA9IGllZWU4MDIxMV90eF9nZXRfcmF0ZXMoaHcsIGluZm8sICZyZXRyeV9jb3VudCk7CiAKQEAgLTczOSw3ICs2NzMsOSBAQAogCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tpbmZvLT5iYW5kXTsKIAlmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKIAotCWZvcl9lYWNoX3N0YV9pbmZvKGxvY2FsLCBoZHItPmFkZHIxLCBzdGEsIHRtcCkgeworCXRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UobG9jYWwtPnN0YV9oYXNoLnRibCwgJmxvY2FsLT5zdGFfaGFzaCk7CisKKwlmb3JfZWFjaF9zdGFfaW5mbyhsb2NhbCwgdGJsLCBoZHItPmFkZHIxLCBzdGEsIHRtcCkgewogCQkvKiBza2lwIHdyb25nIHZpcnR1YWwgaW50ZXJmYWNlICovCiAJCWlmICghZXRoZXJfYWRkcl9lcXVhbChoZHItPmFkZHIyLCBzdGEtPnNkYXRhLT52aWYuYWRkcikpCiAJCQljb250aW51ZTsKQEAgLTg1MywxMiArNzg5LDYgQEAKIAogCQlpZiAoYWNrZWQpCiAJCQlzdGEtPmxhc3RfYWNrX3NpZ25hbCA9IGluZm8tPnN0YXR1cy5hY2tfc2lnbmFsOwotCi0JCS8qCi0JCSAqIE1lYXN1cmUgZnJhbWUgcmVtb3ZhbCBmb3IgdHggbGF0ZW5jeQotCQkgKiBzdGF0aXN0aWNzIGNhbGN1bGF0aW9uCi0JCSAqLwotCQlpZWVlODAyMTFfdHhfbGF0ZW5jeV9lbmRfbXNybW50KGxvY2FsLCBza2IsIHN0YSwgaGRyKTsKIAl9CiAKIAlyY3VfcmVhZF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90ZGxzLmMgYi9uZXQvbWFjODAyMTEvdGRscy5jCmluZGV4IGM5Zjk3NTIuLmZmZjBkODYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90ZGxzLmMKKysrIGIvbmV0L21hYzgwMjExL3RkbHMuYwpAQCAtMTM2LDYgKzEzNiwyNCBAQAogCSpwb3MgPSAyICogc3ViYmFuZF9jbnQ7CiB9CiAKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV90ZGxzX2FkZF9vcGVyX2NsYXNzZXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXU4ICpwb3M7CisJdTggb3BfY2xhc3M7CisKKwlpZiAoIWllZWU4MDIxMV9jaGFuZGVmX3RvX29wZXJhdGluZ19jbGFzcygmc2RhdGEtPnZpZi5ic3NfY29uZi5jaGFuZGVmLAorCQkJCQkJICAmb3BfY2xhc3MpKQorCQlyZXR1cm47CisKKwlwb3MgPSBza2JfcHV0KHNrYiwgNCk7CisJKnBvcysrID0gV0xBTl9FSURfU1VQUE9SVEVEX1JFR1VMQVRPUllfQ0xBU1NFUzsKKwkqcG9zKysgPSAyOyAvKiBsZW4gKi8KKworCSpwb3MrKyA9IG9wX2NsYXNzOworCSpwb3MrKyA9IG9wX2NsYXNzOyAvKiBnaXZlIGN1cnJlbnQgb3BlcmF0aW5nIGNsYXNzIGFzIGFsdGVybmF0ZSB0b28gKi8KK30KKwogc3RhdGljIHZvaWQgaWVlZTgwMjExX3RkbHNfYWRkX2Jzc19jb2V4X2llKHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdTggKnBvcyA9ICh2b2lkICopc2tiX3B1dChza2IsIDMpOwpAQCAtMTkzLDYgKzIxMSwxNyBAQAogCW1lbWNweShsbmtpZC0+cmVzcF9zdGEsIHJzcF9hZGRyLCBFVEhfQUxFTik7CiB9CiAKK3N0YXRpYyB2b2lkCitpZWVlODAyMTFfdGRsc19hZGRfYWlkKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2QgPSAmc2RhdGEtPnUubWdkOworCXU4ICpwb3MgPSAodm9pZCAqKXNrYl9wdXQoc2tiLCA0KTsKKworCSpwb3MrKyA9IFdMQU5fRUlEX0FJRDsKKwkqcG9zKysgPSAyOyAvKiBsZW4gKi8KKwlwdXRfdW5hbGlnbmVkX2xlMTYoaWZtZ2QtPmFpZCwgcG9zKTsKK30KKwogLyogdHJhbnNsYXRlIG51bWJlcmluZyBpbiB0aGUgV01NIHBhcmFtZXRlciBJRSB0byB0aGUgbWFjODAyMTEgbm90YXRpb24gKi8KIHN0YXRpYyBlbnVtIGllZWU4MDIxMV9hY19udW1iZXJzIGllZWU4MDIxMV9hY19mcm9tX3dtbShpbnQgYWMpCiB7CkBAIC0yNzEsMjEgKzMwMCwxMSBAQAogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwogCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCBodF9jYXA7CisJc3RydWN0IGllZWU4MDIxMV9zdGFfdmh0X2NhcCB2aHRfY2FwOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gTlVMTDsKIAlzaXplX3Qgb2Zmc2V0ID0gMCwgbm9mZnNldDsKIAl1OCAqcG9zOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCi0JLyogd2Ugc2hvdWxkIGhhdmUgdGhlIHBlZXIgU1RBIGlmIHdlJ3JlIGFscmVhZHkgcmVzcG9uZGluZyAqLwotCWlmIChhY3Rpb25fY29kZSA9PSBXTEFOX1RETFNfU0VUVVBfUkVTUE9OU0UpIHsKLQkJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBwZWVyKTsKLQkJaWYgKFdBUk5fT05fT05DRSghc3RhKSkgewotCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KIAlpZWVlODAyMTFfYWRkX3NyYXRlc19pZShzZGF0YSwgc2tiLCBmYWxzZSwgYmFuZCk7CiAJaWVlZTgwMjExX2FkZF9leHRfc3JhdGVzX2llKHNkYXRhLCBza2IsIGZhbHNlLCBiYW5kKTsKIAlpZWVlODAyMTFfdGRsc19hZGRfc3VwcF9jaGFubmVscyhzZGF0YSwgc2tiKTsKQEAgLTMzOCw2ICszNTcsMTkgQEAKIAkJb2Zmc2V0ID0gbm9mZnNldDsKIAl9CiAKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwkvKiB3ZSBzaG91bGQgaGF2ZSB0aGUgcGVlciBTVEEgaWYgd2UncmUgYWxyZWFkeSByZXNwb25kaW5nICovCisJaWYgKGFjdGlvbl9jb2RlID09IFdMQU5fVERMU19TRVRVUF9SRVNQT05TRSkgeworCQlzdGEgPSBzdGFfaW5mb19nZXQoc2RhdGEsIHBlZXIpOworCQlpZiAoV0FSTl9PTl9PTkNFKCFzdGEpKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKworCWllZWU4MDIxMV90ZGxzX2FkZF9vcGVyX2NsYXNzZXMoc2RhdGEsIHNrYik7CisKIAkvKgogCSAqIHdpdGggVERMUyB3ZSBjYW4gc3dpdGNoIGNoYW5uZWxzLCBhbmQgSFQtY2FwcyBhcmUgbm90IG5lY2Vzc2FyaWx5CiAJICogdGhlIHNhbWUgb24gYWxsIGJhbmRzLiBUaGUgc3BlY2lmaWNhdGlvbiBsaW1pdHMgdGhlIHNldHVwIHRvIGEKQEAgLTM0Niw3ICszNzgsOSBAQAogCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tiYW5kXTsKIAltZW1jcHkoJmh0X2NhcCwgJnNiYW5kLT5odF9jYXAsIHNpemVvZihodF9jYXApKTsKIAotCWlmIChhY3Rpb25fY29kZSA9PSBXTEFOX1RETFNfU0VUVVBfUkVRVUVTVCAmJiBodF9jYXAuaHRfc3VwcG9ydGVkKSB7CisJaWYgKChhY3Rpb25fY29kZSA9PSBXTEFOX1RETFNfU0VUVVBfUkVRVUVTVCB8fAorCSAgICAgYWN0aW9uX2NvZGUgPT0gV0xBTl9QVUJfQUNUSU9OX1RETFNfRElTQ09WRVJfUkVTKSAmJgorCSAgICBodF9jYXAuaHRfc3VwcG9ydGVkKSB7CiAJCWllZWU4MDIxMV9hcHBseV9odGNhcF9vdmVycmlkZXMoc2RhdGEsICZodF9jYXApOwogCiAJCS8qIGRpc2FibGUgU01QUyBpbiBURExTIGluaXRpYXRvciAqLwpAQCAtMzY4LDEyICs0MDIsNjMgQEAKIAkJaWVlZTgwMjExX2llX2J1aWxkX2h0X2NhcChwb3MsICZodF9jYXAsIGh0X2NhcC5jYXApOwogCX0KIAotCXJjdV9yZWFkX3VubG9jaygpOwotCiAJaWYgKGh0X2NhcC5odF9zdXBwb3J0ZWQgJiYKIAkgICAgKGh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkpCiAJCWllZWU4MDIxMV90ZGxzX2FkZF9ic3NfY29leF9pZShza2IpOwogCisJaWVlZTgwMjExX3RkbHNfYWRkX2xpbmtfaWUoc2RhdGEsIHNrYiwgcGVlciwgaW5pdGlhdG9yKTsKKworCS8qIGFkZCBhbnkgY3VzdG9tIElFcyB0aGF0IGdvIGJlZm9yZSBWSFQgY2FwYWJpbGl0aWVzICovCisJaWYgKGV4dHJhX2llc19sZW4pIHsKKwkJc3RhdGljIGNvbnN0IHU4IGJlZm9yZV92aHRfY2FwW10gPSB7CisJCQlXTEFOX0VJRF9TVVBQX1JBVEVTLAorCQkJV0xBTl9FSURfQ09VTlRSWSwKKwkJCVdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTLAorCQkJV0xBTl9FSURfU1VQUE9SVEVEX0NIQU5ORUxTLAorCQkJV0xBTl9FSURfUlNOLAorCQkJV0xBTl9FSURfRVhUX0NBUEFCSUxJVFksCisJCQlXTEFOX0VJRF9RT1NfQ0FQQSwKKwkJCVdMQU5fRUlEX0ZBU1RfQlNTX1RSQU5TSVRJT04sCisJCQlXTEFOX0VJRF9USU1FT1VUX0lOVEVSVkFMLAorCQkJV0xBTl9FSURfU1VQUE9SVEVEX1JFR1VMQVRPUllfQ0xBU1NFUywKKwkJCVdMQU5fRUlEX01VTFRJX0JBTkQsCisJCX07CisJCW5vZmZzZXQgPSBpZWVlODAyMTFfaWVfc3BsaXQoZXh0cmFfaWVzLCBleHRyYV9pZXNfbGVuLAorCQkJCQkgICAgIGJlZm9yZV92aHRfY2FwLAorCQkJCQkgICAgIEFSUkFZX1NJWkUoYmVmb3JlX3ZodF9jYXApLAorCQkJCQkgICAgIG9mZnNldCk7CisJCXBvcyA9IHNrYl9wdXQoc2tiLCBub2Zmc2V0IC0gb2Zmc2V0KTsKKwkJbWVtY3B5KHBvcywgZXh0cmFfaWVzICsgb2Zmc2V0LCBub2Zmc2V0IC0gb2Zmc2V0KTsKKwkJb2Zmc2V0ID0gbm9mZnNldDsKKwl9CisKKwkvKiBidWlsZCB0aGUgVkhULWNhcCBzaW1pbGFybHkgdG8gdGhlIEhULWNhcCAqLworCW1lbWNweSgmdmh0X2NhcCwgJnNiYW5kLT52aHRfY2FwLCBzaXplb2Yodmh0X2NhcCkpOworCWlmICgoYWN0aW9uX2NvZGUgPT0gV0xBTl9URExTX1NFVFVQX1JFUVVFU1QgfHwKKwkgICAgIGFjdGlvbl9jb2RlID09IFdMQU5fUFVCX0FDVElPTl9URExTX0RJU0NPVkVSX1JFUykgJiYKKwkgICAgdmh0X2NhcC52aHRfc3VwcG9ydGVkKSB7CisJCWllZWU4MDIxMV9hcHBseV92aHRjYXBfb3ZlcnJpZGVzKHNkYXRhLCAmdmh0X2NhcCk7CisKKwkJLyogdGhlIEFJRCBpcyBwcmVzZW50IG9ubHkgd2hlbiBWSFQgaXMgaW1wbGVtZW50ZWQgKi8KKwkJaWYgKGFjdGlvbl9jb2RlID09IFdMQU5fVERMU19TRVRVUF9SRVFVRVNUKQorCQkJaWVlZTgwMjExX3RkbHNfYWRkX2FpZChzZGF0YSwgc2tiKTsKKworCQlwb3MgPSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdmh0X2NhcCkgKyAyKTsKKwkJaWVlZTgwMjExX2llX2J1aWxkX3ZodF9jYXAocG9zLCAmdmh0X2NhcCwgdmh0X2NhcC5jYXApOworCX0gZWxzZSBpZiAoYWN0aW9uX2NvZGUgPT0gV0xBTl9URExTX1NFVFVQX1JFU1BPTlNFICYmCisJCSAgIHZodF9jYXAudmh0X3N1cHBvcnRlZCAmJiBzdGEtPnN0YS52aHRfY2FwLnZodF9zdXBwb3J0ZWQpIHsKKwkJLyogdGhlIHBlZXIgY2FwcyBhcmUgYWxyZWFkeSBpbnRlcnNlY3RlZCB3aXRoIG91ciBvd24gKi8KKwkJbWVtY3B5KCZ2aHRfY2FwLCAmc3RhLT5zdGEudmh0X2NhcCwgc2l6ZW9mKHZodF9jYXApKTsKKworCQkvKiB0aGUgQUlEIGlzIHByZXNlbnQgb25seSB3aGVuIFZIVCBpcyBpbXBsZW1lbnRlZCAqLworCQlpZWVlODAyMTFfdGRsc19hZGRfYWlkKHNkYXRhLCBza2IpOworCisJCXBvcyA9IHNrYl9wdXQoc2tiLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV92aHRfY2FwKSArIDIpOworCQlpZWVlODAyMTFfaWVfYnVpbGRfdmh0X2NhcChwb3MsICZ2aHRfY2FwLCB2aHRfY2FwLmNhcCk7CisJfQorCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKIAkvKiBhZGQgYW55IHJlbWFpbmluZyBJRXMgKi8KIAlpZiAoZXh0cmFfaWVzX2xlbikgewogCQlub2Zmc2V0ID0gZXh0cmFfaWVzX2xlbjsKQEAgLTM4MSw3ICs0NjYsNiBAQAogCQltZW1jcHkocG9zLCBleHRyYV9pZXMgKyBvZmZzZXQsIG5vZmZzZXQgLSBvZmZzZXQpOwogCX0KIAotCWllZWU4MDIxMV90ZGxzX2FkZF9saW5rX2llKHNkYXRhLCBza2IsIHBlZXIsIGluaXRpYXRvcik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0zOTQsNiArNDc4LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2lmX21hbmFnZWQgKmlmbWdkID0gJnNkYXRhLT51Lm1nZDsKIAlzaXplX3Qgb2Zmc2V0ID0gMCwgbm9mZnNldDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgKmFwX3N0YTsKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQgPSBpZWVlODAyMTFfZ2V0X3NkYXRhX2JhbmQoc2RhdGEpOwogCXU4ICpwb3M7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CkBAIC00NTMsNiArNTM4LDIxIEBACiAJCX0KIAl9CiAKKwlpZWVlODAyMTFfdGRsc19hZGRfbGlua19pZShzZGF0YSwgc2tiLCBwZWVyLCBpbml0aWF0b3IpOworCisJLyogb25seSBpbmNsdWRlIFZIVC1vcGVyYXRpb24gaWYgbm90IG9uIHRoZSAyLjRHSHogYmFuZCAqLworCWlmIChiYW5kICE9IElFRUU4MDIxMV9CQU5EXzJHSFogJiYgIWFwX3N0YS0+c3RhLnZodF9jYXAudmh0X3N1cHBvcnRlZCAmJgorCSAgICBzdGEtPnN0YS52aHRfY2FwLnZodF9zdXBwb3J0ZWQpIHsKKwkJc3RydWN0IGllZWU4MDIxMV9jaGFuY3R4X2NvbmYgKmNoYW5jdHhfY29uZiA9CisJCQkJcmN1X2RlcmVmZXJlbmNlKHNkYXRhLT52aWYuY2hhbmN0eF9jb25mKTsKKwkJaWYgKCFXQVJOX09OKCFjaGFuY3R4X2NvbmYpKSB7CisJCQlwb3MgPSBza2JfcHV0KHNrYiwgMiArCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdmh0X29wZXJhdGlvbikpOworCQkJaWVlZTgwMjExX2llX2J1aWxkX3ZodF9vcGVyKHBvcywgJnN0YS0+c3RhLnZodF9jYXAsCisJCQkJCQkgICAgJmNoYW5jdHhfY29uZi0+ZGVmKTsKKwkJfQorCX0KKwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJLyogYWRkIGFueSByZW1haW5pbmcgSUVzICovCkBAIC00NjEsOCArNTYxLDYgQEAKIAkJcG9zID0gc2tiX3B1dChza2IsIG5vZmZzZXQgLSBvZmZzZXQpOwogCQltZW1jcHkocG9zLCBleHRyYV9pZXMgKyBvZmZzZXQsIG5vZmZzZXQgLSBvZmZzZXQpOwogCX0KLQotCWllZWU4MDIxMV90ZGxzX2FkZF9saW5rX2llKHNkYXRhLCBza2IsIHBlZXIsIGluaXRpYXRvcik7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC03MDgsOCArODA2LDEyIEBACiAJCQkgICAgICAgMjYgKyAvKiBtYXgoV01NLWluZm8sIFdNTS1wYXJhbSkgKi8KIAkJCSAgICAgICAyICsgbWF4KHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCksCiAJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbikpICsKKwkJCSAgICAgICAyICsgbWF4KHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3ZodF9jYXApLAorCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV92aHRfb3BlcmF0aW9uKSkgKwogCQkJICAgICAgIDUwICsgLyogc3VwcG9ydGVkIGNoYW5uZWxzICovCiAJCQkgICAgICAgMyArIC8qIDQwLzIwIEJTUyBjb2V4ICovCisJCQkgICAgICAgNCArIC8qIEFJRCAqLworCQkJICAgICAgIDQgKyAvKiBvcGVyIGNsYXNzZXMgKi8KIAkJCSAgICAgICBleHRyYV9pZXNfbGVuICsKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV90ZGxzX2xua2llKSk7CiAJaWYgKCFza2IpCkBAIC05MDcsNyArMTAwOSw3IEBACiAJaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIoc2RhdGEtPnUubWdkLnRkbHNfcGVlcikgJiYKIAkgICAgIWV0aGVyX2FkZHJfZXF1YWwoc2RhdGEtPnUubWdkLnRkbHNfcGVlciwgcGVlcikpIHsKIAkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGV4aXQ7CisJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKIAkvKgpAQCAtOTIyLDI3ICsxMDI0LDM0IEBACiAJCWlmICghc3RhX2luZm9fZ2V0KHNkYXRhLCBwZWVyKSkgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXQgPSAtRU5PTElOSzsKLQkJCWdvdG8gZXhpdDsKKwkJCWdvdG8gb3V0X3VubG9jazsKIAkJfQogCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKIAlpZWVlODAyMTFfZmx1c2hfcXVldWVzKGxvY2FsLCBzZGF0YSwgZmFsc2UpOworCW1lbWNweShzZGF0YS0+dS5tZ2QudGRsc19wZWVyLCBwZWVyLCBFVEhfQUxFTik7CisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIAorCS8qIHdlIGNhbm5vdCB0YWtlIHRoZSBtdXRleCB3aGlsZSBwcmVwYXJpbmcgdGhlIHNldHVwIHBhY2tldCAqLwogCXJldCA9IGllZWU4MDIxMV90ZGxzX3ByZXBfbWdtdF9wYWNrZXQod2lwaHksIGRldiwgcGVlciwgYWN0aW9uX2NvZGUsCiAJCQkJCSAgICAgIGRpYWxvZ190b2tlbiwgc3RhdHVzX2NvZGUsCiAJCQkJCSAgICAgIHBlZXJfY2FwYWJpbGl0eSwgaW5pdGlhdG9yLAogCQkJCQkgICAgICBleHRyYV9pZXMsIGV4dHJhX2llc19sZW4sIDAsCiAJCQkJCSAgICAgIE5VTEwpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGV4aXQ7CisJaWYgKHJldCA8IDApIHsKKwkJbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7CisJCWV0aF96ZXJvX2FkZHIoc2RhdGEtPnUubWdkLnRkbHNfcGVlcik7CisJCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CisJCXJldHVybiByZXQ7CisJfQogCi0JbWVtY3B5KHNkYXRhLT51Lm1nZC50ZGxzX3BlZXIsIHBlZXIsIEVUSF9BTEVOKTsKIAlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKCZzZGF0YS0+bG9jYWwtPmh3LAogCQkJCSAgICAgJnNkYXRhLT51Lm1nZC50ZGxzX3BlZXJfZGVsX3dvcmssCiAJCQkJICAgICBURExTX1BFRVJfU0VUVVBfVElNRU9VVCk7CisJcmV0dXJuIDA7CiAKLWV4aXQ6CitvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS90cmFjZS5jIGIvbmV0L21hYzgwMjExL3RyYWNlLmMKaW5kZXggMzg2ZTQ1ZDguLmVkZmUwYzEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90cmFjZS5jCisrKyBiL25ldC9tYWM4MDIxMS90cmFjZS5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlICJ0cmFjZS5oIgorI2luY2x1ZGUgInRyYWNlX21zZy5oIgogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU1NBR0VfVFJBQ0lORwogdm9pZCBfX3NkYXRhX2luZm8oY29uc3QgY2hhciAqZm10LCAuLi4pCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdHJhY2UuaCBiL25ldC9tYWM4MDIxMS90cmFjZS5oCmluZGV4IDI2M2E5NTYuLjRjMmU3NjkgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90cmFjZS5oCisrKyBiL25ldC9tYWM4MDIxMS90cmFjZS5oCkBAIC0xMjU2LDI4ICsxMjU2LDI4IEBACiAJCSAgTE9DQUxfUFJfQVJHLCBWSUZfUFJfQVJHKQogKTsKIAotVFJBQ0VfRVZFTlQoZHJ2X3Jzc2lfY2FsbGJhY2ssCitUUkFDRV9FVkVOVChkcnZfZXZlbnRfY2FsbGJhY2ssCiAJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJIGVudW0gaWVlZTgwMjExX3Jzc2lfZXZlbnQgcnNzaV9ldmVudCksCisJCSBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2V2ZW50ICpfZXZlbnQpLAogCi0JVFBfQVJHUyhsb2NhbCwgc2RhdGEsIHJzc2lfZXZlbnQpLAorCVRQX0FSR1MobG9jYWwsIHNkYXRhLCBfZXZlbnQpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJTE9DQUxfRU5UUlkKIAkJVklGX0VOVFJZCi0JCV9fZmllbGQodTMyLCByc3NpX2V2ZW50KQorCQlfX2ZpZWxkKHUzMiwgdHlwZSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCiAJCUxPQ0FMX0FTU0lHTjsKIAkJVklGX0FTU0lHTjsKLQkJX19lbnRyeS0+cnNzaV9ldmVudCA9IHJzc2lfZXZlbnQ7CisJCV9fZW50cnktPnR5cGUgPSBfZXZlbnQtPnR5cGU7CiAJKSwKIAogCVRQX3ByaW50aygKLQkJTE9DQUxfUFJfRk1UIFZJRl9QUl9GTVQgIiByc3NpX2V2ZW50OiVkIiwKLQkJTE9DQUxfUFJfQVJHLCBWSUZfUFJfQVJHLCBfX2VudHJ5LT5yc3NpX2V2ZW50CisJCUxPQ0FMX1BSX0ZNVCBWSUZfUFJfRk1UICIgZXZlbnQ6JWQiLAorCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcsIF9fZW50cnktPnR5cGUKIAkpCiApOwogCkBAIC0yMzEyLDQ0ICsyMzEyLDM3IEBACiAJKQogKTsKIAotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNTQUdFX1RSQUNJTkcKLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIG1hYzgwMjExX21zZworVFJBQ0VfRVZFTlQoZHJ2X3dha2VfdHhfcXVldWUsCisJVFBfUFJPVE8oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJIHN0cnVjdCB0eHFfaW5mbyAqdHhxKSwKIAotI2RlZmluZSBNQVhfTVNHX0xFTgkxMDAKLQotREVDTEFSRV9FVkVOVF9DTEFTUyhtYWM4MDIxMV9tc2dfZXZlbnQsCi0JVFBfUFJPVE8oc3RydWN0IHZhX2Zvcm1hdCAqdmFmKSwKLQotCVRQX0FSR1ModmFmKSwKKwlUUF9BUkdTKGxvY2FsLCBzZGF0YSwgdHhxKSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCi0JCV9fZHluYW1pY19hcnJheShjaGFyLCBtc2csIE1BWF9NU0dfTEVOKQorCQlMT0NBTF9FTlRSWQorCQlWSUZfRU5UUlkKKwkJU1RBX0VOVFJZCisJCV9fZmllbGQodTgsIGFjKQorCQlfX2ZpZWxkKHU4LCB0aWQpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAotCQlXQVJOX09OX09OQ0UodnNucHJpbnRmKF9fZ2V0X2R5bmFtaWNfYXJyYXkobXNnKSwKLQkJCQkgICAgICAgTUFYX01TR19MRU4sIHZhZi0+Zm10LAotCQkJCSAgICAgICAqdmFmLT52YSkgPj0gTUFYX01TR19MRU4pOworCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhID0gdHhxLT50eHEuc3RhOworCisJCUxPQ0FMX0FTU0lHTjsKKwkJVklGX0FTU0lHTjsKKwkJU1RBX0FTU0lHTjsKKwkJX19lbnRyeS0+YWMgPSB0eHEtPnR4cS5hYzsKKwkJX19lbnRyeS0+dGlkID0gdHhxLT50eHEudGlkOwogCSksCiAKLQlUUF9wcmludGsoIiVzIiwgX19nZXRfc3RyKG1zZykpCisJVFBfcHJpbnRrKAorCQlMT0NBTF9QUl9GTVQgIFZJRl9QUl9GTVQgIFNUQV9QUl9GTVQgIiBhYzolZCB0aWQ6JWQiLAorCQlMT0NBTF9QUl9BUkcsIFZJRl9QUl9BUkcsIFNUQV9QUl9BUkcsIF9fZW50cnktPmFjLCBfX2VudHJ5LT50aWQKKwkpCiApOwogCi1ERUZJTkVfRVZFTlQobWFjODAyMTFfbXNnX2V2ZW50LCBtYWM4MDIxMV9pbmZvLAotCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCi0JVFBfQVJHUyh2YWYpCi0pOwotREVGSU5FX0VWRU5UKG1hYzgwMjExX21zZ19ldmVudCwgbWFjODAyMTFfZGJnLAotCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCi0JVFBfQVJHUyh2YWYpCi0pOwotREVGSU5FX0VWRU5UKG1hYzgwMjExX21zZ19ldmVudCwgbWFjODAyMTFfZXJyLAotCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCi0JVFBfQVJHUyh2YWYpCi0pOwotI2VuZGlmCi0KICNlbmRpZiAvKiAhX19NQUM4MDIxMV9EUklWRVJfVFJBQ0UgfHwgVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQgKi8KIAogI3VuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSApkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3RyYWNlX21zZy5oIGIvbmV0L21hYzgwMjExL3RyYWNlX21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OGY3YzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbWFjODAyMTEvdHJhY2VfbXNnLmgKQEAgLTAsMCArMSw1MyBAQAorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNTQUdFX1RSQUNJTkcKKworI2lmICFkZWZpbmVkKF9fTUFDODAyMTFfTVNHX0RSSVZFUl9UUkFDRSkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX19NQUM4MDIxMV9NU0dfRFJJVkVSX1RSQUNFCisKKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gbWFjODAyMTFfbXNnCisKKyNkZWZpbmUgTUFYX01TR19MRU4JMTAwCisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MobWFjODAyMTFfbXNnX2V2ZW50LAorCVRQX1BST1RPKHN0cnVjdCB2YV9mb3JtYXQgKnZhZiksCisKKwlUUF9BUkdTKHZhZiksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2R5bmFtaWNfYXJyYXkoY2hhciwgbXNnLCBNQVhfTVNHX0xFTikKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCVdBUk5fT05fT05DRSh2c25wcmludGYoX19nZXRfZHluYW1pY19hcnJheShtc2cpLAorCQkJCSAgICAgICBNQVhfTVNHX0xFTiwgdmFmLT5mbXQsCisJCQkJICAgICAgICp2YWYtPnZhKSA+PSBNQVhfTVNHX0xFTik7CisJKSwKKworCVRQX3ByaW50aygiJXMiLCBfX2dldF9zdHIobXNnKSkKKyk7CisKK0RFRklORV9FVkVOVChtYWM4MDIxMV9tc2dfZXZlbnQsIG1hYzgwMjExX2luZm8sCisJVFBfUFJPVE8oc3RydWN0IHZhX2Zvcm1hdCAqdmFmKSwKKwlUUF9BUkdTKHZhZikKKyk7CitERUZJTkVfRVZFTlQobWFjODAyMTFfbXNnX2V2ZW50LCBtYWM4MDIxMV9kYmcsCisJVFBfUFJPVE8oc3RydWN0IHZhX2Zvcm1hdCAqdmFmKSwKKwlUUF9BUkdTKHZhZikKKyk7CitERUZJTkVfRVZFTlQobWFjODAyMTFfbXNnX2V2ZW50LCBtYWM4MDIxMV9lcnIsCisJVFBfUFJPVE8oc3RydWN0IHZhX2Zvcm1hdCAqdmFmKSwKKwlUUF9BUkdTKHZhZikKKyk7CisjZW5kaWYgLyogIV9fTUFDODAyMTFfTVNHX0RSSVZFUl9UUkFDRSB8fCBUUkFDRV9IRUFERVJfTVVMVElfUkVBRCAqLworCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9GSUxFCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSB0cmFjZV9tc2cKKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdHguYyBiL25ldC9tYWM4MDIxMS90eC5jCmluZGV4IDA3YmQ4ZGIuLjY2NzExMWUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90eC5jCisrKyBiL25ldC9tYWM4MDIxMS90eC5jCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CkBAIC01OTUsMjMgKzU5NCw4IEBACiAJZWxzZSBpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpICYmCiAJCSAoa2V5ID0gcmN1X2RlcmVmZXJlbmNlKHR4LT5zZGF0YS0+ZGVmYXVsdF91bmljYXN0X2tleSkpKQogCQl0eC0+a2V5ID0ga2V5OwotCWVsc2UgaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9JTkpFQ1RFRCkKKwllbHNlCiAJCXR4LT5rZXkgPSBOVUxMOwotCWVsc2UgaWYgKCF0eC0+c2RhdGEtPmRyb3BfdW5lbmNyeXB0ZWQpCi0JCXR4LT5rZXkgPSBOVUxMOwotCWVsc2UgaWYgKHR4LT5za2ItPnByb3RvY29sID09IHR4LT5zZGF0YS0+Y29udHJvbF9wb3J0X3Byb3RvY29sKQotCQl0eC0+a2V5ID0gTlVMTDsKLQllbHNlIGlmIChpZWVlODAyMTFfaXNfcm9idXN0X21nbXRfZnJhbWUodHgtPnNrYikgJiYKLQkJICEoaWVlZTgwMjExX2lzX2FjdGlvbihoZHItPmZyYW1lX2NvbnRyb2wpICYmCi0JCSAgIHR4LT5zdGEgJiYgdGVzdF9zdGFfZmxhZyh0eC0+c3RhLCBXTEFOX1NUQV9NRlApKSkKLQkJdHgtPmtleSA9IE5VTEw7Ci0JZWxzZSBpZiAoaWVlZTgwMjExX2lzX21nbXQoaGRyLT5mcmFtZV9jb250cm9sKSAmJgotCQkgIWllZWU4MDIxMV9pc19yb2J1c3RfbWdtdF9mcmFtZSh0eC0+c2tiKSkKLQkJdHgtPmtleSA9IE5VTEw7Ci0JZWxzZSB7Ci0JCUk4MDJfREVCVUdfSU5DKHR4LT5sb2NhbC0+dHhfaGFuZGxlcnNfZHJvcF91bmVuY3J5cHRlZCk7Ci0JCXJldHVybiBUWF9EUk9QOwotCX0KIAogCWlmICh0eC0+a2V5KSB7CiAJCWJvb2wgc2tpcF9odyA9IGZhbHNlOwpAQCAtNzgzLDEyICs3NjcsMjIgQEAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CiB9CiAKK3N0YXRpYyBfX2xlMTYgaWVlZTgwMjExX3R4X25leHRfc2VxKHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBpbnQgdGlkKQoreworCXUxNiAqc2VxID0gJnN0YS0+dGlkX3NlcVt0aWRdOworCV9fbGUxNiByZXQgPSBjcHVfdG9fbGUxNigqc2VxKTsKKworCS8qIEluY3JlYXNlIHRoZSBzZXF1ZW5jZSBudW1iZXIuICovCisJKnNlcSA9ICgqc2VxICsgMHgxMCkgJiBJRUVFODAyMTFfU0NUTF9TRVE7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaWVlZTgwMjExX3R4X3Jlc3VsdCBkZWJ1Z19ub2lubGluZQogaWVlZTgwMjExX3R4X2hfc2VxdWVuY2Uoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4LT5za2IpOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKil0eC0+c2tiLT5kYXRhOwotCXUxNiAqc2VxOwogCXU4ICpxYzsKIAlpbnQgdGlkOwogCkBAIC04MzksMTMgKzgzMywxMCBAQAogCiAJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKIAl0aWQgPSAqcWMgJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKLQlzZXEgPSAmdHgtPnN0YS0+dGlkX3NlcVt0aWRdOwogCXR4LT5zdGEtPnR4X21zZHVbdGlkXSsrOwogCi0JaGRyLT5zZXFfY3RybCA9IGNwdV90b19sZTE2KCpzZXEpOwotCi0JLyogSW5jcmVhc2UgdGhlIHNlcXVlbmNlIG51bWJlci4gKi8KLQkqc2VxID0gKCpzZXEgKyAweDEwKSAmIElFRUU4MDIxMV9TQ1RMX1NFUTsKKwlpZiAoIXR4LT5zdGEtPnN0YS50eHFbMF0pCisJCWhkci0+c2VxX2N0cmwgPSBpZWVlODAyMTFfdHhfbmV4dF9zZXEodHgtPnN0YSwgdGlkKTsKIAogCXJldHVybiBUWF9DT05USU5VRTsKIH0KQEAgLTEwODYsNyArMTA3Nyw3IEBACiAJCSAqIG5vdGhpbmcgLS0gdGhpcyBhZ2dyZWdhdGlvbiBzZXNzaW9uIGlzIGJlaW5nIHN0YXJ0ZWQKIAkJICogYnV0IHRoYXQgbWlnaHQgc3RpbGwgZmFpbCB3aXRoIHRoZSBkcml2ZXIKIAkJICovCi0JfSBlbHNlIHsKKwl9IGVsc2UgaWYgKCF0eC0+c3RhLT5zdGEudHhxW3RpZF0pIHsKIAkJc3Bpbl9sb2NrKCZ0eC0+c3RhLT5sb2NrKTsKIAkJLyoKIAkJICogTmVlZCB0byByZS1jaGVjayBub3csIGJlY2F1c2Ugd2UgbWF5IGdldCBoZXJlCkBAIC0xMTM3LDExICsxMTI4LDEzIEBACiAKIC8qCiAgKiBpbml0aWFsaXNlcyBAdHgKKyAqIHBhc3MgJU5VTEwgZm9yIHRoZSBzdGF0aW9uIGlmIHVua25vd24sIGEgdmFsaWQgcG9pbnRlciBpZiBrbm93bgorICogb3IgYW4gRVJSX1BUUigpIGlmIHRoZSBzdGF0aW9uIGlzIGtub3duIG5vdCB0byBleGlzdAogICovCiBzdGF0aWMgaWVlZTgwMjExX3R4X3Jlc3VsdAogaWVlZTgwMjExX3R4X3ByZXBhcmUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCSAgICAgc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCwKLQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CkBAIC0xMTY0LDE3ICsxMTU3LDIyIEBACiAKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwogCi0JaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKSB7Ci0JCXR4LT5zdGEgPSByY3VfZGVyZWZlcmVuY2Uoc2RhdGEtPnUudmxhbi5zdGEpOwotCQlpZiAoIXR4LT5zdGEgJiYgc2RhdGEtPmRldi0+aWVlZTgwMjExX3B0ci0+dXNlXzRhZGRyKQotCQkJcmV0dXJuIFRYX0RST1A7Ci0JfSBlbHNlIGlmIChpbmZvLT5mbGFncyAmIChJRUVFODAyMTFfVFhfQ1RMX0lOSkVDVEVEIHwKLQkJCQkgIElFRUU4MDIxMV9UWF9JTlRGTF9OTDgwMjExX0ZSQU1FX1RYKSB8fAotCQkgICB0eC0+c2RhdGEtPmNvbnRyb2xfcG9ydF9wcm90b2NvbCA9PSB0eC0+c2tiLT5wcm90b2NvbCkgewotCQl0eC0+c3RhID0gc3RhX2luZm9fZ2V0X2JzcyhzZGF0YSwgaGRyLT5hZGRyMSk7CisJaWYgKGxpa2VseShzdGEpKSB7CisJCWlmICghSVNfRVJSKHN0YSkpCisJCQl0eC0+c3RhID0gc3RhOworCX0gZWxzZSB7CisJCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikgeworCQkJdHgtPnN0YSA9IHJjdV9kZXJlZmVyZW5jZShzZGF0YS0+dS52bGFuLnN0YSk7CisJCQlpZiAoIXR4LT5zdGEgJiYgc2RhdGEtPndkZXYudXNlXzRhZGRyKQorCQkJCXJldHVybiBUWF9EUk9QOworCQl9IGVsc2UgaWYgKGluZm8tPmZsYWdzICYgKElFRUU4MDIxMV9UWF9JTlRGTF9OTDgwMjExX0ZSQU1FX1RYIHwKKwkJCQkJICBJRUVFODAyMTFfVFhfQ1RMX0lOSkVDVEVEKSB8fAorCQkJICAgdHgtPnNkYXRhLT5jb250cm9sX3BvcnRfcHJvdG9jb2wgPT0gdHgtPnNrYi0+cHJvdG9jb2wpIHsKKwkJCXR4LT5zdGEgPSBzdGFfaW5mb19nZXRfYnNzKHNkYXRhLCBoZHItPmFkZHIxKTsKKwkJfQorCQlpZiAoIXR4LT5zdGEgJiYgIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpKQorCQkJdHgtPnN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgaGRyLT5hZGRyMSk7CiAJfQotCWlmICghdHgtPnN0YSkKLQkJdHgtPnN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgaGRyLT5hZGRyMSk7CiAKIAlpZiAodHgtPnN0YSAmJiBpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSAmJgogCSAgICAhaWVlZTgwMjExX2lzX3Fvc19udWxsZnVuYyhoZHItPmZyYW1lX2NvbnRyb2wpICYmCkBAIC0xMjIwLDEzICsxMjE4LDEwMiBAQAogCXJldHVybiBUWF9DT05USU5VRTsKIH0KIAorc3RhdGljIHZvaWQgaWVlZTgwMjExX2Rydl90eChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnB1YnN0YSwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHZpZl90b19zZGF0YSh2aWYpOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2NvbnRyb2wgY29udHJvbCA9IHsKKwkJLnN0YSA9IHB1YnN0YSwKKwl9OworCXN0cnVjdCBpZWVlODAyMTFfdHhxICp0eHEgPSBOVUxMOworCXN0cnVjdCB0eHFfaW5mbyAqdHhxaTsKKwl1OCBhYzsKKworCWlmIChpbmZvLT5jb250cm9sLmZsYWdzICYgSUVFRTgwMjExX1RYX0NUUkxfUFNfUkVTUE9OU0UpCisJCWdvdG8gdHhfbm9ybWFsOworCisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKQorCQlnb3RvIHR4X25vcm1hbDsKKworCWlmIChwdWJzdGEpIHsKKwkJdTggdGlkID0gc2tiLT5wcmlvcml0eSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOworCisJCXR4cSA9IHB1YnN0YS0+dHhxW3RpZF07CisJfSBlbHNlIGlmICh2aWYpIHsKKwkJdHhxID0gdmlmLT50eHE7CisJfQorCisJaWYgKCF0eHEpCisJCWdvdG8gdHhfbm9ybWFsOworCisJYWMgPSB0eHEtPmFjOworCXR4cWkgPSB0b190eHFfaW5mbyh0eHEpOworCWF0b21pY19pbmMoJnNkYXRhLT50eHFzX2xlblthY10pOworCWlmIChhdG9taWNfcmVhZCgmc2RhdGEtPnR4cXNfbGVuW2FjXSkgPj0gbG9jYWwtPmh3LnR4cV9hY19tYXhfcGVuZGluZykKKwkJbmV0aWZfc3RvcF9zdWJxdWV1ZShzZGF0YS0+ZGV2LCBhYyk7CisKKwlza2JfcXVldWVfdGFpbCgmdHhxaS0+cXVldWUsIHNrYik7CisJZHJ2X3dha2VfdHhfcXVldWUobG9jYWwsIHR4cWkpOworCisJcmV0dXJuOworCit0eF9ub3JtYWw6CisJZHJ2X3R4KGxvY2FsLCAmY29udHJvbCwgc2tiKTsKK30KKworc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV90eF9kZXF1ZXVlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHZpZl90b19zZGF0YSh0eHEtPnZpZik7CisJc3RydWN0IHR4cV9pbmZvICp0eHFpID0gY29udGFpbmVyX29mKHR4cSwgc3RydWN0IHR4cV9pbmZvLCB0eHEpOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CisJdTggYWMgPSB0eHEtPmFjOworCisJc3Bpbl9sb2NrX2JoKCZ0eHFpLT5xdWV1ZS5sb2NrKTsKKworCWlmICh0ZXN0X2JpdChJRUVFODAyMTFfVFhRX1NUT1AsICZ0eHFpLT5mbGFncykpCisJCWdvdG8gb3V0OworCisJc2tiID0gX19za2JfZGVxdWV1ZSgmdHhxaS0+cXVldWUpOworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKworCWF0b21pY19kZWMoJnNkYXRhLT50eHFzX2xlblthY10pOworCWlmIChfX25ldGlmX3N1YnF1ZXVlX3N0b3BwZWQoc2RhdGEtPmRldiwgYWMpKQorCQlpZWVlODAyMTFfcHJvcGFnYXRlX3F1ZXVlX3dha2UobG9jYWwsIHNkYXRhLT52aWYuaHdfcXVldWVbYWNdKTsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwlpZiAodHhxLT5zdGEgJiYgaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBjb250YWluZXJfb2YodHhxLT5zdGEsIHN0cnVjdCBzdGFfaW5mbywKKwkJCQkJCSAgICBzdGEpOworCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisKKwkJaGRyLT5zZXFfY3RybCA9IGllZWU4MDIxMV90eF9uZXh0X3NlcShzdGEsIHR4cS0+dGlkKTsKKwkJaWYgKHRlc3RfYml0KElFRUU4MDIxMV9UWFFfQU1QRFUsICZ0eHFpLT5mbGFncykpCisJCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX0FNUERVOworCQllbHNlCisJCQlpbmZvLT5mbGFncyAmPSB+SUVFRTgwMjExX1RYX0NUTF9BTVBEVTsKKwl9CisKK291dDoKKwlzcGluX3VubG9ja19iaCgmdHhxaS0+cXVldWUubG9jayk7CisKKwlyZXR1cm4gc2tiOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfdHhfZGVxdWV1ZSk7CisKIHN0YXRpYyBib29sIGllZWU4MDIxMV90eF9mcmFncyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCiAJCQkgICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqc2ticywKIAkJCSAgICAgICBib29sIHR4cGVuZGluZykKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2NvbnRyb2wgY29udHJvbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKQEAgLTEyODQsMTAgKzEzNzEsOSBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+cXVldWVfc3RvcF9yZWFzb25fbG9jaywgZmxhZ3MpOwogCiAJCWluZm8tPmNvbnRyb2wudmlmID0gdmlmOwotCQljb250cm9sLnN0YSA9IHN0YTsKIAogCQlfX3NrYl91bmxpbmsoc2tiLCBza2JzKTsKLQkJZHJ2X3R4KGxvY2FsLCAmY29udHJvbCwgc2tiKTsKKwkJaWVlZTgwMjExX2Rydl90eChsb2NhbCwgdmlmLCBzdGEsIHNrYik7CiAJfQogCiAJcmV0dXJuIHRydWU7CkBAIC0xNDIyLDggKzE1MDgsOSBAQAogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gdmlmX3RvX3NkYXRhKHZpZik7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSB0eDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMjsKIAotCWlmIChpZWVlODAyMTFfdHhfcHJlcGFyZShzZGF0YSwgJnR4LCBza2IpID09IFRYX0RST1ApCisJaWYgKGllZWU4MDIxMV90eF9wcmVwYXJlKHNkYXRhLCAmdHgsIE5VTEwsIHNrYikgPT0gVFhfRFJPUCkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaW5mby0+YmFuZCA9IGJhbmQ7CkBAIC0xNDQwLDYgKzE1MjcsMTQgQEAKIAkJCSpzdGEgPSBOVUxMOwogCX0KIAorCS8qIHRoaXMgZnVuY3Rpb24gaXNuJ3Qgc3VpdGFibGUgZm9yIGZyYWdtZW50ZWQgZGF0YSBmcmFtZXMgKi8KKwlza2IyID0gX19za2JfZGVxdWV1ZSgmdHguc2ticyk7CisJaWYgKFdBUk5fT04oc2tiMiAhPSBza2IgfHwgIXNrYl9xdWV1ZV9lbXB0eSgmdHguc2ticykpKSB7CisJCWllZWU4MDIxMV9mcmVlX3R4c2tiKGh3LCBza2IyKTsKKwkJaWVlZTgwMjExX3B1cmdlX3R4X3F1ZXVlKGh3LCAmdHguc2ticyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKIAlyZXR1cm4gdHJ1ZTsKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3R4X3ByZXBhcmVfc2tiKTsKQEAgLTE0NDgsNyArMTU0Myw4IEBACiAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBmcmFtZSBjb3VsZG4ndCBiZSB0cmFuc21pdHRlZCBidXQgd2FzIHF1ZXVlZCBpbnN0ZWFkLgogICovCiBzdGF0aWMgYm9vbCBpZWVlODAyMTFfdHgoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCB0eHBlbmRpbmcpCisJCQkgc3RydWN0IHN0YV9pbmZvICpzdGEsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgYm9vbCB0eHBlbmRpbmcpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV90eF9kYXRhIHR4OwpAQCAtMTQ2NCw3ICsxNTYwLDcgQEAKIAogCS8qIGluaXRpYWxpc2VzIHR4ICovCiAJbGVkX2xlbiA9IHNrYi0+bGVuOwotCXJlc19wcmVwYXJlID0gaWVlZTgwMjExX3R4X3ByZXBhcmUoc2RhdGEsICZ0eCwgc2tiKTsKKwlyZXNfcHJlcGFyZSA9IGllZWU4MDIxMV90eF9wcmVwYXJlKHNkYXRhLCAmdHgsIHN0YSwgc2tiKTsKIAogCWlmICh1bmxpa2VseShyZXNfcHJlcGFyZSA9PSBUWF9EUk9QKSkgewogCQlpZWVlODAyMTFfZnJlZV90eHNrYigmbG9jYWwtPmh3LCBza2IpOwpAQCAtMTUyMCw3ICsxNjE2LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpZWVlODAyMTFfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3ZvaWQgaWVlZTgwMjExX3htaXQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSAgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CkBAIC0xNTU1LDcgKzE2NTIsNyBAQAogCX0KIAogCWllZWU4MDIxMV9zZXRfcW9zX2hkcihzZGF0YSwgc2tiKTsKLQlpZWVlODAyMTFfdHgoc2RhdGEsIHNrYiwgZmFsc2UpOworCWllZWU4MDIxMV90eChzZGF0YSwgc3RhLCBza2IsIGZhbHNlKTsKIH0KIAogc3RhdGljIGJvb2wgaWVlZTgwMjExX3BhcnNlX3R4X3JhZGlvdGFwKHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xNzc2LDcgKzE4NzMsNyBAQAogCQlnb3RvIGZhaWxfcmN1OwogCiAJaW5mby0+YmFuZCA9IGNoYW5kZWYtPmNoYW4tPmJhbmQ7Ci0JaWVlZTgwMjExX3htaXQoc2RhdGEsIHNrYik7CisJaWVlZTgwMjExX3htaXQoc2RhdGEsIE5VTEwsIHNrYik7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwpAQCAtMTc4OCwyMSArMTg4NSw4OSBAQAogCXJldHVybiBORVRERVZfVFhfT0s7IC8qIG1lYW5pbmcsIHdlIGRlYWx0IHdpdGggdGhlIHNrYiAqLwogfQogCi0vKgotICogTWVhc3VyZSBUeCBmcmFtZSBhcnJpdmFsIHRpbWUgZm9yIFR4IGxhdGVuY3kgc3RhdGlzdGljcyBjYWxjdWxhdGlvbgotICogQSBzaW5nbGUgVHggZnJhbWUgbGF0ZW5jeSBzaG91bGQgYmUgbWVhc3VyZWQgZnJvbSB3aGVuIGl0IGlzIGVudGVyaW5nIHRoZQotICogS2VybmVsIHVudGlsIHdlIHJlY2VpdmUgVHggY29tcGxldGUgY29uZmlybWF0aW9uIGluZGljYXRpb24gYW5kIHRoZSBza2IgaXMKLSAqIGZyZWVkLgotICovCi1zdGF0aWMgdm9pZCBpZWVlODAyMTFfdHhfbGF0ZW5jeV9zdGFydF9tc3JtbnQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIGJvb2wgaWVlZTgwMjExX2lzX3RkbHNfc2V0dXAoc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2xhdGVuY3lfYmluX3JhbmdlcyAqdHhfbGF0ZW5jeTsKKwl1MTYgZXRoZXJ0eXBlID0gKHNrYi0+ZGF0YVsxMl0gPDwgOCkgfCBza2ItPmRhdGFbMTNdOwogCi0JdHhfbGF0ZW5jeSA9IHJjdV9kZXJlZmVyZW5jZShsb2NhbC0+dHhfbGF0ZW5jeSk7Ci0JaWYgKCF0eF9sYXRlbmN5KQotCQlyZXR1cm47Ci0Jc2tiLT50c3RhbXAgPSBrdGltZV9nZXQoKTsKKwlyZXR1cm4gZXRoZXJ0eXBlID09IEVUSF9QX1RETFMgJiYKKwkgICAgICAgc2tiLT5sZW4gPiAxNCAmJgorCSAgICAgICBza2ItPmRhdGFbMTRdID09IFdMQU5fVERMU19TTkFQX1JGVFlQRTsKK30KKworc3RhdGljIGludCBpZWVlODAyMTFfbG9va3VwX3JhX3N0YShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIHN0cnVjdCBzdGFfaW5mbyAqKnN0YV9vdXQpCit7CisJc3RydWN0IHN0YV9pbmZvICpzdGE7CisKKwlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKKwkJc3RhID0gcmN1X2RlcmVmZXJlbmNlKHNkYXRhLT51LnZsYW4uc3RhKTsKKwkJaWYgKHN0YSkgeworCQkJKnN0YV9vdXQgPSBzdGE7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIGlmIChzZGF0YS0+d2Rldi51c2VfNGFkZHIpIHsKKwkJCXJldHVybiAtRU5PTElOSzsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfT0NCOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihza2ItPmRhdGEpKSB7CisJCQkqc3RhX291dCA9IEVSUl9QVFIoLUVOT0VOVCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlzdGEgPSBzdGFfaW5mb19nZXRfYnNzKHNkYXRhLCBza2ItPmRhdGEpOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1dEUzoKKwkJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBzZGF0YS0+dS53ZHMucmVtb3RlX2FkZHIpOworCQlicmVhazsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKKwkJLyogZGV0ZXJtaW5lZCBtdWNoIGxhdGVyICovCisJCSpzdGFfb3V0ID0gTlVMTDsKKwkJcmV0dXJuIDA7CisjZW5kaWYKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCWlmIChzZGF0YS0+d2Rldi53aXBoeS0+ZmxhZ3MgJiBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMpIHsKKwkJCXN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgc2tiLT5kYXRhKTsKKwkJCWlmIChzdGEpIHsKKwkJCQlib29sIHRkbHNfcGVlciwgdGRsc19hdXRoOworCisJCQkJdGRsc19wZWVyID0gdGVzdF9zdGFfZmxhZyhzdGEsCisJCQkJCQkJICBXTEFOX1NUQV9URExTX1BFRVIpOworCQkJCXRkbHNfYXV0aCA9IHRlc3Rfc3RhX2ZsYWcoc3RhLAorCQkJCQkJV0xBTl9TVEFfVERMU19QRUVSX0FVVEgpOworCisJCQkJaWYgKHRkbHNfcGVlciAmJiB0ZGxzX2F1dGgpIHsKKwkJCQkJKnN0YV9vdXQgPSBzdGE7CisJCQkJCXJldHVybiAwOworCQkJCX0KKworCQkJCS8qCisJCQkJICogVERMUyBsaW5rIGR1cmluZyBzZXR1cCAtIHRocm93IG91dCBmcmFtZXMgdG8KKwkJCQkgKiBwZWVyLiBBbGxvdyBURExTLXNldHVwIGZyYW1lcyB0byB1bmF1dGhvcml6ZWQKKwkJCQkgKiBwZWVycyBmb3IgdGhlIHNwZWNpYWwgY2FzZSBvZiBhIGxpbmsgdGVhcmRvd24KKwkJCQkgKiBhZnRlciBhIFRETFMgc3RhIGlzIHJlbW92ZWQgZHVlIHRvIGJlaW5nCisJCQkJICogdW5yZWFjaGFibGUuCisJCQkJICovCisJCQkJaWYgKHRkbHNfcGVlciAmJiAhdGRsc19hdXRoICYmCisJCQkJICAgICFpZWVlODAyMTFfaXNfdGRsc19zZXR1cChza2IpKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQl9CisKKwkJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBzZGF0YS0+dS5tZ2QuYnNzaWQpOworCQlpZiAoIXN0YSkKKwkJCXJldHVybiAtRU5PTElOSzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKnN0YV9vdXQgPSBzdGEgPzogRVJSX1BUUigtRU5PRU5UKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xODI0LDcgKzE5ODksOCBAQAogICogUmV0dXJuczogdGhlIChwb3NzaWJseSByZWFsbG9jYXRlZCkgc2tiIG9yIGFuIEVSUl9QVFIoKSBjb2RlCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX2J1aWxkX2hkcihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGluZm9fZmxhZ3MpCisJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBpbmZvX2ZsYWdzLAorCQkJCQkgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CkBAIC0xODM3LDkgKzIwMDMsOCBAQAogCWNvbnN0IHU4ICplbmNhcHNfZGF0YTsKIAlpbnQgZW5jYXBzX2xlbiwgc2tpcF9oZWFkZXJfYnl0ZXM7CiAJaW50IG5oX3BvcywgaF9wb3M7Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGEgPSBOVUxMOwotCWJvb2wgd21lX3N0YSA9IGZhbHNlLCBhdXRob3JpemVkID0gZmFsc2UsIHRkbHNfYXV0aCA9IGZhbHNlOwotCWJvb2wgdGRsc19wZWVyID0gZmFsc2UsIHRkbHNfc2V0dXBfZnJhbWUgPSBmYWxzZTsKKwlib29sIHdtZV9zdGEgPSBmYWxzZSwgYXV0aG9yaXplZCA9IGZhbHNlOworCWJvb2wgdGRsc19wZWVyOwogCWJvb2wgbXVsdGljYXN0OwogCXUxNiBpbmZvX2lkID0gMDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5jdHhfY29uZiAqY2hhbmN0eF9jb25mOwpAQCAtMTg0Nyw2ICsyMDEyLDkgQEAKIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CiAJaW50IHJldDsKIAorCWlmIChJU19FUlIoc3RhKSkKKwkJc3RhID0gTlVMTDsKKwogCS8qIGNvbnZlcnQgRXRoZXJuZXQgaGVhZGVyIHRvIHByb3BlciA4MDIuMTEgaGVhZGVyIChiYXNlZCBvbgogCSAqIG9wZXJhdGlvbiBtb2RlKSAqLwogCWV0aGVydHlwZSA9IChza2ItPmRhdGFbMTJdIDw8IDgpIHwgc2tiLT5kYXRhWzEzXTsKQEAgLTE4NTQsOCArMjAyMiw3IEBACiAKIAlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKLQkJc3RhID0gcmN1X2RlcmVmZXJlbmNlKHNkYXRhLT51LnZsYW4uc3RhKTsKLQkJaWYgKHN0YSkgeworCQlpZiAoc2RhdGEtPndkZXYudXNlXzRhZGRyKSB7CiAJCQlmYyB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9GUk9NRFMgfCBJRUVFODAyMTFfRkNUTF9UT0RTKTsKIAkJCS8qIFJBIFRBIERBIFNBICovCiAJCQltZW1jcHkoaGRyLmFkZHIxLCBzdGEtPnN0YS5hZGRyLCBFVEhfQUxFTik7CkBAIC0xODc0LDcgKzIwNDEsNyBAQAogCQkJZ290byBmcmVlOwogCQl9CiAJCWJhbmQgPSBjaGFuY3R4X2NvbmYtPmRlZi5jaGFuLT5iYW5kOwotCQlpZiAoc3RhKQorCQlpZiAoc2RhdGEtPndkZXYudXNlXzRhZGRyKQogCQkJYnJlYWs7CiAJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CkBAIC0xOTc4LDM4ICsyMTQ1LDEwIEBACiAJCWJyZWFrOwogI2VuZGlmCiAJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlpZiAoc2RhdGEtPndkZXYud2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU19URExTKSB7Ci0JCQlzdGEgPSBzdGFfaW5mb19nZXQoc2RhdGEsIHNrYi0+ZGF0YSk7Ci0JCQlpZiAoc3RhKSB7Ci0JCQkJYXV0aG9yaXplZCA9IHRlc3Rfc3RhX2ZsYWcoc3RhLAotCQkJCQkJCVdMQU5fU1RBX0FVVEhPUklaRUQpOwotCQkJCXdtZV9zdGEgPSBzdGEtPnN0YS53bWU7Ci0JCQkJdGRsc19wZWVyID0gdGVzdF9zdGFfZmxhZyhzdGEsCi0JCQkJCQkJICBXTEFOX1NUQV9URExTX1BFRVIpOwotCQkJCXRkbHNfYXV0aCA9IHRlc3Rfc3RhX2ZsYWcoc3RhLAotCQkJCQkJV0xBTl9TVEFfVERMU19QRUVSX0FVVEgpOwotCQkJfQorCQkvKiB3ZSBhbHJlYWR5IGRpZCBjaGVja3Mgd2hlbiBsb29raW5nIHVwIHRoZSBSQSBTVEEgKi8KKwkJdGRsc19wZWVyID0gdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUik7CiAKLQkJCWlmICh0ZGxzX3BlZXIpCi0JCQkJdGRsc19zZXR1cF9mcmFtZSA9Ci0JCQkJCWV0aGVydHlwZSA9PSBFVEhfUF9URExTICYmCi0JCQkJCXNrYi0+bGVuID4gMTQgJiYKLQkJCQkJc2tiLT5kYXRhWzE0XSA9PSBXTEFOX1RETFNfU05BUF9SRlRZUEU7Ci0JCX0KLQotCQkvKgotCQkgKiBURExTIGxpbmsgZHVyaW5nIHNldHVwIC0gdGhyb3cgb3V0IGZyYW1lcyB0byBwZWVyLiBXZSBhbGxvdwotCQkgKiBURExTLXNldHVwIGZyYW1lcyB0byB1bmF1dGhvcml6ZWQgcGVlcnMgZm9yIHRoZSBzcGVjaWFsIGNhc2UKLQkJICogb2YgYSBsaW5rIHRlYXJkb3duIGFmdGVyIGEgVERMUyBzdGEgaXMgcmVtb3ZlZCBkdWUgdG8gYmVpbmcKLQkJICogdW5yZWFjaGFibGUuCi0JCSAqLwotCQlpZiAodGRsc19wZWVyICYmICF0ZGxzX2F1dGggJiYgIXRkbHNfc2V0dXBfZnJhbWUpIHsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIGZyZWU7Ci0JCX0KLQotCQkvKiBzZW5kIGRpcmVjdCBwYWNrZXRzIHRvIGF1dGhvcml6ZWQgVERMUyBwZWVycyAqLwotCQlpZiAodGRsc19wZWVyICYmIHRkbHNfYXV0aCkgeworCQlpZiAodGRsc19wZWVyKSB7CiAJCQkvKiBEQSBTQSBCU1NJRCAqLwogCQkJbWVtY3B5KGhkci5hZGRyMSwgc2tiLT5kYXRhLCBFVEhfQUxFTik7CiAJCQltZW1jcHkoaGRyLmFkZHIyLCBza2ItPmRhdGEgKyBFVEhfQUxFTiwgRVRIX0FMRU4pOwpAQCAtMjA3MSwyNiArMjIxMCwxOSBAQAogCQlnb3RvIGZyZWU7CiAJfQogCi0JLyoKLQkgKiBUaGVyZSdzIG5vIG5lZWQgdG8gdHJ5IHRvIGxvb2sgdXAgdGhlIGRlc3RpbmF0aW9uCi0JICogaWYgaXQgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcyAod2hpY2ggY2FuIG9ubHkgaGFwcGVuCi0JICogaW4gQVAgbW9kZSkKLQkgKi8KIAltdWx0aWNhc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHIuYWRkcjEpOwotCWlmICghbXVsdGljYXN0KSB7Ci0JCXN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgaGRyLmFkZHIxKTsKLQkJaWYgKHN0YSkgewotCQkJYXV0aG9yaXplZCA9IHRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BVVRIT1JJWkVEKTsKLQkJCXdtZV9zdGEgPSBzdGEtPnN0YS53bWU7Ci0JCX0KKworCS8qIHN0YSBpcyBhbHdheXMgTlVMTCBmb3IgbWVzaCAqLworCWlmIChzdGEpIHsKKwkJYXV0aG9yaXplZCA9IHRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BVVRIT1JJWkVEKTsKKwkJd21lX3N0YSA9IHN0YS0+c3RhLndtZTsKKwl9IGVsc2UgaWYgKGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikpIHsKKwkJLyogRm9yIG1lc2gsIHRoZSB1c2Ugb2YgdGhlIFFvUyBoZWFkZXIgaXMgbWFuZGF0b3J5ICovCisJCXdtZV9zdGEgPSB0cnVlOwogCX0KIAotCS8qIEZvciBtZXNoLCB0aGUgdXNlIG9mIHRoZSBRb1MgaGVhZGVyIGlzIG1hbmRhdG9yeSAqLwotCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKQotCQl3bWVfc3RhID0gdHJ1ZTsKLQotCS8qIHJlY2VpdmVyIGFuZCB3ZSBhcmUgUW9TIGVuYWJsZWQsIHVzZSBhIFFvUyB0eXBlIGZyYW1lICovCi0JaWYgKHdtZV9zdGEgJiYgbG9jYWwtPmh3LnF1ZXVlcyA+PSBJRUVFODAyMTFfTlVNX0FDUykgeworCS8qIHJlY2VpdmVyIGRvZXMgUW9TICh3aGljaCBhbHNvIG1lYW5zIHdlIGRvKSB1c2UgaXQgKi8KKwlpZiAod21lX3N0YSkgewogCQlmYyB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEpOwogCQloZHJsZW4gKz0gMjsKIAl9CkBAIC0yMjYwLDcgKzIzOTIsNyBAQAogCQkJCSAgdTMyIGluZm9fZmxhZ3MpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCiAJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgRVRIX0hMRU4pKSB7CiAJCWtmcmVlX3NrYihza2IpOwpAQCAtMjI2OSwxMCArMjQwMSwxMiBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCi0JLyogTWVhc3VyZSBmcmFtZSBhcnJpdmFsIGZvciBUeCBsYXRlbmN5IHN0YXRpc3RpY3MgY2FsY3VsYXRpb24gKi8KLQlpZWVlODAyMTFfdHhfbGF0ZW5jeV9zdGFydF9tc3JtbnQobG9jYWwsIHNrYik7CisJaWYgKGllZWU4MDIxMV9sb29rdXBfcmFfc3RhKHNkYXRhLCBza2IsICZzdGEpKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIG91dDsKKwl9CiAKLQlza2IgPSBpZWVlODAyMTFfYnVpbGRfaGRyKHNkYXRhLCBza2IsIGluZm9fZmxhZ3MpOworCXNrYiA9IGllZWU4MDIxMV9idWlsZF9oZHIoc2RhdGEsIHNrYiwgaW5mb19mbGFncywgc3RhKTsKIAlpZiAoSVNfRVJSKHNrYikpCiAJCWdvdG8gb3V0OwogCkBAIC0yMjgwLDcgKzI0MTQsNyBAQAogCWRldi0+c3RhdHMudHhfYnl0ZXMgKz0gc2tiLT5sZW47CiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CiAKLQlpZWVlODAyMTFfeG1pdChzZGF0YSwgc2tiKTsKKwlpZWVlODAyMTFfeG1pdChzZGF0YSwgc3RhLCBza2IpOwogIG91dDoKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KQEAgLTIzMDgsMTAgKzI0NDIsMTcgQEAKIAkJLmxvY2FsID0gc2RhdGEtPmxvY2FsLAogCQkuc2RhdGEgPSBzZGF0YSwKIAl9OworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCi0Jc2tiID0gaWVlZTgwMjExX2J1aWxkX2hkcihzZGF0YSwgc2tiLCBpbmZvX2ZsYWdzKTsKKwlpZiAoaWVlZTgwMjExX2xvb2t1cF9yYV9zdGEoc2RhdGEsIHNrYiwgJnN0YSkpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXNrYiA9IEVSUl9QVFIoLUVJTlZBTCk7CisJCWdvdG8gb3V0OworCX0KKworCXNrYiA9IGllZWU4MDIxMV9idWlsZF9oZHIoc2RhdGEsIHNrYiwgaW5mb19mbGFncywgc3RhKTsKIAlpZiAoSVNfRVJSKHNrYikpCiAJCWdvdG8gb3V0OwogCkBAIC0yMzY5LDcgKzI1MTAsNyBAQAogCQkJcmV0dXJuIHRydWU7CiAJCX0KIAkJaW5mby0+YmFuZCA9IGNoYW5jdHhfY29uZi0+ZGVmLmNoYW4tPmJhbmQ7Ci0JCXJlc3VsdCA9IGllZWU4MDIxMV90eChzZGF0YSwgc2tiLCB0cnVlKTsKKwkJcmVzdWx0ID0gaWVlZTgwMjExX3R4KHNkYXRhLCBOVUxMLCBza2IsIHRydWUpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBza19idWZmX2hlYWQgc2ticzsKIApAQCAtMzEwNyw3ICszMjQ4LDcgQEAKIAogCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQogCQkJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihza2ItPmRldik7Ci0JCWlmICghaWVlZTgwMjExX3R4X3ByZXBhcmUoc2RhdGEsICZ0eCwgc2tiKSkKKwkJaWYgKCFpZWVlODAyMTFfdHhfcHJlcGFyZShzZGF0YSwgJnR4LCBOVUxMLCBza2IpKQogCQkJYnJlYWs7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJfQpAQCAtMzIzOSw2ICszMzgwLDYgQEAKIAkgKi8KIAlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJSUVFRTgwMjExX1NLQl9DQihza2IpLT5iYW5kID0gYmFuZDsKLQlpZWVlODAyMTFfeG1pdChzZGF0YSwgc2tiKTsKKwlpZWVlODAyMTFfeG1pdChzZGF0YSwgTlVMTCwgc2tiKTsKIAlsb2NhbF9iaF9lbmFibGUoKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS91dGlsLmMgYi9uZXQvbWFjODAyMTEvdXRpbC5jCmluZGV4IDg0MjhmNGEuLjc5NDEyZjEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS91dGlsLmMKKysrIGIvbmV0L21hYzgwMjExL3V0aWwuYwpAQCAtMzA4LDYgKzMwOCwxMSBAQAogCQlmb3IgKGFjID0gMDsgYWMgPCBuX2FjczsgYWMrKykgewogCQkJaW50IGFjX3F1ZXVlID0gc2RhdGEtPnZpZi5od19xdWV1ZVthY107CiAKKwkJCWlmIChsb2NhbC0+b3BzLT53YWtlX3R4X3F1ZXVlICYmCisJCQkgICAgKGF0b21pY19yZWFkKCZzZGF0YS0+dHhxc19sZW5bYWNdKSA+CisJCQkgICAgIGxvY2FsLT5ody50eHFfYWNfbWF4X3BlbmRpbmcpKQorCQkJCWNvbnRpbnVlOworCiAJCQlpZiAoYWNfcXVldWUgPT0gcXVldWUgfHwKIAkJCSAgICAoc2RhdGEtPnZpZi5jYWJfcXVldWUgPT0gcXVldWUgJiYKIAkJCSAgICAgbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uc1thY19xdWV1ZV0gPT0gMCAmJgpAQCAtNjI1LDEzICs2MzAsMTQgQEAKIAkJCQkJcmVhc29uLCB0cnVlKTsKIH0KIAotc3RhdGljIHZvaWQgX19pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQl1MzIgaXRlcl9mbGFncywKLQkJCQkJdm9pZCAoKml0ZXJhdG9yKSh2b2lkICpkYXRhLCB1OCAqbWFjLAotCQkJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiksCi0JCQkJCXZvaWQgKmRhdGEpCitzdGF0aWMgdm9pZCBfX2l0ZXJhdGVfaW50ZXJmYWNlcyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkgdTMyIGl0ZXJfZmxhZ3MsCisJCQkJIHZvaWQgKCppdGVyYXRvcikodm9pZCAqZGF0YSwgdTggKm1hYywKKwkJCQkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiksCisJCQkJIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CisJYm9vbCBhY3RpdmVfb25seSA9IGl0ZXJfZmxhZ3MgJiBJRUVFODAyMTFfSUZBQ0VfSVRFUl9BQ1RJVkU7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7CiAJCXN3aXRjaCAoc2RhdGEtPnZpZi50eXBlKSB7CkBAIC02NDUsOSArNjUxLDkgQEAKIAkJCWJyZWFrOwogCQl9CiAJCWlmICghKGl0ZXJfZmxhZ3MgJiBJRUVFODAyMTFfSUZBQ0VfSVRFUl9SRVNVTUVfQUxMKSAmJgotCQkgICAgIShzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfSU5fRFJJVkVSKSkKKwkJICAgIGFjdGl2ZV9vbmx5ICYmICEoc2RhdGEtPmZsYWdzICYgSUVFRTgwMjExX1NEQVRBX0lOX0RSSVZFUikpCiAJCQljb250aW51ZTsKLQkJaWYgKGllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkKKwkJaWYgKGllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSB8fCAhYWN0aXZlX29ubHkpCiAJCQlpdGVyYXRvcihkYXRhLCBzZGF0YS0+dmlmLmFkZHIsCiAJCQkJICZzZGF0YS0+dmlmKTsKIAl9CkBAIC02NTYsMTIgKzY2MiwxMiBAQAogCQkJCSAgICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPmlmbGlzdF9tdHgpIHx8CiAJCQkJICAgICAgbG9ja2RlcF9ydG5sX2lzX2hlbGQoKSk7CiAJaWYgKHNkYXRhICYmCi0JICAgIChpdGVyX2ZsYWdzICYgSUVFRTgwMjExX0lGQUNFX0lURVJfUkVTVU1FX0FMTCB8fAorCSAgICAoaXRlcl9mbGFncyAmIElFRUU4MDIxMV9JRkFDRV9JVEVSX1JFU1VNRV9BTEwgfHwgIWFjdGl2ZV9vbmx5IHx8CiAJICAgICBzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfSU5fRFJJVkVSKSkKIAkJaXRlcmF0b3IoZGF0YSwgc2RhdGEtPnZpZi5hZGRyLCAmc2RhdGEtPnZpZik7CiB9CiAKLXZvaWQgaWVlZTgwMjExX2l0ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXMoCit2b2lkIGllZWU4MDIxMV9pdGVyYXRlX2ludGVyZmFjZXMoCiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBpdGVyX2ZsYWdzLAogCXZvaWQgKCppdGVyYXRvcikodm9pZCAqZGF0YSwgdTggKm1hYywKIAkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKSwKQEAgLTY3MCwxMCArNjc2LDEwIEBACiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CiAKIAltdXRleF9sb2NrKCZsb2NhbC0+aWZsaXN0X210eCk7Ci0JX19pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzKGxvY2FsLCBpdGVyX2ZsYWdzLCBpdGVyYXRvciwgZGF0YSk7CisJX19pdGVyYXRlX2ludGVyZmFjZXMobG9jYWwsIGl0ZXJfZmxhZ3MsIGl0ZXJhdG9yLCBkYXRhKTsKIAltdXRleF91bmxvY2soJmxvY2FsLT5pZmxpc3RfbXR4KTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMV9pdGVyYXRlX2ludGVyZmFjZXMpOwogCiB2b2lkIGllZWU4MDIxMV9pdGVyYXRlX2FjdGl2ZV9pbnRlcmZhY2VzX2F0b21pYygKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGl0ZXJfZmxhZ3MsCkBAIC02ODQsNyArNjkwLDggQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlfX2l0ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXMobG9jYWwsIGl0ZXJfZmxhZ3MsIGl0ZXJhdG9yLCBkYXRhKTsKKwlfX2l0ZXJhdGVfaW50ZXJmYWNlcyhsb2NhbCwgaXRlcl9mbGFncyB8IElFRUU4MDIxMV9JRkFDRV9JVEVSX0FDVElWRSwKKwkJCSAgICAgaXRlcmF0b3IsIGRhdGEpOwogCXJjdV9yZWFkX3VubG9jaygpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoaWVlZTgwMjExX2l0ZXJhdGVfYWN0aXZlX2ludGVyZmFjZXNfYXRvbWljKTsKQEAgLTY5OSw3ICs3MDYsOCBAQAogCiAJQVNTRVJUX1JUTkwoKTsKIAotCV9faXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlcyhsb2NhbCwgaXRlcl9mbGFncywgaXRlcmF0b3IsIGRhdGEpOworCV9faXRlcmF0ZV9pbnRlcmZhY2VzKGxvY2FsLCBpdGVyX2ZsYWdzIHwgSUVFRTgwMjExX0lGQUNFX0lURVJfQUNUSVZFLAorCQkJICAgICBpdGVyYXRvciwgZGF0YSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpZWVlODAyMTFfaXRlcmF0ZV9hY3RpdmVfaW50ZXJmYWNlc19ydG5sKTsKIApAQCAtNzQyLDYgKzc1MCwxOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwod2Rldl90b19pZWVlODAyMTFfdmlmKTsKIAorc3RydWN0IHdpcmVsZXNzX2RldiAqaWVlZTgwMjExX3ZpZl90b193ZGV2KHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKKworCWlmICghaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpIHx8CisJICAgICEoc2RhdGEtPmZsYWdzICYgSUVFRTgwMjExX1NEQVRBX0lOX0RSSVZFUikpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZzZGF0YS0+d2RldjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGllZWU4MDIxMV92aWZfdG9fd2Rldik7CisKIC8qCiAgKiBOb3RoaW5nIHNob3VsZCBoYXZlIGJlZW4gc3R1ZmZlZCBpbnRvIHRoZSB3b3JrcXVldWUgZHVyaW5nCiAgKiB0aGUgc3VzcGVuZC0+cmVzdW1lIGN5Y2xlLiBTaW5jZSB3ZSBjYW4ndCBjaGVjayBlYWNoIGNhbGxlcgpAQCAtMTgxMSw4ICsxODMxLDI1IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7CiAJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTiAmJgogCQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IgJiYKLQkJICAgIGllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkKKwkJICAgIGllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkgewogCQkJcmVzID0gZHJ2X2FkZF9pbnRlcmZhY2UobG9jYWwsIHNkYXRhKTsKKwkJCWlmIChXQVJOX09OKHJlcykpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBJZiBhZGRpbmcgYW55IG9mIHRoZSBpbnRlcmZhY2VzIGZhaWxlZCBhYm92ZSwgcm9sbCBiYWNrIGFuZAorCSAqIHJlcG9ydCBmYWlsdXJlLgorCSAqLworCWlmIChyZXMpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZV9yZXZlcnNlKHNkYXRhLCAmbG9jYWwtPmludGVyZmFjZXMsCisJCQkJCQkgICAgIGxpc3QpCisJCQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gJiYKKwkJCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJgorCQkJICAgIGllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkKKwkJCQlkcnZfcmVtb3ZlX2ludGVyZmFjZShsb2NhbCwgc2RhdGEpOworCQlpZWVlODAyMTFfaGFuZGxlX3JlY29uZmlnX2ZhaWx1cmUobG9jYWwpOworCQlyZXR1cm4gcmVzOwogCX0KIAogCS8qIGFkZCBjaGFubmVsIGNvbnRleHRzICovCkBAIC0yMTU3LDQ2ICsyMTk0LDYgQEAKIAltdXRleF91bmxvY2soJmxvY2FsLT5jaGFuY3R4X210eCk7CiB9CiAKLXN0YXRpYyBib29sIGllZWU4MDIxMV9pZF9pbl9saXN0KGNvbnN0IHU4ICppZHMsIGludCBuX2lkcywgdTggaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbl9pZHM7IGkrKykKLQkJaWYgKGlkc1tpXSA9PSBpZCkKLQkJCXJldHVybiB0cnVlOwotCXJldHVybiBmYWxzZTsKLX0KLQotc2l6ZV90IGllZWU4MDIxMV9pZV9zcGxpdF9yaWMoY29uc3QgdTggKmllcywgc2l6ZV90IGllbGVuLAotCQkJICAgICAgY29uc3QgdTggKmlkcywgaW50IG5faWRzLAotCQkJICAgICAgY29uc3QgdTggKmFmdGVyX3JpYywgaW50IG5fYWZ0ZXJfcmljLAotCQkJICAgICAgc2l6ZV90IG9mZnNldCkKLXsKLQlzaXplX3QgcG9zID0gb2Zmc2V0OwotCi0Jd2hpbGUgKHBvcyA8IGllbGVuICYmIGllZWU4MDIxMV9pZF9pbl9saXN0KGlkcywgbl9pZHMsIGllc1twb3NdKSkgewotCQlpZiAoaWVzW3Bvc10gPT0gV0xBTl9FSURfUklDX0RBVEEgJiYgbl9hZnRlcl9yaWMpIHsKLQkJCXBvcyArPSAyICsgaWVzW3BvcyArIDFdOwotCi0JCQl3aGlsZSAocG9zIDwgaWVsZW4gJiYKLQkJCSAgICAgICAhaWVlZTgwMjExX2lkX2luX2xpc3QoYWZ0ZXJfcmljLCBuX2FmdGVyX3JpYywKLQkJCQkJCSAgICAgaWVzW3Bvc10pKQotCQkJCXBvcyArPSAyICsgaWVzW3BvcyArIDFdOwotCQl9IGVsc2UgewotCQkJcG9zICs9IDIgKyBpZXNbcG9zICsgMV07Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcG9zOwotfQotCi1zaXplX3QgaWVlZTgwMjExX2llX3NwbGl0KGNvbnN0IHU4ICppZXMsIHNpemVfdCBpZWxlbiwKLQkJCSAgY29uc3QgdTggKmlkcywgaW50IG5faWRzLCBzaXplX3Qgb2Zmc2V0KQotewotCXJldHVybiBpZWVlODAyMTFfaWVfc3BsaXRfcmljKGllcywgaWVsZW4sIGlkcywgbl9pZHMsIE5VTEwsIDAsIG9mZnNldCk7Ci19Ci1FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9pZV9zcGxpdCk7Ci0KIHNpemVfdCBpZWVlODAyMTFfaWVfc3BsaXRfdmVuZG9yKGNvbnN0IHU4ICppZXMsIHNpemVfdCBpZWxlbiwgc2l6ZV90IG9mZnNldCkKIHsKIAlzaXplX3QgcG9zID0gb2Zmc2V0OwpAQCAtMjM0NCw2ICsyMzQxLDQxIEBACiAJcmV0dXJuIHBvcyArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X29wZXJhdGlvbik7CiB9CiAKK3U4ICppZWVlODAyMTFfaWVfYnVpbGRfdmh0X29wZXIodTggKnBvcywgc3RydWN0IGllZWU4MDIxMV9zdGFfdmh0X2NhcCAqdmh0X2NhcCwKKwkJCQljb25zdCBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpCit7CisJc3RydWN0IGllZWU4MDIxMV92aHRfb3BlcmF0aW9uICp2aHRfb3BlcjsKKworCSpwb3MrKyA9IFdMQU5fRUlEX1ZIVF9PUEVSQVRJT047CisJKnBvcysrID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdmh0X29wZXJhdGlvbik7CisJdmh0X29wZXIgPSAoc3RydWN0IGllZWU4MDIxMV92aHRfb3BlcmF0aW9uICopcG9zOworCXZodF9vcGVyLT5jZW50ZXJfZnJlcV9zZWcxX2lkeCA9IGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbCgKKwkJCQkJCQljaGFuZGVmLT5jZW50ZXJfZnJlcTEpOworCWlmIChjaGFuZGVmLT5jZW50ZXJfZnJlcTIpCisJCXZodF9vcGVyLT5jZW50ZXJfZnJlcV9zZWcyX2lkeCA9CisJCQlpZWVlODAyMTFfZnJlcXVlbmN5X3RvX2NoYW5uZWwoY2hhbmRlZi0+Y2VudGVyX2ZyZXEyKTsKKworCXN3aXRjaCAoY2hhbmRlZi0+d2lkdGgpIHsKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF8xNjA6CisJCXZodF9vcGVyLT5jaGFuX3dpZHRoID0gSUVFRTgwMjExX1ZIVF9DSEFOV0lEVEhfMTYwTUhaOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF84MFA4MDoKKwkJdmh0X29wZXItPmNoYW5fd2lkdGggPSBJRUVFODAyMTFfVkhUX0NIQU5XSURUSF84MFA4ME1IWjsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfODA6CisJCXZodF9vcGVyLT5jaGFuX3dpZHRoID0gSUVFRTgwMjExX1ZIVF9DSEFOV0lEVEhfODBNSFo7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZodF9vcGVyLT5jaGFuX3dpZHRoID0gSUVFRTgwMjExX1ZIVF9DSEFOV0lEVEhfVVNFX0hUOworCQlicmVhazsKKwl9CisKKwkvKiBkb24ndCByZXF1aXJlIHNwZWNpYWwgVkhUIHBlZXIgcmF0ZXMgKi8KKwl2aHRfb3Blci0+YmFzaWNfbWNzX3NldCA9IGNwdV90b19sZTE2KDB4ZmZmZik7CisKKwlyZXR1cm4gcG9zICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdmh0X29wZXJhdGlvbik7Cit9CisKIHZvaWQgaWVlZTgwMjExX2h0X29wZXJfdG9fY2hhbmRlZihzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNvbnRyb2xfY2hhbiwKIAkJCQkgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfb3BlcmF0aW9uICpodF9vcGVyLAogCQkJCSAgc3RydWN0IGNmZzgwMjExX2NoYW5fZGVmICpjaGFuZGVmKQpAQCAtMjM3Myw2ICsyNDA1LDM5IEBACiAJY2ZnODAyMTFfY2hhbmRlZl9jcmVhdGUoY2hhbmRlZiwgY29udHJvbF9jaGFuLCBjaGFubmVsX3R5cGUpOwogfQogCit2b2lkIGllZWU4MDIxMV92aHRfb3Blcl90b19jaGFuZGVmKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY29udHJvbF9jaGFuLAorCQkJCSAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdmh0X29wZXJhdGlvbiAqb3BlciwKKwkJCQkgICBzdHJ1Y3QgY2ZnODAyMTFfY2hhbl9kZWYgKmNoYW5kZWYpCit7CisJaWYgKCFvcGVyKQorCQlyZXR1cm47CisKKwljaGFuZGVmLT5jaGFuID0gY29udHJvbF9jaGFuOworCisJc3dpdGNoIChvcGVyLT5jaGFuX3dpZHRoKSB7CisJY2FzZSBJRUVFODAyMTFfVkhUX0NIQU5XSURUSF9VU0VfSFQ6CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1ZIVF9DSEFOV0lEVEhfODBNSFo6CisJCWNoYW5kZWYtPndpZHRoID0gTkw4MDIxMV9DSEFOX1dJRFRIXzgwOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9WSFRfQ0hBTldJRFRIXzE2ME1IWjoKKwkJY2hhbmRlZi0+d2lkdGggPSBOTDgwMjExX0NIQU5fV0lEVEhfMTYwOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9WSFRfQ0hBTldJRFRIXzgwUDgwTUhaOgorCQljaGFuZGVmLT53aWR0aCA9IE5MODAyMTFfQ0hBTl9XSURUSF84MFA4MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJY2hhbmRlZi0+Y2VudGVyX2ZyZXExID0KKwkJaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KG9wZXItPmNlbnRlcl9mcmVxX3NlZzFfaWR4LAorCQkJCQkgICAgICAgY29udHJvbF9jaGFuLT5iYW5kKTsKKwljaGFuZGVmLT5jZW50ZXJfZnJlcTIgPQorCQlpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kob3Blci0+Y2VudGVyX2ZyZXFfc2VnMl9pZHgsCisJCQkJCSAgICAgICBjb250cm9sX2NoYW4tPmJhbmQpOworfQorCiBpbnQgaWVlZTgwMjExX3BhcnNlX2JpdHJhdGVzKHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKIAkJCSAgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCiAJCQkgICAgIGNvbnN0IHU4ICpzcmF0ZXMsIGludCBzcmF0ZXNfbGVuLCB1MzIgKnJhdGVzKQpAQCAtMzE3OCw3ICszMjQzLDcgQEAKIAkJd2Rldl9pdGVyID0gJnNkYXRhX2l0ZXItPndkZXY7CiAKIAkJaWYgKHNkYXRhX2l0ZXIgPT0gc2RhdGEgfHwKLQkJICAgIHJjdV9hY2Nlc3NfcG9pbnRlcihzZGF0YV9pdGVyLT52aWYuY2hhbmN0eF9jb25mKSA9PSBOVUxMIHx8CisJCSAgICAhaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGFfaXRlcikgfHwKIAkJICAgIGxvY2FsLT5ody53aXBoeS0+c29mdHdhcmVfaWZ0eXBlcyAmIEJJVCh3ZGV2X2l0ZXItPmlmdHlwZSkpCiAJCQljb250aW51ZTsKIApAQCAtMzI1MiwzICszMzE3LDIwIEBACiAKIAlyZXR1cm4gYnVmOwogfQorCit2b2lkIGllZWU4MDIxMV9pbml0X3R4X3F1ZXVlKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJICAgICBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKKwkJCSAgICAgc3RydWN0IHR4cV9pbmZvICp0eHFpLCBpbnQgdGlkKQoreworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnR4cWktPnF1ZXVlKTsKKwl0eHFpLT50eHEudmlmID0gJnNkYXRhLT52aWY7CisKKwlpZiAoc3RhKSB7CisJCXR4cWktPnR4cS5zdGEgPSAmc3RhLT5zdGE7CisJCXN0YS0+c3RhLnR4cVt0aWRdID0gJnR4cWktPnR4cTsKKwkJdHhxaS0+dHhxLmFjID0gaWVlZTgwMl8xZF90b19hY1t0aWQgJiA3XTsKKwl9IGVsc2UgeworCQlzZGF0YS0+dmlmLnR4cSA9ICZ0eHFpLT50eHE7CisJCXR4cWktPnR4cS5hYyA9IElFRUU4MDIxMV9BQ19CRTsKKwl9Cit9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdmh0LmMgYi9uZXQvbWFjODAyMTEvdmh0LmMKaW5kZXggODVmOTU5Ni4uODA2OTRkNSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3ZodC5jCisrKyBiL25ldC9tYWM4MDIxMS92aHQuYwpAQCAtMTI5LDEwICsxMjksNiBAQAogCWlmICghdmh0X2NhcF9pZSB8fCAhc2JhbmQtPnZodF9jYXAudmh0X3N1cHBvcnRlZCkKIAkJcmV0dXJuOwogCi0JLyogZG9uJ3Qgc3VwcG9ydCBWSFQgZm9yIFRETFMgcGVlcnMgZm9yIG5vdyAqLwotCWlmICh0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfVERMU19QRUVSKSkKLQkJcmV0dXJuOwotCiAJLyoKIAkgKiBBIFZIVCBTVEEgbXVzdCBzdXBwb3J0IDQwIE1IeiwgYnV0IGlmIHdlIHZlcmlmeSB0aGF0IGhlcmUKIAkgKiB0aGVuIHdlIGJyZWFrIGEgZmV3IHRoaW5ncyAtIHNvbWUgQVBzIChlLmcuIE5ldGdlYXIgUjYzMDB2MgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dwYS5jIGIvbmV0L21hYzgwMjExL3dwYS5jCmluZGV4IDc1ZGU2ZmEuLjlkNjNkOTMgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93cGEuYworKysgYi9uZXQvbWFjODAyMTEvd3BhLmMKQEAgLTc4MCw5ICs3ODAsOCBAQAogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJc3RydWN0IGllZWU4MDIxMV9rZXkgKmtleSA9IHR4LT5rZXk7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwotCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfY2lwaGVyX3NjaGVtZSAqY3MgPSBrZXktPnN0YS0+Y2lwaGVyX3NjaGVtZTsKIAlpbnQgaGRybGVuOwotCXU4ICpwb3M7CisJdTggKnBvcywgaXZfbGVuID0ga2V5LT5jb25mLml2X2xlbjsKIAogCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSAmJgogCSAgICAhKGluZm8tPmNvbnRyb2wuaHdfa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QVVRfSVZfU1BBQ0UpKSB7CkBAIC03OTAsMTQgKzc4OSwxNCBAQAogCQlyZXR1cm4gVFhfQ09OVElOVUU7CiAJfQogCi0JaWYgKHVubGlrZWx5KHNrYl9oZWFkcm9vbShza2IpIDwgY3MtPmhkcl9sZW4gJiYKLQkJICAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgY3MtPmhkcl9sZW4sIDAsIEdGUF9BVE9NSUMpKSkKKwlpZiAodW5saWtlbHkoc2tiX2hlYWRyb29tKHNrYikgPCBpdl9sZW4gJiYKKwkJICAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgaXZfbGVuLCAwLCBHRlBfQVRPTUlDKSkpCiAJCXJldHVybiBUWF9EUk9QOwogCiAJaGRybGVuID0gaWVlZTgwMjExX2hkcmxlbihoZHItPmZyYW1lX2NvbnRyb2wpOwogCi0JcG9zID0gc2tiX3B1c2goc2tiLCBjcy0+aGRyX2xlbik7Ci0JbWVtbW92ZShwb3MsIHBvcyArIGNzLT5oZHJfbGVuLCBoZHJsZW4pOworCXBvcyA9IHNrYl9wdXNoKHNrYiwgaXZfbGVuKTsKKwltZW1tb3ZlKHBvcywgcG9zICsgaXZfbGVuLCBoZHJsZW4pOwogCiAJcmV0dXJuIFRYX0NPTlRJTlVFOwogfQpAQCAtMTIxNyw3ICsxMjE2LDcgQEAKIAkJaWYgKCFpbmZvLT5jb250cm9sLmh3X2tleSkKIAkJCXJldHVybiBUWF9EUk9QOwogCi0JCWlmICh0eC0+a2V5LT5zdGEtPmNpcGhlcl9zY2hlbWUpIHsKKwkJaWYgKHR4LT5rZXktPmZsYWdzICYgS0VZX0ZMQUdfQ0lQSEVSX1NDSEVNRSkgewogCQkJcmVzID0gaWVlZTgwMjExX2NyeXB0b19jc19lbmNyeXB0KHR4LCBza2IpOwogCQkJaWYgKHJlcyAhPSBUWF9DT05USU5VRSkKIAkJCQlyZXR1cm4gcmVzOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjE1NC9kcml2ZXItb3BzLmggYi9uZXQvbWFjODAyMTU0L2RyaXZlci1vcHMuaAppbmRleCA5ODE4MGE5Li5hMDUzMzM1IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTU0L2RyaXZlci1vcHMuaAorKysgYi9uZXQvbWFjODAyMTU0L2RyaXZlci1vcHMuaApAQCAtMSw0ICsxLDQgQEAKLSNpZm5kZWYgX19NQUM4MDIxNTRfRFJWSUVSX09QUworI2lmbmRlZiBfX01BQzgwMjE1NF9EUklWRVJfT1BTCiAjZGVmaW5lIF9fTUFDODAyMTU0X0RSSVZFUl9PUFMKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CkBAIC0yMjAsNCArMjIwLDQgQEAKIAlyZXR1cm4gbG9jYWwtPm9wcy0+c2V0X3Byb21pc2N1b3VzX21vZGUoJmxvY2FsLT5odywgb24pOwogfQogCi0jZW5kaWYgLyogX19NQUM4MDIxNTRfRFJWSUVSX09QUyAqLworI2VuZGlmIC8qIF9fTUFDODAyMTU0X0RSSVZFUl9PUFMgKi8KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxNTQvaWZhY2UuYyBiL25ldC9tYWM4MDIxNTQvaWZhY2UuYwppbmRleCA2ZmI2YmRmLi4zOGI1NmY5IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTU0L2lmYWNlLmMKKysrIGIvbmV0L21hYzgwMjE1NC9pZmFjZS5jCkBAIC0xNzQsMjQgKzE3NCwxNiBAQAogCX0KIAogCWlmIChsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTU0X0hXX0FGSUxUKSB7Ci0JCWlmICh3cGFuX2Rldi0+cGFuX2lkICE9IG53cGFuX2Rldi0+cGFuX2lkKQotCQkJcmV0dXJuIC1FQlVTWTsKLQotCQlpZiAod3Bhbl9kZXYtPnNob3J0X2FkZHIgIT0gbndwYW5fZGV2LT5zaG9ydF9hZGRyKQotCQkJcmV0dXJuIC1FQlVTWTsKLQotCQlpZiAod3Bhbl9kZXYtPmV4dGVuZGVkX2FkZHIgIT0gbndwYW5fZGV2LT5leHRlbmRlZF9hZGRyKQorCQlpZiAod3Bhbl9kZXYtPnBhbl9pZCAhPSBud3Bhbl9kZXYtPnBhbl9pZCB8fAorCQkgICAgd3Bhbl9kZXYtPnNob3J0X2FkZHIgIT0gbndwYW5fZGV2LT5zaG9ydF9hZGRyIHx8CisJCSAgICB3cGFuX2Rldi0+ZXh0ZW5kZWRfYWRkciAhPSBud3Bhbl9kZXYtPmV4dGVuZGVkX2FkZHIpCiAJCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmIChsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTU0X0hXX0NTTUFfUEFSQU1TKSB7Ci0JCWlmICh3cGFuX2Rldi0+bWluX2JlICE9IG53cGFuX2Rldi0+bWluX2JlKQotCQkJcmV0dXJuIC1FQlVTWTsKLQotCQlpZiAod3Bhbl9kZXYtPm1heF9iZSAhPSBud3Bhbl9kZXYtPm1heF9iZSkKLQkJCXJldHVybiAtRUJVU1k7Ci0KLQkJaWYgKHdwYW5fZGV2LT5jc21hX3JldHJpZXMgIT0gbndwYW5fZGV2LT5jc21hX3JldHJpZXMpCisJCWlmICh3cGFuX2Rldi0+bWluX2JlICE9IG53cGFuX2Rldi0+bWluX2JlIHx8CisJCSAgICB3cGFuX2Rldi0+bWF4X2JlICE9IG53cGFuX2Rldi0+bWF4X2JlIHx8CisJCSAgICB3cGFuX2Rldi0+Y3NtYV9yZXRyaWVzICE9IG53cGFuX2Rldi0+Y3NtYV9yZXRyaWVzKQogCQkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxNTQvdXRpbC5jIGIvbmV0L21hYzgwMjE1NC91dGlsLmMKaW5kZXggNWZjOTc5MC4uMTUwYmY4MCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjE1NC91dGlsLmMKKysrIGIvbmV0L21hYzgwMjE1NC91dGlsLmMKQEAgLTY1LDggKzY1LDE5IEBACiB7CiAJaWYgKGlmc19oYW5kbGluZykgewogCQlzdHJ1Y3QgaWVlZTgwMjE1NF9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CisJCXU4IG1heF9zaWZzX3NpemU7CiAKLQkJaWYgKHNrYi0+bGVuID4gMTgpCisJCS8qIElmIHRyYW5zY2VpdmVyIHNldHMgQ1JDIG9uIGhpcyBvd24gd2UgbmVlZCB0byB1c2UgbGlmcworCQkgKiB0aHJlc2hvbGQgbGVuIGFib3ZlIDE2IG90aGVyd2lzZSAxOCwgYmVjYXVzZSBpdCdzIG5vdAorCQkgKiBwYXJ0IG9mIHNrYi0+bGVuLgorCQkgKi8KKwkJaWYgKGh3LT5mbGFncyAmIElFRUU4MDIxNTRfSFdfVFhfT01JVF9DS1NVTSkKKwkJCW1heF9zaWZzX3NpemUgPSBJRUVFODAyMTU0X01BWF9TSUZTX0ZSQU1FX1NJWkUgLQorCQkJCQlJRUVFODAyMTU0X0ZDU19MRU47CisJCWVsc2UKKwkJCW1heF9zaWZzX3NpemUgPSBJRUVFODAyMTU0X01BWF9TSUZTX0ZSQU1FX1NJWkU7CisKKwkJaWYgKHNrYi0+bGVuID4gbWF4X3NpZnNfc2l6ZSkKIAkJCWhydGltZXJfc3RhcnQoJmxvY2FsLT5pZnNfdGltZXIsCiAJCQkJICAgICAga3RpbWVfc2V0KDAsIGh3LT5waHktPmxpZnNfcGVyaW9kICogTlNFQ19QRVJfVVNFQyksCiAJCQkJICAgICAgSFJUSU1FUl9NT0RFX1JFTCk7CmRpZmYgLS1naXQgYS9uZXQvbXBscy9LY29uZmlnIGIvbmV0L21wbHMvS2NvbmZpZwppbmRleCAzNzQyMWRiLi4xN2JkZTc5IDEwMDY0NAotLS0gYS9uZXQvbXBscy9LY29uZmlnCisrKyBiL25ldC9tcGxzL0tjb25maWcKQEAgLTEsOSArMSwzMCBAQAogIwogIyBNUExTIGNvbmZpZ3VyYXRpb24KICMKKworbWVudWNvbmZpZyBNUExTCisJYm9vbCAiTXVsdGlQcm90b2NvbCBMYWJlbCBTd2l0Y2hpbmciCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgTXVsdGlQcm90b2NvbCBMYWJlbCBTd2l0Y2hpbmcgcm91dGVzIHBhY2tldHMgdGhyb3VnaCBsb2dpY2FsCisJICBjaXJjdWl0cy4gIE9yaWdpbmFsbHkgY29uY2VpdmVkIGFzIGEgd2F5IG9mIHJvdXRpbmcgcGFja2V0cyBhdAorCSAgaGFyZHdhcmUgc3BlZWRzIChiZWZvcmUgaGFyZHdhcmUgd2FzIGNhcGFibGUgb2Ygcm91dGluZyBpcHY0IHBhY2tldHMpLAorCSAgTVBMUyByZW1haW5zIGEgc2ltcGxlIHdheSBvZiBtYWtpbmcgdHVubmVscy4KKworCSAgSWYgeW91IGhhdmUgbm90IGhlYXJkIG9mIE1QTFMgeW91IHByb2JhYmx5IHdhbnQgdG8gc2F5IE4gaGVyZS4KKworaWYgTVBMUworCiBjb25maWcgTkVUX01QTFNfR1NPCiAJdHJpc3RhdGUgIk1QTFM6IEdTTyBzdXBwb3J0IgogCWhlbHAKIAkgVGhpcyBpcyBoZWxwZXIgbW9kdWxlIHRvIGFsbG93IHNlZ21lbnRhdGlvbiBvZiBub24tTVBMUyBHU08gcGFja2V0cwogCSB0aGF0IGhhdmUgaGFkIE1QTFMgc3RhY2sgZW50cmllcyBwdXNoZWQgb250byB0aGVtIGFuZCB0aHVzCiAJIGJlY29tZSBNUExTIEdTTyBwYWNrZXRzLgorCitjb25maWcgTVBMU19ST1VUSU5HCisJdHJpc3RhdGUgIk1QTFM6IHJvdXRpbmcgc3VwcG9ydCIKKwloZWxwCisJIEFkZCBzdXBwb3J0IGZvciBmb3J3YXJkaW5nIG9mIG1wbHMgcGFja2V0cy4KKworZW5kaWYgIyBNUExTCmRpZmYgLS1naXQgYS9uZXQvbXBscy9NYWtlZmlsZSBiL25ldC9tcGxzL01ha2VmaWxlCmluZGV4IDZkZWMwODguLjY1YmJlNjggMTAwNjQ0Ci0tLSBhL25ldC9tcGxzL01ha2VmaWxlCisrKyBiL25ldC9tcGxzL01ha2VmaWxlCkBAIC0yLDMgKzIsNiBAQAogIyBNYWtlZmlsZSBmb3IgTVBMUy4KICMKIG9iai0kKENPTkZJR19ORVRfTVBMU19HU08pICs9IG1wbHNfZ3NvLm8KK29iai0kKENPTkZJR19NUExTX1JPVVRJTkcpICs9IG1wbHNfcm91dGVyLm8KKworbXBsc19yb3V0ZXIteSA6PSBhZl9tcGxzLm8KZGlmZiAtLWdpdCBhL25ldC9tcGxzL2FmX21wbHMuYyBiL25ldC9tcGxzL2FmX21wbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjhhMmVhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L21wbHMvYWZfbXBscy5jCkBAIC0wLDAgKzEsMTAyMyBAQAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L21wbHMuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2RzdC5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L2FycC5oPgorI2luY2x1ZGUgPG5ldC9pcF9maWIuaD4KKyNpbmNsdWRlIDxuZXQvbmV0ZXZlbnQuaD4KKyNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTEFCRUxfTk9UX1NQRUNJRklFRCAoMTw8MjApCisjZGVmaW5lIE1BWF9ORVdfTEFCRUxTIDIKKworLyogVGhpcyBtYXhpbXVtIGhhIGxlbmd0aCBjb3BpZWQgZnJvbSB0aGUgZGVmaW5pdGlvbiBvZiBzdHJ1Y3QgbmVpZ2hib3VyICovCisjZGVmaW5lIE1BWF9WSUFfQUxFTiAoQUxJR04oTUFYX0FERFJfTEVOLCBzaXplb2YodW5zaWduZWQgbG9uZykpKQorCitzdHJ1Y3QgbXBsc19yb3V0ZSB7IC8qIG5leHQgaG9wIGxhYmVsIGZvcndhcmRpbmcgZW50cnkgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSBfX3JjdSAqcnRfZGV2OworCXN0cnVjdCByY3VfaGVhZAkJcnRfcmN1OworCXUzMgkJCXJ0X2xhYmVsW01BWF9ORVdfTEFCRUxTXTsKKwl1OAkJCXJ0X3Byb3RvY29sOyAvKiByb3V0aW5nIHByb3RvY29sIHRoYXQgc2V0IHRoaXMgZW50cnkgKi8KKwl1OAkJCXJ0X2xhYmVsczsKKwl1OAkJCXJ0X3ZpYV9hbGVuOworCXU4CQkJcnRfdmlhX3RhYmxlOworCXU4CQkJcnRfdmlhWzBdOworfTsKKworc3RhdGljIGludCB6ZXJvID0gMDsKK3N0YXRpYyBpbnQgbGFiZWxfbGltaXQgPSAoMSA8PCAyMCkgLSAxOworCitzdGF0aWMgdm9pZCBydG1zZ19sZmliKGludCBldmVudCwgdTMyIGxhYmVsLCBzdHJ1Y3QgbXBsc19yb3V0ZSAqcnQsCisJCSAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5ldCAqbmV0LCB1MzIgcG9ydGlkLAorCQkgICAgICAgdW5zaWduZWQgaW50IG5sbV9mbGFncyk7CisKK3N0YXRpYyBzdHJ1Y3QgbXBsc19yb3V0ZSAqbXBsc19yb3V0ZV9pbnB1dF9yY3Uoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbmRleCkKK3sKKwlzdHJ1Y3QgbXBsc19yb3V0ZSAqcnQgPSBOVUxMOworCisJaWYgKGluZGV4IDwgbmV0LT5tcGxzLnBsYXRmb3JtX2xhYmVscykgeworCQlzdHJ1Y3QgbXBsc19yb3V0ZSBfX3JjdSAqKnBsYXRmb3JtX2xhYmVsID0KKwkJCXJjdV9kZXJlZmVyZW5jZShuZXQtPm1wbHMucGxhdGZvcm1fbGFiZWwpOworCQlydCA9IHJjdV9kZXJlZmVyZW5jZShwbGF0Zm9ybV9sYWJlbFtpbmRleF0pOworCX0KKwlyZXR1cm4gcnQ7Cit9CisKK3N0YXRpYyBib29sIG1wbHNfb3V0cHV0X3Bvc3NpYmxlKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIGRldiAmJiAoZGV2LT5mbGFncyAmIElGRl9VUCkgJiYgbmV0aWZfY2Fycmllcl9vayhkZXYpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1wbHNfcnRfaGVhZGVyX3NpemUoY29uc3Qgc3RydWN0IG1wbHNfcm91dGUgKnJ0KQoreworCS8qIFRoZSBzaXplIG9mIHRoZSBsYXllciAyLjUgbGFiZWxzIHRvIGJlIGFkZGVkIGZvciB0aGlzIHJvdXRlICovCisJcmV0dXJuIHJ0LT5ydF9sYWJlbHMgKiBzaXplb2Yoc3RydWN0IG1wbHNfc2hpbV9oZHIpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IG1wbHNfZGV2X210dShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCS8qIFRoZSBhbW91bnQgb2YgZGF0YSB0aGUgbGF5ZXIgMiBmcmFtZSBjYW4gaG9sZCAqLworCXJldHVybiBkZXYtPm10dTsKK30KKworc3RhdGljIGJvb2wgbXBsc19wa3RfdG9vX2JpZyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgbXR1KQoreworCWlmIChza2ItPmxlbiA8PSBtdHUpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChza2JfaXNfZ3NvKHNrYikgJiYgc2tiX2dzb19uZXR3b3JrX3NlZ2xlbihza2IpIDw9IG10dSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIG1wbHNfZWdyZXNzKHN0cnVjdCBtcGxzX3JvdXRlICpydCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBtcGxzX2VudHJ5X2RlY29kZWQgZGVjKQoreworCS8qIFJGQzQzODUgYW5kIFJGQzU1ODYgZW5jb2RlIG90aGVyIHBhY2tldHMgaW4gbXBscyBzdWNoIHRoYXQKKwkgKiB0aGV5IGRvbid0IGNvbmZsaWN0IHdpdGggdGhlIGlwIHZlcnNpb24gbnVtYmVyLCBtYWtpbmcKKwkgKiBkZWNvZGluZyBieSBleGFtaW5pbmcgdGhlIGlwIHZlcnNpb24gY29ycmVjdCBpbiBldmVyeXRoaW5nCisJICogZXhjZXB0IGZvciB0aGUgc3RyYW5nZXN0IGNhc2VzLgorCSAqCisJICogVGhlIHN0cmFuZ2UgY2FzZXMgaWYgd2UgY2hvb3NlIHRvIHN1cHBvcnQgdGhlbSB3aWxsIHJlcXVpcmUKKwkgKiBtYW51YWwgY29uZmlndXJhdGlvbi4KKwkgKi8KKwlzdHJ1Y3QgaXBoZHIgKmhkcjQ7CisJYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKworCS8qIFRoZSBJUHY0IGNvZGUgYmVsb3cgYWNjZXNzZXMgdGhyb3VnaCB0aGUgSVB2NCBoZWFkZXIKKwkgKiBjaGVja3N1bSwgd2hpY2ggaXMgMTIgYnl0ZXMgaW50byB0aGUgcGFja2V0LgorCSAqIFRoZSBJUHY2IGNvZGUgYmVsb3cgYWNjZXNzZXMgdGhyb3VnaCB0aGUgSVB2NiBob3AgbGltaXQKKwkgKiB3aGljaCBpcyA4IGJ5dGVzIGludG8gdGhlIHBhY2tldC4KKwkgKgorCSAqIEZvciBhbGwgc3VwcG9ydGVkIGNhc2VzIHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgMTIKKwkgKiBieXRlcyBvZiBwYWNrZXQgZGF0YSBwcmVzZW50LiAgVGhlIElQdjQgaGVhZGVyIGlzIDIwIGJ5dGVzCisJICogd2l0aG91dCBvcHRpb25zIGFuZCB0aGUgSVB2NiBoZWFkZXIgaXMgYWx3YXlzIDQwIGJ5dGVzCisJICogbG9uZy4KKwkgKi8KKwlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCAxMikpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFVzZSBpcF9oZHIgdG8gZmluZCB0aGUgaXAgcHJvdG9jb2wgdmVyc2lvbiAqLworCWhkcjQgPSBpcF9oZHIoc2tiKTsKKwlpZiAoaGRyNC0+dmVyc2lvbiA9PSA0KSB7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJCWNzdW1fcmVwbGFjZTIoJmhkcjQtPmNoZWNrLAorCQkJICAgICAgaHRvbnMoaGRyNC0+dHRsIDw8IDgpLAorCQkJICAgICAgaHRvbnMoZGVjLnR0bCA8PCA4KSk7CisJCWhkcjQtPnR0bCA9IGRlYy50dGw7CisJfQorCWVsc2UgaWYgKGhkcjQtPnZlcnNpb24gPT0gNikgeworCQlzdHJ1Y3QgaXB2NmhkciAqaGRyNiA9IGlwdjZfaGRyKHNrYik7CisJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKKwkJaGRyNi0+aG9wX2xpbWl0ID0gZGVjLnR0bDsKKwl9CisJZWxzZQorCQkvKiB2ZXJzaW9uIDAgYW5kIHZlcnNpb24gMSBhcmUgdXNlZCBieSBwc2V1ZG8gd2lyZXMgKi8KKwkJc3VjY2VzcyA9IGZhbHNlOworCXJldHVybiBzdWNjZXNzOworfQorCitzdGF0aWMgaW50IG1wbHNfZm9yd2FyZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJc3RydWN0IHBhY2tldF90eXBlICpwdCwgc3RydWN0IG5ldF9kZXZpY2UgKm9yaWdfZGV2KQoreworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKwlzdHJ1Y3QgbXBsc19zaGltX2hkciAqaGRyOworCXN0cnVjdCBtcGxzX3JvdXRlICpydDsKKwlzdHJ1Y3QgbXBsc19lbnRyeV9kZWNvZGVkIGRlYzsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqb3V0X2RldjsKKwl1bnNpZ25lZCBpbnQgaGhfbGVuOworCXVuc2lnbmVkIGludCBuZXdfaGVhZGVyX3NpemU7CisJdW5zaWduZWQgaW50IG10dTsKKwlpbnQgZXJyOworCisJLyogQ2FyZWZ1bCB0aGlzIGVudGlyZSBmdW5jdGlvbiBydW5zIGluc2lkZSBvZiBhbiByY3UgY3JpdGljYWwgc2VjdGlvbiAqLworCisJaWYgKHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX0hPU1QpCisJCWdvdG8gZHJvcDsKKworCWlmICgoc2tiID0gc2tiX3NoYXJlX2NoZWNrKHNrYiwgR0ZQX0FUT01JQykpID09IE5VTEwpCisJCWdvdG8gZHJvcDsKKworCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaGRyKSkpCisJCWdvdG8gZHJvcDsKKworCS8qIFJlYWQgYW5kIGRlY29kZSB0aGUgbGFiZWwgKi8KKwloZHIgPSBtcGxzX2hkcihza2IpOworCWRlYyA9IG1wbHNfZW50cnlfZGVjb2RlKGhkcik7CisKKwkvKiBQb3AgdGhlIGxhYmVsICovCisJc2tiX3B1bGwoc2tiLCBzaXplb2YoKmhkcikpOworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCisJc2tiX29ycGhhbihza2IpOworCisJcnQgPSBtcGxzX3JvdXRlX2lucHV0X3JjdShuZXQsIGRlYy5sYWJlbCk7CisJaWYgKCFydCkKKwkJZ290byBkcm9wOworCisJLyogRmluZCB0aGUgb3V0cHV0IGRldmljZSAqLworCW91dF9kZXYgPSByY3VfZGVyZWZlcmVuY2UocnQtPnJ0X2Rldik7CisJaWYgKCFtcGxzX291dHB1dF9wb3NzaWJsZShvdXRfZGV2KSkKKwkJZ290byBkcm9wOworCisJaWYgKHNrYl93YXJuX2lmX2xybyhza2IpKQorCQlnb3RvIGRyb3A7CisKKwlza2JfZm9yd2FyZF9jc3VtKHNrYik7CisKKwkvKiBWZXJpZnkgdHRsIGlzIHZhbGlkICovCisJaWYgKGRlYy50dGwgPD0gMSkKKwkJZ290byBkcm9wOworCWRlYy50dGwgLT0gMTsKKworCS8qIFZlcmlmeSB0aGUgZGVzdGluYXRpb24gY2FuIGhvbGQgdGhlIHBhY2tldCAqLworCW5ld19oZWFkZXJfc2l6ZSA9IG1wbHNfcnRfaGVhZGVyX3NpemUocnQpOworCW10dSA9IG1wbHNfZGV2X210dShvdXRfZGV2KTsKKwlpZiAobXBsc19wa3RfdG9vX2JpZyhza2IsIG10dSAtIG5ld19oZWFkZXJfc2l6ZSkpCisJCWdvdG8gZHJvcDsKKworCWhoX2xlbiA9IExMX1JFU0VSVkVEX1NQQUNFKG91dF9kZXYpOworCWlmICghb3V0X2Rldi0+aGVhZGVyX29wcykKKwkJaGhfbGVuID0gMDsKKworCS8qIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZm9yIHRoZSBoZWFkZXJzIGluIHRoZSBza2IgKi8KKwlpZiAoc2tiX2Nvdyhza2IsIGhoX2xlbiArIG5ld19oZWFkZXJfc2l6ZSkpCisJCWdvdG8gZHJvcDsKKworCXNrYi0+ZGV2ID0gb3V0X2RldjsKKwlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfTVBMU19VQyk7CisKKwlpZiAodW5saWtlbHkoIW5ld19oZWFkZXJfc2l6ZSAmJiBkZWMuYm9zKSkgeworCQkvKiBQZW51bHRpbWF0ZSBob3AgcG9wcGluZyAqLworCQlpZiAoIW1wbHNfZWdyZXNzKHJ0LCBza2IsIGRlYykpCisJCQlnb3RvIGRyb3A7CisJfSBlbHNlIHsKKwkJYm9vbCBib3M7CisJCWludCBpOworCQlza2JfcHVzaChza2IsIG5ld19oZWFkZXJfc2l6ZSk7CisJCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCQkvKiBQdXNoIHRoZSBuZXcgbGFiZWxzICovCisJCWhkciA9IG1wbHNfaGRyKHNrYik7CisJCWJvcyA9IGRlYy5ib3M7CisJCWZvciAoaSA9IHJ0LT5ydF9sYWJlbHMgLSAxOyBpID49IDA7IGktLSkgeworCQkJaGRyW2ldID0gbXBsc19lbnRyeV9lbmNvZGUocnQtPnJ0X2xhYmVsW2ldLCBkZWMudHRsLCAwLCBib3MpOworCQkJYm9zID0gZmFsc2U7CisJCX0KKwl9CisKKwllcnIgPSBuZWlnaF94bWl0KHJ0LT5ydF92aWFfdGFibGUsIG91dF9kZXYsIHJ0LT5ydF92aWEsIHNrYik7CisJaWYgKGVycikKKwkJbmV0X2RiZ19yYXRlbGltaXRlZCgiJXM6IHBhY2tldCB0cmFuc21pc3Npb24gZmFpbGVkOiAlZFxuIiwKKwkJCQkgICAgX19mdW5jX18sIGVycik7CisJcmV0dXJuIDA7CisKK2Ryb3A6CisJa2ZyZWVfc2tiKHNrYik7CisJcmV0dXJuIE5FVF9SWF9EUk9QOworfQorCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIG1wbHNfcGFja2V0X3R5cGUgX19yZWFkX21vc3RseSA9IHsKKwkudHlwZSA9IGNwdV90b19iZTE2KEVUSF9QX01QTFNfVUMpLAorCS5mdW5jID0gbXBsc19mb3J3YXJkLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHJ0bV9tcGxzX3BvbGljeVtSVEFfTUFYKzFdID0geworCVtSVEFfRFNUXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtSVEFfT0lGXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorfTsKKworc3RydWN0IG1wbHNfcm91dGVfY29uZmlnIHsKKwl1MzIJCXJjX3Byb3RvY29sOworCXUzMgkJcmNfaWZpbmRleDsKKwl1MTYJCXJjX3ZpYV90YWJsZTsKKwl1MTYJCXJjX3ZpYV9hbGVuOworCXU4CQlyY192aWFbTUFYX1ZJQV9BTEVOXTsKKwl1MzIJCXJjX2xhYmVsOworCXUzMgkJcmNfb3V0cHV0X2xhYmVsczsKKwl1MzIJCXJjX291dHB1dF9sYWJlbFtNQVhfTkVXX0xBQkVMU107CisJdTMyCQlyY19ubGZsYWdzOworCXN0cnVjdCBubF9pbmZvCXJjX25saW5mbzsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXBsc19yb3V0ZSAqbXBsc19ydF9hbGxvYyhzaXplX3QgYWxlbikKK3sKKwlzdHJ1Y3QgbXBsc19yb3V0ZSAqcnQ7CisKKwlydCA9IGt6YWxsb2Moc2l6ZW9mKCpydCkgKyBhbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAocnQpCisJCXJ0LT5ydF92aWFfYWxlbiA9IGFsZW47CisJcmV0dXJuIHJ0OworfQorCitzdGF0aWMgdm9pZCBtcGxzX3J0X2ZyZWUoc3RydWN0IG1wbHNfcm91dGUgKnJ0KQoreworCWlmIChydCkKKwkJa2ZyZWVfcmN1KHJ0LCBydF9yY3UpOworfQorCitzdGF0aWMgdm9pZCBtcGxzX25vdGlmeV9yb3V0ZShzdHJ1Y3QgbmV0ICpuZXQsIHVuc2lnbmVkIGluZGV4LAorCQkJICAgICAgc3RydWN0IG1wbHNfcm91dGUgKm9sZCwgc3RydWN0IG1wbHNfcm91dGUgKm5ldywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxoID0gaW5mbyA/IGluZm8tPm5saCA6IE5VTEw7CisJdW5zaWduZWQgcG9ydGlkID0gaW5mbyA/IGluZm8tPnBvcnRpZCA6IDA7CisJaW50IGV2ZW50ID0gbmV3ID8gUlRNX05FV1JPVVRFIDogUlRNX0RFTFJPVVRFOworCXN0cnVjdCBtcGxzX3JvdXRlICpydCA9IG5ldyA/IG5ldyA6IG9sZDsKKwl1bnNpZ25lZCBubG1fZmxhZ3MgPSAob2xkICYmIG5ldykgPyBOTE1fRl9SRVBMQUNFIDogMDsKKwkvKiBJZ25vcmUgcmVzZXJ2ZWQgbGFiZWxzIGZvciBub3cgKi8KKwlpZiAocnQgJiYgKGluZGV4ID49IDE2KSkKKwkJcnRtc2dfbGZpYihldmVudCwgaW5kZXgsIHJ0LCBubGgsIG5ldCwgcG9ydGlkLCBubG1fZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBtcGxzX3JvdXRlX3VwZGF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHVuc2lnbmVkIGluZGV4LAorCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG1wbHNfcm91dGUgKm5ldywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBtcGxzX3JvdXRlIF9fcmN1ICoqcGxhdGZvcm1fbGFiZWw7CisJc3RydWN0IG1wbHNfcm91dGUgKnJ0LCAqb2xkID0gTlVMTDsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlwbGF0Zm9ybV9sYWJlbCA9IHJ0bmxfZGVyZWZlcmVuY2UobmV0LT5tcGxzLnBsYXRmb3JtX2xhYmVsKTsKKwlydCA9IHJ0bmxfZGVyZWZlcmVuY2UocGxhdGZvcm1fbGFiZWxbaW5kZXhdKTsKKwlpZiAoIWRldiB8fCAocnQgJiYgKHJ0bmxfZGVyZWZlcmVuY2UocnQtPnJ0X2RldikgPT0gZGV2KSkpIHsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHBsYXRmb3JtX2xhYmVsW2luZGV4XSwgbmV3KTsKKwkJb2xkID0gcnQ7CisJfQorCisJbXBsc19ub3RpZnlfcm91dGUobmV0LCBpbmRleCwgb2xkLCBuZXcsIGluZm8pOworCisJLyogSWYgd2UgcmVtb3ZlZCBhIHJvdXRlIGZyZWUgaXQgbm93ICovCisJbXBsc19ydF9mcmVlKG9sZCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBmaW5kX2ZyZWVfbGFiZWwoc3RydWN0IG5ldCAqbmV0KQoreworCXN0cnVjdCBtcGxzX3JvdXRlIF9fcmN1ICoqcGxhdGZvcm1fbGFiZWw7CisJc2l6ZV90IHBsYXRmb3JtX2xhYmVsczsKKwl1bnNpZ25lZCBpbmRleDsKKworCXBsYXRmb3JtX2xhYmVsID0gcnRubF9kZXJlZmVyZW5jZShuZXQtPm1wbHMucGxhdGZvcm1fbGFiZWwpOworCXBsYXRmb3JtX2xhYmVscyA9IG5ldC0+bXBscy5wbGF0Zm9ybV9sYWJlbHM7CisJZm9yIChpbmRleCA9IDE2OyBpbmRleCA8IHBsYXRmb3JtX2xhYmVsczsgaW5kZXgrKykgeworCQlpZiAoIXJ0bmxfZGVyZWZlcmVuY2UocGxhdGZvcm1fbGFiZWxbaW5kZXhdKSkKKwkJCXJldHVybiBpbmRleDsKKwl9CisJcmV0dXJuIExBQkVMX05PVF9TUEVDSUZJRUQ7Cit9CisKK3N0YXRpYyBpbnQgbXBsc19yb3V0ZV9hZGQoc3RydWN0IG1wbHNfcm91dGVfY29uZmlnICpjZmcpCit7CisJc3RydWN0IG1wbHNfcm91dGUgX19yY3UgKipwbGF0Zm9ybV9sYWJlbDsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBjZmctPnJjX25saW5mby5ubF9uZXQ7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IE5VTEw7CisJc3RydWN0IG1wbHNfcm91dGUgKnJ0LCAqb2xkOworCXVuc2lnbmVkIGluZGV4OworCWludCBpOworCWludCBlcnIgPSAtRUlOVkFMOworCisJaW5kZXggPSBjZmctPnJjX2xhYmVsOworCisJLyogSWYgYSBsYWJlbCB3YXMgbm90IHNwZWNpZmllZCBkdXJpbmcgaW5zZXJ0IHBpY2sgb25lICovCisJaWYgKChpbmRleCA9PSBMQUJFTF9OT1RfU1BFQ0lGSUVEKSAmJgorCSAgICAoY2ZnLT5yY19ubGZsYWdzICYgTkxNX0ZfQ1JFQVRFKSkgeworCQlpbmRleCA9IGZpbmRfZnJlZV9sYWJlbChuZXQpOworCX0KKworCS8qIFRoZSBmaXJzdCAxNiBsYWJlbHMgYXJlIHJlc2VydmVkLCBhbmQgbWF5IG5vdCBiZSBzZXQgKi8KKwlpZiAoaW5kZXggPCAxNikKKwkJZ290byBlcnJvdXQ7CisKKwkvKiBUaGUgZnVsbCAyMCBiaXQgcmFuZ2UgbWF5IG5vdCBiZSBzdXBwb3J0ZWQuICovCisJaWYgKGluZGV4ID49IG5ldC0+bXBscy5wbGF0Zm9ybV9sYWJlbHMpCisJCWdvdG8gZXJyb3V0OworCisJLyogRW5zdXJlIG9ubHkgYSBzdXBwb3J0ZWQgbnVtYmVyIG9mIGxhYmVscyBhcmUgcHJlc2VudCAqLworCWlmIChjZmctPnJjX291dHB1dF9sYWJlbHMgPiBNQVhfTkVXX0xBQkVMUykKKwkJZ290byBlcnJvdXQ7CisKKwllcnIgPSAtRU5PREVWOworCWRldiA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBjZmctPnJjX2lmaW5kZXgpOworCWlmICghZGV2KQorCQlnb3RvIGVycm91dDsKKworCS8qIEZvciBub3cganVzdCBzdXBwb3J0IGV0aGVybmV0IGRldmljZXMgKi8KKwllcnIgPSAtRUlOVkFMOworCWlmICgoZGV2LT50eXBlICE9IEFSUEhSRF9FVEhFUikgJiYgKGRldi0+dHlwZSAhPSBBUlBIUkRfTE9PUEJBQ0spKQorCQlnb3RvIGVycm91dDsKKworCWVyciA9IC1FSU5WQUw7CisJaWYgKChjZmctPnJjX3ZpYV90YWJsZSA9PSBORUlHSF9MSU5LX1RBQkxFKSAmJgorCSAgICAoZGV2LT5hZGRyX2xlbiAhPSBjZmctPnJjX3ZpYV9hbGVuKSkKKwkJZ290byBlcnJvdXQ7CisKKwkvKiBBcHBlbmQgbWFrZXMgbm8gc2Vuc2Ugd2l0aCBtcGxzICovCisJZXJyID0gLUVPUE5PVFNVUFA7CisJaWYgKGNmZy0+cmNfbmxmbGFncyAmIE5MTV9GX0FQUEVORCkKKwkJZ290byBlcnJvdXQ7CisKKwllcnIgPSAtRUVYSVNUOworCXBsYXRmb3JtX2xhYmVsID0gcnRubF9kZXJlZmVyZW5jZShuZXQtPm1wbHMucGxhdGZvcm1fbGFiZWwpOworCW9sZCA9IHJ0bmxfZGVyZWZlcmVuY2UocGxhdGZvcm1fbGFiZWxbaW5kZXhdKTsKKwlpZiAoKGNmZy0+cmNfbmxmbGFncyAmIE5MTV9GX0VYQ0wpICYmIG9sZCkKKwkJZ290byBlcnJvdXQ7CisKKwllcnIgPSAtRUVYSVNUOworCWlmICghKGNmZy0+cmNfbmxmbGFncyAmIE5MTV9GX1JFUExBQ0UpICYmIG9sZCkKKwkJZ290byBlcnJvdXQ7CisKKwllcnIgPSAtRU5PRU5UOworCWlmICghKGNmZy0+cmNfbmxmbGFncyAmIE5MTV9GX0NSRUFURSkgJiYgIW9sZCkKKwkJZ290byBlcnJvdXQ7CisKKwllcnIgPSAtRU5PTUVNOworCXJ0ID0gbXBsc19ydF9hbGxvYyhjZmctPnJjX3ZpYV9hbGVuKTsKKwlpZiAoIXJ0KQorCQlnb3RvIGVycm91dDsKKworCXJ0LT5ydF9sYWJlbHMgPSBjZmctPnJjX291dHB1dF9sYWJlbHM7CisJZm9yIChpID0gMDsgaSA8IHJ0LT5ydF9sYWJlbHM7IGkrKykKKwkJcnQtPnJ0X2xhYmVsW2ldID0gY2ZnLT5yY19vdXRwdXRfbGFiZWxbaV07CisJcnQtPnJ0X3Byb3RvY29sID0gY2ZnLT5yY19wcm90b2NvbDsKKwlSQ1VfSU5JVF9QT0lOVEVSKHJ0LT5ydF9kZXYsIGRldik7CisJcnQtPnJ0X3ZpYV90YWJsZSA9IGNmZy0+cmNfdmlhX3RhYmxlOworCW1lbWNweShydC0+cnRfdmlhLCBjZmctPnJjX3ZpYSwgY2ZnLT5yY192aWFfYWxlbik7CisKKwltcGxzX3JvdXRlX3VwZGF0ZShuZXQsIGluZGV4LCBOVUxMLCBydCwgJmNmZy0+cmNfbmxpbmZvKTsKKworCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4gMDsKKworZXJyb3V0OgorCWlmIChkZXYpCisJCWRldl9wdXQoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1wbHNfcm91dGVfZGVsKHN0cnVjdCBtcGxzX3JvdXRlX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IGNmZy0+cmNfbmxpbmZvLm5sX25ldDsKKwl1bnNpZ25lZCBpbmRleDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCWluZGV4ID0gY2ZnLT5yY19sYWJlbDsKKworCS8qIFRoZSBmaXJzdCAxNiBsYWJlbHMgYXJlIHJlc2VydmVkLCBhbmQgbWF5IG5vdCBiZSByZW1vdmVkICovCisJaWYgKGluZGV4IDwgMTYpCisJCWdvdG8gZXJyb3V0OworCisJLyogVGhlIGZ1bGwgMjAgYml0IHJhbmdlIG1heSBub3QgYmUgc3VwcG9ydGVkICovCisJaWYgKGluZGV4ID49IG5ldC0+bXBscy5wbGF0Zm9ybV9sYWJlbHMpCisJCWdvdG8gZXJyb3V0OworCisJbXBsc19yb3V0ZV91cGRhdGUobmV0LCBpbmRleCwgTlVMTCwgTlVMTCwgJmNmZy0+cmNfbmxpbmZvKTsKKworCWVyciA9IDA7CitlcnJvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbXBsc19pZmRvd24oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXBsc19yb3V0ZSBfX3JjdSAqKnBsYXRmb3JtX2xhYmVsOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKKwl1bnNpZ25lZCBpbmRleDsKKworCXBsYXRmb3JtX2xhYmVsID0gcnRubF9kZXJlZmVyZW5jZShuZXQtPm1wbHMucGxhdGZvcm1fbGFiZWwpOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG5ldC0+bXBscy5wbGF0Zm9ybV9sYWJlbHM7IGluZGV4KyspIHsKKwkJc3RydWN0IG1wbHNfcm91dGUgKnJ0ID0gcnRubF9kZXJlZmVyZW5jZShwbGF0Zm9ybV9sYWJlbFtpbmRleF0pOworCQlpZiAoIXJ0KQorCQkJY29udGludWU7CisJCWlmIChydG5sX2RlcmVmZXJlbmNlKHJ0LT5ydF9kZXYpICE9IGRldikKKwkJCWNvbnRpbnVlOworCQlydC0+cnRfZGV2ID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXBsc19kZXZfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwKKwkJCSAgIHZvaWQgKnB0cikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmV0ZGV2X25vdGlmaWVyX2luZm9fdG9fZGV2KHB0cik7CisKKwlzd2l0Y2goZXZlbnQpIHsKKwljYXNlIE5FVERFVl9VTlJFR0lTVEVSOgorCQltcGxzX2lmZG93bihkZXYpOworCQlicmVhazsKKwl9CisJcmV0dXJuIE5PVElGWV9PSzsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBtcGxzX2Rldl9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IG1wbHNfZGV2X25vdGlmeSwKK307CisKK3N0YXRpYyBpbnQgbmxhX3B1dF92aWEoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJICAgICAgIHU4IHRhYmxlLCBjb25zdCB2b2lkICphZGRyLCBpbnQgYWxlbikKK3sKKwlzdGF0aWMgY29uc3QgaW50IHRhYmxlX3RvX2ZhbWlseVtORUlHSF9OUl9UQUJMRVMgKyAxXSA9IHsKKwkJQUZfSU5FVCwgQUZfSU5FVDYsIEFGX0RFQ25ldCwgQUZfUEFDS0VULAorCX07CisJc3RydWN0IG5sYXR0ciAqbmxhOworCXN0cnVjdCBydHZpYSAqdmlhOworCWludCBmYW1pbHkgPSBBRl9VTlNQRUM7CisKKwlubGEgPSBubGFfcmVzZXJ2ZShza2IsIFJUQV9WSUEsIGFsZW4gKyAyKTsKKwlpZiAoIW5sYSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmICh0YWJsZSA8PSBORUlHSF9OUl9UQUJMRVMpCisJCWZhbWlseSA9IHRhYmxlX3RvX2ZhbWlseVt0YWJsZV07CisKKwl2aWEgPSBubGFfZGF0YShubGEpOworCXZpYS0+cnR2aWFfZmFtaWx5ID0gZmFtaWx5OworCW1lbWNweSh2aWEtPnJ0dmlhX2FkZHIsIGFkZHIsIGFsZW4pOworCXJldHVybiAwOworfQorCitpbnQgbmxhX3B1dF9sYWJlbHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGF0dHJ0eXBlLAorCQkgICB1OCBsYWJlbHMsIGNvbnN0IHUzMiBsYWJlbFtdKQoreworCXN0cnVjdCBubGF0dHIgKm5sYTsKKwlzdHJ1Y3QgbXBsc19zaGltX2hkciAqbmxhX2xhYmVsOworCWJvb2wgYm9zOworCWludCBpOworCW5sYSA9IG5sYV9yZXNlcnZlKHNrYiwgYXR0cnR5cGUsIGxhYmVscyo0KTsKKwlpZiAoIW5sYSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCW5sYV9sYWJlbCA9IG5sYV9kYXRhKG5sYSk7CisJYm9zID0gdHJ1ZTsKKwlmb3IgKGkgPSBsYWJlbHMgLSAxOyBpID49IDA7IGktLSkgeworCQlubGFfbGFiZWxbaV0gPSBtcGxzX2VudHJ5X2VuY29kZShsYWJlbFtpXSwgMCwgMCwgYm9zKTsKKwkJYm9zID0gZmFsc2U7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBubGFfZ2V0X2xhYmVscyhjb25zdCBzdHJ1Y3QgbmxhdHRyICpubGEsCisJCSAgIHUzMiBtYXhfbGFiZWxzLCB1MzIgKmxhYmVscywgdTMyIGxhYmVsW10pCit7CisJdW5zaWduZWQgbGVuID0gbmxhX2xlbihubGEpOworCXVuc2lnbmVkIG5sYV9sYWJlbHM7CisJc3RydWN0IG1wbHNfc2hpbV9oZHIgKm5sYV9sYWJlbDsKKwlib29sIGJvczsKKwlpbnQgaTsKKworCS8qIGxlbiBuZWVkcyB0byBiZSBhbiBldmVuIG11bHRpcGxlIG9mIDQgKHRoZSBsYWJlbCBzaXplKSAqLworCWlmIChsZW4gJiAzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIExpbWl0IHRoZSBudW1iZXIgb2YgbmV3IGxhYmVscyBhbGxvd2VkICovCisJbmxhX2xhYmVscyA9IGxlbi80OworCWlmIChubGFfbGFiZWxzID4gbWF4X2xhYmVscykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlubGFfbGFiZWwgPSBubGFfZGF0YShubGEpOworCWJvcyA9IHRydWU7CisJZm9yIChpID0gbmxhX2xhYmVscyAtIDE7IGkgPj0gMDsgaS0tLCBib3MgPSBmYWxzZSkgeworCQlzdHJ1Y3QgbXBsc19lbnRyeV9kZWNvZGVkIGRlYzsKKwkJZGVjID0gbXBsc19lbnRyeV9kZWNvZGUobmxhX2xhYmVsICsgaSk7CisKKwkJLyogRW5zdXJlIHRoZSBib3R0b20gb2Ygc3RhY2sgZmxhZyBpcyBwcm9wZXJseSBzZXQKKwkJICogYW5kIHR0bCBhbmQgdGMgYXJlIGJvdGggY2xlYXIuCisJCSAqLworCQlpZiAoKGRlYy5ib3MgIT0gYm9zKSB8fCBkZWMudHRsIHx8IGRlYy50YykKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWxhYmVsW2ldID0gZGVjLmxhYmVsOworCX0KKwkqbGFiZWxzID0gbmxhX2xhYmVsczsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydG1fdG9fcm91dGVfY29uZmlnKHN0cnVjdCBza19idWZmICpza2IsICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJCSAgICAgICBzdHJ1Y3QgbXBsc19yb3V0ZV9jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgcnRtc2cgKnJ0bTsKKwlzdHJ1Y3QgbmxhdHRyICp0YltSVEFfTUFYKzFdOworCWludCBpbmRleDsKKwlpbnQgZXJyOworCisJZXJyID0gbmxtc2dfcGFyc2UobmxoLCBzaXplb2YoKnJ0bSksIHRiLCBSVEFfTUFYLCBydG1fbXBsc19wb2xpY3kpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm91dDsKKworCWVyciA9IC1FSU5WQUw7CisJcnRtID0gbmxtc2dfZGF0YShubGgpOworCW1lbXNldChjZmcsIDAsIHNpemVvZigqY2ZnKSk7CisKKwlpZiAocnRtLT5ydG1fZmFtaWx5ICE9IEFGX01QTFMpCisJCWdvdG8gZXJyb3V0OworCWlmIChydG0tPnJ0bV9kc3RfbGVuICE9IDIwKQorCQlnb3RvIGVycm91dDsKKwlpZiAocnRtLT5ydG1fc3JjX2xlbiAhPSAwKQorCQlnb3RvIGVycm91dDsKKwlpZiAocnRtLT5ydG1fdG9zICE9IDApCisJCWdvdG8gZXJyb3V0OworCWlmIChydG0tPnJ0bV90YWJsZSAhPSBSVF9UQUJMRV9NQUlOKQorCQlnb3RvIGVycm91dDsKKwkvKiBBbnkgdmFsdWUgaXMgYWNjZXB0YWJsZSBmb3IgcnRtX3Byb3RvY29sICovCisKKwkvKiBBcyBtcGxzIHVzZXMgZGVzdGluYXRpb24gc3BlY2lmaWMgYWRkcmVzc2VzCisJICogKG9yIHNvdXJjZSBzcGVjaWZpYyBhZGRyZXNzIGluIHRoZSBjYXNlIG9mIG11bHRpY2FzdCkKKwkgKiBhbGwgYWRkcmVzc2VzIGhhdmUgdW5pdmVyc2FsIHNjb3BlLgorCSAqLworCWlmIChydG0tPnJ0bV9zY29wZSAhPSBSVF9TQ09QRV9VTklWRVJTRSkKKwkJZ290byBlcnJvdXQ7CisJaWYgKHJ0bS0+cnRtX3R5cGUgIT0gUlROX1VOSUNBU1QpCisJCWdvdG8gZXJyb3V0OworCWlmIChydG0tPnJ0bV9mbGFncyAhPSAwKQorCQlnb3RvIGVycm91dDsKKworCWNmZy0+cmNfbGFiZWwJCT0gTEFCRUxfTk9UX1NQRUNJRklFRDsKKwljZmctPnJjX3Byb3RvY29sCT0gcnRtLT5ydG1fcHJvdG9jb2w7CisJY2ZnLT5yY19ubGZsYWdzCQk9IG5saC0+bmxtc2dfZmxhZ3M7CisJY2ZnLT5yY19ubGluZm8ucG9ydGlkCT0gTkVUTElOS19DQihza2IpLnBvcnRpZDsKKwljZmctPnJjX25saW5mby5ubGgJPSBubGg7CisJY2ZnLT5yY19ubGluZm8ubmxfbmV0CT0gc29ja19uZXQoc2tiLT5zayk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPD0gUlRBX01BWDsgaW5kZXgrKykgeworCQlzdHJ1Y3QgbmxhdHRyICpubGEgPSB0YltpbmRleF07CisJCWlmICghbmxhKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoKGluZGV4KSB7CisJCWNhc2UgUlRBX09JRjoKKwkJCWNmZy0+cmNfaWZpbmRleCA9IG5sYV9nZXRfdTMyKG5sYSk7CisJCQlicmVhazsKKwkJY2FzZSBSVEFfTkVXRFNUOgorCQkJaWYgKG5sYV9nZXRfbGFiZWxzKG5sYSwgTUFYX05FV19MQUJFTFMsCisJCQkJCSAgICZjZmctPnJjX291dHB1dF9sYWJlbHMsCisJCQkJCSAgIGNmZy0+cmNfb3V0cHV0X2xhYmVsKSkKKwkJCQlnb3RvIGVycm91dDsKKwkJCWJyZWFrOworCQljYXNlIFJUQV9EU1Q6CisJCXsKKwkJCXUzMiBsYWJlbF9jb3VudDsKKwkJCWlmIChubGFfZ2V0X2xhYmVscyhubGEsIDEsICZsYWJlbF9jb3VudCwKKwkJCQkJICAgJmNmZy0+cmNfbGFiZWwpKQorCQkJCWdvdG8gZXJyb3V0OworCisJCQkvKiBUaGUgZmlyc3QgMTYgbGFiZWxzIGFyZSByZXNlcnZlZCwgYW5kIG1heSBub3QgYmUgc2V0ICovCisJCQlpZiAoY2ZnLT5yY19sYWJlbCA8IDE2KQorCQkJCWdvdG8gZXJyb3V0OworCisJCQlicmVhazsKKwkJfQorCQljYXNlIFJUQV9WSUE6CisJCXsKKwkJCXN0cnVjdCBydHZpYSAqdmlhID0gbmxhX2RhdGEobmxhKTsKKwkJCWlmIChubGFfbGVuKG5sYSkgPCBvZmZzZXRvZihzdHJ1Y3QgcnR2aWEsIHJ0dmlhX2FkZHIpKQorCQkJCWdvdG8gZXJyb3V0OworCQkJY2ZnLT5yY192aWFfYWxlbiAgID0gbmxhX2xlbihubGEpIC0KKwkJCQlvZmZzZXRvZihzdHJ1Y3QgcnR2aWEsIHJ0dmlhX2FkZHIpOworCQkJaWYgKGNmZy0+cmNfdmlhX2FsZW4gPiBNQVhfVklBX0FMRU4pCisJCQkJZ290byBlcnJvdXQ7CisKKwkJCS8qIFZhbGlkYXRlIHRoZSBhZGRyZXNzIGZhbWlseSAqLworCQkJc3dpdGNoKHZpYS0+cnR2aWFfZmFtaWx5KSB7CisJCQljYXNlIEFGX1BBQ0tFVDoKKwkJCQljZmctPnJjX3ZpYV90YWJsZSA9IE5FSUdIX0xJTktfVEFCTEU7CisJCQkJYnJlYWs7CisJCQljYXNlIEFGX0lORVQ6CisJCQkJY2ZnLT5yY192aWFfdGFibGUgPSBORUlHSF9BUlBfVEFCTEU7CisJCQkJaWYgKGNmZy0+cmNfdmlhX2FsZW4gIT0gNCkKKwkJCQkJZ290byBlcnJvdXQ7CisJCQkJYnJlYWs7CisJCQljYXNlIEFGX0lORVQ2OgorCQkJCWNmZy0+cmNfdmlhX3RhYmxlID0gTkVJR0hfTkRfVEFCTEU7CisJCQkJaWYgKGNmZy0+cmNfdmlhX2FsZW4gIT0gMTYpCisJCQkJCWdvdG8gZXJyb3V0OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkvKiBVbnN1cHBvcnRlZCBhZGRyZXNzIGZhbWlseSAqLworCQkJCWdvdG8gZXJyb3V0OworCQkJfQorCisJCQltZW1jcHkoY2ZnLT5yY192aWEsIHZpYS0+cnR2aWFfYWRkciwgY2ZnLT5yY192aWFfYWxlbik7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJLyogVW5zdXBwb3J0ZWQgYXR0cmlidXRlICovCisJCQlnb3RvIGVycm91dDsKKwkJfQorCX0KKworCWVyciA9IDA7CitlcnJvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtcGxzX3J0bV9kZWxyb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkKK3sKKwlzdHJ1Y3QgbXBsc19yb3V0ZV9jb25maWcgY2ZnOworCWludCBlcnI7CisKKwllcnIgPSBydG1fdG9fcm91dGVfY29uZmlnKHNrYiwgbmxoLCAmY2ZnKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBtcGxzX3JvdXRlX2RlbCgmY2ZnKTsKK30KKworCitzdGF0aWMgaW50IG1wbHNfcnRtX25ld3JvdXRlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQoreworCXN0cnVjdCBtcGxzX3JvdXRlX2NvbmZpZyBjZmc7CisJaW50IGVycjsKKworCWVyciA9IHJ0bV90b19yb3V0ZV9jb25maWcoc2tiLCBubGgsICZjZmcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIG1wbHNfcm91dGVfYWRkKCZjZmcpOworfQorCitzdGF0aWMgaW50IG1wbHNfZHVtcF9yb3V0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgcG9ydGlkLCB1MzIgc2VxLCBpbnQgZXZlbnQsCisJCQkgICB1MzIgbGFiZWwsIHN0cnVjdCBtcGxzX3JvdXRlICpydCwgaW50IGZsYWdzKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJc3RydWN0IHJ0bXNnICpydG07CisKKwlubGggPSBubG1zZ19wdXQoc2tiLCBwb3J0aWQsIHNlcSwgZXZlbnQsIHNpemVvZigqcnRtKSwgZmxhZ3MpOworCWlmIChubGggPT0gTlVMTCkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCXJ0bSA9IG5sbXNnX2RhdGEobmxoKTsKKwlydG0tPnJ0bV9mYW1pbHkgPSBBRl9NUExTOworCXJ0bS0+cnRtX2RzdF9sZW4gPSAyMDsKKwlydG0tPnJ0bV9zcmNfbGVuID0gMDsKKwlydG0tPnJ0bV90b3MgPSAwOworCXJ0bS0+cnRtX3RhYmxlID0gUlRfVEFCTEVfTUFJTjsKKwlydG0tPnJ0bV9wcm90b2NvbCA9IHJ0LT5ydF9wcm90b2NvbDsKKwlydG0tPnJ0bV9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOworCXJ0bS0+cnRtX3R5cGUgPSBSVE5fVU5JQ0FTVDsKKwlydG0tPnJ0bV9mbGFncyA9IDA7CisKKwlpZiAocnQtPnJ0X2xhYmVscyAmJgorCSAgICBubGFfcHV0X2xhYmVscyhza2IsIFJUQV9ORVdEU1QsIHJ0LT5ydF9sYWJlbHMsIHJ0LT5ydF9sYWJlbCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X3ZpYShza2IsIHJ0LT5ydF92aWFfdGFibGUsIHJ0LT5ydF92aWEsIHJ0LT5ydF92aWFfYWxlbikpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWRldiA9IHJ0bmxfZGVyZWZlcmVuY2UocnQtPnJ0X2Rldik7CisJaWYgKGRldiAmJiBubGFfcHV0X3UzMihza2IsIFJUQV9PSUYsIGRldi0+aWZpbmRleCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChubGFfcHV0X2xhYmVscyhza2IsIFJUQV9EU1QsIDEsICZsYWJlbCkpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJbmxtc2dfZW5kKHNrYiwgbmxoKTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCBtcGxzX2R1bXBfcm91dGVzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKK3sKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChza2ItPnNrKTsKKwlzdHJ1Y3QgbXBsc19yb3V0ZSBfX3JjdSAqKnBsYXRmb3JtX2xhYmVsOworCXNpemVfdCBwbGF0Zm9ybV9sYWJlbHM7CisJdW5zaWduZWQgaW50IGluZGV4OworCisJQVNTRVJUX1JUTkwoKTsKKworCWluZGV4ID0gY2ItPmFyZ3NbMF07CisJaWYgKGluZGV4IDwgMTYpCisJCWluZGV4ID0gMTY7CisKKwlwbGF0Zm9ybV9sYWJlbCA9IHJ0bmxfZGVyZWZlcmVuY2UobmV0LT5tcGxzLnBsYXRmb3JtX2xhYmVsKTsKKwlwbGF0Zm9ybV9sYWJlbHMgPSBuZXQtPm1wbHMucGxhdGZvcm1fbGFiZWxzOworCWZvciAoOyBpbmRleCA8IHBsYXRmb3JtX2xhYmVsczsgaW5kZXgrKykgeworCQlzdHJ1Y3QgbXBsc19yb3V0ZSAqcnQ7CisJCXJ0ID0gcnRubF9kZXJlZmVyZW5jZShwbGF0Zm9ybV9sYWJlbFtpbmRleF0pOworCQlpZiAoIXJ0KQorCQkJY29udGludWU7CisKKwkJaWYgKG1wbHNfZHVtcF9yb3V0ZShza2IsIE5FVExJTktfQ0IoY2ItPnNrYikucG9ydGlkLAorCQkJCSAgICBjYi0+bmxoLT5ubG1zZ19zZXEsIFJUTV9ORVdST1VURSwKKwkJCQkgICAgaW5kZXgsIHJ0LCBOTE1fRl9NVUxUSSkgPCAwKQorCQkJYnJlYWs7CisJfQorCWNiLT5hcmdzWzBdID0gaW5kZXg7CisKKwlyZXR1cm4gc2tiLT5sZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGxmaWJfbmxtc2dfc2l6ZShzdHJ1Y3QgbXBsc19yb3V0ZSAqcnQpCit7CisJc2l6ZV90IHBheWxvYWQgPQorCQlOTE1TR19BTElHTihzaXplb2Yoc3RydWN0IHJ0bXNnKSkKKwkJKyBubGFfdG90YWxfc2l6ZSgyICsgcnQtPnJ0X3ZpYV9hbGVuKQkvKiBSVEFfVklBICovCisJCSsgbmxhX3RvdGFsX3NpemUoNCk7CQkJLyogUlRBX0RTVCAqLworCWlmIChydC0+cnRfbGFiZWxzKQkJCQkvKiBSVEFfTkVXRFNUICovCisJCXBheWxvYWQgKz0gbmxhX3RvdGFsX3NpemUocnQtPnJ0X2xhYmVscyAqIDQpOworCWlmIChydC0+cnRfZGV2KQkJCQkJLyogUlRBX09JRiAqLworCQlwYXlsb2FkICs9IG5sYV90b3RhbF9zaXplKDQpOworCXJldHVybiBwYXlsb2FkOworfQorCitzdGF0aWMgdm9pZCBydG1zZ19sZmliKGludCBldmVudCwgdTMyIGxhYmVsLCBzdHJ1Y3QgbXBsc19yb3V0ZSAqcnQsCisJCSAgICAgICBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IG5ldCAqbmV0LCB1MzIgcG9ydGlkLAorCQkgICAgICAgdW5zaWduZWQgaW50IG5sbV9mbGFncykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBzZXEgPSBubGggPyBubGgtPm5sbXNnX3NlcSA6IDA7CisJaW50IGVyciA9IC1FTk9CVUZTOworCisJc2tiID0gbmxtc2dfbmV3KGxmaWJfbmxtc2dfc2l6ZShydCksIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gTlVMTCkKKwkJZ290byBlcnJvdXQ7CisKKwllcnIgPSBtcGxzX2R1bXBfcm91dGUoc2tiLCBwb3J0aWQsIHNlcSwgZXZlbnQsIGxhYmVsLCBydCwgbmxtX2ZsYWdzKTsKKwlpZiAoZXJyIDwgMCkgeworCQkvKiAtRU1TR1NJWkUgaW1wbGllcyBCVUcgaW4gbGZpYl9ubG1zZ19zaXplICovCisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihza2IpOworCQlnb3RvIGVycm91dDsKKwl9CisJcnRubF9ub3RpZnkoc2tiLCBuZXQsIHBvcnRpZCwgUlROTEdSUF9NUExTX1JPVVRFLCBubGgsIEdGUF9LRVJORUwpOworCisJcmV0dXJuOworZXJyb3V0OgorCWlmIChlcnIgPCAwKQorCQlydG5sX3NldF9za19lcnIobmV0LCBSVE5MR1JQX01QTFNfUk9VVEUsIGVycik7Cit9CisKK3N0YXRpYyBpbnQgcmVzaXplX3BsYXRmb3JtX2xhYmVsX3RhYmxlKHN0cnVjdCBuZXQgKm5ldCwgc2l6ZV90IGxpbWl0KQoreworCXNpemVfdCBzaXplID0gc2l6ZW9mKHN0cnVjdCBtcGxzX3JvdXRlICopICogbGltaXQ7CisJc2l6ZV90IG9sZF9saW1pdDsKKwlzaXplX3QgY3Bfc2l6ZTsKKwlzdHJ1Y3QgbXBsc19yb3V0ZSBfX3JjdSAqKmxhYmVscyA9IE5VTEwsICoqb2xkOworCXN0cnVjdCBtcGxzX3JvdXRlICpydDAgPSBOVUxMLCAqcnQyID0gTlVMTDsKKwl1bnNpZ25lZCBpbmRleDsKKworCWlmIChzaXplKSB7CisJCWxhYmVscyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpOworCQlpZiAoIWxhYmVscykKKwkJCWxhYmVscyA9IHZ6YWxsb2Moc2l6ZSk7CisKKwkJaWYgKCFsYWJlbHMpCisJCQlnb3RvIG5vbGFiZWxzOworCX0KKworCS8qIEluIGNhc2UgdGhlIHByZWRlZmluZWQgbGFiZWxzIG5lZWQgdG8gYmUgcG9wdWxhdGVkICovCisJaWYgKGxpbWl0ID4gTEFCRUxfSVBWNF9FWFBMSUNJVF9OVUxMKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpsbyA9IG5ldC0+bG9vcGJhY2tfZGV2OworCQlydDAgPSBtcGxzX3J0X2FsbG9jKGxvLT5hZGRyX2xlbik7CisJCWlmICghcnQwKQorCQkJZ290byBub3J0MDsKKwkJUkNVX0lOSVRfUE9JTlRFUihydDAtPnJ0X2RldiwgbG8pOworCQlydDAtPnJ0X3Byb3RvY29sID0gUlRQUk9UX0tFUk5FTDsKKwkJcnQwLT5ydF92aWFfdGFibGUgPSBORUlHSF9MSU5LX1RBQkxFOworCQltZW1jcHkocnQwLT5ydF92aWEsIGxvLT5kZXZfYWRkciwgbG8tPmFkZHJfbGVuKTsKKwl9CisJaWYgKGxpbWl0ID4gTEFCRUxfSVBWNl9FWFBMSUNJVF9OVUxMKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpsbyA9IG5ldC0+bG9vcGJhY2tfZGV2OworCQlydDIgPSBtcGxzX3J0X2FsbG9jKGxvLT5hZGRyX2xlbik7CisJCWlmICghcnQyKQorCQkJZ290byBub3J0MjsKKwkJUkNVX0lOSVRfUE9JTlRFUihydDItPnJ0X2RldiwgbG8pOworCQlydDItPnJ0X3Byb3RvY29sID0gUlRQUk9UX0tFUk5FTDsKKwkJcnQyLT5ydF92aWFfdGFibGUgPSBORUlHSF9MSU5LX1RBQkxFOworCQltZW1jcHkocnQyLT5ydF92aWEsIGxvLT5kZXZfYWRkciwgbG8tPmFkZHJfbGVuKTsKKwl9CisKKwlydG5sX2xvY2soKTsKKwkvKiBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdGFibGUgKi8KKwlvbGQgPSBydG5sX2RlcmVmZXJlbmNlKG5ldC0+bXBscy5wbGF0Zm9ybV9sYWJlbCk7CisJb2xkX2xpbWl0ID0gbmV0LT5tcGxzLnBsYXRmb3JtX2xhYmVsczsKKworCS8qIEZyZWUgYW55IGxhYmVscyBiZXlvbmQgdGhlIG5ldyB0YWJsZSAqLworCWZvciAoaW5kZXggPSBsaW1pdDsgaW5kZXggPCBvbGRfbGltaXQ7IGluZGV4KyspCisJCW1wbHNfcm91dGVfdXBkYXRlKG5ldCwgaW5kZXgsIE5VTEwsIE5VTEwsIE5VTEwpOworCisJLyogQ29weSBvdmVyIHRoZSBvbGQgbGFiZWxzICovCisJY3Bfc2l6ZSA9IHNpemU7CisJaWYgKG9sZF9saW1pdCA8IGxpbWl0KQorCQljcF9zaXplID0gb2xkX2xpbWl0ICogc2l6ZW9mKHN0cnVjdCBtcGxzX3JvdXRlICopOworCisJbWVtY3B5KGxhYmVscywgb2xkLCBjcF9zaXplKTsKKworCS8qIElmIG5lZWRlZCBzZXQgdGhlIHByZWRlZmluZWQgbGFiZWxzICovCisJaWYgKChvbGRfbGltaXQgPD0gTEFCRUxfSVBWNl9FWFBMSUNJVF9OVUxMKSAmJgorCSAgICAobGltaXQgPiBMQUJFTF9JUFY2X0VYUExJQ0lUX05VTEwpKSB7CisJCVJDVV9JTklUX1BPSU5URVIobGFiZWxzW0xBQkVMX0lQVjZfRVhQTElDSVRfTlVMTF0sIHJ0Mik7CisJCXJ0MiA9IE5VTEw7CisJfQorCisJaWYgKChvbGRfbGltaXQgPD0gTEFCRUxfSVBWNF9FWFBMSUNJVF9OVUxMKSAmJgorCSAgICAobGltaXQgPiBMQUJFTF9JUFY0X0VYUExJQ0lUX05VTEwpKSB7CisJCVJDVV9JTklUX1BPSU5URVIobGFiZWxzW0xBQkVMX0lQVjRfRVhQTElDSVRfTlVMTF0sIHJ0MCk7CisJCXJ0MCA9IE5VTEw7CisJfQorCisJLyogVXBkYXRlIHRoZSBnbG9iYWwgcG9pbnRlcnMgKi8KKwluZXQtPm1wbHMucGxhdGZvcm1fbGFiZWxzID0gbGltaXQ7CisJcmN1X2Fzc2lnbl9wb2ludGVyKG5ldC0+bXBscy5wbGF0Zm9ybV9sYWJlbCwgbGFiZWxzKTsKKworCXJ0bmxfdW5sb2NrKCk7CisKKwltcGxzX3J0X2ZyZWUocnQyKTsKKwltcGxzX3J0X2ZyZWUocnQwKTsKKworCWlmIChvbGQpIHsKKwkJc3luY2hyb25pemVfcmN1KCk7CisJCWt2ZnJlZShvbGQpOworCX0KKwlyZXR1cm4gMDsKKworbm9ydDI6CisJbXBsc19ydF9mcmVlKHJ0MCk7Citub3J0MDoKKwlrdmZyZWUobGFiZWxzKTsKK25vbGFiZWxzOgorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IG1wbHNfcGxhdGZvcm1fbGFiZWxzKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQkJdm9pZCBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IG5ldCAqbmV0ID0gdGFibGUtPmRhdGE7CisJaW50IHBsYXRmb3JtX2xhYmVscyA9IG5ldC0+bXBscy5wbGF0Zm9ybV9sYWJlbHM7CisJaW50IHJldDsKKwlzdHJ1Y3QgY3RsX3RhYmxlIHRtcCA9IHsKKwkJLnByb2NuYW1lCT0gdGFibGUtPnByb2NuYW1lLAorCQkuZGF0YQkJPSAmcGxhdGZvcm1fbGFiZWxzLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSB0YWJsZS0+bW9kZSwKKwkJLmV4dHJhMQkJPSAmemVybywKKwkJLmV4dHJhMgkJPSAmbGFiZWxfbGltaXQsCisJfTsKKworCXJldCA9IHByb2NfZG9pbnR2ZWNfbWlubWF4KCZ0bXAsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCisJaWYgKHdyaXRlICYmIHJldCA9PSAwKQorCQlyZXQgPSByZXNpemVfcGxhdGZvcm1fbGFiZWxfdGFibGUobmV0LCBwbGF0Zm9ybV9sYWJlbHMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgbXBsc190YWJsZVtdID0geworCXsKKwkJLnByb2NuYW1lCT0gInBsYXRmb3JtX2xhYmVscyIsCisJCS5kYXRhCQk9IE5VTEwsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBtcGxzX3BsYXRmb3JtX2xhYmVscywKKwl9LAorCXsgfQorfTsKKworc3RhdGljIGludCBtcGxzX25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZTsKKworCW5ldC0+bXBscy5wbGF0Zm9ybV9sYWJlbHMgPSAwOworCW5ldC0+bXBscy5wbGF0Zm9ybV9sYWJlbCA9IE5VTEw7CisKKwl0YWJsZSA9IGttZW1kdXAobXBsc190YWJsZSwgc2l6ZW9mKG1wbHNfdGFibGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAodGFibGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0YWJsZVswXS5kYXRhID0gbmV0OworCW5ldC0+bXBscy5jdGwgPSByZWdpc3Rlcl9uZXRfc3lzY3RsKG5ldCwgIm5ldC9tcGxzIiwgdGFibGUpOworCWlmIChuZXQtPm1wbHMuY3RsID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1wbHNfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQoreworCXN0cnVjdCBtcGxzX3JvdXRlIF9fcmN1ICoqcGxhdGZvcm1fbGFiZWw7CisJc2l6ZV90IHBsYXRmb3JtX2xhYmVsczsKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZTsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwl0YWJsZSA9IG5ldC0+bXBscy5jdGwtPmN0bF90YWJsZV9hcmc7CisJdW5yZWdpc3Rlcl9uZXRfc3lzY3RsX3RhYmxlKG5ldC0+bXBscy5jdGwpOworCWtmcmVlKHRhYmxlKTsKKworCS8qIEFuIHJjdSBncmFjZSBwZXJpb2QgaGFzIHBhc3NlZCBzaW5jZSB0aGVyZSB3YXMgYSBkZXZpY2UgaW4KKwkgKiB0aGUgbmV0d29yayBuYW1lc3BhY2UgKGFuZCB0aHVzIHRoZSBsYXN0IGluIGZsaWdodCBwYWNrZXQpCisJICogbGVmdCB0aGlzIG5ldHdvcmsgbmFtZXNwYWNlLiAgVGhpcyBpcyBiZWNhdXNlCisJICogdW5yZWdpc3Rlcl9uZXRkZXZpY2VfbWFueSBhbmQgbmV0ZGV2X3J1bl90b2RvIGhhcyBjb21wbGV0ZWQKKwkgKiBmb3IgZWFjaCBuZXR3b3JrIGRldmljZSB0aGF0IHdhcyBpbiB0aGlzIG5ldHdvcmsgbmFtZXNwYWNlLgorCSAqCisJICogQXMgc3VjaCBubyBhZGRpdGlvbmFsIHJjdSBzeW5jaHJvbml6YXRpb24gaXMgbmVjZXNzYXJ5IHdoZW4KKwkgKiBmcmVlaW5nIHRoZSBwbGF0Zm9ybV9sYWJlbCB0YWJsZS4KKwkgKi8KKwlydG5sX2xvY2soKTsKKwlwbGF0Zm9ybV9sYWJlbCA9IHJ0bmxfZGVyZWZlcmVuY2UobmV0LT5tcGxzLnBsYXRmb3JtX2xhYmVsKTsKKwlwbGF0Zm9ybV9sYWJlbHMgPSBuZXQtPm1wbHMucGxhdGZvcm1fbGFiZWxzOworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHBsYXRmb3JtX2xhYmVsczsgaW5kZXgrKykgeworCQlzdHJ1Y3QgbXBsc19yb3V0ZSAqcnQgPSBydG5sX2RlcmVmZXJlbmNlKHBsYXRmb3JtX2xhYmVsW2luZGV4XSk7CisJCVJDVV9JTklUX1BPSU5URVIocGxhdGZvcm1fbGFiZWxbaW5kZXhdLCBOVUxMKTsKKwkJbXBsc19ydF9mcmVlKHJ0KTsKKwl9CisJcnRubF91bmxvY2soKTsKKworCWt2ZnJlZShwbGF0Zm9ybV9sYWJlbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgbXBsc19uZXRfb3BzID0geworCS5pbml0ID0gbXBsc19uZXRfaW5pdCwKKwkuZXhpdCA9IG1wbHNfbmV0X2V4aXQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtcGxzX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgbXBsc19zaGltX2hkcikgIT0gNCk7CisKKwllcnIgPSByZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZtcGxzX25ldF9vcHMpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZtcGxzX2Rldl9ub3RpZmllcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9wZXJuZXQ7CisKKwlkZXZfYWRkX3BhY2soJm1wbHNfcGFja2V0X3R5cGUpOworCisJcnRubF9yZWdpc3RlcihQRl9NUExTLCBSVE1fTkVXUk9VVEUsIG1wbHNfcnRtX25ld3JvdXRlLCBOVUxMLCBOVUxMKTsKKwlydG5sX3JlZ2lzdGVyKFBGX01QTFMsIFJUTV9ERUxST1VURSwgbXBsc19ydG1fZGVscm91dGUsIE5VTEwsIE5VTEwpOworCXJ0bmxfcmVnaXN0ZXIoUEZfTVBMUywgUlRNX0dFVFJPVVRFLCBOVUxMLCBtcGxzX2R1bXBfcm91dGVzLCBOVUxMKTsKKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7CisKK291dF91bnJlZ2lzdGVyX3Blcm5ldDoKKwl1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJm1wbHNfbmV0X29wcyk7CisJZ290byBvdXQ7Cit9Cittb2R1bGVfaW5pdChtcGxzX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXBsc19leGl0KHZvaWQpCit7CisJcnRubF91bnJlZ2lzdGVyX2FsbChQRl9NUExTKTsKKwlkZXZfcmVtb3ZlX3BhY2soJm1wbHNfcGFja2V0X3R5cGUpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZtcGxzX2Rldl9ub3RpZmllcik7CisJdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZtcGxzX25ldF9vcHMpOworfQorbW9kdWxlX2V4aXQobXBsc19leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJNdWx0aVByb3RvY29sIExhYmVsIFN3aXRjaGluZyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTX05FVFBST1RPKFBGX01QTFMpOwpkaWZmIC0tZ2l0IGEvbmV0L21wbHMvaW50ZXJuYWwuaCBiL25ldC9tcGxzL2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI2ZGU5MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9tcGxzL2ludGVybmFsLmgKQEAgLTAsMCArMSw1OSBAQAorI2lmbmRlZiBNUExTX0lOVEVSTkFMX0gKKyNkZWZpbmUgTVBMU19JTlRFUk5BTF9ICisKKyNkZWZpbmUgTEFCRUxfSVBWNF9FWFBMSUNJVF9OVUxMCTAgLyogUkZDMzAzMiAqLworI2RlZmluZSBMQUJFTF9ST1VURVJfQUxFUlRfTEFCRUwJMSAvKiBSRkMzMDMyICovCisjZGVmaW5lIExBQkVMX0lQVjZfRVhQTElDSVRfTlVMTAkyIC8qIFJGQzMwMzIgKi8KKyNkZWZpbmUgTEFCRUxfSU1QTElDSVRfTlVMTAkJMyAvKiBSRkMzMDMyICovCisjZGVmaW5lIExBQkVMX0VOVFJPUFlfSU5ESUNBVE9SCQk3IC8qIFJGQzY3OTAgKi8KKyNkZWZpbmUgTEFCRUxfR0FMCQkJMTMgLyogUkZDNTU4NiAqLworI2RlZmluZSBMQUJFTF9PQU1fQUxFUlQJCQkxNCAvKiBSRkMzNDI5ICovCisjZGVmaW5lIExBQkVMX0VYVEVOU0lPTgkJCTE1IC8qIFJGQzcyNzQgKi8KKworCitzdHJ1Y3QgbXBsc19zaGltX2hkciB7CisJX19iZTMyIGxhYmVsX3N0YWNrX2VudHJ5OworfTsKKworc3RydWN0IG1wbHNfZW50cnlfZGVjb2RlZCB7CisJdTMyIGxhYmVsOworCXU4IHR0bDsKKwl1OCB0YzsKKwl1OCBib3M7Cit9OworCitzdHJ1Y3Qgc2tfYnVmZjsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXBsc19zaGltX2hkciAqbXBsc19oZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gKHN0cnVjdCBtcGxzX3NoaW1faGRyICopc2tiX25ldHdvcmtfaGVhZGVyKHNrYik7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG1wbHNfc2hpbV9oZHIgbXBsc19lbnRyeV9lbmNvZGUodTMyIGxhYmVsLCB1bnNpZ25lZCB0dGwsIHVuc2lnbmVkIHRjLCBib29sIGJvcykKK3sKKwlzdHJ1Y3QgbXBsc19zaGltX2hkciByZXN1bHQ7CisJcmVzdWx0LmxhYmVsX3N0YWNrX2VudHJ5ID0KKwkJY3B1X3RvX2JlMzIoKGxhYmVsIDw8IE1QTFNfTFNfTEFCRUxfU0hJRlQpIHwKKwkJCSAgICAodGMgPDwgTVBMU19MU19UQ19TSElGVCkgfAorCQkJICAgIChib3MgPyAoMSA8PCBNUExTX0xTX1NfU0hJRlQpIDogMCkgfAorCQkJICAgICh0dGwgPDwgTVBMU19MU19UVExfU0hJRlQpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtcGxzX2VudHJ5X2RlY29kZWQgbXBsc19lbnRyeV9kZWNvZGUoc3RydWN0IG1wbHNfc2hpbV9oZHIgKmhkcikKK3sKKwlzdHJ1Y3QgbXBsc19lbnRyeV9kZWNvZGVkIHJlc3VsdDsKKwl1bnNpZ25lZCBlbnRyeSA9IGJlMzJfdG9fY3B1KGhkci0+bGFiZWxfc3RhY2tfZW50cnkpOworCisJcmVzdWx0LmxhYmVsID0gKGVudHJ5ICYgTVBMU19MU19MQUJFTF9NQVNLKSA+PiBNUExTX0xTX0xBQkVMX1NISUZUOworCXJlc3VsdC50dGwgPSAoZW50cnkgJiBNUExTX0xTX1RUTF9NQVNLKSA+PiBNUExTX0xTX1RUTF9TSElGVDsKKwlyZXN1bHQudGMgPSAgKGVudHJ5ICYgTVBMU19MU19UQ19NQVNLKSA+PiBNUExTX0xTX1RDX1NISUZUOworCXJlc3VsdC5ib3MgPSAoZW50cnkgJiBNUExTX0xTX1NfTUFTSykgPj4gTVBMU19MU19TX1NISUZUOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG5sYV9wdXRfbGFiZWxzKHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRydHlwZSwgIHU4IGxhYmVscywgY29uc3QgdTMyIGxhYmVsW10pOworaW50IG5sYV9nZXRfbGFiZWxzKGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSwgdTMyIG1heF9sYWJlbHMsIHUzMiAqbGFiZWxzLCB1MzIgbGFiZWxbXSk7CisKKyNlbmRpZiAvKiBNUExTX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCBiMDI2NjBmLi5mNzBlMzRhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL0tjb25maWcKKysrIGIvbmV0L25ldGZpbHRlci9LY29uZmlnCkBAIC00MzgsOCArNDM4LDEwIEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuCiAKK2lmIE5GX1RBQkxFUworCiBjb25maWcgTkZfVEFCTEVTX0lORVQKLQlkZXBlbmRzIG9uIE5GX1RBQkxFUyAmJiBJUFY2CisJZGVwZW5kcyBvbiBJUFY2CiAJc2VsZWN0IE5GX1RBQkxFU19JUFY0CiAJc2VsZWN0IE5GX1RBQkxFU19JUFY2CiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgbWl4ZWQgSVB2NC9JUHY2IHRhYmxlcyBzdXBwb3J0IgpAQCAtNDQ3LDIxICs0NDksMTggQEAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgYSBtaXhlZCBJUHY0L0lQdjYgImluZXQiIHRhYmxlLgogCiBjb25maWcgTkZUX0VYVEhEUgotCWRlcGVuZHMgb24gTkZfVEFCTEVTCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgSVB2NiBleHRoZHIgbW9kdWxlIgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlICJleHRoZHIiIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIHVzZSB0byBtYXRjaAogCSAgSVB2NiBleHRlbnNpb24gaGVhZGVycy4KIAogY29uZmlnIE5GVF9NRVRBCi0JZGVwZW5kcyBvbiBORl9UQUJMRVMKIAl0cmlzdGF0ZSAiTmV0ZmlsdGVyIG5mX3RhYmxlcyBtZXRhIG1vZHVsZSIKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAibWV0YSIgZXhwcmVzc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHRvIG1hdGNoIGFuZAogCSAgdG8gc2V0IHBhY2tldCBtZXRhaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgcGFja2V0IG1hcmsuCiAKIGNvbmZpZyBORlRfQ1QKLQlkZXBlbmRzIG9uIE5GX1RBQkxFUwogCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgY29ubnRyYWNrIG1vZHVsZSIKIAloZWxwCkBAIC00NjksNDIgKzQ2OCwzNiBAQAogCSAgY29ubmVjdGlvbiB0cmFja2luZyBpbmZvcm1hdGlvbiBzdWNoIGFzIHRoZSBmbG93IHN0YXRlLgogCiBjb25maWcgTkZUX1JCVFJFRQotCWRlcGVuZHMgb24gTkZfVEFCTEVTCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgcmJ0cmVlIHNldCBtb2R1bGUiCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgInJidHJlZSIgc2V0IHR5cGUgKFJlZCBCbGFjayB0cmVlKSB0aGF0IGlzIHVzZWQKIAkgIHRvIGJ1aWxkIGludGVydmFsLWJhc2VkIHNldHMuCiAKIGNvbmZpZyBORlRfSEFTSAotCWRlcGVuZHMgb24gTkZfVEFCTEVTCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgaGFzaCBzZXQgbW9kdWxlIgogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgdGhlICJoYXNoIiBzZXQgdHlwZSB0aGF0IGlzIHVzZWQgdG8gYnVpbGQgb25lLXdheQogCSAgbWFwcGluZ3MgYmV0d2VlbiBtYXRjaGluZ3MgYW5kIGFjdGlvbnMuCiAKIGNvbmZpZyBORlRfQ09VTlRFUgotCWRlcGVuZHMgb24gTkZfVEFCTEVTCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgY291bnRlciBtb2R1bGUiCiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyB0aGUgImNvdW50ZXIiIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIHVzZSB0bwogCSAgaW5jbHVkZSBwYWNrZXQgYW5kIGJ5dGUgY291bnRlcnMgaW4gYSBydWxlLgogCiBjb25maWcgTkZUX0xPRwotCWRlcGVuZHMgb24gTkZfVEFCTEVTCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgbG9nIG1vZHVsZSIKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAibG9nIiBleHByZXNzaW9uIHRoYXQgeW91IGNhbiB1c2UgdG8gbG9nCiAJICBwYWNrZXRzIG1hdGNoaW5nIHNvbWUgY3JpdGVyaWEuCiAKIGNvbmZpZyBORlRfTElNSVQKLQlkZXBlbmRzIG9uIE5GX1RBQkxFUwogCXRyaXN0YXRlICJOZXRmaWx0ZXIgbmZfdGFibGVzIGxpbWl0IG1vZHVsZSIKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSAibGltaXQiIGV4cHJlc3Npb24gdGhhdCB5b3UgY2FuIHVzZSB0bwogCSAgcmF0ZWxpbWl0IHJ1bGUgbWF0Y2hpbmdzLgogCiBjb25maWcgTkZUX01BU1EKLQlkZXBlbmRzIG9uIE5GX1RBQkxFUwogCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJZGVwZW5kcyBvbiBORl9OQVQKIAl0cmlzdGF0ZSAiTmV0ZmlsdGVyIG5mX3RhYmxlcyBtYXNxdWVyYWRlIHN1cHBvcnQiCkBAIC01MTMsNyArNTA2LDYgQEAKIAkgIHRvIHBlcmZvcm0gTkFUIGluIHRoZSBtYXNxdWVyYWRlIGZsYXZvdXIuCiAKIGNvbmZpZyBORlRfUkVESVIKLQlkZXBlbmRzIG9uIE5GX1RBQkxFUwogCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJZGVwZW5kcyBvbiBORl9OQVQKIAl0cmlzdGF0ZSAiTmV0ZmlsdGVyIG5mX3RhYmxlcyByZWRpcmVjdCBzdXBwb3J0IgpAQCAtNTIyLDcgKzUxNCw2IEBACiAJICB0byBwZXJmb3JtIE5BVCBpbiB0aGUgcmVkaXJlY3QgZmxhdm91ci4KIAogY29uZmlnIE5GVF9OQVQKLQlkZXBlbmRzIG9uIE5GX1RBQkxFUwogCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLCiAJc2VsZWN0IE5GX05BVAogCXRyaXN0YXRlICJOZXRmaWx0ZXIgbmZfdGFibGVzIG5hdCBtb2R1bGUiCkBAIC01MzEsOCArNTIyLDYgQEAKIAkgIHR5cGljYWwgTmV0d29yayBBZGRyZXNzIFRyYW5zbGF0aW9uIChOQVQpIHBhY2tldCB0cmFuc2Zvcm1hdGlvbnMuCiAKIGNvbmZpZyBORlRfUVVFVUUKLQlkZXBlbmRzIG9uIE5GX1RBQkxFUwotCWRlcGVuZHMgb24gTkVURklMVEVSX1hUQUJMRVMKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9ORVRMSU5LX1FVRVVFCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBuZl90YWJsZXMgcXVldWUgbW9kdWxlIgogCWhlbHAKQEAgLTU0MCw3ICs1MjksNiBAQAogCSAgaW5mcmFzdHJ1Y3R1cmUgKGFsc28ga25vd24gYXMgTkZRVUVVRSkgZnJvbSBuZnRhYmxlcy4KIAogY29uZmlnIE5GVF9SRUpFQ1QKLQlkZXBlbmRzIG9uIE5GX1RBQkxFUwogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCXRyaXN0YXRlICJOZXRmaWx0ZXIgbmZfdGFibGVzIHJlamVjdCBzdXBwb3J0IgogCWhlbHAKQEAgLTU1NCw3ICs1NDIsNiBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBORlRfQ09NUEFUCi0JZGVwZW5kcyBvbiBORl9UQUJMRVMKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9YVEFCTEVTCiAJdHJpc3RhdGUgIk5ldGZpbHRlciB4X3RhYmxlcyBvdmVyIG5mX3RhYmxlcyBtb2R1bGUiCiAJaGVscApAQCAtNTYyLDYgKzU0OSw4IEBACiAJICB4X3RhYmxlcyBtYXRjaC90YXJnZXQgZXh0ZW5zaW9ucyBvdmVyIHRoZSBuZl90YWJsZXMKIAkgIGZyYW1ld29yay4KIAorZW5kaWYgIyBORl9UQUJMRVMKKwogY29uZmlnIE5FVEZJTFRFUl9YVEFCTEVTCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBYdGFibGVzIHN1cHBvcnQgKHJlcXVpcmVkIGZvciBpcF90YWJsZXMpIgogCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgpAQCAtOTUxLDcgKzk0MCw3IEBACiAKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfQUREUlRZUEUKIAl0cmlzdGF0ZSAnImFkZHJ0eXBlIiBhZGRyZXNzIHR5cGUgbWF0Y2ggc3VwcG9ydCcKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAorCWRlZmF1bHQgbSBpZiBORVRGSUxURVJfQURWQU5DRUQ9bgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gbWF0Y2ggd2hhdCByb3V0aW5nIHRoaW5rcyBvZiBhbiBhZGRyZXNzLAogCSAgZWcuIFVOSUNBU1QsIExPQ0FMLCBCUk9BRENBU1QsIC4uLgpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9NYWtlZmlsZSBiL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKaW5kZXggODlmNzNhOS4uYTg3ZDhiOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCkBAIC03MCw3ICs3MCw3IEBACiAKICMgbmZfdGFibGVzCiBuZl90YWJsZXMtb2JqcyArPSBuZl90YWJsZXNfY29yZS5vIG5mX3RhYmxlc19hcGkubwotbmZfdGFibGVzLW9ianMgKz0gbmZ0X2ltbWVkaWF0ZS5vIG5mdF9jbXAubyBuZnRfbG9va3VwLm8KK25mX3RhYmxlcy1vYmpzICs9IG5mdF9pbW1lZGlhdGUubyBuZnRfY21wLm8gbmZ0X2xvb2t1cC5vIG5mdF9keW5zZXQubwogbmZfdGFibGVzLW9ianMgKz0gbmZ0X2JpdHdpc2UubyBuZnRfYnl0ZW9yZGVyLm8gbmZ0X3BheWxvYWQubwogCiBvYmotJChDT05GSUdfTkZfVEFCTEVTKQkJKz0gbmZfdGFibGVzLm8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvY29yZS5jIGIvbmV0L25ldGZpbHRlci9jb3JlLmMKaW5kZXggZmVhOWVmNS4uZTYxNjMwMSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9jb3JlLmMKQEAgLTEyMCwxMiArMTIwLDggQEAKIAogdW5zaWduZWQgaW50IG5mX2l0ZXJhdGUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKIAkJCXN0cnVjdCBza19idWZmICpza2IsCi0JCQl1bnNpZ25lZCBpbnQgaG9vaywKLQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKLQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCi0JCQlzdHJ1Y3QgbmZfaG9va19vcHMgKiplbGVtcCwKLQkJCWludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopLAotCQkJaW50IGhvb2tfdGhyZXNoKQorCQkJc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAorCQkJc3RydWN0IG5mX2hvb2tfb3BzICoqZWxlbXApCiB7CiAJdW5zaWduZWQgaW50IHZlcmRpY3Q7CiAKQEAgLTEzNCwxOSArMTMwLDE5IEBACiAJICogZnVuY3Rpb24gYmVjYXVzZSBvZiByaXNrIG9mIGNvbnRpbnVpbmcgZnJvbSBkZWxldGVkIGVsZW1lbnQuCiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZV9yY3UoKCplbGVtcCksIGhlYWQsIGxpc3QpIHsKLQkJaWYgKGhvb2tfdGhyZXNoID4gKCplbGVtcCktPnByaW9yaXR5KQorCQlpZiAoc3RhdGUtPnRocmVzaCA+ICgqZWxlbXApLT5wcmlvcml0eSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qIE9wdGltaXphdGlvbjogd2UgZG9uJ3QgbmVlZCB0byBob2xkIG1vZHVsZQogCQkgICByZWZlcmVuY2UgaGVyZSwgc2luY2UgZnVuY3Rpb24gY2FuJ3Qgc2xlZXAuIC0tUlIgKi8KIHJlcGVhdDoKLQkJdmVyZGljdCA9ICgqZWxlbXApLT5ob29rKCplbGVtcCwgc2tiLCBpbmRldiwgb3V0ZGV2LCBva2ZuKTsKKwkJdmVyZGljdCA9ICgqZWxlbXApLT5ob29rKCplbGVtcCwgc2tiLCBzdGF0ZSk7CiAJCWlmICh2ZXJkaWN0ICE9IE5GX0FDQ0VQVCkgewogI2lmZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKIAkJCWlmICh1bmxpa2VseSgodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykKIAkJCQkJCQk+IE5GX01BWF9WRVJESUNUKSkgewogCQkJCU5GREVCVUcoIkV2aWwgcmV0dXJuIGZyb20gJXAoJXUpLlxuIiwKLQkJCQkJKCplbGVtcCktPmhvb2ssIGhvb2spOworCQkJCQkoKmVsZW1wKS0+aG9vaywgc3RhdGUtPmhvb2spOwogCQkJCWNvbnRpbnVlOwogCQkJfQogI2VuZGlmCkBAIC0xNjEsMTEgKzE1Nyw3IEBACiAKIC8qIFJldHVybnMgMSBpZiBva2ZuKCkgbmVlZHMgdG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGNhbGxlciwKICAqIC1FUEVSTSBmb3IgTkZfRFJPUCwgMCBvdGhlcndpc2UuICovCi1pbnQgbmZfaG9va19zbG93KHVfaW50OF90IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwKLQkJIHN0cnVjdCBuZXRfZGV2aWNlICpvdXRkZXYsCi0JCSBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSwKLQkJIGludCBob29rX3RocmVzaCkKK2ludCBuZl9ob29rX3Nsb3coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBuZl9ob29rX29wcyAqZWxlbTsKIAl1bnNpZ25lZCBpbnQgdmVyZGljdDsKQEAgLTE3NCwxMCArMTY2LDExIEBACiAJLyogV2UgbWF5IGFscmVhZHkgaGF2ZSB0aGlzLCBidXQgcmVhZC1sb2NrcyBuZXN0IGFueXdheSAqLwogCXJjdV9yZWFkX2xvY2soKTsKIAotCWVsZW0gPSBsaXN0X2VudHJ5X3JjdSgmbmZfaG9va3NbcGZdW2hvb2tdLCBzdHJ1Y3QgbmZfaG9va19vcHMsIGxpc3QpOworCWVsZW0gPSBsaXN0X2VudHJ5X3JjdSgmbmZfaG9va3Nbc3RhdGUtPnBmXVtzdGF0ZS0+aG9va10sCisJCQkgICAgICBzdHJ1Y3QgbmZfaG9va19vcHMsIGxpc3QpOwogbmV4dF9ob29rOgotCXZlcmRpY3QgPSBuZl9pdGVyYXRlKCZuZl9ob29rc1twZl1baG9va10sIHNrYiwgaG9vaywgaW5kZXYsCi0JCQkgICAgIG91dGRldiwgJmVsZW0sIG9rZm4sIGhvb2tfdGhyZXNoKTsKKwl2ZXJkaWN0ID0gbmZfaXRlcmF0ZSgmbmZfaG9va3Nbc3RhdGUtPnBmXVtzdGF0ZS0+aG9va10sIHNrYiwgc3RhdGUsCisJCQkgICAgICZlbGVtKTsKIAlpZiAodmVyZGljdCA9PSBORl9BQ0NFUFQgfHwgdmVyZGljdCA9PSBORl9TVE9QKSB7CiAJCXJldCA9IDE7CiAJfSBlbHNlIGlmICgodmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgPT0gTkZfRFJPUCkgewpAQCAtMTg2LDggKzE3OSw4IEBACiAJCWlmIChyZXQgPT0gMCkKIAkJCXJldCA9IC1FUEVSTTsKIAl9IGVsc2UgaWYgKCh2ZXJkaWN0ICYgTkZfVkVSRElDVF9NQVNLKSA9PSBORl9RVUVVRSkgewotCQlpbnQgZXJyID0gbmZfcXVldWUoc2tiLCBlbGVtLCBwZiwgaG9vaywgaW5kZXYsIG91dGRldiwgb2tmbiwKLQkJCQkJCXZlcmRpY3QgPj4gTkZfVkVSRElDVF9RQklUUyk7CisJCWludCBlcnIgPSBuZl9xdWV1ZShza2IsIGVsZW0sIHN0YXRlLAorCQkJCSAgIHZlcmRpY3QgPj4gTkZfVkVSRElDVF9RQklUUyk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlpZiAoZXJyID09IC1FQ0FOQ0VMRUQpCiAJCQkJZ290byBuZXh0X2hvb2s7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX25ldGlmYWNlLmMgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX25ldGlmYWNlLmMKaW5kZXggNzU4YjAwMi4uMzgwZWY1MSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXRpZmFjZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfbmV0aWZhY2UuYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL2lwc2V0L3BmeGxlbi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9pcHNldC9pcF9zZXQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2guaD4KQEAgLTIxMSw2ICsyMTIsMjIgQEAKICNkZWZpbmUgSEtFWV9EQVRBTEVOCXNpemVvZihzdHJ1Y3QgaGFzaF9uZXRpZmFjZTRfZWxlbV9oYXNoZWQpCiAjaW5jbHVkZSAiaXBfc2V0X2hhc2hfZ2VuLmgiCiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUklER0VfTkVURklMVEVSKQorc3RhdGljIGNvbnN0IGNoYXIgKmdldF9waHlzaW5kZXZfbmFtZShjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZl9icmlkZ2VfZ2V0X3BoeXNpbmRldihza2IpOworCisJcmV0dXJuIGRldiA/IGRldi0+bmFtZSA6IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfcGh5b3V0ZGV2X25hbWUoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmZfYnJpZGdlX2dldF9waHlzb3V0ZGV2KHNrYik7CisKKwlyZXR1cm4gZGV2ID8gZGV2LT5uYW1lIDogTlVMTDsKK30KKyNlbmRpZgorCiBzdGF0aWMgaW50CiBoYXNoX25ldGlmYWNlNF9rYWR0KHN0cnVjdCBpcF9zZXQgKnNldCwgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJICAgIGNvbnN0IHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKQEAgLTIzNCwxNiArMjUxLDE1IEBACiAJZS5pcCAmPSBpcF9zZXRfbmV0bWFzayhlLmNpZHIpOwogCiAjZGVmaW5lIElGQUNFKGRpcikJKHBhci0+ZGlyID8gcGFyLT5kaXItPm5hbWUgOiBOVUxMKQotI2RlZmluZSBQSFlTREVWKGRpcikJKG5mX2JyaWRnZS0+ZGlyID8gbmZfYnJpZGdlLT5kaXItPm5hbWUgOiBOVUxMKQogI2RlZmluZSBTUkNESVIJCShvcHQtPmZsYWdzICYgSVBTRVRfRElNX1RXT19TUkMpCiAKIAlpZiAob3B0LT5jbWRmbGFncyAmIElQU0VUX0ZMQUdfUEhZU0RFVikgewogI2lmIElTX0VOQUJMRUQoQ09ORklHX0JSSURHRV9ORVRGSUxURVIpCi0JCWNvbnN0IHN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gc2tiLT5uZl9icmlkZ2U7CisJCWUuaWZhY2UgPSBTUkNESVIgPyBnZXRfcGh5c2luZGV2X25hbWUoc2tiKSA6CisJCQkJICAgZ2V0X3BoeW91dGRldl9uYW1lKHNrYik7CiAKLQkJaWYgKCFuZl9icmlkZ2UpCisJCWlmICghZS5pZmFjZSkKIAkJCXJldHVybiAtRUlOVkFMOwotCQllLmlmYWNlID0gU1JDRElSID8gUEhZU0RFVihwaHlzaW5kZXYpIDogUEhZU0RFVihwaHlzb3V0ZGV2KTsKIAkJZS5waHlzZGV2ID0gMTsKICNlbHNlCiAJCWUuaWZhY2UgPSBOVUxMOwpAQCAtNDc2LDExICs0OTIsMTEgQEAKIAogCWlmIChvcHQtPmNtZGZsYWdzICYgSVBTRVRfRkxBR19QSFlTREVWKSB7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQlJJREdFX05FVEZJTFRFUikKLQkJY29uc3Qgc3RydWN0IG5mX2JyaWRnZV9pbmZvICpuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZTsKLQotCQlpZiAoIW5mX2JyaWRnZSkKKwkJZS5pZmFjZSA9IFNSQ0RJUiA/IGdldF9waHlzaW5kZXZfbmFtZShza2IpIDoKKwkJCQkgICBnZXRfcGh5b3V0ZGV2X25hbWUoc2tiKTsKKwkJaWYgKCFlLmlmYWNlKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWUuaWZhY2UgPSBTUkNESVIgPyBQSFlTREVWKHBoeXNpbmRldikgOiBQSFlTREVWKHBoeXNvdXRkZXYpOworCiAJCWUucGh5c2RldiA9IDE7CiAjZWxzZQogCQllLmlmYWNlID0gTlVMTDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCmluZGV4IGI4N2NhMzIuLjVkMmI4MDYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2NvcmUuYwpAQCAtMTE5LDI0ICsxMTksMjQgQEAKIAkJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKIAogCQlzID0gdGhpc19jcHVfcHRyKGRlc3QtPnN0YXRzLmNwdXN0YXRzKTsKLQkJcy0+dXN0YXRzLmlucGt0cysrOwogCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzLT5zeW5jcCk7Ci0JCXMtPnVzdGF0cy5pbmJ5dGVzICs9IHNrYi0+bGVuOworCQlzLT5jbnQuaW5wa3RzKys7CisJCXMtPmNudC5pbmJ5dGVzICs9IHNrYi0+bGVuOwogCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcy0+c3luY3ApOwogCiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJc3ZjID0gcmN1X2RlcmVmZXJlbmNlKGRlc3QtPnN2Yyk7CiAJCXMgPSB0aGlzX2NwdV9wdHIoc3ZjLT5zdGF0cy5jcHVzdGF0cyk7Ci0JCXMtPnVzdGF0cy5pbnBrdHMrKzsKIAkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcy0+c3luY3ApOwotCQlzLT51c3RhdHMuaW5ieXRlcyArPSBza2ItPmxlbjsKKwkJcy0+Y250LmlucGt0cysrOworCQlzLT5jbnQuaW5ieXRlcyArPSBza2ItPmxlbjsKIAkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnMtPnN5bmNwKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJcyA9IHRoaXNfY3B1X3B0cihpcHZzLT50b3Rfc3RhdHMuY3B1c3RhdHMpOwotCQlzLT51c3RhdHMuaW5wa3RzKys7CiAJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnMtPnN5bmNwKTsKLQkJcy0+dXN0YXRzLmluYnl0ZXMgKz0gc2tiLT5sZW47CisJCXMtPmNudC5pbnBrdHMrKzsKKwkJcy0+Y250LmluYnl0ZXMgKz0gc2tiLT5sZW47CiAJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZzLT5zeW5jcCk7CiAJfQogfQpAQCAtMTUzLDI0ICsxNTMsMjQgQEAKIAkJc3RydWN0IGlwX3ZzX3NlcnZpY2UgKnN2YzsKIAogCQlzID0gdGhpc19jcHVfcHRyKGRlc3QtPnN0YXRzLmNwdXN0YXRzKTsKLQkJcy0+dXN0YXRzLm91dHBrdHMrKzsKIAkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcy0+c3luY3ApOwotCQlzLT51c3RhdHMub3V0Ynl0ZXMgKz0gc2tiLT5sZW47CisJCXMtPmNudC5vdXRwa3RzKys7CisJCXMtPmNudC5vdXRieXRlcyArPSBza2ItPmxlbjsKIAkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnMtPnN5bmNwKTsKIAogCQlyY3VfcmVhZF9sb2NrKCk7CiAJCXN2YyA9IHJjdV9kZXJlZmVyZW5jZShkZXN0LT5zdmMpOwogCQlzID0gdGhpc19jcHVfcHRyKHN2Yy0+c3RhdHMuY3B1c3RhdHMpOwotCQlzLT51c3RhdHMub3V0cGt0cysrOwogCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzLT5zeW5jcCk7Ci0JCXMtPnVzdGF0cy5vdXRieXRlcyArPSBza2ItPmxlbjsKKwkJcy0+Y250Lm91dHBrdHMrKzsKKwkJcy0+Y250Lm91dGJ5dGVzICs9IHNrYi0+bGVuOwogCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcy0+c3luY3ApOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAogCQlzID0gdGhpc19jcHVfcHRyKGlwdnMtPnRvdF9zdGF0cy5jcHVzdGF0cyk7Ci0JCXMtPnVzdGF0cy5vdXRwa3RzKys7CiAJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnMtPnN5bmNwKTsKLQkJcy0+dXN0YXRzLm91dGJ5dGVzICs9IHNrYi0+bGVuOworCQlzLT5jbnQub3V0cGt0cysrOworCQlzLT5jbnQub3V0Ynl0ZXMgKz0gc2tiLT5sZW47CiAJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZzLT5zeW5jcCk7CiAJfQogfQpAQCAtMTgzLDEzICsxODMsMTkgQEAKIAlzdHJ1Y3QgaXBfdnNfY3B1X3N0YXRzICpzOwogCiAJcyA9IHRoaXNfY3B1X3B0cihjcC0+ZGVzdC0+c3RhdHMuY3B1c3RhdHMpOwotCXMtPnVzdGF0cy5jb25ucysrOworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnMtPnN5bmNwKTsKKwlzLT5jbnQuY29ubnMrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmcy0+c3luY3ApOwogCiAJcyA9IHRoaXNfY3B1X3B0cihzdmMtPnN0YXRzLmNwdXN0YXRzKTsKLQlzLT51c3RhdHMuY29ubnMrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzLT5zeW5jcCk7CisJcy0+Y250LmNvbm5zKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnMtPnN5bmNwKTsKIAogCXMgPSB0aGlzX2NwdV9wdHIoaXB2cy0+dG90X3N0YXRzLmNwdXN0YXRzKTsKLQlzLT51c3RhdHMuY29ubnMrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzLT5zeW5jcCk7CisJcy0+Y250LmNvbm5zKys7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnMtPnN5bmNwKTsKIH0KIAogCkBAIC0xMDQ2LDYgKzEwNTIsMjYgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19uZXdfY29ubl9leHBlY3RlZChjb25zdCBzdHJ1Y3QgaXBfdnNfY29ubiAqY3AsCisJCQkJCWludCBjb25uX3JldXNlX21vZGUpCit7CisJLyogQ29udHJvbGxlZCAoRlRQIERBVEEgb3IgcGVyc2lzdGVuY2UpPyAqLworCWlmIChjcC0+Y29udHJvbCkKKwkJcmV0dXJuIGZhbHNlOworCisJc3dpdGNoIChjcC0+cHJvdG9jb2wpIHsKKwljYXNlIElQUFJPVE9fVENQOgorCQlyZXR1cm4gKGNwLT5zdGF0ZSA9PSBJUF9WU19UQ1BfU19USU1FX1dBSVQpIHx8CisJCQkoKGNvbm5fcmV1c2VfbW9kZSAmIDIpICYmCisJCQkgKGNwLT5zdGF0ZSA9PSBJUF9WU19UQ1BfU19GSU5fV0FJVCkgJiYKKwkJCSAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX05PT1VUUFVUKSk7CisJY2FzZSBJUFBST1RPX1NDVFA6CisJCXJldHVybiBjcC0+c3RhdGUgPT0gSVBfVlNfU0NUUF9TX0NMT1NFRDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCiAvKiBIYW5kbGUgcmVzcG9uc2UgcGFja2V0czogcmV3cml0ZSBhZGRyZXNzZXMgYW5kIHNlbmQgYXdheS4uLgogICovCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC0xMjQ2LDggKzEyNzIsNyBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgaW50CiBpcF92c19yZXBseTQoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsIHN0cnVjdCBza19idWZmICpza2IsCi0JICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKIAlyZXR1cm4gaXBfdnNfb3V0KG9wcy0+aG9va251bSwgc2tiLCBBRl9JTkVUKTsKIH0KQEAgLTEyNTgsOCArMTI4Myw3IEBACiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQKIGlwX3ZzX2xvY2FsX3JlcGx5NChjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXJldHVybiBpcF92c19vdXQob3BzLT5ob29rbnVtLCBza2IsIEFGX0lORVQpOwogfQpAQCAtMTI3Myw4ICsxMjk3LDcgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGludAogaXBfdnNfcmVwbHk2KGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCSAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJcmV0dXJuIGlwX3ZzX291dChvcHMtPmhvb2tudW0sIHNrYiwgQUZfSU5FVDYpOwogfQpAQCAtMTI4NSw4ICsxMzA4LDcgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGludAogaXBfdnNfbG9jYWxfcmVwbHk2KGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJcmV0dXJuIGlwX3ZzX291dChvcHMtPmhvb2tudW0sIHNrYiwgQUZfSU5FVDYpOwogfQpAQCAtMTU4NSw2ICsxNjA3LDcgQEAKIAlzdHJ1Y3QgaXBfdnNfY29ubiAqY3A7CiAJaW50IHJldCwgcGt0czsKIAlzdHJ1Y3QgbmV0bnNfaXB2cyAqaXB2czsKKwlpbnQgY29ubl9yZXVzZV9tb2RlOwogCiAJLyogQWxyZWFkeSBtYXJrZWQgYXMgSVBWUyByZXF1ZXN0IG9yIHJlcGx5PyAqLwogCWlmIChza2ItPmlwdnNfcHJvcGVydHkpCkBAIC0xNjUzLDEwICsxNjc2LDE0IEBACiAJICovCiAJY3AgPSBwcC0+Y29ubl9pbl9nZXQoYWYsIHNrYiwgJmlwaCwgMCk7CiAKLQlpZiAodW5saWtlbHkoc3lzY3RsX2V4cGlyZV9ub2Rlc3RfY29ubihpcHZzKSkgJiYgY3AgJiYgY3AtPmRlc3QgJiYKLQkgICAgdW5saWtlbHkoIWF0b21pY19yZWFkKCZjcC0+ZGVzdC0+d2VpZ2h0KSkgJiYgIWlwaC5mcmFnb2ZmcyAmJgotCSAgICBpc19uZXdfY29ubihza2IsICZpcGgpKSB7Ci0JCWlwX3ZzX2Nvbm5fZXhwaXJlX25vdyhjcCk7CisJY29ubl9yZXVzZV9tb2RlID0gc3lzY3RsX2Nvbm5fcmV1c2VfbW9kZShpcHZzKTsKKwlpZiAoY29ubl9yZXVzZV9tb2RlICYmICFpcGguZnJhZ29mZnMgJiYKKwkgICAgaXNfbmV3X2Nvbm4oc2tiLCAmaXBoKSAmJiBjcCAmJgorCSAgICAoKHVubGlrZWx5KHN5c2N0bF9leHBpcmVfbm9kZXN0X2Nvbm4oaXB2cykpICYmIGNwLT5kZXN0ICYmCisJICAgICAgdW5saWtlbHkoIWF0b21pY19yZWFkKCZjcC0+ZGVzdC0+d2VpZ2h0KSkpIHx8CisJICAgICB1bmxpa2VseShpc19uZXdfY29ubl9leHBlY3RlZChjcCwgY29ubl9yZXVzZV9tb2RlKSkpKSB7CisJCWlmICghYXRvbWljX3JlYWQoJmNwLT5uX2NvbnRyb2wpKQorCQkJaXBfdnNfY29ubl9leHBpcmVfbm93KGNwKTsKIAkJX19pcF92c19jb25uX3B1dChjcCk7CiAJCWNwID0gTlVMTDsKIAl9CkBAIC0xNzM4LDkgKzE3NjUsNyBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgaW50CiBpcF92c19yZW1vdGVfcmVxdWVzdDQoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJICAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKIAlyZXR1cm4gaXBfdnNfaW4ob3BzLT5ob29rbnVtLCBza2IsIEFGX0lORVQpOwogfQpAQCAtMTc1MSw4ICsxNzc2LDcgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGludAogaXBfdnNfbG9jYWxfcmVxdWVzdDQoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKIAlyZXR1cm4gaXBfdnNfaW4ob3BzLT5ob29rbnVtLCBza2IsIEFGX0lORVQpOwogfQpAQCAtMTc2NSw5ICsxNzg5LDcgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGludAogaXBfdnNfcmVtb3RlX3JlcXVlc3Q2KGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sCi0JCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJcmV0dXJuIGlwX3ZzX2luKG9wcy0+aG9va251bSwgc2tiLCBBRl9JTkVUNik7CiB9CkBAIC0xNzc4LDggKzE4MDAsNyBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgaW50CiBpcF92c19sb2NhbF9yZXF1ZXN0Nihjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCSAgICAgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXJldHVybiBpcF92c19pbihvcHMtPmhvb2tudW0sIHNrYiwgQUZfSU5FVDYpOwogfQpAQCAtMTc5OCw4ICsxODE5LDcgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGludAogaXBfdnNfZm9yd2FyZF9pY21wKGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJaW50IHI7CiAJc3RydWN0IG5ldCAqbmV0OwpAQCAtMTgyMCw4ICsxODQwLDcgQEAKICNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgogc3RhdGljIHVuc2lnbmVkIGludAogaXBfdnNfZm9yd2FyZF9pY21wX3Y2KGNvbnN0IHN0cnVjdCBuZl9ob29rX29wcyAqb3BzLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW4sIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCi0JCSAgICAgIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfaG9va19zdGF0ZSAqc3RhdGUpCiB7CiAJaW50IHI7CiAJc3RydWN0IG5ldCAqbmV0OwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2N0bC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2N0bC5jCmluZGV4IGVkOTk0NDguLjQ5NTMyNjcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMKQEAgLTcyOSw5ICs3MjksOSBAQAogfQogCiBzdGF0aWMgdm9pZAotaXBfdnNfY29weV9zdGF0cyhzdHJ1Y3QgaXBfdnNfc3RhdHNfdXNlciAqZHN0LCBzdHJ1Y3QgaXBfdnNfc3RhdHMgKnNyYykKK2lwX3ZzX2NvcHlfc3RhdHMoc3RydWN0IGlwX3ZzX2tzdGF0cyAqZHN0LCBzdHJ1Y3QgaXBfdnNfc3RhdHMgKnNyYykKIHsKLSNkZWZpbmUgSVBfVlNfU0hPV19TVEFUU19DT1VOVEVSKGMpIGRzdC0+YyA9IHNyYy0+dXN0YXRzLmMgLSBzcmMtPnVzdGF0czAuYworI2RlZmluZSBJUF9WU19TSE9XX1NUQVRTX0NPVU5URVIoYykgZHN0LT5jID0gc3JjLT5rc3RhdHMuYyAtIHNyYy0+a3N0YXRzMC5jCiAKIAlzcGluX2xvY2tfYmgoJnNyYy0+bG9jayk7CiAKQEAgLTc0NywxMyArNzQ3LDI4IEBACiB9CiAKIHN0YXRpYyB2b2lkCitpcF92c19leHBvcnRfc3RhdHNfdXNlcihzdHJ1Y3QgaXBfdnNfc3RhdHNfdXNlciAqZHN0LCBzdHJ1Y3QgaXBfdnNfa3N0YXRzICpzcmMpCit7CisJZHN0LT5jb25ucyA9ICh1MzIpc3JjLT5jb25uczsKKwlkc3QtPmlucGt0cyA9ICh1MzIpc3JjLT5pbnBrdHM7CisJZHN0LT5vdXRwa3RzID0gKHUzMilzcmMtPm91dHBrdHM7CisJZHN0LT5pbmJ5dGVzID0gc3JjLT5pbmJ5dGVzOworCWRzdC0+b3V0Ynl0ZXMgPSBzcmMtPm91dGJ5dGVzOworCWRzdC0+Y3BzID0gKHUzMilzcmMtPmNwczsKKwlkc3QtPmlucHBzID0gKHUzMilzcmMtPmlucHBzOworCWRzdC0+b3V0cHBzID0gKHUzMilzcmMtPm91dHBwczsKKwlkc3QtPmluYnBzID0gKHUzMilzcmMtPmluYnBzOworCWRzdC0+b3V0YnBzID0gKHUzMilzcmMtPm91dGJwczsKK30KKworc3RhdGljIHZvaWQKIGlwX3ZzX3plcm9fc3RhdHMoc3RydWN0IGlwX3ZzX3N0YXRzICpzdGF0cykKIHsKIAlzcGluX2xvY2tfYmgoJnN0YXRzLT5sb2NrKTsKIAogCS8qIGdldCBjdXJyZW50IGNvdW50ZXJzIGFzIHplcm8gcG9pbnQsIHJhdGVzIGFyZSB6ZXJvZWQgKi8KIAotI2RlZmluZSBJUF9WU19aRVJPX1NUQVRTX0NPVU5URVIoYykgc3RhdHMtPnVzdGF0czAuYyA9IHN0YXRzLT51c3RhdHMuYworI2RlZmluZSBJUF9WU19aRVJPX1NUQVRTX0NPVU5URVIoYykgc3RhdHMtPmtzdGF0czAuYyA9IHN0YXRzLT5rc3RhdHMuYwogCiAJSVBfVlNfWkVST19TVEFUU19DT1VOVEVSKGNvbm5zKTsKIAlJUF9WU19aRVJPX1NUQVRTX0NPVU5URVIoaW5wa3RzKTsKQEAgLTE4MDgsNiArMTgyMywxMiBAQAogCQkubW9kZQkJPSAwNjQ0LAogCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAl9LAorCXsKKwkJLnByb2NuYW1lCT0gImNvbm5fcmV1c2VfbW9kZSIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCX0sCiAjaWZkZWYgQ09ORklHX0lQX1ZTX0RFQlVHCiAJewogCQkucHJvY25hbWUJPSAiZGVidWdfbGV2ZWwiLApAQCAtMjA0NCw3ICsyMDY1LDcgQEAKIHN0YXRpYyBpbnQgaXBfdnNfc3RhdHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzZXFfZmlsZV9zaW5nbGVfbmV0KHNlcSk7Ci0Jc3RydWN0IGlwX3ZzX3N0YXRzX3VzZXIgc2hvdzsKKwlzdHJ1Y3QgaXBfdnNfa3N0YXRzIHNob3c7CiAKIC8qICAgICAgICAgICAgICAgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcwMTIzNDU2NyAwMTIzNDU2NzAxMjM0NTY3ICovCiAJc2VxX3B1dHMoc2VxLApAQCAtMjA1MywxNyArMjA3NCwyMiBAQAogCQkgICAiICAgQ29ubnMgIFBhY2tldHMgIFBhY2tldHMgICAgICAgICAgICBCeXRlcyAgICAgICAgICAgIEJ5dGVzXG4iKTsKIAogCWlwX3ZzX2NvcHlfc3RhdHMoJnNob3csICZuZXRfaXB2cyhuZXQpLT50b3Rfc3RhdHMpOwotCXNlcV9wcmludGYoc2VxLCAiJThYICU4WCAlOFggJTE2TFggJTE2TFhcblxuIiwgc2hvdy5jb25ucywKLQkJICAgc2hvdy5pbnBrdHMsIHNob3cub3V0cGt0cywKLQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2hvdy5pbmJ5dGVzLAotCQkgICAodW5zaWduZWQgbG9uZyBsb25nKSBzaG93Lm91dGJ5dGVzKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiU4TFggJThMWCAlOExYICUxNkxYICUxNkxYXG5cbiIsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2hvdy5jb25ucywKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaG93LmlucGt0cywKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaG93Lm91dHBrdHMsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2hvdy5pbmJ5dGVzLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNob3cub3V0Ynl0ZXMpOwogCi0vKiAgICAgICAgICAgICAgICAgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcwMTIzNDU2NyAwMTIzNDU2NzAxMjM0NTY3ICovCisvKiAgICAgICAgICAgICAgICAwMTIzNDU2NyAwMTIzNDU2NyAwMTIzNDU2NyAwMTIzNDU2NzAxMjM0NTY3IDAxMjM0NTY3MDEyMzQ1NjcqLwogCXNlcV9wdXRzKHNlcSwKLQkJICAgIiBDb25ucy9zICAgUGt0cy9zICAgUGt0cy9zICAgICAgICAgIEJ5dGVzL3MgICAgICAgICAgQnl0ZXMvc1xuIik7Ci0Jc2VxX3ByaW50ZihzZXEsICIlOFggJThYICU4WCAlMTZYICUxNlhcbiIsCi0JCQlzaG93LmNwcywgc2hvdy5pbnBwcywgc2hvdy5vdXRwcHMsCi0JCQlzaG93LmluYnBzLCBzaG93Lm91dGJwcyk7CisJCSAiIENvbm5zL3MgICBQa3RzL3MgICBQa3RzL3MgICAgICAgICAgQnl0ZXMvcyAgICAgICAgICBCeXRlcy9zXG4iKTsKKwlzZXFfcHJpbnRmKHNlcSwgIiU4TFggJThMWCAlOExYICUxNkxYICUxNkxYXG4iLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNob3cuY3BzLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKXNob3cuaW5wcHMsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2hvdy5vdXRwcHMsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2hvdy5pbmJwcywKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzaG93Lm91dGJwcyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwODYsNyArMjExMiw3IEBACiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfc2luZ2xlX25ldChzZXEpOwogCXN0cnVjdCBpcF92c19zdGF0cyAqdG90X3N0YXRzID0gJm5ldF9pcHZzKG5ldCktPnRvdF9zdGF0czsKIAlzdHJ1Y3QgaXBfdnNfY3B1X3N0YXRzIF9fcGVyY3B1ICpjcHVzdGF0cyA9IHRvdF9zdGF0cy0+Y3B1c3RhdHM7Ci0Jc3RydWN0IGlwX3ZzX3N0YXRzX3VzZXIgcmF0ZXM7CisJc3RydWN0IGlwX3ZzX2tzdGF0cyBrc3RhdHM7CiAJaW50IGk7CiAKIC8qICAgICAgICAgICAgICAgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcwMTIzNDU2NyAwMTIzNDU2NzAxMjM0NTY3ICovCkBAIC0yMDk4LDQxICsyMTI0LDQxIEBACiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJc3RydWN0IGlwX3ZzX2NwdV9zdGF0cyAqdSA9IHBlcl9jcHVfcHRyKGNwdXN0YXRzLCBpKTsKIAkJdW5zaWduZWQgaW50IHN0YXJ0OwotCQlfX3U2NCBpbmJ5dGVzLCBvdXRieXRlczsKKwkJdTY0IGNvbm5zLCBpbnBrdHMsIG91dHBrdHMsIGluYnl0ZXMsIG91dGJ5dGVzOwogCiAJCWRvIHsKIAkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2lycSgmdS0+c3luY3ApOwotCQkJaW5ieXRlcyA9IHUtPnVzdGF0cy5pbmJ5dGVzOwotCQkJb3V0Ynl0ZXMgPSB1LT51c3RhdHMub3V0Ynl0ZXM7CisJCQljb25ucyA9IHUtPmNudC5jb25uczsKKwkJCWlucGt0cyA9IHUtPmNudC5pbnBrdHM7CisJCQlvdXRwa3RzID0gdS0+Y250Lm91dHBrdHM7CisJCQlpbmJ5dGVzID0gdS0+Y250LmluYnl0ZXM7CisJCQlvdXRieXRlcyA9IHUtPmNudC5vdXRieXRlczsKIAkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5X2lycSgmdS0+c3luY3AsIHN0YXJ0KSk7CiAKLQkJc2VxX3ByaW50ZihzZXEsICIlM1ggJThYICU4WCAlOFggJTE2TFggJTE2TFhcbiIsCi0JCQkgICBpLCB1LT51c3RhdHMuY29ubnMsIHUtPnVzdGF0cy5pbnBrdHMsCi0JCQkgICB1LT51c3RhdHMub3V0cGt0cywgKF9fdTY0KWluYnl0ZXMsCi0JCQkgICAoX191NjQpb3V0Ynl0ZXMpOworCQlzZXFfcHJpbnRmKHNlcSwgIiUzWCAlOExYICU4TFggJThMWCAlMTZMWCAlMTZMWFxuIiwKKwkJCSAgIGksICh1NjQpY29ubnMsICh1NjQpaW5wa3RzLAorCQkJICAgKHU2NClvdXRwa3RzLCAodTY0KWluYnl0ZXMsCisJCQkgICAodTY0KW91dGJ5dGVzKTsKIAl9CiAKLQlzcGluX2xvY2tfYmgoJnRvdF9zdGF0cy0+bG9jayk7CisJaXBfdnNfY29weV9zdGF0cygma3N0YXRzLCB0b3Rfc3RhdHMpOwogCi0Jc2VxX3ByaW50ZihzZXEsICIgIH4gJThYICU4WCAlOFggJTE2TFggJTE2TFhcblxuIiwKLQkJICAgdG90X3N0YXRzLT51c3RhdHMuY29ubnMsIHRvdF9zdGF0cy0+dXN0YXRzLmlucGt0cywKLQkJICAgdG90X3N0YXRzLT51c3RhdHMub3V0cGt0cywKLQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdG90X3N0YXRzLT51c3RhdHMuaW5ieXRlcywKLQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgdG90X3N0YXRzLT51c3RhdHMub3V0Ynl0ZXMpOworCXNlcV9wcmludGYoc2VxLCAiICB+ICU4TFggJThMWCAlOExYICUxNkxYICUxNkxYXG5cbiIsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpa3N0YXRzLmNvbm5zLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWtzdGF0cy5pbnBrdHMsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpa3N0YXRzLm91dHBrdHMsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpa3N0YXRzLmluYnl0ZXMsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpa3N0YXRzLm91dGJ5dGVzKTsKIAotCWlwX3ZzX3JlYWRfZXN0aW1hdG9yKCZyYXRlcywgdG90X3N0YXRzKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZ0b3Rfc3RhdHMtPmxvY2spOwotCi0vKiAgICAgICAgICAgICAgICAgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcwMTIzNDU2NyAwMTIzNDU2NzAxMjM0NTY3ICovCisvKiAgICAgICAgICAgICAgICAuLi4gMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcgMDEyMzQ1NjcwMTIzNDU2NyAwMTIzNDU2NzAxMjM0NTY3ICovCiAJc2VxX3B1dHMoc2VxLAotCQkgICAiICAgICBDb25ucy9zICAgUGt0cy9zICAgUGt0cy9zICAgICAgICAgIEJ5dGVzL3MgICAgICAgICAgQnl0ZXMvc1xuIik7Ci0Jc2VxX3ByaW50ZihzZXEsICIgICAgJThYICU4WCAlOFggJTE2WCAlMTZYXG4iLAotCQkJcmF0ZXMuY3BzLAotCQkJcmF0ZXMuaW5wcHMsCi0JCQlyYXRlcy5vdXRwcHMsCi0JCQlyYXRlcy5pbmJwcywKLQkJCXJhdGVzLm91dGJwcyk7CisJCSAiICAgICBDb25ucy9zICAgUGt0cy9zICAgUGt0cy9zICAgICAgICAgIEJ5dGVzL3MgICAgICAgICAgQnl0ZXMvc1xuIik7CisJc2VxX3ByaW50ZihzZXEsICIgICAgJThMWCAlOExYICU4TFggJTE2TFggJTE2TFhcbiIsCisJCSAgIGtzdGF0cy5jcHMsCisJCSAgIGtzdGF0cy5pbnBwcywKKwkJICAga3N0YXRzLm91dHBwcywKKwkJICAga3N0YXRzLmluYnBzLAorCQkgICBrc3RhdHMub3V0YnBzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjQwMCw2ICsyNDI2LDcgQEAKIGlwX3ZzX2NvcHlfc2VydmljZShzdHJ1Y3QgaXBfdnNfc2VydmljZV9lbnRyeSAqZHN0LCBzdHJ1Y3QgaXBfdnNfc2VydmljZSAqc3JjKQogewogCXN0cnVjdCBpcF92c19zY2hlZHVsZXIgKnNjaGVkOworCXN0cnVjdCBpcF92c19rc3RhdHMga3N0YXRzOwogCiAJc2NoZWQgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHNyYy0+c2NoZWR1bGVyLCAxKTsKIAlkc3QtPnByb3RvY29sID0gc3JjLT5wcm90b2NvbDsKQEAgLTI0MTEsNyArMjQzOCw4IEBACiAJZHN0LT50aW1lb3V0ID0gc3JjLT50aW1lb3V0IC8gSFo7CiAJZHN0LT5uZXRtYXNrID0gc3JjLT5uZXRtYXNrOwogCWRzdC0+bnVtX2Rlc3RzID0gc3JjLT5udW1fZGVzdHM7Ci0JaXBfdnNfY29weV9zdGF0cygmZHN0LT5zdGF0cywgJnNyYy0+c3RhdHMpOworCWlwX3ZzX2NvcHlfc3RhdHMoJmtzdGF0cywgJnNyYy0+c3RhdHMpOworCWlwX3ZzX2V4cG9ydF9zdGF0c191c2VyKCZkc3QtPnN0YXRzLCAma3N0YXRzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKQEAgLTI0ODUsNiArMjUxMyw3IEBACiAJCWludCBjb3VudCA9IDA7CiAJCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwogCQlzdHJ1Y3QgaXBfdnNfZGVzdF9lbnRyeSBlbnRyeTsKKwkJc3RydWN0IGlwX3ZzX2tzdGF0cyBrc3RhdHM7CiAKIAkJbWVtc2V0KCZlbnRyeSwgMCwgc2l6ZW9mKGVudHJ5KSk7CiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzdCwgJnN2Yy0+ZGVzdGluYXRpb25zLCBuX2xpc3QpIHsKQEAgLTI1MDYsNyArMjUzNSw4IEBACiAJCQllbnRyeS5hY3RpdmVjb25ucyA9IGF0b21pY19yZWFkKCZkZXN0LT5hY3RpdmVjb25ucyk7CiAJCQllbnRyeS5pbmFjdGNvbm5zID0gYXRvbWljX3JlYWQoJmRlc3QtPmluYWN0Y29ubnMpOwogCQkJZW50cnkucGVyc2lzdGNvbm5zID0gYXRvbWljX3JlYWQoJmRlc3QtPnBlcnNpc3Rjb25ucyk7Ci0JCQlpcF92c19jb3B5X3N0YXRzKCZlbnRyeS5zdGF0cywgJmRlc3QtPnN0YXRzKTsKKwkJCWlwX3ZzX2NvcHlfc3RhdHMoJmtzdGF0cywgJmRlc3QtPnN0YXRzKTsKKwkJCWlwX3ZzX2V4cG9ydF9zdGF0c191c2VyKCZlbnRyeS5zdGF0cywgJmtzdGF0cyk7CiAJCQlpZiAoY29weV90b191c2VyKCZ1cHRyLT5lbnRyeXRhYmxlW2NvdW50XSwKIAkJCQkJICZlbnRyeSwgc2l6ZW9mKGVudHJ5KSkpIHsKIAkJCQlyZXQgPSAtRUZBVUxUOwpAQCAtMjc5OCwyNSArMjgyOCw1MSBAQAogfTsKIAogc3RhdGljIGludCBpcF92c19nZW5sX2ZpbGxfc3RhdHMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGNvbnRhaW5lcl90eXBlLAotCQkJCSBzdHJ1Y3QgaXBfdnNfc3RhdHMgKnN0YXRzKQorCQkJCSBzdHJ1Y3QgaXBfdnNfa3N0YXRzICprc3RhdHMpCiB7Ci0Jc3RydWN0IGlwX3ZzX3N0YXRzX3VzZXIgdXN0YXRzOwogCXN0cnVjdCBubGF0dHIgKm5sX3N0YXRzID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBjb250YWluZXJfdHlwZSk7CisKIAlpZiAoIW5sX3N0YXRzKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCi0JaXBfdnNfY29weV9zdGF0cygmdXN0YXRzLCBzdGF0cyk7CisJaWYgKG5sYV9wdXRfdTMyKHNrYiwgSVBWU19TVEFUU19BVFRSX0NPTk5TLCAodTMyKWtzdGF0cy0+Y29ubnMpIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwgSVBWU19TVEFUU19BVFRSX0lOUEtUUywgKHUzMilrc3RhdHMtPmlucGt0cykgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBJUFZTX1NUQVRTX0FUVFJfT1VUUEtUUywgKHUzMilrc3RhdHMtPm91dHBrdHMpIHx8CisJICAgIG5sYV9wdXRfdTY0KHNrYiwgSVBWU19TVEFUU19BVFRSX0lOQllURVMsIGtzdGF0cy0+aW5ieXRlcykgfHwKKwkgICAgbmxhX3B1dF91NjQoc2tiLCBJUFZTX1NUQVRTX0FUVFJfT1VUQllURVMsIGtzdGF0cy0+b3V0Ynl0ZXMpIHx8CisJICAgIG5sYV9wdXRfdTMyKHNrYiwgSVBWU19TVEFUU19BVFRSX0NQUywgKHUzMilrc3RhdHMtPmNwcykgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBJUFZTX1NUQVRTX0FUVFJfSU5QUFMsICh1MzIpa3N0YXRzLT5pbnBwcykgfHwKKwkgICAgbmxhX3B1dF91MzIoc2tiLCBJUFZTX1NUQVRTX0FUVFJfT1VUUFBTLCAodTMyKWtzdGF0cy0+b3V0cHBzKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIElQVlNfU1RBVFNfQVRUUl9JTkJQUywgKHUzMilrc3RhdHMtPmluYnBzKSB8fAorCSAgICBubGFfcHV0X3UzMihza2IsIElQVlNfU1RBVFNfQVRUUl9PVVRCUFMsICh1MzIpa3N0YXRzLT5vdXRicHMpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlubGFfbmVzdF9lbmQoc2tiLCBubF9zdGF0cyk7CiAKLQlpZiAobmxhX3B1dF91MzIoc2tiLCBJUFZTX1NUQVRTX0FUVFJfQ09OTlMsIHVzdGF0cy5jb25ucykgfHwKLQkgICAgbmxhX3B1dF91MzIoc2tiLCBJUFZTX1NUQVRTX0FUVFJfSU5QS1RTLCB1c3RhdHMuaW5wa3RzKSB8fAotCSAgICBubGFfcHV0X3UzMihza2IsIElQVlNfU1RBVFNfQVRUUl9PVVRQS1RTLCB1c3RhdHMub3V0cGt0cykgfHwKLQkgICAgbmxhX3B1dF91NjQoc2tiLCBJUFZTX1NUQVRTX0FUVFJfSU5CWVRFUywgdXN0YXRzLmluYnl0ZXMpIHx8Ci0JICAgIG5sYV9wdXRfdTY0KHNrYiwgSVBWU19TVEFUU19BVFRSX09VVEJZVEVTLCB1c3RhdHMub3V0Ynl0ZXMpIHx8Ci0JICAgIG5sYV9wdXRfdTMyKHNrYiwgSVBWU19TVEFUU19BVFRSX0NQUywgdXN0YXRzLmNwcykgfHwKLQkgICAgbmxhX3B1dF91MzIoc2tiLCBJUFZTX1NUQVRTX0FUVFJfSU5QUFMsIHVzdGF0cy5pbnBwcykgfHwKLQkgICAgbmxhX3B1dF91MzIoc2tiLCBJUFZTX1NUQVRTX0FUVFJfT1VUUFBTLCB1c3RhdHMub3V0cHBzKSB8fAotCSAgICBubGFfcHV0X3UzMihza2IsIElQVlNfU1RBVFNfQVRUUl9JTkJQUywgdXN0YXRzLmluYnBzKSB8fAotCSAgICBubGFfcHV0X3UzMihza2IsIElQVlNfU1RBVFNfQVRUUl9PVVRCUFMsIHVzdGF0cy5vdXRicHMpKQorCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJbmxhX25lc3RfY2FuY2VsKHNrYiwgbmxfc3RhdHMpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgaXBfdnNfZ2VubF9maWxsX3N0YXRzNjQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGNvbnRhaW5lcl90eXBlLAorCQkJCSAgIHN0cnVjdCBpcF92c19rc3RhdHMgKmtzdGF0cykKK3sKKwlzdHJ1Y3QgbmxhdHRyICpubF9zdGF0cyA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgY29udGFpbmVyX3R5cGUpOworCisJaWYgKCFubF9zdGF0cykKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmIChubGFfcHV0X3U2NChza2IsIElQVlNfU1RBVFNfQVRUUl9DT05OUywga3N0YXRzLT5jb25ucykgfHwKKwkgICAgbmxhX3B1dF91NjQoc2tiLCBJUFZTX1NUQVRTX0FUVFJfSU5QS1RTLCBrc3RhdHMtPmlucGt0cykgfHwKKwkgICAgbmxhX3B1dF91NjQoc2tiLCBJUFZTX1NUQVRTX0FUVFJfT1VUUEtUUywga3N0YXRzLT5vdXRwa3RzKSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIElQVlNfU1RBVFNfQVRUUl9JTkJZVEVTLCBrc3RhdHMtPmluYnl0ZXMpIHx8CisJICAgIG5sYV9wdXRfdTY0KHNrYiwgSVBWU19TVEFUU19BVFRSX09VVEJZVEVTLCBrc3RhdHMtPm91dGJ5dGVzKSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIElQVlNfU1RBVFNfQVRUUl9DUFMsIGtzdGF0cy0+Y3BzKSB8fAorCSAgICBubGFfcHV0X3U2NChza2IsIElQVlNfU1RBVFNfQVRUUl9JTlBQUywga3N0YXRzLT5pbnBwcykgfHwKKwkgICAgbmxhX3B1dF91NjQoc2tiLCBJUFZTX1NUQVRTX0FUVFJfT1VUUFBTLCBrc3RhdHMtPm91dHBwcykgfHwKKwkgICAgbmxhX3B1dF91NjQoc2tiLCBJUFZTX1NUQVRTX0FUVFJfSU5CUFMsIGtzdGF0cy0+aW5icHMpIHx8CisJICAgIG5sYV9wdXRfdTY0KHNrYiwgSVBWU19TVEFUU19BVFRSX09VVEJQUywga3N0YXRzLT5vdXRicHMpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlubGFfbmVzdF9lbmQoc2tiLCBubF9zdGF0cyk7CiAKQEAgLTI4MzUsNiArMjg5MSw3IEBACiAJc3RydWN0IG5sYXR0ciAqbmxfc2VydmljZTsKIAlzdHJ1Y3QgaXBfdnNfZmxhZ3MgZmxhZ3MgPSB7IC5mbGFncyA9IHN2Yy0+ZmxhZ3MsCiAJCQkJICAgICAubWFzayA9IH4wIH07CisJc3RydWN0IGlwX3ZzX2tzdGF0cyBrc3RhdHM7CiAKIAlubF9zZXJ2aWNlID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBJUFZTX0NNRF9BVFRSX1NFUlZJQ0UpOwogCWlmICghbmxfc2VydmljZSkKQEAgLTI4NjAsNyArMjkxNywxMCBAQAogCSAgICBubGFfcHV0X3UzMihza2IsIElQVlNfU1ZDX0FUVFJfVElNRU9VVCwgc3ZjLT50aW1lb3V0IC8gSFopIHx8CiAJICAgIG5sYV9wdXRfYmUzMihza2IsIElQVlNfU1ZDX0FUVFJfTkVUTUFTSywgc3ZjLT5uZXRtYXNrKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JaWYgKGlwX3ZzX2dlbmxfZmlsbF9zdGF0cyhza2IsIElQVlNfU1ZDX0FUVFJfU1RBVFMsICZzdmMtPnN0YXRzKSkKKwlpcF92c19jb3B5X3N0YXRzKCZrc3RhdHMsICZzdmMtPnN0YXRzKTsKKwlpZiAoaXBfdnNfZ2VubF9maWxsX3N0YXRzKHNrYiwgSVBWU19TVkNfQVRUUl9TVEFUUywgJmtzdGF0cykpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWlmIChpcF92c19nZW5sX2ZpbGxfc3RhdHM2NChza2IsIElQVlNfU1ZDX0FUVFJfU1RBVFM2NCwgJmtzdGF0cykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJbmxhX25lc3RfZW5kKHNrYiwgbmxfc2VydmljZSk7CkBAIC0zMDMyLDYgKzMwOTIsNyBAQAogc3RhdGljIGludCBpcF92c19nZW5sX2ZpbGxfZGVzdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgaXBfdnNfZGVzdCAqZGVzdCkKIHsKIAlzdHJ1Y3QgbmxhdHRyICpubF9kZXN0OworCXN0cnVjdCBpcF92c19rc3RhdHMga3N0YXRzOwogCiAJbmxfZGVzdCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgSVBWU19DTURfQVRUUl9ERVNUKTsKIAlpZiAoIW5sX2Rlc3QpCkBAIC0zMDU0LDcgKzMxMTUsMTAgQEAKIAkJCWF0b21pY19yZWFkKCZkZXN0LT5wZXJzaXN0Y29ubnMpKSB8fAogCSAgICBubGFfcHV0X3UxNihza2IsIElQVlNfREVTVF9BVFRSX0FERFJfRkFNSUxZLCBkZXN0LT5hZikpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWlmIChpcF92c19nZW5sX2ZpbGxfc3RhdHMoc2tiLCBJUFZTX0RFU1RfQVRUUl9TVEFUUywgJmRlc3QtPnN0YXRzKSkKKwlpcF92c19jb3B5X3N0YXRzKCZrc3RhdHMsICZkZXN0LT5zdGF0cyk7CisJaWYgKGlwX3ZzX2dlbmxfZmlsbF9zdGF0cyhza2IsIElQVlNfREVTVF9BVFRSX1NUQVRTLCAma3N0YXRzKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKGlwX3ZzX2dlbmxfZmlsbF9zdGF0czY0KHNrYiwgSVBWU19ERVNUX0FUVFJfU1RBVFM2NCwgJmtzdGF0cykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJbmxhX25lc3RfZW5kKHNrYiwgbmxfZGVzdCk7CkBAIC0zNzMyLDYgKzM3OTYsOCBAQAogCWlwdnMtPnN5c2N0bF9wbXR1X2Rpc2MgPSAxOwogCXRibFtpZHgrK10uZGF0YSA9ICZpcHZzLT5zeXNjdGxfcG10dV9kaXNjOwogCXRibFtpZHgrK10uZGF0YSA9ICZpcHZzLT5zeXNjdGxfYmFja3VwX29ubHk7CisJaXB2cy0+c3lzY3RsX2Nvbm5fcmV1c2VfbW9kZSA9IDE7CisJdGJsW2lkeCsrXS5kYXRhID0gJmlwdnMtPnN5c2N0bF9jb25uX3JldXNlX21vZGU7CiAKIAogCWlwdnMtPnN5c2N0bF9oZHIgPSByZWdpc3Rlcl9uZXRfc3lzY3RsKG5ldCwgIm5ldC9pcHY0L3ZzIiwgdGJsKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19lc3QuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19lc3QuYwppbmRleCAxNDI1ZTlhLi5lZjBlYjBhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfZXN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2VzdC5jCkBAIC00NSwxNyArNDUsMTkgQEAKIAogICBOT1RFUy4KIAotICAqIFRoZSBzdG9yZWQgdmFsdWUgZm9yIGF2ZXJhZ2UgYnBzIGlzIHNjYWxlZCBieSAyXjUsIHNvIHRoYXQgbWF4aW1hbAotICAgIHJhdGUgaXMgfjIuMTVHYml0cy9zLCBhdmVyYWdlIHBwcyBhbmQgY3BzIGFyZSBzY2FsZWQgYnkgMl4xMC4KKyAgKiBBdmVyYWdlIGJwcyBpcyBzY2FsZWQgYnkgMl41LCB3aGlsZSBhdmVyYWdlIHBwcyBhbmQgY3BzIGFyZSBzY2FsZWQgYnkgMl4xMC4KIAotICAqIEEgbG90IGNvZGUgaXMgdGFrZW4gZnJvbSBuZXQvc2NoZWQvZXN0aW1hdG9yLmMKKyAgKiBOZXRsaW5rIHVzZXJzIGNhbiBzZWUgNjQtYml0IHZhbHVlcyBidXQgc29ja29wdCB1c2VycyBhcmUgcmVzdHJpY3RlZAorICAgIHRvIDMyLWJpdCB2YWx1ZXMgZm9yIGNvbm5zLCBwYWNrZXRzLCBicHMsIGNwcyBhbmQgcHBzLgorCisgICogQSBsb3Qgb2YgY29kZSBpcyB0YWtlbiBmcm9tIG5ldC9jb3JlL2dlbl9lc3RpbWF0b3IuYwogICovCiAKIAogLyoKICAqIE1ha2UgYSBzdW1tYXJ5IGZyb20gZWFjaCBjcHUKICAqLwotc3RhdGljIHZvaWQgaXBfdnNfcmVhZF9jcHVfc3RhdHMoc3RydWN0IGlwX3ZzX3N0YXRzX3VzZXIgKnN1bSwKK3N0YXRpYyB2b2lkIGlwX3ZzX3JlYWRfY3B1X3N0YXRzKHN0cnVjdCBpcF92c19rc3RhdHMgKnN1bSwKIAkJCQkgc3RydWN0IGlwX3ZzX2NwdV9zdGF0cyBfX3BlcmNwdSAqc3RhdHMpCiB7CiAJaW50IGk7CkBAIC02NCwyNyArNjYsMzEgQEAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlzdHJ1Y3QgaXBfdnNfY3B1X3N0YXRzICpzID0gcGVyX2NwdV9wdHIoc3RhdHMsIGkpOwogCQl1bnNpZ25lZCBpbnQgc3RhcnQ7Ci0JCV9fdTY0IGluYnl0ZXMsIG91dGJ5dGVzOworCQl1NjQgY29ubnMsIGlucGt0cywgb3V0cGt0cywgaW5ieXRlcywgb3V0Ynl0ZXM7CisKIAkJaWYgKGFkZCkgewotCQkJc3VtLT5jb25ucyArPSBzLT51c3RhdHMuY29ubnM7Ci0JCQlzdW0tPmlucGt0cyArPSBzLT51c3RhdHMuaW5wa3RzOwotCQkJc3VtLT5vdXRwa3RzICs9IHMtPnVzdGF0cy5vdXRwa3RzOwogCQkJZG8gewogCQkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luKCZzLT5zeW5jcCk7Ci0JCQkJaW5ieXRlcyA9IHMtPnVzdGF0cy5pbmJ5dGVzOwotCQkJCW91dGJ5dGVzID0gcy0+dXN0YXRzLm91dGJ5dGVzOworCQkJCWNvbm5zID0gcy0+Y250LmNvbm5zOworCQkJCWlucGt0cyA9IHMtPmNudC5pbnBrdHM7CisJCQkJb3V0cGt0cyA9IHMtPmNudC5vdXRwa3RzOworCQkJCWluYnl0ZXMgPSBzLT5jbnQuaW5ieXRlczsKKwkJCQlvdXRieXRlcyA9IHMtPmNudC5vdXRieXRlczsKIAkJCX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeSgmcy0+c3luY3AsIHN0YXJ0KSk7CisJCQlzdW0tPmNvbm5zICs9IGNvbm5zOworCQkJc3VtLT5pbnBrdHMgKz0gaW5wa3RzOworCQkJc3VtLT5vdXRwa3RzICs9IG91dHBrdHM7CiAJCQlzdW0tPmluYnl0ZXMgKz0gaW5ieXRlczsKIAkJCXN1bS0+b3V0Ynl0ZXMgKz0gb3V0Ynl0ZXM7CiAJCX0gZWxzZSB7CiAJCQlhZGQgPSB0cnVlOwotCQkJc3VtLT5jb25ucyA9IHMtPnVzdGF0cy5jb25uczsKLQkJCXN1bS0+aW5wa3RzID0gcy0+dXN0YXRzLmlucGt0czsKLQkJCXN1bS0+b3V0cGt0cyA9IHMtPnVzdGF0cy5vdXRwa3RzOwogCQkJZG8gewogCQkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luKCZzLT5zeW5jcCk7Ci0JCQkJc3VtLT5pbmJ5dGVzID0gcy0+dXN0YXRzLmluYnl0ZXM7Ci0JCQkJc3VtLT5vdXRieXRlcyA9IHMtPnVzdGF0cy5vdXRieXRlczsKKwkJCQlzdW0tPmNvbm5zID0gcy0+Y250LmNvbm5zOworCQkJCXN1bS0+aW5wa3RzID0gcy0+Y250LmlucGt0czsKKwkJCQlzdW0tPm91dHBrdHMgPSBzLT5jbnQub3V0cGt0czsKKwkJCQlzdW0tPmluYnl0ZXMgPSBzLT5jbnQuaW5ieXRlczsKKwkJCQlzdW0tPm91dGJ5dGVzID0gcy0+Y250Lm91dGJ5dGVzOwogCQkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5KCZzLT5zeW5jcCwgc3RhcnQpKTsKIAkJfQogCX0KQEAgLTk1LDEwICsxMDEsNyBAQAogewogCXN0cnVjdCBpcF92c19lc3RpbWF0b3IgKmU7CiAJc3RydWN0IGlwX3ZzX3N0YXRzICpzOwotCXUzMiBuX2Nvbm5zOwotCXUzMiBuX2lucGt0cywgbl9vdXRwa3RzOwotCXU2NCBuX2luYnl0ZXMsIG5fb3V0Ynl0ZXM7Ci0JdTMyIHJhdGU7CisJdTY0IHJhdGU7CiAJc3RydWN0IG5ldCAqbmV0ID0gKHN0cnVjdCBuZXQgKilhcmc7CiAJc3RydWN0IG5ldG5zX2lwdnMgKmlwdnM7CiAKQEAgLTEwOCwzMyArMTExLDI5IEBACiAJCXMgPSBjb250YWluZXJfb2YoZSwgc3RydWN0IGlwX3ZzX3N0YXRzLCBlc3QpOwogCiAJCXNwaW5fbG9jaygmcy0+bG9jayk7Ci0JCWlwX3ZzX3JlYWRfY3B1X3N0YXRzKCZzLT51c3RhdHMsIHMtPmNwdXN0YXRzKTsKLQkJbl9jb25ucyA9IHMtPnVzdGF0cy5jb25uczsKLQkJbl9pbnBrdHMgPSBzLT51c3RhdHMuaW5wa3RzOwotCQluX291dHBrdHMgPSBzLT51c3RhdHMub3V0cGt0czsKLQkJbl9pbmJ5dGVzID0gcy0+dXN0YXRzLmluYnl0ZXM7Ci0JCW5fb3V0Ynl0ZXMgPSBzLT51c3RhdHMub3V0Ynl0ZXM7CisJCWlwX3ZzX3JlYWRfY3B1X3N0YXRzKCZzLT5rc3RhdHMsIHMtPmNwdXN0YXRzKTsKIAogCQkvKiBzY2FsZWQgYnkgMl4xMCwgYnV0IGRpdmlkZWQgMiBzZWNvbmRzICovCi0JCXJhdGUgPSAobl9jb25ucyAtIGUtPmxhc3RfY29ubnMpIDw8IDk7Ci0JCWUtPmxhc3RfY29ubnMgPSBuX2Nvbm5zOwotCQllLT5jcHMgKz0gKChsb25nKXJhdGUgLSAobG9uZyllLT5jcHMpID4+IDI7CisJCXJhdGUgPSAocy0+a3N0YXRzLmNvbm5zIC0gZS0+bGFzdF9jb25ucykgPDwgOTsKKwkJZS0+bGFzdF9jb25ucyA9IHMtPmtzdGF0cy5jb25uczsKKwkJZS0+Y3BzICs9ICgoczY0KXJhdGUgLSAoczY0KWUtPmNwcykgPj4gMjsKIAotCQlyYXRlID0gKG5faW5wa3RzIC0gZS0+bGFzdF9pbnBrdHMpIDw8IDk7Ci0JCWUtPmxhc3RfaW5wa3RzID0gbl9pbnBrdHM7Ci0JCWUtPmlucHBzICs9ICgobG9uZylyYXRlIC0gKGxvbmcpZS0+aW5wcHMpID4+IDI7CisJCXJhdGUgPSAocy0+a3N0YXRzLmlucGt0cyAtIGUtPmxhc3RfaW5wa3RzKSA8PCA5OworCQllLT5sYXN0X2lucGt0cyA9IHMtPmtzdGF0cy5pbnBrdHM7CisJCWUtPmlucHBzICs9ICgoczY0KXJhdGUgLSAoczY0KWUtPmlucHBzKSA+PiAyOwogCi0JCXJhdGUgPSAobl9vdXRwa3RzIC0gZS0+bGFzdF9vdXRwa3RzKSA8PCA5OwotCQllLT5sYXN0X291dHBrdHMgPSBuX291dHBrdHM7Ci0JCWUtPm91dHBwcyArPSAoKGxvbmcpcmF0ZSAtIChsb25nKWUtPm91dHBwcykgPj4gMjsKKwkJcmF0ZSA9IChzLT5rc3RhdHMub3V0cGt0cyAtIGUtPmxhc3Rfb3V0cGt0cykgPDwgOTsKKwkJZS0+bGFzdF9vdXRwa3RzID0gcy0+a3N0YXRzLm91dHBrdHM7CisJCWUtPm91dHBwcyArPSAoKHM2NClyYXRlIC0gKHM2NCllLT5vdXRwcHMpID4+IDI7CiAKLQkJcmF0ZSA9IChuX2luYnl0ZXMgLSBlLT5sYXN0X2luYnl0ZXMpIDw8IDQ7Ci0JCWUtPmxhc3RfaW5ieXRlcyA9IG5faW5ieXRlczsKLQkJZS0+aW5icHMgKz0gKChsb25nKXJhdGUgLSAobG9uZyllLT5pbmJwcykgPj4gMjsKKwkJLyogc2NhbGVkIGJ5IDJeNSwgYnV0IGRpdmlkZWQgMiBzZWNvbmRzICovCisJCXJhdGUgPSAocy0+a3N0YXRzLmluYnl0ZXMgLSBlLT5sYXN0X2luYnl0ZXMpIDw8IDQ7CisJCWUtPmxhc3RfaW5ieXRlcyA9IHMtPmtzdGF0cy5pbmJ5dGVzOworCQllLT5pbmJwcyArPSAoKHM2NClyYXRlIC0gKHM2NCllLT5pbmJwcykgPj4gMjsKIAotCQlyYXRlID0gKG5fb3V0Ynl0ZXMgLSBlLT5sYXN0X291dGJ5dGVzKSA8PCA0OwotCQllLT5sYXN0X291dGJ5dGVzID0gbl9vdXRieXRlczsKLQkJZS0+b3V0YnBzICs9ICgobG9uZylyYXRlIC0gKGxvbmcpZS0+b3V0YnBzKSA+PiAyOworCQlyYXRlID0gKHMtPmtzdGF0cy5vdXRieXRlcyAtIGUtPmxhc3Rfb3V0Ynl0ZXMpIDw8IDQ7CisJCWUtPmxhc3Rfb3V0Ynl0ZXMgPSBzLT5rc3RhdHMub3V0Ynl0ZXM7CisJCWUtPm91dGJwcyArPSAoKHM2NClyYXRlIC0gKHM2NCllLT5vdXRicHMpID4+IDI7CiAJCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2soJmlwdnMtPmVzdF9sb2NrKTsKQEAgLTE2NiwxNCArMTY1LDE0IEBACiB2b2lkIGlwX3ZzX3plcm9fZXN0aW1hdG9yKHN0cnVjdCBpcF92c19zdGF0cyAqc3RhdHMpCiB7CiAJc3RydWN0IGlwX3ZzX2VzdGltYXRvciAqZXN0ID0gJnN0YXRzLT5lc3Q7Ci0Jc3RydWN0IGlwX3ZzX3N0YXRzX3VzZXIgKnUgPSAmc3RhdHMtPnVzdGF0czsKKwlzdHJ1Y3QgaXBfdnNfa3N0YXRzICprID0gJnN0YXRzLT5rc3RhdHM7CiAKIAkvKiByZXNldCBjb3VudGVycywgY2FsbGVyIG11c3QgaG9sZCB0aGUgc3RhdHMtPmxvY2sgbG9jayAqLwotCWVzdC0+bGFzdF9pbmJ5dGVzID0gdS0+aW5ieXRlczsKLQllc3QtPmxhc3Rfb3V0Ynl0ZXMgPSB1LT5vdXRieXRlczsKLQllc3QtPmxhc3RfY29ubnMgPSB1LT5jb25uczsKLQllc3QtPmxhc3RfaW5wa3RzID0gdS0+aW5wa3RzOwotCWVzdC0+bGFzdF9vdXRwa3RzID0gdS0+b3V0cGt0czsKKwllc3QtPmxhc3RfaW5ieXRlcyA9IGstPmluYnl0ZXM7CisJZXN0LT5sYXN0X291dGJ5dGVzID0gay0+b3V0Ynl0ZXM7CisJZXN0LT5sYXN0X2Nvbm5zID0gay0+Y29ubnM7CisJZXN0LT5sYXN0X2lucGt0cyA9IGstPmlucGt0czsKKwllc3QtPmxhc3Rfb3V0cGt0cyA9IGstPm91dHBrdHM7CiAJZXN0LT5jcHMgPSAwOwogCWVzdC0+aW5wcHMgPSAwOwogCWVzdC0+b3V0cHBzID0gMDsKQEAgLTE4Miw4ICsxODEsNyBAQAogfQogCiAvKiBHZXQgZGVjb2RlZCByYXRlcyAqLwotdm9pZCBpcF92c19yZWFkX2VzdGltYXRvcihzdHJ1Y3QgaXBfdnNfc3RhdHNfdXNlciAqZHN0LAotCQkJICBzdHJ1Y3QgaXBfdnNfc3RhdHMgKnN0YXRzKQordm9pZCBpcF92c19yZWFkX2VzdGltYXRvcihzdHJ1Y3QgaXBfdnNfa3N0YXRzICpkc3QsIHN0cnVjdCBpcF92c19zdGF0cyAqc3RhdHMpCiB7CiAJc3RydWN0IGlwX3ZzX2VzdGltYXRvciAqZSA9ICZzdGF0cy0+ZXN0OwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc3luYy5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3N5bmMuYwppbmRleCBkOTNjZWViLi4xOWI5Y2NlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc3luYy5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zeW5jLmMKQEAgLTg0NSwxMCArODQ1LDI3IEBACiAJc3RydWN0IGlwX3ZzX2Nvbm4gKmNwOwogCXN0cnVjdCBuZXRuc19pcHZzICppcHZzID0gbmV0X2lwdnMobmV0KTsKIAotCWlmICghKGZsYWdzICYgSVBfVlNfQ09OTl9GX1RFTVBMQVRFKSkKKwlpZiAoIShmbGFncyAmIElQX1ZTX0NPTk5fRl9URU1QTEFURSkpIHsKIAkJY3AgPSBpcF92c19jb25uX2luX2dldChwYXJhbSk7Ci0JZWxzZQorCQlpZiAoY3AgJiYgKChjcC0+ZHBvcnQgIT0gZHBvcnQpIHx8CisJCQkgICAhaXBfdnNfYWRkcl9lcXVhbChjcC0+ZGFmLCAmY3AtPmRhZGRyLCBkYWRkcikpKSB7CisJCQlpZiAoIShmbGFncyAmIElQX1ZTX0NPTk5fRl9JTkFDVElWRSkpIHsKKwkJCQlpcF92c19jb25uX2V4cGlyZV9ub3coY3ApOworCQkJCV9faXBfdnNfY29ubl9wdXQoY3ApOworCQkJCWNwID0gTlVMTDsKKwkJCX0gZWxzZSB7CisJCQkJLyogVGhpcyBpcyB0aGUgZXhwaXJhdGlvbiBtZXNzYWdlIGZvciB0aGUKKwkJCQkgKiBjb25uZWN0aW9uIHRoYXQgd2FzIGFscmVhZHkgcmVwbGFjZWQsIHNvIHdlCisJCQkJICoganVzdCBpZ25vcmUgaXQuCisJCQkJICovCisJCQkJX19pcF92c19jb25uX3B1dChjcCk7CisJCQkJa2ZyZWUocGFyYW0tPnBlX2RhdGEpOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CiAJCWNwID0gaXBfdnNfY3RfaW5fZ2V0KHBhcmFtKTsKKwl9CiAKIAlpZiAoY3ApIHsKIAkJLyogRnJlZSBwZV9kYXRhICovCkBAIC0xMzg4LDkgKzE0MDUsMTEgQEAKIAogCW1yZXEuaW1yX2lmaW5kZXggPSBkZXYtPmlmaW5kZXg7CiAKKwlydG5sX2xvY2soKTsKIAlsb2NrX3NvY2soc2spOwogCXJldCA9IGlwX21jX2pvaW5fZ3JvdXAoc2ssICZtcmVxKTsKIAlyZWxlYXNlX3NvY2soc2spOworCXJ0bmxfdW5sb2NrKCk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3htaXQuYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c194bWl0LmMKaW5kZXggM2FlZGJkYS4uMTk5ODZlYyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3htaXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jCkBAIC0yMDksNyArMjA5LDcgQEAKIAlzdHJ1Y3Qgc29jayAqc2sgPSBza2ItPnNrOwogCXN0cnVjdCBydGFibGUgKm9ydCA9IHNrYl9ydGFibGUoc2tiKTsKIAotCWlmICghc2tiLT5kZXYgJiYgc2sgJiYgc2stPnNrX3N0YXRlICE9IFRDUF9USU1FX1dBSVQpCisJaWYgKCFza2ItPmRldiAmJiBzayAmJiBza19mdWxsc29jayhzaykpCiAJCW9ydC0+ZHN0Lm9wcy0+dXBkYXRlX3BtdHUoJm9ydC0+ZHN0LCBzaywgTlVMTCwgbXR1KTsKIH0KIApAQCAtNTM2LDggKzUzNiw4IEBACiAJCWlwX3ZzX3VwZGF0ZV9jb25udHJhY2soc2tiLCBjcCwgMSk7CiAJaWYgKCFsb2NhbCkgewogCQlza2JfZm9yd2FyZF9jc3VtKHNrYik7Ci0JCU5GX0hPT0socGYsIE5GX0lORVRfTE9DQUxfT1VULCBza2IsIE5VTEwsIHNrYl9kc3Qoc2tiKS0+ZGV2LAotCQkJZHN0X291dHB1dCk7CisJCU5GX0hPT0socGYsIE5GX0lORVRfTE9DQUxfT1VULCBOVUxMLCBza2IsCisJCQlOVUxMLCBza2JfZHN0KHNrYiktPmRldiwgZHN0X291dHB1dF9zayk7CiAJfSBlbHNlCiAJCXJldCA9IE5GX0FDQ0VQVDsKIAlyZXR1cm4gcmV0OwpAQCAtNTU0LDggKzU1NCw4IEBACiAJCWlwX3ZzX25vdHJhY2soc2tiKTsKIAlpZiAoIWxvY2FsKSB7CiAJCXNrYl9mb3J3YXJkX2NzdW0oc2tiKTsKLQkJTkZfSE9PSyhwZiwgTkZfSU5FVF9MT0NBTF9PVVQsIHNrYiwgTlVMTCwgc2tiX2RzdChza2IpLT5kZXYsCi0JCQlkc3Rfb3V0cHV0KTsKKwkJTkZfSE9PSyhwZiwgTkZfSU5FVF9MT0NBTF9PVVQsIE5VTEwsIHNrYiwKKwkJCU5VTEwsIHNrYl9kc3Qoc2tiKS0+ZGV2LCBkc3Rfb3V0cHV0X3NrKTsKIAl9IGVsc2UKIAkJcmV0ID0gTkZfQUNDRVBUOwogCXJldHVybiByZXQ7CkBAIC05MjQsNyArOTI0LDggQEAKIGlwX3ZzX3R1bm5lbF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpcF92c19jb25uICpjcCwKIAkJICBzdHJ1Y3QgaXBfdnNfcHJvdG9jb2wgKnBwLCBzdHJ1Y3QgaXBfdnNfaXBoZHIgKmlwdnNoKQogewotCXN0cnVjdCBuZXRuc19pcHZzICppcHZzID0gbmV0X2lwdnMoc2tiX25ldChza2IpKTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBza2JfbmV0KHNrYik7CisJc3RydWN0IG5ldG5zX2lwdnMgKmlwdnMgPSBuZXRfaXB2cyhuZXQpOwogCXN0cnVjdCBydGFibGUgKnJ0OwkJCS8qIFJvdXRlIHRvIHRoZSBvdGhlciBob3N0ICovCiAJX19iZTMyIHNhZGRyOwkJCQkvKiBTb3VyY2UgZm9yIHR1bm5lbCAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICp0ZGV2OwkJLyogRGV2aWNlIHRvIG90aGVyIGhvc3QgKi8KQEAgLTk5MSw3ICs5OTIsNyBAQAogCWlwaC0+ZGFkZHIJCT0JY3AtPmRhZGRyLmlwOwogCWlwaC0+c2FkZHIJCT0Jc2FkZHI7CiAJaXBoLT50dGwJCT0JdHRsOwotCWlwX3NlbGVjdF9pZGVudChza2IsIE5VTEwpOworCWlwX3NlbGVjdF9pZGVudChuZXQsIHNrYiwgTlVMTCk7CiAKIAkvKiBBbm90aGVyIGhhY2s6IGF2b2lkIGljbXBfc2VuZCBpbiBpcF9mcmFnbWVudCAqLwogCXNrYi0+aWdub3JlX2RmID0gMTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuYwppbmRleCBhNGI1ZTJhLi40NWRhMTFhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5jCkBAIC00Nyw5ICs0NywxMSBAQAogCQlyZXR1cm4gMDsKIAogCWNvdW50ZXIgPSBhY2N0LT5jb3VudGVyOwotCXJldHVybiBzZXFfcHJpbnRmKHMsICJwYWNrZXRzPSVsbHUgYnl0ZXM9JWxsdSAiLAotCQkJICAodW5zaWduZWQgbG9uZyBsb25nKWF0b21pYzY0X3JlYWQoJmNvdW50ZXJbZGlyXS5wYWNrZXRzKSwKLQkJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylhdG9taWM2NF9yZWFkKCZjb3VudGVyW2Rpcl0uYnl0ZXMpKTsKKwlzZXFfcHJpbnRmKHMsICJwYWNrZXRzPSVsbHUgYnl0ZXM9JWxsdSAiLAorCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWF0b21pYzY0X3JlYWQoJmNvdW50ZXJbZGlyXS5wYWNrZXRzKSwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhdG9taWM2NF9yZWFkKCZjb3VudGVyW2Rpcl0uYnl0ZXMpKTsKKworCXJldHVybiAwOwogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNlcV9wcmludF9hY2N0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYW1hbmRhLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hbWFuZGEuYwppbmRleCBiOGI5NWY0Li41N2EyNmNjIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hbWFuZGEuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hbWFuZGEuYwpAQCAtODgsNyArODgsNiBAQAogCQkgICAgICAgc3RydWN0IG5mX2Nvbm4gKmN0LAogCQkgICAgICAgZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm8pCiB7Ci0Jc3RydWN0IHRzX3N0YXRlIHRzOwogCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7CiAJc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGU7CiAJdW5zaWduZWQgaW50IGRhdGFvZmYsIHN0YXJ0LCBzdG9wLCBvZmYsIGk7CkBAIC0xMTMsMjMgKzExMiwyMCBAQAogCQlyZXR1cm4gTkZfQUNDRVBUOwogCX0KIAotCW1lbXNldCgmdHMsIDAsIHNpemVvZih0cykpOwogCXN0YXJ0ID0gc2tiX2ZpbmRfdGV4dChza2IsIGRhdGFvZmYsIHNrYi0+bGVuLAotCQkJICAgICAgc2VhcmNoW1NFQVJDSF9DT05ORUNUXS50cywgJnRzKTsKKwkJCSAgICAgIHNlYXJjaFtTRUFSQ0hfQ09OTkVDVF0udHMpOwogCWlmIChzdGFydCA9PSBVSU5UX01BWCkKIAkJZ290byBvdXQ7CiAJc3RhcnQgKz0gZGF0YW9mZiArIHNlYXJjaFtTRUFSQ0hfQ09OTkVDVF0ubGVuOwogCi0JbWVtc2V0KCZ0cywgMCwgc2l6ZW9mKHRzKSk7CiAJc3RvcCA9IHNrYl9maW5kX3RleHQoc2tiLCBzdGFydCwgc2tiLT5sZW4sCi0JCQkgICAgIHNlYXJjaFtTRUFSQ0hfTkVXTElORV0udHMsICZ0cyk7CisJCQkgICAgIHNlYXJjaFtTRUFSQ0hfTkVXTElORV0udHMpOwogCWlmIChzdG9wID09IFVJTlRfTUFYKQogCQlnb3RvIG91dDsKIAlzdG9wICs9IHN0YXJ0OwogCiAJZm9yIChpID0gU0VBUkNIX0RBVEE7IGkgPD0gU0VBUkNIX0lOREVYOyBpKyspIHsKLQkJbWVtc2V0KCZ0cywgMCwgc2l6ZW9mKHRzKSk7Ci0JCW9mZiA9IHNrYl9maW5kX3RleHQoc2tiLCBzdGFydCwgc3RvcCwgc2VhcmNoW2ldLnRzLCAmdHMpOworCQlvZmYgPSBza2JfZmluZF90ZXh0KHNrYiwgc3RhcnQsIHN0b3AsIHNlYXJjaFtpXS50cyk7CiAJCWlmIChvZmYgPT0gVUlOVF9NQVgpCiAJCQljb250aW51ZTsKIAkJb2ZmICs9IHN0YXJ0ICsgc2VhcmNoW2ldLmxlbjsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKaW5kZXggOTFhMTgzNy4uN2ExNzA3MCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKQEAgLTU2MSw3ICs1NjEsOSBAQAogCQkJCSAgIGhlbHBlci0+ZXhwZWN0X3BvbGljeVtleHBlY3QtPmNsYXNzXS5uYW1lKTsKIAl9CiAKLQlyZXR1cm4gc2VxX3B1dGMocywgJ1xuJyk7CisJc2VxX3B1dGMocywgJ1xuJyk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyBleHBfc2VxX29wcyA9IHsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfaW50ZXJuYWxzLmggYi9uZXQvbmV0ZmlsdGVyL25mX2ludGVybmFscy5oCmluZGV4IDYxYTNjOTIuLmVhN2YzNjcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfaW50ZXJuYWxzLmgKKysrIGIvbmV0L25ldGZpbHRlci9uZl9pbnRlcm5hbHMuaApAQCAtMTQsMTYgKzE0LDExIEBACiAKIC8qIGNvcmUuYyAqLwogdW5zaWduZWQgaW50IG5mX2l0ZXJhdGUoc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCXVuc2lnbmVkIGludCBob29rLCBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsCi0JCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAotCQkJc3RydWN0IG5mX2hvb2tfb3BzICoqZWxlbXAsCi0JCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSwgaW50IGhvb2tfdGhyZXNoKTsKKwkJCXN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSwgc3RydWN0IG5mX2hvb2tfb3BzICoqZWxlbXApOwogCiAvKiBuZl9xdWV1ZS5jICovCi1pbnQgbmZfcXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2hvb2tfb3BzICplbGVtLCB1X2ludDhfdCBwZiwKLQkgICAgIHVuc2lnbmVkIGludCBob29rLCBzdHJ1Y3QgbmV0X2RldmljZSAqaW5kZXYsCi0JICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LCBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSwKLQkgICAgIHVuc2lnbmVkIGludCBxdWV1ZW51bSk7CitpbnQgbmZfcXVldWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5mX2hvb2tfb3BzICplbGVtLAorCSAgICAgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLCB1bnNpZ25lZCBpbnQgcXVldWVudW0pOwogaW50IF9faW5pdCBuZXRmaWx0ZXJfcXVldWVfaW5pdCh2b2lkKTsKIAogLyogbmZfbG9nLmMgKi8KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2xvZy5jCmluZGV4IDBkODQ0OGYuLjY3NWQxMmMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfbG9nLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9sb2cuYwpAQCAtMjEyLDYgKzIxMiwzMCBAQAogfQogRVhQT1JUX1NZTUJPTChuZl9sb2dfcGFja2V0KTsKIAordm9pZCBuZl9sb2dfdHJhY2Uoc3RydWN0IG5ldCAqbmV0LAorCQkgIHVfaW50OF90IHBmLAorCQkgIHVuc2lnbmVkIGludCBob29rbnVtLAorCQkgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCSAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAorCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpvdXQsCisJCSAgY29uc3Qgc3RydWN0IG5mX2xvZ2luZm8gKmxvZ2luZm8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwljaGFyIHByZWZpeFtORl9MT0dfUFJFRklYTEVOXTsKKwljb25zdCBzdHJ1Y3QgbmZfbG9nZ2VyICpsb2dnZXI7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbG9nZ2VyID0gcmN1X2RlcmVmZXJlbmNlKG5ldC0+bmYubmZfbG9nZ2Vyc1twZl0pOworCWlmIChsb2dnZXIpIHsKKwkJdmFfc3RhcnQoYXJncywgZm10KTsKKwkJdnNucHJpbnRmKHByZWZpeCwgc2l6ZW9mKHByZWZpeCksIGZtdCwgYXJncyk7CisJCXZhX2VuZChhcmdzKTsKKwkJbG9nZ2VyLT5sb2dmbihuZXQsIHBmLCBob29rbnVtLCBza2IsIGluLCBvdXQsIGxvZ2luZm8sIHByZWZpeCk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorRVhQT1JUX1NZTUJPTChuZl9sb2dfdHJhY2UpOworCiAjZGVmaW5lIFNfU0laRSAoMTAyNCAtIChzaXplb2YodW5zaWduZWQgaW50KSArIDEpKQogCiBzdHJ1Y3QgbmZfbG9nX2J1ZiB7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2xvZ19jb21tb24uYyBiL25ldC9uZXRmaWx0ZXIvbmZfbG9nX2NvbW1vbi5jCmluZGV4IGEyMjMzZTcuLmE1YWE1OTYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfbG9nX2NvbW1vbi5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfbG9nX2NvbW1vbi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X0xPRy5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfbG9nLmg+CiAKQEAgLTEzMyw3ICsxMzQsNyBAQAogCiB2b2lkIG5mX2xvZ19kdW1wX3NrX3VpZF9naWQoc3RydWN0IG5mX2xvZ19idWYgKm0sIHN0cnVjdCBzb2NrICpzaykKIHsKLQlpZiAoIXNrIHx8IHNrLT5za19zdGF0ZSA9PSBUQ1BfVElNRV9XQUlUKQorCWlmICghc2sgfHwgIXNrX2Z1bGxzb2NrKHNrKSkKIAkJcmV0dXJuOwogCiAJcmVhZF9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CkBAIC0xNjMsMTAgKzE2NCwxMCBAQAogCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c2luZGV2OwogCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c291dGRldjsKIAotCQlwaHlzaW5kZXYgPSBza2ItPm5mX2JyaWRnZS0+cGh5c2luZGV2OworCQlwaHlzaW5kZXYgPSBuZl9icmlkZ2VfZ2V0X3BoeXNpbmRldihza2IpOwogCQlpZiAocGh5c2luZGV2ICYmIGluICE9IHBoeXNpbmRldikKIAkJCW5mX2xvZ19idWZfYWRkKG0sICJQSFlTSU49JXMgIiwgcGh5c2luZGV2LT5uYW1lKTsKLQkJcGh5c291dGRldiA9IHNrYi0+bmZfYnJpZGdlLT5waHlzb3V0ZGV2OworCQlwaHlzb3V0ZGV2ID0gbmZfYnJpZGdlX2dldF9waHlzb3V0ZGV2KHNrYik7CiAJCWlmIChwaHlzb3V0ZGV2ICYmIG91dCAhPSBwaHlzb3V0ZGV2KQogCQkJbmZfbG9nX2J1Zl9hZGQobSwgIlBIWVNPVVQ9JXMgIiwgcGh5c291dGRldi0+bmFtZSk7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9xdWV1ZS5jIGIvbmV0L25ldGZpbHRlci9uZl9xdWV1ZS5jCmluZGV4IDRjOGI2OGUuLjJlODgwMzIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfcXVldWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX3F1ZXVlLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxuZXQvcHJvdG9jb2wuaD4KQEAgLTQ3LDE5ICs0OCwyNSBAQAogCiB2b2lkIG5mX3F1ZXVlX2VudHJ5X3JlbGVhc2VfcmVmcyhzdHJ1Y3QgbmZfcXVldWVfZW50cnkgKmVudHJ5KQogeworCXN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSA9ICZlbnRyeS0+c3RhdGU7CisKIAkvKiBSZWxlYXNlIHRob3NlIGRldmljZXMgd2UgaGVsZCwgb3IgQWxleGV5IHdpbGwga2lsbCBtZS4gKi8KLQlpZiAoZW50cnktPmluZGV2KQotCQlkZXZfcHV0KGVudHJ5LT5pbmRldik7Ci0JaWYgKGVudHJ5LT5vdXRkZXYpCi0JCWRldl9wdXQoZW50cnktPm91dGRldik7CisJaWYgKHN0YXRlLT5pbikKKwkJZGV2X3B1dChzdGF0ZS0+aW4pOworCWlmIChzdGF0ZS0+b3V0KQorCQlkZXZfcHV0KHN0YXRlLT5vdXQpOworCWlmIChzdGF0ZS0+c2spCisJCXNvY2tfcHV0KHN0YXRlLT5zayk7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQlJJREdFX05FVEZJTFRFUikKIAlpZiAoZW50cnktPnNrYi0+bmZfYnJpZGdlKSB7Ci0JCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gZW50cnktPnNrYi0+bmZfYnJpZGdlOworCQlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c2RldjsKIAotCQlpZiAobmZfYnJpZGdlLT5waHlzaW5kZXYpCi0JCQlkZXZfcHV0KG5mX2JyaWRnZS0+cGh5c2luZGV2KTsKLQkJaWYgKG5mX2JyaWRnZS0+cGh5c291dGRldikKLQkJCWRldl9wdXQobmZfYnJpZGdlLT5waHlzb3V0ZGV2KTsKKwkJcGh5c2RldiA9IG5mX2JyaWRnZV9nZXRfcGh5c2luZGV2KGVudHJ5LT5za2IpOworCQlpZiAocGh5c2RldikKKwkJCWRldl9wdXQocGh5c2Rldik7CisJCXBoeXNkZXYgPSBuZl9icmlkZ2VfZ2V0X3BoeXNvdXRkZXYoZW50cnktPnNrYik7CisJCWlmIChwaHlzZGV2KQorCQkJZGV2X3B1dChwaHlzZGV2KTsKIAl9CiAjZW5kaWYKIAkvKiBEcm9wIHJlZmVyZW5jZSB0byBvd25lciBvZiBob29rIHdoaWNoIHF1ZXVlZCB1cy4gKi8KQEAgLTcwLDIyICs3NywyNSBAQAogLyogQnVtcCBkZXYgcmVmcyBzbyB0aGV5IGRvbid0IHZhbmlzaCB3aGlsZSBwYWNrZXQgaXMgb3V0ICovCiBib29sIG5mX3F1ZXVlX2VudHJ5X2dldF9yZWZzKHN0cnVjdCBuZl9xdWV1ZV9lbnRyeSAqZW50cnkpCiB7CisJc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlID0gJmVudHJ5LT5zdGF0ZTsKKwogCWlmICghdHJ5X21vZHVsZV9nZXQoZW50cnktPmVsZW0tPm93bmVyKSkKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKGVudHJ5LT5pbmRldikKLQkJZGV2X2hvbGQoZW50cnktPmluZGV2KTsKLQlpZiAoZW50cnktPm91dGRldikKLQkJZGV2X2hvbGQoZW50cnktPm91dGRldik7CisJaWYgKHN0YXRlLT5pbikKKwkJZGV2X2hvbGQoc3RhdGUtPmluKTsKKwlpZiAoc3RhdGUtPm91dCkKKwkJZGV2X2hvbGQoc3RhdGUtPm91dCk7CisJaWYgKHN0YXRlLT5zaykKKwkJc29ja19ob2xkKHN0YXRlLT5zayk7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfQlJJREdFX05FVEZJTFRFUikKIAlpZiAoZW50cnktPnNrYi0+bmZfYnJpZGdlKSB7Ci0JCXN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlID0gZW50cnktPnNrYi0+bmZfYnJpZGdlOwogCQlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c2RldjsKIAotCQlwaHlzZGV2ID0gbmZfYnJpZGdlLT5waHlzaW5kZXY7CisJCXBoeXNkZXYgPSBuZl9icmlkZ2VfZ2V0X3BoeXNpbmRldihlbnRyeS0+c2tiKTsKIAkJaWYgKHBoeXNkZXYpCiAJCQlkZXZfaG9sZChwaHlzZGV2KTsKLQkJcGh5c2RldiA9IG5mX2JyaWRnZS0+cGh5c291dGRldjsKKwkJcGh5c2RldiA9IG5mX2JyaWRnZV9nZXRfcGh5c291dGRldihlbnRyeS0+c2tiKTsKIAkJaWYgKHBoeXNkZXYpCiAJCQlkZXZfaG9sZChwaHlzZGV2KTsKIAl9CkBAIC0xMDAsMTIgKzExMCw5IEBACiAgKiB0aHJvdWdoIG5mX3JlaW5qZWN0KCkuCiAgKi8KIGludCBuZl9xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgICAgICBzdHJ1Y3QgbmZfaG9va19vcHMgKmVsZW0sCi0JCSAgICAgIHVfaW50OF90IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywKLQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2LAotCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0ZGV2LAotCQkgICAgICBpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSwKLQkJICAgICAgdW5zaWduZWQgaW50IHF1ZXVlbnVtKQorCSAgICAgc3RydWN0IG5mX2hvb2tfb3BzICplbGVtLAorCSAgICAgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlLAorCSAgICAgdW5zaWduZWQgaW50IHF1ZXVlbnVtKQogewogCWludCBzdGF0dXMgPSAtRU5PRU5UOwogCXN0cnVjdCBuZl9xdWV1ZV9lbnRyeSAqZW50cnkgPSBOVUxMOwpAQCAtMTIxLDcgKzEyOCw3IEBACiAJCWdvdG8gZXJyX3VubG9jazsKIAl9CiAKLQlhZmluZm8gPSBuZl9nZXRfYWZpbmZvKHBmKTsKKwlhZmluZm8gPSBuZl9nZXRfYWZpbmZvKHN0YXRlLT5wZik7CiAJaWYgKCFhZmluZm8pCiAJCWdvdG8gZXJyX3VubG9jazsKIApAQCAtMTM0LDExICsxNDEsNyBAQAogCSplbnRyeSA9IChzdHJ1Y3QgbmZfcXVldWVfZW50cnkpIHsKIAkJLnNrYgk9IHNrYiwKIAkJLmVsZW0JPSBlbGVtLAotCQkucGYJPSBwZiwKLQkJLmhvb2sJPSBob29rLAotCQkuaW5kZXYJPSBpbmRldiwKLQkJLm91dGRldgk9IG91dGRldiwKLQkJLm9rZm4JPSBva2ZuLAorCQkuc3RhdGUJPSAqc3RhdGUsCiAJCS5zaXplCT0gc2l6ZW9mKCplbnRyeSkgKyBhZmluZm8tPnJvdXRlX2tleV9zaXplLAogCX07CiAKQEAgLTE4NCwzMCArMTg3LDI5IEBACiAJfQogCiAJaWYgKHZlcmRpY3QgPT0gTkZfQUNDRVBUKSB7Ci0JCWFmaW5mbyA9IG5mX2dldF9hZmluZm8oZW50cnktPnBmKTsKKwkJYWZpbmZvID0gbmZfZ2V0X2FmaW5mbyhlbnRyeS0+c3RhdGUucGYpOwogCQlpZiAoIWFmaW5mbyB8fCBhZmluZm8tPnJlcm91dGUoc2tiLCBlbnRyeSkgPCAwKQogCQkJdmVyZGljdCA9IE5GX0RST1A7CiAJfQogCisJZW50cnktPnN0YXRlLnRocmVzaCA9IElOVF9NSU47CisKIAlpZiAodmVyZGljdCA9PSBORl9BQ0NFUFQpIHsKIAluZXh0X2hvb2s6Ci0JCXZlcmRpY3QgPSBuZl9pdGVyYXRlKCZuZl9ob29rc1tlbnRyeS0+cGZdW2VudHJ5LT5ob29rXSwKLQkJCQkgICAgIHNrYiwgZW50cnktPmhvb2ssCi0JCQkJICAgICBlbnRyeS0+aW5kZXYsIGVudHJ5LT5vdXRkZXYsICZlbGVtLAotCQkJCSAgICAgZW50cnktPm9rZm4sIElOVF9NSU4pOworCQl2ZXJkaWN0ID0gbmZfaXRlcmF0ZSgmbmZfaG9va3NbZW50cnktPnN0YXRlLnBmXVtlbnRyeS0+c3RhdGUuaG9va10sCisJCQkJICAgICBza2IsICZlbnRyeS0+c3RhdGUsICZlbGVtKTsKIAl9CiAKIAlzd2l0Y2ggKHZlcmRpY3QgJiBORl9WRVJESUNUX01BU0spIHsKIAljYXNlIE5GX0FDQ0VQVDoKIAljYXNlIE5GX1NUT1A6CiAJCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQkJZW50cnktPm9rZm4oc2tiKTsKKwkJZW50cnktPnN0YXRlLm9rZm4oZW50cnktPnN0YXRlLnNrLCBza2IpOwogCQlsb2NhbF9iaF9lbmFibGUoKTsKIAkJYnJlYWs7CiAJY2FzZSBORl9RVUVVRToKLQkJZXJyID0gbmZfcXVldWUoc2tiLCBlbGVtLCBlbnRyeS0+cGYsIGVudHJ5LT5ob29rLAotCQkJCWVudHJ5LT5pbmRldiwgZW50cnktPm91dGRldiwgZW50cnktPm9rZm4sCi0JCQkJdmVyZGljdCA+PiBORl9WRVJESUNUX1FCSVRTKTsKKwkJZXJyID0gbmZfcXVldWUoc2tiLCBlbGVtLCAmZW50cnktPnN0YXRlLAorCQkJICAgICAgIHZlcmRpY3QgPj4gTkZfVkVSRElDVF9RQklUUyk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlpZiAoZXJyID09IC1FQ0FOQ0VMRUQpCiAJCQkJZ290byBuZXh0X2hvb2s7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19hcGkuYyBiL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FwaS5jCmluZGV4IDZhYjc3NzkuLjc4YWY4M2IgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FwaS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2FwaS5jCkBAIC0xOTgsMzYgKzE5OCwzMSBAQAogc3RhdGljIGlubGluZSBib29sCiBuZnRfcnVsZV9pc19hY3RpdmUoc3RydWN0IG5ldCAqbmV0LCBjb25zdCBzdHJ1Y3QgbmZ0X3J1bGUgKnJ1bGUpCiB7Ci0JcmV0dXJuIChydWxlLT5nZW5tYXNrICYgKDEgPDwgbmV0LT5uZnQuZ2VuY3Vyc29yKSkgPT0gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ2VuY3Vyc29yX25leHQoc3RydWN0IG5ldCAqbmV0KQotewotCXJldHVybiBuZXQtPm5mdC5nZW5jdXJzb3IrMSA9PSAxID8gMSA6IDA7CisJcmV0dXJuIChydWxlLT5nZW5tYXNrICYgbmZ0X2dlbm1hc2tfY3VyKG5ldCkpID09IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50CiBuZnRfcnVsZV9pc19hY3RpdmVfbmV4dChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBuZnRfcnVsZSAqcnVsZSkKIHsKLQlyZXR1cm4gKHJ1bGUtPmdlbm1hc2sgJiAoMSA8PCBnZW5jdXJzb3JfbmV4dChuZXQpKSkgPT0gMDsKKwlyZXR1cm4gKHJ1bGUtPmdlbm1hc2sgJiBuZnRfZ2VubWFza19uZXh0KG5ldCkpID09IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogbmZ0X3J1bGVfYWN0aXZhdGVfbmV4dChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZnRfcnVsZSAqcnVsZSkKIHsKIAkvKiBOb3cgaW5hY3RpdmUsIHdpbGwgYmUgYWN0aXZlIGluIHRoZSBmdXR1cmUgKi8KLQlydWxlLT5nZW5tYXNrID0gKDEgPDwgbmV0LT5uZnQuZ2VuY3Vyc29yKTsKKwlydWxlLT5nZW5tYXNrID0gbmZ0X2dlbm1hc2tfY3VyKG5ldCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogbmZ0X3J1bGVfZGVhY3RpdmF0ZV9uZXh0KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5mdF9ydWxlICpydWxlKQogewotCXJ1bGUtPmdlbm1hc2sgPSAoMSA8PCBnZW5jdXJzb3JfbmV4dChuZXQpKTsKKwlydWxlLT5nZW5tYXNrID0gbmZ0X2dlbm1hc2tfbmV4dChuZXQpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbmZ0X3J1bGVfY2xlYXIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmZ0X3J1bGUgKnJ1bGUpCiB7Ci0JcnVsZS0+Z2VubWFzayAmPSB+KDEgPDwgZ2VuY3Vyc29yX25leHQobmV0KSk7CisJcnVsZS0+Z2VubWFzayAmPSB+bmZ0X2dlbm1hc2tfbmV4dChuZXQpOwogfQogCiBzdGF0aWMgaW50CkBAIC00MDEsNyArMzk2LDggQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF90YWJsZV9wb2xpY3lbTkZUQV9UQUJMRV9NQVggKyAxXSA9IHsKLQlbTkZUQV9UQUJMRV9OQU1FXQk9IHsgLnR5cGUgPSBOTEFfU1RSSU5HIH0sCisJW05GVEFfVEFCTEVfTkFNRV0JPSB7IC50eXBlID0gTkxBX1NUUklORywKKwkJCQkgICAgLmxlbiA9IE5GVF9UQUJMRV9NQVhOQU1FTEVOIC0gMSB9LAogCVtORlRBX1RBQkxFX0ZMQUdTXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiB9OwogCkBAIC02ODYsMjYgKzY4MiwyOCBAQAogCWlmICghdHJ5X21vZHVsZV9nZXQoYWZpLT5vd25lcikpCiAJCXJldHVybiAtRUFGTk9TVVBQT1JUOwogCi0JdGFibGUgPSBremFsbG9jKHNpemVvZigqdGFibGUpICsgbmxhX2xlbihuYW1lKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHRhYmxlID09IE5VTEwpIHsKLQkJbW9kdWxlX3B1dChhZmktPm93bmVyKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWVyciA9IC1FTk9NRU07CisJdGFibGUgPSBremFsbG9jKHNpemVvZigqdGFibGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAodGFibGUgPT0gTlVMTCkKKwkJZ290byBlcnIxOwogCi0JbmxhX3N0cmxjcHkodGFibGUtPm5hbWUsIG5hbWUsIG5sYV9sZW4obmFtZSkpOworCW5sYV9zdHJsY3B5KHRhYmxlLT5uYW1lLCBuYW1lLCBORlRfVEFCTEVfTUFYTkFNRUxFTik7CiAJSU5JVF9MSVNUX0hFQUQoJnRhYmxlLT5jaGFpbnMpOwogCUlOSVRfTElTVF9IRUFEKCZ0YWJsZS0+c2V0cyk7CiAJdGFibGUtPmZsYWdzID0gZmxhZ3M7CiAKIAluZnRfY3R4X2luaXQoJmN0eCwgc2tiLCBubGgsIGFmaSwgdGFibGUsIE5VTEwsIG5sYSk7CiAJZXJyID0gbmZ0X3RyYW5zX3RhYmxlX2FkZCgmY3R4LCBORlRfTVNHX05FV1RBQkxFKTsKLQlpZiAoZXJyIDwgMCkgewotCQlrZnJlZSh0YWJsZSk7Ci0JCW1vZHVsZV9wdXQoYWZpLT5vd25lcik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycjI7CisKIAlsaXN0X2FkZF90YWlsX3JjdSgmdGFibGUtPmxpc3QsICZhZmktPnRhYmxlcyk7CiAJcmV0dXJuIDA7CitlcnIyOgorCWtmcmVlKHRhYmxlKTsKK2VycjE6CisJbW9kdWxlX3B1dChhZmktPm93bmVyKTsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IG5mdF9mbHVzaF90YWJsZShzdHJ1Y3QgbmZ0X2N0eCAqY3R4KQpAQCAtMTIyNSw3ICsxMjIzLDEwIEBACiAKIAlpZiAobmxhW05GVEFfQ0hBSU5fUE9MSUNZXSkgewogCQlpZiAoKGNoYWluICE9IE5VTEwgJiYKLQkJICAgICEoY2hhaW4tPmZsYWdzICYgTkZUX0JBU0VfQ0hBSU4pKSB8fAorCQkgICAgIShjaGFpbi0+ZmxhZ3MgJiBORlRfQkFTRV9DSEFJTikpKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJCWlmIChjaGFpbiA9PSBOVUxMICYmCiAJCSAgICBubGFbTkZUQV9DSEFJTl9IT09LXSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCkBAIC0xMzQ4LDYgKzEzNDksNyBAQAogCQkJcmN1X2Fzc2lnbl9wb2ludGVyKGJhc2VjaGFpbi0+c3RhdHMsIHN0YXRzKTsKIAkJfQogCisJCXdyaXRlX3BuZXQoJmJhc2VjaGFpbi0+cG5ldCwgbmV0KTsKIAkJYmFzZWNoYWluLT50eXBlID0gdHlwZTsKIAkJY2hhaW4gPSAmYmFzZWNoYWluLT5jaGFpbjsKIApAQCAtMTM3NSw3ICsxMzc3LDYgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZjaGFpbi0+cnVsZXMpOwogCWNoYWluLT5oYW5kbGUgPSBuZl90YWJsZXNfYWxsb2NfaGFuZGxlKHRhYmxlKTsKLQljaGFpbi0+bmV0ID0gbmV0OwogCWNoYWluLT50YWJsZSA9IHRhYmxlOwogCW5sYV9zdHJsY3B5KGNoYWluLT5uYW1lLCBuYW1lLCBORlRfQ0hBSU5fTUFYTkFNRUxFTik7CiAKQEAgLTE1NDQsNiArMTU0NSwyMyBAQAogCXJldHVybiAtMTsKIH07CiAKK2ludCBuZnRfZXhwcl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCBhdHRyLAorCQkgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKK3sKKwlzdHJ1Y3QgbmxhdHRyICpuZXN0OworCisJbmVzdCA9IG5sYV9uZXN0X3N0YXJ0KHNrYiwgYXR0cik7CisJaWYgKCFuZXN0KQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmZfdGFibGVzX2ZpbGxfZXhwcl9pbmZvKHNrYiwgZXhwcikgPCAwKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlubGFfbmVzdF9lbmQoc2tiLCBuZXN0KTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKwogc3RydWN0IG5mdF9leHByX2luZm8gewogCWNvbnN0IHN0cnVjdCBuZnRfZXhwcl9vcHMJKm9wczsKIAlzdHJ1Y3QgbmxhdHRyCQkJKnRiW05GVF9FWFBSX01BWEFUVFIgKyAxXTsKQEAgLTE2MjEsNiArMTYzOSwzOSBAQAogCW1vZHVsZV9wdXQoZXhwci0+b3BzLT50eXBlLT5vd25lcik7CiB9CiAKK3N0cnVjdCBuZnRfZXhwciAqbmZ0X2V4cHJfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSkKK3sKKwlzdHJ1Y3QgbmZ0X2V4cHJfaW5mbyBpbmZvOworCXN0cnVjdCBuZnRfZXhwciAqZXhwcjsKKwlpbnQgZXJyOworCisJZXJyID0gbmZfdGFibGVzX2V4cHJfcGFyc2UoY3R4LCBubGEsICZpbmZvKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnIxOworCisJZXJyID0gLUVOT01FTTsKKwlleHByID0ga3phbGxvYyhpbmZvLm9wcy0+c2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKGV4cHIgPT0gTlVMTCkKKwkJZ290byBlcnIyOworCisJZXJyID0gbmZfdGFibGVzX25ld2V4cHIoY3R4LCAmaW5mbywgZXhwcik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMjsKKworCXJldHVybiBleHByOworZXJyMjoKKwltb2R1bGVfcHV0KGluZm8ub3BzLT50eXBlLT5vd25lcik7CitlcnIxOgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3ZvaWQgbmZ0X2V4cHJfZGVzdHJveShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCit7CisJbmZfdGFibGVzX2V4cHJfZGVzdHJveShjdHgsIGV4cHIpOworCWtmcmVlKGV4cHIpOworfQorCiAvKgogICogUnVsZXMKICAqLwpAQCAtMTcwMiwxMiArMTc1Myw4IEBACiAJaWYgKGxpc3QgPT0gTlVMTCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJbmZ0X3J1bGVfZm9yX2VhY2hfZXhwcihleHByLCBuZXh0LCBydWxlKSB7Ci0JCXN0cnVjdCBubGF0dHIgKmVsZW0gPSBubGFfbmVzdF9zdGFydChza2IsIE5GVEFfTElTVF9FTEVNKTsKLQkJaWYgKGVsZW0gPT0gTlVMTCkKKwkJaWYgKG5mdF9leHByX2R1bXAoc2tiLCBORlRBX0xJU1RfRUxFTSwgZXhwcikgPCAwKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JCWlmIChuZl90YWJsZXNfZmlsbF9leHByX2luZm8oc2tiLCBleHByKSA8IDApCi0JCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJbmxhX25lc3RfZW5kKHNrYiwgZWxlbSk7CiAJfQogCW5sYV9uZXN0X2VuZChza2IsIGxpc3QpOwogCkBAIC0yMTU4LDcgKzIyMDUsNyBAQAogCWZlYXR1cmVzID0gMDsKIAlpZiAobmxhW05GVEFfU0VUX0ZMQUdTXSAhPSBOVUxMKSB7CiAJCWZlYXR1cmVzID0gbnRvaGwobmxhX2dldF9iZTMyKG5sYVtORlRBX1NFVF9GTEFHU10pKTsKLQkJZmVhdHVyZXMgJj0gTkZUX1NFVF9JTlRFUlZBTCB8IE5GVF9TRVRfTUFQOworCQlmZWF0dXJlcyAmPSBORlRfU0VUX0lOVEVSVkFMIHwgTkZUX1NFVF9NQVAgfCBORlRfU0VUX1RJTUVPVVQ7CiAJfQogCiAJYm9wcwkgICA9IE5VTEw7CkBAIC0yMjE1LDYgKzIyNjIsOCBAQAogCVtORlRBX1NFVF9QT0xJQ1ldCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW05GVEFfU0VUX0RFU0NdCQkJPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogCVtORlRBX1NFVF9JRF0JCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfU0VUX1RJTUVPVVRdCQk9IHsgLnR5cGUgPSBOTEFfVTY0IH0sCisJW05GVEFfU0VUX0dDX0lOVEVSVkFMXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9zZXRfZGVzY19wb2xpY3lbTkZUQV9TRVRfREVTQ19NQVggKyAxXSA9IHsKQEAgLTIzNjUsNiArMjQxNCwxMyBAQAogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJfQogCisJaWYgKHNldC0+dGltZW91dCAmJgorCSAgICBubGFfcHV0X2JlNjQoc2tiLCBORlRBX1NFVF9USU1FT1VULCBjcHVfdG9fYmU2NChzZXQtPnRpbWVvdXQpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKHNldC0+Z2NfaW50ICYmCisJICAgIG5sYV9wdXRfYmUzMihza2IsIE5GVEFfU0VUX0dDX0lOVEVSVkFMLCBodG9ubChzZXQtPmdjX2ludCkpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwogCWlmIChzZXQtPnBvbGljeSAhPSBORlRfU0VUX1BPTF9QRVJGT1JNQU5DRSkgewogCQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9TRVRfUE9MSUNZLCBodG9ubChzZXQtPnBvbGljeSkpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CkBAIC0yNTc3LDcgKzI2MzMsOCBAQAogCWNoYXIgbmFtZVtJRk5BTVNJWl07CiAJdW5zaWduZWQgaW50IHNpemU7CiAJYm9vbCBjcmVhdGU7Ci0JdTMyIGt0eXBlLCBkdHlwZSwgZmxhZ3MsIHBvbGljeTsKKwl1NjQgdGltZW91dDsKKwl1MzIga3R5cGUsIGR0eXBlLCBmbGFncywgcG9saWN5LCBnY19pbnQ7CiAJc3RydWN0IG5mdF9zZXRfZGVzYyBkZXNjOwogCWludCBlcnI7CiAKQEAgLTI1OTcsMTUgKzI2NTQsMjAgQEAKIAl9CiAKIAlkZXNjLmtsZW4gPSBudG9obChubGFfZ2V0X2JlMzIobmxhW05GVEFfU0VUX0tFWV9MRU5dKSk7Ci0JaWYgKGRlc2Mua2xlbiA9PSAwIHx8IGRlc2Mua2xlbiA+IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZ0X2RhdGEsIGRhdGEpKQorCWlmIChkZXNjLmtsZW4gPT0gMCB8fCBkZXNjLmtsZW4gPiBORlRfREFUQV9WQUxVRV9NQVhMRU4pCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZmxhZ3MgPSAwOwogCWlmIChubGFbTkZUQV9TRVRfRkxBR1NdICE9IE5VTEwpIHsKIAkJZmxhZ3MgPSBudG9obChubGFfZ2V0X2JlMzIobmxhW05GVEFfU0VUX0ZMQUdTXSkpOwogCQlpZiAoZmxhZ3MgJiB+KE5GVF9TRVRfQU5PTllNT1VTIHwgTkZUX1NFVF9DT05TVEFOVCB8Ci0JCQkgICAgICBORlRfU0VUX0lOVEVSVkFMIHwgTkZUX1NFVF9NQVApKQorCQkJICAgICAgTkZUX1NFVF9JTlRFUlZBTCB8IE5GVF9TRVRfVElNRU9VVCB8CisJCQkgICAgICBORlRfU0VUX01BUCB8IE5GVF9TRVRfRVZBTCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogT25seSBvbmUgb2YgYm90aCBvcGVyYXRpb25zIGlzIHN1cHBvcnRlZCAqLworCQlpZiAoKGZsYWdzICYgKE5GVF9TRVRfTUFQIHwgTkZUX1NFVF9FVkFMKSkgPT0KKwkJCSAgICAgKE5GVF9TRVRfTUFQIHwgTkZUX1NFVF9FVkFMKSkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKIAlkdHlwZSA9IDA7CkBAIC0yNjIyLDE0ICsyNjg0LDI2IEBACiAJCQlpZiAobmxhW05GVEFfU0VUX0RBVEFfTEVOXSA9PSBOVUxMKQogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJZGVzYy5kbGVuID0gbnRvaGwobmxhX2dldF9iZTMyKG5sYVtORlRBX1NFVF9EQVRBX0xFTl0pKTsKLQkJCWlmIChkZXNjLmRsZW4gPT0gMCB8fAotCQkJICAgIGRlc2MuZGxlbiA+IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZ0X2RhdGEsIGRhdGEpKQorCQkJaWYgKGRlc2MuZGxlbiA9PSAwIHx8IGRlc2MuZGxlbiA+IE5GVF9EQVRBX1ZBTFVFX01BWExFTikKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfSBlbHNlCi0JCQlkZXNjLmRsZW4gPSBzaXplb2Yoc3RydWN0IG5mdF9kYXRhKTsKKwkJCWRlc2MuZGxlbiA9IHNpemVvZihzdHJ1Y3QgbmZ0X3ZlcmRpY3QpOwogCX0gZWxzZSBpZiAoZmxhZ3MgJiBORlRfU0VUX01BUCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwl0aW1lb3V0ID0gMDsKKwlpZiAobmxhW05GVEFfU0VUX1RJTUVPVVRdICE9IE5VTEwpIHsKKwkJaWYgKCEoZmxhZ3MgJiBORlRfU0VUX1RJTUVPVVQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXRpbWVvdXQgPSBiZTY0X3RvX2NwdShubGFfZ2V0X2JlNjQobmxhW05GVEFfU0VUX1RJTUVPVVRdKSk7CisJfQorCWdjX2ludCA9IDA7CisJaWYgKG5sYVtORlRBX1NFVF9HQ19JTlRFUlZBTF0gIT0gTlVMTCkgeworCQlpZiAoIShmbGFncyAmIE5GVF9TRVRfVElNRU9VVCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ2NfaW50ID0gbnRvaGwobmxhX2dldF9iZTMyKG5sYVtORlRBX1NFVF9HQ19JTlRFUlZBTF0pKTsKKwl9CisKIAlwb2xpY3kgPSBORlRfU0VUX1BPTF9QRVJGT1JNQU5DRTsKIAlpZiAobmxhW05GVEFfU0VUX1BPTElDWV0gIT0gTlVMTCkKIAkJcG9saWN5ID0gbnRvaGwobmxhX2dldF9iZTMyKG5sYVtORlRBX1NFVF9QT0xJQ1ldKSk7CkBAIC0yNjg5LDYgKzI3NjMsNyBAQAogCQlnb3RvIGVycjI7CiAKIAlJTklUX0xJU1RfSEVBRCgmc2V0LT5iaW5kaW5ncyk7CisJd3JpdGVfcG5ldCgmc2V0LT5wbmV0LCBuZXQpOwogCXNldC0+b3BzICAgPSBvcHM7CiAJc2V0LT5rdHlwZSA9IGt0eXBlOwogCXNldC0+a2xlbiAgPSBkZXNjLmtsZW47CkBAIC0yNjk3LDYgKzI3NzIsOCBAQAogCXNldC0+ZmxhZ3MgPSBmbGFnczsKIAlzZXQtPnNpemUgID0gZGVzYy5zaXplOwogCXNldC0+cG9saWN5ID0gcG9saWN5OworCXNldC0+dGltZW91dCA9IHRpbWVvdXQ7CisJc2V0LT5nY19pbnQgPSBnY19pbnQ7CiAKIAllcnIgPSBvcHMtPmluaXQoc2V0LCAmZGVzYywgbmxhKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTI3NjUsMTIgKzI4NDIsMTQgQEAKIAkJCQkJY29uc3Qgc3RydWN0IG5mdF9zZXRfaXRlciAqaXRlciwKIAkJCQkJY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKIHsKKwljb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dCA9IG5mdF9zZXRfZWxlbV9leHQoc2V0LCBlbGVtLT5wcml2KTsKIAllbnVtIG5mdF9yZWdpc3RlcnMgZHJlZzsKIAogCWRyZWcgPSBuZnRfdHlwZV90b19yZWcoc2V0LT5kdHlwZSk7Ci0JcmV0dXJuIG5mdF92YWxpZGF0ZV9kYXRhX2xvYWQoY3R4LCBkcmVnLCAmZWxlbS0+ZGF0YSwKLQkJCQkgICAgICBzZXQtPmR0eXBlID09IE5GVF9EQVRBX1ZFUkRJQ1QgPwotCQkJCSAgICAgIE5GVF9EQVRBX1ZFUkRJQ1QgOiBORlRfREFUQV9WQUxVRSk7CisJcmV0dXJuIG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9zdG9yZShjdHgsIGRyZWcsIG5mdF9zZXRfZXh0X2RhdGEoZXh0KSwKKwkJCQkJICAgc2V0LT5kdHlwZSA9PSBORlRfREFUQV9WRVJESUNUID8KKwkJCQkJICAgTkZUX0RBVEFfVkVSRElDVCA6IE5GVF9EQVRBX1ZBTFVFLAorCQkJCQkgICBzZXQtPmRsZW4pOwogfQogCiBpbnQgbmZfdGFibGVzX2JpbmRfc2V0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIHN0cnVjdCBuZnRfc2V0ICpzZXQsCkBAIC0yNzgyLDEyICsyODYxLDEzIEBACiAJaWYgKCFsaXN0X2VtcHR5KCZzZXQtPmJpbmRpbmdzKSAmJiBzZXQtPmZsYWdzICYgTkZUX1NFVF9BTk9OWU1PVVMpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQKSB7CisJaWYgKGJpbmRpbmctPmZsYWdzICYgTkZUX1NFVF9NQVApIHsKIAkJLyogSWYgdGhlIHNldCBpcyBhbHJlYWR5IGJvdW5kIHRvIHRoZSBzYW1lIGNoYWluIGFsbAogCQkgKiBqdW1wcyBhcmUgYWxyZWFkeSB2YWxpZGF0ZWQgZm9yIHRoYXQgY2hhaW4uCiAJCSAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGksICZzZXQtPmJpbmRpbmdzLCBsaXN0KSB7Ci0JCQlpZiAoaS0+Y2hhaW4gPT0gYmluZGluZy0+Y2hhaW4pCisJCQlpZiAoYmluZGluZy0+ZmxhZ3MgJiBORlRfU0VUX01BUCAmJgorCQkJICAgIGktPmNoYWluID09IGJpbmRpbmctPmNoYWluKQogCQkJCWdvdG8gYmluZDsKIAkJfQogCkBAIC0yODIxLDYgKzI5MDEsMzUgQEAKIAkJbmZfdGFibGVzX3NldF9kZXN0cm95KGN0eCwgc2V0KTsKIH0KIAorY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0X3R5cGUgbmZ0X3NldF9leHRfdHlwZXNbXSA9IHsKKwlbTkZUX1NFVF9FWFRfS0VZXQkJPSB7CisJCS5hbGlnbgk9IF9fYWxpZ25vZl9fKHUzMiksCisJfSwKKwlbTkZUX1NFVF9FWFRfREFUQV0JCT0geworCQkuYWxpZ24JPSBfX2FsaWdub2ZfXyh1MzIpLAorCX0sCisJW05GVF9TRVRfRVhUX0VYUFJdCQk9IHsKKwkJLmFsaWduCT0gX19hbGlnbm9mX18oc3RydWN0IG5mdF9leHByKSwKKwl9LAorCVtORlRfU0VUX0VYVF9GTEFHU10JCT0geworCQkubGVuCT0gc2l6ZW9mKHU4KSwKKwkJLmFsaWduCT0gX19hbGlnbm9mX18odTgpLAorCX0sCisJW05GVF9TRVRfRVhUX1RJTUVPVVRdCQk9IHsKKwkJLmxlbgk9IHNpemVvZih1NjQpLAorCQkuYWxpZ24JPSBfX2FsaWdub2ZfXyh1NjQpLAorCX0sCisJW05GVF9TRVRfRVhUX0VYUElSQVRJT05dCT0geworCQkubGVuCT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLAorCQkuYWxpZ24JPSBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nKSwKKwl9LAorCVtORlRfU0VUX0VYVF9VU0VSREFUQV0JCT0geworCQkubGVuCT0gc2l6ZW9mKHN0cnVjdCBuZnRfdXNlcmRhdGEpLAorCQkuYWxpZ24JPSBfX2FsaWdub2ZfXyhzdHJ1Y3QgbmZ0X3VzZXJkYXRhKSwKKwl9LAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mdF9zZXRfZXh0X3R5cGVzKTsKKwogLyoKICAqIFNldCBlbGVtZW50cwogICovCkBAIC0yODI5LDYgKzI5MzgsOSBAQAogCVtORlRBX1NFVF9FTEVNX0tFWV0JCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKIAlbTkZUQV9TRVRfRUxFTV9EQVRBXQkJPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogCVtORlRBX1NFVF9FTEVNX0ZMQUdTXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX1NFVF9FTEVNX1RJTUVPVVRdCQk9IHsgLnR5cGUgPSBOTEFfVTY0IH0sCisJW05GVEFfU0VUX0VMRU1fVVNFUkRBVEFdCT0geyAudHlwZSA9IE5MQV9CSU5BUlksCisJCQkJCSAgICAubGVuID0gTkZUX1VTRVJEQVRBX01BWExFTiB9LAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9zZXRfZWxlbV9saXN0X3BvbGljeVtORlRBX1NFVF9FTEVNX0xJU1RfTUFYICsgMV0gPSB7CkBAIC0yODY3LDYgKzI5NzksNyBAQAogCQkJCSAgY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKIAkJCQkgIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCiB7CisJY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICpleHQgPSBuZnRfc2V0X2VsZW1fZXh0KHNldCwgZWxlbS0+cHJpdik7CiAJdW5zaWduZWQgY2hhciAqYiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKIAlzdHJ1Y3QgbmxhdHRyICpuZXN0OwogCkBAIC0yODc0LDIwICsyOTg3LDUyIEBACiAJaWYgKG5lc3QgPT0gTlVMTCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlpZiAobmZ0X2RhdGFfZHVtcChza2IsIE5GVEFfU0VUX0VMRU1fS0VZLCAmZWxlbS0+a2V5LCBORlRfREFUQV9WQUxVRSwKLQkJCSAgc2V0LT5rbGVuKSA8IDApCisJaWYgKG5mdF9kYXRhX2R1bXAoc2tiLCBORlRBX1NFVF9FTEVNX0tFWSwgbmZ0X3NldF9leHRfa2V5KGV4dCksCisJCQkgIE5GVF9EQVRBX1ZBTFVFLCBzZXQtPmtsZW4pIDwgMCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQICYmCi0JICAgICEoZWxlbS0+ZmxhZ3MgJiBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKSAmJgotCSAgICBuZnRfZGF0YV9kdW1wKHNrYiwgTkZUQV9TRVRfRUxFTV9EQVRBLCAmZWxlbS0+ZGF0YSwKKwlpZiAobmZ0X3NldF9leHRfZXhpc3RzKGV4dCwgTkZUX1NFVF9FWFRfREFUQSkgJiYKKwkgICAgbmZ0X2RhdGFfZHVtcChza2IsIE5GVEFfU0VUX0VMRU1fREFUQSwgbmZ0X3NldF9leHRfZGF0YShleHQpLAogCQkJICBzZXQtPmR0eXBlID09IE5GVF9EQVRBX1ZFUkRJQ1QgPyBORlRfREFUQV9WRVJESUNUIDogTkZUX0RBVEFfVkFMVUUsCiAJCQkgIHNldC0+ZGxlbikgPCAwKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAotCWlmIChlbGVtLT5mbGFncyAhPSAwKQotCQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9TRVRfRUxFTV9GTEFHUywgaHRvbmwoZWxlbS0+ZmxhZ3MpKSkKKwlpZiAobmZ0X3NldF9leHRfZXhpc3RzKGV4dCwgTkZUX1NFVF9FWFRfRVhQUikgJiYKKwkgICAgbmZ0X2V4cHJfZHVtcChza2IsIE5GVEFfU0VUX0VMRU1fRVhQUiwgbmZ0X3NldF9leHRfZXhwcihleHQpKSA8IDApCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCisJaWYgKG5mdF9zZXRfZXh0X2V4aXN0cyhleHQsIE5GVF9TRVRfRVhUX0ZMQUdTKSAmJgorCSAgICBubGFfcHV0X2JlMzIoc2tiLCBORlRBX1NFVF9FTEVNX0ZMQUdTLAorCQkgICAgICAgICBodG9ubCgqbmZ0X3NldF9leHRfZmxhZ3MoZXh0KSkpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChuZnRfc2V0X2V4dF9leGlzdHMoZXh0LCBORlRfU0VUX0VYVF9USU1FT1VUKSAmJgorCSAgICBubGFfcHV0X2JlNjQoc2tiLCBORlRBX1NFVF9FTEVNX1RJTUVPVVQsCisJCQkgY3B1X3RvX2JlNjQoKm5mdF9zZXRfZXh0X3RpbWVvdXQoZXh0KSkpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWlmIChuZnRfc2V0X2V4dF9leGlzdHMoZXh0LCBORlRfU0VUX0VYVF9FWFBJUkFUSU9OKSkgeworCQl1bnNpZ25lZCBsb25nIGV4cGlyZXMsIG5vdyA9IGppZmZpZXM7CisKKwkJZXhwaXJlcyA9ICpuZnRfc2V0X2V4dF9leHBpcmF0aW9uKGV4dCk7CisJCWlmICh0aW1lX2JlZm9yZShub3csIGV4cGlyZXMpKQorCQkJZXhwaXJlcyAtPSBub3c7CisJCWVsc2UKKwkJCWV4cGlyZXMgPSAwOworCisJCWlmIChubGFfcHV0X2JlNjQoc2tiLCBORlRBX1NFVF9FTEVNX0VYUElSQVRJT04sCisJCQkJIGNwdV90b19iZTY0KGppZmZpZXNfdG9fbXNlY3MoZXhwaXJlcykpKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KKworCWlmIChuZnRfc2V0X2V4dF9leGlzdHMoZXh0LCBORlRfU0VUX0VYVF9VU0VSREFUQSkpIHsKKwkJc3RydWN0IG5mdF91c2VyZGF0YSAqdWRhdGE7CisKKwkJdWRhdGEgPSBuZnRfc2V0X2V4dF91c2VyZGF0YShleHQpOworCQlpZiAobmxhX3B1dChza2IsIE5GVEFfU0VUX0VMRU1fVVNFUkRBVEEsCisJCQkgICAgdWRhdGEtPmxlbiArIDEsIHVkYXRhLT5kYXRhKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCX0KIAogCW5sYV9uZXN0X2VuZChza2IsIG5lc3QpOwogCXJldHVybiAwOwpAQCAtMzEwOCwyMCArMzI1Myw2NSBAQAogCXJldHVybiB0cmFuczsKIH0KIAordm9pZCAqbmZ0X3NldF9lbGVtX2luaXQoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKKwkJCWNvbnN0IHN0cnVjdCBuZnRfc2V0X2V4dF90bXBsICp0bXBsLAorCQkJY29uc3QgdTMyICprZXksIGNvbnN0IHUzMiAqZGF0YSwKKwkJCXU2NCB0aW1lb3V0LCBnZnBfdCBnZnApCit7CisJc3RydWN0IG5mdF9zZXRfZXh0ICpleHQ7CisJdm9pZCAqZWxlbTsKKworCWVsZW0gPSBremFsbG9jKHNldC0+b3BzLT5lbGVtc2l6ZSArIHRtcGwtPmxlbiwgZ2ZwKTsKKwlpZiAoZWxlbSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWV4dCA9IG5mdF9zZXRfZWxlbV9leHQoc2V0LCBlbGVtKTsKKwluZnRfc2V0X2V4dF9pbml0KGV4dCwgdG1wbCk7CisKKwltZW1jcHkobmZ0X3NldF9leHRfa2V5KGV4dCksIGtleSwgc2V0LT5rbGVuKTsKKwlpZiAobmZ0X3NldF9leHRfZXhpc3RzKGV4dCwgTkZUX1NFVF9FWFRfREFUQSkpCisJCW1lbWNweShuZnRfc2V0X2V4dF9kYXRhKGV4dCksIGRhdGEsIHNldC0+ZGxlbik7CisJaWYgKG5mdF9zZXRfZXh0X2V4aXN0cyhleHQsIE5GVF9TRVRfRVhUX0VYUElSQVRJT04pKQorCQkqbmZ0X3NldF9leHRfZXhwaXJhdGlvbihleHQpID0KKwkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpOworCWlmIChuZnRfc2V0X2V4dF9leGlzdHMoZXh0LCBORlRfU0VUX0VYVF9USU1FT1VUKSkKKwkJKm5mdF9zZXRfZXh0X3RpbWVvdXQoZXh0KSA9IHRpbWVvdXQ7CisKKwlyZXR1cm4gZWxlbTsKK30KKwordm9pZCBuZnRfc2V0X2VsZW1fZGVzdHJveShjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LCB2b2lkICplbGVtKQoreworCXN0cnVjdCBuZnRfc2V0X2V4dCAqZXh0ID0gbmZ0X3NldF9lbGVtX2V4dChzZXQsIGVsZW0pOworCisJbmZ0X2RhdGFfdW5pbml0KG5mdF9zZXRfZXh0X2tleShleHQpLCBORlRfREFUQV9WQUxVRSk7CisJaWYgKG5mdF9zZXRfZXh0X2V4aXN0cyhleHQsIE5GVF9TRVRfRVhUX0RBVEEpKQorCQluZnRfZGF0YV91bmluaXQobmZ0X3NldF9leHRfZGF0YShleHQpLCBzZXQtPmR0eXBlKTsKKwlpZiAobmZ0X3NldF9leHRfZXhpc3RzKGV4dCwgTkZUX1NFVF9FWFRfRVhQUikpCisJCW5mX3RhYmxlc19leHByX2Rlc3Ryb3koTlVMTCwgbmZ0X3NldF9leHRfZXhwcihleHQpKTsKKworCWtmcmVlKGVsZW0pOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZ0X3NldF9lbGVtX2Rlc3Ryb3kpOworCiBzdGF0aWMgaW50IG5mdF9hZGRfc2V0X2VsZW0oc3RydWN0IG5mdF9jdHggKmN0eCwgc3RydWN0IG5mdF9zZXQgKnNldCwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyKQogewogCXN0cnVjdCBubGF0dHIgKm5sYVtORlRBX1NFVF9FTEVNX01BWCArIDFdOwogCXN0cnVjdCBuZnRfZGF0YV9kZXNjIGQxLCBkMjsKKwlzdHJ1Y3QgbmZ0X3NldF9leHRfdG1wbCB0bXBsOworCXN0cnVjdCBuZnRfc2V0X2V4dCAqZXh0OwogCXN0cnVjdCBuZnRfc2V0X2VsZW0gZWxlbTsKIAlzdHJ1Y3QgbmZ0X3NldF9iaW5kaW5nICpiaW5kaW5nOworCXN0cnVjdCBuZnRfdXNlcmRhdGEgKnVkYXRhOworCXN0cnVjdCBuZnRfZGF0YSBkYXRhOwogCWVudW0gbmZ0X3JlZ2lzdGVycyBkcmVnOwogCXN0cnVjdCBuZnRfdHJhbnMgKnRyYW5zOworCXU2NCB0aW1lb3V0OworCXUzMiBmbGFnczsKKwl1OCB1bGVuOwogCWludCBlcnI7CiAKLQlpZiAoc2V0LT5zaXplICYmIHNldC0+bmVsZW1zID09IHNldC0+c2l6ZSkKLQkJcmV0dXJuIC1FTkZJTEU7Ci0KIAllcnIgPSBubGFfcGFyc2VfbmVzdGVkKG5sYSwgTkZUQV9TRVRfRUxFTV9NQVgsIGF0dHIsCiAJCQkgICAgICAgbmZ0X3NldF9lbGVtX3BvbGljeSk7CiAJaWYgKGVyciA8IDApCkBAIC0zMTMwLDM4ICszMzIwLDU5IEBACiAJaWYgKG5sYVtORlRBX1NFVF9FTEVNX0tFWV0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQllbGVtLmZsYWdzID0gMDsKKwluZnRfc2V0X2V4dF9wcmVwYXJlKCZ0bXBsKTsKKworCWZsYWdzID0gMDsKIAlpZiAobmxhW05GVEFfU0VUX0VMRU1fRkxBR1NdICE9IE5VTEwpIHsKLQkJZWxlbS5mbGFncyA9IG50b2hsKG5sYV9nZXRfYmUzMihubGFbTkZUQV9TRVRfRUxFTV9GTEFHU10pKTsKLQkJaWYgKGVsZW0uZmxhZ3MgJiB+TkZUX1NFVF9FTEVNX0lOVEVSVkFMX0VORCkKKwkJZmxhZ3MgPSBudG9obChubGFfZ2V0X2JlMzIobmxhW05GVEFfU0VUX0VMRU1fRkxBR1NdKSk7CisJCWlmIChmbGFncyAmIH5ORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKQogCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghKHNldC0+ZmxhZ3MgJiBORlRfU0VUX0lOVEVSVkFMKSAmJgorCQkgICAgZmxhZ3MgJiBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmbGFncyAhPSAwKQorCQkJbmZ0X3NldF9leHRfYWRkKCZ0bXBsLCBORlRfU0VUX0VYVF9GTEFHUyk7CiAJfQogCiAJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCkgewogCQlpZiAobmxhW05GVEFfU0VUX0VMRU1fREFUQV0gPT0gTlVMTCAmJgotCQkgICAgIShlbGVtLmZsYWdzICYgTkZUX1NFVF9FTEVNX0lOVEVSVkFMX0VORCkpCisJCSAgICAhKGZsYWdzICYgTkZUX1NFVF9FTEVNX0lOVEVSVkFMX0VORCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKG5sYVtORlRBX1NFVF9FTEVNX0RBVEFdICE9IE5VTEwgJiYKLQkJICAgIGVsZW0uZmxhZ3MgJiBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKQorCQkgICAgZmxhZ3MgJiBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIHsKIAkJaWYgKG5sYVtORlRBX1NFVF9FTEVNX0RBVEFdICE9IE5VTEwpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQllcnIgPSBuZnRfZGF0YV9pbml0KGN0eCwgJmVsZW0ua2V5LCAmZDEsIG5sYVtORlRBX1NFVF9FTEVNX0tFWV0pOworCXRpbWVvdXQgPSAwOworCWlmIChubGFbTkZUQV9TRVRfRUxFTV9USU1FT1VUXSAhPSBOVUxMKSB7CisJCWlmICghKHNldC0+ZmxhZ3MgJiBORlRfU0VUX1RJTUVPVVQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXRpbWVvdXQgPSBiZTY0X3RvX2NwdShubGFfZ2V0X2JlNjQobmxhW05GVEFfU0VUX0VMRU1fVElNRU9VVF0pKTsKKwl9IGVsc2UgaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX1RJTUVPVVQpIHsKKwkJdGltZW91dCA9IHNldC0+dGltZW91dDsKKwl9CisKKwllcnIgPSBuZnRfZGF0YV9pbml0KGN0eCwgJmVsZW0ua2V5LnZhbCwgc2l6ZW9mKGVsZW0ua2V5KSwgJmQxLAorCQkJICAgIG5sYVtORlRBX1NFVF9FTEVNX0tFWV0pOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycjE7CiAJZXJyID0gLUVJTlZBTDsKIAlpZiAoZDEudHlwZSAhPSBORlRfREFUQV9WQUxVRSB8fCBkMS5sZW4gIT0gc2V0LT5rbGVuKQogCQlnb3RvIGVycjI7CiAKLQllcnIgPSAtRUVYSVNUOwotCWlmIChzZXQtPm9wcy0+Z2V0KHNldCwgJmVsZW0pID09IDApCi0JCWdvdG8gZXJyMjsKKwluZnRfc2V0X2V4dF9hZGRfbGVuZ3RoKCZ0bXBsLCBORlRfU0VUX0VYVF9LRVksIGQxLmxlbik7CisJaWYgKHRpbWVvdXQgPiAwKSB7CisJCW5mdF9zZXRfZXh0X2FkZCgmdG1wbCwgTkZUX1NFVF9FWFRfRVhQSVJBVElPTik7CisJCWlmICh0aW1lb3V0ICE9IHNldC0+dGltZW91dCkKKwkJCW5mdF9zZXRfZXh0X2FkZCgmdG1wbCwgTkZUX1NFVF9FWFRfVElNRU9VVCk7CisJfQogCiAJaWYgKG5sYVtORlRBX1NFVF9FTEVNX0RBVEFdICE9IE5VTEwpIHsKLQkJZXJyID0gbmZ0X2RhdGFfaW5pdChjdHgsICZlbGVtLmRhdGEsICZkMiwgbmxhW05GVEFfU0VUX0VMRU1fREFUQV0pOworCQllcnIgPSBuZnRfZGF0YV9pbml0KGN0eCwgJmRhdGEsIHNpemVvZihkYXRhKSwgJmQyLAorCQkJCSAgICBubGFbTkZUQV9TRVRfRUxFTV9EQVRBXSk7CiAJCWlmIChlcnIgPCAwKQogCQkJZ290byBlcnIyOwogCkBAIC0zMTc3LDMyICszMzg4LDY4IEBACiAJCQkJLmNoYWluCT0gKHN0cnVjdCBuZnRfY2hhaW4gKiliaW5kaW5nLT5jaGFpbiwKIAkJCX07CiAKLQkJCWVyciA9IG5mdF92YWxpZGF0ZV9kYXRhX2xvYWQoJmJpbmRfY3R4LCBkcmVnLAotCQkJCQkJICAgICAmZWxlbS5kYXRhLCBkMi50eXBlKTsKKwkJCWlmICghKGJpbmRpbmctPmZsYWdzICYgTkZUX1NFVF9NQVApKQorCQkJCWNvbnRpbnVlOworCisJCQllcnIgPSBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfc3RvcmUoJmJpbmRfY3R4LCBkcmVnLAorCQkJCQkJCSAgJmRhdGEsCisJCQkJCQkJICBkMi50eXBlLCBkMi5sZW4pOwogCQkJaWYgKGVyciA8IDApCiAJCQkJZ290byBlcnIzOwogCQl9CisKKwkJbmZ0X3NldF9leHRfYWRkX2xlbmd0aCgmdG1wbCwgTkZUX1NFVF9FWFRfREFUQSwgZDIubGVuKTsKKwl9CisKKwkvKiBUaGUgZnVsbCBtYXhpbXVtIGxlbmd0aCBvZiB1c2VyZGF0YSBjYW4gZXhjZWVkIHRoZSBtYXhpbXVtCisJICogb2Zmc2V0IHZhbHVlIChVOF9NQVgpIGZvciBmb2xsb3dpbmcgZXh0ZW5zaW9ucywgdGhlcmVmb3IgaXQKKwkgKiBtdXN0IGJlIHRoZSBsYXN0IGV4dGVuc2lvbiBhZGRlZC4KKwkgKi8KKwl1bGVuID0gMDsKKwlpZiAobmxhW05GVEFfU0VUX0VMRU1fVVNFUkRBVEFdICE9IE5VTEwpIHsKKwkJdWxlbiA9IG5sYV9sZW4obmxhW05GVEFfU0VUX0VMRU1fVVNFUkRBVEFdKTsKKwkJaWYgKHVsZW4gPiAwKQorCQkJbmZ0X3NldF9leHRfYWRkX2xlbmd0aCgmdG1wbCwgTkZUX1NFVF9FWFRfVVNFUkRBVEEsCisJCQkJCSAgICAgICB1bGVuKTsKKwl9CisKKwllcnIgPSAtRU5PTUVNOworCWVsZW0ucHJpdiA9IG5mdF9zZXRfZWxlbV9pbml0KHNldCwgJnRtcGwsIGVsZW0ua2V5LnZhbC5kYXRhLCBkYXRhLmRhdGEsCisJCQkJICAgICAgdGltZW91dCwgR0ZQX0tFUk5FTCk7CisJaWYgKGVsZW0ucHJpdiA9PSBOVUxMKQorCQlnb3RvIGVycjM7CisKKwlleHQgPSBuZnRfc2V0X2VsZW1fZXh0KHNldCwgZWxlbS5wcml2KTsKKwlpZiAoZmxhZ3MpCisJCSpuZnRfc2V0X2V4dF9mbGFncyhleHQpID0gZmxhZ3M7CisJaWYgKHVsZW4gPiAwKSB7CisJCXVkYXRhID0gbmZ0X3NldF9leHRfdXNlcmRhdGEoZXh0KTsKKwkJdWRhdGEtPmxlbiA9IHVsZW4gLSAxOworCQlubGFfbWVtY3B5KCZ1ZGF0YS0+ZGF0YSwgbmxhW05GVEFfU0VUX0VMRU1fVVNFUkRBVEFdLCB1bGVuKTsKIAl9CiAKIAl0cmFucyA9IG5mdF90cmFuc19lbGVtX2FsbG9jKGN0eCwgTkZUX01TR19ORVdTRVRFTEVNLCBzZXQpOwogCWlmICh0cmFucyA9PSBOVUxMKQotCQlnb3RvIGVycjM7CisJCWdvdG8gZXJyNDsKIAorCWV4dC0+Z2VubWFzayA9IG5mdF9nZW5tYXNrX2N1cihjdHgtPm5ldCkgfCBORlRfU0VUX0VMRU1fQlVTWV9NQVNLOwogCWVyciA9IHNldC0+b3BzLT5pbnNlcnQoc2V0LCAmZWxlbSk7CiAJaWYgKGVyciA8IDApCi0JCWdvdG8gZXJyNDsKKwkJZ290byBlcnI1OwogCiAJbmZ0X3RyYW5zX2VsZW0odHJhbnMpID0gZWxlbTsKIAlsaXN0X2FkZF90YWlsKCZ0cmFucy0+bGlzdCwgJmN0eC0+bmV0LT5uZnQuY29tbWl0X2xpc3QpOwogCXJldHVybiAwOwogCi1lcnI0OgorZXJyNToKIAlrZnJlZSh0cmFucyk7CitlcnI0OgorCWtmcmVlKGVsZW0ucHJpdik7CiBlcnIzOgogCWlmIChubGFbTkZUQV9TRVRfRUxFTV9EQVRBXSAhPSBOVUxMKQotCQluZnRfZGF0YV91bmluaXQoJmVsZW0uZGF0YSwgZDIudHlwZSk7CisJCW5mdF9kYXRhX3VuaW5pdCgmZGF0YSwgZDIudHlwZSk7CiBlcnIyOgotCW5mdF9kYXRhX3VuaW5pdCgmZWxlbS5rZXksIGQxLnR5cGUpOworCW5mdF9kYXRhX3VuaW5pdCgmZWxlbS5rZXkudmFsLCBkMS50eXBlKTsKIGVycjE6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTMyMzgsMTEgKzM0ODUsMTUgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCW5sYV9mb3JfZWFjaF9uZXN0ZWQoYXR0ciwgbmxhW05GVEFfU0VUX0VMRU1fTElTVF9FTEVNRU5UU10sIHJlbSkgewotCQllcnIgPSBuZnRfYWRkX3NldF9lbGVtKCZjdHgsIHNldCwgYXR0cik7Ci0JCWlmIChlcnIgPCAwKQotCQkJYnJlYWs7CisJCWlmIChzZXQtPnNpemUgJiYKKwkJICAgICFhdG9taWNfYWRkX3VubGVzcygmc2V0LT5uZWxlbXMsIDEsIHNldC0+c2l6ZSArIHNldC0+bmRlYWN0KSkKKwkJCXJldHVybiAtRU5GSUxFOwogCi0JCXNldC0+bmVsZW1zKys7CisJCWVyciA9IG5mdF9hZGRfc2V0X2VsZW0oJmN0eCwgc2V0LCBhdHRyKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWF0b21pY19kZWMoJnNldC0+bmVsZW1zKTsKKwkJCWJyZWFrOworCQl9CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC0zMjY1LDcgKzM1MTYsOCBAQAogCWlmIChubGFbTkZUQV9TRVRfRUxFTV9LRVldID09IE5VTEwpCiAJCWdvdG8gZXJyMTsKIAotCWVyciA9IG5mdF9kYXRhX2luaXQoY3R4LCAmZWxlbS5rZXksICZkZXNjLCBubGFbTkZUQV9TRVRfRUxFTV9LRVldKTsKKwllcnIgPSBuZnRfZGF0YV9pbml0KGN0eCwgJmVsZW0ua2V5LnZhbCwgc2l6ZW9mKGVsZW0ua2V5KSwgJmRlc2MsCisJCQkgICAgbmxhW05GVEFfU0VUX0VMRU1fS0VZXSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyMTsKIApAQCAtMzI3MywyMSArMzUyNSwyNiBAQAogCWlmIChkZXNjLnR5cGUgIT0gTkZUX0RBVEFfVkFMVUUgfHwgZGVzYy5sZW4gIT0gc2V0LT5rbGVuKQogCQlnb3RvIGVycjI7CiAKLQllcnIgPSBzZXQtPm9wcy0+Z2V0KHNldCwgJmVsZW0pOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIGVycjI7Ci0KIAl0cmFucyA9IG5mdF90cmFuc19lbGVtX2FsbG9jKGN0eCwgTkZUX01TR19ERUxTRVRFTEVNLCBzZXQpOwogCWlmICh0cmFucyA9PSBOVUxMKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyMjsKIAl9CiAKKwllbGVtLnByaXYgPSBzZXQtPm9wcy0+ZGVhY3RpdmF0ZShzZXQsICZlbGVtKTsKKwlpZiAoZWxlbS5wcml2ID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT0VOVDsKKwkJZ290byBlcnIzOworCX0KKwogCW5mdF90cmFuc19lbGVtKHRyYW5zKSA9IGVsZW07CiAJbGlzdF9hZGRfdGFpbCgmdHJhbnMtPmxpc3QsICZjdHgtPm5ldC0+bmZ0LmNvbW1pdF9saXN0KTsKIAlyZXR1cm4gMDsKKworZXJyMzoKKwlrZnJlZSh0cmFucyk7CiBlcnIyOgotCW5mdF9kYXRhX3VuaW5pdCgmZWxlbS5rZXksIGRlc2MudHlwZSk7CisJbmZ0X2RhdGFfdW5pbml0KCZlbGVtLmtleS52YWwsIGRlc2MudHlwZSk7CiBlcnIxOgogCXJldHVybiBlcnI7CiB9CkBAIC0zMzE5LDExICszNTc2LDM2IEBACiAJCWlmIChlcnIgPCAwKQogCQkJYnJlYWs7CiAKLQkJc2V0LT5uZWxlbXMtLTsKKwkJc2V0LT5uZGVhY3QrKzsKIAl9CiAJcmV0dXJuIGVycjsKIH0KIAordm9pZCBuZnRfc2V0X2djX2JhdGNoX3JlbGVhc2Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IG5mdF9zZXRfZ2NfYmF0Y2ggKmdjYjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWdjYiA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBuZnRfc2V0X2djX2JhdGNoLCBoZWFkLnJjdSk7CisJZm9yIChpID0gMDsgaSA8IGdjYi0+aGVhZC5jbnQ7IGkrKykKKwkJbmZ0X3NldF9lbGVtX2Rlc3Ryb3koZ2NiLT5oZWFkLnNldCwgZ2NiLT5lbGVtc1tpXSk7CisJa2ZyZWUoZ2NiKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mdF9zZXRfZ2NfYmF0Y2hfcmVsZWFzZSk7CisKK3N0cnVjdCBuZnRfc2V0X2djX2JhdGNoICpuZnRfc2V0X2djX2JhdGNoX2FsbG9jKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJCQlnZnBfdCBnZnApCit7CisJc3RydWN0IG5mdF9zZXRfZ2NfYmF0Y2ggKmdjYjsKKworCWdjYiA9IGt6YWxsb2Moc2l6ZW9mKCpnY2IpLCBnZnApOworCWlmIChnY2IgPT0gTlVMTCkKKwkJcmV0dXJuIGdjYjsKKwlnY2ItPmhlYWQuc2V0ID0gc2V0OworCXJldHVybiBnY2I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZnRfc2V0X2djX2JhdGNoX2FsbG9jKTsKKwogc3RhdGljIGludCBuZl90YWJsZXNfZmlsbF9nZW5faW5mbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0ICpuZXQsCiAJCQkJICAgdTMyIHBvcnRpZCwgdTMyIHNlcSkKIHsKQEAgLTM1MjMsNiArMzgwNSwxMCBAQAogCWNhc2UgTkZUX01TR19ERUxTRVQ6CiAJCW5mdF9zZXRfZGVzdHJveShuZnRfdHJhbnNfc2V0KHRyYW5zKSk7CiAJCWJyZWFrOworCWNhc2UgTkZUX01TR19ERUxTRVRFTEVNOgorCQluZnRfc2V0X2VsZW1fZGVzdHJveShuZnRfdHJhbnNfZWxlbV9zZXQodHJhbnMpLAorCQkJCSAgICAgbmZ0X3RyYW5zX2VsZW0odHJhbnMpLnByaXYpOworCQlicmVhazsKIAl9CiAJa2ZyZWUodHJhbnMpOwogfQpAQCAtMzUzNyw3ICszODIzLDcgQEAKIAl3aGlsZSAoKytuZXQtPm5mdC5iYXNlX3NlcSA9PSAwKTsKIAogCS8qIEEgbmV3IGdlbmVyYXRpb24gaGFzIGp1c3Qgc3RhcnRlZCAqLwotCW5ldC0+bmZ0LmdlbmN1cnNvciA9IGdlbmN1cnNvcl9uZXh0KG5ldCk7CisJbmV0LT5uZnQuZ2VuY3Vyc29yID0gbmZ0X2dlbmN1cnNvcl9uZXh0KG5ldCk7CiAKIAkvKiBNYWtlIHN1cmUgYWxsIHBhY2tldHMgaGF2ZSBsZWZ0IHRoZSBwcmV2aW91cyBnZW5lcmF0aW9uIGJlZm9yZQogCSAqIHB1cmdpbmcgb2xkIHJ1bGVzLgpAQCAtMzYwOCwyNCArMzg5NCwyMyBAQAogCQkJCQkgICAgIE5GVF9NU0dfREVMU0VULCBHRlBfS0VSTkVMKTsKIAkJCWJyZWFrOwogCQljYXNlIE5GVF9NU0dfTkVXU0VURUxFTToKLQkJCW5mX3RhYmxlc19zZXRlbGVtX25vdGlmeSgmdHJhbnMtPmN0eCwKLQkJCQkJCSBuZnRfdHJhbnNfZWxlbV9zZXQodHJhbnMpLAotCQkJCQkJICZuZnRfdHJhbnNfZWxlbSh0cmFucyksCisJCQl0ZSA9IChzdHJ1Y3QgbmZ0X3RyYW5zX2VsZW0gKil0cmFucy0+ZGF0YTsKKworCQkJdGUtPnNldC0+b3BzLT5hY3RpdmF0ZSh0ZS0+c2V0LCAmdGUtPmVsZW0pOworCQkJbmZfdGFibGVzX3NldGVsZW1fbm90aWZ5KCZ0cmFucy0+Y3R4LCB0ZS0+c2V0LAorCQkJCQkJICZ0ZS0+ZWxlbSwKIAkJCQkJCSBORlRfTVNHX05FV1NFVEVMRU0sIDApOwogCQkJbmZ0X3RyYW5zX2Rlc3Ryb3kodHJhbnMpOwogCQkJYnJlYWs7CiAJCWNhc2UgTkZUX01TR19ERUxTRVRFTEVNOgogCQkJdGUgPSAoc3RydWN0IG5mdF90cmFuc19lbGVtICopdHJhbnMtPmRhdGE7CisKIAkJCW5mX3RhYmxlc19zZXRlbGVtX25vdGlmeSgmdHJhbnMtPmN0eCwgdGUtPnNldCwKIAkJCQkJCSAmdGUtPmVsZW0sCiAJCQkJCQkgTkZUX01TR19ERUxTRVRFTEVNLCAwKTsKLQkJCXRlLT5zZXQtPm9wcy0+Z2V0KHRlLT5zZXQsICZ0ZS0+ZWxlbSk7Ci0JCQluZnRfZGF0YV91bmluaXQoJnRlLT5lbGVtLmtleSwgTkZUX0RBVEFfVkFMVUUpOwotCQkJaWYgKHRlLT5zZXQtPmZsYWdzICYgTkZUX1NFVF9NQVAgJiYKLQkJCSAgICAhKHRlLT5lbGVtLmZsYWdzICYgTkZUX1NFVF9FTEVNX0lOVEVSVkFMX0VORCkpCi0JCQkJbmZ0X2RhdGFfdW5pbml0KCZ0ZS0+ZWxlbS5kYXRhLCB0ZS0+c2V0LT5kdHlwZSk7CiAJCQl0ZS0+c2V0LT5vcHMtPnJlbW92ZSh0ZS0+c2V0LCAmdGUtPmVsZW0pOwotCQkJbmZ0X3RyYW5zX2Rlc3Ryb3kodHJhbnMpOworCQkJYXRvbWljX2RlYygmdGUtPnNldC0+bmVsZW1zKTsKKwkJCXRlLT5zZXQtPm5kZWFjdC0tOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0zNjU3LDYgKzM5NDIsMTAgQEAKIAljYXNlIE5GVF9NU0dfTkVXU0VUOgogCQluZnRfc2V0X2Rlc3Ryb3kobmZ0X3RyYW5zX3NldCh0cmFucykpOwogCQlicmVhazsKKwljYXNlIE5GVF9NU0dfTkVXU0VURUxFTToKKwkJbmZ0X3NldF9lbGVtX2Rlc3Ryb3kobmZ0X3RyYW5zX2VsZW1fc2V0KHRyYW5zKSwKKwkJCQkgICAgIG5mdF90cmFuc19lbGVtKHRyYW5zKS5wcml2KTsKKwkJYnJlYWs7CiAJfQogCWtmcmVlKHRyYW5zKTsKIH0KQEAgLTM3MjUsMTggKzQwMTQsMTcgQEAKIAkJCW5mdF90cmFuc19kZXN0cm95KHRyYW5zKTsKIAkJCWJyZWFrOwogCQljYXNlIE5GVF9NU0dfTkVXU0VURUxFTToKLQkJCW5mdF90cmFuc19lbGVtX3NldCh0cmFucyktPm5lbGVtcy0tOwogCQkJdGUgPSAoc3RydWN0IG5mdF90cmFuc19lbGVtICopdHJhbnMtPmRhdGE7Ci0JCQl0ZS0+c2V0LT5vcHMtPmdldCh0ZS0+c2V0LCAmdGUtPmVsZW0pOwotCQkJbmZ0X2RhdGFfdW5pbml0KCZ0ZS0+ZWxlbS5rZXksIE5GVF9EQVRBX1ZBTFVFKTsKLQkJCWlmICh0ZS0+c2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQICYmCi0JCQkgICAgISh0ZS0+ZWxlbS5mbGFncyAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpKQotCQkJCW5mdF9kYXRhX3VuaW5pdCgmdGUtPmVsZW0uZGF0YSwgdGUtPnNldC0+ZHR5cGUpOworCiAJCQl0ZS0+c2V0LT5vcHMtPnJlbW92ZSh0ZS0+c2V0LCAmdGUtPmVsZW0pOwotCQkJbmZ0X3RyYW5zX2Rlc3Ryb3kodHJhbnMpOworCQkJYXRvbWljX2RlYygmdGUtPnNldC0+bmVsZW1zKTsKIAkJCWJyZWFrOwogCQljYXNlIE5GVF9NU0dfREVMU0VURUxFTToKLQkJCW5mdF90cmFuc19lbGVtX3NldCh0cmFucyktPm5lbGVtcysrOworCQkJdGUgPSAoc3RydWN0IG5mdF90cmFuc19lbGVtICopdHJhbnMtPmRhdGE7CisKKwkJCXRlLT5zZXQtPm9wcy0+YWN0aXZhdGUodGUtPnNldCwgJnRlLT5lbGVtKTsKKwkJCXRlLT5zZXQtPm5kZWFjdC0tOworCiAJCQluZnRfdHJhbnNfZGVzdHJveSh0cmFucyk7CiAJCQlicmVhazsKIAkJfQpAQCAtMzgxMSwxMyArNDA5OSwxOCBAQAogCQkJCQljb25zdCBzdHJ1Y3QgbmZ0X3NldF9pdGVyICppdGVyLAogCQkJCQljb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQogewotCWlmIChlbGVtLT5mbGFncyAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpCisJY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICpleHQgPSBuZnRfc2V0X2VsZW1fZXh0KHNldCwgZWxlbS0+cHJpdik7CisJY29uc3Qgc3RydWN0IG5mdF9kYXRhICpkYXRhOworCisJaWYgKG5mdF9zZXRfZXh0X2V4aXN0cyhleHQsIE5GVF9TRVRfRVhUX0ZMQUdTKSAmJgorCSAgICAqbmZ0X3NldF9leHRfZmxhZ3MoZXh0KSAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpCiAJCXJldHVybiAwOwogCi0Jc3dpdGNoIChlbGVtLT5kYXRhLnZlcmRpY3QpIHsKKwlkYXRhID0gbmZ0X3NldF9leHRfZGF0YShleHQpOworCXN3aXRjaCAoZGF0YS0+dmVyZGljdC5jb2RlKSB7CiAJY2FzZSBORlRfSlVNUDoKIAljYXNlIE5GVF9HT1RPOgotCQlyZXR1cm4gbmZfdGFibGVzX2NoZWNrX2xvb3BzKGN0eCwgZWxlbS0+ZGF0YS5jaGFpbik7CisJCXJldHVybiBuZl90YWJsZXNfY2hlY2tfbG9vcHMoY3R4LCBkYXRhLT52ZXJkaWN0LmNoYWluKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKIAl9CkBAIC0zODUwLDEwICs0MTQzLDExIEBACiAJCQlpZiAoZGF0YSA9PSBOVUxMKQogCQkJCWNvbnRpbnVlOwogCi0JCQlzd2l0Y2ggKGRhdGEtPnZlcmRpY3QpIHsKKwkJCXN3aXRjaCAoZGF0YS0+dmVyZGljdC5jb2RlKSB7CiAJCQljYXNlIE5GVF9KVU1QOgogCQkJY2FzZSBORlRfR09UTzoKLQkJCQllcnIgPSBuZl90YWJsZXNfY2hlY2tfbG9vcHMoY3R4LCBkYXRhLT5jaGFpbik7CisJCQkJZXJyID0gbmZfdGFibGVzX2NoZWNrX2xvb3BzKGN0eCwKKwkJCQkJCQlkYXRhLT52ZXJkaWN0LmNoYWluKTsKIAkJCQlpZiAoZXJyIDwgMCkKIAkJCQkJcmV0dXJuIGVycjsKIAkJCWRlZmF1bHQ6CkBAIC0zODY4LDcgKzQxNjIsOCBAQAogCQkJY29udGludWU7CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShiaW5kaW5nLCAmc2V0LT5iaW5kaW5ncywgbGlzdCkgewotCQkJaWYgKGJpbmRpbmctPmNoYWluICE9IGNoYWluKQorCQkJaWYgKCEoYmluZGluZy0+ZmxhZ3MgJiBORlRfU0VUX01BUCkgfHwKKwkJCSAgICBiaW5kaW5nLT5jaGFpbiAhPSBjaGFpbikKIAkJCQljb250aW51ZTsKIAogCQkJaXRlci5za2lwIAk9IDA7CkBAIC0zODg2LDg1ICs0MTgxLDEyOSBAQAogfQogCiAvKioKLSAqCW5mdF92YWxpZGF0ZV9pbnB1dF9yZWdpc3RlciAtIHZhbGlkYXRlIGFuIGV4cHJlc3Npb25zJyBpbnB1dCByZWdpc3RlcgorICoJbmZ0X3BhcnNlX3JlZ2lzdGVyIC0gcGFyc2UgYSByZWdpc3RlciB2YWx1ZSBmcm9tIGEgbmV0bGluayBhdHRyaWJ1dGUKKyAqCisgKglAYXR0cjogbmV0bGluayBhdHRyaWJ1dGUKKyAqCisgKglQYXJzZSBhbmQgdHJhbnNsYXRlIGEgcmVnaXN0ZXIgdmFsdWUgZnJvbSBhIG5ldGxpbmsgYXR0cmlidXRlLgorICoJUmVnaXN0ZXJzIHVzZWQgdG8gYmUgMTI4IGJpdCB3aWRlLCB0aGVzZSByZWdpc3RlciBudW1iZXJzIHdpbGwgYmUKKyAqCW1hcHBlZCB0byB0aGUgY29ycmVzcG9uZGluZyAzMiBiaXQgcmVnaXN0ZXIgbnVtYmVycy4KKyAqLwordW5zaWduZWQgaW50IG5mdF9wYXJzZV9yZWdpc3Rlcihjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyKQoreworCXVuc2lnbmVkIGludCByZWc7CisKKwlyZWcgPSBudG9obChubGFfZ2V0X2JlMzIoYXR0cikpOworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBORlRfUkVHX1ZFUkRJQ1QuLi5ORlRfUkVHXzQ6CisJCXJldHVybiByZWcgKiBORlRfUkVHX1NJWkUgLyBORlRfUkVHMzJfU0laRTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gcmVnICsgTkZUX1JFR19TSVpFIC8gTkZUX1JFRzMyX1NJWkUgLSBORlRfUkVHMzJfMDA7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwobmZ0X3BhcnNlX3JlZ2lzdGVyKTsKKworLyoqCisgKgluZnRfZHVtcF9yZWdpc3RlciAtIGR1bXAgYSByZWdpc3RlciB2YWx1ZSB0byBhIG5ldGxpbmsgYXR0cmlidXRlCisgKgorICoJQHNrYjogc29ja2V0IGJ1ZmZlcgorICoJQGF0dHI6IGF0dHJpYnV0ZSBudW1iZXIKKyAqCUByZWc6IHJlZ2lzdGVyIG51bWJlcgorICoKKyAqCUNvbnN0cnVjdCBhIG5ldGxpbmsgYXR0cmlidXRlIGNvbnRhaW5pbmcgdGhlIHJlZ2lzdGVyIG51bWJlci4gRm9yCisgKgljb21wYXRpYmlsaXR5IHJlYXNvbnMsIHJlZ2lzdGVyIG51bWJlcnMgYmVpbmcgYSBtdWx0aXBsZSBvZiA0IGFyZQorICoJdHJhbnNsYXRlZCB0byB0aGUgY29ycmVzcG9uZGluZyAxMjggYml0IHJlZ2lzdGVyIG51bWJlcnMuCisgKi8KK2ludCBuZnRfZHVtcF9yZWdpc3RlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgYXR0ciwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlpZiAocmVnICUgKE5GVF9SRUdfU0laRSAvIE5GVF9SRUczMl9TSVpFKSA9PSAwKQorCQlyZWcgPSByZWcgLyAoTkZUX1JFR19TSVpFIC8gTkZUX1JFRzMyX1NJWkUpOworCWVsc2UKKwkJcmVnID0gcmVnIC0gTkZUX1JFR19TSVpFIC8gTkZUX1JFRzMyX1NJWkUgKyBORlRfUkVHMzJfMDA7CisKKwlyZXR1cm4gbmxhX3B1dF9iZTMyKHNrYiwgYXR0ciwgaHRvbmwocmVnKSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZnRfZHVtcF9yZWdpc3Rlcik7CisKKy8qKgorICoJbmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX2xvYWQgLSB2YWxpZGF0ZSBhIGxvYWQgZnJvbSBhIHJlZ2lzdGVyCiAgKgogICoJQHJlZzogdGhlIHJlZ2lzdGVyIG51bWJlcgorICoJQGxlbjogdGhlIGxlbmd0aCBvZiB0aGUgZGF0YQogICoKICAqIAlWYWxpZGF0ZSB0aGF0IHRoZSBpbnB1dCByZWdpc3RlciBpcyBvbmUgb2YgdGhlIGdlbmVyYWwgcHVycG9zZQotICogCXJlZ2lzdGVycy4KKyAqIAlyZWdpc3RlcnMgYW5kIHRoYXQgdGhlIGxlbmd0aCBvZiB0aGUgbG9hZCBpcyB3aXRoaW4gdGhlIGJvdW5kcy4KICAqLwotaW50IG5mdF92YWxpZGF0ZV9pbnB1dF9yZWdpc3RlcihlbnVtIG5mdF9yZWdpc3RlcnMgcmVnKQoraW50IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKGVudW0gbmZ0X3JlZ2lzdGVycyByZWcsIHVuc2lnbmVkIGludCBsZW4pCiB7Ci0JaWYgKHJlZyA8PSBORlRfUkVHX1ZFUkRJQ1QpCisJaWYgKHJlZyA8IE5GVF9SRUdfMSAqIE5GVF9SRUdfU0laRSAvIE5GVF9SRUczMl9TSVpFKQogCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAocmVnID4gTkZUX1JFR19NQVgpCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmVnICogTkZUX1JFRzMyX1NJWkUgKyBsZW4gPiBGSUVMRF9TSVpFT0Yoc3RydWN0IG5mdF9yZWdzLCBkYXRhKSkKIAkJcmV0dXJuIC1FUkFOR0U7CisKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG5mdF92YWxpZGF0ZV9pbnB1dF9yZWdpc3Rlcik7CitFWFBPUlRfU1lNQk9MX0dQTChuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZCk7CiAKIC8qKgotICoJbmZ0X3ZhbGlkYXRlX291dHB1dF9yZWdpc3RlciAtIHZhbGlkYXRlIGFuIGV4cHJlc3Npb25zJyBvdXRwdXQgcmVnaXN0ZXIKLSAqCi0gKglAcmVnOiB0aGUgcmVnaXN0ZXIgbnVtYmVyCi0gKgotICogCVZhbGlkYXRlIHRoYXQgdGhlIG91dHB1dCByZWdpc3RlciBpcyBvbmUgb2YgdGhlIGdlbmVyYWwgcHVycG9zZQotICogCXJlZ2lzdGVycyBvciB0aGUgdmVyZGljdCByZWdpc3Rlci4KLSAqLwotaW50IG5mdF92YWxpZGF0ZV9vdXRwdXRfcmVnaXN0ZXIoZW51bSBuZnRfcmVnaXN0ZXJzIHJlZykKLXsKLQlpZiAocmVnIDwgTkZUX1JFR19WRVJESUNUKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAocmVnID4gTkZUX1JFR19NQVgpCi0JCXJldHVybiAtRVJBTkdFOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZ0X3ZhbGlkYXRlX291dHB1dF9yZWdpc3Rlcik7Ci0KLS8qKgotICoJbmZ0X3ZhbGlkYXRlX2RhdGFfbG9hZCAtIHZhbGlkYXRlIGFuIGV4cHJlc3Npb25zJyBkYXRhIGxvYWQKKyAqCW5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9zdG9yZSAtIHZhbGlkYXRlIGFuIGV4cHJlc3Npb25zJyByZWdpc3RlciBzdG9yZQogICoKICAqCUBjdHg6IGNvbnRleHQgb2YgdGhlIGV4cHJlc3Npb24gcGVyZm9ybWluZyB0aGUgbG9hZAogICogCUByZWc6IHRoZSBkZXN0aW5hdGlvbiByZWdpc3RlciBudW1iZXIKICAqIAlAZGF0YTogdGhlIGRhdGEgdG8gbG9hZAogICogCUB0eXBlOiB0aGUgZGF0YSB0eXBlCisgKiAJQGxlbjogdGhlIGxlbmd0aCBvZiB0aGUgZGF0YQogICoKICAqIAlWYWxpZGF0ZSB0aGF0IGEgZGF0YSBsb2FkIHVzZXMgdGhlIGFwcHJvcHJpYXRlIGRhdGEgdHlwZSBmb3IKLSAqIAl0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIuIEEgdmFsdWUgb2YgTlVMTCBmb3IgdGhlIGRhdGEgbWVhbnMKLSAqIAl0aGF0IGl0cyBydW50aW1lIGdhdGhlcmVkIGRhdGEsIHdoaWNoIGlzIGFsd2F5cyBvZiB0eXBlCi0gKiAJTkZUX0RBVEFfVkFMVUUuCisgKiAJdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyIGFuZCB0aGUgbGVuZ3RoIGlzIHdpdGhpbiB0aGUgYm91bmRzLgorICogCUEgdmFsdWUgb2YgTlVMTCBmb3IgdGhlIGRhdGEgbWVhbnMgdGhhdCBpdHMgcnVudGltZSBnYXRoZXJlZAorICogCWRhdGEuCiAgKi8KLWludCBuZnRfdmFsaWRhdGVfZGF0YV9sb2FkKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIGVudW0gbmZ0X3JlZ2lzdGVycyByZWcsCi0JCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X2RhdGEgKmRhdGEsCi0JCQkgICBlbnVtIG5mdF9kYXRhX3R5cGVzIHR5cGUpCitpbnQgbmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX3N0b3JlKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkJZW51bSBuZnRfcmVnaXN0ZXJzIHJlZywKKwkJCQljb25zdCBzdHJ1Y3QgbmZ0X2RhdGEgKmRhdGEsCisJCQkJZW51bSBuZnRfZGF0YV90eXBlcyB0eXBlLCB1bnNpZ25lZCBpbnQgbGVuKQogewogCWludCBlcnI7CiAKIAlzd2l0Y2ggKHJlZykgewogCWNhc2UgTkZUX1JFR19WRVJESUNUOgotCQlpZiAoZGF0YSA9PSBOVUxMIHx8IHR5cGUgIT0gTkZUX0RBVEFfVkVSRElDVCkKKwkJaWYgKHR5cGUgIT0gTkZUX0RBVEFfVkVSRElDVCkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCWlmIChkYXRhLT52ZXJkaWN0ID09IE5GVF9HT1RPIHx8IGRhdGEtPnZlcmRpY3QgPT0gTkZUX0pVTVApIHsKLQkJCWVyciA9IG5mX3RhYmxlc19jaGVja19sb29wcyhjdHgsIGRhdGEtPmNoYWluKTsKKwkJaWYgKGRhdGEgIT0gTlVMTCAmJgorCQkgICAgKGRhdGEtPnZlcmRpY3QuY29kZSA9PSBORlRfR09UTyB8fAorCQkgICAgIGRhdGEtPnZlcmRpY3QuY29kZSA9PSBORlRfSlVNUCkpIHsKKwkJCWVyciA9IG5mX3RhYmxlc19jaGVja19sb29wcyhjdHgsIGRhdGEtPnZlcmRpY3QuY2hhaW4pOwogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAotCQkJaWYgKGN0eC0+Y2hhaW4tPmxldmVsICsgMSA+IGRhdGEtPmNoYWluLT5sZXZlbCkgeworCQkJaWYgKGN0eC0+Y2hhaW4tPmxldmVsICsgMSA+CisJCQkgICAgZGF0YS0+dmVyZGljdC5jaGFpbi0+bGV2ZWwpIHsKIAkJCQlpZiAoY3R4LT5jaGFpbi0+bGV2ZWwgKyAxID09IE5GVF9KVU1QX1NUQUNLX1NJWkUpCiAJCQkJCXJldHVybiAtRU1MSU5LOwotCQkJCWRhdGEtPmNoYWluLT5sZXZlbCA9IGN0eC0+Y2hhaW4tPmxldmVsICsgMTsKKwkJCQlkYXRhLT52ZXJkaWN0LmNoYWluLT5sZXZlbCA9IGN0eC0+Y2hhaW4tPmxldmVsICsgMTsKIAkJCX0KIAkJfQogCiAJCXJldHVybiAwOwogCWRlZmF1bHQ6CisJCWlmIChyZWcgPCBORlRfUkVHXzEgKiBORlRfUkVHX1NJWkUgLyBORlRfUkVHMzJfU0laRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobGVuID09IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHJlZyAqIE5GVF9SRUczMl9TSVpFICsgbGVuID4KKwkJICAgIEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZ0X3JlZ3MsIGRhdGEpKQorCQkJcmV0dXJuIC1FUkFOR0U7CisKIAkJaWYgKGRhdGEgIT0gTlVMTCAmJiB0eXBlICE9IE5GVF9EQVRBX1ZBTFVFKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiAwOwogCX0KIH0KLUVYUE9SVF9TWU1CT0xfR1BMKG5mdF92YWxpZGF0ZV9kYXRhX2xvYWQpOworRVhQT1JUX1NZTUJPTF9HUEwobmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX3N0b3JlKTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF92ZXJkaWN0X3BvbGljeVtORlRBX1ZFUkRJQ1RfTUFYICsgMV0gPSB7CiAJW05GVEFfVkVSRElDVF9DT0RFXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCkBAIC0zOTg1LDExICs0MzI0LDExIEBACiAKIAlpZiAoIXRiW05GVEFfVkVSRElDVF9DT0RFXSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JZGF0YS0+dmVyZGljdCA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX1ZFUkRJQ1RfQ09ERV0pKTsKKwlkYXRhLT52ZXJkaWN0LmNvZGUgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9WRVJESUNUX0NPREVdKSk7CiAKLQlzd2l0Y2ggKGRhdGEtPnZlcmRpY3QpIHsKKwlzd2l0Y2ggKGRhdGEtPnZlcmRpY3QuY29kZSkgewogCWRlZmF1bHQ6Ci0JCXN3aXRjaCAoZGF0YS0+dmVyZGljdCAmIE5GX1ZFUkRJQ1RfTUFTSykgeworCQlzd2l0Y2ggKGRhdGEtPnZlcmRpY3QuY29kZSAmIE5GX1ZFUkRJQ1RfTUFTSykgewogCQljYXNlIE5GX0FDQ0VQVDoKIAkJY2FzZSBORl9EUk9QOgogCQljYXNlIE5GX1FVRVVFOgpAQCAtNDAxNSw3ICs0MzU0LDcgQEAKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCQljaGFpbi0+dXNlKys7Ci0JCWRhdGEtPmNoYWluID0gY2hhaW47CisJCWRhdGEtPnZlcmRpY3QuY2hhaW4gPSBjaGFpbjsKIAkJZGVzYy0+bGVuID0gc2l6ZW9mKGRhdGEpOwogCQlicmVhazsKIAl9CkBAIC00MDI2LDEwICs0MzY1LDEwIEBACiAKIHN0YXRpYyB2b2lkIG5mdF92ZXJkaWN0X3VuaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2RhdGEgKmRhdGEpCiB7Ci0Jc3dpdGNoIChkYXRhLT52ZXJkaWN0KSB7CisJc3dpdGNoIChkYXRhLT52ZXJkaWN0LmNvZGUpIHsKIAljYXNlIE5GVF9KVU1QOgogCWNhc2UgTkZUX0dPVE86Ci0JCWRhdGEtPmNoYWluLT51c2UtLTsKKwkJZGF0YS0+dmVyZGljdC5jaGFpbi0+dXNlLS07CiAJCWJyZWFrOwogCX0KIH0KQEAgLTQwNDIsMTMgKzQzODEsMTQgQEAKIAlpZiAoIW5lc3QpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfVkVSRElDVF9DT0RFLCBodG9ubChkYXRhLT52ZXJkaWN0KSkpCisJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfVkVSRElDVF9DT0RFLCBodG9ubChkYXRhLT52ZXJkaWN0LmNvZGUpKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlzd2l0Y2ggKGRhdGEtPnZlcmRpY3QpIHsKKwlzd2l0Y2ggKGRhdGEtPnZlcmRpY3QuY29kZSkgewogCWNhc2UgTkZUX0pVTVA6CiAJY2FzZSBORlRfR09UTzoKLQkJaWYgKG5sYV9wdXRfc3RyaW5nKHNrYiwgTkZUQV9WRVJESUNUX0NIQUlOLCBkYXRhLT5jaGFpbi0+bmFtZSkpCisJCWlmIChubGFfcHV0X3N0cmluZyhza2IsIE5GVEFfVkVSRElDVF9DSEFJTiwKKwkJCQkgICBkYXRhLT52ZXJkaWN0LmNoYWluLT5uYW1lKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCX0KIAlubGFfbmVzdF9lbmQoc2tiLCBuZXN0KTsKQEAgLTQwNTgsNyArNDM5OCw4IEBACiAJcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IG5mdF92YWx1ZV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsIHN0cnVjdCBuZnRfZGF0YSAqZGF0YSwKK3N0YXRpYyBpbnQgbmZ0X3ZhbHVlX2luaXQoY29uc3Qgc3RydWN0IG5mdF9jdHggKmN0eCwKKwkJCSAgc3RydWN0IG5mdF9kYXRhICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCSAgc3RydWN0IG5mdF9kYXRhX2Rlc2MgKmRlc2MsIGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSkKIHsKIAl1bnNpZ25lZCBpbnQgbGVuOwpAQCAtNDA2NiwxMCArNDQwNywxMCBAQAogCWxlbiA9IG5sYV9sZW4obmxhKTsKIAlpZiAobGVuID09IDApCiAJCXJldHVybiAtRUlOVkFMOwotCWlmIChsZW4gPiBzaXplb2YoZGF0YS0+ZGF0YSkpCisJaWYgKGxlbiA+IHNpemUpCiAJCXJldHVybiAtRU9WRVJGTE9XOwogCi0JbmxhX21lbWNweShkYXRhLT5kYXRhLCBubGEsIHNpemVvZihkYXRhLT5kYXRhKSk7CisJbmxhX21lbWNweShkYXRhLT5kYXRhLCBubGEsIGxlbik7CiAJZGVzYy0+dHlwZSA9IE5GVF9EQVRBX1ZBTFVFOwogCWRlc2MtPmxlbiAgPSBsZW47CiAJcmV0dXJuIDA7CkBAIC00MDgyLDggKzQ0MjMsNyBAQAogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZ0X2RhdGFfcG9saWN5W05GVEFfREFUQV9NQVggKyAxXSA9IHsKLQlbTkZUQV9EQVRBX1ZBTFVFXQk9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAotCQkJCSAgICAubGVuICA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZ0X2RhdGEsIGRhdGEpIH0sCisJW05GVEFfREFUQV9WQUxVRV0JPSB7IC50eXBlID0gTkxBX0JJTkFSWSB9LAogCVtORlRBX0RBVEFfVkVSRElDVF0JPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogfTsKIApAQCAtNDA5Miw2ICs0NDMyLDcgQEAKICAqCiAgKglAY3R4OiBjb250ZXh0IG9mIHRoZSBleHByZXNzaW9uIHVzaW5nIHRoZSBkYXRhCiAgKglAZGF0YTogZGVzdGluYXRpb24gc3RydWN0IG5mdF9kYXRhCisgKglAc2l6ZTogbWF4aW11bSBkYXRhIGxlbmd0aAogICoJQGRlc2M6IGRhdGEgZGVzY3JpcHRpb24KICAqCUBubGE6IG5ldGxpbmsgYXR0cmlidXRlIGNvbnRhaW5pbmcgZGF0YQogICoKQEAgLTQxMDEsNyArNDQ0Miw4IEBACiAgKglUaGUgY2FsbGVyIGNhbiBpbmRpY2F0ZSB0aGF0IGl0IG9ubHkgd2FudHMgdG8gYWNjZXB0IGRhdGEgb2YgdHlwZQogICoJTkZUX0RBVEFfVkFMVUUgYnkgcGFzc2luZyBOVUxMIGZvciB0aGUgY3R4IGFyZ3VtZW50LgogICovCi1pbnQgbmZ0X2RhdGFfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBzdHJ1Y3QgbmZ0X2RhdGEgKmRhdGEsCitpbnQgbmZ0X2RhdGFfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAorCQkgIHN0cnVjdCBuZnRfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IHNpemUsCiAJCSAgc3RydWN0IG5mdF9kYXRhX2Rlc2MgKmRlc2MsIGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSkKIHsKIAlzdHJ1Y3QgbmxhdHRyICp0YltORlRBX0RBVEFfTUFYICsgMV07CkBAIC00MTEyLDcgKzQ0NTQsOCBAQAogCQlyZXR1cm4gZXJyOwogCiAJaWYgKHRiW05GVEFfREFUQV9WQUxVRV0pCi0JCXJldHVybiBuZnRfdmFsdWVfaW5pdChjdHgsIGRhdGEsIGRlc2MsIHRiW05GVEFfREFUQV9WQUxVRV0pOworCQlyZXR1cm4gbmZ0X3ZhbHVlX2luaXQoY3R4LCBkYXRhLCBzaXplLCBkZXNjLAorCQkJCSAgICAgIHRiW05GVEFfREFUQV9WQUxVRV0pOwogCWlmICh0YltORlRBX0RBVEFfVkVSRElDVF0gJiYgY3R4ICE9IE5VTEwpCiAJCXJldHVybiBuZnRfdmVyZGljdF9pbml0KGN0eCwgZGF0YSwgZGVzYywgdGJbTkZUQV9EQVRBX1ZFUkRJQ1RdKTsKIAlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZfdGFibGVzX2NvcmUuYwppbmRleCAzYjkwZWIyLi5mMTUzYjA3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX3RhYmxlc19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5jCkBAIC04LDYgKzgsNyBAQAogICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIGZ1bmRlZCBieSBBc3Rhcm8gQUcgKGh0dHA6Ly93d3cuYXN0YXJvLmNvbS8pCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CkBAIC0yMSw1MSArMjIsNiBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9sb2cuaD4KIAotc3RhdGljIHZvaWQgbmZ0X2NtcF9mYXN0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgICAgc3RydWN0IG5mdF9kYXRhIGRhdGFbTkZUX1JFR19NQVggKyAxXSkKLXsKLQljb25zdCBzdHJ1Y3QgbmZ0X2NtcF9mYXN0X2V4cHIgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwotCXUzMiBtYXNrID0gbmZ0X2NtcF9mYXN0X21hc2socHJpdi0+bGVuKTsKLQotCWlmICgoZGF0YVtwcml2LT5zcmVnXS5kYXRhWzBdICYgbWFzaykgPT0gcHJpdi0+ZGF0YSkKLQkJcmV0dXJuOwotCWRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0ID0gTkZUX0JSRUFLOwotfQotCi1zdGF0aWMgYm9vbCBuZnRfcGF5bG9hZF9mYXN0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJCSAgc3RydWN0IG5mdF9kYXRhIGRhdGFbTkZUX1JFR19NQVggKyAxXSwKLQkJCQkgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQotewotCWNvbnN0IHN0cnVjdCBuZnRfcGF5bG9hZCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7Ci0JY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHBrdC0+c2tiOwotCXN0cnVjdCBuZnRfZGF0YSAqZGVzdCA9ICZkYXRhW3ByaXYtPmRyZWddOwotCXVuc2lnbmVkIGNoYXIgKnB0cjsKLQotCWlmIChwcml2LT5iYXNlID09IE5GVF9QQVlMT0FEX05FVFdPUktfSEVBREVSKQotCQlwdHIgPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKTsKLQllbHNlCi0JCXB0ciA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpICsgcGt0LT54dC50aG9mZjsKLQotCXB0ciArPSBwcml2LT5vZmZzZXQ7Ci0KLQlpZiAodW5saWtlbHkocHRyICsgcHJpdi0+bGVuID49IHNrYl90YWlsX3BvaW50ZXIoc2tiKSkpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmIChwcml2LT5sZW4gPT0gMikKLQkJKih1MTYgKilkZXN0LT5kYXRhID0gKih1MTYgKilwdHI7Ci0JZWxzZSBpZiAocHJpdi0+bGVuID09IDQpCi0JCSoodTMyICopZGVzdC0+ZGF0YSA9ICoodTMyICopcHRyOwotCWVsc2UKLQkJKih1OCAqKWRlc3QtPmRhdGEgPSAqKHU4ICopcHRyOwotCXJldHVybiB0cnVlOwotfQotCi1zdHJ1Y3QgbmZ0X2p1bXBzdGFjayB7Ci0JY29uc3Qgc3RydWN0IG5mdF9jaGFpbgkqY2hhaW47Ci0JY29uc3Qgc3RydWN0IG5mdF9ydWxlCSpydWxlOwotCWludAkJCXJ1bGVudW07Ci19OwotCiBlbnVtIG5mdF90cmFjZSB7CiAJTkZUX1RSQUNFX1JVTEUsCiAJTkZUX1RSQUNFX1JFVFVSTiwKQEAgLTgyLDQ2ICszOCw5NyBAQAogCS50eXBlID0gTkZfTE9HX1RZUEVfTE9HLAogCS51ID0gewogCQkubG9nID0gewotCQkJLmxldmVsID0gNCwKKwkJCS5sZXZlbCA9IExPR0xFVkVMX1dBUk5JTkcsCiAJCQkubG9nZmxhZ3MgPSBORl9MT0dfTUFTSywKIAkgICAgICAgIH0sCiAJfSwKIH07CiAKLXN0YXRpYyB2b2lkIG5mdF90cmFjZV9wYWNrZXQoY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBuZnRfY2hhaW4gKmNoYWluLAotCQkJICAgICBpbnQgcnVsZW51bSwgZW51bSBuZnRfdHJhY2UgdHlwZSkKK3N0YXRpYyB2b2lkIF9fbmZ0X3RyYWNlX3BhY2tldChjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X2NoYWluICpjaGFpbiwKKwkJCSAgICAgICBpbnQgcnVsZW51bSwgZW51bSBuZnRfdHJhY2UgdHlwZSkKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KHBrdC0+aW4gPyBwa3QtPmluIDogcGt0LT5vdXQpOwogCi0JbmZfbG9nX3BhY2tldChuZXQsIHBrdC0+eHQuZmFtaWx5LCBwa3QtPm9wcy0+aG9va251bSwgcGt0LT5za2IsIHBrdC0+aW4sCi0JCSAgICAgIHBrdC0+b3V0LCAmdHJhY2VfbG9naW5mbywgIlRSQUNFOiAlczolczolczoldSAiLAotCQkgICAgICBjaGFpbi0+dGFibGUtPm5hbWUsIGNoYWluLT5uYW1lLCBjb21tZW50c1t0eXBlXSwKLQkJICAgICAgcnVsZW51bSk7CisJbmZfbG9nX3RyYWNlKG5ldCwgcGt0LT54dC5mYW1pbHksIHBrdC0+b3BzLT5ob29rbnVtLCBwa3QtPnNrYiwgcGt0LT5pbiwKKwkJICAgICBwa3QtPm91dCwgJnRyYWNlX2xvZ2luZm8sICJUUkFDRTogJXM6JXM6JXM6JXUgIiwKKwkJICAgICBjaGFpbi0+dGFibGUtPm5hbWUsIGNoYWluLT5uYW1lLCBjb21tZW50c1t0eXBlXSwKKwkJICAgICBydWxlbnVtKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIG5mdF90cmFjZV9wYWNrZXQoY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfY2hhaW4gKmNoYWluLAorCQkJCSAgICBpbnQgcnVsZW51bSwgZW51bSBuZnRfdHJhY2UgdHlwZSkKK3sKKwlpZiAodW5saWtlbHkocGt0LT5za2ItPm5mX3RyYWNlKSkKKwkJX19uZnRfdHJhY2VfcGFja2V0KHBrdCwgY2hhaW4sIHJ1bGVudW0sIHR5cGUpOworfQorCitzdGF0aWMgdm9pZCBuZnRfY21wX2Zhc3RfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgICAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MpCit7CisJY29uc3Qgc3RydWN0IG5mdF9jbXBfZmFzdF9leHByICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1MzIgbWFzayA9IG5mdF9jbXBfZmFzdF9tYXNrKHByaXYtPmxlbik7CisKKwlpZiAoKHJlZ3MtPmRhdGFbcHJpdi0+c3JlZ10gJiBtYXNrKSA9PSBwcml2LT5kYXRhKQorCQlyZXR1cm47CisJcmVncy0+dmVyZGljdC5jb2RlID0gTkZUX0JSRUFLOworfQorCitzdGF0aWMgYm9vbCBuZnRfcGF5bG9hZF9mYXN0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJCSAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAorCQkJCSAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCit7CisJY29uc3Qgc3RydWN0IG5mdF9wYXlsb2FkICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcGt0LT5za2I7CisJdTMyICpkZXN0ID0gJnJlZ3MtPmRhdGFbcHJpdi0+ZHJlZ107CisJdW5zaWduZWQgY2hhciAqcHRyOworCisJaWYgKHByaXYtPmJhc2UgPT0gTkZUX1BBWUxPQURfTkVUV09SS19IRUFERVIpCisJCXB0ciA9IHNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCWVsc2UKKwkJcHRyID0gc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyBwa3QtPnh0LnRob2ZmOworCisJcHRyICs9IHByaXYtPm9mZnNldDsKKworCWlmICh1bmxpa2VseShwdHIgKyBwcml2LT5sZW4gPj0gc2tiX3RhaWxfcG9pbnRlcihza2IpKSkKKwkJcmV0dXJuIGZhbHNlOworCisJKmRlc3QgPSAwOworCWlmIChwcml2LT5sZW4gPT0gMikKKwkJKih1MTYgKilkZXN0ID0gKih1MTYgKilwdHI7CisJZWxzZSBpZiAocHJpdi0+bGVuID09IDQpCisJCSoodTMyICopZGVzdCA9ICoodTMyICopcHRyOworCWVsc2UKKwkJKih1OCAqKWRlc3QgPSAqKHU4ICopcHRyOworCXJldHVybiB0cnVlOworfQorCitzdHJ1Y3QgbmZ0X2p1bXBzdGFjayB7CisJY29uc3Qgc3RydWN0IG5mdF9jaGFpbgkqY2hhaW47CisJY29uc3Qgc3RydWN0IG5mdF9ydWxlCSpydWxlOworCWludAkJCXJ1bGVudW07Cit9OworCiB1bnNpZ25lZCBpbnQKIG5mdF9kb19jaGFpbihzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCwgY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9jaGFpbiAqY2hhaW4gPSBvcHMtPnByaXYsICpiYXNlY2hhaW4gPSBjaGFpbjsKKwljb25zdCBzdHJ1Y3QgbmV0ICpuZXQgPSByZWFkX3BuZXQoJm5mdF9iYXNlX2NoYWluKGJhc2VjaGFpbiktPnBuZXQpOwogCWNvbnN0IHN0cnVjdCBuZnRfcnVsZSAqcnVsZTsKIAljb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsICpsYXN0OwotCXN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV07CisJc3RydWN0IG5mdF9yZWdzIHJlZ3M7CiAJdW5zaWduZWQgaW50IHN0YWNrcHRyID0gMDsKIAlzdHJ1Y3QgbmZ0X2p1bXBzdGFjayBqdW1wc3RhY2tbTkZUX0pVTVBfU1RBQ0tfU0laRV07CiAJc3RydWN0IG5mdF9zdGF0cyAqc3RhdHM7CiAJaW50IHJ1bGVudW07Ci0JLyoKLQkgKiBDYWNoZSBjdXJzb3IgdG8gYXZvaWQgcHJvYmxlbXMgaW4gY2FzZSB0aGF0IHRoZSBjdXJzb3IgaXMgdXBkYXRlZAotCSAqIHdoaWxlIHRyYXZlcnNpbmcgdGhlIHJ1bGVzZXQuCi0JICovCi0JdW5zaWduZWQgaW50IGdlbmN1cnNvciA9IEFDQ0VTU19PTkNFKGNoYWluLT5uZXQtPm5mdC5nZW5jdXJzb3IpOworCXVuc2lnbmVkIGludCBnZW5jdXJzb3IgPSBuZnRfZ2VubWFza19jdXIobmV0KTsKIAogZG9fY2hhaW46CiAJcnVsZW51bSA9IDA7CiAJcnVsZSA9IGxpc3RfZW50cnkoJmNoYWluLT5ydWxlcywgc3RydWN0IG5mdF9ydWxlLCBsaXN0KTsKIG5leHRfcnVsZToKLQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GVF9DT05USU5VRTsKKwlyZWdzLnZlcmRpY3QuY29kZSA9IE5GVF9DT05USU5VRTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JjdShydWxlLCAmY2hhaW4tPnJ1bGVzLCBsaXN0KSB7CiAKIAkJLyogVGhpcyBydWxlIGlzIG5vdCBhY3RpdmUsIHNraXAuICovCkBAIC0xMzIsNjIgKzEzOSw1MiBAQAogCiAJCW5mdF9ydWxlX2Zvcl9lYWNoX2V4cHIoZXhwciwgbGFzdCwgcnVsZSkgewogCQkJaWYgKGV4cHItPm9wcyA9PSAmbmZ0X2NtcF9mYXN0X29wcykKLQkJCQluZnRfY21wX2Zhc3RfZXZhbChleHByLCBkYXRhKTsKKwkJCQluZnRfY21wX2Zhc3RfZXZhbChleHByLCAmcmVncyk7CiAJCQllbHNlIGlmIChleHByLT5vcHMgIT0gJm5mdF9wYXlsb2FkX2Zhc3Rfb3BzIHx8Ci0JCQkJICFuZnRfcGF5bG9hZF9mYXN0X2V2YWwoZXhwciwgZGF0YSwgcGt0KSkKLQkJCQlleHByLT5vcHMtPmV2YWwoZXhwciwgZGF0YSwgcGt0KTsKKwkJCQkgIW5mdF9wYXlsb2FkX2Zhc3RfZXZhbChleHByLCAmcmVncywgcGt0KSkKKwkJCQlleHByLT5vcHMtPmV2YWwoZXhwciwgJnJlZ3MsIHBrdCk7CiAKLQkJCWlmIChkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCAhPSBORlRfQ09OVElOVUUpCisJCQlpZiAocmVncy52ZXJkaWN0LmNvZGUgIT0gTkZUX0NPTlRJTlVFKQogCQkJCWJyZWFrOwogCQl9CiAKLQkJc3dpdGNoIChkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCkgeworCQlzd2l0Y2ggKHJlZ3MudmVyZGljdC5jb2RlKSB7CiAJCWNhc2UgTkZUX0JSRUFLOgotCQkJZGF0YVtORlRfUkVHX1ZFUkRJQ1RdLnZlcmRpY3QgPSBORlRfQ09OVElOVUU7CisJCQlyZWdzLnZlcmRpY3QuY29kZSA9IE5GVF9DT05USU5VRTsKIAkJCWNvbnRpbnVlOwogCQljYXNlIE5GVF9DT05USU5VRToKLQkJCWlmICh1bmxpa2VseShwa3QtPnNrYi0+bmZfdHJhY2UpKQotCQkJCW5mdF90cmFjZV9wYWNrZXQocGt0LCBjaGFpbiwgcnVsZW51bSwgTkZUX1RSQUNFX1JVTEUpOworCQkJbmZ0X3RyYWNlX3BhY2tldChwa3QsIGNoYWluLCBydWxlbnVtLCBORlRfVFJBQ0VfUlVMRSk7CiAJCQljb250aW51ZTsKIAkJfQogCQlicmVhazsKIAl9CiAKLQlzd2l0Y2ggKGRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0ICYgTkZfVkVSRElDVF9NQVNLKSB7CisJc3dpdGNoIChyZWdzLnZlcmRpY3QuY29kZSAmIE5GX1ZFUkRJQ1RfTUFTSykgewogCWNhc2UgTkZfQUNDRVBUOgogCWNhc2UgTkZfRFJPUDoKIAljYXNlIE5GX1FVRVVFOgotCQlpZiAodW5saWtlbHkocGt0LT5za2ItPm5mX3RyYWNlKSkKLQkJCW5mdF90cmFjZV9wYWNrZXQocGt0LCBjaGFpbiwgcnVsZW51bSwgTkZUX1RSQUNFX1JVTEUpOwotCi0JCXJldHVybiBkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdDsKKwkJbmZ0X3RyYWNlX3BhY2tldChwa3QsIGNoYWluLCBydWxlbnVtLCBORlRfVFJBQ0VfUlVMRSk7CisJCXJldHVybiByZWdzLnZlcmRpY3QuY29kZTsKIAl9CiAKLQlzd2l0Y2ggKGRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0KSB7CisJc3dpdGNoIChyZWdzLnZlcmRpY3QuY29kZSkgewogCWNhc2UgTkZUX0pVTVA6Ci0JCWlmICh1bmxpa2VseShwa3QtPnNrYi0+bmZfdHJhY2UpKQotCQkJbmZ0X3RyYWNlX3BhY2tldChwa3QsIGNoYWluLCBydWxlbnVtLCBORlRfVFJBQ0VfUlVMRSk7Ci0KIAkJQlVHX09OKHN0YWNrcHRyID49IE5GVF9KVU1QX1NUQUNLX1NJWkUpOwogCQlqdW1wc3RhY2tbc3RhY2twdHJdLmNoYWluID0gY2hhaW47CiAJCWp1bXBzdGFja1tzdGFja3B0cl0ucnVsZSAgPSBydWxlOwogCQlqdW1wc3RhY2tbc3RhY2twdHJdLnJ1bGVudW0gPSBydWxlbnVtOwogCQlzdGFja3B0cisrOwotCQljaGFpbiA9IGRhdGFbTkZUX1JFR19WRVJESUNUXS5jaGFpbjsKLQkJZ290byBkb19jaGFpbjsKKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBORlRfR09UTzoKLQkJaWYgKHVubGlrZWx5KHBrdC0+c2tiLT5uZl90cmFjZSkpCi0JCQluZnRfdHJhY2VfcGFja2V0KHBrdCwgY2hhaW4sIHJ1bGVudW0sIE5GVF9UUkFDRV9SVUxFKTsKKwkJbmZ0X3RyYWNlX3BhY2tldChwa3QsIGNoYWluLCBydWxlbnVtLCBORlRfVFJBQ0VfUlVMRSk7CiAKLQkJY2hhaW4gPSBkYXRhW05GVF9SRUdfVkVSRElDVF0uY2hhaW47CisJCWNoYWluID0gcmVncy52ZXJkaWN0LmNoYWluOwogCQlnb3RvIGRvX2NoYWluOwotCWNhc2UgTkZUX1JFVFVSTjoKLQkJaWYgKHVubGlrZWx5KHBrdC0+c2tiLT5uZl90cmFjZSkpCi0JCQluZnRfdHJhY2VfcGFja2V0KHBrdCwgY2hhaW4sIHJ1bGVudW0sIE5GVF9UUkFDRV9SRVRVUk4pOwotCQlicmVhazsKIAljYXNlIE5GVF9DT05USU5VRToKLQkJaWYgKHVubGlrZWx5KHBrdC0+c2tiLT5uZl90cmFjZSAmJiAhKGNoYWluLT5mbGFncyAmIE5GVF9CQVNFX0NIQUlOKSkpCi0JCQluZnRfdHJhY2VfcGFja2V0KHBrdCwgY2hhaW4sICsrcnVsZW51bSwgTkZUX1RSQUNFX1JFVFVSTik7CisJCXJ1bGVudW0rKzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBORlRfUkVUVVJOOgorCQluZnRfdHJhY2VfcGFja2V0KHBrdCwgY2hhaW4sIHJ1bGVudW0sIE5GVF9UUkFDRV9SRVRVUk4pOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlXQVJOX09OKDEpOwpAQCAtMjAxLDggKzE5OCw3IEBACiAJCWdvdG8gbmV4dF9ydWxlOwogCX0KIAotCWlmICh1bmxpa2VseShwa3QtPnNrYi0+bmZfdHJhY2UpKQotCQluZnRfdHJhY2VfcGFja2V0KHBrdCwgYmFzZWNoYWluLCAtMSwgTkZUX1RSQUNFX1BPTElDWSk7CisJbmZ0X3RyYWNlX3BhY2tldChwa3QsIGJhc2VjaGFpbiwgLTEsIE5GVF9UUkFDRV9QT0xJQ1kpOwogCiAJcmN1X3JlYWRfbG9ja19iaCgpOwogCXN0YXRzID0gdGhpc19jcHVfcHRyKHJjdV9kZXJlZmVyZW5jZShuZnRfYmFzZV9jaGFpbihiYXNlY2hhaW4pLT5zdGF0cykpOwpAQCAtMjQ0LDggKzI0MCwxNCBAQAogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycjY7CiAKKwllcnIgPSBuZnRfZHluc2V0X21vZHVsZV9pbml0KCk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyNzsKKwogCXJldHVybiAwOwogCitlcnI3OgorCW5mdF9wYXlsb2FkX21vZHVsZV9leGl0KCk7CiBlcnI2OgogCW5mdF9ieXRlb3JkZXJfbW9kdWxlX2V4aXQoKTsKIGVycjU6CkBAIC0yNjIsNiArMjY0LDcgQEAKIAogdm9pZCBuZl90YWJsZXNfY29yZV9tb2R1bGVfZXhpdCh2b2lkKQogeworCW5mdF9keW5zZXRfbW9kdWxlX2V4aXQoKTsKIAluZnRfcGF5bG9hZF9tb2R1bGVfZXhpdCgpOwogCW5mdF9ieXRlb3JkZXJfbW9kdWxlX2V4aXQoKTsKIAluZnRfYml0d2lzZV9tb2R1bGVfZXhpdCgpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfY3RoZWxwZXIuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2N0aGVscGVyLmMKaW5kZXggYTU1OTlmYy4uNTQzMzBmYiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfY3RoZWxwZXIuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19jdGhlbHBlci5jCkBAIC03Nyw2ICs3Nyw5IEBACiAJaWYgKCF0YltORkNUSF9UVVBMRV9MM1BST1RPTlVNXSB8fCAhdGJbTkZDVEhfVFVQTEVfTDRQUk9UT05VTV0pCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogTm90IGFsbCBmaWVsZHMgYXJlIGluaXRpYWxpemVkIHNvIGZpcnN0IHplcm8gdGhlIHR1cGxlICovCisJbWVtc2V0KHR1cGxlLCAwLCBzaXplb2Yoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSkpOworCiAJdHVwbGUtPnNyYy5sM251bSA9IG50b2hzKG5sYV9nZXRfYmUxNih0YltORkNUSF9UVVBMRV9MM1BST1RPTlVNXSkpOwogCXR1cGxlLT5kc3QucHJvdG9udW0gPSBubGFfZ2V0X3U4KHRiW05GQ1RIX1RVUExFX0w0UFJPVE9OVU1dKTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfbG9nLmMgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwppbmRleCAxMWQ4NWIzLi4zYWQ5MTI2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19sb2cuaD4KQEAgLTYyLDcgKzYzLDcgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CiAJc3RydWN0IHVzZXJfbmFtZXNwYWNlICpwZWVyX3VzZXJfbnM7CS8qIFVzZXIgbmFtZXNwYWNlIG9mIHRoZSBwZWVyIHByb2Nlc3MgKi8KLQlpbnQgcGVlcl9wb3J0aWQ7CQkJLyogUE9SVElEIG9mIHRoZSBwZWVyIHByb2Nlc3MgKi8KKwl1MzIgcGVlcl9wb3J0aWQ7CQkvKiBQT1JUSUQgb2YgdGhlIHBlZXIgcHJvY2VzcyAqLwogCiAJLyogY29uZmlndXJhYmxlIHBhcmFtZXRlcnMgKi8KIAl1bnNpZ25lZCBpbnQgZmx1c2h0aW1lb3V0OwkvKiB0aW1lb3V0IHVudGlsIHF1ZXVlIGZsdXNoICovCkBAIC0xNTEsNyArMTUyLDcgQEAKIAogc3RhdGljIHN0cnVjdCBuZnVsbmxfaW5zdGFuY2UgKgogaW5zdGFuY2VfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgdV9pbnQxNl90IGdyb3VwX251bSwKLQkJaW50IHBvcnRpZCwgc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zKQorCQl1MzIgcG9ydGlkLCBzdHJ1Y3QgdXNlcl9uYW1lc3BhY2UgKnVzZXJfbnMpCiB7CiAJc3RydWN0IG5mdWxubF9pbnN0YW5jZSAqaW5zdDsKIAlzdHJ1Y3QgbmZubF9sb2dfbmV0ICpsb2cgPSBuZm5sX2xvZ19wZXJuZXQobmV0KTsKQEAgLTQ0OCwxNCArNDQ5LDE4IEBACiAJCQkJCSBodG9ubChicl9wb3J0X2dldF9yY3UoaW5kZXYpLT5ici0+ZGV2LT5pZmluZGV4KSkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c2luZGV2OworCiAJCQkvKiBDYXNlIDI6IGluZGV2IGlzIGJyaWRnZSBncm91cCwgd2UgbmVlZCB0byBsb29rIGZvcgogCQkJICogcGh5c2ljYWwgZGV2aWNlICh3aGVuIGNhbGxlZCBmcm9tIGlwdjQpICovCiAJCQlpZiAobmxhX3B1dF9iZTMyKGluc3QtPnNrYiwgTkZVTEFfSUZJTkRFWF9JTkRFViwKIAkJCQkJIGh0b25sKGluZGV2LT5pZmluZGV4KSkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JCQlpZiAoc2tiLT5uZl9icmlkZ2UgJiYgc2tiLT5uZl9icmlkZ2UtPnBoeXNpbmRldiAmJgorCisJCQlwaHlzaW5kZXYgPSBuZl9icmlkZ2VfZ2V0X3BoeXNpbmRldihza2IpOworCQkJaWYgKHBoeXNpbmRldiAmJgogCQkJICAgIG5sYV9wdXRfYmUzMihpbnN0LT5za2IsIE5GVUxBX0lGSU5ERVhfUEhZU0lOREVWLAotCQkJCQkgaHRvbmwoc2tiLT5uZl9icmlkZ2UtPnBoeXNpbmRldi0+aWZpbmRleCkpKQorCQkJCQkgaHRvbmwocGh5c2luZGV2LT5pZmluZGV4KSkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0KICNlbmRpZgpAQCAtNDc5LDE0ICs0ODQsMTggQEAKIAkJCQkJIGh0b25sKGJyX3BvcnRfZ2V0X3JjdShvdXRkZXYpLT5ici0+ZGV2LT5pZmluZGV4KSkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c291dGRldjsKKwogCQkJLyogQ2FzZSAyOiBpbmRldiBpcyBhIGJyaWRnZSBncm91cCwgd2UgbmVlZCB0byBsb29rCiAJCQkgKiBmb3IgcGh5c2ljYWwgZGV2aWNlICh3aGVuIGNhbGxlZCBmcm9tIGlwdjQpICovCiAJCQlpZiAobmxhX3B1dF9iZTMyKGluc3QtPnNrYiwgTkZVTEFfSUZJTkRFWF9PVVRERVYsCiAJCQkJCSBodG9ubChvdXRkZXYtPmlmaW5kZXgpKSkKIAkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJCWlmIChza2ItPm5mX2JyaWRnZSAmJiBza2ItPm5mX2JyaWRnZS0+cGh5c291dGRldiAmJgorCisJCQlwaHlzb3V0ZGV2ID0gbmZfYnJpZGdlX2dldF9waHlzb3V0ZGV2KHNrYik7CisJCQlpZiAocGh5c291dGRldiAmJgogCQkJICAgIG5sYV9wdXRfYmUzMihpbnN0LT5za2IsIE5GVUxBX0lGSU5ERVhfUEhZU09VVERFViwKLQkJCQkJIGh0b25sKHNrYi0+bmZfYnJpZGdlLT5waHlzb3V0ZGV2LT5pZmluZGV4KSkpCisJCQkJCSBodG9ubChwaHlzb3V0ZGV2LT5pZmluZGV4KSkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0KICNlbmRpZgpAQCAtNTM5LDcgKzU0OCw3IEBACiAKIAkvKiBVSUQgKi8KIAlzayA9IHNrYi0+c2s7Ci0JaWYgKHNrICYmIHNrLT5za19zdGF0ZSAhPSBUQ1BfVElNRV9XQUlUKSB7CisJaWYgKHNrICYmIHNrX2Z1bGxzb2NrKHNrKSkgewogCQlyZWFkX2xvY2tfYmgoJnNrLT5za19jYWxsYmFja19sb2NrKTsKIAkJaWYgKHNrLT5za19zb2NrZXQgJiYgc2stPnNrX3NvY2tldC0+ZmlsZSkgewogCQkJc3RydWN0IGZpbGUgKmZpbGUgPSBzay0+c2tfc29ja2V0LT5maWxlOwpAQCAtOTk4LDExICsxMDA3LDEzIEBACiB7CiAJY29uc3Qgc3RydWN0IG5mdWxubF9pbnN0YW5jZSAqaW5zdCA9IHY7CiAKLQlyZXR1cm4gc2VxX3ByaW50ZihzLCAiJTVkICU2ZCAlNWQgJTFkICU1ZCAlNmQgJTJkXG4iLAotCQkJICBpbnN0LT5ncm91cF9udW0sCi0JCQkgIGluc3QtPnBlZXJfcG9ydGlkLCBpbnN0LT5xbGVuLAotCQkJICBpbnN0LT5jb3B5X21vZGUsIGluc3QtPmNvcHlfcmFuZ2UsCi0JCQkgIGluc3QtPmZsdXNodGltZW91dCwgYXRvbWljX3JlYWQoJmluc3QtPnVzZSkpOworCXNlcV9wcmludGYocywgIiU1dSAlNnUgJTV1ICUxdSAlNXUgJTZ1ICUydVxuIiwKKwkJICAgaW5zdC0+Z3JvdXBfbnVtLAorCQkgICBpbnN0LT5wZWVyX3BvcnRpZCwgaW5zdC0+cWxlbiwKKwkJICAgaW5zdC0+Y29weV9tb2RlLCBpbnN0LT5jb3B5X3JhbmdlLAorCQkgICBpbnN0LT5mbHVzaHRpbWVvdXQsIGF0b21pY19yZWFkKCZpbnN0LT51c2UpKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIG5mdWxfc2VxX29wcyA9IHsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlX2NvcmUuYyBiL25ldC9uZXRmaWx0ZXIvbmZuZXRsaW5rX3F1ZXVlX2NvcmUuYwppbmRleCAwZGI4NTE1Li4wYjk4Yzc0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19xdWV1ZV9jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWVfY29yZS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfYnJpZGdlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CkBAIC01NCw3ICs1NSw3IEBACiAJc3RydWN0IGhsaXN0X25vZGUgaGxpc3Q7CQkvKiBnbG9iYWwgbGlzdCBvZiBxdWV1ZXMgKi8KIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogCi0JaW50IHBlZXJfcG9ydGlkOworCXUzMiBwZWVyX3BvcnRpZDsKIAl1bnNpZ25lZCBpbnQgcXVldWVfbWF4bGVuOwogCXVuc2lnbmVkIGludCBjb3B5X3JhbmdlOwogCXVuc2lnbmVkIGludCBxdWV1ZV9kcm9wcGVkOwpAQCAtMTA5LDggKzExMCw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmZxbmxfaW5zdGFuY2UgKgotaW5zdGFuY2VfY3JlYXRlKHN0cnVjdCBuZm5sX3F1ZXVlX25ldCAqcSwgdV9pbnQxNl90IHF1ZXVlX251bSwKLQkJaW50IHBvcnRpZCkKK2luc3RhbmNlX2NyZWF0ZShzdHJ1Y3QgbmZubF9xdWV1ZV9uZXQgKnEsIHVfaW50MTZfdCBxdWV1ZV9udW0sIHUzMiBwb3J0aWQpCiB7CiAJc3RydWN0IG5mcW5sX2luc3RhbmNlICppbnN0OwogCXVuc2lnbmVkIGludCBoOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiB7CiAJY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQ7CiAKLQlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9USU1FX1dBSVQpCisJaWYgKCFza19mdWxsc29jayhzaykpCiAJCXJldHVybiAwOwogCiAJcmVhZF9sb2NrX2JoKCZzay0+c2tfY2FsbGJhY2tfbG9jayk7CkBAIC0zMTQsMTMgKzMxNCwxMyBAQAogCWlmIChlbnRza2ItPnRzdGFtcC50djY0KQogCQlzaXplICs9IG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3QgbmZxbmxfbXNnX3BhY2tldF90aW1lc3RhbXApKTsKIAotCWlmIChlbnRyeS0+aG9vayA8PSBORl9JTkVUX0ZPUldBUkQgfHwKLQkgICAoZW50cnktPmhvb2sgPT0gTkZfSU5FVF9QT1NUX1JPVVRJTkcgJiYgZW50c2tiLT5zayA9PSBOVUxMKSkKKwlpZiAoZW50cnktPnN0YXRlLmhvb2sgPD0gTkZfSU5FVF9GT1JXQVJEIHx8CisJICAgKGVudHJ5LT5zdGF0ZS5ob29rID09IE5GX0lORVRfUE9TVF9ST1VUSU5HICYmIGVudHNrYi0+c2sgPT0gTlVMTCkpCiAJCWNzdW1fdmVyaWZ5ID0gIXNrYl9jc3VtX3VubmVjZXNzYXJ5KGVudHNrYik7CiAJZWxzZQogCQljc3VtX3ZlcmlmeSA9IGZhbHNlOwogCi0Jb3V0ZGV2ID0gZW50cnktPm91dGRldjsKKwlvdXRkZXYgPSBlbnRyeS0+c3RhdGUub3V0OwogCiAJc3dpdGNoICgoZW51bSBuZnFubF9jb25maWdfbW9kZSlBQ0NFU1NfT05DRShxdWV1ZS0+Y29weV9tb2RlKSkgewogCWNhc2UgTkZRTkxfQ09QWV9NRVRBOgpAQCAtMzY4LDIzICszNjgsMjMgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCW5mbXNnID0gbmxtc2dfZGF0YShubGgpOwotCW5mbXNnLT5uZmdlbl9mYW1pbHkgPSBlbnRyeS0+cGY7CisJbmZtc2ctPm5mZ2VuX2ZhbWlseSA9IGVudHJ5LT5zdGF0ZS5wZjsKIAluZm1zZy0+dmVyc2lvbiA9IE5GTkVUTElOS19WMDsKIAluZm1zZy0+cmVzX2lkID0gaHRvbnMocXVldWUtPnF1ZXVlX251bSk7CiAKIAlubGEgPSBfX25sYV9yZXNlcnZlKHNrYiwgTkZRQV9QQUNLRVRfSERSLCBzaXplb2YoKnBtc2cpKTsKIAlwbXNnID0gbmxhX2RhdGEobmxhKTsKIAlwbXNnLT5od19wcm90b2NvbAk9IGVudHNrYi0+cHJvdG9jb2w7Ci0JcG1zZy0+aG9vawkJPSBlbnRyeS0+aG9vazsKKwlwbXNnLT5ob29rCQk9IGVudHJ5LT5zdGF0ZS5ob29rOwogCSpwYWNrZXRfaWRfcHRyCQk9ICZwbXNnLT5wYWNrZXRfaWQ7CiAKLQlpbmRldiA9IGVudHJ5LT5pbmRldjsKKwlpbmRldiA9IGVudHJ5LT5zdGF0ZS5pbjsKIAlpZiAoaW5kZXYpIHsKICNpZiAhSVNfRU5BQkxFRChDT05GSUdfQlJJREdFX05FVEZJTFRFUikKIAkJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GUUFfSUZJTkRFWF9JTkRFViwgaHRvbmwoaW5kZXYtPmlmaW5kZXgpKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogI2Vsc2UKLQkJaWYgKGVudHJ5LT5wZiA9PSBQRl9CUklER0UpIHsKKwkJaWYgKGVudHJ5LT5zdGF0ZS5wZiA9PSBQRl9CUklER0UpIHsKIAkJCS8qIENhc2UgMTogaW5kZXYgaXMgcGh5c2ljYWwgaW5wdXQgZGV2aWNlLCB3ZSBuZWVkIHRvCiAJCQkgKiBsb29rIGZvciBicmlkZ2UgZ3JvdXAgKHdoZW4gY2FsbGVkIGZyb20KIAkJCSAqIG5ldGZpbHRlcl9icmlkZ2UpICovCkBAIC0zOTYsMTQgKzM5NiwxOCBAQAogCQkJCQkgaHRvbmwoYnJfcG9ydF9nZXRfcmN1KGluZGV2KS0+YnItPmRldi0+aWZpbmRleCkpKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQl9IGVsc2UgeworCQkJaW50IHBoeXNpbmlmOworCiAJCQkvKiBDYXNlIDI6IGluZGV2IGlzIGJyaWRnZSBncm91cCwgd2UgbmVlZCB0byBsb29rIGZvcgogCQkJICogcGh5c2ljYWwgZGV2aWNlICh3aGVuIGNhbGxlZCBmcm9tIGlwdjQpICovCiAJCQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZRQV9JRklOREVYX0lOREVWLAogCQkJCQkgaHRvbmwoaW5kZXYtPmlmaW5kZXgpKSkKIAkJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQkJCWlmIChlbnRza2ItPm5mX2JyaWRnZSAmJiBlbnRza2ItPm5mX2JyaWRnZS0+cGh5c2luZGV2ICYmCisKKwkJCXBoeXNpbmlmID0gbmZfYnJpZGdlX2dldF9waHlzaW5pZihlbnRza2IpOworCQkJaWYgKHBoeXNpbmlmICYmCiAJCQkgICAgbmxhX3B1dF9iZTMyKHNrYiwgTkZRQV9JRklOREVYX1BIWVNJTkRFViwKLQkJCQkJIGh0b25sKGVudHNrYi0+bmZfYnJpZGdlLT5waHlzaW5kZXYtPmlmaW5kZXgpKSkKKwkJCQkJIGh0b25sKHBoeXNpbmlmKSkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0KICNlbmRpZgpAQCAtNDE0LDcgKzQxOCw3IEBACiAJCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlFBX0lGSU5ERVhfT1VUREVWLCBodG9ubChvdXRkZXYtPmlmaW5kZXgpKSkKIAkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogI2Vsc2UKLQkJaWYgKGVudHJ5LT5wZiA9PSBQRl9CUklER0UpIHsKKwkJaWYgKGVudHJ5LT5zdGF0ZS5wZiA9PSBQRl9CUklER0UpIHsKIAkJCS8qIENhc2UgMTogb3V0ZGV2IGlzIHBoeXNpY2FsIG91dHB1dCBkZXZpY2UsIHdlIG5lZWQgdG8KIAkJCSAqIGxvb2sgZm9yIGJyaWRnZSBncm91cCAod2hlbiBjYWxsZWQgZnJvbQogCQkJICogbmV0ZmlsdGVyX2JyaWRnZSkgKi8KQEAgLTQyNiwxNCArNDMwLDE4IEBACiAJCQkJCSBodG9ubChicl9wb3J0X2dldF9yY3Uob3V0ZGV2KS0+YnItPmRldi0+aWZpbmRleCkpKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCQl9IGVsc2UgeworCQkJaW50IHBoeXNvdXRpZjsKKwogCQkJLyogQ2FzZSAyOiBvdXRkZXYgaXMgYnJpZGdlIGdyb3VwLCB3ZSBuZWVkIHRvIGxvb2sgZm9yCiAJCQkgKiBwaHlzaWNhbCBvdXRwdXQgZGV2aWNlICh3aGVuIGNhbGxlZCBmcm9tIGlwdjQpICovCiAJCQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZRQV9JRklOREVYX09VVERFViwKIAkJCQkJIGh0b25sKG91dGRldi0+aWZpbmRleCkpKQogCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCQkJaWYgKGVudHNrYi0+bmZfYnJpZGdlICYmIGVudHNrYi0+bmZfYnJpZGdlLT5waHlzb3V0ZGV2ICYmCisKKwkJCXBoeXNvdXRpZiA9IG5mX2JyaWRnZV9nZXRfcGh5c291dGlmKGVudHNrYik7CisJCQlpZiAocGh5c291dGlmICYmCiAJCQkgICAgbmxhX3B1dF9iZTMyKHNrYiwgTkZRQV9JRklOREVYX1BIWVNPVVRERVYsCi0JCQkJCSBodG9ubChlbnRza2ItPm5mX2JyaWRnZS0+cGh5c291dGRldi0+aWZpbmRleCkpKQorCQkJCQkgaHRvbmwocGh5c291dGlmKSkpCiAJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJCX0KICNlbmRpZgpAQCAtNjMzLDggKzY0MSw4IEBACiAJc3RydWN0IG5mcW5sX2luc3RhbmNlICpxdWV1ZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqc2VnczsKIAlpbnQgZXJyID0gLUVOT0JVRlM7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChlbnRyeS0+aW5kZXYgPwotCQkJCSAgZW50cnktPmluZGV2IDogZW50cnktPm91dGRldik7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChlbnRyeS0+c3RhdGUuaW4gPworCQkJCSAgZW50cnktPnN0YXRlLmluIDogZW50cnktPnN0YXRlLm91dCk7CiAJc3RydWN0IG5mbmxfcXVldWVfbmV0ICpxID0gbmZubF9xdWV1ZV9wZXJuZXQobmV0KTsKIAogCS8qIHJjdV9yZWFkX2xvY2soKWVkIGJ5IG5mX2hvb2tfc2xvdygpICovCkBAIC02NDcsNyArNjU1LDcgQEAKIAogCXNrYiA9IGVudHJ5LT5za2I7CiAKLQlzd2l0Y2ggKGVudHJ5LT5wZikgeworCXN3aXRjaCAoZW50cnktPnN0YXRlLnBmKSB7CiAJY2FzZSBORlBST1RPX0lQVjQ6CiAJCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CiAJCWJyZWFrOwpAQCAtNzU3LDE5ICs3NjUsMjAgQEAKIHN0YXRpYyBpbnQKIGRldl9jbXAoc3RydWN0IG5mX3F1ZXVlX2VudHJ5ICplbnRyeSwgdW5zaWduZWQgbG9uZyBpZmluZGV4KQogewotCWlmIChlbnRyeS0+aW5kZXYpCi0JCWlmIChlbnRyeS0+aW5kZXYtPmlmaW5kZXggPT0gaWZpbmRleCkKKwlpZiAoZW50cnktPnN0YXRlLmluKQorCQlpZiAoZW50cnktPnN0YXRlLmluLT5pZmluZGV4ID09IGlmaW5kZXgpCiAJCQlyZXR1cm4gMTsKLQlpZiAoZW50cnktPm91dGRldikKLQkJaWYgKGVudHJ5LT5vdXRkZXYtPmlmaW5kZXggPT0gaWZpbmRleCkKKwlpZiAoZW50cnktPnN0YXRlLm91dCkKKwkJaWYgKGVudHJ5LT5zdGF0ZS5vdXQtPmlmaW5kZXggPT0gaWZpbmRleCkKIAkJCXJldHVybiAxOwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0JSSURHRV9ORVRGSUxURVIpCiAJaWYgKGVudHJ5LT5za2ItPm5mX2JyaWRnZSkgewotCQlpZiAoZW50cnktPnNrYi0+bmZfYnJpZGdlLT5waHlzaW5kZXYgJiYKLQkJICAgIGVudHJ5LT5za2ItPm5mX2JyaWRnZS0+cGh5c2luZGV2LT5pZmluZGV4ID09IGlmaW5kZXgpCi0JCQlyZXR1cm4gMTsKLQkJaWYgKGVudHJ5LT5za2ItPm5mX2JyaWRnZS0+cGh5c291dGRldiAmJgotCQkgICAgZW50cnktPnNrYi0+bmZfYnJpZGdlLT5waHlzb3V0ZGV2LT5pZmluZGV4ID09IGlmaW5kZXgpCisJCWludCBwaHlzaW5pZiwgcGh5c291dGlmOworCisJCXBoeXNpbmlmID0gbmZfYnJpZGdlX2dldF9waHlzaW5pZihlbnRyeS0+c2tiKTsKKwkJcGh5c291dGlmID0gbmZfYnJpZGdlX2dldF9waHlzb3V0aWYoZW50cnktPnNrYik7CisKKwkJaWYgKHBoeXNpbmlmID09IGlmaW5kZXggfHwgcGh5c291dGlmID09IGlmaW5kZXgpCiAJCQlyZXR1cm4gMTsKIAl9CiAjZW5kaWYKQEAgLTg2MCw3ICs4NjksNyBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBuZnFubF9pbnN0YW5jZSAqCi12ZXJkaWN0X2luc3RhbmNlX2xvb2t1cChzdHJ1Y3QgbmZubF9xdWV1ZV9uZXQgKnEsIHUxNiBxdWV1ZV9udW0sIGludCBubHBvcnRpZCkKK3ZlcmRpY3RfaW5zdGFuY2VfbG9va3VwKHN0cnVjdCBuZm5sX3F1ZXVlX25ldCAqcSwgdTE2IHF1ZXVlX251bSwgdTMyIG5scG9ydGlkKQogewogCXN0cnVjdCBuZnFubF9pbnN0YW5jZSAqcXVldWU7CiAKQEAgLTEyNDIsNyArMTI1MSw3IEBACiB7CiAJY29uc3Qgc3RydWN0IG5mcW5sX2luc3RhbmNlICppbnN0ID0gdjsKIAotCXNlcV9wcmludGYocywgIiU1ZCAlNmQgJTVkICUxZCAlNWQgJTVkICU1ZCAlOGQgJTJkXG4iLAorCXNlcV9wcmludGYocywgIiU1dSAlNnUgJTV1ICUxdSAlNXUgJTV1ICU1dSAlOHUgJTJkXG4iLAogCQkgICBpbnN0LT5xdWV1ZV9udW0sCiAJCSAgIGluc3QtPnBlZXJfcG9ydGlkLCBpbnN0LT5xdWV1ZV90b3RhbCwKIAkJICAgaW5zdC0+Y29weV9tb2RlLCBpbnN0LT5jb3B5X3JhbmdlLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfYml0d2lzZS5jIGIvbmV0L25ldGZpbHRlci9uZnRfYml0d2lzZS5jCmluZGV4IDRmYjZlZTIuLmQ3MWNjMTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2JpdHdpc2UuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9iaXR3aXNlLmMKQEAgLTI2LDE4ICsyNiwxNiBAQAogfTsKIAogc3RhdGljIHZvaWQgbmZ0X2JpdHdpc2VfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkgICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkgICAgIHN0cnVjdCBuZnRfcmVncyAqcmVncywKIAkJCSAgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9iaXR3aXNlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKLQljb25zdCBzdHJ1Y3QgbmZ0X2RhdGEgKnNyYyA9ICZkYXRhW3ByaXYtPnNyZWddOwotCXN0cnVjdCBuZnRfZGF0YSAqZHN0ID0gJmRhdGFbcHJpdi0+ZHJlZ107CisJY29uc3QgdTMyICpzcmMgPSAmcmVncy0+ZGF0YVtwcml2LT5zcmVnXTsKKwl1MzIgKmRzdCA9ICZyZWdzLT5kYXRhW3ByaXYtPmRyZWddOwogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IERJVl9ST1VORF9VUChwcml2LT5sZW4sIDQpOyBpKyspIHsKLQkJZHN0LT5kYXRhW2ldID0gKHNyYy0+ZGF0YVtpXSAmIHByaXYtPm1hc2suZGF0YVtpXSkgXgotCQkJICAgICAgIHByaXYtPnhvci5kYXRhW2ldOwotCX0KKwlmb3IgKGkgPSAwOyBpIDwgRElWX1JPVU5EX1VQKHByaXYtPmxlbiwgNCk7IGkrKykKKwkJZHN0W2ldID0gKHNyY1tpXSAmIHByaXYtPm1hc2suZGF0YVtpXSkgXiBwcml2LT54b3IuZGF0YVtpXTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9iaXR3aXNlX3BvbGljeVtORlRBX0JJVFdJU0VfTUFYICsgMV0gPSB7CkBAIC02MywyOCArNjEsMjcgQEAKIAkgICAgdGJbTkZUQV9CSVRXSVNFX1hPUl0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlwcml2LT5zcmVnID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQklUV0lTRV9TUkVHXSkpOwotCWVyciA9IG5mdF92YWxpZGF0ZV9pbnB1dF9yZWdpc3Rlcihwcml2LT5zcmVnKTsKKwlwcml2LT5sZW4gID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQklUV0lTRV9MRU5dKSk7CisJcHJpdi0+c3JlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX0JJVFdJU0VfU1JFR10pOworCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIHByaXYtPmxlbik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlwcml2LT5kcmVnID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQklUV0lTRV9EUkVHXSkpOwotCWVyciA9IG5mdF92YWxpZGF0ZV9vdXRwdXRfcmVnaXN0ZXIocHJpdi0+ZHJlZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JZXJyID0gbmZ0X3ZhbGlkYXRlX2RhdGFfbG9hZChjdHgsIHByaXYtPmRyZWcsIE5VTEwsIE5GVF9EQVRBX1ZBTFVFKTsKKwlwcml2LT5kcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfQklUV0lTRV9EUkVHXSk7CisJZXJyID0gbmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX3N0b3JlKGN0eCwgcHJpdi0+ZHJlZywgTlVMTCwKKwkJCQkJICBORlRfREFUQV9WQUxVRSwgcHJpdi0+bGVuKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXByaXYtPmxlbiA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0JJVFdJU0VfTEVOXSkpOwotCi0JZXJyID0gbmZ0X2RhdGFfaW5pdChOVUxMLCAmcHJpdi0+bWFzaywgJmQxLCB0YltORlRBX0JJVFdJU0VfTUFTS10pOworCWVyciA9IG5mdF9kYXRhX2luaXQoTlVMTCwgJnByaXYtPm1hc2ssIHNpemVvZihwcml2LT5tYXNrKSwgJmQxLAorCQkJICAgIHRiW05GVEFfQklUV0lTRV9NQVNLXSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJaWYgKGQxLmxlbiAhPSBwcml2LT5sZW4pCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZXJyID0gbmZ0X2RhdGFfaW5pdChOVUxMLCAmcHJpdi0+eG9yLCAmZDIsIHRiW05GVEFfQklUV0lTRV9YT1JdKTsKKwllcnIgPSBuZnRfZGF0YV9pbml0KE5VTEwsICZwcml2LT54b3IsIHNpemVvZihwcml2LT54b3IpLCAmZDIsCisJCQkgICAgdGJbTkZUQV9CSVRXSVNFX1hPUl0pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmIChkMi5sZW4gIT0gcHJpdi0+bGVuKQpAQCAtOTcsOSArOTQsOSBAQAogewogCWNvbnN0IHN0cnVjdCBuZnRfYml0d2lzZSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9CSVRXSVNFX1NSRUcsIGh0b25sKHByaXYtPnNyZWcpKSkKKwlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX0JJVFdJU0VfU1JFRywgcHJpdi0+c3JlZykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwotCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX0JJVFdJU0VfRFJFRywgaHRvbmwocHJpdi0+ZHJlZykpKQorCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfQklUV0lTRV9EUkVHLCBwcml2LT5kcmVnKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfQklUV0lTRV9MRU4sIGh0b25sKHByaXYtPmxlbikpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2J5dGVvcmRlci5jIGIvbmV0L25ldGZpbHRlci9uZnRfYnl0ZW9yZGVyLmMKaW5kZXggYzM5ZWQ4ZC4uZmRlNTE0NSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfYnl0ZW9yZGVyLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfYnl0ZW9yZGVyLmMKQEAgLTI2LDE2ICsyNiwxNyBAQAogfTsKIAogc3RhdGljIHZvaWQgbmZ0X2J5dGVvcmRlcl9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKLQkJCSAgICAgICBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJICAgICAgIHN0cnVjdCBuZnRfcmVncyAqcmVncywKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X2J5dGVvcmRlciAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7Ci0Jc3RydWN0IG5mdF9kYXRhICpzcmMgPSAmZGF0YVtwcml2LT5zcmVnXSwgKmRzdCA9ICZkYXRhW3ByaXYtPmRyZWddOworCXUzMiAqc3JjID0gJnJlZ3MtPmRhdGFbcHJpdi0+c3JlZ107CisJdTMyICpkc3QgPSAmcmVncy0+ZGF0YVtwcml2LT5kcmVnXTsKIAl1bmlvbiB7IHUzMiB1MzI7IHUxNiB1MTY7IH0gKnMsICpkOwogCXVuc2lnbmVkIGludCBpOwogCi0JcyA9ICh2b2lkICopc3JjLT5kYXRhOwotCWQgPSAodm9pZCAqKWRzdC0+ZGF0YTsKKwlzID0gKHZvaWQgKilzcmM7CisJZCA9ICh2b2lkICopZHN0OwogCiAJc3dpdGNoIChwcml2LT5zaXplKSB7CiAJY2FzZSA0OgpAQCAtODcsMTkgKzg4LDYgQEAKIAkgICAgdGJbTkZUQV9CWVRFT1JERVJfT1BdID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJpdi0+c3JlZyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0JZVEVPUkRFUl9TUkVHXSkpOwotCWVyciA9IG5mdF92YWxpZGF0ZV9pbnB1dF9yZWdpc3Rlcihwcml2LT5zcmVnKTsKLQlpZiAoZXJyIDwgMCkKLQkJcmV0dXJuIGVycjsKLQotCXByaXYtPmRyZWcgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9CWVRFT1JERVJfRFJFR10pKTsKLQllcnIgPSBuZnRfdmFsaWRhdGVfb3V0cHV0X3JlZ2lzdGVyKHByaXYtPmRyZWcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCWVyciA9IG5mdF92YWxpZGF0ZV9kYXRhX2xvYWQoY3R4LCBwcml2LT5kcmVnLCBOVUxMLCBORlRfREFUQV9WQUxVRSk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KIAlwcml2LT5vcCA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0JZVEVPUkRFUl9PUF0pKTsKIAlzd2l0Y2ggKHByaXYtPm9wKSB7CiAJY2FzZSBORlRfQllURU9SREVSX05UT0g6CkBAIC0xMDksMTAgKzk3LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcHJpdi0+bGVuID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQllURU9SREVSX0xFTl0pKTsKLQlpZiAocHJpdi0+bGVuID09IDAgfHwgcHJpdi0+bGVuID4gRklFTERfU0laRU9GKHN0cnVjdCBuZnRfZGF0YSwgZGF0YSkpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJcHJpdi0+c2l6ZSA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0JZVEVPUkRFUl9TSVpFXSkpOwogCXN3aXRjaCAocHJpdi0+c2l6ZSkgewogCWNhc2UgMjoKQEAgLTEyMiwxNiArMTA2LDI0IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiAwOworCXByaXYtPnNyZWcgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9CWVRFT1JERVJfU1JFR10pOworCXByaXYtPmxlbiAgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9CWVRFT1JERVJfTEVOXSkpOworCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIHByaXYtPmxlbik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlwcml2LT5kcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfQllURU9SREVSX0RSRUddKTsKKwlyZXR1cm4gbmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX3N0b3JlKGN0eCwgcHJpdi0+ZHJlZywgTlVMTCwKKwkJCQkJICAgTkZUX0RBVEFfVkFMVUUsIHByaXYtPmxlbik7CiB9CiAKIHN0YXRpYyBpbnQgbmZ0X2J5dGVvcmRlcl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X2J5dGVvcmRlciAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9CWVRFT1JERVJfU1JFRywgaHRvbmwocHJpdi0+c3JlZykpKQorCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfQllURU9SREVSX1NSRUcsIHByaXYtPnNyZWcpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9CWVRFT1JERVJfRFJFRywgaHRvbmwocHJpdi0+ZHJlZykpKQorCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfQllURU9SREVSX0RSRUcsIHByaXYtPmRyZWcpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9CWVRFT1JERVJfT1AsIGh0b25sKHByaXYtPm9wKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfY21wLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9jbXAuYwppbmRleCBlMmIzZjUxLi5lMjViMzVkIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9jbXAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9jbXAuYwpAQCAtMjUsMTMgKzI1LDEzIEBACiB9OwogCiBzdGF0aWMgdm9pZCBuZnRfY21wX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkgc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkJIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCWNvbnN0IHN0cnVjdCBuZnRfY21wX2V4cHIgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwogCWludCBkOwogCi0JZCA9IG5mdF9kYXRhX2NtcCgmZGF0YVtwcml2LT5zcmVnXSwgJnByaXYtPmRhdGEsIHByaXYtPmxlbik7CisJZCA9IG1lbWNtcCgmcmVncy0+ZGF0YVtwcml2LT5zcmVnXSwgJnByaXYtPmRhdGEsIHByaXYtPmxlbik7CiAJc3dpdGNoIChwcml2LT5vcCkgewogCWNhc2UgTkZUX0NNUF9FUToKIAkJaWYgKGQgIT0gMCkKQEAgLTU5LDcgKzU5LDcgQEAKIAlyZXR1cm47CiAKIG1pc21hdGNoOgotCWRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0ID0gTkZUX0JSRUFLOworCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9jbXBfcG9saWN5W05GVEFfQ01QX01BWCArIDFdID0gewpAQCAtNzUsMTIgKzc1LDE2IEBACiAJc3RydWN0IG5mdF9kYXRhX2Rlc2MgZGVzYzsKIAlpbnQgZXJyOwogCi0JcHJpdi0+c3JlZyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0NNUF9TUkVHXSkpOwotCXByaXYtPm9wID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQ01QX09QXSkpOwotCi0JZXJyID0gbmZ0X2RhdGFfaW5pdChOVUxMLCAmcHJpdi0+ZGF0YSwgJmRlc2MsIHRiW05GVEFfQ01QX0RBVEFdKTsKKwllcnIgPSBuZnRfZGF0YV9pbml0KE5VTEwsICZwcml2LT5kYXRhLCBzaXplb2YocHJpdi0+ZGF0YSksICZkZXNjLAorCQkJICAgIHRiW05GVEFfQ01QX0RBVEFdKTsKIAlCVUdfT04oZXJyIDwgMCk7CiAKKwlwcml2LT5zcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfQ01QX1NSRUddKTsKKwllcnIgPSBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZChwcml2LT5zcmVnLCBkZXNjLmxlbik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlwcml2LT5vcCAgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9DTVBfT1BdKSk7CiAJcHJpdi0+bGVuID0gZGVzYy5sZW47CiAJcmV0dXJuIDA7CiB9CkBAIC04OSw3ICs5Myw3IEBACiB7CiAJY29uc3Qgc3RydWN0IG5mdF9jbXBfZXhwciAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9DTVBfU1JFRywgaHRvbmwocHJpdi0+c3JlZykpKQorCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfQ01QX1NSRUcsIHByaXYtPnNyZWcpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9DTVBfT1AsIGh0b25sKHByaXYtPm9wKSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtMTIyLDEzICsxMjYsMTggQEAKIAl1MzIgbWFzazsKIAlpbnQgZXJyOwogCi0JcHJpdi0+c3JlZyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0NNUF9TUkVHXSkpOwotCi0JZXJyID0gbmZ0X2RhdGFfaW5pdChOVUxMLCAmZGF0YSwgJmRlc2MsIHRiW05GVEFfQ01QX0RBVEFdKTsKKwllcnIgPSBuZnRfZGF0YV9pbml0KE5VTEwsICZkYXRhLCBzaXplb2YoZGF0YSksICZkZXNjLAorCQkJICAgIHRiW05GVEFfQ01QX0RBVEFdKTsKIAlCVUdfT04oZXJyIDwgMCk7Ci0JZGVzYy5sZW4gKj0gQklUU19QRVJfQllURTsKIAorCXByaXYtPnNyZWcgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9DTVBfU1JFR10pOworCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIGRlc2MubGVuKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWRlc2MubGVuICo9IEJJVFNfUEVSX0JZVEU7CiAJbWFzayA9IG5mdF9jbXBfZmFzdF9tYXNrKGRlc2MubGVuKTsKKwogCXByaXYtPmRhdGEgPSBkYXRhLmRhdGFbMF0gJiBtYXNrOwogCXByaXYtPmxlbiAgPSBkZXNjLmxlbjsKIAlyZXR1cm4gMDsKQEAgLTEzOSw3ICsxNDgsNyBAQAogCWNvbnN0IHN0cnVjdCBuZnRfY21wX2Zhc3RfZXhwciAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAJc3RydWN0IG5mdF9kYXRhIGRhdGE7CiAKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9DTVBfU1JFRywgaHRvbmwocHJpdi0+c3JlZykpKQorCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfQ01QX1NSRUcsIHByaXYtPnNyZWcpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9DTVBfT1AsIGh0b25sKE5GVF9DTVBfRVEpKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CkBAIC0xNjcsNyArMTc2LDYgQEAKIHsKIAlzdHJ1Y3QgbmZ0X2RhdGFfZGVzYyBkZXNjOwogCXN0cnVjdCBuZnRfZGF0YSBkYXRhOwotCWVudW0gbmZ0X3JlZ2lzdGVycyBzcmVnOwogCWVudW0gbmZ0X2NtcF9vcHMgb3A7CiAJaW50IGVycjsKIApAQCAtMTc2LDExICsxODQsNiBAQAogCSAgICB0YltORlRBX0NNUF9EQVRBXSA9PSBOVUxMKQogCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKIAotCXNyZWcgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9DTVBfU1JFR10pKTsKLQllcnIgPSBuZnRfdmFsaWRhdGVfaW5wdXRfcmVnaXN0ZXIoc3JlZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBFUlJfUFRSKGVycik7Ci0KIAlvcCA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0NNUF9PUF0pKTsKIAlzd2l0Y2ggKG9wKSB7CiAJY2FzZSBORlRfQ01QX0VROgpAQCAtMTk0LDcgKzE5Nyw4IEBACiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KIAotCWVyciA9IG5mdF9kYXRhX2luaXQoTlVMTCwgJmRhdGEsICZkZXNjLCB0YltORlRBX0NNUF9EQVRBXSk7CisJZXJyID0gbmZ0X2RhdGFfaW5pdChOVUxMLCAmZGF0YSwgc2l6ZW9mKGRhdGEpLCAmZGVzYywKKwkJCSAgICB0YltORlRBX0NNUF9EQVRBXSk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2NvbXBhdC5jIGIvbmV0L25ldGZpbHRlci9uZnRfY29tcGF0LmMKaW5kZXggMjEzNTg0Yy4uN2YyOWNmYyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfY29tcGF0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfY29tcGF0LmMKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2JyaWRnZS9lYnRhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9hcnAvYXJwX3RhYmxlcy5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CiAKIHN0YXRpYyBpbnQgbmZ0X2NvbXBhdF9jaGFpbl92YWxpZGF0ZV9kZXBlbmRlbmN5KGNvbnN0IGNoYXIgKnRhYmxlbmFtZSwKQEAgLTQyLDYgKzQzLDcgQEAKIAlzdHJ1Y3QgaXB0X2VudHJ5IGU0OwogCXN0cnVjdCBpcDZ0X2VudHJ5IGU2OwogCXN0cnVjdCBlYnRfZW50cnkgZWJ0OworCXN0cnVjdCBhcnB0X2VudHJ5IGFycDsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNTMsNyArNTUsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBuZnRfdGFyZ2V0X2V2YWxfeHQoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkgICAgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCXZvaWQgKmluZm8gPSBuZnRfZXhwcl9wcml2KGV4cHIpOwpAQCAtNzAsMTYgKzcyLDE2IEBACiAKIAlzd2l0Y2ggKHJldCkgewogCWNhc2UgWFRfQ09OVElOVUU6Ci0JCWRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0ID0gTkZUX0NPTlRJTlVFOworCQlyZWdzLT52ZXJkaWN0LmNvZGUgPSBORlRfQ09OVElOVUU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0ID0gcmV0OworCQlyZWdzLT52ZXJkaWN0LmNvZGUgPSByZXQ7CiAJCWJyZWFrOwogCX0KIH0KIAogc3RhdGljIHZvaWQgbmZ0X3RhcmdldF9ldmFsX2JyaWRnZShjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkJICAgc3RydWN0IG5mdF9kYXRhIGRhdGFbTkZUX1JFR19NQVggKyAxXSwKKwkJCQkgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCiAJCQkJICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCiB7CiAJdm9pZCAqaW5mbyA9IG5mdF9leHByX3ByaXYoZXhwcik7CkBAIC05NiwxOSArOTgsMTkgQEAKIAogCXN3aXRjaCAocmV0KSB7CiAJY2FzZSBFQlRfQUNDRVBUOgotCQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GX0FDQ0VQVDsKKwkJcmVncy0+dmVyZGljdC5jb2RlID0gTkZfQUNDRVBUOwogCQlicmVhazsKIAljYXNlIEVCVF9EUk9QOgotCQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GX0RST1A7CisJCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GX0RST1A7CiAJCWJyZWFrOwogCWNhc2UgRUJUX0NPTlRJTlVFOgotCQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GVF9DT05USU5VRTsKKwkJcmVncy0+dmVyZGljdC5jb2RlID0gTkZUX0NPTlRJTlVFOwogCQlicmVhazsKIAljYXNlIEVCVF9SRVRVUk46Ci0JCWRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0ID0gTkZUX1JFVFVSTjsKKwkJcmVncy0+dmVyZGljdC5jb2RlID0gTkZUX1JFVFVSTjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGF0YVtORlRfUkVHX1ZFUkRJQ1RdLnZlcmRpY3QgPSByZXQ7CisJCXJlZ3MtPnZlcmRpY3QuY29kZSA9IHJldDsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMTMzLDYgKzEzNSw5IEBACiAJCWVudHJ5LT5lNC5pcC5pbnZmbGFncyA9IGludiA/IElQVF9JTlZfUFJPVE8gOiAwOwogCQlicmVhazsKIAljYXNlIEFGX0lORVQ2OgorCQlpZiAocHJvdG8pCisJCQllbnRyeS0+ZTYuaXB2Ni5mbGFncyB8PSBJUDZUX0ZfUFJPVE87CisKIAkJZW50cnktPmU2LmlwdjYucHJvdG8gPSBwcm90bzsKIAkJZW50cnktPmU2LmlwdjYuaW52ZmxhZ3MgPSBpbnYgPyBJUDZUX0lOVl9QUk9UTyA6IDA7CiAJCWJyZWFrOwpAQCAtMTQwLDYgKzE0NSw4IEBACiAJCWVudHJ5LT5lYnQuZXRocHJvdG8gPSAoX19mb3JjZSBfX2JlMTYpcHJvdG87CiAJCWVudHJ5LT5lYnQuaW52ZmxhZ3MgPSBpbnYgPyBFQlRfSVBST1RPIDogMDsKIAkJYnJlYWs7CisJY2FzZSBORlBST1RPX0FSUDoKKwkJYnJlYWs7CiAJfQogCXBhci0+ZW50cnlpbmZvCT0gZW50cnk7CiAJcGFyLT50YXJnZXQJPSB0YXJnZXQ7CkBAIC0yOTcsNyArMzA0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgbmZ0X21hdGNoX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgc3RydWN0IG5mdF9kYXRhIGRhdGFbTkZUX1JFR19NQVggKyAxXSwKKwkJCSAgIHN0cnVjdCBuZnRfcmVncyAqcmVncywKIAkJCSAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCXZvaWQgKmluZm8gPSBuZnRfZXhwcl9wcml2KGV4cHIpOwpAQCAtMzEwLDE2ICszMTcsMTYgQEAKIAlyZXQgPSBtYXRjaC0+bWF0Y2goc2tiLCAoc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqKSZwa3QtPnh0KTsKIAogCWlmIChwa3QtPnh0LmhvdGRyb3ApIHsKLQkJZGF0YVtORlRfUkVHX1ZFUkRJQ1RdLnZlcmRpY3QgPSBORl9EUk9QOworCQlyZWdzLT52ZXJkaWN0LmNvZGUgPSBORl9EUk9QOwogCQlyZXR1cm47CiAJfQogCi0Jc3dpdGNoKHJldCkgewotCWNhc2UgdHJ1ZToKLQkJZGF0YVtORlRfUkVHX1ZFUkRJQ1RdLnZlcmRpY3QgPSBORlRfQ09OVElOVUU7CisJc3dpdGNoIChyZXQgPyAxIDogMCkgeworCWNhc2UgMToKKwkJcmVncy0+dmVyZGljdC5jb2RlID0gTkZUX0NPTlRJTlVFOwogCQlicmVhazsKLQljYXNlIGZhbHNlOgotCQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GVF9CUkVBSzsKKwljYXNlIDA6CisJCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKIAkJYnJlYWs7CiAJfQogfQpAQCAtMzQ0LDYgKzM1MSw5IEBACiAJCWVudHJ5LT5lNC5pcC5pbnZmbGFncyA9IGludiA/IElQVF9JTlZfUFJPVE8gOiAwOwogCQlicmVhazsKIAljYXNlIEFGX0lORVQ2OgorCQlpZiAocHJvdG8pCisJCQllbnRyeS0+ZTYuaXB2Ni5mbGFncyB8PSBJUDZUX0ZfUFJPVE87CisKIAkJZW50cnktPmU2LmlwdjYucHJvdG8gPSBwcm90bzsKIAkJZW50cnktPmU2LmlwdjYuaW52ZmxhZ3MgPSBpbnYgPyBJUDZUX0lOVl9QUk9UTyA6IDA7CiAJCWJyZWFrOwpAQCAtMzUxLDYgKzM2MSw4IEBACiAJCWVudHJ5LT5lYnQuZXRocHJvdG8gPSAoX19mb3JjZSBfX2JlMTYpcHJvdG87CiAJCWVudHJ5LT5lYnQuaW52ZmxhZ3MgPSBpbnYgPyBFQlRfSVBST1RPIDogMDsKIAkJYnJlYWs7CisJY2FzZSBORlBST1RPX0FSUDoKKwkJYnJlYWs7CiAJfQogCXBhci0+ZW50cnlpbmZvCT0gZW50cnk7CiAJcGFyLT5tYXRjaAk9IG1hdGNoOwpAQCAtNTM3LDYgKzU0OSw5IEBACiAJY2FzZSBORlBST1RPX0JSSURHRToKIAkJZm10ID0gImVidF8lcyI7CiAJCWJyZWFrOworCWNhc2UgTkZQUk9UT19BUlA6CisJCWZtdCA9ICJhcnB0XyVzIjsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJuZnRfY29tcGF0OiB1bnN1cHBvcnRlZCBwcm90b2NvbCAlZFxuIiwKIAkJCW5mbXNnLT5uZmdlbl9mYW1pbHkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfY291bnRlci5jIGIvbmV0L25ldGZpbHRlci9uZnRfY291bnRlci5jCmluZGV4IGM4OWVlNDguLjE3NTkxMjMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X2NvdW50ZXIuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9jb3VudGVyLmMKQEAgLTI0LDcgKzI0LDcgQEAKIH07CiAKIHN0YXRpYyB2b2lkIG5mdF9jb3VudGVyX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgICBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJICAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCXN0cnVjdCBuZnRfY291bnRlciAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CkBAIC05Miw2ICs5Miw3IEBACiAJLm9wcwkJPSAmbmZ0X2NvdW50ZXJfb3BzLAogCS5wb2xpY3kJCT0gbmZ0X2NvdW50ZXJfcG9saWN5LAogCS5tYXhhdHRyCT0gTkZUQV9DT1VOVEVSX01BWCwKKwkuZmxhZ3MJCT0gTkZUX0VYUFJfU1RBVEVGVUwsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfY3QuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2N0LmMKaW5kZXggY2M1NjAzMC4uOGNiY2EzNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfY3QuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9jdC5jCkBAIC0zMSwxMSArMzEsMTEgQEAKIH07CiAKIHN0YXRpYyB2b2lkIG5mdF9jdF9nZXRfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkgICAgc3RydWN0IG5mdF9kYXRhIGRhdGFbTkZUX1JFR19NQVggKyAxXSwKKwkJCSAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCiAJCQkgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9jdCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7Ci0Jc3RydWN0IG5mdF9kYXRhICpkZXN0ID0gJmRhdGFbcHJpdi0+ZHJlZ107CisJdTMyICpkZXN0ID0gJnJlZ3MtPmRhdGFbcHJpdi0+ZHJlZ107CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0OwogCWNvbnN0IHN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHA7CkBAIC01NCw4ICs1NCwxMCBAQAogCQkJc3RhdGUgPSBORl9DVF9TVEFURV9VTlRSQUNLRURfQklUOwogCQllbHNlCiAJCQlzdGF0ZSA9IE5GX0NUX1NUQVRFX0JJVChjdGluZm8pOwotCQlkZXN0LT5kYXRhWzBdID0gc3RhdGU7CisJCSpkZXN0ID0gc3RhdGU7CiAJCXJldHVybjsKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiAKIAlpZiAoY3QgPT0gTlVMTCkKQEAgLTYzLDI2ICs2NSwyNiBAQAogCiAJc3dpdGNoIChwcml2LT5rZXkpIHsKIAljYXNlIE5GVF9DVF9ESVJFQ1RJT046Ci0JCWRlc3QtPmRhdGFbMF0gPSBDVElORk8yRElSKGN0aW5mbyk7CisJCSpkZXN0ID0gQ1RJTkZPMkRJUihjdGluZm8pOwogCQlyZXR1cm47CiAJY2FzZSBORlRfQ1RfU1RBVFVTOgotCQlkZXN0LT5kYXRhWzBdID0gY3QtPnN0YXR1czsKKwkJKmRlc3QgPSBjdC0+c3RhdHVzOwogCQlyZXR1cm47CiAjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19NQVJLCiAJY2FzZSBORlRfQ1RfTUFSSzoKLQkJZGVzdC0+ZGF0YVswXSA9IGN0LT5tYXJrOworCQkqZGVzdCA9IGN0LT5tYXJrOwogCQlyZXR1cm47CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1NFQ01BUksKIAljYXNlIE5GVF9DVF9TRUNNQVJLOgotCQlkZXN0LT5kYXRhWzBdID0gY3QtPnNlY21hcms7CisJCSpkZXN0ID0gY3QtPnNlY21hcms7CiAJCXJldHVybjsKICNlbmRpZgogCWNhc2UgTkZUX0NUX0VYUElSQVRJT046CiAJCWRpZmYgPSAobG9uZylqaWZmaWVzIC0gKGxvbmcpY3QtPnRpbWVvdXQuZXhwaXJlczsKIAkJaWYgKGRpZmYgPCAwKQogCQkJZGlmZiA9IDA7Ci0JCWRlc3QtPmRhdGFbMF0gPSBqaWZmaWVzX3RvX21zZWNzKGRpZmYpOworCQkqZGVzdCA9IGppZmZpZXNfdG9fbXNlY3MoZGlmZik7CiAJCXJldHVybjsKIAljYXNlIE5GVF9DVF9IRUxQRVI6CiAJCWlmIChjdC0+bWFzdGVyID09IE5VTEwpCkBAIC05Myw5ICs5NSw3IEBACiAJCWhlbHBlciA9IHJjdV9kZXJlZmVyZW5jZShoZWxwLT5oZWxwZXIpOwogCQlpZiAoaGVscGVyID09IE5VTEwpCiAJCQlnb3RvIGVycjsKLQkJaWYgKHN0cmxlbihoZWxwZXItPm5hbWUpID49IHNpemVvZihkZXN0LT5kYXRhKSkKLQkJCWdvdG8gZXJyOwotCQlzdHJuY3B5KChjaGFyICopZGVzdC0+ZGF0YSwgaGVscGVyLT5uYW1lLCBzaXplb2YoZGVzdC0+ZGF0YSkpOworCQlzdHJuY3B5KChjaGFyICopZGVzdCwgaGVscGVyLT5uYW1lLCBORl9DVF9IRUxQRVJfTkFNRV9MRU4pOwogCQlyZXR1cm47CiAjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFMKIAljYXNlIE5GVF9DVF9MQUJFTFM6IHsKQEAgLTEwMyw1OCArMTAzLDYwIEBACiAJCXVuc2lnbmVkIGludCBzaXplOwogCiAJCWlmICghbGFiZWxzKSB7Ci0JCQltZW1zZXQoZGVzdC0+ZGF0YSwgMCwgc2l6ZW9mKGRlc3QtPmRhdGEpKTsKKwkJCW1lbXNldChkZXN0LCAwLCBORl9DVF9MQUJFTFNfTUFYX1NJWkUpOwogCQkJcmV0dXJuOwogCQl9CiAKLQkJQlVJTERfQlVHX09OKE5GX0NUX0xBQkVMU19NQVhfU0laRSA+IHNpemVvZihkZXN0LT5kYXRhKSk7CiAJCXNpemUgPSBsYWJlbHMtPndvcmRzICogc2l6ZW9mKGxvbmcpOwotCi0JCW1lbWNweShkZXN0LT5kYXRhLCBsYWJlbHMtPmJpdHMsIHNpemUpOwotCQlpZiAoc2l6ZSA8IHNpemVvZihkZXN0LT5kYXRhKSkKLQkJCW1lbXNldCgoKGNoYXIgKikgZGVzdC0+ZGF0YSkgKyBzaXplLCAwLAotCQkJICAgICAgIHNpemVvZihkZXN0LT5kYXRhKSAtIHNpemUpOworCQltZW1jcHkoZGVzdCwgbGFiZWxzLT5iaXRzLCBzaXplKTsKKwkJaWYgKHNpemUgPCBORl9DVF9MQUJFTFNfTUFYX1NJWkUpCisJCQltZW1zZXQoKChjaGFyICopIGRlc3QpICsgc2l6ZSwgMCwKKwkJCSAgICAgICBORl9DVF9MQUJFTFNfTUFYX1NJWkUgLSBzaXplKTsKIAkJcmV0dXJuOwogCX0KICNlbmRpZgorCWRlZmF1bHQ6CisJCWJyZWFrOwogCX0KIAogCXR1cGxlID0gJmN0LT50dXBsZWhhc2hbcHJpdi0+ZGlyXS50dXBsZTsKIAlzd2l0Y2ggKHByaXYtPmtleSkgewogCWNhc2UgTkZUX0NUX0wzUFJPVE9DT0w6Ci0JCWRlc3QtPmRhdGFbMF0gPSBuZl9jdF9sM251bShjdCk7CisJCSpkZXN0ID0gbmZfY3RfbDNudW0oY3QpOwogCQlyZXR1cm47CiAJY2FzZSBORlRfQ1RfU1JDOgotCQltZW1jcHkoZGVzdC0+ZGF0YSwgdHVwbGUtPnNyYy51My5hbGwsCisJCW1lbWNweShkZXN0LCB0dXBsZS0+c3JjLnUzLmFsbCwKIAkJICAgICAgIG5mX2N0X2wzbnVtKGN0KSA9PSBORlBST1RPX0lQVjQgPyA0IDogMTYpOwogCQlyZXR1cm47CiAJY2FzZSBORlRfQ1RfRFNUOgotCQltZW1jcHkoZGVzdC0+ZGF0YSwgdHVwbGUtPmRzdC51My5hbGwsCisJCW1lbWNweShkZXN0LCB0dXBsZS0+ZHN0LnUzLmFsbCwKIAkJICAgICAgIG5mX2N0X2wzbnVtKGN0KSA9PSBORlBST1RPX0lQVjQgPyA0IDogMTYpOwogCQlyZXR1cm47CiAJY2FzZSBORlRfQ1RfUFJPVE9DT0w6Ci0JCWRlc3QtPmRhdGFbMF0gPSBuZl9jdF9wcm90b251bShjdCk7CisJCSpkZXN0ID0gbmZfY3RfcHJvdG9udW0oY3QpOwogCQlyZXR1cm47CiAJY2FzZSBORlRfQ1RfUFJPVE9fU1JDOgotCQlkZXN0LT5kYXRhWzBdID0gKF9fZm9yY2UgX191MTYpdHVwbGUtPnNyYy51LmFsbDsKKwkJKmRlc3QgPSAoX19mb3JjZSBfX3UxNil0dXBsZS0+c3JjLnUuYWxsOwogCQlyZXR1cm47CiAJY2FzZSBORlRfQ1RfUFJPVE9fRFNUOgotCQlkZXN0LT5kYXRhWzBdID0gKF9fZm9yY2UgX191MTYpdHVwbGUtPmRzdC51LmFsbDsKKwkJKmRlc3QgPSAoX19mb3JjZSBfX3UxNil0dXBsZS0+ZHN0LnUuYWxsOwogCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJYnJlYWs7CiAJfQogCXJldHVybjsKIGVycjoKLQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GVF9CUkVBSzsKKwlyZWdzLT52ZXJkaWN0LmNvZGUgPSBORlRfQlJFQUs7CiB9CiAKIHN0YXRpYyB2b2lkIG5mdF9jdF9zZXRfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkgICAgc3RydWN0IG5mdF9kYXRhIGRhdGFbTkZUX1JFR19NQVggKyAxXSwKKwkJCSAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCiAJCQkgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9jdCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHBrdC0+c2tiOwogI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfTUFSSwotCXUzMiB2YWx1ZSA9IGRhdGFbcHJpdi0+c3JlZ10uZGF0YVswXTsKKwl1MzIgdmFsdWUgPSByZWdzLT5kYXRhW3ByaXYtPnNyZWddOwogI2VuZGlmCiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwpAQCAtMTcyLDYgKzE3NCw4IEBACiAJCX0KIAkJYnJlYWs7CiAjZW5kaWYKKwlkZWZhdWx0OgorCQlicmVhazsKIAl9CiB9CiAKQEAgLTIyMCwxMiArMjI0LDE3IEBACiAJCQkgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKIAlzdHJ1Y3QgbmZ0X2N0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1bnNpZ25lZCBpbnQgbGVuOwogCWludCBlcnI7CiAKIAlwcml2LT5rZXkgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9DVF9LRVldKSk7CiAJc3dpdGNoIChwcml2LT5rZXkpIHsKLQljYXNlIE5GVF9DVF9TVEFURToKIAljYXNlIE5GVF9DVF9ESVJFQ1RJT046CisJCWlmICh0YltORlRBX0NUX0RJUkVDVElPTl0gIT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlsZW4gPSBzaXplb2YodTgpOworCQlicmVhazsKKwljYXNlIE5GVF9DVF9TVEFURToKIAljYXNlIE5GVF9DVF9TVEFUVVM6CiAjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19NQVJLCiAJY2FzZSBORlRfQ1RfTUFSSzoKQEAgLTIzMywyMiArMjQyLDU0IEBACiAjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19TRUNNQVJLCiAJY2FzZSBORlRfQ1RfU0VDTUFSSzoKICNlbmRpZgorCWNhc2UgTkZUX0NUX0VYUElSQVRJT046CisJCWlmICh0YltORlRBX0NUX0RJUkVDVElPTl0gIT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlsZW4gPSBzaXplb2YodTMyKTsKKwkJYnJlYWs7CiAjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19MQUJFTFMKIAljYXNlIE5GVF9DVF9MQUJFTFM6CisJCWlmICh0YltORlRBX0NUX0RJUkVDVElPTl0gIT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlsZW4gPSBORl9DVF9MQUJFTFNfTUFYX1NJWkU7CisJCWJyZWFrOwogI2VuZGlmCi0JY2FzZSBORlRfQ1RfRVhQSVJBVElPTjoKIAljYXNlIE5GVF9DVF9IRUxQRVI6CiAJCWlmICh0YltORlRBX0NUX0RJUkVDVElPTl0gIT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOworCQlsZW4gPSBORl9DVF9IRUxQRVJfTkFNRV9MRU47CiAJCWJyZWFrOworCiAJY2FzZSBORlRfQ1RfTDNQUk9UT0NPTDoKIAljYXNlIE5GVF9DVF9QUk9UT0NPTDoKKwkJaWYgKHRiW05GVEFfQ1RfRElSRUNUSU9OXSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWxlbiA9IHNpemVvZih1OCk7CisJCWJyZWFrOwogCWNhc2UgTkZUX0NUX1NSQzoKIAljYXNlIE5GVF9DVF9EU1Q6CisJCWlmICh0YltORlRBX0NUX0RJUkVDVElPTl0gPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXN3aXRjaCAoY3R4LT5hZmktPmZhbWlseSkgeworCQljYXNlIE5GUFJPVE9fSVBWNDoKKwkJCWxlbiA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlLAorCQkJCQkgICBzcmMudTMuaXApOworCQkJYnJlYWs7CisJCWNhc2UgTkZQUk9UT19JUFY2OgorCQljYXNlIE5GUFJPVE9fSU5FVDoKKwkJCWxlbiA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlLAorCQkJCQkgICBzcmMudTMuaXA2KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisJCX0KKwkJYnJlYWs7CiAJY2FzZSBORlRfQ1RfUFJPVE9fU1JDOgogCWNhc2UgTkZUX0NUX1BST1RPX0RTVDoKIAkJaWYgKHRiW05GVEFfQ1RfRElSRUNUSU9OXSA9PSBOVUxMKQogCQkJcmV0dXJuIC1FSU5WQUw7CisJCWxlbiA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlLCBzcmMudS5hbGwpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CkBAIC0yNjUsMTIgKzMwNiw5IEBACiAJCX0KIAl9CiAKLQlwcml2LT5kcmVnID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQ1RfRFJFR10pKTsKLQllcnIgPSBuZnRfdmFsaWRhdGVfb3V0cHV0X3JlZ2lzdGVyKHByaXYtPmRyZWcpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JZXJyID0gbmZ0X3ZhbGlkYXRlX2RhdGFfbG9hZChjdHgsIHByaXYtPmRyZWcsIE5VTEwsIE5GVF9EQVRBX1ZBTFVFKTsKKwlwcml2LT5kcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfQ1RfRFJFR10pOworCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9zdG9yZShjdHgsIHByaXYtPmRyZWcsIE5VTEwsCisJCQkJCSAgTkZUX0RBVEFfVkFMVUUsIGxlbik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTI4NiwyMCArMzI0LDIyIEBACiAJCQkgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKIAlzdHJ1Y3QgbmZ0X2N0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1bnNpZ25lZCBpbnQgbGVuOwogCWludCBlcnI7CiAKIAlwcml2LT5rZXkgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9DVF9LRVldKSk7CiAJc3dpdGNoIChwcml2LT5rZXkpIHsKICNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX01BUksKIAljYXNlIE5GVF9DVF9NQVJLOgorCQlsZW4gPSBGSUVMRF9TSVpFT0Yoc3RydWN0IG5mX2Nvbm4sIG1hcmspOwogCQlicmVhazsKICNlbmRpZgogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQlwcml2LT5zcmVnID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfQ1RfU1JFR10pKTsKLQllcnIgPSBuZnRfdmFsaWRhdGVfaW5wdXRfcmVnaXN0ZXIocHJpdi0+c3JlZyk7CisJcHJpdi0+c3JlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX0NUX1NSRUddKTsKKwllcnIgPSBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZChwcml2LT5zcmVnLCBsZW4pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC0zMjAsNyArMzYwLDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X2N0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKIAotCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX0NUX0RSRUcsIGh0b25sKHByaXYtPmRyZWcpKSkKKwlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX0NUX0RSRUcsIHByaXYtPmRyZWcpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9DVF9LRVksIGh0b25sKHByaXYtPmtleSkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKQEAgLTM0Nyw3ICszODcsNyBAQAogewogCWNvbnN0IHN0cnVjdCBuZnRfY3QgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwogCi0JaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfQ1RfU1JFRywgaHRvbmwocHJpdi0+c3JlZykpKQorCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfQ1RfU1JFRywgcHJpdi0+c3JlZykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX0NUX0tFWSwgaHRvbmwocHJpdi0+a2V5KSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfZHluc2V0LmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9keW5zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTNhOGVmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfZHluc2V0LmMKQEAgLTAsMCArMSwyNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgorI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXNfY29yZS5oPgorCitzdHJ1Y3QgbmZ0X2R5bnNldCB7CisJc3RydWN0IG5mdF9zZXQJCQkqc2V0OworCXN0cnVjdCBuZnRfc2V0X2V4dF90bXBsCQl0bXBsOworCWVudW0gbmZ0X2R5bnNldF9vcHMJCW9wOjg7CisJZW51bSBuZnRfcmVnaXN0ZXJzCQlzcmVnX2tleTo4OworCWVudW0gbmZ0X3JlZ2lzdGVycwkJc3JlZ19kYXRhOjg7CisJdTY0CQkJCXRpbWVvdXQ7CisJc3RydWN0IG5mdF9leHByCQkJKmV4cHI7CisJc3RydWN0IG5mdF9zZXRfYmluZGluZwkJYmluZGluZzsKK307CisKK3N0YXRpYyB2b2lkICpuZnRfZHluc2V0X25ldyhzdHJ1Y3QgbmZ0X3NldCAqc2V0LCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzKQoreworCWNvbnN0IHN0cnVjdCBuZnRfZHluc2V0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwlzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dDsKKwl1NjQgdGltZW91dDsKKwl2b2lkICplbGVtOworCisJaWYgKHNldC0+c2l6ZSAmJiAhYXRvbWljX2FkZF91bmxlc3MoJnNldC0+bmVsZW1zLCAxLCBzZXQtPnNpemUpKQorCQlyZXR1cm4gTlVMTDsKKworCXRpbWVvdXQgPSBwcml2LT50aW1lb3V0ID8gOiBzZXQtPnRpbWVvdXQ7CisJZWxlbSA9IG5mdF9zZXRfZWxlbV9pbml0KHNldCwgJnByaXYtPnRtcGwsCisJCQkJICZyZWdzLT5kYXRhW3ByaXYtPnNyZWdfa2V5XSwKKwkJCQkgJnJlZ3MtPmRhdGFbcHJpdi0+c3JlZ19kYXRhXSwKKwkJCQkgdGltZW91dCwgR0ZQX0FUT01JQyk7CisJaWYgKGVsZW0gPT0gTlVMTCkgeworCQlpZiAoc2V0LT5zaXplKQorCQkJYXRvbWljX2RlYygmc2V0LT5uZWxlbXMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlleHQgPSBuZnRfc2V0X2VsZW1fZXh0KHNldCwgZWxlbSk7CisJaWYgKHByaXYtPmV4cHIgIT0gTlVMTCkKKwkJbmZ0X2V4cHJfY2xvbmUobmZ0X3NldF9leHRfZXhwcihleHQpLCBwcml2LT5leHByKTsKKworCXJldHVybiBlbGVtOworfQorCitzdGF0aWMgdm9pZCBuZnRfZHluc2V0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAorCQkJICAgIHN0cnVjdCBuZnRfcmVncyAqcmVncywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKK3sKKwljb25zdCBzdHJ1Y3QgbmZ0X2R5bnNldCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJc3RydWN0IG5mdF9zZXQgKnNldCA9IHByaXYtPnNldDsKKwljb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dDsKKwljb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKnNleHByOworCXU2NCB0aW1lb3V0OworCisJaWYgKHNldC0+b3BzLT51cGRhdGUoc2V0LCAmcmVncy0+ZGF0YVtwcml2LT5zcmVnX2tleV0sIG5mdF9keW5zZXRfbmV3LAorCQkJICAgICBleHByLCByZWdzLCAmZXh0KSkgeworCQlzZXhwciA9IE5VTEw7CisJCWlmIChuZnRfc2V0X2V4dF9leGlzdHMoZXh0LCBORlRfU0VUX0VYVF9FWFBSKSkKKwkJCXNleHByID0gbmZ0X3NldF9leHRfZXhwcihleHQpOworCisJCWlmIChwcml2LT5vcCA9PSBORlRfRFlOU0VUX09QX1VQREFURSAmJgorCQkgICAgbmZ0X3NldF9leHRfZXhpc3RzKGV4dCwgTkZUX1NFVF9FWFRfRVhQSVJBVElPTikpIHsKKwkJCXRpbWVvdXQgPSBwcml2LT50aW1lb3V0ID8gOiBzZXQtPnRpbWVvdXQ7CisJCQkqbmZ0X3NldF9leHRfZXhwaXJhdGlvbihleHQpID0gamlmZmllcyArIHRpbWVvdXQ7CisJCX0gZWxzZSBpZiAoc2V4cHIgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCisJCWlmIChzZXhwciAhPSBOVUxMKQorCQkJc2V4cHItPm9wcy0+ZXZhbChzZXhwciwgcmVncywgcGt0KTsKKwkJcmV0dXJuOworCX0KK291dDoKKwlyZWdzLT52ZXJkaWN0LmNvZGUgPSBORlRfQlJFQUs7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBuZnRfZHluc2V0X3BvbGljeVtORlRBX0RZTlNFVF9NQVggKyAxXSA9IHsKKwlbTkZUQV9EWU5TRVRfU0VUX05BTUVdCT0geyAudHlwZSA9IE5MQV9TVFJJTkcgfSwKKwlbTkZUQV9EWU5TRVRfU0VUX0lEXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfRFlOU0VUX09QXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfRFlOU0VUX1NSRUdfS0VZXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW05GVEFfRFlOU0VUX1NSRUdfREFUQV0JPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORlRBX0RZTlNFVF9USU1FT1VUXQk9IHsgLnR5cGUgPSBOTEFfVTY0IH0sCisJW05GVEFfRFlOU0VUX0VYUFJdCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKK307CisKK3N0YXRpYyBpbnQgbmZ0X2R5bnNldF9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCisJCQkgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwlzdHJ1Y3QgbmZ0X2R5bnNldCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJc3RydWN0IG5mdF9zZXQgKnNldDsKKwl1NjQgdGltZW91dDsKKwlpbnQgZXJyOworCisJaWYgKHRiW05GVEFfRFlOU0VUX1NFVF9OQU1FXSA9PSBOVUxMIHx8CisJICAgIHRiW05GVEFfRFlOU0VUX09QXSA9PSBOVUxMIHx8CisJICAgIHRiW05GVEFfRFlOU0VUX1NSRUdfS0VZXSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNldCA9IG5mX3RhYmxlc19zZXRfbG9va3VwKGN0eC0+dGFibGUsIHRiW05GVEFfRFlOU0VUX1NFVF9OQU1FXSk7CisJaWYgKElTX0VSUihzZXQpKSB7CisJCWlmICh0YltORlRBX0RZTlNFVF9TRVRfSURdKQorCQkJc2V0ID0gbmZfdGFibGVzX3NldF9sb29rdXBfYnlpZChjdHgtPm5ldCwKKwkJCQkJCQl0YltORlRBX0RZTlNFVF9TRVRfSURdKTsKKwkJaWYgKElTX0VSUihzZXQpKQorCQkJcmV0dXJuIFBUUl9FUlIoc2V0KTsKKwl9CisKKwlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfQ09OU1RBTlQpCisJCXJldHVybiAtRUJVU1k7CisKKwlwcml2LT5vcCA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0RZTlNFVF9PUF0pKTsKKwlzd2l0Y2ggKHByaXYtPm9wKSB7CisJY2FzZSBORlRfRFlOU0VUX09QX0FERDoKKwkJYnJlYWs7CisJY2FzZSBORlRfRFlOU0VUX09QX1VQREFURToKKwkJaWYgKCEoc2V0LT5mbGFncyAmIE5GVF9TRVRfVElNRU9VVCkpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwl0aW1lb3V0ID0gMDsKKwlpZiAodGJbTkZUQV9EWU5TRVRfVElNRU9VVF0gIT0gTlVMTCkgeworCQlpZiAoIShzZXQtPmZsYWdzICYgTkZUX1NFVF9USU1FT1VUKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl0aW1lb3V0ID0gYmU2NF90b19jcHUobmxhX2dldF9iZTY0KHRiW05GVEFfRFlOU0VUX1RJTUVPVVRdKSk7CisJfQorCisJcHJpdi0+c3JlZ19rZXkgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9EWU5TRVRfU1JFR19LRVldKTsKKwllcnIgPSBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZChwcml2LT5zcmVnX2tleSwgc2V0LT5rbGVuKTs7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlpZiAodGJbTkZUQV9EWU5TRVRfU1JFR19EQVRBXSAhPSBOVUxMKSB7CisJCWlmICghKHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHNldC0+ZHR5cGUgPT0gTkZUX0RBVEFfVkVSRElDVCkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCQlwcml2LT5zcmVnX2RhdGEgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9EWU5TRVRfU1JFR19EQVRBXSk7CisJCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWdfZGF0YSwgc2V0LT5kbGVuKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0gZWxzZSBpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh0YltORlRBX0RZTlNFVF9FWFBSXSAhPSBOVUxMKSB7CisJCWlmICghKHNldC0+ZmxhZ3MgJiBORlRfU0VUX0VWQUwpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghKHNldC0+ZmxhZ3MgJiBORlRfU0VUX0FOT05ZTU9VUykpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwkJcHJpdi0+ZXhwciA9IG5mdF9leHByX2luaXQoY3R4LCB0YltORlRBX0RZTlNFVF9FWFBSXSk7CisJCWlmIChJU19FUlIocHJpdi0+ZXhwcikpCisJCQlyZXR1cm4gUFRSX0VSUihwcml2LT5leHByKTsKKworCQllcnIgPSAtRU9QTk9UU1VQUDsKKwkJaWYgKCEocHJpdi0+ZXhwci0+b3BzLT50eXBlLT5mbGFncyAmIE5GVF9FWFBSX1NUQVRFRlVMKSkKKwkJCWdvdG8gZXJyMTsKKwl9IGVsc2UgaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX0VWQUwpCisJCXJldHVybiAtRUlOVkFMOworCisJbmZ0X3NldF9leHRfcHJlcGFyZSgmcHJpdi0+dG1wbCk7CisJbmZ0X3NldF9leHRfYWRkX2xlbmd0aCgmcHJpdi0+dG1wbCwgTkZUX1NFVF9FWFRfS0VZLCBzZXQtPmtsZW4pOworCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVApCisJCW5mdF9zZXRfZXh0X2FkZF9sZW5ndGgoJnByaXYtPnRtcGwsIE5GVF9TRVRfRVhUX0RBVEEsIHNldC0+ZGxlbik7CisJaWYgKHByaXYtPmV4cHIgIT0gTlVMTCkKKwkJbmZ0X3NldF9leHRfYWRkX2xlbmd0aCgmcHJpdi0+dG1wbCwgTkZUX1NFVF9FWFRfRVhQUiwKKwkJCQkgICAgICAgcHJpdi0+ZXhwci0+b3BzLT5zaXplKTsKKwlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfVElNRU9VVCkgeworCQlpZiAodGltZW91dCB8fCBzZXQtPnRpbWVvdXQpCisJCQluZnRfc2V0X2V4dF9hZGQoJnByaXYtPnRtcGwsIE5GVF9TRVRfRVhUX0VYUElSQVRJT04pOworCX0KKworCXByaXYtPnRpbWVvdXQgPSB0aW1lb3V0OworCisJZXJyID0gbmZfdGFibGVzX2JpbmRfc2V0KGN0eCwgc2V0LCAmcHJpdi0+YmluZGluZyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyMTsKKworCXByaXYtPnNldCA9IHNldDsKKwlyZXR1cm4gMDsKKworZXJyMToKKwlpZiAocHJpdi0+ZXhwciAhPSBOVUxMKQorCQluZnRfZXhwcl9kZXN0cm95KGN0eCwgcHJpdi0+ZXhwcik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgbmZ0X2R5bnNldF9kZXN0cm95KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKQoreworCXN0cnVjdCBuZnRfZHluc2V0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKworCW5mX3RhYmxlc191bmJpbmRfc2V0KGN0eCwgcHJpdi0+c2V0LCAmcHJpdi0+YmluZGluZyk7CisJaWYgKHByaXYtPmV4cHIgIT0gTlVMTCkKKwkJbmZ0X2V4cHJfZGVzdHJveShjdHgsIHByaXYtPmV4cHIpOworfQorCitzdGF0aWMgaW50IG5mdF9keW5zZXRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9keW5zZXQgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOworCisJaWYgKG5mdF9kdW1wX3JlZ2lzdGVyKHNrYiwgTkZUQV9EWU5TRVRfU1JFR19LRVksIHByaXYtPnNyZWdfa2V5KSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKHByaXYtPnNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCAmJgorCSAgICBuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfRFlOU0VUX1NSRUdfREFUQSwgcHJpdi0+c3JlZ19kYXRhKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfRFlOU0VUX09QLCBodG9ubChwcml2LT5vcCkpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlpZiAobmxhX3B1dF9zdHJpbmcoc2tiLCBORlRBX0RZTlNFVF9TRVRfTkFNRSwgcHJpdi0+c2V0LT5uYW1lKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKG5sYV9wdXRfYmU2NChza2IsIE5GVEFfRFlOU0VUX1RJTUVPVVQsIGNwdV90b19iZTY0KHByaXYtPnRpbWVvdXQpKSkKKwkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJaWYgKHByaXYtPmV4cHIgJiYgbmZ0X2V4cHJfZHVtcChza2IsIE5GVEFfRFlOU0VUX0VYUFIsIHByaXYtPmV4cHIpKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlyZXR1cm4gMDsKKworbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKworc3RhdGljIHN0cnVjdCBuZnRfZXhwcl90eXBlIG5mdF9keW5zZXRfdHlwZTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHJfb3BzIG5mdF9keW5zZXRfb3BzID0geworCS50eXBlCQk9ICZuZnRfZHluc2V0X3R5cGUsCisJLnNpemUJCT0gTkZUX0VYUFJfU0laRShzaXplb2Yoc3RydWN0IG5mdF9keW5zZXQpKSwKKwkuZXZhbAkJPSBuZnRfZHluc2V0X2V2YWwsCisJLmluaXQJCT0gbmZ0X2R5bnNldF9pbml0LAorCS5kZXN0cm95CT0gbmZ0X2R5bnNldF9kZXN0cm95LAorCS5kdW1wCQk9IG5mdF9keW5zZXRfZHVtcCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfZHluc2V0X3R5cGUgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAiZHluc2V0IiwKKwkub3BzCQk9ICZuZnRfZHluc2V0X29wcywKKwkucG9saWN5CQk9IG5mdF9keW5zZXRfcG9saWN5LAorCS5tYXhhdHRyCT0gTkZUQV9EWU5TRVRfTUFYLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK2ludCBfX2luaXQgbmZ0X2R5bnNldF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXJldHVybiBuZnRfcmVnaXN0ZXJfZXhwcigmbmZ0X2R5bnNldF90eXBlKTsKK30KKwordm9pZCBuZnRfZHluc2V0X21vZHVsZV9leGl0KHZvaWQpCit7CisJbmZ0X3VucmVnaXN0ZXJfZXhwcigmbmZ0X2R5bnNldF90eXBlKTsKK30KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2V4cHJfdGVtcGxhdGUuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2V4cHJfdGVtcGxhdGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlZWQ0ZC4uMDAwMDAwMAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9leHByX3RlbXBsYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMDkgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBEZXZlbG9wbWVudCBvZiB0aGlzIGNvZGUgZnVuZGVkIGJ5IEFzdGFybyBBRyAoaHR0cDovL3d3dy5hc3Rhcm8uY29tLykKLSAqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZfdGFibGVzLmg+Ci0jaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KLQotc3RydWN0IG5mdF90ZW1wbGF0ZSB7Ci0KLX07Ci0KLXN0YXRpYyB2b2lkIG5mdF90ZW1wbGF0ZV9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKLQkJCSAgICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKLXsKLQlzdHJ1Y3QgbmZ0X3RlbXBsYXRlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKLQotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZ0X3RlbXBsYXRlX3BvbGljeVtORlRBX1RFTVBMQVRFX01BWCArIDFdID0gewotCVtORlRBX1RFTVBMQVRFX0FUVFJdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCi19OwotCi1zdGF0aWMgaW50IG5mdF90ZW1wbGF0ZV9pbml0KGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCi0JCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKLXsKLQlzdHJ1Y3QgbmZ0X3RlbXBsYXRlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBuZnRfdGVtcGxhdGVfZGVzdHJveShjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKLXsKLQlzdHJ1Y3QgbmZ0X3RlbXBsYXRlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKLQotfQotCi1zdGF0aWMgaW50IG5mdF90ZW1wbGF0ZV9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwcikKLXsKLQljb25zdCBzdHJ1Y3QgbmZ0X3RlbXBsYXRlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKLQotCU5MQV9QVVRfQkUzMihza2IsIE5GVEFfVEVNUExBVEVfQVRUUiwgcHJpdi0+ZmllbGQpOwotCXJldHVybiAwOwotCi1ubGFfcHV0X2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgc3RydWN0IG5mdF9leHByX3R5cGUgbmZ0X3RlbXBsYXRlX3R5cGU7Ci1zdGF0aWMgY29uc3Qgc3RydWN0IG5mdF9leHByX29wcyBuZnRfdGVtcGxhdGVfb3BzID0gewotCS50eXBlCQk9ICZuZnRfdGVtcGxhdGVfdHlwZSwKLQkuc2l6ZQkJPSBORlRfRVhQUl9TSVpFKHNpemVvZihzdHJ1Y3QgbmZ0X3RlbXBsYXRlKSksCi0JLmV2YWwJCT0gbmZ0X3RlbXBsYXRlX2V2YWwsCi0JLmluaXQJCT0gbmZ0X3RlbXBsYXRlX2luaXQsCi0JLmRlc3Ryb3kJPSBuZnRfdGVtcGxhdGVfZGVzdHJveSwKLQkuZHVtcAkJPSBuZnRfdGVtcGxhdGVfZHVtcCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbmZ0X2V4cHJfdHlwZSBuZnRfdGVtcGxhdGVfdHlwZSBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lCQk9ICJ0ZW1wbGF0ZSIsCi0JLm9wcwkJPSAmbmZ0X3RlbXBsYXRlX29wcywKLQkucG9saWN5CQk9IG5mdF90ZW1wbGF0ZV9wb2xpY3ksCi0JLm1heGF0dHIJPSBORlRBX1RFTVBMQVRFX01BWCwKLQkub3duZXIJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBuZnRfdGVtcGxhdGVfbW9kdWxlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gbmZ0X3JlZ2lzdGVyX2V4cHIoJm5mdF90ZW1wbGF0ZV90eXBlKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG5mdF90ZW1wbGF0ZV9tb2R1bGVfZXhpdCh2b2lkKQotewotCW5mdF91bnJlZ2lzdGVyX2V4cHIoJm5mdF90ZW1wbGF0ZV90eXBlKTsKLX0KLQotbW9kdWxlX2luaXQobmZ0X3RlbXBsYXRlX21vZHVsZV9pbml0KTsKLW1vZHVsZV9leGl0KG5mdF90ZW1wbGF0ZV9tb2R1bGVfZXhpdCk7Ci0KLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BVVRIT1IoIlBhdHJpY2sgTWNIYXJkeSA8a2FiZXJAdHJhc2gubmV0PiIpOwotTU9EVUxFX0FMSUFTX05GVF9FWFBSKCJ0ZW1wbGF0ZSIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfZXh0aGRyLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9leHRoZHIuYwppbmRleCA1NWM5MzlmLi5iYTdhZWQxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9leHRoZHIuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9leHRoZHIuYwpAQCAtMjYsMTEgKzI2LDExIEBACiB9OwogCiBzdGF0aWMgdm9pZCBuZnRfZXh0aGRyX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCXN0cnVjdCBuZnRfZXh0aGRyICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKLQlzdHJ1Y3QgbmZ0X2RhdGEgKmRlc3QgPSAmZGF0YVtwcml2LT5kcmVnXTsKKwl1MzIgKmRlc3QgPSAmcmVncy0+ZGF0YVtwcml2LT5kcmVnXTsKIAl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKIAlpbnQgZXJyOwogCkBAIC0zOSwxMSArMzksMTIgQEAKIAkJZ290byBlcnI7CiAJb2Zmc2V0ICs9IHByaXYtPm9mZnNldDsKIAotCWlmIChza2JfY29weV9iaXRzKHBrdC0+c2tiLCBvZmZzZXQsIGRlc3QtPmRhdGEsIHByaXYtPmxlbikgPCAwKQorCWRlc3RbcHJpdi0+bGVuIC8gTkZUX1JFRzMyX1NJWkVdID0gMDsKKwlpZiAoc2tiX2NvcHlfYml0cyhwa3QtPnNrYiwgb2Zmc2V0LCBkZXN0LCBwcml2LT5sZW4pIDwgMCkKIAkJZ290byBlcnI7CiAJcmV0dXJuOwogZXJyOgotCWRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0ID0gTkZUX0JSRUFLOworCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9leHRoZHJfcG9saWN5W05GVEFfRVhUSERSX01BWCArIDFdID0gewpAQCAtNTgsNyArNTksNiBAQAogCQkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7CiAJc3RydWN0IG5mdF9leHRoZHIgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwotCWludCBlcnI7CiAKIAlpZiAodGJbTkZUQV9FWFRIRFJfRFJFR10gPT0gTlVMTCB8fAogCSAgICB0YltORlRBX0VYVEhEUl9UWVBFXSA9PSBOVUxMIHx8CkBAIC02OSwyMiArNjksMTcgQEAKIAlwcml2LT50eXBlICAgPSBubGFfZ2V0X3U4KHRiW05GVEFfRVhUSERSX1RZUEVdKTsKIAlwcml2LT5vZmZzZXQgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9FWFRIRFJfT0ZGU0VUXSkpOwogCXByaXYtPmxlbiAgICA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0VYVEhEUl9MRU5dKSk7Ci0JaWYgKHByaXYtPmxlbiA9PSAwIHx8Ci0JICAgIHByaXYtPmxlbiA+IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZ0X2RhdGEsIGRhdGEpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlwcml2LT5kcmVnICAgPSBuZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9FWFRIRFJfRFJFR10pOwogCi0JcHJpdi0+ZHJlZyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0VYVEhEUl9EUkVHXSkpOwotCWVyciA9IG5mdF92YWxpZGF0ZV9vdXRwdXRfcmVnaXN0ZXIocHJpdi0+ZHJlZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIG5mdF92YWxpZGF0ZV9kYXRhX2xvYWQoY3R4LCBwcml2LT5kcmVnLCBOVUxMLCBORlRfREFUQV9WQUxVRSk7CisJcmV0dXJuIG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9zdG9yZShjdHgsIHByaXYtPmRyZWcsIE5VTEwsCisJCQkJCSAgIE5GVF9EQVRBX1ZBTFVFLCBwcml2LT5sZW4pOwogfQogCiBzdGF0aWMgaW50IG5mdF9leHRoZHJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9leHRoZHIgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwogCi0JaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfRVhUSERSX0RSRUcsIGh0b25sKHByaXYtPmRyZWcpKSkKKwlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX0VYVEhEUl9EUkVHLCBwcml2LT5kcmVnKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJaWYgKG5sYV9wdXRfdTgoc2tiLCBORlRBX0VYVEhEUl9UWVBFLCBwcml2LT50eXBlKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9oYXNoLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9oYXNoLmMKaW5kZXggYzgyZGYwYS4uM2Y5ZDQ1ZCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfaGFzaC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2hhc2guYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KICNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9yaGFzaHRhYmxlLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX3RhYmxlcy5oPgpAQCAtMjMsMTE5ICsyNCwxNzUgQEAKIC8qIFdlIHRhcmdldCBhIGhhc2ggdGFibGUgc2l6ZSBvZiA0LCBlbGVtZW50IGhpbnQgaXMgNzUlIG9mIGZpbmFsIHNpemUgKi8KICNkZWZpbmUgTkZUX0hBU0hfRUxFTUVOVF9ISU5UIDMKIAotc3RydWN0IG5mdF9oYXNoX2VsZW0gewotCXN0cnVjdCByaGFzaF9oZWFkCQlub2RlOwotCXN0cnVjdCBuZnRfZGF0YQkJCWtleTsKLQlzdHJ1Y3QgbmZ0X2RhdGEJCQlkYXRhW107CitzdHJ1Y3QgbmZ0X2hhc2ggeworCXN0cnVjdCByaGFzaHRhYmxlCQlodDsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQlnY193b3JrOwogfTsKIAotc3RhdGljIGJvb2wgbmZ0X2hhc2hfbG9va3VwKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkgICAgY29uc3Qgc3RydWN0IG5mdF9kYXRhICprZXksCi0JCQkgICAgc3RydWN0IG5mdF9kYXRhICpkYXRhKQotewotCXN0cnVjdCByaGFzaHRhYmxlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0JY29uc3Qgc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworc3RydWN0IG5mdF9oYXNoX2VsZW0geworCXN0cnVjdCByaGFzaF9oZWFkCQlub2RlOworCXN0cnVjdCBuZnRfc2V0X2V4dAkJZXh0OworfTsKIAotCWhlID0gcmhhc2h0YWJsZV9sb29rdXAocHJpdiwga2V5KTsKLQlpZiAoaGUgJiYgc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQKQotCQluZnRfZGF0YV9jb3B5KGRhdGEsIGhlLT5kYXRhKTsKK3N0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIHsKKwljb25zdCBzdHJ1Y3QgbmZ0X3NldAkJKnNldDsKKwljb25zdCB1MzIJCQkqa2V5OworCXU4CQkJCWdlbm1hc2s7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIG5mdF9oYXNoX3BhcmFtczsKKworc3RhdGljIGlubGluZSB1MzIgbmZ0X2hhc2hfa2V5KGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBsZW4sIHUzMiBzZWVkKQoreworCWNvbnN0IHN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnICphcmcgPSBkYXRhOworCisJcmV0dXJuIGpoYXNoKGFyZy0+a2V5LCBsZW4sIHNlZWQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBuZnRfaGFzaF9vYmooY29uc3Qgdm9pZCAqZGF0YSwgdTMyIGxlbiwgdTMyIHNlZWQpCit7CisJY29uc3Qgc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlID0gZGF0YTsKKworCXJldHVybiBqaGFzaChuZnRfc2V0X2V4dF9rZXkoJmhlLT5leHQpLCBsZW4sIHNlZWQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBuZnRfaGFzaF9jbXAoc3RydWN0IHJoYXNodGFibGVfY29tcGFyZV9hcmcgKmFyZywKKwkJCSAgICAgICBjb25zdCB2b2lkICpwdHIpCit7CisJY29uc3Qgc3RydWN0IG5mdF9oYXNoX2NtcF9hcmcgKnggPSBhcmctPmtleTsKKwljb25zdCBzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGUgPSBwdHI7CisKKwlpZiAobWVtY21wKG5mdF9zZXRfZXh0X2tleSgmaGUtPmV4dCksIHgtPmtleSwgeC0+c2V0LT5rbGVuKSkKKwkJcmV0dXJuIDE7CisJaWYgKG5mdF9zZXRfZWxlbV9leHBpcmVkKCZoZS0+ZXh0KSkKKwkJcmV0dXJuIDE7CisJaWYgKCFuZnRfc2V0X2VsZW1fYWN0aXZlKCZoZS0+ZXh0LCB4LT5nZW5tYXNrKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIG5mdF9oYXNoX2xvb2t1cChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LCBjb25zdCB1MzIgKmtleSwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKipleHQpCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJY29uc3Qgc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKKwkJLmdlbm1hc2sgPSBuZnRfZ2VubWFza19jdXIocmVhZF9wbmV0KCZzZXQtPnBuZXQpKSwKKwkJLnNldAkgPSBzZXQsCisJCS5rZXkJID0ga2V5LAorCX07CisKKwloZSA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJnByaXYtPmh0LCAmYXJnLCBuZnRfaGFzaF9wYXJhbXMpOworCWlmIChoZSAhPSBOVUxMKQorCQkqZXh0ID0gJmhlLT5leHQ7CiAKIAlyZXR1cm4gISFoZTsKIH0KIAorc3RhdGljIGJvb2wgbmZ0X2hhc2hfdXBkYXRlKHN0cnVjdCBuZnRfc2V0ICpzZXQsIGNvbnN0IHUzMiAqa2V5LAorCQkJICAgIHZvaWQgKigqbmV3KShzdHJ1Y3QgbmZ0X3NldCAqLAorCQkJCQkgY29uc3Qgc3RydWN0IG5mdF9leHByICosCisJCQkJCSBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MpLAorCQkJICAgIGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKKwkJCSAgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCisJCQkgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQoreworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKKwlzdHJ1Y3QgbmZ0X2hhc2hfY21wX2FyZyBhcmcgPSB7CisJCS5nZW5tYXNrID0gTkZUX0dFTk1BU0tfQU5ZLAorCQkuc2V0CSA9IHNldCwKKwkJLmtleQkgPSBrZXksCisJfTsKKworCWhlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmcHJpdi0+aHQsICZhcmcsIG5mdF9oYXNoX3BhcmFtcyk7CisJaWYgKGhlICE9IE5VTEwpCisJCWdvdG8gb3V0OworCisJaGUgPSBuZXcoc2V0LCBleHByLCByZWdzKTsKKwlpZiAoaGUgPT0gTlVMTCkKKwkJZ290byBlcnIxOworCWlmIChyaGFzaHRhYmxlX2xvb2t1cF9pbnNlcnRfa2V5KCZwcml2LT5odCwgJmFyZywgJmhlLT5ub2RlLAorCQkJCQkgbmZ0X2hhc2hfcGFyYW1zKSkKKwkJZ290byBlcnIyOworb3V0OgorCSpleHQgPSAmaGUtPmV4dDsKKwlyZXR1cm4gdHJ1ZTsKKworZXJyMjoKKwluZnRfc2V0X2VsZW1fZGVzdHJveShzZXQsIGhlKTsKK2VycjE6CisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgaW50IG5mdF9oYXNoX2luc2VydChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAogCQkJICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKIHsKLQlzdHJ1Y3Qgcmhhc2h0YWJsZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKKwlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGUgPSBlbGVtLT5wcml2OworCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKKwkJLmdlbm1hc2sgPSBuZnRfZ2VubWFza19uZXh0KHJlYWRfcG5ldCgmc2V0LT5wbmV0KSksCisJCS5zZXQJID0gc2V0LAorCQkua2V5CSA9IGVsZW0tPmtleS52YWwuZGF0YSwKKwl9OwogCi0JaWYgKGVsZW0tPmZsYWdzICE9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc2l6ZSA9IHNpemVvZigqaGUpOwotCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVApCi0JCXNpemUgKz0gc2l6ZW9mKGhlLT5kYXRhWzBdKTsKLQotCWhlID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoaGUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQluZnRfZGF0YV9jb3B5KCZoZS0+a2V5LCAmZWxlbS0+a2V5KTsKLQlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQKQotCQluZnRfZGF0YV9jb3B5KGhlLT5kYXRhLCAmZWxlbS0+ZGF0YSk7Ci0KLQlyaGFzaHRhYmxlX2luc2VydChwcml2LCAmaGUtPm5vZGUpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJoYXNodGFibGVfbG9va3VwX2luc2VydF9rZXkoJnByaXYtPmh0LCAmYXJnLCAmaGUtPm5vZGUsCisJCQkJCSAgICBuZnRfaGFzaF9wYXJhbXMpOwogfQogCi1zdGF0aWMgdm9pZCBuZnRfaGFzaF9lbGVtX2Rlc3Ryb3koY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKLQkJCQkgIHN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSkKK3N0YXRpYyB2b2lkIG5mdF9oYXNoX2FjdGl2YXRlKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQogewotCW5mdF9kYXRhX3VuaW5pdCgmaGUtPmtleSwgTkZUX0RBVEFfVkFMVUUpOwotCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVApCi0JCW5mdF9kYXRhX3VuaW5pdChoZS0+ZGF0YSwgc2V0LT5kdHlwZSk7Ci0Ja2ZyZWUoaGUpOworCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZSA9IGVsZW0tPnByaXY7CisKKwluZnRfc2V0X2VsZW1fY2hhbmdlX2FjdGl2ZShzZXQsICZoZS0+ZXh0KTsKKwluZnRfc2V0X2VsZW1fY2xlYXJfYnVzeSgmaGUtPmV4dCk7Cit9CisKK3N0YXRpYyB2b2lkICpuZnRfaGFzaF9kZWFjdGl2YXRlKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJIGNvbnN0IHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCit7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCBuZnRfaGFzaF9jbXBfYXJnIGFyZyA9IHsKKwkJLmdlbm1hc2sgPSBuZnRfZ2VubWFza19uZXh0KHJlYWRfcG5ldCgmc2V0LT5wbmV0KSksCisJCS5zZXQJID0gc2V0LAorCQkua2V5CSA9IGVsZW0tPmtleS52YWwuZGF0YSwKKwl9OworCisJcmN1X3JlYWRfbG9jaygpOworCWhlID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmcHJpdi0+aHQsICZhcmcsIG5mdF9oYXNoX3BhcmFtcyk7CisJaWYgKGhlICE9IE5VTEwpIHsKKwkJaWYgKCFuZnRfc2V0X2VsZW1fbWFya19idXN5KCZoZS0+ZXh0KSkKKwkJCW5mdF9zZXRfZWxlbV9jaGFuZ2VfYWN0aXZlKHNldCwgJmhlLT5leHQpOworCQllbHNlCisJCQloZSA9IE5VTEw7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIGhlOwogfQogCiBzdGF0aWMgdm9pZCBuZnRfaGFzaF9yZW1vdmUoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQogewotCXN0cnVjdCByaGFzaHRhYmxlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9oYXNoICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlID0gZWxlbS0+cHJpdjsKIAotCXJoYXNodGFibGVfcmVtb3ZlKHByaXYsIGVsZW0tPmNvb2tpZSk7Ci0Jc3luY2hyb25pemVfcmN1KCk7Ci0Ja2ZyZWUoZWxlbS0+Y29va2llKTsKLX0KLQotc3RydWN0IG5mdF9jb21wYXJlX2FyZyB7Ci0JY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldDsKLQlzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtOwotfTsKLQotc3RhdGljIGJvb2wgbmZ0X2hhc2hfY29tcGFyZSh2b2lkICpwdHIsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSAqaGUgPSBwdHI7Ci0Jc3RydWN0IG5mdF9jb21wYXJlX2FyZyAqeCA9IGFyZzsKLQotCWlmICghbmZ0X2RhdGFfY21wKCZoZS0+a2V5LCAmeC0+ZWxlbS0+a2V5LCB4LT5zZXQtPmtsZW4pKSB7Ci0JCXgtPmVsZW0tPmNvb2tpZSA9IGhlOwotCQl4LT5lbGVtLT5mbGFncyA9IDA7Ci0JCWlmICh4LT5zZXQtPmZsYWdzICYgTkZUX1NFVF9NQVApCi0JCQluZnRfZGF0YV9jb3B5KCZ4LT5lbGVtLT5kYXRhLCBoZS0+ZGF0YSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgaW50IG5mdF9oYXNoX2dldChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQotewotCXN0cnVjdCByaGFzaHRhYmxlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0Jc3RydWN0IG5mdF9jb21wYXJlX2FyZyBhcmcgPSB7Ci0JCS5zZXQgPSBzZXQsCi0JCS5lbGVtID0gZWxlbSwKLQl9OwotCi0JaWYgKHJoYXNodGFibGVfbG9va3VwX2NvbXBhcmUocHJpdiwgJmVsZW0tPmtleSwKLQkJCQkgICAgICAmbmZ0X2hhc2hfY29tcGFyZSwgJmFyZykpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIC1FTk9FTlQ7CisJcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmcHJpdi0+aHQsICZoZS0+bm9kZSwgbmZ0X2hhc2hfcGFyYW1zKTsKIH0KIAogc3RhdGljIHZvaWQgbmZ0X2hhc2hfd2Fsayhjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LCBjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAogCQkJICBzdHJ1Y3QgbmZ0X3NldF9pdGVyICppdGVyKQogewotCXN0cnVjdCByaGFzaHRhYmxlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0JY29uc3Qgc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKIAlzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyIGh0aTsKIAlzdHJ1Y3QgbmZ0X3NldF9lbGVtIGVsZW07CisJdTggZ2VubWFzayA9IG5mdF9nZW5tYXNrX2N1cihyZWFkX3BuZXQoJnNldC0+cG5ldCkpOwogCWludCBlcnI7CiAKLQllcnIgPSByaGFzaHRhYmxlX3dhbGtfaW5pdChwcml2LCAmaHRpKTsKKwllcnIgPSByaGFzaHRhYmxlX3dhbGtfaW5pdCgmcHJpdi0+aHQsICZodGkpOwogCWl0ZXItPmVyciA9IGVycjsKIAlpZiAoZXJyKQogCQlyZXR1cm47CkBAIC0xNTMsMTUgKzIxMCwxOCBAQAogCQkJCWl0ZXItPmVyciA9IGVycjsKIAkJCQlnb3RvIG91dDsKIAkJCX0KKworCQkJY29udGludWU7CiAJCX0KIAogCQlpZiAoaXRlci0+Y291bnQgPCBpdGVyLT5za2lwKQogCQkJZ290byBjb250OworCQlpZiAobmZ0X3NldF9lbGVtX2V4cGlyZWQoJmhlLT5leHQpKQorCQkJZ290byBjb250OworCQlpZiAoIW5mdF9zZXRfZWxlbV9hY3RpdmUoJmhlLT5leHQsIGdlbm1hc2spKQorCQkJZ290byBjb250OwogCi0JCW1lbWNweSgmZWxlbS5rZXksICZoZS0+a2V5LCBzaXplb2YoZWxlbS5rZXkpKTsKLQkJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCkKLQkJCW1lbWNweSgmZWxlbS5kYXRhLCBoZS0+ZGF0YSwgc2l6ZW9mKGVsZW0uZGF0YSkpOwotCQllbGVtLmZsYWdzID0gMDsKKwkJZWxlbS5wcml2ID0gaGU7CiAKIAkJaXRlci0+ZXJyID0gaXRlci0+Zm4oY3R4LCBzZXQsIGl0ZXIsICZlbGVtKTsKIAkJaWYgKGl0ZXItPmVyciA8IDApCkBAIC0xNzYsNDcgKzIzNiwxMDIgQEAKIAlyaGFzaHRhYmxlX3dhbGtfZXhpdCgmaHRpKTsKIH0KIAorc3RhdGljIHZvaWQgbmZ0X2hhc2hfZ2Moc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBuZnRfc2V0ICpzZXQ7CisJc3RydWN0IG5mdF9oYXNoX2VsZW0gKmhlOworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdjsKKwlzdHJ1Y3QgbmZ0X3NldF9nY19iYXRjaCAqZ2NiID0gTlVMTDsKKwlzdHJ1Y3Qgcmhhc2h0YWJsZV9pdGVyIGh0aTsKKwlpbnQgZXJyOworCisJcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmZ0X2hhc2gsIGdjX3dvcmsud29yayk7CisJc2V0ICA9IG5mdF9zZXRfY29udGFpbmVyX29mKHByaXYpOworCisJZXJyID0gcmhhc2h0YWJsZV93YWxrX2luaXQoJnByaXYtPmh0LCAmaHRpKTsKKwlpZiAoZXJyKQorCQlnb3RvIHNjaGVkdWxlOworCisJZXJyID0gcmhhc2h0YWJsZV93YWxrX3N0YXJ0KCZodGkpOworCWlmIChlcnIgJiYgZXJyICE9IC1FQUdBSU4pCisJCWdvdG8gb3V0OworCisJd2hpbGUgKChoZSA9IHJoYXNodGFibGVfd2Fsa19uZXh0KCZodGkpKSkgeworCQlpZiAoSVNfRVJSKGhlKSkgeworCQkJaWYgKFBUUl9FUlIoaGUpICE9IC1FQUdBSU4pCisJCQkJZ290byBvdXQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghbmZ0X3NldF9lbGVtX2V4cGlyZWQoJmhlLT5leHQpKQorCQkJY29udGludWU7CisJCWlmIChuZnRfc2V0X2VsZW1fbWFya19idXN5KCZoZS0+ZXh0KSkKKwkJCWNvbnRpbnVlOworCisJCWdjYiA9IG5mdF9zZXRfZ2NfYmF0Y2hfY2hlY2soc2V0LCBnY2IsIEdGUF9BVE9NSUMpOworCQlpZiAoZ2NiID09IE5VTEwpCisJCQlnb3RvIG91dDsKKwkJcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmcHJpdi0+aHQsICZoZS0+bm9kZSwgbmZ0X2hhc2hfcGFyYW1zKTsKKwkJYXRvbWljX2RlYygmc2V0LT5uZWxlbXMpOworCQluZnRfc2V0X2djX2JhdGNoX2FkZChnY2IsIGhlKTsKKwl9CitvdXQ6CisJcmhhc2h0YWJsZV93YWxrX3N0b3AoJmh0aSk7CisJcmhhc2h0YWJsZV93YWxrX2V4aXQoJmh0aSk7CisKKwluZnRfc2V0X2djX2JhdGNoX2NvbXBsZXRlKGdjYik7CitzY2hlZHVsZToKKwlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwgJnByaXYtPmdjX3dvcmssCisJCQkgICBuZnRfc2V0X2djX2ludGVydmFsKHNldCkpOworfQorCiBzdGF0aWMgdW5zaWduZWQgaW50IG5mdF9oYXNoX3ByaXZzaXplKGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCBubGFbXSkKIHsKLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCByaGFzaHRhYmxlKTsKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaCk7CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgbmZ0X2hhc2hfcGFyYW1zID0geworCS5oZWFkX29mZnNldAkJPSBvZmZzZXRvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSwgbm9kZSksCisJLmhhc2hmbgkJCT0gbmZ0X2hhc2hfa2V5LAorCS5vYmpfaGFzaGZuCQk9IG5mdF9oYXNoX29iaiwKKwkub2JqX2NtcGZuCQk9IG5mdF9oYXNoX2NtcCwKKwkuYXV0b21hdGljX3Nocmlua2luZwk9IHRydWUsCit9OworCiBzdGF0aWMgaW50IG5mdF9oYXNoX2luaXQoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKIAkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9kZXNjICpkZXNjLAogCQkJIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQogewotCXN0cnVjdCByaGFzaHRhYmxlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0Jc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcyA9IHsKLQkJLm5lbGVtX2hpbnQgPSBkZXNjLT5zaXplID8gOiBORlRfSEFTSF9FTEVNRU5UX0hJTlQsCi0JCS5oZWFkX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBuZnRfaGFzaF9lbGVtLCBub2RlKSwKLQkJLmtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSwga2V5KSwKLQkJLmtleV9sZW4gPSBzZXQtPmtsZW4sCi0JCS5oYXNoZm4gPSBqaGFzaCwKLQl9OworCXN0cnVjdCBuZnRfaGFzaCAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOworCXN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBwYXJhbXMgPSBuZnRfaGFzaF9wYXJhbXM7CisJaW50IGVycjsKIAotCXJldHVybiByaGFzaHRhYmxlX2luaXQocHJpdiwgJnBhcmFtcyk7CisJcGFyYW1zLm5lbGVtX2hpbnQgPSBkZXNjLT5zaXplID86IE5GVF9IQVNIX0VMRU1FTlRfSElOVDsKKwlwYXJhbXMua2V5X2xlbgkgID0gc2V0LT5rbGVuOworCisJZXJyID0gcmhhc2h0YWJsZV9pbml0KCZwcml2LT5odCwgJnBhcmFtcyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlJTklUX0RFRkVSUkFCTEVfV09SSygmcHJpdi0+Z2Nfd29yaywgbmZ0X2hhc2hfZ2MpOworCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9USU1FT1VUKQorCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwgJnByaXYtPmdjX3dvcmssCisJCQkJICAgbmZ0X3NldF9nY19pbnRlcnZhbChzZXQpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbmZ0X2hhc2hfZWxlbV9kZXN0cm95KHZvaWQgKnB0ciwgdm9pZCAqYXJnKQoreworCW5mdF9zZXRfZWxlbV9kZXN0cm95KChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqKWFyZywgcHRyKTsKIH0KIAogc3RhdGljIHZvaWQgbmZ0X2hhc2hfZGVzdHJveShjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0KQogewotCXN0cnVjdCByaGFzaHRhYmxlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7Ci0JY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOwotCXN0cnVjdCBuZnRfaGFzaF9lbGVtICpoZTsKLQlzdHJ1Y3Qgcmhhc2hfaGVhZCAqcG9zLCAqbmV4dDsKLQl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgbmZ0X2hhc2ggKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKIAotCS8qIFN0b3AgYW4gZXZlbnR1YWwgYXN5bmMgcmVzaXppbmcgKi8KLQlwcml2LT5iZWluZ19kZXN0cm95ZWQgPSB0cnVlOwotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCXRibCA9IHJodF9kZXJlZmVyZW5jZShwcml2LT50YmwsIHByaXYpOwotCWZvciAoaSA9IDA7IGkgPCB0YmwtPnNpemU7IGkrKykgewotCQlyaHRfZm9yX2VhY2hfZW50cnlfc2FmZShoZSwgcG9zLCBuZXh0LCB0YmwsIGksIG5vZGUpCi0JCQluZnRfaGFzaF9lbGVtX2Rlc3Ryb3koc2V0LCBoZSk7Ci0JfQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0Jcmhhc2h0YWJsZV9kZXN0cm95KHByaXYpOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+Z2Nfd29yayk7CisJcmhhc2h0YWJsZV9mcmVlX2FuZF9kZXN0cm95KCZwcml2LT5odCwgbmZ0X2hhc2hfZWxlbV9kZXN0cm95LAorCQkJCSAgICAodm9pZCAqKXNldCk7CiB9CiAKIHN0YXRpYyBib29sIG5mdF9oYXNoX2VzdGltYXRlKGNvbnN0IHN0cnVjdCBuZnRfc2V0X2Rlc2MgKmRlc2MsIHUzMiBmZWF0dXJlcywKQEAgLTIyNSwxMSArMzQwLDggQEAKIAl1bnNpZ25lZCBpbnQgZXNpemU7CiAKIAllc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSk7Ci0JaWYgKGZlYXR1cmVzICYgTkZUX1NFVF9NQVApCi0JCWVzaXplICs9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZ0X2hhc2hfZWxlbSwgZGF0YVswXSk7Ci0KIAlpZiAoZGVzYy0+c2l6ZSkgewotCQllc3QtPnNpemUgPSBzaXplb2Yoc3RydWN0IHJoYXNodGFibGUpICsKKwkJZXN0LT5zaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfaGFzaCkgKwogCQkJICAgIHJvdW5kdXBfcG93X29mX3R3byhkZXNjLT5zaXplICogNCAvIDMpICoKIAkJCSAgICBzaXplb2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0gKikgKwogCQkJICAgIGRlc2MtPnNpemUgKiBlc2l6ZTsKQEAgLTI0OSwxNSArMzYxLDE4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgbmZ0X3NldF9vcHMgbmZ0X2hhc2hfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CiAJLnByaXZzaXplICAgICAgID0gbmZ0X2hhc2hfcHJpdnNpemUsCisJLmVsZW1zaXplCT0gb2Zmc2V0b2Yoc3RydWN0IG5mdF9oYXNoX2VsZW0sIGV4dCksCiAJLmVzdGltYXRlCT0gbmZ0X2hhc2hfZXN0aW1hdGUsCiAJLmluaXQJCT0gbmZ0X2hhc2hfaW5pdCwKIAkuZGVzdHJveQk9IG5mdF9oYXNoX2Rlc3Ryb3ksCi0JLmdldAkJPSBuZnRfaGFzaF9nZXQsCiAJLmluc2VydAkJPSBuZnRfaGFzaF9pbnNlcnQsCisJLmFjdGl2YXRlCT0gbmZ0X2hhc2hfYWN0aXZhdGUsCisJLmRlYWN0aXZhdGUJPSBuZnRfaGFzaF9kZWFjdGl2YXRlLAogCS5yZW1vdmUJCT0gbmZ0X2hhc2hfcmVtb3ZlLAogCS5sb29rdXAJCT0gbmZ0X2hhc2hfbG9va3VwLAorCS51cGRhdGUJCT0gbmZ0X2hhc2hfdXBkYXRlLAogCS53YWxrCQk9IG5mdF9oYXNoX3dhbGssCi0JLmZlYXR1cmVzCT0gTkZUX1NFVF9NQVAsCisJLmZlYXR1cmVzCT0gTkZUX1NFVF9NQVAgfCBORlRfU0VUX1RJTUVPVVQsCiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAogfTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfaW1tZWRpYXRlLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9pbW1lZGlhdGUuYwppbmRleCA4MTAzODVlLi5kYjNiNzQ2IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9pbW1lZGlhdGUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9pbW1lZGlhdGUuYwpAQCAtMjQsMTIgKzI0LDEyIEBACiB9OwogCiBzdGF0aWMgdm9pZCBuZnRfaW1tZWRpYXRlX2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJICAgICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkgICAgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCWNvbnN0IHN0cnVjdCBuZnRfaW1tZWRpYXRlX2V4cHIgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwogCi0JbmZ0X2RhdGFfY29weSgmZGF0YVtwcml2LT5kcmVnXSwgJnByaXYtPmRhdGEpOworCW5mdF9kYXRhX2NvcHkoJnJlZ3MtPmRhdGFbcHJpdi0+ZHJlZ10sICZwcml2LT5kYXRhLCBwcml2LT5kbGVuKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9pbW1lZGlhdGVfcG9saWN5W05GVEFfSU1NRURJQVRFX01BWCArIDFdID0gewpAQCAtNDksMTcgKzQ5LDE1IEBACiAJICAgIHRiW05GVEFfSU1NRURJQVRFX0RBVEFdID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHJpdi0+ZHJlZyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0lNTUVESUFURV9EUkVHXSkpOwotCWVyciA9IG5mdF92YWxpZGF0ZV9vdXRwdXRfcmVnaXN0ZXIocHJpdi0+ZHJlZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBuZnRfZGF0YV9pbml0KGN0eCwgJnByaXYtPmRhdGEsICZkZXNjLCB0YltORlRBX0lNTUVESUFURV9EQVRBXSk7CisJZXJyID0gbmZ0X2RhdGFfaW5pdChjdHgsICZwcml2LT5kYXRhLCBzaXplb2YocHJpdi0+ZGF0YSksICZkZXNjLAorCQkJICAgIHRiW05GVEFfSU1NRURJQVRFX0RBVEFdKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlwcml2LT5kbGVuID0gZGVzYy5sZW47CiAKLQllcnIgPSBuZnRfdmFsaWRhdGVfZGF0YV9sb2FkKGN0eCwgcHJpdi0+ZHJlZywgJnByaXYtPmRhdGEsIGRlc2MudHlwZSk7CisJcHJpdi0+ZHJlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX0lNTUVESUFURV9EUkVHXSk7CisJZXJyID0gbmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX3N0b3JlKGN0eCwgcHJpdi0+ZHJlZywgJnByaXYtPmRhdGEsCisJCQkJCSAgZGVzYy50eXBlLCBkZXNjLmxlbik7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyMTsKIApAQCAtODEsNyArNzksNyBAQAogewogCWNvbnN0IHN0cnVjdCBuZnRfaW1tZWRpYXRlX2V4cHIgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwogCi0JaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfSU1NRURJQVRFX0RSRUcsIGh0b25sKHByaXYtPmRyZWcpKSkKKwlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX0lNTUVESUFURV9EUkVHLCBwcml2LT5kcmVnKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKIAlyZXR1cm4gbmZ0X2RhdGFfZHVtcChza2IsIE5GVEFfSU1NRURJQVRFX0RBVEEsICZwcml2LT5kYXRhLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfbGltaXQuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2xpbWl0LmMKaW5kZXggODVkYTViZC4uNDM1YzFjYyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfbGltaXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9saW1pdC5jCkBAIC0yNyw3ICsyNyw3IEBACiB9OwogCiBzdGF0aWMgdm9pZCBuZnRfbGltaXRfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkgICBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkJICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCiB7CiAJc3RydWN0IG5mdF9saW1pdCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CkBAIC00NSw3ICs0NSw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2JoKCZsaW1pdF9sb2NrKTsKIAotCWRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0ID0gTkZUX0JSRUFLOworCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9saW1pdF9wb2xpY3lbTkZUQV9MSU1JVF9NQVggKyAxXSA9IHsKQEAgLTk4LDYgKzk4LDcgQEAKIAkub3BzCQk9ICZuZnRfbGltaXRfb3BzLAogCS5wb2xpY3kJCT0gbmZ0X2xpbWl0X3BvbGljeSwKIAkubWF4YXR0cgk9IE5GVEFfTElNSVRfTUFYLAorCS5mbGFncwkJPSBORlRfRVhQUl9TVEFURUZVTCwKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiB9OwogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9sb2cuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X2xvZy5jCmluZGV4IGJkZTA1ZjI4Li5hMTNkNmEzIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9sb2cuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9sb2cuYwpAQCAtMjcsNyArMjcsNyBAQAogfTsKIAogc3RhdGljIHZvaWQgbmZ0X2xvZ19ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKLQkJCSBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJIHN0cnVjdCBuZnRfcmVncyAqcmVncywKIAkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X2xvZyAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CkBAIC03OCw3ICs3OCw3IEBACiAJCQlsaS0+dS5sb2cubGV2ZWwgPQogCQkJCW50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX0xPR19MRVZFTF0pKTsKIAkJfSBlbHNlIHsKLQkJCWxpLT51LmxvZy5sZXZlbCA9IDQ7CisJCQlsaS0+dS5sb2cubGV2ZWwgPSBMT0dMRVZFTF9XQVJOSU5HOwogCQl9CiAJCWlmICh0YltORlRBX0xPR19GTEFHU10gIT0gTlVMTCkgewogCQkJbGktPnUubG9nLmxvZ2ZsYWdzID0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X2xvb2t1cC5jIGIvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKaW5kZXggOTYxNWI4Yi4uYjNjMzFlZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfbG9va3VwLmMKQEAgLTI2LDE1ICsyNiwyMCBAQAogfTsKIAogc3RhdGljIHZvaWQgbmZ0X2xvb2t1cF9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKLQkJCSAgICBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJICAgIHN0cnVjdCBuZnRfcmVncyAqcmVncywKIAkJCSAgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X2xvb2t1cCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAJY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCA9IHByaXYtPnNldDsKKwljb25zdCBzdHJ1Y3QgbmZ0X3NldF9leHQgKmV4dDsKIAotCWlmIChzZXQtPm9wcy0+bG9va3VwKHNldCwgJmRhdGFbcHJpdi0+c3JlZ10sICZkYXRhW3ByaXYtPmRyZWddKSkKKwlpZiAoc2V0LT5vcHMtPmxvb2t1cChzZXQsICZyZWdzLT5kYXRhW3ByaXYtPnNyZWddLCAmZXh0KSkgeworCQlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQKQorCQkJbmZ0X2RhdGFfY29weSgmcmVncy0+ZGF0YVtwcml2LT5kcmVnXSwKKwkJCQkgICAgICBuZnRfc2V0X2V4dF9kYXRhKGV4dCksIHNldC0+ZGxlbik7CiAJCXJldHVybjsKLQlkYXRhW05GVF9SRUdfVkVSRElDVF0udmVyZGljdCA9IE5GVF9CUkVBSzsKKwl9CisJcmVncy0+dmVyZGljdC5jb2RlID0gTkZUX0JSRUFLOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZ0X2xvb2t1cF9wb2xpY3lbTkZUQV9MT09LVVBfTUFYICsgMV0gPSB7CkBAIC02Niw4ICs3MSwxMSBAQAogCQkJcmV0dXJuIFBUUl9FUlIoc2V0KTsKIAl9CiAKLQlwcml2LT5zcmVnID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTE9PS1VQX1NSRUddKSk7Ci0JZXJyID0gbmZ0X3ZhbGlkYXRlX2lucHV0X3JlZ2lzdGVyKHByaXYtPnNyZWcpOworCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9FVkFMKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlwcml2LT5zcmVnID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfTE9PS1VQX1NSRUddKTsKKwllcnIgPSBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZChwcml2LT5zcmVnLCBzZXQtPmtsZW4pOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCkBAIC03NSwxOSArODMsMTYgQEAKIAkJaWYgKCEoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCi0JCXByaXYtPmRyZWcgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9MT09LVVBfRFJFR10pKTsKLQkJZXJyID0gbmZ0X3ZhbGlkYXRlX291dHB1dF9yZWdpc3Rlcihwcml2LT5kcmVnKTsKKwkJcHJpdi0+ZHJlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX0xPT0tVUF9EUkVHXSk7CisJCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9zdG9yZShjdHgsIHByaXYtPmRyZWcsIE5VTEwsCisJCQkJCQkgIHNldC0+ZHR5cGUsIHNldC0+ZGxlbik7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKLQotCQlpZiAocHJpdi0+ZHJlZyA9PSBORlRfUkVHX1ZFUkRJQ1QpIHsKLQkJCWlmIChzZXQtPmR0eXBlICE9IE5GVF9EQVRBX1ZFUkRJQ1QpCi0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0gZWxzZSBpZiAoc2V0LT5kdHlwZSA9PSBORlRfREFUQV9WRVJESUNUKQotCQkJcmV0dXJuIC1FSU5WQUw7CiAJfSBlbHNlIGlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVApCiAJCXJldHVybiAtRUlOVkFMOwogCisJcHJpdi0+YmluZGluZy5mbGFncyA9IHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUDsKKwogCWVyciA9IG5mX3RhYmxlc19iaW5kX3NldChjdHgsIHNldCwgJnByaXYtPmJpbmRpbmcpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwpAQCAtMTEwLDEwICsxMTUsMTAgQEAKIAogCWlmIChubGFfcHV0X3N0cmluZyhza2IsIE5GVEFfTE9PS1VQX1NFVCwgcHJpdi0+c2V0LT5uYW1lKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfTE9PS1VQX1NSRUcsIGh0b25sKHByaXYtPnNyZWcpKSkKKwlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX0xPT0tVUF9TUkVHLCBwcml2LT5zcmVnKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJaWYgKHByaXYtPnNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCkKLQkJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfTE9PS1VQX0RSRUcsIGh0b25sKHByaXYtPmRyZWcpKSkKKwkJaWYgKG5mdF9kdW1wX3JlZ2lzdGVyKHNrYiwgTkZUQV9MT09LVVBfRFJFRywgcHJpdi0+ZHJlZykpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5jIGIvbmV0L25ldGZpbHRlci9uZnRfbWV0YS5jCmluZGV4IGU5OTkxMWUuLjUyNTYxZTEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X21ldGEuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9tZXRhLmMKQEAgLTI1LDY1ICsyNSw2OCBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZ0X21ldGEuaD4KIAogdm9pZCBuZnRfbWV0YV9nZXRfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCSAgICAgICBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkgICAgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9tZXRhICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKIAljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcGt0LT5za2I7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluID0gcGt0LT5pbiwgKm91dCA9IHBrdC0+b3V0OwotCXN0cnVjdCBuZnRfZGF0YSAqZGVzdCA9ICZkYXRhW3ByaXYtPmRyZWddOworCXUzMiAqZGVzdCA9ICZyZWdzLT5kYXRhW3ByaXYtPmRyZWddOwogCiAJc3dpdGNoIChwcml2LT5rZXkpIHsKIAljYXNlIE5GVF9NRVRBX0xFTjoKLQkJZGVzdC0+ZGF0YVswXSA9IHNrYi0+bGVuOworCQkqZGVzdCA9IHNrYi0+bGVuOwogCQlicmVhazsKIAljYXNlIE5GVF9NRVRBX1BST1RPQ09MOgotCQkqKF9fYmUxNiAqKWRlc3QtPmRhdGEgPSBza2ItPnByb3RvY29sOworCQkqZGVzdCA9IDA7CisJCSooX19iZTE2ICopZGVzdCA9IHNrYi0+cHJvdG9jb2w7CiAJCWJyZWFrOwogCWNhc2UgTkZUX01FVEFfTkZQUk9UTzoKLQkJZGVzdC0+ZGF0YVswXSA9IHBrdC0+b3BzLT5wZjsKKwkJKmRlc3QgPSBwa3QtPm9wcy0+cGY7CiAJCWJyZWFrOwogCWNhc2UgTkZUX01FVEFfTDRQUk9UTzoKLQkJZGVzdC0+ZGF0YVswXSA9IHBrdC0+dHByb3Q7CisJCSpkZXN0ID0gcGt0LT50cHJvdDsKIAkJYnJlYWs7CiAJY2FzZSBORlRfTUVUQV9QUklPUklUWToKLQkJZGVzdC0+ZGF0YVswXSA9IHNrYi0+cHJpb3JpdHk7CisJCSpkZXN0ID0gc2tiLT5wcmlvcml0eTsKIAkJYnJlYWs7CiAJY2FzZSBORlRfTUVUQV9NQVJLOgotCQlkZXN0LT5kYXRhWzBdID0gc2tiLT5tYXJrOworCQkqZGVzdCA9IHNrYi0+bWFyazsKIAkJYnJlYWs7CiAJY2FzZSBORlRfTUVUQV9JSUY6CiAJCWlmIChpbiA9PSBOVUxMKQogCQkJZ290byBlcnI7Ci0JCWRlc3QtPmRhdGFbMF0gPSBpbi0+aWZpbmRleDsKKwkJKmRlc3QgPSBpbi0+aWZpbmRleDsKIAkJYnJlYWs7CiAJY2FzZSBORlRfTUVUQV9PSUY6CiAJCWlmIChvdXQgPT0gTlVMTCkKIAkJCWdvdG8gZXJyOwotCQlkZXN0LT5kYXRhWzBdID0gb3V0LT5pZmluZGV4OworCQkqZGVzdCA9IG91dC0+aWZpbmRleDsKIAkJYnJlYWs7CiAJY2FzZSBORlRfTUVUQV9JSUZOQU1FOgogCQlpZiAoaW4gPT0gTlVMTCkKIAkJCWdvdG8gZXJyOwotCQlzdHJuY3B5KChjaGFyICopZGVzdC0+ZGF0YSwgaW4tPm5hbWUsIHNpemVvZihkZXN0LT5kYXRhKSk7CisJCXN0cm5jcHkoKGNoYXIgKilkZXN0LCBpbi0+bmFtZSwgSUZOQU1TSVopOwogCQlicmVhazsKIAljYXNlIE5GVF9NRVRBX09JRk5BTUU6CiAJCWlmIChvdXQgPT0gTlVMTCkKIAkJCWdvdG8gZXJyOwotCQlzdHJuY3B5KChjaGFyICopZGVzdC0+ZGF0YSwgb3V0LT5uYW1lLCBzaXplb2YoZGVzdC0+ZGF0YSkpOworCQlzdHJuY3B5KChjaGFyICopZGVzdCwgb3V0LT5uYW1lLCBJRk5BTVNJWik7CiAJCWJyZWFrOwogCWNhc2UgTkZUX01FVEFfSUlGVFlQRToKIAkJaWYgKGluID09IE5VTEwpCiAJCQlnb3RvIGVycjsKLQkJKih1MTYgKilkZXN0LT5kYXRhID0gaW4tPnR5cGU7CisJCSpkZXN0ID0gMDsKKwkJKih1MTYgKilkZXN0ID0gaW4tPnR5cGU7CiAJCWJyZWFrOwogCWNhc2UgTkZUX01FVEFfT0lGVFlQRToKIAkJaWYgKG91dCA9PSBOVUxMKQogCQkJZ290byBlcnI7Ci0JCSoodTE2ICopZGVzdC0+ZGF0YSA9IG91dC0+dHlwZTsKKwkJKmRlc3QgPSAwOworCQkqKHUxNiAqKWRlc3QgPSBvdXQtPnR5cGU7CiAJCWJyZWFrOwogCWNhc2UgTkZUX01FVEFfU0tVSUQ6Ci0JCWlmIChza2ItPnNrID09IE5VTEwgfHwgc2tiLT5zay0+c2tfc3RhdGUgPT0gVENQX1RJTUVfV0FJVCkKKwkJaWYgKHNrYi0+c2sgPT0gTlVMTCB8fCAhc2tfZnVsbHNvY2soc2tiLT5zaykpCiAJCQlnb3RvIGVycjsKIAogCQlyZWFkX2xvY2tfYmgoJnNrYi0+c2stPnNrX2NhbGxiYWNrX2xvY2spOwpAQCAtOTMsMTMgKzk2LDEyIEBACiAJCQlnb3RvIGVycjsKIAkJfQogCi0JCWRlc3QtPmRhdGFbMF0gPQotCQkJZnJvbV9rdWlkX211bmdlZCgmaW5pdF91c2VyX25zLAorCQkqZGVzdCA9CWZyb21fa3VpZF9tdW5nZWQoJmluaXRfdXNlcl9ucywKIAkJCQlza2ItPnNrLT5za19zb2NrZXQtPmZpbGUtPmZfY3JlZC0+ZnN1aWQpOwogCQlyZWFkX3VubG9ja19iaCgmc2tiLT5zay0+c2tfY2FsbGJhY2tfbG9jayk7CiAJCWJyZWFrOwogCWNhc2UgTkZUX01FVEFfU0tHSUQ6Ci0JCWlmIChza2ItPnNrID09IE5VTEwgfHwgc2tiLT5zay0+c2tfc3RhdGUgPT0gVENQX1RJTUVfV0FJVCkKKwkJaWYgKHNrYi0+c2sgPT0gTlVMTCB8fCAhc2tfZnVsbHNvY2soc2tiLT5zaykpCiAJCQlnb3RvIGVycjsKIAogCQlyZWFkX2xvY2tfYmgoJnNrYi0+c2stPnNrX2NhbGxiYWNrX2xvY2spOwpAQCAtMTA4LDggKzExMCw3IEBACiAJCQlyZWFkX3VubG9ja19iaCgmc2tiLT5zay0+c2tfY2FsbGJhY2tfbG9jayk7CiAJCQlnb3RvIGVycjsKIAkJfQotCQlkZXN0LT5kYXRhWzBdID0KLQkJCWZyb21fa2dpZF9tdW5nZWQoJmluaXRfdXNlcl9ucywKKwkJKmRlc3QgPQlmcm9tX2tnaWRfbXVuZ2VkKCZpbml0X3VzZXJfbnMsCiAJCQkJIHNrYi0+c2stPnNrX3NvY2tldC0+ZmlsZS0+Zl9jcmVkLT5mc2dpZCk7CiAJCXJlYWRfdW5sb2NrX2JoKCZza2ItPnNrLT5za19jYWxsYmFja19sb2NrKTsKIAkJYnJlYWs7CkBAIC0xMTksMzMgKzEyMCwzMyBAQAogCiAJCWlmIChkc3QgPT0gTlVMTCkKIAkJCWdvdG8gZXJyOwotCQlkZXN0LT5kYXRhWzBdID0gZHN0LT50Y2xhc3NpZDsKKwkJKmRlc3QgPSBkc3QtPnRjbGFzc2lkOwogCQlicmVhazsKIAl9CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfTkVUV09SS19TRUNNQVJLCiAJY2FzZSBORlRfTUVUQV9TRUNNQVJLOgotCQlkZXN0LT5kYXRhWzBdID0gc2tiLT5zZWNtYXJrOworCQkqZGVzdCA9IHNrYi0+c2VjbWFyazsKIAkJYnJlYWs7CiAjZW5kaWYKIAljYXNlIE5GVF9NRVRBX1BLVFRZUEU6CiAJCWlmIChza2ItPnBrdF90eXBlICE9IFBBQ0tFVF9MT09QQkFDSykgewotCQkJZGVzdC0+ZGF0YVswXSA9IHNrYi0+cGt0X3R5cGU7CisJCQkqZGVzdCA9IHNrYi0+cGt0X3R5cGU7CiAJCQlicmVhazsKIAkJfQogCiAJCXN3aXRjaCAocGt0LT5vcHMtPnBmKSB7CiAJCWNhc2UgTkZQUk9UT19JUFY0OgogCQkJaWYgKGlwdjRfaXNfbXVsdGljYXN0KGlwX2hkcihza2IpLT5kYWRkcikpCi0JCQkJZGVzdC0+ZGF0YVswXSA9IFBBQ0tFVF9NVUxUSUNBU1Q7CisJCQkJKmRlc3QgPSBQQUNLRVRfTVVMVElDQVNUOwogCQkJZWxzZQotCQkJCWRlc3QtPmRhdGFbMF0gPSBQQUNLRVRfQlJPQURDQVNUOworCQkJCSpkZXN0ID0gUEFDS0VUX0JST0FEQ0FTVDsKIAkJCWJyZWFrOwogCQljYXNlIE5GUFJPVE9fSVBWNjoKIAkJCWlmIChpcHY2X2hkcihza2IpLT5kYWRkci5zNl9hZGRyWzBdID09IDB4RkYpCi0JCQkJZGVzdC0+ZGF0YVswXSA9IFBBQ0tFVF9NVUxUSUNBU1Q7CisJCQkJKmRlc3QgPSBQQUNLRVRfTVVMVElDQVNUOwogCQkJZWxzZQotCQkJCWRlc3QtPmRhdGFbMF0gPSBQQUNLRVRfQlJPQURDQVNUOworCQkJCSpkZXN0ID0gUEFDS0VUX0JST0FEQ0FTVDsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJV0FSTl9PTigxKTsKQEAgLTE1MywyMyArMTU0LDIyIEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBORlRfTUVUQV9DUFU6Ci0JCWRlc3QtPmRhdGFbMF0gPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJCSpkZXN0ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAkJYnJlYWs7CiAJY2FzZSBORlRfTUVUQV9JSUZHUk9VUDoKIAkJaWYgKGluID09IE5VTEwpCiAJCQlnb3RvIGVycjsKLQkJZGVzdC0+ZGF0YVswXSA9IGluLT5ncm91cDsKKwkJKmRlc3QgPSBpbi0+Z3JvdXA7CiAJCWJyZWFrOwogCWNhc2UgTkZUX01FVEFfT0lGR1JPVVA6CiAJCWlmIChvdXQgPT0gTlVMTCkKIAkJCWdvdG8gZXJyOwotCQlkZXN0LT5kYXRhWzBdID0gb3V0LT5ncm91cDsKKwkJKmRlc3QgPSBvdXQtPmdyb3VwOwogCQlicmVhazsKIAljYXNlIE5GVF9NRVRBX0NHUk9VUDoKLQkJaWYgKHNrYi0+c2sgPT0gTlVMTCkKLQkJCWJyZWFrOwotCi0JCWRlc3QtPmRhdGFbMF0gPSBza2ItPnNrLT5za19jbGFzc2lkOworCQlpZiAoc2tiLT5zayA9PSBOVUxMIHx8ICFza19mdWxsc29jayhza2ItPnNrKSkKKwkJCWdvdG8gZXJyOworCQkqZGVzdCA9IHNrYi0+c2stPnNrX2NsYXNzaWQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVdBUk5fT04oMSk7CkBAIC0xNzgsMTcgKzE3OCwxNyBAQAogCXJldHVybjsKIAogZXJyOgotCWRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0ID0gTkZUX0JSRUFLOworCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mdF9tZXRhX2dldF9ldmFsKTsKIAogdm9pZCBuZnRfbWV0YV9zZXRfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCSAgICAgICBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkgICAgICAgc3RydWN0IG5mdF9yZWdzICpyZWdzLAogCQkgICAgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9tZXRhICptZXRhID0gbmZ0X2V4cHJfcHJpdihleHByKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcGt0LT5za2I7Ci0JdTMyIHZhbHVlID0gZGF0YVttZXRhLT5zcmVnXS5kYXRhWzBdOworCXUzMiB2YWx1ZSA9IHJlZ3MtPmRhdGFbbWV0YS0+c3JlZ107CiAKIAlzd2l0Y2ggKG1ldGEtPmtleSkgewogCWNhc2UgTkZUX01FVEFfTUFSSzoKQEAgLTIxOCwyMiArMjE4LDIyIEBACiAJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQogewogCXN0cnVjdCBuZnRfbWV0YSAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7Ci0JaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgbGVuOwogCiAJcHJpdi0+a2V5ID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTUVUQV9LRVldKSk7CiAJc3dpdGNoIChwcml2LT5rZXkpIHsKLQljYXNlIE5GVF9NRVRBX0xFTjoKIAljYXNlIE5GVF9NRVRBX1BST1RPQ09MOgorCWNhc2UgTkZUX01FVEFfSUlGVFlQRToKKwljYXNlIE5GVF9NRVRBX09JRlRZUEU6CisJCWxlbiA9IHNpemVvZih1MTYpOworCQlicmVhazsKIAljYXNlIE5GVF9NRVRBX05GUFJPVE86CiAJY2FzZSBORlRfTUVUQV9MNFBST1RPOgorCWNhc2UgTkZUX01FVEFfTEVOOgogCWNhc2UgTkZUX01FVEFfUFJJT1JJVFk6CiAJY2FzZSBORlRfTUVUQV9NQVJLOgogCWNhc2UgTkZUX01FVEFfSUlGOgogCWNhc2UgTkZUX01FVEFfT0lGOgotCWNhc2UgTkZUX01FVEFfSUlGTkFNRToKLQljYXNlIE5GVF9NRVRBX09JRk5BTUU6Ci0JY2FzZSBORlRfTUVUQV9JSUZUWVBFOgotCWNhc2UgTkZUX01FVEFfT0lGVFlQRToKIAljYXNlIE5GVF9NRVRBX1NLVUlEOgogCWNhc2UgTkZUX01FVEFfU0tHSUQ6CiAjaWZkZWYgQ09ORklHX0lQX1JPVVRFX0NMQVNTSUQKQEAgLTI0NywyMSArMjQ3LDE5IEBACiAJY2FzZSBORlRfTUVUQV9JSUZHUk9VUDoKIAljYXNlIE5GVF9NRVRBX09JRkdST1VQOgogCWNhc2UgTkZUX01FVEFfQ0dST1VQOgorCQlsZW4gPSBzaXplb2YodTMyKTsKKwkJYnJlYWs7CisJY2FzZSBORlRfTUVUQV9JSUZOQU1FOgorCWNhc2UgTkZUX01FVEFfT0lGTkFNRToKKwkJbGVuID0gSUZOQU1TSVo7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQlwcml2LT5kcmVnID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTUVUQV9EUkVHXSkpOwotCWVyciA9IG5mdF92YWxpZGF0ZV9vdXRwdXRfcmVnaXN0ZXIocHJpdi0+ZHJlZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBuZnRfdmFsaWRhdGVfZGF0YV9sb2FkKGN0eCwgcHJpdi0+ZHJlZywgTlVMTCwgTkZUX0RBVEFfVkFMVUUpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCi0JcmV0dXJuIDA7CisJcHJpdi0+ZHJlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX01FVEFfRFJFR10pOworCXJldHVybiBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfc3RvcmUoY3R4LCBwcml2LT5kcmVnLCBOVUxMLAorCQkJCQkgICBORlRfREFUQV9WQUxVRSwgbGVuKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mdF9tZXRhX2dldF9pbml0KTsKIApAQCAtMjcwLDIwICsyNjgsMjQgQEAKIAkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7CiAJc3RydWN0IG5mdF9tZXRhICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKKwl1bnNpZ25lZCBpbnQgbGVuOwogCWludCBlcnI7CiAKIAlwcml2LT5rZXkgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9NRVRBX0tFWV0pKTsKIAlzd2l0Y2ggKHByaXYtPmtleSkgewogCWNhc2UgTkZUX01FVEFfTUFSSzoKIAljYXNlIE5GVF9NRVRBX1BSSU9SSVRZOgorCQlsZW4gPSBzaXplb2YodTMyKTsKKwkJYnJlYWs7CiAJY2FzZSBORlRfTUVUQV9ORlRSQUNFOgorCQlsZW4gPSBzaXplb2YodTgpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JcHJpdi0+c3JlZyA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX01FVEFfU1JFR10pKTsKLQllcnIgPSBuZnRfdmFsaWRhdGVfaW5wdXRfcmVnaXN0ZXIocHJpdi0+c3JlZyk7CisJcHJpdi0+c3JlZyA9IG5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX01FVEFfU1JFR10pOworCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWcsIGxlbik7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKQEAgLTI5OCw3ICszMDAsNyBAQAogCiAJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfTUVUQV9LRVksIGh0b25sKHByaXYtPmtleSkpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9NRVRBX0RSRUcsIGh0b25sKHByaXYtPmRyZWcpKSkKKwlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX01FVEFfRFJFRywgcHJpdi0+ZHJlZykpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCXJldHVybiAwOwogCkBAIC0zMTQsNyArMzE2LDcgQEAKIAogCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX01FVEFfS0VZLCBodG9ubChwcml2LT5rZXkpKSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfTUVUQV9TUkVHLCBodG9ubChwcml2LT5zcmVnKSkpCisJaWYgKG5mdF9kdW1wX3JlZ2lzdGVyKHNrYiwgTkZUQV9NRVRBX1NSRUcsIHByaXYtPnNyZWcpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfbmF0LmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9uYXQuYwppbmRleCBhMDgzN2M2Li5lZTJkNzE3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9uYXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9uYXQuYwpAQCAtMzcsNyArMzcsNyBAQAogfTsKIAogc3RhdGljIHZvaWQgbmZ0X25hdF9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKLQkJCSBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJIHN0cnVjdCBuZnRfcmVncyAqcmVncywKIAkJCSBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X25hdCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CkBAIC00OSwzMyArNDksMzIgQEAKIAlpZiAocHJpdi0+c3JlZ19hZGRyX21pbikgewogCQlpZiAocHJpdi0+ZmFtaWx5ID09IEFGX0lORVQpIHsKIAkJCXJhbmdlLm1pbl9hZGRyLmlwID0gKF9fZm9yY2UgX19iZTMyKQotCQkJCQlkYXRhW3ByaXYtPnNyZWdfYWRkcl9taW5dLmRhdGFbMF07CisJCQkJCXJlZ3MtPmRhdGFbcHJpdi0+c3JlZ19hZGRyX21pbl07CiAJCQlyYW5nZS5tYXhfYWRkci5pcCA9IChfX2ZvcmNlIF9fYmUzMikKLQkJCQkJZGF0YVtwcml2LT5zcmVnX2FkZHJfbWF4XS5kYXRhWzBdOworCQkJCQlyZWdzLT5kYXRhW3ByaXYtPnNyZWdfYWRkcl9tYXhdOwogCiAJCX0gZWxzZSB7CiAJCQltZW1jcHkocmFuZ2UubWluX2FkZHIuaXA2LAotCQkJICAgICAgIGRhdGFbcHJpdi0+c3JlZ19hZGRyX21pbl0uZGF0YSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG5mdF9kYXRhKSk7CisJCQkgICAgICAgJnJlZ3MtPmRhdGFbcHJpdi0+c3JlZ19hZGRyX21pbl0sCisJCQkgICAgICAgc2l6ZW9mKHJhbmdlLm1pbl9hZGRyLmlwNikpOwogCQkJbWVtY3B5KHJhbmdlLm1heF9hZGRyLmlwNiwKLQkJCSAgICAgICBkYXRhW3ByaXYtPnNyZWdfYWRkcl9tYXhdLmRhdGEsCi0JCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBuZnRfZGF0YSkpOworCQkJICAgICAgICZyZWdzLT5kYXRhW3ByaXYtPnNyZWdfYWRkcl9tYXhdLAorCQkJICAgICAgIHNpemVvZihyYW5nZS5tYXhfYWRkci5pcDYpKTsKIAkJfQogCQlyYW5nZS5mbGFncyB8PSBORl9OQVRfUkFOR0VfTUFQX0lQUzsKIAl9CiAKIAlpZiAocHJpdi0+c3JlZ19wcm90b19taW4pIHsKIAkJcmFuZ2UubWluX3Byb3RvLmFsbCA9Ci0JCQkqKF9fYmUxNiAqKSZkYXRhW3ByaXYtPnNyZWdfcHJvdG9fbWluXS5kYXRhWzBdOworCQkJKihfX2JlMTYgKikmcmVncy0+ZGF0YVtwcml2LT5zcmVnX3Byb3RvX21pbl07CiAJCXJhbmdlLm1heF9wcm90by5hbGwgPQotCQkJKihfX2JlMTYgKikmZGF0YVtwcml2LT5zcmVnX3Byb3RvX21heF0uZGF0YVswXTsKKwkJCSooX19iZTE2ICopJnJlZ3MtPmRhdGFbcHJpdi0+c3JlZ19wcm90b19tYXhdOwogCQlyYW5nZS5mbGFncyB8PSBORl9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOwogCX0KIAogCXJhbmdlLmZsYWdzIHw9IHByaXYtPmZsYWdzOwogCi0JZGF0YVtORlRfUkVHX1ZFUkRJQ1RdLnZlcmRpY3QgPQotCQluZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBwcml2LT50eXBlKTsKKwlyZWdzLT52ZXJkaWN0LmNvZGUgPSBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBwcml2LT50eXBlKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9uYXRfcG9saWN5W05GVEFfTkFUX01BWCArIDFdID0gewpAQCAtMTE5LDYgKzExOCw3IEBACiAJCQljb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKIAlzdHJ1Y3QgbmZ0X25hdCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdW5zaWduZWQgaW50IGFsZW4sIHBsZW47CiAJdTMyIGZhbWlseTsKIAlpbnQgZXJyOwogCkBAIC0xNDYsMjUgKzE0NiwzNCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZhbWlseSA9IG50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX05BVF9GQU1JTFldKSk7Ci0JaWYgKGZhbWlseSAhPSBBRl9JTkVUICYmIGZhbWlseSAhPSBBRl9JTkVUNikKLQkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CiAJaWYgKGZhbWlseSAhPSBjdHgtPmFmaS0+ZmFtaWx5KQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzd2l0Y2ggKGZhbWlseSkgeworCWNhc2UgTkZQUk9UT19JUFY0OgorCQlhbGVuID0gRklFTERfU0laRU9GKHN0cnVjdCBuZl9uYXRfcmFuZ2UsIG1pbl9hZGRyLmlwKTsKKwkJYnJlYWs7CisJY2FzZSBORlBST1RPX0lQVjY6CisJCWFsZW4gPSBGSUVMRF9TSVpFT0Yoc3RydWN0IG5mX25hdF9yYW5nZSwgbWluX2FkZHIuaXA2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FQUZOT1NVUFBPUlQ7CisJfQogCXByaXYtPmZhbWlseSA9IGZhbWlseTsKIAogCWlmICh0YltORlRBX05BVF9SRUdfQUREUl9NSU5dKSB7CiAJCXByaXYtPnNyZWdfYWRkcl9taW4gPQotCQkJbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTkFUX1JFR19BRERSX01JTl0pKTsKLQotCQllcnIgPSBuZnRfdmFsaWRhdGVfaW5wdXRfcmVnaXN0ZXIocHJpdi0+c3JlZ19hZGRyX21pbik7CisJCQluZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9OQVRfUkVHX0FERFJfTUlOXSk7CisJCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWdfYWRkcl9taW4sIGFsZW4pOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAKIAkJaWYgKHRiW05GVEFfTkFUX1JFR19BRERSX01BWF0pIHsKIAkJCXByaXYtPnNyZWdfYWRkcl9tYXggPQotCQkJCW50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX05BVF9SRUdfQUREUl9NQVhdKSk7CisJCQkJbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfTkFUX1JFR19BRERSX01BWF0pOwogCi0JCQllcnIgPSBuZnRfdmFsaWRhdGVfaW5wdXRfcmVnaXN0ZXIocHJpdi0+c3JlZ19hZGRyX21heCk7CisJCQllcnIgPSBuZnRfdmFsaWRhdGVfcmVnaXN0ZXJfbG9hZChwcml2LT5zcmVnX2FkZHJfbWF4LAorCQkJCQkJCSBhbGVuKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0gZWxzZSB7CkBAIC0xNzIsMTkgKzE4MSwyMSBAQAogCQl9CiAJfQogCisJcGxlbiA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZfbmF0X3JhbmdlLCBtaW5fYWRkci5hbGwpOwogCWlmICh0YltORlRBX05BVF9SRUdfUFJPVE9fTUlOXSkgewogCQlwcml2LT5zcmVnX3Byb3RvX21pbiA9Ci0JCQludG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9OQVRfUkVHX1BST1RPX01JTl0pKTsKKwkJCW5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX05BVF9SRUdfUFJPVE9fTUlOXSk7CiAKLQkJZXJyID0gbmZ0X3ZhbGlkYXRlX2lucHV0X3JlZ2lzdGVyKHByaXYtPnNyZWdfcHJvdG9fbWluKTsKKwkJZXJyID0gbmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX2xvYWQocHJpdi0+c3JlZ19wcm90b19taW4sIHBsZW4pOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAKIAkJaWYgKHRiW05GVEFfTkFUX1JFR19QUk9UT19NQVhdKSB7CiAJCQlwcml2LT5zcmVnX3Byb3RvX21heCA9Ci0JCQkJbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfTkFUX1JFR19QUk9UT19NQVhdKSk7CisJCQkJbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfTkFUX1JFR19QUk9UT19NQVhdKTsKIAotCQkJZXJyID0gbmZ0X3ZhbGlkYXRlX2lucHV0X3JlZ2lzdGVyKHByaXYtPnNyZWdfcHJvdG9fbWF4KTsKKwkJCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWdfcHJvdG9fbWF4LAorCQkJCQkJCSBwbGVuKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0gZWxzZSB7CkBAIC0yMjAsMTggKzIzMSwxOCBAQAogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCWlmIChwcml2LT5zcmVnX2FkZHJfbWluKSB7Ci0JCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX05BVF9SRUdfQUREUl9NSU4sCi0JCQkJIGh0b25sKHByaXYtPnNyZWdfYWRkcl9taW4pKSB8fAotCQkgICAgbmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9OQVRfUkVHX0FERFJfTUFYLAotCQkJCSBodG9ubChwcml2LT5zcmVnX2FkZHJfbWF4KSkpCisJCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfTkFUX1JFR19BRERSX01JTiwKKwkJCQkgICAgICBwcml2LT5zcmVnX2FkZHJfbWluKSB8fAorCQkgICAgbmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX05BVF9SRUdfQUREUl9NQVgsCisJCQkJICAgICAgcHJpdi0+c3JlZ19hZGRyX21heCkpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAl9CiAKIAlpZiAocHJpdi0+c3JlZ19wcm90b19taW4pIHsKLQkJaWYgKG5sYV9wdXRfYmUzMihza2IsIE5GVEFfTkFUX1JFR19QUk9UT19NSU4sCi0JCQkJIGh0b25sKHByaXYtPnNyZWdfcHJvdG9fbWluKSkgfHwKLQkJICAgIG5sYV9wdXRfYmUzMihza2IsIE5GVEFfTkFUX1JFR19QUk9UT19NQVgsCi0JCQkJIGh0b25sKHByaXYtPnNyZWdfcHJvdG9fbWF4KSkpCisJCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfTkFUX1JFR19QUk9UT19NSU4sCisJCQkJICAgICAgcHJpdi0+c3JlZ19wcm90b19taW4pIHx8CisJCSAgICBuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfTkFUX1JFR19QUk9UT19NQVgsCisJCQkJICAgICAgcHJpdi0+c3JlZ19wcm90b19tYXgpKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9wYXlsb2FkLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9wYXlsb2FkLmMKaW5kZXggODVkYWE4NC4uOTRmYjNiMiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfcGF5bG9hZC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3BheWxvYWQuYwpAQCAtMTgsMTIgKzE4LDEyIEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl90YWJsZXMuaD4KIAogc3RhdGljIHZvaWQgbmZ0X3BheWxvYWRfZXZhbChjb25zdCBzdHJ1Y3QgbmZ0X2V4cHIgKmV4cHIsCi0JCQkgICAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkgICAgIHN0cnVjdCBuZnRfcmVncyAqcmVncywKIAkJCSAgICAgY29uc3Qgc3RydWN0IG5mdF9wa3RpbmZvICpwa3QpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9wYXlsb2FkICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKIAljb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcGt0LT5za2I7Ci0Jc3RydWN0IG5mdF9kYXRhICpkZXN0ID0gJmRhdGFbcHJpdi0+ZHJlZ107CisJdTMyICpkZXN0ID0gJnJlZ3MtPmRhdGFbcHJpdi0+ZHJlZ107CiAJaW50IG9mZnNldDsKIAogCXN3aXRjaCAocHJpdi0+YmFzZSkgewpAQCAtNDMsMTEgKzQzLDEyIEBACiAJfQogCW9mZnNldCArPSBwcml2LT5vZmZzZXQ7CiAKLQlpZiAoc2tiX2NvcHlfYml0cyhza2IsIG9mZnNldCwgZGVzdC0+ZGF0YSwgcHJpdi0+bGVuKSA8IDApCisJZGVzdFtwcml2LT5sZW4gLyBORlRfUkVHMzJfU0laRV0gPSAwOworCWlmIChza2JfY29weV9iaXRzKHNrYiwgb2Zmc2V0LCBkZXN0LCBwcml2LT5sZW4pIDwgMCkKIAkJZ290byBlcnI7CiAJcmV0dXJuOwogZXJyOgotCWRhdGFbTkZUX1JFR19WRVJESUNUXS52ZXJkaWN0ID0gTkZUX0JSRUFLOworCXJlZ3MtPnZlcmRpY3QuY29kZSA9IE5GVF9CUkVBSzsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mdF9wYXlsb2FkX3BvbGljeVtORlRBX1BBWUxPQURfTUFYICsgMV0gPSB7CkBAIC02MiwyNCArNjMsMjEgQEAKIAkJCSAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKIHsKIAlzdHJ1Y3QgbmZ0X3BheWxvYWQgKnByaXYgPSBuZnRfZXhwcl9wcml2KGV4cHIpOwotCWludCBlcnI7CiAKIAlwcml2LT5iYXNlICAgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9QQVlMT0FEX0JBU0VdKSk7CiAJcHJpdi0+b2Zmc2V0ID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfUEFZTE9BRF9PRkZTRVRdKSk7CiAJcHJpdi0+bGVuICAgID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfUEFZTE9BRF9MRU5dKSk7CisJcHJpdi0+ZHJlZyAgID0gbmZ0X3BhcnNlX3JlZ2lzdGVyKHRiW05GVEFfUEFZTE9BRF9EUkVHXSk7CiAKLQlwcml2LT5kcmVnID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfUEFZTE9BRF9EUkVHXSkpOwotCWVyciA9IG5mdF92YWxpZGF0ZV9vdXRwdXRfcmVnaXN0ZXIocHJpdi0+ZHJlZyk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0JcmV0dXJuIG5mdF92YWxpZGF0ZV9kYXRhX2xvYWQoY3R4LCBwcml2LT5kcmVnLCBOVUxMLCBORlRfREFUQV9WQUxVRSk7CisJcmV0dXJuIG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9zdG9yZShjdHgsIHByaXYtPmRyZWcsIE5VTEwsCisJCQkJCSAgIE5GVF9EQVRBX1ZBTFVFLCBwcml2LT5sZW4pOwogfQogCiBzdGF0aWMgaW50IG5mdF9wYXlsb2FkX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByKQogewogCWNvbnN0IHN0cnVjdCBuZnRfcGF5bG9hZCAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CiAKLQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9QQVlMT0FEX0RSRUcsIGh0b25sKHByaXYtPmRyZWcpKSB8fAorCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfUEFZTE9BRF9EUkVHLCBwcml2LT5kcmVnKSB8fAogCSAgICBubGFfcHV0X2JlMzIoc2tiLCBORlRBX1BBWUxPQURfQkFTRSwgaHRvbmwocHJpdi0+YmFzZSkpIHx8CiAJICAgIG5sYV9wdXRfYmUzMihza2IsIE5GVEFfUEFZTE9BRF9PRkZTRVQsIGh0b25sKHByaXYtPm9mZnNldCkpIHx8CiAJICAgIG5sYV9wdXRfYmUzMihza2IsIE5GVEFfUEFZTE9BRF9MRU4sIGh0b25sKHByaXYtPmxlbikpKQpAQCAtMTMxLDkgKzEyOSw3IEBACiAJfQogCiAJb2Zmc2V0ID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfUEFZTE9BRF9PRkZTRVRdKSk7Ci0JbGVuID0gbnRvaGwobmxhX2dldF9iZTMyKHRiW05GVEFfUEFZTE9BRF9MRU5dKSk7Ci0JaWYgKGxlbiA9PSAwIHx8IGxlbiA+IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZ0X2RhdGEsIGRhdGEpKQotCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwlsZW4gICAgPSBudG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9QQVlMT0FEX0xFTl0pKTsKIAogCWlmIChsZW4gPD0gNCAmJiBpc19wb3dlcl9vZl8yKGxlbikgJiYgSVNfQUxJR05FRChvZmZzZXQsIGxlbikgJiYKIAkgICAgYmFzZSAhPSBORlRfUEFZTE9BRF9MTF9IRUFERVIpCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mdF9xdWV1ZS5jIGIvbmV0L25ldGZpbHRlci9uZnRfcXVldWUuYwppbmRleCBlOGFlMmY2Li45NjgwNWQyIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9xdWV1ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3F1ZXVlLmMKQEAgLTI4LDcgKzI4LDcgQEAKIH07CiAKIHN0YXRpYyB2b2lkIG5mdF9xdWV1ZV9ldmFsKGNvbnN0IHN0cnVjdCBuZnRfZXhwciAqZXhwciwKLQkJCSAgIHN0cnVjdCBuZnRfZGF0YSBkYXRhW05GVF9SRUdfTUFYICsgMV0sCisJCQkgICBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCiAJCQkgICBjb25zdCBzdHJ1Y3QgbmZ0X3BrdGluZm8gKnBrdCkKIHsKIAlzdHJ1Y3QgbmZ0X3F1ZXVlICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKQEAgLTUxLDcgKzUxLDcgQEAKIAlpZiAocHJpdi0+ZmxhZ3MgJiBORlRfUVVFVUVfRkxBR19CWVBBU1MpCiAJCXJldCB8PSBORl9WRVJESUNUX0ZMQUdfUVVFVUVfQllQQVNTOwogCi0JZGF0YVtORlRfUkVHX1ZFUkRJQ1RdLnZlcmRpY3QgPSByZXQ7CisJcmVncy0+dmVyZGljdC5jb2RlID0gcmV0OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgbmZ0X3F1ZXVlX3BvbGljeVtORlRBX1FVRVVFX01BWCArIDFdID0gewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfcmJ0cmVlLmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9yYnRyZWUuYwppbmRleCA0NjIxNGYyLi4xYzMwZjQxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mdF9yYnRyZWUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9yYnRyZWUuYwpAQCAtMjYsMjUgKzI2LDI1IEBACiAKIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gewogCXN0cnVjdCByYl9ub2RlCQlub2RlOwotCXUxNgkJCWZsYWdzOwotCXN0cnVjdCBuZnRfZGF0YQkJa2V5OwotCXN0cnVjdCBuZnRfZGF0YQkJZGF0YVtdOworCXN0cnVjdCBuZnRfc2V0X2V4dAlleHQ7CiB9OwogCi1zdGF0aWMgYm9vbCBuZnRfcmJ0cmVlX2xvb2t1cChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAotCQkJICAgICAgY29uc3Qgc3RydWN0IG5mdF9kYXRhICprZXksCi0JCQkgICAgICBzdHJ1Y3QgbmZ0X2RhdGEgKmRhdGEpCisKK3N0YXRpYyBib29sIG5mdF9yYnRyZWVfbG9va3VwKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsIGNvbnN0IHUzMiAqa2V5LAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZXh0ICoqZXh0KQogewogCWNvbnN0IHN0cnVjdCBuZnRfcmJ0cmVlICpwcml2ID0gbmZ0X3NldF9wcml2KHNldCk7CiAJY29uc3Qgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlLCAqaW50ZXJ2YWwgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBwcml2LT5yb290LnJiX25vZGU7CisJY29uc3Qgc3RydWN0IHJiX25vZGUgKnBhcmVudDsKKwl1OCBnZW5tYXNrID0gbmZ0X2dlbm1hc2tfY3VyKHJlYWRfcG5ldCgmc2V0LT5wbmV0KSk7CiAJaW50IGQ7CiAKIAlzcGluX2xvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CisJcGFyZW50ID0gcHJpdi0+cm9vdC5yYl9ub2RlOwogCXdoaWxlIChwYXJlbnQgIT0gTlVMTCkgewogCQlyYmUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOwogCi0JCWQgPSBuZnRfZGF0YV9jbXAoJnJiZS0+a2V5LCBrZXksIHNldC0+a2xlbik7CisJCWQgPSBtZW1jbXAobmZ0X3NldF9leHRfa2V5KCZyYmUtPmV4dCksIGtleSwgc2V0LT5rbGVuKTsKIAkJaWYgKGQgPCAwKSB7CiAJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX2xlZnQ7CiAJCQlpbnRlcnZhbCA9IHJiZTsKQEAgLTUyLDEyICs1MiwxNyBAQAogCQkJcGFyZW50ID0gcGFyZW50LT5yYl9yaWdodDsKIAkJZWxzZSB7CiBmb3VuZDoKLQkJCWlmIChyYmUtPmZsYWdzICYgTkZUX1NFVF9FTEVNX0lOVEVSVkFMX0VORCkKKwkJCWlmICghbmZ0X3NldF9lbGVtX2FjdGl2ZSgmcmJlLT5leHQsIGdlbm1hc2spKSB7CisJCQkJcGFyZW50ID0gcGFyZW50LT5yYl9sZWZ0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKG5mdF9zZXRfZXh0X2V4aXN0cygmcmJlLT5leHQsIE5GVF9TRVRfRVhUX0ZMQUdTKSAmJgorCQkJICAgICpuZnRfc2V0X2V4dF9mbGFncygmcmJlLT5leHQpICYKKwkJCSAgICBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKQogCQkJCWdvdG8gb3V0OwotCQkJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCkKLQkJCQluZnRfZGF0YV9jb3B5KGRhdGEsIHJiZS0+ZGF0YSk7Ci0KIAkJCXNwaW5fdW5sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOworCisJCQkqZXh0ID0gJnJiZS0+ZXh0OwogCQkJcmV0dXJuIHRydWU7CiAJCX0KIAl9CkBAIC03MSwyMyArNzYsMTMgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIG5mdF9yYnRyZWVfZWxlbV9kZXN0cm95KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCi0JCQkJICAgIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZSkKLXsKLQluZnRfZGF0YV91bmluaXQoJnJiZS0+a2V5LCBORlRfREFUQV9WQUxVRSk7Ci0JaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCAmJgotCSAgICAhKHJiZS0+ZmxhZ3MgJiBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKSkKLQkJbmZ0X2RhdGFfdW5pbml0KHJiZS0+ZGF0YSwgc2V0LT5kdHlwZSk7Ci0KLQlrZnJlZShyYmUpOwotfQotCiBzdGF0aWMgaW50IF9fbmZ0X3JidHJlZV9pbnNlcnQoY29uc3Qgc3RydWN0IG5mdF9zZXQgKnNldCwKIAkJCSAgICAgICBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpuZXcpCiB7CiAJc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKIAlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKipwOworCXU4IGdlbm1hc2sgPSBuZnRfZ2VubWFza19uZXh0KHJlYWRfcG5ldCgmc2V0LT5wbmV0KSk7CiAJaW50IGQ7CiAKIAlwYXJlbnQgPSBOVUxMOwpAQCAtOTUsMTMgKzkwLDE4IEBACiAJd2hpbGUgKCpwICE9IE5VTEwpIHsKIAkJcGFyZW50ID0gKnA7CiAJCXJiZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgbm9kZSk7Ci0JCWQgPSBuZnRfZGF0YV9jbXAoJnJiZS0+a2V5LCAmbmV3LT5rZXksIHNldC0+a2xlbik7CisJCWQgPSBtZW1jbXAobmZ0X3NldF9leHRfa2V5KCZyYmUtPmV4dCksCisJCQkgICBuZnRfc2V0X2V4dF9rZXkoJm5ldy0+ZXh0KSwKKwkJCSAgIHNldC0+a2xlbik7CiAJCWlmIChkIDwgMCkKIAkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OwogCQllbHNlIGlmIChkID4gMCkKIAkJCXAgPSAmcGFyZW50LT5yYl9yaWdodDsKLQkJZWxzZQotCQkJcmV0dXJuIC1FRVhJU1Q7CisJCWVsc2UgeworCQkJaWYgKG5mdF9zZXRfZWxlbV9hY3RpdmUoJnJiZS0+ZXh0LCBnZW5tYXNrKSkKKwkJCQlyZXR1cm4gLUVFWElTVDsKKwkJCXAgPSAmcGFyZW50LT5yYl9sZWZ0OworCQl9CiAJfQogCXJiX2xpbmtfbm9kZSgmbmV3LT5ub2RlLCBwYXJlbnQsIHApOwogCXJiX2luc2VydF9jb2xvcigmbmV3LT5ub2RlLCAmcHJpdi0+cm9vdCk7CkBAIC0xMTEsMzEgKzExMSwxMyBAQAogc3RhdGljIGludCBuZnRfcmJ0cmVlX2luc2VydChjb25zdCBzdHJ1Y3QgbmZ0X3NldCAqc2V0LAogCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZ0X3NldF9lbGVtICplbGVtKQogewotCXN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZTsKLQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OwogCWludCBlcnI7CiAKLQlzaXplID0gc2l6ZW9mKCpyYmUpOwotCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVAgJiYKLQkgICAgIShlbGVtLT5mbGFncyAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpKQotCQlzaXplICs9IHNpemVvZihyYmUtPmRhdGFbMF0pOwotCi0JcmJlID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAocmJlID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmJlLT5mbGFncyA9IGVsZW0tPmZsYWdzOwotCW5mdF9kYXRhX2NvcHkoJnJiZS0+a2V5LCAmZWxlbS0+a2V5KTsKLQlpZiAoc2V0LT5mbGFncyAmIE5GVF9TRVRfTUFQICYmCi0JICAgICEocmJlLT5mbGFncyAmIE5GVF9TRVRfRUxFTV9JTlRFUlZBTF9FTkQpKQotCQluZnRfZGF0YV9jb3B5KHJiZS0+ZGF0YSwgJmVsZW0tPmRhdGEpOwotCiAJc3Bpbl9sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwogCWVyciA9IF9fbmZ0X3JidHJlZV9pbnNlcnQoc2V0LCByYmUpOwotCWlmIChlcnIgPCAwKQotCQlrZnJlZShyYmUpOwotCiAJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0xNDMsNDIgKzEyNSw0OSBAQAogCQkJICAgICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKIHsKIAlzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwotCXN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0gKnJiZSA9IGVsZW0tPmNvb2tpZTsKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OwogCiAJc3Bpbl9sb2NrX2JoKCZuZnRfcmJ0cmVlX2xvY2spOwogCXJiX2VyYXNlKCZyYmUtPm5vZGUsICZwcml2LT5yb290KTsKIAlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQlrZnJlZShyYmUpOwogfQogCi1zdGF0aWMgaW50IG5mdF9yYnRyZWVfZ2V0KGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsIHN0cnVjdCBuZnRfc2V0X2VsZW0gKmVsZW0pCitzdGF0aWMgdm9pZCBuZnRfcmJ0cmVlX2FjdGl2YXRlKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKK3sKKwlzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmUgPSBlbGVtLT5wcml2OworCisJbmZ0X3NldF9lbGVtX2NoYW5nZV9hY3RpdmUoc2V0LCAmcmJlLT5leHQpOworfQorCitzdGF0aWMgdm9pZCAqbmZ0X3JidHJlZV9kZWFjdGl2YXRlKGNvbnN0IHN0cnVjdCBuZnRfc2V0ICpzZXQsCisJCQkJICAgY29uc3Qgc3RydWN0IG5mdF9zZXRfZWxlbSAqZWxlbSkKIHsKIAljb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZSAqcHJpdiA9IG5mdF9zZXRfcHJpdihzZXQpOwogCWNvbnN0IHN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBwcml2LT5yb290LnJiX25vZGU7CiAJc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlOworCXU4IGdlbm1hc2sgPSBuZnRfZ2VubWFza19jdXIocmVhZF9wbmV0KCZzZXQtPnBuZXQpKTsKIAlpbnQgZDsKIAotCXNwaW5fbG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKIAl3aGlsZSAocGFyZW50ICE9IE5VTEwpIHsKIAkJcmJlID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBub2RlKTsKIAotCQlkID0gbmZ0X2RhdGFfY21wKCZyYmUtPmtleSwgJmVsZW0tPmtleSwgc2V0LT5rbGVuKTsKKwkJZCA9IG1lbWNtcChuZnRfc2V0X2V4dF9rZXkoJnJiZS0+ZXh0KSwgJmVsZW0tPmtleS52YWwsCisJCQkJCSAgIHNldC0+a2xlbik7CiAJCWlmIChkIDwgMCkKIAkJCXBhcmVudCA9IHBhcmVudC0+cmJfbGVmdDsKIAkJZWxzZSBpZiAoZCA+IDApCiAJCQlwYXJlbnQgPSBwYXJlbnQtPnJiX3JpZ2h0OwogCQllbHNlIHsKLQkJCWVsZW0tPmNvb2tpZSA9IHJiZTsKLQkJCWlmIChzZXQtPmZsYWdzICYgTkZUX1NFVF9NQVAgJiYKLQkJCSAgICAhKHJiZS0+ZmxhZ3MgJiBORlRfU0VUX0VMRU1fSU5URVJWQUxfRU5EKSkKLQkJCQluZnRfZGF0YV9jb3B5KCZlbGVtLT5kYXRhLCByYmUtPmRhdGEpOwotCQkJZWxlbS0+ZmxhZ3MgPSByYmUtPmZsYWdzOwotCQkJc3Bpbl91bmxvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7Ci0JCQlyZXR1cm4gMDsKKwkJCWlmICghbmZ0X3NldF9lbGVtX2FjdGl2ZSgmcmJlLT5leHQsIGdlbm1hc2spKSB7CisJCQkJcGFyZW50ID0gcGFyZW50LT5yYl9sZWZ0OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbmZ0X3NldF9lbGVtX2NoYW5nZV9hY3RpdmUoc2V0LCAmcmJlLT5leHQpOworCQkJcmV0dXJuIHJiZTsKIAkJfQogCX0KLQlzcGluX3VubG9ja19iaCgmbmZ0X3JidHJlZV9sb2NrKTsKLQlyZXR1cm4gLUVOT0VOVDsKKwlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgbmZ0X3JidHJlZV93YWxrKGNvbnN0IHN0cnVjdCBuZnRfY3R4ICpjdHgsCkBAIC0xODYsMjEgKzE3NSwyMSBAQAogCQkJICAgIHN0cnVjdCBuZnRfc2V0X2l0ZXIgKml0ZXIpCiB7CiAJY29uc3Qgc3RydWN0IG5mdF9yYnRyZWUgKnByaXYgPSBuZnRfc2V0X3ByaXYoc2V0KTsKLQljb25zdCBzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtICpyYmU7CisJc3RydWN0IG5mdF9yYnRyZWVfZWxlbSAqcmJlOwogCXN0cnVjdCBuZnRfc2V0X2VsZW0gZWxlbTsKIAlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKwl1OCBnZW5tYXNrID0gbmZ0X2dlbm1hc2tfY3VyKHJlYWRfcG5ldCgmc2V0LT5wbmV0KSk7CiAKIAlzcGluX2xvY2tfYmgoJm5mdF9yYnRyZWVfbG9jayk7CiAJZm9yIChub2RlID0gcmJfZmlyc3QoJnByaXYtPnJvb3QpOyBub2RlICE9IE5VTEw7IG5vZGUgPSByYl9uZXh0KG5vZGUpKSB7CisJCXJiZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOworCiAJCWlmIChpdGVyLT5jb3VudCA8IGl0ZXItPnNraXApCiAJCQlnb3RvIGNvbnQ7CisJCWlmICghbmZ0X3NldF9lbGVtX2FjdGl2ZSgmcmJlLT5leHQsIGdlbm1hc2spKQorCQkJZ290byBjb250OwogCi0JCXJiZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOwotCQluZnRfZGF0YV9jb3B5KCZlbGVtLmtleSwgJnJiZS0+a2V5KTsKLQkJaWYgKHNldC0+ZmxhZ3MgJiBORlRfU0VUX01BUCAmJgotCQkgICAgIShyYmUtPmZsYWdzICYgTkZUX1NFVF9FTEVNX0lOVEVSVkFMX0VORCkpCi0JCQluZnRfZGF0YV9jb3B5KCZlbGVtLmRhdGEsIHJiZS0+ZGF0YSk7Ci0JCWVsZW0uZmxhZ3MgPSByYmUtPmZsYWdzOworCQllbGVtLnByaXYgPSByYmU7CiAKIAkJaXRlci0+ZXJyID0gaXRlci0+Zm4oY3R4LCBzZXQsIGl0ZXIsICZlbGVtKTsKIAkJaWYgKGl0ZXItPmVyciA8IDApIHsKQEAgLTIzNyw3ICsyMjYsNyBAQAogCXdoaWxlICgobm9kZSA9IHByaXYtPnJvb3QucmJfbm9kZSkgIT0gTlVMTCkgewogCQlyYl9lcmFzZShub2RlLCAmcHJpdi0+cm9vdCk7CiAJCXJiZSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0sIG5vZGUpOwotCQluZnRfcmJ0cmVlX2VsZW1fZGVzdHJveShzZXQsIHJiZSk7CisJCW5mdF9zZXRfZWxlbV9kZXN0cm95KHNldCwgcmJlKTsKIAl9CiB9CiAKQEAgLTI0Nyw5ICsyMzYsNiBAQAogCXVuc2lnbmVkIGludCBuc2l6ZTsKIAogCW5zaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfcmJ0cmVlX2VsZW0pOwotCWlmIChmZWF0dXJlcyAmIE5GVF9TRVRfTUFQKQotCQluc2l6ZSArPSBGSUVMRF9TSVpFT0Yoc3RydWN0IG5mdF9yYnRyZWVfZWxlbSwgZGF0YVswXSk7Ci0KIAlpZiAoZGVzYy0+c2l6ZSkKIAkJZXN0LT5zaXplID0gc2l6ZW9mKHN0cnVjdCBuZnRfcmJ0cmVlKSArIGRlc2MtPnNpemUgKiBuc2l6ZTsKIAllbHNlCkBAIC0yNjIsMTIgKzI0OCwxNCBAQAogCiBzdGF0aWMgc3RydWN0IG5mdF9zZXRfb3BzIG5mdF9yYnRyZWVfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CiAJLnByaXZzaXplCT0gbmZ0X3JidHJlZV9wcml2c2l6ZSwKKwkuZWxlbXNpemUJPSBvZmZzZXRvZihzdHJ1Y3QgbmZ0X3JidHJlZV9lbGVtLCBleHQpLAogCS5lc3RpbWF0ZQk9IG5mdF9yYnRyZWVfZXN0aW1hdGUsCiAJLmluaXQJCT0gbmZ0X3JidHJlZV9pbml0LAogCS5kZXN0cm95CT0gbmZ0X3JidHJlZV9kZXN0cm95LAogCS5pbnNlcnQJCT0gbmZ0X3JidHJlZV9pbnNlcnQsCiAJLnJlbW92ZQkJPSBuZnRfcmJ0cmVlX3JlbW92ZSwKLQkuZ2V0CQk9IG5mdF9yYnRyZWVfZ2V0LAorCS5kZWFjdGl2YXRlCT0gbmZ0X3JidHJlZV9kZWFjdGl2YXRlLAorCS5hY3RpdmF0ZQk9IG5mdF9yYnRyZWVfYWN0aXZhdGUsCiAJLmxvb2t1cAkJPSBuZnRfcmJ0cmVlX2xvb2t1cCwKIAkud2FsawkJPSBuZnRfcmJ0cmVlX3dhbGssCiAJLmZlYXR1cmVzCT0gTkZUX1NFVF9JTlRFUlZBTCB8IE5GVF9TRVRfTUFQLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZnRfcmVkaXIuYyBiL25ldC9uZXRmaWx0ZXIvbmZ0X3JlZGlyLmMKaW5kZXggZDdlOWU5My4uMDNmN2JmNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZnRfcmVkaXIuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mdF9yZWRpci5jCkBAIC00NCwyNSArNDQsMjggQEAKIAkJICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCiB7CiAJc3RydWN0IG5mdF9yZWRpciAqcHJpdiA9IG5mdF9leHByX3ByaXYoZXhwcik7CisJdW5zaWduZWQgaW50IHBsZW47CiAJaW50IGVycjsKIAogCWVyciA9IG5mdF9yZWRpcl92YWxpZGF0ZShjdHgsIGV4cHIsIE5VTEwpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJcGxlbiA9IEZJRUxEX1NJWkVPRihzdHJ1Y3QgbmZfbmF0X3JhbmdlLCBtaW5fYWRkci5hbGwpOwogCWlmICh0YltORlRBX1JFRElSX1JFR19QUk9UT19NSU5dKSB7CiAJCXByaXYtPnNyZWdfcHJvdG9fbWluID0KLQkJCW50b2hsKG5sYV9nZXRfYmUzMih0YltORlRBX1JFRElSX1JFR19QUk9UT19NSU5dKSk7CisJCQluZnRfcGFyc2VfcmVnaXN0ZXIodGJbTkZUQV9SRURJUl9SRUdfUFJPVE9fTUlOXSk7CiAKLQkJZXJyID0gbmZ0X3ZhbGlkYXRlX2lucHV0X3JlZ2lzdGVyKHByaXYtPnNyZWdfcHJvdG9fbWluKTsKKwkJZXJyID0gbmZ0X3ZhbGlkYXRlX3JlZ2lzdGVyX2xvYWQocHJpdi0+c3JlZ19wcm90b19taW4sIHBsZW4pOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CiAKIAkJaWYgKHRiW05GVEFfUkVESVJfUkVHX1BST1RPX01BWF0pIHsKIAkJCXByaXYtPnNyZWdfcHJvdG9fbWF4ID0KLQkJCQludG9obChubGFfZ2V0X2JlMzIodGJbTkZUQV9SRURJUl9SRUdfUFJPVE9fTUFYXSkpOworCQkJCW5mdF9wYXJzZV9yZWdpc3Rlcih0YltORlRBX1JFRElSX1JFR19QUk9UT19NQVhdKTsKIAotCQkJZXJyID0gbmZ0X3ZhbGlkYXRlX2lucHV0X3JlZ2lzdGVyKHByaXYtPnNyZWdfcHJvdG9fbWF4KTsKKwkJCWVyciA9IG5mdF92YWxpZGF0ZV9yZWdpc3Rlcl9sb2FkKHByaXYtPnNyZWdfcHJvdG9fbWF4LAorCQkJCQkJCSBwbGVuKTsKIAkJCWlmIChlcnIgPCAwKQogCQkJCXJldHVybiBlcnI7CiAJCX0gZWxzZSB7CkBAIC04NSwxMSArODgsMTEgQEAKIAljb25zdCBzdHJ1Y3QgbmZ0X3JlZGlyICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKIAogCWlmIChwcml2LT5zcmVnX3Byb3RvX21pbikgewotCQlpZiAobmxhX3B1dF9iZTMyKHNrYiwgTkZUQV9SRURJUl9SRUdfUFJPVE9fTUlOLAotCQkJCSBodG9ubChwcml2LT5zcmVnX3Byb3RvX21pbikpKQorCQlpZiAobmZ0X2R1bXBfcmVnaXN0ZXIoc2tiLCBORlRBX1JFRElSX1JFR19QUk9UT19NSU4sCisJCQkJICAgICAgcHJpdi0+c3JlZ19wcm90b19taW4pKQogCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7Ci0JCWlmIChubGFfcHV0X2JlMzIoc2tiLCBORlRBX1JFRElSX1JFR19QUk9UT19NQVgsCi0JCQkJIGh0b25sKHByaXYtPnNyZWdfcHJvdG9fbWF4KSkpCisJCWlmIChuZnRfZHVtcF9yZWdpc3Rlcihza2IsIE5GVEFfUkVESVJfUkVHX1BST1RPX01BWCwKKwkJCQkgICAgICBwcml2LT5zcmVnX3Byb3RvX21heCkpCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pbmV0LmMgYi9uZXQvbmV0ZmlsdGVyL25mdF9yZWplY3RfaW5ldC5jCmluZGV4IDdiNWY5ZDUuLjYyY2FiZWUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZ0X3JlamVjdF9pbmV0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZnRfcmVqZWN0X2luZXQuYwpAQCAtMTgsNyArMTgsNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2Ni9uZl9yZWplY3QuaD4KIAogc3RhdGljIHZvaWQgbmZ0X3JlamVjdF9pbmV0X2V2YWwoY29uc3Qgc3RydWN0IG5mdF9leHByICpleHByLAotCQkJCSBzdHJ1Y3QgbmZ0X2RhdGEgZGF0YVtORlRfUkVHX01BWCArIDFdLAorCQkJCSBzdHJ1Y3QgbmZ0X3JlZ3MgKnJlZ3MsCiAJCQkJIGNvbnN0IHN0cnVjdCBuZnRfcGt0aW5mbyAqcGt0KQogewogCXN0cnVjdCBuZnRfcmVqZWN0ICpwcml2ID0gbmZ0X2V4cHJfcHJpdihleHByKTsKQEAgLTI4LDE0ICsyOCwxNiBAQAogCWNhc2UgTkZQUk9UT19JUFY0OgogCQlzd2l0Y2ggKHByaXYtPnR5cGUpIHsKIAkJY2FzZSBORlRfUkVKRUNUX0lDTVBfVU5SRUFDSDoKLQkJCW5mX3NlbmRfdW5yZWFjaChwa3QtPnNrYiwgcHJpdi0+aWNtcF9jb2RlKTsKKwkJCW5mX3NlbmRfdW5yZWFjaChwa3QtPnNrYiwgcHJpdi0+aWNtcF9jb2RlLAorCQkJCQlwa3QtPm9wcy0+aG9va251bSk7CiAJCQlicmVhazsKIAkJY2FzZSBORlRfUkVKRUNUX1RDUF9SU1Q6CiAJCQluZl9zZW5kX3Jlc2V0KHBrdC0+c2tiLCBwa3QtPm9wcy0+aG9va251bSk7CiAJCQlicmVhazsKIAkJY2FzZSBORlRfUkVKRUNUX0lDTVBYX1VOUkVBQ0g6CiAJCQluZl9zZW5kX3VucmVhY2gocGt0LT5za2IsCi0JCQkJCW5mdF9yZWplY3RfaWNtcF9jb2RlKHByaXYtPmljbXBfY29kZSkpOworCQkJCQluZnRfcmVqZWN0X2ljbXBfY29kZShwcml2LT5pY21wX2NvZGUpLAorCQkJCQlwa3QtPm9wcy0+aG9va251bSk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKQEAgLTU2LDcgKzU4LDggQEAKIAkJfQogCQlicmVhazsKIAl9Ci0JZGF0YVtORlRfUkVHX1ZFUkRJQ1RdLnZlcmRpY3QgPSBORl9EUk9QOworCisJcmVncy0+dmVyZGljdC5jb2RlID0gTkZfRFJPUDsKIH0KIAogc3RhdGljIGludCBuZnRfcmVqZWN0X2luZXRfaW5pdChjb25zdCBzdHJ1Y3QgbmZ0X2N0eCAqY3R4LApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9UUFJPWFkuYyBiL25ldC9uZXRmaWx0ZXIveHRfVFBST1hZLmMKaW5kZXggZWY4YTkyNi4uY2NhOTZjZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9UUFJPWFkuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X1RQUk9YWS5jCkBAIC00MiwxNSArNDIsMjEgQEAKIAogc3RhdGljIGJvb2wgdHByb3h5X3NrX2lzX3RyYW5zcGFyZW50KHN0cnVjdCBzb2NrICpzaykKIHsKLQlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9USU1FX1dBSVQpIHsKLQkJaWYgKGluZXRfc2soc2spLT50cmFuc3BhcmVudCkKLQkJCXJldHVybiB0cnVlOwotCQlzb2NrX3B1dChzayk7Ci0JfSBlbHNlIHsKKwlzd2l0Y2ggKHNrLT5za19zdGF0ZSkgeworCWNhc2UgVENQX1RJTUVfV0FJVDoKIAkJaWYgKGluZXRfdHdzayhzayktPnR3X3RyYW5zcGFyZW50KQogCQkJcmV0dXJuIHRydWU7Ci0JCWluZXRfdHdza19wdXQoaW5ldF90d3NrKHNrKSk7CisJCWJyZWFrOworCWNhc2UgVENQX05FV19TWU5fUkVDVjoKKwkJaWYgKGluZXRfcnNrKGluZXRfcmVxc2soc2spKS0+bm9fc3JjY2hlY2spCisJCQlyZXR1cm4gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGluZXRfc2soc2spLT50cmFuc3BhcmVudCkKKwkJCXJldHVybiB0cnVlOwogCX0KKworCXNvY2tfZ2VuX3B1dChzayk7CiAJcmV0dXJuIGZhbHNlOwogfQogCkBAIC0yNjYsNyArMjcyLDcgQEAKIAkJCQkJICAgIGhwLT5zb3VyY2UsIGxwb3J0ID8gbHBvcnQgOiBocC0+ZGVzdCwKIAkJCQkJICAgIHNrYi0+ZGV2LCBORlRfTE9PS1VQX0xJU1RFTkVSKTsKIAkJaWYgKHNrMikgewotCQkJaW5ldF90d3NrX2Rlc2NoZWR1bGUoaW5ldF90d3NrKHNrKSwgJnRjcF9kZWF0aF9yb3cpOworCQkJaW5ldF90d3NrX2Rlc2NoZWR1bGUoaW5ldF90d3NrKHNrKSk7CiAJCQlpbmV0X3R3c2tfcHV0KGluZXRfdHdzayhzaykpOwogCQkJc2sgPSBzazI7CiAJCX0KQEAgLTQzMSw3ICs0MzcsNyBAQAogCQkJCQkgICAgdGdpLT5scG9ydCA/IHRnaS0+bHBvcnQgOiBocC0+ZGVzdCwKIAkJCQkJICAgIHNrYi0+ZGV2LCBORlRfTE9PS1VQX0xJU1RFTkVSKTsKIAkJaWYgKHNrMikgewotCQkJaW5ldF90d3NrX2Rlc2NoZWR1bGUoaW5ldF90d3NrKHNrKSwgJnRjcF9kZWF0aF9yb3cpOworCQkJaW5ldF90d3NrX2Rlc2NoZWR1bGUoaW5ldF90d3NrKHNrKSk7CiAJCQlpbmV0X3R3c2tfcHV0KGluZXRfdHdzayhzaykpOwogCQkJc2sgPSBzazI7CiAJCX0KQEAgLTUxMyw4ICs1MTksOCBAQAogewogCWNvbnN0IHN0cnVjdCBpcDZ0X2lwNiAqaSA9IHBhci0+ZW50cnlpbmZvOwogCi0JaWYgKChpLT5wcm90byA9PSBJUFBST1RPX1RDUCB8fCBpLT5wcm90byA9PSBJUFBST1RPX1VEUCkKLQkgICAgJiYgIShpLT5mbGFncyAmIElQNlRfSU5WX1BST1RPKSkKKwlpZiAoKGktPnByb3RvID09IElQUFJPVE9fVENQIHx8IGktPnByb3RvID09IElQUFJPVE9fVURQKSAmJgorCSAgICAhKGktPmludmZsYWdzICYgSVA2VF9JTlZfUFJPVE8pKQogCQlyZXR1cm4gMDsKIAogCXByX2luZm8oIkNhbiBiZSB1c2VkIG9ubHkgaW4gY29tYmluYXRpb24gd2l0aCAiCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nncm91cC5jIGIvbmV0L25ldGZpbHRlci94dF9jZ3JvdXAuYwppbmRleCA3MTk4ZDY2Li5hMWQxMjZmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nncm91cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY2dyb3VwLmMKQEAgLTM5LDcgKzM5LDcgQEAKIHsKIAljb25zdCBzdHJ1Y3QgeHRfY2dyb3VwX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKIAotCWlmIChza2ItPnNrID09IE5VTEwpCisJaWYgKHNrYi0+c2sgPT0gTlVMTCB8fCAhc2tfZnVsbHNvY2soc2tiLT5zaykpCiAJCXJldHVybiBmYWxzZTsKIAogCXJldHVybiAoaW5mby0+aWQgPT0gc2tiLT5zay0+c2tfY2xhc3NpZCkgXiBpbmZvLT5pbnZlcnQ7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X3BoeXNkZXYuYyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCmluZGV4IGY0NDBmNTcuLjFjYWFjY2IgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfcGh5c2Rldi5jCkBAIC0yNSwxNiArMjUsMTUgQEAKIHN0YXRpYyBib29sCiBwaHlzZGV2X210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKIHsKLQlzdGF0aWMgY29uc3QgY2hhciBudWxsZGV2bmFtZVtJRk5BTVNJWl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2YobG9uZykpKSk7CiAJY29uc3Qgc3RydWN0IHh0X3BoeXNkZXZfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpwaHlzZGV2OwogCXVuc2lnbmVkIGxvbmcgcmV0OwogCWNvbnN0IGNoYXIgKmluZGV2LCAqb3V0ZGV2OwotCWNvbnN0IHN0cnVjdCBuZl9icmlkZ2VfaW5mbyAqbmZfYnJpZGdlOwogCiAJLyogTm90IGEgYnJpZGdlZCBJUCBwYWNrZXQgb3Igbm8gaW5mbyBhdmFpbGFibGUgeWV0OgogCSAqIExPQ0FMX09VVC9tYW5nbGUgYW5kIExPQ0FMX09VVC9uYXQgZG9uJ3Qga25vdyBpZgogCSAqIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2Ugd2lsbCBiZSBhIGJyaWRnZS4gKi8KLQlpZiAoIShuZl9icmlkZ2UgPSBza2ItPm5mX2JyaWRnZSkpIHsKKwlpZiAoIXNrYi0+bmZfYnJpZGdlKSB7CiAJCS8qIFJldHVybiBNQVRDSCBpZiB0aGUgaW52ZXJ0IGZsYWdzIG9mIHRoZSB1c2VkIG9wdGlvbnMgYXJlIG9uICovCiAJCWlmICgoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfQlJJREdFRCkgJiYKIAkJICAgICEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9CUklER0VEKSkKQEAgLTU0LDMxICs1Myw0MSBAQAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKKwlwaHlzZGV2ID0gbmZfYnJpZGdlX2dldF9waHlzb3V0ZGV2KHNrYik7CisJb3V0ZGV2ID0gcGh5c2RldiA/IHBoeXNkZXYtPm5hbWUgOiBOVUxMOworCiAJLyogVGhpcyBvbmx5IG1ha2VzIHNlbnNlIGluIHRoZSBGT1JXQVJEIGFuZCBQT1NUUk9VVElORyBjaGFpbnMgKi8KIAlpZiAoKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0JSSURHRUQpICYmCi0JICAgICghIShuZl9icmlkZ2UtPm1hc2sgJiBCUk5GX0JSSURHRUQpIF4KLQkgICAgIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0JSSURHRUQpKSkKKwkgICAgKCEhb3V0ZGV2IF4gIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX0JSSURHRUQpKSkKIAkJcmV0dXJuIGZhbHNlOwogCisJcGh5c2RldiA9IG5mX2JyaWRnZV9nZXRfcGh5c2luZGV2KHNrYik7CisJaW5kZXYgPSBwaHlzZGV2ID8gcGh5c2Rldi0+bmFtZSA6IE5VTEw7CisKIAlpZiAoKGluZm8tPmJpdG1hc2sgJiBYVF9QSFlTREVWX09QX0lTSU4gJiYKLQkgICAgKCFuZl9icmlkZ2UtPnBoeXNpbmRldiBeICEhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfSVNJTikpKSB8fAorCSAgICAoIWluZGV2IF4gISEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9JU0lOKSkpIHx8CiAJICAgIChpbmZvLT5iaXRtYXNrICYgWFRfUEhZU0RFVl9PUF9JU09VVCAmJgotCSAgICAoIW5mX2JyaWRnZS0+cGh5c291dGRldiBeICEhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfSVNPVVQpKSkpCisJICAgICghb3V0ZGV2IF4gISEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9JU09VVCkpKSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKCEoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfSU4pKQogCQlnb3RvIG1hdGNoX291dGRldjsKLQlpbmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2ID8gbmZfYnJpZGdlLT5waHlzaW5kZXYtPm5hbWUgOiBudWxsZGV2bmFtZTsKLQlyZXQgPSBpZm5hbWVfY29tcGFyZV9hbGlnbmVkKGluZGV2LCBpbmZvLT5waHlzaW5kZXYsIGluZm8tPmluX21hc2spOwogCi0JaWYgKCFyZXQgXiAhKGluZm8tPmludmVydCAmIFhUX1BIWVNERVZfT1BfSU4pKQotCQlyZXR1cm4gZmFsc2U7CisJaWYgKGluZGV2KSB7CisJCXJldCA9IGlmbmFtZV9jb21wYXJlX2FsaWduZWQoaW5kZXYsIGluZm8tPnBoeXNpbmRldiwKKwkJCQkJICAgICBpbmZvLT5pbl9tYXNrKTsKKworCQlpZiAoIXJldCBeICEoaW5mby0+aW52ZXJ0ICYgWFRfUEhZU0RFVl9PUF9JTikpCisJCQlyZXR1cm4gZmFsc2U7CisJfQogCiBtYXRjaF9vdXRkZXY6CiAJaWYgKCEoaW5mby0+Yml0bWFzayAmIFhUX1BIWVNERVZfT1BfT1VUKSkKIAkJcmV0dXJuIHRydWU7Ci0Jb3V0ZGV2ID0gbmZfYnJpZGdlLT5waHlzb3V0ZGV2ID8KLQkJIG5mX2JyaWRnZS0+cGh5c291dGRldi0+bmFtZSA6IG51bGxkZXZuYW1lOworCisJaWYgKCFvdXRkZXYpCisJCXJldHVybiBmYWxzZTsKKwogCXJldCA9IGlmbmFtZV9jb21wYXJlX2FsaWduZWQob3V0ZGV2LCBpbmZvLT5waHlzb3V0ZGV2LCBpbmZvLT5vdXRfbWFzayk7CiAKIAlyZXR1cm4gKCEhcmV0IF4gIShpbmZvLT5pbnZlcnQgJiBYVF9QSFlTREVWX09QX09VVCkpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9zZXQuYyBiL25ldC9uZXRmaWx0ZXIveHRfc2V0LmMKaW5kZXggMGQ0N2FmZS4uODkwNDU5OCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9zZXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X3NldC5jCkBAIC0xOTMsNyArMTkzLDcgQEAKIAkJcmV0dXJuIHJldDsKIAogCWlmICghbWF0Y2hfY291bnRlcjAob3B0LmV4dC5wYWNrZXRzLCAmaW5mby0+cGFja2V0cykpCi0JCXJldHVybiAwOworCQlyZXR1cm4gZmFsc2U7CiAJcmV0dXJuIG1hdGNoX2NvdW50ZXIwKG9wdC5leHQuYnl0ZXMsICZpbmZvLT5ieXRlcyk7CiB9CiAKQEAgLTIzOSw3ICsyMzksNyBAQAogCQlyZXR1cm4gcmV0OwogCiAJaWYgKCFtYXRjaF9jb3VudGVyKG9wdC5leHQucGFja2V0cywgJmluZm8tPnBhY2tldHMpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCXJldHVybiBtYXRjaF9jb3VudGVyKG9wdC5leHQuYnl0ZXMsICZpbmZvLT5ieXRlcyk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3NvY2tldC5jCmluZGV4IDEzMzMyZGIuLmUwOTJjYjAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zb2NrZXQuYwpAQCAtMTI5LDEzICsxMjksMjQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGJvb2wKLXNvY2tldF9tYXRjaChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIsCi0JICAgICBjb25zdCBzdHJ1Y3QgeHRfc29ja2V0X210aW5mbzEgKmluZm8pCitzdGF0aWMgYm9vbCB4dF9zb2NrZXRfc2tfaXNfdHJhbnNwYXJlbnQoc3RydWN0IHNvY2sgKnNrKQoreworCXN3aXRjaCAoc2stPnNrX3N0YXRlKSB7CisJY2FzZSBUQ1BfVElNRV9XQUlUOgorCQlyZXR1cm4gaW5ldF90d3NrKHNrKS0+dHdfdHJhbnNwYXJlbnQ7CisKKwljYXNlIFRDUF9ORVdfU1lOX1JFQ1Y6CisJCXJldHVybiBpbmV0X3JzayhpbmV0X3JlcXNrKHNrKSktPm5vX3NyY2NoZWNrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIGluZXRfc2soc2spLT50cmFuc3BhcmVudDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqeHRfc29ja2V0X2xvb2t1cF9zbG93X3Y0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2KQogewogCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7Ci0Jc3RydWN0IHVkcGhkciBfaGRyLCAqaHAgPSBOVUxMOwotCXN0cnVjdCBzb2NrICpzayA9IHNrYi0+c2s7CiAJX19iZTMyIHVuaW5pdGlhbGl6ZWRfdmFyKGRhZGRyKSwgdW5pbml0aWFsaXplZF92YXIoc2FkZHIpOwogCV9fYmUxNiB1bmluaXRpYWxpemVkX3ZhcihkcG9ydCksIHVuaW5pdGlhbGl6ZWRfdmFyKHNwb3J0KTsKIAl1OCB1bmluaXRpYWxpemVkX3Zhcihwcm90b2NvbCk7CkBAIC0xNDUsMTAgKzE1NiwxMiBAQAogI2VuZGlmCiAKIAlpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX1VEUCB8fCBpcGgtPnByb3RvY29sID09IElQUFJPVE9fVENQKSB7CisJCXN0cnVjdCB1ZHBoZHIgX2hkciwgKmhwOworCiAJCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgaXBfaGRybGVuKHNrYiksCiAJCQkJCXNpemVvZihfaGRyKSwgJl9oZHIpOwogCQlpZiAoaHAgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKKwkJCXJldHVybiBOVUxMOwogCiAJCXByb3RvY29sID0gaXBoLT5wcm90b2NvbDsKIAkJc2FkZHIgPSBpcGgtPnNhZGRyOwpAQCAtMTU4LDE2ICsxNzEsMTcgQEAKIAogCX0gZWxzZSBpZiAoaXBoLT5wcm90b2NvbCA9PSBJUFBST1RPX0lDTVApIHsKIAkJaWYgKGV4dHJhY3RfaWNtcDRfZmllbGRzKHNrYiwgJnByb3RvY29sLCAmc2FkZHIsICZkYWRkciwKLQkJCQkJJnNwb3J0LCAmZHBvcnQpKQotCQkJcmV0dXJuIGZhbHNlOworCQkJCQkgJnNwb3J0LCAmZHBvcnQpKQorCQkJcmV0dXJuIE5VTEw7CiAJfSBlbHNlIHsKLQkJcmV0dXJuIGZhbHNlOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKICNpZmRlZiBYVF9TT0NLRVRfSEFWRV9DT05OVFJBQ0sKLQkvKiBEbyB0aGUgbG9va3VwIHdpdGggdGhlIG9yaWdpbmFsIHNvY2tldCBhZGRyZXNzIGluIGNhc2UgdGhpcyBpcyBhCi0JICogcmVwbHkgcGFja2V0IG9mIGFuIGVzdGFibGlzaGVkIFNOQVQtdGVkIGNvbm5lY3Rpb24uICovCi0KKwkvKiBEbyB0aGUgbG9va3VwIHdpdGggdGhlIG9yaWdpbmFsIHNvY2tldCBhZGRyZXNzIGluCisJICogY2FzZSB0aGlzIGlzIGEgcmVwbHkgcGFja2V0IG9mIGFuIGVzdGFibGlzaGVkCisJICogU05BVC10ZWQgY29ubmVjdGlvbi4KKwkgKi8KIAljdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwogCWlmIChjdCAmJiAhbmZfY3RfaXNfdW50cmFja2VkKGN0KSAmJgogCSAgICAoKGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19JQ01QICYmCkBAIC0xODMsMTAgKzE5NywxOCBAQAogCX0KICNlbmRpZgogCisJcmV0dXJuIHh0X3NvY2tldF9nZXRfc29ja192NChkZXZfbmV0KHNrYi0+ZGV2KSwgcHJvdG9jb2wsIHNhZGRyLCBkYWRkciwKKwkJCQkgICAgIHNwb3J0LCBkcG9ydCwgaW5kZXYpOworfQorCitzdGF0aWMgYm9vbAorc29ja2V0X21hdGNoKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhciwKKwkgICAgIGNvbnN0IHN0cnVjdCB4dF9zb2NrZXRfbXRpbmZvMSAqaW5mbykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBza2ItPnNrOworCiAJaWYgKCFzaykKLQkJc2sgPSB4dF9zb2NrZXRfZ2V0X3NvY2tfdjQoZGV2X25ldChza2ItPmRldiksIHByb3RvY29sLAotCQkJCQkgICBzYWRkciwgZGFkZHIsIHNwb3J0LCBkcG9ydCwKLQkJCQkJICAgcGFyLT5pbik7CisJCXNrID0geHRfc29ja2V0X2xvb2t1cF9zbG93X3Y0KHNrYiwgcGFyLT5pbik7CiAJaWYgKHNrKSB7CiAJCWJvb2wgd2lsZGNhcmQ7CiAJCWJvb2wgdHJhbnNwYXJlbnQgPSB0cnVlOwpAQCAtMTk1LDE2ICsyMTcsMTQgQEAKIAkJICogdW5sZXNzIFhUX1NPQ0tFVF9OT1dJTERDQVJEIGlzIHNldAogCQkgKi8KIAkJd2lsZGNhcmQgPSAoIShpbmZvLT5mbGFncyAmIFhUX1NPQ0tFVF9OT1dJTERDQVJEKSAmJgotCQkJICAgIHNrLT5za19zdGF0ZSAhPSBUQ1BfVElNRV9XQUlUICYmCisJCQkgICAgc2tfZnVsbHNvY2soc2spICYmCiAJCQkgICAgaW5ldF9zayhzayktPmluZXRfcmN2X3NhZGRyID09IDApOwogCiAJCS8qIElnbm9yZSBub24tdHJhbnNwYXJlbnQgc29ja2V0cywKLQkJICAgaWYgWFRfU09DS0VUX1RSQU5TUEFSRU5UIGlzIHVzZWQgKi8KKwkJICogaWYgWFRfU09DS0VUX1RSQU5TUEFSRU5UIGlzIHVzZWQKKwkJICovCiAJCWlmIChpbmZvLT5mbGFncyAmIFhUX1NPQ0tFVF9UUkFOU1BBUkVOVCkKLQkJCXRyYW5zcGFyZW50ID0gKChzay0+c2tfc3RhdGUgIT0gVENQX1RJTUVfV0FJVCAmJgotCQkJCQlpbmV0X3NrKHNrKS0+dHJhbnNwYXJlbnQpIHx8Ci0JCQkJICAgICAgIChzay0+c2tfc3RhdGUgPT0gVENQX1RJTUVfV0FJVCAmJgotCQkJCQlpbmV0X3R3c2soc2spLT50d190cmFuc3BhcmVudCkpOworCQkJdHJhbnNwYXJlbnQgPSB4dF9zb2NrZXRfc2tfaXNfdHJhbnNwYXJlbnQoc2spOwogCiAJCWlmIChzayAhPSBza2ItPnNrKQogCQkJc29ja19nZW5fcHV0KHNrKTsKQEAgLTIxMywxMiArMjMzLDcgQEAKIAkJCXNrID0gTlVMTDsKIAl9CiAKLQlwcl9kZWJ1ZygicHJvdG8gJWhodSAlcEk0OiVodSAtPiAlcEk0OiVodSAob3JpZyAlcEk0OiVodSkgc29jayAlcFxuIiwKLQkJIHByb3RvY29sLCAmc2FkZHIsIG50b2hzKHNwb3J0KSwKLQkJICZkYWRkciwgbnRvaHMoZHBvcnQpLAotCQkgJmlwaC0+ZGFkZHIsIGhwID8gbnRvaHMoaHAtPmRlc3QpIDogMCwgc2spOwotCi0JcmV0dXJuIChzayAhPSBOVUxMKTsKKwlyZXR1cm4gc2sgIT0gTlVMTDsKIH0KIAogc3RhdGljIGJvb2wKQEAgLTMxNSwyOCArMzMwLDI2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBib29sCi1zb2NrZXRfbXQ2X3YxX3YyKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKK3N0YXRpYyBzdHJ1Y3Qgc29jayAqeHRfc29ja2V0X2xvb2t1cF9zbG93X3Y2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluZGV2KQogewotCXN0cnVjdCBpcHY2aGRyIGlwdjZfdmFyLCAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKLQlzdHJ1Y3QgdWRwaGRyIF9oZHIsICpocCA9IE5VTEw7Ci0Jc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKLQljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyID0gTlVMTCwgKnNhZGRyID0gTlVMTDsKIAlfX2JlMTYgdW5pbml0aWFsaXplZF92YXIoZHBvcnQpLCB1bmluaXRpYWxpemVkX3ZhcihzcG9ydCk7Ci0JaW50IHRob2ZmID0gMCwgdW5pbml0aWFsaXplZF92YXIodHByb3RvKTsKLQljb25zdCBzdHJ1Y3QgeHRfc29ja2V0X210aW5mbzEgKmluZm8gPSAoc3RydWN0IHh0X3NvY2tldF9tdGluZm8xICopIHBhci0+bWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIgPSBOVUxMLCAqc2FkZHIgPSBOVUxMOworCXN0cnVjdCBpcHY2aGRyICppcGggPSBpcHY2X2hkcihza2IpOworCWludCB0aG9mZiA9IDAsIHRwcm90bzsKIAogCXRwcm90byA9IGlwdjZfZmluZF9oZHIoc2tiLCAmdGhvZmYsIC0xLCBOVUxMLCBOVUxMKTsKIAlpZiAodHByb3RvIDwgMCkgewogCQlwcl9kZWJ1ZygidW5hYmxlIHRvIGZpbmQgdHJhbnNwb3J0IGhlYWRlciBpbiBJUHY2IHBhY2tldCwgZHJvcHBpbmdcbiIpOwotCQlyZXR1cm4gTkZfRFJPUDsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCiAJaWYgKHRwcm90byA9PSBJUFBST1RPX1VEUCB8fCB0cHJvdG8gPT0gSVBQUk9UT19UQ1ApIHsKLQkJaHAgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCB0aG9mZiwKLQkJCQkJc2l6ZW9mKF9oZHIpLCAmX2hkcik7CisJCXN0cnVjdCB1ZHBoZHIgX2hkciwgKmhwOworCisJCWhwID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgdGhvZmYsIHNpemVvZihfaGRyKSwgJl9oZHIpOwogCQlpZiAoaHAgPT0gTlVMTCkKLQkJCXJldHVybiBmYWxzZTsKKwkJCXJldHVybiBOVUxMOwogCiAJCXNhZGRyID0gJmlwaC0+c2FkZHI7CiAJCXNwb3J0ID0gaHAtPnNvdXJjZTsKQEAgLTM0NCwxNyArMzU3LDI3IEBACiAJCWRwb3J0ID0gaHAtPmRlc3Q7CiAKIAl9IGVsc2UgaWYgKHRwcm90byA9PSBJUFBST1RPX0lDTVBWNikgeworCQlzdHJ1Y3QgaXB2NmhkciBpcHY2X3ZhcjsKKwogCQlpZiAoZXh0cmFjdF9pY21wNl9maWVsZHMoc2tiLCB0aG9mZiwgJnRwcm90bywgJnNhZGRyLCAmZGFkZHIsCiAJCQkJCSAmc3BvcnQsICZkcG9ydCwgJmlwdjZfdmFyKSkKLQkJCXJldHVybiBmYWxzZTsKKwkJCXJldHVybiBOVUxMOwogCX0gZWxzZSB7Ci0JCXJldHVybiBmYWxzZTsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCisJcmV0dXJuIHh0X3NvY2tldF9nZXRfc29ja192NihkZXZfbmV0KHNrYi0+ZGV2KSwgdHByb3RvLCBzYWRkciwgZGFkZHIsCisJCQkJICAgICBzcG9ydCwgZHBvcnQsIGluZGV2KTsKK30KKworc3RhdGljIGJvb2wKK3NvY2tldF9tdDZfdjFfdjIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9zb2NrZXRfbXRpbmZvMSAqaW5mbyA9IChzdHJ1Y3QgeHRfc29ja2V0X210aW5mbzEgKikgcGFyLT5tYXRjaGluZm87CisJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKKwogCWlmICghc2spCi0JCXNrID0geHRfc29ja2V0X2dldF9zb2NrX3Y2KGRldl9uZXQoc2tiLT5kZXYpLCB0cHJvdG8sCi0JCQkJCSAgIHNhZGRyLCBkYWRkciwgc3BvcnQsIGRwb3J0LAotCQkJCQkgICBwYXItPmluKTsKKwkJc2sgPSB4dF9zb2NrZXRfbG9va3VwX3Nsb3dfdjYoc2tiLCBwYXItPmluKTsKIAlpZiAoc2spIHsKIAkJYm9vbCB3aWxkY2FyZDsKIAkJYm9vbCB0cmFuc3BhcmVudCA9IHRydWU7CkBAIC0zNjMsMTYgKzM4NiwxNCBAQAogCQkgKiB1bmxlc3MgWFRfU09DS0VUX05PV0lMRENBUkQgaXMgc2V0CiAJCSAqLwogCQl3aWxkY2FyZCA9ICghKGluZm8tPmZsYWdzICYgWFRfU09DS0VUX05PV0lMRENBUkQpICYmCi0JCQkgICAgc2stPnNrX3N0YXRlICE9IFRDUF9USU1FX1dBSVQgJiYKKwkJCSAgICBza19mdWxsc29jayhzaykgJiYKIAkJCSAgICBpcHY2X2FkZHJfYW55KCZzay0+c2tfdjZfcmN2X3NhZGRyKSk7CiAKIAkJLyogSWdub3JlIG5vbi10cmFuc3BhcmVudCBzb2NrZXRzLAotCQkgICBpZiBYVF9TT0NLRVRfVFJBTlNQQVJFTlQgaXMgdXNlZCAqLworCQkgKiBpZiBYVF9TT0NLRVRfVFJBTlNQQVJFTlQgaXMgdXNlZAorCQkgKi8KIAkJaWYgKGluZm8tPmZsYWdzICYgWFRfU09DS0VUX1RSQU5TUEFSRU5UKQotCQkJdHJhbnNwYXJlbnQgPSAoKHNrLT5za19zdGF0ZSAhPSBUQ1BfVElNRV9XQUlUICYmCi0JCQkJCWluZXRfc2soc2spLT50cmFuc3BhcmVudCkgfHwKLQkJCQkgICAgICAgKHNrLT5za19zdGF0ZSA9PSBUQ1BfVElNRV9XQUlUICYmCi0JCQkJCWluZXRfdHdzayhzayktPnR3X3RyYW5zcGFyZW50KSk7CisJCQl0cmFuc3BhcmVudCA9IHh0X3NvY2tldF9za19pc190cmFuc3BhcmVudChzayk7CiAKIAkJaWYgKHNrICE9IHNrYi0+c2spCiAJCQlzb2NrX2dlbl9wdXQoc2spOwpAQCAtMzgxLDEzICs0MDIsNyBAQAogCQkJc2sgPSBOVUxMOwogCX0KIAotCXByX2RlYnVnKCJwcm90byAlaGhkICVwSTY6JWh1IC0+ICVwSTY6JWh1ICIKLQkJICIob3JpZyAlcEk2OiVodSkgc29jayAlcFxuIiwKLQkJIHRwcm90bywgc2FkZHIsIG50b2hzKHNwb3J0KSwKLQkJIGRhZGRyLCBudG9ocyhkcG9ydCksCi0JCSAmaXBoLT5kYWRkciwgaHAgPyBudG9ocyhocC0+ZGVzdCkgOiAwLCBzayk7Ci0KLQlyZXR1cm4gKHNrICE9IE5VTEwpOworCXJldHVybiBzayAhPSBOVUxMOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc3RyaW5nLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3N0cmluZy5jCmluZGV4IDU2OTlhZGIuLjBiYzM0NjAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfc3RyaW5nLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zdHJpbmcuYwpAQCAtMjYsMTMgKzI2LDEyIEBACiBzdHJpbmdfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQogewogCWNvbnN0IHN0cnVjdCB4dF9zdHJpbmdfaW5mbyAqY29uZiA9IHBhci0+bWF0Y2hpbmZvOwotCXN0cnVjdCB0c19zdGF0ZSBzdGF0ZTsKIAlib29sIGludmVydDsKIAogCWludmVydCA9IGNvbmYtPnUudjEuZmxhZ3MgJiBYVF9TVFJJTkdfRkxBR19JTlZFUlQ7CiAKIAlyZXR1cm4gKHNrYl9maW5kX3RleHQoKHN0cnVjdCBza19idWZmICopc2tiLCBjb25mLT5mcm9tX29mZnNldCwKLQkJCSAgICAgY29uZi0+dG9fb2Zmc2V0LCBjb25mLT5jb25maWcsICZzdGF0ZSkKKwkJCSAgICAgY29uZi0+dG9fb2Zmc2V0LCBjb25mLT5jb25maWcpCiAJCQkgICAgICE9IFVJTlRfTUFYKSBeIGludmVydDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX21nbXQuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9tZ210LmMKaW5kZXggNzA0NDA3NC4uMTNmNzc3ZiAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX21nbXQuYworKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfbWdtdC5jCkBAIC0yOTMsMTUgKzI5MywxMyBAQAogCQkJCXJldHVybiAtRU5PTUVNOwogCiAJCQlhZGRyX3N0cnVjdC5zX2FkZHIgPSBpdGVyNC0+YWRkcjsKLQkJCXJldF92YWwgPSBubGFfcHV0KHNrYiwgTkxCTF9NR01UX0FfSVBWNEFERFIsCi0JCQkJCSAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwKLQkJCQkJICAmYWRkcl9zdHJ1Y3QpOworCQkJcmV0X3ZhbCA9IG5sYV9wdXRfaW5fYWRkcihza2IsIE5MQkxfTUdNVF9BX0lQVjRBRERSLAorCQkJCQkJICBhZGRyX3N0cnVjdC5zX2FkZHIpOwogCQkJaWYgKHJldF92YWwgIT0gMCkKIAkJCQlyZXR1cm4gcmV0X3ZhbDsKIAkJCWFkZHJfc3RydWN0LnNfYWRkciA9IGl0ZXI0LT5tYXNrOwotCQkJcmV0X3ZhbCA9IG5sYV9wdXQoc2tiLCBOTEJMX01HTVRfQV9JUFY0TUFTSywKLQkJCQkJICBzaXplb2Yoc3RydWN0IGluX2FkZHIpLAotCQkJCQkgICZhZGRyX3N0cnVjdCk7CisJCQlyZXRfdmFsID0gbmxhX3B1dF9pbl9hZGRyKHNrYiwgTkxCTF9NR01UX0FfSVBWNE1BU0ssCisJCQkJCQkgIGFkZHJfc3RydWN0LnNfYWRkcik7CiAJCQlpZiAocmV0X3ZhbCAhPSAwKQogCQkJCXJldHVybiByZXRfdmFsOwogCQkJbWFwNCA9IG5ldGxibF9kb21oc2hfYWRkcjRfZW50cnkoaXRlcjQpOwpAQCAtMzI4LDE0ICszMjYsMTIgQEAKIAkJCWlmIChubGFfYiA9PSBOVUxMKQogCQkJCXJldHVybiAtRU5PTUVNOwogCi0JCQlyZXRfdmFsID0gbmxhX3B1dChza2IsIE5MQkxfTUdNVF9BX0lQVjZBRERSLAotCQkJCQkgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAotCQkJCQkgICZpdGVyNi0+YWRkcik7CisJCQlyZXRfdmFsID0gbmxhX3B1dF9pbjZfYWRkcihza2IsIE5MQkxfTUdNVF9BX0lQVjZBRERSLAorCQkJCQkJICAgJml0ZXI2LT5hZGRyKTsKIAkJCWlmIChyZXRfdmFsICE9IDApCiAJCQkJcmV0dXJuIHJldF92YWw7Ci0JCQlyZXRfdmFsID0gbmxhX3B1dChza2IsIE5MQkxfTUdNVF9BX0lQVjZNQVNLLAotCQkJCQkgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAotCQkJCQkgICZpdGVyNi0+bWFzayk7CisJCQlyZXRfdmFsID0gbmxhX3B1dF9pbjZfYWRkcihza2IsIE5MQkxfTUdNVF9BX0lQVjZNQVNLLAorCQkJCQkJICAgJml0ZXI2LT5tYXNrKTsKIAkJCWlmIChyZXRfdmFsICE9IDApCiAJCQkJcmV0dXJuIHJldF92YWw7CiAJCQltYXA2ID0gbmV0bGJsX2RvbWhzaF9hZGRyNl9lbnRyeShpdGVyNik7CmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMKaW5kZXggYWVjNzk5NC4uYjAzODA5MiAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYwpAQCAtMTExNywzNCArMTExNywzMCBAQAogCQlzdHJ1Y3QgaW5fYWRkciBhZGRyX3N0cnVjdDsKIAogCQlhZGRyX3N0cnVjdC5zX2FkZHIgPSBhZGRyNC0+bGlzdC5hZGRyOwotCQlyZXRfdmFsID0gbmxhX3B1dChjYl9hcmctPnNrYiwKLQkJCQkgIE5MQkxfVU5MQUJFTF9BX0lQVjRBRERSLAotCQkJCSAgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSwKLQkJCQkgICZhZGRyX3N0cnVjdCk7CisJCXJldF92YWwgPSBubGFfcHV0X2luX2FkZHIoY2JfYXJnLT5za2IsCisJCQkJCSAgTkxCTF9VTkxBQkVMX0FfSVBWNEFERFIsCisJCQkJCSAgYWRkcl9zdHJ1Y3Quc19hZGRyKTsKIAkJaWYgKHJldF92YWwgIT0gMCkKIAkJCWdvdG8gbGlzdF9jYl9mYWlsdXJlOwogCiAJCWFkZHJfc3RydWN0LnNfYWRkciA9IGFkZHI0LT5saXN0Lm1hc2s7Ci0JCXJldF92YWwgPSBubGFfcHV0KGNiX2FyZy0+c2tiLAotCQkJCSAgTkxCTF9VTkxBQkVMX0FfSVBWNE1BU0ssCi0JCQkJICBzaXplb2Yoc3RydWN0IGluX2FkZHIpLAotCQkJCSAgJmFkZHJfc3RydWN0KTsKKwkJcmV0X3ZhbCA9IG5sYV9wdXRfaW5fYWRkcihjYl9hcmctPnNrYiwKKwkJCQkJICBOTEJMX1VOTEFCRUxfQV9JUFY0TUFTSywKKwkJCQkJICBhZGRyX3N0cnVjdC5zX2FkZHIpOwogCQlpZiAocmV0X3ZhbCAhPSAwKQogCQkJZ290byBsaXN0X2NiX2ZhaWx1cmU7CiAKIAkJc2VjaWQgPSBhZGRyNC0+c2VjaWQ7CiAJfSBlbHNlIHsKLQkJcmV0X3ZhbCA9IG5sYV9wdXQoY2JfYXJnLT5za2IsCi0JCQkJICBOTEJMX1VOTEFCRUxfQV9JUFY2QUREUiwKLQkJCQkgIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAotCQkJCSAgJmFkZHI2LT5saXN0LmFkZHIpOworCQlyZXRfdmFsID0gbmxhX3B1dF9pbjZfYWRkcihjYl9hcmctPnNrYiwKKwkJCQkJICAgTkxCTF9VTkxBQkVMX0FfSVBWNkFERFIsCisJCQkJCSAgICZhZGRyNi0+bGlzdC5hZGRyKTsKIAkJaWYgKHJldF92YWwgIT0gMCkKIAkJCWdvdG8gbGlzdF9jYl9mYWlsdXJlOwogCi0JCXJldF92YWwgPSBubGFfcHV0KGNiX2FyZy0+c2tiLAotCQkJCSAgTkxCTF9VTkxBQkVMX0FfSVBWNk1BU0ssCi0JCQkJICBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKLQkJCQkgICZhZGRyNi0+bGlzdC5tYXNrKTsKKwkJcmV0X3ZhbCA9IG5sYV9wdXRfaW42X2FkZHIoY2JfYXJnLT5za2IsCisJCQkJCSAgIE5MQkxfVU5MQUJFTF9BX0lQVjZNQVNLLAorCQkJCQkgICAmYWRkcjYtPmxpc3QubWFzayk7CiAJCWlmIChyZXRfdmFsICE9IDApCiAJCQlnb3RvIGxpc3RfY2JfZmFpbHVyZTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCmluZGV4IDA1OTE5YmYuLjE5OTA5ZDAgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKQEAgLTExNiw2ICsxMTYsOCBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhuZXRsaW5rX3RhcF9sb2NrKTsKIHN0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIG5ldGxpbmtfdGFwX2FsbCBfX3JlYWRfbW9zdGx5OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIG5ldGxpbmtfcmhhc2h0YWJsZV9wYXJhbXM7CisKIHN0YXRpYyBpbmxpbmUgdTMyIG5ldGxpbmtfZ3JvdXBfbWFzayh1MzIgZ3JvdXApCiB7CiAJcmV0dXJuIGdyb3VwID8gMSA8PCAoZ3JvdXAgLSAxKSA6IDA7CkBAIC05NzAsNDEgKzk3Miw1MCBAQAogCiBzdHJ1Y3QgbmV0bGlua19jb21wYXJlX2FyZwogewotCXN0cnVjdCBuZXQgKm5ldDsKKwlwb3NzaWJsZV9uZXRfdCBwbmV0OwogCXUzMiBwb3J0aWQ7CiB9OwogCi1zdGF0aWMgYm9vbCBuZXRsaW5rX2NvbXBhcmUodm9pZCAqcHRyLCB2b2lkICphcmcpCi17Ci0Jc3RydWN0IG5ldGxpbmtfY29tcGFyZV9hcmcgKnggPSBhcmc7Ci0Jc3RydWN0IHNvY2sgKnNrID0gcHRyOworLyogRG9pbmcgc2l6ZW9mIGRpcmVjdGx5IG1heSB5aWVsZCA0IGV4dHJhIGJ5dGVzIG9uIDY0LWJpdC4gKi8KKyNkZWZpbmUgbmV0bGlua19jb21wYXJlX2FyZ19sZW4gXAorCShvZmZzZXRvZihzdHJ1Y3QgbmV0bGlua19jb21wYXJlX2FyZywgcG9ydGlkKSArIHNpemVvZih1MzIpKQogCi0JcmV0dXJuIG5sa19zayhzayktPnBvcnRpZCA9PSB4LT5wb3J0aWQgJiYKLQkgICAgICAgbmV0X2VxKHNvY2tfbmV0KHNrKSwgeC0+bmV0KTsKK3N0YXRpYyBpbmxpbmUgaW50IG5ldGxpbmtfY29tcGFyZShzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyAqYXJnLAorCQkJCSAgY29uc3Qgdm9pZCAqcHRyKQoreworCWNvbnN0IHN0cnVjdCBuZXRsaW5rX2NvbXBhcmVfYXJnICp4ID0gYXJnLT5rZXk7CisJY29uc3Qgc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gcHRyOworCisJcmV0dXJuIG5say0+cG9ydGlkICE9IHgtPnBvcnRpZCB8fAorCSAgICAgICAhbmV0X2VxKHNvY2tfbmV0KCZubGstPnNrKSwgcmVhZF9wbmV0KCZ4LT5wbmV0KSk7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGxpbmtfY29tcGFyZV9hcmdfaW5pdChzdHJ1Y3QgbmV0bGlua19jb21wYXJlX2FyZyAqYXJnLAorCQkJCSAgICAgc3RydWN0IG5ldCAqbmV0LCB1MzIgcG9ydGlkKQoreworCW1lbXNldChhcmcsIDAsIHNpemVvZigqYXJnKSk7CisJd3JpdGVfcG5ldCgmYXJnLT5wbmV0LCBuZXQpOworCWFyZy0+cG9ydGlkID0gcG9ydGlkOwogfQogCiBzdGF0aWMgc3RydWN0IHNvY2sgKl9fbmV0bGlua19sb29rdXAoc3RydWN0IG5ldGxpbmtfdGFibGUgKnRhYmxlLCB1MzIgcG9ydGlkLAogCQkJCSAgICAgc3RydWN0IG5ldCAqbmV0KQogewotCXN0cnVjdCBuZXRsaW5rX2NvbXBhcmVfYXJnIGFyZyA9IHsKLQkJLm5ldCA9IG5ldCwKLQkJLnBvcnRpZCA9IHBvcnRpZCwKLQl9OworCXN0cnVjdCBuZXRsaW5rX2NvbXBhcmVfYXJnIGFyZzsKIAotCXJldHVybiByaGFzaHRhYmxlX2xvb2t1cF9jb21wYXJlKCZ0YWJsZS0+aGFzaCwgJnBvcnRpZCwKLQkJCQkJICZuZXRsaW5rX2NvbXBhcmUsICZhcmcpOworCW5ldGxpbmtfY29tcGFyZV9hcmdfaW5pdCgmYXJnLCBuZXQsIHBvcnRpZCk7CisJcmV0dXJuIHJoYXNodGFibGVfbG9va3VwX2Zhc3QoJnRhYmxlLT5oYXNoLCAmYXJnLAorCQkJCSAgICAgIG5ldGxpbmtfcmhhc2h0YWJsZV9wYXJhbXMpOwogfQogCi1zdGF0aWMgYm9vbCBfX25ldGxpbmtfaW5zZXJ0KHN0cnVjdCBuZXRsaW5rX3RhYmxlICp0YWJsZSwgc3RydWN0IHNvY2sgKnNrKQorc3RhdGljIGludCBfX25ldGxpbmtfaW5zZXJ0KHN0cnVjdCBuZXRsaW5rX3RhYmxlICp0YWJsZSwgc3RydWN0IHNvY2sgKnNrKQogewotCXN0cnVjdCBuZXRsaW5rX2NvbXBhcmVfYXJnIGFyZyA9IHsKLQkJLm5ldCA9IHNvY2tfbmV0KHNrKSwKLQkJLnBvcnRpZCA9IG5sa19zayhzayktPnBvcnRpZCwKLQl9OworCXN0cnVjdCBuZXRsaW5rX2NvbXBhcmVfYXJnIGFyZzsKIAotCXJldHVybiByaGFzaHRhYmxlX2xvb2t1cF9jb21wYXJlX2luc2VydCgmdGFibGUtPmhhc2gsCi0JCQkJCQkmbmxrX3NrKHNrKS0+bm9kZSwKLQkJCQkJCSZuZXRsaW5rX2NvbXBhcmUsICZhcmcpOworCW5ldGxpbmtfY29tcGFyZV9hcmdfaW5pdCgmYXJnLCBzb2NrX25ldChzayksIG5sa19zayhzayktPnBvcnRpZCk7CisJcmV0dXJuIHJoYXNodGFibGVfbG9va3VwX2luc2VydF9rZXkoJnRhYmxlLT5oYXNoLCAmYXJnLAorCQkJCQkgICAgJm5sa19zayhzayktPm5vZGUsCisJCQkJCSAgICBuZXRsaW5rX3JoYXNodGFibGVfcGFyYW1zKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzb2NrICpuZXRsaW5rX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIGludCBwcm90b2NvbCwgdTMyIHBvcnRpZCkKQEAgLTEwNjYsOSArMTA3NywxMCBAQAogCW5sa19zayhzayktPnBvcnRpZCA9IHBvcnRpZDsKIAlzb2NrX2hvbGQoc2spOwogCi0JZXJyID0gMDsKLQlpZiAoIV9fbmV0bGlua19pbnNlcnQodGFibGUsIHNrKSkgewotCQllcnIgPSAtRUFERFJJTlVTRTsKKwllcnIgPSBfX25ldGxpbmtfaW5zZXJ0KHRhYmxlLCBzayk7CisJaWYgKGVycikgeworCQlpZiAoZXJyID09IC1FRVhJU1QpCisJCQllcnIgPSAtRUFERFJJTlVTRTsKIAkJc29ja19wdXQoc2spOwogCX0KIApAQCAtMTA4Miw3ICsxMDk0LDggQEAKIAlzdHJ1Y3QgbmV0bGlua190YWJsZSAqdGFibGU7CiAKIAl0YWJsZSA9ICZubF90YWJsZVtzay0+c2tfcHJvdG9jb2xdOwotCWlmIChyaGFzaHRhYmxlX3JlbW92ZSgmdGFibGUtPmhhc2gsICZubGtfc2soc2spLT5ub2RlKSkgeworCWlmICghcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmdGFibGUtPmhhc2gsICZubGtfc2soc2spLT5ub2RlLAorCQkJCSAgICBuZXRsaW5rX3JoYXNodGFibGVfcGFyYW1zKSkgewogCQlXQVJOX09OKGF0b21pY19yZWFkKCZzay0+c2tfcmVmY250KSA9PSAxKTsKIAkJX19zb2NrX3B1dChzayk7CiAJfQpAQCAtMjI1Niw4ICsyMjY5LDcgQEAKIAlwdXRfY21zZyhtc2csIFNPTF9ORVRMSU5LLCBORVRMSU5LX1BLVElORk8sIHNpemVvZihpbmZvKSwgJmluZm8pOwogfQogCi1zdGF0aWMgaW50IG5ldGxpbmtfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmtpb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCBuZXRsaW5rX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7CkBAIC0yMzQ2LDggKzIzNTgsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgbmV0bGlua19yZWN2bXNnKHN0cnVjdCBraW9jYiAqa2lvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCitzdGF0aWMgaW50IG5ldGxpbmtfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCiAJCQkgICBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNjbV9jb29raWUgc2NtOwpAQCAtMzExNiwxNyArMzEyNywyOCBAQAogCS5leGl0ID0gbmV0bGlua19uZXRfZXhpdCwKIH07CiAKK3N0YXRpYyBpbmxpbmUgdTMyIG5ldGxpbmtfaGFzaChjb25zdCB2b2lkICpkYXRhLCB1MzIgbGVuLCB1MzIgc2VlZCkKK3sKKwljb25zdCBzdHJ1Y3QgbmV0bGlua19zb2NrICpubGsgPSBkYXRhOworCXN0cnVjdCBuZXRsaW5rX2NvbXBhcmVfYXJnIGFyZzsKKworCW5ldGxpbmtfY29tcGFyZV9hcmdfaW5pdCgmYXJnLCBzb2NrX25ldCgmbmxrLT5zayksIG5say0+cG9ydGlkKTsKKwlyZXR1cm4gamhhc2gyKCh1MzIgKikmYXJnLCBuZXRsaW5rX2NvbXBhcmVfYXJnX2xlbiAvIHNpemVvZih1MzIpLCBzZWVkKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBuZXRsaW5rX3JoYXNodGFibGVfcGFyYW1zID0geworCS5oZWFkX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBuZXRsaW5rX3NvY2ssIG5vZGUpLAorCS5rZXlfbGVuID0gbmV0bGlua19jb21wYXJlX2FyZ19sZW4sCisJLm9ial9oYXNoZm4gPSBuZXRsaW5rX2hhc2gsCisJLm9ial9jbXBmbiA9IG5ldGxpbmtfY29tcGFyZSwKKwkubWF4X3NpemUgPSA2NTUzNiwKKwkuYXV0b21hdGljX3Nocmlua2luZyA9IHRydWUsCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBuZXRsaW5rX3Byb3RvX2luaXQodm9pZCkKIHsKIAlpbnQgaTsKIAlpbnQgZXJyID0gcHJvdG9fcmVnaXN0ZXIoJm5ldGxpbmtfcHJvdG8sIDApOwotCXN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyBodF9wYXJhbXMgPSB7Ci0JCS5oZWFkX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBuZXRsaW5rX3NvY2ssIG5vZGUpLAotCQkua2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBuZXRsaW5rX3NvY2ssIHBvcnRpZCksCi0JCS5rZXlfbGVuID0gc2l6ZW9mKHUzMiksIC8qIHBvcnRpZCAqLwotCQkuaGFzaGZuID0gamhhc2gsCi0JCS5tYXhfc2hpZnQgPSAxNiwgLyogNjRLICovCi0JfTsKIAogCWlmIChlcnIgIT0gMCkKIAkJZ290byBvdXQ7CkBAIC0zMTM4LDcgKzMxNjAsOCBAQAogCQlnb3RvIHBhbmljOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9MSU5LUzsgaSsrKSB7Ci0JCWlmIChyaGFzaHRhYmxlX2luaXQoJm5sX3RhYmxlW2ldLmhhc2gsICZodF9wYXJhbXMpIDwgMCkgeworCQlpZiAocmhhc2h0YWJsZV9pbml0KCZubF90YWJsZVtpXS5oYXNoLAorCQkJCSAgICAmbmV0bGlua19yaGFzaHRhYmxlX3BhcmFtcykgPCAwKSB7CiAJCQl3aGlsZSAoLS1pID4gMCkKIAkJCQlyaGFzaHRhYmxlX2Rlc3Ryb3koJm5sX3RhYmxlW2ldLmhhc2gpOwogCQkJa2ZyZWUobmxfdGFibGUpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldHJvbS9hZl9uZXRyb20uYyBiL25ldC9uZXRyb20vYWZfbmV0cm9tLmMKaW5kZXggNjlmMWQ1ZS4uYjk4N2ZkNSAxMDA2NDQKLS0tIGEvbmV0L25ldHJvbS9hZl9uZXRyb20uYworKysgYi9uZXQvbmV0cm9tL2FmX25ldHJvbS5jCkBAIC0xMDIzLDggKzEwMjMsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IG5yX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IG5yX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBucl9zb2NrICpuciA9IG5yX3NrKHNrKTsKQEAgLTExMzMsOCArMTEzMiw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBucl9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQorc3RhdGljIGludCBucl9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsCisJCSAgICAgIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl9heDI1ICosIHNheCwgbXNnLT5tc2dfbmFtZSk7CmRpZmYgLS1naXQgYS9uZXQvbmV0cm9tL25yX2Rldi5jIGIvbmV0L25ldHJvbS9ucl9kZXYuYwppbmRleCA2YWUwNjNjLi45ODhmNTQyIDEwMDY0NAotLS0gYS9uZXQvbmV0cm9tL25yX2Rldi5jCisrKyBiL25ldC9uZXRyb20vbnJfZGV2LmMKQEAgLTY1LDM2ICs2NSw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLSNpZmRlZiBDT05GSUdfSU5FVAotCi1zdGF0aWMgaW50IG5yX3JlYnVpbGRfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IpCi17Ci0JdW5zaWduZWQgY2hhciAqYnAgPSBza2ItPmRhdGE7Ci0KLQlpZiAoYXJwX2ZpbmQoYnAgKyA3LCBza2IpKQotCQlyZXR1cm4gMTsKLQotCWJwWzZdICY9IH5BWDI1X0NCSVQ7Ci0JYnBbNl0gJj0gfkFYMjVfRUJJVDsKLQlicFs2XSB8PSBBWDI1X1NTU0lEX1NQQVJFOwotCWJwICAgICs9IEFYMjVfQUREUl9MRU47Ci0KLQlicFs2XSAmPSB+QVgyNV9DQklUOwotCWJwWzZdIHw9IEFYMjVfRUJJVDsKLQlicFs2XSB8PSBBWDI1X1NTU0lEX1NQQVJFOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNlbHNlCi0KLXN0YXRpYyBpbnQgbnJfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlyZXR1cm4gMTsKLX0KLQotI2VuZGlmCi0KIHN0YXRpYyBpbnQgbnJfaGVhZGVyKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCSAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwKIAkJICAgICBjb25zdCB2b2lkICpkYWRkciwgY29uc3Qgdm9pZCAqc2FkZHIsIHVuc2lnbmVkIGludCBsZW4pCkBAIC0xODgsNyArMTU4LDYgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBoZWFkZXJfb3BzIG5yX2hlYWRlcl9vcHMgPSB7CiAJLmNyZWF0ZQk9IG5yX2hlYWRlciwKLQkucmVidWlsZD0gbnJfcmVidWlsZF9oZWFkZXIsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG5yX25ldGRldl9vcHMgPSB7CmRpZmYgLS1naXQgYS9uZXQvbmZjL2xsY3Bfc29jay5jIGIvbmV0L25mYy9sbGNwX3NvY2suYwppbmRleCBlMTgxZTI5Li45NTc4YmQ2IDEwMDY0NAotLS0gYS9uZXQvbmZjL2xsY3Bfc29jay5jCisrKyBiL25ldC9uZmMvbGxjcF9zb2NrLmMKQEAgLTc1MCw4ICs3NTAsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbGxjcF9zb2NrX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IGxsY3Bfc29ja19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICAgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqbGxjcF9zb2NrID0gbmZjX2xsY3Bfc29jayhzayk7CkBAIC03OTMsOCArNzkzLDggQEAKIAlyZXR1cm4gbmZjX2xsY3Bfc2VuZF9pX2ZyYW1lKGxsY3Bfc29jaywgbXNnLCBsZW4pOwogfQogCi1zdGF0aWMgaW50IGxsY3Bfc29ja19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IGxsY3Bfc29ja19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICAgc2l6ZV90IGxlbiwgaW50IGZsYWdzKQogewogCWludCBub2Jsb2NrID0gZmxhZ3MgJiBNU0dfRE9OVFdBSVQ7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CmRpZmYgLS1naXQgYS9uZXQvbmZjL25jaS9jb3JlLmMgYi9uZXQvbmZjL25jaS9jb3JlLmMKaW5kZXggOTU3NWExOC4uNDlmZjMyMSAxMDA2NDQKLS0tIGEvbmV0L25mYy9uY2kvY29yZS5jCisrKyBiL25ldC9uZmMvbmNpL2NvcmUuYwpAQCAtOTA3LDYgKzkwNywxNiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG5jaV9md19kb3dubG9hZChzdHJ1Y3QgbmZjX2RldiAqbmZjX2RldiwgY29uc3QgY2hhciAqZmlybXdhcmVfbmFtZSkKK3sKKwlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IG5mY19nZXRfZHJ2ZGF0YShuZmNfZGV2KTsKKworCWlmICghbmRldi0+b3BzLT5md19kb3dubG9hZCkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKworCXJldHVybiBuZGV2LT5vcHMtPmZ3X2Rvd25sb2FkKG5kZXYsIGZpcm13YXJlX25hbWUpOworfQorCiBzdGF0aWMgc3RydWN0IG5mY19vcHMgbmNpX25mY19vcHMgPSB7CiAJLmRldl91cCA9IG5jaV9kZXZfdXAsCiAJLmRldl9kb3duID0gbmNpX2Rldl9kb3duLApAQCAtOTIyLDYgKzkzMiw3IEBACiAJLmRpc2FibGVfc2UgPSBuY2lfZGlzYWJsZV9zZSwKIAkuZGlzY292ZXJfc2UgPSBuY2lfZGlzY292ZXJfc2UsCiAJLnNlX2lvID0gbmNpX3NlX2lvLAorCS5md19kb3dubG9hZCA9IG5jaV9md19kb3dubG9hZCwKIH07CiAKIC8qIC0tLS0gSW50ZXJmYWNlIHRvIE5DSSBkcml2ZXJzIC0tLS0gKi8KZGlmZiAtLWdpdCBhL25ldC9uZmMvbmV0bGluay5jIGIvbmV0L25mYy9uZXRsaW5rLmMKaW5kZXggMTRhMmQxMS4uMzc2MzAzNiAxMDA2NDQKLS0tIGEvbmV0L25mYy9uZXRsaW5rLmMKKysrIGIvbmV0L25mYy9uZXRsaW5rLmMKQEAgLTE1ODQsNyArMTU4NCw3IEBACiAKIHN0cnVjdCB1cmVsZWFzZV93b3JrIHsKIAlzdHJ1Y3QJd29ya19zdHJ1Y3QgdzsKLQlpbnQJcG9ydGlkOworCXUzMglwb3J0aWQ7CiB9OwogCiBzdGF0aWMgdm9pZCBuZmNfdXJlbGVhc2VfZXZlbnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCmRpZmYgLS1naXQgYS9uZXQvbmZjL3Jhd3NvY2suYyBiL25ldC9uZmMvcmF3c29jay5jCmluZGV4IDM3M2UxMzguLjgyYjRlODAgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvcmF3c29jay5jCisrKyBiL25ldC9uZmMvcmF3c29jay5jCkBAIC0yMTEsOCArMjExLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgcmF3c29ja19zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgcmF3c29ja19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgbmZjX2RldiAqZGV2ID0gbmZjX3Jhd3NvY2soc2spLT5kZXY7CkBAIC0yNDgsOCArMjQ3LDggQEAKIAlyZXR1cm4gbGVuOwogfQogCi1zdGF0aWMgaW50IHJhd3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK3N0YXRpYyBpbnQgcmF3c29ja19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCSAgIGludCBmbGFncykKIHsKIAlpbnQgbm9ibG9jayA9IGZsYWdzICYgTVNHX0RPTlRXQUlUOwogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL0tjb25maWcgYi9uZXQvb3BlbnZzd2l0Y2gvS2NvbmZpZwppbmRleCBiN2Q4MThjLi5lZDZiMGY4IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvS2NvbmZpZworKysgYi9uZXQvb3BlbnZzd2l0Y2gvS2NvbmZpZwpAQCAtNiw2ICs2LDcgQEAKIAl0cmlzdGF0ZSAiT3BlbiB2U3dpdGNoIgogCWRlcGVuZHMgb24gSU5FVAogCXNlbGVjdCBMSUJDUkMzMkMKKwlzZWxlY3QgTVBMUwogCXNlbGVjdCBORVRfTVBMU19HU08KIAktLS1oZWxwLS0tCiAJICBPcGVuIHZTd2l0Y2ggaXMgYSBtdWx0aWxheWVyIEV0aGVybmV0IHN3aXRjaCB0YXJnZXRlZCBhdCB2aXJ0dWFsaXplZApkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmMgYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYwppbmRleCA1YmFlNzI0Li4wOTZjNjI3IDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYwpAQCAtMjAzLDcgKzIwMyw2IEBACiAKIAlvdnNfZmxvd190YmxfZGVzdHJveSgmZHAtPnRhYmxlKTsKIAlmcmVlX3BlcmNwdShkcC0+c3RhdHNfcGVyY3B1KTsKLQlyZWxlYXNlX25ldChvdnNfZHBfZ2V0X25ldChkcCkpOwogCWtmcmVlKGRwLT5wb3J0cyk7CiAJa2ZyZWUoZHApOwogfQpAQCAtMTUwMSw3ICsxNTAwLDcgQEAKIAlpZiAoZHAgPT0gTlVMTCkKIAkJZ290byBlcnJfZnJlZV9yZXBseTsKIAotCW92c19kcF9zZXRfbmV0KGRwLCBob2xkX25ldChzb2NrX25ldChza2ItPnNrKSkpOworCW92c19kcF9zZXRfbmV0KGRwLCBzb2NrX25ldChza2ItPnNrKSk7CiAKIAkvKiBBbGxvY2F0ZSB0YWJsZS4gKi8KIAllcnIgPSBvdnNfZmxvd190YmxfaW5pdCgmZHAtPnRhYmxlKTsKQEAgLTE1NzUsNyArMTU3NCw2IEBACiBlcnJfZGVzdHJveV90YWJsZToKIAlvdnNfZmxvd190YmxfZGVzdHJveSgmZHAtPnRhYmxlKTsKIGVycl9mcmVlX2RwOgotCXJlbGVhc2VfbmV0KG92c19kcF9nZXRfbmV0KGRwKSk7CiAJa2ZyZWUoZHApOwogZXJyX2ZyZWVfcmVwbHk6CiAJa2ZyZWVfc2tiKHJlcGx5KTsKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9kYXRhcGF0aC5oIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmgKaW5kZXggM2VjZTk0NS4uNGVjNGE0OCAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmgKKysrIGIvbmV0L29wZW52c3dpdGNoL2RhdGFwYXRoLmgKQEAgLTg0LDEwICs4NCw4IEBACiAJLyogU3RhdHMuICovCiAJc3RydWN0IGRwX3N0YXRzX3BlcmNwdSBfX3BlcmNwdSAqc3RhdHNfcGVyY3B1OwogCi0jaWZkZWYgQ09ORklHX05FVF9OUwogCS8qIE5ldHdvcmsgbmFtZXNwYWNlIHJlZi4gKi8KLQlzdHJ1Y3QgbmV0ICpuZXQ7Ci0jZW5kaWYKKwlwb3NzaWJsZV9uZXRfdCBuZXQ7CiAKIAl1MzIgdXNlcl9mZWF0dXJlczsKIH07CmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jIGIvbmV0L29wZW52c3dpdGNoL2Zsb3cuYwppbmRleCA1MGVjNDJmLi4yZGFjYzdiIDEwMDY0NAotLS0gYS9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jCisrKyBiL25ldC9vcGVudnN3aXRjaC9mbG93LmMKQEAgLTEwMCw3ICsxMDAsOSBAQAogCiAJCQkJbmV3X3N0YXRzID0KIAkJCQkJa21lbV9jYWNoZV9hbGxvY19ub2RlKGZsb3dfc3RhdHNfY2FjaGUsCi0JCQkJCQkJICAgICAgR0ZQX1RISVNOT0RFIHwKKwkJCQkJCQkgICAgICBHRlBfTk9XQUlUIHwKKwkJCQkJCQkgICAgICBfX0dGUF9USElTTk9ERSB8CisJCQkJCQkJICAgICAgX19HRlBfTk9XQVJOIHwKIAkJCQkJCQkgICAgICBfX0dGUF9OT01FTUFMTE9DLAogCQkJCQkJCSAgICAgIG5vZGUpOwogCQkJCWlmIChsaWtlbHkobmV3X3N0YXRzKSkgewpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5jIGIvbmV0L29wZW52c3dpdGNoL2Zsb3dfbmV0bGluay5jCmluZGV4IDIyYjE4YzEuLmM2OTFiMWEgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC9mbG93X25ldGxpbmsuYworKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvd19uZXRsaW5rLmMKQEAgLTUzNSwxMSArNTM1LDExIEBACiAJCQlicmVhazsKIAkJY2FzZSBPVlNfVFVOTkVMX0tFWV9BVFRSX0lQVjRfU1JDOgogCQkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCB0dW5fa2V5LmlwdjRfc3JjLAotCQkJCQlubGFfZ2V0X2JlMzIoYSksIGlzX21hc2spOworCQkJCQlubGFfZ2V0X2luX2FkZHIoYSksIGlzX21hc2spOwogCQkJYnJlYWs7CiAJCWNhc2UgT1ZTX1RVTk5FTF9LRVlfQVRUUl9JUFY0X0RTVDoKIAkJCVNXX0ZMT1dfS0VZX1BVVChtYXRjaCwgdHVuX2tleS5pcHY0X2RzdCwKLQkJCQkJbmxhX2dldF9iZTMyKGEpLCBpc19tYXNrKTsKKwkJCQkJbmxhX2dldF9pbl9hZGRyKGEpLCBpc19tYXNrKTsKIAkJCWJyZWFrOwogCQljYXNlIE9WU19UVU5ORUxfS0VZX0FUVFJfVE9TOgogCQkJU1dfRkxPV19LRVlfUFVUKG1hdGNoLCB0dW5fa2V5LmlwdjRfdG9zLApAQCAtNjQ4LDEwICs2NDgsMTIgQEAKIAkgICAgbmxhX3B1dF9iZTY0KHNrYiwgT1ZTX1RVTk5FTF9LRVlfQVRUUl9JRCwgb3V0cHV0LT50dW5faWQpKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCWlmIChvdXRwdXQtPmlwdjRfc3JjICYmCi0JICAgIG5sYV9wdXRfYmUzMihza2IsIE9WU19UVU5ORUxfS0VZX0FUVFJfSVBWNF9TUkMsIG91dHB1dC0+aXB2NF9zcmMpKQorCSAgICBubGFfcHV0X2luX2FkZHIoc2tiLCBPVlNfVFVOTkVMX0tFWV9BVFRSX0lQVjRfU1JDLAorCQkJICAgIG91dHB1dC0+aXB2NF9zcmMpKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCWlmIChvdXRwdXQtPmlwdjRfZHN0ICYmCi0JICAgIG5sYV9wdXRfYmUzMihza2IsIE9WU19UVU5ORUxfS0VZX0FUVFJfSVBWNF9EU1QsIG91dHB1dC0+aXB2NF9kc3QpKQorCSAgICBubGFfcHV0X2luX2FkZHIoc2tiLCBPVlNfVFVOTkVMX0tFWV9BVFRSX0lQVjRfRFNULAorCQkJICAgIG91dHB1dC0+aXB2NF9kc3QpKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCWlmIChvdXRwdXQtPmlwdjRfdG9zICYmCiAJICAgIG5sYV9wdXRfdTgoc2tiLCBPVlNfVFVOTkVMX0tFWV9BVFRSX1RPUywgb3V0cHV0LT5pcHY0X3RvcykpCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtdnhsYW4uYyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC12eGxhbi5jCmluZGV4IDMyNzdhNzUuLjZkMzk3NjYgMTAwNjQ0Ci0tLSBhL25ldC9vcGVudnN3aXRjaC92cG9ydC12eGxhbi5jCisrKyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC12eGxhbi5jCkBAIC0yMjIsNyArMjIyLDggQEAKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBvdnNfZHBfZ2V0X25ldCh2cG9ydC0+ZHApOwogCXN0cnVjdCB2eGxhbl9wb3J0ICp2eGxhbl9wb3J0ID0gdnhsYW5fdnBvcnQodnBvcnQpOwotCV9fYmUxNiBkc3RfcG9ydCA9IGluZXRfc2sodnhsYW5fcG9ydC0+dnMtPnNvY2stPnNrKS0+aW5ldF9zcG9ydDsKKwlzdHJ1Y3Qgc29jayAqc2sgPSB2eGxhbl9wb3J0LT52cy0+c29jay0+c2s7CisJX19iZTE2IGRzdF9wb3J0ID0gaW5ldF9zayhzayktPmluZXRfc3BvcnQ7CiAJY29uc3Qgc3RydWN0IG92c19rZXlfaXB2NF90dW5uZWwgKnR1bl9rZXk7CiAJc3RydWN0IHZ4bGFuX21ldGFkYXRhIG1kID0gezB9OwogCXN0cnVjdCBydGFibGUgKnJ0OwpAQCAtMjU1LDcgKzI1Niw3IEBACiAJdnhmbGFncyA9IHZ4bGFuX3BvcnQtPmV4dHMgfAogCQkgICAgICAodHVuX2tleS0+dHVuX2ZsYWdzICYgVFVOTkVMX0NTVU0gPyBWWExBTl9GX1VEUF9DU1VNIDogMCk7CiAKLQllcnIgPSB2eGxhbl94bWl0X3NrYihydCwgc2tiLCBmbC5zYWRkciwgdHVuX2tleS0+aXB2NF9kc3QsCisJZXJyID0gdnhsYW5feG1pdF9za2IocnQsIHNrLCBza2IsIGZsLnNhZGRyLCB0dW5fa2V5LT5pcHY0X2RzdCwKIAkJCSAgICAgdHVuX2tleS0+aXB2NF90b3MsIHR1bl9rZXktPmlwdjRfdHRsLCBkZiwKIAkJCSAgICAgc3JjX3BvcnQsIGRzdF9wb3J0LAogCQkJICAgICAmbWQsIGZhbHNlLCB2eGZsYWdzKTsKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC92cG9ydC5jIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LmMKaW5kZXggZWMyOTU0Zi4uMDY3YTNmZiAxMDA2NDQKLS0tIGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LmMKKysrIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LmMKQEAgLTI3NCwxMCArMjc0LDggQEAKIAlBU1NFUlRfT1ZTTCgpOwogCiAJaGxpc3RfZGVsX3JjdSgmdnBvcnQtPmhhc2hfbm9kZSk7Ci0KLQl2cG9ydC0+b3BzLT5kZXN0cm95KHZwb3J0KTsKLQogCW1vZHVsZV9wdXQodnBvcnQtPm9wcy0+b3duZXIpOworCXZwb3J0LT5vcHMtPmRlc3Ryb3kodnBvcnQpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCmluZGV4IGY4ZGI3MDYuLjUxMDJjM2MgMTAwNjQ0Ci0tLSBhL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKKysrIGIvbmV0L3BhY2tldC9hZl9wYWNrZXQuYwpAQCAtMjE2LDEwICsyMTYsMTYgQEAKIHN0YXRpYyB2b2lkIHBhY2tldF9mbHVzaF9tY2xpc3Qoc3RydWN0IHNvY2sgKnNrKTsKIAogc3RydWN0IHBhY2tldF9za2JfY2IgewotCXVuc2lnbmVkIGludCBvcmlnbGVuOwogCXVuaW9uIHsKIAkJc3RydWN0IHNvY2thZGRyX3BrdCBwa3Q7Ci0JCXN0cnVjdCBzb2NrYWRkcl9sbCBsbDsKKwkJdW5pb24geworCQkJLyogVHJpY2s6IGFsaWFzIHNrYiBvcmlnaW5hbCBsZW5ndGggd2l0aAorCQkJICogbGwuc2xsX2ZhbWlseSBhbmQgbGwucHJvdG9jb2wgaW4gb3JkZXIKKwkJCSAqIHRvIHNhdmUgcm9vbS4KKwkJCSAqLworCQkJdW5zaWduZWQgaW50IG9yaWdsZW47CisJCQlzdHJ1Y3Qgc29ja2FkZHJfbGwgbGw7CisJCX07CiAJfSBzYTsKIH07CiAKQEAgLTE2MDgsOCArMTYxNCw4IEBACiAgKglwcm90b2NvbCBsYXllcnMgYW5kIHlvdSBtdXN0IHRoZXJlZm9yZSBzdXBwbHkgaXQgd2l0aCBhIGNvbXBsZXRlIGZyYW1lCiAgKi8KIAotc3RhdGljIGludCBwYWNrZXRfc2VuZG1zZ19zcGt0KHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IHBhY2tldF9zZW5kbXNnX3Nwa3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJICAgICAgIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJREVDTEFSRV9TT0NLQUREUihzdHJ1Y3Qgc29ja2FkZHJfcGt0ICosIHNhZGRyLCBtc2ctPm1zZ19uYW1lKTsKQEAgLTE4MTgsMTMgKzE4MjQsMTAgQEAKIAkJc2tiID0gbnNrYjsKIAl9CiAKLQlCVUlMRF9CVUdfT04oc2l6ZW9mKCpQQUNLRVRfU0tCX0NCKHNrYikpICsgTUFYX0FERFJfTEVOIC0gOCA+Ci0JCSAgICAgc2l6ZW9mKHNrYi0+Y2IpKTsKKwlzb2NrX3NrYl9jYl9jaGVja19zaXplKHNpemVvZigqUEFDS0VUX1NLQl9DQihza2IpKSArIE1BWF9BRERSX0xFTiAtIDgpOwogCiAJc2xsID0gJlBBQ0tFVF9TS0JfQ0Ioc2tiKS0+c2EubGw7Ci0Jc2xsLT5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOwogCXNsbC0+c2xsX2hhdHlwZSA9IGRldi0+dHlwZTsKLQlzbGwtPnNsbF9wcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7CiAJc2xsLT5zbGxfcGt0dHlwZSA9IHNrYi0+cGt0X3R5cGU7CiAJaWYgKHVubGlrZWx5KHBvLT5vcmlnZGV2KSkKIAkJc2xsLT5zbGxfaWZpbmRleCA9IG9yaWdfZGV2LT5pZmluZGV4OwpAQCAtMTgzMyw3ICsxODM2LDEwIEBACiAKIAlzbGwtPnNsbF9oYWxlbiA9IGRldl9wYXJzZV9oZWFkZXIoc2tiLCBzbGwtPnNsbF9hZGRyKTsKIAotCVBBQ0tFVF9TS0JfQ0Ioc2tiKS0+b3JpZ2xlbiA9IHNrYi0+bGVuOworCS8qIHNsbC0+c2xsX2ZhbWlseSBhbmQgc2xsLT5zbGxfcHJvdG9jb2wgYXJlIHNldCBpbiBwYWNrZXRfcmVjdm1zZygpLgorCSAqIFVzZSB0aGVpciBzcGFjZSBmb3Igc3RvcmluZyB0aGUgb3JpZ2luYWwgc2tiIGxlbmd0aC4KKwkgKi8KKwlQQUNLRVRfU0tCX0NCKHNrYiktPnNhLm9yaWdsZW4gPSBza2ItPmxlbjsKIAogCWlmIChwc2tiX3RyaW0oc2tiLCBzbmFwbGVuKSkKIAkJZ290byBkcm9wX25fYWNjdDsKQEAgLTE4NDcsNyArMTg1Myw3IEBACiAKIAlzcGluX2xvY2soJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOwogCXBvLT5zdGF0cy5zdGF0czEudHBfcGFja2V0cysrOwotCXNrYi0+ZHJvcGNvdW50ID0gYXRvbWljX3JlYWQoJnNrLT5za19kcm9wcyk7CisJc29ja19za2Jfc2V0X2Ryb3Bjb3VudChzaywgc2tiKTsKIAlfX3NrYl9xdWV1ZV90YWlsKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKIAlzcGluX3VubG9jaygmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CiAJc2stPnNrX2RhdGFfcmVhZHkoc2spOwpAQCAtMTkxMCwxNCArMTkxNiwxOSBAQAogCQl9CiAJfQogCi0JaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpCi0JCXN0YXR1cyB8PSBUUF9TVEFUVVNfQ1NVTU5PVFJFQURZOwotCiAJc25hcGxlbiA9IHNrYi0+bGVuOwogCiAJcmVzID0gcnVuX2ZpbHRlcihza2IsIHNrLCBzbmFwbGVuKTsKIAlpZiAoIXJlcykKIAkJZ290byBkcm9wX25fcmVzdG9yZTsKKworCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQorCQlzdGF0dXMgfD0gVFBfU1RBVFVTX0NTVU1OT1RSRUFEWTsKKwllbHNlIGlmIChza2ItPnBrdF90eXBlICE9IFBBQ0tFVF9PVVRHT0lORyAmJgorCQkgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFIHx8CisJCSAgc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSkpCisJCXN0YXR1cyB8PSBUUF9TVEFUVVNfQ1NVTV9WQUxJRDsKKwogCWlmIChzbmFwbGVuID4gcmVzKQogCQlzbmFwbGVuID0gcmVzOwogCkBAIC0yNjAzLDggKzI2MTQsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcGFja2V0X3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IHBhY2tldF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvID0gcGt0X3NrKHNrKTsKQEAgLTI4ODQsMTMgKzI4OTQsMTQgQEAKICAqCUlmIG5lY2Vzc2FyeSB3ZSBibG9jay4KICAqLwogCi1zdGF0aWMgaW50IHBhY2tldF9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW50IHBhY2tldF9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCSAgaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGNvcGllZCwgZXJyOwogCWludCB2bmV0X2hkcl9sZW4gPSAwOworCXVuc2lnbmVkIGludCBvcmlnbGVuID0gMDsKIAogCWVyciA9IC1FSU5WQUw7CiAJaWYgKGZsYWdzICYgfihNU0dfUEVFS3xNU0dfRE9OVFdBSVR8TVNHX1RSVU5DfE1TR19DTVNHX0NPTVBBVHxNU0dfRVJSUVVFVUUpKQpAQCAtMjk5MCw2ICszMDAxLDE1IEBACiAJaWYgKGVycikKIAkJZ290byBvdXRfZnJlZTsKIAorCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfUEFDS0VUKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9sbCAqc2xsID0gJlBBQ0tFVF9TS0JfQ0Ioc2tiKS0+c2EubGw7CisKKwkJLyogT3JpZ2luYWwgbGVuZ3RoIHdhcyBzdG9yZWQgaW4gc29ja2FkZHJfbGwgZmllbGRzICovCisJCW9yaWdsZW4gPSBQQUNLRVRfU0tCX0NCKHNrYiktPnNhLm9yaWdsZW47CisJCXNsbC0+c2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwkJc2xsLT5zbGxfcHJvdG9jb2wgPSBza2ItPnByb3RvY29sOworCX0KKwogCXNvY2tfcmVjdl90c19hbmRfZHJvcHMobXNnLCBzaywgc2tiKTsKIAogCWlmIChtc2ctPm1zZ19uYW1lKSB7CkBAIC0zMDAxLDYgKzMwMjEsNyBAQAogCQkJbXNnLT5tc2dfbmFtZWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfcGt0KTsKIAkJfSBlbHNlIHsKIAkJCXN0cnVjdCBzb2NrYWRkcl9sbCAqc2xsID0gJlBBQ0tFVF9TS0JfQ0Ioc2tiKS0+c2EubGw7CisKIAkJCW1zZy0+bXNnX25hbWVsZW4gPSBzbGwtPnNsbF9oYWxlbiArCiAJCQkJb2Zmc2V0b2Yoc3RydWN0IHNvY2thZGRyX2xsLCBzbGxfYWRkcik7CiAJCX0KQEAgLTMwMTQsNyArMzAzNSwxMiBAQAogCQlhdXgudHBfc3RhdHVzID0gVFBfU1RBVFVTX1VTRVI7CiAJCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9QQVJUSUFMKQogCQkJYXV4LnRwX3N0YXR1cyB8PSBUUF9TVEFUVVNfQ1NVTU5PVFJFQURZOwotCQlhdXgudHBfbGVuID0gUEFDS0VUX1NLQl9DQihza2IpLT5vcmlnbGVuOworCQllbHNlIGlmIChza2ItPnBrdF90eXBlICE9IFBBQ0tFVF9PVVRHT0lORyAmJgorCQkJIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSB8fAorCQkJICBza2JfY3N1bV91bm5lY2Vzc2FyeShza2IpKSkKKwkJCWF1eC50cF9zdGF0dXMgfD0gVFBfU1RBVFVTX0NTVU1fVkFMSUQ7CisKKwkJYXV4LnRwX2xlbiA9IG9yaWdsZW47CiAJCWF1eC50cF9zbmFwbGVuID0gc2tiLT5sZW47CiAJCWF1eC50cF9tYWMgPSAwOwogCQlhdXgudHBfbmV0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CmRpZmYgLS1naXQgYS9uZXQvcGFja2V0L2ludGVybmFsLmggYi9uZXQvcGFja2V0L2ludGVybmFsLmgKaW5kZXggY2RkZGY2YS4uZmU2ZTIwYyAxMDA2NDQKLS0tIGEvbmV0L3BhY2tldC9pbnRlcm5hbC5oCisrKyBiL25ldC9wYWNrZXQvaW50ZXJuYWwuaApAQCAtNzQsOSArNzQsNyBAQAogI2RlZmluZSBQQUNLRVRfRkFOT1VUX01BWAkyNTYKIAogc3RydWN0IHBhY2tldF9mYW5vdXQgewotI2lmZGVmIENPTkZJR19ORVRfTlMKLQlzdHJ1Y3QgbmV0CQkqbmV0OwotI2VuZGlmCisJcG9zc2libGVfbmV0X3QJCW5ldDsKIAl1bnNpZ25lZCBpbnQJCW51bV9tZW1iZXJzOwogCXUxNgkJCWlkOwogCXU4CQkJdHlwZTsKZGlmZiAtLWdpdCBhL25ldC9waG9uZXQvZGF0YWdyYW0uYyBiL25ldC9waG9uZXQvZGF0YWdyYW0uYwppbmRleCAyNjA1NGI0Li41ZTcxMDQzIDEwMDY0NAotLS0gYS9uZXQvcGhvbmV0L2RhdGFncmFtLmMKKysrIGIvbmV0L3Bob25ldC9kYXRhZ3JhbS5jCkBAIC04Myw4ICs4Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcG5fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgcG5fc2VuZG1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKIAlERUNMQVJFX1NPQ0tBRERSKHN0cnVjdCBzb2NrYWRkcl9wbiAqLCB0YXJnZXQsIG1zZy0+bXNnX25hbWUpOwogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0xMjUsOSArMTI0LDggQEAKIAlyZXR1cm4gKGVyciA+PSAwKSA/IGxlbiA6IGVycjsKIH0KIAotc3RhdGljIGludCBwbl9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2sgKnNrLAotCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgbm9ibG9jaywKLQkJCWludCBmbGFncywgaW50ICphZGRyX2xlbikKK3N0YXRpYyBpbnQgcG5fcmVjdm1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJICAgICAgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlzdHJ1Y3Qgc29ja2FkZHJfcG4gc2E7CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L3BlcC5jIGIvbmV0L3Bob25ldC9wZXAuYwppbmRleCA1ZDNmMmI3Li42ZGUyYWViIDEwMDY0NAotLS0gYS9uZXQvcGhvbmV0L3BlcC5jCisrKyBiL25ldC9waG9uZXQvcGVwLmMKQEAgLTExMTgsOCArMTExOCw3IEBACiAKIH0KIAotc3RhdGljIGludCBwZXBfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgcGVwX3NlbmRtc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IHBlcF9zb2NrICpwbiA9IHBlcF9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTEyNDYsOSArMTI0NSw4IEBACiAJcmV0dXJuIHNrYjsKIH0KIAotc3RhdGljIGludCBwZXBfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IG5vYmxvY2ssCi0JCQlpbnQgZmxhZ3MsIGludCAqYWRkcl9sZW4pCitzdGF0aWMgaW50IHBlcF9yZWN2bXNnKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAorCQkgICAgICAgaW50IG5vYmxvY2ssIGludCBmbGFncywgaW50ICphZGRyX2xlbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnI7CmRpZmYgLS1naXQgYS9uZXQvcGhvbmV0L3NvY2tldC5jIGIvbmV0L3Bob25ldC9zb2NrZXQuYwppbmRleCAwMDgyMTRhLi5kNTc1ZWY0IDEwMDY0NAotLS0gYS9uZXQvcGhvbmV0L3NvY2tldC5jCisrKyBiL25ldC9waG9uZXQvc29ja2V0LmMKQEAgLTQyNSwxNSArNDI1LDE1IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBwbl9zb2NrZXRfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkJc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IHRvdGFsX2xlbikKK3N0YXRpYyBpbnQgcG5fc29ja2V0X3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbSwKKwkJCSAgICAgc2l6ZV90IHRvdGFsX2xlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAogCWlmIChwbl9zb2NrZXRfYXV0b2JpbmQoc29jaykpCiAJCXJldHVybiAtRUFHQUlOOwogCi0JcmV0dXJuIHNrLT5za19wcm90LT5zZW5kbXNnKGlvY2IsIHNrLCBtLCB0b3RhbF9sZW4pOworCXJldHVybiBzay0+c2tfcHJvdC0+c2VuZG1zZyhzaywgbSwgdG90YWxfbGVuKTsKIH0KIAogY29uc3Qgc3RydWN0IHByb3RvX29wcyBwaG9uZXRfZGdyYW1fb3BzID0gewpkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9jb25uZWN0aW9uLmMgYi9uZXQvcmRzL2Nvbm5lY3Rpb24uYwppbmRleCAzNzhjM2E2Li4xNGYwNDEzOSAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9jb25uZWN0aW9uLmMKKysrIGIvbmV0L3Jkcy9jb25uZWN0aW9uLmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAljb25uID0gcmRzX2Nvbm5fbG9va3VwKGhlYWQsIGxhZGRyLCBmYWRkciwgdHJhbnMpOwogCWlmIChjb25uICYmIGNvbm4tPmNfbG9vcGJhY2sgJiYgY29ubi0+Y190cmFucyAhPSAmcmRzX2xvb3BfdHJhbnNwb3J0ICYmCi0JICAgICFpc19vdXRnb2luZykgeworCSAgICBsYWRkciA9PSBmYWRkciAmJiAhaXNfb3V0Z29pbmcpIHsKIAkJLyogVGhpcyBpcyBhIGxvb3BlZCBiYWNrIElCIGNvbm5lY3Rpb24sIGFuZCB3ZSdyZQogCQkgKiBjYWxsZWQgYnkgdGhlIGNvZGUgaGFuZGxpbmcgdGhlIGluY29taW5nIGNvbm5lY3QuCiAJCSAqIFdlIG5lZWQgYSBzZWNvbmQgY29ubmVjdGlvbiBvYmplY3QgaW50byB3aGljaCB3ZQpAQCAtMTkzLDYgKzE5Myw3IEBACiAJfQogCiAJYXRvbWljX3NldCgmY29ubi0+Y19zdGF0ZSwgUkRTX0NPTk5fRE9XTik7CisJY29ubi0+Y19zZW5kX2dlbiA9IDA7CiAJY29ubi0+Y19yZWNvbm5lY3RfamlmZmllcyA9IDA7CiAJSU5JVF9ERUxBWUVEX1dPUksoJmNvbm4tPmNfc2VuZF93LCByZHNfc2VuZF93b3JrZXIpOwogCUlOSVRfREVMQVlFRF9XT1JLKCZjb25uLT5jX3JlY3ZfdywgcmRzX3JlY3Zfd29ya2VyKTsKZGlmZiAtLWdpdCBhL25ldC9yZHMvaXdfcmRtYS5jIGIvbmV0L3Jkcy9pd19yZG1hLmMKaW5kZXggYTgxNzcwNS4uZGJhOGQwOCAxMDA2NDQKLS0tIGEvbmV0L3Jkcy9pd19yZG1hLmMKKysrIGIvbmV0L3Jkcy9pd19yZG1hLmMKQEAgLTg4LDcgKzg4LDkgQEAKIAkJCWludCAqdW5waW5uZWQpOwogc3RhdGljIHZvaWQgcmRzX2l3X2Rlc3Ryb3lfZmFzdHJlZyhzdHJ1Y3QgcmRzX2l3X21yX3Bvb2wgKnBvb2wsIHN0cnVjdCByZHNfaXdfbXIgKmlibXIpOwogCi1zdGF0aWMgaW50IHJkc19pd19nZXRfZGV2aWNlKHN0cnVjdCByZHNfc29jayAqcnMsIHN0cnVjdCByZHNfaXdfZGV2aWNlICoqcmRzX2l3ZGV2LCBzdHJ1Y3QgcmRtYV9jbV9pZCAqKmNtX2lkKQorc3RhdGljIGludCByZHNfaXdfZ2V0X2RldmljZShzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNyYywgc3RydWN0IHNvY2thZGRyX2luICpkc3QsCisJCQkgICAgIHN0cnVjdCByZHNfaXdfZGV2aWNlICoqcmRzX2l3ZGV2LAorCQkJICAgICBzdHJ1Y3QgcmRtYV9jbV9pZCAqKmNtX2lkKQogewogCXN0cnVjdCByZHNfaXdfZGV2aWNlICppd2RldjsKIAlzdHJ1Y3QgcmRzX2l3X2NtX2lkICppX2NtX2lkOwpAQCAtMTEyLDE1ICsxMTQsMTUgQEAKIAkJCQlzcmNfYWRkci0+c2luX3BvcnQsCiAJCQkJZHN0X2FkZHItPnNpbl9hZGRyLnNfYWRkciwKIAkJCQlkc3RfYWRkci0+c2luX3BvcnQsCi0JCQkJcnMtPnJzX2JvdW5kX2FkZHIsCi0JCQkJcnMtPnJzX2JvdW5kX3BvcnQsCi0JCQkJcnMtPnJzX2Nvbm5fYWRkciwKLQkJCQlycy0+cnNfY29ubl9wb3J0KTsKKwkJCQlzcmMtPnNpbl9hZGRyLnNfYWRkciwKKwkJCQlzcmMtPnNpbl9wb3J0LAorCQkJCWRzdC0+c2luX2FkZHIuc19hZGRyLAorCQkJCWRzdC0+c2luX3BvcnQpOwogI2lmZGVmIFdPUktJTkdfVFVQTEVfREVURUNUSU9OCi0JCQlpZiAoc3JjX2FkZHItPnNpbl9hZGRyLnNfYWRkciA9PSBycy0+cnNfYm91bmRfYWRkciAmJgotCQkJICAgIHNyY19hZGRyLT5zaW5fcG9ydCA9PSBycy0+cnNfYm91bmRfcG9ydCAmJgotCQkJICAgIGRzdF9hZGRyLT5zaW5fYWRkci5zX2FkZHIgPT0gcnMtPnJzX2Nvbm5fYWRkciAmJgotCQkJICAgIGRzdF9hZGRyLT5zaW5fcG9ydCA9PSBycy0+cnNfY29ubl9wb3J0KSB7CisJCQlpZiAoc3JjX2FkZHItPnNpbl9hZGRyLnNfYWRkciA9PSBzcmMtPnNpbl9hZGRyLnNfYWRkciAmJgorCQkJICAgIHNyY19hZGRyLT5zaW5fcG9ydCA9PSBzcmMtPnNpbl9wb3J0ICYmCisJCQkgICAgZHN0X2FkZHItPnNpbl9hZGRyLnNfYWRkciA9PSBkc3QtPnNpbl9hZGRyLnNfYWRkciAmJgorCQkJICAgIGRzdF9hZGRyLT5zaW5fcG9ydCA9PSBkc3QtPnNpbl9wb3J0KSB7CiAjZWxzZQogCQkJLyogRklYTUUgLSBuZWVkcyB0byBjb21wYXJlIHRoZSBsb2NhbCBhbmQgcmVtb3RlCiAJCQkgKiBpcGFkZHIvcG9ydCB0dXBsZSwgYnV0IHRoZSBpcGFkZHIgaXMgdGhlIG9ubHkKQEAgLTEyOCw3ICsxMzAsNyBAQAogCQkJICogemVybydlZC4gIEl0IGRvZXNuJ3QgYXBwZWFyIHRvIGJlIHByb3Blcmx5IHBvcHVsYXRlZAogCQkJICogZHVyaW5nIGNvbm5lY3Rpb24gc2V0dXAuLi4KIAkJCSAqLwotCQkJaWYgKHNyY19hZGRyLT5zaW5fYWRkci5zX2FkZHIgPT0gcnMtPnJzX2JvdW5kX2FkZHIpIHsKKwkJCWlmIChzcmNfYWRkci0+c2luX2FkZHIuc19hZGRyID09IHNyYy0+c2luX2FkZHIuc19hZGRyKSB7CiAjZW5kaWYKIAkJCQlzcGluX3VubG9ja19pcnEoJml3ZGV2LT5zcGlubG9jayk7CiAJCQkJKnJkc19pd2RldiA9IGl3ZGV2OwpAQCAtMTgwLDE5ICsxODIsMTMgQEAKIHsKIAlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNyY19hZGRyLCAqZHN0X2FkZHI7CiAJc3RydWN0IHJkc19pd19kZXZpY2UgKnJkc19pd2Rldl9vbGQ7Ci0Jc3RydWN0IHJkc19zb2NrIHJzOwogCXN0cnVjdCByZG1hX2NtX2lkICpwY21faWQ7CiAJaW50IHJjOwogCiAJc3JjX2FkZHIgPSAoc3RydWN0IHNvY2thZGRyX2luICopJmNtX2lkLT5yb3V0ZS5hZGRyLnNyY19hZGRyOwogCWRzdF9hZGRyID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSZjbV9pZC0+cm91dGUuYWRkci5kc3RfYWRkcjsKIAotCXJzLnJzX2JvdW5kX2FkZHIgPSBzcmNfYWRkci0+c2luX2FkZHIuc19hZGRyOwotCXJzLnJzX2JvdW5kX3BvcnQgPSBzcmNfYWRkci0+c2luX3BvcnQ7Ci0JcnMucnNfY29ubl9hZGRyID0gZHN0X2FkZHItPnNpbl9hZGRyLnNfYWRkcjsKLQlycy5yc19jb25uX3BvcnQgPSBkc3RfYWRkci0+c2luX3BvcnQ7Ci0KLQlyYyA9IHJkc19pd19nZXRfZGV2aWNlKCZycywgJnJkc19pd2Rldl9vbGQsICZwY21faWQpOworCXJjID0gcmRzX2l3X2dldF9kZXZpY2Uoc3JjX2FkZHIsIGRzdF9hZGRyLCAmcmRzX2l3ZGV2X29sZCwgJnBjbV9pZCk7CiAJaWYgKHJjKQogCQlyZHNfaXdfcmVtb3ZlX2NtX2lkKHJkc19pd2RldiwgY21faWQpOwogCkBAIC01OTgsOSArNTk0LDE3IEBACiAJc3RydWN0IHJkc19pd19kZXZpY2UgKnJkc19pd2RldjsKIAlzdHJ1Y3QgcmRzX2l3X21yICppYm1yID0gTlVMTDsKIAlzdHJ1Y3QgcmRtYV9jbV9pZCAqY21faWQ7CisJc3RydWN0IHNvY2thZGRyX2luIHNyYyA9IHsKKwkJLnNpbl9hZGRyLnNfYWRkciA9IHJzLT5yc19ib3VuZF9hZGRyLAorCQkuc2luX3BvcnQgPSBycy0+cnNfYm91bmRfcG9ydCwKKwl9OworCXN0cnVjdCBzb2NrYWRkcl9pbiBkc3QgPSB7CisJCS5zaW5fYWRkci5zX2FkZHIgPSBycy0+cnNfY29ubl9hZGRyLAorCQkuc2luX3BvcnQgPSBycy0+cnNfY29ubl9wb3J0LAorCX07CiAJaW50IHJldDsKIAotCXJldCA9IHJkc19pd19nZXRfZGV2aWNlKHJzLCAmcmRzX2l3ZGV2LCAmY21faWQpOworCXJldCA9IHJkc19pd19nZXRfZGV2aWNlKCZzcmMsICZkc3QsICZyZHNfaXdkZXYsICZjbV9pZCk7CiAJaWYgKHJldCB8fCAhY21faWQpIHsKIAkJcmV0ID0gLUVOT0RFVjsKIAkJZ290byBvdXQ7CmRpZmYgLS1naXQgYS9uZXQvcmRzL3Jkcy5oIGIvbmV0L3Jkcy9yZHMuaAppbmRleCBjMmE1ZWVmLi4wZDQxMTU1IDEwMDY0NAotLS0gYS9uZXQvcmRzL3Jkcy5oCisrKyBiL25ldC9yZHMvcmRzLmgKQEAgLTExMCw2ICsxMTAsNyBAQAogCXZvaWQJCQkqY190cmFuc3BvcnRfZGF0YTsKIAogCWF0b21pY190CQljX3N0YXRlOworCXVuc2lnbmVkIGxvbmcJCWNfc2VuZF9nZW47CiAJdW5zaWduZWQgbG9uZwkJY19mbGFnczsKIAl1bnNpZ25lZCBsb25nCQljX3JlY29ubmVjdF9qaWZmaWVzOwogCXN0cnVjdCBkZWxheWVkX3dvcmsJY19zZW5kX3c7CkBAIC03MDIsOCArNzAzLDggQEAKIHZvaWQgcmRzX2luY19wdXQoc3RydWN0IHJkc19pbmNvbWluZyAqaW5jKTsKIHZvaWQgcmRzX3JlY3ZfaW5jb21pbmcoc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uLCBfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwKIAkJICAgICAgIHN0cnVjdCByZHNfaW5jb21pbmcgKmluYywgZ2ZwX3QgZ2ZwKTsKLWludCByZHNfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJc2l6ZV90IHNpemUsIGludCBtc2dfZmxhZ3MpOworaW50IHJkc19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsCisJCWludCBtc2dfZmxhZ3MpOwogdm9pZCByZHNfY2xlYXJfcmVjdl9xdWV1ZShzdHJ1Y3QgcmRzX3NvY2sgKnJzKTsKIGludCByZHNfbm90aWZ5X3F1ZXVlX2dldChzdHJ1Y3QgcmRzX3NvY2sgKnJzLCBzdHJ1Y3QgbXNnaGRyICptc2cpOwogdm9pZCByZHNfaW5jX2luZm9fY29weShzdHJ1Y3QgcmRzX2luY29taW5nICppbmMsCkBAIC03MTEsOCArNzEyLDcgQEAKIAkJICAgICAgIF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLCBpbnQgZmxpcCk7CiAKIC8qIHNlbmQuYyAqLwotaW50IHJkc19zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQlzaXplX3QgcGF5bG9hZF9sZW4pOworaW50IHJkc19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHBheWxvYWRfbGVuKTsKIHZvaWQgcmRzX3NlbmRfcmVzZXQoc3RydWN0IHJkc19jb25uZWN0aW9uICpjb25uKTsKIGludCByZHNfc2VuZF94bWl0KHN0cnVjdCByZHNfY29ubmVjdGlvbiAqY29ubik7CiBzdHJ1Y3Qgc29ja2FkZHJfaW47CmRpZmYgLS1naXQgYS9uZXQvcmRzL3JlY3YuYyBiL25ldC9yZHMvcmVjdi5jCmluZGV4IGY5ZWMxYWMuLmEwMDQ2MmIgMTAwNjQ0Ci0tLSBhL25ldC9yZHMvcmVjdi5jCisrKyBiL25ldC9yZHMvcmVjdi5jCkBAIC0zOTUsOCArMzk1LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHJkc19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQlzaXplX3Qgc2l6ZSwgaW50IG1zZ19mbGFncykKK2ludCByZHNfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLAorCQlpbnQgbXNnX2ZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCByZHNfc29jayAqcnMgPSByZHNfc2tfdG9fcnMoc2spOwpkaWZmIC0tZ2l0IGEvbmV0L3Jkcy9zZW5kLmMgYi9uZXQvcmRzL3NlbmQuYwppbmRleCA0MmY2NWQ0Li5lOTQzMGY1IDEwMDY0NAotLS0gYS9uZXQvcmRzL3NlbmQuYworKysgYi9uZXQvcmRzL3NlbmQuYwpAQCAtMTQwLDggKzE0MCwxMSBAQAogCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CiAJaW50IHJldCA9IDA7CiAJTElTVF9IRUFEKHRvX2JlX2Ryb3BwZWQpOworCWludCBiYXRjaF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHNlbmRfZ2VuID0gMDsKIAogcmVzdGFydDoKKwliYXRjaF9jb3VudCA9IDA7CiAKIAkvKgogCSAqIHNlbmRtc2cgY2FsbHMgaGVyZSBhZnRlciBoYXZpbmcgcXVldWVkIGl0cyBtZXNzYWdlIG9uIHRoZSBzZW5kCkBAIC0xNTcsNiArMTYwLDE3IEBACiAJfQogCiAJLyoKKwkgKiB3ZSByZWNvcmQgdGhlIHNlbmQgZ2VuZXJhdGlvbiBhZnRlciBkb2luZyB0aGUgeG1pdCBhY3F1aXJlLgorCSAqIGlmIHNvbWVvbmUgZWxzZSBtYW5hZ2VzIHRvIGp1bXAgaW4gYW5kIGRvIHNvbWUgd29yaywgd2UnbGwgdXNlCisJICogdGhpcyB0byBhdm9pZCBhIGdvdG8gcmVzdGFydCBmYXJ0aGVyIGRvd24uCisJICoKKwkgKiBUaGUgYWNxdWlyZV9pbl94bWl0KCkgY2hlY2sgYWJvdmUgZW5zdXJlcyB0aGF0IG9ubHkgb25lCisJICogY2FsbGVyIGNhbiBpbmNyZW1lbnQgY19zZW5kX2dlbiBhdCBhbnkgdGltZS4KKwkgKi8KKwljb25uLT5jX3NlbmRfZ2VuKys7CisJc2VuZF9nZW4gPSBjb25uLT5jX3NlbmRfZ2VuOworCisJLyoKIAkgKiByZHNfY29ubl9zaHV0ZG93bigpIHNldHMgdGhlIGNvbm4gc3RhdGUgYW5kIHRoZW4gdGVzdHMgUkRTX0lOX1hNSVQsCiAJICogd2UgZG8gdGhlIG9wcG9zaXRlIHRvIGF2b2lkIHJhY2VzLgogCSAqLwpAQCAtMjAyLDYgKzIxNiwxNiBAQAogCQlpZiAoIXJtKSB7CiAJCQl1bnNpZ25lZCBpbnQgbGVuOwogCisJCQliYXRjaF9jb3VudCsrOworCisJCQkvKiB3ZSB3YW50IHRvIHByb2Nlc3MgYXMgYmlnIGEgYmF0Y2ggYXMgd2UgY2FuLCBidXQKKwkJCSAqIHdlIGFsc28gd2FudCB0byBhdm9pZCBzb2Z0bG9ja3Vwcy4gIElmIHdlJ3ZlIGJlZW4KKwkJCSAqIHRocm91Z2ggYSBsb3Qgb2YgbWVzc2FnZXMsIGxldHMgYmFjayBvZmYgYW5kIHNlZQorCQkJICogaWYgYW55b25lIGVsc2UganVtcHMgaW4KKwkJCSAqLworCQkJaWYgKGJhdGNoX2NvdW50ID49IDEwMjQpCisJCQkJZ290byBvdmVyX2JhdGNoOworCiAJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY29ubi0+Y19sb2NrLCBmbGFncyk7CiAKIAkJCWlmICghbGlzdF9lbXB0eSgmY29ubi0+Y19zZW5kX3F1ZXVlKSkgewpAQCAtMzU3LDkgKzM4MSw5IEBACiAJCX0KIAl9CiAKK292ZXJfYmF0Y2g6CiAJaWYgKGNvbm4tPmNfdHJhbnMtPnhtaXRfY29tcGxldGUpCiAJCWNvbm4tPmNfdHJhbnMtPnhtaXRfY29tcGxldGUoY29ubik7Ci0KIAlyZWxlYXNlX2luX3htaXQoY29ubik7CiAKIAkvKiBOdWtlIGFueSBtZXNzYWdlcyB3ZSBkZWNpZGVkIG5vdCB0byByZXRyYW5zbWl0LiAqLwpAQCAtMzgwLDEwICs0MDQsMTUgQEAKIAkgKiBJZiB0aGUgdHJhbnNwb3J0IGNhbm5vdCBjb250aW51ZSAoaS5lIHJldCAhPSAwKSwgdGhlbiBpdCBtdXN0CiAJICogY2FsbCB1cyB3aGVuIG1vcmUgcm9vbSBpcyBhdmFpbGFibGUsIHN1Y2ggYXMgZnJvbSB0aGUgdHgKIAkgKiBjb21wbGV0aW9uIGhhbmRsZXIuCisJICoKKwkgKiBXZSBoYXZlIGFuIGV4dHJhIGdlbmVyYXRpb24gY2hlY2sgaGVyZSBzbyB0aGF0IGlmIHNvbWVvbmUgbWFuYWdlcworCSAqIHRvIGp1bXAgaW4gYWZ0ZXIgb3VyIHJlbGVhc2VfaW5feG1pdCwgd2UnbGwgc2VlIHRoYXQgdGhleSBoYXZlIGRvbmUKKwkgKiBzb21lIHdvcmsgYW5kIHdlIHdpbGwgc2tpcCBvdXIgZ290bwogCSAqLwogCWlmIChyZXQgPT0gMCkgewogCQlzbXBfbWIoKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZjb25uLT5jX3NlbmRfcXVldWUpKSB7CisJCWlmICghbGlzdF9lbXB0eSgmY29ubi0+Y19zZW5kX3F1ZXVlKSAmJgorCQkgICAgc2VuZF9nZW4gPT0gY29ubi0+Y19zZW5kX2dlbikgewogCQkJcmRzX3N0YXRzX2luYyhzX3NlbmRfbG9ja19xdWV1ZV9yYWNlZCk7CiAJCQlnb3RvIHJlc3RhcnQ7CiAJCX0KQEAgLTkyMCw4ICs5NDksNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCByZHNfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKLQkJc2l6ZV90IHBheWxvYWRfbGVuKQoraW50IHJkc19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHBheWxvYWRfbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCByZHNfc29jayAqcnMgPSByZHNfc2tfdG9fcnMoc2spOwpkaWZmIC0tZ2l0IGEvbmV0L3Jvc2UvYWZfcm9zZS5jIGIvbmV0L3Jvc2UvYWZfcm9zZS5jCmluZGV4IDQzYmFjN2MuLjhhZTYwMzAgMTAwNjQ0Ci0tLSBhL25ldC9yb3NlL2FmX3Jvc2UuYworKysgYi9uZXQvcm9zZS9hZl9yb3NlLmMKQEAgLTEwNDYsOCArMTA0Niw3IEBACiAJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyBpbnQgcm9zZV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgcm9zZV9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3Qgcm9zZV9zb2NrICpyb3NlID0gcm9zZV9zayhzayk7CkBAIC0xMjExLDggKzEyMTAsOCBAQAogfQogCiAKLXN0YXRpYyBpbnQgcm9zZV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsIGludCBmbGFncykKK3N0YXRpYyBpbnQgcm9zZV9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUsCisJCQlpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHJvc2Vfc29jayAqcm9zZSA9IHJvc2Vfc2soc2spOwpkaWZmIC0tZ2l0IGEvbmV0L3Jvc2Uvcm9zZV9kZXYuYyBiL25ldC9yb3NlL3Jvc2VfZGV2LmMKaW5kZXggNTAwMDU4OC4uMzY5Y2E4MSAxMDA2NDQKLS0tIGEvbmV0L3Jvc2Uvcm9zZV9kZXYuYworKysgYi9uZXQvcm9zZS9yb3NlX2Rldi5jCkBAIC00MSw2ICs0MSw5IEBACiB7CiAJdW5zaWduZWQgY2hhciAqYnVmZiA9IHNrYl9wdXNoKHNrYiwgUk9TRV9NSU5fTEVOICsgMik7CiAKKwlpZiAoZGFkZHIpCisJCW1lbWNweShidWZmICsgNywgZGFkZHIsIGRldi0+YWRkcl9sZW4pOworCiAJKmJ1ZmYrKyA9IFJPU0VfR0ZJIHwgUk9TRV9RX0JJVDsKIAkqYnVmZisrID0gMHgwMDsKIAkqYnVmZisrID0gUk9TRV9EQVRBOwpAQCAtNTMsNDMgKzU2LDYgQEAKIAlyZXR1cm4gLTM3OwogfQogCi1zdGF0aWMgaW50IHJvc2VfcmVidWlsZF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLSNpZmRlZiBDT05GSUdfSU5FVAotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBza2ItPmRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKLQl1bnNpZ25lZCBjaGFyICpicCA9ICh1bnNpZ25lZCBjaGFyICopc2tiLT5kYXRhOwotCXN0cnVjdCBza19idWZmICpza2JuOwotCXVuc2lnbmVkIGludCBsZW47Ci0KLQlpZiAoYXJwX2ZpbmQoYnAgKyA3LCBza2IpKSB7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmICgoc2tibiA9IHNrYl9jbG9uZShza2IsIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7Ci0JCWtmcmVlX3NrYihza2IpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQlpZiAoc2tiLT5zayAhPSBOVUxMKQotCQlza2Jfc2V0X293bmVyX3coc2tibiwgc2tiLT5zayk7Ci0KLQlrZnJlZV9za2Ioc2tiKTsKLQotCWxlbiA9IHNrYm4tPmxlbjsKLQotCWlmICghcm9zZV9yb3V0ZV9mcmFtZShza2JuLCBOVUxMKSkgewotCQlrZnJlZV9za2Ioc2tibik7Ci0JCXN0YXRzLT50eF9lcnJvcnMrKzsKLQkJcmV0dXJuIDE7Ci0JfQotCi0Jc3RhdHMtPnR4X3BhY2tldHMrKzsKLQlzdGF0cy0+dHhfYnl0ZXMgKz0gbGVuOwotI2VuZGlmCi0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpbnQgcm9zZV9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqYWRkcikKIHsKIAlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gYWRkcjsKQEAgLTEzNCwxOSArMTAwLDI2IEBACiBzdGF0aWMgbmV0ZGV2X3R4X3Qgcm9zZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CisJdW5zaWduZWQgaW50IGxlbiA9IHNrYi0+bGVuOwogCiAJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJST1NFOiByb3NlX3htaXQgLSBjYWxsZWQgd2hlbiBpZmFjZSBpcyBkb3duXG4iKTsKIAkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOwogCX0KLQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0Jc3RhdHMtPnR4X2Vycm9ycysrOworCisJaWYgKCFyb3NlX3JvdXRlX2ZyYW1lKHNrYiwgTlVMTCkpIHsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlzdGF0cy0+dHhfZXJyb3JzKys7CisJCXJldHVybiBORVRERVZfVFhfT0s7CisJfQorCisJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gbGVuOwogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGVhZGVyX29wcyByb3NlX2hlYWRlcl9vcHMgPSB7CiAJLmNyZWF0ZQk9IHJvc2VfaGVhZGVyLAotCS5yZWJ1aWxkID0gcm9zZV9yZWJ1aWxkX2hlYWRlciwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgcm9zZV9uZXRkZXZfb3BzID0gewpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FmX3J4cnBjLmMgYi9uZXQvcnhycGMvYWZfcnhycGMuYwppbmRleCA3YjE2NzA0Li4wMDk1YjlhIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvYWZfcnhycGMuYworKysgYi9uZXQvcnhycGMvYWZfcnhycGMuYwpAQCAtNDQxLDggKzQ0MSw3IEBACiAgKiAgIC0gc2VuZHMgYSBjYWxsIGRhdGEgcGFja2V0CiAgKiAgIC0gbWF5IHNlbmQgYW4gYWJvcnQgKGFib3J0IGNvZGUgaW4gY29udHJvbCBkYXRhKQogICovCi1zdGF0aWMgaW50IHJ4cnBjX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCBsZW4pCitzdGF0aWMgaW50IHJ4cnBjX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFuczsKIAlzdHJ1Y3QgcnhycGNfc29jayAqcnggPSByeHJwY19zayhzb2NrLT5zayk7CkBAIC00ODIsNyArNDgxLDcgQEAKIAlzd2l0Y2ggKHJ4LT5zay5za19zdGF0ZSkgewogCWNhc2UgUlhSUENfU0VSVkVSX0xJU1RFTklORzoKIAkJaWYgKCFtLT5tc2dfbmFtZSkgewotCQkJcmV0ID0gcnhycGNfc2VydmVyX3NlbmRtc2coaW9jYiwgcngsIG0sIGxlbik7CisJCQlyZXQgPSByeHJwY19zZXJ2ZXJfc2VuZG1zZyhyeCwgbSwgbGVuKTsKIAkJCWJyZWFrOwogCQl9CiAJY2FzZSBSWFJQQ19TRVJWRVJfQk9VTkQ6CkBAIC00OTIsNyArNDkxLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJY2FzZSBSWFJQQ19DTElFTlRfQ09OTkVDVEVEOgotCQlyZXQgPSByeHJwY19jbGllbnRfc2VuZG1zZyhpb2NiLCByeCwgdHJhbnMsIG0sIGxlbik7CisJCXJldCA9IHJ4cnBjX2NsaWVudF9zZW5kbXNnKHJ4LCB0cmFucywgbSwgbGVuKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0ID0gLUVOT1RDT05OOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWlucHV0LmMgYi9uZXQvcnhycGMvYXItaW5wdXQuYwppbmRleCA0ODFmODlmLi40NTA1YTY5IDEwMDY0NAotLS0gYS9uZXQvcnhycGMvYXItaW5wdXQuYworKysgYi9uZXQvcnhycGMvYXItaW5wdXQuYwpAQCAtMjgsNyArMjgsNyBAQAogY29uc3QgY2hhciAqcnhycGNfcGt0c1tdID0gewogCSI/MDAiLAogCSJEQVRBIiwgIkFDSyIsICJCVVNZIiwgIkFCT1JUIiwgIkFDS0FMTCIsICJDSEFMTCIsICJSRVNQIiwgIkRFQlVHIiwKLQkiPzA5IiwgIj8xMCIsICI/MTEiLCAiPzEyIiwgIj8xMyIsICI/MTQiLCAiPzE1IgorCSI/MDkiLCAiPzEwIiwgIj8xMSIsICI/MTIiLCAiVkVSU0lPTiIsICI/MTQiLCAiPzE1IgogfTsKIAogLyoKQEAgLTU5Myw2ICs1OTMsMjAgQEAKIAlyeHJwY19xdWV1ZV9jb25uKGNvbm4pOwogfQogCisvKgorICogcG9zdCBlbmRwb2ludC1sZXZlbCBldmVudHMgdG8gdGhlIGxvY2FsIGVuZHBvaW50CisgKiAtIHRoaXMgaW5jbHVkZXMgZGVidWcgYW5kIHZlcnNpb24gbWVzc2FnZXMKKyAqLworc3RhdGljIHZvaWQgcnhycGNfcG9zdF9wYWNrZXRfdG9fbG9jYWwoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlfZW50ZXIoIiVwLCVwIiwgbG9jYWwsIHNrYik7CisKKwlhdG9taWNfaW5jKCZsb2NhbC0+dXNhZ2UpOworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+ZXZlbnRfcXVldWUsIHNrYik7CisJcnhycGNfcXVldWVfd29yaygmbG9jYWwtPmV2ZW50X3Byb2Nlc3Nvcik7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgcnhycGNfY29ubmVjdGlvbiAqcnhycGNfY29ubl9mcm9tX2xvY2FsKHN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwsCiAJCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQkgICAgICAgc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCkKQEAgLTY5OSw2ICs3MTMsMTEgQEAKIAkJZ290byBiYWRfbWVzc2FnZTsKIAl9CiAKKwlpZiAoc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX1ZFUlNJT04pIHsKKwkJcnhycGNfcG9zdF9wYWNrZXRfdG9fbG9jYWwobG9jYWwsIHNrYik7CisJCWdvdG8gb3V0OworCX0KKwkKIAlpZiAoc3AtPmhkci50eXBlID09IFJYUlBDX1BBQ0tFVF9UWVBFX0RBVEEgJiYKIAkgICAgKHNwLT5oZHIuY2FsbE51bWJlciA9PSAwIHx8IHNwLT5oZHIuc2VxID09IDApKQogCQlnb3RvIGJhZF9tZXNzYWdlOwpAQCAtNzMxLDYgKzc1MCw4IEBACiAJCWVsc2UKIAkJCWdvdG8gY2FudF9yb3V0ZV9jYWxsOwogCX0KKworb3V0OgogCXJ4cnBjX3B1dF9sb2NhbChsb2NhbCk7CiAJcmV0dXJuOwogCmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItaW50ZXJuYWwuaCBiL25ldC9yeHJwYy9hci1pbnRlcm5hbC5oCmluZGV4IGJhOWZkMzYuLmFlZjFiZDIgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9hci1pbnRlcm5hbC5oCisrKyBiL25ldC9yeHJwYy9hci1pbnRlcm5hbC5oCkBAIC0xNTIsMTEgKzE1MiwxMyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdAlkZXN0cm95ZXI7CS8qIGVuZHBvaW50IGRlc3Ryb3llciAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdAlhY2NlcHRvcjsJLyogaW5jb21pbmcgY2FsbCBwcm9jZXNzb3IgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcmVqZWN0ZXI7CS8qIHBhY2tldCByZWplY3Qgd3JpdGVyICovCisJc3RydWN0IHdvcmtfc3RydWN0CWV2ZW50X3Byb2Nlc3NvcjsgLyogZW5kcG9pbnQgZXZlbnQgcHJvY2Vzc29yICovCiAJc3RydWN0IGxpc3RfaGVhZAlzZXJ2aWNlczsJLyogc2VydmljZXMgbGlzdGVuaW5nIG9uIHRoaXMgZW5kcG9pbnQgKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7CQkvKiBsaW5rIGluIGVuZHBvaW50IGxpc3QgKi8KIAlzdHJ1Y3Qgcndfc2VtYXBob3JlCWRlZnJhZ19zZW07CS8qIGNvbnRyb2wgcmUtZW5hYmxlbWVudCBvZiBJUCBERiBiaXQgKi8KIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCWFjY2VwdF9xdWV1ZTsJLyogaW5jb21pbmcgY2FsbHMgYXdhaXRpbmcgYWNjZXB0YW5jZSAqLwogCXN0cnVjdCBza19idWZmX2hlYWQJcmVqZWN0X3F1ZXVlOwkvKiBwYWNrZXRzIGF3YWl0aW5nIHJlamVjdGlvbiAqLworCXN0cnVjdCBza19idWZmX2hlYWQJZXZlbnRfcXVldWU7CS8qIGVuZHBvaW50IGV2ZW50IHBhY2tldHMgYXdhaXRpbmcgcHJvY2Vzc2luZyAqLwogCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBhY2Nlc3MgbG9jayAqLwogCXJ3bG9ja190CQlzZXJ2aWNlc19sb2NrOwkvKiBsb2NrIGZvciBzZXJ2aWNlcyBsaXN0ICovCiAJYXRvbWljX3QJCXVzYWdlOwpAQCAtNTQ4LDEwICs1NTAsOSBAQAogZXh0ZXJuIHVuc2lnbmVkIHJ4cnBjX3Jlc2VuZF90aW1lb3V0OwogCiBpbnQgcnhycGNfc2VuZF9wYWNrZXQoc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqLCBzdHJ1Y3Qgc2tfYnVmZiAqKTsKLWludCByeHJwY19jbGllbnRfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHJ4cnBjX3NvY2sgKiwKLQkJCSBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICosIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90KTsKLWludCByeHJwY19zZXJ2ZXJfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHJ4cnBjX3NvY2sgKiwgc3RydWN0IG1zZ2hkciAqLAotCQkJIHNpemVfdCk7CitpbnQgcnhycGNfY2xpZW50X3NlbmRtc2coc3RydWN0IHJ4cnBjX3NvY2sgKiwgc3RydWN0IHJ4cnBjX3RyYW5zcG9ydCAqLAorCQkJIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90KTsKK2ludCByeHJwY19zZXJ2ZXJfc2VuZG1zZyhzdHJ1Y3QgcnhycGNfc29jayAqLCBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7CiAKIC8qCiAgKiBhci1wZWVyLmMKQEAgLTU3Miw4ICs1NzMsNyBAQAogICogYXItcmVjdm1zZy5jCiAgKi8KIHZvaWQgcnhycGNfcmVtb3ZlX3VzZXJfSUQoc3RydWN0IHJ4cnBjX3NvY2sgKiwgc3RydWN0IHJ4cnBjX2NhbGwgKik7Ci1pbnQgcnhycGNfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCwKLQkJICBpbnQpOworaW50IHJ4cnBjX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqLCBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCwgaW50KTsKIAogLyoKICAqIGFyLXNlY3VyaXR5LmMKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hci1sb2NhbC5jIGIvbmV0L3J4cnBjL2FyLWxvY2FsLmMKaW5kZXggODdmNzEzNS4uY2E5MDRlZCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2FyLWxvY2FsLmMKKysrIGIvbmV0L3J4cnBjL2FyLWxvY2FsLmMKQEAgLTEzLDE2ICsxMywyMiBAQAogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAjaW5jbHVkZSA8bmV0L2FmX3J4cnBjLmg+CisjaW5jbHVkZSA8Z2VuZXJhdGVkL3V0c3JlbGVhc2UuaD4KICNpbmNsdWRlICJhci1pbnRlcm5hbC5oIgogCitzdGF0aWMgY29uc3QgY2hhciByeHJwY192ZXJzaW9uX3N0cmluZ1s2NV0gPSAibGludXgtIiBVVFNfUkVMRUFTRSAiIEFGX1JYUlBDIjsKKwogc3RhdGljIExJU1RfSEVBRChyeHJwY19sb2NhbHMpOwogREVGSU5FX1JXTE9DSyhyeHJwY19sb2NhbF9sb2NrKTsKIHN0YXRpYyBERUNMQVJFX1JXU0VNKHJ4cnBjX2xvY2FsX3NlbSk7CiBzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQocnhycGNfbG9jYWxfd3EpOwogCiBzdGF0aWMgdm9pZCByeHJwY19kZXN0cm95X2xvY2FsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCByeHJwY19wcm9jZXNzX2xvY2FsX2V2ZW50cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAvKgogICogYWxsb2NhdGUgYSBuZXcgbG9jYWwKQEAgLTM3LDExICs0MywxMyBAQAogCQlJTklUX1dPUksoJmxvY2FsLT5kZXN0cm95ZXIsICZyeHJwY19kZXN0cm95X2xvY2FsKTsKIAkJSU5JVF9XT1JLKCZsb2NhbC0+YWNjZXB0b3IsICZyeHJwY19hY2NlcHRfaW5jb21pbmdfY2FsbHMpOwogCQlJTklUX1dPUksoJmxvY2FsLT5yZWplY3RlciwgJnJ4cnBjX3JlamVjdF9wYWNrZXRzKTsKKwkJSU5JVF9XT1JLKCZsb2NhbC0+ZXZlbnRfcHJvY2Vzc29yLCAmcnhycGNfcHJvY2Vzc19sb2NhbF9ldmVudHMpOwogCQlJTklUX0xJU1RfSEVBRCgmbG9jYWwtPnNlcnZpY2VzKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5saW5rKTsKIAkJaW5pdF9yd3NlbSgmbG9jYWwtPmRlZnJhZ19zZW0pOwogCQlza2JfcXVldWVfaGVhZF9pbml0KCZsb2NhbC0+YWNjZXB0X3F1ZXVlKTsKIAkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbG9jYWwtPnJlamVjdF9xdWV1ZSk7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxvY2FsLT5ldmVudF9xdWV1ZSk7CiAJCXNwaW5fbG9ja19pbml0KCZsb2NhbC0+bG9jayk7CiAJCXJ3bG9ja19pbml0KCZsb2NhbC0+c2VydmljZXNfbG9jayk7CiAJCWF0b21pY19zZXQoJmxvY2FsLT51c2FnZSwgMSk7CkBAIC0yNjQsMTAgKzI3MiwxMiBAQAogCUFTU0VSVChsaXN0X2VtcHR5KCZsb2NhbC0+c2VydmljZXMpKTsKIAlBU1NFUlQoIXdvcmtfcGVuZGluZygmbG9jYWwtPmFjY2VwdG9yKSk7CiAJQVNTRVJUKCF3b3JrX3BlbmRpbmcoJmxvY2FsLT5yZWplY3RlcikpOworCUFTU0VSVCghd29ya19wZW5kaW5nKCZsb2NhbC0+ZXZlbnRfcHJvY2Vzc29yKSk7CiAKIAkvKiBmaW5pc2ggY2xlYW5pbmcgdXAgdGhlIGxvY2FsIGRlc2NyaXB0b3IgKi8KIAlyeHJwY19wdXJnZV9xdWV1ZSgmbG9jYWwtPmFjY2VwdF9xdWV1ZSk7CiAJcnhycGNfcHVyZ2VfcXVldWUoJmxvY2FsLT5yZWplY3RfcXVldWUpOworCXJ4cnBjX3B1cmdlX3F1ZXVlKCZsb2NhbC0+ZXZlbnRfcXVldWUpOwogCWtlcm5lbF9zb2NrX3NodXRkb3duKGxvY2FsLT5zb2NrZXQsIFNIVVRfUkRXUik7CiAJc29ja19yZWxlYXNlKGxvY2FsLT5zb2NrZXQpOwogCkBAIC0zMDgsMyArMzE4LDkxIEBACiAKIAlfbGVhdmUoIiIpOwogfQorCisvKgorICogUmVwbHkgdG8gYSB2ZXJzaW9uIHJlcXVlc3QKKyAqLworc3RhdGljIHZvaWQgcnhycGNfc2VuZF92ZXJzaW9uX3JlcXVlc3Qoc3RydWN0IHJ4cnBjX2xvY2FsICpsb2NhbCwKKwkJCQkgICAgICAgc3RydWN0IHJ4cnBjX2hlYWRlciAqaGRyLAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IGt2ZWMgaW92WzJdOworCXNpemVfdCBsZW47CisJaW50IHJldDsKKworCV9lbnRlcigiIik7CisKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2luLnNpbl9wb3J0ID0gdWRwX2hkcihza2IpLT5zb3VyY2U7CisJc2luLnNpbl9hZGRyLnNfYWRkciA9IGlwX2hkcihza2IpLT5zYWRkcjsKKworCW1zZy5tc2dfbmFtZQk9ICZzaW47CisJbXNnLm1zZ19uYW1lbGVuCT0gc2l6ZW9mKHNpbik7CisJbXNnLm1zZ19jb250cm9sCT0gTlVMTDsKKwltc2cubXNnX2NvbnRyb2xsZW4gPSAwOworCW1zZy5tc2dfZmxhZ3MJPSAwOworCisJaGRyLT5zZXEJPSAwOworCWhkci0+c2VyaWFsCT0gMDsKKwloZHItPnR5cGUJPSBSWFJQQ19QQUNLRVRfVFlQRV9WRVJTSU9OOworCWhkci0+ZmxhZ3MJPSBSWFJQQ19MQVNUX1BBQ0tFVCB8ICh+aGRyLT5mbGFncyAmIFJYUlBDX0NMSUVOVF9JTklUSUFURUQpOworCWhkci0+dXNlclN0YXR1cwk9IDA7CisJaGRyLT5fcnN2ZAk9IDA7CisKKwlpb3ZbMF0uaW92X2Jhc2UJPSBoZHI7CisJaW92WzBdLmlvdl9sZW4JPSBzaXplb2YoKmhkcik7CisJaW92WzFdLmlvdl9iYXNlCT0gKGNoYXIgKilyeHJwY192ZXJzaW9uX3N0cmluZzsKKwlpb3ZbMV0uaW92X2xlbgk9IHNpemVvZihyeHJwY192ZXJzaW9uX3N0cmluZyk7CisKKwlsZW4gPSBpb3ZbMF0uaW92X2xlbiArIGlvdlsxXS5pb3ZfbGVuOworCisJX3Byb3RvKCJUeCBWRVJTSU9OIChyZXBseSkiKTsKKworCXJldCA9IGtlcm5lbF9zZW5kbXNnKGxvY2FsLT5zb2NrZXQsICZtc2csIGlvdiwgMiwgbGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJX2RlYnVnKCJzZW5kbXNnIGZhaWxlZDogJWQiLCByZXQpOworCisJX2xlYXZlKCIiKTsKK30KKworLyoKKyAqIFByb2Nlc3MgZXZlbnQgcGFja2V0cyB0YXJnZXR0ZWQgYXQgYSBsb2NhbCBlbmRwb2ludC4KKyAqLworc3RhdGljIHZvaWQgcnhycGNfcHJvY2Vzc19sb2NhbF9ldmVudHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCByeHJwY19sb2NhbCAqbG9jYWwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHJ4cnBjX2xvY2FsLCBldmVudF9wcm9jZXNzb3IpOworCXN0cnVjdCBza19idWZmICpza2I7CisJY2hhciB2OworCisJX2VudGVyKCIiKTsKKworCWF0b21pY19pbmMoJmxvY2FsLT51c2FnZSk7CisJCisJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmbG9jYWwtPmV2ZW50X3F1ZXVlKSkpIHsKKwkJc3RydWN0IHJ4cnBjX3NrYl9wcml2ICpzcCA9IHJ4cnBjX3NrYihza2IpOworCisJCWtkZWJ1ZygieyVkfSx7JXV9IiwgbG9jYWwtPmRlYnVnX2lkLCBzcC0+aGRyLnR5cGUpOworCisJCXN3aXRjaCAoc3AtPmhkci50eXBlKSB7CisJCWNhc2UgUlhSUENfUEFDS0VUX1RZUEVfVkVSU0lPTjoKKwkJCWlmIChza2JfY29weV9iaXRzKHNrYiwgMCwgJnYsIDEpIDwgMCkKKwkJCQlyZXR1cm47CisJCQlfcHJvdG8oIlJ4IFZFUlNJT04geyAlMDJ4IH0iLCB2KTsKKwkJCWlmICh2ID09IDApCisJCQkJcnhycGNfc2VuZF92ZXJzaW9uX3JlcXVlc3QobG9jYWwsICZzcC0+aGRyLCBza2IpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCS8qIEp1c3QgaWdub3JlIGFueXRoaW5nIHdlIGRvbid0IHVuZGVyc3RhbmQgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJcnhycGNfcHV0X2xvY2FsKGxvY2FsKTsKKwkJcnhycGNfZnJlZV9za2Ioc2tiKTsKKwl9CisKKwlyeHJwY19wdXRfbG9jYWwobG9jYWwpOworCV9sZWF2ZSgiIik7Cit9CmRpZmYgLS1naXQgYS9uZXQvcnhycGMvYXItb3V0cHV0LmMgYi9uZXQvcnhycGMvYXItb3V0cHV0LmMKaW5kZXggODMzMWM5NS4uYzAwNDI4MCAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2FyLW91dHB1dC5jCisrKyBiL25ldC9yeHJwYy9hci1vdXRwdXQuYwpAQCAtMjMsOCArMjMsNyBAQAogICovCiB1bnNpZ25lZCByeHJwY19yZXNlbmRfdGltZW91dCA9IDQgKiBIWjsKIAotc3RhdGljIGludCByeHJwY19zZW5kX2RhdGEoc3RydWN0IGtpb2NiICppb2NiLAotCQkJICAgc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAorc3RhdGljIGludCByeHJwY19zZW5kX2RhdGEoc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LAogCQkJICAgc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwsCiAJCQkgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pOwogCkBAIC0xMjksOSArMTI4LDggQEAKICAqIC0gY2FsbGVyIGhvbGRzIHRoZSBzb2NrZXQgbG9ja2VkCiAgKiAtIHRoZSBzb2NrZXQgbWF5IGJlIGVpdGhlciBhIGNsaWVudCBzb2NrZXQgb3IgYSBzZXJ2ZXIgc29ja2V0CiAgKi8KLWludCByeHJwY19jbGllbnRfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCByeHJwY19zb2NrICpyeCwKLQkJCSBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkJIHNpemVfdCBsZW4pCitpbnQgcnhycGNfY2xpZW50X3NlbmRtc2coc3RydWN0IHJ4cnBjX3NvY2sgKnJ4LCBzdHJ1Y3QgcnhycGNfdHJhbnNwb3J0ICp0cmFucywKKwkJCSBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCiB7CiAJc3RydWN0IHJ4cnBjX2Nvbm5fYnVuZGxlICpidW5kbGU7CiAJZW51bSByeHJwY19jb21tYW5kIGNtZDsKQEAgLTE5MSw3ICsxODksNyBAQAogCQkvKiByZXF1ZXN0IHBoYXNlIGNvbXBsZXRlIGZvciB0aGlzIGNsaWVudCBjYWxsICovCiAJCXJldCA9IC1FUFJPVE87CiAJfSBlbHNlIHsKLQkJcmV0ID0gcnhycGNfc2VuZF9kYXRhKGlvY2IsIHJ4LCBjYWxsLCBtc2csIGxlbik7CisJCXJldCA9IHJ4cnBjX3NlbmRfZGF0YShyeCwgY2FsbCwgbXNnLCBsZW4pOwogCX0KIAogCXJ4cnBjX3B1dF9jYWxsKGNhbGwpOwpAQCAtMjMyLDcgKzIzMCw3IEBACiAJCSAgIGNhbGwtPnN0YXRlICE9IFJYUlBDX0NBTExfU0VSVkVSX1NFTkRfUkVQTFkpIHsKIAkJcmV0ID0gLUVQUk9UTzsgLyogcmVxdWVzdCBwaGFzZSBjb21wbGV0ZSBmb3IgdGhpcyBjbGllbnQgY2FsbCAqLwogCX0gZWxzZSB7Ci0JCXJldCA9IHJ4cnBjX3NlbmRfZGF0YShOVUxMLCBjYWxsLT5zb2NrZXQsIGNhbGwsIG1zZywgbGVuKTsKKwkJcmV0ID0gcnhycGNfc2VuZF9kYXRhKGNhbGwtPnNvY2tldCwgY2FsbCwgbXNnLCBsZW4pOwogCX0KIAogCXJlbGVhc2Vfc29jaygmY2FsbC0+c29ja2V0LT5zayk7CkBAIC0yNzEsOCArMjY5LDcgQEAKICAqIHNlbmQgYSBtZXNzYWdlIHRocm91Z2ggYSBzZXJ2ZXIgc29ja2V0CiAgKiAtIGNhbGxlciBob2xkcyB0aGUgc29ja2V0IGxvY2tlZAogICovCi1pbnQgcnhycGNfc2VydmVyX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgcnhycGNfc29jayAqcngsCi0JCQkgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQoraW50IHJ4cnBjX3NlcnZlcl9zZW5kbXNnKHN0cnVjdCByeHJwY19zb2NrICpyeCwgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQogewogCWVudW0gcnhycGNfY29tbWFuZCBjbWQ7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGw7CkBAIC0zMTMsNyArMzEwLDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcmV0ID0gcnhycGNfc2VuZF9kYXRhKGlvY2IsIHJ4LCBjYWxsLCBtc2csIGxlbik7CisJCXJldCA9IHJ4cnBjX3NlbmRfZGF0YShyeCwgY2FsbCwgbXNnLCBsZW4pOwogCQlicmVhazsKIAogCWNhc2UgUlhSUENfQ01EX1NFTkRfQUJPUlQ6CkBAIC01MjAsOCArNTE3LDcgQEAKICAqIC0gbXVzdCBiZSBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0CiAgKiAtIGNhbGxlciBob2xkcyB0aGUgc29ja2V0IGxvY2tlZAogICovCi1zdGF0aWMgaW50IHJ4cnBjX3NlbmRfZGF0YShzdHJ1Y3Qga2lvY2IgKmlvY2IsCi0JCQkgICBzdHJ1Y3QgcnhycGNfc29jayAqcngsCitzdGF0aWMgaW50IHJ4cnBjX3NlbmRfZGF0YShzdHJ1Y3QgcnhycGNfc29jayAqcngsCiAJCQkgICBzdHJ1Y3QgcnhycGNfY2FsbCAqY2FsbCwKIAkJCSAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKIHsKQEAgLTU0NiwxMSArNTQyLDcgQEAKIAljYWxsLT50eF9wZW5kaW5nID0gTlVMTDsKIAogCWNvcGllZCA9IDA7Ci0JaWYgKGxlbiA+IGlvdl9pdGVyX2NvdW50KCZtc2ctPm1zZ19pdGVyKSkKLQkJbGVuID0gaW92X2l0ZXJfY291bnQoJm1zZy0+bXNnX2l0ZXIpOwotCXdoaWxlIChsZW4pIHsKLQkJaW50IGNvcHk7Ci0KKwlkbyB7CiAJCWlmICghc2tiKSB7CiAJCQlzaXplX3Qgc2l6ZSwgY2h1bmssIG1heCwgc3BhY2U7CiAKQEAgLTU3Miw4ICs1NjQsOCBAQAogCQkJbWF4ICY9IH4oY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbiAtIDFVTCk7CiAKIAkJCWNodW5rID0gbWF4OwotCQkJaWYgKGNodW5rID4gbGVuICYmICFtb3JlKQotCQkJCWNodW5rID0gbGVuOworCQkJaWYgKGNodW5rID4gbXNnX2RhdGFfbGVmdChtc2cpICYmICFtb3JlKQorCQkJCWNodW5rID0gbXNnX2RhdGFfbGVmdChtc2cpOwogCiAJCQlzcGFjZSA9IGNodW5rICsgY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbjsKIAkJCXNwYWNlICY9IH4oY2FsbC0+Y29ubi0+c2l6ZV9hbGlnbiAtIDFVTCk7CkBAIC02MTYsMjMgKzYwOCwyMyBAQAogCQlzcCA9IHJ4cnBjX3NrYihza2IpOwogCiAJCS8qIGFwcGVuZCBuZXh0IHNlZ21lbnQgb2YgZGF0YSB0byB0aGUgY3VycmVudCBidWZmZXIgKi8KLQkJY29weSA9IHNrYl90YWlscm9vbShza2IpOwotCQlBU1NFUlRDTVAoY29weSwgPiwgMCk7Ci0JCWlmIChjb3B5ID4gbGVuKQotCQkJY29weSA9IGxlbjsKLQkJaWYgKGNvcHkgPiBzcC0+cmVtYWluKQotCQkJY29weSA9IHNwLT5yZW1haW47CisJCWlmIChtc2dfZGF0YV9sZWZ0KG1zZykgPiAwKSB7CisJCQlpbnQgY29weSA9IHNrYl90YWlscm9vbShza2IpOworCQkJQVNTRVJUQ01QKGNvcHksID4sIDApOworCQkJaWYgKGNvcHkgPiBtc2dfZGF0YV9sZWZ0KG1zZykpCisJCQkJY29weSA9IG1zZ19kYXRhX2xlZnQobXNnKTsKKwkJCWlmIChjb3B5ID4gc3AtPnJlbWFpbikKKwkJCQljb3B5ID0gc3AtPnJlbWFpbjsKIAotCQlfZGVidWcoImFkZCIpOwotCQlyZXQgPSBza2JfYWRkX2RhdGEoc2tiLCAmbXNnLT5tc2dfaXRlciwgY29weSk7Ci0JCV9kZWJ1ZygiYWRkZWQiKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGVmYXVsdDsKLQkJc3AtPnJlbWFpbiAtPSBjb3B5OwotCQlza2ItPm1hcmsgKz0gY29weTsKLQkJY29waWVkICs9IGNvcHk7Ci0KLQkJbGVuIC09IGNvcHk7CisJCQlfZGVidWcoImFkZCIpOworCQkJcmV0ID0gc2tiX2FkZF9kYXRhKHNrYiwgJm1zZy0+bXNnX2l0ZXIsIGNvcHkpOworCQkJX2RlYnVnKCJhZGRlZCIpOworCQkJaWYgKHJldCA8IDApCisJCQkJZ290byBlZmF1bHQ7CisJCQlzcC0+cmVtYWluIC09IGNvcHk7CisJCQlza2ItPm1hcmsgKz0gY29weTsKKwkJCWNvcGllZCArPSBjb3B5OworCQl9CiAKIAkJLyogY2hlY2sgZm9yIHRoZSBmYXIgc2lkZSBhYm9ydGluZyB0aGUgY2FsbCBvciBhIG5ldHdvcmsgZXJyb3IKIAkJICogb2NjdXJyaW5nICovCkBAIC02NDAsNyArNjMyLDggQEAKIAkJCWdvdG8gY2FsbF9hYm9ydGVkOwogCiAJCS8qIGFkZCB0aGUgcGFja2V0IHRvIHRoZSBzZW5kIHF1ZXVlIGlmIGl0J3Mgbm93IGZ1bGwgKi8KLQkJaWYgKHNwLT5yZW1haW4gPD0gMCB8fCAoIWxlbiAmJiAhbW9yZSkpIHsKKwkJaWYgKHNwLT5yZW1haW4gPD0gMCB8fAorCQkgICAgKG1zZ19kYXRhX2xlZnQobXNnKSA9PSAwICYmICFtb3JlKSkgewogCQkJc3RydWN0IHJ4cnBjX2Nvbm5lY3Rpb24gKmNvbm4gPSBjYWxsLT5jb25uOwogCQkJdWludDMyX3Qgc2VxOwogCQkJc2l6ZV90IHBhZDsKQEAgLTY3MCw3ICs2NjMsNyBAQAogCQkJc3AtPmhkci5zZXJ2aWNlSWQgPSBjb25uLT5zZXJ2aWNlX2lkOwogCiAJCQlzcC0+aGRyLmZsYWdzID0gY29ubi0+b3V0X2NsaWVudGZsYWc7Ci0JCQlpZiAobGVuID09IDAgJiYgIW1vcmUpCisJCQlpZiAobXNnX2RhdGFfbGVmdChtc2cpID09IDAgJiYgIW1vcmUpCiAJCQkJc3AtPmhkci5mbGFncyB8PSBSWFJQQ19MQVNUX1BBQ0tFVDsKIAkJCWVsc2UgaWYgKENJUkNfU1BBQ0UoY2FsbC0+YWNrc19oZWFkLCBjYWxsLT5hY2tzX3RhaWwsCiAJCQkJCSAgICBjYWxsLT5hY2tzX3dpbnN6KSA+IDEpCkBAIC02ODYsMTAgKzY3OSwxMCBAQAogCiAJCQltZW1jcHkoc2tiLT5oZWFkLCAmc3AtPmhkciwKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IHJ4cnBjX2hlYWRlcikpOwotCQkJcnhycGNfcXVldWVfcGFja2V0KGNhbGwsIHNrYiwgIWlvdl9pdGVyX2NvdW50KCZtc2ctPm1zZ19pdGVyKSAmJiAhbW9yZSk7CisJCQlyeHJwY19xdWV1ZV9wYWNrZXQoY2FsbCwgc2tiLCAhbXNnX2RhdGFfbGVmdChtc2cpICYmICFtb3JlKTsKIAkJCXNrYiA9IE5VTEw7CiAJCX0KLQl9CisJfSB3aGlsZSAobXNnX2RhdGFfbGVmdChtc2cpID4gMCk7CiAKIHN1Y2Nlc3M6CiAJcmV0ID0gY29waWVkOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLXJlY3Ztc2cuYyBiL25ldC9yeHJwYy9hci1yZWN2bXNnLmMKaW5kZXggNDU3NTQ4NS4uYjkyYmVkZSAxMDA2NDQKLS0tIGEvbmV0L3J4cnBjL2FyLXJlY3Ztc2cuYworKysgYi9uZXQvcnhycGMvYXItcmVjdm1zZy5jCkBAIC00Myw4ICs0Myw4IEBACiAgKiAtIHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCB0d28gb3IgbW9yZSB0aHJlYWRzIGNhbGxpbmcgcmVjdm1zZwogICogICBzaW11bHRhbmVvdXNseQogICovCi1pbnQgcnhycGNfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCSAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MpCitpbnQgcnhycGNfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCisJCSAgaW50IGZsYWdzKQogewogCXN0cnVjdCByeHJwY19za2JfcHJpdiAqc3A7CiAJc3RydWN0IHJ4cnBjX2NhbGwgKmNhbGwgPSBOVUxMLCAqY29udGludWVfY2FsbCA9IE5VTEw7CkBAIC04Nyw3ICs4Nyw3IEBACiAJCWlmICghc2tiKSB7CiAJCQkvKiBub3RoaW5nIHJlbWFpbnMgb24gdGhlIHF1ZXVlICovCiAJCQlpZiAoY29waWVkICYmCi0JCQkgICAgKG1zZy0+bXNnX2ZsYWdzICYgTVNHX1BFRUsgfHwgdGltZW8gPT0gMCkpCisJCQkgICAgKGZsYWdzICYgTVNHX1BFRUsgfHwgdGltZW8gPT0gMCkpCiAJCQkJZ290byBvdXQ7CiAKIAkJCS8qIHdhaXQgZm9yIGEgbWVzc2FnZSB0byB0dXJuIHVwICovCkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJCQkgICAgICAgJmNhbGwtPmNvbm4tPnRyYW5zLT5wZWVyLT5zcngsIGxlbik7CiAJCQkJbXNnLT5tc2dfbmFtZWxlbiA9IGxlbjsKIAkJCX0KLQkJCXNvY2tfcmVjdl90c19hbmRfZHJvcHMobXNnLCAmcngtPnNrLCBza2IpOworCQkJc29ja19yZWN2X3RpbWVzdGFtcChtc2csICZyeC0+c2ssIHNrYik7CiAJCX0KIAogCQkvKiByZWNlaXZlIHRoZSBtZXNzYWdlICovCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvYWN0X2JwZi5jIGIvbmV0L3NjaGVkL2FjdF9icGYuYwppbmRleCA4MmM1ZDdmLi40ZDJjZWRlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvYWN0X2JwZi5jCisrKyBiL25ldC9zY2hlZC9hY3RfYnBmLmMKQEAgLTEzLDcxICsxMywxNDAgQEAKICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KICNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9icGYuaD4KKwogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgogCiAjaW5jbHVkZSA8bGludXgvdGNfYWN0L3RjX2JwZi5oPgogI2luY2x1ZGUgPG5ldC90Y19hY3QvdGNfYnBmLmg+CiAKLSNkZWZpbmUgQlBGX1RBQl9NQVNLICAgICAxNQorI2RlZmluZSBCUEZfVEFCX01BU0sJCTE1CisjZGVmaW5lIEFDVF9CUEZfTkFNRV9MRU4JMjU2CiAKLXN0YXRpYyBpbnQgdGNmX2JwZihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgdGNfYWN0aW9uICphLAorc3RydWN0IHRjZl9icGZfY2ZnIHsKKwlzdHJ1Y3QgYnBmX3Byb2cgKmZpbHRlcjsKKwlzdHJ1Y3Qgc29ja19maWx0ZXIgKmJwZl9vcHM7CisJY2hhciAqYnBmX25hbWU7CisJdTMyIGJwZl9mZDsKKwl1MTYgYnBmX251bV9vcHM7Cit9OworCitzdGF0aWMgaW50IHRjZl9icGYoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjX2FjdGlvbiAqYWN0LAogCQkgICBzdHJ1Y3QgdGNmX3Jlc3VsdCAqcmVzKQogewotCXN0cnVjdCB0Y2ZfYnBmICpiID0gYS0+cHJpdjsKLQlpbnQgYWN0aW9uOwotCWludCBmaWx0ZXJfcmVzOworCXN0cnVjdCB0Y2ZfYnBmICpwcm9nID0gYWN0LT5wcml2OworCWludCBhY3Rpb24sIGZpbHRlcl9yZXM7CiAKLQlzcGluX2xvY2soJmItPnRjZl9sb2NrKTsKLQliLT50Y2ZfdG0ubGFzdHVzZSA9IGppZmZpZXM7Ci0JYnN0YXRzX3VwZGF0ZSgmYi0+dGNmX2JzdGF0cywgc2tiKTsKLQlhY3Rpb24gPSBiLT50Y2ZfYWN0aW9uOworCXNwaW5fbG9jaygmcHJvZy0+dGNmX2xvY2spOwogCi0JZmlsdGVyX3JlcyA9IEJQRl9QUk9HX1JVTihiLT5maWx0ZXIsIHNrYik7Ci0JaWYgKGZpbHRlcl9yZXMgPT0gMCkgewotCQkvKiBSZXR1cm4gY29kZSAwIGZyb20gdGhlIEJQRiBwcm9ncmFtCi0JCSAqIGlzIGJlaW5nIGludGVycHJldGVkIGFzIGEgZHJvcCBoZXJlLgotCQkgKi8KLQkJYWN0aW9uID0gVENfQUNUX1NIT1Q7Ci0JCWItPnRjZl9xc3RhdHMuZHJvcHMrKzsKKwlwcm9nLT50Y2ZfdG0ubGFzdHVzZSA9IGppZmZpZXM7CisJYnN0YXRzX3VwZGF0ZSgmcHJvZy0+dGNmX2JzdGF0cywgc2tiKTsKKworCS8qIE5lZWRlZCBoZXJlIGZvciBhY2Nlc3NpbmcgbWFwcy4gKi8KKwlyY3VfcmVhZF9sb2NrKCk7CisJZmlsdGVyX3JlcyA9IEJQRl9QUk9HX1JVTihwcm9nLT5maWx0ZXIsIHNrYik7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkvKiBBIEJQRiBwcm9ncmFtIG1heSBvdmVyd3JpdGUgdGhlIGRlZmF1bHQgYWN0aW9uIG9wY29kZS4KKwkgKiBTaW1pbGFybHkgYXMgaW4gY2xzX2JwZiwgaWYgZmlsdGVyX3JlcyA9PSAtMSB3ZSB1c2UgdGhlCisJICogZGVmYXVsdCBhY3Rpb24gc3BlY2lmaWVkIGZyb20gdGMuCisJICoKKwkgKiBJbiBjYXNlIGEgZGlmZmVyZW50IHdlbGwta25vd24gVENfQUNUIG9wY29kZSBoYXMgYmVlbgorCSAqIHJldHVybmVkLCBpdCB3aWxsIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBvbmUuCisJICoKKwkgKiBGb3IgZXZlcnl0aGluZyBlbHNlIHRoYXQgaXMgdW5rb3duLCBUQ19BQ1RfVU5TUEVDIGlzCisJICogcmV0dXJuZWQuCisJICovCisJc3dpdGNoIChmaWx0ZXJfcmVzKSB7CisJY2FzZSBUQ19BQ1RfUElQRToKKwljYXNlIFRDX0FDVF9SRUNMQVNTSUZZOgorCWNhc2UgVENfQUNUX09LOgorCQlhY3Rpb24gPSBmaWx0ZXJfcmVzOworCQlicmVhazsKKwljYXNlIFRDX0FDVF9TSE9UOgorCQlhY3Rpb24gPSBmaWx0ZXJfcmVzOworCQlwcm9nLT50Y2ZfcXN0YXRzLmRyb3BzKys7CisJCWJyZWFrOworCWNhc2UgVENfQUNUX1VOU1BFQzoKKwkJYWN0aW9uID0gcHJvZy0+dGNmX2FjdGlvbjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYWN0aW9uID0gVENfQUNUX1VOU1BFQzsKKwkJYnJlYWs7CiAJfQogCi0Jc3Bpbl91bmxvY2soJmItPnRjZl9sb2NrKTsKKwlzcGluX3VubG9jaygmcHJvZy0+dGNmX2xvY2spOwogCXJldHVybiBhY3Rpb247CiB9CiAKLXN0YXRpYyBpbnQgdGNmX2JwZl9kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y19hY3Rpb24gKmEsCitzdGF0aWMgYm9vbCB0Y2ZfYnBmX2lzX2VicGYoY29uc3Qgc3RydWN0IHRjZl9icGYgKnByb2cpCit7CisJcmV0dXJuICFwcm9nLT5icGZfb3BzOworfQorCitzdGF0aWMgaW50IHRjZl9icGZfZHVtcF9icGZfaW5mbyhjb25zdCBzdHJ1Y3QgdGNmX2JwZiAqcHJvZywKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmxhdHRyICpubGE7CisKKwlpZiAobmxhX3B1dF91MTYoc2tiLCBUQ0FfQUNUX0JQRl9PUFNfTEVOLCBwcm9nLT5icGZfbnVtX29wcykpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlubGEgPSBubGFfcmVzZXJ2ZShza2IsIFRDQV9BQ1RfQlBGX09QUywgcHJvZy0+YnBmX251bV9vcHMgKgorCQkJICBzaXplb2Yoc3RydWN0IHNvY2tfZmlsdGVyKSk7CisJaWYgKG5sYSA9PSBOVUxMKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJbWVtY3B5KG5sYV9kYXRhKG5sYSksIHByb2ctPmJwZl9vcHMsIG5sYV9sZW4obmxhKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y2ZfYnBmX2R1bXBfZWJwZl9pbmZvKGNvbnN0IHN0cnVjdCB0Y2ZfYnBmICpwcm9nLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAobmxhX3B1dF91MzIoc2tiLCBUQ0FfQUNUX0JQRl9GRCwgcHJvZy0+YnBmX2ZkKSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmIChwcm9nLT5icGZfbmFtZSAmJgorCSAgICBubGFfcHV0X3N0cmluZyhza2IsIFRDQV9BQ1RfQlBGX05BTUUsIHByb2ctPmJwZl9uYW1lKSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRjZl9icGZfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgdGNfYWN0aW9uICphY3QsCiAJCQlpbnQgYmluZCwgaW50IHJlZikKIHsKIAl1bnNpZ25lZCBjaGFyICp0cCA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKTsKLQlzdHJ1Y3QgdGNmX2JwZiAqYiA9IGEtPnByaXY7CisJc3RydWN0IHRjZl9icGYgKnByb2cgPSBhY3QtPnByaXY7CiAJc3RydWN0IHRjX2FjdF9icGYgb3B0ID0gewotCQkuaW5kZXggICAgPSBiLT50Y2ZfaW5kZXgsCi0JCS5yZWZjbnQgICA9IGItPnRjZl9yZWZjbnQgLSByZWYsCi0JCS5iaW5kY250ICA9IGItPnRjZl9iaW5kY250IC0gYmluZCwKLQkJLmFjdGlvbiAgID0gYi0+dGNmX2FjdGlvbiwKKwkJLmluZGV4ICAgPSBwcm9nLT50Y2ZfaW5kZXgsCisJCS5yZWZjbnQgID0gcHJvZy0+dGNmX3JlZmNudCAtIHJlZiwKKwkJLmJpbmRjbnQgPSBwcm9nLT50Y2ZfYmluZGNudCAtIGJpbmQsCisJCS5hY3Rpb24gID0gcHJvZy0+dGNmX2FjdGlvbiwKIAl9OwotCXN0cnVjdCB0Y2ZfdCB0OwotCXN0cnVjdCBubGF0dHIgKm5sYTsKKwlzdHJ1Y3QgdGNmX3QgdG07CisJaW50IHJldDsKIAogCWlmIChubGFfcHV0KHNrYiwgVENBX0FDVF9CUEZfUEFSTVMsIHNpemVvZihvcHQpLCAmb3B0KSkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlpZiAobmxhX3B1dF91MTYoc2tiLCBUQ0FfQUNUX0JQRl9PUFNfTEVOLCBiLT5icGZfbnVtX29wcykpCisJaWYgKHRjZl9icGZfaXNfZWJwZihwcm9nKSkKKwkJcmV0ID0gdGNmX2JwZl9kdW1wX2VicGZfaW5mbyhwcm9nLCBza2IpOworCWVsc2UKKwkJcmV0ID0gdGNmX2JwZl9kdW1wX2JwZl9pbmZvKHByb2csIHNrYik7CisJaWYgKHJldCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlubGEgPSBubGFfcmVzZXJ2ZShza2IsIFRDQV9BQ1RfQlBGX09QUywgYi0+YnBmX251bV9vcHMgKgotCQkJICBzaXplb2Yoc3RydWN0IHNvY2tfZmlsdGVyKSk7Ci0JaWYgKCFubGEpCisJdG0uaW5zdGFsbCA9IGppZmZpZXNfdG9fY2xvY2tfdChqaWZmaWVzIC0gcHJvZy0+dGNmX3RtLmluc3RhbGwpOworCXRtLmxhc3R1c2UgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIHByb2ctPnRjZl90bS5sYXN0dXNlKTsKKwl0bS5leHBpcmVzID0gamlmZmllc190b19jbG9ja190KHByb2ctPnRjZl90bS5leHBpcmVzKTsKKworCWlmIChubGFfcHV0KHNrYiwgVENBX0FDVF9CUEZfVE0sIHNpemVvZih0bSksICZ0bSkpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCi0JbWVtY3B5KG5sYV9kYXRhKG5sYSksIGItPmJwZl9vcHMsIG5sYV9sZW4obmxhKSk7Ci0KLQl0Lmluc3RhbGwgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIGItPnRjZl90bS5pbnN0YWxsKTsKLQl0Lmxhc3R1c2UgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoamlmZmllcyAtIGItPnRjZl90bS5sYXN0dXNlKTsKLQl0LmV4cGlyZXMgPSBqaWZmaWVzX3RvX2Nsb2NrX3QoYi0+dGNmX3RtLmV4cGlyZXMpOwotCWlmIChubGFfcHV0KHNrYiwgVENBX0FDVF9CUEZfVE0sIHNpemVvZih0KSwgJnQpKQotCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlyZXR1cm4gc2tiLT5sZW47CiAKIG5sYV9wdXRfZmFpbHVyZToKQEAgLTg3LDM2ICsxNTYsMjEgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGFjdF9icGZfcG9saWN5W1RDQV9BQ1RfQlBGX01BWCArIDFdID0gewogCVtUQ0FfQUNUX0JQRl9QQVJNU10JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IHRjX2FjdF9icGYpIH0sCisJW1RDQV9BQ1RfQlBGX0ZEXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW1RDQV9BQ1RfQlBGX05BTUVdCT0geyAudHlwZSA9IE5MQV9OVUxfU1RSSU5HLCAubGVuID0gQUNUX0JQRl9OQU1FX0xFTiB9LAogCVtUQ0FfQUNUX0JQRl9PUFNfTEVOXQk9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW1RDQV9BQ1RfQlBGX09QU10JPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKIAkJCQkgICAgLmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja19maWx0ZXIpICogQlBGX01BWElOU05TIH0sCiB9OwogCi1zdGF0aWMgaW50IHRjZl9icGZfaW5pdChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBubGF0dHIgKm5sYSwKLQkJCXN0cnVjdCBubGF0dHIgKmVzdCwgc3RydWN0IHRjX2FjdGlvbiAqYSwKLQkJCWludCBvdnIsIGludCBiaW5kKQorc3RhdGljIGludCB0Y2ZfYnBmX2luaXRfZnJvbV9vcHMoc3RydWN0IG5sYXR0ciAqKnRiLCBzdHJ1Y3QgdGNmX2JwZl9jZmcgKmNmZykKIHsKLQlzdHJ1Y3QgbmxhdHRyICp0YltUQ0FfQUNUX0JQRl9NQVggKyAxXTsKLQlzdHJ1Y3QgdGNfYWN0X2JwZiAqcGFybTsKLQlzdHJ1Y3QgdGNmX2JwZiAqYjsKLQl1MTYgYnBmX3NpemUsIGJwZl9udW1fb3BzOwogCXN0cnVjdCBzb2NrX2ZpbHRlciAqYnBmX29wczsKLQlzdHJ1Y3Qgc29ja19mcHJvZ19rZXJuIHRtcDsKKwlzdHJ1Y3Qgc29ja19mcHJvZ19rZXJuIGZwcm9nX3RtcDsKIAlzdHJ1Y3QgYnBmX3Byb2cgKmZwOworCXUxNiBicGZfc2l6ZSwgYnBmX251bV9vcHM7CiAJaW50IHJldDsKIAotCWlmICghbmxhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldCA9IG5sYV9wYXJzZV9uZXN0ZWQodGIsIFRDQV9BQ1RfQlBGX01BWCwgbmxhLCBhY3RfYnBmX3BvbGljeSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoIXRiW1RDQV9BQ1RfQlBGX1BBUk1TXSB8fAotCSAgICAhdGJbVENBX0FDVF9CUEZfT1BTX0xFTl0gfHwgIXRiW1RDQV9BQ1RfQlBGX09QU10pCi0JCXJldHVybiAtRUlOVkFMOwotCXBhcm0gPSBubGFfZGF0YSh0YltUQ0FfQUNUX0JQRl9QQVJNU10pOwotCiAJYnBmX251bV9vcHMgPSBubGFfZ2V0X3UxNih0YltUQ0FfQUNUX0JQRl9PUFNfTEVOXSk7CiAJaWYgKGJwZl9udW1fb3BzCT4gQlBGX01BWElOU05TIHx8IGJwZl9udW1fb3BzID09IDApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTI2LDY4ICsxODAsMTY1IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJYnBmX29wcyA9IGt6YWxsb2MoYnBmX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghYnBmX29wcykKKwlpZiAoYnBmX29wcyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCW1lbWNweShicGZfb3BzLCBubGFfZGF0YSh0YltUQ0FfQUNUX0JQRl9PUFNdKSwgYnBmX3NpemUpOwogCi0JdG1wLmxlbiA9IGJwZl9udW1fb3BzOwotCXRtcC5maWx0ZXIgPSBicGZfb3BzOworCWZwcm9nX3RtcC5sZW4gPSBicGZfbnVtX29wczsKKwlmcHJvZ190bXAuZmlsdGVyID0gYnBmX29wczsKIAotCXJldCA9IGJwZl9wcm9nX2NyZWF0ZSgmZnAsICZ0bXApOwotCWlmIChyZXQpCi0JCWdvdG8gZnJlZV9icGZfb3BzOworCXJldCA9IGJwZl9wcm9nX2NyZWF0ZSgmZnAsICZmcHJvZ190bXApOworCWlmIChyZXQgPCAwKSB7CisJCWtmcmVlKGJwZl9vcHMpOworCQlyZXR1cm4gcmV0OworCX0KIAotCWlmICghdGNmX2hhc2hfY2hlY2socGFybS0+aW5kZXgsIGEsIGJpbmQpKSB7Ci0JCXJldCA9IHRjZl9oYXNoX2NyZWF0ZShwYXJtLT5pbmRleCwgZXN0LCBhLCBzaXplb2YoKmIpLCBiaW5kKTsKLQkJaWYgKHJldCkKKwljZmctPmJwZl9vcHMgPSBicGZfb3BzOworCWNmZy0+YnBmX251bV9vcHMgPSBicGZfbnVtX29wczsKKwljZmctPmZpbHRlciA9IGZwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGNmX2JwZl9pbml0X2Zyb21fZWZkKHN0cnVjdCBubGF0dHIgKip0Yiwgc3RydWN0IHRjZl9icGZfY2ZnICpjZmcpCit7CisJc3RydWN0IGJwZl9wcm9nICpmcDsKKwljaGFyICpuYW1lID0gTlVMTDsKKwl1MzIgYnBmX2ZkOworCisJYnBmX2ZkID0gbmxhX2dldF91MzIodGJbVENBX0FDVF9CUEZfRkRdKTsKKworCWZwID0gYnBmX3Byb2dfZ2V0KGJwZl9mZCk7CisJaWYgKElTX0VSUihmcCkpCisJCXJldHVybiBQVFJfRVJSKGZwKTsKKworCWlmIChmcC0+dHlwZSAhPSBCUEZfUFJPR19UWVBFX1NDSEVEX0FDVCkgeworCQlicGZfcHJvZ19wdXQoZnApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodGJbVENBX0FDVF9CUEZfTkFNRV0pIHsKKwkJbmFtZSA9IGttZW1kdXAobmxhX2RhdGEodGJbVENBX0FDVF9CUEZfTkFNRV0pLAorCQkJICAgICAgIG5sYV9sZW4odGJbVENBX0FDVF9CUEZfTkFNRV0pLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIW5hbWUpIHsKKwkJCWJwZl9wcm9nX3B1dChmcCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCWNmZy0+YnBmX2ZkID0gYnBmX2ZkOworCWNmZy0+YnBmX25hbWUgPSBuYW1lOworCWNmZy0+ZmlsdGVyID0gZnA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y2ZfYnBmX2luaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmxhdHRyICpubGEsCisJCQlzdHJ1Y3QgbmxhdHRyICplc3QsIHN0cnVjdCB0Y19hY3Rpb24gKmFjdCwKKwkJCWludCByZXBsYWNlLCBpbnQgYmluZCkKK3sKKwlzdHJ1Y3QgbmxhdHRyICp0YltUQ0FfQUNUX0JQRl9NQVggKyAxXTsKKwlzdHJ1Y3QgdGNfYWN0X2JwZiAqcGFybTsKKwlzdHJ1Y3QgdGNmX2JwZiAqcHJvZzsKKwlzdHJ1Y3QgdGNmX2JwZl9jZmcgY2ZnOworCWJvb2wgaXNfYnBmLCBpc19lYnBmOworCWludCByZXQ7CisKKwlpZiAoIW5sYSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBubGFfcGFyc2VfbmVzdGVkKHRiLCBUQ0FfQUNUX0JQRl9NQVgsIG5sYSwgYWN0X2JwZl9wb2xpY3kpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaXNfYnBmID0gdGJbVENBX0FDVF9CUEZfT1BTX0xFTl0gJiYgdGJbVENBX0FDVF9CUEZfT1BTXTsKKwlpc19lYnBmID0gdGJbVENBX0FDVF9CUEZfRkRdOworCisJaWYgKCghaXNfYnBmICYmICFpc19lYnBmKSB8fCAoaXNfYnBmICYmIGlzX2VicGYpIHx8CisJICAgICF0YltUQ0FfQUNUX0JQRl9QQVJNU10pCisJCXJldHVybiAtRUlOVkFMOworCisJcGFybSA9IG5sYV9kYXRhKHRiW1RDQV9BQ1RfQlBGX1BBUk1TXSk7CisKKwltZW1zZXQoJmNmZywgMCwgc2l6ZW9mKGNmZykpOworCisJcmV0ID0gaXNfYnBmID8gdGNmX2JwZl9pbml0X2Zyb21fb3BzKHRiLCAmY2ZnKSA6CisJCSAgICAgICB0Y2ZfYnBmX2luaXRfZnJvbV9lZmQodGIsICZjZmcpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCF0Y2ZfaGFzaF9jaGVjayhwYXJtLT5pbmRleCwgYWN0LCBiaW5kKSkgeworCQlyZXQgPSB0Y2ZfaGFzaF9jcmVhdGUocGFybS0+aW5kZXgsIGVzdCwgYWN0LAorCQkJCSAgICAgIHNpemVvZigqcHJvZyksIGJpbmQpOworCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZGVzdHJveV9mcDsKIAogCQlyZXQgPSBBQ1RfUF9DUkVBVEVEOwogCX0gZWxzZSB7CisJCS8qIERvbid0IG92ZXJyaWRlIGRlZmF1bHRzLiAqLwogCQlpZiAoYmluZCkKIAkJCWdvdG8gZGVzdHJveV9mcDsKLQkJdGNmX2hhc2hfcmVsZWFzZShhLCBiaW5kKTsKLQkJaWYgKCFvdnIpIHsKKworCQl0Y2ZfaGFzaF9yZWxlYXNlKGFjdCwgYmluZCk7CisJCWlmICghcmVwbGFjZSkgewogCQkJcmV0ID0gLUVFWElTVDsKIAkJCWdvdG8gZGVzdHJveV9mcDsKIAkJfQogCX0KIAotCWIgPSB0b19icGYoYSk7Ci0Jc3Bpbl9sb2NrX2JoKCZiLT50Y2ZfbG9jayk7Ci0JYi0+dGNmX2FjdGlvbiA9IHBhcm0tPmFjdGlvbjsKLQliLT5icGZfbnVtX29wcyA9IGJwZl9udW1fb3BzOwotCWItPmJwZl9vcHMgPSBicGZfb3BzOwotCWItPmZpbHRlciA9IGZwOwotCXNwaW5fdW5sb2NrX2JoKCZiLT50Y2ZfbG9jayk7CisJcHJvZyA9IHRvX2JwZihhY3QpOworCXNwaW5fbG9ja19iaCgmcHJvZy0+dGNmX2xvY2spOworCisJcHJvZy0+YnBmX29wcyA9IGNmZy5icGZfb3BzOworCXByb2ctPmJwZl9uYW1lID0gY2ZnLmJwZl9uYW1lOworCisJaWYgKGNmZy5icGZfbnVtX29wcykKKwkJcHJvZy0+YnBmX251bV9vcHMgPSBjZmcuYnBmX251bV9vcHM7CisJaWYgKGNmZy5icGZfZmQpCisJCXByb2ctPmJwZl9mZCA9IGNmZy5icGZfZmQ7CisKKwlwcm9nLT50Y2ZfYWN0aW9uID0gcGFybS0+YWN0aW9uOworCXByb2ctPmZpbHRlciA9IGNmZy5maWx0ZXI7CisKKwlzcGluX3VubG9ja19iaCgmcHJvZy0+dGNmX2xvY2spOwogCiAJaWYgKHJldCA9PSBBQ1RfUF9DUkVBVEVEKQotCQl0Y2ZfaGFzaF9pbnNlcnQoYSk7CisJCXRjZl9oYXNoX2luc2VydChhY3QpOworCiAJcmV0dXJuIHJldDsKIAogZGVzdHJveV9mcDoKLQlicGZfcHJvZ19kZXN0cm95KGZwKTsKLWZyZWVfYnBmX29wczoKLQlrZnJlZShicGZfb3BzKTsKKwlpZiAoaXNfZWJwZikKKwkJYnBmX3Byb2dfcHV0KGNmZy5maWx0ZXIpOworCWVsc2UKKwkJYnBmX3Byb2dfZGVzdHJveShjZmcuZmlsdGVyKTsKKworCWtmcmVlKGNmZy5icGZfb3BzKTsKKwlrZnJlZShjZmcuYnBmX25hbWUpOworCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgdGNmX2JwZl9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmEsIGludCBiaW5kKQorc3RhdGljIHZvaWQgdGNmX2JwZl9jbGVhbnVwKHN0cnVjdCB0Y19hY3Rpb24gKmFjdCwgaW50IGJpbmQpCiB7Ci0Jc3RydWN0IHRjZl9icGYgKmIgPSBhLT5wcml2OworCWNvbnN0IHN0cnVjdCB0Y2ZfYnBmICpwcm9nID0gYWN0LT5wcml2OwogCi0JYnBmX3Byb2dfZGVzdHJveShiLT5maWx0ZXIpOworCWlmICh0Y2ZfYnBmX2lzX2VicGYocHJvZykpCisJCWJwZl9wcm9nX3B1dChwcm9nLT5maWx0ZXIpOworCWVsc2UKKwkJYnBmX3Byb2dfZGVzdHJveShwcm9nLT5maWx0ZXIpOwogfQogCi1zdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X2JwZl9vcHMgPSB7Ci0JLmtpbmQgPQkJImJwZiIsCi0JLnR5cGUgPQkJVENBX0FDVF9CUEYsCi0JLm93bmVyID0JVEhJU19NT0RVTEUsCi0JLmFjdCA9CQl0Y2ZfYnBmLAotCS5kdW1wID0JCXRjZl9icGZfZHVtcCwKLQkuY2xlYW51cCA9CXRjZl9icGZfY2xlYW51cCwKLQkuaW5pdCA9CQl0Y2ZfYnBmX2luaXQsCitzdGF0aWMgc3RydWN0IHRjX2FjdGlvbl9vcHMgYWN0X2JwZl9vcHMgX19yZWFkX21vc3RseSA9IHsKKwkua2luZAkJPQkiYnBmIiwKKwkudHlwZQkJPQlUQ0FfQUNUX0JQRiwKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLmFjdAkJPQl0Y2ZfYnBmLAorCS5kdW1wCQk9CXRjZl9icGZfZHVtcCwKKwkuY2xlYW51cAk9CXRjZl9icGZfY2xlYW51cCwKKwkuaW5pdAkJPQl0Y2ZfYnBmX2luaXQsCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBicGZfaW5pdF9tb2R1bGUodm9pZCkKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfYXBpLmMgYi9uZXQvc2NoZWQvY2xzX2FwaS5jCmluZGV4IGJhZWY5ODcuLjhiMDQ3MGUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfYXBpLmMKKysrIGIvbmV0L3NjaGVkL2Nsc19hcGkuYwpAQCAtMjg2LDcgKzI4Niw3IEBACiAJCQlSQ1VfSU5JVF9QT0lOVEVSKCpiYWNrLCBuZXh0KTsKIAogCQkJdGZpbHRlcl9ub3RpZnkobmV0LCBza2IsIG4sIHRwLCBmaCwgUlRNX0RFTFRGSUxURVIpOwotCQkJdGNmX2Rlc3Ryb3kodHApOworCQkJdGNmX2Rlc3Ryb3kodHAsIHRydWUpOwogCQkJZXJyID0gMDsKIAkJCWdvdG8gZXJyb3V0OwogCQl9CkBAIC0zMDEsMTQgKzMwMSwyMCBAQAogCQkJZXJyID0gLUVFWElTVDsKIAkJCWlmIChuLT5ubG1zZ19mbGFncyAmIE5MTV9GX0VYQ0wpIHsKIAkJCQlpZiAodHBfY3JlYXRlZCkKLQkJCQkJdGNmX2Rlc3Ryb3kodHApOworCQkJCQl0Y2ZfZGVzdHJveSh0cCwgdHJ1ZSk7CiAJCQkJZ290byBlcnJvdXQ7CiAJCQl9CiAJCQlicmVhazsKIAkJY2FzZSBSVE1fREVMVEZJTFRFUjoKIAkJCWVyciA9IHRwLT5vcHMtPmRlbGV0ZSh0cCwgZmgpOwotCQkJaWYgKGVyciA9PSAwKQorCQkJaWYgKGVyciA9PSAwKSB7CiAJCQkJdGZpbHRlcl9ub3RpZnkobmV0LCBza2IsIG4sIHRwLCBmaCwgUlRNX0RFTFRGSUxURVIpOworCQkJCWlmICh0Y2ZfZGVzdHJveSh0cCwgZmFsc2UpKSB7CisJCQkJCXN0cnVjdCB0Y2ZfcHJvdG8gKm5leHQgPSBydG5sX2RlcmVmZXJlbmNlKHRwLT5uZXh0KTsKKworCQkJCQlSQ1VfSU5JVF9QT0lOVEVSKCpiYWNrLCBuZXh0KTsKKwkJCQl9CisJCQl9CiAJCQlnb3RvIGVycm91dDsKIAkJY2FzZSBSVE1fR0VUVEZJTFRFUjoKIAkJCWVyciA9IHRmaWx0ZXJfbm90aWZ5KG5ldCwgc2tiLCBuLCB0cCwgZmgsIFJUTV9ORVdURklMVEVSKTsKQEAgLTMyOSw3ICszMzUsNyBAQAogCQl0ZmlsdGVyX25vdGlmeShuZXQsIHNrYiwgbiwgdHAsIGZoLCBSVE1fTkVXVEZJTFRFUik7CiAJfSBlbHNlIHsKIAkJaWYgKHRwX2NyZWF0ZWQpCi0JCQl0Y2ZfZGVzdHJveSh0cCk7CisJCQl0Y2ZfZGVzdHJveSh0cCwgdHJ1ZSk7CiAJfQogCiBlcnJvdXQ6CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMgYi9uZXQvc2NoZWQvY2xzX2Jhc2ljLmMKaW5kZXggZmMzOTlkYi4uMGI4YzNhYyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19iYXNpYy5jCisrKyBiL25ldC9zY2hlZC9jbHNfYmFzaWMuYwpAQCAtOTYsMTEgKzk2LDE0IEBACiAJa2ZyZWUoZik7CiB9CiAKLXN0YXRpYyB2b2lkIGJhc2ljX2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHApCitzdGF0aWMgYm9vbCBiYXNpY19kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBib29sIGZvcmNlKQogewogCXN0cnVjdCBiYXNpY19oZWFkICpoZWFkID0gcnRubF9kZXJlZmVyZW5jZSh0cC0+cm9vdCk7CiAJc3RydWN0IGJhc2ljX2ZpbHRlciAqZiwgKm47CiAKKwlpZiAoIWZvcmNlICYmICFsaXN0X2VtcHR5KCZoZWFkLT5mbGlzdCkpCisJCXJldHVybiBmYWxzZTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmLCBuLCAmaGVhZC0+Zmxpc3QsIGxpbmspIHsKIAkJbGlzdF9kZWxfcmN1KCZmLT5saW5rKTsKIAkJdGNmX3VuYmluZF9maWx0ZXIodHAsICZmLT5yZXMpOwpAQCAtMTA4LDYgKzExMSw3IEBACiAJfQogCVJDVV9JTklUX1BPSU5URVIodHAtPnJvb3QsIE5VTEwpOwogCWtmcmVlX3JjdShoZWFkLCByY3UpOworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgaW50IGJhc2ljX2RlbGV0ZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBhcmcpCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX2JwZi5jIGIvbmV0L3NjaGVkL2Nsc19icGYuYwppbmRleCA1ZjNlZTllLi41YzQxNzFjIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2JwZi5jCisrKyBiL25ldC9zY2hlZC9jbHNfYnBmLmMKQEAgLTE2LDYgKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorCiAjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KQEAgLTI0LDYgKzI2LDggQEAKIE1PRFVMRV9BVVRIT1IoIkRhbmllbCBCb3JrbWFubiA8ZGJvcmttYW5AcmVkaGF0LmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVEMgQlBGIGJhc2VkIGNsYXNzaWZpZXIiKTsKIAorI2RlZmluZSBDTFNfQlBGX05BTUVfTEVOCTI1NgorCiBzdHJ1Y3QgY2xzX2JwZl9oZWFkIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHBsaXN0OwogCXUzMiBoZ2VuOwpAQCAtMzIsMTggKzM2LDI0IEBACiAKIHN0cnVjdCBjbHNfYnBmX3Byb2cgewogCXN0cnVjdCBicGZfcHJvZyAqZmlsdGVyOwotCXN0cnVjdCBzb2NrX2ZpbHRlciAqYnBmX29wczsKLQlzdHJ1Y3QgdGNmX2V4dHMgZXh0czsKLQlzdHJ1Y3QgdGNmX3Jlc3VsdCByZXM7CiAJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCXN0cnVjdCB0Y2ZfcmVzdWx0IHJlczsKKwlzdHJ1Y3QgdGNmX2V4dHMgZXh0czsKIAl1MzIgaGFuZGxlOwotCXUxNiBicGZfbnVtX29wczsKKwl1bmlvbiB7CisJCXUzMiBicGZfZmQ7CisJCXUxNiBicGZfbnVtX29wczsKKwl9OworCXN0cnVjdCBzb2NrX2ZpbHRlciAqYnBmX29wczsKKwljb25zdCBjaGFyICpicGZfbmFtZTsKIAlzdHJ1Y3QgdGNmX3Byb3RvICp0cDsKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGJwZl9wb2xpY3lbVENBX0JQRl9NQVggKyAxXSA9IHsKIAlbVENBX0JQRl9DTEFTU0lEXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW1RDQV9CUEZfRkRdCQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW1RDQV9CUEZfTkFNRV0JCT0geyAudHlwZSA9IE5MQV9OVUxfU1RSSU5HLCAubGVuID0gQ0xTX0JQRl9OQU1FX0xFTiB9LAogCVtUQ0FfQlBGX09QU19MRU5dCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbVENBX0JQRl9PUFNdCQk9IHsgLnR5cGUgPSBOTEFfQklOQVJZLAogCQkJCSAgICAubGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrX2ZpbHRlcikgKiBCUEZfTUFYSU5TTlMgfSwKQEAgLTU0LDggKzY0LDEwIEBACiB7CiAJc3RydWN0IGNsc19icGZfaGVhZCAqaGVhZCA9IHJjdV9kZXJlZmVyZW5jZV9iaCh0cC0+cm9vdCk7CiAJc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZzsKLQlpbnQgcmV0OworCWludCByZXQgPSAtMTsKIAorCS8qIE5lZWRlZCBoZXJlIGZvciBhY2Nlc3NpbmcgbWFwcy4gKi8KKwlyY3VfcmVhZF9sb2NrKCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocHJvZywgJmhlYWQtPnBsaXN0LCBsaW5rKSB7CiAJCWludCBmaWx0ZXJfcmVzID0gQlBGX1BST0dfUlVOKHByb2ctPmZpbHRlciwgc2tiKTsKIApAQCAtNzAsMTAgKzgyLDE2IEBACiAJCWlmIChyZXQgPCAwKQogCQkJY29udGludWU7CiAKLQkJcmV0dXJuIHJldDsKKwkJYnJlYWs7CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOwogCi0JcmV0dXJuIC0xOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIGNsc19icGZfaXNfZWJwZihjb25zdCBzdHJ1Y3QgY2xzX2JwZl9wcm9nICpwcm9nKQoreworCXJldHVybiAhcHJvZy0+YnBmX29wczsKIH0KIAogc3RhdGljIGludCBjbHNfYnBmX2luaXQoc3RydWN0IHRjZl9wcm90byAqdHApCkBAIC05NCw4ICsxMTIsMTIgQEAKIHsKIAl0Y2ZfZXh0c19kZXN0cm95KCZwcm9nLT5leHRzKTsKIAotCWJwZl9wcm9nX2Rlc3Ryb3kocHJvZy0+ZmlsdGVyKTsKKwlpZiAoY2xzX2JwZl9pc19lYnBmKHByb2cpKQorCQlicGZfcHJvZ19wdXQocHJvZy0+ZmlsdGVyKTsKKwllbHNlCisJCWJwZl9wcm9nX2Rlc3Ryb3kocHJvZy0+ZmlsdGVyKTsKIAorCWtmcmVlKHByb2ctPmJwZl9uYW1lKTsKIAlrZnJlZShwcm9nLT5icGZfb3BzKTsKIAlrZnJlZShwcm9nKTsKIH0KQEAgLTExNCwxNCArMTM2LDE4IEBACiAJbGlzdF9kZWxfcmN1KCZwcm9nLT5saW5rKTsKIAl0Y2ZfdW5iaW5kX2ZpbHRlcih0cCwgJnByb2ctPnJlcyk7CiAJY2FsbF9yY3UoJnByb2ctPnJjdSwgX19jbHNfYnBmX2RlbGV0ZV9wcm9nKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBjbHNfYnBmX2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHApCitzdGF0aWMgYm9vbCBjbHNfYnBmX2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHAsIGJvb2wgZm9yY2UpCiB7CiAJc3RydWN0IGNsc19icGZfaGVhZCAqaGVhZCA9IHJ0bmxfZGVyZWZlcmVuY2UodHAtPnJvb3QpOwogCXN0cnVjdCBjbHNfYnBmX3Byb2cgKnByb2csICp0bXA7CiAKKwlpZiAoIWZvcmNlICYmICFsaXN0X2VtcHR5KCZoZWFkLT5wbGlzdCkpCisJCXJldHVybiBmYWxzZTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwcm9nLCB0bXAsICZoZWFkLT5wbGlzdCwgbGluaykgewogCQlsaXN0X2RlbF9yY3UoJnByb2ctPmxpbmspOwogCQl0Y2ZfdW5iaW5kX2ZpbHRlcih0cCwgJnByb2ctPnJlcyk7CkBAIC0xMzAsNiArMTU2LDcgQEAKIAogCVJDVV9JTklUX1BPSU5URVIodHAtPnJvb3QsIE5VTEwpOwogCWtmcmVlX3JjdShoZWFkLCByY3UpOworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBjbHNfYnBmX2dldChzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdTMyIGhhbmRsZSkKQEAgLTE1MSwyMCArMTc4LDEwMSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgY2xzX2JwZl9wcm9nX2Zyb21fb3BzKHN0cnVjdCBubGF0dHIgKip0YiwKKwkJCQkgc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZywgdTMyIGNsYXNzaWQpCit7CisJc3RydWN0IHNvY2tfZmlsdGVyICpicGZfb3BzOworCXN0cnVjdCBzb2NrX2Zwcm9nX2tlcm4gZnByb2dfdG1wOworCXN0cnVjdCBicGZfcHJvZyAqZnA7CisJdTE2IGJwZl9zaXplLCBicGZfbnVtX29wczsKKwlpbnQgcmV0OworCisJYnBmX251bV9vcHMgPSBubGFfZ2V0X3UxNih0YltUQ0FfQlBGX09QU19MRU5dKTsKKwlpZiAoYnBmX251bV9vcHMgPiBCUEZfTUFYSU5TTlMgfHwgYnBmX251bV9vcHMgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlicGZfc2l6ZSA9IGJwZl9udW1fb3BzICogc2l6ZW9mKCpicGZfb3BzKTsKKwlpZiAoYnBmX3NpemUgIT0gbmxhX2xlbih0YltUQ0FfQlBGX09QU10pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJwZl9vcHMgPSBremFsbG9jKGJwZl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnBmX29wcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbWNweShicGZfb3BzLCBubGFfZGF0YSh0YltUQ0FfQlBGX09QU10pLCBicGZfc2l6ZSk7CisKKwlmcHJvZ190bXAubGVuID0gYnBmX251bV9vcHM7CisJZnByb2dfdG1wLmZpbHRlciA9IGJwZl9vcHM7CisKKwlyZXQgPSBicGZfcHJvZ19jcmVhdGUoJmZwLCAmZnByb2dfdG1wKTsKKwlpZiAocmV0IDwgMCkgeworCQlrZnJlZShicGZfb3BzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcm9nLT5icGZfb3BzID0gYnBmX29wczsKKwlwcm9nLT5icGZfbnVtX29wcyA9IGJwZl9udW1fb3BzOworCXByb2ctPmJwZl9uYW1lID0gTlVMTDsKKworCXByb2ctPmZpbHRlciA9IGZwOworCXByb2ctPnJlcy5jbGFzc2lkID0gY2xhc3NpZDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNsc19icGZfcHJvZ19mcm9tX2VmZChzdHJ1Y3QgbmxhdHRyICoqdGIsCisJCQkJIHN0cnVjdCBjbHNfYnBmX3Byb2cgKnByb2csIHUzMiBjbGFzc2lkKQoreworCXN0cnVjdCBicGZfcHJvZyAqZnA7CisJY2hhciAqbmFtZSA9IE5VTEw7CisJdTMyIGJwZl9mZDsKKworCWJwZl9mZCA9IG5sYV9nZXRfdTMyKHRiW1RDQV9CUEZfRkRdKTsKKworCWZwID0gYnBmX3Byb2dfZ2V0KGJwZl9mZCk7CisJaWYgKElTX0VSUihmcCkpCisJCXJldHVybiBQVFJfRVJSKGZwKTsKKworCWlmIChmcC0+dHlwZSAhPSBCUEZfUFJPR19UWVBFX1NDSEVEX0NMUykgeworCQlicGZfcHJvZ19wdXQoZnApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAodGJbVENBX0JQRl9OQU1FXSkgeworCQluYW1lID0ga21lbWR1cChubGFfZGF0YSh0YltUQ0FfQlBGX05BTUVdKSwKKwkJCSAgICAgICBubGFfbGVuKHRiW1RDQV9CUEZfTkFNRV0pLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCQlpZiAoIW5hbWUpIHsKKwkJCWJwZl9wcm9nX3B1dChmcCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXByb2ctPmJwZl9vcHMgPSBOVUxMOworCXByb2ctPmJwZl9mZCA9IGJwZl9mZDsKKwlwcm9nLT5icGZfbmFtZSA9IG5hbWU7CisKKwlwcm9nLT5maWx0ZXIgPSBmcDsKKwlwcm9nLT5yZXMuY2xhc3NpZCA9IGNsYXNzaWQ7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBjbHNfYnBmX21vZGlmeV9leGlzdGluZyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLAogCQkJCSAgIHN0cnVjdCBjbHNfYnBmX3Byb2cgKnByb2csCiAJCQkJICAgdW5zaWduZWQgbG9uZyBiYXNlLCBzdHJ1Y3QgbmxhdHRyICoqdGIsCiAJCQkJICAgc3RydWN0IG5sYXR0ciAqZXN0LCBib29sIG92cikKIHsKLQlzdHJ1Y3Qgc29ja19maWx0ZXIgKmJwZl9vcHM7CiAJc3RydWN0IHRjZl9leHRzIGV4dHM7Ci0Jc3RydWN0IHNvY2tfZnByb2dfa2VybiB0bXA7Ci0Jc3RydWN0IGJwZl9wcm9nICpmcDsKLQl1MTYgYnBmX3NpemUsIGJwZl9udW1fb3BzOworCWJvb2wgaXNfYnBmLCBpc19lYnBmOwogCXUzMiBjbGFzc2lkOwogCWludCByZXQ7CiAKLQlpZiAoIXRiW1RDQV9CUEZfT1BTX0xFTl0gfHwgIXRiW1RDQV9CUEZfT1BTXSB8fCAhdGJbVENBX0JQRl9DTEFTU0lEXSkKKwlpc19icGYgPSB0YltUQ0FfQlBGX09QU19MRU5dICYmIHRiW1RDQV9CUEZfT1BTXTsKKwlpc19lYnBmID0gdGJbVENBX0JQRl9GRF07CisKKwlpZiAoKCFpc19icGYgJiYgIWlzX2VicGYpIHx8IChpc19icGYgJiYgaXNfZWJwZikgfHwKKwkgICAgIXRiW1RDQV9CUEZfQ0xBU1NJRF0pCiAJCXJldHVybiAtRUlOVkFMOwogCiAJdGNmX2V4dHNfaW5pdCgmZXh0cywgVENBX0JQRl9BQ1QsIFRDQV9CUEZfUE9MSUNFKTsKQEAgLTE3Myw0NyArMjgxLDE4IEBACiAJCXJldHVybiByZXQ7CiAKIAljbGFzc2lkID0gbmxhX2dldF91MzIodGJbVENBX0JQRl9DTEFTU0lEXSk7Ci0JYnBmX251bV9vcHMgPSBubGFfZ2V0X3UxNih0YltUQ0FfQlBGX09QU19MRU5dKTsKLQlpZiAoYnBmX251bV9vcHMgPiBCUEZfTUFYSU5TTlMgfHwgYnBmX251bV9vcHMgPT0gMCkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycm91dDsKKworCXJldCA9IGlzX2JwZiA/IGNsc19icGZfcHJvZ19mcm9tX29wcyh0YiwgcHJvZywgY2xhc3NpZCkgOgorCQkgICAgICAgY2xzX2JwZl9wcm9nX2Zyb21fZWZkKHRiLCBwcm9nLCBjbGFzc2lkKTsKKwlpZiAocmV0IDwgMCkgeworCQl0Y2ZfZXh0c19kZXN0cm95KCZleHRzKTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKLQlicGZfc2l6ZSA9IGJwZl9udW1fb3BzICogc2l6ZW9mKCpicGZfb3BzKTsKLQlpZiAoYnBmX3NpemUgIT0gbmxhX2xlbih0YltUQ0FfQlBGX09QU10pKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyb3V0OwotCX0KLQotCWJwZl9vcHMgPSBremFsbG9jKGJwZl9zaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnBmX29wcyA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyb3V0OwotCX0KLQotCW1lbWNweShicGZfb3BzLCBubGFfZGF0YSh0YltUQ0FfQlBGX09QU10pLCBicGZfc2l6ZSk7Ci0KLQl0bXAubGVuID0gYnBmX251bV9vcHM7Ci0JdG1wLmZpbHRlciA9IGJwZl9vcHM7Ci0KLQlyZXQgPSBicGZfcHJvZ19jcmVhdGUoJmZwLCAmdG1wKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm91dF9mcmVlOwotCi0JcHJvZy0+YnBmX251bV9vcHMgPSBicGZfbnVtX29wczsKLQlwcm9nLT5icGZfb3BzID0gYnBmX29wczsKLQlwcm9nLT5maWx0ZXIgPSBmcDsKLQlwcm9nLT5yZXMuY2xhc3NpZCA9IGNsYXNzaWQ7Ci0KIAl0Y2ZfYmluZF9maWx0ZXIodHAsICZwcm9nLT5yZXMsIGJhc2UpOwogCXRjZl9leHRzX2NoYW5nZSh0cCwgJnByb2ctPmV4dHMsICZleHRzKTsKIAogCXJldHVybiAwOwotZXJyb3V0X2ZyZWU6Ci0Ja2ZyZWUoYnBmX29wcyk7Ci1lcnJvdXQ6Ci0JdGNmX2V4dHNfZGVzdHJveSgmZXh0cyk7Ci0JcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHUzMiBjbHNfYnBmX2dyYWJfbmV3X2hhbmRsZShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwKQEAgLTI5NywxMSArMzc2LDQzIEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBjbHNfYnBmX2R1bXBfYnBmX2luZm8oY29uc3Qgc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZywKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmxhdHRyICpubGE7CisKKwlpZiAobmxhX3B1dF91MTYoc2tiLCBUQ0FfQlBGX09QU19MRU4sIHByb2ctPmJwZl9udW1fb3BzKSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCW5sYSA9IG5sYV9yZXNlcnZlKHNrYiwgVENBX0JQRl9PUFMsIHByb2ctPmJwZl9udW1fb3BzICoKKwkJCSAgc2l6ZW9mKHN0cnVjdCBzb2NrX2ZpbHRlcikpOworCWlmIChubGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCW1lbWNweShubGFfZGF0YShubGEpLCBwcm9nLT5icGZfb3BzLCBubGFfbGVuKG5sYSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xzX2JwZl9kdW1wX2VicGZfaW5mbyhjb25zdCBzdHJ1Y3QgY2xzX2JwZl9wcm9nICpwcm9nLAorCQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAobmxhX3B1dF91MzIoc2tiLCBUQ0FfQlBGX0ZELCBwcm9nLT5icGZfZmQpKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJaWYgKHByb2ctPmJwZl9uYW1lICYmCisJICAgIG5sYV9wdXRfc3RyaW5nKHNrYiwgVENBX0JQRl9OQU1FLCBwcm9nLT5icGZfbmFtZSkpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBjbHNfYnBmX2R1bXAoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgdW5zaWduZWQgbG9uZyBmaCwKIAkJCXN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB0Y21zZyAqdG0pCiB7CiAJc3RydWN0IGNsc19icGZfcHJvZyAqcHJvZyA9IChzdHJ1Y3QgY2xzX2JwZl9wcm9nICopIGZoOwotCXN0cnVjdCBubGF0dHIgKm5lc3QsICpubGE7CisJc3RydWN0IG5sYXR0ciAqbmVzdDsKKwlpbnQgcmV0OwogCiAJaWYgKHByb2cgPT0gTlVMTCkKIAkJcmV0dXJuIHNrYi0+bGVuOwpAQCAtMzE0LDE2ICs0MjUsMTQgQEAKIAogCWlmIChubGFfcHV0X3UzMihza2IsIFRDQV9CUEZfQ0xBU1NJRCwgcHJvZy0+cmVzLmNsYXNzaWQpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKLQlpZiAobmxhX3B1dF91MTYoc2tiLCBUQ0FfQlBGX09QU19MRU4sIHByb2ctPmJwZl9udW1fb3BzKSkKLQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlubGEgPSBubGFfcmVzZXJ2ZShza2IsIFRDQV9CUEZfT1BTLCBwcm9nLT5icGZfbnVtX29wcyAqCi0JCQkgIHNpemVvZihzdHJ1Y3Qgc29ja19maWx0ZXIpKTsKLQlpZiAobmxhID09IE5VTEwpCisJaWYgKGNsc19icGZfaXNfZWJwZihwcm9nKSkKKwkJcmV0ID0gY2xzX2JwZl9kdW1wX2VicGZfaW5mbyhwcm9nLCBza2IpOworCWVsc2UKKwkJcmV0ID0gY2xzX2JwZl9kdW1wX2JwZl9pbmZvKHByb2csIHNrYik7CisJaWYgKHJldCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQltZW1jcHkobmxhX2RhdGEobmxhKSwgcHJvZy0+YnBmX29wcywgbmxhX2xlbihubGEpKTsKLQogCWlmICh0Y2ZfZXh0c19kdW1wKHNrYiwgJnByb2ctPmV4dHMpIDwgMCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMgYi9uZXQvc2NoZWQvY2xzX2Nncm91cC5jCmluZGV4IDIyMTY5N2EuLmVhNjExYjIxIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Nncm91cC5jCisrKyBiL25ldC9zY2hlZC9jbHNfY2dyb3VwLmMKQEAgLTE0MywxNCArMTQzLDE4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgY2xzX2Nncm91cF9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQorc3RhdGljIGJvb2wgY2xzX2Nncm91cF9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBib29sIGZvcmNlKQogewogCXN0cnVjdCBjbHNfY2dyb3VwX2hlYWQgKmhlYWQgPSBydG5sX2RlcmVmZXJlbmNlKHRwLT5yb290KTsKIAorCWlmICghZm9yY2UpCisJCXJldHVybiBmYWxzZTsKKwogCWlmIChoZWFkKSB7CiAJCVJDVV9JTklUX1BPSU5URVIodHAtPnJvb3QsIE5VTEwpOwogCQljYWxsX3JjdSgmaGVhZC0+cmN1LCBjbHNfY2dyb3VwX2Rlc3Ryb3lfcmN1KTsKIAl9CisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyBpbnQgY2xzX2Nncm91cF9kZWxldGUoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYXJnKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19mbG93LmMgYi9uZXQvc2NoZWQvY2xzX2Zsb3cuYwppbmRleCA0NjE0MTAzLi5hNjIwYzRlIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Zsb3cuYworKysgYi9uZXQvc2NoZWQvY2xzX2Zsb3cuYwpAQCAtNTU3LDE3ICs1NTcsMjEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZmxvd19kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQorc3RhdGljIGJvb2wgZmxvd19kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBib29sIGZvcmNlKQogewogCXN0cnVjdCBmbG93X2hlYWQgKmhlYWQgPSBydG5sX2RlcmVmZXJlbmNlKHRwLT5yb290KTsKIAlzdHJ1Y3QgZmxvd19maWx0ZXIgKmYsICpuZXh0OwogCisJaWYgKCFmb3JjZSAmJiAhbGlzdF9lbXB0eSgmaGVhZC0+ZmlsdGVycykpCisJCXJldHVybiBmYWxzZTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmLCBuZXh0LCAmaGVhZC0+ZmlsdGVycywgbGlzdCkgewogCQlsaXN0X2RlbF9yY3UoJmYtPmxpc3QpOwogCQljYWxsX3JjdSgmZi0+cmN1LCBmbG93X2Rlc3Ryb3lfZmlsdGVyKTsKIAl9CiAJUkNVX0lOSVRfUE9JTlRFUih0cC0+cm9vdCwgTlVMTCk7CiAJa2ZyZWVfcmN1KGhlYWQsIHJjdSk7CisJcmV0dXJuIHRydWU7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGZsb3dfZ2V0KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1MzIgaGFuZGxlKQpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19mdy5jIGIvbmV0L3NjaGVkL2Nsc19mdy5jCmluZGV4IGE1MjY5ZjcuLjcxNWUwMWUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfZncuYworKysgYi9uZXQvc2NoZWQvY2xzX2Z3LmMKQEAgLTMzLDYgKzMzLDcgQEAKIAogc3RydWN0IGZ3X2hlYWQgewogCXUzMgkJCW1hc2s7CisJYm9vbAkJCW1hc2tfc2V0OwogCXN0cnVjdCBmd19maWx0ZXIgX19yY3UJKmh0W0hUU0laRV07CiAJc3RydWN0IHJjdV9oZWFkCQlyY3U7CiB9OwpAQCAtMTEzLDYgKzExNCwxNCBAQAogCiBzdGF0aWMgaW50IGZ3X2luaXQoc3RydWN0IHRjZl9wcm90byAqdHApCiB7CisJc3RydWN0IGZ3X2hlYWQgKmhlYWQ7CisKKwloZWFkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZ3X2hlYWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaGVhZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwloZWFkLT5tYXNrX3NldCA9IGZhbHNlOworCXJjdV9hc3NpZ25fcG9pbnRlcih0cC0+cm9vdCwgaGVhZCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyNCwxNCArMTMzLDIwIEBACiAJa2ZyZWUoZik7CiB9CiAKLXN0YXRpYyB2b2lkIGZ3X2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHApCitzdGF0aWMgYm9vbCBmd19kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBib29sIGZvcmNlKQogewogCXN0cnVjdCBmd19oZWFkICpoZWFkID0gcnRubF9kZXJlZmVyZW5jZSh0cC0+cm9vdCk7CiAJc3RydWN0IGZ3X2ZpbHRlciAqZjsKIAlpbnQgaDsKIAogCWlmIChoZWFkID09IE5VTEwpCi0JCXJldHVybjsKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIWZvcmNlKSB7CisJCWZvciAoaCA9IDA7IGggPCBIVFNJWkU7IGgrKykKKwkJCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIoaGVhZC0+aHRbaF0pKQorCQkJCXJldHVybiBmYWxzZTsKKwl9CiAKIAlmb3IgKGggPSAwOyBoIDwgSFRTSVpFOyBoKyspIHsKIAkJd2hpbGUgKChmID0gcnRubF9kZXJlZmVyZW5jZShoZWFkLT5odFtoXSkpICE9IE5VTEwpIHsKQEAgLTE0Myw2ICsxNTgsNyBAQAogCX0KIAlSQ1VfSU5JVF9QT0lOVEVSKHRwLT5yb290LCBOVUxMKTsKIAlrZnJlZV9yY3UoaGVhZCwgcmN1KTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGludCBmd19kZWxldGUoc3RydWN0IHRjZl9wcm90byAqdHAsIHVuc2lnbmVkIGxvbmcgYXJnKQpAQCAtMjg2LDE3ICszMDIsMTEgQEAKIAlpZiAoIWhhbmRsZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoaGVhZCA9PSBOVUxMKSB7Ci0JCXUzMiBtYXNrID0gMHhGRkZGRkZGRjsKKwlpZiAoIWhlYWQtPm1hc2tfc2V0KSB7CisJCWhlYWQtPm1hc2sgPSAweEZGRkZGRkZGOwogCQlpZiAodGJbVENBX0ZXX01BU0tdKQotCQkJbWFzayA9IG5sYV9nZXRfdTMyKHRiW1RDQV9GV19NQVNLXSk7Ci0KLQkJaGVhZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmd19oZWFkKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChoZWFkID09IE5VTEwpCi0JCQlyZXR1cm4gLUVOT0JVRlM7Ci0JCWhlYWQtPm1hc2sgPSBtYXNrOwotCi0JCXJjdV9hc3NpZ25fcG9pbnRlcih0cC0+cm9vdCwgaGVhZCk7CisJCQloZWFkLT5tYXNrID0gbmxhX2dldF91MzIodGJbVENBX0ZXX01BU0tdKTsKKwkJaGVhZC0+bWFza19zZXQgPSB0cnVlOwogCX0KIAogCWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZndfZmlsdGVyKSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvY2xzX3JvdXRlLmMgYi9uZXQvc2NoZWQvY2xzX3JvdXRlLmMKaW5kZXggMmVjZDI0Ni4uMDhhM2IwYSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc19yb3V0ZS5jCisrKyBiL25ldC9zY2hlZC9jbHNfcm91dGUuYwpAQCAtMjU4LDYgKzI1OCwxMyBAQAogCiBzdGF0aWMgaW50IHJvdXRlNF9pbml0KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQogeworCXN0cnVjdCByb3V0ZTRfaGVhZCAqaGVhZDsKKworCWhlYWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgcm91dGU0X2hlYWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoaGVhZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIodHAtPnJvb3QsIGhlYWQpOwogCXJldHVybiAwOwogfQogCkBAIC0yNzAsMTMgKzI3NywyMCBAQAogCWtmcmVlKGYpOwogfQogCi1zdGF0aWMgdm9pZCByb3V0ZTRfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKK3N0YXRpYyBib29sIHJvdXRlNF9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBib29sIGZvcmNlKQogewogCXN0cnVjdCByb3V0ZTRfaGVhZCAqaGVhZCA9IHJ0bmxfZGVyZWZlcmVuY2UodHAtPnJvb3QpOwogCWludCBoMSwgaDI7CiAKIAlpZiAoaGVhZCA9PSBOVUxMKQotCQlyZXR1cm47CisJCXJldHVybiB0cnVlOworCisJaWYgKCFmb3JjZSkgeworCQlmb3IgKGgxID0gMDsgaDEgPD0gMjU2OyBoMSsrKSB7CisJCQlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGhlYWQtPnRhYmxlW2gxXSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQogCiAJZm9yIChoMSA9IDA7IGgxIDw9IDI1NjsgaDErKykgewogCQlzdHJ1Y3Qgcm91dGU0X2J1Y2tldCAqYjsKQEAgLTMwMSw2ICszMTUsNyBAQAogCX0KIAlSQ1VfSU5JVF9QT0lOVEVSKHRwLT5yb290LCBOVUxMKTsKIAlrZnJlZV9yY3UoaGVhZCwgcmN1KTsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGludCByb3V0ZTRfZGVsZXRlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGFyZykKQEAgLTQ4NCwxMyArNDk5LDYgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJZXJyID0gLUVOT0JVRlM7Ci0JaWYgKGhlYWQgPT0gTlVMTCkgewotCQloZWFkID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJvdXRlNF9oZWFkKSwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChoZWFkID09IE5VTEwpCi0JCQlnb3RvIGVycm91dDsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKHRwLT5yb290LCBoZWFkKTsKLQl9Ci0KIAlmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJvdXRlNF9maWx0ZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWYpCiAJCWdvdG8gZXJyb3V0OwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19yc3ZwLmggYi9uZXQvc2NoZWQvY2xzX3JzdnAuaAppbmRleCBlZGQ4YWRlLi4wMmZhODI3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX3JzdnAuaAorKysgYi9uZXQvc2NoZWQvY2xzX3JzdnAuaApAQCAtMjkxLDEzICsyOTEsMjAgQEAKIAlrZnJlZV9yY3UoZiwgcmN1KTsKIH0KIAotc3RhdGljIHZvaWQgcnN2cF9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQorc3RhdGljIGJvb2wgcnN2cF9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBib29sIGZvcmNlKQogewogCXN0cnVjdCByc3ZwX2hlYWQgKmRhdGEgPSBydG5sX2RlcmVmZXJlbmNlKHRwLT5yb290KTsKIAlpbnQgaDEsIGgyOwogCiAJaWYgKGRhdGEgPT0gTlVMTCkKLQkJcmV0dXJuOworCQlyZXR1cm4gdHJ1ZTsKKworCWlmICghZm9yY2UpIHsKKwkJZm9yIChoMSA9IDA7IGgxIDwgMjU2OyBoMSsrKSB7CisJCQlpZiAocmN1X2FjY2Vzc19wb2ludGVyKGRhdGEtPmh0W2gxXSkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQogCiAJUkNVX0lOSVRfUE9JTlRFUih0cC0+cm9vdCwgTlVMTCk7CiAKQEAgLTMxOSw2ICszMjYsNyBAQAogCQl9CiAJfQogCWtmcmVlX3JjdShkYXRhLCByY3UpOworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgaW50IHJzdnBfZGVsZXRlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGFyZykKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdGNpbmRleC5jIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKaW5kZXggYmQ0OWJmNS4uYTU1N2RiYSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKKysrIGIvbmV0L3NjaGVkL2Nsc190Y2luZGV4LmMKQEAgLTQ2OCwxMSArNDY4LDE0IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB0Y2luZGV4X2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHApCitzdGF0aWMgYm9vbCB0Y2luZGV4X2Rlc3Ryb3koc3RydWN0IHRjZl9wcm90byAqdHAsIGJvb2wgZm9yY2UpCiB7CiAJc3RydWN0IHRjaW5kZXhfZGF0YSAqcCA9IHJ0bmxfZGVyZWZlcmVuY2UodHAtPnJvb3QpOwogCXN0cnVjdCB0Y2Zfd2Fsa2VyIHdhbGtlcjsKIAorCWlmICghZm9yY2UpCisJCXJldHVybiBmYWxzZTsKKwogCXByX2RlYnVnKCJ0Y2luZGV4X2Rlc3Ryb3kodHAgJXApLHAgJXBcbiIsIHRwLCBwKTsKIAl3YWxrZXIuY291bnQgPSAwOwogCXdhbGtlci5za2lwID0gMDsKQEAgLTQ4MSw2ICs0ODQsNyBAQAogCiAJUkNVX0lOSVRfUE9JTlRFUih0cC0+cm9vdCwgTlVMTCk7CiAJY2FsbF9yY3UoJnAtPnJjdSwgX190Y2luZGV4X2Rlc3Ryb3kpOworCXJldHVybiB0cnVlOwogfQogCiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9jbHNfdTMyLmMgYi9uZXQvc2NoZWQvY2xzX3UzMi5jCmluZGV4IDA5NDg3YWYuLmNhYjllOWIgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9jbHNfdTMyLmMKKysrIGIvbmV0L3NjaGVkL2Nsc191MzIuYwpAQCAtNzgsOCArNzgsMTEgQEAKIAlzdHJ1Y3QgdGNfdV9jb21tb24JKnRwX2M7CiAJaW50CQkJcmVmY250OwogCXVuc2lnbmVkIGludAkJZGl2aXNvcjsKLQlzdHJ1Y3QgdGNfdV9rbm9kZSBfX3JjdQkqaHRbMV07CiAJc3RydWN0IHJjdV9oZWFkCQlyY3U7CisJLyogVGhlICdodCcgZmllbGQgTVVTVCBiZSB0aGUgbGFzdCBmaWVsZCBpbiBzdHJ1Y3R1cmUgdG8gYWxsb3cgZm9yCisJICogbW9yZSBlbnRyaWVzIGFsbG9jYXRlZCBhdCBlbmQgb2Ygc3RydWN0dXJlLgorCSAqLworCXN0cnVjdCB0Y191X2tub2RlIF9fcmN1CSpodFsxXTsKIH07CiAKIHN0cnVjdCB0Y191X2NvbW1vbiB7CkBAIC00NjAsMTMgKzQ2MywzNSBAQAogCXJldHVybiAtRU5PRU5UOwogfQogCi1zdGF0aWMgdm9pZCB1MzJfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCkKK3N0YXRpYyBib29sIGh0X2VtcHR5KHN0cnVjdCB0Y191X2hub2RlICpodCkKK3sKKwl1bnNpZ25lZCBpbnQgaDsKKworCWZvciAoaCA9IDA7IGggPD0gaHQtPmRpdmlzb3I7IGgrKykKKwkJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihodC0+aHRbaF0pKQorCQkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIHUzMl9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCBib29sIGZvcmNlKQogewogCXN0cnVjdCB0Y191X2NvbW1vbiAqdHBfYyA9IHRwLT5kYXRhOwogCXN0cnVjdCB0Y191X2hub2RlICpyb290X2h0ID0gcnRubF9kZXJlZmVyZW5jZSh0cC0+cm9vdCk7CiAKIAlXQVJOX09OKHJvb3RfaHQgPT0gTlVMTCk7CiAKKwlpZiAoIWZvcmNlKSB7CisJCWlmIChyb290X2h0KSB7CisJCQlpZiAocm9vdF9odC0+cmVmY250ID4gMSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCQlpZiAocm9vdF9odC0+cmVmY250ID09IDEpIHsKKwkJCQlpZiAoIWh0X2VtcHR5KHJvb3RfaHQpKQorCQkJCQlyZXR1cm4gZmFsc2U7CisJCQl9CisJCX0KKwl9CisKIAlpZiAocm9vdF9odCAmJiAtLXJvb3RfaHQtPnJlZmNudCA9PSAwKQogCQl1MzJfZGVzdHJveV9obm9kZSh0cCwgcm9vdF9odCk7CiAKQEAgLTQ5MSw2ICs1MTYsNyBAQAogCX0KIAogCXRwLT5kYXRhID0gTlVMTDsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGludCB1MzJfZGVsZXRlKHN0cnVjdCB0Y2ZfcHJvdG8gKnRwLCB1bnNpZ25lZCBsb25nIGFyZykKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9lbV90ZXh0LmMgYi9uZXQvc2NoZWQvZW1fdGV4dC5jCmluZGV4IGYwM2MzZGUuLjczZTJlZDUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9lbV90ZXh0LmMKKysrIGIvbmV0L3NjaGVkL2VtX3RleHQuYwpAQCAtMzQsNyArMzQsNiBAQAogewogCXN0cnVjdCB0ZXh0X21hdGNoICp0bSA9IEVNX1RFWFRfUFJJVihtKTsKIAlpbnQgZnJvbSwgdG87Ci0Jc3RydWN0IHRzX3N0YXRlIHN0YXRlOwogCiAJZnJvbSA9IHRjZl9nZXRfYmFzZV9wdHIoc2tiLCB0bS0+ZnJvbV9sYXllcikgLSBza2ItPmRhdGE7CiAJZnJvbSArPSB0bS0+ZnJvbV9vZmZzZXQ7CkBAIC00Miw3ICs0MSw3IEBACiAJdG8gPSB0Y2ZfZ2V0X2Jhc2VfcHRyKHNrYiwgdG0tPnRvX2xheWVyKSAtIHNrYi0+ZGF0YTsKIAl0byArPSB0bS0+dG9fb2Zmc2V0OwogCi0JcmV0dXJuIHNrYl9maW5kX3RleHQoc2tiLCBmcm9tLCB0bywgdG0tPmNvbmZpZywgJnN0YXRlKSAhPSBVSU5UX01BWDsKKwlyZXR1cm4gc2tiX2ZpbmRfdGV4dChza2IsIGZyb20sIHRvLCB0bS0+Y29uZmlnKSAhPSBVSU5UX01BWDsKIH0KIAogc3RhdGljIGludCBlbV90ZXh0X2NoYW5nZShzdHJ1Y3QgbmV0ICpuZXQsIHZvaWQgKmRhdGEsIGludCBsZW4sCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2FwaS5jIGIvbmV0L3NjaGVkL3NjaF9hcGkuYwppbmRleCAyNDNiN2QxLi5hZDllZWQ3IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2FwaS5jCisrKyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKQEAgLTE4NTgsMTEgKzE4NTgsMTUgQEAKIH0KIEVYUE9SVF9TWU1CT0wodGNfY2xhc3NpZnkpOwogCi12b2lkIHRjZl9kZXN0cm95KHN0cnVjdCB0Y2ZfcHJvdG8gKnRwKQorYm9vbCB0Y2ZfZGVzdHJveShzdHJ1Y3QgdGNmX3Byb3RvICp0cCwgYm9vbCBmb3JjZSkKIHsKLQl0cC0+b3BzLT5kZXN0cm95KHRwKTsKLQltb2R1bGVfcHV0KHRwLT5vcHMtPm93bmVyKTsKLQlrZnJlZV9yY3UodHAsIHJjdSk7CisJaWYgKHRwLT5vcHMtPmRlc3Ryb3kodHAsIGZvcmNlKSkgeworCQltb2R1bGVfcHV0KHRwLT5vcHMtPm93bmVyKTsKKwkJa2ZyZWVfcmN1KHRwLCByY3UpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgdGNmX2Rlc3Ryb3lfY2hhaW4oc3RydWN0IHRjZl9wcm90byBfX3JjdSAqKmZsKQpAQCAtMTg3MSw3ICsxODc1LDcgQEAKIAogCXdoaWxlICgodHAgPSBydG5sX2RlcmVmZXJlbmNlKCpmbCkpICE9IE5VTEwpIHsKIAkJUkNVX0lOSVRfUE9JTlRFUigqZmwsIHRwLT5uZXh0KTsKLQkJdGNmX2Rlc3Ryb3kodHApOworCQl0Y2ZfZGVzdHJveSh0cCwgdHJ1ZSk7CiAJfQogfQogRVhQT1JUX1NZTUJPTCh0Y2ZfZGVzdHJveV9jaGFpbik7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2ZxLmMgYi9uZXQvc2NoZWQvc2NoX2ZxLmMKaW5kZXggZGZjZWEyMC4uZjM3NzcwMiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9mcS5jCisrKyBiL25ldC9zY2hlZC9zY2hfZnEuYwpAQCAtOCw3ICs4LDcgQEAKICAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqCi0gKiAgTWVhbnQgdG8gYmUgbW9zdGx5IHVzZWQgZm9yIGxvY2FseSBnZW5lcmF0ZWQgdHJhZmZpYyA6CisgKiAgTWVhbnQgdG8gYmUgbW9zdGx5IHVzZWQgZm9yIGxvY2FsbHkgZ2VuZXJhdGVkIHRyYWZmaWMgOgogICogIEZhc3QgY2xhc3NpZmljYXRpb24gZGVwZW5kcyBvbiBza2ItPnNrIGJlaW5nIHNldCBiZWZvcmUgcmVhY2hpbmcgdXMuCiAgKiAgSWYgbm90LCAocm91dGVyIHdvcmtsb2FkKSwgd2UgdXNlIHJ4aGFzaCBhcyBmYWxsYmFjaywgd2l0aCAzMiBiaXRzIHdpZGUgaGFzaC4KICAqICBBbGwgcGFja2V0cyBiZWxvbmdpbmcgdG8gYSBzb2NrZXQgYXJlIGNvbnNpZGVyZWQgYXMgYSAnZmxvdycuCkBAIC02Myw3ICs2Myw3IEBACiAJCXN0cnVjdCBza19idWZmICp0YWlsOwkvKiBsYXN0IHNrYiBpbiB0aGUgbGlzdCAqLwogCQl1bnNpZ25lZCBsb25nICBhZ2U7CS8qIGppZmZpZXMgd2hlbiBmbG93IHdhcyBlbXB0aWVkLCBmb3IgZ2MgKi8KIAl9OwotCXN0cnVjdCByYl9ub2RlCWZxX25vZGU7IAkvKiBhbmNob3IgaW4gZnFfcm9vdFtdIHRyZWVzICovCisJc3RydWN0IHJiX25vZGUJZnFfbm9kZTsJLyogYW5jaG9yIGluIGZxX3Jvb3RbXSB0cmVlcyAqLwogCXN0cnVjdCBzb2NrCSpzazsKIAlpbnQJCXFsZW47CQkvKiBudW1iZXIgb2YgcGFja2V0cyBpbiBmbG93IHF1ZXVlICovCiAJaW50CQljcmVkaXQ7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2luZ3Jlc3MuYyBiL25ldC9zY2hlZC9zY2hfaW5ncmVzcy5jCmluZGV4IGViNWI4NDQuLjRjZGJmYjggMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfaW5ncmVzcy5jCisrKyBiL25ldC9zY2hlZC9zY2hfaW5ncmVzcy5jCkBAIC04OCwxMSArODgsMTkgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCitzdGF0aWMgaW50IGluZ3Jlc3NfaW5pdChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IG5sYXR0ciAqb3B0KQoreworCW5ldF9pbmNfaW5ncmVzc19xdWV1ZSgpOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGluZ3Jlc3NfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3QgaW5ncmVzc19xZGlzY19kYXRhICpwID0gcWRpc2NfcHJpdihzY2gpOwogCiAJdGNmX2Rlc3Ryb3lfY2hhaW4oJnAtPmZpbHRlcl9saXN0KTsKKwluZXRfZGVjX2luZ3Jlc3NfcXVldWUoKTsKIH0KIAogc3RhdGljIGludCBpbmdyZXNzX2R1bXAoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xMjQsNiArMTMyLDcgQEAKIAkuaWQJCT0JImluZ3Jlc3MiLAogCS5wcml2X3NpemUJPQlzaXplb2Yoc3RydWN0IGluZ3Jlc3NfcWRpc2NfZGF0YSksCiAJLmVucXVldWUJPQlpbmdyZXNzX2VucXVldWUsCisJLmluaXQJCT0JaW5ncmVzc19pbml0LAogCS5kZXN0cm95CT0JaW5ncmVzc19kZXN0cm95LAogCS5kdW1wCQk9CWluZ3Jlc3NfZHVtcCwKIAkub3duZXIJCT0JVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX25ldGVtLmMgYi9uZXQvc2NoZWQvc2NoX25ldGVtLmMKaW5kZXggMTc5ZjFjOC4uOTU2ZWFkMiAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCisrKyBiL25ldC9zY2hlZC9zY2hfbmV0ZW0uYwpAQCAtNTYwLDggKzU2MCw4IEBACiB0Zmlmb19kZXF1ZXVlOgogCXNrYiA9IF9fc2tiX2RlcXVldWUoJnNjaC0+cSk7CiAJaWYgKHNrYikgewotZGVsaXZlcjoKIAkJcWRpc2NfcXN0YXRzX2JhY2tsb2dfZGVjKHNjaCwgc2tiKTsKK2RlbGl2ZXI6CiAJCXFkaXNjX3VudGhyb3R0bGVkKHNjaCk7CiAJCXFkaXNjX2JzdGF0c191cGRhdGUoc2NoLCBza2IpOwogCQlyZXR1cm4gc2tiOwpAQCAtNTc4LDYgKzU3OCw3IEBACiAJCQlyYl9lcmFzZShwLCAmcS0+dF9yb290KTsKIAogCQkJc2NoLT5xLnFsZW4tLTsKKwkJCXFkaXNjX3FzdGF0c19iYWNrbG9nX2RlYyhzY2gsIHNrYik7CiAJCQlza2ItPm5leHQgPSBOVUxMOwogCQkJc2tiLT5wcmV2ID0gTlVMTDsKIAkJCXNrYi0+dHN0YW1wID0gbmV0ZW1fc2tiX2NiKHNrYiktPnRzdGFtcF9zYXZlOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvdG9jb2wuYyBiL25ldC9zY3RwL3Byb3RvY29sLmMKaW5kZXggOGYzNGIyNy4uNTNiN2FjZCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvcHJvdG9jb2wuYworKysgYi9uZXQvc2N0cC9wcm90b2NvbC5jCkBAIC0xMzIyLDggKzEzMjIsNyBAQAogCWludCBtYXhfc2hhcmU7CiAJaW50IG9yZGVyOwogCi0JQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3Qgc2N0cF91bHBldmVudCkgPgotCQkgICAgIHNpemVvZigoKHN0cnVjdCBza19idWZmICopIDApLT5jYikpOworCXNvY2tfc2tiX2NiX2NoZWNrX3NpemUoc2l6ZW9mKHN0cnVjdCBzY3RwX3VscGV2ZW50KSk7CiAKIAkvKiBBbGxvY2F0ZSBiaW5kX2J1Y2tldCBhbmQgY2h1bmsgY2FjaGVzLiAqLwogCXN0YXR1cyA9IC1FTk9CVUZTOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvc29ja2V0LmMgYi9uZXQvc2N0cC9zb2NrZXQuYwppbmRleCBhYWZlOTRiLi5mMDlkZTdmIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zb2NrZXQuYworKysgYi9uZXQvc2N0cC9zb2NrZXQuYwpAQCAtMTAyLDExICsxMDIsNiBAQAogc3RhdGljIHZvaWQgc2N0cF9zb2NrX21pZ3JhdGUoc3RydWN0IHNvY2sgKiwgc3RydWN0IHNvY2sgKiwKIAkJCSAgICAgIHN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICosIHNjdHBfc29ja2V0X3R5cGVfdCk7CiAKLWV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqc2N0cF9idWNrZXRfY2FjaGVwOwotZXh0ZXJuIGxvbmcgc3lzY3RsX3NjdHBfbWVtWzNdOwotZXh0ZXJuIGludCBzeXNjdGxfc2N0cF9ybWVtWzNdOwotZXh0ZXJuIGludCBzeXNjdGxfc2N0cF93bWVtWzNdOwotCiBzdGF0aWMgaW50IHNjdHBfbWVtb3J5X3ByZXNzdXJlOwogc3RhdGljIGF0b21pY19sb25nX3Qgc2N0cF9tZW1vcnlfYWxsb2NhdGVkOwogc3RydWN0IHBlcmNwdV9jb3VudGVyIHNjdHBfc29ja2V0c19hbGxvY2F0ZWQ7CkBAIC0xNTg2LDggKzE1ODEsNyBAQAogCiBzdGF0aWMgaW50IHNjdHBfbXNnaGRyX3BhcnNlKGNvbnN0IHN0cnVjdCBtc2doZHIgKiwgc2N0cF9jbXNnc190ICopOwogCi1zdGF0aWMgaW50IHNjdHBfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrICpzaywKLQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IG1zZ19sZW4pCitzdGF0aWMgaW50IHNjdHBfc2VuZG1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IG1zZ19sZW4pCiB7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwogCXN0cnVjdCBzY3RwX3NvY2sgKnNwOwpAQCAtMjA2Niw5ICsyMDYwLDggQEAKICAqICBmbGFncyAgIC0gZmxhZ3Mgc2VudCBvciByZWNlaXZlZCB3aXRoIHRoZSB1c2VyIG1lc3NhZ2UsIHNlZSBTZWN0aW9uCiAgKiAgICAgICAgICAgIDUgZm9yIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBmbGFncy4KICAqLwotc3RhdGljIGludCBzY3RwX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29jayAqc2ssCi0JCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBub2Jsb2NrLAotCQkJaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQorc3RhdGljIGludCBzY3RwX3JlY3Ztc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCisJCQlpbnQgbm9ibG9jaywgaW50IGZsYWdzLCBpbnQgKmFkZHJfbGVuKQogewogCXN0cnVjdCBzY3RwX3VscGV2ZW50ICpldmVudCA9IE5VTEw7CiAJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3N5c2N0bC5jIGIvbmV0L3NjdHAvc3lzY3RsLmMKaW5kZXggMmU5YWRhMS4uMjZkNTBjNSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc3lzY3RsLmMKKysrIGIvbmV0L3NjdHAvc3lzY3RsLmMKQEAgLTU4LDEwICs1OCw2IEBACiAJKE1BWF9TQ0hFRFVMRV9USU1FT1VUIC8gSFogPiBVSU5UX01BWCkKIAk/IFVJTlRfTUFYIDogTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWjsKIAotZXh0ZXJuIGxvbmcgc3lzY3RsX3NjdHBfbWVtWzNdOwotZXh0ZXJuIGludCBzeXNjdGxfc2N0cF9ybWVtWzNdOwotZXh0ZXJuIGludCBzeXNjdGxfc2N0cF93bWVtWzNdOwotCiBzdGF0aWMgaW50IHByb2Nfc2N0cF9kb19obWFjX2FsZyhzdHJ1Y3QgY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKIAkJCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbnAsCiAJCQkJbG9mZl90ICpwcG9zKTsKZGlmZiAtLWdpdCBhL25ldC9zb2NrZXQuYyBiL25ldC9zb2NrZXQuYwppbmRleCBiYmVkYmZjLi4zZTMzOTU5IDEwMDY0NAotLS0gYS9uZXQvc29ja2V0LmMKKysrIGIvbmV0L3NvY2tldC5jCkBAIC0xNDAsOCArMTQwLDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNvY2tldF9maWxlX29wcyA9IHsKIAkub3duZXIgPQlUSElTX01PRFVMRSwKIAkubGxzZWVrID0Jbm9fbGxzZWVrLAotCS5yZWFkID0JCW5ld19zeW5jX3JlYWQsCi0JLndyaXRlID0JbmV3X3N5bmNfd3JpdGUsCiAJLnJlYWRfaXRlciA9CXNvY2tfcmVhZF9pdGVyLAogCS53cml0ZV9pdGVyID0Jc29ja193cml0ZV9pdGVyLAogCS5wb2xsID0JCXNvY2tfcG9sbCwKQEAgLTYxMCw2MCArNjA4LDI3IEBACiB9CiBFWFBPUlRfU1lNQk9MKF9fc29ja190eF90aW1lc3RhbXApOwogCi1zdGF0aWMgaW5saW5lIGludCBfX3NvY2tfc2VuZG1zZ19ub3NlYyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IHNpemUpCitzdGF0aWMgaW5saW5lIGludCBzb2NrX3NlbmRtc2dfbm9zZWMoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnKQogewotCXJldHVybiBzb2NrLT5vcHMtPnNlbmRtc2coaW9jYiwgc29jaywgbXNnLCBzaXplKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgX19zb2NrX3NlbmRtc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJCSBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplKQotewotCWludCBlcnIgPSBzZWN1cml0eV9zb2NrZXRfc2VuZG1zZyhzb2NrLCBtc2csIHNpemUpOwotCi0JcmV0dXJuIGVyciA/OiBfX3NvY2tfc2VuZG1zZ19ub3NlYyhpb2NiLCBzb2NrLCBtc2csIHNpemUpOwotfQotCi1zdGF0aWMgaW50IGRvX3NvY2tfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCi0JCQkgICBzaXplX3Qgc2l6ZSwgYm9vbCBub3NlYykKLXsKLQlzdHJ1Y3Qga2lvY2IgaW9jYjsKLQlpbnQgcmV0OwotCi0JaW5pdF9zeW5jX2tpb2NiKCZpb2NiLCBOVUxMKTsKLQlyZXQgPSBub3NlYyA/IF9fc29ja19zZW5kbXNnX25vc2VjKCZpb2NiLCBzb2NrLCBtc2csIHNpemUpIDoKLQkJICAgICAgX19zb2NrX3NlbmRtc2coJmlvY2IsIHNvY2ssIG1zZywgc2l6ZSk7Ci0JaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCi0JCXJldCA9IHdhaXRfb25fc3luY19raW9jYigmaW9jYik7CisJaW50IHJldCA9IHNvY2stPm9wcy0+c2VuZG1zZyhzb2NrLCBtc2csIG1zZ19kYXRhX2xlZnQobXNnKSk7CisJQlVHX09OKHJldCA9PSAtRUlPQ0JRVUVVRUQpOwogCXJldHVybiByZXQ7CiB9CiAKLWludCBzb2NrX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSkKK2ludCBzb2NrX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnKQogewotCXJldHVybiBkb19zb2NrX3NlbmRtc2coc29jaywgbXNnLCBzaXplLCBmYWxzZSk7CisJaW50IGVyciA9IHNlY3VyaXR5X3NvY2tldF9zZW5kbXNnKHNvY2ssIG1zZywKKwkJCQkJICBtc2dfZGF0YV9sZWZ0KG1zZykpOworCisJcmV0dXJuIGVyciA/OiBzb2NrX3NlbmRtc2dfbm9zZWMoc29jaywgbXNnKTsKIH0KIEVYUE9SVF9TWU1CT0woc29ja19zZW5kbXNnKTsKIAotc3RhdGljIGludCBzb2NrX3NlbmRtc2dfbm9zZWMoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSkKLXsKLQlyZXR1cm4gZG9fc29ja19zZW5kbXNnKHNvY2ssIG1zZywgc2l6ZSwgdHJ1ZSk7Ci19Ci0KIGludCBrZXJuZWxfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCiAJCSAgIHN0cnVjdCBrdmVjICp2ZWMsIHNpemVfdCBudW0sIHNpemVfdCBzaXplKQogewotCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOwotCWludCByZXN1bHQ7Ci0KLQlzZXRfZnMoS0VSTkVMX0RTKTsKLQkvKgotCSAqIHRoZSBmb2xsb3dpbmcgaXMgc2FmZSwgc2luY2UgZm9yIGNvbXBpbGVyIGRlZmluaXRpb25zIG9mIGt2ZWMgYW5kCi0JICogaW92ZWMgYXJlIGlkZW50aWNhbCwgeWllbGRpbmcgdGhlIHNhbWUgaW4tY29yZSBsYXlvdXQgYW5kIGFsaWdubWVudAotCSAqLwotCWlvdl9pdGVyX2luaXQoJm1zZy0+bXNnX2l0ZXIsIFdSSVRFLCAoc3RydWN0IGlvdmVjICopdmVjLCBudW0sIHNpemUpOwotCXJlc3VsdCA9IHNvY2tfc2VuZG1zZyhzb2NrLCBtc2csIHNpemUpOwotCXNldF9mcyhvbGRmcyk7Ci0JcmV0dXJuIHJlc3VsdDsKKwlpb3ZfaXRlcl9rdmVjKCZtc2ctPm1zZ19pdGVyLCBXUklURSB8IElURVJfS1ZFQywgdmVjLCBudW0sIHNpemUpOworCXJldHVybiBzb2NrX3NlbmRtc2coc29jaywgbXNnKTsKIH0KIEVYUE9SVF9TWU1CT0woa2VybmVsX3NlbmRtc2cpOwogCkBAIC03MzEsOSArNjk2LDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzb2NrX3JlY3ZfZHJvcHMoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1JYUV9PVkZMKSAmJiBza2IgJiYgc2tiLT5kcm9wY291bnQpCisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19SWFFfT1ZGTCkgJiYgc2tiICYmIFNPQ0tfU0tCX0NCKHNrYiktPmRyb3Bjb3VudCkKIAkJcHV0X2Ntc2cobXNnLCBTT0xfU09DS0VULCBTT19SWFFfT1ZGTCwKLQkJCXNpemVvZihfX3UzMiksICZza2ItPmRyb3Bjb3VudCk7CisJCQlzaXplb2YoX191MzIpLCAmU09DS19TS0JfQ0Ioc2tiKS0+ZHJvcGNvdW50KTsKIH0KIAogdm9pZCBfX3NvY2tfcmVjdl90c19hbmRfZHJvcHMoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssCkBAIC03NDQsNDcgKzcwOSwyMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoX19zb2NrX3JlY3ZfdHNfYW5kX2Ryb3BzKTsKIAotc3RhdGljIGlubGluZSBpbnQgX19zb2NrX3JlY3Ztc2dfbm9zZWMoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW5saW5lIGludCBzb2NrX3JlY3Ztc2dfbm9zZWMoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJCSAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKLQlyZXR1cm4gc29jay0+b3BzLT5yZWN2bXNnKGlvY2IsIHNvY2ssIG1zZywgc2l6ZSwgZmxhZ3MpOworCXJldHVybiBzb2NrLT5vcHMtPnJlY3Ztc2coc29jaywgbXNnLCBzaXplLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IF9fc29ja19yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCQkgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwgaW50IGZsYWdzKQoraW50IHNvY2tfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLAorCQkgaW50IGZsYWdzKQogewogCWludCBlcnIgPSBzZWN1cml0eV9zb2NrZXRfcmVjdm1zZyhzb2NrLCBtc2csIHNpemUsIGZsYWdzKTsKIAotCXJldHVybiBlcnIgPzogX19zb2NrX3JlY3Ztc2dfbm9zZWMoaW9jYiwgc29jaywgbXNnLCBzaXplLCBmbGFncyk7Ci19Ci0KLWludCBzb2NrX3JlY3Ztc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkgc2l6ZV90IHNpemUsIGludCBmbGFncykKLXsKLQlzdHJ1Y3Qga2lvY2IgaW9jYjsKLQlpbnQgcmV0OwotCi0JaW5pdF9zeW5jX2tpb2NiKCZpb2NiLCBOVUxMKTsKLQlyZXQgPSBfX3NvY2tfcmVjdm1zZygmaW9jYiwgc29jaywgbXNnLCBzaXplLCBmbGFncyk7Ci0JaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCi0JCXJldCA9IHdhaXRfb25fc3luY19raW9jYigmaW9jYik7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyID86IHNvY2tfcmVjdm1zZ19ub3NlYyhzb2NrLCBtc2csIHNpemUsIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woc29ja19yZWN2bXNnKTsKIAotc3RhdGljIGludCBzb2NrX3JlY3Ztc2dfbm9zZWMoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAotCQkJICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKLXsKLQlzdHJ1Y3Qga2lvY2IgaW9jYjsKLQlpbnQgcmV0OwotCi0JaW5pdF9zeW5jX2tpb2NiKCZpb2NiLCBOVUxMKTsKLQlyZXQgPSBfX3NvY2tfcmVjdm1zZ19ub3NlYygmaW9jYiwgc29jaywgbXNnLCBzaXplLCBmbGFncyk7Ci0JaWYgKC1FSU9DQlFVRVVFRCA9PSByZXQpCi0JCXJldCA9IHdhaXRfb25fc3luY19raW9jYigmaW9jYik7Ci0JcmV0dXJuIHJldDsKLX0KLQogLyoqCiAgKiBrZXJuZWxfcmVjdm1zZyAtIFJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBzb2NrZXQgKGtlcm5lbCBzcGFjZSkKICAqIEBzb2NrOiAgICAgICBUaGUgc29ja2V0IHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UgZnJvbQpAQCAtODA2LDEyICs3NDUsOCBAQAogCW1tX3NlZ21lbnRfdCBvbGRmcyA9IGdldF9mcygpOwogCWludCByZXN1bHQ7CiAKKwlpb3ZfaXRlcl9rdmVjKCZtc2ctPm1zZ19pdGVyLCBSRUFEIHwgSVRFUl9LVkVDLCB2ZWMsIG51bSwgc2l6ZSk7CiAJc2V0X2ZzKEtFUk5FTF9EUyk7Ci0JLyoKLQkgKiB0aGUgZm9sbG93aW5nIGlzIHNhZmUsIHNpbmNlIGZvciBjb21waWxlciBkZWZpbml0aW9ucyBvZiBrdmVjIGFuZAotCSAqIGlvdmVjIGFyZSBpZGVudGljYWwsIHlpZWxkaW5nIHRoZSBzYW1lIGluLWNvcmUgbGF5b3V0IGFuZCBhbGlnbm1lbnQKLQkgKi8KLQlpb3ZfaXRlcl9pbml0KCZtc2ctPm1zZ19pdGVyLCBSRUFELCAoc3RydWN0IGlvdmVjICopdmVjLCBudW0sIHNpemUpOwogCXJlc3VsdCA9IHNvY2tfcmVjdm1zZyhzb2NrLCBtc2csIHNpemUsIGZsYWdzKTsKIAlzZXRfZnMob2xkZnMpOwogCXJldHVybiByZXN1bHQ7CkBAIC04NDksNyArNzg0LDggQEAKIHsKIAlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGlvY2ItPmtpX2ZpbHA7CiAJc3RydWN0IHNvY2tldCAqc29jayA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsubXNnX2l0ZXIgPSAqdG99OworCXN0cnVjdCBtc2doZHIgbXNnID0gey5tc2dfaXRlciA9ICp0bywKKwkJCSAgICAgLm1zZ19pb2NiID0gaW9jYn07CiAJc3NpemVfdCByZXM7CiAKIAlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCkBAIC04NTgsMTEgKzc5NCwxMCBAQAogCWlmIChpb2NiLT5raV9wb3MgIT0gMCkKIAkJcmV0dXJuIC1FU1BJUEU7CiAKLQlpZiAoaW9jYi0+a2lfbmJ5dGVzID09IDApCS8qIE1hdGNoIFNZUzUgYmVoYXZpb3VyICovCisJaWYgKCFpb3ZfaXRlcl9jb3VudCh0bykpCS8qIE1hdGNoIFNZUzUgYmVoYXZpb3VyICovCiAJCXJldHVybiAwOwogCi0JcmVzID0gX19zb2NrX3JlY3Ztc2coaW9jYiwgc29jaywgJm1zZywKLQkJCSAgICAgaW9jYi0+a2lfbmJ5dGVzLCBtc2cubXNnX2ZsYWdzKTsKKwlyZXMgPSBzb2NrX3JlY3Ztc2coc29jaywgJm1zZywgaW92X2l0ZXJfY291bnQodG8pLCBtc2cubXNnX2ZsYWdzKTsKIAkqdG8gPSBtc2cubXNnX2l0ZXI7CiAJcmV0dXJuIHJlczsKIH0KQEAgLTg3MSw3ICs4MDYsOCBAQAogewogCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKIAlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBtc2doZHIgbXNnID0gey5tc2dfaXRlciA9ICpmcm9tfTsKKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsubXNnX2l0ZXIgPSAqZnJvbSwKKwkJCSAgICAgLm1zZ19pb2NiID0gaW9jYn07CiAJc3NpemVfdCByZXM7CiAKIAlpZiAoaW9jYi0+a2lfcG9zICE9IDApCkBAIC04ODMsNyArODE5LDcgQEAKIAlpZiAoc29jay0+dHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCkKIAkJbXNnLm1zZ19mbGFncyB8PSBNU0dfRU9SOwogCi0JcmVzID0gX19zb2NrX3NlbmRtc2coaW9jYiwgc29jaywgJm1zZywgaW9jYi0+a2lfbmJ5dGVzKTsKKwlyZXMgPSBzb2NrX3NlbmRtc2coc29jaywgJm1zZyk7CiAJKmZyb20gPSBtc2cubXNnX2l0ZXI7CiAJcmV0dXJuIHJlczsKIH0KQEAgLTE3MDAsMTYgKzE2MzYsMTQgQEAKIAlzdHJ1Y3QgaW92ZWMgaW92OwogCWludCBmcHV0X25lZWRlZDsKIAotCWlmIChsZW4gPiBJTlRfTUFYKQotCQlsZW4gPSBJTlRfTUFYOworCWVyciA9IGltcG9ydF9zaW5nbGVfcmFuZ2UoV1JJVEUsIGJ1ZmYsIGxlbiwgJmlvdiwgJm1zZy5tc2dfaXRlcik7CisJaWYgKHVubGlrZWx5KGVycikpCisJCXJldHVybiBlcnI7CiAJc29jayA9IHNvY2tmZF9sb29rdXBfbGlnaHQoZmQsICZlcnIsICZmcHV0X25lZWRlZCk7CiAJaWYgKCFzb2NrKQogCQlnb3RvIG91dDsKIAotCWlvdi5pb3ZfYmFzZSA9IGJ1ZmY7Ci0JaW92Lmlvdl9sZW4gPSBsZW47CiAJbXNnLm1zZ19uYW1lID0gTlVMTDsKLQlpb3ZfaXRlcl9pbml0KCZtc2cubXNnX2l0ZXIsIFdSSVRFLCAmaW92LCAxLCBsZW4pOwogCW1zZy5tc2dfY29udHJvbCA9IE5VTEw7CiAJbXNnLm1zZ19jb250cm9sbGVuID0gMDsKIAltc2cubXNnX25hbWVsZW4gPSAwOwpAQCAtMTcyMyw3ICsxNjU3LDcgQEAKIAlpZiAoc29jay0+ZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCiAJCWZsYWdzIHw9IE1TR19ET05UV0FJVDsKIAltc2cubXNnX2ZsYWdzID0gZmxhZ3M7Ci0JZXJyID0gc29ja19zZW5kbXNnKHNvY2ssICZtc2csIGxlbik7CisJZXJyID0gc29ja19zZW5kbXNnKHNvY2ssICZtc2cpOwogCiBvdXRfcHV0OgogCWZwdXRfbGlnaHQoc29jay0+ZmlsZSwgZnB1dF9uZWVkZWQpOwpAQCAtMTc1OCwyNCArMTY5MiwyMiBAQAogCWludCBlcnIsIGVycjI7CiAJaW50IGZwdXRfbmVlZGVkOwogCi0JaWYgKHNpemUgPiBJTlRfTUFYKQotCQlzaXplID0gSU5UX01BWDsKKwllcnIgPSBpbXBvcnRfc2luZ2xlX3JhbmdlKFJFQUQsIHVidWYsIHNpemUsICZpb3YsICZtc2cubXNnX2l0ZXIpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlyZXR1cm4gZXJyOwogCXNvY2sgPSBzb2NrZmRfbG9va3VwX2xpZ2h0KGZkLCAmZXJyLCAmZnB1dF9uZWVkZWQpOwogCWlmICghc29jaykKIAkJZ290byBvdXQ7CiAKIAltc2cubXNnX2NvbnRyb2wgPSBOVUxMOwogCW1zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JaW92Lmlvdl9sZW4gPSBzaXplOwotCWlvdi5pb3ZfYmFzZSA9IHVidWY7Ci0JaW92X2l0ZXJfaW5pdCgmbXNnLm1zZ19pdGVyLCBSRUFELCAmaW92LCAxLCBzaXplKTsKIAkvKiBTYXZlIHNvbWUgY3ljbGVzIGFuZCBkb24ndCBjb3B5IHRoZSBhZGRyZXNzIGlmIG5vdCBuZWVkZWQgKi8KIAltc2cubXNnX25hbWUgPSBhZGRyID8gKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyZXNzIDogTlVMTDsKIAkvKiBXZSBhc3N1bWUgYWxsIGtlcm5lbCBjb2RlIGtub3dzIHRoZSBzaXplIG9mIHNvY2thZGRyX3N0b3JhZ2UgKi8KIAltc2cubXNnX25hbWVsZW4gPSAwOwogCWlmIChzb2NrLT5maWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKIAkJZmxhZ3MgfD0gTVNHX0RPTlRXQUlUOwotCWVyciA9IHNvY2tfcmVjdm1zZyhzb2NrLCAmbXNnLCBzaXplLCBmbGFncyk7CisJZXJyID0gc29ja19yZWN2bXNnKHNvY2ssICZtc2csIGlvdl9pdGVyX2NvdW50KCZtc2cubXNnX2l0ZXIpLCBmbGFncyk7CiAKIAlpZiAoZXJyID49IDAgJiYgYWRkciAhPSBOVUxMKSB7CiAJCWVycjIgPSBtb3ZlX2FkZHJfdG9fdXNlcigmYWRkcmVzcywKQEAgLTE4OTUsMTAgKzE4MjcsMTAgQEAKIAl1bnNpZ25lZCBpbnQgbmFtZV9sZW47CiB9OwogCi1zdGF0aWMgc3NpemVfdCBjb3B5X21zZ2hkcl9mcm9tX3VzZXIoc3RydWN0IG1zZ2hkciAqa21zZywKLQkJCQkgICAgIHN0cnVjdCB1c2VyX21zZ2hkciBfX3VzZXIgKnVtc2csCi0JCQkJICAgICBzdHJ1Y3Qgc29ja2FkZHIgX191c2VyICoqc2F2ZV9hZGRyLAotCQkJCSAgICAgc3RydWN0IGlvdmVjICoqaW92KQorc3RhdGljIGludCBjb3B5X21zZ2hkcl9mcm9tX3VzZXIoc3RydWN0IG1zZ2hkciAqa21zZywKKwkJCQkgc3RydWN0IHVzZXJfbXNnaGRyIF9fdXNlciAqdW1zZywKKwkJCQkgc3RydWN0IHNvY2thZGRyIF9fdXNlciAqKnNhdmVfYWRkciwKKwkJCQkgc3RydWN0IGlvdmVjICoqaW92KQogewogCXN0cnVjdCBzb2NrYWRkciBfX3VzZXIgKnVhZGRyOwogCXN0cnVjdCBpb3ZlYyBfX3VzZXIgKnVpb3Y7CkBAIC0xOTQyLDEzICsxODc0LDEwIEBACiAJaWYgKG5yX3NlZ3MgPiBVSU9fTUFYSU9WKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCi0JZXJyID0gcndfY29weV9jaGVja191dmVjdG9yKHNhdmVfYWRkciA/IFJFQUQgOiBXUklURSwKLQkJCQkgICAgdWlvdiwgbnJfc2VncywKLQkJCQkgICAgVUlPX0ZBU1RJT1YsICppb3YsIGlvdik7Ci0JaWYgKGVyciA+PSAwKQotCQlpb3ZfaXRlcl9pbml0KCZrbXNnLT5tc2dfaXRlciwgc2F2ZV9hZGRyID8gUkVBRCA6IFdSSVRFLAotCQkJICAgICAgKmlvdiwgbnJfc2VncywgZXJyKTsKLQlyZXR1cm4gZXJyOworCWttc2ctPm1zZ19pb2NiID0gTlVMTDsKKworCXJldHVybiBpbXBvcnRfaW92ZWMoc2F2ZV9hZGRyID8gUkVBRCA6IFdSSVRFLCB1aW92LCBucl9zZWdzLAorCQkJICAgIFVJT19GQVNUSU9WLCBpb3YsICZrbXNnLT5tc2dfaXRlcik7CiB9CiAKIHN0YXRpYyBpbnQgX19fc3lzX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHVzZXJfbXNnaGRyIF9fdXNlciAqbXNnLApAQCAtMTk2Myw3ICsxODkyLDcgQEAKIAkgICAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoc2l6ZW9mKF9fa2VybmVsX3NpemVfdCkpKSk7CiAJLyogMjAgaXMgc2l6ZSBvZiBpcHY2X3BrdGluZm8gKi8KIAl1bnNpZ25lZCBjaGFyICpjdGxfYnVmID0gY3RsOwotCWludCBjdGxfbGVuLCB0b3RhbF9sZW47CisJaW50IGN0bF9sZW47CiAJc3NpemVfdCBlcnI7CiAKIAltc2dfc3lzLT5tc2dfbmFtZSA9ICZhZGRyZXNzOwpAQCAtMTk3Myw4ICsxOTAyLDcgQEAKIAllbHNlCiAJCWVyciA9IGNvcHlfbXNnaGRyX2Zyb21fdXNlcihtc2dfc3lzLCBtc2csIE5VTEwsICZpb3YpOwogCWlmIChlcnIgPCAwKQotCQlnb3RvIG91dF9mcmVlaW92OwotCXRvdGFsX2xlbiA9IGVycjsKKwkJcmV0dXJuIGVycjsKIAogCWVyciA9IC1FTk9CVUZTOwogCkBAIC0yMDIxLDEwICsxOTQ5LDEwIEBACiAJICAgIHVzZWRfYWRkcmVzcy0+bmFtZV9sZW4gPT0gbXNnX3N5cy0+bXNnX25hbWVsZW4gJiYKIAkgICAgIW1lbWNtcCgmdXNlZF9hZGRyZXNzLT5uYW1lLCBtc2dfc3lzLT5tc2dfbmFtZSwKIAkJICAgIHVzZWRfYWRkcmVzcy0+bmFtZV9sZW4pKSB7Ci0JCWVyciA9IHNvY2tfc2VuZG1zZ19ub3NlYyhzb2NrLCBtc2dfc3lzLCB0b3RhbF9sZW4pOworCQllcnIgPSBzb2NrX3NlbmRtc2dfbm9zZWMoc29jaywgbXNnX3N5cyk7CiAJCWdvdG8gb3V0X2ZyZWVjdGw7CiAJfQotCWVyciA9IHNvY2tfc2VuZG1zZyhzb2NrLCBtc2dfc3lzLCB0b3RhbF9sZW4pOworCWVyciA9IHNvY2tfc2VuZG1zZyhzb2NrLCBtc2dfc3lzKTsKIAkvKgogCSAqIElmIHRoaXMgaXMgc2VuZG1tc2coKSBhbmQgc2VuZGluZyB0byBjdXJyZW50IGRlc3RpbmF0aW9uIGFkZHJlc3Mgd2FzCiAJICogc3VjY2Vzc2Z1bCwgcmVtZW1iZXIgaXQuCkBAIC0yMDQwLDggKzE5NjgsNyBAQAogCWlmIChjdGxfYnVmICE9IGN0bCkKIAkJc29ja19rZnJlZV9zKHNvY2stPnNrLCBjdGxfYnVmLCBjdGxfbGVuKTsKIG91dF9mcmVlaW92OgotCWlmIChpb3YgIT0gaW92c3RhY2spCi0JCWtmcmVlKGlvdik7CisJa2ZyZWUoaW92KTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0yMTY2LDggKzIwOTMsOCBAQAogCWVsc2UKIAkJZXJyID0gY29weV9tc2doZHJfZnJvbV91c2VyKG1zZ19zeXMsIG1zZywgJnVhZGRyLCAmaW92KTsKIAlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXRfZnJlZWlvdjsKLQl0b3RhbF9sZW4gPSBlcnI7CisJCXJldHVybiBlcnI7CisJdG90YWxfbGVuID0gaW92X2l0ZXJfY291bnQoJm1zZ19zeXMtPm1zZ19pdGVyKTsKIAogCWNtc2dfcHRyID0gKHVuc2lnbmVkIGxvbmcpbXNnX3N5cy0+bXNnX2NvbnRyb2w7CiAJbXNnX3N5cy0+bXNnX2ZsYWdzID0gZmxhZ3MgJiAoTVNHX0NNU0dfQ0xPRVhFQ3xNU0dfQ01TR19DT01QQVQpOwpAQCAtMjIwNSw4ICsyMTMyLDcgQEAKIAllcnIgPSBsZW47CiAKIG91dF9mcmVlaW92OgotCWlmIChpb3YgIT0gaW92c3RhY2spCi0JCWtmcmVlKGlvdik7CisJa2ZyZWUoaW92KTsKIAlyZXR1cm4gZXJyOwogfQogCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL0tjb25maWcgYi9uZXQvc3VucnBjL0tjb25maWcKaW5kZXggZmI3ODExNy4uOTA2OGU3MiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9LY29uZmlnCisrKyBiL25ldC9zdW5ycGMvS2NvbmZpZwpAQCAtMSw5ICsxLDExIEBACiBjb25maWcgU1VOUlBDCiAJdHJpc3RhdGUKKwlkZXBlbmRzIG9uIE1VTFRJVVNFUgogCiBjb25maWcgU1VOUlBDX0dTUwogCXRyaXN0YXRlCiAJc2VsZWN0IE9JRF9SRUdJU1RSWQorCWRlcGVuZHMgb24gTVVMVElVU0VSCiAKIGNvbmZpZyBTVU5SUENfQkFDS0NIQU5ORUwKIAlib29sCmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2NhY2hlLmMgYi9uZXQvc3VucnBjL2NhY2hlLmMKaW5kZXggNTE5OWJiMS4uMjkyOGFmZiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9jYWNoZS5jCisrKyBiL25ldC9zdW5ycGMvY2FjaGUuYwpAQCAtMTA3MiwxMCArMTA3MiwxMiBAQAogCiAJaWYgKGxlbiA8IDApIHJldHVybjsKIAotCXJldCA9IHN0cmluZ19lc2NhcGVfc3RyKHN0ciwgJmJwLCBsZW4sIEVTQ0FQRV9PQ1RBTCwgIlxcIFxuXHQiKTsKLQlpZiAocmV0IDwgMCB8fCByZXQgPT0gbGVuKQorCXJldCA9IHN0cmluZ19lc2NhcGVfc3RyKHN0ciwgYnAsIGxlbiwgRVNDQVBFX09DVEFMLCAiXFwgXG5cdCIpOworCWlmIChyZXQgPj0gbGVuKSB7CisJCWJwICs9IGxlbjsKIAkJbGVuID0gLTE7Ci0JZWxzZSB7CisJfSBlbHNlIHsKKwkJYnAgKz0gcmV0OwogCQlsZW4gLT0gcmV0OwogCQkqYnArKyA9ICcgJzsKIAkJbGVuLS07CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL2NsbnQuYyBiL25ldC9zdW5ycGMvY2xudC5jCmluZGV4IDYxMmFhNzMuLmU2Y2UxNTEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvY2xudC5jCisrKyBiL25ldC9zdW5ycGMvY2xudC5jCkBAIC0zMDMsOSArMzAzLDcgQEAKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnBpcGVmc19zYjsKIAlpbnQgZXJyOwogCi0JZXJyID0gcnBjX2NsbnRfZGVidWdmc19yZWdpc3RlcihjbG50KTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOworCXJwY19jbG50X2RlYnVnZnNfcmVnaXN0ZXIoY2xudCk7CiAKIAlwaXBlZnNfc2IgPSBycGNfZ2V0X3NiX25ldChuZXQpOwogCWlmIChwaXBlZnNfc2IpIHsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvZGVidWdmcy5jIGIvbmV0L3N1bnJwYy9kZWJ1Z2ZzLmMKaW5kZXggZTgxMWYzOS4uODI5NjJmNyAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9kZWJ1Z2ZzLmMKKysrIGIvbmV0L3N1bnJwYy9kZWJ1Z2ZzLmMKQEAgLTEyOSw0OCArMTI5LDUyIEBACiAJLnJlbGVhc2UJPSB0YXNrc19yZWxlYXNlLAogfTsKIAotaW50Cit2b2lkCiBycGNfY2xudF9kZWJ1Z2ZzX3JlZ2lzdGVyKHN0cnVjdCBycGNfY2xudCAqY2xudCkKIHsKLQlpbnQgbGVuLCBlcnI7CisJaW50IGxlbjsKIAljaGFyIG5hbWVbMjRdOyAvKiBlbm91Z2ggZm9yICIuLi8uLi9ycGNfeHBydC8gKyA4IGhleCBkaWdpdHMgKyBOVUxMICovCisJc3RydWN0IHJwY194cHJ0ICp4cHJ0OwogCiAJLyogQWxyZWFkeSByZWdpc3RlcmVkPyAqLwotCWlmIChjbG50LT5jbF9kZWJ1Z2ZzKQotCQlyZXR1cm4gMDsKKwlpZiAoY2xudC0+Y2xfZGVidWdmcyB8fCAhcnBjX2NsbnRfZGlyKQorCQlyZXR1cm47CiAKIAlsZW4gPSBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIleCIsIGNsbnQtPmNsX2NsaWQpOwogCWlmIChsZW4gPj0gc2l6ZW9mKG5hbWUpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuOwogCiAJLyogbWFrZSB0aGUgcGVyLWNsaWVudCBkaXIgKi8KIAljbG50LT5jbF9kZWJ1Z2ZzID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHJwY19jbG50X2Rpcik7CiAJaWYgKCFjbG50LT5jbF9kZWJ1Z2ZzKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuOwogCiAJLyogbWFrZSB0YXNrcyBmaWxlICovCi0JZXJyID0gLUVOT01FTTsKIAlpZiAoIWRlYnVnZnNfY3JlYXRlX2ZpbGUoInRhc2tzIiwgU19JRlJFRyB8IFNfSVJVU1IsIGNsbnQtPmNsX2RlYnVnZnMsCiAJCQkJIGNsbnQsICZ0YXNrc19mb3BzKSkKIAkJZ290byBvdXRfZXJyOwogCi0JZXJyID0gLUVJTlZBTDsKIAlyY3VfcmVhZF9sb2NrKCk7CisJeHBydCA9IHJjdV9kZXJlZmVyZW5jZShjbG50LT5jbF94cHJ0KTsKKwkvKiBubyAiZGVidWdmcyIgZGVudHJ5PyBEb24ndCBib3RoZXIgd2l0aCB0aGUgc3ltbGluay4gKi8KKwlpZiAoIXhwcnQtPmRlYnVnZnMpIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybjsKKwl9CiAJbGVuID0gc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiLi4vLi4vcnBjX3hwcnQvJXMiLAotCQkJcmN1X2RlcmVmZXJlbmNlKGNsbnQtPmNsX3hwcnQpLT5kZWJ1Z2ZzLT5kX25hbWUubmFtZSk7CisJCQl4cHJ0LT5kZWJ1Z2ZzLT5kX25hbWUubmFtZSk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CisKIAlpZiAobGVuID49IHNpemVvZihuYW1lKSkKIAkJZ290byBvdXRfZXJyOwogCi0JZXJyID0gLUVOT01FTTsKIAlpZiAoIWRlYnVnZnNfY3JlYXRlX3N5bWxpbmsoInhwcnQiLCBjbG50LT5jbF9kZWJ1Z2ZzLCBuYW1lKSkKIAkJZ290byBvdXRfZXJyOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuOwogb3V0X2VycjoKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoY2xudC0+Y2xfZGVidWdmcyk7CiAJY2xudC0+Y2xfZGVidWdmcyA9IE5VTEw7Ci0JcmV0dXJuIGVycjsKIH0KIAogdm9pZApAQCAtMjI2LDMzICsyMzAsMzMgQEAKIAkucmVsZWFzZQk9IHhwcnRfaW5mb19yZWxlYXNlLAogfTsKIAotaW50Cit2b2lkCiBycGNfeHBydF9kZWJ1Z2ZzX3JlZ2lzdGVyKHN0cnVjdCBycGNfeHBydCAqeHBydCkKIHsKIAlpbnQgbGVuLCBpZDsKIAlzdGF0aWMgYXRvbWljX3QJY3VyX2lkOwogCWNoYXIJCW5hbWVbOV07IC8qIDggaGV4IGRpZ2l0cyArIE5VTEwgdGVybSAqLwogCisJaWYgKCFycGNfeHBydF9kaXIpCisJCXJldHVybjsKKwogCWlkID0gKHVuc2lnbmVkIGludClhdG9taWNfaW5jX3JldHVybigmY3VyX2lkKTsKIAogCWxlbiA9IHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiV4IiwgaWQpOwogCWlmIChsZW4gPj0gc2l6ZW9mKG5hbWUpKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuOwogCiAJLyogbWFrZSB0aGUgcGVyLWNsaWVudCBkaXIgKi8KIAl4cHJ0LT5kZWJ1Z2ZzID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHJwY194cHJ0X2Rpcik7CiAJaWYgKCF4cHJ0LT5kZWJ1Z2ZzKQotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0dXJuOwogCiAJLyogbWFrZSB0YXNrcyBmaWxlICovCiAJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJpbmZvIiwgU19JRlJFRyB8IFNfSVJVU1IsIHhwcnQtPmRlYnVnZnMsCiAJCQkJIHhwcnQsICZ4cHJ0X2luZm9fZm9wcykpIHsKIAkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHhwcnQtPmRlYnVnZnMpOwogCQl4cHJ0LT5kZWJ1Z2ZzID0gTlVMTDsKLQkJcmV0dXJuIC1FTk9NRU07CiAJfQotCi0JcmV0dXJuIDA7CiB9CiAKIHZvaWQKQEAgLTI2NiwxNCArMjcwLDE3IEBACiBzdW5ycGNfZGVidWdmc19leGl0KHZvaWQpCiB7CiAJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHRvcGRpcik7CisJdG9wZGlyID0gTlVMTDsKKwlycGNfY2xudF9kaXIgPSBOVUxMOworCXJwY194cHJ0X2RpciA9IE5VTEw7CiB9CiAKLWludCBfX2luaXQKK3ZvaWQgX19pbml0CiBzdW5ycGNfZGVidWdmc19pbml0KHZvaWQpCiB7CiAJdG9wZGlyID0gZGVidWdmc19jcmVhdGVfZGlyKCJzdW5ycGMiLCBOVUxMKTsKIAlpZiAoIXRvcGRpcikKLQkJZ290byBvdXQ7CisJCXJldHVybjsKIAogCXJwY19jbG50X2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigicnBjX2NsbnQiLCB0b3BkaXIpOwogCWlmICghcnBjX2NsbnRfZGlyKQpAQCAtMjgzLDEwICsyOTAsOSBAQAogCWlmICghcnBjX3hwcnRfZGlyKQogCQlnb3RvIG91dF9yZW1vdmU7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm47CiBvdXRfcmVtb3ZlOgogCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZSh0b3BkaXIpOwogCXRvcGRpciA9IE5VTEw7Ci1vdXQ6Ci0JcmV0dXJuIC1FTk9NRU07CisJcnBjX2NsbnRfZGlyID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYyBiL25ldC9zdW5ycGMvc3VucnBjX3N5bXMuYwppbmRleCBlMzdmYmVkLi5lZTVkM2QyIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N1bnJwY19zeW1zLmMKKysrIGIvbmV0L3N1bnJwYy9zdW5ycGNfc3ltcy5jCkBAIC05OCwxMCArOTgsNyBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0NDsKIAotCWVyciA9IHN1bnJwY19kZWJ1Z2ZzX2luaXQoKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDU7Ci0KKwlzdW5ycGNfZGVidWdmc19pbml0KCk7CiAjaWYgSVNfRU5BQkxFRChDT05GSUdfU1VOUlBDX0RFQlVHKQogCXJwY19yZWdpc3Rlcl9zeXNjdGwoKTsKICNlbmRpZgpAQCAtMTA5LDggKzEwNiw2IEBACiAJaW5pdF9zb2NrZXRfeHBydCgpOwkvKiBjbG50IHNvY2sgdHJhbnNwb3J0ICovCiAJcmV0dXJuIDA7CiAKLW91dDU6Ci0JdW5yZWdpc3Rlcl9ycGNfcGlwZWZzKCk7CiBvdXQ0OgogCXVucmVnaXN0ZXJfcGVybmV0X3N1YnN5cygmc3VucnBjX25ldF9vcHMpOwogb3V0MzoKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3Zjc29jay5jIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKaW5kZXggY2MzMzFiNi4uMGM4MTIwMiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMKKysrIGIvbmV0L3N1bnJwYy9zdmNzb2NrLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogCiAJCXN2Y19zZXRfY21zZ19kYXRhKHJxc3RwLCBjbWgpOwogCi0JCWlmIChzb2NrX3NlbmRtc2coc29jaywgJm1zZywgMCkgPCAwKQorCQlpZiAoc29ja19zZW5kbXNnKHNvY2ssICZtc2cpIDwgMCkKIAkJCWdvdG8gb3V0OwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0LmMgYi9uZXQvc3VucnBjL3hwcnQuYwppbmRleCBlMzAxNWFlLi45OTQ5NzIyIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnQuYworKysgYi9uZXQvc3VucnBjL3hwcnQuYwpAQCAtMTMzMSw3ICsxMzMxLDYgQEAKICAqLwogc3RydWN0IHJwY194cHJ0ICp4cHJ0X2NyZWF0ZV90cmFuc3BvcnQoc3RydWN0IHhwcnRfY3JlYXRlICphcmdzKQogewotCWludCBlcnI7CiAJc3RydWN0IHJwY194cHJ0CSp4cHJ0OwogCXN0cnVjdCB4cHJ0X2NsYXNzICp0OwogCkBAIC0xMzcyLDExICsxMzcxLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJfQogCi0JZXJyID0gcnBjX3hwcnRfZGVidWdmc19yZWdpc3Rlcih4cHJ0KTsKLQlpZiAoZXJyKSB7Ci0JCXhwcnRfZGVzdHJveSh4cHJ0KTsKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKLQl9CisJcnBjX3hwcnRfZGVidWdmc19yZWdpc3Rlcih4cHJ0KTsKIAogCWRwcmludGsoIlJQQzogICAgICAgY3JlYXRlZCB0cmFuc3BvcnQgJXAgd2l0aCAldSBzbG90c1xuIiwgeHBydCwKIAkJCXhwcnQtPm1heF9yZXFzKTsKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYyBiL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYwppbmRleCAxMjQ2NzZjLi5lMjg5MDlmIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3hwcnRyZG1hL3ZlcmJzLmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS92ZXJicy5jCkBAIC0xMTM2LDcgKzExMzYsNyBAQAogCWludCBpLCByYzsKIAogCWkgPSAoYnVmLT5yYl9tYXhfcmVxdWVzdHMgKyAxKSAqIFJQQ1JETUFfTUFYX1NFR1M7Ci0JZHByaW50aygiUlBDOiAgICAgICAlczogaW5pdGFsaXppbmcgJWQgRk1Sc1xuIiwgX19mdW5jX18sIGkpOworCWRwcmludGsoIlJQQzogICAgICAgJXM6IGluaXRpYWxpemluZyAlZCBGTVJzXG4iLCBfX2Z1bmNfXywgaSk7CiAKIAl3aGlsZSAoaS0tKSB7CiAJCXIgPSBremFsbG9jKHNpemVvZigqciksIEdGUF9LRVJORUwpOwpAQCAtMTE2OSw3ICsxMTY5LDcgQEAKIAlpbnQgaSwgcmM7CiAKIAlpID0gKGJ1Zi0+cmJfbWF4X3JlcXVlc3RzICsgMSkgKiBSUENSRE1BX01BWF9TRUdTOwotCWRwcmludGsoIlJQQzogICAgICAgJXM6IGluaXRhbGl6aW5nICVkIEZSTVJzXG4iLCBfX2Z1bmNfXywgaSk7CisJZHByaW50aygiUlBDOiAgICAgICAlczogaW5pdGlhbGl6aW5nICVkIEZSTVJzXG4iLCBfX2Z1bmNfXywgaSk7CiAKIAl3aGlsZSAoaS0tKSB7CiAJCXIgPSBremFsbG9jKHNpemVvZigqciksIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvbmV0L3N3aXRjaGRldi9zd2l0Y2hkZXYuYyBiL25ldC9zd2l0Y2hkZXYvc3dpdGNoZGV2LmMKaW5kZXggOGMxZTU1OC4uNDY1NjhiOCAxMDA2NDQKLS0tIGEvbmV0L3N3aXRjaGRldi9zd2l0Y2hkZXYuYworKysgYi9uZXQvc3dpdGNoZGV2L3N3aXRjaGRldi5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIG5ldC9zd2l0Y2hkZXYvc3dpdGNoZGV2LmMgLSBTd2l0Y2ggZGV2aWNlIEFQSQogICogQ29weXJpZ2h0IChjKSAyMDE0IEppcmkgUGlya28gPGppcmlAcmVzbnVsbGkudXM+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBTY290dCBGZWxkbWFuIDxzZmVsZG1hQGdtYWlsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE0LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2lwX2ZpYi5oPgogI2luY2x1ZGUgPG5ldC9zd2l0Y2hkZXYuaD4KIAogLyoqCkBAIC0yNiwxMyArMjgsMTMgQEAKIGludCBuZXRkZXZfc3dpdGNoX3BhcmVudF9pZF9nZXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQlzdHJ1Y3QgbmV0ZGV2X3BoeXNfaXRlbV9pZCAqcHNpZCkKIHsKLQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IGRldi0+bmV0ZGV2X29wczsKKwljb25zdCBzdHJ1Y3Qgc3dkZXZfb3BzICpvcHMgPSBkZXYtPnN3ZGV2X29wczsKIAotCWlmICghb3BzLT5uZG9fc3dpdGNoX3BhcmVudF9pZF9nZXQpCisJaWYgKCFvcHMgfHwgIW9wcy0+c3dkZXZfcGFyZW50X2lkX2dldCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCXJldHVybiBvcHMtPm5kb19zd2l0Y2hfcGFyZW50X2lkX2dldChkZXYsIHBzaWQpOworCXJldHVybiBvcHMtPnN3ZGV2X3BhcmVudF9pZF9nZXQoZGV2LCBwc2lkKTsKIH0KLUVYUE9SVF9TWU1CT0wobmV0ZGV2X3N3aXRjaF9wYXJlbnRfaWRfZ2V0KTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5ldGRldl9zd2l0Y2hfcGFyZW50X2lkX2dldCk7CiAKIC8qKgogICoJbmV0ZGV2X3N3aXRjaF9wb3J0X3N0cF91cGRhdGUgLSBOb3RpZnkgc3dpdGNoIGRldmljZSBwb3J0IG9mIFNUUApAQCAtNDQsMjAgKzQ2LDI5IEBACiAgKi8KIGludCBuZXRkZXZfc3dpdGNoX3BvcnRfc3RwX3VwZGF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCBzdGF0ZSkKIHsKLQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IGRldi0+bmV0ZGV2X29wczsKKwljb25zdCBzdHJ1Y3Qgc3dkZXZfb3BzICpvcHMgPSBkZXYtPnN3ZGV2X29wczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbG93ZXJfZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CisJaW50IGVyciA9IC1FT1BOT1RTVVBQOwogCi0JaWYgKCFvcHMtPm5kb19zd2l0Y2hfcG9ydF9zdHBfdXBkYXRlKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JV0FSTl9PTighb3BzLT5uZG9fc3dpdGNoX3BhcmVudF9pZF9nZXQpOwotCXJldHVybiBvcHMtPm5kb19zd2l0Y2hfcG9ydF9zdHBfdXBkYXRlKGRldiwgc3RhdGUpOworCWlmIChvcHMgJiYgb3BzLT5zd2Rldl9wb3J0X3N0cF91cGRhdGUpCisJCXJldHVybiBvcHMtPnN3ZGV2X3BvcnRfc3RwX3VwZGF0ZShkZXYsIHN0YXRlKTsKKworCW5ldGRldl9mb3JfZWFjaF9sb3dlcl9kZXYoZGV2LCBsb3dlcl9kZXYsIGl0ZXIpIHsKKwkJZXJyID0gbmV0ZGV2X3N3aXRjaF9wb3J0X3N0cF91cGRhdGUobG93ZXJfZGV2LCBzdGF0ZSk7CisJCWlmIChlcnIgJiYgZXJyICE9IC1FT1BOT1RTVVBQKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTChuZXRkZXZfc3dpdGNoX3BvcnRfc3RwX3VwZGF0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChuZXRkZXZfc3dpdGNoX3BvcnRfc3RwX3VwZGF0ZSk7CiAKIHN0YXRpYyBERUZJTkVfTVVURVgobmV0ZGV2X3N3aXRjaF9tdXRleCk7CiBzdGF0aWMgUkFXX05PVElGSUVSX0hFQUQobmV0ZGV2X3N3aXRjaF9ub3RpZl9jaGFpbik7CiAKIC8qKgotICoJcmVnaXN0ZXJfbmV0ZGV2X3N3aXRjaF9ub3RpZmllciAtIFJlZ2lzdGVyIG5vZmlmaWVyCisgKglyZWdpc3Rlcl9uZXRkZXZfc3dpdGNoX25vdGlmaWVyIC0gUmVnaXN0ZXIgbm90aWZpZXIKICAqCUBuYjogbm90aWZpZXJfYmxvY2sKICAqCiAgKglSZWdpc3RlciBzd2l0Y2ggZGV2aWNlIG5vdGlmaWVyLiBUaGlzIHNob3VsZCBiZSB1c2VkIGJ5IGNvZGUKQEAgLTczLDEwICs4NCwxMCBAQAogCW11dGV4X3VubG9jaygmbmV0ZGV2X3N3aXRjaF9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0wocmVnaXN0ZXJfbmV0ZGV2X3N3aXRjaF9ub3RpZmllcik7CitFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9uZXRkZXZfc3dpdGNoX25vdGlmaWVyKTsKIAogLyoqCi0gKgl1bnJlZ2lzdGVyX25ldGRldl9zd2l0Y2hfbm90aWZpZXIgLSBVbnJlZ2lzdGVyIG5vZmlmaWVyCisgKgl1bnJlZ2lzdGVyX25ldGRldl9zd2l0Y2hfbm90aWZpZXIgLSBVbnJlZ2lzdGVyIG5vdGlmaWVyCiAgKglAbmI6IG5vdGlmaWVyX2Jsb2NrCiAgKgogICoJVW5yZWdpc3RlciBzd2l0Y2ggZGV2aWNlIG5vdGlmaWVyLgpAQCAtOTEsMTAgKzEwMiwxMCBAQAogCW11dGV4X3VubG9jaygmbmV0ZGV2X3N3aXRjaF9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0wodW5yZWdpc3Rlcl9uZXRkZXZfc3dpdGNoX25vdGlmaWVyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfbmV0ZGV2X3N3aXRjaF9ub3RpZmllcik7CiAKIC8qKgotICoJY2FsbF9uZXRkZXZfc3dpdGNoX25vdGlmaWVycyAtIENhbGwgbm9maWZpZXJzCisgKgljYWxsX25ldGRldl9zd2l0Y2hfbm90aWZpZXJzIC0gQ2FsbCBub3RpZmllcnMKICAqCUB2YWw6IHZhbHVlIHBhc3NlZCB1bm1vZGlmaWVkIHRvIG5vdGlmaWVyIGZ1bmN0aW9uCiAgKglAZGV2OiBwb3J0IGRldmljZQogICoJQGluZm86IG5vdGlmaWVyIGluZm9ybWF0aW9uIGRhdGEKQEAgLTExNCw3ICsxMjUsNyBAQAogCW11dGV4X3VubG9jaygmbmV0ZGV2X3N3aXRjaF9tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KLUVYUE9SVF9TWU1CT0woY2FsbF9uZXRkZXZfc3dpdGNoX25vdGlmaWVycyk7CitFWFBPUlRfU1lNQk9MX0dQTChjYWxsX25ldGRldl9zd2l0Y2hfbm90aWZpZXJzKTsKIAogLyoqCiAgKgluZXRkZXZfc3dpdGNoX3BvcnRfYnJpZGdlX3NldGxpbmsgLSBOb3RpZnkgc3dpdGNoIGRldmljZSBwb3J0IG9mIGJyaWRnZQpAQCAtMTM5LDcgKzE1MCw3IEBACiAKIAlyZXR1cm4gb3BzLT5uZG9fYnJpZGdlX3NldGxpbmsoZGV2LCBubGgsIGZsYWdzKTsKIH0KLUVYUE9SVF9TWU1CT0wobmV0ZGV2X3N3aXRjaF9wb3J0X2JyaWRnZV9zZXRsaW5rKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5ldGRldl9zd2l0Y2hfcG9ydF9icmlkZ2Vfc2V0bGluayk7CiAKIC8qKgogICoJbmV0ZGV2X3N3aXRjaF9wb3J0X2JyaWRnZV9kZWxsaW5rIC0gTm90aWZ5IHN3aXRjaCBkZXZpY2UgcG9ydCBvZiBicmlkZ2UKQEAgLTE2NCw3ICsxNzUsNyBAQAogCiAJcmV0dXJuIG9wcy0+bmRvX2JyaWRnZV9kZWxsaW5rKGRldiwgbmxoLCBmbGFncyk7CiB9Ci1FWFBPUlRfU1lNQk9MKG5ldGRldl9zd2l0Y2hfcG9ydF9icmlkZ2VfZGVsbGluayk7CitFWFBPUlRfU1lNQk9MX0dQTChuZXRkZXZfc3dpdGNoX3BvcnRfYnJpZGdlX2RlbGxpbmspOwogCiAvKioKICAqCW5kb19kZmx0X25ldGRldl9zd2l0Y2hfcG9ydF9icmlkZ2Vfc2V0bGluayAtIGRlZmF1bHQgbmRvIGJyaWRnZSBzZXRsaW5rCkBAIC0xOTQsNyArMjA1LDcgQEAKIAogCXJldHVybiByZXQ7CiB9Ci1FWFBPUlRfU1lNQk9MKG5kb19kZmx0X25ldGRldl9zd2l0Y2hfcG9ydF9icmlkZ2Vfc2V0bGluayk7CitFWFBPUlRfU1lNQk9MX0dQTChuZG9fZGZsdF9uZXRkZXZfc3dpdGNoX3BvcnRfYnJpZGdlX3NldGxpbmspOwogCiAvKioKICAqCW5kb19kZmx0X25ldGRldl9zd2l0Y2hfcG9ydF9icmlkZ2VfZGVsbGluayAtIGRlZmF1bHQgbmRvIGJyaWRnZSBkZWxsaW5rCkBAIC0yMjQsNCArMjM1LDE3MCBAQAogCiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0wobmRvX2RmbHRfbmV0ZGV2X3N3aXRjaF9wb3J0X2JyaWRnZV9kZWxsaW5rKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5kb19kZmx0X25ldGRldl9zd2l0Y2hfcG9ydF9icmlkZ2VfZGVsbGluayk7CisKK3N0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2X3N3aXRjaF9nZXRfbG93ZXN0X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWNvbnN0IHN0cnVjdCBzd2Rldl9vcHMgKm9wcyA9IGRldi0+c3dkZXZfb3BzOworCXN0cnVjdCBuZXRfZGV2aWNlICpsb3dlcl9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKnBvcnRfZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXI7CisKKwkvKiBSZWN1c2l2ZWx5IHNlYXJjaCBkb3duIHVudGlsIHdlIGZpbmQgYSBzdyBwb3J0IGRldi4KKwkgKiAoQSBzdyBwb3J0IGRldiBzdXBwb3J0cyBzd2Rldl9wYXJlbnRfaWRfZ2V0KS4KKwkgKi8KKworCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19TV0lUQ0hfT0ZGTE9BRCAmJgorCSAgICBvcHMgJiYgb3BzLT5zd2Rldl9wYXJlbnRfaWRfZ2V0KQorCQlyZXR1cm4gZGV2OworCisJbmV0ZGV2X2Zvcl9lYWNoX2xvd2VyX2RldihkZXYsIGxvd2VyX2RldiwgaXRlcikgeworCQlwb3J0X2RldiA9IG5ldGRldl9zd2l0Y2hfZ2V0X2xvd2VzdF9kZXYobG93ZXJfZGV2KTsKKwkJaWYgKHBvcnRfZGV2KQorCQkJcmV0dXJuIHBvcnRfZGV2OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldl9zd2l0Y2hfZ2V0X2Rldl9ieV9uaHMoc3RydWN0IGZpYl9pbmZvICpmaSkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3BoeXNfaXRlbV9pZCBwc2lkOworCXN0cnVjdCBuZXRkZXZfcGh5c19pdGVtX2lkIHByZXZfcHNpZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gTlVMTDsKKwlpbnQgbmhzZWw7CisKKwkvKiBGb3IgdGhpcyByb3V0ZSwgYWxsIG5leHRob3AgZGV2cyBtdXN0IGJlIG9uIHRoZSBzYW1lIHN3aXRjaC4gKi8KKworCWZvciAobmhzZWwgPSAwOyBuaHNlbCA8IGZpLT5maWJfbmhzOyBuaHNlbCsrKSB7CisJCWNvbnN0IHN0cnVjdCBmaWJfbmggKm5oID0gJmZpLT5maWJfbmhbbmhzZWxdOworCisJCWlmICghbmgtPm5oX2RldikKKwkJCXJldHVybiBOVUxMOworCisJCWRldiA9IG5ldGRldl9zd2l0Y2hfZ2V0X2xvd2VzdF9kZXYobmgtPm5oX2Rldik7CisJCWlmICghZGV2KQorCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKG5ldGRldl9zd2l0Y2hfcGFyZW50X2lkX2dldChkZXYsICZwc2lkKSkKKwkJCXJldHVybiBOVUxMOworCisJCWlmIChuaHNlbCA+IDApIHsKKwkJCWlmIChwcmV2X3BzaWQuaWRfbGVuICE9IHBzaWQuaWRfbGVuKQorCQkJCXJldHVybiBOVUxMOworCQkJaWYgKG1lbWNtcChwcmV2X3BzaWQuaWQsIHBzaWQuaWQsIHBzaWQuaWRfbGVuKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCXByZXZfcHNpZCA9IHBzaWQ7CisJfQorCisJcmV0dXJuIGRldjsKK30KKworLyoqCisgKgluZXRkZXZfc3dpdGNoX2ZpYl9pcHY0X2FkZCAtIEFkZCBJUHY0IHJvdXRlIGVudHJ5IHRvIHN3aXRjaAorICoKKyAqCUBkc3Q6IHJvdXRlJ3MgSVB2NCBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKglAZHN0X2xlbjogZGVzdGluYXRpb24gYWRkcmVzcyBsZW5ndGggKHByZWZpeCBsZW5ndGgpCisgKglAZmk6IHJvdXRlIEZJQiBpbmZvIHN0cnVjdHVyZQorICoJQHRvczogcm91dGUgVE9TCisgKglAdHlwZTogcm91dGUgdHlwZQorICoJQG5sZmxhZ3M6IG5ldGxpbmsgZmxhZ3MgcGFzc2VkIGluIChOTE1fRl8qKQorICoJQHRiX2lkOiByb3V0ZSB0YWJsZSBJRAorICoKKyAqCUFkZCBJUHY0IHJvdXRlIGVudHJ5IHRvIHN3aXRjaCBkZXZpY2UuCisgKi8KK2ludCBuZXRkZXZfc3dpdGNoX2ZpYl9pcHY0X2FkZCh1MzIgZHN0LCBpbnQgZHN0X2xlbiwgc3RydWN0IGZpYl9pbmZvICpmaSwKKwkJCSAgICAgICB1OCB0b3MsIHU4IHR5cGUsIHUzMiBubGZsYWdzLCB1MzIgdGJfaWQpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKKwljb25zdCBzdHJ1Y3Qgc3dkZXZfb3BzICpvcHM7CisJaW50IGVyciA9IDA7CisKKwkvKiBEb24ndCBvZmZsb2FkIHJvdXRlIGlmIHVzaW5nIGN1c3RvbSBpcCBydWxlcyBvciBpZgorCSAqIElQdjQgRklCIG9mZmxvYWRpbmcgaGFzIGJlZW4gZGlzYWJsZWQgY29tcGxldGVseS4KKwkgKi8KKworI2lmZGVmIENPTkZJR19JUF9NVUxUSVBMRV9UQUJMRVMKKwlpZiAoZmktPmZpYl9uZXQtPmlwdjQuZmliX2hhc19jdXN0b21fcnVsZXMpCisJCXJldHVybiAwOworI2VuZGlmCisKKwlpZiAoZmktPmZpYl9uZXQtPmlwdjQuZmliX29mZmxvYWRfZGlzYWJsZWQpCisJCXJldHVybiAwOworCisJZGV2ID0gbmV0ZGV2X3N3aXRjaF9nZXRfZGV2X2J5X25ocyhmaSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCW9wcyA9IGRldi0+c3dkZXZfb3BzOworCisJaWYgKG9wcy0+c3dkZXZfZmliX2lwdjRfYWRkKSB7CisJCWVyciA9IG9wcy0+c3dkZXZfZmliX2lwdjRfYWRkKGRldiwgaHRvbmwoZHN0KSwgZHN0X2xlbiwKKwkJCQkJICAgICAgZmksIHRvcywgdHlwZSwgbmxmbGFncywKKwkJCQkJICAgICAgdGJfaWQpOworCQlpZiAoIWVycikKKwkJCWZpLT5maWJfZmxhZ3MgfD0gUlROSF9GX0VYVEVSTkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZXRkZXZfc3dpdGNoX2ZpYl9pcHY0X2FkZCk7CisKKy8qKgorICoJbmV0ZGV2X3N3aXRjaF9maWJfaXB2NF9kZWwgLSBEZWxldGUgSVB2NCByb3V0ZSBlbnRyeSBmcm9tIHN3aXRjaAorICoKKyAqCUBkc3Q6IHJvdXRlJ3MgSVB2NCBkZXN0aW5hdGlvbiBhZGRyZXNzCisgKglAZHN0X2xlbjogZGVzdGluYXRpb24gYWRkcmVzcyBsZW5ndGggKHByZWZpeCBsZW5ndGgpCisgKglAZmk6IHJvdXRlIEZJQiBpbmZvIHN0cnVjdHVyZQorICoJQHRvczogcm91dGUgVE9TCisgKglAdHlwZTogcm91dGUgdHlwZQorICoJQHRiX2lkOiByb3V0ZSB0YWJsZSBJRAorICoKKyAqCURlbGV0ZSBJUHY0IHJvdXRlIGVudHJ5IGZyb20gc3dpdGNoIGRldmljZS4KKyAqLworaW50IG5ldGRldl9zd2l0Y2hfZmliX2lwdjRfZGVsKHUzMiBkc3QsIGludCBkc3RfbGVuLCBzdHJ1Y3QgZmliX2luZm8gKmZpLAorCQkJICAgICAgIHU4IHRvcywgdTggdHlwZSwgdTMyIHRiX2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJY29uc3Qgc3RydWN0IHN3ZGV2X29wcyAqb3BzOworCWludCBlcnIgPSAwOworCisJaWYgKCEoZmktPmZpYl9mbGFncyAmIFJUTkhfRl9FWFRFUk5BTCkpCisJCXJldHVybiAwOworCisJZGV2ID0gbmV0ZGV2X3N3aXRjaF9nZXRfZGV2X2J5X25ocyhmaSk7CisJaWYgKCFkZXYpCisJCXJldHVybiAwOworCW9wcyA9IGRldi0+c3dkZXZfb3BzOworCisJaWYgKG9wcy0+c3dkZXZfZmliX2lwdjRfZGVsKSB7CisJCWVyciA9IG9wcy0+c3dkZXZfZmliX2lwdjRfZGVsKGRldiwgaHRvbmwoZHN0KSwgZHN0X2xlbiwKKwkJCQkJICAgICAgZmksIHRvcywgdHlwZSwgdGJfaWQpOworCQlpZiAoIWVycikKKwkJCWZpLT5maWJfZmxhZ3MgJj0gflJUTkhfRl9FWFRFUk5BTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmV0ZGV2X3N3aXRjaF9maWJfaXB2NF9kZWwpOworCisvKioKKyAqCW5ldGRldl9zd2l0Y2hfZmliX2lwdjRfYWJvcnQgLSBBYm9ydCBhbiBJUHY0IEZJQiBvcGVyYXRpb24KKyAqCisgKglAZmk6IHJvdXRlIEZJQiBpbmZvIHN0cnVjdHVyZQorICovCit2b2lkIG5ldGRldl9zd2l0Y2hfZmliX2lwdjRfYWJvcnQoc3RydWN0IGZpYl9pbmZvICpmaSkKK3sKKwkvKiBUaGVyZSB3YXMgYSBwcm9ibGVtIGluc3RhbGxpbmcgdGhpcyByb3V0ZSB0byB0aGUgb2ZmbG9hZAorCSAqIGRldmljZS4gIEZvciBub3csIHVudGlsIHdlIGNvbWUgdXAgd2l0aCBtb3JlIHJlZmluZWQKKwkgKiBwb2xpY3kgaGFuZGxpbmcsIGFicnVwdGx5IGVuZCBJUHY0IGZpYiBvZmZsb2FkaW5nIGZvcgorCSAqIGZvciBlbnRpcmUgbmV0IGJ5IGZsdXNoaW5nIG9mZmxvYWQgZGV2aWNlKHMpIG9mIGFsbAorCSAqIElQdjQgcm91dGVzLCBhbmQgbWFyayBJUHY0IGZpYiBvZmZsb2FkaW5nIGJyb2tlbiBmcm9tCisJICogdGhpcyBwb2ludCBmb3J3YXJkLgorCSAqLworCisJZmliX2ZsdXNoX2V4dGVybmFsKGZpLT5maWJfbmV0KTsKKwlmaS0+ZmliX25ldC0+aXB2NC5maWJfb2ZmbG9hZF9kaXNhYmxlZCA9IHRydWU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZXRkZXZfc3dpdGNoX2ZpYl9pcHY0X2Fib3J0KTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL0tjb25maWcgYi9uZXQvdGlwYy9LY29uZmlnCmluZGV4IDkxYzhhOGUuLmMyNWEzYTEgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL0tjb25maWcKKysrIGIvbmV0L3RpcGMvS2NvbmZpZwpAQCAtMjYsMyArMjYsMTEgQEAKIAloZWxwCiAJICBTYXlpbmcgWSBoZXJlIHdpbGwgZW5hYmxlIHN1cHBvcnQgZm9yIHJ1bm5pbmcgVElQQyBvbgogCSAgSVAtb3Zlci1JbmZpbmlCYW5kIGRldmljZXMuCitjb25maWcgVElQQ19NRURJQV9VRFAKKwlib29sICJJUC9VRFAgbWVkaWEgdHlwZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gVElQQworCXNlbGVjdCBORVRfVURQX1RVTk5FTAorCWhlbHAKKwkgIFNheWluZyBZIGhlcmUgd2lsbCBlbmFibGUgc3VwcG9ydCBmb3IgcnVubmluZyBUSVBDIG92ZXIgSVAvVURQCisJYm9vbAorCWRlZmF1bHQgeQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvTWFrZWZpbGUgYi9uZXQvdGlwYy9NYWtlZmlsZQppbmRleCA1OTliMWE1Li41N2U0NjBiIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9NYWtlZmlsZQorKysgYi9uZXQvdGlwYy9NYWtlZmlsZQpAQCAtMTAsNSArMTAsNiBAQAogCSAgIG5ldGxpbmsubyBuZXRsaW5rX2NvbXBhdC5vIG5vZGUubyBzb2NrZXQubyBldGhfbWVkaWEubyBcCiAJICAgc2VydmVyLm8gc29ja2V0Lm8KIAordGlwYy0kKENPTkZJR19USVBDX01FRElBX1VEUCkJKz0gdWRwX21lZGlhLm8KIHRpcGMtJChDT05GSUdfVElQQ19NRURJQV9JQikJKz0gaWJfbWVkaWEubwogdGlwYy0kKENPTkZJR19TWVNDVEwpCQkrPSBzeXNjdGwubwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYWRkci5jIGIvbmV0L3RpcGMvYWRkci5jCmluZGV4IDQ4ZmQzYjUuLmJhN2RhYTggMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2FkZHIuYworKysgYi9uZXQvdGlwYy9hZGRyLmMKQEAgLTM4LDYgKzM4LDEzIEBACiAjaW5jbHVkZSAiYWRkci5oIgogI2luY2x1ZGUgImNvcmUuaCIKIAordTMyIHRpcGNfb3duX2FkZHIoc3RydWN0IG5ldCAqbmV0KQoreworCXN0cnVjdCB0aXBjX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHRpcGNfbmV0X2lkKTsKKworCXJldHVybiB0bi0+b3duX2FkZHI7Cit9CisKIC8qKgogICogaW5fb3duX2NsdXN0ZXIgLSB0ZXN0IGZvciBjbHVzdGVyIGluY2x1c2lvbjsgPDAuMC4wPiBhbHdheXMgbWF0Y2hlcwogICovCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9hZGRyLmggYi9uZXQvdGlwYy9hZGRyLmgKaW5kZXggYzcwMGMyZC4uN2JhNmQ1YyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvYWRkci5oCisrKyBiL25ldC90aXBjL2FkZHIuaApAQCAtNTUsNiArNTUsNyBAQAogCXJldHVybiBhZGRyICYgVElQQ19DTFVTVEVSX01BU0s7CiB9CiAKK3UzMiB0aXBjX293bl9hZGRyKHN0cnVjdCBuZXQgKm5ldCk7CiBpbnQgaW5fb3duX2NsdXN0ZXIoc3RydWN0IG5ldCAqbmV0LCB1MzIgYWRkcik7CiBpbnQgaW5fb3duX2NsdXN0ZXJfZXhhY3Qoc3RydWN0IG5ldCAqbmV0LCB1MzIgYWRkcik7CiBpbnQgaW5fb3duX25vZGUoc3RydWN0IG5ldCAqbmV0LCB1MzIgYWRkcik7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iY2FzdC5jIGIvbmV0L3RpcGMvYmNhc3QuYwppbmRleCAzZTQxNzA0Li5jNWNiZGNiIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iY2FzdC5jCisrKyBiL25ldC90aXBjL2JjYXN0LmMKQEAgLTYyLDIxICs2Miw4IEBACiBzdGF0aWMgdm9pZCB0aXBjX2JjbGlua191bmxvY2soc3RydWN0IG5ldCAqbmV0KQogewogCXN0cnVjdCB0aXBjX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHRpcGNfbmV0X2lkKTsKLQlzdHJ1Y3QgdGlwY19ub2RlICpub2RlID0gTlVMTDsKIAotCWlmIChsaWtlbHkoIXRuLT5iY2xpbmstPmZsYWdzKSkgewotCQlzcGluX3VubG9ja19iaCgmdG4tPmJjbGluay0+bG9jayk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAodG4tPmJjbGluay0+ZmxhZ3MgJiBUSVBDX0JDTElOS19SRVNFVCkgewotCQl0bi0+YmNsaW5rLT5mbGFncyAmPSB+VElQQ19CQ0xJTktfUkVTRVQ7Ci0JCW5vZGUgPSB0aXBjX2JjbGlua19yZXRyYW5zbWl0X3RvKG5ldCk7Ci0JfQogCXNwaW5fdW5sb2NrX2JoKCZ0bi0+YmNsaW5rLT5sb2NrKTsKLQotCWlmIChub2RlKQotCQl0aXBjX2xpbmtfcmVzZXRfYWxsKG5vZGUpOwogfQogCiB2b2lkIHRpcGNfYmNsaW5rX2lucHV0KHN0cnVjdCBuZXQgKm5ldCkKQEAgLTkxLDEzICs3OCw2IEBACiAJcmV0dXJuIE1BWF9QS1RfREVGQVVMVF9NQ0FTVDsKIH0KIAotdm9pZCB0aXBjX2JjbGlua19zZXRfZmxhZ3Moc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IHRpcGNfbmV0ICp0biA9IG5ldF9nZW5lcmljKG5ldCwgdGlwY19uZXRfaWQpOwotCi0JdG4tPmJjbGluay0+ZmxhZ3MgfD0gZmxhZ3M7Ci19Ci0KIHN0YXRpYyB1MzIgYmNidWZfYWNrcyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQogewogCXJldHVybiAodTMyKSh1bnNpZ25lZCBsb25nKVRJUENfU0tCX0NCKGJ1ZiktPmhhbmRsZTsKQEAgLTEzNSw5ICsxMTUsMTAgQEAKIHsKIAlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0aXBjX25ldF9pZCk7CiAJc3RydWN0IHRpcGNfbGluayAqYmNsID0gdG4tPmJjbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gc2tiX3BlZWsoJmJjbC0+YmFja2xvZ3EpOwogCi0JaWYgKGJjbC0+bmV4dF9vdXQpCi0JCWJjbC0+ZnNtX21zZ19jbnQgPSBtb2QoYnVmX3NlcW5vKGJjbC0+bmV4dF9vdXQpIC0gMSk7CisJaWYgKHNrYikKKwkJYmNsLT5mc21fbXNnX2NudCA9IG1vZChidWZfc2Vxbm8oc2tiKSAtIDEpOwogCWVsc2UKIAkJYmNsLT5mc21fbXNnX2NudCA9IG1vZChiY2wtPm5leHRfb3V0X25vIC0gMSk7CiB9CkBAIC0xNTUsNyArMTM2LDYgQEAKIAkJCQkJCXNlcW5vIDogbm9kZS0+YmNsaW5rLmxhc3Rfc2VudDsKIH0KIAotCiAvKioKICAqIHRpcGNfYmNsaW5rX3JldHJhbnNtaXRfdG8gLSBnZXQgbW9zdCByZWNlbnQgbm9kZSB0byByZXF1ZXN0IHJldHJhbnNtaXNzaW9uCiAgKgpAQCAtMTgwLDcgKzE2MCw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgdGlwY19saW5rICpiY2wgPSB0bi0+YmNsOwogCi0Jc2tiX3F1ZXVlX3dhbGsoJmJjbC0+b3V0cXVldWUsIHNrYikgeworCXNrYl9xdWV1ZV93YWxrKCZiY2wtPnRyYW5zbXEsIHNrYikgewogCQlpZiAobW9yZShidWZfc2Vxbm8oc2tiKSwgYWZ0ZXIpKSB7CiAJCQl0aXBjX2xpbmtfcmV0cmFuc21pdChiY2wsIHNrYiwgbW9kKHRvIC0gYWZ0ZXIpKTsKIAkJCWJyZWFrOwpAQCAtMjEwLDE0ICsxOTAsMTcgQEAKIHZvaWQgdGlwY19iY2xpbmtfYWNrbm93bGVkZ2Uoc3RydWN0IHRpcGNfbm9kZSAqbl9wdHIsIHUzMiBhY2tlZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOwotCXN0cnVjdCBza19idWZmICpuZXh0OwogCXVuc2lnbmVkIGludCByZWxlYXNlZCA9IDA7CiAJc3RydWN0IG5ldCAqbmV0ID0gbl9wdHItPm5ldDsKIAlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0aXBjX25ldF9pZCk7CiAKKwlpZiAodW5saWtlbHkoIW5fcHRyLT5iY2xpbmsucmVjdl9wZXJtaXR0ZWQpKQorCQlyZXR1cm47CisKIAl0aXBjX2JjbGlua19sb2NrKG5ldCk7CisKIAkvKiBCYWlsIG91dCBpZiB0eCBxdWV1ZSBpcyBlbXB0eSAobm8gY2xlYW4gdXAgaXMgcmVxdWlyZWQpICovCi0Jc2tiID0gc2tiX3BlZWsoJnRuLT5iY2wtPm91dHF1ZXVlKTsKKwlza2IgPSBza2JfcGVlaygmdG4tPmJjbC0+dHJhbnNtcSk7CiAJaWYgKCFza2IpCiAJCWdvdG8gZXhpdDsKIApAQCAtMjQ0LDI3ICsyMjcsMTkgQEAKIAl9CiAKIAkvKiBTa2lwIG92ZXIgcGFja2V0cyB0aGF0IG5vZGUgaGFzIHByZXZpb3VzbHkgYWNrbm93bGVkZ2VkICovCi0Jc2tiX3F1ZXVlX3dhbGsoJnRuLT5iY2wtPm91dHF1ZXVlLCBza2IpIHsKKwlza2JfcXVldWVfd2FsaygmdG4tPmJjbC0+dHJhbnNtcSwgc2tiKSB7CiAJCWlmIChtb3JlKGJ1Zl9zZXFubyhza2IpLCBuX3B0ci0+YmNsaW5rLmFja2VkKSkKIAkJCWJyZWFrOwogCX0KIAogCS8qIFVwZGF0ZSBwYWNrZXRzIHRoYXQgbm9kZSBpcyBub3cgYWNrbm93bGVkZ2luZyAqLwotCXNrYl9xdWV1ZV93YWxrX2Zyb21fc2FmZSgmdG4tPmJjbC0+b3V0cXVldWUsIHNrYiwgdG1wKSB7CisJc2tiX3F1ZXVlX3dhbGtfZnJvbV9zYWZlKCZ0bi0+YmNsLT50cmFuc21xLCBza2IsIHRtcCkgewogCQlpZiAobW9yZShidWZfc2Vxbm8oc2tiKSwgYWNrZWQpKQogCQkJYnJlYWs7Ci0KLQkJbmV4dCA9IHRpcGNfc2tiX3F1ZXVlX25leHQoJnRuLT5iY2wtPm91dHF1ZXVlLCBza2IpOwotCQlpZiAoc2tiICE9IHRuLT5iY2wtPm5leHRfb3V0KSB7Ci0JCQliY2J1Zl9kZWNyX2Fja3Moc2tiKTsKLQkJfSBlbHNlIHsKLQkJCWJjYnVmX3NldF9hY2tzKHNrYiwgMCk7Ci0JCQl0bi0+YmNsLT5uZXh0X291dCA9IG5leHQ7Ci0JCQliY2xpbmtfc2V0X2xhc3Rfc2VudChuZXQpOwotCQl9Ci0KKwkJYmNidWZfZGVjcl9hY2tzKHNrYik7CisJCWJjbGlua19zZXRfbGFzdF9zZW50KG5ldCk7CiAJCWlmIChiY2J1Zl9hY2tzKHNrYikgPT0gMCkgewotCQkJX19za2JfdW5saW5rKHNrYiwgJnRuLT5iY2wtPm91dHF1ZXVlKTsKKwkJCV9fc2tiX3VubGluayhza2IsICZ0bi0+YmNsLT50cmFuc21xKTsKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJcmVsZWFzZWQgPSAxOwogCQl9CkBAIC0yNzIsNyArMjQ3LDcgQEAKIAluX3B0ci0+YmNsaW5rLmFja2VkID0gYWNrZWQ7CiAKIAkvKiBUcnkgcmVzb2x2aW5nIGJyb2FkY2FzdCBsaW5rIGNvbmdlc3Rpb24sIGlmIG5lY2Vzc2FyeSAqLwotCWlmICh1bmxpa2VseSh0bi0+YmNsLT5uZXh0X291dCkpIHsKKwlpZiAodW5saWtlbHkoc2tiX3BlZWsoJnRuLT5iY2wtPmJhY2tsb2dxKSkpIHsKIAkJdGlwY19saW5rX3B1c2hfcGFja2V0cyh0bi0+YmNsKTsKIAkJYmNsaW5rX3NldF9sYXN0X3NlbnQobmV0KTsKIAl9CkBAIC0zMTksNyArMjk0LDcgQEAKIAlidWYgPSB0aXBjX2J1Zl9hY3F1aXJlKElOVF9IX1NJWkUpOwogCWlmIChidWYpIHsKIAkJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7Ci0JCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfcGVlaygmbl9wdHItPmJjbGluay5kZWZlcnJlZF9xdWV1ZSk7CisJCXN0cnVjdCBza19idWZmICpza2IgPSBza2JfcGVlaygmbl9wdHItPmJjbGluay5kZWZlcmRxKTsKIAkJdTMyIHRvID0gc2tiID8gYnVmX3NlcW5vKHNrYikgLSAxIDogbl9wdHItPmJjbGluay5sYXN0X3NlbnQ7CiAKIAkJdGlwY19tc2dfaW5pdCh0bi0+b3duX2FkZHIsIG1zZywgQkNBU1RfUFJPVE9DT0wsIFNUQVRFX01TRywKQEAgLTM1NCwxMyArMzI5LDEyIEBACiAJCXJldHVybjsKIAogCXRpcGNfbm9kZV9sb2NrKG5fcHRyKTsKLQogCWlmIChuX3B0ci0+YmNsaW5rLnJlY3ZfcGVybWl0dGVkICYmCiAJICAgIChuX3B0ci0+YmNsaW5rLmxhc3RfaW4gIT0gbl9wdHItPmJjbGluay5sYXN0X3NlbnQpICYmCiAJICAgIChuX3B0ci0+YmNsaW5rLmxhc3RfaW4gPT0gbXNnX2JjZ2FwX2FmdGVyKG1zZykpKQogCQluX3B0ci0+YmNsaW5rLm9vc19zdGF0ZSA9IDI7Ci0KIAl0aXBjX25vZGVfdW5sb2NrKG5fcHRyKTsKKwl0aXBjX25vZGVfcHV0KG5fcHRyKTsKIH0KIAogLyogdGlwY19iY2xpbmtfeG1pdCAtIGRlbGl2ZXIgYnVmZmVyIGNoYWluIHRvIGFsbCBub2RlcyBpbiBjbHVzdGVyCkBAIC0zODcsMTQgKzM2MSwxMyBAQAogCQlfX3NrYl9xdWV1ZV9wdXJnZShsaXN0KTsKIAkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CiAJfQotCiAJLyogQnJvYWRjYXN0IHRvIGFsbCBub2RlcyAqLwogCWlmIChsaWtlbHkoYmNsaW5rKSkgewogCQl0aXBjX2JjbGlua19sb2NrKG5ldCk7CiAJCWlmIChsaWtlbHkoYmNsaW5rLT5iY2FzdF9ub2Rlcy5jb3VudCkpIHsKIAkJCXJjID0gX190aXBjX2xpbmtfeG1pdChuZXQsIGJjbCwgbGlzdCk7CiAJCQlpZiAobGlrZWx5KCFyYykpIHsKLQkJCQl1MzIgbGVuID0gc2tiX3F1ZXVlX2xlbigmYmNsLT5vdXRxdWV1ZSk7CisJCQkJdTMyIGxlbiA9IHNrYl9xdWV1ZV9sZW4oJmJjbC0+dHJhbnNtcSk7CiAKIAkJCQliY2xpbmtfc2V0X2xhc3Rfc2VudChuZXQpOwogCQkJCWJjbC0+c3RhdHMucXVldWVfc3pfY291bnRzKys7CkBAIC00NDAsNyArNDEzLDcgQEAKIAkgKi8KIAlpZiAoKChzZXFubyAtIHRuLT5vd25fYWRkcikgJSBUSVBDX01JTl9MSU5LX1dJTikgPT0gMCkgewogCQl0aXBjX2xpbmtfcHJvdG9feG1pdChub2RlLT5hY3RpdmVfbGlua3Nbbm9kZS0+YWRkciAmIDFdLAotCQkJCSAgICAgU1RBVEVfTVNHLCAwLCAwLCAwLCAwLCAwKTsKKwkJCQkgICAgIFNUQVRFX01TRywgMCwgMCwgMCwgMCk7CiAJCXRuLT5iY2wtPnN0YXRzLnNlbnRfYWNrcysrOwogCX0KIH0KQEAgLTQ4MSwxNyArNDU0LDE4IEBACiAJCQlnb3RvIHVubG9jazsKIAkJaWYgKG1zZ19kZXN0bm9kZShtc2cpID09IHRuLT5vd25fYWRkcikgewogCQkJdGlwY19iY2xpbmtfYWNrbm93bGVkZ2Uobm9kZSwgbXNnX2JjYXN0X2Fjayhtc2cpKTsKLQkJCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CiAJCQl0aXBjX2JjbGlua19sb2NrKG5ldCk7CiAJCQliY2wtPnN0YXRzLnJlY3ZfbmFja3MrKzsKIAkJCXRuLT5iY2xpbmstPnJldHJhbnNtaXRfdG8gPSBub2RlOwogCQkJYmNsaW5rX3JldHJhbnNtaXRfcGt0KHRuLCBtc2dfYmNnYXBfYWZ0ZXIobXNnKSwKIAkJCQkJICAgICAgbXNnX2JjZ2FwX3RvKG1zZykpOwogCQkJdGlwY19iY2xpbmtfdW5sb2NrKG5ldCk7CisJCQl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOwogCQl9IGVsc2UgewogCQkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKIAkJCWJjbGlua19wZWVrX25hY2sobmV0LCBtc2cpOwogCQl9CisJCXRpcGNfbm9kZV9wdXQobm9kZSk7CiAJCWdvdG8gZXhpdDsKIAl9CiAKQEAgLTUyOCwxMSArNTAyLDEzIEBACiAJCQl0aXBjX2JjbGlua191bmxvY2sobmV0KTsKIAkJCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CiAJCX0gZWxzZSBpZiAobXNnX3VzZXIobXNnKSA9PSBNU0dfRlJBR01FTlRFUikgewotCQkJdGlwY19idWZfYXBwZW5kKCZub2RlLT5iY2xpbmsucmVhc21fYnVmLCAmYnVmKTsKLQkJCWlmICh1bmxpa2VseSghYnVmICYmICFub2RlLT5iY2xpbmsucmVhc21fYnVmKSkKLQkJCQlnb3RvIHVubG9jazsKIAkJCXRpcGNfYmNsaW5rX2xvY2sobmV0KTsKIAkJCWJjbGlua19hY2NlcHRfcGt0KG5vZGUsIHNlcW5vKTsKKwkJCXRpcGNfYnVmX2FwcGVuZCgmbm9kZS0+YmNsaW5rLnJlYXNtX2J1ZiwgJmJ1Zik7CisJCQlpZiAodW5saWtlbHkoIWJ1ZiAmJiAhbm9kZS0+YmNsaW5rLnJlYXNtX2J1ZikpIHsKKwkJCQl0aXBjX2JjbGlua191bmxvY2sobmV0KTsKKwkJCQlnb3RvIHVubG9jazsKKwkJCX0KIAkJCWJjbC0+c3RhdHMucmVjdl9mcmFnbWVudHMrKzsKIAkJCWlmIChidWYpIHsKIAkJCQliY2wtPnN0YXRzLnJlY3ZfZnJhZ21lbnRlZCsrOwpAQCAtNTU5LDI1ICs1MzUsMjUgQEAKIAkJaWYgKG5vZGUtPmJjbGluay5sYXN0X2luID09IG5vZGUtPmJjbGluay5sYXN0X3NlbnQpCiAJCQlnb3RvIHVubG9jazsKIAotCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZub2RlLT5iY2xpbmsuZGVmZXJyZWRfcXVldWUpKSB7CisJCWlmIChza2JfcXVldWVfZW1wdHkoJm5vZGUtPmJjbGluay5kZWZlcmRxKSkgewogCQkJbm9kZS0+YmNsaW5rLm9vc19zdGF0ZSA9IDE7CiAJCQlnb3RvIHVubG9jazsKIAkJfQogCi0JCW1zZyA9IGJ1Zl9tc2coc2tiX3BlZWsoJm5vZGUtPmJjbGluay5kZWZlcnJlZF9xdWV1ZSkpOworCQltc2cgPSBidWZfbXNnKHNrYl9wZWVrKCZub2RlLT5iY2xpbmsuZGVmZXJkcSkpOwogCQlzZXFubyA9IG1zZ19zZXFubyhtc2cpOwogCQluZXh0X2luID0gbW9kKG5leHRfaW4gKyAxKTsKIAkJaWYgKHNlcW5vICE9IG5leHRfaW4pCiAJCQlnb3RvIHVubG9jazsKIAogCQkvKiBUYWtlIGluLXNlcXVlbmNlIG1lc3NhZ2UgZnJvbSBkZWZlcnJlZCBxdWV1ZSAmIGRlbGl2ZXIgaXQgKi8KLQkJYnVmID0gX19za2JfZGVxdWV1ZSgmbm9kZS0+YmNsaW5rLmRlZmVycmVkX3F1ZXVlKTsKKwkJYnVmID0gX19za2JfZGVxdWV1ZSgmbm9kZS0+YmNsaW5rLmRlZmVyZHEpOwogCQlnb3RvIHJlY2VpdmU7CiAJfQogCiAJLyogSGFuZGxlIG91dC1vZi1zZXF1ZW5jZSBicm9hZGNhc3QgbWVzc2FnZSAqLwogCWlmIChsZXNzKG5leHRfaW4sIHNlcW5vKSkgewotCQlkZWZlcnJlZCA9IHRpcGNfbGlua19kZWZlcl9wa3QoJm5vZGUtPmJjbGluay5kZWZlcnJlZF9xdWV1ZSwKKwkJZGVmZXJyZWQgPSB0aXBjX2xpbmtfZGVmZXJfcGt0KCZub2RlLT5iY2xpbmsuZGVmZXJkcSwKIAkJCQkJICAgICAgIGJ1Zik7CiAJCWJjbGlua191cGRhdGVfbGFzdF9zZW50KG5vZGUsIHNlcW5vKTsKIAkJYnVmID0gTlVMTDsKQEAgLTU5NCw2ICs1NzAsNyBAQAogCiB1bmxvY2s6CiAJdGlwY19ub2RlX3VubG9jayhub2RlKTsKKwl0aXBjX25vZGVfcHV0KG5vZGUpOwogZXhpdDoKIAlrZnJlZV9za2IoYnVmKTsKIH0KQEAgLTYzNCw3ICs2MTEsNiBAQAogCQltc2dfc2V0X25vbl9zZXEobXNnLCAxKTsKIAkJbXNnX3NldF9tY19uZXRpZChtc2csIHRuLT5uZXRfaWQpOwogCQl0bi0+YmNsLT5zdGF0cy5zZW50X2luZm8rKzsKLQogCQlpZiAoV0FSTl9PTighYmNsaW5rLT5iY2FzdF9ub2Rlcy5jb3VudCkpIHsKIAkJCWR1bXBfc3RhY2soKTsKIAkJCXJldHVybiAwOwpAQCAtODM1LDcgKzgxMSw3IEBACiAJcHJvcCA9IG5sYV9uZXN0X3N0YXJ0KG1zZy0+c2tiLCBUSVBDX05MQV9MSU5LX1BST1ApOwogCWlmICghcHJvcCkKIAkJZ290byBhdHRyX21zZ19mdWxsOwotCWlmIChubGFfcHV0X3UzMihtc2ctPnNrYiwgVElQQ19OTEFfUFJPUF9XSU4sIGJjbC0+cXVldWVfbGltaXRbMF0pKQorCWlmIChubGFfcHV0X3UzMihtc2ctPnNrYiwgVElQQ19OTEFfUFJPUF9XSU4sIGJjbC0+d2luZG93KSkKIAkJZ290byBwcm9wX21zZ19mdWxsOwogCW5sYV9uZXN0X2VuZChtc2ctPnNrYiwgcHJvcCk7CiAKQEAgLTkxMyw4ICs4ODksOSBAQAogCXNwcmludGYoYmNiZWFyZXItPm1lZGlhLm5hbWUsICJ0aXBjLWJyb2FkY2FzdCIpOwogCiAJc3Bpbl9sb2NrX2luaXQoJmJjbGluay0+bG9jayk7Ci0JX19za2JfcXVldWVfaGVhZF9pbml0KCZiY2wtPm91dHF1ZXVlKTsKLQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJmJjbC0+ZGVmZXJyZWRfcXVldWUpOworCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYmNsLT50cmFuc21xKTsKKwlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJmJjbC0+YmFja2xvZ3EpOworCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYmNsLT5kZWZlcmRxKTsKIAlza2JfcXVldWVfaGVhZF9pbml0KCZiY2wtPndha2V1cHEpOwogCWJjbC0+bmV4dF9vdXRfbm8gPSAxOwogCXNwaW5fbG9ja19pbml0KCZiY2xpbmstPm5vZGUubG9jayk7CkBAIC05MjIsNyArODk5LDcgQEAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZiY2xpbmstPmlucHV0cSk7CiAJYmNsLT5vd25lciA9ICZiY2xpbmstPm5vZGU7CiAJYmNsLT5vd25lci0+bmV0ID0gbmV0OwotCWJjbC0+bWF4X3BrdCA9IE1BWF9QS1RfREVGQVVMVF9NQ0FTVDsKKwliY2wtPm10dSA9IE1BWF9QS1RfREVGQVVMVF9NQ0FTVDsKIAl0aXBjX2xpbmtfc2V0X3F1ZXVlX2xpbWl0cyhiY2wsIEJDTElOS19XSU5fREVGQVVMVCk7CiAJYmNsLT5iZWFyZXJfaWQgPSBNQVhfQkVBUkVSUzsKIAlyY3VfYXNzaWduX3BvaW50ZXIodG4tPmJlYXJlcl9saXN0W01BWF9CRUFSRVJTXSwgJmJjYmVhcmVyLT5iZWFyZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmNhc3QuaCBiL25ldC90aXBjL2JjYXN0LmgKaW5kZXggNDNmMzk3Zi4uNGJkYzEyMiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvYmNhc3QuaAorKysgYi9uZXQvdGlwYy9iY2FzdC5oCkBAIC01NSw3ICs1NSw2IEBACiAJc3RydWN0IHRpcGNfYmVhcmVyICpzZWNvbmRhcnk7CiB9OwogCi0jZGVmaW5lIFRJUENfQkNMSU5LX1JFU0VUCTEKICNkZWZpbmUJQkNCRUFSRVIJCU1BWF9CRUFSRVJTCiAKIC8qKgpAQCAtODYsNyArODUsNiBAQAogICogQGxvY2s6IHNwaW5sb2NrIGdvdmVybmluZyBhY2Nlc3MgdG8gc3RydWN0dXJlCiAgKiBAbGluazogKG5vbi1zdGFuZGFyZCkgYnJvYWRjYXN0IGxpbmsgc3RydWN0dXJlCiAgKiBAbm9kZTogKG5vbi1zdGFuZGFyZCkgbm9kZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGInY2FzdCBsaW5rJ3MgcGVlciBub2RlCi0gKiBAZmxhZ3M6IHJlcHJlc2VudCBiY2xpbmsgc3RhdGVzCiAgKiBAYmNhc3Rfbm9kZXM6IG1hcCBvZiBicm9hZGNhc3QtY2FwYWJsZSBub2RlcwogICogQHJldHJhbnNtaXRfdG86IG5vZGUgdGhhdCBtb3N0IHJlY2VudGx5IHJlcXVlc3RlZCBhIHJldHJhbnNtaXQKICAqCkBAIC05Niw3ICs5NCw2IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCB0aXBjX2xpbmsgbGluazsKIAlzdHJ1Y3QgdGlwY19ub2RlIG5vZGU7Ci0JdW5zaWduZWQgaW50IGZsYWdzOwogCXN0cnVjdCBza19idWZmX2hlYWQgYXJydnE7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBpbnB1dHE7CiAJc3RydWN0IHRpcGNfbm9kZV9tYXAgYmNhc3Rfbm9kZXM7CkBAIC0xMTcsNyArMTE0LDYgQEAKIAogaW50IHRpcGNfYmNsaW5rX2luaXQoc3RydWN0IG5ldCAqbmV0KTsKIHZvaWQgdGlwY19iY2xpbmtfc3RvcChzdHJ1Y3QgbmV0ICpuZXQpOwotdm9pZCB0aXBjX2JjbGlua19zZXRfZmxhZ3Moc3RydWN0IG5ldCAqdG4sIHVuc2lnbmVkIGludCBmbGFncyk7CiB2b2lkIHRpcGNfYmNsaW5rX2FkZF9ub2RlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGFkZHIpOwogdm9pZCB0aXBjX2JjbGlua19yZW1vdmVfbm9kZShzdHJ1Y3QgbmV0ICpuZXQsIHUzMiBhZGRyKTsKIHN0cnVjdCB0aXBjX25vZGUgKnRpcGNfYmNsaW5rX3JldHJhbnNtaXRfdG8oc3RydWN0IG5ldCAqdG4pOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmVhcmVyLmMgYi9uZXQvdGlwYy9iZWFyZXIuYwppbmRleCA0ODg1MmMyLi4zNjEzZTcyIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iZWFyZXIuYworKysgYi9uZXQvdGlwYy9iZWFyZXIuYwpAQCAtNDgsNiArNDgsOSBAQAogI2lmZGVmIENPTkZJR19USVBDX01FRElBX0lCCiAJJmliX21lZGlhX2luZm8sCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfVElQQ19NRURJQV9VRFAKKwkmdWRwX21lZGlhX2luZm8sCisjZW5kaWYKIAlOVUxMCiB9OwogCkBAIC0yMTYsNyArMjE5LDggQEAKICAqIHRpcGNfZW5hYmxlX2JlYXJlciAtIGVuYWJsZSBiZWFyZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZQogICovCiBzdGF0aWMgaW50IHRpcGNfZW5hYmxlX2JlYXJlcihzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkgICAgICB1MzIgZGlzY19kb21haW4sIHUzMiBwcmlvcml0eSkKKwkJCSAgICAgIHUzMiBkaXNjX2RvbWFpbiwgdTMyIHByaW9yaXR5LAorCQkJICAgICAgc3RydWN0IG5sYXR0ciAqYXR0cltdKQogewogCXN0cnVjdCB0aXBjX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHRpcGNfbmV0X2lkKTsKIAlzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyOwpAQCAtMzA0LDcgKzMwOCw3IEBACiAKIAlzdHJjcHkoYl9wdHItPm5hbWUsIG5hbWUpOwogCWJfcHRyLT5tZWRpYSA9IG1fcHRyOwotCXJlcyA9IG1fcHRyLT5lbmFibGVfbWVkaWEobmV0LCBiX3B0cik7CisJcmVzID0gbV9wdHItPmVuYWJsZV9tZWRpYShuZXQsIGJfcHRyLCBhdHRyKTsKIAlpZiAocmVzKSB7CiAJCXByX3dhcm4oIkJlYXJlciA8JXM+IHJlamVjdGVkLCBlbmFibGUgZmFpbHVyZSAoJWQpXG4iLAogCQkJbmFtZSwgLXJlcyk7CkBAIC0zNzIsNyArMzc2LDggQEAKIAlrZnJlZV9yY3UoYl9wdHIsIHJjdSk7CiB9CiAKLWludCB0aXBjX2VuYWJsZV9sMl9tZWRpYShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2JlYXJlciAqYikKK2ludCB0aXBjX2VuYWJsZV9sMl9tZWRpYShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2JlYXJlciAqYiwKKwkJCSBzdHJ1Y3QgbmxhdHRyICphdHRyW10pCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAljaGFyICpkcml2ZXJfbmFtZSA9IHN0cmNocigoY29uc3QgY2hhciAqKWItPm5hbWUsICc6JykgKyAxOwpAQCAtNzkxLDcgKzc5Niw3IEBACiAJfQogCiAJcnRubF9sb2NrKCk7Ci0JZXJyID0gdGlwY19lbmFibGVfYmVhcmVyKG5ldCwgYmVhcmVyLCBkb21haW4sIHByaW8pOworCWVyciA9IHRpcGNfZW5hYmxlX2JlYXJlcihuZXQsIGJlYXJlciwgZG9tYWluLCBwcmlvLCBhdHRycyk7CiAJaWYgKGVycikgewogCQlydG5sX3VubG9jaygpOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmVhcmVyLmggYi9uZXQvdGlwYy9iZWFyZXIuaAppbmRleCA2YjE3Nzk1Li41Y2FkMjQzIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iZWFyZXIuaAorKysgYi9uZXQvdGlwYy9iZWFyZXIuaApAQCAtNDEsNyArNDEsNyBAQAogI2luY2x1ZGUgPG5ldC9nZW5ldGxpbmsuaD4KIAogI2RlZmluZSBNQVhfQkVBUkVSUwkyCi0jZGVmaW5lIE1BWF9NRURJQQkyCisjZGVmaW5lIE1BWF9NRURJQQkzCiAjZGVmaW5lIE1BWF9OT0RFUwk0MDk2CiAjZGVmaW5lIFdTSVpFCQkzMgogCkBAIC01MCwxNCArNTAsMTYgQEAKICAqIC0gdGhlIGZpZWxkJ3MgYWN0dWFsIGNvbnRlbnQgYW5kIGxlbmd0aCBpcyBkZWZpbmVkIHBlciBtZWRpYQogICogLSByZW1haW5pbmcgdW51c2VkIGJ5dGVzIGluIHRoZSBmaWVsZCBhcmUgc2V0IHRvIHplcm8KICAqLwotI2RlZmluZSBUSVBDX01FRElBX0FERFJfU0laRQkzMgorI2RlZmluZSBUSVBDX01FRElBX0lORk9fU0laRQkzMgogI2RlZmluZSBUSVBDX01FRElBX1RZUEVfT0ZGU0VUCTMKKyNkZWZpbmUgVElQQ19NRURJQV9BRERSX09GRlNFVAk0CiAKIC8qCiAgKiBJZGVudGlmaWVycyBvZiBzdXBwb3J0ZWQgVElQQyBtZWRpYSB0eXBlcwogICovCiAjZGVmaW5lIFRJUENfTUVESUFfVFlQRV9FVEgJMQogI2RlZmluZSBUSVBDX01FRElBX1RZUEVfSUIJMgorI2RlZmluZSBUSVBDX01FRElBX1RZUEVfVURQCTMKIAogLyoqCiAgKiBzdHJ1Y3QgdGlwY19ub2RlX21hcCAtIHNldCBvZiBub2RlIGlkZW50aWZpZXJzCkBAIC03Niw3ICs3OCw3IEBACiAgKiBAYnJvYWRjYXN0OiBub24temVybyBpZiBhZGRyZXNzIGlzIGEgYnJvYWRjYXN0IGFkZHJlc3MKICAqLwogc3RydWN0IHRpcGNfbWVkaWFfYWRkciB7Ci0JdTggdmFsdWVbVElQQ19NRURJQV9BRERSX1NJWkVdOworCXU4IHZhbHVlW1RJUENfTUVESUFfSU5GT19TSVpFXTsKIAl1OCBtZWRpYV9pZDsKIAl1OCBicm9hZGNhc3Q7CiB9OwpAQCAtMTAzLDcgKzEwNSw4IEBACiAJaW50ICgqc2VuZF9tc2cpKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKIAkJCXN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsCiAJCQlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICpkZXN0KTsKLQlpbnQgKCplbmFibGVfbWVkaWEpKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cik7CisJaW50ICgqZW5hYmxlX21lZGlhKShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsCisJCQkgICAgc3RydWN0IG5sYXR0ciAqYXR0cltdKTsKIAl2b2lkICgqZGlzYWJsZV9tZWRpYSkoc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cik7CiAJaW50ICgqYWRkcjJzdHIpKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmFkZHIsCiAJCQljaGFyICpzdHJidWYsCkBAIC0xODIsNiArMTg1LDkgQEAKICNpZmRlZiBDT05GSUdfVElQQ19NRURJQV9JQgogZXh0ZXJuIHN0cnVjdCB0aXBjX21lZGlhIGliX21lZGlhX2luZm87CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfVElQQ19NRURJQV9VRFAKK2V4dGVybiBzdHJ1Y3QgdGlwY19tZWRpYSB1ZHBfbWVkaWFfaW5mbzsKKyNlbmRpZgogCiBpbnQgdGlwY19ubF9iZWFyZXJfZGlzYWJsZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKTsKIGludCB0aXBjX25sX2JlYXJlcl9lbmFibGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbyk7CkBAIC0xOTYsNyArMjAyLDggQEAKIGludCB0aXBjX21lZGlhX3NldF9wcmlvcml0eShjb25zdCBjaGFyICpuYW1lLCB1MzIgbmV3X3ZhbHVlKTsKIGludCB0aXBjX21lZGlhX3NldF93aW5kb3coY29uc3QgY2hhciAqbmFtZSwgdTMyIG5ld192YWx1ZSk7CiB2b2lkIHRpcGNfbWVkaWFfYWRkcl9wcmludGYoY2hhciAqYnVmLCBpbnQgbGVuLCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphKTsKLWludCB0aXBjX2VuYWJsZV9sMl9tZWRpYShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2JlYXJlciAqYik7CitpbnQgdGlwY19lbmFibGVfbDJfbWVkaWEoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIsCisJCQkgc3RydWN0IG5sYXR0ciAqYXR0cnNbXSk7CiB2b2lkIHRpcGNfZGlzYWJsZV9sMl9tZWRpYShzdHJ1Y3QgdGlwY19iZWFyZXIgKmIpOwogaW50IHRpcGNfbDJfc2VuZF9tc2coc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAogCQkgICAgIHN0cnVjdCB0aXBjX2JlYXJlciAqYiwgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jb3JlLmMgYi9uZXQvdGlwYy9jb3JlLmMKaW5kZXggOTM1MjA1ZS4uYmUxYzlmYSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvY29yZS5jCisrKyBiL25ldC90aXBjL2NvcmUuYwpAQCAtMTUyLDExICsxNTIsMTEgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCB0aXBjX2V4aXQodm9pZCkKIHsKIAl0aXBjX2JlYXJlcl9jbGVhbnVwKCk7CisJdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZ0aXBjX25ldF9vcHMpOwogCXRpcGNfbmV0bGlua19zdG9wKCk7CiAJdGlwY19uZXRsaW5rX2NvbXBhdF9zdG9wKCk7CiAJdGlwY19zb2NrZXRfc3RvcCgpOwogCXRpcGNfdW5yZWdpc3Rlcl9zeXNjdGwoKTsKLQl1bnJlZ2lzdGVyX3Blcm5ldF9zdWJzeXMoJnRpcGNfbmV0X29wcyk7CiAKIAlwcl9pbmZvKCJEZWFjdGl2YXRlZFxuIik7CiB9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5jIGIvbmV0L3RpcGMvZGlzY292ZXIuYwppbmRleCBmZWVmMzc1Li45NjdlMjkyIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9kaXNjb3Zlci5jCisrKyBiL25ldC90aXBjL2Rpc2NvdmVyLmMKQEAgLTg2LDkgKzg2LDEwIEBACiAKIAltc2cgPSBidWZfbXNnKGJ1Zik7CiAJdGlwY19tc2dfaW5pdCh0bi0+b3duX2FkZHIsIG1zZywgTElOS19DT05GSUcsIHR5cGUsCi0JCSAgICAgIElOVF9IX1NJWkUsIGRlc3RfZG9tYWluKTsKKwkJICAgICAgTUFYX0hfU0laRSwgZGVzdF9kb21haW4pOwogCW1zZ19zZXRfbm9uX3NlcShtc2csIDEpOwogCW1zZ19zZXRfbm9kZV9zaWcobXNnLCB0bi0+cmFuZG9tKTsKKwltc2dfc2V0X25vZGVfY2FwYWJpbGl0aWVzKG1zZywgMCk7CiAJbXNnX3NldF9kZXN0X2RvbWFpbihtc2csIGRlc3RfZG9tYWluKTsKIAltc2dfc2V0X2JjX25ldGlkKG1zZywgdG4tPm5ldF9pZCk7CiAJYl9wdHItPm1lZGlhLT5hZGRyMm1zZyhtc2dfbWVkaWFfYWRkcihtc2cpLCAmYl9wdHItPmFkZHIpOwpAQCAtMTMzLDYgKzEzNCw3IEBACiAJdTMyIG5ldF9pZCA9IG1zZ19iY19uZXRpZChtc2cpOwogCXUzMiBtdHlwID0gbXNnX3R5cGUobXNnKTsKIAl1MzIgc2lnbmF0dXJlID0gbXNnX25vZGVfc2lnKG1zZyk7CisJdTE2IGNhcHMgPSBtc2dfbm9kZV9jYXBhYmlsaXRpZXMobXNnKTsKIAlib29sIGFkZHJfbWF0Y2ggPSBmYWxzZTsKIAlib29sIHNpZ25fbWF0Y2ggPSBmYWxzZTsKIAlib29sIGxpbmtfdXAgPSBmYWxzZTsKQEAgLTE2Nyw2ICsxNjksNyBAQAogCWlmICghbm9kZSkKIAkJcmV0dXJuOwogCXRpcGNfbm9kZV9sb2NrKG5vZGUpOworCW5vZGUtPmNhcGFiaWxpdGllcyA9IGNhcHM7CiAJbGluayA9IG5vZGUtPmxpbmtzW2JlYXJlci0+aWRlbnRpdHldOwogCiAJLyogUHJlcGFyZSB0byB2YWxpZGF0ZSByZXF1ZXN0aW5nIG5vZGUncyBzaWduYXR1cmUgYW5kIG1lZGlhIGFkZHJlc3MgKi8KQEAgLTI0OSw3ICsyNTIsNyBAQAogCiAJLyogU2VuZCByZXNwb25zZSwgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKHJlc3BvbmQgJiYgKG10eXAgPT0gRFNDX1JFUV9NU0cpKSB7Ci0JCXJidWYgPSB0aXBjX2J1Zl9hY3F1aXJlKElOVF9IX1NJWkUpOworCQlyYnVmID0gdGlwY19idWZfYWNxdWlyZShNQVhfSF9TSVpFKTsKIAkJaWYgKHJidWYpIHsKIAkJCXRpcGNfZGlzY19pbml0X21zZyhuZXQsIHJidWYsIERTQ19SRVNQX01TRywgYmVhcmVyKTsKIAkJCXRpcGNfYmVhcmVyX3NlbmQobmV0LCBiZWFyZXItPmlkZW50aXR5LCByYnVmLCAmbWFkZHIpOwpAQCAtMjU3LDYgKzI2MCw3IEBACiAJCX0KIAl9CiAJdGlwY19ub2RlX3VubG9jayhub2RlKTsKKwl0aXBjX25vZGVfcHV0KG5vZGUpOwogfQogCiAvKioKQEAgLTM1OSw4ICszNjMsNyBAQAogCXJlcSA9IGttYWxsb2Moc2l6ZW9mKCpyZXEpLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXJlcSkKIAkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXEtPmJ1ZiA9IHRpcGNfYnVmX2FjcXVpcmUoSU5UX0hfU0laRSk7CisJcmVxLT5idWYgPSB0aXBjX2J1Zl9hY3F1aXJlKE1BWF9IX1NJWkUpOwogCWlmICghcmVxLT5idWYpIHsKIAkJa2ZyZWUocmVxKTsKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ldGhfbWVkaWEuYyBiL25ldC90aXBjL2V0aF9tZWRpYS5jCmluZGV4IDVlMTQyNmYuLmY2OWEyZmQgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2V0aF9tZWRpYS5jCisrKyBiL25ldC90aXBjL2V0aF9tZWRpYS5jCkBAIC0zNyw4ICszNyw2IEBACiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgImJlYXJlci5oIgogCi0jZGVmaW5lIEVUSF9BRERSX09GRlNFVCAgNCAgLyogTUFDIGFkZHIgcG9zaXRpb24gaW5zaWRlIGFkZHJlc3MgZmllbGQgKi8KLQogLyogQ29udmVydCBFdGhlcm5ldCBhZGRyZXNzIChtZWRpYSBhZGRyZXNzIGZvcm1hdCkgdG8gc3RyaW5nICovCiBzdGF0aWMgaW50IHRpcGNfZXRoX2FkZHIyc3RyKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmFkZHIsCiAJCQkgICAgIGNoYXIgKnN0cmJ1ZiwgaW50IGJ1ZnN6KQpAQCAtNTMsOSArNTEsOSBAQAogLyogQ29udmVydCBmcm9tIG1lZGlhIGFkZHJlc3MgZm9ybWF0IHRvIGRpc2NvdmVyeSBtZXNzYWdlIGFkZHIgZm9ybWF0ICovCiBzdGF0aWMgaW50IHRpcGNfZXRoX2FkZHIybXNnKGNoYXIgKm1zZywgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYWRkcikKIHsKLQltZW1zZXQobXNnLCAwLCBUSVBDX01FRElBX0FERFJfU0laRSk7CisJbWVtc2V0KG1zZywgMCwgVElQQ19NRURJQV9JTkZPX1NJWkUpOwogCW1zZ1tUSVBDX01FRElBX1RZUEVfT0ZGU0VUXSA9IFRJUENfTUVESUFfVFlQRV9FVEg7Ci0JbWVtY3B5KG1zZyArIEVUSF9BRERSX09GRlNFVCwgYWRkci0+dmFsdWUsIEVUSF9BTEVOKTsKKwltZW1jcHkobXNnICsgVElQQ19NRURJQV9BRERSX09GRlNFVCwgYWRkci0+dmFsdWUsIEVUSF9BTEVOKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzksNyArNzcsNyBAQAogCQkJICAgICBjaGFyICptc2cpCiB7CiAJLyogU2tpcCBwYXN0IHByZWFtYmxlOiAqLwotCW1zZyArPSBFVEhfQUREUl9PRkZTRVQ7CisJbXNnICs9IFRJUENfTUVESUFfQUREUl9PRkZTRVQ7CiAJcmV0dXJuIHRpcGNfZXRoX3JhdzJhZGRyKGIsIGFkZHIsIG1zZyk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC90aXBjL2liX21lZGlhLmMgYi9uZXQvdGlwYy9pYl9tZWRpYS5jCmluZGV4IDg1MjJlZWYuLmU4YzE2NzEgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2liX21lZGlhLmMKKysrIGIvbmV0L3RpcGMvaWJfbWVkaWEuYwpAQCAtNTcsNyArNTcsNyBAQAogLyogQ29udmVydCBmcm9tIG1lZGlhIGFkZHJlc3MgZm9ybWF0IHRvIGRpc2NvdmVyeSBtZXNzYWdlIGFkZHIgZm9ybWF0ICovCiBzdGF0aWMgaW50IHRpcGNfaWJfYWRkcjJtc2coY2hhciAqbXNnLCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphZGRyKQogewotCW1lbXNldChtc2csIDAsIFRJUENfTUVESUFfQUREUl9TSVpFKTsKKwltZW1zZXQobXNnLCAwLCBUSVBDX01FRElBX0lORk9fU0laRSk7CiAJbWVtY3B5KG1zZywgYWRkci0+dmFsdWUsIElORklOSUJBTkRfQUxFTik7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9saW5rLmMgYi9uZXQvdGlwYy9saW5rLmMKaW5kZXggMTRmMDliMy4uYTZiMzBkZiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbGluay5jCisrKyBiL25ldC90aXBjL2xpbmsuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBuZXQvdGlwYy9saW5rLmM6IFRJUEMgbGluayBjb2RlCiAgKgotICogQ29weXJpZ2h0IChjKSAxOTk2LTIwMDcsIDIwMTItMjAxNCwgRXJpY3Nzb24gQUIKKyAqIENvcHlyaWdodCAoYykgMTk5Ni0yMDA3LCAyMDEyLTIwMTUsIEVyaWNzc29uIEFCCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNywgMjAxMC0yMDEzLCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtMzUsNiArMzUsNyBAQAogICovCiAKICNpbmNsdWRlICJjb3JlLmgiCisjaW5jbHVkZSAic3Vic2NyLmgiCiAjaW5jbHVkZSAibGluay5oIgogI2luY2x1ZGUgImJjYXN0LmgiCiAjaW5jbHVkZSAic29ja2V0LmgiCkBAIC04OCwyNCArODksMTQgQEAKICNkZWZpbmUgIFRJTUVPVVRfRVZUICAgICA1NjA4MTd1CS8qIGxpbmsgdGltZXIgZXhwaXJlZCAqLwogCiAvKgotICogVGhlIGZvbGxvd2luZyB0d28gJ21lc3NhZ2UgdHlwZXMnIGlzIHJlYWxseSBqdXN0IGltcGxlbWVudGF0aW9uCi0gKiBkYXRhIGNvbnZlbmllbnRseSBzdG9yZWQgaW4gdGhlIG1lc3NhZ2UgaGVhZGVyLgotICogVGhleSBtdXN0IG5vdCBiZSBjb25zaWRlcmVkIHBhcnQgb2YgdGhlIHByb3RvY29sCisgKiBTdGF0ZSB2YWx1ZSBzdG9yZWQgaW4gJ2ZhaWxvdmVyX3BrdHMnCiAgKi8KLSNkZWZpbmUgT1BFTl9NU0cgICAwCi0jZGVmaW5lIENMT1NFRF9NU0cgMQotCi0vKgotICogU3RhdGUgdmFsdWUgc3RvcmVkIGluICdleHBfbXNnX2NvdW50JwotICovCi0jZGVmaW5lIFNUQVJUX0NIQU5HRU9WRVIgMTAwMDAwdQorI2RlZmluZSBGSVJTVF9GQUlMT1ZFUiAweGZmZmZ1CiAKIHN0YXRpYyB2b2lkIGxpbmtfaGFuZGxlX291dF9vZl9zZXFfbXNnKHN0cnVjdCB0aXBjX2xpbmsgKmxpbmssCiAJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwogc3RhdGljIHZvaWQgdGlwY19saW5rX3Byb3RvX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsaW5rLAogCQkJCXN0cnVjdCBza19idWZmICpza2IpOwotc3RhdGljIGludCAgdGlwY19saW5rX3R1bm5lbF9yY3Yoc3RydWN0IHRpcGNfbm9kZSAqbm9kZSwKLQkJCQkgc3RydWN0IHNrX2J1ZmYgKipza2IpOwogc3RhdGljIHZvaWQgbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIHUzMiB0b2wpOwogc3RhdGljIHZvaWQgbGlua19zdGF0ZV9ldmVudChzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwgdTMyIGV2ZW50KTsKIHN0YXRpYyB2b2lkIGxpbmtfcmVzZXRfc3RhdGlzdGljcyhzdHJ1Y3QgdGlwY19saW5rICpsX3B0cik7CkBAIC0xMTQsNyArMTA1LDcgQEAKIHN0YXRpYyB2b2lkIHRpcGNfbGlua19zeW5jX3JjdihzdHJ1Y3QgdGlwY19ub2RlICpuLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKIHN0YXRpYyB2b2lkIHRpcGNfbGlua19pbnB1dChzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHN0YXRpYyBib29sIHRpcGNfZGF0YV9pbnB1dChzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLQorc3RhdGljIGJvb2wgdGlwY19saW5rX2ZhaWxvdmVyX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsLCBzdHJ1Y3Qgc2tfYnVmZiAqKnNrYik7CiAvKgogICogIFNpbXBsZSBsaW5rIHJvdXRpbmVzCiAgKi8KQEAgLTEzOCwzMiArMTI5LDExIEBACiAJa3JlZl9wdXQoJmxfcHRyLT5yZWYsIHRpcGNfbGlua19yZWxlYXNlKTsKIH0KIAotc3RhdGljIHZvaWQgbGlua19pbml0X21heF9wa3Qoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpCitzdGF0aWMgc3RydWN0IHRpcGNfbGluayAqdGlwY19wYXJhbGxlbF9saW5rKHN0cnVjdCB0aXBjX2xpbmsgKmwpCiB7Ci0Jc3RydWN0IHRpcGNfbm9kZSAqbm9kZSA9IGxfcHRyLT5vd25lcjsKLQlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gbmV0X2dlbmVyaWMobm9kZS0+bmV0LCB0aXBjX25ldF9pZCk7Ci0Jc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cjsKLQl1MzIgbWF4X3BrdDsKLQotCXJjdV9yZWFkX2xvY2soKTsKLQliX3B0ciA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKHRuLT5iZWFyZXJfbGlzdFtsX3B0ci0+YmVhcmVyX2lkXSk7Ci0JaWYgKCFiX3B0cikgewotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcmV0dXJuOwotCX0KLQltYXhfcGt0ID0gKGJfcHRyLT5tdHUgJiB+Myk7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0KLQlpZiAobWF4X3BrdCA+IE1BWF9NU0dfU0laRSkKLQkJbWF4X3BrdCA9IE1BWF9NU0dfU0laRTsKLQotCWxfcHRyLT5tYXhfcGt0X3RhcmdldCA9IG1heF9wa3Q7Ci0JaWYgKGxfcHRyLT5tYXhfcGt0X3RhcmdldCA8IE1BWF9QS1RfREVGQVVMVCkKLQkJbF9wdHItPm1heF9wa3QgPSBsX3B0ci0+bWF4X3BrdF90YXJnZXQ7Ci0JZWxzZQotCQlsX3B0ci0+bWF4X3BrdCA9IE1BWF9QS1RfREVGQVVMVDsKLQotCWxfcHRyLT5tYXhfcGt0X3Byb2JlcyA9IDA7CisJaWYgKGwtPm93bmVyLT5hY3RpdmVfbGlua3NbMF0gIT0gbCkKKwkJcmV0dXJuIGwtPm93bmVyLT5hY3RpdmVfbGlua3NbMF07CisJcmV0dXJuIGwtPm93bmVyLT5hY3RpdmVfbGlua3NbMV07CiB9CiAKIC8qCkBAIC0xOTQsMTAgKzE2NCwxMCBAQAogCXRpcGNfbm9kZV9sb2NrKGxfcHRyLT5vd25lcik7CiAKIAkvKiB1cGRhdGUgY291bnRlcnMgdXNlZCBpbiBzdGF0aXN0aWNhbCBwcm9maWxpbmcgb2Ygc2VuZCB0cmFmZmljICovCi0JbF9wdHItPnN0YXRzLmFjY3VfcXVldWVfc3ogKz0gc2tiX3F1ZXVlX2xlbigmbF9wdHItPm91dHF1ZXVlKTsKKwlsX3B0ci0+c3RhdHMuYWNjdV9xdWV1ZV9zeiArPSBza2JfcXVldWVfbGVuKCZsX3B0ci0+dHJhbnNtcSk7CiAJbF9wdHItPnN0YXRzLnF1ZXVlX3N6X2NvdW50cysrOwogCi0Jc2tiID0gc2tiX3BlZWsoJmxfcHRyLT5vdXRxdWV1ZSk7CisJc2tiID0gc2tiX3BlZWsoJmxfcHRyLT50cmFuc21xKTsKIAlpZiAoc2tiKSB7CiAJCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhza2IpOwogCQl1MzIgbGVuZ3RoID0gbXNnX3NpemUobXNnKTsKQEAgLTIyOSw3ICsxOTksNyBAQAogCS8qIGRvIGFsbCBvdGhlciBsaW5rIHByb2Nlc3NpbmcgcGVyZm9ybWVkIG9uIGEgcGVyaW9kaWMgYmFzaXMgKi8KIAlsaW5rX3N0YXRlX2V2ZW50KGxfcHRyLCBUSU1FT1VUX0VWVCk7CiAKLQlpZiAobF9wdHItPm5leHRfb3V0KQorCWlmIChza2JfcXVldWVfbGVuKCZsX3B0ci0+YmFja2xvZ3EpKQogCQl0aXBjX2xpbmtfcHVzaF9wYWNrZXRzKGxfcHRyKTsKIAogCXRpcGNfbm9kZV91bmxvY2sobF9wdHItPm93bmVyKTsKQEAgLTMwNSwxNiArMjc1LDE1IEBACiAJbXNnX3NldF9zZXNzaW9uKG1zZywgKHRuLT5yYW5kb20gJiAweGZmZmYpKTsKIAltc2dfc2V0X2JlYXJlcl9pZChtc2csIGJfcHRyLT5pZGVudGl0eSk7CiAJc3RyY3B5KChjaGFyICopbXNnX2RhdGEobXNnKSwgaWZfbmFtZSk7Ci0KKwlsX3B0ci0+bmV0X3BsYW5lID0gYl9wdHItPm5ldF9wbGFuZTsKKwlsX3B0ci0+YWR2ZXJ0aXNlZF9tdHUgPSBiX3B0ci0+bXR1OworCWxfcHRyLT5tdHUgPSBsX3B0ci0+YWR2ZXJ0aXNlZF9tdHU7CiAJbF9wdHItPnByaW9yaXR5ID0gYl9wdHItPnByaW9yaXR5OwogCXRpcGNfbGlua19zZXRfcXVldWVfbGltaXRzKGxfcHRyLCBiX3B0ci0+d2luZG93KTsKLQotCWxfcHRyLT5uZXRfcGxhbmUgPSBiX3B0ci0+bmV0X3BsYW5lOwotCWxpbmtfaW5pdF9tYXhfcGt0KGxfcHRyKTsKLQogCWxfcHRyLT5uZXh0X291dF9ubyA9IDE7Ci0JX19za2JfcXVldWVfaGVhZF9pbml0KCZsX3B0ci0+b3V0cXVldWUpOwotCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbF9wdHItPmRlZmVycmVkX3F1ZXVlKTsKKwlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJmxfcHRyLT50cmFuc21xKTsKKwlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJmxfcHRyLT5iYWNrbG9ncSk7CisJX19za2JfcXVldWVfaGVhZF9pbml0KCZsX3B0ci0+ZGVmZXJkcSk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbF9wdHItPndha2V1cHEpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxfcHRyLT5pbnB1dHEpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmxfcHRyLT5uYW1lZHEpOwpAQCAtMzI3LDE1ICsyOTYsMTkgQEAKIH0KIAogLyoqCi0gKiBsaW5rX2RlbGV0ZSAtIENvbmRpdGlvbmFsIGRlbGV0aW9uIG9mIGxpbmsuCi0gKiAgICAgICAgICAgICAgIElmIHRpbWVyIHN0aWxsIHJ1bm5pbmcsIHJlYWwgZGVsZXRlIGlzIGRvbmUgd2hlbiBpdCBleHBpcmVzCi0gKiBAbGluazogbGluayB0byBiZSBkZWxldGVkCisgKiB0aXBjX2xpbmtfZGVsZXRlIC0gRGVsZXRlIGEgbGluaworICogQGw6IGxpbmsgdG8gYmUgZGVsZXRlZAogICovCi12b2lkIHRpcGNfbGlua19kZWxldGUoc3RydWN0IHRpcGNfbGluayAqbGluaykKK3ZvaWQgdGlwY19saW5rX2RlbGV0ZShzdHJ1Y3QgdGlwY19saW5rICpsKQogewotCXRpcGNfbGlua19yZXNldF9mcmFnbWVudHMobGluayk7Ci0JdGlwY19ub2RlX2RldGFjaF9saW5rKGxpbmstPm93bmVyLCBsaW5rKTsKLQl0aXBjX2xpbmtfcHV0KGxpbmspOworCXRpcGNfbGlua19yZXNldChsKTsKKwlpZiAoZGVsX3RpbWVyKCZsLT50aW1lcikpCisJCXRpcGNfbGlua19wdXQobCk7CisJbC0+ZmxhZ3MgfD0gTElOS19TVE9QUEVEOworCS8qIERlbGV0ZSBsaW5rIG5vdywgb3Igd2hlbiB0aW1lciBpcyBmaW5pc2hlZDogKi8KKwl0aXBjX2xpbmtfcmVzZXRfZnJhZ21lbnRzKGwpOworCXRpcGNfbm9kZV9kZXRhY2hfbGluayhsLT5vd25lciwgbCk7CisJdGlwY19saW5rX3B1dChsKTsKIH0KIAogdm9pZCB0aXBjX2xpbmtfZGVsZXRlX2xpc3Qoc3RydWN0IG5ldCAqbmV0LCB1bnNpZ25lZCBpbnQgYmVhcmVyX2lkLApAQCAtMzQ5LDE2ICszMjIsNyBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG5vZGUsICZ0bi0+bm9kZV9saXN0LCBsaXN0KSB7CiAJCXRpcGNfbm9kZV9sb2NrKG5vZGUpOwogCQlsaW5rID0gbm9kZS0+bGlua3NbYmVhcmVyX2lkXTsKLQkJaWYgKCFsaW5rKSB7Ci0JCQl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOwotCQkJY29udGludWU7Ci0JCX0KLQkJdGlwY19saW5rX3Jlc2V0KGxpbmspOwotCQlpZiAoZGVsX3RpbWVyKCZsaW5rLT50aW1lcikpCi0JCQl0aXBjX2xpbmtfcHV0KGxpbmspOwotCQlsaW5rLT5mbGFncyB8PSBMSU5LX1NUT1BQRUQ7Ci0JCS8qIERlbGV0ZSBsaW5rIG5vdywgb3Igd2hlbiBmYWlsb3ZlciBpcyBmaW5pc2hlZDogKi8KLQkJaWYgKHNodXR0aW5nX2Rvd24gfHwgIXRpcGNfbm9kZV9pc191cChub2RlKSkKKwkJaWYgKGxpbmspCiAJCQl0aXBjX2xpbmtfZGVsZXRlKGxpbmspOwogCQl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOwogCX0KQEAgLTM2NiwyOCArMzMwLDQzIEBACiB9CiAKIC8qKgotICogbGlua19zY2hlZHVsZV91c2VyIC0gc2NoZWR1bGUgdXNlciBmb3Igd2FrZXVwIGFmdGVyIGNvbmdlc3Rpb24KKyAqIGxpbmtfc2NoZWR1bGVfdXNlciAtIHNjaGVkdWxlIGEgbWVzc2FnZSBzZW5kZXIgZm9yIHdha2V1cCBhZnRlciBjb25nZXN0aW9uCiAgKiBAbGluazogY29uZ2VzdGVkIGxpbmsKLSAqIEBvcG9ydDogc2VuZGluZyBwb3J0Ci0gKiBAY2hhaW5fc3o6IHNpemUgb2YgYnVmZmVyIGNoYWluIHRoYXQgd2FzIGF0dGVtcHRlZCBzZW50Ci0gKiBAaW1wOiBpbXBvcnRhbmNlIG9mIG1lc3NhZ2UgYXR0ZW1wdGVkIHNlbnQKKyAqIEBsaXN0OiBtZXNzYWdlIHRoYXQgd2FzIGF0dGVtcHRlZCBzZW50CiAgKiBDcmVhdGUgcHNldWRvIG1zZyB0byBzZW5kIGJhY2sgdG8gdXNlciB3aGVuIGNvbmdlc3Rpb24gYWJhdGVzCisgKiBPbmx5IGNvbnN1bWVzIG1lc3NhZ2UgaWYgdGhlcmUgaXMgYW4gZXJyb3IKICAqLwotc3RhdGljIGJvb2wgbGlua19zY2hlZHVsZV91c2VyKHN0cnVjdCB0aXBjX2xpbmsgKmxpbmssIHUzMiBvcG9ydCwKLQkJCSAgICAgICB1aW50IGNoYWluX3N6LCB1aW50IGltcCkKK3N0YXRpYyBpbnQgbGlua19zY2hlZHVsZV91c2VyKHN0cnVjdCB0aXBjX2xpbmsgKmxpbmssIHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coc2tiX3BlZWsobGlzdCkpOworCWludCBpbXAgPSBtc2dfaW1wb3J0YW5jZShtc2cpOworCXUzMiBvcG9ydCA9IG1zZ19vcmlncG9ydChtc2cpOworCXUzMiBhZGRyID0gbGlua19vd25fYWRkcihsaW5rKTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCi0JYnVmID0gdGlwY19tc2dfY3JlYXRlKFNPQ0tfV0FLRVVQLCAwLCBJTlRfSF9TSVpFLCAwLAotCQkJICAgICAgbGlua19vd25fYWRkcihsaW5rKSwgbGlua19vd25fYWRkcihsaW5rKSwKLQkJCSAgICAgIG9wb3J0LCAwLCAwKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIGZhbHNlOwotCVRJUENfU0tCX0NCKGJ1ZiktPmNoYWluX3N6ID0gY2hhaW5fc3o7Ci0JVElQQ19TS0JfQ0IoYnVmKS0+Y2hhaW5faW1wID0gaW1wOwotCXNrYl9xdWV1ZV90YWlsKCZsaW5rLT53YWtldXBxLCBidWYpOworCS8qIFRoaXMgcmVhbGx5IGNhbm5vdCBoYXBwZW4uLi4gICovCisJaWYgKHVubGlrZWx5KGltcCA+IFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSkpIHsKKwkJcHJfd2FybigiJXM8JXM+LCBzZW5kIHF1ZXVlIGZ1bGwiLCBsaW5rX3JzdF9tc2csIGxpbmstPm5hbWUpOworCQl0aXBjX2xpbmtfcmVzZXQobGluayk7CisJCWdvdG8gZXJyOworCX0KKwkvKiBOb24tYmxvY2tpbmcgc2VuZGVyOiAqLworCWlmIChUSVBDX1NLQl9DQihza2JfcGVlayhsaXN0KSktPndha2V1cF9wZW5kaW5nKQorCQlyZXR1cm4gLUVMSU5LQ09ORzsKKworCS8qIENyZWF0ZSBhbmQgc2NoZWR1bGUgd2FrZXVwIHBzZXVkbyBtZXNzYWdlICovCisJc2tiID0gdGlwY19tc2dfY3JlYXRlKFNPQ0tfV0FLRVVQLCAwLCBJTlRfSF9TSVpFLCAwLAorCQkJICAgICAgYWRkciwgYWRkciwgb3BvcnQsIDAsIDApOworCWlmICghc2tiKQorCQlnb3RvIGVycjsKKwlUSVBDX1NLQl9DQihza2IpLT5jaGFpbl9zeiA9IHNrYl9xdWV1ZV9sZW4obGlzdCk7CisJVElQQ19TS0JfQ0Ioc2tiKS0+Y2hhaW5faW1wID0gaW1wOworCXNrYl9xdWV1ZV90YWlsKCZsaW5rLT53YWtldXBxLCBza2IpOwogCWxpbmstPnN0YXRzLmxpbmtfY29uZ3MrKzsKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gLUVMSU5LQ09ORzsKK2VycjoKKwlfX3NrYl9xdWV1ZV9wdXJnZShsaXN0KTsKKwlyZXR1cm4gLUVOT0JVRlM7CiB9CiAKIC8qKgpAQCAtMzk2LDE5ICszNzUsMjIgQEAKICAqIE1vdmUgYSBudW1iZXIgb2Ygd2FpdGluZyB1c2VycywgYXMgcGVybWl0dGVkIGJ5IGF2YWlsYWJsZSBzcGFjZSBpbgogICogdGhlIHNlbmQgcXVldWUsIGZyb20gbGluayB3YWl0IHF1ZXVlIHRvIG5vZGUgd2FpdCBxdWV1ZSBmb3Igd2FrZXVwCiAgKi8KLXZvaWQgbGlua19wcmVwYXJlX3dha2V1cChzdHJ1Y3QgdGlwY19saW5rICpsaW5rKQordm9pZCBsaW5rX3ByZXBhcmVfd2FrZXVwKHN0cnVjdCB0aXBjX2xpbmsgKmwpCiB7Ci0JdWludCBwZW5kX3FzeiA9IHNrYl9xdWV1ZV9sZW4oJmxpbmstPm91dHF1ZXVlKTsKKwlpbnQgcG5kW1RJUENfU1lTVEVNX0lNUE9SVEFOQ0UgKyAxXSA9IHswLH07CisJaW50IGltcCwgbGltOwogCXN0cnVjdCBza19idWZmICpza2IsICp0bXA7CiAKLQlza2JfcXVldWVfd2Fsa19zYWZlKCZsaW5rLT53YWtldXBxLCBza2IsIHRtcCkgewotCQlpZiAocGVuZF9xc3ogPj0gbGluay0+cXVldWVfbGltaXRbVElQQ19TS0JfQ0Ioc2tiKS0+Y2hhaW5faW1wXSkKKwlza2JfcXVldWVfd2Fsa19zYWZlKCZsLT53YWtldXBxLCBza2IsIHRtcCkgeworCQlpbXAgPSBUSVBDX1NLQl9DQihza2IpLT5jaGFpbl9pbXA7CisJCWxpbSA9IGwtPndpbmRvdyArIGwtPmJhY2tsb2dbaW1wXS5saW1pdDsKKwkJcG5kW2ltcF0gKz0gVElQQ19TS0JfQ0Ioc2tiKS0+Y2hhaW5fc3o7CisJCWlmICgocG5kW2ltcF0gKyBsLT5iYWNrbG9nW2ltcF0ubGVuKSA+PSBsaW0pCiAJCQlicmVhazsKLQkJcGVuZF9xc3ogKz0gVElQQ19TS0JfQ0Ioc2tiKS0+Y2hhaW5fc3o7Ci0JCXNrYl91bmxpbmsoc2tiLCAmbGluay0+d2FrZXVwcSk7Ci0JCXNrYl9xdWV1ZV90YWlsKCZsaW5rLT5pbnB1dHEsIHNrYik7Ci0JCWxpbmstPm93bmVyLT5pbnB1dHEgPSAmbGluay0+aW5wdXRxOwotCQlsaW5rLT5vd25lci0+YWN0aW9uX2ZsYWdzIHw9IFRJUENfTVNHX0VWVDsKKwkJc2tiX3VubGluayhza2IsICZsLT53YWtldXBxKTsKKwkJc2tiX3F1ZXVlX3RhaWwoJmwtPmlucHV0cSwgc2tiKTsKKwkJbC0+b3duZXItPmlucHV0cSA9ICZsLT5pbnB1dHE7CisJCWwtPm93bmVyLT5hY3Rpb25fZmxhZ3MgfD0gVElQQ19NU0dfRVZUOwogCX0KIH0KIApAQCAtNDIyLDMxICs0MDQsNDIgQEAKIAlsX3B0ci0+cmVhc21fYnVmID0gTlVMTDsKIH0KIAorc3RhdGljIHZvaWQgdGlwY19saW5rX3B1cmdlX2JhY2tsb2coc3RydWN0IHRpcGNfbGluayAqbCkKK3sKKwlfX3NrYl9xdWV1ZV9wdXJnZSgmbC0+YmFja2xvZ3EpOworCWwtPmJhY2tsb2dbVElQQ19MT1dfSU1QT1JUQU5DRV0ubGVuID0gMDsKKwlsLT5iYWNrbG9nW1RJUENfTUVESVVNX0lNUE9SVEFOQ0VdLmxlbiA9IDA7CisJbC0+YmFja2xvZ1tUSVBDX0hJR0hfSU1QT1JUQU5DRV0ubGVuID0gMDsKKwlsLT5iYWNrbG9nW1RJUENfQ1JJVElDQUxfSU1QT1JUQU5DRV0ubGVuID0gMDsKKwlsLT5iYWNrbG9nW1RJUENfU1lTVEVNX0lNUE9SVEFOQ0VdLmxlbiA9IDA7Cit9CisKIC8qKgogICogdGlwY19saW5rX3B1cmdlX3F1ZXVlcyAtIHB1cmdlIGFsbCBwa3QgcXVldWVzIGFzc29jaWF0ZWQgd2l0aCBsaW5rCiAgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluawogICovCiB2b2lkIHRpcGNfbGlua19wdXJnZV9xdWV1ZXMoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpCiB7Ci0JX19za2JfcXVldWVfcHVyZ2UoJmxfcHRyLT5kZWZlcnJlZF9xdWV1ZSk7Ci0JX19za2JfcXVldWVfcHVyZ2UoJmxfcHRyLT5vdXRxdWV1ZSk7CisJX19za2JfcXVldWVfcHVyZ2UoJmxfcHRyLT5kZWZlcmRxKTsKKwlfX3NrYl9xdWV1ZV9wdXJnZSgmbF9wdHItPnRyYW5zbXEpOworCXRpcGNfbGlua19wdXJnZV9iYWNrbG9nKGxfcHRyKTsKIAl0aXBjX2xpbmtfcmVzZXRfZnJhZ21lbnRzKGxfcHRyKTsKIH0KIAogdm9pZCB0aXBjX2xpbmtfcmVzZXQoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpCiB7CiAJdTMyIHByZXZfc3RhdGUgPSBsX3B0ci0+c3RhdGU7Ci0JdTMyIGNoZWNrcG9pbnQgPSBsX3B0ci0+bmV4dF9pbl9ubzsKIAlpbnQgd2FzX2FjdGl2ZV9saW5rID0gdGlwY19saW5rX2lzX2FjdGl2ZShsX3B0cik7CiAJc3RydWN0IHRpcGNfbm9kZSAqb3duZXIgPSBsX3B0ci0+b3duZXI7CisJc3RydWN0IHRpcGNfbGluayAqcGwgPSB0aXBjX3BhcmFsbGVsX2xpbmsobF9wdHIpOwogCiAJbXNnX3NldF9zZXNzaW9uKGxfcHRyLT5wbXNnLCAoKG1zZ19zZXNzaW9uKGxfcHRyLT5wbXNnKSArIDEpICYgMHhmZmZmKSk7CiAKIAkvKiBMaW5rIGlzIGRvd24sIGFjY2VwdCBhbnkgc2Vzc2lvbiAqLwogCWxfcHRyLT5wZWVyX3Nlc3Npb24gPSBJTlZBTElEX1NFU1NJT047CiAKLQkvKiBQcmVwYXJlIGZvciBtYXggcGFja2V0IHNpemUgbmVnb3RpYXRpb24gKi8KLQlsaW5rX2luaXRfbWF4X3BrdChsX3B0cik7CisJLyogUHJlcGFyZSBmb3IgcmVuZXdlZCBtdHUgc2l6ZSBuZWdvdGlhdGlvbiAqLworCWxfcHRyLT5tdHUgPSBsX3B0ci0+YWR2ZXJ0aXNlZF9tdHU7CiAKIAlsX3B0ci0+c3RhdGUgPSBSRVNFVF9VTktOT1dOOwogCkBAIC00NTYsMjEgKzQ0OSwyNiBAQAogCXRpcGNfbm9kZV9saW5rX2Rvd24obF9wdHItPm93bmVyLCBsX3B0cik7CiAJdGlwY19iZWFyZXJfcmVtb3ZlX2Rlc3Qob3duZXItPm5ldCwgbF9wdHItPmJlYXJlcl9pZCwgbF9wdHItPmFkZHIpOwogCi0JaWYgKHdhc19hY3RpdmVfbGluayAmJiB0aXBjX25vZGVfYWN0aXZlX2xpbmtzKGxfcHRyLT5vd25lcikpIHsKLQkJbF9wdHItPnJlc2V0X2NoZWNrcG9pbnQgPSBjaGVja3BvaW50OwotCQlsX3B0ci0+ZXhwX21zZ19jb3VudCA9IFNUQVJUX0NIQU5HRU9WRVI7CisJaWYgKHdhc19hY3RpdmVfbGluayAmJiB0aXBjX25vZGVfaXNfdXAobF9wdHItPm93bmVyKSAmJiAocGwgIT0gbF9wdHIpKSB7CisJCWxfcHRyLT5mbGFncyB8PSBMSU5LX0ZBSUxJTkdPVkVSOworCQlsX3B0ci0+ZmFpbG92ZXJfY2hlY2twdCA9IGxfcHRyLT5uZXh0X2luX25vOworCQlwbC0+ZmFpbG92ZXJfcGt0cyA9IEZJUlNUX0ZBSUxPVkVSOworCQlwbC0+ZmFpbG92ZXJfY2hlY2twdCA9IGxfcHRyLT5uZXh0X2luX25vOworCQlwbC0+ZmFpbG92ZXJfc2tiID0gbF9wdHItPnJlYXNtX2J1ZjsKKwl9IGVsc2UgeworCQlrZnJlZV9za2IobF9wdHItPnJlYXNtX2J1Zik7CiAJfQotCiAJLyogQ2xlYW4gdXAgYWxsIHF1ZXVlcywgZXhjZXB0IGlucHV0cTogKi8KLQlfX3NrYl9xdWV1ZV9wdXJnZSgmbF9wdHItPm91dHF1ZXVlKTsKLQlfX3NrYl9xdWV1ZV9wdXJnZSgmbF9wdHItPmRlZmVycmVkX3F1ZXVlKTsKKwlfX3NrYl9xdWV1ZV9wdXJnZSgmbF9wdHItPnRyYW5zbXEpOworCV9fc2tiX3F1ZXVlX3B1cmdlKCZsX3B0ci0+ZGVmZXJkcSk7CiAJaWYgKCFvd25lci0+aW5wdXRxKQogCQlvd25lci0+aW5wdXRxID0gJmxfcHRyLT5pbnB1dHE7CiAJc2tiX3F1ZXVlX3NwbGljZV9pbml0KCZsX3B0ci0+d2FrZXVwcSwgb3duZXItPmlucHV0cSk7CiAJaWYgKCFza2JfcXVldWVfZW1wdHkob3duZXItPmlucHV0cSkpCiAJCW93bmVyLT5hY3Rpb25fZmxhZ3MgfD0gVElQQ19NU0dfRVZUOwotCWxfcHRyLT5uZXh0X291dCA9IE5VTEw7Ci0JbF9wdHItPnVuYWNrZWRfd2luZG93ID0gMDsKKwl0aXBjX2xpbmtfcHVyZ2VfYmFja2xvZyhsX3B0cik7CisJbF9wdHItPnJlYXNtX2J1ZiA9IE5VTEw7CisJbF9wdHItPnJjdl91bmFja2VkID0gMDsKIAlsX3B0ci0+Y2hlY2twb2ludCA9IDE7CiAJbF9wdHItPm5leHRfb3V0X25vID0gMTsKIAlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOwpAQCAtNTIxLDggKzUxOSw3IEBACiAJaWYgKCEobF9wdHItPmZsYWdzICYgTElOS19TVEFSVEVEKSAmJiAoZXZlbnQgIT0gU1RBUlRJTkdfRVZUKSkKIAkJcmV0dXJuOwkJLyogTm90IHlldC4gKi8KIAotCS8qIENoZWNrIHdoZXRoZXIgY2hhbmdlb3ZlciBpcyBnb2luZyBvbiAqLwotCWlmIChsX3B0ci0+ZXhwX21zZ19jb3VudCkgeworCWlmIChsX3B0ci0+ZmxhZ3MgJiBMSU5LX0ZBSUxJTkdPVkVSKSB7CiAJCWlmIChldmVudCA9PSBUSU1FT1VUX0VWVCkKIAkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOwogCQlyZXR1cm47CkBAIC01MzksMTEgKzUzNiw3IEBACiAJCQkJbF9wdHItPmNoZWNrcG9pbnQgPSBsX3B0ci0+bmV4dF9pbl9ubzsKIAkJCQlpZiAodGlwY19iY2xpbmtfYWNrc19taXNzaW5nKGxfcHRyLT5vd25lcikpIHsKIAkJCQkJdGlwY19saW5rX3Byb3RvX3htaXQobF9wdHIsIFNUQVRFX01TRywKLQkJCQkJCQkgICAgIDAsIDAsIDAsIDAsIDApOwotCQkJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKLQkJCQl9IGVsc2UgaWYgKGxfcHRyLT5tYXhfcGt0IDwgbF9wdHItPm1heF9wa3RfdGFyZ2V0KSB7Ci0JCQkJCXRpcGNfbGlua19wcm90b194bWl0KGxfcHRyLCBTVEFURV9NU0csCi0JCQkJCQkJICAgICAxLCAwLCAwLCAwLCAwKTsKKwkJCQkJCQkgICAgIDAsIDAsIDAsIDApOwogCQkJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKIAkJCQl9CiAJCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CkBAIC01NTEsNyArNTQ0LDcgQEAKIAkJCX0KIAkJCWxfcHRyLT5zdGF0ZSA9IFdPUktJTkdfVU5LTk9XTjsKIAkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7Ci0JCQl0aXBjX2xpbmtfcHJvdG9feG1pdChsX3B0ciwgU1RBVEVfTVNHLCAxLCAwLCAwLCAwLCAwKTsKKwkJCXRpcGNfbGlua19wcm90b194bWl0KGxfcHRyLCBTVEFURV9NU0csIDEsIDAsIDAsIDApOwogCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CiAJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2IC8gNCk7CiAJCQlicmVhazsKQEAgLTU2Miw3ICs1NTUsNyBAQAogCQkJbF9wdHItPnN0YXRlID0gUkVTRVRfUkVTRVQ7CiAJCQlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOwogCQkJdGlwY19saW5rX3Byb3RvX3htaXQobF9wdHIsIEFDVElWQVRFX01TRywKLQkJCQkJICAgICAwLCAwLCAwLCAwLCAwKTsKKwkJCQkJICAgICAwLCAwLCAwLCAwKTsKIAkJCWxfcHRyLT5mc21fbXNnX2NudCsrOwogCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CiAJCQlicmVhazsKQEAgLTU4NSw3ICs1NzgsNyBAQAogCQkJbF9wdHItPnN0YXRlID0gUkVTRVRfUkVTRVQ7CiAJCQlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOwogCQkJdGlwY19saW5rX3Byb3RvX3htaXQobF9wdHIsIEFDVElWQVRFX01TRywKLQkJCQkJICAgICAwLCAwLCAwLCAwLCAwKTsKKwkJCQkJICAgICAwLCAwLCAwLCAwKTsKIAkJCWxfcHRyLT5mc21fbXNnX2NudCsrOwogCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CiAJCQlicmVhazsKQEAgLTU5NiwxMyArNTg5LDEzIEBACiAJCQkJbF9wdHItPmNoZWNrcG9pbnQgPSBsX3B0ci0+bmV4dF9pbl9ubzsKIAkJCQlpZiAodGlwY19iY2xpbmtfYWNrc19taXNzaW5nKGxfcHRyLT5vd25lcikpIHsKIAkJCQkJdGlwY19saW5rX3Byb3RvX3htaXQobF9wdHIsIFNUQVRFX01TRywKLQkJCQkJCQkgICAgIDAsIDAsIDAsIDAsIDApOworCQkJCQkJCSAgICAgMCwgMCwgMCwgMCk7CiAJCQkJCWxfcHRyLT5mc21fbXNnX2NudCsrOwogCQkJCX0KIAkJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKIAkJCX0gZWxzZSBpZiAobF9wdHItPmZzbV9tc2dfY250IDwgbF9wdHItPmFib3J0X2xpbWl0KSB7CiAJCQkJdGlwY19saW5rX3Byb3RvX3htaXQobF9wdHIsIFNUQVRFX01TRywKLQkJCQkJCSAgICAgMSwgMCwgMCwgMCwgMCk7CisJCQkJCQkgICAgIDEsIDAsIDAsIDApOwogCQkJCWxfcHRyLT5mc21fbXNnX2NudCsrOwogCQkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYgLyA0KTsKIAkJCX0gZWxzZSB7CS8qIExpbmsgaGFzIGZhaWxlZCAqLwpAQCAtNjEyLDcgKzYwNSw3IEBACiAJCQkJbF9wdHItPnN0YXRlID0gUkVTRVRfVU5LTk9XTjsKIAkJCQlsX3B0ci0+ZnNtX21zZ19jbnQgPSAwOwogCQkJCXRpcGNfbGlua19wcm90b194bWl0KGxfcHRyLCBSRVNFVF9NU0csCi0JCQkJCQkgICAgIDAsIDAsIDAsIDAsIDApOworCQkJCQkJICAgICAwLCAwLCAwLCAwKTsKIAkJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKIAkJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKIAkJCX0KQEAgLTYzMiw3ICs2MjUsNyBAQAogCQkJbF9wdHItPnN0YXRlID0gV09SS0lOR19XT1JLSU5HOwogCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKIAkJCWxpbmtfYWN0aXZhdGUobF9wdHIpOwotCQkJdGlwY19saW5rX3Byb3RvX3htaXQobF9wdHIsIFNUQVRFX01TRywgMSwgMCwgMCwgMCwgMCk7CisJCQl0aXBjX2xpbmtfcHJvdG9feG1pdChsX3B0ciwgU1RBVEVfTVNHLCAxLCAwLCAwLCAwKTsKIAkJCWxfcHRyLT5mc21fbXNnX2NudCsrOwogCQkJaWYgKGxfcHRyLT5vd25lci0+d29ya2luZ19saW5rcyA9PSAxKQogCQkJCXRpcGNfbGlua19zeW5jX3htaXQobF9wdHIpOwpAQCAtNjQyLDcgKzYzNSw3IEBACiAJCQlsX3B0ci0+c3RhdGUgPSBSRVNFVF9SRVNFVDsKIAkJCWxfcHRyLT5mc21fbXNnX2NudCA9IDA7CiAJCQl0aXBjX2xpbmtfcHJvdG9feG1pdChsX3B0ciwgQUNUSVZBVEVfTVNHLAotCQkJCQkgICAgIDEsIDAsIDAsIDAsIDApOworCQkJCQkgICAgIDEsIDAsIDAsIDApOwogCQkJbF9wdHItPmZzbV9tc2dfY250Kys7CiAJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKIAkJCWJyZWFrOwpAQCAtNjUyLDcgKzY0NSw3IEBACiAJCQlsaW5rX3NldF90aW1lcihsX3B0ciwgY29udF9pbnR2KTsKIAkJCWJyZWFrOwogCQljYXNlIFRJTUVPVVRfRVZUOgotCQkJdGlwY19saW5rX3Byb3RvX3htaXQobF9wdHIsIFJFU0VUX01TRywgMCwgMCwgMCwgMCwgMCk7CisJCQl0aXBjX2xpbmtfcHJvdG9feG1pdChsX3B0ciwgUkVTRVRfTVNHLCAwLCAwLCAwLCAwKTsKIAkJCWxfcHRyLT5mc21fbXNnX2NudCsrOwogCQkJbGlua19zZXRfdGltZXIobF9wdHIsIGNvbnRfaW50dik7CiAJCQlicmVhazsKQEAgLTY3MCw3ICs2NjMsNyBAQAogCQkJbF9wdHItPnN0YXRlID0gV09SS0lOR19XT1JLSU5HOwogCQkJbF9wdHItPmZzbV9tc2dfY250ID0gMDsKIAkJCWxpbmtfYWN0aXZhdGUobF9wdHIpOwotCQkJdGlwY19saW5rX3Byb3RvX3htaXQobF9wdHIsIFNUQVRFX01TRywgMSwgMCwgMCwgMCwgMCk7CisJCQl0aXBjX2xpbmtfcHJvdG9feG1pdChsX3B0ciwgU1RBVEVfTVNHLCAxLCAwLCAwLCAwKTsKIAkJCWxfcHRyLT5mc21fbXNnX2NudCsrOwogCQkJaWYgKGxfcHRyLT5vd25lci0+d29ya2luZ19saW5rcyA9PSAxKQogCQkJCXRpcGNfbGlua19zeW5jX3htaXQobF9wdHIpOwpAQCAtNjgwLDcgKzY3Myw3IEBACiAJCQlicmVhazsKIAkJY2FzZSBUSU1FT1VUX0VWVDoKIAkJCXRpcGNfbGlua19wcm90b194bWl0KGxfcHRyLCBBQ1RJVkFURV9NU0csCi0JCQkJCSAgICAgMCwgMCwgMCwgMCwgMCk7CisJCQkJCSAgICAgMCwgMCwgMCwgMCk7CiAJCQlsX3B0ci0+ZnNtX21zZ19jbnQrKzsKIAkJCWxpbmtfc2V0X3RpbWVyKGxfcHRyLCBjb250X2ludHYpOwogCQkJYnJlYWs7CkBAIC02OTMsMTAxICs2ODYsNjUgQEAKIAl9CiB9CiAKLS8qIHRpcGNfbGlua19jb25nOiBkZXRlcm1pbmUgcmV0dXJuIHZhbHVlIGFuZCBob3cgdG8gdHJlYXQgdGhlCi0gKiBzZW50IGJ1ZmZlciBkdXJpbmcgbGluayBjb25nZXN0aW9uLgotICogLSBGb3IgcGxhaW4sIGVycm9ybGVzcyB1c2VyIGRhdGEgbWVzc2FnZXMgd2Uga2VlcCB0aGUgYnVmZmVyIGFuZAotICogICByZXR1cm4gLUVMSU5LT05HLgotICogLSBGb3IgYWxsIG90aGVyIG1lc3NhZ2VzIHdlIGRpc2NhcmQgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuIC1FSE9TVFVOUkVBQ0gKLSAqIC0gRm9yIFRJUEMgaW50ZXJuYWwgbWVzc2FnZXMgd2UgYWxzbyByZXNldCB0aGUgbGluawotICovCi1zdGF0aWMgaW50IHRpcGNfbGlua19jb25nKHN0cnVjdCB0aXBjX2xpbmsgKmxpbmssIHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHNrYl9wZWVrKGxpc3QpOwotCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhza2IpOwotCXVpbnQgaW1wID0gdGlwY19tc2dfdG90X2ltcG9ydGFuY2UobXNnKTsKLQl1MzIgb3BvcnQgPSBtc2dfdG90X29yaWdwb3J0KG1zZyk7Ci0KLQlpZiAodW5saWtlbHkoaW1wID4gVElQQ19DUklUSUNBTF9JTVBPUlRBTkNFKSkgewotCQlwcl93YXJuKCIlczwlcz4sIHNlbmQgcXVldWUgZnVsbCIsIGxpbmtfcnN0X21zZywgbGluay0+bmFtZSk7Ci0JCXRpcGNfbGlua19yZXNldChsaW5rKTsKLQkJZ290byBkcm9wOwotCX0KLQlpZiAodW5saWtlbHkobXNnX2VycmNvZGUobXNnKSkpCi0JCWdvdG8gZHJvcDsKLQlpZiAodW5saWtlbHkobXNnX3Jlcm91dGVfY250KG1zZykpKQotCQlnb3RvIGRyb3A7Ci0JaWYgKFRJUENfU0tCX0NCKHNrYiktPndha2V1cF9wZW5kaW5nKQotCQlyZXR1cm4gLUVMSU5LQ09ORzsKLQlpZiAobGlua19zY2hlZHVsZV91c2VyKGxpbmssIG9wb3J0LCBza2JfcXVldWVfbGVuKGxpc3QpLCBpbXApKQotCQlyZXR1cm4gLUVMSU5LQ09ORzsKLWRyb3A6Ci0JX19za2JfcXVldWVfcHVyZ2UobGlzdCk7Ci0JcmV0dXJuIC1FSE9TVFVOUkVBQ0g7Ci19Ci0KIC8qKgogICogX190aXBjX2xpbmtfeG1pdCgpOiBzYW1lIGFzIHRpcGNfbGlua194bWl0LCBidXQgZGVzdGxpbmsgaXMga25vd24gJiBsb2NrZWQKICAqIEBsaW5rOiBsaW5rIHRvIHVzZQogICogQGxpc3Q6IGNoYWluIG9mIGJ1ZmZlcnMgY29udGFpbmluZyBtZXNzYWdlCiAgKgotICogQ29uc3VtZXMgdGhlIGJ1ZmZlciBjaGFpbiwgZXhjZXB0IHdoZW4gcmV0dXJuaW5nIC1FTElOS0NPTkcKLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZXJybm86IC1FTElOS0NPTkcsIC1FTVNHU0laRSAocGxhaW4gc29ja2V0Ci0gKiB1c2VyIGRhdGEgbWVzc2FnZXMpIG9yIC1FSE9TVFVOUkVBQ0ggKGFsbCBvdGhlciBtZXNzYWdlcy9zZW5kZXJzKQotICogT25seSB0aGUgc29ja2V0IGZ1bmN0aW9ucyB0aXBjX3NlbmRfc3RyZWFtKCkgYW5kIHRpcGNfc2VuZF9wYWNrZXQoKSBuZWVkCi0gKiB0byBhY3Qgb24gdGhlIHJldHVybiB2YWx1ZSwgc2luY2UgdGhleSBtYXkgbmVlZCB0byBkbyBtb3JlIHNlbmQgYXR0ZW1wdHMuCisgKiBDb25zdW1lcyB0aGUgYnVmZmVyIGNoYWluLCBleGNlcHQgd2hlbiByZXR1cm5pbmcgLUVMSU5LQ09ORywKKyAqIHNpbmNlIHRoZSBjYWxsZXIgdGhlbiBtYXkgd2FudCB0byBtYWtlIG1vcmUgc2VuZCBhdHRlbXB0cy4KKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzLCBvciBlcnJubzogLUVMSU5LQ09ORywgLUVNU0dTSVpFIG9yIC1FTk9CVUZTCisgKiBNZXNzYWdlcyBhdCBUSVBDX1NZU1RFTV9JTVBPUlRBTkNFIGFyZSBhbHdheXMgYWNjZXB0ZWQKICAqLwogaW50IF9fdGlwY19saW5rX3htaXQoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19saW5rICpsaW5rLAogCQkgICAgIHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCiB7CiAJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKHNrYl9wZWVrKGxpc3QpKTsKLQl1aW50IHBzeiA9IG1zZ19zaXplKG1zZyk7Ci0JdWludCBzbmRsaW0gPSBsaW5rLT5xdWV1ZV9saW1pdFswXTsKLQl1aW50IGltcCA9IHRpcGNfbXNnX3RvdF9pbXBvcnRhbmNlKG1zZyk7Ci0JdWludCBtdHUgPSBsaW5rLT5tYXhfcGt0OworCXVuc2lnbmVkIGludCBtYXh3aW4gPSBsaW5rLT53aW5kb3c7CisJdW5zaWduZWQgaW50IGltcCA9IG1zZ19pbXBvcnRhbmNlKG1zZyk7CisJdWludCBtdHUgPSBsaW5rLT5tdHU7CiAJdWludCBhY2sgPSBtb2QobGluay0+bmV4dF9pbl9ubyAtIDEpOwogCXVpbnQgc2Vxbm8gPSBsaW5rLT5uZXh0X291dF9ubzsKIAl1aW50IGJjX2xhc3RfaW4gPSBsaW5rLT5vd25lci0+YmNsaW5rLmxhc3RfaW47CiAJc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYWRkciA9ICZsaW5rLT5tZWRpYV9hZGRyOwotCXN0cnVjdCBza19idWZmX2hlYWQgKm91dHF1ZXVlID0gJmxpbmstPm91dHF1ZXVlOworCXN0cnVjdCBza19idWZmX2hlYWQgKnRyYW5zbXEgPSAmbGluay0+dHJhbnNtcTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpiYWNrbG9ncSA9ICZsaW5rLT5iYWNrbG9ncTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOwogCi0JLyogTWF0Y2ggcXVldWUgbGltaXRzIGFnYWluc3QgbXNnIGltcG9ydGFuY2U6ICovCi0JaWYgKHVubGlrZWx5KHNrYl9xdWV1ZV9sZW4ob3V0cXVldWUpID49IGxpbmstPnF1ZXVlX2xpbWl0W2ltcF0pKQotCQlyZXR1cm4gdGlwY19saW5rX2NvbmcobGluaywgbGlzdCk7CisJLyogTWF0Y2ggYmFja2xvZyBsaW1pdCBhZ2FpbnN0IG1zZyBpbXBvcnRhbmNlOiAqLworCWlmICh1bmxpa2VseShsaW5rLT5iYWNrbG9nW2ltcF0ubGVuID49IGxpbmstPmJhY2tsb2dbaW1wXS5saW1pdCkpCisJCXJldHVybiBsaW5rX3NjaGVkdWxlX3VzZXIobGluaywgbGlzdCk7CiAKLQkvKiBIYXMgdmFsaWQgcGFja2V0IGxpbWl0IGJlZW4gdXNlZCA/ICovCi0JaWYgKHVubGlrZWx5KHBzeiA+IG10dSkpIHsKKwlpZiAodW5saWtlbHkobXNnX3NpemUobXNnKSA+IG10dSkpIHsKIAkJX19za2JfcXVldWVfcHVyZ2UobGlzdCk7CiAJCXJldHVybiAtRU1TR1NJWkU7CiAJfQotCi0JLyogUHJlcGFyZSBlYWNoIHBhY2tldCBmb3Igc2VuZGluZywgYW5kIGFkZCB0byBvdXRxdWV1ZTogKi8KKwkvKiBQcmVwYXJlIGVhY2ggcGFja2V0IGZvciBzZW5kaW5nLCBhbmQgYWRkIHRvIHJlbGV2YW50IHF1ZXVlOiAqLwogCXNrYl9xdWV1ZV93YWxrX3NhZmUobGlzdCwgc2tiLCB0bXApIHsKIAkJX19za2JfdW5saW5rKHNrYiwgbGlzdCk7CiAJCW1zZyA9IGJ1Zl9tc2coc2tiKTsKLQkJbXNnX3NldF93b3JkKG1zZywgMiwgKChhY2sgPDwgMTYpIHwgbW9kKHNlcW5vKSkpOworCQltc2dfc2V0X3NlcW5vKG1zZywgc2Vxbm8pOworCQltc2dfc2V0X2Fjayhtc2csIGFjayk7CiAJCW1zZ19zZXRfYmNhc3RfYWNrKG1zZywgYmNfbGFzdF9pbik7CiAKLQkJaWYgKHNrYl9xdWV1ZV9sZW4ob3V0cXVldWUpIDwgc25kbGltKSB7Ci0JCQlfX3NrYl9xdWV1ZV90YWlsKG91dHF1ZXVlLCBza2IpOwotCQkJdGlwY19iZWFyZXJfc2VuZChuZXQsIGxpbmstPmJlYXJlcl9pZCwKLQkJCQkJIHNrYiwgYWRkcik7Ci0JCQlsaW5rLT5uZXh0X291dCA9IE5VTEw7Ci0JCQlsaW5rLT51bmFja2VkX3dpbmRvdyA9IDA7Ci0JCX0gZWxzZSBpZiAodGlwY19tc2dfYnVuZGxlKG91dHF1ZXVlLCBza2IsIG10dSkpIHsKKwkJaWYgKGxpa2VseShza2JfcXVldWVfbGVuKHRyYW5zbXEpIDwgbWF4d2luKSkgeworCQkJX19za2JfcXVldWVfdGFpbCh0cmFuc21xLCBza2IpOworCQkJdGlwY19iZWFyZXJfc2VuZChuZXQsIGxpbmstPmJlYXJlcl9pZCwgc2tiLCBhZGRyKTsKKwkJCWxpbmstPnJjdl91bmFja2VkID0gMDsKKwkJCXNlcW5vKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAodGlwY19tc2dfYnVuZGxlKHNrYl9wZWVrX3RhaWwoYmFja2xvZ3EpLCBza2IsIG10dSkpIHsKIAkJCWxpbmstPnN0YXRzLnNlbnRfYnVuZGxlZCsrOwogCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAodGlwY19tc2dfbWFrZV9idW5kbGUob3V0cXVldWUsIHNrYiwgbXR1LAotCQkJCQkJbGluay0+YWRkcikpIHsKKwkJfQorCQlpZiAodGlwY19tc2dfbWFrZV9idW5kbGUoJnNrYiwgbXR1LCBsaW5rLT5hZGRyKSkgewogCQkJbGluay0+c3RhdHMuc2VudF9idW5kbGVkKys7CiAJCQlsaW5rLT5zdGF0cy5zZW50X2J1bmRsZXMrKzsKLQkJCWlmICghbGluay0+bmV4dF9vdXQpCi0JCQkJbGluay0+bmV4dF9vdXQgPSBza2JfcGVla190YWlsKG91dHF1ZXVlKTsKLQkJfSBlbHNlIHsKLQkJCV9fc2tiX3F1ZXVlX3RhaWwob3V0cXVldWUsIHNrYik7Ci0JCQlpZiAoIWxpbmstPm5leHRfb3V0KQotCQkJCWxpbmstPm5leHRfb3V0ID0gc2tiOworCQkJaW1wID0gbXNnX2ltcG9ydGFuY2UoYnVmX21zZyhza2IpKTsKIAkJfQorCQlfX3NrYl9xdWV1ZV90YWlsKGJhY2tsb2dxLCBza2IpOworCQlsaW5rLT5iYWNrbG9nW2ltcF0ubGVuKys7CiAJCXNlcW5vKys7CiAJfQogCWxpbmstPm5leHRfb3V0X25vID0gc2Vxbm87CkBAIC04MDgsMTMgKzc2NSwyNSBAQAogCXJldHVybiBfX3RpcGNfbGlua194bWl0KGxpbmstPm93bmVyLT5uZXQsIGxpbmssICZoZWFkKTsKIH0KIAorLyogdGlwY19saW5rX3htaXRfc2tiKCk6IHNlbmQgc2luZ2xlIGJ1ZmZlciB0byBkZXN0aW5hdGlvbgorICogQnVmZmVycyBzZW50IHZpYSB0aGlzIGZ1bmN0b24gYXJlIGdlbmVyYWxseSBUSVBDX1NZU1RFTV9JTVBPUlRBTkNFCisgKiBtZXNzYWdlcywgd2hpY2ggd2lsbCBub3QgYmUgcmVqZWN0ZWQKKyAqIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBkYXRhZ3JhbSBtZXNzYWdlcyByZXJvdXRlZCBhZnRlciBzZWNvbmRhcnkKKyAqIGxvb2t1cCwgd2hpY2ggYXJlIHJhcmUgYW5kIHNhZmUgdG8gZGlzcG9zZSBvZiBhbnl3YXkuCisgKiBUT0RPOiBSZXR1cm4gcmVhbCByZXR1cm4gdmFsdWUsIGFuZCBsZXQgY2FsbGVycyB1c2UKKyAqIHRpcGNfd2FpdF9mb3Jfc2VuZHBrdCgpIHdoZXJlIGFwcGxpY2FibGUKKyAqLwogaW50IHRpcGNfbGlua194bWl0X3NrYihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBkbm9kZSwKIAkJICAgICAgIHUzMiBzZWxlY3RvcikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGhlYWQ7CisJaW50IHJjOwogCiAJc2tiMmxpc3Qoc2tiLCAmaGVhZCk7Ci0JcmV0dXJuIHRpcGNfbGlua194bWl0KG5ldCwgJmhlYWQsIGRub2RlLCBzZWxlY3Rvcik7CisJcmMgPSB0aXBjX2xpbmtfeG1pdChuZXQsICZoZWFkLCBkbm9kZSwgc2VsZWN0b3IpOworCWlmIChyYyA9PSAtRUxJTktDT05HKQorCQlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC04NDEsMTIgKzgxMCwxNSBAQAogCQlpZiAobGluaykKIAkJCXJjID0gX190aXBjX2xpbmtfeG1pdChuZXQsIGxpbmssIGxpc3QpOwogCQl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOworCQl0aXBjX25vZGVfcHV0KG5vZGUpOwogCX0KIAlpZiAobGluaykKIAkJcmV0dXJuIHJjOwogCi0JaWYgKGxpa2VseShpbl9vd25fbm9kZShuZXQsIGRub2RlKSkpCi0JCXJldHVybiB0aXBjX3NrX3JjdihuZXQsIGxpc3QpOworCWlmIChsaWtlbHkoaW5fb3duX25vZGUobmV0LCBkbm9kZSkpKSB7CisJCXRpcGNfc2tfcmN2KG5ldCwgbGlzdCk7CisJCXJldHVybiAwOworCX0KIAogCV9fc2tiX3F1ZXVlX3B1cmdlKGxpc3QpOwogCXJldHVybiByYzsKQEAgLTg5MywxNCArODY1LDYgQEAKIAlrZnJlZV9za2IoYnVmKTsKIH0KIAotc3RydWN0IHNrX2J1ZmYgKnRpcGNfc2tiX3F1ZXVlX25leHQoY29uc3Qgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCwKLQkJCQkgICAgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlpZiAoc2tiX3F1ZXVlX2lzX2xhc3QobGlzdCwgc2tiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuIHNrYi0+bmV4dDsKLX0KLQogLyoKICAqIHRpcGNfbGlua19wdXNoX3BhY2tldHMgLSBwdXNoIHVuc2VudCBwYWNrZXRzIHRvIGJlYXJlcgogICoKQEAgLTkwOSwzMCArODczLDI0IEBACiAgKgogICogQ2FsbGVkIHdpdGggbm9kZSBsb2NrZWQKICAqLwotdm9pZCB0aXBjX2xpbmtfcHVzaF9wYWNrZXRzKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQordm9pZCB0aXBjX2xpbmtfcHVzaF9wYWNrZXRzKHN0cnVjdCB0aXBjX2xpbmsgKmxpbmspCiB7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZCAqb3V0cXVldWUgPSAmbF9wdHItPm91dHF1ZXVlOwotCXN0cnVjdCBza19idWZmICpza2IgPSBsX3B0ci0+bmV4dF9vdXQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKLQl1MzIgbmV4dCwgZmlyc3Q7CisJdW5zaWduZWQgaW50IGFjayA9IG1vZChsaW5rLT5uZXh0X2luX25vIC0gMSk7CiAKLQlza2JfcXVldWVfd2Fsa19mcm9tKG91dHF1ZXVlLCBza2IpIHsKLQkJbXNnID0gYnVmX21zZyhza2IpOwotCQluZXh0ID0gbXNnX3NlcW5vKG1zZyk7Ci0JCWZpcnN0ID0gYnVmX3NlcW5vKHNrYl9wZWVrKG91dHF1ZXVlKSk7Ci0KLQkJaWYgKG1vZChuZXh0IC0gZmlyc3QpIDwgbF9wdHItPnF1ZXVlX2xpbWl0WzBdKSB7Ci0JCQltc2dfc2V0X2Fjayhtc2csIG1vZChsX3B0ci0+bmV4dF9pbl9ubyAtIDEpKTsKLQkJCW1zZ19zZXRfYmNhc3RfYWNrKG1zZywgbF9wdHItPm93bmVyLT5iY2xpbmsubGFzdF9pbik7Ci0JCQlpZiAobXNnX3VzZXIobXNnKSA9PSBNU0dfQlVORExFUikKLQkJCQlUSVBDX1NLQl9DQihza2IpLT5idW5kbGluZyA9IGZhbHNlOwotCQkJdGlwY19iZWFyZXJfc2VuZChsX3B0ci0+b3duZXItPm5ldCwKLQkJCQkJIGxfcHRyLT5iZWFyZXJfaWQsIHNrYiwKLQkJCQkJICZsX3B0ci0+bWVkaWFfYWRkcik7Ci0JCQlsX3B0ci0+bmV4dF9vdXQgPSB0aXBjX3NrYl9xdWV1ZV9uZXh0KG91dHF1ZXVlLCBza2IpOwotCQl9IGVsc2UgeworCXdoaWxlIChza2JfcXVldWVfbGVuKCZsaW5rLT50cmFuc21xKSA8IGxpbmstPndpbmRvdykgeworCQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZsaW5rLT5iYWNrbG9ncSk7CisJCWlmICghc2tiKQogCQkJYnJlYWs7Ci0JCX0KKwkJbXNnID0gYnVmX21zZyhza2IpOworCQlsaW5rLT5iYWNrbG9nW21zZ19pbXBvcnRhbmNlKG1zZyldLmxlbi0tOworCQltc2dfc2V0X2Fjayhtc2csIGFjayk7CisJCW1zZ19zZXRfYmNhc3RfYWNrKG1zZywgbGluay0+b3duZXItPmJjbGluay5sYXN0X2luKTsKKwkJbGluay0+cmN2X3VuYWNrZWQgPSAwOworCQlfX3NrYl9xdWV1ZV90YWlsKCZsaW5rLT50cmFuc21xLCBza2IpOworCQl0aXBjX2JlYXJlcl9zZW5kKGxpbmstPm93bmVyLT5uZXQsIGxpbmstPmJlYXJlcl9pZCwKKwkJCQkgc2tiLCAmbGluay0+bWVkaWFfYWRkcik7CiAJfQogfQogCkBAIC05NzksNyArOTM3LDYgQEAKIAkJCSh1bnNpZ25lZCBsb25nKSBUSVBDX1NLQl9DQihidWYpLT5oYW5kbGUpOwogCiAJCW5fcHRyID0gdGlwY19iY2xpbmtfcmV0cmFuc21pdF90byhuZXQpOwotCQl0aXBjX25vZGVfbG9jayhuX3B0cik7CiAKIAkJdGlwY19hZGRyX3N0cmluZ19maWxsKGFkZHJfc3RyaW5nLCBuX3B0ci0+YWRkcik7CiAJCXByX2luZm8oIkJyb2FkY2FzdCBsaW5rIGluZm8gZm9yICVzXG4iLCBhZGRyX3N0cmluZyk7CkBAIC05OTEsOSArOTQ4LDcgQEAKIAkJCW5fcHRyLT5iY2xpbmsub29zX3N0YXRlLAogCQkJbl9wdHItPmJjbGluay5sYXN0X3NlbnQpOwogCi0JCXRpcGNfbm9kZV91bmxvY2sobl9wdHIpOwotCi0JCXRpcGNfYmNsaW5rX3NldF9mbGFncyhuZXQsIFRJUENfQkNMSU5LX1JFU0VUKTsKKwkJbl9wdHItPmFjdGlvbl9mbGFncyB8PSBUSVBDX0JDQVNUX1JFU0VUOwogCQlsX3B0ci0+c3RhbGVfY291bnQgPSAwOwogCX0KIH0KQEAgLTEwMTksOCArOTc0LDggQEAKIAkJbF9wdHItPnN0YWxlX2NvdW50ID0gMTsKIAl9CiAKLQlza2JfcXVldWVfd2Fsa19mcm9tKCZsX3B0ci0+b3V0cXVldWUsIHNrYikgewotCQlpZiAoIXJldHJhbnNtaXRzIHx8IHNrYiA9PSBsX3B0ci0+bmV4dF9vdXQpCisJc2tiX3F1ZXVlX3dhbGtfZnJvbSgmbF9wdHItPnRyYW5zbXEsIHNrYikgeworCQlpZiAoIXJldHJhbnNtaXRzKQogCQkJYnJlYWs7CiAJCW1zZyA9IGJ1Zl9tc2coc2tiKTsKIAkJbXNnX3NldF9hY2sobXNnLCBtb2QobF9wdHItPm5leHRfaW5fbm8gLSAxKSk7CkBAIC0xMDMyLDcyICs5ODcsNDMgQEAKIAl9CiB9CiAKKy8qIGxpbmtfc3luY2goKTogY2hlY2sgaWYgYWxsIHBhY2tldHMgYXJyaXZlZCBiZWZvcmUgdGhlIHN5bmNoCisgKiAgICAgICAgICAgICAgIHBvaW50IGhhdmUgYmVlbiBjb25zdW1lZAorICogUmV0dXJucyB0cnVlIGlmIHRoZSBwYXJhbGxlbCBsaW5rcyBhcmUgc3luY2hlZCwgb3RoZXJ3aXNlIGZhbHNlCisgKi8KK3N0YXRpYyBib29sIGxpbmtfc3luY2goc3RydWN0IHRpcGNfbGluayAqbCkKK3sKKwl1bnNpZ25lZCBpbnQgcG9zdF9zeW5jaDsKKwlzdHJ1Y3QgdGlwY19saW5rICpwbDsKKworCXBsICA9IHRpcGNfcGFyYWxsZWxfbGluayhsKTsKKwlpZiAocGwgPT0gbCkKKwkJZ290byBzeW5jaGVkOworCisJLyogV2FzIGxhc3QgcHJlLXN5bmNoIHBhY2tldCBhZGRlZCB0byBpbnB1dCBxdWV1ZSA/ICovCisJaWYgKGxlc3NfZXEocGwtPm5leHRfaW5fbm8sIGwtPnN5bmNoX3BvaW50KSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogSXMgaXQgc3RpbGwgaW4gdGhlIGlucHV0IHF1ZXVlID8gKi8KKwlwb3N0X3N5bmNoID0gbW9kKHBsLT5uZXh0X2luX25vIC0gbC0+c3luY2hfcG9pbnQpIC0gMTsKKwlpZiAoc2tiX3F1ZXVlX2xlbigmcGwtPmlucHV0cSkgPiBwb3N0X3N5bmNoKQorCQlyZXR1cm4gZmFsc2U7CitzeW5jaGVkOgorCWwtPmZsYWdzICY9IH5MSU5LX1NZTkNISU5HOworCXJldHVybiB0cnVlOworfQorCiBzdGF0aWMgdm9pZCBsaW5rX3JldHJpZXZlX2RlZnEoc3RydWN0IHRpcGNfbGluayAqbGluaywKIAkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0KQogewogCXUzMiBzZXFfbm87CiAKLQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZsaW5rLT5kZWZlcnJlZF9xdWV1ZSkpCisJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmbGluay0+ZGVmZXJkcSkpCiAJCXJldHVybjsKIAotCXNlcV9ubyA9IGJ1Zl9zZXFubyhza2JfcGVlaygmbGluay0+ZGVmZXJyZWRfcXVldWUpKTsKKwlzZXFfbm8gPSBidWZfc2Vxbm8oc2tiX3BlZWsoJmxpbmstPmRlZmVyZHEpKTsKIAlpZiAoc2VxX25vID09IG1vZChsaW5rLT5uZXh0X2luX25vKSkKLQkJc2tiX3F1ZXVlX3NwbGljZV90YWlsX2luaXQoJmxpbmstPmRlZmVycmVkX3F1ZXVlLCBsaXN0KTsKLX0KLQotLyoqCi0gKiBsaW5rX3JlY3ZfYnVmX3ZhbGlkYXRlIC0gdmFsaWRhdGUgYmFzaWMgZm9ybWF0IG9mIHJlY2VpdmVkIG1lc3NhZ2UKLSAqCi0gKiBUaGlzIHJvdXRpbmUgZW5zdXJlcyBhIFRJUEMgbWVzc2FnZSBoYXMgYW4gYWNjZXB0YWJsZSBoZWFkZXIsIGFuZCBhdCBsZWFzdAotICogYXMgbXVjaCBkYXRhIGFzIHRoZSBoZWFkZXIgaW5kaWNhdGVzIGl0IHNob3VsZC4gIFRoZSByb3V0aW5lIGFsc28gZW5zdXJlcwotICogdGhhdCB0aGUgZW50aXJlIG1lc3NhZ2UgaGVhZGVyIGlzIHN0b3JlZCBpbiB0aGUgbWFpbiBmcmFnbWVudCBvZiB0aGUgbWVzc2FnZQotICogYnVmZmVyLCB0byBzaW1wbGlmeSBmdXR1cmUgYWNjZXNzIHRvIG1lc3NhZ2UgaGVhZGVyIGZpZWxkcy4KLSAqCi0gKiBOb3RlOiBIYXZpbmcgZXh0cmEgaW5mbyBwcmVzZW50IGluIHRoZSBtZXNzYWdlIGhlYWRlciBvciBkYXRhIGFyZWFzIGlzIE9LLgotICogVElQQyB3aWxsIGlnbm9yZSB0aGUgZXhjZXNzLCB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IGl0IGlzIG9wdGlvbmFsIGluZm8KLSAqIGludHJvZHVjZWQgYnkgYSBsYXRlciByZWxlYXNlIG9mIHRoZSBwcm90b2NvbC4KLSAqLwotc3RhdGljIGludCBsaW5rX3JlY3ZfYnVmX3ZhbGlkYXRlKHN0cnVjdCBza19idWZmICpidWYpCi17Ci0Jc3RhdGljIHUzMiBtaW5fZGF0YV9oZHJfc2l6ZVs4XSA9IHsKLQkJU0hPUlRfSF9TSVpFLCBNQ0FTVF9IX1NJWkUsIE5BTUVEX0hfU0laRSwgQkFTSUNfSF9TSVpFLAotCQlNQVhfSF9TSVpFLCBNQVhfSF9TSVpFLCBNQVhfSF9TSVpFLCBNQVhfSF9TSVpFCi0JCX07Ci0KLQlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKLQl1MzIgdGlwY19oZHJbMl07Ci0JdTMyIHNpemU7Ci0JdTMyIGhkcl9zaXplOwotCXUzMiBtaW5faGRyX3NpemU7Ci0KLQkvKiBJZiB0aGlzIHBhY2tldCBjb21lcyBmcm9tIHRoZSBkZWZlciBxdWV1ZSwgdGhlIHNrYiBoYXMgYWxyZWFkeQotCSAqIGJlZW4gdmFsaWRhdGVkCi0JICovCi0JaWYgKHVubGlrZWx5KFRJUENfU0tCX0NCKGJ1ZiktPmRlZmVycmVkKSkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAodW5saWtlbHkoYnVmLT5sZW4gPCBNSU5fSF9TSVpFKSkKLQkJcmV0dXJuIDA7Ci0KLQltc2cgPSBza2JfaGVhZGVyX3BvaW50ZXIoYnVmLCAwLCBzaXplb2YodGlwY19oZHIpLCB0aXBjX2hkcik7Ci0JaWYgKG1zZyA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCWlmICh1bmxpa2VseShtc2dfdmVyc2lvbihtc2cpICE9IFRJUENfVkVSU0lPTikpCi0JCXJldHVybiAwOwotCi0Jc2l6ZSA9IG1zZ19zaXplKG1zZyk7Ci0JaGRyX3NpemUgPSBtc2dfaGRyX3N6KG1zZyk7Ci0JbWluX2hkcl9zaXplID0gbXNnX2lzZGF0YShtc2cpID8KLQkJbWluX2RhdGFfaGRyX3NpemVbbXNnX3R5cGUobXNnKV0gOiBJTlRfSF9TSVpFOwotCi0JaWYgKHVubGlrZWx5KChoZHJfc2l6ZSA8IG1pbl9oZHJfc2l6ZSkgfHwKLQkJICAgICAoc2l6ZSA8IGhkcl9zaXplKSB8fAotCQkgICAgIChidWYtPmxlbiA8IHNpemUpIHx8Ci0JCSAgICAgKHNpemUgLSBoZHJfc2l6ZSA+IFRJUENfTUFYX1VTRVJfTVNHX1NJWkUpKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gcHNrYl9tYXlfcHVsbChidWYsIGhkcl9zaXplKTsKKwkJc2tiX3F1ZXVlX3NwbGljZV90YWlsX2luaXQoJmxpbmstPmRlZmVyZHEsIGxpc3QpOwogfQogCiAvKioKQEAgLTExMjUsMTYgKzEwNTEsMTEgQEAKIAogCXdoaWxlICgoc2tiID0gX19za2JfZGVxdWV1ZSgmaGVhZCkpKSB7CiAJCS8qIEVuc3VyZSBtZXNzYWdlIGlzIHdlbGwtZm9ybWVkICovCi0JCWlmICh1bmxpa2VseSghbGlua19yZWN2X2J1Zl92YWxpZGF0ZShza2IpKSkKLQkJCWdvdG8gZGlzY2FyZDsKLQotCQkvKiBFbnN1cmUgbWVzc2FnZSBkYXRhIGlzIGEgc2luZ2xlIGNvbnRpZ3VvdXMgdW5pdCAqLwotCQlpZiAodW5saWtlbHkoc2tiX2xpbmVhcml6ZShza2IpKSkKKwkJaWYgKHVubGlrZWx5KCF0aXBjX21zZ192YWxpZGF0ZShza2IpKSkKIAkJCWdvdG8gZGlzY2FyZDsKIAogCQkvKiBIYW5kbGUgYXJyaXZhbCBvZiBhIG5vbi11bmljYXN0IGxpbmsgbWVzc2FnZSAqLwogCQltc2cgPSBidWZfbXNnKHNrYik7Ci0KIAkJaWYgKHVubGlrZWx5KG1zZ19ub25fc2VxKG1zZykpKSB7CiAJCQlpZiAobXNnX3VzZXIobXNnKSA9PSAgTElOS19DT05GSUcpCiAJCQkJdGlwY19kaXNjX3JjdihuZXQsIHNrYiwgYl9wdHIpOwpAQCAtMTE1Miw4ICsxMDczLDggQEAKIAkJbl9wdHIgPSB0aXBjX25vZGVfZmluZChuZXQsIG1zZ19wcmV2bm9kZShtc2cpKTsKIAkJaWYgKHVubGlrZWx5KCFuX3B0cikpCiAJCQlnb3RvIGRpc2NhcmQ7Ci0JCXRpcGNfbm9kZV9sb2NrKG5fcHRyKTsKIAorCQl0aXBjX25vZGVfbG9jayhuX3B0cik7CiAJCS8qIExvY2F0ZSB1bmljYXN0IGxpbmsgZW5kcG9pbnQgdGhhdCBzaG91bGQgaGFuZGxlIG1lc3NhZ2UgKi8KIAkJbF9wdHIgPSBuX3B0ci0+bGlua3NbYl9wdHItPmlkZW50aXR5XTsKIAkJaWYgKHVubGlrZWx5KCFsX3B0cikpCkBAIC0xMTc1LDIxICsxMDk2LDIwIEBACiAJCWFja2QgPSBtc2dfYWNrKG1zZyk7CiAKIAkJLyogUmVsZWFzZSBhY2tlZCBtZXNzYWdlcyAqLwotCQlpZiAobl9wdHItPmJjbGluay5yZWN2X3Blcm1pdHRlZCkKKwkJaWYgKHVubGlrZWx5KG5fcHRyLT5iY2xpbmsuYWNrZWQgIT0gbXNnX2JjYXN0X2Fjayhtc2cpKSkKIAkJCXRpcGNfYmNsaW5rX2Fja25vd2xlZGdlKG5fcHRyLCBtc2dfYmNhc3RfYWNrKG1zZykpOwogCiAJCXJlbGVhc2VkID0gMDsKLQkJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmbF9wdHItPm91dHF1ZXVlLCBza2IxLCB0bXApIHsKLQkJCWlmIChza2IxID09IGxfcHRyLT5uZXh0X291dCB8fAotCQkJICAgIG1vcmUoYnVmX3NlcW5vKHNrYjEpLCBhY2tkKSkKKwkJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmbF9wdHItPnRyYW5zbXEsIHNrYjEsIHRtcCkgeworCQkJaWYgKG1vcmUoYnVmX3NlcW5vKHNrYjEpLCBhY2tkKSkKIAkJCQlicmVhazsKLQkJCSBfX3NrYl91bmxpbmsoc2tiMSwgJmxfcHRyLT5vdXRxdWV1ZSk7CisJCQkgX19za2JfdW5saW5rKHNrYjEsICZsX3B0ci0+dHJhbnNtcSk7CiAJCQkga2ZyZWVfc2tiKHNrYjEpOwogCQkJIHJlbGVhc2VkID0gMTsKIAkJfQogCiAJCS8qIFRyeSBzZW5kaW5nIGFueSBtZXNzYWdlcyBsaW5rIGVuZHBvaW50IGhhcyBwZW5kaW5nICovCi0JCWlmICh1bmxpa2VseShsX3B0ci0+bmV4dF9vdXQpKQorCQlpZiAodW5saWtlbHkoc2tiX3F1ZXVlX2xlbigmbF9wdHItPmJhY2tsb2dxKSkpCiAJCQl0aXBjX2xpbmtfcHVzaF9wYWNrZXRzKGxfcHRyKTsKIAogCQlpZiAocmVsZWFzZWQgJiYgIXNrYl9xdWV1ZV9lbXB0eSgmbF9wdHItPndha2V1cHEpKQpAQCAtMTIyMywxOCArMTE0MywyNiBAQAogCQkJc2tiID0gTlVMTDsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CisJCS8qIFN5bmNocm9uaXplIHdpdGggcGFyYWxsZWwgbGluayBpZiBhcHBsaWNhYmxlICovCisJCWlmICh1bmxpa2VseSgobF9wdHItPmZsYWdzICYgTElOS19TWU5DSElORykgJiYgIW1zZ19kdXAobXNnKSkpIHsKKwkJCWxpbmtfaGFuZGxlX291dF9vZl9zZXFfbXNnKGxfcHRyLCBza2IpOworCQkJaWYgKGxpbmtfc3luY2gobF9wdHIpKQorCQkJCWxpbmtfcmV0cmlldmVfZGVmcShsX3B0ciwgJmhlYWQpOworCQkJc2tiID0gTlVMTDsKKwkJCWdvdG8gdW5sb2NrOworCQl9CiAJCWxfcHRyLT5uZXh0X2luX25vKys7Ci0JCWlmICh1bmxpa2VseSghc2tiX3F1ZXVlX2VtcHR5KCZsX3B0ci0+ZGVmZXJyZWRfcXVldWUpKSkKKwkJaWYgKHVubGlrZWx5KCFza2JfcXVldWVfZW1wdHkoJmxfcHRyLT5kZWZlcmRxKSkpCiAJCQlsaW5rX3JldHJpZXZlX2RlZnEobF9wdHIsICZoZWFkKTsKLQotCQlpZiAodW5saWtlbHkoKytsX3B0ci0+dW5hY2tlZF93aW5kb3cgPj0gVElQQ19NSU5fTElOS19XSU4pKSB7CisJCWlmICh1bmxpa2VseSgrK2xfcHRyLT5yY3ZfdW5hY2tlZCA+PSBUSVBDX01JTl9MSU5LX1dJTikpIHsKIAkJCWxfcHRyLT5zdGF0cy5zZW50X2Fja3MrKzsKLQkJCXRpcGNfbGlua19wcm90b194bWl0KGxfcHRyLCBTVEFURV9NU0csIDAsIDAsIDAsIDAsIDApOworCQkJdGlwY19saW5rX3Byb3RvX3htaXQobF9wdHIsIFNUQVRFX01TRywgMCwgMCwgMCwgMCk7CiAJCX0KIAkJdGlwY19saW5rX2lucHV0KGxfcHRyLCBza2IpOwogCQlza2IgPSBOVUxMOwogdW5sb2NrOgogCQl0aXBjX25vZGVfdW5sb2NrKG5fcHRyKTsKKwkJdGlwY19ub2RlX3B1dChuX3B0cik7CiBkaXNjYXJkOgogCQlpZiAodW5saWtlbHkoc2tiKSkKIAkJCWtmcmVlX3NrYihza2IpOwpAQCAtMTI3MSw3ICsxMTk5LDcgQEAKIAkJCW5vZGUtPmFjdGlvbl9mbGFncyB8PSBUSVBDX05BTUVEX01TR19FVlQ7CiAJCXJldHVybiB0cnVlOwogCWNhc2UgTVNHX0JVTkRMRVI6Ci0JY2FzZSBDSEFOR0VPVkVSX1BST1RPQ09MOgorCWNhc2UgVFVOTkVMX1BST1RPQ09MOgogCWNhc2UgTVNHX0ZSQUdNRU5URVI6CiAJY2FzZSBCQ0FTVF9QUk9UT0NPTDoKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTI5OCw4ICsxMjI2LDE0IEBACiAJCXJldHVybjsKIAogCXN3aXRjaCAobXNnX3VzZXIobXNnKSkgewotCWNhc2UgQ0hBTkdFT1ZFUl9QUk9UT0NPTDoKLQkJaWYgKCF0aXBjX2xpbmtfdHVubmVsX3Jjdihub2RlLCAmc2tiKSkKKwljYXNlIFRVTk5FTF9QUk9UT0NPTDoKKwkJaWYgKG1zZ19kdXAobXNnKSkgeworCQkJbGluay0+ZmxhZ3MgfD0gTElOS19TWU5DSElORzsKKwkJCWxpbmstPnN5bmNoX3BvaW50ID0gbXNnX3NlcW5vKG1zZ19nZXRfd3JhcHBlZChtc2cpKTsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCF0aXBjX2xpbmtfZmFpbG92ZXJfcmN2KGxpbmssICZza2IpKQogCQkJYnJlYWs7CiAJCWlmIChtc2dfdXNlcihidWZfbXNnKHNrYikpICE9IE1TR19CVU5ETEVSKSB7CiAJCQl0aXBjX2RhdGFfaW5wdXQobGluaywgc2tiKTsKQEAgLTEzOTQsMTEgKzEzMjgsMTAgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICh0aXBjX2xpbmtfZGVmZXJfcGt0KCZsX3B0ci0+ZGVmZXJyZWRfcXVldWUsIGJ1ZikpIHsKKwlpZiAodGlwY19saW5rX2RlZmVyX3BrdCgmbF9wdHItPmRlZmVyZHEsIGJ1ZikpIHsKIAkJbF9wdHItPnN0YXRzLmRlZmVycmVkX3JlY3YrKzsKLQkJVElQQ19TS0JfQ0IoYnVmKS0+ZGVmZXJyZWQgPSB0cnVlOwotCQlpZiAoKHNrYl9xdWV1ZV9sZW4oJmxfcHRyLT5kZWZlcnJlZF9xdWV1ZSkgJSAxNikgPT0gMSkKLQkJCXRpcGNfbGlua19wcm90b194bWl0KGxfcHRyLCBTVEFURV9NU0csIDAsIDAsIDAsIDAsIDApOworCQlpZiAoKHNrYl9xdWV1ZV9sZW4oJmxfcHRyLT5kZWZlcmRxKSAlIFRJUENfTUlOX0xJTktfV0lOKSA9PSAxKQorCQkJdGlwY19saW5rX3Byb3RvX3htaXQobF9wdHIsIFNUQVRFX01TRywgMCwgMCwgMCwgMCk7CiAJfSBlbHNlIHsKIAkJbF9wdHItPnN0YXRzLmR1cGxpY2F0ZXMrKzsKIAl9CkBAIC0xNDA4LDE1ICsxMzQxLDE1IEBACiAgKiBTZW5kIHByb3RvY29sIG1lc3NhZ2UgdG8gdGhlIG90aGVyIGVuZHBvaW50LgogICovCiB2b2lkIHRpcGNfbGlua19wcm90b194bWl0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLCB1MzIgbXNnX3R5cCwgaW50IHByb2JlX21zZywKLQkJCSAgdTMyIGdhcCwgdTMyIHRvbGVyYW5jZSwgdTMyIHByaW9yaXR5LCB1MzIgYWNrX210dSkKKwkJCSAgdTMyIGdhcCwgdTMyIHRvbGVyYW5jZSwgdTMyIHByaW9yaXR5KQogewogCXN0cnVjdCBza19idWZmICpidWYgPSBOVUxMOwogCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gbF9wdHItPnBtc2c7CiAJdTMyIG1zZ19zaXplID0gc2l6ZW9mKGxfcHRyLT5wcm90b19tc2cpOwogCWludCByX2ZsYWc7CiAKLQkvKiBEb24ndCBzZW5kIHByb3RvY29sIG1lc3NhZ2UgZHVyaW5nIGxpbmsgY2hhbmdlb3ZlciAqLwotCWlmIChsX3B0ci0+ZXhwX21zZ19jb3VudCkKKwkvKiBEb24ndCBzZW5kIHByb3RvY29sIG1lc3NhZ2UgZHVyaW5nIGxpbmsgZmFpbG92ZXIgKi8KKwlpZiAobF9wdHItPmZsYWdzICYgTElOS19GQUlMSU5HT1ZFUikKIAkJcmV0dXJuOwogCiAJLyogQWJvcnQgbm9uLVJFU0VUIHNlbmQgaWYgY29tbXVuaWNhdGlvbiB3aXRoIG5vZGUgaXMgcHJvaGliaXRlZCAqLwpAQCAtMTQzNCwxMSArMTM2NywxMSBAQAogCiAJCWlmICghdGlwY19saW5rX2lzX3VwKGxfcHRyKSkKIAkJCXJldHVybjsKLQkJaWYgKGxfcHRyLT5uZXh0X291dCkKLQkJCW5leHRfc2VudCA9IGJ1Zl9zZXFubyhsX3B0ci0+bmV4dF9vdXQpOworCQlpZiAoc2tiX3F1ZXVlX2xlbigmbF9wdHItPmJhY2tsb2dxKSkKKwkJCW5leHRfc2VudCA9IGJ1Zl9zZXFubyhza2JfcGVlaygmbF9wdHItPmJhY2tsb2dxKSk7CiAJCW1zZ19zZXRfbmV4dF9zZW50KG1zZywgbmV4dF9zZW50KTsKLQkJaWYgKCFza2JfcXVldWVfZW1wdHkoJmxfcHRyLT5kZWZlcnJlZF9xdWV1ZSkpIHsKLQkJCXUzMiByZWMgPSBidWZfc2Vxbm8oc2tiX3BlZWsoJmxfcHRyLT5kZWZlcnJlZF9xdWV1ZSkpOworCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmbF9wdHItPmRlZmVyZHEpKSB7CisJCQl1MzIgcmVjID0gYnVmX3NlcW5vKHNrYl9wZWVrKCZsX3B0ci0+ZGVmZXJkcSkpOwogCQkJZ2FwID0gbW9kKHJlYyAtIG1vZChsX3B0ci0+bmV4dF9pbl9ubykpOwogCQl9CiAJCW1zZ19zZXRfc2VxX2dhcChtc2csIGdhcCk7CkBAIC0xNDQ2LDM1ICsxMzc5LDIwIEBACiAJCQlsX3B0ci0+c3RhdHMuc2VudF9uYWNrcysrOwogCQltc2dfc2V0X2xpbmtfdG9sZXJhbmNlKG1zZywgdG9sZXJhbmNlKTsKIAkJbXNnX3NldF9saW5rcHJpbyhtc2csIHByaW9yaXR5KTsKLQkJbXNnX3NldF9tYXhfcGt0KG1zZywgYWNrX210dSk7CisJCW1zZ19zZXRfbWF4X3BrdChtc2csIGxfcHRyLT5tdHUpOwogCQltc2dfc2V0X2Fjayhtc2csIG1vZChsX3B0ci0+bmV4dF9pbl9ubyAtIDEpKTsKIAkJbXNnX3NldF9wcm9iZShtc2csIHByb2JlX21zZyAhPSAwKTsKLQkJaWYgKHByb2JlX21zZykgewotCQkJdTMyIG10dSA9IGxfcHRyLT5tYXhfcGt0OwotCi0JCQlpZiAoKG10dSA8IGxfcHRyLT5tYXhfcGt0X3RhcmdldCkgJiYKLQkJCSAgICBsaW5rX3dvcmtpbmdfd29ya2luZyhsX3B0cikgJiYKLQkJCSAgICBsX3B0ci0+ZnNtX21zZ19jbnQpIHsKLQkJCQltc2dfc2l6ZSA9IChtdHUgKyAobF9wdHItPm1heF9wa3RfdGFyZ2V0IC0gbXR1KS8yICsgMikgJiB+MzsKLQkJCQlpZiAobF9wdHItPm1heF9wa3RfcHJvYmVzID09IDEwKSB7Ci0JCQkJCWxfcHRyLT5tYXhfcGt0X3RhcmdldCA9IChtc2dfc2l6ZSAtIDQpOwotCQkJCQlsX3B0ci0+bWF4X3BrdF9wcm9iZXMgPSAwOwotCQkJCQltc2dfc2l6ZSA9IChtdHUgKyAobF9wdHItPm1heF9wa3RfdGFyZ2V0IC0gbXR1KS8yICsgMikgJiB+MzsKLQkJCQl9Ci0JCQkJbF9wdHItPm1heF9wa3RfcHJvYmVzKys7Ci0JCQl9Ci0KKwkJaWYgKHByb2JlX21zZykKIAkJCWxfcHRyLT5zdGF0cy5zZW50X3Byb2JlcysrOwotCQl9CiAJCWxfcHRyLT5zdGF0cy5zZW50X3N0YXRlcysrOwogCX0gZWxzZSB7CQkvKiBSRVNFVF9NU0cgb3IgQUNUSVZBVEVfTVNHICovCi0JCW1zZ19zZXRfYWNrKG1zZywgbW9kKGxfcHRyLT5yZXNldF9jaGVja3BvaW50IC0gMSkpOworCQltc2dfc2V0X2Fjayhtc2csIG1vZChsX3B0ci0+ZmFpbG92ZXJfY2hlY2twdCAtIDEpKTsKIAkJbXNnX3NldF9zZXFfZ2FwKG1zZywgMCk7CiAJCW1zZ19zZXRfbmV4dF9zZW50KG1zZywgMSk7CiAJCW1zZ19zZXRfcHJvYmUobXNnLCAwKTsKIAkJbXNnX3NldF9saW5rX3RvbGVyYW5jZShtc2csIGxfcHRyLT50b2xlcmFuY2UpOwogCQltc2dfc2V0X2xpbmtwcmlvKG1zZywgbF9wdHItPnByaW9yaXR5KTsKLQkJbXNnX3NldF9tYXhfcGt0KG1zZywgbF9wdHItPm1heF9wa3RfdGFyZ2V0KTsKKwkJbXNnX3NldF9tYXhfcGt0KG1zZywgbF9wdHItPmFkdmVydGlzZWRfbXR1KTsKIAl9CiAKIAlyX2ZsYWcgPSAobF9wdHItPm93bmVyLT53b3JraW5nX2xpbmtzID4gdGlwY19saW5rX2lzX3VwKGxfcHRyKSk7CkBAIC0xNDkwLDEwICsxNDA4LDkgQEAKIAogCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKGJ1ZiwgbXNnLCBzaXplb2YobF9wdHItPnByb3RvX21zZykpOwogCWJ1Zi0+cHJpb3JpdHkgPSBUQ19QUklPX0NPTlRST0w7Ci0KIAl0aXBjX2JlYXJlcl9zZW5kKGxfcHRyLT5vd25lci0+bmV0LCBsX3B0ci0+YmVhcmVyX2lkLCBidWYsCiAJCQkgJmxfcHRyLT5tZWRpYV9hZGRyKTsKLQlsX3B0ci0+dW5hY2tlZF93aW5kb3cgPSAwOworCWxfcHRyLT5yY3ZfdW5hY2tlZCA9IDA7CiAJa2ZyZWVfc2tiKGJ1Zik7CiB9CiAKQEAgLTE1MDYsMTMgKzE0MjMsMTAgQEAKIAkJCQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQogewogCXUzMiByZWNfZ2FwID0gMDsKLQl1MzIgbWF4X3BrdF9pbmZvOwotCXUzMiBtYXhfcGt0X2FjazsKIAl1MzIgbXNnX3RvbDsKIAlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKIAotCS8qIERpc2NhcmQgcHJvdG9jb2wgbWVzc2FnZSBkdXJpbmcgbGluayBjaGFuZ2VvdmVyICovCi0JaWYgKGxfcHRyLT5leHBfbXNnX2NvdW50KQorCWlmIChsX3B0ci0+ZmxhZ3MgJiBMSU5LX0ZBSUxJTkdPVkVSKQogCQlnb3RvIGV4aXQ7CiAKIAlpZiAobF9wdHItPm5ldF9wbGFuZSAhPSBtc2dfbmV0X3BsYW5lKG1zZykpCkBAIC0xNTUxLDE1ICsxNDY1LDggQEAKIAkJaWYgKG1zZ19saW5rcHJpbyhtc2cpID4gbF9wdHItPnByaW9yaXR5KQogCQkJbF9wdHItPnByaW9yaXR5ID0gbXNnX2xpbmtwcmlvKG1zZyk7CiAKLQkJbWF4X3BrdF9pbmZvID0gbXNnX21heF9wa3QobXNnKTsKLQkJaWYgKG1heF9wa3RfaW5mbykgewotCQkJaWYgKG1heF9wa3RfaW5mbyA8IGxfcHRyLT5tYXhfcGt0X3RhcmdldCkKLQkJCQlsX3B0ci0+bWF4X3BrdF90YXJnZXQgPSBtYXhfcGt0X2luZm87Ci0JCQlpZiAobF9wdHItPm1heF9wa3QgPiBsX3B0ci0+bWF4X3BrdF90YXJnZXQpCi0JCQkJbF9wdHItPm1heF9wa3QgPSBsX3B0ci0+bWF4X3BrdF90YXJnZXQ7Ci0JCX0gZWxzZSB7Ci0JCQlsX3B0ci0+bWF4X3BrdCA9IGxfcHRyLT5tYXhfcGt0X3RhcmdldDsKLQkJfQorCQlpZiAobF9wdHItPm10dSA+IG1zZ19tYXhfcGt0KG1zZykpCisJCQlsX3B0ci0+bXR1ID0gbXNnX21heF9wa3QobXNnKTsKIAogCQkvKiBTeW5jaHJvbml6ZSBicm9hZGNhc3QgbGluayBpbmZvLCBpZiBub3QgZG9uZSBwcmV2aW91c2x5ICovCiAJCWlmICghdGlwY19ub2RlX2lzX3VwKGxfcHRyLT5vd25lcikpIHsKQEAgLTE2MDQsMTggKzE1MTEsOCBAQAogCQkJCSAgICAgIG1vZChsX3B0ci0+bmV4dF9pbl9ubykpOwogCQl9CiAKLQkJbWF4X3BrdF9hY2sgPSBtc2dfbWF4X3BrdChtc2cpOwotCQlpZiAobWF4X3BrdF9hY2sgPiBsX3B0ci0+bWF4X3BrdCkgewotCQkJbF9wdHItPm1heF9wa3QgPSBtYXhfcGt0X2FjazsKLQkJCWxfcHRyLT5tYXhfcGt0X3Byb2JlcyA9IDA7Ci0JCX0KLQotCQltYXhfcGt0X2FjayA9IDA7Ci0JCWlmIChtc2dfcHJvYmUobXNnKSkgeworCQlpZiAobXNnX3Byb2JlKG1zZykpCiAJCQlsX3B0ci0+c3RhdHMucmVjdl9wcm9iZXMrKzsKLQkJCWlmIChtc2dfc2l6ZShtc2cpID4gc2l6ZW9mKGxfcHRyLT5wcm90b19tc2cpKQotCQkJCW1heF9wa3RfYWNrID0gbXNnX3NpemUobXNnKTsKLQkJfQogCiAJCS8qIFByb3RvY29sIG1lc3NhZ2UgYmVmb3JlIHJldHJhbnNtaXRzLCByZWR1Y2UgbG9zcyByaXNrICovCiAJCWlmIChsX3B0ci0+b3duZXItPmJjbGluay5yZWN2X3Blcm1pdHRlZCkKQEAgLTE2MjMsMTIgKzE1MjAsMTIgQEAKIAkJCQkJCSAgICAgIG1zZ19sYXN0X2JjYXN0KG1zZykpOwogCiAJCWlmIChyZWNfZ2FwIHx8IChtc2dfcHJvYmUobXNnKSkpIHsKLQkJCXRpcGNfbGlua19wcm90b194bWl0KGxfcHRyLCBTVEFURV9NU0csIDAsIHJlY19nYXAsIDAsCi0JCQkJCSAgICAgMCwgbWF4X3BrdF9hY2spOworCQkJdGlwY19saW5rX3Byb3RvX3htaXQobF9wdHIsIFNUQVRFX01TRywgMCwKKwkJCQkJICAgICByZWNfZ2FwLCAwLCAwKTsKIAkJfQogCQlpZiAobXNnX3NlcV9nYXAobXNnKSkgewogCQkJbF9wdHItPnN0YXRzLnJlY3ZfbmFja3MrKzsKLQkJCXRpcGNfbGlua19yZXRyYW5zbWl0KGxfcHRyLCBza2JfcGVlaygmbF9wdHItPm91dHF1ZXVlKSwKKwkJCXRpcGNfbGlua19yZXRyYW5zbWl0KGxfcHRyLCBza2JfcGVlaygmbF9wdHItPnRyYW5zbXEpLAogCQkJCQkgICAgIG1zZ19zZXFfZ2FwKG1zZykpOwogCQl9CiAJCWJyZWFrOwpAQCAtMTY3NSw3ICsxNTcyLDcgQEAKICAqLwogdm9pZCB0aXBjX2xpbmtfZmFpbG92ZXJfc2VuZF9xdWV1ZShzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKLQl1MzIgbXNnY291bnQgPSBza2JfcXVldWVfbGVuKCZsX3B0ci0+b3V0cXVldWUpOworCWludCBtc2djb3VudDsKIAlzdHJ1Y3QgdGlwY19saW5rICp0dW5uZWwgPSBsX3B0ci0+b3duZXItPmFjdGl2ZV9saW5rc1swXTsKIAlzdHJ1Y3QgdGlwY19tc2cgdHVubmVsX2hkcjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTY4NCwxMiArMTU4MSwxNSBAQAogCWlmICghdHVubmVsKQogCQlyZXR1cm47CiAKLQl0aXBjX21zZ19pbml0KGxpbmtfb3duX2FkZHIobF9wdHIpLCAmdHVubmVsX2hkciwgQ0hBTkdFT1ZFUl9QUk9UT0NPTCwKLQkJICAgICAgT1JJR0lOQUxfTVNHLCBJTlRfSF9TSVpFLCBsX3B0ci0+YWRkcik7CisJdGlwY19tc2dfaW5pdChsaW5rX293bl9hZGRyKGxfcHRyKSwgJnR1bm5lbF9oZHIsIFRVTk5FTF9QUk9UT0NPTCwKKwkJICAgICAgRkFJTE9WRVJfTVNHLCBJTlRfSF9TSVpFLCBsX3B0ci0+YWRkcik7CisJc2tiX3F1ZXVlX3NwbGljZV90YWlsX2luaXQoJmxfcHRyLT5iYWNrbG9ncSwgJmxfcHRyLT50cmFuc21xKTsKKwl0aXBjX2xpbmtfcHVyZ2VfYmFja2xvZyhsX3B0cik7CisJbXNnY291bnQgPSBza2JfcXVldWVfbGVuKCZsX3B0ci0+dHJhbnNtcSk7CiAJbXNnX3NldF9iZWFyZXJfaWQoJnR1bm5lbF9oZHIsIGxfcHRyLT5wZWVyX2JlYXJlcl9pZCk7CiAJbXNnX3NldF9tc2djbnQoJnR1bm5lbF9oZHIsIG1zZ2NvdW50KTsKIAotCWlmIChza2JfcXVldWVfZW1wdHkoJmxfcHRyLT5vdXRxdWV1ZSkpIHsKKwlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZsX3B0ci0+dHJhbnNtcSkpIHsKIAkJc2tiID0gdGlwY19idWZfYWNxdWlyZShJTlRfSF9TSVpFKTsKIAkJaWYgKHNrYikgewogCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoc2tiLCAmdHVubmVsX2hkciwgSU5UX0hfU0laRSk7CkBAIC0xNzA1LDcgKzE2MDUsNyBAQAogCXNwbGl0X2J1bmRsZXMgPSAobF9wdHItPm93bmVyLT5hY3RpdmVfbGlua3NbMF0gIT0KIAkJCSBsX3B0ci0+b3duZXItPmFjdGl2ZV9saW5rc1sxXSk7CiAKLQlza2JfcXVldWVfd2FsaygmbF9wdHItPm91dHF1ZXVlLCBza2IpIHsKKwlza2JfcXVldWVfd2FsaygmbF9wdHItPnRyYW5zbXEsIHNrYikgewogCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coc2tiKTsKIAogCQlpZiAoKG1zZ191c2VyKG1zZykgPT0gTVNHX0JVTkRMRVIpICYmIHNwbGl0X2J1bmRsZXMpIHsKQEAgLTE3MzYsMTU3ICsxNjM2LDEwNSBAQAogICogYW5kIHNlcXVlbmNlIG9yZGVyIGlzIHByZXNlcnZlZCBwZXIgc2VuZGVyL3JlY2VpdmVyIHNvY2tldCBwYWlyLgogICogT3duZXIgbm9kZSBpcyBsb2NrZWQuCiAgKi8KLXZvaWQgdGlwY19saW5rX2R1cF9xdWV1ZV94bWl0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLAotCQkJICAgICAgc3RydWN0IHRpcGNfbGluayAqdHVubmVsKQordm9pZCB0aXBjX2xpbmtfZHVwX3F1ZXVlX3htaXQoc3RydWN0IHRpcGNfbGluayAqbGluaywKKwkJCSAgICAgIHN0cnVjdCB0aXBjX2xpbmsgKnRubCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCXN0cnVjdCB0aXBjX21zZyB0dW5uZWxfaGRyOworCXN0cnVjdCB0aXBjX21zZyB0bmxfaGRyOworCXN0cnVjdCBza19idWZmX2hlYWQgKnF1ZXVlID0gJmxpbmstPnRyYW5zbXE7CisJaW50IG1jbnQ7CiAKLQl0aXBjX21zZ19pbml0KGxpbmtfb3duX2FkZHIobF9wdHIpLCAmdHVubmVsX2hkciwgQ0hBTkdFT1ZFUl9QUk9UT0NPTCwKLQkJICAgICAgRFVQTElDQVRFX01TRywgSU5UX0hfU0laRSwgbF9wdHItPmFkZHIpOwotCW1zZ19zZXRfbXNnY250KCZ0dW5uZWxfaGRyLCBza2JfcXVldWVfbGVuKCZsX3B0ci0+b3V0cXVldWUpKTsKLQltc2dfc2V0X2JlYXJlcl9pZCgmdHVubmVsX2hkciwgbF9wdHItPnBlZXJfYmVhcmVyX2lkKTsKLQlza2JfcXVldWVfd2FsaygmbF9wdHItPm91dHF1ZXVlLCBza2IpIHsKKwl0aXBjX21zZ19pbml0KGxpbmtfb3duX2FkZHIobGluayksICZ0bmxfaGRyLCBUVU5ORUxfUFJPVE9DT0wsCisJCSAgICAgIFNZTkNIX01TRywgSU5UX0hfU0laRSwgbGluay0+YWRkcik7CisJbWNudCA9IHNrYl9xdWV1ZV9sZW4oJmxpbmstPnRyYW5zbXEpICsgc2tiX3F1ZXVlX2xlbigmbGluay0+YmFja2xvZ3EpOworCW1zZ19zZXRfbXNnY250KCZ0bmxfaGRyLCBtY250KTsKKwltc2dfc2V0X2JlYXJlcl9pZCgmdG5sX2hkciwgbGluay0+cGVlcl9iZWFyZXJfaWQpOworCit0dW5uZWxfcXVldWU6CisJc2tiX3F1ZXVlX3dhbGsocXVldWUsIHNrYikgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqb3V0c2tiOwogCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coc2tiKTsKLQkJdTMyIGxlbmd0aCA9IG1zZ19zaXplKG1zZyk7CisJCXUzMiBsZW4gPSBtc2dfc2l6ZShtc2cpOwogCi0JCWlmIChtc2dfdXNlcihtc2cpID09IE1TR19CVU5ETEVSKQotCQkJbXNnX3NldF90eXBlKG1zZywgQ0xPU0VEX01TRyk7Ci0JCW1zZ19zZXRfYWNrKG1zZywgbW9kKGxfcHRyLT5uZXh0X2luX25vIC0gMSkpOwkvKiBVcGRhdGUgKi8KLQkJbXNnX3NldF9iY2FzdF9hY2sobXNnLCBsX3B0ci0+b3duZXItPmJjbGluay5sYXN0X2luKTsKLQkJbXNnX3NldF9zaXplKCZ0dW5uZWxfaGRyLCBsZW5ndGggKyBJTlRfSF9TSVpFKTsKLQkJb3V0c2tiID0gdGlwY19idWZfYWNxdWlyZShsZW5ndGggKyBJTlRfSF9TSVpFKTsKKwkJbXNnX3NldF9hY2sobXNnLCBtb2QobGluay0+bmV4dF9pbl9ubyAtIDEpKTsKKwkJbXNnX3NldF9iY2FzdF9hY2sobXNnLCBsaW5rLT5vd25lci0+YmNsaW5rLmxhc3RfaW4pOworCQltc2dfc2V0X3NpemUoJnRubF9oZHIsIGxlbiArIElOVF9IX1NJWkUpOworCQlvdXRza2IgPSB0aXBjX2J1Zl9hY3F1aXJlKGxlbiArIElOVF9IX1NJWkUpOwogCQlpZiAob3V0c2tiID09IE5VTEwpIHsKIAkJCXByX3dhcm4oIiVzdW5hYmxlIHRvIHNlbmQgZHVwbGljYXRlIG1zZ1xuIiwKIAkJCQlsaW5rX2NvX2Vycik7CiAJCQlyZXR1cm47CiAJCX0KLQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEob3V0c2tiLCAmdHVubmVsX2hkciwgSU5UX0hfU0laRSk7Ci0JCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhX29mZnNldChvdXRza2IsIElOVF9IX1NJWkUsIHNrYi0+ZGF0YSwKLQkJCQkJICAgICAgIGxlbmd0aCk7Ci0JCV9fdGlwY19saW5rX3htaXRfc2tiKHR1bm5lbCwgb3V0c2tiKTsKLQkJaWYgKCF0aXBjX2xpbmtfaXNfdXAobF9wdHIpKQorCQlza2JfY29weV90b19saW5lYXJfZGF0YShvdXRza2IsICZ0bmxfaGRyLCBJTlRfSF9TSVpFKTsKKwkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KG91dHNrYiwgSU5UX0hfU0laRSwKKwkJCQkJICAgICAgIHNrYi0+ZGF0YSwgbGVuKTsKKwkJX190aXBjX2xpbmtfeG1pdF9za2IodG5sLCBvdXRza2IpOworCQlpZiAoIXRpcGNfbGlua19pc191cChsaW5rKSkKIAkJCXJldHVybjsKIAl9Ci19Ci0KLS8qKgotICogYnVmX2V4dHJhY3QgLSBleHRyYWN0cyBlbWJlZGRlZCBUSVBDIG1lc3NhZ2UgZnJvbSBhbm90aGVyIG1lc3NhZ2UKLSAqIEBza2I6IGVuY2Fwc3VsYXRpbmcgbWVzc2FnZSBidWZmZXIKLSAqIEBmcm9tX3Bvczogb2Zmc2V0IHRvIGV4dHJhY3QgZnJvbQotICoKLSAqIFJldHVybnMgYSBuZXcgbWVzc2FnZSBidWZmZXIgY29udGFpbmluZyBhbiBlbWJlZGRlZCBtZXNzYWdlLiAgVGhlCi0gKiBlbmNhcHN1bGF0aW5nIGJ1ZmZlciBpcyBsZWZ0IHVuY2hhbmdlZC4KLSAqLwotc3RhdGljIHN0cnVjdCBza19idWZmICpidWZfZXh0cmFjdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZnJvbV9wb3MpCi17Ci0Jc3RydWN0IHRpcGNfbXNnICptc2cgPSAoc3RydWN0IHRpcGNfbXNnICopKHNrYi0+ZGF0YSArIGZyb21fcG9zKTsKLQl1MzIgc2l6ZSA9IG1zZ19zaXplKG1zZyk7Ci0Jc3RydWN0IHNrX2J1ZmYgKmViOwotCi0JZWIgPSB0aXBjX2J1Zl9hY3F1aXJlKHNpemUpOwotCWlmIChlYikKLQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGEoZWIsIG1zZywgc2l6ZSk7Ci0JcmV0dXJuIGViOwotfQotCi0vKiB0aXBjX2xpbmtfZHVwX3JjdigpOiBSZWNlaXZlIGEgdHVubmVsbGVkIERVUExJQ0FURV9NU0cgcGFja2V0LgotICogT3duZXIgbm9kZSBpcyBsb2NrZWQuCi0gKi8KLXN0YXRpYyB2b2lkIHRpcGNfbGlua19kdXBfcmN2KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLAotCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnRfYnVmKQotewotCXN0cnVjdCBza19idWZmICpidWY7Ci0KLQlpZiAoIXRpcGNfbGlua19pc191cChsX3B0cikpCisJaWYgKHF1ZXVlID09ICZsaW5rLT5iYWNrbG9ncSkKIAkJcmV0dXJuOwotCi0JYnVmID0gYnVmX2V4dHJhY3QodF9idWYsIElOVF9IX1NJWkUpOwotCWlmIChidWYgPT0gTlVMTCkgewotCQlwcl93YXJuKCIlc2ZhaWxlZCB0byBleHRyYWN0IGlubmVyIGR1cCBwa3RcbiIsIGxpbmtfY29fZXJyKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIEFkZCBidWZmZXIgdG8gZGVmZXJyZWQgcXVldWUsIGlmIGFwcGxpY2FibGU6ICovCi0JbGlua19oYW5kbGVfb3V0X29mX3NlcV9tc2cobF9wdHIsIGJ1Zik7CisJcXVldWUgPSAmbGluay0+YmFja2xvZ3E7CisJZ290byB0dW5uZWxfcXVldWU7CiB9CiAKLS8qICB0aXBjX2xpbmtfZmFpbG92ZXJfcmN2KCk6IFJlY2VpdmUgYSB0dW5uZWxsZWQgT1JJR0lOQUxfTVNHIHBhY2tldAorLyogIHRpcGNfbGlua19mYWlsb3Zlcl9yY3YoKTogUmVjZWl2ZSBhIHR1bm5lbGxlZCBGQUlMT1ZFUl9NU0cgcGFja2V0CiAgKiAgT3duZXIgbm9kZSBpcyBsb2NrZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19saW5rX2ZhaWxvdmVyX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwKLQkJCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnRfYnVmKQorc3RhdGljIGJvb2wgdGlwY19saW5rX2ZhaWxvdmVyX3JjdihzdHJ1Y3QgdGlwY19saW5rICpsaW5rLAorCQkJCSAgIHN0cnVjdCBza19idWZmICoqc2tiKQogewotCXN0cnVjdCB0aXBjX21zZyAqdF9tc2cgPSBidWZfbXNnKHRfYnVmKTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqYnVmID0gTlVMTDsKLQlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coKnNrYik7CisJc3RydWN0IHNrX2J1ZmYgKmlza2IgPSBOVUxMOworCXN0cnVjdCB0aXBjX2xpbmsgKnBsID0gTlVMTDsKKwlpbnQgYmVhcmVyX2lkID0gbXNnX2JlYXJlcl9pZChtc2cpOworCWludCBwb3MgPSAwOwogCi0JaWYgKHRpcGNfbGlua19pc191cChsX3B0cikpCi0JCXRpcGNfbGlua19yZXNldChsX3B0cik7Ci0KLQkvKiBGaXJzdCBmYWlsb3ZlciBwYWNrZXQ/ICovCi0JaWYgKGxfcHRyLT5leHBfbXNnX2NvdW50ID09IFNUQVJUX0NIQU5HRU9WRVIpCi0JCWxfcHRyLT5leHBfbXNnX2NvdW50ID0gbXNnX21zZ2NudCh0X21zZyk7Ci0KLQkvKiBTaG91bGQgdGhlcmUgYmUgYW4gaW5uZXIgcGFja2V0PyAqLwotCWlmIChsX3B0ci0+ZXhwX21zZ19jb3VudCkgewotCQlsX3B0ci0+ZXhwX21zZ19jb3VudC0tOwotCQlidWYgPSBidWZfZXh0cmFjdCh0X2J1ZiwgSU5UX0hfU0laRSk7Ci0JCWlmIChidWYgPT0gTlVMTCkgewotCQkJcHJfd2FybigiJXNubyBpbm5lciBmYWlsb3ZlciBwa3RcbiIsIGxpbmtfY29fZXJyKTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCQltc2cgPSBidWZfbXNnKGJ1Zik7Ci0KLQkJaWYgKGxlc3MobXNnX3NlcW5vKG1zZyksIGxfcHRyLT5yZXNldF9jaGVja3BvaW50KSkgewotCQkJa2ZyZWVfc2tiKGJ1Zik7Ci0JCQlidWYgPSBOVUxMOwotCQkJZ290byBleGl0OwotCQl9Ci0JCWlmIChtc2dfdXNlcihtc2cpID09IE1TR19GUkFHTUVOVEVSKSB7Ci0JCQlsX3B0ci0+c3RhdHMucmVjdl9mcmFnbWVudHMrKzsKLQkJCXRpcGNfYnVmX2FwcGVuZCgmbF9wdHItPnJlYXNtX2J1ZiwgJmJ1Zik7Ci0JCX0KKwlpZiAobXNnX3R5cGUobXNnKSAhPSBGQUlMT1ZFUl9NU0cpIHsKKwkJcHJfd2FybigiJXN1bmtub3duIHR1bm5lbCBwa3QgcmVjZWl2ZWRcbiIsIGxpbmtfY29fZXJyKTsKKwkJZ290byBleGl0OwogCX0KLWV4aXQ6Ci0JaWYgKCghbF9wdHItPmV4cF9tc2dfY291bnQpICYmIChsX3B0ci0+ZmxhZ3MgJiBMSU5LX1NUT1BQRUQpKQotCQl0aXBjX2xpbmtfZGVsZXRlKGxfcHRyKTsKLQlyZXR1cm4gYnVmOwotfQotCi0vKiAgdGlwY19saW5rX3R1bm5lbF9yY3YoKTogUmVjZWl2ZSBhIHR1bm5lbGxlZCBwYWNrZXQsIHNlbnQKLSAqICB2aWEgb3RoZXIgbGluayBhcyByZXN1bHQgb2YgYSBmYWlsb3ZlciAoT1JJR0lOQUxfTVNHKSBvcgotICogIGEgbmV3IGFjdGl2ZSBsaW5rIChEVVBMSUNBVEVfTVNHKS4gRmFpbG92ZXIgcGFja2V0cyBhcmUKLSAqICByZXR1cm5lZCB0byB0aGUgYWN0aXZlIGxpbmsgZm9yIGRlbGl2ZXJ5IHVwd2FyZHMuCi0gKiAgT3duZXIgbm9kZSBpcyBsb2NrZWQuCi0gKi8KLXN0YXRpYyBpbnQgdGlwY19saW5rX3R1bm5lbF9yY3Yoc3RydWN0IHRpcGNfbm9kZSAqbl9wdHIsCi0JCQkJc3RydWN0IHNrX2J1ZmYgKipidWYpCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnRfYnVmID0gKmJ1ZjsKLQlzdHJ1Y3QgdGlwY19saW5rICpsX3B0cjsKLQlzdHJ1Y3QgdGlwY19tc2cgKnRfbXNnID0gYnVmX21zZyh0X2J1Zik7Ci0JdTMyIGJlYXJlcl9pZCA9IG1zZ19iZWFyZXJfaWQodF9tc2cpOwotCi0JKmJ1ZiA9IE5VTEw7Ci0KIAlpZiAoYmVhcmVyX2lkID49IE1BWF9CRUFSRVJTKQogCQlnb3RvIGV4aXQ7CiAKLQlsX3B0ciA9IG5fcHRyLT5saW5rc1tiZWFyZXJfaWRdOwotCWlmICghbF9wdHIpCisJaWYgKGJlYXJlcl9pZCA9PSBsaW5rLT5iZWFyZXJfaWQpCiAJCWdvdG8gZXhpdDsKIAotCWlmIChtc2dfdHlwZSh0X21zZykgPT0gRFVQTElDQVRFX01TRykKLQkJdGlwY19saW5rX2R1cF9yY3YobF9wdHIsIHRfYnVmKTsKLQllbHNlIGlmIChtc2dfdHlwZSh0X21zZykgPT0gT1JJR0lOQUxfTVNHKQotCQkqYnVmID0gdGlwY19saW5rX2ZhaWxvdmVyX3JjdihsX3B0ciwgdF9idWYpOwotCWVsc2UKLQkJcHJfd2FybigiJXN1bmtub3duIHR1bm5lbCBwa3QgcmVjZWl2ZWRcbiIsIGxpbmtfY29fZXJyKTsKKwlwbCA9IGxpbmstPm93bmVyLT5saW5rc1tiZWFyZXJfaWRdOworCWlmIChwbCAmJiB0aXBjX2xpbmtfaXNfdXAocGwpKQorCQl0aXBjX2xpbmtfcmVzZXQocGwpOworCisJaWYgKGxpbmstPmZhaWxvdmVyX3BrdHMgPT0gRklSU1RfRkFJTE9WRVIpCisJCWxpbmstPmZhaWxvdmVyX3BrdHMgPSBtc2dfbXNnY250KG1zZyk7CisKKwkvKiBTaG91bGQgd2UgZXhwZWN0IGFuIGlubmVyIHBhY2tldD8gKi8KKwlpZiAoIWxpbmstPmZhaWxvdmVyX3BrdHMpCisJCWdvdG8gZXhpdDsKKworCWlmICghdGlwY19tc2dfZXh0cmFjdCgqc2tiLCAmaXNrYiwgJnBvcykpIHsKKwkJcHJfd2FybigiJXNubyBpbm5lciBmYWlsb3ZlciBwa3RcbiIsIGxpbmtfY29fZXJyKTsKKwkJKnNrYiA9IE5VTEw7CisJCWdvdG8gZXhpdDsKKwl9CisJbGluay0+ZmFpbG92ZXJfcGt0cy0tOworCSpza2IgPSBOVUxMOworCisJLyogV2FzIHRoaXMgcGFja2V0IGFscmVhZHkgZGVsaXZlcmVkPyAqLworCWlmIChsZXNzKGJ1Zl9zZXFubyhpc2tiKSwgbGluay0+ZmFpbG92ZXJfY2hlY2twdCkpIHsKKwkJa2ZyZWVfc2tiKGlza2IpOworCQlpc2tiID0gTlVMTDsKKwkJZ290byBleGl0OworCX0KKwlpZiAobXNnX3VzZXIoYnVmX21zZyhpc2tiKSkgPT0gTVNHX0ZSQUdNRU5URVIpIHsKKwkJbGluay0+c3RhdHMucmVjdl9mcmFnbWVudHMrKzsKKwkJdGlwY19idWZfYXBwZW5kKCZsaW5rLT5mYWlsb3Zlcl9za2IsICZpc2tiKTsKKwl9CiBleGl0OgotCWtmcmVlX3NrYih0X2J1Zik7Ci0JcmV0dXJuICpidWYgIT0gTlVMTDsKKwlpZiAoIWxpbmstPmZhaWxvdmVyX3BrdHMgJiYgcGwpCisJCXBsLT5mbGFncyAmPSB+TElOS19GQUlMSU5HT1ZFUjsKKwlrZnJlZV9za2IoKnNrYik7CisJKnNrYiA9IGlza2I7CisJcmV0dXJuICpza2I7CiB9CiAKIHN0YXRpYyB2b2lkIGxpbmtfc2V0X3N1cGVydmlzaW9uX3Byb3BzKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLCB1MzIgdG9sKQpAQCAtMTkwMSwyMyArMTc0OSwxNiBAQAogCWxfcHRyLT5hYm9ydF9saW1pdCA9IHRvbCAvIChqaWZmaWVzX3RvX21zZWNzKGxfcHRyLT5jb250X2ludHYpIC8gNCk7CiB9CiAKLXZvaWQgdGlwY19saW5rX3NldF9xdWV1ZV9saW1pdHMoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIHUzMiB3aW5kb3cpCit2b2lkIHRpcGNfbGlua19zZXRfcXVldWVfbGltaXRzKHN0cnVjdCB0aXBjX2xpbmsgKmwsIHUzMiB3aW4pCiB7Ci0JLyogRGF0YSBtZXNzYWdlcyBmcm9tIHRoaXMgbm9kZSwgaW5jbHVzaXZlIEZJUlNUX0ZSQUdNICovCi0JbF9wdHItPnF1ZXVlX2xpbWl0W1RJUENfTE9XX0lNUE9SVEFOQ0VdID0gd2luZG93OwotCWxfcHRyLT5xdWV1ZV9saW1pdFtUSVBDX01FRElVTV9JTVBPUlRBTkNFXSA9ICh3aW5kb3cgLyAzKSAqIDQ7Ci0JbF9wdHItPnF1ZXVlX2xpbWl0W1RJUENfSElHSF9JTVBPUlRBTkNFXSA9ICh3aW5kb3cgLyAzKSAqIDU7Ci0JbF9wdHItPnF1ZXVlX2xpbWl0W1RJUENfQ1JJVElDQUxfSU1QT1JUQU5DRV0gPSAod2luZG93IC8gMykgKiA2OwotCS8qIFRyYW5zaXRpbmcgZGF0YSBtZXNzYWdlcyxpbmNsdXNpdmUgRklSU1RfRlJBR00gKi8KLQlsX3B0ci0+cXVldWVfbGltaXRbVElQQ19MT1dfSU1QT1JUQU5DRSArIDRdID0gMzAwOwotCWxfcHRyLT5xdWV1ZV9saW1pdFtUSVBDX01FRElVTV9JTVBPUlRBTkNFICsgNF0gPSA2MDA7Ci0JbF9wdHItPnF1ZXVlX2xpbWl0W1RJUENfSElHSF9JTVBPUlRBTkNFICsgNF0gPSA5MDA7Ci0JbF9wdHItPnF1ZXVlX2xpbWl0W1RJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSArIDRdID0gMTIwMDsKLQlsX3B0ci0+cXVldWVfbGltaXRbQ09OTl9NQU5BR0VSXSA9IDEyMDA7Ci0JbF9wdHItPnF1ZXVlX2xpbWl0W0NIQU5HRU9WRVJfUFJPVE9DT0xdID0gMjUwMDsKLQlsX3B0ci0+cXVldWVfbGltaXRbTkFNRV9ESVNUUklCVVRPUl0gPSAzMDAwOwotCS8qIEZSQUdNRU5UIGFuZCBMQVNUX0ZSQUdNRU5UIHBhY2tldHMgKi8KLQlsX3B0ci0+cXVldWVfbGltaXRbTVNHX0ZSQUdNRU5URVJdID0gNDAwMDsKKwlpbnQgbWF4X2J1bGsgPSBUSVBDX01BWF9QVUJMSUNBVElPTlMgLyAobC0+bXR1IC8gSVRFTV9TSVpFKTsKKworCWwtPndpbmRvdyA9IHdpbjsKKwlsLT5iYWNrbG9nW1RJUENfTE9XX0lNUE9SVEFOQ0VdLmxpbWl0ICAgICAgPSB3aW4gLyAyOworCWwtPmJhY2tsb2dbVElQQ19NRURJVU1fSU1QT1JUQU5DRV0ubGltaXQgICA9IHdpbjsKKwlsLT5iYWNrbG9nW1RJUENfSElHSF9JTVBPUlRBTkNFXS5saW1pdCAgICAgPSB3aW4gLyAyICogMzsKKwlsLT5iYWNrbG9nW1RJUENfQ1JJVElDQUxfSU1QT1JUQU5DRV0ubGltaXQgPSB3aW4gKiAyOworCWwtPmJhY2tsb2dbVElQQ19TWVNURU1fSU1QT1JUQU5DRV0ubGltaXQgICA9IG1heF9idWxrOwogfQogCiAvKiB0aXBjX2xpbmtfZmluZF9vd25lciAtIGxvY2F0ZSBvd25lciBub2RlIG9mIGxpbmsgYnkgbGluaydzIG5hbWUKQEAgLTIwODIsMTQgKzE5MjMsMTQgQEAKIAogCQkJdG9sID0gbmxhX2dldF91MzIocHJvcHNbVElQQ19OTEFfUFJPUF9UT0xdKTsKIAkJCWxpbmtfc2V0X3N1cGVydmlzaW9uX3Byb3BzKGxpbmssIHRvbCk7Ci0JCQl0aXBjX2xpbmtfcHJvdG9feG1pdChsaW5rLCBTVEFURV9NU0csIDAsIDAsIHRvbCwgMCwgMCk7CisJCQl0aXBjX2xpbmtfcHJvdG9feG1pdChsaW5rLCBTVEFURV9NU0csIDAsIDAsIHRvbCwgMCk7CiAJCX0KIAkJaWYgKHByb3BzW1RJUENfTkxBX1BST1BfUFJJT10pIHsKIAkJCXUzMiBwcmlvOwogCiAJCQlwcmlvID0gbmxhX2dldF91MzIocHJvcHNbVElQQ19OTEFfUFJPUF9QUklPXSk7CiAJCQlsaW5rLT5wcmlvcml0eSA9IHByaW87Ci0JCQl0aXBjX2xpbmtfcHJvdG9feG1pdChsaW5rLCBTVEFURV9NU0csIDAsIDAsIDAsIHByaW8sIDApOworCQkJdGlwY19saW5rX3Byb3RvX3htaXQobGluaywgU1RBVEVfTVNHLCAwLCAwLCAwLCBwcmlvKTsKIAkJfQogCQlpZiAocHJvcHNbVElQQ19OTEFfUFJPUF9XSU5dKSB7CiAJCQl1MzIgd2luOwpAQCAtMjE5NCw3ICsyMDM1LDcgQEAKIAlpZiAobmxhX3B1dF91MzIobXNnLT5za2IsIFRJUENfTkxBX0xJTktfREVTVCwKIAkJCXRpcGNfY2x1c3Rlcl9tYXNrKHRuLT5vd25fYWRkcikpKQogCQlnb3RvIGF0dHJfbXNnX2Z1bGw7Ci0JaWYgKG5sYV9wdXRfdTMyKG1zZy0+c2tiLCBUSVBDX05MQV9MSU5LX01UVSwgbGluay0+bWF4X3BrdCkpCisJaWYgKG5sYV9wdXRfdTMyKG1zZy0+c2tiLCBUSVBDX05MQV9MSU5LX01UVSwgbGluay0+bXR1KSkKIAkJZ290byBhdHRyX21zZ19mdWxsOwogCWlmIChubGFfcHV0X3UzMihtc2ctPnNrYiwgVElQQ19OTEFfTElOS19SWCwgbGluay0+bmV4dF9pbl9ubykpCiAJCWdvdG8gYXR0cl9tc2dfZnVsbDsKQEAgLTIyMTYsNyArMjA1Nyw3IEBACiAJaWYgKG5sYV9wdXRfdTMyKG1zZy0+c2tiLCBUSVBDX05MQV9QUk9QX1RPTCwgbGluay0+dG9sZXJhbmNlKSkKIAkJZ290byBwcm9wX21zZ19mdWxsOwogCWlmIChubGFfcHV0X3UzMihtc2ctPnNrYiwgVElQQ19OTEFfUFJPUF9XSU4sCi0JCQlsaW5rLT5xdWV1ZV9saW1pdFtUSVBDX0xPV19JTVBPUlRBTkNFXSkpCisJCQlsaW5rLT53aW5kb3cpKQogCQlnb3RvIHByb3BfbXNnX2Z1bGw7CiAJaWYgKG5sYV9wdXRfdTMyKG1zZy0+c2tiLCBUSVBDX05MQV9QUk9QX1BSSU8sIGxpbmstPnByaW9yaXR5KSkKIAkJZ290byBwcm9wX21zZ19mdWxsOwpAQCAtMjI4Miw3ICsyMTIzLDYgQEAKIAltc2cuc2VxID0gY2ItPm5saC0+bmxtc2dfc2VxOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCiAJaWYgKHByZXZfbm9kZSkgewogCQlub2RlID0gdGlwY19ub2RlX2ZpbmQobmV0LCBwcmV2X25vZGUpOwogCQlpZiAoIW5vZGUpIHsKQEAgLTIyOTUsNiArMjEzNSw3IEBACiAJCQljYi0+cHJldl9zZXEgPSAxOwogCQkJZ290byBvdXQ7CiAJCX0KKwkJdGlwY19ub2RlX3B1dChub2RlKTsKIAogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JjdShub2RlLCAmdG4tPm5vZGVfbGlzdCwKIAkJCQkJCSBsaXN0KSB7CkBAIC0yMzAyLDYgKzIxNDMsNyBAQAogCQkJZXJyID0gX190aXBjX25sX2FkZF9ub2RlX2xpbmtzKG5ldCwgJm1zZywgbm9kZSwKIAkJCQkJCSAgICAgICAmcHJldl9saW5rKTsKIAkJCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7CisJCQl0aXBjX25vZGVfcHV0KG5vZGUpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbGluay5oIGIvbmV0L3RpcGMvbGluay5oCmluZGV4IDdhZWI1MjAuLmI1YjRlMzUgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2xpbmsuaAorKysgYi9uZXQvdGlwYy9saW5rLmgKQEAgLTU4LDggKzU4LDEwIEBACiAKIC8qIExpbmsgZW5kcG9pbnQgZXhlY3V0aW9uIHN0YXRlcwogICovCi0jZGVmaW5lIExJTktfU1RBUlRFRCAgICAweDAwMDEKLSNkZWZpbmUgTElOS19TVE9QUEVEICAgIDB4MDAwMgorI2RlZmluZSBMSU5LX1NUQVJURUQgICAgIDB4MDAwMQorI2RlZmluZSBMSU5LX1NUT1BQRUQgICAgIDB4MDAwMgorI2RlZmluZSBMSU5LX1NZTkNISU5HICAgIDB4MDAwNAorI2RlZmluZSBMSU5LX0ZBSUxJTkdPVkVSIDB4MDAwOAogCiAvKiBTdGFydGluZyB2YWx1ZSBmb3IgbWF4aW11bSBwYWNrZXQgc2l6ZSBuZWdvdGlhdGlvbiBvbiB1bmljYXN0IGxpbmtzCiAgKiAodW5sZXNzIGJlYXJlciBNVFUgaXMgbGVzcykKQEAgLTExOCwxMyArMTIwLDEzIEBACiAgKiBAcG1zZzogY29udmVuaWVuY2UgcG9pbnRlciB0byAicHJvdG9fbXNnIiBmaWVsZAogICogQHByaW9yaXR5OiBjdXJyZW50IGxpbmsgcHJpb3JpdHkKICAqIEBuZXRfcGxhbmU6IGN1cnJlbnQgbGluayBuZXR3b3JrIHBsYW5lICgnQScgdGhyb3VnaCAnSCcpCi0gKiBAcXVldWVfbGltaXQ6IG91dGJvdW5kIG1lc3NhZ2UgcXVldWUgY29uZ2VzdGlvbiB0aHJlc2hvbGRzIChpbmRleGVkIGJ5IHVzZXIpCisgKiBAYmFja2xvZ19saW1pdDogYmFja2xvZyBxdWV1ZSBjb25nZXN0aW9uIHRocmVzaG9sZHMgKGluZGV4ZWQgYnkgaW1wb3J0YW5jZSkKICAqIEBleHBfbXNnX2NvdW50OiAjIG9mIHR1bm5lbGxlZCBtZXNzYWdlcyBleHBlY3RlZCBkdXJpbmcgbGluayBjaGFuZ2VvdmVyCiAgKiBAcmVzZXRfY2hlY2twb2ludDogc2VxICMgb2YgbGFzdCBhY2tub3dsZWRnZWQgbWVzc2FnZSBhdCB0aW1lIG9mIGxpbmsgcmVzZXQKLSAqIEBtYXhfcGt0OiBjdXJyZW50IG1heGltdW0gcGFja2V0IHNpemUgZm9yIHRoaXMgbGluawotICogQG1heF9wa3RfdGFyZ2V0OiBkZXNpcmVkIG1heGltdW0gcGFja2V0IHNpemUgZm9yIHRoaXMgbGluawotICogQG1heF9wa3RfcHJvYmVzOiAjIG9mIHByb2JlcyBiYXNlZCBvbiBjdXJyZW50IChtYXhfcGt0LCBtYXhfcGt0X3RhcmdldCkKLSAqIEBvdXRxdWV1ZTogb3V0Ym91bmQgbWVzc2FnZSBxdWV1ZQorICogQG10dTogY3VycmVudCBtYXhpbXVtIHBhY2tldCBzaXplIGZvciB0aGlzIGxpbmsKKyAqIEBhZHZlcnRpc2VkX210dTogYWR2ZXJ0aXNlZCBvd24gbXR1IHdoZW4gbGluayBpcyBiZWluZyBlc3RhYmxpc2hlZAorICogQHRyYW5zbWl0cTogcXVldWUgZm9yIHNlbnQsIG5vbi1hY2tlZCBtZXNzYWdlcworICogQGJhY2tsb2dxOiBxdWV1ZSBmb3IgbWVzc2FnZXMgd2FpdGluZyB0byBiZSBzZW50CiAgKiBAbmV4dF9vdXRfbm86IG5leHQgc2VxdWVuY2UgbnVtYmVyIHRvIHVzZSBmb3Igb3V0Ym91bmQgbWVzc2FnZXMKICAqIEBsYXN0X3JldHJhbnNtaXR0ZWQ6IHNlcXVlbmNlIG51bWJlciBvZiBtb3N0IHJlY2VudGx5IHJldHJhbnNtaXR0ZWQgbWVzc2FnZQogICogQHN0YWxlX2NvdW50OiAjIG9mIGlkZW50aWNhbCByZXRyYW5zbWl0IHJlcXVlc3RzIG1hZGUgYnkgcGVlcgpAQCAtMTY1LDM2ICsxNjcsNDAgQEAKIAlzdHJ1Y3QgdGlwY19tc2cgKnBtc2c7CiAJdTMyIHByaW9yaXR5OwogCWNoYXIgbmV0X3BsYW5lOwotCXUzMiBxdWV1ZV9saW1pdFsxNV07CS8qIHF1ZXVlX2xpbWl0WzBdPT13aW5kb3cgbGltaXQgKi8KKwl1MTYgc3luY2hfcG9pbnQ7CiAKLQkvKiBDaGFuZ2VvdmVyICovCi0JdTMyIGV4cF9tc2dfY291bnQ7Ci0JdTMyIHJlc2V0X2NoZWNrcG9pbnQ7CisJLyogRmFpbG92ZXIgKi8KKwl1MTYgZmFpbG92ZXJfcGt0czsKKwl1MTYgZmFpbG92ZXJfY2hlY2twdDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqZmFpbG92ZXJfc2tiOwogCiAJLyogTWF4IHBhY2tldCBuZWdvdGlhdGlvbiAqLwotCXUzMiBtYXhfcGt0OwotCXUzMiBtYXhfcGt0X3RhcmdldDsKLQl1MzIgbWF4X3BrdF9wcm9iZXM7CisJdTE2IG10dTsKKwl1MTYgYWR2ZXJ0aXNlZF9tdHU7CiAKIAkvKiBTZW5kaW5nICovCi0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBvdXRxdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHRyYW5zbXE7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBiYWNrbG9ncTsKKwlzdHJ1Y3QgeworCQl1MTYgbGVuOworCQl1MTYgbGltaXQ7CisJfSBiYWNrbG9nWzVdOwogCXUzMiBuZXh0X291dF9ubzsKKwl1MzIgd2luZG93OwogCXUzMiBsYXN0X3JldHJhbnNtaXR0ZWQ7CiAJdTMyIHN0YWxlX2NvdW50OwogCiAJLyogUmVjZXB0aW9uICovCiAJdTMyIG5leHRfaW5fbm87Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZCBkZWZlcnJlZF9xdWV1ZTsKLQl1MzIgdW5hY2tlZF93aW5kb3c7CisJdTMyIHJjdl91bmFja2VkOworCXN0cnVjdCBza19idWZmX2hlYWQgZGVmZXJkcTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGlucHV0cTsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIG5hbWVkcTsKIAogCS8qIENvbmdlc3Rpb24gaGFuZGxpbmcgKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dF9vdXQ7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCB3YWtldXBxOwogCiAJLyogRnJhZ21lbnRhdGlvbi9yZWFzc2VtYmx5ICovCi0JdTMyIGxvbmdfbXNnX3NlcV9ubzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcmVhc21fYnVmOwogCiAJLyogU3RhdGlzdGljcyAqLwpAQCAtMjI1LDcgKzIzMSw3IEBACiBpbnQgX190aXBjX2xpbmtfeG1pdChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCB0aXBjX2xpbmsgKmxpbmssCiAJCSAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCk7CiB2b2lkIHRpcGNfbGlua19wcm90b194bWl0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLCB1MzIgbXNnX3R5cCwgaW50IHByb2IsCi0JCQkgIHUzMiBnYXAsIHUzMiB0b2xlcmFuY2UsIHUzMiBwcmlvcml0eSwgdTMyIGFja2VkX210dSk7CisJCQkgIHUzMiBnYXAsIHUzMiB0b2xlcmFuY2UsIHUzMiBwcmlvcml0eSk7CiB2b2lkIHRpcGNfbGlua19wdXNoX3BhY2tldHMoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpOwogdTMyIHRpcGNfbGlua19kZWZlcl9wa3Qoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCwgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CiB2b2lkIHRpcGNfbGlua19zZXRfcXVldWVfbGltaXRzKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLCB1MzIgd2luZG93KTsKQEAgLTMwMiw5ICszMDgsNCBAQAogCXJldHVybiBsX3B0ci0+c3RhdGUgPT0gUkVTRVRfUkVTRVQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGxpbmtfY29uZ2VzdGVkKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQotewotCXJldHVybiBza2JfcXVldWVfbGVuKCZsX3B0ci0+b3V0cXVldWUpID49IGxfcHRyLT5xdWV1ZV9saW1pdFswXTsKLX0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9tc2cuYyBiL25ldC90aXBjL21zZy5jCmluZGV4IGI2ZWI5MGMuLmMzZTk2ZTggMTAwNjQ0Ci0tLSBhL25ldC90aXBjL21zZy5jCisrKyBiL25ldC90aXBjL21zZy5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIG5ldC90aXBjL21zZy5jOiBUSVBDIG1lc3NhZ2UgaGVhZGVyIHJvdXRpbmVzCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIDIwMTQsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgMjAxNC0yMDE1LCBFcmljc3NvbiBBQgogICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDEwLTIwMTEsIFdpbmQgUml2ZXIgU3lzdGVtcwogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0xNjUsNiArMTY1LDkgQEAKIAl9CiAKIAlpZiAoZnJhZ2lkID09IExBU1RfRlJBR01FTlQpIHsKKwkJVElQQ19TS0JfQ0IoaGVhZCktPnZhbGlkYXRlZCA9IGZhbHNlOworCQlpZiAodW5saWtlbHkoIXRpcGNfbXNnX3ZhbGlkYXRlKGhlYWQpKSkKKwkJCWdvdG8gZXJyOwogCQkqYnVmID0gaGVhZDsKIAkJVElQQ19TS0JfQ0IoaGVhZCktPnRhaWwgPSBOVUxMOwogCQkqaGVhZGJ1ZiA9IE5VTEw7CkBAIC0xNzIsNyArMTc1LDYgQEAKIAl9CiAJKmJ1ZiA9IE5VTEw7CiAJcmV0dXJuIDA7Ci0KIGVycjoKIAlwcl93YXJuX3JhdGVsaW1pdGVkKCJVbmFibGUgdG8gYnVpbGQgZnJhZ21lbnQgbGlzdFxuIik7CiAJa2ZyZWVfc2tiKCpidWYpOwpAQCAtMTgxLDYgKzE4Myw0OCBAQAogCXJldHVybiAwOwogfQogCisvKiB0aXBjX21zZ192YWxpZGF0ZSAtIHZhbGlkYXRlIGJhc2ljIGZvcm1hdCBvZiByZWNlaXZlZCBtZXNzYWdlCisgKgorICogVGhpcyByb3V0aW5lIGVuc3VyZXMgYSBUSVBDIG1lc3NhZ2UgaGFzIGFuIGFjY2VwdGFibGUgaGVhZGVyLCBhbmQgYXQgbGVhc3QKKyAqIGFzIG11Y2ggZGF0YSBhcyB0aGUgaGVhZGVyIGluZGljYXRlcyBpdCBzaG91bGQuICBUaGUgcm91dGluZSBhbHNvIGVuc3VyZXMKKyAqIHRoYXQgdGhlIGVudGlyZSBtZXNzYWdlIGhlYWRlciBpcyBzdG9yZWQgaW4gdGhlIG1haW4gZnJhZ21lbnQgb2YgdGhlIG1lc3NhZ2UKKyAqIGJ1ZmZlciwgdG8gc2ltcGxpZnkgZnV0dXJlIGFjY2VzcyB0byBtZXNzYWdlIGhlYWRlciBmaWVsZHMuCisgKgorICogTm90ZTogSGF2aW5nIGV4dHJhIGluZm8gcHJlc2VudCBpbiB0aGUgbWVzc2FnZSBoZWFkZXIgb3IgZGF0YSBhcmVhcyBpcyBPSy4KKyAqIFRJUEMgd2lsbCBpZ25vcmUgdGhlIGV4Y2VzcywgdW5kZXIgdGhlIGFzc3VtcHRpb24gdGhhdCBpdCBpcyBvcHRpb25hbCBpbmZvCisgKiBpbnRyb2R1Y2VkIGJ5IGEgbGF0ZXIgcmVsZWFzZSBvZiB0aGUgcHJvdG9jb2wuCisgKi8KK2Jvb2wgdGlwY19tc2dfdmFsaWRhdGUoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKKwlpbnQgbXN6LCBoc3o7CisKKwlpZiAodW5saWtlbHkoVElQQ19TS0JfQ0Ioc2tiKS0+dmFsaWRhdGVkKSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgTUlOX0hfU0laRSkpKQorCQlyZXR1cm4gZmFsc2U7CisKKwloc3ogPSBtc2dfaGRyX3N6KGJ1Zl9tc2coc2tiKSk7CisJaWYgKHVubGlrZWx5KGhzeiA8IE1JTl9IX1NJWkUpIHx8IChoc3ogPiBNQVhfSF9TSVpFKSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIGhzeikpKQorCQlyZXR1cm4gZmFsc2U7CisKKwltc2cgPSBidWZfbXNnKHNrYik7CisJaWYgKHVubGlrZWx5KG1zZ192ZXJzaW9uKG1zZykgIT0gVElQQ19WRVJTSU9OKSkKKwkJcmV0dXJuIGZhbHNlOworCisJbXN6ID0gbXNnX3NpemUobXNnKTsKKwlpZiAodW5saWtlbHkobXN6IDwgaHN6KSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICh1bmxpa2VseSgobXN6IC0gaHN6KSA+IFRJUENfTUFYX1VTRVJfTVNHX1NJWkUpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgbXN6KSkKKwkJcmV0dXJuIGZhbHNlOworCisJVElQQ19TS0JfQ0Ioc2tiKS0+dmFsaWRhdGVkID0gdHJ1ZTsKKwlyZXR1cm4gdHJ1ZTsKK30KIAogLyoqCiAgKiB0aXBjX21zZ19idWlsZCAtIGNyZWF0ZSBidWZmZXIgY2hhaW4gY29udGFpbmluZyBzcGVjaWZpZWQgaGVhZGVyIGFuZCBkYXRhCkBAIC0yMjgsNiArMjcyLDcgQEAKIAkJICAgICAgRklSU1RfRlJBR01FTlQsIElOVF9IX1NJWkUsIG1zZ19kZXN0bm9kZShtaGRyKSk7CiAJbXNnX3NldF9zaXplKCZwa3RoZHIsIHBrdG1heCk7CiAJbXNnX3NldF9mcmFnbV9ubygmcGt0aGRyLCBwa3Rubyk7CisJbXNnX3NldF9pbXBvcnRhbmNlKCZwa3RoZHIsIG1zZ19pbXBvcnRhbmNlKG1oZHIpKTsKIAogCS8qIFByZXBhcmUgZmlyc3QgZnJhZ21lbnQgKi8KIAlza2IgPSB0aXBjX2J1Zl9hY3F1aXJlKHBrdG1heCk7CkBAIC0yODYsMzMgKzMzMSwzNiBAQAogCiAvKioKICAqIHRpcGNfbXNnX2J1bmRsZSgpOiBBcHBlbmQgY29udGVudHMgb2YgYSBidWZmZXIgdG8gdGFpbCBvZiBhbiBleGlzdGluZyBvbmUKLSAqIEBsaXN0OiB0aGUgYnVmZmVyIGNoYWluIG9mIHRoZSBleGlzdGluZyBidWZmZXIgKCJidW5kbGUiKQorICogQGJza2I6IHRoZSBidWZmZXIgdG8gYXBwZW5kIHRvICgiYnVuZGxlIikKICAqIEBza2I6ICBidWZmZXIgdG8gYmUgYXBwZW5kZWQKICAqIEBtdHU6ICBtYXggYWxsb3dhYmxlIHNpemUgZm9yIHRoZSBidW5kbGUgYnVmZmVyCiAgKiBDb25zdW1lcyBidWZmZXIgaWYgc3VjY2Vzc2Z1bAogICogUmV0dXJucyB0cnVlIGlmIGJ1bmRsaW5nIGNvdWxkIGJlIHBlcmZvcm1lZCwgb3RoZXJ3aXNlIGZhbHNlCiAgKi8KLWJvb2wgdGlwY19tc2dfYnVuZGxlKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QsIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBtdHUpCitib29sIHRpcGNfbXNnX2J1bmRsZShzdHJ1Y3Qgc2tfYnVmZiAqYnNrYiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG10dSkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqYnNrYiA9IHNrYl9wZWVrX3RhaWwobGlzdCk7Ci0Jc3RydWN0IHRpcGNfbXNnICpibXNnID0gYnVmX21zZyhic2tiKTsKKwlzdHJ1Y3QgdGlwY19tc2cgKmJtc2c7CiAJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKHNrYik7Ci0JdW5zaWduZWQgaW50IGJzeiA9IG1zZ19zaXplKGJtc2cpOworCXVuc2lnbmVkIGludCBic3o7CiAJdW5zaWduZWQgaW50IG1zeiA9IG1zZ19zaXplKG1zZyk7Ci0JdTMyIHN0YXJ0ID0gYWxpZ24oYnN6KTsKKwl1MzIgc3RhcnQsIHBhZDsKIAl1MzIgbWF4ID0gbXR1IC0gSU5UX0hfU0laRTsKLQl1MzIgcGFkID0gc3RhcnQgLSBic3o7CiAKIAlpZiAobGlrZWx5KG1zZ191c2VyKG1zZykgPT0gTVNHX0ZSQUdNRU5URVIpKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKHVubGlrZWx5KG1zZ191c2VyKG1zZykgPT0gQ0hBTkdFT1ZFUl9QUk9UT0NPTCkpCisJaWYgKCFic2tiKQorCQlyZXR1cm4gZmFsc2U7CisJYm1zZyA9IGJ1Zl9tc2coYnNrYik7CisJYnN6ID0gbXNnX3NpemUoYm1zZyk7CisJc3RhcnQgPSBhbGlnbihic3opOworCXBhZCA9IHN0YXJ0IC0gYnN6OworCisJaWYgKHVubGlrZWx5KG1zZ191c2VyKG1zZykgPT0gVFVOTkVMX1BST1RPQ09MKSkKIAkJcmV0dXJuIGZhbHNlOwogCWlmICh1bmxpa2VseShtc2dfdXNlcihtc2cpID09IEJDQVNUX1BST1RPQ09MKSkKIAkJcmV0dXJuIGZhbHNlOwogCWlmIChsaWtlbHkobXNnX3VzZXIoYm1zZykgIT0gTVNHX0JVTkRMRVIpKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKGxpa2VseSghVElQQ19TS0JfQ0IoYnNrYiktPmJ1bmRsaW5nKSkKLQkJcmV0dXJuIGZhbHNlOwogCWlmICh1bmxpa2VseShza2JfdGFpbHJvb20oYnNrYikgPCAocGFkICsgbXN6KSkpCiAJCXJldHVybiBmYWxzZTsKIAlpZiAodW5saWtlbHkobWF4IDwgKHN0YXJ0ICsgbXN6KSkpCkBAIC0zMjgsMzQgKzM3Niw0MCBAQAogCiAvKioKICAqICB0aXBjX21zZ19leHRyYWN0KCk6IGV4dHJhY3QgYnVuZGxlZCBpbm5lciBwYWNrZXQgZnJvbSBidWZmZXIKLSAqICBAc2tiOiBsaW5lYXIgb3V0ZXIgYnVmZmVyLCB0byBiZSBleHRyYWN0ZWQgZnJvbS4KKyAqICBAc2tiOiBidWZmZXIgdG8gYmUgZXh0cmFjdGVkIGZyb20uCiAgKiAgQGlza2I6IGV4dHJhY3RlZCBpbm5lciBidWZmZXIsIHRvIGJlIHJldHVybmVkCi0gKiAgQHBvczogcG9zaXRpb24gb2YgbXNnIHRvIGJlIGV4dHJhY3RlZC4gUmV0dXJucyB3aXRoIHBvaW50ZXIgb2YgbmV4dCBtc2cKKyAqICBAcG9zOiBwb3NpdGlvbiBpbiBvdXRlciBtZXNzYWdlIG9mIG1zZyB0byBiZSBleHRyYWN0ZWQuCisgKiAgICAgICAgUmV0dXJucyBwb3NpdGlvbiBvZiBuZXh0IG1zZwogICogIENvbnN1bWVzIG91dGVyIGJ1ZmZlciB3aGVuIGxhc3QgcGFja2V0IGV4dHJhY3RlZAogICogIFJldHVybnMgdHJ1ZSB3aGVuIHdoZW4gdGhlcmUgaXMgYW4gZXh0cmFjdGVkIGJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlCiAgKi8KIGJvb2wgdGlwY19tc2dfZXh0cmFjdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2tfYnVmZiAqKmlza2IsIGludCAqcG9zKQogewotCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhza2IpOwotCWludCBpbXN6OwotCXN0cnVjdCB0aXBjX21zZyAqaW1zZyA9IChzdHJ1Y3QgdGlwY19tc2cgKikobXNnX2RhdGEobXNnKSArICpwb3MpOworCXN0cnVjdCB0aXBjX21zZyAqbXNnOworCWludCBpbXN6LCBvZmZzZXQ7CiAKLQkvKiBJcyB0aGVyZSBzcGFjZSBsZWZ0IGZvciBzaG9ydGVzdCBwb3NzaWJsZSBtZXNzYWdlPyAqLwotCWlmICgqcG9zID4gKG1zZ19kYXRhX3N6KG1zZykgLSBTSE9SVF9IX1NJWkUpKQorCSppc2tiID0gTlVMTDsKKwlpZiAodW5saWtlbHkoc2tiX2xpbmVhcml6ZShza2IpKSkKIAkJZ290byBub25lOwotCWltc3ogPSBtc2dfc2l6ZShpbXNnKTsKIAotCS8qIElzIHRoZXJlIHNwYWNlIGxlZnQgZm9yIGN1cnJlbnQgbWVzc2FnZSA/ICovCi0JaWYgKCgqcG9zICsgaW1zeikgPiBtc2dfZGF0YV9zeihtc2cpKQorCW1zZyA9IGJ1Zl9tc2coc2tiKTsKKwlvZmZzZXQgPSBtc2dfaGRyX3N6KG1zZykgKyAqcG9zOworCWlmICh1bmxpa2VseShvZmZzZXQgPiAobXNnX3NpemUobXNnKSAtIE1JTl9IX1NJWkUpKSkKIAkJZ290byBub25lOwotCSppc2tiID0gdGlwY19idWZfYWNxdWlyZShpbXN6KTsKLQlpZiAoISppc2tiKQorCisJKmlza2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAodW5saWtlbHkoISppc2tiKSkKIAkJZ290byBub25lOwotCXNrYl9jb3B5X3RvX2xpbmVhcl9kYXRhKCppc2tiLCBpbXNnLCBpbXN6KTsKKwlza2JfcHVsbCgqaXNrYiwgb2Zmc2V0KTsKKwlpbXN6ID0gbXNnX3NpemUoYnVmX21zZygqaXNrYikpOworCXNrYl90cmltKCppc2tiLCBpbXN6KTsKKwlpZiAodW5saWtlbHkoIXRpcGNfbXNnX3ZhbGlkYXRlKCppc2tiKSkpCisJCWdvdG8gbm9uZTsKIAkqcG9zICs9IGFsaWduKGltc3opOwogCXJldHVybiB0cnVlOwogbm9uZToKIAlrZnJlZV9za2Ioc2tiKTsKKwlrZnJlZV9za2IoKmlza2IpOwogCSppc2tiID0gTlVMTDsKIAlyZXR1cm4gZmFsc2U7CiB9CkBAIC0zNjksMTggKzQyMywxNyBAQAogICogUmVwbGFjZXMgYnVmZmVyIGlmIHN1Y2Nlc3NmdWwKICAqIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKICAqLwotYm9vbCB0aXBjX21zZ19tYWtlX2J1bmRsZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0LAotCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbXR1LCB1MzIgZG5vZGUpCitib29sIHRpcGNfbXNnX21ha2VfYnVuZGxlKHN0cnVjdCBza19idWZmICoqc2tiLCB1MzIgbXR1LCB1MzIgZG5vZGUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKmJza2I7CiAJc3RydWN0IHRpcGNfbXNnICpibXNnOwotCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhza2IpOworCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZygqc2tiKTsKIAl1MzIgbXN6ID0gbXNnX3NpemUobXNnKTsKIAl1MzIgbWF4ID0gbXR1IC0gSU5UX0hfU0laRTsKIAogCWlmIChtc2dfdXNlcihtc2cpID09IE1TR19GUkFHTUVOVEVSKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKG1zZ191c2VyKG1zZykgPT0gQ0hBTkdFT1ZFUl9QUk9UT0NPTCkKKwlpZiAobXNnX3VzZXIobXNnKSA9PSBUVU5ORUxfUFJPVE9DT0wpCiAJCXJldHVybiBmYWxzZTsKIAlpZiAobXNnX3VzZXIobXNnKSA9PSBCQ0FTVF9QUk9UT0NPTCkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMzk4LDkgKzQ1MSw5IEBACiAJbXNnX3NldF9zZXFubyhibXNnLCBtc2dfc2Vxbm8obXNnKSk7CiAJbXNnX3NldF9hY2soYm1zZywgbXNnX2Fjayhtc2cpKTsKIAltc2dfc2V0X2JjYXN0X2FjayhibXNnLCBtc2dfYmNhc3RfYWNrKG1zZykpOwotCVRJUENfU0tCX0NCKGJza2IpLT5idW5kbGluZyA9IHRydWU7Ci0JX19za2JfcXVldWVfdGFpbChsaXN0LCBic2tiKTsKLQlyZXR1cm4gdGlwY19tc2dfYnVuZGxlKGxpc3QsIHNrYiwgbXR1KTsKKwl0aXBjX21zZ19idW5kbGUoYnNrYiwgKnNrYiwgbXR1KTsKKwkqc2tiID0gYnNrYjsKKwlyZXR1cm4gdHJ1ZTsKIH0KIAogLyoqCkBAIC00MTUsMjEgKzQ2OCwxNyBAQAogCQkgICAgICBpbnQgZXJyKQogewogCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhidWYpOwotCXVpbnQgaW1wID0gbXNnX2ltcG9ydGFuY2UobXNnKTsKIAlzdHJ1Y3QgdGlwY19tc2cgb2hkcjsKIAl1aW50IHJkc3ogPSBtaW5fdCh1aW50LCBtc2dfZGF0YV9zeihtc2cpLCBNQVhfRk9SV0FSRF9TSVpFKTsKIAogCWlmIChza2JfbGluZWFyaXplKGJ1ZikpCiAJCWdvdG8gZXhpdDsKKwltc2cgPSBidWZfbXNnKGJ1Zik7CiAJaWYgKG1zZ19kZXN0X2Ryb3BwYWJsZShtc2cpKQogCQlnb3RvIGV4aXQ7CiAJaWYgKG1zZ19lcnJjb2RlKG1zZykpCiAJCWdvdG8gZXhpdDsKLQogCW1lbWNweSgmb2hkciwgbXNnLCBtc2dfaGRyX3N6KG1zZykpOwotCWltcCA9IG1pbl90KHVpbnQsIGltcCArIDEsIFRJUENfQ1JJVElDQUxfSU1QT1JUQU5DRSk7Ci0JaWYgKG1zZ19pc2RhdGEobXNnKSkKLQkJbXNnX3NldF9pbXBvcnRhbmNlKG1zZywgaW1wKTsKIAltc2dfc2V0X2VycmNvZGUobXNnLCBlcnIpOwogCW1zZ19zZXRfb3JpZ3BvcnQobXNnLCBtc2dfZGVzdHBvcnQoJm9oZHIpKTsKIAltc2dfc2V0X2Rlc3Rwb3J0KG1zZywgbXNnX29yaWdwb3J0KCZvaGRyKSk7CkBAIC00NjIsMTUgKzUxMSwxOCBAQAogewogCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gYnVmX21zZyhza2IpOwogCXUzMiBkcG9ydDsKKwl1MzIgb3duX2FkZHIgPSB0aXBjX293bl9hZGRyKG5ldCk7CiAKIAlpZiAoIW1zZ19pc2RhdGEobXNnKSkKIAkJcmV0dXJuIGZhbHNlOwogCWlmICghbXNnX25hbWVkKG1zZykpCiAJCXJldHVybiBmYWxzZTsKKwlpZiAobXNnX2VycmNvZGUobXNnKSkKKwkJcmV0dXJuIGZhbHNlOwogCSplcnIgPSAtVElQQ19FUlJfTk9fTkFNRTsKIAlpZiAoc2tiX2xpbmVhcml6ZShza2IpKQogCQlyZXR1cm4gZmFsc2U7Ci0JaWYgKG1zZ19yZXJvdXRlX2NudChtc2cpID4gMCkKKwlpZiAobXNnX3Jlcm91dGVfY250KG1zZykpCiAJCXJldHVybiBmYWxzZTsKIAkqZG5vZGUgPSBhZGRyX2RvbWFpbihuZXQsIG1zZ19sb29rdXBfc2NvcGUobXNnKSk7CiAJZHBvcnQgPSB0aXBjX25hbWV0YmxfdHJhbnNsYXRlKG5ldCwgbXNnX25hbWV0eXBlKG1zZyksCkBAIC00NzgsNiArNTMwLDggQEAKIAlpZiAoIWRwb3J0KQogCQlyZXR1cm4gZmFsc2U7CiAJbXNnX2luY3JfcmVyb3V0ZV9jbnQobXNnKTsKKwlpZiAoKmRub2RlICE9IG93bl9hZGRyKQorCQltc2dfc2V0X3ByZXZub2RlKG1zZywgb3duX2FkZHIpOwogCW1zZ19zZXRfZGVzdG5vZGUobXNnLCAqZG5vZGUpOwogCW1zZ19zZXRfZGVzdHBvcnQobXNnLCBkcG9ydCk7CiAJKmVyciA9IFRJUENfT0s7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9tc2cuaCBiL25ldC90aXBjL21zZy5oCmluZGV4IDlhY2U0N2YuLmUxZDM1OTVlIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9tc2cuaAorKysgYi9uZXQvdGlwYy9tc2cuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBuZXQvdGlwYy9tc2cuaDogSW5jbHVkZSBmaWxlIGZvciBUSVBDIG1lc3NhZ2UgaGVhZGVyIHJvdXRpbmVzCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDcsIDIwMTQsIEVyaWNzc29uIEFCCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwNywgMjAxNC0yMDE1IEVyaWNzc29uIEFCCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUtMjAwOCwgMjAxMC0yMDExLCBXaW5kIFJpdmVyIFN5c3RlbXMKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtNTQsNiArNTQsOCBAQAogICogLSBUSVBDX0hJR0hfSU1QT1JUQU5DRQogICogLSBUSVBDX0NSSVRJQ0FMX0lNUE9SVEFOQ0UKICAqLworI2RlZmluZSBUSVBDX1NZU1RFTV9JTVBPUlRBTkNFCTQKKwogCiAvKgogICogUGF5bG9hZCBtZXNzYWdlIHR5cGVzCkBAIC02NCw2ICs2NiwxOSBAQAogI2RlZmluZSBUSVBDX0RJUkVDVF9NU0cJCTMKIAogLyoKKyAqIEludGVybmFsIG1lc3NhZ2UgdXNlcnMKKyAqLworI2RlZmluZSAgQkNBU1RfUFJPVE9DT0wgICAgICAgNQorI2RlZmluZSAgTVNHX0JVTkRMRVIgICAgICAgICAgNgorI2RlZmluZSAgTElOS19QUk9UT0NPTCAgICAgICAgNworI2RlZmluZSAgQ09OTl9NQU5BR0VSICAgICAgICAgOAorI2RlZmluZSAgVFVOTkVMX1BST1RPQ09MICAgICAgMTAKKyNkZWZpbmUgIE5BTUVfRElTVFJJQlVUT1IgICAgIDExCisjZGVmaW5lICBNU0dfRlJBR01FTlRFUiAgICAgICAxMgorI2RlZmluZSAgTElOS19DT05GSUcgICAgICAgICAgMTMKKyNkZWZpbmUgIFNPQ0tfV0FLRVVQICAgICAgICAgIDE0ICAgICAgIC8qIHBzZXVkbyB1c2VyICovCisKKy8qCiAgKiBNZXNzYWdlIGhlYWRlciBzaXplcwogICovCiAjZGVmaW5lIFNIT1JUX0hfU0laRSAgICAgICAgICAgICAgMjQJLyogSW4tY2x1c3RlciBiYXNpYyBwYXlsb2FkIG1lc3NhZ2UgKi8KQEAgLTc2LDcgKzkxLDcgQEAKIAogI2RlZmluZSBNQVhfTVNHX1NJWkUgKE1BWF9IX1NJWkUgKyBUSVBDX01BWF9VU0VSX01TR19TSVpFKQogCi0jZGVmaW5lIFRJUENfTUVESUFfQUREUl9PRkZTRVQJNQorI2RlZmluZSBUSVBDX01FRElBX0lORk9fT0ZGU0VUCTUKIAogLyoqCiAgKiBUSVBDIG1lc3NhZ2UgYnVmZmVyIGNvZGUKQEAgLTg3LDEyICsxMDIsMTIgQEAKICAqIE5vdGU6IEhlYWRyb29tIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDQgdG8gZW5zdXJlIHRoZSBUSVBDIGhlYWRlciBmaWVsZHMKICAqICAgICAgIGFyZSB3b3JkIGFsaWduZWQgZm9yIHF1aWNrZXIgYWNjZXNzCiAgKi8KLSNkZWZpbmUgQlVGX0hFQURST09NIExMX01BWF9IRUFERVIKKyNkZWZpbmUgQlVGX0hFQURST09NIChMTF9NQVhfSEVBREVSICsgNDgpCiAKIHN0cnVjdCB0aXBjX3NrYl9jYiB7CiAJdm9pZCAqaGFuZGxlOwogCXN0cnVjdCBza19idWZmICp0YWlsOwotCWJvb2wgZGVmZXJyZWQ7CisJYm9vbCB2YWxpZGF0ZWQ7CiAJYm9vbCB3YWtldXBfcGVuZGluZzsKIAlib29sIGJ1bmRsaW5nOwogCXUxNiBjaGFpbl9zejsKQEAgLTE3MCwxNiArMTg1LDYgQEAKIAltc2dfc2V0X2JpdHMobSwgMCwgMjUsIDB4Ziwgbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIG1zZ19pbXBvcnRhbmNlKHN0cnVjdCB0aXBjX21zZyAqbSkKLXsKLQlyZXR1cm4gbXNnX2JpdHMobSwgMCwgMjUsIDB4Zik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtc2dfc2V0X2ltcG9ydGFuY2Uoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgaSkKLXsKLQltc2dfc2V0X3VzZXIobSwgaSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdTMyIG1zZ19oZHJfc3ooc3RydWN0IHRpcGNfbXNnICptKQogewogCXJldHVybiBtc2dfYml0cyhtLCAwLCAyMSwgMHhmKSA8PCAyOwpAQCAtMjM1LDYgKzI0MCwxNSBAQAogCW0tPmhkclswXSA9IGh0b25sKChtc2dfd29yZChtLCAwKSAmIH4weDFmZmZmKSB8IHN6KTsKIH0KIAorc3RhdGljIGlubGluZSB1bmNoYXIgKm1zZ19kYXRhKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKCh1bmNoYXIgKiltKSArIG1zZ19oZHJfc3oobSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRpcGNfbXNnICptc2dfZ2V0X3dyYXBwZWQoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiAoc3RydWN0IHRpcGNfbXNnICopbXNnX2RhdGEobSk7Cit9CiAKIC8qCiAgKiBXb3JkIDEKQEAgLTMzNiw2ICszNTAsMjUgQEAKIC8qCiAgKiBXb3JkcyAzLTEwCiAgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19pbXBvcnRhbmNlKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlpZiAodW5saWtlbHkobXNnX3VzZXIobSkgPT0gTVNHX0ZSQUdNRU5URVIpKQorCQlyZXR1cm4gbXNnX2JpdHMobSwgNSwgMTMsIDB4Nyk7CisJaWYgKGxpa2VseShtc2dfaXNkYXRhKG0pICYmICFtc2dfZXJyY29kZShtKSkpCisJCXJldHVybiBtc2dfdXNlcihtKTsKKwlyZXR1cm4gVElQQ19TWVNURU1fSU1QT1JUQU5DRTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfaW1wb3J0YW5jZShzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiBpKQoreworCWlmICh1bmxpa2VseShtc2dfdXNlcihtKSA9PSBNU0dfRlJBR01FTlRFUikpCisJCW1zZ19zZXRfYml0cyhtLCA1LCAxMywgMHg3LCBpKTsKKwllbHNlIGlmIChsaWtlbHkoaSA8IFRJUENfU1lTVEVNX0lNUE9SVEFOQ0UpKQorCQltc2dfc2V0X3VzZXIobSwgaSk7CisJZWxzZQorCQlwcl93YXJuKCJUcnlpbmcgdG8gc2V0IGlsbGVnYWwgaW1wb3J0YW5jZSBpbiBtZXNzYWdlXG4iKTsKK30KKwogc3RhdGljIGlubGluZSB1MzIgbXNnX3ByZXZub2RlKHN0cnVjdCB0aXBjX21zZyAqbSkKIHsKIAlyZXR1cm4gbXNnX3dvcmQobSwgMyk7CkBAIC0zNDgsNiArMzgxLDggQEAKIAogc3RhdGljIGlubGluZSB1MzIgbXNnX29yaWdwb3J0KHN0cnVjdCB0aXBjX21zZyAqbSkKIHsKKwlpZiAobXNnX3VzZXIobSkgPT0gTVNHX0ZSQUdNRU5URVIpCisJCW0gPSBtc2dfZ2V0X3dyYXBwZWQobSk7CiAJcmV0dXJuIG1zZ193b3JkKG0sIDQpOwogfQogCkBAIC00NDMsMzUgKzQ3OCwxMSBAQAogCW1zZ19zZXRfd29yZChtLCAxMCwgbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5jaGFyICptc2dfZGF0YShzdHJ1Y3QgdGlwY19tc2cgKm0pCi17Ci0JcmV0dXJuICgodW5jaGFyICopbSkgKyBtc2dfaGRyX3N6KG0pOwotfQotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCB0aXBjX21zZyAqbXNnX2dldF93cmFwcGVkKHN0cnVjdCB0aXBjX21zZyAqbSkKLXsKLQlyZXR1cm4gKHN0cnVjdCB0aXBjX21zZyAqKW1zZ19kYXRhKG0pOwotfQotCiAvKgogICogQ29uc3RhbnRzIGFuZCByb3V0aW5lcyB1c2VkIHRvIHJlYWQgYW5kIHdyaXRlIFRJUEMgaW50ZXJuYWwgbWVzc2FnZSBoZWFkZXJzCiAgKi8KIAogLyoKLSAqIEludGVybmFsIG1lc3NhZ2UgdXNlcnMKLSAqLwotI2RlZmluZSAgQkNBU1RfUFJPVE9DT0wgICAgICAgNQotI2RlZmluZSAgTVNHX0JVTkRMRVIgICAgICAgICAgNgotI2RlZmluZSAgTElOS19QUk9UT0NPTCAgICAgICAgNwotI2RlZmluZSAgQ09OTl9NQU5BR0VSICAgICAgICAgOAotI2RlZmluZSAgUk9VVEVfRElTVFJJQlVUT1IgICAgOQkJLyogb2Jzb2xldGVkICovCi0jZGVmaW5lICBDSEFOR0VPVkVSX1BST1RPQ09MICAxMAotI2RlZmluZSAgTkFNRV9ESVNUUklCVVRPUiAgICAgMTEKLSNkZWZpbmUgIE1TR19GUkFHTUVOVEVSICAgICAgIDEyCi0jZGVmaW5lICBMSU5LX0NPTkZJRyAgICAgICAgICAxMwotI2RlZmluZSAgU09DS19XQUtFVVAgICAgICAgICAgMTQgICAgICAgLyogcHNldWRvIHVzZXIgKi8KLQotLyoKICAqICBDb25uZWN0aW9uIG1hbmFnZW1lbnQgcHJvdG9jb2wgbWVzc2FnZSB0eXBlcwogICovCiAjZGVmaW5lIENPTk5fUFJPQkUgICAgICAgIDAKQEAgLTUwMSw4ICs1MTIsOCBAQAogLyoKICAqIENoYW5nZW92ZXIgdHVubmVsIG1lc3NhZ2UgdHlwZXMKICAqLwotI2RlZmluZSBEVVBMSUNBVEVfTVNHCQkwCi0jZGVmaW5lIE9SSUdJTkFMX01TRwkJMQorI2RlZmluZSBTWU5DSF9NU0cJCTAKKyNkZWZpbmUgRkFJTE9WRVJfTVNHCQkxCiAKIC8qCiAgKiBDb25maWcgcHJvdG9jb2wgbWVzc2FnZSB0eXBlcwpAQCAtNTEwLDcgKzUyMSw2IEBACiAjZGVmaW5lIERTQ19SRVFfTVNHCQkwCiAjZGVmaW5lIERTQ19SRVNQX01TRwkJMQogCi0KIC8qCiAgKiBXb3JkIDEKICAqLwpAQCAtNTM0LDYgKzU0NCwyNCBAQAogCW1zZ19zZXRfYml0cyhtLCAxLCAwLCAweGZmZmYsIG4pOwogfQogCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfbm9kZV9jYXBhYmlsaXRpZXMoc3RydWN0IHRpcGNfbXNnICptKQoreworCXJldHVybiBtc2dfYml0cyhtLCAxLCAxNSwgMHgxZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbm9kZV9jYXBhYmlsaXRpZXMoc3RydWN0IHRpcGNfbXNnICptLCB1MzIgbikKK3sKKwltc2dfc2V0X2JpdHMobSwgMSwgMTUsIDB4MWZmZiwgbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBtc2dfZHVwKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlpZiAobGlrZWx5KG1zZ191c2VyKG0pICE9IFRVTk5FTF9QUk9UT0NPTCkpCisJCXJldHVybiBmYWxzZTsKKwlpZiAobXNnX3R5cGUobSkgIT0gU1lOQ0hfTVNHKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7Cit9CiAKIC8qCiAgKiBXb3JkIDIKQEAgLTY4OCw3ICs3MTYsNyBAQAogCiBzdGF0aWMgaW5saW5lIGNoYXIgKm1zZ19tZWRpYV9hZGRyKHN0cnVjdCB0aXBjX21zZyAqbSkKIHsKLQlyZXR1cm4gKGNoYXIgKikmbS0+aGRyW1RJUENfTUVESUFfQUREUl9PRkZTRVRdOworCXJldHVybiAoY2hhciAqKSZtLT5oZHJbVElQQ19NRURJQV9JTkZPX09GRlNFVF07CiB9CiAKIC8qCkBAIC03MzQsMjEgKzc2Miw4IEBACiAJbXNnX3NldF9iaXRzKG0sIDksIDAsIDB4ZmZmZiwgbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdTMyIHRpcGNfbXNnX3RvdF9pbXBvcnRhbmNlKHN0cnVjdCB0aXBjX21zZyAqbSkKLXsKLQlpZiAoKG1zZ191c2VyKG0pID09IE1TR19GUkFHTUVOVEVSKSAmJiAobXNnX3R5cGUobSkgPT0gRklSU1RfRlJBR01FTlQpKQotCQlyZXR1cm4gbXNnX2ltcG9ydGFuY2UobXNnX2dldF93cmFwcGVkKG0pKTsKLQlyZXR1cm4gbXNnX2ltcG9ydGFuY2UobSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIG1zZ190b3Rfb3JpZ3BvcnQoc3RydWN0IHRpcGNfbXNnICptKQotewotCWlmICgobXNnX3VzZXIobSkgPT0gTVNHX0ZSQUdNRU5URVIpICYmIChtc2dfdHlwZShtKSA9PSBGSVJTVF9GUkFHTUVOVCkpCi0JCXJldHVybiBtc2dfb3JpZ3BvcnQobXNnX2dldF93cmFwcGVkKG0pKTsKLQlyZXR1cm4gbXNnX29yaWdwb3J0KG0pOwotfQotCiBzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19idWZfYWNxdWlyZSh1MzIgc2l6ZSk7Citib29sIHRpcGNfbXNnX3ZhbGlkYXRlKHN0cnVjdCBza19idWZmICpza2IpOwogYm9vbCB0aXBjX21zZ19yZXZlcnNlKHUzMiBvd25fYWRkciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgdTMyICpkbm9kZSwKIAkJICAgICAgaW50IGVycik7CiB2b2lkIHRpcGNfbXNnX2luaXQodTMyIG93bl9hZGRyLCBzdHJ1Y3QgdGlwY19tc2cgKm0sIHUzMiB1c2VyLCB1MzIgdHlwZSwKQEAgLTc1Nyw5ICs3NzIsOSBAQAogCQkJCXVpbnQgZGF0YV9zeiwgdTMyIGRub2RlLCB1MzIgb25vZGUsCiAJCQkJdTMyIGRwb3J0LCB1MzIgb3BvcnQsIGludCBlcnJjb2RlKTsKIGludCB0aXBjX2J1Zl9hcHBlbmQoc3RydWN0IHNrX2J1ZmYgKipoZWFkYnVmLCBzdHJ1Y3Qgc2tfYnVmZiAqKmJ1Zik7Ci1ib29sIHRpcGNfbXNnX2J1bmRsZShzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbXR1KTsKLWJvb2wgdGlwY19tc2dfbWFrZV9idW5kbGUoc3RydWN0IHNrX2J1ZmZfaGVhZCAqbGlzdCwKLQkJCSAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIG10dSwgdTMyIGRub2RlKTsKK2Jvb2wgdGlwY19tc2dfYnVuZGxlKHN0cnVjdCBza19idWZmICpic2tiLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbXR1KTsKKworYm9vbCB0aXBjX21zZ19tYWtlX2J1bmRsZShzdHJ1Y3Qgc2tfYnVmZiAqKnNrYiwgdTMyIG10dSwgdTMyIGRub2RlKTsKIGJvb2wgdGlwY19tc2dfZXh0cmFjdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc2tfYnVmZiAqKmlza2IsIGludCAqcG9zKTsKIGludCB0aXBjX21zZ19idWlsZChzdHJ1Y3QgdGlwY19tc2cgKm1oZHIsIHN0cnVjdCBtc2doZHIgKm0sCiAJCSAgIGludCBvZmZzZXQsIGludCBkc3osIGludCBtdHUsIHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmFtZV9kaXN0ci5jIGIvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCmluZGV4IGZjYjA3OTEuLjQxZTdiN2UgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25hbWVfZGlzdHIuYworKysgYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKQEAgLTk4LDcgKzk4LDcgQEAKIAkJCWNvbnRpbnVlOwogCQlpZiAoIXRpcGNfbm9kZV9hY3RpdmVfbGlua3Mobm9kZSkpCiAJCQljb250aW51ZTsKLQkJb3NrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJCW9za2IgPSBwc2tiX2NvcHkoc2tiLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFvc2tiKQogCQkJYnJlYWs7CiAJCW1zZ19zZXRfZGVzdG5vZGUoYnVmX21zZyhvc2tiKSwgZG5vZGUpOwpAQCAtMjQ0LDYgKzI0NCw3IEBACiAJdGlwY19ub2RlX2xvY2sobm9kZSk7CiAJbGlzdF9hZGRfdGFpbCgmcHVibC0+bm9kZXN1Yl9saXN0LCAmbm9kZS0+cHVibF9saXN0KTsKIAl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOworCXRpcGNfbm9kZV9wdXQobm9kZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHRpcGNfcHVibF91bnN1YnNjcmliZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibCwKQEAgLTI1OCw2ICsyNTksNyBAQAogCXRpcGNfbm9kZV9sb2NrKG5vZGUpOwogCWxpc3RfZGVsX2luaXQoJnB1YmwtPm5vZGVzdWJfbGlzdCk7CiAJdGlwY19ub2RlX3VubG9jayhub2RlKTsKKwl0aXBjX25vZGVfcHV0KG5vZGUpOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL25ldC90aXBjL25hbWVfdGFibGUuYyBiL25ldC90aXBjL25hbWVfdGFibGUuYwppbmRleCAxMDViYTdhZC4uYWIwYWM2MiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbmFtZV90YWJsZS5jCisrKyBiL25ldC90aXBjL25hbWVfdGFibGUuYwpAQCAtODExLDggKzgxMSw4IEBACiAJc3NlcSA9IHNlcS0+c3NlcXM7CiAJaW5mbyA9IHNzZXEtPmluZm87CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHB1YmwsIHNhZmUsICZpbmZvLT56b25lX2xpc3QsIHpvbmVfbGlzdCkgewotCQl0aXBjX25hbWV0YmxfcmVtb3ZlX3B1YmwobmV0LCBwdWJsLT50eXBlLCBwdWJsLT5sb3dlciwKLQkJCQkJIHB1YmwtPm5vZGUsIHB1YmwtPnJlZiwgcHVibC0+a2V5KTsKKwkJdGlwY19uYW1lc2VxX3JlbW92ZV9wdWJsKG5ldCwgc2VxLCBwdWJsLT5sb3dlciwgcHVibC0+bm9kZSwKKwkJCQkJIHB1YmwtPnJlZiwgcHVibC0+a2V5KTsKIAkJa2ZyZWVfcmN1KHB1YmwsIHJjdSk7CiAJfQogCWhsaXN0X2RlbF9pbml0X3JjdSgmc2VxLT5uc19saXN0KTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGUuYyBiL25ldC90aXBjL25vZGUuYwppbmRleCA4NjE1MmRlLi4yMmMwNTlhIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ub2RlLmMKKysrIGIvbmV0L3RpcGMvbm9kZS5jCkBAIC00Miw2ICs0Miw3IEBACiAKIHN0YXRpYyB2b2lkIG5vZGVfbG9zdF9jb250YWN0KHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyKTsKIHN0YXRpYyB2b2lkIG5vZGVfZXN0YWJsaXNoZWRfY29udGFjdChzdHJ1Y3QgdGlwY19ub2RlICpuX3B0cik7CitzdGF0aWMgdm9pZCB0aXBjX25vZGVfZGVsZXRlKHN0cnVjdCB0aXBjX25vZGUgKm5vZGUpOwogCiBzdHJ1Y3QgdGlwY19zb2NrX2Nvbm4gewogCXUzMiBwb3J0OwpAQCAtNjcsNiArNjgsMjMgQEAKIAlyZXR1cm4gYWRkciAmIChOT0RFX0hUQUJMRV9TSVpFIC0gMSk7CiB9CiAKK3N0YXRpYyB2b2lkIHRpcGNfbm9kZV9rcmVmX3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHRpcGNfbm9kZSAqbm9kZSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgdGlwY19ub2RlLCBrcmVmKTsKKworCXRpcGNfbm9kZV9kZWxldGUobm9kZSk7Cit9CisKK3ZvaWQgdGlwY19ub2RlX3B1dChzdHJ1Y3QgdGlwY19ub2RlICpub2RlKQoreworCWtyZWZfcHV0KCZub2RlLT5rcmVmLCB0aXBjX25vZGVfa3JlZl9yZWxlYXNlKTsKK30KKworc3RhdGljIHZvaWQgdGlwY19ub2RlX2dldChzdHJ1Y3QgdGlwY19ub2RlICpub2RlKQoreworCWtyZWZfZ2V0KCZub2RlLT5rcmVmKTsKK30KKwogLyoKICAqIHRpcGNfbm9kZV9maW5kIC0gbG9jYXRlIHNwZWNpZmllZCBub2RlIG9iamVjdCwgaWYgaXQgZXhpc3RzCiAgKi8KQEAgLTgyLDYgKzEwMCw3IEBACiAJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG5vZGUsICZ0bi0+bm9kZV9odGFibGVbdGlwY19oYXNoZm4oYWRkcildLAogCQkJCSBoYXNoKSB7CiAJCWlmIChub2RlLT5hZGRyID09IGFkZHIpIHsKKwkJCXRpcGNfbm9kZV9nZXQobm9kZSk7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiBub2RlOwogCQl9CkBAIC0xMDYsMTIgKzEyNSwxMyBAQAogCX0KIAluX3B0ci0+YWRkciA9IGFkZHI7CiAJbl9wdHItPm5ldCA9IG5ldDsKKwlrcmVmX2luaXQoJm5fcHRyLT5rcmVmKTsKIAlzcGluX2xvY2tfaW5pdCgmbl9wdHItPmxvY2spOwogCUlOSVRfSExJU1RfTk9ERSgmbl9wdHItPmhhc2gpOwogCUlOSVRfTElTVF9IRUFEKCZuX3B0ci0+bGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJm5fcHRyLT5wdWJsX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZuX3B0ci0+Y29ubl9za3MpOwotCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbl9wdHItPmJjbGluay5kZWZlcnJlZF9xdWV1ZSk7CisJX19za2JfcXVldWVfaGVhZF9pbml0KCZuX3B0ci0+YmNsaW5rLmRlZmVyZHEpOwogCWhsaXN0X2FkZF9oZWFkX3JjdSgmbl9wdHItPmhhc2gsICZ0bi0+bm9kZV9odGFibGVbdGlwY19oYXNoZm4oYWRkcildKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0ZW1wX25vZGUsICZ0bi0+bm9kZV9saXN0LCBsaXN0KSB7CiAJCWlmIChuX3B0ci0+YWRkciA8IHRlbXBfbm9kZS0+YWRkcikKQEAgLTEyMCwxNiArMTQwLDE3IEBACiAJbGlzdF9hZGRfdGFpbF9yY3UoJm5fcHRyLT5saXN0LCAmdGVtcF9ub2RlLT5saXN0KTsKIAluX3B0ci0+YWN0aW9uX2ZsYWdzID0gVElQQ19XQUlUX1BFRVJfTElOS1NfRE9XTjsKIAluX3B0ci0+c2lnbmF0dXJlID0gSU5WQUxJRF9OT0RFX1NJRzsKKwl0aXBjX25vZGVfZ2V0KG5fcHRyKTsKIGV4aXQ6CiAJc3Bpbl91bmxvY2tfYmgoJnRuLT5ub2RlX2xpc3RfbG9jayk7CiAJcmV0dXJuIG5fcHRyOwogfQogCi1zdGF0aWMgdm9pZCB0aXBjX25vZGVfZGVsZXRlKHN0cnVjdCB0aXBjX25ldCAqdG4sIHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyKQorc3RhdGljIHZvaWQgdGlwY19ub2RlX2RlbGV0ZShzdHJ1Y3QgdGlwY19ub2RlICpub2RlKQogewotCWxpc3RfZGVsX3JjdSgmbl9wdHItPmxpc3QpOwotCWhsaXN0X2RlbF9yY3UoJm5fcHRyLT5oYXNoKTsKLQlrZnJlZV9yY3Uobl9wdHIsIHJjdSk7CisJbGlzdF9kZWxfcmN1KCZub2RlLT5saXN0KTsKKwlobGlzdF9kZWxfcmN1KCZub2RlLT5oYXNoKTsKKwlrZnJlZV9yY3Uobm9kZSwgcmN1KTsKIH0KIAogdm9pZCB0aXBjX25vZGVfc3RvcChzdHJ1Y3QgbmV0ICpuZXQpCkBAIC0xMzksNyArMTYwLDcgQEAKIAogCXNwaW5fbG9ja19iaCgmdG4tPm5vZGVfbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgdF9ub2RlLCAmdG4tPm5vZGVfbGlzdCwgbGlzdCkKLQkJdGlwY19ub2RlX2RlbGV0ZSh0biwgbm9kZSk7CisJCXRpcGNfbm9kZV9wdXQobm9kZSk7CiAJc3Bpbl91bmxvY2tfYmgoJnRuLT5ub2RlX2xpc3RfbG9jayk7CiB9CiAKQEAgLTE0Nyw2ICsxNjgsNyBAQAogewogCXN0cnVjdCB0aXBjX25vZGUgKm5vZGU7CiAJc3RydWN0IHRpcGNfc29ja19jb25uICpjb25uOworCWludCBlcnIgPSAwOwogCiAJaWYgKGluX293bl9ub2RlKG5ldCwgZG5vZGUpKQogCQlyZXR1cm4gMDsKQEAgLTE1Nyw4ICsxNzksMTAgQEAKIAkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CiAJfQogCWNvbm4gPSBrbWFsbG9jKHNpemVvZigqY29ubiksIEdGUF9BVE9NSUMpOwotCWlmICghY29ubikKLQkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CisJaWYgKCFjb25uKSB7CisJCWVyciA9IC1FSE9TVFVOUkVBQ0g7CisJCWdvdG8gZXhpdDsKKwl9CiAJY29ubi0+cGVlcl9ub2RlID0gZG5vZGU7CiAJY29ubi0+cG9ydCA9IHBvcnQ7CiAJY29ubi0+cGVlcl9wb3J0ID0gcGVlcl9wb3J0OwpAQCAtMTY2LDcgKzE5MCw5IEBACiAJdGlwY19ub2RlX2xvY2sobm9kZSk7CiAJbGlzdF9hZGRfdGFpbCgmY29ubi0+bGlzdCwgJm5vZGUtPmNvbm5fc2tzKTsKIAl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOwotCXJldHVybiAwOworZXhpdDoKKwl0aXBjX25vZGVfcHV0KG5vZGUpOworCXJldHVybiBlcnI7CiB9CiAKIHZvaWQgdGlwY19ub2RlX3JlbW92ZV9jb25uKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGRub2RlLCB1MzIgcG9ydCkKQEAgLTE4OSw2ICsyMTUsNyBAQAogCQlrZnJlZShjb25uKTsKIAl9CiAJdGlwY19ub2RlX3VubG9jayhub2RlKTsKKwl0aXBjX25vZGVfcHV0KG5vZGUpOwogfQogCiAvKioKQEAgLTIyNyw4ICsyNTQsOCBAQAogCWFjdGl2ZVswXSA9IGFjdGl2ZVsxXSA9IGxfcHRyOwogZXhpdDoKIAkvKiBMZWF2ZSByb29tIGZvciBjaGFuZ2VvdmVyIGhlYWRlciB3aGVuIHJldHVybmluZyAnbXR1JyB0byB1c2VyczogKi8KLQluX3B0ci0+YWN0X210dXNbMF0gPSBhY3RpdmVbMF0tPm1heF9wa3QgLSBJTlRfSF9TSVpFOwotCW5fcHRyLT5hY3RfbXR1c1sxXSA9IGFjdGl2ZVsxXS0+bWF4X3BrdCAtIElOVF9IX1NJWkU7CisJbl9wdHItPmFjdF9tdHVzWzBdID0gYWN0aXZlWzBdLT5tdHUgLSBJTlRfSF9TSVpFOworCW5fcHRyLT5hY3RfbXR1c1sxXSA9IGFjdGl2ZVsxXS0+bXR1IC0gSU5UX0hfU0laRTsKIH0KIAogLyoqCkBAIC0yOTIsMTEgKzMxOSwxMCBAQAogCiAJLyogTGVhdmUgcm9vbSBmb3IgY2hhbmdlb3ZlciBoZWFkZXIgd2hlbiByZXR1cm5pbmcgJ210dScgdG8gdXNlcnM6ICovCiAJaWYgKGFjdGl2ZVswXSkgewotCQluX3B0ci0+YWN0X210dXNbMF0gPSBhY3RpdmVbMF0tPm1heF9wa3QgLSBJTlRfSF9TSVpFOwotCQluX3B0ci0+YWN0X210dXNbMV0gPSBhY3RpdmVbMV0tPm1heF9wa3QgLSBJTlRfSF9TSVpFOworCQluX3B0ci0+YWN0X210dXNbMF0gPSBhY3RpdmVbMF0tPm10dSAtIElOVF9IX1NJWkU7CisJCW5fcHRyLT5hY3RfbXR1c1sxXSA9IGFjdGl2ZVsxXS0+bXR1IC0gSU5UX0hfU0laRTsKIAkJcmV0dXJuOwogCX0KLQogCS8qIExvb3BiYWNrIGxpbmsgd2VudCBkb3duPyBObyBmcmFnbWVudGF0aW9uIG5lZWRlZCBmcm9tIG5vdyBvbi4gKi8KIAlpZiAobl9wdHItPmFkZHIgPT0gdG4tPm93bl9hZGRyKSB7CiAJCW5fcHRyLT5hY3RfbXR1c1swXSA9IE1BWF9NU0dfU0laRTsKQEAgLTM1NCw3ICszODAsNyBAQAogCiAJLyogRmx1c2ggYnJvYWRjYXN0IGxpbmsgaW5mbyBhc3NvY2lhdGVkIHdpdGggbG9zdCBub2RlICovCiAJaWYgKG5fcHRyLT5iY2xpbmsucmVjdl9wZXJtaXR0ZWQpIHsKLQkJX19za2JfcXVldWVfcHVyZ2UoJm5fcHRyLT5iY2xpbmsuZGVmZXJyZWRfcXVldWUpOworCQlfX3NrYl9xdWV1ZV9wdXJnZSgmbl9wdHItPmJjbGluay5kZWZlcmRxKTsKIAogCQlpZiAobl9wdHItPmJjbGluay5yZWFzbV9idWYpIHsKIAkJCWtmcmVlX3NrYihuX3B0ci0+YmNsaW5rLnJlYXNtX2J1Zik7CkBAIC0zNjcsMTggKzM5MywxNyBAQAogCQluX3B0ci0+YmNsaW5rLnJlY3ZfcGVybWl0dGVkID0gZmFsc2U7CiAJfQogCi0JLyogQWJvcnQgbGluayBjaGFuZ2VvdmVyICovCisJLyogQWJvcnQgYW55IG9uZ29pbmcgbGluayBmYWlsb3ZlciAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfQkVBUkVSUzsgaSsrKSB7CiAJCXN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyID0gbl9wdHItPmxpbmtzW2ldOwogCQlpZiAoIWxfcHRyKQogCQkJY29udGludWU7Ci0JCWxfcHRyLT5yZXNldF9jaGVja3BvaW50ID0gbF9wdHItPm5leHRfaW5fbm87Ci0JCWxfcHRyLT5leHBfbXNnX2NvdW50ID0gMDsKKwkJbF9wdHItPmZsYWdzICY9IH5MSU5LX0ZBSUxJTkdPVkVSOworCQlsX3B0ci0+ZmFpbG92ZXJfY2hlY2twdCA9IDA7CisJCWxfcHRyLT5mYWlsb3Zlcl9wa3RzID0gMDsKKwkJa2ZyZWVfc2tiKGxfcHRyLT5mYWlsb3Zlcl9za2IpOworCQlsX3B0ci0+ZmFpbG92ZXJfc2tiID0gTlVMTDsKIAkJdGlwY19saW5rX3Jlc2V0X2ZyYWdtZW50cyhsX3B0cik7Ci0KLQkJLyogTGluayBtYXJrZWQgZm9yIGRlbGV0aW9uIGFmdGVyIGZhaWxvdmVyPyA9PiBkbyBpdCBub3cgKi8KLQkJaWYgKGxfcHRyLT5mbGFncyAmIExJTktfU1RPUFBFRCkKLQkJCXRpcGNfbGlua19kZWxldGUobF9wdHIpOwogCX0KIAogCW5fcHRyLT5hY3Rpb25fZmxhZ3MgJj0gflRJUENfV0FJVF9PV05fTElOS1NfRE9XTjsKQEAgLTQxNywxOSArNDQyLDI1IEBACiAJCQkgICBjaGFyICpsaW5rbmFtZSwgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3QgdGlwY19saW5rICpsaW5rOworCWludCBlcnIgPSAtRUlOVkFMOwogCXN0cnVjdCB0aXBjX25vZGUgKm5vZGUgPSB0aXBjX25vZGVfZmluZChuZXQsIGFkZHIpOwogCi0JaWYgKChiZWFyZXJfaWQgPj0gTUFYX0JFQVJFUlMpIHx8ICFub2RlKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIW5vZGUpCisJCXJldHVybiBlcnI7CisKKwlpZiAoYmVhcmVyX2lkID49IE1BWF9CRUFSRVJTKQorCQlnb3RvIGV4aXQ7CisKIAl0aXBjX25vZGVfbG9jayhub2RlKTsKIAlsaW5rID0gbm9kZS0+bGlua3NbYmVhcmVyX2lkXTsKIAlpZiAobGluaykgewogCQlzdHJuY3B5KGxpbmtuYW1lLCBsaW5rLT5uYW1lLCBsZW4pOwotCQl0aXBjX25vZGVfdW5sb2NrKG5vZGUpOwotCQlyZXR1cm4gMDsKKwkJZXJyID0gMDsKIAl9CitleGl0OgogCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7Ci0JcmV0dXJuIC1FSU5WQUw7CisJdGlwY19ub2RlX3B1dChub2RlKTsKKwlyZXR1cm4gZXJyOwogfQogCiB2b2lkIHRpcGNfbm9kZV91bmxvY2soc3RydWN0IHRpcGNfbm9kZSAqbm9kZSkKQEAgLTQ1OSw3ICs0OTAsNyBAQAogCQkJCVRJUENfTk9USUZZX05PREVfRE9XTiB8IFRJUENfTk9USUZZX05PREVfVVAgfAogCQkJCVRJUENfTk9USUZZX0xJTktfRE9XTiB8IFRJUENfTk9USUZZX0xJTktfVVAgfAogCQkJCVRJUENfV0FLRVVQX0JDQVNUX1VTRVJTIHwgVElQQ19CQ0FTVF9NU0dfRVZUIHwKLQkJCQlUSVBDX05BTUVEX01TR19FVlQpOworCQkJCVRJUENfTkFNRURfTVNHX0VWVCB8IFRJUENfQkNBU1RfUkVTRVQpOwogCiAJc3Bpbl91bmxvY2tfYmgoJm5vZGUtPmxvY2spOwogCkBAIC00ODgsNiArNTE5LDkgQEAKIAogCWlmIChmbGFncyAmIFRJUENfQkNBU1RfTVNHX0VWVCkKIAkJdGlwY19iY2xpbmtfaW5wdXQobmV0KTsKKworCWlmIChmbGFncyAmIFRJUENfQkNBU1RfUkVTRVQpCisJCXRpcGNfbGlua19yZXNldF9hbGwobm9kZSk7CiB9CiAKIC8qIENhbGxlciBzaG91bGQgaG9sZCBub2RlIGxvY2sgZm9yIHRoZSBwYXNzZWQgbm9kZSAqLwpAQCAtNTQyLDE3ICs1NzYsMjEgQEAKIAltc2cuc2VxID0gY2ItPm5saC0+bmxtc2dfc2VxOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCi0JaWYgKGxhc3RfYWRkciAmJiAhdGlwY19ub2RlX2ZpbmQobmV0LCBsYXN0X2FkZHIpKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQkvKiBXZSBuZXZlciBzZXQgc2VxIG9yIGNhbGwgbmxfZHVtcF9jaGVja19jb25zaXN0ZW50KCkgdGhpcwotCQkgKiBtZWFucyB0aGF0IHNldHRpbmcgcHJldl9zZXEgaGVyZSB3aWxsIGNhdXNlIHRoZSBjb25zaXN0ZW5jZQotCQkgKiBjaGVjayB0byBmYWlsIGluIHRoZSBuZXRsaW5rIGNhbGxiYWNrIGhhbmRsZXIuIFJlc3VsdGluZyBpbgotCQkgKiB0aGUgTkxNU0dfRE9ORSBtZXNzYWdlIGhhdmluZyB0aGUgTkxNX0ZfRFVNUF9JTlRSIGZsYWcgc2V0IGlmCi0JCSAqIHRoZSBub2RlIHN0YXRlIGNoYW5nZWQgd2hpbGUgd2UgcmVsZWFzZWQgdGhlIGxvY2suCi0JCSAqLwotCQljYi0+cHJldl9zZXEgPSAxOwotCQlyZXR1cm4gLUVQSVBFOworCWlmIChsYXN0X2FkZHIpIHsKKwkJbm9kZSA9IHRpcGNfbm9kZV9maW5kKG5ldCwgbGFzdF9hZGRyKTsKKwkJaWYgKCFub2RlKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCS8qIFdlIG5ldmVyIHNldCBzZXEgb3IgY2FsbCBubF9kdW1wX2NoZWNrX2NvbnNpc3RlbnQoKQorCQkJICogdGhpcyBtZWFucyB0aGF0IHNldHRpbmcgcHJldl9zZXEgaGVyZSB3aWxsIGNhdXNlIHRoZQorCQkJICogY29uc2lzdGVuY2UgY2hlY2sgdG8gZmFpbCBpbiB0aGUgbmV0bGluayBjYWxsYmFjaworCQkJICogaGFuZGxlci4gUmVzdWx0aW5nIGluIHRoZSBOTE1TR19ET05FIG1lc3NhZ2UgaGF2aW5nCisJCQkgKiB0aGUgTkxNX0ZfRFVNUF9JTlRSIGZsYWcgc2V0IGlmIHRoZSBub2RlIHN0YXRlCisJCQkgKiBjaGFuZ2VkIHdoaWxlIHdlIHJlbGVhc2VkIHRoZSBsb2NrLgorCQkJICovCisJCQljYi0+cHJldl9zZXEgPSAxOworCQkJcmV0dXJuIC1FUElQRTsKKwkJfQorCQl0aXBjX25vZGVfcHV0KG5vZGUpOwogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG5vZGUsICZ0bi0+bm9kZV9saXN0LCBsaXN0KSB7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9ub2RlLmggYi9uZXQvdGlwYy9ub2RlLmgKaW5kZXggM2QxOGM2Ni4uMDJkNWMyMCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbm9kZS5oCisrKyBiL25ldC90aXBjL25vZGUuaApAQCAtNjQsNyArNjQsOCBAQAogCVRJUENfTk9USUZZX0xJTktfVVAJCT0gKDEgPDwgNiksCiAJVElQQ19OT1RJRllfTElOS19ET1dOCQk9ICgxIDw8IDcpLAogCVRJUENfTkFNRURfTVNHX0VWVAkJPSAoMSA8PCA4KSwKLQlUSVBDX0JDQVNUX01TR19FVlQJCT0gKDEgPDwgOSkKKwlUSVBDX0JDQVNUX01TR19FVlQJCT0gKDEgPDwgOSksCisJVElQQ19CQ0FTVF9SRVNFVAkJPSAoMSA8PCAxMCkKIH07CiAKIC8qKgpAQCAtODQsNyArODUsNyBAQAogCXUzMiBsYXN0X3NlbnQ7CiAJdTMyIG9vc19zdGF0ZTsKIAl1MzIgZGVmZXJyZWRfc2l6ZTsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGRlZmVycmVkX3F1ZXVlOworCXN0cnVjdCBza19idWZmX2hlYWQgZGVmZXJkcTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcmVhc21fYnVmOwogCWludCBpbnB1dHFfbWFwOwogCWJvb2wgcmVjdl9wZXJtaXR0ZWQ7CkBAIC05Myw2ICs5NCw3IEBACiAvKioKICAqIHN0cnVjdCB0aXBjX25vZGUgLSBUSVBDIG5vZGUgc3RydWN0dXJlCiAgKiBAYWRkcjogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUKKyAqIEByZWY6IHJlZmVyZW5jZSBjb3VudGVyIHRvIG5vZGUgb2JqZWN0CiAgKiBAbG9jazogc3BpbmxvY2sgZ292ZXJuaW5nIGFjY2VzcyB0byBzdHJ1Y3R1cmUKICAqIEBuZXQ6IHRoZSBhcHBsaWNhYmxlIG5ldCBuYW1lc3BhY2UKICAqIEBoYXNoOiBsaW5rcyB0byBhZGphY2VudCBub2RlcyBpbiB1bnNvcnRlZCBoYXNoIGNoYWluCkBAIC0xMDYsNiArMTA4LDcgQEAKICAqIEBsaXN0OiBsaW5rcyB0byBhZGphY2VudCBub2RlcyBpbiBzb3J0ZWQgbGlzdCBvZiBjbHVzdGVyJ3Mgbm9kZXMKICAqIEB3b3JraW5nX2xpbmtzOiBudW1iZXIgb2Ygd29ya2luZyBsaW5rcyB0byBub2RlIChib3RoIGFjdGl2ZSBhbmQgc3RhbmRieSkKICAqIEBsaW5rX2NudDogbnVtYmVyIG9mIGxpbmtzIHRvIG5vZGUKKyAqIEBjYXBhYmlsaXRpZXM6IGJpdG1hcCwgaW5kaWNhdGluZyBwZWVyIG5vZGUncyBmdW5jdGlvbmFsIGNhcGFiaWxpdGllcwogICogQHNpZ25hdHVyZTogbm9kZSBpbnN0YW5jZSBpZGVudGlmaWVyCiAgKiBAbGlua19pZDogbG9jYWwgYW5kIHJlbW90ZSBiZWFyZXIgaWRzIG9mIGNoYW5naW5nIGxpbmssIGlmIGFueQogICogQHB1YmxfbGlzdDogbGlzdCBvZiBwdWJsaWNhdGlvbnMKQEAgLTExMyw2ICsxMTYsNyBAQAogICovCiBzdHJ1Y3QgdGlwY19ub2RlIHsKIAl1MzIgYWRkcjsKKwlzdHJ1Y3Qga3JlZiBrcmVmOwogCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgbmV0ICpuZXQ7CiAJc3RydWN0IGhsaXN0X25vZGUgaGFzaDsKQEAgLTEyNSw3ICsxMjksOCBAQAogCXN0cnVjdCB0aXBjX25vZGVfYmNsaW5rIGJjbGluazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJaW50IGxpbmtfY250OwotCWludCB3b3JraW5nX2xpbmtzOworCXUxNiB3b3JraW5nX2xpbmtzOworCXUxNiBjYXBhYmlsaXRpZXM7CiAJdTMyIHNpZ25hdHVyZTsKIAl1MzIgbGlua19pZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHB1YmxfbGlzdDsKQEAgLTEzNCw2ICsxMzksNyBAQAogfTsKIAogc3RydWN0IHRpcGNfbm9kZSAqdGlwY19ub2RlX2ZpbmQoc3RydWN0IG5ldCAqbmV0LCB1MzIgYWRkcik7Cit2b2lkIHRpcGNfbm9kZV9wdXQoc3RydWN0IHRpcGNfbm9kZSAqbm9kZSk7CiBzdHJ1Y3QgdGlwY19ub2RlICp0aXBjX25vZGVfY3JlYXRlKHN0cnVjdCBuZXQgKm5ldCwgdTMyIGFkZHIpOwogdm9pZCB0aXBjX25vZGVfc3RvcChzdHJ1Y3QgbmV0ICpuZXQpOwogdm9pZCB0aXBjX25vZGVfYXR0YWNoX2xpbmsoc3RydWN0IHRpcGNfbm9kZSAqbl9wdHIsIHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKTsKQEAgLTE2OCwxMCArMTc0LDEyIEBACiAKIAlub2RlID0gdGlwY19ub2RlX2ZpbmQobmV0LCBhZGRyKTsKIAotCWlmIChsaWtlbHkobm9kZSkpCisJaWYgKGxpa2VseShub2RlKSkgewogCQltdHUgPSBub2RlLT5hY3RfbXR1c1tzZWxlY3RvciAmIDFdOwotCWVsc2UKKwkJdGlwY19ub2RlX3B1dChub2RlKTsKKwl9IGVsc2UgewogCQltdHUgPSBNQVhfTVNHX1NJWkU7CisJfQogCiAJcmV0dXJuIG10dTsKIH0KZGlmZiAtLWdpdCBhL25ldC90aXBjL3NlcnZlci5jIGIvbmV0L3RpcGMvc2VydmVyLmMKaW5kZXggZWFkZDRlZC4uYWI2MTgzYyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvc2VydmVyLmMKKysrIGIvbmV0L3RpcGMvc2VydmVyLmMKQEAgLTM3LDExICszNywxMyBAQAogI2luY2x1ZGUgImNvcmUuaCIKICNpbmNsdWRlICJzb2NrZXQuaCIKICNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCiAvKiBOdW1iZXIgb2YgbWVzc2FnZXMgdG8gc2VuZCBiZWZvcmUgcmVzY2hlZHVsaW5nICovCiAjZGVmaW5lIE1BWF9TRU5EX01TR19DT1VOVAkyNQogI2RlZmluZSBNQVhfUkVDVl9NU0dfQ09VTlQJMjUKICNkZWZpbmUgQ0ZfQ09OTkVDVEVECQkxCisjZGVmaW5lIENGX1NFUlZFUgkJMgogCiAjZGVmaW5lIHNvY2syY29uKHgpICgoc3RydWN0IHRpcGNfY29ubiAqKSh4KS0+c2tfdXNlcl9kYXRhKQogCkBAIC04OCw5ICs5MCwxOSBAQAogc3RhdGljIHZvaWQgdGlwY19jb25uX2tyZWZfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqa3JlZikKIHsKIAlzdHJ1Y3QgdGlwY19jb25uICpjb24gPSBjb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHRpcGNfY29ubiwga3JlZik7CisJc3RydWN0IHNvY2thZGRyX3RpcGMgKnNhZGRyID0gY29uLT5zZXJ2ZXItPnNhZGRyOworCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBjb24tPnNvY2s7CisJc3RydWN0IHNvY2sgKnNrOwogCi0JaWYgKGNvbi0+c29jaykgewotCQl0aXBjX3NvY2tfcmVsZWFzZV9sb2NhbChjb24tPnNvY2spOworCWlmIChzb2NrKSB7CisJCXNrID0gc29jay0+c2s7CisJCWlmICh0ZXN0X2JpdChDRl9TRVJWRVIsICZjb24tPmZsYWdzKSkgeworCQkJX19tb2R1bGVfZ2V0KHNvY2stPm9wcy0+b3duZXIpOworCQkJX19tb2R1bGVfZ2V0KHNrLT5za19wcm90X2NyZWF0b3ItPm93bmVyKTsKKwkJfQorCQlzYWRkci0+c2NvcGUgPSAtVElQQ19OT0RFX1NDT1BFOworCQlrZXJuZWxfYmluZChzb2NrLCAoc3RydWN0IHNvY2thZGRyICopc2FkZHIsIHNpemVvZigqc2FkZHIpKTsKKwkJc2tfcmVsZWFzZV9rZXJuZWwoc2spOwogCQljb24tPnNvY2sgPSBOVUxMOwogCX0KIApAQCAtMjgxLDcgKzI5Myw3IEBACiAJc3RydWN0IHRpcGNfY29ubiAqbmV3Y29uOwogCWludCByZXQ7CiAKLQlyZXQgPSB0aXBjX3NvY2tfYWNjZXB0X2xvY2FsKHNvY2ssICZuZXdzb2NrLCBPX05PTkJMT0NLKTsKKwlyZXQgPSBrZXJuZWxfYWNjZXB0KHNvY2ssICZuZXdzb2NrLCBPX05PTkJMT0NLKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtMzA5LDkgKzMyMSwxMiBAQAogCXN0cnVjdCBzb2NrZXQgKnNvY2sgPSBOVUxMOwogCWludCByZXQ7CiAKLQlyZXQgPSB0aXBjX3NvY2tfY3JlYXRlX2xvY2FsKHMtPm5ldCwgcy0+dHlwZSwgJnNvY2spOworCXJldCA9IHNvY2tfY3JlYXRlX2tlcm4oQUZfVElQQywgU09DS19TRVFQQUNLRVQsIDAsICZzb2NrKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIE5VTEw7CisKKwlza19jaGFuZ2VfbmV0KHNvY2stPnNrLCBzLT5uZXQpOworCiAJcmV0ID0ga2VybmVsX3NldHNvY2tvcHQoc29jaywgU09MX1RJUEMsIFRJUENfSU1QT1JUQU5DRSwKIAkJCQkoY2hhciAqKSZzLT5pbXAsIHNpemVvZihzLT5pbXApKTsKIAlpZiAocmV0IDwgMCkKQEAgLTMzNywxMSArMzUyLDMxIEBACiAJCXByX2VycigiVW5rbm93biBzb2NrZXQgdHlwZSAlZFxuIiwgcy0+dHlwZSk7CiAJCWdvdG8gY3JlYXRlX2VycjsKIAl9CisKKwkvKiBBcyBzZXJ2ZXIncyBsaXN0ZW5pbmcgc29ja2V0IG93bmVyIGFuZCBjcmVhdG9yIGlzIHRoZSBzYW1lIG1vZHVsZSwKKwkgKiB3ZSBoYXZlIHRvIGRlY3JlYXNlIFRJUEMgbW9kdWxlIHJlZmVyZW5jZSBjb3VudCB0byBndWFyYW50ZWUgdGhhdAorCSAqIGl0IHJlbWFpbnMgemVybyBhZnRlciB0aGUgc2VydmVyIHNvY2tldCBpcyBjcmVhdGVkLCBvdGhlcndpc2UsCisJICogZXhlY3V0aW5nICJybW1vZCIgY29tbWFuZCBpcyB1bmFibGUgdG8gbWFrZSBUSVBDIG1vZHVsZSBkZWxldGVkCisJICogYWZ0ZXIgVElQQyBtb2R1bGUgaXMgaW5zZXJ0ZWQgc3VjY2Vzc2Z1bGx5LgorCSAqCisJICogSG93ZXZlciwgdGhlIHJlZmVyZW5jZSBjb3VudCBpcyBldmVyIGluY3JlYXNlZCB0d2ljZSBpbgorCSAqIHNvY2tfY3JlYXRlX2tlcm4oKTogb25lIGlzIHRvIGluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb2Ygb3duZXIKKwkgKiBvZiBUSVBDIHNvY2tldCdzIHByb3RvX29wcyBzdHJ1Y3Q7IGFub3RoZXIgaXMgdG8gaW5jcmVtZW50IHRoZQorCSAqIHJlZmVyZW5jZSBjb3VudCBvZiBvd25lciBvZiBUSVBDIHByb3RvIHN0cnVjdC4gVGhlcmVmb3JlLCB3ZSBtdXN0CisJICogZGVjcmVtZW50IHRoZSBtb2R1bGUgcmVmZXJlbmNlIGNvdW50IHR3aWNlIHRvIGVuc3VyZSB0aGF0IGl0IGtlZXBzCisJICogemVybyBhZnRlciBzZXJ2ZXIncyBsaXN0ZW5pbmcgc29ja2V0IGlzIGNyZWF0ZWQuIE9mIGNvdXJzZSwgd2UKKwkgKiBtdXN0IGJ1bXAgdGhlIG1vZHVsZSByZWZlcmVuY2UgY291bnQgdHdpY2UgYXMgd2VsbCBiZWZvcmUgdGhlIHNvY2tldAorCSAqIGlzIGNsb3NlZC4KKwkgKi8KKwltb2R1bGVfcHV0KHNvY2stPm9wcy0+b3duZXIpOworCW1vZHVsZV9wdXQoc29jay0+c2stPnNrX3Byb3RfY3JlYXRvci0+b3duZXIpOworCXNldF9iaXQoQ0ZfU0VSVkVSLCAmY29uLT5mbGFncyk7CisKIAlyZXR1cm4gc29jazsKIAogY3JlYXRlX2VycjoKLQlzb2NrX3JlbGVhc2Uoc29jayk7Ci0JY29uLT5zb2NrID0gTlVMTDsKKwlrZXJuZWxfc29ja19zaHV0ZG93bihzb2NrLCBTSFVUX1JEV1IpOworCXNrX3JlbGVhc2Vfa2VybmVsKHNvY2stPnNrKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvc29ja2V0LmMgYi9uZXQvdGlwYy9zb2NrZXQuYwppbmRleCBiNGQ0NDY3Li5lZTkwZDc0IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9zb2NrZXQuYworKysgYi9uZXQvdGlwYy9zb2NrZXQuYwpAQCAtMzUsNyArMzUsNiBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9yaGFzaHRhYmxlLmg+Ci0jaW5jbHVkZSA8bGludXgvamhhc2guaD4KICNpbmNsdWRlICJjb3JlLmgiCiAjaW5jbHVkZSAibmFtZV90YWJsZS5oIgogI2luY2x1ZGUgIm5vZGUuaCIKQEAgLTc0LDYgKzczLDcgQEAKICAqIEBsaW5rX2Nvbmc6IG5vbi16ZXJvIGlmIG93bmVyIG11c3Qgc2xlZXAgYmVjYXVzZSBvZiBsaW5rIGNvbmdlc3Rpb24KICAqIEBzZW50X3VuYWNrZWQ6ICMgbWVzc2FnZXMgc2VudCBieSBzb2NrZXQsIGFuZCBub3QgeWV0IGFja2VkIGJ5IHBlZXIKICAqIEByY3ZfdW5hY2tlZDogIyBtZXNzYWdlcyByZWFkIGJ5IHVzZXIsIGJ1dCBub3QgeWV0IGFja2VkIGJhY2sgdG8gcGVlcgorICogQHJlbW90ZTogJ2Nvbm5lY3RlZCcgcGVlciBmb3IgZGdyYW0vcmRtCiAgKiBAbm9kZTogaGFzaCB0YWJsZSBub2RlCiAgKiBAcmN1OiByY3Ugc3RydWN0IGZvciB0aXBjX3NvY2sKICAqLwpAQCAtOTYsNiArOTYsNyBAQAogCWJvb2wgbGlua19jb25nOwogCXVpbnQgc2VudF91bmFja2VkOwogCXVpbnQgcmN2X3VuYWNrZWQ7CisJc3RydWN0IHNvY2thZGRyX3RpcGMgcmVtb3RlOwogCXN0cnVjdCByaGFzaF9oZWFkIG5vZGU7CiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKIH07CkBAIC0xMTQsMTMgKzExNSwxNCBAQAogc3RhdGljIHN0cnVjdCB0aXBjX3NvY2sgKnRpcGNfc2tfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwgdTMyIHBvcnRpZCk7CiBzdGF0aWMgaW50IHRpcGNfc2tfaW5zZXJ0KHN0cnVjdCB0aXBjX3NvY2sgKnRzayk7CiBzdGF0aWMgdm9pZCB0aXBjX3NrX3JlbW92ZShzdHJ1Y3QgdGlwY19zb2NrICp0c2spOworc3RhdGljIGludCBfX3RpcGNfc2VuZF9zdHJlYW0oc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbSwKKwkJCSAgICAgIHNpemVfdCBkc3opOworc3RhdGljIGludCBfX3RpcGNfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgZHN6KTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgcGFja2V0X29wczsKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIHN0cmVhbV9vcHM7CiBzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBtc2dfb3BzOwotCiBzdGF0aWMgc3RydWN0IHByb3RvIHRpcGNfcHJvdG87Ci1zdGF0aWMgc3RydWN0IHByb3RvIHRpcGNfcHJvdG9fa2VybjsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHRpcGNfbmxfc29ja19wb2xpY3lbVElQQ19OTEFfU09DS19NQVggKyAxXSA9IHsKIAlbVElQQ19OTEFfU09DS19VTlNQRUNdCQk9IHsgLnR5cGUgPSBOTEFfVU5TUEVDIH0sCkBAIC0xMzAsNiArMTMyLDggQEAKIAlbVElQQ19OTEFfU09DS19IQVNfUFVCTF0JPSB7IC50eXBlID0gTkxBX0ZMQUcgfQogfTsKIAorc3RhdGljIGNvbnN0IHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyB0c2tfcmh0X3BhcmFtczsKKwogLyoKICAqIFJldmlzZWQgVElQQyBzb2NrZXQgbG9ja2luZyBwb2xpY3k6CiAgKgpAQCAtMzM4LDExICszNDIsNyBAQAogCX0KIAogCS8qIEFsbG9jYXRlIHNvY2tldCdzIHByb3RvY29sIGFyZWEgKi8KLQlpZiAoIWtlcm4pCi0JCXNrID0gc2tfYWxsb2MobmV0LCBBRl9USVBDLCBHRlBfS0VSTkVMLCAmdGlwY19wcm90byk7Ci0JZWxzZQotCQlzayA9IHNrX2FsbG9jKG5ldCwgQUZfVElQQywgR0ZQX0tFUk5FTCwgJnRpcGNfcHJvdG9fa2Vybik7Ci0KKwlzayA9IHNrX2FsbG9jKG5ldCwgQUZfVElQQywgR0ZQX0tFUk5FTCwgJnRpcGNfcHJvdG8pOwogCWlmIChzayA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMzgwLDc1ICszODAsNiBAQAogCXJldHVybiAwOwogfQogCi0vKioKLSAqIHRpcGNfc29ja19jcmVhdGVfbG9jYWwgLSBjcmVhdGUgVElQQyBzb2NrZXQgZnJvbSBpbnNpZGUgVElQQyBtb2R1bGUKLSAqIEB0eXBlOiBzb2NrZXQgdHlwZSAtIFNPQ0tfUkRNIG9yIFNPQ0tfU0VRUEFDS0VUCi0gKgotICogV2UgY2Fubm90IHVzZSBzb2NrX2NyZWF0X2tlcm4gaGVyZSBiZWNhdXNlIGl0IGJ1bXBzIG1vZHVsZSB1c2VyIGNvdW50LgotICogU2luY2Ugc29ja2V0IG93bmVyIGFuZCBjcmVhdG9yIGlzIHRoZSBzYW1lIG1vZHVsZSB3ZSBtdXN0IG1ha2Ugc3VyZQotICogdGhhdCBtb2R1bGUgY291bnQgcmVtYWlucyB6ZXJvIGZvciBtb2R1bGUgbG9jYWwgc29ja2V0cywgb3RoZXJ3aXNlCi0gKiB3ZSBjYW5ub3QgZG8gcm1tb2QuCi0gKgotICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIGVycm5vIG90aGVyd2lzZQotICovCi1pbnQgdGlwY19zb2NrX2NyZWF0ZV9sb2NhbChzdHJ1Y3QgbmV0ICpuZXQsIGludCB0eXBlLCBzdHJ1Y3Qgc29ja2V0ICoqcmVzKQotewotCWludCByYzsKLQotCXJjID0gc29ja19jcmVhdGVfbGl0ZShBRl9USVBDLCB0eXBlLCAwLCByZXMpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGtlcm5lbCBzb2NrZXRcbiIpOwotCQlyZXR1cm4gcmM7Ci0JfQotCXRpcGNfc2tfY3JlYXRlKG5ldCwgKnJlcywgMCwgMSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB0aXBjX3NvY2tfcmVsZWFzZV9sb2NhbCAtIHJlbGVhc2Ugc29ja2V0IGNyZWF0ZWQgYnkgdGlwY19zb2NrX2NyZWF0ZV9sb2NhbAotICogQHNvY2s6IHRoZSBzb2NrZXQgdG8gYmUgcmVsZWFzZWQuCi0gKgotICogTW9kdWxlIHJlZmVyZW5jZSBjb3VudCBpcyBub3QgaW5jcmVtZW50ZWQgd2hlbiBzdWNoIHNvY2tldHMgYXJlIGNyZWF0ZWQsCi0gKiBzbyB3ZSBtdXN0IGtlZXAgaXQgZnJvbSBiZWluZyBkZWNyZW1lbnRlZCB3aGVuIHRoZXkgYXJlIHJlbGVhc2VkLgotICovCi12b2lkIHRpcGNfc29ja19yZWxlYXNlX2xvY2FsKHN0cnVjdCBzb2NrZXQgKnNvY2spCi17Ci0JdGlwY19yZWxlYXNlKHNvY2spOwotCXNvY2stPm9wcyA9IE5VTEw7Ci0Jc29ja19yZWxlYXNlKHNvY2spOwotfQotCi0vKioKLSAqIHRpcGNfc29ja19hY2NlcHRfbG9jYWwgLSBhY2NlcHQgYSBjb25uZWN0aW9uIG9uIGEgc29ja2V0IGNyZWF0ZWQKLSAqIHdpdGggdGlwY19zb2NrX2NyZWF0ZV9sb2NhbC4gVXNlIHRoaXMgZnVuY3Rpb24gdG8gYXZvaWQgdGhhdAotICogbW9kdWxlIHJlZmVyZW5jZSBjb3VudCBpcyBpbmFkdmVydGVudGx5IGluY3JlbWVudGVkLgotICoKLSAqIEBzb2NrOiAgICB0aGUgYWNjZXB0aW5nIHNvY2tldAotICogQG5ld3NvY2s6IHJlZmVyZW5jZSB0byB0aGUgbmV3IHNvY2tldCB0byBiZSBjcmVhdGVkCi0gKiBAZmxhZ3M6ICAgc29ja2V0IGZsYWdzCi0gKi8KLQotaW50IHRpcGNfc29ja19hY2NlcHRfbG9jYWwoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2tldCAqKm5ld3NvY2ssCi0JCQkgICBpbnQgZmxhZ3MpCi17Ci0Jc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7Ci0JaW50IHJldDsKLQotCXJldCA9IHNvY2tfY3JlYXRlX2xpdGUoc2stPnNrX2ZhbWlseSwgc2stPnNrX3R5cGUsCi0JCQkgICAgICAgc2stPnNrX3Byb3RvY29sLCBuZXdzb2NrKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHRpcGNfYWNjZXB0KHNvY2ssICpuZXdzb2NrLCBmbGFncyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJc29ja19yZWxlYXNlKCpuZXdzb2NrKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JKCpuZXdzb2NrKS0+b3BzID0gc29jay0+b3BzOwotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyB2b2lkIHRpcGNfc2tfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpoZWFkKQogewogCXN0cnVjdCB0aXBjX3NvY2sgKnRzayA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgdGlwY19zb2NrLCByY3UpOwpAQCAtODkyLDcgKzgyMyw2IEBACiAKIC8qKgogICogdGlwY19zZW5kbXNnIC0gc2VuZCBtZXNzYWdlIGluIGNvbm5lY3Rpb25sZXNzIG1hbm5lcgotICogQGlvY2I6IGlmIE5VTEwsIGluZGljYXRlcyB0aGF0IHNvY2tldCBsb2NrIGlzIGFscmVhZHkgaGVsZAogICogQHNvY2s6IHNvY2tldCBzdHJ1Y3R1cmUKICAqIEBtOiBtZXNzYWdlIHRvIHNlbmQKICAqIEBkc3o6IGFtb3VudCBvZiB1c2VyIGRhdGEgdG8gYmUgc2VudApAQCAtOTA0LDkgKzgzNCwyMSBAQAogICoKICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG9yIGVycm5vIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW50IHRpcGNfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCitzdGF0aWMgaW50IHRpcGNfc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLAogCQkJc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IGRzeikKIHsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgcmV0OworCisJbG9ja19zb2NrKHNrKTsKKwlyZXQgPSBfX3RpcGNfc2VuZG1zZyhzb2NrLCBtLCBkc3opOworCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fdGlwY19zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCBkc3opCit7CiAJREVDTEFSRV9TT0NLQUREUihzdHJ1Y3Qgc29ja2FkZHJfdGlwYyAqLCBkZXN0LCBtLT5tc2dfbmFtZSk7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHRpcGNfc29jayAqdHNrID0gdGlwY19zayhzayk7CkBAIC05MTUsNDkgKzg1Nyw0MCBAQAogCXUzMiBkbm9kZSwgZHBvcnQ7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcGt0Y2hhaW4gPSAmc2stPnNrX3dyaXRlX3F1ZXVlOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IHRpcGNfbmFtZV9zZXEgKnNlcSA9ICZkZXN0LT5hZGRyLm5hbWVzZXE7CisJc3RydWN0IHRpcGNfbmFtZV9zZXEgKnNlcTsKIAlzdHJ1Y3QgaW92X2l0ZXIgc2F2ZTsKIAl1MzIgbXR1OwogCWxvbmcgdGltZW87CiAJaW50IHJjOwogCi0JaWYgKHVubGlrZWx5KCFkZXN0KSkKLQkJcmV0dXJuIC1FREVTVEFERFJSRVE7Ci0KLQlpZiAodW5saWtlbHkoKG0tPm1zZ19uYW1lbGVuIDwgc2l6ZW9mKCpkZXN0KSkgfHwKLQkJICAgICAoZGVzdC0+ZmFtaWx5ICE9IEFGX1RJUEMpKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlpZiAoZHN6ID4gVElQQ19NQVhfVVNFUl9NU0dfU0laRSkKIAkJcmV0dXJuIC1FTVNHU0laRTsKLQotCWlmIChpb2NiKQotCQlsb2NrX3NvY2soc2spOwotCisJaWYgKHVubGlrZWx5KCFkZXN0KSkgeworCQlpZiAodHNrLT5jb25uZWN0ZWQgJiYgc29jay0+c3RhdGUgPT0gU1NfUkVBRFkpCisJCQlkZXN0ID0gJnRzay0+cmVtb3RlOworCQllbHNlCisJCQlyZXR1cm4gLUVERVNUQUREUlJFUTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KG0tPm1zZ19uYW1lbGVuIDwgc2l6ZW9mKCpkZXN0KSkgfHwKKwkJICAgZGVzdC0+ZmFtaWx5ICE9IEFGX1RJUEMpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCWlmICh1bmxpa2VseShzb2NrLT5zdGF0ZSAhPSBTU19SRUFEWSkpIHsKLQkJaWYgKHNvY2stPnN0YXRlID09IFNTX0xJU1RFTklORykgewotCQkJcmMgPSAtRVBJUEU7Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJaWYgKHNvY2stPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKSB7Ci0JCQlyYyA9IC1FSVNDT05OOwotCQkJZ290byBleGl0OwotCQl9Ci0JCWlmICh0c2stPnB1Ymxpc2hlZCkgewotCQkJcmMgPSAtRU9QTk9UU1VQUDsKLQkJCWdvdG8gZXhpdDsKLQkJfQorCQlpZiAoc29jay0+c3RhdGUgPT0gU1NfTElTVEVOSU5HKQorCQkJcmV0dXJuIC1FUElQRTsKKwkJaWYgKHNvY2stPnN0YXRlICE9IFNTX1VOQ09OTkVDVEVEKQorCQkJcmV0dXJuIC1FSVNDT05OOworCQlpZiAodHNrLT5wdWJsaXNoZWQpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCWlmIChkZXN0LT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTkFNRSkgewogCQkJdHNrLT5jb25uX3R5cGUgPSBkZXN0LT5hZGRyLm5hbWUubmFtZS50eXBlOwogCQkJdHNrLT5jb25uX2luc3RhbmNlID0gZGVzdC0+YWRkci5uYW1lLm5hbWUuaW5zdGFuY2U7CiAJCX0KIAl9Ci0KKwlzZXEgPSAmZGVzdC0+YWRkci5uYW1lc2VxOwogCXRpbWVvID0gc29ja19zbmR0aW1lbyhzaywgbS0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKTsKIAogCWlmIChkZXN0LT5hZGRydHlwZSA9PSBUSVBDX0FERFJfTUNBU1QpIHsKLQkJcmMgPSB0aXBjX3NlbmRtY2FzdChzb2NrLCBzZXEsIG0sIGRzeiwgdGltZW8pOwotCQlnb3RvIGV4aXQ7CisJCXJldHVybiB0aXBjX3NlbmRtY2FzdChzb2NrLCBzZXEsIG0sIGRzeiwgdGltZW8pOwogCX0gZWxzZSBpZiAoZGVzdC0+YWRkcnR5cGUgPT0gVElQQ19BRERSX05BTUUpIHsKIAkJdTMyIHR5cGUgPSBkZXN0LT5hZGRyLm5hbWUubmFtZS50eXBlOwogCQl1MzIgaW5zdCA9IGRlc3QtPmFkZHIubmFtZS5uYW1lLmluc3RhbmNlOwpAQCAtOTcyLDEwICs5MDUsOCBAQAogCQlkcG9ydCA9IHRpcGNfbmFtZXRibF90cmFuc2xhdGUobmV0LCB0eXBlLCBpbnN0LCAmZG5vZGUpOwogCQltc2dfc2V0X2Rlc3Rub2RlKG1oZHIsIGRub2RlKTsKIAkJbXNnX3NldF9kZXN0cG9ydChtaGRyLCBkcG9ydCk7Ci0JCWlmICh1bmxpa2VseSghZHBvcnQgJiYgIWRub2RlKSkgewotCQkJcmMgPSAtRUhPU1RVTlJFQUNIOwotCQkJZ290byBleGl0OwotCQl9CisJCWlmICh1bmxpa2VseSghZHBvcnQgJiYgIWRub2RlKSkKKwkJCXJldHVybiAtRUhPU1RVTlJFQUNIOwogCX0gZWxzZSBpZiAoZGVzdC0+YWRkcnR5cGUgPT0gVElQQ19BRERSX0lEKSB7CiAJCWRub2RlID0gZGVzdC0+YWRkci5pZC5ub2RlOwogCQltc2dfc2V0X3R5cGUobWhkciwgVElQQ19ESVJFQ1RfTVNHKTsKQEAgLTk5MCw3ICs5MjEsNyBAQAogCW10dSA9IHRpcGNfbm9kZV9nZXRfbXR1KG5ldCwgZG5vZGUsIHRzay0+cG9ydGlkKTsKIAlyYyA9IHRpcGNfbXNnX2J1aWxkKG1oZHIsIG0sIDAsIGRzeiwgbXR1LCBwa3RjaGFpbik7CiAJaWYgKHJjIDwgMCkKLQkJZ290byBleGl0OworCQlyZXR1cm4gcmM7CiAKIAlkbyB7CiAJCXNrYiA9IHNrYl9wZWVrKHBrdGNoYWluKTsKQEAgLTEwMTMsOSArOTQ0LDYgQEAKIAkJaWYgKHJjKQogCQkJX19za2JfcXVldWVfcHVyZ2UocGt0Y2hhaW4pOwogCX0gd2hpbGUgKCFyYyk7Ci1leGl0OgotCWlmIChpb2NiKQotCQlyZWxlYXNlX3NvY2soc2spOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtMTA1Miw3ICs5ODAsNiBAQAogCiAvKioKICAqIHRpcGNfc2VuZF9zdHJlYW0gLSBzZW5kIHN0cmVhbS1vcmllbnRlZCBkYXRhCi0gKiBAaW9jYjogKHVudXNlZCkKICAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCiAgKiBAbTogZGF0YSB0byBzZW5kCiAgKiBAZHN6OiB0b3RhbCBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc21pdHRlZApAQCAtMTA2Miw4ICs5ODksMTkgQEAKICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MgKG9yIHBhcnRpYWwgc3VjY2VzcyksCiAgKiBvciBlcnJubyBpZiBubyBkYXRhIHNlbnQKICAqLwotc3RhdGljIGludCB0aXBjX3NlbmRfc3RyZWFtKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICBzdHJ1Y3QgbXNnaGRyICptLCBzaXplX3QgZHN6KQorc3RhdGljIGludCB0aXBjX3NlbmRfc3RyZWFtKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCBkc3opCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJaW50IHJldDsKKworCWxvY2tfc29jayhzayk7CisJcmV0ID0gX190aXBjX3NlbmRfc3RyZWFtKHNvY2ssIG0sIGRzeik7CisJcmVsZWFzZV9zb2NrKHNrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX190aXBjX3NlbmRfc3RyZWFtKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCBkc3opCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IG5ldCAqbmV0ID0gc29ja19uZXQoc2spOwpAQCAtMTA4MCw3ICsxMDE4LDcgQEAKIAogCS8qIEhhbmRsZSBpbXBsaWVkIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCAqLwogCWlmICh1bmxpa2VseShkZXN0KSkgewotCQlyYyA9IHRpcGNfc2VuZG1zZyhpb2NiLCBzb2NrLCBtLCBkc3opOworCQlyYyA9IF9fdGlwY19zZW5kbXNnKHNvY2ssIG0sIGRzeik7CiAJCWlmIChkc3ogJiYgKGRzeiA9PSByYykpCiAJCQl0c2stPnNlbnRfdW5hY2tlZCA9IDE7CiAJCXJldHVybiByYzsKQEAgLTEwODgsMTUgKzEwMjYsMTEgQEAKIAlpZiAoZHN6ID4gKHVpbnQpSU5UX01BWCkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAotCWlmIChpb2NiKQotCQlsb2NrX3NvY2soc2spOwotCiAJaWYgKHVubGlrZWx5KHNvY2stPnN0YXRlICE9IFNTX0NPTk5FQ1RFRCkpIHsKIAkJaWYgKHNvY2stPnN0YXRlID09IFNTX0RJU0NPTk5FQ1RJTkcpCi0JCQlyYyA9IC1FUElQRTsKKwkJCXJldHVybiAtRVBJUEU7CiAJCWVsc2UKLQkJCXJjID0gLUVOT1RDT05OOwotCQlnb3RvIGV4aXQ7CisJCQlyZXR1cm4gLUVOT1RDT05OOwogCX0KIAogCXRpbWVvID0gc29ja19zbmR0aW1lbyhzaywgbS0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlUKTsKQEAgLTExMDgsNyArMTA0Miw3IEBACiAJc2VuZCA9IG1pbl90KHVpbnQsIGRzeiAtIHNlbnQsIFRJUENfTUFYX1VTRVJfTVNHX1NJWkUpOwogCXJjID0gdGlwY19tc2dfYnVpbGQobWhkciwgbSwgc2VudCwgc2VuZCwgbXR1LCBwa3RjaGFpbik7CiAJaWYgKHVubGlrZWx5KHJjIDwgMCkpCi0JCWdvdG8gZXhpdDsKKwkJcmV0dXJuIHJjOwogCWRvIHsKIAkJaWYgKGxpa2VseSghdHNrX2Nvbm5fY29uZyh0c2spKSkgewogCQkJcmMgPSB0aXBjX2xpbmtfeG1pdChuZXQsIHBrdGNoYWluLCBkbm9kZSwgcG9ydGlkKTsKQEAgLTExMzMsMTUgKzEwNjcsMTIgQEAKIAkJaWYgKHJjKQogCQkJX19za2JfcXVldWVfcHVyZ2UocGt0Y2hhaW4pOwogCX0gd2hpbGUgKCFyYyk7Ci1leGl0OgotCWlmIChpb2NiKQotCQlyZWxlYXNlX3NvY2soc2spOworCiAJcmV0dXJuIHNlbnQgPyBzZW50IDogcmM7CiB9CiAKIC8qKgogICogdGlwY19zZW5kX3BhY2tldCAtIHNlbmQgYSBjb25uZWN0aW9uLW9yaWVudGVkIG1lc3NhZ2UKLSAqIEBpb2NiOiBpZiBOVUxMLCBpbmRpY2F0ZXMgdGhhdCBzb2NrZXQgbG9jayBpcyBhbHJlYWR5IGhlbGQKICAqIEBzb2NrOiBzb2NrZXQgc3RydWN0dXJlCiAgKiBAbTogbWVzc2FnZSB0byBzZW5kCiAgKiBAZHN6OiBsZW5ndGggb2YgZGF0YSB0byBiZSB0cmFuc21pdHRlZApAQCAtMTE1MCwxMyArMTA4MSwxMiBAQAogICoKICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBzZW50IG9uIHN1Y2Nlc3MsIG9yIGVycm5vIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW50IHRpcGNfc2VuZF9wYWNrZXQoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCBkc3opCitzdGF0aWMgaW50IHRpcGNfc2VuZF9wYWNrZXQoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IGRzeikKIHsKIAlpZiAoZHN6ID4gVElQQ19NQVhfVVNFUl9NU0dfU0laRSkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAotCXJldHVybiB0aXBjX3NlbmRfc3RyZWFtKGlvY2IsIHNvY2ssIG0sIGRzeik7CisJcmV0dXJuIHRpcGNfc2VuZF9zdHJlYW0oc29jaywgbSwgZHN6KTsKIH0KIAogLyogdGlwY19za19maW5pc2hfY29ubiAtIGNvbXBsZXRlIHRoZSBzZXR1cCBvZiBhIGNvbm5lY3Rpb24KQEAgLTEzMTcsMTIgKzEyNDcsMTIgQEAKIAkJZXJyID0gMDsKIAkJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkKIAkJCWJyZWFrOwotCQllcnIgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOwotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQlicmVhazsKIAkJZXJyID0gLUVBR0FJTjsKIAkJaWYgKCF0aW1lbykKIAkJCWJyZWFrOworCQllcnIgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlicmVhazsKIAl9CiAJZmluaXNoX3dhaXQoc2tfc2xlZXAoc2spLCAmd2FpdCk7CiAJKnRpbWVvcCA9IHRpbWVvOwpAQCAtMTMzMSw3ICsxMjYxLDYgQEAKIAogLyoqCiAgKiB0aXBjX3JlY3Ztc2cgLSByZWNlaXZlIHBhY2tldC1vcmllbnRlZCBtZXNzYWdlCi0gKiBAaW9jYjogKHVudXNlZCkKICAqIEBtOiBkZXNjcmlwdG9yIGZvciBtZXNzYWdlIGluZm8KICAqIEBidWZfbGVuOiB0b3RhbCBzaXplIG9mIHVzZXIgYnVmZmVyIGFyZWEKICAqIEBmbGFnczogcmVjZWl2ZSBmbGFncwpAQCAtMTM0MSw4ICsxMjcwLDggQEAKICAqCiAgKiBSZXR1cm5zIHNpemUgb2YgcmV0dXJuZWQgbWVzc2FnZSBkYXRhLCBlcnJubyBvdGhlcndpc2UKICAqLwotc3RhdGljIGludCB0aXBjX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IGJ1Zl9sZW4sIGludCBmbGFncykKK3N0YXRpYyBpbnQgdGlwY19yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm0sIHNpemVfdCBidWZfbGVuLAorCQkJaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCB0aXBjX3NvY2sgKnRzayA9IHRpcGNfc2soc2spOwpAQCAtMTQyNiw3ICsxMzU1LDYgQEAKIAogLyoqCiAgKiB0aXBjX3JlY3Zfc3RyZWFtIC0gcmVjZWl2ZSBzdHJlYW0tb3JpZW50ZWQgZGF0YQotICogQGlvY2I6ICh1bnVzZWQpCiAgKiBAbTogZGVzY3JpcHRvciBmb3IgbWVzc2FnZSBpbmZvCiAgKiBAYnVmX2xlbjogdG90YWwgc2l6ZSBvZiB1c2VyIGJ1ZmZlciBhcmVhCiAgKiBAZmxhZ3M6IHJlY2VpdmUgZmxhZ3MKQEAgLTE0MzYsOCArMTM2NCw4IEBACiAgKgogICogUmV0dXJucyBzaXplIG9mIHJldHVybmVkIG1lc3NhZ2UgZGF0YSwgZXJybm8gb3RoZXJ3aXNlCiAgKi8KLXN0YXRpYyBpbnQgdGlwY19yZWN2X3N0cmVhbShzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgc3RydWN0IG1zZ2hkciAqbSwgc2l6ZV90IGJ1Zl9sZW4sIGludCBmbGFncykKK3N0YXRpYyBpbnQgdGlwY19yZWN2X3N0cmVhbShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptLAorCQkJICAgIHNpemVfdCBidWZfbGVuLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAJc3RydWN0IHRpcGNfc29jayAqdHNrID0gdGlwY19zayhzayk7CkBAIC0xOTA5LDE3ICsxODM3LDI2IEBACiAJCQlpbnQgZGVzdGxlbiwgaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCB0aXBjX3NvY2sgKnRzayA9IHRpcGNfc2soc2spOwogCXN0cnVjdCBzb2NrYWRkcl90aXBjICpkc3QgPSAoc3RydWN0IHNvY2thZGRyX3RpcGMgKilkZXN0OwogCXN0cnVjdCBtc2doZHIgbSA9IHtOVUxMLH07Ci0JbG9uZyB0aW1lb3V0ID0gKGZsYWdzICYgT19OT05CTE9DSykgPyAwIDogdGlwY19zayhzayktPmNvbm5fdGltZW91dDsKKwlsb25nIHRpbWVvdXQgPSAoZmxhZ3MgJiBPX05PTkJMT0NLKSA/IDAgOiB0c2stPmNvbm5fdGltZW91dDsKIAlzb2NrZXRfc3RhdGUgcHJldmlvdXM7Ci0JaW50IHJlczsKKwlpbnQgcmVzID0gMDsKIAogCWxvY2tfc29jayhzayk7CiAKLQkvKiBGb3Igbm93LCBUSVBDIGRvZXMgbm90IGFsbG93IHVzZSBvZiBjb25uZWN0KCkgd2l0aCBER1JBTS9SRE0gdHlwZXMgKi8KKwkvKiBER1JBTS9SRE0gY29ubmVjdCgpLCBqdXN0IHNhdmUgdGhlIGRlc3RhZGRyICovCiAJaWYgKHNvY2stPnN0YXRlID09IFNTX1JFQURZKSB7Ci0JCXJlcyA9IC1FT1BOT1RTVVBQOworCQlpZiAoZHN0LT5mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCQltZW1zZXQoJnRzay0+cmVtb3RlLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3RpcGMpKTsKKwkJCXRzay0+Y29ubmVjdGVkID0gMDsKKwkJfSBlbHNlIGlmIChkZXN0bGVuICE9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdGlwYykpIHsKKwkJCXJlcyA9IC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQltZW1jcHkoJnRzay0+cmVtb3RlLCBkZXN0LCBkZXN0bGVuKTsKKwkJCXRzay0+Y29ubmVjdGVkID0gMTsKKwkJfQogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xOTQ3LDcgKzE4ODQsNyBAQAogCQlpZiAoIXRpbWVvdXQpCiAJCQltLm1zZ19mbGFncyA9IE1TR19ET05UV0FJVDsKIAotCQlyZXMgPSB0aXBjX3NlbmRtc2coTlVMTCwgc29jaywgJm0sIDApOworCQlyZXMgPSBfX3RpcGNfc2VuZG1zZyhzb2NrLCAmbSwgMCk7CiAJCWlmICgocmVzIDwgMCkgJiYgKHJlcyAhPSAtRVdPVUxEQkxPQ0spKQogCQkJZ290byBleGl0OwogCkBAIC0yMDI3LDEyICsxOTY0LDEyIEBACiAJCWVyciA9IC1FSU5WQUw7CiAJCWlmIChzb2NrLT5zdGF0ZSAhPSBTU19MSVNURU5JTkcpCiAJCQlicmVhazsKLQkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKLQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJYnJlYWs7CiAJCWVyciA9IC1FQUdBSU47CiAJCWlmICghdGltZW8pCiAJCQlicmVhazsKKwkJZXJyID0gc29ja19pbnRyX2Vycm5vKHRpbWVvKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CiAJfQogCWZpbmlzaF93YWl0KHNrX3NsZWVwKHNrKSwgJndhaXQpOwogCXJldHVybiBlcnI7CkBAIC0yMTAzLDcgKzIwNDAsNyBAQAogCQlzdHJ1Y3QgbXNnaGRyIG0gPSB7TlVMTCx9OwogCiAJCXRza19hZHZhbmNlX3J4X3F1ZXVlKHNrKTsKLQkJdGlwY19zZW5kX3BhY2tldChOVUxMLCBuZXdfc29jaywgJm0sIDApOworCQlfX3RpcGNfc2VuZF9zdHJlYW0obmV3X3NvY2ssICZtLCAwKTsKIAl9IGVsc2UgewogCQlfX3NrYl9kZXF1ZXVlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CiAJCV9fc2tiX3F1ZXVlX2hlYWQoJm5ld19zay0+c2tfcmVjZWl2ZV9xdWV1ZSwgYnVmKTsKQEAgLTIxNTQsNyArMjA5MSw2IEBACiAJCQkJCSAgICAgVElQQ19DT05OX1NIVVRET1dOKSkKIAkJCQl0aXBjX2xpbmtfeG1pdF9za2IobmV0LCBza2IsIGRub2RlLAogCQkJCQkJICAgdHNrLT5wb3J0aWQpOwotCQkJdGlwY19ub2RlX3JlbW92ZV9jb25uKG5ldCwgZG5vZGUsIHRzay0+cG9ydGlkKTsKIAkJfSBlbHNlIHsKIAkJCWRub2RlID0gdHNrX3BlZXJfbm9kZSh0c2spOwogCkBAIC0yMzEyLDcgKzIyNDgsNyBAQAogCXN0cnVjdCB0aXBjX3NvY2sgKnRzazsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQl0c2sgPSByaGFzaHRhYmxlX2xvb2t1cCgmdG4tPnNrX3JodCwgJnBvcnRpZCk7CisJdHNrID0gcmhhc2h0YWJsZV9sb29rdXBfZmFzdCgmdG4tPnNrX3JodCwgJnBvcnRpZCwgdHNrX3JodF9wYXJhbXMpOwogCWlmICh0c2spCiAJCXNvY2tfaG9sZCgmdHNrLT5zayk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0yMzM0LDcgKzIyNzAsOCBAQAogCQkJcG9ydGlkID0gVElQQ19NSU5fUE9SVDsKIAkJdHNrLT5wb3J0aWQgPSBwb3J0aWQ7CiAJCXNvY2tfaG9sZCgmdHNrLT5zayk7Ci0JCWlmIChyaGFzaHRhYmxlX2xvb2t1cF9pbnNlcnQoJnRuLT5za19yaHQsICZ0c2stPm5vZGUpKQorCQlpZiAoIXJoYXNodGFibGVfbG9va3VwX2luc2VydF9mYXN0KCZ0bi0+c2tfcmh0LCAmdHNrLT5ub2RlLAorCQkJCQkJICAgdHNrX3JodF9wYXJhbXMpKQogCQkJcmV0dXJuIDA7CiAJCXNvY2tfcHV0KCZ0c2stPnNrKTsKIAl9CkBAIC0yMzQ3LDI2ICsyMjg0LDI3IEBACiAJc3RydWN0IHNvY2sgKnNrID0gJnRzay0+c2s7CiAJc3RydWN0IHRpcGNfbmV0ICp0biA9IG5ldF9nZW5lcmljKHNvY2tfbmV0KHNrKSwgdGlwY19uZXRfaWQpOwogCi0JaWYgKHJoYXNodGFibGVfcmVtb3ZlKCZ0bi0+c2tfcmh0LCAmdHNrLT5ub2RlKSkgeworCWlmICghcmhhc2h0YWJsZV9yZW1vdmVfZmFzdCgmdG4tPnNrX3JodCwgJnRzay0+bm9kZSwgdHNrX3JodF9wYXJhbXMpKSB7CiAJCVdBUk5fT04oYXRvbWljX3JlYWQoJnNrLT5za19yZWZjbnQpID09IDEpOwogCQlfX3NvY2tfcHV0KHNrKTsKIAl9CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgdHNrX3JodF9wYXJhbXMgPSB7CisJLm5lbGVtX2hpbnQgPSAxOTIsCisJLmhlYWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRpcGNfc29jaywgbm9kZSksCisJLmtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGlwY19zb2NrLCBwb3J0aWQpLAorCS5rZXlfbGVuID0gc2l6ZW9mKHUzMiksIC8qIHBvcnRpZCAqLworCS5tYXhfc2l6ZSA9IDEwNDg1NzYsCisJLm1pbl9zaXplID0gMjU2LAorCS5hdXRvbWF0aWNfc2hyaW5raW5nID0gdHJ1ZSwKK307CisKIGludCB0aXBjX3NrX3JodF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gbmV0X2dlbmVyaWMobmV0LCB0aXBjX25ldF9pZCk7Ci0Jc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHJodF9wYXJhbXMgPSB7Ci0JCS5uZWxlbV9oaW50ID0gMTkyLAotCQkuaGVhZF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGlwY19zb2NrLCBub2RlKSwKLQkJLmtleV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgdGlwY19zb2NrLCBwb3J0aWQpLAotCQkua2V5X2xlbiA9IHNpemVvZih1MzIpLCAvKiBwb3J0aWQgKi8KLQkJLmhhc2hmbiA9IGpoYXNoLAotCQkubWF4X3NoaWZ0ID0gMjAsIC8qIDFNICovCi0JCS5taW5fc2hpZnQgPSA4LCAgLyogMjU2ICovCi0JfTsKIAotCXJldHVybiByaGFzaHRhYmxlX2luaXQoJnRuLT5za19yaHQsICZyaHRfcGFyYW1zKTsKKwlyZXR1cm4gcmhhc2h0YWJsZV9pbml0KCZ0bi0+c2tfcmh0LCAmdHNrX3JodF9wYXJhbXMpOwogfQogCiB2b2lkIHRpcGNfc2tfcmh0X2Rlc3Ryb3koc3RydWN0IG5ldCAqbmV0KQpAQCAtMjYwOSwxMiArMjU0Nyw2IEBACiAJLnN5c2N0bF9ybWVtCT0gc3lzY3RsX3RpcGNfcm1lbQogfTsKIAotc3RhdGljIHN0cnVjdCBwcm90byB0aXBjX3Byb3RvX2tlcm4gPSB7Ci0JLm5hbWUJCT0gIlRJUEMiLAotCS5vYmpfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgdGlwY19zb2NrKSwKLQkuc3lzY3RsX3JtZW0JPSBzeXNjdGxfdGlwY19ybWVtCi19OwotCiAvKioKICAqIHRpcGNfc29ja2V0X2luaXQgLSBpbml0aWFsaXplIFRJUEMgc29ja2V0IGludGVyZmFjZQogICoKZGlmZiAtLWdpdCBhL25ldC90aXBjL3NvY2tldC5oIGIvbmV0L3RpcGMvc29ja2V0LmgKaW5kZXggMjM4ZjFiNy4uYmY2NTUxMyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvc29ja2V0LmgKKysrIGIvbmV0L3RpcGMvc29ja2V0LmgKQEAgLTQ0LDEwICs0NCw2IEBACiAJCQkJICBTS0JfVFJVRVNJWkUoVElQQ19NQVhfVVNFUl9NU0dfU0laRSkpCiBpbnQgdGlwY19zb2NrZXRfaW5pdCh2b2lkKTsKIHZvaWQgdGlwY19zb2NrZXRfc3RvcCh2b2lkKTsKLWludCB0aXBjX3NvY2tfY3JlYXRlX2xvY2FsKHN0cnVjdCBuZXQgKm5ldCwgaW50IHR5cGUsIHN0cnVjdCBzb2NrZXQgKipyZXMpOwotdm9pZCB0aXBjX3NvY2tfcmVsZWFzZV9sb2NhbChzdHJ1Y3Qgc29ja2V0ICpzb2NrKTsKLWludCB0aXBjX3NvY2tfYWNjZXB0X2xvY2FsKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBzb2NrZXQgKipuZXdzb2NrLAotCQkJICAgaW50IGZsYWdzKTsKIGludCB0aXBjX3NrX3JjdihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmX2hlYWQgKmlucHV0cSk7CiB2b2lkIHRpcGNfc2tfbWNhc3RfcmN2KHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqYXJydnEsCiAJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICppbnB1dHEpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvc3Vic2NyLmMgYi9uZXQvdGlwYy9zdWJzY3IuYwppbmRleCA3MmMzMzllLi4xYzE0N2M4IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9zdWJzY3IuYworKysgYi9uZXQvdGlwYy9zdWJzY3IuYwpAQCAtMTYyLDE5ICsxNjIsNiBAQAogCWF0b21pY19kZWMoJnRuLT5zdWJzY3JpcHRpb25fY291bnQpOwogfQogCi0vKioKLSAqIHN1YnNjcl90ZXJtaW5hdGUgLSB0ZXJtaW5hdGUgY29tbXVuaWNhdGlvbiB3aXRoIGEgc3Vic2NyaWJlcgotICoKLSAqIE5vdGU6IE11c3QgY2FsbCBpdCBpbiBwcm9jZXNzIGNvbnRleHQgc2luY2UgaXQgbWlnaHQgc2xlZXAuCi0gKi8KLXN0YXRpYyB2b2lkIHN1YnNjcl90ZXJtaW5hdGUoc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWIpCi17Ci0Jc3RydWN0IHRpcGNfc3Vic2NyaWJlciAqc3Vic2NyaWJlciA9IHN1Yi0+c3Vic2NyaWJlcjsKLQlzdHJ1Y3QgdGlwY19uZXQgKnRuID0gbmV0X2dlbmVyaWMoc3ViLT5uZXQsIHRpcGNfbmV0X2lkKTsKLQotCXRpcGNfY29ubl90ZXJtaW5hdGUodG4tPnRvcHNydiwgc3Vic2NyaWJlci0+Y29uaWQpOwotfQotCiBzdGF0aWMgdm9pZCBzdWJzY3JfcmVsZWFzZShzdHJ1Y3QgdGlwY19zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQogewogCXN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqc3ViOwpAQCAtMzEyLDE2ICsyOTksMTQgQEAKIHsKIAlzdHJ1Y3QgdGlwY19zdWJzY3JpYmVyICpzdWJzY3JpYmVyID0gdXNyX2RhdGE7CiAJc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWIgPSBOVUxMOworCXN0cnVjdCB0aXBjX25ldCAqdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHRpcGNfbmV0X2lkKTsKIAogCXNwaW5fbG9ja19iaCgmc3Vic2NyaWJlci0+bG9jayk7Ci0JaWYgKHN1YnNjcl9zdWJzY3JpYmUobmV0LCAoc3RydWN0IHRpcGNfc3Vic2NyICopYnVmLCBzdWJzY3JpYmVyLAotCQkJICAgICAmc3ViKSA8IDApIHsKLQkJc3Bpbl91bmxvY2tfYmgoJnN1YnNjcmliZXItPmxvY2spOwotCQlzdWJzY3JfdGVybWluYXRlKHN1Yik7Ci0JCXJldHVybjsKLQl9CisJc3Vic2NyX3N1YnNjcmliZShuZXQsIChzdHJ1Y3QgdGlwY19zdWJzY3IgKilidWYsIHN1YnNjcmliZXIsICZzdWIpOwogCWlmIChzdWIpCiAJCXRpcGNfbmFtZXRibF9zdWJzY3JpYmUoc3ViKTsKKwllbHNlCisJCXRpcGNfY29ubl90ZXJtaW5hdGUodG4tPnRvcHNydiwgc3Vic2NyaWJlci0+Y29uaWQpOwogCXNwaW5fdW5sb2NrX2JoKCZzdWJzY3JpYmVyLT5sb2NrKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvdWRwX21lZGlhLmMgYi9uZXQvdGlwYy91ZHBfbWVkaWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmRlZWJjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3RpcGMvdWRwX21lZGlhLmMKQEAgLTAsMCArMSw0NDggQEAKKy8qIG5ldC90aXBjL3VkcF9tZWRpYS5jOiBJUCBiZWFyZXIgc3VwcG9ydCBmb3IgVElQQworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgRXJpY3Nzb24gQUIKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWdtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC91ZHBfdHVubmVsLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bGludXgvdGlwY19uZXRsaW5rLmg+CisjaW5jbHVkZSAiY29yZS5oIgorI2luY2x1ZGUgImJlYXJlci5oIgorCisvKiBJQU5BIGFzc2lnbmVkIFVEUCBwb3J0ICovCisjZGVmaW5lIFVEUF9QT1JUX0RFRkFVTFQJNjExOAorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgdGlwY19ubF91ZHBfcG9saWN5W1RJUENfTkxBX1VEUF9NQVggKyAxXSA9IHsKKwlbVElQQ19OTEFfVURQX1VOU1BFQ10JPSB7LnR5cGUgPSBOTEFfVU5TUEVDfSwKKwlbVElQQ19OTEFfVURQX0xPQ0FMXQk9IHsudHlwZSA9IE5MQV9CSU5BUlksCisJCQkJICAgLmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSl9LAorCVtUSVBDX05MQV9VRFBfUkVNT1RFXQk9IHsudHlwZSA9IE5MQV9CSU5BUlksCisJCQkJICAgLmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSl9LAorfTsKKworLyoqCisgKiBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgLSBJUC9VRFAgYWRkcmVzc2luZyBpbmZvcm1hdGlvbgorICoKKyAqIFRoaXMgaXMgdGhlIGJlYXJlciBsZXZlbCBvcmlnaW5hdGluZyBhZGRyZXNzIHVzZWQgaW4gbmVpZ2hib3IgZGlzY292ZXJ5CisgKiBtZXNzYWdlcywgYW5kIGFsbCBmaWVsZHMgc2hvdWxkIGJlIGluIG5ldHdvcmsgYnl0ZSBvcmRlcgorICovCitzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgeworCV9fYmUxNglwcm90bzsKKwlfX2JlMTYJdWRwX3BvcnQ7CisJdW5pb24geworCQlzdHJ1Y3QgaW5fYWRkciBpcHY0OworCQlzdHJ1Y3QgaW42X2FkZHIgaXB2NjsKKwl9OworfTsKKworLyoqCisgKiBzdHJ1Y3QgdWRwX2JlYXJlciAtIGlwL3VkcCBiZWFyZXIgZGF0YSBzdHJ1Y3R1cmUKKyAqIEBiZWFyZXI6CWFzc29jaWF0ZWQgZ2VuZXJpYyB0aXBjIGJlYXJlcgorICogQHVic29jazoJYmVhcmVyIGFzc29jaWF0ZWQgc29ja2V0CisgKiBAaWZpbmRleDoJbG9jYWwgYWRkcmVzcyBzY29wZQorICogQHdvcms6CXVzZWQgdG8gc2NoZWR1bGUgZGVmZXJyZWQgd29yayBvbiBhIGJlYXJlcgorICovCitzdHJ1Y3QgdWRwX2JlYXJlciB7CisJc3RydWN0IHRpcGNfYmVhcmVyIF9fcmN1ICpiZWFyZXI7CisJc3RydWN0IHNvY2tldCAqdWJzb2NrOworCXUzMiBpZmluZGV4OworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworfTsKKworLyogdWRwX21lZGlhX2FkZHJfc2V0IC0gY29udmVydCBhIGlwL3VkcCBhZGRyZXNzIHRvIGEgVElQQyBtZWRpYSBhZGRyZXNzICovCitzdGF0aWMgdm9pZCB0aXBjX3VkcF9tZWRpYV9hZGRyX3NldChzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphZGRyLAorCQkJCSAgICBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnVhKQoreworCW1lbXNldChhZGRyLCAwLCBzaXplb2Yoc3RydWN0IHRpcGNfbWVkaWFfYWRkcikpOworCWFkZHItPm1lZGlhX2lkID0gVElQQ19NRURJQV9UWVBFX1VEUDsKKwltZW1jcHkoYWRkci0+dmFsdWUsIHVhLCBzaXplb2Yoc3RydWN0IHVkcF9tZWRpYV9hZGRyKSk7CisJaWYgKG50b2hzKHVhLT5wcm90bykgPT0gRVRIX1BfSVApIHsKKwkJaWYgKGlwdjRfaXNfbXVsdGljYXN0KHVhLT5pcHY0LnNfYWRkcikpCisJCQlhZGRyLT5icm9hZGNhc3QgPSAxOworCX0gZWxzZSBpZiAobnRvaHModWEtPnByb3RvKSA9PSBFVEhfUF9JUFY2KSB7CisJCWlmIChpcHY2X2FkZHJfdHlwZSgmdWEtPmlwdjYpICYgSVBWNl9BRERSX01VTFRJQ0FTVCkKKwkJCWFkZHItPmJyb2FkY2FzdCA9IDE7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJJbnZhbGlkIFVEUCBtZWRpYSBhZGRyZXNzXG4iKTsKKwl9Cit9CisKKy8qIHRpcGNfdWRwX2FkZHIyc3RyIC0gY29udmVydCBpcC91ZHAgYWRkcmVzcyB0byBzdHJpbmcgKi8KK3N0YXRpYyBpbnQgdGlwY191ZHBfYWRkcjJzdHIoc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSwgY2hhciAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnVhID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZhLT52YWx1ZTsKKworCWlmIChudG9ocyh1YS0+cHJvdG8pID09IEVUSF9QX0lQKQorCQlzbnByaW50ZihidWYsIHNpemUsICIlcEk0OiV1IiwgJnVhLT5pcHY0LCBudG9ocyh1YS0+dWRwX3BvcnQpKTsKKwllbHNlIGlmIChudG9ocyh1YS0+cHJvdG8pID09IEVUSF9QX0lQVjYpCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZSwgIiVwSTY6JXUiLCAmdWEtPmlwdjYsIG50b2hzKHVhLT51ZHBfcG9ydCkpOworCWVsc2UKKwkJcHJfZXJyKCJJbnZhbGlkIFVEUCBtZWRpYSBhZGRyZXNzXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogdGlwY191ZHBfbXNnMmFkZHIgLSBleHRyYWN0IGFuIGlwL3VkcCBhZGRyZXNzIGZyb20gYSBUSVBDIG5kaXNjIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgdGlwY191ZHBfbXNnMmFkZHIoc3RydWN0IHRpcGNfYmVhcmVyICpiLCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphLAorCQkJICAgICBjaGFyICptc2cpCit7CisJc3RydWN0IHVkcF9tZWRpYV9hZGRyICp1YTsKKworCXVhID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSAobXNnICsgVElQQ19NRURJQV9BRERSX09GRlNFVCk7CisJaWYgKG1zZ1tUSVBDX01FRElBX1RZUEVfT0ZGU0VUXSAhPSBUSVBDX01FRElBX1RZUEVfVURQKQorCQlyZXR1cm4gLUVJTlZBTDsKKwl0aXBjX3VkcF9tZWRpYV9hZGRyX3NldChhLCB1YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHRpcGNfdWRwX2FkZHIybXNnIC0gd3JpdGUgYW4gaXAvdWRwIGFkZHJlc3MgdG8gYSBUSVBDIG5kaXNjIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgdGlwY191ZHBfYWRkcjJtc2coY2hhciAqbXNnLCBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphKQoreworCW1lbXNldChtc2csIDAsIFRJUENfTUVESUFfSU5GT19TSVpFKTsKKwltc2dbVElQQ19NRURJQV9UWVBFX09GRlNFVF0gPSBUSVBDX01FRElBX1RZUEVfVURQOworCW1lbWNweShtc2cgKyBUSVBDX01FRElBX0FERFJfT0ZGU0VULCBhLT52YWx1ZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCB1ZHBfbWVkaWFfYWRkcikpOworCXJldHVybiAwOworfQorCisvKiB0aXBjX3NlbmRfbXNnIC0gZW5xdWV1ZSBhIHNlbmQgcmVxdWVzdCAqLworc3RhdGljIGludCB0aXBjX3VkcF9zZW5kX21zZyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkgICAgIHN0cnVjdCB0aXBjX2JlYXJlciAqYiwKKwkJCSAgICAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCkKK3sKKwlpbnQgdHRsLCBlcnIgPSAwOworCXN0cnVjdCB1ZHBfYmVhcmVyICp1YjsKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKmRzdCA9IChzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKikmZGVzdC0+dmFsdWU7CisJc3RydWN0IHVkcF9tZWRpYV9hZGRyICpzcmMgPSAoc3RydWN0IHVkcF9tZWRpYV9hZGRyICopJmItPmFkZHIudmFsdWU7CisJc3RydWN0IHNrX2J1ZmYgKmNsb25lOworCXN0cnVjdCBydGFibGUgKnJ0OworCisJY2xvbmUgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKKwlza2Jfc2V0X2lubmVyX3Byb3RvY29sKGNsb25lLCBodG9ucyhFVEhfUF9USVBDKSk7CisJdWIgPSByY3VfZGVyZWZlcmVuY2VfcnRubChiLT5tZWRpYV9wdHIpOworCWlmICghdWIpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byB0eF9lcnJvcjsKKwl9CisJaWYgKGRzdC0+cHJvdG8gPT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCXN0cnVjdCBmbG93aTQgZmwgPSB7CisJCQkuZGFkZHIgPSBkc3QtPmlwdjQuc19hZGRyLAorCQkJLnNhZGRyID0gc3JjLT5pcHY0LnNfYWRkciwKKwkJCS5mbG93aTRfbWFyayA9IGNsb25lLT5tYXJrLAorCQkJLmZsb3dpNF9wcm90byA9IElQUFJPVE9fVURQCisJCX07CisJCXJ0ID0gaXBfcm91dGVfb3V0cHV0X2tleShuZXQsICZmbCk7CisJCWlmIChJU19FUlIocnQpKSB7CisJCQllcnIgPSBQVFJfRVJSKHJ0KTsKKwkJCWdvdG8gdHhfZXJyb3I7CisJCX0KKwkJdHRsID0gaXA0X2RzdF9ob3BsaW1pdCgmcnQtPmRzdCk7CisJCWVyciA9IHVkcF90dW5uZWxfeG1pdF9za2IocnQsIHViLT51YnNvY2stPnNrLCBjbG9uZSwKKwkJCQkJICBzcmMtPmlwdjQuc19hZGRyLAorCQkJCQkgIGRzdC0+aXB2NC5zX2FkZHIsIDAsIHR0bCwgMCwKKwkJCQkJICBzcmMtPnVkcF9wb3J0LCBkc3QtPnVkcF9wb3J0LAorCQkJCQkgIGZhbHNlLCB0cnVlKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWlwX3J0X3B1dChydCk7CisJCQlnb3RvIHR4X2Vycm9yOworCQl9CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKwl9IGVsc2UgeworCQlzdHJ1Y3QgZHN0X2VudHJ5ICpuZHN0OworCQlzdHJ1Y3QgZmxvd2k2IGZsNiA9IHsKKwkJCS5mbG93aTZfb2lmID0gdWItPmlmaW5kZXgsCisJCQkuZGFkZHIgPSBkc3QtPmlwdjYsCisJCQkuc2FkZHIgPSBzcmMtPmlwdjYsCisJCQkuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19VRFAKKwkJfTsKKwkJZXJyID0gaXB2Nl9zdHViLT5pcHY2X2RzdF9sb29rdXAodWItPnVic29jay0+c2ssICZuZHN0LCAmZmw2KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdHhfZXJyb3I7CisJCXR0bCA9IGlwNl9kc3RfaG9wbGltaXQobmRzdCk7CisJCWVyciA9IHVkcF90dW5uZWw2X3htaXRfc2tiKG5kc3QsIHViLT51YnNvY2stPnNrLCBjbG9uZSwKKwkJCQkJICAgbmRzdC0+ZGV2LCAmc3JjLT5pcHY2LAorCQkJCQkgICAmZHN0LT5pcHY2LCAwLCB0dGwsIHNyYy0+dWRwX3BvcnQsCisJCQkJCSAgIGRzdC0+dWRwX3BvcnQsIGZhbHNlKTsKKyNlbmRpZgorCX0KKwlyZXR1cm4gZXJyOworCit0eF9lcnJvcjoKKwlrZnJlZV9za2IoY2xvbmUpOworCXJldHVybiBlcnI7Cit9CisKKy8qIHRpcGNfdWRwX3JlY3YgLSByZWFkIGRhdGEgZnJvbSBiZWFyZXIgc29ja2V0ICovCitzdGF0aWMgaW50IHRpcGNfdWRwX3JlY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB1ZHBfYmVhcmVyICp1YjsKKwlzdHJ1Y3QgdGlwY19iZWFyZXIgKmI7CisKKwl1YiA9IHJjdV9kZXJlZmVyZW5jZV9za191c2VyX2RhdGEoc2spOworCWlmICghdWIpIHsKKwkJcHJfZXJyX3JhdGVsaW1pdGVkKCJGYWlsZWQgdG8gZ2V0IFVEUCBiZWFyZXIgcmVmZXJlbmNlIik7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gMDsKKwl9CisKKwlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7CisJcmN1X3JlYWRfbG9jaygpOworCWIgPSByY3VfZGVyZWZlcmVuY2VfcnRubCh1Yi0+YmVhcmVyKTsKKworCWlmIChiKSB7CisJCXRpcGNfcmN2KHNvY2tfbmV0KHNrKSwgc2tiLCBiKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXJldHVybiAwOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwlrZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmFibGVfbWNhc3Qoc3RydWN0IHVkcF9iZWFyZXIgKnViLCBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnJlbW90ZSkKK3sKKwlpbnQgZXJyID0gMDsKKwlzdHJ1Y3QgaXBfbXJlcW4gbXJlcW47CisJc3RydWN0IHNvY2sgKnNrID0gdWItPnVic29jay0+c2s7CisKKwlpZiAobnRvaHMocmVtb3RlLT5wcm90bykgPT0gRVRIX1BfSVApIHsKKwkJaWYgKCFpcHY0X2lzX211bHRpY2FzdChyZW1vdGUtPmlwdjQuc19hZGRyKSkKKwkJCXJldHVybiAwOworCQltcmVxbi5pbXJfbXVsdGlhZGRyID0gcmVtb3RlLT5pcHY0OworCQltcmVxbi5pbXJfaWZpbmRleCA9IHViLT5pZmluZGV4OworCQllcnIgPSBpcF9tY19qb2luX2dyb3VwKHNrLCAmbXJlcW4pOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJfSBlbHNlIHsKKwkJaWYgKCFpcHY2X2FkZHJfaXNfbXVsdGljYXN0KCZyZW1vdGUtPmlwdjYpKQorCQkJcmV0dXJuIDA7CisJCWVyciA9IGlwdjZfc3R1Yi0+aXB2Nl9zb2NrX21jX2pvaW4oc2ssIHViLT5pZmluZGV4LAorCQkJCQkJICAgJnJlbW90ZS0+aXB2Nik7CisjZW5kaWYKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyoqCisgKiBwYXJzZV9vcHRpb25zIC0gYnVpbGQgbG9jYWwvcmVtb3RlIGFkZHJlc3NlcyBmcm9tIGNvbmZpZ3VyYXRpb24KKyAqIEBhdHRyczoJbmV0bGluayBjb25maWcgZGF0YQorICogQHViOgkJVURQIGJlYXJlciBpbnN0YW5jZQorICogQGxvY2FsOglsb2NhbCBiZWFyZXIgSVAgYWRkcmVzcy9wb3J0CisgKiBAcmVtb3RlOglwZWVyIG9yIG11bHRpY2FzdCBJUC9wb3J0CisgKi8KK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhzdHJ1Y3QgbmxhdHRyICphdHRyc1tdLCBzdHJ1Y3QgdWRwX2JlYXJlciAqdWIsCisJCQkgc3RydWN0IHVkcF9tZWRpYV9hZGRyICpsb2NhbCwKKwkJCSBzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnJlbW90ZSkKK3sKKwlzdHJ1Y3QgbmxhdHRyICpvcHRzW1RJUENfTkxBX1VEUF9NQVggKyAxXTsKKwlzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqc2FfbG9jYWwsICpzYV9yZW1vdGU7CisKKwlpZiAoIWF0dHJzW1RJUENfTkxBX0JFQVJFUl9VRFBfT1BUU10pCisJCWdvdG8gZXJyOworCWlmIChubGFfcGFyc2VfbmVzdGVkKG9wdHMsIFRJUENfTkxBX1VEUF9NQVgsCisJCQkgICAgIGF0dHJzW1RJUENfTkxBX0JFQVJFUl9VRFBfT1BUU10sCisJCQkgICAgIHRpcGNfbmxfdWRwX3BvbGljeSkpCisJCWdvdG8gZXJyOworCWlmIChvcHRzW1RJUENfTkxBX1VEUF9MT0NBTF0gJiYgb3B0c1tUSVBDX05MQV9VRFBfUkVNT1RFXSkgeworCQlzYV9sb2NhbCA9IG5sYV9kYXRhKG9wdHNbVElQQ19OTEFfVURQX0xPQ0FMXSk7CisJCXNhX3JlbW90ZSA9IG5sYV9kYXRhKG9wdHNbVElQQ19OTEFfVURQX1JFTU9URV0pOworCX0gZWxzZSB7CitlcnI6CisJCXByX2VycigiSW52YWxpZCBVRFAgYmVhcmVyIGNvbmZpZ3VyYXRpb24iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmICgoc2FfbG9jYWwtPnNzX2ZhbWlseSAmIHNhX3JlbW90ZS0+c3NfZmFtaWx5KSA9PSBBRl9JTkVUKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiAqaXA0OworCisJCWlwNCA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilzYV9sb2NhbDsKKwkJbG9jYWwtPnByb3RvID0gaHRvbnMoRVRIX1BfSVApOworCQlsb2NhbC0+dWRwX3BvcnQgPSBpcDQtPnNpbl9wb3J0OworCQlsb2NhbC0+aXB2NC5zX2FkZHIgPSBpcDQtPnNpbl9hZGRyLnNfYWRkcjsKKworCQlpcDQgPSAoc3RydWN0IHNvY2thZGRyX2luICopc2FfcmVtb3RlOworCQlyZW1vdGUtPnByb3RvID0gaHRvbnMoRVRIX1BfSVApOworCQlyZW1vdGUtPnVkcF9wb3J0ID0gaXA0LT5zaW5fcG9ydDsKKwkJcmVtb3RlLT5pcHY0LnNfYWRkciA9IGlwNC0+c2luX2FkZHIuc19hZGRyOworCQlyZXR1cm4gMDsKKworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJfSBlbHNlIGlmICgoc2FfbG9jYWwtPnNzX2ZhbWlseSAmIHNhX3JlbW90ZS0+c3NfZmFtaWx5KSA9PSBBRl9JTkVUNikgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICppcDY7CisKKwkJaXA2ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYV9sb2NhbDsKKwkJbG9jYWwtPnByb3RvID0gaHRvbnMoRVRIX1BfSVBWNik7CisJCWxvY2FsLT51ZHBfcG9ydCA9IGlwNi0+c2luNl9wb3J0OworCQlsb2NhbC0+aXB2NiA9IGlwNi0+c2luNl9hZGRyOworCQl1Yi0+aWZpbmRleCA9IGlwNi0+c2luNl9zY29wZV9pZDsKKworCQlpcDYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKXNhX3JlbW90ZTsKKwkJcmVtb3RlLT5wcm90byA9IGh0b25zKEVUSF9QX0lQVjYpOworCQlyZW1vdGUtPnVkcF9wb3J0ID0gaXA2LT5zaW42X3BvcnQ7CisJCXJlbW90ZS0+aXB2NiA9IGlwNi0+c2luNl9hZGRyOworCQlyZXR1cm4gMDsKKyNlbmRpZgorCX0KKwlyZXR1cm4gLUVBRERSTk9UQVZBSUw7Cit9CisKKy8qKgorICogdGlwY191ZHBfZW5hYmxlIC0gY2FsbGJhY2sgdG8gY3JlYXRlIGEgbmV3IHVkcCBiZWFyZXIgaW5zdGFuY2UKKyAqIEBuZXQ6CW5ldHdvcmsgbmFtZXNwYWNlCisgKiBAYjoJCXBvaW50ZXIgdG8gZ2VuZXJpYyB0aXBjX2JlYXJlcgorICogQGF0dHJzOgluZXRsaW5rIGJlYXJlciBjb25maWd1cmF0aW9uCisgKgorICogdmFsaWRhdGUgdGhlIGJlYXJlciBwYXJhbWV0ZXJzIGFuZCBpbml0aWFsaXplIHRoZSB1ZHAgYmVhcmVyCisgKiBydG5sX2xvY2sgc2hvdWxkIGJlIGhlbGQKKyAqLworc3RhdGljIGludCB0aXBjX3VkcF9lbmFibGUoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmIsCisJCQkgICBzdHJ1Y3QgbmxhdHRyICphdHRyc1tdKQoreworCWludCBlcnIgPSAtRUlOVkFMOworCXN0cnVjdCB1ZHBfYmVhcmVyICp1YjsKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgKnJlbW90ZTsKKwlzdHJ1Y3QgdWRwX21lZGlhX2FkZHIgbG9jYWwgPSB7MH07CisJc3RydWN0IHVkcF9wb3J0X2NmZyB1ZHBfY29uZiA9IHswfTsKKwlzdHJ1Y3QgdWRwX3R1bm5lbF9zb2NrX2NmZyB0dW5jZmcgPSB7TlVMTH07CisKKwl1YiA9IGt6YWxsb2Moc2l6ZW9mKCp1YiksIEdGUF9BVE9NSUMpOworCWlmICghdWIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVtb3RlID0gKHN0cnVjdCB1ZHBfbWVkaWFfYWRkciAqKSZiLT5iY2FzdF9hZGRyLnZhbHVlOworCW1lbXNldChyZW1vdGUsIDAsIHNpemVvZihzdHJ1Y3QgdWRwX21lZGlhX2FkZHIpKTsKKwllcnIgPSBwYXJzZV9vcHRpb25zKGF0dHJzLCB1YiwgJmxvY2FsLCByZW1vdGUpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCisJYi0+YmNhc3RfYWRkci5tZWRpYV9pZCA9IFRJUENfTUVESUFfVFlQRV9VRFA7CisJYi0+YmNhc3RfYWRkci5icm9hZGNhc3QgPSAxOworCXJjdV9hc3NpZ25fcG9pbnRlcihiLT5tZWRpYV9wdHIsIHViKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIodWItPmJlYXJlciwgYik7CisJdGlwY191ZHBfbWVkaWFfYWRkcl9zZXQoJmItPmFkZHIsICZsb2NhbCk7CisJaWYgKGxvY2FsLnByb3RvID09IGh0b25zKEVUSF9QX0lQKSkgeworCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJCWRldiA9IF9faXBfZGV2X2ZpbmQobmV0LCBsb2NhbC5pcHY0LnNfYWRkciwgZmFsc2UpOworCQlpZiAoIWRldikgeworCQkJZXJyID0gLUVOT0RFVjsKKwkJCWdvdG8gZXJyOworCQl9CisJCXVkcF9jb25mLmZhbWlseSA9IEFGX0lORVQ7CisJCXVkcF9jb25mLmxvY2FsX2lwLnNfYWRkciA9IGh0b25sKElOQUREUl9BTlkpOworCQl1ZHBfY29uZi51c2VfdWRwX2NoZWNrc3VtcyA9IGZhbHNlOworCQl1Yi0+aWZpbmRleCA9IGRldi0+aWZpbmRleDsKKwkJYi0+bXR1ID0gZGV2LT5tdHUgLSBzaXplb2Yoc3RydWN0IGlwaGRyKQorCQkJLSBzaXplb2Yoc3RydWN0IHVkcGhkcik7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKwl9IGVsc2UgaWYgKGxvY2FsLnByb3RvID09IGh0b25zKEVUSF9QX0lQVjYpKSB7CisJCXVkcF9jb25mLmZhbWlseSA9IEFGX0lORVQ2OworCQl1ZHBfY29uZi51c2VfdWRwNl90eF9jaGVja3N1bXMgPSB0cnVlOworCQl1ZHBfY29uZi51c2VfdWRwNl9yeF9jaGVja3N1bXMgPSB0cnVlOworCQl1ZHBfY29uZi5sb2NhbF9pcDYgPSBpbjZhZGRyX2FueTsKKwkJYi0+bXR1ID0gMTI4MDsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWVyciA9IC1FQUZOT1NVUFBPUlQ7CisJCWdvdG8gZXJyOworCX0KKwl1ZHBfY29uZi5sb2NhbF91ZHBfcG9ydCA9IGxvY2FsLnVkcF9wb3J0OworCWVyciA9IHVkcF9zb2NrX2NyZWF0ZShuZXQsICZ1ZHBfY29uZiwgJnViLT51YnNvY2spOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCXR1bmNmZy5za191c2VyX2RhdGEgPSB1YjsKKwl0dW5jZmcuZW5jYXBfdHlwZSA9IDE7CisJdHVuY2ZnLmVuY2FwX3JjdiA9IHRpcGNfdWRwX3JlY3Y7CisJdHVuY2ZnLmVuY2FwX2Rlc3Ryb3kgPSBOVUxMOworCXNldHVwX3VkcF90dW5uZWxfc29jayhuZXQsIHViLT51YnNvY2ssICZ0dW5jZmcpOworCisJaWYgKGVuYWJsZV9tY2FzdCh1YiwgcmVtb3RlKSkKKwkJZ290byBlcnI7CisJcmV0dXJuIDA7CitlcnI6CisJa2ZyZWUodWIpOworCXJldHVybiBlcnI7Cit9CisKKy8qIGNsZWFudXBfYmVhcmVyIC0gYnJlYWsgdGhlIHNvY2tldC9iZWFyZXIgYXNzb2NpYXRpb24gKi8KK3N0YXRpYyB2b2lkIGNsZWFudXBfYmVhcmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgdWRwX2JlYXJlciAqdWIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHVkcF9iZWFyZXIsIHdvcmspOworCisJaWYgKHViLT51YnNvY2spCisJCXVkcF90dW5uZWxfc29ja19yZWxlYXNlKHViLT51YnNvY2spOworCXN5bmNocm9uaXplX25ldCgpOworCWtmcmVlKHViKTsKK30KKworLyogdGlwY191ZHBfZGlzYWJsZSAtIGRldGFjaCBiZWFyZXIgZnJvbSBzb2NrZXQgKi8KK3N0YXRpYyB2b2lkIHRpcGNfdWRwX2Rpc2FibGUoc3RydWN0IHRpcGNfYmVhcmVyICpiKQoreworCXN0cnVjdCB1ZHBfYmVhcmVyICp1YjsKKworCXViID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwoYi0+bWVkaWFfcHRyKTsKKwlpZiAoIXViKSB7CisJCXByX2VycigiVURQIGJlYXJlciBpbnN0YW5jZSBub3QgZm91bmRcbiIpOworCQlyZXR1cm47CisJfQorCWlmICh1Yi0+dWJzb2NrKQorCQlzb2NrX3NldF9mbGFnKHViLT51YnNvY2stPnNrLCBTT0NLX0RFQUQpOworCVJDVV9JTklUX1BPSU5URVIoYi0+bWVkaWFfcHRyLCBOVUxMKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKHViLT5iZWFyZXIsIE5VTEwpOworCisJLyogc29ja19yZWxlYXNlIG5lZWQgdG8gYmUgZG9uZSBvdXRzaWRlIG9mIHJ0bmwgbG9jayAqLworCUlOSVRfV09SSygmdWItPndvcmssIGNsZWFudXBfYmVhcmVyKTsKKwlzY2hlZHVsZV93b3JrKCZ1Yi0+d29yayk7Cit9CisKK3N0cnVjdCB0aXBjX21lZGlhIHVkcF9tZWRpYV9pbmZvID0geworCS5zZW5kX21zZwk9IHRpcGNfdWRwX3NlbmRfbXNnLAorCS5lbmFibGVfbWVkaWEJPSB0aXBjX3VkcF9lbmFibGUsCisJLmRpc2FibGVfbWVkaWEJPSB0aXBjX3VkcF9kaXNhYmxlLAorCS5hZGRyMnN0cgk9IHRpcGNfdWRwX2FkZHIyc3RyLAorCS5hZGRyMm1zZwk9IHRpcGNfdWRwX2FkZHIybXNnLAorCS5tc2cyYWRkcgk9IHRpcGNfdWRwX21zZzJhZGRyLAorCS5wcmlvcml0eQk9IFRJUENfREVGX0xJTktfUFJJLAorCS50b2xlcmFuY2UJPSBUSVBDX0RFRl9MSU5LX1RPTCwKKwkud2luZG93CQk9IFRJUENfREVGX0xJTktfV0lOLAorCS50eXBlX2lkCT0gVElQQ19NRURJQV9UWVBFX1VEUCwKKwkuaHdhZGRyX2xlbgk9IDAsCisJLm5hbWUJCT0gInVkcCIKK307CmRpZmYgLS1naXQgYS9uZXQvdW5peC9hZl91bml4LmMgYi9uZXQvdW5peC9hZl91bml4LmMKaW5kZXggNTI2YjZlZC4uNDMzZjI4NyAxMDA2NDQKLS0tIGEvbmV0L3VuaXgvYWZfdW5peC5jCisrKyBiL25ldC91bml4L2FmX3VuaXguYwpAQCAtNTE2LDIwICs1MTYsMTUgQEAKIAkJCQkgICAgcG9sbF90YWJsZSAqKTsKIHN0YXRpYyBpbnQgdW5peF9pb2N0bChzdHJ1Y3Qgc29ja2V0ICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CiBzdGF0aWMgaW50IHVuaXhfc2h1dGRvd24oc3RydWN0IHNvY2tldCAqLCBpbnQpOwotc3RhdGljIGludCB1bml4X3N0cmVhbV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3Qgc29ja2V0ICosCi0JCQkgICAgICAgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QpOwotc3RhdGljIGludCB1bml4X3N0cmVhbV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3Qgc29ja2V0ICosCi0JCQkgICAgICAgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QsIGludCk7Ci1zdGF0aWMgaW50IHVuaXhfZGdyYW1fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKiwgc3RydWN0IHNvY2tldCAqLAotCQkJICAgICAgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QpOwotc3RhdGljIGludCB1bml4X2RncmFtX3JlY3Ztc2coc3RydWN0IGtpb2NiICosIHN0cnVjdCBzb2NrZXQgKiwKLQkJCSAgICAgIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90LCBpbnQpOworc3RhdGljIGludCB1bml4X3N0cmVhbV9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QpOworc3RhdGljIGludCB1bml4X3N0cmVhbV9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QsIGludCk7CitzdGF0aWMgaW50IHVuaXhfZGdyYW1fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbnQgdW5peF9kZ3JhbV9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QsIGludCk7CiBzdGF0aWMgaW50IHVuaXhfZGdyYW1fY29ubmVjdChzdHJ1Y3Qgc29ja2V0ICosIHN0cnVjdCBzb2NrYWRkciAqLAogCQkJICAgICAgaW50LCBpbnQpOwotc3RhdGljIGludCB1bml4X3NlcXBhY2tldF9zZW5kbXNnKHN0cnVjdCBraW9jYiAqLCBzdHJ1Y3Qgc29ja2V0ICosCi0JCQkJICBzdHJ1Y3QgbXNnaGRyICosIHNpemVfdCk7Ci1zdGF0aWMgaW50IHVuaXhfc2VxcGFja2V0X3JlY3Ztc2coc3RydWN0IGtpb2NiICosIHN0cnVjdCBzb2NrZXQgKiwKLQkJCQkgIHN0cnVjdCBtc2doZHIgKiwgc2l6ZV90LCBpbnQpOworc3RhdGljIGludCB1bml4X3NlcXBhY2tldF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QpOworc3RhdGljIGludCB1bml4X3NlcXBhY2tldF9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKiwgc3RydWN0IG1zZ2hkciAqLCBzaXplX3QsCisJCQkJICBpbnQpOwogCiBzdGF0aWMgaW50IHVuaXhfc2V0X3BlZWtfb2ZmKHN0cnVjdCBzb2NrICpzaywgaW50IHZhbCkKIHsKQEAgLTE0NDIsOCArMTQzNyw4IEBACiAgKglTZW5kIEFGX1VOSVggZGF0YS4KICAqLwogCi1zdGF0aWMgaW50IHVuaXhfZGdyYW1fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmtpb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCB1bml4X2RncmFtX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJICAgICAgc2l6ZV90IGxlbikKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBzb2NrX25ldChzayk7CkBAIC0xNjIyLDggKzE2MTcsOCBAQAogICovCiAjZGVmaW5lIFVOSVhfU0tCX0ZSQUdTX1NaIChQQUdFX1NJWkUgPDwgZ2V0X29yZGVyKDMyNzY4KSkKIAotc3RhdGljIGludCB1bml4X3N0cmVhbV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqa2lvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCB1bml4X3N0cmVhbV9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICAgICBzaXplX3QgbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCBzb2NrICpvdGhlciA9IE5VTEw7CkBAIC0xNzI1LDggKzE3MjAsOCBAQAogCXJldHVybiBzZW50ID8gOiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgdW5peF9zZXFwYWNrZXRfc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmtpb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJCSAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIGludCB1bml4X3NlcXBhY2tldF9zZW5kbXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCQkgIHNpemVfdCBsZW4pCiB7CiAJaW50IGVycjsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKQEAgLTE3NDEsMTkgKzE3MzYsMTggQEAKIAlpZiAobXNnLT5tc2dfbmFtZWxlbikKIAkJbXNnLT5tc2dfbmFtZWxlbiA9IDA7CiAKLQlyZXR1cm4gdW5peF9kZ3JhbV9zZW5kbXNnKGtpb2NiLCBzb2NrLCBtc2csIGxlbik7CisJcmV0dXJuIHVuaXhfZGdyYW1fc2VuZG1zZyhzb2NrLCBtc2csIGxlbik7CiB9CiAKLXN0YXRpYyBpbnQgdW5peF9zZXFwYWNrZXRfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCQkgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLAotCQkJICAgICAgaW50IGZsYWdzKQorc3RhdGljIGludCB1bml4X3NlcXBhY2tldF9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCQkgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CiAKIAlpZiAoc2stPnNrX3N0YXRlICE9IFRDUF9FU1RBQkxJU0hFRCkKIAkJcmV0dXJuIC1FTk9UQ09OTjsKIAotCXJldHVybiB1bml4X2RncmFtX3JlY3Ztc2coaW9jYiwgc29jaywgbXNnLCBzaXplLCBmbGFncyk7CisJcmV0dXJuIHVuaXhfZGdyYW1fcmVjdm1zZyhzb2NrLCBtc2csIHNpemUsIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgdW5peF9jb3B5X2FkZHIoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2spCkBAIC0xNzY2LDkgKzE3NjAsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCB1bml4X2RncmFtX3JlY3Ztc2coc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgICAgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3Qgc2l6ZSwKLQkJCSAgICAgIGludCBmbGFncykKK3N0YXRpYyBpbnQgdW5peF9kZ3JhbV9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywKKwkJCSAgICAgIHNpemVfdCBzaXplLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNjbV9jb29raWUgc2NtOwogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwpAQCAtMTkwMCw5ICsxODkzLDggQEAKIAlyZXR1cm4gc2tiLT5sZW4gLSBVTklYQ0Ioc2tiKS5jb25zdW1lZDsKIH0KIAotc3RhdGljIGludCB1bml4X3N0cmVhbV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLAotCQkJICAgICAgIGludCBmbGFncykKK3N0YXRpYyBpbnQgdW5peF9zdHJlYW1fcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgICAgc2l6ZV90IHNpemUsIGludCBmbGFncykKIHsKIAlzdHJ1Y3Qgc2NtX2Nvb2tpZSBzY207CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CmRpZmYgLS1naXQgYS9uZXQvdm13X3Zzb2NrL2FmX3Zzb2NrLmMgYi9uZXQvdm13X3Zzb2NrL2FmX3Zzb2NrLmMKaW5kZXggMWQwZTM5Yy4uMmVjODZlNiAxMDA2NDQKLS0tIGEvbmV0L3Ztd192c29jay9hZl92c29jay5jCisrKyBiL25ldC92bXdfdnNvY2svYWZfdnNvY2suYwpAQCAtOTQ5LDggKzk0OSw4IEBACiAJcmV0dXJuIG1hc2s7CiB9CiAKLXN0YXRpYyBpbnQgdnNvY2tfZGdyYW1fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmtpb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgdnNvY2tfZGdyYW1fc2VuZG1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgICAgc2l6ZV90IGxlbikKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBzb2NrICpzazsKQEAgLTEwNjIsMTEgKzEwNjIsMTAgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHZzb2NrX2RncmFtX3JlY3Ztc2coc3RydWN0IGtpb2NiICpraW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK3N0YXRpYyBpbnQgdnNvY2tfZGdyYW1fcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csCisJCQkgICAgICAgc2l6ZV90IGxlbiwgaW50IGZsYWdzKQogewotCXJldHVybiB0cmFuc3BvcnQtPmRncmFtX2RlcXVldWUoa2lvY2IsIHZzb2NrX3NrKHNvY2stPnNrKSwgbXNnLCBsZW4sCi0JCQkJCWZsYWdzKTsKKwlyZXR1cm4gdHJhbnNwb3J0LT5kZ3JhbV9kZXF1ZXVlKHZzb2NrX3NrKHNvY2stPnNrKSwgbXNnLCBsZW4sIGZsYWdzKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBwcm90b19vcHMgdnNvY2tfZGdyYW1fb3BzID0gewpAQCAtMTUwNSw4ICsxNTA0LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2c29ja19zdHJlYW1fc2VuZG1zZyhzdHJ1Y3Qga2lvY2IgKmtpb2NiLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAotCQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgdnNvY2tfc3RyZWFtX3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLAorCQkJCXNpemVfdCBsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCB2c29ja19zb2NrICp2c2s7CkBAIC0xNjQ0LDkgKzE2NDMsOCBAQAogCiAKIHN0YXRpYyBpbnQKLXZzb2NrX3N0cmVhbV9yZWN2bXNnKHN0cnVjdCBraW9jYiAqa2lvY2IsCi0JCSAgICAgc3RydWN0IHNvY2tldCAqc29jaywKLQkJICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sIGludCBmbGFncykKK3Zzb2NrX3N0cmVhbV9yZWN2bXNnKHN0cnVjdCBzb2NrZXQgKnNvY2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJICAgICBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCXN0cnVjdCB2c29ja19zb2NrICp2c2s7CmRpZmYgLS1naXQgYS9uZXQvdm13X3Zzb2NrL3ZtY2lfdHJhbnNwb3J0LmMgYi9uZXQvdm13X3Zzb2NrL3ZtY2lfdHJhbnNwb3J0LmMKaW5kZXggN2YzMjU1MC4uYzI5NGRhMCAxMDA2NDQKLS0tIGEvbmV0L3Ztd192c29jay92bWNpX3RyYW5zcG9ydC5jCisrKyBiL25ldC92bXdfdnNvY2svdm1jaV90cmFuc3BvcnQuYwpAQCAtMTczMCw4ICsxNzMwLDcgQEAKIAlyZXR1cm4gZXJyIC0gc2l6ZW9mKCpkZyk7CiB9CiAKLXN0YXRpYyBpbnQgdm1jaV90cmFuc3BvcnRfZGdyYW1fZGVxdWV1ZShzdHJ1Y3Qga2lvY2IgKmtpb2NiLAotCQkJCQlzdHJ1Y3QgdnNvY2tfc29jayAqdnNrLAorc3RhdGljIGludCB2bWNpX3RyYW5zcG9ydF9kZ3JhbV9kZXF1ZXVlKHN0cnVjdCB2c29ja19zb2NrICp2c2ssCiAJCQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKIAkJCQkJaW50IGZsYWdzKQogewpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL0tjb25maWcgYi9uZXQvd2lyZWxlc3MvS2NvbmZpZwppbmRleCAyOWM4Njc1Li40ZjU1NDNkIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvS2NvbmZpZworKysgYi9uZXQvd2lyZWxlc3MvS2NvbmZpZwpAQCAtMTc1LDEzICsxNzUsMjEgQEAKIAkgIE1vc3QgZGlzdHJpYnV0aW9ucyBoYXZlIGEgQ1JEQSBwYWNrYWdlLiAgU28gaWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIENGRzgwMjExX1dFWFQKLQlib29sICJjZmc4MDIxMSB3aXJlbGVzcyBleHRlbnNpb25zIGNvbXBhdGliaWxpdHkiCisJYm9vbCAiY2ZnODAyMTEgd2lyZWxlc3MgZXh0ZW5zaW9ucyBjb21wYXRpYmlsaXR5IiBpZiAhQ0ZHODAyMTFfV0VYVF9FWFBPUlQKIAlkZXBlbmRzIG9uIENGRzgwMjExCiAJc2VsZWN0IFdFWFRfQ09SRQorCWRlZmF1bHQgeSBpZiBDRkc4MDIxMV9XRVhUX0VYUE9SVAogCWhlbHAKIAkgIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3UgbmVlZCBvbGQgdXNlcnNwYWNlIGZvciB3aXJlbGVzcwogCSAgZXh0ZW5zaW9ucyB3aXRoIGNmZzgwMjExLWJhc2VkIGRyaXZlcnMuCiAKK2NvbmZpZyBDRkc4MDIxMV9XRVhUX0VYUE9SVAorCWJvb2wKKwlkZXBlbmRzIG9uIENGRzgwMjExCisJaGVscAorCSAgRHJpdmVycyBzaG91bGQgc2VsZWN0IHRoaXMgb3B0aW9uIGlmIHRoZXkgcmVxdWlyZSBjZmc4MDIxMSdzCisJICB3ZXh0IGNvbXBhdGliaWxpdHkgc3ltYm9scyB0byBiZSBleHBvcnRlZC4KKwogY29uZmlnIExJQjgwMjExCiAJdHJpc3RhdGUKIAlkZWZhdWx0IG4KZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9pYnNzLmMgYi9uZXQvd2lyZWxlc3MvaWJzcy5jCmluZGV4IGUyNGZjNTguLjRjNTVmYWIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9pYnNzLmMKKysrIGIvbmV0L3dpcmVsZXNzL2lic3MuYwpAQCAtMzAsNyArMzAsNyBAQAogCQlyZXR1cm47CiAKIAlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKHdkZXYtPndpcGh5LCBjaGFubmVsLCBic3NpZCwgTlVMTCwgMCwKLQkJCSAgICAgICBXTEFOX0NBUEFCSUxJVFlfSUJTUywgV0xBTl9DQVBBQklMSVRZX0lCU1MpOworCQkJICAgICAgIElFRUU4MDIxMV9CU1NfVFlQRV9JQlNTLCBJRUVFODAyMTFfUFJJVkFDWV9BTlkpOwogCiAJaWYgKFdBUk5fT04oIWJzcykpCiAJCXJldHVybjsKQEAgLTUzMyw3ICs1MzMsNyBAQAogCWVsc2UgaWYgKHdkZXYtPndleHQuaWJzcy5ic3NpZCkKIAkJbWVtY3B5KGFwX2FkZHItPnNhX2RhdGEsIHdkZXYtPndleHQuaWJzcy5ic3NpZCwgRVRIX0FMRU4pOwogCWVsc2UKLQkJbWVtc2V0KGFwX2FkZHItPnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcihhcF9hZGRyLT5zYV9kYXRhKTsKIAogCXdkZXZfdW5sb2NrKHdkZXYpOwogCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvbWxtZS5jIGIvbmV0L3dpcmVsZXNzL21sbWUuYwppbmRleCAyYzUyYjU5Li43YWFlMzI5IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvbWxtZS5jCisrKyBiL25ldC93aXJlbGVzcy9tbG1lLmMKQEAgLTIyOSw3ICsyMjksOCBAQAogCQlyZXR1cm4gLUVBTFJFQURZOwogCiAJcmVxLmJzcyA9IGNmZzgwMjExX2dldF9ic3MoJnJkZXYtPndpcGh5LCBjaGFuLCBic3NpZCwgc3NpZCwgc3NpZF9sZW4sCi0JCQkJICAgV0xBTl9DQVBBQklMSVRZX0VTUywgV0xBTl9DQVBBQklMSVRZX0VTUyk7CisJCQkJICAgSUVFRTgwMjExX0JTU19UWVBFX0VTUywKKwkJCQkgICBJRUVFODAyMTFfUFJJVkFDWV9BTlkpOwogCWlmICghcmVxLmJzcykKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKQEAgLTI5Niw3ICsyOTcsOCBAQAogCQkJCSAgIHJkZXYtPndpcGh5LnZodF9jYXBhX21vZF9tYXNrKTsKIAogCXJlcS0+YnNzID0gY2ZnODAyMTFfZ2V0X2JzcygmcmRldi0+d2lwaHksIGNoYW4sIGJzc2lkLCBzc2lkLCBzc2lkX2xlbiwKLQkJCQkgICAgV0xBTl9DQVBBQklMSVRZX0VTUywgV0xBTl9DQVBBQklMSVRZX0VTUyk7CisJCQkJICAgIElFRUU4MDIxMV9CU1NfVFlQRV9FU1MsCisJCQkJICAgIElFRUU4MDIxMV9QUklWQUNZX0FOWSk7CiAJaWYgKCFyZXEtPmJzcykKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCmluZGV4IGJlMjUwMTUuLmRkNzg0NDUgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmMKKysrIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuYwpAQCAtMzk5LDYgKzM5OSw3IEBACiAJW05MODAyMTFfQVRUUl9XSVBIWV9TRUxGX01BTkFHRURfUkVHXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAogCVtOTDgwMjExX0FUVFJfTkVUTlNfRkRdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKIAlbTkw4MDIxMV9BVFRSX1NDSEVEX1NDQU5fREVMQVldID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbTkw4MDIxMV9BVFRSX1JFR19JTkRPT1JdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCiB9OwogCiAvKiBwb2xpY3kgZm9yIHRoZSBrZXkgYXR0cmlidXRlcyAqLwpAQCAtMTA5OCw4ICsxMDk5LDYgQEAKIAlpZiAobGFyZ2UgJiYgbmw4MDIxMV9zZW5kX3dvd2xhbl90Y3BfY2FwcyhyZGV2LCBtc2cpKQogCQlyZXR1cm4gLUVOT0JVRlM7CiAKLQkvKiBUT0RPOiBzZW5kIHdvd2xhbiBuZXQgZGV0ZWN0ICovCi0KIAlubGFfbmVzdF9lbmQobXNnLCBubF93b3dsYW4pOwogCiAJcmV0dXJuIDA7CkBAIC0yNjY4LDcgKzI2NjcsOCBAQAogCiAJd2RldiA9IHJkZXZfYWRkX3ZpcnR1YWxfaW50ZihyZGV2LAogCQkJCW5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9JRk5BTUVdKSwKLQkJCQl0eXBlLCBlcnIgPyBOVUxMIDogJmZsYWdzLCAmcGFyYW1zKTsKKwkJCQlORVRfTkFNRV9VU0VSLCB0eXBlLCBlcnIgPyBOVUxMIDogJmZsYWdzLAorCQkJCSZwYXJhbXMpOwogCWlmIChXQVJOX09OKCF3ZGV2KSkgewogCQlubG1zZ19mcmVlKG1zZyk7CiAJCXJldHVybiAtRVBST1RPOwpAQCAtNDQwMCw2ICs0NDAwLDE2IEBACiAJaWYgKHBhcnNlX3N0YXRpb25fZmxhZ3MoaW5mbywgZGV2LT5pZWVlODAyMTFfcHRyLT5pZnR5cGUsICZwYXJhbXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIEhUL1ZIVCByZXF1aXJlcyBRb1MsIGJ1dCBpZiB3ZSBkb24ndCBoYXZlIHRoYXQganVzdCBpZ25vcmUgSFQvVkhUCisJICogYXMgdXNlcnNwYWNlIG1pZ2h0IGp1c3QgcGFzcyB0aHJvdWdoIHRoZSBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgSUVzCisJICogZGlyZWN0bHksIHJhdGhlciB0aGFuIGVuZm9yY2luZyB0aGlzIHJlc3RyaWN0aW9uIGFuZCByZXR1cm5pbmcgYW4KKwkgKiBlcnJvciBpbiB0aGlzIGNhc2UuCisJICovCisJaWYgKCEocGFyYW1zLnN0YV9mbGFnc19zZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19XTUUpKSkgeworCQlwYXJhbXMuaHRfY2FwYSA9IE5VTEw7CisJCXBhcmFtcy52aHRfY2FwYSA9IE5VTEw7CisJfQorCiAJLyogV2hlbiB5b3UgcnVuIGludG8gdGhpcywgYWRqdXN0IHRoZSBjb2RlIGJlbG93IGZvciB0aGUgbmV3IGZsYWcgKi8KIAlCVUlMRF9CVUdfT04oTkw4MDIxMV9TVEFfRkxBR19NQVggIT0gNyk7CiAKQEAgLTQ5NTgsNyArNDk2OCwxMCBAQAogc3RhdGljIGludCBubDgwMjExX3JlcV9zZXRfcmVnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJY2hhciAqZGF0YSA9IE5VTEw7CisJYm9vbCBpc19pbmRvb3I7CiAJZW51bSBubDgwMjExX3VzZXJfcmVnX2hpbnRfdHlwZSB1c2VyX3JlZ19oaW50X3R5cGU7CisJdTMyIG93bmVyX25scG9ydGlkOworCiAKIAkvKgogCSAqIFlvdSBzaG91bGQgb25seSBnZXQgdGhpcyB3aGVuIGNmZzgwMjExIGhhc24ndCB5ZXQgaW5pdGlhbGl6ZWQKQEAgLTQ5ODQsNyArNDk5NywxNSBAQAogCQlkYXRhID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFR19BTFBIQTJdKTsKIAkJcmV0dXJuIHJlZ3VsYXRvcnlfaGludF91c2VyKGRhdGEsIHVzZXJfcmVnX2hpbnRfdHlwZSk7CiAJY2FzZSBOTDgwMjExX1VTRVJfUkVHX0hJTlRfSU5ET09SOgotCQlyZXR1cm4gcmVndWxhdG9yeV9oaW50X2luZG9vcl91c2VyKCk7CisJCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU09DS0VUX09XTkVSXSkgeworCQkJb3duZXJfbmxwb3J0aWQgPSBpbmZvLT5zbmRfcG9ydGlkOworCQkJaXNfaW5kb29yID0gISFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUkVHX0lORE9PUl07CisJCX0gZWxzZSB7CisJCQlvd25lcl9ubHBvcnRpZCA9IDA7CisJCQlpc19pbmRvb3IgPSB0cnVlOworCQl9CisKKwkJcmV0dXJuIHJlZ3VsYXRvcnlfaGludF9pbmRvb3IoaXNfaW5kb29yLCBvd25lcl9ubHBvcnRpZCk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNTI2NSw3ICs1Mjg2LDcgQEAKIAlGSUxMX0lOX01FU0hfUEFSQU1fSUZfU0VUKHRiLCBjZmcsIGRvdDExTWVzaEF3YWtlV2luZG93RHVyYXRpb24sCiAJCQkJICAwLCA2NTUzNSwgbWFzaywKIAkJCQkgIE5MODAyMTFfTUVTSENPTkZfQVdBS0VfV0lORE9XLCBubGFfZ2V0X3UxNik7Ci0JRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCBwbGlua190aW1lb3V0LCAxLCAweGZmZmZmZmZmLAorCUZJTExfSU5fTUVTSF9QQVJBTV9JRl9TRVQodGIsIGNmZywgcGxpbmtfdGltZW91dCwgMCwgMHhmZmZmZmZmZiwKIAkJCQkgIG1hc2ssIE5MODAyMTFfTUVTSENPTkZfUExJTktfVElNRU9VVCwKIAkJCQkgIG5sYV9nZXRfdTMyKTsKIAlpZiAobWFza19vdXQpCkBAIC01NjQzLDcgKzU2NjQsNyBAQAogCQl9CiAJfQogCi0JciA9IHNldF9yZWdkb20ocmQpOworCXIgPSBzZXRfcmVnZG9tKHJkLCBSRUdEX1NPVVJDRV9DUkRBKTsKIAkvKiBzZXRfcmVnZG9tIHRvb2sgb3duZXJzaGlwICovCiAJcmQgPSBOVUxMOwogCkBAIC01NjgzLDggKzU3MDQsOCBAQAogCWludCBpOwogCiAJaWYgKCFhdHRyc1tOTDgwMjExX0FUVFJfTUFDXSAmJiAhYXR0cnNbTkw4MDIxMV9BVFRSX01BQ19NQVNLXSkgewotCQltZW1zZXQobWFjX2FkZHIsIDAsIEVUSF9BTEVOKTsKLQkJbWVtc2V0KG1hY19hZGRyX21hc2ssIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcihtYWNfYWRkcik7CisJCWV0aF96ZXJvX2FkZHIobWFjX2FkZHJfbWFzayk7CiAJCW1hY19hZGRyWzBdID0gMHgyOwogCQltYWNfYWRkcl9tYXNrWzBdID0gMHgzOwogCkBAIC03MjY1LDggKzcyODYsMTggQEAKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfMjA6CiAJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfNDA6Ci0JCWlmIChyZGV2LT53aXBoeS5mZWF0dXJlcyAmIE5MODAyMTFfRkVBVFVSRV9IVF9JQlNTKQotCQkJYnJlYWs7CisJCWlmICghKHJkZXYtPndpcGh5LmZlYXR1cmVzICYgTkw4MDIxMV9GRUFUVVJFX0hUX0lCU1MpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzgwOgorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzgwUDgwOgorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzE2MDoKKwkJaWYgKCEocmRldi0+d2lwaHkuZmVhdHVyZXMgJiBOTDgwMjExX0ZFQVRVUkVfSFRfSUJTUykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCF3aXBoeV9leHRfZmVhdHVyZV9pc3NldCgmcmRldi0+d2lwaHksCisJCQkJCSAgICAgTkw4MDIxMV9FWFRfRkVBVFVSRV9WSFRfSUJTUykpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNzM3OSw4ICs3NDEwLDggQEAKIAogc3RhdGljIHN0cnVjdCBza19idWZmICoKIF9fY2ZnODAyMTFfYWxsb2NfdmVuZG9yX3NrYihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCi0JCQkgICAgaW50IGFwcHJveGxlbiwgdTMyIHBvcnRpZCwgdTMyIHNlcSwKLQkJCSAgICBlbnVtIG5sODAyMTFfY29tbWFuZHMgY21kLAorCQkJICAgIHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsIGludCBhcHByb3hsZW4sCisJCQkgICAgdTMyIHBvcnRpZCwgdTMyIHNlcSwgZW51bSBubDgwMjExX2NvbW1hbmRzIGNtZCwKIAkJCSAgICBlbnVtIG5sODAyMTFfYXR0cnMgYXR0ciwKIAkJCSAgICBjb25zdCBzdHJ1Y3Qgbmw4MDIxMV92ZW5kb3JfY21kX2luZm8gKmluZm8sCiAJCQkgICAgZ2ZwX3QgZ2ZwKQpAQCAtNzQxMSw2ICs3NDQyLDE2IEBACiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAl9CiAKKwlpZiAod2RldikgeworCQlpZiAobmxhX3B1dF91NjQoc2tiLCBOTDgwMjExX0FUVFJfV0RFViwKKwkJCQl3ZGV2X2lkKHdkZXYpKSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCQlpZiAod2Rldi0+bmV0ZGV2ICYmCisJCSAgICBubGFfcHV0X3UzMihza2IsIE5MODAyMTFfQVRUUl9JRklOREVYLAorCQkJCXdkZXYtPm5ldGRldi0+aWZpbmRleCkpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwl9CisKIAlkYXRhID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBhdHRyKTsKIAogCSgodm9pZCAqKilza2ItPmNiKVswXSA9IHJkZXY7CkBAIC03NDI1LDYgKzc0NjYsNyBAQAogfQogCiBzdHJ1Y3Qgc2tfYnVmZiAqX19jZmc4MDIxMV9hbGxvY19ldmVudF9za2Ioc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKIAkJCQkJICAgZW51bSBubDgwMjExX2NvbW1hbmRzIGNtZCwKIAkJCQkJICAgZW51bSBubDgwMjExX2F0dHJzIGF0dHIsCiAJCQkJCSAgIGludCB2ZW5kb3JfZXZlbnRfaWR4LApAQCAtNzQ1MCw3ICs3NDkyLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JcmV0dXJuIF9fY2ZnODAyMTFfYWxsb2NfdmVuZG9yX3NrYihyZGV2LCBhcHByb3hsZW4sIDAsIDAsCisJcmV0dXJuIF9fY2ZnODAyMTFfYWxsb2NfdmVuZG9yX3NrYihyZGV2LCB3ZGV2LCBhcHByb3hsZW4sIDAsIDAsCiAJCQkJCSAgIGNtZCwgYXR0ciwgaW5mbywgZ2ZwKTsKIH0KIEVYUE9SVF9TWU1CT0woX19jZmc4MDIxMV9hbGxvY19ldmVudF9za2IpOwpAQCAtODc1MSw4ICs4NzkzLDggQEAKIAlpZiAoIW5sX3RjcCkKIAkJcmV0dXJuIC1FTk9CVUZTOwogCi0JaWYgKG5sYV9wdXRfYmUzMihtc2csIE5MODAyMTFfV09XTEFOX1RDUF9TUkNfSVBWNCwgdGNwLT5zcmMpIHx8Ci0JICAgIG5sYV9wdXRfYmUzMihtc2csIE5MODAyMTFfV09XTEFOX1RDUF9EU1RfSVBWNCwgdGNwLT5kc3QpIHx8CisJaWYgKG5sYV9wdXRfaW5fYWRkcihtc2csIE5MODAyMTFfV09XTEFOX1RDUF9TUkNfSVBWNCwgdGNwLT5zcmMpIHx8CisJICAgIG5sYV9wdXRfaW5fYWRkcihtc2csIE5MODAyMTFfV09XTEFOX1RDUF9EU1RfSVBWNCwgdGNwLT5kc3QpIHx8CiAJICAgIG5sYV9wdXQobXNnLCBOTDgwMjExX1dPV0xBTl9UQ1BfRFNUX01BQywgRVRIX0FMRU4sIHRjcC0+ZHN0X21hYykgfHwKIAkgICAgbmxhX3B1dF91MTYobXNnLCBOTDgwMjExX1dPV0xBTl9UQ1BfU1JDX1BPUlQsIHRjcC0+c3JjX3BvcnQpIHx8CiAJICAgIG5sYV9wdXRfdTE2KG1zZywgTkw4MDIxMV9XT1dMQU5fVENQX0RTVF9QT1JULCB0Y3AtPmRzdF9wb3J0KSB8fApAQCAtODc5OCw2ICs4ODQwLDkgQEAKIAlpZiAobmxhX3B1dF91MzIobXNnLCBOTDgwMjExX0FUVFJfU0NIRURfU0NBTl9JTlRFUlZBTCwgcmVxLT5pbnRlcnZhbCkpCiAJCXJldHVybiAtRU5PQlVGUzsKIAorCWlmIChubGFfcHV0X3UzMihtc2csIE5MODAyMTFfQVRUUl9TQ0hFRF9TQ0FOX0RFTEFZLCByZXEtPmRlbGF5KSkKKwkJcmV0dXJuIC1FTk9CVUZTOworCiAJZnJlcXMgPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfQVRUUl9TQ0FOX0ZSRVFVRU5DSUVTKTsKIAlpZiAoIWZyZXFzKQogCQlyZXR1cm4gLUVOT0JVRlM7CkBAIC04OTgzLDggKzkwMjgsOCBAQAogCWNmZyA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjZmcpCiAJCXJldHVybiAtRU5PTUVNOwotCWNmZy0+c3JjID0gbmxhX2dldF9iZTMyKHRiW05MODAyMTFfV09XTEFOX1RDUF9TUkNfSVBWNF0pOwotCWNmZy0+ZHN0ID0gbmxhX2dldF9iZTMyKHRiW05MODAyMTFfV09XTEFOX1RDUF9EU1RfSVBWNF0pOworCWNmZy0+c3JjID0gbmxhX2dldF9pbl9hZGRyKHRiW05MODAyMTFfV09XTEFOX1RDUF9TUkNfSVBWNF0pOworCWNmZy0+ZHN0ID0gbmxhX2dldF9pbl9hZGRyKHRiW05MODAyMTFfV09XTEFOX1RDUF9EU1RfSVBWNF0pOwogCW1lbWNweShjZmctPmRzdF9tYWMsIG5sYV9kYXRhKHRiW05MODAyMTFfV09XTEFOX1RDUF9EU1RfTUFDXSksCiAJICAgICAgIEVUSF9BTEVOKTsKIAlpZiAodGJbTkw4MDIxMV9XT1dMQU5fVENQX1NSQ19QT1JUXSkKQEAgLTkwODQsNiArOTEyOSw3IEBACiAJY29uc3Qgc3RydWN0IHdpcGh5X3dvd2xhbl9zdXBwb3J0ICp3b3dsYW4gPSByZGV2LT53aXBoeS53b3dsYW47CiAJaW50IGVyciwgaTsKIAlib29sIHByZXZfZW5hYmxlZCA9IHJkZXYtPndpcGh5Lndvd2xhbl9jb25maWc7CisJYm9vbCByZWd1bGFyID0gZmFsc2U7CiAKIAlpZiAoIXdvd2xhbikKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtOTExMSwxMiArOTE1NywxNCBAQAogCQlpZiAoISh3b3dsYW4tPmZsYWdzICYgV0lQSFlfV09XTEFOX0RJU0NPTk5FQ1QpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCW5ld190cmlnZ2Vycy5kaXNjb25uZWN0ID0gdHJ1ZTsKKwkJcmVndWxhciA9IHRydWU7CiAJfQogCiAJaWYgKHRiW05MODAyMTFfV09XTEFOX1RSSUdfTUFHSUNfUEtUXSkgewogCQlpZiAoISh3b3dsYW4tPmZsYWdzICYgV0lQSFlfV09XTEFOX01BR0lDX1BLVCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJbmV3X3RyaWdnZXJzLm1hZ2ljX3BrdCA9IHRydWU7CisJCXJlZ3VsYXIgPSB0cnVlOwogCX0KIAogCWlmICh0YltOTDgwMjExX1dPV0xBTl9UUklHX0dUS19SRUtFWV9TVVBQT1JURURdKQpAQCAtOTEyNiwyNCArOTE3NCwyOCBAQAogCQlpZiAoISh3b3dsYW4tPmZsYWdzICYgV0lQSFlfV09XTEFOX0dUS19SRUtFWV9GQUlMVVJFKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQluZXdfdHJpZ2dlcnMuZ3RrX3Jla2V5X2ZhaWx1cmUgPSB0cnVlOworCQlyZWd1bGFyID0gdHJ1ZTsKIAl9CiAKIAlpZiAodGJbTkw4MDIxMV9XT1dMQU5fVFJJR19FQVBfSURFTlRfUkVRVUVTVF0pIHsKIAkJaWYgKCEod293bGFuLT5mbGFncyAmIFdJUEhZX1dPV0xBTl9FQVBfSURFTlRJVFlfUkVRKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQluZXdfdHJpZ2dlcnMuZWFwX2lkZW50aXR5X3JlcSA9IHRydWU7CisJCXJlZ3VsYXIgPSB0cnVlOwogCX0KIAogCWlmICh0YltOTDgwMjExX1dPV0xBTl9UUklHXzRXQVlfSEFORFNIQUtFXSkgewogCQlpZiAoISh3b3dsYW4tPmZsYWdzICYgV0lQSFlfV09XTEFOXzRXQVlfSEFORFNIQUtFKSkKIAkJCXJldHVybiAtRUlOVkFMOwogCQluZXdfdHJpZ2dlcnMuZm91cl93YXlfaGFuZHNoYWtlID0gdHJ1ZTsKKwkJcmVndWxhciA9IHRydWU7CiAJfQogCiAJaWYgKHRiW05MODAyMTFfV09XTEFOX1RSSUdfUkZLSUxMX1JFTEVBU0VdKSB7CiAJCWlmICghKHdvd2xhbi0+ZmxhZ3MgJiBXSVBIWV9XT1dMQU5fUkZLSUxMX1JFTEVBU0UpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCW5ld190cmlnZ2Vycy5yZmtpbGxfcmVsZWFzZSA9IHRydWU7CisJCXJlZ3VsYXIgPSB0cnVlOwogCX0KIAogCWlmICh0YltOTDgwMjExX1dPV0xBTl9UUklHX1BLVF9QQVRURVJOXSkgewpAQCAtOTE1Miw2ICs5MjA0LDggQEAKIAkJaW50IHJlbSwgcGF0X2xlbiwgbWFza19sZW4sIHBrdF9vZmZzZXQ7CiAJCXN0cnVjdCBubGF0dHIgKnBhdF90YltOVU1fTkw4MDIxMV9QS1RQQVRdOwogCisJCXJlZ3VsYXIgPSB0cnVlOworCiAJCW5sYV9mb3JfZWFjaF9uZXN0ZWQocGF0LCB0YltOTDgwMjExX1dPV0xBTl9UUklHX1BLVF9QQVRURVJOXSwKIAkJCQkgICAgcmVtKQogCQkJbl9wYXR0ZXJucysrOwpAQCAtOTIxMyw2ICs5MjY3LDcgQEAKIAl9CiAKIAlpZiAodGJbTkw4MDIxMV9XT1dMQU5fVFJJR19UQ1BfQ09OTkVDVElPTl0pIHsKKwkJcmVndWxhciA9IHRydWU7CiAJCWVyciA9IG5sODAyMTFfcGFyc2Vfd293bGFuX3RjcCgKIAkJCXJkZXYsIHRiW05MODAyMTFfV09XTEFOX1RSSUdfVENQX0NPTk5FQ1RJT05dLAogCQkJJm5ld190cmlnZ2Vycyk7CkBAIC05MjIxLDYgKzkyNzYsNyBAQAogCX0KIAogCWlmICh0YltOTDgwMjExX1dPV0xBTl9UUklHX05FVF9ERVRFQ1RdKSB7CisJCXJlZ3VsYXIgPSB0cnVlOwogCQllcnIgPSBubDgwMjExX3BhcnNlX3dvd2xhbl9uZCgKIAkJCXJkZXYsIHdvd2xhbiwgdGJbTkw4MDIxMV9XT1dMQU5fVFJJR19ORVRfREVURUNUXSwKIAkJCSZuZXdfdHJpZ2dlcnMpOwpAQCAtOTIyOCw2ICs5Mjg0LDE3IEBACiAJCQlnb3RvIGVycm9yOwogCX0KIAorCS8qIFRoZSAnYW55JyB0cmlnZ2VyIG1lYW5zIHRoZSBkZXZpY2UgY29udGludWVzIG9wZXJhdGluZyBtb3JlIG9yIGxlc3MKKwkgKiBhcyBpbiBpdHMgbm9ybWFsIG9wZXJhdGlvbiBtb2RlIGFuZCB3YWtlcyB1cCB0aGUgaG9zdCBvbiBtb3N0IG9mIHRoZQorCSAqIG5vcm1hbCBpbnRlcnJ1cHRzIChsaWtlIHBhY2tldCBSWCwgLi4uKQorCSAqIEl0IHRoZXJlZm9yZSBtYWtlcyBsaXR0bGUgc2Vuc2UgdG8gY29tYmluZSB3aXRoIHRoZSBtb3JlIGNvbnN0cmFpbmVkCisJICogd2FrZXVwIHRyaWdnZXIgbW9kZXMuCisJICovCisJaWYgKG5ld190cmlnZ2Vycy5hbnkgJiYgcmVndWxhcikgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKwogCW50cmlnID0ga21lbWR1cCgmbmV3X3RyaWdnZXJzLCBzaXplb2YobmV3X3RyaWdnZXJzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFudHJpZykgewogCQllcnIgPSAtRU5PTUVNOwpAQCAtOTg5Niw3ICs5OTYzLDcgQEAKIAlpZiAoV0FSTl9PTighcmRldi0+Y3VyX2NtZF9pbmZvKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlyZXR1cm4gX19jZmc4MDIxMV9hbGxvY192ZW5kb3Jfc2tiKHJkZXYsIGFwcHJveGxlbiwKKwlyZXR1cm4gX19jZmc4MDIxMV9hbGxvY192ZW5kb3Jfc2tiKHJkZXYsIE5VTEwsIGFwcHJveGxlbiwKIAkJCQkJICAgcmRldi0+Y3VyX2NtZF9pbmZvLT5zbmRfcG9ydGlkLAogCQkJCQkgICByZGV2LT5jdXJfY21kX2luZm8tPnNuZF9zZXEsCiAJCQkJCSAgIGNtZCwgYXR0ciwgTlVMTCwgR0ZQX0tFUk5FTCk7CkBAIC0xMjc2NSw2ICsxMjgzMiwxMSBAQAogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKKwkvKgorCSAqIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHVzZXIgc3BhY2UgcHJvY2VzcyB0aGF0IGlzIGNvbnRyb2xsaW5nIHRoZQorCSAqIGluZG9vciBzZXR0aW5nIGRpc2FwcGVhcmVkLCBzbyBub3RpZnkgdGhlIHJlZ3VsYXRvcnkgY29yZS4KKwkgKi8KKwlyZWd1bGF0b3J5X25ldGxpbmtfbm90aWZ5KG5vdGlmeS0+cG9ydGlkKTsKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvcmRldi1vcHMuaCBiL25ldC93aXJlbGVzcy9yZGV2LW9wcy5oCmluZGV4IDM1Y2ZiNzEuLmM2ZTgzYTcgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9yZGV2LW9wcy5oCisrKyBiL25ldC93aXJlbGVzcy9yZGV2LW9wcy5oCkBAIC0zNSwxMyArMzUsMTQgQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgd2lyZWxlc3NfZGV2CiAqcmRldl9hZGRfdmlydHVhbF9pbnRmKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwgY2hhciAqbmFtZSwKKwkJICAgICAgIHVuc2lnbmVkIGNoYXIgbmFtZV9hc3NpZ25fdHlwZSwKIAkJICAgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwgdTMyICpmbGFncywKIAkJICAgICAgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqcmV0OwogCXRyYWNlX3JkZXZfYWRkX3ZpcnR1YWxfaW50ZigmcmRldi0+d2lwaHksIG5hbWUsIHR5cGUpOwotCXJldCA9IHJkZXYtPm9wcy0+YWRkX3ZpcnR1YWxfaW50ZigmcmRldi0+d2lwaHksIG5hbWUsIHR5cGUsIGZsYWdzLAotCQkJCQkgIHBhcmFtcyk7CisJcmV0ID0gcmRldi0+b3BzLT5hZGRfdmlydHVhbF9pbnRmKCZyZGV2LT53aXBoeSwgbmFtZSwgbmFtZV9hc3NpZ25fdHlwZSwKKwkJCQkJICB0eXBlLCBmbGFncywgcGFyYW1zKTsKIAl0cmFjZV9yZGV2X3JldHVybl93ZGV2KCZyZGV2LT53aXBoeSwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3JlZy5jIGIvbmV0L3dpcmVsZXNzL3JlZy5jCmluZGV4IDQ4ZGZjN2IuLjBlMzQ3ZjggMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9yZWcuYworKysgYi9uZXQvd2lyZWxlc3MvcmVnLmMKQEAgLTgyLDE3ICs4MiwxMiBAQAogICoJYmUgaW50ZXJzZWN0ZWQgd2l0aCB0aGUgY3VycmVudCBvbmUuCiAgKiBAUkVHX1JFUV9BTFJFQURZX1NFVDogdGhlIHJlZ3VsYXRvcnkgcmVxdWVzdCB3aWxsIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQKICAqCXJlZ3VsYXRvcnkgc2V0dGluZ3MsIGFuZCBubyBmdXJ0aGVyIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQuCi0gKiBAUkVHX1JFUV9VU0VSX0hJTlRfSEFORExFRDogYSBub24gYWxwaGEyICB1c2VyIGhpbnQgd2FzIGhhbmRsZWQgYW5kIG5vCi0gKglmdXJ0aGVyIHByb2Nlc3NpbmcgaXMgcmVxdWlyZWQsIGkuZS4sIG5vdCBuZWVkIHRvIHVwZGF0ZSBsYXN0X3JlcXVlc3QKLSAqCWV0Yy4gVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgdXNlciBoaW50cyB0aGF0IGRvIG5vdCBwcm92aWRlIGFuIGFscGhhMgotICoJYnV0IHNvbWUgb3RoZXIgdHlwZSBvZiByZWd1bGF0b3J5IGhpbnQsIGkuZS4sIGluZG9vciBvcGVyYXRpb24uCiAgKi8KIGVudW0gcmVnX3JlcXVlc3RfdHJlYXRtZW50IHsKIAlSRUdfUkVRX09LLAogCVJFR19SRVFfSUdOT1JFLAogCVJFR19SRVFfSU5URVJTRUNULAogCVJFR19SRVFfQUxSRUFEWV9TRVQsCi0JUkVHX1JFUV9VU0VSX0hJTlRfSEFORExFRCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0IGNvcmVfcmVxdWVzdF93b3JsZCA9IHsKQEAgLTEzMyw5ICsxMjgsMTcgQEAKICAqIFN0YXRlIHZhcmlhYmxlIGluZGljYXRpbmcgaWYgdGhlIHBsYXRmb3JtIG9uIHdoaWNoIHRoZSBkZXZpY2VzCiAgKiBhcmUgYXR0YWNoZWQgaXMgb3BlcmF0aW5nIGluIGFuIGluZG9vciBlbnZpcm9ubWVudC4gVGhlIHN0YXRlIHZhcmlhYmxlCiAgKiBpcyByZWxldmFudCBmb3IgYWxsIHJlZ2lzdGVyZWQgZGV2aWNlcy4KLSAqIChwcm90ZWN0ZWQgYnkgUlROTCkKICAqLwogc3RhdGljIGJvb2wgcmVnX2lzX2luZG9vcjsKK3N0YXRpYyBzcGlubG9ja190IHJlZ19pbmRvb3JfbG9jazsKKworLyogVXNlZCB0byB0cmFjayB0aGUgdXNlcnNwYWNlIHByb2Nlc3MgY29udHJvbGxpbmcgdGhlIGluZG9vciBzZXR0aW5nICovCitzdGF0aWMgdTMyIHJlZ19pc19pbmRvb3JfcG9ydGlkOworCisvKiBNYXggbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGF0dGVtcHRzIHRvIGNvbW11bmljYXRlIHdpdGggQ1JEQSAgKi8KKyNkZWZpbmUgUkVHX01BWF9DUkRBX1RJTUVPVVRTIDEwCisKK3N0YXRpYyB1MzIgcmVnX2NyZGFfdGltZW91dHM7CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqZ2V0X2NmZzgwMjExX3JlZ2RvbSh2b2lkKQogewpAQCAtNDg3LDcgKzQ5MCw3IEBACiAJbXV0ZXhfdW5sb2NrKCZyZWdfcmVnZGJfc2VhcmNoX211dGV4KTsKIAogCWlmICghSVNfRVJSX09SX05VTEwocmVnZG9tKSkKLQkJc2V0X3JlZ2RvbShyZWdkb20pOworCQlzZXRfcmVnZG9tKHJlZ2RvbSwgUkVHRF9TT1VSQ0VfSU5URVJOQUxfREIpOwogCiAJcnRubF91bmxvY2soKTsKIH0KQEAgLTUzNywxNSArNTQwLDIwIEBACiAJc25wcmludGYoY291bnRyeSwgc2l6ZW9mKGNvdW50cnkpLCAiQ09VTlRSWT0lYyVjIiwKIAkJIGFscGhhMlswXSwgYWxwaGEyWzFdKTsKIAorCS8qIHF1ZXJ5IGludGVybmFsIHJlZ3VsYXRvcnkgZGF0YWJhc2UgKGlmIGl0IGV4aXN0cykgKi8KKwlyZWdfcmVnZGJfcXVlcnkoYWxwaGEyKTsKKworCWlmIChyZWdfY3JkYV90aW1lb3V0cyA+IFJFR19NQVhfQ1JEQV9USU1FT1VUUykgeworCQlwcl9pbmZvKCJFeGNlZWRlZCBDUkRBIGNhbGwgbWF4IGF0dGVtcHRzLiBOb3QgY2FsbGluZyBDUkRBXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJaWYgKCFpc193b3JsZF9yZWdkb20oKGNoYXIgKikgYWxwaGEyKSkKIAkJcHJfaW5mbygiQ2FsbGluZyBDUkRBIGZvciBjb3VudHJ5OiAlYyVjXG4iLAogCQkJYWxwaGEyWzBdLCBhbHBoYTJbMV0pOwogCWVsc2UKIAkJcHJfaW5mbygiQ2FsbGluZyBDUkRBIHRvIHVwZGF0ZSB3b3JsZCByZWd1bGF0b3J5IGRvbWFpblxuIik7CiAKLQkvKiBxdWVyeSBpbnRlcm5hbCByZWd1bGF0b3J5IGRhdGFiYXNlIChpZiBpdCBleGlzdHMpICovCi0JcmVnX3JlZ2RiX3F1ZXJ5KGFscGhhMik7Ci0KIAlyZXR1cm4ga29iamVjdF91ZXZlbnRfZW52KCZyZWdfcGRldi0+ZGV2LmtvYmosIEtPQkpfQ0hBTkdFLCBlbnYpOwogfQogCkBAIC01NTQsNiArNTYyLDkgQEAKIHsKIAlpZiAoY2FsbF9jcmRhKHJlcXVlc3QtPmFscGhhMikpCiAJCXJldHVybiBSRUdfUkVRX0lHTk9SRTsKKworCXF1ZXVlX2RlbGF5ZWRfd29yayhzeXN0ZW1fcG93ZXJfZWZmaWNpZW50X3dxLAorCQkJICAgJnJlZ190aW1lb3V0LCBtc2Vjc190b19qaWZmaWVzKDMxNDIpKTsKIAlyZXR1cm4gUkVHX1JFUV9PSzsKIH0KIApAQCAtMTI0OCwxMyArMTI1OSw2IEBACiAJcmV0dXJuIHJlcXVlc3QtPnVzZXJfcmVnX2hpbnRfdHlwZSA9PSBOTDgwMjExX1VTRVJfUkVHX0hJTlRfQ0VMTF9CQVNFOwogfQogCi1zdGF0aWMgYm9vbCByZWdfcmVxdWVzdF9pbmRvb3Ioc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCkKLXsKLQlpZiAocmVxdWVzdC0+aW5pdGlhdG9yICE9IE5MODAyMTFfUkVHRE9NX1NFVF9CWV9VU0VSKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIHJlcXVlc3QtPnVzZXJfcmVnX2hpbnRfdHlwZSA9PSBOTDgwMjExX1VTRVJfUkVHX0hJTlRfSU5ET09SOwotfQotCiBib29sIHJlZ19sYXN0X3JlcXVlc3RfY2VsbF9iYXNlKHZvaWQpCiB7CiAJcmV0dXJuIHJlZ19yZXF1ZXN0X2NlbGxfYmFzZShnZXRfbGFzdF9yZXF1ZXN0KCkpOwpAQCAtMTgwMCw4ICsxODA0LDcgQEAKIAkJbmVlZF9tb3JlX3Byb2Nlc3NpbmcgPSB0cnVlOwogCXNwaW5fdW5sb2NrKCZyZWdfcmVxdWVzdHNfbG9jayk7CiAKLQlpZiAobHItPmluaXRpYXRvciA9PSBOTDgwMjExX1JFR0RPTV9TRVRfQllfVVNFUikKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcmVnX3RpbWVvdXQpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnJlZ190aW1lb3V0KTsKIAogCWlmIChuZWVkX21vcmVfcHJvY2Vzc2luZykKIAkJc2NoZWR1bGVfd29yaygmcmVnX3dvcmspOwpAQCAtMTgzMywxMSArMTgzNiw2IEBACiB7CiAJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqbHIgPSBnZXRfbGFzdF9yZXF1ZXN0KCk7CiAKLQlpZiAocmVnX3JlcXVlc3RfaW5kb29yKHVzZXJfcmVxdWVzdCkpIHsKLQkJcmVnX2lzX2luZG9vciA9IHRydWU7Ci0JCXJldHVybiBSRUdfUkVRX1VTRVJfSElOVF9IQU5ETEVEOwotCX0KLQogCWlmIChyZWdfcmVxdWVzdF9jZWxsX2Jhc2UodXNlcl9yZXF1ZXN0KSkKIAkJcmV0dXJuIHJlZ19pZ25vcmVfY2VsbF9oaW50KHVzZXJfcmVxdWVzdCk7CiAKQEAgLTE4ODUsOCArMTg4Myw3IEBACiAKIAl0cmVhdG1lbnQgPSBfX3JlZ19wcm9jZXNzX2hpbnRfdXNlcih1c2VyX3JlcXVlc3QpOwogCWlmICh0cmVhdG1lbnQgPT0gUkVHX1JFUV9JR05PUkUgfHwKLQkgICAgdHJlYXRtZW50ID09IFJFR19SRVFfQUxSRUFEWV9TRVQgfHwKLQkgICAgdHJlYXRtZW50ID09IFJFR19SRVFfVVNFUl9ISU5UX0hBTkRMRUQpIHsKKwkgICAgdHJlYXRtZW50ID09IFJFR19SRVFfQUxSRUFEWV9TRVQpIHsKIAkJcmVnX2ZyZWVfcmVxdWVzdCh1c2VyX3JlcXVlc3QpOwogCQlyZXR1cm4gdHJlYXRtZW50OwogCX0KQEAgLTE5NDcsNyArMTk0NCw2IEBACiAJY2FzZSBSRUdfUkVRX09LOgogCQlicmVhazsKIAljYXNlIFJFR19SRVFfSUdOT1JFOgotCWNhc2UgUkVHX1JFUV9VU0VSX0hJTlRfSEFORExFRDoKIAkJcmVnX2ZyZWVfcmVxdWVzdChkcml2ZXJfcmVxdWVzdCk7CiAJCXJldHVybiB0cmVhdG1lbnQ7CiAJY2FzZSBSRUdfUkVRX0lOVEVSU0VDVDoKQEAgLTIwNDcsNyArMjA0Myw2IEBACiAJY2FzZSBSRUdfUkVRX09LOgogCQlicmVhazsKIAljYXNlIFJFR19SRVFfSUdOT1JFOgotCWNhc2UgUkVHX1JFUV9VU0VSX0hJTlRfSEFORExFRDoKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBSRUdfUkVRX0FMUkVBRFlfU0VUOgogCQlyZWdfZnJlZV9yZXF1ZXN0KGNvdW50cnlfaWVfcmVxdWVzdCk7CkBAIC0yMDg2LDExICsyMDgxLDggQEAKIAljYXNlIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9VU0VSOgogCQl0cmVhdG1lbnQgPSByZWdfcHJvY2Vzc19oaW50X3VzZXIocmVnX3JlcXVlc3QpOwogCQlpZiAodHJlYXRtZW50ID09IFJFR19SRVFfSUdOT1JFIHx8Ci0JCSAgICB0cmVhdG1lbnQgPT0gUkVHX1JFUV9BTFJFQURZX1NFVCB8fAotCQkgICAgdHJlYXRtZW50ID09IFJFR19SRVFfVVNFUl9ISU5UX0hBTkRMRUQpCisJCSAgICB0cmVhdG1lbnQgPT0gUkVHX1JFUV9BTFJFQURZX1NFVCkKIAkJCXJldHVybjsKLQkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCi0JCQkJICAgJnJlZ190aW1lb3V0LCBtc2Vjc190b19qaWZmaWVzKDMxNDIpKTsKIAkJcmV0dXJuOwogCWNhc2UgTkw4MDIxMV9SRUdET01fU0VUX0JZX0RSSVZFUjoKIAkJaWYgKCF3aXBoeSkKQEAgLTIxNzcsNiArMjE2OSwxMyBAQAogCX0KIAogCXJlZ19wcm9jZXNzX2hpbnQocmVnX3JlcXVlc3QpOworCisJbHIgPSBnZXRfbGFzdF9yZXF1ZXN0KCk7CisKKwlzcGluX2xvY2soJnJlZ19yZXF1ZXN0c19sb2NrKTsKKwlpZiAoIWxpc3RfZW1wdHkoJnJlZ19yZXF1ZXN0c19saXN0KSAmJiBsciAmJiBsci0+cHJvY2Vzc2VkKQorCQlzY2hlZHVsZV93b3JrKCZyZWdfd29yayk7CisJc3Bpbl91bmxvY2soJnJlZ19yZXF1ZXN0c19sb2NrKTsKIH0KIAogLyogUHJvY2Vzc2VzIGJlYWNvbiBoaW50cyAtLSB0aGlzIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggY291bnRyeSBJRXMgKi8KQEAgLTIzMDQsMjcgKzIzMDMsNTggQEAKIAlyZXF1ZXN0LT5pbml0aWF0b3IgPSBOTDgwMjExX1JFR0RPTV9TRVRfQllfVVNFUjsKIAlyZXF1ZXN0LT51c2VyX3JlZ19oaW50X3R5cGUgPSB1c2VyX3JlZ19oaW50X3R5cGU7CiAKKwkvKiBBbGxvdyBjYWxsaW5nIENSREEgYWdhaW4gKi8KKwlyZWdfY3JkYV90aW1lb3V0cyA9IDA7CisKIAlxdWV1ZV9yZWd1bGF0b3J5X3JlcXVlc3QocmVxdWVzdCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHJlZ3VsYXRvcnlfaGludF9pbmRvb3JfdXNlcih2b2lkKQoraW50IHJlZ3VsYXRvcnlfaGludF9pbmRvb3IoYm9vbCBpc19pbmRvb3IsIHUzMiBwb3J0aWQpCiB7Ci0Jc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdDsKKwlzcGluX2xvY2soJnJlZ19pbmRvb3JfbG9jayk7CiAKLQlyZXF1ZXN0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCksIEdGUF9LRVJORUwpOwotCWlmICghcmVxdWVzdCkKLQkJcmV0dXJuIC1FTk9NRU07CisJLyogSXQgaXMgcG9zc2libGUgdGhhdCBtb3JlIHRoYW4gb25lIHVzZXIgc3BhY2UgcHJvY2VzcyBpcyB0cnlpbmcgdG8KKwkgKiBjb25maWd1cmUgdGhlIGluZG9vciBzZXR0aW5nLiBUbyBoYW5kbGUgc3VjaCBjYXNlcywgY2xlYXIgdGhlIGluZG9vcgorCSAqIHNldHRpbmcgaW4gY2FzZSB0aGF0IHNvbWUgcHJvY2VzcyBkb2VzIG5vdCB0aGluayB0aGF0IHRoZSBkZXZpY2UKKwkgKiBpcyBvcGVyYXRpbmcgaW4gYW4gaW5kb29yIGVudmlyb25tZW50LiBJbiBhZGRpdGlvbiwgaWYgYSB1c2VyIHNwYWNlCisJICogcHJvY2VzcyBpbmRpY2F0ZXMgdGhhdCBpdCBpcyBjb250cm9sbGluZyB0aGUgaW5kb29yIHNldHRpbmcsIHNhdmUgaXRzCisJICogcG9ydGlkLCBpLmUuLCBtYWtlIGl0IHRoZSBvd25lci4KKwkgKi8KKwlyZWdfaXNfaW5kb29yID0gaXNfaW5kb29yOworCWlmIChyZWdfaXNfaW5kb29yKSB7CisJCWlmICghcmVnX2lzX2luZG9vcl9wb3J0aWQpCisJCQlyZWdfaXNfaW5kb29yX3BvcnRpZCA9IHBvcnRpZDsKKwl9IGVsc2UgeworCQlyZWdfaXNfaW5kb29yX3BvcnRpZCA9IDA7CisJfQogCi0JcmVxdWVzdC0+d2lwaHlfaWR4ID0gV0lQSFlfSURYX0lOVkFMSUQ7Ci0JcmVxdWVzdC0+aW5pdGlhdG9yID0gTkw4MDIxMV9SRUdET01fU0VUX0JZX1VTRVI7Ci0JcmVxdWVzdC0+dXNlcl9yZWdfaGludF90eXBlID0gTkw4MDIxMV9VU0VSX1JFR19ISU5UX0lORE9PUjsKLQlxdWV1ZV9yZWd1bGF0b3J5X3JlcXVlc3QocmVxdWVzdCk7CisJc3Bpbl91bmxvY2soJnJlZ19pbmRvb3JfbG9jayk7CisKKwlpZiAoIWlzX2luZG9vcikKKwkJcmVnX2NoZWNrX2NoYW5uZWxzKCk7CiAKIAlyZXR1cm4gMDsKIH0KIAordm9pZCByZWd1bGF0b3J5X25ldGxpbmtfbm90aWZ5KHUzMiBwb3J0aWQpCit7CisJc3Bpbl9sb2NrKCZyZWdfaW5kb29yX2xvY2spOworCisJaWYgKHJlZ19pc19pbmRvb3JfcG9ydGlkICE9IHBvcnRpZCkgeworCQlzcGluX3VubG9jaygmcmVnX2luZG9vcl9sb2NrKTsKKwkJcmV0dXJuOworCX0KKworCXJlZ19pc19pbmRvb3IgPSBmYWxzZTsKKwlyZWdfaXNfaW5kb29yX3BvcnRpZCA9IDA7CisKKwlzcGluX3VubG9jaygmcmVnX2luZG9vcl9sb2NrKTsKKworCXJlZ19jaGVja19jaGFubmVscygpOworfQorCiAvKiBEcml2ZXIgaGludHMgKi8KIGludCByZWd1bGF0b3J5X2hpbnQoc3RydWN0IHdpcGh5ICp3aXBoeSwgY29uc3QgY2hhciAqYWxwaGEyKQogewpAQCAtMjM0NSw2ICsyMzc1LDkgQEAKIAlyZXF1ZXN0LT5hbHBoYTJbMV0gPSBhbHBoYTJbMV07CiAJcmVxdWVzdC0+aW5pdGlhdG9yID0gTkw4MDIxMV9SRUdET01fU0VUX0JZX0RSSVZFUjsKIAorCS8qIEFsbG93IGNhbGxpbmcgQ1JEQSBhZ2FpbiAqLworCXJlZ19jcmRhX3RpbWVvdXRzID0gMDsKKwogCXF1ZXVlX3JlZ3VsYXRvcnlfcmVxdWVzdChyZXF1ZXN0KTsKIAogCXJldHVybiAwOwpAQCAtMjM5OCw2ICsyNDMxLDkgQEAKIAlyZXF1ZXN0LT5pbml0aWF0b3IgPSBOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09VTlRSWV9JRTsKIAlyZXF1ZXN0LT5jb3VudHJ5X2llX2VudiA9IGVudjsKIAorCS8qIEFsbG93IGNhbGxpbmcgQ1JEQSBhZ2FpbiAqLworCXJlZ19jcmRhX3RpbWVvdXRzID0gMDsKKwogCXF1ZXVlX3JlZ3VsYXRvcnlfcmVxdWVzdChyZXF1ZXN0KTsKIAlyZXF1ZXN0ID0gTlVMTDsKIG91dDoKQEAgLTI0ODYsMTMgKzI1MjIsMjIgQEAKIAljaGFyIGFscGhhMlsyXTsKIAljaGFyIHdvcmxkX2FscGhhMlsyXTsKIAlzdHJ1Y3QgcmVnX2JlYWNvbiAqcmVnX2JlYWNvbiwgKmJ0bXA7Ci0Jc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVnX3JlcXVlc3QsICp0bXA7CiAJTElTVF9IRUFEKHRtcF9yZWdfcmVxX2xpc3QpOwogCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldjsKIAogCUFTU0VSVF9SVE5MKCk7CiAKLQlyZWdfaXNfaW5kb29yID0gZmFsc2U7CisJLyoKKwkgKiBDbGVhciB0aGUgaW5kb29yIHNldHRpbmcgaW4gY2FzZSB0aGF0IGl0IGlzIG5vdCBjb250cm9sbGVkIGJ5IHVzZXIKKwkgKiBzcGFjZSwgYXMgb3RoZXJ3aXNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBkZXZpY2UgaXMgc3RpbGwKKwkgKiBvcGVyYXRpbmcgaW4gYW4gaW5kb29yIGVudmlyb25tZW50LgorCSAqLworCXNwaW5fbG9jaygmcmVnX2luZG9vcl9sb2NrKTsKKwlpZiAocmVnX2lzX2luZG9vciAmJiAhcmVnX2lzX2luZG9vcl9wb3J0aWQpIHsKKwkJcmVnX2lzX2luZG9vciA9IGZhbHNlOworCQlyZWdfY2hlY2tfY2hhbm5lbHMoKTsKKwl9CisJc3Bpbl91bmxvY2soJnJlZ19pbmRvb3JfbG9jayk7CiAKIAlyZXNldF9yZWdkb21haW5zKHRydWUsICZ3b3JsZF9yZWdkb20pOwogCXJlc3RvcmVfYWxwaGEyKGFscGhhMiwgcmVzZXRfdXNlcik7CkBAIC0yNTA0LDExICsyNTQ5LDcgQEAKIAkgKiBzZXR0aW5ncy4KIAkgKi8KIAlzcGluX2xvY2soJnJlZ19yZXF1ZXN0c19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVnX3JlcXVlc3QsIHRtcCwgJnJlZ19yZXF1ZXN0c19saXN0LCBsaXN0KSB7Ci0JCWlmIChyZWdfcmVxdWVzdC0+aW5pdGlhdG9yICE9IE5MODAyMTFfUkVHRE9NX1NFVF9CWV9VU0VSKQotCQkJY29udGludWU7Ci0JCWxpc3RfbW92ZV90YWlsKCZyZWdfcmVxdWVzdC0+bGlzdCwgJnRtcF9yZWdfcmVxX2xpc3QpOwotCX0KKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJnJlZ19yZXF1ZXN0c19saXN0LCAmdG1wX3JlZ19yZXFfbGlzdCk7CiAJc3Bpbl91bmxvY2soJnJlZ19yZXF1ZXN0c19sb2NrKTsKIAogCS8qIENsZWFyIGJlYWNvbiBoaW50cyAqLwpAQCAtMjg3MSw3ICsyOTEyLDggQEAKICAqIG11bHRpcGxlIGRyaXZlcnMgY2FuIGJlIGlyb25lZCBvdXQgbGF0ZXIuIENhbGxlciBtdXN0J3ZlIGFscmVhZHkKICAqIGttYWxsb2MnZCB0aGUgcmQgc3RydWN0dXJlLgogICovCi1pbnQgc2V0X3JlZ2RvbShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQpCitpbnQgc2V0X3JlZ2RvbShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQsCisJICAgICAgIGVudW0gaWVlZTgwMjExX3JlZ2Rfc291cmNlIHJlZ2Rfc3JjKQogewogCXN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKmxyOwogCWJvb2wgdXNlcl9yZXNldCA9IGZhbHNlOwpAQCAtMjg4Miw2ICsyOTI0LDkgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJaWYgKHJlZ2Rfc3JjID09IFJFR0RfU09VUkNFX0NSREEpCisJCXJlZ19jcmRhX3RpbWVvdXRzID0gMDsKKwogCWxyID0gZ2V0X2xhc3RfcmVxdWVzdCgpOwogCiAJLyogTm90ZSB0aGF0IHRoaXMgZG9lc24ndCB1cGRhdGUgdGhlIHdpcGh5cywgdGhpcyBpcyBkb25lIGJlbG93ICovCkBAIC0zMDQxLDYgKzMwODYsNyBAQAogewogCVJFR19EQkdfUFJJTlQoIlRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgQ1JEQSB0byByZXBseSwgcmVzdG9yaW5nIHJlZ3VsYXRvcnkgc2V0dGluZ3NcbiIpOwogCXJ0bmxfbG9jaygpOworCXJlZ19jcmRhX3RpbWVvdXRzKys7CiAJcmVzdG9yZV9yZWd1bGF0b3J5X3NldHRpbmdzKHRydWUpOwogCXJ0bmxfdW5sb2NrKCk7CiB9CkBAIC0zMDg5LDYgKzMxMzUsNyBAQAogCiAJc3Bpbl9sb2NrX2luaXQoJnJlZ19yZXF1ZXN0c19sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmcmVnX3BlbmRpbmdfYmVhY29uc19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmcmVnX2luZG9vcl9sb2NrKTsKIAogCXJlZ19yZWdkYl9zaXplX2NoZWNrKCk7CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9yZWcuaCBiL25ldC93aXJlbGVzcy9yZWcuaAppbmRleCA0YjQ1ZDZlLi45ZjQ5NWQ3IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvcmVnLmgKKysrIGIvbmV0L3dpcmVsZXNzL3JlZy5oCkBAIC0xNiw2ICsxNiwxMSBAQAogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLwogCitlbnVtIGllZWU4MDIxMV9yZWdkX3NvdXJjZSB7CisJUkVHRF9TT1VSQ0VfSU5URVJOQUxfREIsCisJUkVHRF9TT1VSQ0VfQ1JEQSwKK307CisKIGV4dGVybiBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiBfX3JjdSAqY2ZnODAyMTFfcmVnZG9tYWluOwogCiBib29sIHJlZ19pc192YWxpZF9yZXF1ZXN0KGNvbnN0IGNoYXIgKmFscGhhMik7CkBAIC0yNSw3ICszMCwyMCBAQAogCiBpbnQgcmVndWxhdG9yeV9oaW50X3VzZXIoY29uc3QgY2hhciAqYWxwaGEyLAogCQkJIGVudW0gbmw4MDIxMV91c2VyX3JlZ19oaW50X3R5cGUgdXNlcl9yZWdfaGludF90eXBlKTsKLWludCByZWd1bGF0b3J5X2hpbnRfaW5kb29yX3VzZXIodm9pZCk7CisKKy8qKgorICogcmVndWxhdG9yeV9oaW50X2luZG9vciAtIGhpbnQgb3BlcmF0aW9uIGluIGluZG9vciBlbnYuIG9yIG5vdAorICogQGlzX2luZG9vcjogaWYgdHJ1ZSBpbmRpY2F0ZXMgdGhhdCB1c2VyIHNwYWNlIHRoaW5rcyB0aGF0IHRoZQorICogZGV2aWNlIGlzIG9wZXJhdGluZyBpbiBhbiBpbmRvb3IgZW52aXJvbm1lbnQuCisgKiBAcG9ydGlkOiB0aGUgbmV0bGluayBwb3J0IElEIG9uIHdoaWNoIHRoZSBoaW50IHdhcyBnaXZlbi4KKyAqLworaW50IHJlZ3VsYXRvcnlfaGludF9pbmRvb3IoYm9vbCBpc19pbmRvb3IsIHUzMiBwb3J0aWQpOworCisvKioKKyAqIHJlZ3VsYXRvcnlfbmV0bGlua19ub3RpZnkgLSBub3RpZnkgb24gcmVsZWFzZWQgbmV0bGluayBzb2NrZXQKKyAqIEBwb3J0aWQ6IHRoZSBuZXRsaW5rIHNvY2tldCBwb3J0IElECisgKi8KK3ZvaWQgcmVndWxhdG9yeV9uZXRsaW5rX25vdGlmeSh1MzIgcG9ydGlkKTsKIAogdm9pZCB3aXBoeV9yZWd1bGF0b3J5X3JlZ2lzdGVyKHN0cnVjdCB3aXBoeSAqd2lwaHkpOwogdm9pZCB3aXBoeV9yZWd1bGF0b3J5X2RlcmVnaXN0ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSk7CkBAIC0zMyw3ICs1MSw5IEBACiBpbnQgX19pbml0IHJlZ3VsYXRvcnlfaW5pdCh2b2lkKTsKIHZvaWQgcmVndWxhdG9yeV9leGl0KHZvaWQpOwogCi1pbnQgc2V0X3JlZ2RvbShjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQpOworaW50IHNldF9yZWdkb20oY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkLAorCSAgICAgICBlbnVtIGllZWU4MDIxMV9yZWdkX3NvdXJjZSByZWdkX3NyYyk7CisKIHVuc2lnbmVkIGludCByZWdfZ2V0X21heF9iYW5kd2lkdGgoY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkLAogCQkJCSAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnX3J1bGUgKnJ1bGUpOwogCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvc2Nhbi5jIGIvbmV0L3dpcmVsZXNzL3NjYW4uYwppbmRleCBjNzA1YzNlLi4zYTUwYWEyIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvc2Nhbi5jCisrKyBiL25ldC93aXJlbGVzcy9zY2FuLmMKQEAgLTUzMSwyNCArNTMxLDc4IEBACiAJfQogfQogCitzdGF0aWMgYm9vbCBjZmc4MDIxMV9ic3NfdHlwZV9tYXRjaCh1MTYgY2FwYWJpbGl0eSwKKwkJCQkgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJCSAgICBlbnVtIGllZWU4MDIxMV9ic3NfdHlwZSBic3NfdHlwZSkKK3sKKwlib29sIHJldCA9IHRydWU7CisJdTE2IG1hc2ssIHZhbDsKKworCWlmIChic3NfdHlwZSA9PSBJRUVFODAyMTFfQlNTX1RZUEVfQU5ZKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNjBHSFopIHsKKwkJbWFzayA9IFdMQU5fQ0FQQUJJTElUWV9ETUdfVFlQRV9NQVNLOworCQlzd2l0Y2ggKGJzc190eXBlKSB7CisJCWNhc2UgSUVFRTgwMjExX0JTU19UWVBFX0VTUzoKKwkJCXZhbCA9IFdMQU5fQ0FQQUJJTElUWV9ETUdfVFlQRV9BUDsKKwkJCWJyZWFrOworCQljYXNlIElFRUU4MDIxMV9CU1NfVFlQRV9QQlNTOgorCQkJdmFsID0gV0xBTl9DQVBBQklMSVRZX0RNR19UWVBFX1BCU1M7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfQlNTX1RZUEVfSUJTUzoKKwkJCXZhbCA9IFdMQU5fQ0FQQUJJTElUWV9ETUdfVFlQRV9JQlNTOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9IGVsc2UgeworCQltYXNrID0gV0xBTl9DQVBBQklMSVRZX0VTUyB8IFdMQU5fQ0FQQUJJTElUWV9JQlNTOworCQlzd2l0Y2ggKGJzc190eXBlKSB7CisJCWNhc2UgSUVFRTgwMjExX0JTU19UWVBFX0VTUzoKKwkJCXZhbCA9IFdMQU5fQ0FQQUJJTElUWV9FU1M7CisJCQlicmVhazsKKwkJY2FzZSBJRUVFODAyMTFfQlNTX1RZUEVfSUJTUzoKKwkJCXZhbCA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOworCQkJYnJlYWs7CisJCWNhc2UgSUVFRTgwMjExX0JTU19UWVBFX01CU1M6CisJCQl2YWwgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlyZXQgPSAoKGNhcGFiaWxpdHkgJiBtYXNrKSA9PSB2YWwpOworCXJldHVybiByZXQ7Cit9CisKIC8qIFJldHVybmVkIGJzcyBpcyByZWZlcmVuY2UgY291bnRlZCBhbmQgbXVzdCBiZSBjbGVhbmVkIHVwIGFwcHJvcHJpYXRlbHkuICovCiBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpjZmc4MDIxMV9nZXRfYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAogCQkJCSAgICAgIGNvbnN0IHU4ICpic3NpZCwKIAkJCQkgICAgICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAotCQkJCSAgICAgIHUxNiBjYXBhX21hc2ssIHUxNiBjYXBhX3ZhbCkKKwkJCQkgICAgICBlbnVtIGllZWU4MDIxMV9ic3NfdHlwZSBic3NfdHlwZSwKKwkJCQkgICAgICBlbnVtIGllZWU4MDIxMV9wcml2YWN5IHByaXZhY3kpCiB7CiAJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3aXBoeSk7CiAJc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqYnNzLCAqcmVzID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CisJaW50IGJzc19wcml2YWN5OwogCi0JdHJhY2VfY2ZnODAyMTFfZ2V0X2Jzcyh3aXBoeSwgY2hhbm5lbCwgYnNzaWQsIHNzaWQsIHNzaWRfbGVuLCBjYXBhX21hc2ssCi0JCQkgICAgICAgY2FwYV92YWwpOworCXRyYWNlX2NmZzgwMjExX2dldF9ic3Mod2lwaHksIGNoYW5uZWwsIGJzc2lkLCBzc2lkLCBzc2lkX2xlbiwgYnNzX3R5cGUsCisJCQkgICAgICAgcHJpdmFjeSk7CiAKIAlzcGluX2xvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYnNzLCAmcmRldi0+YnNzX2xpc3QsIGxpc3QpIHsKLQkJaWYgKChic3MtPnB1Yi5jYXBhYmlsaXR5ICYgY2FwYV9tYXNrKSAhPSBjYXBhX3ZhbCkKKwkJaWYgKCFjZmc4MDIxMV9ic3NfdHlwZV9tYXRjaChic3MtPnB1Yi5jYXBhYmlsaXR5LAorCQkJCQkgICAgIGJzcy0+cHViLmNoYW5uZWwtPmJhbmQsIGJzc190eXBlKSkKKwkJCWNvbnRpbnVlOworCisJCWJzc19wcml2YWN5ID0gKGJzcy0+cHViLmNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSk7CisJCWlmICgocHJpdmFjeSA9PSBJRUVFODAyMTFfUFJJVkFDWV9PTiAmJiAhYnNzX3ByaXZhY3kpIHx8CisJCSAgICAocHJpdmFjeSA9PSBJRUVFODAyMTFfUFJJVkFDWV9PRkYgJiYgYnNzX3ByaXZhY3kpKQogCQkJY29udGludWU7CiAJCWlmIChjaGFubmVsICYmIGJzcy0+cHViLmNoYW5uZWwgIT0gY2hhbm5lbCkKIAkJCWNvbnRpbnVlOwpAQCAtODk2LDYgKzk1MCw3IEBACiAJc3RydWN0IGNmZzgwMjExX2Jzc19pZXMgKmllczsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWw7CiAJc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyB0bXAgPSB7fSwgKnJlczsKKwlpbnQgYnNzX3R5cGU7CiAJYm9vbCBzaWduYWxfdmFsaWQ7CiAKIAlpZiAoV0FSTl9PTighd2lwaHkpKQpAQCAtOTUwLDggKzEwMDUsMTUgQEAKIAlpZiAoIXJlcykKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAocmVzLT5wdWIuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpCi0JCXJlZ3VsYXRvcnlfaGludF9mb3VuZF9iZWFjb24od2lwaHksIGNoYW5uZWwsIGdmcCk7CisJaWYgKGNoYW5uZWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNjBHSFopIHsKKwkJYnNzX3R5cGUgPSByZXMtPnB1Yi5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0RNR19UWVBFX01BU0s7CisJCWlmIChic3NfdHlwZSA9PSBXTEFOX0NBUEFCSUxJVFlfRE1HX1RZUEVfQVAgfHwKKwkJICAgIGJzc190eXBlID09IFdMQU5fQ0FQQUJJTElUWV9ETUdfVFlQRV9QQlNTKQorCQkJcmVndWxhdG9yeV9oaW50X2ZvdW5kX2JlYWNvbih3aXBoeSwgY2hhbm5lbCwgZ2ZwKTsKKwl9IGVsc2UgeworCQlpZiAocmVzLT5wdWIuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpCisJCQlyZWd1bGF0b3J5X2hpbnRfZm91bmRfYmVhY29uKHdpcGh5LCBjaGFubmVsLCBnZnApOworCX0KIAogCXRyYWNlX2NmZzgwMjExX3JldHVybl9ic3MoJnJlcy0+cHViKTsKIAkvKiBjZmc4MDIxMV9ic3NfdXBkYXRlIGdpdmVzIHVzIGEgcmVmZXJlbmNlZCByZXN1bHQgKi8KQEAgLTk3Myw2ICsxMDM1LDcgQEAKIAlib29sIHNpZ25hbF92YWxpZDsKIAlzaXplX3QgaWVsZW4gPSBsZW4gLSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsCiAJCQkJICAgICAgdS5wcm9iZV9yZXNwLnZhcmlhYmxlKTsKKwlpbnQgYnNzX3R5cGU7CiAKIAlCVUlMRF9CVUdfT04ob2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LnByb2JlX3Jlc3AudmFyaWFibGUpICE9CiAJCQlvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uLnZhcmlhYmxlKSk7CkBAIC0xMDI1LDggKzEwODgsMTUgQEAKIAlpZiAoIXJlcykKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAocmVzLT5wdWIuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpCi0JCXJlZ3VsYXRvcnlfaGludF9mb3VuZF9iZWFjb24od2lwaHksIGNoYW5uZWwsIGdmcCk7CisJaWYgKGNoYW5uZWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNjBHSFopIHsKKwkJYnNzX3R5cGUgPSByZXMtPnB1Yi5jYXBhYmlsaXR5ICYgV0xBTl9DQVBBQklMSVRZX0RNR19UWVBFX01BU0s7CisJCWlmIChic3NfdHlwZSA9PSBXTEFOX0NBUEFCSUxJVFlfRE1HX1RZUEVfQVAgfHwKKwkJICAgIGJzc190eXBlID09IFdMQU5fQ0FQQUJJTElUWV9ETUdfVFlQRV9QQlNTKQorCQkJcmVndWxhdG9yeV9oaW50X2ZvdW5kX2JlYWNvbih3aXBoeSwgY2hhbm5lbCwgZ2ZwKTsKKwl9IGVsc2UgeworCQlpZiAocmVzLT5wdWIuY2FwYWJpbGl0eSAmIFdMQU5fQ0FQQUJJTElUWV9FU1MpCisJCQlyZWd1bGF0b3J5X2hpbnRfZm91bmRfYmVhY29uKHdpcGh5LCBjaGFubmVsLCBnZnApOworCX0KIAogCXRyYWNlX2NmZzgwMjExX3JldHVybl9ic3MoJnJlcy0+cHViKTsKIAkvKiBjZmc4MDIxMV9ic3NfdXBkYXRlIGdpdmVzIHVzIGEgcmVmZXJlbmNlZCByZXN1bHQgKi8KQEAgLTEyMzcsMTcgKzEzMDcsMTcgQEAKIAlrZnJlZShjcmVxKTsKIAlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoY2ZnODAyMTFfd2V4dF9zaXdzY2FuKTsKK0VYUE9SVF9XRVhUX0hBTkRMRVIoY2ZnODAyMTFfd2V4dF9zaXdzY2FuKTsKIAotc3RhdGljIHZvaWQgaWVlZTgwMjExX3NjYW5fYWRkX2llcyhzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAotCQkJCSAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9ic3NfaWVzICppZXMsCi0JCQkJICAgY2hhciAqKmN1cnJlbnRfZXYsIGNoYXIgKmVuZF9idWYpCitzdGF0aWMgY2hhciAqaWVlZTgwMjExX3NjYW5fYWRkX2llcyhzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgY2ZnODAyMTFfYnNzX2llcyAqaWVzLAorCQkJCSAgICBjaGFyICpjdXJyZW50X2V2LCBjaGFyICplbmRfYnVmKQogewogCWNvbnN0IHU4ICpwb3MsICplbmQsICpuZXh0OwogCXN0cnVjdCBpd19ldmVudCBpd2U7CiAKIAlpZiAoIWllcykKLQkJcmV0dXJuOworCQlyZXR1cm4gY3VycmVudF9ldjsKIAogCS8qCiAJICogSWYgbmVlZGVkLCBmcmFnbWVudCB0aGUgSUVzIGJ1ZmZlciAoYXQgSUUgYm91bmRhcmllcykgaW50byBzaG9ydApAQCAtMTI2NCwxMCArMTMzNCwxMSBAQAogCQltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOwogCQlpd2UuY21kID0gSVdFVkdFTklFOwogCQlpd2UudS5kYXRhLmxlbmd0aCA9IG5leHQgLSBwb3M7Ci0JCSpjdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgKmN1cnJlbnRfZXYsCi0JCQkJCQkgICBlbmRfYnVmLCAmaXdlLAotCQkJCQkJICAgKHZvaWQgKilwb3MpOwotCisJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9jaGVjayhpbmZvLCBjdXJyZW50X2V2LAorCQkJCQkJCWVuZF9idWYsICZpd2UsCisJCQkJCQkJKHZvaWQgKilwb3MpOworCQlpZiAoSVNfRVJSKGN1cnJlbnRfZXYpKQorCQkJcmV0dXJuIGN1cnJlbnRfZXY7CiAJCXBvcyA9IG5leHQ7CiAJfQogCkBAIC0xMjc1LDEwICsxMzQ2LDE0IEBACiAJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCWl3ZS5jbWQgPSBJV0VWR0VOSUU7CiAJCWl3ZS51LmRhdGEubGVuZ3RoID0gZW5kIC0gcG9zOwotCQkqY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sICpjdXJyZW50X2V2LAotCQkJCQkJICAgZW5kX2J1ZiwgJml3ZSwKLQkJCQkJCSAgICh2b2lkICopcG9zKTsKKwkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50X2NoZWNrKGluZm8sIGN1cnJlbnRfZXYsCisJCQkJCQkJZW5kX2J1ZiwgJml3ZSwKKwkJCQkJCQkodm9pZCAqKXBvcyk7CisJCWlmIChJU19FUlIoY3VycmVudF9ldikpCisJCQlyZXR1cm4gY3VycmVudF9ldjsKIAl9CisKKwlyZXR1cm4gY3VycmVudF9ldjsKIH0KIAogc3RhdGljIGNoYXIgKgpAQCAtMTI4OSw3ICsxMzY0LDggQEAKIAljb25zdCBzdHJ1Y3QgY2ZnODAyMTFfYnNzX2llcyAqaWVzOwogCXN0cnVjdCBpd19ldmVudCBpd2U7CiAJY29uc3QgdTggKmllOwotCXU4ICpidWYsICpjZmcsICpwOworCXU4IGJ1Zls1MF07CisJdTggKmNmZywgKnAsICp0bXA7CiAJaW50IHJlbSwgaSwgc2lnOwogCWJvb2wgaXNtZXNoID0gZmFsc2U7CiAKQEAgLTEyOTcsMjIgKzEzNzMsMjggQEAKIAlpd2UuY21kID0gU0lPQ0dJV0FQOwogCWl3ZS51LmFwX2FkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOwogCW1lbWNweShpd2UudS5hcF9hZGRyLnNhX2RhdGEsIGJzcy0+cHViLmJzc2lkLCBFVEhfQUxFTik7Ci0JY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCi0JCQkJCSAgSVdfRVZfQUREUl9MRU4pOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9jaGVjayhpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkJSVdfRVZfQUREUl9MRU4pOworCWlmIChJU19FUlIoY3VycmVudF9ldikpCisJCXJldHVybiBjdXJyZW50X2V2OwogCiAJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAlpd2UuY21kID0gU0lPQ0dJV0ZSRVE7CiAJaXdlLnUuZnJlcS5tID0gaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKGJzcy0+cHViLmNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKIAlpd2UudS5mcmVxLmUgPSAwOwotCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAotCQkJCQkgIElXX0VWX0ZSRVFfTEVOKTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfY2hlY2soaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwgJml3ZSwKKwkJCQkJCUlXX0VWX0ZSRVFfTEVOKTsKKwlpZiAoSVNfRVJSKGN1cnJlbnRfZXYpKQorCQlyZXR1cm4gY3VycmVudF9ldjsKIAogCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJaXdlLmNtZCA9IFNJT0NHSVdGUkVROwogCWl3ZS51LmZyZXEubSA9IGJzcy0+cHViLmNoYW5uZWwtPmNlbnRlcl9mcmVxOwogCWl3ZS51LmZyZXEuZSA9IDY7Ci0JY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX2V2ZW50KGluZm8sIGN1cnJlbnRfZXYsIGVuZF9idWYsICZpd2UsCi0JCQkJCSAgSVdfRVZfRlJFUV9MRU4pOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9ldmVudF9jaGVjayhpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLCAmaXdlLAorCQkJCQkJSVdfRVZfRlJFUV9MRU4pOworCWlmIChJU19FUlIoY3VycmVudF9ldikpCisJCXJldHVybiBjdXJyZW50X2V2OwogCiAJaWYgKHdpcGh5LT5zaWduYWxfdHlwZSAhPSBDRkc4MDIxMV9TSUdOQUxfVFlQRV9OT05FKSB7CiAJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CkBAIC0xMzQxLDggKzE0MjMsMTEgQEAKIAkJCS8qIG5vdCByZWFjaGVkICovCiAJCQlicmVhazsKIAkJfQotCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKLQkJCQkJCSAgJml3ZSwgSVdfRVZfUVVBTF9MRU4pOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfY2hlY2soaW5mbywgY3VycmVudF9ldiwKKwkJCQkJCQllbmRfYnVmLCAmaXdlLAorCQkJCQkJCUlXX0VWX1FVQUxfTEVOKTsKKwkJaWYgKElTX0VSUihjdXJyZW50X2V2KSkKKwkJCXJldHVybiBjdXJyZW50X2V2OwogCX0KIAogCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CkBAIC0xMzUyLDggKzE0MzcsMTAgQEAKIAllbHNlCiAJCWl3ZS51LmRhdGEuZmxhZ3MgPSBJV19FTkNPREVfRElTQUJMRUQ7CiAJaXdlLnUuZGF0YS5sZW5ndGggPSAwOwotCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAotCQkJCQkgICZpd2UsICIiKTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnRfY2hlY2soaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKKwkJCQkJCSZpd2UsICIiKTsKKwlpZiAoSVNfRVJSKGN1cnJlbnRfZXYpKQorCQlyZXR1cm4gY3VycmVudF9ldjsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlpZXMgPSByY3VfZGVyZWZlcmVuY2UoYnNzLT5wdWIuaWVzKTsKQEAgLTEzNzEsNjYgKzE0NTgsOTEgQEAKIAkJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CiAJCQlpd2UudS5kYXRhLmxlbmd0aCA9IGllWzFdOwogCQkJaXdlLnUuZGF0YS5mbGFncyA9IDE7Ci0JCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKLQkJCQkJCQkgICZpd2UsICh1OCAqKWllICsgMik7CisJCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnRfY2hlY2soaW5mbywKKwkJCQkJCQkJY3VycmVudF9ldiwKKwkJCQkJCQkJZW5kX2J1ZiwgJml3ZSwKKwkJCQkJCQkJKHU4ICopaWUgKyAyKTsKKwkJCWlmIChJU19FUlIoY3VycmVudF9ldikpCisJCQkJZ290byB1bmxvY2s7CiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0VJRF9NRVNIX0lEOgogCQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKIAkJCWl3ZS5jbWQgPSBTSU9DR0lXRVNTSUQ7CiAJCQlpd2UudS5kYXRhLmxlbmd0aCA9IGllWzFdOwogCQkJaXdlLnUuZGF0YS5mbGFncyA9IDE7Ci0JCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKLQkJCQkJCQkgICZpd2UsICh1OCAqKWllICsgMik7CisJCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnRfY2hlY2soaW5mbywKKwkJCQkJCQkJY3VycmVudF9ldiwKKwkJCQkJCQkJZW5kX2J1ZiwgJml3ZSwKKwkJCQkJCQkJKHU4ICopaWUgKyAyKTsKKwkJCWlmIChJU19FUlIoY3VycmVudF9ldikpCisJCQkJZ290byB1bmxvY2s7CiAJCQlicmVhazsKIAkJY2FzZSBXTEFOX0VJRF9NRVNIX0NPTkZJRzoKIAkJCWlzbWVzaCA9IHRydWU7CiAJCQlpZiAoaWVbMV0gIT0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWVzaGNvbmZfaWUpKQogCQkJCWJyZWFrOwotCQkJYnVmID0ga21hbGxvYyg1MCwgR0ZQX0FUT01JQyk7Ci0JCQlpZiAoIWJ1ZikKLQkJCQlicmVhazsKIAkJCWNmZyA9ICh1OCAqKWllICsgMjsKIAkJCW1lbXNldCgmaXdlLCAwLCBzaXplb2YoaXdlKSk7CiAJCQlpd2UuY21kID0gSVdFVkNVU1RPTTsKIAkJCXNwcmludGYoYnVmLCAiTWVzaCBOZXR3b3JrIFBhdGggU2VsZWN0aW9uIFByb3RvY29sIElEOiAiCiAJCQkJIjB4JTAyWCIsIGNmZ1swXSk7CiAJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwotCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJCQkJICBlbmRfYnVmLAotCQkJCQkJCSAgJml3ZSwgYnVmKTsKKwkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9jaGVjayhpbmZvLAorCQkJCQkJCQljdXJyZW50X2V2LAorCQkJCQkJCQllbmRfYnVmLAorCQkJCQkJCQkmaXdlLCBidWYpOworCQkJaWYgKElTX0VSUihjdXJyZW50X2V2KSkKKwkJCQlnb3RvIHVubG9jazsKIAkJCXNwcmludGYoYnVmLCAiUGF0aCBTZWxlY3Rpb24gTWV0cmljIElEOiAweCUwMlgiLAogCQkJCWNmZ1sxXSk7CiAJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwotCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJCQkJICBlbmRfYnVmLAotCQkJCQkJCSAgJml3ZSwgYnVmKTsKKwkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9jaGVjayhpbmZvLAorCQkJCQkJCQljdXJyZW50X2V2LAorCQkJCQkJCQllbmRfYnVmLAorCQkJCQkJCQkmaXdlLCBidWYpOworCQkJaWYgKElTX0VSUihjdXJyZW50X2V2KSkKKwkJCQlnb3RvIHVubG9jazsKIAkJCXNwcmludGYoYnVmLCAiQ29uZ2VzdGlvbiBDb250cm9sIE1vZGUgSUQ6IDB4JTAyWCIsCiAJCQkJY2ZnWzJdKTsKIAkJCWl3ZS51LmRhdGEubGVuZ3RoID0gc3RybGVuKGJ1Zik7Ci0JCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwKLQkJCQkJCQkgIGVuZF9idWYsCi0JCQkJCQkJICAmaXdlLCBidWYpOworCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50X2NoZWNrKGluZm8sCisJCQkJCQkJCWN1cnJlbnRfZXYsCisJCQkJCQkJCWVuZF9idWYsCisJCQkJCQkJCSZpd2UsIGJ1Zik7CisJCQlpZiAoSVNfRVJSKGN1cnJlbnRfZXYpKQorCQkJCWdvdG8gdW5sb2NrOwogCQkJc3ByaW50ZihidWYsICJTeW5jaHJvbml6YXRpb24gSUQ6IDB4JTAyWCIsIGNmZ1szXSk7CiAJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwotCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJCQkJICBlbmRfYnVmLAotCQkJCQkJCSAgJml3ZSwgYnVmKTsKKwkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9jaGVjayhpbmZvLAorCQkJCQkJCQljdXJyZW50X2V2LAorCQkJCQkJCQllbmRfYnVmLAorCQkJCQkJCQkmaXdlLCBidWYpOworCQkJaWYgKElTX0VSUihjdXJyZW50X2V2KSkKKwkJCQlnb3RvIHVubG9jazsKIAkJCXNwcmludGYoYnVmLCAiQXV0aGVudGljYXRpb24gSUQ6IDB4JTAyWCIsIGNmZ1s0XSk7CiAJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwotCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJCQkJICBlbmRfYnVmLAotCQkJCQkJCSAgJml3ZSwgYnVmKTsKKwkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9jaGVjayhpbmZvLAorCQkJCQkJCQljdXJyZW50X2V2LAorCQkJCQkJCQllbmRfYnVmLAorCQkJCQkJCQkmaXdlLCBidWYpOworCQkJaWYgKElTX0VSUihjdXJyZW50X2V2KSkKKwkJCQlnb3RvIHVubG9jazsKIAkJCXNwcmludGYoYnVmLCAiRm9ybWF0aW9uIEluZm86IDB4JTAyWCIsIGNmZ1s1XSk7CiAJCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwotCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50KGluZm8sIGN1cnJlbnRfZXYsCi0JCQkJCQkJICBlbmRfYnVmLAotCQkJCQkJCSAgJml3ZSwgYnVmKTsKKwkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9jaGVjayhpbmZvLAorCQkJCQkJCQljdXJyZW50X2V2LAorCQkJCQkJCQllbmRfYnVmLAorCQkJCQkJCQkmaXdlLCBidWYpOworCQkJaWYgKElTX0VSUihjdXJyZW50X2V2KSkKKwkJCQlnb3RvIHVubG9jazsKIAkJCXNwcmludGYoYnVmLCAiQ2FwYWJpbGl0aWVzOiAweCUwMlgiLCBjZmdbNl0pOwogCQkJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKLQkJCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludChpbmZvLCBjdXJyZW50X2V2LAotCQkJCQkJCSAgZW5kX2J1ZiwKLQkJCQkJCQkgICZpd2UsIGJ1Zik7Ci0JCQlrZnJlZShidWYpOworCQkJY3VycmVudF9ldiA9IGl3ZV9zdHJlYW1fYWRkX3BvaW50X2NoZWNrKGluZm8sCisJCQkJCQkJCWN1cnJlbnRfZXYsCisJCQkJCQkJCWVuZF9idWYsCisJCQkJCQkJCSZpd2UsIGJ1Zik7CisJCQlpZiAoSVNfRVJSKGN1cnJlbnRfZXYpKQorCQkJCWdvdG8gdW5sb2NrOwogCQkJYnJlYWs7CiAJCWNhc2UgV0xBTl9FSURfU1VQUF9SQVRFUzoKIAkJY2FzZSBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUzoKQEAgLTE0NDUsOCArMTU1NywxNCBAQAogCQkJZm9yIChpID0gMDsgaSA8IGllWzFdOyBpKyspIHsKIAkJCQlpd2UudS5iaXRyYXRlLnZhbHVlID0KIAkJCQkJKChpZVtpICsgMl0gJiAweDdmKSAqIDUwMDAwMCk7CisJCQkJdG1wID0gcDsKIAkJCQlwID0gaXdlX3N0cmVhbV9hZGRfdmFsdWUoaW5mbywgY3VycmVudF9ldiwgcCwKLQkJCQkJCWVuZF9idWYsICZpd2UsIElXX0VWX1BBUkFNX0xFTik7CisJCQkJCQkJIGVuZF9idWYsICZpd2UsCisJCQkJCQkJIElXX0VWX1BBUkFNX0xFTik7CisJCQkJaWYgKHAgPT0gdG1wKSB7CisJCQkJCWN1cnJlbnRfZXYgPSBFUlJfUFRSKC1FMkJJRyk7CisJCQkJCWdvdG8gdW5sb2NrOworCQkJCX0KIAkJCX0KIAkJCWN1cnJlbnRfZXYgPSBwOwogCQkJYnJlYWs7CkBAIC0xNDY1LDMxICsxNTgzLDM1IEBACiAJCQlpd2UudS5tb2RlID0gSVdfTU9ERV9NQVNURVI7CiAJCWVsc2UKIAkJCWl3ZS51Lm1vZGUgPSBJV19NT0RFX0FESE9DOwotCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKLQkJCQkJCSAgJml3ZSwgSVdfRVZfVUlOVF9MRU4pOworCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfZXZlbnRfY2hlY2soaW5mbywgY3VycmVudF9ldiwKKwkJCQkJCQllbmRfYnVmLCAmaXdlLAorCQkJCQkJCUlXX0VWX1VJTlRfTEVOKTsKKwkJaWYgKElTX0VSUihjdXJyZW50X2V2KSkKKwkJCWdvdG8gdW5sb2NrOwogCX0KIAotCWJ1ZiA9IGttYWxsb2MoMzEsIEdGUF9BVE9NSUMpOwotCWlmIChidWYpIHsKLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IElXRVZDVVNUT007Ci0JCXNwcmludGYoYnVmLCAidHNmPSUwMTZsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKShpZXMtPnRzZikpOwotCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwotCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwgZW5kX2J1ZiwKLQkJCQkJCSAgJml3ZSwgYnVmKTsKLQkJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKLQkJaXdlLmNtZCA9IElXRVZDVVNUT007Ci0JCXNwcmludGYoYnVmLCAiIExhc3QgYmVhY29uOiAldW1zIGFnbyIsCi0JCQllbGFwc2VkX2ppZmZpZXNfbXNlY3MoYnNzLT50cykpOwotCQlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOwotCQljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnQoaW5mbywgY3VycmVudF9ldiwKLQkJCQkJCSAgZW5kX2J1ZiwgJml3ZSwgYnVmKTsKLQkJa2ZyZWUoYnVmKTsKLQl9CisJbWVtc2V0KCZpd2UsIDAsIHNpemVvZihpd2UpKTsKKwlpd2UuY21kID0gSVdFVkNVU1RPTTsKKwlzcHJpbnRmKGJ1ZiwgInRzZj0lMDE2bGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykoaWVzLT50c2YpKTsKKwlpd2UudS5kYXRhLmxlbmd0aCA9IHN0cmxlbihidWYpOworCWN1cnJlbnRfZXYgPSBpd2Vfc3RyZWFtX2FkZF9wb2ludF9jaGVjayhpbmZvLCBjdXJyZW50X2V2LCBlbmRfYnVmLAorCQkJCQkJJml3ZSwgYnVmKTsKKwlpZiAoSVNfRVJSKGN1cnJlbnRfZXYpKQorCQlnb3RvIHVubG9jazsKKwltZW1zZXQoJml3ZSwgMCwgc2l6ZW9mKGl3ZSkpOworCWl3ZS5jbWQgPSBJV0VWQ1VTVE9NOworCXNwcmludGYoYnVmLCAiIExhc3QgYmVhY29uOiAldW1zIGFnbyIsCisJCWVsYXBzZWRfamlmZmllc19tc2Vjcyhic3MtPnRzKSk7CisJaXdlLnUuZGF0YS5sZW5ndGggPSBzdHJsZW4oYnVmKTsKKwljdXJyZW50X2V2ID0gaXdlX3N0cmVhbV9hZGRfcG9pbnRfY2hlY2soaW5mbywgY3VycmVudF9ldiwKKwkJCQkJCWVuZF9idWYsICZpd2UsIGJ1Zik7CisJaWYgKElTX0VSUihjdXJyZW50X2V2KSkKKwkJZ290byB1bmxvY2s7CiAKLQlpZWVlODAyMTFfc2Nhbl9hZGRfaWVzKGluZm8sIGllcywgJmN1cnJlbnRfZXYsIGVuZF9idWYpOworCWN1cnJlbnRfZXYgPSBpZWVlODAyMTFfc2Nhbl9hZGRfaWVzKGluZm8sIGllcywgY3VycmVudF9ldiwgZW5kX2J1Zik7CisKKyB1bmxvY2s6CiAJcmN1X3JlYWRfdW5sb2NrKCk7Ci0KIAlyZXR1cm4gY3VycmVudF9ldjsKIH0KIApAQCAtMTUwMSwxOSArMTYyMywyNyBAQAogCWNoYXIgKmN1cnJlbnRfZXYgPSBidWY7CiAJY2hhciAqZW5kX2J1ZiA9IGJ1ZiArIGxlbjsKIAlzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpic3M7CisJaW50IGVyciA9IDA7CiAKIAlzcGluX2xvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKIAljZmc4MDIxMV9ic3NfZXhwaXJlKHJkZXYpOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShic3MsICZyZGV2LT5ic3NfbGlzdCwgbGlzdCkgewogCQlpZiAoYnVmICsgbGVuIC0gY3VycmVudF9ldiA8PSBJV19FVl9BRERSX0xFTikgewotCQkJc3Bpbl91bmxvY2tfYmgoJnJkZXYtPmJzc19sb2NrKTsKLQkJCXJldHVybiAtRTJCSUc7CisJCQllcnIgPSAtRTJCSUc7CisJCQlicmVhazsKIAkJfQogCQljdXJyZW50X2V2ID0gaWVlZTgwMjExX2JzcygmcmRldi0+d2lwaHksIGluZm8sIGJzcywKIAkJCQkJICAgY3VycmVudF9ldiwgZW5kX2J1Zik7CisJCWlmIChJU19FUlIoY3VycmVudF9ldikpIHsKKwkJCWVyciA9IFBUUl9FUlIoY3VycmVudF9ldik7CisJCQlicmVhazsKKwkJfQogCX0KIAlzcGluX3VubG9ja19iaCgmcmRldi0+YnNzX2xvY2spOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAlyZXR1cm4gY3VycmVudF9ldiAtIGJ1ZjsKIH0KIApAQCAtMTU0NSw1ICsxNjc1LDUgQEAKIAogCXJldHVybiByZXM7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChjZmc4MDIxMV93ZXh0X2dpd3NjYW4pOworRVhQT1JUX1dFWFRfSEFORExFUihjZmc4MDIxMV93ZXh0X2dpd3NjYW4pOwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvc21lLmMgYi9uZXQvd2lyZWxlc3Mvc21lLmMKaW5kZXggMGFiMzcxMS4uZDExNDU0ZiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3NtZS5jCisrKyBiL25ldC93aXJlbGVzcy9zbWUuYwpAQCAtNDIsNyArNDIsNyBAQAogCQlDRkc4MDIxMV9DT05OX0NPTk5FQ1RFRCwKIAl9IHN0YXRlOwogCXU4IGJzc2lkW0VUSF9BTEVOXSwgcHJldl9ic3NpZFtFVEhfQUxFTl07Ci0JdTggKmllOworCWNvbnN0IHU4ICppZTsKIAlzaXplX3QgaWVfbGVuOwogCWJvb2wgYXV0b19hdXRoLCBwcmV2X2Jzc2lkX3ZhbGlkOwogfTsKQEAgLTI1NywxOSArMjU3LDE1IEBACiB7CiAJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fcmRldih3ZGV2LT53aXBoeSk7CiAJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwotCXUxNiBjYXBhID0gV0xBTl9DQVBBQklMSVRZX0VTUzsKIAogCUFTU0VSVF9XREVWX0xPQ0sod2Rldik7CiAKLQlpZiAod2Rldi0+Y29ubi0+cGFyYW1zLnByaXZhY3kpCi0JCWNhcGEgfD0gV0xBTl9DQVBBQklMSVRZX1BSSVZBQ1k7Ci0KIAlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKHdkZXYtPndpcGh5LCB3ZGV2LT5jb25uLT5wYXJhbXMuY2hhbm5lbCwKIAkJCSAgICAgICB3ZGV2LT5jb25uLT5wYXJhbXMuYnNzaWQsCiAJCQkgICAgICAgd2Rldi0+Y29ubi0+cGFyYW1zLnNzaWQsCiAJCQkgICAgICAgd2Rldi0+Y29ubi0+cGFyYW1zLnNzaWRfbGVuLAotCQkJICAgICAgIFdMQU5fQ0FQQUJJTElUWV9FU1MgfCBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSwKLQkJCSAgICAgICBjYXBhKTsKKwkJCSAgICAgICBJRUVFODAyMTFfQlNTX1RZUEVfRVNTLAorCQkJICAgICAgIElFRUU4MDIxMV9QUklWQUNZKHdkZXYtPmNvbm4tPnBhcmFtcy5wcml2YWN5KSk7CiAJaWYgKCFic3MpCiAJCXJldHVybiBOVUxMOwogCkBAIC00MjcsNiArNDIzLDYyIEBACiAJc2NoZWR1bGVfd29yaygmcmRldi0+Y29ubl93b3JrKTsKIH0KIAorc3RhdGljIGludCBjZmc4MDIxMV9zbWVfZ2V0X2Nvbm5faWVzKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCisJCQkJICAgICBjb25zdCB1OCAqaWVzLCBzaXplX3QgaWVzX2xlbiwKKwkJCQkgICAgIGNvbnN0IHU4ICoqb3V0X2llcywgc2l6ZV90ICpvdXRfaWVzX2xlbikKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19yZGV2KHdkZXYtPndpcGh5KTsKKwl1OCAqYnVmOworCXNpemVfdCBvZmZzOworCisJaWYgKCFyZGV2LT53aXBoeS5leHRlbmRlZF9jYXBhYmlsaXRpZXNfbGVuIHx8CisJICAgIChpZXMgJiYgY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9FWFRfQ0FQQUJJTElUWSwgaWVzLCBpZXNfbGVuKSkpIHsKKwkJKm91dF9pZXMgPSBrbWVtZHVwKGllcywgaWVzX2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmICghKm91dF9pZXMpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJKm91dF9pZXNfbGVuID0gaWVzX2xlbjsKKwkJcmV0dXJuIDA7CisJfQorCisJYnVmID0ga21hbGxvYyhpZXNfbGVuICsgcmRldi0+d2lwaHkuZXh0ZW5kZWRfY2FwYWJpbGl0aWVzX2xlbiArIDIsCisJCSAgICAgIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChpZXNfbGVuKSB7CisJCXN0YXRpYyBjb25zdCB1OCBiZWZvcmVfZXh0Y2FwYVtdID0geworCQkJLyogbm90IGxpc3RpbmcgSUVzIGV4cGVjdGVkIHRvIGJlIGNyZWF0ZWQgYnkgZHJpdmVyICovCisJCQlXTEFOX0VJRF9SU04sCisJCQlXTEFOX0VJRF9RT1NfQ0FQQSwKKwkJCVdMQU5fRUlEX1JSTV9FTkFCTEVEX0NBUEFCSUxJVElFUywKKwkJCVdMQU5fRUlEX01PQklMSVRZX0RPTUFJTiwKKwkJCVdMQU5fRUlEX1NVUFBPUlRFRF9SRUdVTEFUT1JZX0NMQVNTRVMsCisJCQlXTEFOX0VJRF9CU1NfQ09FWF8yMDQwLAorCQl9OworCisJCW9mZnMgPSBpZWVlODAyMTFfaWVfc3BsaXQoaWVzLCBpZXNfbGVuLCBiZWZvcmVfZXh0Y2FwYSwKKwkJCQkJICBBUlJBWV9TSVpFKGJlZm9yZV9leHRjYXBhKSwgMCk7CisJCW1lbWNweShidWYsIGllcywgb2Zmcyk7CisJCS8qIGxlYXZlIGEgd2hvbGUgZm9yIGV4dGVuZGVkIGNhcGFiaWxpdGllcyBJRSAqLworCQltZW1jcHkoYnVmICsgb2ZmcyArIHJkZXYtPndpcGh5LmV4dGVuZGVkX2NhcGFiaWxpdGllc19sZW4gKyAyLAorCQkgICAgICAgaWVzICsgb2ZmcywgaWVzX2xlbiAtIG9mZnMpOworCX0gZWxzZSB7CisJCW9mZnMgPSAwOworCX0KKworCS8qIHBsYWNlIGV4dGVuZGVkIGNhcGFiaWxpdGllcyBJRSAod2l0aCBvbmx5IGRyaXZlciBjYXBhYmlsaXRpZXMpICovCisJYnVmW29mZnNdID0gV0xBTl9FSURfRVhUX0NBUEFCSUxJVFk7CisJYnVmW29mZnMgKyAxXSA9IHJkZXYtPndpcGh5LmV4dGVuZGVkX2NhcGFiaWxpdGllc19sZW47CisJbWVtY3B5KGJ1ZiArIG9mZnMgKyAyLAorCSAgICAgICByZGV2LT53aXBoeS5leHRlbmRlZF9jYXBhYmlsaXRpZXMsCisJICAgICAgIHJkZXYtPndpcGh5LmV4dGVuZGVkX2NhcGFiaWxpdGllc19sZW4pOworCisJKm91dF9pZXMgPSBidWY7CisJKm91dF9pZXNfbGVuID0gaWVzX2xlbiArIHJkZXYtPndpcGh5LmV4dGVuZGVkX2NhcGFiaWxpdGllc19sZW4gKyAyOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY2ZnODAyMTFfc21lX2Nvbm5lY3Qoc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKIAkJCQlzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgKmNvbm5lY3QsCiAJCQkJY29uc3QgdTggKnByZXZfYnNzaWQpCkBAIC00NTcsMTYgKzUwOSwxNCBAQAogCQltZW1jcHkod2Rldi0+Y29ubi0+YnNzaWQsIGNvbm5lY3QtPmJzc2lkLCBFVEhfQUxFTik7CiAJfQogCi0JaWYgKGNvbm5lY3QtPmllKSB7Ci0JCXdkZXYtPmNvbm4tPmllID0ga21lbWR1cChjb25uZWN0LT5pZSwgY29ubmVjdC0+aWVfbGVuLAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJd2Rldi0+Y29ubi0+cGFyYW1zLmllID0gd2Rldi0+Y29ubi0+aWU7Ci0JCWlmICghd2Rldi0+Y29ubi0+aWUpIHsKLQkJCWtmcmVlKHdkZXYtPmNvbm4pOwotCQkJd2Rldi0+Y29ubiA9IE5VTEw7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQorCWlmIChjZmc4MDIxMV9zbWVfZ2V0X2Nvbm5faWVzKHdkZXYsIGNvbm5lY3QtPmllLCBjb25uZWN0LT5pZV9sZW4sCisJCQkJICAgICAgJndkZXYtPmNvbm4tPmllLAorCQkJCSAgICAgICZ3ZGV2LT5jb25uLT5wYXJhbXMuaWVfbGVuKSkgeworCQlrZnJlZSh3ZGV2LT5jb25uKTsKKwkJd2Rldi0+Y29ubiA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOwogCX0KKwl3ZGV2LT5jb25uLT5wYXJhbXMuaWUgPSB3ZGV2LT5jb25uLT5pZTsKIAogCWlmIChjb25uZWN0LT5hdXRoX3R5cGUgPT0gTkw4MDIxMV9BVVRIVFlQRV9BVVRPTUFUSUMpIHsKIAkJd2Rldi0+Y29ubi0+YXV0b19hdXRoID0gdHJ1ZTsKQEAgLTYzNyw4ICs2ODcsOCBAQAogCQlXQVJOX09OX09OQ0UoIXdpcGh5X3RvX3JkZXYod2Rldi0+d2lwaHkpLT5vcHMtPmNvbm5lY3QpOwogCQlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKHdkZXYtPndpcGh5LCBOVUxMLCBic3NpZCwKIAkJCQkgICAgICAgd2Rldi0+c3NpZCwgd2Rldi0+c3NpZF9sZW4sCi0JCQkJICAgICAgIFdMQU5fQ0FQQUJJTElUWV9FU1MsCi0JCQkJICAgICAgIFdMQU5fQ0FQQUJJTElUWV9FU1MpOworCQkJCSAgICAgICBJRUVFODAyMTFfQlNTX1RZUEVfRVNTLAorCQkJCSAgICAgICBJRUVFODAyMTFfUFJJVkFDWV9BTlkpOwogCQlpZiAoYnNzKQogCQkJY2ZnODAyMTFfaG9sZF9ic3MoYnNzX2Zyb21fcHViKGJzcykpOwogCX0KQEAgLTc5NSw4ICs4NDUsOCBAQAogCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKIAogCWJzcyA9IGNmZzgwMjExX2dldF9ic3Mod2Rldi0+d2lwaHksIGNoYW5uZWwsIGJzc2lkLCB3ZGV2LT5zc2lkLAotCQkJICAgICAgIHdkZXYtPnNzaWRfbGVuLCBXTEFOX0NBUEFCSUxJVFlfRVNTLAotCQkJICAgICAgIFdMQU5fQ0FQQUJJTElUWV9FU1MpOworCQkJICAgICAgIHdkZXYtPnNzaWRfbGVuLAorCQkJICAgICAgIElFRUU4MDIxMV9CU1NfVFlQRV9FU1MsIElFRUU4MDIxMV9QUklWQUNZX0FOWSk7CiAJaWYgKFdBUk5fT04oIWJzcykpCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3RyYWNlLmggYi9uZXQvd2lyZWxlc3MvdHJhY2UuaAppbmRleCBiMTdiMzY5Li5hZjM2MTdjIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvdHJhY2UuaAorKysgYi9uZXQvd2lyZWxlc3MvdHJhY2UuaApAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogI2luY2x1ZGUgImNvcmUuaCIKIApAQCAtMTUsNyArMTYsNyBAQAogCWlmIChnaXZlbl9tYWMpCQkJCQkJICAgICBcCiAJCW1lbWNweShfX2VudHJ5LT5lbnRyeV9tYWMsIGdpdmVuX21hYywgRVRIX0FMRU4pOyAgICAgXAogCWVsc2UJCQkJCQkJICAgICBcCi0JCW1lbXNldChfX2VudHJ5LT5lbnRyeV9tYWMsIDAsIEVUSF9BTEVOKTsJICAgICBcCisJCWV0aF96ZXJvX2FkZHIoX19lbnRyeS0+ZW50cnlfbWFjKTsJCSAgICAgXAogCX0gd2hpbGUgKDApCiAjZGVmaW5lIE1BQ19QUl9GTVQgIiVwTSIKICNkZWZpbmUgTUFDX1BSX0FSRyhlbnRyeV9tYWMpIChfX2VudHJ5LT5lbnRyeV9tYWMpCkBAIC02MjcsNiArNjI4LDcgQEAKIAkJX19maWVsZCh1OCwgcGxpbmtfc3RhdGUpCiAJCV9fZmllbGQodTgsIHVhcHNkX3F1ZXVlcykKIAkJX19hcnJheSh1OCwgaHRfY2FwYSwgKGludClzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKQorCQlfX2FycmF5KGNoYXIsIHZsYW4sIElGTkFNU0laKQogCSksCiAJVFBfZmFzdF9hc3NpZ24oCiAJCVdJUEhZX0FTU0lHTjsKQEAgLTY0NCwxNiArNjQ2LDE5IEBACiAJCWlmIChwYXJhbXMtPmh0X2NhcGEpCiAJCQltZW1jcHkoX19lbnRyeS0+aHRfY2FwYSwgcGFyYW1zLT5odF9jYXBhLAogCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOworCQltZW1zZXQoX19lbnRyeS0+dmxhbiwgMCwgc2l6ZW9mKF9fZW50cnktPnZsYW4pKTsKKwkJaWYgKHBhcmFtcy0+dmxhbikKKwkJCW1lbWNweShfX2VudHJ5LT52bGFuLCBwYXJhbXMtPnZsYW4tPm5hbWUsIElGTkFNU0laKTsKIAkpLAogCVRQX3ByaW50ayhXSVBIWV9QUl9GTVQgIiwgIiBORVRERVZfUFJfRk1UICIsIHN0YXRpb24gbWFjOiAiIE1BQ19QUl9GTVQKIAkJICAiLCBzdGF0aW9uIGZsYWdzIG1hc2s6ICV1LCBzdGF0aW9uIGZsYWdzIHNldDogJXUsICIKIAkJICAic3RhdGlvbiBtb2RpZnkgbWFzazogJXUsIGxpc3RlbiBpbnRlcnZhbDogJWQsIGFpZDogJXUsICIKLQkJICAicGxpbmsgYWN0aW9uOiAldSwgcGxpbmsgc3RhdGU6ICV1LCB1YXBzZCBxdWV1ZXM6ICV1IiwKKwkJICAicGxpbmsgYWN0aW9uOiAldSwgcGxpbmsgc3RhdGU6ICV1LCB1YXBzZCBxdWV1ZXM6ICV1LCB2bGFuOiVzIiwKIAkJICBXSVBIWV9QUl9BUkcsIE5FVERFVl9QUl9BUkcsIE1BQ19QUl9BUkcoc3RhX21hYyksCiAJCSAgX19lbnRyeS0+c3RhX2ZsYWdzX21hc2ssIF9fZW50cnktPnN0YV9mbGFnc19zZXQsCiAJCSAgX19lbnRyeS0+c3RhX21vZGlmeV9tYXNrLCBfX2VudHJ5LT5saXN0ZW5faW50ZXJ2YWwsCiAJCSAgX19lbnRyeS0+YWlkLCBfX2VudHJ5LT5wbGlua19hY3Rpb24sIF9fZW50cnktPnBsaW5rX3N0YXRlLAotCQkgIF9fZW50cnktPnVhcHNkX3F1ZXVlcykKKwkJICBfX2VudHJ5LT51YXBzZF9xdWV1ZXMsIF9fZW50cnktPnZsYW4pCiApOwogCiBERUZJTkVfRVZFTlQoc3RhdGlvbl9hZGRfY2hhbmdlLCByZGV2X2FkZF9zdGF0aW9uLApAQCAtMTA3Nyw3ICsxMDgyLDcgQEAKIAkJaWYgKHJlcS0+YnNzKQogCQkJTUFDX0FTU0lHTihic3NpZCwgcmVxLT5ic3MtPmJzc2lkKTsKIAkJZWxzZQotCQkJbWVtc2V0KF9fZW50cnktPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJCQlldGhfemVyb19hZGRyKF9fZW50cnktPmJzc2lkKTsKIAkJX19lbnRyeS0+YXV0aF90eXBlID0gcmVxLT5hdXRoX3R5cGU7CiAJKSwKIAlUUF9wcmludGsoV0lQSFlfUFJfRk1UICIsICIgTkVUREVWX1BSX0ZNVCAiLCBhdXRoIHR5cGU6ICVkLCBic3NpZDogIiBNQUNfUFJfRk1ULApAQCAtMTEwMyw3ICsxMTA4LDcgQEAKIAkJaWYgKHJlcS0+YnNzKQogCQkJTUFDX0FTU0lHTihic3NpZCwgcmVxLT5ic3MtPmJzc2lkKTsKIAkJZWxzZQotCQkJbWVtc2V0KF9fZW50cnktPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJCQlldGhfemVyb19hZGRyKF9fZW50cnktPmJzc2lkKTsKIAkJTUFDX0FTU0lHTihwcmV2X2Jzc2lkLCByZXEtPnByZXZfYnNzaWQpOwogCQlfX2VudHJ5LT51c2VfbWZwID0gcmVxLT51c2VfbWZwOwogCQlfX2VudHJ5LT5mbGFncyA9IHJlcS0+ZmxhZ3M7CkBAIC0xMTUzLDcgKzExNTgsNyBAQAogCQlpZiAocmVxLT5ic3MpCiAJCQlNQUNfQVNTSUdOKGJzc2lkLCByZXEtPmJzcy0+YnNzaWQpOwogCQllbHNlCi0JCQltZW1zZXQoX19lbnRyeS0+YnNzaWQsIDAsIEVUSF9BTEVOKTsKKwkJCWV0aF96ZXJvX2FkZHIoX19lbnRyeS0+YnNzaWQpOwogCQlfX2VudHJ5LT5yZWFzb25fY29kZSA9IHJlcS0+cmVhc29uX2NvZGU7CiAJCV9fZW50cnktPmxvY2FsX3N0YXRlX2NoYW5nZSA9IHJlcS0+bG9jYWxfc3RhdGVfY2hhbmdlOwogCSksCkBAIC0yNjM2LDI4ICsyNjQxLDMwIEBACiBUUkFDRV9FVkVOVChjZmc4MDIxMV9nZXRfYnNzLAogCVRQX1BST1RPKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKIAkJIGNvbnN0IHU4ICpic3NpZCwgY29uc3QgdTggKnNzaWQsIHNpemVfdCBzc2lkX2xlbiwKLQkJIHUxNiBjYXBhX21hc2ssIHUxNiBjYXBhX3ZhbCksCi0JVFBfQVJHUyh3aXBoeSwgY2hhbm5lbCwgYnNzaWQsIHNzaWQsIHNzaWRfbGVuLCBjYXBhX21hc2ssIGNhcGFfdmFsKSwKKwkJIGVudW0gaWVlZTgwMjExX2Jzc190eXBlIGJzc190eXBlLAorCQkgZW51bSBpZWVlODAyMTFfcHJpdmFjeSBwcml2YWN5KSwKKwlUUF9BUkdTKHdpcGh5LCBjaGFubmVsLCBic3NpZCwgc3NpZCwgc3NpZF9sZW4sIGJzc190eXBlLCBwcml2YWN5KSwKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlXSVBIWV9FTlRSWQogCQlDSEFOX0VOVFJZCiAJCU1BQ19FTlRSWShic3NpZCkKIAkJX19keW5hbWljX2FycmF5KHU4LCBzc2lkLCBzc2lkX2xlbikKLQkJX19maWVsZCh1MTYsIGNhcGFfbWFzaykKLQkJX19maWVsZCh1MTYsIGNhcGFfdmFsKQorCQlfX2ZpZWxkKGVudW0gaWVlZTgwMjExX2Jzc190eXBlLCBic3NfdHlwZSkKKwkJX19maWVsZChlbnVtIGllZWU4MDIxMV9wcml2YWN5LCBwcml2YWN5KQogCSksCiAJVFBfZmFzdF9hc3NpZ24oCiAJCVdJUEhZX0FTU0lHTjsKIAkJQ0hBTl9BU1NJR04oY2hhbm5lbCk7CiAJCU1BQ19BU1NJR04oYnNzaWQsIGJzc2lkKTsKIAkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkoc3NpZCksIHNzaWQsIHNzaWRfbGVuKTsKLQkJX19lbnRyeS0+Y2FwYV9tYXNrID0gY2FwYV9tYXNrOwotCQlfX2VudHJ5LT5jYXBhX3ZhbCA9IGNhcGFfdmFsOworCQlfX2VudHJ5LT5ic3NfdHlwZSA9IGJzc190eXBlOworCQlfX2VudHJ5LT5wcml2YWN5ID0gcHJpdmFjeTsKIAkpLAotCVRQX3ByaW50ayhXSVBIWV9QUl9GTVQgIiwgIiBDSEFOX1BSX0ZNVCAiLCAiIE1BQ19QUl9GTVQgIiwgYnVmOiAlIy4yeCwgIgotCQkgICJjYXBhX21hc2s6ICVkLCBjYXBhX3ZhbDogJXUiLCBXSVBIWV9QUl9BUkcsIENIQU5fUFJfQVJHLAotCQkgIE1BQ19QUl9BUkcoYnNzaWQpLCAoKHU4ICopX19nZXRfZHluYW1pY19hcnJheShzc2lkKSlbMF0sCi0JCSAgX19lbnRyeS0+Y2FwYV9tYXNrLCBfX2VudHJ5LT5jYXBhX3ZhbCkKKwlUUF9wcmludGsoV0lQSFlfUFJfRk1UICIsICIgQ0hBTl9QUl9GTVQgIiwgIiBNQUNfUFJfRk1UCisJCSAgIiwgYnVmOiAlIy4yeCwgYnNzX3R5cGU6ICVkLCBwcml2YWN5OiAlZCIsCisJCSAgV0lQSFlfUFJfQVJHLCBDSEFOX1BSX0FSRywgTUFDX1BSX0FSRyhic3NpZCksCisJCSAgKCh1OCAqKV9fZ2V0X2R5bmFtaWNfYXJyYXkoc3NpZCkpWzBdLCBfX2VudHJ5LT5ic3NfdHlwZSwKKwkJICBfX2VudHJ5LT5wcml2YWN5KQogKTsKIAogVFJBQ0VfRVZFTlQoY2ZnODAyMTFfaW5mb3JtX2Jzc193aWR0aF9mcmFtZSwKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy91dGlsLmMgYi9uZXQvd2lyZWxlc3MvdXRpbC5jCmluZGV4IDY5MDNkYmQuLjcwMDUxYWIgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy91dGlsLmMKKysrIGIvbmV0L3dpcmVsZXNzL3V0aWwuYwpAQCAtMTI5MCwxMiArMTI5MCw1NCBAQAogfQogRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9nZXRfcDJwX2F0dHIpOwogCitzdGF0aWMgYm9vbCBpZWVlODAyMTFfaWRfaW5fbGlzdChjb25zdCB1OCAqaWRzLCBpbnQgbl9pZHMsIHU4IGlkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5faWRzOyBpKyspCisJCWlmIChpZHNbaV0gPT0gaWQpCisJCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3NpemVfdCBpZWVlODAyMTFfaWVfc3BsaXRfcmljKGNvbnN0IHU4ICppZXMsIHNpemVfdCBpZWxlbiwKKwkJCSAgICAgIGNvbnN0IHU4ICppZHMsIGludCBuX2lkcywKKwkJCSAgICAgIGNvbnN0IHU4ICphZnRlcl9yaWMsIGludCBuX2FmdGVyX3JpYywKKwkJCSAgICAgIHNpemVfdCBvZmZzZXQpCit7CisJc2l6ZV90IHBvcyA9IG9mZnNldDsKKworCXdoaWxlIChwb3MgPCBpZWxlbiAmJiBpZWVlODAyMTFfaWRfaW5fbGlzdChpZHMsIG5faWRzLCBpZXNbcG9zXSkpIHsKKwkJaWYgKGllc1twb3NdID09IFdMQU5fRUlEX1JJQ19EQVRBICYmIG5fYWZ0ZXJfcmljKSB7CisJCQlwb3MgKz0gMiArIGllc1twb3MgKyAxXTsKKworCQkJd2hpbGUgKHBvcyA8IGllbGVuICYmCisJCQkgICAgICAgIWllZWU4MDIxMV9pZF9pbl9saXN0KGFmdGVyX3JpYywgbl9hZnRlcl9yaWMsCisJCQkJCQkgICAgIGllc1twb3NdKSkKKwkJCQlwb3MgKz0gMiArIGllc1twb3MgKyAxXTsKKwkJfSBlbHNlIHsKKwkJCXBvcyArPSAyICsgaWVzW3BvcyArIDFdOworCQl9CisJfQorCisJcmV0dXJuIHBvczsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2llX3NwbGl0X3JpYyk7CisKK3NpemVfdCBpZWVlODAyMTFfaWVfc3BsaXQoY29uc3QgdTggKmllcywgc2l6ZV90IGllbGVuLAorCQkJICBjb25zdCB1OCAqaWRzLCBpbnQgbl9pZHMsIHNpemVfdCBvZmZzZXQpCit7CisJcmV0dXJuIGllZWU4MDIxMV9pZV9zcGxpdF9yaWMoaWVzLCBpZWxlbiwgaWRzLCBuX2lkcywgTlVMTCwgMCwgb2Zmc2V0KTsKK30KK0VYUE9SVF9TWU1CT0woaWVlZTgwMjExX2llX3NwbGl0KTsKKwogYm9vbCBpZWVlODAyMTFfb3BlcmF0aW5nX2NsYXNzX3RvX2JhbmQodTggb3BlcmF0aW5nX2NsYXNzLAogCQkJCSAgICAgICBlbnVtIGllZWU4MDIxMV9iYW5kICpiYW5kKQogewogCXN3aXRjaCAob3BlcmF0aW5nX2NsYXNzKSB7CiAJY2FzZSAxMTI6CiAJY2FzZSAxMTUgLi4uIDEyNzoKKwljYXNlIDEyOCAuLi4gMTMwOgogCQkqYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFo7CiAJCXJldHVybiB0cnVlOwogCWNhc2UgODE6CkBAIC0xMzEzLDYgKzEzNTUsMTM1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9vcGVyYXRpbmdfY2xhc3NfdG9fYmFuZCk7CiAKK2Jvb2wgaWVlZTgwMjExX2NoYW5kZWZfdG9fb3BlcmF0aW5nX2NsYXNzKHN0cnVjdCBjZmc4MDIxMV9jaGFuX2RlZiAqY2hhbmRlZiwKKwkJCQkJICB1OCAqb3BfY2xhc3MpCit7CisJdTggdmh0X29wY2xhc3M7CisJdTE2IGZyZXEgPSBjaGFuZGVmLT5jZW50ZXJfZnJlcTE7CisKKwlpZiAoZnJlcSA+PSAyNDEyICYmIGZyZXEgPD0gMjQ3MikgeworCQlpZiAoY2hhbmRlZi0+d2lkdGggPiBOTDgwMjExX0NIQU5fV0lEVEhfNDApCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJLyogMi40MDcgR0h6LCBjaGFubmVscyAxLi4xMyAqLworCQlpZiAoY2hhbmRlZi0+d2lkdGggPT0gTkw4MDIxMV9DSEFOX1dJRFRIXzQwKSB7CisJCQlpZiAoZnJlcSA+IGNoYW5kZWYtPmNoYW4tPmNlbnRlcl9mcmVxKQorCQkJCSpvcF9jbGFzcyA9IDgzOyAvKiBIVDQwKyAqLworCQkJZWxzZQorCQkJCSpvcF9jbGFzcyA9IDg0OyAvKiBIVDQwLSAqLworCQl9IGVsc2UgeworCQkJKm9wX2NsYXNzID0gODE7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlpZiAoZnJlcSA9PSAyNDg0KSB7CisJCWlmIChjaGFuZGVmLT53aWR0aCA+IE5MODAyMTFfQ0hBTl9XSURUSF80MCkKKwkJCXJldHVybiBmYWxzZTsKKworCQkqb3BfY2xhc3MgPSA4MjsgLyogY2hhbm5lbCAxNCAqLworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlzd2l0Y2ggKGNoYW5kZWYtPndpZHRoKSB7CisJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfODA6CisJCXZodF9vcGNsYXNzID0gMTI4OworCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF8xNjA6CisJCXZodF9vcGNsYXNzID0gMTI5OworCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ0hBTl9XSURUSF84MFA4MDoKKwkJdmh0X29wY2xhc3MgPSAxMzA7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzEwOgorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzU6CisJCXJldHVybiBmYWxzZTsgLyogdW5zdXBwb3J0ZWQgZm9yIG5vdyAqLworCWRlZmF1bHQ6CisJCXZodF9vcGNsYXNzID0gMDsKKwkJYnJlYWs7CisJfQorCisJLyogNSBHSHosIGNoYW5uZWxzIDM2Li40OCAqLworCWlmIChmcmVxID49IDUxODAgJiYgZnJlcSA8PSA1MjQwKSB7CisJCWlmICh2aHRfb3BjbGFzcykgeworCQkJKm9wX2NsYXNzID0gdmh0X29wY2xhc3M7CisJCX0gZWxzZSBpZiAoY2hhbmRlZi0+d2lkdGggPT0gTkw4MDIxMV9DSEFOX1dJRFRIXzQwKSB7CisJCQlpZiAoZnJlcSA+IGNoYW5kZWYtPmNoYW4tPmNlbnRlcl9mcmVxKQorCQkJCSpvcF9jbGFzcyA9IDExNjsKKwkJCWVsc2UKKwkJCQkqb3BfY2xhc3MgPSAxMTc7CisJCX0gZWxzZSB7CisJCQkqb3BfY2xhc3MgPSAxMTU7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiA1IEdIeiwgY2hhbm5lbHMgNTIuLjY0ICovCisJaWYgKGZyZXEgPj0gNTI2MCAmJiBmcmVxIDw9IDUzMjApIHsKKwkJaWYgKHZodF9vcGNsYXNzKSB7CisJCQkqb3BfY2xhc3MgPSB2aHRfb3BjbGFzczsKKwkJfSBlbHNlIGlmIChjaGFuZGVmLT53aWR0aCA9PSBOTDgwMjExX0NIQU5fV0lEVEhfNDApIHsKKwkJCWlmIChmcmVxID4gY2hhbmRlZi0+Y2hhbi0+Y2VudGVyX2ZyZXEpCisJCQkJKm9wX2NsYXNzID0gMTE5OworCQkJZWxzZQorCQkJCSpvcF9jbGFzcyA9IDEyMDsKKwkJfSBlbHNlIHsKKwkJCSpvcF9jbGFzcyA9IDExODsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKworCS8qIDUgR0h6LCBjaGFubmVscyAxMDAuLjE0NCAqLworCWlmIChmcmVxID49IDU1MDAgJiYgZnJlcSA8PSA1NzIwKSB7CisJCWlmICh2aHRfb3BjbGFzcykgeworCQkJKm9wX2NsYXNzID0gdmh0X29wY2xhc3M7CisJCX0gZWxzZSBpZiAoY2hhbmRlZi0+d2lkdGggPT0gTkw4MDIxMV9DSEFOX1dJRFRIXzQwKSB7CisJCQlpZiAoZnJlcSA+IGNoYW5kZWYtPmNoYW4tPmNlbnRlcl9mcmVxKQorCQkJCSpvcF9jbGFzcyA9IDEyMjsKKwkJCWVsc2UKKwkJCQkqb3BfY2xhc3MgPSAxMjM7CisJCX0gZWxzZSB7CisJCQkqb3BfY2xhc3MgPSAxMjE7CisJCX0KKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiA1IEdIeiwgY2hhbm5lbHMgMTQ5Li4xNjkgKi8KKwlpZiAoZnJlcSA+PSA1NzQ1ICYmIGZyZXEgPD0gNTg0NSkgeworCQlpZiAodmh0X29wY2xhc3MpIHsKKwkJCSpvcF9jbGFzcyA9IHZodF9vcGNsYXNzOworCQl9IGVsc2UgaWYgKGNoYW5kZWYtPndpZHRoID09IE5MODAyMTFfQ0hBTl9XSURUSF80MCkgeworCQkJaWYgKGZyZXEgPiBjaGFuZGVmLT5jaGFuLT5jZW50ZXJfZnJlcSkKKwkJCQkqb3BfY2xhc3MgPSAxMjY7CisJCQllbHNlCisJCQkJKm9wX2NsYXNzID0gMTI3OworCQl9IGVsc2UgaWYgKGZyZXEgPD0gNTgwNSkgeworCQkJKm9wX2NsYXNzID0gMTI0OworCQl9IGVsc2UgeworCQkJKm9wX2NsYXNzID0gMTI1OworCQl9CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogNTYuMTYgR0h6LCBjaGFubmVsIDEuLjQgKi8KKwlpZiAoZnJlcSA+PSA1NjE2MCArIDIxNjAgKiAxICYmIGZyZXEgPD0gNTYxNjAgKyAyMTYwICogNCkgeworCQlpZiAoY2hhbmRlZi0+d2lkdGggPj0gTkw4MDIxMV9DSEFOX1dJRFRIXzQwKQorCQkJcmV0dXJuIGZhbHNlOworCisJCSpvcF9jbGFzcyA9IDE4MDsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKwlyZXR1cm4gZmFsc2U7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9jaGFuZGVmX3RvX29wZXJhdGluZ19jbGFzcyk7CisKIGludCBjZmc4MDIxMV92YWxpZGF0ZV9iZWFjb25faW50KHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCQkgdTMyIGJlYWNvbl9pbnQpCiB7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3Mvd2V4dC1jb21wYXQuYyBiL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jCmluZGV4IDViMjRkMzkuLmZmZjFiZWYgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jCisrKyBiL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jCkBAIC02Myw3ICs2Myw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGNmZzgwMjExX3dleHRfZ2l3bmFtZSk7CitFWFBPUlRfV0VYVF9IQU5ETEVSKGNmZzgwMjExX3dleHRfZ2l3bmFtZSk7CiAKIGludCBjZmc4MDIxMV93ZXh0X3Npd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgdTMyICptb2RlLCBjaGFyICpleHRyYSkKQEAgLTk5LDcgKzk5LDcgQEAKIAogCXJldHVybiBjZmc4MDIxMV9jaGFuZ2VfaWZhY2UocmRldiwgZGV2LCB0eXBlLCBOVUxMLCAmdmlmcGFyYW1zKTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGNmZzgwMjExX3dleHRfc2l3bW9kZSk7CitFWFBPUlRfV0VYVF9IQU5ETEVSKGNmZzgwMjExX3dleHRfc2l3bW9kZSk7CiAKIGludCBjZmc4MDIxMV93ZXh0X2dpd21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgdTMyICptb2RlLCBjaGFyICpleHRyYSkKQEAgLTEzNCw3ICsxMzQsNyBAQAogCX0KIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGNmZzgwMjExX3dleHRfZ2l3bW9kZSk7CitFWFBPUlRfV0VYVF9IQU5ETEVSKGNmZzgwMjExX3dleHRfZ2l3bW9kZSk7CiAKIAogaW50IGNmZzgwMjExX3dleHRfZ2l3cmFuZ2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTI0OCw3ICsyNDgsNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChjZmc4MDIxMV93ZXh0X2dpd3JhbmdlKTsKK0VYUE9SVF9XRVhUX0hBTkRMRVIoY2ZnODAyMTFfd2V4dF9naXdyYW5nZSk7CiAKIAogLyoqCkBAIC0zMDMsNyArMzAzLDcgQEAKIAogCXJldHVybiBlcnI7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChjZmc4MDIxMV93ZXh0X3Npd3J0cyk7CitFWFBPUlRfV0VYVF9IQU5ETEVSKGNmZzgwMjExX3dleHRfc2l3cnRzKTsKIAogaW50IGNmZzgwMjExX3dleHRfZ2l3cnRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKQEAgLTMxNyw3ICszMTcsNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChjZmc4MDIxMV93ZXh0X2dpd3J0cyk7CitFWFBPUlRfV0VYVF9IQU5ETEVSKGNmZzgwMjExX3dleHRfZ2l3cnRzKTsKIAogaW50IGNmZzgwMjExX3dleHRfc2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLApAQCAtMzQzLDcgKzM0Myw3IEBACiAKIAlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoY2ZnODAyMTFfd2V4dF9zaXdmcmFnKTsKK0VYUE9SVF9XRVhUX0hBTkRMRVIoY2ZnODAyMTFfd2V4dF9zaXdmcmFnKTsKIAogaW50IGNmZzgwMjExX3dleHRfZ2l3ZnJhZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICBzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvICppbmZvLApAQCAtMzU3LDcgKzM1Nyw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGNmZzgwMjExX3dleHRfZ2l3ZnJhZyk7CitFWFBPUlRfV0VYVF9IQU5ETEVSKGNmZzgwMjExX3dleHRfZ2l3ZnJhZyk7CiAKIHN0YXRpYyBpbnQgY2ZnODAyMTFfd2V4dF9zaXdyZXRyeShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKQEAgLTQyNyw3ICs0MjcsNyBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChjZmc4MDIxMV93ZXh0X2dpd3JldHJ5KTsKK0VYUE9SVF9XRVhUX0hBTkRMRVIoY2ZnODAyMTFfd2V4dF9naXdyZXRyeSk7CiAKIHN0YXRpYyBpbnQgX19jZmc4MDIxMV9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCiAJCQkJICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBib29sIHBhaXJ3aXNlLApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmggYi9uZXQvd2lyZWxlc3Mvd2V4dC1jb21wYXQuaAppbmRleCBlYmNhY2NhLi45NGM3NDA1IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvd2V4dC1jb21wYXQuaAorKysgYi9uZXQvd2lyZWxlc3Mvd2V4dC1jb21wYXQuaApAQCAtNCw2ICs0LDEyIEBACiAjaW5jbHVkZSA8bmV0L2l3X2hhbmRsZXIuaD4KICNpbmNsdWRlIDxsaW51eC93aXJlbGVzcy5oPgogCisjaWZkZWYgQ09ORklHX0NGRzgwMjExX1dFWFRfRVhQT1JUCisjZGVmaW5lIEVYUE9SVF9XRVhUX0hBTkRMRVIoaCkgRVhQT1JUX1NZTUJPTF9HUEwoaCkKKyNlbHNlCisjZGVmaW5lIEVYUE9SVF9XRVhUX0hBTkRMRVIoaCkKKyNlbmRpZiAvKiBDT05GSUdfQ0ZHODAyMTFfV0VYVF9FWFBPUlQgKi8KKwogaW50IGNmZzgwMjExX2lic3Nfd2V4dF9zaXdmcmVxKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICAgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKIAkJCSAgICAgICBzdHJ1Y3QgaXdfZnJlcSAqZnJlcSwgY2hhciAqZXh0cmEpOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3dleHQtc21lLmMgYi9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYwppbmRleCAzNjg2MTFjLi5hNGU4YWYzIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYworKysgYi9uZXQvd2lyZWxlc3Mvd2V4dC1zbWUuYwpAQCAtMzIyLDcgKzMyMiw3IEBACiAJaWYgKHdkZXYtPmN1cnJlbnRfYnNzKQogCQltZW1jcHkoYXBfYWRkci0+c2FfZGF0YSwgd2Rldi0+Y3VycmVudF9ic3MtPnB1Yi5ic3NpZCwgRVRIX0FMRU4pOwogCWVsc2UKLQkJbWVtc2V0KGFwX2FkZHItPnNhX2RhdGEsIDAsIEVUSF9BTEVOKTsKKwkJZXRoX3plcm9fYWRkcihhcF9hZGRyLT5zYV9kYXRhKTsKIAl3ZGV2X3VubG9jayh3ZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L3gyNS9hZl94MjUuYyBiL25ldC94MjUvYWZfeDI1LmMKaW5kZXggZDkxNDliNi4uYzNhYjIzMCAxMDA2NDQKLS0tIGEvbmV0L3gyNS9hZl94MjUuYworKysgYi9uZXQveDI1L2FmX3gyNS5jCkBAIC0xMDc3LDggKzEwNzcsNyBAQAogCWdvdG8gb3V0OwogfQogCi1zdGF0aWMgaW50IHgyNV9zZW5kbXNnKHN0cnVjdCBraW9jYiAqaW9jYiwgc3RydWN0IHNvY2tldCAqc29jaywKLQkJICAgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgeDI1X3NlbmRtc2coc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCXN0cnVjdCB4MjVfc29jayAqeDI1ID0geDI1X3NrKHNrKTsKQEAgLTEyNTIsOCArMTI1MSw3IEBACiB9CiAKIAotc3RhdGljIGludCB4MjVfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCi0JCSAgICAgICBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLAorc3RhdGljIGludCB4MjVfcmVjdm1zZyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBzaXplLAogCQkgICAgICAgaW50IGZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwpkaWZmIC0tZ2l0IGEvbmV0L3hmcm0veGZybV9pbnB1dC5jIGIvbmV0L3hmcm0veGZybV9pbnB1dC5jCmluZGV4IDg1ZDFkNDcuLjUyNmM0ZmUgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1faW5wdXQuYworKysgYi9uZXQveGZybS94ZnJtX2lucHV0LmMKQEAgLTIzOCwxMSArMjM4LDYgQEAKIAogCQlza2ItPnNwLT54dmVjW3NrYi0+c3AtPmxlbisrXSA9IHg7CiAKLQkJaWYgKHhmcm1fdHVubmVsX2NoZWNrKHNrYiwgeCwgZmFtaWx5KSkgewotCQkJWEZSTV9JTkNfU1RBVFMobmV0LCBMSU5VWF9NSUJfWEZSTUlOU1RBVEVNT0RFRVJST1IpOwotCQkJZ290byBkcm9wOwotCQl9Ci0KIAkJc3Bpbl9sb2NrKCZ4LT5sb2NrKTsKIAkJaWYgKHVubGlrZWx5KHgtPmttLnN0YXRlID09IFhGUk1fU1RBVEVfQUNRKSkgewogCQkJWEZSTV9JTkNfU1RBVFMobmV0LCBMSU5VWF9NSUJfWEZSTUFDUVVJUkVFUlJPUik7CkBAIC0yNzEsNiArMjY2LDExIEBACiAKIAkJc3Bpbl91bmxvY2soJngtPmxvY2spOwogCisJCWlmICh4ZnJtX3R1bm5lbF9jaGVjayhza2IsIHgsIGZhbWlseSkpIHsKKwkJCVhGUk1fSU5DX1NUQVRTKG5ldCwgTElOVVhfTUlCX1hGUk1JTlNUQVRFTU9ERUVSUk9SKTsKKwkJCWdvdG8gZHJvcDsKKwkJfQorCiAJCXNlcV9oaSA9IGh0b25sKHhmcm1fcmVwbGF5X3NlcWhpKHgsIHNlcSkpOwogCiAJCVhGUk1fU0tCX0NCKHNrYiktPnNlcS5pbnB1dC5sb3cgPSBzZXE7CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX291dHB1dC5jIGIvbmV0L3hmcm0veGZybV9vdXRwdXQuYwppbmRleCA3YzUzMjg1Li5mYmNlZGJlIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX291dHB1dC5jCisrKyBiL25ldC94ZnJtL3hmcm1fb3V0cHV0LmMKQEAgLTE5LDcgKzE5LDcgQEAKICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAjaW5jbHVkZSA8bmV0L3hmcm0uaD4KIAotc3RhdGljIGludCB4ZnJtX291dHB1dDIoc3RydWN0IHNrX2J1ZmYgKnNrYik7CitzdGF0aWMgaW50IHhmcm1fb3V0cHV0MihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpOwogCiBzdGF0aWMgaW50IHhmcm1fc2tiX2NoZWNrX3NwYWNlKHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0xMzAsNyArMTMwLDcgQEAKIAkJCXJldHVybiBkc3Rfb3V0cHV0KHNrYik7CiAKIAkJZXJyID0gbmZfaG9vayhza2JfZHN0KHNrYiktPm9wcy0+ZmFtaWx5LAotCQkJICAgICAgTkZfSU5FVF9QT1NUX1JPVVRJTkcsIHNrYiwKKwkJCSAgICAgIE5GX0lORVRfUE9TVF9ST1VUSU5HLCBza2ItPnNrLCBza2IsCiAJCQkgICAgICBOVUxMLCBza2JfZHN0KHNrYiktPmRldiwgeGZybV9vdXRwdXQyKTsKIAkJaWYgKHVubGlrZWx5KGVyciAhPSAxKSkKIAkJCWdvdG8gb3V0OwpAQCAtMTQ0LDEyICsxNDQsMTIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHhmcm1fb3V0cHV0X3Jlc3VtZSk7CiAKLXN0YXRpYyBpbnQgeGZybV9vdXRwdXQyKHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW50IHhmcm1fb3V0cHV0MihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJcmV0dXJuIHhmcm1fb3V0cHV0X3Jlc3VtZShza2IsIDEpOwogfQogCi1zdGF0aWMgaW50IHhmcm1fb3V0cHV0X2dzbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCB4ZnJtX291dHB1dF9nc28oc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBza19idWZmICpzZWdzOwogCkBAIC0xNjUsNyArMTY1LDcgQEAKIAkJaW50IGVycjsKIAogCQlzZWdzLT5uZXh0ID0gTlVMTDsKLQkJZXJyID0geGZybV9vdXRwdXQyKHNlZ3MpOworCQllcnIgPSB4ZnJtX291dHB1dDIoc2ssIHNlZ3MpOwogCiAJCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCQlrZnJlZV9za2JfbGlzdChuc2tiKTsKQEAgLTE3OCwxMyArMTc4LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB4ZnJtX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoraW50IHhmcm1fb3V0cHV0KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KHNrYl9kc3Qoc2tiKS0+ZGV2KTsKIAlpbnQgZXJyOwogCiAJaWYgKHNrYl9pc19nc28oc2tiKSkKLQkJcmV0dXJuIHhmcm1fb3V0cHV0X2dzbyhza2IpOworCQlyZXR1cm4geGZybV9vdXRwdXRfZ3NvKHNrLCBza2IpOwogCiAJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpIHsKIAkJZXJyID0gc2tiX2NoZWNrc3VtX2hlbHAoc2tiKTsKQEAgLTE5NSw3ICsxOTUsNyBAQAogCQl9CiAJfQogCi0JcmV0dXJuIHhmcm1fb3V0cHV0Mihza2IpOworCXJldHVybiB4ZnJtX291dHB1dDIoc2ssIHNrYik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTCh4ZnJtX291dHB1dCk7CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMgYi9uZXQveGZybS94ZnJtX3BvbGljeS5jCmluZGV4IGNlZTQ3OWIuLjYzOGFmMDYgMTAwNjQ0Ci0tLSBhL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKKysrIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwpAQCAtMjI2OSwxMSArMjI2OSw5IEBACiAJCSAqIGhhdmUgdGhlIHhmcm1fc3RhdGUncy4gV2UgbmVlZCB0byB3YWl0IGZvciBLTSB0bwogCQkgKiBuZWdvdGlhdGUgbmV3IFNBJ3Mgb3IgYmFpbCBvdXQgd2l0aCBlcnJvci4qLwogCQlpZiAobmV0LT54ZnJtLnN5c2N0bF9sYXJ2YWxfZHJvcCkgewotCQkJZHN0X3JlbGVhc2UoZHN0KTsKLQkJCXhmcm1fcG9sc19wdXQocG9scywgZHJvcF9wb2xzKTsKIAkJCVhGUk1fSU5DX1NUQVRTKG5ldCwgTElOVVhfTUlCX1hGUk1PVVROT1NUQVRFUyk7Ci0KLQkJCXJldHVybiBFUlJfUFRSKC1FUkVNT1RFKTsKKwkJCWVyciA9IC1FUkVNT1RFOworCQkJZ290byBlcnJvcjsKIAkJfQogCiAJCWVyciA9IC1FQUdBSU47CkBAIC0yMzI0LDcgKzIzMjIsOCBAQAogZXJyb3I6CiAJZHN0X3JlbGVhc2UoZHN0KTsKIGRyb3Bkc3Q6Ci0JZHN0X3JlbGVhc2UoZHN0X29yaWcpOworCWlmICghKGZsYWdzICYgWEZSTV9MT09LVVBfS0VFUF9EU1RfUkVGKSkKKwkJZHN0X3JlbGVhc2UoZHN0X29yaWcpOwogCXhmcm1fcG9sc19wdXQocG9scywgZHJvcF9wb2xzKTsKIAlyZXR1cm4gRVJSX1BUUihlcnIpOwogfQpAQCAtMjMzOCw3ICsyMzM3LDggQEAKIAkJCQkgICAgc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0geGZybV9sb29rdXAobmV0LCBkc3Rfb3JpZywgZmwsIHNrLAotCQkJCQkgICAgZmxhZ3MgfCBYRlJNX0xPT0tVUF9RVUVVRSk7CisJCQkJCSAgICBmbGFncyB8IFhGUk1fTE9PS1VQX1FVRVVFIHwKKwkJCQkJICAgIFhGUk1fTE9PS1VQX0tFRVBfRFNUX1JFRik7CiAKIAlpZiAoSVNfRVJSKGRzdCkgJiYgUFRSX0VSUihkc3QpID09IC1FUkVNT1RFKQogCQlyZXR1cm4gbWFrZV9ibGFja2hvbGUobmV0LCBkc3Rfb3JpZy0+b3BzLT5mYW1pbHksIGRzdF9vcmlnKTsKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fc3RhdGUuYyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwppbmRleCBkZTk3MWI2Li5mNWUzOWUzIDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3N0YXRlLmMKKysrIGIvbmV0L3hmcm0veGZybV9zdGF0ZS5jCkBAIC0xMDQzLDEyICsxMDQzLDEyIEBACiAJCQlicmVhazsKIAogCQljYXNlIEFGX0lORVQ2OgotCQkJKihzdHJ1Y3QgaW42X2FkZHIgKil4LT5zZWwuZGFkZHIuYTYgPSAqKHN0cnVjdCBpbjZfYWRkciAqKWRhZGRyOwotCQkJKihzdHJ1Y3QgaW42X2FkZHIgKil4LT5zZWwuc2FkZHIuYTYgPSAqKHN0cnVjdCBpbjZfYWRkciAqKXNhZGRyOworCQkJeC0+c2VsLmRhZGRyLmluNiA9IGRhZGRyLT5pbjY7CisJCQl4LT5zZWwuc2FkZHIuaW42ID0gc2FkZHItPmluNjsKIAkJCXgtPnNlbC5wcmVmaXhsZW5fZCA9IDEyODsKIAkJCXgtPnNlbC5wcmVmaXhsZW5fcyA9IDEyODsKLQkJCSooc3RydWN0IGluNl9hZGRyICopeC0+cHJvcHMuc2FkZHIuYTYgPSAqKHN0cnVjdCBpbjZfYWRkciAqKXNhZGRyOwotCQkJKihzdHJ1Y3QgaW42X2FkZHIgKil4LT5pZC5kYWRkci5hNiA9ICooc3RydWN0IGluNl9hZGRyICopZGFkZHI7CisJCQl4LT5wcm9wcy5zYWRkci5pbjYgPSBzYWRkci0+aW42OworCQkJeC0+aWQuZGFkZHIuaW42ID0gZGFkZHItPmluNjsKIAkJCWJyZWFrOwogCQl9CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fdXNlci5jIGIvbmV0L3hmcm0veGZybV91c2VyLmMKaW5kZXggN2RlMmVkOS4uMjA5MTY2NCAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV91c2VyLmMKKysrIGIvbmV0L3hmcm0veGZybV91c2VyLmMKQEAgLTI0MjMsNiArMjQyMywxMSBAQAogCWNvbnN0IHN0cnVjdCB4ZnJtX2xpbmsgKmxpbms7CiAJaW50IHR5cGUsIGVycjsKIAorI2lmZGVmIENPTkZJR19DT01QQVQKKwlpZiAoaXNfY29tcGF0X3Rhc2soKSkKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKyNlbmRpZgorCiAJdHlwZSA9IG5saC0+bmxtc2dfdHlwZTsKIAlpZiAodHlwZSA+IFhGUk1fTVNHX01BWCkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9NYWtlZmlsZSBiL3NhbXBsZXMvYnBmL01ha2VmaWxlCmluZGV4IGI1YjM2MDAuLjc2ZTM0NTggMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL01ha2VmaWxlCisrKyBiL3NhbXBsZXMvYnBmL01ha2VmaWxlCkBAIC02LDIzICs2LDQwIEBACiBob3N0cHJvZ3MteSArPSBzb2NrX2V4YW1wbGUKIGhvc3Rwcm9ncy15ICs9IHNvY2tleDEKIGhvc3Rwcm9ncy15ICs9IHNvY2tleDIKK2hvc3Rwcm9ncy15ICs9IHRyYWNleDEKK2hvc3Rwcm9ncy15ICs9IHRyYWNleDIKK2hvc3Rwcm9ncy15ICs9IHRyYWNleDMKK2hvc3Rwcm9ncy15ICs9IHRyYWNleDQKIAogdGVzdF92ZXJpZmllci1vYmpzIDo9IHRlc3RfdmVyaWZpZXIubyBsaWJicGYubwogdGVzdF9tYXBzLW9ianMgOj0gdGVzdF9tYXBzLm8gbGliYnBmLm8KIHNvY2tfZXhhbXBsZS1vYmpzIDo9IHNvY2tfZXhhbXBsZS5vIGxpYmJwZi5vCiBzb2NrZXgxLW9ianMgOj0gYnBmX2xvYWQubyBsaWJicGYubyBzb2NrZXgxX3VzZXIubwogc29ja2V4Mi1vYmpzIDo9IGJwZl9sb2FkLm8gbGliYnBmLm8gc29ja2V4Ml91c2VyLm8KK3RyYWNleDEtb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIHRyYWNleDFfdXNlci5vCit0cmFjZXgyLW9ianMgOj0gYnBmX2xvYWQubyBsaWJicGYubyB0cmFjZXgyX3VzZXIubwordHJhY2V4My1vYmpzIDo9IGJwZl9sb2FkLm8gbGliYnBmLm8gdHJhY2V4M191c2VyLm8KK3RyYWNleDQtb2JqcyA6PSBicGZfbG9hZC5vIGxpYmJwZi5vIHRyYWNleDRfdXNlci5vCiAKICMgVGVsbCBrYnVpbGQgdG8gYWx3YXlzIGJ1aWxkIHRoZSBwcm9ncmFtcwogYWx3YXlzIDo9ICQoaG9zdHByb2dzLXkpCiBhbHdheXMgKz0gc29ja2V4MV9rZXJuLm8KIGFsd2F5cyArPSBzb2NrZXgyX2tlcm4ubworYWx3YXlzICs9IHRyYWNleDFfa2Vybi5vCithbHdheXMgKz0gdHJhY2V4Ml9rZXJuLm8KK2Fsd2F5cyArPSB0cmFjZXgzX2tlcm4ubworYWx3YXlzICs9IHRyYWNleDRfa2Vybi5vCithbHdheXMgKz0gdGNicGYxX2tlcm4ubwogCiBIT1NUQ0ZMQUdTICs9IC1JJChvYmp0cmVlKS91c3IvaW5jbHVkZQogCiBIT1NUQ0ZMQUdTX2JwZl9sb2FkLm8gKz0gLUkkKG9ianRyZWUpL3Vzci9pbmNsdWRlIC1Xbm8tdW51c2VkLXZhcmlhYmxlCiBIT1NUTE9BRExJQkVTX3NvY2tleDEgKz0gLWxlbGYKIEhPU1RMT0FETElCRVNfc29ja2V4MiArPSAtbGVsZgorSE9TVExPQURMSUJFU190cmFjZXgxICs9IC1sZWxmCitIT1NUTE9BRExJQkVTX3RyYWNleDIgKz0gLWxlbGYKK0hPU1RMT0FETElCRVNfdHJhY2V4MyArPSAtbGVsZgorSE9TVExPQURMSUJFU190cmFjZXg0ICs9IC1sZWxmIC1scnQKIAogIyBwb2ludCB0aGlzIHRvIHlvdXIgTExWTSBiYWNrZW5kIHdpdGggYnBmIHN1cHBvcnQKIExMQz0kKHNyY3RyZWUpL3Rvb2xzL2JwZi9sbHZtL2JsZC9EZWJ1ZytBc3NlcnRzL2Jpbi9sbGMKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL2JwZl9oZWxwZXJzLmggYi9zYW1wbGVzL2JwZi9icGZfaGVscGVycy5oCmluZGV4IGNhMDMzMzEuLmY5NjBiNWYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2JwZl9oZWxwZXJzLmgKKysrIGIvc2FtcGxlcy9icGYvYnBmX2hlbHBlcnMuaApAQCAtMTUsNiArMTUsMTIgQEAKIAkodm9pZCAqKSBCUEZfRlVOQ19tYXBfdXBkYXRlX2VsZW07CiBzdGF0aWMgaW50ICgqYnBmX21hcF9kZWxldGVfZWxlbSkodm9pZCAqbWFwLCB2b2lkICprZXkpID0KIAkodm9pZCAqKSBCUEZfRlVOQ19tYXBfZGVsZXRlX2VsZW07CitzdGF0aWMgaW50ICgqYnBmX3Byb2JlX3JlYWQpKHZvaWQgKmRzdCwgaW50IHNpemUsIHZvaWQgKnVuc2FmZV9wdHIpID0KKwkodm9pZCAqKSBCUEZfRlVOQ19wcm9iZV9yZWFkOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAoKmJwZl9rdGltZV9nZXRfbnMpKHZvaWQpID0KKwkodm9pZCAqKSBCUEZfRlVOQ19rdGltZV9nZXRfbnM7CitzdGF0aWMgaW50ICgqYnBmX3RyYWNlX3ByaW50aykoY29uc3QgY2hhciAqZm10LCBpbnQgZm10X3NpemUsIC4uLikgPQorCSh2b2lkICopIEJQRl9GVU5DX3RyYWNlX3ByaW50azsKIAogLyogbGx2bSBidWlsdGluIGZ1bmN0aW9ucyB0aGF0IGVCUEYgQyBwcm9ncmFtIG1heSB1c2UgdG8KICAqIGVtaXQgQlBGX0xEX0FCUyBhbmQgQlBGX0xEX0lORCBpbnN0cnVjdGlvbnMKQEAgLTM3LDQgKzQzLDExIEBACiAJdW5zaWduZWQgaW50IG1heF9lbnRyaWVzOwogfTsKIAorc3RhdGljIGludCAoKmJwZl9za2Jfc3RvcmVfYnl0ZXMpKHZvaWQgKmN0eCwgaW50IG9mZiwgdm9pZCAqZnJvbSwgaW50IGxlbiwgaW50IGZsYWdzKSA9CisJKHZvaWQgKikgQlBGX0ZVTkNfc2tiX3N0b3JlX2J5dGVzOworc3RhdGljIGludCAoKmJwZl9sM19jc3VtX3JlcGxhY2UpKHZvaWQgKmN0eCwgaW50IG9mZiwgaW50IGZyb20sIGludCB0bywgaW50IGZsYWdzKSA9CisJKHZvaWQgKikgQlBGX0ZVTkNfbDNfY3N1bV9yZXBsYWNlOworc3RhdGljIGludCAoKmJwZl9sNF9jc3VtX3JlcGxhY2UpKHZvaWQgKmN0eCwgaW50IG9mZiwgaW50IGZyb20sIGludCB0bywgaW50IGZsYWdzKSA9CisJKHZvaWQgKikgQlBGX0ZVTkNfbDRfY3N1bV9yZXBsYWNlOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL2JwZl9sb2FkLmMgYi9zYW1wbGVzL2JwZi9icGZfbG9hZC5jCmluZGV4IDE4MzFkMjMuLjM4ZGFjNWEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2JwZl9sb2FkLmMKKysrIGIvc2FtcGxlcy9icGYvYnBmX2xvYWQuYwpAQCAtOCwyOSArOCw3MCBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxsaW51eC9icGYuaD4KICNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHBvbGwuaD4KICNpbmNsdWRlICJsaWJicGYuaCIKICNpbmNsdWRlICJicGZfaGVscGVycy5oIgogI2luY2x1ZGUgImJwZl9sb2FkLmgiCiAKKyNkZWZpbmUgREVCVUdGUyAiL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy8iCisKIHN0YXRpYyBjaGFyIGxpY2Vuc2VbMTI4XTsKK3N0YXRpYyBpbnQga2Vybl92ZXJzaW9uOwogc3RhdGljIGJvb2wgcHJvY2Vzc2VkX3NlY1sxMjhdOwogaW50IG1hcF9mZFtNQVhfTUFQU107CiBpbnQgcHJvZ19mZFtNQVhfUFJPR1NdOworaW50IGV2ZW50X2ZkW01BWF9QUk9HU107CiBpbnQgcHJvZ19jbnQ7CiAKIHN0YXRpYyBpbnQgbG9hZF9hbmRfYXR0YWNoKGNvbnN0IGNoYXIgKmV2ZW50LCBzdHJ1Y3QgYnBmX2luc24gKnByb2csIGludCBzaXplKQogewotCWludCBmZDsKIAlib29sIGlzX3NvY2tldCA9IHN0cm5jbXAoZXZlbnQsICJzb2NrZXQiLCA2KSA9PSAwOworCWJvb2wgaXNfa3Byb2JlID0gc3RybmNtcChldmVudCwgImtwcm9iZS8iLCA3KSA9PSAwOworCWJvb2wgaXNfa3JldHByb2JlID0gc3RybmNtcChldmVudCwgImtyZXRwcm9iZS8iLCAxMCkgPT0gMDsKKwllbnVtIGJwZl9wcm9nX3R5cGUgcHJvZ190eXBlOworCWNoYXIgYnVmWzI1Nl07CisJaW50IGZkLCBlZmQsIGVyciwgaWQ7CisJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyID0ge307CiAKLQlpZiAoIWlzX3NvY2tldCkKLQkJLyogdHJhY2luZyBldmVudHMgdGJkICovCisJYXR0ci50eXBlID0gUEVSRl9UWVBFX1RSQUNFUE9JTlQ7CisJYXR0ci5zYW1wbGVfdHlwZSA9IFBFUkZfU0FNUExFX1JBVzsKKwlhdHRyLnNhbXBsZV9wZXJpb2QgPSAxOworCWF0dHIud2FrZXVwX2V2ZW50cyA9IDE7CisKKwlpZiAoaXNfc29ja2V0KSB7CisJCXByb2dfdHlwZSA9IEJQRl9QUk9HX1RZUEVfU09DS0VUX0ZJTFRFUjsKKwl9IGVsc2UgaWYgKGlzX2twcm9iZSB8fCBpc19rcmV0cHJvYmUpIHsKKwkJcHJvZ190eXBlID0gQlBGX1BST0dfVFlQRV9LUFJPQkU7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJVbmtub3duIGV2ZW50ICclcydcbiIsIGV2ZW50KTsKIAkJcmV0dXJuIC0xOworCX0KIAotCWZkID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVIsCi0JCQkgICBwcm9nLCBzaXplLCBsaWNlbnNlKTsKKwlpZiAoaXNfa3Byb2JlIHx8IGlzX2tyZXRwcm9iZSkgeworCQlpZiAoaXNfa3Byb2JlKQorCQkJZXZlbnQgKz0gNzsKKwkJZWxzZQorCQkJZXZlbnQgKz0gMTA7CisKKwkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwKKwkJCSAiZWNobyAnJWM6JXMgJXMnID4+IC9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcva3Byb2JlX2V2ZW50cyIsCisJCQkgaXNfa3Byb2JlID8gJ3AnIDogJ3InLCBldmVudCwgZXZlbnQpOworCQllcnIgPSBzeXN0ZW0oYnVmKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXByaW50ZigiZmFpbGVkIHRvIGNyZWF0ZSBrcHJvYmUgJyVzJyBlcnJvciAnJXMnXG4iLAorCQkJICAgICAgIGV2ZW50LCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJZmQgPSBicGZfcHJvZ19sb2FkKHByb2dfdHlwZSwgcHJvZywgc2l6ZSwgbGljZW5zZSwga2Vybl92ZXJzaW9uKTsKIAogCWlmIChmZCA8IDApIHsKIAkJcHJpbnRmKCJicGZfcHJvZ19sb2FkKCkgZXJyPSVkXG4lcyIsIGVycm5vLCBicGZfbG9nX2J1Zik7CkBAIC0zOSw2ICs4MCw0MSBAQAogCiAJcHJvZ19mZFtwcm9nX2NudCsrXSA9IGZkOwogCisJaWYgKGlzX3NvY2tldCkKKwkJcmV0dXJuIDA7CisKKwlzdHJjcHkoYnVmLCBERUJVR0ZTKTsKKwlzdHJjYXQoYnVmLCAiZXZlbnRzL2twcm9iZXMvIik7CisJc3RyY2F0KGJ1ZiwgZXZlbnQpOworCXN0cmNhdChidWYsICIvaWQiKTsKKworCWVmZCA9IG9wZW4oYnVmLCBPX1JET05MWSwgMCk7CisJaWYgKGVmZCA8IDApIHsKKwkJcHJpbnRmKCJmYWlsZWQgdG8gb3BlbiBldmVudCAlc1xuIiwgZXZlbnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJZXJyID0gcmVhZChlZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChlcnIgPCAwIHx8IGVyciA+PSBzaXplb2YoYnVmKSkgeworCQlwcmludGYoInJlYWQgZnJvbSAnJXMnIGZhaWxlZCAnJXMnXG4iLCBldmVudCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNsb3NlKGVmZCk7CisKKwlidWZbZXJyXSA9IDA7CisJaWQgPSBhdG9pKGJ1Zik7CisJYXR0ci5jb25maWcgPSBpZDsKKworCWVmZCA9IHBlcmZfZXZlbnRfb3BlbigmYXR0ciwgLTEvKnBpZCovLCAwLypjcHUqLywgLTEvKmdyb3VwX2ZkKi8sIDApOworCWlmIChlZmQgPCAwKSB7CisJCXByaW50ZigiZXZlbnQgJWQgZmQgJWQgZXJyICVzXG4iLCBpZCwgZWZkLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gLTE7CisJfQorCWV2ZW50X2ZkW3Byb2dfY250IC0gMV0gPSBlZmQ7CisJaW9jdGwoZWZkLCBQRVJGX0VWRU5UX0lPQ19FTkFCTEUsIDApOworCWlvY3RsKGVmZCwgUEVSRl9FVkVOVF9JT0NfU0VUX0JQRiwgZmQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNSw2ICsyMTEsOSBAQAogCWlmIChnZWxmX2dldGVoZHIoZWxmLCAmZWhkcikgIT0gJmVoZHIpCiAJCXJldHVybiAxOwogCisJLyogY2xlYXIgYWxsIGtwcm9iZXMgKi8KKwlpID0gc3lzdGVtKCJlY2hvIFwiXCIgPiAvc3lzL2tlcm5lbC9kZWJ1Zy90cmFjaW5nL2twcm9iZV9ldmVudHMiKTsKKwogCS8qIHNjYW4gb3ZlciBhbGwgZWxmIHNlY3Rpb25zIHRvIGdldCBsaWNlbnNlIGFuZCBtYXAgaW5mbyAqLwogCWZvciAoaSA9IDE7IGkgPCBlaGRyLmVfc2hudW07IGkrKykgewogCkBAIC0xNDksNiArMjI4LDE0IEBACiAJCWlmIChzdHJjbXAoc2huYW1lLCAibGljZW5zZSIpID09IDApIHsKIAkJCXByb2Nlc3NlZF9zZWNbaV0gPSB0cnVlOwogCQkJbWVtY3B5KGxpY2Vuc2UsIGRhdGEtPmRfYnVmLCBkYXRhLT5kX3NpemUpOworCQl9IGVsc2UgaWYgKHN0cmNtcChzaG5hbWUsICJ2ZXJzaW9uIikgPT0gMCkgeworCQkJcHJvY2Vzc2VkX3NlY1tpXSA9IHRydWU7CisJCQlpZiAoZGF0YS0+ZF9zaXplICE9IHNpemVvZihpbnQpKSB7CisJCQkJcHJpbnRmKCJpbnZhbGlkIHNpemUgb2YgdmVyc2lvbiBzZWN0aW9uICV6ZFxuIiwKKwkJCQkgICAgICAgZGF0YS0+ZF9zaXplKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCW1lbWNweSgma2Vybl92ZXJzaW9uLCBkYXRhLT5kX2J1Ziwgc2l6ZW9mKGludCkpOwogCQl9IGVsc2UgaWYgKHN0cmNtcChzaG5hbWUsICJtYXBzIikgPT0gMCkgewogCQkJcHJvY2Vzc2VkX3NlY1tpXSA9IHRydWU7CiAJCQlpZiAobG9hZF9tYXBzKGRhdGEtPmRfYnVmLCBkYXRhLT5kX3NpemUpKQpAQCAtMTc4LDcgKzI2NSw4IEBACiAJCQlpZiAocGFyc2VfcmVsb19hbmRfYXBwbHkoZGF0YSwgc3ltYm9scywgJnNoZHIsIGluc25zKSkKIAkJCQljb250aW51ZTsKIAotCQkJaWYgKG1lbWNtcChzaG5hbWVfcHJvZywgImV2ZW50cy8iLCA3KSA9PSAwIHx8CisJCQlpZiAobWVtY21wKHNobmFtZV9wcm9nLCAia3Byb2JlLyIsIDcpID09IDAgfHwKKwkJCSAgICBtZW1jbXAoc2huYW1lX3Byb2csICJrcmV0cHJvYmUvIiwgMTApID09IDAgfHwKIAkJCSAgICBtZW1jbXAoc2huYW1lX3Byb2csICJzb2NrZXQiLCA2KSA9PSAwKQogCQkJCWxvYWRfYW5kX2F0dGFjaChzaG5hbWVfcHJvZywgaW5zbnMsIGRhdGFfcHJvZy0+ZF9zaXplKTsKIAkJfQpAQCAtMTkzLDcgKzI4MSw4IEBACiAJCWlmIChnZXRfc2VjKGVsZiwgaSwgJmVoZHIsICZzaG5hbWUsICZzaGRyLCAmZGF0YSkpCiAJCQljb250aW51ZTsKIAotCQlpZiAobWVtY21wKHNobmFtZSwgImV2ZW50cy8iLCA3KSA9PSAwIHx8CisJCWlmIChtZW1jbXAoc2huYW1lLCAia3Byb2JlLyIsIDcpID09IDAgfHwKKwkJICAgIG1lbWNtcChzaG5hbWUsICJrcmV0cHJvYmUvIiwgMTApID09IDAgfHwKIAkJICAgIG1lbWNtcChzaG5hbWUsICJzb2NrZXQiLCA2KSA9PSAwKQogCQkJbG9hZF9hbmRfYXR0YWNoKHNobmFtZSwgZGF0YS0+ZF9idWYsIGRhdGEtPmRfc2l6ZSk7CiAJfQpAQCAtMjAxLDMgKzI5MCwyMyBAQAogCWNsb3NlKGZkKTsKIAlyZXR1cm4gMDsKIH0KKwordm9pZCByZWFkX3RyYWNlX3BpcGUodm9pZCkKK3sKKwlpbnQgdHJhY2VfZmQ7CisKKwl0cmFjZV9mZCA9IG9wZW4oREVCVUdGUyAidHJhY2VfcGlwZSIsIE9fUkRPTkxZLCAwKTsKKwlpZiAodHJhY2VfZmQgPCAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoMSkgeworCQlzdGF0aWMgY2hhciBidWZbNDA5Nl07CisJCXNzaXplX3Qgc3o7CisKKwkJc3ogPSByZWFkKHRyYWNlX2ZkLCBidWYsIHNpemVvZihidWYpKTsKKwkJaWYgKHN6ID4gMCkgeworCQkJYnVmW3N6XSA9IDA7CisJCQlwdXRzKGJ1Zik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9icGZfbG9hZC5oIGIvc2FtcGxlcy9icGYvYnBmX2xvYWQuaAppbmRleCAyNzc4OWEzLi5jYmQ3YzJiIDEwMDY0NAotLS0gYS9zYW1wbGVzL2JwZi9icGZfbG9hZC5oCisrKyBiL3NhbXBsZXMvYnBmL2JwZl9sb2FkLmgKQEAgLTYsNiArNiw3IEBACiAKIGV4dGVybiBpbnQgbWFwX2ZkW01BWF9NQVBTXTsKIGV4dGVybiBpbnQgcHJvZ19mZFtNQVhfUFJPR1NdOworZXh0ZXJuIGludCBldmVudF9mZFtNQVhfUFJPR1NdOwogCiAvKiBwYXJzZXMgZWxmIGZpbGUgY29tcGlsZWQgYnkgbGx2bSAuYy0+Lm8KICAqIC4gcGFyc2VzICdtYXBzJyBzZWN0aW9uIGFuZCBjcmVhdGVzIG1hcHMgdmlhIEJQRiBzeXNjYWxsCkBAIC0yMSw0ICsyMiw2IEBACiAgKi8KIGludCBsb2FkX2JwZl9maWxlKGNoYXIgKnBhdGgpOwogCit2b2lkIHJlYWRfdHJhY2VfcGlwZSh2b2lkKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9saWJicGYuYyBiL3NhbXBsZXMvYnBmL2xpYmJwZi5jCmluZGV4IDQ2ZDUwYjcuLjdlMWVmYTcgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2xpYmJwZi5jCisrKyBiL3NhbXBsZXMvYnBmL2xpYmJwZi5jCkBAIC04MSw3ICs4MSw3IEBACiAKIGludCBicGZfcHJvZ19sb2FkKGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUsCiAJCSAgY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNucywgaW50IHByb2dfbGVuLAotCQkgIGNvbnN0IGNoYXIgKmxpY2Vuc2UpCisJCSAgY29uc3QgY2hhciAqbGljZW5zZSwgaW50IGtlcm5fdmVyc2lvbikKIHsKIAl1bmlvbiBicGZfYXR0ciBhdHRyID0gewogCQkucHJvZ190eXBlID0gcHJvZ190eXBlLApAQCAtOTMsNiArOTMsMTEgQEAKIAkJLmxvZ19sZXZlbCA9IDEsCiAJfTsKIAorCS8qIGFzc2lnbiBvbmUgZmllbGQgb3V0c2lkZSBvZiBzdHJ1Y3QgaW5pdCB0byBtYWtlIHN1cmUgYW55CisJICogcGFkZGluZyBpcyB6ZXJvIGluaXRpYWxpemVkCisJICovCisJYXR0ci5rZXJuX3ZlcnNpb24gPSBrZXJuX3ZlcnNpb247CisKIAlicGZfbG9nX2J1ZlswXSA9IDA7CiAKIAlyZXR1cm4gc3lzY2FsbChfX05SX2JwZiwgQlBGX1BST0dfTE9BRCwgJmF0dHIsIHNpemVvZihhdHRyKSk7CkBAIC0xMjEsMyArMTI2LDEwIEBACiAKIAlyZXR1cm4gc29jazsKIH0KKworaW50IHBlcmZfZXZlbnRfb3BlbihzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCBpbnQgcGlkLCBpbnQgY3B1LAorCQkgICAgaW50IGdyb3VwX2ZkLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXJldHVybiBzeXNjYWxsKF9fTlJfcGVyZl9ldmVudF9vcGVuLCBhdHRyLCBwaWQsIGNwdSwKKwkJICAgICAgIGdyb3VwX2ZkLCBmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9saWJicGYuaCBiL3NhbXBsZXMvYnBmL2xpYmJwZi5oCmluZGV4IDU4YzVmZTEuLjcyMzVlMjkgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL2xpYmJwZi5oCisrKyBiL3NhbXBsZXMvYnBmL2xpYmJwZi5oCkBAIC0xMyw3ICsxMyw3IEBACiAKIGludCBicGZfcHJvZ19sb2FkKGVudW0gYnBmX3Byb2dfdHlwZSBwcm9nX3R5cGUsCiAJCSAgY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNucywgaW50IGluc25fbGVuLAotCQkgIGNvbnN0IGNoYXIgKmxpY2Vuc2UpOworCQkgIGNvbnN0IGNoYXIgKmxpY2Vuc2UsIGludCBrZXJuX3ZlcnNpb24pOwogCiAjZGVmaW5lIExPR19CVUZfU0laRSA2NTUzNgogZXh0ZXJuIGNoYXIgYnBmX2xvZ19idWZbTE9HX0JVRl9TSVpFXTsKQEAgLTkyLDcgKzkyLDkgQEAKIAkJLm9mZiAgID0gMCwJCQkJCVwKIAkJLmltbSAgID0gKChfX3U2NCkgKElNTSkpID4+IDMyIH0pCiAKLSNkZWZpbmUgQlBGX1BTRVVET19NQVBfRkQJMQorI2lmbmRlZiBCUEZfUFNFVURPX01BUF9GRAorIyBkZWZpbmUgQlBGX1BTRVVET19NQVBfRkQJMQorI2VuZGlmCiAKIC8qIHBzZXVkbyBCUEZfTERfSU1NNjQgaW5zbiB1c2VkIHRvIHJlZmVyIHRvIHByb2Nlc3MtbG9jYWwgbWFwX2ZkICovCiAjZGVmaW5lIEJQRl9MRF9NQVBfRkQoRFNULCBNQVBfRkQpCQkJCVwKQEAgLTE4Miw0ICsxODQsNyBAQAogLyogY3JlYXRlIFJBVyBzb2NrZXQgYW5kIGJpbmQgdG8gaW50ZXJmYWNlICduYW1lJyAqLwogaW50IG9wZW5fcmF3X3NvY2soY29uc3QgY2hhciAqbmFtZSk7CiAKK3N0cnVjdCBwZXJmX2V2ZW50X2F0dHI7CitpbnQgcGVyZl9ldmVudF9vcGVuKHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsIGludCBwaWQsIGludCBjcHUsCisJCSAgICBpbnQgZ3JvdXBfZmQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9zb2NrX2V4YW1wbGUuYyBiL3NhbXBsZXMvYnBmL3NvY2tfZXhhbXBsZS5jCmluZGV4IGM4YWQwNDAuLmEwY2UyNTEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL3NvY2tfZXhhbXBsZS5jCisrKyBiL3NhbXBsZXMvYnBmL3NvY2tfZXhhbXBsZS5jCkBAIC01Niw3ICs1Niw3IEBACiAJfTsKIAogCXByb2dfZmQgPSBicGZfcHJvZ19sb2FkKEJQRl9QUk9HX1RZUEVfU09DS0VUX0ZJTFRFUiwgcHJvZywgc2l6ZW9mKHByb2cpLAotCQkJCSJHUEwiKTsKKwkJCQkiR1BMIiwgMCk7CiAJaWYgKHByb2dfZmQgPCAwKSB7CiAJCXByaW50ZigiZmFpbGVkIHRvIGxvYWQgcHJvZyAnJXMnXG4iLCBzdHJlcnJvcihlcnJubykpOwogCQlnb3RvIGNsZWFudXA7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9zb2NrZXgxX2tlcm4uYyBiL3NhbXBsZXMvYnBmL3NvY2tleDFfa2Vybi5jCmluZGV4IDA2Njg5MjYuLmVkMThlOWEgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL3NvY2tleDFfa2Vybi5jCisrKyBiL3NhbXBsZXMvYnBmL3NvY2tleDFfa2Vybi5jCkBAIC0xLDUgKzEsNiBAQAogI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmLmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaWZfcGFja2V0Lmg+CiAjaW5jbHVkZSA8dWFwaS9saW51eC9pcC5oPgogI2luY2x1ZGUgImJwZl9oZWxwZXJzLmgiCiAKQEAgLTExLDE0ICsxMiwxNyBAQAogfTsKIAogU0VDKCJzb2NrZXQxIikKLWludCBicGZfcHJvZzEoc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBicGZfcHJvZzEoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQogewogCWludCBpbmRleCA9IGxvYWRfYnl0ZShza2IsIEVUSF9ITEVOICsgb2Zmc2V0b2Yoc3RydWN0IGlwaGRyLCBwcm90b2NvbCkpOwogCWxvbmcgKnZhbHVlOwogCisJaWYgKHNrYi0+cGt0X3R5cGUgIT0gUEFDS0VUX09VVEdPSU5HKQorCQlyZXR1cm4gMDsKKwogCXZhbHVlID0gYnBmX21hcF9sb29rdXBfZWxlbSgmbXlfbWFwLCAmaW5kZXgpOwogCWlmICh2YWx1ZSkKLQkJX19zeW5jX2ZldGNoX2FuZF9hZGQodmFsdWUsIDEpOworCQlfX3N5bmNfZmV0Y2hfYW5kX2FkZCh2YWx1ZSwgc2tiLT5sZW4pOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi9zb2NrZXgxX3VzZXIuYyBiL3NhbXBsZXMvYnBmL3NvY2tleDFfdXNlci5jCmluZGV4IDM0YTQ0M2YuLjY3OGNlNDYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvYnBmL3NvY2tleDFfdXNlci5jCisrKyBiL3NhbXBsZXMvYnBmL3NvY2tleDFfdXNlci5jCkBAIC00MCw3ICs0MCw3IEBACiAJCWtleSA9IElQUFJPVE9fSUNNUDsKIAkJYXNzZXJ0KGJwZl9sb29rdXBfZWxlbShtYXBfZmRbMF0sICZrZXksICZpY21wX2NudCkgPT0gMCk7CiAKLQkJcHJpbnRmKCJUQ1AgJWxsZCBVRFAgJWxsZCBJQ01QICVsbGQgcGFja2V0c1xuIiwKKwkJcHJpbnRmKCJUQ1AgJWxsZCBVRFAgJWxsZCBJQ01QICVsbGQgYnl0ZXNcbiIsCiAJCSAgICAgICB0Y3BfY250LCB1ZHBfY250LCBpY21wX2NudCk7CiAJCXNsZWVwKDEpOwogCX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3NvY2tleDJfa2Vybi5jIGIvc2FtcGxlcy9icGYvc29ja2V4Ml9rZXJuLmMKaW5kZXggNmYwMTM1Zi4uYmEwZTE3NyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9icGYvc29ja2V4Ml9rZXJuLmMKKysrIGIvc2FtcGxlcy9icGYvc29ja2V4Ml9rZXJuLmMKQEAgLTQyLDEzICs0MiwxMyBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSBpbnQgaXBfaXNfZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKmN0eCwgX191NjQgbmhvZmYpCitzdGF0aWMgaW5saW5lIGludCBpcF9pc19mcmFnbWVudChzdHJ1Y3QgX19za19idWZmICpjdHgsIF9fdTY0IG5ob2ZmKQogewogCXJldHVybiBsb2FkX2hhbGYoY3R4LCBuaG9mZiArIG9mZnNldG9mKHN0cnVjdCBpcGhkciwgZnJhZ19vZmYpKQogCQkmIChJUF9NRiB8IElQX09GRlNFVCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgX191MzIgaXB2Nl9hZGRyX2hhc2goc3RydWN0IHNrX2J1ZmYgKmN0eCwgX191NjQgb2ZmKQorc3RhdGljIGlubGluZSBfX3UzMiBpcHY2X2FkZHJfaGFzaChzdHJ1Y3QgX19za19idWZmICpjdHgsIF9fdTY0IG9mZikKIHsKIAlfX3U2NCB3MCA9IGxvYWRfd29yZChjdHgsIG9mZik7CiAJX191NjQgdzEgPSBsb2FkX3dvcmQoY3R4LCBvZmYgKyA0KTsKQEAgLTU4LDcgKzU4LDcgQEAKIAlyZXR1cm4gKF9fdTMyKSh3MCBeIHcxIF4gdzIgXiB3Myk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgX191NjQgcGFyc2VfaXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191NjQgbmhvZmYsIF9fdTY0ICppcF9wcm90bywKK3N0YXRpYyBpbmxpbmUgX191NjQgcGFyc2VfaXAoc3RydWN0IF9fc2tfYnVmZiAqc2tiLCBfX3U2NCBuaG9mZiwgX191NjQgKmlwX3Byb3RvLAogCQkJICAgICBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCV9fdTY0IHZlcmxlbjsKQEAgLTgyLDcgKzgyLDcgQEAKIAlyZXR1cm4gbmhvZmY7CiB9CiAKLXN0YXRpYyBpbmxpbmUgX191NjQgcGFyc2VfaXB2NihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX3U2NCBuaG9mZiwgX191NjQgKmlwX3Byb3RvLAorc3RhdGljIGlubGluZSBfX3U2NCBwYXJzZV9pcHY2KHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgX191NjQgbmhvZmYsIF9fdTY0ICppcF9wcm90bywKIAkJCSAgICAgICBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCSppcF9wcm90byA9IGxvYWRfYnl0ZShza2IsCkBAIC05Niw3ICs5Niw3IEBACiAJcmV0dXJuIG5ob2ZmOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgZmxvd19kaXNzZWN0b3Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3N0YXRpYyBpbmxpbmUgYm9vbCBmbG93X2Rpc3NlY3RvcihzdHJ1Y3QgX19za19idWZmICpza2IsIHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJX191NjQgbmhvZmYgPSBFVEhfSExFTjsKIAlfX3U2NCBpcF9wcm90bzsKQEAgLTE4MywxOCArMTgzLDIzIEBACiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0cnVjdCBwYWlyIHsKKwlsb25nIHBhY2tldHM7CisJbG9uZyBieXRlczsKK307CisKIHN0cnVjdCBicGZfbWFwX2RlZiBTRUMoIm1hcHMiKSBoYXNoX21hcCA9IHsKIAkudHlwZSA9IEJQRl9NQVBfVFlQRV9IQVNILAogCS5rZXlfc2l6ZSA9IHNpemVvZihfX2JlMzIpLAotCS52YWx1ZV9zaXplID0gc2l6ZW9mKGxvbmcpLAorCS52YWx1ZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBwYWlyKSwKIAkubWF4X2VudHJpZXMgPSAxMDI0LAogfTsKIAogU0VDKCJzb2NrZXQyIikKLWludCBicGZfcHJvZzIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK2ludCBicGZfcHJvZzIoc3RydWN0IF9fc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBmbG93X2tleXMgZmxvdzsKLQlsb25nICp2YWx1ZTsKKwlzdHJ1Y3QgcGFpciAqdmFsdWU7CiAJdTMyIGtleTsKIAogCWlmICghZmxvd19kaXNzZWN0b3Ioc2tiLCAmZmxvdykpCkBAIC0yMDMsOSArMjA4LDEwIEBACiAJa2V5ID0gZmxvdy5kc3Q7CiAJdmFsdWUgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZoYXNoX21hcCwgJmtleSk7CiAJaWYgKHZhbHVlKSB7Ci0JCV9fc3luY19mZXRjaF9hbmRfYWRkKHZhbHVlLCAxKTsKKwkJX19zeW5jX2ZldGNoX2FuZF9hZGQoJnZhbHVlLT5wYWNrZXRzLCAxKTsKKwkJX19zeW5jX2ZldGNoX2FuZF9hZGQoJnZhbHVlLT5ieXRlcywgc2tiLT5sZW4pOwogCX0gZWxzZSB7Ci0JCWxvbmcgdmFsID0gMTsKKwkJc3RydWN0IHBhaXIgdmFsID0gezEsIHNrYi0+bGVufTsKIAogCQlicGZfbWFwX3VwZGF0ZV9lbGVtKCZoYXNoX21hcCwgJmtleSwgJnZhbCwgQlBGX0FOWSk7CiAJfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvc29ja2V4Ml91c2VyLmMgYi9zYW1wbGVzL2JwZi9zb2NrZXgyX3VzZXIuYwppbmRleCBkMmQ1ZjVhLi4yOWEyNzZkIDEwMDY0NAotLS0gYS9zYW1wbGVzL2JwZi9zb2NrZXgyX3VzZXIuYworKysgYi9zYW1wbGVzL2JwZi9zb2NrZXgyX3VzZXIuYwpAQCAtNiw2ICs2LDExIEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAKK3N0cnVjdCBwYWlyIHsKKwlfX3U2NCBwYWNrZXRzOworCV9fdTY0IGJ5dGVzOworfTsKKwogaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXJndikKIHsKIAljaGFyIGZpbGVuYW1lWzI1Nl07CkBAIC0yOSwxMyArMzQsMTMgQEAKIAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKIAkJaW50IGtleSA9IDAsIG5leHRfa2V5OwotCQlsb25nIGxvbmcgdmFsdWU7CisJCXN0cnVjdCBwYWlyIHZhbHVlOwogCiAJCXdoaWxlIChicGZfZ2V0X25leHRfa2V5KG1hcF9mZFswXSwgJmtleSwgJm5leHRfa2V5KSA9PSAwKSB7CiAJCQlicGZfbG9va3VwX2VsZW0obWFwX2ZkWzBdLCAmbmV4dF9rZXksICZ2YWx1ZSk7Ci0JCQlwcmludGYoImlwICVzIGNvdW50ICVsbGRcbiIsCisJCQlwcmludGYoImlwICVzIGJ5dGVzICVsbGQgcGFja2V0cyAlbGxkXG4iLAogCQkJICAgICAgIGluZXRfbnRvYSgoc3RydWN0IGluX2FkZHIpe2h0b25sKG5leHRfa2V5KX0pLAotCQkJICAgICAgIHZhbHVlKTsKKwkJCSAgICAgICB2YWx1ZS5ieXRlcywgdmFsdWUucGFja2V0cyk7CiAJCQlrZXkgPSBuZXh0X2tleTsKIAkJfQogCQlzbGVlcCgxKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3RjYnBmMV9rZXJuLmMgYi9zYW1wbGVzL2JwZi90Y2JwZjFfa2Vybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjNmNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2JwZi90Y2JwZjFfa2Vybi5jCkBAIC0wLDAgKzEsNzEgQEAKKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JwZi5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2lmX3BhY2tldC5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvaXAuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2luLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC90Y3AuaD4KKyNpbmNsdWRlICJicGZfaGVscGVycy5oIgorCisvKiBjb21waWxlciB3b3JrYXJvdW5kICovCisjZGVmaW5lIF9odG9ubCBfX2J1aWx0aW5fYnN3YXAzMgorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RzdF9tYWMoc3RydWN0IF9fc2tfYnVmZiAqc2tiLCBjaGFyICptYWMpCit7CisJYnBmX3NrYl9zdG9yZV9ieXRlcyhza2IsIDAsIG1hYywgRVRIX0FMRU4sIDEpOworfQorCisvKiB1c2UgMSBiZWxvdyBmb3IgaW5ncmVzcyBxZGlzYyBhbmQgMCBmb3IgZWdyZXNzICovCisjaWYgMAorI3VuZGVmIEVUSF9ITEVOCisjZGVmaW5lIEVUSF9ITEVOIDAKKyNlbmRpZgorCisjZGVmaW5lIElQX0NTVU1fT0ZGIChFVEhfSExFTiArIG9mZnNldG9mKHN0cnVjdCBpcGhkciwgY2hlY2spKQorI2RlZmluZSBUT1NfT0ZGIChFVEhfSExFTiArIG9mZnNldG9mKHN0cnVjdCBpcGhkciwgdG9zKSkKKworc3RhdGljIGlubGluZSB2b2lkIHNldF9pcF90b3Moc3RydWN0IF9fc2tfYnVmZiAqc2tiLCBfX3U4IG5ld190b3MpCit7CisJX191OCBvbGRfdG9zID0gbG9hZF9ieXRlKHNrYiwgVE9TX09GRik7CisKKwlicGZfbDNfY3N1bV9yZXBsYWNlKHNrYiwgSVBfQ1NVTV9PRkYsIGh0b25zKG9sZF90b3MpLCBodG9ucyhuZXdfdG9zKSwgMik7CisJYnBmX3NrYl9zdG9yZV9ieXRlcyhza2IsIFRPU19PRkYsICZuZXdfdG9zLCBzaXplb2YobmV3X3RvcyksIDApOworfQorCisjZGVmaW5lIFRDUF9DU1VNX09GRiAoRVRIX0hMRU4gKyBzaXplb2Yoc3RydWN0IGlwaGRyKSArIG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGNoZWNrKSkKKyNkZWZpbmUgSVBfU1JDX09GRiAoRVRIX0hMRU4gKyBvZmZzZXRvZihzdHJ1Y3QgaXBoZHIsIHNhZGRyKSkKKworI2RlZmluZSBJU19QU0VVRE8gMHgxMAorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3RjcF9pcF9zcmMoc3RydWN0IF9fc2tfYnVmZiAqc2tiLCBfX3UzMiBuZXdfaXApCit7CisJX191MzIgb2xkX2lwID0gX2h0b25sKGxvYWRfd29yZChza2IsIElQX1NSQ19PRkYpKTsKKworCWJwZl9sNF9jc3VtX3JlcGxhY2Uoc2tiLCBUQ1BfQ1NVTV9PRkYsIG9sZF9pcCwgbmV3X2lwLCBJU19QU0VVRE8gfCBzaXplb2YobmV3X2lwKSk7CisJYnBmX2wzX2NzdW1fcmVwbGFjZShza2IsIElQX0NTVU1fT0ZGLCBvbGRfaXAsIG5ld19pcCwgc2l6ZW9mKG5ld19pcCkpOworCWJwZl9za2Jfc3RvcmVfYnl0ZXMoc2tiLCBJUF9TUkNfT0ZGLCAmbmV3X2lwLCBzaXplb2YobmV3X2lwKSwgMCk7Cit9CisKKyNkZWZpbmUgVENQX0RQT1JUX09GRiAoRVRIX0hMRU4gKyBzaXplb2Yoc3RydWN0IGlwaGRyKSArIG9mZnNldG9mKHN0cnVjdCB0Y3BoZHIsIGRlc3QpKQorc3RhdGljIGlubGluZSB2b2lkIHNldF90Y3BfZGVzdF9wb3J0KHN0cnVjdCBfX3NrX2J1ZmYgKnNrYiwgX191MTYgbmV3X3BvcnQpCit7CisJX191MTYgb2xkX3BvcnQgPSBodG9ucyhsb2FkX2hhbGYoc2tiLCBUQ1BfRFBPUlRfT0ZGKSk7CisKKwlicGZfbDRfY3N1bV9yZXBsYWNlKHNrYiwgVENQX0NTVU1fT0ZGLCBvbGRfcG9ydCwgbmV3X3BvcnQsIHNpemVvZihuZXdfcG9ydCkpOworCWJwZl9za2Jfc3RvcmVfYnl0ZXMoc2tiLCBUQ1BfRFBPUlRfT0ZGLCAmbmV3X3BvcnQsIHNpemVvZihuZXdfcG9ydCksIDApOworfQorCitTRUMoImNsYXNzaWZpZXIiKQoraW50IGJwZl9wcm9nMShzdHJ1Y3QgX19za19idWZmICpza2IpCit7CisJX191OCBwcm90byA9IGxvYWRfYnl0ZShza2IsIEVUSF9ITEVOICsgb2Zmc2V0b2Yoc3RydWN0IGlwaGRyLCBwcm90b2NvbCkpOworCWxvbmcgKnZhbHVlOworCisJaWYgKHByb3RvID09IElQUFJPVE9fVENQKSB7CisJCXNldF9pcF90b3Moc2tiLCA4KTsKKwkJc2V0X3RjcF9pcF9zcmMoc2tiLCAweEEwMTAxMDEpOworCQlzZXRfdGNwX2Rlc3RfcG9ydChza2IsIDUwMDEpOworCX0KKworCXJldHVybiAwOworfQorY2hhciBfbGljZW5zZVtdIFNFQygibGljZW5zZSIpID0gIkdQTCI7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90ZXN0X3ZlcmlmaWVyLmMgYi9zYW1wbGVzL2JwZi90ZXN0X3ZlcmlmaWVyLmMKaW5kZXggYjk2MTc1ZS4uOWFiNjQ1NiAxMDA2NDQKLS0tIGEvc2FtcGxlcy9icGYvdGVzdF92ZXJpZmllci5jCisrKyBiL3NhbXBsZXMvYnBmL3Rlc3RfdmVyaWZpZXIuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgImxpYmJwZi5oIgogCiAjZGVmaW5lIE1BWF9JTlNOUyA1MTIKQEAgLTI4OCw3ICsyODksOCBAQAogCQkJQlBGX0xEWF9NRU0oQlBGX0RXLCBCUEZfUkVHXzIsIEJQRl9SRUdfMTAsIC04KSwKIAogCQkJLyogc2hvdWxkIGJlIGFibGUgdG8gYWNjZXNzIFIwID0gKihSMiArIDgpICovCi0JCQlCUEZfTERYX01FTShCUEZfRFcsIEJQRl9SRUdfMCwgQlBGX1JFR18yLCA4KSwKKwkJCS8qIEJQRl9MRFhfTUVNKEJQRl9EVywgQlBGX1JFR18wLCBCUEZfUkVHXzIsIDgpLCAqLworCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzAsIEJQRl9SRUdfMiksCiAJCQlCUEZfRVhJVF9JTlNOKCksCiAJCX0sCiAJCS5yZXN1bHQgPSBBQ0NFUFQsCkBAIC02NDEsNiArNjQzLDg0IEBACiAJCX0sCiAJCS5yZXN1bHQgPSBBQ0NFUFQsCiAJfSwKKwl7CisJCSJhY2Nlc3Mgc2tiIGZpZWxkcyBvayIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzAsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgbGVuKSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkdFLCBCUEZfUkVHXzAsIDAsIDEpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMCwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBtYXJrKSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkdFLCBCUEZfUkVHXzAsIDAsIDEpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMCwgQlBGX1JFR18xLAorCQkJCSAgICBvZmZzZXRvZihzdHJ1Y3QgX19za19idWZmLCBwa3RfdHlwZSkpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pHRSwgQlBGX1JFR18wLCAwLCAxKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzAsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgcXVldWVfbWFwcGluZykpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pHRSwgQlBGX1JFR18wLCAwLCAwKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzAsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgcHJvdG9jb2wpKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KR0UsIEJQRl9SRUdfMCwgMCwgMCksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18wLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIHZsYW5fcHJlc2VudCkpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pHRSwgQlBGX1JFR18wLCAwLCAwKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBCUEZfUkVHXzAsIEJQRl9SRUdfMSwKKwkJCQkgICAgb2Zmc2V0b2Yoc3RydWN0IF9fc2tfYnVmZiwgdmxhbl90Y2kpKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KR0UsIEJQRl9SRUdfMCwgMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5yZXN1bHQgPSBBQ0NFUFQsCisJfSwKKwl7CisJCSJhY2Nlc3Mgc2tiIGZpZWxkcyBiYWQxIiwKKwkJLmluc25zID0geworCQkJQlBGX0xEWF9NRU0oQlBGX1csIEJQRl9SRUdfMCwgQlBGX1JFR18xLCAtNCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5lcnJzdHIgPSAiaW52YWxpZCBicGZfY29udGV4dCBhY2Nlc3MiLAorCQkucmVzdWx0ID0gUkVKRUNULAorCX0sCisJeworCQkiYWNjZXNzIHNrYiBmaWVsZHMgYmFkMiIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9KTVBfSU1NKEJQRl9KR0UsIEJQRl9SRUdfMSwgMCwgOSksCisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSk5FLCBCUEZfUkVHXzAsIDAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfMCksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18wLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIHBrdF90eXBlKSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCS5maXh1cCA9IHs0fSwKKwkJLmVycnN0ciA9ICJkaWZmZXJlbnQgcG9pbnRlcnMiLAorCQkucmVzdWx0ID0gUkVKRUNULAorCX0sCisJeworCQkiYWNjZXNzIHNrYiBmaWVsZHMgYmFkMyIsCisJCS5pbnNucyA9IHsKKwkJCUJQRl9KTVBfSU1NKEJQRl9KR0UsIEJQRl9SRUdfMSwgMCwgMiksCisJCQlCUEZfTERYX01FTShCUEZfVywgQlBGX1JFR18wLCBCUEZfUkVHXzEsCisJCQkJICAgIG9mZnNldG9mKHN0cnVjdCBfX3NrX2J1ZmYsIHBrdF90eXBlKSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfU1RfTUVNKEJQRl9EVywgQlBGX1JFR18xMCwgLTgsIDApLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzIsIEJQRl9SRUdfMTApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBCUEZfUkVHXzIsIC04KSwKKwkJCUJQRl9MRF9NQVBfRkQoQlBGX1JFR18xLCAwKSwKKwkJCUJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsIEJQRl9GVU5DX21hcF9sb29rdXBfZWxlbSksCisJCQlCUEZfSk1QX0lNTShCUEZfSk5FLCBCUEZfUkVHXzAsIDAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjY0X1JFRyhCUEZfUkVHXzEsIEJQRl9SRUdfMCksCisJCQlCUEZfSk1QX0lNTShCUEZfSkEsIDAsIDAsIC0xMiksCisJCX0sCisJCS5maXh1cCA9IHs2fSwKKwkJLmVycnN0ciA9ICJkaWZmZXJlbnQgcG9pbnRlcnMiLAorCQkucmVzdWx0ID0gUkVKRUNULAorCX0sCiB9OwogCiBzdGF0aWMgaW50IHByb2JlX2ZpbHRlcl9sZW5ndGgoc3RydWN0IGJwZl9pbnNuICpmcCkKQEAgLTY4Nyw5ICs3NjcsOSBAQAogCQl9CiAJCXByaW50ZigiIyVkICVzICIsIGksIHRlc3RzW2ldLmRlc2NyKTsKIAotCQlwcm9nX2ZkID0gYnBmX3Byb2dfbG9hZChCUEZfUFJPR19UWVBFX1VOU1BFQywgcHJvZywKKwkJcHJvZ19mZCA9IGJwZl9wcm9nX2xvYWQoQlBGX1BST0dfVFlQRV9TT0NLRVRfRklMVEVSLCBwcm9nLAogCQkJCQlwcm9nX2xlbiAqIHNpemVvZihzdHJ1Y3QgYnBmX2luc24pLAotCQkJCQkiR1BMIik7CisJCQkJCSJHUEwiLCAwKTsKIAogCQlpZiAodGVzdHNbaV0ucmVzdWx0ID09IEFDQ0VQVCkgewogCQkJaWYgKHByb2dfZmQgPCAwKSB7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90cmFjZXgxX2tlcm4uYyBiL3NhbXBsZXMvYnBmL3RyYWNleDFfa2Vybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjIwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2JwZi90cmFjZXgxX2tlcm4uYwpAQCAtMCwwICsxLDUwIEBACisvKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNSBQTFVNZ3JpZCwgaHR0cDovL3BsdW1ncmlkLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDx1YXBpL2xpbnV4L2JwZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlICJicGZfaGVscGVycy5oIgorCisjZGVmaW5lIF8oUCkgKHt0eXBlb2YoUCkgdmFsID0gMDsgYnBmX3Byb2JlX3JlYWQoJnZhbCwgc2l6ZW9mKHZhbCksICZQKTsgdmFsO30pCisKKy8qIGtwcm9iZSBpcyBOT1QgYSBzdGFibGUgQUJJCisgKiBrZXJuZWwgZnVuY3Rpb25zIGNhbiBiZSByZW1vdmVkLCByZW5hbWVkIG9yIGNvbXBsZXRlbHkgY2hhbmdlIHNlbWFudGljcy4KKyAqIE51bWJlciBvZiBhcmd1bWVudHMgYW5kIHRoZWlyIHBvc2l0aW9ucyBjYW4gY2hhbmdlLCBldGMuCisgKiBJbiBzdWNoIGNhc2UgdGhpcyBicGYra3Byb2JlIGV4YW1wbGUgd2lsbCBubyBsb25nZXIgYmUgbWVhbmluZ2Z1bAorICovCitTRUMoImtwcm9iZS9fX25ldGlmX3JlY2VpdmVfc2tiX2NvcmUiKQoraW50IGJwZl9wcm9nMShzdHJ1Y3QgcHRfcmVncyAqY3R4KQoreworCS8qIGF0dGFjaGVzIHRvIGtwcm9iZSBuZXRpZl9yZWNlaXZlX3NrYiwKKwkgKiBsb29rcyBmb3IgcGFja2V0cyBvbiBsb29icGFjayBkZXZpY2UgYW5kIHByaW50cyB0aGVtCisJICovCisJY2hhciBkZXZuYW1lW0lGTkFNU0laXSA9IHt9OworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgbGVuOworCisJLyogbm9uLXBvcnRhYmxlISB3b3JrcyBmb3IgdGhlIGdpdmVuIGtlcm5lbCBvbmx5ICovCisJc2tiID0gKHN0cnVjdCBza19idWZmICopIGN0eC0+ZGk7CisKKwlkZXYgPSBfKHNrYi0+ZGV2KTsKKworCWxlbiA9IF8oc2tiLT5sZW4pOworCisJYnBmX3Byb2JlX3JlYWQoZGV2bmFtZSwgc2l6ZW9mKGRldm5hbWUpLCBkZXYtPm5hbWUpOworCisJaWYgKGRldm5hbWVbMF0gPT0gJ2wnICYmIGRldm5hbWVbMV0gPT0gJ28nKSB7CisJCWNoYXIgZm10W10gPSAic2tiICVwIGxlbiAlZFxuIjsKKwkJLyogdXNpbmcgYnBmX3RyYWNlX3ByaW50aygpIGZvciBERUJVRyBPTkxZICovCisJCWJwZl90cmFjZV9wcmludGsoZm10LCBzaXplb2YoZm10KSwgc2tiLCBsZW4pOworCX0KKworCXJldHVybiAwOworfQorCitjaGFyIF9saWNlbnNlW10gU0VDKCJsaWNlbnNlIikgPSAiR1BMIjsKK3UzMiBfdmVyc2lvbiBTRUMoInZlcnNpb24iKSA9IExJTlVYX1ZFUlNJT05fQ09ERTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3RyYWNleDFfdXNlci5jIGIvc2FtcGxlcy9icGYvdHJhY2V4MV91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhNDgxOAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3RyYWNleDFfdXNlci5jCkBAIC0wLDAgKzEsMjUgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImxpYmJwZi5oIgorI2luY2x1ZGUgImJwZl9sb2FkLmgiCisKK2ludCBtYWluKGludCBhYywgY2hhciAqKmFyZ3YpCit7CisJRklMRSAqZjsKKwljaGFyIGZpbGVuYW1lWzI1Nl07CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzX2tlcm4ubyIsIGFyZ3ZbMF0pOworCisJaWYgKGxvYWRfYnBmX2ZpbGUoZmlsZW5hbWUpKSB7CisJCXByaW50ZigiJXMiLCBicGZfbG9nX2J1Zik7CisJCXJldHVybiAxOworCX0KKworCWYgPSBwb3BlbigidGFza3NldCAxIHBpbmcgLWM1IGxvY2FsaG9zdCIsICJyIik7CisJKHZvaWQpIGY7CisKKwlyZWFkX3RyYWNlX3BpcGUoKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdHJhY2V4Ml9rZXJuLmMgYi9zYW1wbGVzL2JwZi90cmFjZXgyX2tlcm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWVjMWNmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9icGYvdHJhY2V4Ml9rZXJuLmMKQEAgLTAsMCArMSw4NiBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgUExVTWdyaWQsIGh0dHA6Ly9wbHVtZ3JpZC5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmLmg+CisjaW5jbHVkZSAiYnBmX2hlbHBlcnMuaCIKKworc3RydWN0IGJwZl9tYXBfZGVmIFNFQygibWFwcyIpIG15X21hcCA9IHsKKwkudHlwZSA9IEJQRl9NQVBfVFlQRV9IQVNILAorCS5rZXlfc2l6ZSA9IHNpemVvZihsb25nKSwKKwkudmFsdWVfc2l6ZSA9IHNpemVvZihsb25nKSwKKwkubWF4X2VudHJpZXMgPSAxMDI0LAorfTsKKworLyoga3Byb2JlIGlzIE5PVCBhIHN0YWJsZSBBQkkuIElmIGtlcm5lbCBpbnRlcm5hbHMgY2hhbmdlIHRoaXMgYnBmK2twcm9iZQorICogZXhhbXBsZSB3aWxsIG5vIGxvbmdlciBiZSBtZWFuaW5nZnVsCisgKi8KK1NFQygia3Byb2JlL2tmcmVlX3NrYiIpCitpbnQgYnBmX3Byb2cyKHN0cnVjdCBwdF9yZWdzICpjdHgpCit7CisJbG9uZyBsb2MgPSAwOworCWxvbmcgaW5pdF92YWwgPSAxOworCWxvbmcgKnZhbHVlOworCisJLyogeDY0IHNwZWNpZmljOiByZWFkIGlwIG9mIGtmcmVlX3NrYiBjYWxsZXIuCisJICogbm9uLXBvcnRhYmxlIHZlcnNpb24gb2YgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApCisJICovCisJYnBmX3Byb2JlX3JlYWQoJmxvYywgc2l6ZW9mKGxvYyksICh2b2lkICopY3R4LT5zcCk7CisKKwl2YWx1ZSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJm15X21hcCwgJmxvYyk7CisJaWYgKHZhbHVlKQorCQkqdmFsdWUgKz0gMTsKKwllbHNlCisJCWJwZl9tYXBfdXBkYXRlX2VsZW0oJm15X21hcCwgJmxvYywgJmluaXRfdmFsLCBCUEZfQU5ZKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBsb2cyKHVuc2lnbmVkIGludCB2KQoreworCXVuc2lnbmVkIGludCByOworCXVuc2lnbmVkIGludCBzaGlmdDsKKworCXIgPSAodiA+IDB4RkZGRikgPDwgNDsgdiA+Pj0gcjsKKwlzaGlmdCA9ICh2ID4gMHhGRikgPDwgMzsgdiA+Pj0gc2hpZnQ7IHIgfD0gc2hpZnQ7CisJc2hpZnQgPSAodiA+IDB4RikgPDwgMjsgdiA+Pj0gc2hpZnQ7IHIgfD0gc2hpZnQ7CisJc2hpZnQgPSAodiA+IDB4MykgPDwgMTsgdiA+Pj0gc2hpZnQ7IHIgfD0gc2hpZnQ7CisJciB8PSAodiA+PiAxKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBsb2cybCh1bnNpZ25lZCBsb25nIHYpCit7CisJdW5zaWduZWQgaW50IGhpID0gdiA+PiAzMjsKKwlpZiAoaGkpCisJCXJldHVybiBsb2cyKGhpKSArIDMyOworCWVsc2UKKwkJcmV0dXJuIGxvZzIodik7Cit9CisKK3N0cnVjdCBicGZfbWFwX2RlZiBTRUMoIm1hcHMiKSBteV9oaXN0X21hcCA9IHsKKwkudHlwZSA9IEJQRl9NQVBfVFlQRV9BUlJBWSwKKwkua2V5X3NpemUgPSBzaXplb2YodTMyKSwKKwkudmFsdWVfc2l6ZSA9IHNpemVvZihsb25nKSwKKwkubWF4X2VudHJpZXMgPSA2NCwKK307CisKK1NFQygia3Byb2JlL3N5c193cml0ZSIpCitpbnQgYnBmX3Byb2czKHN0cnVjdCBwdF9yZWdzICpjdHgpCit7CisJbG9uZyB3cml0ZV9zaXplID0gY3R4LT5keDsgLyogYXJnMyAqLworCWxvbmcgaW5pdF92YWwgPSAxOworCWxvbmcgKnZhbHVlOworCXUzMiBpbmRleCA9IGxvZzJsKHdyaXRlX3NpemUpOworCisJdmFsdWUgPSBicGZfbWFwX2xvb2t1cF9lbGVtKCZteV9oaXN0X21hcCwgJmluZGV4KTsKKwlpZiAodmFsdWUpCisJCV9fc3luY19mZXRjaF9hbmRfYWRkKHZhbHVlLCAxKTsKKwlyZXR1cm4gMDsKK30KK2NoYXIgX2xpY2Vuc2VbXSBTRUMoImxpY2Vuc2UiKSA9ICJHUEwiOwordTMyIF92ZXJzaW9uIFNFQygidmVyc2lvbiIpID0gTElOVVhfVkVSU0lPTl9DT0RFOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdHJhY2V4Ml91c2VyLmMgYi9zYW1wbGVzL2JwZi90cmFjZXgyX3VzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWI4ZDA4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9icGYvdHJhY2V4Ml91c2VyLmMKQEAgLTAsMCArMSw5NSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvYnBmLmg+CisjaW5jbHVkZSAibGliYnBmLmgiCisjaW5jbHVkZSAiYnBmX2xvYWQuaCIKKworI2RlZmluZSBNQVhfSU5ERVgJNjQKKyNkZWZpbmUgTUFYX1NUQVJTCTM4CisKK3N0YXRpYyB2b2lkIHN0YXJzKGNoYXIgKnN0ciwgbG9uZyB2YWwsIGxvbmcgbWF4LCBpbnQgd2lkdGgpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHdpZHRoICogdmFsIC8gbWF4KSAtIDEgJiYgaSA8IHdpZHRoIC0gMTsgaSsrKQorCQlzdHJbaV0gPSAnKic7CisJaWYgKHZhbCA+IG1heCkKKwkJc3RyW2kgLSAxXSA9ICcrJzsKKwlzdHJbaV0gPSAnXDAnOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oaXN0KGludCBmZCkKK3sKKwlpbnQga2V5OworCWxvbmcgdmFsdWU7CisJbG9uZyBkYXRhW01BWF9JTkRFWF0gPSB7fTsKKwljaGFyIHN0YXJzdHJbTUFYX1NUQVJTXTsKKwlpbnQgaTsKKwlpbnQgbWF4X2luZCA9IC0xOworCWxvbmcgbWF4X3ZhbHVlID0gMDsKKworCWZvciAoa2V5ID0gMDsga2V5IDwgTUFYX0lOREVYOyBrZXkrKykgeworCQlicGZfbG9va3VwX2VsZW0oZmQsICZrZXksICZ2YWx1ZSk7CisJCWRhdGFba2V5XSA9IHZhbHVlOworCQlpZiAodmFsdWUgJiYga2V5ID4gbWF4X2luZCkKKwkJCW1heF9pbmQgPSBrZXk7CisJCWlmICh2YWx1ZSA+IG1heF92YWx1ZSkKKwkJCW1heF92YWx1ZSA9IHZhbHVlOworCX0KKworCXByaW50ZigiICAgICAgICAgICBzeXNjYWxsIHdyaXRlKCkgc3RhdHNcbiIpOworCXByaW50ZigiICAgICBieXRlX3NpemUgICAgICAgOiBjb3VudCAgICAgZGlzdHJpYnV0aW9uXG4iKTsKKwlmb3IgKGkgPSAxOyBpIDw9IG1heF9pbmQgKyAxOyBpKyspIHsKKwkJc3RhcnMoc3RhcnN0ciwgZGF0YVtpIC0gMV0sIG1heF92YWx1ZSwgTUFYX1NUQVJTKTsKKwkJcHJpbnRmKCIlOGxkIC0+ICUtOGxkIDogJS04bGQgfCUtKnN8XG4iLAorCQkgICAgICAgKDFsIDw8IGkpID4+IDEsICgxbCA8PCBpKSAtIDEsIGRhdGFbaSAtIDFdLAorCQkgICAgICAgTUFYX1NUQVJTLCBzdGFyc3RyKTsKKwl9Cit9CitzdGF0aWMgdm9pZCBpbnRfZXhpdChpbnQgc2lnKQoreworCXByaW50X2hpc3QobWFwX2ZkWzFdKTsKKwlleGl0KDApOworfQorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphcmd2KQoreworCWNoYXIgZmlsZW5hbWVbMjU2XTsKKwlsb25nIGtleSwgbmV4dF9rZXksIHZhbHVlOworCUZJTEUgKmY7CisJaW50IGk7CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzX2tlcm4ubyIsIGFyZ3ZbMF0pOworCisJc2lnbmFsKFNJR0lOVCwgaW50X2V4aXQpOworCisJLyogc3RhcnQgJ3BpbmcnIGluIHRoZSBiYWNrZ3JvdW5kIHRvIGhhdmUgc29tZSBrZnJlZV9za2IgZXZlbnRzICovCisJZiA9IHBvcGVuKCJwaW5nIC1jNSBsb2NhbGhvc3QiLCAiciIpOworCSh2b2lkKSBmOworCisJLyogc3RhcnQgJ2RkJyBpbiB0aGUgYmFja2dyb3VuZCB0byBoYXZlIHBsZW50eSBvZiAnd3JpdGUnIHN5c2NhbGxzICovCisJZiA9IHBvcGVuKCJkZCBpZj0vZGV2L3plcm8gb2Y9L2Rldi9udWxsIGNvdW50PTUwMDAwMDAiLCAiciIpOworCSh2b2lkKSBmOworCisJaWYgKGxvYWRfYnBmX2ZpbGUoZmlsZW5hbWUpKSB7CisJCXByaW50ZigiJXMiLCBicGZfbG9nX2J1Zik7CisJCXJldHVybiAxOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJa2V5ID0gMDsKKwkJd2hpbGUgKGJwZl9nZXRfbmV4dF9rZXkobWFwX2ZkWzBdLCAma2V5LCAmbmV4dF9rZXkpID09IDApIHsKKwkJCWJwZl9sb29rdXBfZWxlbShtYXBfZmRbMF0sICZuZXh0X2tleSwgJnZhbHVlKTsKKwkJCXByaW50ZigibG9jYXRpb24gMHglbHggY291bnQgJWxkXG4iLCBuZXh0X2tleSwgdmFsdWUpOworCQkJa2V5ID0gbmV4dF9rZXk7CisJCX0KKwkJaWYgKGtleSkKKwkJCXByaW50ZigiXG4iKTsKKwkJc2xlZXAoMSk7CisJfQorCXByaW50X2hpc3QobWFwX2ZkWzFdKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9icGYvdHJhY2V4M19rZXJuLmMgYi9zYW1wbGVzL2JwZi90cmFjZXgzX2tlcm4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTVmZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9icGYvdHJhY2V4M19rZXJuLmMKQEAgLTAsMCArMSw4OSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgUExVTWdyaWQsIGh0dHA6Ly9wbHVtZ3JpZC5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPHVhcGkvbGludXgvYnBmLmg+CisjaW5jbHVkZSAiYnBmX2hlbHBlcnMuaCIKKworc3RydWN0IGJwZl9tYXBfZGVmIFNFQygibWFwcyIpIG15X21hcCA9IHsKKwkudHlwZSA9IEJQRl9NQVBfVFlQRV9IQVNILAorCS5rZXlfc2l6ZSA9IHNpemVvZihsb25nKSwKKwkudmFsdWVfc2l6ZSA9IHNpemVvZih1NjQpLAorCS5tYXhfZW50cmllcyA9IDQwOTYsCit9OworCisvKiBrcHJvYmUgaXMgTk9UIGEgc3RhYmxlIEFCSS4gSWYga2VybmVsIGludGVybmFscyBjaGFuZ2UgdGhpcyBicGYra3Byb2JlCisgKiBleGFtcGxlIHdpbGwgbm8gbG9uZ2VyIGJlIG1lYW5pbmdmdWwKKyAqLworU0VDKCJrcHJvYmUvYmxrX21xX3N0YXJ0X3JlcXVlc3QiKQoraW50IGJwZl9wcm9nMShzdHJ1Y3QgcHRfcmVncyAqY3R4KQoreworCWxvbmcgcnEgPSBjdHgtPmRpOworCXU2NCB2YWwgPSBicGZfa3RpbWVfZ2V0X25zKCk7CisKKwlicGZfbWFwX3VwZGF0ZV9lbGVtKCZteV9tYXAsICZycSwgJnZhbCwgQlBGX0FOWSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9nMmwodW5zaWduZWQgbG9uZyBsb25nIG4pCit7CisjZGVmaW5lIFMoaykgaWYgKG4gPj0gKDF1bGwgPDwgaykpIHsgaSArPSBrOyBuID4+PSBrOyB9CisJaW50IGkgPSAtKG4gPT0gMCk7CisJUygzMik7IFMoMTYpOyBTKDgpOyBTKDQpOyBTKDIpOyBTKDEpOworCXJldHVybiBpOworI3VuZGVmIFMKK30KKworI2RlZmluZSBTTE9UUyAxMDAKKworc3RydWN0IGJwZl9tYXBfZGVmIFNFQygibWFwcyIpIGxhdF9tYXAgPSB7CisJLnR5cGUgPSBCUEZfTUFQX1RZUEVfQVJSQVksCisJLmtleV9zaXplID0gc2l6ZW9mKHUzMiksCisJLnZhbHVlX3NpemUgPSBzaXplb2YodTY0KSwKKwkubWF4X2VudHJpZXMgPSBTTE9UUywKK307CisKK1NFQygia3Byb2JlL2Jsa191cGRhdGVfcmVxdWVzdCIpCitpbnQgYnBmX3Byb2cyKHN0cnVjdCBwdF9yZWdzICpjdHgpCit7CisJbG9uZyBycSA9IGN0eC0+ZGk7CisJdTY0ICp2YWx1ZSwgbCwgYmFzZTsKKwl1MzIgaW5kZXg7CisKKwl2YWx1ZSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJm15X21hcCwgJnJxKTsKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gMDsKKworCXU2NCBjdXJfdGltZSA9IGJwZl9rdGltZV9nZXRfbnMoKTsKKwl1NjQgZGVsdGEgPSBjdXJfdGltZSAtICp2YWx1ZTsKKworCWJwZl9tYXBfZGVsZXRlX2VsZW0oJm15X21hcCwgJnJxKTsKKworCS8qIHRoZSBsaW5lcyBiZWxvdyBhcmUgY29tcHV0aW5nIGluZGV4ID0gbG9nMTAoZGVsdGEpKjEwCisJICogdXNpbmcgaW50ZWdlciBhcml0aG1ldGljCisJICogaW5kZXggPSAyOSB+IDEgdXNlYworCSAqIGluZGV4ID0gNTkgfiAxIG1zZWMKKwkgKiBpbmRleCA9IDg5IH4gMSBzZWMKKwkgKiBpbmRleCA9IDk5IH4gMTBzZWMgb3IgbW9yZQorCSAqIGxvZzEwKHgpKjEwID0gbG9nMih4KSoxMC9sb2cyKDEwKSA9IGxvZzIoeCkqMworCSAqLworCWwgPSBsb2cybChkZWx0YSk7CisJYmFzZSA9IDFsbCA8PCBsOworCWluZGV4ID0gKGwgKiA2NCArIChkZWx0YSAtIGJhc2UpICogNjQgLyBiYXNlKSAqIDMgLyA2NDsKKworCWlmIChpbmRleCA+PSBTTE9UUykKKwkJaW5kZXggPSBTTE9UUyAtIDE7CisKKwl2YWx1ZSA9IGJwZl9tYXBfbG9va3VwX2VsZW0oJmxhdF9tYXAsICZpbmRleCk7CisJaWYgKHZhbHVlKQorCQlfX3N5bmNfZmV0Y2hfYW5kX2FkZCgobG9uZyAqKXZhbHVlLCAxKTsKKworCXJldHVybiAwOworfQorY2hhciBfbGljZW5zZVtdIFNFQygibGljZW5zZSIpID0gIkdQTCI7Cit1MzIgX3ZlcnNpb24gU0VDKCJ2ZXJzaW9uIikgPSBMSU5VWF9WRVJTSU9OX0NPREU7CmRpZmYgLS1naXQgYS9zYW1wbGVzL2JwZi90cmFjZXgzX3VzZXIuYyBiL3NhbXBsZXMvYnBmL3RyYWNleDNfdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYWE5MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2JwZi90cmFjZXgzX3VzZXIuYwpAQCAtMCwwICsxLDE1MCBAQAorLyogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgUExVTWdyaWQsIGh0dHA6Ly9wbHVtZ3JpZC5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYnBmLmg+CisjaW5jbHVkZSAibGliYnBmLmgiCisjaW5jbHVkZSAiYnBmX2xvYWQuaCIKKworI2RlZmluZSBBUlJBWV9TSVpFKHgpIChzaXplb2YoeCkgLyBzaXplb2YoKih4KSkpCisKKyNkZWZpbmUgU0xPVFMgMTAwCisKK3N0YXRpYyB2b2lkIGNsZWFyX3N0YXRzKGludCBmZCkKK3sKKwlfX3UzMiBrZXk7CisJX191NjQgdmFsdWUgPSAwOworCisJZm9yIChrZXkgPSAwOyBrZXkgPCBTTE9UUzsga2V5KyspCisJCWJwZl91cGRhdGVfZWxlbShmZCwgJmtleSwgJnZhbHVlLCBCUEZfQU5ZKTsKK30KKworY29uc3QgY2hhciAqY29sb3JbXSA9IHsKKwkiXDAzM1s0ODs1OzI1NW0iLAorCSJcMDMzWzQ4OzU7MjUybSIsCisJIlwwMzNbNDg7NTsyNTBtIiwKKwkiXDAzM1s0ODs1OzI0OG0iLAorCSJcMDMzWzQ4OzU7MjQ2bSIsCisJIlwwMzNbNDg7NTsyNDRtIiwKKwkiXDAzM1s0ODs1OzI0Mm0iLAorCSJcMDMzWzQ4OzU7MjQwbSIsCisJIlwwMzNbNDg7NTsyMzhtIiwKKwkiXDAzM1s0ODs1OzIzNm0iLAorCSJcMDMzWzQ4OzU7MjM0bSIsCisJIlwwMzNbNDg7NTsyMzJtIiwKK307Citjb25zdCBpbnQgbnVtX2NvbG9ycyA9IEFSUkFZX1NJWkUoY29sb3IpOworCitjb25zdCBjaGFyIG5vY29sb3JbXSA9ICJcMDMzWzAwbSI7CisKK2NvbnN0IGNoYXIgKnN5bVtdID0geworCSIgIiwKKwkiICIsCisJIi4iLAorCSIuIiwKKwkiKiIsCisJIioiLAorCSJvIiwKKwkibyIsCisJIk8iLAorCSJPIiwKKwkiIyIsCisJIiMiLAorfTsKKworYm9vbCBmdWxsX3JhbmdlID0gZmFsc2U7Citib29sIHRleHRfb25seSA9IGZhbHNlOworCitzdGF0aWMgdm9pZCBwcmludF9iYW5uZXIodm9pZCkKK3sKKwlpZiAoZnVsbF9yYW5nZSkKKwkJcHJpbnRmKCJ8MW5zICAgICB8MTBucyAgICAgfDEwMG5zICAgIHwxdXMgICAgICB8MTB1cyAgICAgfDEwMHVzIgorCQkgICAgICAgIiAgICB8MW1zICAgICAgfDEwbXMgICAgIHwxMDBtcyAgICB8MXMgICAgICAgfDEwc1xuIik7CisJZWxzZQorCQlwcmludGYoInwxdXMgICAgICB8MTB1cyAgICAgfDEwMHVzICAgIHwxbXMgICAgICB8MTBtcyAgICAgIgorCQkgICAgICAgInwxMDBtcyAgICB8MXMgICAgICAgfDEwc1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hpc3QoaW50IGZkKQoreworCV9fdTMyIGtleTsKKwlfX3U2NCB2YWx1ZTsKKwlfX3U2NCBjbnRbU0xPVFNdOworCV9fdTY0IG1heF9jbnQgPSAwOworCV9fdTY0IHRvdGFsX2V2ZW50cyA9IDA7CisKKwlmb3IgKGtleSA9IDA7IGtleSA8IFNMT1RTOyBrZXkrKykgeworCQl2YWx1ZSA9IDA7CisJCWJwZl9sb29rdXBfZWxlbShmZCwgJmtleSwgJnZhbHVlKTsKKwkJY250W2tleV0gPSB2YWx1ZTsKKwkJdG90YWxfZXZlbnRzICs9IHZhbHVlOworCQlpZiAodmFsdWUgPiBtYXhfY250KQorCQkJbWF4X2NudCA9IHZhbHVlOworCX0KKwljbGVhcl9zdGF0cyhmZCk7CisJZm9yIChrZXkgPSBmdWxsX3JhbmdlID8gMCA6IDI5OyBrZXkgPCBTTE9UUzsga2V5KyspIHsKKwkJaW50IGMgPSBudW1fY29sb3JzICogY250W2tleV0gLyAobWF4X2NudCArIDEpOworCisJCWlmICh0ZXh0X29ubHkpCisJCQlwcmludGYoIiVzIiwgc3ltW2NdKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIlcyAlcyIsIGNvbG9yW2NdLCBub2NvbG9yKTsKKwl9CisJcHJpbnRmKCIgIyAlbGxkXG4iLCB0b3RhbF9ldmVudHMpOworfQorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphcmd2KQoreworCWNoYXIgZmlsZW5hbWVbMjU2XTsKKwlpbnQgaTsKKworCXNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXNfa2Vybi5vIiwgYXJndlswXSk7CisKKwlpZiAobG9hZF9icGZfZmlsZShmaWxlbmFtZSkpIHsKKwkJcHJpbnRmKCIlcyIsIGJwZl9sb2dfYnVmKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZm9yIChpID0gMTsgaSA8IGFjOyBpKyspIHsKKwkJaWYgKHN0cmNtcChhcmd2W2ldLCAiLWEiKSA9PSAwKSB7CisJCQlmdWxsX3JhbmdlID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi10IikgPT0gMCkgeworCQkJdGV4dF9vbmx5ID0gdHJ1ZTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYXJndltpXSwgIi1oIikgPT0gMCkgeworCQkJcHJpbnRmKCJVc2FnZTpcbiIKKwkJCSAgICAgICAiICAtYSBkaXNwbGF5IHdpZGVyIGxhdGVuY3kgcmFuZ2VcbiIKKwkJCSAgICAgICAiICAtdCB0ZXh0IG9ubHlcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlwcmludGYoIiAgaGVhdG1hcCBvZiBJTyBsYXRlbmN5XG4iKTsKKwlpZiAodGV4dF9vbmx5KQorCQlwcmludGYoIiAgJXMiLCBzeW1bbnVtX2NvbG9ycyAtIDFdKTsKKwllbHNlCisJCXByaW50ZigiICAlcyAlcyIsIGNvbG9yW251bV9jb2xvcnMgLSAxXSwgbm9jb2xvcik7CisJcHJpbnRmKCIgLSBtYW55IGV2ZW50cyB3aXRoIHRoaXMgbGF0ZW5jeVxuIik7CisKKwlpZiAodGV4dF9vbmx5KQorCQlwcmludGYoIiAgJXMiLCBzeW1bMF0pOworCWVsc2UKKwkJcHJpbnRmKCIgICVzICVzIiwgY29sb3JbMF0sIG5vY29sb3IpOworCXByaW50ZigiIC0gZmV3IGV2ZW50c1xuIik7CisKKwlmb3IgKGkgPSAwOyA7IGkrKykgeworCQlpZiAoaSAlIDIwID09IDApCisJCQlwcmludF9iYW5uZXIoKTsKKwkJcHJpbnRfaGlzdChtYXBfZmRbMV0pOworCQlzbGVlcCgyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3RyYWNleDRfa2Vybi5jIGIvc2FtcGxlcy9icGYvdHJhY2V4NF9rZXJuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2YjgwNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3RyYWNleDRfa2Vybi5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNSBQTFVNZ3JpZCwgaHR0cDovL3BsdW1ncmlkLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8dWFwaS9saW51eC9icGYuaD4KKyNpbmNsdWRlICJicGZfaGVscGVycy5oIgorCitzdHJ1Y3QgcGFpciB7CisJdTY0IHZhbDsKKwl1NjQgaXA7Cit9OworCitzdHJ1Y3QgYnBmX21hcF9kZWYgU0VDKCJtYXBzIikgbXlfbWFwID0geworCS50eXBlID0gQlBGX01BUF9UWVBFX0hBU0gsCisJLmtleV9zaXplID0gc2l6ZW9mKGxvbmcpLAorCS52YWx1ZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBwYWlyKSwKKwkubWF4X2VudHJpZXMgPSAxMDAwMDAwLAorfTsKKworLyoga3Byb2JlIGlzIE5PVCBhIHN0YWJsZSBBQkkuIElmIGtlcm5lbCBpbnRlcm5hbHMgY2hhbmdlIHRoaXMgYnBmK2twcm9iZQorICogZXhhbXBsZSB3aWxsIG5vIGxvbmdlciBiZSBtZWFuaW5nZnVsCisgKi8KK1NFQygia3Byb2JlL2ttZW1fY2FjaGVfZnJlZSIpCitpbnQgYnBmX3Byb2cxKHN0cnVjdCBwdF9yZWdzICpjdHgpCit7CisJbG9uZyBwdHIgPSBjdHgtPnNpOworCisJYnBmX21hcF9kZWxldGVfZWxlbSgmbXlfbWFwLCAmcHRyKTsKKwlyZXR1cm4gMDsKK30KKworU0VDKCJrcmV0cHJvYmUva21lbV9jYWNoZV9hbGxvY19ub2RlIikKK2ludCBicGZfcHJvZzIoc3RydWN0IHB0X3JlZ3MgKmN0eCkKK3sKKwlsb25nIHB0ciA9IGN0eC0+YXg7CisJbG9uZyBpcCA9IDA7CisKKwkvKiBnZXQgaXAgYWRkcmVzcyBvZiBrbWVtX2NhY2hlX2FsbG9jX25vZGUoKSBjYWxsZXIgKi8KKwlicGZfcHJvYmVfcmVhZCgmaXAsIHNpemVvZihpcCksICh2b2lkICopKGN0eC0+YnAgKyBzaXplb2YoaXApKSk7CisKKwlzdHJ1Y3QgcGFpciB2ID0geworCQkudmFsID0gYnBmX2t0aW1lX2dldF9ucygpLAorCQkuaXAgPSBpcCwKKwl9OworCisJYnBmX21hcF91cGRhdGVfZWxlbSgmbXlfbWFwLCAmcHRyLCAmdiwgQlBGX0FOWSk7CisJcmV0dXJuIDA7Cit9CitjaGFyIF9saWNlbnNlW10gU0VDKCJsaWNlbnNlIikgPSAiR1BMIjsKK3UzMiBfdmVyc2lvbiBTRUMoInZlcnNpb24iKSA9IExJTlVYX1ZFUlNJT05fQ09ERTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvYnBmL3RyYWNleDRfdXNlci5jIGIvc2FtcGxlcy9icGYvdHJhY2V4NF91c2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM0YTNiZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvYnBmL3RyYWNleDRfdXNlci5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAxNSBQTFVNZ3JpZCwgaHR0cDovL3BsdW1ncmlkLmNvbQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bGludXgvYnBmLmg+CisjaW5jbHVkZSAibGliYnBmLmgiCisjaW5jbHVkZSAiYnBmX2xvYWQuaCIKKworc3RydWN0IHBhaXIgeworCWxvbmcgbG9uZyB2YWw7CisJX191NjQgaXA7Cit9OworCitzdGF0aWMgX191NjQgdGltZV9nZXRfbnModm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKwljbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKwlyZXR1cm4gdHMudHZfc2VjICogMTAwMDAwMDAwMHVsbCArIHRzLnR2X25zZWM7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X29sZF9vYmplY3RzKGludCBmZCkKK3sKKwlsb25nIGxvbmcgdmFsID0gdGltZV9nZXRfbnMoKTsKKwlfX3U2NCBrZXksIG5leHRfa2V5OworCXN0cnVjdCBwYWlyIHY7CisKKwlrZXkgPSB3cml0ZSgxLCAiXGVbMTsxSFxlWzJKIiwgMTIpOyAvKiBjbGVhciBzY3JlZW4gKi8KKworCWtleSA9IC0xOworCXdoaWxlIChicGZfZ2V0X25leHRfa2V5KG1hcF9mZFswXSwgJmtleSwgJm5leHRfa2V5KSA9PSAwKSB7CisJCWJwZl9sb29rdXBfZWxlbShtYXBfZmRbMF0sICZuZXh0X2tleSwgJnYpOworCQlrZXkgPSBuZXh0X2tleTsKKwkJaWYgKHZhbCAtIHYudmFsIDwgMTAwMDAwMDAwMGxsKQorCQkJLyogb2JqZWN0IHdhcyBhbGxvY2F0ZWQgbW9yZSB0aGVuIDEgc2VjIGFnbyAqLworCQkJY29udGludWU7CisJCXByaW50Zigib2JqIDB4JWxseCBpcyAlMmxsZHNlYyBvbGQgd2FzIGFsbG9jYXRlZCBhdCBpcCAlbGx4XG4iLAorCQkgICAgICAgbmV4dF9rZXksICh2YWwgLSB2LnZhbCkgLyAxMDAwMDAwMDAwbGwsIHYuaXApOworCX0KK30KKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXJndikKK3sKKwljaGFyIGZpbGVuYW1lWzI1Nl07CisJaW50IGk7CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzX2tlcm4ubyIsIGFyZ3ZbMF0pOworCisJaWYgKGxvYWRfYnBmX2ZpbGUoZmlsZW5hbWUpKSB7CisJCXByaW50ZigiJXMiLCBicGZfbG9nX2J1Zik7CisJCXJldHVybiAxOworCX0KKworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCXByaW50X29sZF9vYmplY3RzKG1hcF9mZFsxXSk7CisJCXNsZWVwKDEpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9oaWRyYXcvTWFrZWZpbGUgYi9zYW1wbGVzL2hpZHJhdy9NYWtlZmlsZQppbmRleCAzODJlZWFlLi5hOWFiOTYxIDEwMDY0NAotLS0gYS9zYW1wbGVzL2hpZHJhdy9NYWtlZmlsZQorKysgYi9zYW1wbGVzL2hpZHJhdy9NYWtlZmlsZQpAQCAtOCwzICs4LDUgQEAKIGFsd2F5cyA6PSAkKGhvc3Rwcm9ncy15KQogCiBIT1NUQ0ZMQUdTX2hpZC1leGFtcGxlLm8gKz0gLUkkKG9ianRyZWUpL3Vzci9pbmNsdWRlCisKK2FsbDogaGlkLWV4YW1wbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvaGlkcmF3L2hpZC1leGFtcGxlLmMgYi9zYW1wbGVzL2hpZHJhdy9oaWQtZXhhbXBsZS5jCmluZGV4IDUxMmE3ZTUuLjkyZTZjMTUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvaGlkcmF3L2hpZC1leGFtcGxlLmMKKysrIGIvc2FtcGxlcy9oaWRyYXcvaGlkLWV4YW1wbGUuYwpAQCAtNDYsMTAgKzQ2LDE0IEBACiAJY2hhciBidWZbMjU2XTsKIAlzdHJ1Y3QgaGlkcmF3X3JlcG9ydF9kZXNjcmlwdG9yIHJwdF9kZXNjOwogCXN0cnVjdCBoaWRyYXdfZGV2aW5mbyBpbmZvOworCWNoYXIgKmRldmljZSA9ICIvZGV2L2hpZHJhdzAiOworCisJaWYgKGFyZ2MgPiAxKQorCQlkZXZpY2UgPSBhcmd2WzFdOwogCiAJLyogT3BlbiB0aGUgRGV2aWNlIHdpdGggbm9uLWJsb2NraW5nIHJlYWRzLiBJbiByZWFsIGxpZmUsCiAJICAgZG9uJ3QgdXNlIGEgaGFyZCBjb2RlZCBwYXRoOyB1c2UgbGlidWRldiBpbnN0ZWFkLiAqLwotCWZkID0gb3BlbigiL2Rldi9oaWRyYXcwIiwgT19SRFdSfE9fTk9OQkxPQ0spOworCWZkID0gb3BlbihkZXZpY2UsIE9fUkRXUnxPX05PTkJMT0NLKTsKIAogCWlmIChmZCA8IDApIHsKIAkJcGVycm9yKCJVbmFibGUgdG8gb3BlbiBkZXZpY2UiKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMva29iamVjdC9rb2JqZWN0LWV4YW1wbGUuYyBiL3NhbXBsZXMva29iamVjdC9rb2JqZWN0LWV4YW1wbGUuYwppbmRleCAwMTU2MmUwLi4yZTA3NDBmIDEwMDY0NAotLS0gYS9zYW1wbGVzL2tvYmplY3Qva29iamVjdC1leGFtcGxlLmMKKysrIGIvc2FtcGxlcy9rb2JqZWN0L2tvYmplY3QtZXhhbXBsZS5jCkBAIC0zNiw3ICszNiwxMiBAQAogc3RhdGljIHNzaXplX3QgZm9vX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3NjYW5mKGJ1ZiwgIiVkdSIsICZmb28pOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG9pbnQoYnVmLCAxMCwgJmZvbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTYzLDkgKzY4LDEyIEBACiBzdGF0aWMgc3NpemVfdCBiX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCiAJCSAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKLQlpbnQgdmFyOworCWludCB2YXIsIHJldDsKIAotCXNzY2FuZihidWYsICIlZHUiLCAmdmFyKTsKKwlyZXQgPSBrc3RydG9pbnQoYnVmLCAxMCwgJnZhcik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAlpZiAoc3RyY21wKGF0dHItPmF0dHIubmFtZSwgImJheiIpID09IDApCiAJCWJheiA9IHZhcjsKIAllbHNlCkBAIC0xMzQsNSArMTQyLDUgQEAKIAogbW9kdWxlX2luaXQoZXhhbXBsZV9pbml0KTsKIG1vZHVsZV9leGl0KGV4YW1wbGVfZXhpdCk7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CiBNT0RVTEVfQVVUSE9SKCJHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPiIpOwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9rb2JqZWN0L2tzZXQtZXhhbXBsZS5jIGIvc2FtcGxlcy9rb2JqZWN0L2tzZXQtZXhhbXBsZS5jCmluZGV4IGFiNWU0NDcuLmE1NWJmZjUgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMva29iamVjdC9rc2V0LWV4YW1wbGUuYworKysgYi9zYW1wbGVzL2tvYmplY3Qva3NldC1leGFtcGxlLmMKQEAgLTEyMCw3ICsxMjAsMTIgQEAKIHN0YXRpYyBzc2l6ZV90IGZvb19zdG9yZShzdHJ1Y3QgZm9vX29iaiAqZm9vX29iaiwgc3RydWN0IGZvb19hdHRyaWJ1dGUgKmF0dHIsCiAJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0Jc3NjYW5mKGJ1ZiwgIiVkdSIsICZmb29fb2JqLT5mb28pOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG9pbnQoYnVmLCAxMCwgJmZvb19vYmotPmZvbyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTE0Nyw5ICsxNTIsMTIgQEAKIHN0YXRpYyBzc2l6ZV90IGJfc3RvcmUoc3RydWN0IGZvb19vYmogKmZvb19vYmosIHN0cnVjdCBmb29fYXR0cmlidXRlICphdHRyLAogCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JaW50IHZhcjsKKwlpbnQgdmFyLCByZXQ7CiAKLQlzc2NhbmYoYnVmLCAiJWR1IiwgJnZhcik7CisJcmV0ID0ga3N0cnRvaW50KGJ1ZiwgMTAsICZ2YXIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCiAJaWYgKHN0cmNtcChhdHRyLT5hdHRyLm5hbWUsICJiYXoiKSA9PSAwKQogCQlmb29fb2JqLT5iYXogPSB2YXI7CiAJZWxzZQpAQCAtMjc3LDUgKzI4NSw1IEBACiAKIG1vZHVsZV9pbml0KGV4YW1wbGVfaW5pdCk7CiBtb2R1bGVfZXhpdChleGFtcGxlX2V4aXQpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogTU9EVUxFX0FVVEhPUigiR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVnQGtyb2FoLmNvbT4iKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcGt0Z2VuL3BrdGdlbi5jb25mLTEtMSBiL3NhbXBsZXMvcGt0Z2VuL3BrdGdlbi5jb25mLTEtMQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOTFkYWFkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9wa3RnZW4vcGt0Z2VuLmNvbmYtMS0xCkBAIC0wLDAgKzEsNTkgQEAKKyMhL2Jpbi9iYXNoCisKKyNtb2Rwcm9iZSBwa3RnZW4KKworCitmdW5jdGlvbiBwZ3NldCgpIHsKKyAgICBsb2NhbCByZXN1bHQKKworICAgIGVjaG8gJDEgPiAkUEdERVYKKworICAgIHJlc3VsdD1gY2F0ICRQR0RFViB8IGZncmVwICJSZXN1bHQ6IE9LOiJgCisgICAgaWYgWyAiJHJlc3VsdCIgPSAiIiBdOyB0aGVuCisgICAgICAgICBjYXQgJFBHREVWIHwgZmdyZXAgUmVzdWx0OgorICAgIGZpCit9CisKKyMgQ29uZmlnIFN0YXJ0IEhlcmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisjIHRocmVhZCBjb25maWcKKyMgRWFjaCBDUFUgaGFzIGl0cyBvd24gdGhyZWFkLiBPbmUgQ1BVIGV4YW1wbGUuIFdlIGFkZCBldGgxLgorCitQR0RFVj0vcHJvYy9uZXQvcGt0Z2VuL2twa3RnZW5kXzAKKyAgZWNobyAiUmVtb3ZpbmcgYWxsIGRldmljZXMiCisgcGdzZXQgInJlbV9kZXZpY2VfYWxsIgorICBlY2hvICJBZGRpbmcgZXRoMSIKKyBwZ3NldCAiYWRkX2RldmljZSBldGgxIgorCisKKyMgZGV2aWNlIGNvbmZpZworIyBkZWxheSAwIG1lYW5zIG1heGltdW0gc3BlZWQuCisKK0NMT05FX1NLQj0iY2xvbmVfc2tiIDEwMDAwMDAiCisjIE5JQyBhZGRzIDQgYnl0ZXMgQ1JDCitQS1RfU0laRT0icGt0X3NpemUgNjAiCisKKyMgQ09VTlQgMCBtZWFucyBmb3JldmVyCisjQ09VTlQ9ImNvdW50IDAiCitDT1VOVD0iY291bnQgMTAwMDAwMDAiCitERUxBWT0iZGVsYXkgMCIKKworUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9ldGgxCisgIGVjaG8gIkNvbmZpZ3VyaW5nICRQR0RFViIKKyBwZ3NldCAiJENPVU5UIgorIHBnc2V0ICIkQ0xPTkVfU0tCIgorIHBnc2V0ICIkUEtUX1NJWkUiCisgcGdzZXQgIiRERUxBWSIKKyBwZ3NldCAiZHN0IDEwLjEwLjExLjIiCisgcGdzZXQgImRzdF9tYWMgIDAwOjA0OjIzOjA4OjkxOmRjIgorCisKKyMgVGltZSB0byBydW4KK1BHREVWPS9wcm9jL25ldC9wa3RnZW4vcGdjdHJsCisKKyBlY2hvICJSdW5uaW5nLi4uIGN0cmxeQyB0byBzdG9wIgorIHRyYXAgdHJ1ZSBJTlQKKyBwZ3NldCAic3RhcnQiCisgZWNobyAiRG9uZSIKKyBjYXQgL3Byb2MvbmV0L3BrdGdlbi9ldGgxCmRpZmYgLS1naXQgYS9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0xLTEtZmxvd3MgYi9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0xLTEtZmxvd3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDgxNzQ5YwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcGt0Z2VuL3BrdGdlbi5jb25mLTEtMS1mbG93cwpAQCAtMCwwICsxLDY3IEBACisjIS9iaW4vYmFzaAorCisjbW9kcHJvYmUgcGt0Z2VuCisKKworZnVuY3Rpb24gcGdzZXQoKSB7CisgICAgbG9jYWwgcmVzdWx0CisKKyAgICBlY2hvICQxID4gJFBHREVWCisKKyAgICByZXN1bHQ9YGNhdCAkUEdERVYgfCBmZ3JlcCAiUmVzdWx0OiBPSzoiYAorICAgIGlmIFsgIiRyZXN1bHQiID0gIiIgXTsgdGhlbgorICAgICAgICAgY2F0ICRQR0RFViB8IGZncmVwIFJlc3VsdDoKKyAgICBmaQorfQorCisjIENvbmZpZyBTdGFydCBIZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIyB0aHJlYWQgY29uZmlnCisjIEVhY2ggQ1BVIGhhcyBpdHMgb3duIHRocmVhZC4gT25lIENQVSBleGFtcGxlLiBXZSBhZGQgZXRoMS4KKworUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9rcGt0Z2VuZF8wCisgIGVjaG8gIlJlbW92aW5nIGFsbCBkZXZpY2VzIgorIHBnc2V0ICJyZW1fZGV2aWNlX2FsbCIKKyAgZWNobyAiQWRkaW5nIGV0aDEiCisgcGdzZXQgImFkZF9kZXZpY2UgZXRoMSIKKworCisjIGRldmljZSBjb25maWcKKyMgZGVsYXkgMAorIyBXZSBuZWVkIHRvIGRvIGFsbG9jIGZvciBldmVyeSBza2Igc2luY2Ugd2UgY2Fubm90IGNsb25lIGhlcmUuCisKK0NMT05FX1NLQj0iY2xvbmVfc2tiIDAiCisjIE5JQyBhZGRzIDQgYnl0ZXMgQ1JDCitQS1RfU0laRT0icGt0X3NpemUgNjAiCisKKyMgQ09VTlQgMCBtZWFucyBmb3JldmVyCisjQ09VTlQ9ImNvdW50IDAiCitDT1VOVD0iY291bnQgMTAwMDAwMDAiCitERUxBWT0iZGVsYXkgMCIKKworUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9ldGgxCisgIGVjaG8gIkNvbmZpZ3VyaW5nICRQR0RFViIKKyBwZ3NldCAiJENPVU5UIgorIHBnc2V0ICIkQ0xPTkVfU0tCIgorIHBnc2V0ICIkUEtUX1NJWkUiCisgcGdzZXQgIiRERUxBWSIKKyAjIFJhbmRvbSBhZGRyZXNzIHdpdGggaW4gdGhlIG1pbi1tYXggcmFuZ2UKKyBwZ3NldCAiZmxhZyBJUERTVF9STkQiCisgcGdzZXQgImRzdF9taW4gMTAuMC4wLjAiCisgcGdzZXQgImRzdF9tYXggMTAuMjU1LjI1NS4yNTUiCisKKyAjIDhrIENvbmN1cnJlbnQgZmxvd3MgYXQgNCBwa3RzCisgcGdzZXQgImZsb3dzIDgxOTIiCisgcGdzZXQgImZsb3dsZW4gNCIKKworIHBnc2V0ICJkc3RfbWFjICAwMDowNDoyMzowODo5MTpkYyIKKworIyBUaW1lIHRvIHJ1bgorUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9wZ2N0cmwKKworIGVjaG8gIlJ1bm5pbmcuLi4gY3RybF5DIHRvIHN0b3AiCisgdHJhcCB0cnVlIElOVAorIHBnc2V0ICJzdGFydCIKKyBlY2hvICJEb25lIgorIGNhdCAvcHJvYy9uZXQvcGt0Z2VuL2V0aDEKZGlmZiAtLWdpdCBhL3NhbXBsZXMvcGt0Z2VuL3BrdGdlbi5jb25mLTEtMS1pcDYgYi9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0xLTEtaXA2Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiOWZmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0xLTEtaXA2CkBAIC0wLDAgKzEsNjAgQEAKKyMhL2Jpbi9iYXNoCisKKyNtb2Rwcm9iZSBwa3RnZW4KKworCitmdW5jdGlvbiBwZ3NldCgpIHsKKyAgICBsb2NhbCByZXN1bHQKKworICAgIGVjaG8gJDEgPiAkUEdERVYKKworICAgIHJlc3VsdD1gY2F0ICRQR0RFViB8IGZncmVwICJSZXN1bHQ6IE9LOiJgCisgICAgaWYgWyAiJHJlc3VsdCIgPSAiIiBdOyB0aGVuCisgICAgICAgICBjYXQgJFBHREVWIHwgZmdyZXAgUmVzdWx0OgorICAgIGZpCit9CisKKyMgQ29uZmlnIFN0YXJ0IEhlcmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisjIHRocmVhZCBjb25maWcKKyMgRWFjaCBDUFUgaGFzIGl0cyBvd24gdGhyZWFkLiBPbmUgQ1BVIGV4YW1wbGUuIFdlIGFkZCBldGgxLgorIyBJUHY2LiBOb3RlIGluY3JlYXNlIGluIG1pbmltYWwgcGFja2V0IGxlbmd0aAorCitQR0RFVj0vcHJvYy9uZXQvcGt0Z2VuL2twa3RnZW5kXzAKKyAgZWNobyAiUmVtb3ZpbmcgYWxsIGRldmljZXMiCisgcGdzZXQgInJlbV9kZXZpY2VfYWxsIgorICBlY2hvICJBZGRpbmcgZXRoMSIKKyBwZ3NldCAiYWRkX2RldmljZSBldGgxIgorCisKKyMgZGV2aWNlIGNvbmZpZworIyBkZWxheSAwCisKK0NMT05FX1NLQj0iY2xvbmVfc2tiIDEwMDAwMDAiCisjIE5JQyBhZGRzIDQgYnl0ZXMgQ1JDCitQS1RfU0laRT0icGt0X3NpemUgNjYiCisKKyMgQ09VTlQgMCBtZWFucyBmb3JldmVyCisjQ09VTlQ9ImNvdW50IDAiCitDT1VOVD0iY291bnQgMTAwMDAwMDAiCitERUxBWT0iZGVsYXkgMCIKKworUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9ldGgxCisgIGVjaG8gIkNvbmZpZ3VyaW5nICRQR0RFViIKKyBwZ3NldCAiJENPVU5UIgorIHBnc2V0ICIkQ0xPTkVfU0tCIgorIHBnc2V0ICIkUEtUX1NJWkUiCisgcGdzZXQgIiRERUxBWSIKKyBwZ3NldCAiZHN0NiBmZWMwOjoxIgorIHBnc2V0ICJzcmM2IGZlYzA6OjIiCisgcGdzZXQgImRzdF9tYWMgIDAwOjA0OjIzOjA4OjkxOmRjIgorCisjIFRpbWUgdG8gcnVuCitQR0RFVj0vcHJvYy9uZXQvcGt0Z2VuL3BnY3RybAorCisgZWNobyAiUnVubmluZy4uLiBjdHJsXkMgdG8gc3RvcCIKKyB0cmFwIHRydWUgSU5UCisgcGdzZXQgInN0YXJ0IgorIGVjaG8gIkRvbmUiCisgY2F0IC9wcm9jL25ldC9wa3RnZW4vZXRoMQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9wa3RnZW4vcGt0Z2VuLmNvbmYtMS0xLWlwNi1yZG9zIGIvc2FtcGxlcy9wa3RnZW4vcGt0Z2VuLmNvbmYtMS0xLWlwNi1yZG9zCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFkOThlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0xLTEtaXA2LXJkb3MKQEAgLTAsMCArMSw2MyBAQAorIyEvYmluL2Jhc2gKKworI21vZHByb2JlIHBrdGdlbgorCisKK2Z1bmN0aW9uIHBnc2V0KCkgeworICAgIGxvY2FsIHJlc3VsdAorCisgICAgZWNobyAkMSA+ICRQR0RFVgorCisgICAgcmVzdWx0PWBjYXQgJFBHREVWIHwgZmdyZXAgIlJlc3VsdDogT0s6ImAKKyAgICBpZiBbICIkcmVzdWx0IiA9ICIiIF07IHRoZW4KKyAgICAgICAgIGNhdCAkUEdERVYgfCBmZ3JlcCBSZXN1bHQ6CisgICAgZmkKK30KKworIyBDb25maWcgU3RhcnQgSGVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyMgdGhyZWFkIGNvbmZpZworIyBFYWNoIENQVSBoYXMgaXRzIG93biB0aHJlYWQuIE9uZSBDUFUgZXhhbXBsZS4gV2UgYWRkIGV0aDEuCisjIElQdjYuIE5vdGUgaW5jcmVhc2UgaW4gbWluaW1hbCBwYWNrZXQgbGVuZ3RoCisKK1BHREVWPS9wcm9jL25ldC9wa3RnZW4va3BrdGdlbmRfMAorICBlY2hvICJSZW1vdmluZyBhbGwgZGV2aWNlcyIKKyBwZ3NldCAicmVtX2RldmljZV9hbGwiCisgIGVjaG8gIkFkZGluZyBldGgxIgorIHBnc2V0ICJhZGRfZGV2aWNlIGV0aDEiCisKKworIyBkZXZpY2UgY29uZmlnCisjIGRlbGF5IDAgbWVhbnMgbWF4aW11bSBzcGVlZC4KKworIyBXZSBuZWVkIHRvIGRvIGFsbG9jIGZvciBldmVyeSBza2Igc2luY2Ugd2UgY2Fubm90IGNsb25lIGhlcmUuCitDTE9ORV9TS0I9ImNsb25lX3NrYiAwIgorCisjIE5JQyBhZGRzIDQgYnl0ZXMgQ1JDCitQS1RfU0laRT0icGt0X3NpemUgNjYiCisKKyMgQ09VTlQgMCBtZWFucyBmb3JldmVyCisjQ09VTlQ9ImNvdW50IDAiCitDT1VOVD0iY291bnQgMTAwMDAwMDAiCitERUxBWT0iZGVsYXkgMCIKKworUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9ldGgxCisgIGVjaG8gIkNvbmZpZ3VyaW5nICRQR0RFViIKKyBwZ3NldCAiJENPVU5UIgorIHBnc2V0ICIkQ0xPTkVfU0tCIgorIHBnc2V0ICIkUEtUX1NJWkUiCisgcGdzZXQgIiRERUxBWSIKKyBwZ3NldCAiZHN0Nl9taW4gZmVjMDo6MSIKKyBwZ3NldCAiZHN0Nl9tYXggZmVjMDo6RkZGRjpGRkZGIgorCisgcGdzZXQgImRzdF9tYWMgIDAwOjA0OjIzOjA4OjkxOmRjIgorCisjIFRpbWUgdG8gcnVuCitQR0RFVj0vcHJvYy9uZXQvcGt0Z2VuL3BnY3RybAorCisgZWNobyAiUnVubmluZy4uLiBjdHJsXkMgdG8gc3RvcCIKKyB0cmFwIHRydWUgSU5UCisgcGdzZXQgInN0YXJ0IgorIGVjaG8gIkRvbmUiCisgY2F0IC9wcm9jL25ldC9wa3RnZW4vZXRoMQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9wa3RnZW4vcGt0Z2VuLmNvbmYtMS0xLXJkb3MgYi9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0xLTEtcmRvcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNzU1M2JlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9wa3RnZW4vcGt0Z2VuLmNvbmYtMS0xLXJkb3MKQEAgLTAsMCArMSw2NCBAQAorIyEvYmluL2Jhc2gKKworI21vZHByb2JlIHBrdGdlbgorCisKK2Z1bmN0aW9uIHBnc2V0KCkgeworICAgIGxvY2FsIHJlc3VsdAorCisgICAgZWNobyAkMSA+ICRQR0RFVgorCisgICAgcmVzdWx0PWBjYXQgJFBHREVWIHwgZmdyZXAgIlJlc3VsdDogT0s6ImAKKyAgICBpZiBbICIkcmVzdWx0IiA9ICIiIF07IHRoZW4KKyAgICAgICAgIGNhdCAkUEdERVYgfCBmZ3JlcCBSZXN1bHQ6CisgICAgZmkKK30KKworIyBDb25maWcgU3RhcnQgSGVyZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyMgdGhyZWFkIGNvbmZpZworIyBFYWNoIENQVSBoYXMgaXRzIG93biB0aHJlYWQuIE9uZSBDUFUgZXhhbXBsZS4gV2UgYWRkIGV0aDEuCisKK1BHREVWPS9wcm9jL25ldC9wa3RnZW4va3BrdGdlbmRfMAorICBlY2hvICJSZW1vdmluZyBhbGwgZGV2aWNlcyIKKyBwZ3NldCAicmVtX2RldmljZV9hbGwiCisgIGVjaG8gIkFkZGluZyBldGgxIgorIHBnc2V0ICJhZGRfZGV2aWNlIGV0aDEiCisKKworIyBkZXZpY2UgY29uZmlnCisjIGRlbGF5IDAKKworIyBXZSBuZWVkIHRvIGRvIGFsbG9jIGZvciBldmVyeSBza2Igc2luY2Ugd2UgY2Fubm90IGNsb25lIGhlcmUuCisKK0NMT05FX1NLQj0iY2xvbmVfc2tiIDAiCisjIE5JQyBhZGRzIDQgYnl0ZXMgQ1JDCitQS1RfU0laRT0icGt0X3NpemUgNjAiCisKKyMgQ09VTlQgMCBtZWFucyBmb3JldmVyCisjQ09VTlQ9ImNvdW50IDAiCitDT1VOVD0iY291bnQgMTAwMDAwMDAiCitERUxBWT0iZGVsYXkgMCIKKworUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9ldGgxCisgIGVjaG8gIkNvbmZpZ3VyaW5nICRQR0RFViIKKyBwZ3NldCAiJENPVU5UIgorIHBnc2V0ICIkQ0xPTkVfU0tCIgorIHBnc2V0ICIkUEtUX1NJWkUiCisgcGdzZXQgIiRERUxBWSIKKyAjIFJhbmRvbSBhZGRyZXNzIHdpdGggaW4gdGhlIG1pbi1tYXggcmFuZ2UKKyBwZ3NldCAiZmxhZyBJUERTVF9STkQiCisgcGdzZXQgImRzdF9taW4gMTAuMC4wLjAiCisgcGdzZXQgImRzdF9tYXggMTAuMjU1LjI1NS4yNTUiCisKKyBwZ3NldCAiZHN0X21hYyAgMDA6MDQ6MjM6MDg6OTE6ZGMiCisKKyMgVGltZSB0byBydW4KK1BHREVWPS9wcm9jL25ldC9wa3RnZW4vcGdjdHJsCisKKyBlY2hvICJSdW5uaW5nLi4uIGN0cmxeQyB0byBzdG9wIgorIHRyYXAgdHJ1ZSBJTlQKKyBwZ3NldCAic3RhcnQiCisgZWNobyAiRG9uZSIKKyBjYXQgL3Byb2MvbmV0L3BrdGdlbi9ldGgxCmRpZmYgLS1naXQgYS9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0xLTIgYi9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0xLTIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmE0ZWIyNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcGt0Z2VuL3BrdGdlbi5jb25mLTEtMgpAQCAtMCwwICsxLDY5IEBACisjIS9iaW4vYmFzaAorCisjbW9kcHJvYmUgcGt0Z2VuCisKKworZnVuY3Rpb24gcGdzZXQoKSB7CisgICAgbG9jYWwgcmVzdWx0CisKKyAgICBlY2hvICQxID4gJFBHREVWCisKKyAgICByZXN1bHQ9YGNhdCAkUEdERVYgfCBmZ3JlcCAiUmVzdWx0OiBPSzoiYAorICAgIGlmIFsgIiRyZXN1bHQiID0gIiIgXTsgdGhlbgorICAgICAgICAgY2F0ICRQR0RFViB8IGZncmVwIFJlc3VsdDoKKyAgICBmaQorfQorCisjIENvbmZpZyBTdGFydCBIZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIyB0aHJlYWQgY29uZmlnCisjIE9uZSBDUFUgbWVhbnMgb25lIHRocmVhZC4gT25lIENQVSBleGFtcGxlLiBXZSBhZGQgZXRoMSwgZXRoMiByZXNwZWN0aXZseS4KKworUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9rcGt0Z2VuZF8wCisgIGVjaG8gIlJlbW92aW5nIGFsbCBkZXZpY2VzIgorIHBnc2V0ICJyZW1fZGV2aWNlX2FsbCIKKyAgZWNobyAiQWRkaW5nIGV0aDEiCisgcGdzZXQgImFkZF9kZXZpY2UgZXRoMSIKKyAgZWNobyAiQWRkaW5nIGV0aDIiCisgcGdzZXQgImFkZF9kZXZpY2UgZXRoMiIKKworCisjIGRldmljZSBjb25maWcKKyMgZGVsYXkgMCBtZWFucyBtYXhpbXVtIHNwZWVkLgorCitDTE9ORV9TS0I9ImNsb25lX3NrYiAxMDAwMDAwIgorIyBOSUMgYWRkcyA0IGJ5dGVzIENSQworUEtUX1NJWkU9InBrdF9zaXplIDYwIgorCisjIENPVU5UIDAgbWVhbnMgZm9yZXZlcgorI0NPVU5UPSJjb3VudCAwIgorQ09VTlQ9ImNvdW50IDEwMDAwMDAwIgorREVMQVk9ImRlbGF5IDAiCisKK1BHREVWPS9wcm9jL25ldC9wa3RnZW4vZXRoMQorICBlY2hvICJDb25maWd1cmluZyAkUEdERVYiCisgcGdzZXQgIiRDT1VOVCIKKyBwZ3NldCAiJENMT05FX1NLQiIKKyBwZ3NldCAiJFBLVF9TSVpFIgorIHBnc2V0ICIkREVMQVkiCisgcGdzZXQgImRzdCAxMC4xMC4xMS4yIgorIHBnc2V0ICJkc3RfbWFjICAwMDowNDoyMzowODo5MTpkYyIKKworUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9ldGgyCisgIGVjaG8gIkNvbmZpZ3VyaW5nICRQR0RFViIKKyBwZ3NldCAiJENPVU5UIgorIHBnc2V0ICIkQ0xPTkVfU0tCIgorIHBnc2V0ICIkUEtUX1NJWkUiCisgcGdzZXQgIiRERUxBWSIKKyBwZ3NldCAiZHN0IDE5Mi4xNjguMi4yIgorIHBnc2V0ICJkc3RfbWFjICAwMDowNDoyMzowODo5MTpkZSIKKworIyBUaW1lIHRvIHJ1bgorUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9wZ2N0cmwKKworIGVjaG8gIlJ1bm5pbmcuLi4gY3RybF5DIHRvIHN0b3AiCisgdHJhcCB0cnVlIElOVAorIHBnc2V0ICJzdGFydCIKKyBlY2hvICJEb25lIgorIGNhdCAvcHJvYy9uZXQvcGt0Z2VuL2V0aDEgL3Byb2MvbmV0L3BrdGdlbi9ldGgyCmRpZmYgLS1naXQgYS9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0yLTEgYi9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0yLTEKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTEwOGU5NwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcGt0Z2VuL3BrdGdlbi5jb25mLTItMQpAQCAtMCwwICsxLDY2IEBACisjIS9iaW4vYmFzaAorCisjbW9kcHJvYmUgcGt0Z2VuCisKKworZnVuY3Rpb24gcGdzZXQoKSB7CisgICAgbG9jYWwgcmVzdWx0CisKKyAgICBlY2hvICQxID4gJFBHREVWCisKKyAgICByZXN1bHQ9YGNhdCAkUEdERVYgfCBmZ3JlcCAiUmVzdWx0OiBPSzoiYAorICAgIGlmIFsgIiRyZXN1bHQiID0gIiIgXTsgdGhlbgorICAgICAgICAgY2F0ICRQR0RFViB8IGZncmVwIFJlc3VsdDoKKyAgICBmaQorfQorCisjIENvbmZpZyBTdGFydCBIZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIyB0aHJlYWQgY29uZmlnCisjIEVhY2ggQ1BVIGhhcyBpdHMgb3duIHRocmVhZC4gVHdvIENQVSBleGFtcGxlLiBXZSBhZGQgZXRoMSB0byB0aGUgZmlyc3QKKyMgYW5kIGxlYXZlIHRoZSBzZWNvbmQgaWRsZS4KKworUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9rcGt0Z2VuZF8wCisgIGVjaG8gIlJlbW92aW5nIGFsbCBkZXZpY2VzIgorIHBnc2V0ICJyZW1fZGV2aWNlX2FsbCIKKyAgZWNobyAiQWRkaW5nIGV0aDEiCisgcGdzZXQgImFkZF9kZXZpY2UgZXRoMSIKKworIyBXZSBuZWVkIHRvIHJlbW92ZSBvbGQgY29uZmlnIHNpbmNlIHdlIGRvbnQgdXNlIHRoaXMgdGhyZWFkLiBXZSBjYW4gb25seQorIyBvbmUgTklDIG9uIG9uZSBDUFUgZHVlIHRvIGFmZmluaXR5IHJlYXNvbnMuCisKK1BHREVWPS9wcm9jL25ldC9wa3RnZW4va3BrdGdlbmRfMQorICBlY2hvICJSZW1vdmluZyBhbGwgZGV2aWNlcyIKKyBwZ3NldCAicmVtX2RldmljZV9hbGwiCisKKyMgZGV2aWNlIGNvbmZpZworIyBkZWxheSAwIG1lYW5zIG1heGltdW0gc3BlZWQuCisKK0NMT05FX1NLQj0iY2xvbmVfc2tiIDEwMDAwMDAiCisjIE5JQyBhZGRzIDQgYnl0ZXMgQ1JDCitQS1RfU0laRT0icGt0X3NpemUgNjAiCisKKyMgQ09VTlQgMCBtZWFucyBmb3JldmVyCisjQ09VTlQ9ImNvdW50IDAiCitDT1VOVD0iY291bnQgMTAwMDAwMDAiCitERUxBWT0iZGVsYXkgMCIKKworUEdERVY9L3Byb2MvbmV0L3BrdGdlbi9ldGgxCisgIGVjaG8gIkNvbmZpZ3VyaW5nICRQR0RFViIKKyBwZ3NldCAiJENPVU5UIgorIHBnc2V0ICIkQ0xPTkVfU0tCIgorIHBnc2V0ICIkUEtUX1NJWkUiCisgcGdzZXQgIiRERUxBWSIKKyBwZ3NldCAiZHN0IDEwLjEwLjExLjIiCisgcGdzZXQgImRzdF9tYWMgIDAwOjA0OjIzOjA4OjkxOmRjIgorCisKKyMgVGltZSB0byBydW4KK1BHREVWPS9wcm9jL25ldC9wa3RnZW4vcGdjdHJsCisKKyBlY2hvICJSdW5uaW5nLi4uIGN0cmxeQyB0byBzdG9wIgorIHRyYXAgdHJ1ZSBJTlQKKyBwZ3NldCAic3RhcnQiCisgZWNobyAiRG9uZSIKKyBjYXQgL3Byb2MvbmV0L3BrdGdlbi9ldGgxCmRpZmYgLS1naXQgYS9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0yLTIgYi9zYW1wbGVzL3BrdGdlbi9wa3RnZW4uY29uZi0yLTIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWNlYTE1NQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvcGt0Z2VuL3BrdGdlbi5jb25mLTItMgpAQCAtMCwwICsxLDczIEBACisjIS9iaW4vYmFzaAorCisjbW9kcHJvYmUgcGt0Z2VuCisKKworZnVuY3Rpb24gcGdzZXQoKSB7CisgICAgbG9jYWwgcmVzdWx0CisKKyAgICBlY2hvICQxID4gJFBHREVWCisKKyAgICByZXN1bHQ9YGNhdCAkUEdERVYgfCBmZ3JlcCAiUmVzdWx0OiBPSzoiYAorICAgIGlmIFsgIiRyZXN1bHQiID0gIiIgXTsgdGhlbgorICAgICAgICAgY2F0ICRQR0RFViB8IGZncmVwIFJlc3VsdDoKKyAgICBmaQorfQorCisjIENvbmZpZyBTdGFydCBIZXJlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIyB0aHJlYWQgY29uZmlnCisjIEVhY2ggQ1BVIGhhcyBpdHMgb3duIHRocmVhZC4gVHdvIENQVSBleGFtcGxlLiBXZSBhZGQgZXRoMSwgZXRoMiByZXNwZWN0aXZlbHkuCisKK1BHREVWPS9wcm9jL25ldC9wa3RnZW4va3BrdGdlbmRfMAorICBlY2hvICJSZW1vdmluZyBhbGwgZGV2aWNlcyIKKyBwZ3NldCAicmVtX2RldmljZV9hbGwiCisgIGVjaG8gIkFkZGluZyBldGgxIgorIHBnc2V0ICJhZGRfZGV2aWNlIGV0aDEiCisKK1BHREVWPS9wcm9jL25ldC9wa3RnZW4va3BrdGdlbmRfMQorICBlY2hvICJSZW1vdmluZyBhbGwgZGV2aWNlcyIKKyBwZ3NldCAicmVtX2RldmljZV9hbGwiCisgIGVjaG8gIkFkZGluZyBldGgyIgorIHBnc2V0ICJhZGRfZGV2aWNlIGV0aDIiCisKKworIyBkZXZpY2UgY29uZmlnCisjIGRlbGF5IDAgbWVhbnMgbWF4aW11bSBzcGVlZC4KKworQ0xPTkVfU0tCPSJjbG9uZV9za2IgMTAwMDAwMCIKKyMgTklDIGFkZHMgNCBieXRlcyBDUkMKK1BLVF9TSVpFPSJwa3Rfc2l6ZSA2MCIKKworIyBDT1VOVCAwIG1lYW5zIGZvcmV2ZXIKKyNDT1VOVD0iY291bnQgMCIKK0NPVU5UPSJjb3VudCAxMDAwMDAwMCIKK0RFTEFZPSJkZWxheSAwIgorCitQR0RFVj0vcHJvYy9uZXQvcGt0Z2VuL2V0aDEKKyAgZWNobyAiQ29uZmlndXJpbmcgJFBHREVWIgorIHBnc2V0ICIkQ09VTlQiCisgcGdzZXQgIiRDTE9ORV9TS0IiCisgcGdzZXQgIiRQS1RfU0laRSIKKyBwZ3NldCAiJERFTEFZIgorIHBnc2V0ICJkc3QgMTAuMTAuMTEuMiIKKyBwZ3NldCAiZHN0X21hYyAgMDA6MDQ6MjM6MDg6OTE6ZGMiCisKK1BHREVWPS9wcm9jL25ldC9wa3RnZW4vZXRoMgorICBlY2hvICJDb25maWd1cmluZyAkUEdERVYiCisgcGdzZXQgIiRDT1VOVCIKKyBwZ3NldCAiJENMT05FX1NLQiIKKyBwZ3NldCAiJFBLVF9TSVpFIgorIHBnc2V0ICIkREVMQVkiCisgcGdzZXQgImRzdCAxOTIuMTY4LjIuMiIKKyBwZ3NldCAiZHN0X21hYyAgMDA6MDQ6MjM6MDg6OTE6ZGUiCisKKyMgVGltZSB0byBydW4KK1BHREVWPS9wcm9jL25ldC9wa3RnZW4vcGdjdHJsCisKKyBlY2hvICJSdW5uaW5nLi4uIGN0cmxeQyB0byBzdG9wIgorIHRyYXAgdHJ1ZSBJTlQKKyBwZ3NldCAic3RhcnQiCisgZWNobyAiRG9uZSIKKyBjYXQgL3Byb2MvbmV0L3BrdGdlbi9ldGgxIC9wcm9jL25ldC9wa3RnZW4vZXRoMgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmFjZV9ldmVudHMvdHJhY2UtZXZlbnRzLXNhbXBsZS5oIGIvc2FtcGxlcy90cmFjZV9ldmVudHMvdHJhY2UtZXZlbnRzLXNhbXBsZS5oCmluZGV4IGEyYzhiMDIuLjg5NjVkMWIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvdHJhY2VfZXZlbnRzL3RyYWNlLWV2ZW50cy1zYW1wbGUuaAorKysgYi9zYW1wbGVzL3RyYWNlX2V2ZW50cy90cmFjZS1ldmVudHMtc2FtcGxlLmgKQEAgLTIyLDcgKzIyLDI1IEBACiAgKiBwcm90ZWN0aW9uLCBqdXN0IGxpa2UgVFJBQ0VfSU5DTFVERV9GSUxFLgogICovCiAjdW5kZWYgVFJBQ0VfU1lTVEVNCi0jZGVmaW5lIFRSQUNFX1NZU1RFTSBzYW1wbGUKKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIHNhbXBsZS10cmFjZQorCisvKgorICogVFJBQ0VfU1lTVEVNIGlzIGV4cGVjdGVkIHRvIGJlIGEgQyB2YWxpZCB2YXJpYWJsZSAoYWxwaGEtbnVtZXJpYworICogYW5kIHVuZGVyc2NvcmUpLCBhbHRob3VnaCBpdCBtYXkgc3RhcnQgd2l0aCBudW1iZXJzLiBJZiBmb3Igc29tZQorICogcmVhc29uIGl0IGlzIG5vdCwgeW91IG5lZWQgdG8gYWRkIHRoZSBmb2xsb3dpbmcgbGluZXM6CisgKi8KKyN1bmRlZiBUUkFDRV9TWVNURU1fVkFSCisjZGVmaW5lIFRSQUNFX1NZU1RFTV9WQVIgc2FtcGxlX3RyYWNlCisvKgorICogQnV0IHRoZSBhYm92ZSBpcyBvbmx5IG5lZWRlZCBpZiBUUkFDRV9TWVNURU0gaXMgbm90IGFscGhhLW51bWVyaWMKKyAqIGFuZCB1bmRlcnNjb3JlZC4gQnkgZGVmYXVsdCwgVFJBQ0VfU1lTVEVNX1ZBUiB3aWxsIGJlIGVxdWFsIHRvCisgKiBUUkFDRV9TWVNURU0uIEFzIFRSQUNFX1NZU1RFTV9WQVIgbXVzdCBiZSBhbHBoYS1udW1lcmljLCBpZgorICogVFJBQ0VfU1lTVEVNIGlzIG5vdCwgdGhlbiBUUkFDRV9TWVNURU1fVkFSIG11c3QgYmUgZGVmaW5lZCB3aXRoCisgKiBvbmx5IGFscGhhLW51bWVyaWMgYW5kIHVuZGVyc2NvcmVzLgorICoKKyAqIFRoZSBUUkFDRV9TWVNURU1fVkFSIGlzIG9ubHkgdXNlZCBpbnRlcm5hbGx5IGFuZCBub3QgdmlzaWJsZSB0bworICogdXNlciBzcGFjZS4KKyAqLwogCiAvKgogICogTm90aWNlIHRoYXQgdGhpcyBmaWxlIGlzIG5vdCBwcm90ZWN0ZWQgbGlrZSBhIG5vcm1hbCBoZWFkZXIuCkBAIC0xODAsOCArMTk4LDMwIEBACiAJCTsKIAlyZXR1cm4gaTsKIH0KKworZW51bSB7CisJVFJBQ0VfU0FNUExFX0ZPTyA9IDIsCisJVFJBQ0VfU0FNUExFX0JBUiA9IDQsCisJVFJBQ0VfU0FNUExFX1pPTyA9IDgsCit9OwogI2VuZGlmCiAKKy8qCisgKiBJZiBlbnVtcyBhcmUgdXNlZCBpbiB0aGUgVFBfcHJpbnRrKCksIHRoZWlyIG5hbWVzIHdpbGwgYmUgc2hvd24gaW4KKyAqIGZvcm1hdCBmaWxlcyBhbmQgbm90IHRoZWlyIHZhbHVlcy4gVGhpcyBjYW4gY2F1c2UgcHJvYmxlbXMgd2l0aCB1c2VyCisgKiBzcGFjZSBwcm9ncmFtcyB0aGF0IHBhcnNlIHRoZSBmb3JtYXQgZmlsZXMgdG8ga25vdyBob3cgdG8gdHJhbnNsYXRlCisgKiB0aGUgcmF3IGJpbmFyeSB0cmFjZSBvdXRwdXQgaW50byBodW1hbiByZWFkYWJsZSB0ZXh0LgorICoKKyAqIFRvIGhlbHAgb3V0IHVzZXIgc3BhY2UgcHJvZ3JhbXMsIGFueSBlbnVtIHRoYXQgaXMgdXNlZCBpbiB0aGUgVFBfcHJpbnRrKCkKKyAqIHNob3VsZCBiZSBkZWZpbmVkIGJ5IFRSQUNFX0RFRklORV9FTlVNKCkgbWFjcm8uIEFsbCB0aGF0IGlzIG5lZWRlZCB0bworICogYmUgZG9uZSBpcyB0byBhZGQgdGhpcyBtYWNybyB3aXRoIHRoZSBlbnVtIHdpdGhpbiBpdCBpbiB0aGUgdHJhY2UKKyAqIGhlYWRlciBmaWxlLCBhbmQgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgaW4gdGhlIG91dHB1dC4KKyAqLworCitUUkFDRV9ERUZJTkVfRU5VTShUUkFDRV9TQU1QTEVfRk9PKTsKK1RSQUNFX0RFRklORV9FTlVNKFRSQUNFX1NBTVBMRV9CQVIpOworVFJBQ0VfREVGSU5FX0VOVU0oVFJBQ0VfU0FNUExFX1pPTyk7CisKIFRSQUNFX0VWRU5UKGZvb19iYXIsCiAKIAlUUF9QUk9UTyhjb25zdCBjaGFyICpmb28sIGludCBiYXIsIGNvbnN0IGludCAqbHN0LApAQCAtMjA2LDcgKzI0Niw0NyBAQAogCQlfX2Fzc2lnbl9iaXRtYXNrKGNwdXMsIGNwdW1hc2tfYml0cyhtYXNrKSwgbnVtX3Bvc3NpYmxlX2NwdXMoKSk7CiAJKSwKIAotCVRQX3ByaW50aygiZm9vICVzICVkICVzICVzICglcykiLCBfX2VudHJ5LT5mb28sIF9fZW50cnktPmJhciwKKwlUUF9wcmludGsoImZvbyAlcyAlZCAlcyAlcyAlcyAlcyAoJXMpIiwgX19lbnRyeS0+Zm9vLCBfX2VudHJ5LT5iYXIsCisKKy8qCisgKiBOb3RpY2UgaGVyZSB0aGUgdXNlIG9mIHNvbWUgaGVscGVyIGZ1bmN0aW9ucy4gVGhpcyBpbmNsdWRlczoKKyAqCisgKiAgX19wcmludF9zeW1ib2xpYyggdmFyaWFibGUsIHsgdmFsdWUsICJzdHJpbmciIH0sIC4uLiApLAorICoKKyAqICAgIFRoZSB2YXJpYWJsZSBpcyB0ZXN0ZWQgYWdhaW5zdCBlYWNoIHZhbHVlIG9mIHRoZSB7IH0gcGFpci4gSWYKKyAqICAgIHRoZSB2YXJpYWJsZSBtYXRjaGVzIG9uZSBvZiB0aGUgdmFsdWVzLCB0aGVuIGl0IHdpbGwgcHJpbnQgdGhlCisgKiAgICBzdHJpbmcgaW4gdGhhdCBwYWlyLiBJZiBub24gYXJlIG1hdGNoZWQsIGl0IHJldHVybnMgYSBzdHJpbmcKKyAqICAgIHZlcnNpb24gb2YgdGhlIG51bWJlciAoaWYgX19lbnRyeS0+YmFyID09IDcgdGhlbiAiNyIgaXMgcmV0dXJuZWQpLgorICovCisJCSAgX19wcmludF9zeW1ib2xpYyhfX2VudHJ5LT5iYXIsCisJCQkJICAgeyAwLCAiemVybyIgfSwKKwkJCQkgICB7IFRSQUNFX1NBTVBMRV9GT08sICJUV08iIH0sCisJCQkJICAgeyBUUkFDRV9TQU1QTEVfQkFSLCAiRk9VUiIgfSwKKwkJCQkgICB7IFRSQUNFX1NBTVBMRV9aT08sICJFSUdIVCIgfSwKKwkJCQkgICB7IDEwLCAiVEVOIiB9CisJCQkgICksCisKKy8qCisgKiAgX19wcmludF9mbGFncyggdmFyaWFibGUsICJkZWxpbSIsIHsgdmFsdWUsICJmbGFnIiB9LCAuLi4gKSwKKyAqCisgKiAgICBUaGlzIGlzIHNpbWlsYXIgdG8gX19wcmludF9zeW1ib2xpYywgZXhjZXB0IHRoYXQgaXQgdGVzdHMgdGhlIGJpdHMKKyAqICAgIG9mIHRoZSB2YWx1ZS4gSWYgKChGTEFHICYgdmFyaWFibGUpID09IEZMQUcpIHRoZW4gdGhlIHN0cmluZyBpcworICogICAgcHJpbnRlZC4gSWYgbW9yZSB0aGFuIG9uZSBmbGFnIG1hdGNoZXMsIHRoZW4gZWFjaCBvbmUgdGhhdCBkb2VzIGlzCisgKiAgICBhbHNvIHByaW50ZWQgd2l0aCBkZWxpbSBpbiBiZXR3ZWVuIHRoZW0uCisgKiAgICBJZiBub3QgYWxsIGJpdHMgYXJlIGFjY291bnRlZCBmb3IsIHRoZW4gdGhlIG5vdCBmb3VuZCBiaXRzIHdpbGwgYmUKKyAqICAgIGFkZGVkIGluIGhleCBmb3JtYXQ6IDB4NTA2IHdpbGwgc2hvdyBCSVQyfEJJVDR8MHg1MDAKKyAqLworCQkgIF9fcHJpbnRfZmxhZ3MoX19lbnRyeS0+YmFyLCAifCIsCisJCQkJeyAxLCAiQklUMSIgfSwKKwkJCQl7IDIsICJCSVQyIiB9LAorCQkJCXsgNCwgIkJJVDMiIH0sCisJCQkJeyA4LCAiQklUNCIgfQorCQkJICApLAorLyoKKyAqICBfX3ByaW50X2FycmF5KCBhcnJheSwgbGVuLCBlbGVtZW50X3NpemUgKQorICoKKyAqICAgIFRoaXMgcHJpbnRzIG91dCB0aGUgYXJyYXkgdGhhdCBpcyBkZWZpbmVkIGJ5IF9fYXJyYXkgaW4gYSBuaWNlIGZvcm1hdC4KKyAqLwogCQkgIF9fcHJpbnRfYXJyYXkoX19nZXRfZHluYW1pY19hcnJheShsaXN0KSwKIAkJCQlfX2dldF9keW5hbWljX2FycmF5X2xlbihsaXN0KSwKIAkJCQlzaXplb2YoaW50KSksCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmR0Ymluc3QgYi9zY3JpcHRzL01ha2VmaWxlLmR0Ymluc3QKaW5kZXggOTA5ZWQ3YS4uMWMxNTcxNyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5kdGJpbnN0CisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuZHRiaW5zdApAQCAtMTgsNyArMTgsNyBAQAogCiBpbmNsdWRlIGluY2x1ZGUvY29uZmlnL2F1dG8uY29uZgogaW5jbHVkZSBzY3JpcHRzL0tidWlsZC5pbmNsdWRlCi1pbmNsdWRlICQoc3JjdHJlZSkvJChvYmopL01ha2VmaWxlCitpbmNsdWRlICQoc3JjKS9NYWtlZmlsZQogCiBQSE9OWSArPSBfX2R0YnNfaW5zdGFsbF9wcmVwCiBfX2R0YnNfaW5zdGFsbF9wcmVwOgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5md2luc3QgYi9zY3JpcHRzL01ha2VmaWxlLmZ3aW5zdAppbmRleCA1YjY5OGFkLi5iMjcyOTAwIDEwMDY0NAotLS0gYS9zY3JpcHRzL01ha2VmaWxlLmZ3aW5zdAorKysgYi9zY3JpcHRzL01ha2VmaWxlLmZ3aW5zdApAQCAtMTMsNyArMTMsNyBAQAogLWluY2x1ZGUgJChvYmp0cmVlKS8uY29uZmlnCiAKIGluY2x1ZGUgc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQotaW5jbHVkZSAkKHNyY3RyZWUpLyQob2JqKS9NYWtlZmlsZQoraW5jbHVkZSAkKHNyYykvTWFrZWZpbGUKIAogaW5jbHVkZSBzY3JpcHRzL01ha2VmaWxlLmhvc3QKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb2NjaW5lbGxlL21pc2MvYnVnb24uY29jY2kgYi9zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9idWdvbi5jb2NjaQppbmRleCAzYjdlZWMyLi4yN2M5N2YxIDEwMDY0NAotLS0gYS9zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9idWdvbi5jb2NjaQorKysgYi9zY3JpcHRzL2NvY2NpbmVsbGUvbWlzYy9idWdvbi5jb2NjaQpAQCAtNTcsNiArNTcsNiBAQAogcCA8PCByLnA7CiBAQAogCi1tc2c9IldBUk5JTkc6IFVzZSBCVUdfT04iCittc2c9IldBUk5JTkc6IFVzZSBCVUdfT04gaW5zdGVhZCBvZiBpZiBjb25kaXRpb24gZm9sbG93ZWQgYnkgQlVHLlxuUGxlYXNlIG1ha2Ugc3VyZSB0aGUgY29uZGl0aW9uIGhhcyBubyBzaWRlIGVmZmVjdHMgKHNlZSBjb25kaXRpb25hbCBCVUdfT04gZGVmaW5pdGlvbiBpbiBpbmNsdWRlL2FzbS1nZW5lcmljL2J1Zy5oKSIKIGNvY2NpbGliLnJlcG9ydC5wcmludF9yZXBvcnQocFswXSwgbXNnKQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2thbGxzeW1zLmMgYi9zY3JpcHRzL2thbGxzeW1zLmMKaW5kZXggYzZkMzNiZC4uOGZhODFlOCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rYWxsc3ltcy5jCisrKyBiL3NjcmlwdHMva2FsbHN5bXMuYwpAQCAtMjEyLDE1ICsyMTIsMjIgQEAKIAkJIl9TREFfQkFTRV8iLAkJLyogcHBjICovCiAJCSJfU0RBMl9CQVNFXyIsCQkvKiBwcGMgKi8KIAkJTlVMTCB9OworCisJc3RhdGljIGNoYXIgKnNwZWNpYWxfc3VmZml4ZXNbXSA9IHsKKwkJIl92ZW5lZXIiLAkJLyogYXJtICovCisJCU5VTEwgfTsKKwogCWludCBpOwotCWludCBvZmZzZXQgPSAxOworCWNoYXIgKnN5bV9uYW1lID0gKGNoYXIgKilzLT5zeW0gKyAxOworCiAKIAlpZiAocy0+YWRkciA8IGtlcm5lbF9zdGFydF9hZGRyKQogCQlyZXR1cm4gMDsKIAogCS8qIHNraXAgcHJlZml4IGNoYXIgKi8KLQlpZiAoc3ltYm9sX3ByZWZpeF9jaGFyICYmICoocy0+c3ltICsgMSkgPT0gc3ltYm9sX3ByZWZpeF9jaGFyKQotCQlvZmZzZXQrKzsKKwlpZiAoc3ltYm9sX3ByZWZpeF9jaGFyICYmICpzeW1fbmFtZSA9PSBzeW1ib2xfcHJlZml4X2NoYXIpCisJCXN5bV9uYW1lKys7CisKIAogCS8qIGlmIC0tYWxsLXN5bWJvbHMgaXMgbm90IHNwZWNpZmllZCwgdGhlbiBzeW1ib2xzIG91dHNpZGUgdGhlIHRleHQKIAkgKiBhbmQgaW5pdHRleHQgc2VjdGlvbnMgYXJlIGRpc2NhcmRlZCAqLwpAQCAtMjM1LDIyICsyNDIsMjYgQEAKIAkJICogcnVsZXMuCiAJCSAqLwogCQlpZiAoKHMtPmFkZHIgPT0gdGV4dF9yYW5nZV90ZXh0LT5lbmQgJiYKLQkJCQlzdHJjbXAoKGNoYXIgKilzLT5zeW0gKyBvZmZzZXQsCisJCQkJc3RyY21wKHN5bV9uYW1lLAogCQkJCSAgICAgICB0ZXh0X3JhbmdlX3RleHQtPmVuZF9zeW0pKSB8fAogCQkgICAgKHMtPmFkZHIgPT0gdGV4dF9yYW5nZV9pbml0dGV4dC0+ZW5kICYmCi0JCQkJc3RyY21wKChjaGFyICopcy0+c3ltICsgb2Zmc2V0LAorCQkJCXN0cmNtcChzeW1fbmFtZSwKIAkJCQkgICAgICAgdGV4dF9yYW5nZV9pbml0dGV4dC0+ZW5kX3N5bSkpKQogCQkJcmV0dXJuIDA7CiAJfQogCiAJLyogRXhjbHVkZSBzeW1ib2xzIHdoaWNoIHZhcnkgYmV0d2VlbiBwYXNzZXMuICovCi0JaWYgKHN0cnN0cigoY2hhciAqKXMtPnN5bSArIG9mZnNldCwgIl9jb21waWxlZC4iKSkKLQkJcmV0dXJuIDA7Ci0KIAlmb3IgKGkgPSAwOyBzcGVjaWFsX3N5bWJvbHNbaV07IGkrKykKLQkJaWYoIHN0cmNtcCgoY2hhciAqKXMtPnN5bSArIG9mZnNldCwgc3BlY2lhbF9zeW1ib2xzW2ldKSA9PSAwICkKKwkJaWYgKHN0cmNtcChzeW1fbmFtZSwgc3BlY2lhbF9zeW1ib2xzW2ldKSA9PSAwKQogCQkJcmV0dXJuIDA7CiAKKwlmb3IgKGkgPSAwOyBzcGVjaWFsX3N1ZmZpeGVzW2ldOyBpKyspIHsKKwkJaW50IGwgPSBzdHJsZW4oc3ltX25hbWUpIC0gc3RybGVuKHNwZWNpYWxfc3VmZml4ZXNbaV0pOworCisJCWlmIChsID49IDAgJiYgc3RyY21wKHN5bV9uYW1lICsgbCwgc3BlY2lhbF9zdWZmaXhlc1tpXSkgPT0gMCkKKwkJCXJldHVybiAwOworCX0KKwogCXJldHVybiAxOwogfQogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUgYi9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKaW5kZXggOTY0NWMwNy4uZDliMWZlZiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCisrKyBiL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgS2VybmVsIGNvbmZpZ3VyYXRpb24gdGFyZ2V0cwogIyBUaGVzZSB0YXJnZXRzIGFyZSB1c2VkIGZyb20gdG9wLWxldmVsIG1ha2VmaWxlCiAKLVBIT05ZICs9IG9sZGNvbmZpZyB4Y29uZmlnIGdjb25maWcgbWVudWNvbmZpZyBjb25maWcgc2lsZW50b2xkY29uZmlnIHVwZGF0ZS1wby1jb25maWcgXAorUEhPTlkgKz0geGNvbmZpZyBnY29uZmlnIG1lbnVjb25maWcgY29uZmlnIHNpbGVudG9sZGNvbmZpZyB1cGRhdGUtcG8tY29uZmlnIFwKIAlsb2NhbG1vZGNvbmZpZyBsb2NhbHllc2NvbmZpZwogCiBpZmRlZiBLQlVJTERfS0NPTkZJRwpAQCAtMTEsMzAgKzExLDMxIEBACiBLY29uZmlnIDo9IEtjb25maWcKIGVuZGlmCiAKK2lmZXEgKCQocXVpZXQpLHNpbGVudF8pCitzaWxlbnQgOj0gLXMKK2VuZGlmCisKICMgV2UgbmVlZCB0aGlzLCBpbiBjYXNlIHRoZSB1c2VyIGhhcyBpdCBpbiBpdHMgZW52aXJvbm1lbnQKIHVuZXhwb3J0IENPTkZJR18KIAogeGNvbmZpZzogJChvYmopL3Fjb25mCi0JJDwgJChLY29uZmlnKQorCSQ8ICQoc2lsZW50KSAkKEtjb25maWcpCiAKIGdjb25maWc6ICQob2JqKS9nY29uZgotCSQ8ICQoS2NvbmZpZykKKwkkPCAkKHNpbGVudCkgJChLY29uZmlnKQogCiBtZW51Y29uZmlnOiAkKG9iaikvbWNvbmYKLQkkPCAkKEtjb25maWcpCisJJDwgJChzaWxlbnQpICQoS2NvbmZpZykKIAogY29uZmlnOiAkKG9iaikvY29uZgotCSQ8IC0tb2xkYXNrY29uZmlnICQoS2NvbmZpZykKKwkkPCAkKHNpbGVudCkgLS1vbGRhc2tjb25maWcgJChLY29uZmlnKQogCiBuY29uZmlnOiAkKG9iaikvbmNvbmYKLQkkPCAkKEtjb25maWcpCi0KLW9sZGNvbmZpZzogJChvYmopL2NvbmYKLQkkPCAtLSRAICQoS2NvbmZpZykKKwkkPCAkKHNpbGVudCkgJChLY29uZmlnKQogCiBzaWxlbnRvbGRjb25maWc6ICQob2JqKS9jb25mCiAJJChRKW1rZGlyIC1wIGluY2x1ZGUvY29uZmlnIGluY2x1ZGUvZ2VuZXJhdGVkCi0JJDwgLS0kQCAkKEtjb25maWcpCisJJDwgJChzaWxlbnQpIC0tJEAgJChLY29uZmlnKQogCiBsb2NhbHllc2NvbmZpZyBsb2NhbG1vZGNvbmZpZzogJChvYmopL3N0cmVhbWxpbmVfY29uZmlnLnBsICQob2JqKS9jb25mCiAJJChRKW1rZGlyIC1wIGluY2x1ZGUvY29uZmlnIGluY2x1ZGUvZ2VuZXJhdGVkCkBAIC00MywxOCArNDQsMTggQEAKIAkJCWNtcCAtcyAudG1wLmNvbmZpZyAuY29uZmlnIHx8CQkJXAogCQkJKG12IC1mIC5jb25maWcgLmNvbmZpZy5vbGQuMTsJCQlcCiAJCQkgbXYgLWYgLnRtcC5jb25maWcgLmNvbmZpZzsJCQlcCi0JCQkgJChvYmopL2NvbmYgLS1zaWxlbnRvbGRjb25maWcgJChLY29uZmlnKTsJXAorCQkJICQob2JqKS9jb25mICQoc2lsZW50KSAtLXNpbGVudG9sZGNvbmZpZyAkKEtjb25maWcpOyBcCiAJCQkgbXYgLWYgLmNvbmZpZy5vbGQuMSAuY29uZmlnLm9sZCkJCVwKIAllbHNlCQkJCQkJCQlcCiAJCQltdiAtZiAudG1wLmNvbmZpZyAuY29uZmlnOwkJCVwKLQkJCSQob2JqKS9jb25mIC0tc2lsZW50b2xkY29uZmlnICQoS2NvbmZpZyk7CVwKKwkJCSQob2JqKS9jb25mICQoc2lsZW50KSAtLXNpbGVudG9sZGNvbmZpZyAkKEtjb25maWcpOyBcCiAJZmkKIAkkKFEpcm0gLWYgLnRtcC5jb25maWcKIAogIyBDcmVhdGUgbmV3IGxpbnV4LnBvdCBmaWxlCiAjIEFkanVzdCBjaGFyc2V0IHRvIFVURi04IGluIC5wbyBmaWxlIHRvIGFjY2VwdCBVVEYtOCBpbiBLY29uZmlnIGZpbGVzCiB1cGRhdGUtcG8tY29uZmlnOiAkKG9iaikva3hnZXR0ZXh0ICQob2JqKS9nY29uZi5nbGFkZS5oCi0JJChRKWVjaG8gIiAgR0VOICAgICBjb25maWcucG90IgorCSQoUSkkKGtlY2hvKSAiICBHRU4gICAgIGNvbmZpZy5wb3QiCiAJJChRKXhnZXR0ZXh0IC0tZGVmYXVsdC1kb21haW49bGludXggICAgICAgICAgICAgICAgICAgICAgICAgXAogCSAgICAtLWFkZC1jb21tZW50cyAtLWtleXdvcmQ9XyAtLWtleXdvcmQ9Tl8gICAgICAgICAgICAgICAgIFwKIAkgICAgLS1mcm9tLWNvZGU9VVRGLTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC02NSw2MSArNjYsNTggQEAKIAkkKFEpKGZvciBpIGluIGBscyAkKHNyY3RyZWUpL2FyY2gvKi9LY29uZmlnICAgICAgXAogCSAgICAkKHNyY3RyZWUpL2FyY2gvKi91bS9LY29uZmlnYDsgICAgICAgICAgICAgICBcCiAJICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQkJZWNobyAiICBHRU4gICAgICQkaSI7ICAgICAgICAgICAgICAgICAgICBcCisJCSQoa2VjaG8pICIgIEdFTiAgICAgJCRpIjsgICAgICAgICAgICAgICAgICAgIFwKIAkJJChvYmopL2t4Z2V0dGV4dCAkJGkgICAgICAgICAgICAgICAgICAgICBcCiAJCSAgICAgPj4gJChvYmopL2NvbmZpZy5wb3Q7ICAgICAgICAgICAgICAgXAogCSAgICBkb25lICkKLQkkKFEpZWNobyAiICBHRU4gICAgIGxpbnV4LnBvdCIKKwkkKFEpJChrZWNobykgIiAgR0VOICAgICBsaW51eC5wb3QiCiAJJChRKW1zZ3VuaXEgLS1zb3J0LWJ5LWZpbGUgLS10by1jb2RlPVVURi04ICQob2JqKS9jb25maWcucG90IFwKIAkgICAgLS1vdXRwdXQgJChvYmopL2xpbnV4LnBvdAogCSQoUSlybSAtZiAkKG9iaikvY29uZmlnLnBvdAogCi1QSE9OWSArPSBhbGxub2NvbmZpZyBhbGx5ZXNjb25maWcgYWxsbW9kY29uZmlnIGFsbGRlZmNvbmZpZyByYW5kY29uZmlnCisjIFRoZXNlIHRhcmdldHMgbWFwIDE6MSB0byB0aGUgY29tbWFuZGxpbmUgb3B0aW9ucyBvZiAnY29uZicKK3NpbXBsZS10YXJnZXRzIDo9IG9sZGNvbmZpZyBhbGxub2NvbmZpZyBhbGx5ZXNjb25maWcgYWxsbW9kY29uZmlnIFwKKwlhbGxkZWZjb25maWcgcmFuZGNvbmZpZyBsaXN0bmV3Y29uZmlnIG9sZGRlZmNvbmZpZworUEhPTlkgKz0gJChzaW1wbGUtdGFyZ2V0cykKIAotYWxsbm9jb25maWcgYWxseWVzY29uZmlnIGFsbG1vZGNvbmZpZyBhbGxkZWZjb25maWcgcmFuZGNvbmZpZzogJChvYmopL2NvbmYKLQkkPCAtLSRAICQoS2NvbmZpZykKKyQoc2ltcGxlLXRhcmdldHMpOiAkKG9iaikvY29uZgorCSQ8ICQoc2lsZW50KSAtLSRAICQoS2NvbmZpZykKIAotUEhPTlkgKz0gbGlzdG5ld2NvbmZpZyBvbGRkZWZjb25maWcgb2xkbm9jb25maWcgc2F2ZWRlZmNvbmZpZyBkZWZjb25maWcKLQotbGlzdG5ld2NvbmZpZyBvbGRkZWZjb25maWc6ICQob2JqKS9jb25mCi0JJDwgLS0kQCAkKEtjb25maWcpCitQSE9OWSArPSBvbGRub2NvbmZpZyBzYXZlZGVmY29uZmlnIGRlZmNvbmZpZwogCiAjIG9sZG5vY29uZmlnIGlzIGFuIGFsaWFzIG9mIG9sZGRlZmNvbmZpZywgYmVjYXVzZSBwZW9wbGUgYWxyZWFkeSBhcmUgZGVwZW5kZW50CiAjIG9uIGl0cyBiZWhhdmlvcihzZXRzIG5ldyBzeW1ib2xzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUgYnV0IG5vdCAnbicpIHdpdGggdGhlCiAjIGNvdW50ZXItaW50dWl0aXZlIG5hbWUuCi1vbGRub2NvbmZpZzogJChvYmopL2NvbmYKLQkkPCAtLW9sZGRlZmNvbmZpZyAkKEtjb25maWcpCitvbGRub2NvbmZpZzogb2xkZGVmY29uZmlnCiAKIHNhdmVkZWZjb25maWc6ICQob2JqKS9jb25mCi0JJDwgLS0kQD1kZWZjb25maWcgJChLY29uZmlnKQorCSQ8ICQoc2lsZW50KSAtLSRAPWRlZmNvbmZpZyAkKEtjb25maWcpCiAKIGRlZmNvbmZpZzogJChvYmopL2NvbmYKIGlmZXEgKCQoS0JVSUxEX0RFRkNPTkZJRyksKQotCSQ8IC0tZGVmY29uZmlnICQoS2NvbmZpZykKKwkkPCAkKHNpbGVudCkgLS1kZWZjb25maWcgJChLY29uZmlnKQogZWxzZQotCUBlY2hvICIqKiogRGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uICckKEtCVUlMRF9ERUZDT05GSUcpJyIKLQkkKFEpJDwgLS1kZWZjb25maWc9YXJjaC8kKFNSQ0FSQ0gpL2NvbmZpZ3MvJChLQlVJTERfREVGQ09ORklHKSAkKEtjb25maWcpCisJQCQoa2VjaG8pICIqKiogRGVmYXVsdCBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uICckKEtCVUlMRF9ERUZDT05GSUcpJyIKKwkkKFEpJDwgJChzaWxlbnQpIC0tZGVmY29uZmlnPWFyY2gvJChTUkNBUkNIKS9jb25maWdzLyQoS0JVSUxEX0RFRkNPTkZJRykgJChLY29uZmlnKQogZW5kaWYKIAogJV9kZWZjb25maWc6ICQob2JqKS9jb25mCi0JJChRKSQ8IC0tZGVmY29uZmlnPWFyY2gvJChTUkNBUkNIKS9jb25maWdzLyRAICQoS2NvbmZpZykKKwkkKFEpJDwgJChzaWxlbnQpIC0tZGVmY29uZmlnPWFyY2gvJChTUkNBUkNIKS9jb25maWdzLyRAICQoS2NvbmZpZykKIAotY29uZmlnZmlsZXM9JCh3aWxkY2FyZCAkKHNyY3RyZWUpL2tlcm5lbC9jb25maWdzLyQoMSkuY29uZmlnICQoc3JjdHJlZSkvYXJjaC8kKFNSQ0FSQ0gpL2NvbmZpZ3MvJCgxKS5jb25maWcpCitjb25maWdmaWxlcz0kKHdpbGRjYXJkICQoc3JjdHJlZSkva2VybmVsL2NvbmZpZ3MvJEAgJChzcmN0cmVlKS9hcmNoLyQoU1JDQVJDSCkvY29uZmlncy8kQCkKIAotZGVmaW5lIG1lcmdlY29uZmlnCi0kKGlmICQod2lsZGNhcmQgJChvYmp0cmVlKS8uY29uZmlnKSwsICQoZXJyb3IgWW91IG5lZWQgYW4gZXhpc3RpbmcgLmNvbmZpZyBmb3IgdGhpcyB0YXJnZXQpKQotJChpZiAkKGNhbGwgY29uZmlnZmlsZXMsJCgxKSksLCAkKGVycm9yIE5vIGNvbmZpZ3VyYXRpb24gZXhpc3RzIGZvciB0aGlzIHRhcmdldCBvbiB0aGlzIGFyY2hpdGVjdHVyZSkpCi0kKFEpJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9rY29uZmlnL21lcmdlX2NvbmZpZy5zaCAtbSAtTyAkKG9ianRyZWUpICQob2JqdHJlZSkvLmNvbmZpZyAkKGNhbGwgY29uZmlnZmlsZXMsJCgxKSkKLSQoUSl5ZXMgIiIgfCAkKE1BS0UpIC1mICQoc3JjdHJlZSkvTWFrZWZpbGUgb2xkY29uZmlnCi1lbmRlZgorJS5jb25maWc6ICQob2JqKS9jb25mCisJJChpZiAkKGNhbGwgY29uZmlnZmlsZXMpLCwgJChlcnJvciBObyBjb25maWd1cmF0aW9uIGV4aXN0cyBmb3IgdGhpcyB0YXJnZXQgb24gdGhpcyBhcmNoaXRlY3R1cmUpKQorCSQoUSkkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL2tjb25maWcvbWVyZ2VfY29uZmlnLnNoIC1tIC5jb25maWcgJChjb25maWdmaWxlcykKKwkrJChRKXllcyAiIiB8ICQoTUFLRSkgLWYgJChzcmN0cmVlKS9NYWtlZmlsZSBvbGRjb25maWcKIAogUEhPTlkgKz0ga3ZtY29uZmlnCi1rdm1jb25maWc6Ci0JJChjYWxsIG1lcmdlY29uZmlnLGt2bV9ndWVzdCkKK2t2bWNvbmZpZzoga3ZtX2d1ZXN0LmNvbmZpZworCUA6CiAKIFBIT05ZICs9IHRpbnljb25maWcKLXRpbnljb25maWc6IGFsbG5vY29uZmlnCi0JJChjYWxsIG1lcmdlY29uZmlnLHRpbnkpCit0aW55Y29uZmlnOgorCSQoUSkkKE1BS0UpIC1mICQoc3JjdHJlZSkvTWFrZWZpbGUgYWxsbm9jb25maWcgdGlueS5jb25maWcKIAogIyBIZWxwIHRleHQgdXNlZCBieSBtYWtlIGhlbHAKIGhlbHA6CkBAIC0yMjEsNyArMjE5LDcgQEAKIAogIyBRVCBuZWVkcyBzb21lIGV4dHJhIGVmZm9ydC4uLgogJChvYmopLy50bXBfcXRjaGVjazoKLQlAc2V0IC1lOyBlY2hvICIgIENIRUNLICAgcXQiOyBkaXI9IiI7IHBrZz0iIjsgXAorCUBzZXQgLWU7ICQoa2VjaG8pICIgIENIRUNLICAgcXQiOyBkaXI9IiI7IHBrZz0iIjsgXAogCWlmICEgcGtnLWNvbmZpZyAtLWV4aXN0cyBRdENvcmUgMj4gL2Rldi9udWxsOyB0aGVuIFwKIAkgICAgZWNobyAiKiBVbmFibGUgdG8gZmluZCB0aGUgUVQ0IHRvb2wgcW1ha2UuIFRyeWluZyB0byB1c2UgUVQzIjsgXAogCSAgICBwa2ctY29uZmlnIC0tZXhpc3RzIHF0IDI+IC9kZXYvbnVsbCAmJiBwa2c9cXQ7IFwKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCmluZGV4IGZlZjc1ZmMuLjZjMjA0MzEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpAQCAtNDcxLDcgKzQ3MSw3IEBACiBzdGF0aWMgdm9pZCBjb25mX3VzYWdlKGNvbnN0IGNoYXIgKnByb2duYW1lKQogewogCi0JcHJpbnRmKCJVc2FnZTogJXMgW29wdGlvbl0gPGtjb25maWctZmlsZT5cbiIsIHByb2duYW1lKTsKKwlwcmludGYoIlVzYWdlOiAlcyBbLXNdIFtvcHRpb25dIDxrY29uZmlnLWZpbGU+XG4iLCBwcm9nbmFtZSk7CiAJcHJpbnRmKCJbb3B0aW9uXSBpcyBfb25lXyBvZiB0aGUgZm9sbG93aW5nOlxuIik7CiAJcHJpbnRmKCIgIC0tbGlzdG5ld2NvbmZpZyAgICAgICAgIExpc3QgbmV3IG9wdGlvbnNcbiIpOwogCXByaW50ZigiICAtLW9sZGFza2NvbmZpZyAgICAgICAgICBTdGFydCBhIG5ldyBjb25maWd1cmF0aW9uIHVzaW5nIGEgbGluZS1vcmllbnRlZCBwcm9ncmFtXG4iKTsKQEAgLTUwMSw3ICs1MDEsMTEgQEAKIAogCXR0eV9zdGRpbyA9IGlzYXR0eSgwKSAmJiBpc2F0dHkoMSkgJiYgaXNhdHR5KDIpOwogCi0Jd2hpbGUgKChvcHQgPSBnZXRvcHRfbG9uZyhhYywgYXYsICIiLCBsb25nX29wdHMsIE5VTEwpKSAhPSAtMSkgeworCXdoaWxlICgob3B0ID0gZ2V0b3B0X2xvbmcoYWMsIGF2LCAicyIsIGxvbmdfb3B0cywgTlVMTCkpICE9IC0xKSB7CisJCWlmIChvcHQgPT0gJ3MnKSB7CisJCQljb25mX3NldF9tZXNzYWdlX2NhbGxiYWNrKE5VTEwpOworCQkJY29udGludWU7CisJCX0KIAkJaW5wdXRfbW9kZSA9IChlbnVtIGlucHV0X21vZGUpb3B0OwogCQlzd2l0Y2ggKG9wdCkgewogCQljYXNlIHNpbGVudG9sZGNvbmZpZzoKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKaW5kZXggMjhkZjE4ZC4uYzgxNGY1NyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKQEAgLTE2LDYgKzE2LDExIEBACiAKICNpbmNsdWRlICJsa2MuaCIKIAorc3RydWN0IGNvbmZfcHJpbnRlciB7CisJdm9pZCAoKnByaW50X3N5bWJvbCkoRklMRSAqLCBzdHJ1Y3Qgc3ltYm9sICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKKwl2b2lkICgqcHJpbnRfY29tbWVudCkoRklMRSAqLCBjb25zdCBjaGFyICosIHZvaWQgKik7Cit9OworCiBzdGF0aWMgdm9pZCBjb25mX3dhcm5pbmcoY29uc3QgY2hhciAqZm10LCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOwogCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZXhwci5jIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuYwppbmRleCBkNjYyNjUyLi5mYjBhMmEyIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvZXhwci5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmMKQEAgLTExLDYgKzExLDEyIEBACiAKICNkZWZpbmUgREVCVUdfRVhQUgkwCiAKK3N0YXRpYyBpbnQgZXhwcl9lcShzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7CitzdGF0aWMgc3RydWN0IGV4cHIgKmV4cHJfZWxpbWluYXRlX3luKHN0cnVjdCBleHByICplKTsKK3N0YXRpYyBzdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX2FuZChzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOworc3RhdGljIHN0cnVjdCBleHByICpleHByX2V4dHJhY3RfZXFfb3Ioc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKK3N0YXRpYyB2b2lkIGV4cHJfZXh0cmFjdF9lcShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOworCiBzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19zeW1ib2woc3RydWN0IHN5bWJvbCAqc3ltKQogewogCXN0cnVjdCBleHByICplID0geGNhbGxvYygxLCBzaXplb2YoKmUpKTsKQEAgLTE4Niw3ICsxOTIsNyBAQAogI3VuZGVmIGUxCiAjdW5kZWYgZTIKIAotaW50IGV4cHJfZXEoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCitzdGF0aWMgaW50IGV4cHJfZXEoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCiB7CiAJaW50IHJlcywgb2xkX2NvdW50OwogCkBAIC0yMjgsNyArMjM0LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IGV4cHIgKmV4cHJfZWxpbWluYXRlX3luKHN0cnVjdCBleHByICplKQorc3RhdGljIHN0cnVjdCBleHByICpleHByX2VsaW1pbmF0ZV95bihzdHJ1Y3QgZXhwciAqZSkKIHsKIAlzdHJ1Y3QgZXhwciAqdG1wOwogCkBAIC04MjMsNyArODI5LDcgQEAKICAJcmV0dXJuIGZhbHNlOwogfQogCi1zdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX2FuZChzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCitzdGF0aWMgc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9hbmQoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQogewogCXN0cnVjdCBleHByICp0bXAgPSBOVUxMOwogCWV4cHJfZXh0cmFjdF9lcShFX0FORCwgJnRtcCwgZXAxLCBlcDIpOwpAQCAtODM0LDcgKzg0MCw3IEBACiAJcmV0dXJuIHRtcDsKIH0KIAotc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9vcihzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCitzdGF0aWMgc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9vcihzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCiB7CiAJc3RydWN0IGV4cHIgKnRtcCA9IE5VTEw7CiAJZXhwcl9leHRyYWN0X2VxKEVfT1IsICZ0bXAsIGVwMSwgZXAyKTsKQEAgLTg0NSw3ICs4NTEsNyBAQAogCXJldHVybiB0bXA7CiB9CiAKLXZvaWQgZXhwcl9leHRyYWN0X2VxKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3N0YXRpYyB2b2lkIGV4cHJfZXh0cmFjdF9lcShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCiB7CiAjZGVmaW5lIGUxICgqZXAxKQogI2RlZmluZSBlMiAoKmVwMikKQEAgLTk3NiwxMSArOTgyLDggQEAKIAl9CiB9CiAKLWludCBleHByX2NvbXBhcmVfdHlwZShlbnVtIGV4cHJfdHlwZSB0MSwgZW51bSBleHByX3R5cGUgdDIpCitzdGF0aWMgaW50IGV4cHJfY29tcGFyZV90eXBlKGVudW0gZXhwcl90eXBlIHQxLCBlbnVtIGV4cHJfdHlwZSB0MikKIHsKLSNpZiAwCi0JcmV0dXJuIDE7Ci0jZWxzZQogCWlmICh0MSA9PSB0MikKIAkJcmV0dXJuIDA7CiAJc3dpdGNoICh0MSkgewpAQCAtMTAwNSw3ICsxMDA4LDYgQEAKIAl9CiAJcHJpbnRmKCJbJWRndCVkP10iLCB0MSwgdDIpOwogCXJldHVybiAwOwotI2VuZGlmCiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGV4cHIgKgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuaCBiL3NjcmlwdHMva2NvbmZpZy9leHByLmgKaW5kZXggNDEyZWE4YS4uYTJmYzk2YSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2V4cHIuaAorKysgYi9zY3JpcHRzL2tjb25maWcvZXhwci5oCkBAIC0yMDUsMTggKzIwNSwxMyBAQAogc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb3Ioc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOwogc3RydWN0IGV4cHIgKmV4cHJfY29weShjb25zdCBzdHJ1Y3QgZXhwciAqb3JnKTsKIHZvaWQgZXhwcl9mcmVlKHN0cnVjdCBleHByICplKTsKLWludCBleHByX2VxKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKIHZvaWQgZXhwcl9lbGltaW5hdGVfZXEoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKIHRyaXN0YXRlIGV4cHJfY2FsY192YWx1ZShzdHJ1Y3QgZXhwciAqZSk7Ci1zdHJ1Y3QgZXhwciAqZXhwcl9lbGltaW5hdGVfeW4oc3RydWN0IGV4cHIgKmUpOwogc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNfYm9vbChzdHJ1Y3QgZXhwciAqZSk7CiBzdHJ1Y3QgZXhwciAqZXhwcl9lbGltaW5hdGVfZHVwcyhzdHJ1Y3QgZXhwciAqZSk7CiBzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc2Zvcm0oc3RydWN0IGV4cHIgKmUpOwogaW50IGV4cHJfY29udGFpbnNfc3ltYm9sKHN0cnVjdCBleHByICpkZXAsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CiBib29sIGV4cHJfZGVwZW5kc19zeW1ib2woc3RydWN0IGV4cHIgKmRlcCwgc3RydWN0IHN5bWJvbCAqc3ltKTsKLXN0cnVjdCBleHByICpleHByX2V4dHJhY3RfZXFfYW5kKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7Ci1zdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX29yKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7Ci12b2lkIGV4cHJfZXh0cmFjdF9lcShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOwogc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNfY29tcGFyZShzdHJ1Y3QgZXhwciAqZSwgZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKTsKIHN0cnVjdCBleHByICpleHByX3NpbXBsaWZ5X3VubWV0X2RlcChzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKaW5kZXggZDBhMzViMi4uMjZkMjA4YiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKQEAgLTE2OSwxNCArMTY5LDYgQEAKIAlzdHlsZSA9IGd0a193aWRnZXRfZ2V0X3N0eWxlKG1haW5fd25kKTsKIAl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ0b29sYmFyMSIpOwogCi0jaWYgMAkvKiBVc2Ugc3RvY2sgR3RrIGljb25zIGluc3RlYWQgKi8KLQlyZXBsYWNlX2J1dHRvbl9pY29uKHhtbCwgbWFpbl93bmQtPndpbmRvdywgc3R5bGUsCi0JCQkgICAgImJ1dHRvbjEiLCAoZ2NoYXIgKiopIHhwbV9iYWNrKTsKLQlyZXBsYWNlX2J1dHRvbl9pY29uKHhtbCwgbWFpbl93bmQtPndpbmRvdywgc3R5bGUsCi0JCQkgICAgImJ1dHRvbjIiLCAoZ2NoYXIgKiopIHhwbV9sb2FkKTsKLQlyZXBsYWNlX2J1dHRvbl9pY29uKHhtbCwgbWFpbl93bmQtPndpbmRvdywgc3R5bGUsCi0JCQkgICAgImJ1dHRvbjMiLCAoZ2NoYXIgKiopIHhwbV9zYXZlKTsKLSNlbmRpZgogCXJlcGxhY2VfYnV0dG9uX2ljb24oeG1sLCBtYWluX3duZC0+d2luZG93LCBzdHlsZSwKIAkJCSAgICAiYnV0dG9uNCIsIChnY2hhciAqKikgeHBtX3NpbmdsZV92aWV3KTsKIAlyZXBsYWNlX2J1dHRvbl9pY29uKHhtbCwgbWFpbl93bmQtPndpbmRvdywgc3R5bGUsCkBAIC0xODQsMjIgKzE3Niw2IEBACiAJcmVwbGFjZV9idXR0b25faWNvbih4bWwsIG1haW5fd25kLT53aW5kb3csIHN0eWxlLAogCQkJICAgICJidXR0b242IiwgKGdjaGFyICoqKSB4cG1fdHJlZV92aWV3KTsKIAotI2lmIDAKLQlzd2l0Y2ggKHZpZXdfbW9kZSkgewotCWNhc2UgU0lOR0xFX1ZJRVc6Ci0JCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImJ1dHRvbjQiKTsKLQkJZ19zaWduYWxfZW1pdF9ieV9uYW1lKHdpZGdldCwgImNsaWNrZWQiKTsKLQkJYnJlYWs7Ci0JY2FzZSBTUExJVF9WSUVXOgotCQl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJidXR0b241Iik7Ci0JCWdfc2lnbmFsX2VtaXRfYnlfbmFtZSh3aWRnZXQsICJjbGlja2VkIik7Ci0JCWJyZWFrOwotCWNhc2UgRlVMTF9WSUVXOgotCQl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJidXR0b242Iik7Ci0JCWdfc2lnbmFsX2VtaXRfYnlfbmFtZSh3aWRnZXQsICJjbGlja2VkIik7Ci0JCWJyZWFrOwotCX0KLSNlbmRpZgogCXR4dGJ1ZiA9IGd0a190ZXh0X3ZpZXdfZ2V0X2J1ZmZlcihHVEtfVEVYVF9WSUVXKHRleHRfdykpOwogCXRhZzEgPSBndGtfdGV4dF9idWZmZXJfY3JlYXRlX3RhZyh0eHRidWYsICJteXRhZzEiLAogCQkJCQkgICJmb3JlZ3JvdW5kIiwgInJlZCIsCkBAIC0xNDk4LDkgKzE0NzQsMTIgQEAKIAkJY2FzZSAnYSc6CiAJCQkvL3Nob3dBbGwgPSAxOwogCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJY29uZl9zZXRfbWVzc2FnZV9jYWxsYmFjayhOVUxMKTsKKwkJCWJyZWFrOwogCQljYXNlICdoJzoKIAkJY2FzZSAnPyc6Ci0JCQlwcmludGYoIiVzIDxjb25maWc+XG4iLCBhdlswXSk7CisJCQlwcmludGYoIiVzIFstc10gPGNvbmZpZz5cbiIsIGF2WzBdKTsKIAkJCWV4aXQoMCk7CiAJCX0KIAkJbmFtZSA9IGF2WzJdOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2xrYy5oIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCmluZGV4IGQ1ZGFhN2EuLjkxY2ExMjYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9sa2MuaAorKysgYi9zY3JpcHRzL2tjb25maWcvbGtjLmgKQEAgLTIxLDkgKzIxLDcgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQlleHRlcm4gdHlwZSBuYW1lIGFyZwogI2luY2x1ZGUgImxrY19wcm90by5oIgotI3VuZGVmIFAKIAogI2RlZmluZSBTUkNUUkVFICJzcmN0cmVlIgogCkBAIC03MCw5ICs2OCw2IEBACiAJZW51bSBzeW1ib2xfdHlwZSBzdHlwZTsKIH07CiAKLWV4dGVybiBpbnQgemNvbmZkZWJ1ZzsKLQotaW50IHpjb25mcGFyc2Uodm9pZCk7CiB2b2lkIHpjb25mZHVtcChGSUxFICpvdXQpOwogdm9pZCB6Y29uZl9zdGFydGhlbHAodm9pZCk7CiBGSUxFICp6Y29uZl9mb3Blbihjb25zdCBjaGFyICpuYW1lKTsKQEAgLTkwLDExICs4NSw2IEBACiBib29sIGNvbmZfc2V0X2FsbF9uZXdfc3ltYm9scyhlbnVtIGNvbmZfZGVmX21vZGUgbW9kZSk7CiB2b2lkIHNldF9hbGxfY2hvaWNlX3ZhbHVlcyhzdHJ1Y3Qgc3ltYm9sICpjc3ltKTsKIAotc3RydWN0IGNvbmZfcHJpbnRlciB7Ci0Jdm9pZCAoKnByaW50X3N5bWJvbCkoRklMRSAqLCBzdHJ1Y3Qgc3ltYm9sICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKLQl2b2lkICgqcHJpbnRfY29tbWVudCkoRklMRSAqLCBjb25zdCBjaGFyICosIHZvaWQgKik7Ci19OwotCiAvKiBjb25mZGF0YS5jIGFuZCBleHByLmMgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZndyaXRlKGNvbnN0IHZvaWQgKnN0ciwgc2l6ZV90IGxlbiwgc2l6ZV90IGNvdW50LCBGSUxFICpvdXQpCiB7CkBAIC0xMTMsNyArMTAzLDYgQEAKIHZvaWQgbWVudV9lbmRfZW50cnkodm9pZCk7CiB2b2lkIG1lbnVfYWRkX2RlcChzdHJ1Y3QgZXhwciAqZGVwKTsKIHZvaWQgbWVudV9hZGRfdmlzaWJpbGl0eShzdHJ1Y3QgZXhwciAqZGVwKTsKLXN0cnVjdCBwcm9wZXJ0eSAqbWVudV9hZGRfcHJvcChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpleHByLCBzdHJ1Y3QgZXhwciAqZGVwKTsKIHN0cnVjdCBwcm9wZXJ0eSAqbWVudV9hZGRfcHJvbXB0KGVudW0gcHJvcF90eXBlIHR5cGUsIGNoYXIgKnByb21wdCwgc3RydWN0IGV4cHIgKmRlcCk7CiB2b2lkIG1lbnVfYWRkX2V4cHIoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmV4cHIsIHN0cnVjdCBleHByICpkZXApOwogdm9pZCBtZW51X2FkZF9zeW1ib2woZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3QgZXhwciAqZGVwKTsKQEAgLTEzNyw3ICsxMjYsNiBAQAogCWludCBtYXhfd2lkdGg7CiB9Owogc3RydWN0IGdzdHIgc3RyX25ldyh2b2lkKTsKLXN0cnVjdCBnc3RyIHN0cl9hc3NpZ24oY29uc3QgY2hhciAqcyk7CiB2b2lkIHN0cl9mcmVlKHN0cnVjdCBnc3RyICpncyk7CiB2b2lkIHN0cl9hcHBlbmQoc3RydWN0IGdzdHIgKmdzLCBjb25zdCBjaGFyICpzKTsKIHZvaWQgc3RyX3ByaW50ZihzdHJ1Y3QgZ3N0ciAqZ3MsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKQEAgLTE0OCw4ICsxMzYsNiBAQAogCiB2b2lkIHN5bV9pbml0KHZvaWQpOwogdm9pZCBzeW1fY2xlYXJfYWxsX3ZhbGlkKHZvaWQpOwotdm9pZCBzeW1fc2V0X2FsbF9jaGFuZ2VkKHZvaWQpOwotdm9pZCBzeW1fc2V0X2NoYW5nZWQoc3RydWN0IHN5bWJvbCAqc3ltKTsKIHN0cnVjdCBzeW1ib2wgKnN5bV9jaG9pY2VfZGVmYXVsdChzdHJ1Y3Qgc3ltYm9sICpzeW0pOwogY29uc3QgY2hhciAqc3ltX2dldF9zdHJpbmdfZGVmYXVsdChzdHJ1Y3Qgc3ltYm9sICpzeW0pOwogc3RydWN0IHN5bWJvbCAqc3ltX2NoZWNrX2RlcHMoc3RydWN0IHN5bWJvbCAqc3ltKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaCBiL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaAppbmRleCBlY2RiOTY1Li5kNTM5ODcxIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCkBAIC0xLDU3ICsxLDUyIEBACiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAKIC8qIGNvbmZkYXRhLmMgKi8KLVAoY29uZl9wYXJzZSx2b2lkLChjb25zdCBjaGFyICpuYW1lKSk7Ci1QKGNvbmZfcmVhZCxpbnQsKGNvbnN0IGNoYXIgKm5hbWUpKTsKLVAoY29uZl9yZWFkX3NpbXBsZSxpbnQsKGNvbnN0IGNoYXIgKm5hbWUsIGludCkpOwotUChjb25mX3dyaXRlX2RlZmNvbmZpZyxpbnQsKGNvbnN0IGNoYXIgKm5hbWUpKTsKLVAoY29uZl93cml0ZSxpbnQsKGNvbnN0IGNoYXIgKm5hbWUpKTsKLVAoY29uZl93cml0ZV9hdXRvY29uZixpbnQsKHZvaWQpKTsKLVAoY29uZl9nZXRfY2hhbmdlZCxib29sLCh2b2lkKSk7Ci1QKGNvbmZfc2V0X2NoYW5nZWRfY2FsbGJhY2ssIHZvaWQsKHZvaWQgKCpmbikodm9pZCkpKTsKLVAoY29uZl9zZXRfbWVzc2FnZV9jYWxsYmFjaywgdm9pZCwodm9pZCAoKmZuKShjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApKSk7Cit2b2lkIGNvbmZfcGFyc2UoY29uc3QgY2hhciAqbmFtZSk7CitpbnQgY29uZl9yZWFkKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGNvbmZfcmVhZF9zaW1wbGUoY29uc3QgY2hhciAqbmFtZSwgaW50KTsKK2ludCBjb25mX3dyaXRlX2RlZmNvbmZpZyhjb25zdCBjaGFyICpuYW1lKTsKK2ludCBjb25mX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGNvbmZfd3JpdGVfYXV0b2NvbmYodm9pZCk7Citib29sIGNvbmZfZ2V0X2NoYW5nZWQodm9pZCk7Cit2b2lkIGNvbmZfc2V0X2NoYW5nZWRfY2FsbGJhY2sodm9pZCAoKmZuKSh2b2lkKSk7Cit2b2lkIGNvbmZfc2V0X21lc3NhZ2VfY2FsbGJhY2sodm9pZCAoKmZuKShjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApKTsKIAogLyogbWVudS5jICovCi1QKHJvb3RtZW51LHN0cnVjdCBtZW51LCk7CitleHRlcm4gc3RydWN0IG1lbnUgcm9vdG1lbnU7CiAKLVAobWVudV9pc19lbXB0eSwgYm9vbCwgKHN0cnVjdCBtZW51ICptZW51KSk7Ci1QKG1lbnVfaXNfdmlzaWJsZSwgYm9vbCwgKHN0cnVjdCBtZW51ICptZW51KSk7Ci1QKG1lbnVfaGFzX3Byb21wdCwgYm9vbCwgKHN0cnVjdCBtZW51ICptZW51KSk7Ci1QKG1lbnVfZ2V0X3Byb21wdCxjb25zdCBjaGFyICosKHN0cnVjdCBtZW51ICptZW51KSk7Ci1QKG1lbnVfZ2V0X3Jvb3RfbWVudSxzdHJ1Y3QgbWVudSAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOwotUChtZW51X2dldF9wYXJlbnRfbWVudSxzdHJ1Y3QgbWVudSAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOwotUChtZW51X2hhc19oZWxwLGJvb2wsKHN0cnVjdCBtZW51ICptZW51KSk7Ci1QKG1lbnVfZ2V0X2hlbHAsY29uc3QgY2hhciAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOwotUChnZXRfc3ltYm9sX3N0ciwgdm9pZCwgKHN0cnVjdCBnc3RyICpyLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBsaXN0X2hlYWQKLQkJCSAqaGVhZCkpOwotUChnZXRfcmVsYXRpb25zX3N0ciwgc3RydWN0IGdzdHIsIChzdHJ1Y3Qgc3ltYm9sICoqc3ltX2Fyciwgc3RydWN0IGxpc3RfaGVhZAotCQkJCSAgICpoZWFkKSk7Ci1QKG1lbnVfZ2V0X2V4dF9oZWxwLHZvaWQsKHN0cnVjdCBtZW51ICptZW51LCBzdHJ1Y3QgZ3N0ciAqaGVscCkpOworYm9vbCBtZW51X2lzX2VtcHR5KHN0cnVjdCBtZW51ICptZW51KTsKK2Jvb2wgbWVudV9pc192aXNpYmxlKHN0cnVjdCBtZW51ICptZW51KTsKK2Jvb2wgbWVudV9oYXNfcHJvbXB0KHN0cnVjdCBtZW51ICptZW51KTsKK2NvbnN0IGNoYXIgKiBtZW51X2dldF9wcm9tcHQoc3RydWN0IG1lbnUgKm1lbnUpOworc3RydWN0IG1lbnUgKiBtZW51X2dldF9yb290X21lbnUoc3RydWN0IG1lbnUgKm1lbnUpOworc3RydWN0IG1lbnUgKiBtZW51X2dldF9wYXJlbnRfbWVudShzdHJ1Y3QgbWVudSAqbWVudSk7Citib29sIG1lbnVfaGFzX2hlbHAoc3RydWN0IG1lbnUgKm1lbnUpOworY29uc3QgY2hhciAqIG1lbnVfZ2V0X2hlbHAoc3RydWN0IG1lbnUgKm1lbnUpOworc3RydWN0IGdzdHIgZ2V0X3JlbGF0aW9uc19zdHIoc3RydWN0IHN5bWJvbCAqKnN5bV9hcnIsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpOwordm9pZCBtZW51X2dldF9leHRfaGVscChzdHJ1Y3QgbWVudSAqbWVudSwgc3RydWN0IGdzdHIgKmhlbHApOwogCiAvKiBzeW1ib2wuYyAqLwotUChzeW1ib2xfaGFzaCxzdHJ1Y3Qgc3ltYm9sICosW1NZTUJPTF9IQVNIU0laRV0pOworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKiBzeW1ib2xfaGFzaFtTWU1CT0xfSEFTSFNJWkVdOwogCi1QKHN5bV9sb29rdXAsc3RydWN0IHN5bWJvbCAqLChjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpKTsKLVAoc3ltX2ZpbmQsc3RydWN0IHN5bWJvbCAqLChjb25zdCBjaGFyICpuYW1lKSk7Ci1QKHN5bV9leHBhbmRfc3RyaW5nX3ZhbHVlLGNvbnN0IGNoYXIgKiwoY29uc3QgY2hhciAqaW4pKTsKLVAoc3ltX2VzY2FwZV9zdHJpbmdfdmFsdWUsIGNvbnN0IGNoYXIgKiwoY29uc3QgY2hhciAqaW4pKTsKLVAoc3ltX3JlX3NlYXJjaCxzdHJ1Y3Qgc3ltYm9sICoqLChjb25zdCBjaGFyICpwYXR0ZXJuKSk7Ci1QKHN5bV90eXBlX25hbWUsY29uc3QgY2hhciAqLChlbnVtIHN5bWJvbF90eXBlIHR5cGUpKTsKLVAoc3ltX2NhbGNfdmFsdWUsdm9pZCwoc3RydWN0IHN5bWJvbCAqc3ltKSk7Ci1QKHN5bV9nZXRfdHlwZSxlbnVtIHN5bWJvbF90eXBlLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKLVAoc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sdHJpc3RhdGUgdHJpKSk7Ci1QKHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltLHRyaXN0YXRlIHRyaSkpOwotUChzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlLHRyaXN0YXRlLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKLVAoc3ltX3N0cmluZ192YWxpZCxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKm5ld3ZhbCkpOwotUChzeW1fc3RyaW5nX3dpdGhpbl9yYW5nZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKnN0cikpOwotUChzeW1fc2V0X3N0cmluZ192YWx1ZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKm5ld3ZhbCkpOwotUChzeW1faXNfY2hhbmdhYmxlLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSkpOwotUChzeW1fZ2V0X2Nob2ljZV9wcm9wLHN0cnVjdCBwcm9wZXJ0eSAqLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKLVAoc3ltX2dldF9kZWZhdWx0X3Byb3Asc3RydWN0IHByb3BlcnR5ICosKHN0cnVjdCBzeW1ib2wgKnN5bSkpOwotUChzeW1fZ2V0X3N0cmluZ192YWx1ZSxjb25zdCBjaGFyICosKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworc3RydWN0IHN5bWJvbCAqIHN5bV9sb29rdXAoY29uc3QgY2hhciAqbmFtZSwgaW50IGZsYWdzKTsKK3N0cnVjdCBzeW1ib2wgKiBzeW1fZmluZChjb25zdCBjaGFyICpuYW1lKTsKK2NvbnN0IGNoYXIgKiBzeW1fZXhwYW5kX3N0cmluZ192YWx1ZShjb25zdCBjaGFyICppbik7Citjb25zdCBjaGFyICogc3ltX2VzY2FwZV9zdHJpbmdfdmFsdWUoY29uc3QgY2hhciAqaW4pOworc3RydWN0IHN5bWJvbCAqKiBzeW1fcmVfc2VhcmNoKGNvbnN0IGNoYXIgKnBhdHRlcm4pOworY29uc3QgY2hhciAqIHN5bV90eXBlX25hbWUoZW51bSBzeW1ib2xfdHlwZSB0eXBlKTsKK3ZvaWQgc3ltX2NhbGNfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKTsKK2VudW0gc3ltYm9sX3R5cGUgc3ltX2dldF90eXBlKHN0cnVjdCBzeW1ib2wgKnN5bSk7Citib29sIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3RydWN0IHN5bWJvbCAqc3ltLHRyaXN0YXRlIHRyaSk7Citib29sIHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltLHRyaXN0YXRlIHRyaSk7Cit0cmlzdGF0ZSBzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSk7Citib29sIHN5bV9zdHJpbmdfdmFsaWQoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpuZXd2YWwpOworYm9vbCBzeW1fc3RyaW5nX3dpdGhpbl9yYW5nZShzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKnN0cik7Citib29sIHN5bV9zZXRfc3RyaW5nX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqbmV3dmFsKTsKK2Jvb2wgc3ltX2lzX2NoYW5nYWJsZShzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IHByb3BlcnR5ICogc3ltX2dldF9jaG9pY2VfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pOworY29uc3QgY2hhciAqIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSk7CiAKLVAocHJvcF9nZXRfdHlwZV9uYW1lLGNvbnN0IGNoYXIgKiwoZW51bSBwcm9wX3R5cGUgdHlwZSkpOworY29uc3QgY2hhciAqIHByb3BfZ2V0X3R5cGVfbmFtZShlbnVtIHByb3BfdHlwZSB0eXBlKTsKIAogLyogZXhwci5jICovCi1QKGV4cHJfY29tcGFyZV90eXBlLGludCwoZW51bSBleHByX3R5cGUgdDEsIGVudW0gZXhwcl90eXBlIHQyKSk7Ci1QKGV4cHJfcHJpbnQsdm9pZCwoc3RydWN0IGV4cHIgKmUsIHZvaWQgKCpmbikodm9pZCAqLCBzdHJ1Y3Qgc3ltYm9sICosIGNvbnN0IGNoYXIgKiksIHZvaWQgKmRhdGEsIGludCBwcmV2dG9rZW4pKTsKK3ZvaWQgZXhwcl9wcmludChzdHJ1Y3QgZXhwciAqZSwgdm9pZCAoKmZuKSh2b2lkICosIHN0cnVjdCBzeW1ib2wgKiwgY29uc3QgY2hhciAqKSwgdm9pZCAqZGF0YSwgaW50IHByZXZ0b2tlbik7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCmluZGV4IDRkZDM3NTUuLjMxNWNlMmMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCkBAIC0yNzksNiArMjc5LDcgQEAKIHN0YXRpYyBpbnQgc2luZ2xlX21lbnVfbW9kZTsKIHN0YXRpYyBpbnQgc2hvd19hbGxfb3B0aW9uczsKIHN0YXRpYyBpbnQgc2F2ZV9hbmRfZXhpdDsKK3N0YXRpYyBpbnQgc2lsZW50OwogCiBzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51LCBzdHJ1Y3QgbWVudSAqYWN0aXZlX21lbnUpOwogc3RhdGljIHZvaWQgY29uZl9jaG9pY2Uoc3RydWN0IG1lbnUgKm1lbnUpOwpAQCAtNzc3LDEwICs3NzgsMTIgQEAKIAljaGFyIGJ1ZltQQVRIX01BWCsxXTsKIAogCXZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBmbXQsIGFwKTsKLQlpZiAoc2F2ZV9hbmRfZXhpdCkKLQkJcHJpbnRmKCIlcyIsIGJ1Zik7Ci0JZWxzZQorCWlmIChzYXZlX2FuZF9leGl0KSB7CisJCWlmICghc2lsZW50KQorCQkJcHJpbnRmKCIlcyIsIGJ1Zik7CisJfSBlbHNlIHsKIAkJc2hvd190ZXh0Ym94KE5VTEwsIGJ1ZiwgNiwgNjApOworCX0KIH0KIAogc3RhdGljIHZvaWQgc2hvd19oZWxwKHN0cnVjdCBtZW51ICptZW51KQpAQCAtOTc3LDE2ICs5ODAsMTggQEAKIAkJfQogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIC0xOgotCQlwcmludGYoXygiXG5cbiIKLQkJCSAiKioqIEVuZCBvZiB0aGUgY29uZmlndXJhdGlvbi5cbiIKLQkJCSAiKioqIEV4ZWN1dGUgJ21ha2UnIHRvIHN0YXJ0IHRoZSBidWlsZCBvciB0cnkgJ21ha2UgaGVscCcuIgotCQkJICJcblxuIikpOworCQlpZiAoIXNpbGVudCkKKwkJCXByaW50ZihfKCJcblxuIgorCQkJCSAiKioqIEVuZCBvZiB0aGUgY29uZmlndXJhdGlvbi5cbiIKKwkJCQkgIioqKiBFeGVjdXRlICdtYWtlJyB0byBzdGFydCB0aGUgYnVpbGQgb3IgdHJ5ICdtYWtlIGhlbHAnLiIKKwkJCQkgIlxuXG4iKSk7CiAJCXJlcyA9IDA7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWZwcmludGYoc3RkZXJyLCBfKCJcblxuIgotCQkJCSAgIllvdXIgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHdlcmUgTk9UIHNhdmVkLiIKLQkJCQkgICJcblxuIikpOworCQlpZiAoIXNpbGVudCkKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJcblxuIgorCQkJCQkgICJZb3VyIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB3ZXJlIE5PVCBzYXZlZC4iCisJCQkJCSAgIlxuXG4iKSk7CiAJCWlmIChyZXMgIT0gS0VZX0VTQykKIAkJCXJlcyA9IDA7CiAJfQpAQCAtMTAxMCw2ICsxMDE1LDEyIEBACiAKIAlzaWduYWwoU0lHSU5ULCBzaWdfaGFuZGxlcik7CiAKKwlpZiAoYWMgPiAxICYmIHN0cmNtcChhdlsxXSwgIi1zIikgPT0gMCkgeworCQlzaWxlbnQgPSAxOworCQkvKiBTaWxlbmNlIGNvbmZfcmVhZCgpIHVudGlsIHRoZSByZWFsIGNhbGxiYWNrIGlzIHNldCB1cCAqLworCQljb25mX3NldF9tZXNzYWdlX2NhbGxiYWNrKE5VTEwpOworCQlhdisrOworCX0KIAljb25mX3BhcnNlKGF2WzFdKTsKIAljb25mX3JlYWQoTlVMTCk7CiAKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCmluZGV4IDcyYzlkYmEuLmIwNWNjM2QgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpAQCAtMTI1LDcgKzEyNSw3IEBACiAJCXN5bV90eXBlX25hbWUoc3ltLT50eXBlKSwgc3ltX3R5cGVfbmFtZSh0eXBlKSk7CiB9CiAKLXN0cnVjdCBwcm9wZXJ0eSAqbWVudV9hZGRfcHJvcChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpleHByLCBzdHJ1Y3QgZXhwciAqZGVwKQorc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSAqbWVudV9hZGRfcHJvcChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpleHByLCBzdHJ1Y3QgZXhwciAqZGVwKQogewogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IHByb3BfYWxsb2ModHlwZSwgY3VycmVudF9lbnRyeS0+c3ltKTsKIApAQCAtNjE1LDcgKzYxNSw3IEBACiAvKgogICogaGVhZCBpcyBvcHRpb25hbCBhbmQgbWF5IGJlIE5VTEwKICAqLwotdm9pZCBnZXRfc3ltYm9sX3N0cihzdHJ1Y3QgZ3N0ciAqciwgc3RydWN0IHN5bWJvbCAqc3ltLAorc3RhdGljIHZvaWQgZ2V0X3N5bWJvbF9zdHIoc3RydWN0IGdzdHIgKnIsIHN0cnVjdCBzeW1ib2wgKnN5bSwKIAkJICAgIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7CiAJYm9vbCBoaXQ7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWVyZ2VfY29uZmlnLnNoIGIvc2NyaXB0cy9rY29uZmlnL21lcmdlX2NvbmZpZy5zaAppbmRleCAyYWI5MWI5Li5lYzhlMjAzIDEwMDc1NQotLS0gYS9zY3JpcHRzL2tjb25maWcvbWVyZ2VfY29uZmlnLnNoCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tZXJnZV9jb25maWcuc2gKQEAgLTM1LDcgKzM1LDcgQEAKIAllY2hvICIgIC1PICAgIGRpciB0byBwdXQgZ2VuZXJhdGVkIG91dHB1dCBmaWxlcyIKIH0KIAotTUFLRT10cnVlCitSVU5NQUtFPXRydWUKIEFMTFRBUkdFVD1hbGxkZWZjb25maWcKIFdBUk5SRURVTj1mYWxzZQogT1VUUFVUPS4KQEAgLTQ4LDcgKzQ4LDcgQEAKIAkJY29udGludWUKIAkJOzsKIAkiLW0iKQotCQlNQUtFPWZhbHNlCisJCVJVTk1BS0U9ZmFsc2UKIAkJc2hpZnQKIAkJY29udGludWUKIAkJOzsKQEAgLTg1LDYgKzg1LDExIEBACiBJTklURklMRT0kMQogc2hpZnQ7CiAKK2lmIFsgISAtciAiJElOSVRGSUxFIiBdOyB0aGVuCisJZWNobyAiVGhlIGJhc2UgZmlsZSAnJElOSVRGSUxFJyBkb2VzIG5vdCBleGlzdC4gIEV4aXQuIiA+JjIKKwlleGl0IDEKK2ZpCisKIE1FUkdFX0xJU1Q9JCoKIFNFRF9DT05GSUdfRVhQPSJzL15cKCMgXClcezAsMVx9XChDT05GSUdfW2EtekEtWjAtOV9dKlwpWz0gXS4qL1wyL3AiCiBUTVBfRklMRT0kKG1rdGVtcCAuLy50bXAuY29uZmlnLlhYWFhYWFhYWFgpCkBAIC05MiwzMSArOTcsMjkgQEAKIGVjaG8gIlVzaW5nICRJTklURklMRSBhcyBiYXNlIgogY2F0ICRJTklURklMRSA+ICRUTVBfRklMRQogCi0jIE1lcmdlIGZpbGVzLCBwcmludGluZyB3YXJuaW5ncyBvbiBvdmVycmlkZWQgdmFsdWVzCisjIE1lcmdlIGZpbGVzLCBwcmludGluZyB3YXJuaW5ncyBvbiBvdmVycmlkZGVuIHZhbHVlcwogZm9yIE1FUkdFX0ZJTEUgaW4gJE1FUkdFX0xJU1QgOyBkbwogCWVjaG8gIk1lcmdpbmcgJE1FUkdFX0ZJTEUiCiAJQ0ZHX0xJU1Q9JChzZWQgLW4gIiRTRURfQ09ORklHX0VYUCIgJE1FUkdFX0ZJTEUpCiAKIAlmb3IgQ0ZHIGluICRDRkdfTElTVCA7IGRvCi0JCWdyZXAgLXEgLXcgJENGRyAkVE1QX0ZJTEUKLQkJaWYgWyAkPyAtZXEgMCBdIDsgdGhlbgotCQkJUFJFVl9WQUw9JChncmVwIC13ICRDRkcgJFRNUF9GSUxFKQotCQkJTkVXX1ZBTD0kKGdyZXAgLXcgJENGRyAkTUVSR0VfRklMRSkKLQkJCWlmIFsgIngkUFJFVl9WQUwiICE9ICJ4JE5FV19WQUwiIF0gOyB0aGVuCisJCWdyZXAgLXEgLXcgJENGRyAkVE1QX0ZJTEUgfHwgY29udGludWUKKwkJUFJFVl9WQUw9JChncmVwIC13ICRDRkcgJFRNUF9GSUxFKQorCQlORVdfVkFMPSQoZ3JlcCAtdyAkQ0ZHICRNRVJHRV9GSUxFKQorCQlpZiBbICJ4JFBSRVZfVkFMIiAhPSAieCRORVdfVkFMIiBdIDsgdGhlbgogCQkJZWNobyBWYWx1ZSBvZiAkQ0ZHIGlzIHJlZGVmaW5lZCBieSBmcmFnbWVudCAkTUVSR0VfRklMRToKIAkJCWVjaG8gUHJldmlvdXMgIHZhbHVlOiAkUFJFVl9WQUwKIAkJCWVjaG8gTmV3IHZhbHVlOiAgICAgICAkTkVXX1ZBTAogCQkJZWNobwotCQkJZWxpZiBbICIkV0FSTlJFRFVOIiA9ICJ0cnVlIiBdOyB0aGVuCisJCWVsaWYgWyAiJFdBUk5SRURVTiIgPSAidHJ1ZSIgXTsgdGhlbgogCQkJZWNobyBWYWx1ZSBvZiAkQ0ZHIGlzIHJlZHVuZGFudCBieSBmcmFnbWVudCAkTUVSR0VfRklMRToKLQkJCWZpCi0JCQlzZWQgLWkgIi8kQ0ZHWyA9XS9kIiAkVE1QX0ZJTEUKIAkJZmkKKwkJc2VkIC1pICIvJENGR1sgPV0vZCIgJFRNUF9GSUxFCiAJZG9uZQogCWNhdCAkTUVSR0VfRklMRSA+PiAkVE1QX0ZJTEUKIGRvbmUKIAotaWYgWyAiJE1BS0UiID0gImZhbHNlIiBdOyB0aGVuCitpZiBbICIkUlVOTUFLRSIgPSAiZmFsc2UiIF07IHRoZW4KIAljcCAkVE1QX0ZJTEUgJE9VVFBVVC8uY29uZmlnCiAJZWNobyAiIyIKIAllY2hvICIjIG1lcmdlZCBjb25maWd1cmF0aW9uIHdyaXR0ZW4gdG8gJE9VVFBVVC8uY29uZmlnIChuZWVkcyBtYWtlKSIKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL25jb25mLmMKaW5kZXggOTg0NDg5ZS4uZDQyZDUzNCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL25jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL25jb25mLmMKQEAgLTE0ODIsNiArMTQ4MiwxMSBAQAogCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7CiAJdGV4dGRvbWFpbihQQUNLQUdFKTsKIAorCWlmIChhYyA+IDEgJiYgc3RyY21wKGF2WzFdLCAiLXMiKSA9PSAwKSB7CisJCS8qIFNpbGVuY2UgY29uZl9yZWFkKCkgdW50aWwgdGhlIHJlYWwgY2FsbGJhY2sgaXMgc2V0IHVwICovCisJCWNvbmZfc2V0X21lc3NhZ2VfY2FsbGJhY2soTlVMTCk7CisJCWF2Kys7CisJfQogCWNvbmZfcGFyc2UoYXZbMV0pOwogCWNvbmZfcmVhZChOVUxMKTsKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCmluZGV4IDlkM2IwNGIuLmMzYmI3ZmUgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYworKysgYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKQEAgLTE3NDYsNyArMTc0Niw3IEBACiAKIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCiB7Ci0JcHJpbnRmKF8oIiVzIDxjb25maWc+XG4iKSwgcHJvZ25hbWUpOworCXByaW50ZihfKCIlcyBbLXNdIDxjb25maWc+XG4iKSwgcHJvZ25hbWUpOwogCWV4aXQoMCk7CiB9CiAKQEAgLTE3NjIsNiArMTc2Miw5IEBACiAJY29uZmlnQXBwID0gbmV3IFFBcHBsaWNhdGlvbihhYywgYXYpOwogCWlmIChhYyA+IDEgJiYgYXZbMV1bMF0gPT0gJy0nKSB7CiAJCXN3aXRjaCAoYXZbMV1bMV0pIHsKKwkJY2FzZSAncyc6CisJCQljb25mX3NldF9tZXNzYWdlX2NhbGxiYWNrKE5VTEwpOworCQkJYnJlYWs7CiAJCWNhc2UgJ2gnOgogCQljYXNlICc/JzoKIAkJCXVzYWdlKCk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMgYi9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKaW5kZXggN2NhYWJkYi4uNjczMTM3NyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0cnVjdCBwcm9wZXJ0eSAqc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3RydWN0IHN5bWJvbCAqc3ltKQorc3RhdGljIHN0cnVjdCBwcm9wZXJ0eSAqc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3RydWN0IHN5bWJvbCAqc3ltKQogewogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKIApAQCAtMTg2LDYgKzE4NiwyNiBAQAogCXN5bS0+Y3Vyci52YWwgPSBzdHJkdXAoc3RyKTsKIH0KIAorc3RhdGljIHZvaWQgc3ltX3NldF9jaGFuZ2VkKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9DSEFOR0VEOworCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJaWYgKHByb3AtPm1lbnUpCisJCQlwcm9wLT5tZW51LT5mbGFncyB8PSBNRU5VX0NIQU5HRUQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBzeW1fc2V0X2FsbF9jaGFuZ2VkKHZvaWQpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWludCBpOworCisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkKKwkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7Cit9CisKIHN0YXRpYyB2b2lkIHN5bV9jYWxjX3Zpc2liaWxpdHkoc3RydWN0IHN5bWJvbCAqc3ltKQogewogCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKQEAgLTQ1MSwyNiArNDcxLDYgQEAKIAkJc3ltX2NhbGNfdmFsdWUobW9kdWxlc19zeW0pOwogfQogCi12b2lkIHN5bV9zZXRfY2hhbmdlZChzdHJ1Y3Qgc3ltYm9sICpzeW0pCi17Ci0Jc3RydWN0IHByb3BlcnR5ICpwcm9wOwotCi0Jc3ltLT5mbGFncyB8PSBTWU1CT0xfQ0hBTkdFRDsKLQlmb3IgKHByb3AgPSBzeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7Ci0JCWlmIChwcm9wLT5tZW51KQotCQkJcHJvcC0+bWVudS0+ZmxhZ3MgfD0gTUVOVV9DSEFOR0VEOwotCX0KLX0KLQotdm9pZCBzeW1fc2V0X2FsbF9jaGFuZ2VkKHZvaWQpCi17Ci0Jc3RydWN0IHN5bWJvbCAqc3ltOwotCWludCBpOwotCi0JZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkKLQkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7Ci19Ci0KIGJvb2wgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzdHJ1Y3Qgc3ltYm9sICpzeW0sIHRyaXN0YXRlIHZhbCkKIHsKIAlpbnQgdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3V0aWwuYyBiL3NjcmlwdHMva2NvbmZpZy91dGlsLmMKaW5kZXggOTRmOWM4My4uMGU3NjA0MiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3V0aWwuYworKysgYi9zY3JpcHRzL2tjb25maWcvdXRpbC5jCkBAIC04OCwxNiArODgsNiBAQAogCXJldHVybiBnczsKIH0KIAotLyogQWxsb2NhdGUgYW5kIGFzc2lnbiBncm93YWJsZSBzdHJpbmcgKi8KLXN0cnVjdCBnc3RyIHN0cl9hc3NpZ24oY29uc3QgY2hhciAqcykKLXsKLQlzdHJ1Y3QgZ3N0ciBnczsKLQlncy5zID0gc3RyZHVwKHMpOwotCWdzLmxlbiA9IHN0cmxlbihzKSArIDE7Ci0JZ3MubWF4X3dpZHRoID0gMDsKLQlyZXR1cm4gZ3M7Ci19Ci0KIC8qIEZyZWUgc3RvcmFnZSBmb3IgZ3Jvd2FibGUgc3RyaW5nICovCiB2b2lkIHN0cl9mcmVlKHN0cnVjdCBnc3RyICpncykKIHsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L0tjb25maWcgYi9zZWN1cml0eS9LY29uZmlnCmluZGV4IGJlYjg2YjUuLmJmNGVjNDYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L0tjb25maWcKKysrIGIvc2VjdXJpdHkvS2NvbmZpZwpAQCAtMjEsNiArMjEsNyBAQAogY29uZmlnIFNFQ1VSSVRZCiAJYm9vbCAiRW5hYmxlIGRpZmZlcmVudCBzZWN1cml0eSBtb2RlbHMiCiAJZGVwZW5kcyBvbiBTWVNGUworCWRlcGVuZHMgb24gTVVMVElVU0VSCiAJaGVscAogCSAgVGhpcyBhbGxvd3MgeW91IHRvIGNob29zZSBkaWZmZXJlbnQgc2VjdXJpdHkgbW9kdWxlcyB0byBiZQogCSAgY29uZmlndXJlZCBpbnRvIHlvdXIga2VybmVsLgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvYXBwYXJtb3IvbHNtLmMgYi9zZWN1cml0eS9hcHBhcm1vci9sc20uYwppbmRleCAxMDdkYjg4Li5kZDU2YmZmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9hcHBhcm1vci9sc20uYworKysgYi9zZWN1cml0eS9hcHBhcm1vci9sc20uYwpAQCAtMzY0LDEyICszNjQsMTIgQEAKIAlyZXR1cm4gY29tbW9uX3Blcm0oT1BfQ0hPV04sIHBhdGgsIEFBX01BWV9DSE9XTiwgJmNvbmQpOwogfQogCi1zdGF0aWMgaW50IGFwcGFybW9yX2lub2RlX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyBpbnQgYXBwYXJtb3JfaW5vZGVfZ2V0YXR0cihjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKLQlpZiAoIW1lZGlhdGVkX2ZpbGVzeXN0ZW0oZGVudHJ5KSkKKwlpZiAoIW1lZGlhdGVkX2ZpbGVzeXN0ZW0ocGF0aC0+ZGVudHJ5KSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gY29tbW9uX3Blcm1fbW50X2RlbnRyeShPUF9HRVRBVFRSLCBtbnQsIGRlbnRyeSwKKwlyZXR1cm4gY29tbW9uX3Blcm1fbW50X2RlbnRyeShPUF9HRVRBVFRSLCBwYXRoLT5tbnQsIHBhdGgtPmRlbnRyeSwKIAkJCQkgICAgICBBQV9NQVlfTUVUQV9SRUFEKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvY2FwYWJpbGl0eS5jIGIvc2VjdXJpdHkvY2FwYWJpbGl0eS5jCmluZGV4IDA3MGRkNDYuLjBkMDNmY2MgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2NhcGFiaWxpdHkuYworKysgYi9zZWN1cml0eS9jYXBhYmlsaXR5LmMKQEAgLTIyNSw3ICsyMjUsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGNhcF9pbm9kZV9nZXRhdHRyKHN0cnVjdCB2ZnNtb3VudCAqbW50LCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCitzdGF0aWMgaW50IGNhcF9pbm9kZV9nZXRhdHRyKGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoKQogewogCXJldHVybiAwOwogfQpAQCAtNzc2LDExICs3NzYsNiBAQAogewogCXJldHVybiAwOwogfQotCi1zdGF0aWMgdm9pZCBjYXBfc2tiX293bmVkX2J5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaykKLXsKLX0KLQogI2VuZGlmCS8qIENPTkZJR19TRUNVUklUWV9ORVRXT1JLICovCiAKICNpZmRlZiBDT05GSUdfU0VDVVJJVFlfTkVUV09SS19YRlJNCkBAIC0xMTM0LDcgKzExMjksNiBAQAogCXNldF90b19jYXBfaWZfbnVsbChvcHMsIHR1bl9kZXZfb3Blbik7CiAJc2V0X3RvX2NhcF9pZl9udWxsKG9wcywgdHVuX2Rldl9hdHRhY2hfcXVldWUpOwogCXNldF90b19jYXBfaWZfbnVsbChvcHMsIHR1bl9kZXZfYXR0YWNoKTsKLQlzZXRfdG9fY2FwX2lmX251bGwob3BzLCBza2Jfb3duZWRfYnkpOwogI2VuZGlmCS8qIENPTkZJR19TRUNVUklUWV9ORVRXT1JLICovCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTQogCXNldF90b19jYXBfaWZfbnVsbChvcHMsIHhmcm1fcG9saWN5X2FsbG9jX3NlY3VyaXR5KTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2tleXMvY29tcGF0LmMgYi9zZWN1cml0eS9rZXlzL2NvbXBhdC5jCmluZGV4IDM0Nzg5NjUuLjI1NDMwYTMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvY29tcGF0LmMKKysrIGIvc2VjdXJpdHkva2V5cy9jb21wYXQuYwpAQCAtMzEsMzAgKzMxLDIxIEBACiAJa2V5X3NlcmlhbF90IHJpbmdpZCkKIHsKIAlzdHJ1Y3QgaW92ZWMgaW92c3RhY2tbVUlPX0ZBU1RJT1ZdLCAqaW92ID0gaW92c3RhY2s7CisJc3RydWN0IGlvdl9pdGVyIGZyb207CiAJbG9uZyByZXQ7CiAKLQlpZiAoIV9wYXlsb2FkX2lvdiB8fCAhaW9jKQotCQlnb3RvIG5vX3BheWxvYWQ7CisJaWYgKCFfcGF5bG9hZF9pb3YpCisJCWlvYyA9IDA7CiAKLQlyZXQgPSBjb21wYXRfcndfY29weV9jaGVja191dmVjdG9yKFdSSVRFLCBfcGF5bG9hZF9pb3YsIGlvYywKLQkJCQkJICAgQVJSQVlfU0laRShpb3ZzdGFjayksCi0JCQkJCSAgIGlvdnN0YWNrLCAmaW92KTsKKwlyZXQgPSBjb21wYXRfaW1wb3J0X2lvdmVjKFdSSVRFLCBfcGF5bG9hZF9pb3YsIGlvYywKKwkJCQkgIEFSUkFZX1NJWkUoaW92c3RhY2spLCAmaW92LAorCQkJCSAgJmZyb20pOwogCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycjsKLQlpZiAocmV0ID09IDApCi0JCWdvdG8gbm9fcGF5bG9hZF9mcmVlOworCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0ga2V5Y3RsX2luc3RhbnRpYXRlX2tleV9jb21tb24oaWQsIGlvdiwgaW9jLCByZXQsIHJpbmdpZCk7Ci1lcnI6Ci0JaWYgKGlvdiAhPSBpb3ZzdGFjaykKLQkJa2ZyZWUoaW92KTsKKwlyZXQgPSBrZXljdGxfaW5zdGFudGlhdGVfa2V5X2NvbW1vbihpZCwgJmZyb20sIHJpbmdpZCk7CisJa2ZyZWUoaW92KTsKIAlyZXR1cm4gcmV0OwotCi1ub19wYXlsb2FkX2ZyZWU6Ci0JaWYgKGlvdiAhPSBpb3ZzdGFjaykKLQkJa2ZyZWUoaW92KTsKLW5vX3BheWxvYWQ6Ci0JcmV0dXJuIGtleWN0bF9pbnN0YW50aWF0ZV9rZXlfY29tbW9uKGlkLCBOVUxMLCAwLCAwLCByaW5naWQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkva2V5cy9pbnRlcm5hbC5oIGIvc2VjdXJpdHkva2V5cy9pbnRlcm5hbC5oCmluZGV4IDIwMGUzNzguLjUxMDVjMmMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2tleXMvaW50ZXJuYWwuaAorKysgYi9zZWN1cml0eS9rZXlzL2ludGVybmFsLmgKQEAgLTI0Myw5ICsyNDMsMTAgQEAKIAkJCQkgICAgICAgdW5zaWduZWQsIGtleV9zZXJpYWxfdCk7CiBleHRlcm4gbG9uZyBrZXljdGxfaW52YWxpZGF0ZV9rZXkoa2V5X3NlcmlhbF90KTsKIAorc3RydWN0IGlvdl9pdGVyOwogZXh0ZXJuIGxvbmcga2V5Y3RsX2luc3RhbnRpYXRlX2tleV9jb21tb24oa2V5X3NlcmlhbF90LAotCQkJCQkgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqLAotCQkJCQkgIHVuc2lnbmVkLCBzaXplX3QsIGtleV9zZXJpYWxfdCk7CisJCQkJCSAgc3RydWN0IGlvdl9pdGVyICosCisJCQkJCSAga2V5X3NlcmlhbF90KTsKICNpZmRlZiBDT05GSUdfUEVSU0lTVEVOVF9LRVlSSU5HUwogZXh0ZXJuIGxvbmcga2V5Y3RsX2dldF9wZXJzaXN0ZW50KHVpZF90LCBrZXlfc2VyaWFsX3QpOwogZXh0ZXJuIHVuc2lnbmVkIHBlcnNpc3RlbnRfa2V5cmluZ19leHBpcnk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jIGIvc2VjdXJpdHkva2V5cy9rZXljdGwuYwppbmRleCA0NzQzZDcxLi4wYjllYzc4IDEwMDY0NAotLS0gYS9zZWN1cml0eS9rZXlzL2tleWN0bC5jCisrKyBiL3NlY3VyaXR5L2tleXMva2V5Y3RsLmMKQEAgLTk5OCwyMSArOTk4LDYgQEAKIH0KIAogLyoKLSAqIENvcHkgdGhlIGlvdmVjIGRhdGEgZnJvbSB1c2Vyc3BhY2UKLSAqLwotc3RhdGljIGxvbmcgY29weV9mcm9tX3VzZXJfaW92ZWModm9pZCAqYnVmZmVyLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwKLQkJCQkgdW5zaWduZWQgaW9jKQotewotCWZvciAoOyBpb2MgPiAwOyBpb2MtLSkgewotCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmZmVyLCBpb3YtPmlvdl9iYXNlLCBpb3YtPmlvdl9sZW4pICE9IDApCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnVmZmVyICs9IGlvdi0+aW92X2xlbjsKLQkJaW92Kys7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKgogICogSW5zdGFudGlhdGUgYSBrZXkgd2l0aCB0aGUgc3BlY2lmaWVkIHBheWxvYWQgYW5kIGxpbmsgdGhlIGtleSBpbnRvIHRoZQogICogZGVzdGluYXRpb24ga2V5cmluZyBpZiBvbmUgaXMgZ2l2ZW4uCiAgKgpAQCAtMTAyMiwyMCArMTAwNywyMSBAQAogICogSWYgc3VjY2Vzc2Z1bCwgMCB3aWxsIGJlIHJldHVybmVkLgogICovCiBsb25nIGtleWN0bF9pbnN0YW50aWF0ZV9rZXlfY29tbW9uKGtleV9zZXJpYWxfdCBpZCwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKnBheWxvYWRfaW92LAotCQkJCSAgIHVuc2lnbmVkIGlvYywKLQkJCQkgICBzaXplX3QgcGxlbiwKKwkJCQkgICBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20sCiAJCQkJICAga2V5X3NlcmlhbF90IHJpbmdpZCkKIHsKIAljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZCA9IGN1cnJlbnRfY3JlZCgpOwogCXN0cnVjdCByZXF1ZXN0X2tleV9hdXRoICpya2E7CiAJc3RydWN0IGtleSAqaW5zdGtleSwgKmRlc3Rfa2V5cmluZzsKKwlzaXplX3QgcGxlbiA9IGZyb20gPyBpb3ZfaXRlcl9jb3VudChmcm9tKSA6IDA7CiAJdm9pZCAqcGF5bG9hZDsKIAlsb25nIHJldDsKLQlib29sIHZtID0gZmFsc2U7CiAKIAlrZW50ZXIoIiVkLCwlenUsJWQiLCBpZCwgcGxlbiwgcmluZ2lkKTsKIAorCWlmICghcGxlbikKKwkJZnJvbSA9IE5VTEw7CisKIAlyZXQgPSAtRUlOVkFMOwogCWlmIChwbGVuID4gMTAyNCAqIDEwMjQgLSAxKQogCQlnb3RvIGVycm9yOwpAQCAtMTA1NCwyMCArMTA0MCwxOSBAQAogCS8qIHB1bGwgdGhlIHBheWxvYWQgaW4gaWYgb25lIHdhcyBzdXBwbGllZCAqLwogCXBheWxvYWQgPSBOVUxMOwogCi0JaWYgKHBheWxvYWRfaW92KSB7CisJaWYgKGZyb20pIHsKIAkJcmV0ID0gLUVOT01FTTsKIAkJcGF5bG9hZCA9IGttYWxsb2MocGxlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghcGF5bG9hZCkgewogCQkJaWYgKHBsZW4gPD0gUEFHRV9TSVpFKQogCQkJCWdvdG8gZXJyb3I7Ci0JCQl2bSA9IHRydWU7CiAJCQlwYXlsb2FkID0gdm1hbGxvYyhwbGVuKTsKIAkJCWlmICghcGF5bG9hZCkKIAkJCQlnb3RvIGVycm9yOwogCQl9CiAKLQkJcmV0ID0gY29weV9mcm9tX3VzZXJfaW92ZWMocGF5bG9hZCwgcGF5bG9hZF9pb3YsIGlvYyk7Ci0JCWlmIChyZXQgPCAwKQorCQlyZXQgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX2l0ZXIocGF5bG9hZCwgcGxlbiwgZnJvbSkgIT0gcGxlbikKIAkJCWdvdG8gZXJyb3IyOwogCX0KIApAQCAtMTA4OSwxMCArMTA3NCw3IEBACiAJCWtleWN0bF9jaGFuZ2VfcmVxa2V5X2F1dGgoTlVMTCk7CiAKIGVycm9yMjoKLQlpZiAoIXZtKQotCQlrZnJlZShwYXlsb2FkKTsKLQllbHNlCi0JCXZmcmVlKHBheWxvYWQpOworCWt2ZnJlZShwYXlsb2FkKTsKIGVycm9yOgogCXJldHVybiByZXQ7CiB9CkBAIC0xMTEyLDE1ICsxMDk0LDE5IEBACiAJCQkgICAga2V5X3NlcmlhbF90IHJpbmdpZCkKIHsKIAlpZiAoX3BheWxvYWQgJiYgcGxlbikgewotCQlzdHJ1Y3QgaW92ZWMgaW92WzFdID0gewotCQkJWzBdLmlvdl9iYXNlID0gKHZvaWQgX191c2VyICopX3BheWxvYWQsCi0JCQlbMF0uaW92X2xlbiAgPSBwbGVuCi0JCX07CisJCXN0cnVjdCBpb3ZlYyBpb3Y7CisJCXN0cnVjdCBpb3ZfaXRlciBmcm9tOworCQlpbnQgcmV0OwogCi0JCXJldHVybiBrZXljdGxfaW5zdGFudGlhdGVfa2V5X2NvbW1vbihpZCwgaW92LCAxLCBwbGVuLCByaW5naWQpOworCQlyZXQgPSBpbXBvcnRfc2luZ2xlX3JhbmdlKFdSSVRFLCAodm9pZCBfX3VzZXIgKilfcGF5bG9hZCwgcGxlbiwKKwkJCQkJICAmaW92LCAmZnJvbSk7CisJCWlmICh1bmxpa2VseShyZXQpKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXR1cm4ga2V5Y3RsX2luc3RhbnRpYXRlX2tleV9jb21tb24oaWQsICZmcm9tLCByaW5naWQpOwogCX0KIAotCXJldHVybiBrZXljdGxfaW5zdGFudGlhdGVfa2V5X2NvbW1vbihpZCwgTlVMTCwgMCwgMCwgcmluZ2lkKTsKKwlyZXR1cm4ga2V5Y3RsX2luc3RhbnRpYXRlX2tleV9jb21tb24oaWQsIE5VTEwsIHJpbmdpZCk7CiB9CiAKIC8qCkBAIC0xMTM4LDI5ICsxMTI0LDE5IEBACiAJCQkJa2V5X3NlcmlhbF90IHJpbmdpZCkKIHsKIAlzdHJ1Y3QgaW92ZWMgaW92c3RhY2tbVUlPX0ZBU1RJT1ZdLCAqaW92ID0gaW92c3RhY2s7CisJc3RydWN0IGlvdl9pdGVyIGZyb207CiAJbG9uZyByZXQ7CiAKLQlpZiAoIV9wYXlsb2FkX2lvdiB8fCAhaW9jKQotCQlnb3RvIG5vX3BheWxvYWQ7CisJaWYgKCFfcGF5bG9hZF9pb3YpCisJCWlvYyA9IDA7CiAKLQlyZXQgPSByd19jb3B5X2NoZWNrX3V2ZWN0b3IoV1JJVEUsIF9wYXlsb2FkX2lvdiwgaW9jLAotCQkJCSAgICBBUlJBWV9TSVpFKGlvdnN0YWNrKSwgaW92c3RhY2ssICZpb3YpOworCXJldCA9IGltcG9ydF9pb3ZlYyhXUklURSwgX3BheWxvYWRfaW92LCBpb2MsCisJCQkJICAgIEFSUkFZX1NJWkUoaW92c3RhY2spLCAmaW92LCAmZnJvbSk7CiAJaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOwotCWlmIChyZXQgPT0gMCkKLQkJZ290byBub19wYXlsb2FkX2ZyZWU7Ci0KLQlyZXQgPSBrZXljdGxfaW5zdGFudGlhdGVfa2V5X2NvbW1vbihpZCwgaW92LCBpb2MsIHJldCwgcmluZ2lkKTsKLWVycjoKLQlpZiAoaW92ICE9IGlvdnN0YWNrKQotCQlrZnJlZShpb3YpOworCQlyZXR1cm4gcmV0OworCXJldCA9IGtleWN0bF9pbnN0YW50aWF0ZV9rZXlfY29tbW9uKGlkLCAmZnJvbSwgcmluZ2lkKTsKKwlrZnJlZShpb3YpOwogCXJldHVybiByZXQ7Ci0KLW5vX3BheWxvYWRfZnJlZToKLQlpZiAoaW92ICE9IGlvdnN0YWNrKQotCQlrZnJlZShpb3YpOwotbm9fcGF5bG9hZDoKLQlyZXR1cm4ga2V5Y3RsX2luc3RhbnRpYXRlX2tleV9jb21tb24oaWQsIE5VTEwsIDAsIDAsIHJpbmdpZCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zZWN1cml0eS9sc21fYXVkaXQuYyBiL3NlY3VyaXR5L2xzbV9hdWRpdC5jCmluZGV4IDY5ZmRmM2IuLmI1MjZkZGMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2xzbV9hdWRpdC5jCisrKyBiL3NlY3VyaXR5L2xzbV9hdWRpdC5jCkBAIC0yMTEsNyArMjExLDcgQEAKIHN0YXRpYyB2b2lkIGR1bXBfY29tbW9uX2F1ZGl0X2RhdGEoc3RydWN0IGF1ZGl0X2J1ZmZlciAqYWIsCiAJCQkJICAgc3RydWN0IGNvbW1vbl9hdWRpdF9kYXRhICphKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKKwljaGFyIGNvbW1bc2l6ZW9mKGN1cnJlbnQtPmNvbW0pXTsKIAogCS8qCiAJICogVG8ga2VlcCBzdGFjayBzaXplcyBpbiBjaGVjayBmb3JjZSBwcm9ncmFtZXJzIHRvIG5vdGljZSBpZiB0aGV5CkBAIC0yMjAsOCArMjIwLDggQEAKIAkgKi8KIAlCVUlMRF9CVUdfT04oc2l6ZW9mKGEtPnUpID4gc2l6ZW9mKHZvaWQgKikqMik7CiAKLQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHBpZD0lZCBjb21tPSIsIHRhc2tfcGlkX25yKHRzaykpOwotCWF1ZGl0X2xvZ191bnRydXN0ZWRzdHJpbmcoYWIsIHRzay0+Y29tbSk7CisJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBwaWQ9JWQgY29tbT0iLCB0YXNrX3BpZF9ucihjdXJyZW50KSk7CisJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgbWVtY3B5KGNvbW0sIGN1cnJlbnQtPmNvbW0sIHNpemVvZihjb21tKSkpOwogCiAJc3dpdGNoIChhLT50eXBlKSB7CiAJY2FzZSBMU01fQVVESVRfREFUQV9OT05FOgpAQCAtMjc2LDE2ICsyNzYsMTkgQEAKIAkJYXVkaXRfbG9nX2Zvcm1hdChhYiwgIiBpbm89JWx1IiwgaW5vZGUtPmlfaW5vKTsKIAkJYnJlYWs7CiAJfQotCWNhc2UgTFNNX0FVRElUX0RBVEFfVEFTSzoKLQkJdHNrID0gYS0+dS50c2s7CisJY2FzZSBMU01fQVVESVRfREFUQV9UQVNLOiB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gYS0+dS50c2s7CiAJCWlmICh0c2spIHsKIAkJCXBpZF90IHBpZCA9IHRhc2tfcGlkX25yKHRzayk7CiAJCQlpZiAocGlkKSB7CisJCQkJY2hhciBjb21tW3NpemVvZih0c2stPmNvbW0pXTsKIAkJCQlhdWRpdF9sb2dfZm9ybWF0KGFiLCAiIHBpZD0lZCBjb21tPSIsIHBpZCk7Ci0JCQkJYXVkaXRfbG9nX3VudHJ1c3RlZHN0cmluZyhhYiwgdHNrLT5jb21tKTsKKwkJCQlhdWRpdF9sb2dfdW50cnVzdGVkc3RyaW5nKGFiLAorCQkJCSAgICBtZW1jcHkoY29tbSwgdHNrLT5jb21tLCBzaXplb2YoY29tbSkpKTsKIAkJCX0KIAkJfQogCQlicmVhazsKKwl9CiAJY2FzZSBMU01fQVVESVRfREFUQV9ORVQ6CiAJCWlmIChhLT51Lm5ldC0+c2spIHsKIAkJCXN0cnVjdCBzb2NrICpzayA9IGEtPnUubmV0LT5zazsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlY3VyaXR5LmMgYi9zZWN1cml0eS9zZWN1cml0eS5jCmluZGV4IGU4MWQ1YmIuLjczMGFjNjUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlY3VyaXR5LmMKKysrIGIvc2VjdXJpdHkvc2VjdXJpdHkuYwpAQCAtNjA4LDExICs2MDgsMTEgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNlY3VyaXR5X2lub2RlX3NldGF0dHIpOwogCi1pbnQgc2VjdXJpdHlfaW5vZGVfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQoraW50IHNlY3VyaXR5X2lub2RlX2dldGF0dHIoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgpCiB7Ci0JaWYgKHVubGlrZWx5KElTX1BSSVZBVEUoZGVudHJ5LT5kX2lub2RlKSkpCisJaWYgKHVubGlrZWx5KElTX1BSSVZBVEUocGF0aC0+ZGVudHJ5LT5kX2lub2RlKSkpCiAJCXJldHVybiAwOwotCXJldHVybiBzZWN1cml0eV9vcHMtPmlub2RlX2dldGF0dHIobW50LCBkZW50cnkpOworCXJldHVybiBzZWN1cml0eV9vcHMtPmlub2RlX2dldGF0dHIocGF0aCk7CiB9CiAKIGludCBzZWN1cml0eV9pbm9kZV9zZXR4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUsCkBAIC0xMzU5LDExICsxMzU5LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2VjdXJpdHlfdHVuX2Rldl9vcGVuKTsKIAotdm9pZCBzZWN1cml0eV9za2Jfb3duZWRfYnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNvY2sgKnNrKQotewotCXNlY3VyaXR5X29wcy0+c2tiX293bmVkX2J5KHNrYiwgc2spOwotfQotCiAjZW5kaWYJLyogQ09ORklHX1NFQ1VSSVRZX05FVFdPUksgKi8KIAogI2lmZGVmIENPTkZJR19TRUNVUklUWV9ORVRXT1JLX1hGUk0KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvYXZjLmMgYi9zZWN1cml0eS9zZWxpbnV4L2F2Yy5jCmluZGV4IGFmY2MwYWUuLjNjMTdkZGEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvYXZjLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9hdmMuYwpAQCAtNzI0LDEyICs3MjQsMTAgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlub2RlID0gYXZjX2xvb2t1cChzc2lkLCB0c2lkLCB0Y2xhc3MpOwotCWlmICh1bmxpa2VseSghbm9kZSkpIHsKKwlpZiAodW5saWtlbHkoIW5vZGUpKQogCQlub2RlID0gYXZjX2NvbXB1dGVfYXYoc3NpZCwgdHNpZCwgdGNsYXNzLCBhdmQpOwotCX0gZWxzZSB7CisJZWxzZQogCQltZW1jcHkoYXZkLCAmbm9kZS0+YWUuYXZkLCBzaXplb2YoKmF2ZCkpOwotCQlhdmQgPSAmbm9kZS0+YWUuYXZkOwotCX0KIAogCWRlbmllZCA9IHJlcXVlc3RlZCAmIH4oYXZkLT5hbGxvd2VkKTsKIAlpZiAodW5saWtlbHkoZGVuaWVkKSkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwppbmRleCA0ZDFhNTQxLi5jMzE4YjMwIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCkBAIC01MSw3ICs1MSw2IEBACiAjaW5jbHVkZSA8bGludXgvdHR5Lmg+CiAjaW5jbHVkZSA8bmV0L2ljbXAuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4JCS8qIGZvciBsb2NhbF9wb3J0X3JhbmdlW10gKi8KLSNpbmNsdWRlIDxuZXQvc29jay5oPgogI2luY2x1ZGUgPG5ldC90Y3AuaD4JCS8qIHN0cnVjdCBvcl9jYWxsYWJsZSB1c2VkIGluIHNvY2tfcmN2X3NrYiAqLwogI2luY2x1ZGUgPG5ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CkBAIC0xNjIzLDcgKzE2MjIsNyBAQAogICAgdGhlIHBhdGggdG8gaGVscCB0aGUgYXVkaXRpbmcgY29kZSB0byBtb3JlIGVhc2lseSBnZW5lcmF0ZSB0aGUKICAgIHBhdGhuYW1lIGlmIG5lZWRlZC4gKi8KIHN0YXRpYyBpbmxpbmUgaW50IHBhdGhfaGFzX3Blcm0oY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQsCi0JCQkJc3RydWN0IHBhdGggKnBhdGgsCisJCQkJY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsCiAJCQkJdTMyIGF2KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBwYXRoLT5kZW50cnktPmRfaW5vZGU7CkBAIC0yOTU0LDE1ICsyOTUzLDkgQEAKIAlyZXR1cm4gZGVudHJ5X2hhc19wZXJtKGNyZWQsIGRlbnRyeSwgYXYpOwogfQogCi1zdGF0aWMgaW50IHNlbGludXhfaW5vZGVfZ2V0YXR0cihzdHJ1Y3QgdmZzbW91bnQgKm1udCwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KQorc3RhdGljIGludCBzZWxpbnV4X2lub2RlX2dldGF0dHIoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgpCiB7Ci0JY29uc3Qgc3RydWN0IGNyZWQgKmNyZWQgPSBjdXJyZW50X2NyZWQoKTsKLQlzdHJ1Y3QgcGF0aCBwYXRoOwotCi0JcGF0aC5kZW50cnkgPSBkZW50cnk7Ci0JcGF0aC5tbnQgPSBtbnQ7Ci0KLQlyZXR1cm4gcGF0aF9oYXNfcGVybShjcmVkLCAmcGF0aCwgRklMRV9fR0VUQVRUUik7CisJcmV0dXJuIHBhdGhfaGFzX3Blcm0oY3VycmVudF9jcmVkKCksIHBhdGgsIEZJTEVfX0dFVEFUVFIpOwogfQogCiBzdGF0aWMgaW50IHNlbGludXhfaW5vZGVfc2V0b3RoZXJ4YXR0cihzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIGNvbnN0IGNoYXIgKm5hbWUpCkBAIC00NjUyLDExICs0NjQ1LDYgQEAKIAlzZWxpbnV4X3NrYl9wZWVybGJsX3NpZChza2IsIGZhbWlseSwgJnNrc2VjLT5wZWVyX3NpZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNlbGludXhfc2tiX293bmVkX2J5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaykKLXsKLQlza2Jfc2V0X293bmVyX3coc2tiLCBzayk7Ci19Ci0KIHN0YXRpYyBpbnQgc2VsaW51eF9zZWNtYXJrX3JlbGFiZWxfcGFja2V0KHUzMiBzaWQpCiB7CiAJY29uc3Qgc3RydWN0IHRhc2tfc2VjdXJpdHlfc3RydWN0ICpfX3RzZWM7CkBAIC00ODU4LDIxICs0ODQ2LDE3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VsaW51eF9pcHY0X2ZvcndhcmQoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCQkgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewotCXJldHVybiBzZWxpbnV4X2lwX2ZvcndhcmQoc2tiLCBpbiwgUEZfSU5FVCk7CisJcmV0dXJuIHNlbGludXhfaXBfZm9yd2FyZChza2IsIHN0YXRlLT5pbiwgUEZfSU5FVCk7CiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VsaW51eF9pcHY2X2ZvcndhcmQoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopKQorCQkJCQkgY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewotCXJldHVybiBzZWxpbnV4X2lwX2ZvcndhcmQoc2tiLCBpbiwgUEZfSU5FVDYpOworCXJldHVybiBzZWxpbnV4X2lwX2ZvcndhcmQoc2tiLCBzdGF0ZS0+aW4sIFBGX0lORVQ2KTsKIH0KICNlbmRpZgkvKiBJUFY2ICovCiAKQEAgLTQ5MjAsOSArNDkwNCw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VsaW51eF9pcHY0X291dHB1dChjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXJldHVybiBzZWxpbnV4X2lwX291dHB1dChza2IsIFBGX0lORVQpOwogfQpAQCAtNTA5NywyMSArNTA3OSwxNyBAQAogCiBzdGF0aWMgdW5zaWduZWQgaW50IHNlbGludXhfaXB2NF9wb3N0cm91dGUoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkJICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKLQlyZXR1cm4gc2VsaW51eF9pcF9wb3N0cm91dGUoc2tiLCBvdXQsIFBGX0lORVQpOworCXJldHVybiBzZWxpbnV4X2lwX3Bvc3Ryb3V0ZShza2IsIHN0YXRlLT5vdXQsIFBGX0lORVQpOwogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCiBzdGF0aWMgdW5zaWduZWQgaW50IHNlbGludXhfaXB2Nl9wb3N0cm91dGUoY29uc3Qgc3RydWN0IG5mX2hvb2tfb3BzICpvcHMsCiAJCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCSAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICppbiwKLQkJCQkJICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm91dCwKLQkJCQkJICAgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKikpCisJCQkJCSAgIGNvbnN0IHN0cnVjdCBuZl9ob29rX3N0YXRlICpzdGF0ZSkKIHsKLQlyZXR1cm4gc2VsaW51eF9pcF9wb3N0cm91dGUoc2tiLCBvdXQsIFBGX0lORVQ2KTsKKwlyZXR1cm4gc2VsaW51eF9pcF9wb3N0cm91dGUoc2tiLCBzdGF0ZS0+b3V0LCBQRl9JTkVUNik7CiB9CiAjZW5kaWYJLyogSVBWNiAqLwogCkBAIC02MDQxLDcgKzYwMTksNiBAQAogCS50dW5fZGV2X2F0dGFjaF9xdWV1ZSA9CQlzZWxpbnV4X3R1bl9kZXZfYXR0YWNoX3F1ZXVlLAogCS50dW5fZGV2X2F0dGFjaCA9CQlzZWxpbnV4X3R1bl9kZXZfYXR0YWNoLAogCS50dW5fZGV2X29wZW4gPQkJCXNlbGludXhfdHVuX2Rldl9vcGVuLAotCS5za2Jfb3duZWRfYnkgPQkJCXNlbGludXhfc2tiX293bmVkX2J5LAogCiAjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX05FVFdPUktfWEZSTQogCS54ZnJtX3BvbGljeV9hbGxvY19zZWN1cml0eSA9CXNlbGludXhfeGZybV9wb2xpY3lfYWxsb2MsCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMgYi9zZWN1cml0eS9zZWxpbnV4L25sbXNndGFiLmMKaW5kZXggMmRmN2I5MC4uMmJiYjQxOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ubG1zZ3RhYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvbmxtc2d0YWIuYwpAQCAtNzMsNiArNzMsOSBAQAogCXsgUlRNX05FV01EQiwJCU5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19XUklURSB9LAogCXsgUlRNX0RFTE1EQiwJCU5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19XUklURSAgfSwKIAl7IFJUTV9HRVRNREIsCQlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfUkVBRCAgfSwKKwl7IFJUTV9ORVdOU0lELAkJTkVUTElOS19ST1VURV9TT0NLRVRfX05MTVNHX1dSSVRFIH0sCisJeyBSVE1fREVMTlNJRCwJCU5FVExJTktfUk9VVEVfU09DS0VUX19OTE1TR19SRUFEICB9LAorCXsgUlRNX0dFVE5TSUQsCQlORVRMSU5LX1JPVVRFX1NPQ0tFVF9fTkxNU0dfUkVBRCAgfSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgbmxtc2dfcGVybSBubG1zZ190Y3BkaWFnX3Blcm1zW10gPQpAQCAtMTAwLDYgKzEwMywxMyBAQAogCXsgWEZSTV9NU0dfRkxVU0hQT0xJQ1ksCU5FVExJTktfWEZSTV9TT0NLRVRfX05MTVNHX1dSSVRFIH0sCiAJeyBYRlJNX01TR19ORVdBRSwJTkVUTElOS19YRlJNX1NPQ0tFVF9fTkxNU0dfV1JJVEUgfSwKIAl7IFhGUk1fTVNHX0dFVEFFLAlORVRMSU5LX1hGUk1fU09DS0VUX19OTE1TR19SRUFEICB9LAorCXsgWEZSTV9NU0dfUkVQT1JULAlORVRMSU5LX1hGUk1fU09DS0VUX19OTE1TR19SRUFEICB9LAorCXsgWEZSTV9NU0dfTUlHUkFURSwJTkVUTElOS19YRlJNX1NPQ0tFVF9fTkxNU0dfV1JJVEUgfSwKKwl7IFhGUk1fTVNHX05FV1NBRElORk8sCU5FVExJTktfWEZSTV9TT0NLRVRfX05MTVNHX1JFQUQgIH0sCisJeyBYRlJNX01TR19HRVRTQURJTkZPLAlORVRMSU5LX1hGUk1fU09DS0VUX19OTE1TR19SRUFEICB9LAorCXsgWEZSTV9NU0dfTkVXU1BESU5GTywJTkVUTElOS19YRlJNX1NPQ0tFVF9fTkxNU0dfV1JJVEUgfSwKKwl7IFhGUk1fTVNHX0dFVFNQRElORk8sCU5FVExJTktfWEZSTV9TT0NLRVRfX05MTVNHX1JFQUQgIH0sCisJeyBYRlJNX01TR19NQVBQSU5HLAlORVRMSU5LX1hGUk1fU09DS0VUX19OTE1TR19SRUFEICB9LAogfTsKIAogc3RhdGljIHN0cnVjdCBubG1zZ19wZXJtIG5sbXNnX2F1ZGl0X3Blcm1zW10gPQpAQCAtMTQzLDYgKzE1Myw4IEBACiAKIAlzd2l0Y2ggKHNjbGFzcykgewogCWNhc2UgU0VDQ0xBU1NfTkVUTElOS19ST1VURV9TT0NLRVQ6CisJCS8qIFJUTV9NQVggYWx3YXlzIHBvaW50IHRvIFJUTV9TRVR4eHh4LCBpZSBSVE1fTkVXeHh4ICsgMyAqLworCQlCVUlMRF9CVUdfT04oUlRNX01BWCAhPSAoUlRNX05FV05TSUQgKyAzKSk7CiAJCWVyciA9IG5sbXNnX3Blcm0obmxtc2dfdHlwZSwgcGVybSwgbmxtc2dfcm91dGVfcGVybXMsCiAJCQkJIHNpemVvZihubG1zZ19yb3V0ZV9wZXJtcykpOwogCQlicmVhazsKQEAgLTE1Myw2ICsxNjUsNyBAQAogCQlicmVhazsKIAogCWNhc2UgU0VDQ0xBU1NfTkVUTElOS19YRlJNX1NPQ0tFVDoKKwkJQlVJTERfQlVHX09OKFhGUk1fTVNHX01BWCAhPSBYRlJNX01TR19NQVBQSU5HKTsKIAkJZXJyID0gbmxtc2dfcGVybShubG1zZ190eXBlLCBwZXJtLCBubG1zZ194ZnJtX3Blcm1zLAogCQkJCSBzaXplb2Yobmxtc2dfeGZybV9wZXJtcykpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NlbGludXhmcy5jCmluZGV4IDE2ODRiY2MuLjVmZGUzNDMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc2VsaW51eGZzLmMKKysrIGIvc2VjdXJpdHkvc2VsaW51eC9zZWxpbnV4ZnMuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJCWdvdG8gb3V0OwogCiAJLyogTm8gcGFydGlhbCB3cml0ZXMuICovCi0JbGVuZ3RoID0gRUlOVkFMOworCWxlbmd0aCA9IC1FSU5WQUw7CiAJaWYgKCpwcG9zICE9IDApCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L3NzL2F2dGFiLmMgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2F2dGFiLmMKaW5kZXggYTNkZDlmYS4uYjY0ZjI3NyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9hdnRhYi5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvc3MvYXZ0YWIuYwpAQCAtMjUsMTAgKzI1LDQzIEBACiAKIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYXZ0YWJfbm9kZV9jYWNoZXA7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGF2dGFiX2hhc2goc3RydWN0IGF2dGFiX2tleSAqa2V5cCwgdTE2IG1hc2spCisvKiBCYXNlZCBvbiBNdXJtdXJIYXNoMywgd3JpdHRlbiBieSBBdXN0aW4gQXBwbGVieSBhbmQgcGxhY2VkIGluIHRoZQorICogcHVibGljIGRvbWFpbi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXZ0YWJfaGFzaChzdHJ1Y3QgYXZ0YWJfa2V5ICprZXlwLCB1MzIgbWFzaykKIHsKLQlyZXR1cm4gKChrZXlwLT50YXJnZXRfY2xhc3MgKyAoa2V5cC0+dGFyZ2V0X3R5cGUgPDwgMikgKwotCQkgKGtleXAtPnNvdXJjZV90eXBlIDw8IDkpKSAmIG1hc2spOworCXN0YXRpYyBjb25zdCB1MzIgYzEgPSAweGNjOWUyZDUxOworCXN0YXRpYyBjb25zdCB1MzIgYzIgPSAweDFiODczNTkzOworCXN0YXRpYyBjb25zdCB1MzIgcjEgPSAxNTsKKwlzdGF0aWMgY29uc3QgdTMyIHIyID0gMTM7CisJc3RhdGljIGNvbnN0IHUzMiBtICA9IDU7CisJc3RhdGljIGNvbnN0IHUzMiBuICA9IDB4ZTY1NDZiNjQ7CisKKwl1MzIgaGFzaCA9IDA7CisKKyNkZWZpbmUgbWl4KGlucHV0KSB7IFwKKwl1MzIgdiA9IGlucHV0OyBcCisJdiAqPSBjMTsgXAorCXYgPSAodiA8PCByMSkgfCAodiA+PiAoMzIgLSByMSkpOyBcCisJdiAqPSBjMjsgXAorCWhhc2ggXj0gdjsgXAorCWhhc2ggPSAoaGFzaCA8PCByMikgfCAoaGFzaCA+PiAoMzIgLSByMikpOyBcCisJaGFzaCA9IGhhc2ggKiBtICsgbjsgXAorfQorCisJbWl4KGtleXAtPnRhcmdldF9jbGFzcyk7CisJbWl4KGtleXAtPnRhcmdldF90eXBlKTsKKwltaXgoa2V5cC0+c291cmNlX3R5cGUpOworCisjdW5kZWYgbWl4CisKKwloYXNoIF49IGhhc2ggPj4gMTY7CisJaGFzaCAqPSAweDg1ZWJjYTZiOworCWhhc2ggXj0gaGFzaCA+PiAxMzsKKwloYXNoICo9IDB4YzJiMmFlMzU7CisJaGFzaCBePSBoYXNoID4+IDE2OworCisJcmV0dXJuIGhhc2ggJiBtYXNrOwogfQogCiBzdGF0aWMgc3RydWN0IGF2dGFiX25vZGUqCkBAIC00Niw4ICs3OSwxMiBAQAogCQluZXdub2RlLT5uZXh0ID0gcHJldi0+bmV4dDsKIAkJcHJldi0+bmV4dCA9IG5ld25vZGU7CiAJfSBlbHNlIHsKLQkJbmV3bm9kZS0+bmV4dCA9IGgtPmh0YWJsZVtodmFsdWVdOwotCQloLT5odGFibGVbaHZhbHVlXSA9IG5ld25vZGU7CisJCW5ld25vZGUtPm5leHQgPSBmbGV4X2FycmF5X2dldF9wdHIoaC0+aHRhYmxlLCBodmFsdWUpOworCQlpZiAoZmxleF9hcnJheV9wdXRfcHRyKGgtPmh0YWJsZSwgaHZhbHVlLCBuZXdub2RlLAorCQkJCSAgICAgICBHRlBfS0VSTkVMfF9fR0ZQX1pFUk8pKSB7CisJCQlrbWVtX2NhY2hlX2ZyZWUoYXZ0YWJfbm9kZV9jYWNoZXAsIG5ld25vZGUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KIAl9CiAKIAloLT5uZWwrKzsKQEAgLTY0LDcgKzEwMSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaHZhbHVlID0gYXZ0YWJfaGFzaChrZXksIGgtPm1hc2spOwotCWZvciAocHJldiA9IE5VTEwsIGN1ciA9IGgtPmh0YWJsZVtodmFsdWVdOworCWZvciAocHJldiA9IE5VTEwsIGN1ciA9IGZsZXhfYXJyYXlfZ2V0X3B0cihoLT5odGFibGUsIGh2YWx1ZSk7CiAJICAgICBjdXI7CiAJICAgICBwcmV2ID0gY3VyLCBjdXIgPSBjdXItPm5leHQpIHsKIAkJaWYgKGtleS0+c291cmNlX3R5cGUgPT0gY3VyLT5rZXkuc291cmNlX3R5cGUgJiYKQEAgLTEwNCw3ICsxNDEsNyBAQAogCWlmICghaCB8fCAhaC0+aHRhYmxlKQogCQlyZXR1cm4gTlVMTDsKIAlodmFsdWUgPSBhdnRhYl9oYXNoKGtleSwgaC0+bWFzayk7Ci0JZm9yIChwcmV2ID0gTlVMTCwgY3VyID0gaC0+aHRhYmxlW2h2YWx1ZV07CisJZm9yIChwcmV2ID0gTlVMTCwgY3VyID0gZmxleF9hcnJheV9nZXRfcHRyKGgtPmh0YWJsZSwgaHZhbHVlKTsKIAkgICAgIGN1cjsKIAkgICAgIHByZXYgPSBjdXIsIGN1ciA9IGN1ci0+bmV4dCkgewogCQlpZiAoa2V5LT5zb3VyY2VfdHlwZSA9PSBjdXItPmtleS5zb3VyY2VfdHlwZSAmJgpAQCAtMTM1LDcgKzE3Miw4IEBACiAJCXJldHVybiBOVUxMOwogCiAJaHZhbHVlID0gYXZ0YWJfaGFzaChrZXksIGgtPm1hc2spOwotCWZvciAoY3VyID0gaC0+aHRhYmxlW2h2YWx1ZV07IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisJZm9yIChjdXIgPSBmbGV4X2FycmF5X2dldF9wdHIoaC0+aHRhYmxlLCBodmFsdWUpOyBjdXI7CisJICAgICBjdXIgPSBjdXItPm5leHQpIHsKIAkJaWYgKGtleS0+c291cmNlX3R5cGUgPT0gY3VyLT5rZXkuc291cmNlX3R5cGUgJiYKIAkJICAgIGtleS0+dGFyZ2V0X3R5cGUgPT0gY3VyLT5rZXkudGFyZ2V0X3R5cGUgJiYKIAkJICAgIGtleS0+dGFyZ2V0X2NsYXNzID09IGN1ci0+a2V5LnRhcmdldF9jbGFzcyAmJgpAQCAtMTcwLDcgKzIwOCw4IEBACiAJCXJldHVybiBOVUxMOwogCiAJaHZhbHVlID0gYXZ0YWJfaGFzaChrZXksIGgtPm1hc2spOwotCWZvciAoY3VyID0gaC0+aHRhYmxlW2h2YWx1ZV07IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisJZm9yIChjdXIgPSBmbGV4X2FycmF5X2dldF9wdHIoaC0+aHRhYmxlLCBodmFsdWUpOyBjdXI7CisJICAgICBjdXIgPSBjdXItPm5leHQpIHsKIAkJaWYgKGtleS0+c291cmNlX3R5cGUgPT0gY3VyLT5rZXkuc291cmNlX3R5cGUgJiYKIAkJICAgIGtleS0+dGFyZ2V0X3R5cGUgPT0gY3VyLT5rZXkudGFyZ2V0X3R5cGUgJiYKIAkJICAgIGtleS0+dGFyZ2V0X2NsYXNzID09IGN1ci0+a2V5LnRhcmdldF9jbGFzcyAmJgpAQCAtMjI4LDE1ICsyNjcsMTQgQEAKIAkJcmV0dXJuOwogCiAJZm9yIChpID0gMDsgaSA8IGgtPm5zbG90OyBpKyspIHsKLQkJY3VyID0gaC0+aHRhYmxlW2ldOworCQljdXIgPSBmbGV4X2FycmF5X2dldF9wdHIoaC0+aHRhYmxlLCBpKTsKIAkJd2hpbGUgKGN1cikgewogCQkJdGVtcCA9IGN1cjsKIAkJCWN1ciA9IGN1ci0+bmV4dDsKIAkJCWttZW1fY2FjaGVfZnJlZShhdnRhYl9ub2RlX2NhY2hlcCwgdGVtcCk7CiAJCX0KLQkJaC0+aHRhYmxlW2ldID0gTlVMTDsKIAl9Ci0Ja2ZyZWUoaC0+aHRhYmxlKTsKKwlmbGV4X2FycmF5X2ZyZWUoaC0+aHRhYmxlKTsKIAloLT5odGFibGUgPSBOVUxMOwogCWgtPm5zbG90ID0gMDsKIAloLT5tYXNrID0gMDsKQEAgLTI1MSw3ICsyODksNyBAQAogCiBpbnQgYXZ0YWJfYWxsb2Moc3RydWN0IGF2dGFiICpoLCB1MzIgbnJ1bGVzKQogewotCXUxNiBtYXNrID0gMDsKKwl1MzIgbWFzayA9IDA7CiAJdTMyIHNoaWZ0ID0gMDsKIAl1MzIgd29yayA9IG5ydWxlczsKIAl1MzIgbnNsb3QgPSAwOwpAQCAtMjcwLDcgKzMwOCw4IEBACiAJCW5zbG90ID0gTUFYX0FWVEFCX0hBU0hfQlVDS0VUUzsKIAltYXNrID0gbnNsb3QgLSAxOwogCi0JaC0+aHRhYmxlID0ga2NhbGxvYyhuc2xvdCwgc2l6ZW9mKCooaC0+aHRhYmxlKSksIEdGUF9LRVJORUwpOworCWgtPmh0YWJsZSA9IGZsZXhfYXJyYXlfYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdnRhYl9ub2RlICopLCBuc2xvdCwKKwkJCQkgICAgIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKIAlpZiAoIWgtPmh0YWJsZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTI5Myw3ICszMzIsNyBAQAogCW1heF9jaGFpbl9sZW4gPSAwOwogCWNoYWluMl9sZW5fc3VtID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgaC0+bnNsb3Q7IGkrKykgewotCQljdXIgPSBoLT5odGFibGVbaV07CisJCWN1ciA9IGZsZXhfYXJyYXlfZ2V0X3B0cihoLT5odGFibGUsIGkpOwogCQlpZiAoY3VyKSB7CiAJCQlzbG90c191c2VkKys7CiAJCQljaGFpbl9sZW4gPSAwOwpAQCAtNTM0LDcgKzU3Myw4IEBACiAJCXJldHVybiByYzsKIAogCWZvciAoaSA9IDA7IGkgPCBhLT5uc2xvdDsgaSsrKSB7Ci0JCWZvciAoY3VyID0gYS0+aHRhYmxlW2ldOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworCQlmb3IgKGN1ciA9IGZsZXhfYXJyYXlfZ2V0X3B0cihhLT5odGFibGUsIGkpOyBjdXI7CisJCSAgICAgY3VyID0gY3VyLT5uZXh0KSB7CiAJCQlyYyA9IGF2dGFiX3dyaXRlX2l0ZW0ocCwgY3VyLCBmcCk7CiAJCQlpZiAocmMpCiAJCQkJcmV0dXJuIHJjOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9hdnRhYi5oIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9hdnRhYi5oCmluZGV4IDYzY2UyZjkuLmFkYjQ1MWMgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3MvYXZ0YWIuaAorKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL2F2dGFiLmgKQEAgLTIzLDYgKzIzLDggQEAKICNpZm5kZWYgX1NTX0FWVEFCX0hfCiAjZGVmaW5lIF9TU19BVlRBQl9IXwogCisjaW5jbHVkZSA8bGludXgvZmxleF9hcnJheS5oPgorCiBzdHJ1Y3QgYXZ0YWJfa2V5IHsKIAl1MTYgc291cmNlX3R5cGU7CS8qIHNvdXJjZSB0eXBlICovCiAJdTE2IHRhcmdldF90eXBlOwkvKiB0YXJnZXQgdHlwZSAqLwpAQCAtNTEsMTAgKzUzLDEwIEBACiB9OwogCiBzdHJ1Y3QgYXZ0YWIgewotCXN0cnVjdCBhdnRhYl9ub2RlICoqaHRhYmxlOworCXN0cnVjdCBmbGV4X2FycmF5ICpodGFibGU7CiAJdTMyIG5lbDsJLyogbnVtYmVyIG9mIGVsZW1lbnRzICovCiAJdTMyIG5zbG90OyAgICAgIC8qIG51bWJlciBvZiBoYXNoIHNsb3RzICovCi0JdTE2IG1hc2s7ICAgICAgIC8qIG1hc2sgdG8gY29tcHV0ZSBoYXNoIGZ1bmMgKi8KKwl1MzIgbWFzazsgICAgICAgLyogbWFzayB0byBjb21wdXRlIGhhc2ggZnVuYyAqLwogCiB9OwogCkBAIC04NCw3ICs4Niw3IEBACiB2b2lkIGF2dGFiX2NhY2hlX2luaXQodm9pZCk7CiB2b2lkIGF2dGFiX2NhY2hlX2Rlc3Ryb3kodm9pZCk7CiAKLSNkZWZpbmUgTUFYX0FWVEFCX0hBU0hfQklUUyAxMQorI2RlZmluZSBNQVhfQVZUQUJfSEFTSF9CSVRTIDE2CiAjZGVmaW5lIE1BWF9BVlRBQl9IQVNIX0JVQ0tFVFMgKDEgPDwgTUFYX0FWVEFCX0hBU0hfQklUUykKIAogI2VuZGlmCS8qIF9TU19BVlRBQl9IXyAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYyBiL3NlY3VyaXR5L3NlbGludXgvc3MvbWxzLmMKaW5kZXggZDMwN2IzNy4uZTEwODg4NCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9zcy9tbHMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL21scy5jCkBAIC02NTQsMTkgKzY1NCwxNSBAQAogCiAJcmMgPSBlYml0bWFwX25ldGxibF9pbXBvcnQoJmNvbnRleHQtPnJhbmdlLmxldmVsWzBdLmNhdCwKIAkJCQkgICBzZWNhdHRyLT5hdHRyLm1scy5jYXQpOwotCWlmIChyYyAhPSAwKQorCWlmIChyYykKIAkJZ290byBpbXBvcnRfbmV0bGJsX2NhdF9mYWlsdXJlOwotCi0JcmMgPSBlYml0bWFwX2NweSgmY29udGV4dC0+cmFuZ2UubGV2ZWxbMV0uY2F0LAotCQkJICZjb250ZXh0LT5yYW5nZS5sZXZlbFswXS5jYXQpOwotCWlmIChyYyAhPSAwKQotCQlnb3RvIGltcG9ydF9uZXRsYmxfY2F0X2ZhaWx1cmU7CisJbWVtY3B5KCZjb250ZXh0LT5yYW5nZS5sZXZlbFsxXS5jYXQsICZjb250ZXh0LT5yYW5nZS5sZXZlbFswXS5jYXQsCisJICAgICAgIHNpemVvZihjb250ZXh0LT5yYW5nZS5sZXZlbFswXS5jYXQpKTsKIAogCXJldHVybiAwOwogCiBpbXBvcnRfbmV0bGJsX2NhdF9mYWlsdXJlOgogCWViaXRtYXBfZGVzdHJveSgmY29udGV4dC0+cmFuZ2UubGV2ZWxbMF0uY2F0KTsKLQllYml0bWFwX2Rlc3Ryb3koJmNvbnRleHQtPnJhbmdlLmxldmVsWzFdLmNhdCk7CiAJcmV0dXJuIHJjOwogfQogI2VuZGlmIC8qIENPTkZJR19ORVRMQUJFTCAqLwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jIGIvc2VjdXJpdHkvc2VsaW51eC9zcy9zZXJ2aWNlcy5jCmluZGV4IGExZDM5NDQuLjllMmQ4MjAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvc3Mvc2VydmljZXMuYworKysgYi9zZWN1cml0eS9zZWxpbnV4L3NzL3NlcnZpY2VzLmMKQEAgLTMxNzksMTMgKzMxNzksOSBAQAogCQljdHhfbmV3LnR5cGUgPSBjdHgtPnR5cGU7CiAJCW1sc19pbXBvcnRfbmV0bGJsX2x2bCgmY3R4X25ldywgc2VjYXR0cik7CiAJCWlmIChzZWNhdHRyLT5mbGFncyAmIE5FVExCTF9TRUNBVFRSX01MU19DQVQpIHsKLQkJCXJjID0gZWJpdG1hcF9uZXRsYmxfaW1wb3J0KCZjdHhfbmV3LnJhbmdlLmxldmVsWzBdLmNhdCwKLQkJCQkJCSAgIHNlY2F0dHItPmF0dHIubWxzLmNhdCk7CisJCQlyYyA9IG1sc19pbXBvcnRfbmV0bGJsX2NhdCgmY3R4X25ldywgc2VjYXR0cik7CiAJCQlpZiAocmMpCiAJCQkJZ290byBvdXQ7Ci0JCQltZW1jcHkoJmN0eF9uZXcucmFuZ2UubGV2ZWxbMV0uY2F0LAotCQkJICAgICAgICZjdHhfbmV3LnJhbmdlLmxldmVsWzBdLmNhdCwKLQkJCSAgICAgICBzaXplb2YoY3R4X25ldy5yYW5nZS5sZXZlbFswXS5jYXQpKTsKIAkJfQogCQlyYyA9IC1FSURSTTsKIAkJaWYgKCFtbHNfY29udGV4dF9pc3ZhbGlkKCZwb2xpY3lkYiwgJmN0eF9uZXcpKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2suaCBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrLmgKaW5kZXggNjdjY2I3Yi4uNDllYWRhNiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2suaAorKysgYi9zZWN1cml0eS9zbWFjay9zbWFjay5oCkBAIC0xMDUsNiArMTA1LDcgQEAKICNkZWZpbmUJU01LX0lOT0RFX0lOU1RBTlQJMHgwMQkvKiBpbm9kZSBpcyBpbnN0YW50aWF0ZWQgKi8KICNkZWZpbmUJU01LX0lOT0RFX1RSQU5TTVVURQkweDAyCS8qIGRpcmVjdG9yeSBpcyB0cmFuc211dGluZyAqLwogI2RlZmluZQlTTUtfSU5PREVfQ0hBTkdFRAkweDA0CS8qIHNtYWNrIHdhcyB0cmFuc211dGVkICovCisjZGVmaW5lCVNNS19JTk9ERV9JTVBVUkUJMHgwOAkvKiBpbnZvbHZlZCBpbiBhbiBpbXB1cmUgdHJhbnNhY3Rpb24gKi8KIAogLyoKICAqIEEgbGFiZWwgYWNjZXNzIHJ1bGUuCkBAIC0xOTMsNiArMTk0LDEwIEBACiAjZGVmaW5lIE1BWV9MT0NLCTB4MDAwMDIwMDAJLyogTG9ja3Mgc2hvdWxkIGJlIHdyaXRlcywgYnV0IC4uLiAqLwogI2RlZmluZSBNQVlfQlJJTkdVUAkweDAwMDA0MDAwCS8qIFJlcG9ydCB1c2Ugb2YgdGhpcyBydWxlICovCiAKKyNkZWZpbmUgU01BQ0tfQlJJTkdVUF9BTExPVwkJMQkvKiBBbGxvdyBicmluZ3VwIG1vZGUgKi8KKyNkZWZpbmUgU01BQ0tfVU5DT05GSU5FRF9TVUJKRUNUCTIJLyogQWxsb3cgdW5jb25maW5lZCBsYWJlbCAqLworI2RlZmluZSBTTUFDS19VTkNPTkZJTkVEX09CSkVDVAkJMwkvKiBBbGxvdyB1bmNvbmZpbmVkIGxhYmVsICovCisKIC8qCiAgKiBKdXN0IHRvIG1ha2UgdGhlIGNvbW1vbiBjYXNlcyBlYXNpZXIgdG8gZGVhbCB3aXRoCiAgKi8KQEAgLTI1NCw2ICsyNTksOSBAQAogZXh0ZXJuIHN0cnVjdCBzbWFja19rbm93biAqc21hY2tfbmV0X2FtYmllbnQ7CiBleHRlcm4gc3RydWN0IHNtYWNrX2tub3duICpzbWFja19vbmx5Y2FwOwogZXh0ZXJuIHN0cnVjdCBzbWFja19rbm93biAqc21hY2tfc3lzbG9nX2xhYmVsOworI2lmZGVmIENPTkZJR19TRUNVUklUWV9TTUFDS19CUklOR1VQCitleHRlcm4gc3RydWN0IHNtYWNrX2tub3duICpzbWFja191bmNvbmZpbmVkOworI2VuZGlmCiBleHRlcm4gc3RydWN0IHNtYWNrX2tub3duIHNtYWNrX2NpcHNvX29wdGlvbjsKIGV4dGVybiBpbnQgc21hY2tfcHRyYWNlX3J1bGU7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2FjY2Vzcy5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tfYWNjZXNzLmMKaW5kZXggMTE1ODQzMC4uMGY0MTBmYyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tfYWNjZXNzLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tfYWNjZXNzLmMKQEAgLTEzMCw3ICsxMzAsOCBAQAogCiAJLyoKIAkgKiBIYXJkY29kZWQgY29tcGFyaXNvbnMuCi0JICoKKwkgKi8KKwkvKgogCSAqIEEgc3RhciBzdWJqZWN0IGNhbid0IGFjY2VzcyBhbnkgb2JqZWN0LgogCSAqLwogCWlmIChzdWJqZWN0ID09ICZzbWFja19rbm93bl9zdGFyKSB7CkBAIC0xODksMTAgKzE5MCwyMCBAQAogCSAqIHN1Y2NlZWQgYmVjYXVzZSBvZiAiYiIgcnVsZXMuCiAJICovCiAJaWYgKG1heSAmIE1BWV9CUklOR1VQKQotCQlyYyA9IE1BWV9CUklOR1VQOworCQlyYyA9IFNNQUNLX0JSSU5HVVBfQUxMT1c7CiAjZW5kaWYKIAogb3V0X2F1ZGl0OgorCisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1NNQUNLX0JSSU5HVVAKKwlpZiAocmMgPCAwKSB7CisJCWlmIChvYmplY3QgPT0gc21hY2tfdW5jb25maW5lZCkKKwkJCXJjID0gU01BQ0tfVU5DT05GSU5FRF9PQkpFQ1Q7CisJCWlmIChzdWJqZWN0ID09IHNtYWNrX3VuY29uZmluZWQpCisJCQlyYyA9IFNNQUNLX1VOQ09ORklORURfU1VCSkVDVDsKKwl9CisjZW5kaWYKKwogI2lmZGVmIENPTkZJR19BVURJVAogCWlmIChhKQogCQlzbWFja19sb2coc3ViamVjdC0+c21rX2tub3duLCBvYmplY3QtPnNta19rbm93biwKQEAgLTMzOCwxOSArMzQ5LDE2IEBACiB2b2lkIHNtYWNrX2xvZyhjaGFyICpzdWJqZWN0X2xhYmVsLCBjaGFyICpvYmplY3RfbGFiZWwsIGludCByZXF1ZXN0LAogCSAgICAgICBpbnQgcmVzdWx0LCBzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gKmFkKQogeworI2lmZGVmIENPTkZJR19TRUNVUklUWV9TTUFDS19CUklOR1VQCisJY2hhciByZXF1ZXN0X2J1ZmZlcltTTUtfTlVNX0FDQ0VTU19UWVBFICsgNV07CisjZWxzZQogCWNoYXIgcmVxdWVzdF9idWZmZXJbU01LX05VTV9BQ0NFU1NfVFlQRSArIDFdOworI2VuZGlmCiAJc3RydWN0IHNtYWNrX2F1ZGl0X2RhdGEgKnNhZDsKIAlzdHJ1Y3QgY29tbW9uX2F1ZGl0X2RhdGEgKmEgPSAmYWQtPmE7CiAKLSNpZmRlZiBDT05GSUdfU0VDVVJJVFlfU01BQ0tfQlJJTkdVUAotCS8qCi0JICogVGhlIHJlc3VsdCBtYXkgYmUgcG9zaXRpdmUgaW4gYnJpbmd1cCBtb2RlLgotCSAqLwotCWlmIChyZXN1bHQgPiAwKQotCQlyZXN1bHQgPSAwOwotI2VuZGlmCiAJLyogY2hlY2sgaWYgd2UgaGF2ZSB0byBsb2cgdGhlIGN1cnJlbnQgZXZlbnQgKi8KLQlpZiAocmVzdWx0ICE9IDAgJiYgKGxvZ19wb2xpY3kgJiBTTUFDS19BVURJVF9ERU5JRUQpID09IDApCisJaWYgKHJlc3VsdCA8IDAgJiYgKGxvZ19wb2xpY3kgJiBTTUFDS19BVURJVF9ERU5JRUQpID09IDApCiAJCXJldHVybjsKIAlpZiAocmVzdWx0ID09IDAgJiYgKGxvZ19wb2xpY3kgJiBTTUFDS19BVURJVF9BQ0NFUFQpID09IDApCiAJCXJldHVybjsKQEAgLTM2NCw2ICszNzIsMjEgQEAKIAlzbWFja19zdHJfZnJvbV9wZXJtKHJlcXVlc3RfYnVmZmVyLCByZXF1ZXN0KTsKIAlzYWQtPnN1YmplY3QgPSBzdWJqZWN0X2xhYmVsOwogCXNhZC0+b2JqZWN0ICA9IG9iamVjdF9sYWJlbDsKKyNpZmRlZiBDT05GSUdfU0VDVVJJVFlfU01BQ0tfQlJJTkdVUAorCS8qCisJICogVGhlIHJlc3VsdCBtYXkgYmUgcG9zaXRpdmUgaW4gYnJpbmd1cCBtb2RlLgorCSAqIEEgcG9zaXRpdmUgcmVzdWx0IGlzIGFuIGFsbG93LCBidXQgbm90IGZvciBub3JtYWwgcmVhc29ucy4KKwkgKiBNYXJrIGl0IGFzIHN1Y2Nlc3NmdWwsIGJ1dCBkb24ndCBmaWx0ZXIgaXQgb3V0IGV2ZW4gaWYKKwkgKiB0aGUgbG9nZ2luZyBwb2xpY3kgc2F5cyB0byBkbyBzby4KKwkgKi8KKwlpZiAocmVzdWx0ID09IFNNQUNLX1VOQ09ORklORURfU1VCSkVDVCkKKwkJc3RyY2F0KHJlcXVlc3RfYnVmZmVyLCAiKFVTKSIpOworCWVsc2UgaWYgKHJlc3VsdCA9PSBTTUFDS19VTkNPTkZJTkVEX09CSkVDVCkKKwkJc3RyY2F0KHJlcXVlc3RfYnVmZmVyLCAiKFVPKSIpOworCisJaWYgKHJlc3VsdCA+IDApCisJCXJlc3VsdCA9IDA7CisjZW5kaWYKIAlzYWQtPnJlcXVlc3QgPSByZXF1ZXN0X2J1ZmZlcjsKIAlzYWQtPnJlc3VsdCAgPSByZXN1bHQ7CiAKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX2xzbS5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKaW5kZXggYzkzNDMxMS4uNjlmZGMzOCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbHNtLmMKQEAgLTU3LDYgKzU3LDEzIEBACiBpbnQgc21hY2tfZW5hYmxlZDsKIAogI2lmZGVmIENPTkZJR19TRUNVUklUWV9TTUFDS19CUklOR1VQCitzdGF0aWMgY2hhciAqc21rX2J1X21lc3NbXSA9IHsKKwkiQnJpbmd1cCBFcnJvciIsCS8qIFVudXNlZCAqLworCSJCcmluZ3VwIiwJCS8qIFNNQUNLX0JSSU5HVVBfQUxMT1cgKi8KKwkiVW5jb25maW5lZCBTdWJqZWN0IiwJLyogU01BQ0tfVU5DT05GSU5FRF9TVUJKRUNUICovCisJIlVuY29uZmluZWQgT2JqZWN0IiwJLyogU01BQ0tfVU5DT05GSU5FRF9PQkpFQ1QgKi8KK307CisKIHN0YXRpYyB2b2lkIHNta19idV9tb2RlKGludCBtb2RlLCBjaGFyICpzKQogewogCWludCBpID0gMDsKQEAgLTg3LDkgKzk0LDExIEBACiAKIAlpZiAocmMgPD0gMCkKIAkJcmV0dXJuIHJjOworCWlmIChyYyA+IFNNQUNLX1VOQ09ORklORURfT0JKRUNUKQorCQlyYyA9IDA7CiAKIAlzbWtfYnVfbW9kZShtb2RlLCBhY2MpOwotCXByX2luZm8oIlNtYWNrIEJyaW5ndXA6ICglcyAlcyAlcykgJXNcbiIsCisJcHJfaW5mbygiU21hY2sgJXM6ICglcyAlcyAlcykgJXNcbiIsIHNta19idV9tZXNzW3JjXSwKIAkJc3NrcC0+c21rX2tub3duLCBvc2twLT5zbWtfa25vd24sIGFjYywgbm90ZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xMDYsOSArMTE1LDExIEBACiAKIAlpZiAocmMgPD0gMCkKIAkJcmV0dXJuIHJjOworCWlmIChyYyA+IFNNQUNLX1VOQ09ORklORURfT0JKRUNUKQorCQlyYyA9IDA7CiAKIAlzbWtfYnVfbW9kZShtb2RlLCBhY2MpOwotCXByX2luZm8oIlNtYWNrIEJyaW5ndXA6ICglcyAlcyAlcykgJXMgJXNcbiIsCisJcHJfaW5mbygiU21hY2sgJXM6ICglcyAlcyAlcykgJXMgJXNcbiIsIHNta19idV9tZXNzW3JjXSwKIAkJdHNwLT5zbWtfdGFzay0+c21rX2tub3duLCBvc2twLT5zbWtfa25vd24sCiAJCWFjYywgY3VycmVudC0+Y29tbSwgbm90ZSk7CiAJcmV0dXJuIDA7CkBAIC0xMjYsOSArMTM3LDExIEBACiAKIAlpZiAocmMgPD0gMCkKIAkJcmV0dXJuIHJjOworCWlmIChyYyA+IFNNQUNLX1VOQ09ORklORURfT0JKRUNUKQorCQlyYyA9IDA7CiAKIAlzbWtfYnVfbW9kZShtb2RlLCBhY2MpOwotCXByX2luZm8oIlNtYWNrIEJyaW5ndXA6ICglcyAlcyAlcykgJXMgdG8gJXNcbiIsCisJcHJfaW5mbygiU21hY2sgJXM6ICglcyAlcyAlcykgJXMgdG8gJXNcbiIsIHNta19idV9tZXNzW3JjXSwKIAkJdHNwLT5zbWtfdGFzay0+c21rX2tub3duLCBzbWtfdGFzay0+c21rX2tub3duLCBhY2MsCiAJCWN1cnJlbnQtPmNvbW0sIG90cC0+Y29tbSk7CiAJcmV0dXJuIDA7CkBAIC0xNDEsMTQgKzE1NCwyNSBAQAogc3RhdGljIGludCBzbWtfYnVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IG1vZGUsIGludCByYykKIHsKIAlzdHJ1Y3QgdGFza19zbWFjayAqdHNwID0gY3VycmVudF9zZWN1cml0eSgpOworCXN0cnVjdCBpbm9kZV9zbWFjayAqaXNwID0gaW5vZGUtPmlfc2VjdXJpdHk7CiAJY2hhciBhY2NbU01LX05VTV9BQ0NFU1NfVFlQRSArIDFdOwogCisJaWYgKGlzcC0+c21rX2ZsYWdzICYgU01LX0lOT0RFX0lNUFVSRSkKKwkJcHJfaW5mbygiU21hY2sgVW5jb25maW5lZCBDb3JydXB0aW9uOiBpbm9kZT0oJXMgJWxkKSAlc1xuIiwKKwkJCWlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIGN1cnJlbnQtPmNvbW0pOworCiAJaWYgKHJjIDw9IDApCiAJCXJldHVybiByYzsKKwlpZiAocmMgPiBTTUFDS19VTkNPTkZJTkVEX09CSkVDVCkKKwkJcmMgPSAwOworCWlmIChyYyA9PSBTTUFDS19VTkNPTkZJTkVEX1NVQkpFQ1QgJiYKKwkgICAgKG1vZGUgJiAoTUFZX1dSSVRFIHwgTUFZX0FQUEVORCkpKQorCQlpc3AtPnNta19mbGFncyB8PSBTTUtfSU5PREVfSU1QVVJFOwogCiAJc21rX2J1X21vZGUobW9kZSwgYWNjKTsKLQlwcl9pbmZvKCJTbWFjayBCcmluZ3VwOiAoJXMgJXMgJXMpIGlub2RlPSglcyAlbGQpICVzXG4iLAotCQl0c3AtPnNta190YXNrLT5zbWtfa25vd24sIHNta19vZl9pbm9kZShpbm9kZSktPnNta19rbm93biwgYWNjLAorCisJcHJfaW5mbygiU21hY2sgJXM6ICglcyAlcyAlcykgaW5vZGU9KCVzICVsZCkgJXNcbiIsIHNta19idV9tZXNzW3JjXSwKKwkJdHNwLT5zbWtfdGFzay0+c21rX2tub3duLCBpc3AtPnNta19pbm9kZS0+c21rX2tub3duLCBhY2MsCiAJCWlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIGN1cnJlbnQtPmNvbW0pOwogCXJldHVybiAwOwogfQpAQCAtMTYyLDEzICsxODYsMjAgQEAKIAlzdHJ1Y3QgdGFza19zbWFjayAqdHNwID0gY3VycmVudF9zZWN1cml0eSgpOwogCXN0cnVjdCBzbWFja19rbm93biAqc3NrcCA9IHRzcC0+c21rX3Rhc2s7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGVfaW5vZGUoZmlsZSk7CisJc3RydWN0IGlub2RlX3NtYWNrICppc3AgPSBpbm9kZS0+aV9zZWN1cml0eTsKIAljaGFyIGFjY1tTTUtfTlVNX0FDQ0VTU19UWVBFICsgMV07CiAKKwlpZiAoaXNwLT5zbWtfZmxhZ3MgJiBTTUtfSU5PREVfSU1QVVJFKQorCQlwcl9pbmZvKCJTbWFjayBVbmNvbmZpbmVkIENvcnJ1cHRpb246IGlub2RlPSglcyAlbGQpICVzXG4iLAorCQkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgY3VycmVudC0+Y29tbSk7CisKIAlpZiAocmMgPD0gMCkKIAkJcmV0dXJuIHJjOworCWlmIChyYyA+IFNNQUNLX1VOQ09ORklORURfT0JKRUNUKQorCQlyYyA9IDA7CiAKIAlzbWtfYnVfbW9kZShtb2RlLCBhY2MpOwotCXByX2luZm8oIlNtYWNrIEJyaW5ndXA6ICglcyAlcyAlcykgZmlsZT0oJXMgJWxkICVwRCkgJXNcbiIsCisJcHJfaW5mbygiU21hY2sgJXM6ICglcyAlcyAlcykgZmlsZT0oJXMgJWxkICVwRCkgJXNcbiIsIHNta19idV9tZXNzW3JjXSwKIAkJc3NrcC0+c21rX2tub3duLCBzbWtfb2ZfaW5vZGUoaW5vZGUpLT5zbWtfa25vd24sIGFjYywKIAkJaW5vZGUtPmlfc2ItPnNfaWQsIGlub2RlLT5pX2lubywgZmlsZSwKIAkJY3VycmVudC0+Y29tbSk7CkBAIC0xODUsMTMgKzIxNiwyMCBAQAogCXN0cnVjdCB0YXNrX3NtYWNrICp0c3AgPSBjcmVkLT5zZWN1cml0eTsKIAlzdHJ1Y3Qgc21hY2tfa25vd24gKnNza3AgPSB0c3AtPnNta190YXNrOwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2lub2RlOworCXN0cnVjdCBpbm9kZV9zbWFjayAqaXNwID0gaW5vZGUtPmlfc2VjdXJpdHk7CiAJY2hhciBhY2NbU01LX05VTV9BQ0NFU1NfVFlQRSArIDFdOwogCisJaWYgKGlzcC0+c21rX2ZsYWdzICYgU01LX0lOT0RFX0lNUFVSRSkKKwkJcHJfaW5mbygiU21hY2sgVW5jb25maW5lZCBDb3JydXB0aW9uOiBpbm9kZT0oJXMgJWxkKSAlc1xuIiwKKwkJCWlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIGN1cnJlbnQtPmNvbW0pOworCiAJaWYgKHJjIDw9IDApCiAJCXJldHVybiByYzsKKwlpZiAocmMgPiBTTUFDS19VTkNPTkZJTkVEX09CSkVDVCkKKwkJcmMgPSAwOwogCiAJc21rX2J1X21vZGUobW9kZSwgYWNjKTsKLQlwcl9pbmZvKCJTbWFjayBCcmluZ3VwOiAoJXMgJXMgJXMpIGZpbGU9KCVzICVsZCAlcEQpICVzXG4iLAorCXByX2luZm8oIlNtYWNrICVzOiAoJXMgJXMgJXMpIGZpbGU9KCVzICVsZCAlcEQpICVzXG4iLCBzbWtfYnVfbWVzc1tyY10sCiAJCXNza3AtPnNta19rbm93biwgc21rX29mX2lub2RlKGlub2RlKS0+c21rX2tub3duLCBhY2MsCiAJCWlub2RlLT5pX3NiLT5zX2lkLCBpbm9kZS0+aV9pbm8sIGZpbGUsCiAJCWN1cnJlbnQtPmNvbW0pOwpAQCAtMTAzNCwxOSArMTA3MiwxNiBAQAogICoKICAqIFJldHVybnMgMCBpZiBhY2Nlc3MgaXMgcGVybWl0dGVkLCBhbiBlcnJvciBjb2RlIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW50IHNtYWNrX2lub2RlX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyBpbnQgc21hY2tfaW5vZGVfZ2V0YXR0cihjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKIAlzdHJ1Y3Qgc21rX2F1ZGl0X2luZm8gYWQ7Ci0Jc3RydWN0IHBhdGggcGF0aDsKKwlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gcGF0aC0+ZGVudHJ5LT5kX2lub2RlOwogCWludCByYzsKIAotCXBhdGguZGVudHJ5ID0gZGVudHJ5OwotCXBhdGgubW50ID0gbW50OwotCiAJc21rX2FkX2luaXQoJmFkLCBfX2Z1bmNfXywgTFNNX0FVRElUX0RBVEFfUEFUSCk7Ci0Jc21rX2FkX3NldGZpZWxkX3VfZnNfcGF0aCgmYWQsIHBhdGgpOwotCXJjID0gc21rX2N1cmFjYyhzbWtfb2ZfaW5vZGUoZGVudHJ5LT5kX2lub2RlKSwgTUFZX1JFQUQsICZhZCk7Ci0JcmMgPSBzbWtfYnVfaW5vZGUoZGVudHJ5LT5kX2lub2RlLCBNQVlfUkVBRCwgcmMpOworCXNta19hZF9zZXRmaWVsZF91X2ZzX3BhdGgoJmFkLCAqcGF0aCk7CisJcmMgPSBzbWtfY3VyYWNjKHNta19vZl9pbm9kZShpbm9kZSksIE1BWV9SRUFELCAmYWQpOworCXJjID0gc21rX2J1X2lub2RlKGlub2RlLCBNQVlfUkVBRCwgcmMpOwogCXJldHVybiByYzsKIH0KIApAQCAtMjQ1Miw3ICsyNDg3LDIxIEBACiBzdGF0aWMgaW50IHNtYWNrX3NvY2tldF9wb3N0X2NyZWF0ZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgZmFtaWx5LAogCQkJCSAgICBpbnQgdHlwZSwgaW50IHByb3RvY29sLCBpbnQga2VybikKIHsKLQlpZiAoZmFtaWx5ICE9IFBGX0lORVQgfHwgc29jay0+c2sgPT0gTlVMTCkKKwlzdHJ1Y3Qgc29ja2V0X3NtYWNrICpzc3A7CisKKwlpZiAoc29jay0+c2sgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFNvY2tldHMgY3JlYXRlZCBieSBrZXJuZWwgdGhyZWFkcyByZWNlaXZlIHdlYiBsYWJlbC4KKwkgKi8KKwlpZiAodW5saWtlbHkoY3VycmVudC0+ZmxhZ3MgJiBQRl9LVEhSRUFEKSkgeworCQlzc3AgPSBzb2NrLT5zay0+c2tfc2VjdXJpdHk7CisJCXNzcC0+c21rX2luID0gJnNtYWNrX2tub3duX3dlYjsKKwkJc3NwLT5zbWtfb3V0ID0gJnNtYWNrX2tub3duX3dlYjsKKwl9CisKKwlpZiAoZmFtaWx5ICE9IFBGX0lORVQpCiAJCXJldHVybiAwOwogCS8qCiAJICogU2V0IHRoZSBvdXRib3VuZCBuZXRsYmwuCkBAIC0zOTg2LDYgKzQwMzUsMzYgQEAKIAlyYyA9IHNta19idV9ub3RlKCJrZXkgYWNjZXNzIiwgdGtwLCBrZXlwLT5zZWN1cml0eSwgcmVxdWVzdCwgcmMpOwogCXJldHVybiByYzsKIH0KKworLyoKKyAqIHNtYWNrX2tleV9nZXRzZWN1cml0eSAtIFNtYWNrIGxhYmVsIHRhZ2dpbmcgdGhlIGtleQorICogQGtleSBwb2ludHMgdG8gdGhlIGtleSB0byBiZSBxdWVyaWVkCisgKiBAX2J1ZmZlciBwb2ludHMgdG8gYSBwb2ludGVyIHRoYXQgc2hvdWxkIGJlIHNldCB0byBwb2ludCB0byB0aGUKKyAqIHJlc3VsdGluZyBzdHJpbmcgKGlmIG5vIGxhYmVsIG9yIGFuIGVycm9yIG9jY3VycykuCisgKiBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIChpbmNsdWRpbmcgdGVybWluYXRpbmcgTlVMKSBvciAtdmUgaWYKKyAqIGFuIGVycm9yLgorICogTWF5IGFsc28gcmV0dXJuIDAgKGFuZCBhIE5VTEwgYnVmZmVyIHBvaW50ZXIpIGlmIHRoZXJlIGlzIG5vIGxhYmVsLgorICovCitzdGF0aWMgaW50IHNtYWNrX2tleV9nZXRzZWN1cml0eShzdHJ1Y3Qga2V5ICprZXksIGNoYXIgKipfYnVmZmVyKQoreworCXN0cnVjdCBzbWFja19rbm93biAqc2twID0ga2V5LT5zZWN1cml0eTsKKwlzaXplX3QgbGVuZ3RoOworCWNoYXIgKmNvcHk7CisKKwlpZiAoa2V5LT5zZWN1cml0eSA9PSBOVUxMKSB7CisJCSpfYnVmZmVyID0gTlVMTDsKKwkJcmV0dXJuIDA7CisJfQorCisJY29weSA9IGtzdHJkdXAoc2twLT5zbWtfa25vd24sIEdGUF9LRVJORUwpOworCWlmIChjb3B5ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWxlbmd0aCA9IHN0cmxlbihjb3B5KSArIDE7CisKKwkqX2J1ZmZlciA9IGNvcHk7CisJcmV0dXJuIGxlbmd0aDsKK30KKwogI2VuZGlmIC8qIENPTkZJR19LRVlTICovCiAKIC8qCkBAIC00MzEwLDYgKzQzODksNyBAQAogCS5rZXlfYWxsb2MgPSAJCQlzbWFja19rZXlfYWxsb2MsCiAJLmtleV9mcmVlID0gCQkJc21hY2tfa2V5X2ZyZWUsCiAJLmtleV9wZXJtaXNzaW9uID0gCQlzbWFja19rZXlfcGVybWlzc2lvbiwKKwkua2V5X2dldHNlY3VyaXR5ID0JCXNtYWNrX2tleV9nZXRzZWN1cml0eSwKICNlbmRpZiAvKiBDT05GSUdfS0VZUyAqLwogCiAgLyogQXVkaXQgaG9va3MgKi8KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrX25ldGZpbHRlci5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbmV0ZmlsdGVyLmMKaW5kZXggYzk1MjYzMi4uYTQ1NWNmYyAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc21hY2svc21hY2tfbmV0ZmlsdGVyLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tfbmV0ZmlsdGVyLmMKQEAgLTIzLDkgKzIzLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBzbWFja19pcHY2X291dHB1dChjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNzcDsKIAlzdHJ1Y3Qgc21hY2tfa25vd24gKnNrcDsKQEAgLTQyLDkgKzQwLDcgQEAKIAogc3RhdGljIHVuc2lnbmVkIGludCBzbWFja19pcHY0X291dHB1dChjb25zdCBzdHJ1Y3QgbmZfaG9va19vcHMgKm9wcywKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmluLAotCQkJCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqb3V0LAotCQkJCQlpbnQgKCpva2ZuKShzdHJ1Y3Qgc2tfYnVmZiAqKSkKKwkJCQkJY29uc3Qgc3RydWN0IG5mX2hvb2tfc3RhdGUgKnN0YXRlKQogewogCXN0cnVjdCBzb2NrZXRfc21hY2sgKnNzcDsKIAlzdHJ1Y3Qgc21hY2tfa25vd24gKnNrcDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYyBiL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYwppbmRleCBiY2U0ZThmLi4wNmY3MTllIDEwMDY0NAotLS0gYS9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKKysrIGIvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCkBAIC01NCw2ICs1NCw5IEBACiAJU01LX0NIQU5HRV9SVUxFCT0gMTksCS8qIGNoYW5nZSBvciBhZGQgcnVsZXMgKGxvbmcgbGFiZWxzKSAqLwogCVNNS19TWVNMT0cJPSAyMCwJLyogY2hhbmdlIHN5c2xvZyBsYWJlbCkgKi8KIAlTTUtfUFRSQUNFCT0gMjEsCS8qIHNldCBwdHJhY2UgcnVsZSAqLworI2lmZGVmIENPTkZJR19TRUNVUklUWV9TTUFDS19CUklOR1VQCisJU01LX1VOQ09ORklORUQJPSAyMiwJLyogZGVmaW5lIGFuIHVuY29uZmluZWQgbGFiZWwgKi8KKyNlbmRpZgogfTsKIAogLyoKQEAgLTYxLDcgKzY0LDYgQEAKICAqLwogc3RhdGljIERFRklORV9NVVRFWChzbWFja19jaXBzb19sb2NrKTsKIHN0YXRpYyBERUZJTkVfTVVURVgoc21hY2tfYW1iaWVudF9sb2NrKTsKLXN0YXRpYyBERUZJTkVfTVVURVgoc21hY2tfc3lzbG9nX2xvY2spOwogc3RhdGljIERFRklORV9NVVRFWChzbWtfbmV0bGJsYWRkcl9sb2NrKTsKIAogLyoKQEAgLTk1LDYgKzk3LDE2IEBACiAgKi8KIHN0cnVjdCBzbWFja19rbm93biAqc21hY2tfb25seWNhcDsKIAorI2lmZGVmIENPTkZJR19TRUNVUklUWV9TTUFDS19CUklOR1VQCisvKgorICogQWxsb3cgb25lIGxhYmVsIHRvIGJlIHVuY29uZmluZWQuIFRoaXMgaXMgZm9yCisgKiBkZWJ1Z2dpbmcgYW5kIGFwcGxpY2F0aW9uIGJyaW5nLXVwIHB1cnBvc2VzIG9ubHkuCisgKiBJdCBpcyBiYWQgYW5kIHdyb25nLCBidXQgZXZlcnlvbmUgc2VlbXMgdG8gZXhwZWN0CisgKiB0byBoYXZlIGl0LgorICovCitzdHJ1Y3Qgc21hY2tfa25vd24gKnNtYWNrX3VuY29uZmluZWQ7CisjZW5kaWYKKwogLyoKICAqIElmIHRoaXMgdmFsdWUgaXMgc2V0IHJlc3RyaWN0IHN5c2xvZyB1c2UgdG8gdGhlIGxhYmVsIHNwZWNpZmllZC4KICAqIEl0IGNhbiBiZSByZXNldCB2aWEgc21hY2tmcy9zeXNsb2cKQEAgLTE3MTcsNiArMTcyOSw4NSBAQAogCS5sbHNlZWsJCT0gZGVmYXVsdF9sbHNlZWssCiB9OwogCisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1NNQUNLX0JSSU5HVVAKKy8qKgorICogc21rX3JlYWRfdW5jb25maW5lZCAtIHJlYWQoKSBmb3Igc21hY2tmcy91bmNvbmZpbmVkCisgKiBAZmlscDogZmlsZSBwb2ludGVyLCBub3QgYWN0dWFsbHkgdXNlZAorICogQGJ1Zjogd2hlcmUgdG8gcHV0IHRoZSByZXN1bHQKKyAqIEBjbjogbWF4aW11bSB0byBzZW5kIGFsb25nCisgKiBAcHBvczogd2hlcmUgdG8gc3RhcnQKKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIG9yIGVycm9yIGNvZGUsIGFzIGFwcHJvcHJpYXRlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNta19yZWFkX3VuY29uZmluZWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsCisJCQkJCXNpemVfdCBjbiwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKnNtYWNrID0gIiI7CisJc3NpemVfdCByYyA9IC1FSU5WQUw7CisJaW50IGFzaXplOworCisJaWYgKCpwcG9zICE9IDApCisJCXJldHVybiAwOworCisJaWYgKHNtYWNrX3VuY29uZmluZWQgIT0gTlVMTCkKKwkJc21hY2sgPSBzbWFja191bmNvbmZpbmVkLT5zbWtfa25vd247CisKKwlhc2l6ZSA9IHN0cmxlbihzbWFjaykgKyAxOworCisJaWYgKGNuID49IGFzaXplKQorCQlyYyA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgY24sIHBwb3MsIHNtYWNrLCBhc2l6ZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qKgorICogc21rX3dyaXRlX3VuY29uZmluZWQgLSB3cml0ZSgpIGZvciBzbWFja2ZzL3VuY29uZmluZWQKKyAqIEBmaWxlOiBmaWxlIHBvaW50ZXIsIG5vdCBhY3R1YWxseSB1c2VkCisgKiBAYnVmOiB3aGVyZSB0byBnZXQgdGhlIGRhdGEgZnJvbQorICogQGNvdW50OiBieXRlcyBzZW50CisgKiBAcHBvczogd2hlcmUgdG8gc3RhcnQKKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIGVycm9yIGNvZGUsIGFzIGFwcHJvcHJpYXRlCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNta193cml0ZV91bmNvbmZpbmVkKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICpkYXRhOworCWludCByYyA9IGNvdW50OworCisJaWYgKCFzbWFja19wcml2aWxlZ2VkKENBUF9NQUNfQURNSU4pKQorCQlyZXR1cm4gLUVQRVJNOworCisJZGF0YSA9IGt6YWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogU2hvdWxkIHRoZSBudWxsIHN0cmluZyBiZSBwYXNzZWQgaW4gdW5zZXQgdGhlIHVuY29uZmluZWQgdmFsdWUuCisJICogVGhpcyBzZWVtcyBsaWtlIHNvbWV0aGluZyB0byBiZSBjYXJlZnVsIHdpdGggYXMgdXN1YWxseQorCSAqIHNta19pbXBvcnQgb25seSBleHBlY3RzIHRvIHJldHVybiBOVUxMIGZvciBlcnJvcnMuIEl0CisJICogaXMgdXN1YWxseSB0aGUgY2FzZSB0aGF0IGEgbnVsbHN0cmluZyBvciAiXG4iIHdvdWxkIGJlCisJICogYmFkIHRvIHBhc3MgdG8gc21rX2ltcG9ydCBidXQgaW4gZmFjdCB0aGlzIGlzIHVzZWZ1bCBoZXJlLgorCSAqCisJICogc21rX2ltcG9ydCB3aWxsIGFsc28gcmVqZWN0IGEgbGFiZWwgYmVnaW5uaW5nIHdpdGggJy0nLAorCSAqIHNvICItY29uZmluZSIgd2lsbCBhbHNvIHdvcmsuCisJICovCisJaWYgKGNvcHlfZnJvbV91c2VyKGRhdGEsIGJ1ZiwgY291bnQpICE9IDApCisJCXJjID0gLUVGQVVMVDsKKwllbHNlCisJCXNtYWNrX3VuY29uZmluZWQgPSBzbWtfaW1wb3J0X2VudHJ5KGRhdGEsIGNvdW50KTsKKworCWtmcmVlKGRhdGEpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc21rX3VuY29uZmluZWRfb3BzID0geworCS5yZWFkCQk9IHNta19yZWFkX3VuY29uZmluZWQsCisJLndyaXRlCQk9IHNta193cml0ZV91bmNvbmZpbmVkLAorCS5sbHNlZWsJCT0gZGVmYXVsdF9sbHNlZWssCit9OworI2VuZGlmIC8qIENPTkZJR19TRUNVUklUWV9TTUFDS19CUklOR1VQICovCisKIC8qKgogICogc21rX3JlYWRfbG9nZ2luZyAtIHJlYWQoKSBmb3IgL3NtYWNrL2xvZ2dpbmcKICAqIEBmaWxwOiBmaWxlIHBvaW50ZXIsIG5vdCBhY3R1YWxseSB1c2VkCkBAIC0yMzg0LDYgKzI0NzUsMTAgQEAKIAkJCSJzeXNsb2ciLCAmc21rX3N5c2xvZ19vcHMsIFNfSVJVR098U19JV1VTUn0sCiAJCVtTTUtfUFRSQUNFXSA9IHsKIAkJCSJwdHJhY2UiLCAmc21rX3B0cmFjZV9vcHMsIFNfSVJVR098U19JV1VTUn0sCisjaWZkZWYgQ09ORklHX1NFQ1VSSVRZX1NNQUNLX0JSSU5HVVAKKwkJW1NNS19VTkNPTkZJTkVEXSA9IHsKKwkJCSJ1bmNvbmZpbmVkIiwgJnNta191bmNvbmZpbmVkX29wcywgU19JUlVHT3xTX0lXVVNSfSwKKyNlbmRpZgogCQkvKiBsYXN0IG9uZSAqLwogCQkJeyIifQogCX07CmRpZmYgLS1naXQgYS9zZWN1cml0eS90b21veW8vLmdpdGlnbm9yZSBiL3NlY3VyaXR5L3RvbW95by8uZ2l0aWdub3JlCmluZGV4IDVjYWYxYTYuLmRjMGYyMjAgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3RvbW95by8uZ2l0aWdub3JlCisrKyBiL3NlY3VyaXR5L3RvbW95by8uZ2l0aWdub3JlCkBAIC0xLDIgKzEsMiBAQAogYnVpbHRpbi1wb2xpY3kuaAotcG9saWN5LworcG9saWN5LyouY29uZgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL0tjb25maWcgYi9zZWN1cml0eS90b21veW8vS2NvbmZpZwppbmRleCA2MDRlNzE4Li40MDRkY2U2IDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vS2NvbmZpZworKysgYi9zZWN1cml0eS90b21veW8vS2NvbmZpZwpAQCAtNiw2ICs2LDcgQEAKIAlzZWxlY3QgU0VDVVJJVFlfUEFUSAogCXNlbGVjdCBTRUNVUklUWV9ORVRXT1JLCiAJc2VsZWN0IFNSQ1UKKwlzZWxlY3QgQlVJTERfQklOMkMKIAlkZWZhdWx0IG4KIAloZWxwCiAJICBUaGlzIHNlbGVjdHMgVE9NT1lPIExpbnV4LCBwYXRobmFtZS1iYXNlZCBhY2Nlc3MgY29udHJvbC4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9NYWtlZmlsZSBiL3NlY3VyaXR5L3RvbW95by9NYWtlZmlsZQppbmRleCA1NmEwYzdiLi42NWRiY2IyIDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vTWFrZWZpbGUKKysrIGIvc2VjdXJpdHkvdG9tb3lvL01ha2VmaWxlCkBAIC0xLDQ4ICsxLDE1IEBACiBvYmoteSA9IGF1ZGl0Lm8gY29tbW9uLm8gY29uZGl0aW9uLm8gZG9tYWluLm8gZW52aXJvbi5vIGZpbGUubyBnYy5vIGdyb3VwLm8gbG9hZF9wb2xpY3kubyBtZW1vcnkubyBtb3VudC5vIG5ldHdvcmsubyByZWFscGF0aC5vIHNlY3VyaXR5ZnNfaWYubyB0b21veW8ubyB1dGlsLm8KIAotJChvYmopL3BvbGljeS9wcm9maWxlLmNvbmY6Ci0JQG1rZGlyIC1wICQob2JqKS9wb2xpY3kvCi0JQGVjaG8gQ3JlYXRpbmcgYW4gZW1wdHkgcG9saWN5L3Byb2ZpbGUuY29uZgotCUB0b3VjaCAkQAordGFyZ2V0cyArPSBidWlsdGluLXBvbGljeS5oCitkZWZpbmUgZG9fcG9saWN5CitlY2hvICJzdGF0aWMgY2hhciB0b21veW9fYnVpbHRpbl8kKDEpW10gX19pbml0ZGF0YSA9IjsgXAorJChvYmp0cmVlKS9zY3JpcHRzL2Jhc2ljL2JpbjJjIDwkKGZpcnN0d29yZCAkKHdpbGRjYXJkICQob2JqKS9wb2xpY3kvJCgxKS5jb25mICQoc3JjdHJlZSkvJChzcmMpL3BvbGljeS8kKDEpLmNvbmYuZGVmYXVsdCkgL2Rldi9udWxsKTsgXAorZWNobyAiOyIKK2VuZGVmCitxdWlldF9jbWRfcG9saWN5ICA9IFBPTElDWSAgJEAKKyAgICAgIGNtZF9wb2xpY3kgID0gKCQoY2FsbCBkb19wb2xpY3kscHJvZmlsZSk7ICQoY2FsbCBkb19wb2xpY3ksZXhjZXB0aW9uX3BvbGljeSk7ICQoY2FsbCBkb19wb2xpY3ksZG9tYWluX3BvbGljeSk7ICQoY2FsbCBkb19wb2xpY3ksbWFuYWdlcik7ICQoY2FsbCBkb19wb2xpY3ksc3RhdCkpID4kQAogCi0kKG9iaikvcG9saWN5L2V4Y2VwdGlvbl9wb2xpY3kuY29uZjoKLQlAbWtkaXIgLXAgJChvYmopL3BvbGljeS8KLQlAZWNobyBDcmVhdGluZyBhIGRlZmF1bHQgcG9saWN5L2V4Y2VwdGlvbl9wb2xpY3kuY29uZgotCUBlY2hvIGluaXRpYWxpemVfZG9tYWluIC9zYmluL21vZHByb2JlIGZyb20gYW55ID4+ICRACi0JQGVjaG8gaW5pdGlhbGl6ZV9kb21haW4gL3NiaW4vaG90cGx1ZyBmcm9tIGFueSA+PiAkQAotCi0kKG9iaikvcG9saWN5L2RvbWFpbl9wb2xpY3kuY29uZjoKLQlAbWtkaXIgLXAgJChvYmopL3BvbGljeS8KLQlAZWNobyBDcmVhdGluZyBhbiBlbXB0eSBwb2xpY3kvZG9tYWluX3BvbGljeS5jb25mCi0JQHRvdWNoICRACi0KLSQob2JqKS9wb2xpY3kvbWFuYWdlci5jb25mOgotCUBta2RpciAtcCAkKG9iaikvcG9saWN5LwotCUBlY2hvIENyZWF0aW5nIGFuIGVtcHR5IHBvbGljeS9tYW5hZ2VyLmNvbmYKLQlAdG91Y2ggJEAKLQotJChvYmopL3BvbGljeS9zdGF0LmNvbmY6Ci0JQG1rZGlyIC1wICQob2JqKS9wb2xpY3kvCi0JQGVjaG8gQ3JlYXRpbmcgYW4gZW1wdHkgcG9saWN5L3N0YXQuY29uZgotCUB0b3VjaCAkQAotCi0kKG9iaikvYnVpbHRpbi1wb2xpY3kuaDogJChvYmopL3BvbGljeS9wcm9maWxlLmNvbmYgJChvYmopL3BvbGljeS9leGNlcHRpb25fcG9saWN5LmNvbmYgJChvYmopL3BvbGljeS9kb21haW5fcG9saWN5LmNvbmYgJChvYmopL3BvbGljeS9tYW5hZ2VyLmNvbmYgJChvYmopL3BvbGljeS9zdGF0LmNvbmYKLQlAZWNobyBHZW5lcmF0aW5nIGJ1aWx0LWluIHBvbGljeSBmb3IgVE9NT1lPIDIuNS54LgotCUBlY2hvICJzdGF0aWMgY2hhciB0b21veW9fYnVpbHRpbl9wcm9maWxlW10gX19pbml0ZGF0YSA9IiA+ICRALnRtcAotCUBzZWQgLWUgJ3MvXFwvXFxcXC9nJyAtZSAncy9cIi9cXCIvZycgLWUgJ3MvXCguKlwpLyJcMVxcbiIvJyA8ICQob2JqKS9wb2xpY3kvcHJvZmlsZS5jb25mID4+ICRALnRtcAotCUBlY2hvICJcIlwiOyIgPj4gJEAudG1wCi0JQGVjaG8gInN0YXRpYyBjaGFyIHRvbW95b19idWlsdGluX2V4Y2VwdGlvbl9wb2xpY3lbXSBfX2luaXRkYXRhID0iID4+ICRALnRtcAotCUBzZWQgLWUgJ3MvXFwvXFxcXC9nJyAtZSAncy9cIi9cXCIvZycgLWUgJ3MvXCguKlwpLyJcMVxcbiIvJyA8ICQob2JqKS9wb2xpY3kvZXhjZXB0aW9uX3BvbGljeS5jb25mID4+ICRALnRtcAotCUBlY2hvICJcIlwiOyIgPj4gJEAudG1wCi0JQGVjaG8gInN0YXRpYyBjaGFyIHRvbW95b19idWlsdGluX2RvbWFpbl9wb2xpY3lbXSBfX2luaXRkYXRhID0iID4+ICRALnRtcAotCUBzZWQgLWUgJ3MvXFwvXFxcXC9nJyAtZSAncy9cIi9cXCIvZycgLWUgJ3MvXCguKlwpLyJcMVxcbiIvJyA8ICQob2JqKS9wb2xpY3kvZG9tYWluX3BvbGljeS5jb25mID4+ICRALnRtcAotCUBlY2hvICJcIlwiOyIgPj4gJEAudG1wCi0JQGVjaG8gInN0YXRpYyBjaGFyIHRvbW95b19idWlsdGluX21hbmFnZXJbXSBfX2luaXRkYXRhID0iID4+ICRALnRtcAotCUBzZWQgLWUgJ3MvXFwvXFxcXC9nJyAtZSAncy9cIi9cXCIvZycgLWUgJ3MvXCguKlwpLyJcMVxcbiIvJyA8ICQob2JqKS9wb2xpY3kvbWFuYWdlci5jb25mID4+ICRALnRtcAotCUBlY2hvICJcIlwiOyIgPj4gJEAudG1wCi0JQGVjaG8gInN0YXRpYyBjaGFyIHRvbW95b19idWlsdGluX3N0YXRbXSBfX2luaXRkYXRhID0iID4+ICRALnRtcAotCUBzZWQgLWUgJ3MvXFwvXFxcXC9nJyAtZSAncy9cIi9cXCIvZycgLWUgJ3MvXCguKlwpLyJcMVxcbiIvJyA8ICQob2JqKS9wb2xpY3kvc3RhdC5jb25mID4+ICRALnRtcAotCUBlY2hvICJcIlwiOyIgPj4gJEAudG1wCi0JQG12ICRALnRtcCAkQAorJChvYmopL2J1aWx0aW4tcG9saWN5Lmg6ICQod2lsZGNhcmQgJChvYmopL3BvbGljeS8qLmNvbmYgJChzcmMpL3BvbGljeS8qLmNvbmYuZGVmYXVsdCkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxwb2xpY3kpCiAKICQob2JqKS9jb21tb24ubzogJChvYmopL2J1aWx0aW4tcG9saWN5LmgKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L3RvbW95by9jb21tb24uaCBiL3NlY3VyaXR5L3RvbW95by9jb21tb24uaAppbmRleCBiODk3ZDQ4Li5mOWM5ZmIxIDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vY29tbW9uLmgKKysrIGIvc2VjdXJpdHkvdG9tb3lvL2NvbW1vbi5oCkBAIC05NDUsNyArOTQ1LDcgQEAKIGNoYXIgKnRvbW95b19pbml0X2xvZyhzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyAqciwgaW50IGxlbiwgY29uc3QgY2hhciAqZm10LAogCQkgICAgICB2YV9saXN0IGFyZ3MpOwogY2hhciAqdG9tb3lvX3JlYWRfdG9rZW4oc3RydWN0IHRvbW95b19hY2xfcGFyYW0gKnBhcmFtKTsKLWNoYXIgKnRvbW95b19yZWFscGF0aF9mcm9tX3BhdGgoc3RydWN0IHBhdGggKnBhdGgpOworY2hhciAqdG9tb3lvX3JlYWxwYXRoX2Zyb21fcGF0aChjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCk7CiBjaGFyICp0b21veW9fcmVhbHBhdGhfbm9mb2xsb3coY29uc3QgY2hhciAqcGF0aG5hbWUpOwogY29uc3QgY2hhciAqdG9tb3lvX2dldF9leGUodm9pZCk7CiBjb25zdCBjaGFyICp0b21veW9feWVzbm8oY29uc3QgdW5zaWduZWQgaW50IHZhbHVlKTsKQEAgLTk3OCw3ICs5NzgsNyBAQAogCQkgICAgICBzdHJ1Y3QgcGF0aCAqcGF0aDIpOwogaW50IHRvbW95b19wYXRoX251bWJlcl9wZXJtKGNvbnN0IHU4IG9wZXJhdGlvbiwgc3RydWN0IHBhdGggKnBhdGgsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBudW1iZXIpOwotaW50IHRvbW95b19wYXRoX3Blcm0oY29uc3QgdTggb3BlcmF0aW9uLCBzdHJ1Y3QgcGF0aCAqcGF0aCwKK2ludCB0b21veW9fcGF0aF9wZXJtKGNvbnN0IHU4IG9wZXJhdGlvbiwgY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsCiAJCSAgICAgY29uc3QgY2hhciAqdGFyZ2V0KTsKIHVuc2lnbmVkIGludCB0b21veW9fcG9sbF9jb250cm9sKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KTsKIHVuc2lnbmVkIGludCB0b21veW9fcG9sbF9sb2coc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKndhaXQpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL2ZpbGUuYyBiL3NlY3VyaXR5L3RvbW95by9maWxlLmMKaW5kZXggYzE1MWExOC4uMjM2N2IxMCAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL2ZpbGUuYworKysgYi9zZWN1cml0eS90b21veW8vZmlsZS5jCkBAIC0xNDUsNyArMTQ1LDcgQEAKICAqCiAgKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgogICovCi1zdGF0aWMgYm9vbCB0b21veW9fZ2V0X3JlYWxwYXRoKHN0cnVjdCB0b21veW9fcGF0aF9pbmZvICpidWYsIHN0cnVjdCBwYXRoICpwYXRoKQorc3RhdGljIGJvb2wgdG9tb3lvX2dldF9yZWFscGF0aChzdHJ1Y3QgdG9tb3lvX3BhdGhfaW5mbyAqYnVmLCBjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCkKIHsKIAlidWYtPm5hbWUgPSB0b21veW9fcmVhbHBhdGhfZnJvbV9wYXRoKHBhdGgpOwogCWlmIChidWYtPm5hbWUpIHsKQEAgLTc4Miw3ICs3ODIsNyBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCiAgKi8KLWludCB0b21veW9fcGF0aF9wZXJtKGNvbnN0IHU4IG9wZXJhdGlvbiwgc3RydWN0IHBhdGggKnBhdGgsIGNvbnN0IGNoYXIgKnRhcmdldCkKK2ludCB0b21veW9fcGF0aF9wZXJtKGNvbnN0IHU4IG9wZXJhdGlvbiwgY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIGNvbnN0IGNoYXIgKnRhcmdldCkKIHsKIAlzdHJ1Y3QgdG9tb3lvX3JlcXVlc3RfaW5mbyByOwogCXN0cnVjdCB0b21veW9fb2JqX2luZm8gb2JqID0gewpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL3BvbGljeS9leGNlcHRpb25fcG9saWN5LmNvbmYuZGVmYXVsdCBiL3NlY3VyaXR5L3RvbW95by9wb2xpY3kvZXhjZXB0aW9uX3BvbGljeS5jb25mLmRlZmF1bHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3OGRmNAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3RvbW95by9wb2xpY3kvZXhjZXB0aW9uX3BvbGljeS5jb25mLmRlZmF1bHQKQEAgLTAsMCArMSwyIEBACitpbml0aWFsaXplX2RvbWFpbiAvc2Jpbi9tb2Rwcm9iZSBmcm9tIGFueQoraW5pdGlhbGl6ZV9kb21haW4gL3NiaW4vaG90cGx1ZyBmcm9tIGFueQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMgYi9zZWN1cml0eS90b21veW8vcmVhbHBhdGguYwppbmRleCBiZWQ3NDVjLi4xZTBkNDgwIDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vcmVhbHBhdGguYworKysgYi9zZWN1cml0eS90b21veW8vcmVhbHBhdGguYwpAQCAtODksNyArODksNyBAQAogICoKICAqIElmIGRlbnRyeSBpcyBhIGRpcmVjdG9yeSwgdHJhaWxpbmcgJy8nIGlzIGFwcGVuZGVkLgogICovCi1zdGF0aWMgY2hhciAqdG9tb3lvX2dldF9hYnNvbHV0ZV9wYXRoKHN0cnVjdCBwYXRoICpwYXRoLCBjaGFyICogY29uc3QgYnVmZmVyLAorc3RhdGljIGNoYXIgKnRvbW95b19nZXRfYWJzb2x1dGVfcGF0aChjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCwgY2hhciAqIGNvbnN0IGJ1ZmZlciwKIAkJCQkgICAgICBjb25zdCBpbnQgYnVmbGVuKQogewogCWNoYXIgKnBvcyA9IEVSUl9QVFIoLUVOT01FTSk7CkBAIC0yMTYsNyArMjE2LDcgQEAKICAqCiAgKiBSZXR1cm5zIHRoZSBidWZmZXIuCiAgKi8KLXN0YXRpYyBjaGFyICp0b21veW9fZ2V0X3NvY2tldF9uYW1lKHN0cnVjdCBwYXRoICpwYXRoLCBjaGFyICogY29uc3QgYnVmZmVyLAorc3RhdGljIGNoYXIgKnRvbW95b19nZXRfc29ja2V0X25hbWUoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIGNoYXIgKiBjb25zdCBidWZmZXIsCiAJCQkJICAgIGNvbnN0IGludCBidWZsZW4pCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IHBhdGgtPmRlbnRyeS0+ZF9pbm9kZTsKQEAgLTI0Nyw3ICsyNDcsNyBAQAogICogVGhlc2UgZnVuY3Rpb25zIHVzZSBremFsbG9jKCksIHNvIHRoZSBjYWxsZXIgbXVzdCBjYWxsIGtmcmVlKCkKICAqIGlmIHRoZXNlIGZ1bmN0aW9ucyBkaWRuJ3QgcmV0dXJuIE5VTEwuCiAgKi8KLWNoYXIgKnRvbW95b19yZWFscGF0aF9mcm9tX3BhdGgoc3RydWN0IHBhdGggKnBhdGgpCitjaGFyICp0b21veW9fcmVhbHBhdGhfZnJvbV9wYXRoKGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoKQogewogCWNoYXIgKmJ1ZiA9IE5VTEw7CiAJY2hhciAqbmFtZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9zZWN1cml0eS90b21veW8vdG9tb3lvLmMgYi9zZWN1cml0eS90b21veW8vdG9tb3lvLmMKaW5kZXggZjBiNzU2ZS4uNTdjODhkNSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvdG9tb3lvL3RvbW95by5jCisrKyBiL3NlY3VyaXR5L3RvbW95by90b21veW8uYwpAQCAtMTQ0LDEwICsxNDQsOSBAQAogICoKICAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UuCiAgKi8KLXN0YXRpYyBpbnQgdG9tb3lvX2lub2RlX2dldGF0dHIoc3RydWN0IHZmc21vdW50ICptbnQsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3N0YXRpYyBpbnQgdG9tb3lvX2lub2RlX2dldGF0dHIoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgpCiB7Ci0Jc3RydWN0IHBhdGggcGF0aCA9IHsgbW50LCBkZW50cnkgfTsKLQlyZXR1cm4gdG9tb3lvX3BhdGhfcGVybShUT01PWU9fVFlQRV9HRVRBVFRSLCAmcGF0aCwgTlVMTCk7CisJcmV0dXJuIHRvbW95b19wYXRoX3Blcm0oVE9NT1lPX1RZUEVfR0VUQVRUUiwgcGF0aCwgTlVMTCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkveWFtYS9LY29uZmlnIGIvc2VjdXJpdHkveWFtYS9LY29uZmlnCmluZGV4IDIwZWY1MTQuLjMxMjNlMWQgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3lhbWEvS2NvbmZpZworKysgYi9zZWN1cml0eS95YW1hL0tjb25maWcKQEAgLTEsOCArMSw2IEBACiBjb25maWcgU0VDVVJJVFlfWUFNQQogCWJvb2wgIllhbWEgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNFQ1VSSVRZCi0Jc2VsZWN0IFNFQ1VSSVRZRlMKLQlzZWxlY3QgU0VDVVJJVFlfUEFUSAogCWRlZmF1bHQgbgogCWhlbHAKIAkgIFRoaXMgc2VsZWN0cyBZYW1hLCB3aGljaCBleHRlbmRzIERBQyBzdXBwb3J0IHdpdGggYWRkaXRpb25hbApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkveWFtYS95YW1hX2xzbS5jIGIvc2VjdXJpdHkveWFtYS95YW1hX2xzbS5jCmluZGV4IDEzYzg4ZmJjLi4yNGFhZTJhIDEwMDY0NAotLS0gYS9zZWN1cml0eS95YW1hL3lhbWFfbHNtLmMKKysrIGIvc2VjdXJpdHkveWFtYS95YW1hX2xzbS5jCkBAIC0zNzksMjAgKzM3OSwxNyBAQAogc3RhdGljIGludCB5YW1hX2RvaW50dmVjX21pbm1heChzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAogCQkJCXZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQogewotCWludCByYzsKKwlzdHJ1Y3QgY3RsX3RhYmxlIHRhYmxlX2NvcHk7CiAKIAlpZiAod3JpdGUgJiYgIWNhcGFibGUoQ0FQX1NZU19QVFJBQ0UpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JcmMgPSBwcm9jX2RvaW50dmVjX21pbm1heCh0YWJsZSwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KIAkvKiBMb2NrIHRoZSBtYXggdmFsdWUgaWYgaXQgZXZlciBnZXRzIHNldC4gKi8KLQlpZiAod3JpdGUgJiYgKihpbnQgKil0YWJsZS0+ZGF0YSA9PSAqKGludCAqKXRhYmxlLT5leHRyYTIpCi0JCXRhYmxlLT5leHRyYTEgPSB0YWJsZS0+ZXh0cmEyOworCXRhYmxlX2NvcHkgPSAqdGFibGU7CisJaWYgKCooaW50ICopdGFibGVfY29weS5kYXRhID09ICooaW50ICopdGFibGVfY29weS5leHRyYTIpCisJCXRhYmxlX2NvcHkuZXh0cmExID0gdGFibGVfY29weS5leHRyYTI7CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIHByb2NfZG9pbnR2ZWNfbWlubWF4KCZ0YWJsZV9jb3B5LCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKIH0KIAogc3RhdGljIGludCB6ZXJvOwpkaWZmIC0tZ2l0IGEvc291bmQvS2NvbmZpZyBiL3NvdW5kL0tjb25maWcKaW5kZXggYzcxMGNlMi4uNWEyNDBlMCAxMDA2NDQKLS0tIGEvc291bmQvS2NvbmZpZworKysgYi9zb3VuZC9LY29uZmlnCkBAIC03Niw2ICs3Niw4IEBACiAKIHNvdXJjZSAic291bmQvcGNpL0tjb25maWciCiAKK3NvdXJjZSAic291bmQvaGRhL0tjb25maWciCisKIHNvdXJjZSAic291bmQvcHBjL0tjb25maWciCiAKIHNvdXJjZSAic291bmQvYW9hL0tjb25maWciCmRpZmYgLS1naXQgYS9zb3VuZC9NYWtlZmlsZSBiL3NvdW5kL01ha2VmaWxlCmluZGV4IGNlOTEzMmIuLjc3MzIwNzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL01ha2VmaWxlCisrKyBiL3NvdW5kL01ha2VmaWxlCkBAIC02LDcgKzYsNyBAQAogb2JqLSQoQ09ORklHX1NPVU5EX1BSSU1FKSArPSBvc3MvCiBvYmotJChDT05GSUdfRE1BU09VTkQpICs9IG9zcy8KIG9iai0kKENPTkZJR19TTkQpICs9IGNvcmUvIGkyYy8gZHJpdmVycy8gaXNhLyBwY2kvIHBwYy8gYXJtLyBzaC8gc3ludGgvIHVzYi8gXAotCWZpcmV3aXJlLyBzcGFyYy8gc3BpLyBwYXJpc2MvIHBjbWNpYS8gbWlwcy8gc29jLyBhdG1lbC8KKwlmaXJld2lyZS8gc3BhcmMvIHNwaS8gcGFyaXNjLyBwY21jaWEvIG1pcHMvIHNvYy8gYXRtZWwvIGhkYS8KIG9iai0kKENPTkZJR19TTkRfQU9BKSArPSBhb2EvCiAKICMgVGhpcyBvbmUgbXVzdCBiZSBjb21waWxhYmxlIGV2ZW4gaWYgc291bmQgaXMgY29uZmlndXJlZCBvdXQKZGlmZiAtLWdpdCBhL3NvdW5kL2FvYS9zb3VuZGJ1cy9pMnNidXMvY29yZS5jIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9jb3JlLmMKaW5kZXggYjk3MzdmYS4uMWNiZjIxMCAxMDA2NDQKLS0tIGEvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9jb3JlLmMKKysrIGIvc291bmQvYW9hL3NvdW5kYnVzL2kyc2J1cy9jb3JlLmMKQEAgLTMxLDcgKzMxLDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoZm9yY2UsICJGb3JjZSBsb2FkaW5nIGkyc2J1cyBldmVuIHdoZW4iCiAJCQkiIG5vIGxheW91dC1pZCBwcm9wZXJ0eSBpcyBwcmVzZW50Iik7CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGkyc2J1c19tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgaTJzYnVzX21hdGNoW10gPSB7CiAJeyAubmFtZSA9ICJpMnMiIH0sCiAJeyB9CiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9jb250cm9sLmMgYi9zb3VuZC9jb3JlL2NvbnRyb2wuYwppbmRleCBlZWI2OTFkLi4xOTZhNmZlIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL2NvbnRyb2wuYworKysgYi9zb3VuZC9jb3JlL2NvbnRyb2wuYwpAQCAtMTkyLDM2ICsxOTIsNDEgQEAKIEVYUE9SVF9TWU1CT0woc25kX2N0bF9ub3RpZnkpOwogCiAvKioKLSAqIHNuZF9jdGxfbmV3IC0gY3JlYXRlIGEgY29udHJvbCBpbnN0YW5jZSBmcm9tIHRoZSB0ZW1wbGF0ZQotICogQGNvbnRyb2w6IHRoZSBjb250cm9sIHRlbXBsYXRlCi0gKiBAYWNjZXNzOiB0aGUgZGVmYXVsdCBjb250cm9sIGFjY2VzcworICogc25kX2N0bF9uZXcgLSBjcmVhdGUgYSBuZXcgY29udHJvbCBpbnN0YW5jZSB3aXRoIHNvbWUgZWxlbWVudHMKKyAqIEBrY3RsOiB0aGUgcG9pbnRlciB0byBzdG9yZSBuZXcgY29udHJvbCBpbnN0YW5jZQorICogQGNvdW50OiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgY29udHJvbAorICogQGFjY2VzczogdGhlIGRlZmF1bHQgYWNjZXNzIGZsYWdzIGZvciBlbGVtZW50cyBpbiB0aGlzIGNvbnRyb2wKKyAqIEBmaWxlOiBnaXZlbiB3aGVuIGxvY2tpbmcgdGhlc2UgZWxlbWVudHMKICAqCi0gKiBBbGxvY2F0ZXMgYSBuZXcgc3RydWN0IHNuZF9rY29udHJvbCBpbnN0YW5jZSBhbmQgY29waWVzIHRoZSBnaXZlbiB0ZW1wbGF0ZSAKLSAqIHRvIHRoZSBuZXcgaW5zdGFuY2UuIEl0IGRvZXMgbm90IGNvcHkgdm9sYXRpbGUgZGF0YSAoYWNjZXNzKS4KKyAqIEFsbG9jYXRlcyBhIG1lbW9yeSBvYmplY3QgZm9yIGEgbmV3IGNvbnRyb2wgaW5zdGFuY2UuIFRoZSBpbnN0YW5jZSBoYXMKKyAqIGVsZW1lbnRzIGFzIG1hbnkgYXMgdGhlIGdpdmVuIG51bWJlciAoQGNvdW50KS4gRWFjaCBlbGVtZW50IGhhcyBnaXZlbgorICogYWNjZXNzIHBlcm1pc3Npb25zIChAYWNjZXNzKS4gRWFjaCBlbGVtZW50IGlzIGxvY2tlZCB3aGVuIEBmaWxlIGlzIGdpdmVuLgogICoKLSAqIFJldHVybjogVGhlIHBvaW50ZXIgb2YgdGhlIG5ldyBpbnN0YW5jZSwgb3IgJU5VTEwgb24gZmFpbHVyZS4KKyAqIFJldHVybjogMCBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGZhaWx1cmUKICAqLwotc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2wgKnNuZF9jdGxfbmV3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmNvbnRyb2wsCi0JCQkJCXVuc2lnbmVkIGludCBhY2Nlc3MpCitzdGF0aWMgaW50IHNuZF9jdGxfbmV3KHN0cnVjdCBzbmRfa2NvbnRyb2wgKiprY3RsLCB1bnNpZ25lZCBpbnQgY291bnQsCisJCSAgICAgICB1bnNpZ25lZCBpbnQgYWNjZXNzLCBzdHJ1Y3Qgc25kX2N0bF9maWxlICpmaWxlKQogewotCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CisJdW5zaWduZWQgaW50IHNpemU7CiAJdW5zaWduZWQgaW50IGlkeDsKIAkKLQlpZiAoc25kX0JVR19PTighY29udHJvbCB8fCAhY29udHJvbC0+Y291bnQpKQotCQlyZXR1cm4gTlVMTDsKKwlpZiAoY291bnQgPT0gMCB8fCBjb3VudCA+IE1BWF9DT05UUk9MX0NPVU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChjb250cm9sLT5jb3VudCA+IE1BWF9DT05UUk9MX0NPVU5UKQotCQlyZXR1cm4gTlVMTDsKKwlzaXplICA9IHNpemVvZihzdHJ1Y3Qgc25kX2tjb250cm9sKTsKKwlzaXplICs9IHNpemVvZihzdHJ1Y3Qgc25kX2tjb250cm9sX3ZvbGF0aWxlKSAqIGNvdW50OwogCi0Ja2N0bCA9IGt6YWxsb2Moc2l6ZW9mKCprY3RsKSArIHNpemVvZihzdHJ1Y3Qgc25kX2tjb250cm9sX3ZvbGF0aWxlKSAqIGNvbnRyb2wtPmNvdW50LCBHRlBfS0VSTkVMKTsKLQlpZiAoa2N0bCA9PSBOVUxMKSB7Ci0JCXByX2VycigiQUxTQTogQ2Fubm90IGFsbG9jYXRlIGNvbnRyb2wgaW5zdGFuY2VcbiIpOwotCQlyZXR1cm4gTlVMTDsKKwkqa2N0bCA9IGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEqa2N0bCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IGNvdW50OyBpZHgrKykgeworCQkoKmtjdGwpLT52ZFtpZHhdLmFjY2VzcyA9IGFjY2VzczsKKwkJKCprY3RsKS0+dmRbaWR4XS5vd25lciA9IGZpbGU7CiAJfQotCSprY3RsID0gKmNvbnRyb2w7Ci0JZm9yIChpZHggPSAwOyBpZHggPCBrY3RsLT5jb3VudDsgaWR4KyspCi0JCWtjdGwtPnZkW2lkeF0uYWNjZXNzID0gYWNjZXNzOwotCXJldHVybiBrY3RsOworCSgqa2N0bCktPmNvdW50ID0gY291bnQ7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0yMzgsMzcgKzI0Myw1MyBAQAogc3RydWN0IHNuZF9rY29udHJvbCAqc25kX2N0bF9uZXcxKGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3ICpuY29udHJvbCwKIAkJCQkgIHZvaWQgKnByaXZhdGVfZGF0YSkKIHsKLQlzdHJ1Y3Qgc25kX2tjb250cm9sIGtjdGw7CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CiAJdW5zaWduZWQgaW50IGFjY2VzczsKKwlpbnQgZXJyOwogCQogCWlmIChzbmRfQlVHX09OKCFuY29udHJvbCB8fCAhbmNvbnRyb2wtPmluZm8pKQogCQlyZXR1cm4gTlVMTDsKLQltZW1zZXQoJmtjdGwsIDAsIHNpemVvZihrY3RsKSk7Ci0Ja2N0bC5pZC5pZmFjZSA9IG5jb250cm9sLT5pZmFjZTsKLQlrY3RsLmlkLmRldmljZSA9IG5jb250cm9sLT5kZXZpY2U7Ci0Ja2N0bC5pZC5zdWJkZXZpY2UgPSBuY29udHJvbC0+c3ViZGV2aWNlOworCisJY291bnQgPSBuY29udHJvbC0+Y291bnQ7CisJaWYgKGNvdW50ID09IDApCisJCWNvdW50ID0gMTsKKworCWFjY2VzcyA9IG5jb250cm9sLT5hY2Nlc3M7CisJaWYgKGFjY2VzcyA9PSAwKQorCQlhY2Nlc3MgPSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFOworCWFjY2VzcyAmPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCSAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19WT0xBVElMRSB8CisJCSAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19JTkFDVElWRSB8CisJCSAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRFdSSVRFIHwKKwkJICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9DT01NQU5EIHwKKwkJICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9DQUxMQkFDSyk7CisKKwllcnIgPSBzbmRfY3RsX25ldygma2N0bCwgY291bnQsIGFjY2VzcywgTlVMTCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBOVUxMOworCisJLyogVGhlICdudW1pZCcgbWVtYmVyIGlzIGRlY2lkZWQgd2hlbiBjYWxsaW5nIHNuZF9jdGxfYWRkKCkuICovCisJa2N0bC0+aWQuaWZhY2UgPSBuY29udHJvbC0+aWZhY2U7CisJa2N0bC0+aWQuZGV2aWNlID0gbmNvbnRyb2wtPmRldmljZTsKKwlrY3RsLT5pZC5zdWJkZXZpY2UgPSBuY29udHJvbC0+c3ViZGV2aWNlOwogCWlmIChuY29udHJvbC0+bmFtZSkgewotCQlzdHJsY3B5KGtjdGwuaWQubmFtZSwgbmNvbnRyb2wtPm5hbWUsIHNpemVvZihrY3RsLmlkLm5hbWUpKTsKLQkJaWYgKHN0cmNtcChuY29udHJvbC0+bmFtZSwga2N0bC5pZC5uYW1lKSAhPSAwKQorCQlzdHJsY3B5KGtjdGwtPmlkLm5hbWUsIG5jb250cm9sLT5uYW1lLCBzaXplb2Yoa2N0bC0+aWQubmFtZSkpOworCQlpZiAoc3RyY21wKG5jb250cm9sLT5uYW1lLCBrY3RsLT5pZC5uYW1lKSAhPSAwKQogCQkJcHJfd2FybigiQUxTQTogQ29udHJvbCBuYW1lICclcycgdHJ1bmNhdGVkIHRvICclcydcbiIsCi0JCQkJbmNvbnRyb2wtPm5hbWUsIGtjdGwuaWQubmFtZSk7CisJCQkJbmNvbnRyb2wtPm5hbWUsIGtjdGwtPmlkLm5hbWUpOwogCX0KLQlrY3RsLmlkLmluZGV4ID0gbmNvbnRyb2wtPmluZGV4OwotCWtjdGwuY291bnQgPSBuY29udHJvbC0+Y291bnQgPyBuY29udHJvbC0+Y291bnQgOiAxOwotCWFjY2VzcyA9IG5jb250cm9sLT5hY2Nlc3MgPT0gMCA/IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgOgotCQkgKG5jb250cm9sLT5hY2Nlc3MgJiAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURXwKLQkJCQkgICAgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVk9MQVRJTEV8Ci0JCQkJICAgICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFfAotCQkJCSAgICAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRFdSSVRFfAotCQkJCSAgICAgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfQ09NTUFORHwKLQkJCQkgICAgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX0NBTExCQUNLKSk7Ci0Ja2N0bC5pbmZvID0gbmNvbnRyb2wtPmluZm87Ci0Ja2N0bC5nZXQgPSBuY29udHJvbC0+Z2V0OwotCWtjdGwucHV0ID0gbmNvbnRyb2wtPnB1dDsKLQlrY3RsLnRsdi5wID0gbmNvbnRyb2wtPnRsdi5wOwotCWtjdGwucHJpdmF0ZV92YWx1ZSA9IG5jb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCWtjdGwucHJpdmF0ZV9kYXRhID0gcHJpdmF0ZV9kYXRhOwotCXJldHVybiBzbmRfY3RsX25ldygma2N0bCwgYWNjZXNzKTsKKwlrY3RsLT5pZC5pbmRleCA9IG5jb250cm9sLT5pbmRleDsKKworCWtjdGwtPmluZm8gPSBuY29udHJvbC0+aW5mbzsKKwlrY3RsLT5nZXQgPSBuY29udHJvbC0+Z2V0OworCWtjdGwtPnB1dCA9IG5jb250cm9sLT5wdXQ7CisJa2N0bC0+dGx2LnAgPSBuY29udHJvbC0+dGx2LnA7CisKKwlrY3RsLT5wcml2YXRlX3ZhbHVlID0gbmNvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJa2N0bC0+cHJpdmF0ZV9kYXRhID0gcHJpdmF0ZV9kYXRhOworCisJcmV0dXJuIGtjdGw7CiB9CiBFWFBPUlRfU1lNQk9MKHNuZF9jdGxfbmV3MSk7CiAKQEAgLTU1Nyw2ICs1NzgsNyBAQAogICoKICAqIEZpbmRzIHRoZSBjb250cm9sIGluc3RhbmNlIHdpdGggdGhlIGdpdmVuIGlkLCBhbmQgYWN0aXZhdGUgb3IKICAqIGluYWN0aXZhdGUgdGhlIGNvbnRyb2wgdG9nZXRoZXIgd2l0aCBub3RpZmljYXRpb24sIGlmIGNoYW5nZWQuCisgKiBUaGUgZ2l2ZW4gSUQgZGF0YSBpcyBmaWxsZWQgd2l0aCBmdWxsIGluZm9ybWF0aW9uLgogICoKICAqIFJldHVybjogMCBpZiB1bmNoYW5nZWQsIDEgaWYgY2hhbmdlZCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKi8KQEAgLTU4Niw2ICs2MDgsNyBAQAogCQkJZ290byB1bmxvY2s7CiAJCXZkLT5hY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFOwogCX0KKwlzbmRfY3RsX2J1aWxkX2lvZmYoaWQsIGtjdGwsIGluZGV4X29mZnNldCk7CiAJcmV0ID0gMTsKICB1bmxvY2s6CiAJdXBfd3JpdGUoJmNhcmQtPmNvbnRyb2xzX3J3c2VtKTsKQEAgLTEwMDYsNyArMTAyOSw3IEBACiBzdHJ1Y3QgdXNlcl9lbGVtZW50IHsKIAlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gaW5mbzsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7Ci0Jdm9pZCAqZWxlbV9kYXRhOwkJLyogZWxlbWVudCBkYXRhICovCisJY2hhciAqZWxlbV9kYXRhOwkJLyogZWxlbWVudCBkYXRhICovCiAJdW5zaWduZWQgbG9uZyBlbGVtX2RhdGFfc2l6ZTsJLyogc2l6ZSBvZiBlbGVtZW50IGRhdGEgaW4gYnl0ZXMgKi8KIAl2b2lkICp0bHZfZGF0YTsJCQkvKiBUTFYgZGF0YSAqLwogCXVuc2lnbmVkIGxvbmcgdGx2X2RhdGFfc2l6ZTsJLyogVExWIGRhdGEgc2l6ZSAqLwpAQCAtMTAxNyw4ICsxMDQwLDEyIEBACiAJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewogCXN0cnVjdCB1c2VyX2VsZW1lbnQgKnVlID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0OwogCisJb2Zmc2V0ID0gc25kX2N0bF9nZXRfaW9mZihrY29udHJvbCwgJnVpbmZvLT5pZCk7CiAJKnVpbmZvID0gdWUtPmluZm87CisJc25kX2N0bF9idWlsZF9pb2ZmKCZ1aW5mby0+aWQsIGtjb250cm9sLCBvZmZzZXQpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEwMjgsMTAgKzEwNTUsMTMgQEAKIAlzdHJ1Y3QgdXNlcl9lbGVtZW50ICp1ZSA9IGtjb250cm9sLT5wcml2YXRlX2RhdGE7CiAJY29uc3QgY2hhciAqbmFtZXM7CiAJdW5zaWduZWQgaW50IGl0ZW07CisJdW5zaWduZWQgaW50IG9mZnNldDsKIAogCWl0ZW0gPSB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtOwogCisJb2Zmc2V0ID0gc25kX2N0bF9nZXRfaW9mZihrY29udHJvbCwgJnVpbmZvLT5pZCk7CiAJKnVpbmZvID0gdWUtPmluZm87CisJc25kX2N0bF9idWlsZF9pb2ZmKCZ1aW5mby0+aWQsIGtjb250cm9sLCBvZmZzZXQpOwogCiAJaXRlbSA9IG1pbihpdGVtLCB1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtcyAtIDEpOwogCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBpdGVtOwpAQCAtMTA0OCw5ICsxMDc4LDEyIEBACiAJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCB1c2VyX2VsZW1lbnQgKnVlID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHVlLT5lbGVtX2RhdGFfc2l6ZTsKKwljaGFyICpzcmMgPSB1ZS0+ZWxlbV9kYXRhICsKKwkJCXNuZF9jdGxfZ2V0X2lvZmYoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpICogc2l6ZTsKIAogCW11dGV4X2xvY2soJnVlLT5jYXJkLT51c2VyX2N0bF9sb2NrKTsKLQltZW1jcHkoJnVjb250cm9sLT52YWx1ZSwgdWUtPmVsZW1fZGF0YSwgdWUtPmVsZW1fZGF0YV9zaXplKTsKKwltZW1jcHkoJnVjb250cm9sLT52YWx1ZSwgc3JjLCBzaXplKTsKIAltdXRleF91bmxvY2soJnVlLT5jYXJkLT51c2VyX2N0bF9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNjAsMTEgKzEwOTMsMTQgQEAKIHsKIAlpbnQgY2hhbmdlOwogCXN0cnVjdCB1c2VyX2VsZW1lbnQgKnVlID0ga2NvbnRyb2wtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHVlLT5lbGVtX2RhdGFfc2l6ZTsKKwljaGFyICpkc3QgPSB1ZS0+ZWxlbV9kYXRhICsKKwkJCXNuZF9jdGxfZ2V0X2lvZmYoa2NvbnRyb2wsICZ1Y29udHJvbC0+aWQpICogc2l6ZTsKIAogCW11dGV4X2xvY2soJnVlLT5jYXJkLT51c2VyX2N0bF9sb2NrKTsKLQljaGFuZ2UgPSBtZW1jbXAoJnVjb250cm9sLT52YWx1ZSwgdWUtPmVsZW1fZGF0YSwgdWUtPmVsZW1fZGF0YV9zaXplKSAhPSAwOworCWNoYW5nZSA9IG1lbWNtcCgmdWNvbnRyb2wtPnZhbHVlLCBkc3QsIHNpemUpICE9IDA7CiAJaWYgKGNoYW5nZSkKLQkJbWVtY3B5KHVlLT5lbGVtX2RhdGEsICZ1Y29udHJvbC0+dmFsdWUsIHVlLT5lbGVtX2RhdGFfc2l6ZSk7CisJCW1lbWNweShkc3QsICZ1Y29udHJvbC0+dmFsdWUsIHNpemUpOwogCW11dGV4X3VubG9jaygmdWUtPmNhcmQtPnVzZXJfY3RsX2xvY2spOwogCXJldHVybiBjaGFuZ2U7CiB9CkBAIC0xMDc4LDcgKzExMTQsNyBAQAogCWludCBjaGFuZ2UgPSAwOwogCXZvaWQgKm5ld19kYXRhOwogCi0JaWYgKG9wX2ZsYWcgPiAwKSB7CisJaWYgKG9wX2ZsYWcgPT0gU05EUlZfQ1RMX1RMVl9PUF9XUklURSkgewogCQlpZiAoc2l6ZSA+IDEwMjQgKiAxMjgpCS8qIHNhbmUgdmFsdWUgKi8KIAkJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xMTYxLDg0ICsxMTk3LDEwMyBAQAogc3RhdGljIGludCBzbmRfY3RsX2VsZW1fYWRkKHN0cnVjdCBzbmRfY3RsX2ZpbGUgKmZpbGUsCiAJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICppbmZvLCBpbnQgcmVwbGFjZSkKIHsKKwkvKiBUaGUgY2FwYWNpdHkgb2Ygc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZS52YWx1ZS4qLworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZXNbXSA9IHsKKwkJW1NORFJWX0NUTF9FTEVNX1RZUEVfQk9PTEVBTl0JPSBzaXplb2YobG9uZyksCisJCVtTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVJdCT0gc2l6ZW9mKGxvbmcpLAorCQlbU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEXSA9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQlbU05EUlZfQ1RMX0VMRU1fVFlQRV9CWVRFU10JPSBzaXplb2YodW5zaWduZWQgY2hhciksCisJCVtTTkRSVl9DVExfRUxFTV9UWVBFX0lFQzk1OF0JPSBzaXplb2Yoc3RydWN0IHNuZF9hZXNfaWVjOTU4KSwKKwkJW1NORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0XSA9IHNpemVvZihsb25nIGxvbmcpLAorCX07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtYXhfdmFsdWVfY291bnRzW10gPSB7CisJCVtTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU5dCT0gMTI4LAorCQlbU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSXQk9IDEyOCwKKwkJW1NORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRF0gPSAxMjgsCisJCVtTTkRSVl9DVExfRUxFTV9UWVBFX0JZVEVTXQk9IDUxMiwKKwkJW1NORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4XQk9IDEsCisJCVtTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI2NF0gPSA2NCwKKwl9OwogCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGZpbGUtPmNhcmQ7Ci0Jc3RydWN0IHNuZF9rY29udHJvbCBrY3RsLCAqX2tjdGw7CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKKwl1bnNpZ25lZCBpbnQgY291bnQ7CiAJdW5zaWduZWQgaW50IGFjY2VzczsKIAlsb25nIHByaXZhdGVfc2l6ZTsKIAlzdHJ1Y3QgdXNlcl9lbGVtZW50ICp1ZTsKLQlpbnQgaWR4LCBlcnI7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlpbnQgZXJyOwogCi0JaWYgKGluZm8tPmNvdW50IDwgMSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCEqaW5mby0+aWQubmFtZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHN0cm5sZW4oaW5mby0+aWQubmFtZSwgc2l6ZW9mKGluZm8tPmlkLm5hbWUpKSA+PSBzaXplb2YoaW5mby0+aWQubmFtZSkpCiAJCXJldHVybiAtRUlOVkFMOwotCWFjY2VzcyA9IGluZm8tPmFjY2VzcyA9PSAwID8gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSA6Ci0JCShpbmZvLT5hY2Nlc3MgJiAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURXwKLQkJCQkgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX0lOQUNUSVZFfAotCQkJCSBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQURXUklURSkpOwotCWluZm8tPmlkLm51bWlkID0gMDsKLQltZW1zZXQoJmtjdGwsIDAsIHNpemVvZihrY3RsKSk7CiAKKwkvKiBEZWxldGUgYSBjb250cm9sIHRvIHJlcGxhY2UgdGhlbSBpZiBuZWVkZWQuICovCiAJaWYgKHJlcGxhY2UpIHsKKwkJaW5mby0+aWQubnVtaWQgPSAwOwogCQllcnIgPSBzbmRfY3RsX3JlbW92ZV91c2VyX2N0bChmaWxlLCAmaW5mby0+aWQpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAoY2FyZC0+dXNlcl9jdGxfY291bnQgPj0gTUFYX1VTRVJfQ09OVFJPTFMpCisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIHVzZXJzcGFjZSBjb250cm9scyBhcmUgY291bnRlZCBjb250cm9sIGJ5IGNvbnRyb2wsCisJICogbm90IGVsZW1lbnQgYnkgZWxlbWVudC4KKwkgKi8KKwlpZiAoY2FyZC0+dXNlcl9jdGxfY291bnQgKyAxID4gTUFYX1VTRVJfQ09OVFJPTFMpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtY3B5KCZrY3RsLmlkLCAmaW5mby0+aWQsIHNpemVvZihpbmZvLT5pZCkpOwotCWtjdGwuY291bnQgPSBpbmZvLT5vd25lciA/IGluZm8tPm93bmVyIDogMTsKLQlhY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1VTRVI7Ci0JaWYgKGluZm8tPnR5cGUgPT0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEKQotCQlrY3RsLmluZm8gPSBzbmRfY3RsX2VsZW1fdXNlcl9lbnVtX2luZm87Ci0JZWxzZQotCQlrY3RsLmluZm8gPSBzbmRfY3RsX2VsZW1fdXNlcl9pbmZvOwotCWlmIChhY2Nlc3MgJiBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCkKLQkJa2N0bC5nZXQgPSBzbmRfY3RsX2VsZW1fdXNlcl9nZXQ7Ci0JaWYgKGFjY2VzcyAmIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURSkKLQkJa2N0bC5wdXQgPSBzbmRfY3RsX2VsZW1fdXNlcl9wdXQ7Ci0JaWYgKGFjY2VzcyAmIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRFdSSVRFKSB7Ci0JCWtjdGwudGx2LmMgPSBzbmRfY3RsX2VsZW1fdXNlcl90bHY7CisJLyogQ2hlY2sgdGhlIG51bWJlciBvZiBlbGVtZW50cyBmb3IgdGhpcyB1c2Vyc3BhY2UgY29udHJvbC4gKi8KKwljb3VudCA9IGluZm8tPm93bmVyOworCWlmIChjb3VudCA9PSAwKQorCQljb3VudCA9IDE7CisKKwkvKiBBcnJhbmdlIGFjY2VzcyBwZXJtaXNzaW9ucyBpZiBuZWVkZWQuICovCisJYWNjZXNzID0gaW5mby0+YWNjZXNzOworCWlmIChhY2Nlc3MgPT0gMCkKKwkJYWNjZXNzID0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURTsKKwlhY2Nlc3MgJj0gKFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAorCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfSU5BQ1RJVkUgfAorCQkgICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQURXUklURSk7CisJaWYgKGFjY2VzcyAmIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRFdSSVRFKQogCQlhY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9DQUxMQkFDSzsKLQl9Ci0Jc3dpdGNoIChpbmZvLT50eXBlKSB7Ci0JY2FzZSBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU46Ci0JY2FzZSBTTkRSVl9DVExfRUxFTV9UWVBFX0lOVEVHRVI6Ci0JCXByaXZhdGVfc2l6ZSA9IHNpemVvZihsb25nKTsKLQkJaWYgKGluZm8tPmNvdW50ID4gMTI4KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSNjQ6Ci0JCXByaXZhdGVfc2l6ZSA9IHNpemVvZihsb25nIGxvbmcpOwotCQlpZiAoaW5mby0+Y291bnQgPiA2NCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQljYXNlIFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDoKLQkJcHJpdmF0ZV9zaXplID0gc2l6ZW9mKHVuc2lnbmVkIGludCk7Ci0JCWlmIChpbmZvLT5jb3VudCA+IDEyOCB8fCBpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID09IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9DVExfRUxFTV9UWVBFX0JZVEVTOgotCQlwcml2YXRlX3NpemUgPSBzaXplb2YodW5zaWduZWQgY2hhcik7Ci0JCWlmIChpbmZvLT5jb3VudCA+IDUxMikKLQkJCXJldHVybiAtRUlOVkFMOwotCQlicmVhazsKLQljYXNlIFNORFJWX0NUTF9FTEVNX1RZUEVfSUVDOTU4OgotCQlwcml2YXRlX3NpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9hZXNfaWVjOTU4KTsKLQkJaWYgKGluZm8tPmNvdW50ICE9IDEpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKKwlhY2Nlc3MgfD0gU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1VTRVI7CisKKwkvKgorCSAqIENoZWNrIGluZm9ybWF0aW9uIGFuZCBjYWxjdWxhdGUgdGhlIHNpemUgb2YgZGF0YSBzcGVjaWZpYyB0bworCSAqIHRoaXMgdXNlcnNwYWNlIGNvbnRyb2wuCisJICovCisJaWYgKGluZm8tPnR5cGUgPCBTTkRSVl9DVExfRUxFTV9UWVBFX0JPT0xFQU4gfHwKKwkgICAgaW5mby0+dHlwZSA+IFNORFJWX0NUTF9FTEVNX1RZUEVfSU5URUdFUjY0KQogCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcHJpdmF0ZV9zaXplICo9IGluZm8tPmNvdW50OwotCXVlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHVzZXJfZWxlbWVudCkgKyBwcml2YXRlX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICh1ZSA9PSBOVUxMKQorCWlmIChpbmZvLT50eXBlID09IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCAmJgorCSAgICBpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID09IDApCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpbmZvLT5jb3VudCA8IDEgfHwKKwkgICAgaW5mby0+Y291bnQgPiBtYXhfdmFsdWVfY291bnRzW2luZm8tPnR5cGVdKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcml2YXRlX3NpemUgPSB2YWx1ZV9zaXplc1tpbmZvLT50eXBlXSAqIGluZm8tPmNvdW50OworCisJLyoKKwkgKiBLZWVwIG1lbW9yeSBvYmplY3QgZm9yIHRoaXMgdXNlcnNwYWNlIGNvbnRyb2wuIEFmdGVyIHBhc3NpbmcgdGhpcworCSAqIGNvZGUgYmxvY2ssIHRoZSBpbnN0YW5jZSBzaG91bGQgYmUgZnJlZWQgYnkgc25kX2N0bF9mcmVlX29uZSgpLgorCSAqCisJICogTm90ZSB0aGF0IHRoZXNlIGVsZW1lbnRzIGluIHRoaXMgY29udHJvbCBhcmUgbG9ja2VkLgorCSAqLworCWVyciA9IHNuZF9jdGxfbmV3KCZrY3RsLCBjb3VudCwgYWNjZXNzLCBmaWxlKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwltZW1jcHkoJmtjdGwtPmlkLCAmaW5mby0+aWQsIHNpemVvZihrY3RsLT5pZCkpOworCWtjdGwtPnByaXZhdGVfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB1c2VyX2VsZW1lbnQpICsgcHJpdmF0ZV9zaXplICogY291bnQsCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoa2N0bC0+cHJpdmF0ZV9kYXRhID09IE5VTEwpIHsKKwkJa2ZyZWUoa2N0bCk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KKwlrY3RsLT5wcml2YXRlX2ZyZWUgPSBzbmRfY3RsX2VsZW1fdXNlcl9mcmVlOworCisJLyogU2V0IHByaXZhdGUgZGF0YSBmb3IgdGhpcyB1c2Vyc3BhY2UgY29udHJvbC4gKi8KKwl1ZSA9IChzdHJ1Y3QgdXNlcl9lbGVtZW50ICopa2N0bC0+cHJpdmF0ZV9kYXRhOwogCXVlLT5jYXJkID0gY2FyZDsKIAl1ZS0+aW5mbyA9ICppbmZvOwogCXVlLT5pbmZvLmFjY2VzcyA9IDA7CkBAIC0xMjQ3LDIzICsxMzAyLDM2IEBACiAJaWYgKHVlLT5pbmZvLnR5cGUgPT0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEKSB7CiAJCWVyciA9IHNuZF9jdGxfZWxlbV9pbml0X2VudW1fbmFtZXModWUpOwogCQlpZiAoZXJyIDwgMCkgewotCQkJa2ZyZWUodWUpOworCQkJc25kX2N0bF9mcmVlX29uZShrY3RsKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAl9Ci0Ja2N0bC5wcml2YXRlX2ZyZWUgPSBzbmRfY3RsX2VsZW1fdXNlcl9mcmVlOwotCV9rY3RsID0gc25kX2N0bF9uZXcoJmtjdGwsIGFjY2Vzcyk7Ci0JaWYgKF9rY3RsID09IE5VTEwpIHsKLQkJa2ZyZWUodWUtPnByaXZfZGF0YSk7Ci0JCWtmcmVlKHVlKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCV9rY3RsLT5wcml2YXRlX2RhdGEgPSB1ZTsKLQlmb3IgKGlkeCA9IDA7IGlkeCA8IF9rY3RsLT5jb3VudDsgaWR4KyspCi0JCV9rY3RsLT52ZFtpZHhdLm93bmVyID0gZmlsZTsKLQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBfa2N0bCk7CisKKwkvKiBTZXQgY2FsbGJhY2sgZnVuY3Rpb25zLiAqLworCWlmIChpbmZvLT50eXBlID09IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRCkKKwkJa2N0bC0+aW5mbyA9IHNuZF9jdGxfZWxlbV91c2VyX2VudW1faW5mbzsKKwllbHNlCisJCWtjdGwtPmluZm8gPSBzbmRfY3RsX2VsZW1fdXNlcl9pbmZvOworCWlmIChhY2Nlc3MgJiBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRCkKKwkJa2N0bC0+Z2V0ID0gc25kX2N0bF9lbGVtX3VzZXJfZ2V0OworCWlmIChhY2Nlc3MgJiBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfV1JJVEUpCisJCWtjdGwtPnB1dCA9IHNuZF9jdGxfZWxlbV91c2VyX3B1dDsKKwlpZiAoYWNjZXNzICYgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEV1JJVEUpCisJCWtjdGwtPnRsdi5jID0gc25kX2N0bF9lbGVtX3VzZXJfdGx2OworCisJLyogVGhpcyBmdW5jdGlvbiBtYW5hZ2UgdG8gZnJlZSB0aGUgaW5zdGFuY2Ugb24gZmFpbHVyZS4gKi8KKwllcnIgPSBzbmRfY3RsX2FkZChjYXJkLCBrY3RsKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKKwlvZmZzZXQgPSBzbmRfY3RsX2dldF9pb2ZmKGtjdGwsICZpbmZvLT5pZCk7CisJc25kX2N0bF9idWlsZF9pb2ZmKCZpbmZvLT5pZCwga2N0bCwgb2Zmc2V0KTsKKwkvKgorCSAqIEhlcmUgd2UgY2Fubm90IGZpbGwgYW55IGZpZWxkIGZvciB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGFkZGVkIGJ5CisJICogdGhpcyBvcGVyYXRpb24gYmVjYXVzZSB0aGVyZSdyZSBubyBzcGVjaWZpYyBmaWVsZHMuIFRoZSB1c2FnZSBvZgorCSAqICdvd25lcicgZmllbGQgZm9yIHRoaXMgcHVycG9zZSBtYXkgY2F1c2UgYW55IGJ1Z3MgdG8gdXNlcnNwYWNlCisJICogYXBwbGljYXRpb25zIGJlY2F1c2UgdGhlIGZpZWxkIG9yaWdpbmFsbHkgbWVhbnMgUElEIG9mIGEgcHJvY2VzcworCSAqIHdoaWNoIGxvY2tzIHRoZSBlbGVtZW50LgorCSAqLwogCiAJZG93bl93cml0ZSgmY2FyZC0+Y29udHJvbHNfcndzZW0pOwogCWNhcmQtPnVzZXJfY3RsX2NvdW50Kys7CkBAIC0xMjc2LDkgKzEzNDQsMTkgQEAKIAkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvIF9fdXNlciAqX2luZm8sIGludCByZXBsYWNlKQogewogCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyBpbmZvOworCWludCBlcnI7CisKIAlpZiAoY29weV9mcm9tX3VzZXIoJmluZm8sIF9pbmZvLCBzaXplb2YoaW5mbykpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlyZXR1cm4gc25kX2N0bF9lbGVtX2FkZChmaWxlLCAmaW5mbywgcmVwbGFjZSk7CisJZXJyID0gc25kX2N0bF9lbGVtX2FkZChmaWxlLCAmaW5mbywgcmVwbGFjZSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJaWYgKGNvcHlfdG9fdXNlcihfaW5mbywgJmluZm8sIHNpemVvZihpbmZvKSkpIHsKKwkJc25kX2N0bF9yZW1vdmVfdXNlcl9jdGwoZmlsZSwgJmluZm8uaWQpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzbmRfY3RsX2VsZW1fcmVtb3ZlKHN0cnVjdCBzbmRfY3RsX2ZpbGUgKmZpbGUsCkBAIC0xMzM4LDkgKzE0MTYsMTIgQEAKIAkJZ290byBfX2tjdGxfZW5kOwogCX0KIAl2ZCA9ICZrY3RsLT52ZFt0bHYubnVtaWQgLSBrY3RsLT5pZC5udW1pZF07Ci0JaWYgKChvcF9mbGFnID09IDAgJiYgKHZkLT5hY2Nlc3MgJiBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQpID09IDApIHx8Ci0JICAgIChvcF9mbGFnID4gMCAmJiAodmQtPmFjY2VzcyAmIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfV1JJVEUpID09IDApIHx8Ci0JICAgIChvcF9mbGFnIDwgMCAmJiAodmQtPmFjY2VzcyAmIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfQ09NTUFORCkgPT0gMCkpIHsKKwlpZiAoKG9wX2ZsYWcgPT0gU05EUlZfQ1RMX1RMVl9PUF9SRUFEICYmCisJICAgICAodmQtPmFjY2VzcyAmIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCkgPT0gMCkgfHwKKwkgICAgKG9wX2ZsYWcgPT0gU05EUlZfQ1RMX1RMVl9PUF9XUklURSAmJgorCSAgICAgKHZkLT5hY2Nlc3MgJiBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1dSSVRFKSA9PSAwKSB8fAorCSAgICAob3BfZmxhZyA9PSBTTkRSVl9DVExfVExWX09QX0NNRCAmJgorCSAgICAgKHZkLT5hY2Nlc3MgJiBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX0NPTU1BTkQpID09IDApKSB7CiAJICAgIAllcnIgPSAtRU5YSU87CiAJICAgIAlnb3RvIF9fa2N0bF9lbmQ7CiAJfQpAQCAtMTM1Nyw3ICsxNDM4LDcgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKG9wX2ZsYWcpIHsKKwkJaWYgKG9wX2ZsYWcgIT0gU05EUlZfQ1RMX1RMVl9PUF9SRUFEKSB7CiAJCQllcnIgPSAtRU5YSU87CiAJCQlnb3RvIF9fa2N0bF9lbmQ7CiAJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvZGV2aWNlLmMgYi9zb3VuZC9jb3JlL2RldmljZS5jCmluZGV4IDQxYmVjMzAuLjg5MTg4MzggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvZGV2aWNlLmMKKysrIGIvc291bmQvY29yZS9kZXZpY2UuYwpAQCAtNTAsMTAgKzUwLDggQEAKIAlpZiAoc25kX0JVR19PTighY2FyZCB8fCAhZGV2aWNlX2RhdGEgfHwgIW9wcykpCiAJCXJldHVybiAtRU5YSU87CiAJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldiksIEdGUF9LRVJORUwpOwotCWlmIChkZXYgPT0gTlVMTCkgewotCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNhbm5vdCBhbGxvY2F0ZSBkZXZpY2UsIHR5cGU9JWRcbiIsIHR5cGUpOworCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+bGlzdCk7CiAJZGV2LT5jYXJkID0gY2FyZDsKIAlkZXYtPnR5cGUgPSB0eXBlOwpAQCAtNzMsNyArNzEsNyBAQAogfQogRVhQT1JUX1NZTUJPTChzbmRfZGV2aWNlX25ldyk7CiAKLXN0YXRpYyBpbnQgX19zbmRfZGV2aWNlX2Rpc2Nvbm5lY3Qoc3RydWN0IHNuZF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIF9fc25kX2RldmljZV9kaXNjb25uZWN0KHN0cnVjdCBzbmRfZGV2aWNlICpkZXYpCiB7CiAJaWYgKGRldi0+c3RhdGUgPT0gU05EUlZfREVWX1JFR0lTVEVSRUQpIHsKIAkJaWYgKGRldi0+b3BzLT5kZXZfZGlzY29ubmVjdCAmJgpAQCAtODEsNyArNzksNiBAQAogCQkJZGV2X2VycihkZXYtPmNhcmQtPmRldiwgImRldmljZSBkaXNjb25uZWN0IGZhaWx1cmVcbiIpOwogCQlkZXYtPnN0YXRlID0gU05EUlZfREVWX0RJU0NPTk5FQ1RFRDsKIAl9Ci0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fc25kX2RldmljZV9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXYpCkBAIC0xMDksNiArMTA2LDM0IEBACiB9CiAKIC8qKgorICogc25kX2RldmljZV9kaXNjb25uZWN0IC0gZGlzY29ubmVjdCB0aGUgZGV2aWNlCisgKiBAY2FyZDogdGhlIGNhcmQgaW5zdGFuY2UKKyAqIEBkZXZpY2VfZGF0YTogdGhlIGRhdGEgcG9pbnRlciB0byBkaXNjb25uZWN0CisgKgorICogVHVybnMgdGhlIGRldmljZSBpbnRvIHRoZSBkaXNjb25uZWN0aW9uIHN0YXRlLCBpbnZva2luZworICogZGV2X2Rpc2Nvbm5lY3QgY2FsbGJhY2ssIGlmIHRoZSBkZXZpY2Ugd2FzIGFscmVhZHkgcmVnaXN0ZXJlZC4KKyAqCisgKiBVc3VhbGx5IGNhbGxlZCBmcm9tIHNuZF9jYXJkX2Rpc2Nvbm5lY3QoKS4KKyAqCisgKiBSZXR1cm46IFplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUgb3IgaWYgdGhlCisgKiBkZXZpY2Ugbm90IGZvdW5kLgorICovCit2b2lkIHNuZF9kZXZpY2VfZGlzY29ubmVjdChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHZvaWQgKmRldmljZV9kYXRhKQoreworCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7CisKKwlpZiAoc25kX0JVR19PTighY2FyZCB8fCAhZGV2aWNlX2RhdGEpKQorCQlyZXR1cm47CisJZGV2ID0gbG9va19mb3JfZGV2KGNhcmQsIGRldmljZV9kYXRhKTsKKwlpZiAoZGV2KQorCQlfX3NuZF9kZXZpY2VfZGlzY29ubmVjdChkZXYpOworCWVsc2UKKwkJZGV2X2RiZyhjYXJkLT5kZXYsICJkZXZpY2UgZGlzY29ubmVjdCAlcCAoZnJvbSAlcEYpLCBub3QgZm91bmRcbiIsCisJCQlkZXZpY2VfZGF0YSwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9kZXZpY2VfZGlzY29ubmVjdCk7CisKKy8qKgogICogc25kX2RldmljZV9mcmVlIC0gcmVsZWFzZSB0aGUgZGV2aWNlIGZyb20gdGhlIGNhcmQKICAqIEBjYXJkOiB0aGUgY2FyZCBpbnN0YW5jZQogICogQGRldmljZV9kYXRhOiB0aGUgZGF0YSBwb2ludGVyIHRvIHJlbGVhc2UKQEAgLTE5NSwxOCArMjIwLDE0IEBACiAgKiBkaXNjb25uZWN0IGFsbCB0aGUgZGV2aWNlcyBvbiB0aGUgY2FyZC4KICAqIGNhbGxlZCBmcm9tIGluaXQuYwogICovCi1pbnQgc25kX2RldmljZV9kaXNjb25uZWN0X2FsbChzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQpCit2b2lkIHNuZF9kZXZpY2VfZGlzY29ubmVjdF9hbGwoc3RydWN0IHNuZF9jYXJkICpjYXJkKQogewogCXN0cnVjdCBzbmRfZGV2aWNlICpkZXY7Ci0JaW50IGVyciA9IDA7CiAKIAlpZiAoc25kX0JVR19PTighY2FyZCkpCi0JCXJldHVybiAtRU5YSU87Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpIHsKLQkJaWYgKF9fc25kX2RldmljZV9kaXNjb25uZWN0KGRldikgPCAwKQotCQkJZXJyID0gLUVOWElPOwotCX0KLQlyZXR1cm4gZXJyOworCQlyZXR1cm47CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGRldiwgJmNhcmQtPmRldmljZXMsIGxpc3QpCisJCV9fc25kX2RldmljZV9kaXNjb25uZWN0KGRldik7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2h3ZGVwLmMgYi9zb3VuZC9jb3JlL2h3ZGVwLmMKaW5kZXggODQyNDRhNS4uNTE2OTJjOCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9od2RlcC5jCisrKyBiL3NvdW5kL2NvcmUvaHdkZXAuYwpAQCAtMzc4LDEwICszNzgsOCBAQAogCWlmIChyaHdkZXApCiAJCSpyaHdkZXAgPSBOVUxMOwogCWh3ZGVwID0ga3phbGxvYyhzaXplb2YoKmh3ZGVwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGh3ZGVwID09IE5VTEwpIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsICJod2RlcDogY2Fubm90IGFsbG9jYXRlXG4iKTsKKwlpZiAoIWh3ZGVwKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZod2RlcC0+b3Blbl93YWl0KTsKIAltdXRleF9pbml0KCZod2RlcC0+b3Blbl9tdXRleCk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL2luaXQuYyBiL3NvdW5kL2NvcmUvaW5pdC5jCmluZGV4IDM1NDE5MDUuLjA0NzM0ZTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvaW5pdC5jCisrKyBiL3NvdW5kL2NvcmUvaW5pdC5jCkBAIC00MDAsNyArNDAwLDYgQEAKIGludCBzbmRfY2FyZF9kaXNjb25uZWN0KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCkKIHsKIAlzdHJ1Y3Qgc25kX21vbml0b3JfZmlsZSAqbWZpbGU7Ci0JaW50IGVycjsKIAogCWlmICghY2FyZCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00NDUsOSArNDQ0LDcgQEAKICNlbmRpZgogCiAJLyogbm90aWZ5IGFsbCBkZXZpY2VzIHRoYXQgd2UgYXJlIGRpc2Nvbm5lY3RlZCAqLwotCWVyciA9IHNuZF9kZXZpY2VfZGlzY29ubmVjdF9hbGwoY2FyZCk7Ci0JaWYgKGVyciA8IDApCi0JCWRldl9lcnIoY2FyZC0+ZGV2LCAibm90IGFsbCBkZXZpY2VzIGZvciBjYXJkICVpIGNhbiBiZSBkaXNjb25uZWN0ZWRcbiIsIGNhcmQtPm51bWJlcik7CisJc25kX2RldmljZV9kaXNjb25uZWN0X2FsbChjYXJkKTsKIAogCXNuZF9pbmZvX2NhcmRfZGlzY29ubmVjdChjYXJkKTsKIAlpZiAoY2FyZC0+cmVnaXN0ZXJlZCkgewpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9vc3MvbWl4ZXJfb3NzLmMgYi9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYwppbmRleCA1ZTYzNDlmLi4wNTZmOGUyIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYworKysgYi9zb3VuZC9jb3JlL29zcy9taXhlcl9vc3MuYwpAQCAtMTIxMiwxMCArMTIxMiw4IEBACiAJCQkvKiBub3QgY2hhbmdlZCAqLwogCQkJZ290byBfX3VubG9jazsKIAkJdGJsID0ga21hbGxvYyhzaXplb2YoKnRibCksIEdGUF9LRVJORUwpOwotCQlpZiAoISB0YmwpIHsKLQkJCXByX2VycigiQUxTQTogbWl4ZXJfb3NzOiBubyBtZW1vcnlcbiIpOworCQlpZiAoIXRibCkKIAkJCWdvdG8gX191bmxvY2s7Ci0JCX0KIAkJdGJsLT5vc3NfaWQgPSBjaDsKIAkJdGJsLT5uYW1lID0ga3N0cmR1cChzdHIsIEdGUF9LRVJORUwpOwogCQlpZiAoISB0YmwtPm5hbWUpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYyBiL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYwppbmRleCA4MDQyM2E0Yy4uNTg1NTBjYyAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9vc3MvcGNtX29zcy5jCisrKyBiL3NvdW5kL2NvcmUvb3NzL3BjbV9vc3MuYwpAQCAtODU0LDcgKzg1NCw2IEBACiAJcGFyYW1zID0ga21hbGxvYyhzaXplb2YoKnBhcmFtcyksIEdGUF9LRVJORUwpOwogCXNwYXJhbXMgPSBrbWFsbG9jKHNpemVvZigqc3BhcmFtcyksIEdGUF9LRVJORUwpOwogCWlmICghc3dfcGFyYW1zIHx8ICFwYXJhbXMgfHwgIXNwYXJhbXMpIHsKLQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwgIk5vIG1lbW9yeVxuIik7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbHVyZTsKIAl9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbS5jIGIvc291bmQvY29yZS9wY20uYwppbmRleCAwMzQ1ZTUzLi5iMjViY2Y1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbS5jCisrKyBiL3NvdW5kL2NvcmUvcGNtLmMKQEAgLTQ5LDggKzQ5LDYgQEAKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwY20sICZzbmRfcGNtX2RldmljZXMsIGxpc3QpIHsKLQkJaWYgKHBjbS0+aW50ZXJuYWwpCi0JCQljb250aW51ZTsKIAkJaWYgKHBjbS0+Y2FyZCA9PSBjYXJkICYmIHBjbS0+ZGV2aWNlID09IGRldmljZSkKIAkJCXJldHVybiBwY207CiAJfQpAQCAtNjIsOCArNjAsNiBAQAogCXN0cnVjdCBzbmRfcGNtICpwY207CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjbSwgJnNuZF9wY21fZGV2aWNlcywgbGlzdCkgewotCQlpZiAocGNtLT5pbnRlcm5hbCkKLQkJCWNvbnRpbnVlOwogCQlpZiAocGNtLT5jYXJkID09IGNhcmQgJiYgcGNtLT5kZXZpY2UgPiBkZXZpY2UpCiAJCQlyZXR1cm4gcGNtLT5kZXZpY2U7CiAJCWVsc2UgaWYgKHBjbS0+Y2FyZC0+bnVtYmVyID4gY2FyZC0+bnVtYmVyKQpAQCAtNzYsNiArNzIsOSBAQAogewogCXN0cnVjdCBzbmRfcGNtICpwY207CiAKKwlpZiAobmV3cGNtLT5pbnRlcm5hbCkKKwkJcmV0dXJuIDA7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjbSwgJnNuZF9wY21fZGV2aWNlcywgbGlzdCkgewogCQlpZiAocGNtLT5jYXJkID09IG5ld3BjbS0+Y2FyZCAmJiBwY20tPmRldmljZSA9PSBuZXdwY20tPmRldmljZSkKIAkJCXJldHVybiAtRUJVU1k7CkBAIC0zNDQsMTEgKzM0Myw4IEBACiAJCXJldHVybjsKIAogCWluZm8gPSBrbWFsbG9jKHNpemVvZigqaW5mbyksIEdGUF9LRVJORUwpOwotCWlmICghIGluZm8pIHsKLQkJcGNtX2RiZyhzdWJzdHJlYW0tPnBjbSwKLQkJCSJzbmRfcGNtX3Byb2NfaW5mb19yZWFkOiBjYW5ub3QgbWFsbG9jXG4iKTsKKwlpZiAoIWluZm8pCiAJCXJldHVybjsKLQl9CiAKIAllcnIgPSBzbmRfcGNtX2luZm8oc3Vic3RyZWFtLCBpbmZvKTsKIAlpZiAoZXJyIDwgMCkgewpAQCAtNzE4LDEwICs3MTQsOCBAQAogCXByZXYgPSBOVUxMOwogCWZvciAoaWR4ID0gMCwgcHJldiA9IE5VTEw7IGlkeCA8IHN1YnN0cmVhbV9jb3VudDsgaWR4KyspIHsKIAkJc3Vic3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN1YnN0cmVhbSksIEdGUF9LRVJORUwpOwotCQlpZiAoc3Vic3RyZWFtID09IE5VTEwpIHsKLQkJCXBjbV9lcnIocGNtLCAiQ2Fubm90IGFsbG9jYXRlIFBDTSBzdWJzdHJlYW1cbiIpOworCQlpZiAoIXN1YnN0cmVhbSkKIAkJCXJldHVybiAtRU5PTUVNOwotCQl9CiAJCXN1YnN0cmVhbS0+cGNtID0gcGNtOwogCQlzdWJzdHJlYW0tPnBzdHIgPSBwc3RyOwogCQlzdWJzdHJlYW0tPm51bWJlciA9IGlkeDsKQEAgLTc3NSwxMyArNzY5LDE0IEBACiAJaWYgKHJwY20pCiAJCSpycGNtID0gTlVMTDsKIAlwY20gPSBremFsbG9jKHNpemVvZigqcGNtKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBjbSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIFBDTVxuIik7CisJaWYgKCFwY20pCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAlwY20tPmNhcmQgPSBjYXJkOwogCXBjbS0+ZGV2aWNlID0gZGV2aWNlOwogCXBjbS0+aW50ZXJuYWwgPSBpbnRlcm5hbDsKKwltdXRleF9pbml0KCZwY20tPm9wZW5fbXV0ZXgpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBjbS0+b3Blbl93YWl0KTsKKwlJTklUX0xJU1RfSEVBRCgmcGNtLT5saXN0KTsKIAlpZiAoaWQpCiAJCXN0cmxjcHkocGNtLT5pZCwgaWQsIHNpemVvZihwY20tPmlkKSk7CiAJaWYgKChlcnIgPSBzbmRfcGNtX25ld19zdHJlYW0ocGNtLCBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLLCBwbGF5YmFja19jb3VudCkpIDwgMCkgewpAQCAtNzkyLDggKzc4Nyw2IEBACiAJCXNuZF9wY21fZnJlZShwY20pOwogCQlyZXR1cm4gZXJyOwogCX0KLQltdXRleF9pbml0KCZwY20tPm9wZW5fbXV0ZXgpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBjbS0+b3Blbl93YWl0KTsKIAlpZiAoKGVyciA9IHNuZF9kZXZpY2VfbmV3KGNhcmQsIFNORFJWX0RFVl9QQ00sIHBjbSwgJm9wcykpIDwgMCkgewogCQlzbmRfcGNtX2ZyZWUocGNtKTsKIAkJcmV0dXJuIGVycjsKQEAgLTg4OCw4ICs4ODEsOSBAQAogCiAJaWYgKCFwY20pCiAJCXJldHVybiAwOwotCWxpc3RfZm9yX2VhY2hfZW50cnkobm90aWZ5LCAmc25kX3BjbV9ub3RpZnlfbGlzdCwgbGlzdCkgewotCQlub3RpZnktPm5fdW5yZWdpc3RlcihwY20pOworCWlmICghcGNtLT5pbnRlcm5hbCkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vdGlmeSwgJnNuZF9wY21fbm90aWZ5X2xpc3QsIGxpc3QpCisJCQlub3RpZnktPm5fdW5yZWdpc3RlcihwY20pOwogCX0KIAlpZiAocGNtLT5wcml2YXRlX2ZyZWUpCiAJCXBjbS0+cHJpdmF0ZV9mcmVlKHBjbSk7CkBAIC05MTksNiArOTEzLDkgQEAKIAogCWlmIChzbmRfQlVHX09OKCFwY20gfHwgIXJzdWJzdHJlYW0pKQogCQlyZXR1cm4gLUVOWElPOworCWlmIChzbmRfQlVHX09OKHN0cmVhbSAhPSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLICYmCisJCSAgICAgICBzdHJlYW0gIT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAJKnJzdWJzdHJlYW0gPSBOVUxMOwogCXBzdHIgPSAmcGNtLT5zdHJlYW1zW3N0cmVhbV07CiAJaWYgKHBzdHItPnN1YnN0cmVhbSA9PSBOVUxMIHx8IHBzdHItPnN1YnN0cmVhbV9jb3VudCA9PSAwKQpAQCAtOTI3LDI1ICs5MjQsMTQgQEAKIAljYXJkID0gcGNtLT5jYXJkOwogCXByZWZlcl9zdWJkZXZpY2UgPSBzbmRfY3RsX2dldF9wcmVmZXJyZWRfc3ViZGV2aWNlKGNhcmQsIFNORF9DVExfU1VCREVWX1BDTSk7CiAKLQlzd2l0Y2ggKHN0cmVhbSkgewotCWNhc2UgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzoKLQkJaWYgKHBjbS0+aW5mb19mbGFncyAmIFNORFJWX1BDTV9JTkZPX0hBTEZfRFVQTEVYKSB7Ci0JCQlmb3IgKHN1YnN0cmVhbSA9IHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbTsgc3Vic3RyZWFtOyBzdWJzdHJlYW0gPSBzdWJzdHJlYW0tPm5leHQpIHsKLQkJCQlpZiAoU1VCU1RSRUFNX0JVU1koc3Vic3RyZWFtKSkKLQkJCQkJcmV0dXJuIC1FQUdBSU47Ci0JCQl9CisJaWYgKHBjbS0+aW5mb19mbGFncyAmIFNORFJWX1BDTV9JTkZPX0hBTEZfRFVQTEVYKSB7CisJCWludCBvcHBvc2l0ZSA9ICFzdHJlYW07CisKKwkJZm9yIChzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbb3Bwb3NpdGVdLnN1YnN0cmVhbTsgc3Vic3RyZWFtOworCQkgICAgIHN1YnN0cmVhbSA9IHN1YnN0cmVhbS0+bmV4dCkgeworCQkJaWYgKFNVQlNUUkVBTV9CVVNZKHN1YnN0cmVhbSkpCisJCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkU6Ci0JCWlmIChwY20tPmluZm9fZmxhZ3MgJiBTTkRSVl9QQ01fSU5GT19IQUxGX0RVUExFWCkgewotCQkJZm9yIChzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOyBzdWJzdHJlYW07IHN1YnN0cmVhbSA9IHN1YnN0cmVhbS0+bmV4dCkgewotCQkJCWlmIChTVUJTVFJFQU1fQlVTWShzdWJzdHJlYW0pKQotCQkJCQlyZXR1cm4gLUVBR0FJTjsKLQkJCX0KLQkJfQotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fQVBQRU5EKSB7CkBAIC05NjgsMTUgKzk1NCwxMiBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAocHJlZmVyX3N1YmRldmljZSA+PSAwKSB7Ci0JCWZvciAoc3Vic3RyZWFtID0gcHN0ci0+c3Vic3RyZWFtOyBzdWJzdHJlYW07IHN1YnN0cmVhbSA9IHN1YnN0cmVhbS0+bmV4dCkKLQkJCWlmICghU1VCU1RSRUFNX0JVU1koc3Vic3RyZWFtKSAmJiBzdWJzdHJlYW0tPm51bWJlciA9PSBwcmVmZXJfc3ViZGV2aWNlKQotCQkJCWdvdG8gX19vazsKLQl9Ci0JZm9yIChzdWJzdHJlYW0gPSBwc3RyLT5zdWJzdHJlYW07IHN1YnN0cmVhbTsgc3Vic3RyZWFtID0gc3Vic3RyZWFtLT5uZXh0KQotCQlpZiAoIVNVQlNUUkVBTV9CVVNZKHN1YnN0cmVhbSkpCisJZm9yIChzdWJzdHJlYW0gPSBwc3RyLT5zdWJzdHJlYW07IHN1YnN0cmVhbTsgc3Vic3RyZWFtID0gc3Vic3RyZWFtLT5uZXh0KSB7CisJCWlmICghU1VCU1RSRUFNX0JVU1koc3Vic3RyZWFtKSAmJgorCQkgICAgKHByZWZlcl9zdWJkZXZpY2UgPT0gLTEgfHwKKwkJICAgICBzdWJzdHJlYW0tPm51bWJlciA9PSBwcmVmZXJfc3ViZGV2aWNlKSkKIAkJCWJyZWFrOwotICAgICAgX19vazoKKwl9CiAJaWYgKHN1YnN0cmVhbSA9PSBOVUxMKQogCQlyZXR1cm4gLUVBR0FJTjsKIApAQCAtMTA4NiwxNSArMTA2OSwxNiBAQAogCWlmIChzbmRfQlVHX09OKCFkZXZpY2UgfHwgIWRldmljZS0+ZGV2aWNlX2RhdGEpKQogCQlyZXR1cm4gLUVOWElPOwogCXBjbSA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisJaWYgKHBjbS0+aW50ZXJuYWwpCisJCXJldHVybiAwOworCiAJbXV0ZXhfbG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwogCWVyciA9IHNuZF9wY21fYWRkKHBjbSk7Ci0JaWYgKGVycikgewotCQltdXRleF91bmxvY2soJnJlZ2lzdGVyX211dGV4KTsKLQkJcmV0dXJuIGVycjsKLQl9CisJaWYgKGVycikKKwkJZ290byB1bmxvY2s7CiAJZm9yIChjaWR4ID0gMDsgY2lkeCA8IDI7IGNpZHgrKykgewogCQlpbnQgZGV2dHlwZSA9IC0xOwotCQlpZiAocGNtLT5zdHJlYW1zW2NpZHhdLnN1YnN0cmVhbSA9PSBOVUxMIHx8IHBjbS0+aW50ZXJuYWwpCisJCWlmIChwY20tPnN0cmVhbXNbY2lkeF0uc3Vic3RyZWFtID09IE5VTEwpCiAJCQljb250aW51ZTsKIAkJc3dpdGNoIChjaWR4KSB7CiAJCWNhc2UgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSzoKQEAgLTExMDksOSArMTA5Myw4IEBACiAJCQkJCSAgJnNuZF9wY21fZl9vcHNbY2lkeF0sIHBjbSwKIAkJCQkJICAmcGNtLT5zdHJlYW1zW2NpZHhdLmRldik7CiAJCWlmIChlcnIgPCAwKSB7Ci0JCQlsaXN0X2RlbCgmcGNtLT5saXN0KTsKLQkJCW11dGV4X3VubG9jaygmcmVnaXN0ZXJfbXV0ZXgpOwotCQkJcmV0dXJuIGVycjsKKwkJCWxpc3RfZGVsX2luaXQoJnBjbS0+bGlzdCk7CisJCQlnb3RvIHVubG9jazsKIAkJfQogCiAJCWZvciAoc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW2NpZHhdLnN1YnN0cmVhbTsgc3Vic3RyZWFtOyBzdWJzdHJlYW0gPSBzdWJzdHJlYW0tPm5leHQpCkBAIC0xMTIxLDggKzExMDQsOSBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnkobm90aWZ5LCAmc25kX3BjbV9ub3RpZnlfbGlzdCwgbGlzdCkKIAkJbm90aWZ5LT5uX3JlZ2lzdGVyKHBjbSk7CiAKKyB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBzbmRfcGNtX2Rldl9kaXNjb25uZWN0KHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCkBAIC0xMTMzLDEzICsxMTE3LDEwIEBACiAJaW50IGNpZHg7CiAKIAltdXRleF9sb2NrKCZyZWdpc3Rlcl9tdXRleCk7Ci0JaWYgKGxpc3RfZW1wdHkoJnBjbS0+bGlzdCkpCi0JCWdvdG8gdW5sb2NrOwotCiAJbXV0ZXhfbG9jaygmcGNtLT5vcGVuX211dGV4KTsKIAl3YWtlX3VwKCZwY20tPm9wZW5fd2FpdCk7CiAJbGlzdF9kZWxfaW5pdCgmcGNtLT5saXN0KTsKLQlmb3IgKGNpZHggPSAwOyBjaWR4IDwgMjsgY2lkeCsrKQorCWZvciAoY2lkeCA9IDA7IGNpZHggPCAyOyBjaWR4KyspIHsKIAkJZm9yIChzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbY2lkeF0uc3Vic3RyZWFtOyBzdWJzdHJlYW07IHN1YnN0cmVhbSA9IHN1YnN0cmVhbS0+bmV4dCkgewogCQkJc25kX3BjbV9zdHJlYW1fbG9ja19pcnEoc3Vic3RyZWFtKTsKIAkJCWlmIChzdWJzdHJlYW0tPnJ1bnRpbWUpIHsKQEAgLTExNDksMTggKzExMzAsMjAgQEAKIAkJCX0KIAkJCXNuZF9wY21fc3RyZWFtX3VubG9ja19pcnEoc3Vic3RyZWFtKTsKIAkJfQotCWxpc3RfZm9yX2VhY2hfZW50cnkobm90aWZ5LCAmc25kX3BjbV9ub3RpZnlfbGlzdCwgbGlzdCkgewotCQlub3RpZnktPm5fZGlzY29ubmVjdChwY20pOworCX0KKwlpZiAoIXBjbS0+aW50ZXJuYWwpIHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShub3RpZnksICZzbmRfcGNtX25vdGlmeV9saXN0LCBsaXN0KQorCQkJbm90aWZ5LT5uX2Rpc2Nvbm5lY3QocGNtKTsKIAl9CiAJZm9yIChjaWR4ID0gMDsgY2lkeCA8IDI7IGNpZHgrKykgewotCQlzbmRfdW5yZWdpc3Rlcl9kZXZpY2UoJnBjbS0+c3RyZWFtc1tjaWR4XS5kZXYpOworCQlpZiAoIXBjbS0+aW50ZXJuYWwpCisJCQlzbmRfdW5yZWdpc3Rlcl9kZXZpY2UoJnBjbS0+c3RyZWFtc1tjaWR4XS5kZXYpOwogCQlpZiAocGNtLT5zdHJlYW1zW2NpZHhdLmNobWFwX2tjdGwpIHsKIAkJCXNuZF9jdGxfcmVtb3ZlKHBjbS0+Y2FyZCwgcGNtLT5zdHJlYW1zW2NpZHhdLmNobWFwX2tjdGwpOwogCQkJcGNtLT5zdHJlYW1zW2NpZHhdLmNobWFwX2tjdGwgPSBOVUxMOwogCQl9CiAJfQogCW11dGV4X3VubG9jaygmcGNtLT5vcGVuX211dGV4KTsKLSB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZyZWdpc3Rlcl9tdXRleCk7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3BjbV9jb21wYXQuYyBiL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jCmluZGV4IDJkOTU3YmEuLmI0OGI0MzQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jCisrKyBiL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jCkBAIC0xOTQsMTggKzE5NCwzMCBAQAogCXUzMiBhdmFpbF9tYXg7CiAJdTMyIG92ZXJyYW5nZTsKIAlzMzIgc3VzcGVuZGVkX3N0YXRlOwotCXUzMiByZXNlcnZlZF9hbGlnbm1lbnQ7CisJdTMyIGF1ZGlvX3RzdGFtcF9kYXRhOwogCXN0cnVjdCBjb21wYXRfdGltZXNwZWMgYXVkaW9fdHN0YW1wOwotCXVuc2lnbmVkIGNoYXIgcmVzZXJ2ZWRbNTYtc2l6ZW9mKHN0cnVjdCBjb21wYXRfdGltZXNwZWMpXTsKKwlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjIGRyaXZlcl90c3RhbXA7CisJdTMyIGF1ZGlvX3RzdGFtcF9hY2N1cmFjeTsKKwl1bnNpZ25lZCBjaGFyIHJlc2VydmVkWzUyLTIqc2l6ZW9mKHN0cnVjdCBjb21wYXRfdGltZXNwZWMpXTsKIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKIAogc3RhdGljIGludCBzbmRfcGNtX3N0YXR1c191c2VyX2NvbXBhdChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdGF0dXMzMiBfX3VzZXIgKnNyYykKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9zdGF0dXMzMiBfX3VzZXIgKnNyYywKKwkJCQkgICAgICBib29sIGV4dCkKIHsKIAlzdHJ1Y3Qgc25kX3BjbV9zdGF0dXMgc3RhdHVzOwogCWludCBlcnI7CiAKKwltZW1zZXQoJnN0YXR1cywgMCwgc2l6ZW9mKHN0YXR1cykpOworCS8qCisJICogd2l0aCBleHRlbnNpb24sIHBhcmFtZXRlcnMgYXJlIHJlYWQvd3JpdGUsCisJICogZ2V0IGF1ZGlvX3RzdGFtcF9kYXRhIGZyb20gdXNlciwKKwkgKiBpZ25vcmUgcmVzdCBvZiBzdGF0dXMgc3RydWN0dXJlCisJICovCisJaWYgKGV4dCAmJiBnZXRfdXNlcihzdGF0dXMuYXVkaW9fdHN0YW1wX2RhdGEsCisJCQkJKHUzMiBfX3VzZXIgKikoJnNyYy0+YXVkaW9fdHN0YW1wX2RhdGEpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CiAJZXJyID0gc25kX3BjbV9zdGF0dXMoc3Vic3RyZWFtLCAmc3RhdHVzKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKQEAgLTIyMiw3ICsyMzQsMTAgQEAKIAkgICAgcHV0X3VzZXIoc3RhdHVzLmF2YWlsX21heCwgJnNyYy0+YXZhaWxfbWF4KSB8fAogCSAgICBwdXRfdXNlcihzdGF0dXMub3ZlcnJhbmdlLCAmc3JjLT5vdmVycmFuZ2UpIHx8CiAJICAgIHB1dF91c2VyKHN0YXR1cy5zdXNwZW5kZWRfc3RhdGUsICZzcmMtPnN1c3BlbmRlZF9zdGF0ZSkgfHwKLQkgICAgY29tcGF0X3B1dF90aW1lc3BlYygmc3RhdHVzLmF1ZGlvX3RzdGFtcCwgJnNyYy0+YXVkaW9fdHN0YW1wKSkKKwkgICAgcHV0X3VzZXIoc3RhdHVzLmF1ZGlvX3RzdGFtcF9kYXRhLCAmc3JjLT5hdWRpb190c3RhbXBfZGF0YSkgfHwKKwkgICAgY29tcGF0X3B1dF90aW1lc3BlYygmc3RhdHVzLmF1ZGlvX3RzdGFtcCwgJnNyYy0+YXVkaW9fdHN0YW1wKSB8fAorCSAgICBjb21wYXRfcHV0X3RpbWVzcGVjKCZzdGF0dXMuZHJpdmVyX3RzdGFtcCwgJnNyYy0+ZHJpdmVyX3RzdGFtcCkgfHwKKwkgICAgcHV0X3VzZXIoc3RhdHVzLmF1ZGlvX3RzdGFtcF9hY2N1cmFjeSwgJnNyYy0+YXVkaW9fdHN0YW1wX2FjY3VyYWN5KSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlyZXR1cm4gZXJyOwpAQCAtNDU3LDYgKzQ3Miw3IEBACiAJU05EUlZfUENNX0lPQ1RMX0hXX1BBUkFNUzMyID0gX0lPV1IoJ0EnLCAweDExLCBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMzMiksCiAJU05EUlZfUENNX0lPQ1RMX1NXX1BBUkFNUzMyID0gX0lPV1IoJ0EnLCAweDEzLCBzdHJ1Y3Qgc25kX3BjbV9zd19wYXJhbXMzMiksCiAJU05EUlZfUENNX0lPQ1RMX1NUQVRVUzMyID0gX0lPUignQScsIDB4MjAsIHN0cnVjdCBzbmRfcGNtX3N0YXR1czMyKSwKKwlTTkRSVl9QQ01fSU9DVExfU1RBVFVTX0VYVDMyID0gX0lPV1IoJ0EnLCAweDI0LCBzdHJ1Y3Qgc25kX3BjbV9zdGF0dXMzMiksCiAJU05EUlZfUENNX0lPQ1RMX0RFTEFZMzIgPSBfSU9SKCdBJywgMHgyMSwgczMyKSwKIAlTTkRSVl9QQ01fSU9DVExfQ0hBTk5FTF9JTkZPMzIgPSBfSU9SKCdBJywgMHgzMiwgc3RydWN0IHNuZF9wY21fY2hhbm5lbF9pbmZvMzIpLAogCVNORFJWX1BDTV9JT0NUTF9SRVdJTkQzMiA9IF9JT1coJ0EnLCAweDQ2LCB1MzIpLApAQCAtNTE3LDcgKzUzMyw5IEBACiAJY2FzZSBTTkRSVl9QQ01fSU9DVExfU1dfUEFSQU1TMzI6CiAJCXJldHVybiBzbmRfcGNtX2lvY3RsX3N3X3BhcmFtc19jb21wYXQoc3Vic3RyZWFtLCBhcmdwKTsKIAljYXNlIFNORFJWX1BDTV9JT0NUTF9TVEFUVVMzMjoKLQkJcmV0dXJuIHNuZF9wY21fc3RhdHVzX3VzZXJfY29tcGF0KHN1YnN0cmVhbSwgYXJncCk7CisJCXJldHVybiBzbmRfcGNtX3N0YXR1c191c2VyX2NvbXBhdChzdWJzdHJlYW0sIGFyZ3AsIGZhbHNlKTsKKwljYXNlIFNORFJWX1BDTV9JT0NUTF9TVEFUVVNfRVhUMzI6CisJCXJldHVybiBzbmRfcGNtX3N0YXR1c191c2VyX2NvbXBhdChzdWJzdHJlYW0sIGFyZ3AsIHRydWUpOwogCWNhc2UgU05EUlZfUENNX0lPQ1RMX1NZTkNfUFRSMzI6CiAJCXJldHVybiBzbmRfcGNtX2lvY3RsX3N5bmNfcHRyX2NvbXBhdChzdWJzdHJlYW0sIGFyZ3ApOwogCWNhc2UgU05EUlZfUENNX0lPQ1RMX0NIQU5ORUxfSU5GTzMyOgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fZG1hZW5naW5lLmMgYi9zb3VuZC9jb3JlL3BjbV9kbWFlbmdpbmUuYwppbmRleCA2NTQyYzQwLi5mYmEzNjVhIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9kbWFlbmdpbmUuYworKysgYi9zb3VuZC9jb3JlL3BjbV9kbWFlbmdpbmUuYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAgKgogICogVGhlIGZ1bmN0aW9uIHNob3VsZCB1c3VhbGx5IGJlIGNhbGxlZCBmcm9tIHRoZSBwY20gb3BlbiBjYWxsYmFjay4gTm90ZSB0aGF0CiAgKiB0aGlzIGZ1bmN0aW9uIHdpbGwgdXNlIHByaXZhdGVfZGF0YSBmaWVsZCBvZiB0aGUgc3Vic3RyZWFtJ3MgcnVudGltZS4gU28gaXQKLSAqIGlzIG5vdCBhdmFpbGFiZSB0byB5b3VyIHBjbSBkcml2ZXIgaW1wbGVtZW50YXRpb24uCisgKiBpcyBub3QgYXZhaWxhYmxlIHRvIHlvdXIgcGNtIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4KICAqLwogaW50IHNuZF9kbWFlbmdpbmVfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJc3RydWN0IGRtYV9jaGFuICpjaGFuKQpAQCAtMzI4LDcgKzMyOCw3IEBACiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVxdWVzdCBhIERNQSBjaGFubmVsIHVzaW5nIHRoZSBwYXNzZWQgZmlsdGVyIGZ1bmN0aW9uIGFuZAogICogZGF0YS4gVGhlIGZ1bmN0aW9uIHNob3VsZCB1c3VhbGx5IGJlIGNhbGxlZCBmcm9tIHRoZSBwY20gb3BlbiBjYWxsYmFjay4gTm90ZQogICogdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgdXNlIHByaXZhdGVfZGF0YSBmaWVsZCBvZiB0aGUgc3Vic3RyZWFtJ3MgcnVudGltZS4gU28KLSAqIGl0IGlzIG5vdCBhdmFpbGFiZSB0byB5b3VyIHBjbSBkcml2ZXIgaW1wbGVtZW50YXRpb24uCisgKiBpdCBpcyBub3QgYXZhaWxhYmxlIHRvIHlvdXIgcGNtIGRyaXZlciBpbXBsZW1lbnRhdGlvbi4KICAqLwogaW50IHNuZF9kbWFlbmdpbmVfcGNtX29wZW5fcmVxdWVzdF9jaGFuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCWRtYV9maWx0ZXJfZm4gZmlsdGVyX2ZuLCB2b2lkICpmaWx0ZXJfZGF0YSkKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX2xpYi5jIGIvc291bmQvY29yZS9wY21fbGliLmMKaW5kZXggZmZkNjU2MC4uYWM2YjMzZiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fbGliLmMKKysrIGIvc291bmQvY29yZS9wY21fbGliLmMKQEAgLTIzMiw2ICsyMzIsNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgdXBkYXRlX2F1ZGlvX3RzdGFtcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3QgdGltZXNwZWMgKmN1cnJfdHN0YW1wLAorCQkJCXN0cnVjdCB0aW1lc3BlYyAqYXVkaW9fdHN0YW1wKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJdTY0IGF1ZGlvX2ZyYW1lcywgYXVkaW9fbnNlY3M7CisJc3RydWN0IHRpbWVzcGVjIGRyaXZlcl90c3RhbXA7CisKKwlpZiAocnVudGltZS0+dHN0YW1wX21vZGUgIT0gU05EUlZfUENNX1RTVEFNUF9FTkFCTEUpCisJCXJldHVybjsKKworCWlmICghKHN1YnN0cmVhbS0+b3BzLT5nZXRfdGltZV9pbmZvKSB8fAorCQkocnVudGltZS0+YXVkaW9fdHN0YW1wX3JlcG9ydC5hY3R1YWxfdHlwZSA9PQorCQkJU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0RFRkFVTFQpKSB7CisKKwkJLyoKKwkJICogcHJvdmlkZSBhdWRpbyB0aW1lc3RhbXAgZGVyaXZlZCBmcm9tIHBvaW50ZXIgcG9zaXRpb24KKwkJICogYWRkIGRlbGF5IG9ubHkgaWYgcmVxdWVzdGVkCisJCSAqLworCisJCWF1ZGlvX2ZyYW1lcyA9IHJ1bnRpbWUtPmh3X3B0cl93cmFwICsgcnVudGltZS0+c3RhdHVzLT5od19wdHI7CisKKwkJaWYgKHJ1bnRpbWUtPmF1ZGlvX3RzdGFtcF9jb25maWcucmVwb3J0X2RlbGF5KSB7CisJCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJCQlhdWRpb19mcmFtZXMgLT0gIHJ1bnRpbWUtPmRlbGF5OworCQkJZWxzZQorCQkJCWF1ZGlvX2ZyYW1lcyArPSAgcnVudGltZS0+ZGVsYXk7CisJCX0KKwkJYXVkaW9fbnNlY3MgPSBkaXZfdTY0KGF1ZGlvX2ZyYW1lcyAqIDEwMDAwMDAwMDBMTCwKKwkJCQlydW50aW1lLT5yYXRlKTsKKwkJKmF1ZGlvX3RzdGFtcCA9IG5zX3RvX3RpbWVzcGVjKGF1ZGlvX25zZWNzKTsKKwl9CisJcnVudGltZS0+c3RhdHVzLT5hdWRpb190c3RhbXAgPSAqYXVkaW9fdHN0YW1wOworCXJ1bnRpbWUtPnN0YXR1cy0+dHN0YW1wID0gKmN1cnJfdHN0YW1wOworCisJLyoKKwkgKiByZS10YWtlIGEgZHJpdmVyIHRpbWVzdGFtcCB0byBsZXQgYXBwcyBkZXRlY3QgaWYgdGhlIHJlZmVyZW5jZSB0c3RhbXAKKwkgKiByZWFkIGJ5IGxvdy1sZXZlbCBoYXJkd2FyZSB3YXMgcHJvdmlkZWQgd2l0aCBhIGRlbGF5CisJICovCisJc25kX3BjbV9nZXR0aW1lKHN1YnN0cmVhbS0+cnVudGltZSwgKHN0cnVjdCB0aW1lc3BlYyAqKSZkcml2ZXJfdHN0YW1wKTsKKwlydW50aW1lLT5kcml2ZXJfdHN0YW1wID0gZHJpdmVyX3RzdGFtcDsKK30KKwogc3RhdGljIGludCBzbmRfcGNtX3VwZGF0ZV9od19wdHIwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQkJCSAgdW5zaWduZWQgaW50IGluX2ludGVycnVwdCkKIHsKQEAgLTI1NiwxMSArMjk5LDE4IEBACiAJcG9zID0gc3Vic3RyZWFtLT5vcHMtPnBvaW50ZXIoc3Vic3RyZWFtKTsKIAljdXJyX2ppZmZpZXMgPSBqaWZmaWVzOwogCWlmIChydW50aW1lLT50c3RhbXBfbW9kZSA9PSBTTkRSVl9QQ01fVFNUQU1QX0VOQUJMRSkgewotCQlzbmRfcGNtX2dldHRpbWUocnVudGltZSwgKHN0cnVjdCB0aW1lc3BlYyAqKSZjdXJyX3RzdGFtcCk7CisJCWlmICgoc3Vic3RyZWFtLT5vcHMtPmdldF90aW1lX2luZm8pICYmCisJCQkocnVudGltZS0+YXVkaW9fdHN0YW1wX2NvbmZpZy50eXBlX3JlcXVlc3RlZCAhPSBTTkRSVl9QQ01fQVVESU9fVFNUQU1QX1RZUEVfREVGQVVMVCkpIHsKKwkJCXN1YnN0cmVhbS0+b3BzLT5nZXRfdGltZV9pbmZvKHN1YnN0cmVhbSwgJmN1cnJfdHN0YW1wLAorCQkJCQkJJmF1ZGlvX3RzdGFtcCwKKwkJCQkJCSZydW50aW1lLT5hdWRpb190c3RhbXBfY29uZmlnLAorCQkJCQkJJnJ1bnRpbWUtPmF1ZGlvX3RzdGFtcF9yZXBvcnQpOwogCi0JCWlmICgocnVudGltZS0+aHcuaW5mbyAmIFNORFJWX1BDTV9JTkZPX0hBU19XQUxMX0NMT0NLKSAmJgotCQkJKHN1YnN0cmVhbS0+b3BzLT53YWxsX2Nsb2NrKSkKLQkJCXN1YnN0cmVhbS0+b3BzLT53YWxsX2Nsb2NrKHN1YnN0cmVhbSwgJmF1ZGlvX3RzdGFtcCk7CisJCQkvKiByZS10ZXN0IGluIGNhc2UgdHN0YW1wIHR5cGUgaXMgbm90IHN1cHBvcnRlZCBpbiBoYXJkd2FyZSBhbmQgd2FzIGRlbW90ZWQgdG8gREVGQVVMVCAqLworCQkJaWYgKHJ1bnRpbWUtPmF1ZGlvX3RzdGFtcF9yZXBvcnQuYWN0dWFsX3R5cGUgPT0gU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0RFRkFVTFQpCisJCQkJc25kX3BjbV9nZXR0aW1lKHJ1bnRpbWUsIChzdHJ1Y3QgdGltZXNwZWMgKikmY3Vycl90c3RhbXApOworCQl9IGVsc2UKKwkJCXNuZF9wY21fZ2V0dGltZShydW50aW1lLCAoc3RydWN0IHRpbWVzcGVjICopJmN1cnJfdHN0YW1wKTsKIAl9CiAKIAlpZiAocG9zID09IFNORFJWX1BDTV9QT1NfWFJVTikgewpAQCAtNDAzLDggKzQ1MywxMCBAQAogCX0KIAogIG5vX2RlbHRhX2NoZWNrOgotCWlmIChydW50aW1lLT5zdGF0dXMtPmh3X3B0ciA9PSBuZXdfaHdfcHRyKQorCWlmIChydW50aW1lLT5zdGF0dXMtPmh3X3B0ciA9PSBuZXdfaHdfcHRyKSB7CisJCXVwZGF0ZV9hdWRpb190c3RhbXAoc3Vic3RyZWFtLCAmY3Vycl90c3RhbXAsICZhdWRpb190c3RhbXApOwogCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSyAmJgogCSAgICBydW50aW1lLT5zaWxlbmNlX3NpemUgPiAwKQpAQCAtNDI2LDMwICs0NzgsOCBAQAogCQlzbmRfQlVHX09OKGNyb3NzZWRfYm91bmRhcnkgIT0gMSk7CiAJCXJ1bnRpbWUtPmh3X3B0cl93cmFwICs9IHJ1bnRpbWUtPmJvdW5kYXJ5OwogCX0KLQlpZiAocnVudGltZS0+dHN0YW1wX21vZGUgPT0gU05EUlZfUENNX1RTVEFNUF9FTkFCTEUpIHsKLQkJcnVudGltZS0+c3RhdHVzLT50c3RhbXAgPSBjdXJyX3RzdGFtcDsKIAotCQlpZiAoIShydW50aW1lLT5ody5pbmZvICYgU05EUlZfUENNX0lORk9fSEFTX1dBTExfQ0xPQ0spKSB7Ci0JCQkvKgotCQkJICogbm8gd2FsbCBjbG9jayBhdmFpbGFibGUsIHByb3ZpZGUgYXVkaW8gdGltZXN0YW1wCi0JCQkgKiBkZXJpdmVkIGZyb20gcG9pbnRlciBwb3NpdGlvbitkZWxheQotCQkJICovCi0JCQl1NjQgYXVkaW9fZnJhbWVzLCBhdWRpb19uc2VjczsKLQotCQkJaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCQkJYXVkaW9fZnJhbWVzID0gcnVudGltZS0+aHdfcHRyX3dyYXAKLQkJCQkJKyBydW50aW1lLT5zdGF0dXMtPmh3X3B0cgotCQkJCQktIHJ1bnRpbWUtPmRlbGF5OwotCQkJZWxzZQotCQkJCWF1ZGlvX2ZyYW1lcyA9IHJ1bnRpbWUtPmh3X3B0cl93cmFwCi0JCQkJCSsgcnVudGltZS0+c3RhdHVzLT5od19wdHIKLQkJCQkJKyBydW50aW1lLT5kZWxheTsKLQkJCWF1ZGlvX25zZWNzID0gZGl2X3U2NChhdWRpb19mcmFtZXMgKiAxMDAwMDAwMDAwTEwsCi0JCQkJCXJ1bnRpbWUtPnJhdGUpOwotCQkJYXVkaW9fdHN0YW1wID0gbnNfdG9fdGltZXNwZWMoYXVkaW9fbnNlY3MpOwotCQl9Ci0JCXJ1bnRpbWUtPnN0YXR1cy0+YXVkaW9fdHN0YW1wID0gYXVkaW9fdHN0YW1wOwotCX0KKwl1cGRhdGVfYXVkaW9fdHN0YW1wKHN1YnN0cmVhbSwgJmN1cnJfdHN0YW1wLCAmYXVkaW9fdHN0YW1wKTsKIAogCXJldHVybiBzbmRfcGNtX3VwZGF0ZV9zdGF0ZShzdWJzdHJlYW0sIHJ1bnRpbWUpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9wY21fbmF0aXZlLmMgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwppbmRleCAyNzllMjRmLi5kMTI2YzAzIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYworKysgYi9zb3VuZC9jb3JlL3BjbV9uYXRpdmUuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvYWlvLmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTM1LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvdGltZXIuaD4KICNpbmNsdWRlIDxzb3VuZC9taW5vcnMuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KIAogLyoKICAqICBDb21wYXRpYmlsaXR5CkBAIC03MDcsNiArNzA3LDIzIEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAogCXNuZF9wY21fc3RyZWFtX2xvY2tfaXJxKHN1YnN0cmVhbSk7CisKKwlzbmRfcGNtX3VucGFja19hdWRpb190c3RhbXBfY29uZmlnKHN0YXR1cy0+YXVkaW9fdHN0YW1wX2RhdGEsCisJCQkJCSZydW50aW1lLT5hdWRpb190c3RhbXBfY29uZmlnKTsKKworCS8qIGJhY2t3YXJkcyBjb21wYXRpYmxlIGJlaGF2aW9yICovCisJaWYgKHJ1bnRpbWUtPmF1ZGlvX3RzdGFtcF9jb25maWcudHlwZV9yZXF1ZXN0ZWQgPT0KKwkJU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0NPTVBBVCkgeworCQlpZiAocnVudGltZS0+aHcuaW5mbyAmIFNORFJWX1BDTV9JTkZPX0hBU19XQUxMX0NMT0NLKQorCQkJcnVudGltZS0+YXVkaW9fdHN0YW1wX2NvbmZpZy50eXBlX3JlcXVlc3RlZCA9CisJCQkJU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0xJTks7CisJCWVsc2UKKwkJCXJ1bnRpbWUtPmF1ZGlvX3RzdGFtcF9jb25maWcudHlwZV9yZXF1ZXN0ZWQgPQorCQkJCVNORFJWX1BDTV9BVURJT19UU1RBTVBfVFlQRV9ERUZBVUxUOworCQlydW50aW1lLT5hdWRpb190c3RhbXBfcmVwb3J0LnZhbGlkID0gMDsKKwl9IGVsc2UKKwkJcnVudGltZS0+YXVkaW9fdHN0YW1wX3JlcG9ydC52YWxpZCA9IDE7CisKIAlzdGF0dXMtPnN0YXRlID0gcnVudGltZS0+c3RhdHVzLT5zdGF0ZTsKIAlzdGF0dXMtPnN1c3BlbmRlZF9zdGF0ZSA9IHJ1bnRpbWUtPnN0YXR1cy0+c3VzcGVuZGVkX3N0YXRlOwogCWlmIChzdGF0dXMtPnN0YXRlID09IFNORFJWX1BDTV9TVEFURV9PUEVOKQpAQCAtNzE2LDggKzczMywxNSBAQAogCQlzbmRfcGNtX3VwZGF0ZV9od19wdHIoc3Vic3RyZWFtKTsKIAkJaWYgKHJ1bnRpbWUtPnRzdGFtcF9tb2RlID09IFNORFJWX1BDTV9UU1RBTVBfRU5BQkxFKSB7CiAJCQlzdGF0dXMtPnRzdGFtcCA9IHJ1bnRpbWUtPnN0YXR1cy0+dHN0YW1wOworCQkJc3RhdHVzLT5kcml2ZXJfdHN0YW1wID0gcnVudGltZS0+ZHJpdmVyX3RzdGFtcDsKIAkJCXN0YXR1cy0+YXVkaW9fdHN0YW1wID0KIAkJCQlydW50aW1lLT5zdGF0dXMtPmF1ZGlvX3RzdGFtcDsKKwkJCWlmIChydW50aW1lLT5hdWRpb190c3RhbXBfcmVwb3J0LnZhbGlkID09IDEpCisJCQkJLyogYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIG5vIHJlcG9ydCBwcm92aWRlZCBpbiBDT01QQVQgbW9kZSAqLworCQkJCXNuZF9wY21fcGFja19hdWRpb190c3RhbXBfcmVwb3J0KCZzdGF0dXMtPmF1ZGlvX3RzdGFtcF9kYXRhLAorCQkJCQkJCQkmc3RhdHVzLT5hdWRpb190c3RhbXBfYWNjdXJhY3ksCisJCQkJCQkJCSZydW50aW1lLT5hdWRpb190c3RhbXBfcmVwb3J0KTsKKwogCQkJZ290byBfdHN0YW1wX2VuZDsKIAkJfQogCX0gZWxzZSB7CkBAIC03NTMsMTIgKzc3NywyMSBAQAogfQogCiBzdGF0aWMgaW50IHNuZF9wY21fc3RhdHVzX3VzZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICAgICAgc3RydWN0IHNuZF9wY21fc3RhdHVzIF9fdXNlciAqIF9zdGF0dXMpCisJCQkgICAgICAgc3RydWN0IHNuZF9wY21fc3RhdHVzIF9fdXNlciAqIF9zdGF0dXMsCisJCQkgICAgICAgYm9vbCBleHQpCiB7CiAJc3RydWN0IHNuZF9wY21fc3RhdHVzIHN0YXR1czsKIAlpbnQgcmVzOwotCQorCiAJbWVtc2V0KCZzdGF0dXMsIDAsIHNpemVvZihzdGF0dXMpKTsKKwkvKgorCSAqIHdpdGggZXh0ZW5zaW9uLCBwYXJhbWV0ZXJzIGFyZSByZWFkL3dyaXRlLAorCSAqIGdldCBhdWRpb190c3RhbXBfZGF0YSBmcm9tIHVzZXIsCisJICogaWdub3JlIHJlc3Qgb2Ygc3RhdHVzIHN0cnVjdHVyZQorCSAqLworCWlmIChleHQgJiYgZ2V0X3VzZXIoc3RhdHVzLmF1ZGlvX3RzdGFtcF9kYXRhLAorCQkJCSh1MzIgX191c2VyICopKCZfc3RhdHVzLT5hdWRpb190c3RhbXBfZGF0YSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXMgPSBzbmRfcGNtX3N0YXR1cyhzdWJzdHJlYW0sICZzdGF0dXMpOwogCWlmIChyZXMgPCAwKQogCQlyZXR1cm4gcmVzOwpAQCAtMjcyNSw3ICsyNzU4LDkgQEAKIAljYXNlIFNORFJWX1BDTV9JT0NUTF9TV19QQVJBTVM6CiAJCXJldHVybiBzbmRfcGNtX3N3X3BhcmFtc191c2VyKHN1YnN0cmVhbSwgYXJnKTsKIAljYXNlIFNORFJWX1BDTV9JT0NUTF9TVEFUVVM6Ci0JCXJldHVybiBzbmRfcGNtX3N0YXR1c191c2VyKHN1YnN0cmVhbSwgYXJnKTsKKwkJcmV0dXJuIHNuZF9wY21fc3RhdHVzX3VzZXIoc3Vic3RyZWFtLCBhcmcsIGZhbHNlKTsKKwljYXNlIFNORFJWX1BDTV9JT0NUTF9TVEFUVVNfRVhUOgorCQlyZXR1cm4gc25kX3BjbV9zdGF0dXNfdXNlcihzdWJzdHJlYW0sIGFyZywgdHJ1ZSk7CiAJY2FzZSBTTkRSVl9QQ01fSU9DVExfQ0hBTk5FTF9JTkZPOgogCQlyZXR1cm4gc25kX3BjbV9jaGFubmVsX2luZm9fdXNlcihzdWJzdHJlYW0sIGFyZyk7CiAJY2FzZSBTTkRSVl9QQ01fSU9DVExfUFJFUEFSRToKQEAgLTMwMzMsOSArMzA2OCw3IEBACiAJcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdGljIHNzaXplX3Qgc25kX3BjbV9haW9fcmVhZChzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJICAgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIGxvZmZfdCBwb3MpCi0KK3N0YXRpYyBzc2l6ZV90IHNuZF9wY21fcmVhZHYoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKnRvKQogewogCXN0cnVjdCBzbmRfcGNtX2ZpbGUgKnBjbV9maWxlOwogCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwpAQCAtMzA1MiwxNiArMzA4NSwxOCBAQAogCXJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJaWYgKHJ1bnRpbWUtPnN0YXR1cy0+c3RhdGUgPT0gU05EUlZfUENNX1NUQVRFX09QRU4pCiAJCXJldHVybiAtRUJBREZEOwotCWlmIChucl9zZWdzID4gMTAyNCB8fCBucl9zZWdzICE9IHJ1bnRpbWUtPmNoYW5uZWxzKQorCWlmICghaXRlcl9pc19pb3ZlYyh0bykpCiAJCXJldHVybiAtRUlOVkFMOwotCWlmICghZnJhbWVfYWxpZ25lZChydW50aW1lLCBpb3YtPmlvdl9sZW4pKQorCWlmICh0by0+bnJfc2VncyA+IDEwMjQgfHwgdG8tPm5yX3NlZ3MgIT0gcnVudGltZS0+Y2hhbm5lbHMpCiAJCXJldHVybiAtRUlOVkFMOwotCWZyYW1lcyA9IGJ5dGVzX3RvX3NhbXBsZXMocnVudGltZSwgaW92LT5pb3ZfbGVuKTsKLQlidWZzID0ga21hbGxvYyhzaXplb2Yodm9pZCAqKSAqIG5yX3NlZ3MsIEdGUF9LRVJORUwpOworCWlmICghZnJhbWVfYWxpZ25lZChydW50aW1lLCB0by0+aW92LT5pb3ZfbGVuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZnJhbWVzID0gYnl0ZXNfdG9fc2FtcGxlcyhydW50aW1lLCB0by0+aW92LT5pb3ZfbGVuKTsKKwlidWZzID0ga21hbGxvYyhzaXplb2Yodm9pZCAqKSAqIHRvLT5ucl9zZWdzLCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmcyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQlmb3IgKGkgPSAwOyBpIDwgbnJfc2VnczsgKytpKQotCQlidWZzW2ldID0gaW92W2ldLmlvdl9iYXNlOworCWZvciAoaSA9IDA7IGkgPCB0by0+bnJfc2VnczsgKytpKQorCQlidWZzW2ldID0gdG8tPmlvdltpXS5pb3ZfYmFzZTsKIAlyZXN1bHQgPSBzbmRfcGNtX2xpYl9yZWFkdihzdWJzdHJlYW0sIGJ1ZnMsIGZyYW1lcyk7CiAJaWYgKHJlc3VsdCA+IDApCiAJCXJlc3VsdCA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLCByZXN1bHQpOwpAQCAtMzA2OSw4ICszMTA0LDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgc3NpemVfdCBzbmRfcGNtX2Fpb193cml0ZShzdHJ1Y3Qga2lvY2IgKmlvY2IsIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCBsb2ZmX3QgcG9zKQorc3RhdGljIHNzaXplX3Qgc25kX3BjbV93cml0ZXYoc3RydWN0IGtpb2NiICppb2NiLCBzdHJ1Y3QgaW92X2l0ZXIgKmZyb20pCiB7CiAJc3RydWN0IHNuZF9wY21fZmlsZSAqcGNtX2ZpbGU7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CkBAIC0zMDg3LDE1ICszMTIxLDE3IEBACiAJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlpZiAocnVudGltZS0+c3RhdHVzLT5zdGF0ZSA9PSBTTkRSVl9QQ01fU1RBVEVfT1BFTikKIAkJcmV0dXJuIC1FQkFERkQ7Ci0JaWYgKG5yX3NlZ3MgPiAxMjggfHwgbnJfc2VncyAhPSBydW50aW1lLT5jaGFubmVscyB8fAotCSAgICAhZnJhbWVfYWxpZ25lZChydW50aW1lLCBpb3YtPmlvdl9sZW4pKQorCWlmICghaXRlcl9pc19pb3ZlYyhmcm9tKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JZnJhbWVzID0gYnl0ZXNfdG9fc2FtcGxlcyhydW50aW1lLCBpb3YtPmlvdl9sZW4pOwotCWJ1ZnMgPSBrbWFsbG9jKHNpemVvZih2b2lkICopICogbnJfc2VncywgR0ZQX0tFUk5FTCk7CisJaWYgKGZyb20tPm5yX3NlZ3MgPiAxMjggfHwgZnJvbS0+bnJfc2VncyAhPSBydW50aW1lLT5jaGFubmVscyB8fAorCSAgICAhZnJhbWVfYWxpZ25lZChydW50aW1lLCBmcm9tLT5pb3YtPmlvdl9sZW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmcmFtZXMgPSBieXRlc190b19zYW1wbGVzKHJ1bnRpbWUsIGZyb20tPmlvdi0+aW92X2xlbik7CisJYnVmcyA9IGttYWxsb2Moc2l6ZW9mKHZvaWQgKikgKiBmcm9tLT5ucl9zZWdzLCBHRlBfS0VSTkVMKTsKIAlpZiAoYnVmcyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKLQlmb3IgKGkgPSAwOyBpIDwgbnJfc2VnczsgKytpKQotCQlidWZzW2ldID0gaW92W2ldLmlvdl9iYXNlOworCWZvciAoaSA9IDA7IGkgPCBmcm9tLT5ucl9zZWdzOyArK2kpCisJCWJ1ZnNbaV0gPSBmcm9tLT5pb3ZbaV0uaW92X2Jhc2U7CiAJcmVzdWx0ID0gc25kX3BjbV9saWJfd3JpdGV2KHN1YnN0cmVhbSwgYnVmcywgZnJhbWVzKTsKIAlpZiAocmVzdWx0ID4gMCkKIAkJcmVzdWx0ID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsIHJlc3VsdCk7CkBAIC0zNjMzLDcgKzM2NjksNyBAQAogCXsKIAkJLm93bmVyID0JCVRISVNfTU9EVUxFLAogCQkud3JpdGUgPQkJc25kX3BjbV93cml0ZSwKLQkJLmFpb193cml0ZSA9CQlzbmRfcGNtX2Fpb193cml0ZSwKKwkJLndyaXRlX2l0ZXIgPQkJc25kX3BjbV93cml0ZXYsCiAJCS5vcGVuID0JCQlzbmRfcGNtX3BsYXliYWNrX29wZW4sCiAJCS5yZWxlYXNlID0JCXNuZF9wY21fcmVsZWFzZSwKIAkJLmxsc2VlayA9CQlub19sbHNlZWssCkBAIC0zNjQ3LDcgKzM2ODMsNyBAQAogCXsKIAkJLm93bmVyID0JCVRISVNfTU9EVUxFLAogCQkucmVhZCA9CQkJc25kX3BjbV9yZWFkLAotCQkuYWlvX3JlYWQgPQkJc25kX3BjbV9haW9fcmVhZCwKKwkJLnJlYWRfaXRlciA9CQlzbmRfcGNtX3JlYWR2LAogCQkub3BlbiA9CQkJc25kX3BjbV9jYXB0dXJlX29wZW4sCiAJCS5yZWxlYXNlID0JCXNuZF9wY21fcmVsZWFzZSwKIAkJLmxsc2VlayA9CQlub19sbHNlZWssCmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3Jhd21pZGkuYyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCmluZGV4IGI1YTc0ODUuLmE3NzU5ODQgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvcmF3bWlkaS5jCisrKyBiL3NvdW5kL2NvcmUvcmF3bWlkaS5jCkBAIC0xNDI5LDEwICsxNDI5LDggQEAKIAogCWZvciAoaWR4ID0gMDsgaWR4IDwgY291bnQ7IGlkeCsrKSB7CiAJCXN1YnN0cmVhbSA9IGt6YWxsb2Moc2l6ZW9mKCpzdWJzdHJlYW0pLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHN1YnN0cmVhbSA9PSBOVUxMKSB7Ci0JCQlybWlkaV9lcnIocm1pZGksICJyYXdtaWRpOiBjYW5ub3QgYWxsb2NhdGUgc3Vic3RyZWFtXG4iKTsKKwkJaWYgKCFzdWJzdHJlYW0pCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQogCQlzdWJzdHJlYW0tPnN0cmVhbSA9IGRpcmVjdGlvbjsKIAkJc3Vic3RyZWFtLT5udW1iZXIgPSBpZHg7CiAJCXN1YnN0cmVhbS0+cm1pZGkgPSBybWlkaTsKQEAgLTE0NzksMTAgKzE0NzcsOCBAQAogCWlmIChycmF3bWlkaSkKIAkJKnJyYXdtaWRpID0gTlVMTDsKIAlybWlkaSA9IGt6YWxsb2Moc2l6ZW9mKCpybWlkaSksIEdGUF9LRVJORUwpOwotCWlmIChybWlkaSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LCAicmF3bWlkaTogY2Fubm90IGFsbG9jYXRlXG4iKTsKKwlpZiAoIXJtaWRpKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJcm1pZGktPmNhcmQgPSBjYXJkOwogCXJtaWRpLT5kZXZpY2UgPSBkZXZpY2U7CiAJbXV0ZXhfaW5pdCgmcm1pZGktPm9wZW5fbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3MuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzLmMKaW5kZXggMTZkNDI2Ny4uNzI4NzNhNCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3MuYworKysgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zcy5jCkBAIC02NSwxNSArNjUsMjAgQEAKICAqIG1vZHVsZSBpbnRlcmZhY2UKICAqLwogCitzdGF0aWMgc3RydWN0IHNuZF9zZXFfZHJpdmVyIHNlcV9vc3Nfc3ludGhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJCS5wcm9iZSA9IHNuZF9zZXFfb3NzX3N5bnRoX3Byb2JlLAorCQkucmVtb3ZlID0gc25kX3NlcV9vc3Nfc3ludGhfcmVtb3ZlLAorCX0sCisJLmlkID0gU05EUlZfU0VRX0RFVl9JRF9PU1MsCisJLmFyZ3NpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9zZXFfb3NzX3JlZyksCit9OworCiBzdGF0aWMgaW50IF9faW5pdCBhbHNhX3NlcV9vc3NfaW5pdCh2b2lkKQogewogCWludCByYzsKLQlzdGF0aWMgc3RydWN0IHNuZF9zZXFfZGV2X29wcyBvcHMgPSB7Ci0JCXNuZF9zZXFfb3NzX3N5bnRoX3JlZ2lzdGVyLAotCQlzbmRfc2VxX29zc19zeW50aF91bnJlZ2lzdGVyLAotCX07CiAKLQlzbmRfc2VxX2F1dG9sb2FkX2xvY2soKTsKIAlpZiAoKHJjID0gcmVnaXN0ZXJfZGV2aWNlKCkpIDwgMCkKIAkJZ290byBlcnJvcjsKIAlpZiAoKHJjID0gcmVnaXN0ZXJfcHJvYygpKSA8IDApIHsKQEAgLTg2LDggKzkxLDggQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKLQlpZiAoKHJjID0gc25kX3NlcV9kZXZpY2VfcmVnaXN0ZXJfZHJpdmVyKFNORFJWX1NFUV9ERVZfSURfT1NTLCAmb3BzLAotCQkJCQkJIHNpemVvZihzdHJ1Y3Qgc25kX3NlcV9vc3NfcmVnKSkpIDwgMCkgeworCXJjID0gc25kX3NlcV9kcml2ZXJfcmVnaXN0ZXIoJnNlcV9vc3Nfc3ludGhfZHJpdmVyKTsKKwlpZiAocmMgPCAwKSB7CiAJCXNuZF9zZXFfb3NzX2RlbGV0ZV9jbGllbnQoKTsKIAkJdW5yZWdpc3Rlcl9wcm9jKCk7CiAJCXVucmVnaXN0ZXJfZGV2aWNlKCk7CkBAIC05OCwxMyArMTAzLDEyIEBACiAJc25kX3NlcV9vc3Nfc3ludGhfaW5pdCgpOwogCiAgZXJyb3I6Ci0Jc25kX3NlcV9hdXRvbG9hZF91bmxvY2soKTsKIAlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX3NlcV9vc3NfZXhpdCh2b2lkKQogewotCXNuZF9zZXFfZGV2aWNlX3VucmVnaXN0ZXJfZHJpdmVyKFNORFJWX1NFUV9ERVZfSURfT1NTKTsKKwlzbmRfc2VxX2RyaXZlcl91bnJlZ2lzdGVyKCZzZXFfb3NzX3N5bnRoX2RyaXZlcik7CiAJc25kX3NlcV9vc3NfZGVsZXRlX2NsaWVudCgpOwogCXVucmVnaXN0ZXJfcHJvYygpOwogCXVucmVnaXN0ZXJfZGV2aWNlKCk7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pbml0LmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19pbml0LmMKaW5kZXggYjBlMzJlMS4uMmRlM2ZlZiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfaW5pdC5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX2luaXQuYwpAQCAtMTg4LDEwICsxODgsOCBAQAogCXN0cnVjdCBzZXFfb3NzX2RldmluZm8gKmRwOwogCiAJZHAgPSBremFsbG9jKHNpemVvZigqZHApLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWRwKSB7Ci0JCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgbWFsbG9jIGRldmljZSBpbmZvXG4iKTsKKwlpZiAoIWRwKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAlkcC0+Y3NlcSA9IHN5c3RlbV9jbGllbnQ7CiAJZHAtPnBvcnQgPSAtMTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX21pZGkuYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX21pZGkuYwppbmRleCBlNzljYzQ0Li45NmU4Mzk1IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19taWRpLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfbWlkaS5jCkBAIC0xNzMsMTAgKzE3Myw5IEBACiAJLyoKIAkgKiBhbGxvY2F0ZSBtaWRpIGluZm8gcmVjb3JkCiAJICovCi0JaWYgKChtZGV2ID0ga3phbGxvYyhzaXplb2YoKm1kZXYpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgewotCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IGNhbid0IG1hbGxvYyBtaWRpIGluZm9cbiIpOworCW1kZXYgPSBremFsbG9jKHNpemVvZigqbWRldiksIEdGUF9LRVJORUwpOworCWlmICghbWRldikKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyogY29weSB0aGUgcG9ydCBpbmZvcm1hdGlvbiAqLwogCW1kZXYtPmNsaWVudCA9IHBpbmZvLT5hZGRyLmNsaWVudDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3JlYWRxLmMgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19yZWFkcS5jCmluZGV4IDY1NGQxN2EuLmMwODBjNzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3JlYWRxLmMKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3NfcmVhZHEuYwpAQCAtNDcsMTMgKzQ3LDEyIEBACiB7CiAJc3RydWN0IHNlcV9vc3NfcmVhZHEgKnE7CiAKLQlpZiAoKHEgPSBremFsbG9jKHNpemVvZigqcSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgbWFsbG9jIHJlYWQgcXVldWVcbiIpOworCXEgPSBremFsbG9jKHNpemVvZigqcSksIEdGUF9LRVJORUwpOworCWlmICghcSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCi0JaWYgKChxLT5xID0ga2NhbGxvYyhtYXhsZW4sIHNpemVvZih1bmlvbiBldnJlYyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgbWFsbG9jIHJlYWQgcXVldWUgYnVmZmVyXG4iKTsKKwlxLT5xID0ga2NhbGxvYyhtYXhsZW4sIHNpemVvZih1bmlvbiBldnJlYyksIEdGUF9LRVJORUwpOworCWlmICghcS0+cSkgewogCQlrZnJlZShxKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3Nfc3ludGguYyBiL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmMKaW5kZXggNzAxZmViNy4uNDhlNGZlMSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3Nfc3ludGguYworKysgYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19zeW50aC5jCkBAIC05OCwxNyArOTgsMTcgQEAKICAqIHJlZ2lzdHJhdGlvbiBvZiB0aGUgc3ludGggZGV2aWNlCiAgKi8KIGludAotc25kX3NlcV9vc3Nfc3ludGhfcmVnaXN0ZXIoc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYpCitzbmRfc2VxX29zc19zeW50aF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogeworCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2ID0gdG9fc2VxX2RldihfZGV2KTsKIAlpbnQgaTsKIAlzdHJ1Y3Qgc2VxX29zc19zeW50aCAqcmVjOwogCXN0cnVjdCBzbmRfc2VxX29zc19yZWcgKnJlZyA9IFNORFJWX1NFUV9ERVZJQ0VfQVJHUFRSKGRldik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICgocmVjID0ga3phbGxvYyhzaXplb2YoKnJlYyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7Ci0JCXByX2VycigiQUxTQTogc2VxX29zczogY2FuJ3QgbWFsbG9jIHN5bnRoIGluZm9cbiIpOworCXJlYyA9IGt6YWxsb2Moc2l6ZW9mKCpyZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCXJlYy0+c2VxX2RldmljZSA9IC0xOwogCXJlYy0+c3ludGhfdHlwZSA9IHJlZy0+dHlwZTsKIAlyZWMtPnN5bnRoX3N1YnR5cGUgPSByZWctPnN1YnR5cGU7CkBAIC0xNDksOCArMTQ5LDkgQEAKIAogCiBpbnQKLXNuZF9zZXFfb3NzX3N5bnRoX3VucmVnaXN0ZXIoc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYpCitzbmRfc2VxX29zc19zeW50aF9yZW1vdmUoc3RydWN0IGRldmljZSAqX2RldikKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldiA9IHRvX3NlcV9kZXYoX2Rldik7CiAJaW50IGluZGV4OwogCXN0cnVjdCBzZXFfb3NzX3N5bnRoICpyZWMgPSBkZXYtPmRyaXZlcl9kYXRhOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yNDcsNyArMjQ4LDYgQEAKIAkJaWYgKGluZm8tPm5yX3ZvaWNlcyA+IDApIHsKIAkJCWluZm8tPmNoID0ga2NhbGxvYyhpbmZvLT5ucl92b2ljZXMsIHNpemVvZihzdHJ1Y3Qgc2VxX29zc19jaGluZm8pLCBHRlBfS0VSTkVMKTsKIAkJCWlmICghaW5mby0+Y2gpIHsKLQkJCQlwcl9lcnIoIkFMU0E6IHNlcV9vc3M6IENhbm5vdCBtYWxsb2Mgdm9pY2VzXG4iKTsKIAkJCQlyZWMtPm9wZXIuY2xvc2UoJmluZm8tPmFyZyk7CiAJCQkJbW9kdWxlX3B1dChyZWMtPm9wZXIub3duZXIpOwogCQkJCXNuZF91c2VfbG9ja19mcmVlKCZyZWMtPnVzZV9sb2NrKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmggYi9zb3VuZC9jb3JlL3NlcS9vc3Mvc2VxX29zc19zeW50aC5oCmluZGV4IGRiZGZjYmIuLjc0YWM1NWYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL29zcy9zZXFfb3NzX3N5bnRoLmgKKysrIGIvc291bmQvY29yZS9zZXEvb3NzL3NlcV9vc3Nfc3ludGguaApAQCAtMjgsOCArMjgsOCBAQAogI2luY2x1ZGUgPHNvdW5kL3NlcV9kZXZpY2UuaD4KIAogdm9pZCBzbmRfc2VxX29zc19zeW50aF9pbml0KHZvaWQpOwotaW50IHNuZF9zZXFfb3NzX3N5bnRoX3JlZ2lzdGVyKHN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2KTsKLWludCBzbmRfc2VxX29zc19zeW50aF91bnJlZ2lzdGVyKHN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2KTsKK2ludCBzbmRfc2VxX29zc19zeW50aF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworaW50IHNuZF9zZXFfb3NzX3N5bnRoX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwogdm9pZCBzbmRfc2VxX29zc19zeW50aF9zZXR1cChzdHJ1Y3Qgc2VxX29zc19kZXZpbmZvICpkcCk7CiB2b2lkIHNuZF9zZXFfb3NzX3N5bnRoX3NldHVwX21pZGkoc3RydWN0IHNlcV9vc3NfZGV2aW5mbyAqZHApOwogdm9pZCBzbmRfc2VxX29zc19zeW50aF9jbGVhbnVwKHN0cnVjdCBzZXFfb3NzX2RldmluZm8gKmRwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9jbGllbnRtZ3IuYwppbmRleCA0ODI4NzY1Li5lZGJkYWI4IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfY2xpZW50bWdyLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2NsaWVudG1nci5jCkBAIC0xODc5LDYgKzE4NzksNyBAQAogCWlmIChjcHRyID09IE5VTEwpCiAJCXJldHVybiAtRU5PRU5UOwogCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwlpbmZvLmNsaWVudCA9IGNwdHItPm51bWJlcjsKIAlpbmZvLm91dHB1dF9wb29sID0gY3B0ci0+cG9vbC0+c2l6ZTsKIAlpbmZvLm91dHB1dF9yb29tID0gY3B0ci0+cG9vbC0+cm9vbTsKIAlpbmZvLm91dHB1dF9mcmVlID0gaW5mby5vdXRwdXRfcG9vbDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9kZXZpY2UuYwppbmRleCAwNjMxYmRhLi5kOTlmOTlkIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfZGV2aWNlLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX2RldmljZS5jCkBAIC0zNiw2ICszNiw3IEBACiAgKgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgpAQCAtNTEsMTQwICs1Miw3OCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIHNlcXVlbmNlciBkZXZpY2UgbWFuYWdlbWVudCIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0vKiBkcml2ZXIgc3RhdGUgKi8KLSNkZWZpbmUgRFJJVkVSX0VNUFRZCQkwCi0jZGVmaW5lIERSSVZFUl9MT0FERUQJCSgxPDwwKQotI2RlZmluZSBEUklWRVJfUkVRVUVTVEVECSgxPDwxKQotI2RlZmluZSBEUklWRVJfTE9DS0VECQkoMTw8MikKLSNkZWZpbmUgRFJJVkVSX1JFUVVFU1RJTkcJKDE8PDMpCisvKgorICogYnVzIGRlZmluaXRpb24KKyAqLworc3RhdGljIGludCBzbmRfc2VxX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IHNuZF9zZXFfZGV2aWNlICpzZGV2ID0gdG9fc2VxX2RldihkZXYpOworCXN0cnVjdCBzbmRfc2VxX2RyaXZlciAqc2RydiA9IHRvX3NlcV9kcnYoZHJ2KTsKIAotc3RydWN0IG9wc19saXN0IHsKLQljaGFyIGlkW0lEX0xFTl07CS8qIGRyaXZlciBpZCAqLwotCWludCBkcml2ZXI7CQkvKiBkcml2ZXIgc3RhdGUgKi8KLQlpbnQgdXNlZDsJCS8qIHJlZmVyZW5jZSBjb3VudGVyICovCi0JaW50IGFyZ3NpemU7CQkvKiBhcmd1bWVudCBzaXplICovCisJcmV0dXJuIHN0cmNtcChzZHJ2LT5pZCwgc2Rldi0+aWQpID09IDAgJiYKKwkJc2Rydi0+YXJnc2l6ZSA9PSBzZGV2LT5hcmdzaXplOworfQogCi0JLyogb3BlcmF0b3JzICovCi0Jc3RydWN0IHNuZF9zZXFfZGV2X29wcyBvcHM7Ci0KLQkvKiByZWdpc3RlcmVkIGRldmljZXMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGRldl9saXN0OwkvKiBsaXN0IG9mIGRldmljZXMgKi8KLQlpbnQgbnVtX2RldmljZXM7CS8qIG51bWJlciBvZiBhc3NvY2lhdGVkIGRldmljZXMgKi8KLQlpbnQgbnVtX2luaXRfZGV2aWNlczsJLyogbnVtYmVyIG9mIGluaXRpYWxpemVkIGRldmljZXMgKi8KLQlzdHJ1Y3QgbXV0ZXggcmVnX211dGV4OwotCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBuZXh0IGRyaXZlciAqLworc3RhdGljIHN0cnVjdCBidXNfdHlwZSBzbmRfc2VxX2J1c190eXBlID0geworCS5uYW1lID0gInNuZF9zZXEiLAorCS5tYXRjaCA9IHNuZF9zZXFfYnVzX21hdGNoLAogfTsKIAotCi1zdGF0aWMgTElTVF9IRUFEKG9wc2xpc3QpOwotc3RhdGljIGludCBudW1fb3BzOwotc3RhdGljIERFRklORV9NVVRFWChvcHNfbXV0ZXgpOworLyoKKyAqIHByb2MgaW50ZXJmYWNlIC0tIGp1c3QgZm9yIGNvbXBhdGliaWxpdHkKKyAqLwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiBzdGF0aWMgc3RydWN0IHNuZF9pbmZvX2VudHJ5ICppbmZvX2VudHJ5OwotI2VuZGlmCiAKLS8qCi0gKiBwcm90b3R5cGVzCi0gKi8KLXN0YXRpYyBpbnQgc25kX3NlcV9kZXZpY2VfZnJlZShzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldik7Ci1zdGF0aWMgaW50IHNuZF9zZXFfZGV2aWNlX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBzbmRfc2VxX2RldmljZV9kZXZfcmVnaXN0ZXIoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSk7Ci1zdGF0aWMgaW50IHNuZF9zZXFfZGV2aWNlX2Rldl9kaXNjb25uZWN0KHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpOworc3RhdGljIGludCBwcmludF9kZXZfaW5mbyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHNuZF9zZXFfZGV2aWNlICpzZGV2ID0gdG9fc2VxX2RldihkZXYpOworCXN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlciA9IGRhdGE7CiAKLXN0YXRpYyBpbnQgaW5pdF9kZXZpY2Uoc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYsIHN0cnVjdCBvcHNfbGlzdCAqb3BzKTsKLXN0YXRpYyBpbnQgZnJlZV9kZXZpY2Uoc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYsIHN0cnVjdCBvcHNfbGlzdCAqb3BzKTsKLXN0YXRpYyBzdHJ1Y3Qgb3BzX2xpc3QgKmZpbmRfZHJpdmVyKGNoYXIgKmlkLCBpbnQgY3JlYXRlX2lmX2VtcHR5KTsKLXN0YXRpYyBzdHJ1Y3Qgb3BzX2xpc3QgKmNyZWF0ZV9kcml2ZXIoY2hhciAqaWQpOwotc3RhdGljIHZvaWQgdW5sb2NrX2RyaXZlcihzdHJ1Y3Qgb3BzX2xpc3QgKm9wcyk7Ci1zdGF0aWMgdm9pZCByZW1vdmVfZHJpdmVycyh2b2lkKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJzbmQtJXMsJXMsJWRcbiIsIHNkZXYtPmlkLAorCQkgICAgZGV2LT5kcml2ZXIgPyAibG9hZGVkIiA6ICJlbXB0eSIsCisJCSAgICBkZXYtPmRyaXZlciA/IDEgOiAwKTsKKwlyZXR1cm4gMDsKK30KIAotLyoKLSAqIHNob3cgYWxsIGRyaXZlcnMgYW5kIHRoZWlyIHN0YXR1cwotICovCi0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUwogc3RhdGljIHZvaWQgc25kX3NlcV9kZXZpY2VfaW5mbyhzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5LAogCQkJCXN0cnVjdCBzbmRfaW5mb19idWZmZXIgKmJ1ZmZlcikKIHsKLQlzdHJ1Y3Qgb3BzX2xpc3QgKm9wczsKLQotCW11dGV4X2xvY2soJm9wc19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZvcHNsaXN0LCBsaXN0KSB7Ci0JCXNuZF9pcHJpbnRmKGJ1ZmZlciwgInNuZC0lcyVzJXMlcywlZFxuIiwKLQkJCQlvcHMtPmlkLAotCQkJCW9wcy0+ZHJpdmVyICYgRFJJVkVSX0xPQURFRCA/ICIsbG9hZGVkIiA6IChvcHMtPmRyaXZlciA9PSBEUklWRVJfRU1QVFkgPyAiLGVtcHR5IiA6ICIiKSwKLQkJCQlvcHMtPmRyaXZlciAmIERSSVZFUl9SRVFVRVNURUQgPyAiLHJlcXVlc3RlZCIgOiAiIiwKLQkJCQlvcHMtPmRyaXZlciAmIERSSVZFUl9MT0NLRUQgPyAiLGxvY2tlZCIgOiAiIiwKLQkJCQlvcHMtPm51bV9kZXZpY2VzKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZvcHNfbXV0ZXgpOworCWJ1c19mb3JfZWFjaF9kZXYoJnNuZF9zZXFfYnVzX3R5cGUsIE5VTEwsIGJ1ZmZlciwgcHJpbnRfZGV2X2luZm8pOwogfQogI2VuZGlmCi0gCisKIC8qCiAgKiBsb2FkIGFsbCByZWdpc3RlcmVkIGRyaXZlcnMgKGNhbGxlZCBmcm9tIHNlcV9jbGllbnRtZ3IuYykKICAqLwogCiAjaWZkZWYgQ09ORklHX01PRFVMRVMKLS8qIGF2b2lkIGF1dG8tbG9hZGluZyBkdXJpbmcgbW9kdWxlX2luaXQoKSAqLworLyogZmxhZyB0byBibG9jayBhdXRvLWxvYWRpbmcgKi8KIHN0YXRpYyBhdG9taWNfdCBzbmRfc2VxX2luX2luaXQgPSBBVE9NSUNfSU5JVCgxKTsgLyogYmxvY2tlZCBhcyBkZWZhdWx0ICovCi12b2lkIHNuZF9zZXFfYXV0b2xvYWRfbG9jayh2b2lkKQorCitzdGF0aWMgaW50IHJlcXVlc3Rfc2VxX2RydihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCiB7Ci0JYXRvbWljX2luYygmc25kX3NlcV9pbl9pbml0KTsKKwlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKnNkZXYgPSB0b19zZXFfZGV2KGRldik7CisKKwlpZiAoIWRldi0+ZHJpdmVyKQorCQlyZXF1ZXN0X21vZHVsZSgic25kLSVzIiwgc2Rldi0+aWQpOworCXJldHVybiAwOwogfQogCi12b2lkIHNuZF9zZXFfYXV0b2xvYWRfdW5sb2NrKHZvaWQpCi17Ci0JYXRvbWljX2RlYygmc25kX3NlcV9pbl9pbml0KTsKLX0KLQotc3RhdGljIHZvaWQgYXV0b2xvYWRfZHJpdmVycyh2b2lkKQorc3RhdGljIHZvaWQgYXV0b2xvYWRfZHJpdmVycyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJLyogYXZvaWQgcmVlbnRyYW5jZSAqLwotCWlmIChhdG9taWNfaW5jX3JldHVybigmc25kX3NlcV9pbl9pbml0KSA9PSAxKSB7Ci0JCXN0cnVjdCBvcHNfbGlzdCAqb3BzOwotCi0JCW11dGV4X2xvY2soJm9wc19tdXRleCk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkob3BzLCAmb3BzbGlzdCwgbGlzdCkgewotCQkJaWYgKChvcHMtPmRyaXZlciAmIERSSVZFUl9SRVFVRVNUSU5HKSAmJgotCQkJICAgICEob3BzLT5kcml2ZXIgJiBEUklWRVJfUkVRVUVTVEVEKSkgewotCQkJCW9wcy0+dXNlZCsrOwotCQkJCW11dGV4X3VubG9jaygmb3BzX211dGV4KTsKLQkJCQlvcHMtPmRyaXZlciB8PSBEUklWRVJfUkVRVUVTVEVEOwotCQkJCXJlcXVlc3RfbW9kdWxlKCJzbmQtJXMiLCBvcHMtPmlkKTsKLQkJCQltdXRleF9sb2NrKCZvcHNfbXV0ZXgpOwotCQkJCW9wcy0+dXNlZC0tOwotCQkJfQotCQl9Ci0JCW11dGV4X3VubG9jaygmb3BzX211dGV4KTsKLQl9CisJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZzbmRfc2VxX2luX2luaXQpID09IDEpCisJCWJ1c19mb3JfZWFjaF9kZXYoJnNuZF9zZXFfYnVzX3R5cGUsIE5VTEwsIE5VTEwsCisJCQkJIHJlcXVlc3Rfc2VxX2Rydik7CiAJYXRvbWljX2RlYygmc25kX3NlcV9pbl9pbml0KTsKIH0KIAotc3RhdGljIHZvaWQgY2FsbF9hdXRvbG9hZChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0JYXV0b2xvYWRfZHJpdmVycygpOwotfQotCi1zdGF0aWMgREVDTEFSRV9XT1JLKGF1dG9sb2FkX3dvcmssIGNhbGxfYXV0b2xvYWQpOwotCi1zdGF0aWMgdm9pZCB0cnlfYXV0b2xvYWQoc3RydWN0IG9wc19saXN0ICpvcHMpCi17Ci0JaWYgKCFvcHMtPmRyaXZlcikgewotCQlvcHMtPmRyaXZlciB8PSBEUklWRVJfUkVRVUVTVElORzsKLQkJc2NoZWR1bGVfd29yaygmYXV0b2xvYWRfd29yayk7Ci0JfQotfQorc3RhdGljIERFQ0xBUkVfV09SSyhhdXRvbG9hZF93b3JrLCBhdXRvbG9hZF9kcml2ZXJzKTsKIAogc3RhdGljIHZvaWQgcXVldWVfYXV0b2xvYWRfZHJpdmVycyh2b2lkKQogewotCXN0cnVjdCBvcHNfbGlzdCAqb3BzOwotCi0JbXV0ZXhfbG9jaygmb3BzX211dGV4KTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wcywgJm9wc2xpc3QsIGxpc3QpCi0JCXRyeV9hdXRvbG9hZChvcHMpOwotCW11dGV4X3VubG9jaygmb3BzX211dGV4KTsKKwlzY2hlZHVsZV93b3JrKCZhdXRvbG9hZF93b3JrKTsKIH0KIAogdm9pZCBzbmRfc2VxX2F1dG9sb2FkX2luaXQodm9pZCkKQEAgLTE5NSwxNiArMTM0LDYzIEBACiAJcXVldWVfYXV0b2xvYWRfZHJpdmVycygpOwogI2VuZGlmCiB9Ci0jZWxzZQotI2RlZmluZSB0cnlfYXV0b2xvYWQob3BzKSAvKiBOT1AgKi8KLSNlbmRpZgorRVhQT1JUX1NZTUJPTChzbmRfc2VxX2F1dG9sb2FkX2luaXQpOworCit2b2lkIHNuZF9zZXFfYXV0b2xvYWRfZXhpdCh2b2lkKQoreworCWF0b21pY19pbmMoJnNuZF9zZXFfaW5faW5pdCk7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF9zZXFfYXV0b2xvYWRfZXhpdCk7CiAKIHZvaWQgc25kX3NlcV9kZXZpY2VfbG9hZF9kcml2ZXJzKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX01PRFVMRVMKIAlxdWV1ZV9hdXRvbG9hZF9kcml2ZXJzKCk7CiAJZmx1c2hfd29yaygmYXV0b2xvYWRfd29yayk7Cit9CitFWFBPUlRfU1lNQk9MKHNuZF9zZXFfZGV2aWNlX2xvYWRfZHJpdmVycyk7CisjZWxzZQorI2RlZmluZSBxdWV1ZV9hdXRvbG9hZF9kcml2ZXJzKCkgLyogTk9QICovCiAjZW5kaWYKKworLyoKKyAqIGRldmljZSBtYW5hZ2VtZW50CisgKi8KK3N0YXRpYyBpbnQgc25kX3NlcV9kZXZpY2VfZGV2X2ZyZWUoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldiA9IGRldmljZS0+ZGV2aWNlX2RhdGE7CisKKwlwdXRfZGV2aWNlKCZkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NlcV9kZXZpY2VfZGV2X3JlZ2lzdGVyKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCWludCBlcnI7CisKKwllcnIgPSBkZXZpY2VfYWRkKCZkZXYtPmRldik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJaWYgKCFkZXYtPmRldi5kcml2ZXIpCisJCXF1ZXVlX2F1dG9sb2FkX2RyaXZlcnMoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfc2VxX2RldmljZV9kZXZfZGlzY29ubmVjdChzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2ID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKKworCWRldmljZV9kZWwoJmRldi0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc25kX3NlcV9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNuZF9zZXFfZGV2aWNlICpzZGV2ID0gdG9fc2VxX2RldihkZXYpOworCisJaWYgKHNkZXYtPnByaXZhdGVfZnJlZSkKKwkJc2Rldi0+cHJpdmF0ZV9mcmVlKHNkZXYpOworCWtmcmVlKHNkZXYpOwogfQogCiAvKgpAQCAtMjE0LDExICsyMDAsMTAgQEAKICAqIGlkID0gaWQgb2YgZHJpdmVyCiAgKiByZXN1bHQgPSByZXR1cm4gcG9pbnRlciAoTlVMTCBhbGxvd2VkIGlmIHVubmVjZXNzYXJ5KQogICovCi1pbnQgc25kX3NlcV9kZXZpY2VfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldmljZSwgY2hhciAqaWQsIGludCBhcmdzaXplLAotCQkgICAgICAgc3RydWN0IHNuZF9zZXFfZGV2aWNlICoqcmVzdWx0KQoraW50IHNuZF9zZXFfZGV2aWNlX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXZpY2UsIGNvbnN0IGNoYXIgKmlkLAorCQkgICAgICAgaW50IGFyZ3NpemUsIHN0cnVjdCBzbmRfc2VxX2RldmljZSAqKnJlc3VsdCkKIHsKIAlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgb3BzX2xpc3QgKm9wczsKIAlpbnQgZXJyOwogCXN0YXRpYyBzdHJ1Y3Qgc25kX2RldmljZV9vcHMgZG9wcyA9IHsKIAkJLmRldl9mcmVlID0gc25kX3NlcV9kZXZpY2VfZGV2X2ZyZWUsCkBAIC0yMzIsMzQ3ICsyMTcsNjAgQEAKIAlpZiAoc25kX0JVR19PTighaWQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW9wcyA9IGZpbmRfZHJpdmVyKGlkLCAxKTsKLQlpZiAob3BzID09IE5VTEwpCisJZGV2ID0ga3phbGxvYyhzaXplb2YoKmRldikgKyBhcmdzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRldikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkZXYgPSBremFsbG9jKHNpemVvZigqZGV2KSoyICsgYXJnc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGRldiA9PSBOVUxMKSB7Ci0JCXVubG9ja19kcml2ZXIob3BzKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCiAJLyogc2V0IHVwIGRldmljZSBpbmZvICovCiAJZGV2LT5jYXJkID0gY2FyZDsKIAlkZXYtPmRldmljZSA9IGRldmljZTsKLQlzdHJsY3B5KGRldi0+aWQsIGlkLCBzaXplb2YoZGV2LT5pZCkpOworCWRldi0+aWQgPSBpZDsKIAlkZXYtPmFyZ3NpemUgPSBhcmdzaXplOwotCWRldi0+c3RhdHVzID0gU05EUlZfU0VRX0RFVklDRV9GUkVFOworCisJZGV2aWNlX2luaXRpYWxpemUoJmRldi0+ZGV2KTsKKwlkZXYtPmRldi5wYXJlbnQgPSAmY2FyZC0+Y2FyZF9kZXY7CisJZGV2LT5kZXYuYnVzID0gJnNuZF9zZXFfYnVzX3R5cGU7CisJZGV2LT5kZXYucmVsZWFzZSA9IHNuZF9zZXFfZGV2X3JlbGVhc2U7CisJZGV2X3NldF9uYW1lKCZkZXYtPmRldiwgIiVzLSVkLSVkIiwgZGV2LT5pZCwgY2FyZC0+bnVtYmVyLCBkZXZpY2UpOwogCiAJLyogYWRkIHRoaXMgZGV2aWNlIHRvIHRoZSBsaXN0ICovCi0JbXV0ZXhfbG9jaygmb3BzLT5yZWdfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJmRldi0+bGlzdCwgJm9wcy0+ZGV2X2xpc3QpOwotCW9wcy0+bnVtX2RldmljZXMrKzsKLQltdXRleF91bmxvY2soJm9wcy0+cmVnX211dGV4KTsKLQotCWlmICgoZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX1NFUVVFTkNFUiwgZGV2LCAmZG9wcykpIDwgMCkgewotCQlzbmRfc2VxX2RldmljZV9mcmVlKGRldik7CisJZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX1NFUVVFTkNFUiwgZGV2LCAmZG9wcyk7CisJaWYgKGVyciA8IDApIHsKKwkJcHV0X2RldmljZSgmZGV2LT5kZXYpOwogCQlyZXR1cm4gZXJyOwogCX0KIAkKLQl0cnlfYXV0b2xvYWQob3BzKTsKLQl1bmxvY2tfZHJpdmVyKG9wcyk7Ci0KIAlpZiAocmVzdWx0KQogCQkqcmVzdWx0ID0gZGV2OwogCiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKHNuZF9zZXFfZGV2aWNlX25ldyk7CiAKIC8qCi0gKiBmcmVlIHRoZSBleGlzdGluZyBkZXZpY2UKKyAqIGRyaXZlciByZWdpc3RyYXRpb24KICAqLwotc3RhdGljIGludCBzbmRfc2VxX2RldmljZV9mcmVlKHN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2KQoraW50IF9fc25kX3NlcV9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IHNuZF9zZXFfZHJpdmVyICpkcnYsIHN0cnVjdCBtb2R1bGUgKm1vZCkKIHsKLQlzdHJ1Y3Qgb3BzX2xpc3QgKm9wczsKLQotCWlmIChzbmRfQlVHX09OKCFkZXYpKQorCWlmIChXQVJOX09OKCFkcnYtPmRyaXZlci5uYW1lIHx8ICFkcnYtPmlkKSkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlvcHMgPSBmaW5kX2RyaXZlcihkZXYtPmlkLCAwKTsKLQlpZiAob3BzID09IE5VTEwpCi0JCXJldHVybiAtRU5YSU87Ci0KLQkvKiByZW1vdmUgdGhlIGRldmljZSBmcm9tIHRoZSBsaXN0ICovCi0JbXV0ZXhfbG9jaygmb3BzLT5yZWdfbXV0ZXgpOwotCWxpc3RfZGVsKCZkZXYtPmxpc3QpOwotCW9wcy0+bnVtX2RldmljZXMtLTsKLQltdXRleF91bmxvY2soJm9wcy0+cmVnX211dGV4KTsKLQotCWZyZWVfZGV2aWNlKGRldiwgb3BzKTsKLQlpZiAoZGV2LT5wcml2YXRlX2ZyZWUpCi0JCWRldi0+cHJpdmF0ZV9mcmVlKGRldik7Ci0Ja2ZyZWUoZGV2KTsKLQotCXVubG9ja19kcml2ZXIob3BzKTsKLQotCXJldHVybiAwOworCWRydi0+ZHJpdmVyLmJ1cyA9ICZzbmRfc2VxX2J1c190eXBlOworCWRydi0+ZHJpdmVyLm93bmVyID0gbW9kOworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKF9fc25kX3NlcV9kcml2ZXJfcmVnaXN0ZXIpOwogCi1zdGF0aWMgaW50IHNuZF9zZXFfZGV2aWNlX2Rldl9mcmVlKHN0cnVjdCBzbmRfZGV2aWNlICpkZXZpY2UpCit2b2lkIHNuZF9zZXFfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IHNuZF9zZXFfZHJpdmVyICpkcnYpCiB7Ci0Jc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYgPSBkZXZpY2UtPmRldmljZV9kYXRhOwotCXJldHVybiBzbmRfc2VxX2RldmljZV9mcmVlKGRldik7CisJZHJpdmVyX3VucmVnaXN0ZXIoJmRydi0+ZHJpdmVyKTsKIH0KLQotLyoKLSAqIHJlZ2lzdGVyIHRoZSBkZXZpY2UKLSAqLwotc3RhdGljIGludCBzbmRfc2VxX2RldmljZV9kZXZfcmVnaXN0ZXIoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKLXsKLQlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldiA9IGRldmljZS0+ZGV2aWNlX2RhdGE7Ci0Jc3RydWN0IG9wc19saXN0ICpvcHM7Ci0KLQlvcHMgPSBmaW5kX2RyaXZlcihkZXYtPmlkLCAwKTsKLQlpZiAob3BzID09IE5VTEwpCi0JCXJldHVybiAtRU5PRU5UOwotCi0JLyogaW5pdGlhbGl6ZSB0aGlzIGRldmljZSBpZiB0aGUgY29ycmVzcG9uZGluZyBkcml2ZXIgd2FzCi0JICogYWxyZWFkeSBsb2FkZWQKLQkgKi8KLQlpZiAob3BzLT5kcml2ZXIgJiBEUklWRVJfTE9BREVEKQotCQlpbml0X2RldmljZShkZXYsIG9wcyk7Ci0KLQl1bmxvY2tfZHJpdmVyKG9wcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBkaXNjb25uZWN0IHRoZSBkZXZpY2UKLSAqLwotc3RhdGljIGludCBzbmRfc2VxX2RldmljZV9kZXZfZGlzY29ubmVjdChzdHJ1Y3Qgc25kX2RldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2ID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKLQlzdHJ1Y3Qgb3BzX2xpc3QgKm9wczsKLQotCW9wcyA9IGZpbmRfZHJpdmVyKGRldi0+aWQsIDApOwotCWlmIChvcHMgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQlmcmVlX2RldmljZShkZXYsIG9wcyk7Ci0KLQl1bmxvY2tfZHJpdmVyKG9wcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiByZWdpc3RlciBkZXZpY2UgZHJpdmVyCi0gKiBpZCA9IGRyaXZlciBpZAotICogZW50cnkgPSBkcml2ZXIgb3BlcmF0b3JzIC0gZHVwbGljYXRlZCB0byBlYWNoIGluc3RhbmNlCi0gKi8KLWludCBzbmRfc2VxX2RldmljZV9yZWdpc3Rlcl9kcml2ZXIoY2hhciAqaWQsIHN0cnVjdCBzbmRfc2VxX2Rldl9vcHMgKmVudHJ5LAotCQkJCSAgIGludCBhcmdzaXplKQotewotCXN0cnVjdCBvcHNfbGlzdCAqb3BzOwotCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2OwotCi0JaWYgKGlkID09IE5VTEwgfHwgZW50cnkgPT0gTlVMTCB8fAotCSAgICBlbnRyeS0+aW5pdF9kZXZpY2UgPT0gTlVMTCB8fCBlbnRyeS0+ZnJlZV9kZXZpY2UgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlvcHMgPSBmaW5kX2RyaXZlcihpZCwgMSk7Ci0JaWYgKG9wcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAob3BzLT5kcml2ZXIgJiBEUklWRVJfTE9BREVEKSB7Ci0JCXByX3dhcm4oIkFMU0E6IHNlcTogZHJpdmVyX3JlZ2lzdGVyOiBkcml2ZXIgJyVzJyBhbHJlYWR5IGV4aXN0c1xuIiwgaWQpOwotCQl1bmxvY2tfZHJpdmVyKG9wcyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JbXV0ZXhfbG9jaygmb3BzLT5yZWdfbXV0ZXgpOwotCS8qIGNvcHkgZHJpdmVyIG9wZXJhdG9ycyAqLwotCW9wcy0+b3BzID0gKmVudHJ5OwotCW9wcy0+ZHJpdmVyIHw9IERSSVZFUl9MT0FERUQ7Ci0Jb3BzLT5hcmdzaXplID0gYXJnc2l6ZTsKLQotCS8qIGluaXRpYWxpemUgZXhpc3RpbmcgZGV2aWNlcyBpZiBuZWNlc3NhcnkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJm9wcy0+ZGV2X2xpc3QsIGxpc3QpIHsKLQkJaW5pdF9kZXZpY2UoZGV2LCBvcHMpOwotCX0KLQltdXRleF91bmxvY2soJm9wcy0+cmVnX211dGV4KTsKLQotCXVubG9ja19kcml2ZXIob3BzKTsKLQotCXJldHVybiAwOwotfQotCi0KLS8qCi0gKiBjcmVhdGUgZHJpdmVyIHJlY29yZAotICovCi1zdGF0aWMgc3RydWN0IG9wc19saXN0ICogY3JlYXRlX2RyaXZlcihjaGFyICppZCkKLXsKLQlzdHJ1Y3Qgb3BzX2xpc3QgKm9wczsKLQotCW9wcyA9IGt6YWxsb2Moc2l6ZW9mKCpvcHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAob3BzID09IE5VTEwpCi0JCXJldHVybiBvcHM7Ci0KLQkvKiBzZXQgdXAgZHJpdmVyIGVudHJ5ICovCi0Jc3RybGNweShvcHMtPmlkLCBpZCwgc2l6ZW9mKG9wcy0+aWQpKTsKLQltdXRleF9pbml0KCZvcHMtPnJlZ19tdXRleCk7Ci0JLyoKLQkgKiBUaGUgLT5yZWdfbXV0ZXggbG9ja2luZyBydWxlcyBhcmUgcGVyLWRyaXZlciwgc28gd2UgY3JlYXRlCi0JICogc2VwYXJhdGUgcGVyLWRyaXZlciBsb2NrIGNsYXNzZXM6Ci0JICovCi0JbG9ja2RlcF9zZXRfY2xhc3MoJm9wcy0+cmVnX211dGV4LCAoc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICopaWQpOwotCi0Jb3BzLT5kcml2ZXIgPSBEUklWRVJfRU1QVFk7Ci0JSU5JVF9MSVNUX0hFQUQoJm9wcy0+ZGV2X2xpc3QpOwotCS8qIGxvY2sgdGhpcyBpbnN0YW5jZSAqLwotCW9wcy0+dXNlZCA9IDE7Ci0KLQkvKiByZWdpc3RlciBkcml2ZXIgZW50cnkgKi8KLQltdXRleF9sb2NrKCZvcHNfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJm9wcy0+bGlzdCwgJm9wc2xpc3QpOwotCW51bV9vcHMrKzsKLQltdXRleF91bmxvY2soJm9wc19tdXRleCk7Ci0KLQlyZXR1cm4gb3BzOwotfQotCi0KLS8qCi0gKiB1bnJlZ2lzdGVyIHRoZSBzcGVjaWZpZWQgZHJpdmVyCi0gKi8KLWludCBzbmRfc2VxX2RldmljZV91bnJlZ2lzdGVyX2RyaXZlcihjaGFyICppZCkKLXsKLQlzdHJ1Y3Qgb3BzX2xpc3QgKm9wczsKLQlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldjsKLQotCW9wcyA9IGZpbmRfZHJpdmVyKGlkLCAwKTsKLQlpZiAob3BzID09IE5VTEwpCi0JCXJldHVybiAtRU5YSU87Ci0JaWYgKCEgKG9wcy0+ZHJpdmVyICYgRFJJVkVSX0xPQURFRCkgfHwKLQkgICAgKG9wcy0+ZHJpdmVyICYgRFJJVkVSX0xPQ0tFRCkpIHsKLQkJcHJfZXJyKCJBTFNBOiBzZXE6IGRyaXZlcl91bnJlZ2lzdGVyOiBjYW5ub3QgdW5sb2FkIGRyaXZlciAnJXMnOiBzdGF0dXM9JXhcbiIsCi0JCQkgICBpZCwgb3BzLT5kcml2ZXIpOwotCQl1bmxvY2tfZHJpdmVyKG9wcyk7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JLyogY2xvc2UgYW5kIHJlbGVhc2UgYWxsIGRldmljZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZHJpdmVyICovCi0JbXV0ZXhfbG9jaygmb3BzLT5yZWdfbXV0ZXgpOwotCW9wcy0+ZHJpdmVyIHw9IERSSVZFUl9MT0NLRUQ7IC8qIGRvIG5vdCByZW1vdmUgdGhpcyBkcml2ZXIgcmVjdXJzaXZlbHkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJm9wcy0+ZGV2X2xpc3QsIGxpc3QpIHsKLQkJZnJlZV9kZXZpY2UoZGV2LCBvcHMpOwotCX0KLQotCW9wcy0+ZHJpdmVyID0gMDsKLQlpZiAob3BzLT5udW1faW5pdF9kZXZpY2VzID4gMCkKLQkJcHJfZXJyKCJBTFNBOiBzZXE6IGZyZWVfZHJpdmVyOiBpbml0X2RldmljZXMgPiAwISEgKCVkKVxuIiwKLQkJCSAgIG9wcy0+bnVtX2luaXRfZGV2aWNlcyk7Ci0JbXV0ZXhfdW5sb2NrKCZvcHMtPnJlZ19tdXRleCk7Ci0KLQl1bmxvY2tfZHJpdmVyKG9wcyk7Ci0KLQkvKiByZW1vdmUgZW1wdHkgZHJpdmVyIGVudHJpZXMgKi8KLQlyZW1vdmVfZHJpdmVycygpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoKLSAqIHJlbW92ZSBlbXB0eSBkcml2ZXIgZW50cmllcwotICovCi1zdGF0aWMgdm9pZCByZW1vdmVfZHJpdmVycyh2b2lkKQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7Ci0KLQltdXRleF9sb2NrKCZvcHNfbXV0ZXgpOwotCWhlYWQgPSBvcHNsaXN0Lm5leHQ7Ci0Jd2hpbGUgKGhlYWQgIT0gJm9wc2xpc3QpIHsKLQkJc3RydWN0IG9wc19saXN0ICpvcHMgPSBsaXN0X2VudHJ5KGhlYWQsIHN0cnVjdCBvcHNfbGlzdCwgbGlzdCk7Ci0JCWlmICghIChvcHMtPmRyaXZlciAmIERSSVZFUl9MT0FERUQpICYmCi0JCSAgICBvcHMtPnVzZWQgPT0gMCAmJiBvcHMtPm51bV9kZXZpY2VzID09IDApIHsKLQkJCWhlYWQgPSBoZWFkLT5uZXh0OwotCQkJbGlzdF9kZWwoJm9wcy0+bGlzdCk7Ci0JCQlrZnJlZShvcHMpOwotCQkJbnVtX29wcy0tOwotCQl9IGVsc2UKLQkJCWhlYWQgPSBoZWFkLT5uZXh0OwotCX0KLQltdXRleF91bmxvY2soJm9wc19tdXRleCk7Ci19Ci0KLS8qCi0gKiBpbml0aWFsaXplIHRoZSBkZXZpY2UgLSBjYWxsIGluaXRfZGV2aWNlIG9wZXJhdG9yCi0gKi8KLXN0YXRpYyBpbnQgaW5pdF9kZXZpY2Uoc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYsIHN0cnVjdCBvcHNfbGlzdCAqb3BzKQotewotCWlmICghIChvcHMtPmRyaXZlciAmIERSSVZFUl9MT0FERUQpKQotCQlyZXR1cm4gMDsgLyogZHJpdmVyIGlzIG5vdCBsb2FkZWQgeWV0ICovCi0JaWYgKGRldi0+c3RhdHVzICE9IFNORFJWX1NFUV9ERVZJQ0VfRlJFRSkKLQkJcmV0dXJuIDA7IC8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KLQlpZiAob3BzLT5hcmdzaXplICE9IGRldi0+YXJnc2l6ZSkgewotCQlwcl9lcnIoIkFMU0E6IHNlcTogaW5jb21wYXRpYmxlIGRldmljZSAnJXMnIGZvciBwbHVnLWluICclcycgKCVkICVkKVxuIiwKLQkJCSAgIGRldi0+bmFtZSwgb3BzLT5pZCwgb3BzLT5hcmdzaXplLCBkZXYtPmFyZ3NpemUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKG9wcy0+b3BzLmluaXRfZGV2aWNlKGRldikgPj0gMCkgewotCQlkZXYtPnN0YXR1cyA9IFNORFJWX1NFUV9ERVZJQ0VfUkVHSVNURVJFRDsKLQkJb3BzLT5udW1faW5pdF9kZXZpY2VzKys7Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJBTFNBOiBzZXE6IGluaXRfZGV2aWNlIGZhaWxlZDogJXM6ICVzXG4iLAotCQkJICAgZGV2LT5uYW1lLCBkZXYtPmlkKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHJlbGVhc2UgdGhlIGRldmljZSAtIGNhbGwgZnJlZV9kZXZpY2Ugb3BlcmF0b3IKLSAqLwotc3RhdGljIGludCBmcmVlX2RldmljZShzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldiwgc3RydWN0IG9wc19saXN0ICpvcHMpCi17Ci0JaW50IHJlc3VsdDsKLQotCWlmICghIChvcHMtPmRyaXZlciAmIERSSVZFUl9MT0FERUQpKQotCQlyZXR1cm4gMDsgLyogZHJpdmVyIGlzIG5vdCBsb2FkZWQgeWV0ICovCi0JaWYgKGRldi0+c3RhdHVzICE9IFNORFJWX1NFUV9ERVZJQ0VfUkVHSVNURVJFRCkKLQkJcmV0dXJuIDA7IC8qIG5vdCByZWdpc3RlcmVkICovCi0JaWYgKG9wcy0+YXJnc2l6ZSAhPSBkZXYtPmFyZ3NpemUpIHsKLQkJcHJfZXJyKCJBTFNBOiBzZXE6IGluY29tcGF0aWJsZSBkZXZpY2UgJyVzJyBmb3IgcGx1Zy1pbiAnJXMnICglZCAlZClcbiIsCi0JCQkgICBkZXYtPm5hbWUsIG9wcy0+aWQsIG9wcy0+YXJnc2l6ZSwgZGV2LT5hcmdzaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCWlmICgocmVzdWx0ID0gb3BzLT5vcHMuZnJlZV9kZXZpY2UoZGV2KSkgPj0gMCB8fCByZXN1bHQgPT0gLUVOWElPKSB7Ci0JCWRldi0+c3RhdHVzID0gU05EUlZfU0VRX0RFVklDRV9GUkVFOwotCQlkZXYtPmRyaXZlcl9kYXRhID0gTlVMTDsKLQkJb3BzLT5udW1faW5pdF9kZXZpY2VzLS07Ci0JfSBlbHNlIHsKLQkJcHJfZXJyKCJBTFNBOiBzZXE6IGZyZWVfZGV2aWNlIGZhaWxlZDogJXM6ICVzXG4iLAotCQkJICAgZGV2LT5uYW1lLCBkZXYtPmlkKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGZpbmQgdGhlIG1hdGNoaW5nIGRyaXZlciB3aXRoIGdpdmVuIGlkCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgb3BzX2xpc3QgKiBmaW5kX2RyaXZlcihjaGFyICppZCwgaW50IGNyZWF0ZV9pZl9lbXB0eSkKLXsKLQlzdHJ1Y3Qgb3BzX2xpc3QgKm9wczsKLQotCW11dGV4X2xvY2soJm9wc19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZvcHNsaXN0LCBsaXN0KSB7Ci0JCWlmIChzdHJjbXAob3BzLT5pZCwgaWQpID09IDApIHsKLQkJCW9wcy0+dXNlZCsrOwotCQkJbXV0ZXhfdW5sb2NrKCZvcHNfbXV0ZXgpOwotCQkJcmV0dXJuIG9wczsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJm9wc19tdXRleCk7Ci0JaWYgKGNyZWF0ZV9pZl9lbXB0eSkKLQkJcmV0dXJuIGNyZWF0ZV9kcml2ZXIoaWQpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCB1bmxvY2tfZHJpdmVyKHN0cnVjdCBvcHNfbGlzdCAqb3BzKQotewotCW11dGV4X2xvY2soJm9wc19tdXRleCk7Ci0Jb3BzLT51c2VkLS07Ci0JbXV0ZXhfdW5sb2NrKCZvcHNfbXV0ZXgpOwotfQotCitFWFBPUlRfU1lNQk9MX0dQTChzbmRfc2VxX2RyaXZlcl91bnJlZ2lzdGVyKTsKIAogLyoKICAqIG1vZHVsZSBwYXJ0CiAgKi8KIAotc3RhdGljIGludCBfX2luaXQgYWxzYV9zZXFfZGV2aWNlX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHNlcV9kZXZfcHJvY19pbml0KHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlpbmZvX2VudHJ5ID0gc25kX2luZm9fY3JlYXRlX21vZHVsZV9lbnRyeShUSElTX01PRFVMRSwgImRyaXZlcnMiLApAQCAtNTg5LDI4ICsyODcsMjkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBfX2luaXQgYWxzYV9zZXFfZGV2aWNlX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gYnVzX3JlZ2lzdGVyKCZzbmRfc2VxX2J1c190eXBlKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBzZXFfZGV2X3Byb2NfaW5pdCgpOworCWlmIChlcnIgPCAwKQorCQlidXNfdW5yZWdpc3Rlcigmc25kX3NlcV9idXNfdHlwZSk7CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIHZvaWQgX19leGl0IGFsc2Ffc2VxX2RldmljZV9leGl0KHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX01PRFVMRVMKIAljYW5jZWxfd29ya19zeW5jKCZhdXRvbG9hZF93b3JrKTsKICNlbmRpZgotCXJlbW92ZV9kcml2ZXJzKCk7CiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIAlzbmRfaW5mb19mcmVlX2VudHJ5KGluZm9fZW50cnkpOwogI2VuZGlmCi0JaWYgKG51bV9vcHMpCi0JCXByX2VycigiQUxTQTogc2VxOiBkcml2ZXJzIG5vdCByZWxlYXNlZCAoJWQpXG4iLCBudW1fb3BzKTsKKwlidXNfdW5yZWdpc3Rlcigmc25kX3NlcV9idXNfdHlwZSk7CiB9CiAKLW1vZHVsZV9pbml0KGFsc2Ffc2VxX2RldmljZV9pbml0KQorc3Vic3lzX2luaXRjYWxsKGFsc2Ffc2VxX2RldmljZV9pbml0KQogbW9kdWxlX2V4aXQoYWxzYV9zZXFfZGV2aWNlX2V4aXQpCi0KLUVYUE9SVF9TWU1CT0woc25kX3NlcV9kZXZpY2VfbG9hZF9kcml2ZXJzKTsKLUVYUE9SVF9TWU1CT0woc25kX3NlcV9kZXZpY2VfbmV3KTsKLUVYUE9SVF9TWU1CT0woc25kX3NlcV9kZXZpY2VfcmVnaXN0ZXJfZHJpdmVyKTsKLUVYUE9SVF9TWU1CT0woc25kX3NlcV9kZXZpY2VfdW5yZWdpc3Rlcl9kcml2ZXIpOwotI2lmZGVmIENPTkZJR19NT0RVTEVTCi1FWFBPUlRfU1lNQk9MKHNuZF9zZXFfYXV0b2xvYWRfaW5pdCk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9zZXFfYXV0b2xvYWRfbG9jayk7Ci1FWFBPUlRfU1lNQk9MKHNuZF9zZXFfYXV0b2xvYWRfdW5sb2NrKTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2R1bW15LmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYwppbmRleCA1ZDkwNWQ5Li5kM2EyZWM0IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZHVtbXkuYwpAQCAtMjE0LDExICsyMTQsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBhbHNhX3NlcV9kdW1teV9pbml0KHZvaWQpCiB7Ci0JaW50IGVycjsKLQlzbmRfc2VxX2F1dG9sb2FkX2xvY2soKTsKLQllcnIgPSByZWdpc3Rlcl9jbGllbnQoKTsKLQlzbmRfc2VxX2F1dG9sb2FkX3VubG9jaygpOwotCXJldHVybiBlcnI7CisJcmV0dXJuIHJlZ2lzdGVyX2NsaWVudCgpOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9zZXFfZHVtbXlfZXhpdCh2b2lkKQpkaWZmIC0tZ2l0IGEvc291bmQvY29yZS9zZXEvc2VxX2ZpZm8uYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9maWZvLmMKaW5kZXggNTNhNDAzZS4uMWQ1YWNiZSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX2ZpZm8uYworKysgYi9zb3VuZC9jb3JlL3NlcS9zZXFfZmlmby5jCkBAIC0zMywxMCArMzMsOCBAQAogCXN0cnVjdCBzbmRfc2VxX2ZpZm8gKmY7CiAKIAlmID0ga3phbGxvYyhzaXplb2YoKmYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZiA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmYWlsZWQgZm9yIHNuZF9zZXFfZmlmb19uZXcoKSBcbiIpOworCWlmICghZikKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJZi0+cG9vbCA9IHNuZF9zZXFfcG9vbF9uZXcocG9vbHNpemUpOwogCWlmIChmLT5wb29sID09IE5VTEwpIHsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9tZW1vcnkuYwppbmRleCBiYThlNGE2Li44MDEwNzY2IDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NlcS9zZXFfbWVtb3J5LmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX21lbW9yeS5jCkBAIC0zODcsMTAgKzM4Nyw4IEBACiAJCXJldHVybiAwOwogCiAJcG9vbC0+cHRyID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IHNuZF9zZXFfZXZlbnRfY2VsbCkgKiBwb29sLT5zaXplKTsKLQlpZiAocG9vbC0+cHRyID09IE5VTEwpIHsKLQkJcHJfZGVidWcoIkFMU0E6IHNlcTogbWFsbG9jIGZvciBzZXF1ZW5jZXIgZXZlbnRzIGZhaWxlZFxuIik7CisJaWYgKCFwb29sLT5wdHIpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCS8qIGFkZCBuZXcgY2VsbHMgdG8gdGhlIGZyZWUgY2VsbCBsaXN0ICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGZsYWdzKTsKQEAgLTQ2MywxMCArNDYxLDggQEAKIAogCS8qIGNyZWF0ZSBwb29sIGJsb2NrICovCiAJcG9vbCA9IGt6YWxsb2Moc2l6ZW9mKCpwb29sKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBvb2wgPT0gTlVMTCkgewotCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBtYWxsb2MgZmFpbGVkIGZvciBwb29sXG4iKTsKKwlpZiAoIXBvb2wpCiAJCXJldHVybiBOVUxMOwotCX0KIAlzcGluX2xvY2tfaW5pdCgmcG9vbC0+bG9jayk7CiAJcG9vbC0+cHRyID0gTlVMTDsKIAlwb29sLT5mcmVlID0gTlVMTDsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpLmMgYi9zb3VuZC9jb3JlL3NlcS9zZXFfbWlkaS5jCmluZGV4IDY4ZmVjNzcuLjVkZDBlZTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9taWRpLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX21pZGkuYwpAQCAtMjczLDggKzI3Myw5IEBACiAKIC8qIHJlZ2lzdGVyIG5ldyBtaWRpIHN5bnRoIHBvcnQgKi8KIHN0YXRpYyBpbnQKLXNuZF9zZXFfbWlkaXN5bnRoX3JlZ2lzdGVyX3BvcnQoc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYpCitzbmRfc2VxX21pZGlzeW50aF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogeworCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2ID0gdG9fc2VxX2RldihfZGV2KTsKIAlzdHJ1Y3Qgc2VxX21pZGlzeW50aF9jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3Qgc2VxX21pZGlzeW50aCAqbXN5bnRoLCAqbXM7CiAJc3RydWN0IHNuZF9zZXFfcG9ydF9pbmZvICpwb3J0OwpAQCAtNDI3LDggKzQyOCw5IEBACiAKIC8qIHJlbGVhc2UgbWlkaSBzeW50aCBwb3J0ICovCiBzdGF0aWMgaW50Ci1zbmRfc2VxX21pZGlzeW50aF91bnJlZ2lzdGVyX3BvcnQoc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYpCitzbmRfc2VxX21pZGlzeW50aF9yZW1vdmUoc3RydWN0IGRldmljZSAqX2RldikKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldiA9IHRvX3NlcV9kZXYoX2Rldik7CiAJc3RydWN0IHNlcV9taWRpc3ludGhfY2xpZW50ICpjbGllbnQ7CiAJc3RydWN0IHNlcV9taWRpc3ludGggKm1zeW50aDsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXYtPmNhcmQ7CkBAIC00NTcsMjQgKzQ1OSwxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IHNuZF9zZXFfZHJpdmVyIHNlcV9taWRpc3ludGhfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJCS5wcm9iZSA9IHNuZF9zZXFfbWlkaXN5bnRoX3Byb2JlLAorCQkucmVtb3ZlID0gc25kX3NlcV9taWRpc3ludGhfcmVtb3ZlLAorCX0sCisJLmlkID0gU05EUlZfU0VRX0RFVl9JRF9NSURJU1lOVEgsCisJLmFyZ3NpemUgPSAwLAorfTsKIAotc3RhdGljIGludCBfX2luaXQgYWxzYV9zZXFfbWlkaV9pbml0KHZvaWQpCi17Ci0Jc3RhdGljIHN0cnVjdCBzbmRfc2VxX2Rldl9vcHMgb3BzID0gewotCQlzbmRfc2VxX21pZGlzeW50aF9yZWdpc3Rlcl9wb3J0LAotCQlzbmRfc2VxX21pZGlzeW50aF91bnJlZ2lzdGVyX3BvcnQsCi0JfTsKLQltZW1zZXQoJnN5bnRocywgMCwgc2l6ZW9mKHN5bnRocykpOwotCXNuZF9zZXFfYXV0b2xvYWRfbG9jaygpOwotCXNuZF9zZXFfZGV2aWNlX3JlZ2lzdGVyX2RyaXZlcihTTkRSVl9TRVFfREVWX0lEX01JRElTWU5USCwgJm9wcywgMCk7Ci0Jc25kX3NlcV9hdXRvbG9hZF91bmxvY2soKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFsc2Ffc2VxX21pZGlfZXhpdCh2b2lkKQotewotCXNuZF9zZXFfZGV2aWNlX3VucmVnaXN0ZXJfZHJpdmVyKFNORFJWX1NFUV9ERVZfSURfTUlESVNZTlRIKTsKLX0KLQotbW9kdWxlX2luaXQoYWxzYV9zZXFfbWlkaV9pbml0KQotbW9kdWxlX2V4aXQoYWxzYV9zZXFfbWlkaV9leGl0KQorbW9kdWxlX3NuZF9zZXFfZHJpdmVyKHNlcV9taWRpc3ludGhfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV9wb3J0cy5jIGIvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMKaW5kZXggNDZmZjU5My4uNTUxNzBhMiAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3BvcnRzLmMKQEAgLTE0MSwxMCArMTQxLDggQEAKIAogCS8qIGNyZWF0ZSBhIG5ldyBwb3J0ICovCiAJbmV3X3BvcnQgPSBremFsbG9jKHNpemVvZigqbmV3X3BvcnQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoISBuZXdfcG9ydCkgewotCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBtYWxsb2MgZmFpbGVkIGZvciByZWdpc3RlcmluZyBjbGllbnQgcG9ydFxuIik7CisJaWYgKCFuZXdfcG9ydCkKIAkJcmV0dXJuIE5VTEw7CS8qIGZhaWx1cmUsIG91dCBvZiBtZW1vcnkgKi8KLQl9CiAJLyogaW5pdCBwb3J0IGRhdGEgKi8KIAluZXdfcG9ydC0+YWRkci5jbGllbnQgPSBjbGllbnQtPm51bWJlcjsKIAluZXdfcG9ydC0+YWRkci5wb3J0ID0gLTE7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfcHJpb3EuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9wcmlvcS5jCmluZGV4IDAyMWIwMmIuLmJjMWM4NDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9wcmlvcS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9wcmlvcS5jCkBAIC01OSwxMCArNTksOCBAQAogCXN0cnVjdCBzbmRfc2VxX3ByaW9xICpmOwogCiAJZiA9IGt6YWxsb2Moc2l6ZW9mKCpmKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGYgPT0gTlVMTCkgewotCQlwcl9kZWJ1ZygiQUxTQTogc2VxOiBtYWxsb2MgZmFpbGVkIGZvciBzbmRfc2VxX3ByaW9xX25ldygpXG4iKTsKKwlpZiAoIWYpCiAJCXJldHVybiBOVUxMOwotCX0KIAkKIAlzcGluX2xvY2tfaW5pdCgmZi0+bG9jayk7CiAJZi0+aGVhZCA9IE5VTEw7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3NlcS9zZXFfcXVldWUuYyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9xdWV1ZS5jCmluZGV4IGFhZDQ4NzguLmEwY2RhMzggMTAwNjQ0Ci0tLSBhL3NvdW5kL2NvcmUvc2VxL3NlcV9xdWV1ZS5jCisrKyBiL3NvdW5kL2NvcmUvc2VxL3NlcV9xdWV1ZS5jCkBAIC0xMTEsMTAgKzExMSw4IEBACiAJc3RydWN0IHNuZF9zZXFfcXVldWUgKnE7CiAKIAlxID0ga3phbGxvYyhzaXplb2YoKnEpLCBHRlBfS0VSTkVMKTsKLQlpZiAocSA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmYWlsZWQgZm9yIHNuZF9zZXFfcXVldWVfbmV3KClcbiIpOworCWlmICghcSkKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJc3Bpbl9sb2NrX2luaXQoJnEtPm93bmVyX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZxLT5jaGVja19sb2NrKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc2VxL3NlcV90aW1lci5jIGIvc291bmQvY29yZS9zZXEvc2VxX3RpbWVyLmMKaW5kZXggZTczNjA1My4uMTg2ZjE2MSAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9zZXEvc2VxX3RpbWVyLmMKKysrIGIvc291bmQvY29yZS9zZXEvc2VxX3RpbWVyLmMKQEAgLTU2LDEwICs1Niw4IEBACiAJc3RydWN0IHNuZF9zZXFfdGltZXIgKnRtcjsKIAkKIAl0bXIgPSBremFsbG9jKHNpemVvZigqdG1yKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHRtciA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCJBTFNBOiBzZXE6IG1hbGxvYyBmYWlsZWQgZm9yIHNuZF9zZXFfdGltZXJfbmV3KCkgXG4iKTsKKwlpZiAoIXRtcikKIAkJcmV0dXJuIE5VTEw7Ci0JfQogCXNwaW5fbG9ja19pbml0KCZ0bXItPmxvY2spOwogCiAJLyogcmVzZXQgc2V0dXAgdG8gZGVmYXVsdHMgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvc291bmQuYyBiL3NvdW5kL2NvcmUvc291bmQuYwppbmRleCAxODVjZWMwLi41ZmM5M2QwIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3NvdW5kLmMKKysrIGIvc291bmQvY29yZS9zb3VuZC5jCkBAIC0xODYsNyArMTg2LDcgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfU05EX0RZTkFNSUNfTUlOT1JTCi1zdGF0aWMgaW50IHNuZF9maW5kX2ZyZWVfbWlub3IoaW50IHR5cGUpCitzdGF0aWMgaW50IHNuZF9maW5kX2ZyZWVfbWlub3IoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldikKIHsKIAlpbnQgbWlub3I7CiAKQEAgLTIwOSw3ICsyMDksNyBAQAogCXJldHVybiAtRUJVU1k7CiB9CiAjZWxzZQotc3RhdGljIGludCBzbmRfa2VybmVsX21pbm9yKGludCB0eXBlLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIGludCBkZXYpCitzdGF0aWMgaW50IHNuZF9maW5kX2ZyZWVfbWlub3IoaW50IHR5cGUsIHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgaW50IGRldikKIHsKIAlpbnQgbWlub3I7CiAKQEAgLTIzNyw2ICsyMzcsOCBAQAogCX0KIAlpZiAoc25kX0JVR19PTihtaW5vciA8IDAgfHwgbWlub3IgPj0gU05EUlZfT1NfTUlOT1JTKSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHNuZF9taW5vcnNbbWlub3JdKQorCQlyZXR1cm4gLUVCVVNZOwogCXJldHVybiBtaW5vcjsKIH0KICNlbmRpZgpAQCAtMjc2LDEzICsyNzgsNyBAQAogCXByZWctPnByaXZhdGVfZGF0YSA9IHByaXZhdGVfZGF0YTsKIAlwcmVnLT5jYXJkX3B0ciA9IGNhcmQ7CiAJbXV0ZXhfbG9jaygmc291bmRfbXV0ZXgpOwotI2lmZGVmIENPTkZJR19TTkRfRFlOQU1JQ19NSU5PUlMKLQltaW5vciA9IHNuZF9maW5kX2ZyZWVfbWlub3IodHlwZSk7Ci0jZWxzZQotCW1pbm9yID0gc25kX2tlcm5lbF9taW5vcih0eXBlLCBjYXJkLCBkZXYpOwotCWlmIChtaW5vciA+PSAwICYmIHNuZF9taW5vcnNbbWlub3JdKQotCQltaW5vciA9IC1FQlVTWTsKLSNlbmRpZgorCW1pbm9yID0gc25kX2ZpbmRfZnJlZV9taW5vcih0eXBlLCBjYXJkLCBkZXYpOwogCWlmIChtaW5vciA8IDApIHsKIAkJZXJyID0gbWlub3I7CiAJCWdvdG8gZXJyb3I7CmRpZmYgLS1naXQgYS9zb3VuZC9jb3JlL3RpbWVyLmMgYi9zb3VuZC9jb3JlL3RpbWVyLmMKaW5kZXggNDkwYjQ4OS4uYTlhMWEwNCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS90aW1lci5jCisrKyBiL3NvdW5kL2NvcmUvdGltZXIuYwpAQCAtNzc0LDEwICs3NzQsOCBAQAogCWlmIChydGltZXIpCiAJCSpydGltZXIgPSBOVUxMOwogCXRpbWVyID0ga3phbGxvYyhzaXplb2YoKnRpbWVyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHRpbWVyID09IE5VTEwpIHsKLQkJcHJfZXJyKCJBTFNBOiB0aW1lcjogY2Fubm90IGFsbG9jYXRlXG4iKTsKKwlpZiAoIXRpbWVyKQogCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJdGltZXItPnRtcl9jbGFzcyA9IHRpZC0+ZGV2X2NsYXNzOwogCXRpbWVyLT5jYXJkID0gY2FyZDsKIAl0aW1lci0+dG1yX2RldmljZSA9IHRpZC0+ZGV2aWNlOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGwzL29wbDNfc2VxLmMgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zZXEuYwppbmRleCBhOWY2MThlLi5mZGFlNWQ3IDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zZXEuYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDMvb3BsM19zZXEuYwpAQCAtMjE2LDggKzIxNiw5IEBACiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgaW50IHNuZF9vcGwzX3NlcV9uZXdfZGV2aWNlKHN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2KQorc3RhdGljIGludCBzbmRfb3BsM19zZXFfcHJvYmUoc3RydWN0IGRldmljZSAqX2RldikKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldiA9IHRvX3NlcV9kZXYoX2Rldik7CiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCWludCBjbGllbnQsIGVycjsKIAljaGFyIG5hbWVbMzJdOwpAQCAtMjU3LDggKzI1OCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX29wbDNfc2VxX2RlbGV0ZV9kZXZpY2Uoc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNuZF9vcGwzX3NlcV9yZW1vdmUoc3RydWN0IGRldmljZSAqX2RldikKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldiA9IHRvX3NlcV9kZXYoX2Rldik7CiAJc3RydWN0IHNuZF9vcGwzICpvcGwzOwogCiAJb3BsMyA9ICooc3RydWN0IHNuZF9vcGwzICoqKVNORFJWX1NFUV9ERVZJQ0VfQVJHUFRSKGRldik7CkBAIC0yNzUsMjIgKzI3NywxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBhbHNhX29wbDNfc2VxX2luaXQodm9pZCkKLXsKLQlzdGF0aWMgc3RydWN0IHNuZF9zZXFfZGV2X29wcyBvcHMgPQotCXsKLQkJc25kX29wbDNfc2VxX25ld19kZXZpY2UsCi0JCXNuZF9vcGwzX3NlcV9kZWxldGVfZGV2aWNlCi0JfTsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NlcV9kcml2ZXIgb3BsM19zZXFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJCS5wcm9iZSA9IHNuZF9vcGwzX3NlcV9wcm9iZSwKKwkJLnJlbW92ZSA9IHNuZF9vcGwzX3NlcV9yZW1vdmUsCisJfSwKKwkuaWQgPSBTTkRSVl9TRVFfREVWX0lEX09QTDMsCisJLmFyZ3NpemUgPSBzaXplb2Yoc3RydWN0IHNuZF9vcGwzICopLAorfTsKIAotCXJldHVybiBzbmRfc2VxX2RldmljZV9yZWdpc3Rlcl9kcml2ZXIoU05EUlZfU0VRX0RFVl9JRF9PUEwzLCAmb3BzLAotCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9vcGwzICopKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGFsc2Ffb3BsM19zZXFfZXhpdCh2b2lkKQotewotCXNuZF9zZXFfZGV2aWNlX3VucmVnaXN0ZXJfZHJpdmVyKFNORFJWX1NFUV9ERVZfSURfT1BMMyk7Ci19Ci0KLW1vZHVsZV9pbml0KGFsc2Ffb3BsM19zZXFfaW5pdCkKLW1vZHVsZV9leGl0KGFsc2Ffb3BsM19zZXFfZXhpdCkKK21vZHVsZV9zbmRfc2VxX2RyaXZlcihvcGwzX3NlcV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvc291bmQvZHJpdmVycy9vcGw0L29wbDRfc2VxLmMgYi9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9zZXEuYwppbmRleCA5OTE5NzY5Li4wM2Q2MjAyIDEwMDY0NAotLS0gYS9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9zZXEuYworKysgYi9zb3VuZC9kcml2ZXJzL29wbDQvb3BsNF9zZXEuYwpAQCAtMTI0LDggKzEyNCw5IEBACiAJc25kX21pZGlfY2hhbm5lbF9mcmVlX3NldChvcGw0LT5jaHNldCk7CiB9CiAKLXN0YXRpYyBpbnQgc25kX29wbDRfc2VxX25ld19kZXZpY2Uoc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNuZF9vcGw0X3NlcV9wcm9iZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogeworCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2ID0gdG9fc2VxX2RldihfZGV2KTsKIAlzdHJ1Y3Qgc25kX29wbDQgKm9wbDQ7CiAJaW50IGNsaWVudDsKIAlzdHJ1Y3Qgc25kX3NlcV9wb3J0X2NhbGxiYWNrIHBjYWxsYmFja3M7CkBAIC0xODAsOCArMTgxLDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzbmRfb3BsNF9zZXFfZGVsZXRlX2RldmljZShzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc25kX29wbDRfc2VxX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogeworCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2ID0gdG9fc2VxX2RldihfZGV2KTsKIAlzdHJ1Y3Qgc25kX29wbDQgKm9wbDQ7CiAKIAlvcGw0ID0gKihzdHJ1Y3Qgc25kX29wbDQgKiopU05EUlZfU0VRX0RFVklDRV9BUkdQVFIoZGV2KTsKQEAgLTE5NSwyMSArMTk3LDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGFsc2Ffb3BsNF9zeW50aF9pbml0KHZvaWQpCi17Ci0Jc3RhdGljIHN0cnVjdCBzbmRfc2VxX2Rldl9vcHMgb3BzID0gewotCQlzbmRfb3BsNF9zZXFfbmV3X2RldmljZSwKLQkJc25kX29wbDRfc2VxX2RlbGV0ZV9kZXZpY2UKLQl9Oworc3RhdGljIHN0cnVjdCBzbmRfc2VxX2RyaXZlciBvcGw0X3NlcV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKKwkJLnByb2JlID0gc25kX29wbDRfc2VxX3Byb2JlLAorCQkucmVtb3ZlID0gc25kX29wbDRfc2VxX3JlbW92ZSwKKwl9LAorCS5pZCA9IFNORFJWX1NFUV9ERVZfSURfT1BMNCwKKwkuYXJnc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc25kX29wbDQgKiksCit9OwogCi0JcmV0dXJuIHNuZF9zZXFfZGV2aWNlX3JlZ2lzdGVyX2RyaXZlcihTTkRSVl9TRVFfREVWX0lEX09QTDQsICZvcHMsCi0JCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX29wbDQgKikpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9vcGw0X3N5bnRoX2V4aXQodm9pZCkKLXsKLQlzbmRfc2VxX2RldmljZV91bnJlZ2lzdGVyX2RyaXZlcihTTkRSVl9TRVFfREVWX0lEX09QTDQpOwotfQotCi1tb2R1bGVfaW5pdChhbHNhX29wbDRfc3ludGhfaW5pdCkKLW1vZHVsZV9leGl0KGFsc2Ffb3BsNF9zeW50aF9leGl0KQorbW9kdWxlX3NuZF9zZXFfZHJpdmVyKG9wbDRfc2VxX2RyaXZlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9maXJld2lyZS9hbWR0cC5jIGIvc291bmQvZmlyZXdpcmUvYW1kdHAuYwppbmRleCA1Y2MzNTZkLi5lMDYxMzU1IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9hbWR0cC5jCisrKyBiL3NvdW5kL2ZpcmV3aXJlL2FtZHRwLmMKQEAgLTE2NiwxMCArMTY2LDEwIEBACiAJICogT25lIEFNRFRQIHBhY2tldCBjYW4gaW5jbHVkZSBzb21lIGZyYW1lcy4gSW4gYmxvY2tpbmcgbW9kZSwgdGhlCiAJICogbnVtYmVyIGVxdWFscyB0byBTWVRfSU5URVJWQUwuIFNvIHRoZSBudW1iZXIgaXMgOCwgMTYgb3IgMzIsCiAJICogZGVwZW5kaW5nIG9uIGl0cyBzYW1wbGluZyByYXRlLiBGb3IgYWNjdXJhdGUgcGVyaW9kIGludGVycnVwdCwgaXQncwotCSAqIHByZWZlcnJhYmxlIHRvIGFsaWdoIHBlcmlvZC9idWZmZXIgc2l6ZXMgdG8gY3VycmVudCBTWVRfSU5URVJWQUwuCisJICogcHJlZmVycmFibGUgdG8gYWxpZ24gcGVyaW9kL2J1ZmZlciBzaXplcyB0byBjdXJyZW50IFNZVF9JTlRFUlZBTC4KIAkgKgotCSAqIFRPRE86IFRoZXNlIGNvbnN0cmFpbnRzIGNhbiBiZSBpbXByb3ZlZCB3aXRoIHByb3BwZXIgcnVsZXMuCi0JICogQ3VycmVudGx5IGFwcGx5IExDTSBvZiBTWVRfSU5URVZBTHMuCisJICogVE9ETzogVGhlc2UgY29uc3RyYWludHMgY2FuIGJlIGltcHJvdmVkIHdpdGggcHJvcGVyIHJ1bGVzLgorCSAqIEN1cnJlbnRseSBhcHBseSBMQ00gb2YgU1lUX0lOVEVSVkFMcy4KIAkgKi8KIAllcnIgPSBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLAogCQkJCQkgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLCAzMik7CkBAIC0yNzAsNyArMjcwLDcgQEAKICAqIEBzOiB0aGUgQU1EVFAgc3RyZWFtIHRvIGNvbmZpZ3VyZQogICogQGZvcm1hdDogdGhlIGZvcm1hdCBvZiB0aGUgQUxTQSBQQ00gZGV2aWNlCiAgKgotICogVGhlIHNhbXBsZSBmb3JtYXQgbXVzdCBiZSBzZXQgYWZ0ZXIgdGhlIG90aGVyIHBhcmFtdGVycyAocmF0ZS9QQ00gY2hhbm5lbHMvCisgKiBUaGUgc2FtcGxlIGZvcm1hdCBtdXN0IGJlIHNldCBhZnRlciB0aGUgb3RoZXIgcGFyYW1ldGVycyAocmF0ZS9QQ00gY2hhbm5lbHMvCiAgKiBNSURJKSBhbmQgYmVmb3JlIHRoZSBzdHJlYW0gaXMgc3RhcnRlZCwgYW5kIG11c3Qgbm90IGJlIGNoYW5nZWQgd2hpbGUgdGhlCiAgKiBzdHJlYW0gaXMgcnVubmluZy4KICAqLwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvYmVib2IvYmVib2JfbWF1ZGlvLmMgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl9tYXVkaW8uYwppbmRleCBhNDIyYWFhLi45ZWUyNWE2IDEwMDY0NAotLS0gYS9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl9tYXVkaW8uYworKysgYi9zb3VuZC9maXJld2lyZS9iZWJvYi9iZWJvYl9tYXVkaW8uYwpAQCAtOTYsMTAgKzk2LDEwIEBACiAJc3RydWN0IGZ3X2RldmljZSAqZGV2aWNlID0gZndfcGFyZW50X2RldmljZSh1bml0KTsKIAlpbnQgZXJyLCByY29kZTsKIAl1NjQgZGF0ZTsKLQlfX2JlMzIgY3Vlc1szXSA9IHsKLQkJTUFVRElPX0JPT1RMT0FERVJfQ1VFMSwKLQkJTUFVRElPX0JPT1RMT0FERVJfQ1VFMiwKLQkJTUFVRElPX0JPT1RMT0FERVJfQ1VFMworCV9fbGUzMiBjdWVzWzNdID0geworCQljcHVfdG9fbGUzMihNQVVESU9fQk9PVExPQURFUl9DVUUxKSwKKwkJY3B1X3RvX2xlMzIoTUFVRElPX0JPT1RMT0FERVJfQ1VFMiksCisJCWNwdV90b19sZTMyKE1BVURJT19CT09UTE9BREVSX0NVRTMpCiAJfTsKIAogCS8qIGNoZWNrIGRhdGUgb2Ygc29mdHdhcmUgdXNlZCB0byBidWlsZCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc190cmFuc2FjdGlvbi5jIGIvc291bmQvZmlyZXdpcmUvZmlyZXdvcmtzL2ZpcmV3b3Jrc190cmFuc2FjdGlvbi5jCmluZGV4IDJhODVlNDIuLmY1NTA4MDggMTAwNjQ0Ci0tLSBhL3NvdW5kL2ZpcmV3aXJlL2ZpcmV3b3Jrcy9maXJld29ya3NfdHJhbnNhY3Rpb24uYworKysgYi9zb3VuZC9maXJld2lyZS9maXJld29ya3MvZmlyZXdvcmtzX3RyYW5zYWN0aW9uLmMKQEAgLTEzLDcgKzEzLDcgQEAKICAqCiAgKiBUcmFuc2FjdGlvbiBzdWJzdGFuY2U6CiAgKiAgQXQgZmlyc3QsIDYgZGF0YSBleGlzdC4gRm9sbG93aW5nIHRvIHRoZSBkYXRhLCBwYXJhbWV0ZXJzIGZvciBlYWNoIGNvbW1hbmQKLSAqICBleGlzdC4gQWxsIG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSAzMiBiaXQgYWxpZ2hlZCB0byBiaWcgZW5kaWFuLgorICogIGV4aXN0LiBBbGwgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIDMyIGJpdCBhbGlnbmVkIHRvIGJpZyBlbmRpYW4uCiAgKiAgIGRhdGFbMF06CUxlbmd0aCBvZiB0cmFuc2FjdGlvbiBzdWJzdGFuY2UKICAqICAgZGF0YVsxXToJVHJhbnNhY3Rpb24gdmVyc2lvbgogICogICBkYXRhWzJdOglTZXF1ZW5jZSBudW1iZXIuIFRoaXMgaXMgaW5jcmVtZW50ZWQgYnkgdGhlIGRldmljZQpkaWZmIC0tZ2l0IGEvc291bmQvaGRhL0tjb25maWcgYi9zb3VuZC9oZGEvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDFjNjU4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvaGRhL0tjb25maWcKQEAgLTAsMCArMSwzIEBACitjb25maWcgU05EX0hEQV9DT1JFCisJdHJpc3RhdGUKKwlzZWxlY3QgUkVHTUFQCmRpZmYgLS1naXQgYS9zb3VuZC9oZGEvTWFrZWZpbGUgYi9zb3VuZC9oZGEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzNTlmNQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2hkYS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKK3NuZC1oZGEtY29yZS1vYmpzIDo9IGhkYV9idXNfdHlwZS5vIGhkYWNfYnVzLm8gaGRhY19kZXZpY2UubyBoZGFjX3N5c2ZzLm8gXAorCWhkYWNfcmVnbWFwLm8gYXJyYXkubworCitzbmQtaGRhLWNvcmUtb2JqcyArPSB0cmFjZS5vCitDRkxBR1NfdHJhY2UubyA6PSAtSSQoc3JjKQorCitvYmotJChDT05GSUdfU05EX0hEQV9DT1JFKSArPSBzbmQtaGRhLWNvcmUubwpkaWZmIC0tZ2l0IGEvc291bmQvaGRhL2FycmF5LmMgYi9zb3VuZC9oZGEvYXJyYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTY3OTViCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvaGRhL2FycmF5LmMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIGdlbmVyaWMgYXJyYXlzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaGRhdWRpby5oPgorCisvKioKKyAqIHNuZF9hcnJheV9uZXcgLSBnZXQgYSBuZXcgZWxlbWVudCBmcm9tIHRoZSBnaXZlbiBhcnJheQorICogQGFycmF5OiB0aGUgYXJyYXkgb2JqZWN0CisgKgorICogR2V0IGEgbmV3IGVsZW1lbnQgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuICBJZiBpdCBleGNlZWRzIHRoZQorICogcHJlLWFsbG9jYXRlZCBhcnJheSBzaXplLCByZS1hbGxvY2F0ZSB0aGUgYXJyYXkuCisgKgorICogUmV0dXJucyBOVUxMIGlmIGFsbG9jYXRpb24gZmFpbGVkLgorICovCit2b2lkICpzbmRfYXJyYXlfbmV3KHN0cnVjdCBzbmRfYXJyYXkgKmFycmF5KQoreworCWlmIChzbmRfQlVHX09OKCFhcnJheS0+ZWxlbV9zaXplKSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGFycmF5LT51c2VkID49IGFycmF5LT5hbGxvY2VkKSB7CisJCWludCBudW0gPSBhcnJheS0+YWxsb2NlZCArIGFycmF5LT5hbGxvY19hbGlnbjsKKwkJaW50IHNpemUgPSAobnVtICsgMSkgKiBhcnJheS0+ZWxlbV9zaXplOworCQl2b2lkICpubGlzdDsKKwkJaWYgKHNuZF9CVUdfT04obnVtID49IDQwOTYpKQorCQkJcmV0dXJuIE5VTEw7CisJCW5saXN0ID0ga3JlYWxsb2MoYXJyYXktPmxpc3QsIHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKKwkJaWYgKCFubGlzdCkKKwkJCXJldHVybiBOVUxMOworCQlhcnJheS0+bGlzdCA9IG5saXN0OworCQlhcnJheS0+YWxsb2NlZCA9IG51bTsKKwl9CisJcmV0dXJuIHNuZF9hcnJheV9lbGVtKGFycmF5LCBhcnJheS0+dXNlZCsrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9hcnJheV9uZXcpOworCisvKioKKyAqIHNuZF9hcnJheV9mcmVlIC0gZnJlZSB0aGUgZ2l2ZW4gYXJyYXkgZWxlbWVudHMKKyAqIEBhcnJheTogdGhlIGFycmF5IG9iamVjdAorICovCit2b2lkIHNuZF9hcnJheV9mcmVlKHN0cnVjdCBzbmRfYXJyYXkgKmFycmF5KQoreworCWtmcmVlKGFycmF5LT5saXN0KTsKKwlhcnJheS0+dXNlZCA9IDA7CisJYXJyYXktPmFsbG9jZWQgPSAwOworCWFycmF5LT5saXN0ID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9hcnJheV9mcmVlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2hkYS9oZGFfYnVzX3R5cGUuYyBiL3NvdW5kL2hkYS9oZGFfYnVzX3R5cGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTk5MTRhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvaGRhL2hkYV9idXNfdHlwZS5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBIRC1hdWRpbyBidXMKKyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxzb3VuZC9oZGF1ZGlvLmg+CisKK01PRFVMRV9ERVNDUklQVElPTigiSEQtYXVkaW8gYnVzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgaGRhX2J1c19tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYpCit7CisJc3RydWN0IGhkYWNfZGV2aWNlICpoZGV2ID0gZGV2X3RvX2hkYWNfZGV2KGRldik7CisJc3RydWN0IGhkYWNfZHJpdmVyICpoZHJ2ID0gZHJ2X3RvX2hkYWNfZHJpdmVyKGRydik7CisKKwlpZiAoaGRldi0+dHlwZSAhPSBoZHJ2LT50eXBlKQorCQlyZXR1cm4gMDsKKwlpZiAoaGRydi0+bWF0Y2gpCisJCXJldHVybiBoZHJ2LT5tYXRjaChoZGV2LCBoZHJ2KTsKKwlyZXR1cm4gMTsKK30KKworc3RydWN0IGJ1c190eXBlIHNuZF9oZGFfYnVzX3R5cGUgPSB7CisJLm5hbWUgPSAiaGRhdWRpbyIsCisJLm1hdGNoID0gaGRhX2J1c19tYXRjaCwKK307CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2J1c190eXBlKTsKKworc3RhdGljIGludCBfX2luaXQgaGRhX2J1c19pbml0KHZvaWQpCit7CisJcmV0dXJuIGJ1c19yZWdpc3Rlcigmc25kX2hkYV9idXNfdHlwZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoZGFfYnVzX2V4aXQodm9pZCkKK3sKKwlidXNfdW5yZWdpc3Rlcigmc25kX2hkYV9idXNfdHlwZSk7Cit9CisKK3N1YnN5c19pbml0Y2FsbChoZGFfYnVzX2luaXQpOworbW9kdWxlX2V4aXQoaGRhX2J1c19leGl0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2hkYS9oZGFjX2J1cy5jIGIvc291bmQvaGRhL2hkYWNfYnVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyNjJkYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL2hkYS9oZGFjX2J1cy5jCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogSEQtYXVkaW8gY29yZSBidXMgZHJpdmVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxzb3VuZC9oZGF1ZGlvLmg+CisjaW5jbHVkZSAidHJhY2UuaCIKKworc3RhdGljIHZvaWQgcHJvY2Vzc191bnNvbF9ldmVudHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKKworLyoqCisgKiBzbmRfaGRhY19idXNfaW5pdCAtIGluaXRpYWxpemUgYSBIRC1hdWRpbyBiYXMgYnVzCisgKiBAYnVzOiB0aGUgcG9pbnRlciB0byBidXMgb2JqZWN0CisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNuZF9oZGFjX2J1c19pbml0KHN0cnVjdCBoZGFjX2J1cyAqYnVzLCBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBoZGFjX2J1c19vcHMgKm9wcykKK3sKKwltZW1zZXQoYnVzLCAwLCBzaXplb2YoKmJ1cykpOworCWJ1cy0+ZGV2ID0gZGV2OworCWJ1cy0+b3BzID0gb3BzOworCUlOSVRfTElTVF9IRUFEKCZidXMtPmNvZGVjX2xpc3QpOworCUlOSVRfV09SSygmYnVzLT51bnNvbF93b3JrLCBwcm9jZXNzX3Vuc29sX2V2ZW50cyk7CisJbXV0ZXhfaW5pdCgmYnVzLT5jbWRfbXV0ZXgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfYnVzX2luaXQpOworCisvKioKKyAqIHNuZF9oZGFjX2J1c19leGl0IC0gY2xlYW4gdXAgYSBIRC1hdWRpbyBiYXMgYnVzCisgKiBAYnVzOiB0aGUgcG9pbnRlciB0byBidXMgb2JqZWN0CisgKi8KK3ZvaWQgc25kX2hkYWNfYnVzX2V4aXQoc3RydWN0IGhkYWNfYnVzICpidXMpCit7CisJV0FSTl9PTighbGlzdF9lbXB0eSgmYnVzLT5jb2RlY19saXN0KSk7CisJY2FuY2VsX3dvcmtfc3luYygmYnVzLT51bnNvbF93b3JrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2J1c19leGl0KTsKKworLyoqCisgKiBzbmRfaGRhY19idXNfZXhlY192ZXJiIC0gZXhlY3V0ZSBhIEhELWF1ZGlvIHZlcmIgb24gdGhlIGdpdmVuIGJ1cworICogQGJ1czogYnVzIG9iamVjdAorICogQGNtZDogSEQtYXVkaW8gZW5jb2RlZCB2ZXJiCisgKiBAcmVzOiBwb2ludGVyIHRvIHN0b3JlIHRoZSByZXNwb25zZSwgTlVMTCBpZiBwZXJmb3JtaW5nIGFzeW5jaHJvbm91c2x5CisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNuZF9oZGFjX2J1c19leGVjX3ZlcmIoc3RydWN0IGhkYWNfYnVzICpidXMsIHVuc2lnbmVkIGludCBhZGRyLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgaW50ICpyZXMpCit7CisJaW50IGVycjsKKworCW11dGV4X2xvY2soJmJ1cy0+Y21kX211dGV4KTsKKwllcnIgPSBzbmRfaGRhY19idXNfZXhlY192ZXJiX3VubG9ja2VkKGJ1cywgYWRkciwgY21kLCByZXMpOworCW11dGV4X3VubG9jaygmYnVzLT5jbWRfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19idXNfZXhlY192ZXJiKTsKKworLyoqCisgKiBzbmRfaGRhY19idXNfZXhlY192ZXJiX3VubG9ja2VkIC0gdW5sb2NrZWQgdmVyc2lvbgorICogQGJ1czogYnVzIG9iamVjdAorICogQGNtZDogSEQtYXVkaW8gZW5jb2RlZCB2ZXJiCisgKiBAcmVzOiBwb2ludGVyIHRvIHN0b3JlIHRoZSByZXNwb25zZSwgTlVMTCBpZiBwZXJmb3JtaW5nIGFzeW5jaHJvbm91c2x5CisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNuZF9oZGFjX2J1c19leGVjX3ZlcmJfdW5sb2NrZWQoc3RydWN0IGhkYWNfYnVzICpidXMsIHVuc2lnbmVkIGludCBhZGRyLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgKnJlcykKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCWludCBlcnI7CisKKwlpZiAoY21kID09IH4wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZXMpCisJCSpyZXMgPSAtMTsKKwllbHNlIGlmIChidXMtPnN5bmNfd3JpdGUpCisJCXJlcyA9ICZ0bXA7CisJZm9yICg7OykgeworCQl0cmFjZV9oZGFfc2VuZF9jbWQoYnVzLCBjbWQpOworCQllcnIgPSBidXMtPm9wcy0+Y29tbWFuZChidXMsIGNtZCk7CisJCWlmIChlcnIgIT0gLUVBR0FJTikKKwkJCWJyZWFrOworCQkvKiBwcm9jZXNzIHBlbmRpbmcgdmVyYnMgKi8KKwkJZXJyID0gYnVzLT5vcHMtPmdldF9yZXNwb25zZShidXMsIGFkZHIsICZ0bXApOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfQorCWlmICghZXJyICYmIHJlcykgeworCQllcnIgPSBidXMtPm9wcy0+Z2V0X3Jlc3BvbnNlKGJ1cywgYWRkciwgcmVzKTsKKwkJdHJhY2VfaGRhX2dldF9yZXNwb25zZShidXMsIGFkZHIsICpyZXMpOworCX0KKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfYnVzX2V4ZWNfdmVyYl91bmxvY2tlZCk7CisKKy8qKgorICogc25kX2hkYWNfYnVzX3F1ZXVlX2V2ZW50IC0gYWRkIGFuIHVuc29saWNpdGVkIGV2ZW50IHRvIHF1ZXVlCisgKiBAYnVzOiB0aGUgQlVTCisgKiBAcmVzOiB1bnNvbGljaXRlZCBldmVudCAobG93ZXIgMzJiaXQgb2YgUklSQiBlbnRyeSkKKyAqIEByZXNfZXg6IGNvZGVjIGFkZHIgYW5kIGZsYWdzICh1cHBlciAzMmJpdCBvciBSSVJCIGVudHJ5KQorICoKKyAqIEFkZHMgdGhlIGdpdmVuIGV2ZW50IHRvIHRoZSBxdWV1ZS4gIFRoZSBldmVudHMgYXJlIHByb2Nlc3NlZCBpbgorICogdGhlIHdvcmtxdWV1ZSBhc3luY2hyb25vdXNseS4gIENhbGwgdGhpcyBmdW5jdGlvbiBpbiB0aGUgaW50ZXJydXB0CisgKiBoYW5sZGVyIHdoZW4gUklSQiByZWNlaXZlcyBhbiB1bnNvbGljaXRlZCBldmVudC4KKyAqLwordm9pZCBzbmRfaGRhY19idXNfcXVldWVfZXZlbnQoc3RydWN0IGhkYWNfYnVzICpidXMsIHUzMiByZXMsIHUzMiByZXNfZXgpCit7CisJdW5zaWduZWQgaW50IHdwOworCisJaWYgKCFidXMpCisJCXJldHVybjsKKworCXRyYWNlX2hkYV91bnNvbF9ldmVudChidXMsIHJlcywgcmVzX2V4KTsKKwl3cCA9IChidXMtPnVuc29sX3dwICsgMSkgJSBIREFfVU5TT0xfUVVFVUVfU0laRTsKKwlidXMtPnVuc29sX3dwID0gd3A7CisKKwl3cCA8PD0gMTsKKwlidXMtPnVuc29sX3F1ZXVlW3dwXSA9IHJlczsKKwlidXMtPnVuc29sX3F1ZXVlW3dwICsgMV0gPSByZXNfZXg7CisKKwlzY2hlZHVsZV93b3JrKCZidXMtPnVuc29sX3dvcmspOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfYnVzX3F1ZXVlX2V2ZW50KTsKKworLyoKKyAqIHByb2Nlc3MgcXVldWVkIHVuc29saWNpdGVkIGV2ZW50cworICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3Vuc29sX2V2ZW50cyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGhkYWNfYnVzICpidXMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGhkYWNfYnVzLCB1bnNvbF93b3JrKTsKKwlzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjOworCXN0cnVjdCBoZGFjX2RyaXZlciAqZHJ2OworCXVuc2lnbmVkIGludCBycCwgY2FkZHIsIHJlczsKKworCXdoaWxlIChidXMtPnVuc29sX3JwICE9IGJ1cy0+dW5zb2xfd3ApIHsKKwkJcnAgPSAoYnVzLT51bnNvbF9ycCArIDEpICUgSERBX1VOU09MX1FVRVVFX1NJWkU7CisJCWJ1cy0+dW5zb2xfcnAgPSBycDsKKwkJcnAgPDw9IDE7CisJCXJlcyA9IGJ1cy0+dW5zb2xfcXVldWVbcnBdOworCQljYWRkciA9IGJ1cy0+dW5zb2xfcXVldWVbcnAgKyAxXTsKKwkJaWYgKCEoY2FkZHIgJiAoMSA8PCA0KSkpIC8qIG5vIHVuc29saWNpdGVkIGV2ZW50PyAqLworCQkJY29udGludWU7CisJCWNvZGVjID0gYnVzLT5jYWRkcl90YmxbY2FkZHIgJiAweDBmXTsKKwkJaWYgKCFjb2RlYyB8fCAhY29kZWMtPmRldi5kcml2ZXIpCisJCQljb250aW51ZTsKKwkJZHJ2ID0gZHJ2X3RvX2hkYWNfZHJpdmVyKGNvZGVjLT5kZXYuZHJpdmVyKTsKKwkJaWYgKGRydi0+dW5zb2xfZXZlbnQpCisJCQlkcnYtPnVuc29sX2V2ZW50KGNvZGVjLCByZXMpOworCX0KK30KKworaW50IHNuZF9oZGFjX2J1c19hZGRfZGV2aWNlKHN0cnVjdCBoZGFjX2J1cyAqYnVzLCBzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKQoreworCWlmIChidXMtPmNhZGRyX3RibFtjb2RlYy0+YWRkcl0pIHsKKwkJZGV2X2VycihidXMtPmRldiwgImFkZHJlc3MgMHgleCBpcyBhbHJlYWR5IG9jY3VwaWVkXG4iLAorCQkJY29kZWMtPmFkZHIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWxpc3RfYWRkX3RhaWwoJmNvZGVjLT5saXN0LCAmYnVzLT5jb2RlY19saXN0KTsKKwlidXMtPmNhZGRyX3RibFtjb2RlYy0+YWRkcl0gPSBjb2RlYzsKKwlzZXRfYml0KGNvZGVjLT5hZGRyLCAmYnVzLT5jb2RlY19wb3dlcmVkKTsKKwlidXMtPm51bV9jb2RlY3MrKzsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2J1c19hZGRfZGV2aWNlKTsKKwordm9pZCBzbmRfaGRhY19idXNfcmVtb3ZlX2RldmljZShzdHJ1Y3QgaGRhY19idXMgKmJ1cywKKwkJCQlzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKQoreworCVdBUk5fT04oYnVzICE9IGNvZGVjLT5idXMpOworCWlmIChsaXN0X2VtcHR5KCZjb2RlYy0+bGlzdCkpCisJCXJldHVybjsKKwlsaXN0X2RlbF9pbml0KCZjb2RlYy0+bGlzdCk7CisJYnVzLT5jYWRkcl90YmxbY29kZWMtPmFkZHJdID0gTlVMTDsKKwljbGVhcl9iaXQoY29kZWMtPmFkZHIsICZidXMtPmNvZGVjX3Bvd2VyZWQpOworCWJ1cy0+bnVtX2NvZGVjcy0tOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfYnVzX3JlbW92ZV9kZXZpY2UpOwpkaWZmIC0tZ2l0IGEvc291bmQvaGRhL2hkYWNfZGV2aWNlLmMgYi9zb3VuZC9oZGEvaGRhY19kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzViZjU2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvaGRhL2hkYWNfZGV2aWNlLmMKQEAgLTAsMCArMSw1OTkgQEAKKy8qCisgKiBIRC1hdWRpbyBjb2RlYyBjb3JlIGRldmljZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9oZGF1ZGlvLmg+CisjaW5jbHVkZSA8c291bmQvaGRhX3JlZ21hcC5oPgorI2luY2x1ZGUgImxvY2FsLmgiCisKK3N0YXRpYyB2b2lkIHNldHVwX2ZnX25vZGVzKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMpOworc3RhdGljIGludCBnZXRfY29kZWNfdmVuZG9yX25hbWUoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYyk7CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc25kX2hkYWNfZGV2aWNlX2V4aXQoY29udGFpbmVyX29mKGRldiwgc3RydWN0IGhkYWNfZGV2aWNlLCBkZXYpKTsKK30KKworLyoqCisgKiBzbmRfaGRhY19kZXZpY2VfaW5pdCAtIGluaXRpYWxpemUgdGhlIEhELWF1ZGlvIGNvZGVjIGJhc2UgZGV2aWNlCisgKiBAY29kZWM6IGRldmljZSB0byBpbml0aWFsaXplCisgKiBAYnVzOiBidXQgdG8gYXR0YWNoCisgKiBAbmFtZTogZGV2aWNlIG5hbWUgc3RyaW5nCisgKiBAYWRkcjogY29kZWMgYWRkcmVzcworICoKKyAqIFJldHVybnMgemVybyBmb3Igc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBydW50aW1lIFBNIGNvdW50ZXIgYW5kIG1hcmtzIGl0IGFjdGl2ZS4KKyAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gdHVybiBpdCBvZmYgYXBwcm9wcmlhdGVseSBsYXRlci4KKyAqCisgKiBUaGUgY2FsbGVyIG5lZWRzIHRvIHNldCB0aGUgZGV2aWNlJ3MgcmVsZWFzZSBvcCBwcm9wZXJseSBieSBpdHNlbGYuCisgKi8KK2ludCBzbmRfaGRhY19kZXZpY2VfaW5pdChzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBzdHJ1Y3QgaGRhY19idXMgKmJ1cywKKwkJCSBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgYWRkcikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaGRhX25pZF90IGZnOworCWludCBlcnI7CisKKwlkZXYgPSAmY29kZWMtPmRldjsKKwlkZXZpY2VfaW5pdGlhbGl6ZShkZXYpOworCWRldi0+cGFyZW50ID0gYnVzLT5kZXY7CisJZGV2LT5idXMgPSAmc25kX2hkYV9idXNfdHlwZTsKKwlkZXYtPnJlbGVhc2UgPSBkZWZhdWx0X3JlbGVhc2U7CisJZGV2LT5ncm91cHMgPSBoZGFjX2Rldl9hdHRyX2dyb3VwczsKKwlkZXZfc2V0X25hbWUoZGV2LCAiJXMiLCBuYW1lKTsKKwlkZXZpY2VfZW5hYmxlX2FzeW5jX3N1c3BlbmQoZGV2KTsKKworCWNvZGVjLT5idXMgPSBidXM7CisJY29kZWMtPmFkZHIgPSBhZGRyOworCWNvZGVjLT50eXBlID0gSERBX0RFVl9DT1JFOworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmY29kZWMtPmRldik7CisJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoJmNvZGVjLT5kZXYpOworCWF0b21pY19zZXQoJmNvZGVjLT5pbl9wbSwgMCk7CisKKwllcnIgPSBzbmRfaGRhY19idXNfYWRkX2RldmljZShidXMsIGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIGZpbGwgcGFyYW1ldGVycyAqLworCWNvZGVjLT52ZW5kb3JfaWQgPSBzbmRfaGRhY19yZWFkX3Bhcm0oY29kZWMsIEFDX05PREVfUk9PVCwKKwkJCQkJICAgICAgQUNfUEFSX1ZFTkRPUl9JRCk7CisJaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gLTEpIHsKKwkJLyogcmVhZCBhZ2FpbiwgaG9wZWZ1bGx5IHRoZSBhY2Nlc3MgbWV0aG9kIHdhcyBjb3JyZWN0ZWQKKwkJICogaW4gdGhlIGxhc3QgcmVhZC4uLgorCQkgKi8KKwkJY29kZWMtPnZlbmRvcl9pZCA9IHNuZF9oZGFjX3JlYWRfcGFybShjb2RlYywgQUNfTk9ERV9ST09ULAorCQkJCQkJICAgICAgQUNfUEFSX1ZFTkRPUl9JRCk7CisJfQorCisJY29kZWMtPnN1YnN5c3RlbV9pZCA9IHNuZF9oZGFjX3JlYWRfcGFybShjb2RlYywgQUNfTk9ERV9ST09ULAorCQkJCQkJIEFDX1BBUl9TVUJTWVNURU1fSUQpOworCWNvZGVjLT5yZXZpc2lvbl9pZCA9IHNuZF9oZGFjX3JlYWRfcGFybShjb2RlYywgQUNfTk9ERV9ST09ULAorCQkJCQkJQUNfUEFSX1JFVl9JRCk7CisKKwlzZXR1cF9mZ19ub2Rlcyhjb2RlYyk7CisJaWYgKCFjb2RlYy0+YWZnICYmICFjb2RlYy0+bWZnKSB7CisJCWRldl9lcnIoZGV2LCAibm8gQUZHIG9yIE1GRyBub2RlIGZvdW5kXG4iKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlmZyA9IGNvZGVjLT5hZmcgPyBjb2RlYy0+YWZnIDogY29kZWMtPm1mZzsKKworCWVyciA9IHNuZF9oZGFjX3JlZnJlc2hfd2lkZ2V0cyhjb2RlYyk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwljb2RlYy0+cG93ZXJfY2FwcyA9IHNuZF9oZGFjX3JlYWRfcGFybShjb2RlYywgZmcsIEFDX1BBUl9QT1dFUl9TVEFURSk7CisJLyogcmVyZWFkIHNzaWQgaWYgbm90IHNldCBieSBwYXJhbWV0ZXIgKi8KKwlpZiAoY29kZWMtPnN1YnN5c3RlbV9pZCA9PSAtMSB8fCBjb2RlYy0+c3Vic3lzdGVtX2lkID09IDApCisJCXNuZF9oZGFjX3JlYWQoY29kZWMsIGZnLCBBQ19WRVJCX0dFVF9TVUJTWVNURU1fSUQsIDAsCisJCQkgICAgICAmY29kZWMtPnN1YnN5c3RlbV9pZCk7CisKKwllcnIgPSBnZXRfY29kZWNfdmVuZG9yX25hbWUoY29kZWMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCisJY29kZWMtPmNoaXBfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiSUQgJXgiLAorCQkJCSAgICAgY29kZWMtPnZlbmRvcl9pZCAmIDB4ZmZmZik7CisJaWYgKCFjb2RlYy0+Y2hpcF9uYW1lKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlwdXRfZGV2aWNlKCZjb2RlYy0+ZGV2KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfZGV2aWNlX2luaXQpOworCisvKioKKyAqIHNuZF9oZGFjX2RldmljZV9leGl0IC0gY2xlYW4gdXAgdGhlIEhELWF1ZGlvIGNvZGVjIGJhc2UgZGV2aWNlCisgKiBAY29kZWM6IGRldmljZSB0byBjbGVhbiB1cAorICovCit2b2lkIHNuZF9oZGFjX2RldmljZV9leGl0KHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMpCit7CisJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZjb2RlYy0+ZGV2KTsKKwlzbmRfaGRhY19idXNfcmVtb3ZlX2RldmljZShjb2RlYy0+YnVzLCBjb2RlYyk7CisJa2ZyZWUoY29kZWMtPnZlbmRvcl9uYW1lKTsKKwlrZnJlZShjb2RlYy0+Y2hpcF9uYW1lKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2RldmljZV9leGl0KTsKKworLyoqCisgKiBzbmRfaGRhY19kZXZpY2VfcmVnaXN0ZXIgLSByZWdpc3RlciB0aGUgaGQtYXVkaW8gY29kZWMgYmFzZSBkZXZpY2UKKyAqIGNvZGVjOiB0aGUgZGV2aWNlIHRvIHJlZ2lzdGVyCisgKi8KK2ludCBzbmRfaGRhY19kZXZpY2VfcmVnaXN0ZXIoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gZGV2aWNlX2FkZCgmY29kZWMtPmRldik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gaGRhX3dpZGdldF9zeXNmc19pbml0KGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZpY2VfZGVsKCZjb2RlYy0+ZGV2KTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2RldmljZV9yZWdpc3Rlcik7CisKKy8qKgorICogc25kX2hkYWNfZGV2aWNlX3VucmVnaXN0ZXIgLSB1bnJlZ2lzdGVyIHRoZSBoZC1hdWRpbyBjb2RlYyBiYXNlIGRldmljZQorICogY29kZWM6IHRoZSBkZXZpY2UgdG8gdW5yZWdpc3RlcgorICovCit2b2lkIHNuZF9oZGFjX2RldmljZV91bnJlZ2lzdGVyKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMpCit7CisJaWYgKGRldmljZV9pc19yZWdpc3RlcmVkKCZjb2RlYy0+ZGV2KSkgeworCQloZGFfd2lkZ2V0X3N5c2ZzX2V4aXQoY29kZWMpOworCQlkZXZpY2VfZGVsKCZjb2RlYy0+ZGV2KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19kZXZpY2VfdW5yZWdpc3Rlcik7CisKKy8qKgorICogc25kX2hkYWNfbWFrZV9jbWQgLSBjb21wb3NlIGEgMzJiaXQgY29tbWFuZCB3b3JkIHRvIGJlIHNlbnQgdG8gdGhlCisgKglIRC1hdWRpbyBjb250cm9sbGVyCisgKiBAY29kZWM6IHRoZSBjb2RlYyBvYmplY3QKKyAqIEBuaWQ6IE5JRCB0byBlbmNvZGUKKyAqIEB2ZXJiOiB2ZXJiIHRvIGVuY29kZQorICogQHBhcm06IHBhcmFtZXRlciB0byBlbmNvZGUKKyAqCisgKiBSZXR1cm4gYW4gZW5jb2RlZCBjb21tYW5kIHZlcmIgb3IgLTEgZm9yIGVycm9yLgorICovCit1bnNpZ25lZCBpbnQgc25kX2hkYWNfbWFrZV9jbWQoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IHBhcm0pCit7CisJdTMyIHZhbCwgYWRkcjsKKworCWFkZHIgPSBjb2RlYy0+YWRkcjsKKwlpZiAoKGFkZHIgJiB+MHhmKSB8fCAobmlkICYgfjB4N2YpIHx8CisJICAgICh2ZXJiICYgfjB4ZmZmKSB8fCAocGFybSAmIH4weGZmZmYpKSB7CisJCWRldl9lcnIoJmNvZGVjLT5kZXYsICJvdXQgb2YgcmFuZ2UgY21kICV4OiV4OiV4OiV4XG4iLAorCQkJYWRkciwgbmlkLCB2ZXJiLCBwYXJtKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXZhbCA9IGFkZHIgPDwgMjg7CisJdmFsIHw9ICh1MzIpbmlkIDw8IDIwOworCXZhbCB8PSB2ZXJiIDw8IDg7CisJdmFsIHw9IHBhcm07CisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX21ha2VfY21kKTsKKworLyoqCisgKiBzbmRfaGRhY19leGVjX3ZlcmIgLSBleGVjdXRlIGFuIGVuY29kZWQgdmVyYgorICogQGNvZGVjOiB0aGUgY29kZWMgb2JqZWN0CisgKiBAY21kOiBlbmNvZGVkIHZlcmIgdG8gZXhlY3V0ZQorICogQGZsYWdzOiBvcHRpb25hbCBmbGFncywgcGFzcyB6ZXJvIGZvciBkZWZhdWx0CisgKiBAcmVzOiB0aGUgcG9pbnRlciB0byBzdG9yZSB0aGUgcmVzdWx0LCBOVUxMIGlmIHJ1bm5pbmcgYXN5bmMKKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICoKKyAqIFRoaXMgY2FsbHMgdGhlIGV4ZWNfdmVyYiBvcCB3aGVuIHNldCBpbiBoZGFjX2NvZGVjLiAgSWYgbm90LAorICogY2FsbCB0aGUgZGVmYXVsdCBzbmRfaGRhY19idXNfZXhlY192ZXJiKCkuCisgKi8KK2ludCBzbmRfaGRhY19leGVjX3ZlcmIoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50ICpyZXMpCit7CisJaWYgKGNvZGVjLT5leGVjX3ZlcmIpCisJCXJldHVybiBjb2RlYy0+ZXhlY192ZXJiKGNvZGVjLCBjbWQsIGZsYWdzLCByZXMpOworCXJldHVybiBzbmRfaGRhY19idXNfZXhlY192ZXJiKGNvZGVjLT5idXMsIGNvZGVjLT5hZGRyLCBjbWQsIHJlcyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19leGVjX3ZlcmIpOworCisKKy8qKgorICogc25kX2hkYWNfcmVhZCAtIGV4ZWN1dGUgYSB2ZXJiCisgKiBAY29kZWM6IHRoZSBjb2RlYyBvYmplY3QKKyAqIEBuaWQ6IE5JRCB0byBleGVjdXRlIGEgdmVyYgorICogQHZlcmI6IHZlcmIgdG8gZXhlY3V0ZQorICogQHBhcm06IHBhcmFtZXRlciBmb3IgYSB2ZXJiCisgKiBAcmVzOiB0aGUgcG9pbnRlciB0byBzdG9yZSB0aGUgcmVzdWx0LCBOVUxMIGlmIHJ1bm5pbmcgYXN5bmMKKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgc25kX2hkYWNfcmVhZChzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkgIHVuc2lnbmVkIGludCB2ZXJiLCB1bnNpZ25lZCBpbnQgcGFybSwgdW5zaWduZWQgaW50ICpyZXMpCit7CisJdW5zaWduZWQgaW50IGNtZCA9IHNuZF9oZGFjX21ha2VfY21kKGNvZGVjLCBuaWQsIHZlcmIsIHBhcm0pOworCisJcmV0dXJuIHNuZF9oZGFjX2V4ZWNfdmVyYihjb2RlYywgY21kLCAwLCByZXMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfcmVhZCk7CisKKy8qKgorICogX3NuZF9oZGFjX3JlYWRfcGFybSAtIHJlYWQgYSBwYXJtZXRlcgorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB6ZXJvIG9yIGFuIGVycm9yIHVubGlrZSBzbmRfaGRhY19yZWFkX3Bhcm0oKS4KKyAqLworaW50IF9zbmRfaGRhY19yZWFkX3Bhcm0oc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IHBhcm0sCisJCQl1bnNpZ25lZCBpbnQgKnJlcykKK3sKKwl1bnNpZ25lZCBpbnQgY21kOworCisJY21kID0gc25kX2hkYWNfcmVnbWFwX2VuY29kZV92ZXJiKG5pZCwgQUNfVkVSQl9QQVJBTUVURVJTKSB8IHBhcm07CisJcmV0dXJuIHNuZF9oZGFjX3JlZ21hcF9yZWFkX3Jhdyhjb2RlYywgY21kLCByZXMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX3NuZF9oZGFjX3JlYWRfcGFybSk7CisKKy8qKgorICogc25kX2hkYWNfcmVhZF9wYXJtX3VuY2FjaGVkIC0gcmVhZCBhIGNvZGVjIHBhcmFtZXRlciB3aXRob3V0IGNhY2hpbmcKKyAqIEBjb2RlYzogdGhlIGNvZGVjIG9iamVjdAorICogQG5pZDogTklEIHRvIHJlYWQgYSBwYXJhbWV0ZXIKKyAqIEBwYXJtOiBwYXJhbWV0ZXIgdG8gcmVhZAorICoKKyAqIFJldHVybnMgLTEgZm9yIGVycm9yLiAgSWYgeW91IG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIGVycm9yIG1vcmUKKyAqIHN0cmljdGx5LCB1c2Ugc25kX2hkYWNfcmVhZCgpIGRpcmVjdGx5LgorICovCitpbnQgc25kX2hkYWNfcmVhZF9wYXJtX3VuY2FjaGVkKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkJaW50IHBhcm0pCit7CisJaW50IHZhbDsKKworCWlmIChjb2RlYy0+cmVnbWFwKQorCQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoY29kZWMtPnJlZ21hcCwgdHJ1ZSk7CisJdmFsID0gc25kX2hkYWNfcmVhZF9wYXJtKGNvZGVjLCBuaWQsIHBhcm0pOworCWlmIChjb2RlYy0+cmVnbWFwKQorCQlyZWdjYWNoZV9jYWNoZV9ieXBhc3MoY29kZWMtPnJlZ21hcCwgZmFsc2UpOworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19yZWFkX3Bhcm1fdW5jYWNoZWQpOworCisvKioKKyAqIHNuZF9oZGFjX292ZXJyaWRlX3Bhcm0gLSBvdmVycmlkZSByZWFkLW9ubHkgcGFyYW1ldGVycworICogQGNvZGVjOiB0aGUgY29kZWMgb2JqZWN0CisgKiBAbmlkOiBOSUQgZm9yIHRoZSBwYXJhbWV0ZXIKKyAqIEBwYXJtOiB0aGUgcGFyYW1ldGVyIHRvIGNoYW5nZQorICogQHZhbDogdGhlIHBhcmFtZXRlciB2YWx1ZSB0byBvdmVyd3JpdGUKKyAqLworaW50IHNuZF9oZGFjX292ZXJyaWRlX3Bhcm0oc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCSAgIHVuc2lnbmVkIGludCBwYXJtLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXVuc2lnbmVkIGludCB2ZXJiID0gKEFDX1ZFUkJfUEFSQU1FVEVSUyA8PCA4KSB8IChuaWQgPDwgMjApIHwgcGFybTsKKwlpbnQgZXJyOworCisJaWYgKCFjb2RlYy0+cmVnbWFwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvZGVjLT5jYXBzX292ZXJ3cml0aW5nID0gdHJ1ZTsKKwllcnIgPSBzbmRfaGRhY19yZWdtYXBfd3JpdGVfcmF3KGNvZGVjLCB2ZXJiLCB2YWwpOworCWNvZGVjLT5jYXBzX292ZXJ3cml0aW5nID0gZmFsc2U7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX292ZXJyaWRlX3Bhcm0pOworCisvKioKKyAqIHNuZF9oZGFjX2dldF9zdWJfbm9kZXMgLSBnZXQgc3RhcnQgTklEIGFuZCBudW1iZXIgb2Ygc3VidHJlZSBub2RlcworICogQGNvZGVjOiB0aGUgY29kZWMgb2JqZWN0CisgKiBAbmlkOiBOSUQgdG8gaW5zcGVjdAorICogQHN0YXJ0X2lkOiB0aGUgcG9pbnRlciB0byBzdG9yZSB0aGUgc3RhcnRpbmcgTklECisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1YnRyZWUgbm9kZXMgb3IgemVybyBpZiBub3QgZm91bmQuCisgKiBUaGlzIGZ1bmN0aW9uIHJlYWRzIHBhcmFtZXRlcnMgYWx3YXlzIHdpdGhvdXQgY2FjaGluZy4KKyAqLworaW50IHNuZF9oZGFjX2dldF9zdWJfbm9kZXMoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCSAgIGhkYV9uaWRfdCAqc3RhcnRfaWQpCit7CisJdW5zaWduZWQgaW50IHBhcm07CisKKwlwYXJtID0gc25kX2hkYWNfcmVhZF9wYXJtX3VuY2FjaGVkKGNvZGVjLCBuaWQsIEFDX1BBUl9OT0RFX0NPVU5UKTsKKwlpZiAocGFybSA9PSAtMSkgeworCQkqc3RhcnRfaWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJKnN0YXJ0X2lkID0gKHBhcm0gPj4gMTYpICYgMHg3ZmZmOworCXJldHVybiAoaW50KShwYXJtICYgMHg3ZmZmKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX2dldF9zdWJfbm9kZXMpOworCisvKgorICogbG9vayBmb3IgYW4gQUZHIGFuZCBNRkcgbm9kZXMKKyAqLworc3RhdGljIHZvaWQgc2V0dXBfZmdfbm9kZXMoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYykKK3sKKwlpbnQgaSwgdG90YWxfbm9kZXMsIGZ1bmN0aW9uX2lkOworCWhkYV9uaWRfdCBuaWQ7CisKKwl0b3RhbF9ub2RlcyA9IHNuZF9oZGFjX2dldF9zdWJfbm9kZXMoY29kZWMsIEFDX05PREVfUk9PVCwgJm5pZCk7CisJZm9yIChpID0gMDsgaSA8IHRvdGFsX25vZGVzOyBpKyssIG5pZCsrKSB7CisJCWZ1bmN0aW9uX2lkID0gc25kX2hkYWNfcmVhZF9wYXJtKGNvZGVjLCBuaWQsCisJCQkJCQkgQUNfUEFSX0ZVTkNUSU9OX1RZUEUpOworCQlzd2l0Y2ggKGZ1bmN0aW9uX2lkICYgMHhmZikgeworCQljYXNlIEFDX0dSUF9BVURJT19GVU5DVElPTjoKKwkJCWNvZGVjLT5hZmcgPSBuaWQ7CisJCQljb2RlYy0+YWZnX2Z1bmN0aW9uX2lkID0gZnVuY3Rpb25faWQgJiAweGZmOworCQkJY29kZWMtPmFmZ191bnNvbCA9IChmdW5jdGlvbl9pZCA+PiA4KSAmIDE7CisJCQlicmVhazsKKwkJY2FzZSBBQ19HUlBfTU9ERU1fRlVOQ1RJT046CisJCQljb2RlYy0+bWZnID0gbmlkOworCQkJY29kZWMtPm1mZ19mdW5jdGlvbl9pZCA9IGZ1bmN0aW9uX2lkICYgMHhmZjsKKwkJCWNvZGVjLT5tZmdfdW5zb2wgPSAoZnVuY3Rpb25faWQgPj4gOCkgJiAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqCisgKiBzbmRfaGRhY19yZWZyZXNoX3dpZGdldHMgLSBSZXNldCB0aGUgd2lkZ2V0IHN0YXJ0L2VuZCBub2RlcworICogQGNvZGVjOiB0aGUgY29kZWMgb2JqZWN0CisgKi8KK2ludCBzbmRfaGRhY19yZWZyZXNoX3dpZGdldHMoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYykKK3sKKwloZGFfbmlkX3Qgc3RhcnRfbmlkOworCWludCBudW1zOworCisJbnVtcyA9IHNuZF9oZGFjX2dldF9zdWJfbm9kZXMoY29kZWMsIGNvZGVjLT5hZmcsICZzdGFydF9uaWQpOworCWlmICghc3RhcnRfbmlkIHx8IG51bXMgPD0gMCB8fCBudW1zID49IDB4ZmYpIHsKKwkJZGV2X2VycigmY29kZWMtPmRldiwgImNhbm5vdCByZWFkIHN1YiBub2RlcyBmb3IgRkcgMHglMDJ4XG4iLAorCQkJY29kZWMtPmFmZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvZGVjLT5udW1fbm9kZXMgPSBudW1zOworCWNvZGVjLT5zdGFydF9uaWQgPSBzdGFydF9uaWQ7CisJY29kZWMtPmVuZF9uaWQgPSBzdGFydF9uaWQgKyBudW1zOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfcmVmcmVzaF93aWRnZXRzKTsKKworLyogcmV0dXJuIENPTk5MSVNUX0xFTiBwYXJhbWV0ZXIgb2YgdGhlIGdpdmVuIHdpZGdldCAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfbnVtX2Nvbm5zKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCit7CisJdW5zaWduZWQgaW50IHdjYXBzID0gZ2V0X3djYXBzKGNvZGVjLCBuaWQpOworCXVuc2lnbmVkIGludCBwYXJtOworCisJaWYgKCEod2NhcHMgJiBBQ19XQ0FQX0NPTk5fTElTVCkgJiYKKwkgICAgZ2V0X3djYXBzX3R5cGUod2NhcHMpICE9IEFDX1dJRF9WT0xfS05CKQorCQlyZXR1cm4gMDsKKworCXBhcm0gPSBzbmRfaGRhY19yZWFkX3Bhcm0oY29kZWMsIG5pZCwgQUNfUEFSX0NPTk5MSVNUX0xFTik7CisJaWYgKHBhcm0gPT0gLTEpCisJCXBhcm0gPSAwOworCXJldHVybiBwYXJtOworfQorCisvKioKKyAqIHNuZF9oZGFjX2dldF9jb25uZWN0aW9ucyAtIGdldCBhIHdpZGdldCBjb25uZWN0aW9uIGxpc3QKKyAqIEBjb2RlYzogdGhlIGNvZGVjIG9iamVjdAorICogQG5pZDogTklECisgKiBAY29ubl9saXN0OiB0aGUgYXJyYXkgdG8gc3RvcmUgdGhlIHJlc3VsdHMsIGNhbiBiZSBOVUxMCisgKiBAbWF4X2Nvbm5zOiB0aGUgbWF4IHNpemUgb2YgdGhlIGdpdmVuIGFycmF5CisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbm5lY3RlZCB3aWRnZXRzLCB6ZXJvIGZvciBubyBjb25uZWN0aW9uLCBvciBhCisgKiBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgV2hlbiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGRvbid0IGZpdCB3aXRoIHRoZQorICogZ2l2ZW4gYXJyYXkgc2l6ZSwgaXQgcmV0dXJucyAtRU5PU1BDLgorICoKKyAqIFdoZW4gQGNvbm5fbGlzdCBpcyBOVUxMLCBpdCBqdXN0IGNoZWNrcyB0aGUgbnVtYmVyIG9mIGNvbm5lY3Rpb25zLgorICovCitpbnQgc25kX2hkYWNfZ2V0X2Nvbm5lY3Rpb25zKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgICAgIGhkYV9uaWRfdCAqY29ubl9saXN0LCBpbnQgbWF4X2Nvbm5zKQoreworCXVuc2lnbmVkIGludCBwYXJtOworCWludCBpLCBjb25uX2xlbiwgY29ubnMsIGVycjsKKwl1bnNpZ25lZCBpbnQgc2hpZnQsIG51bV9lbGVtcywgbWFzazsKKwloZGFfbmlkX3QgcHJldl9uaWQ7CisJaW50IG51bGxfY291bnQgPSAwOworCisJcGFybSA9IGdldF9udW1fY29ubnMoY29kZWMsIG5pZCk7CisJaWYgKCFwYXJtKQorCQlyZXR1cm4gMDsKKworCWlmIChwYXJtICYgQUNfQ0xJU1RfTE9ORykgeworCQkvKiBsb25nIGZvcm0gKi8KKwkJc2hpZnQgPSAxNjsKKwkJbnVtX2VsZW1zID0gMjsKKwl9IGVsc2UgeworCQkvKiBzaG9ydCBmb3JtICovCisJCXNoaWZ0ID0gODsKKwkJbnVtX2VsZW1zID0gNDsKKwl9CisJY29ubl9sZW4gPSBwYXJtICYgQUNfQ0xJU1RfTEVOR1RIOworCW1hc2sgPSAoMSA8PCAoc2hpZnQtMSkpIC0gMTsKKworCWlmICghY29ubl9sZW4pCisJCXJldHVybiAwOyAvKiBubyBjb25uZWN0aW9uICovCisKKwlpZiAoY29ubl9sZW4gPT0gMSkgeworCQkvKiBzaW5nbGUgY29ubmVjdGlvbiAqLworCQllcnIgPSBzbmRfaGRhY19yZWFkKGNvZGVjLCBuaWQsIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfTElTVCwgMCwKKwkJCQkgICAgJnBhcm0pOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWlmIChjb25uX2xpc3QpCisJCQljb25uX2xpc3RbMF0gPSBwYXJtICYgbWFzazsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogbXVsdGkgY29ubmVjdGlvbiAqLworCWNvbm5zID0gMDsKKwlwcmV2X25pZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNvbm5fbGVuOyBpKyspIHsKKwkJaW50IHJhbmdlX3ZhbDsKKwkJaGRhX25pZF90IHZhbCwgbjsKKworCQlpZiAoaSAlIG51bV9lbGVtcyA9PSAwKSB7CisJCQllcnIgPSBzbmRfaGRhY19yZWFkKGNvZGVjLCBuaWQsCisJCQkJCSAgICBBQ19WRVJCX0dFVF9DT05ORUNUX0xJU1QsIGksCisJCQkJCSAgICAmcGFybSk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlyYW5nZV92YWwgPSAhIShwYXJtICYgKDEgPDwgKHNoaWZ0LTEpKSk7IC8qIHJhbmdlcyAqLworCQl2YWwgPSBwYXJtICYgbWFzazsKKwkJaWYgKHZhbCA9PSAwICYmIG51bGxfY291bnQrKykgeyAgLyogbm8gc2Vjb25kIGNoYW5jZSAqLworCQkJZGV2X2RiZygmY29kZWMtPmRldiwKKwkJCQkiaW52YWxpZCBDT05ORUNUX0xJU1QgdmVyYiAleFslaV06JXhcbiIsCisJCQkJbmlkLCBpLCBwYXJtKTsKKwkJCXJldHVybiAwOworCQl9CisJCXBhcm0gPj49IHNoaWZ0OworCQlpZiAocmFuZ2VfdmFsKSB7CisJCQkvKiByYW5nZXMgYmV0d2VlbiB0aGUgcHJldmlvdXMgYW5kIHRoaXMgb25lICovCisJCQlpZiAoIXByZXZfbmlkIHx8IHByZXZfbmlkID49IHZhbCkgeworCQkJCWRldl93YXJuKCZjb2RlYy0+ZGV2LAorCQkJCQkgImludmFsaWQgZGVwX3JhbmdlX3ZhbCAleDoleFxuIiwKKwkJCQkJIHByZXZfbmlkLCB2YWwpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJZm9yIChuID0gcHJldl9uaWQgKyAxOyBuIDw9IHZhbDsgbisrKSB7CisJCQkJaWYgKGNvbm5fbGlzdCkgeworCQkJCQlpZiAoY29ubnMgPj0gbWF4X2Nvbm5zKQorCQkJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQkJCWNvbm5fbGlzdFtjb25uc10gPSBuOworCQkJCX0KKwkJCQljb25ucysrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNvbm5fbGlzdCkgeworCQkJCWlmIChjb25ucyA+PSBtYXhfY29ubnMpCisJCQkJCXJldHVybiAtRU5PU1BDOworCQkJCWNvbm5fbGlzdFtjb25uc10gPSB2YWw7CisJCQl9CisJCQljb25ucysrOworCQl9CisJCXByZXZfbmlkID0gdmFsOworCX0KKwlyZXR1cm4gY29ubnM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19nZXRfY29ubmVjdGlvbnMpOworCisjaWZkZWYgQ09ORklHX1BNCisvKioKKyAqIHNuZF9oZGFjX3Bvd2VyX3VwIC0gcG93ZXIgdXAgdGhlIGNvZGVjCisgKiBAY29kZWM6IHRoZSBjb2RlYyBvYmplY3QKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBydW50aW1lIFBNIGhlbHBlciB0byBwb3dlciB1cCB0aGUgZ2l2ZW4gY29kZWMuCisgKiBVbmxpa2Ugc25kX2hkYWNfcG93ZXJfdXBfcG0oKSwgeW91IHNob3VsZCBjYWxsIHRoaXMgb25seSBmb3IgdGhlIGNvZGUKKyAqIHBhdGggdGhhdCBpc24ndCBpbmNsdWRlZCBpbiBQTSBwYXRoLiAgT3RoZXJ3aXNlIGl0IGdldHMgc3R1Y2suCisgKi8KK3ZvaWQgc25kX2hkYWNfcG93ZXJfdXAoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYykKK3sKKwlwbV9ydW50aW1lX2dldF9zeW5jKCZjb2RlYy0+ZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX3Bvd2VyX3VwKTsKKworLyoqCisgKiBzbmRfaGRhY19wb3dlcl9kb3duIC0gcG93ZXIgZG93biB0aGUgY29kZWMKKyAqIEBjb2RlYzogdGhlIGNvZGVjIG9iamVjdAorICovCit2b2lkIHNuZF9oZGFjX3Bvd2VyX2Rvd24oc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmY29kZWMtPmRldjsKKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3koZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChkZXYpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfcG93ZXJfZG93bik7CisKKy8qKgorICogc25kX2hkYWNfcG93ZXJfdXBfcG0gLSBwb3dlciB1cCB0aGUgY29kZWMKKyAqIEBjb2RlYzogdGhlIGNvZGVjIG9iamVjdAorICoKKyAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBpbiBhIHJlY3Vyc2l2ZSBjb2RlIHBhdGggbGlrZSBpbml0IGNvZGUKKyAqIHdoaWNoIG1heSBiZSBjYWxsZWQgYnkgUE0gc3VzcGVuZC9yZXN1bWUgYWdhaW4uICBPVE9ILCBpZiBhIHBvd2VyLXVwCisgKiBjYWxsIG11c3Qgd2FrZSB1cCB0aGUgc2xlZXBlciAoZS5nLiBpbiBhIGtjdGwgY2FsbGJhY2spLCB1c2UKKyAqIHNuZF9oZGFjX3Bvd2VyX3VwKCkgaW5zdGVhZC4KKyAqLwordm9pZCBzbmRfaGRhY19wb3dlcl91cF9wbShzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKQoreworCWlmICghYXRvbWljX2luY19ub3RfemVybygmY29kZWMtPmluX3BtKSkKKwkJc25kX2hkYWNfcG93ZXJfdXAoY29kZWMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfcG93ZXJfdXBfcG0pOworCisvKioKKyAqIHNuZF9oZGFjX3Bvd2VyX2Rvd25fcG0gLSBwb3dlciBkb3duIHRoZSBjb2RlYworICogQGNvZGVjOiB0aGUgY29kZWMgb2JqZWN0CisgKgorICogTGlrZSBzbmRfaGRhY19wb3dlcl91cF9wbSgpLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gYSByZWN1cnNpdmUKKyAqIGNvZGUgcGF0aCBsaWtlIGluaXQgY29kZSB3aGljaCBtYXkgYmUgY2FsbGVkIGJ5IFBNIHN1c3BlbmQvcmVzdW1lIGFnYWluLgorICovCit2b2lkIHNuZF9oZGFjX3Bvd2VyX2Rvd25fcG0oc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYykKK3sKKwlpZiAoYXRvbWljX2RlY19pZl9wb3NpdGl2ZSgmY29kZWMtPmluX3BtKSA8IDApCisJCXNuZF9oZGFjX3Bvd2VyX2Rvd24oY29kZWMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfcG93ZXJfZG93bl9wbSk7CisjZW5kaWYKKworLyogY29kZWMgdmVuZG9yIGxhYmVscyAqLworc3RydWN0IGhkYV92ZW5kb3JfaWQgeworCXVuc2lnbmVkIGludCBpZDsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworc3RhdGljIHN0cnVjdCBoZGFfdmVuZG9yX2lkIGhkYV92ZW5kb3JfaWRzW10gPSB7CisJeyAweDEwMDIsICJBVEkiIH0sCisJeyAweDEwMTMsICJDaXJydXMgTG9naWMiIH0sCisJeyAweDEwNTcsICJNb3Rvcm9sYSIgfSwKKwl7IDB4MTA5NSwgIlNpbGljb24gSW1hZ2UiIH0sCisJeyAweDEwZGUsICJOdmlkaWEiIH0sCisJeyAweDEwZWMsICJSZWFsdGVrIiB9LAorCXsgMHgxMTAyLCAiQ3JlYXRpdmUiIH0sCisJeyAweDExMDYsICJWSUEiIH0sCisJeyAweDExMWQsICJJRFQiIH0sCisJeyAweDExYzEsICJMU0kiIH0sCisJeyAweDExZDQsICJBbmFsb2cgRGV2aWNlcyIgfSwKKwl7IDB4MTNmNiwgIkMtTWVkaWEiIH0sCisJeyAweDE0ZjEsICJDb25leGFudCIgfSwKKwl7IDB4MTdlOCwgIkNocm9udGVsIiB9LAorCXsgMHgxODU0LCAiTEciIH0sCisJeyAweDFhZWMsICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MiIH0sCisJeyAweDFhZjQsICJRRU1VIiB9LAorCXsgMHg0MzRkLCAiQy1NZWRpYSIgfSwKKwl7IDB4ODA4NiwgIkludGVsIiB9LAorCXsgMHg4Mzg0LCAiU2lnbWFUZWwiIH0sCisJe30gLyogdGVybWluYXRvciAqLworfTsKKworLyogc3RvcmUgdGhlIGNvZGVjIHZlbmRvciBuYW1lICovCitzdGF0aWMgaW50IGdldF9jb2RlY192ZW5kb3JfbmFtZShzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKQoreworCWNvbnN0IHN0cnVjdCBoZGFfdmVuZG9yX2lkICpjOworCXUxNiB2ZW5kb3JfaWQgPSBjb2RlYy0+dmVuZG9yX2lkID4+IDE2OworCisJZm9yIChjID0gaGRhX3ZlbmRvcl9pZHM7IGMtPmlkOyBjKyspIHsKKwkJaWYgKGMtPmlkID09IHZlbmRvcl9pZCkgeworCQkJY29kZWMtPnZlbmRvcl9uYW1lID0ga3N0cmR1cChjLT5uYW1lLCBHRlBfS0VSTkVMKTsKKwkJCXJldHVybiBjb2RlYy0+dmVuZG9yX25hbWUgPyAwIDogLUVOT01FTTsKKwkJfQorCX0KKworCWNvZGVjLT52ZW5kb3JfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiR2VuZXJpYyAlMDR4IiwgdmVuZG9yX2lkKTsKKwlyZXR1cm4gY29kZWMtPnZlbmRvcl9uYW1lID8gMCA6IC1FTk9NRU07Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9oZGEvaGRhY19yZWdtYXAuYyBiL3NvdW5kL2hkYS9oZGFjX3JlZ21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNzFlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9oZGEvaGRhY19yZWdtYXAuYwpAQCAtMCwwICsxLDQ3MiBAQAorLyoKKyAqIFJlZ21hcCBzdXBwb3J0IGZvciBIRC1hdWRpbyB2ZXJicworICoKKyAqIEEgdmlydHVhbCByZWdpc3RlciBpcyB0cmFuc2xhdGVkIHRvIG9uZSBvciBtb3JlIGhkYSB2ZXJicyBmb3Igd3JpdGUsCisgKiB2aWNlIHZlcnNhIGZvciByZWFkLgorICoKKyAqIEEgZmV3IGxpbWl0YXRpb25zOgorICogLSBQcm92aWRlZCBmb3Igbm90IGFsbCB2ZXJicyBidXQgb25seSBzdWJzZXQgc3RhbmRhcmQgbm9uLXZvbGF0aWxlIHZlcmJzLgorICogLSBGb3IgcmVhZGluZywgb25seSBBQ19WRVJCX0dFVF8qIHZhcmlhbnRzIGNhbiBiZSB1c2VkLgorICogLSBGb3Igd3JpdGluZywgbWFwcGVkIHRvIHRoZSAqY29ycmVzcG9uZGluZyogQUNfVkVSQl9TRVRfKiB2YXJpYW50cywKKyAqICAgc28gY2FuJ3QgaGFuZGxlIGFzeW1tZXRyaWMgdmVyYnMgZm9yIHJlYWQgYW5kIHdyaXRlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvaGRhdWRpby5oPgorI2luY2x1ZGUgPHNvdW5kL2hkYV9yZWdtYXAuaD4KKworI2lmZGVmIENPTkZJR19QTQorI2RlZmluZSBjb2RlY19pc19ydW5uaW5nKGNvZGVjKQkJCQlcCisJKGF0b21pY19yZWFkKCYoY29kZWMpLT5pbl9wbSkgfHwJCVwKKwkgIXBtX3J1bnRpbWVfc3VzcGVuZGVkKCYoY29kZWMpLT5kZXYpKQorI2Vsc2UKKyNkZWZpbmUgY29kZWNfaXNfcnVubmluZyhjb2RlYykJCXRydWUKKyNlbmRpZgorCisjZGVmaW5lIGdldF92ZXJiKHJlZykJKCgocmVnKSA+PiA4KSAmIDB4ZmZmKQorCitzdGF0aWMgYm9vbCBoZGFfdm9sYXRpbGVfcmVnKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHJlZykKK3sKKwlzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjID0gZGV2X3RvX2hkYWNfZGV2KGRldik7CisJdW5zaWduZWQgaW50IHZlcmIgPSBnZXRfdmVyYihyZWcpOworCisJc3dpdGNoICh2ZXJiKSB7CisJY2FzZSBBQ19WRVJCX0dFVF9QUk9DX0NPRUY6CisJCXJldHVybiAhY29kZWMtPmNhY2hlX2NvZWY7CisJY2FzZSBBQ19WRVJCX0dFVF9DT0VGX0lOREVYOgorCWNhc2UgQUNfVkVSQl9HRVRfUFJPQ19TVEFURToKKwljYXNlIEFDX1ZFUkJfR0VUX1BPV0VSX1NUQVRFOgorCWNhc2UgQUNfVkVSQl9HRVRfUElOX1NFTlNFOgorCWNhc2UgQUNfVkVSQl9HRVRfSERNSV9ESVBfU0laRToKKwljYXNlIEFDX1ZFUkJfR0VUX0hETUlfRUxERDoKKwljYXNlIEFDX1ZFUkJfR0VUX0hETUlfRElQX0lOREVYOgorCWNhc2UgQUNfVkVSQl9HRVRfSERNSV9ESVBfREFUQToKKwljYXNlIEFDX1ZFUkJfR0VUX0hETUlfRElQX1hNSVQ6CisJY2FzZSBBQ19WRVJCX0dFVF9IRE1JX0NQX0NUUkw6CisJY2FzZSBBQ19WRVJCX0dFVF9IRE1JX0NIQU5fU0xPVDoKKwljYXNlIEFDX1ZFUkJfR0VUX0RFVklDRV9TRUw6CisJY2FzZSBBQ19WRVJCX0dFVF9ERVZJQ0VfTElTVDoJLyogcmVhZC1vbmx5IHZvbGF0aWxlICovCisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgaGRhX3dyaXRlYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMgPSBkZXZfdG9faGRhY19kZXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgdmVyYiA9IGdldF92ZXJiKHJlZyk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPnZlbmRvcl92ZXJicy51c2VkOyBpKyspIHsKKwkJdW5zaWduZWQgaW50ICp2ID0gc25kX2FycmF5X2VsZW0oJmNvZGVjLT52ZW5kb3JfdmVyYnMsIGkpOworCQlpZiAodmVyYiA9PSAqdikKKwkJCXJldHVybiB0cnVlOworCX0KKworCWlmIChjb2RlYy0+Y2Fwc19vdmVyd3JpdGluZykKKwkJcmV0dXJuIHRydWU7CisKKwlzd2l0Y2ggKHZlcmIgJiAweGYwMCkgeworCWNhc2UgQUNfVkVSQl9HRVRfU1RSRUFNX0ZPUk1BVDoKKwljYXNlIEFDX1ZFUkJfR0VUX0FNUF9HQUlOX01VVEU6CisJCXJldHVybiB0cnVlOworCWNhc2UgQUNfVkVSQl9HRVRfUFJPQ19DT0VGOgorCQlyZXR1cm4gY29kZWMtPmNhY2hlX2NvZWY7CisJY2FzZSAweGYwMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN3aXRjaCAodmVyYikgeworCWNhc2UgQUNfVkVSQl9HRVRfQ09OTkVDVF9TRUw6CisJY2FzZSBBQ19WRVJCX0dFVF9TRElfU0VMRUNUOgorCWNhc2UgQUNfVkVSQl9HRVRfUElOX1dJREdFVF9DT05UUk9MOgorCWNhc2UgQUNfVkVSQl9HRVRfVU5TT0xJQ0lURURfUkVTUE9OU0U6IC8qIG9ubHkgYXMgU0VUX1VOU09MSUNJVEVEX0VOQUJMRSAqLworCWNhc2UgQUNfVkVSQl9HRVRfQkVFUF9DT05UUk9MOgorCWNhc2UgQUNfVkVSQl9HRVRfRUFQRF9CVExFTkFCTEU6CisJY2FzZSBBQ19WRVJCX0dFVF9ESUdJX0NPTlZFUlRfMToKKwljYXNlIEFDX1ZFUkJfR0VUX0RJR0lfQ09OVkVSVF8yOiAvKiBvbmx5IGZvciBiZWVwIGNvbnRyb2wgKi8KKwljYXNlIEFDX1ZFUkJfR0VUX1ZPTFVNRV9LTk9CX0NPTlRST0w6CisJY2FzZSBBQ19WRVJCX0dFVF9HUElPX01BU0s6CisJY2FzZSBBQ19WRVJCX0dFVF9HUElPX0RJUkVDVElPTjoKKwljYXNlIEFDX1ZFUkJfR0VUX0dQSU9fREFUQTogLyogbm90IGZvciB2b2xhdGlsZSByZWFkICovCisJY2FzZSBBQ19WRVJCX0dFVF9HUElPX1dBS0VfTUFTSzoKKwljYXNlIEFDX1ZFUkJfR0VUX0dQSU9fVU5TT0xJQ0lURURfUlNQX01BU0s6CisJY2FzZSBBQ19WRVJCX0dFVF9HUElPX1NUSUNLWV9NQVNLOgorCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGhkYV9yZWFkYWJsZV9yZWcoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCXN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMgPSBkZXZfdG9faGRhY19kZXYoZGV2KTsKKwl1bnNpZ25lZCBpbnQgdmVyYiA9IGdldF92ZXJiKHJlZyk7CisKKwlpZiAoY29kZWMtPmNhcHNfb3ZlcndyaXRpbmcpCisJCXJldHVybiB0cnVlOworCisJc3dpdGNoICh2ZXJiKSB7CisJY2FzZSBBQ19WRVJCX1BBUkFNRVRFUlM6CisJY2FzZSBBQ19WRVJCX0dFVF9DT05ORUNUX0xJU1Q6CisJY2FzZSBBQ19WRVJCX0dFVF9TVUJTWVNURU1fSUQ6CisJCXJldHVybiB0cnVlOworCS8qIGJlbG93IGFyZSBiYXNpY2FsbHkgd3JpdGFibGUsIGJ1dCBkaXNhYmxlZCBmb3IgcmVkdWNpbmcgdW5uZWNlc3NhcnkKKwkgKiB3cml0ZXMgYXQgc3luYworCSAqLworCWNhc2UgQUNfVkVSQl9HRVRfQ09ORklHX0RFRkFVTFQ6IC8qIHVzdWFsbHkganVzdCByZWFkICovCisJY2FzZSBBQ19WRVJCX0dFVF9DT05WOiAvKiBtYW5hZ2VkIGluIFBDTSBjb2RlICovCisJY2FzZSBBQ19WRVJCX0dFVF9DVlRfQ0hBTl9DT1VOVDogLyogbWFuYWdlZCBpbiBIRE1JIENBIGNvZGUgKi8KKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGhkYV93cml0ZWFibGVfcmVnKGRldiwgcmVnKTsKK30KKworLyoKKyAqIFN0ZXJlbyBhbXAgcHNldWRvIHJlZ2lzdGVyOgorICogZm9yIG1ha2luZyBlYXNpZXIgdG8gaGFuZGxlIHRoZSBzdGVyZW8gdm9sdW1lIGNvbnRyb2wsIHdlIHByb3ZpZGUgYQorICogZmFrZSByZWdpc3RlciB0byBkZWFsIGJvdGggbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgYnkgYSBzaW5nbGUKKyAqIChwc2V1ZG8pIHJlZ2lzdGVyIGFjY2Vzcy4gIEEgdmVyYiBjb25zaXN0aW5nIG9mIFNFVF9BTVBfR0FJTiB3aXRoCisgKiAqYm90aCogU0VUX0xFRlQgYW5kIFNFVF9SSUdIVCBiaXRzIHRha2VzIGEgMTZiaXQgdmFsdWUsIHRoZSBsb3dlciA4Yml0CisgKiBmb3IgdGhlIGxlZnQgYW5kIHRoZSB1cHBlciA4Yml0IGZvciB0aGUgcmlnaHQgY2hhbm5lbC4KKyAqLworc3RhdGljIGJvb2wgaXNfc3RlcmVvX2FtcF92ZXJiKHVuc2lnbmVkIGludCByZWcpCit7CisJaWYgKCgocmVnID4+IDgpICYgMHg3MDApICE9IEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gKHJlZyAmIChBQ19BTVBfU0VUX0xFRlQgfCBBQ19BTVBfU0VUX1JJR0hUKSkgPT0KKwkJKEFDX0FNUF9TRVRfTEVGVCB8IEFDX0FNUF9TRVRfUklHSFQpOworfQorCisvKiByZWFkIGEgcHNldWRvIHN0ZXJlbyBhbXAgcmVnaXN0ZXIgKDE2Yml0IGxlZnQrcmlnaHQpICovCitzdGF0aWMgaW50IGhkYV9yZWdfcmVhZF9zdGVyZW9fYW1wKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsCisJCQkJICAgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50ICp2YWwpCit7CisJdW5zaWduZWQgaW50IGxlZnQsIHJpZ2h0OworCWludCBlcnI7CisKKwlyZWcgJj0gfihBQ19BTVBfU0VUX0xFRlQgfCBBQ19BTVBfU0VUX1JJR0hUKTsKKwllcnIgPSBzbmRfaGRhY19leGVjX3ZlcmIoY29kZWMsIHJlZyB8IEFDX0FNUF9HRVRfTEVGVCwgMCwgJmxlZnQpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9IHNuZF9oZGFjX2V4ZWNfdmVyYihjb2RlYywgcmVnIHwgQUNfQU1QX0dFVF9SSUdIVCwgMCwgJnJpZ2h0KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkqdmFsID0gbGVmdCB8IChyaWdodCA8PCA4KTsKKwlyZXR1cm4gMDsKK30KKworLyogd3JpdGUgYSBwc2V1ZG8gc3RlcmVvIGFtcCByZWdpc3RlciAoMTZiaXQgbGVmdCtyaWdodCkgKi8KK3N0YXRpYyBpbnQgaGRhX3JlZ193cml0ZV9zdGVyZW9fYW1wKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsCisJCQkJICAgIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBpbnQgdmVyYiwgbGVmdCwgcmlnaHQ7CisKKwl2ZXJiID0gQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSA8PCA4OworCWlmIChyZWcgJiBBQ19BTVBfR0VUX09VVFBVVCkKKwkJdmVyYiB8PSBBQ19BTVBfU0VUX09VVFBVVDsKKwllbHNlCisJCXZlcmIgfD0gQUNfQU1QX1NFVF9JTlBVVCB8ICgocmVnICYgMHhmKSA8PCA4KTsKKwlyZWcgPSAocmVnICYgfjB4ZmZmZmYpIHwgdmVyYjsKKworCWxlZnQgPSB2YWwgJiAweGZmOworCXJpZ2h0ID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJaWYgKGxlZnQgPT0gcmlnaHQpIHsKKwkJcmVnIHw9IEFDX0FNUF9TRVRfTEVGVCB8IEFDX0FNUF9TRVRfUklHSFQ7CisJCXJldHVybiBzbmRfaGRhY19leGVjX3ZlcmIoY29kZWMsIHJlZyB8IGxlZnQsIDAsIE5VTEwpOworCX0KKworCWVyciA9IHNuZF9oZGFjX2V4ZWNfdmVyYihjb2RlYywgcmVnIHwgQUNfQU1QX1NFVF9MRUZUIHwgbGVmdCwgMCwgTlVMTCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gc25kX2hkYWNfZXhlY192ZXJiKGNvZGVjLCByZWcgfCBBQ19BTVBfU0VUX1JJR0hUIHwgcmlnaHQsIDAsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCisvKiByZWFkIGEgcHNldWRvIGNvZWYgcmVnaXN0ZXIgKDE2Yml0KSAqLworc3RhdGljIGludCBoZGFfcmVnX3JlYWRfY29lZihzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJICAgICB1bnNpZ25lZCBpbnQgKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgdmVyYjsKKwlpbnQgZXJyOworCisJaWYgKCFjb2RlYy0+Y2FjaGVfY29lZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogTFNCIDhiaXQgPSBjb2VmIGluZGV4ICovCisJdmVyYiA9IChyZWcgJiB+MHhmZmYwMCkgfCAoQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCA8PCA4KTsKKwllcnIgPSBzbmRfaGRhY19leGVjX3ZlcmIoY29kZWMsIHZlcmIsIDAsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXZlcmIgPSAocmVnICYgfjB4ZmZmZmYpIHwgKEFDX1ZFUkJfR0VUX0NPRUZfSU5ERVggPDwgOCk7CisJcmV0dXJuIHNuZF9oZGFjX2V4ZWNfdmVyYihjb2RlYywgdmVyYiwgMCwgdmFsKTsKK30KKworLyogd3JpdGUgYSBwc2V1ZG8gY29lZiByZWdpc3RlciAoMTZiaXQpICovCitzdGF0aWMgaW50IGhkYV9yZWdfd3JpdGVfY29lZihzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmVnLAorCQkJICAgICAgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgdmVyYjsKKwlpbnQgZXJyOworCisJaWYgKCFjb2RlYy0+Y2FjaGVfY29lZikKKwkJcmV0dXJuIC1FSU5WQUw7CisJLyogTFNCIDhiaXQgPSBjb2VmIGluZGV4ICovCisJdmVyYiA9IChyZWcgJiB+MHhmZmYwMCkgfCAoQUNfVkVSQl9TRVRfQ09FRl9JTkRFWCA8PCA4KTsKKwllcnIgPSBzbmRfaGRhY19leGVjX3ZlcmIoY29kZWMsIHZlcmIsIDAsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXZlcmIgPSAocmVnICYgfjB4ZmZmZmYpIHwgKEFDX1ZFUkJfR0VUX0NPRUZfSU5ERVggPDwgOCkgfAorCQkodmFsICYgMHhmZmZmKTsKKwlyZXR1cm4gc25kX2hkYWNfZXhlY192ZXJiKGNvZGVjLCB2ZXJiLCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludCBoZGFfcmVnX3JlYWQodm9pZCAqY29udGV4dCwgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50ICp2YWwpCit7CisJc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYyA9IGNvbnRleHQ7CisJaW50IHZlcmIgPSBnZXRfdmVyYihyZWcpOworCWludCBlcnI7CisKKwlpZiAoIWNvZGVjX2lzX3J1bm5pbmcoY29kZWMpICYmIHZlcmIgIT0gQUNfVkVSQl9HRVRfUE9XRVJfU1RBVEUpCisJCXJldHVybiAtRUFHQUlOOworCXJlZyB8PSAoY29kZWMtPmFkZHIgPDwgMjgpOworCWlmIChpc19zdGVyZW9fYW1wX3ZlcmIocmVnKSkKKwkJcmV0dXJuIGhkYV9yZWdfcmVhZF9zdGVyZW9fYW1wKGNvZGVjLCByZWcsIHZhbCk7CisJaWYgKHZlcmIgPT0gQUNfVkVSQl9HRVRfUFJPQ19DT0VGKQorCQlyZXR1cm4gaGRhX3JlZ19yZWFkX2NvZWYoY29kZWMsIHJlZywgdmFsKTsKKwllcnIgPSBzbmRfaGRhY19leGVjX3ZlcmIoY29kZWMsIHJlZywgMCwgdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkvKiBzcGVjaWFsIGhhbmRsaW5nIGZvciBhc3ltbWV0cmljIHJlYWRzICovCisJaWYgKHZlcmIgPT0gQUNfVkVSQl9HRVRfUE9XRVJfU1RBVEUpIHsKKwkJaWYgKCp2YWwgJiBBQ19QV1JTVF9FUlJPUikKKwkJCSp2YWwgPSAtMTsKKwkJZWxzZSAvKiB0YWtlIG9ubHkgdGhlIGFjdHVhbCBzdGF0ZSAqLworCQkJKnZhbCA9ICgqdmFsID4+IDQpICYgMHgwZjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRhX3JlZ193cml0ZSh2b2lkICpjb250ZXh0LCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMgPSBjb250ZXh0OworCXVuc2lnbmVkIGludCB2ZXJiOworCWludCBpLCBieXRlcywgZXJyOworCisJcmVnICY9IH4weDAwMDgwMDAwVTsgLyogZHJvcCBHRVQgYml0ICovCisJcmVnIHw9IChjb2RlYy0+YWRkciA8PCAyOCk7CisJdmVyYiA9IGdldF92ZXJiKHJlZyk7CisKKwlpZiAoIWNvZGVjX2lzX3J1bm5pbmcoY29kZWMpICYmIHZlcmIgIT0gQUNfVkVSQl9TRVRfUE9XRVJfU1RBVEUpCisJCXJldHVybiBjb2RlYy0+bGF6eV9jYWNoZSA/IDAgOiAtRUFHQUlOOworCisJaWYgKGlzX3N0ZXJlb19hbXBfdmVyYihyZWcpKQorCQlyZXR1cm4gaGRhX3JlZ193cml0ZV9zdGVyZW9fYW1wKGNvZGVjLCByZWcsIHZhbCk7CisKKwlpZiAodmVyYiA9PSBBQ19WRVJCX1NFVF9QUk9DX0NPRUYpCisJCXJldHVybiBoZGFfcmVnX3dyaXRlX2NvZWYoY29kZWMsIHJlZywgdmFsKTsKKworCXN3aXRjaCAodmVyYiAmIDB4ZjAwKSB7CisJY2FzZSBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFOgorCQl2ZXJiID0gQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURTsKKwkJaWYgKHJlZyAmIEFDX0FNUF9HRVRfTEVGVCkKKwkJCXZlcmIgfD0gQUNfQU1QX1NFVF9MRUZUID4+IDg7CisJCWVsc2UKKwkJCXZlcmIgfD0gQUNfQU1QX1NFVF9SSUdIVCA+PiA4OworCQlpZiAocmVnICYgQUNfQU1QX0dFVF9PVVRQVVQpIHsKKwkJCXZlcmIgfD0gQUNfQU1QX1NFVF9PVVRQVVQgPj4gODsKKwkJfSBlbHNlIHsKKwkJCXZlcmIgfD0gQUNfQU1QX1NFVF9JTlBVVCA+PiA4OworCQkJdmVyYiB8PSByZWcgJiAweGY7CisJCX0KKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh2ZXJiKSB7CisJY2FzZSBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMToKKwkJYnl0ZXMgPSAyOworCQlicmVhazsKKwljYXNlIEFDX1ZFUkJfU0VUX0NPTkZJR19ERUZBVUxUX0JZVEVTXzA6CisJCWJ5dGVzID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnl0ZXMgPSAxOworCQlicmVhazsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgYnl0ZXM7IGkrKykgeworCQlyZWcgJj0gfjB4ZmZmZmY7CisJCXJlZyB8PSAodmVyYiArIGkpIDw8IDggfCAoKHZhbCA+PiAoOCAqIGkpKSAmIDB4ZmYpOworCQllcnIgPSBzbmRfaGRhY19leGVjX3ZlcmIoY29kZWMsIHJlZywgMCwgTlVMTCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIGhkYV9yZWdtYXBfY2ZnID0geworCS5uYW1lID0gImhkYXVkaW8iLAorCS5yZWdfYml0cyA9IDMyLAorCS52YWxfYml0cyA9IDMyLAorCS5tYXhfcmVnaXN0ZXIgPSAweGZmZmZmZmYsCisJLndyaXRlYWJsZV9yZWcgPSBoZGFfd3JpdGVhYmxlX3JlZywKKwkucmVhZGFibGVfcmVnID0gaGRhX3JlYWRhYmxlX3JlZywKKwkudm9sYXRpbGVfcmVnID0gaGRhX3ZvbGF0aWxlX3JlZywKKwkuY2FjaGVfdHlwZSA9IFJFR0NBQ0hFX1JCVFJFRSwKKwkucmVnX3JlYWQgPSBoZGFfcmVnX3JlYWQsCisJLnJlZ193cml0ZSA9IGhkYV9yZWdfd3JpdGUsCisJLnVzZV9zaW5nbGVfcncgPSB0cnVlLAorfTsKKworaW50IHNuZF9oZGFjX3JlZ21hcF9pbml0KHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJcmVnbWFwID0gcmVnbWFwX2luaXQoJmNvZGVjLT5kZXYsIE5VTEwsIGNvZGVjLCAmaGRhX3JlZ21hcF9jZmcpOworCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKwljb2RlYy0+cmVnbWFwID0gcmVnbWFwOworCXNuZF9hcnJheV9pbml0KCZjb2RlYy0+dmVuZG9yX3ZlcmJzLCBzaXplb2YodW5zaWduZWQgaW50KSwgOCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19yZWdtYXBfaW5pdCk7CisKK3ZvaWQgc25kX2hkYWNfcmVnbWFwX2V4aXQoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYykKK3sKKwlpZiAoY29kZWMtPnJlZ21hcCkgeworCQlyZWdtYXBfZXhpdChjb2RlYy0+cmVnbWFwKTsKKwkJY29kZWMtPnJlZ21hcCA9IE5VTEw7CisJCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+dmVuZG9yX3ZlcmJzKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19yZWdtYXBfZXhpdCk7CisKKy8qKgorICogc25kX2hkYWNfcmVnbWFwX2FkZF92ZW5kb3JfdmVyYiAtIGFkZCBhIHZlbmRvci1zcGVjaWZpYyB2ZXJiIHRvIHJlZ21hcAorICogQGNvZGVjOiB0aGUgY29kZWMgb2JqZWN0CisgKiBAdmVyYjogdmVyYiB0byBhbGxvdyBhY2Nlc3NpbmcgdmlhIHJlZ21hcAorICoKKyAqIFJldHVybnMgemVybyBmb3Igc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBzbmRfaGRhY19yZWdtYXBfYWRkX3ZlbmRvcl92ZXJiKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsCisJCQkJICAgIHVuc2lnbmVkIGludCB2ZXJiKQoreworCXVuc2lnbmVkIGludCAqcCA9IHNuZF9hcnJheV9uZXcoJmNvZGVjLT52ZW5kb3JfdmVyYnMpOworCisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKwkqcCA9IHZlcmIgfCAweDgwMDsgLyogc2V0IEdFVCBiaXQgKi8KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX3JlZ21hcF9hZGRfdmVuZG9yX3ZlcmIpOworCisvKgorICogaGVscGVyIGZ1bmN0aW9ucworICovCisKKy8qIHdyaXRlIGEgcHNldWRvLXJlZ2lzdGVyIHZhbHVlICh3L28gcG93ZXIgc2VxdWVuY2UpICovCitzdGF0aWMgaW50IHJlZ19yYXdfd3JpdGUoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJCSB1bnNpZ25lZCBpbnQgdmFsKQoreworCWlmICghY29kZWMtPnJlZ21hcCkKKwkJcmV0dXJuIGhkYV9yZWdfd3JpdGUoY29kZWMsIHJlZywgdmFsKTsKKwllbHNlCisJCXJldHVybiByZWdtYXBfd3JpdGUoY29kZWMtPnJlZ21hcCwgcmVnLCB2YWwpOworfQorCisvKioKKyAqIHNuZF9oZGFjX3JlZ21hcF93cml0ZV9yYXcgLSB3cml0ZSBhIHBzZXVkbyByZWdpc3RlciB3aXRoIHBvd2VyIG1nbXQKKyAqIEBjb2RlYzogdGhlIGNvZGVjIG9iamVjdAorICogQHJlZzogcHNldWRvIHJlZ2lzdGVyCisgKiBAdmFsOiB2YWx1ZSB0byB3cml0ZQorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNuZF9oZGFjX3JlZ21hcF93cml0ZV9yYXcoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgdW5zaWduZWQgaW50IHJlZywKKwkJCSAgICAgIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IGVycjsKKworCWVyciA9IHJlZ19yYXdfd3JpdGUoY29kZWMsIHJlZywgdmFsKTsKKwlpZiAoZXJyID09IC1FQUdBSU4pIHsKKwkJc25kX2hkYWNfcG93ZXJfdXBfcG0oY29kZWMpOworCQllcnIgPSByZWdfcmF3X3dyaXRlKGNvZGVjLCByZWcsIHZhbCk7CisJCXNuZF9oZGFjX3Bvd2VyX2Rvd25fcG0oY29kZWMpOworCX0KKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYWNfcmVnbWFwX3dyaXRlX3Jhdyk7CisKK3N0YXRpYyBpbnQgcmVnX3Jhd19yZWFkKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJCQl1bnNpZ25lZCBpbnQgKnZhbCkKK3sKKwlpZiAoIWNvZGVjLT5yZWdtYXApCisJCXJldHVybiBoZGFfcmVnX3JlYWQoY29kZWMsIHJlZywgdmFsKTsKKwllbHNlCisJCXJldHVybiByZWdtYXBfcmVhZChjb2RlYy0+cmVnbWFwLCByZWcsIHZhbCk7Cit9CisKKy8qKgorICogc25kX2hkYWNfcmVnbWFwX3JlYWRfcmF3IC0gcmVhZCBhIHBzZXVkbyByZWdpc3RlciB3aXRoIHBvd2VyIG1nbXQKKyAqIEBjb2RlYzogdGhlIGNvZGVjIG9iamVjdAorICogQHJlZzogcHNldWRvIHJlZ2lzdGVyCisgKiBAdmFsOiBwb2ludGVyIHRvIHN0b3JlIHRoZSByZWFkIHZhbHVlCisgKgorICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgc25kX2hkYWNfcmVnbWFwX3JlYWRfcmF3KHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJCQkgICAgIHVuc2lnbmVkIGludCAqdmFsKQoreworCWludCBlcnI7CisKKwllcnIgPSByZWdfcmF3X3JlYWQoY29kZWMsIHJlZywgdmFsKTsKKwlpZiAoZXJyID09IC1FQUdBSU4pIHsKKwkJc25kX2hkYWNfcG93ZXJfdXBfcG0oY29kZWMpOworCQllcnIgPSByZWdfcmF3X3JlYWQoY29kZWMsIHJlZywgdmFsKTsKKwkJc25kX2hkYWNfcG93ZXJfZG93bl9wbShjb2RlYyk7CisJfQorCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhY19yZWdtYXBfcmVhZF9yYXcpOworCisvKioKKyAqIHNuZF9oZGFjX3JlZ21hcF91cGRhdGVfcmF3IC0gdXBkYXRlIGEgcHNldWRvIHJlZ2lzdGVyIHdpdGggcG93ZXIgbWdtdAorICogQGNvZGVjOiB0aGUgY29kZWMgb2JqZWN0CisgKiBAcmVnOiBwc2V1ZG8gcmVnaXN0ZXIKKyAqIEBtYXNrOiBiaXQgbWFzayB0byB1ZHBhdGUKKyAqIEB2YWw6IHZhbHVlIHRvIHVwZGF0ZQorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHNuZF9oZGFjX3JlZ21hcF91cGRhdGVfcmF3KHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIHVuc2lnbmVkIGludCByZWcsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IG9yaWc7CisJaW50IGVycjsKKworCXZhbCAmPSBtYXNrOworCWVyciA9IHNuZF9oZGFjX3JlZ21hcF9yZWFkX3Jhdyhjb2RlYywgcmVnLCAmb3JpZyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJdmFsIHw9IG9yaWcgJiB+bWFzazsKKwlpZiAodmFsID09IG9yaWcpCisJCXJldHVybiAwOworCWVyciA9IHNuZF9oZGFjX3JlZ21hcF93cml0ZV9yYXcoY29kZWMsIHJlZywgdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFjX3JlZ21hcF91cGRhdGVfcmF3KTsKZGlmZiAtLWdpdCBhL3NvdW5kL2hkYS9oZGFjX3N5c2ZzLmMgYi9zb3VuZC9oZGEvaGRhY19zeXNmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNmNlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9oZGEvaGRhY19zeXNmcy5jCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogc3lzZnMgc3VwcG9ydCBmb3IgSEQtYXVkaW8gY29yZSBkZXZpY2UKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL2hkYXVkaW8uaD4KKyNpbmNsdWRlICJsb2NhbC5oIgorCitzdHJ1Y3QgaGRhY193aWRnZXRfdHJlZSB7CisJc3RydWN0IGtvYmplY3QgKnJvb3Q7CisJc3RydWN0IGtvYmplY3QgKmFmZzsKKwlzdHJ1Y3Qga29iamVjdCAqKm5vZGVzOworfTsKKworI2RlZmluZSBDT0RFQ19BVFRSKHR5cGUpCQkJCQlcCitzdGF0aWMgc3NpemVfdCB0eXBlIyNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCSAgIGNoYXIgKmJ1ZikJCQkJXAorewkJCQkJCQkJXAorCXN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMgPSBkZXZfdG9faGRhY19kZXYoZGV2KTsJXAorCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIGNvZGVjLT50eXBlKTsJCVwKK30gXAorc3RhdGljIERFVklDRV9BVFRSX1JPKHR5cGUpCisKKyNkZWZpbmUgQ09ERUNfQVRUUl9TVFIodHlwZSkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90IHR5cGUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCisJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCisJCQkJCWNoYXIgKmJ1ZikJCVwKK3sJCQkJCQkJCVwKKwlzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjID0gZGV2X3RvX2hkYWNfZGV2KGRldik7CVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlc1xuIiwJCQkJXAorCQkgICAgICAgY29kZWMtPnR5cGUgPyBjb2RlYy0+dHlwZSA6ICIiKTsJCVwKK30gXAorc3RhdGljIERFVklDRV9BVFRSX1JPKHR5cGUpCisKK0NPREVDX0FUVFIodHlwZSk7CitDT0RFQ19BVFRSKHZlbmRvcl9pZCk7CitDT0RFQ19BVFRSKHN1YnN5c3RlbV9pZCk7CitDT0RFQ19BVFRSKHJldmlzaW9uX2lkKTsKK0NPREVDX0FUVFIoYWZnKTsKK0NPREVDX0FUVFIobWZnKTsKK0NPREVDX0FUVFJfU1RSKHZlbmRvcl9uYW1lKTsKK0NPREVDX0FUVFJfU1RSKGNoaXBfbmFtZSk7CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpoZGFjX2Rldl9hdHRyc1tdID0geworCSZkZXZfYXR0cl90eXBlLmF0dHIsCisJJmRldl9hdHRyX3ZlbmRvcl9pZC5hdHRyLAorCSZkZXZfYXR0cl9zdWJzeXN0ZW1faWQuYXR0ciwKKwkmZGV2X2F0dHJfcmV2aXNpb25faWQuYXR0ciwKKwkmZGV2X2F0dHJfYWZnLmF0dHIsCisJJmRldl9hdHRyX21mZy5hdHRyLAorCSZkZXZfYXR0cl92ZW5kb3JfbmFtZS5hdHRyLAorCSZkZXZfYXR0cl9jaGlwX25hbWUuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBoZGFjX2Rldl9hdHRyX2dyb3VwID0geworCS5hdHRycwk9IGhkYWNfZGV2X2F0dHJzLAorfTsKKworY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqaGRhY19kZXZfYXR0cl9ncm91cHNbXSA9IHsKKwkmaGRhY19kZXZfYXR0cl9ncm91cCwKKwlOVUxMCit9OworCisvKgorICogV2lkZ2V0IHRyZWUgc3lzZnMKKyAqCisgKiBUaGlzIGlzIGEgdHJlZSBzaG93aW5nIHRoZSBhdHRyaWJ1dGVzIG9mIGVhY2ggd2lkZ2V0LiAgSXQgYXBwZWFycyBsaWtlCisgKiAvc3lzL2J1cy9oZGF1ZGlvQzBEMC93aWRnZXRzLzA0L2NhcHMKKyAqLworCitzdHJ1Y3Qgd2lkZ2V0X2F0dHJpYnV0ZTsKKworc3RydWN0IHdpZGdldF9hdHRyaWJ1dGUgeworCXN0cnVjdCBhdHRyaWJ1dGUJYXR0cjsKKwlzc2l6ZV90ICgqc2hvdykoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCXN0cnVjdCB3aWRnZXRfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCSBzdHJ1Y3Qgd2lkZ2V0X2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7Cit9OworCitzdGF0aWMgaW50IGdldF9jb2RlY19uaWQoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBoZGFjX2RldmljZSAqKmNvZGVjcCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBrb2JqX3RvX2Rldihrb2JqLT5wYXJlbnQtPnBhcmVudCk7CisJaW50IG5pZDsKKwlzc2l6ZV90IHJldDsKKworCXJldCA9IGtzdHJ0b2ludChrb2JqLT5uYW1lLCAxNiwgJm5pZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJKmNvZGVjcCA9IGRldl90b19oZGFjX2RldihkZXYpOworCXJldHVybiBuaWQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHdpZGdldF9hdHRyX3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCB3aWRnZXRfYXR0cmlidXRlICp3aWRfYXR0ciA9CisJCWNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgd2lkZ2V0X2F0dHJpYnV0ZSwgYXR0cik7CisJc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYzsKKwlpbnQgbmlkOworCisJaWYgKCF3aWRfYXR0ci0+c2hvdykKKwkJcmV0dXJuIC1FSU87CisJbmlkID0gZ2V0X2NvZGVjX25pZChrb2JqLCAmY29kZWMpOworCWlmIChuaWQgPCAwKQorCQlyZXR1cm4gbmlkOworCXJldHVybiB3aWRfYXR0ci0+c2hvdyhjb2RlYywgbmlkLCB3aWRfYXR0ciwgYnVmKTsKK30KKworc3RhdGljIHNzaXplX3Qgd2lkZ2V0X2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCB3aWRnZXRfYXR0cmlidXRlICp3aWRfYXR0ciA9CisJCWNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgd2lkZ2V0X2F0dHJpYnV0ZSwgYXR0cik7CisJc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYzsKKwlpbnQgbmlkOworCisJaWYgKCF3aWRfYXR0ci0+c3RvcmUpCisJCXJldHVybiAtRUlPOworCW5pZCA9IGdldF9jb2RlY19uaWQoa29iaiwgJmNvZGVjKTsKKwlpZiAobmlkIDwgMCkKKwkJcmV0dXJuIG5pZDsKKwlyZXR1cm4gd2lkX2F0dHItPnN0b3JlKGNvZGVjLCBuaWQsIHdpZF9hdHRyLCBidWYsIGNvdW50KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMgd2lkZ2V0X3N5c2ZzX29wcyA9IHsKKwkuc2hvdwk9IHdpZGdldF9hdHRyX3Nob3csCisJLnN0b3JlCT0gd2lkZ2V0X2F0dHJfc3RvcmUsCit9OworCitzdGF0aWMgdm9pZCB3aWRnZXRfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlrZnJlZShrb2JqKTsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgd2lkZ2V0X2t0eXBlID0geworCS5yZWxlYXNlCT0gd2lkZ2V0X3JlbGVhc2UsCisJLnN5c2ZzX29wcwk9ICZ3aWRnZXRfc3lzZnNfb3BzLAorfTsKKworI2RlZmluZSBXSURHRVRfQVRUUl9STyhfbmFtZSkgXAorCXN0cnVjdCB3aWRnZXRfYXR0cmlidXRlIHdpZF9hdHRyXyMjX25hbWUgPSBfX0FUVFJfUk8oX25hbWUpCisjZGVmaW5lIFdJREdFVF9BVFRSX1JXKF9uYW1lKSBcCisJc3RydWN0IHdpZGdldF9hdHRyaWJ1dGUgd2lkX2F0dHJfIyNfbmFtZSA9IF9fQVRUUl9SVyhfbmFtZSkKKworc3RhdGljIHNzaXplX3QgY2Fwc19zaG93KHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQlzdHJ1Y3Qgd2lkZ2V0X2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgZ2V0X3djYXBzKGNvZGVjLCBuaWQpKTsKK30KKworc3RhdGljIHNzaXplX3QgcGluX2NhcHNfc2hvdyhzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJICAgICBzdHJ1Y3Qgd2lkZ2V0X2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCWlmIChnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpICE9IEFDX1dJRF9QSU4pCisJCXJldHVybiAwOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwKKwkJICAgICAgIHNuZF9oZGFjX3JlYWRfcGFybShjb2RlYywgbmlkLCBBQ19QQVJfUElOX0NBUCkpOworfQorCitzdGF0aWMgc3NpemVfdCBwaW5fY2ZnX3Nob3coc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCSAgICBzdHJ1Y3Qgd2lkZ2V0X2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAoZ2V0X3djYXBzX3R5cGUoZ2V0X3djYXBzKGNvZGVjLCBuaWQpKSAhPSBBQ19XSURfUElOKQorCQlyZXR1cm4gMDsKKwlpZiAoc25kX2hkYWNfcmVhZChjb2RlYywgbmlkLCBBQ19WRVJCX0dFVF9DT05GSUdfREVGQVVMVCwgMCwgJnZhbCkpCisJCXJldHVybiAwOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgdmFsKTsKK30KKworc3RhdGljIGJvb2wgaGFzX3BjbV9jYXAoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCkKK3sKKwlpZiAobmlkID09IGNvZGVjLT5hZmcgfHwgbmlkID09IGNvZGVjLT5tZmcpCisJCXJldHVybiB0cnVlOworCXN3aXRjaCAoZ2V0X3djYXBzX3R5cGUoZ2V0X3djYXBzKGNvZGVjLCBuaWQpKSkgeworCWNhc2UgQUNfV0lEX0FVRF9PVVQ6CisJY2FzZSBBQ19XSURfQVVEX0lOOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBwY21fY2Fwc19zaG93KHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgICAgIHN0cnVjdCB3aWRnZXRfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaWYgKCFoYXNfcGNtX2NhcChjb2RlYywgbmlkKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDh4XG4iLAorCQkgICAgICAgc25kX2hkYWNfcmVhZF9wYXJtKGNvZGVjLCBuaWQsIEFDX1BBUl9QQ00pKTsKK30KKworc3RhdGljIHNzaXplX3QgcGNtX2Zvcm1hdHNfc2hvdyhzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJCXN0cnVjdCB3aWRnZXRfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaWYgKCFoYXNfcGNtX2NhcChjb2RlYywgbmlkKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDh4XG4iLAorCQkgICAgICAgc25kX2hkYWNfcmVhZF9wYXJtKGNvZGVjLCBuaWQsIEFDX1BBUl9TVFJFQU0pKTsKK30KKworc3RhdGljIHNzaXplX3QgYW1wX2luX2NhcHNfc2hvdyhzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJCXN0cnVjdCB3aWRnZXRfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaWYgKG5pZCAhPSBjb2RlYy0+YWZnICYmICEoZ2V0X3djYXBzKGNvZGVjLCBuaWQpICYgQUNfV0NBUF9JTl9BTVApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsCisJCSAgICAgICBzbmRfaGRhY19yZWFkX3Bhcm0oY29kZWMsIG5pZCwgQUNfUEFSX0FNUF9JTl9DQVApKTsKK30KKworc3RhdGljIHNzaXplX3QgYW1wX291dF9jYXBzX3Nob3coc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCQkgc3RydWN0IHdpZGdldF9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpZiAobmlkICE9IGNvZGVjLT5hZmcgJiYgIShnZXRfd2NhcHMoY29kZWMsIG5pZCkgJiBBQ19XQ0FQX09VVF9BTVApKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsCisJCSAgICAgICBzbmRfaGRhY19yZWFkX3Bhcm0oY29kZWMsIG5pZCwgQUNfUEFSX0FNUF9PVVRfQ0FQKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBvd2VyX2NhcHNfc2hvdyhzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAorCQkJICAgICAgIHN0cnVjdCB3aWRnZXRfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJaWYgKG5pZCAhPSBjb2RlYy0+YWZnICYmICEoZ2V0X3djYXBzKGNvZGVjLCBuaWQpICYgQUNfV0NBUF9QT1dFUikpCisJCXJldHVybiAwOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwKKwkJICAgICAgIHNuZF9oZGFjX3JlYWRfcGFybShjb2RlYywgbmlkLCBBQ19QQVJfUE9XRVJfU1RBVEUpKTsKK30KKworc3RhdGljIHNzaXplX3QgZ3Bpb19jYXBzX3Nob3coc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCSAgICAgIHN0cnVjdCB3aWRnZXRfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDh4XG4iLAorCQkgICAgICAgc25kX2hkYWNfcmVhZF9wYXJtKGNvZGVjLCBuaWQsIEFDX1BBUl9HUElPX0NBUCkpOworfQorCitzdGF0aWMgc3NpemVfdCBjb25uZWN0aW9uc19zaG93KHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkJc3RydWN0IHdpZGdldF9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwloZGFfbmlkX3QgbGlzdFszMl07CisJaW50IGksIG5jb25uczsKKwlzc2l6ZV90IHJldCA9IDA7CisKKwluY29ubnMgPSBzbmRfaGRhY19nZXRfY29ubmVjdGlvbnMoY29kZWMsIG5pZCwgbGlzdCwgQVJSQVlfU0laRShsaXN0KSk7CisJaWYgKG5jb25ucyA8PSAwKQorCQlyZXR1cm4gbmNvbm5zOworCWZvciAoaSA9IDA7IGkgPCBuY29ubnM7IGkrKykKKwkJcmV0ICs9IHNwcmludGYoYnVmICsgcmV0LCAiJXMweCUwMngiLCBpID8gIiAiIDogIiIsIGxpc3RbaV0pOworCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIlxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIFdJREdFVF9BVFRSX1JPKGNhcHMpOworc3RhdGljIFdJREdFVF9BVFRSX1JPKHBpbl9jYXBzKTsKK3N0YXRpYyBXSURHRVRfQVRUUl9STyhwaW5fY2ZnKTsKK3N0YXRpYyBXSURHRVRfQVRUUl9STyhwY21fY2Fwcyk7CitzdGF0aWMgV0lER0VUX0FUVFJfUk8ocGNtX2Zvcm1hdHMpOworc3RhdGljIFdJREdFVF9BVFRSX1JPKGFtcF9pbl9jYXBzKTsKK3N0YXRpYyBXSURHRVRfQVRUUl9STyhhbXBfb3V0X2NhcHMpOworc3RhdGljIFdJREdFVF9BVFRSX1JPKHBvd2VyX2NhcHMpOworc3RhdGljIFdJREdFVF9BVFRSX1JPKGdwaW9fY2Fwcyk7CitzdGF0aWMgV0lER0VUX0FUVFJfUk8oY29ubmVjdGlvbnMpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqd2lkZ2V0X25vZGVfYXR0cnNbXSA9IHsKKwkmd2lkX2F0dHJfY2Fwcy5hdHRyLAorCSZ3aWRfYXR0cl9waW5fY2Fwcy5hdHRyLAorCSZ3aWRfYXR0cl9waW5fY2ZnLmF0dHIsCisJJndpZF9hdHRyX3BjbV9jYXBzLmF0dHIsCisJJndpZF9hdHRyX3BjbV9mb3JtYXRzLmF0dHIsCisJJndpZF9hdHRyX2FtcF9pbl9jYXBzLmF0dHIsCisJJndpZF9hdHRyX2FtcF9vdXRfY2Fwcy5hdHRyLAorCSZ3aWRfYXR0cl9wb3dlcl9jYXBzLmF0dHIsCisJJndpZF9hdHRyX2Nvbm5lY3Rpb25zLmF0dHIsCisJTlVMTCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp3aWRnZXRfYWZnX2F0dHJzW10gPSB7CisJJndpZF9hdHRyX3BjbV9jYXBzLmF0dHIsCisJJndpZF9hdHRyX3BjbV9mb3JtYXRzLmF0dHIsCisJJndpZF9hdHRyX2FtcF9pbl9jYXBzLmF0dHIsCisJJndpZF9hdHRyX2FtcF9vdXRfY2Fwcy5hdHRyLAorCSZ3aWRfYXR0cl9wb3dlcl9jYXBzLmF0dHIsCisJJndpZF9hdHRyX2dwaW9fY2Fwcy5hdHRyLAorCU5VTEwsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB3aWRnZXRfbm9kZV9ncm91cCA9IHsKKwkuYXR0cnMgPSB3aWRnZXRfbm9kZV9hdHRycywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHdpZGdldF9hZmdfZ3JvdXAgPSB7CisJLmF0dHJzID0gd2lkZ2V0X2FmZ19hdHRycywKK307CisKK3N0YXRpYyB2b2lkIGZyZWVfd2lkZ2V0X25vZGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkgICAgIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgKmdyb3VwKQoreworCWlmIChrb2JqKSB7CisJCXN5c2ZzX3JlbW92ZV9ncm91cChrb2JqLCBncm91cCk7CisJCWtvYmplY3RfcHV0KGtvYmopOworCX0KK30KKworc3RhdGljIHZvaWQgd2lkZ2V0X3RyZWVfZnJlZShzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKQoreworCXN0cnVjdCBoZGFjX3dpZGdldF90cmVlICp0cmVlID0gY29kZWMtPndpZGdldHM7CisJc3RydWN0IGtvYmplY3QgKipwOworCisJaWYgKCF0cmVlKQorCQlyZXR1cm47CisJZnJlZV93aWRnZXRfbm9kZSh0cmVlLT5hZmcsICZ3aWRnZXRfYWZnX2dyb3VwKTsKKwlpZiAodHJlZS0+bm9kZXMpIHsKKwkJZm9yIChwID0gdHJlZS0+bm9kZXM7ICpwOyBwKyspCisJCQlmcmVlX3dpZGdldF9ub2RlKCpwLCAmd2lkZ2V0X25vZGVfZ3JvdXApOworCQlrZnJlZSh0cmVlLT5ub2Rlcyk7CisJfQorCWlmICh0cmVlLT5yb290KQorCQlrb2JqZWN0X3B1dCh0cmVlLT5yb290KTsKKwlrZnJlZSh0cmVlKTsKKwljb2RlYy0+d2lkZ2V0cyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3dpZGdldF9ub2RlKHN0cnVjdCBrb2JqZWN0ICpwYXJlbnQsIGhkYV9uaWRfdCBuaWQsCisJCQkgICBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwICpncm91cCwKKwkJCSAgIHN0cnVjdCBrb2JqZWN0ICoqcmVzKQoreworCXN0cnVjdCBrb2JqZWN0ICprb2JqID0ga3phbGxvYyhzaXplb2YoKmtvYmopLCBHRlBfS0VSTkVMKTsKKwlpbnQgZXJyOworCisJaWYgKCFrb2JqKQorCQlyZXR1cm4gLUVOT01FTTsKKwlrb2JqZWN0X2luaXQoa29iaiwgJndpZGdldF9rdHlwZSk7CisJZXJyID0ga29iamVjdF9hZGQoa29iaiwgcGFyZW50LCAiJTAyeCIsIG5pZCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKGtvYmosIGdyb3VwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrb2JqZWN0X3B1dChrb2JqKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkqcmVzID0ga29iajsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB3aWRnZXRfdHJlZV9jcmVhdGUoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYykKK3sKKwlzdHJ1Y3QgaGRhY193aWRnZXRfdHJlZSAqdHJlZTsKKwlpbnQgaSwgZXJyOworCWhkYV9uaWRfdCBuaWQ7CisKKwl0cmVlID0gY29kZWMtPndpZGdldHMgPSBremFsbG9jKHNpemVvZigqdHJlZSksIEdGUF9LRVJORUwpOworCWlmICghdHJlZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cmVlLT5yb290ID0ga29iamVjdF9jcmVhdGVfYW5kX2FkZCgid2lkZ2V0cyIsICZjb2RlYy0+ZGV2LmtvYmopOworCWlmICghdHJlZS0+cm9vdCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cmVlLT5ub2RlcyA9IGtjYWxsb2MoY29kZWMtPm51bV9ub2RlcyArIDEsIHNpemVvZigqdHJlZS0+bm9kZXMpLAorCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCF0cmVlLT5ub2RlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwLCBuaWQgPSBjb2RlYy0+c3RhcnRfbmlkOyBpIDwgY29kZWMtPm51bV9ub2RlczsgaSsrLCBuaWQrKykgeworCQllcnIgPSBhZGRfd2lkZ2V0X25vZGUodHJlZS0+cm9vdCwgbmlkLCAmd2lkZ2V0X25vZGVfZ3JvdXAsCisJCQkJICAgICAgJnRyZWUtPm5vZGVzW2ldKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWlmIChjb2RlYy0+YWZnKSB7CisJCWVyciA9IGFkZF93aWRnZXRfbm9kZSh0cmVlLT5yb290LCBjb2RlYy0+YWZnLAorCQkJCSAgICAgICZ3aWRnZXRfYWZnX2dyb3VwLCAmdHJlZS0+YWZnKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCWtvYmplY3RfdWV2ZW50KHRyZWUtPnJvb3QsIEtPQkpfQ0hBTkdFKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGhkYV93aWRnZXRfc3lzZnNfaW5pdChzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKQoreworCWludCBlcnI7CisKKwllcnIgPSB3aWRnZXRfdHJlZV9jcmVhdGUoY29kZWMpOworCWlmIChlcnIgPCAwKSB7CisJCXdpZGdldF90cmVlX2ZyZWUoY29kZWMpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIGhkYV93aWRnZXRfc3lzZnNfZXhpdChzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKQoreworCXdpZGdldF90cmVlX2ZyZWUoY29kZWMpOworfQpkaWZmIC0tZ2l0IGEvc291bmQvaGRhL2xvY2FsLmggYi9zb3VuZC9oZGEvbG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjkyZjQxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvaGRhL2xvY2FsLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIExvY2FsIGhlbHBlciBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBmb3IgSEQtYXVkaW8gY29yZSBkcml2ZXJzCisgKi8KKworI2lmbmRlZiBfX0hEQUNfTE9DQUxfSAorI2RlZmluZSBfX0hEQUNfTE9DQUxfSAorCisjZGVmaW5lIGdldF93Y2Fwcyhjb2RlYywgbmlkKSBcCisJc25kX2hkYWNfcmVhZF9wYXJtKGNvZGVjLCBuaWQsIEFDX1BBUl9BVURJT19XSURHRVRfQ0FQKQorCisvKiBnZXQgdGhlIHdpZGdldCB0eXBlIGZyb20gd2lkZ2V0IGNhcGFiaWxpdHkgYml0cyAqLworc3RhdGljIGlubGluZSBpbnQgZ2V0X3djYXBzX3R5cGUodW5zaWduZWQgaW50IHdjYXBzKQoreworCWlmICghd2NhcHMpCisJCXJldHVybiAtMTsgLyogaW52YWxpZCB0eXBlICovCisJcmV0dXJuICh3Y2FwcyAmIEFDX1dDQVBfVFlQRSkgPj4gQUNfV0NBUF9UWVBFX1NISUZUOworfQorCitleHRlcm4gY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqaGRhY19kZXZfYXR0cl9ncm91cHNbXTsKK2ludCBoZGFfd2lkZ2V0X3N5c2ZzX2luaXQoc3RydWN0IGhkYWNfZGV2aWNlICpjb2RlYyk7Cit2b2lkIGhkYV93aWRnZXRfc3lzZnNfZXhpdChzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjKTsKKworI2VuZGlmIC8qIF9fSERBQ19MT0NBTF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9oZGEvdHJhY2UuYyBiL3NvdW5kL2hkYS90cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMmQ2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9oZGEvdHJhY2UuYwpAQCAtMCwwICsxLDYgQEAKKy8qCisgKiB0cmFjZXBvaW50IGRlZmluaXRpb25zIGZvciBIRC1hdWRpbyBjb3JlIGRyaXZlcnMKKyAqLworCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlICJ0cmFjZS5oIgpkaWZmIC0tZ2l0IGEvc291bmQvaGRhL3RyYWNlLmggYi9zb3VuZC9oZGEvdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2E3ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvaGRhL3RyYWNlLmgKQEAgLTAsMCArMSw2MiBAQAorI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gaGRhCisKKyNpZiAhZGVmaW5lZChfX0hEQUNfVFJBQ0VfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX19IREFDX1RSQUNFX0gKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9oZGF1ZGlvLmg+CisKKyNpZm5kZWYgSERBQ19NU0dfTUFYCisjZGVmaW5lIEhEQUNfTVNHX01BWAk1MDAKKyNlbmRpZgorCitzdHJ1Y3QgaGRhY19idXM7CitzdHJ1Y3QgaGRhY19jb2RlYzsKKworVFJBQ0VfRVZFTlQoaGRhX3NlbmRfY21kLAorCVRQX1BST1RPKHN0cnVjdCBoZGFjX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgY21kKSwKKwlUUF9BUkdTKGJ1cywgY21kKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KF9fZHluYW1pY19hcnJheShjaGFyLCBtc2csIEhEQUNfTVNHX01BWCkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlzbnByaW50ZihfX2dldF9zdHIobXNnKSwgSERBQ19NU0dfTUFYLAorCQkJICJbJXM6JWRdIHZhbD0weCUwOHgiLAorCQkJIGRldl9uYW1lKChidXMpLT5kZXYpLCAoY21kKSA+PiAyOCwgY21kKTsKKwkpLAorCVRQX3ByaW50aygiJXMiLCBfX2dldF9zdHIobXNnKSkKKyk7CisKK1RSQUNFX0VWRU5UKGhkYV9nZXRfcmVzcG9uc2UsCisJVFBfUFJPVE8oc3RydWN0IGhkYWNfYnVzICpidXMsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgcmVzKSwKKwlUUF9BUkdTKGJ1cywgYWRkciwgcmVzKSwKKwlUUF9TVFJVQ1RfX2VudHJ5KF9fZHluYW1pY19hcnJheShjaGFyLCBtc2csIEhEQUNfTVNHX01BWCkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlzbnByaW50ZihfX2dldF9zdHIobXNnKSwgSERBQ19NU0dfTUFYLAorCQkJICJbJXM6JWRdIHZhbD0weCUwOHgiLAorCQkJIGRldl9uYW1lKChidXMpLT5kZXYpLCBhZGRyLCByZXMpOworCSksCisJVFBfcHJpbnRrKCIlcyIsIF9fZ2V0X3N0cihtc2cpKQorKTsKKworVFJBQ0VfRVZFTlQoaGRhX3Vuc29sX2V2ZW50LAorCVRQX1BST1RPKHN0cnVjdCBoZGFjX2J1cyAqYnVzLCB1MzIgcmVzLCB1MzIgcmVzX2V4KSwKKwlUUF9BUkdTKGJ1cywgcmVzLCByZXNfZXgpLAorCVRQX1NUUlVDVF9fZW50cnkoX19keW5hbWljX2FycmF5KGNoYXIsIG1zZywgSERBQ19NU0dfTUFYKSksCisJVFBfZmFzdF9hc3NpZ24oCisJCXNucHJpbnRmKF9fZ2V0X3N0cihtc2cpLCBIREFDX01TR19NQVgsCisJCQkgIlslczolZF0gcmVzPTB4JTA4eCwgcmVzX2V4PTB4JTA4eCIsCisJCQkgZGV2X25hbWUoKGJ1cyktPmRldiksIHJlc19leCAmIDB4MGYsIHJlcywgcmVzX2V4KTsKKwkpLAorCVRQX3ByaW50aygiJXMiLCBfX2dldF9zdHIobXNnKSkKKyk7CisjZW5kaWYgLyogX19IREFDX1RSQUNFX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuCisKKyN1bmRlZiBUUkFDRV9JTkNMVURFX0ZJTEUKKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIHRyYWNlCisKKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL3NvdW5kL2kyYy9vdGhlci9hazQxMTMuYyBiL3NvdW5kL2kyYy9vdGhlci9hazQxMTMuYwppbmRleCA4ODg0NDg4Li4yMTgzZTllIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvYWs0MTEzLmMKKysrIGIvc291bmQvaTJjL290aGVyL2FrNDExMy5jCkBAIC03Myw3ICs3Myw3IEBACiAJCXZvaWQgKnByaXZhdGVfZGF0YSwgc3RydWN0IGFrNDExMyAqKnJfYWs0MTEzKQogewogCXN0cnVjdCBhazQxMTMgKmNoaXA7Ci0JaW50IGVyciA9IDA7CisJaW50IGVycjsKIAl1bnNpZ25lZCBjaGFyIHJlZzsKIAlzdGF0aWMgc3RydWN0IHNuZF9kZXZpY2Vfb3BzIG9wcyA9IHsKIAkJLmRldl9mcmVlID0gICAgIHNuZF9hazQxMTNfZGV2X2ZyZWUsCkBAIC0xMDksNyArMTA5LDcgQEAKIAogX19mYWlsOgogCXNuZF9hazQxMTNfZnJlZShjaGlwKTsKLQlyZXR1cm4gZXJyIDwgMCA/IGVyciA6IC1FSU87CisJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9hazQxMTNfY3JlYXRlKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvaXNhL3NiL2VtdTgwMDBfc3ludGguYyBiL3NvdW5kL2lzYS9zYi9lbXU4MDAwX3N5bnRoLmMKaW5kZXggNzIzMzJkZi4uNGFhNzE5YyAxMDA2NDQKLS0tIGEvc291bmQvaXNhL3NiL2VtdTgwMDBfc3ludGguYworKysgYi9zb3VuZC9pc2Evc2IvZW11ODAwMF9zeW50aC5jCkBAIC0zNCw4ICszNCw5IEBACiAvKgogICogY3JlYXRlIGEgbmV3IGhhcmR3YXJlIGRlcGVuZGVudCBkZXZpY2UgZm9yIEVtdTgwMDAKICAqLwotc3RhdGljIGludCBzbmRfZW11ODAwMF9uZXdfZGV2aWNlKHN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2KQorc3RhdGljIGludCBzbmRfZW11ODAwMF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogeworCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2ID0gdG9fc2VxX2RldihfZGV2KTsKIAlzdHJ1Y3Qgc25kX2VtdTgwMDAgKmh3OwogCXN0cnVjdCBzbmRfZW11eCAqZW11OwogCkBAIC05Myw4ICs5NCw5IEBACiAvKgogICogZnJlZSBhbGwgcmVzb3VyY2VzCiAgKi8KLXN0YXRpYyBpbnQgc25kX2VtdTgwMDBfZGVsZXRlX2RldmljZShzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc25kX2VtdTgwMDBfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKl9kZXYpCiB7CisJc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYgPSB0b19zZXFfZGV2KF9kZXYpOwogCXN0cnVjdCBzbmRfZW11ODAwMCAqaHc7CiAKIAlpZiAoZGV2LT5kcml2ZXJfZGF0YSA9PSBOVUxMKQpAQCAtMTE0LDIxICsxMTYsMTQgQEAKICAqICBJTklUIHBhcnQKICAqLwogCi1zdGF0aWMgaW50IF9faW5pdCBhbHNhX2VtdTgwMDBfaW5pdCh2b2lkKQotewotCQotCXN0YXRpYyBzdHJ1Y3Qgc25kX3NlcV9kZXZfb3BzIG9wcyA9IHsKLQkJc25kX2VtdTgwMDBfbmV3X2RldmljZSwKLQkJc25kX2VtdTgwMDBfZGVsZXRlX2RldmljZSwKLQl9OwotCXJldHVybiBzbmRfc2VxX2RldmljZV9yZWdpc3Rlcl9kcml2ZXIoU05EUlZfU0VRX0RFVl9JRF9FTVU4MDAwLCAmb3BzLAotCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9lbXU4MDAwKikpOwotfQorc3RhdGljIHN0cnVjdCBzbmRfc2VxX2RyaXZlciBlbXU4MDAwX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCQkucHJvYmUgPSBzbmRfZW11ODAwMF9wcm9iZSwKKwkJLnJlbW92ZSA9IHNuZF9lbXU4MDAwX3JlbW92ZSwKKwl9LAorCS5pZCA9IFNORFJWX1NFUV9ERVZfSURfRU1VODAwMCwKKwkuYXJnc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc25kX2VtdTgwMDAgKiksCit9OwogCi1zdGF0aWMgdm9pZCBfX2V4aXQgYWxzYV9lbXU4MDAwX2V4aXQodm9pZCkKLXsKLQlzbmRfc2VxX2RldmljZV91bnJlZ2lzdGVyX2RyaXZlcihTTkRSVl9TRVFfREVWX0lEX0VNVTgwMDApOwotfQotCi1tb2R1bGVfaW5pdChhbHNhX2VtdTgwMDBfaW5pdCkKLW1vZHVsZV9leGl0KGFsc2FfZW11ODAwMF9leGl0KQorbW9kdWxlX3NuZF9zZXFfZHJpdmVyKGVtdTgwMDBfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X2Z4LmMgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9meC5jCmluZGV4IGI1YTE5NzAuLjA2MDhhNWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X2Z4LmMKKysrIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfZnguYwpAQCAtNzksMTMgKzc5LDEzIEBACiAJaWYgKHBhZ2UgPCAwIHx8IHBhZ2UgPiA3KSB7CiAJCXNuZF9wcmludGsgKCJGWCBtZW1zZXQ6ICIKIAkJCSJwYWdlIG11c3QgYmUgPj0gMCBhbmQgPD0gN1xuIik7Ci0JCXJldHVybiAtKEVJTlZBTCk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmIChhZGRyIDwgMCB8fCBhZGRyID4gMHg3ZikgewogCQlzbmRfcHJpbnRrICgiRlggbWVtc2V0OiAiCiAJCQkiYWRkciBtdXN0IGJlID49IDAgYW5kIDw9IDdmXG4iKTsKLQkJcmV0dXJuIC0oRUlOVkFMKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGNudCA9PSAxKSB7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAkJCXNuZF9wcmludGsgKCJGWCBtZW1zZXQgIgogCQkJCSAgICAiKDB4JXgsIDB4JXgsIDB4JWx4LCAlZCkgaW5jb21wbGV0ZVxuIiwKIAkJCQkgICAgcGFnZSwgYWRkciwgKHVuc2lnbmVkIGxvbmcpIGRhdGEsIGNudCk7Ci0JCQlyZXR1cm4gLShFSU8pOworCQkJcmV0dXJuIC1FSU87CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X3N5bnRoLmMgYi9zb3VuZC9pc2Evd2F2ZWZyb250L3dhdmVmcm9udF9zeW50aC5jCmluZGV4IDMzZjVlYzEuLjY5Zjc2ZmYgMTAwNjQ0Ci0tLSBhL3NvdW5kL2lzYS93YXZlZnJvbnQvd2F2ZWZyb250X3N5bnRoLmMKKysrIGIvc291bmQvaXNhL3dhdmVmcm9udC93YXZlZnJvbnRfc3ludGguYwpAQCAtNzkzLDcgKzc5Myw3IEBACiAgICAgCiAJaWYgKHNuZF93YXZlZnJvbnRfY21kIChkZXYsIFdGQ19ET1dOTE9BRF9QQVRDSCwgTlVMTCwgYnVmKSkgewogCQlzbmRfcHJpbnRrICgiZG93bmxvYWQgcGF0Y2ggZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC0oRUlPKTsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAJcmV0dXJuICgwKTsKQEAgLTgzMSw3ICs4MzEsNyBAQAogICAgIAogCWlmIChzbmRfd2F2ZWZyb250X2NtZCAoZGV2LCBXRkNfRE9XTkxPQURfUFJPR1JBTSwgTlVMTCwgYnVmKSkgewogCQlzbmRfcHJpbnRrICgiZG93bmxvYWQgcGF0Y2ggZmFpbGVkXG4iKTsJCi0JCXJldHVybiAtKEVJTyk7CisJCXJldHVybiAtRUlPOwogCX0KIAogCXJldHVybiAoMCk7CkBAIC05NTIsNyArOTUyLDcgQEAKIAlpZiAoc2tpcCA+IDAgJiYgaGVhZGVyLT5oZHIucy5TYW1wbGVSZXNvbHV0aW9uICE9IExJTkVBUl8xNkJJVCkgewogCQlzbmRfcHJpbnRrICgiY2hhbm5lbCBzZWxlY3Rpb24gb25seSAiCiAJCQkgICAgInBvc3NpYmxlIG9uIDE2LWJpdCBzYW1wbGVzIik7Ci0JCXJldHVybiAtKEVJTlZBTCk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXN3aXRjaCAoc2tpcCkgewpAQCAtMTA0OSw3ICsxMDQ5LDcgQEAKIAkJCSAgIE5VTEwsIHNhbXBsZV9oZHIpKSB7CiAJCXNuZF9wcmludGsgKCJzYW1wbGUgJXNkb3dubG9hZCByZWZ1c2VkLlxuIiwKIAkJCSAgICBoZWFkZXItPnNpemUgPyAiIiA6ICJoZWFkZXIgIik7Ci0JCXJldHVybiAtKEVJTyk7CisJCXJldHVybiAtRUlPOwogCX0KIAogCWlmIChoZWFkZXItPnNpemUgPT0gMCkgewpAQCAtMTA3NSw3ICsxMDc1LDcgQEAKIAkJaWYgKHNuZF93YXZlZnJvbnRfY21kIChkZXYsIFdGQ19ET1dOTE9BRF9CTE9DSywgTlVMTCwgTlVMTCkpIHsKIAkJCXNuZF9wcmludGsgKCJkb3dubG9hZCBibG9jayAiCiAJCQkJICAgICJyZXF1ZXN0IHJlZnVzZWQuXG4iKTsKLQkJCXJldHVybiAtKEVJTyk7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCiAJCWZvciAoaSA9IDA7IGkgPCBibG9ja3NpemU7IGkrKykgewpAQCAtMTEzNSwxMiArMTEzNSwxMiBAQAogCQkJaWYgKGRtYV9hY2sgPT0gLTEpIHsKIAkJCQlzbmRfcHJpbnRrICgidXBsb2FkIHNhbXBsZSAiCiAJCQkJCSAgICAiRE1BIGFjayB0aW1lb3V0XG4iKTsKLQkJCQlyZXR1cm4gLShFSU8pOworCQkJCXJldHVybiAtRUlPOwogCQkJfSBlbHNlIHsKIAkJCQlzbmRfcHJpbnRrICgidXBsb2FkIHNhbXBsZSAiCiAJCQkJCSAgICAiRE1BIGFjayBlcnJvciAweCV4XG4iLAogCQkJCQkgICAgZG1hX2Fjayk7Ci0JCQkJcmV0dXJuIC0oRUlPKTsKKwkJCQlyZXR1cm4gLUVJTzsKIAkJCX0KIAkJfQogCX0KQEAgLTExODEsNyArMTE4MSw3IEBACiAKIAlpZiAoc25kX3dhdmVmcm9udF9jbWQgKGRldiwgV0ZDX0RPV05MT0FEX1NBTVBMRV9BTElBUywgTlVMTCwgYWxpYXNfaGRyKSkgewogCQlzbmRfcHJpbnRrICgiZG93bmxvYWQgYWxpYXMgZmFpbGVkLlxuIik7Ci0JCXJldHVybiAtKEVJTyk7CisJCXJldHVybiAtRUlPOwogCX0KIAogCWRldi0+c2FtcGxlX3N0YXR1c1toZWFkZXItPm51bWJlcl0gPSAoV0ZfU0xPVF9GSUxMRUR8V0ZfU1RfQUxJQVMpOwpAQCAtMTIzMiw3ICsxMjMyLDcgQEAKIAkJCSAgIG1zYW1wbGVfaGRyKSkgewogCQlzbmRfcHJpbnRrICgiZG93bmxvYWQgb2YgbXVsdGlzYW1wbGUgZmFpbGVkLlxuIik7CiAJCWtmcmVlKG1zYW1wbGVfaGRyKTsKLQkJcmV0dXJuIC0oRUlPKTsKKwkJcmV0dXJuIC1FSU87CiAJfQogCiAJZGV2LT5zYW1wbGVfc3RhdHVzW2hlYWRlci0+bnVtYmVyXSA9IChXRl9TTE9UX0ZJTExFRHxXRl9TVF9NVUxUSVNBTVBMRSk7CkBAIC0xMjU0LDcgKzEyNTQsNyBAQAogICAgIAogCWlmIChzbmRfd2F2ZWZyb250X2NtZCAoZGV2LCBXRkNfVVBMT0FEX01VTFRJU0FNUExFLCBsb2dfbnMsIG51bWJlcikpIHsKIAkJc25kX3ByaW50ayAoInVwbG9hZCBtdWx0aXNhbXBsZSBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIC0oRUlPKTsKKwkJcmV0dXJuIC1FSU87CiAJfQogICAgIAogCURQUklOVCAoV0ZfREVCVUdfREFUQSwgIm1zYW1wbGUgJWQgaGFzICVkIHNhbXBsZXNcbiIsCkBAIC0xMjczLDE0ICsxMjczLDE0IEBACiAJCWlmICgodmFsID0gd2F2ZWZyb250X3JlYWQgKGRldikpID09IC0xKSB7CiAJCQlzbmRfcHJpbnRrICgidXBsb2FkIG11bHRpc2FtcGxlIGZhaWxlZCAiCiAJCQkJICAgICJkdXJpbmcgc2FtcGxlIGxvb3AuXG4iKTsKLQkJCXJldHVybiAtKEVJTyk7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlkWzBdID0gdmFsOwogCiAJCWlmICgodmFsID0gd2F2ZWZyb250X3JlYWQgKGRldikpID09IC0xKSB7CiAJCQlzbmRfcHJpbnRrICgidXBsb2FkIG11bHRpc2FtcGxlIGZhaWxlZCAiCiAJCQkJICAgICJkdXJpbmcgc2FtcGxlIGxvb3AuXG4iKTsKLQkJCXJldHVybiAtKEVJTyk7CisJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlkWzFdID0gdmFsOwogCQpAQCAtMTMxNSw3ICsxMzE1LDcgQEAKIAogCWlmIChzbmRfd2F2ZWZyb250X2NtZCAoZGV2LCBXRkNfRE9XTkxPQURfRURSVU1fUFJPR1JBTSwgTlVMTCwgZHJ1bWJ1ZikpIHsKIAkJc25kX3ByaW50ayAoImRvd25sb2FkIGRydW0gZmFpbGVkLlxuIik7Ci0JCXJldHVybiAtKEVJTyk7CisJCXJldHVybiAtRUlPOwogCX0KIAogCXJldHVybiAoMCk7CmRpZmYgLS1naXQgYS9zb3VuZC9taXBzL2F1MXgwMC5jIGIvc291bmQvbWlwcy9hdTF4MDAuYwppbmRleCBmYmNhYTU0Li4xZTMwZTg0IDEwMDY0NAotLS0gYS9zb3VuZC9taXBzL2F1MXgwMC5jCisrKyBiL3NvdW5kL21pcHMvYXUxeDAwLmMKQEAgLTYzMywxOSArNjMzLDI1IEBACiAKIAlhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXVkaW9fc3RyZWFtKSwKIAkJCQkJICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pCisJaWYgKCFhdTEwMDAtPnN0cmVhbVtQTEFZQkFDS10pIHsKKwkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CisJfQogCWF1MTAwMC0+c3RyZWFtW1BMQVlCQUNLXS0+ZG1hID0gLTE7CiAKIAlhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpb19zdHJlYW0pLAogCQkJCQkgIEdGUF9LRVJORUwpOwotCWlmICghYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0pCisJaWYgKCFhdTEwMDAtPnN0cmVhbVtDQVBUVVJFXSkgeworCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKKwl9CiAJYXUxMDAwLT5zdHJlYW1bQ0FQVFVSRV0tPmRtYSA9IC0xOwogCiAJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JaWYgKCFyKQorCWlmICghcikgeworCQllcnIgPSAtRU5PREVWOwogCQlnb3RvIG91dDsKKwl9CiAKIAllcnIgPSAtRUJVU1k7CiAJYXUxMDAwLT5hYzk3X3Jlc19wb3J0ID0gcmVxdWVzdF9tZW1fcmVnaW9uKHItPnN0YXJ0LCByZXNvdXJjZV9zaXplKHIpLApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2Rldl90YWJsZS5jIGIvc291bmQvb3NzL2Rldl90YWJsZS5jCmluZGV4IGQ4Y2YzZTUuLjZkYWQ1MTUgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9kZXZfdGFibGUuYworKysgYi9zb3VuZC9vc3MvZGV2X3RhYmxlLmMKQEAgLTU4LDEzICs1OCwxMyBAQAogCiAJaWYgKHZlcnMgIT0gQVVESU9fRFJJVkVSX1ZFUlNJT04gfHwgZHJpdmVyX3NpemUgPiBzaXplb2Yoc3RydWN0IGF1ZGlvX2RyaXZlcikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogSW5jb21wYXRpYmxlIGF1ZGlvIGRyaXZlciBmb3IgJXNcbiIsIG5hbWUpOwotCQlyZXR1cm4gLShFSU5WQUwpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJbnVtID0gc291bmRfYWxsb2NfYXVkaW9kZXYoKTsKIAogCWlmIChudW0gPT0gLTEpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZDogVG9vIG1hbnkgYXVkaW8gZHJpdmVyc1xuIik7Ci0JCXJldHVybiAtKEVCVVNZKTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAJZCA9IChzdHJ1Y3QgYXVkaW9fZHJpdmVyICopIChzb3VuZF9tZW1fYmxvY2tzW3NvdW5kX25ibG9ja3NdID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX2RyaXZlcikpKTsKIAlzb3VuZF9uYmxvY2tzKys7CkBAIC03OSw3ICs3OSw3IEBACiAJaWYgKGQgPT0gTlVMTCB8fCBvcCA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiU291bmQ6IENhbid0IGFsbG9jYXRlIGRyaXZlciBmb3IgKCVzKVxuIiwgbmFtZSk7CiAJCXNvdW5kX3VubG9hZF9hdWRpb2RldihudW0pOwotCQlyZXR1cm4gLShFTk9NRU0pOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmb3AtPmluX3NsZWVwZXIpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9wLT5vdXRfc2xlZXBlcik7CQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL29wbDMuYyBiL3NvdW5kL29zcy9vcGwzLmMKaW5kZXggNjA3Y2VlNC4uYjZkMTlhZCAxMDA2NDQKLS0tIGEvc291bmQvb3NzL29wbDMuYworKysgYi9zb3VuZC9vc3Mvb3BsMy5jCkBAIC02NjYsNyArNjY2LDcgQEAKIAlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEZOVU1fTE9XICsgbWFwLT52b2ljZV9udW0sIGRhdGEpOwogCiAJZGF0YSA9IDB4MjAgfCAoKGJsb2NrICYgMHg3KSA8PCAyKSB8ICgoZm51bSA+PiA4KSAmIDB4Myk7Ci0JCSBkZXZjLT52b2Nbdm9pY2VdLmtleW9uX2J5dGUgPSBkYXRhOworCWRldmMtPnZvY1t2b2ljZV0ua2V5b25fYnl0ZSA9IGRhdGE7CiAJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBLRVlPTl9CTE9DSyArIG1hcC0+dm9pY2VfbnVtLCBkYXRhKTsKIAlpZiAodm9pY2VfbW9kZSA9PSA0KQogCQlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEtFWU9OX0JMT0NLICsgbWFwLT52b2ljZV9udW0gKyAzLCBkYXRhKTsKQEAgLTcxNyw3ICs3MTcsNyBAQAogCiBzdGF0aWMgdm9pZCBvcGwzX2NvbW1hbmQgICAgKGludCBpb19hZGRyLCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IHZhbCkKIHsKLQkgaW50IGk7CisJaW50IGk7CiAKIAkvKgogCSAqIFRoZSBvcmlnaW5hbCAyLU9QIHN5bnRoIHJlcXVpcmVzIGEgcXVpdGUgbG9uZyBkZWxheSBhZnRlciB3cml0aW5nIHRvIGEKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9lc3MuYyBiL3NvdW5kL29zcy9zYl9lc3MuYwppbmRleCBiNDdhNjkwLi41N2Y3ZDI1IDEwMDY0NAotLS0gYS9zb3VuZC9vc3Mvc2JfZXNzLmMKKysrIGIvc291bmQvb3NzL3NiX2Vzcy5jCkBAIC02MDQsNyArNjA0LDcgQEAKIAllc3NfY2hnbWl4ZXIgKGRldmMsIDB4NzgsIDB4MDMsIDB4MDMpOyAgIC8qIEdvICovCiAKIAlkZXZjLT5pcnFfbW9kZV8xNiA9IElNT0RFX09VVFBVVDsKLQkJZGV2Yy0+aW50cl9hY3RpdmVfMTYgPSAxOworCWRldmMtPmludHJfYWN0aXZlXzE2ID0gMTsKIH0KIAogc3RhdGljIHZvaWQgZXNzX2F1ZGlvX291dHB1dF9ibG9jawpAQCAtMTE4MywxNyArMTE4MywxMiBAQAogCQkJY2hpcCA9ICJFUzE2ODgiOwogCQl9CiAKLQkgICAgcHJpbnRrICggS0VSTl9JTkZPICJFU1MgY2hpcCAlcyAlcyVzXG4iCi0gICAgICAgICAgICAgICAsIGNoaXAKLSAgICAgICAgICAgICAgICwgKCBkZXZjLT5zYm1vLmVzc3R5cGUgPT0gRVNTVFlQRV9ERVRFQ1QgfHwgZGV2Yy0+c2Jtby5lc3N0eXBlID09IEVTU1RZUEVfTElLRTIwCi0gICAgICAgICAgICAgICAgID8gImRldGVjdGVkIgotICAgICAgICAgICAgICAgICA6ICJzcGVjaWZpZWQiCi0gICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICwgKCBkZXZjLT5zYm1vLmVzc3R5cGUgPT0gRVNTVFlQRV9MSUtFMjAKLSAgICAgICAgICAgICAgICAgPyAiIChrZXJuZWwgMi4wIGNvbXBhdGlibGUpIgotICAgICAgICAgICAgICAgICA6ICIiCi0gICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICk7CisJCXByaW50ayhLRVJOX0lORk8gIkVTUyBjaGlwICVzICVzJXNcbiIsIGNoaXAsCisJCSAgICAgICAoZGV2Yy0+c2Jtby5lc3N0eXBlID09IEVTU1RZUEVfREVURUNUIHx8CisJCQlkZXZjLT5zYm1vLmVzc3R5cGUgPT0gRVNTVFlQRV9MSUtFMjApID8KKwkJCQkiZGV0ZWN0ZWQiIDogInNwZWNpZmllZCIsCisJCQlkZXZjLT5zYm1vLmVzc3R5cGUgPT0gRVNTVFlQRV9MSUtFMjAgPworCQkJCSIgKGtlcm5lbCAyLjAgY29tcGF0aWJsZSkiIDogIiIpOwogCiAJCXNwcmludGYobmFtZSwiRVNTICVzIEF1ZGlvRHJpdmUgKHJldiAlZCkiLCBjaGlwLCBlc3NfbWlub3IgJiAweDBmKTsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NiX21pZGkuYyBiL3NvdW5kL29zcy9zYl9taWRpLmMKaW5kZXggZjEzOTAyOC4uNTUxZWU3NSAxMDA2NDQKLS0tIGEvc291bmQvb3NzL3NiX21pZGkuYworKysgYi9zb3VuZC9vc3Mvc2JfbWlkaS5jCkBAIC0xNzksMTQgKzE3OSwxNCBAQAogCXsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQgQmxhc3RlcjogIGZhaWxlZCB0byBhbGxvY2F0ZSBNSURJIG1lbW9yeS5cbiIpOwogCQlzb3VuZF91bmxvYWRfbWlkaWRldihkZXYpOwotCQkgIHJldHVybjsKKwkJcmV0dXJuOwogCX0KIAltZW1jcHkoKGNoYXIgKikgbWlkaV9kZXZzW2Rldl0sIChjaGFyICopICZzYl9taWRpX29wZXJhdGlvbnMsCiAJICAgICAgIHNpemVvZihzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSk7CiAKIAlpZiAob3duZXIpCi0JCQltaWRpX2RldnNbZGV2XS0+b3duZXIgPSBvd25lcjsKLQkKKwkJbWlkaV9kZXZzW2Rldl0tPm93bmVyID0gb3duZXI7CisKIAltaWRpX2RldnNbZGV2XS0+ZGV2YyA9IGRldmM7CiAKIApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3N5c190aW1lci5jIGIvc291bmQvb3NzL3N5c190aW1lci5jCmluZGV4IDlmMDM5ODMuLjIyMjZkZGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy9zeXNfdGltZXIuYworKysgYi9zb3VuZC9vc3Mvc3lzX3RpbWVyLmMKQEAgLTUwLDI5ICs1MCwyNCBAQAogc3RhdGljIHZvaWQKIHBvbGxfZGVmX3Rtcih1bnNpZ25lZCBsb25nIGR1bW15KQogeworCWlmICghb3BlbmVkKQorCQlyZXR1cm47CisJZGVmX3Rtci5leHBpcmVzID0gKDEpICsgamlmZmllczsKKwlhZGRfdGltZXIoJmRlZl90bXIpOwogCi0JaWYgKG9wZW5lZCkKLQkgIHsKKwlpZiAoIXRtcl9ydW5uaW5nKQorCQlyZXR1cm47CiAKLQkJICB7Ci0JCQkgIGRlZl90bXIuZXhwaXJlcyA9ICgxKSArIGppZmZpZXM7Ci0JCQkgIGFkZF90aW1lcigmZGVmX3Rtcik7Ci0JCSAgfQorCXNwaW5fbG9jaygmbG9jayk7CisJdG1yX2N0cisrOworCWN1cnJfdGlja3MgPSB0aWNrc19vZmZzICsgdG1yMnRpY2tzKHRtcl9jdHIpOwogCi0JCSAgaWYgKHRtcl9ydW5uaW5nKQotCQkgICAgewotCQkJCXNwaW5fbG9jaygmbG9jayk7Ci0JCQkgICAgdG1yX2N0cisrOwotCQkJICAgIGN1cnJfdGlja3MgPSB0aWNrc19vZmZzICsgdG1yMnRpY2tzKHRtcl9jdHIpOworCWlmIChjdXJyX3RpY2tzID49IG5leHRfZXZlbnRfdGltZSkgeworCQluZXh0X2V2ZW50X3RpbWUgPSAodW5zaWduZWQgbG9uZykgLTE7CisJCXNlcXVlbmNlcl90aW1lcigwKTsKKwl9CiAKLQkJCSAgICBpZiAoY3Vycl90aWNrcyA+PSBuZXh0X2V2ZW50X3RpbWUpCi0JCQkgICAgICB7Ci0JCQkJICAgICAgbmV4dF9ldmVudF90aW1lID0gKHVuc2lnbmVkIGxvbmcpIC0xOwotCQkJCSAgICAgIHNlcXVlbmNlcl90aW1lcigwKTsKLQkJCSAgICAgIH0KLQkJCQlzcGluX3VubG9jaygmbG9jayk7Ci0JCSAgICB9Ci0JICB9CisJc3Bpbl91bmxvY2soJmxvY2spOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3ZfbWlkaS5jIGIvc291bmQvb3NzL3ZfbWlkaS5jCmluZGV4IGYwYjQxNTEuLmZjMGJhMjcgMTAwNjQ0Ci0tLSBhL3NvdW5kL29zcy92X21pZGkuYworKysgYi9zb3VuZC9vc3Mvdl9taWRpLmMKQEAgLTQ5LDEzICs0OSwxMyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoZGV2YyA9PSBOVUxMKQotCQlyZXR1cm4gLShFTlhJTyk7CisJCXJldHVybiAtRU5YSU87CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CiAJaWYgKGRldmMtPm9wZW5lZCkKIAl7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOwotCQlyZXR1cm4gLShFQlVTWSk7CisJCXJldHVybiAtRUJVU1k7CiAJfQogCWRldmMtPm9wZW5lZCA9IDE7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMgYi9zb3VuZC9wY2kvYWM5Ny9hYzk3X2NvZGVjLmMKaW5kZXggNWVlMmYxNy4uODIyNTljYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FjOTcvYWM5N19jb2RlYy5jCisrKyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfY29kZWMuYwpAQCAtMTc3LDYgKzE3Nyw3IEBACiB7IDB4NTQ1MjQxMjMsIDB4ZmZmZmZmZmYsICJUUjI4NjAyIiwJCU5VTEwsCQlOVUxMIH0sIC8vIG9ubHkgZ3Vlc3MgLS1qayBbVFIyODAyMyA9IGVNaWNybyBFTTI4MDIzIChuZXcgQ1QxMjk3KV0KIHsgMHg1NDU4NGUwMywgMHhmZmZmZmZmZiwgIlRMVjMyMEFJQzI3IiwJTlVMTCwJCU5VTEwgfSwKIHsgMHg1NDU4NGUyMCwgMHhmZmZmZmZmZiwgIlRMQzMyMEFEOXhDIiwJTlVMTCwJCU5VTEwgfSwKK3sgMHg1NjQ5NDEyMCwgMHhmZmZmZmZmMCwgIlZJQTE2MTMiLAkJcGF0Y2hfdnQxNjEzLAlOVUxMIH0sCiB7IDB4NTY0OTQxNjEsIDB4ZmZmZmZmZmYsICJWSUExNjEyQSIsCQlOVUxMLAkJTlVMTCB9LCAvLyBtb2RpZmllZCBJQ0UxMjMyIHdpdGggUy9QRElGCiB7IDB4NTY0OTQxNzAsIDB4ZmZmZmZmZmYsICJWSUExNjE3QSIsCQlwYXRjaF92dDE2MTdhLAlOVUxMIH0sIC8vIG1vZGlmaWVkIFZUMTYxNiB3aXRoIFMvUERJRgogeyAweDU2NDk0MTgyLCAweGZmZmZmZmZmLCAiVklBMTYxOCIsCQlwYXRjaF92dDE2MTgsICAgTlVMTCB9LApAQCAtMjkwMSw3ICsyOTAyLDggQEAKICAqIFJldHVybjogWmVybyBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KICAqLwogCi1pbnQgc25kX2FjOTdfdHVuZV9oYXJkd2FyZShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsIHN0cnVjdCBhYzk3X3F1aXJrICpxdWlyaywgY29uc3QgY2hhciAqb3ZlcnJpZGUpCitpbnQgc25kX2FjOTdfdHVuZV9oYXJkd2FyZShzdHJ1Y3Qgc25kX2FjOTcgKmFjOTcsCisJCQkgICBjb25zdCBzdHJ1Y3QgYWM5N19xdWlyayAqcXVpcmssIGNvbnN0IGNoYXIgKm92ZXJyaWRlKQogewogCWludCByZXN1bHQ7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYyBiL3NvdW5kL3BjaS9hYzk3L2FjOTdfcGF0Y2guYwppbmRleCBjZWFhYzFjLi5mNDIzNGVkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvYWM5Ny9hYzk3X3BhdGNoLmMKKysrIGIvc291bmQvcGNpL2FjOTcvYWM5N19wYXRjaC5jCkBAIC0zMzUyLDYgKzMzNTIsMzMgQEAKIH0KIAogLyoKKyAqIFZJQSBWVDE2MTMgY29kZWMKKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9hYzk3X2NvbnRyb2xzX3Z0MTYxM1tdID0geworQUM5N19TSU5HTEUoIkRDIE9mZnNldCByZW1vdmFsIiwgMHg1YSwgMTAsIDEsIDApLAorfTsKKworc3RhdGljIGludCBwYXRjaF92dDE2MTNfc3BlY2lmaWMoc3RydWN0IHNuZF9hYzk3ICphYzk3KQoreworCXJldHVybiBwYXRjaF9idWlsZF9jb250cm9scyhhYzk3LCAmc25kX2FjOTdfY29udHJvbHNfdnQxNjEzWzBdLAorCQkJCSAgICBBUlJBWV9TSVpFKHNuZF9hYzk3X2NvbnRyb2xzX3Z0MTYxMykpOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfYWM5N19idWlsZF9vcHMgcGF0Y2hfdnQxNjEzX29wcyA9IHsKKwkuYnVpbGRfc3BlY2lmaWMJPSBwYXRjaF92dDE2MTNfc3BlY2lmaWMKK307CisKK3N0YXRpYyBpbnQgcGF0Y2hfdnQxNjEzKHN0cnVjdCBzbmRfYWM5NyAqYWM5NykKK3sKKwlhYzk3LT5idWlsZF9vcHMgPSAmcGF0Y2hfdnQxNjEzX29wczsKKworCWFjOTctPmZsYWdzIHw9IEFDOTdfSEFTX05PX1ZJREVPOworCWFjOTctPmNhcHMgfD0gQUM5N19CQ19IRUFEUEhPTkU7CisKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIFZJQSBWVDE2MTYgY29kZWMKICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9hYzk3X2NvbnRyb2xzX3Z0MTYxNltdID0gewpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FkMTg4OS5jIGIvc291bmQvcGNpL2FkMTg4OS5jCmluZGV4IDg1MGE4YzkuLjY2ZGRkOTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hZDE4ODkuYworKysgYi9zb3VuZC9wY2kvYWQxODg5LmMKQEAgLTc0Nyw3ICs3NDcsNyBAQAogCQlzbmRfaW5mb19zZXRfdGV4dF9vcHMoZW50cnksIGNoaXAsIHNuZF9hZDE4ODlfcHJvY19yZWFkKTsKIH0KIAotc3RhdGljIHN0cnVjdCBhYzk3X3F1aXJrIGFjOTdfcXVpcmtzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFjOTdfcXVpcmsgYWM5N19xdWlya3NbXSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSAweDExZDQsCS8qIEFEICovCiAJCS5zdWJkZXZpY2UgPSAweDE4ODksCS8qIEFEMTg4OSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYyBiL3NvdW5kL3BjaS9hc2locGkvYXNpaHBpLmMKaW5kZXggZTVjZDdiZS4uMTAzOWVjYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2FzaWhwaS9hc2locGkuYworKysgYi9zb3VuZC9wY2kvYXNpaHBpL2FzaWhwaS5jCkBAIC0yMzc2LDcgKzIzNzYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIFNhbXBsZWNsb2NrIHNvdXJjZSAgY29udHJvbHMKICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIGNvbnN0IGNoYXIgY29uc3QgKnNhbXBsZWNsb2NrX3NvdXJjZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2FtcGxlY2xvY2tfc291cmNlc1tdID0gewogCSJOL0EiLCAiTG9jYWwgUExMIiwgIkRpZ2l0YWwgU3luYyIsICJXb3JkIEV4dGVybmFsIiwgIldvcmQgSGVhZGVyIiwKIAkiU01QVEUiLCAiRGlnaXRhbDEiLCAiQXV0byIsICJOZXR3b3JrIiwgIkludmFsaWQiLAogCSJQcmV2IE1vZHVsZSIsICJCTFUtTGluayIsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXRpaXhwLmMgYi9zb3VuZC9wY2kvYXRpaXhwLmMKaW5kZXggZDVmMTVjOS4uNDJhMjBjOCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F0aWl4cC5jCisrKyBiL3NvdW5kL3BjaS9hdGlpeHAuYwpAQCAtMTM5MCw3ICsxMzkwLDcgQEAKICAqIGFjOTcgbWl4ZXIgc2VjdGlvbgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgYWM5N19xdWlyayBhYzk3X3F1aXJrc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhYzk3X3F1aXJrIGFjOTdfcXVpcmtzW10gPSB7CiAJewogCQkuc3VidmVuZG9yID0gMHgxMDNjLAogCQkuc3ViZGV2aWNlID0gMHgwMDZiLApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2F6dDMzMjguYyBiL3NvdW5kL3BjaS9henQzMzI4LmMKaW5kZXggYTQwYTJiNC4uMzNiMmEwYSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2F6dDMzMjguYworKysgYi9zb3VuZC9wY2kvYXp0MzMyOC5jCkBAIC0xMzg1LDggKzEzODUsOCBAQAogCQkJCQkucnVubmluZykKIAkJCSAgICAgJiYgICghY2hpcC0+Y29kZWNzW3BlZXJfY29kZWNzW2NvZGVjX3R5cGVdLm90aGVyMl0KIAkJCQkJLnJ1bm5pbmcpKTsKLQkJIH0KLQkJIGlmIChjYWxsX2Z1bmN0aW9uKQorCQl9CisJCWlmIChjYWxsX2Z1bmN0aW9uKQogCQkJc25kX2F6ZjMzMjhfY3RybF9lbmFibGVfY29kZWNzKGNoaXAsIGVuYWJsZSk7CiAKIAkJLyogLi4uYW5kIGFkanVzdCBjbG9jaywgdG9vCkBAIC0yMTI2LDcgKzIxMjYsOCBAQAogc3RhdGljIGludAogc25kX2F6ZjMzMjhfcGNtKHN0cnVjdCBzbmRfYXpmMzMyOCAqY2hpcCkKIHsKLWVudW0geyBBWkZfUENNREVWX1NURCwgQVpGX1BDTURFVl9JMlNfT1VULCBOVU1fQVpGX1BDTURFVlMgfTsgLyogcGNtIGRldmljZXMgKi8KKwkvKiBwY20gZGV2aWNlcyAqLworCWVudW0geyBBWkZfUENNREVWX1NURCwgQVpGX1BDTURFVl9JMlNfT1VULCBOVU1fQVpGX1BDTURFVlMgfTsKIAogCXN0cnVjdCBzbmRfcGNtICpwY207CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jbWlwY2kuYyBiL3NvdW5kL3BjaS9jbWlwY2kuYwppbmRleCAxZDBmMmNhLi42Y2Y0NjRkIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvY21pcGNpLmMKKysrIGIvc291bmQvcGNpL2NtaXBjaS5jCkBAIC0yMDYyLDcgKzIwNjIsNyBAQAogCQl2YWwgPSAoc25kX2NtaXBjaV9taXhlcl9yZWFkKGNtLCByZWcucmlnaHRfcmVnKSA+PiByZWcucmlnaHRfc2hpZnQpICYgcmVnLm1hc2s7CiAJCWlmIChyZWcuaW52ZXJ0KQogCQkJdmFsID0gcmVnLm1hc2sgLSB2YWw7Ci0JCSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IHZhbDsKKwkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSB2YWw7CiAJfQogCXNwaW5fdW5sb2NrX2lycSgmY20tPnJlZ19sb2NrKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9jczU1MzVhdWRpby9jczU1MzVhdWRpby5jIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMKaW5kZXggODAyYzMzZi4uOTYzYjkxMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMKKysrIGIvc291bmQvcGNpL2NzNTUzNWF1ZGlvL2NzNTUzNWF1ZGlvLmMKQEAgLTQzLDcgKzQzLDcgQEAKIG1vZHVsZV9wYXJhbShhYzk3X3F1aXJrLCBjaGFycCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGFjOTdfcXVpcmssICJBQyc5NyBib2FyZCBzcGVjaWZpYyB3b3JrYXJvdW5kcy4iKTsKIAotc3RhdGljIHN0cnVjdCBhYzk3X3F1aXJrIGFjOTdfcXVpcmtzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFjOTdfcXVpcmsgYWM5N19xdWlya3NbXSA9IHsKICNpZiAwIC8qIE5vdCB5ZXQgY29uZmlybWVkIGlmIGFsbCA1NTM2IGJvYXJkcyBhcmUgSFAgb25seSAqLwogCXsKIAkJLnN1YnZlbmRvciA9IFBDSV9WRU5ET1JfSURfQU1ELCAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMgYi9zb3VuZC9wY2kvZWNob2F1ZGlvL2VjaG9hdWRpby5jCmluZGV4IGE5NjJkZTAuLjg2MmRiOWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9lY2hvYXVkaW8vZWNob2F1ZGlvLmMKKysrIGIvc291bmQvcGNpL2VjaG9hdWRpby9lY2hvYXVkaW8uYwpAQCAtMTI4MywxMiArMTI4MywxNCBAQAogc3RhdGljIGludCBzbmRfZWNob19taXhlcl9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKIHsKLQlzdHJ1Y3QgZWNob2F1ZGlvICpjaGlwOworCXN0cnVjdCBlY2hvYXVkaW8gKmNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdW5zaWduZWQgaW50IG91dCA9IHVjb250cm9sLT5pZC5pbmRleCAvIG51bV9idXNzZXNfaW4oY2hpcCk7CisJdW5zaWduZWQgaW50IGluID0gdWNvbnRyb2wtPmlkLmluZGV4ICUgbnVtX2J1c3Nlc19pbihjaGlwKTsKIAotCWNoaXAgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQljaGlwLT5tb25pdG9yX2dhaW5bdWNvbnRyb2wtPmlkLmluZGV4IC8gbnVtX2J1c3Nlc19pbihjaGlwKV0KLQkJCVt1Y29udHJvbC0+aWQuaW5kZXggJSBudW1fYnVzc2VzX2luKGNoaXApXTsKKwlpZiAob3V0ID49IEVDSE9fTUFYQVVESU9PVVRQVVRTIHx8IGluID49IEVDSE9fTUFYQVVESU9JTlBVVFMpCisJCXJldHVybiAtRUlOVkFMOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBjaGlwLT5tb25pdG9yX2dhaW5bb3V0XVtpbl07CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyOTcsMTIgKzEyOTksMTQgQEAKIHsKIAlzdHJ1Y3QgZWNob2F1ZGlvICpjaGlwOwogCWludCBjaGFuZ2VkLCAgZ2FpbjsKLQlzaG9ydCBvdXQsIGluOworCXVuc2lnbmVkIGludCBvdXQsIGluOwogCiAJY2hhbmdlZCA9IDA7CiAJY2hpcCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKIAlvdXQgPSB1Y29udHJvbC0+aWQuaW5kZXggLyBudW1fYnVzc2VzX2luKGNoaXApOwogCWluID0gdWNvbnRyb2wtPmlkLmluZGV4ICUgbnVtX2J1c3Nlc19pbihjaGlwKTsKKwlpZiAob3V0ID49IEVDSE9fTUFYQVVESU9PVVRQVVRTIHx8IGluID49IEVDSE9fTUFYQVVESU9JTlBVVFMpCisJCXJldHVybiAtRUlOVkFMOwogCWdhaW4gPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAlpZiAoZ2FpbiA8IEVDSE9HQUlOX01JTk9VVCB8fCBnYWluID4gRUNIT0dBSU5fTUFYT1VUKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfbWFpbi5jIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKaW5kZXggYjQ0NThhNi4uNTQwNzlmNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKKysrIGIvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9tYWluLmMKQEAgLTcwNyw2ICs3MDcsNyBAQAogewogCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gZGF0YTsKIAl1MzIgdG1wLCB0bXAyLCByZWc7CisJdTMyIGxhc3RfcmVnID0gMDsKIAlpbnQgZXJyOwogCiAJZm9yICg7OykgewpAQCAtNzgyLDcgKzc4MywxNSBAQAogCQkJbXNsZWVwKDEwKTsKIAkJCS8qIFVubXV0ZSBhbGwuIERlZmF1bHQgaXMgbXV0ZWQgYWZ0ZXIgYSBmaXJtd2FyZSBsb2FkICovCiAJCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfVU5NVVRFLCBFTVVfVU5NVVRFKTsKKwkJfSBlbHNlIGlmICghcmVnICYmIGxhc3RfcmVnKSB7CisJCQkvKiBBdWRpbyBEb2NrIHJlbW92ZWQgKi8KKwkJCWRldl9pbmZvKGVtdS0+Y2FyZC0+ZGV2LAorCQkJCSAiZW11MTAxMDogQXVkaW8gRG9jayBkZXRhY2hlZFxuIik7CisJCQkvKiBVbm11dGUgYWxsICovCisJCQlzbmRfZW11MTAxMF9mcGdhX3dyaXRlKGVtdSwgRU1VX0hBTkFfVU5NVVRFLCBFTVVfVU5NVVRFKTsKIAkJfQorCisJCWxhc3RfcmVnID0gcmVnOwogCX0KIAlkZXZfaW5mbyhlbXUtPmNhcmQtPmRldiwgImVtdTEwMTA6IGZpcm13YXJlIHRocmVhZCBzdG9wcGluZ1xuIik7CiAJcmV0dXJuIDA7CkBAIC0xMzI1LDYgKzEzMzQsMjIgQEAKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfZW11X2NoaXBfZGV0YWlscyBlbXVfY2hpcF9kZXRhaWxzW10gPSB7CisJLyogQXVkaWd5IDUvUnggU0IxNTUwICovCisJLyogVGVzdGVkIGJ5IG1pY2hhZWxAZ2Vybm90aC5uZXQgMjggTWFyIDIwMTUgKi8KKwkvKiBEU1A6IENBMTAzMDAtSUFUIExGCisJICogREFDOiBDaXJydXMgTG9naWMgQ1M0MzgyLUtRWgorCSAqIEFEQzogUGhpbGlwcyAxMzYxVAorCSAqIEFDOTc6IFNpZ21hdGVsIFNUQUM5NzUwCisJICogQ0EwMTUxOiBOb25lCisJICovCisJey52ZW5kb3IgPSAweDExMDIsIC5kZXZpY2UgPSAweDAwMDgsIC5zdWJzeXN0ZW0gPSAweDEwMjQxMTAyLAorCSAuZHJpdmVyID0gIkF1ZGlneTIiLCAubmFtZSA9ICJTQiBBdWRpZ3kgNS9SeCBbU0IxNTUwXSIsCisJIC5pZCA9ICJBdWRpZ3kyIiwKKwkgLmVtdTEwazJfY2hpcCA9IDEsCisJIC5jYTAxMDhfY2hpcCA9IDEsCisJIC5zcGs3MSA9IDEsCisJIC5hZGNfMTM2MXQgPSAxLCAgLyogMjQgYml0IGNhcHR1cmUgaW5zdGVhZCBvZiAxNmJpdCAqLworCSAuYWM5N19jaGlwID0gMX0sCiAJLyogQXVkaWd5NCAoTm90IFBSTykgU0IwNjEwICovCiAJLyogVGVzdGVkIGJ5IEphbWVzQHN1cGVyYnVnLmNvLnVrIDR0aCBBcHJpbCAyMDA2ICovCiAJLyogQV9JT0NGRyBiaXRzCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3N5bnRoLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXUxMGsxX3N5bnRoLmMKaW5kZXggNGM0MWM5MC4uNTQ1N2Q1NiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11MTBrMV9zeW50aC5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdTEwazFfc3ludGguYwpAQCAtMjksOCArMjksOSBAQAogLyoKICAqIGNyZWF0ZSBhIG5ldyBoYXJkd2FyZSBkZXBlbmRlbnQgZGV2aWNlIGZvciBFbXUxMGsxCiAgKi8KLXN0YXRpYyBpbnQgc25kX2VtdTEwazFfc3ludGhfbmV3X2RldmljZShzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc25kX2VtdTEwazFfc3ludGhfcHJvYmUoc3RydWN0IGRldmljZSAqX2RldikKIHsKKwlzdHJ1Y3Qgc25kX3NlcV9kZXZpY2UgKmRldiA9IHRvX3NlcV9kZXYoX2Rldik7CiAJc3RydWN0IHNuZF9lbXV4ICplbXV4OwogCXN0cnVjdCBzbmRfZW11MTBrMSAqaHc7CiAJc3RydWN0IHNuZF9lbXUxMGsxX3N5bnRoX2FyZyAqYXJnOwpAQCAtNzksOCArODAsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNuZF9lbXUxMGsxX3N5bnRoX2RlbGV0ZV9kZXZpY2Uoc3RydWN0IHNuZF9zZXFfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNuZF9lbXUxMGsxX3N5bnRoX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpfZGV2KQogeworCXN0cnVjdCBzbmRfc2VxX2RldmljZSAqZGV2ID0gdG9fc2VxX2RldihfZGV2KTsKIAlzdHJ1Y3Qgc25kX2VtdXggKmVtdXg7CiAJc3RydWN0IHNuZF9lbXUxMGsxICpodzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTA0LDIxICsxMDYsMTQgQEAKICAqICBJTklUIHBhcnQKICAqLwogCi1zdGF0aWMgaW50IF9faW5pdCBhbHNhX2VtdTEwazFfc3ludGhfaW5pdCh2b2lkKQotewotCQotCXN0YXRpYyBzdHJ1Y3Qgc25kX3NlcV9kZXZfb3BzIG9wcyA9IHsKLQkJc25kX2VtdTEwazFfc3ludGhfbmV3X2RldmljZSwKLQkJc25kX2VtdTEwazFfc3ludGhfZGVsZXRlX2RldmljZSwKLQl9OwotCXJldHVybiBzbmRfc2VxX2RldmljZV9yZWdpc3Rlcl9kcml2ZXIoU05EUlZfU0VRX0RFVl9JRF9FTVUxMEsxX1NZTlRILCAmb3BzLAotCQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNuZF9lbXUxMGsxX3N5bnRoX2FyZykpOwotfQorc3RhdGljIHN0cnVjdCBzbmRfc2VxX2RyaXZlciBlbXUxMGsxX3N5bnRoX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCQkucHJvYmUgPSBzbmRfZW11MTBrMV9zeW50aF9wcm9iZSwKKwkJLnJlbW92ZSA9IHNuZF9lbXUxMGsxX3N5bnRoX3JlbW92ZSwKKwl9LAorCS5pZCA9IFNORFJWX1NFUV9ERVZfSURfRU1VMTBLMV9TWU5USCwKKwkuYXJnc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc25kX2VtdTEwazFfc3ludGhfYXJnKSwKK307CiAKLXN0YXRpYyB2b2lkIF9fZXhpdCBhbHNhX2VtdTEwazFfc3ludGhfZXhpdCh2b2lkKQotewotCXNuZF9zZXFfZGV2aWNlX3VucmVnaXN0ZXJfZHJpdmVyKFNORFJWX1NFUV9ERVZfSURfRU1VMTBLMV9TWU5USCk7Ci19Ci0KLW1vZHVsZV9pbml0KGFsc2FfZW11MTBrMV9zeW50aF9pbml0KQotbW9kdWxlX2V4aXQoYWxzYV9lbXUxMGsxX3N5bnRoX2V4aXQpCittb2R1bGVfc25kX3NlcV9kcml2ZXIoZW11MTBrMV9zeW50aF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdW1peGVyLmMKaW5kZXggMWRlMzMwMi4uNTVlNTcxNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11bWl4ZXIuYworKysgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVtaXhlci5jCkBAIC04MDYsNiArODA2LDEwOCBAQAogCS5wdXQgPSAgICAgICAgICBzbmRfZW11MTAxMF9pbnRlcm5hbF9jbG9ja19wdXQKIH07CiAKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfb3B0aWNhbF9vdXRfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHNbMl0gPSB7CisJCSJTUERJRiIsICJBREFUIgorCX07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8odWluZm8sIDEsIDIsIHRleHRzKTsKK30KKworc3RhdGljIGludCBzbmRfZW11MTAxMF9vcHRpY2FsX291dF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGVtdS0+ZW11MTAxMC5vcHRpY2FsX291dDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmRfZW11MTAxMF9vcHRpY2FsX291dF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB2YWw7CisJdTMyIHRtcDsKKwlpbnQgY2hhbmdlID0gMDsKKworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJLyogTGltaXQ6IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsgKi8KKwlpZiAodmFsID49IDIpCisJCXJldHVybiAtRUlOVkFMOworCWNoYW5nZSA9IChlbXUtPmVtdTEwMTAub3B0aWNhbF9vdXQgIT0gdmFsKTsKKwlpZiAoY2hhbmdlKSB7CisJCWVtdS0+ZW11MTAxMC5vcHRpY2FsX291dCA9IHZhbDsKKwkJdG1wID0gKGVtdS0+ZW11MTAxMC5vcHRpY2FsX2luID8gRU1VX0hBTkFfT1BUSUNBTF9JTl9BREFUIDogMCkgfAorCQkJKGVtdS0+ZW11MTAxMC5vcHRpY2FsX291dCA/IEVNVV9IQU5BX09QVElDQUxfT1VUX0FEQVQgOiAwKTsKKwkJc25kX2VtdTEwMTBfZnBnYV93cml0ZShlbXUsIEVNVV9IQU5BX09QVElDQUxfVFlQRSwgdG1wKTsKKwl9CisJcmV0dXJuIGNoYW5nZTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9lbXUxMDEwX29wdGljYWxfb3V0ID0geworCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCS5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgIk9wdGljYWwgT3V0cHV0IE1vZGUiLAorCS5jb3VudCA9CTEsCisJLmluZm8gPSAgICAgICAgIHNuZF9lbXUxMDEwX29wdGljYWxfb3V0X2luZm8sCisJLmdldCA9ICAgICAgICAgIHNuZF9lbXUxMDEwX29wdGljYWxfb3V0X2dldCwKKwkucHV0ID0gICAgICAgICAgc25kX2VtdTEwMTBfb3B0aWNhbF9vdXRfcHV0Cit9OworCitzdGF0aWMgaW50IHNuZF9lbXUxMDEwX29wdGljYWxfaW5faW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHNbMl0gPSB7CisJCSJTUERJRiIsICJBREFUIgorCX07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8odWluZm8sIDEsIDIsIHRleHRzKTsKK30KKworc3RhdGljIGludCBzbmRfZW11MTAxMF9vcHRpY2FsX2luX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9lbXUxMGsxICplbXUgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gZW11LT5lbXUxMDEwLm9wdGljYWxfaW47CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2VtdTEwMTBfb3B0aWNhbF9pbl9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfZW11MTBrMSAqZW11ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXVuc2lnbmVkIGludCB2YWw7CisJdTMyIHRtcDsKKwlpbnQgY2hhbmdlID0gMDsKKworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJLyogTGltaXQ6IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMjsgKi8KKwlpZiAodmFsID49IDIpCisJCXJldHVybiAtRUlOVkFMOworCWNoYW5nZSA9IChlbXUtPmVtdTEwMTAub3B0aWNhbF9pbiAhPSB2YWwpOworCWlmIChjaGFuZ2UpIHsKKwkJZW11LT5lbXUxMDEwLm9wdGljYWxfaW4gPSB2YWw7CisJCXRtcCA9IChlbXUtPmVtdTEwMTAub3B0aWNhbF9pbiA/IEVNVV9IQU5BX09QVElDQUxfSU5fQURBVCA6IDApIHwKKwkJCShlbXUtPmVtdTEwMTAub3B0aWNhbF9vdXQgPyBFTVVfSEFOQV9PUFRJQ0FMX09VVF9BREFUIDogMCk7CisJCXNuZF9lbXUxMDEwX2ZwZ2Ffd3JpdGUoZW11LCBFTVVfSEFOQV9PUFRJQ0FMX1RZUEUsIHRtcCk7CisJfQorCXJldHVybiBjaGFuZ2U7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzbmRfZW11MTAxMF9vcHRpY2FsX2luID0geworCS5hY2Nlc3MgPQlTTkRSVl9DVExfRUxFTV9BQ0NFU1NfUkVBRFdSSVRFLAorCS5pZmFjZSA9ICAgICAgICBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwkubmFtZSA9ICAgICAgICAgIk9wdGljYWwgSW5wdXQgTW9kZSIsCisJLmNvdW50ID0JMSwKKwkuaW5mbyA9ICAgICAgICAgc25kX2VtdTEwMTBfb3B0aWNhbF9pbl9pbmZvLAorCS5nZXQgPSAgICAgICAgICBzbmRfZW11MTAxMF9vcHRpY2FsX2luX2dldCwKKwkucHV0ID0gICAgICAgICAgc25kX2VtdTEwMTBfb3B0aWNhbF9pbl9wdXQKK307CisKIHN0YXRpYyBpbnQgc25kX2F1ZGlneV9pMmNfY2FwdHVyZV9zb3VyY2VfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQogewpAQCAtMjA1MSw2ICsyMTUzLDE0IEBACiAJCQlzbmRfY3RsX25ldzEoJnNuZF9lbXUxMDEwX2ludGVybmFsX2Nsb2NrLCBlbXUpKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOworCQllcnIgPSBzbmRfY3RsX2FkZChjYXJkLAorCQkJc25kX2N0bF9uZXcxKCZzbmRfZW11MTAxMF9vcHRpY2FsX291dCwgZW11KSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwKKwkJCXNuZF9jdGxfbmV3MSgmc25kX2VtdTEwMTBfb3B0aWNhbF9pbiwgZW11KSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKIAogCX0gZWxzZSBpZiAoZW11LT5jYXJkX2NhcGFiaWxpdGllcy0+ZW11X21vZGVsKSB7CiAJCS8qIGFsbCBvdGhlciBlLW11IGNhcmRzIGZvciBub3cgKi8KQEAgLTIwODYsNiArMjE5NiwxNCBAQAogCQkJc25kX2N0bF9uZXcxKCZzbmRfZW11MTAxMF9pbnRlcm5hbF9jbG9jaywgZW11KSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKKwkJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwKKwkJCXNuZF9jdGxfbmV3MSgmc25kX2VtdTEwMTBfb3B0aWNhbF9vdXQsIGVtdSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsCisJCQlzbmRfY3RsX25ldzEoJnNuZF9lbXUxMDEwX29wdGljYWxfaW4sIGVtdSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CiAJfQogCiAJaWYgKCBlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5pMmNfYWRjKSB7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvZW11MTBrMS9lbXVwcm9jLmMgYi9zb3VuZC9wY2kvZW11MTBrMS9lbXVwcm9jLmMKaW5kZXggMmNhOWYyZS4uNTM3NDVmNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2VtdTEwazEvZW11cHJvYy5jCisrKyBiL3NvdW5kL3BjaS9lbXUxMGsxL2VtdXByb2MuYwpAQCAtMjQxLDMxICsyNDEsMjIgQEAKIAlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CiAJdTMyIHZhbHVlOwogCXUzMiB2YWx1ZTI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgcmF0ZTsKIAogCWlmIChlbXUtPmNhcmRfY2FwYWJpbGl0aWVzLT5lbXVfbW9kZWwpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKIAkJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgMHgzOCwgJnZhbHVlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOwogCQlpZiAoKHZhbHVlICYgMHgxKSA9PSAwKSB7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOwogCQkJc25kX2VtdTEwMTBfZnBnYV9yZWFkKGVtdSwgMHgyYSwgJnZhbHVlKTsKIAkJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIDB4MmIsICZ2YWx1ZTIpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOwogCQkJcmF0ZSA9IDB4MTc3MDAwMCAvICgoKHZhbHVlIDw8IDUpIHwgdmFsdWUyKSsxKTsJCiAJCQlzbmRfaXByaW50ZihidWZmZXIsICJBREFUIExvY2tlZCA6ICV1XG4iLCByYXRlKTsKIAkJfSBlbHNlIHsKIAkJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkFEQVQgVW5sb2NrZWRcbiIpOwogCQl9Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CiAJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIDB4MjAsICZ2YWx1ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKIAkJaWYgKCh2YWx1ZSAmIDB4NCkgPT0gMCkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKIAkJCXNuZF9lbXUxMDEwX2ZwZ2FfcmVhZChlbXUsIDB4MjgsICZ2YWx1ZSk7CiAJCQlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCAweDI5LCAmdmFsdWUyKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVtdS0+ZW11X2xvY2ssIGZsYWdzKTsKIAkJCXJhdGUgPSAweDE3NzAwMDAgLyAoKCh2YWx1ZSA8PCA1KSB8IHZhbHVlMikrMSk7CQogCQkJc25kX2lwcmludGYoYnVmZmVyLCAiU1BESUYgTG9ja2VkIDogJWRcbiIsIHJhdGUpOwogCQl9IGVsc2UgewpAQCAtNDEwLDE0ICs0MDEsMTEgQEAKIHsKIAlzdHJ1Y3Qgc25kX2VtdTEwazEgKmVtdSA9IGVudHJ5LT5wcml2YXRlX2RhdGE7CiAJdTMyIHZhbHVlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGk7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiRU1VMTAxMCBSZWdpc3RlcnM6XG5cbiIpOwogCiAJZm9yKGkgPSAwOyBpIDwgMHg0MDsgaSs9MSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmZW11LT5lbXVfbG9jaywgZmxhZ3MpOwogCQlzbmRfZW11MTAxMF9mcGdhX3JlYWQoZW11LCBpLCAmdmFsdWUpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbXUtPmVtdV9sb2NrLCBmbGFncyk7CiAJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIiUwMlg6ICUwOFgsICUwMlhcbiIsIGksIHZhbHVlLCAodmFsdWUgPj4gOCkgJiAweDdmKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL0tjb25maWcgYi9zb3VuZC9wY2kvaGRhL0tjb25maWcKaW5kZXggN2YwZjJjNS4uYTVlZDFjMSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9LY29uZmlnCisrKyBiL3NvdW5kL3BjaS9oZGEvS2NvbmZpZwpAQCAtNSw2ICs1LDcgQEAKIAlzZWxlY3QgU05EX1BDTQogCXNlbGVjdCBTTkRfVk1BU1RFUgogCXNlbGVjdCBTTkRfS0NUTF9KQUNLCisJc2VsZWN0IFNORF9IREFfQ09SRQogCiBjb25maWcgU05EX0hEQV9JTlRFTAogCXRyaXN0YXRlICJIRCBBdWRpbyBQQ0kiCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL01ha2VmaWxlIGIvc291bmQvcGNpL2hkYS9NYWtlZmlsZQppbmRleCAxOTRmMzA5My4uYWY3OGZiMyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9NYWtlZmlsZQorKysgYi9zb3VuZC9wY2kvaGRhL01ha2VmaWxlCkBAIC00LDEzICs0LDEyIEBACiAjIGZvciBoYXN3ZWxsIHBvd2VyIHdlbGwKIHNuZC1oZGEtaW50ZWwtJChDT05GSUdfU05EX0hEQV9JOTE1KSArPQloZGFfaTkxNS5vCiAKLXNuZC1oZGEtY29kZWMteSA6PSBoZGFfY29kZWMubyBoZGFfamFjay5vIGhkYV9hdXRvX3BhcnNlci5vIGhkYV9zeXNmcy5vCitzbmQtaGRhLWNvZGVjLXkgOj0gaGRhX2JpbmQubyBoZGFfY29kZWMubyBoZGFfamFjay5vIGhkYV9hdXRvX3BhcnNlci5vIGhkYV9zeXNmcy5vCiBzbmQtaGRhLWNvZGVjLSQoQ09ORklHX1BST0NfRlMpICs9IGhkYV9wcm9jLm8KIHNuZC1oZGEtY29kZWMtJChDT05GSUdfU05EX0hEQV9IV0RFUCkgKz0gaGRhX2h3ZGVwLm8KIHNuZC1oZGEtY29kZWMtJChDT05GSUdfU05EX0hEQV9JTlBVVF9CRUVQKSArPSBoZGFfYmVlcC5vCiAKICMgZm9yIHRyYWNlLXBvaW50cwotQ0ZMQUdTX2hkYV9jb2RlYy5vIDo9IC1JJChzcmMpCiBDRkxBR1NfaGRhX2NvbnRyb2xsZXIubyA6PSAtSSQoc3JjKQogCiBzbmQtaGRhLWNvZGVjLWdlbmVyaWMtb2JqcyA6PQloZGFfZ2VuZXJpYy5vCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9hdXRvX3BhcnNlci5jIGIvc291bmQvcGNpL2hkYS9oZGFfYXV0b19wYXJzZXIuYwppbmRleCAzZjg3MDZiLi4wM2I3Mzk5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9hdXRvX3BhcnNlci5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2F1dG9fcGFyc2VyLmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCQkJICAgICBjb25zdCBoZGFfbmlkX3QgKmlnbm9yZV9uaWRzLAogCQkJICAgICB1bnNpZ25lZCBpbnQgY29uZF9mbGFncykKIHsKLQloZGFfbmlkX3QgbmlkLCBlbmRfbmlkOworCWhkYV9uaWRfdCBuaWQ7CiAJc2hvcnQgc2VxLCBhc3NvY19saW5lX291dDsKIAlzdHJ1Y3QgYXV0b19vdXRfcGluIGxpbmVfb3V0W0FSUkFZX1NJWkUoY2ZnLT5saW5lX291dF9waW5zKV07CiAJc3RydWN0IGF1dG9fb3V0X3BpbiBzcGVha2VyX291dFtBUlJBWV9TSVpFKGNmZy0+c3BlYWtlcl9waW5zKV07CkBAIC0xODksOCArMTg5LDcgQEAKIAltZW1zZXQoaHBfb3V0LCAwLCBzaXplb2YoaHBfb3V0KSk7CiAJYXNzb2NfbGluZV9vdXQgPSAwOwogCi0JZW5kX25pZCA9IGNvZGVjLT5zdGFydF9uaWQgKyBjb2RlYy0+bnVtX25vZGVzOwotCWZvciAobmlkID0gY29kZWMtPnN0YXJ0X25pZDsgbmlkIDwgZW5kX25pZDsgbmlkKyspIHsKKwlmb3JfZWFjaF9oZGFfY29kZWNfbm9kZShuaWQsIGNvZGVjKSB7CiAJCXVuc2lnbmVkIGludCB3aWRfY2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgbmlkKTsKIAkJdW5zaWduZWQgaW50IHdpZF90eXBlID0gZ2V0X3djYXBzX3R5cGUod2lkX2NhcHMpOwogCQl1bnNpZ25lZCBpbnQgZGVmX2NvbmY7CkBAIC00MTAsNyArNDA5LDcgQEAKIAkgKiBkZWJ1ZyBwcmludHMgb2YgdGhlIHBhcnNlZCByZXN1bHRzCiAJICovCiAJY29kZWNfaW5mbyhjb2RlYywgImF1dG9jb25maWcgZm9yICVzOiBsaW5lX291dHM9JWQgKDB4JXgvMHgleC8weCV4LzB4JXgvMHgleCkgdHlwZTolc1xuIiwKLQkJICAgY29kZWMtPmNoaXBfbmFtZSwgY2ZnLT5saW5lX291dHMsIGNmZy0+bGluZV9vdXRfcGluc1swXSwKKwkJICAgY29kZWMtPmNvcmUuY2hpcF9uYW1lLCBjZmctPmxpbmVfb3V0cywgY2ZnLT5saW5lX291dF9waW5zWzBdLAogCQkgICBjZmctPmxpbmVfb3V0X3BpbnNbMV0sIGNmZy0+bGluZV9vdXRfcGluc1syXSwKIAkJICAgY2ZnLT5saW5lX291dF9waW5zWzNdLCBjZmctPmxpbmVfb3V0X3BpbnNbNF0sCiAJCSAgIGNmZy0+bGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9IUF9PVVQgPyAiaHAiIDoKQEAgLTgzNiwzMyArODM1LDMzIEBACiAJCQlpZiAoYWN0aW9uICE9IEhEQV9GSVhVUF9BQ1RfUFJFX1BST0JFIHx8ICFmaXgtPnYucGlucykKIAkJCQlicmVhazsKIAkJCWNvZGVjX2RiZyhjb2RlYywgIiVzOiBBcHBseSBwaW5jZmcgZm9yICVzXG4iLAotCQkJCSAgICBjb2RlYy0+Y2hpcF9uYW1lLCBtb2RlbG5hbWUpOworCQkJCSAgICBjb2RlYy0+Y29yZS5jaGlwX25hbWUsIG1vZGVsbmFtZSk7CiAJCQlzbmRfaGRhX2FwcGx5X3BpbmNmZ3MoY29kZWMsIGZpeC0+di5waW5zKTsKIAkJCWJyZWFrOwogCQljYXNlIEhEQV9GSVhVUF9WRVJCUzoKIAkJCWlmIChhY3Rpb24gIT0gSERBX0ZJWFVQX0FDVF9QUk9CRSB8fCAhZml4LT52LnZlcmJzKQogCQkJCWJyZWFrOwogCQkJY29kZWNfZGJnKGNvZGVjLCAiJXM6IEFwcGx5IGZpeC12ZXJicyBmb3IgJXNcbiIsCi0JCQkJICAgIGNvZGVjLT5jaGlwX25hbWUsIG1vZGVsbmFtZSk7CisJCQkJICAgIGNvZGVjLT5jb3JlLmNoaXBfbmFtZSwgbW9kZWxuYW1lKTsKIAkJCXNuZF9oZGFfYWRkX3ZlcmJzKGNvZGVjLCBmaXgtPnYudmVyYnMpOwogCQkJYnJlYWs7CiAJCWNhc2UgSERBX0ZJWFVQX0ZVTkM6CiAJCQlpZiAoIWZpeC0+di5mdW5jKQogCQkJCWJyZWFrOwogCQkJY29kZWNfZGJnKGNvZGVjLCAiJXM6IEFwcGx5IGZpeC1mdW5jIGZvciAlc1xuIiwKLQkJCQkgICAgY29kZWMtPmNoaXBfbmFtZSwgbW9kZWxuYW1lKTsKKwkJCQkgICAgY29kZWMtPmNvcmUuY2hpcF9uYW1lLCBtb2RlbG5hbWUpOwogCQkJZml4LT52LmZ1bmMoY29kZWMsIGZpeCwgYWN0aW9uKTsKIAkJCWJyZWFrOwogCQljYXNlIEhEQV9GSVhVUF9QSU5DVExTOgogCQkJaWYgKGFjdGlvbiAhPSBIREFfRklYVVBfQUNUX1BST0JFIHx8ICFmaXgtPnYucGlucykKIAkJCQlicmVhazsKIAkJCWNvZGVjX2RiZyhjb2RlYywgIiVzOiBBcHBseSBwaW5jdGwgZm9yICVzXG4iLAotCQkJCSAgICBjb2RlYy0+Y2hpcF9uYW1lLCBtb2RlbG5hbWUpOworCQkJCSAgICBjb2RlYy0+Y29yZS5jaGlwX25hbWUsIG1vZGVsbmFtZSk7CiAJCQlzZXRfcGluX3RhcmdldHMoY29kZWMsIGZpeC0+di5waW5zKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJY29kZWNfZXJyKGNvZGVjLCAiJXM6IEludmFsaWQgZml4dXAgdHlwZSAlZFxuIiwKLQkJCQkgICBjb2RlYy0+Y2hpcF9uYW1lLCBmaXgtPnR5cGUpOworCQkJCSAgIGNvZGVjLT5jb3JlLmNoaXBfbmFtZSwgZml4LT50eXBlKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmICghZml4LT5jaGFpbmVkIHx8IGZpeC0+Y2hhaW5lZF9iZWZvcmUpCkBAIC05MTIsMTYgKzkxMSwxNiBAQAogCQlyZXR1cm47CiAKIAlmb3IgKHBxID0gcGluX3F1aXJrOyBwcS0+c3VidmVuZG9yOyBwcSsrKSB7Ci0JCWlmICgoY29kZWMtPnN1YnN5c3RlbV9pZCAmIDB4ZmZmZjAwMDApICE9IChwcS0+c3VidmVuZG9yIDw8IDE2KSkKKwkJaWYgKChjb2RlYy0+Y29yZS5zdWJzeXN0ZW1faWQgJiAweGZmZmYwMDAwKSAhPSAocHEtPnN1YnZlbmRvciA8PCAxNikpCiAJCQljb250aW51ZTsKLQkJaWYgKGNvZGVjLT52ZW5kb3JfaWQgIT0gcHEtPmNvZGVjKQorCQlpZiAoY29kZWMtPmNvcmUudmVuZG9yX2lkICE9IHBxLT5jb2RlYykKIAkJCWNvbnRpbnVlOwogCQlpZiAocGluX2NvbmZpZ19tYXRjaChjb2RlYywgcHEtPnBpbnMpKSB7CiAJCQljb2RlYy0+Zml4dXBfaWQgPSBwcS0+dmFsdWU7CiAjaWZkZWYgQ09ORklHX1NORF9ERUJVR19WRVJCT1NFCiAJCQljb2RlYy0+Zml4dXBfbmFtZSA9IHBxLT5uYW1lOwogCQkJY29kZWNfZGJnKGNvZGVjLCAiJXM6IHBpY2tlZCBmaXh1cCAlcyAocGluIG1hdGNoKVxuIiwKLQkJCQkgIGNvZGVjLT5jaGlwX25hbWUsIGNvZGVjLT5maXh1cF9uYW1lKTsKKwkJCQkgIGNvZGVjLT5jb3JlLmNoaXBfbmFtZSwgY29kZWMtPmZpeHVwX25hbWUpOwogI2VuZGlmCiAJCQljb2RlYy0+Zml4dXBfbGlzdCA9IGZpeGxpc3Q7CiAJCQlyZXR1cm47CkBAIC05NjMsNyArOTYyLDcgQEAKIAkJY29kZWMtPmZpeHVwX25hbWUgPSBOVUxMOwogCQljb2RlYy0+Zml4dXBfaWQgPSBIREFfRklYVVBfSURfTk9fRklYVVA7CiAJCWNvZGVjX2RiZyhjb2RlYywgIiVzOiBwaWNrZWQgbm8gZml4dXAgKG5vZml4dXAgc3BlY2lmaWVkKVxuIiwKLQkJCSAgY29kZWMtPmNoaXBfbmFtZSk7CisJCQkgIGNvZGVjLT5jb3JlLmNoaXBfbmFtZSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTk3NCw3ICs5NzMsNyBAQAogCQkJCWNvZGVjLT5maXh1cF9uYW1lID0gbW9kZWxzLT5uYW1lOwogCQkJCWNvZGVjLT5maXh1cF9saXN0ID0gZml4bGlzdDsKIAkJCQljb2RlY19kYmcoY29kZWMsICIlczogcGlja2VkIGZpeHVwICVzIChtb2RlbCBzcGVjaWZpZWQpXG4iLAotCQkJCQkgIGNvZGVjLT5jaGlwX25hbWUsIGNvZGVjLT5maXh1cF9uYW1lKTsKKwkJCQkJICBjb2RlYy0+Y29yZS5jaGlwX25hbWUsIGNvZGVjLT5maXh1cF9uYW1lKTsKIAkJCQlyZXR1cm47CiAJCQl9CiAJCQltb2RlbHMrKzsKQEAgLTk4Nyw3ICs5ODYsNyBAQAogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCQkJbmFtZSA9IHEtPm5hbWU7CiAJCQljb2RlY19kYmcoY29kZWMsICIlczogcGlja2VkIGZpeHVwICVzIChQQ0kgU1NJRCVzKVxuIiwKLQkJCQkgIGNvZGVjLT5jaGlwX25hbWUsIG5hbWUsIHEtPnN1YmRldmljZV9tYXNrID8gIiIgOiAiIC0gdmVuZG9yIGdlbmVyaWMiKTsKKwkJCQkgIGNvZGVjLT5jb3JlLmNoaXBfbmFtZSwgbmFtZSwgcS0+c3ViZGV2aWNlX21hc2sgPyAiIiA6ICIgLSB2ZW5kb3IgZ2VuZXJpYyIpOwogI2VuZGlmCiAJCX0KIAl9CkBAIC05OTYsMTIgKzk5NSwxMiBAQAogCQkJdW5zaWduZWQgaW50IHZlbmRvcmlkID0KIAkJCQlxLT5zdWJkZXZpY2UgfCAocS0+c3VidmVuZG9yIDw8IDE2KTsKIAkJCXVuc2lnbmVkIGludCBtYXNrID0gMHhmZmZmMDAwMCB8IHEtPnN1YmRldmljZV9tYXNrOwotCQkJaWYgKChjb2RlYy0+c3Vic3lzdGVtX2lkICYgbWFzaykgPT0gKHZlbmRvcmlkICYgbWFzaykpIHsKKwkJCWlmICgoY29kZWMtPmNvcmUuc3Vic3lzdGVtX2lkICYgbWFzaykgPT0gKHZlbmRvcmlkICYgbWFzaykpIHsKIAkJCQlpZCA9IHEtPnZhbHVlOwogI2lmZGVmIENPTkZJR19TTkRfREVCVUdfVkVSQk9TRQogCQkJCW5hbWUgPSBxLT5uYW1lOwogCQkJCWNvZGVjX2RiZyhjb2RlYywgIiVzOiBwaWNrZWQgZml4dXAgJXMgKGNvZGVjIFNTSUQpXG4iLAotCQkJCQkgIGNvZGVjLT5jaGlwX25hbWUsIG5hbWUpOworCQkJCQkgIGNvZGVjLT5jb3JlLmNoaXBfbmFtZSwgbmFtZSk7CiAjZW5kaWYKIAkJCQlicmVhazsKIAkJCX0KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuYwppbmRleCAxZTdkZTA4Li4zMzY0ZGMwIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5jCkBAIC0zMywzMCArMzMsMzYgQEAKIAlESUdCRUVQX0haX01BWCA9IDEyMDAwMDAwLAkvKiAxMiBLSHogKi8KIH07CiAKLXN0YXRpYyB2b2lkIHNuZF9oZGFfZ2VuZXJhdGVfYmVlcChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCisvKiBnZW5lcmF0ZSBvciBzdG9wIHRvbmUgKi8KK3N0YXRpYyB2b2lkIGdlbmVyYXRlX3RvbmUoc3RydWN0IGhkYV9iZWVwICpiZWVwLCBpbnQgdG9uZSkKIHsKLQlzdHJ1Y3QgaGRhX2JlZXAgKmJlZXAgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGhkYV9iZWVwLCBiZWVwX3dvcmspOwogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gYmVlcC0+Y29kZWM7Ci0JaW50IHRvbmU7CiAKLQlpZiAoIWJlZXAtPmVuYWJsZWQpCi0JCXJldHVybjsKLQotCXRvbmUgPSBiZWVwLT50b25lOwogCWlmICh0b25lICYmICFiZWVwLT5wbGF5aW5nKSB7CiAJCXNuZF9oZGFfcG93ZXJfdXAoY29kZWMpOworCQlpZiAoYmVlcC0+cG93ZXJfaG9vaykKKwkJCWJlZXAtPnBvd2VyX2hvb2soYmVlcCwgdHJ1ZSk7CiAJCWJlZXAtPnBsYXlpbmcgPSAxOwogCX0KLQkvKiBnZW5lcmF0ZSB0b25lICovCiAJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgYmVlcC0+bmlkLCAwLAogCQkJICAgIEFDX1ZFUkJfU0VUX0JFRVBfQ09OVFJPTCwgdG9uZSk7CiAJaWYgKCF0b25lICYmIGJlZXAtPnBsYXlpbmcpIHsKIAkJYmVlcC0+cGxheWluZyA9IDA7CisJCWlmIChiZWVwLT5wb3dlcl9ob29rKQorCQkJYmVlcC0+cG93ZXJfaG9vayhiZWVwLCBmYWxzZSk7CiAJCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7CiAJfQogfQogCitzdGF0aWMgdm9pZCBzbmRfaGRhX2dlbmVyYXRlX2JlZXAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBoZGFfYmVlcCAqYmVlcCA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaGRhX2JlZXAsIGJlZXBfd29yayk7CisKKwlpZiAoYmVlcC0+ZW5hYmxlZCkKKwkJZ2VuZXJhdGVfdG9uZShiZWVwLCBiZWVwLT50b25lKTsKK30KKwogLyogKG5vbi1zdGFuZGFyZCkgTGluZWFyIGJlZXAgdG9uZSBjYWxjdWxhdGlvbiBmb3IgSURUL1NUQUMgY29kZWNzIAogICoKICAqIFRoZSB0b25lIGZyZXF1ZW5jeSBvZiBiZWVwIGdlbmVyYXRvciBvbiBJRFQvU1RBQyBjb2RlY3MgaXMKQEAgLTEzMCwxMCArMTM2LDcgQEAKIAljYW5jZWxfd29ya19zeW5jKCZiZWVwLT5iZWVwX3dvcmspOwogCWlmIChiZWVwLT5wbGF5aW5nKSB7CiAJCS8qIHR1cm4gb2ZmIGJlZXAgKi8KLQkJc25kX2hkYV9jb2RlY193cml0ZShiZWVwLT5jb2RlYywgYmVlcC0+bmlkLCAwLAotCQkJCSAgICBBQ19WRVJCX1NFVF9CRUVQX0NPTlRST0wsIDApOwotCQliZWVwLT5wbGF5aW5nID0gMDsKLQkJc25kX2hkYV9wb3dlcl9kb3duKGJlZXAtPmNvZGVjKTsKKwkJZ2VuZXJhdGVfdG9uZShiZWVwLCAwKTsKIAl9CiB9CiAKQEAgLTE2MCwxNSArMTYzLDE1IEBACiAJaW5wdXRfZGV2LT5uYW1lID0gIkhEQSBEaWdpdGFsIFBDQmVlcCI7CiAJaW5wdXRfZGV2LT5waHlzID0gYmVlcC0+cGh5czsKIAlpbnB1dF9kZXYtPmlkLmJ1c3R5cGUgPSBCVVNfUENJOworCWlucHV0X2Rldi0+ZGV2LnBhcmVudCA9ICZjb2RlYy0+Y2FyZC0+Y2FyZF9kZXY7CiAKLQlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IGNvZGVjLT52ZW5kb3JfaWQgPj4gMTY7Ci0JaW5wdXRfZGV2LT5pZC5wcm9kdWN0ID0gY29kZWMtPnZlbmRvcl9pZCAmIDB4ZmZmZjsKKwlpbnB1dF9kZXYtPmlkLnZlbmRvciA9IGNvZGVjLT5jb3JlLnZlbmRvcl9pZCA+PiAxNjsKKwlpbnB1dF9kZXYtPmlkLnByb2R1Y3QgPSBjb2RlYy0+Y29yZS52ZW5kb3JfaWQgJiAweGZmZmY7CiAJaW5wdXRfZGV2LT5pZC52ZXJzaW9uID0gMHgwMTsKIAogCWlucHV0X2Rldi0+ZXZiaXRbMF0gPSBCSVRfTUFTSyhFVl9TTkQpOwogCWlucHV0X2Rldi0+c25kYml0WzBdID0gQklUX01BU0soU05EX0JFTEwpIHwgQklUX01BU0soU05EX1RPTkUpOwogCWlucHV0X2Rldi0+ZXZlbnQgPSBzbmRfaGRhX2JlZXBfZXZlbnQ7Ci0JaW5wdXRfZGV2LT5kZXYucGFyZW50ID0gJmNvZGVjLT5kZXY7CiAJaW5wdXRfc2V0X2RydmRhdGEoaW5wdXRfZGV2LCBiZWVwKTsKIAogCWJlZXAtPmRldiA9IGlucHV0X2RldjsKQEAgLTIyNCw3ICsyMjcsNyBAQAogCWlmIChiZWVwID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCXNucHJpbnRmKGJlZXAtPnBoeXMsIHNpemVvZihiZWVwLT5waHlzKSwKLQkJImNhcmQlZC9jb2RlYyMlZC9iZWVwMCIsIGNvZGVjLT5idXMtPmNhcmQtPm51bWJlciwgY29kZWMtPmFkZHIpOworCQkiY2FyZCVkL2NvZGVjIyVkL2JlZXAwIiwgY29kZWMtPmNhcmQtPm51bWJlciwgY29kZWMtPmFkZHIpOwogCS8qIGVuYWJsZSBsaW5lYXIgc2NhbGUgKi8KIAlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCiAJCUFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8yLCAweDAxKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2JlZXAuaAppbmRleCBhNjNiNWUwLi40NjUyNGZmIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9iZWVwLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfYmVlcC5oCkBAIC00MCw2ICs0MCw3IEBACiAJdW5zaWduZWQgaW50IHBsYXlpbmc6MTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgYmVlcF93b3JrOyAvKiBzY2hlZHVsZWQgdGFzayBmb3IgYmVlcCBldmVudCAqLwogCXN0cnVjdCBtdXRleCBtdXRleDsKKwl2b2lkICgqcG93ZXJfaG9vaykoc3RydWN0IGhkYV9iZWVwICpiZWVwLCBib29sIG9uKTsKIH07CiAKICNpZmRlZiBDT05GSUdfU05EX0hEQV9JTlBVVF9CRUVQCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9iaW5kLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9iaW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhYTMxYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2JpbmQuYwpAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIEhELWF1ZGlvIGNvZGVjIGRyaXZlciBiaW5kaW5nCisgKiBDb3B5cmlnaHQgKGMpIFRha2FzaGkgSXdhaSA8dGl3YWlAc3VzZS5kZT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlICJoZGFfY29kZWMuaCIKKyNpbmNsdWRlICJoZGFfbG9jYWwuaCIKKworLyoKKyAqIGZpbmQgYSBtYXRjaGluZyBjb2RlYyBwcmVzZXQKKyAqLworc3RhdGljIGludCBoZGFfY29kZWNfbWF0Y2goc3RydWN0IGhkYWNfZGV2aWNlICpkZXYsIHN0cnVjdCBoZGFjX2RyaXZlciAqZHJ2KQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGhkYV9jb2RlYywgY29yZSk7CisJc3RydWN0IGhkYV9jb2RlY19kcml2ZXIgKmRyaXZlciA9CisJCWNvbnRhaW5lcl9vZihkcnYsIHN0cnVjdCBoZGFfY29kZWNfZHJpdmVyLCBjb3JlKTsKKwljb25zdCBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCAqcHJlc2V0OworCS8qIGNoZWNrIHByb2JlX2lkIGluc3RlYWQgb2YgdmVuZG9yX2lkIGlmIHNldCAqLworCXUzMiBpZCA9IGNvZGVjLT5wcm9iZV9pZCA/IGNvZGVjLT5wcm9iZV9pZCA6IGNvZGVjLT5jb3JlLnZlbmRvcl9pZDsKKworCWZvciAocHJlc2V0ID0gZHJpdmVyLT5wcmVzZXQ7IHByZXNldC0+aWQ7IHByZXNldCsrKSB7CisJCXUzMiBtYXNrID0gcHJlc2V0LT5tYXNrOworCisJCWlmIChwcmVzZXQtPmFmZyAmJiBwcmVzZXQtPmFmZyAhPSBjb2RlYy0+Y29yZS5hZmcpCisJCQljb250aW51ZTsKKwkJaWYgKHByZXNldC0+bWZnICYmIHByZXNldC0+bWZnICE9IGNvZGVjLT5jb3JlLm1mZykKKwkJCWNvbnRpbnVlOworCQlpZiAoIW1hc2spCisJCQltYXNrID0gfjA7CisJCWlmIChwcmVzZXQtPmlkID09IChpZCAmIG1hc2spICYmCisJCSAgICAoIXByZXNldC0+cmV2IHx8IHByZXNldC0+cmV2ID09IGNvZGVjLT5jb3JlLnJldmlzaW9uX2lkKSkgeworCQkJY29kZWMtPnByZXNldCA9IHByZXNldDsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBwcm9jZXNzIGFuIHVuc29saWNpdGVkIGV2ZW50ICovCitzdGF0aWMgdm9pZCBoZGFfY29kZWNfdW5zb2xfZXZlbnQoc3RydWN0IGhkYWNfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBldikKK3sKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBoZGFfY29kZWMsIGNvcmUpOworCisJaWYgKGNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQpCisJCWNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQoY29kZWMsIGV2KTsKK30KKworLyogcmVzZXQgdGhlIGNvZGVjIG5hbWUgZnJvbSB0aGUgcHJlc2V0ICovCitzdGF0aWMgaW50IGNvZGVjX3JlZnJlc2hfbmFtZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAobmFtZSkgeworCQlrZnJlZShjb2RlYy0+Y29yZS5jaGlwX25hbWUpOworCQljb2RlYy0+Y29yZS5jaGlwX25hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworCX0KKwlyZXR1cm4gY29kZWMtPmNvcmUuY2hpcF9uYW1lID8gMCA6IC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgaGRhX2NvZGVjX2RyaXZlcl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfdG9faGRhX2NvZGVjKGRldik7CisJc3RydWN0IG1vZHVsZSAqb3duZXIgPSBkZXYtPmRyaXZlci0+b3duZXI7CisJaW50IGVycjsKKworCWlmIChXQVJOX09OKCFjb2RlYy0+cHJlc2V0KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSBjb2RlY19yZWZyZXNoX25hbWUoY29kZWMsIGNvZGVjLT5wcmVzZXQtPm5hbWUpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yOworCWVyciA9IHNuZF9oZGFjX3JlZ21hcF9pbml0KCZjb2RlYy0+Y29yZSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KG93bmVyKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCWVyciA9IGNvZGVjLT5wcmVzZXQtPnBhdGNoKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcl9tb2R1bGU7CisKKwllcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX3BjbXMoY29kZWMpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGVycm9yX21vZHVsZTsKKwllcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX2NvbnRyb2xzKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcl9tb2R1bGU7CisJaWYgKGNvZGVjLT5jYXJkLT5yZWdpc3RlcmVkKSB7CisJCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNvZGVjLT5jYXJkKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGVycm9yX21vZHVsZTsKKwkJc25kX2hkYV9jb2RlY19yZWdpc3Rlcihjb2RlYyk7CisJfQorCisJY29kZWMtPmNvcmUubGF6eV9jYWNoZSA9IHRydWU7CisJcmV0dXJuIDA7CisKKyBlcnJvcl9tb2R1bGU6CisJbW9kdWxlX3B1dChvd25lcik7CisKKyBlcnJvcjoKKwlzbmRfaGRhX2NvZGVjX2NsZWFudXBfZm9yX3VuYmluZChjb2RlYyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBoZGFfY29kZWNfZHJpdmVyX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfdG9faGRhX2NvZGVjKGRldik7CisKKwlpZiAoY29kZWMtPnBhdGNoX29wcy5mcmVlKQorCQljb2RlYy0+cGF0Y2hfb3BzLmZyZWUoY29kZWMpOworCXNuZF9oZGFfY29kZWNfY2xlYW51cF9mb3JfdW5iaW5kKGNvZGVjKTsKKwltb2R1bGVfcHV0KGRldi0+ZHJpdmVyLT5vd25lcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhkYV9jb2RlY19kcml2ZXJfc2h1dGRvd24oc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X3RvX2hkYV9jb2RlYyhkZXYpOworCisJaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpICYmIGNvZGVjLT5wYXRjaF9vcHMucmVib290X25vdGlmeSkKKwkJY29kZWMtPnBhdGNoX29wcy5yZWJvb3Rfbm90aWZ5KGNvZGVjKTsKK30KKworaW50IF9faGRhX2NvZGVjX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgaGRhX2NvZGVjX2RyaXZlciAqZHJ2LCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCWRydi0+Y29yZS5kcml2ZXIubmFtZSA9IG5hbWU7CisJZHJ2LT5jb3JlLmRyaXZlci5vd25lciA9IG93bmVyOworCWRydi0+Y29yZS5kcml2ZXIuYnVzID0gJnNuZF9oZGFfYnVzX3R5cGU7CisJZHJ2LT5jb3JlLmRyaXZlci5wcm9iZSA9IGhkYV9jb2RlY19kcml2ZXJfcHJvYmU7CisJZHJ2LT5jb3JlLmRyaXZlci5yZW1vdmUgPSBoZGFfY29kZWNfZHJpdmVyX3JlbW92ZTsKKwlkcnYtPmNvcmUuZHJpdmVyLnNodXRkb3duID0gaGRhX2NvZGVjX2RyaXZlcl9zaHV0ZG93bjsKKwlkcnYtPmNvcmUuZHJpdmVyLnBtID0gJmhkYV9jb2RlY19kcml2ZXJfcG07CisJZHJ2LT5jb3JlLnR5cGUgPSBIREFfREVWX0xFR0FDWTsKKwlkcnYtPmNvcmUubWF0Y2ggPSBoZGFfY29kZWNfbWF0Y2g7CisJZHJ2LT5jb3JlLnVuc29sX2V2ZW50ID0gaGRhX2NvZGVjX3Vuc29sX2V2ZW50OworCXJldHVybiBkcml2ZXJfcmVnaXN0ZXIoJmRydi0+Y29yZS5kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19oZGFfY29kZWNfZHJpdmVyX3JlZ2lzdGVyKTsKKwordm9pZCBoZGFfY29kZWNfZHJpdmVyX3VucmVnaXN0ZXIoc3RydWN0IGhkYV9jb2RlY19kcml2ZXIgKmRydikKK3sKKwlkcml2ZXJfdW5yZWdpc3RlcigmZHJ2LT5jb3JlLmRyaXZlcik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChoZGFfY29kZWNfZHJpdmVyX3VucmVnaXN0ZXIpOworCitzdGF0aWMgaW5saW5lIGJvb2wgY29kZWNfcHJvYmVkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXJldHVybiBkZXZpY2VfYXR0YWNoKGhkYV9jb2RlY19kZXYoY29kZWMpKSA+IDAgJiYgY29kZWMtPnByZXNldDsKK30KKworLyogdHJ5IHRvIGF1dG8tbG9hZCBhbmQgYmluZCB0aGUgY29kZWMgbW9kdWxlICovCitzdGF0aWMgdm9pZCBjb2RlY19iaW5kX21vZHVsZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKyNpZmRlZiBNT0RVTEUKKwlyZXF1ZXN0X21vZHVsZSgic25kLWhkYS1jb2RlYy1pZDolMDh4IiwgY29kZWMtPmNvcmUudmVuZG9yX2lkKTsKKwlpZiAoY29kZWNfcHJvYmVkKGNvZGVjKSkKKwkJcmV0dXJuOworCXJlcXVlc3RfbW9kdWxlKCJzbmQtaGRhLWNvZGVjLWlkOiUwNHgqIiwKKwkJICAgICAgIChjb2RlYy0+Y29yZS52ZW5kb3JfaWQgPj4gMTYpICYgMHhmZmZmKTsKKwlpZiAoY29kZWNfcHJvYmVkKGNvZGVjKSkKKwkJcmV0dXJuOworI2VuZGlmCit9CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfSERBX0NPREVDX0hETUkpCisvKiBpZiBhbGwgYXVkaW8gb3V0IHdpZGdldHMgYXJlIGRpZ2l0YWwsIGxldCdzIGFzc3VtZSB0aGUgY29kZWMgYXMgYSBIRE1JL0RQICovCitzdGF0aWMgYm9vbCBpc19saWtlbHlfaGRtaV9jb2RlYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwloZGFfbmlkX3QgbmlkOworCisJZm9yX2VhY2hfaGRhX2NvZGVjX25vZGUobmlkLCBjb2RlYykgeworCQl1bnNpZ25lZCBpbnQgd2NhcHMgPSBnZXRfd2NhcHMoY29kZWMsIG5pZCk7CisJCXN3aXRjaCAoZ2V0X3djYXBzX3R5cGUod2NhcHMpKSB7CisJCWNhc2UgQUNfV0lEX0FVRF9JTjoKKwkJCXJldHVybiBmYWxzZTsgLyogSERNSSBwYXJzZXIgc3VwcG9ydHMgb25seSBIRE1JIG91dCAqLworCQljYXNlIEFDX1dJRF9BVURfT1VUOgorCQkJaWYgKCEod2NhcHMgJiBBQ19XQ0FQX0RJR0lUQUwpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiB0cnVlOworfQorI2Vsc2UKKy8qIG5vIEhETUkgY29kZWMgcGFyc2VyIHN1cHBvcnQgKi8KKyNkZWZpbmUgaXNfbGlrZWx5X2hkbWlfY29kZWMoY29kZWMpCWZhbHNlCisjZW5kaWYgLyogQ09ORklHX1NORF9IREFfQ09ERUNfSERNSSAqLworCitzdGF0aWMgaW50IGNvZGVjX2JpbmRfZ2VuZXJpYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlpZiAoY29kZWMtPnByb2JlX2lkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChpc19saWtlbHlfaGRtaV9jb2RlYyhjb2RlYykpIHsKKwkJY29kZWMtPnByb2JlX2lkID0gSERBX0NPREVDX0lEX0dFTkVSSUNfSERNSTsKKyNpZiBJU19NT0RVTEUoQ09ORklHX1NORF9IREFfQ09ERUNfSERNSSkKKwkJcmVxdWVzdF9tb2R1bGUoInNuZC1oZGEtY29kZWMtaGRtaSIpOworI2VuZGlmCisJCWlmIChjb2RlY19wcm9iZWQoY29kZWMpKQorCQkJcmV0dXJuIDA7CisJfQorCisJY29kZWMtPnByb2JlX2lkID0gSERBX0NPREVDX0lEX0dFTkVSSUM7CisjaWYgSVNfTU9EVUxFKENPTkZJR19TTkRfSERBX0dFTkVSSUMpCisJcmVxdWVzdF9tb2R1bGUoInNuZC1oZGEtY29kZWMtZ2VuZXJpYyIpOworI2VuZGlmCisJaWYgKGNvZGVjX3Byb2JlZChjb2RlYykpCisJCXJldHVybiAwOworCXJldHVybiAtRU5PREVWOworfQorCisjaWYgSVNfRU5BQkxFRChDT05GSUdfU05EX0hEQV9HRU5FUklDKQorI2RlZmluZSBpc19nZW5lcmljX2NvbmZpZyhjb2RlYykgXAorCShjb2RlYy0+bW9kZWxuYW1lICYmICFzdHJjbXAoY29kZWMtPm1vZGVsbmFtZSwgImdlbmVyaWMiKSkKKyNlbHNlCisjZGVmaW5lIGlzX2dlbmVyaWNfY29uZmlnKGNvZGVjKQkwCisjZW5kaWYKKworLyoqCisgKiBzbmRfaGRhX2NvZGVjX2NvbmZpZ3VyZSAtIChSZS0pY29uZmlndXJlIHRoZSBIRC1hdWRpbyBjb2RlYworICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCisgKgorICogU3RhcnQgcGFyc2luZyBvZiB0aGUgZ2l2ZW4gY29kZWMgdHJlZSBhbmQgKHJlLSlpbml0aWFsaXplIHRoZSB3aG9sZQorICogcGF0Y2ggaW5zdGFuY2UuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgc25kX2hkYV9jb2RlY19jb25maWd1cmUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJaW50IGVycjsKKworCWlmIChpc19nZW5lcmljX2NvbmZpZyhjb2RlYykpCisJCWNvZGVjLT5wcm9iZV9pZCA9IEhEQV9DT0RFQ19JRF9HRU5FUklDOworCWVsc2UKKwkJY29kZWMtPnByb2JlX2lkID0gMDsKKworCWVyciA9IHNuZF9oZGFjX2RldmljZV9yZWdpc3RlcigmY29kZWMtPmNvcmUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJaWYgKCFjb2RlYy0+cHJlc2V0KQorCQljb2RlY19iaW5kX21vZHVsZShjb2RlYyk7CisJaWYgKCFjb2RlYy0+cHJlc2V0KSB7CisJCWVyciA9IGNvZGVjX2JpbmRfZ2VuZXJpYyhjb2RlYyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQljb2RlY19lcnIoY29kZWMsICJVbmFibGUgdG8gYmluZCB0aGUgY29kZWNcbiIpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCS8qIGF1ZGlvIGNvZGVjIHNob3VsZCBvdmVycmlkZSB0aGUgbWl4ZXIgbmFtZSAqLworCWlmIChjb2RlYy0+Y29yZS5hZmcgfHwgISpjb2RlYy0+Y2FyZC0+bWl4ZXJuYW1lKQorCQlzbnByaW50Zihjb2RlYy0+Y2FyZC0+bWl4ZXJuYW1lLAorCQkJIHNpemVvZihjb2RlYy0+Y2FyZC0+bWl4ZXJuYW1lKSwgIiVzICVzIiwKKwkJCSBjb2RlYy0+Y29yZS52ZW5kb3JfbmFtZSwgY29kZWMtPmNvcmUuY2hpcF9uYW1lKTsKKwlyZXR1cm4gMDsKKworIGVycm9yOgorCXNuZF9oZGFjX2RldmljZV91bnJlZ2lzdGVyKCZjb2RlYy0+Y29yZSk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfY29kZWNfY29uZmlndXJlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5jCmluZGV4IDJmZTg2ZDIuLmU3MGE3ZmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuYwpAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvYXN5bmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KQEAgLTM3LDk3ICszOSwyMCBAQAogI2luY2x1ZGUgImhkYV9qYWNrLmgiCiAjaW5jbHVkZSA8c291bmQvaGRhX2h3ZGVwLmg+CiAKLSNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwotI2luY2x1ZGUgImhkYV90cmFjZS5oIgotCi0vKgotICogdmVuZG9yIC8gcHJlc2V0IHRhYmxlCi0gKi8KLQotc3RydWN0IGhkYV92ZW5kb3JfaWQgewotCXVuc2lnbmVkIGludCBpZDsKLQljb25zdCBjaGFyICpuYW1lOwotfTsKLQotLyogY29kZWMgdmVuZG9yIGxhYmVscyAqLwotc3RhdGljIHN0cnVjdCBoZGFfdmVuZG9yX2lkIGhkYV92ZW5kb3JfaWRzW10gPSB7Ci0JeyAweDEwMDIsICJBVEkiIH0sCi0JeyAweDEwMTMsICJDaXJydXMgTG9naWMiIH0sCi0JeyAweDEwNTcsICJNb3Rvcm9sYSIgfSwKLQl7IDB4MTA5NSwgIlNpbGljb24gSW1hZ2UiIH0sCi0JeyAweDEwZGUsICJOdmlkaWEiIH0sCi0JeyAweDEwZWMsICJSZWFsdGVrIiB9LAotCXsgMHgxMTAyLCAiQ3JlYXRpdmUiIH0sCi0JeyAweDExMDYsICJWSUEiIH0sCi0JeyAweDExMWQsICJJRFQiIH0sCi0JeyAweDExYzEsICJMU0kiIH0sCi0JeyAweDExZDQsICJBbmFsb2cgRGV2aWNlcyIgfSwKLQl7IDB4MTNmNiwgIkMtTWVkaWEiIH0sCi0JeyAweDE0ZjEsICJDb25leGFudCIgfSwKLQl7IDB4MTdlOCwgIkNocm9udGVsIiB9LAotCXsgMHgxODU0LCAiTEciIH0sCi0JeyAweDFhZWMsICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MiIH0sCi0JeyAweDFhZjQsICJRRU1VIiB9LAotCXsgMHg0MzRkLCAiQy1NZWRpYSIgfSwKLQl7IDB4ODA4NiwgIkludGVsIiB9LAotCXsgMHg4Mzg0LCAiU2lnbWFUZWwiIH0sCi0Je30gLyogdGVybWluYXRvciAqLwotfTsKLQotc3RhdGljIERFRklORV9NVVRFWChwcmVzZXRfbXV0ZXgpOwotc3RhdGljIExJU1RfSEVBRChoZGFfcHJlc2V0X3RhYmxlcyk7Ci0KLS8qKgotICogc25kX2hkYV9hZGRfY29kZWNfcHJlc2V0IC0gQWRkIGEgY29kZWMgcHJlc2V0IHRvIHRoZSBjaGFpbgotICogQHByZXNldDogY29kZWMgcHJlc2V0IHRhYmxlIHRvIGFkZAotICovCi1pbnQgc25kX2hkYV9hZGRfY29kZWNfcHJlc2V0KHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0X2xpc3QgKnByZXNldCkKLXsKLQltdXRleF9sb2NrKCZwcmVzZXRfbXV0ZXgpOwotCWxpc3RfYWRkX3RhaWwoJnByZXNldC0+bGlzdCwgJmhkYV9wcmVzZXRfdGFibGVzKTsKLQltdXRleF91bmxvY2soJnByZXNldF9tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2FkZF9jb2RlY19wcmVzZXQpOwotCi0vKioKLSAqIHNuZF9oZGFfZGVsZXRlX2NvZGVjX3ByZXNldCAtIERlbGV0ZSBhIGNvZGVjIHByZXNldCBmcm9tIHRoZSBjaGFpbgotICogQHByZXNldDogY29kZWMgcHJlc2V0IHRhYmxlIHRvIGRlbGV0ZQotICovCi1pbnQgc25kX2hkYV9kZWxldGVfY29kZWNfcHJlc2V0KHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0X2xpc3QgKnByZXNldCkKLXsKLQltdXRleF9sb2NrKCZwcmVzZXRfbXV0ZXgpOwotCWxpc3RfZGVsKCZwcmVzZXQtPmxpc3QpOwotCW11dGV4X3VubG9jaygmcHJlc2V0X211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfZGVsZXRlX2NvZGVjX3ByZXNldCk7Ci0KICNpZmRlZiBDT05GSUdfUE0KLSNkZWZpbmUgY29kZWNfaW5fcG0oY29kZWMpCSgoY29kZWMpLT5pbl9wbSkKLXN0YXRpYyB2b2lkIGhkYV9wb3dlcl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci1zdGF0aWMgdm9pZCBoZGFfa2VlcF9wb3dlcl9vbihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Ci0jZGVmaW5lIGhkYV9jb2RlY19pc19wb3dlcl9vbihjb2RlYykJKChjb2RlYyktPnBvd2VyX29uKQotCi1zdGF0aWMgdm9pZCBoZGFfY2FsbF9wbV9ub3RpZnkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGJvb2wgcG93ZXJfdXApCi17Ci0Jc3RydWN0IGhkYV9idXMgKmJ1cyA9IGNvZGVjLT5idXM7Ci0KLQlpZiAoKHBvd2VyX3VwICYmIGNvZGVjLT5wbV91cF9ub3RpZmllZCkgfHwKLQkgICAgKCFwb3dlcl91cCAmJiAhY29kZWMtPnBtX3VwX25vdGlmaWVkKSkKLQkJcmV0dXJuOwotCWlmIChidXMtPm9wcy5wbV9ub3RpZnkpCi0JCWJ1cy0+b3BzLnBtX25vdGlmeShidXMsIHBvd2VyX3VwKTsKLQljb2RlYy0+cG1fdXBfbm90aWZpZWQgPSBwb3dlcl91cDsKLX0KLQorI2RlZmluZSBjb2RlY19pbl9wbShjb2RlYykJYXRvbWljX3JlYWQoJihjb2RlYyktPmNvcmUuaW5fcG0pCisjZGVmaW5lIGhkYV9jb2RlY19pc19wb3dlcl9vbihjb2RlYykgXAorCSghcG1fcnVudGltZV9zdXNwZW5kZWQoaGRhX2NvZGVjX2Rldihjb2RlYykpKQogI2Vsc2UKICNkZWZpbmUgY29kZWNfaW5fcG0oY29kZWMpCTAKLXN0YXRpYyBpbmxpbmUgdm9pZCBoZGFfa2VlcF9wb3dlcl9vbihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykge30KICNkZWZpbmUgaGRhX2NvZGVjX2lzX3Bvd2VyX29uKGNvZGVjKQkxCi0jZGVmaW5lIGhkYV9jYWxsX3BtX25vdGlmeShjb2RlYywgc3RhdGUpIHt9CiAjZW5kaWYKIAorI2RlZmluZSBjb2RlY19oYXNfZXBzcyhjb2RlYykgXAorCSgoY29kZWMpLT5jb3JlLnBvd2VyX2NhcHMgJiBBQ19QV1JTVF9FUFNTKQorI2RlZmluZSBjb2RlY19oYXNfY2xrc3RvcChjb2RlYykgXAorCSgoY29kZWMpLT5jb3JlLnBvd2VyX2NhcHMgJiBBQ19QV1JTVF9DTEtTVE9QKQorCiAvKioKICAqIHNuZF9oZGFfZ2V0X2phY2tfbG9jYXRpb24gLSBHaXZlIGEgbG9jYXRpb24gc3RyaW5nIG9mIHRoZSBqYWNrCiAgKiBAY2ZnOiBwaW4gZGVmYXVsdCBjb25maWcgdmFsdWUKQEAgLTE5OSw2NyArMTI0LDMyIEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2dldF9qYWNrX3R5cGUpOwogCiAvKgotICogQ29tcG9zZSBhIDMyYml0IGNvbW1hbmQgd29yZCB0byBiZSBzZW50IHRvIHRoZSBIRC1hdWRpbyBjb250cm9sbGVyCisgKiBTZW5kIGFuZCByZWNlaXZlIGEgdmVyYiAtIHBhc3NlZCB0byBleGVjX3ZlcmIgb3ZlcnJpZGUgZm9yIGhkYWNfZGV2aWNlCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1tYWtlX2NvZGVjX2NtZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGZsYWdzLAotCSAgICAgICB1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IHBhcm0pCitzdGF0aWMgaW50IGNvZGVjX2V4ZWNfdmVyYihzdHJ1Y3QgaGRhY19kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50ICpyZXMpCiB7Ci0JdTMyIHZhbDsKLQotCWlmICgoY29kZWMtPmFkZHIgJiB+MHhmKSB8fCAobmlkICYgfjB4N2YpIHx8Ci0JICAgICh2ZXJiICYgfjB4ZmZmKSB8fCAocGFybSAmIH4weGZmZmYpKSB7Ci0JCWNvZGVjX2Vycihjb2RlYywgImhkYS1jb2RlYzogb3V0IG9mIHJhbmdlIGNtZCAleDoleDoleDoleFxuIiwKLQkJICAgICAgIGNvZGVjLT5hZGRyLCBuaWQsIHZlcmIsIHBhcm0pOwotCQlyZXR1cm4gfjA7Ci0JfQotCi0JdmFsID0gKHUzMiljb2RlYy0+YWRkciA8PCAyODsKLQl2YWwgfD0gKHUzMiluaWQgPDwgMjA7Ci0JdmFsIHw9IHZlcmIgPDwgODsKLQl2YWwgfD0gcGFybTsKLQlyZXR1cm4gdmFsOwotfQotCi0vKgotICogU2VuZCBhbmQgcmVjZWl2ZSBhIHZlcmIKLSAqLwotc3RhdGljIGludCBjb2RlY19leGVjX3ZlcmIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCBjbWQsCi0JCQkgICBpbnQgZmxhZ3MsIHVuc2lnbmVkIGludCAqcmVzKQoteworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGhkYV9jb2RlYywgY29yZSk7CiAJc3RydWN0IGhkYV9idXMgKmJ1cyA9IGNvZGVjLT5idXM7CiAJaW50IGVycjsKIAogCWlmIChjbWQgPT0gfjApCiAJCXJldHVybiAtMTsKIAotCWlmIChyZXMpCi0JCSpyZXMgPSAtMTsKICBhZ2FpbjoKLQlzbmRfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKLQltdXRleF9sb2NrKCZidXMtPmNtZF9tdXRleCk7CisJc25kX2hkYV9wb3dlcl91cF9wbShjb2RlYyk7CisJbXV0ZXhfbG9jaygmYnVzLT5jb3JlLmNtZF9tdXRleCk7CiAJaWYgKGZsYWdzICYgSERBX1JXX05PX1JFU1BPTlNFX0ZBTExCQUNLKQogCQlidXMtPm5vX3Jlc3BvbnNlX2ZhbGxiYWNrID0gMTsKLQlmb3IgKDs7KSB7Ci0JCXRyYWNlX2hkYV9zZW5kX2NtZChjb2RlYywgY21kKTsKLQkJZXJyID0gYnVzLT5vcHMuY29tbWFuZChidXMsIGNtZCk7Ci0JCWlmIChlcnIgIT0gLUVBR0FJTikKLQkJCWJyZWFrOwotCQkvKiBwcm9jZXNzIHBlbmRpbmcgdmVyYnMgKi8KLQkJYnVzLT5vcHMuZ2V0X3Jlc3BvbnNlKGJ1cywgY29kZWMtPmFkZHIpOwotCX0KLQlpZiAoIWVyciAmJiByZXMpIHsKLQkJKnJlcyA9IGJ1cy0+b3BzLmdldF9yZXNwb25zZShidXMsIGNvZGVjLT5hZGRyKTsKLQkJdHJhY2VfaGRhX2dldF9yZXNwb25zZShjb2RlYywgKnJlcyk7Ci0JfQorCWVyciA9IHNuZF9oZGFjX2J1c19leGVjX3ZlcmJfdW5sb2NrZWQoJmJ1cy0+Y29yZSwgY29kZWMtPmNvcmUuYWRkciwKKwkJCQkJICAgICAgY21kLCByZXMpOwogCWJ1cy0+bm9fcmVzcG9uc2VfZmFsbGJhY2sgPSAwOwotCW11dGV4X3VubG9jaygmYnVzLT5jbWRfbXV0ZXgpOwotCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7Ci0JaWYgKCFjb2RlY19pbl9wbShjb2RlYykgJiYgcmVzICYmICpyZXMgPT0gLTEgJiYgYnVzLT5yaXJiX2Vycm9yKSB7CisJbXV0ZXhfdW5sb2NrKCZidXMtPmNvcmUuY21kX211dGV4KTsKKwlzbmRfaGRhX3Bvd2VyX2Rvd25fcG0oY29kZWMpOworCWlmICghY29kZWNfaW5fcG0oY29kZWMpICYmIHJlcyAmJiBlcnIgPCAwICYmIGJ1cy0+cmlyYl9lcnJvcikgewogCQlpZiAoYnVzLT5yZXNwb25zZV9yZXNldCkgewogCQkJY29kZWNfZGJnKGNvZGVjLAogCQkJCSAgInJlc2V0dGluZyBCVVMgZHVlIHRvIGZhdGFsIGNvbW11bmljYXRpb24gZXJyb3JcbiIpOwotCQkJdHJhY2VfaGRhX2J1c19yZXNldChidXMpOwogCQkJYnVzLT5vcHMuYnVzX3Jlc2V0KGJ1cyk7CiAJCX0KIAkJZ290byBhZ2FpbjsKQEAgLTI4Niw5ICsxNzYsOSBAQAogCQkJCWludCBmbGFncywKIAkJCQl1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IHBhcm0pCiB7Ci0JdW5zaWduZWQgY21kID0gbWFrZV9jb2RlY19jbWQoY29kZWMsIG5pZCwgZmxhZ3MsIHZlcmIsIHBhcm0pOworCXVuc2lnbmVkIGludCBjbWQgPSBzbmRfaGRhY19tYWtlX2NtZCgmY29kZWMtPmNvcmUsIG5pZCwgdmVyYiwgcGFybSk7CiAJdW5zaWduZWQgaW50IHJlczsKLQlpZiAoY29kZWNfZXhlY192ZXJiKGNvZGVjLCBjbWQsIGZsYWdzLCAmcmVzKSkKKwlpZiAoc25kX2hkYWNfZXhlY192ZXJiKCZjb2RlYy0+Y29yZSwgY21kLCBmbGFncywgJnJlcykpCiAJCXJldHVybiAtMTsKIAlyZXR1cm4gcmVzOwogfQpAQCAtMzA5LDEwICsxOTksOCBAQAogaW50IHNuZF9oZGFfY29kZWNfd3JpdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBmbGFncywKIAkJCXVuc2lnbmVkIGludCB2ZXJiLCB1bnNpZ25lZCBpbnQgcGFybSkKIHsKLQl1bnNpZ25lZCBpbnQgY21kID0gbWFrZV9jb2RlY19jbWQoY29kZWMsIG5pZCwgZmxhZ3MsIHZlcmIsIHBhcm0pOwotCXVuc2lnbmVkIGludCByZXM7Ci0JcmV0dXJuIGNvZGVjX2V4ZWNfdmVyYihjb2RlYywgY21kLCBmbGFncywKLQkJCSAgICAgICBjb2RlYy0+YnVzLT5zeW5jX3dyaXRlID8gJnJlcyA6IE5VTEwpOworCXVuc2lnbmVkIGludCBjbWQgPSBzbmRfaGRhY19tYWtlX2NtZCgmY29kZWMtPmNvcmUsIG5pZCwgdmVyYiwgcGFybSk7CisJcmV0dXJuIHNuZF9oZGFjX2V4ZWNfdmVyYigmY29kZWMtPmNvcmUsIGNtZCwgZmxhZ3MsIE5VTEwpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9jb2RlY193cml0ZSk7CiAKQEAgLTMzMSwzMCArMjE5LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUpOwogCi0vKioKLSAqIHNuZF9oZGFfZ2V0X3N1Yl9ub2RlcyAtIGdldCB0aGUgcmFuZ2Ugb2Ygc3ViIG5vZGVzCi0gKiBAY29kZWM6IHRoZSBIREEgY29kZWMKLSAqIEBuaWQ6IE5JRCB0byBwYXJzZQotICogQHN0YXJ0X2lkOiB0aGUgcG9pbnRlciB0byBzdG9yZSB0aGUgc3RhcnQgTklECi0gKgotICogUGFyc2UgdGhlIE5JRCBhbmQgc3RvcmUgdGhlIHN0YXJ0IE5JRCBvZiBpdHMgc3ViLW5vZGVzLgotICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHN1Yi1ub2Rlcy4KLSAqLwotaW50IHNuZF9oZGFfZ2V0X3N1Yl9ub2RlcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKLQkJCSAgaGRhX25pZF90ICpzdGFydF9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgcGFybTsKLQotCXBhcm0gPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX05PREVfQ09VTlQpOwotCWlmIChwYXJtID09IC0xKSB7Ci0JCSpzdGFydF9pZCA9IDA7Ci0JCXJldHVybiAwOwotCX0KLQkqc3RhcnRfaWQgPSAocGFybSA+PiAxNikgJiAweDdmZmY7Ci0JcmV0dXJuIChpbnQpKHBhcm0gJiAweDdmZmYpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9nZXRfc3ViX25vZGVzKTsKLQogLyogY29ubmVjdGlvbiBsaXN0IGVsZW1lbnQgKi8KIHN0cnVjdCBoZGFfY29ubl9saXN0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC00OTUsMTI4ICszNTksNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9nZXRfY29ubmVjdGlvbnMpOwogCi0vKiByZXR1cm4gQ09OTkxJU1RfTEVOIHBhcmFtZXRlciBvZiB0aGUgZ2l2ZW4gd2lkZ2V0ICovCi1zdGF0aWMgdW5zaWduZWQgaW50IGdldF9udW1fY29ubnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCi17Ci0JdW5zaWduZWQgaW50IHdjYXBzID0gZ2V0X3djYXBzKGNvZGVjLCBuaWQpOwotCXVuc2lnbmVkIGludCBwYXJtOwotCi0JaWYgKCEod2NhcHMgJiBBQ19XQ0FQX0NPTk5fTElTVCkgJiYKLQkgICAgZ2V0X3djYXBzX3R5cGUod2NhcHMpICE9IEFDX1dJRF9WT0xfS05CKQotCQlyZXR1cm4gMDsKLQotCXBhcm0gPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX0NPTk5MSVNUX0xFTik7Ci0JaWYgKHBhcm0gPT0gLTEpCi0JCXBhcm0gPSAwOwotCXJldHVybiBwYXJtOwotfQotCi1pbnQgc25kX2hkYV9nZXRfbnVtX3Jhd19jb25ucyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKLXsKLQlyZXR1cm4gc25kX2hkYV9nZXRfcmF3X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsIE5VTEwsIDApOwotfQotCi0vKioKLSAqIHNuZF9oZGFfZ2V0X3Jhd19jb25uZWN0aW9ucyAtIGNvcHkgY29ubmVjdGlvbiBsaXN0IHdpdGhvdXQgY2FjaGUKLSAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYwotICogQG5pZDogTklEIHRvIHBhcnNlCi0gKiBAY29ubl9saXN0OiBjb25uZWN0aW9uIGxpc3QgYXJyYXkKLSAqIEBtYXhfY29ubnM6IG1heC4gbnVtYmVyIG9mIGNvbm5lY3Rpb25zIHRvIHN0b3JlCi0gKgotICogTGlrZSBzbmRfaGRhX2dldF9jb25uZWN0aW9ucygpLCBjb3B5IHRoZSBjb25uZWN0aW9uIGxpc3QgYnV0IHdpdGhvdXQKLSAqIGNoZWNraW5nIHRocm91Z2ggdGhlIGNvbm5lY3Rpb24tbGlzdCBjYWNoZS4KLSAqIEN1cnJlbnRseSBjYWxsZWQgb25seSBmcm9tIGhkYV9wcm9jLmMsIHNvIG5vdCBleHBvcnRlZC4KLSAqLwotaW50IHNuZF9oZGFfZ2V0X3Jhd19jb25uZWN0aW9ucyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKLQkJCQloZGFfbmlkX3QgKmNvbm5fbGlzdCwgaW50IG1heF9jb25ucykKLXsKLQl1bnNpZ25lZCBpbnQgcGFybTsKLQlpbnQgaSwgY29ubl9sZW4sIGNvbm5zOwotCXVuc2lnbmVkIGludCBzaGlmdCwgbnVtX2VsZW1zLCBtYXNrOwotCWhkYV9uaWRfdCBwcmV2X25pZDsKLQlpbnQgbnVsbF9jb3VudCA9IDA7Ci0KLQlwYXJtID0gZ2V0X251bV9jb25ucyhjb2RlYywgbmlkKTsKLQlpZiAoIXBhcm0pCi0JCXJldHVybiAwOwotCi0JaWYgKHBhcm0gJiBBQ19DTElTVF9MT05HKSB7Ci0JCS8qIGxvbmcgZm9ybSAqLwotCQlzaGlmdCA9IDE2OwotCQludW1fZWxlbXMgPSAyOwotCX0gZWxzZSB7Ci0JCS8qIHNob3J0IGZvcm0gKi8KLQkJc2hpZnQgPSA4OwotCQludW1fZWxlbXMgPSA0OwotCX0KLQljb25uX2xlbiA9IHBhcm0gJiBBQ19DTElTVF9MRU5HVEg7Ci0JbWFzayA9ICgxIDw8IChzaGlmdC0xKSkgLSAxOwotCi0JaWYgKCFjb25uX2xlbikKLQkJcmV0dXJuIDA7IC8qIG5vIGNvbm5lY3Rpb24gKi8KLQotCWlmIChjb25uX2xlbiA9PSAxKSB7Ci0JCS8qIHNpbmdsZSBjb25uZWN0aW9uICovCi0JCXBhcm0gPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwKLQkJCQkJICBBQ19WRVJCX0dFVF9DT05ORUNUX0xJU1QsIDApOwotCQlpZiAocGFybSA9PSAtMSAmJiBjb2RlYy0+YnVzLT5yaXJiX2Vycm9yKQotCQkJcmV0dXJuIC1FSU87Ci0JCWlmIChjb25uX2xpc3QpCi0JCQljb25uX2xpc3RbMF0gPSBwYXJtICYgbWFzazsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyogbXVsdGkgY29ubmVjdGlvbiAqLwotCWNvbm5zID0gMDsKLQlwcmV2X25pZCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGNvbm5fbGVuOyBpKyspIHsKLQkJaW50IHJhbmdlX3ZhbDsKLQkJaGRhX25pZF90IHZhbCwgbjsKLQotCQlpZiAoaSAlIG51bV9lbGVtcyA9PSAwKSB7Ci0JCQlwYXJtID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCi0JCQkJCQkgIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfTElTVCwgaSk7Ci0JCQlpZiAocGFybSA9PSAtMSAmJiBjb2RlYy0+YnVzLT5yaXJiX2Vycm9yKQotCQkJCXJldHVybiAtRUlPOwotCQl9Ci0JCXJhbmdlX3ZhbCA9ICEhKHBhcm0gJiAoMSA8PCAoc2hpZnQtMSkpKTsgLyogcmFuZ2VzICovCi0JCXZhbCA9IHBhcm0gJiBtYXNrOwotCQlpZiAodmFsID09IDAgJiYgbnVsbF9jb3VudCsrKSB7ICAvKiBubyBzZWNvbmQgY2hhbmNlICovCi0JCQljb2RlY19kYmcoY29kZWMsCi0JCQkJICAiaW52YWxpZCBDT05ORUNUX0xJU1QgdmVyYiAleFslaV06JXhcbiIsCi0JCQkJICAgIG5pZCwgaSwgcGFybSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlwYXJtID4+PSBzaGlmdDsKLQkJaWYgKHJhbmdlX3ZhbCkgewotCQkJLyogcmFuZ2VzIGJldHdlZW4gdGhlIHByZXZpb3VzIGFuZCB0aGlzIG9uZSAqLwotCQkJaWYgKCFwcmV2X25pZCB8fCBwcmV2X25pZCA+PSB2YWwpIHsKLQkJCQljb2RlY193YXJuKGNvZGVjLAotCQkJCQkgICAiaW52YWxpZCBkZXBfcmFuZ2VfdmFsICV4OiV4XG4iLAotCQkJCQkgICBwcmV2X25pZCwgdmFsKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWZvciAobiA9IHByZXZfbmlkICsgMTsgbiA8PSB2YWw7IG4rKykgewotCQkJCWlmIChjb25uX2xpc3QpIHsKLQkJCQkJaWYgKGNvbm5zID49IG1heF9jb25ucykKLQkJCQkJCXJldHVybiAtRU5PU1BDOwotCQkJCQljb25uX2xpc3RbY29ubnNdID0gbjsKLQkJCQl9Ci0JCQkJY29ubnMrKzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChjb25uX2xpc3QpIHsKLQkJCQlpZiAoY29ubnMgPj0gbWF4X2Nvbm5zKQotCQkJCQlyZXR1cm4gLUVOT1NQQzsKLQkJCQljb25uX2xpc3RbY29ubnNdID0gdmFsOwotCQkJfQotCQkJY29ubnMrKzsKLQkJfQotCQlwcmV2X25pZCA9IHZhbDsKLQl9Ci0JcmV0dXJuIGNvbm5zOwotfQotCiAvKioKICAqIHNuZF9oZGFfb3ZlcnJpZGVfY29ubl9saXN0IC0gYWRkL21vZGlmeSB0aGUgY29ubmVjdGlvbi1saXN0IHRvIGNhY2hlCiAgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKQEAgLTc0MSw5MCArNDgzLDYgQEAKIAlyZXR1cm4gZGV2aWNlczsKIH0KIAotLyoqCi0gKiBzbmRfaGRhX3F1ZXVlX3Vuc29sX2V2ZW50IC0gYWRkIGFuIHVuc29saWNpdGVkIGV2ZW50IHRvIHF1ZXVlCi0gKiBAYnVzOiB0aGUgQlVTCi0gKiBAcmVzOiB1bnNvbGljaXRlZCBldmVudCAobG93ZXIgMzJiaXQgb2YgUklSQiBlbnRyeSkKLSAqIEByZXNfZXg6IGNvZGVjIGFkZHIgYW5kIGZsYWdzICh1cHBlciAzMmJpdCBvciBSSVJCIGVudHJ5KQotICoKLSAqIEFkZHMgdGhlIGdpdmVuIGV2ZW50IHRvIHRoZSBxdWV1ZS4gIFRoZSBldmVudHMgYXJlIHByb2Nlc3NlZCBpbgotICogdGhlIHdvcmtxdWV1ZSBhc3luY2hyb25vdXNseS4gIENhbGwgdGhpcyBmdW5jdGlvbiBpbiB0aGUgaW50ZXJydXB0Ci0gKiBoYW5sZGVyIHdoZW4gUklSQiByZWNlaXZlcyBhbiB1bnNvbGljaXRlZCBldmVudC4KLSAqCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgotICovCi1pbnQgc25kX2hkYV9xdWV1ZV91bnNvbF9ldmVudChzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1MzIgcmVzLCB1MzIgcmVzX2V4KQotewotCXN0cnVjdCBoZGFfYnVzX3Vuc29saWNpdGVkICp1bnNvbDsKLQl1bnNpZ25lZCBpbnQgd3A7Ci0KLQlpZiAoIWJ1cyB8fCAhYnVzLT53b3JrcSkKLQkJcmV0dXJuIDA7Ci0KLQl0cmFjZV9oZGFfdW5zb2xfZXZlbnQoYnVzLCByZXMsIHJlc19leCk7Ci0JdW5zb2wgPSBidXMtPnVuc29sOwotCWlmICghdW5zb2wpCi0JCXJldHVybiAwOwotCi0Jd3AgPSAodW5zb2wtPndwICsgMSkgJSBIREFfVU5TT0xfUVVFVUVfU0laRTsKLQl1bnNvbC0+d3AgPSB3cDsKLQotCXdwIDw8PSAxOwotCXVuc29sLT5xdWV1ZVt3cF0gPSByZXM7Ci0JdW5zb2wtPnF1ZXVlW3dwICsgMV0gPSByZXNfZXg7Ci0KLQlxdWV1ZV93b3JrKGJ1cy0+d29ya3EsICZ1bnNvbC0+d29yayk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfcXVldWVfdW5zb2xfZXZlbnQpOwotCi0vKgotICogcHJvY2VzcyBxdWV1ZWQgdW5zb2xpY2l0ZWQgZXZlbnRzCi0gKi8KLXN0YXRpYyB2b2lkIHByb2Nlc3NfdW5zb2xfZXZlbnRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgaGRhX2J1c191bnNvbGljaXRlZCAqdW5zb2wgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGhkYV9idXNfdW5zb2xpY2l0ZWQsIHdvcmspOwotCXN0cnVjdCBoZGFfYnVzICpidXMgPSB1bnNvbC0+YnVzOwotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwotCXVuc2lnbmVkIGludCBycCwgY2FkZHIsIHJlczsKLQotCXdoaWxlICh1bnNvbC0+cnAgIT0gdW5zb2wtPndwKSB7Ci0JCXJwID0gKHVuc29sLT5ycCArIDEpICUgSERBX1VOU09MX1FVRVVFX1NJWkU7Ci0JCXVuc29sLT5ycCA9IHJwOwotCQlycCA8PD0gMTsKLQkJcmVzID0gdW5zb2wtPnF1ZXVlW3JwXTsKLQkJY2FkZHIgPSB1bnNvbC0+cXVldWVbcnAgKyAxXTsKLQkJaWYgKCEoY2FkZHIgJiAoMSA8PCA0KSkpIC8qIG5vIHVuc29saWNpdGVkIGV2ZW50PyAqLwotCQkJY29udGludWU7Ci0JCWNvZGVjID0gYnVzLT5jYWRkcl90YmxbY2FkZHIgJiAweDBmXTsKLQkJaWYgKGNvZGVjICYmIGNvZGVjLT5wYXRjaF9vcHMudW5zb2xfZXZlbnQpCi0JCQljb2RlYy0+cGF0Y2hfb3BzLnVuc29sX2V2ZW50KGNvZGVjLCByZXMpOwotCX0KLX0KLQotLyoKLSAqIGluaXRpYWxpemUgdW5zb2xpY2l0ZWQgcXVldWUKLSAqLwotc3RhdGljIGludCBpbml0X3Vuc29sX3F1ZXVlKHN0cnVjdCBoZGFfYnVzICpidXMpCi17Ci0Jc3RydWN0IGhkYV9idXNfdW5zb2xpY2l0ZWQgKnVuc29sOwotCi0JaWYgKGJ1cy0+dW5zb2wpIC8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KLQkJcmV0dXJuIDA7Ci0KLQl1bnNvbCA9IGt6YWxsb2Moc2l6ZW9mKCp1bnNvbCksIEdGUF9LRVJORUwpOwotCWlmICghdW5zb2wpIHsKLQkJZGV2X2VycihidXMtPmNhcmQtPmRldiwgImNhbid0IGFsbG9jYXRlIHVuc29saWNpdGVkIHF1ZXVlXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCUlOSVRfV09SSygmdW5zb2wtPndvcmssIHByb2Nlc3NfdW5zb2xfZXZlbnRzKTsKLQl1bnNvbC0+YnVzID0gYnVzOwotCWJ1cy0+dW5zb2wgPSB1bnNvbDsKLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIGRlc3RydWN0b3IKICAqLwpAQCAtODMyLDE2ICs0OTAsOSBAQAogewogCWlmICghYnVzKQogCQlyZXR1cm47Ci0KLQlXQVJOX09OKCFsaXN0X2VtcHR5KCZidXMtPmNvZGVjX2xpc3QpKTsKLQlpZiAoYnVzLT53b3JrcSkKLQkJZmx1c2hfd29ya3F1ZXVlKGJ1cy0+d29ya3EpOwotCWtmcmVlKGJ1cy0+dW5zb2wpOwogCWlmIChidXMtPm9wcy5wcml2YXRlX2ZyZWUpCiAJCWJ1cy0+b3BzLnByaXZhdGVfZnJlZShidXMpOwotCWlmIChidXMtPndvcmtxKQotCQlkZXN0cm95X3dvcmtxdWV1ZShidXMtPndvcmtxKTsKLQorCXNuZF9oZGFjX2J1c19leGl0KCZidXMtPmNvcmUpOwogCWtmcmVlKGJ1cyk7CiB9CiAKQEAgLTg1OCwxNyArNTA5LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIGhkYWNfYnVzX29wcyB0cmFuc2xhdGlvbnMgKi8KK3N0YXRpYyBpbnQgX2hkYV9idXNfY29tbWFuZChzdHJ1Y3QgaGRhY19idXMgKl9idXMsIHVuc2lnbmVkIGludCBjbWQpCit7CisJc3RydWN0IGhkYV9idXMgKmJ1cyA9IGNvbnRhaW5lcl9vZihfYnVzLCBzdHJ1Y3QgaGRhX2J1cywgY29yZSk7CisJcmV0dXJuIGJ1cy0+b3BzLmNvbW1hbmQoYnVzLCBjbWQpOworfQorCitzdGF0aWMgaW50IF9oZGFfYnVzX2dldF9yZXNwb25zZShzdHJ1Y3QgaGRhY19idXMgKl9idXMsIHVuc2lnbmVkIGludCBhZGRyLAorCQkJCSB1bnNpZ25lZCBpbnQgKnJlcykKK3sKKwlzdHJ1Y3QgaGRhX2J1cyAqYnVzID0gY29udGFpbmVyX29mKF9idXMsIHN0cnVjdCBoZGFfYnVzLCBjb3JlKTsKKwkqcmVzID0gYnVzLT5vcHMuZ2V0X3Jlc3BvbnNlKGJ1cywgYWRkcik7CisJcmV0dXJuIGJ1cy0+cmlyYl9lcnJvciA/IC1FSU8gOiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkYWNfYnVzX29wcyBidXNfb3BzID0geworCS5jb21tYW5kID0gX2hkYV9idXNfY29tbWFuZCwKKwkuZ2V0X3Jlc3BvbnNlID0gX2hkYV9idXNfZ2V0X3Jlc3BvbnNlLAorfTsKKwogLyoqCiAgKiBzbmRfaGRhX2J1c19uZXcgLSBjcmVhdGUgYSBIREEgYnVzCiAgKiBAY2FyZDogdGhlIGNhcmQgZW50cnkKLSAqIEB0ZW1wOiB0aGUgdGVtcGxhdGUgZm9yIGhkYV9idXMgaW5mb3JtYXRpb24KICAqIEBidXNwOiB0aGUgcG9pbnRlciB0byBzdG9yZSB0aGUgY3JlYXRlZCBidXMgaW5zdGFuY2UKICAqCiAgKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgogICovCiBpbnQgc25kX2hkYV9idXNfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBoZGFfYnVzX3RlbXBsYXRlICp0ZW1wLAotCQkJICAgICAgc3RydWN0IGhkYV9idXMgKipidXNwKQorCQkgICAgc3RydWN0IGhkYV9idXMgKipidXNwKQogewogCXN0cnVjdCBoZGFfYnVzICpidXM7CiAJaW50IGVycjsKQEAgLTg3Nyw0MCArNTQ2LDIxIEBACiAJCS5kZXZfZnJlZSA9IHNuZF9oZGFfYnVzX2Rldl9mcmVlLAogCX07CiAKLQlpZiAoc25kX0JVR19PTighdGVtcCkpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChzbmRfQlVHX09OKCF0ZW1wLT5vcHMuY29tbWFuZCB8fCAhdGVtcC0+b3BzLmdldF9yZXNwb25zZSkpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKGJ1c3ApCiAJCSpidXNwID0gTlVMTDsKIAogCWJ1cyA9IGt6YWxsb2Moc2l6ZW9mKCpidXMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnVzID09IE5VTEwpIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBzdHJ1Y3QgaGRhX2J1c1xuIik7CisJaWYgKCFidXMpCiAJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gc25kX2hkYWNfYnVzX2luaXQoJmJ1cy0+Y29yZSwgY2FyZC0+ZGV2LCAmYnVzX29wcyk7CisJaWYgKGVyciA8IDApIHsKKwkJa2ZyZWUoYnVzKTsKKwkJcmV0dXJuIGVycjsKIAl9CiAKIAlidXMtPmNhcmQgPSBjYXJkOwotCWJ1cy0+cHJpdmF0ZV9kYXRhID0gdGVtcC0+cHJpdmF0ZV9kYXRhOwotCWJ1cy0+cGNpID0gdGVtcC0+cGNpOwotCWJ1cy0+bW9kZWxuYW1lID0gdGVtcC0+bW9kZWxuYW1lOwotCWJ1cy0+cG93ZXJfc2F2ZSA9IHRlbXAtPnBvd2VyX3NhdmU7Ci0JYnVzLT5vcHMgPSB0ZW1wLT5vcHM7Ci0KLQltdXRleF9pbml0KCZidXMtPmNtZF9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmYnVzLT5wcmVwYXJlX211dGV4KTsKLQlJTklUX0xJU1RfSEVBRCgmYnVzLT5jb2RlY19saXN0KTsKLQotCXNucHJpbnRmKGJ1cy0+d29ya3FfbmFtZSwgc2l6ZW9mKGJ1cy0+d29ya3FfbmFtZSksCi0JCSAiaGQtYXVkaW8lZCIsIGNhcmQtPm51bWJlcik7Ci0JYnVzLT53b3JrcSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGJ1cy0+d29ya3FfbmFtZSk7Ci0JaWYgKCFidXMtPndvcmtxKSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IGNyZWF0ZSB3b3JrcXVldWUgJXNcbiIsCi0JCQkgICBidXMtPndvcmtxX25hbWUpOwotCQlrZnJlZShidXMpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAKIAllcnIgPSBzbmRfZGV2aWNlX25ldyhjYXJkLCBTTkRSVl9ERVZfQlVTLCBidXMsICZkZXZfb3BzKTsKIAlpZiAoZXJyIDwgMCkgewpAQCAtOTIzLDE0MCArNTczLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfYnVzX25ldyk7CiAKLSNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfSERBX0dFTkVSSUMpCi0jZGVmaW5lIGlzX2dlbmVyaWNfY29uZmlnKGNvZGVjKSBcCi0JKGNvZGVjLT5tb2RlbG5hbWUgJiYgIXN0cmNtcChjb2RlYy0+bW9kZWxuYW1lLCAiZ2VuZXJpYyIpKQotI2Vsc2UKLSNkZWZpbmUgaXNfZ2VuZXJpY19jb25maWcoY29kZWMpCTAKLSNlbmRpZgotCi0jaWZkZWYgTU9EVUxFCi0jZGVmaW5lIEhEQV9NT0RSRVFfTUFYX0NPVU5UCTIJLyogdHdvIHJlcXVlc3RfbW9kdWxlcygpJ3MgKi8KLSNlbHNlCi0jZGVmaW5lIEhEQV9NT0RSRVFfTUFYX0NPVU5UCTAJLyogYWxsIHByZXNldHMgYXJlIHN0YXRpY2FsbHkgbGlua2VkICovCi0jZW5kaWYKLQotLyoKLSAqIGZpbmQgYSBtYXRjaGluZyBjb2RlYyBwcmVzZXQKLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0ICoKLWZpbmRfY29kZWNfcHJlc2V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCBoZGFfY29kZWNfcHJlc2V0X2xpc3QgKnRibDsKLQljb25zdCBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCAqcHJlc2V0OwotCXVuc2lnbmVkIGludCBtb2RfcmVxdWVzdGVkID0gMDsKLQotIGFnYWluOgotCW11dGV4X2xvY2soJnByZXNldF9tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeSh0YmwsICZoZGFfcHJlc2V0X3RhYmxlcywgbGlzdCkgewotCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHRibC0+b3duZXIpKSB7Ci0JCQljb2RlY19lcnIoY29kZWMsICJjYW5ub3QgbW9kdWxlX2dldFxuIik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlmb3IgKHByZXNldCA9IHRibC0+cHJlc2V0OyBwcmVzZXQtPmlkOyBwcmVzZXQrKykgewotCQkJdTMyIG1hc2sgPSBwcmVzZXQtPm1hc2s7Ci0JCQlpZiAocHJlc2V0LT5hZmcgJiYgcHJlc2V0LT5hZmcgIT0gY29kZWMtPmFmZykKLQkJCQljb250aW51ZTsKLQkJCWlmIChwcmVzZXQtPm1mZyAmJiBwcmVzZXQtPm1mZyAhPSBjb2RlYy0+bWZnKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFtYXNrKQotCQkJCW1hc2sgPSB+MDsKLQkJCWlmIChwcmVzZXQtPmlkID09IChjb2RlYy0+dmVuZG9yX2lkICYgbWFzaykgJiYKLQkJCSAgICAoIXByZXNldC0+cmV2IHx8Ci0JCQkgICAgIHByZXNldC0+cmV2ID09IGNvZGVjLT5yZXZpc2lvbl9pZCkpIHsKLQkJCQltdXRleF91bmxvY2soJnByZXNldF9tdXRleCk7Ci0JCQkJY29kZWMtPm93bmVyID0gdGJsLT5vd25lcjsKLQkJCQlyZXR1cm4gcHJlc2V0OwotCQkJfQotCQl9Ci0JCW1vZHVsZV9wdXQodGJsLT5vd25lcik7Ci0JfQotCW11dGV4X3VubG9jaygmcHJlc2V0X211dGV4KTsKLQotCWlmIChtb2RfcmVxdWVzdGVkIDwgSERBX01PRFJFUV9NQVhfQ09VTlQpIHsKLQkJaWYgKCFtb2RfcmVxdWVzdGVkKQotCQkJcmVxdWVzdF9tb2R1bGUoInNuZC1oZGEtY29kZWMtaWQ6JTA4eCIsCi0JCQkJICAgICAgIGNvZGVjLT52ZW5kb3JfaWQpOwotCQllbHNlCi0JCQlyZXF1ZXN0X21vZHVsZSgic25kLWhkYS1jb2RlYy1pZDolMDR4KiIsCi0JCQkJICAgICAgIChjb2RlYy0+dmVuZG9yX2lkID4+IDE2KSAmIDB4ZmZmZik7Ci0JCW1vZF9yZXF1ZXN0ZWQrKzsKLQkJZ290byBhZ2FpbjsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBnZXRfY29kZWNfbmFtZSAtIHN0b3JlIHRoZSBjb2RlYyBuYW1lCi0gKi8KLXN0YXRpYyBpbnQgZ2V0X2NvZGVjX25hbWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JY29uc3Qgc3RydWN0IGhkYV92ZW5kb3JfaWQgKmM7Ci0JY29uc3QgY2hhciAqdmVuZG9yID0gTlVMTDsKLQl1MTYgdmVuZG9yX2lkID0gY29kZWMtPnZlbmRvcl9pZCA+PiAxNjsKLQljaGFyIHRtcFsxNl07Ci0KLQlpZiAoY29kZWMtPnZlbmRvcl9uYW1lKQotCQlnb3RvIGdldF9jaGlwX25hbWU7Ci0KLQlmb3IgKGMgPSBoZGFfdmVuZG9yX2lkczsgYy0+aWQ7IGMrKykgewotCQlpZiAoYy0+aWQgPT0gdmVuZG9yX2lkKSB7Ci0JCQl2ZW5kb3IgPSBjLT5uYW1lOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JaWYgKCF2ZW5kb3IpIHsKLQkJc3ByaW50Zih0bXAsICJHZW5lcmljICUwNHgiLCB2ZW5kb3JfaWQpOwotCQl2ZW5kb3IgPSB0bXA7Ci0JfQotCWNvZGVjLT52ZW5kb3JfbmFtZSA9IGtzdHJkdXAodmVuZG9yLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWNvZGVjLT52ZW5kb3JfbmFtZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLSBnZXRfY2hpcF9uYW1lOgotCWlmIChjb2RlYy0+Y2hpcF9uYW1lKQotCQlyZXR1cm4gMDsKLQotCWlmIChjb2RlYy0+cHJlc2V0ICYmIGNvZGVjLT5wcmVzZXQtPm5hbWUpCi0JCWNvZGVjLT5jaGlwX25hbWUgPSBrc3RyZHVwKGNvZGVjLT5wcmVzZXQtPm5hbWUsIEdGUF9LRVJORUwpOwotCWVsc2UgewotCQlzcHJpbnRmKHRtcCwgIklEICV4IiwgY29kZWMtPnZlbmRvcl9pZCAmIDB4ZmZmZik7Ci0JCWNvZGVjLT5jaGlwX25hbWUgPSBrc3RyZHVwKHRtcCwgR0ZQX0tFUk5FTCk7Ci0JfQotCWlmICghY29kZWMtPmNoaXBfbmFtZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBsb29rIGZvciBhbiBBRkcgYW5kIE1GRyBub2RlcwotICovCi1zdGF0aWMgdm9pZCBzZXR1cF9mZ19ub2RlcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlpbnQgaSwgdG90YWxfbm9kZXMsIGZ1bmN0aW9uX2lkOwotCWhkYV9uaWRfdCBuaWQ7Ci0KLQl0b3RhbF9ub2RlcyA9IHNuZF9oZGFfZ2V0X3N1Yl9ub2Rlcyhjb2RlYywgQUNfTk9ERV9ST09ULCAmbmlkKTsKLQlmb3IgKGkgPSAwOyBpIDwgdG90YWxfbm9kZXM7IGkrKywgbmlkKyspIHsKLQkJZnVuY3Rpb25faWQgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwKLQkJCQkJCUFDX1BBUl9GVU5DVElPTl9UWVBFKTsKLQkJc3dpdGNoIChmdW5jdGlvbl9pZCAmIDB4ZmYpIHsKLQkJY2FzZSBBQ19HUlBfQVVESU9fRlVOQ1RJT046Ci0JCQljb2RlYy0+YWZnID0gbmlkOwotCQkJY29kZWMtPmFmZ19mdW5jdGlvbl9pZCA9IGZ1bmN0aW9uX2lkICYgMHhmZjsKLQkJCWNvZGVjLT5hZmdfdW5zb2wgPSAoZnVuY3Rpb25faWQgPj4gOCkgJiAxOwotCQkJYnJlYWs7Ci0JCWNhc2UgQUNfR1JQX01PREVNX0ZVTkNUSU9OOgotCQkJY29kZWMtPm1mZyA9IG5pZDsKLQkJCWNvZGVjLT5tZmdfZnVuY3Rpb25faWQgPSBmdW5jdGlvbl9pZCAmIDB4ZmY7Ci0JCQljb2RlYy0+bWZnX3Vuc29sID0gKGZ1bmN0aW9uX2lkID4+IDgpICYgMTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KIC8qCiAgKiByZWFkIHdpZGdldCBjYXBzIGZvciBlYWNoIHdpZGdldCBhbmQgc3RvcmUgaW4gY2FjaGUKICAqLwpAQCAtMTA2NSwyNSArNTgxLDIyIEBACiAJaW50IGk7CiAJaGRhX25pZF90IG5pZDsKIAotCWNvZGVjLT5udW1fbm9kZXMgPSBzbmRfaGRhX2dldF9zdWJfbm9kZXMoY29kZWMsIGZnX25vZGUsCi0JCQkJCQkgJmNvZGVjLT5zdGFydF9uaWQpOwotCWNvZGVjLT53Y2FwcyA9IGttYWxsb2MoY29kZWMtPm51bV9ub2RlcyAqIDQsIEdGUF9LRVJORUwpOworCWNvZGVjLT53Y2FwcyA9IGttYWxsb2MoY29kZWMtPmNvcmUubnVtX25vZGVzICogNCwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjb2RlYy0+d2NhcHMpCiAJCXJldHVybiAtRU5PTUVNOwotCW5pZCA9IGNvZGVjLT5zdGFydF9uaWQ7Ci0JZm9yIChpID0gMDsgaSA8IGNvZGVjLT5udW1fbm9kZXM7IGkrKywgbmlkKyspCi0JCWNvZGVjLT53Y2Fwc1tpXSA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLAotCQkJCQkJICAgICBBQ19QQVJfQVVESU9fV0lER0VUX0NBUCk7CisJbmlkID0gY29kZWMtPmNvcmUuc3RhcnRfbmlkOworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+Y29yZS5udW1fbm9kZXM7IGkrKywgbmlkKyspCisJCWNvZGVjLT53Y2Fwc1tpXSA9IHNuZF9oZGFjX3JlYWRfcGFybV91bmNhY2hlZCgmY29kZWMtPmNvcmUsCisJCQkJCW5pZCwgQUNfUEFSX0FVRElPX1dJREdFVF9DQVApOwogCXJldHVybiAwOwogfQogCiAvKiByZWFkIGFsbCBwaW4gZGVmYXVsdCBjb25maWd1cmF0aW9ucyBhbmQgc2F2ZSBjb2RlYy0+aW5pdF9waW5zICovCiBzdGF0aWMgaW50IHJlYWRfcGluX2RlZmF1bHRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCWludCBpOwotCWhkYV9uaWRfdCBuaWQgPSBjb2RlYy0+c3RhcnRfbmlkOworCWhkYV9uaWRfdCBuaWQ7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPm51bV9ub2RlczsgaSsrLCBuaWQrKykgeworCWZvcl9lYWNoX2hkYV9jb2RlY19ub2RlKG5pZCwgY29kZWMpIHsKIAkJc3RydWN0IGhkYV9waW5jZmcgKnBpbjsKIAkJdW5zaWduZWQgaW50IHdjYXBzID0gZ2V0X3djYXBzKGNvZGVjLCBuaWQpOwogCQl1bnNpZ25lZCBpbnQgd2lkX3R5cGUgPSBnZXRfd2NhcHNfdHlwZSh3Y2Fwcyk7CkBAIC0xMjkwLDE0ICs4MDMsMTAgQEAKIAlpZiAoIWNvZGVjLT5qYWNrcG9sbF9pbnRlcnZhbCkKIAkJcmV0dXJuOwogCi0JcXVldWVfZGVsYXllZF93b3JrKGNvZGVjLT5idXMtPndvcmtxLCAmY29kZWMtPmphY2twb2xsX3dvcmssCi0JCQkgICBjb2RlYy0+amFja3BvbGxfaW50ZXJ2YWwpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29kZWMtPmphY2twb2xsX3dvcmssCisJCQkgICAgICBjb2RlYy0+amFja3BvbGxfaW50ZXJ2YWwpOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X2hkYV9jYWNoZShzdHJ1Y3QgaGRhX2NhY2hlX3JlYyAqY2FjaGUsCi0JCQkgICB1bnNpZ25lZCBpbnQgcmVjb3JkX3NpemUpOwotc3RhdGljIHZvaWQgZnJlZV9oZGFfY2FjaGUoc3RydWN0IGhkYV9jYWNoZV9yZWMgKmNhY2hlKTsKLQogLyogcmVsZWFzZSBhbGwgcGluY2ZnIGxpc3RzICovCiBzdGF0aWMgdm9pZCBmcmVlX2luaXRfcGluY2ZncyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKQEAgLTEzMzksNzAgKzg0OCwxMTcgQEAKIH0KIAogLyoKLSAqIER5bmFtaWMgc3ltYm9sIGJpbmRpbmcgZm9yIHRoZSBjb2RlYyBwYXJzZXJzCisgKiBQQ00gZGV2aWNlCiAgKi8KLQotI2RlZmluZSBsb2FkX3BhcnNlcihjb2RlYywgc3ltKSBcCi0JKChjb2RlYyktPnBhcnNlciA9IChpbnQgKCopKHN0cnVjdCBoZGFfY29kZWMgKikpc3ltYm9sX3JlcXVlc3Qoc3ltKSkKLQotc3RhdGljIHZvaWQgdW5sb2FkX3BhcnNlcihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3N0YXRpYyB2b2lkIHJlbGVhc2VfcGNtKHN0cnVjdCBrcmVmICprcmVmKQogewotCWlmIChjb2RlYy0+cGFyc2VyKQotCQlzeW1ib2xfcHV0X2FkZHIoY29kZWMtPnBhcnNlcik7Ci0JY29kZWMtPnBhcnNlciA9IE5VTEw7CisJc3RydWN0IGhkYV9wY20gKnBjbSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgaGRhX3BjbSwga3JlZik7CisKKwlpZiAocGNtLT5wY20pCisJCXNuZF9kZXZpY2VfZnJlZShwY20tPmNvZGVjLT5jYXJkLCBwY20tPnBjbSk7CisJY2xlYXJfYml0KHBjbS0+ZGV2aWNlLCBwY20tPmNvZGVjLT5idXMtPnBjbV9kZXZfYml0cyk7CisJa2ZyZWUocGNtLT5uYW1lKTsKKwlrZnJlZShwY20pOwogfQogCit2b2lkIHNuZF9oZGFfY29kZWNfcGNtX3B1dChzdHJ1Y3QgaGRhX3BjbSAqcGNtKQoreworCWtyZWZfcHV0KCZwY20tPmtyZWYsIHJlbGVhc2VfcGNtKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfY29kZWNfcGNtX3B1dCk7CisKK3N0cnVjdCBoZGFfcGNtICpzbmRfaGRhX2NvZGVjX3BjbV9uZXcoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJc3RydWN0IGhkYV9wY20gKnBjbTsKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXBjbSA9IGt6YWxsb2Moc2l6ZW9mKCpwY20pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBjbSkKKwkJcmV0dXJuIE5VTEw7CisKKwlwY20tPmNvZGVjID0gY29kZWM7CisJa3JlZl9pbml0KCZwY20tPmtyZWYpOworCXBjbS0+bmFtZSA9IGt2YXNwcmludGYoR0ZQX0tFUk5FTCwgZm10LCBhcmdzKTsKKwlpZiAoIXBjbS0+bmFtZSkgeworCQlrZnJlZShwY20pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZwY20tPmxpc3QsICZjb2RlYy0+cGNtX2xpc3RfaGVhZCk7CisJcmV0dXJuIHBjbTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfY29kZWNfcGNtX25ldyk7CisKIC8qCiAgKiBjb2RlYyBkZXN0cnVjdG9yCiAgKi8KLXN0YXRpYyB2b2lkIHNuZF9oZGFfY29kZWNfZnJlZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3N0YXRpYyB2b2lkIGNvZGVjX3JlbGVhc2VfcGNtcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlpZiAoIWNvZGVjKQotCQlyZXR1cm47Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjb2RlYy0+amFja3BvbGxfd29yayk7Ci0Jc25kX2hkYV9qYWNrX3RibF9jbGVhcihjb2RlYyk7Ci0JZnJlZV9pbml0X3BpbmNmZ3MoY29kZWMpOwotI2lmZGVmIENPTkZJR19QTQotCWNhbmNlbF9kZWxheWVkX3dvcmsoJmNvZGVjLT5wb3dlcl93b3JrKTsKLQlmbHVzaF93b3JrcXVldWUoY29kZWMtPmJ1cy0+d29ya3EpOwotI2VuZGlmCi0JbGlzdF9kZWwoJmNvZGVjLT5saXN0KTsKLQlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPm1peGVycyk7Ci0Jc25kX2FycmF5X2ZyZWUoJmNvZGVjLT5uaWRzKTsKLQlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPmN2dF9zZXR1cHMpOwotCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+c3BkaWZfb3V0KTsKLQlyZW1vdmVfY29ubl9saXN0KGNvZGVjKTsKLQljb2RlYy0+YnVzLT5jYWRkcl90YmxbY29kZWMtPmFkZHJdID0gTlVMTDsKLQlpZiAoY29kZWMtPnBhdGNoX29wcy5mcmVlKQotCQljb2RlYy0+cGF0Y2hfb3BzLmZyZWUoY29kZWMpOwotCWhkYV9jYWxsX3BtX25vdGlmeShjb2RlYywgZmFsc2UpOyAvKiBjYW5jZWwgbGVmdG92ZXIgcmVmY291bnRzICovCi0Jc25kX2hkYV9zeXNmc19jbGVhcihjb2RlYyk7Ci0JdW5sb2FkX3BhcnNlcihjb2RlYyk7Ci0JbW9kdWxlX3B1dChjb2RlYy0+b3duZXIpOwotCWZyZWVfaGRhX2NhY2hlKCZjb2RlYy0+YW1wX2NhY2hlKTsKLQlmcmVlX2hkYV9jYWNoZSgmY29kZWMtPmNtZF9jYWNoZSk7Ci0Ja2ZyZWUoY29kZWMtPnZlbmRvcl9uYW1lKTsKLQlrZnJlZShjb2RlYy0+Y2hpcF9uYW1lKTsKLQlrZnJlZShjb2RlYy0+bW9kZWxuYW1lKTsKLQlrZnJlZShjb2RlYy0+d2NhcHMpOwotCWNvZGVjLT5idXMtPm51bV9jb2RlY3MtLTsKLQlwdXRfZGV2aWNlKCZjb2RlYy0+ZGV2KTsKKwlzdHJ1Y3QgaGRhX3BjbSAqcGNtLCAqbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwY20sIG4sICZjb2RlYy0+cGNtX2xpc3RfaGVhZCwgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZwY20tPmxpc3QpOworCQlpZiAocGNtLT5wY20pCisJCQlzbmRfZGV2aWNlX2Rpc2Nvbm5lY3QoY29kZWMtPmNhcmQsIHBjbS0+cGNtKTsKKwkJc25kX2hkYV9jb2RlY19wY21fcHV0KHBjbSk7CisJfQogfQogCi1zdGF0aWMgYm9vbCBzbmRfaGRhX2NvZGVjX2dldF9zdXBwb3J0ZWRfcHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJaGRhX25pZF90IGZnLCB1bnNpZ25lZCBpbnQgcG93ZXJfc3RhdGUpOwordm9pZCBzbmRfaGRhX2NvZGVjX2NsZWFudXBfZm9yX3VuYmluZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKK3sKKwlpZiAoY29kZWMtPnJlZ2lzdGVyZWQpIHsKKwkJLyogcG1fcnVudGltZV9wdXQoKSBpcyBjYWxsZWQgaW4gc25kX2hkYWNfZGV2aWNlX2V4aXQoKSAqLworCQlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZShoZGFfY29kZWNfZGV2KGNvZGVjKSk7CisJCXBtX3J1bnRpbWVfZGlzYWJsZShoZGFfY29kZWNfZGV2KGNvZGVjKSk7CisJCWNvZGVjLT5yZWdpc3RlcmVkID0gMDsKKwl9CisKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNvZGVjLT5qYWNrcG9sbF93b3JrKTsKKwlpZiAoIWNvZGVjLT5pbl9mcmVlaW5nKQorCQlzbmRfaGRhX2N0bHNfY2xlYXIoY29kZWMpOworCWNvZGVjX3JlbGVhc2VfcGNtcyhjb2RlYyk7CisJc25kX2hkYV9kZXRhY2hfYmVlcF9kZXZpY2UoY29kZWMpOworCW1lbXNldCgmY29kZWMtPnBhdGNoX29wcywgMCwgc2l6ZW9mKGNvZGVjLT5wYXRjaF9vcHMpKTsKKwlzbmRfaGRhX2phY2tfdGJsX2NsZWFyKGNvZGVjKTsKKwljb2RlYy0+cHJvY193aWRnZXRfaG9vayA9IE5VTEw7CisJY29kZWMtPnNwZWMgPSBOVUxMOworCisJLyogZnJlZSBvbmx5IGRyaXZlcl9waW5zIHNvIHRoYXQgaW5pdF9waW5zICsgdXNlcl9waW5zIGFyZSByZXN0b3JlZCAqLworCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+ZHJpdmVyX3BpbnMpOworCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+Y3Z0X3NldHVwcyk7CisJc25kX2FycmF5X2ZyZWUoJmNvZGVjLT5zcGRpZl9vdXQpOworCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+dmVyYnMpOworCWNvZGVjLT5wcmVzZXQgPSBOVUxMOworCWNvZGVjLT5zbGF2ZV9kaWdfb3V0cyA9IE5VTEw7CisJY29kZWMtPnNwZGlmX3N0YXR1c19yZXNldCA9IDA7CisJc25kX2FycmF5X2ZyZWUoJmNvZGVjLT5taXhlcnMpOworCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+bmlkcyk7CisJcmVtb3ZlX2Nvbm5fbGlzdChjb2RlYyk7CisJc25kX2hkYWNfcmVnbWFwX2V4aXQoJmNvZGVjLT5jb3JlKTsKK30KIAogc3RhdGljIHVuc2lnbmVkIGludCBoZGFfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCXVuc2lnbmVkIGludCBwb3dlcl9zdGF0ZSk7CiAKKy8qIGFsc28gY2FsbGVkIGZyb20gaGRhX2JpbmQuYyAqLwordm9pZCBzbmRfaGRhX2NvZGVjX3JlZ2lzdGVyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCWlmIChjb2RlYy0+cmVnaXN0ZXJlZCkKKwkJcmV0dXJuOworCWlmIChkZXZpY2VfaXNfcmVnaXN0ZXJlZChoZGFfY29kZWNfZGV2KGNvZGVjKSkpIHsKKwkJc25kX2hkYV9yZWdpc3Rlcl9iZWVwX2RldmljZShjb2RlYyk7CisJCXBtX3J1bnRpbWVfZW5hYmxlKGhkYV9jb2RlY19kZXYoY29kZWMpKTsKKwkJLyogaXQgd2FzIHBvd2VyZWQgdXAgaW4gc25kX2hkYV9jb2RlY19uZXcoKSwgbm93IGFsbCBkb25lICovCisJCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7CisJCWNvZGVjLT5yZWdpc3RlcmVkID0gMTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgc25kX2hkYV9jb2RlY19kZXZfcmVnaXN0ZXIoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldmljZS0+ZGV2aWNlX2RhdGE7Ci0JaW50IGVyciA9IGRldmljZV9hZGQoJmNvZGVjLT5kZXYpOwotCi0JaWYgKGVyciA8IDApCi0JCXJldHVybiBlcnI7Ci0Jc25kX2hkYV9yZWdpc3Rlcl9iZWVwX2RldmljZShjb2RlYyk7CisJc25kX2hkYV9jb2RlY19yZWdpc3RlcihkZXZpY2UtPmRldmljZV9kYXRhKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTQxMSwyMCArOTY3LDI5IEBACiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZpY2UtPmRldmljZV9kYXRhOwogCiAJc25kX2hkYV9kZXRhY2hfYmVlcF9kZXZpY2UoY29kZWMpOwotCWRldmljZV9kZWwoJmNvZGVjLT5kZXYpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNuZF9oZGFfY29kZWNfZGV2X2ZyZWUoc3RydWN0IHNuZF9kZXZpY2UgKmRldmljZSkKIHsKLQlzbmRfaGRhX2NvZGVjX2ZyZWUoZGV2aWNlLT5kZXZpY2VfZGF0YSk7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZpY2UtPmRldmljZV9kYXRhOworCisJY29kZWMtPmluX2ZyZWVpbmcgPSAxOworCXNuZF9oZGFjX2RldmljZV91bnJlZ2lzdGVyKCZjb2RlYy0+Y29yZSk7CisJcHV0X2RldmljZShoZGFfY29kZWNfZGV2KGNvZGVjKSk7CiAJcmV0dXJuIDA7CiB9CiAKLS8qIGp1c3QgZnJlZSB0aGUgY29udGFpbmVyICovCiBzdGF0aWMgdm9pZCBzbmRfaGRhX2NvZGVjX2Rldl9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlrZnJlZShjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3QgaGRhX2NvZGVjLCBkZXYpKTsKKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl90b19oZGFfY29kZWMoZGV2KTsKKworCWZyZWVfaW5pdF9waW5jZmdzKGNvZGVjKTsKKwlzbmRfaGRhY19kZXZpY2VfZXhpdCgmY29kZWMtPmNvcmUpOworCXNuZF9oZGFfc3lzZnNfY2xlYXIoY29kZWMpOworCWtmcmVlKGNvZGVjLT5tb2RlbG5hbWUpOworCWtmcmVlKGNvZGVjLT53Y2Fwcyk7CisJa2ZyZWUoY29kZWMpOwogfQogCiAvKioKQEAgLTE0MzUsOSArMTAwMCw4IEBACiAgKgogICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KICAqLwotaW50IHNuZF9oZGFfY29kZWNfbmV3KHN0cnVjdCBoZGFfYnVzICpidXMsCi0JCQkJdW5zaWduZWQgaW50IGNvZGVjX2FkZHIsCi0JCQkJc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCkKK2ludCBzbmRfaGRhX2NvZGVjX25ldyhzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsCisJCSAgICAgIHVuc2lnbmVkIGludCBjb2RlY19hZGRyLCBzdHJ1Y3QgaGRhX2NvZGVjICoqY29kZWNwKQogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwogCWNoYXIgY29tcG9uZW50WzMxXTsKQEAgLTE0NTQsMzUgKzEwMTgsMjcgQEAKIAlpZiAoc25kX0JVR19PTihjb2RlY19hZGRyID4gSERBX01BWF9DT0RFQ19BRERSRVNTKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoYnVzLT5jYWRkcl90YmxbY29kZWNfYWRkcl0pIHsKLQkJZGV2X2VycihidXMtPmNhcmQtPmRldiwKLQkJCSJhZGRyZXNzIDB4JXggaXMgYWxyZWFkeSBvY2N1cGllZFxuIiwKLQkJCWNvZGVjX2FkZHIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQogCWNvZGVjID0ga3phbGxvYyhzaXplb2YoKmNvZGVjKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGNvZGVjID09IE5VTEwpIHsKLQkJZGV2X2VycihidXMtPmNhcmQtPmRldiwgImNhbid0IGFsbG9jYXRlIHN0cnVjdCBoZGFfY29kZWNcbiIpOworCWlmICghY29kZWMpCiAJCXJldHVybiAtRU5PTUVNOworCisJc3ByaW50Zihjb21wb25lbnQsICJoZGF1ZGlvQyVkRCVkIiwgY2FyZC0+bnVtYmVyLCBjb2RlY19hZGRyKTsKKwllcnIgPSBzbmRfaGRhY19kZXZpY2VfaW5pdCgmY29kZWMtPmNvcmUsICZidXMtPmNvcmUsIGNvbXBvbmVudCwKKwkJCQkgICBjb2RlY19hZGRyKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZShjb2RlYyk7CisJCXJldHVybiBlcnI7CiAJfQogCi0JZGV2aWNlX2luaXRpYWxpemUoJmNvZGVjLT5kZXYpOwotCWNvZGVjLT5kZXYucGFyZW50ID0gJmJ1cy0+Y2FyZC0+Y2FyZF9kZXY7Ci0JY29kZWMtPmRldi5jbGFzcyA9IHNvdW5kX2NsYXNzOwotCWNvZGVjLT5kZXYucmVsZWFzZSA9IHNuZF9oZGFfY29kZWNfZGV2X3JlbGVhc2U7Ci0JY29kZWMtPmRldi5ncm91cHMgPSBzbmRfaGRhX2Rldl9hdHRyX2dyb3VwczsKLQlkZXZfc2V0X25hbWUoJmNvZGVjLT5kZXYsICJoZGF1ZGlvQyVkRCVkIiwgYnVzLT5jYXJkLT5udW1iZXIsCi0JCSAgICAgY29kZWNfYWRkcik7Ci0JZGV2X3NldF9kcnZkYXRhKCZjb2RlYy0+ZGV2LCBjb2RlYyk7IC8qIGZvciBzeXNmcyAqLworCWNvZGVjLT5jb3JlLmRldi5yZWxlYXNlID0gc25kX2hkYV9jb2RlY19kZXZfcmVsZWFzZTsKKwljb2RlYy0+Y29yZS50eXBlID0gSERBX0RFVl9MRUdBQ1k7CisJY29kZWMtPmNvcmUuZXhlY192ZXJiID0gY29kZWNfZXhlY192ZXJiOwogCiAJY29kZWMtPmJ1cyA9IGJ1czsKKwljb2RlYy0+Y2FyZCA9IGNhcmQ7CiAJY29kZWMtPmFkZHIgPSBjb2RlY19hZGRyOwogCW11dGV4X2luaXQoJmNvZGVjLT5zcGRpZl9tdXRleCk7CiAJbXV0ZXhfaW5pdCgmY29kZWMtPmNvbnRyb2xfbXV0ZXgpOwotCW11dGV4X2luaXQoJmNvZGVjLT5oYXNoX211dGV4KTsKLQlpbml0X2hkYV9jYWNoZSgmY29kZWMtPmFtcF9jYWNoZSwgc2l6ZW9mKHN0cnVjdCBoZGFfYW1wX2luZm8pKTsKLQlpbml0X2hkYV9jYWNoZSgmY29kZWMtPmNtZF9jYWNoZSwgc2l6ZW9mKHN0cnVjdCBoZGFfY2FjaGVfaGVhZCkpOwogCXNuZF9hcnJheV9pbml0KCZjb2RlYy0+bWl4ZXJzLCBzaXplb2Yoc3RydWN0IGhkYV9uaWRfaXRlbSksIDMyKTsKIAlzbmRfYXJyYXlfaW5pdCgmY29kZWMtPm5pZHMsIHNpemVvZihzdHJ1Y3QgaGRhX25pZF9pdGVtKSwgMzIpOwogCXNuZF9hcnJheV9pbml0KCZjb2RlYy0+aW5pdF9waW5zLCBzaXplb2Yoc3RydWN0IGhkYV9waW5jZmcpLCAxNik7CkBAIC0xNDkyLDE5ICsxMDQ4LDE0IEBACiAJc25kX2FycmF5X2luaXQoJmNvZGVjLT5qYWNrdGJsLCBzaXplb2Yoc3RydWN0IGhkYV9qYWNrX3RibCksIDE2KTsKIAlzbmRfYXJyYXlfaW5pdCgmY29kZWMtPnZlcmJzLCBzaXplb2Yoc3RydWN0IGhkYV92ZXJiICopLCA4KTsKIAlJTklUX0xJU1RfSEVBRCgmY29kZWMtPmNvbm5fbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5wY21fbGlzdF9oZWFkKTsKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZjb2RlYy0+amFja3BvbGxfd29yaywgaGRhX2phY2twb2xsX3dvcmspOwogCWNvZGVjLT5kZXBvcF9kZWxheSA9IC0xOwogCWNvZGVjLT5maXh1cF9pZCA9IEhEQV9GSVhVUF9JRF9OT1RfU0VUOwogCiAjaWZkZWYgQ09ORklHX1BNCi0Jc3Bpbl9sb2NrX2luaXQoJmNvZGVjLT5wb3dlcl9sb2NrKTsKLQlJTklUX0RFTEFZRURfV09SSygmY29kZWMtPnBvd2VyX3dvcmssIGhkYV9wb3dlcl93b3JrKTsKLQkvKiBzbmRfaGRhX2NvZGVjX25ldygpIG1hcmtzIHRoZSBjb2RlYyBhcyBwb3dlci11cCwgYW5kIGxlYXZlIGl0IGFzIGlzLgotCSAqIHRoZSBjYWxsZXIgaGFzIHRvIHBvd2VyIGRvd24gYXBwcm9wcmlhdGxleSBhZnRlciBpbml0aWFsaXphdGlvbgotCSAqIHBoYXNlLgotCSAqLwotCWhkYV9rZWVwX3Bvd2VyX29uKGNvZGVjKTsKKwljb2RlYy0+cG93ZXJfamlmZmllcyA9IGppZmZpZXM7CiAjZW5kaWYKIAogCXNuZF9oZGFfc3lzZnNfaW5pdChjb2RlYyk7CkBAIC0xNTE3LDU5ICsxMDY4LDE0IEBACiAJCX0KIAl9CiAKLQlsaXN0X2FkZF90YWlsKCZjb2RlYy0+bGlzdCwgJmJ1cy0+Y29kZWNfbGlzdCk7Ci0JYnVzLT5udW1fY29kZWNzKys7Ci0KLQlidXMtPmNhZGRyX3RibFtjb2RlY19hZGRyXSA9IGNvZGVjOwotCi0JY29kZWMtPnZlbmRvcl9pZCA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgQUNfTk9ERV9ST09ULAotCQkJCQkgICAgICBBQ19QQVJfVkVORE9SX0lEKTsKLQlpZiAoY29kZWMtPnZlbmRvcl9pZCA9PSAtMSkKLQkJLyogcmVhZCBhZ2FpbiwgaG9wZWZ1bGx5IHRoZSBhY2Nlc3MgbWV0aG9kIHdhcyBjb3JyZWN0ZWQKLQkJICogaW4gdGhlIGxhc3QgcmVhZC4uLgotCQkgKi8KLQkJY29kZWMtPnZlbmRvcl9pZCA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgQUNfTk9ERV9ST09ULAotCQkJCQkJICAgICAgQUNfUEFSX1ZFTkRPUl9JRCk7Ci0JY29kZWMtPnN1YnN5c3RlbV9pZCA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgQUNfTk9ERV9ST09ULAotCQkJCQkJIEFDX1BBUl9TVUJTWVNURU1fSUQpOwotCWNvZGVjLT5yZXZpc2lvbl9pZCA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgQUNfTk9ERV9ST09ULAotCQkJCQkJQUNfUEFSX1JFVl9JRCk7Ci0KLQlzZXR1cF9mZ19ub2Rlcyhjb2RlYyk7Ci0JaWYgKCFjb2RlYy0+YWZnICYmICFjb2RlYy0+bWZnKSB7Ci0JCWRldl9lcnIoYnVzLT5jYXJkLT5kZXYsICJubyBBRkcgb3IgTUZHIG5vZGUgZm91bmRcbiIpOwotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGVycm9yOwotCX0KLQotCWZnID0gY29kZWMtPmFmZyA/IGNvZGVjLT5hZmcgOiBjb2RlYy0+bWZnOworCWZnID0gY29kZWMtPmNvcmUuYWZnID8gY29kZWMtPmNvcmUuYWZnIDogY29kZWMtPmNvcmUubWZnOwogCWVyciA9IHJlYWRfd2lkZ2V0X2NhcHMoY29kZWMsIGZnKTsKLQlpZiAoZXJyIDwgMCkgewotCQlkZXZfZXJyKGJ1cy0+Y2FyZC0+ZGV2LCAiY2Fubm90IG1hbGxvY1xuIik7CisJaWYgKGVyciA8IDApCiAJCWdvdG8gZXJyb3I7Ci0JfQogCWVyciA9IHJlYWRfcGluX2RlZmF1bHRzKGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvcjsKIAotCWlmICghY29kZWMtPnN1YnN5c3RlbV9pZCkgewotCQljb2RlYy0+c3Vic3lzdGVtX2lkID0KLQkJCXNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgZmcsIDAsCi0JCQkJCSAgIEFDX1ZFUkJfR0VUX1NVQlNZU1RFTV9JRCwgMCk7Ci0JfQotCi0jaWZkZWYgQ09ORklHX1BNCi0JY29kZWMtPmQzX3N0b3BfY2xrID0gc25kX2hkYV9jb2RlY19nZXRfc3VwcG9ydGVkX3BzKGNvZGVjLCBmZywKLQkJCQkJQUNfUFdSU1RfQ0xLU1RPUCk7Ci0jZW5kaWYKLQljb2RlYy0+ZXBzcyA9IHNuZF9oZGFfY29kZWNfZ2V0X3N1cHBvcnRlZF9wcyhjb2RlYywgZmcsCi0JCQkJCUFDX1BXUlNUX0VQU1MpOwotI2lmZGVmIENPTkZJR19QTQotCWlmICghY29kZWMtPmQzX3N0b3BfY2xrIHx8ICFjb2RlYy0+ZXBzcykKLQkJYnVzLT5wb3dlcl9rZWVwX2xpbmtfb24gPSAxOwotI2VuZGlmCi0KLQogCS8qIHBvd2VyLXVwIGFsbCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gKi8KIAloZGFfc2V0X3Bvd2VyX3N0YXRlKGNvZGVjLCBBQ19QV1JTVF9EMCk7CiAKQEAgLTE1NzcsMTEgKzEwODMsMTEgQEAKIAogCXNuZF9oZGFfY3JlYXRlX2h3ZGVwKGNvZGVjKTsKIAotCXNwcmludGYoY29tcG9uZW50LCAiSERBOiUwOHgsJTA4eCwlMDh4IiwgY29kZWMtPnZlbmRvcl9pZCwKLQkJY29kZWMtPnN1YnN5c3RlbV9pZCwgY29kZWMtPnJldmlzaW9uX2lkKTsKLQlzbmRfY29tcG9uZW50X2FkZChjb2RlYy0+YnVzLT5jYXJkLCBjb21wb25lbnQpOworCXNwcmludGYoY29tcG9uZW50LCAiSERBOiUwOHgsJTA4eCwlMDh4IiwgY29kZWMtPmNvcmUudmVuZG9yX2lkLAorCQljb2RlYy0+Y29yZS5zdWJzeXN0ZW1faWQsIGNvZGVjLT5jb3JlLnJldmlzaW9uX2lkKTsKKwlzbmRfY29tcG9uZW50X2FkZChjYXJkLCBjb21wb25lbnQpOwogCi0JZXJyID0gc25kX2RldmljZV9uZXcoYnVzLT5jYXJkLCBTTkRSVl9ERVZfQ09ERUMsIGNvZGVjLCAmZGV2X29wcyk7CisJZXJyID0gc25kX2RldmljZV9uZXcoY2FyZCwgU05EUlZfREVWX0NPREVDLCBjb2RlYywgJmRldl9vcHMpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGVycm9yOwogCkBAIC0xNTkwLDcgKzEwOTYsNyBAQAogCXJldHVybiAwOwogCiAgZXJyb3I6Ci0Jc25kX2hkYV9jb2RlY19mcmVlKGNvZGVjKTsKKwlwdXRfZGV2aWNlKGhkYV9jb2RlY19kZXYoY29kZWMpKTsKIAlyZXR1cm4gZXJyOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9jb2RlY19uZXcpOwpAQCAtMTYwNywxNiArMTExMywxOCBAQAogCWhkYV9uaWRfdCBmZzsKIAlpbnQgZXJyOwogCisJZXJyID0gc25kX2hkYWNfcmVmcmVzaF93aWRnZXRzKCZjb2RlYy0+Y29yZSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKIAkvKiBBc3N1bWUgdGhlIGZ1bmN0aW9uIGdyb3VwIG5vZGUgZG9lcyBub3QgY2hhbmdlLAogCSAqIG9ubHkgdGhlIHdpZGdldCBub2RlcyBtYXkgY2hhbmdlLgogCSAqLwogCWtmcmVlKGNvZGVjLT53Y2Fwcyk7Ci0JZmcgPSBjb2RlYy0+YWZnID8gY29kZWMtPmFmZyA6IGNvZGVjLT5tZmc7CisJZmcgPSBjb2RlYy0+Y29yZS5hZmcgPyBjb2RlYy0+Y29yZS5hZmcgOiBjb2RlYy0+Y29yZS5tZmc7CiAJZXJyID0gcmVhZF93aWRnZXRfY2Fwcyhjb2RlYywgZmcpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWNvZGVjX2Vycihjb2RlYywgImNhbm5vdCBtYWxsb2NcbiIpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+aW5pdF9waW5zKTsKIAllcnIgPSByZWFkX3Bpbl9kZWZhdWx0cyhjb2RlYyk7CkBAIC0xNjI1LDk4ICsxMTMzLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfY29kZWNfdXBkYXRlX3dpZGdldHMpOwogCi0KLSNpZiBJU19FTkFCTEVEKENPTkZJR19TTkRfSERBX0NPREVDX0hETUkpCi0vKiBpZiBhbGwgYXVkaW8gb3V0IHdpZGdldHMgYXJlIGRpZ2l0YWwsIGxldCdzIGFzc3VtZSB0aGUgY29kZWMgYXMgYSBIRE1JL0RQICovCi1zdGF0aWMgYm9vbCBpc19saWtlbHlfaGRtaV9jb2RlYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQloZGFfbmlkX3QgbmlkID0gY29kZWMtPnN0YXJ0X25pZDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX25vZGVzOyBpKyssIG5pZCsrKSB7Ci0JCXVuc2lnbmVkIGludCB3Y2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgbmlkKTsKLQkJc3dpdGNoIChnZXRfd2NhcHNfdHlwZSh3Y2FwcykpIHsKLQkJY2FzZSBBQ19XSURfQVVEX0lOOgotCQkJcmV0dXJuIGZhbHNlOyAvKiBIRE1JIHBhcnNlciBzdXBwb3J0cyBvbmx5IEhETUkgb3V0ICovCi0JCWNhc2UgQUNfV0lEX0FVRF9PVVQ6Ci0JCQlpZiAoISh3Y2FwcyAmIEFDX1dDQVBfRElHSVRBTCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0jZWxzZQotLyogbm8gSERNSSBjb2RlYyBwYXJzZXIgc3VwcG9ydCAqLwotI2RlZmluZSBpc19saWtlbHlfaGRtaV9jb2RlYyhjb2RlYykJZmFsc2UKLSNlbmRpZiAvKiBDT05GSUdfU05EX0hEQV9DT0RFQ19IRE1JICovCi0KLS8qKgotICogc25kX2hkYV9jb2RlY19jb25maWd1cmUgLSAoUmUtKWNvbmZpZ3VyZSB0aGUgSEQtYXVkaW8gY29kZWMKLSAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYwotICoKLSAqIFN0YXJ0IHBhcnNpbmcgb2YgdGhlIGdpdmVuIGNvZGVjIHRyZWUgYW5kIChyZS0paW5pdGlhbGl6ZSB0aGUgd2hvbGUKLSAqIHBhdGNoIGluc3RhbmNlLgotICoKLSAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KLSAqLwotaW50IHNuZF9oZGFfY29kZWNfY29uZmlndXJlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWludCAoKnBhdGNoKShzdHJ1Y3QgaGRhX2NvZGVjICopID0gTlVMTDsKLQlpbnQgZXJyOwotCi0JY29kZWMtPnByZXNldCA9IGZpbmRfY29kZWNfcHJlc2V0KGNvZGVjKTsKLQlpZiAoIWNvZGVjLT52ZW5kb3JfbmFtZSB8fCAhY29kZWMtPmNoaXBfbmFtZSkgewotCQllcnIgPSBnZXRfY29kZWNfbmFtZShjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAoIWlzX2dlbmVyaWNfY29uZmlnKGNvZGVjKSAmJiBjb2RlYy0+cHJlc2V0KQotCQlwYXRjaCA9IGNvZGVjLT5wcmVzZXQtPnBhdGNoOwotCWlmICghcGF0Y2gpIHsKLQkJdW5sb2FkX3BhcnNlcihjb2RlYyk7IC8qIHRvIGJlIHN1cmUgKi8KLQkJaWYgKGlzX2xpa2VseV9oZG1pX2NvZGVjKGNvZGVjKSkgewotI2lmIElTX01PRFVMRShDT05GSUdfU05EX0hEQV9DT0RFQ19IRE1JKQotCQkJcGF0Y2ggPSBsb2FkX3BhcnNlcihjb2RlYywgc25kX2hkYV9wYXJzZV9oZG1pX2NvZGVjKTsKLSNlbGlmIElTX0JVSUxUSU4oQ09ORklHX1NORF9IREFfQ09ERUNfSERNSSkKLQkJCXBhdGNoID0gc25kX2hkYV9wYXJzZV9oZG1pX2NvZGVjOwotI2VuZGlmCi0JCX0KLQkJaWYgKCFwYXRjaCkgewotI2lmIElTX01PRFVMRShDT05GSUdfU05EX0hEQV9HRU5FUklDKQotCQkJcGF0Y2ggPSBsb2FkX3BhcnNlcihjb2RlYywgc25kX2hkYV9wYXJzZV9nZW5lcmljX2NvZGVjKTsKLSNlbGlmIElTX0JVSUxUSU4oQ09ORklHX1NORF9IREFfR0VORVJJQykKLQkJCXBhdGNoID0gc25kX2hkYV9wYXJzZV9nZW5lcmljX2NvZGVjOwotI2VuZGlmCi0JCX0KLQkJaWYgKCFwYXRjaCkgewotCQkJY29kZWNfZXJyKGNvZGVjLCAiTm8gY29kZWMgcGFyc2VyIGlzIGF2YWlsYWJsZVxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCX0KLQotCWVyciA9IHBhdGNoKGNvZGVjKTsKLQlpZiAoZXJyIDwgMCkgewotCQl1bmxvYWRfcGFyc2VyKGNvZGVjKTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAoY29kZWMtPnBhdGNoX29wcy51bnNvbF9ldmVudCkgewotCQllcnIgPSBpbml0X3Vuc29sX3F1ZXVlKGNvZGVjLT5idXMpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JLyogYXVkaW8gY29kZWMgc2hvdWxkIG92ZXJyaWRlIHRoZSBtaXhlciBuYW1lICovCi0JaWYgKGNvZGVjLT5hZmcgfHwgISpjb2RlYy0+YnVzLT5jYXJkLT5taXhlcm5hbWUpCi0JCXNucHJpbnRmKGNvZGVjLT5idXMtPmNhcmQtPm1peGVybmFtZSwKLQkJCSBzaXplb2YoY29kZWMtPmJ1cy0+Y2FyZC0+bWl4ZXJuYW1lKSwKLQkJCSAiJXMgJXMiLCBjb2RlYy0+dmVuZG9yX25hbWUsIGNvZGVjLT5jaGlwX25hbWUpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9jb2RlY19jb25maWd1cmUpOwotCiAvKiB1cGRhdGUgdGhlIHN0cmVhbS1pZCBpZiBjaGFuZ2VkICovCiBzdGF0aWMgdm9pZCB1cGRhdGVfcGNtX3N0cmVhbV9pZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkgc3RydWN0IGhkYV9jdnRfc2V0dXAgKnAsIGhkYV9uaWRfdCBuaWQsCkBAIC0xNzgyLDYgKzExOTgsOCBAQAogCWlmICghcCkKIAkJcmV0dXJuOwogCisJaWYgKGNvZGVjLT5wYXRjaF9vcHMuc3RyZWFtX3BtKQorCQljb2RlYy0+cGF0Y2hfb3BzLnN0cmVhbV9wbShjb2RlYywgbmlkLCB0cnVlKTsKIAlpZiAoY29kZWMtPnBjbV9mb3JtYXRfZmlyc3QpCiAJCXVwZGF0ZV9wY21fZm9ybWF0KGNvZGVjLCBwLCBuaWQsIGZvcm1hdCk7CiAJdXBkYXRlX3BjbV9zdHJlYW1faWQoY29kZWMsIHAsIG5pZCwgc3RyZWFtX3RhZywgY2hhbm5lbF9pZCk7CkBAIC0xNzkzLDcgKzEyMTEsNyBAQAogCiAJLyogbWFrZSBvdGhlciBpbmFjdGl2ZSBjdnRzIHdpdGggdGhlIHNhbWUgc3RyZWFtLXRhZyBkaXJ0eSAqLwogCXR5cGUgPSBnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNvZGVjLT5idXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2NvZGVjKGMsIGNvZGVjLT5idXMpIHsKIAkJZm9yIChpID0gMDsgaSA8IGMtPmN2dF9zZXR1cHMudXNlZDsgaSsrKSB7CiAJCQlwID0gc25kX2FycmF5X2VsZW0oJmMtPmN2dF9zZXR1cHMsIGkpOwogCQkJaWYgKCFwLT5hY3RpdmUgJiYgcC0+c3RyZWFtX3RhZyA9PSBzdHJlYW1fdGFnICYmCkBAIC0xODUwLDYgKzEyNjgsOCBAQAogKTsKIAltZW1zZXQocSwgMCwgc2l6ZW9mKCpxKSk7CiAJcS0+bmlkID0gbmlkOworCWlmIChjb2RlYy0+cGF0Y2hfb3BzLnN0cmVhbV9wbSkKKwkJY29kZWMtPnBhdGNoX29wcy5zdHJlYW1fcG0oY29kZWMsIG5pZCwgZmFsc2UpOwogfQogCiAvKiBjbGVhbiB1cCB0aGUgYWxsIGNvbmZsaWN0aW5nIG9ic29sZXRlIHN0cmVhbXMgKi8KQEAgLTE4NTgsNyArMTI3OCw3IEBACiAJc3RydWN0IGhkYV9jb2RlYyAqYzsKIAlpbnQgaTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNvZGVjLT5idXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2NvZGVjKGMsIGNvZGVjLT5idXMpIHsKIAkJZm9yIChpID0gMDsgaSA8IGMtPmN2dF9zZXR1cHMudXNlZDsgaSsrKSB7CiAJCQlzdHJ1Y3QgaGRhX2N2dF9zZXR1cCAqcDsKIAkJCXAgPSBzbmRfYXJyYXlfZWxlbSgmYy0+Y3Z0X3NldHVwcywgaSk7CkBAIC0xODg2LDEyNyArMTMwNiw2IEBACiAgKiBhbXAgYWNjZXNzIGZ1bmN0aW9ucwogICovCiAKLS8qIEZJWE1FOiBtb3JlIGJldHRlciBoYXNoIGtleT8gKi8KLSNkZWZpbmUgSERBX0hBU0hfS0VZKG5pZCwgZGlyLCBpZHgpICh1MzIpKChuaWQpICsgKChpZHgpIDw8IDE2KSArICgoZGlyKSA8PCAyNCkpCi0jZGVmaW5lIEhEQV9IQVNIX1BJTkNBUF9LRVkobmlkKSAodTMyKSgobmlkKSArICgweDAyIDw8IDI0KSkKLSNkZWZpbmUgSERBX0hBU0hfUEFSUENNX0tFWShuaWQpICh1MzIpKChuaWQpICsgKDB4MDMgPDwgMjQpKQotI2RlZmluZSBIREFfSEFTSF9QQVJTVFJfS0VZKG5pZCkgKHUzMikoKG5pZCkgKyAoMHgwNCA8PCAyNCkpCi0jZGVmaW5lIElORk9fQU1QX0NBUFMJKDE8PDApCi0jZGVmaW5lIElORk9fQU1QX1ZPTChjaCkJKDEgPDwgKDEgKyAoY2gpKSkKLQotLyogaW5pdGlhbGl6ZSB0aGUgaGFzaCB0YWJsZSAqLwotc3RhdGljIHZvaWQgaW5pdF9oZGFfY2FjaGUoc3RydWN0IGhkYV9jYWNoZV9yZWMgKmNhY2hlLAotCQkJCSAgICAgdW5zaWduZWQgaW50IHJlY29yZF9zaXplKQotewotCW1lbXNldChjYWNoZSwgMCwgc2l6ZW9mKCpjYWNoZSkpOwotCW1lbXNldChjYWNoZS0+aGFzaCwgMHhmZiwgc2l6ZW9mKGNhY2hlLT5oYXNoKSk7Ci0Jc25kX2FycmF5X2luaXQoJmNhY2hlLT5idWYsIHJlY29yZF9zaXplLCA2NCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfaGRhX2NhY2hlKHN0cnVjdCBoZGFfY2FjaGVfcmVjICpjYWNoZSkKLXsKLQlzbmRfYXJyYXlfZnJlZSgmY2FjaGUtPmJ1Zik7Ci19Ci0KLS8qIHF1ZXJ5IHRoZSBoYXNoLiAgYWxsb2NhdGUgYW4gZW50cnkgaWYgbm90IGZvdW5kLiAqLwotc3RhdGljIHN0cnVjdCBoZGFfY2FjaGVfaGVhZCAgKmdldF9oYXNoKHN0cnVjdCBoZGFfY2FjaGVfcmVjICpjYWNoZSwgdTMyIGtleSkKLXsKLQl1MTYgaWR4ID0ga2V5ICUgKHUxNilBUlJBWV9TSVpFKGNhY2hlLT5oYXNoKTsKLQl1MTYgY3VyID0gY2FjaGUtPmhhc2hbaWR4XTsKLQlzdHJ1Y3QgaGRhX2NhY2hlX2hlYWQgKmluZm87Ci0KLQl3aGlsZSAoY3VyICE9IDB4ZmZmZikgewotCQlpbmZvID0gc25kX2FycmF5X2VsZW0oJmNhY2hlLT5idWYsIGN1cik7Ci0JCWlmIChpbmZvLT5rZXkgPT0ga2V5KQotCQkJcmV0dXJuIGluZm87Ci0JCWN1ciA9IGluZm8tPm5leHQ7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi0vKiBxdWVyeSB0aGUgaGFzaC4gIGFsbG9jYXRlIGFuIGVudHJ5IGlmIG5vdCBmb3VuZC4gKi8KLXN0YXRpYyBzdHJ1Y3QgaGRhX2NhY2hlX2hlYWQgICpnZXRfYWxsb2NfaGFzaChzdHJ1Y3QgaGRhX2NhY2hlX3JlYyAqY2FjaGUsCi0JCQkJCSAgICAgIHUzMiBrZXkpCi17Ci0Jc3RydWN0IGhkYV9jYWNoZV9oZWFkICppbmZvID0gZ2V0X2hhc2goY2FjaGUsIGtleSk7Ci0JaWYgKCFpbmZvKSB7Ci0JCXUxNiBpZHgsIGN1cjsKLQkJLyogYWRkIGEgbmV3IGhhc2ggZW50cnkgKi8KLQkJaW5mbyA9IHNuZF9hcnJheV9uZXcoJmNhY2hlLT5idWYpOwotCQlpZiAoIWluZm8pCi0JCQlyZXR1cm4gTlVMTDsKLQkJY3VyID0gc25kX2FycmF5X2luZGV4KCZjYWNoZS0+YnVmLCBpbmZvKTsKLQkJaW5mby0+a2V5ID0ga2V5OwotCQlpbmZvLT52YWwgPSAwOwotCQlpbmZvLT5kaXJ0eSA9IDA7Ci0JCWlkeCA9IGtleSAlICh1MTYpQVJSQVlfU0laRShjYWNoZS0+aGFzaCk7Ci0JCWluZm8tPm5leHQgPSBjYWNoZS0+aGFzaFtpZHhdOwotCQljYWNoZS0+aGFzaFtpZHhdID0gY3VyOwotCX0KLQlyZXR1cm4gaW5mbzsKLX0KLQotLyogcXVlcnkgYW5kIGFsbG9jYXRlIGFuIGFtcCBoYXNoIGVudHJ5ICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBoZGFfYW1wX2luZm8gKgotZ2V0X2FsbG9jX2FtcF9oYXNoKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCB1MzIga2V5KQotewotCXJldHVybiAoc3RydWN0IGhkYV9hbXBfaW5mbyAqKWdldF9hbGxvY19oYXNoKCZjb2RlYy0+YW1wX2NhY2hlLCBrZXkpOwotfQotCi0vKiBvdmVyd3JpdGUgdGhlIHZhbHVlIHdpdGggdGhlIGtleSBpbiB0aGUgY2FwcyBoYXNoICovCi1zdGF0aWMgaW50IHdyaXRlX2NhcHNfaGFzaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgdTMyIGtleSwgdW5zaWduZWQgaW50IHZhbCkKLXsKLQlzdHJ1Y3QgaGRhX2FtcF9pbmZvICppbmZvOwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPmhhc2hfbXV0ZXgpOwotCWluZm8gPSBnZXRfYWxsb2NfYW1wX2hhc2goY29kZWMsIGtleSk7Ci0JaWYgKCFpbmZvKSB7Ci0JCW11dGV4X3VubG9jaygmY29kZWMtPmhhc2hfbXV0ZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaW5mby0+YW1wX2NhcHMgPSB2YWw7Ci0JaW5mby0+aGVhZC52YWwgfD0gSU5GT19BTVBfQ0FQUzsKLQltdXRleF91bmxvY2soJmNvZGVjLT5oYXNoX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotLyogcXVlcnkgdGhlIHZhbHVlIGZyb20gdGhlIGNhcHMgaGFzaDsgaWYgbm90IGZvdW5kLCBmZXRjaCB0aGUgY3VycmVudAotICogdmFsdWUgZnJvbSB0aGUgZ2l2ZW4gZnVuY3Rpb24gYW5kIHN0b3JlIGluIHRoZSBoYXNoCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQKLXF1ZXJ5X2NhcHNfaGFzaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpciwgdTMyIGtleSwKLQkJdW5zaWduZWQgaW50ICgqZnVuYykoc3RydWN0IGhkYV9jb2RlYyAqLCBoZGFfbmlkX3QsIGludCkpCi17Ci0Jc3RydWN0IGhkYV9hbXBfaW5mbyAqaW5mbzsKLQl1bnNpZ25lZCBpbnQgdmFsOwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPmhhc2hfbXV0ZXgpOwotCWluZm8gPSBnZXRfYWxsb2NfYW1wX2hhc2goY29kZWMsIGtleSk7Ci0JaWYgKCFpbmZvKSB7Ci0JCW11dGV4X3VubG9jaygmY29kZWMtPmhhc2hfbXV0ZXgpOwotCQlyZXR1cm4gMDsKLQl9Ci0JaWYgKCEoaW5mby0+aGVhZC52YWwgJiBJTkZPX0FNUF9DQVBTKSkgewotCQltdXRleF91bmxvY2soJmNvZGVjLT5oYXNoX211dGV4KTsgLyogZm9yIHJlZW50cmFuY2UgKi8KLQkJdmFsID0gZnVuYyhjb2RlYywgbmlkLCBkaXIpOwotCQl3cml0ZV9jYXBzX2hhc2goY29kZWMsIGtleSwgdmFsKTsKLQl9IGVsc2UgewotCQl2YWwgPSBpbmZvLT5hbXBfY2FwczsKLQkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+aGFzaF9tdXRleCk7Ci0JfQotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF9hbXBfY2FwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAotCQkJCSBpbnQgZGlyZWN0aW9uKQotewotCWlmICghKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmIEFDX1dDQVBfQU1QX09WUkQpKQotCQluaWQgPSBjb2RlYy0+YWZnOwotCXJldHVybiBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwKLQkJCQkgIGRpcmVjdGlvbiA9PSBIREFfT1VUUFVUID8KLQkJCQkgIEFDX1BBUl9BTVBfT1VUX0NBUCA6IEFDX1BBUl9BTVBfSU5fQ0FQKTsKLX0KLQogLyoqCiAgKiBxdWVyeV9hbXBfY2FwcyAtIHF1ZXJ5IEFNUCBjYXBhYmlsaXRpZXMKICAqIEBjb2RlYzogdGhlIEhELWF1aW8gY29kZWMKQEAgLTIwMjEsOSArMTMyMCwxMSBAQAogICovCiB1MzIgcXVlcnlfYW1wX2NhcHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBkaXJlY3Rpb24pCiB7Ci0JcmV0dXJuIHF1ZXJ5X2NhcHNfaGFzaChjb2RlYywgbmlkLCBkaXJlY3Rpb24sCi0JCQkgICAgICAgSERBX0hBU0hfS0VZKG5pZCwgZGlyZWN0aW9uLCAwKSwKLQkJCSAgICAgICByZWFkX2FtcF9jYXApOworCWlmICghKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmIEFDX1dDQVBfQU1QX09WUkQpKQorCQluaWQgPSBjb2RlYy0+Y29yZS5hZmc7CisJcmV0dXJuIHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLAorCQkJCSAgZGlyZWN0aW9uID09IEhEQV9PVVRQVVQgPworCQkJCSAgQUNfUEFSX0FNUF9PVVRfQ0FQIDogQUNfUEFSX0FNUF9JTl9DQVApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocXVlcnlfYW1wX2NhcHMpOwogCkBAIC0yMDY0LDE4NCArMTM2NSwxNSBAQAogaW50IHNuZF9oZGFfb3ZlcnJpZGVfYW1wX2NhcHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBkaXIsCiAJCQkgICAgICB1bnNpZ25lZCBpbnQgY2FwcykKIHsKLQlyZXR1cm4gd3JpdGVfY2Fwc19oYXNoKGNvZGVjLCBIREFfSEFTSF9LRVkobmlkLCBkaXIsIDApLCBjYXBzKTsKKwl1bnNpZ25lZCBpbnQgcGFybTsKKworCXNuZF9oZGFfb3ZlcnJpZGVfd2NhcHMoY29kZWMsIG5pZCwKKwkJCSAgICAgICBnZXRfd2NhcHMoY29kZWMsIG5pZCkgfCBBQ19XQ0FQX0FNUF9PVlJEKTsKKwlwYXJtID0gZGlyID09IEhEQV9PVVRQVVQgPyBBQ19QQVJfQU1QX09VVF9DQVAgOiBBQ19QQVJfQU1QX0lOX0NBUDsKKwlyZXR1cm4gc25kX2hkYWNfb3ZlcnJpZGVfcGFybSgmY29kZWMtPmNvcmUsIG5pZCwgcGFybSwgY2Fwcyk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX292ZXJyaWRlX2FtcF9jYXBzKTsKIAotc3RhdGljIHVuc2lnbmVkIGludCByZWFkX3Bpbl9jYXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkJIGludCBkaXIpCi17Ci0JcmV0dXJuIHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfUElOX0NBUCk7Ci19Ci0KLS8qKgotICogc25kX2hkYV9xdWVyeV9waW5fY2FwcyAtIFF1ZXJ5IFBJTiBjYXBhYmlsaXRpZXMKLSAqIEBjb2RlYzogdGhlIEhELWF1aW8gY29kZWMKLSAqIEBuaWQ6IHRoZSBOSUQgdG8gcXVlcnkKLSAqCi0gKiBRdWVyeSBQSU4gY2FwYWJpbGl0aWVzIGZvciB0aGUgZ2l2ZW4gd2lkZ2V0LgotICogUmV0dXJucyB0aGUgb2J0YWluZWQgY2FwYWJpbGl0eSBiaXRzLgotICoKLSAqIFdoZW4gY2FwIGJpdHMgaGF2ZSBiZWVuIGFscmVhZHkgcmVhZCwgdGhpcyBkb2Vzbid0IHJlYWQgYWdhaW4gYnV0Ci0gKiByZXR1cm5zIHRoZSBjYWNoZWQgdmFsdWUuCi0gKi8KLXUzMiBzbmRfaGRhX3F1ZXJ5X3Bpbl9jYXBzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQotewotCXJldHVybiBxdWVyeV9jYXBzX2hhc2goY29kZWMsIG5pZCwgMCwgSERBX0hBU0hfUElOQ0FQX0tFWShuaWQpLAotCQkJICAgICAgIHJlYWRfcGluX2NhcCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX3F1ZXJ5X3Bpbl9jYXBzKTsKLQotLyoqCi0gKiBzbmRfaGRhX292ZXJyaWRlX3Bpbl9jYXBzIC0gT3ZlcnJpZGUgdGhlIHBpbiBjYXBhYmlsaXRpZXMKLSAqIEBjb2RlYzogdGhlIENPREVDCi0gKiBAbmlkOiB0aGUgTklEIHRvIG92ZXJyaWRlCi0gKiBAY2FwczogdGhlIGNhcGFiaWxpdHkgYml0cyB0byBzZXQKLSAqCi0gKiBPdmVycmlkZSB0aGUgY2FjaGVkIFBJTiBjYXBhYmlsaXRpeSBiaXRzIHZhbHVlIGJ5IHRoZSBnaXZlbiBvbmUuCi0gKgotICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgotICovCi1pbnQgc25kX2hkYV9vdmVycmlkZV9waW5fY2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBjYXBzKQotewotCXJldHVybiB3cml0ZV9jYXBzX2hhc2goY29kZWMsIEhEQV9IQVNIX1BJTkNBUF9LRVkobmlkKSwgY2Fwcyk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX292ZXJyaWRlX3Bpbl9jYXBzKTsKLQotLyogcmVhZCBvciBzeW5jIHRoZSBoYXNoIHZhbHVlIHdpdGggdGhlIGN1cnJlbnQgdmFsdWU7Ci0gKiBjYWxsIHdpdGhpbiBoYXNoX211dGV4Ci0gKi8KLXN0YXRpYyBzdHJ1Y3QgaGRhX2FtcF9pbmZvICoKLXVwZGF0ZV9hbXBfaGFzaChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGNoLAotCQlpbnQgZGlyZWN0aW9uLCBpbnQgaW5kZXgsIGJvb2wgaW5pdF9vbmx5KQotewotCXN0cnVjdCBoZGFfYW1wX2luZm8gKmluZm87Ci0JdW5zaWduZWQgaW50IHBhcm0sIHZhbCA9IDA7Ci0JYm9vbCB2YWxfcmVhZCA9IGZhbHNlOwotCi0gcmV0cnk6Ci0JaW5mbyA9IGdldF9hbGxvY19hbXBfaGFzaChjb2RlYywgSERBX0hBU0hfS0VZKG5pZCwgZGlyZWN0aW9uLCBpbmRleCkpOwotCWlmICghaW5mbykKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCEoaW5mby0+aGVhZC52YWwgJiBJTkZPX0FNUF9WT0woY2gpKSkgewotCQlpZiAoIXZhbF9yZWFkKSB7Ci0JCQltdXRleF91bmxvY2soJmNvZGVjLT5oYXNoX211dGV4KTsKLQkJCXBhcm0gPSBjaCA/IEFDX0FNUF9HRVRfUklHSFQgOiBBQ19BTVBfR0VUX0xFRlQ7Ci0JCQlwYXJtIHw9IGRpcmVjdGlvbiA9PSBIREFfT1VUUFVUID8KLQkJCQlBQ19BTVBfR0VUX09VVFBVVCA6IEFDX0FNUF9HRVRfSU5QVVQ7Ci0JCQlwYXJtIHw9IGluZGV4OwotCQkJdmFsID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCi0JCQkJIEFDX1ZFUkJfR0VUX0FNUF9HQUlOX01VVEUsIHBhcm0pOwotCQkJdmFsICY9IDB4ZmY7Ci0JCQl2YWxfcmVhZCA9IHRydWU7Ci0JCQltdXRleF9sb2NrKCZjb2RlYy0+aGFzaF9tdXRleCk7Ci0JCQlnb3RvIHJldHJ5OwotCQl9Ci0JCWluZm8tPnZvbFtjaF0gPSB2YWw7Ci0JCWluZm8tPmhlYWQudmFsIHw9IElORk9fQU1QX1ZPTChjaCk7Ci0JfSBlbHNlIGlmIChpbml0X29ubHkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiBpbmZvOwotfQotCi0vKgotICogd3JpdGUgdGhlIGN1cnJlbnQgdm9sdW1lIGluIGluZm8gdG8gdGhlIGgvdwotICovCi1zdGF0aWMgdm9pZCBwdXRfdm9sX211dGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCBhbXBfY2FwcywKLQkJCSBoZGFfbmlkX3QgbmlkLCBpbnQgY2gsIGludCBkaXJlY3Rpb24sIGludCBpbmRleCwKLQkJCSBpbnQgdmFsKQotewotCXUzMiBwYXJtOwotCi0JcGFybSA9IGNoID8gQUNfQU1QX1NFVF9SSUdIVCA6IEFDX0FNUF9TRVRfTEVGVDsKLQlwYXJtIHw9IGRpcmVjdGlvbiA9PSBIREFfT1VUUFVUID8gQUNfQU1QX1NFVF9PVVRQVVQgOiBBQ19BTVBfU0VUX0lOUFVUOwotCXBhcm0gfD0gaW5kZXggPDwgQUNfQU1QX1NFVF9JTkRFWF9TSElGVDsKLQlpZiAoKHZhbCAmIEhEQV9BTVBfTVVURSkgJiYgIShhbXBfY2FwcyAmIEFDX0FNUENBUF9NVVRFKSAmJgotCSAgICAoYW1wX2NhcHMgJiBBQ19BTVBDQVBfTUlOX01VVEUpKQotCQk7IC8qIHNldCB0aGUgemVybyB2YWx1ZSBhcyBhIGZha2UgbXV0ZSAqLwotCWVsc2UKLQkJcGFybSB8PSB2YWw7Ci0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBwYXJtKTsKLX0KLQotLyoqCi0gKiBzbmRfaGRhX2NvZGVjX2FtcF9yZWFkIC0gUmVhZCBBTVAgdmFsdWUKLSAqIEBjb2RlYzogSEQtYXVkaW8gY29kZWMKLSAqIEBuaWQ6IE5JRCB0byByZWFkIHRoZSBBTVAgdmFsdWUKLSAqIEBjaDogY2hhbm5lbCAobGVmdD0wIG9yIHJpZ2h0PTEpCi0gKiBAZGlyZWN0aW9uOiAjSERBX0lOUFVUIG9yICNIREFfT1VUUFVUCi0gKiBAaW5kZXg6IHRoZSBpbmRleCB2YWx1ZSAob25seSBmb3IgaW5wdXQgZGlyZWN0aW9uKQotICoKLSAqIFJlYWQgQU1QIHZhbHVlLiAgVGhlIHZvbHVtZSBpcyBiZXR3ZWVuIDAgdG8gMHg3ZiwgMHg4MCA9IG11dGUgYml0LgotICovCi1pbnQgc25kX2hkYV9jb2RlY19hbXBfcmVhZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGNoLAotCQkJICAgaW50IGRpcmVjdGlvbiwgaW50IGluZGV4KQotewotCXN0cnVjdCBoZGFfYW1wX2luZm8gKmluZm87Ci0JdW5zaWduZWQgaW50IHZhbCA9IDA7Ci0KLQltdXRleF9sb2NrKCZjb2RlYy0+aGFzaF9tdXRleCk7Ci0JaW5mbyA9IHVwZGF0ZV9hbXBfaGFzaChjb2RlYywgbmlkLCBjaCwgZGlyZWN0aW9uLCBpbmRleCwgZmFsc2UpOwotCWlmIChpbmZvKQotCQl2YWwgPSBpbmZvLT52b2xbY2hdOwotCW11dGV4X3VubG9jaygmY29kZWMtPmhhc2hfbXV0ZXgpOwotCXJldHVybiB2YWw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2NvZGVjX2FtcF9yZWFkKTsKLQotc3RhdGljIGludCBjb2RlY19hbXBfdXBkYXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBpbnQgY2gsCi0JCQkgICAgaW50IGRpcmVjdGlvbiwgaW50IGlkeCwgaW50IG1hc2ssIGludCB2YWwsCi0JCQkgICAgYm9vbCBpbml0X29ubHkpCi17Ci0Jc3RydWN0IGhkYV9hbXBfaW5mbyAqaW5mbzsKLQl1bnNpZ25lZCBpbnQgY2FwczsKLQl1bnNpZ25lZCBpbnQgY2FjaGVfb25seTsKLQotCWlmIChzbmRfQlVHX09OKG1hc2sgJiB+MHhmZikpCi0JCW1hc2sgJj0gMHhmZjsKLQl2YWwgJj0gbWFzazsKLQotCW11dGV4X2xvY2soJmNvZGVjLT5oYXNoX211dGV4KTsKLQlpbmZvID0gdXBkYXRlX2FtcF9oYXNoKGNvZGVjLCBuaWQsIGNoLCBkaXJlY3Rpb24sIGlkeCwgaW5pdF9vbmx5KTsKLQlpZiAoIWluZm8pIHsKLQkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+aGFzaF9tdXRleCk7Ci0JCXJldHVybiAwOwotCX0KLQl2YWwgfD0gaW5mby0+dm9sW2NoXSAmIH5tYXNrOwotCWlmIChpbmZvLT52b2xbY2hdID09IHZhbCkgewotCQltdXRleF91bmxvY2soJmNvZGVjLT5oYXNoX211dGV4KTsKLQkJcmV0dXJuIDA7Ci0JfQotCWluZm8tPnZvbFtjaF0gPSB2YWw7Ci0JY2FjaGVfb25seSA9IGluZm8tPmhlYWQuZGlydHkgPSBjb2RlYy0+Y2FjaGVkX3dyaXRlOwotCWNhcHMgPSBpbmZvLT5hbXBfY2FwczsKLQltdXRleF91bmxvY2soJmNvZGVjLT5oYXNoX211dGV4KTsKLQlpZiAoIWNhY2hlX29ubHkpCi0JCXB1dF92b2xfbXV0ZShjb2RlYywgY2FwcywgbmlkLCBjaCwgZGlyZWN0aW9uLCBpZHgsIHZhbCk7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlIC0gdXBkYXRlIHRoZSBBTVAgdmFsdWUKLSAqIEBjb2RlYzogSEQtYXVkaW8gY29kZWMKLSAqIEBuaWQ6IE5JRCB0byByZWFkIHRoZSBBTVAgdmFsdWUKLSAqIEBjaDogY2hhbm5lbCAobGVmdD0wIG9yIHJpZ2h0PTEpCi0gKiBAZGlyZWN0aW9uOiAjSERBX0lOUFVUIG9yICNIREFfT1VUUFVUCi0gKiBAaWR4OiB0aGUgaW5kZXggdmFsdWUgKG9ubHkgZm9yIGlucHV0IGRpcmVjdGlvbikKLSAqIEBtYXNrOiBiaXQgbWFzayB0byBzZXQKLSAqIEB2YWw6IHRoZSBiaXRzIHZhbHVlIHRvIHNldAotICoKLSAqIFVwZGF0ZSB0aGUgQU1QIHZhbHVlIHdpdGggYSBiaXQgbWFzay4KLSAqIFJldHVybnMgMCBpZiB0aGUgdmFsdWUgaXMgdW5jaGFuZ2VkLCAxIGlmIGNoYW5nZWQuCi0gKi8KLWludCBzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBjaCwKLQkJCSAgICAgaW50IGRpcmVjdGlvbiwgaW50IGlkeCwgaW50IG1hc2ssIGludCB2YWwpCi17Ci0JcmV0dXJuIGNvZGVjX2FtcF91cGRhdGUoY29kZWMsIG5pZCwgY2gsIGRpcmVjdGlvbiwgaWR4LCBtYXNrLCB2YWwsIGZhbHNlKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZSk7Ci0KIC8qKgogICogc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvIC0gdXBkYXRlIHRoZSBBTVAgc3RlcmVvIHZhbHVlcwogICogQGNvZGVjOiBIRC1hdWRpbyBjb2RlYwpAQCAtMjI4NSw3ICsxNDE3LDE2IEBACiBpbnQgc25kX2hkYV9jb2RlY19hbXBfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGNoLAogCQkJICAgaW50IGRpciwgaW50IGlkeCwgaW50IG1hc2ssIGludCB2YWwpCiB7Ci0JcmV0dXJuIGNvZGVjX2FtcF91cGRhdGUoY29kZWMsIG5pZCwgY2gsIGRpciwgaWR4LCBtYXNrLCB2YWwsIHRydWUpOworCWludCBvcmlnOworCisJaWYgKCFjb2RlYy0+Y29yZS5yZWdtYXApCisJCXJldHVybiAtRUlOVkFMOworCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvcmUucmVnbWFwLCB0cnVlKTsKKwlvcmlnID0gc25kX2hkYV9jb2RlY19hbXBfcmVhZChjb2RlYywgbmlkLCBjaCwgZGlyLCBpZHgpOworCXJlZ2NhY2hlX2NhY2hlX29ubHkoY29kZWMtPmNvcmUucmVnbWFwLCBmYWxzZSk7CisJaWYgKG9yaWcgPj0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHNuZF9oZGFfY29kZWNfYW1wX3VwZGF0ZShjb2RlYywgbmlkLCBjaCwgZGlyLCBpZHgsIG1hc2ssIHZhbCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2NvZGVjX2FtcF9pbml0KTsKIApAQCAtMjMxNCw0OSArMTQ1NSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2NvZGVjX2FtcF9pbml0X3N0ZXJlbyk7CiAKLS8qKgotICogc25kX2hkYV9jb2RlY19yZXN1bWVfYW1wIC0gUmVzdW1lIGFsbCBBTVAgY29tbWFuZHMgZnJvbSB0aGUgY2FjaGUKLSAqIEBjb2RlYzogSEQtYXVkaW8gY29kZWMKLSAqCi0gKiBSZXN1bWUgdGhlIGFsbCBhbXAgY29tbWFuZHMgZnJvbSB0aGUgY2FjaGUuCi0gKi8KLXZvaWQgc25kX2hkYV9jb2RlY19yZXN1bWVfYW1wKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWludCBpOwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPmhhc2hfbXV0ZXgpOwotCWNvZGVjLT5jYWNoZWRfd3JpdGUgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+YW1wX2NhY2hlLmJ1Zi51c2VkOyBpKyspIHsKLQkJc3RydWN0IGhkYV9hbXBfaW5mbyAqYnVmZmVyOwotCQl1MzIga2V5OwotCQloZGFfbmlkX3QgbmlkOwotCQl1bnNpZ25lZCBpbnQgaWR4LCBkaXIsIGNoOwotCQlzdHJ1Y3QgaGRhX2FtcF9pbmZvIGluZm87Ci0KLQkJYnVmZmVyID0gc25kX2FycmF5X2VsZW0oJmNvZGVjLT5hbXBfY2FjaGUuYnVmLCBpKTsKLQkJaWYgKCFidWZmZXItPmhlYWQuZGlydHkpCi0JCQljb250aW51ZTsKLQkJYnVmZmVyLT5oZWFkLmRpcnR5ID0gMDsKLQkJaW5mbyA9ICpidWZmZXI7Ci0JCWtleSA9IGluZm8uaGVhZC5rZXk7Ci0JCWlmICgha2V5KQotCQkJY29udGludWU7Ci0JCW5pZCA9IGtleSAmIDB4ZmY7Ci0JCWlkeCA9IChrZXkgPj4gMTYpICYgMHhmZjsKLQkJZGlyID0gKGtleSA+PiAyNCkgJiAweGZmOwotCQlmb3IgKGNoID0gMDsgY2ggPCAyOyBjaCsrKSB7Ci0JCQlpZiAoIShpbmZvLmhlYWQudmFsICYgSU5GT19BTVBfVk9MKGNoKSkpCi0JCQkJY29udGludWU7Ci0JCQltdXRleF91bmxvY2soJmNvZGVjLT5oYXNoX211dGV4KTsKLQkJCXB1dF92b2xfbXV0ZShjb2RlYywgaW5mby5hbXBfY2FwcywgbmlkLCBjaCwgZGlyLCBpZHgsCi0JCQkJICAgICBpbmZvLnZvbFtjaF0pOwotCQkJbXV0ZXhfbG9jaygmY29kZWMtPmhhc2hfbXV0ZXgpOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmY29kZWMtPmhhc2hfbXV0ZXgpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9jb2RlY19yZXN1bWVfYW1wKTsKLQogc3RhdGljIHUzMiBnZXRfYW1wX21heF92YWx1ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpciwKIAkJCSAgICAgdW5zaWduZWQgaW50IG9mcykKIHsKQEAgLTI0NzgsMTQgKzE1NzYsMTIgQEAKIAlsb25nICp2YWxwID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWU7CiAJaW50IGNoYW5nZSA9IDA7CiAKLQlzbmRfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKIAlpZiAoY2hzICYgMSkgewogCQljaGFuZ2UgPSB1cGRhdGVfYW1wX3ZhbHVlKGNvZGVjLCBuaWQsIDAsIGRpciwgaWR4LCBvZnMsICp2YWxwKTsKIAkJdmFscCsrOwogCX0KIAlpZiAoY2hzICYgMikKIAkJY2hhbmdlIHw9IHVwZGF0ZV9hbXBfdmFsdWUoY29kZWMsIG5pZCwgMSwgZGlyLCBpZHgsIG9mcywgKnZhbHApOwotCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7CiAJcmV0dXJuIGNoYW5nZTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfbWl4ZXJfYW1wX3ZvbHVtZV9wdXQpOwpAQCAtMjU3Miw3ICsxNjY4LDcgQEAKIAlpZiAoc25kX0JVR19PTihzdHJsZW4obmFtZSkgPj0gc2l6ZW9mKGlkLm5hbWUpKSkKIAkJcmV0dXJuIE5VTEw7CiAJc3RyY3B5KGlkLm5hbWUsIG5hbWUpOwotCXJldHVybiBzbmRfY3RsX2ZpbmRfaWQoY29kZWMtPmJ1cy0+Y2FyZCwgJmlkKTsKKwlyZXR1cm4gc25kX2N0bF9maW5kX2lkKGNvZGVjLT5jYXJkLCAmaWQpOwogfQogCiAvKioKQEAgLTI2MzYsNyArMTczMiw3IEBACiAJCW5pZCA9IGtjdGwtPmlkLnN1YmRldmljZSAmIDB4ZmZmZjsKIAlpZiAoa2N0bC0+aWQuc3ViZGV2aWNlICYgKEhEQV9TVUJERVZfTklEX0ZMQUd8SERBX1NVQkRFVl9BTVBfRkxBRykpCiAJCWtjdGwtPmlkLnN1YmRldmljZSA9IDA7Ci0JZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmJ1cy0+Y2FyZCwga2N0bCk7CisJZXJyID0gc25kX2N0bF9hZGQoY29kZWMtPmNhcmQsIGtjdGwpOwogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWl0ZW0gPSBzbmRfYXJyYXlfbmV3KCZjb2RlYy0+bWl4ZXJzKTsKQEAgLTI2ODksNyArMTc4NSw3IEBACiAJaW50IGk7CiAJc3RydWN0IGhkYV9uaWRfaXRlbSAqaXRlbXMgPSBjb2RlYy0+bWl4ZXJzLmxpc3Q7CiAJZm9yIChpID0gMDsgaSA8IGNvZGVjLT5taXhlcnMudXNlZDsgaSsrKQotCQlzbmRfY3RsX3JlbW92ZShjb2RlYy0+YnVzLT5jYXJkLCBpdGVtc1tpXS5rY3RsKTsKKwkJc25kX2N0bF9yZW1vdmUoY29kZWMtPmNhcmQsIGl0ZW1zW2ldLmtjdGwpOwogCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+bWl4ZXJzKTsKIAlzbmRfYXJyYXlfZnJlZSgmY29kZWMtPm5pZHMpOwogfQpAQCAtMjcxMiwxMCArMTgwOCw5IEBACiAJaWYgKCFsaXN0X2VtcHR5KCZjYXJkLT5jdGxfZmlsZXMpKQogCQlnb3RvIGVycl9jbGVhcjsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZidXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKLQkJaW50IHBjbTsKLQkJZm9yIChwY20gPSAwOyBwY20gPCBjb2RlYy0+bnVtX3BjbXM7IHBjbSsrKSB7Ci0JCQlzdHJ1Y3QgaGRhX3BjbSAqY3BjbSA9ICZjb2RlYy0+cGNtX2luZm9bcGNtXTsKKwlsaXN0X2Zvcl9lYWNoX2NvZGVjKGNvZGVjLCBidXMpIHsKKwkJc3RydWN0IGhkYV9wY20gKmNwY207CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3BjbSwgJmNvZGVjLT5wY21fbGlzdF9oZWFkLCBsaXN0KSB7CiAJCQlpZiAoIWNwY20tPnBjbSkKIAkJCQljb250aW51ZTsKIAkJCWlmIChjcGNtLT5wY20tPnN0cmVhbXNbMF0uc3Vic3RyZWFtX29wZW5lZCB8fApAQCAtMjc0Miw3ICsxODM3LDYgQEAKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBidXMtPmNhcmQ7CiAKLQljYXJkID0gYnVzLT5jYXJkOwogCXNwaW5fbG9jaygmY2FyZC0+ZmlsZXNfbG9jayk7CiAJY2FyZC0+c2h1dGRvd24gPSAwOwogCXNwaW5fdW5sb2NrKCZjYXJkLT5maWxlc19sb2NrKTsKQEAgLTI3NjIsNTEgKzE4NTYsMTIgQEAKIGludCBzbmRfaGRhX2NvZGVjX3Jlc2V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBoZGFfYnVzICpidXMgPSBjb2RlYy0+YnVzOwotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGJ1cy0+Y2FyZDsKLQlpbnQgaTsKIAogCWlmIChzbmRfaGRhX2xvY2tfZGV2aWNlcyhidXMpIDwgMCkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCS8qIE9LLCBsZXQgaXQgZnJlZSAqLwotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29kZWMtPmphY2twb2xsX3dvcmspOwotI2lmZGVmIENPTkZJR19QTQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29kZWMtPnBvd2VyX3dvcmspOwotCWZsdXNoX3dvcmtxdWV1ZShidXMtPndvcmtxKTsKLSNlbmRpZgotCXNuZF9oZGFfY3Rsc19jbGVhcihjb2RlYyk7Ci0JLyogcmVsZWFzZSBQQ01zICovCi0JZm9yIChpID0gMDsgaSA8IGNvZGVjLT5udW1fcGNtczsgaSsrKSB7Ci0JCWlmIChjb2RlYy0+cGNtX2luZm9baV0ucGNtKSB7Ci0JCQlzbmRfZGV2aWNlX2ZyZWUoY2FyZCwgY29kZWMtPnBjbV9pbmZvW2ldLnBjbSk7Ci0JCQljbGVhcl9iaXQoY29kZWMtPnBjbV9pbmZvW2ldLmRldmljZSwKLQkJCQkgIGJ1cy0+cGNtX2Rldl9iaXRzKTsKLQkJfQotCX0KLQlzbmRfaGRhX2RldGFjaF9iZWVwX2RldmljZShjb2RlYyk7Ci0JaWYgKGNvZGVjLT5wYXRjaF9vcHMuZnJlZSkKLQkJY29kZWMtPnBhdGNoX29wcy5mcmVlKGNvZGVjKTsKLQltZW1zZXQoJmNvZGVjLT5wYXRjaF9vcHMsIDAsIHNpemVvZihjb2RlYy0+cGF0Y2hfb3BzKSk7Ci0Jc25kX2hkYV9qYWNrX3RibF9jbGVhcihjb2RlYyk7Ci0JY29kZWMtPnByb2Nfd2lkZ2V0X2hvb2sgPSBOVUxMOwotCWNvZGVjLT5zcGVjID0gTlVMTDsKLQlmcmVlX2hkYV9jYWNoZSgmY29kZWMtPmFtcF9jYWNoZSk7Ci0JZnJlZV9oZGFfY2FjaGUoJmNvZGVjLT5jbWRfY2FjaGUpOwotCWluaXRfaGRhX2NhY2hlKCZjb2RlYy0+YW1wX2NhY2hlLCBzaXplb2Yoc3RydWN0IGhkYV9hbXBfaW5mbykpOwotCWluaXRfaGRhX2NhY2hlKCZjb2RlYy0+Y21kX2NhY2hlLCBzaXplb2Yoc3RydWN0IGhkYV9jYWNoZV9oZWFkKSk7Ci0JLyogZnJlZSBvbmx5IGRyaXZlcl9waW5zIHNvIHRoYXQgaW5pdF9waW5zICsgdXNlcl9waW5zIGFyZSByZXN0b3JlZCAqLwotCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+ZHJpdmVyX3BpbnMpOwotCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+Y3Z0X3NldHVwcyk7Ci0Jc25kX2FycmF5X2ZyZWUoJmNvZGVjLT5zcGRpZl9vdXQpOwotCXNuZF9hcnJheV9mcmVlKCZjb2RlYy0+dmVyYnMpOwotCWNvZGVjLT5udW1fcGNtcyA9IDA7Ci0JY29kZWMtPnBjbV9pbmZvID0gTlVMTDsKLQljb2RlYy0+cHJlc2V0ID0gTlVMTDsKLQljb2RlYy0+c2xhdmVfZGlnX291dHMgPSBOVUxMOwotCWNvZGVjLT5zcGRpZl9zdGF0dXNfcmVzZXQgPSAwOwotCXVubG9hZF9wYXJzZXIoY29kZWMpOwotCW1vZHVsZV9wdXQoY29kZWMtPm93bmVyKTsKLQljb2RlYy0+b3duZXIgPSBOVUxMOworCXNuZF9oZGFjX2RldmljZV91bnJlZ2lzdGVyKCZjb2RlYy0+Y29yZSk7CiAKIAkvKiBhbGxvdyBkZXZpY2UgYWNjZXNzIGFnYWluICovCiAJc25kX2hkYV91bmxvY2tfZGV2aWNlcyhidXMpOwpAQCAtMzE1Myw3ICsyMjA4LDYgQEAKIAlsb25nICp2YWxwID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWU7CiAJaW50IGNoYW5nZSA9IDA7CiAKLQlzbmRfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKIAlpZiAoY2hzICYgMSkgewogCQljaGFuZ2UgPSBzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoY29kZWMsIG5pZCwgMCwgZGlyLCBpZHgsCiAJCQkJCQkgIEhEQV9BTVBfTVVURSwKQEAgLTMxNjUsNyArMjIxOSw2IEBACiAJCQkJCQkgICBIREFfQU1QX01VVEUsCiAJCQkJCQkgICAqdmFscCA/IDAgOiBIREFfQU1QX01VVEUpOwogCWhkYV9jYWxsX2NoZWNrX3Bvd2VyX3N0YXR1cyhjb2RlYywgbmlkKTsKLQlzbmRfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOwogCXJldHVybiBjaGFuZ2U7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX21peGVyX2FtcF9zd2l0Y2hfcHV0KTsKQEAgLTM0NjYsMjUgKzI1MTksMzUgQEAKIAogLyogc2V0IGRpZ2l0YWwgY29udmVydCB2ZXJicyBib3RoIGZvciB0aGUgZ2l2ZW4gTklEIGFuZCBpdHMgc2xhdmVzICovCiBzdGF0aWMgdm9pZCBzZXRfZGlnX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKLQkJCWludCB2ZXJiLCBpbnQgdmFsKQorCQkJaW50IG1hc2ssIGludCB2YWwpCiB7CiAJY29uc3QgaGRhX25pZF90ICpkOwogCi0Jc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLCB2ZXJiLCB2YWwpOworCXNuZF9oZGFjX3JlZ21hcF91cGRhdGUoJmNvZGVjLT5jb3JlLCBuaWQsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLAorCQkJICAgICAgIG1hc2ssIHZhbCk7CiAJZCA9IGNvZGVjLT5zbGF2ZV9kaWdfb3V0czsKIAlpZiAoIWQpCiAJCXJldHVybjsKIAlmb3IgKDsgKmQ7IGQrKykKLQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgKmQsIDAsIHZlcmIsIHZhbCk7CisJCXNuZF9oZGFjX3JlZ21hcF91cGRhdGUoJmNvZGVjLT5jb3JlLCBuaWQsCisJCQkJICAgICAgIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCBtYXNrLCB2YWwpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2RpZ19vdXRfY29udmVydChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKIAkJCQkgICAgICAgaW50IGRpZzEsIGludCBkaWcyKQogewotCWlmIChkaWcxICE9IC0xKQotCQlzZXRfZGlnX291dChjb2RlYywgbmlkLCBBQ19WRVJCX1NFVF9ESUdJX0NPTlZFUlRfMSwgZGlnMSk7Ci0JaWYgKGRpZzIgIT0gLTEpCi0JCXNldF9kaWdfb3V0KGNvZGVjLCBuaWQsIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8yLCBkaWcyKTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJdW5zaWduZWQgaW50IHZhbCA9IDA7CisKKwlpZiAoZGlnMSAhPSAtMSkgeworCQltYXNrIHw9IDB4ZmY7CisJCXZhbCA9IGRpZzE7CisJfQorCWlmIChkaWcyICE9IC0xKSB7CisJCW1hc2sgfD0gMHhmZjAwOworCQl2YWwgfD0gZGlnMiA8PCA4OworCX0KKwlzZXRfZGlnX291dChjb2RlYywgbmlkLCBtYXNrLCB2YWwpOwogfQogCiBzdGF0aWMgaW50IHNuZF9oZGFfc3BkaWZfZGVmYXVsdF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCkBAIC0zNjE3LDYgKzI2ODAsNyBAQAogCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CiAJc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmRpZ19taXg7CiAJaW50IGlkeCA9IDA7CisJaW50IHZhbCA9IDA7CiAJY29uc3QgaW50IHNwZGlmX2luZGV4ID0gMTY7CiAJc3RydWN0IGhkYV9zcGRpZl9vdXQgKnNwZGlmOwogCXN0cnVjdCBoZGFfYnVzICpidXMgPSBjb2RlYy0+YnVzOwpAQCAtMzY1Nyw4ICsyNzIxLDkgQEAKIAkJCXJldHVybiBlcnI7CiAJfQogCXNwZGlmLT5uaWQgPSBjdnRfbmlkOwotCXNwZGlmLT5jdGxzID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjdnRfbmlkLCAwLAotCQkJCQkgQUNfVkVSQl9HRVRfRElHSV9DT05WRVJUXzEsIDApOworCXNuZF9oZGFjX3JlZ21hcF9yZWFkKCZjb2RlYy0+Y29yZSwgY3Z0X25pZCwKKwkJCSAgICAgQUNfVkVSQl9HRVRfRElHSV9DT05WRVJUXzEsICZ2YWwpOworCXNwZGlmLT5jdGxzID0gdmFsOwogCXNwZGlmLT5zdGF0dXMgPSBjb252ZXJ0X3RvX3NwZGlmX3N0YXR1cyhzcGRpZi0+Y3Rscyk7CiAJcmV0dXJuIDA7CiB9CkBAIC0zODAyLDggKzI4NjcsOCBAQAogCWNoYW5nZSA9IGNvZGVjLT5zcGRpZl9pbl9lbmFibGUgIT0gdmFsOwogCWlmIChjaGFuZ2UpIHsKIAkJY29kZWMtPnNwZGlmX2luX2VuYWJsZSA9IHZhbDsKLQkJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCAwLAotCQkJCQkgIEFDX1ZFUkJfU0VUX0RJR0lfQ09OVkVSVF8xLCB2YWwpOworCQlzbmRfaGRhY19yZWdtYXBfd3JpdGUoJmNvZGVjLT5jb3JlLCBuaWQsCisJCQkJICAgICAgQUNfVkVSQl9TRVRfRElHSV9DT05WRVJUXzEsIHZhbCk7CiAJfQogCW11dGV4X3VubG9jaygmY29kZWMtPnNwZGlmX211dGV4KTsKIAlyZXR1cm4gY2hhbmdlOwpAQCAtMzgxNCwxMCArMjg3OSwxMSBAQAogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCWhkYV9uaWRfdCBuaWQgPSBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKLQl1bnNpZ25lZCBzaG9ydCB2YWw7CisJdW5zaWduZWQgaW50IHZhbDsKIAl1bnNpZ25lZCBpbnQgc2JpdHM7CiAKLQl2YWwgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9HRVRfRElHSV9DT05WRVJUXzEsIDApOworCXNuZF9oZGFjX3JlZ21hcF9yZWFkKCZjb2RlYy0+Y29yZSwgbmlkLAorCQkJICAgICBBQ19WRVJCX0dFVF9ESUdJX0NPTlZFUlRfMSwgJnZhbCk7CiAJc2JpdHMgPSBjb252ZXJ0X3RvX3NwZGlmX3N0YXR1cyh2YWwpOwogCXVjb250cm9sLT52YWx1ZS5pZWM5NTguc3RhdHVzWzBdID0gc2JpdHM7CiAJdWNvbnRyb2wtPnZhbHVlLmllYzk1OC5zdGF0dXNbMV0gPSBzYml0cyA+PiA4OwpAQCAtMzg4MywxNTMgKzI5NDksNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9jcmVhdGVfc3BkaWZfaW5fY3Rscyk7CiAKLS8qCi0gKiBjb21tYW5kIGNhY2hlCi0gKi8KLQotLyogYnVpbGQgYSAzMWJpdCBjYWNoZSBrZXkgd2l0aCB0aGUgd2lkZ2V0IGlkIGFuZCB0aGUgY29tbWFuZCBwYXJhbWV0ZXIgKi8KLSNkZWZpbmUgYnVpbGRfY21kX2NhY2hlX2tleShuaWQsIHZlcmIpCSgodmVyYiA8PCA4KSB8IG5pZCkKLSNkZWZpbmUgZ2V0X2NtZF9jYWNoZV9uaWQoa2V5KQkJKChrZXkpICYgMHhmZikKLSNkZWZpbmUgZ2V0X2NtZF9jYWNoZV9jbWQoa2V5KQkJKCgoa2V5KSA+PiA4KSAmIDB4ZmZmZikKLQotLyoqCi0gKiBzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlIC0gc2VuZCBhIHNpbmdsZSBjb21tYW5kIHdpdGggY2FjaGluZwotICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCi0gKiBAbmlkOiBOSUQgdG8gc2VuZCB0aGUgY29tbWFuZAotICogQGZsYWdzOiBvcHRpb25hbCBiaXQgZmxhZ3MKLSAqIEB2ZXJiOiB0aGUgdmVyYiB0byBzZW5kCi0gKiBAcGFybTogdGhlIHBhcmFtZXRlciBmb3IgdGhlIHZlcmIKLSAqCi0gKiBTZW5kIGEgc2luZ2xlIGNvbW1hbmQgd2l0aG91dCB3YWl0aW5nIGZvciByZXNwb25zZS4KLSAqCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgotICovCi1pbnQgc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKLQkJCSAgICAgIGludCBmbGFncywgdW5zaWduZWQgaW50IHZlcmIsIHVuc2lnbmVkIGludCBwYXJtKQotewotCWludCBlcnI7Ci0Jc3RydWN0IGhkYV9jYWNoZV9oZWFkICpjOwotCXUzMiBrZXk7Ci0JdW5zaWduZWQgaW50IGNhY2hlX29ubHk7Ci0KLQljYWNoZV9vbmx5ID0gY29kZWMtPmNhY2hlZF93cml0ZTsKLQlpZiAoIWNhY2hlX29ubHkpIHsKLQkJZXJyID0gc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCBmbGFncywgdmVyYiwgcGFybSk7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQkvKiBwYXJtIG1heSBjb250YWluIHRoZSB2ZXJiIHN0dWZmIGZvciBnZXQvc2V0IGFtcCAqLwotCXZlcmIgPSB2ZXJiIHwgKHBhcm0gPj4gOCk7Ci0JcGFybSAmPSAweGZmOwotCWtleSA9IGJ1aWxkX2NtZF9jYWNoZV9rZXkobmlkLCB2ZXJiKTsKLQltdXRleF9sb2NrKCZjb2RlYy0+YnVzLT5jbWRfbXV0ZXgpOwotCWMgPSBnZXRfYWxsb2NfaGFzaCgmY29kZWMtPmNtZF9jYWNoZSwga2V5KTsKLQlpZiAoYykgewotCQljLT52YWwgPSBwYXJtOwotCQljLT5kaXJ0eSA9IGNhY2hlX29ubHk7Ci0JfQotCW11dGV4X3VubG9jaygmY29kZWMtPmJ1cy0+Y21kX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUpOwotCi0vKioKLSAqIHNuZF9oZGFfY29kZWNfdXBkYXRlX2NhY2hlIC0gY2hlY2sgY2FjaGUgYW5kIHdyaXRlIHRoZSBjbWQgb25seSB3aGVuIG5lZWRlZAotICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCi0gKiBAbmlkOiBOSUQgdG8gc2VuZCB0aGUgY29tbWFuZAotICogQGZsYWdzOiBvcHRpb25hbCBiaXQgZmxhZ3MKLSAqIEB2ZXJiOiB0aGUgdmVyYiB0byBzZW5kCi0gKiBAcGFybTogdGhlIHBhcmFtZXRlciBmb3IgdGhlIHZlcmIKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdvcmtzIGxpa2Ugc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZSgpLCBidXQgaXQgZG9lc24ndCBzZW5kCi0gKiBjb21tYW5kIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYWxyZWFkeSBpZGVudGljYWwgd2l0aCB0aGUgY2FjaGVkIHZhbHVlLgotICogSWYgbm90LCBpdCBzZW5kcyB0aGUgY29tbWFuZCBhbmQgcmVmcmVzaGVzIHRoZSBjYWNoZS4KLSAqCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgotICovCi1pbnQgc25kX2hkYV9jb2RlY191cGRhdGVfY2FjaGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkgICAgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IHBhcm0pCi17Ci0Jc3RydWN0IGhkYV9jYWNoZV9oZWFkICpjOwotCXUzMiBrZXk7Ci0KLQkvKiBwYXJtIG1heSBjb250YWluIHRoZSB2ZXJiIHN0dWZmIGZvciBnZXQvc2V0IGFtcCAqLwotCXZlcmIgPSB2ZXJiIHwgKHBhcm0gPj4gOCk7Ci0JcGFybSAmPSAweGZmOwotCWtleSA9IGJ1aWxkX2NtZF9jYWNoZV9rZXkobmlkLCB2ZXJiKTsKLQltdXRleF9sb2NrKCZjb2RlYy0+YnVzLT5jbWRfbXV0ZXgpOwotCWMgPSBnZXRfaGFzaCgmY29kZWMtPmNtZF9jYWNoZSwga2V5KTsKLQlpZiAoYyAmJiBjLT52YWwgPT0gcGFybSkgewotCQltdXRleF91bmxvY2soJmNvZGVjLT5idXMtPmNtZF9tdXRleCk7Ci0JCXJldHVybiAwOwotCX0KLQltdXRleF91bmxvY2soJmNvZGVjLT5idXMtPmNtZF9tdXRleCk7Ci0JcmV0dXJuIHNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIG5pZCwgZmxhZ3MsIHZlcmIsIHBhcm0pOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9jb2RlY191cGRhdGVfY2FjaGUpOwotCi0vKioKLSAqIHNuZF9oZGFfY29kZWNfcmVzdW1lX2NhY2hlIC0gUmVzdW1lIHRoZSBhbGwgY29tbWFuZHMgZnJvbSB0aGUgY2FjaGUKLSAqIEBjb2RlYzogSEQtYXVkaW8gY29kZWMKLSAqCi0gKiBFeGVjdXRlIGFsbCB2ZXJicyByZWNvcmRlZCBpbiB0aGUgY29tbWFuZCBjYWNoZXMgdG8gcmVzdW1lLgotICovCi12b2lkIHNuZF9oZGFfY29kZWNfcmVzdW1lX2NhY2hlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWludCBpOwotCi0JbXV0ZXhfbG9jaygmY29kZWMtPmhhc2hfbXV0ZXgpOwotCWNvZGVjLT5jYWNoZWRfd3JpdGUgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+Y21kX2NhY2hlLmJ1Zi51c2VkOyBpKyspIHsKLQkJc3RydWN0IGhkYV9jYWNoZV9oZWFkICpidWZmZXI7Ci0JCXUzMiBrZXk7Ci0KLQkJYnVmZmVyID0gc25kX2FycmF5X2VsZW0oJmNvZGVjLT5jbWRfY2FjaGUuYnVmLCBpKTsKLQkJa2V5ID0gYnVmZmVyLT5rZXk7Ci0JCWlmICgha2V5KQotCQkJY29udGludWU7Ci0JCWlmICghYnVmZmVyLT5kaXJ0eSkKLQkJCWNvbnRpbnVlOwotCQlidWZmZXItPmRpcnR5ID0gMDsKLQkJbXV0ZXhfdW5sb2NrKCZjb2RlYy0+aGFzaF9tdXRleCk7Ci0JCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGdldF9jbWRfY2FjaGVfbmlkKGtleSksIDAsCi0JCQkJICAgIGdldF9jbWRfY2FjaGVfY21kKGtleSksIGJ1ZmZlci0+dmFsKTsKLQkJbXV0ZXhfbG9jaygmY29kZWMtPmhhc2hfbXV0ZXgpOwotCX0KLQltdXRleF91bmxvY2soJmNvZGVjLT5oYXNoX211dGV4KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfY29kZWNfcmVzdW1lX2NhY2hlKTsKLQotLyoqCi0gKiBzbmRfaGRhX3NlcXVlbmNlX3dyaXRlX2NhY2hlIC0gc2VxdWVuY2Ugd3JpdGVzIHdpdGggY2FjaGluZwotICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCi0gKiBAc2VxOiBWRVJCIGFycmF5IHRvIHNlbmQKLSAqCi0gKiBTZW5kIHRoZSBjb21tYW5kcyBzZXF1ZW50aWFsbHkgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuCi0gKiBUaHRlIGNvbW1hbmRzIGFyZSByZWNvcmRlZCBvbiBjYWNoZSBmb3IgcG93ZXItc2F2ZSBhbmQgcmVzdW1lLgotICogVGhlIGFycmF5IG11c3QgYmUgdGVybWluYXRlZCB3aXRoIE5JRD0wLgotICovCi12b2lkIHNuZF9oZGFfc2VxdWVuY2Vfd3JpdGVfY2FjaGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJICBjb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgKnNlcSkKLXsKLQlmb3IgKDsgc2VxLT5uaWQ7IHNlcSsrKQotCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBzZXEtPm5pZCwgMCwgc2VxLT52ZXJiLAotCQkJCQkgIHNlcS0+cGFyYW0pOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9zZXF1ZW5jZV93cml0ZV9jYWNoZSk7Ci0KLS8qKgotICogc25kX2hkYV9jb2RlY19mbHVzaF9jYWNoZSAtIEV4ZWN1dGUgYWxsIHBlbmRpbmcgKGNhY2hlZCkgYW1wcyAvIHZlcmJzCi0gKiBAY29kZWM6IEhELWF1ZGlvIGNvZGVjCi0gKi8KLXZvaWQgc25kX2hkYV9jb2RlY19mbHVzaF9jYWNoZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzbmRfaGRhX2NvZGVjX3Jlc3VtZV9hbXAoY29kZWMpOwotCXNuZF9oZGFfY29kZWNfcmVzdW1lX2NhY2hlKGNvZGVjKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfY29kZWNfZmx1c2hfY2FjaGUpOwotCiAvKioKICAqIHNuZF9oZGFfY29kZWNfc2V0X3Bvd2VyX3RvX2FsbCAtIFNldCB0aGUgcG93ZXIgc3RhdGUgdG8gYWxsIHdpZGdldHMKICAqIEBjb2RlYzogdGhlIEhEQSBjb2RlYwpAQCAtNDA0MywxMCArMjk2Miw5IEBACiB2b2lkIHNuZF9oZGFfY29kZWNfc2V0X3Bvd2VyX3RvX2FsbChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IGZnLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgcG93ZXJfc3RhdGUpCiB7Ci0JaGRhX25pZF90IG5pZCA9IGNvZGVjLT5zdGFydF9uaWQ7Ci0JaW50IGk7CisJaGRhX25pZF90IG5pZDsKIAotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX25vZGVzOyBpKyssIG5pZCsrKSB7CisJZm9yX2VhY2hfaGRhX2NvZGVjX25vZGUobmlkLCBjb2RlYykgewogCQl1bnNpZ25lZCBpbnQgd2NhcHMgPSBnZXRfd2NhcHMoY29kZWMsIG5pZCk7CiAJCXVuc2lnbmVkIGludCBzdGF0ZSA9IHBvd2VyX3N0YXRlOwogCQlpZiAoISh3Y2FwcyAmIEFDX1dDQVBfUE9XRVIpKQpAQCAtNDA2MywyMiArMjk4MSw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2NvZGVjX3NldF9wb3dlcl90b19hbGwpOwogCiAvKgotICogIHN1cHBvcnRlZCBwb3dlciBzdGF0ZXMgY2hlY2sKLSAqLwotc3RhdGljIGJvb2wgc25kX2hkYV9jb2RlY19nZXRfc3VwcG9ydGVkX3BzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgZmcsCi0JCQkJdW5zaWduZWQgaW50IHBvd2VyX3N0YXRlKQotewotCWludCBzdXAgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIGZnLCBBQ19QQVJfUE9XRVJfU1RBVEUpOwotCi0JaWYgKHN1cCA9PSAtMSkKLQkJcmV0dXJuIGZhbHNlOwotCWlmIChzdXAgJiBwb3dlcl9zdGF0ZSkKLQkJcmV0dXJuIHRydWU7Ci0JZWxzZQotCQlyZXR1cm4gZmFsc2U7Ci19Ci0KLS8qCiAgKiB3YWl0IHVudGlsIHRoZSBzdGF0ZSBpcyByZWFjaGVkLCByZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlCiAgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgaGRhX3N5bmNfcG93ZXJfc3RhdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCkBAIC00MTE3LDcgKzMwMTksNyBAQAogCQkJCQkgICAgIGhkYV9uaWRfdCBuaWQsCiAJCQkJCSAgICAgdW5zaWduZWQgaW50IHBvd2VyX3N0YXRlKQogewotCWlmIChuaWQgPT0gY29kZWMtPmFmZyB8fCBuaWQgPT0gY29kZWMtPm1mZykKKwlpZiAobmlkID09IGNvZGVjLT5jb3JlLmFmZyB8fCBuaWQgPT0gY29kZWMtPmNvcmUubWZnKQogCQlyZXR1cm4gcG93ZXJfc3RhdGU7CiAJaWYgKHBvd2VyX3N0YXRlID09IEFDX1BXUlNUX0QzICYmCiAJICAgIGdldF93Y2Fwc190eXBlKGdldF93Y2Fwcyhjb2RlYywgbmlkKSkgPT0gQUNfV0lEX1BJTiAmJgpAQCAtNDEzNyw3ICszMDM5LDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgaGRhX3NldF9wb3dlcl9zdGF0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkJdW5zaWduZWQgaW50IHBvd2VyX3N0YXRlKQogewotCWhkYV9uaWRfdCBmZyA9IGNvZGVjLT5hZmcgPyBjb2RlYy0+YWZnIDogY29kZWMtPm1mZzsKKwloZGFfbmlkX3QgZmcgPSBjb2RlYy0+Y29yZS5hZmcgPyBjb2RlYy0+Y29yZS5hZmcgOiBjb2RlYy0+Y29yZS5tZmc7CiAJaW50IGNvdW50OwogCXVuc2lnbmVkIGludCBzdGF0ZTsKIAlpbnQgZmxhZ3MgPSAwOwpAQCAtNDE0NSw3ICszMDQ3LDcgQEAKIAkvKiB0aGlzIGRlbGF5IHNlZW1zIG5lY2Vzc2FyeSB0byBhdm9pZCBjbGljayBub2lzZSBhdCBwb3dlci1kb3duICovCiAJaWYgKHBvd2VyX3N0YXRlID09IEFDX1BXUlNUX0QzKSB7CiAJCWlmIChjb2RlYy0+ZGVwb3BfZGVsYXkgPCAwKQotCQkJbXNsZWVwKGNvZGVjLT5lcHNzID8gMTAgOiAxMDApOworCQkJbXNsZWVwKGNvZGVjX2hhc19lcHNzKGNvZGVjKSA/IDEwIDogMTAwKTsKIAkJZWxzZSBpZiAoY29kZWMtPmRlcG9wX2RlbGF5ID4gMCkKIAkJCW1zbGVlcChjb2RlYy0+ZGVwb3BfZGVsYXkpOwogCQlmbGFncyA9IEhEQV9SV19OT19SRVNQT05TRV9GQUxMQkFDSzsKQEAgLTQxNzksMTQgKzMwODEsMTMgQEAKICAqLwogc3RhdGljIHZvaWQgc3luY19wb3dlcl91cF9zdGF0ZXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0JaGRhX25pZF90IG5pZCA9IGNvZGVjLT5zdGFydF9uaWQ7Ci0JaW50IGk7CisJaGRhX25pZF90IG5pZDsKIAogCS8qIGRvbid0IGNhcmUgaWYgbm8gZmlsdGVyIGlzIHVzZWQgKi8KIAlpZiAoIWNvZGVjLT5wb3dlcl9maWx0ZXIpCiAJCXJldHVybjsKIAotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX25vZGVzOyBpKyssIG5pZCsrKSB7CisJZm9yX2VhY2hfaGRhX2NvZGVjX25vZGUobmlkLCBjb2RlYykgewogCQl1bnNpZ25lZCBpbnQgd2NhcHMgPSBnZXRfd2NhcHMoY29kZWMsIG5pZCk7CiAJCXVuc2lnbmVkIGludCB0YXJnZXQ7CiAJCWlmICghKHdjYXBzICYgQUNfV0NBUF9QT1dFUikpCkBAIC00MjEyLDYzICszMTEzLDU0IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QTQorLyogdXBkYXRlIHRoZSBwb3dlciBvbi9vZmYgYWNjb3VudCB3aXRoIHRoZSBjdXJyZW50IGppZmZpZXMgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9wb3dlcl9hY2N0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBib29sIG9uKQoreworCXVuc2lnbmVkIGxvbmcgZGVsdGEgPSBqaWZmaWVzIC0gY29kZWMtPnBvd2VyX2ppZmZpZXM7CisKKwlpZiAob24pCisJCWNvZGVjLT5wb3dlcl9vbl9hY2N0ICs9IGRlbHRhOworCWVsc2UKKwkJY29kZWMtPnBvd2VyX29mZl9hY2N0ICs9IGRlbHRhOworCWNvZGVjLT5wb3dlcl9qaWZmaWVzICs9IGRlbHRhOworfQorCit2b2lkIHNuZF9oZGFfdXBkYXRlX3Bvd2VyX2FjY3Qoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJdXBkYXRlX3Bvd2VyX2FjY3QoY29kZWMsIGhkYV9jb2RlY19pc19wb3dlcl9vbihjb2RlYykpOworfQorCiAvKgogICogY2FsbCBzdXNwZW5kIGFuZCBwb3dlci1kb3duOyB1c2VkIGJvdGggZnJvbSBQTSBhbmQgcG93ZXItc2F2ZQogICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwb3dlciBzdGF0ZSBpbiB0aGUgZW5kCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaGRhX2NhbGxfY29kZWNfc3VzcGVuZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgYm9vbCBpbl93cSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGRhX2NhbGxfY29kZWNfc3VzcGVuZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAl1bnNpZ25lZCBpbnQgc3RhdGU7CiAKLQljb2RlYy0+aW5fcG0gPSAxOworCWF0b21pY19pbmMoJmNvZGVjLT5jb3JlLmluX3BtKTsKIAogCWlmIChjb2RlYy0+cGF0Y2hfb3BzLnN1c3BlbmQpCiAJCWNvZGVjLT5wYXRjaF9vcHMuc3VzcGVuZChjb2RlYyk7CiAJaGRhX2NsZWFudXBfYWxsX3N0cmVhbXMoY29kZWMpOwogCXN0YXRlID0gaGRhX3NldF9wb3dlcl9zdGF0ZShjb2RlYywgQUNfUFdSU1RfRDMpOwotCS8qIENhbmNlbCBkZWxheWVkIHdvcmsgaWYgd2UgYXJlbid0IGN1cnJlbnRseSBydW5uaW5nIGZyb20gaXQuICovCi0JaWYgKCFpbl93cSkKLQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjb2RlYy0+cG93ZXJfd29yayk7Ci0Jc3Bpbl9sb2NrKCZjb2RlYy0+cG93ZXJfbG9jayk7Ci0Jc25kX2hkYV91cGRhdGVfcG93ZXJfYWNjdChjb2RlYyk7Ci0JdHJhY2VfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOwotCWNvZGVjLT5wb3dlcl9vbiA9IDA7Ci0JY29kZWMtPnBvd2VyX3RyYW5zaXRpb24gPSAwOwotCWNvZGVjLT5wb3dlcl9qaWZmaWVzID0gamlmZmllczsKLQlzcGluX3VubG9jaygmY29kZWMtPnBvd2VyX2xvY2spOwotCWNvZGVjLT5pbl9wbSA9IDA7CisJdXBkYXRlX3Bvd2VyX2FjY3QoY29kZWMsIHRydWUpOworCWF0b21pY19kZWMoJmNvZGVjLT5jb3JlLmluX3BtKTsKIAlyZXR1cm4gc3RhdGU7CiB9CiAKLS8qIG1hcmsgYWxsIGVudHJpZXMgb2YgY21kIGFuZCBhbXAgY2FjaGVzIGRpcnR5ICovCi1zdGF0aWMgdm9pZCBoZGFfbWFya19jbWRfY2FjaGVfZGlydHkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IGNvZGVjLT5jbWRfY2FjaGUuYnVmLnVzZWQ7IGkrKykgewotCQlzdHJ1Y3QgaGRhX2NhY2hlX2hlYWQgKmNtZDsKLQkJY21kID0gc25kX2FycmF5X2VsZW0oJmNvZGVjLT5jbWRfY2FjaGUuYnVmLCBpKTsKLQkJY21kLT5kaXJ0eSA9IDE7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+YW1wX2NhY2hlLmJ1Zi51c2VkOyBpKyspIHsKLQkJc3RydWN0IGhkYV9hbXBfaW5mbyAqYW1wOwotCQlhbXAgPSBzbmRfYXJyYXlfZWxlbSgmY29kZWMtPmFtcF9jYWNoZS5idWYsIGkpOwotCQlhbXAtPmhlYWQuZGlydHkgPSAxOwotCX0KLX0KLQogLyoKICAqIGtpY2sgdXAgY29kZWM7IHVzZWQgYm90aCBmcm9tIFBNIGFuZCBwb3dlci1zYXZlCiAgKi8KIHN0YXRpYyB2b2lkIGhkYV9jYWxsX2NvZGVjX3Jlc3VtZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQljb2RlYy0+aW5fcG0gPSAxOworCWF0b21pY19pbmMoJmNvZGVjLT5jb3JlLmluX3BtKTsKIAotCWhkYV9tYXJrX2NtZF9jYWNoZV9kaXJ0eShjb2RlYyk7CisJaWYgKGNvZGVjLT5jb3JlLnJlZ21hcCkKKwkJcmVnY2FjaGVfbWFya19kaXJ0eShjb2RlYy0+Y29yZS5yZWdtYXApOwogCi0JLyogc2V0IGFzIGlmIHBvd2VyZWQgb24gZm9yIGF2b2lkaW5nIHJlLWVudGVyaW5nIHRoZSByZXN1bWUKLQkgKiBpbiB0aGUgcmVzdW1lIC8gcG93ZXItc2F2ZSBzZXF1ZW5jZQotCSAqLwotCWhkYV9rZWVwX3Bvd2VyX29uKGNvZGVjKTsKKwljb2RlYy0+cG93ZXJfamlmZmllcyA9IGppZmZpZXM7CisKIAloZGFfc2V0X3Bvd2VyX3N0YXRlKGNvZGVjLCBBQ19QV1JTVF9EMCk7CiAJcmVzdG9yZV9zaHV0dXBfcGlucyhjb2RlYyk7CiAJaGRhX2V4ZWNfaW5pdF92ZXJicyhjb2RlYyk7CkBAIC00Mjc4LDcyICszMTcwLDcxIEBACiAJZWxzZSB7CiAJCWlmIChjb2RlYy0+cGF0Y2hfb3BzLmluaXQpCiAJCQljb2RlYy0+cGF0Y2hfb3BzLmluaXQoY29kZWMpOwotCQlzbmRfaGRhX2NvZGVjX3Jlc3VtZV9hbXAoY29kZWMpOwotCQlzbmRfaGRhX2NvZGVjX3Jlc3VtZV9jYWNoZShjb2RlYyk7CisJCWlmIChjb2RlYy0+Y29yZS5yZWdtYXApCisJCQlyZWdjYWNoZV9zeW5jKGNvZGVjLT5jb3JlLnJlZ21hcCk7CiAJfQogCiAJaWYgKGNvZGVjLT5qYWNrcG9sbF9pbnRlcnZhbCkKIAkJaGRhX2phY2twb2xsX3dvcmsoJmNvZGVjLT5qYWNrcG9sbF93b3JrLndvcmspOwogCWVsc2UKIAkJc25kX2hkYV9qYWNrX3JlcG9ydF9zeW5jKGNvZGVjKTsKKwlhdG9taWNfZGVjKCZjb2RlYy0+Y29yZS5pbl9wbSk7Cit9CiAKLQljb2RlYy0+aW5fcG0gPSAwOwotCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7IC8qIGZsYWcgZG93biBiZWZvcmUgcmV0dXJuaW5nICovCitzdGF0aWMgaW50IGhkYV9jb2RlY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gZGV2X3RvX2hkYV9jb2RlYyhkZXYpOworCXN0cnVjdCBoZGFfcGNtICpwY207CisJdW5zaWduZWQgaW50IHN0YXRlOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjb2RlYy0+amFja3BvbGxfd29yayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwY20sICZjb2RlYy0+cGNtX2xpc3RfaGVhZCwgbGlzdCkKKwkJc25kX3BjbV9zdXNwZW5kX2FsbChwY20tPnBjbSk7CisJc3RhdGUgPSBoZGFfY2FsbF9jb2RlY19zdXNwZW5kKGNvZGVjKTsKKwlpZiAoY29kZWNfaGFzX2Nsa3N0b3AoY29kZWMpICYmIGNvZGVjX2hhc19lcHNzKGNvZGVjKSAmJgorCSAgICAoc3RhdGUgJiBBQ19QV1JTVF9DTEtfU1RPUF9PSykpCisJCXNuZF9oZGFjX2NvZGVjX2xpbmtfZG93bigmY29kZWMtPmNvcmUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkYV9jb2RlY19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBkZXZfdG9faGRhX2NvZGVjKGRldik7CisKKwlzbmRfaGRhY19jb2RlY19saW5rX3VwKCZjb2RlYy0+Y29yZSk7CisJaGRhX2NhbGxfY29kZWNfcmVzdW1lKGNvZGVjKTsKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRldik7CisJcmV0dXJuIDA7CiB9CiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKLQotLyoqCi0gKiBzbmRfaGRhX2J1aWxkX2NvbnRyb2xzIC0gYnVpbGQgbWl4ZXIgY29udHJvbHMKLSAqIEBidXM6IHRoZSBCVVMKLSAqCi0gKiBDcmVhdGVzIG1peGVyIGNvbnRyb2xzIGZvciBlYWNoIGNvZGVjIGluY2x1ZGVkIGluIHRoZSBidXMuCi0gKgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCi0gKi8KLWludCBzbmRfaGRhX2J1aWxkX2NvbnRyb2xzKHN0cnVjdCBoZGFfYnVzICpidXMpCi17Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7Ci0JCWludCBlcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX2NvbnRyb2xzKGNvZGVjKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCWNvZGVjX2Vycihjb2RlYywKLQkJCQkgICJjYW5ub3QgYnVpbGQgY29udHJvbHMgZm9yICMlZCAoZXJyb3IgJWQpXG4iLAotCQkJCSAgY29kZWMtPmFkZHIsIGVycik7Ci0JCQllcnIgPSBzbmRfaGRhX2NvZGVjX3Jlc2V0KGNvZGVjKTsKLQkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJY29kZWNfZXJyKGNvZGVjLAotCQkJCQkgICJjYW5ub3QgcmV2ZXJ0IGNvZGVjXG4iKTsKLQkJCQlyZXR1cm4gZXJyOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9idWlsZF9jb250cm9scyk7CisvKiByZWZlcnJlZCBpbiBoZGFfYmluZC5jICovCitjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBoZGFfY29kZWNfZHJpdmVyX3BtID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHBtX3J1bnRpbWVfZm9yY2Vfc3VzcGVuZCwKKwkJCQlwbV9ydW50aW1lX2ZvcmNlX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMoaGRhX2NvZGVjX3J1bnRpbWVfc3VzcGVuZCwgaGRhX2NvZGVjX3J1bnRpbWVfcmVzdW1lLAorCQkJICAgTlVMTCkKK307CiAKIC8qCiAgKiBhZGQgc3RhbmRhcmQgY2hhbm5lbCBtYXBzIGlmIG5vdCBzcGVjaWZpZWQKICAqLwogc3RhdGljIGludCBhZGRfc3RkX2NobWFwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgaSwgc3RyLCBlcnI7CisJc3RydWN0IGhkYV9wY20gKnBjbTsKKwlpbnQgc3RyLCBlcnI7CiAKLQlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPm51bV9wY21zOyBpKyspIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBjbSwgJmNvZGVjLT5wY21fbGlzdF9oZWFkLCBsaXN0KSB7CiAJCWZvciAoc3RyID0gMDsgc3RyIDwgMjsgc3RyKyspIHsKLQkJCXN0cnVjdCBzbmRfcGNtICpwY20gPSBjb2RlYy0+cGNtX2luZm9baV0ucGNtOwotCQkJc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9Ci0JCQkJJmNvZGVjLT5wY21faW5mb1tpXS5zdHJlYW1bc3RyXTsKKwkJCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSAmcGNtLT5zdHJlYW1bc3RyXTsKIAkJCXN0cnVjdCBzbmRfcGNtX2NobWFwICpjaG1hcDsKIAkJCWNvbnN0IHN0cnVjdCBzbmRfcGNtX2NobWFwX2VsZW0gKmVsZW07CiAKLQkJCWlmIChjb2RlYy0+cGNtX2luZm9baV0ub3duX2NobWFwKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFwY20gfHwgIWhpbmZvLT5zdWJzdHJlYW1zKQorCQkJaWYgKCFwY20gfHwgcGNtLT5vd25fY2htYXAgfHwKKwkJCSAgICAhaGluZm8tPnN1YnN0cmVhbXMpCiAJCQkJY29udGludWU7CiAJCQllbGVtID0gaGluZm8tPmNobWFwID8gaGluZm8tPmNobWFwIDogc25kX3BjbV9zdGRfY2htYXBzOwotCQkJZXJyID0gc25kX3BjbV9hZGRfY2htYXBfY3RscyhwY20sIHN0ciwgZWxlbSwKKwkJCWVyciA9IHNuZF9wY21fYWRkX2NobWFwX2N0bHMocGNtLT5wY20sIHN0ciwgZWxlbSwKIAkJCQkJCSAgICAgaGluZm8tPmNoYW5uZWxzX21heCwKIAkJCQkJCSAgICAgMCwgJmNobWFwKTsKIAkJCWlmIChlcnIgPCAwKQpAQCAtNDQ5OSw0MyArMzM5MCwyOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9jYWxjX3N0cmVhbV9mb3JtYXQpOwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGdldF9wY21fcGFyYW0oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkJICBpbnQgZGlyKQorc3RhdGljIHVuc2lnbmVkIGludCBxdWVyeV9wY21fcGFyYW0oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCiB7CiAJdW5zaWduZWQgaW50IHZhbCA9IDA7Ci0JaWYgKG5pZCAhPSBjb2RlYy0+YWZnICYmCisJaWYgKG5pZCAhPSBjb2RlYy0+Y29yZS5hZmcgJiYKIAkgICAgKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmIEFDX1dDQVBfRk9STUFUX09WUkQpKQogCQl2YWwgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX1BDTSk7CiAJaWYgKCF2YWwgfHwgdmFsID09IC0xKQotCQl2YWwgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIEFDX1BBUl9QQ00pOworCQl2YWwgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIGNvZGVjLT5jb3JlLmFmZywgQUNfUEFSX1BDTSk7CiAJaWYgKCF2YWwgfHwgdmFsID09IC0xKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gdmFsOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IHF1ZXJ5X3BjbV9wYXJhbShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKLXsKLQlyZXR1cm4gcXVlcnlfY2Fwc19oYXNoKGNvZGVjLCBuaWQsIDAsIEhEQV9IQVNIX1BBUlBDTV9LRVkobmlkKSwKLQkJCSAgICAgICBnZXRfcGNtX3BhcmFtKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBnZXRfc3RyZWFtX3BhcmFtKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAotCQkJCSAgICAgaW50IGRpcikKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcXVlcnlfc3RyZWFtX3BhcmFtKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQogewogCXVuc2lnbmVkIGludCBzdHJlYW1zID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9TVFJFQU0pOwogCWlmICghc3RyZWFtcyB8fCBzdHJlYW1zID09IC0xKQotCQlzdHJlYW1zID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCBBQ19QQVJfU1RSRUFNKTsKKwkJc3RyZWFtcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgY29kZWMtPmNvcmUuYWZnLCBBQ19QQVJfU1RSRUFNKTsKIAlpZiAoIXN0cmVhbXMgfHwgc3RyZWFtcyA9PSAtMSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIHN0cmVhbXM7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgcXVlcnlfc3RyZWFtX3BhcmFtKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQotewotCXJldHVybiBxdWVyeV9jYXBzX2hhc2goY29kZWMsIG5pZCwgMCwgSERBX0hBU0hfUEFSU1RSX0tFWShuaWQpLAotCQkJICAgICAgIGdldF9zdHJlYW1fcGFyYW0pOwotfQotCiAvKioKICAqIHNuZF9oZGFfcXVlcnlfc3VwcG9ydGVkX3BjbSAtIHF1ZXJ5IHRoZSBzdXBwb3J0ZWQgUENNIHJhdGVzIGFuZCBmb3JtYXRzCiAgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKQEAgLTQ3OTIsNyArMzY2OSwxMSBAQAogewogCWludCByZXQ7CiAJbXV0ZXhfbG9jaygmY29kZWMtPmJ1cy0+cHJlcGFyZV9tdXRleCk7Ci0JcmV0ID0gaGluZm8tPm9wcy5wcmVwYXJlKGhpbmZvLCBjb2RlYywgc3RyZWFtLCBmb3JtYXQsIHN1YnN0cmVhbSk7CisJaWYgKGhpbmZvLT5vcHMucHJlcGFyZSkKKwkJcmV0ID0gaGluZm8tPm9wcy5wcmVwYXJlKGhpbmZvLCBjb2RlYywgc3RyZWFtLCBmb3JtYXQsCisJCQkJCSBzdWJzdHJlYW0pOworCWVsc2UKKwkJcmV0ID0gLUVOT0RFVjsKIAlpZiAocmV0ID49IDApCiAJCXB1cmlmeV9pbmFjdGl2ZV9zdHJlYW1zKGNvZGVjKTsKIAltdXRleF91bmxvY2soJmNvZGVjLT5idXMtPnByZXBhcmVfbXV0ZXgpOwpAQCAtNDgxMyw3ICszNjk0LDggQEAKIAkJCSAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCW11dGV4X2xvY2soJmNvZGVjLT5idXMtPnByZXBhcmVfbXV0ZXgpOwotCWhpbmZvLT5vcHMuY2xlYW51cChoaW5mbywgY29kZWMsIHN1YnN0cmVhbSk7CisJaWYgKGhpbmZvLT5vcHMuY2xlYW51cCkKKwkJaGluZm8tPm9wcy5jbGVhbnVwKGhpbmZvLCBjb2RlYywgc3Vic3RyZWFtKTsKIAltdXRleF91bmxvY2soJmNvZGVjLT5idXMtPnByZXBhcmVfbXV0ZXgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9jb2RlY19jbGVhbnVwKTsKQEAgLTQ4NzEsMTE0ICszNzUzLDg2IEBACiAJcmV0dXJuIC1FQUdBSU47CiB9CiAKLS8qCi0gKiBhdHRhY2ggYSBuZXcgUENNIHN0cmVhbQotICovCi1zdGF0aWMgaW50IHNuZF9oZGFfYXR0YWNoX3BjbShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IGhkYV9wY20gKnBjbSkKKy8qIGNhbGwgYnVpbGRfcGNtcyBvcHMgb2YgdGhlIGdpdmVuIGNvZGVjIGFuZCBzZXQgdXAgdGhlIGRlZmF1bHQgcGFyYW1ldGVycyAqLworaW50IHNuZF9oZGFfY29kZWNfcGFyc2VfcGNtcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKLQlzdHJ1Y3QgaGRhX2J1cyAqYnVzID0gY29kZWMtPmJ1czsKLQlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmluZm87Ci0JaW50IHN0cmVhbSwgZXJyOworCXN0cnVjdCBoZGFfcGNtICpjcGNtOworCWludCBlcnI7CiAKLQlpZiAoc25kX0JVR19PTighcGNtLT5uYW1lKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZm9yIChzdHJlYW0gPSAwOyBzdHJlYW0gPCAyOyBzdHJlYW0rKykgewotCQlpbmZvID0gJnBjbS0+c3RyZWFtW3N0cmVhbV07Ci0JCWlmIChpbmZvLT5zdWJzdHJlYW1zKSB7CisJaWYgKCFsaXN0X2VtcHR5KCZjb2RlYy0+cGNtX2xpc3RfaGVhZCkpCisJCXJldHVybiAwOyAvKiBhbHJlYWR5IHBhcnNlZCAqLworCisJaWYgKCFjb2RlYy0+cGF0Y2hfb3BzLmJ1aWxkX3BjbXMpCisJCXJldHVybiAwOworCisJZXJyID0gY29kZWMtPnBhdGNoX29wcy5idWlsZF9wY21zKGNvZGVjKTsKKwlpZiAoZXJyIDwgMCkgeworCQljb2RlY19lcnIoY29kZWMsICJjYW5ub3QgYnVpbGQgUENNcyBmb3IgIyVkIChlcnJvciAlZClcbiIsCisJCQkgIGNvZGVjLT5jb3JlLmFkZHIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjcGNtLCAmY29kZWMtPnBjbV9saXN0X2hlYWQsIGxpc3QpIHsKKwkJaW50IHN0cmVhbTsKKworCQlmb3IgKHN0cmVhbSA9IDA7IHN0cmVhbSA8IDI7IHN0cmVhbSsrKSB7CisJCQlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmluZm8gPSAmY3BjbS0+c3RyZWFtW3N0cmVhbV07CisKKwkJCWlmICghaW5mby0+c3Vic3RyZWFtcykKKwkJCQljb250aW51ZTsKIAkJCWVyciA9IHNldF9wY21fZGVmYXVsdF92YWx1ZXMoY29kZWMsIGluZm8pOwotCQkJaWYgKGVyciA8IDApCisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWNvZGVjX3dhcm4oY29kZWMsCisJCQkJCSAgICJmYWlsIHRvIHNldHVwIGRlZmF1bHQgZm9yIFBDTSAlc1xuIiwKKwkJCQkJICAgY3BjbS0+bmFtZSk7CiAJCQkJcmV0dXJuIGVycjsKKwkJCX0KIAkJfQogCX0KLQlyZXR1cm4gYnVzLT5vcHMuYXR0YWNoX3BjbShidXMsIGNvZGVjLCBwY20pOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIGFzc2lnbiBhbGwgUENNcyBvZiB0aGUgZ2l2ZW4gY29kZWMgKi8KIGludCBzbmRfaGRhX2NvZGVjX2J1aWxkX3BjbXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0JdW5zaWduZWQgaW50IHBjbTsKLQlpbnQgZXJyOworCXN0cnVjdCBoZGFfYnVzICpidXMgPSBjb2RlYy0+YnVzOworCXN0cnVjdCBoZGFfcGNtICpjcGNtOworCWludCBkZXYsIGVycjsKIAotCWlmICghY29kZWMtPm51bV9wY21zKSB7Ci0JCWlmICghY29kZWMtPnBhdGNoX29wcy5idWlsZF9wY21zKQotCQkJcmV0dXJuIDA7Ci0JCWVyciA9IGNvZGVjLT5wYXRjaF9vcHMuYnVpbGRfcGNtcyhjb2RlYyk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQljb2RlY19lcnIoY29kZWMsCi0JCQkJICAiY2Fubm90IGJ1aWxkIFBDTXMgZm9yICMlZCAoZXJyb3IgJWQpXG4iLAotCQkJCSAgY29kZWMtPmFkZHIsIGVycik7Ci0JCQllcnIgPSBzbmRfaGRhX2NvZGVjX3Jlc2V0KGNvZGVjKTsKLQkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJY29kZWNfZXJyKGNvZGVjLAotCQkJCQkgICJjYW5ub3QgcmV2ZXJ0IGNvZGVjXG4iKTsKLQkJCQlyZXR1cm4gZXJyOwotCQkJfQotCQl9CisJaWYgKHNuZF9CVUdfT04oIWJ1cy0+b3BzLmF0dGFjaF9wY20pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IHNuZF9oZGFfY29kZWNfcGFyc2VfcGNtcyhjb2RlYyk7CisJaWYgKGVyciA8IDApIHsKKwkJc25kX2hkYV9jb2RlY19yZXNldChjb2RlYyk7CisJCXJldHVybiBlcnI7CiAJfQotCWZvciAocGNtID0gMDsgcGNtIDwgY29kZWMtPm51bV9wY21zOyBwY20rKykgewotCQlzdHJ1Y3QgaGRhX3BjbSAqY3BjbSA9ICZjb2RlYy0+cGNtX2luZm9bcGNtXTsKLQkJaW50IGRldjsKIAorCS8qIGF0dGFjaCBhIG5ldyBQQ00gc3RyZWFtcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3BjbSwgJmNvZGVjLT5wY21fbGlzdF9oZWFkLCBsaXN0KSB7CisJCWlmIChjcGNtLT5wY20pCisJCQljb250aW51ZTsgLyogYWxyZWFkeSBhdHRhY2hlZCAqLwogCQlpZiAoIWNwY20tPnN0cmVhbVswXS5zdWJzdHJlYW1zICYmICFjcGNtLT5zdHJlYW1bMV0uc3Vic3RyZWFtcykKIAkJCWNvbnRpbnVlOyAvKiBubyBzdWJzdHJlYW1zIGFzc2lnbmVkICovCiAKLQkJaWYgKCFjcGNtLT5wY20pIHsKLQkJCWRldiA9IGdldF9lbXB0eV9wY21fZGV2aWNlKGNvZGVjLT5idXMsIGNwY20tPnBjbV90eXBlKTsKLQkJCWlmIChkZXYgPCAwKQotCQkJCWNvbnRpbnVlOyAvKiBubyBmYXRhbCBlcnJvciAqLwotCQkJY3BjbS0+ZGV2aWNlID0gZGV2OwotCQkJZXJyID0gc25kX2hkYV9hdHRhY2hfcGNtKGNvZGVjLCBjcGNtKTsKLQkJCWlmIChlcnIgPCAwKSB7Ci0JCQkJY29kZWNfZXJyKGNvZGVjLAotCQkJCQkgICJjYW5ub3QgYXR0YWNoIFBDTSBzdHJlYW0gJWQgZm9yIGNvZGVjICMlZFxuIiwKLQkJCQkJICBkZXYsIGNvZGVjLT5hZGRyKTsKLQkJCQljb250aW51ZTsgLyogbm8gZmF0YWwgZXJyb3IgKi8KLQkJCX0KKwkJZGV2ID0gZ2V0X2VtcHR5X3BjbV9kZXZpY2UoYnVzLCBjcGNtLT5wY21fdHlwZSk7CisJCWlmIChkZXYgPCAwKQorCQkJY29udGludWU7IC8qIG5vIGZhdGFsIGVycm9yICovCisJCWNwY20tPmRldmljZSA9IGRldjsKKwkJZXJyID0gIGJ1cy0+b3BzLmF0dGFjaF9wY20oYnVzLCBjb2RlYywgY3BjbSk7CisJCWlmIChlcnIgPCAwKSB7CisJCQljb2RlY19lcnIoY29kZWMsCisJCQkJICAiY2Fubm90IGF0dGFjaCBQQ00gc3RyZWFtICVkIGZvciBjb2RlYyAjJWRcbiIsCisJCQkJICBkZXYsIGNvZGVjLT5jb3JlLmFkZHIpOworCQkJY29udGludWU7IC8qIG5vIGZhdGFsIGVycm9yICovCiAJCX0KIAl9CisKIAlyZXR1cm4gMDsKIH0KIAogLyoqCi0gKiBzbmRfaGRhX2J1aWxkX3BjbXMgLSBidWlsZCBQQ00gaW5mb3JtYXRpb24KLSAqIEBidXM6IHRoZSBCVVMKLSAqCi0gKiBDcmVhdGUgUENNIGluZm9ybWF0aW9uIGZvciBlYWNoIGNvZGVjIGluY2x1ZGVkIGluIHRoZSBidXMuCi0gKgotICogVGhlIGJ1aWxkX3BjbXMgY29kZWMgcGF0Y2ggaXMgcmVxdWVzdGVkIHRvIHNldCB1cCBjb2RlYy0+bnVtX3BjbXMgYW5kCi0gKiBjb2RlYy0+cGNtX2luZm8gcHJvcGVybHkuICBUaGUgYXJyYXkgaXMgcmVmZXJyZWQgYnkgdGhlIHRvcC1sZXZlbCBkcml2ZXIKLSAqIHRvIGNyZWF0ZSBpdHMgUENNIGluc3RhbmNlcy4KLSAqIFRoZSBhbGxvY2F0ZWQgY29kZWMtPnBjbV9pbmZvIHNob3VsZCBiZSByZWxlYXNlZCBpbiBjb2RlYy0+cGF0Y2hfb3BzLmZyZWUKLSAqIGNhbGxiYWNrLgotICoKLSAqIEF0IGxlYXN0LCBzdWJzdHJlYW1zLCBjaGFubmVsc19taW4gYW5kIGNoYW5uZWxzX21heCBtdXN0IGJlIGZpbGxlZCBmb3IKLSAqIGVhY2ggc3RyZWFtLiAgc3Vic3RyZWFtcyA9IDAgaW5kaWNhdGVzIHRoYXQgdGhlIHN0cmVhbSBkb2Vzbid0IGV4aXN0LgotICogV2hlbiByYXRlcyBhbmQvb3IgZm9ybWF0cyBhcmUgemVybywgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIHF1ZXJpZWQKLSAqIGZyb20gdGhlIGdpdmVuIG5pZC4gIFRoZSBuaWQgaXMgdXNlZCBhbHNvIGJ5IHRoZSBkZWZhdWx0IG9wcy5wcmVwYXJlCi0gKiBhbmQgb3BzLmNsZWFudXAgY2FsbGJhY2tzLgotICoKLSAqIFRoZSBkcml2ZXIgbmVlZHMgdG8gY2FsbCBvcHMub3BlbiBpbiBpdHMgb3BlbiBjYWxsYmFjay4gIFNpbWlsYXJseSwKLSAqIG9wcy5jbG9zZSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgaW4gdGhlIGNsb3NlIGNhbGxiYWNrLgotICogb3BzLnByZXBhcmUgc2hvdWxkIGJlIGNhbGxlZCBpbiB0aGUgcHJlcGFyZSBvciBod19wYXJhbXMgY2FsbGJhY2sKLSAqIHdpdGggdGhlIHByb3BlciBwYXJhbWV0ZXJzIGZvciBzZXQgdXAuCi0gKiBvcHMuY2xlYW51cCBzaG91bGQgYmUgY2FsbGVkIGluIGh3X2ZyZWUgZm9yIGNsZWFuIHVwIG9mIHN0cmVhbXMuCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgotICovCi1pbnQgc25kX2hkYV9idWlsZF9wY21zKHN0cnVjdCBoZGFfYnVzICpidXMpCi17Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7Ci0JCWludCBlcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX3BjbXMoY29kZWMpOwotCQlpZiAoZXJyIDwgMCkKLQkJCXJldHVybiBlcnI7Ci0JfQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9idWlsZF9wY21zKTsKLQotLyoqCiAgKiBzbmRfaGRhX2FkZF9uZXdfY3RscyAtIGNyZWF0ZSBjb250cm9scyBmcm9tIHRoZSBhcnJheQogICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCiAgKiBAa25ldzogdGhlIGFycmF5IG9mIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3CkBAIC01MDEzLDggKzM4NjcsOCBAQAogCQkJICogdGhlIGNvZGVjIGFkZHI7IGlmIGl0IHN0aWxsIGZhaWxzIChvciBpdCdzIHRoZQogCQkJICogcHJpbWFyeSBjb2RlYyksIHRoZW4gdHJ5IGFub3RoZXIgY29udHJvbCBpbmRleAogCQkJICovCi0JCQlpZiAoIWFkZHIgJiYgY29kZWMtPmFkZHIpCi0JCQkJYWRkciA9IGNvZGVjLT5hZGRyOworCQkJaWYgKCFhZGRyICYmIGNvZGVjLT5jb3JlLmFkZHIpCisJCQkJYWRkciA9IGNvZGVjLT5jb3JlLmFkZHI7CiAJCQllbHNlIGlmICghaWR4ICYmICFrbmV3LT5pbmRleCkgewogCQkJCWlkeCA9IGZpbmRfZW1wdHlfbWl4ZXJfY3RsX2lkeChjb2RlYywKIAkJCQkJCQkgICAgICAga25ldy0+bmFtZSwgMCk7CkBAIC01MDI5LDEyNyArMzg4MywzNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9hZGRfbmV3X2N0bHMpOwogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgdm9pZCBoZGFfcG93ZXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCitzdGF0aWMgdm9pZCBjb2RlY19zZXRfcG93ZXJfc2F2ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IGRlbGF5KQogewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBoZGFfY29kZWMsIHBvd2VyX3dvcmsud29yayk7Ci0Jc3RydWN0IGhkYV9idXMgKmJ1cyA9IGNvZGVjLT5idXM7Ci0JdW5zaWduZWQgaW50IHN0YXRlOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhkYV9jb2RlY19kZXYoY29kZWMpOwogCi0Jc3Bpbl9sb2NrKCZjb2RlYy0+cG93ZXJfbG9jayk7Ci0JaWYgKGNvZGVjLT5wb3dlcl90cmFuc2l0aW9uID4gMCkgeyAvKiBkdXJpbmcgcG93ZXItdXAgc2VxdWVuY2U/ICovCi0JCXNwaW5fdW5sb2NrKCZjb2RlYy0+cG93ZXJfbG9jayk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKCFjb2RlYy0+cG93ZXJfb24gfHwgY29kZWMtPnBvd2VyX2NvdW50KSB7Ci0JCWNvZGVjLT5wb3dlcl90cmFuc2l0aW9uID0gMDsKLQkJc3Bpbl91bmxvY2soJmNvZGVjLT5wb3dlcl9sb2NrKTsKLQkJcmV0dXJuOwotCX0KLQlzcGluX3VubG9jaygmY29kZWMtPnBvd2VyX2xvY2spOwotCi0Jc3RhdGUgPSBoZGFfY2FsbF9jb2RlY19zdXNwZW5kKGNvZGVjLCB0cnVlKTsKLQlpZiAoIWJ1cy0+cG93ZXJfa2VlcF9saW5rX29uICYmIChzdGF0ZSAmIEFDX1BXUlNUX0NMS19TVE9QX09LKSkKLQkJaGRhX2NhbGxfcG1fbm90aWZ5KGNvZGVjLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGhkYV9rZWVwX3Bvd2VyX29uKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXNwaW5fbG9jaygmY29kZWMtPnBvd2VyX2xvY2spOwotCWNvZGVjLT5wb3dlcl9jb3VudCsrOwotCWNvZGVjLT5wb3dlcl9vbiA9IDE7Ci0JY29kZWMtPnBvd2VyX2ppZmZpZXMgPSBqaWZmaWVzOwotCXNwaW5fdW5sb2NrKCZjb2RlYy0+cG93ZXJfbG9jayk7Ci0JaGRhX2NhbGxfcG1fbm90aWZ5KGNvZGVjLCB0cnVlKTsKLX0KLQotLyogdXBkYXRlIHRoZSBwb3dlciBvbi9vZmYgYWNjb3VudCB3aXRoIHRoZSBjdXJyZW50IGppZmZpZXMgKi8KLXZvaWQgc25kX2hkYV91cGRhdGVfcG93ZXJfYWNjdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQl1bnNpZ25lZCBsb25nIGRlbHRhID0gamlmZmllcyAtIGNvZGVjLT5wb3dlcl9qaWZmaWVzOwotCWlmIChjb2RlYy0+cG93ZXJfb24pCi0JCWNvZGVjLT5wb3dlcl9vbl9hY2N0ICs9IGRlbHRhOwotCWVsc2UKLQkJY29kZWMtPnBvd2VyX29mZl9hY2N0ICs9IGRlbHRhOwotCWNvZGVjLT5wb3dlcl9qaWZmaWVzICs9IGRlbHRhOwotfQotCi0vKiBUcmFuc2l0aW9uIHRvIHBvd2VyZWQgdXAsIGlmIHdhaXRfcG93ZXJfZG93biB0aGVuIHdhaXQgZm9yIGEgcGVuZGluZwotICogdHJhbnNpdGlvbiB0byBEMyB0byBjb21wbGV0ZS4gQSBwZW5kaW5nIEQzIHRyYW5zaXRpb24gaXMgaW5kaWNhdGVkCi0gKiB3aXRoIHBvd2VyX3RyYW5zaXRpb24gPT0gLTEuICovCi0vKiBjYWxsIHRoaXMgd2l0aCBjb2RlYy0+cG93ZXJfbG9jayBoZWxkISAqLwotc3RhdGljIHZvaWQgX19zbmRfaGRhX3Bvd2VyX3VwKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBib29sIHdhaXRfcG93ZXJfZG93bikKLXsKLQkvKiBSZXR1cm4gaWYgcG93ZXJfb24gb3IgdHJhbnNpdGlvbmluZyB0byBwb3dlcl9vbiwgdW5sZXNzIGN1cnJlbnRseQotCSAqIHBvd2VyaW5nIGRvd24uICovCi0JaWYgKChjb2RlYy0+cG93ZXJfb24gfHwgY29kZWMtPnBvd2VyX3RyYW5zaXRpb24gPiAwKSAmJgotCSAgICAhKHdhaXRfcG93ZXJfZG93biAmJiBjb2RlYy0+cG93ZXJfdHJhbnNpdGlvbiA8IDApKQotCQlyZXR1cm47Ci0Jc3Bpbl91bmxvY2soJmNvZGVjLT5wb3dlcl9sb2NrKTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29kZWMtPnBvd2VyX3dvcmspOwotCi0Jc3Bpbl9sb2NrKCZjb2RlYy0+cG93ZXJfbG9jayk7Ci0JLyogSWYgdGhlIHBvd2VyIGRvd24gZGVsYXllZCB3b3JrIHdhcyBjYW5jZWxsZWQgYWJvdmUgYmVmb3JlIHN0YXJ0aW5nLAotCSAqIHRoZW4gdGhlcmUgaXMgbm8gbmVlZCB0byBnbyB0aHJvdWdoIHBvd2VyIHVwIGhlcmUuCi0JICovCi0JaWYgKGNvZGVjLT5wb3dlcl9vbikgewotCQlpZiAoY29kZWMtPnBvd2VyX3RyYW5zaXRpb24gPCAwKQotCQkJY29kZWMtPnBvd2VyX3RyYW5zaXRpb24gPSAwOwotCQlyZXR1cm47Ci0JfQotCi0JdHJhY2VfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKLQlzbmRfaGRhX3VwZGF0ZV9wb3dlcl9hY2N0KGNvZGVjKTsKLQljb2RlYy0+cG93ZXJfb24gPSAxOwotCWNvZGVjLT5wb3dlcl9qaWZmaWVzID0gamlmZmllczsKLQljb2RlYy0+cG93ZXJfdHJhbnNpdGlvbiA9IDE7IC8qIGF2b2lkIHJlZW50cmFuY2UgKi8KLQlzcGluX3VubG9jaygmY29kZWMtPnBvd2VyX2xvY2spOwotCi0JaGRhX2NhbGxfY29kZWNfcmVzdW1lKGNvZGVjKTsKLQotCXNwaW5fbG9jaygmY29kZWMtPnBvd2VyX2xvY2spOwotCWNvZGVjLT5wb3dlcl90cmFuc2l0aW9uID0gMDsKLX0KLQotI2RlZmluZSBwb3dlcl9zYXZlKGNvZGVjKQlcCi0JKChjb2RlYyktPmJ1cy0+cG93ZXJfc2F2ZSA/ICooY29kZWMpLT5idXMtPnBvd2VyX3NhdmUgOiAwKQotCi0vKiBUcmFuc2l0aW9uIHRvIHBvd2VyZWQgZG93biAqLwotc3RhdGljIHZvaWQgX19zbmRfaGRhX3Bvd2VyX2Rvd24oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0JaWYgKCFjb2RlYy0+cG93ZXJfb24gfHwgY29kZWMtPnBvd2VyX2NvdW50IHx8IGNvZGVjLT5wb3dlcl90cmFuc2l0aW9uKQotCQlyZXR1cm47Ci0KLQlpZiAocG93ZXJfc2F2ZShjb2RlYykpIHsKLQkJY29kZWMtPnBvd2VyX3RyYW5zaXRpb24gPSAtMTsgLyogYXZvaWQgcmVlbnRyYW5jZSAqLwotCQlxdWV1ZV9kZWxheWVkX3dvcmsoY29kZWMtPmJ1cy0+d29ya3EsICZjb2RlYy0+cG93ZXJfd29yaywKLQkJCQltc2Vjc190b19qaWZmaWVzKHBvd2VyX3NhdmUoY29kZWMpICogMTAwMCkpOworCWlmIChkZWxheSA+IDApIHsKKwkJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkoZGV2LCBkZWxheSk7CisJCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGRldik7CisJCXBtX3J1bnRpbWVfYWxsb3coZGV2KTsKKwkJaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKQorCQkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShkZXYpOworCX0gZWxzZSB7CisJCXBtX3J1bnRpbWVfZG9udF91c2VfYXV0b3N1c3BlbmQoZGV2KTsKKwkJcG1fcnVudGltZV9mb3JiaWQoZGV2KTsKIAl9CiB9CiAKIC8qKgotICogc25kX2hkYV9wb3dlcl9zYXZlIC0gUG93ZXItdXAvZG93bi9zeW5jIHRoZSBjb2RlYwotICogQGNvZGVjOiBIRC1hdWRpbyBjb2RlYwotICogQGRlbHRhOiB0aGUgY291bnRlciBkZWx0YSB0byBjaGFuZ2UKLSAqIEBkM3dhaXQ6IHN5bmMgZm9yIEQzIHRyYW5zaXRpb24gY29tcGxldGUKKyAqIHNuZF9oZGFfc2V0X3Bvd2VyX3NhdmUgLSByZXByb2dyYW0gYXV0b3N1c3BlbmQgZm9yIHRoZSBnaXZlbiBkZWxheQorICogQGJ1czogSEQtYXVkaW8gYnVzCisgKiBAZGVsYXk6IGF1dG9zdXNwZW5kIGRlbGF5IGluIG1zZWMsIDAgPSBvZmYKICAqCi0gKiBDaGFuZ2UgdGhlIHBvd2VyLXVwIGNvdW50ZXIgdmlhIEBkZWx0YSwgYW5kIHBvd2VyIHVwIG9yIGRvd24gdGhlIGhhcmR3YXJlCi0gKiBhcHByb3ByaWF0ZWx5LiAgRm9yIHRoZSBwb3dlci1kb3duLCBxdWV1ZSB0byB0aGUgZGVsYXllZCBhY3Rpb24uCi0gKiBQYXNzaW5nIHplcm8gdG8gQGRlbHRhIG1lYW5zIHRvIHN5bmNocm9uaXplIHRoZSBwb3dlciBzdGF0ZS4KKyAqIFN5bmNocm9uaXplIHRoZSBydW50aW1lIFBNIGF1dG9zdXNwZW5kIHN0YXRlIGZyb20gdGhlIHBvd2VyX3NhdmUgb3B0aW9uLgogICovCi12b2lkIHNuZF9oZGFfcG93ZXJfc2F2ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IGRlbHRhLCBib29sIGQzd2FpdCkKK3ZvaWQgc25kX2hkYV9zZXRfcG93ZXJfc2F2ZShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBpbnQgZGVsYXkpCiB7Ci0Jc3Bpbl9sb2NrKCZjb2RlYy0+cG93ZXJfbG9jayk7Ci0JY29kZWMtPnBvd2VyX2NvdW50ICs9IGRlbHRhOwotCXRyYWNlX2hkYV9wb3dlcl9jb3VudChjb2RlYyk7Ci0JaWYgKGRlbHRhID4gMCkKLQkJX19zbmRfaGRhX3Bvd2VyX3VwKGNvZGVjLCBkM3dhaXQpOwotCWVsc2UKLQkJX19zbmRfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOwotCXNwaW5fdW5sb2NrKCZjb2RlYy0+cG93ZXJfbG9jayk7CisJc3RydWN0IGhkYV9jb2RlYyAqYzsKKworCWxpc3RfZm9yX2VhY2hfY29kZWMoYywgYnVzKQorCQljb2RlY19zZXRfcG93ZXJfc2F2ZShjLCBkZWxheSk7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX3Bvd2VyX3NhdmUpOworRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9zZXRfcG93ZXJfc2F2ZSk7CiAKIC8qKgogICogc25kX2hkYV9jaGVja19hbXBfbGlzdF9wb3dlciAtIENoZWNrIHRoZSBhbXAgbGlzdCBhbmQgdXBkYXRlIHRoZSBwb3dlcgpAQCAtNTE4Nyw3ICszOTUxLDcgQEAKIAkJCWlmICghKHYgJiBIREFfQU1QX01VVEUpICYmIHYgPiAwKSB7CiAJCQkJaWYgKCFjaGVjay0+cG93ZXJfb24pIHsKIAkJCQkJY2hlY2stPnBvd2VyX29uID0gMTsKLQkJCQkJc25kX2hkYV9wb3dlcl91cChjb2RlYyk7CisJCQkJCXNuZF9oZGFfcG93ZXJfdXBfcG0oY29kZWMpOwogCQkJCX0KIAkJCQlyZXR1cm4gMTsKIAkJCX0KQEAgLTUxOTUsNyArMzk1OSw3IEBACiAJfQogCWlmIChjaGVjay0+cG93ZXJfb24pIHsKIAkJY2hlY2stPnBvd2VyX29uID0gMDsKLQkJc25kX2hkYV9wb3dlcl9kb3duKGNvZGVjKTsKKwkJc25kX2hkYV9wb3dlcl9kb3duX3BtKGNvZGVjKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC01MjAzLDg4ICszOTY3LDYgQEAKICNlbmRpZgogCiAvKgotICogQ2hhbm5lbCBtb2RlIGhlbHBlcgotICovCi0KLS8qKgotICogc25kX2hkYV9jaF9tb2RlX2luZm8gLSBJbmZvIGNhbGxiYWNrIGhlbHBlciBmb3IgdGhlIGNoYW5uZWwgbW9kZSBlbnVtCi0gKiBAY29kZWM6IHRoZSBIREEgY29kZWMKLSAqIEB1aW5mbzogcG9pbnRlciB0byBnZXQvc3RvcmUgdGhlIGRhdGEKLSAqIEBjaG1vZGU6IGNoYW5uZWwgbW9kZSBhcnJheQotICogQG51bV9jaG1vZGVzOiBjaGFubmVsIG1vZGUgYXJyYXkgc2l6ZQotICovCi1pbnQgc25kX2hkYV9jaF9tb2RlX2luZm8oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbywKLQkJCSBjb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSAqY2htb2RlLAotCQkJIGludCBudW1fY2htb2RlcykKLXsKLQl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKLQl1aW5mby0+Y291bnQgPSAxOwotCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gbnVtX2NobW9kZXM7Ci0JaWYgKHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPj0gbnVtX2NobW9kZXMpCi0JCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBudW1fY2htb2RlcyAtIDE7Ci0Jc3ByaW50Zih1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5uYW1lLCAiJWRjaCIsCi0JCWNobW9kZVt1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtXS5jaGFubmVscyk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2NoX21vZGVfaW5mbyk7Ci0KLS8qKgotICogc25kX2hkYV9jaF9tb2RlX2dldCAtIEdldCBjYWxsYmFjayBoZWxwZXIgZm9yIHRoZSBjaGFubmVsIG1vZGUgZW51bQotICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCi0gKiBAdWNvbnRyb2w6IHBvaW50ZXIgdG8gZ2V0L3N0b3JlIHRoZSBkYXRhCi0gKiBAY2htb2RlOiBjaGFubmVsIG1vZGUgYXJyYXkKLSAqIEBudW1fY2htb2RlczogY2hhbm5lbCBtb2RlIGFycmF5IHNpemUKLSAqIEBtYXhfY2hhbm5lbHM6IG1heCBudW1iZXIgb2YgY2hhbm5lbHMKLSAqLwotaW50IHNuZF9oZGFfY2hfbW9kZV9nZXQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCwKLQkJCWNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlICpjaG1vZGUsCi0JCQlpbnQgbnVtX2NobW9kZXMsCi0JCQlpbnQgbWF4X2NoYW5uZWxzKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9jaG1vZGVzOyBpKyspIHsKLQkJaWYgKG1heF9jaGFubmVscyA9PSBjaG1vZGVbaV0uY2hhbm5lbHMpIHsKLQkJCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2NoX21vZGVfZ2V0KTsKLQotLyoqCi0gKiBzbmRfaGRhX2NoX21vZGVfcHV0IC0gUHV0IGNhbGxiYWNrIGhlbHBlciBmb3IgdGhlIGNoYW5uZWwgbW9kZSBlbnVtCi0gKiBAY29kZWM6IHRoZSBIREEgY29kZWMKLSAqIEB1Y29udHJvbDogcG9pbnRlciB0byBnZXQvc3RvcmUgdGhlIGRhdGEKLSAqIEBjaG1vZGU6IGNoYW5uZWwgbW9kZSBhcnJheQotICogQG51bV9jaG1vZGVzOiBjaGFubmVsIG1vZGUgYXJyYXkgc2l6ZQotICogQG1heF9jaGFubmVsc3A6IHBvaW50ZXIgdG8gc3RvcmUgdGhlIG1heCBjaGFubmVscwotICovCi1pbnQgc25kX2hkYV9jaF9tb2RlX3B1dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sLAotCQkJY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgKmNobW9kZSwKLQkJCWludCBudW1fY2htb2RlcywKLQkJCWludCAqbWF4X2NoYW5uZWxzcCkKLXsKLQl1bnNpZ25lZCBpbnQgbW9kZTsKLQotCW1vZGUgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOwotCWlmIChtb2RlID49IG51bV9jaG1vZGVzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoKm1heF9jaGFubmVsc3AgPT0gY2htb2RlW21vZGVdLmNoYW5uZWxzKQotCQlyZXR1cm4gMDsKLQkvKiBjaGFuZ2UgdGhlIGN1cnJlbnQgY2hhbm5lbCBzZXR0aW5nICovCi0JKm1heF9jaGFubmVsc3AgPSBjaG1vZGVbbW9kZV0uY2hhbm5lbHM7Ci0JaWYgKGNobW9kZVttb2RlXS5zZXF1ZW5jZSkKLQkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZV9jYWNoZShjb2RlYywgY2htb2RlW21vZGVdLnNlcXVlbmNlKTsKLQlyZXR1cm4gMTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfY2hfbW9kZV9wdXQpOwotCi0vKgogICogaW5wdXQgTVVYIGhlbHBlcgogICovCiAKQEAgLTU0MTgsMjQgKzQxMDAsNiBAQAogfQogCiAvKioKLSAqIHNuZF9oZGFfYnVzX3JlYm9vdF9ub3RpZnkgLSBjYWxsIHRoZSByZWJvb3Qgbm90aWZpZXIgb2YgZWFjaCBjb2RlYwotICogQGJ1czogSEQtYXVkaW8gYnVzCi0gKi8KLXZvaWQgc25kX2hkYV9idXNfcmVib290X25vdGlmeShzdHJ1Y3QgaGRhX2J1cyAqYnVzKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwotCi0JaWYgKCFidXMpCi0JCXJldHVybjsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7Ci0JCWlmIChoZGFfY29kZWNfaXNfcG93ZXJfb24oY29kZWMpICYmCi0JCSAgICBjb2RlYy0+cGF0Y2hfb3BzLnJlYm9vdF9ub3RpZnkpCi0JCQljb2RlYy0+cGF0Y2hfb3BzLnJlYm9vdF9ub3RpZnkoY29kZWMpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfYnVzX3JlYm9vdF9ub3RpZnkpOwotCi0vKioKICAqIHNuZF9oZGFfbXVsdGlfb3V0X2RpZ19vcGVuIC0gb3BlbiB0aGUgZGlnaXRhbCBvdXQgaW4gdGhlIGV4Y2x1c2l2ZSBtb2RlCiAgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKICAqIEBtb3V0OiBoZGFfbXVsdGlfb3V0IG9iamVjdApAQCAtNTgyNSwxMjMgKzQ0ODksMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfYWRkX2ltdXhfaXRlbSk7CiAKLQotI2lmZGVmIENPTkZJR19QTQotLyoKLSAqIHBvd2VyIG1hbmFnZW1lbnQKLSAqLwotCi0KLXN0YXRpYyB2b2lkIGhkYV9hc3luY19zdXNwZW5kKHZvaWQgKmRhdGEsIGFzeW5jX2Nvb2tpZV90IGNvb2tpZSkKLXsKLQloZGFfY2FsbF9jb2RlY19zdXNwZW5kKGRhdGEsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgaGRhX2FzeW5jX3Jlc3VtZSh2b2lkICpkYXRhLCBhc3luY19jb29raWVfdCBjb29raWUpCi17Ci0JaGRhX2NhbGxfY29kZWNfcmVzdW1lKGRhdGEpOwotfQotCiAvKioKLSAqIHNuZF9oZGFfc3VzcGVuZCAtIHN1c3BlbmQgdGhlIGNvZGVjcwotICogQGJ1czogdGhlIEhEQSBidXMKLSAqCi0gKiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bC4KKyAqIHNuZF9oZGFfYnVzX3Jlc2V0IC0gUmVzZXQgdGhlIGJ1cworICogQGJ1czogSEQtYXVkaW8gYnVzCiAgKi8KLWludCBzbmRfaGRhX3N1c3BlbmQoc3RydWN0IGhkYV9idXMgKmJ1cykKK3ZvaWQgc25kX2hkYV9idXNfcmVzZXQoc3RydWN0IGhkYV9idXMgKmJ1cykKIHsKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKLQlBU1lOQ19ET01BSU5fRVhDTFVTSVZFKGRvbWFpbik7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvZGVjLCAmYnVzLT5jb2RlY19saXN0LCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9jb2RlYyhjb2RlYywgYnVzKSB7CisJCS8qIEZJWE1FOiBtYXliZSBhIGJldHRlciB3YXkgbmVlZGVkIGZvciBmb3JjZWQgcmVzZXQgKi8KIAkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjb2RlYy0+amFja3BvbGxfd29yayk7CisjaWZkZWYgQ09ORklHX1BNCiAJCWlmIChoZGFfY29kZWNfaXNfcG93ZXJfb24oY29kZWMpKSB7Ci0JCQlpZiAoYnVzLT5udW1fY29kZWNzID4gMSkKLQkJCQlhc3luY19zY2hlZHVsZV9kb21haW4oaGRhX2FzeW5jX3N1c3BlbmQsIGNvZGVjLAotCQkJCQkJICAgICAgJmRvbWFpbik7Ci0JCQllbHNlCi0JCQkJaGRhX2NhbGxfY29kZWNfc3VzcGVuZChjb2RlYywgZmFsc2UpOwotCQl9Ci0JfQotCi0JaWYgKGJ1cy0+bnVtX2NvZGVjcyA+IDEpCi0JCWFzeW5jX3N5bmNocm9uaXplX2Z1bGxfZG9tYWluKCZkb21haW4pOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX3N1c3BlbmQpOwotCi0vKioKLSAqIHNuZF9oZGFfcmVzdW1lIC0gcmVzdW1lIHRoZSBjb2RlY3MKLSAqIEBidXM6IHRoZSBIREEgYnVzCi0gKgotICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwuCi0gKi8KLWludCBzbmRfaGRhX3Jlc3VtZShzdHJ1Y3QgaGRhX2J1cyAqYnVzKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwotCUFTWU5DX0RPTUFJTl9FWENMVVNJVkUoZG9tYWluKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZidXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGJ1cy0+bnVtX2NvZGVjcyA+IDEpCi0JCQlhc3luY19zY2hlZHVsZV9kb21haW4oaGRhX2FzeW5jX3Jlc3VtZSwgY29kZWMsICZkb21haW4pOwotCQllbHNlCisJCQloZGFfY2FsbF9jb2RlY19zdXNwZW5kKGNvZGVjKTsKIAkJCWhkYV9jYWxsX2NvZGVjX3Jlc3VtZShjb2RlYyk7CisJCX0KKyNlbmRpZgogCX0KLQotCWlmIChidXMtPm51bV9jb2RlY3MgPiAxKQotCQlhc3luY19zeW5jaHJvbml6ZV9mdWxsX2RvbWFpbigmZG9tYWluKTsKLQotCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9yZXN1bWUpOwotI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCi0vKgotICogZ2VuZXJpYyBhcnJheXMKLSAqLwotCi0vKioKLSAqIHNuZF9hcnJheV9uZXcgLSBnZXQgYSBuZXcgZWxlbWVudCBmcm9tIHRoZSBnaXZlbiBhcnJheQotICogQGFycmF5OiB0aGUgYXJyYXkgb2JqZWN0Ci0gKgotICogR2V0IGEgbmV3IGVsZW1lbnQgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuICBJZiBpdCBleGNlZWRzIHRoZQotICogcHJlLWFsbG9jYXRlZCBhcnJheSBzaXplLCByZS1hbGxvY2F0ZSB0aGUgYXJyYXkuCi0gKgotICogUmV0dXJucyBOVUxMIGlmIGFsbG9jYXRpb24gZmFpbGVkLgotICovCi12b2lkICpzbmRfYXJyYXlfbmV3KHN0cnVjdCBzbmRfYXJyYXkgKmFycmF5KQotewotCWlmIChzbmRfQlVHX09OKCFhcnJheS0+ZWxlbV9zaXplKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKGFycmF5LT51c2VkID49IGFycmF5LT5hbGxvY2VkKSB7Ci0JCWludCBudW0gPSBhcnJheS0+YWxsb2NlZCArIGFycmF5LT5hbGxvY19hbGlnbjsKLQkJaW50IHNpemUgPSAobnVtICsgMSkgKiBhcnJheS0+ZWxlbV9zaXplOwotCQl2b2lkICpubGlzdDsKLQkJaWYgKHNuZF9CVUdfT04obnVtID49IDQwOTYpKQotCQkJcmV0dXJuIE5VTEw7Ci0JCW5saXN0ID0ga3JlYWxsb2MoYXJyYXktPmxpc3QsIHNpemUsIEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPKTsKLQkJaWYgKCFubGlzdCkKLQkJCXJldHVybiBOVUxMOwotCQlhcnJheS0+bGlzdCA9IG5saXN0OwotCQlhcnJheS0+YWxsb2NlZCA9IG51bTsKLQl9Ci0JcmV0dXJuIHNuZF9hcnJheV9lbGVtKGFycmF5LCBhcnJheS0+dXNlZCsrKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9hcnJheV9uZXcpOwotCi0vKioKLSAqIHNuZF9hcnJheV9mcmVlIC0gZnJlZSB0aGUgZ2l2ZW4gYXJyYXkgZWxlbWVudHMKLSAqIEBhcnJheTogdGhlIGFycmF5IG9iamVjdAotICovCi12b2lkIHNuZF9hcnJheV9mcmVlKHN0cnVjdCBzbmRfYXJyYXkgKmFycmF5KQotewotCWtmcmVlKGFycmF5LT5saXN0KTsKLQlhcnJheS0+dXNlZCA9IDA7Ci0JYXJyYXktPmFsbG9jZWQgPSAwOwotCWFycmF5LT5saXN0ID0gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9hcnJheV9mcmVlKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfYnVzX3Jlc2V0KTsKIAogLyoqCiAgKiBzbmRfcHJpbnRfcGNtX2JpdHMgLSBQcmludCB0aGUgc3VwcG9ydGVkIFBDTSBmbXQgYml0cyB0byB0aGUgc3RyaW5nIGJ1ZmZlcgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvZGVjLmgKaW5kZXggOWM4ODIwZi4uOTA3NWFjMiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29kZWMuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb2RlYy5oCkBAIC0yMSw0MSArMjEsMTQgQEAKICNpZm5kZWYgX19TT1VORF9IREFfQ09ERUNfSAogI2RlZmluZSBfX1NPVU5EX0hEQV9DT0RFQ19ICiAKKyNpbmNsdWRlIDxsaW51eC9rcmVmLmg+CiAjaW5jbHVkZSA8c291bmQvaW5mby5oPgogI2luY2x1ZGUgPHNvdW5kL2NvbnRyb2wuaD4KICNpbmNsdWRlIDxzb3VuZC9wY20uaD4KICNpbmNsdWRlIDxzb3VuZC9od2RlcC5oPgorI2luY2x1ZGUgPHNvdW5kL2hkYXVkaW8uaD4KICNpbmNsdWRlIDxzb3VuZC9oZGFfdmVyYnMuaD4KLQotLyoKLSAqIGdlbmVyaWMgYXJyYXlzCi0gKi8KLXN0cnVjdCBzbmRfYXJyYXkgewotCXVuc2lnbmVkIGludCB1c2VkOwotCXVuc2lnbmVkIGludCBhbGxvY2VkOwotCXVuc2lnbmVkIGludCBlbGVtX3NpemU7Ci0JdW5zaWduZWQgaW50IGFsbG9jX2FsaWduOwotCXZvaWQgKmxpc3Q7Ci19OwotCi12b2lkICpzbmRfYXJyYXlfbmV3KHN0cnVjdCBzbmRfYXJyYXkgKmFycmF5KTsKLXZvaWQgc25kX2FycmF5X2ZyZWUoc3RydWN0IHNuZF9hcnJheSAqYXJyYXkpOwotc3RhdGljIGlubGluZSB2b2lkIHNuZF9hcnJheV9pbml0KHN0cnVjdCBzbmRfYXJyYXkgKmFycmF5LCB1bnNpZ25lZCBpbnQgc2l6ZSwKLQkJCQkgIHVuc2lnbmVkIGludCBhbGlnbikKLXsKLQlhcnJheS0+ZWxlbV9zaXplID0gc2l6ZTsKLQlhcnJheS0+YWxsb2NfYWxpZ24gPSBhbGlnbjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICpzbmRfYXJyYXlfZWxlbShzdHJ1Y3Qgc25kX2FycmF5ICphcnJheSwgdW5zaWduZWQgaW50IGlkeCkKLXsKLQlyZXR1cm4gYXJyYXktPmxpc3QgKyBpZHggKiBhcnJheS0+ZWxlbV9zaXplOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzbmRfYXJyYXlfaW5kZXgoc3RydWN0IHNuZF9hcnJheSAqYXJyYXksIHZvaWQgKnB0cikKLXsKLQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpKHB0ciAtIGFycmF5LT5saXN0KSAvIGFycmF5LT5lbGVtX3NpemU7Ci19CisjaW5jbHVkZSA8c291bmQvaGRhX3JlZ21hcC5oPgogCiAvKgogICogU3RydWN0dXJlcwpAQCAtNjYsMTAgKzM5LDYgQEAKIHN0cnVjdCBoZGFfY29kZWM7CiBzdHJ1Y3QgaGRhX3BjbTsKIHN0cnVjdCBoZGFfcGNtX3N0cmVhbTsKLXN0cnVjdCBoZGFfYnVzX3Vuc29saWNpdGVkOwotCi0vKiBOSUQgdHlwZSAqLwotdHlwZWRlZiB1MTYgaGRhX25pZF90OwogCiAvKiBidXMgb3BlcmF0b3JzICovCiBzdHJ1Y3QgaGRhX2J1c19vcHMgewpAQCAtODQsMTAgKzUzLDYgQEAKIAkJCSAgc3RydWN0IGhkYV9wY20gKnBjbSk7CiAJLyogcmVzZXQgYnVzIGZvciByZXRyeSB2ZXJiICovCiAJdm9pZCAoKmJ1c19yZXNldCkoc3RydWN0IGhkYV9idXMgKmJ1cyk7Ci0jaWZkZWYgQ09ORklHX1BNCi0JLyogbm90aWZ5IHBvd2VyLXVwL2Rvd24gZnJvbSBjb2RlYyB0byBjb250cm9sbGVyICovCi0Jdm9pZCAoKnBtX25vdGlmeSkoc3RydWN0IGhkYV9idXMgKmJ1cywgYm9vbCBwb3dlcl91cCk7Ci0jZW5kaWYKICNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCiAJLyogcHJlcGFyZSBEU1AgdHJhbnNmZXIgKi8KIAlpbnQgKCpsb2FkX2RzcF9wcmVwYXJlKShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCB1bnNpZ25lZCBpbnQgZm9ybWF0LApAQCAtMTAxLDE1ICs2Niw2IEBACiAjZW5kaWYKIH07CiAKLS8qIHRlbXBsYXRlIHRvIHBhc3MgdG8gdGhlIGJ1cyBjb25zdHJ1Y3RvciAqLwotc3RydWN0IGhkYV9idXNfdGVtcGxhdGUgewotCXZvaWQgKnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgcGNpX2RldiAqcGNpOwotCWNvbnN0IGNoYXIgKm1vZGVsbmFtZTsKLQlpbnQgKnBvd2VyX3NhdmU7Ci0Jc3RydWN0IGhkYV9idXNfb3BzIG9wczsKLX07Ci0KIC8qCiAgKiBjb2RlYyBidXMKICAqCkBAIC0xMTcsNDIgKzczLDI4IEBACiAgKiBBIGhkYV9idXMgY29udGFpbnMgc2V2ZXJhbCBjb2RlY3MgaW4gdGhlIGxpc3QgY29kZWNfbGlzdC4KICAqLwogc3RydWN0IGhkYV9idXMgeworCXN0cnVjdCBoZGFjX2J1cyBjb3JlOworCiAJc3RydWN0IHNuZF9jYXJkICpjYXJkOwogCi0JLyogY29waWVkIGZyb20gdGVtcGxhdGUgKi8KIAl2b2lkICpwcml2YXRlX2RhdGE7CiAJc3RydWN0IHBjaV9kZXYgKnBjaTsKIAljb25zdCBjaGFyICptb2RlbG5hbWU7Ci0JaW50ICpwb3dlcl9zYXZlOwogCXN0cnVjdCBoZGFfYnVzX29wcyBvcHM7CiAKLQkvKiBjb2RlYyBsaW5rZWQgbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgY29kZWNfbGlzdDsKLQl1bnNpZ25lZCBpbnQgbnVtX2NvZGVjczsKLQkvKiBsaW5rIGNhZGRyIC0+IGNvZGVjICovCi0Jc3RydWN0IGhkYV9jb2RlYyAqY2FkZHJfdGJsW0hEQV9NQVhfQ09ERUNfQUREUkVTUyArIDFdOwotCi0Jc3RydWN0IG11dGV4IGNtZF9tdXRleDsKIAlzdHJ1Y3QgbXV0ZXggcHJlcGFyZV9tdXRleDsKIAotCS8qIHVuc29saWNpdGVkIGV2ZW50IHF1ZXVlICovCi0Jc3RydWN0IGhkYV9idXNfdW5zb2xpY2l0ZWQgKnVuc29sOwotCWNoYXIgd29ya3FfbmFtZVsxNl07Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxOwkvKiBjb21tb24gd29ya3F1ZXVlIGZvciBjb2RlY3MgKi8KLQogCS8qIGFzc2lnbmVkIFBDTXMgKi8KIAlERUNMQVJFX0JJVE1BUChwY21fZGV2X2JpdHMsIFNORFJWX1BDTV9ERVZJQ0VTKTsKIAogCS8qIG1pc2Mgb3AgZmxhZ3MgKi8KIAl1bnNpZ25lZCBpbnQgbmVlZHNfZGFtbl9sb25nX2RlbGF5IDoxOwogCXVuc2lnbmVkIGludCBhbGxvd19idXNfcmVzZXQ6MTsJLyogYWxsb3cgYnVzIHJlc2V0IGF0IGZhdGFsIGVycm9yICovCi0JdW5zaWduZWQgaW50IHN5bmNfd3JpdGU6MTsJLyogc3luYyBhZnRlciB2ZXJiIHdyaXRlICovCiAJLyogc3RhdHVzIGZvciBjb2RlYy9jb250cm9sbGVyICovCiAJdW5zaWduZWQgaW50IHNodXRkb3duIDoxOwkvKiBiZWluZyB1bmxvYWRlZCAqLwogCXVuc2lnbmVkIGludCByaXJiX2Vycm9yOjE7CS8qIGVycm9yIGluIGNvZGVjIGNvbW11bmljYXRpb24gKi8KIAl1bnNpZ25lZCBpbnQgcmVzcG9uc2VfcmVzZXQ6MTsJLyogY29udHJvbGxlciB3YXMgcmVzZXQgKi8KIAl1bnNpZ25lZCBpbnQgaW5fcmVzZXQ6MTsJLyogZHVyaW5nIHJlc2V0IG9wZXJhdGlvbiAqLwotCXVuc2lnbmVkIGludCBwb3dlcl9rZWVwX2xpbmtfb246MTsgLyogZG9uJ3QgcG93ZXIgb2ZmIEhEQSBsaW5rICovCiAJdW5zaWduZWQgaW50IG5vX3Jlc3BvbnNlX2ZhbGxiYWNrOjE7IC8qIGRvbid0IGZhbGxiYWNrIGF0IFJJUkIgZXJyb3IgKi8KIAogCWludCBwcmltYXJ5X2RpZ19vdXRfdHlwZTsJLyogcHJpbWFyeSBkaWdpdGFsIG91dCBQQ00gdHlwZSAqLwpAQCAtMTc1LDE1ICsxMTcsMjIgQEAKIAlpbnQgKCpwYXRjaCkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogfTsKIAkKLXN0cnVjdCBoZGFfY29kZWNfcHJlc2V0X2xpc3QgeworI2RlZmluZSBIREFfQ09ERUNfSURfR0VORVJJQ19IRE1JCTB4MDAwMDAxMDEKKyNkZWZpbmUgSERBX0NPREVDX0lEX0dFTkVSSUMJCTB4MDAwMDAyMDEKKworc3RydWN0IGhkYV9jb2RlY19kcml2ZXIgeworCXN0cnVjdCBoZGFjX2RyaXZlciBjb3JlOwogCWNvbnN0IHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0ICpwcmVzZXQ7Ci0Jc3RydWN0IG1vZHVsZSAqb3duZXI7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwogfTsKIAotLyogaW5pdGlhbCBob29rICovCi1pbnQgc25kX2hkYV9hZGRfY29kZWNfcHJlc2V0KHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0X2xpc3QgKnByZXNldCk7Ci1pbnQgc25kX2hkYV9kZWxldGVfY29kZWNfcHJlc2V0KHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0X2xpc3QgKnByZXNldCk7CitpbnQgX19oZGFfY29kZWNfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBoZGFfY29kZWNfZHJpdmVyICpkcnYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgICAgICAgc3RydWN0IG1vZHVsZSAqb3duZXIpOworI2RlZmluZSBoZGFfY29kZWNfZHJpdmVyX3JlZ2lzdGVyKGRydikgXAorCV9faGRhX2NvZGVjX2RyaXZlcl9yZWdpc3RlcihkcnYsIEtCVUlMRF9NT0ROQU1FLCBUSElTX01PRFVMRSkKK3ZvaWQgaGRhX2NvZGVjX2RyaXZlcl91bnJlZ2lzdGVyKHN0cnVjdCBoZGFfY29kZWNfZHJpdmVyICpkcnYpOworI2RlZmluZSBtb2R1bGVfaGRhX2NvZGVjX2RyaXZlcihkcnYpIFwKKwltb2R1bGVfZHJpdmVyKGRydiwgaGRhX2NvZGVjX2RyaXZlcl9yZWdpc3RlciwgXAorCQkgICAgICBoZGFfY29kZWNfZHJpdmVyX3VucmVnaXN0ZXIpCiAKIC8qIG9wcyBzZXQgYnkgdGhlIHByZXNldCBwYXRjaCAqLwogc3RydWN0IGhkYV9jb2RlY19vcHMgewpAQCAtMjAwLDI1ICsxNDksNyBAQAogCWludCAoKmNoZWNrX3Bvd2VyX3N0YXR1cykoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpOwogI2VuZGlmCiAJdm9pZCAoKnJlYm9vdF9ub3RpZnkpKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKLX07Ci0KLS8qIHJlY29yZCBmb3IgYW1wIGluZm9ybWF0aW9uIGNhY2hlICovCi1zdHJ1Y3QgaGRhX2NhY2hlX2hlYWQgewotCXUzMiBrZXk6MzE7CQkvKiBoYXNoIGtleSAqLwotCXUzMiBkaXJ0eToxOwotCXUxNiB2YWw7CQkvKiBhc3NpZ25lZCB2YWx1ZSAqLwotCXUxNiBuZXh0OwotfTsKLQotc3RydWN0IGhkYV9hbXBfaW5mbyB7Ci0Jc3RydWN0IGhkYV9jYWNoZV9oZWFkIGhlYWQ7Ci0JdTMyIGFtcF9jYXBzOwkJLyogYW1wIGNhcGFiaWxpdGllcyAqLwotCXUxNiB2b2xbMl07CQkvKiBjdXJyZW50IHZvbHVtZSAmIG11dGUgKi8KLX07Ci0KLXN0cnVjdCBoZGFfY2FjaGVfcmVjIHsKLQl1MTYgaGFzaFs2NF07CQkJLyogaGFzaCB0YWJsZSBmb3IgaW5kZXggKi8KLQlzdHJ1Y3Qgc25kX2FycmF5IGJ1ZjsJCS8qIHJlY29yZCBlbnRyaWVzICovCisJdm9pZCAoKnN0cmVhbV9wbSkoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGJvb2wgb24pOwogfTsKIAogLyogUENNIGNhbGxiYWNrcyAqLwpAQCAtMjY3LDQxICsxOTgsMjkgQEAKIAlpbnQgZGV2aWNlOwkJLyogZGV2aWNlIG51bWJlciB0byBhc3NpZ24gKi8KIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtOwkvKiBhc3NpZ25lZCBQQ00gaW5zdGFuY2UgKi8KIAlib29sIG93bl9jaG1hcDsJCS8qIGNvZGVjIGRyaXZlciBwcm92aWRlcyBvd24gY2hhbm5lbCBtYXBzICovCisJLyogcHJpdmF0ZTogKi8KKwlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIH07CiAKIC8qIGNvZGVjIGluZm9ybWF0aW9uICovCiBzdHJ1Y3QgaGRhX2NvZGVjIHsKLQlzdHJ1Y3QgZGV2aWNlIGRldjsKKwlzdHJ1Y3QgaGRhY19kZXZpY2UgY29yZTsKIAlzdHJ1Y3QgaGRhX2J1cyAqYnVzOworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZDsKIAl1bnNpZ25lZCBpbnQgYWRkcjsJLyogY29kZWMgYWRkciovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkvKiBsaXN0IHBvaW50ICovCi0KLQloZGFfbmlkX3QgYWZnOwkvKiBBRkcgbm9kZSBpZCAqLwotCWhkYV9uaWRfdCBtZmc7CS8qIE1GRyBub2RlIGlkICovCi0KLQkvKiBpZHMgKi8KLQl1OCBhZmdfZnVuY3Rpb25faWQ7Ci0JdTggbWZnX2Z1bmN0aW9uX2lkOwotCXU4IGFmZ191bnNvbDsKLQl1OCBtZmdfdW5zb2w7Ci0JdTMyIHZlbmRvcl9pZDsKLQl1MzIgc3Vic3lzdGVtX2lkOwotCXUzMiByZXZpc2lvbl9pZDsKKwl1MzIgcHJvYmVfaWQ7IC8qIG92ZXJyaWRkZW4gaWQgZm9yIHByb2JpbmcgKi8KIAogCS8qIGRldGVjdGVkIHByZXNldCAqLwogCWNvbnN0IHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0ICpwcmVzZXQ7Ci0Jc3RydWN0IG1vZHVsZSAqb3duZXI7Ci0JaW50ICgqcGFyc2VyKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Ci0JY29uc3QgY2hhciAqdmVuZG9yX25hbWU7CS8qIGNvZGVjIHZlbmRvciBuYW1lICovCi0JY29uc3QgY2hhciAqY2hpcF9uYW1lOwkJLyogY29kZWMgY2hpcCBuYW1lICovCiAJY29uc3QgY2hhciAqbW9kZWxuYW1lOwkvKiBtb2RlbCBuYW1lIGZvciBwcmVzZXQgKi8KIAogCS8qIHNldCBieSBwYXRjaCAqLwogCXN0cnVjdCBoZGFfY29kZWNfb3BzIHBhdGNoX29wczsKIAogCS8qIFBDTSB0byBjcmVhdGUsIHNldCBieSBwYXRjaF9vcHMuYnVpbGRfcGNtcyBjYWxsYmFjayAqLwotCXVuc2lnbmVkIGludCBudW1fcGNtczsKLQlzdHJ1Y3QgaGRhX3BjbSAqcGNtX2luZm87CisJc3RydWN0IGxpc3RfaGVhZCBwY21fbGlzdF9oZWFkOwogCiAJLyogY29kZWMgc3BlY2lmaWMgaW5mbyAqLwogCXZvaWQgKnNwZWM7CkBAIC0zMTEsMjEgKzIzMCwxNSBAQAogCXVuc2lnbmVkIGludCBiZWVwX21vZGU7CiAKIAkvKiB3aWRnZXQgY2FwYWJpbGl0aWVzIGNhY2hlICovCi0JdW5zaWduZWQgaW50IG51bV9ub2RlczsKLQloZGFfbmlkX3Qgc3RhcnRfbmlkOwogCXUzMiAqd2NhcHM7CiAKIAlzdHJ1Y3Qgc25kX2FycmF5IG1peGVyczsJLyogbGlzdCBvZiBhc3NpZ25lZCBtaXhlciBlbGVtZW50cyAqLwogCXN0cnVjdCBzbmRfYXJyYXkgbmlkczsJCS8qIGxpc3Qgb2YgbWFwcGVkIG1peGVyIGVsZW1lbnRzICovCiAKLQlzdHJ1Y3QgaGRhX2NhY2hlX3JlYyBhbXBfY2FjaGU7CS8qIGNhY2hlIGZvciBhbXAgYWNjZXNzICovCi0Jc3RydWN0IGhkYV9jYWNoZV9yZWMgY21kX2NhY2hlOwkvKiBjYWNoZSBmb3Igb3RoZXIgY29tbWFuZHMgKi8KLQogCXN0cnVjdCBsaXN0X2hlYWQgY29ubl9saXN0OwkvKiBsaW5rZWQtbGlzdCBvZiBjb25uZWN0aW9uLWxpc3QgKi8KIAogCXN0cnVjdCBtdXRleCBzcGRpZl9tdXRleDsKIAlzdHJ1Y3QgbXV0ZXggY29udHJvbF9tdXRleDsKLQlzdHJ1Y3QgbXV0ZXggaGFzaF9tdXRleDsKIAlzdHJ1Y3Qgc25kX2FycmF5IHNwZGlmX291dDsKIAl1bnNpZ25lZCBpbnQgc3BkaWZfaW5fZW5hYmxlOwkvKiBTUERJRiBpbnB1dCBlbmFibGU/ICovCiAJY29uc3QgaGRhX25pZF90ICpzbGF2ZV9kaWdfb3V0czsgLyogb3B0aW9uYWwgZGlnaXRhbCBvdXQgc2xhdmUgd2lkZ2V0cyAqLwpAQCAtMzQ1LDYgKzI1OCw4IEBACiAjZW5kaWYKIAogCS8qIG1pc2MgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQgaW5fZnJlZWluZzoxOyAvKiBiZWluZyByZWxlYXNlZCAqLworCXVuc2lnbmVkIGludCByZWdpc3RlcmVkOjE7IC8qIGNvZGVjIHdhcyByZWdpc3RlcmVkICovCiAJdW5zaWduZWQgaW50IHNwZGlmX3N0YXR1c19yZXNldCA6MTsgLyogbmVlZHMgdG8gdG9nZ2xlIFNQRElGIGZvciBlYWNoCiAJCQkJCSAgICAgKiBzdGF0dXMgY2hhbmdlCiAJCQkJCSAgICAgKiAoZS5nLiBSZWFsdGVrIGNvZGVjcykKQEAgLTM2MiwyMiArMjc3LDE0IEBACiAJdW5zaWduZWQgaW50IGludl9lYXBkOjE7IC8qIGJyb2tlbiBoL3c6IGludmVydGVkIEVBUEQgY29udHJvbCAqLwogCXVuc2lnbmVkIGludCBpbnZfamFja19kZXRlY3Q6MTsJLyogYnJva2VuIGgvdzogaW52ZXJ0ZWQgZGV0ZWN0aW9uIGJpdCAqLwogCXVuc2lnbmVkIGludCBwY21fZm9ybWF0X2ZpcnN0OjE7IC8qIFBDTSBmb3JtYXQgbXVzdCBiZSBzZXQgZmlyc3QgKi8KLQl1bnNpZ25lZCBpbnQgZXBzczoxOwkJLyogc3VwcG9ydGluZyBFUFNTPyAqLwogCXVuc2lnbmVkIGludCBjYWNoZWRfd3JpdGU6MTsJLyogd3JpdGUgb25seSB0byBjYWNoZXMgKi8KIAl1bnNpZ25lZCBpbnQgZHBfbXN0OjE7IC8qIHN1cHBvcnQgRFAxLjIgTXVsdGktc3RyZWFtIHRyYW5zcG9ydCAqLwogCXVuc2lnbmVkIGludCBkdW1wX2NvZWY6MTsgLyogZHVtcCBwcm9jZXNzaW5nIGNvZWZzIGluIGNvZGVjIHByb2MgZmlsZSAqLworCXVuc2lnbmVkIGludCBwb3dlcl9zYXZlX25vZGU6MTsgLyogYWR2YW5jZWQgUE0gZm9yIGVhY2ggd2lkZ2V0ICovCiAjaWZkZWYgQ09ORklHX1BNCi0JdW5zaWduZWQgaW50IHBvd2VyX29uIDoxOwkvKiBjdXJyZW50IChnbG9iYWwpIHBvd2VyLXN0YXRlICovCi0JdW5zaWduZWQgaW50IGQzX3N0b3BfY2xrOjE7CS8qIHN1cHBvcnQgRDMgb3BlcmF0aW9uIHdpdGhvdXQgQkNMSyAqLwotCXVuc2lnbmVkIGludCBwbV91cF9ub3RpZmllZDoxOwkvKiBQTSBub3RpZmllZCB0byBjb250cm9sbGVyICovCi0JdW5zaWduZWQgaW50IGluX3BtOjE7CQkvKiBzdXNwZW5kL3Jlc3VtZSBiZWluZyBwZXJmb3JtZWQgKi8KLQlpbnQgcG93ZXJfdHJhbnNpdGlvbjsJLyogcG93ZXItc3RhdGUgaW4gdHJhbnNpdGlvbiAqLwotCWludCBwb3dlcl9jb3VudDsJLyogY3VycmVudCAoZ2xvYmFsKSBwb3dlciByZWZjb3VudCAqLwotCXN0cnVjdCBkZWxheWVkX3dvcmsgcG93ZXJfd29yazsgLyogZGVsYXllZCB0YXNrIGZvciBwb3dlcmRvd24gKi8KIAl1bnNpZ25lZCBsb25nIHBvd2VyX29uX2FjY3Q7CiAJdW5zaWduZWQgbG9uZyBwb3dlcl9vZmZfYWNjdDsKIAl1bnNpZ25lZCBsb25nIHBvd2VyX2ppZmZpZXM7Ci0Jc3BpbmxvY2tfdCBwb3dlcl9sb2NrOwogI2VuZGlmCiAKIAkvKiBmaWx0ZXIgdGhlIHJlcXVlc3RlZCBwb3dlciBzdGF0ZSBwZXIgbmlkICovCkBAIC00MDksMTAgKzMxNiwxMSBAQAogCXN0cnVjdCBzbmRfYXJyYXkgdmVyYnM7CiB9OwogCi0vKiBkaXJlY3Rpb24gKi8KLWVudW0gewotCUhEQV9JTlBVVCwgSERBX09VVFBVVAotfTsKKyNkZWZpbmUgZGV2X3RvX2hkYV9jb2RlYyhfZGV2KQljb250YWluZXJfb2YoX2Rldiwgc3RydWN0IGhkYV9jb2RlYywgY29yZS5kZXYpCisjZGVmaW5lIGhkYV9jb2RlY19kZXYoX2RldikJKCYoX2RldiktPmNvcmUuZGV2KQorCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfY29kZWMoYywgYnVzKSBcCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmKGJ1cyktPmNvcmUuY29kZWNfbGlzdCwgY29yZS5saXN0KQogCiAvKiBzbmRfaGRhX2NvZGVjX3JlYWQvd3JpdGUgb3B0aW9uYWwgZmxhZ3MgKi8KICNkZWZpbmUgSERBX1JXX05PX1JFU1BPTlNFX0ZBTExCQUNLCSgxIDw8IDApCkBAIC00MjAsMTAgKzMyOCw5IEBACiAvKgogICogY29uc3RydWN0b3JzCiAgKi8KLWludCBzbmRfaGRhX2J1c19uZXcoc3RydWN0IHNuZF9jYXJkICpjYXJkLCBjb25zdCBzdHJ1Y3QgaGRhX2J1c190ZW1wbGF0ZSAqdGVtcCwKLQkJICAgIHN0cnVjdCBoZGFfYnVzICoqYnVzcCk7Ci1pbnQgc25kX2hkYV9jb2RlY19uZXcoc3RydWN0IGhkYV9idXMgKmJ1cywgdW5zaWduZWQgaW50IGNvZGVjX2FkZHIsCi0JCSAgICAgIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApOworaW50IHNuZF9oZGFfYnVzX25ldyhzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQsIHN0cnVjdCBoZGFfYnVzICoqYnVzcCk7CitpbnQgc25kX2hkYV9jb2RlY19uZXcoc3RydWN0IGhkYV9idXMgKmJ1cywgc3RydWN0IHNuZF9jYXJkICpjYXJkLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY29kZWNfYWRkciwgc3RydWN0IGhkYV9jb2RlYyAqKmNvZGVjcCk7CiBpbnQgc25kX2hkYV9jb2RlY19jb25maWd1cmUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogaW50IHNuZF9oZGFfY29kZWNfdXBkYXRlX3dpZGdldHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogCkBAIC00MzYsOSArMzQzLDkgQEAKIGludCBzbmRfaGRhX2NvZGVjX3dyaXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBpbnQgZmxhZ3MsCiAJCQl1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IHBhcm0pOwogI2RlZmluZSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgcGFyYW0pIFwKLQlzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9QQVJBTUVURVJTLCBwYXJhbSkKLWludCBzbmRfaGRhX2dldF9zdWJfbm9kZXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkgIGhkYV9uaWRfdCAqc3RhcnRfaWQpOworCXNuZF9oZGFjX3JlYWRfcGFybSgmKGNvZGVjKS0+Y29yZSwgbmlkLCBwYXJhbSkKKyNkZWZpbmUgc25kX2hkYV9nZXRfc3ViX25vZGVzKGNvZGVjLCBuaWQsIHN0YXJ0X25pZCkgXAorCXNuZF9oZGFjX2dldF9zdWJfbm9kZXMoJihjb2RlYyktPmNvcmUsIG5pZCwgc3RhcnRfbmlkKQogaW50IHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAogCQkJICAgIGhkYV9uaWRfdCAqY29ubl9saXN0LCBpbnQgbWF4X2Nvbm5zKTsKIHN0YXRpYyBpbmxpbmUgaW50CkBAIC00NDYsOSArMzUzLDEyIEBACiB7CiAJcmV0dXJuIHNuZF9oZGFfZ2V0X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsIE5VTEwsIDApOwogfQotaW50IHNuZF9oZGFfZ2V0X251bV9yYXdfY29ubnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpOwotaW50IHNuZF9oZGFfZ2V0X3Jhd19jb25uZWN0aW9ucyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKLQkJCSAgICBoZGFfbmlkX3QgKmNvbm5fbGlzdCwgaW50IG1heF9jb25ucyk7CisKKyNkZWZpbmUgc25kX2hkYV9nZXRfcmF3X2Nvbm5lY3Rpb25zKGNvZGVjLCBuaWQsIGxpc3QsIG1heF9jb25ucykgXAorCXNuZF9oZGFjX2dldF9jb25uZWN0aW9ucygmKGNvZGVjKS0+Y29yZSwgbmlkLCBsaXN0LCBtYXhfY29ubnMpCisjZGVmaW5lIHNuZF9oZGFfZ2V0X251bV9yYXdfY29ubnMoY29kZWMsIG5pZCkgXAorCXNuZF9oZGFjX2dldF9jb25uZWN0aW9ucygmKGNvZGVjKS0+Y29yZSwgbmlkLCBOVUxMLCAwKTsKKwogaW50IHNuZF9oZGFfZ2V0X2Nvbm5fbGlzdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKIAkJCSAgY29uc3QgaGRhX25pZF90ICoqbGlzdHApOwogaW50IHNuZF9oZGFfb3ZlcnJpZGVfY29ubl9saXN0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBpbnQgbnVtcywKQEAgLTQ3MCwxOCArMzgwLDIyIEBACiAJCQkgICAgY29uc3Qgc3RydWN0IGhkYV92ZXJiICpzZXEpOwogCiAvKiB1bnNvbGljaXRlZCBldmVudCAqLwotaW50IHNuZF9oZGFfcXVldWVfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9idXMgKmJ1cywgdTMyIHJlcywgdTMyIHJlc19leCk7CitzdGF0aWMgaW5saW5lIHZvaWQKK3NuZF9oZGFfcXVldWVfdW5zb2xfZXZlbnQoc3RydWN0IGhkYV9idXMgKmJ1cywgdTMyIHJlcywgdTMyIHJlc19leCkKK3sKKwlzbmRfaGRhY19idXNfcXVldWVfZXZlbnQoJmJ1cy0+Y29yZSwgcmVzLCByZXNfZXgpOworfQogCiAvKiBjYWNoZWQgd3JpdGUgKi8KLWludCBzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAotCQkJICAgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IHBhcm0pOwotdm9pZCBzbmRfaGRhX3NlcXVlbmNlX3dyaXRlX2NhY2hlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJCSAgY29uc3Qgc3RydWN0IGhkYV92ZXJiICpzZXEpOwotaW50IHNuZF9oZGFfY29kZWNfdXBkYXRlX2NhY2hlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAotCQkJICAgICAgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgdmVyYiwgdW5zaWduZWQgaW50IHBhcm0pOwotdm9pZCBzbmRfaGRhX2NvZGVjX3Jlc3VtZV9jYWNoZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Ci0vKiBib3RoIGZvciBjbWQgJiBhbXAgY2FjaGVzICovCi12b2lkIHNuZF9oZGFfY29kZWNfZmx1c2hfY2FjaGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOworc3RhdGljIGlubGluZSBpbnQKK3NuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgIGludCBmbGFncywgdW5zaWduZWQgaW50IHZlcmIsIHVuc2lnbmVkIGludCBwYXJtKQoreworCXJldHVybiBzbmRfaGRhY19yZWdtYXBfd3JpdGUoJmNvZGVjLT5jb3JlLCBuaWQsIHZlcmIsIHBhcm0pOworfQorCisjZGVmaW5lIHNuZF9oZGFfY29kZWNfdXBkYXRlX2NhY2hlKGNvZGVjLCBuaWQsIGZsYWdzLCB2ZXJiLCBwYXJtKSBcCisJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgbmlkLCBmbGFncywgdmVyYiwgcGFybSkKIAogLyogdGhlIHN0cnVjdCBmb3IgY29kZWMtPnBpbl9jb25maWdzICovCiBzdHJ1Y3QgaGRhX3BpbmNmZyB7CkBAIC01MTIsMTUgKzQyNiwyNCBAQAogLyoKICAqIE1peGVyCiAgKi8KLWludCBzbmRfaGRhX2J1aWxkX2NvbnRyb2xzKHN0cnVjdCBoZGFfYnVzICpidXMpOwogaW50IHNuZF9oZGFfY29kZWNfYnVpbGRfY29udHJvbHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogCiAvKgogICogUENNCiAgKi8KLWludCBzbmRfaGRhX2J1aWxkX3BjbXMoc3RydWN0IGhkYV9idXMgKmJ1cyk7CitpbnQgc25kX2hkYV9jb2RlY19wYXJzZV9wY21zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKTsKIGludCBzbmRfaGRhX2NvZGVjX2J1aWxkX3BjbXMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwogCitfX3ByaW50ZigyLCAzKQorc3RydWN0IGhkYV9wY20gKnNuZF9oZGFfY29kZWNfcGNtX25ldyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaGRhX2NvZGVjX3BjbV9nZXQoc3RydWN0IGhkYV9wY20gKnBjbSkKK3sKKwlrcmVmX2dldCgmcGNtLT5rcmVmKTsKK30KK3ZvaWQgc25kX2hkYV9jb2RlY19wY21fcHV0KHN0cnVjdCBoZGFfcGNtICpwY20pOworCiBpbnQgc25kX2hkYV9jb2RlY19wcmVwYXJlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJICBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAogCQkJICB1bnNpZ25lZCBpbnQgc3RyZWFtLApAQCAtNTUyLDIwICs0NzUsMTcgQEAKICAqIE1pc2MKICAqLwogdm9pZCBzbmRfaGRhX2dldF9jb2RlY19uYW1lKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7Ci12b2lkIHNuZF9oZGFfYnVzX3JlYm9vdF9ub3RpZnkoc3RydWN0IGhkYV9idXMgKmJ1cyk7CiB2b2lkIHNuZF9oZGFfY29kZWNfc2V0X3Bvd2VyX3RvX2FsbChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IGZnLAogCQkJCSAgICB1bnNpZ25lZCBpbnQgcG93ZXJfc3RhdGUpOwogCiBpbnQgc25kX2hkYV9sb2NrX2RldmljZXMoc3RydWN0IGhkYV9idXMgKmJ1cyk7CiB2b2lkIHNuZF9oZGFfdW5sb2NrX2RldmljZXMoc3RydWN0IGhkYV9idXMgKmJ1cyk7Cit2b2lkIHNuZF9oZGFfYnVzX3Jlc2V0KHN0cnVjdCBoZGFfYnVzICpidXMpOwogCiAvKgogICogcG93ZXIgbWFuYWdlbWVudAogICovCi0jaWZkZWYgQ09ORklHX1BNCi1pbnQgc25kX2hkYV9zdXNwZW5kKHN0cnVjdCBoZGFfYnVzICpidXMpOwotaW50IHNuZF9oZGFfcmVzdW1lKHN0cnVjdCBoZGFfYnVzICpidXMpOwotI2VuZGlmCitleHRlcm4gY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaGRhX2NvZGVjX2RyaXZlcl9wbTsKIAogc3RhdGljIGlubGluZQogaW50IGhkYV9jYWxsX2NoZWNrX3Bvd2VyX3N0YXR1cyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKQEAgLTU4Nyw2NSArNTA3LDE3IEBACiAvKgogICogcG93ZXIgc2F2aW5nCiAgKi8KKyNkZWZpbmUgc25kX2hkYV9wb3dlcl91cChjb2RlYykJCXNuZF9oZGFjX3Bvd2VyX3VwKCYoY29kZWMpLT5jb3JlKQorI2RlZmluZSBzbmRfaGRhX3Bvd2VyX3VwX3BtKGNvZGVjKQlzbmRfaGRhY19wb3dlcl91cF9wbSgmKGNvZGVjKS0+Y29yZSkKKyNkZWZpbmUgc25kX2hkYV9wb3dlcl9kb3duKGNvZGVjKQlzbmRfaGRhY19wb3dlcl9kb3duKCYoY29kZWMpLT5jb3JlKQorI2RlZmluZSBzbmRfaGRhX3Bvd2VyX2Rvd25fcG0oY29kZWMpCXNuZF9oZGFjX3Bvd2VyX2Rvd25fcG0oJihjb2RlYyktPmNvcmUpCiAjaWZkZWYgQ09ORklHX1BNCi12b2lkIHNuZF9oZGFfcG93ZXJfc2F2ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IGRlbHRhLCBib29sIGQzd2FpdCk7Cit2b2lkIHNuZF9oZGFfc2V0X3Bvd2VyX3NhdmUoc3RydWN0IGhkYV9idXMgKmJ1cywgaW50IGRlbGF5KTsKIHZvaWQgc25kX2hkYV91cGRhdGVfcG93ZXJfYWNjdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CiAjZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHNuZF9oZGFfcG93ZXJfc2F2ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaW50IGRlbHRhLAotCQkJCSAgICAgIGJvb2wgZDN3YWl0KSB7fQorc3RhdGljIGlubGluZSB2b2lkIHNuZF9oZGFfc2V0X3Bvd2VyX3NhdmUoc3RydWN0IGhkYV9idXMgKmJ1cywgaW50IGRlbGF5KSB7fQogI2VuZGlmCiAKLS8qKgotICogc25kX2hkYV9wb3dlcl91cCAtIFBvd2VyLXVwIHRoZSBjb2RlYwotICogQGNvZGVjOiBIRC1hdWRpbyBjb2RlYwotICoKLSAqIEluY3JlbWVudCB0aGUgcG93ZXItdXAgY291bnRlciBhbmQgcG93ZXIgdXAgdGhlIGhhcmR3YXJlIHJlYWxseSB3aGVuCi0gKiBub3QgdHVybmVkIG9uIHlldC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHNuZF9oZGFfcG93ZXJfdXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc25kX2hkYV9wb3dlcl9zYXZlKGNvZGVjLCAxLCBmYWxzZSk7Ci19Ci0KLS8qKgotICogc25kX2hkYV9wb3dlcl91cF9kM3dhaXQgLSBQb3dlci11cCB0aGUgY29kZWMgYWZ0ZXIgd2FpdGluZyBmb3IgYW55IHBlbmRpbmcKLSAqICAgRDMgdHJhbnNpdGlvbiB0byBjb21wbGV0ZS4gIFRoaXMgZGlmZmVycyBmcm9tIHNuZF9oZGFfcG93ZXJfdXAoKSB3aGVuCi0gKiAgIHBvd2VyX3RyYW5zaXRpb24gPT0gLTEuICBzbmRfaGRhX3Bvd2VyX3VwIHNlZXMgdGhpcyBjYXNlIGFzIGEgbm9wLAotICogICBzbmRfaGRhX3Bvd2VyX3VwX2Qzd2FpdCB3YWl0cyBmb3IgdGhlIEQzIHRyYW5zaXRpb24gdG8gY29tcGxldGUgdGhlbiBwb3dlcnMKLSAqICAgYmFjayB1cC4KLSAqIEBjb2RlYzogSEQtYXVkaW8gY29kZWMKLSAqCi0gKiBDYW5jZWwgYW55IHBvd2VyIGRvd24gb3BlcmF0aW9uIGhhcGVubmluZyBvbiB0aGUgd29yayBxdWV1ZSwgdGhlbiBwb3dlciB1cC4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHNuZF9oZGFfcG93ZXJfdXBfZDN3YWl0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXNuZF9oZGFfcG93ZXJfc2F2ZShjb2RlYywgMSwgdHJ1ZSk7Ci19Ci0KLS8qKgotICogc25kX2hkYV9wb3dlcl9kb3duIC0gUG93ZXItZG93biB0aGUgY29kZWMKLSAqIEBjb2RlYzogSEQtYXVkaW8gY29kZWMKLSAqCi0gKiBEZWNyZW1lbnQgdGhlIHBvd2VyLXVwIGNvdW50ZXIgYW5kIHNjaGVkdWxlcyB0aGUgcG93ZXItb2ZmIHdvcmsgaWYKLSAqIHRoZSBjb3VudGVyIHJlYXJjaGVzIHRvIHplcm8uCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzbmRfaGRhX3Bvd2VyX2Rvd24oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc25kX2hkYV9wb3dlcl9zYXZlKGNvZGVjLCAtMSwgZmFsc2UpOwotfQotCi0vKioKLSAqIHNuZF9oZGFfcG93ZXJfc3luYyAtIFN5bmNocm9uaXplIHRoZSBwb3dlci1zYXZlIHN0YXR1cwotICogQGNvZGVjOiBIRC1hdWRpbyBjb2RlYwotICoKLSAqIFN5bmNocm9uaXplIHRoZSBhY3R1YWwgcG93ZXIgc3RhdGUgd2l0aCB0aGUgcG93ZXIgYWNjb3VudDsKLSAqIGNhbGxlZCB3aGVuIHBvd2VyX3NhdmUgcGFyYW1ldGVyIGlzIGNoYW5nZWQKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHNuZF9oZGFfcG93ZXJfc3luYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzbmRfaGRhX3Bvd2VyX3NhdmUoY29kZWMsIDAsIGZhbHNlKTsKLX0KLQogI2lmZGVmIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUgogLyoKICAqIHBhdGNoIGZpcm13YXJlCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmMKaW5kZXggMTdjMjYzNy4uMjZjZTk5MCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuYwpAQCAtMjcsMTAgKzI3LDggQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+Ci0jaW5jbHVkZSAiaGRhX3ByaXYuaCIKICNpbmNsdWRlICJoZGFfY29udHJvbGxlci5oIgogCiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKQEAgLTI1OSwxMSArMjU3LDE4IEBACiAJCXRjLT5jeWNsZV9sYXN0ID0gbGFzdDsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKgordG9faGRhX3BjbV9zdHJlYW0oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJcmV0dXJuICZhcGNtLT5pbmZvLT5zdHJlYW1bc3Vic3RyZWFtLT5zdHJlYW1dOworfQorCiBzdGF0aWMgdTY0IGF6eF9hZGp1c3RfY29kZWNfZGVsYXkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJdTY0IG5zZWMpCiB7CiAJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gdG9faGRhX3BjbV9zdHJlYW0oc3Vic3RyZWFtKTsKIAl1NjQgY29kZWNfZnJhbWVzLCBjb2RlY19uc2VjczsKIAogCWlmICghaGluZm8tPm9wcy5nZXRfZGVsYXkpCkBAIC0zOTksNyArNDA0LDcgQEAKIHN0YXRpYyBpbnQgYXp4X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKIHsKIAlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSB0b19oZGFfcGNtX3N0cmVhbShzdWJzdHJlYW0pOwogCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOwogCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNDEwLDkgKzQxNSwxMSBAQAogCWF6eF9kZXYtPnJ1bm5pbmcgPSAwOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnJlZ19sb2NrLCBmbGFncyk7CiAJYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXYpOwotCWhpbmZvLT5vcHMuY2xvc2UoaGluZm8sIGFwY20tPmNvZGVjLCBzdWJzdHJlYW0pOworCWlmIChoaW5mby0+b3BzLmNsb3NlKQorCQloaW5mby0+b3BzLmNsb3NlKGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKIAlzbmRfaGRhX3Bvd2VyX2Rvd24oYXBjbS0+Y29kZWMpOwogCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CisJc25kX2hkYV9jb2RlY19wY21fcHV0KGFwY20tPmluZm8pOwogCXJldHVybiAwOwogfQogCkBAIC00NDEsNyArNDQ4LDcgQEAKIAlzdHJ1Y3QgYXp4X3BjbSAqYXBjbSA9IHNuZF9wY21fc3Vic3RyZWFtX2NoaXAoc3Vic3RyZWFtKTsKIAlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CiAJc3RydWN0IGF6eCAqY2hpcCA9IGFwY20tPmNoaXA7Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gdG9faGRhX3BjbV9zdHJlYW0oc3Vic3RyZWFtKTsKIAlpbnQgZXJyOwogCiAJLyogcmVzZXQgQkRMIGFkZHJlc3MgKi8KQEAgLTQ2OCw3ICs0NzUsNyBAQAogCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwogCXN0cnVjdCBhenggKmNoaXAgPSBhcGNtLT5jaGlwOwogCXN0cnVjdCBhenhfZGV2ICphenhfZGV2ID0gZ2V0X2F6eF9kZXYoc3Vic3RyZWFtKTsKLQlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3Vic3RyZWFtLT5zdHJlYW1dOworCXN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8gPSB0b19oZGFfcGNtX3N0cmVhbShzdWJzdHJlYW0pOwogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJdW5zaWduZWQgaW50IGJ1ZnNpemUsIHBlcmlvZF9ieXRlcywgZm9ybWF0X3ZhbCwgc3RyZWFtX3RhZzsKIAlpbnQgZXJyOwpAQCAtNzA4LDcgKzcxNSw3IEBACiAKIAlpZiAoc3Vic3RyZWFtLT5ydW50aW1lKSB7CiAJCXN0cnVjdCBhenhfcGNtICphcGNtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCQlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gYXBjbS0+aGluZm9bc3RyZWFtXTsKKwkJc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IHRvX2hkYV9wY21fc3RyZWFtKHN1YnN0cmVhbSk7CiAKIAkJaWYgKGNoaXAtPmdldF9kZWxheVtzdHJlYW1dKQogCQkJZGVsYXkgKz0gY2hpcC0+Z2V0X2RlbGF5W3N0cmVhbV0oY2hpcCwgYXp4X2RldiwgcG9zKTsKQEAgLTczMiwxNyArNzM5LDMyIEBACiAJCQkgICAgICAgYXp4X2dldF9wb3NpdGlvbihjaGlwLCBhenhfZGV2KSk7CiB9CiAKLXN0YXRpYyBpbnQgYXp4X2dldF93YWxsY2xvY2tfdHN0YW1wKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCB0aW1lc3BlYyAqdHMpCitzdGF0aWMgaW50IGF6eF9nZXRfdGltZV9pbmZvKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJc3RydWN0IHRpbWVzcGVjICpzeXN0ZW1fdHMsIHN0cnVjdCB0aW1lc3BlYyAqYXVkaW9fdHMsCisJCQlzdHJ1Y3Qgc25kX3BjbV9hdWRpb190c3RhbXBfY29uZmlnICphdWRpb190c3RhbXBfY29uZmlnLAorCQkJc3RydWN0IHNuZF9wY21fYXVkaW9fdHN0YW1wX3JlcG9ydCAqYXVkaW9fdHN0YW1wX3JlcG9ydCkKIHsKIAlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldiA9IGdldF9henhfZGV2KHN1YnN0cmVhbSk7CiAJdTY0IG5zZWM7CiAKLQluc2VjID0gdGltZWNvdW50ZXJfcmVhZCgmYXp4X2Rldi0+YXp4X3RjKTsKLQluc2VjID0gZGl2X3U2NChuc2VjLCAzKTsgLyogY2FuIGJlIG9wdGltaXplZCAqLwotCW5zZWMgPSBhenhfYWRqdXN0X2NvZGVjX2RlbGF5KHN1YnN0cmVhbSwgbnNlYyk7CisJaWYgKChzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmluZm8gJiBTTkRSVl9QQ01fSU5GT19IQVNfTElOS19BVElNRSkgJiYKKwkJKGF1ZGlvX3RzdGFtcF9jb25maWctPnR5cGVfcmVxdWVzdGVkID09IFNORFJWX1BDTV9BVURJT19UU1RBTVBfVFlQRV9MSU5LKSkgewogCi0JKnRzID0gbnNfdG9fdGltZXNwZWMobnNlYyk7CisJCXNuZF9wY21fZ2V0dGltZShzdWJzdHJlYW0tPnJ1bnRpbWUsIHN5c3RlbV90cyk7CisKKwkJbnNlYyA9IHRpbWVjb3VudGVyX3JlYWQoJmF6eF9kZXYtPmF6eF90Yyk7CisJCW5zZWMgPSBkaXZfdTY0KG5zZWMsIDMpOyAvKiBjYW4gYmUgb3B0aW1pemVkICovCisJCWlmIChhdWRpb190c3RhbXBfY29uZmlnLT5yZXBvcnRfZGVsYXkpCisJCQluc2VjID0gYXp4X2FkanVzdF9jb2RlY19kZWxheShzdWJzdHJlYW0sIG5zZWMpOworCisJCSphdWRpb190cyA9IG5zX3RvX3RpbWVzcGVjKG5zZWMpOworCisJCWF1ZGlvX3RzdGFtcF9yZXBvcnQtPmFjdHVhbF90eXBlID0gU05EUlZfUENNX0FVRElPX1RTVEFNUF9UWVBFX0xJTks7CisJCWF1ZGlvX3RzdGFtcF9yZXBvcnQtPmFjY3VyYWN5X3JlcG9ydCA9IDE7IC8qIHJlc3Qgb2Ygc3RydWN0dXJlIGlzIHZhbGlkICovCisJCWF1ZGlvX3RzdGFtcF9yZXBvcnQtPmFjY3VyYWN5ID0gNDI7IC8qIDI0IE1IeiBXYWxsQ2xvY2sgPT0gNDJucyByZXNvbHV0aW9uICovCisKKwl9IGVsc2UKKwkJYXVkaW9fdHN0YW1wX3JlcG9ydC0+YWN0dWFsX3R5cGUgPSBTTkRSVl9QQ01fQVVESU9fVFNUQU1QX1RZUEVfREVGQVVMVDsKIAogCXJldHVybiAwOwogfQpAQCAtNzU2LDcgKzc3OCw4IEBACiAJCQkJIC8qIFNORFJWX1BDTV9JTkZPX1JFU1VNRSB8Ki8KIAkJCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfAogCQkJCSBTTkRSVl9QQ01fSU5GT19TWU5DX1NUQVJUIHwKLQkJCQkgU05EUlZfUENNX0lORk9fSEFTX1dBTExfQ0xPQ0sgfAorCQkJCSBTTkRSVl9QQ01fSU5GT19IQVNfV0FMTF9DTE9DSyB8IC8qIGxlZ2FjeSAqLworCQkJCSBTTkRSVl9QQ01fSU5GT19IQVNfTElOS19BVElNRSB8CiAJCQkJIFNORFJWX1BDTV9JTkZPX05PX1BFUklPRF9XQUtFVVApLAogCS5mb3JtYXRzID0JCVNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAogCS5yYXRlcyA9CQlTTkRSVl9QQ01fUkFURV80ODAwMCwKQEAgLTc3NSw3ICs3OTgsNyBAQAogc3RhdGljIGludCBhenhfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IGF6eF9wY20gKmFwY20gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbyA9IGFwY20tPmhpbmZvW3N1YnN0cmVhbS0+c3RyZWFtXTsKKwlzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvID0gdG9faGRhX3BjbV9zdHJlYW0oc3Vic3RyZWFtKTsKIAlzdHJ1Y3QgYXp4ICpjaGlwID0gYXBjbS0+Y2hpcDsKIAlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKIAlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwpAQCAtNzgzLDExICs4MDYsMTIgQEAKIAlpbnQgZXJyOwogCWludCBidWZmX3N0ZXA7CiAKKwlzbmRfaGRhX2NvZGVjX3BjbV9nZXQoYXBjbS0+aW5mbyk7CiAJbXV0ZXhfbG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CiAJYXp4X2RldiA9IGF6eF9hc3NpZ25fZGV2aWNlKGNoaXAsIHN1YnN0cmVhbSk7CiAJaWYgKGF6eF9kZXYgPT0gTlVMTCkgewotCQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCQlyZXR1cm4gLUVCVVNZOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gdW5sb2NrOwogCX0KIAlydW50aW1lLT5odyA9IGF6eF9wY21faHc7CiAJcnVudGltZS0+aHcuY2hhbm5lbHNfbWluID0gaGluZm8tPmNoYW5uZWxzX21pbjsKQEAgLTgyMSwxMyArODQ1LDE0IEBACiAJCQkJICAgYnVmZl9zdGVwKTsKIAlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfc3RlcChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUEVSSU9EX0JZVEVTLAogCQkJCSAgIGJ1ZmZfc3RlcCk7Ci0Jc25kX2hkYV9wb3dlcl91cF9kM3dhaXQoYXBjbS0+Y29kZWMpOwotCWVyciA9IGhpbmZvLT5vcHMub3BlbihoaW5mbywgYXBjbS0+Y29kZWMsIHN1YnN0cmVhbSk7CisJc25kX2hkYV9wb3dlcl91cChhcGNtLT5jb2RlYyk7CisJaWYgKGhpbmZvLT5vcHMub3BlbikKKwkJZXJyID0gaGluZm8tPm9wcy5vcGVuKGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKKwllbHNlCisJCWVyciA9IC1FTk9ERVY7CiAJaWYgKGVyciA8IDApIHsKIAkJYXp4X3JlbGVhc2VfZGV2aWNlKGF6eF9kZXYpOwotCQlzbmRfaGRhX3Bvd2VyX2Rvd24oYXBjbS0+Y29kZWMpOwotCQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCQlyZXR1cm4gZXJyOworCQlnb3RvIHBvd2VyZG93bjsKIAl9CiAJc25kX3BjbV9saW1pdF9od19yYXRlcyhydW50aW1lKTsKIAkvKiBzYW5pdHkgY2hlY2sgKi8KQEAgLTgzNiwxNiArODYxLDE4IEBACiAJICAgIHNuZF9CVUdfT04oIXJ1bnRpbWUtPmh3LmZvcm1hdHMpIHx8CiAJICAgIHNuZF9CVUdfT04oIXJ1bnRpbWUtPmh3LnJhdGVzKSkgewogCQlhenhfcmVsZWFzZV9kZXZpY2UoYXp4X2Rldik7Ci0JCWhpbmZvLT5vcHMuY2xvc2UoaGluZm8sIGFwY20tPmNvZGVjLCBzdWJzdHJlYW0pOwotCQlzbmRfaGRhX3Bvd2VyX2Rvd24oYXBjbS0+Y29kZWMpOwotCQltdXRleF91bmxvY2soJmNoaXAtPm9wZW5fbXV0ZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGhpbmZvLT5vcHMuY2xvc2UpCisJCQloaW5mby0+b3BzLmNsb3NlKGhpbmZvLCBhcGNtLT5jb2RlYywgc3Vic3RyZWFtKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBwb3dlcmRvd247CiAJfQogCi0JLyogZGlzYWJsZSBXQUxMQ0xPQ0sgdGltZXN0YW1wcyBmb3IgY2FwdHVyZSBzdHJlYW1zCisJLyogZGlzYWJsZSBMSU5LX0FUSU1FIHRpbWVzdGFtcHMgZm9yIGNhcHR1cmUgc3RyZWFtcwogCSAgIHVudGlsIHdlIGZpZ3VyZSBvdXQgaG93IHRvIGhhbmRsZSBkaWdpdGFsIGlucHV0cyAqLwotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpCi0JCXJ1bnRpbWUtPmh3LmluZm8gJj0gflNORFJWX1BDTV9JTkZPX0hBU19XQUxMX0NMT0NLOworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpIHsKKwkJcnVudGltZS0+aHcuaW5mbyAmPSB+U05EUlZfUENNX0lORk9fSEFTX1dBTExfQ0xPQ0s7IC8qIGxlZ2FjeSAqLworCQlydW50aW1lLT5ody5pbmZvICY9IH5TTkRSVl9QQ01fSU5GT19IQVNfTElOS19BVElNRTsKKwl9CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+cmVnX2xvY2ssIGZsYWdzKTsKIAlhenhfZGV2LT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07CkBAIC04NTYsNiArODgzLDEzIEBACiAJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOwogCW11dGV4X3VubG9jaygmY2hpcC0+b3Blbl9tdXRleCk7CiAJcmV0dXJuIDA7CisKKyBwb3dlcmRvd246CisJc25kX2hkYV9wb3dlcl9kb3duKGFwY20tPmNvZGVjKTsKKyB1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjaGlwLT5vcGVuX211dGV4KTsKKwlzbmRfaGRhX2NvZGVjX3BjbV9wdXQoYXBjbS0+aW5mbyk7CisJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBhenhfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCkBAIC04NzcsNyArOTExLDcgQEAKIAkucHJlcGFyZSA9IGF6eF9wY21fcHJlcGFyZSwKIAkudHJpZ2dlciA9IGF6eF9wY21fdHJpZ2dlciwKIAkucG9pbnRlciA9IGF6eF9wY21fcG9pbnRlciwKLQkud2FsbF9jbG9jayA9ICBhenhfZ2V0X3dhbGxjbG9ja190c3RhbXAsCisJLmdldF90aW1lX2luZm8gPSAgYXp4X2dldF90aW1lX2luZm8sCiAJLm1tYXAgPSBhenhfcGNtX21tYXAsCiAJLnBhZ2UgPSBzbmRfcGNtX3NnYnVmX29wc19wYWdlLAogfTsKQEAgLTg4Nyw2ICs5MjEsNyBAQAogCXN0cnVjdCBhenhfcGNtICphcGNtID0gcGNtLT5wcml2YXRlX2RhdGE7CiAJaWYgKGFwY20pIHsKIAkJbGlzdF9kZWwoJmFwY20tPmxpc3QpOworCQlhcGNtLT5pbmZvLT5wY20gPSBOVUxMOwogCQlrZnJlZShhcGNtKTsKIAl9CiB9CkBAIC05MjMsNiArOTU4LDcgQEAKIAlhcGNtLT5jaGlwID0gY2hpcDsKIAlhcGNtLT5wY20gPSBwY207CiAJYXBjbS0+Y29kZWMgPSBjb2RlYzsKKwlhcGNtLT5pbmZvID0gY3BjbTsKIAlwY20tPnByaXZhdGVfZGF0YSA9IGFwY207CiAJcGNtLT5wcml2YXRlX2ZyZWUgPSBhenhfcGNtX2ZyZWU7CiAJaWYgKGNwY20tPnBjbV90eXBlID09IEhEQV9QQ01fVFlQRV9NT0RFTSkKQEAgLTkzMCw3ICs5NjYsNiBAQAogCWxpc3RfYWRkX3RhaWwoJmFwY20tPmxpc3QsICZjaGlwLT5wY21fbGlzdCk7CiAJY3BjbS0+cGNtID0gcGNtOwogCWZvciAocyA9IDA7IHMgPCAyOyBzKyspIHsKLQkJYXBjbS0+aGluZm9bc10gPSAmY3BjbS0+c3RyZWFtW3NdOwogCQlpZiAoY3BjbS0+c3RyZWFtW3NdLnN1YnN0cmVhbXMpCiAJCQlzbmRfcGNtX3NldF9vcHMocGNtLCBzLCAmYXp4X3BjbV9vcHMpOwogCX0KQEAgLTk0MSw5ICs5NzYsNiBAQAogCXNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLCBTTkRSVl9ETUFfVFlQRV9ERVZfU0csCiAJCQkJCSAgICAgIGNoaXAtPmNhcmQtPmRldiwKIAkJCQkJICAgICAgc2l6ZSwgTUFYX1BSRUFMTE9DX1NJWkUpOwotCS8qIGxpbmsgdG8gY29kZWMgKi8KLQlmb3IgKHMgPSAwOyBzIDwgMjsgcysrKQotCQlwY20tPnN0cmVhbXNbc10uZGV2LnBhcmVudCA9ICZjb2RlYy0+ZGV2OwogCXJldHVybiAwOwogfQogCkBAIC05NTIsMTQgKzk4NCw5IEBACiAgKi8KIHN0YXRpYyBpbnQgYXp4X2FsbG9jX2NtZF9pbyhzdHJ1Y3QgYXp4ICpjaGlwKQogewotCWludCBlcnI7Ci0KIAkvKiBzaW5nbGUgcGFnZSAoYXQgbGVhc3QgNDA5NiBieXRlcykgbXVzdCBzdWZmaWNlIGZvciBib3RoIHJpbmdidWZmZXMgKi8KLQllcnIgPSBjaGlwLT5vcHMtPmRtYV9hbGxvY19wYWdlcyhjaGlwLCBTTkRSVl9ETUFfVFlQRV9ERVYsCi0JCQkJCSBQQUdFX1NJWkUsICZjaGlwLT5yYik7Ci0JaWYgKGVyciA8IDApCi0JCWRldl9lcnIoY2hpcC0+Y2FyZC0+ZGV2LCAiY2Fubm90IGFsbG9jYXRlIENPUkIvUklSQlxuIik7Ci0JcmV0dXJuIGVycjsKKwlyZXR1cm4gY2hpcC0+b3BzLT5kbWFfYWxsb2NfcGFnZXMoY2hpcCwgU05EUlZfRE1BX1RZUEVfREVWLAorCQkJCQkgIFBBR0VfU0laRSwgJmNoaXAtPnJiKTsKIH0KIAogc3RhdGljIHZvaWQgYXp4X2luaXRfY21kX2lvKHN0cnVjdCBhenggKmNoaXApCkBAIC0xNDQ1LDcgKzE0NzIsNiBAQAogaW50IGF6eF9hbGxvY19zdHJlYW1fcGFnZXMoc3RydWN0IGF6eCAqY2hpcCkKIHsKIAlpbnQgaSwgZXJyOwotCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IGNoaXAtPmNhcmQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2hpcC0+bnVtX3N0cmVhbXM7IGkrKykgewogCQlkc3BfbG9ja19pbml0KCZjaGlwLT5henhfZGV2W2ldKTsKQEAgLTE0NTMsMTggKzE0NzksMTQgQEAKIAkJZXJyID0gY2hpcC0+b3BzLT5kbWFfYWxsb2NfcGFnZXMoY2hpcCwgU05EUlZfRE1BX1RZUEVfREVWLAogCQkJCQkJIEJETF9TSVpFLAogCQkJCQkJICZjaGlwLT5henhfZGV2W2ldLmJkbCk7Ci0JCWlmIChlcnIgPCAwKSB7Ci0JCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbm5vdCBhbGxvY2F0ZSBCRExcbiIpOworCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiAtRU5PTUVNOwotCQl9CiAJfQogCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBvc2l0aW9uIGJ1ZmZlciAqLwogCWVyciA9IGNoaXAtPm9wcy0+ZG1hX2FsbG9jX3BhZ2VzKGNoaXAsIFNORFJWX0RNQV9UWVBFX0RFViwKIAkJCQkJIGNoaXAtPm51bV9zdHJlYW1zICogOCwgJmNoaXAtPnBvc2J1Zik7Ci0JaWYgKGVyciA8IDApIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsICJjYW5ub3QgYWxsb2NhdGUgcG9zYnVmXG4iKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJLyogYWxsb2NhdGUgQ09SQi9SSVJCICovCiAJZXJyID0gYXp4X2FsbG9jX2NtZF9pbyhjaGlwKTsKQEAgLTE2NzYsNyArMTY5OCw3IEBACiAJaW50IGk7CiAKICNpZmRlZiBDT05GSUdfUE0KLQlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkKKwlpZiAoYXp4X2hhc19wbV9ydW50aW1lKGNoaXApKQogCQlpZiAoIXBtX3J1bnRpbWVfYWN0aXZlKGNoaXAtPmNhcmQtPmRldikpCiAJCQlyZXR1cm4gSVJRX05PTkU7CiAjZW5kaWYKQEAgLTE3NDIsMTIgKzE3NjQsMTIgQEAKIAkJKEFDX1ZFUkJfUEFSQU1FVEVSUyA8PCA4KSB8IEFDX1BBUl9WRU5ET1JfSUQ7CiAJdW5zaWduZWQgaW50IHJlczsKIAotCW11dGV4X2xvY2soJmNoaXAtPmJ1cy0+Y21kX211dGV4KTsKKwltdXRleF9sb2NrKCZjaGlwLT5idXMtPmNvcmUuY21kX211dGV4KTsKIAljaGlwLT5wcm9iaW5nID0gMTsKIAlhenhfc2VuZF9jbWQoY2hpcC0+YnVzLCBjbWQpOwogCXJlcyA9IGF6eF9nZXRfcmVzcG9uc2UoY2hpcC0+YnVzLCBhZGRyKTsKIAljaGlwLT5wcm9iaW5nID0gMDsKLQltdXRleF91bmxvY2soJmNoaXAtPmJ1cy0+Y21kX211dGV4KTsKKwltdXRleF91bmxvY2soJmNoaXAtPmJ1cy0+Y29yZS5jbWRfbXV0ZXgpOwogCWlmIChyZXMgPT0gLTEpCiAJCXJldHVybiAtRUlPOwogCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiY29kZWMgIyVkIHByb2JlZCBPS1xuIiwgYWRkcik7CkBAIC0xNzYxLDM0ICsxNzgzLDExIEBACiAJYnVzLT5pbl9yZXNldCA9IDE7CiAJYXp4X3N0b3BfY2hpcChjaGlwKTsKIAlhenhfaW5pdF9jaGlwKGNoaXAsIHRydWUpOwotI2lmZGVmIENPTkZJR19QTQotCWlmIChjaGlwLT5pbml0aWFsaXplZCkgewotCQlzdHJ1Y3QgYXp4X3BjbSAqcDsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2hpcC0+cGNtX2xpc3QsIGxpc3QpCi0JCQlzbmRfcGNtX3N1c3BlbmRfYWxsKHAtPnBjbSk7Ci0JCXNuZF9oZGFfc3VzcGVuZChjaGlwLT5idXMpOwotCQlzbmRfaGRhX3Jlc3VtZShjaGlwLT5idXMpOwotCX0KLSNlbmRpZgorCWlmIChjaGlwLT5pbml0aWFsaXplZCkKKwkJc25kX2hkYV9idXNfcmVzZXQoY2hpcC0+YnVzKTsKIAlidXMtPmluX3Jlc2V0ID0gMDsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotLyogcG93ZXItdXAvZG93biB0aGUgY29udHJvbGxlciAqLwotc3RhdGljIHZvaWQgYXp4X3Bvd2VyX25vdGlmeShzdHJ1Y3QgaGRhX2J1cyAqYnVzLCBib29sIHBvd2VyX3VwKQotewotCXN0cnVjdCBhenggKmNoaXAgPSBidXMtPnByaXZhdGVfZGF0YTsKLQotCWlmICghKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1BNX1JVTlRJTUUpKQotCQlyZXR1cm47Ci0KLQlpZiAocG93ZXJfdXApCi0JCXBtX3J1bnRpbWVfZ2V0X3N5bmMoY2hpcC0+Y2FyZC0+ZGV2KTsKLQllbHNlCi0JCXBtX3J1bnRpbWVfcHV0X3N5bmMoY2hpcC0+Y2FyZC0+ZGV2KTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IGdldF9qYWNrcG9sbF9pbnRlcnZhbChzdHJ1Y3QgYXp4ICpjaGlwKQogewogCWludCBpOwpAQCAtMTgxMCw0MSArMTgwOSw1OSBAQAogCXJldHVybiBqOwogfQogCi0vKiBDb2RlYyBpbml0aWFsaXphdGlvbiAqLwotaW50IGF6eF9jb2RlY19jcmVhdGUoc3RydWN0IGF6eCAqY2hpcCwgY29uc3QgY2hhciAqbW9kZWwsCi0JCSAgICAgdW5zaWduZWQgaW50IG1heF9zbG90cywKLQkJICAgICBpbnQgKnBvd2VyX3NhdmVfdG8pCi17Ci0Jc3RydWN0IGhkYV9idXNfdGVtcGxhdGUgYnVzX3RlbXA7Ci0JaW50IGMsIGNvZGVjcywgZXJyOwotCi0JbWVtc2V0KCZidXNfdGVtcCwgMCwgc2l6ZW9mKGJ1c190ZW1wKSk7Ci0JYnVzX3RlbXAucHJpdmF0ZV9kYXRhID0gY2hpcDsKLQlidXNfdGVtcC5tb2RlbG5hbWUgPSBtb2RlbDsKLQlidXNfdGVtcC5wY2kgPSBjaGlwLT5wY2k7Ci0JYnVzX3RlbXAub3BzLmNvbW1hbmQgPSBhenhfc2VuZF9jbWQ7Ci0JYnVzX3RlbXAub3BzLmdldF9yZXNwb25zZSA9IGF6eF9nZXRfcmVzcG9uc2U7Ci0JYnVzX3RlbXAub3BzLmF0dGFjaF9wY20gPSBhenhfYXR0YWNoX3BjbV9zdHJlYW07Ci0JYnVzX3RlbXAub3BzLmJ1c19yZXNldCA9IGF6eF9idXNfcmVzZXQ7Ci0jaWZkZWYgQ09ORklHX1BNCi0JYnVzX3RlbXAucG93ZXJfc2F2ZSA9IHBvd2VyX3NhdmVfdG87Ci0JYnVzX3RlbXAub3BzLnBtX25vdGlmeSA9IGF6eF9wb3dlcl9ub3RpZnk7Ci0jZW5kaWYKK3N0YXRpYyBzdHJ1Y3QgaGRhX2J1c19vcHMgYnVzX29wcyA9IHsKKwkuY29tbWFuZCA9IGF6eF9zZW5kX2NtZCwKKwkuZ2V0X3Jlc3BvbnNlID0gYXp4X2dldF9yZXNwb25zZSwKKwkuYXR0YWNoX3BjbSA9IGF6eF9hdHRhY2hfcGNtX3N0cmVhbSwKKwkuYnVzX3Jlc2V0ID0gYXp4X2J1c19yZXNldCwKICNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCi0JYnVzX3RlbXAub3BzLmxvYWRfZHNwX3ByZXBhcmUgPSBhenhfbG9hZF9kc3BfcHJlcGFyZTsKLQlidXNfdGVtcC5vcHMubG9hZF9kc3BfdHJpZ2dlciA9IGF6eF9sb2FkX2RzcF90cmlnZ2VyOwotCWJ1c190ZW1wLm9wcy5sb2FkX2RzcF9jbGVhbnVwID0gYXp4X2xvYWRfZHNwX2NsZWFudXA7CisJLmxvYWRfZHNwX3ByZXBhcmUgPSBhenhfbG9hZF9kc3BfcHJlcGFyZSwKKwkubG9hZF9kc3BfdHJpZ2dlciA9IGF6eF9sb2FkX2RzcF90cmlnZ2VyLAorCS5sb2FkX2RzcF9jbGVhbnVwID0gYXp4X2xvYWRfZHNwX2NsZWFudXAsCiAjZW5kaWYKK307CiAKLQllcnIgPSBzbmRfaGRhX2J1c19uZXcoY2hpcC0+Y2FyZCwgJmJ1c190ZW1wLCAmY2hpcC0+YnVzKTsKKy8qIEhELWF1ZGlvIGJ1cyBpbml0aWFsaXphdGlvbiAqLworaW50IGF6eF9idXNfY3JlYXRlKHN0cnVjdCBhenggKmNoaXAsIGNvbnN0IGNoYXIgKm1vZGVsKQoreworCXN0cnVjdCBoZGFfYnVzICpidXM7CisJaW50IGVycjsKKworCWVyciA9IHNuZF9oZGFfYnVzX25ldyhjaGlwLT5jYXJkLCAmYnVzKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAorCWNoaXAtPmJ1cyA9IGJ1czsKKwlidXMtPnByaXZhdGVfZGF0YSA9IGNoaXA7CisJYnVzLT5wY2kgPSBjaGlwLT5wY2k7CisJYnVzLT5tb2RlbG5hbWUgPSBtb2RlbDsKKwlidXMtPm9wcyA9IGJ1c19vcHM7CisKIAlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUklSQl9ERUxBWSkgewogCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkVuYWJsZSBkZWxheSBpbiBSSVJCIGhhbmRsaW5nXG4iKTsKLQkJY2hpcC0+YnVzLT5uZWVkc19kYW1uX2xvbmdfZGVsYXkgPSAxOworCQlidXMtPm5lZWRzX2RhbW5fbG9uZ19kZWxheSA9IDE7CiAJfQogCisJLyogQU1EIGNoaXBzZXRzIG9mdGVuIGNhdXNlIHRoZSBjb21tdW5pY2F0aW9uIHN0YWxscyB1cG9uIGNlcnRhaW4KKwkgKiBzZXF1ZW5jZSBsaWtlIHRoZSBwaW4tZGV0ZWN0aW9uLiAgSXQgc2VlbXMgdGhhdCBmb3JjaW5nIHRoZSBzeW5jZWQKKwkgKiBhY2Nlc3Mgd29ya3MgYXJvdW5kIHRoZSBzdGFsbC4gIEdycnIuLi4KKwkgKi8KKwlpZiAoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfU1lOQ19XUklURSkgeworCQlkZXZfZGJnKGNoaXAtPmNhcmQtPmRldiwgIkVuYWJsZSBzeW5jX3dyaXRlIGZvciBzdGFibGUgY29tbXVuaWNhdGlvblxuIik7CisJCWJ1cy0+Y29yZS5zeW5jX3dyaXRlID0gMTsKKwkJYnVzLT5hbGxvd19idXNfcmVzZXQgPSAxOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2J1c19jcmVhdGUpOworCisvKiBQcm9iZSBjb2RlY3MgKi8KK2ludCBhenhfcHJvYmVfY29kZWNzKHN0cnVjdCBhenggKmNoaXAsIHVuc2lnbmVkIGludCBtYXhfc2xvdHMpCit7CisJc3RydWN0IGhkYV9idXMgKmJ1cyA9IGNoaXAtPmJ1czsKKwlpbnQgYywgY29kZWNzLCBlcnI7CisKIAljb2RlY3MgPSAwOwogCWlmICghbWF4X3Nsb3RzKQogCQltYXhfc2xvdHMgPSBBWlhfREVGQVVMVF9DT0RFQ1M7CkBAIC0xODcyLDIxICsxODg5LDExIEBACiAJCX0KIAl9CiAKLQkvKiBBTUQgY2hpcHNldHMgb2Z0ZW4gY2F1c2UgdGhlIGNvbW11bmljYXRpb24gc3RhbGxzIHVwb24gY2VydGFpbgotCSAqIHNlcXVlbmNlIGxpa2UgdGhlIHBpbi1kZXRlY3Rpb24uICBJdCBzZWVtcyB0aGF0IGZvcmNpbmcgdGhlIHN5bmNlZAotCSAqIGFjY2VzcyB3b3JrcyBhcm91bmQgdGhlIHN0YWxsLiAgR3Jyci4uLgotCSAqLwotCWlmIChjaGlwLT5kcml2ZXJfY2FwcyAmIEFaWF9EQ0FQU19TWU5DX1dSSVRFKSB7Ci0JCWRldl9kYmcoY2hpcC0+Y2FyZC0+ZGV2LCAiRW5hYmxlIHN5bmNfd3JpdGUgZm9yIHN0YWJsZSBjb21tdW5pY2F0aW9uXG4iKTsKLQkJY2hpcC0+YnVzLT5zeW5jX3dyaXRlID0gMTsKLQkJY2hpcC0+YnVzLT5hbGxvd19idXNfcmVzZXQgPSAxOwotCX0KLQogCS8qIFRoZW4gY3JlYXRlIGNvZGVjIGluc3RhbmNlcyAqLwogCWZvciAoYyA9IDA7IGMgPCBtYXhfc2xvdHM7IGMrKykgewogCQlpZiAoKGNoaXAtPmNvZGVjX21hc2sgJiAoMSA8PCBjKSkgJiBjaGlwLT5jb2RlY19wcm9iZV9tYXNrKSB7CiAJCQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYzsKLQkJCWVyciA9IHNuZF9oZGFfY29kZWNfbmV3KGNoaXAtPmJ1cywgYywgJmNvZGVjKTsKKwkJCWVyciA9IHNuZF9oZGFfY29kZWNfbmV3KGJ1cywgYnVzLT5jYXJkLCBjLCAmY29kZWMpOwogCQkJaWYgKGVyciA8IDApCiAJCQkJY29udGludWU7CiAJCQljb2RlYy0+amFja3BvbGxfaW50ZXJ2YWwgPSBnZXRfamFja3BvbGxfaW50ZXJ2YWwoY2hpcCk7CkBAIC0xOTAwLDI2ICsxOTA3LDE5IEBACiAJfQogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2NvZGVjX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChhenhfcHJvYmVfY29kZWNzKTsKIAogLyogY29uZmlndXJlIGVhY2ggY29kZWMgaW5zdGFuY2UgKi8KIGludCBhenhfY29kZWNfY29uZmlndXJlKHN0cnVjdCBhenggKmNoaXApCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmNoaXAtPmJ1cy0+Y29kZWNfbGlzdCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfY29kZWMoY29kZWMsIGNoaXAtPmJ1cykgewogCQlzbmRfaGRhX2NvZGVjX2NvbmZpZ3VyZShjb2RlYyk7CiAJfQogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoYXp4X2NvZGVjX2NvbmZpZ3VyZSk7CiAKLS8qIG1peGVyIGNyZWF0aW9uIC0gYWxsIHN0dWZmIGlzIGltcGxlbWVudGVkIGluIGhkYSBtb2R1bGUgKi8KLWludCBhenhfbWl4ZXJfY3JlYXRlKHN0cnVjdCBhenggKmNoaXApCi17Ci0JcmV0dXJuIHNuZF9oZGFfYnVpbGRfY29udHJvbHMoY2hpcC0+YnVzKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGF6eF9taXhlcl9jcmVhdGUpOwotCiAKIHN0YXRpYyBib29sIGlzX2lucHV0X3N0cmVhbShzdHJ1Y3QgYXp4ICpjaGlwLCB1bnNpZ25lZCBjaGFyIGluZGV4KQogewpAQCAtMTk2NiwzMCArMTk2Niw1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhenhfaW5pdF9zdHJlYW0pOwogCi0vKgotICogcmVib290IG5vdGlmaWVyIGZvciBoYW5nLXVwIHByb2JsZW0gYXQgcG93ZXItZG93bgotICovCi1zdGF0aWMgaW50IGF6eF9oYWx0KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmJ1ZikKLXsKLQlzdHJ1Y3QgYXp4ICpjaGlwID0gY29udGFpbmVyX29mKG5iLCBzdHJ1Y3QgYXp4LCByZWJvb3Rfbm90aWZpZXIpOwotCXNuZF9oZGFfYnVzX3JlYm9vdF9ub3RpZnkoY2hpcC0+YnVzKTsKLQlhenhfc3RvcF9jaGlwKGNoaXApOwotCXJldHVybiBOT1RJRllfT0s7Ci19Ci0KLXZvaWQgYXp4X25vdGlmaWVyX3JlZ2lzdGVyKHN0cnVjdCBhenggKmNoaXApCi17Ci0JY2hpcC0+cmVib290X25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBhenhfaGFsdDsKLQlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJmNoaXAtPnJlYm9vdF9ub3RpZmllcik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChhenhfbm90aWZpZXJfcmVnaXN0ZXIpOwotCi12b2lkIGF6eF9ub3RpZmllcl91bnJlZ2lzdGVyKHN0cnVjdCBhenggKmNoaXApCi17Ci0JaWYgKGNoaXAtPnJlYm9vdF9ub3RpZmllci5ub3RpZmllcl9jYWxsKQotCQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmY2hpcC0+cmVib290X25vdGlmaWVyKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGF6eF9ub3RpZmllcl91bnJlZ2lzdGVyKTsKLQogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJDb21tb24gSERBIGRyaXZlciBmdW5jdGlvbnMiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2NvbnRyb2xsZXIuaAppbmRleCBjOTBkMTBmLi5iZTFiN2RlIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9jb250cm9sbGVyLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfY29udHJvbGxlci5oCkBAIC0xNSwxMCArMTUsMzk2IEBACiAjaWZuZGVmIF9fU09VTkRfSERBX0NPTlRST0xMRVJfSAogI2RlZmluZSBfX1NPVU5EX0hEQV9DT05UUk9MTEVSX0gKIAorI2luY2x1ZGUgPGxpbnV4L3RpbWVjb3VudGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlICJoZGFfY29kZWMuaCIKLSNpbmNsdWRlICJoZGFfcHJpdi5oIgorCisvKgorICogcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgQVpYX1JFR19HQ0FQCQkJMHgwMAorI2RlZmluZSAgIEFaWF9HQ0FQXzY0T0sJCSgxIDw8IDApICAgLyogNjRiaXQgYWRkcmVzcyBzdXBwb3J0ICovCisjZGVmaW5lICAgQVpYX0dDQVBfTlNETwkJKDMgPDwgMSkgICAvKiAjIG9mIHNlcmlhbCBkYXRhIG91dCBzaWduYWxzICovCisjZGVmaW5lICAgQVpYX0dDQVBfQlNTCQkoMzEgPDwgMykgIC8qICMgb2YgYmlkaXJlY3Rpb25hbCBzdHJlYW1zICovCisjZGVmaW5lICAgQVpYX0dDQVBfSVNTCQkoMTUgPDwgOCkgIC8qICMgb2YgaW5wdXQgc3RyZWFtcyAqLworI2RlZmluZSAgIEFaWF9HQ0FQX09TUwkJKDE1IDw8IDEyKSAvKiAjIG9mIG91dHB1dCBzdHJlYW1zICovCisjZGVmaW5lIEFaWF9SRUdfVk1JTgkJCTB4MDIKKyNkZWZpbmUgQVpYX1JFR19WTUFKCQkJMHgwMworI2RlZmluZSBBWlhfUkVHX09VVFBBWQkJCTB4MDQKKyNkZWZpbmUgQVpYX1JFR19JTlBBWQkJCTB4MDYKKyNkZWZpbmUgQVpYX1JFR19HQ1RMCQkJMHgwOAorI2RlZmluZSAgIEFaWF9HQ1RMX1JFU0VUCSgxIDw8IDApICAgLyogY29udHJvbGxlciByZXNldCAqLworI2RlZmluZSAgIEFaWF9HQ1RMX0ZDTlRSTAkoMSA8PCAxKSAgIC8qIGZsdXNoIGNvbnRyb2wgKi8KKyNkZWZpbmUgICBBWlhfR0NUTF9VTlNPTAkoMSA8PCA4KSAgIC8qIGFjY2VwdCB1bnNvbC4gcmVzcG9uc2UgZW5hYmxlICovCisjZGVmaW5lIEFaWF9SRUdfV0FLRUVOCQkJMHgwYworI2RlZmluZSBBWlhfUkVHX1NUQVRFU1RTCQkweDBlCisjZGVmaW5lIEFaWF9SRUdfR1NUUwkJCTB4MTAKKyNkZWZpbmUgICBBWlhfR1NUU19GU1RTCQkoMSA8PCAxKSAgIC8qIGZsdXNoIHN0YXR1cyAqLworI2RlZmluZSBBWlhfUkVHX0lOVENUTAkJCTB4MjAKKyNkZWZpbmUgQVpYX1JFR19JTlRTVFMJCQkweDI0CisjZGVmaW5lIEFaWF9SRUdfV0FMTENMSwkJCTB4MzAJLyogMjRNaHogc291cmNlICovCisjZGVmaW5lIEFaWF9SRUdfT0xEX1NTWU5DCQkweDM0CS8qIFNTWU5DIGZvciBvbGQgSUNIICovCisjZGVmaW5lIEFaWF9SRUdfU1NZTkMJCQkweDM4CisjZGVmaW5lIEFaWF9SRUdfQ09SQkxCQVNFCQkweDQwCisjZGVmaW5lIEFaWF9SRUdfQ09SQlVCQVNFCQkweDQ0CisjZGVmaW5lIEFaWF9SRUdfQ09SQldQCQkJMHg0OAorI2RlZmluZSBBWlhfUkVHX0NPUkJSUAkJCTB4NGEKKyNkZWZpbmUgICBBWlhfQ09SQlJQX1JTVAkoMSA8PCAxNSkgIC8qIHJlYWQgcG9pbnRlciByZXNldCAqLworI2RlZmluZSBBWlhfUkVHX0NPUkJDVEwJCQkweDRjCisjZGVmaW5lICAgQVpYX0NPUkJDVExfUlVOCSgxIDw8IDEpICAgLyogZW5hYmxlIERNQSAqLworI2RlZmluZSAgIEFaWF9DT1JCQ1RMX0NNRUlFCSgxIDw8IDApICAgLyogZW5hYmxlIG1lbW9yeSBlcnJvciBpcnEgKi8KKyNkZWZpbmUgQVpYX1JFR19DT1JCU1RTCQkJMHg0ZAorI2RlZmluZSAgIEFaWF9DT1JCU1RTX0NNRUkJKDEgPDwgMCkgICAvKiBtZW1vcnkgZXJyb3IgaW5kaWNhdGlvbiAqLworI2RlZmluZSBBWlhfUkVHX0NPUkJTSVpFCQkweDRlCisKKyNkZWZpbmUgQVpYX1JFR19SSVJCTEJBU0UJCTB4NTAKKyNkZWZpbmUgQVpYX1JFR19SSVJCVUJBU0UJCTB4NTQKKyNkZWZpbmUgQVpYX1JFR19SSVJCV1AJCQkweDU4CisjZGVmaW5lICAgQVpYX1JJUkJXUF9SU1QJKDEgPDwgMTUpICAvKiB3cml0ZSBwb2ludGVyIHJlc2V0ICovCisjZGVmaW5lIEFaWF9SRUdfUklOVENOVAkJCTB4NWEKKyNkZWZpbmUgQVpYX1JFR19SSVJCQ1RMCQkJMHg1YworI2RlZmluZSAgIEFaWF9SQkNUTF9JUlFfRU4JKDEgPDwgMCkgICAvKiBlbmFibGUgSVJRICovCisjZGVmaW5lICAgQVpYX1JCQ1RMX0RNQV9FTgkoMSA8PCAxKSAgIC8qIGVuYWJsZSBETUEgKi8KKyNkZWZpbmUgICBBWlhfUkJDVExfT1ZFUlJVTl9FTgkoMSA8PCAyKSAgIC8qIGVuYWJsZSBvdmVycnVuIGlycSAqLworI2RlZmluZSBBWlhfUkVHX1JJUkJTVFMJCQkweDVkCisjZGVmaW5lICAgQVpYX1JCU1RTX0lSUQkJKDEgPDwgMCkgICAvKiByZXNwb25zZSBpcnEgKi8KKyNkZWZpbmUgICBBWlhfUkJTVFNfT1ZFUlJVTgkoMSA8PCAyKSAgIC8qIG92ZXJydW4gaXJxICovCisjZGVmaW5lIEFaWF9SRUdfUklSQlNJWkUJCTB4NWUKKworI2RlZmluZSBBWlhfUkVHX0lDCQkJMHg2MAorI2RlZmluZSBBWlhfUkVHX0lSCQkJMHg2NAorI2RlZmluZSBBWlhfUkVHX0lSUwkJCTB4NjgKKyNkZWZpbmUgICBBWlhfSVJTX1ZBTElECQkoMTw8MSkKKyNkZWZpbmUgICBBWlhfSVJTX0JVU1kJCSgxPDwwKQorCisjZGVmaW5lIEFaWF9SRUdfRFBMQkFTRQkJCTB4NzAKKyNkZWZpbmUgQVpYX1JFR19EUFVCQVNFCQkJMHg3NAorI2RlZmluZSAgIEFaWF9EUExCQVNFX0VOQUJMRQkweDEJLyogRW5hYmxlIHBvc2l0aW9uIGJ1ZmZlciAqLworCisvKiBTRCBvZmZzZXQ6IFNESTA9MHg4MCwgU0RJMT0weGEwLCAuLi4gU0RPMz0weDE2MCAqLworZW51bSB7IFNESTAsIFNESTEsIFNESTIsIFNESTMsIFNETzAsIFNETzEsIFNETzIsIFNETzMgfTsKKworLyogc3RyZWFtIHJlZ2lzdGVyIG9mZnNldHMgZnJvbSBzdHJlYW0gYmFzZSAqLworI2RlZmluZSBBWlhfUkVHX1NEX0NUTAkJCTB4MDAKKyNkZWZpbmUgQVpYX1JFR19TRF9TVFMJCQkweDAzCisjZGVmaW5lIEFaWF9SRUdfU0RfTFBJQgkJCTB4MDQKKyNkZWZpbmUgQVpYX1JFR19TRF9DQkwJCQkweDA4CisjZGVmaW5lIEFaWF9SRUdfU0RfTFZJCQkJMHgwYworI2RlZmluZSBBWlhfUkVHX1NEX0ZJRk9XCQkweDBlCisjZGVmaW5lIEFaWF9SRUdfU0RfRklGT1NJWkUJCTB4MTAKKyNkZWZpbmUgQVpYX1JFR19TRF9GT1JNQVQJCTB4MTIKKyNkZWZpbmUgQVpYX1JFR19TRF9CRExQTAkJMHgxOAorI2RlZmluZSBBWlhfUkVHX1NEX0JETFBVCQkweDFjCisKKy8qIFBDSSBzcGFjZSAqLworI2RlZmluZSBBWlhfUENJUkVHX1RDU0VMCQkweDQ0CisKKy8qCisgKiBvdGhlciBjb25zdGFudHMKKyAqLworCisvKiBtYXggbnVtYmVyIG9mIGZyYWdtZW50cyAtIHdlIG1heSB1c2UgbW9yZSBpZiBhbGxvY2F0aW5nIG1vcmUgcGFnZXMgZm9yIEJETCAqLworI2RlZmluZSBCRExfU0laRQkJNDA5NgorI2RlZmluZSBBWlhfTUFYX0JETF9FTlRSSUVTCShCRExfU0laRSAvIDE2KQorI2RlZmluZSBBWlhfTUFYX0ZSQUcJCTMyCisvKiBtYXggYnVmZmVyIHNpemUgLSBubyBoL3cgbGltaXQsIHlvdSBjYW4gaW5jcmVhc2UgYXMgeW91IGxpa2UgKi8KKyNkZWZpbmUgQVpYX01BWF9CVUZfU0laRQkoMTAyNCoxMDI0KjEwMjQpCisKKy8qIFJJUkIgaW50IG1hc2s6IG92ZXJydW5bMl0sIHJlc3BvbnNlWzBdICovCisjZGVmaW5lIFJJUkJfSU5UX1JFU1BPTlNFCTB4MDEKKyNkZWZpbmUgUklSQl9JTlRfT1ZFUlJVTgkweDA0CisjZGVmaW5lIFJJUkJfSU5UX01BU0sJCTB4MDUKKworLyogU1RBVEVTVFMgaW50IG1hc2s6IFMzLFNEMixTRDEsU0QwICovCisjZGVmaW5lIEFaWF9NQVhfQ09ERUNTCQk4CisjZGVmaW5lIEFaWF9ERUZBVUxUX0NPREVDUwk0CisjZGVmaW5lIFNUQVRFU1RTX0lOVF9NQVNLCSgoMSA8PCBBWlhfTUFYX0NPREVDUykgLSAxKQorCisvKiBTRF9DVEwgYml0cyAqLworI2RlZmluZSBTRF9DVExfU1RSRUFNX1JFU0VUCTB4MDEJLyogc3RyZWFtIHJlc2V0IGJpdCAqLworI2RlZmluZSBTRF9DVExfRE1BX1NUQVJUCTB4MDIJLyogc3RyZWFtIERNQSBzdGFydCBiaXQgKi8KKyNkZWZpbmUgU0RfQ1RMX1NUUklQRQkJKDMgPDwgMTYpCS8qIHN0cmlwZSBjb250cm9sICovCisjZGVmaW5lIFNEX0NUTF9UUkFGRklDX1BSSU8JKDEgPDwgMTgpCS8qIHRyYWZmaWMgcHJpb3JpdHkgKi8KKyNkZWZpbmUgU0RfQ1RMX0RJUgkJKDEgPDwgMTkpCS8qIGJpLWRpcmVjdGlvbmFsIHN0cmVhbSAqLworI2RlZmluZSBTRF9DVExfU1RSRUFNX1RBR19NQVNLCSgweGYgPDwgMjApCisjZGVmaW5lIFNEX0NUTF9TVFJFQU1fVEFHX1NISUZUCTIwCisKKy8qIFNEX0NUTCBhbmQgU0RfU1RTICovCisjZGVmaW5lIFNEX0lOVF9ERVNDX0VSUgkJMHgxMAkvKiBkZXNjcmlwdG9yIGVycm9yIGludGVycnVwdCAqLworI2RlZmluZSBTRF9JTlRfRklGT19FUlIJCTB4MDgJLyogRklGTyBlcnJvciBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0RfSU5UX0NPTVBMRVRFCQkweDA0CS8qIGNvbXBsZXRpb24gaW50ZXJydXB0ICovCisjZGVmaW5lIFNEX0lOVF9NQVNLCQkoU0RfSU5UX0RFU0NfRVJSfFNEX0lOVF9GSUZPX0VSUnxcCisJCQkJIFNEX0lOVF9DT01QTEVURSkKKworLyogU0RfU1RTICovCisjZGVmaW5lIFNEX1NUU19GSUZPX1JFQURZCTB4MjAJLyogRklGTyByZWFkeSAqLworCisvKiBJTlRDVEwgYW5kIElOVFNUUyAqLworI2RlZmluZSBBWlhfSU5UX0FMTF9TVFJFQU0JMHhmZgkgICAvKiBhbGwgc3RyZWFtIGludGVycnVwdHMgKi8KKyNkZWZpbmUgQVpYX0lOVF9DVFJMX0VOCTB4NDAwMDAwMDAgLyogY29udHJvbGxlciBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworI2RlZmluZSBBWlhfSU5UX0dMT0JBTF9FTgkweDgwMDAwMDAwIC8qIGdsb2JhbCBpbnRlcnJ1cHQgZW5hYmxlIGJpdCAqLworCisvKiBiZWxvdyBhcmUgc28gZmFyIGhhcmRjb2RlZCAtIHNob3VsZCByZWFkIHJlZ2lzdGVycyBpbiBmdXR1cmUgKi8KKyNkZWZpbmUgQVpYX01BWF9DT1JCX0VOVFJJRVMJMjU2CisjZGVmaW5lIEFaWF9NQVhfUklSQl9FTlRSSUVTCTI1NgorCisvKiBkcml2ZXIgcXVpcmtzIChjYXBhYmlsaXRpZXMpICovCisvKiBiaXRzIDAtNyBhcmUgdXNlZCBmb3IgaW5kaWNhdGluZyBkcml2ZXIgdHlwZSAqLworI2RlZmluZSBBWlhfRENBUFNfTk9fVENTRUwJKDEgPDwgOCkJLyogTm8gSW50ZWwgVENTRUwgYml0ICovCisjZGVmaW5lIEFaWF9EQ0FQU19OT19NU0kJKDEgPDwgOSkJLyogTm8gTVNJIHN1cHBvcnQgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1NOT09QX01BU0sJKDMgPDwgMTApCS8qIHNub29wIHR5cGUgbWFzayAqLworI2RlZmluZSBBWlhfRENBUFNfU05PT1BfT0ZGCSgxIDw8IDEyKQkvKiBzbm9vcCBkZWZhdWx0IG9mZiAqLworI2RlZmluZSBBWlhfRENBUFNfUklSQl9ERUxBWQkoMSA8PCAxMykJLyogTG9uZyBkZWxheSBpbiByZWFkIGxvb3AgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1JJUkJfUFJFX0RFTEFZICgxIDw8IDE0KQkvKiBQdXQgYSBkZWxheSBiZWZvcmUgcmVhZCAqLworI2RlZmluZSBBWlhfRENBUFNfQ1RYX1dPUktBUk9VTkQgKDEgPDwgMTUpCS8qIFgtRmkgd29ya2Fyb3VuZCAqLworI2RlZmluZSBBWlhfRENBUFNfUE9TRklYX0xQSUIJKDEgPDwgMTYpCS8qIFVzZSBMUElCIGFzIGRlZmF1bHQgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1BPU0ZJWF9WSUEJKDEgPDwgMTcpCS8qIFVzZSBWSUFDT01CTyBhcyBkZWZhdWx0ICovCisjZGVmaW5lIEFaWF9EQ0FQU19OT182NEJJVAkoMSA8PCAxOCkJLyogTm8gNjRiaXQgYWRkcmVzcyAqLworI2RlZmluZSBBWlhfRENBUFNfU1lOQ19XUklURQkoMSA8PCAxOSkJLyogc3luYyBlYWNoIGNtZCB3cml0ZSAqLworI2RlZmluZSBBWlhfRENBUFNfT0xEX1NTWU5DCSgxIDw8IDIwKQkvKiBPbGQgU1NZTkMgcmVnIGZvciBJQ0ggKi8KKyNkZWZpbmUgQVpYX0RDQVBTX05PX0FMSUdOX0JVRlNJWkUgKDEgPDwgMjEpCS8qIG5vIGJ1ZmZlciBzaXplIGFsaWdubWVudCAqLworLyogMjIgdW51c2VkICovCisjZGVmaW5lIEFaWF9EQ0FQU180S19CRExFX0JPVU5EQVJZICgxIDw8IDIzKQkvKiBCRExFIGluIDRrIGJvdW5kYXJ5ICovCisjZGVmaW5lIEFaWF9EQ0FQU19SRVZFUlNFX0FTU0lHTiAoMSA8PCAyNCkJLyogQXNzaWduIGRldmljZXMgaW4gcmV2ZXJzZSBvcmRlciAqLworI2RlZmluZSBBWlhfRENBUFNfQ09VTlRfTFBJQl9ERUxBWSAgKDEgPDwgMjUpCS8qIFRha2UgTFBJQiBhcyBkZWxheSAqLworI2RlZmluZSBBWlhfRENBUFNfUE1fUlVOVElNRQkoMSA8PCAyNikJLyogcnVudGltZSBQTSBzdXBwb3J0ICovCisjZGVmaW5lIEFaWF9EQ0FQU19JOTE1X1BPV0VSV0VMTCAoMSA8PCAyNykJLyogSFNXIGk5MTUgcG93ZXJ3ZWxsIHN1cHBvcnQgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX0NPUkJSUF9TRUxGX0NMRUFSICgxIDw8IDI4KQkvKiBDT1JCUlAgY2xlYXJzIGl0c2VsZiBhZnRlciByZXNldCAqLworI2RlZmluZSBBWlhfRENBUFNfTk9fTVNJNjQgICAgICAoMSA8PCAyOSkJLyogU3RpY2sgdG8gMzItYml0IE1TSXMgKi8KKyNkZWZpbmUgQVpYX0RDQVBTX1NFUEFSQVRFX1NUUkVBTV9UQUcJKDEgPDwgMzApIC8qIGNhcHR1cmUgYW5kIHBsYXliYWNrIHVzZSBzZXBhcmF0ZSBzdHJlYW0gdGFnICovCisKK2VudW0geworCUFaWF9TTk9PUF9UWVBFX05PTkUsCisJQVpYX1NOT09QX1RZUEVfU0NILAorCUFaWF9TTk9PUF9UWVBFX0FUSSwKKwlBWlhfU05PT1BfVFlQRV9OVklESUEsCit9OworCisvKiBIRCBBdWRpbyBjbGFzcyBjb2RlICovCisjZGVmaW5lIFBDSV9DTEFTU19NVUxUSU1FRElBX0hEX0FVRElPCTB4MDQwMworCitzdHJ1Y3QgYXp4X2RldiB7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIGJkbDsgLyogQkRMIGJ1ZmZlciAqLworCXUzMiAqcG9zYnVmOwkJLyogcG9zaXRpb24gYnVmZmVyIHBvaW50ZXIgKi8KKworCXVuc2lnbmVkIGludCBidWZzaXplOwkvKiBzaXplIG9mIHRoZSBwbGF5IGJ1ZmZlciBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBwZXJpb2RfYnl0ZXM7IC8qIHNpemUgb2YgdGhlIHBlcmlvZCBpbiBieXRlcyAqLworCXVuc2lnbmVkIGludCBmcmFnczsJLyogbnVtYmVyIGZvciBwZXJpb2QgaW4gdGhlIHBsYXkgYnVmZmVyICovCisJdW5zaWduZWQgaW50IGZpZm9fc2l6ZTsJLyogRklGTyBzaXplICovCisJdW5zaWduZWQgbG9uZyBzdGFydF93YWxsY2xrOwkvKiBzdGFydCArIG1pbmltdW0gd2FsbGNsayAqLworCXVuc2lnbmVkIGxvbmcgcGVyaW9kX3dhbGxjbGs7CS8qIHdhbGxjbGsgZm9yIHBlcmlvZCAqLworCisJdm9pZCBfX2lvbWVtICpzZF9hZGRyOwkvKiBzdHJlYW0gZGVzY3JpcHRvciBwb2ludGVyICovCisKKwl1MzIgc2RfaW50X3N0YV9tYXNrOwkvKiBzdHJlYW0gaW50IHN0YXR1cyBtYXNrICovCisKKwkvKiBwY20gc3VwcG9ydCAqLworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwkvKiBhc3NpZ25lZCBzdWJzdHJlYW0sCisJCQkJCQkgKiBzZXQgaW4gUENNIG9wZW4KKwkJCQkJCSAqLworCXVuc2lnbmVkIGludCBmb3JtYXRfdmFsOwkvKiBmb3JtYXQgdmFsdWUgdG8gYmUgc2V0IGluIHRoZQorCQkJCQkgKiBjb250cm9sbGVyIGFuZCB0aGUgY29kZWMKKwkJCQkJICovCisJdW5zaWduZWQgY2hhciBzdHJlYW1fdGFnOwkvKiBhc3NpZ25lZCBzdHJlYW0gKi8KKwl1bnNpZ25lZCBjaGFyIGluZGV4OwkJLyogc3RyZWFtIGluZGV4ICovCisJaW50IGFzc2lnbmVkX2tleTsJCS8qIGxhc3QgZGV2aWNlIyBrZXkgYXNzaWduZWQgdG8gKi8KKworCXVuc2lnbmVkIGludCBvcGVuZWQ6MTsKKwl1bnNpZ25lZCBpbnQgcnVubmluZzoxOworCXVuc2lnbmVkIGludCBpcnFfcGVuZGluZzoxOworCXVuc2lnbmVkIGludCBwcmVwYXJlZDoxOworCXVuc2lnbmVkIGludCBsb2NrZWQ6MTsKKwkvKgorCSAqIEZvciBWSUE6CisJICogIEEgZmxhZyB0byBlbnN1cmUgRE1BIHBvc2l0aW9uIGlzIDAKKwkgKiAgd2hlbiBsaW5rIHBvc2l0aW9uIGlzIG5vdCBncmVhdGVyIHRoYW4gRklGTyBzaXplCisJICovCisJdW5zaWduZWQgaW50IGluc3VmZmljaWVudDoxOworCXVuc2lnbmVkIGludCB3Y19tYXJrZWQ6MTsKKwl1bnNpZ25lZCBpbnQgbm9fcGVyaW9kX3dha2V1cDoxOworCisJc3RydWN0IHRpbWVjb3VudGVyICBhenhfdGM7CisJc3RydWN0IGN5Y2xlY291bnRlciBhenhfY2M7CisKKwlpbnQgZGVsYXlfbmVnYXRpdmVfdGhyZXNob2xkOworCisjaWZkZWYgQ09ORklHX1NORF9IREFfRFNQX0xPQURFUgorCS8qIEFsbG93cyBkc3AgbG9hZCB0byBoYXZlIHNvbGUgYWNjZXNzIHRvIHRoZSBwbGF5YmFjayBzdHJlYW0uICovCisJc3RydWN0IG11dGV4IGRzcF9tdXRleDsKKyNlbmRpZgorfTsKKworLyogQ09SQi9SSVJCICovCitzdHJ1Y3QgYXp4X3JiIHsKKwl1MzIgKmJ1ZjsJCS8qIENPUkIvUklSQiBidWZmZXIKKwkJCQkgKiBFYWNoIENPUkIgZW50cnkgaXMgNGJ5dGUsIFJJUkIgaXMgOGJ5dGUKKwkJCQkgKi8KKwlkbWFfYWRkcl90IGFkZHI7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQ09SQi9SSVJCIGJ1ZmZlciAqLworCS8qIGZvciBSSVJCICovCisJdW5zaWduZWQgc2hvcnQgcnAsIHdwOwkvKiByZWFkL3dyaXRlIHBvaW50ZXJzICovCisJaW50IGNtZHNbQVpYX01BWF9DT0RFQ1NdOwkvKiBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cyAqLworCXUzMiByZXNbQVpYX01BWF9DT0RFQ1NdOwkvKiBsYXN0IHJlYWQgdmFsdWUgKi8KK307CisKK3N0cnVjdCBheng7CisKKy8qIEZ1bmN0aW9ucyB0byByZWFkL3dyaXRlIHRvIGhkYSByZWdpc3RlcnMuICovCitzdHJ1Y3QgaGRhX2NvbnRyb2xsZXJfb3BzIHsKKwkvKiBSZWdpc3RlciBBY2Nlc3MgKi8KKwl2b2lkICgqcmVnX3dyaXRlbCkodTMyIHZhbHVlLCB1MzIgX19pb21lbSAqYWRkcik7CisJdTMyICgqcmVnX3JlYWRsKSh1MzIgX19pb21lbSAqYWRkcik7CisJdm9pZCAoKnJlZ193cml0ZXcpKHUxNiB2YWx1ZSwgdTE2IF9faW9tZW0gKmFkZHIpOworCXUxNiAoKnJlZ19yZWFkdykodTE2IF9faW9tZW0gKmFkZHIpOworCXZvaWQgKCpyZWdfd3JpdGViKSh1OCB2YWx1ZSwgdTggX19pb21lbSAqYWRkcik7CisJdTggKCpyZWdfcmVhZGIpKHU4IF9faW9tZW0gKmFkZHIpOworCS8qIERpc2FibGUgbXNpIGlmIHN1cHBvcnRlZCwgUENJIG9ubHkgKi8KKwlpbnQgKCpkaXNhYmxlX21zaV9yZXNldF9pcnEpKHN0cnVjdCBhenggKik7CisJLyogQWxsb2NhdGlvbiBvcHMgKi8KKwlpbnQgKCpkbWFfYWxsb2NfcGFnZXMpKHN0cnVjdCBhenggKmNoaXAsCisJCQkgICAgICAgaW50IHR5cGUsCisJCQkgICAgICAgc2l6ZV90IHNpemUsCisJCQkgICAgICAgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYpOworCXZvaWQgKCpkbWFfZnJlZV9wYWdlcykoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYpOworCWludCAoKnN1YnN0cmVhbV9hbGxvY19wYWdlcykoc3RydWN0IGF6eCAqY2hpcCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSAgICAgc2l6ZV90IHNpemUpOworCWludCAoKnN1YnN0cmVhbV9mcmVlX3BhZ2VzKShzdHJ1Y3QgYXp4ICpjaGlwLAorCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSk7CisJdm9pZCAoKnBjbV9tbWFwX3ByZXBhcmUpKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCSBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpOworCS8qIENoZWNrIGlmIGN1cnJlbnQgcG9zaXRpb24gaXMgYWNjZXB0YWJsZSAqLworCWludCAoKnBvc2l0aW9uX2NoZWNrKShzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3QgYXp4X2RldiAqYXp4X2Rldik7Cit9OworCitzdHJ1Y3QgYXp4X3BjbSB7CisJc3RydWN0IGF6eCAqY2hpcDsKKwlzdHJ1Y3Qgc25kX3BjbSAqcGNtOworCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOworCXN0cnVjdCBoZGFfcGNtICppbmZvOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3R5cGVkZWYgdW5zaWduZWQgaW50ICgqYXp4X2dldF9wb3NfY2FsbGJhY2tfdCkoc3RydWN0IGF6eCAqLCBzdHJ1Y3QgYXp4X2RldiAqKTsKK3R5cGVkZWYgaW50ICgqYXp4X2dldF9kZWxheV9jYWxsYmFja190KShzdHJ1Y3QgYXp4ICosIHN0cnVjdCBhenhfZGV2ICosIHVuc2lnbmVkIGludCBwb3MpOworCitzdHJ1Y3QgYXp4IHsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQ7CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwlpbnQgZGV2X2luZGV4OworCisJLyogY2hpcCB0eXBlIHNwZWNpZmljICovCisJaW50IGRyaXZlcl90eXBlOworCXVuc2lnbmVkIGludCBkcml2ZXJfY2FwczsKKwlpbnQgcGxheWJhY2tfc3RyZWFtczsKKwlpbnQgcGxheWJhY2tfaW5kZXhfb2Zmc2V0OworCWludCBjYXB0dXJlX3N0cmVhbXM7CisJaW50IGNhcHR1cmVfaW5kZXhfb2Zmc2V0OworCWludCBudW1fc3RyZWFtczsKKwljb25zdCBpbnQgKmphY2twb2xsX21zOyAvKiBwZXItY2FyZCBqYWNrIHBvbGwgaW50ZXJ2YWwgKi8KKworCS8qIFJlZ2lzdGVyIGludGVyYWN0aW9uLiAqLworCWNvbnN0IHN0cnVjdCBoZGFfY29udHJvbGxlcl9vcHMgKm9wczsKKworCS8qIHBvc2l0aW9uIGFkanVzdG1lbnQgY2FsbGJhY2tzICovCisJYXp4X2dldF9wb3NfY2FsbGJhY2tfdCBnZXRfcG9zaXRpb25bMl07CisJYXp4X2dldF9kZWxheV9jYWxsYmFja190IGdldF9kZWxheVsyXTsKKworCS8qIHBjaSByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdm9pZCBfX2lvbWVtICpyZW1hcF9hZGRyOworCWludCBpcnE7CisKKwkvKiBsb2NrcyAqLworCXNwaW5sb2NrX3QgcmVnX2xvY2s7CisJc3RydWN0IG11dGV4IG9wZW5fbXV0ZXg7IC8qIFByZXZlbnRzIGNvbmN1cnJlbnQgb3Blbi9jbG9zZSBvcGVyYXRpb25zICovCisKKwkvKiBzdHJlYW1zICh4IG51bV9zdHJlYW1zKSAqLworCXN0cnVjdCBhenhfZGV2ICphenhfZGV2OworCisJLyogUENNICovCisJc3RydWN0IGxpc3RfaGVhZCBwY21fbGlzdDsgLyogYXp4X3BjbSBsaXN0ICovCisKKwkvKiBIRCBjb2RlYyAqLworCXVuc2lnbmVkIHNob3J0IGNvZGVjX21hc2s7CisJaW50ICBjb2RlY19wcm9iZV9tYXNrOyAvKiBjb3BpZWQgZnJvbSBwcm9iZV9tYXNrIG9wdGlvbiAqLworCXN0cnVjdCBoZGFfYnVzICpidXM7CisJdW5zaWduZWQgaW50IGJlZXBfbW9kZTsKKworCS8qIENPUkIvUklSQiAqLworCXN0cnVjdCBhenhfcmIgY29yYjsKKwlzdHJ1Y3QgYXp4X3JiIHJpcmI7CisKKwkvKiBDT1JCL1JJUkIgYW5kIHBvc2l0aW9uIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgcmI7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyIHBvc2J1ZjsKKworI2lmZGVmIENPTkZJR19TTkRfSERBX1BBVENIX0xPQURFUgorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisjZW5kaWYKKworCS8qIGZsYWdzICovCisJY29uc3QgaW50ICpiZGxfcG9zX2FkajsKKwlpbnQgcG9sbF9jb3VudDsKKwl1bnNpZ25lZCBpbnQgcnVubmluZzoxOworCXVuc2lnbmVkIGludCBpbml0aWFsaXplZDoxOworCXVuc2lnbmVkIGludCBzaW5nbGVfY21kOjE7CisJdW5zaWduZWQgaW50IHBvbGxpbmdfbW9kZToxOworCXVuc2lnbmVkIGludCBtc2k6MTsKKwl1bnNpZ25lZCBpbnQgcHJvYmluZzoxOyAvKiBjb2RlYyBwcm9iaW5nIHBoYXNlICovCisJdW5zaWduZWQgaW50IHNub29wOjE7CisJdW5zaWduZWQgaW50IGFsaWduX2J1ZmZlcl9zaXplOjE7CisJdW5zaWduZWQgaW50IHJlZ2lvbl9yZXF1ZXN0ZWQ6MTsKKwl1bnNpZ25lZCBpbnQgZGlzYWJsZWQ6MTsgLyogZGlzYWJsZWQgYnkgVkdBLXN3aXRjaGVyICovCisKKwkvKiBmb3IgZGVidWdnaW5nICovCisJdW5zaWduZWQgaW50IGxhc3RfY21kW0FaWF9NQVhfQ09ERUNTXTsKKworI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKKwlzdHJ1Y3QgYXp4X2RldiBzYXZlZF9henhfZGV2OworI2VuZGlmCit9OworCisjaWZkZWYgQ09ORklHX1g4NgorI2RlZmluZSBhenhfc25vb3AoY2hpcCkJCSgoY2hpcCktPnNub29wKQorI2Vsc2UKKyNkZWZpbmUgYXp4X3Nub29wKGNoaXApCQl0cnVlCisjZW5kaWYKKworLyoKKyAqIG1hY3JvcyBmb3IgZWFzeSB1c2UKKyAqLworCisjZGVmaW5lIGF6eF93cml0ZWwoY2hpcCwgcmVnLCB2YWx1ZSkgXAorCSgoY2hpcCktPm9wcy0+cmVnX3dyaXRlbCh2YWx1ZSwgKGNoaXApLT5yZW1hcF9hZGRyICsgQVpYX1JFR18jI3JlZykpCisjZGVmaW5lIGF6eF9yZWFkbChjaGlwLCByZWcpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ19yZWFkbCgoY2hpcCktPnJlbWFwX2FkZHIgKyBBWlhfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3dyaXRldyhjaGlwLCByZWcsIHZhbHVlKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfd3JpdGV3KHZhbHVlLCAoY2hpcCktPnJlbWFwX2FkZHIgKyBBWlhfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3JlYWR3KGNoaXAsIHJlZykgXAorCSgoY2hpcCktPm9wcy0+cmVnX3JlYWR3KChjaGlwKS0+cmVtYXBfYWRkciArIEFaWF9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfd3JpdGViKGNoaXAsIHJlZywgdmFsdWUpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ193cml0ZWIodmFsdWUsIChjaGlwKS0+cmVtYXBfYWRkciArIEFaWF9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfcmVhZGIoY2hpcCwgcmVnKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfcmVhZGIoKGNoaXApLT5yZW1hcF9hZGRyICsgQVpYX1JFR18jI3JlZykpCisKKyNkZWZpbmUgYXp4X3NkX3dyaXRlbChjaGlwLCBkZXYsIHJlZywgdmFsdWUpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ193cml0ZWwodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgQVpYX1JFR18jI3JlZykpCisjZGVmaW5lIGF6eF9zZF9yZWFkbChjaGlwLCBkZXYsIHJlZykgXAorCSgoY2hpcCktPm9wcy0+cmVnX3JlYWRsKChkZXYpLT5zZF9hZGRyICsgQVpYX1JFR18jI3JlZykpCisjZGVmaW5lIGF6eF9zZF93cml0ZXcoY2hpcCwgZGV2LCByZWcsIHZhbHVlKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfd3JpdGV3KHZhbHVlLCAoZGV2KS0+c2RfYWRkciArIEFaWF9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfc2RfcmVhZHcoY2hpcCwgZGV2LCByZWcpIFwKKwkoKGNoaXApLT5vcHMtPnJlZ19yZWFkdygoZGV2KS0+c2RfYWRkciArIEFaWF9SRUdfIyNyZWcpKQorI2RlZmluZSBhenhfc2Rfd3JpdGViKGNoaXAsIGRldiwgcmVnLCB2YWx1ZSkgXAorCSgoY2hpcCktPm9wcy0+cmVnX3dyaXRlYih2YWx1ZSwgKGRldiktPnNkX2FkZHIgKyBBWlhfUkVHXyMjcmVnKSkKKyNkZWZpbmUgYXp4X3NkX3JlYWRiKGNoaXAsIGRldiwgcmVnKSBcCisJKChjaGlwKS0+b3BzLT5yZWdfcmVhZGIoKGRldiktPnNkX2FkZHIgKyBBWlhfUkVHXyMjcmVnKSkKKworI2RlZmluZSBhenhfaGFzX3BtX3J1bnRpbWUoY2hpcCkgXAorCSghQVpYX0RDQVBTX1BNX1JVTlRJTUUgfHwgKChjaGlwKS0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkpCiAKIC8qIFBDTSBzZXR1cCAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgYXp4X2RldiAqZ2V0X2F6eF9kZXYoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCkBAIC00MywxNCArNDI5LDkgQEAKIGlycXJldHVybl90IGF6eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIAogLyogQ29kZWMgaW50ZXJmYWNlICovCi1pbnQgYXp4X2NvZGVjX2NyZWF0ZShzdHJ1Y3QgYXp4ICpjaGlwLCBjb25zdCBjaGFyICptb2RlbCwKLQkJICAgICB1bnNpZ25lZCBpbnQgbWF4X3Nsb3RzLAotCQkgICAgIGludCAqcG93ZXJfc2F2ZV90byk7CitpbnQgYXp4X2J1c19jcmVhdGUoc3RydWN0IGF6eCAqY2hpcCwgY29uc3QgY2hhciAqbW9kZWwpOworaW50IGF6eF9wcm9iZV9jb2RlY3Moc3RydWN0IGF6eCAqY2hpcCwgdW5zaWduZWQgaW50IG1heF9zbG90cyk7CiBpbnQgYXp4X2NvZGVjX2NvbmZpZ3VyZShzdHJ1Y3QgYXp4ICpjaGlwKTsKLWludCBhenhfbWl4ZXJfY3JlYXRlKHN0cnVjdCBhenggKmNoaXApOwogaW50IGF6eF9pbml0X3N0cmVhbShzdHJ1Y3QgYXp4ICpjaGlwKTsKIAotdm9pZCBhenhfbm90aWZpZXJfcmVnaXN0ZXIoc3RydWN0IGF6eCAqY2hpcCk7Ci12b2lkIGF6eF9ub3RpZmllcl91bnJlZ2lzdGVyKHN0cnVjdCBhenggKmNoaXApOwotCiAjZW5kaWYgLyogX19TT1VORF9IREFfQ09OVFJPTExFUl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmMKaW5kZXggZmUxODA3MS4uM2QyNTk3YiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5jCisrKyBiL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuYwpAQCAtMTQwLDYgKzE0MCw5IEBACiAJdmFsID0gc25kX2hkYV9nZXRfYm9vbF9oaW50KGNvZGVjLCAic2luZ2xlX2FkY19hbXAiKTsKIAlpZiAodmFsID49IDApCiAJCWNvZGVjLT5zaW5nbGVfYWRjX2FtcCA9ICEhdmFsOworCXZhbCA9IHNuZF9oZGFfZ2V0X2Jvb2xfaGludChjb2RlYywgInBvd2VyX3NhdmVfbm9kZSIpOworCWlmICh2YWwgPj0gMCkKKwkJY29kZWMtPnBvd2VyX3NhdmVfbm9kZSA9ICEhdmFsOwogCiAJdmFsID0gc25kX2hkYV9nZXRfYm9vbF9oaW50KGNvZGVjLCAiYXV0b19tdXRlIik7CiAJaWYgKHZhbCA+PSAwKQpAQCAtNjQ4LDEyICs2NTEsMjQgQEAKIAkJCSAgdW5zaWduZWQgaW50IGRpciwgdW5zaWduZWQgaW50IGlkeCkKIHsKIAlzdHJ1Y3QgaGRhX2dlbl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IHR5cGUgPSBnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpOwogCWludCBpLCBuOwogCisJaWYgKG5pZCA9PSBjb2RlYy0+Y29yZS5hZmcpCisJCXJldHVybiB0cnVlOworCiAJZm9yIChuID0gMDsgbiA8IHNwZWMtPnBhdGhzLnVzZWQ7IG4rKykgewogCQlzdHJ1Y3QgbmlkX3BhdGggKnBhdGggPSBzbmRfYXJyYXlfZWxlbSgmc3BlYy0+cGF0aHMsIG4pOwogCQlpZiAoIXBhdGgtPmFjdGl2ZSkKIAkJCWNvbnRpbnVlOworCQlpZiAoY29kZWMtPnBvd2VyX3NhdmVfbm9kZSkgeworCQkJaWYgKCFwYXRoLT5zdHJlYW1fZW5hYmxlZCkKKwkJCQljb250aW51ZTsKKwkJCS8qIGlnbm9yZSB1bnBsdWdnZWQgcGF0aHMgZXhjZXB0IGZvciBEQUMvQURDICovCisJCQlpZiAoIShwYXRoLT5waW5fZW5hYmxlZCB8fCBwYXRoLT5waW5fZml4ZWQpICYmCisJCQkgICAgdHlwZSAhPSBBQ19XSURfQVVEX09VVCAmJiB0eXBlICE9IEFDX1dJRF9BVURfSU4pCisJCQkJY29udGludWU7CisJCX0KIAkJZm9yIChpID0gMDsgaSA8IHBhdGgtPmRlcHRoOyBpKyspIHsKIAkJCWlmIChwYXRoLT5wYXRoW2ldID09IG5pZCkgewogCQkJCWlmIChkaXIgPT0gSERBX09VVFBVVCB8fCBwYXRoLT5pZHhbaV0gPT0gaWR4KQpAQCAtNjg3LDEzICs3MDIsMzAgQEAKIAlyZXR1cm4gdmFsOwogfQogCisvKiBpcyB0aGlzIGEgc3RlcmVvIHdpZGdldCBvciBhIHN0ZXJlby10by1tb25vIG1peD8gKi8KK3N0YXRpYyBib29sIGlzX3N0ZXJlb19hbXBzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBpbnQgZGlyKQoreworCXVuc2lnbmVkIGludCB3Y2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgbmlkKTsKKwloZGFfbmlkX3QgY29ubjsKKworCWlmICh3Y2FwcyAmIEFDX1dDQVBfU1RFUkVPKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoZGlyICE9IEhEQV9JTlBVVCB8fCBnZXRfd2NhcHNfdHlwZSh3Y2FwcykgIT0gQUNfV0lEX0FVRF9NSVgpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoc25kX2hkYV9nZXRfbnVtX2Nvbm5zKGNvZGVjLCBuaWQpICE9IDEpCisJCXJldHVybiBmYWxzZTsKKwlpZiAoc25kX2hkYV9nZXRfY29ubmVjdGlvbnMoY29kZWMsIG5pZCwgJmNvbm4sIDEpIDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCXJldHVybiAhIShnZXRfd2NhcHMoY29kZWMsIGNvbm4pICYgQUNfV0NBUF9TVEVSRU8pOworfQorCiAvKiBpbml0aWFsaXplIHRoZSBhbXAgdmFsdWUgKG9ubHkgYXQgdGhlIGZpcnN0IHRpbWUpICovCiBzdGF0aWMgdm9pZCBpbml0X2FtcChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpciwgaW50IGlkeCkKIHsKIAl1bnNpZ25lZCBpbnQgY2FwcyA9IHF1ZXJ5X2FtcF9jYXBzKGNvZGVjLCBuaWQsIGRpcik7CiAJaW50IHZhbCA9IGdldF9hbXBfdmFsX3RvX2FjdGl2YXRlKGNvZGVjLCBuaWQsIGRpciwgY2FwcywgZmFsc2UpOwogCi0JaWYgKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmIEFDX1dDQVBfU1RFUkVPKQorCWlmIChpc19zdGVyZW9fYW1wcyhjb2RlYywgbmlkLCBkaXIpKQogCQlzbmRfaGRhX2NvZGVjX2FtcF9pbml0X3N0ZXJlbyhjb2RlYywgbmlkLCBkaXIsIGlkeCwgMHhmZiwgdmFsKTsKIAllbHNlCiAJCXNuZF9oZGFfY29kZWNfYW1wX2luaXQoY29kZWMsIG5pZCwgMCwgZGlyLCBpZHgsIDB4ZmYsIHZhbCk7CkBAIC03MDMsNyArNzM1LDcgQEAKIHN0YXRpYyBpbnQgdXBkYXRlX2FtcChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpciwgaW50IGlkeCwKIAkJICAgICAgdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCB2YWwpCiB7Ci0JaWYgKGdldF93Y2Fwcyhjb2RlYywgbmlkKSAmIEFDX1dDQVBfU1RFUkVPKQorCWlmIChpc19zdGVyZW9fYW1wcyhjb2RlYywgbmlkLCBkaXIpKQogCQlyZXR1cm4gc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKGNvZGVjLCBuaWQsIGRpciwgaWR4LAogCQkJCQkJbWFzaywgdmFsKTsKIAllbHNlCkBAIC03OTAsNiArODIyLDQ0IEBACiAJfQogfQogCisvKiBzeW5jIHBvd2VyIG9mIGVhY2ggd2lkZ2V0IGluIHRoZSB0aGUgZ2l2ZW4gcGF0aCAqLworc3RhdGljIGhkYV9uaWRfdCBwYXRoX3Bvd2VyX3VwZGF0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICBzdHJ1Y3QgbmlkX3BhdGggKnBhdGgsCisJCQkJICAgYm9vbCBhbGxvd19wb3dlcmRvd24pCit7CisJaGRhX25pZF90IG5pZCwgY2hhbmdlZCA9IDA7CisJaW50IGksIHN0YXRlOworCisJZm9yIChpID0gMDsgaSA8IHBhdGgtPmRlcHRoOyBpKyspIHsKKwkJbmlkID0gcGF0aC0+cGF0aFtpXTsKKwkJaWYgKCEoZ2V0X3djYXBzKGNvZGVjLCBuaWQpICYgQUNfV0NBUF9QT1dFUikpCisJCQljb250aW51ZTsKKwkJaWYgKG5pZCA9PSBjb2RlYy0+Y29yZS5hZmcpCisJCQljb250aW51ZTsKKwkJaWYgKCFhbGxvd19wb3dlcmRvd24gfHwgaXNfYWN0aXZlX25pZF9mb3JfYW55KGNvZGVjLCBuaWQpKQorCQkJc3RhdGUgPSBBQ19QV1JTVF9EMDsKKwkJZWxzZQorCQkJc3RhdGUgPSBBQ19QV1JTVF9EMzsKKwkJaWYgKCFzbmRfaGRhX2NoZWNrX3Bvd2VyX3N0YXRlKGNvZGVjLCBuaWQsIHN0YXRlKSkgeworCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAorCQkJCQkgICAgQUNfVkVSQl9TRVRfUE9XRVJfU1RBVEUsIHN0YXRlKTsKKwkJCWNoYW5nZWQgPSBuaWQ7CisJCQlpZiAoc3RhdGUgPT0gQUNfUFdSU1RfRDApCisJCQkJc25kX2hkYWNfcmVnbWFwX3N5bmNfbm9kZSgmY29kZWMtPmNvcmUsIG5pZCk7CisJCX0KKwl9CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8qIGRvIHN5bmMgd2l0aCB0aGUgbGFzdCBwb3dlciBzdGF0ZSBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIHN5bmNfcG93ZXJfc3RhdGVfY2hhbmdlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQoreworCWlmIChuaWQpIHsKKwkJbXNsZWVwKDEwKTsKKwkJc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfR0VUX1BPV0VSX1NUQVRFLCAwKTsKKwl9Cit9CisKIC8qKgogICogc25kX2hkYV9hY3RpdmF0ZV9wYXRoIC0gYWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSB0aGUgZ2l2ZW4gcGF0aAogICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCkBAIC04MDgsMTUgKzg3OCwxMyBAQAogCWlmICghZW5hYmxlKQogCQlwYXRoLT5hY3RpdmUgPSBmYWxzZTsKIAorCS8qIG1ha2Ugc3VyZSB0aGUgd2lkZ2V0IGlzIHBvd2VyZWQgdXAgKi8KKwlpZiAoZW5hYmxlICYmIChzcGVjLT5wb3dlcl9kb3duX3VudXNlZCB8fCBjb2RlYy0+cG93ZXJfc2F2ZV9ub2RlKSkKKwkJcGF0aF9wb3dlcl91cGRhdGUoY29kZWMsIHBhdGgsIGNvZGVjLT5wb3dlcl9zYXZlX25vZGUpOworCiAJZm9yIChpID0gcGF0aC0+ZGVwdGggLSAxOyBpID49IDA7IGktLSkgewogCQloZGFfbmlkX3QgbmlkID0gcGF0aC0+cGF0aFtpXTsKLQkJaWYgKGVuYWJsZSAmJiBzcGVjLT5wb3dlcl9kb3duX3VudXNlZCkgewotCQkJLyogbWFrZSBzdXJlIHRoZSB3aWRnZXQgaXMgcG93ZXJlZCB1cCAqLwotCQkJaWYgKCFzbmRfaGRhX2NoZWNrX3Bvd2VyX3N0YXRlKGNvZGVjLCBuaWQsIEFDX1BXUlNUX0QwKSkKLQkJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsCi0JCQkJCQkgICAgQUNfVkVSQl9TRVRfUE9XRVJfU1RBVEUsCi0JCQkJCQkgICAgQUNfUFdSU1RfRDApOwotCQl9CisKIAkJaWYgKGVuYWJsZSAmJiBwYXRoLT5tdWx0aVtpXSkKIAkJCXNuZF9oZGFfY29kZWNfdXBkYXRlX2NhY2hlKGNvZGVjLCBuaWQsIDAsCiAJCQkJCSAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwKQEAgLTgzNiwyOCArOTA0LDEwIEBACiBzdGF0aWMgdm9pZCBwYXRoX3Bvd2VyX2Rvd25fc3luYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgc3RydWN0IG5pZF9wYXRoICpwYXRoKQogewogCXN0cnVjdCBoZGFfZ2VuX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlib29sIGNoYW5nZWQgPSBmYWxzZTsKLQlpbnQgaTsKIAotCWlmICghc3BlYy0+cG93ZXJfZG93bl91bnVzZWQgfHwgcGF0aC0+YWN0aXZlKQorCWlmICghKHNwZWMtPnBvd2VyX2Rvd25fdW51c2VkIHx8IGNvZGVjLT5wb3dlcl9zYXZlX25vZGUpIHx8IHBhdGgtPmFjdGl2ZSkKIAkJcmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IHBhdGgtPmRlcHRoOyBpKyspIHsKLQkJaGRhX25pZF90IG5pZCA9IHBhdGgtPnBhdGhbaV07Ci0JCWlmICghc25kX2hkYV9jaGVja19wb3dlcl9zdGF0ZShjb2RlYywgbmlkLCBBQ19QV1JTVF9EMykgJiYKLQkJICAgICFpc19hY3RpdmVfbmlkX2Zvcl9hbnkoY29kZWMsIG5pZCkpIHsKLQkJCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwKLQkJCQkJICAgIEFDX1ZFUkJfU0VUX1BPV0VSX1NUQVRFLAotCQkJCQkgICAgQUNfUFdSU1RfRDMpOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlpZiAoY2hhbmdlZCkgewotCQltc2xlZXAoMTApOwotCQlzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIHBhdGgtPnBhdGhbMF0sIDAsCi0JCQkJICAgQUNfVkVSQl9HRVRfUE9XRVJfU1RBVEUsIDApOwotCX0KKwlzeW5jX3Bvd2VyX3N0YXRlX2NoYW5nZShjb2RlYywgcGF0aF9wb3dlcl91cGRhdGUoY29kZWMsIHBhdGgsIHRydWUpKTsKIH0KIAogLyogdHVybiBvbi9vZmYgRUFQRCBvbiB0aGUgZ2l2ZW4gcGluICovCkBAIC0xNTU3LDYgKzE2MDcsNyBAQAogCQlyZXR1cm4gMDsKIAkvKiBwcmludF9uaWRfcGF0aChjb2RlYywgIm91dHB1dC1hYW1peCIsIHBhdGgpOyAqLwogCXBhdGgtPmFjdGl2ZSA9IGZhbHNlOyAvKiB1bnVzZWQgYXMgZGVmYXVsdCAqLworCXBhdGgtPnBpbl9maXhlZCA9IHRydWU7IC8qIHN0YXRpYyByb3V0ZSAqLwogCXJldHVybiBzbmRfaGRhX2dldF9wYXRoX2lkeChjb2RlYywgcGF0aCk7CiB9CiAKQEAgLTE4NDYsMTIgKzE4OTcsMTEgQEAKIHN0YXRpYyB2b2lkIGZpbGxfYWxsX2RhY19uaWRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBoZGFfZ2VuX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaTsKLQloZGFfbmlkX3QgbmlkID0gY29kZWMtPnN0YXJ0X25pZDsKKwloZGFfbmlkX3QgbmlkOwogCiAJc3BlYy0+bnVtX2FsbF9kYWNzID0gMDsKIAltZW1zZXQoc3BlYy0+YWxsX2RhY3MsIDAsIHNpemVvZihzcGVjLT5hbGxfZGFjcykpOwotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX25vZGVzOyBpKyssIG5pZCsrKSB7CisJZm9yX2VhY2hfaGRhX2NvZGVjX25vZGUobmlkLCBjb2RlYykgewogCQlpZiAoZ2V0X3djYXBzX3R5cGUoZ2V0X3djYXBzKGNvZGVjLCBuaWQpKSAhPSBBQ19XSURfQVVEX09VVCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoc3BlYy0+bnVtX2FsbF9kYWNzID49IEFSUkFZX1NJWkUoc3BlYy0+YWxsX2RhY3MpKSB7CkBAIC0yOTgxLDYgKzMwMzEsNyBAQAogCX0KIAogCXBhdGgtPmFjdGl2ZSA9IHRydWU7CisJcGF0aC0+c3RyZWFtX2VuYWJsZWQgPSB0cnVlOyAvKiBubyBEQUMvQURDIGludm9sdmVkICovCiAJZXJyID0gYWRkX2xvb3BiYWNrX2xpc3Qoc3BlYywgbWl4X25pZCwgaWR4KTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKQEAgLTI5OTIsNiArMzA0Myw4IEBACiAJCWlmIChwYXRoKSB7CiAJCQlwcmludF9uaWRfcGF0aChjb2RlYywgImxvb3BiYWNrLW1lcmdlIiwgcGF0aCk7CiAJCQlwYXRoLT5hY3RpdmUgPSB0cnVlOworCQkJcGF0aC0+cGluX2ZpeGVkID0gdHJ1ZTsgLyogc3RhdGljIHJvdXRlICovCisJCQlwYXRoLT5zdHJlYW1fZW5hYmxlZCA9IHRydWU7IC8qIG5vIERBQy9BREMgaW52b2x2ZWQgKi8KIAkJCXNwZWMtPmxvb3BiYWNrX21lcmdlX3BhdGggPQogCQkJCXNuZF9oZGFfZ2V0X3BhdGhfaWR4KGNvZGVjLCBwYXRoKTsKIAkJfQpAQCAtMzAxMywxMCArMzA2Niw5IEBACiAJaGRhX25pZF90IG5pZDsKIAloZGFfbmlkX3QgKmFkY19uaWRzID0gc3BlYy0+YWRjX25pZHM7CiAJaW50IG1heF9udW1zID0gQVJSQVlfU0laRShzcGVjLT5hZGNfbmlkcyk7Ci0JaW50IGksIG51bXMgPSAwOworCWludCBudW1zID0gMDsKIAotCW5pZCA9IGNvZGVjLT5zdGFydF9uaWQ7Ci0JZm9yIChpID0gMDsgaSA8IGNvZGVjLT5udW1fbm9kZXM7IGkrKywgbmlkKyspIHsKKwlmb3JfZWFjaF9oZGFfY29kZWNfbm9kZShuaWQsIGNvZGVjKSB7CiAJCXVuc2lnbmVkIGludCBjYXBzID0gZ2V0X3djYXBzKGNvZGVjLCBuaWQpOwogCQlpbnQgdHlwZSA9IGdldF93Y2Fwc190eXBlKGNhcHMpOwogCkBAIC0zMzI5LDExICszMzgxLDYgQEAKIAlpbXV4ID0gJnNwZWMtPmlucHV0X211eDsKIAlhZGNfaWR4ID0ga2NvbnRyb2wtPmlkLmluZGV4OwogCW11dGV4X2xvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKLQkvKiB3ZSB1c2UgdGhlIGNhY2hlLW9ubHkgdXBkYXRlIGF0IGZpcnN0IHNpbmNlIG11bHRpcGxlIGlucHV0IHBhdGhzCi0JICogbWF5IHNoYXJlZCB0aGUgc2FtZSBhbXA7IGJ5IHVwZGF0aW5nIG9ubHkgY2FjaGVzLCB0aGUgcmVkdW5kYW50Ci0JICogd3JpdGVzIHRvIGhhcmR3YXJlIGNhbiBiZSByZWR1Y2VkLgotCSAqLwotCWNvZGVjLT5jYWNoZWRfd3JpdGUgPSAxOwogCWZvciAoaSA9IDA7IGkgPCBpbXV4LT5udW1faXRlbXM7IGkrKykgewogCQlwYXRoID0gZ2V0X2lucHV0X3BhdGgoY29kZWMsIGFkY19pZHgsIGkpOwogCQlpZiAoIXBhdGggfHwgIXBhdGgtPmN0bHNbdHlwZV0pCkBAIC0zMzQxLDEyICszMzg4LDkgQEAKIAkJa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUgPSBwYXRoLT5jdGxzW3R5cGVdOwogCQllcnIgPSBmdW5jKGtjb250cm9sLCB1Y29udHJvbCk7CiAJCWlmIChlcnIgPCAwKQotCQkJZ290byBlcnJvcjsKKwkJCWJyZWFrOwogCX0KLSBlcnJvcjoKLQljb2RlYy0+Y2FjaGVkX3dyaXRlID0gMDsKIAltdXRleF91bmxvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKLQlzbmRfaGRhX2NvZGVjX2ZsdXNoX2NhY2hlKGNvZGVjKTsgLyogZmx1c2ggdGhlIHVwZGF0ZXMgKi8KIAlpZiAoZXJyID49IDAgJiYgc3BlYy0+Y2FwX3N5bmNfaG9vaykKIAkJc3BlYy0+Y2FwX3N5bmNfaG9vayhjb2RlYywga2NvbnRyb2wsIHVjb250cm9sKTsKIAlyZXR1cm4gZXJyOwpAQCAtMzc5Myw2ICszODM3LDcgQEAKIAkJCWNvbnRpbnVlOwogCQlwcmludF9uaWRfcGF0aChjb2RlYywgImRpZ291dCIsIHBhdGgpOwogCQlwYXRoLT5hY3RpdmUgPSB0cnVlOworCQlwYXRoLT5waW5fZml4ZWQgPSB0cnVlOyAvKiBubyBqYWNrIGRldGVjdGlvbiAqLwogCQlzcGVjLT5kaWdvdXRfcGF0aHNbaV0gPSBzbmRfaGRhX2dldF9wYXRoX2lkeChjb2RlYywgcGF0aCk7CiAJCXNldF9waW5fdGFyZ2V0KGNvZGVjLCBwaW4sIFBJTl9PVVQsIGZhbHNlKTsKIAkJaWYgKCFudW1zKSB7CkBAIC0zODA5LDggKzM4NTQsNyBAQAogCiAJaWYgKHNwZWMtPmF1dG9jZmcuZGlnX2luX3BpbikgewogCQlwaW4gPSBzcGVjLT5hdXRvY2ZnLmRpZ19pbl9waW47Ci0JCWRpZ19uaWQgPSBjb2RlYy0+c3RhcnRfbmlkOwotCQlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPm51bV9ub2RlczsgaSsrLCBkaWdfbmlkKyspIHsKKwkJZm9yX2VhY2hfaGRhX2NvZGVjX25vZGUoZGlnX25pZCwgY29kZWMpIHsKIAkJCXVuc2lnbmVkIGludCB3Y2FwcyA9IGdldF93Y2Fwcyhjb2RlYywgZGlnX25pZCk7CiAJCQlpZiAoZ2V0X3djYXBzX3R5cGUod2NhcHMpICE9IEFDX1dJRF9BVURfSU4pCiAJCQkJY29udGludWU7CkBAIC0zODIwLDYgKzM4NjQsNyBAQAogCQkJaWYgKHBhdGgpIHsKIAkJCQlwcmludF9uaWRfcGF0aChjb2RlYywgImRpZ2luIiwgcGF0aCk7CiAJCQkJcGF0aC0+YWN0aXZlID0gdHJ1ZTsKKwkJCQlwYXRoLT5waW5fZml4ZWQgPSB0cnVlOyAvKiBubyBqYWNrICovCiAJCQkJc3BlYy0+ZGlnX2luX25pZCA9IGRpZ19uaWQ7CiAJCQkJc3BlYy0+ZGlnaW5fcGF0aCA9IHNuZF9oZGFfZ2V0X3BhdGhfaWR4KGNvZGVjLCBwYXRoKTsKIAkJCQlzZXRfcGluX3RhcmdldChjb2RlYywgcGluLCBQSU5fSU4sIGZhbHNlKTsKQEAgLTM4NzksNiArMzkyNCwyMzggQEAKIAlyZXR1cm4gMTsKIH0KIAorLyogcG93ZXIgdXAvZG93biB3aWRnZXRzIGluIHRoZSBhbGwgcGF0aHMgdGhhdCBtYXRjaCB3aXRoIHRoZSBnaXZlbiBOSUQKKyAqIGFzIHRlcm1pbmFscyAoZWl0aGVyIHN0YXJ0LSBvciBlbmRwb2ludCkKKyAqCisgKiByZXR1cm5zIHRoZSBsYXN0IGNoYW5nZWQgTklELCBvciB6ZXJvIGlmIHVuY2hhbmdlZC4KKyAqLworc3RhdGljIGhkYV9uaWRfdCBzZXRfcGF0aF9wb3dlcihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCQlpbnQgcGluX3N0YXRlLCBpbnQgc3RyZWFtX3N0YXRlKQoreworCXN0cnVjdCBoZGFfZ2VuX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwloZGFfbmlkX3QgbGFzdCwgY2hhbmdlZCA9IDA7CisJc3RydWN0IG5pZF9wYXRoICpwYXRoOworCWludCBuOworCisJZm9yIChuID0gMDsgbiA8IHNwZWMtPnBhdGhzLnVzZWQ7IG4rKykgeworCQlwYXRoID0gc25kX2FycmF5X2VsZW0oJnNwZWMtPnBhdGhzLCBuKTsKKwkJaWYgKHBhdGgtPnBhdGhbMF0gPT0gbmlkIHx8CisJCSAgICBwYXRoLT5wYXRoW3BhdGgtPmRlcHRoIC0gMV0gPT0gbmlkKSB7CisJCQlib29sIHBpbl9vbGQgPSBwYXRoLT5waW5fZW5hYmxlZDsKKwkJCWJvb2wgc3RyZWFtX29sZCA9IHBhdGgtPnN0cmVhbV9lbmFibGVkOworCisJCQlpZiAocGluX3N0YXRlID49IDApCisJCQkJcGF0aC0+cGluX2VuYWJsZWQgPSBwaW5fc3RhdGU7CisJCQlpZiAoc3RyZWFtX3N0YXRlID49IDApCisJCQkJcGF0aC0+c3RyZWFtX2VuYWJsZWQgPSBzdHJlYW1fc3RhdGU7CisJCQlpZiAoKCFwYXRoLT5waW5fZml4ZWQgJiYgcGF0aC0+cGluX2VuYWJsZWQgIT0gcGluX29sZCkKKwkJCSAgICB8fCBwYXRoLT5zdHJlYW1fZW5hYmxlZCAhPSBzdHJlYW1fb2xkKSB7CisJCQkJbGFzdCA9IHBhdGhfcG93ZXJfdXBkYXRlKGNvZGVjLCBwYXRoLCB0cnVlKTsKKwkJCQlpZiAobGFzdCkKKwkJCQkJY2hhbmdlZCA9IGxhc3Q7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGNoYW5nZWQ7Cit9CisKKy8qIGNoZWNrIHRoZSBqYWNrIHN0YXR1cyBmb3IgcG93ZXIgY29udHJvbCAqLworc3RhdGljIGJvb2wgZGV0ZWN0X3Bpbl9zdGF0ZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbikKK3sKKwlpZiAoIWlzX2phY2tfZGV0ZWN0YWJsZShjb2RlYywgcGluKSkKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIHNuZF9oZGFfamFja19kZXRlY3Rfc3RhdGUoY29kZWMsIHBpbikgIT0gSERBX0pBQ0tfTk9UX1BSRVNFTlQ7Cit9CisKKy8qIHBvd2VyIHVwL2Rvd24gdGhlIHBhdGhzIG9mIHRoZSBnaXZlbiBwaW4gYWNjb3JkaW5nIHRvIHRoZSBqYWNrIHN0YXRlOworICogcG93ZXIgPSAwLzEgOiBvbmx5IHBvd2VyIHVwL2Rvd24gaWYgaXQgbWF0Y2hlcyB3aXRoIHRoZSBqYWNrIHN0YXRlLAorICogICAgICAgPCAwICAgOiBmb3JjZSBwb3dlciB1cC9kb3duIHRvIGZvbGxvdyB0aGUgamFjayBzYXRlCisgKgorICogcmV0dXJucyB0aGUgbGFzdCBjaGFuZ2VkIE5JRCwgb3IgemVybyBpZiB1bmNoYW5nZWQuCisgKi8KK3N0YXRpYyBoZGFfbmlkX3Qgc2V0X3Bpbl9wb3dlcl9qYWNrKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgcGluLAorCQkJCSAgICBpbnQgcG93ZXIpCit7CisJYm9vbCBvbjsKKworCWlmICghY29kZWMtPnBvd2VyX3NhdmVfbm9kZSkKKwkJcmV0dXJuIDA7CisKKwlvbiA9IGRldGVjdF9waW5fc3RhdGUoY29kZWMsIHBpbik7CisKKwlpZiAocG93ZXIgPj0gMCAmJiBvbiAhPSBwb3dlcikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHNldF9wYXRoX3Bvd2VyKGNvZGVjLCBwaW4sIG9uLCAtMSk7Cit9CisKK3N0YXRpYyB2b2lkIHBpbl9wb3dlcl9jYWxsYmFjayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCSAgICAgICBzdHJ1Y3QgaGRhX2phY2tfY2FsbGJhY2sgKmphY2ssCisJCQkgICAgICAgYm9vbCBvbikKK3sKKwlpZiAoamFjayAmJiBqYWNrLT50YmwtPm5pZCkKKwkJc3luY19wb3dlcl9zdGF0ZV9jaGFuZ2UoY29kZWMsCisJCQkJCXNldF9waW5fcG93ZXJfamFjayhjb2RlYywgamFjay0+dGJsLT5uaWQsIG9uKSk7Cit9CisKKy8qIGNhbGxiYWNrIG9ubHkgZG9pbmcgcG93ZXIgdXAgLS0gY2FsbGVkIGF0IGZpcnN0ICovCitzdGF0aWMgdm9pZCBwaW5fcG93ZXJfdXBfY2FsbGJhY2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCisJCQkJICBzdHJ1Y3QgaGRhX2phY2tfY2FsbGJhY2sgKmphY2spCit7CisJcGluX3Bvd2VyX2NhbGxiYWNrKGNvZGVjLCBqYWNrLCB0cnVlKTsKK30KKworLyogY2FsbGJhY2sgb25seSBkb2luZyBwb3dlciBkb3duIC0tIGNhbGxlZCBhdCBsYXN0ICovCitzdGF0aWMgdm9pZCBwaW5fcG93ZXJfZG93bl9jYWxsYmFjayhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKKwkJCQkgICAgc3RydWN0IGhkYV9qYWNrX2NhbGxiYWNrICpqYWNrKQoreworCXBpbl9wb3dlcl9jYWxsYmFjayhjb2RlYywgamFjaywgZmFsc2UpOworfQorCisvKiBzZXQgdXAgdGhlIHBvd2VyIHVwL2Rvd24gY2FsbGJhY2tzICovCitzdGF0aWMgdm9pZCBhZGRfcGluX3Bvd2VyX2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBudW1fcGlucywKKwkJCSAgICAgICBjb25zdCBoZGFfbmlkX3QgKnBpbnMsIGJvb2wgb24pCit7CisJaW50IGk7CisJaGRhX2phY2tfY2FsbGJhY2tfZm4gY2IgPQorCQlvbiA/IHBpbl9wb3dlcl91cF9jYWxsYmFjayA6IHBpbl9wb3dlcl9kb3duX2NhbGxiYWNrOworCisJZm9yIChpID0gMDsgaSA8IG51bV9waW5zICYmIHBpbnNbaV07IGkrKykgeworCQlpZiAoaXNfamFja19kZXRlY3RhYmxlKGNvZGVjLCBwaW5zW2ldKSkKKwkJCXNuZF9oZGFfamFja19kZXRlY3RfZW5hYmxlX2NhbGxiYWNrKGNvZGVjLCBwaW5zW2ldLCBjYik7CisJCWVsc2UKKwkJCXNldF9wYXRoX3Bvd2VyKGNvZGVjLCBwaW5zW2ldLCB0cnVlLCAtMSk7CisJfQorfQorCisvKiBlbmFibGVkIHBvd2VyIGNhbGxiYWNrIHRvIGVhY2ggYXZhaWxhYmxlIEkvTyBwaW4gd2l0aCBqYWNrIGRldGVjdGlvbnM7CisgKiB0aGUgZGlnaXRhbCBJL08gcGlucyBhcmUgZXhjbHVkZWQgYmVjYXVzZSBvZiB0aGUgdW5yZWxpYWJsZSBkZXRlY3RzaW9uCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9hbGxfcGluX3Bvd2VyX2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGJvb2wgb24pCit7CisJc3RydWN0IGhkYV9nZW5fc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5hdXRvY2ZnOworCWludCBpOworCisJaWYgKCFjb2RlYy0+cG93ZXJfc2F2ZV9ub2RlKQorCQlyZXR1cm47CisJYWRkX3Bpbl9wb3dlcl9jdGxzKGNvZGVjLCBjZmctPmxpbmVfb3V0cywgY2ZnLT5saW5lX291dF9waW5zLCBvbik7CisJaWYgKGNmZy0+bGluZV9vdXRfdHlwZSAhPSBBVVRPX1BJTl9IUF9PVVQpCisJCWFkZF9waW5fcG93ZXJfY3Rscyhjb2RlYywgY2ZnLT5ocF9vdXRzLCBjZmctPmhwX3BpbnMsIG9uKTsKKwlpZiAoY2ZnLT5saW5lX291dF90eXBlICE9IEFVVE9fUElOX1NQRUFLRVJfT1VUKQorCQlhZGRfcGluX3Bvd2VyX2N0bHMoY29kZWMsIGNmZy0+c3BlYWtlcl9vdXRzLCBjZmctPnNwZWFrZXJfcGlucywgb24pOworCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykKKwkJYWRkX3Bpbl9wb3dlcl9jdGxzKGNvZGVjLCAxLCAmY2ZnLT5pbnB1dHNbaV0ucGluLCBvbik7Cit9CisKKy8qIHN5bmMgcGF0aCBwb3dlciB1cC9kb3duIHdpdGggdGhlIGphY2sgc3RhdGVzIG9mIGdpdmVuIHBpbnMgKi8KK3N0YXRpYyB2b2lkIHN5bmNfcGluX3Bvd2VyX2N0bHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGludCBudW1fcGlucywKKwkJCQljb25zdCBoZGFfbmlkX3QgKnBpbnMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BpbnMgJiYgcGluc1tpXTsgaSsrKQorCQlpZiAoaXNfamFja19kZXRlY3RhYmxlKGNvZGVjLCBwaW5zW2ldKSkKKwkJCXNldF9waW5fcG93ZXJfamFjayhjb2RlYywgcGluc1tpXSwgLTEpOworfQorCisvKiBzeW5jIHBhdGggcG93ZXIgdXAvZG93biB3aXRoIHBpbnM7IGNhbGxlZCBhdCBpbml0IGFuZCByZXN1bWUgKi8KK3N0YXRpYyB2b2lkIHN5bmNfYWxsX3Bpbl9wb3dlcl9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBoZGFfZ2VuX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKKwlpbnQgaTsKKworCWlmICghY29kZWMtPnBvd2VyX3NhdmVfbm9kZSkKKwkJcmV0dXJuOworCXN5bmNfcGluX3Bvd2VyX2N0bHMoY29kZWMsIGNmZy0+bGluZV9vdXRzLCBjZmctPmxpbmVfb3V0X3BpbnMpOworCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgIT0gQVVUT19QSU5fSFBfT1VUKQorCQlzeW5jX3Bpbl9wb3dlcl9jdGxzKGNvZGVjLCBjZmctPmhwX291dHMsIGNmZy0+aHBfcGlucyk7CisJaWYgKGNmZy0+bGluZV9vdXRfdHlwZSAhPSBBVVRPX1BJTl9TUEVBS0VSX09VVCkKKwkJc3luY19waW5fcG93ZXJfY3Rscyhjb2RlYywgY2ZnLT5zcGVha2VyX291dHMsIGNmZy0+c3BlYWtlcl9waW5zKTsKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1faW5wdXRzOyBpKyspCisJCXN5bmNfcGluX3Bvd2VyX2N0bHMoY29kZWMsIDEsICZjZmctPmlucHV0c1tpXS5waW4pOworfQorCisvKiBhZGQgZmFrZSBwYXRocyBpZiBub3QgcHJlc2VudCB5ZXQgKi8KK3N0YXRpYyBpbnQgYWRkX2Zha2VfcGF0aHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgICBpbnQgbnVtX3BpbnMsIGNvbnN0IGhkYV9uaWRfdCAqcGlucykKK3sKKwlzdHJ1Y3QgaGRhX2dlbl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJc3RydWN0IG5pZF9wYXRoICpwYXRoOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9waW5zOyBpKyspIHsKKwkJaWYgKCFwaW5zW2ldKQorCQkJYnJlYWs7CisJCWlmIChnZXRfbmlkX3BhdGgoY29kZWMsIG5pZCwgcGluc1tpXSwgMCkpCisJCQljb250aW51ZTsKKwkJcGF0aCA9IHNuZF9hcnJheV9uZXcoJnNwZWMtPnBhdGhzKTsKKwkJaWYgKCFwYXRoKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCW1lbXNldChwYXRoLCAwLCBzaXplb2YoKnBhdGgpKTsKKwkJcGF0aC0+ZGVwdGggPSAyOworCQlwYXRoLT5wYXRoWzBdID0gbmlkOworCQlwYXRoLT5wYXRoWzFdID0gcGluc1tpXTsKKwkJcGF0aC0+YWN0aXZlID0gdHJ1ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGNyZWF0ZSBmYWtlIHBhdGhzIHRvIGFsbCBvdXRwdXRzIGZyb20gYmVlcCAqLworc3RhdGljIGludCBhZGRfZmFrZV9iZWVwX3BhdGhzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBoZGFfZ2VuX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKKwloZGFfbmlkX3QgbmlkID0gc3BlYy0+YmVlcF9uaWQ7CisJaW50IGVycjsKKworCWlmICghY29kZWMtPnBvd2VyX3NhdmVfbm9kZSB8fCAhbmlkKQorCQlyZXR1cm4gMDsKKwllcnIgPSBhZGRfZmFrZV9wYXRocyhjb2RlYywgbmlkLCBjZmctPmxpbmVfb3V0cywgY2ZnLT5saW5lX291dF9waW5zKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwlpZiAoY2ZnLT5saW5lX291dF90eXBlICE9IEFVVE9fUElOX0hQX09VVCkgeworCQllcnIgPSBhZGRfZmFrZV9wYXRocyhjb2RlYywgbmlkLCBjZmctPmhwX291dHMsIGNmZy0+aHBfcGlucyk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisJaWYgKGNmZy0+bGluZV9vdXRfdHlwZSAhPSBBVVRPX1BJTl9TUEVBS0VSX09VVCkgeworCQllcnIgPSBhZGRfZmFrZV9wYXRocyhjb2RlYywgbmlkLCBjZmctPnNwZWFrZXJfb3V0cywKKwkJCQkgICAgIGNmZy0+c3BlYWtlcl9waW5zKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogcG93ZXIgdXAvZG93biBiZWVwIHdpZGdldCBhbmQgaXRzIG91dHB1dCBwYXRocyAqLworc3RhdGljIHZvaWQgYmVlcF9wb3dlcl9ob29rKHN0cnVjdCBoZGFfYmVlcCAqYmVlcCwgYm9vbCBvbikKK3sKKwlzZXRfcGF0aF9wb3dlcihiZWVwLT5jb2RlYywgYmVlcC0+bmlkLCAtMSwgb24pOworfQorCisvKioKKyAqIHNuZF9oZGFfZ2VuX2ZpeF9waW5fcG93ZXIgLSBGaXggdGhlIHBvd2VyIG9mIHRoZSBnaXZlbiBwaW4gd2lkZ2V0IHRvIEQwCisgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKKyAqIEBwaW46IE5JRCBvZiBwaW4gdG8gZml4CisgKi8KK2ludCBzbmRfaGRhX2dlbl9maXhfcGluX3Bvd2VyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgcGluKQoreworCXN0cnVjdCBoZGFfZ2VuX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKKwlzdHJ1Y3QgbmlkX3BhdGggKnBhdGg7CisKKwlwYXRoID0gc25kX2FycmF5X25ldygmc3BlYy0+cGF0aHMpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtc2V0KHBhdGgsIDAsIHNpemVvZigqcGF0aCkpOworCXBhdGgtPmRlcHRoID0gMTsKKwlwYXRoLT5wYXRoWzBdID0gcGluOworCXBhdGgtPmFjdGl2ZSA9IHRydWU7CisJcGF0aC0+cGluX2ZpeGVkID0gdHJ1ZTsKKwlwYXRoLT5zdHJlYW1fZW5hYmxlZCA9IHRydWU7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzbmRfaGRhX2dlbl9maXhfcGluX3Bvd2VyKTsKIAogLyoKICAqIEphY2sgZGV0ZWN0aW9ucyBmb3IgSFAgYXV0by1tdXRlIGFuZCBtaWMtc3dpdGNoCkBAIC0zOTE2LDYgKzQxOTMsMTAgQEAKIAkJaWYgKCFuaWQpCiAJCQlicmVhazsKIAorCQlvbGR2YWwgPSBzbmRfaGRhX2NvZGVjX2dldF9waW5fdGFyZ2V0KGNvZGVjLCBuaWQpOworCQlpZiAob2xkdmFsICYgUElOX0lOKQorCQkJY29udGludWU7IC8qIG5vIG11dGUgZm9yIGlucHV0cyAqLworCiAJCWlmIChzcGVjLT5hdXRvX211dGVfdmlhX2FtcCkgewogCQkJc3RydWN0IG5pZF9wYXRoICpwYXRoOwogCQkJaGRhX25pZF90IG11dGVfbmlkOwpAQCAtMzkzMCwyOSArNDIxMSwzMiBAQAogCQkJCXNwZWMtPm11dGVfYml0cyB8PSAoMVVMTCA8PCBtdXRlX25pZCk7CiAJCQllbHNlCiAJCQkJc3BlYy0+bXV0ZV9iaXRzICY9IH4oMVVMTCA8PCBtdXRlX25pZCk7Ci0JCQlzZXRfcGluX2VhcGQoY29kZWMsIG5pZCwgIW11dGUpOwogCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQkvKiBkb24ndCByZXNldCBWUkVGIHZhbHVlIGluIGNhc2UgaXQncyBjb250cm9sbGluZworCQkJICogdGhlIGFtcCAoc2VlIGFsYzg2MV9maXh1cF9hc3VzX2FtcF92cmVmXzBmKCkpCisJCQkgKi8KKwkJCWlmIChzcGVjLT5rZWVwX3ZyZWZfaW5fYXV0b211dGUpCisJCQkJdmFsID0gb2xkdmFsICYgflBJTl9IUDsKKwkJCWVsc2UKKwkJCQl2YWwgPSAwOworCQkJaWYgKCFtdXRlKQorCQkJCXZhbCB8PSBvbGR2YWw7CisJCQkvKiBoZXJlIHdlIGNhbGwgdXBkYXRlX3Bpbl9jdGwoKSBzbyB0aGF0IHRoZSBwaW5jdGwgaXMKKwkJCSAqIGNoYW5nZWQgd2l0aG91dCBjaGFuZ2luZyB0aGUgcGluY3RsIHRhcmdldCB2YWx1ZTsKKwkJCSAqIHRoZSBvcmlnaW5hbCB0YXJnZXQgdmFsdWUgd2lsbCBiZSBzdGlsbCByZWZlcnJlZCBhdAorCQkJICogdGhlIGluaXQgLyByZXN1bWUgYWdhaW4KKwkJCSAqLworCQkJdXBkYXRlX3Bpbl9jdGwoY29kZWMsIG5pZCwgdmFsKTsKIAkJfQogCi0JCW9sZHZhbCA9IHNuZF9oZGFfY29kZWNfZ2V0X3Bpbl90YXJnZXQoY29kZWMsIG5pZCk7Ci0JCWlmIChvbGR2YWwgJiBQSU5fSU4pCi0JCQljb250aW51ZTsgLyogbm8gbXV0ZSBmb3IgaW5wdXRzICovCi0JCS8qIGRvbid0IHJlc2V0IFZSRUYgdmFsdWUgaW4gY2FzZSBpdCdzIGNvbnRyb2xsaW5nCi0JCSAqIHRoZSBhbXAgKHNlZSBhbGM4NjFfZml4dXBfYXN1c19hbXBfdnJlZl8wZigpKQotCQkgKi8KLQkJaWYgKHNwZWMtPmtlZXBfdnJlZl9pbl9hdXRvbXV0ZSkKLQkJCXZhbCA9IG9sZHZhbCAmIH5QSU5fSFA7Ci0JCWVsc2UKLQkJCXZhbCA9IDA7Ci0JCWlmICghbXV0ZSkKLQkJCXZhbCB8PSBvbGR2YWw7Ci0JCS8qIGhlcmUgd2UgY2FsbCB1cGRhdGVfcGluX2N0bCgpIHNvIHRoYXQgdGhlIHBpbmN0bCBpcyBjaGFuZ2VkCi0JCSAqIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHBpbmN0bCB0YXJnZXQgdmFsdWU7Ci0JCSAqIHRoZSBvcmlnaW5hbCB0YXJnZXQgdmFsdWUgd2lsbCBiZSBzdGlsbCByZWZlcnJlZCBhdCB0aGUKLQkJICogaW5pdCAvIHJlc3VtZSBhZ2FpbgotCQkgKi8KLQkJdXBkYXRlX3Bpbl9jdGwoY29kZWMsIG5pZCwgdmFsKTsKIAkJc2V0X3Bpbl9lYXBkKGNvZGVjLCBuaWQsICFtdXRlKTsKKwkJaWYgKGNvZGVjLT5wb3dlcl9zYXZlX25vZGUpIHsKKwkJCWJvb2wgb24gPSAhbXV0ZTsKKwkJCWlmIChvbikKKwkJCQlvbiA9IGRldGVjdF9waW5fc3RhdGUoY29kZWMsIG5pZCk7CisJCQlzZXRfcGF0aF9wb3dlcihjb2RlYywgbmlkLCBvbiwgLTEpOworCQl9CiAJfQogfQogCkBAIC00NDE5LDcgKzQ3MDMsMTEgQEAKIAkJCQkJCSAgaGRhX25pZF90IG5pZCwKIAkJCQkJCSAgdW5zaWduZWQgaW50IHBvd2VyX3N0YXRlKQogewotCWlmIChwb3dlcl9zdGF0ZSAhPSBBQ19QV1JTVF9EMCB8fCBuaWQgPT0gY29kZWMtPmFmZykKKwlzdHJ1Y3QgaGRhX2dlbl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisKKwlpZiAoIXNwZWMtPnBvd2VyX2Rvd25fdW51c2VkICYmICFjb2RlYy0+cG93ZXJfc2F2ZV9ub2RlKQorCQlyZXR1cm4gcG93ZXJfc3RhdGU7CisJaWYgKHBvd2VyX3N0YXRlICE9IEFDX1BXUlNUX0QwIHx8IG5pZCA9PSBjb2RlYy0+Y29yZS5hZmcpCiAJCXJldHVybiBwb3dlcl9zdGF0ZTsKIAlpZiAoZ2V0X3djYXBzX3R5cGUoZ2V0X3djYXBzKGNvZGVjLCBuaWQpKSA+PSBBQ19XSURfUE9XRVIpCiAJCXJldHVybiBwb3dlcl9zdGF0ZTsKQEAgLTQ0NDksNiArNDczNywyMSBAQAogfQogCiAvKioKKyAqIHNuZF9oZGFfZ2VuX3N0cmVhbV9wbSAtIFN0cmVhbSBwb3dlciBtYW5hZ2VtZW50IGNhbGxiYWNrCisgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKKyAqIEBuaWQ6IGF1ZGlvIHdpZGdldAorICogQG9uOiBwb3dlciBvbi9vZmYgZmxhZworICoKKyAqIFNldCB0aGlzIGluIHBhdGNoX29wcy5zdHJlYW1fcG0uICBPbmx5IHZhbGlkIHdpdGggcG93ZXJfc2F2ZV9ub2RlIGZsYWcuCisgKi8KK3ZvaWQgc25kX2hkYV9nZW5fc3RyZWFtX3BtKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBib29sIG9uKQoreworCWlmIChjb2RlYy0+cG93ZXJfc2F2ZV9ub2RlKQorCQlzZXRfcGF0aF9wb3dlcihjb2RlYywgbmlkLCAtMSwgb24pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9nZW5fc3RyZWFtX3BtKTsKKworLyoqCiAgKiBzbmRfaGRhX2dlbl9wYXJzZV9hdXRvX2NvbmZpZyAtIFBhcnNlIHRoZSBnaXZlbiBCSU9TIGNvbmZpZ3VyYXRpb24gYW5kCiAgKiBzZXQgdXAgdGhlIGhkYV9nZW5fc3BlYwogICogQGNvZGVjOiB0aGUgSERBIGNvZGVjCkBAIC00NTMyLDYgKzQ4MzUsOSBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCisJLyogYWRkIHBvd2VyLWRvd24gcGluIGNhbGxiYWNrcyBhdCBmaXJzdCAqLworCWFkZF9hbGxfcGluX3Bvd2VyX2N0bHMoY29kZWMsIGZhbHNlKTsKKwogCXNwZWMtPmNvbnN0X2NoYW5uZWxfY291bnQgPSBzcGVjLT5leHRfY2hhbm5lbF9jb3VudDsKIAkvKiBjaGVjayB0aGUgbXVsdGlwbGUgc3BlYWtlciBhbmQgaGVhZHBob25lIHBpbnMgKi8KIAlpZiAoY2ZnLT5saW5lX291dF90eXBlICE9IEFVVE9fUElOX1NQRUFLRVJfT1VUKQpAQCAtNDYwMSw2ICs0OTA3LDkgQEAKIAkJfQogCX0KIAorCS8qIGFkZCBwb3dlci11cCBwaW4gY2FsbGJhY2tzIGF0IGxhc3QgKi8KKwlhZGRfYWxsX3Bpbl9wb3dlcl9jdGxzKGNvZGVjLCB0cnVlKTsKKwogCS8qIG11dGUgYWxsIGFhbWl4IGlucHV0IGluaXRpYWxseSAqLwogCWlmIChzcGVjLT5taXhlcl9uaWQpCiAJCW11dGVfYWxsX21peGVyX25pZChjb2RlYywgc3BlYy0+bWl4ZXJfbmlkKTsKQEAgLTQ2MDgsMTMgKzQ5MTcsMjAgQEAKICBkaWdfb25seToKIAlwYXJzZV9kaWdpdGFsKGNvZGVjKTsKIAotCWlmIChzcGVjLT5wb3dlcl9kb3duX3VudXNlZCkKLQkJY29kZWMtPnBvd2VyX2ZpbHRlciA9IHNuZF9oZGFfZ2VuX3BhdGhfcG93ZXJfZmlsdGVyOworCWlmIChzcGVjLT5wb3dlcl9kb3duX3VudXNlZCB8fCBjb2RlYy0+cG93ZXJfc2F2ZV9ub2RlKQorCQlpZiAoIWNvZGVjLT5wb3dlcl9maWx0ZXIpCisJCQljb2RlYy0+cG93ZXJfZmlsdGVyID0gc25kX2hkYV9nZW5fcGF0aF9wb3dlcl9maWx0ZXI7CiAKIAlpZiAoIXNwZWMtPm5vX2FuYWxvZyAmJiBzcGVjLT5iZWVwX25pZCkgewogCQllcnIgPSBzbmRfaGRhX2F0dGFjaF9iZWVwX2RldmljZShjb2RlYywgc3BlYy0+YmVlcF9uaWQpOwogCQlpZiAoZXJyIDwgMCkKIAkJCXJldHVybiBlcnI7CisJCWlmIChjb2RlYy0+YmVlcCAmJiBjb2RlYy0+cG93ZXJfc2F2ZV9ub2RlKSB7CisJCQllcnIgPSBhZGRfZmFrZV9iZWVwX3BhdGhzKGNvZGVjKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQljb2RlYy0+YmVlcC0+cG93ZXJfaG9vayA9IGJlZXBfcG93ZXJfaG9vazsKKwkJfQogCX0KIAogCXJldHVybiAxOwpAQCAtNDY1OCw3ICs0OTc0LDcgQEAKIAkJZXJyID0gc25kX2hkYV9jcmVhdGVfZGlnX291dF9jdGxzKGNvZGVjLAogCQkJCQkJICBzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCwKIAkJCQkJCSAgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQsCi0JCQkJCQkgIHNwZWMtPnBjbV9yZWNbMV0ucGNtX3R5cGUpOworCQkJCQkJICBzcGVjLT5wY21fcmVjWzFdLT5wY21fdHlwZSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAkJaWYgKCFzcGVjLT5ub19hbmFsb2cpIHsKQEAgLTUxMjAsNiArNTQzNiwzMyBAQAogCXN0cmxjYXQoc3RyLCBzZngsIGxlbik7CiB9CiAKKy8qIGNvcHkgUENNIHN0cmVhbSBpbmZvIGZyb20gQGRlZmF1bHRfc3RyLCBhbmQgb3ZlcnJpZGUgbm9uLU5VTEwgZW50cmllcworICogZnJvbSBAc3BlY19zdHIgYW5kIEBuaWQKKyAqLworc3RhdGljIHZvaWQgc2V0dXBfcGNtX3N0cmVhbShzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKnN0ciwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtICpkZWZhdWx0X3N0ciwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtICpzcGVjX3N0ciwKKwkJCSAgICAgaGRhX25pZF90IG5pZCkKK3sKKwkqc3RyID0gKmRlZmF1bHRfc3RyOworCWlmIChuaWQpCisJCXN0ci0+bmlkID0gbmlkOworCWlmIChzcGVjX3N0cikgeworCQlpZiAoc3BlY19zdHItPnN1YnN0cmVhbXMpCisJCQlzdHItPnN1YnN0cmVhbXMgPSBzcGVjX3N0ci0+c3Vic3RyZWFtczsKKwkJaWYgKHNwZWNfc3RyLT5jaGFubmVsc19taW4pCisJCQlzdHItPmNoYW5uZWxzX21pbiA9IHNwZWNfc3RyLT5jaGFubmVsc19taW47CisJCWlmIChzcGVjX3N0ci0+Y2hhbm5lbHNfbWF4KQorCQkJc3RyLT5jaGFubmVsc19tYXggPSBzcGVjX3N0ci0+Y2hhbm5lbHNfbWF4OworCQlpZiAoc3BlY19zdHItPnJhdGVzKQorCQkJc3RyLT5yYXRlcyA9IHNwZWNfc3RyLT5yYXRlczsKKwkJaWYgKHNwZWNfc3RyLT5mb3JtYXRzKQorCQkJc3RyLT5mb3JtYXRzID0gc3BlY19zdHItPmZvcm1hdHM7CisJCWlmIChzcGVjX3N0ci0+bWF4YnBzKQorCQkJc3RyLT5tYXhicHMgPSBzcGVjX3N0ci0+bWF4YnBzOworCX0KK30KKwogLyoqCiAgKiBzbmRfaGRhX2dlbl9idWlsZF9wY21zIC0gYnVpbGQgUENNIHN0cmVhbXMgYmFzZWQgb24gdGhlIHBhcnNlZCByZXN1bHRzCiAgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKQEAgLTUxMjksMjcgKzU0NzIsMjUgQEAKIGludCBzbmRfaGRhX2dlbl9idWlsZF9wY21zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBoZGFfZ2VuX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlzdHJ1Y3QgaGRhX3BjbSAqaW5mbyA9IHNwZWMtPnBjbV9yZWM7Ci0JY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtICpwOworCXN0cnVjdCBoZGFfcGNtICppbmZvOwogCWJvb2wgaGF2ZV9tdWx0aV9hZGNzOwogCi0JY29kZWMtPm51bV9wY21zID0gMTsKLQljb2RlYy0+cGNtX2luZm8gPSBpbmZvOwotCiAJaWYgKHNwZWMtPm5vX2FuYWxvZykKIAkJZ290byBza2lwX2FuYWxvZzsKIAogCWZpbGxfcGNtX3N0cmVhbV9uYW1lKHNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZywKIAkJCSAgICAgc2l6ZW9mKHNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyksCi0JCQkgICAgICIgQW5hbG9nIiwgY29kZWMtPmNoaXBfbmFtZSk7Ci0JaW5mby0+bmFtZSA9IHNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZzsKKwkJCSAgICAgIiBBbmFsb2ciLCBjb2RlYy0+Y29yZS5jaGlwX25hbWUpOworCWluZm8gPSBzbmRfaGRhX2NvZGVjX3BjbV9uZXcoY29kZWMsICIlcyIsIHNwZWMtPnN0cmVhbV9uYW1lX2FuYWxvZyk7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzcGVjLT5wY21fcmVjWzBdID0gaW5mbzsKIAogCWlmIChzcGVjLT5tdWx0aW91dC5udW1fZGFjcyA+IDApIHsKLQkJcCA9IHNwZWMtPnN0cmVhbV9hbmFsb2dfcGxheWJhY2s7Ci0JCWlmICghcCkKLQkJCXAgPSAmcGNtX2FuYWxvZ19wbGF5YmFjazsKLQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0gKnA7Ci0JCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPSBzcGVjLT5tdWx0aW91dC5kYWNfbmlkc1swXTsKKwkJc2V0dXBfcGNtX3N0cmVhbSgmaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLAorCQkJCSAmcGNtX2FuYWxvZ19wbGF5YmFjaywKKwkJCQkgc3BlYy0+c3RyZWFtX2FuYWxvZ19wbGF5YmFjaywKKwkJCQkgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHNbMF0pOwogCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uY2hhbm5lbHNfbWF4ID0KIAkJCXNwZWMtPm11bHRpb3V0Lm1heF9jaGFubmVsczsKIAkJaWYgKHNwZWMtPmF1dG9jZmcubGluZV9vdXRfdHlwZSA9PSBBVVRPX1BJTl9TUEVBS0VSX09VVCAmJgpAQCAtNTE1OCwxNSArNTQ5OSwxMSBAQAogCQkJCXNuZF9wY21fMl8xX2NobWFwczsKIAl9CiAJaWYgKHNwZWMtPm51bV9hZGNfbmlkcykgewotCQlwID0gc3BlYy0+c3RyZWFtX2FuYWxvZ19jYXB0dXJlOwotCQlpZiAoIXApIHsKLQkJCWlmIChzcGVjLT5keW5fYWRjX3N3aXRjaCkKLQkJCQlwID0gJmR5bl9hZGNfcGNtX2FuYWxvZ19jYXB0dXJlOwotCQkJZWxzZQotCQkJCXAgPSAmcGNtX2FuYWxvZ19jYXB0dXJlOwotCQl9Ci0JCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gKnA7Ci0JCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLm5pZCA9IHNwZWMtPmFkY19uaWRzWzBdOworCQlzZXR1cF9wY21fc3RyZWFtKCZpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSwKKwkJCQkgKHNwZWMtPmR5bl9hZGNfc3dpdGNoID8KKwkJCQkgICZkeW5fYWRjX3BjbV9hbmFsb2dfY2FwdHVyZSA6ICZwY21fYW5hbG9nX2NhcHR1cmUpLAorCQkJCSBzcGVjLT5zdHJlYW1fYW5hbG9nX2NhcHR1cmUsCisJCQkJIHNwZWMtPmFkY19uaWRzWzBdKTsKIAl9CiAKICBza2lwX2FuYWxvZzoKQEAgLTUxNzQsMjkgKzU1MTEsMjcgQEAKIAlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQgfHwgc3BlYy0+ZGlnX2luX25pZCkgewogCQlmaWxsX3BjbV9zdHJlYW1fbmFtZShzcGVjLT5zdHJlYW1fbmFtZV9kaWdpdGFsLAogCQkJCSAgICAgc2l6ZW9mKHNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwpLAotCQkJCSAgICAgIiBEaWdpdGFsIiwgY29kZWMtPmNoaXBfbmFtZSk7Ci0JCWNvZGVjLT5udW1fcGNtcyA9IDI7CisJCQkJICAgICAiIERpZ2l0YWwiLCBjb2RlYy0+Y29yZS5jaGlwX25hbWUpOworCQlpbmZvID0gc25kX2hkYV9jb2RlY19wY21fbmV3KGNvZGVjLCAiJXMiLAorCQkJCQkgICAgIHNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWwpOworCQlpZiAoIWluZm8pCisJCQlyZXR1cm4gLUVOT01FTTsKIAkJY29kZWMtPnNsYXZlX2RpZ19vdXRzID0gc3BlYy0+bXVsdGlvdXQuc2xhdmVfZGlnX291dHM7Ci0JCWluZm8gPSBzcGVjLT5wY21fcmVjICsgMTsKLQkJaW5mby0+bmFtZSA9IHNwZWMtPnN0cmVhbV9uYW1lX2RpZ2l0YWw7CisJCXNwZWMtPnBjbV9yZWNbMV0gPSBpbmZvOwogCQlpZiAoc3BlYy0+ZGlnX291dF90eXBlKQogCQkJaW5mby0+cGNtX3R5cGUgPSBzcGVjLT5kaWdfb3V0X3R5cGU7CiAJCWVsc2UKIAkJCWluZm8tPnBjbV90eXBlID0gSERBX1BDTV9UWVBFX1NQRElGOwotCQlpZiAoc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpIHsKLQkJCXAgPSBzcGVjLT5zdHJlYW1fZGlnaXRhbF9wbGF5YmFjazsKLQkJCWlmICghcCkKLQkJCQlwID0gJnBjbV9kaWdpdGFsX3BsYXliYWNrOwotCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0gKnA7Ci0JCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10ubmlkID0gc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQ7Ci0JCX0KLQkJaWYgKHNwZWMtPmRpZ19pbl9uaWQpIHsKLQkJCXAgPSBzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlOwotCQkJaWYgKCFwKQotCQkJCXAgPSAmcGNtX2RpZ2l0YWxfY2FwdHVyZTsKLQkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gKnA7Ci0JCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPSBzcGVjLT5kaWdfaW5fbmlkOwotCQl9CisJCWlmIChzcGVjLT5tdWx0aW91dC5kaWdfb3V0X25pZCkKKwkJCXNldHVwX3BjbV9zdHJlYW0oJmluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSwKKwkJCQkJICZwY21fZGlnaXRhbF9wbGF5YmFjaywKKwkJCQkJIHNwZWMtPnN0cmVhbV9kaWdpdGFsX3BsYXliYWNrLAorCQkJCQkgc3BlYy0+bXVsdGlvdXQuZGlnX291dF9uaWQpOworCQlpZiAoc3BlYy0+ZGlnX2luX25pZCkKKwkJCXNldHVwX3BjbV9zdHJlYW0oJmluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLAorCQkJCQkgJnBjbV9kaWdpdGFsX2NhcHR1cmUsCisJCQkJCSBzcGVjLT5zdHJlYW1fZGlnaXRhbF9jYXB0dXJlLAorCQkJCQkgc3BlYy0+ZGlnX2luX25pZCk7CiAJfQogCiAJaWYgKHNwZWMtPm5vX2FuYWxvZykKQEAgLTUyMTEsMzUgKzU1NDYsMzAgQEAKIAlpZiAoc3BlYy0+YWx0X2RhY19uaWQgfHwgaGF2ZV9tdWx0aV9hZGNzKSB7CiAJCWZpbGxfcGNtX3N0cmVhbV9uYW1lKHNwZWMtPnN0cmVhbV9uYW1lX2FsdF9hbmFsb2csCiAJCQkJICAgICBzaXplb2Yoc3BlYy0+c3RyZWFtX25hbWVfYWx0X2FuYWxvZyksCi0JCQkgICAgICIgQWx0IEFuYWxvZyIsIGNvZGVjLT5jaGlwX25hbWUpOwotCQljb2RlYy0+bnVtX3BjbXMgPSAzOwotCQlpbmZvID0gc3BlYy0+cGNtX3JlYyArIDI7Ci0JCWluZm8tPm5hbWUgPSBzcGVjLT5zdHJlYW1fbmFtZV9hbHRfYW5hbG9nOwotCQlpZiAoc3BlYy0+YWx0X2RhY19uaWQpIHsKLQkJCXAgPSBzcGVjLT5zdHJlYW1fYW5hbG9nX2FsdF9wbGF5YmFjazsKLQkJCWlmICghcCkKLQkJCQlwID0gJnBjbV9hbmFsb2dfYWx0X3BsYXliYWNrOwotCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0gKnA7Ci0JCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10ubmlkID0KLQkJCQlzcGVjLT5hbHRfZGFjX25pZDsKLQkJfSBlbHNlIHsKLQkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9Ci0JCQkJcGNtX251bGxfc3RyZWFtOwotCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLm5pZCA9IDA7Ci0JCX0KKwkJCSAgICAgIiBBbHQgQW5hbG9nIiwgY29kZWMtPmNvcmUuY2hpcF9uYW1lKTsKKwkJaW5mbyA9IHNuZF9oZGFfY29kZWNfcGNtX25ldyhjb2RlYywgIiVzIiwKKwkJCQkJICAgICBzcGVjLT5zdHJlYW1fbmFtZV9hbHRfYW5hbG9nKTsKKwkJaWYgKCFpbmZvKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXNwZWMtPnBjbV9yZWNbMl0gPSBpbmZvOworCQlpZiAoc3BlYy0+YWx0X2RhY19uaWQpCisJCQlzZXR1cF9wY21fc3RyZWFtKCZpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10sCisJCQkJCSAmcGNtX2FuYWxvZ19hbHRfcGxheWJhY2ssCisJCQkJCSBzcGVjLT5zdHJlYW1fYW5hbG9nX2FsdF9wbGF5YmFjaywKKwkJCQkJIHNwZWMtPmFsdF9kYWNfbmlkKTsKKwkJZWxzZQorCQkJc2V0dXBfcGNtX3N0cmVhbSgmaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLAorCQkJCQkgJnBjbV9udWxsX3N0cmVhbSwgTlVMTCwgMCk7CiAJCWlmIChoYXZlX211bHRpX2FkY3MpIHsKLQkJCXAgPSBzcGVjLT5zdHJlYW1fYW5hbG9nX2FsdF9jYXB0dXJlOwotCQkJaWYgKCFwKQotCQkJCXAgPSAmcGNtX2FuYWxvZ19hbHRfY2FwdHVyZTsKLQkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gKnA7Ci0JCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPQotCQkJCXNwZWMtPmFkY19uaWRzWzFdOworCQkJc2V0dXBfcGNtX3N0cmVhbSgmaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0sCisJCQkJCSAmcGNtX2FuYWxvZ19hbHRfY2FwdHVyZSwKKwkJCQkJIHNwZWMtPnN0cmVhbV9hbmFsb2dfYWx0X2NhcHR1cmUsCisJCQkJCSBzcGVjLT5hZGNfbmlkc1sxXSk7CiAJCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW1zID0KIAkJCQlzcGVjLT5udW1fYWRjX25pZHMgLSAxOwogCQl9IGVsc2UgewotCQkJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPQotCQkJCXBjbV9udWxsX3N0cmVhbTsKLQkJCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLm5pZCA9IDA7CisJCQlzZXR1cF9wY21fc3RyZWFtKCZpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSwKKwkJCQkJICZwY21fbnVsbF9zdHJlYW0sIE5VTEwsIDApOwogCQl9CiAJfQogCkBAIC01NDM1LDggKzU3NjUsNiBAQAogCiAJc25kX2hkYV9hcHBseV92ZXJicyhjb2RlYyk7CiAKLQljb2RlYy0+Y2FjaGVkX3dyaXRlID0gMTsKLQogCWluaXRfbXVsdGlfb3V0KGNvZGVjKTsKIAlpbml0X2V4dHJhX291dChjb2RlYyk7CiAJaW5pdF9tdWx0aV9pbyhjb2RlYyk7CkBAIC01NDQ3LDEwICs1Nzc1LDEyIEBACiAKIAljbGVhcl91bnNvbF9vbl91bnVzZWRfcGlucyhjb2RlYyk7CiAKKwlzeW5jX2FsbF9waW5fcG93ZXJfY3Rscyhjb2RlYyk7CisKIAkvKiBjYWxsIGluaXQgZnVuY3Rpb25zIG9mIHN0YW5kYXJkIGF1dG8tbXV0ZSBoZWxwZXJzICovCiAJdXBkYXRlX2F1dG9tdXRlX2FsbChjb2RlYyk7CiAKLQlzbmRfaGRhX2NvZGVjX2ZsdXNoX2NhY2hlKGNvZGVjKTsKKwlyZWdjYWNoZV9zeW5jKGNvZGVjLT5jb3JlLnJlZ21hcCk7CiAKIAlpZiAoc3BlYy0+dm1hc3Rlcl9tdXRlLnN3X2tjdGwgJiYgc3BlYy0+dm1hc3Rlcl9tdXRlLmhvb2spCiAJCXNuZF9oZGFfc3luY192bWFzdGVyX2hvb2soJnNwZWMtPnZtYXN0ZXJfbXV0ZSk7CkBAIC01NTA3LDEzICs1ODM3LDExIEBACiAjZW5kaWYKIH07CiAKLS8qKgorLyoKICAqIHNuZF9oZGFfcGFyc2VfZ2VuZXJpY19jb2RlYyAtIEdlbmVyaWMgY29kZWMgcGFyc2VyCiAgKiBAY29kZWM6IHRoZSBIREEgY29kZWMKLSAqCi0gKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgSERBIGNvZGVjIGNvcmUuCiAgKi8KLWludCBzbmRfaGRhX3BhcnNlX2dlbmVyaWNfY29kZWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCitzdGF0aWMgaW50IHNuZF9oZGFfcGFyc2VfZ2VuZXJpY19jb2RlYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgaGRhX2dlbl9zcGVjICpzcGVjOwogCWludCBlcnI7CkBAIC01NTM5LDcgKzU4NjcsMTcgQEAKIAlzbmRfaGRhX2dlbl9mcmVlKGNvZGVjKTsKIAlyZXR1cm4gZXJyOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc25kX2hkYV9wYXJzZV9nZW5lcmljX2NvZGVjKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0IHNuZF9oZGFfcHJlc2V0X2dlbmVyaWNbXSA9IHsKKwl7IC5pZCA9IEhEQV9DT0RFQ19JRF9HRU5FUklDLCAucGF0Y2ggPSBzbmRfaGRhX3BhcnNlX2dlbmVyaWNfY29kZWMgfSwKKwl7fSAvKiB0ZXJtaW5hdG9yICovCit9OworCitzdGF0aWMgc3RydWN0IGhkYV9jb2RlY19kcml2ZXIgZ2VuZXJpY19kcml2ZXIgPSB7CisJLnByZXNldCA9IHNuZF9oZGFfcHJlc2V0X2dlbmVyaWMsCit9OworCittb2R1bGVfaGRhX2NvZGVjX2RyaXZlcihnZW5lcmljX2RyaXZlcik7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiR2VuZXJpYyBIRC1hdWRpbyBjb2RlYyBwYXJzZXIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2dlbmVyaWMuaAppbmRleCAzZDg1MjY2Li41NmU0MTM5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9nZW5lcmljLmgKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfZ2VuZXJpYy5oCkBAIC00Niw3ICs0NiwxMCBAQAogCXVuc2lnbmVkIGNoYXIgaWR4W01BWF9OSURfUEFUSF9ERVBUSF07CiAJdW5zaWduZWQgY2hhciBtdWx0aVtNQVhfTklEX1BBVEhfREVQVEhdOwogCXVuc2lnbmVkIGludCBjdGxzW05JRF9QQVRIX05VTV9DVExTXTsgLyogTklEX1BBVEhfWFhYX0NUTCAqLwotCWJvb2wgYWN0aXZlOworCWJvb2wgYWN0aXZlOjE7CQkvKiBhY3RpdmF0ZWQgYnkgZHJpdmVyICovCisJYm9vbCBwaW5fZW5hYmxlZDoxOwkvKiBwaW5zIGFyZSBlbmFibGVkICovCisJYm9vbCBwaW5fZml4ZWQ6MTsJLyogcGF0aCB3aXRoIGZpeGVkIHBpbiAqLworCWJvb2wgc3RyZWFtX2VuYWJsZWQ6MTsJLyogc3RyZWFtIGlzIGFjdGl2ZSAqLwogfTsKIAogLyogbWljL2xpbmUtaW4gYXV0byBzd2l0Y2hpbmcgZW50cnkgKi8KQEAgLTE0NCw3ICsxNDcsNyBAQAogCWludCBjb25zdF9jaGFubmVsX2NvdW50OwkvKiBjaGFubmVsIGNvdW50IGZvciBhbGwgKi8KIAogCS8qIFBDTSBpbmZvcm1hdGlvbiAqLwotCXN0cnVjdCBoZGFfcGNtIHBjbV9yZWNbM107CS8qIHVzZWQgaW4gYnVpbGRfcGNtcygpICovCisJc3RydWN0IGhkYV9wY20gKnBjbV9yZWNbM107CS8qIHVzZWQgaW4gYnVpbGRfcGNtcygpICovCiAKIAkvKiBkeW5hbWljIGNvbnRyb2xzLCBpbml0X3ZlcmJzIGFuZCBpbnB1dF9tdXggKi8KIAlzdHJ1Y3QgYXV0b19waW5fY2ZnIGF1dG9jZmc7CkBAIC0zNDAsNSArMzQzLDcgQEAKIHVuc2lnbmVkIGludCBzbmRfaGRhX2dlbl9wYXRoX3Bvd2VyX2ZpbHRlcihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkJICAgaGRhX25pZF90IG5pZCwKIAkJCQkJICAgdW5zaWduZWQgaW50IHBvd2VyX3N0YXRlKTsKK3ZvaWQgc25kX2hkYV9nZW5fc3RyZWFtX3BtKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBib29sIG9uKTsKK2ludCBzbmRfaGRhX2dlbl9maXhfcGluX3Bvd2VyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgcGluKTsKIAogI2VuZGlmIC8qIF9fU09VTkRfSERBX0dFTkVSSUNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfaHdkZXAuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2h3ZGVwLmMKaW5kZXggMTFiNWE0Mi4uNTdkZjA2ZSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfaHdkZXAuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9od2RlcC5jCkBAIC0xMDEsNyArMTAxLDcgQEAKIAlpbnQgZXJyOwogCiAJc3ByaW50Zihod25hbWUsICJIREEgQ29kZWMgJWQiLCBjb2RlYy0+YWRkcik7Ci0JZXJyID0gc25kX2h3ZGVwX25ldyhjb2RlYy0+YnVzLT5jYXJkLCBod25hbWUsIGNvZGVjLT5hZGRyLCAmaHdkZXApOworCWVyciA9IHNuZF9od2RlcF9uZXcoY29kZWMtPmNhcmQsIGh3bmFtZSwgY29kZWMtPmFkZHIsICZod2RlcCk7CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAJY29kZWMtPmh3ZGVwID0gaHdkZXA7CkBAIC0xMTYsOSArMTE2LDYgQEAKIAlod2RlcC0+b3BzLmlvY3RsX2NvbXBhdCA9IGhkYV9od2RlcF9pb2N0bF9jb21wYXQ7CiAjZW5kaWYKIAotCS8qIGxpbmsgdG8gY29kZWMgKi8KLQlod2RlcC0+ZGV2LnBhcmVudCA9ICZjb2RlYy0+ZGV2OwotCiAJLyogZm9yIHN5c2ZzICovCiAJaHdkZXAtPmRldi5ncm91cHMgPSBzbmRfaGRhX2Rldl9hdHRyX2dyb3VwczsKIAlkZXZfc2V0X2RydmRhdGEoJmh3ZGVwLT5kZXYsIGNvZGVjKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX2k5MTUuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2k5MTUuYwppbmRleCA3MTQ4OTQ1Li41MmE4NWQ4IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9pOTE1LmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfaTkxNS5jCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvY29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8ZHJtL2k5MTVfY29tcG9uZW50Lmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgImhkYV9wcml2LmgiCisjaW5jbHVkZSAiaGRhX2NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJoZGFfaW50ZWwuaCIKIAogLyogSW50ZWwgSFNXL0JEVyBkaXNwbGF5IEhEQSBjb250cm9sbGVyIEV4dGVuZGVkIE1vZGUgcmVnaXN0ZXJzLgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKaW5kZXggNGNhM2Q1ZC4uZTFjMjEwNSAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCkBAIC02Miw3ICs2Miw2IEBACiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlICJoZGFfY29kZWMuaCIKICNpbmNsdWRlICJoZGFfY29udHJvbGxlci5oIgotI2luY2x1ZGUgImhkYV9wcml2LmgiCiAjaW5jbHVkZSAiaGRhX2ludGVsLmgiCiAKIC8qIHBvc2l0aW9uIGZpeCBtb2RlICovCkBAIC0xNzQsNyArMTczLDYgQEAKICNkZWZpbmUgcGFyYW1fY2hlY2tfeGludCBwYXJhbV9jaGVja19pbnQKIAogc3RhdGljIGludCBwb3dlcl9zYXZlID0gQ09ORklHX1NORF9IREFfUE9XRVJfU0FWRV9ERUZBVUxUOwotc3RhdGljIGludCAqcG93ZXJfc2F2ZV9hZGRyID0gJnBvd2VyX3NhdmU7CiBtb2R1bGVfcGFyYW0ocG93ZXJfc2F2ZSwgeGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3NhdmUsICJBdXRvbWF0aWMgcG93ZXItc2F2aW5nIHRpbWVvdXQgIgogCQkgIihpbiBzZWNvbmQsIDAgPSBkaXNhYmxlKS4iKTsKQEAgLTE4Nyw3ICsxODUsNyBAQAogbW9kdWxlX3BhcmFtKHBvd2VyX3NhdmVfY29udHJvbGxlciwgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHBvd2VyX3NhdmVfY29udHJvbGxlciwgIlJlc2V0IGNvbnRyb2xsZXIgaW4gcG93ZXIgc2F2ZSBtb2RlLiIpOwogI2Vsc2UKLXN0YXRpYyBpbnQgKnBvd2VyX3NhdmVfYWRkcjsKKyNkZWZpbmUgcG93ZXJfc2F2ZQkwCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKIHN0YXRpYyBpbnQgYWxpZ25fYnVmZmVyX3NpemUgPSAtMTsKQEAgLTI5OSw4ICsyOTcsMTIgQEAKIAkgQVpYX0RDQVBTX1BNX1JVTlRJTUUgfCBBWlhfRENBUFNfSTkxNV9QT1dFUldFTEwgfFwKIAkgQVpYX0RDQVBTX1NOT09QX1RZUEUoU0NIKSkKIAorI2RlZmluZSBBWlhfRENBUFNfSU5URUxfQlJBU1dFTEwgXAorCShBWlhfRENBUFNfSU5URUxfUENIIHwgQVpYX0RDQVBTX0k5MTVfUE9XRVJXRUxMKQorCiAjZGVmaW5lIEFaWF9EQ0FQU19JTlRFTF9TS1lMQUtFIFwKLQkoQVpYX0RDQVBTX0lOVEVMX1BDSCB8IEFaWF9EQ0FQU19TRVBBUkFURV9TVFJFQU1fVEFHKQorCShBWlhfRENBUFNfSU5URUxfUENIIHwgQVpYX0RDQVBTX1NFUEFSQVRFX1NUUkVBTV9UQUcgfFwKKwkgQVpYX0RDQVBTX0k5MTVfUE9XRVJXRUxMKQogCiAvKiBxdWlya3MgZm9yIEFUSSBTQiAvIEFNRCBIdWRzb24gKi8KICNkZWZpbmUgQVpYX0RDQVBTX1BSRVNFVF9BVElfU0IgXApAQCAtNTMwLDEwICs1MzIsMTAgQEAKIAlpZiAob2sgPT0gMSkgewogCQlhenhfZGV2LT5pcnFfcGVuZGluZyA9IDA7CiAJCXJldHVybiBvazsKLQl9IGVsc2UgaWYgKG9rID09IDAgJiYgY2hpcC0+YnVzICYmIGNoaXAtPmJ1cy0+d29ya3EpIHsKKwl9IGVsc2UgaWYgKG9rID09IDApIHsKIAkJLyogYm9ndXMgSVJRLCBwcm9jZXNzIGl0IGxhdGVyICovCiAJCWF6eF9kZXYtPmlycV9wZW5kaW5nID0gMTsKLQkJcXVldWVfd29yayhjaGlwLT5idXMtPndvcmtxLCAmaGRhLT5pcnFfcGVuZGluZ193b3JrKTsKKwkJc2NoZWR1bGVfd29yaygmaGRhLT5pcnFfcGVuZGluZ193b3JrKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC03NDEsNyArNzQzLDYgQEAKIHsKIAlzdHJ1Y3QgaGRhX2ludGVsICpoZGE7CiAJc3RydWN0IGF6eCAqY2hpcDsKLQlzdHJ1Y3QgaGRhX2NvZGVjICpjOwogCWludCBwcmV2ID0gcG93ZXJfc2F2ZTsKIAlpbnQgcmV0ID0gcGFyYW1fc2V0X2ludCh2YWwsIGtwKTsKIApAQCAtNzUzLDggKzc1NCw3IEBACiAJCWNoaXAgPSAmaGRhLT5jaGlwOwogCQlpZiAoIWNoaXAtPmJ1cyB8fCBjaGlwLT5kaXNhYmxlZCkKIAkJCWNvbnRpbnVlOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZjaGlwLT5idXMtPmNvZGVjX2xpc3QsIGxpc3QpCi0JCQlzbmRfaGRhX3Bvd2VyX3N5bmMoYyk7CisJCXNuZF9oZGFfc2V0X3Bvd2VyX3NhdmUoY2hpcC0+YnVzLCBwb3dlcl9zYXZlICogMTAwMCk7CiAJfQogCW11dGV4X3VubG9jaygmY2FyZF9saXN0X2xvY2spOwogCXJldHVybiAwOwpAQCAtNzczLDcgKzc3Myw2IEBACiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGF6eCAqY2hpcDsKIAlzdHJ1Y3QgaGRhX2ludGVsICpoZGE7Ci0Jc3RydWN0IGF6eF9wY20gKnA7CiAKIAlpZiAoIWNhcmQpCiAJCXJldHVybiAwOwpAQCAtNzg1LDEwICs3ODQsNiBAQAogCiAJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDNob3QpOwogCWF6eF9jbGVhcl9pcnFfcGVuZGluZyhjaGlwKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZjaGlwLT5wY21fbGlzdCwgbGlzdCkKLQkJc25kX3BjbV9zdXNwZW5kX2FsbChwLT5wY20pOwotCWlmIChjaGlwLT5pbml0aWFsaXplZCkKLQkJc25kX2hkYV9zdXNwZW5kKGNoaXAtPmJ1cyk7CiAJYXp4X3N0b3BfY2hpcChjaGlwKTsKIAlhenhfZW50ZXJfbGlua19yZXNldChjaGlwKTsKIAlpZiAoY2hpcC0+aXJxID49IDApIHsKQEAgLTgzMSw3ICs4MjYsNiBAQAogCiAJYXp4X2luaXRfY2hpcChjaGlwLCB0cnVlKTsKIAotCXNuZF9oZGFfcmVzdW1lKGNoaXAtPmJ1cyk7CiAJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDApOwogCXJldHVybiAwOwogfQpAQCAtODUyLDcgKzg0Niw3IEBACiAJaWYgKGNoaXAtPmRpc2FibGVkIHx8IGhkYS0+aW5pdF9mYWlsZWQpCiAJCXJldHVybiAwOwogCi0JaWYgKCEoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkpCisJaWYgKCFhenhfaGFzX3BtX3J1bnRpbWUoY2hpcCkpCiAJCXJldHVybiAwOwogCiAJLyogZW5hYmxlIGNvbnRyb2xsZXIgd2FrZSB1cCBldmVudCAqLwpAQCAtODg1LDcgKzg3OSw3IEBACiAJaWYgKGNoaXAtPmRpc2FibGVkIHx8IGhkYS0+aW5pdF9mYWlsZWQpCiAJCXJldHVybiAwOwogCi0JaWYgKCEoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkpCisJaWYgKCFhenhfaGFzX3BtX3J1bnRpbWUoY2hpcCkpCiAJCXJldHVybiAwOwogCiAJaWYgKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX0k5MTVfUE9XRVJXRUxMKSB7CkBAIC05MDEsMTAgKzg5NSwxMCBAQAogCiAJYnVzID0gY2hpcC0+YnVzOwogCWlmIChzdGF0dXMgJiYgYnVzKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZidXMtPmNvZGVjX2xpc3QsIGxpc3QpCisJCWxpc3RfZm9yX2VhY2hfY29kZWMoY29kZWMsIGJ1cykKIAkJCWlmIChzdGF0dXMgJiAoMSA8PCBjb2RlYy0+YWRkcikpCi0JCQkJcXVldWVfZGVsYXllZF93b3JrKGNvZGVjLT5idXMtPndvcmtxLAotCQkJCQkJICAgJmNvZGVjLT5qYWNrcG9sbF93b3JrLCBjb2RlYy0+amFja3BvbGxfaW50ZXJ2YWwpOworCQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29kZWMtPmphY2twb2xsX3dvcmssCisJCQkJCQkgICAgICBjb2RlYy0+amFja3BvbGxfaW50ZXJ2YWwpOwogCX0KIAogCS8qIGRpc2FibGUgY29udHJvbGxlciBXYWtlIFVwIGV2ZW50Ki8KQEAgLTkyOCw4ICs5MjIsOCBAQAogCWlmIChjaGlwLT5kaXNhYmxlZCB8fCBoZGEtPmluaXRfZmFpbGVkKQogCQlyZXR1cm4gMDsKIAotCWlmICghcG93ZXJfc2F2ZV9jb250cm9sbGVyIHx8Ci0JICAgICEoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkpCisJaWYgKCFwb3dlcl9zYXZlX2NvbnRyb2xsZXIgfHwgIWF6eF9oYXNfcG1fcnVudGltZShjaGlwKSB8fAorCSAgICBjaGlwLT5idXMtPmNvcmUuY29kZWNfcG93ZXJlZCkKIAkJcmV0dXJuIC1FQlVTWTsKIAogCXJldHVybiAwOwpAQCAtMTA3MSwxNCArMTA2NSwxMSBAQAogCXN0cnVjdCBoZGFfaW50ZWwgKmhkYSA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgaGRhX2ludGVsLCBjaGlwKTsKIAlpbnQgaTsKIAotCWlmICgoY2hpcC0+ZHJpdmVyX2NhcHMgJiBBWlhfRENBUFNfUE1fUlVOVElNRSkKLQkJCSYmIGNoaXAtPnJ1bm5pbmcpCisJaWYgKGF6eF9oYXNfcG1fcnVudGltZShjaGlwKSAmJiBjaGlwLT5ydW5uaW5nKQogCQlwbV9ydW50aW1lX2dldF9ub3Jlc3VtZSgmcGNpLT5kZXYpOwogCiAJYXp4X2RlbF9jYXJkX2xpc3QoY2hpcCk7CiAKLQlhenhfbm90aWZpZXJfdW5yZWdpc3RlcihjaGlwKTsKLQogCWhkYS0+aW5pdF9mYWlsZWQgPSAxOyAvKiB0byBiZSBzdXJlICovCiAJY29tcGxldGVfYWxsKCZoZGEtPnByb2JlX3dhaXQpOwogCkBAIC0xMzk0LDcgKzEzODUsNiBAQAogCiAJaGRhID0ga3phbGxvYyhzaXplb2YoKmhkYSksIEdGUF9LRVJORUwpOwogCWlmICghaGRhKSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ2Fubm90IGFsbG9jYXRlIGhkYVxuIik7CiAJCXBjaV9kaXNhYmxlX2RldmljZShwY2kpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC0xNTc1LDEwICsxNTY1LDggQEAKIAljaGlwLT5udW1fc3RyZWFtcyA9IGNoaXAtPnBsYXliYWNrX3N0cmVhbXMgKyBjaGlwLT5jYXB0dXJlX3N0cmVhbXM7CiAJY2hpcC0+YXp4X2RldiA9IGtjYWxsb2MoY2hpcC0+bnVtX3N0cmVhbXMsIHNpemVvZigqY2hpcC0+YXp4X2RldiksCiAJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGlwLT5henhfZGV2KSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2Fubm90IG1hbGxvYyBhenhfZGV2XG4iKTsKKwlpZiAoIWNoaXAtPmF6eF9kZXYpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAogCWVyciA9IGF6eF9hbGxvY19zdHJlYW1fcGFnZXMoY2hpcCk7CiAJaWYgKGVyciA8IDApCkBAIC0xNjE1LDE5ICsxNjAzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcG93ZXJfZG93bl9hbGxfY29kZWNzKHN0cnVjdCBhenggKmNoaXApCi17Ci0jaWZkZWYgQ09ORklHX1BNCi0JLyogVGhlIGNvZGVjcyB3ZXJlIHBvd2VyZWQgdXAgaW4gc25kX2hkYV9jb2RlY19uZXcoKS4KLQkgKiBOb3cgYWxsIGluaXRpYWxpemF0aW9uIGRvbmUsIHNvIHR1cm4gdGhlbSBkb3duIGlmIHBvc3NpYmxlCi0JICovCi0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmNoaXAtPmJ1cy0+Y29kZWNfbGlzdCwgbGlzdCkgewotCQlzbmRfaGRhX3Bvd2VyX2Rvd24oY29kZWMpOwotCX0KLSNlbmRpZgotfQotCiAjaWZkZWYgQ09ORklHX1NORF9IREFfUEFUQ0hfTE9BREVSCiAvKiBjYWxsYmFjayBmcm9tIHJlcXVlc3RfZmlybXdhcmVfbm93YWl0KCkgKi8KIHN0YXRpYyB2b2lkIGF6eF9maXJtd2FyZV9jYihjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LCB2b2lkICpjb250ZXh0KQpAQCAtMTg5NiwxMiArMTg3MSwxNCBAQAogI2VuZGlmCiAKIAkvKiBjcmVhdGUgY29kZWMgaW5zdGFuY2VzICovCi0JZXJyID0gYXp4X2NvZGVjX2NyZWF0ZShjaGlwLCBtb2RlbFtkZXZdLAotCQkJICAgICAgIGF6eF9tYXhfY29kZWNzW2NoaXAtPmRyaXZlcl90eXBlXSwKLQkJCSAgICAgICBwb3dlcl9zYXZlX2FkZHIpOwotCisJZXJyID0gYXp4X2J1c19jcmVhdGUoY2hpcCwgbW9kZWxbZGV2XSk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X2ZyZWU7CisKKwllcnIgPSBhenhfcHJvYmVfY29kZWNzKGNoaXAsIGF6eF9tYXhfY29kZWNzW2NoaXAtPmRyaXZlcl90eXBlXSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QQVRDSF9MT0FERVIKIAlpZiAoY2hpcC0+ZncpIHsKIAkJZXJyID0gc25kX2hkYV9sb2FkX3BhdGNoKGNoaXAtPmJ1cywgY2hpcC0+ZnctPnNpemUsCkBAIC0xOTIwLDI1ICsxODk3LDE0IEBACiAJCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCS8qIGNyZWF0ZSBQQ00gc3RyZWFtcyAqLwotCWVyciA9IHNuZF9oZGFfYnVpbGRfcGNtcyhjaGlwLT5idXMpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIG91dF9mcmVlOwotCi0JLyogY3JlYXRlIG1peGVyIGNvbnRyb2xzICovCi0JZXJyID0gYXp4X21peGVyX2NyZWF0ZShjaGlwKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXRfZnJlZTsKLQogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNoaXAtPmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dF9mcmVlOwogCiAJY2hpcC0+cnVubmluZyA9IDE7Ci0JcG93ZXJfZG93bl9hbGxfY29kZWNzKGNoaXApOwotCWF6eF9ub3RpZmllcl9yZWdpc3RlcihjaGlwKTsKIAlhenhfYWRkX2NhcmRfbGlzdChjaGlwKTsKLQlpZiAoKGNoaXAtPmRyaXZlcl9jYXBzICYgQVpYX0RDQVBTX1BNX1JVTlRJTUUpIHx8IGhkYS0+dXNlX3ZnYV9zd2l0Y2hlcm9vKQorCXNuZF9oZGFfc2V0X3Bvd2VyX3NhdmUoY2hpcC0+YnVzLCBwb3dlcl9zYXZlICogMTAwMCk7CisJaWYgKGF6eF9oYXNfcG1fcnVudGltZShjaGlwKSB8fCBoZGEtPnVzZV92Z2Ffc3dpdGNoZXJvbykKIAkJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZwY2ktPmRldik7CiAKIG91dF9mcmVlOgpAQCAtMTk1Niw2ICsxOTIyLDE4IEBACiAJCXNuZF9jYXJkX2ZyZWUoY2FyZCk7CiB9CiAKK3N0YXRpYyB2b2lkIGF6eF9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqcGNpKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2kpOworCXN0cnVjdCBhenggKmNoaXA7CisKKwlpZiAoIWNhcmQpCisJCXJldHVybjsKKwljaGlwID0gY2FyZC0+cHJpdmF0ZV9kYXRhOworCWlmIChjaGlwICYmIGNoaXAtPnJ1bm5pbmcpCisJCWF6eF9zdG9wX2NoaXAoY2hpcCk7Cit9CisKIC8qIFBDSSBJRHMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhenhfaWRzW10gPSB7CiAJLyogQ1BUICovCkBAIC0xOTg5LDcgKzE5NjcsNyBAQAogCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9QQ0ggfCBBWlhfRENBUFNfSU5URUxfUENIIH0sCiAJLyogU3VucmlzZSBQb2ludCAqLwogCXsgUENJX0RFVklDRSgweDgwODYsIDB4YTE3MCksCi0JICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX1BDSCB8IEFaWF9EQ0FQU19JTlRFTF9QQ0ggfSwKKwkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfUENIIHwgQVpYX0RDQVBTX0lOVEVMX1NLWUxBS0UgfSwKIAkvKiBTdW5yaXNlIFBvaW50LUxQICovCiAJeyBQQ0lfREVWSUNFKDB4ODA4NiwgMHg5ZDcwKSwKIAkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfUENIIHwgQVpYX0RDQVBTX0lOVEVMX1NLWUxBS0UgfSwKQEAgLTIwMTcsNyArMTk5NSw3IEBACiAJICAuZHJpdmVyX2RhdGEgPSBBWlhfRFJJVkVSX1BDSCB8IEFaWF9EQ0FQU19JTlRFTF9QQ0hfTk9QTSB9LAogCS8qIEJyYXN3ZWxsICovCiAJeyBQQ0lfREVWSUNFKDB4ODA4NiwgMHgyMjg0KSwKLQkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfUENIIHwgQVpYX0RDQVBTX0lOVEVMX1BDSCB9LAorCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9QQ0ggfCBBWlhfRENBUFNfSU5URUxfQlJBU1dFTEwgfSwKIAkvKiBJQ0g2ICovCiAJeyBQQ0lfREVWSUNFKDB4ODA4NiwgMHgyNjY4KSwKIAkgIC5kcml2ZXJfZGF0YSA9IEFaWF9EUklWRVJfSUNIIHwgQVpYX0RDQVBTX0lOVEVMX0lDSCB9LApAQCAtMjE3OCw2ICsyMTU2LDcgQEAKIAkuaWRfdGFibGUgPSBhenhfaWRzLAogCS5wcm9iZSA9IGF6eF9wcm9iZSwKIAkucmVtb3ZlID0gYXp4X3JlbW92ZSwKKwkuc2h1dGRvd24gPSBhenhfc2h1dGRvd24sCiAJLmRyaXZlciA9IHsKIAkJLnBtID0gQVpYX1BNX09QUywKIAl9LApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmgKaW5kZXggMzQ4NjExOC4uZDUyMzFmNyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5oCkBAIC0xNyw3ICsxNyw3IEBACiAjZGVmaW5lIF9fU09VTkRfSERBX0lOVEVMX0gKIAogI2luY2x1ZGUgPGRybS9pOTE1X2NvbXBvbmVudC5oPgotI2luY2x1ZGUgImhkYV9wcml2LmgiCisjaW5jbHVkZSAiaGRhX2NvbnRyb2xsZXIuaCIKIAogc3RydWN0IGhkYV9pbnRlbCB7CiAJc3RydWN0IGF6eCBjaGlwOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfamFjay5jIGIvc291bmQvcGNpL2hkYS9oZGFfamFjay5jCmluZGV4IGU2NjQzMDcuLmQ3Y2ZlN2IgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX2phY2suYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9qYWNrLmMKQEAgLTEzNSw3ICsxMzUsNyBAQAogI2lmZGVmIENPTkZJR19TTkRfSERBX0lOUFVUX0pBQ0sKIAkJLyogZnJlZSBqYWNrIGluc3RhbmNlcyBtYW51YWxseSB3aGVuIGNsZWFyaW5nL3JlY29uZmlndXJpbmcgKi8KIAkJaWYgKCFjb2RlYy0+YnVzLT5zaHV0ZG93biAmJiBqYWNrLT5qYWNrKQotCQkJc25kX2RldmljZV9mcmVlKGNvZGVjLT5idXMtPmNhcmQsIGphY2stPmphY2spOworCQkJc25kX2RldmljZV9mcmVlKGNvZGVjLT5jYXJkLCBqYWNrLT5qYWNrKTsKICNlbmRpZgogCQlmb3IgKGNiID0gamFjay0+Y2FsbGJhY2s7IGNiOyBjYiA9IG5leHQpIHsKIAkJCW5leHQgPSBjYi0+bmV4dDsKQEAgLTM0MCw3ICszNDAsNyBAQAogCQkJaWYgKCFqYWNrLT5rY3RsIHx8IGphY2stPmJsb2NrX3JlcG9ydCkKIAkJCQljb250aW51ZTsKIAkJCXN0YXRlID0gZ2V0X2phY2tfcGx1Z19zdGF0ZShqYWNrLT5waW5fc2Vuc2UpOwotCQkJc25kX2tjdGxfamFja19yZXBvcnQoY29kZWMtPmJ1cy0+Y2FyZCwgamFjay0+a2N0bCwgc3RhdGUpOworCQkJc25kX2tjdGxfamFja19yZXBvcnQoY29kZWMtPmNhcmQsIGphY2stPmtjdGwsIHN0YXRlKTsKICNpZmRlZiBDT05GSUdfU05EX0hEQV9JTlBVVF9KQUNLCiAJCQlpZiAoamFjay0+amFjaykKIAkJCQlzbmRfamFja19yZXBvcnQoamFjay0+amFjaywKQEAgLTQxMiwxMSArNDEyLDExIEBACiAJamFjay0+cGhhbnRvbV9qYWNrID0gISFwaGFudG9tX2phY2s7CiAKIAlzdGF0ZSA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIG5pZCk7Ci0Jc25kX2tjdGxfamFja19yZXBvcnQoY29kZWMtPmJ1cy0+Y2FyZCwga2N0bCwgc3RhdGUpOworCXNuZF9rY3RsX2phY2tfcmVwb3J0KGNvZGVjLT5jYXJkLCBrY3RsLCBzdGF0ZSk7CiAjaWZkZWYgQ09ORklHX1NORF9IREFfSU5QVVRfSkFDSwogCWlmICghcGhhbnRvbV9qYWNrKSB7CiAJCWphY2stPnR5cGUgPSBnZXRfaW5wdXRfamFja190eXBlKGNvZGVjLCBuaWQpOwotCQllcnIgPSBzbmRfamFja19uZXcoY29kZWMtPmJ1cy0+Y2FyZCwgbmFtZSwgamFjay0+dHlwZSwKKwkJZXJyID0gc25kX2phY2tfbmV3KGNvZGVjLT5jYXJkLCBuYW1lLCBqYWNrLT50eXBlLAogCQkJCSAgICZqYWNrLT5qYWNrKTsKIAkJaWYgKGVyciA8IDApCiAJCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX2xvY2FsLmgKaW5kZXggNjI2NThmMi4uM2I1NjdmNCAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfbG9jYWwuaAorKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9sb2NhbC5oCkBAIC0xMjcsMTggKzEyNywxNiBAQAogCQkJCSAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKICNlbmRpZgogLyogbG93bGV2ZWwgYWNjZXNzb3Igd2l0aCBjYWNoaW5nOyB1c2UgY2FyZWZ1bGx5ICovCi1pbnQgc25kX2hkYV9jb2RlY19hbXBfcmVhZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGNoLAotCQkJICAgaW50IGRpcmVjdGlvbiwgaW50IGluZGV4KTsKLWludCBzbmRfaGRhX2NvZGVjX2FtcF91cGRhdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBjaCwKLQkJCSAgICAgaW50IGRpcmVjdGlvbiwgaW50IGlkeCwgaW50IG1hc2ssIGludCB2YWwpOworI2RlZmluZSBzbmRfaGRhX2NvZGVjX2FtcF9yZWFkKGNvZGVjLCBuaWQsIGNoLCBkaXIsIGlkeCkgXAorCXNuZF9oZGFjX3JlZ21hcF9nZXRfYW1wKCYoY29kZWMpLT5jb3JlLCBuaWQsIGNoLCBkaXIsIGlkeCkKKyNkZWZpbmUgc25kX2hkYV9jb2RlY19hbXBfdXBkYXRlKGNvZGVjLCBuaWQsIGNoLCBkaXIsIGlkeCwgbWFzaywgdmFsKSBcCisJc25kX2hkYWNfcmVnbWFwX3VwZGF0ZV9hbXAoJihjb2RlYyktPmNvcmUsIG5pZCwgY2gsIGRpciwgaWR4LCBtYXNrLCB2YWwpCiBpbnQgc25kX2hkYV9jb2RlY19hbXBfc3RlcmVvKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAogCQkJICAgICBpbnQgZGlyLCBpbnQgaWR4LCBpbnQgbWFzaywgaW50IHZhbCk7CiBpbnQgc25kX2hkYV9jb2RlY19hbXBfaW5pdChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGNoLAogCQkJICAgaW50IGRpcmVjdGlvbiwgaW50IGlkeCwgaW50IG1hc2ssIGludCB2YWwpOwogaW50IHNuZF9oZGFfY29kZWNfYW1wX2luaXRfc3RlcmVvKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAogCQkJCSAgaW50IGRpciwgaW50IGlkeCwgaW50IG1hc2ssIGludCB2YWwpOwotdm9pZCBzbmRfaGRhX2NvZGVjX3Jlc3VtZV9hbXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwotCiB2b2lkIHNuZF9oZGFfc2V0X3ZtYXN0ZXJfdGx2KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBpbnQgZGlyLAogCQkJICAgICB1bnNpZ25lZCBpbnQgKnRsdik7CiBzdHJ1Y3Qgc25kX2tjb250cm9sICpzbmRfaGRhX2ZpbmRfbWl4ZXJfY3RsKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLApAQCAtMTUwLDYgKzE0OCw4IEBACiAjZGVmaW5lIHNuZF9oZGFfYWRkX3ZtYXN0ZXIoY29kZWMsIG5hbWUsIHRsdiwgc2xhdmVzLCBzdWZmaXgpIFwKIAlfX3NuZF9oZGFfYWRkX3ZtYXN0ZXIoY29kZWMsIG5hbWUsIHRsdiwgc2xhdmVzLCBzdWZmaXgsIHRydWUsIE5VTEwpCiBpbnQgc25kX2hkYV9jb2RlY19yZXNldChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Cit2b2lkIHNuZF9oZGFfY29kZWNfcmVnaXN0ZXIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwordm9pZCBzbmRfaGRhX2NvZGVjX2NsZWFudXBfZm9yX3VuYmluZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CiAKIGVudW0gewogCUhEQV9WTVVURV9PRkYsCkBAIC0yNzMsMjkgKzI3Myw2IEBACiAJCQkgIGludCBpbmRleCwgaW50ICp0eXBlX2luZGV4X3JldCk7CiAKIC8qCi0gKiBDaGFubmVsIG1vZGUgaGVscGVyCi0gKi8KLXN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlIHsKLQlpbnQgY2hhbm5lbHM7Ci0JY29uc3Qgc3RydWN0IGhkYV92ZXJiICpzZXF1ZW5jZTsKLX07Ci0KLWludCBzbmRfaGRhX2NoX21vZGVfaW5mbyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCSBzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvLAotCQkJIGNvbnN0IHN0cnVjdCBoZGFfY2hhbm5lbF9tb2RlICpjaG1vZGUsCi0JCQkgaW50IG51bV9jaG1vZGVzKTsKLWludCBzbmRfaGRhX2NoX21vZGVfZ2V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAotCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wsCi0JCQljb25zdCBzdHJ1Y3QgaGRhX2NoYW5uZWxfbW9kZSAqY2htb2RlLAotCQkJaW50IG51bV9jaG1vZGVzLAotCQkJaW50IG1heF9jaGFubmVscyk7Ci1pbnQgc25kX2hkYV9jaF9tb2RlX3B1dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sLAotCQkJY29uc3Qgc3RydWN0IGhkYV9jaGFubmVsX21vZGUgKmNobW9kZSwKLQkJCWludCBudW1fY2htb2RlcywKLQkJCWludCAqbWF4X2NoYW5uZWxzcCk7Ci0KLS8qCiAgKiBNdWx0aS1jaGFubmVsIC8gZGlnaXRhbC1vdXQgUENNIGhlbHBlcgogICovCiAKQEAgLTM1MSwxMiArMzI4LDYgQEAKIAkJCQkgICAgIHN0cnVjdCBoZGFfbXVsdGlfb3V0ICptb3V0KTsKIAogLyoKLSAqIGdlbmVyaWMgY29kZWMgcGFyc2VyCi0gKi8KLWludCBzbmRfaGRhX3BhcnNlX2dlbmVyaWNfY29kZWMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwotaW50IHNuZF9oZGFfcGFyc2VfaGRtaV9jb2RlYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Ci0KLS8qCiAgKiBnZW5lcmljIHByb2MgaW50ZXJmYWNlCiAgKi8KICNpZmRlZiBDT05GSUdfUFJPQ19GUwpAQCAtNDY2LDIzICs0MzcsNiBAQAogCQkJICAgIGNvbnN0IHN0cnVjdCBzbmRfaGRhX3Bpbl9xdWlyayAqcGluX3F1aXJrLAogCQkJICAgIGNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeGxpc3QpOwogCi0KLS8qCi0gKiB1bnNvbGljaXRlZCBldmVudCBoYW5kbGVyCi0gKi8KLQotI2RlZmluZSBIREFfVU5TT0xfUVVFVUVfU0laRQk2NAotCi1zdHJ1Y3QgaGRhX2J1c191bnNvbGljaXRlZCB7Ci0JLyogcmluZyBidWZmZXIgKi8KLQl1MzIgcXVldWVbSERBX1VOU09MX1FVRVVFX1NJWkUgKiAyXTsKLQl1bnNpZ25lZCBpbnQgcnAsIHdwOwotCi0JLyogd29ya3F1ZXVlICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcms7Ci0Jc3RydWN0IGhkYV9idXMgKmJ1czsKLX07Ci0KIC8qIGhlbHBlciBtYWNyb3MgdG8gcmV0cmlldmUgcGluIGRlZmF1bHQtY29uZmlnIHZhbHVlcyAqLwogI2RlZmluZSBnZXRfZGVmY2ZnX2Nvbm5lY3QoY2ZnKSBcCiAJKChjZmcgJiBBQ19ERUZDRkdfUE9SVF9DT05OKSA+PiBBQ19ERUZDRkdfUE9SVF9DT05OX1NISUZUKQpAQCAtNTYwLDE1ICs1MTQsMTggQEAKIGludCBzbmRfaGRhX2NvZGVjX3NldF9waW5fdGFyZ2V0KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAogCQkJCSB1bnNpZ25lZCBpbnQgdmFsKTsKIAorI2RlZmluZSBmb3JfZWFjaF9oZGFfY29kZWNfbm9kZShuaWQsIGNvZGVjKSBcCisJZm9yICgobmlkKSA9IChjb2RlYyktPmNvcmUuc3RhcnRfbmlkOyAobmlkKSA8IChjb2RlYyktPmNvcmUuZW5kX25pZDsgKG5pZCkrKykKKwogLyoKICAqIGdldCB3aWRnZXQgY2FwYWJpbGl0aWVzCiAgKi8KIHN0YXRpYyBpbmxpbmUgdTMyIGdldF93Y2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKIHsKLQlpZiAobmlkIDwgY29kZWMtPnN0YXJ0X25pZCB8fAotCSAgICBuaWQgPj0gY29kZWMtPnN0YXJ0X25pZCArIGNvZGVjLT5udW1fbm9kZXMpCisJaWYgKG5pZCA8IGNvZGVjLT5jb3JlLnN0YXJ0X25pZCB8fAorCSAgICBuaWQgPj0gY29kZWMtPmNvcmUuc3RhcnRfbmlkICsgY29kZWMtPmNvcmUubnVtX25vZGVzKQogCQlyZXR1cm4gMDsKLQlyZXR1cm4gY29kZWMtPndjYXBzW25pZCAtIGNvZGVjLT5zdGFydF9uaWRdOworCXJldHVybiBjb2RlYy0+d2NhcHNbbmlkIC0gY29kZWMtPmNvcmUuc3RhcnRfbmlkXTsKIH0KIAogLyogZ2V0IHRoZSB3aWRnZXQgdHlwZSBmcm9tIHdpZGdldCBjYXBhYmlsaXR5IGJpdHMgKi8KQEAgLTU5MiwxNyArNTQ5LDQ5IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgc25kX2hkYV9vdmVycmlkZV93Y2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKIAkJCQkJICBoZGFfbmlkX3QgbmlkLCB1MzIgdmFsKQogewotCWlmIChuaWQgPj0gY29kZWMtPnN0YXJ0X25pZCAmJgotCSAgICBuaWQgPCBjb2RlYy0+c3RhcnRfbmlkICsgY29kZWMtPm51bV9ub2RlcykKLQkJY29kZWMtPndjYXBzW25pZCAtIGNvZGVjLT5zdGFydF9uaWRdID0gdmFsOworCWlmIChuaWQgPj0gY29kZWMtPmNvcmUuc3RhcnRfbmlkICYmCisJICAgIG5pZCA8IGNvZGVjLT5jb3JlLnN0YXJ0X25pZCArIGNvZGVjLT5jb3JlLm51bV9ub2RlcykKKwkJY29kZWMtPndjYXBzW25pZCAtIGNvZGVjLT5jb3JlLnN0YXJ0X25pZF0gPSB2YWw7CiB9CiAKIHUzMiBxdWVyeV9hbXBfY2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpcmVjdGlvbik7CiBpbnQgc25kX2hkYV9vdmVycmlkZV9hbXBfY2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwgaW50IGRpciwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBjYXBzKTsKLXUzMiBzbmRfaGRhX3F1ZXJ5X3Bpbl9jYXBzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKTsKLWludCBzbmRfaGRhX292ZXJyaWRlX3Bpbl9jYXBzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAotCQkJICAgICAgdW5zaWduZWQgaW50IGNhcHMpOworLyoqCisgKiBzbmRfaGRhX3F1ZXJ5X3Bpbl9jYXBzIC0gUXVlcnkgUElOIGNhcGFiaWxpdGllcworICogQGNvZGVjOiB0aGUgSEQtYXVpbyBjb2RlYworICogQG5pZDogdGhlIE5JRCB0byBxdWVyeQorICoKKyAqIFF1ZXJ5IFBJTiBjYXBhYmlsaXRpZXMgZm9yIHRoZSBnaXZlbiB3aWRnZXQuCisgKiBSZXR1cm5zIHRoZSBvYnRhaW5lZCBjYXBhYmlsaXR5IGJpdHMuCisgKgorICogV2hlbiBjYXAgYml0cyBoYXZlIGJlZW4gYWxyZWFkeSByZWFkLCB0aGlzIGRvZXNuJ3QgcmVhZCBhZ2FpbiBidXQKKyAqIHJldHVybnMgdGhlIGNhY2hlZCB2YWx1ZS4KKyAqLworc3RhdGljIGlubGluZSB1MzIKK3NuZF9oZGFfcXVlcnlfcGluX2NhcHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCit7CisJcmV0dXJuIHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfUElOX0NBUCk7CisKK30KKworLyoqCisgKiBzbmRfaGRhX292ZXJyaWRlX3Bpbl9jYXBzIC0gT3ZlcnJpZGUgdGhlIHBpbiBjYXBhYmlsaXRpZXMKKyAqIEBjb2RlYzogdGhlIENPREVDCisgKiBAbmlkOiB0aGUgTklEIHRvIG92ZXJyaWRlCisgKiBAY2FwczogdGhlIGNhcGFiaWxpdHkgYml0cyB0byBzZXQKKyAqCisgKiBPdmVycmlkZSB0aGUgY2FjaGVkIFBJTiBjYXBhYmlsaXRpeSBiaXRzIHZhbHVlIGJ5IHRoZSBnaXZlbiBvbmUuCisgKgorICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW5saW5lIGludAorc25kX2hkYV9vdmVycmlkZV9waW5fY2FwcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCwKKwkJCSAgdW5zaWduZWQgaW50IGNhcHMpCit7CisJcmV0dXJuIHNuZF9oZGFjX292ZXJyaWRlX3Bhcm0oJmNvZGVjLT5jb3JlLCBuaWQsIEFDX1BBUl9QSU5fQ0FQLCBjYXBzKTsKK30KKwogYm9vbCBzbmRfaGRhX2NoZWNrX2FtcF9jYXBzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLAogCQkJICAgaW50IGRpciwgdW5zaWduZWQgaW50IGJpdHMpOwogCkBAIC04MDAsOSArNzg5LDEzIEBACiAKIC8qCiAgKi8KLSNkZWZpbmUgY29kZWNfZXJyKGNvZGVjLCBmbXQsIGFyZ3MuLi4pIGRldl9lcnIoJihjb2RlYyktPmRldiwgZm10LCAjI2FyZ3MpCi0jZGVmaW5lIGNvZGVjX3dhcm4oY29kZWMsIGZtdCwgYXJncy4uLikgZGV2X3dhcm4oJihjb2RlYyktPmRldiwgZm10LCAjI2FyZ3MpCi0jZGVmaW5lIGNvZGVjX2luZm8oY29kZWMsIGZtdCwgYXJncy4uLikgZGV2X2luZm8oJihjb2RlYyktPmRldiwgZm10LCAjI2FyZ3MpCi0jZGVmaW5lIGNvZGVjX2RiZyhjb2RlYywgZm10LCBhcmdzLi4uKSBkZXZfZGJnKCYoY29kZWMpLT5kZXYsIGZtdCwgIyNhcmdzKQorI2RlZmluZSBjb2RlY19lcnIoY29kZWMsIGZtdCwgYXJncy4uLikgXAorCWRldl9lcnIoaGRhX2NvZGVjX2Rldihjb2RlYyksIGZtdCwgIyNhcmdzKQorI2RlZmluZSBjb2RlY193YXJuKGNvZGVjLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfd2FybihoZGFfY29kZWNfZGV2KGNvZGVjKSwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIGNvZGVjX2luZm8oY29kZWMsIGZtdCwgYXJncy4uLikgXAorCWRldl9pbmZvKGhkYV9jb2RlY19kZXYoY29kZWMpLCBmbXQsICMjYXJncykKKyNkZWZpbmUgY29kZWNfZGJnKGNvZGVjLCBmbXQsIGFyZ3MuLi4pIFwKKwlkZXZfZGJnKGhkYV9jb2RlY19kZXYoY29kZWMpLCBmbXQsICMjYXJncykKIAogI2VuZGlmIC8qIF9fU09VTkRfSERBX0xPQ0FMX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX3ByaXYuaCBiL3NvdW5kL3BjaS9oZGEvaGRhX3ByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFmNDU4Mi4uMDAwMDAwMAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV9wcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MDYgKzAsMCBAQAotLyoKLSAqICBDb21tb24gZGVmaW5lcyBmb3IgdGhlIGFsc2EgZHJpdmVyIGNvZGUgYmFzZSBmb3IgSEQgQXVkaW8uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKLSAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pCi0gKiAgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqICBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfX1NPVU5EX0hEQV9QUklWX0gKLSNkZWZpbmUgX19TT1VORF9IREFfUFJJVl9ICi0KLSNpbmNsdWRlIDxsaW51eC90aW1lY291bnRlci5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLQotLyoKLSAqIHJlZ2lzdGVycwotICovCi0jZGVmaW5lIEFaWF9SRUdfR0NBUAkJCTB4MDAKLSNkZWZpbmUgICBBWlhfR0NBUF82NE9LCQkoMSA8PCAwKSAgIC8qIDY0Yml0IGFkZHJlc3Mgc3VwcG9ydCAqLwotI2RlZmluZSAgIEFaWF9HQ0FQX05TRE8JCSgzIDw8IDEpICAgLyogIyBvZiBzZXJpYWwgZGF0YSBvdXQgc2lnbmFscyAqLwotI2RlZmluZSAgIEFaWF9HQ0FQX0JTUwkJKDMxIDw8IDMpICAvKiAjIG9mIGJpZGlyZWN0aW9uYWwgc3RyZWFtcyAqLwotI2RlZmluZSAgIEFaWF9HQ0FQX0lTUwkJKDE1IDw8IDgpICAvKiAjIG9mIGlucHV0IHN0cmVhbXMgKi8KLSNkZWZpbmUgICBBWlhfR0NBUF9PU1MJCSgxNSA8PCAxMikgLyogIyBvZiBvdXRwdXQgc3RyZWFtcyAqLwotI2RlZmluZSBBWlhfUkVHX1ZNSU4JCQkweDAyCi0jZGVmaW5lIEFaWF9SRUdfVk1BSgkJCTB4MDMKLSNkZWZpbmUgQVpYX1JFR19PVVRQQVkJCQkweDA0Ci0jZGVmaW5lIEFaWF9SRUdfSU5QQVkJCQkweDA2Ci0jZGVmaW5lIEFaWF9SRUdfR0NUTAkJCTB4MDgKLSNkZWZpbmUgICBBWlhfR0NUTF9SRVNFVAkoMSA8PCAwKSAgIC8qIGNvbnRyb2xsZXIgcmVzZXQgKi8KLSNkZWZpbmUgICBBWlhfR0NUTF9GQ05UUkwJKDEgPDwgMSkgICAvKiBmbHVzaCBjb250cm9sICovCi0jZGVmaW5lICAgQVpYX0dDVExfVU5TT0wJKDEgPDwgOCkgICAvKiBhY2NlcHQgdW5zb2wuIHJlc3BvbnNlIGVuYWJsZSAqLwotI2RlZmluZSBBWlhfUkVHX1dBS0VFTgkJCTB4MGMKLSNkZWZpbmUgQVpYX1JFR19TVEFURVNUUwkJMHgwZQotI2RlZmluZSBBWlhfUkVHX0dTVFMJCQkweDEwCi0jZGVmaW5lICAgQVpYX0dTVFNfRlNUUwkJKDEgPDwgMSkgICAvKiBmbHVzaCBzdGF0dXMgKi8KLSNkZWZpbmUgQVpYX1JFR19JTlRDVEwJCQkweDIwCi0jZGVmaW5lIEFaWF9SRUdfSU5UU1RTCQkJMHgyNAotI2RlZmluZSBBWlhfUkVHX1dBTExDTEsJCQkweDMwCS8qIDI0TWh6IHNvdXJjZSAqLwotI2RlZmluZSBBWlhfUkVHX09MRF9TU1lOQwkJMHgzNAkvKiBTU1lOQyBmb3Igb2xkIElDSCAqLwotI2RlZmluZSBBWlhfUkVHX1NTWU5DCQkJMHgzOAotI2RlZmluZSBBWlhfUkVHX0NPUkJMQkFTRQkJMHg0MAotI2RlZmluZSBBWlhfUkVHX0NPUkJVQkFTRQkJMHg0NAotI2RlZmluZSBBWlhfUkVHX0NPUkJXUAkJCTB4NDgKLSNkZWZpbmUgQVpYX1JFR19DT1JCUlAJCQkweDRhCi0jZGVmaW5lICAgQVpYX0NPUkJSUF9SU1QJKDEgPDwgMTUpICAvKiByZWFkIHBvaW50ZXIgcmVzZXQgKi8KLSNkZWZpbmUgQVpYX1JFR19DT1JCQ1RMCQkJMHg0YwotI2RlZmluZSAgIEFaWF9DT1JCQ1RMX1JVTgkoMSA8PCAxKSAgIC8qIGVuYWJsZSBETUEgKi8KLSNkZWZpbmUgICBBWlhfQ09SQkNUTF9DTUVJRQkoMSA8PCAwKSAgIC8qIGVuYWJsZSBtZW1vcnkgZXJyb3IgaXJxICovCi0jZGVmaW5lIEFaWF9SRUdfQ09SQlNUUwkJCTB4NGQKLSNkZWZpbmUgICBBWlhfQ09SQlNUU19DTUVJCSgxIDw8IDApICAgLyogbWVtb3J5IGVycm9yIGluZGljYXRpb24gKi8KLSNkZWZpbmUgQVpYX1JFR19DT1JCU0laRQkJMHg0ZQotCi0jZGVmaW5lIEFaWF9SRUdfUklSQkxCQVNFCQkweDUwCi0jZGVmaW5lIEFaWF9SRUdfUklSQlVCQVNFCQkweDU0Ci0jZGVmaW5lIEFaWF9SRUdfUklSQldQCQkJMHg1OAotI2RlZmluZSAgIEFaWF9SSVJCV1BfUlNUCSgxIDw8IDE1KSAgLyogd3JpdGUgcG9pbnRlciByZXNldCAqLwotI2RlZmluZSBBWlhfUkVHX1JJTlRDTlQJCQkweDVhCi0jZGVmaW5lIEFaWF9SRUdfUklSQkNUTAkJCTB4NWMKLSNkZWZpbmUgICBBWlhfUkJDVExfSVJRX0VOCSgxIDw8IDApICAgLyogZW5hYmxlIElSUSAqLwotI2RlZmluZSAgIEFaWF9SQkNUTF9ETUFfRU4JKDEgPDwgMSkgICAvKiBlbmFibGUgRE1BICovCi0jZGVmaW5lICAgQVpYX1JCQ1RMX09WRVJSVU5fRU4JKDEgPDwgMikgICAvKiBlbmFibGUgb3ZlcnJ1biBpcnEgKi8KLSNkZWZpbmUgQVpYX1JFR19SSVJCU1RTCQkJMHg1ZAotI2RlZmluZSAgIEFaWF9SQlNUU19JUlEJCSgxIDw8IDApICAgLyogcmVzcG9uc2UgaXJxICovCi0jZGVmaW5lICAgQVpYX1JCU1RTX09WRVJSVU4JKDEgPDwgMikgICAvKiBvdmVycnVuIGlycSAqLwotI2RlZmluZSBBWlhfUkVHX1JJUkJTSVpFCQkweDVlCi0KLSNkZWZpbmUgQVpYX1JFR19JQwkJCTB4NjAKLSNkZWZpbmUgQVpYX1JFR19JUgkJCTB4NjQKLSNkZWZpbmUgQVpYX1JFR19JUlMJCQkweDY4Ci0jZGVmaW5lICAgQVpYX0lSU19WQUxJRAkJKDE8PDEpCi0jZGVmaW5lICAgQVpYX0lSU19CVVNZCQkoMTw8MCkKLQotI2RlZmluZSBBWlhfUkVHX0RQTEJBU0UJCQkweDcwCi0jZGVmaW5lIEFaWF9SRUdfRFBVQkFTRQkJCTB4NzQKLSNkZWZpbmUgICBBWlhfRFBMQkFTRV9FTkFCTEUJMHgxCS8qIEVuYWJsZSBwb3NpdGlvbiBidWZmZXIgKi8KLQotLyogU0Qgb2Zmc2V0OiBTREkwPTB4ODAsIFNESTE9MHhhMCwgLi4uIFNETzM9MHgxNjAgKi8KLWVudW0geyBTREkwLCBTREkxLCBTREkyLCBTREkzLCBTRE8wLCBTRE8xLCBTRE8yLCBTRE8zIH07Ci0KLS8qIHN0cmVhbSByZWdpc3RlciBvZmZzZXRzIGZyb20gc3RyZWFtIGJhc2UgKi8KLSNkZWZpbmUgQVpYX1JFR19TRF9DVEwJCQkweDAwCi0jZGVmaW5lIEFaWF9SRUdfU0RfU1RTCQkJMHgwMwotI2RlZmluZSBBWlhfUkVHX1NEX0xQSUIJCQkweDA0Ci0jZGVmaW5lIEFaWF9SRUdfU0RfQ0JMCQkJMHgwOAotI2RlZmluZSBBWlhfUkVHX1NEX0xWSQkJCTB4MGMKLSNkZWZpbmUgQVpYX1JFR19TRF9GSUZPVwkJMHgwZQotI2RlZmluZSBBWlhfUkVHX1NEX0ZJRk9TSVpFCQkweDEwCi0jZGVmaW5lIEFaWF9SRUdfU0RfRk9STUFUCQkweDEyCi0jZGVmaW5lIEFaWF9SRUdfU0RfQkRMUEwJCTB4MTgKLSNkZWZpbmUgQVpYX1JFR19TRF9CRExQVQkJMHgxYwotCi0vKiBQQ0kgc3BhY2UgKi8KLSNkZWZpbmUgQVpYX1BDSVJFR19UQ1NFTAkJMHg0NAotCi0vKgotICogb3RoZXIgY29uc3RhbnRzCi0gKi8KLQotLyogbWF4IG51bWJlciBvZiBmcmFnbWVudHMgLSB3ZSBtYXkgdXNlIG1vcmUgaWYgYWxsb2NhdGluZyBtb3JlIHBhZ2VzIGZvciBCREwgKi8KLSNkZWZpbmUgQkRMX1NJWkUJCTQwOTYKLSNkZWZpbmUgQVpYX01BWF9CRExfRU5UUklFUwkoQkRMX1NJWkUgLyAxNikKLSNkZWZpbmUgQVpYX01BWF9GUkFHCQkzMgotLyogbWF4IGJ1ZmZlciBzaXplIC0gbm8gaC93IGxpbWl0LCB5b3UgY2FuIGluY3JlYXNlIGFzIHlvdSBsaWtlICovCi0jZGVmaW5lIEFaWF9NQVhfQlVGX1NJWkUJKDEwMjQqMTAyNCoxMDI0KQotCi0vKiBSSVJCIGludCBtYXNrOiBvdmVycnVuWzJdLCByZXNwb25zZVswXSAqLwotI2RlZmluZSBSSVJCX0lOVF9SRVNQT05TRQkweDAxCi0jZGVmaW5lIFJJUkJfSU5UX09WRVJSVU4JMHgwNAotI2RlZmluZSBSSVJCX0lOVF9NQVNLCQkweDA1Ci0KLS8qIFNUQVRFU1RTIGludCBtYXNrOiBTMyxTRDIsU0QxLFNEMCAqLwotI2RlZmluZSBBWlhfTUFYX0NPREVDUwkJOAotI2RlZmluZSBBWlhfREVGQVVMVF9DT0RFQ1MJNAotI2RlZmluZSBTVEFURVNUU19JTlRfTUFTSwkoKDEgPDwgQVpYX01BWF9DT0RFQ1MpIC0gMSkKLQotLyogU0RfQ1RMIGJpdHMgKi8KLSNkZWZpbmUgU0RfQ1RMX1NUUkVBTV9SRVNFVAkweDAxCS8qIHN0cmVhbSByZXNldCBiaXQgKi8KLSNkZWZpbmUgU0RfQ1RMX0RNQV9TVEFSVAkweDAyCS8qIHN0cmVhbSBETUEgc3RhcnQgYml0ICovCi0jZGVmaW5lIFNEX0NUTF9TVFJJUEUJCSgzIDw8IDE2KQkvKiBzdHJpcGUgY29udHJvbCAqLwotI2RlZmluZSBTRF9DVExfVFJBRkZJQ19QUklPCSgxIDw8IDE4KQkvKiB0cmFmZmljIHByaW9yaXR5ICovCi0jZGVmaW5lIFNEX0NUTF9ESVIJCSgxIDw8IDE5KQkvKiBiaS1kaXJlY3Rpb25hbCBzdHJlYW0gKi8KLSNkZWZpbmUgU0RfQ1RMX1NUUkVBTV9UQUdfTUFTSwkoMHhmIDw8IDIwKQotI2RlZmluZSBTRF9DVExfU1RSRUFNX1RBR19TSElGVAkyMAotCi0vKiBTRF9DVEwgYW5kIFNEX1NUUyAqLwotI2RlZmluZSBTRF9JTlRfREVTQ19FUlIJCTB4MTAJLyogZGVzY3JpcHRvciBlcnJvciBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgU0RfSU5UX0ZJRk9fRVJSCQkweDA4CS8qIEZJRk8gZXJyb3IgaW50ZXJydXB0ICovCi0jZGVmaW5lIFNEX0lOVF9DT01QTEVURQkJMHgwNAkvKiBjb21wbGV0aW9uIGludGVycnVwdCAqLwotI2RlZmluZSBTRF9JTlRfTUFTSwkJKFNEX0lOVF9ERVNDX0VSUnxTRF9JTlRfRklGT19FUlJ8XAotCQkJCSBTRF9JTlRfQ09NUExFVEUpCi0KLS8qIFNEX1NUUyAqLwotI2RlZmluZSBTRF9TVFNfRklGT19SRUFEWQkweDIwCS8qIEZJRk8gcmVhZHkgKi8KLQotLyogSU5UQ1RMIGFuZCBJTlRTVFMgKi8KLSNkZWZpbmUgQVpYX0lOVF9BTExfU1RSRUFNCTB4ZmYJICAgLyogYWxsIHN0cmVhbSBpbnRlcnJ1cHRzICovCi0jZGVmaW5lIEFaWF9JTlRfQ1RSTF9FTgkweDQwMDAwMDAwIC8qIGNvbnRyb2xsZXIgaW50ZXJydXB0IGVuYWJsZSBiaXQgKi8KLSNkZWZpbmUgQVpYX0lOVF9HTE9CQUxfRU4JMHg4MDAwMDAwMCAvKiBnbG9iYWwgaW50ZXJydXB0IGVuYWJsZSBiaXQgKi8KLQotLyogYmVsb3cgYXJlIHNvIGZhciBoYXJkY29kZWQgLSBzaG91bGQgcmVhZCByZWdpc3RlcnMgaW4gZnV0dXJlICovCi0jZGVmaW5lIEFaWF9NQVhfQ09SQl9FTlRSSUVTCTI1NgotI2RlZmluZSBBWlhfTUFYX1JJUkJfRU5UUklFUwkyNTYKLQotLyogZHJpdmVyIHF1aXJrcyAoY2FwYWJpbGl0aWVzKSAqLwotLyogYml0cyAwLTcgYXJlIHVzZWQgZm9yIGluZGljYXRpbmcgZHJpdmVyIHR5cGUgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX05PX1RDU0VMCSgxIDw8IDgpCS8qIE5vIEludGVsIFRDU0VMIGJpdCAqLwotI2RlZmluZSBBWlhfRENBUFNfTk9fTVNJCSgxIDw8IDkpCS8qIE5vIE1TSSBzdXBwb3J0ICovCi0jZGVmaW5lIEFaWF9EQ0FQU19TTk9PUF9NQVNLCSgzIDw8IDEwKQkvKiBzbm9vcCB0eXBlIG1hc2sgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX1NOT09QX09GRgkoMSA8PCAxMikJLyogc25vb3AgZGVmYXVsdCBvZmYgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX1JJUkJfREVMQVkJKDEgPDwgMTMpCS8qIExvbmcgZGVsYXkgaW4gcmVhZCBsb29wICovCi0jZGVmaW5lIEFaWF9EQ0FQU19SSVJCX1BSRV9ERUxBWSAoMSA8PCAxNCkJLyogUHV0IGEgZGVsYXkgYmVmb3JlIHJlYWQgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX0NUWF9XT1JLQVJPVU5EICgxIDw8IDE1KQkvKiBYLUZpIHdvcmthcm91bmQgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX1BPU0ZJWF9MUElCCSgxIDw8IDE2KQkvKiBVc2UgTFBJQiBhcyBkZWZhdWx0ICovCi0jZGVmaW5lIEFaWF9EQ0FQU19QT1NGSVhfVklBCSgxIDw8IDE3KQkvKiBVc2UgVklBQ09NQk8gYXMgZGVmYXVsdCAqLwotI2RlZmluZSBBWlhfRENBUFNfTk9fNjRCSVQJKDEgPDwgMTgpCS8qIE5vIDY0Yml0IGFkZHJlc3MgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX1NZTkNfV1JJVEUJKDEgPDwgMTkpCS8qIHN5bmMgZWFjaCBjbWQgd3JpdGUgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX09MRF9TU1lOQwkoMSA8PCAyMCkJLyogT2xkIFNTWU5DIHJlZyBmb3IgSUNIICovCi0jZGVmaW5lIEFaWF9EQ0FQU19OT19BTElHTl9CVUZTSVpFICgxIDw8IDIxKQkvKiBubyBidWZmZXIgc2l6ZSBhbGlnbm1lbnQgKi8KLS8qIDIyIHVudXNlZCAqLwotI2RlZmluZSBBWlhfRENBUFNfNEtfQkRMRV9CT1VOREFSWSAoMSA8PCAyMykJLyogQkRMRSBpbiA0ayBib3VuZGFyeSAqLwotI2RlZmluZSBBWlhfRENBUFNfUkVWRVJTRV9BU1NJR04gKDEgPDwgMjQpCS8qIEFzc2lnbiBkZXZpY2VzIGluIHJldmVyc2Ugb3JkZXIgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX0NPVU5UX0xQSUJfREVMQVkgICgxIDw8IDI1KQkvKiBUYWtlIExQSUIgYXMgZGVsYXkgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX1BNX1JVTlRJTUUJKDEgPDwgMjYpCS8qIHJ1bnRpbWUgUE0gc3VwcG9ydCAqLwotI2RlZmluZSBBWlhfRENBUFNfSTkxNV9QT1dFUldFTEwgKDEgPDwgMjcpCS8qIEhTVyBpOTE1IHBvd2Vyd2VsbCBzdXBwb3J0ICovCi0jZGVmaW5lIEFaWF9EQ0FQU19DT1JCUlBfU0VMRl9DTEVBUiAoMSA8PCAyOCkJLyogQ09SQlJQIGNsZWFycyBpdHNlbGYgYWZ0ZXIgcmVzZXQgKi8KLSNkZWZpbmUgQVpYX0RDQVBTX05PX01TSTY0ICAgICAgKDEgPDwgMjkpCS8qIFN0aWNrIHRvIDMyLWJpdCBNU0lzICovCi0jZGVmaW5lIEFaWF9EQ0FQU19TRVBBUkFURV9TVFJFQU1fVEFHCSgxIDw8IDMwKSAvKiBjYXB0dXJlIGFuZCBwbGF5YmFjayB1c2Ugc2VwYXJhdGUgc3RyZWFtIHRhZyAqLwotCi1lbnVtIHsKLQlBWlhfU05PT1BfVFlQRV9OT05FICwKLQlBWlhfU05PT1BfVFlQRV9TQ0gsCi0JQVpYX1NOT09QX1RZUEVfQVRJLAotCUFaWF9TTk9PUF9UWVBFX05WSURJQSwKLX07Ci0KLS8qIEhEIEF1ZGlvIGNsYXNzIGNvZGUgKi8KLSNkZWZpbmUgUENJX0NMQVNTX01VTFRJTUVESUFfSERfQVVESU8JMHgwNDAzCi0KLXN0cnVjdCBhenhfZGV2IHsKLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgYmRsOyAvKiBCREwgYnVmZmVyICovCi0JdTMyICpwb3NidWY7CQkvKiBwb3NpdGlvbiBidWZmZXIgcG9pbnRlciAqLwotCi0JdW5zaWduZWQgaW50IGJ1ZnNpemU7CS8qIHNpemUgb2YgdGhlIHBsYXkgYnVmZmVyIGluIGJ5dGVzICovCi0JdW5zaWduZWQgaW50IHBlcmlvZF9ieXRlczsgLyogc2l6ZSBvZiB0aGUgcGVyaW9kIGluIGJ5dGVzICovCi0JdW5zaWduZWQgaW50IGZyYWdzOwkvKiBudW1iZXIgZm9yIHBlcmlvZCBpbiB0aGUgcGxheSBidWZmZXIgKi8KLQl1bnNpZ25lZCBpbnQgZmlmb19zaXplOwkvKiBGSUZPIHNpemUgKi8KLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3dhbGxjbGs7CS8qIHN0YXJ0ICsgbWluaW11bSB3YWxsY2xrICovCi0JdW5zaWduZWQgbG9uZyBwZXJpb2Rfd2FsbGNsazsJLyogd2FsbGNsayBmb3IgcGVyaW9kICovCi0KLQl2b2lkIF9faW9tZW0gKnNkX2FkZHI7CS8qIHN0cmVhbSBkZXNjcmlwdG9yIHBvaW50ZXIgKi8KLQotCXUzMiBzZF9pbnRfc3RhX21hc2s7CS8qIHN0cmVhbSBpbnQgc3RhdHVzIG1hc2sgKi8KLQotCS8qIHBjbSBzdXBwb3J0ICovCi0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CS8qIGFzc2lnbmVkIHN1YnN0cmVhbSwKLQkJCQkJCSAqIHNldCBpbiBQQ00gb3BlbgotCQkJCQkJICovCi0JdW5zaWduZWQgaW50IGZvcm1hdF92YWw7CS8qIGZvcm1hdCB2YWx1ZSB0byBiZSBzZXQgaW4gdGhlCi0JCQkJCSAqIGNvbnRyb2xsZXIgYW5kIHRoZSBjb2RlYwotCQkJCQkgKi8KLQl1bnNpZ25lZCBjaGFyIHN0cmVhbV90YWc7CS8qIGFzc2lnbmVkIHN0cmVhbSAqLwotCXVuc2lnbmVkIGNoYXIgaW5kZXg7CQkvKiBzdHJlYW0gaW5kZXggKi8KLQlpbnQgYXNzaWduZWRfa2V5OwkJLyogbGFzdCBkZXZpY2UjIGtleSBhc3NpZ25lZCB0byAqLwotCi0JdW5zaWduZWQgaW50IG9wZW5lZDoxOwotCXVuc2lnbmVkIGludCBydW5uaW5nOjE7Ci0JdW5zaWduZWQgaW50IGlycV9wZW5kaW5nOjE7Ci0JdW5zaWduZWQgaW50IHByZXBhcmVkOjE7Ci0JdW5zaWduZWQgaW50IGxvY2tlZDoxOwotCS8qCi0JICogRm9yIFZJQToKLQkgKiAgQSBmbGFnIHRvIGVuc3VyZSBETUEgcG9zaXRpb24gaXMgMAotCSAqICB3aGVuIGxpbmsgcG9zaXRpb24gaXMgbm90IGdyZWF0ZXIgdGhhbiBGSUZPIHNpemUKLQkgKi8KLQl1bnNpZ25lZCBpbnQgaW5zdWZmaWNpZW50OjE7Ci0JdW5zaWduZWQgaW50IHdjX21hcmtlZDoxOwotCXVuc2lnbmVkIGludCBub19wZXJpb2Rfd2FrZXVwOjE7Ci0KLQlzdHJ1Y3QgdGltZWNvdW50ZXIgIGF6eF90YzsKLQlzdHJ1Y3QgY3ljbGVjb3VudGVyIGF6eF9jYzsKLQotCWludCBkZWxheV9uZWdhdGl2ZV90aHJlc2hvbGQ7Ci0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9EU1BfTE9BREVSCi0JLyogQWxsb3dzIGRzcCBsb2FkIHRvIGhhdmUgc29sZSBhY2Nlc3MgdG8gdGhlIHBsYXliYWNrIHN0cmVhbS4gKi8KLQlzdHJ1Y3QgbXV0ZXggZHNwX211dGV4OwotI2VuZGlmCi19OwotCi0vKiBDT1JCL1JJUkIgKi8KLXN0cnVjdCBhenhfcmIgewotCXUzMiAqYnVmOwkJLyogQ09SQi9SSVJCIGJ1ZmZlcgotCQkJCSAqIEVhY2ggQ09SQiBlbnRyeSBpcyA0Ynl0ZSwgUklSQiBpcyA4Ynl0ZQotCQkJCSAqLwotCWRtYV9hZGRyX3QgYWRkcjsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBDT1JCL1JJUkIgYnVmZmVyICovCi0JLyogZm9yIFJJUkIgKi8KLQl1bnNpZ25lZCBzaG9ydCBycCwgd3A7CS8qIHJlYWQvd3JpdGUgcG9pbnRlcnMgKi8KLQlpbnQgY21kc1tBWlhfTUFYX0NPREVDU107CS8qIG51bWJlciBvZiBwZW5kaW5nIHJlcXVlc3RzICovCi0JdTMyIHJlc1tBWlhfTUFYX0NPREVDU107CS8qIGxhc3QgcmVhZCB2YWx1ZSAqLwotfTsKLQotc3RydWN0IGF6eDsKLQotLyogRnVuY3Rpb25zIHRvIHJlYWQvd3JpdGUgdG8gaGRhIHJlZ2lzdGVycy4gKi8KLXN0cnVjdCBoZGFfY29udHJvbGxlcl9vcHMgewotCS8qIFJlZ2lzdGVyIEFjY2VzcyAqLwotCXZvaWQgKCpyZWdfd3JpdGVsKSh1MzIgdmFsdWUsIHUzMiBfX2lvbWVtICphZGRyKTsKLQl1MzIgKCpyZWdfcmVhZGwpKHUzMiBfX2lvbWVtICphZGRyKTsKLQl2b2lkICgqcmVnX3dyaXRldykodTE2IHZhbHVlLCB1MTYgX19pb21lbSAqYWRkcik7Ci0JdTE2ICgqcmVnX3JlYWR3KSh1MTYgX19pb21lbSAqYWRkcik7Ci0Jdm9pZCAoKnJlZ193cml0ZWIpKHU4IHZhbHVlLCB1OCBfX2lvbWVtICphZGRyKTsKLQl1OCAoKnJlZ19yZWFkYikodTggX19pb21lbSAqYWRkcik7Ci0JLyogRGlzYWJsZSBtc2kgaWYgc3VwcG9ydGVkLCBQQ0kgb25seSAqLwotCWludCAoKmRpc2FibGVfbXNpX3Jlc2V0X2lycSkoc3RydWN0IGF6eCAqKTsKLQkvKiBBbGxvY2F0aW9uIG9wcyAqLwotCWludCAoKmRtYV9hbGxvY19wYWdlcykoc3RydWN0IGF6eCAqY2hpcCwKLQkJCSAgICAgICBpbnQgdHlwZSwKLQkJCSAgICAgICBzaXplX3Qgc2l6ZSwKLQkJCSAgICAgICBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1Zik7Ci0Jdm9pZCAoKmRtYV9mcmVlX3BhZ2VzKShzdHJ1Y3QgYXp4ICpjaGlwLCBzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1Zik7Ci0JaW50ICgqc3Vic3RyZWFtX2FsbG9jX3BhZ2VzKShzdHJ1Y3QgYXp4ICpjaGlwLAotCQkJCSAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJICAgICBzaXplX3Qgc2l6ZSk7Ci0JaW50ICgqc3Vic3RyZWFtX2ZyZWVfcGFnZXMpKHN0cnVjdCBhenggKmNoaXAsCi0JCQkJICAgIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKTsKLQl2b2lkICgqcGNtX21tYXBfcHJlcGFyZSkoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSk7Ci0JLyogQ2hlY2sgaWYgY3VycmVudCBwb3NpdGlvbiBpcyBhY2NlcHRhYmxlICovCi0JaW50ICgqcG9zaXRpb25fY2hlY2spKHN0cnVjdCBhenggKmNoaXAsIHN0cnVjdCBhenhfZGV2ICphenhfZGV2KTsKLX07Ci0KLXN0cnVjdCBhenhfcGNtIHsKLQlzdHJ1Y3QgYXp4ICpjaGlwOwotCXN0cnVjdCBzbmRfcGNtICpwY207Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWM7Ci0Jc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mb1syXTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi10eXBlZGVmIHVuc2lnbmVkIGludCAoKmF6eF9nZXRfcG9zX2NhbGxiYWNrX3QpKHN0cnVjdCBhenggKiwgc3RydWN0IGF6eF9kZXYgKik7Ci10eXBlZGVmIGludCAoKmF6eF9nZXRfZGVsYXlfY2FsbGJhY2tfdCkoc3RydWN0IGF6eCAqLCBzdHJ1Y3QgYXp4X2RldiAqLCB1bnNpZ25lZCBpbnQgcG9zKTsKLQotc3RydWN0IGF6eCB7Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkOwotCXN0cnVjdCBwY2lfZGV2ICpwY2k7Ci0JaW50IGRldl9pbmRleDsKLQotCS8qIGNoaXAgdHlwZSBzcGVjaWZpYyAqLwotCWludCBkcml2ZXJfdHlwZTsKLQl1bnNpZ25lZCBpbnQgZHJpdmVyX2NhcHM7Ci0JaW50IHBsYXliYWNrX3N0cmVhbXM7Ci0JaW50IHBsYXliYWNrX2luZGV4X29mZnNldDsKLQlpbnQgY2FwdHVyZV9zdHJlYW1zOwotCWludCBjYXB0dXJlX2luZGV4X29mZnNldDsKLQlpbnQgbnVtX3N0cmVhbXM7Ci0JY29uc3QgaW50ICpqYWNrcG9sbF9tczsgLyogcGVyLWNhcmQgamFjayBwb2xsIGludGVydmFsICovCi0KLQkvKiBSZWdpc3RlciBpbnRlcmFjdGlvbi4gKi8KLQljb25zdCBzdHJ1Y3QgaGRhX2NvbnRyb2xsZXJfb3BzICpvcHM7Ci0KLQkvKiBwb3NpdGlvbiBhZGp1c3RtZW50IGNhbGxiYWNrcyAqLwotCWF6eF9nZXRfcG9zX2NhbGxiYWNrX3QgZ2V0X3Bvc2l0aW9uWzJdOwotCWF6eF9nZXRfZGVsYXlfY2FsbGJhY2tfdCBnZXRfZGVsYXlbMl07Ci0KLQkvKiBwY2kgcmVzb3VyY2VzICovCi0JdW5zaWduZWQgbG9uZyBhZGRyOwotCXZvaWQgX19pb21lbSAqcmVtYXBfYWRkcjsKLQlpbnQgaXJxOwotCi0JLyogbG9ja3MgKi8KLQlzcGlubG9ja190IHJlZ19sb2NrOwotCXN0cnVjdCBtdXRleCBvcGVuX211dGV4OyAvKiBQcmV2ZW50cyBjb25jdXJyZW50IG9wZW4vY2xvc2Ugb3BlcmF0aW9ucyAqLwotCi0JLyogc3RyZWFtcyAoeCBudW1fc3RyZWFtcykgKi8KLQlzdHJ1Y3QgYXp4X2RldiAqYXp4X2RldjsKLQotCS8qIFBDTSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgcGNtX2xpc3Q7IC8qIGF6eF9wY20gbGlzdCAqLwotCi0JLyogSEQgY29kZWMgKi8KLQl1bnNpZ25lZCBzaG9ydCBjb2RlY19tYXNrOwotCWludCAgY29kZWNfcHJvYmVfbWFzazsgLyogY29waWVkIGZyb20gcHJvYmVfbWFzayBvcHRpb24gKi8KLQlzdHJ1Y3QgaGRhX2J1cyAqYnVzOwotCXVuc2lnbmVkIGludCBiZWVwX21vZGU7Ci0KLQkvKiBDT1JCL1JJUkIgKi8KLQlzdHJ1Y3QgYXp4X3JiIGNvcmI7Ci0Jc3RydWN0IGF6eF9yYiByaXJiOwotCi0JLyogQ09SQi9SSVJCIGFuZCBwb3NpdGlvbiBidWZmZXJzICovCi0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyIHJiOwotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciBwb3NidWY7Ci0KLSNpZmRlZiBDT05GSUdfU05EX0hEQV9QQVRDSF9MT0FERVIKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwotI2VuZGlmCi0KLQkvKiBmbGFncyAqLwotCWNvbnN0IGludCAqYmRsX3Bvc19hZGo7Ci0JaW50IHBvbGxfY291bnQ7Ci0JdW5zaWduZWQgaW50IHJ1bm5pbmc6MTsKLQl1bnNpZ25lZCBpbnQgaW5pdGlhbGl6ZWQ6MTsKLQl1bnNpZ25lZCBpbnQgc2luZ2xlX2NtZDoxOwotCXVuc2lnbmVkIGludCBwb2xsaW5nX21vZGU6MTsKLQl1bnNpZ25lZCBpbnQgbXNpOjE7Ci0JdW5zaWduZWQgaW50IHByb2Jpbmc6MTsgLyogY29kZWMgcHJvYmluZyBwaGFzZSAqLwotCXVuc2lnbmVkIGludCBzbm9vcDoxOwotCXVuc2lnbmVkIGludCBhbGlnbl9idWZmZXJfc2l6ZToxOwotCXVuc2lnbmVkIGludCByZWdpb25fcmVxdWVzdGVkOjE7Ci0JdW5zaWduZWQgaW50IGRpc2FibGVkOjE7IC8qIGRpc2FibGVkIGJ5IFZHQS1zd2l0Y2hlciAqLwotCi0JLyogZm9yIGRlYnVnZ2luZyAqLwotCXVuc2lnbmVkIGludCBsYXN0X2NtZFtBWlhfTUFYX0NPREVDU107Ci0KLQkvKiByZWJvb3Qgbm90aWZpZXIgKGZvciBteXN0ZXJpb3VzIGhhbmd1cCBwcm9ibGVtIGF0IHBvd2VyLWRvd24pICovCi0Jc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJlYm9vdF9ub3RpZmllcjsKLQotI2lmZGVmIENPTkZJR19TTkRfSERBX0RTUF9MT0FERVIKLQlzdHJ1Y3QgYXp4X2RldiBzYXZlZF9henhfZGV2OwotI2VuZGlmCi19OwotCi0jaWZkZWYgQ09ORklHX1g4NgotI2RlZmluZSBhenhfc25vb3AoY2hpcCkJCSgoY2hpcCktPnNub29wKQotI2Vsc2UKLSNkZWZpbmUgYXp4X3Nub29wKGNoaXApCQl0cnVlCi0jZW5kaWYKLQotLyoKLSAqIG1hY3JvcyBmb3IgZWFzeSB1c2UKLSAqLwotCi0jZGVmaW5lIGF6eF93cml0ZWwoY2hpcCwgcmVnLCB2YWx1ZSkgXAotCSgoY2hpcCktPm9wcy0+cmVnX3dyaXRlbCh2YWx1ZSwgKGNoaXApLT5yZW1hcF9hZGRyICsgQVpYX1JFR18jI3JlZykpCi0jZGVmaW5lIGF6eF9yZWFkbChjaGlwLCByZWcpIFwKLQkoKGNoaXApLT5vcHMtPnJlZ19yZWFkbCgoY2hpcCktPnJlbWFwX2FkZHIgKyBBWlhfUkVHXyMjcmVnKSkKLSNkZWZpbmUgYXp4X3dyaXRldyhjaGlwLCByZWcsIHZhbHVlKSBcCi0JKChjaGlwKS0+b3BzLT5yZWdfd3JpdGV3KHZhbHVlLCAoY2hpcCktPnJlbWFwX2FkZHIgKyBBWlhfUkVHXyMjcmVnKSkKLSNkZWZpbmUgYXp4X3JlYWR3KGNoaXAsIHJlZykgXAotCSgoY2hpcCktPm9wcy0+cmVnX3JlYWR3KChjaGlwKS0+cmVtYXBfYWRkciArIEFaWF9SRUdfIyNyZWcpKQotI2RlZmluZSBhenhfd3JpdGViKGNoaXAsIHJlZywgdmFsdWUpIFwKLQkoKGNoaXApLT5vcHMtPnJlZ193cml0ZWIodmFsdWUsIChjaGlwKS0+cmVtYXBfYWRkciArIEFaWF9SRUdfIyNyZWcpKQotI2RlZmluZSBhenhfcmVhZGIoY2hpcCwgcmVnKSBcCi0JKChjaGlwKS0+b3BzLT5yZWdfcmVhZGIoKGNoaXApLT5yZW1hcF9hZGRyICsgQVpYX1JFR18jI3JlZykpCi0KLSNkZWZpbmUgYXp4X3NkX3dyaXRlbChjaGlwLCBkZXYsIHJlZywgdmFsdWUpIFwKLQkoKGNoaXApLT5vcHMtPnJlZ193cml0ZWwodmFsdWUsIChkZXYpLT5zZF9hZGRyICsgQVpYX1JFR18jI3JlZykpCi0jZGVmaW5lIGF6eF9zZF9yZWFkbChjaGlwLCBkZXYsIHJlZykgXAotCSgoY2hpcCktPm9wcy0+cmVnX3JlYWRsKChkZXYpLT5zZF9hZGRyICsgQVpYX1JFR18jI3JlZykpCi0jZGVmaW5lIGF6eF9zZF93cml0ZXcoY2hpcCwgZGV2LCByZWcsIHZhbHVlKSBcCi0JKChjaGlwKS0+b3BzLT5yZWdfd3JpdGV3KHZhbHVlLCAoZGV2KS0+c2RfYWRkciArIEFaWF9SRUdfIyNyZWcpKQotI2RlZmluZSBhenhfc2RfcmVhZHcoY2hpcCwgZGV2LCByZWcpIFwKLQkoKGNoaXApLT5vcHMtPnJlZ19yZWFkdygoZGV2KS0+c2RfYWRkciArIEFaWF9SRUdfIyNyZWcpKQotI2RlZmluZSBhenhfc2Rfd3JpdGViKGNoaXAsIGRldiwgcmVnLCB2YWx1ZSkgXAotCSgoY2hpcCktPm9wcy0+cmVnX3dyaXRlYih2YWx1ZSwgKGRldiktPnNkX2FkZHIgKyBBWlhfUkVHXyMjcmVnKSkKLSNkZWZpbmUgYXp4X3NkX3JlYWRiKGNoaXAsIGRldiwgcmVnKSBcCi0JKChjaGlwKS0+b3BzLT5yZWdfcmVhZGIoKGRldiktPnNkX2FkZHIgKyBBWlhfUkVHXyMjcmVnKSkKLQotI2VuZGlmIC8qIF9fU09VTkRfSERBX1BSSVZfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfcHJvYy5jIGIvc291bmQvcGNpL2hkYS9oZGFfcHJvYy5jCmluZGV4IGNlNWE2ZGEuLmVlNjIzMDcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX3Byb2MuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9wcm9jLmMKQEAgLTMyLDYgKzMyLDEwIEBACiBtb2R1bGVfcGFyYW0oZHVtcF9jb2VmLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkdW1wX2NvZWYsICJEdW1wIHByb2Nlc3NpbmcgY29lZmZpY2llbnRzIGluIGNvZGVjIHByb2MgZmlsZSAoLTE9YXV0bywgMD1kaXNhYmxlLCAxPWVuYWJsZSkiKTsKIAorLyogYWx3YXlzIHVzZSBub25jYWNoZWQgdmVyc2lvbiAqLworI2RlZmluZSBwYXJhbV9yZWFkKGNvZGVjLCBuaWQsIHBhcm0pIFwKKwlzbmRfaGRhY19yZWFkX3Bhcm1fdW5jYWNoZWQoJihjb2RlYyktPmNvcmUsIG5pZCwgcGFybSkKKwogc3RhdGljIGNoYXIgKmJpdHNfbmFtZXModW5zaWduZWQgaW50IGJpdHMsIGNoYXIgKm5hbWVzW10sIGludCBzaXplKQogewogCWludCBpLCBuOwpAQCAtOTksMTAgKzEwMywxMCBAQAogc3RhdGljIHZvaWQgcHJpbnRfbmlkX3BjbXMoc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyLAogCQkJICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCiB7Ci0JaW50IHBjbSwgdHlwZTsKKwlpbnQgdHlwZTsKIAlzdHJ1Y3QgaGRhX3BjbSAqY3BjbTsKLQlmb3IgKHBjbSA9IDA7IHBjbSA8IGNvZGVjLT5udW1fcGNtczsgcGNtKyspIHsKLQkJY3BjbSA9ICZjb2RlYy0+cGNtX2luZm9bcGNtXTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3BjbSwgJmNvZGVjLT5wY21fbGlzdF9oZWFkLCBsaXN0KSB7CiAJCWZvciAodHlwZSA9IDA7IHR5cGUgPCAyOyB0eXBlKyspIHsKIAkJCWlmIChjcGNtLT5zdHJlYW1bdHlwZV0ubmlkICE9IG5pZCB8fCBjcGNtLT5wY20gPT0gTlVMTCkKIAkJCQljb250aW51ZTsKQEAgLTExOSw5ICsxMjMsOCBAQAogCQkJICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsIGludCBkaXIpCiB7CiAJdW5zaWduZWQgaW50IGNhcHM7Ci0JY2FwcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLAotCQkJCSAgZGlyID09IEhEQV9PVVRQVVQgPwotCQkJCSAgICBBQ19QQVJfQU1QX09VVF9DQVAgOiBBQ19QQVJfQU1QX0lOX0NBUCk7CisJY2FwcyA9IHBhcmFtX3JlYWQoY29kZWMsIG5pZCwgZGlyID09IEhEQV9PVVRQVVQgPworCQkJICBBQ19QQVJfQU1QX09VVF9DQVAgOiBBQ19QQVJfQU1QX0lOX0NBUCk7CiAJaWYgKGNhcHMgPT0gLTEgfHwgY2FwcyA9PSAwKSB7CiAJCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIk4vQVxuIik7CiAJCXJldHVybjsKQEAgLTEzNCwxMyArMTM3LDM4IEBACiAJCSAgICAoY2FwcyAmIEFDX0FNUENBUF9NVVRFKSA+PiBBQ19BTVBDQVBfTVVURV9TSElGVCk7CiB9CiAKKy8qIGlzIHRoaXMgYSBzdGVyZW8gd2lkZ2V0IG9yIGEgc3RlcmVvLXRvLW1vbm8gbWl4PyAqLworc3RhdGljIGJvb2wgaXNfc3RlcmVvX2FtcHMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkgICBpbnQgZGlyLCB1bnNpZ25lZCBpbnQgd2NhcHMsIGludCBpbmRpY2VzKQoreworCWhkYV9uaWRfdCBjb25uOworCisJaWYgKHdjYXBzICYgQUNfV0NBUF9TVEVSRU8pCisJCXJldHVybiB0cnVlOworCS8qIGNoZWNrIGZvciBhIHN0ZXJlby10by1tb25vIG1peDsgaXQgbXVzdCBiZToKKwkgKiBvbmx5IGEgc2luZ2xlIGNvbm5lY3Rpb24sIG9ubHkgZm9yIGlucHV0LCBhbmQgb25seSBhIG1peGVyIHdpZGdldAorCSAqLworCWlmIChpbmRpY2VzICE9IDEgfHwgZGlyICE9IEhEQV9JTlBVVCB8fAorCSAgICBnZXRfd2NhcHNfdHlwZSh3Y2FwcykgIT0gQUNfV0lEX0FVRF9NSVgpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChzbmRfaGRhX2dldF9yYXdfY29ubmVjdGlvbnMoY29kZWMsIG5pZCwgJmNvbm4sIDEpIDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCS8qIHRoZSBjb25uZWN0aW9uIHNvdXJjZSBpcyBhIHN0ZXJlbz8gKi8KKwl3Y2FwcyA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgY29ubiwgQUNfUEFSX0FVRElPX1dJREdFVF9DQVApOworCXJldHVybiAhISh3Y2FwcyAmIEFDX1dDQVBfU1RFUkVPKTsKK30KKwogc3RhdGljIHZvaWQgcHJpbnRfYW1wX3ZhbHMoc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyLAogCQkJICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkgICBpbnQgZGlyLCBpbnQgc3RlcmVvLCBpbnQgaW5kaWNlcykKKwkJCSAgIGludCBkaXIsIHVuc2lnbmVkIGludCB3Y2FwcywgaW50IGluZGljZXMpCiB7CiAJdW5zaWduZWQgaW50IHZhbDsKKwlib29sIHN0ZXJlbzsKIAlpbnQgaTsKIAorCXN0ZXJlbyA9IGlzX3N0ZXJlb19hbXBzKGNvZGVjLCBuaWQsIGRpciwgd2NhcHMsIGluZGljZXMpOworCiAJZGlyID0gZGlyID09IEhEQV9PVVRQVVQgPyBBQ19BTVBfR0VUX09VVFBVVCA6IEFDX0FNUF9HRVRfSU5QVVQ7CiAJZm9yIChpID0gMDsgaSA8IGluZGljZXM7IGkrKykgewogCQlzbmRfaXByaW50ZihidWZmZXIsICIgWyIpOwpAQCAtMjAwLDggKzIyOCw4IEBACiBzdGF0aWMgdm9pZCBwcmludF9wY21fY2FwcyhzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIsCiAJCQkgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKIHsKLQl1bnNpZ25lZCBpbnQgcGNtID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9QQ00pOwotCXVuc2lnbmVkIGludCBzdHJlYW0gPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX1NUUkVBTSk7CisJdW5zaWduZWQgaW50IHBjbSA9IHBhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX1BDTSk7CisJdW5zaWduZWQgaW50IHN0cmVhbSA9IHBhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX1NUUkVBTSk7CiAJaWYgKHBjbSA9PSAtMSB8fCBzdHJlYW0gPT0gLTEpIHsKIAkJc25kX2lwcmludGYoYnVmZmVyLCAiTi9BXG4iKTsKIAkJcmV0dXJuOwpAQCAtMjQ4LDcgKzI3Niw3IEBACiAJc3RhdGljIGNoYXIgKmphY2tfY29ubnNbNF0gPSB7ICJKYWNrIiwgIk4vQSIsICJGaXhlZCIsICJCb3RoIiB9OwogCXVuc2lnbmVkIGludCBjYXBzLCB2YWw7CiAKLQljYXBzID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9QSU5fQ0FQKTsKKwljYXBzID0gcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfUElOX0NBUCk7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiICBQaW5jYXAgMHglMDh4OiIsIGNhcHMpOwogCWlmIChjYXBzICYgQUNfUElOQ0FQX0lOKQogCQlzbmRfaXByaW50ZihidWZmZXIsICIgSU4iKTsKQEAgLTI2NCw3ICsyOTIsNyBAQAogCQlzbmRfaXByaW50ZihidWZmZXIsICIgQmFsYW5jZWQiKTsKIAlpZiAoY2FwcyAmIEFDX1BJTkNBUF9IRE1JKSB7CiAJCS8qIFJlYWx0ZWsgdXNlcyB0aGlzIGJpdCBhcyBhIGRpZmZlcmVudCBtZWFuaW5nICovCi0JCWlmICgoY29kZWMtPnZlbmRvcl9pZCA+PiAxNikgPT0gMHgxMGVjKQorCQlpZiAoKGNvZGVjLT5jb3JlLnZlbmRvcl9pZCA+PiAxNikgPT0gMHgxMGVjKQogCQkJc25kX2lwcmludGYoYnVmZmVyLCAiIFIvTCIpOwogCQllbHNlIHsKIAkJCWlmIChjYXBzICYgQUNfUElOQ0FQX0hCUikKQEAgLTM3Niw4ICs0MDQsNyBAQAogc3RhdGljIHZvaWQgcHJpbnRfdm9sX2tub2Ioc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyLAogCQkJICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCiB7Ci0JdW5zaWduZWQgaW50IGNhcCA9IHNuZF9oZGFfcGFyYW1fcmVhZChjb2RlYywgbmlkLAotCQkJCQkgICAgICBBQ19QQVJfVk9MX0tOQl9DQVApOworCXVuc2lnbmVkIGludCBjYXAgPSBwYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9WT0xfS05CX0NBUCk7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiICBWb2x1bWUtS25vYjogZGVsdGE9JWQsIHN0ZXBzPSVkLCAiLAogCQkgICAgKGNhcCA+PiA3KSAmIDEsIGNhcCAmIDB4N2YpOwogCWNhcCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLApAQCAtNDYyLDcgKzQ4OSw3IEBACiAJCVtpbG9nMihBQ19QV1JTVF9FUFNTKV0JCT0gIkVQU1MiLAogCX07CiAKLQlpbnQgc3VwID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9QT1dFUl9TVEFURSk7CisJaW50IHN1cCA9IHBhcmFtX3JlYWQoY29kZWMsIG5pZCwgQUNfUEFSX1BPV0VSX1NUQVRFKTsKIAlpbnQgcHdyID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCiAJCQkJICAgICBBQ19WRVJCX0dFVF9QT1dFUl9TVEFURSwgMCk7CiAJaWYgKHN1cCAhPSAtMSkKQEAgLTUwNiw4ICs1MzMsNyBAQAogCQkJICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQogewogCXVuc2lnbmVkIGludCBpLCBuY29lZmYsIG9sZGluZGV4OwotCXVuc2lnbmVkIGludCBwcm9jX2NhcHMgPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwKLQkJCQkJCSAgICBBQ19QQVJfUFJPQ19DQVApOworCXVuc2lnbmVkIGludCBwcm9jX2NhcHMgPSBwYXJhbV9yZWFkKGNvZGVjLCBuaWQsIEFDX1BBUl9QUk9DX0NBUCk7CiAJbmNvZWZmID0gKHByb2NfY2FwcyAmIEFDX1BDQVBfTlVNX0NPRUYpID4+IEFDX1BDQVBfTlVNX0NPRUZfU0hJRlQ7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiICBQcm9jZXNzaW5nIGNhcHM6IGJlbmlnbj0lZCwgbmNvZWZmPSVkXG4iLAogCQkgICAgcHJvY19jYXBzICYgQUNfUENBUF9CRU5JR04sIG5jb2VmZik7CkBAIC01NzIsNyArNTk4LDcgQEAKIAkJICAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQogewogCXVuc2lnbmVkIGludCBncGlvID0KLQkJc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCBBQ19QQVJfR1BJT19DQVApOworCQlwYXJhbV9yZWFkKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIEFDX1BBUl9HUElPX0NBUCk7CiAJdW5zaWduZWQgaW50IGVuYWJsZSwgZGlyZWN0aW9uLCB3YWtlLCB1bnNvbCwgc3RpY2t5LCBkYXRhOwogCWludCBpLCBtYXg7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiR1BJTzogaW89JWQsIG89JWQsIGk9JWQsICIKQEAgLTY0MiwxMyArNjY4LDkgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X2NvZGVjX2luZm8oc3RydWN0IHNuZF9pbmZvX2VudHJ5ICplbnRyeSwKLQkJCSAgICAgc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyKQorc3RhdGljIHZvaWQgcHJpbnRfY29kZWNfY29yZV9pbmZvKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsCisJCQkJICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCiB7Ci0Jc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOwotCWhkYV9uaWRfdCBuaWQ7Ci0JaW50IGksIG5vZGVzOwotCiAJc25kX2lwcmludGYoYnVmZmVyLCAiQ29kZWM6ICIpOwogCWlmIChjb2RlYy0+dmVuZG9yX25hbWUgJiYgY29kZWMtPmNoaXBfbmFtZSkKIAkJc25kX2lwcmludGYoYnVmZmVyLCAiJXMgJXNcbiIsCkBAIC02NzAsMzQgKzY5Miw0MyBAQAogCQlzbmRfaXByaW50ZihidWZmZXIsICJNb2RlbSBGdW5jdGlvbiBHcm91cDogMHgleFxuIiwgY29kZWMtPm1mZyk7CiAJZWxzZQogCQlzbmRfaXByaW50ZihidWZmZXIsICJObyBNb2RlbSBGdW5jdGlvbiBHcm91cCBmb3VuZFxuIik7Cit9CiAKLQlpZiAoISBjb2RlYy0+YWZnKQorc3RhdGljIHZvaWQgcHJpbnRfY29kZWNfaW5mbyhzdHJ1Y3Qgc25kX2luZm9fZW50cnkgKmVudHJ5LAorCQkJICAgICBzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIpCit7CisJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBlbnRyeS0+cHJpdmF0ZV9kYXRhOworCWhkYV9uaWRfdCBuaWQsIGZnOworCWludCBpLCBub2RlczsKKworCXByaW50X2NvZGVjX2NvcmVfaW5mbygmY29kZWMtPmNvcmUsIGJ1ZmZlcik7CisJZmcgPSBjb2RlYy0+Y29yZS5hZmc7CisJaWYgKCFmZykKIAkJcmV0dXJuOwogCXNuZF9oZGFfcG93ZXJfdXAoY29kZWMpOwogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkRlZmF1bHQgUENNOlxuIik7Ci0JcHJpbnRfcGNtX2NhcHMoYnVmZmVyLCBjb2RlYywgY29kZWMtPmFmZyk7CisJcHJpbnRfcGNtX2NhcHMoYnVmZmVyLCBjb2RlYywgZmcpOwogCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIkRlZmF1bHQgQW1wLUluIGNhcHM6ICIpOwotCXByaW50X2FtcF9jYXBzKGJ1ZmZlciwgY29kZWMsIGNvZGVjLT5hZmcsIEhEQV9JTlBVVCk7CisJcHJpbnRfYW1wX2NhcHMoYnVmZmVyLCBjb2RlYywgZmcsIEhEQV9JTlBVVCk7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiRGVmYXVsdCBBbXAtT3V0IGNhcHM6ICIpOwotCXByaW50X2FtcF9jYXBzKGJ1ZmZlciwgY29kZWMsIGNvZGVjLT5hZmcsIEhEQV9PVVRQVVQpOwotCXNuZF9pcHJpbnRmKGJ1ZmZlciwgIlN0YXRlIG9mIEFGRyBub2RlIDB4JTAyeDpcbiIsIGNvZGVjLT5hZmcpOwotCXByaW50X3Bvd2VyX3N0YXRlKGJ1ZmZlciwgY29kZWMsIGNvZGVjLT5hZmcpOworCXByaW50X2FtcF9jYXBzKGJ1ZmZlciwgY29kZWMsIGZnLCBIREFfT1VUUFVUKTsKKwlzbmRfaXByaW50ZihidWZmZXIsICJTdGF0ZSBvZiBBRkcgbm9kZSAweCUwMng6XG4iLCBmZyk7CisJcHJpbnRfcG93ZXJfc3RhdGUoYnVmZmVyLCBjb2RlYywgZmcpOwogCi0Jbm9kZXMgPSBzbmRfaGRhX2dldF9zdWJfbm9kZXMoY29kZWMsIGNvZGVjLT5hZmcsICZuaWQpOworCW5vZGVzID0gc25kX2hkYV9nZXRfc3ViX25vZGVzKGNvZGVjLCBmZywgJm5pZCk7CiAJaWYgKCEgbmlkIHx8IG5vZGVzIDwgMCkgewogCQlzbmRfaXByaW50ZihidWZmZXIsICJJbnZhbGlkIEFGRyBzdWJ0cmVlXG4iKTsKIAkJc25kX2hkYV9wb3dlcl9kb3duKGNvZGVjKTsKIAkJcmV0dXJuOwogCX0KIAotCXByaW50X2dwaW8oYnVmZmVyLCBjb2RlYywgY29kZWMtPmFmZyk7CisJcHJpbnRfZ3BpbyhidWZmZXIsIGNvZGVjLCBmZyk7CiAJaWYgKGNvZGVjLT5wcm9jX3dpZGdldF9ob29rKQotCQljb2RlYy0+cHJvY193aWRnZXRfaG9vayhidWZmZXIsIGNvZGVjLCBjb2RlYy0+YWZnKTsKKwkJY29kZWMtPnByb2Nfd2lkZ2V0X2hvb2soYnVmZmVyLCBjb2RlYywgZmcpOwogCiAJZm9yIChpID0gMDsgaSA8IG5vZGVzOyBpKyssIG5pZCsrKSB7CiAJCXVuc2lnbmVkIGludCB3aWRfY2FwcyA9Ci0JCQlzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwKLQkJCQkJICAgQUNfUEFSX0FVRElPX1dJREdFVF9DQVApOworCQkJcGFyYW1fcmVhZChjb2RlYywgbmlkLCBBQ19QQVJfQVVESU9fV0lER0VUX0NBUCk7CiAJCXVuc2lnbmVkIGludCB3aWRfdHlwZSA9IGdldF93Y2Fwc190eXBlKHdpZF9jYXBzKTsKIAkJaGRhX25pZF90ICpjb25uID0gTlVMTDsKIAkJaW50IGNvbm5fbGVuID0gMDsKQEAgLTc1NywxMiArNzg4LDEwIEBACiAJCQkgICAgKGNvZGVjLT5zaW5nbGVfYWRjX2FtcCAmJgogCQkJICAgICB3aWRfdHlwZSA9PSBBQ19XSURfQVVEX0lOKSkKIAkJCQlwcmludF9hbXBfdmFscyhidWZmZXIsIGNvZGVjLCBuaWQsIEhEQV9JTlBVVCwKLQkJCQkJICAgICAgIHdpZF9jYXBzICYgQUNfV0NBUF9TVEVSRU8sCi0JCQkJCSAgICAgICAxKTsKKwkJCQkJICAgICAgIHdpZF9jYXBzLCAxKTsKIAkJCWVsc2UKIAkJCQlwcmludF9hbXBfdmFscyhidWZmZXIsIGNvZGVjLCBuaWQsIEhEQV9JTlBVVCwKLQkJCQkJICAgICAgIHdpZF9jYXBzICYgQUNfV0NBUF9TVEVSRU8sCi0JCQkJCSAgICAgICBjb25uX2xlbik7CisJCQkJCSAgICAgICB3aWRfY2FwcywgY29ubl9sZW4pOwogCQl9CiAJCWlmICh3aWRfY2FwcyAmIEFDX1dDQVBfT1VUX0FNUCkgewogCQkJc25kX2lwcmludGYoYnVmZmVyLCAiICBBbXAtT3V0IGNhcHM6ICIpOwpAQCAtNzcxLDExICs4MDAsMTAgQEAKIAkJCWlmICh3aWRfdHlwZSA9PSBBQ19XSURfUElOICYmCiAJCQkgICAgY29kZWMtPnBpbl9hbXBfd29ya2Fyb3VuZCkKIAkJCQlwcmludF9hbXBfdmFscyhidWZmZXIsIGNvZGVjLCBuaWQsIEhEQV9PVVRQVVQsCi0JCQkJCSAgICAgICB3aWRfY2FwcyAmIEFDX1dDQVBfU1RFUkVPLAotCQkJCQkgICAgICAgY29ubl9sZW4pOworCQkJCQkgICAgICAgd2lkX2NhcHMsIGNvbm5fbGVuKTsKIAkJCWVsc2UKIAkJCQlwcmludF9hbXBfdmFscyhidWZmZXIsIGNvZGVjLCBuaWQsIEhEQV9PVVRQVVQsCi0JCQkJCSAgICAgICB3aWRfY2FwcyAmIEFDX1dDQVBfU1RFUkVPLCAxKTsKKwkJCQkJICAgICAgIHdpZF9jYXBzLCAxKTsKIAkJfQogCiAJCXN3aXRjaCAod2lkX3R5cGUpIHsKQEAgLTgzOCw4ICs4NjYsOCBAQAogCXN0cnVjdCBzbmRfaW5mb19lbnRyeSAqZW50cnk7CiAJaW50IGVycjsKIAotCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImNvZGVjIyVkIiwgY29kZWMtPmFkZHIpOwotCWVyciA9IHNuZF9jYXJkX3Byb2NfbmV3KGNvZGVjLT5idXMtPmNhcmQsIG5hbWUsICZlbnRyeSk7CisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiY29kZWMjJWQiLCBjb2RlYy0+Y29yZS5hZGRyKTsKKwllcnIgPSBzbmRfY2FyZF9wcm9jX25ldyhjb2RlYy0+Y2FyZCwgbmFtZSwgJmVudHJ5KTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfc3lzZnMuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX3N5c2ZzLmMKaW5kZXggY2NjOTYyYS4uYTZlM2Q5YiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfc3lzZnMuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9zeXNmcy5jCkBAIC00OCwzMyArNDgsMzMgQEAKIHN0YXRpYyBERVZJQ0VfQVRUUl9STyhwb3dlcl9vZmZfYWNjdCk7CiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKLSNkZWZpbmUgQ09ERUNfSU5GT19TSE9XKHR5cGUpCQkJCQlcCisjZGVmaW5lIENPREVDX0lORk9fU0hPVyh0eXBlLCBmaWVsZCkJCQkJXAogc3RhdGljIHNzaXplX3QgdHlwZSMjX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAkJCVwKIAkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCiAJCQkgICBjaGFyICpidWYpCQkJCVwKIHsJCQkJCQkJCVwKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JXhcbiIsIGNvZGVjLT50eXBlKTsJCVwKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCV4XG4iLCBjb2RlYy0+ZmllbGQpOwkJXAogfQogCi0jZGVmaW5lIENPREVDX0lORk9fU1RSX1NIT1codHlwZSkJCQkJXAorI2RlZmluZSBDT0RFQ19JTkZPX1NUUl9TSE9XKHR5cGUsIGZpZWxkKQkJCVwKIHN0YXRpYyBzc2l6ZV90IHR5cGUjI19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwJCQlcCiAJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAlcCiAJCQkJCWNoYXIgKmJ1ZikJCVwKIHsJCQkJCQkJCVwKIAlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwkJXAogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLAkJCQlcCi0JCSAgICAgICBjb2RlYy0+dHlwZSA/IGNvZGVjLT50eXBlIDogIiIpOwkJXAorCQkgICAgICAgY29kZWMtPmZpZWxkID8gY29kZWMtPmZpZWxkIDogIiIpOwlcCiB9CiAKLUNPREVDX0lORk9fU0hPVyh2ZW5kb3JfaWQpOwotQ09ERUNfSU5GT19TSE9XKHN1YnN5c3RlbV9pZCk7Ci1DT0RFQ19JTkZPX1NIT1cocmV2aXNpb25faWQpOwotQ09ERUNfSU5GT19TSE9XKGFmZyk7Ci1DT0RFQ19JTkZPX1NIT1cobWZnKTsKLUNPREVDX0lORk9fU1RSX1NIT1codmVuZG9yX25hbWUpOwotQ09ERUNfSU5GT19TVFJfU0hPVyhjaGlwX25hbWUpOwotQ09ERUNfSU5GT19TVFJfU0hPVyhtb2RlbG5hbWUpOworQ09ERUNfSU5GT19TSE9XKHZlbmRvcl9pZCwgY29yZS52ZW5kb3JfaWQpOworQ09ERUNfSU5GT19TSE9XKHN1YnN5c3RlbV9pZCwgY29yZS5zdWJzeXN0ZW1faWQpOworQ09ERUNfSU5GT19TSE9XKHJldmlzaW9uX2lkLCBjb3JlLnJldmlzaW9uX2lkKTsKK0NPREVDX0lORk9fU0hPVyhhZmcsIGNvcmUuYWZnKTsKK0NPREVDX0lORk9fU0hPVyhtZmcsIGNvcmUubWZnKTsKK0NPREVDX0lORk9fU1RSX1NIT1codmVuZG9yX25hbWUsIGNvcmUudmVuZG9yX25hbWUpOworQ09ERUNfSU5GT19TVFJfU0hPVyhjaGlwX25hbWUsIGNvcmUuY2hpcF9uYW1lKTsKK0NPREVDX0lORk9fU1RSX1NIT1cobW9kZWxuYW1lLCBtb2RlbG5hbWUpOwogCiBzdGF0aWMgc3NpemVfdCBwaW5fY29uZmlnc19zaG93KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCXN0cnVjdCBzbmRfYXJyYXkgKmxpc3QsCkBAIC0xNDksNyArMTQ5LDcgQEAKIAllcnIgPSBzbmRfaGRhX2NvZGVjX2J1aWxkX2NvbnRyb2xzKGNvZGVjKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvcjsKLQllcnIgPSBzbmRfY2FyZF9yZWdpc3Rlcihjb2RlYy0+YnVzLT5jYXJkKTsKKwllcnIgPSBzbmRfY2FyZF9yZWdpc3Rlcihjb2RlYy0+Y2FyZCk7CiAgZXJyb3I6CiAJc25kX2hkYV9wb3dlcl9kb3duKGNvZGVjKTsKIAlyZXR1cm4gZXJyOwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJcmV0dXJuIHM7CiB9CiAKLSNkZWZpbmUgQ09ERUNfSU5GT19TVE9SRSh0eXBlKQkJCQkJXAorI2RlZmluZSBDT0RFQ19JTkZPX1NUT1JFKHR5cGUsIGZpZWxkKQkJCQlcCiBzdGF0aWMgc3NpemVfdCB0eXBlIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKIAkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCkBAIC0xODAsMTEgKzE4MCwxMSBAQAogCWludCBlcnIgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOwkJCVwKIAlpZiAoZXJyIDwgMCkJCQkJCQlcCiAJCXJldHVybiBlcnI7CQkJCQlcCi0JY29kZWMtPnR5cGUgPSB2YWw7CQkJCQlcCisJY29kZWMtPmZpZWxkID0gdmFsOwkJCQkJXAogCXJldHVybiBjb3VudDsJCQkJCQlcCiB9CiAKLSNkZWZpbmUgQ09ERUNfSU5GT19TVFJfU1RPUkUodHlwZSkJCQkJXAorI2RlZmluZSBDT0RFQ19JTkZPX1NUUl9TVE9SRSh0eXBlLCBmaWVsZCkJCQlcCiBzdGF0aWMgc3NpemVfdCB0eXBlIyNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAkJCVwKIAkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwJXAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQlcCkBAIC0xOTMsMTcgKzE5MywxNyBAQAogCWNoYXIgKnMgPSBrc3RybmR1cF9ub2VvbChidWYsIDY0KTsJCQlcCiAJaWYgKCFzKQkJCQkJCQlcCiAJCXJldHVybiAtRU5PTUVNOwkJCQkJXAotCWtmcmVlKGNvZGVjLT50eXBlKTsJCQkJCVwKLQljb2RlYy0+dHlwZSA9IHM7CQkJCQlcCisJa2ZyZWUoY29kZWMtPmZpZWxkKTsJCQkJCVwKKwljb2RlYy0+ZmllbGQgPSBzOwkJCQkJXAogCXJldHVybiBjb3VudDsJCQkJCQlcCiB9CiAKLUNPREVDX0lORk9fU1RPUkUodmVuZG9yX2lkKTsKLUNPREVDX0lORk9fU1RPUkUoc3Vic3lzdGVtX2lkKTsKLUNPREVDX0lORk9fU1RPUkUocmV2aXNpb25faWQpOwotQ09ERUNfSU5GT19TVFJfU1RPUkUodmVuZG9yX25hbWUpOwotQ09ERUNfSU5GT19TVFJfU1RPUkUoY2hpcF9uYW1lKTsKLUNPREVDX0lORk9fU1RSX1NUT1JFKG1vZGVsbmFtZSk7CitDT0RFQ19JTkZPX1NUT1JFKHZlbmRvcl9pZCwgY29yZS52ZW5kb3JfaWQpOworQ09ERUNfSU5GT19TVE9SRShzdWJzeXN0ZW1faWQsIGNvcmUuc3Vic3lzdGVtX2lkKTsKK0NPREVDX0lORk9fU1RPUkUocmV2aXNpb25faWQsIGNvcmUucmV2aXNpb25faWQpOworQ09ERUNfSU5GT19TVFJfU1RPUkUodmVuZG9yX25hbWUsIGNvcmUudmVuZG9yX25hbWUpOworQ09ERUNfSU5GT19TVFJfU1RPUkUoY2hpcF9uYW1lLCBjb3JlLmNoaXBfbmFtZSk7CitDT0RFQ19JTkZPX1NUUl9TVE9SRShtb2RlbG5hbWUsIG1vZGVsbmFtZSk7CiAKICNkZWZpbmUgQ09ERUNfQUNUSU9OX1NUT1JFKHR5cGUpCQkJCVwKIHN0YXRpYyBzc2l6ZV90IHR5cGUjI19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCQkJXApAQCAtNTUyLDEwICs1NTIsMTAgQEAKIAogCSpjb2RlY3AgPSBOVUxMOwogCWlmIChzc2NhbmYoYnVmLCAiJWkgJWkgJWkiLCAmdmVuZG9yaWQsICZzdWJpZCwgJmNhZGRyKSA9PSAzKSB7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZidXMtPmNvZGVjX2xpc3QsIGxpc3QpIHsKLQkJCWlmICgodmVuZG9yaWQgPD0gMCB8fCBjb2RlYy0+dmVuZG9yX2lkID09IHZlbmRvcmlkKSAmJgotCQkJICAgIChzdWJpZCA8PSAwIHx8IGNvZGVjLT5zdWJzeXN0ZW1faWQgPT0gc3ViaWQpICYmCi0JCQkgICAgY29kZWMtPmFkZHIgPT0gY2FkZHIpIHsKKwkJbGlzdF9mb3JfZWFjaF9jb2RlYyhjb2RlYywgYnVzKSB7CisJCQlpZiAoKHZlbmRvcmlkIDw9IDAgfHwgY29kZWMtPmNvcmUudmVuZG9yX2lkID09IHZlbmRvcmlkKSAmJgorCQkJICAgIChzdWJpZCA8PSAwIHx8IGNvZGVjLT5jb3JlLnN1YnN5c3RlbV9pZCA9PSBzdWJpZCkgJiYKKwkJCSAgICBjb2RlYy0+Y29yZS5hZGRyID09IGNhZGRyKSB7CiAJCQkJKmNvZGVjcCA9IGNvZGVjOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtNTk1LDggKzU5NSw4IEBACiBzdGF0aWMgdm9pZCBwYXJzZV9jaGlwX25hbWVfbW9kZShjaGFyICpidWYsIHN0cnVjdCBoZGFfYnVzICpidXMsCiAJCQkJIHN0cnVjdCBoZGFfY29kZWMgKipjb2RlY3ApCiB7Ci0Ja2ZyZWUoKCpjb2RlY3ApLT5jaGlwX25hbWUpOwotCSgqY29kZWNwKS0+Y2hpcF9uYW1lID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOworCWtmcmVlKCgqY29kZWNwKS0+Y29yZS5jaGlwX25hbWUpOworCSgqY29kZWNwKS0+Y29yZS5jaGlwX25hbWUgPSBrc3RyZHVwKGJ1ZiwgR0ZQX0tFUk5FTCk7CiB9CiAKICNkZWZpbmUgREVGSU5FX1BBUlNFX0lEX01PREUobmFtZSkgXApAQCAtNjA1LDcgKzYwNSw3IEBACiB7IFwKIAl1bnNpZ25lZCBsb25nIHZhbDsgXAogCWlmICgha3N0cnRvdWwoYnVmLCAwLCAmdmFsKSkgXAotCQkoKmNvZGVjcCktPm5hbWUgPSB2YWw7IFwKKwkJKCpjb2RlY3ApLT5jb3JlLm5hbWUgPSB2YWw7IFwKIH0KIAogREVGSU5FX1BBUlNFX0lEX01PREUodmVuZG9yX2lkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvaGRhX3RlZ3JhLmMgYi9zb3VuZC9wY2kvaGRhL2hkYV90ZWdyYS5jCmluZGV4IDM3NWU5NGYuLjJlNGZkNWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvaGRhX3RlZ3JhLmMKKysrIGIvc291bmQvcGNpL2hkYS9oZGFfdGVncmEuYwpAQCAtMzcsNyArMzcsNiBAQAogCiAjaW5jbHVkZSAiaGRhX2NvZGVjLmgiCiAjaW5jbHVkZSAiaGRhX2NvbnRyb2xsZXIuaCIKLSNpbmNsdWRlICJoZGFfcHJpdi5oIgogCiAvKiBEZWZpbmVzIGZvciBOdmlkaWEgVGVncmEgSERBIHN1cHBvcnQgKi8KICNkZWZpbmUgSERBX0JBUjAgICAgICAgICAgIDB4ODAwMApAQCAtODIsNyArODEsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zYXZlLAogCQkgIkF1dG9tYXRpYyBwb3dlci1zYXZpbmcgdGltZW91dCAoaW4gc2Vjb25kcywgMCA9IGRpc2FibGUpLiIpOwogI2Vsc2UKLXN0YXRpYyBpbnQgcG93ZXJfc2F2ZSA9IDA7CisjZGVmaW5lIHBvd2VyX3NhdmUJMAogI2VuZGlmCiAKIC8qCkBAIC0yNTAsMTQgKzI0OSw5IEBACiB7CiAJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGF6eCAqY2hpcCA9IGNhcmQtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgYXp4X3BjbSAqcDsKIAlzdHJ1Y3QgaGRhX3RlZ3JhICpoZGEgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IGhkYV90ZWdyYSwgY2hpcCk7CiAKIAlzbmRfcG93ZXJfY2hhbmdlX3N0YXRlKGNhcmQsIFNORFJWX0NUTF9QT1dFUl9EM2hvdCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmY2hpcC0+cGNtX2xpc3QsIGxpc3QpCi0JCXNuZF9wY21fc3VzcGVuZF9hbGwocC0+cGNtKTsKLQlpZiAoY2hpcC0+aW5pdGlhbGl6ZWQpCi0JCXNuZF9oZGFfc3VzcGVuZChjaGlwLT5idXMpOwogCiAJYXp4X3N0b3BfY2hpcChjaGlwKTsKIAlhenhfZW50ZXJfbGlua19yZXNldChjaGlwKTsKQEAgLTI3OCw3ICsyNzIsNiBAQAogCiAJYXp4X2luaXRfY2hpcChjaGlwLCAxKTsKIAotCXNuZF9oZGFfcmVzdW1lKGNoaXAtPmJ1cyk7CiAJc25kX3Bvd2VyX2NoYW5nZV9zdGF0ZShjYXJkLCBTTkRSVl9DVExfUE9XRVJfRDApOwogCiAJcmV0dXJuIDA7CkBAIC0yOTcsOCArMjkwLDYgQEAKIAlpbnQgaTsKIAlzdHJ1Y3QgYXp4ICpjaGlwID0gZGV2aWNlLT5kZXZpY2VfZGF0YTsKIAotCWF6eF9ub3RpZmllcl91bnJlZ2lzdGVyKGNoaXApOwotCiAJaWYgKGNoaXAtPmluaXRpYWxpemVkKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBjaGlwLT5udW1fc3RyZWFtczsgaSsrKQogCQkJYXp4X3N0cmVhbV9zdG9wKGNoaXAsICZjaGlwLT5henhfZGV2W2ldKTsKQEAgLTM0NCwxNyArMzM1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFRoZSBjb2RlY3Mgd2VyZSBwb3dlcmVkIHVwIGluIHNuZF9oZGFfY29kZWNfbmV3KCkuCi0gKiBOb3cgYWxsIGluaXRpYWxpemF0aW9uIGRvbmUsIHNvIHR1cm4gdGhlbSBkb3duIGlmIHBvc3NpYmxlCi0gKi8KLXN0YXRpYyB2b2lkIHBvd2VyX2Rvd25fYWxsX2NvZGVjcyhzdHJ1Y3QgYXp4ICpjaGlwKQotewotCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjaGlwLT5idXMtPmNvZGVjX2xpc3QsIGxpc3QpCi0JCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7Ci19Ci0KIHN0YXRpYyBpbnQgaGRhX3RlZ3JhX2ZpcnN0X2luaXQoc3RydWN0IGF6eCAqY2hpcCwgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBjaGlwLT5jYXJkOwpAQCAtNTAzLDcgKzQ4MywxMSBAQAogCQlnb3RvIG91dF9mcmVlOwogCiAJLyogY3JlYXRlIGNvZGVjIGluc3RhbmNlcyAqLwotCWVyciA9IGF6eF9jb2RlY19jcmVhdGUoY2hpcCwgTlVMTCwgMCwgJnBvd2VyX3NhdmUpOworCWVyciA9IGF6eF9idXNfY3JlYXRlKGNoaXAsIE5VTEwpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9mcmVlOworCisJZXJyID0gYXp4X3Byb2JlX2NvZGVjcyhjaGlwLCAwKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfZnJlZTsKIApAQCAtNTExLDIzICs0OTUsMTIgQEAKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfZnJlZTsKIAotCS8qIGNyZWF0ZSBQQ00gc3RyZWFtcyAqLwotCWVyciA9IHNuZF9oZGFfYnVpbGRfcGNtcyhjaGlwLT5idXMpOwotCWlmIChlcnIgPCAwKQotCQlnb3RvIG91dF9mcmVlOwotCi0JLyogY3JlYXRlIG1peGVyIGNvbnRyb2xzICovCi0JZXJyID0gYXp4X21peGVyX2NyZWF0ZShjaGlwKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBvdXRfZnJlZTsKLQogCWVyciA9IHNuZF9jYXJkX3JlZ2lzdGVyKGNoaXAtPmNhcmQpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dF9mcmVlOwogCiAJY2hpcC0+cnVubmluZyA9IDE7Ci0JcG93ZXJfZG93bl9hbGxfY29kZWNzKGNoaXApOwotCWF6eF9ub3RpZmllcl9yZWdpc3RlcihjaGlwKTsKKwlzbmRfaGRhX3NldF9wb3dlcl9zYXZlKGNoaXAtPmJ1cywgcG93ZXJfc2F2ZSAqIDEwMDApOwogCiAJcmV0dXJuIDA7CiAKQEAgLTU0MSw2ICs1MTQsMTggQEAKIAlyZXR1cm4gc25kX2NhcmRfZnJlZShkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldikpOwogfQogCitzdGF0aWMgdm9pZCBoZGFfdGVncmFfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGF6eCAqY2hpcDsKKworCWlmICghY2FyZCkKKwkJcmV0dXJuOworCWNoaXAgPSBjYXJkLT5wcml2YXRlX2RhdGE7CisJaWYgKGNoaXAgJiYgY2hpcC0+cnVubmluZykKKwkJYXp4X3N0b3BfY2hpcChjaGlwKTsKK30KKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfcGxhdGZvcm1faGRhID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gInRlZ3JhLWhkYSIsCkBAIC01NDksNiArNTM0LDcgQEAKIAl9LAogCS5wcm9iZSA9IGhkYV90ZWdyYV9wcm9iZSwKIAkucmVtb3ZlID0gaGRhX3RlZ3JhX3JlbW92ZSwKKwkuc2h1dGRvd24gPSBoZGFfdGVncmFfc2h1dGRvd24sCiB9OwogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0ZWdyYV9wbGF0Zm9ybV9oZGEpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL2hkYV90cmFjZS5oIGIvc291bmQvcGNpL2hkYS9oZGFfdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExYzYzMS4uMDAwMDAwMAotLS0gYS9zb3VuZC9wY2kvaGRhL2hkYV90cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGhkYQotI2RlZmluZSBUUkFDRV9JTkNMVURFX0ZJTEUgaGRhX3RyYWNlCi0KLSNpZiAhZGVmaW5lZChfVFJBQ0VfSERBX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCi0jZGVmaW5lIF9UUkFDRV9IREFfSAotCi0jaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgotCi1zdHJ1Y3QgaGRhX2J1czsKLXN0cnVjdCBoZGFfY29kZWM7Ci0KLURFQ0xBUkVfRVZFTlRfQ0xBU1MoaGRhX2NtZCwKLQotCVRQX1BST1RPKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgdmFsKSwKLQotCVRQX0FSR1MoY29kZWMsIHZhbCksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsIGNhcmQgKQotCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsIGFkZHIgKQotCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsIHZhbCApCi0JKSwKLQotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2VudHJ5LT5jYXJkID0gKGNvZGVjKS0+YnVzLT5jYXJkLT5udW1iZXI7Ci0JCV9fZW50cnktPmFkZHIgPSAoY29kZWMpLT5hZGRyOwotCQlfX2VudHJ5LT52YWwgPSAodmFsKTsKLQkpLAotCi0JVFBfcHJpbnRrKCJbJWQ6JWRdIHZhbD0leCIsIF9fZW50cnktPmNhcmQsIF9fZW50cnktPmFkZHIsIF9fZW50cnktPnZhbCkKLSk7Ci0KLURFRklORV9FVkVOVChoZGFfY21kLCBoZGFfc2VuZF9jbWQsCi0JVFBfUFJPVE8oc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCB2YWwpLAotCVRQX0FSR1MoY29kZWMsIHZhbCkKLSk7Ci0KLURFRklORV9FVkVOVChoZGFfY21kLCBoZGFfZ2V0X3Jlc3BvbnNlLAotCVRQX1BST1RPKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgdmFsKSwKLQlUUF9BUkdTKGNvZGVjLCB2YWwpCi0pOwotCi1UUkFDRV9FVkVOVChoZGFfYnVzX3Jlc2V0LAotCi0JVFBfUFJPVE8oc3RydWN0IGhkYV9idXMgKmJ1cyksCi0KLQlUUF9BUkdTKGJ1cyksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsIGNhcmQgKQotCSksCi0KLQlUUF9mYXN0X2Fzc2lnbigKLQkJX19lbnRyeS0+Y2FyZCA9IChidXMpLT5jYXJkLT5udW1iZXI7Ci0JKSwKLQotCVRQX3ByaW50aygiWyVkXSIsIF9fZW50cnktPmNhcmQpCi0pOwotCi0jaWZkZWYgQ09ORklHX1BNCi1ERUNMQVJFX0VWRU5UX0NMQVNTKGhkYV9wb3dlciwKLQotCVRQX1BST1RPKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKSwKLQotCVRQX0FSR1MoY29kZWMpLAotCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJX19maWVsZCggdW5zaWduZWQgaW50LCBjYXJkICkKLQkJX19maWVsZCggdW5zaWduZWQgaW50LCBhZGRyICkKLQkpLAotCi0JVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmNhcmQgPSAoY29kZWMpLT5idXMtPmNhcmQtPm51bWJlcjsKLQkJX19lbnRyeS0+YWRkciA9IChjb2RlYyktPmFkZHI7Ci0JKSwKLQotCVRQX3ByaW50aygiWyVkOiVkXSIsIF9fZW50cnktPmNhcmQsIF9fZW50cnktPmFkZHIpCi0pOwotCi1ERUZJTkVfRVZFTlQoaGRhX3Bvd2VyLCBoZGFfcG93ZXJfZG93biwKLQlUUF9QUk9UTyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyksCi0JVFBfQVJHUyhjb2RlYykKLSk7Ci0KLURFRklORV9FVkVOVChoZGFfcG93ZXIsIGhkYV9wb3dlcl91cCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyksCi0JVFBfQVJHUyhjb2RlYykKLSk7Ci0KLVRSQUNFX0VWRU5UKGhkYV9wb3dlcl9jb3VudCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyksCi0JVFBfQVJHUyhjb2RlYyksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJX19maWVsZCggdW5zaWduZWQgaW50LCBjYXJkICkKLQkJX19maWVsZCggdW5zaWduZWQgaW50LCBhZGRyICkKLQkJX19maWVsZCggaW50LCBwb3dlcl9jb3VudCApCi0JCV9fZmllbGQoIGludCwgcG93ZXJfb24gKQotCQlfX2ZpZWxkKCBpbnQsIHBvd2VyX3RyYW5zaXRpb24gKQotCSksCi0KLQlUUF9mYXN0X2Fzc2lnbigKLQkJX19lbnRyeS0+Y2FyZCA9IChjb2RlYyktPmJ1cy0+Y2FyZC0+bnVtYmVyOwotCQlfX2VudHJ5LT5hZGRyID0gKGNvZGVjKS0+YWRkcjsKLQkJX19lbnRyeS0+cG93ZXJfY291bnQgPSAoY29kZWMpLT5wb3dlcl9jb3VudDsKLQkJX19lbnRyeS0+cG93ZXJfb24gPSAoY29kZWMpLT5wb3dlcl9vbjsKLQkJX19lbnRyeS0+cG93ZXJfdHJhbnNpdGlvbiA9IChjb2RlYyktPnBvd2VyX3RyYW5zaXRpb247Ci0JKSwKLQotCVRQX3ByaW50aygiWyVkOiVkXSBwb3dlcl9jb3VudD0lZCwgcG93ZXJfb249JWQsIHBvd2VyX3RyYW5zaXRpb249JWQiLAotCQkgIF9fZW50cnktPmNhcmQsIF9fZW50cnktPmFkZHIsIF9fZW50cnktPnBvd2VyX2NvdW50LAotCQkgIF9fZW50cnktPnBvd2VyX29uLCBfX2VudHJ5LT5wb3dlcl90cmFuc2l0aW9uKQotKTsKLSNlbmRpZiAvKiBDT05GSUdfUE0gKi8KLQotVFJBQ0VfRVZFTlQoaGRhX3Vuc29sX2V2ZW50LAotCi0JVFBfUFJPVE8oc3RydWN0IGhkYV9idXMgKmJ1cywgdTMyIHJlcywgdTMyIHJlc19leCksCi0KLQlUUF9BUkdTKGJ1cywgcmVzLCByZXNfZXgpLAotCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJX19maWVsZCggdW5zaWduZWQgaW50LCBjYXJkICkKLQkJX19maWVsZCggdTMyLCByZXMgKQotCQlfX2ZpZWxkKCB1MzIsIHJlc19leCApCi0JKSwKLQotCVRQX2Zhc3RfYXNzaWduKAotCQlfX2VudHJ5LT5jYXJkID0gKGJ1cyktPmNhcmQtPm51bWJlcjsKLQkJX19lbnRyeS0+cmVzID0gcmVzOwotCQlfX2VudHJ5LT5yZXNfZXggPSByZXNfZXg7Ci0JKSwKLQotCVRQX3ByaW50aygiWyVkXSByZXM9JXgsIHJlc19leD0leCIsIF9fZW50cnktPmNhcmQsCi0JCSAgX19lbnRyeS0+cmVzLCBfX2VudHJ5LT5yZXNfZXgpCi0pOwotCi0jZW5kaWYgLyogX1RSQUNFX0hEQV9IICovCi0KLS8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLwotI3VuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSAotI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggLgotI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9sb2NhbC5oIGIvc291bmQvcGNpL2hkYS9sb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4Y2I3ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9wY2kvaGRhL2xvY2FsLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqLworCisjaWZuZGVmIF9fSERBQ19MT0NBTF9ICisjZGVmaW5lIF9fSERBQ19MT0NBTF9ICisKK2ludCBoZGFjX3JlYWRfcGFybShzdHJ1Y3QgaGRhY19kZXZpY2UgKmNvZGVjLCBoZGFfbmlkX3QgbmlkLCBpbnQgcGFybSk7CisKKyNkZWZpbmUgZ2V0X3djYXBzKGNvZGVjLCBuaWQpIFwKKwloZGFjX3JlYWRfcGFybShjb2RlYywgbmlkLCBBQ19QQVJfQVVESU9fV0lER0VUX0NBUCkKKy8qIGdldCB0aGUgd2lkZ2V0IHR5cGUgZnJvbSB3aWRnZXQgY2FwYWJpbGl0eSBiaXRzICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfd2NhcHNfdHlwZSh1bnNpZ25lZCBpbnQgd2NhcHMpCit7CisJaWYgKCF3Y2FwcykKKwkJcmV0dXJuIC0xOyAvKiBpbnZhbGlkIHR5cGUgKi8KKwlyZXR1cm4gKHdjYXBzICYgQUNfV0NBUF9UWVBFKSA+PiBBQ19XQ0FQX1RZUEVfU0hJRlQ7Cit9CisKKyNkZWZpbmUgZ2V0X3Bpbl9jYXBzKGNvZGVjLCBuaWQpIFwKKwloZGFjX3JlYWRfcGFybShjb2RlYywgbmlkLCBBQ19QQVJfUElOX0NBUCkKKworc3RhdGljIGlubGluZQordW5zaWduZWQgaW50IGdldF9waW5fY2ZnKHN0cnVjdCBoZGFjX2RldmljZSAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCWlmIChzbmRfaGRhY19yZWFkKGNvZGVjLCBuaWQsIEFDX1ZFUkJfR0VUX0NPTkZJR19ERUZBVUxULCAwLCAmdmFsKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiB2YWw7Cit9CisKKyNkZWZpbmUgZ2V0X2FtcF9jYXBzKGNvZGVjLCBuaWQsIGRpcikgXAorCWhkYWNfcmVhZF9wYXJtKGNvZGVjLCBuaWQsIChkaXIpID09IEhEQV9PVVRQVVQgPyBcCisJCSAgICAgICBBQ19QQVJfQU1QX09VVF9DQVAgOiBBQ19QQVJfQU1QX0lOX0NBUCkKKworI2RlZmluZSBnZXRfcG93ZXJfY2Fwcyhjb2RlYywgbmlkKSBcCisJaGRhY19yZWFkX3Bhcm0oY29kZWMsIG5pZCwgQUNfUEFSX1BPV0VSX1NUQVRFKQorCisjZW5kaWYgLyogX19IREFDX0xPQ0FMX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2FuYWxvZy5jCmluZGV4IGQyODU5MDQuLjIzMWY4OTAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfYW5hbG9nLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9hbmFsb2cuYwpAQCAtOTksNyArOTksNyBAQAogc3RhdGljIHZvaWQgYWQxOTh4X3Bvd2VyX2VhcGQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CiAJLyogV2UgY3VycmVudGx5IG9ubHkgaGFuZGxlIGZyb250LCBIUCAqLwotCXN3aXRjaCAoY29kZWMtPnZlbmRvcl9pZCkgeworCXN3aXRjaCAoY29kZWMtPmNvcmUudmVuZG9yX2lkKSB7CiAJY2FzZSAweDExZDQxODgyOgogCWNhc2UgMHgxMWQ0ODgyYToKIAljYXNlIDB4MTFkNDE4ODQ6CkBAIC03NzcsNyArNzc3LDYgQEAKIAkJcmV0dXJuIDA7CiAKIAltdXRleF9sb2NrKCZjb2RlYy0+Y29udHJvbF9tdXRleCk7Ci0JY29kZWMtPmNhY2hlZF93cml0ZSA9IDE7CiAJcGF0aCA9IHNuZF9oZGFfZ2V0X3BhdGhfZnJvbV9pZHgoY29kZWMsCiAJCQkJCSBzcGVjLT5zbXV4X3BhdGhzW3NwZWMtPmN1cl9zbXV4XSk7CiAJaWYgKHBhdGgpCkBAIC03ODYsOSArNzg1LDcgQEAKIAlpZiAocGF0aCkKIAkJc25kX2hkYV9hY3RpdmF0ZV9wYXRoKGNvZGVjLCBwYXRoLCB0cnVlLCB0cnVlKTsKIAlzcGVjLT5jdXJfc211eCA9IHZhbDsKLQljb2RlYy0+Y2FjaGVkX3dyaXRlID0gMDsKIAltdXRleF91bmxvY2soJmNvZGVjLT5jb250cm9sX211dGV4KTsKLQlzbmRfaGRhX2NvZGVjX2ZsdXNoX2NhY2hlKGNvZGVjKTsgLyogZmx1c2ggdGhlIHVwZGF0ZXMgKi8KIAlyZXR1cm4gMTsKIH0KIApAQCAtMTAwNCwxOCArMTAwMSwxNyBAQAogCQkJCSBjb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCiB7CiAJc3RydWN0IGFkMTk4eF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0Jc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBncGlvX2luaXRfdmVyYnNbXSA9IHsKLQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwMn0sCi0JCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgMHgwMn0sCi0JCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDJ9LAotCQl7fSwKLQl9OwogCiAJc3dpdGNoIChhY3Rpb24pIHsKIAljYXNlIEhEQV9GSVhVUF9BQ1RfUFJFX1BST0JFOgogCQlzcGVjLT5nZW4udm1hc3Rlcl9tdXRlLmhvb2sgPSBhZDE4ODRfdm1hc3Rlcl9ocF9ncGlvX2hvb2s7CiAJCXNwZWMtPmdlbi5vd25fZWFwZF9jdGwgPSAxOwotCQlzbmRfaGRhX3NlcXVlbmNlX3dyaXRlX2NhY2hlKGNvZGVjLCBncGlvX2luaXRfdmVyYnMpOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCAweDAxLCAwLAorCQkJCQkgIEFDX1ZFUkJfU0VUX0dQSU9fTUFTSywgMHgwMik7CisJCXNuZF9oZGFfY29kZWNfd3JpdGVfY2FjaGUoY29kZWMsIDB4MDEsIDAsCisJCQkJCSAgQUNfVkVSQl9TRVRfR1BJT19ESVJFQ1RJT04sIDB4MDIpOworCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCAweDAxLCAwLAorCQkJCQkgIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwgMHgwMik7CiAJCWJyZWFrOwogCWNhc2UgSERBX0ZJWFVQX0FDVF9QUk9CRToKIAkJaWYgKHNwZWMtPmdlbi5hdXRvY2ZnLmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpCkBAIC0xMTk0LDIwICsxMTkwLDggQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgSEQtYXVkaW8gY29kZWMiKTsKIAotc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0X2xpc3QgYW5hbG9nX2xpc3QgPSB7CitzdGF0aWMgc3RydWN0IGhkYV9jb2RlY19kcml2ZXIgYW5hbG9nX2RyaXZlciA9IHsKIAkucHJlc2V0ID0gc25kX2hkYV9wcmVzZXRfYW5hbG9nLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcGF0Y2hfYW5hbG9nX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc25kX2hkYV9hZGRfY29kZWNfcHJlc2V0KCZhbmFsb2dfbGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwYXRjaF9hbmFsb2dfZXhpdCh2b2lkKQotewotCXNuZF9oZGFfZGVsZXRlX2NvZGVjX3ByZXNldCgmYW5hbG9nX2xpc3QpOwotfQotCi1tb2R1bGVfaW5pdChwYXRjaF9hbmFsb2dfaW5pdCkKLW1vZHVsZV9leGl0KHBhdGNoX2FuYWxvZ19leGl0KQorbW9kdWxlX2hkYV9jb2RlY19kcml2ZXIoYW5hbG9nX2RyaXZlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDExMC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMTAuYwppbmRleCA1ZTY1OTk5Li40NDczMDI2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDExMC5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTEwLmMKQEAgLTk4LDIwICs5OCw4IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNyZWF0aXZlIENBMDExMC1JQkcgSEQtYXVkaW8gY29kZWMiKTsKIAotc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0X2xpc3QgY2EwMTEwX2xpc3QgPSB7CitzdGF0aWMgc3RydWN0IGhkYV9jb2RlY19kcml2ZXIgY2EwMTEwX2RyaXZlciA9IHsKIAkucHJlc2V0ID0gc25kX2hkYV9wcmVzZXRfY2EwMTEwLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcGF0Y2hfY2EwMTEwX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc25kX2hkYV9hZGRfY29kZWNfcHJlc2V0KCZjYTAxMTBfbGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwYXRjaF9jYTAxMTBfZXhpdCh2b2lkKQotewotCXNuZF9oZGFfZGVsZXRlX2NvZGVjX3ByZXNldCgmY2EwMTEwX2xpc3QpOwotfQotCi1tb2R1bGVfaW5pdChwYXRjaF9jYTAxMTBfaW5pdCkKLW1vZHVsZV9leGl0KHBhdGNoX2NhMDExMF9leGl0KQorbW9kdWxlX2hkYV9jb2RlY19kcml2ZXIoY2EwMTEwX2RyaXZlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jYTAxMzIuYwppbmRleCBlMDM4M2VlLi40YTRlN2IyIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2NhMDEzMi5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2EwMTMyLmMKQEAgLTcxOSw3ICs3MTksNiBAQAogCXVuc2lnbmVkIGludCBudW1faW5wdXRzOwogCWhkYV9uaWRfdCBzaGFyZWRfbWljX25pZDsKIAloZGFfbmlkX3Qgc2hhcmVkX291dF9uaWQ7Ci0Jc3RydWN0IGhkYV9wY20gcGNtX3JlY1s1XTsgLyogUENNIGluZm9ybWF0aW9uICovCiAKIAkvKiBjaGlwIGFjY2VzcyAqLwogCXN0cnVjdCBtdXRleCBjaGlwaW9fbXV0ZXg7IC8qIGNoaXAgYWNjZXNzIG11dGV4ICovCkBAIC0zMTMyLDcgKzMxMzEsNyBAQAogCiAJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX3NlbGVjdF9vdXRcbiIpOwogCi0Jc25kX2hkYV9wb3dlcl91cChjb2RlYyk7CisJc25kX2hkYV9wb3dlcl91cF9wbShjb2RlYyk7CiAKIAlhdXRvX2phY2sgPSBzcGVjLT52bm9kZV9sc3dpdGNoW1ZOSURfSFBfQVNFTCAtIFZOT0RFX1NUQVJUX05JRF07CiAKQEAgLTMyMTYsNyArMzIxNSw3IEBACiAJfQogCiBleGl0OgotCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7CisJc25kX2hkYV9wb3dlcl9kb3duX3BtKGNvZGVjKTsKIAogCXJldHVybiBlcnIgPCAwID8gZXJyIDogMDsKIH0KQEAgLTMyOTQsNyArMzI5Myw3IEBACiAKIAljb2RlY19kYmcoY29kZWMsICJjYTAxMzJfc2VsZWN0X21pY1xuIik7CiAKLQlzbmRfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKKwlzbmRfaGRhX3Bvd2VyX3VwX3BtKGNvZGVjKTsKIAogCWF1dG9famFjayA9IHNwZWMtPnZub2RlX2xzd2l0Y2hbVk5JRF9BTUlDMV9BU0VMIC0gVk5PREVfU1RBUlRfTklEXTsKIApAQCAtMzMyNyw3ICszMzI2LDcgQEAKIAkJY2EwMTMyX2VmZmVjdHNfc2V0KGNvZGVjLCBWT0lDRV9GT0NVUywgMCk7CiAJfQogCi0Jc25kX2hkYV9wb3dlcl9kb3duKGNvZGVjKTsKKwlzbmRfaGRhX3Bvd2VyX2Rvd25fcG0oY29kZWMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MDM2LDEyICs0MDM1LDExIEBACiBzdGF0aWMgaW50IGNhMDEzMl9idWlsZF9wY21zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBjYTAxMzJfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBoZGFfcGNtICppbmZvID0gc3BlYy0+cGNtX3JlYzsKKwlzdHJ1Y3QgaGRhX3BjbSAqaW5mbzsKIAotCWNvZGVjLT5wY21faW5mbyA9IGluZm87Ci0JY29kZWMtPm51bV9wY21zID0gMDsKLQotCWluZm8tPm5hbWUgPSAiQ0EwMTMyIEFuYWxvZyI7CisJaW5mbyA9IHNuZF9oZGFfY29kZWNfcGNtX25ldyhjb2RlYywgIkNBMDEzMiBBbmFsb2ciKTsKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRU5PTUVNOwogCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXSA9IGNhMDEzMl9wY21fYW5hbG9nX3BsYXliYWNrOwogCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPSBzcGVjLT5kYWNzWzBdOwogCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5jaGFubmVsc19tYXggPQpAQCAtNDA0OSwyNyArNDA0NywyNyBAQAogCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdID0gY2EwMTMyX3BjbV9hbmFsb2dfY2FwdHVyZTsKIAlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW1zID0gMTsKIAlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPSBzcGVjLT5hZGNzWzBdOwotCWNvZGVjLT5udW1fcGNtcysrOwogCi0JaW5mbysrOwotCWluZm8tPm5hbWUgPSAiQ0EwMTMyIEFuYWxvZyBNaWMtSW4yIjsKKwlpbmZvID0gc25kX2hkYV9jb2RlY19wY21fbmV3KGNvZGVjLCAiQ0EwMTMyIEFuYWxvZyBNaWMtSW4yIik7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKIAlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSA9IGNhMDEzMl9wY21fYW5hbG9nX2NhcHR1cmU7CiAJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtcyA9IDE7CiAJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubmlkID0gc3BlYy0+YWRjc1sxXTsKLQljb2RlYy0+bnVtX3BjbXMrKzsKIAotCWluZm8rKzsKLQlpbmZvLT5uYW1lID0gIkNBMDEzMiBXaGF0IFUgSGVhciI7CisJaW5mbyA9IHNuZF9oZGFfY29kZWNfcGNtX25ldyhjb2RlYywgIkNBMDEzMiBXaGF0IFUgSGVhciIpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CiAJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0gPSBjYTAxMzJfcGNtX2FuYWxvZ19jYXB0dXJlOwogCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbXMgPSAxOwogCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLm5pZCA9IHNwZWMtPmFkY3NbMl07Ci0JY29kZWMtPm51bV9wY21zKys7CiAKIAlpZiAoIXNwZWMtPmRpZ19vdXQgJiYgIXNwZWMtPmRpZ19pbikKIAkJcmV0dXJuIDA7CiAKLQlpbmZvKys7Ci0JaW5mby0+bmFtZSA9ICJDQTAxMzIgRGlnaXRhbCI7CisJaW5mbyA9IHNuZF9oZGFfY29kZWNfcGNtX25ldyhjb2RlYywgIkNBMDEzMiBEaWdpdGFsIik7CisJaWYgKCFpbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKIAlpbmZvLT5wY21fdHlwZSA9IEhEQV9QQ01fVFlQRV9TUERJRjsKIAlpZiAoc3BlYy0+ZGlnX291dCkgewogCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10gPQpAQCAtNDA4MSw3ICs0MDc5LDYgQEAKIAkJCWNhMDEzMl9wY21fZGlnaXRhbF9jYXB0dXJlOwogCQlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPSBzcGVjLT5kaWdfaW47CiAJfQotCWNvZGVjLT5udW1fcGNtcysrOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MjQ2LDEzICs0MjQzLDkgQEAKIHsKIAlzdHJ1Y3QgY2EwMTMyX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAlpbnQgaTsKLQloZGFfbmlkX3QgbmlkOwogCiAJY29kZWNfZGJnKGNvZGVjLCAiY2EwMTMyX3JlZnJlc2hfd2lkZ2V0X2NhcHMuXG4iKTsKLQluaWQgPSBjb2RlYy0+c3RhcnRfbmlkOwotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX25vZGVzOyBpKyssIG5pZCsrKQotCQljb2RlYy0+d2NhcHNbaV0gPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIG5pZCwKLQkJCQkJCSAgICAgQUNfUEFSX0FVRElPX1dJREdFVF9DQVApOworCXNuZF9oZGFfY29kZWNfdXBkYXRlX3dpZGdldHMoY29kZWMpOwogCiAJZm9yIChpID0gMDsgaSA8IHNwZWMtPm11bHRpb3V0Lm51bV9kYWNzOyBpKyspCiAJCXJlZnJlc2hfYW1wX2NhcHMoY29kZWMsIHNwZWMtPmRhY3NbaV0sIEhEQV9PVVRQVVQpOwpAQCAtNDM1Miw3ICs0MzQ1LDcgQEAKIAljb25zdCBzdHJ1Y3QgZHNwX2ltYWdlX3NlZyAqZHNwX29zX2ltYWdlOwogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZndfZW50cnk7CiAKLQlpZiAocmVxdWVzdF9maXJtd2FyZSgmZndfZW50cnksIEVGWF9GSUxFLCBjb2RlYy0+YnVzLT5jYXJkLT5kZXYpICE9IDApCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZ3X2VudHJ5LCBFRlhfRklMRSwgY29kZWMtPmNhcmQtPmRldikgIT0gMCkKIAkJcmV0dXJuIGZhbHNlOwogCiAJZHNwX29zX2ltYWdlID0gKHN0cnVjdCBkc3BfaW1hZ2Vfc2VnICopKGZ3X2VudHJ5LT5kYXRhKTsKQEAgLTQ0MTMsOCArNDQwNiw3IEBACiAJICogc3RhdGUgbWFjaGluZSBydW4uCiAJICovCiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZzcGVjLT51bnNvbF9ocF93b3JrKTsKLQlxdWV1ZV9kZWxheWVkX3dvcmsoY29kZWMtPmJ1cy0+d29ya3EsICZzcGVjLT51bnNvbF9ocF93b3JrLAotCQkJICAgbXNlY3NfdG9famlmZmllcyg1MDApKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnNwZWMtPnVuc29sX2hwX3dvcmssIG1zZWNzX3RvX2ppZmZpZXMoNTAwKSk7CiAJY2ItPnRibC0+YmxvY2tfcmVwb3J0ID0gMTsKIH0KIApAQCAtNDU1NCw3ICs0NTQ2LDcgQEAKIAkJc3BlYy0+ZHNwX3N0YXRlID0gRFNQX0RPV05MT0FEX0lOSVQ7CiAJc3BlYy0+Y3Vycl9jaGlwX2FkZHggPSBJTlZBTElEX0NISVBfQUREUkVTUzsKIAotCXNuZF9oZGFfcG93ZXJfdXAoY29kZWMpOworCXNuZF9oZGFfcG93ZXJfdXBfcG0oY29kZWMpOwogCiAJY2EwMTMyX2luaXRfdW5zb2woY29kZWMpOwogCkBAIC00NTg1LDcgKzQ1NzcsNyBAQAogCiAJc25kX2hkYV9qYWNrX3JlcG9ydF9zeW5jKGNvZGVjKTsKIAotCXNuZF9oZGFfcG93ZXJfZG93bihjb2RlYyk7CisJc25kX2hkYV9wb3dlcl9kb3duX3BtKGNvZGVjKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDcwMiwyMCArNDY5NCw4IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNyZWF0aXZlIFNvdW5kIENvcmUzRCBjb2RlYyIpOwogCi1zdGF0aWMgc3RydWN0IGhkYV9jb2RlY19wcmVzZXRfbGlzdCBjYTAxMzJfbGlzdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX2RyaXZlciBjYTAxMzJfZHJpdmVyID0gewogCS5wcmVzZXQgPSBzbmRfaGRhX3ByZXNldF9jYTAxMzIsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBwYXRjaF9jYTAxMzJfaW5pdCh2b2lkKQotewotCXJldHVybiBzbmRfaGRhX2FkZF9jb2RlY19wcmVzZXQoJmNhMDEzMl9saXN0KTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHBhdGNoX2NhMDEzMl9leGl0KHZvaWQpCi17Ci0Jc25kX2hkYV9kZWxldGVfY29kZWNfcHJlc2V0KCZjYTAxMzJfbGlzdCk7Ci19Ci0KLW1vZHVsZV9pbml0KHBhdGNoX2NhMDEzMl9pbml0KQotbW9kdWxlX2V4aXQocGF0Y2hfY2EwMTMyX2V4aXQpCittb2R1bGVfaGRhX2NvZGVjX2RyaXZlcihjYTAxMzJfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NpcnJ1cy5jCmluZGV4IGRkMmIzZDkuLjUwZTlkZDYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY2lycnVzLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jaXJydXMuYwpAQCAtMTIyMSwyMCArMTIyMSw4IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNpcnJ1cyBMb2dpYyBIRC1hdWRpbyBjb2RlYyIpOwogCi1zdGF0aWMgc3RydWN0IGhkYV9jb2RlY19wcmVzZXRfbGlzdCBjaXJydXNfbGlzdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX2RyaXZlciBjaXJydXNfZHJpdmVyID0gewogCS5wcmVzZXQgPSBzbmRfaGRhX3ByZXNldF9jaXJydXMsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBwYXRjaF9jaXJydXNfaW5pdCh2b2lkKQotewotCXJldHVybiBzbmRfaGRhX2FkZF9jb2RlY19wcmVzZXQoJmNpcnJ1c19saXN0KTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHBhdGNoX2NpcnJ1c19leGl0KHZvaWQpCi17Ci0Jc25kX2hkYV9kZWxldGVfY29kZWNfcHJlc2V0KCZjaXJydXNfbGlzdCk7Ci19Ci0KLW1vZHVsZV9pbml0KHBhdGNoX2NpcnJ1c19pbml0KQotbW9kdWxlX2V4aXQocGF0Y2hfY2lycnVzX2V4aXQpCittb2R1bGVfaGRhX2NvZGVjX2RyaXZlcihjaXJydXNfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NtZWRpYS5jCmluZGV4IGM4OTVhOGYuLjYxN2Q5MDEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY21lZGlhLmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jbWVkaWEuYwpAQCAtMTM3LDIwICsxMzcsOCBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJDLU1lZGlhIEhELWF1ZGlvIGNvZGVjIik7CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldF9saXN0IGNtZWRpYV9saXN0ID0geworc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfZHJpdmVyIGNtZWRpYV9kcml2ZXIgPSB7CiAJLnByZXNldCA9IHNuZF9oZGFfcHJlc2V0X2NtZWRpYSwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhdGNoX2NtZWRpYV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHNuZF9oZGFfYWRkX2NvZGVjX3ByZXNldCgmY21lZGlhX2xpc3QpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcGF0Y2hfY21lZGlhX2V4aXQodm9pZCkKLXsKLQlzbmRfaGRhX2RlbGV0ZV9jb2RlY19wcmVzZXQoJmNtZWRpYV9saXN0KTsKLX0KLQotbW9kdWxlX2luaXQocGF0Y2hfY21lZGlhX2luaXQpCi1tb2R1bGVfZXhpdChwYXRjaF9jbWVkaWFfZXhpdCkKK21vZHVsZV9oZGFfY29kZWNfZHJpdmVyKGNtZWRpYV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9jb25leGFudC5jCmluZGV4IGRhNjdlYTguLmY4ZjBkZmIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfY29uZXhhbnQuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX2NvbmV4YW50LmMKQEAgLTEwMywxMCArMTAzLDkgQEAKIHN0YXRpYyB2b2lkIGN4X2F1dG9fcGFyc2VfYmVlcChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY29uZXhhbnRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBuaWQsIGVuZF9uaWQ7CisJaGRhX25pZF90IG5pZDsKIAotCWVuZF9uaWQgPSBjb2RlYy0+c3RhcnRfbmlkICsgY29kZWMtPm51bV9ub2RlczsKLQlmb3IgKG5pZCA9IGNvZGVjLT5zdGFydF9uaWQ7IG5pZCA8IGVuZF9uaWQ7IG5pZCsrKQorCWZvcl9lYWNoX2hkYV9jb2RlY19ub2RlKG5pZCwgY29kZWMpCiAJCWlmIChnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpID09IEFDX1dJRF9CRUVQKSB7CiAJCQlzZXRfYmVlcF9hbXAoc3BlYywgbmlkLCAwLCBIREFfT1VUUFVUKTsKIAkJCWJyZWFrOwpAQCAtMTIwLDEwICsxMTksOSBAQAogc3RhdGljIHZvaWQgY3hfYXV0b19wYXJzZV9lYXBkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaGRhX25pZF90IG5pZCwgZW5kX25pZDsKKwloZGFfbmlkX3QgbmlkOwogCi0JZW5kX25pZCA9IGNvZGVjLT5zdGFydF9uaWQgKyBjb2RlYy0+bnVtX25vZGVzOwotCWZvciAobmlkID0gY29kZWMtPnN0YXJ0X25pZDsgbmlkIDwgZW5kX25pZDsgbmlkKyspIHsKKwlmb3JfZWFjaF9oZGFfY29kZWNfbm9kZShuaWQsIGNvZGVjKSB7CiAJCWlmIChnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpICE9IEFDX1dJRF9QSU4pCiAJCQljb250aW51ZTsKIAkJaWYgKCEoc25kX2hkYV9xdWVyeV9waW5fY2Fwcyhjb2RlYywgbmlkKSAmIEFDX1BJTkNBUF9FQVBEKSkKQEAgLTMwNCw2ICszMDIsNyBAQAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBIREFfRklYVVBfQUNUX1BSRV9QUk9CRToKIAkJc3BlYy0+cGFyc2VfZmxhZ3MgfD0gSERBX1BJTkNGR19IRUFEUEhPTkVfTUlDOworCQlzbmRfaGRhY19yZWdtYXBfYWRkX3ZlbmRvcl92ZXJiKCZjb2RlYy0+Y29yZSwgMHg0MTApOwogCQlicmVhazsKIAljYXNlIEhEQV9GSVhVUF9BQ1RfUFJPQkU6CiAJCXNwZWMtPmdlbi5jYXBfc3luY19ob29rID0gY3h0X3VwZGF0ZV9oZWFkc2V0X21vZGVfaG9vazsKQEAgLTQxMSwxNSArNDEwLDExIEBACiAJCQkgICAgc3RydWN0IGhkYV9qYWNrX2NhbGxiYWNrICpqYWNrKQogewogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IHNhdmVkX2NhY2hlZF93cml0ZSA9IGNvZGVjLT5jYWNoZWRfd3JpdGU7CiAKLQljb2RlYy0+Y2FjaGVkX3dyaXRlID0gMTsKIAkvKiBpbiBEQyBtb2RlLCB3ZSBkb24ndCBoYW5kbGUgYXV0b21pYyAqLwogCWlmICghc3BlYy0+ZGNfZW5hYmxlKQogCQlzbmRfaGRhX2dlbl9taWNfYXV0b3N3aXRjaChjb2RlYywgamFjayk7CiAJb2xwY194b191cGRhdGVfbWljX3BpbnMoY29kZWMpOwotCXNuZF9oZGFfY29kZWNfZmx1c2hfY2FjaGUoY29kZWMpOwotCWNvZGVjLT5jYWNoZWRfd3JpdGUgPSBzYXZlZF9jYWNoZWRfd3JpdGU7CiAJaWYgKHNwZWMtPmRjX2VuYWJsZSkKIAkJb2xwY194b191cGRhdGVfbWljX2Jvb3N0KGNvZGVjKTsKIH0KQEAgLTg0OCw3ICs4NDMsNyBAQAogCXN0cnVjdCBjb25leGFudF9zcGVjICpzcGVjOwogCWludCBlcnI7CiAKLQljb2RlY19pbmZvKGNvZGVjLCAiJXM6IEJJT1MgYXV0by1wcm9iaW5nLlxuIiwgY29kZWMtPmNoaXBfbmFtZSk7CisJY29kZWNfaW5mbyhjb2RlYywgIiVzOiBCSU9TIGF1dG8tcHJvYmluZy5cbiIsIGNvZGVjLT5jb3JlLmNoaXBfbmFtZSk7CiAKIAlzcGVjID0ga3phbGxvYyhzaXplb2YoKnNwZWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNwZWMpCkBAIC04NjIsNyArODU3LDcgQEAKIAlpZiAoc3BlYy0+ZHluYW1pY19lYXBkKQogCQlzcGVjLT5nZW4udm1hc3Rlcl9tdXRlLmhvb2sgPSBjeF9hdXRvX3ZtYXN0ZXJfaG9vazsKIAotCXN3aXRjaCAoY29kZWMtPnZlbmRvcl9pZCkgeworCXN3aXRjaCAoY29kZWMtPmNvcmUudmVuZG9yX2lkKSB7CiAJY2FzZSAweDE0ZjE1MDQ1OgogCQljb2RlYy0+c2luZ2xlX2FkY19hbXAgPSAxOwogCQlzcGVjLT5nZW4ubWl4ZXJfbmlkID0gMHgxNzsKQEAgLTg5Niw3ICs4OTEsNyBAQAogCSAqIG90aGVycyBtYXkgdXNlIEVBUEQgcmVhbGx5IGFzIGFuIGFtcCBzd2l0Y2gsIHNvIGl0IG1pZ2h0IGJlCiAJICogbm90IGdvb2QgdG8gZXhwb3NlIGl0IGJsaW5kbHkuCiAJICovCi0Jc3dpdGNoIChjb2RlYy0+c3Vic3lzdGVtX2lkID4+IDE2KSB7CisJc3dpdGNoIChjb2RlYy0+Y29yZS5zdWJzeXN0ZW1faWQgPj4gMTYpIHsKIAljYXNlIDB4MTAzYzoKIAkJc3BlYy0+Z2VuLnZtYXN0ZXJfbXV0ZV9lbnVtID0gMTsKIAkJYnJlYWs7CkBAIC05MTksMTAgKzkxNCwxMCBAQAogCSAqIHdoaWNoIGZhbGxzIGludG8gdGhlIHNpbmdsZS1jbWQgbW9kZS4KIAkgKiBCZXR0ZXIgdG8gbWFrZSByZXNldCwgdGhlbi4KIAkgKi8KLQlpZiAoIWNvZGVjLT5idXMtPnN5bmNfd3JpdGUpIHsKKwlpZiAoIWNvZGVjLT5idXMtPmNvcmUuc3luY193cml0ZSkgewogCQljb2RlY19pbmZvKGNvZGVjLAogCQkJICAgIkVuYWJsZSBzeW5jX3dyaXRlIGZvciBzdGFibGUgY29tbXVuaWNhdGlvblxuIik7Ci0JCWNvZGVjLT5idXMtPnN5bmNfd3JpdGUgPSAxOworCQljb2RlYy0+YnVzLT5jb3JlLnN5bmNfd3JpdGUgPSAxOwogCQljb2RlYy0+YnVzLT5hbGxvd19idXNfcmVzZXQgPSAxOwogCX0KIApAQCAtMTAxOCwyMCArMTAxMyw4IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNvbmV4YW50IEhELWF1ZGlvIGNvZGVjIik7CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldF9saXN0IGNvbmV4YW50X2xpc3QgPSB7CitzdGF0aWMgc3RydWN0IGhkYV9jb2RlY19kcml2ZXIgY29uZXhhbnRfZHJpdmVyID0gewogCS5wcmVzZXQgPSBzbmRfaGRhX3ByZXNldF9jb25leGFudCwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhdGNoX2NvbmV4YW50X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gc25kX2hkYV9hZGRfY29kZWNfcHJlc2V0KCZjb25leGFudF9saXN0KTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHBhdGNoX2NvbmV4YW50X2V4aXQodm9pZCkKLXsKLQlzbmRfaGRhX2RlbGV0ZV9jb2RlY19wcmVzZXQoJmNvbmV4YW50X2xpc3QpOwotfQotCi1tb2R1bGVfaW5pdChwYXRjaF9jb25leGFudF9pbml0KQotbW9kdWxlX2V4aXQocGF0Y2hfY29uZXhhbnRfZXhpdCkKK21vZHVsZV9oZGFfY29kZWNfZHJpdmVyKGNvbmV4YW50X2RyaXZlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX2hkbWkuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jCmluZGV4IGI0MjJlNDAuLjVmNDRmNjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfaGRtaS5jCkBAIC00NSwxNCArNDUsMTQgQEAKIG1vZHVsZV9wYXJhbShzdGF0aWNfaGRtaV9wY20sIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhzdGF0aWNfaGRtaV9wY20sICJEb24ndCByZXN0cmljdCBQQ00gcGFyYW1ldGVycyBwZXIgRUxEIGluZm8iKTsKIAotI2RlZmluZSBpc19oYXN3ZWxsKGNvZGVjKSAgKChjb2RlYyktPnZlbmRvcl9pZCA9PSAweDgwODYyODA3KQotI2RlZmluZSBpc19icm9hZHdlbGwoY29kZWMpICAgICgoY29kZWMpLT52ZW5kb3JfaWQgPT0gMHg4MDg2MjgwOCkKLSNkZWZpbmUgaXNfc2t5bGFrZShjb2RlYykgKChjb2RlYyktPnZlbmRvcl9pZCA9PSAweDgwODYyODA5KQorI2RlZmluZSBpc19oYXN3ZWxsKGNvZGVjKSAgKChjb2RlYyktPmNvcmUudmVuZG9yX2lkID09IDB4ODA4NjI4MDcpCisjZGVmaW5lIGlzX2Jyb2Fkd2VsbChjb2RlYykgICAgKChjb2RlYyktPmNvcmUudmVuZG9yX2lkID09IDB4ODA4NjI4MDgpCisjZGVmaW5lIGlzX3NreWxha2UoY29kZWMpICgoY29kZWMpLT5jb3JlLnZlbmRvcl9pZCA9PSAweDgwODYyODA5KQogI2RlZmluZSBpc19oYXN3ZWxsX3BsdXMoY29kZWMpIChpc19oYXN3ZWxsKGNvZGVjKSB8fCBpc19icm9hZHdlbGwoY29kZWMpIFwKIAkJCQkJfHwgaXNfc2t5bGFrZShjb2RlYykpCiAKLSNkZWZpbmUgaXNfdmFsbGV5dmlldyhjb2RlYykgKChjb2RlYyktPnZlbmRvcl9pZCA9PSAweDgwODYyODgyKQotI2RlZmluZSBpc19jaGVycnl2aWV3KGNvZGVjKSAoKGNvZGVjKS0+dmVuZG9yX2lkID09IDB4ODA4NjI4ODMpCisjZGVmaW5lIGlzX3ZhbGxleXZpZXcoY29kZWMpICgoY29kZWMpLT5jb3JlLnZlbmRvcl9pZCA9PSAweDgwODYyODgyKQorI2RlZmluZSBpc19jaGVycnl2aWV3KGNvZGVjKSAoKGNvZGVjKS0+Y29yZS52ZW5kb3JfaWQgPT0gMHg4MDg2Mjg4MykKICNkZWZpbmUgaXNfdmFsbGV5dmlld19wbHVzKGNvZGVjKSAoaXNfdmFsbGV5dmlldyhjb2RlYykgfHwgaXNfY2hlcnJ5dmlldyhjb2RlYykpCiAKIHN0cnVjdCBoZG1pX3NwZWNfcGVyX2N2dCB7CkBAIC04Niw3ICs4Niw2IEBACiAJYm9vbCBub25fcGNtOwogCWJvb2wgY2htYXBfc2V0OwkJLyogY2hhbm5lbC1tYXAgb3ZlcnJpZGUgYnkgQUxTQSBBUEk/ICovCiAJdW5zaWduZWQgY2hhciBjaG1hcFs4XTsgLyogQUxTQSBBUEkgY2hhbm5lbC1tYXAgKi8KLQljaGFyIHBjbV9uYW1lWzhdOwkvKiBmaWxsZWQgaW4gYnVpbGRfcGNtIGNhbGxiYWNrcyAqLwogI2lmZGVmIENPTkZJR19QUk9DX0ZTCiAJc3RydWN0IHNuZF9pbmZvX2VudHJ5ICpwcm9jX2VudHJ5OwogI2VuZGlmCkBAIC0xMzIsNyArMTMxLDcgQEAKIAogCWludCBudW1fcGluczsKIAlzdHJ1Y3Qgc25kX2FycmF5IHBpbnM7IC8qIHN0cnVjdCBoZG1pX3NwZWNfcGVyX3BpbiAqLwotCXN0cnVjdCBzbmRfYXJyYXkgcGNtX3JlYzsgLyogc3RydWN0IGhkYV9wY20gKi8KKwlzdHJ1Y3QgaGRhX3BjbSAqcGNtX3JlY1sxNl07CiAJdW5zaWduZWQgaW50IGNoYW5uZWxzX21heDsgLyogbWF4IG92ZXIgYWxsIGN2dHMgKi8KIAogCXN0cnVjdCBoZG1pX2VsZCB0ZW1wX2VsZDsKQEAgLTM1NSw4ICszNTQsNyBAQAogCSgoc3RydWN0IGhkbWlfc3BlY19wZXJfcGluICopc25kX2FycmF5X2VsZW0oJnNwZWMtPnBpbnMsIGlkeCkpCiAjZGVmaW5lIGdldF9jdnQoc3BlYywgaWR4KSBcCiAJKChzdHJ1Y3QgaGRtaV9zcGVjX3Blcl9jdnQgICopc25kX2FycmF5X2VsZW0oJnNwZWMtPmN2dHMsIGlkeCkpCi0jZGVmaW5lIGdldF9wY21fcmVjKHNwZWMsIGlkeCkgXAotCSgoc3RydWN0IGhkYV9wY20gKilzbmRfYXJyYXlfZWxlbSgmc3BlYy0+cGNtX3JlYywgaWR4KSkKKyNkZWZpbmUgZ2V0X3BjbV9yZWMoc3BlYywgaWR4KQkoKHNwZWMpLT5wY21fcmVjW2lkeF0pCiAKIHN0YXRpYyBpbnQgcGluX25pZF90b19waW5faW5kZXgoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW5fbmlkKQogewpAQCAtNTc5LDcgKzU3Nyw3IEBACiAJaW50IGVycjsKIAogCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImVsZCMlZC4lZCIsIGNvZGVjLT5hZGRyLCBpbmRleCk7Ci0JZXJyID0gc25kX2NhcmRfcHJvY19uZXcoY29kZWMtPmJ1cy0+Y2FyZCwgbmFtZSwgJmVudHJ5KTsKKwllcnIgPSBzbmRfY2FyZF9wcm9jX25ldyhjb2RlYy0+Y2FyZCwgbmFtZSwgJmVudHJ5KTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNTk0LDcgKzU5Miw3IEBACiBzdGF0aWMgdm9pZCBlbGRfcHJvY19mcmVlKHN0cnVjdCBoZG1pX3NwZWNfcGVyX3BpbiAqcGVyX3BpbikKIHsKIAlpZiAoIXBlcl9waW4tPmNvZGVjLT5idXMtPnNodXRkb3duICYmIHBlcl9waW4tPnByb2NfZW50cnkpIHsKLQkJc25kX2RldmljZV9mcmVlKHBlcl9waW4tPmNvZGVjLT5idXMtPmNhcmQsIHBlcl9waW4tPnByb2NfZW50cnkpOworCQlzbmRfZGV2aWNlX2ZyZWUocGVyX3Bpbi0+Y29kZWMtPmNhcmQsIHBlcl9waW4tPnByb2NfZW50cnkpOwogCQlwZXJfcGluLT5wcm9jX2VudHJ5ID0gTlVMTDsKIAl9CiB9CkBAIC0xMzkzLDEzICsxMzkxLDEyIEBACiAJCQloZGFfbmlkX3QgcGluX25pZCwgaW50IG11eF9pZHgpCiB7CiAJc3RydWN0IGhkbWlfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWhkYV9uaWRfdCBuaWQsIGVuZF9uaWQ7CisJaGRhX25pZF90IG5pZDsKIAlpbnQgY3Z0X2lkeCwgY3VycjsKIAlzdHJ1Y3QgaGRtaV9zcGVjX3Blcl9jdnQgKnBlcl9jdnQ7CiAKIAkvKiBjb25maWd1cmUgYWxsIHBpbnMsIGluY2x1ZGluZyAibm8gcGh5c2ljYWwgY29ubmVjdGlvbiIgb25lcyAqLwotCWVuZF9uaWQgPSBjb2RlYy0+c3RhcnRfbmlkICsgY29kZWMtPm51bV9ub2RlczsKLQlmb3IgKG5pZCA9IGNvZGVjLT5zdGFydF9uaWQ7IG5pZCA8IGVuZF9uaWQ7IG5pZCsrKSB7CisJZm9yX2VhY2hfaGRhX2NvZGVjX25vZGUobmlkLCBjb2RlYykgewogCQl1bnNpZ25lZCBpbnQgd2lkX2NhcHMgPSBnZXRfd2NhcHMoY29kZWMsIG5pZCk7CiAJCXVuc2lnbmVkIGludCB3aWRfdHlwZSA9IGdldF93Y2Fwc190eXBlKHdpZF9jYXBzKTsKIApAQCAtMTU0OCw3ICsxNTQ1LDcgQEAKIAlib29sIGVsZF9jaGFuZ2VkID0gZmFsc2U7CiAJYm9vbCByZXQ7CiAKLQlzbmRfaGRhX3Bvd2VyX3VwKGNvZGVjKTsKKwlzbmRfaGRhX3Bvd2VyX3VwX3BtKGNvZGVjKTsKIAlwcmVzZW50ID0gc25kX2hkYV9waW5fc2Vuc2UoY29kZWMsIHBpbl9uaWQpOwogCiAJbXV0ZXhfbG9jaygmcGVyX3Bpbi0+bG9jayk7CkBAIC0xNTc4LDkgKzE1NzUsOCBAQAogCQkJdXBkYXRlX2VsZCA9IHRydWU7CiAJCX0KIAkJZWxzZSBpZiAocmVwb2xsKSB7Ci0JCQlxdWV1ZV9kZWxheWVkX3dvcmsoY29kZWMtPmJ1cy0+d29ya3EsCi0JCQkJCSAgICZwZXJfcGluLT53b3JrLAotCQkJCQkgICBtc2Vjc190b19qaWZmaWVzKDMwMCkpOworCQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwZXJfcGluLT53b3JrLAorCQkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDMwMCkpOwogCQkJZ290byB1bmxvY2s7CiAJCX0KIAl9CkBAIC0xNjI0LDcgKzE2MjAsNyBAQAogCX0KIAogCWlmIChlbGRfY2hhbmdlZCkKLQkJc25kX2N0bF9ub3RpZnkoY29kZWMtPmJ1cy0+Y2FyZCwKKwkJc25kX2N0bF9ub3RpZnkoY29kZWMtPmNhcmQsCiAJCQkgICAgICAgU05EUlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUgfCBTTkRSVl9DVExfRVZFTlRfTUFTS19JTkZPLAogCQkJICAgICAgICZwZXJfcGluLT5lbGRfY3RsLT5pZCk7CiAgdW5sb2NrOgpAQCAtMTYzNSw3ICsxNjMxLDcgQEAKIAkJamFjay0+YmxvY2tfcmVwb3J0ID0gIXJldDsKIAogCW11dGV4X3VubG9jaygmcGVyX3Bpbi0+bG9jayk7Ci0Jc25kX2hkYV9wb3dlcl9kb3duKGNvZGVjKTsKKwlzbmRfaGRhX3Bvd2VyX2Rvd25fcG0oY29kZWMpOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE3MzEsNyArMTcyNyw3IEBACiAJaGRhX25pZF90IG5pZDsKIAlpbnQgaSwgbm9kZXM7CiAKLQlub2RlcyA9IHNuZF9oZGFfZ2V0X3N1Yl9ub2Rlcyhjb2RlYywgY29kZWMtPmFmZywgJm5pZCk7CisJbm9kZXMgPSBzbmRfaGRhX2dldF9zdWJfbm9kZXMoY29kZWMsIGNvZGVjLT5jb3JlLmFmZywgJm5pZCk7CiAJaWYgKCFuaWQgfHwgbm9kZXMgPCAwKSB7CiAJCWNvZGVjX3dhcm4oY29kZWMsICJIRE1JOiBmYWlsZWQgdG8gZ2V0IGFmZyBzdWIgbm9kZXNcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTIwNTYsMTEgKzIwNTIsMTAgQEAKIAkJc3RydWN0IGhkbWlfc3BlY19wZXJfcGluICpwZXJfcGluOwogCiAJCXBlcl9waW4gPSBnZXRfcGluKHNwZWMsIHBpbl9pZHgpOwotCQlzcHJpbnRmKHBlcl9waW4tPnBjbV9uYW1lLCAiSERNSSAlZCIsIHBpbl9pZHgpOwotCQlpbmZvID0gc25kX2FycmF5X25ldygmc3BlYy0+cGNtX3JlYyk7CisJCWluZm8gPSBzbmRfaGRhX2NvZGVjX3BjbV9uZXcoY29kZWMsICJIRE1JICVkIiwgcGluX2lkeCk7CiAJCWlmICghaW5mbykKIAkJCXJldHVybiAtRU5PTUVNOwotCQlpbmZvLT5uYW1lID0gcGVyX3Bpbi0+cGNtX25hbWU7CisJCXNwZWMtPnBjbV9yZWNbcGluX2lkeF0gPSBpbmZvOwogCQlpbmZvLT5wY21fdHlwZSA9IEhEQV9QQ01fVFlQRV9IRE1JOwogCQlpbmZvLT5vd25fY2htYXAgPSB0cnVlOwogCkBAIC0yMDcwLDkgKzIwNjUsNiBAQAogCQkvKiBvdGhlciBwc3RyIGZpZWxkcyBhcmUgc2V0IGluIG9wZW4gKi8KIAl9CiAKLQljb2RlYy0+bnVtX3BjbXMgPSBzcGVjLT5udW1fcGluczsKLQljb2RlYy0+cGNtX2luZm8gPSBzcGVjLT5wY21fcmVjLmxpc3Q7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMjEyNSwxMyArMjExNywxNSBAQAogCiAJLyogYWRkIGNoYW5uZWwgbWFwcyAqLwogCWZvciAocGluX2lkeCA9IDA7IHBpbl9pZHggPCBzcGVjLT5udW1fcGluczsgcGluX2lkeCsrKSB7CisJCXN0cnVjdCBoZGFfcGNtICpwY207CiAJCXN0cnVjdCBzbmRfcGNtX2NobWFwICpjaG1hcDsKIAkJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKIAkJaW50IGk7CiAKLQkJaWYgKCFjb2RlYy0+cGNtX2luZm9bcGluX2lkeF0ucGNtKQorCQlwY20gPSBzcGVjLT5wY21fcmVjW3Bpbl9pZHhdOworCQlpZiAoIXBjbSB8fCAhcGNtLT5wY20pCiAJCQlicmVhazsKLQkJZXJyID0gc25kX3BjbV9hZGRfY2htYXBfY3Rscyhjb2RlYy0+cGNtX2luZm9bcGluX2lkeF0ucGNtLAorCQllcnIgPSBzbmRfcGNtX2FkZF9jaG1hcF9jdGxzKHBjbS0+cGNtLAogCQkJCQkgICAgIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCiAJCQkJCSAgICAgTlVMTCwgMCwgcGluX2lkeCwgJmNobWFwKTsKIAkJaWYgKGVyciA8IDApCkBAIC0yMTg2LDE0ICsyMTgwLDEyIEBACiB7CiAJc25kX2FycmF5X2luaXQoJnNwZWMtPnBpbnMsIHNpemVvZihzdHJ1Y3QgaGRtaV9zcGVjX3Blcl9waW4pLCBudW1zKTsKIAlzbmRfYXJyYXlfaW5pdCgmc3BlYy0+Y3Z0cywgc2l6ZW9mKHN0cnVjdCBoZG1pX3NwZWNfcGVyX2N2dCksIG51bXMpOwotCXNuZF9hcnJheV9pbml0KCZzcGVjLT5wY21fcmVjLCBzaXplb2Yoc3RydWN0IGhkYV9wY20pLCBudW1zKTsKIH0KIAogc3RhdGljIHZvaWQgaGRtaV9hcnJheV9mcmVlKHN0cnVjdCBoZG1pX3NwZWMgKnNwZWMpCiB7CiAJc25kX2FycmF5X2ZyZWUoJnNwZWMtPnBpbnMpOwogCXNuZF9hcnJheV9mcmVlKCZzcGVjLT5jdnRzKTsKLQlzbmRfYXJyYXlfZnJlZSgmc3BlYy0+cGNtX3JlYyk7CiB9CiAKIHN0YXRpYyB2b2lkIGdlbmVyaWNfaGRtaV9mcmVlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMjIwNCwxMSArMjE5NiwxMCBAQAogCWZvciAocGluX2lkeCA9IDA7IHBpbl9pZHggPCBzcGVjLT5udW1fcGluczsgcGluX2lkeCsrKSB7CiAJCXN0cnVjdCBoZG1pX3NwZWNfcGVyX3BpbiAqcGVyX3BpbiA9IGdldF9waW4oc3BlYywgcGluX2lkeCk7CiAKLQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmcGVyX3Bpbi0+d29yayk7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcGVyX3Bpbi0+d29yayk7CiAJCWVsZF9wcm9jX2ZyZWUocGVyX3Bpbik7CiAJfQogCi0JZmx1c2hfd29ya3F1ZXVlKGNvZGVjLT5idXMtPndvcmtxKTsKIAloZG1pX2FycmF5X2ZyZWUoc3BlYyk7CiAJa2ZyZWUoc3BlYyk7CiB9CkBAIC0yMjIwLDggKzIyMTEsNyBAQAogCWludCBwaW5faWR4OwogCiAJY29kZWMtPnBhdGNoX29wcy5pbml0KGNvZGVjKTsKLQlzbmRfaGRhX2NvZGVjX3Jlc3VtZV9hbXAoY29kZWMpOwotCXNuZF9oZGFfY29kZWNfcmVzdW1lX2NhY2hlKGNvZGVjKTsKKwlyZWdjYWNoZV9zeW5jKGNvZGVjLT5jb3JlLnJlZ21hcCk7CiAKIAlmb3IgKHBpbl9pZHggPSAwOyBwaW5faWR4IDwgc3BlYy0+bnVtX3BpbnM7IHBpbl9pZHgrKykgewogCQlzdHJ1Y3QgaGRtaV9zcGVjX3Blcl9waW4gKnBlcl9waW4gPSBnZXRfcGluKHNwZWMsIHBpbl9pZHgpOwpAQCAtMjMwOCw2ICsyMjk4LDcgQEAKIAogCS8qIGVuYWJsZSBEUDEuMiBtb2RlICovCiAJdmVuZG9yX3BhcmFtIHw9IElOVEVMX0VOX0RQMTI7CisJc25kX2hkYWNfcmVnbWFwX2FkZF92ZW5kb3JfdmVyYigmY29kZWMtPmNvcmUsIElOVEVMX1NFVF9WRU5ET1JfVkVSQik7CiAJc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgSU5URUxfVkVORE9SX05JRCwgMCwKIAkJCQlJTlRFTF9TRVRfVkVORE9SX1ZFUkIsIHZlbmRvcl9wYXJhbSk7CiB9CkBAIC0yMzgxLDExICsyMzcyLDEwIEBACiAJY2hhbnMgPSBnZXRfd2NhcHMoY29kZWMsIHBlcl9jdnQtPmN2dF9uaWQpOwogCWNoYW5zID0gZ2V0X3djYXBzX2NoYW5uZWxzKGNoYW5zKTsKIAotCWluZm8gPSBzbmRfYXJyYXlfbmV3KCZzcGVjLT5wY21fcmVjKTsKKwlpbmZvID0gc25kX2hkYV9jb2RlY19wY21fbmV3KGNvZGVjLCAiSERNSSAwIik7CiAJaWYgKCFpbmZvKQogCQlyZXR1cm4gLUVOT01FTTsKLQlpbmZvLT5uYW1lID0gZ2V0X3BpbihzcGVjLCAwKS0+cGNtX25hbWU7Ci0Jc3ByaW50ZihpbmZvLT5uYW1lLCAiSERNSSAwIik7CisJc3BlYy0+cGNtX3JlY1swXSA9IGluZm87CiAJaW5mby0+cGNtX3R5cGUgPSBIREFfUENNX1RZUEVfSERNSTsKIAlwc3RyID0gJmluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKIAkqcHN0ciA9IHNwZWMtPnBjbV9wbGF5YmFjazsKQEAgLTIzOTMsOSArMjM4Myw2IEBACiAJaWYgKHBzdHItPmNoYW5uZWxzX21heCA8PSAyICYmIGNoYW5zICYmIGNoYW5zIDw9IDE2KQogCQlwc3RyLT5jaGFubmVsc19tYXggPSBjaGFuczsKIAotCWNvZGVjLT5udW1fcGNtcyA9IDE7Ci0JY29kZWMtPnBjbV9pbmZvID0gaW5mbzsKLQogCXJldHVybiAwOwogfQogCkBAIC0yOTQwLDcgKzI5MjcsOCBAQAogICovCiAKICNkZWZpbmUgaXNfYW1kaGRtaV9yZXYzX29yX2xhdGVyKGNvZGVjKSBcCi0JKChjb2RlYyktPnZlbmRvcl9pZCA9PSAweDEwMDJhYTAxICYmICgoY29kZWMpLT5yZXZpc2lvbl9pZCAmIDB4ZmYwMCkgPj0gMHgwMzAwKQorCSgoY29kZWMpLT5jb3JlLnZlbmRvcl9pZCA9PSAweDEwMDJhYTAxICYmIFwKKwkgKChjb2RlYyktPmNvcmUucmV2aXNpb25faWQgJiAweGZmMDApID49IDB4MDMwMCkKICNkZWZpbmUgaGFzX2FtZF9mdWxsX3JlbWFwX3N1cHBvcnQoY29kZWMpIGlzX2FtZGhkbWlfcmV2M19vcl9sYXRlcihjb2RlYykKIAogLyogQVRJL0FNRCBzcGVjaWZpYyBIREEgcGluIHZlcmJzLCBzZWUgdGhlIEFNRCBIREEgVmVyYnMgc3BlY2lmaWNhdGlvbiAqLwpAQCAtMzMwMSwxNSArMzI4OSw2IEBACiB9CiAKIC8qCi0gKiBjYWxsZWQgZnJvbSBoZGFfY29kZWMuYyBmb3IgZ2VuZXJpYyBIRE1JIHN1cHBvcnQKLSAqLwotaW50IHNuZF9oZGFfcGFyc2VfaGRtaV9jb2RlYyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlyZXR1cm4gcGF0Y2hfZ2VuZXJpY19oZG1pKGNvZGVjKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9oZGFfcGFyc2VfaGRtaV9jb2RlYyk7Ci0KLS8qCiAgKiBwYXRjaCBlbnRyaWVzCiAgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldCBzbmRfaGRhX3ByZXNldF9oZG1pW10gPSB7CkBAIC0zMzczLDYgKzMzNTIsOCBAQAogeyAuaWQgPSAweDgwODYyODgyLCAubmFtZSA9ICJWYWxsZXl2aWV3MiBIRE1JIiwJLnBhdGNoID0gcGF0Y2hfZ2VuZXJpY19oZG1pIH0sCiB7IC5pZCA9IDB4ODA4NjI4ODMsIC5uYW1lID0gIkJyYXN3ZWxsIEhETUkiLAkucGF0Y2ggPSBwYXRjaF9nZW5lcmljX2hkbWkgfSwKIHsgLmlkID0gMHg4MDg2MjlmYiwgLm5hbWUgPSAiQ3Jlc3RsaW5lIEhETUkiLAkucGF0Y2ggPSBwYXRjaF9nZW5lcmljX2hkbWkgfSwKKy8qIHNwZWNpYWwgSUQgZm9yIGdlbmVyaWMgSERNSSAqLworeyAuaWQgPSBIREFfQ09ERUNfSURfR0VORVJJQ19IRE1JLCAucGF0Y2ggPSBwYXRjaF9nZW5lcmljX2hkbWkgfSwKIHt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKQEAgLTM0NDIsMjAgKzM0MjMsOCBAQAogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLW52aGRtaSIpOwogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWF0aWhkbWkiKTsKIAotc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfcHJlc2V0X2xpc3QgaW50ZWxfbGlzdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX2RyaXZlciBoZG1pX2RyaXZlciA9IHsKIAkucHJlc2V0ID0gc25kX2hkYV9wcmVzZXRfaGRtaSwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhdGNoX2hkbWlfaW5pdCh2b2lkKQotewotCXJldHVybiBzbmRfaGRhX2FkZF9jb2RlY19wcmVzZXQoJmludGVsX2xpc3QpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcGF0Y2hfaGRtaV9leGl0KHZvaWQpCi17Ci0Jc25kX2hkYV9kZWxldGVfY29kZWNfcHJlc2V0KCZpbnRlbF9saXN0KTsKLX0KLQotbW9kdWxlX2luaXQocGF0Y2hfaGRtaV9pbml0KQotbW9kdWxlX2V4aXQocGF0Y2hfaGRtaV9leGl0KQorbW9kdWxlX2hkYV9jb2RlY19kcml2ZXIoaGRtaV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9yZWFsdGVrLmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwppbmRleCA1MjYzOThhLi5iMThiOWM2IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYwpAQCAtMjk5LDcgKzI5OSw3IEBACiAKIAljb2VmID0gYWxjX2dldF9jb2VmMChjb2RlYyk7CiAKLQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKKwlzd2l0Y2ggKGNvZGVjLT5jb3JlLnZlbmRvcl9pZCkgewogCWNhc2UgMHgxMGVjMDI2MjoKIAkJYWxjX3VwZGF0ZV9jb2VmX2lkeChjb2RlYywgMHg3LCAwLCAxPDw1KTsKIAkJYnJlYWs7CkBAIC0zOTYsNyArMzk2LDcgQEAKIHsKIAkvKiBXZSBjdXJyZW50bHkgb25seSBoYW5kbGUgZnJvbnQsIEhQICovCiAJc3RhdGljIGhkYV9uaWRfdCBwaW5zW10gPSB7Ci0JCTB4MGYsIDB4MTAsIDB4MTQsIDB4MTUsIDAKKwkJMHgwZiwgMHgxMCwgMHgxNCwgMHgxNSwgMHgxNywgMAogCX07CiAJaGRhX25pZF90ICpwOwogCWZvciAocCA9IHBpbnM7ICpwOyBwKyspCkBAIC00MzIsNyArNDMyLDcgQEAKIAkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZShjb2RlYywgYWxjX2dwaW8zX2luaXRfdmVyYnMpOwogCQlicmVhazsKIAljYXNlIEFMQ19JTklUX0RFRkFVTFQ6Ci0JCXN3aXRjaCAoY29kZWMtPnZlbmRvcl9pZCkgeworCQlzd2l0Y2ggKGNvZGVjLT5jb3JlLnZlbmRvcl9pZCkgewogCQljYXNlIDB4MTBlYzAyNjA6CiAJCQlhbGNfdXBkYXRlX2NvZWZleF9pZHgoY29kZWMsIDB4MWEsIDcsIDAsIDB4MjAxMCk7CiAJCQlicmVhazsKQEAgLTQ5OCwxOCArNDk4LDE4IEBACiAKIAlpZiAoIWNvZGVjLT5idXMtPnBjaSkKIAkJcmV0dXJuIC0xOwotCWFzcyA9IGNvZGVjLT5zdWJzeXN0ZW1faWQgJiAweGZmZmY7CisJYXNzID0gY29kZWMtPmNvcmUuc3Vic3lzdGVtX2lkICYgMHhmZmZmOwogCWlmIChhc3MgIT0gY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlICYmIChhc3MgJiAxKSkKIAkJZ290byBkb19za3U7CiAKIAluaWQgPSAweDFkOwotCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTBlYzAyNjApCisJaWYgKGNvZGVjLT5jb3JlLnZlbmRvcl9pZCA9PSAweDEwZWMwMjYwKQogCQluaWQgPSAweDE3OwogCWFzcyA9IHNuZF9oZGFfY29kZWNfZ2V0X3BpbmNmZyhjb2RlYywgbmlkKTsKIAogCWlmICghKGFzcyAmIDEpKSB7CiAJCWNvZGVjX2luZm8oY29kZWMsICIlczogU0tVIG5vdCByZWFkeSAweCUwOHhcbiIsCi0JCQkgICBjb2RlYy0+Y2hpcF9uYW1lLCBhc3MpOworCQkJICAgY29kZWMtPmNvcmUuY2hpcF9uYW1lLCBhc3MpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC01ODUsNyArNTg1LDcgQEAKIAkJZ290byBkb19za3U7CiAJfQogCi0JYXNzID0gY29kZWMtPnN1YnN5c3RlbV9pZCAmIDB4ZmZmZjsKKwlhc3MgPSBjb2RlYy0+Y29yZS5zdWJzeXN0ZW1faWQgJiAweGZmZmY7CiAJaWYgKGNvZGVjLT5idXMtPnBjaSAmJgogCSAgICBhc3MgIT0gY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fZGV2aWNlICYmIChhc3MgJiAxKSkKIAkJZ290byBkb19za3U7CkBAIC02MDAsNyArNjAwLDcgQEAKIAkgKiAwCQk6IG92ZXJyaWRlCiAJKi8KIAluaWQgPSAweDFkOwotCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTBlYzAyNjApCisJaWYgKGNvZGVjLT5jb3JlLnZlbmRvcl9pZCA9PSAweDEwZWMwMjYwKQogCQluaWQgPSAweDE3OwogCWFzcyA9IHNuZF9oZGFfY29kZWNfZ2V0X3BpbmNmZyhjb2RlYywgbmlkKTsKIAljb2RlY19kYmcoY29kZWMsCkBAIC02MjEsNyArNjIxLDcgQEAKIAkJcmV0dXJuIDA7CiBkb19za3U6CiAJY29kZWNfZGJnKGNvZGVjLCAicmVhbHRlazogRW5hYmxpbmcgaW5pdCBBU01fSUQ9MHglMDR4IENPREVDX0lEPSUwOHhcbiIsCi0JCSAgIGFzcyAmIDB4ZmZmZiwgY29kZWMtPnZlbmRvcl9pZCk7CisJCSAgIGFzcyAmIDB4ZmZmZiwgY29kZWMtPmNvcmUudmVuZG9yX2lkKTsKIAkvKgogCSAqIDAgOiBvdmVycmlkZQogCSAqIDEgOglTd2FwIEphY2sKQEAgLTc5OSw4ICs3OTksNyBAQAogCWlmICghc3BlYy0+bm9fZGVwb3BfZGVsYXkpCiAJCW1zbGVlcCgxNTApOyAvKiB0byBhdm9pZCBwb3Agbm9pc2UgKi8KIAljb2RlYy0+cGF0Y2hfb3BzLmluaXQoY29kZWMpOwotCXNuZF9oZGFfY29kZWNfcmVzdW1lX2FtcChjb2RlYyk7Ci0Jc25kX2hkYV9jb2RlY19yZXN1bWVfY2FjaGUoY29kZWMpOworCXJlZ2NhY2hlX3N5bmMoY29kZWMtPmNvcmUucmVnbWFwKTsKIAloZGFfY2FsbF9jaGVja19wb3dlcl9zdGF0dXMoY29kZWMsIDB4MDEpOwogCXJldHVybiAwOwogfQpAQCAtODI2LDkgKzgyNSw5IEBACiAvKiByZXBsYWNlIHRoZSBjb2RlYyBjaGlwX25hbWUgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nICovCiBzdGF0aWMgaW50IGFsY19jb2RlY19yZW5hbWUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Ja2ZyZWUoY29kZWMtPmNoaXBfbmFtZSk7Ci0JY29kZWMtPmNoaXBfbmFtZSA9IGtzdHJkdXAobmFtZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjb2RlYy0+Y2hpcF9uYW1lKSB7CisJa2ZyZWUoY29kZWMtPmNvcmUuY2hpcF9uYW1lKTsKKwljb2RlYy0+Y29yZS5jaGlwX25hbWUgPSBrc3RyZHVwKG5hbWUsIEdGUF9LRVJORUwpOworCWlmICghY29kZWMtPmNvcmUuY2hpcF9uYW1lKSB7CiAJCWFsY19mcmVlKGNvZGVjKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtOTA0LDcgKzkwMyw3IEBACiAJY29uc3Qgc3RydWN0IGFsY19jb2RlY19yZW5hbWVfcGNpX3RhYmxlICpxOwogCiAJZm9yIChwID0gcmVuYW1lX3RibDsgcC0+dmVuZG9yX2lkOyBwKyspIHsKLQkJaWYgKHAtPnZlbmRvcl9pZCAhPSBjb2RlYy0+dmVuZG9yX2lkKQorCQlpZiAocC0+dmVuZG9yX2lkICE9IGNvZGVjLT5jb3JlLnZlbmRvcl9pZCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKGFsY19nZXRfY29lZjAoY29kZWMpICYgcC0+Y29lZl9tYXNrKSA9PSBwLT5jb2VmX2JpdHMpCiAJCQlyZXR1cm4gYWxjX2NvZGVjX3JlbmFtZShjb2RlYywgcC0+bmFtZSk7CkBAIC05MTMsNyArOTEyLDcgQEAKIAlpZiAoIWNvZGVjLT5idXMtPnBjaSkKIAkJcmV0dXJuIDA7CiAJZm9yIChxID0gcmVuYW1lX3BjaV90Ymw7IHEtPmNvZGVjX3ZlbmRvcl9pZDsgcSsrKSB7Ci0JCWlmIChxLT5jb2RlY192ZW5kb3JfaWQgIT0gY29kZWMtPnZlbmRvcl9pZCkKKwkJaWYgKHEtPmNvZGVjX3ZlbmRvcl9pZCAhPSBjb2RlYy0+Y29yZS52ZW5kb3JfaWQpCiAJCQljb250aW51ZTsKIAkJaWYgKHEtPnBjaV9zdWJ2ZW5kb3IgIT0gY29kZWMtPmJ1cy0+cGNpLT5zdWJzeXN0ZW1fdmVuZG9yKQogCQkJY29udGludWU7CkBAIC0xNzg1LDcgKzE3ODQsNyBAQAogewogCXVuc2lnbmVkIGludCBncGlvc3RhdGUsIGdwaW9tYXNrLCBncGlvZGlyOwogCi0JZ3Bpb3N0YXRlID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCWdwaW9zdGF0ZSA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgY29kZWMtPmNvcmUuYWZnLCAwLAogCQkJCSAgICAgICBBQ19WRVJCX0dFVF9HUElPX0RBVEEsIDApOwogCiAJaWYgKCFtdXRlZCkKQEAgLTE3OTMsMjMgKzE3OTIsMjMgQEAKIAllbHNlCiAJCWdwaW9zdGF0ZSAmPSB+KDEgPDwgcGluKTsKIAotCWdwaW9tYXNrID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCWdwaW9tYXNrID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIDAsCiAJCQkJICAgICAgQUNfVkVSQl9HRVRfR1BJT19NQVNLLCAwKTsKIAlncGlvbWFzayB8PSAoMSA8PCBwaW4pOwogCi0JZ3Bpb2RpciA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgY29kZWMtPmFmZywgMCwKKwlncGlvZGlyID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIDAsCiAJCQkJICAgICBBQ19WRVJCX0dFVF9HUElPX0RJUkVDVElPTiwgMCk7CiAJZ3Bpb2RpciB8PSAoMSA8PCBwaW4pOwogCiAKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5jb3JlLmFmZywgMCwKIAkJCSAgICBBQ19WRVJCX1NFVF9HUElPX01BU0ssIGdwaW9tYXNrKTsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5jb3JlLmFmZywgMCwKIAkJCSAgICBBQ19WRVJCX1NFVF9HUElPX0RJUkVDVElPTiwgZ3Bpb2Rpcik7CiAKIAltc2xlZXAoMSk7CiAKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5jb3JlLmFmZywgMCwKIAkJCSAgICBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIGdwaW9zdGF0ZSk7CiB9CiAKQEAgLTIyNjksNyArMjI2OCw3IEBACiAKIAlzcGVjID0gY29kZWMtPnNwZWM7CiAKLQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKKwlzd2l0Y2ggKGNvZGVjLT5jb3JlLnZlbmRvcl9pZCkgewogCWNhc2UgMHgxMGVjMDg4MjoKIAljYXNlIDB4MTBlYzA4ODU6CiAJY2FzZSAweDEwZWMwOTAwOgpAQCAtMjYwMiw1MyArMjYwMSwxMiBAQAogICogQUxDMjY5CiAgKi8KIAotc3RhdGljIGludCBwbGF5YmFja19wY21fb3BlbihzdHJ1Y3QgaGRhX3BjbV9zdHJlYW0gKmhpbmZvLAotCQkJICAgICBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCSAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGhkYV9nZW5fc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXJldHVybiBzbmRfaGRhX211bHRpX291dF9hbmFsb2dfb3Blbihjb2RlYywgJnNwZWMtPm11bHRpb3V0LCBzdWJzdHJlYW0sCi0JCQkJCSAgICAgaGluZm8pOwotfQotCi1zdGF0aWMgaW50IHBsYXliYWNrX3BjbV9wcmVwYXJlKHN0cnVjdCBoZGFfcGNtX3N0cmVhbSAqaGluZm8sCi0JCQkJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJdW5zaWduZWQgaW50IHN0cmVhbV90YWcsCi0JCQkJdW5zaWduZWQgaW50IGZvcm1hdCwKLQkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3QgaGRhX2dlbl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19wcmVwYXJlKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQsCi0JCQkJCQlzdHJlYW1fdGFnLCBmb3JtYXQsIHN1YnN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBpbnQgcGxheWJhY2tfcGNtX2NsZWFudXAoc3RydWN0IGhkYV9wY21fc3RyZWFtICpoaW5mbywKLQkJCQlzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywKLQkJCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3QgaGRhX2dlbl9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JcmV0dXJuIHNuZF9oZGFfbXVsdGlfb3V0X2FuYWxvZ19jbGVhbnVwKGNvZGVjLCAmc3BlYy0+bXVsdGlvdXQpOwotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFsYzI2OV80NGtfcGNtX2FuYWxvZ19wbGF5YmFjayA9IHsKLQkuc3Vic3RyZWFtcyA9IDEsCi0JLmNoYW5uZWxzX21pbiA9IDIsCi0JLmNoYW5uZWxzX21heCA9IDgsCiAJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDQxMDAsIC8qIGZpeGVkIHJhdGUgKi8KLQkvKiBOSUQgaXMgc2V0IGluIGFsY19idWlsZF9wY21zICovCi0JLm9wcyA9IHsKLQkJLm9wZW4gPSBwbGF5YmFja19wY21fb3BlbiwKLQkJLnByZXBhcmUgPSBwbGF5YmFja19wY21fcHJlcGFyZSwKLQkJLmNsZWFudXAgPSBwbGF5YmFja19wY21fY2xlYW51cAotCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV9wY21fc3RyZWFtIGFsYzI2OV80NGtfcGNtX2FuYWxvZ19jYXB0dXJlID0gewotCS5zdWJzdHJlYW1zID0gMSwKLQkuY2hhbm5lbHNfbWluID0gMiwKLQkuY2hhbm5lbHNfbWF4ID0gMiwKIAkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80NDEwMCwgLyogZml4ZWQgcmF0ZSAqLwotCS8qIE5JRCBpcyBzZXQgaW4gYWxjX2J1aWxkX3BjbXMgKi8KIH07CiAKIC8qIGRpZmZlcmVudCBhbGMyNjktdmFyaWFudHMgKi8KQEAgLTI5MTIsNiArMjg3MCw4IEBACiAKIAlpZiAoIWhwX3BpbikKIAkJcmV0dXJuOworCisJbXNsZWVwKDMwKTsKIAlocF9waW5fc2Vuc2UgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCBocF9waW4pOwogCiAJLyogSW5kZXggMHg0MyBEaXJlY3QgRHJpdmUgSFAgQU1QIExQTSBDb250cm9sIDEgKi8KQEAgLTMwOTksOCArMzA1OSw3IEBACiAJCW1zbGVlcCgyMDApOwogCX0KIAotCXNuZF9oZGFfY29kZWNfcmVzdW1lX2FtcChjb2RlYyk7Ci0Jc25kX2hkYV9jb2RlY19yZXN1bWVfY2FjaGUoY29kZWMpOworCXJlZ2NhY2hlX3N5bmMoY29kZWMtPmNvcmUucmVnbWFwKTsKIAloZGFfY2FsbF9jaGVja19wb3dlcl9zdGF0dXMoY29kZWMsIDB4MDEpOwogCiAJLyogb24gc29tZSBtYWNoaW5lLCB0aGUgQklPUyB3aWxsIGNsZWFyIHRoZSBjb2RlYyBncGlvIGRhdGEgd2hlbiBlbnRlcgpAQCAtMzEwOCw3ICszMDY3LDcgQEAKIAkgKiBpbiB0aGUgZHJpdmVyLgogCSAqLwogCWlmIChzcGVjLT5ncGlvX2xlZCkKLQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLAorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIDAsIEFDX1ZFUkJfU0VUX0dQSU9fREFUQSwKIAkJCSAgICBzcGVjLT5ncGlvX2xlZCk7CiAKIAlpZiAoc3BlYy0+aGFzX2FsYzU1MDVfZHNwKQpAQCAtMzE1Myw4ICszMTEyLDggQEAKIAl9OwogCXVuc2lnbmVkIGludCBjZmc7CiAKLQlpZiAoc3RyY21wKGNvZGVjLT5jaGlwX25hbWUsICJBTEMyNzFYIikgJiYKLQkgICAgc3RyY21wKGNvZGVjLT5jaGlwX25hbWUsICJBTEMyNjlWQiIpKQorCWlmIChzdHJjbXAoY29kZWMtPmNvcmUuY2hpcF9uYW1lLCAiQUxDMjcxWCIpICYmCisJICAgIHN0cmNtcChjb2RlYy0+Y29yZS5jaGlwX25hbWUsICJBTEMyNjlWQiIpKQogCQlyZXR1cm47CiAJY2ZnID0gc25kX2hkYV9jb2RlY19nZXRfcGluY2ZnKGNvZGVjLCAweDEyKTsKIAlpZiAoZ2V0X2RlZmNmZ19jb25uZWN0KGNmZykgPT0gQUNfSkFDS19QT1JUX0ZJWEVEKQpAQCAtMzI2NCw3ICszMjIzLDcgQEAKIAlzbmRfaGRhX3NldF9waW5fY3RsKGNvZGVjLCBuaWQsCiAJCQkgICAgc25kX2hkYV9jb2RlY19nZXRfcGluX3RhcmdldChjb2RlYywgbmlkKSk7CiAKLQlyZXR1cm4gQUNfUFdSU1RfRDA7CisJcmV0dXJuIHNuZF9oZGFfZ2VuX3BhdGhfcG93ZXJfZmlsdGVyKGNvZGVjLCBuaWQsIHBvd2VyX3N0YXRlKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjMjY5X2ZpeHVwX2hwX211dGVfbGVkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLApAQCAtMzUyMCw5ICszNDc5LDkgQEAKIAkJfQogCiAJCXNuZF9oZGFfYWRkX3ZlcmJzKGNvZGVjLCBncGlvX2luaXQpOwotCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIDAsCiAJCQkJCSAgQUNfVkVSQl9TRVRfR1BJT19VTlNPTElDSVRFRF9SU1BfTUFTSywgMHgwNCk7Ci0JCXNuZF9oZGFfamFja19kZXRlY3RfZW5hYmxlX2NhbGxiYWNrKGNvZGVjLCBjb2RlYy0+YWZnLAorCQlzbmRfaGRhX2phY2tfZGV0ZWN0X2VuYWJsZV9jYWxsYmFjayhjb2RlYywgY29kZWMtPmNvcmUuYWZnLAogCQkJCQkJICAgIGdwaW8yX21pY19ob3RrZXlfZXZlbnQpOwogCiAJCXNwZWMtPmdlbi52bWFzdGVyX211dGUuaG9vayA9IGFsY19maXh1cF9ncGlvX211dGVfaG9vazsKQEAgLTM1ODMsNiArMzU0MiwxNCBAQAogCQlXUklURV9DT0VGKDB4MzIsIDB4NDJhMyksCiAJCXt9CiAJfTsKKwlzdGF0aWMgc3RydWN0IGNvZWZfZncgY29lZjAyODhbXSA9IHsKKwkJVVBEQVRFX0NPRUYoMHg0ZiwgMHhmY2MwLCAweGM0MDApLAorCQlVUERBVEVfQ09FRigweDUwLCAweDIwMDAsIDB4MjAwMCksCisJCVVQREFURV9DT0VGKDB4NTYsIDB4MDAwNiwgMHgwMDA2KSwKKwkJVVBEQVRFX0NPRUYoMHg2NiwgMHgwMDA4LCAwKSwKKwkJVVBEQVRFX0NPRUYoMHg2NywgMHgyMDAwLCAwKSwKKwkJe30KKwl9OwogCXN0YXRpYyBzdHJ1Y3QgY29lZl9mdyBjb2VmMDI5MltdID0gewogCQlXUklURV9DT0VGKDB4NzYsIDB4MDAwZSksCiAJCVdSSVRFX0NPRUYoMHg2YywgMHgyNDAwKSwKQEAgLTM2MDUsMTQgKzM1NzIsMTkgQEAKIAkJe30KIAl9OwogCi0Jc3dpdGNoIChjb2RlYy0+dmVuZG9yX2lkKSB7CisJc3dpdGNoIChjb2RlYy0+Y29yZS52ZW5kb3JfaWQpIHsKIAljYXNlIDB4MTBlYzAyNTU6CisJY2FzZSAweDEwZWMwMjU2OgogCQlhbGNfcHJvY2Vzc19jb2VmX2Z3KGNvZGVjLCBjb2VmMDI1NSk7CiAJCWJyZWFrOwogCWNhc2UgMHgxMGVjMDIzMzoKIAljYXNlIDB4MTBlYzAyODM6CiAJCWFsY19wcm9jZXNzX2NvZWZfZncoY29kZWMsIGNvZWYwMjMzKTsKIAkJYnJlYWs7CisJY2FzZSAweDEwZWMwMjg2OgorCWNhc2UgMHgxMGVjMDI4ODoKKwkJYWxjX3Byb2Nlc3NfY29lZl9mdyhjb2RlYywgY29lZjAyODgpOworCQlicmVhazsKIAljYXNlIDB4MTBlYzAyOTI6CiAJCWFsY19wcm9jZXNzX2NvZWZfZncoY29kZWMsIGNvZWYwMjkyKTsKIAkJYnJlYWs7CkBAIC0zNjQyLDYgKzM2MTQsMTQgQEAKIAkJV1JJVEVfQ09FRigweDI2LCAweDAwOGMpLAogCQl7fQogCX07CisJc3RhdGljIHN0cnVjdCBjb2VmX2Z3IGNvZWYwMjg4W10gPSB7CisJCVVQREFURV9DT0VGKDB4NTAsIDB4MjAwMCwgMCksCisJCVVQREFURV9DT0VGKDB4NTYsIDB4MDAwNiwgMCksCisJCVVQREFURV9DT0VGKDB4NGYsIDB4ZmNjMCwgMHhjNDAwKSwKKwkJVVBEQVRFX0NPRUYoMHg2NiwgMHgwMDA4LCAweDAwMDgpLAorCQlVUERBVEVfQ09FRigweDY3LCAweDIwMDAsIDB4MjAwMCksCisJCXt9CisJfTsKIAlzdGF0aWMgc3RydWN0IGNvZWZfZncgY29lZjAyOTJbXSA9IHsKIAkJV1JJVEVfQ09FRigweDE5LCAweGEyMDgpLAogCQlXUklURV9DT0VGKDB4MmUsIDB4YWNmMCksCkBAIC0zNjYwLDggKzM2NDAsOSBAQAogCQl7fQogCX07CiAKLQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKKwlzd2l0Y2ggKGNvZGVjLT5jb3JlLnZlbmRvcl9pZCkgewogCWNhc2UgMHgxMGVjMDI1NToKKwljYXNlIDB4MTBlYzAyNTY6CiAJCWFsY193cml0ZV9jb2VmX2lkeChjb2RlYywgMHg0NSwgMHhjNDg5KTsKIAkJc25kX2hkYV9zZXRfcGluX2N0bF9jYWNoZShjb2RlYywgaHBfcGluLCAwKTsKIAkJYWxjX3Byb2Nlc3NfY29lZl9mdyhjb2RlYywgY29lZjAyNTUpOwpAQCAtMzY3NCw2ICszNjU1LDEzIEBACiAJCWFsY19wcm9jZXNzX2NvZWZfZncoY29kZWMsIGNvZWYwMjMzKTsKIAkJc25kX2hkYV9zZXRfcGluX2N0bF9jYWNoZShjb2RlYywgbWljX3BpbiwgUElOX1ZSRUY1MCk7CiAJCWJyZWFrOworCWNhc2UgMHgxMGVjMDI4NjoKKwljYXNlIDB4MTBlYzAyODg6CisJCWFsY191cGRhdGVfY29lZl9pZHgoY29kZWMsIDB4NGYsIDB4MDAwYywgMCk7CisJCXNuZF9oZGFfc2V0X3Bpbl9jdGxfY2FjaGUoY29kZWMsIGhwX3BpbiwgMCk7CisJCWFsY19wcm9jZXNzX2NvZWZfZncoY29kZWMsIGNvZWYwMjg4KTsKKwkJc25kX2hkYV9zZXRfcGluX2N0bF9jYWNoZShjb2RlYywgbWljX3BpbiwgUElOX1ZSRUY1MCk7CisJCWJyZWFrOwogCWNhc2UgMHgxMGVjMDI5MjoKIAkJc25kX2hkYV9zZXRfcGluX2N0bF9jYWNoZShjb2RlYywgaHBfcGluLCAwKTsKIAkJYWxjX3Byb2Nlc3NfY29lZl9mdyhjb2RlYywgY29lZjAyOTIpOwpAQCAtMzcwOSw2ICszNjk3LDE0IEBACiAJCVdSSVRFX0NPRUYoMHgzMiwgMHg0ZWEzKSwKIAkJe30KIAl9OworCXN0YXRpYyBzdHJ1Y3QgY29lZl9mdyBjb2VmMDI4OFtdID0geworCQlVUERBVEVfQ09FRigweDRmLCAweGZjYzAsIDB4YzQwMCksIC8qIFNldCB0byBUUlMgdHlwZSAqLworCQlVUERBVEVfQ09FRigweDUwLCAweDIwMDAsIDB4MjAwMCksCisJCVVQREFURV9DT0VGKDB4NTYsIDB4MDAwNiwgMHgwMDA2KSwKKwkJVVBEQVRFX0NPRUYoMHg2NiwgMHgwMDA4LCAwKSwKKwkJVVBEQVRFX0NPRUYoMHg2NywgMHgyMDAwLCAwKSwKKwkJe30KKwl9OwogCXN0YXRpYyBzdHJ1Y3QgY29lZl9mdyBjb2VmMDI5MltdID0gewogCQlXUklURV9DT0VGKDB4NzYsIDB4MDAwZSksCiAJCVdSSVRFX0NPRUYoMHg2YywgMHgyNDAwKSwKQEAgLTM3MjksMTQgKzM3MjUsMjAgQEAKIAkJe30KIAl9OwogCi0Jc3dpdGNoIChjb2RlYy0+dmVuZG9yX2lkKSB7CisJc3dpdGNoIChjb2RlYy0+Y29yZS52ZW5kb3JfaWQpIHsKIAljYXNlIDB4MTBlYzAyNTU6CisJY2FzZSAweDEwZWMwMjU2OgogCQlhbGNfcHJvY2Vzc19jb2VmX2Z3KGNvZGVjLCBjb2VmMDI1NSk7CiAJCWJyZWFrOwogCWNhc2UgMHgxMGVjMDIzMzoKIAljYXNlIDB4MTBlYzAyODM6CiAJCWFsY19wcm9jZXNzX2NvZWZfZncoY29kZWMsIGNvZWYwMjMzKTsKIAkJYnJlYWs7CisJY2FzZSAweDEwZWMwMjg2OgorCWNhc2UgMHgxMGVjMDI4ODoKKwkJYWxjX3Byb2Nlc3NfY29lZl9mdyhjb2RlYywgY29lZjAyODgpOworCQlicmVhazsKKwkJYnJlYWs7CiAJY2FzZSAweDEwZWMwMjkyOgogCQlhbGNfcHJvY2Vzc19jb2VmX2Z3KGNvZGVjLCBjb2VmMDI5Mik7CiAJCWJyZWFrOwpAQCAtMzc2NSw2ICszNzY3LDEzIEBACiAJCVdSSVRFX0NPRUYoMHgzMiwgMHg0ZWEzKSwKIAkJe30KIAl9OworCXN0YXRpYyBzdHJ1Y3QgY29lZl9mdyBjb2VmMDI4OFtdID0geworCQlVUERBVEVfQ09FRigweDUwLCAweDIwMDAsIDB4MjAwMCksCisJCVVQREFURV9DT0VGKDB4NTYsIDB4MDAwNiwgMHgwMDA2KSwKKwkJVVBEQVRFX0NPRUYoMHg2NiwgMHgwMDA4LCAwKSwKKwkJVVBEQVRFX0NPRUYoMHg2NywgMHgyMDAwLCAwKSwKKwkJe30KKwl9OwogCXN0YXRpYyBzdHJ1Y3QgY29lZl9mdyBjb2VmMDI5MltdID0gewogCQlXUklURV9DT0VGKDB4NmIsIDB4ZDQyOSksCiAJCVdSSVRFX0NPRUYoMHg3NiwgMHgwMDA4KSwKQEAgLTM3ODMsMTQgKzM3OTIsMjEgQEAKIAkJe30KIAl9OwogCi0Jc3dpdGNoIChjb2RlYy0+dmVuZG9yX2lkKSB7CisJc3dpdGNoIChjb2RlYy0+Y29yZS52ZW5kb3JfaWQpIHsKIAljYXNlIDB4MTBlYzAyNTU6CisJY2FzZSAweDEwZWMwMjU2OgogCQlhbGNfcHJvY2Vzc19jb2VmX2Z3KGNvZGVjLCBjb2VmMDI1NSk7CiAJCWJyZWFrOwogCWNhc2UgMHgxMGVjMDIzMzoKIAljYXNlIDB4MTBlYzAyODM6CiAJCWFsY19wcm9jZXNzX2NvZWZfZncoY29kZWMsIGNvZWYwMjMzKTsKIAkJYnJlYWs7CisJY2FzZSAweDEwZWMwMjg2OgorCWNhc2UgMHgxMGVjMDI4ODoKKwkJYWxjX3VwZGF0ZV9jb2VmX2lkeChjb2RlYywgMHg0ZiwgMHhmY2MwLCAweGQ0MDApOworCQltc2xlZXAoMzAwKTsKKwkJYWxjX3Byb2Nlc3NfY29lZl9mdyhjb2RlYywgY29lZjAyODgpOworCQlicmVhazsKIAljYXNlIDB4MTBlYzAyOTI6CiAJCWFsY19wcm9jZXNzX2NvZWZfZncoY29kZWMsIGNvZWYwMjkyKTsKIAkJYnJlYWs7CkBAIC0zODE5LDYgKzM4MzUsMTMgQEAKIAkJV1JJVEVfQ09FRigweDMyLCAweDRlYTMpLAogCQl7fQogCX07CisJc3RhdGljIHN0cnVjdCBjb2VmX2Z3IGNvZWYwMjg4W10gPSB7CisJCVVQREFURV9DT0VGKDB4NTAsIDB4MjAwMCwgMHgyMDAwKSwKKwkJVVBEQVRFX0NPRUYoMHg1NiwgMHgwMDA2LCAweDAwMDYpLAorCQlVUERBVEVfQ09FRigweDY2LCAweDAwMDgsIDApLAorCQlVUERBVEVfQ09FRigweDY3LCAweDIwMDAsIDApLAorCQl7fQorCX07CiAJc3RhdGljIHN0cnVjdCBjb2VmX2Z3IGNvZWYwMjkyW10gPSB7CiAJCVdSSVRFX0NPRUYoMHg2YiwgMHhlNDI5KSwKIAkJV1JJVEVfQ09FRigweDc2LCAweDAwMDgpLApAQCAtMzgzNywxNCArMzg2MCwyMSBAQAogCQl7fQogCX07CiAKLQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKKwlzd2l0Y2ggKGNvZGVjLT5jb3JlLnZlbmRvcl9pZCkgewogCWNhc2UgMHgxMGVjMDI1NToKKwljYXNlIDB4MTBlYzAyNTY6CiAJCWFsY19wcm9jZXNzX2NvZWZfZncoY29kZWMsIGNvZWYwMjU1KTsKIAkJYnJlYWs7CiAJY2FzZSAweDEwZWMwMjMzOgogCWNhc2UgMHgxMGVjMDI4MzoKIAkJYWxjX3Byb2Nlc3NfY29lZl9mdyhjb2RlYywgY29lZjAyMzMpOwogCQlicmVhazsKKwljYXNlIDB4MTBlYzAyODY6CisJY2FzZSAweDEwZWMwMjg4OgorCQlhbGNfdXBkYXRlX2NvZWZfaWR4KGNvZGVjLCAweDRmLCAweGZjYzAsIDB4ZTQwMCk7CisJCW1zbGVlcCgzMDApOworCQlhbGNfcHJvY2Vzc19jb2VmX2Z3KGNvZGVjLCBjb2VmMDI4OCk7CisJCWJyZWFrOwogCWNhc2UgMHgxMGVjMDI5MjoKIAkJYWxjX3Byb2Nlc3NfY29lZl9mdyhjb2RlYywgY29lZjAyOTIpOwogCQlicmVhazsKQEAgLTM4NjksNiArMzg5OSwxMCBAQAogIGNvbnRlb2wpICovCiAJCXt9CiAJfTsKKwlzdGF0aWMgc3RydWN0IGNvZWZfZncgY29lZjAyODhbXSA9IHsKKwkJVVBEQVRFX0NPRUYoMHg0ZiwgMHhmY2MwLCAweGQ0MDApLCAvKiBDaGVjayBUeXBlICovCisJCXt9CisJfTsKIAlzdGF0aWMgc3RydWN0IGNvZWZfZncgY29lZjAyOTNbXSA9IHsKIAkJVVBEQVRFX0NPRUYoMHg0YSwgMHgwMDBmLCAweDAwMDgpLCAvKiBDb21ibyBKYWNrIGF1dG8gZGV0ZWN0ICovCiAJCVdSSVRFX0NPRUYoMHg0NSwgMHhENDI5KSwgLyogU2V0IHRvIGN0aWEgdHlwZSAqLwpAQCAtMzg4Miw4ICszOTE2LDkgQEAKIAkJe30KIAl9OwogCi0Jc3dpdGNoIChjb2RlYy0+dmVuZG9yX2lkKSB7CisJc3dpdGNoIChjb2RlYy0+Y29yZS52ZW5kb3JfaWQpIHsKIAljYXNlIDB4MTBlYzAyNTU6CisJY2FzZSAweDEwZWMwMjU2OgogCQlhbGNfcHJvY2Vzc19jb2VmX2Z3KGNvZGVjLCBjb2VmMDI1NSk7CiAJCW1zbGVlcCgzMDApOwogCQl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg0Nik7CkBAIC0zODk2LDYgKzM5MzEsMTMgQEAKIAkJdmFsID0gYWxjX3JlYWRfY29lZl9pZHgoY29kZWMsIDB4NDYpOwogCQlpc19jdGlhID0gKHZhbCAmIDB4MDA3MCkgPT0gMHgwMDcwOwogCQlicmVhazsKKwljYXNlIDB4MTBlYzAyODY6CisJY2FzZSAweDEwZWMwMjg4OgorCQlhbGNfcHJvY2Vzc19jb2VmX2Z3KGNvZGVjLCBjb2VmMDI4OCk7CisJCW1zbGVlcCgzNTApOworCQl2YWwgPSBhbGNfcmVhZF9jb2VmX2lkeChjb2RlYywgMHg1MCk7CisJCWlzX2N0aWEgPSAodmFsICYgMHgwMDcwKSA9PSAweDAwNzA7CisJCWJyZWFrOwogCWNhc2UgMHgxMGVjMDI5MjoKIAkJYWxjX3dyaXRlX2NvZWZfaWR4KGNvZGVjLCAweDZiLCAweGQ0MjkpOwogCQltc2xlZXAoMzAwKTsKQEAgLTQwNzksNiArNDEyMSwyOSBAQAogCQlhbGNfZml4dXBfaGVhZHNldF9tb2RlKGNvZGVjLCBmaXgsIGFjdGlvbik7CiB9CiAKK3N0YXRpYyB2b2lkIGFsYzI4OF91cGRhdGVfaGVhZHNldF9qYWNrX2NiKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCSAgICAgICBzdHJ1Y3QgaGRhX2phY2tfY2FsbGJhY2sgKmphY2spCit7CisJc3RydWN0IGFsY19zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaW50IHByZXNlbnQ7CisKKwlhbGNfdXBkYXRlX2hlYWRzZXRfamFja19jYihjb2RlYywgamFjayk7CisJLyogSGVhZHNldCBNaWMgZW5hYmxlIG9yIGRpc2FibGUsIG9ubHkgZm9yIERlbGwgRGlubyAqLworCXByZXNlbnQgPSBzcGVjLT5nZW4uaHBfamFja19wcmVzZW50ID8gMHg0MCA6IDA7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgMHgwMSwgMCwgQUNfVkVSQl9TRVRfR1BJT19EQVRBLAorCQkJCXByZXNlbnQpOworfQorCitzdGF0aWMgdm9pZCBhbGNfZml4dXBfaGVhZHNldF9tb2RlX2RlbGxfYWxjMjg4KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAorCQkJCWNvbnN0IHN0cnVjdCBoZGFfZml4dXAgKmZpeCwgaW50IGFjdGlvbikKK3sKKwlhbGNfZml4dXBfaGVhZHNldF9tb2RlKGNvZGVjLCBmaXgsIGFjdGlvbik7CisJaWYgKGFjdGlvbiA9PSBIREFfRklYVVBfQUNUX1BST0JFKSB7CisJCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCQlzcGVjLT5nZW4uaHBfYXV0b211dGVfaG9vayA9IGFsYzI4OF91cGRhdGVfaGVhZHNldF9qYWNrX2NiOworCX0KK30KKwogc3RhdGljIHZvaWQgYWxjX2ZpeHVwX2F1dG9fbXV0ZV92aWFfYW1wKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLAogCQkJCQljb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwICpmaXgsIGludCBhY3Rpb24pCiB7CkBAIC00MTE5LDkgKzQxODQsOSBAQAogCiAJLyogQXZvaWQgcG9wIG5vaXNlcyB3aGVuIGhlYWRwaG9uZXMgYXJlIHBsdWdnZWQgaW4gKi8KIAlpZiAoc3BlYy0+Z2VuLmhwX2phY2tfcHJlc2VudCkKLQkJaWYgKG5pZCA9PSBjb2RlYy0+YWZnIHx8IG5pZCA9PSAweDAyIHx8IG5pZCA9PSAweDE1KQorCQlpZiAobmlkID09IGNvZGVjLT5jb3JlLmFmZyB8fCBuaWQgPT0gMHgwMiB8fCBuaWQgPT0gMHgxNSkKIAkJCXJldHVybiBBQ19QV1JTVF9EMDsKLQlyZXR1cm4gcG93ZXJfc3RhdGU7CisJcmV0dXJuIHNuZF9oZGFfZ2VuX3BhdGhfcG93ZXJfZmlsdGVyKGNvZGVjLCBuaWQsIHBvd2VyX3N0YXRlKTsKIH0KIAogc3RhdGljIHZvaWQgYWxjX2ZpeHVwX2RlbGxfeHBzMTMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCkBAIC00MzY0LDYgKzQ0MjksNyBAQAogCUFMQzI2OV9GSVhVUF9RVUFOVEFfTVVURSwKIAlBTEMyNjlfRklYVVBfTElGRUJPT0ssCiAJQUxDMjY5X0ZJWFVQX0xJRkVCT09LX0VYVE1JQywKKwlBTEMyNjlfRklYVVBfTElGRUJPT0tfSFBfUElOLAogCUFMQzI2OV9GSVhVUF9BTUlDLAogCUFMQzI2OV9GSVhVUF9ETUlDLAogCUFMQzI2OVZCX0ZJWFVQX0FNSUMsCkBAIC00NDE4LDYgKzQ0ODQsOSBAQAogCUFMQzI4Nl9GSVhVUF9IUF9HUElPX0xFRCwKIAlBTEMyODBfRklYVVBfSFBfR1BJTzJfTUlDX0hPVEtFWSwKIAlBTEMyODBfRklYVVBfSFBfRE9DS19QSU5TLAorCUFMQzI4OF9GSVhVUF9ERUxMX0hFQURTRVRfTU9ERSwKKwlBTEMyODhfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFLAorCUFMQzI4OF9GSVhVUF9ERUxMX1hQU18xM19HUElPNiwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaGRhX2ZpeHVwIGFsYzI2OV9maXh1cHNbXSA9IHsKQEAgLTQ1MTcsNiArNDU4NiwxMyBAQAogCQkJeyB9CiAJCX0sCiAJfSwKKwlbQUxDMjY5X0ZJWFVQX0xJRkVCT09LX0hQX1BJTl0gPSB7CisJCS50eXBlID0gSERBX0ZJWFVQX1BJTlMsCisJCS52LnBpbnMgPSAoY29uc3Qgc3RydWN0IGhkYV9waW50YmxbXSkgeworCQkJeyAweDIxLCAweDAyMjExMDJmIH0sIC8qIEhQIG91dCAqLworCQkJeyB9CisJCX0sCisJfSwKIAlbQUxDMjY5X0ZJWFVQX0FNSUNdID0gewogCQkudHlwZSA9IEhEQV9GSVhVUF9QSU5TLAogCQkudi5waW5zID0gKGNvbnN0IHN0cnVjdCBoZGFfcGludGJsW10pIHsKQEAgLTQ5MDYsNiArNDk4MiwzMyBAQAogCQkuY2hhaW5lZCA9IHRydWUsCiAJCS5jaGFpbl9pZCA9IEFMQzI4MF9GSVhVUF9IUF9HUElPNAogCX0sCisJW0FMQzI4OF9GSVhVUF9ERUxMX0hFQURTRVRfTU9ERV0gPSB7CisJCS50eXBlID0gSERBX0ZJWFVQX0ZVTkMsCisJCS52LmZ1bmMgPSBhbGNfZml4dXBfaGVhZHNldF9tb2RlX2RlbGxfYWxjMjg4LAorCQkuY2hhaW5lZCA9IHRydWUsCisJCS5jaGFpbl9pZCA9IEFMQzI1NV9GSVhVUF9ERUxMX1dNSV9NSUNfTVVURV9MRUQKKwl9LAorCVtBTEMyODhfRklYVVBfREVMTDFfTUlDX05PX1BSRVNFTkNFXSA9IHsKKwkJLnR5cGUgPSBIREFfRklYVVBfUElOUywKKwkJLnYucGlucyA9IChjb25zdCBzdHJ1Y3QgaGRhX3BpbnRibFtdKSB7CisJCQl7IDB4MTgsIDB4MDFhMTkxM2MgfSwgLyogdXNlIGFzIGhlYWRzZXQgbWljLCB3aXRob3V0IGl0cyBvd24gamFjayBkZXRlY3QgKi8KKwkJCXsgMHgxYSwgMHgwMWExOTEzZCB9LCAvKiB1c2UgYXMgaGVhZHBob25lIG1pYywgd2l0aG91dCBpdHMgb3duIGphY2sgZGV0ZWN0ICovCisJCQl7IH0KKwkJfSwKKwkJLmNoYWluZWQgPSB0cnVlLAorCQkuY2hhaW5faWQgPSBBTEMyODhfRklYVVBfREVMTF9IRUFEU0VUX01PREUKKwl9LAorCVtBTEMyODhfRklYVVBfREVMTF9YUFNfMTNfR1BJTzZdID0geworCQkudHlwZSA9IEhEQV9GSVhVUF9WRVJCUywKKwkJLnYudmVyYnMgPSAoY29uc3Qgc3RydWN0IGhkYV92ZXJiW10pIHsKKwkJCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX01BU0ssIDB4NDB9LAorCQkJezB4MDEsIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCAweDQwfSwKKwkJCXsweDAxLCBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIDB4MDB9LAorCQkJeyB9CisJCX0sCisJCS5jaGFpbmVkID0gdHJ1ZSwKKwkJLmNoYWluX2lkID0gQUxDMjg4X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRQorCX0sCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY2lfcXVpcmsgYWxjMjY5X2ZpeHVwX3RibFtdID0gewpAQCAtNTAxMCw2ICs1MTEzLDcgQEAKIAlTTkRfUENJX1FVSVJLKDB4MTA0ZCwgMHg5MDg0LCAiU29ueSBWQUlPIiwgQUxDMjc1X0ZJWFVQX1NPTllfSFdFUSksCiAJU05EX1BDSV9RVUlSSygweDEwNGQsIDB4OTA5OSwgIlNvbnkgVkFJTyBTMTMiLCBBTEMyNzVfRklYVVBfU09OWV9ESVNBQkxFX0FBTUlYKSwKIAlTTkRfUENJX1FVSVJLKDB4MTBjZiwgMHgxNDc1LCAiTGlmZWJvb2siLCBBTEMyNjlfRklYVVBfTElGRUJPT0spLAorCVNORF9QQ0lfUVVJUksoMHgxMGNmLCAweDE1ZGMsICJMaWZlYm9vayBUNzMxIiwgQUxDMjY5X0ZJWFVQX0xJRkVCT09LX0hQX1BJTiksCiAJU05EX1BDSV9RVUlSSygweDEwY2YsIDB4MTg0NSwgIkxpZmVib29rIFU5MDQiLCBBTEMyNjlfRklYVVBfTElGRUJPT0tfRVhUTUlDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTQ0ZCwgMHhjMTA5LCAiU2Ftc3VuZyBBdGl2IGJvb2sgOSAoTlA5MDBYM0cpIiwgQUxDMjY5X0ZJWFVQX0lOVl9ETUlDKSwKIAlTTkRfUENJX1FVSVJLKDB4MTQ1OCwgMHhmYTUzLCAiR2lnYWJ5dGUgQlhCVC0yODA3IiwgQUxDMjgzX0ZJWFVQX0JYQlQyODA3X01JQyksCkBAIC01MDMwLDEyICs1MTM0LDE1IEBACiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjIxMiwgIlRoaW5rcGFkIFQ0NDAiLCBBTEMyOTJfRklYVVBfVFBUNDQwX0RPQ0spLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDIyMTQsICJUaGlua3BhZCBYMjQwIiwgQUxDMjkyX0ZJWFVQX1RQVDQ0MF9ET0NLKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHgyMjE1LCAiVGhpbmtwYWQiLCBBTEMyNjlfRklYVVBfTElNSVRfSU5UX01JQ19CT09TVCksCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4MjIyNiwgIlRoaW5rUGFkIFgyNTAiLCBBTEMyOTJfRklYVVBfVFBUNDQwX0RPQ0spLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDM5NzcsICJJZGVhUGFkIFMyMTAiLCBBTEMyODNfRklYVVBfSU5UX01JQyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4Mzk3OCwgIklkZWFQYWQgWTQxMFAiLCBBTEMyNjlfRklYVVBfTk9fU0hVVFVQKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHg1MDEzLCAiVGhpbmtwYWQiLCBBTEMyNjlfRklYVVBfTElNSVRfSU5UX01JQ19CT09TVCksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4NTAxYSwgIlRoaW5rcGFkIiwgQUxDMjgzX0ZJWFVQX0lOVF9NSUMpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDUwMWUsICJUaGlua3BhZCBMNDQwIiwgQUxDMjkyX0ZJWFVQX1RQVDQ0MF9ET0NLKSwKIAlTTkRfUENJX1FVSVJLKDB4MTdhYSwgMHg1MDI2LCAiVGhpbmtwYWQiLCBBTEMyNjlfRklYVVBfTElNSVRfSU5UX01JQ19CT09TVCksCisJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4NTAzNCwgIlRoaW5rcGFkIFQ0NTAiLCBBTEMyOTJfRklYVVBfVFBUNDQwX0RPQ0spLAorCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDUwMzYsICJUaGlua3BhZCBUNDUwcyIsIEFMQzI5Ml9GSVhVUF9UUFQ0NDBfRE9DSyksCiAJU05EX1BDSV9RVUlSSygweDE3YWEsIDB4NTEwOSwgIlRoaW5rcGFkIiwgQUxDMjY5X0ZJWFVQX0xJTUlUX0lOVF9NSUNfQk9PU1QpLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDNiZjgsICJRdWFudGEgRkwxIiwgQUxDMjY5X0ZJWFVQX1BDTV80NEspLAogCVNORF9QQ0lfUVVJUksoMHgxN2FhLCAweDllNTQsICJMRU5PVk8gTkIiLCBBTEMyNjlfRklYVVBfTEVOT1ZPX0VBUEQpLApAQCAtNTEzMSw2ICs1MjM4LDEzIEBACiAJezB4MWIsIDB4NDExMTExZjB9LCBcCiAJezB4MWUsIDB4NDExMTExZjB9CiAKKyNkZWZpbmUgQUxDMjg4X1NUQU5EQVJEX1BJTlMgXAorCXsweDE3LCAweDQxMTExMWYwfSwgXAorCXsweDE4LCAweDQxMTExMWYwfSwgXAorCXsweDE5LCAweDQxMTExMWYwfSwgXAorCXsweDFhLCAweDQxMTExMWYwfSwgXAorCXsweDFlLCAweDQxMTExMWYwfQorCiAjZGVmaW5lIEFMQzI5MF9TVEFOREFSRF9QSU5TIFwKIAl7MHgxMiwgMHg5OWEzMDEzMH0sIFwKIAl7MHgxMywgMHg0MDAwMDAwMH0sIFwKQEAgLTUyMTYsNiArNTMzMCwxNiBAQAogCQl7MHgxNywgMHg0MDAwMDAwMH0sCiAJCXsweDFkLCAweDQwNzAwMDAxfSwKIAkJezB4MjEsIDB4MDIyMTEwNTB9KSwKKwlTTkRfSERBX1BJTl9RVUlSSygweDEwZWMwMjU2LCAweDEwMjgsICJEZWxsIiwgQUxDMjU1X0ZJWFVQX0RFTEwxX01JQ19OT19QUkVTRU5DRSwKKwkJezB4MTIsIDB4OTBhNjAxNDB9LAorCQl7MHgxMywgMHg0MDAwMDAwMH0sCisJCXsweDE0LCAweDkwMTcwMTEwfSwKKwkJezB4MTksIDB4NDExMTExZjB9LAorCQl7MHgxYSwgMHg0MTExMTFmMH0sCisJCXsweDFiLCAweDQxMTExMWYwfSwKKwkJezB4MWQsIDB4NDA3MDAwMDF9LAorCQl7MHgxZSwgMHg0MTExMTFmMH0sCisJCXsweDIxLCAweDAyMjExMDIwfSksCiAJU05EX0hEQV9QSU5fUVVJUksoMHgxMGVjMDI4MCwgMHgxMDNjLCAiSFAiLCBBTEMyODBfRklYVVBfSFBfR1BJTzQsCiAJCXsweDEyLCAweDkwYTYwMTMwfSwKIAkJezB4MTMsIDB4NDAwMDAwMDB9LApAQCAtNTMxNiw2ICs1NDQwLDEzIEBACiAJCXsweDE5LCAweDAzYTExMDIwfSwKIAkJezB4MWQsIDB4NDBlMDAwMDF9LAogCQl7MHgyMSwgMHgwMzIxMTAxZn0pLAorCVNORF9IREFfUElOX1FVSVJLKDB4MTBlYzAyODgsIDB4MTAyOCwgIkRlbGwiLCBBTEMyODhfRklYVVBfREVMTF9YUFNfMTNfR1BJTzYsCisJCUFMQzI4OF9TVEFOREFSRF9QSU5TLAorCQl7MHgxMiwgMHg5MGE2MDEyMH0sCisJCXsweDEzLCAweDQwMDAwMDAwfSwKKwkJezB4MTQsIDB4OTAxNzAxMTB9LAorCQl7MHgxZCwgMHg0MDc2ODMyZH0sCisJCXsweDIxLCAweDAzMjExMDFmfSksCiAJU05EX0hEQV9QSU5fUVVJUksoMHgxMGVjMDI5MCwgMHgxMDNjLCAiSFAiLCBBTEMyNjlfRklYVVBfSFBfTVVURV9MRURfTUlDMSwKIAkJQUxDMjkwX1NUQU5EQVJEX1BJTlMsCiAJCXsweDE0LCAweDQxMTExMWYwfSwKQEAgLTU0NTYsNiArNTU4Nyw3IEBACiAKIAlzcGVjID0gY29kZWMtPnNwZWM7CiAJc3BlYy0+Z2VuLnNoYXJlZF9taWNfdnJlZl9waW4gPSAweDE4OworCWNvZGVjLT5wb3dlcl9zYXZlX25vZGUgPSAxOwogCiAJc25kX2hkYV9waWNrX2ZpeHVwKGNvZGVjLCBhbGMyNjlfZml4dXBfbW9kZWxzLAogCQkgICAgICAgYWxjMjY5X2ZpeHVwX3RibCwgYWxjMjY5X2ZpeHVwcyk7CkBAIC01NDY5LDcgKzU2MDEsNyBAQAogCWlmIChoYXNfY2RlZmluZV9iZWVwKGNvZGVjKSkKIAkJc3BlYy0+Z2VuLmJlZXBfbmlkID0gMHgwMTsKIAotCXN3aXRjaCAoY29kZWMtPnZlbmRvcl9pZCkgeworCXN3aXRjaCAoY29kZWMtPmNvcmUudmVuZG9yX2lkKSB7CiAJY2FzZSAweDEwZWMwMjY5OgogCQlzcGVjLT5jb2RlY192YXJpYW50ID0gQUxDMjY5X1RZUEVfQUxDMjY5VkE7CiAJCXN3aXRjaCAoYWxjX2dldF9jb2VmMChjb2RlYykgJiAweDAwZjApIHsKQEAgLTU1NTIsNiArNTY4NCw3IEBACiAJCXNldF9iZWVwX2FtcChzcGVjLCAweDBiLCAweDA0LCBIREFfSU5QVVQpOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IGFsY19wYXRjaF9vcHM7CisJY29kZWMtPnBhdGNoX29wcy5zdHJlYW1fcG0gPSBzbmRfaGRhX2dlbl9zdHJlYW1fcG07CiAjaWZkZWYgQ09ORklHX1BNCiAJY29kZWMtPnBhdGNoX29wcy5zdXNwZW5kID0gYWxjMjY5X3N1c3BlbmQ7CiAJY29kZWMtPnBhdGNoX29wcy5yZXN1bWUgPSBhbGMyNjlfcmVzdW1lOwpAQCAtNTgxMyw5ICs1OTQ2LDkgQEAKIAlzdGF0aWMgY29uc3QgaGRhX25pZF90IGFsYzY2Ml9zc2lkc1tdID0geyAweDE1LCAweDFiLCAweDE0LCAwIH07CiAJY29uc3QgaGRhX25pZF90ICpzc2lkczsKIAotCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTBlYzAyNzIgfHwgY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwNjYzIHx8Ci0JICAgIGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMGVjMDY2NSB8fCBjb2RlYy0+dmVuZG9yX2lkID09IDB4MTBlYzA2NzAgfHwKLQkgICAgY29kZWMtPnZlbmRvcl9pZCA9PSAweDEwZWMwNjcxKQorCWlmIChjb2RlYy0+Y29yZS52ZW5kb3JfaWQgPT0gMHgxMGVjMDI3MiB8fCBjb2RlYy0+Y29yZS52ZW5kb3JfaWQgPT0gMHgxMGVjMDY2MyB8fAorCSAgICBjb2RlYy0+Y29yZS52ZW5kb3JfaWQgPT0gMHgxMGVjMDY2NSB8fCBjb2RlYy0+Y29yZS52ZW5kb3JfaWQgPT0gMHgxMGVjMDY3MCB8fAorCSAgICBjb2RlYy0+Y29yZS52ZW5kb3JfaWQgPT0gMHgxMGVjMDY3MSkKIAkJc3NpZHMgPSBhbGM2NjNfc3NpZHM7CiAJZWxzZQogCQlzc2lkcyA9IGFsYzY2Ml9zc2lkczsKQEAgLTU4NTAsNyArNTk4Myw3IEBACiB7CiAJaWYgKGFjdGlvbiA9PSBIREFfRklYVVBfQUNUX0JVSUxEKSB7CiAJCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCQlzcGVjLT5nZW4ucGNtX3JlY1swXS5zdHJlYW1bMF0uY2htYXAgPSBhc3VzX3BjbV8yXzFfY2htYXBzOworCQlzcGVjLT5nZW4ucGNtX3JlY1swXS0+c3RyZWFtWzBdLmNobWFwID0gYXN1c19wY21fMl8xX2NobWFwczsKIAl9CiB9CiAKQEAgLTU4NjAsNyArNTk5Myw3IEBACiAJCQkJCSAgdW5zaWduZWQgaW50IHBvd2VyX3N0YXRlKQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWlmIChuaWQgPT0gY29kZWMtPmFmZyAmJiBwb3dlcl9zdGF0ZSA9PSBBQ19QV1JTVF9EMyAmJiBzcGVjLT5ncGlvX2xlZCkKKwlpZiAobmlkID09IGNvZGVjLT5jb3JlLmFmZyAmJiBwb3dlcl9zdGF0ZSA9PSBBQ19QV1JTVF9EMyAmJiBzcGVjLT5ncGlvX2xlZCkKIAkJcmV0dXJuIEFDX1BXUlNUX0QwOwogCXJldHVybiBwb3dlcl9zdGF0ZTsKIH0KQEAgLTYzNTgsNyArNjQ5MSw3IEBACiAKIAlhbGNfZml4X3BsbF9pbml0KGNvZGVjLCAweDIwLCAweDA0LCAxNSk7CiAKLQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKKwlzd2l0Y2ggKGNvZGVjLT5jb3JlLnZlbmRvcl9pZCkgewogCWNhc2UgMHgxMGVjMDY2ODoKIAkJc3BlYy0+aW5pdF9ob29rID0gYWxjNjY4X3Jlc3RvcmVfZGVmYXVsdF92YWx1ZTsKIAkJYnJlYWs7CkBAIC02Mzg4LDcgKzY1MjEsNyBAQAogCQlnb3RvIGVycm9yOwogCiAJaWYgKCFzcGVjLT5nZW4ubm9fYW5hbG9nICYmIHNwZWMtPmdlbi5iZWVwX25pZCkgewotCQlzd2l0Y2ggKGNvZGVjLT52ZW5kb3JfaWQpIHsKKwkJc3dpdGNoIChjb2RlYy0+Y29yZS52ZW5kb3JfaWQpIHsKIAkJY2FzZSAweDEwZWMwNjYyOgogCQkJc2V0X2JlZXBfYW1wKHNwZWMsIDB4MGIsIDB4MDUsIEhEQV9JTlBVVCk7CiAJCQlicmVhazsKQEAgLTY1MjEsMjAgKzY2NTQsOCBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWFsdGVrIEhELWF1ZGlvIGNvZGVjIik7CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldF9saXN0IHJlYWx0ZWtfbGlzdCA9IHsKK3N0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX2RyaXZlciByZWFsdGVrX2RyaXZlciA9IHsKIAkucHJlc2V0ID0gc25kX2hkYV9wcmVzZXRfcmVhbHRlaywKLQkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhdGNoX3JlYWx0ZWtfaW5pdCh2b2lkKQotewotCXJldHVybiBzbmRfaGRhX2FkZF9jb2RlY19wcmVzZXQoJnJlYWx0ZWtfbGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwYXRjaF9yZWFsdGVrX2V4aXQodm9pZCkKLXsKLQlzbmRfaGRhX2RlbGV0ZV9jb2RlY19wcmVzZXQoJnJlYWx0ZWtfbGlzdCk7Ci19Ci0KLW1vZHVsZV9pbml0KHBhdGNoX3JlYWx0ZWtfaW5pdCkKLW1vZHVsZV9leGl0KHBhdGNoX3JlYWx0ZWtfZXhpdCkKK21vZHVsZV9oZGFfY29kZWNfZHJpdmVyKHJlYWx0ZWtfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2kzMDU0LmMgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpMzA1NC5jCmluZGV4IDMyMDhhZDYuLjUxMDRiZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2kzMDU0LmMKKysrIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaTMwNTQuYwpAQCAtODMsNyArODMsNiBAQAogCiBzdHJ1Y3Qgc2kzMDU0X3NwZWMgewogCXVuc2lnbmVkIGludGVybmF0aW9uYWw7Ci0Jc3RydWN0IGhkYV9wY20gcGNtOwogfTsKIAogCkBAIC0xOTksMTUgKzE5OCwxNSBAQAogCiBzdGF0aWMgaW50IHNpMzA1NF9idWlsZF9wY21zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewotCXN0cnVjdCBzaTMwNTRfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBoZGFfcGNtICppbmZvID0gJnNwZWMtPnBjbTsKLQljb2RlYy0+bnVtX3BjbXMgPSAxOwotCWNvZGVjLT5wY21faW5mbyA9IGluZm87Ci0JaW5mby0+bmFtZSA9ICJTaTMwNTQgTW9kZW0iOworCXN0cnVjdCBoZGFfcGNtICppbmZvOworCisJaW5mbyA9IHNuZF9oZGFfY29kZWNfcGNtX25ldyhjb2RlYywgIlNpMzA1NCBNb2RlbSIpOworCWlmICghaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CiAJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdID0gc2kzMDU0X3BjbTsKIAlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXSAgPSBzaTMwNTRfcGNtOwotCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5uaWQgPSBjb2RlYy0+bWZnOwotCWluZm8tPnN0cmVhbVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLm5pZCA9IGNvZGVjLT5tZmc7CisJaW5mby0+c3RyZWFtW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLm5pZCA9IGNvZGVjLT5jb3JlLm1mZzsKKwlpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5uaWQgPSBjb2RlYy0+Y29yZS5tZmc7CiAJaW5mby0+cGNtX3R5cGUgPSBIREFfUENNX1RZUEVfTU9ERU07CiAJcmV0dXJuIDA7CiB9CkBAIC0yMjMsOCArMjIyLDEyIEBACiAJdW5zaWduZWQgd2FpdF9jb3VudDsKIAl1MTYgdmFsOwogCisJaWYgKHNuZF9oZGFjX3JlZ21hcF9hZGRfdmVuZG9yX3ZlcmIoJmNvZGVjLT5jb3JlLAorCQkJCQkgICAgU0kzMDU0X1ZFUkJfV1JJVEVfTk9ERSkpCisJCXJldHVybiAtRU5PTUVNOworCiAJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgQUNfTk9ERV9ST09ULCAwLCBBQ19WRVJCX1NFVF9DT0RFQ19SRVNFVCwgMCk7Ci0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPm1mZywgMCwgQUNfVkVSQl9TRVRfU1RSRUFNX0ZPUk1BVCwgMCk7CisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmNvcmUubWZnLCAwLCBBQ19WRVJCX1NFVF9TVFJFQU1fRk9STUFULCAwKTsKIAlTRVRfUkVHKGNvZGVjLCBTSTMwNTRfTElORV9SQVRFLCA5NjAwKTsKIAlTRVRfUkVHKGNvZGVjLCBTSTMwNTRfTElORV9MRVZFTCwgU0kzMDU0X0RUQUdfTUFTS3xTSTMwNTRfQVRBR19NQVNLKTsKIAlTRVRfUkVHKGNvZGVjLCBTSTMwNTRfRVhURU5ERURfTUlELCAwKTsKQEAgLTMxOSwyMCArMzIyLDggQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU2kzMDU0IEhELWF1ZGlvIG1vZGVtIGNvZGVjIik7CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldF9saXN0IHNpMzA1NF9saXN0ID0geworc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfZHJpdmVyIHNpMzA1NF9kcml2ZXIgPSB7CiAJLnByZXNldCA9IHNuZF9oZGFfcHJlc2V0X3NpMzA1NCwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhdGNoX3NpMzA1NF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHNuZF9oZGFfYWRkX2NvZGVjX3ByZXNldCgmc2kzMDU0X2xpc3QpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcGF0Y2hfc2kzMDU0X2V4aXQodm9pZCkKLXsKLQlzbmRfaGRhX2RlbGV0ZV9jb2RlY19wcmVzZXQoJnNpMzA1NF9saXN0KTsKLX0KLQotbW9kdWxlX2luaXQocGF0Y2hfc2kzMDU0X2luaXQpCi1tb2R1bGVfZXhpdChwYXRjaF9zaTMwNTRfZXhpdCkKK21vZHVsZV9oZGFfY29kZWNfZHJpdmVyKHNpMzA1NF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IDg3ZWZmMzEuLjQzYzk5Y2UgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTI5OSwzMiArMjk5LDMzIEBACiAJCQkgIHVuc2lnbmVkIGludCBkaXJfbWFzaywgdW5zaWduZWQgaW50IGRhdGEpCiB7CiAJdW5zaWduZWQgaW50IGdwaW9zdGF0ZSwgZ3Bpb21hc2ssIGdwaW9kaXI7CisJaGRhX25pZF90IGZnID0gY29kZWMtPmNvcmUuYWZnOwogCiAJY29kZWNfZGJnKGNvZGVjLCAiJXMgbXNrICV4IGRpciAleCBncGlvICV4XG4iLCBfX2Z1bmNfXywgbWFzaywgZGlyX21hc2ssIGRhdGEpOwogCi0JZ3Bpb3N0YXRlID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCWdwaW9zdGF0ZSA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgZmcsIDAsCiAJCQkJICAgICAgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwgMCk7CiAJZ3Bpb3N0YXRlID0gKGdwaW9zdGF0ZSAmIH5kaXJfbWFzaykgfCAoZGF0YSAmIGRpcl9tYXNrKTsKIAotCWdwaW9tYXNrID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCWdwaW9tYXNrID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBmZywgMCwKIAkJCQkgICAgICBBQ19WRVJCX0dFVF9HUElPX01BU0ssIDApOwogCWdwaW9tYXNrIHw9IG1hc2s7CiAKLQlncGlvZGlyID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCWdwaW9kaXIgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGZnLCAwLAogCQkJCSAgICAgQUNfVkVSQl9HRVRfR1BJT19ESVJFQ1RJT04sIDApOwogCWdwaW9kaXIgfD0gZGlyX21hc2s7CiAKIAkvKiBDb25maWd1cmUgR1BJT3ggYXMgQ01PUyAqLwotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIGNvZGVjLT5hZmcsIDAsIDB4N2U3LCAwKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBmZywgMCwgMHg3ZTcsIDApOwogCi0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBmZywgMCwKIAkJCSAgICBBQ19WRVJCX1NFVF9HUElPX01BU0ssIGdwaW9tYXNrKTsKLQlzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBmZywgMCwKIAkJCSAgIEFDX1ZFUkJfU0VUX0dQSU9fRElSRUNUSU9OLCBncGlvZGlyKTsgLyogc3luYyAqLwogCiAJbXNsZWVwKDEpOwogCi0Jc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCXNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgZmcsIDAsCiAJCQkgICBBQ19WRVJCX1NFVF9HUElPX0RBVEEsIGdwaW9zdGF0ZSk7IC8qIHN5bmMgKi8KIH0KIApAQCAtMzg3LDcgKzM4OCw3IEBACiAJCQkJCSAgICAgICBoZGFfbmlkX3QgbmlkLAogCQkJCQkgICAgICAgdW5zaWduZWQgaW50IHBvd2VyX3N0YXRlKQogewotCWlmIChuaWQgPT0gY29kZWMtPmFmZyAmJiBwb3dlcl9zdGF0ZSA9PSBBQ19QV1JTVF9EMykKKwlpZiAobmlkID09IGNvZGVjLT5jb3JlLmFmZyAmJiBwb3dlcl9zdGF0ZSA9PSBBQ19QV1JTVF9EMykKIAkJcmV0dXJuIEFDX1BXUlNUX0QxOwogCXJldHVybiBzbmRfaGRhX2dlbl9wYXRoX3Bvd2VyX2ZpbHRlcihjb2RlYywgbmlkLCBwb3dlcl9zdGF0ZSk7CiB9CkBAIC00MzIsNyArNDMzLDcgQEAKIAogCWlmIChzcGVjLT5ncGlvX211dGUpCiAJCXNwZWMtPmdlbi5tYXN0ZXJfbXV0ZSA9Ci0JCQkhKHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgY29kZWMtPmFmZywgMCwKKwkJCSEoc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIDAsCiAJCQkJQUNfVkVSQl9HRVRfR1BJT19EQVRBLCAwKSAmIHNwZWMtPmdwaW9fbXV0ZSk7CiAKIAlzbmRfaGRhX2dlbl91cGRhdGVfb3V0cHV0cyhjb2RlYyk7CkBAIC00NzYsNyArNDc3LDcgQEAKIAlpZiAodmFsICE9IHNwZWMtPnBvd2VyX21hcF9iaXRzKSB7CiAJCXNwZWMtPnBvd2VyX21hcF9iaXRzID0gdmFsOwogCQlpZiAoZG9fd3JpdGUpCi0JCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmNvcmUuYWZnLCAwLAogCQkJCQkgICAgQUNfVkVSQl9JRFRfU0VUX1BPV0VSX01BUCwgdmFsKTsKIAl9CiB9CkBAIC01MDgsNyArNTA5LDggQEAKIAkJCQkgICAgICBmYWxzZSk7CiAJfQogCi0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwgQUNfVkVSQl9JRFRfU0VUX1BPV0VSX01BUCwKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIDAsCisJCQkgICAgQUNfVkVSQl9JRFRfU0VUX1BPV0VSX01BUCwKIAkJCSAgICBzcGVjLT5wb3dlcl9tYXBfYml0cyk7CiB9CiAKQEAgLTUxNywxMCArNTE5LDEwIEBACiB7CiAJdW5zaWduZWQgaW50IGRhdGE7CiAKLQlkYXRhID0gc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCWRhdGEgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5jb3JlLmFmZywgMCwKIAkJCQkgIEFDX1ZFUkJfR0VUX0dQSU9fREFUQSwgMCk7CiAJLyogdG9nZ2xlIFZSRUYgc3RhdGUgYmFzZWQgb24gR1BJT3ggc3RhdHVzICovCi0Jc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmFmZywgMCwgMHg3ZTAsCisJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgY29kZWMtPmNvcmUuYWZnLCAwLCAweDdlMCwKIAkJCSAgICAhIShkYXRhICYgKDEgPDwgZXZlbnQtPnByaXZhdGVfZGF0YSkpKTsKIH0KIApAQCAtNjIyLDcgKzYyNCw3IEBACiAJLyogT25seSByZXR1cm4gdGhlIGJpdHMgZGVmaW5lZCBieSB0aGUgc2hpZnQgdmFsdWUgb2YgdGhlCiAJICogZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBtYXNrCiAJICovCi0JZGFjX21vZGUgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsCisJZGFjX21vZGUgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5jb3JlLmFmZywgMCwKIAkJCQkgICAgICBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSAmIDB4RkZGRiwgMHgwKTsKIAlkYWNfbW9kZSA+Pj0gc3BlYy0+YWxvb3BiYWNrX3NoaWZ0OwogCkBAIC02MzQsNyArNjM2LDcgQEAKIAkJZGFjX21vZGUgJj0gfmlkeF92YWw7CiAJfQogCi0Jc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgY29kZWMtPmFmZywgMCwKKwlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIDAsCiAJCWtjb250cm9sLT5wcml2YXRlX3ZhbHVlID4+IDE2LCBkYWNfbW9kZSk7CiAKIAlyZXR1cm4gMTsKQEAgLTY1OCwxMSArNjYwLDExIEBACiAvKiBjaGVjayB3aGV0aGVyIGl0J3MgYSBIUCBsYXB0b3Agd2l0aCBhIGRvY2tpbmcgcG9ydCAqLwogc3RhdGljIGJvb2wgaHBfYm5iMjAxMV93aXRoX2RvY2soc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0JaWYgKGNvZGVjLT52ZW5kb3JfaWQgIT0gMHgxMTFkNzYwNSAmJgotCSAgICBjb2RlYy0+dmVuZG9yX2lkICE9IDB4MTExZDc2ZDEpCisJaWYgKGNvZGVjLT5jb3JlLnZlbmRvcl9pZCAhPSAweDExMWQ3NjA1ICYmCisJICAgIGNvZGVjLT5jb3JlLnZlbmRvcl9pZCAhPSAweDExMWQ3NmQxKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlzd2l0Y2ggKGNvZGVjLT5zdWJzeXN0ZW1faWQpIHsKKwlzd2l0Y2ggKGNvZGVjLT5jb3JlLnN1YnN5c3RlbV9pZCkgewogCWNhc2UgMHgxMDNjMTYxODoKIAljYXNlIDB4MTAzYzE2MTk6CiAJY2FzZSAweDEwM2MxNjFhOgpAQCAtNzMzLDcgKzczNSw3IEBACiAJaWYgKHNwZWMtPmdwaW9fbGVkKQogCQlyZXR1cm47CiAKLQlncGlvID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLCBBQ19QQVJfR1BJT19DQVApOworCWdwaW8gPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIGNvZGVjLT5jb3JlLmFmZywgQUNfUEFSX0dQSU9fQ0FQKTsKIAlncGlvICY9IEFDX0dQSU9fSU9fQ09VTlQ7CiAJaWYgKGdwaW8gPiAzKQogCQlzcGVjLT5ncGlvX2xlZCA9IDB4MDg7IC8qIEdQSU8gMyAqLwpAQCAtNzc3LDcgKzc3OSw3IEBACiAJCQkgICAmc3BlYy0+Z3Bpb19sZWRfcG9sYXJpdHksCiAJCQkgICAmc3BlYy0+Z3Bpb19sZWQpID09IDIpIHsKIAkJCXVuc2lnbmVkIGludCBtYXhfZ3BpbzsKLQkJCW1heF9ncGlvID0gc25kX2hkYV9wYXJhbV9yZWFkKGNvZGVjLCBjb2RlYy0+YWZnLAorCQkJbWF4X2dwaW8gPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIGNvZGVjLT5jb3JlLmFmZywKIAkJCQkJCSAgICAgIEFDX1BBUl9HUElPX0NBUCk7CiAJCQltYXhfZ3BpbyAmPSBBQ19HUElPX0lPX0NPVU5UOwogCQkJaWYgKHNwZWMtPmdwaW9fbGVkIDwgbWF4X2dwaW8pCkBAIC04MDcsNyArODA5LDcgQEAKIAkgKiB3ZSBzdGF0aWNhbGx5IHNldCB0aGUgR1BJTyAtIGlmIG5vdCBhIEItc2VyaWVzIHN5c3RlbQogCSAqIGFuZCBkZWZhdWx0IHBvbGFyaXR5IGlzIHByb3ZpZGVkCiAJICovCi0JaWYgKCFocF9ibGlrZV9zeXN0ZW0oY29kZWMtPnN1YnN5c3RlbV9pZCkgJiYKKwlpZiAoIWhwX2JsaWtlX3N5c3RlbShjb2RlYy0+Y29yZS5zdWJzeXN0ZW1faWQpICYmCiAJICAgIChkZWZhdWx0X3BvbGFyaXR5ID09IDAgfHwgZGVmYXVsdF9wb2xhcml0eSA9PSAxKSkgewogCQlzZXRfaHBfbGVkX2dwaW8oY29kZWMpOwogCQlzcGVjLT5ncGlvX2xlZF9wb2xhcml0eSA9IGRlZmF1bHRfcG9sYXJpdHk7CkBAIC0xMDQ4LDEyICsxMDUwLDkgQEAKIAl7fQogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBoZGFfdmVyYiBzdGFjOTJoZDcxYnh4X3VubXV0ZV9jb3JlX2luaXRbXSA9IHsKK3N0YXRpYyBjb25zdCBoZGFfbmlkX3Qgc3RhYzkyaGQ3MWJ4eF91bm11dGVfbmlkc1tdID0gewogCS8qIHVubXV0ZSByaWdodCBhbmQgbGVmdCBjaGFubmVscyBmb3Igbm9kZXMgMHgwZiwgMHhhLCAweDBkICovCi0JeyAweDBmLCBBQ19WRVJCX1NFVF9BTVBfR0FJTl9NVVRFLCBBTVBfSU5fVU5NVVRFKDApfSwKLQl7IDB4MGEsIEFDX1ZFUkJfU0VUX0FNUF9HQUlOX01VVEUsIEFNUF9JTl9VTk1VVEUoMCl9LAotCXsgMHgwZCwgQUNfVkVSQl9TRVRfQU1QX0dBSU5fTVVURSwgQU1QX0lOX1VOTVVURSgwKX0sCi0Je30KKwkweDBmLCAweDBhLCAweDBkLCAwCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGhkYV92ZXJiIHN0YWM5MjV4X2NvcmVfaW5pdFtdID0gewpAQCAtMjEzMiw4ICsyMTMxLDEwIEBACiAKIAlpZiAoYWN0aW9uID09IEhEQV9GSVhVUF9BQ1RfUFJFX1BST0JFKSB7CiAJCXNwZWMtPm1pY19tdXRlX2xlZF9ncGlvID0gMHgwODsgLyogR1BJTzMgKi8KKyNpZmRlZiBDT05GSUdfUE0KIAkJLyogcmVzZXR0aW5nIGNvbnRyb2xsZXIgY2xlYXJzIEdQSU8sIHNvIHdlIG5lZWQgdG8ga2VlcCBvbiAqLwotCQljb2RlYy0+YnVzLT5wb3dlcl9rZWVwX2xpbmtfb24gPSAxOworCQljb2RlYy0+Y29yZS5wb3dlcl9jYXBzICY9IH5BQ19QV1JTVF9DTEtTVE9QOworI2VuZGlmCiAJfQogfQogCkBAIC0zMDI5LDkgKzMwMzAsOSBAQAogCQlyZXR1cm47CiAKIAkvKiBFbmFibGUgVlJFRiBwb3dlciBzYXZpbmcgb24gR1BJTzEgZGV0ZWN0ICovCi0Jc25kX2hkYV9jb2RlY193cml0ZV9jYWNoZShjb2RlYywgY29kZWMtPmFmZywgMCwKKwlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIDAsCiAJCQkJICBBQ19WRVJCX1NFVF9HUElPX1VOU09MSUNJVEVEX1JTUF9NQVNLLCAweDAyKTsKLQlqYWNrID0gc25kX2hkYV9qYWNrX2RldGVjdF9lbmFibGVfY2FsbGJhY2soY29kZWMsIGNvZGVjLT5hZmcsCisJamFjayA9IHNuZF9oZGFfamFja19kZXRlY3RfZW5hYmxlX2NhbGxiYWNrKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsCiAJCQkJCQkgICBzdGFjX3ZyZWZfZXZlbnQpOwogCWlmICghSVNfRVJSKGphY2spKQogCQlqYWNrLT5wcml2YXRlX2RhdGEgPSAweDAyOwpAQCAtMzA5MSw3ICszMDkyLDcgQEAKIAlpZiAoYWN0aW9uICE9IEhEQV9GSVhVUF9BQ1RfUFJFX1BST0JFKQogCQlyZXR1cm47CiAKLQlpZiAoaHBfYmxpa2Vfc3lzdGVtKGNvZGVjLT5zdWJzeXN0ZW1faWQpKSB7CisJaWYgKGhwX2JsaWtlX3N5c3RlbShjb2RlYy0+Y29yZS5zdWJzeXN0ZW1faWQpKSB7CiAJCXVuc2lnbmVkIGludCBwaW5fY2ZnID0gc25kX2hkYV9jb2RlY19nZXRfcGluY2ZnKGNvZGVjLCAweDBmKTsKIAkJaWYgKGdldF9kZWZjZmdfZGV2aWNlKHBpbl9jZmcpID09IEFDX0pBQ0tfTElORV9PVVQgfHwKIAkJCWdldF9kZWZjZmdfZGV2aWNlKHBpbl9jZmcpID09IEFDX0pBQ0tfU1BFQUtFUiAgfHwKQEAgLTM3OTAsNyArMzc5MSw3IEBACiAJaWYgKGFjdGlvbiAhPSBIREFfRklYVVBfQUNUX1BSRV9QUk9CRSkKIAkJcmV0dXJuOwogCi0JaWYgKGNvZGVjLT5zdWJzeXN0ZW1faWQgIT0gMHgxMDI4MDIyZikgeworCWlmIChjb2RlYy0+Y29yZS5zdWJzeXN0ZW1faWQgIT0gMHgxMDI4MDIyZikgewogCQkvKiBHUElPMiBIaWdoID0gRW5hYmxlIEVBUEQgKi8KIAkJc3BlYy0+ZWFwZF9tYXNrID0gc3BlYy0+Z3Bpb19tYXNrID0gMHgwNDsKIAkJc3BlYy0+Z3Bpb19kaXIgPSBzcGVjLT5ncGlvX2RhdGEgPSAweDA0OwpAQCAtNDA1MSw5ICs0MDUyLDkgQEAKIAkJc25kX2hkYV9hcHBseV9waW5jZmdzKGNvZGVjLCBkZWxsXzkyMDVfbTQzX3Bpbl9jb25maWdzKTsKIAogCQkvKiBFbmFibGUgdW5zb2wgcmVzcG9uc2UgZm9yIEdQSU80L0RvY2sgSFAgY29ubmVjdGlvbiAqLwotCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQlzbmRfaGRhX2NvZGVjX3dyaXRlX2NhY2hlKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIDAsCiAJCQlBQ19WRVJCX1NFVF9HUElPX1VOU09MSUNJVEVEX1JTUF9NQVNLLCAweDEwKTsKLQkJamFjayA9IHNuZF9oZGFfamFja19kZXRlY3RfZW5hYmxlX2NhbGxiYWNrKGNvZGVjLCBjb2RlYy0+YWZnLAorCQlqYWNrID0gc25kX2hkYV9qYWNrX2RldGVjdF9lbmFibGVfY2FsbGJhY2soY29kZWMsIGNvZGVjLT5jb3JlLmFmZywKIAkJCQkJCQkgICBzdGFjX3ZyZWZfZXZlbnQpOwogCQlpZiAoIUlTX0VSUihqYWNrKSkKIAkJCWphY2stPnByaXZhdGVfZGF0YSA9IDB4MDE7CkBAIC00MjIzLDYgKzQyMjQsMTIgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAorCWlmIChzcGVjLT52cmVmX211dGVfbGVkX25pZCkgeworCQllcnIgPSBzbmRfaGRhX2dlbl9maXhfcGluX3Bvd2VyKGNvZGVjLCBzcGVjLT52cmVmX211dGVfbGVkX25pZCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKIAkvKiBzZXR1cCBhbmFsb2cgYmVlcCBjb250cm9scyAqLwogCWlmIChzcGVjLT5hbmFiZWVwX25pZCA+IDApIHsKIAkJZXJyID0gc3RhY19hdXRvX2NyZWF0ZV9iZWVwX2N0bHMoY29kZWMsCkBAIC00MjU5LDYgKzQyNjYsMTAgQEAKIAogCWlmIChzcGVjLT5hbG9vcGJhY2tfY3RsICYmCiAJICAgIHNuZF9oZGFfZ2V0X2Jvb2xfaGludChjb2RlYywgImxvb3BiYWNrIikgPT0gMSkgeworCQl1bnNpZ25lZCBpbnQgd3JfdmVyYiA9CisJCQlzcGVjLT5hbG9vcGJhY2tfY3RsLT5wcml2YXRlX3ZhbHVlID4+IDE2OworCQlpZiAoc25kX2hkYWNfcmVnbWFwX2FkZF92ZW5kb3JfdmVyYigmY29kZWMtPmNvcmUsIHdyX3ZlcmIpKQorCQkJcmV0dXJuIC1FTk9NRU07CiAJCWlmICghc25kX2hkYV9nZW5fYWRkX2tjdGwoJnNwZWMtPmdlbiwgTlVMTCwgc3BlYy0+YWxvb3BiYWNrX2N0bCkpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC00Mjk0LDcgKzQzMDUsNyBAQAogCiAJLyogc3luYyB0aGUgcG93ZXItbWFwICovCiAJaWYgKHNwZWMtPm51bV9wd3JzKQotCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLAorCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIDAsCiAJCQkJICAgIEFDX1ZFUkJfSURUX1NFVF9QT1dFUl9NQVAsCiAJCQkJICAgIHNwZWMtPnBvd2VyX21hcF9iaXRzKTsKIApAQCAtNDMzMCw3ICs0MzQxLDcgQEAKIHN0YXRpYyB2b2lkIHN0YWM5MmhkX3Byb2NfaG9vayhzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIsCiAJCQkgICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCiB7Ci0JaWYgKG5pZCA9PSBjb2RlYy0+YWZnKQorCWlmIChuaWQgPT0gY29kZWMtPmNvcmUuYWZnKQogCQlzbmRfaXByaW50ZihidWZmZXIsICJQb3dlci1NYXA6IDB4JTAyeFxuIiwgCiAJCQkgICAgc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCBuaWQsIDAsCiAJCQkJCSAgICAgICBBQ19WRVJCX0lEVF9HRVRfUE9XRVJfTUFQLCAwKSk7CkBAIC00MzQxLDcgKzQzNTIsNyBAQAogCQkJCSAgdW5zaWduZWQgaW50IHZlcmIpCiB7CiAJc25kX2lwcmludGYoYnVmZmVyLCAiQW5hbG9nIExvb3BiYWNrOiAweCUwMnhcbiIsCi0JCSAgICBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsIDAsIHZlcmIsIDApKTsKKwkJICAgIHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgY29kZWMtPmNvcmUuYWZnLCAwLCB2ZXJiLCAwKSk7CiB9CiAKIC8qIHN0YWM5MmhkNzFieHgsIHN0YWM5MmhkNzN4eCAqLwpAQCAtNDM0OSwyMSArNDM2MCwyMSBAQAogCQkJCSBzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IG5pZCkKIHsKIAlzdGFjOTJoZF9wcm9jX2hvb2soYnVmZmVyLCBjb2RlYywgbmlkKTsKLQlpZiAobmlkID09IGNvZGVjLT5hZmcpCisJaWYgKG5pZCA9PSBjb2RlYy0+Y29yZS5hZmcpCiAJCWFuYWxvZ19sb29wX3Byb2NfaG9vayhidWZmZXIsIGNvZGVjLCAweGZhMCk7CiB9CiAKIHN0YXRpYyB2b2lkIHN0YWM5MjA1X3Byb2NfaG9vayhzdHJ1Y3Qgc25kX2luZm9fYnVmZmVyICpidWZmZXIsCiAJCQkgICAgICAgc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQpCiB7Ci0JaWYgKG5pZCA9PSBjb2RlYy0+YWZnKQorCWlmIChuaWQgPT0gY29kZWMtPmNvcmUuYWZnKQogCQlhbmFsb2dfbG9vcF9wcm9jX2hvb2soYnVmZmVyLCBjb2RlYywgMHhmZTApOwogfQogCiBzdGF0aWMgdm9pZCBzdGFjOTI3eF9wcm9jX2hvb2soc3RydWN0IHNuZF9pbmZvX2J1ZmZlciAqYnVmZmVyLAogCQkJICAgICAgIHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQogewotCWlmIChuaWQgPT0gY29kZWMtPmFmZykKKwlpZiAobmlkID09IGNvZGVjLT5jb3JlLmFmZykKIAkJYW5hbG9nX2xvb3BfcHJvY19ob29rKGJ1ZmZlciwgY29kZWMsIDB4ZmViKTsKIH0KICNlbHNlCkBAIC00MzkyLDYgKzQ0MDMsNyBAQAogI2lmZGVmIENPTkZJR19QTQogCS5zdXNwZW5kID0gc3RhY19zdXNwZW5kLAogI2VuZGlmCisJLnN0cmVhbV9wbSA9IHNuZF9oZGFfZ2VuX3N0cmVhbV9wbSwKIAkucmVib290X25vdGlmeSA9IHN0YWNfc2h1dHVwLAogfTsKIApAQCAtNDQ4NSw2ICs0NDk3LDcgQEAKIAkJcmV0dXJuIGVycjsKIAogCXNwZWMgPSBjb2RlYy0+c3BlYzsKKwljb2RlYy0+cG93ZXJfc2F2ZV9ub2RlID0gMTsKIAlzcGVjLT5saW5lYXJfdG9uZV9iZWVwID0gMDsKIAlzcGVjLT5nZW4ubWl4ZXJfbmlkID0gMHgxZDsKIAlzcGVjLT5oYXZlX3NwZGlmX211eCA9IDE7CkBAIC00NTg3LDkgKzQ2MDAsMTEgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWNvZGVjLT5lcHNzID0gMDsgLyogbG9uZ2VyIGRlbGF5IG5lZWRlZCBmb3IgRDMgKi8KKwkvKiBsb25nZXIgZGVsYXkgbmVlZGVkIGZvciBEMyAqLworCWNvZGVjLT5jb3JlLnBvd2VyX2NhcHMgJj0gfkFDX1BXUlNUX0VQU1M7CiAKIAlzcGVjID0gY29kZWMtPnNwZWM7CisJY29kZWMtPnBvd2VyX3NhdmVfbm9kZSA9IDE7CiAJc3BlYy0+bGluZWFyX3RvbmVfYmVlcCA9IDA7CiAJc3BlYy0+Z2VuLm93bl9lYXBkX2N0bCA9IDE7CiAJc3BlYy0+Z2VuLnBvd2VyX2Rvd25fdW51c2VkID0gMTsKQEAgLTQ2MzYsOSArNDY1MSwxMSBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JY29kZWMtPmVwc3MgPSAwOyAvKiBsb25nZXIgZGVsYXkgbmVlZGVkIGZvciBEMyAqLworCS8qIGxvbmdlciBkZWxheSBuZWVkZWQgZm9yIEQzICovCisJY29kZWMtPmNvcmUucG93ZXJfY2FwcyAmPSB+QUNfUFdSU1RfRVBTUzsKIAogCXNwZWMgPSBjb2RlYy0+c3BlYzsKKwljb2RlYy0+cG93ZXJfc2F2ZV9ub2RlID0gMTsKIAlzcGVjLT5saW5lYXJfdG9uZV9iZWVwID0gMDsKIAlzcGVjLT5nZW4ub3duX2VhcGRfY3RsID0gMTsKIAlzcGVjLT5nZW4ucG93ZXJfZG93bl91bnVzZWQgPSAxOwpAQCAtNDY3Miw3ICs0Njg5LDcgQEAKIHN0YXRpYyBpbnQgcGF0Y2hfc3RhYzkyaGQ3MWJ4eChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYzsKLQljb25zdCBzdHJ1Y3QgaGRhX3ZlcmIgKnVubXV0ZV9pbml0ID0gc3RhYzkyaGQ3MWJ4eF91bm11dGVfY29yZV9pbml0OworCWNvbnN0IGhkYV9uaWRfdCAqdW5tdXRlX25pZHMgPSBzdGFjOTJoZDcxYnh4X3VubXV0ZV9uaWRzOwogCWludCBlcnI7CiAKIAllcnIgPSBhbGxvY19zdGFjX3NwZWMoY29kZWMpOwpAQCAtNDY4MCw2ICs0Njk3LDcgQEAKIAkJcmV0dXJuIGVycjsKIAogCXNwZWMgPSBjb2RlYy0+c3BlYzsKKwljb2RlYy0+cG93ZXJfc2F2ZV9ub2RlID0gMTsKIAlzcGVjLT5saW5lYXJfdG9uZV9iZWVwID0gMDsKIAlzcGVjLT5nZW4ub3duX2VhcGRfY3RsID0gMTsKIAlzcGVjLT5nZW4ucG93ZXJfZG93bl91bnVzZWQgPSAxOwpAQCAtNDY5MywyMyArNDcxMSwyMyBAQAogCXNwZWMtPmdwaW9fZGlyID0gMHgwMTsKIAlzcGVjLT5ncGlvX2RhdGEgPSAweDAxOwogCi0Jc3dpdGNoIChjb2RlYy0+dmVuZG9yX2lkKSB7CisJc3dpdGNoIChjb2RlYy0+Y29yZS52ZW5kb3JfaWQpIHsKIAljYXNlIDB4MTExZDc2YjY6IC8qIDQgUG9ydCB3aXRob3V0IEFuYWxvZyBNaXhlciAqLwogCWNhc2UgMHgxMTFkNzZiNzoKLQkJdW5tdXRlX2luaXQrKzsKKwkJdW5tdXRlX25pZHMrKzsKIAkJYnJlYWs7CiAJY2FzZSAweDExMWQ3NjA4OiAvKiA1IFBvcnQgd2l0aCBBbmFsb2cgTWl4ZXIgKi8KLQkJaWYgKChjb2RlYy0+cmV2aXNpb25faWQgJiAweGYpID09IDAgfHwKLQkJICAgIChjb2RlYy0+cmV2aXNpb25faWQgJiAweGYpID09IDEpCisJCWlmICgoY29kZWMtPmNvcmUucmV2aXNpb25faWQgJiAweGYpID09IDAgfHwKKwkJICAgIChjb2RlYy0+Y29yZS5yZXZpc2lvbl9pZCAmIDB4ZikgPT0gMSkKIAkJCXNwZWMtPnN0cmVhbV9kZWxheSA9IDQwOyAvKiA0MCBtaWxsaXNlY29uZHMgKi8KIAogCQkvKiBkaXNhYmxlIFZTVyAqLwotCQl1bm11dGVfaW5pdCsrOworCQl1bm11dGVfbmlkcysrOwogCQlzbmRfaGRhX2NvZGVjX3NldF9waW5jZmcoY29kZWMsIDB4MGYsIDB4NDBmMDAwZjApOwogCQlzbmRfaGRhX2NvZGVjX3NldF9waW5jZmcoY29kZWMsIDB4MTksIDB4NDBmMDAwZjMpOwogCQlicmVhazsKIAljYXNlIDB4MTExZDc2MDM6IC8qIDYgUG9ydCB3aXRoIEFuYWxvZyBNaXhlciAqLwotCQlpZiAoKGNvZGVjLT5yZXZpc2lvbl9pZCAmIDB4ZikgPT0gMSkKKwkJaWYgKChjb2RlYy0+Y29yZS5yZXZpc2lvbl9pZCAmIDB4ZikgPT0gMSkKIAkJCXNwZWMtPnN0cmVhbV9kZWxheSA9IDQwOyAvKiA0MCBtaWxsaXNlY29uZHMgKi8KIAogCQlicmVhazsKQEAgLTQ3MTgsOCArNDczNiwxMiBAQAogCWlmIChnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIDB4MjgpKSA9PSBBQ19XSURfVk9MX0tOQikKIAkJc25kX2hkYV9hZGRfdmVyYnMoY29kZWMsIHN0YWM5MmhkNzFieHhfY29yZV9pbml0KTsKIAotCWlmIChnZXRfd2NhcHMoY29kZWMsIDB4YSkgJiBBQ19XQ0FQX0lOX0FNUCkKLQkJc25kX2hkYV9zZXF1ZW5jZV93cml0ZV9jYWNoZShjb2RlYywgdW5tdXRlX2luaXQpOworCWlmIChnZXRfd2NhcHMoY29kZWMsIDB4YSkgJiBBQ19XQ0FQX0lOX0FNUCkgeworCQljb25zdCBoZGFfbmlkX3QgKnA7CisJCWZvciAocCA9IHVubXV0ZV9uaWRzOyAqcDsgcCsrKQorCQkJc25kX2hkYV9jb2RlY19hbXBfaW5pdF9zdGVyZW8oY29kZWMsICpwLCBIREFfSU5QVVQsIDAsCisJCQkJCQkgICAgICAweGZmLCAweDAwKTsKKwl9CiAKIAlzcGVjLT5hbG9vcGJhY2tfY3RsID0gJnN0YWM5MmhkNzFieHhfbG9vcGJhY2s7CiAJc3BlYy0+YWxvb3BiYWNrX21hc2sgPSAweDUwOwpAQCAtNTA5MSwyMCArNTExMyw4IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIklEVC9TaWdtYXRlbCBIRC1hdWRpbyBjb2RlYyIpOwogCi1zdGF0aWMgc3RydWN0IGhkYV9jb2RlY19wcmVzZXRfbGlzdCBzaWdtYXRlbF9saXN0ID0geworc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfZHJpdmVyIHNpZ21hdGVsX2RyaXZlciA9IHsKIAkucHJlc2V0ID0gc25kX2hkYV9wcmVzZXRfc2lnbWF0ZWwsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBwYXRjaF9zaWdtYXRlbF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHNuZF9oZGFfYWRkX2NvZGVjX3ByZXNldCgmc2lnbWF0ZWxfbGlzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwYXRjaF9zaWdtYXRlbF9leGl0KHZvaWQpCi17Ci0Jc25kX2hkYV9kZWxldGVfY29kZWNfcHJlc2V0KCZzaWdtYXRlbF9saXN0KTsKLX0KLQotbW9kdWxlX2luaXQocGF0Y2hfc2lnbWF0ZWxfaW5pdCkKLW1vZHVsZV9leGl0KHBhdGNoX3NpZ21hdGVsX2V4aXQpCittb2R1bGVfaGRhX2NvZGVjX2RyaXZlcihzaWdtYXRlbF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfdmlhLmMKaW5kZXggM2RlNmQzZC4uMzFhOTVjYyAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9wYXRjaF92aWEuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3ZpYS5jCkBAIC05OSw3ICs5OSw2IEBACiAKIAkvKiBIUCBtb2RlIHNvdXJjZSAqLwogCXVuc2lnbmVkIGludCBkbWljX2VuYWJsZWQ7Ci0JdW5zaWduZWQgaW50IG5vX3Bpbl9wb3dlcl9jdGw7CiAJZW51bSBWSUFfSERBX0NPREVDIGNvZGVjX3R5cGU7CiAKIAkvKiBhbmFsb2cgbG93LXBvd2VyIGNvbnRyb2wgKi8KQEAgLTEwOSw4ICsxMDgsNyBAQAogCWludCBocF93b3JrX2FjdGl2ZTsKIAlpbnQgdnQxNzA4X2phY2tfZGV0ZWN0OwogCi0Jdm9pZCAoKnNldF93aWRnZXRzX3Bvd2VyX3N0YXRlKShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7Ci0JdW5zaWduZWQgaW50IGRhY19zdHJlYW1fdGFnWzRdOworCXVuc2lnbmVkIGludCBiZWVwX2FtcDsKIH07CiAKIHN0YXRpYyBlbnVtIFZJQV9IREFfQ09ERUMgZ2V0X2NvZGVjX3R5cGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpOwpAQCAtMTMzLDE3ICsxMzEsMTggQEAKIAkvKiBWVDE3MDhCQ0UgJiBWVDE3MDhTIGFyZSBhbG1vc3Qgc2FtZSAqLwogCWlmIChzcGVjLT5jb2RlY190eXBlID09IFZUMTcwOEJDRSkKIAkJc3BlYy0+Y29kZWNfdHlwZSA9IFZUMTcwOFM7Ci0Jc3BlYy0+bm9fcGluX3Bvd2VyX2N0bCA9IDE7CiAJc3BlYy0+Z2VuLmluZGVwX2hwID0gMTsKIAlzcGVjLT5nZW4ua2VlcF9lYXBkX29uID0gMTsKIAlzcGVjLT5nZW4ucGNtX3BsYXliYWNrX2hvb2sgPSB2aWFfcGxheWJhY2tfcGNtX2hvb2s7CiAJc3BlYy0+Z2VuLmFkZF9zdGVyZW9fbWl4X2lucHV0ID0gSERBX0hJTlRfU1RFUkVPX01JWF9BVVRPOworCWNvZGVjLT5wb3dlcl9zYXZlX25vZGUgPSAxOworCXNwZWMtPmdlbi5wb3dlcl9kb3duX3VudXNlZCA9IDE7CiAJcmV0dXJuIHNwZWM7CiB9CiAKIHN0YXRpYyBlbnVtIFZJQV9IREFfQ09ERUMgZ2V0X2NvZGVjX3R5cGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7Ci0JdTMyIHZlbmRvcl9pZCA9IGNvZGVjLT52ZW5kb3JfaWQ7CisJdTMyIHZlbmRvcl9pZCA9IGNvZGVjLT5jb3JlLnZlbmRvcl9pZDsKIAl1MTYgdmVuX2lkID0gdmVuZG9yX2lkID4+IDE2OwogCXUxNiBkZXZfaWQgPSB2ZW5kb3JfaWQgJiAweGZmZmY7CiAJZW51bSBWSUFfSERBX0NPREVDIGNvZGVjX3R5cGU7CkBAIC0yMjIsOTggKzIyMSwxMyBAQAogCQlpZiAoIXNwZWMtPmhwX3dvcmtfYWN0aXZlKSB7CiAJCQljb2RlYy0+amFja3BvbGxfaW50ZXJ2YWwgPSBtc2Vjc190b19qaWZmaWVzKDEwMCk7CiAJCQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCAweDEsIDAsIDB4ZjgxLCAwKTsKLQkJCXF1ZXVlX2RlbGF5ZWRfd29yayhjb2RlYy0+YnVzLT53b3JrcSwKLQkJCQkJICAgJmNvZGVjLT5qYWNrcG9sbF93b3JrLCAwKTsKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29kZWMtPmphY2twb2xsX3dvcmssIDApOwogCQkJc3BlYy0+aHBfd29ya19hY3RpdmUgPSB0cnVlOwogCQl9CiAJfSBlbHNlIGlmICghaHBfZGV0ZWN0X3dpdGhfYWEoY29kZWMpKQogCQl2dDE3MDhfc3RvcF9ocF93b3JrKGNvZGVjKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0X3dpZGdldHNfcG93ZXJfc3RhdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0jaWYgMCAvKiBGSVhNRTogdGhlIGFzc3VtZWQgY29ubmVjdGlvbnMgZG9uJ3QgbWF0Y2ggYWx3YXlzIHdpdGggdGhlCi0gICAgICAgKiBhY3R1YWwgcm91dGVzIGJ5IHRoZSBnZW5lcmljIHBhcnNlciwgc28gYmV0dGVyIHRvIGRpc2FibGUKLSAgICAgICAqIHRoZSBjb250cm9sIGZvciBzYWZldHkuCi0gICAgICAgKi8KLQlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpZiAoc3BlYy0+c2V0X3dpZGdldHNfcG93ZXJfc3RhdGUpCi0JCXNwZWMtPnNldF93aWRnZXRzX3Bvd2VyX3N0YXRlKGNvZGVjKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVfcG93ZXJfc3RhdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHBhcm0pCi17Ci0JaWYgKHNuZF9oZGFfY2hlY2tfcG93ZXJfc3RhdGUoY29kZWMsIG5pZCwgcGFybSkpCi0JCXJldHVybjsKLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBuaWQsIDAsIEFDX1ZFUkJfU0VUX1BPV0VSX1NUQVRFLCBwYXJtKTsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX2NvbnZfcG93ZXJfc3RhdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkgICAgICAgdW5zaWduZWQgaW50IHBhcm0sIHVuc2lnbmVkIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQl1bnNpZ25lZCBpbnQgZm9ybWF0OwotCi0JaWYgKHNuZF9oZGFfY2hlY2tfcG93ZXJfc3RhdGUoY29kZWMsIG5pZCwgcGFybSkpCi0JCXJldHVybjsKLQlmb3JtYXQgPSBzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9HRVRfQ09OViwgMCk7Ci0JaWYgKGZvcm1hdCAmJiAoc3BlYy0+ZGFjX3N0cmVhbV90YWdbaW5kZXhdICE9IGZvcm1hdCkpCi0JCXNwZWMtPmRhY19zdHJlYW1fdGFnW2luZGV4XSA9IGZvcm1hdDsKLQotCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIG5pZCwgMCwgQUNfVkVSQl9TRVRfUE9XRVJfU1RBVEUsIHBhcm0pOwotCWlmIChwYXJtID09IEFDX1BXUlNUX0QwKSB7Ci0JCWZvcm1hdCA9IHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgbmlkLCAwLCBBQ19WRVJCX0dFVF9DT05WLCAwKTsKLQkJaWYgKCFmb3JtYXQgJiYgKHNwZWMtPmRhY19zdHJlYW1fdGFnW2luZGV4XSAhPSBmb3JtYXQpKQotCQkJc25kX2hkYV9jb2RlY193cml0ZShjb2RlYywgbmlkLCAwLAotCQkJCQkJICBBQ19WRVJCX1NFVF9DSEFOTkVMX1NUUkVBTUlELAotCQkJCQkJICBzcGVjLT5kYWNfc3RyZWFtX3RhZ1tpbmRleF0pOwotCX0KLX0KLQotc3RhdGljIGJvb2wgc21hcnQ1MV9lbmFibGVkKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXJldHVybiBzcGVjLT5nZW4uZXh0X2NoYW5uZWxfY291bnQgPiAyOwotfQotCi1zdGF0aWMgYm9vbCBpc19zbWFydDUxX3BpbnMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBwaW4pCi17Ci0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgc3BlYy0+Z2VuLm11bHRpX2lvczsgaSsrKQotCQlpZiAoc3BlYy0+Z2VuLm11bHRpX2lvW2ldLnBpbiA9PSBwaW4pCi0JCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9waW5fcG93ZXJfc3RhdGUoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsIGhkYV9uaWRfdCBuaWQsCi0JCQkJdW5zaWduZWQgaW50ICphZmZlY3RlZF9wYXJtKQotewotCXVuc2lnbmVkIHBhcm07Ci0JdW5zaWduZWQgZGVmX2NvbmYgPSBzbmRfaGRhX2NvZGVjX2dldF9waW5jZmcoY29kZWMsIG5pZCk7Ci0JdW5zaWduZWQgbm9fcHJlc2VuY2UgPSAoZGVmX2NvbmYgJiBBQ19ERUZDRkdfTUlTQykKLQkJPj4gQUNfREVGQ0ZHX01JU0NfU0hJRlQKLQkJJiBBQ19ERUZDRkdfTUlTQ19OT19QUkVTRU5DRTsgLyogZG8gbm90IHN1cHBvcnQgcGluIHNlbnNlICovCi0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JdW5zaWduZWQgcHJlc2VudCA9IDA7Ci0KLQlub19wcmVzZW5jZSB8PSBzcGVjLT5ub19waW5fcG93ZXJfY3RsOwotCWlmICghbm9fcHJlc2VuY2UpCi0JCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCBuaWQpOwotCWlmICgoc21hcnQ1MV9lbmFibGVkKGNvZGVjKSAmJiBpc19zbWFydDUxX3BpbnMoY29kZWMsIG5pZCkpCi0JICAgIHx8ICgobm9fcHJlc2VuY2UgfHwgcHJlc2VudCkKLQkJJiYgZ2V0X2RlZmNmZ19jb25uZWN0KGRlZl9jb25mKSAhPSBBQ19KQUNLX1BPUlRfTk9ORSkpIHsKLQkJKmFmZmVjdGVkX3Bhcm0gPSBBQ19QV1JTVF9EMDsgLyogaWYgaXQncyBjb25uZWN0ZWQgKi8KLQkJcGFybSA9IEFDX1BXUlNUX0QwOwotCX0gZWxzZQotCQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0KLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIG5pZCwgcGFybSk7Ci19Ci0KIHN0YXRpYyBpbnQgdmlhX3Bpbl9wb3dlcl9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCiB7CkBAIC0zMjQsOCArMjM4LDcgQEAKIAkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7CiAJc3RydWN0IGhkYV9jb2RlYyAqY29kZWMgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7Ci0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9ICFzcGVjLT5ub19waW5fcG93ZXJfY3RsOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBjb2RlYy0+cG93ZXJfc2F2ZV9ub2RlOwogCXJldHVybiAwOwogfQogCkBAIC0zMzQsMTIgKzI0NywxMiBAQAogewogCXN0cnVjdCBoZGFfY29kZWMgKmNvZGVjID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXVuc2lnbmVkIGludCB2YWwgPSAhdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlib29sIHZhbCA9ICEhdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKIAotCWlmICh2YWwgPT0gc3BlYy0+bm9fcGluX3Bvd2VyX2N0bCkKKwlpZiAodmFsID09IGNvZGVjLT5wb3dlcl9zYXZlX25vZGUpCiAJCXJldHVybiAwOwotCXNwZWMtPm5vX3Bpbl9wb3dlcl9jdGwgPSB2YWw7Ci0Jc2V0X3dpZGdldHNfcG93ZXJfc3RhdGUoY29kZWMpOworCWNvZGVjLT5wb3dlcl9zYXZlX25vZGUgPSB2YWw7CisJc3BlYy0+Z2VuLnBvd2VyX2Rvd25fdW51c2VkID0gdmFsOwogCWFuYWxvZ19sb3dfY3VycmVudF9tb2RlKGNvZGVjKTsKIAlyZXR1cm4gMTsKIH0KQEAgLTM1NSw2ICsyNjgsNTkgQEAKIAl7fSAvKiB0ZXJtaW5hdG9yICovCiB9OwogCisjaWZkZWYgQ09ORklHX1NORF9IREFfSU5QVVRfQkVFUAorc3RhdGljIGlubGluZSB2b2lkIHNldF9iZWVwX2FtcChzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMsIGhkYV9uaWRfdCBuaWQsCisJCQkJaW50IGlkeCwgaW50IGRpcikKK3sKKwlzcGVjLT5nZW4uYmVlcF9uaWQgPSBuaWQ7CisJc3BlYy0+YmVlcF9hbXAgPSBIREFfQ09NUE9TRV9BTVBfVkFMKG5pZCwgMSwgaWR4LCBkaXIpOworfQorCisvKiBhZGRpdGlvbmFsIGJlZXAgbWl4ZXJzOyB0aGUgYWN0dWFsIHBhcmFtZXRlcnMgYXJlIG92ZXJ3cml0dGVuIGF0IGJ1aWxkICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgY3h0X2JlZXBfbWl4ZXJbXSA9IHsKKwlIREFfQ09ERUNfVk9MVU1FX01PTk8oIkJlZXAgUGxheWJhY2sgVm9sdW1lIiwgMCwgMSwgMCwgSERBX09VVFBVVCksCisJSERBX0NPREVDX01VVEVfQkVFUF9NT05PKCJCZWVwIFBsYXliYWNrIFN3aXRjaCIsIDAsIDEsIDAsIEhEQV9PVVRQVVQpLAorCXsgfSAvKiBlbmQgKi8KK307CisKKy8qIGNyZWF0ZSBiZWVwIGNvbnRyb2xzIGlmIG5lZWRlZCAqLworc3RhdGljIGludCBhZGRfYmVlcF9jdGxzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOworCWludCBlcnI7CisKKwlpZiAoc3BlYy0+YmVlcF9hbXApIHsKKwkJY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKmtuZXc7CisJCWZvciAoa25ldyA9IGN4dF9iZWVwX21peGVyOyBrbmV3LT5uYW1lOyBrbmV3KyspIHsKKwkJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CisJCQlrY3RsID0gc25kX2N0bF9uZXcxKGtuZXcsIGNvZGVjKTsKKwkJCWlmICgha2N0bCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCWtjdGwtPnByaXZhdGVfdmFsdWUgPSBzcGVjLT5iZWVwX2FtcDsKKwkJCWVyciA9IHNuZF9oZGFfY3RsX2FkZChjb2RlYywgMCwga2N0bCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdXRvX3BhcnNlX2JlZXAoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CisJaGRhX25pZF90IG5pZDsKKworCWZvcl9lYWNoX2hkYV9jb2RlY19ub2RlKG5pZCwgY29kZWMpCisJCWlmIChnZXRfd2NhcHNfdHlwZShnZXRfd2NhcHMoY29kZWMsIG5pZCkpID09IEFDX1dJRF9CRUVQKSB7CisJCQlzZXRfYmVlcF9hbXAoc3BlYywgbmlkLCAwLCBIREFfT1VUUFVUKTsKKwkJCWJyZWFrOworCQl9Cit9CisjZWxzZQorI2RlZmluZSBzZXRfYmVlcF9hbXAoc3BlYywgbmlkLCBpZHgsIGRpcikgLyogTk9QICovCisjZGVmaW5lIGFkZF9iZWVwX2N0bHMoY29kZWMpCTAKKyNkZWZpbmUgYXV0b19wYXJzZV9iZWVwKGNvZGVjKQorI2VuZGlmCiAKIC8qIGNoZWNrIEFBIHBhdGgncyBtdXRlIHN0YXR1cyAqLwogc3RhdGljIGJvb2wgaXNfYWFfcGF0aF9tdXRlKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQpAQCAtMzg0LDcgKzM1MCw3IEBACiAJYm9vbCBlbmFibGU7CiAJdW5zaWduZWQgaW50IHZlcmIsIHBhcm07CiAKLQlpZiAoc3BlYy0+bm9fcGluX3Bvd2VyX2N0bCkKKwlpZiAoIWNvZGVjLT5wb3dlcl9zYXZlX25vZGUpCiAJCWVuYWJsZSA9IGZhbHNlOwogCWVsc2UKIAkJZW5hYmxlID0gaXNfYWFfcGF0aF9tdXRlKGNvZGVjKSAmJiAhc3BlYy0+Z2VuLmFjdGl2ZV9zdHJlYW1zOwpAQCAtNDI0LDcgKzM5MCw3IEBACiAJCXJldHVybjsJCS8qIG90aGVyIGNvZGVjcyBhcmUgbm90IHN1cHBvcnRlZCAqLwogCX0KIAkvKiBzZW5kIHZlcmIgKi8KLQlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+YWZnLCAwLCB2ZXJiLCBwYXJtKTsKKwlzbmRfaGRhX2NvZGVjX3dyaXRlKGNvZGVjLCBjb2RlYy0+Y29yZS5hZmcsIDAsIHZlcmIsIHBhcm0pOwogfQogCiBzdGF0aWMgdm9pZCBhbmFsb2dfbG93X2N1cnJlbnRfbW9kZShzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKQEAgLTQ0MSw4ICs0MDcsMTEgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCWlmIChzcGVjLT5zZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZSkKLQkJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSB2aWFfcGluX3Bvd2VyX2N0bF9lbnVtOworCWVyciA9IGFkZF9iZWVwX2N0bHMoY29kZWMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSB2aWFfcGluX3Bvd2VyX2N0bF9lbnVtOwogCiAJZm9yIChpID0gMDsgaSA8IHNwZWMtPm51bV9taXhlcnM7IGkrKykgewogCQllcnIgPSBzbmRfaGRhX2FkZF9uZXdfY3Rscyhjb2RlYywgc3BlYy0+bWl4ZXJzW2ldKTsKQEAgLTQ4Niw3ICs0NTUsNiBAQAogc3RhdGljIGludCB2aWFfY2hlY2tfcG93ZXJfc3RhdHVzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBoZGFfbmlkX3QgbmlkKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXNldF93aWRnZXRzX3Bvd2VyX3N0YXRlKGNvZGVjKTsKIAlhbmFsb2dfbG93X2N1cnJlbnRfbW9kZShjb2RlYyk7CiAJdnQxNzA4X3VwZGF0ZV9ocF93b3JrKGNvZGVjKTsKIAlyZXR1cm4gc25kX2hkYV9jaGVja19hbXBfbGlzdF9wb3dlcihjb2RlYywgJnNwZWMtPmdlbi5sb29wYmFjaywgbmlkKTsKQEAgLTUwNCw2ICs0NzIsNyBAQAogCS5pbml0ID0gdmlhX2luaXQsCiAJLmZyZWUgPSB2aWFfZnJlZSwKIAkudW5zb2xfZXZlbnQgPSBzbmRfaGRhX2phY2tfdW5zb2xfZXZlbnQsCisJLnN0cmVhbV9wbSA9IHNuZF9oZGFfZ2VuX3N0cmVhbV9wbSwKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZCA9IHZpYV9zdXNwZW5kLAogCS5jaGVja19wb3dlcl9zdGF0dXMgPSB2aWFfY2hlY2tfcG93ZXJfc3RhdHVzLApAQCAtNTc0LDM0ICs1NDMsNiBAQAogCXt9IC8qIHRlcm1pbmF0b3IgKi8KIH07CiAKLXN0YXRpYyB2b2lkIHZpYV9qYWNrX3Bvd2Vyc3RhdGVfZXZlbnQoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMsCi0JCQkJICAgICAgc3RydWN0IGhkYV9qYWNrX2NhbGxiYWNrICp0YmwpCi17Ci0Jc2V0X3dpZGdldHNfcG93ZXJfc3RhdGUoY29kZWMpOwotfQotCi1zdGF0aWMgdm9pZCB2aWFfc2V0X2phY2tfdW5zb2xfZXZlbnRzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCXN0cnVjdCBhdXRvX3Bpbl9jZmcgKmNmZyA9ICZzcGVjLT5nZW4uYXV0b2NmZzsKLQloZGFfbmlkX3QgcGluOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNmZy0+bGluZV9vdXRzOyBpKyspIHsKLQkJcGluID0gY2ZnLT5saW5lX291dF9waW5zW2ldOwotCQlpZiAocGluICYmIGlzX2phY2tfZGV0ZWN0YWJsZShjb2RlYywgcGluKSkKLQkJCXNuZF9oZGFfamFja19kZXRlY3RfZW5hYmxlX2NhbGxiYWNrKGNvZGVjLCBwaW4sCi0JCQkJCQkJICAgIHZpYV9qYWNrX3Bvd2Vyc3RhdGVfZXZlbnQpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9pbnB1dHM7IGkrKykgewotCQlwaW4gPSBjZmctPmxpbmVfb3V0X3BpbnNbaV07Ci0JCWlmIChwaW4gJiYgaXNfamFja19kZXRlY3RhYmxlKGNvZGVjLCBwaW4pKQotCQkJc25kX2hkYV9qYWNrX2RldGVjdF9lbmFibGVfY2FsbGJhY2soY29kZWMsIHBpbiwKLQkJCQkJCQkgICAgdmlhX2phY2tfcG93ZXJzdGF0ZV9ldmVudCk7Ci0JfQotfQotCiBzdGF0aWMgY29uc3Qgc3RydWN0IGJhZG5lc3NfdGFibGUgdmlhX21haW5fb3V0X2JhZG5lc3MgPSB7CiAJLm5vX3ByaW1hcnlfZGFjID0gMHgxMDAwMCwKIAkubm9fZGFjID0gMHg0MDAwLApAQCAtNjMxLDExICs1NzIsMTUgQEAKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAorCWF1dG9fcGFyc2VfYmVlcChjb2RlYyk7CisKIAllcnIgPSBzbmRfaGRhX2dlbl9wYXJzZV9hdXRvX2NvbmZpZyhjb2RlYywgJnNwZWMtPmdlbi5hdXRvY2ZnKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAotCXZpYV9zZXRfamFja191bnNvbF9ldmVudHMoY29kZWMpOworCS8qIGRpc2FibGUgd2lkZ2V0IFBNIGF0IHN0YXJ0IGZvciBjb21wYXRpYmlsaXR5ICovCisJY29kZWMtPnBvd2VyX3NhdmVfbm9kZSA9IDA7CisJc3BlYy0+Z2VuLnBvd2VyX2Rvd25fdW51c2VkID0gMDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjQ4LDcgKzU5Myw2IEBACiAJCXNuZF9oZGFfc2VxdWVuY2Vfd3JpdGUoY29kZWMsIHNwZWMtPmluaXRfdmVyYnNbaV0pOwogCiAJLyogaW5pdCBwb3dlciBzdGF0ZXMgKi8KLQlzZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZShjb2RlYyk7CiAJX19hbmFsb2dfbG93X2N1cnJlbnRfbW9kZShjb2RlYywgdHJ1ZSk7CiAKIAlzbmRfaGRhX2dlbl9pbml0KGNvZGVjKTsKQEAgLTY3NiwxNSArNjIwLDE3IEBACiAJaW50IGksIGVycjsKIAogCWVyciA9IHNuZF9oZGFfZ2VuX2J1aWxkX3BjbXMoY29kZWMpOwotCWlmIChlcnIgPCAwIHx8IGNvZGVjLT52ZW5kb3JfaWQgIT0gMHgxMTA2MTcwOCkKKwlpZiAoZXJyIDwgMCB8fCBjb2RlYy0+Y29yZS52ZW5kb3JfaWQgIT0gMHgxMTA2MTcwOCkKIAkJcmV0dXJuIGVycjsKIAogCS8qIFdlIGdvdCBub2lzeSBvdXRwdXRzIG9uIHRoZSByaWdodCBjaGFubmVsIG9uIFZUMTcwOCB3aGVuCiAJICogMjRiaXQgc2FtcGxlcyBhcmUgdXNlZC4gIFVudGlsIGFueSB3b3JrYXJvdW5kIGlzIGZvdW5kLAogCSAqIGRpc2FibGUgdGhlIDI0Yml0IGZvcm1hdCwgc28gZmFyLgogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+bnVtX3BjbXM7IGkrKykgewotCQlzdHJ1Y3QgaGRhX3BjbSAqaW5mbyA9ICZzcGVjLT5nZW4ucGNtX3JlY1tpXTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzcGVjLT5nZW4ucGNtX3JlYyk7IGkrKykgeworCQlzdHJ1Y3QgaGRhX3BjbSAqaW5mbyA9IHNwZWMtPmdlbi5wY21fcmVjW2ldOworCQlpZiAoIWluZm8pCisJCQljb250aW51ZTsKIAkJaWYgKCFpbmZvLT5zdHJlYW1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtcyB8fAogCQkgICAgaW5mby0+cGNtX3R5cGUgIT0gSERBX1BDTV9UWVBFX0FVRElPKQogCQkJY29udGludWU7CkBAIC03NjYsNzggKzcxMiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTcwOEIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGltdXhfaXNfc21peGVyOwotCXVuc2lnbmVkIGludCBwYXJtOwotCWludCBpc184Y2ggPSAwOwotCWlmICgoc3BlYy0+Y29kZWNfdHlwZSAhPSBWVDE3MDhCXzRDSCkgJiYKLQkgICAgKGNvZGVjLT52ZW5kb3JfaWQgIT0gMHgxMTA2NDM5NykpCi0JCWlzXzhjaCA9IDE7Ci0KLQkvKiBTVzAgKDE3aCkgPSBzdGVyZW8gbWl4ZXIgKi8KLQlpbXV4X2lzX3NtaXhlciA9Ci0JKHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxNywgMCwgQUNfVkVSQl9HRVRfQ09OTkVDVF9TRUwsIDB4MDApCi0JID09ICgoc3BlYy0+Y29kZWNfdHlwZSA9PSBWVDE3MDhTKSA/IDUgOiAwKSk7Ci0JLyogaW5wdXRzICovCi0JLyogUFcgMS8yLzUgKDFhaC8xYmgvMWVoKSAqLwotCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFhLCAmcGFybSk7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgxYiwgJnBhcm0pOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MWUsICZwYXJtKTsKLQlpZiAoaW11eF9pc19zbWl4ZXIpCi0JCXBhcm0gPSBBQ19QV1JTVF9EMDsKLQkvKiBTVzAgKDE3aCksIEFJVyAwLzEgKDEzaC8xNGgpICovCi0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDE3LCBwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTMsIHBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxNCwgcGFybSk7Ci0KLQkvKiBvdXRwdXRzICovCi0JLyogUFcwICgxOWgpLCBTVzEgKDE4aCksIEFPVzEgKDExaCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgxOSwgJnBhcm0pOwotCWlmIChzbWFydDUxX2VuYWJsZWQoY29kZWMpKQotCQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFiLCAmcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDE4LCBwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTEsIHBhcm0pOwotCi0JLyogUFc2ICgyMmgpLCBTVzIgKDI2aCksIEFPVzIgKDI0aCkgKi8KLQlpZiAoaXNfOGNoKSB7Ci0JCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQkJc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyMiwgJnBhcm0pOwotCQlpZiAoc21hcnQ1MV9lbmFibGVkKGNvZGVjKSkKLQkJCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MWEsICZwYXJtKTsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDI2LCBwYXJtKTsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDI0LCBwYXJtKTsKLQl9IGVsc2UgaWYgKGNvZGVjLT52ZW5kb3JfaWQgPT0gMHgxMTA2NDM5NykgewotCQkvKiBQVzcoMjNoKSwgU1cyKDI3aCksIEFPVzIoMjVoKSAqLwotCQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0JCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MjMsICZwYXJtKTsKLQkJaWYgKHNtYXJ0NTFfZW5hYmxlZChjb2RlYykpCi0JCQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFhLCAmcGFybSk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgyNywgcGFybSk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgyNSwgcGFybSk7Ci0JfQotCi0JLyogUFcgMy80LzcgKDFjaC8xZGgvMjNoKSAqLwotCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQkvKiBmb3JjZSB0byBEMCBmb3IgaW50ZXJuYWwgU3BlYWtlciAqLwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MWMsICZwYXJtKTsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFkLCAmcGFybSk7Ci0JaWYgKGlzXzhjaCkKLQkJc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyMywgJnBhcm0pOwotCi0JLyogTVcwICgxNmgpLCBTdzMgKDI3aCksIEFPVyAwLzMgKDEwaC8yNWgpICovCi0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDE2LCBpbXV4X2lzX3NtaXhlciA/IEFDX1BXUlNUX0QwIDogcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDEwLCBwYXJtKTsKLQlpZiAoaXNfOGNoKSB7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgyNSwgcGFybSk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgyNywgcGFybSk7Ci0JfSBlbHNlIGlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjQzOTcgJiYgc3BlYy0+Z2VuLmluZGVwX2hwX2VuYWJsZWQpCi0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgyNSwgcGFybSk7Ci19Ci0KIHN0YXRpYyBpbnQgcGF0Y2hfdnQxNzA4UyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYyk7CiBzdGF0aWMgaW50IHBhdGNoX3Z0MTcwOEIoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCiB7CkBAIC04NjIsOSArNzM2LDYgQEAKIAl9CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKLQotCXNwZWMtPnNldF93aWRnZXRzX3Bvd2VyX3N0YXRlID0gIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTcwOEI7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtOTA1LDE5ICs3NzYsMTkgQEAKIAogCS8qIGNvcnJlY3QgbmFtZXMgZm9yIFZUMTcwOEJDRSAqLwogCWlmIChnZXRfY29kZWNfdHlwZShjb2RlYykgPT0gVlQxNzA4QkNFKQl7Ci0JCWtmcmVlKGNvZGVjLT5jaGlwX25hbWUpOwotCQljb2RlYy0+Y2hpcF9uYW1lID0ga3N0cmR1cCgiVlQxNzA4QkNFIiwgR0ZQX0tFUk5FTCk7Ci0JCXNucHJpbnRmKGNvZGVjLT5idXMtPmNhcmQtPm1peGVybmFtZSwKLQkJCSBzaXplb2YoY29kZWMtPmJ1cy0+Y2FyZC0+bWl4ZXJuYW1lKSwKLQkJCSAiJXMgJXMiLCBjb2RlYy0+dmVuZG9yX25hbWUsIGNvZGVjLT5jaGlwX25hbWUpOworCQlrZnJlZShjb2RlYy0+Y29yZS5jaGlwX25hbWUpOworCQljb2RlYy0+Y29yZS5jaGlwX25hbWUgPSBrc3RyZHVwKCJWVDE3MDhCQ0UiLCBHRlBfS0VSTkVMKTsKKwkJc25wcmludGYoY29kZWMtPmNhcmQtPm1peGVybmFtZSwKKwkJCSBzaXplb2YoY29kZWMtPmNhcmQtPm1peGVybmFtZSksCisJCQkgIiVzICVzIiwgY29kZWMtPmNvcmUudmVuZG9yX25hbWUsIGNvZGVjLT5jb3JlLmNoaXBfbmFtZSk7CiAJfQogCS8qIGNvcnJlY3QgbmFtZXMgZm9yIFZUMTcwNSAqLwotCWlmIChjb2RlYy0+dmVuZG9yX2lkID09IDB4MTEwNjQzOTcpCXsKLQkJa2ZyZWUoY29kZWMtPmNoaXBfbmFtZSk7Ci0JCWNvZGVjLT5jaGlwX25hbWUgPSBrc3RyZHVwKCJWVDE3MDUiLCBHRlBfS0VSTkVMKTsKLQkJc25wcmludGYoY29kZWMtPmJ1cy0+Y2FyZC0+bWl4ZXJuYW1lLAotCQkJIHNpemVvZihjb2RlYy0+YnVzLT5jYXJkLT5taXhlcm5hbWUpLAotCQkJICIlcyAlcyIsIGNvZGVjLT52ZW5kb3JfbmFtZSwgY29kZWMtPmNoaXBfbmFtZSk7CisJaWYgKGNvZGVjLT5jb3JlLnZlbmRvcl9pZCA9PSAweDExMDY0Mzk3KSB7CisJCWtmcmVlKGNvZGVjLT5jb3JlLmNoaXBfbmFtZSk7CisJCWNvZGVjLT5jb3JlLmNoaXBfbmFtZSA9IGtzdHJkdXAoIlZUMTcwNSIsIEdGUF9LRVJORUwpOworCQlzbnByaW50Zihjb2RlYy0+Y2FyZC0+bWl4ZXJuYW1lLAorCQkJIHNpemVvZihjb2RlYy0+Y2FyZC0+bWl4ZXJuYW1lKSwKKwkJCSAiJXMgJXMiLCBjb2RlYy0+Y29yZS52ZW5kb3JfbmFtZSwgY29kZWMtPmNvcmUuY2hpcF9uYW1lKTsKIAl9CiAKIAkvKiBhdXRvbWF0aWMgcGFyc2UgZnJvbSB0aGUgQklPUyBjb25maWcgKi8KQEAgLTkzMCw4ICs4MDEsNiBAQAogCXNwZWMtPmluaXRfdmVyYnNbc3BlYy0+bnVtX2l2ZXJicysrXSA9IHZ0MTcwOFNfaW5pdF92ZXJiczsKIAogCWNvZGVjLT5wYXRjaF9vcHMgPSB2aWFfcGF0Y2hfb3BzOwotCi0Jc3BlYy0+c2V0X3dpZGdldHNfcG93ZXJfc3RhdGUgPSAgc2V0X3dpZGdldHNfcG93ZXJfc3RhdGVfdnQxNzA4QjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTQ1LDM2ICs4MTQsNiBAQAogCXsgfQogfTsKIAotc3RhdGljIHZvaWQgc2V0X3dpZGdldHNfcG93ZXJfc3RhdGVfdnQxNzAyKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCWludCBpbXV4X2lzX3NtaXhlciA9Ci0Jc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDEzLCAwLCBBQ19WRVJCX0dFVF9DT05ORUNUX1NFTCwgMHgwMCkgPT0gMzsKLQl1bnNpZ25lZCBpbnQgcGFybTsKLQkvKiBpbnB1dHMgKi8KLQkvKiBQVyAxLzIvNSAoMTRoLzE1aC8xOGgpICovCi0JcGFybSA9IEFDX1BXUlNUX0QzOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MTQsICZwYXJtKTsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDE1LCAmcGFybSk7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgxOCwgJnBhcm0pOwotCWlmIChpbXV4X2lzX3NtaXhlcikKLQkJcGFybSA9IEFDX1BXUlNUX0QwOyAvKiBTVzAgKDEzaCkgPSBzdGVyZW8gbWl4ZXIgKGlkeCAzKSAqLwotCS8qIFNXMCAoMTNoKSwgQUlXIDAvMS8yICgxMmgvMWZoLzIwaCkgKi8KLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTMsIHBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxMiwgcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFmLCBwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MjAsIHBhcm0pOwotCi0JLyogb3V0cHV0cyAqLwotCS8qIFBXIDMvNCAoMTZoLzE3aCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgxNywgJnBhcm0pOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MTYsICZwYXJtKTsKLQkvKiBNVzAgKDFhaCksIEFPVyAwLzEgKDEwaC8xZGgpICovCi0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFhLCBpbXV4X2lzX3NtaXhlciA/IEFDX1BXUlNUX0QwIDogcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDEwLCBwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MWQsIHBhcm0pOwotfQotCiBzdGF0aWMgaW50IHBhdGNoX3Z0MTcwMihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWM7CkBAIC0xMDA0LDggKzg0Myw2IEBACiAJc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQxNzAyX2luaXRfdmVyYnM7CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKLQotCXNwZWMtPnNldF93aWRnZXRzX3Bvd2VyX3N0YXRlID0gIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTcwMjsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAyMCw3MSArODU3LDYgQEAKIAl7IH0KIH07CiAKLXN0YXRpYyB2b2lkIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTcxOFMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGltdXhfaXNfc21peGVyOwotCXVuc2lnbmVkIGludCBwYXJtLCBwYXJtMjsKLQkvKiBNVVg2ICgxZWgpID0gc3RlcmVvIG1peGVyICovCi0JaW11eF9pc19zbWl4ZXIgPQotCXNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxZSwgMCwgQUNfVkVSQl9HRVRfQ09OTkVDVF9TRUwsIDB4MDApID09IDU7Ci0JLyogaW5wdXRzICovCi0JLyogUFcgNS82LzcgKDI5aC8yYWgvMmJoKSAqLwotCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDI5LCAmcGFybSk7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyYSwgJnBhcm0pOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MmIsICZwYXJtKTsKLQlpZiAoaW11eF9pc19zbWl4ZXIpCi0JCXBhcm0gPSBBQ19QV1JTVF9EMDsKLQkvKiBNVVg2LzcgKDFlaC8xZmgpLCBBSVcgMC8xICgxMGgvMTFoKSAqLwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxZSwgcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFmLCBwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTAsIHBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxMSwgcGFybSk7Ci0KLQkvKiBvdXRwdXRzICovCi0JLyogUFczICgyN2gpLCBNVzIgKDFhaCksIEFPVzMgKGJoKSAqLwotCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDI3LCAmcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFhLCBwYXJtKTsKLQlwYXJtMiA9IHBhcm07IC8qIGZvciBwaW4gMHgwYiAqLwotCi0JLyogUFcyICgyNmgpLCBBT1cyIChhaCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyNiwgJnBhcm0pOwotCWlmIChzbWFydDUxX2VuYWJsZWQoY29kZWMpKQotCQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDJiLCAmcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweGEsIHBhcm0pOwotCi0JLyogUFcwICgyNGgpLCBBT1cwICg4aCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyNCwgJnBhcm0pOwotCWlmICghc3BlYy0+Z2VuLmluZGVwX2hwX2VuYWJsZWQpIC8qIGNoZWNrIGZvciByZWRpcmVjdGVkIEhQICovCi0JCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MjgsICZwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4OCwgcGFybSk7Ci0JaWYgKCFzcGVjLT5nZW4uaW5kZXBfaHBfZW5hYmxlZCAmJiBwYXJtMiAhPSBBQ19QV1JTVF9EMykKLQkJcGFybSA9IHBhcm0yOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHhiLCBwYXJtKTsKLQkvKiBNVzkgKDIxaCksIE13MiAoMWFoKSwgQU9XMCAoOGgpICovCi0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDIxLCBpbXV4X2lzX3NtaXhlciA/IEFDX1BXUlNUX0QwIDogcGFybSk7Ci0KLQkvKiBQVzEgKDI1aCksIEFPVzEgKDloKSAqLwotCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDI1LCAmcGFybSk7Ci0JaWYgKHNtYXJ0NTFfZW5hYmxlZChjb2RlYykpCi0JCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MmEsICZwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4OSwgcGFybSk7Ci0KLQlpZiAoc3BlYy0+Z2VuLmluZGVwX2hwX2VuYWJsZWQpIHsKLQkJLyogUFc0ICgyOGgpLCBNVzMgKDFiaCksIE1VWDEoMzRoKSwgQU9XNCAoY2gpICovCi0JCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQkJc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyOCwgJnBhcm0pOwotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MWIsIHBhcm0pOwotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MzQsIHBhcm0pOwotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4YywgcGFybSk7Ci0JfQotfQotCiAvKiBBZGQgYSBjb25uZWN0aW9uIHRvIHRoZSBwcmltYXJ5IERBQyBmcm9tIEFBLW1peGVyIGZvciBzb21lIGNvZGVjcwogICogVGhpcyBpc24ndCBsaXN0ZWQgZnJvbSB0aGUgcmF3IGluZm8sIGJ1dCB0aGUgY2hpcCBoYXMgYSBzZWNyZXQgY29ubmVjdGlvbi4KICAqLwpAQCAtMTEwNSw4ICs4NzcsNyBAQAogCX0KIAogCS8qIGZpbmQgdGhlIHByaW1hcnkgREFDIGFuZCBhZGQgdG8gdGhlIGNvbm5lY3Rpb24gbGlzdCAqLwotCW5pZCA9IGNvZGVjLT5zdGFydF9uaWQ7Ci0JZm9yIChpID0gMDsgaSA8IGNvZGVjLT5udW1fbm9kZXM7IGkrKywgbmlkKyspIHsKKwlmb3JfZWFjaF9oZGFfY29kZWNfbm9kZShuaWQsIGNvZGVjKSB7CiAJCXVuc2lnbmVkIGludCBjYXBzID0gZ2V0X3djYXBzKGNvZGVjLCBuaWQpOwogCQlpZiAoZ2V0X3djYXBzX3R5cGUoY2FwcykgPT0gQUNfV0lEX0FVRF9PVVQgJiYKIAkJICAgICEoY2FwcyAmIEFDX1dDQVBfRElHSVRBTCkpIHsKQEAgLTExNDUsOSArOTE2LDYgQEAKIAlzcGVjLT5pbml0X3ZlcmJzW3NwZWMtPm51bV9pdmVyYnMrK10gPSB2dDE3MThTX2luaXRfdmVyYnM7CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKLQotCXNwZWMtPnNldF93aWRnZXRzX3Bvd2VyX3N0YXRlID0gIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTcxOFM7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMTE4Nyw3ICs5NTUsNiBAQAogCXNuZF9oZGFfY29kZWNfd3JpdGUoY29kZWMsIDB4MjYsIDAsCiAJCQkJCSAgICAgICBBQ19WRVJCX1NFVF9DT05ORUNUX1NFTCwgaW5kZXgpOwogCXNwZWMtPmRtaWNfZW5hYmxlZCA9IGluZGV4OwotCXNldF93aWRnZXRzX3Bvd2VyX3N0YXRlKGNvZGVjKTsKIAlyZXR1cm4gMTsKIH0KIApAQCAtMTIyMiw5NSArOTg5LDYgQEAKIAl7IH0KIH07CiAKLXN0YXRpYyB2b2lkIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTcxNlMoc3RydWN0IGhkYV9jb2RlYyAqY29kZWMpCi17Ci0Jc3RydWN0IHZpYV9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7Ci0JaW50IGltdXhfaXNfc21peGVyOwotCXVuc2lnbmVkIGludCBwYXJtOwotCXVuc2lnbmVkIGludCBtb25vX291dCwgcHJlc2VudDsKLQkvKiBTVzAgKDE3aCkgPSBzdGVyZW8gbWl4ZXIgKi8KLQlpbXV4X2lzX3NtaXhlciA9Ci0JKHNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgMHgxNywgMCwKLQkJCSAgICBBQ19WRVJCX0dFVF9DT05ORUNUX1NFTCwgMHgwMCkgPT0gIDUpOwotCS8qIGlucHV0cyAqLwotCS8qIFBXIDEvMi81ICgxYWgvMWJoLzFlaCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgxYSwgJnBhcm0pOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MWIsICZwYXJtKTsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFlLCAmcGFybSk7Ci0JaWYgKGltdXhfaXNfc21peGVyKQotCQlwYXJtID0gQUNfUFdSU1RfRDA7Ci0JLyogU1cwICgxN2gpLCBBSVcwKDEzaCkgKi8KLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTcsIHBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxMywgcGFybSk7Ci0KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgxZSwgJnBhcm0pOwotCS8qIFBXMTEgKDIyaCkgKi8KLQlpZiAoc3BlYy0+ZG1pY19lbmFibGVkKQotCQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDIyLCAmcGFybSk7Ci0JZWxzZQotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MjIsIEFDX1BXUlNUX0QzKTsKLQotCS8qIFNXMigyNmgpLCBBSVcxKDE0aCkgKi8KLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MjYsIHBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxNCwgcGFybSk7Ci0KLQkvKiBvdXRwdXRzICovCi0JLyogUFcwICgxOWgpLCBTVzEgKDE4aCksIEFPVzEgKDExaCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgxOSwgJnBhcm0pOwotCS8qIFNtYXJ0IDUuMSBQVzIoMWJoKSAqLwotCWlmIChzbWFydDUxX2VuYWJsZWQoY29kZWMpKQotCQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFiLCAmcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDE4LCBwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTEsIHBhcm0pOwotCi0JLyogUFc3ICgyM2gpLCBTVzMgKDI3aCksIEFPVzMgKDI1aCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyMywgJnBhcm0pOwotCS8qIFNtYXJ0IDUuMSBQVzEoMWFoKSAqLwotCWlmIChzbWFydDUxX2VuYWJsZWQoY29kZWMpKQotCQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFhLCAmcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDI3LCBwYXJtKTsKLQotCS8qIFNtYXJ0IDUuMSBQVzUoMWVoKSAqLwotCWlmIChzbWFydDUxX2VuYWJsZWQoY29kZWMpKQotCQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFlLCAmcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDI1LCBwYXJtKTsKLQotCS8qIE1vbm8gb3V0ICovCi0JLyogU1c0KDI4aCktPk1XMSgyOWgpLT4gUFcxMiAoMmFoKSovCi0JcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWMpOwotCi0JaWYgKHByZXNlbnQpCi0JCW1vbm9fb3V0ID0gMDsKLQllbHNlIHsKLQkJcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MWQpOwotCQlpZiAoIXNwZWMtPmdlbi5pbmRlcF9ocF9lbmFibGVkICYmIHByZXNlbnQpCi0JCQltb25vX291dCA9IDA7Ci0JCWVsc2UKLQkJCW1vbm9fb3V0ID0gMTsKLQl9Ci0JcGFybSA9IG1vbm9fb3V0ID8gQUNfUFdSU1RfRDAgOiBBQ19QV1JTVF9EMzsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MjgsIHBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgyOSwgcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDJhLCBwYXJtKTsKLQotCS8qIFBXIDMvNCAoMWNoLzFkaCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgxYywgJnBhcm0pOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MWQsICZwYXJtKTsKLQkvKiBIUCBJbmRlcGVuZGVudCBNb2RlLCBwb3dlciBvbiBBT1czICovCi0JaWYgKHNwZWMtPmdlbi5pbmRlcF9ocF9lbmFibGVkKQotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MjUsIHBhcm0pOwotCi0JLyogZm9yY2UgdG8gRDAgZm9yIGludGVybmFsIFNwZWFrZXIgKi8KLQkvKiBNVzAgKDE2aCksIEFPVzAgKDEwaCkgKi8KLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTYsIGltdXhfaXNfc21peGVyID8gQUNfUFdSU1RfRDAgOiBwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTAsIG1vbm9fb3V0ID8gQUNfUFdSU1RfRDAgOiBwYXJtKTsKLX0KLQogc3RhdGljIGludCBwYXRjaF92dDE3MTZTKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYzsKQEAgLTEzMzgsOCArMTAxNiw2IEBACiAJc3BlYy0+bWl4ZXJzW3NwZWMtPm51bV9taXhlcnMrK10gPSB2dDE3MTZTX21vbm9fb3V0X21peGVyOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7Ci0KLQlzcGVjLT5zZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZSA9IHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTcxNlM7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEzNjUsOTggKzEwNDEsNiBAQAogCXsgfQogfTsKIAotc3RhdGljIHZvaWQgc2V0X3dpZGdldHNfcG93ZXJfc3RhdGVfdnQyMDAyUChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQlpbnQgaW11eF9pc19zbWl4ZXI7Ci0JdW5zaWduZWQgaW50IHBhcm07Ci0JdW5zaWduZWQgaW50IHByZXNlbnQ7Ci0JLyogTVVYOSAoMWVoKSA9IHN0ZXJlbyBtaXhlciAqLwotCWltdXhfaXNfc21peGVyID0KLQlzbmRfaGRhX2NvZGVjX3JlYWQoY29kZWMsIDB4MWUsIDAsIEFDX1ZFUkJfR0VUX0NPTk5FQ1RfU0VMLCAweDAwKSA9PSAzOwotCS8qIGlucHV0cyAqLwotCS8qIFBXIDUvNi83ICgyOWgvMmFoLzJiaCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyOSwgJnBhcm0pOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MmEsICZwYXJtKTsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDJiLCAmcGFybSk7Ci0JcGFybSA9IEFDX1BXUlNUX0QwOwotCS8qIE1VWDkvMTAgKDFlaC8xZmgpLCBBSVcgMC8xICgxMGgvMTFoKSAqLwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxZSwgcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFmLCBwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTAsIHBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxMSwgcGFybSk7Ci0KLQkvKiBvdXRwdXRzICovCi0JLyogQU9XMCAoOGgpKi8KLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4OCwgcGFybSk7Ci0KLQlpZiAoc3BlYy0+Y29kZWNfdHlwZSA9PSBWVDE4MDIpIHsKLQkJLyogUFc0ICgyOGgpLCBNVzQgKDE4aCksIE1VWDQoMzhoKSAqLwotCQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0JCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MjgsICZwYXJtKTsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDE4LCBwYXJtKTsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDM4LCBwYXJtKTsKLQl9IGVsc2UgewotCQkvKiBQVzQgKDI2aCksIE1XNCAoMWNoKSwgTVVYNCgzN2gpICovCi0JCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQkJc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyNiwgJnBhcm0pOwotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MWMsIHBhcm0pOwotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MzcsIHBhcm0pOwotCX0KLQotCWlmIChzcGVjLT5jb2RlY190eXBlID09IFZUMTgwMikgewotCQkvKiBQVzEgKDI1aCksIE1XMSAoMTVoKSwgTVVYMSgzNWgpLCBBT1cxICg5aCkgKi8KLQkJcGFybSA9IEFDX1BXUlNUX0QzOwotCQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDI1LCAmcGFybSk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxNSwgcGFybSk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgzNSwgcGFybSk7Ci0JfSBlbHNlIHsKLQkJLyogUFcxICgyNWgpLCBNVzEgKDE5aCksIE1VWDEoMzVoKSwgQU9XMSAoOWgpICovCi0JCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQkJc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyNSwgJnBhcm0pOwotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTksIHBhcm0pOwotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MzUsIHBhcm0pOwotCX0KLQotCWlmIChzcGVjLT5nZW4uaW5kZXBfaHBfZW5hYmxlZCkKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDksIEFDX1BXUlNUX0QwKTsKLQotCS8qIENsYXNzLUQgKi8KLQkvKiBQVzAgKDI0aCksIE1XMCgxOGgvMTRoKSwgTVVYMCgzNGgpICovCi0JcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MjUpOwotCi0JcGFybSA9IEFDX1BXUlNUX0QzOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MjQsICZwYXJtKTsKLQlwYXJtID0gcHJlc2VudCA/IEFDX1BXUlNUX0QzIDogQUNfUFdSU1RfRDA7Ci0JaWYgKHNwZWMtPmNvZGVjX3R5cGUgPT0gVlQxODAyKQotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTQsIHBhcm0pOwotCWVsc2UKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDE4LCBwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MzQsIHBhcm0pOwotCi0JLyogTW9ubyBPdXQgKi8KLQlwcmVzZW50ID0gc25kX2hkYV9qYWNrX2RldGVjdChjb2RlYywgMHgyNik7Ci0KLQlwYXJtID0gcHJlc2VudCA/IEFDX1BXUlNUX0QzIDogQUNfUFdSU1RfRDA7Ci0JaWYgKHNwZWMtPmNvZGVjX3R5cGUgPT0gVlQxODAyKSB7Ci0JCS8qIFBXMTUgKDMzaCksIE1XOCgxY2gpLCBNVVg4KDNjaCkgKi8KLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDMzLCBwYXJtKTsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFjLCBwYXJtKTsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDNjLCBwYXJtKTsKLQl9IGVsc2UgewotCQkvKiBQVzE1ICgzMWgpLCBNVzgoMTdoKSwgTVVYOCgzYmgpICovCi0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgzMSwgcGFybSk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxNywgcGFybSk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgzYiwgcGFybSk7Ci0JfQotCS8qIE1XOSAoMjFoKSAqLwotCWlmIChpbXV4X2lzX3NtaXhlciB8fCAhaXNfYWFfcGF0aF9tdXRlKGNvZGVjKSkKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDIxLCBBQ19QV1JTVF9EMCk7Ci0JZWxzZQotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MjEsIEFDX1BXUlNUX0QzKTsKLX0KLQogLyoKICAqIHBpbiBmaXgtdXAKICAqLwpAQCAtMTU0MCw4ICsxMTI0LDYgQEAKIAkJc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQyMDAyUF9pbml0X3ZlcmJzOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7Ci0KLQlzcGVjLT5zZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZSA9ICBzZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZV92dDIwMDJQOwogCXJldHVybiAwOwogfQogCkBAIC0xNTU1LDgxICsxMTM3LDYgQEAKIAl7IH0KIH07CiAKLXN0YXRpYyB2b2lkIHNldF93aWRnZXRzX3Bvd2VyX3N0YXRlX3Z0MTgxMihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3QgdmlhX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQl1bnNpZ25lZCBpbnQgcGFybTsKLQl1bnNpZ25lZCBpbnQgcHJlc2VudDsKLQkvKiBpbnB1dHMgKi8KLQkvKiBQVyA1LzYvNyAoMjloLzJhaC8yYmgpICovCi0JcGFybSA9IEFDX1BXUlNUX0QzOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MjksICZwYXJtKTsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDJhLCAmcGFybSk7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyYiwgJnBhcm0pOwotCXBhcm0gPSBBQ19QV1JTVF9EMDsKLQkvKiBNVVgxMC8xMSAoMWVoLzFmaCksIEFJVyAwLzEgKDEwaC8xMWgpICovCi0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFlLCBwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MWYsIHBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxMCwgcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDExLCBwYXJtKTsKLQotCS8qIG91dHB1dHMgKi8KLQkvKiBBT1cwICg4aCkqLwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHg4LCBBQ19QV1JTVF9EMCk7Ci0KLQkvKiBQVzQgKDI4aCksIE1XNCAoMThoKSwgTVVYNCgzOGgpICovCi0JcGFybSA9IEFDX1BXUlNUX0QzOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MjgsICZwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTgsIHBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgzOCwgcGFybSk7Ci0KLQkvKiBQVzEgKDI1aCksIE1XMSAoMTVoKSwgTVVYMSgzNWgpLCBBT1cxICg5aCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyNSwgJnBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxNSwgcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDM1LCBwYXJtKTsKLQlpZiAoc3BlYy0+Z2VuLmluZGVwX2hwX2VuYWJsZWQpCi0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHg5LCBBQ19QV1JTVF9EMCk7Ci0KLQkvKiBJbnRlcm5hbCBTcGVha2VyICovCi0JLyogUFcwICgyNGgpLCBNVzAoMTRoKSwgTVVYMCgzNGgpICovCi0JcHJlc2VudCA9IHNuZF9oZGFfamFja19kZXRlY3QoY29kZWMsIDB4MjUpOwotCi0JcGFybSA9IEFDX1BXUlNUX0QzOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MjQsICZwYXJtKTsKLQlpZiAocHJlc2VudCkgewotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTQsIEFDX1BXUlNUX0QzKTsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDM0LCBBQ19QV1JTVF9EMyk7Ci0JfSBlbHNlIHsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDE0LCBBQ19QV1JTVF9EMCk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgzNCwgQUNfUFdSU1RfRDApOwotCX0KLQotCi0JLyogTW9ubyBPdXQgKi8KLQkvKiBQVzEzICgzMWgpLCBNVzEzKDFjaCksIE1VWDEzKDNjaCksIE1XMTQoM2VoKSAqLwotCXByZXNlbnQgPSBzbmRfaGRhX2phY2tfZGV0ZWN0KGNvZGVjLCAweDI4KTsKLQotCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDMxLCAmcGFybSk7Ci0JaWYgKHByZXNlbnQpIHsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDFjLCBBQ19QV1JTVF9EMyk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgzYywgQUNfUFdSU1RfRDMpOwotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4M2UsIEFDX1BXUlNUX0QzKTsKLQl9IGVsc2UgewotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MWMsIEFDX1BXUlNUX0QwKTsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDNjLCBBQ19QV1JTVF9EMCk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgzZSwgQUNfUFdSU1RfRDApOwotCX0KLQotCS8qIFBXMTUgKDMzaCksIE1XMTUgKDFkaCksIE1VWDE1KDNkaCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgzMywgJnBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxZCwgcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDNkLCBwYXJtKTsKLQotfQotCiAvKiBwYXRjaCBmb3IgdnQxODEyICovCiBzdGF0aWMgaW50IHBhdGNoX3Z0MTgxMihzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKQEAgLTE2NTYsOCArMTE2Myw2IEBACiAJc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdICA9IHZ0MTgxMl9pbml0X3ZlcmJzOwogCiAJY29kZWMtPnBhdGNoX29wcyA9IHZpYV9wYXRjaF9vcHM7Ci0KLQlzcGVjLT5zZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZSA9ICBzZXRfd2lkZ2V0c19wb3dlcl9zdGF0ZV92dDE4MTI7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE2NzMsODQgKzExNzgsNiBAQAogCXsgfQogfTsKIAotc3RhdGljIHZvaWQgc2V0X3dpZGdldHNfcG93ZXJfc3RhdGVfdnQzNDc2KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQotewotCXN0cnVjdCB2aWFfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWludCBpbXV4X2lzX3NtaXhlcjsKLQl1bnNpZ25lZCBpbnQgcGFybSwgcGFybTI7Ci0JLyogTVVYMTAgKDFlaCkgPSBzdGVyZW8gbWl4ZXIgKi8KLQlpbXV4X2lzX3NtaXhlciA9Ci0Jc25kX2hkYV9jb2RlY19yZWFkKGNvZGVjLCAweDFlLCAwLCBBQ19WRVJCX0dFVF9DT05ORUNUX1NFTCwgMHgwMCkgPT0gNDsKLQkvKiBpbnB1dHMgKi8KLQkvKiBQVyA1LzYvNyAoMjloLzJhaC8yYmgpICovCi0JcGFybSA9IEFDX1BXUlNUX0QzOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MjksICZwYXJtKTsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDJhLCAmcGFybSk7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyYiwgJnBhcm0pOwotCWlmIChpbXV4X2lzX3NtaXhlcikKLQkJcGFybSA9IEFDX1BXUlNUX0QwOwotCS8qIE1VWDEwLzExICgxZWgvMWZoKSwgQUlXIDAvMSAoMTBoLzExaCkgKi8KLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MWUsIHBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxZiwgcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDEwLCBwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MTEsIHBhcm0pOwotCi0JLyogb3V0cHV0cyAqLwotCS8qIFBXMyAoMjdoKSwgTVczKDM3aCksIEFPVzMgKGJoKSAqLwotCWlmIChzcGVjLT5jb2RlY190eXBlID09IFZUMTcwNUNGKSB7Ci0JCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDI3LCBwYXJtKTsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDM3LCBwYXJtKTsKLQl9CWVsc2UgewotCQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0JCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MjcsICZwYXJtKTsKLQkJdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDM3LCBwYXJtKTsKLQl9Ci0KLQkvKiBQVzIgKDI2aCksIE1XMigzNmgpLCBBT1cyIChhaCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyNiwgJnBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgzNiwgcGFybSk7Ci0JaWYgKHNtYXJ0NTFfZW5hYmxlZChjb2RlYykpIHsKLQkJLyogUFc3KDJiaCksIE1XNygzYmgpLCBNVVg3KDFCaCkgKi8KLQkJc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyYiwgJnBhcm0pOwotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4M2IsIHBhcm0pOwotCQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MWIsIHBhcm0pOwotCX0KLQl1cGRhdGVfY29udl9wb3dlcl9zdGF0ZShjb2RlYywgMHhhLCBwYXJtLCAyKTsKLQotCS8qIFBXMSAoMjVoKSwgTVcxKDM1aCksIEFPVzEgKDloKSAqLwotCXBhcm0gPSBBQ19QV1JTVF9EMzsKLQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDI1LCAmcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDM1LCBwYXJtKTsKLQlpZiAoc21hcnQ1MV9lbmFibGVkKGNvZGVjKSkgewotCQkvKiBQVzYoMmFoKSwgTVc2KDNhaCksIE1VWDYoMWFoKSAqLwotCQlzZXRfcGluX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDJhLCAmcGFybSk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgzYSwgcGFybSk7Ci0JCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgxYSwgcGFybSk7Ci0JfQotCXVwZGF0ZV9jb252X3Bvd2VyX3N0YXRlKGNvZGVjLCAweDksIHBhcm0sIDEpOwotCi0JLyogUFc0ICgyOGgpLCBNVzQgKDM4aCksIE1VWDQoMThoKSwgQU9XMyhiaCkvQU9XMCg4aCkgKi8KLQlwYXJtID0gQUNfUFdSU1RfRDM7Ci0Jc2V0X3Bpbl9wb3dlcl9zdGF0ZShjb2RlYywgMHgyOCwgJnBhcm0pOwotCXVwZGF0ZV9wb3dlcl9zdGF0ZShjb2RlYywgMHgzOCwgcGFybSk7Ci0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDE4LCBwYXJtKTsKLQlpZiAoc3BlYy0+Z2VuLmluZGVwX2hwX2VuYWJsZWQpCi0JCXVwZGF0ZV9jb252X3Bvd2VyX3N0YXRlKGNvZGVjLCAweGIsIHBhcm0sIDMpOwotCXBhcm0yID0gcGFybTsgLyogZm9yIHBpbiAweDBiICovCi0KLQkvKiBQVzAgKDI0aCksIE1XMCgzNGgpLCBNVzkoM2ZoKSwgQU9XMCAoOGgpICovCi0JcGFybSA9IEFDX1BXUlNUX0QzOwotCXNldF9waW5fcG93ZXJfc3RhdGUoY29kZWMsIDB4MjQsICZwYXJtKTsKLQl1cGRhdGVfcG93ZXJfc3RhdGUoY29kZWMsIDB4MzQsIHBhcm0pOwotCWlmICghc3BlYy0+Z2VuLmluZGVwX2hwX2VuYWJsZWQgJiYgcGFybTIgIT0gQUNfUFdSU1RfRDMpCi0JCXBhcm0gPSBwYXJtMjsKLQl1cGRhdGVfY29udl9wb3dlcl9zdGF0ZShjb2RlYywgMHg4LCBwYXJtLCAwKTsKLQkvKiBNVzkgKDIxaCksIE13MiAoMWFoKSwgQU9XMCAoOGgpICovCi0JdXBkYXRlX3Bvd2VyX3N0YXRlKGNvZGVjLCAweDNmLCBpbXV4X2lzX3NtaXhlciA/IEFDX1BXUlNUX0QwIDogcGFybSk7Ci19Ci0KIHN0YXRpYyBpbnQgcGF0Y2hfdnQzNDc2KHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjKQogewogCXN0cnVjdCB2aWFfc3BlYyAqc3BlYzsKQEAgLTE3NzQsOSArMTIwMSw2IEBACiAJc3BlYy0+aW5pdF92ZXJic1tzcGVjLT5udW1faXZlcmJzKytdID0gdnQzNDc2X2luaXRfdmVyYnM7CiAKIAljb2RlYy0+cGF0Y2hfb3BzID0gdmlhX3BhdGNoX29wczsKLQotCXNwZWMtPnNldF93aWRnZXRzX3Bvd2VyX3N0YXRlID0gc2V0X3dpZGdldHNfcG93ZXJfc3RhdGVfdnQzNDc2OwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4ODQsMjMgKzEzMDgsMTEgQEAKIAogTU9EVUxFX0FMSUFTKCJzbmQtaGRhLWNvZGVjLWlkOjExMDYqIik7CiAKLXN0YXRpYyBzdHJ1Y3QgaGRhX2NvZGVjX3ByZXNldF9saXN0IHZpYV9saXN0ID0geworc3RhdGljIHN0cnVjdCBoZGFfY29kZWNfZHJpdmVyIHZpYV9kcml2ZXIgPSB7CiAJLnByZXNldCA9IHNuZF9oZGFfcHJlc2V0X3ZpYSwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKIH07CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVklBIEhELWF1ZGlvIGNvZGVjIik7CiAKLXN0YXRpYyBpbnQgX19pbml0IHBhdGNoX3ZpYV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHNuZF9oZGFfYWRkX2NvZGVjX3ByZXNldCgmdmlhX2xpc3QpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgcGF0Y2hfdmlhX2V4aXQodm9pZCkKLXsKLQlzbmRfaGRhX2RlbGV0ZV9jb2RlY19wcmVzZXQoJnZpYV9saXN0KTsKLX0KLQotbW9kdWxlX2luaXQocGF0Y2hfdmlhX2luaXQpCi1tb2R1bGVfZXhpdChwYXRjaF92aWFfZXhpdCkKK21vZHVsZV9oZGFfY29kZWNfZHJpdmVyKHZpYV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS90aGlua3BhZF9oZWxwZXIuYyBiL3NvdW5kL3BjaS9oZGEvdGhpbmtwYWRfaGVscGVyLmMKaW5kZXggNmJhMGI1NS4uMGE0YWQ1ZiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS90aGlua3BhZF9oZWxwZXIuYworKysgYi9zb3VuZC9wY2kvaGRhL3RoaW5rcGFkX2hlbHBlci5jCkBAIC0yMSw3ICsyMSw3IEBACiBzdGF0aWMgYm9vbCBpc190aGlua3BhZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlib29sIGZvdW5kID0gZmFsc2U7Ci0JaWYgKGNvZGVjLT5zdWJzeXN0ZW1faWQgPj4gMTYgIT0gMHgxN2FhKQorCWlmIChjb2RlYy0+Y29yZS5zdWJzeXN0ZW1faWQgPj4gMTYgIT0gMHgxN2FhKQogCQlyZXR1cm4gZmFsc2U7CiAJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9kZXZpY2VzKCJMRU4wMDY4IiwgYWNwaV9jaGVja19jYiwgJmZvdW5kLCBOVUxMKSkgJiYgZm91bmQpCiAJCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2ljZTE3MTIvd3RtLmMgYi9zb3VuZC9wY2kvaWNlMTcxMi93dG0uYwppbmRleCBiY2YzMGEzLi45OTA2MTE5IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvaWNlMTcxMi93dG0uYworKysgYi9zb3VuZC9wY2kvaWNlMTcxMi93dG0uYwpAQCAtMjksMTIgKzI5LDE5IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC90bHYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJpY2UxNzEyLmgiCiAjaW5jbHVkZSAiZW52eTI0aHQuaCIKICNpbmNsdWRlICJ3dG0uaCIKICNpbmNsdWRlICJzdGFjOTQ2eC5oIgogCitzdHJ1Y3Qgd3RtX3NwZWMgeworCS8qIHJhdGUgY2hhbmdlIG5lZWRzIGF0b21pYyBtdXRlL3VubXV0ZSBvZiBhbGwgZGFjcyovCisJc3RydWN0IG11dGV4IG11dGVfbXV0ZXg7Cit9OworCiAKIC8qCiAgKgkyKkFEQyA2KkRBQyBubzEgcmluZ2J1ZmZlciByL3cgb24gaTJjIGJ1cwpAQCAtNjgsMTUgKzc1LDY1IEBACiAvKgogICoJREFDIG11dGUgY29udHJvbAogICovCitzdGF0aWMgdm9pZCBzdGFjOTQ2MF9kYWNfbXV0ZV9hbGwoc3RydWN0IHNuZF9pY2UxNzEyICppY2UsIHVuc2lnbmVkIGNoYXIgbXV0ZSwKKwkJCQl1bnNpZ25lZCBzaG9ydCBpbnQgKmNoYW5nZV9tYXNrKQoreworCXVuc2lnbmVkIGNoYXIgbmV3LCBvbGQ7CisJaW50IGlkLCBpZHgsIGNoYW5nZTsKKworCS8qc3RhYzk0NjAgMSovCisJZm9yIChpZCA9IDA7IGlkIDwgNzsgaWQrKykgeworCQlpZiAoKmNoYW5nZV9tYXNrICYgKDB4MDEgPDwgaWQpKSB7CisJCQlpZiAoaWQgPT0gMCkKKwkJCQlpZHggPSBTVEFDOTQ2WF9NQVNURVJfVk9MVU1FOworCQkJZWxzZQorCQkJCWlkeCA9IFNUQUM5NDZYX0xGX1ZPTFVNRSAtIDEgKyBpZDsKKwkJCW9sZCA9IHN0YWM5NDYwX2dldChpY2UsIGlkeCk7CisJCQluZXcgPSAofm11dGUgPDwgNyAmIDB4ODApIHwgKG9sZCAmIH4weDgwKTsKKwkJCWNoYW5nZSA9IChuZXcgIT0gb2xkKTsKKwkJCWlmIChjaGFuZ2UpIHsKKwkJCQlzdGFjOTQ2MF9wdXQoaWNlLCBpZHgsIG5ldyk7CisJCQkJKmNoYW5nZV9tYXNrID0gKmNoYW5nZV9tYXNrIHwgKDB4MDEgPDwgaWQpOworCQkJfSBlbHNlIHsKKwkJCQkqY2hhbmdlX21hc2sgPSAqY2hhbmdlX21hc2sgJiB+KDB4MDEgPDwgaWQpOworCQkJfQorCQl9CisJfQorCisJLypzdGFjOTQ2MCAyKi8KKwlmb3IgKGlkID0gMDsgaWQgPCAzOyBpZCsrKSB7CisJCWlmICgqY2hhbmdlX21hc2sgJiAoMHgwMSA8PCAoaWQgKyA3KSkpIHsKKwkJCWlmIChpZCA9PSAwKQorCQkJCWlkeCA9IFNUQUM5NDZYX01BU1RFUl9WT0xVTUU7CisJCQllbHNlCisJCQkJaWR4ID0gU1RBQzk0NlhfTEZfVk9MVU1FIC0gMSArIGlkOworCQkJb2xkID0gc3RhYzk0NjBfMl9nZXQoaWNlLCBpZHgpOworCQkJbmV3ID0gKH5tdXRlIDw8IDcgJiAweDgwKSB8IChvbGQgJiB+MHg4MCk7CisJCQljaGFuZ2UgPSAobmV3ICE9IG9sZCk7CisJCQlpZiAoY2hhbmdlKSB7CisJCQkJc3RhYzk0NjBfMl9wdXQoaWNlLCBpZHgsIG5ldyk7CisJCQkJKmNoYW5nZV9tYXNrID0gKmNoYW5nZV9tYXNrIHwgKDB4MDEgPDwgaWQpOworCQkJfSBlbHNlIHsKKwkJCQkqY2hhbmdlX21hc2sgPSAqY2hhbmdlX21hc2sgJiB+KDB4MDEgPDwgaWQpOworCQkJfQorCQl9CisJfQorfQorCisKKwogI2RlZmluZSBzdGFjOTQ2MF9kYWNfbXV0ZV9pbmZvCQlzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZvCiAKIHN0YXRpYyBpbnQgc3RhYzk0NjBfZGFjX211dGVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQogewogCXN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXN0cnVjdCB3dG1fc3BlYyAqc3BlYyA9IGljZS0+c3BlYzsKIAl1bnNpZ25lZCBjaGFyIHZhbDsKIAlpbnQgaWR4LCBpZDsKIAorCW11dGV4X2xvY2soJnNwZWMtPm11dGVfbXV0ZXgpOworCiAJaWYgKGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKSB7CiAJCWlkeCA9IFNUQUM5NDZYX01BU1RFUl9WT0xVTUU7CiAJCWlkID0gMDsKQEAgLTg5LDYgKzE0Niw4IEBACiAJZWxzZQogCQl2YWwgPSBzdGFjOTQ2MF8yX2dldChpY2UsIGlkeCAtIDYpOwogCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gKH52YWwgPj4gNykgJiAweDE7CisKKwltdXRleF91bmxvY2soJnNwZWMtPm11dGVfbXV0ZXgpOwogCXJldHVybiAwOwogfQogCkBAIC0zMzgsOCArMzk3LDE0IEBACiAvKgogICogTUlDIC8gTElORSBzd2l0Y2ggZm9uY3Rpb24KICAqLworc3RhdGljIGludCBzdGFjOTQ2MF9taWNfc3dfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGV4dHNbMl0gPSB7ICJMaW5lIEluIiwgIk1pYyIgfTsKIAotI2RlZmluZSBzdGFjOTQ2MF9taWNfc3dfaW5mbwkJc25kX2N0bF9ib29sZWFuX21vbm9faW5mbworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyh1aW5mbywgMSwgMiwgdGV4dHMpOworfQorCiAKIHN0YXRpYyBpbnQgc3RhYzk0NjBfbWljX3N3X2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKIAkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKQEAgLTM1Myw3ICs0MTgsNyBAQAogCQl2YWwgPSBzdGFjOTQ2MF9nZXQoaWNlLCBTVEFDOTQ2WF9HRU5FUkFMX1BVUlBPU0UpOwogCWVsc2UKIAkJdmFsID0gc3RhYzk0NjBfMl9nZXQoaWNlLCBTVEFDOTQ2WF9HRU5FUkFMX1BVUlBPU0UpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gfnZhbD4+NyAmIDB4MTsKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gKHZhbCA+PiA3KSAmIDB4MTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzY5LDcgKzQzNCw3IEBACiAJCW9sZCA9IHN0YWM5NDYwX2dldChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSk7CiAJZWxzZQogCQlvbGQgPSBzdGFjOTQ2MF8yX2dldChpY2UsIFNUQUM5NDZYX0dFTkVSQUxfUFVSUE9TRSk7Ci0JbmV3ID0gKH51Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA8PCA3ICYgMHg4MCkgfCAob2xkICYgfjB4ODApOworCW5ldyA9ICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdIDw8IDcgJiAweDgwKSB8IChvbGQgJiB+MHg4MCk7CiAJY2hhbmdlID0gKG5ldyAhPSBvbGQpOwogCWlmIChjaGFuZ2UpIHsKIAkJaWYgKGlkID09IDApCkBAIC0zODAsMTcgKzQ0NSw2MyBAQAogCXJldHVybiBjaGFuZ2U7CiB9CiAKKworLyoKKyAqIEhhbmRsZXIgZm9yIHNldHRpbmcgY29ycmVjdCBjb2RlYyByYXRlIC0gY2FsbGVkIHdoZW4gcmF0ZSBjaGFuZ2UgaXMgZGV0ZWN0ZWQKKyAqLworc3RhdGljIHZvaWQgc3RhYzk0NjBfc2V0X3JhdGVfdmFsKHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIG9sZCwgbmV3OworCXVuc2lnbmVkIHNob3J0IGludCBjaGFuZ2VkOworCXN0cnVjdCB3dG1fc3BlYyAqc3BlYyA9IGljZS0+c3BlYzsKKworCWlmIChyYXRlID09IDApICAvKiBubyBoaW50IC0gUy9QRElGIGlucHV0IGlzIG1hc3Rlciwgc2ltcGx5IHJldHVybiAqLworCQlyZXR1cm47CisJZWxzZSBpZiAocmF0ZSA8PSA0ODAwMCkKKwkJbmV3ID0gMHgwODsgICAgIC8qIDI1NngsIGJhc2UgcmF0ZSBtb2RlICovCisJZWxzZSBpZiAocmF0ZSA8PSA5NjAwMCkKKwkJbmV3ID0gMHgxMTsgICAgIC8qIDI1NngsIG1pZCByYXRlIG1vZGUgKi8KKwllbHNlCisJCW5ldyA9IDB4MTI7ICAgICAvKiAxMjh4LCBoaWdoIHJhdGUgbW9kZSAqLworCisJb2xkID0gc3RhYzk0NjBfZ2V0KGljZSwgU1RBQzk0NlhfTUFTVEVSX0NMT0NLSU5HKTsKKwlpZiAob2xkID09IG5ldykKKwkJcmV0dXJuOworCS8qIGNoYW5nZSBkZXRlY3RlZCwgc2V0dGluZyBtYXN0ZXIgY2xvY2ssIG11dGluZyBmaXJzdCAqLworCS8qIGR1ZSB0byBwb3NzaWJsZSBjb25mbGljdHMgd2l0aCBtdXRlIGNvbnRyb2xzIC0gbXV0ZXhpbmcgKi8KKwltdXRleF9sb2NrKCZzcGVjLT5tdXRlX211dGV4KTsKKwkvKiB3ZSBoYXZlIHRvIHJlbWVtYmVyIGN1cnJlbnQgbXV0ZSBzdGF0dXMgZm9yIGVhY2ggREFDICovCisJY2hhbmdlZCA9IDB4RkZGRjsKKwlzdGFjOTQ2MF9kYWNfbXV0ZV9hbGwoaWNlLCAwLCAmY2hhbmdlZCk7CisJLypwcmludGsoS0VSTl9ERUJVRyAiUmF0ZSBjaGFuZ2U6ICVkLCBuZXcgTUM6IDB4JTAyeFxuIiwgcmF0ZSwgbmV3KTsqLworCXN0YWM5NDYwX3B1dChpY2UsIFNUQUM5NDZYX01BU1RFUl9DTE9DS0lORywgbmV3KTsKKwlzdGFjOTQ2MF8yX3B1dChpY2UsIFNUQUM5NDZYX01BU1RFUl9DTE9DS0lORywgbmV3KTsKKwl1ZGVsYXkoMTApOworCS8qIHVubXV0aW5nIC0gb25seSBvcmlnaW5hbGx5IHVubXV0ZWQgZGFjcyAtCisJKiBpLmUuIHRob3NlIGNoYW5nZWQgd2hlbiBtdXRpbmcgKi8KKwlzdGFjOTQ2MF9kYWNfbXV0ZV9hbGwoaWNlLCAxLCAmY2hhbmdlZCk7CisJbXV0ZXhfdW5sb2NrKCZzcGVjLT5tdXRlX211dGV4KTsKK30KKworCisvKkxpbWl0cyB2YWx1ZSBpbiBkQiBmb3IgZmFkZXIqLworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRiX3NjYWxlX2RhYywgLTE5MTI1LCA3NSwgMCk7CitzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGJfc2NhbGVfYWRjLCAwLCAxNTAsIDApOworCiAvKgogICogQ29udHJvbCB0YWJzCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzdGFjOTY0MF9jb250cm9sc1tdID0gewogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCQkgICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKIAkJLm5hbWUgPSAiTWFzdGVyIFBsYXliYWNrIFN3aXRjaCIsCiAJCS5pbmZvID0gc3RhYzk0NjBfZGFjX211dGVfaW5mbywKIAkJLmdldCA9IHN0YWM5NDYwX2RhY19tdXRlX2dldCwKIAkJLnB1dCA9IHN0YWM5NDYwX2RhY19tdXRlX3B1dCwKLQkJLnByaXZhdGVfdmFsdWUgPSAxCisJCS5wcml2YXRlX3ZhbHVlID0gMSwKKwkJLnRsdiA9IHsgLnAgPSBkYl9zY2FsZV9kYWMgfQogCX0sCiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKQEAgLTQwMiw3ICs1MTMsNyBAQAogCX0sCiAJewogCQkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKLQkJLm5hbWUgPSAiTUlDL0xpbmUgc3dpdGNoIiwKKwkJLm5hbWUgPSAiTUlDL0xpbmUgSW5wdXQgRW51bSIsCiAJCS5jb3VudCA9IDIsCiAJCS5pbmZvID0gc3RhYzk0NjBfbWljX3N3X2luZm8sCiAJCS5nZXQgPSBzdGFjOTQ2MF9taWNfc3dfZ2V0LApAQCAtNDE5LDExICs1MzAsMTUgQEAKIAl9LAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCQkgICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKKwogCQkubmFtZSA9ICJEQUMgVm9sdW1lIiwKIAkJLmNvdW50ID0gOCwKIAkJLmluZm8gPSBzdGFjOTQ2MF9kYWNfdm9sX2luZm8sCiAJCS5nZXQgPSBzdGFjOTQ2MF9kYWNfdm9sX2dldCwKIAkJLnB1dCA9IHN0YWM5NDYwX2RhY192b2xfcHV0LAorCQkudGx2ID0geyAucCA9IGRiX3NjYWxlX2RhYyB9CiAJfSwKIAl7CiAJCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLApAQCAtNDM1LDEyICs1NTAsMTUgQEAKIAl9LAogCXsKIAkJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJCS5hY2Nlc3MgPSAoU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1JFQURXUklURSB8CisJCQkgICAgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1RMVl9SRUFEKSwKKwogCQkubmFtZSA9ICJBREMgVm9sdW1lIiwKIAkJLmNvdW50ID0gMiwKIAkJLmluZm8gPSBzdGFjOTQ2MF9hZGNfdm9sX2luZm8sCiAJCS5nZXQgPSBzdGFjOTQ2MF9hZGNfdm9sX2dldCwKIAkJLnB1dCA9IHN0YWM5NDYwX2FkY192b2xfcHV0LAotCisJCS50bHYgPSB7IC5wID0gZGJfc2NhbGVfYWRjIH0KIAl9CiB9OwogCkBAIC00NjMsNDEgKzU4MSw1MyBAQAogCiBzdGF0aWMgaW50IHd0bV9pbml0KHN0cnVjdCBzbmRfaWNlMTcxMiAqaWNlKQogewotCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBzdGFjX2luaXRzX3Byb2RpZ3lbXSA9IHsKKwlzdGF0aWMgdW5zaWduZWQgc2hvcnQgc3RhY19pbml0c193dG1bXSA9IHsKIAkJU1RBQzk0NlhfUkVTRVQsIDAsCisJCVNUQUM5NDZYX01BU1RFUl9DTE9DS0lORywgMHgxMSwKIAkJKHVuc2lnbmVkIHNob3J0KS0xCiAJfTsKIAl1bnNpZ25lZCBzaG9ydCAqcDsKKwlzdHJ1Y3Qgd3RtX3NwZWMgKnNwZWM7CiAKIAkvKldUTSAxOTJNKi8KIAlpY2UtPm51bV90b3RhbF9kYWNzID0gODsKIAlpY2UtPm51bV90b3RhbF9hZGNzID0gNDsKIAlpY2UtPmZvcmNlX3JkbWExID0gMTsKIAorCS8qaW5pdCBtdXRleCBmb3IgZGFjIG11dGUgY29uZmxpY3QqLworCXNwZWMgPSBremFsbG9jKHNpemVvZigqc3BlYyksIEdGUF9LRVJORUwpOworCWlmICghc3BlYykKKwkJcmV0dXJuIC1FTk9NRU07CisJaWNlLT5zcGVjID0gc3BlYzsKKwltdXRleF9pbml0KCZzcGVjLT5tdXRlX211dGV4KTsKKworCiAJLyppbml0aWFsaXplIGNvZGVjKi8KLQlwID0gc3RhY19pbml0c19wcm9kaWd5OworCXAgPSBzdGFjX2luaXRzX3d0bTsKIAlmb3IgKDsgKnAgIT0gKHVuc2lnbmVkIHNob3J0KS0xOyBwICs9IDIpIHsKIAkJc3RhYzk0NjBfcHV0KGljZSwgcFswXSwgcFsxXSk7CiAJCXN0YWM5NDYwXzJfcHV0KGljZSwgcFswXSwgcFsxXSk7CiAJfQorCWljZS0+Z3Bpby5zZXRfcHJvX3JhdGUgPSBzdGFjOTQ2MF9zZXRfcmF0ZV92YWw7CiAJcmV0dXJuIDA7CiB9CiAKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgd3RtX2VlcHJvbVtdID0gewotCTB4NDcsCS8qU1lTQ09ORjogY2xvY2sgMTkyS0h6LCA0QURDLCA4REFDICovCi0JMHg4MCwJLyogQUNMSU5LIDogSTJTICovCi0JMHhmOCwJLyogSTJTOiB2b2w7IDk2aywgMjRiaXQsIDE5MmsgKi8KLQkweGMxCS8qU1BESUY6IG91dC1lbiwgc3BpZGYgZXh0IG91dCovLAotCTB4OWYsCS8qIEdQSU9fRElSICovCi0JMHhmZiwJLyogR1BJT19ESVIxICovCi0JMHg3ZiwJLyogR1BJT19ESVIyICovCi0JMHg5ZiwJLyogR1BJT19NQVNLICovCi0JMHhmZiwJLyogR1BJT19NQVNLMSAqLwotCTB4N2YsCS8qIEdQSU9fTUFTSzIgKi8KLQkweDE2LAkvKiBHUElPX1NUQVRFICovCi0JMHg4MCwJLyogR1BJT19TVEFURTEgKi8KLQkweDAwLAkvKiBHUElPX1NUQVRFMiAqLworCVtJQ0VfRUVQMl9TWVNDT05GXSAgICAgID0gMHg2NywgLypTWVNDT05GOiBjbG9jayAxOTJLSHosIG1wdTQwMSwKKwkJCQkJCQk0QURDLCA4REFDICovCisJW0lDRV9FRVAyX0FDTElOS10gICAgICAgPSAweDgwLCAvKiBBQ0xJTksgOiBJMlMgKi8KKwlbSUNFX0VFUDJfSTJTXSAgICAgICAgICA9IDB4ZjgsIC8qIEkyUzogdm9sOyA5NmssIDI0Yml0LCAxOTJrICovCisJW0lDRV9FRVAyX1NQRElGXSAgICAgICAgPSAweGMxLCAvKlNQRElGOiBvdXQtZW4sIHNwaWRmIGV4dCBvdXQqLworCVtJQ0VfRUVQMl9HUElPX0RJUl0gICAgID0gMHg5ZiwKKwlbSUNFX0VFUDJfR1BJT19ESVIxXSAgICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fRElSMl0gICAgPSAweDdmLAorCVtJQ0VfRUVQMl9HUElPX01BU0tdICAgID0gMHg5ZiwKKwlbSUNFX0VFUDJfR1BJT19NQVNLMV0gICA9IDB4ZmYsCisJW0lDRV9FRVAyX0dQSU9fTUFTSzJdICAgPSAweDdmLAorCVtJQ0VfRUVQMl9HUElPX1NUQVRFXSAgID0gMHgxNiwKKwlbSUNFX0VFUDJfR1BJT19TVEFURTFdICA9IDB4ODAsCisJW0lDRV9FRVAyX0dQSU9fU1RBVEUyXSAgPSAweDAwLAogfTsKIAogCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaW50ZWw4eDAuYyBiL3NvdW5kL3BjaS9pbnRlbDh4MC5jCmluZGV4IDJjNTQ4NGUuLjc0OTA2OWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9pbnRlbDh4MC5jCisrKyBiL3NvdW5kL3BjaS9pbnRlbDh4MC5jCkBAIC0xNzk1LDcgKzE3OTUsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IGFjOTdfcXVpcmsgYWM5N19xdWlya3NbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWM5N19xdWlyayBhYzk3X3F1aXJrc1tdID0gewogICAgICAgICB7CiAJCS5zdWJ2ZW5kb3IgPSAweDBlMTEsCiAJCS5zdWJkZXZpY2UgPSAweDAwMGUsCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwppbmRleCBjYTY3Zjg5Li5jYjY2NmM3IDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKQEAgLTYwNDMsMjMgKzYwNDMsMzAgQEAKIAkubWFzayA9IDAKIH07CiAKLXN0YXRpYyBpbnQgc25kX2hkc3BtX3BsYXliYWNrX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCitzdGF0aWMgaW50IHNuZF9oZHNwbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlib29sIHBsYXliYWNrID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwogCiAJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOwotCiAJc25kX3BjbV9zZXRfc3luYyhzdWJzdHJlYW0pOworCXJ1bnRpbWUtPmh3ID0gKHBsYXliYWNrKSA/IHNuZF9oZHNwbV9wbGF5YmFja19zdWJpbmZvIDoKKwkJc25kX2hkc3BtX2NhcHR1cmVfc3ViaW5mbzsKIAorCWlmIChwbGF5YmFjaykgeworCQlpZiAoaGRzcG0tPmNhcHR1cmVfc3Vic3RyZWFtID09IE5VTEwpCisJCQloZHNwbV9zdG9wX2F1ZGlvKGhkc3BtKTsKIAotCXJ1bnRpbWUtPmh3ID0gc25kX2hkc3BtX3BsYXliYWNrX3N1YmluZm87CisJCWhkc3BtLT5wbGF5YmFja19waWQgPSBjdXJyZW50LT5waWQ7CisJCWhkc3BtLT5wbGF5YmFja19zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJfSBlbHNlIHsKKwkJaWYgKGhkc3BtLT5wbGF5YmFja19zdWJzdHJlYW0gPT0gTlVMTCkKKwkJCWhkc3BtX3N0b3BfYXVkaW8oaGRzcG0pOwogCi0JaWYgKGhkc3BtLT5jYXB0dXJlX3N1YnN0cmVhbSA9PSBOVUxMKQotCQloZHNwbV9zdG9wX2F1ZGlvKGhkc3BtKTsKLQotCWhkc3BtLT5wbGF5YmFja19waWQgPSBjdXJyZW50LT5waWQ7Ci0JaGRzcG0tPnBsYXliYWNrX3N1YnN0cmVhbSA9IHN1YnN0cmVhbTsKKwkJaGRzcG0tPmNhcHR1cmVfcGlkID0gY3VycmVudC0+cGlkOworCQloZHNwbS0+Y2FwdHVyZV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CisJfQogCiAJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CiAKQEAgLTYwOTQsMTA4ICs2MTAxLDQyIEBACiAJCQkJJmhkc3BtX2h3X2NvbnN0cmFpbnRzX2FlczMyX3NhbXBsZV9yYXRlcyk7CiAJfSBlbHNlIHsKIAkJc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKLQkJCQlzbmRfaGRzcG1faHdfcnVsZV9yYXRlX291dF9jaGFubmVscywgaGRzcG0sCisJCQkJKHBsYXliYWNrID8KKwkJCQkgc25kX2hkc3BtX2h3X3J1bGVfcmF0ZV9vdXRfY2hhbm5lbHMgOgorCQkJCSBzbmRfaGRzcG1faHdfcnVsZV9yYXRlX2luX2NoYW5uZWxzKSwgaGRzcG0sCiAJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAtMSk7CiAJfQogCiAJc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsCi0JCQlzbmRfaGRzcG1faHdfcnVsZV9vdXRfY2hhbm5lbHMsIGhkc3BtLAorCQkJKHBsYXliYWNrID8gc25kX2hkc3BtX2h3X3J1bGVfb3V0X2NoYW5uZWxzIDoKKwkJCSBzbmRfaGRzcG1faHdfcnVsZV9pbl9jaGFubmVscyksIGhkc3BtLAogCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAtMSk7CiAKIAlzbmRfcGNtX2h3X3J1bGVfYWRkKHJ1bnRpbWUsIDAsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywKLQkJCXNuZF9oZHNwbV9od19ydWxlX291dF9jaGFubmVsc19yYXRlLCBoZHNwbSwKKwkJCShwbGF5YmFjayA/IHNuZF9oZHNwbV9od19ydWxlX291dF9jaGFubmVsc19yYXRlIDoKKwkJCSBzbmRfaGRzcG1faHdfcnVsZV9pbl9jaGFubmVsc19yYXRlKSwgaGRzcG0sCiAJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgLTEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc25kX2hkc3BtX3BsYXliYWNrX3JlbGVhc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCitzdGF0aWMgaW50IHNuZF9oZHNwbV9yZWxlYXNlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQogewogCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7CisJYm9vbCBwbGF5YmFjayA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKIAogCXNwaW5fbG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKIAotCWhkc3BtLT5wbGF5YmFja19waWQgPSAtMTsKLQloZHNwbS0+cGxheWJhY2tfc3Vic3RyZWFtID0gTlVMTDsKLQotCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBzbmRfaGRzcG1fY2FwdHVyZV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBoZHNwbSAqaGRzcG0gPSBzbmRfcGNtX3N1YnN0cmVhbV9jaGlwKHN1YnN0cmVhbSk7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQotCXNwaW5fbG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKLQlzbmRfcGNtX3NldF9zeW5jKHN1YnN0cmVhbSk7Ci0JcnVudGltZS0+aHcgPSBzbmRfaGRzcG1fY2FwdHVyZV9zdWJpbmZvOwotCi0JaWYgKGhkc3BtLT5wbGF5YmFja19zdWJzdHJlYW0gPT0gTlVMTCkKLQkJaGRzcG1fc3RvcF9hdWRpbyhoZHNwbSk7Ci0KLQloZHNwbS0+Y2FwdHVyZV9waWQgPSBjdXJyZW50LT5waWQ7Ci0JaGRzcG0tPmNhcHR1cmVfc3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7Ci0KLQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbXNiaXRzKHJ1bnRpbWUsIDAsIDMyLCAyNCk7Ci0Jc25kX3BjbV9od19jb25zdHJhaW50X3BvdzIocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFKTsKLQotCXN3aXRjaCAoaGRzcG0tPmlvX3R5cGUpIHsKLQljYXNlIEFJTzoKLQljYXNlIFJheURBVDoKLQkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAotCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RfU0laRSwKLQkJCQkJICAgICAzMiwgNDA5Nik7Ci0JCXNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGltZSwKLQkJCQkJICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fQlVGRkVSX1NJWkUsCi0JCQkJCSAgICAgMTYzODQsIDE2Mzg0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsCi0JCQkJCSAgICAgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRF9TSVpFLAotCQkJCQkgICAgIDY0LCA4MTkyKTsKLQkJc25kX3BjbV9od19jb25zdHJhaW50X21pbm1heChydW50aW1lLAotCQkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTLAotCQkJCQkgICAgIDIsIDIpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoQUVTMzIgPT0gaGRzcG0tPmlvX3R5cGUpIHsKLQkJcnVudGltZS0+aHcucmF0ZXMgfD0gU05EUlZfUENNX1JBVEVfS05PVDsKLQkJc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCi0JCQkJJmhkc3BtX2h3X2NvbnN0cmFpbnRzX2FlczMyX3NhbXBsZV9yYXRlcyk7CisJaWYgKHBsYXliYWNrKSB7CisJCWhkc3BtLT5wbGF5YmFja19waWQgPSAtMTsKKwkJaGRzcG0tPnBsYXliYWNrX3N1YnN0cmVhbSA9IE5VTEw7CiAJfSBlbHNlIHsKLQkJc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKLQkJCQlzbmRfaGRzcG1faHdfcnVsZV9yYXRlX2luX2NoYW5uZWxzLCBoZHNwbSwKLQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsIC0xKTsKKwkJaGRzcG0tPmNhcHR1cmVfcGlkID0gLTE7CisJCWhkc3BtLT5jYXB0dXJlX3N1YnN0cmVhbSA9IE5VTEw7CiAJfQogCi0Jc25kX3BjbV9od19ydWxlX2FkZChydW50aW1lLCAwLCBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsCi0JCQlzbmRfaGRzcG1faHdfcnVsZV9pbl9jaGFubmVscywgaGRzcG0sCi0JCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsIC0xKTsKLQotCXNuZF9wY21faHdfcnVsZV9hZGQocnVudGltZSwgMCwgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLAotCQkJc25kX2hkc3BtX2h3X3J1bGVfaW5fY2hhbm5lbHNfcmF0ZSwgaGRzcG0sCi0JCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwgLTEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc25kX2hkc3BtX2NhcHR1cmVfcmVsZWFzZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3QgaGRzcG0gKmhkc3BtID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCi0Jc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOwotCi0JaGRzcG0tPmNhcHR1cmVfcGlkID0gLTE7Ci0JaGRzcG0tPmNhcHR1cmVfc3Vic3RyZWFtID0gTlVMTDsKLQogCXNwaW5fdW5sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY0MTMsMjEgKzYzNTQsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9oZHNwbV9wbGF5YmFja19vcHMgPSB7Ci0JLm9wZW4gPSBzbmRfaGRzcG1fcGxheWJhY2tfb3BlbiwKLQkuY2xvc2UgPSBzbmRfaGRzcG1fcGxheWJhY2tfcmVsZWFzZSwKLQkuaW9jdGwgPSBzbmRfaGRzcG1faW9jdGwsCi0JLmh3X3BhcmFtcyA9IHNuZF9oZHNwbV9od19wYXJhbXMsCi0JLmh3X2ZyZWUgPSBzbmRfaGRzcG1faHdfZnJlZSwKLQkucHJlcGFyZSA9IHNuZF9oZHNwbV9wcmVwYXJlLAotCS50cmlnZ2VyID0gc25kX2hkc3BtX3RyaWdnZXIsCi0JLnBvaW50ZXIgPSBzbmRfaGRzcG1faHdfcG9pbnRlciwKLQkucGFnZSA9IHNuZF9wY21fc2didWZfb3BzX3BhZ2UsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNuZF9oZHNwbV9jYXB0dXJlX29wcyA9IHsKLQkub3BlbiA9IHNuZF9oZHNwbV9jYXB0dXJlX29wZW4sCi0JLmNsb3NlID0gc25kX2hkc3BtX2NhcHR1cmVfcmVsZWFzZSwKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc25kX2hkc3BtX29wcyA9IHsKKwkub3BlbiA9IHNuZF9oZHNwbV9vcGVuLAorCS5jbG9zZSA9IHNuZF9oZHNwbV9yZWxlYXNlLAogCS5pb2N0bCA9IHNuZF9oZHNwbV9pb2N0bCwKIAkuaHdfcGFyYW1zID0gc25kX2hkc3BtX2h3X3BhcmFtcywKIAkuaHdfZnJlZSA9IHNuZF9oZHNwbV9od19mcmVlLApAQCAtNjUyMSw5ICs2NDUwLDkgQEAKIAlzdHJjcHkocGNtLT5uYW1lLCBoZHNwbS0+Y2FyZF9uYW1lKTsKIAogCXNuZF9wY21fc2V0X29wcyhwY20sIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCi0JCQkmc25kX2hkc3BtX3BsYXliYWNrX29wcyk7CisJCQkmc25kX2hkc3BtX29wcyk7CiAJc25kX3BjbV9zZXRfb3BzKHBjbSwgU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFLAotCQkJJnNuZF9oZHNwbV9jYXB0dXJlX29wcyk7CisJCQkmc25kX2hkc3BtX29wcyk7CiAKIAlwY20tPmluZm9fZmxhZ3MgPSBTTkRSVl9QQ01fSU5GT19KT0lOVF9EVVBMRVg7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS92aWE4Mnh4LmMgYi9zb3VuZC9wY2kvdmlhODJ4eC5jCmluZGV4IDg2MjIyODMuLjNkZDAzOGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS92aWE4Mnh4LmMKKysrIGIvc291bmQvcGNpL3ZpYTgyeHguYwpAQCAtMTgxMiw3ICsxODEyLDcgQEAKIAljaGlwLT5hYzk3ID0gTlVMTDsKIH0KIAotc3RhdGljIHN0cnVjdCBhYzk3X3F1aXJrIGFjOTdfcXVpcmtzW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFjOTdfcXVpcmsgYWM5N19xdWlya3NbXSA9IHsKIAl7CiAJCS5zdWJ2ZW5kb3IgPSAweDExMDYsCiAJCS5zdWJkZXZpY2UgPSAweDQxNjEsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvS2NvbmZpZyBiL3NvdW5kL3NvYy9LY29uZmlnCmluZGV4IGRjYzc5YWEuLjNiYTUyZGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9LY29uZmlnCkBAIC00Nyw2ICs0Nyw3IEBACiBzb3VyY2UgInNvdW5kL3NvYy9pbnRlbC9LY29uZmlnIgogc291cmNlICJzb3VuZC9zb2MvbXhzL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9weGEvS2NvbmZpZyIKK3NvdXJjZSAic291bmQvc29jL3Fjb20vS2NvbmZpZyIKIHNvdXJjZSAic291bmQvc29jL3JvY2tjaGlwL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9zYW1zdW5nL0tjb25maWciCiBzb3VyY2UgInNvdW5kL3NvYy9zaC9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL01ha2VmaWxlIGIvc291bmQvc29jL01ha2VmaWxlCmluZGV4IDViM2M4ZjYuLjk3NGJhNzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvTWFrZWZpbGUKQEAgLTI4LDYgKzI4LDcgQEAKIG9iai0kKENPTkZJR19TTkRfU09DKQkrPSBvbWFwLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IGtpcmt3b29kLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHB4YS8KK29iai0kKENPTkZJR19TTkRfU09DKQkrPSBxY29tLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHJvY2tjaGlwLwogb2JqLSQoQ09ORklHX1NORF9TT0MpCSs9IHNhbXN1bmcvCiBvYmotJChDT05GSUdfU05EX1NPQykJKz0gc2gvCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvS2NvbmZpZyBiL3NvdW5kL3NvYy9hdG1lbC9LY29uZmlnCmluZGV4IDE1NzllOTkuLmU3ZDA4ODAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9hdG1lbC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9LY29uZmlnCkBAIC0yNSw3ICsyNSw4IEBACiAKIGNvbmZpZyBTTkRfQVQ5MV9TT0NfU0FNOUcyMF9XTTg3MzEKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFdNODczMS1iYXNlZCBBdDkxc2FtOWcyMCBldmFsdWF0aW9uIGJvYXJkIgotCWRlcGVuZHMgb24gQVJDSF9BVDkxICYmIEFUTUVMX1NTQyAmJiBTTkRfQVRNRUxfU09DCisJZGVwZW5kcyBvbiBBUkNIX0FUOTEgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBBVE1FTF9TU0MgJiYgU05EX0FUTUVMX1NPQyAmJiBTTkRfU09DX0kyQ19BTkRfU1BJCiAJc2VsZWN0IFNORF9BVE1FTF9TT0NfUERDCiAJc2VsZWN0IFNORF9BVE1FTF9TT0NfU1NDCiAJc2VsZWN0IFNORF9TT0NfV004NzMxCkBAIC0zNSw3ICszNiw4IEBACiAKIGNvbmZpZyBTTkRfQVRNRUxfU09DX1dNODkwNAogCXRyaXN0YXRlICJBdG1lbCBBU29DIGRyaXZlciBmb3IgYm9hcmRzIHVzaW5nIFdNODkwNCBjb2RlYyIKLQlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSAmJiBBVE1FTF9TU0MgJiYgU05EX0FUTUVMX1NPQyAmJiBJMkMKKwlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSB8fCBDT01QSUxFX1RFU1QKKwlkZXBlbmRzIG9uIEFUTUVMX1NTQyAmJiBTTkRfQVRNRUxfU09DICYmIEkyQwogCXNlbGVjdCBTTkRfQVRNRUxfU09DX1NTQwogCXNlbGVjdCBTTkRfQVRNRUxfU09DX0RNQQogCXNlbGVjdCBTTkRfU09DX1dNODkwNApAQCAtNDUsNyArNDcsOCBAQAogCiBjb25maWcgU05EX0FUOTFfU09DX1NBTTlYNV9XTTg3MzEKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIFdNODczMS1iYXNlZCBhdDkxc2FtOXg1IGJvYXJkIgotCWRlcGVuZHMgb24gQVJDSF9BVDkxICYmIEFUTUVMX1NTQyAmJiBTTkRfQVRNRUxfU09DCisJZGVwZW5kcyBvbiBBUkNIX0FUOTEgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBBVE1FTF9TU0MgJiYgU05EX0FUTUVMX1NPQyAmJiBTTkRfU09DX0kyQ19BTkRfU1BJCiAJc2VsZWN0IFNORF9BVE1FTF9TT0NfU1NDCiAJc2VsZWN0IFNORF9BVE1FTF9TT0NfRE1BCiAJc2VsZWN0IFNORF9TT0NfV004NzMxCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvTWFrZWZpbGUgYi9zb3VuZC9zb2MvYXRtZWwvTWFrZWZpbGUKaW5kZXggNDY2YTgyMS4uYjMyN2U1YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9NYWtlZmlsZQpAQCAtMSwxMCArMSw4IEBACiAjIEFUOTEgUGxhdGZvcm0gU3VwcG9ydAotc25kLXNvYy1hdG1lbC1wY20tb2JqcyA6PSBhdG1lbC1wY20ubwogc25kLXNvYy1hdG1lbC1wY20tcGRjLW9ianMgOj0gYXRtZWwtcGNtLXBkYy5vCiBzbmQtc29jLWF0bWVsLXBjbS1kbWEtb2JqcyA6PSBhdG1lbC1wY20tZG1hLm8KIHNuZC1zb2MtYXRtZWxfc3NjX2RhaS1vYmpzIDo9IGF0bWVsX3NzY19kYWkubwogCi1vYmotJChDT05GSUdfU05EX0FUTUVMX1NPQykgKz0gc25kLXNvYy1hdG1lbC1wY20ubwogb2JqLSQoQ09ORklHX1NORF9BVE1FTF9TT0NfUERDKSArPSBzbmQtc29jLWF0bWVsLXBjbS1wZGMubwogb2JqLSQoQ09ORklHX1NORF9BVE1FTF9TT0NfRE1BKSArPSBzbmQtc29jLWF0bWVsLXBjbS1kbWEubwogb2JqLSQoQ09ORklHX1NORF9BVE1FTF9TT0NfU1NDKSArPSBzbmQtc29jLWF0bWVsX3NzY19kYWkubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS1kbWEuYyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wY20tZG1hLmMKaW5kZXggYjhlN2JhZC4uYjY2MjVjOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS1kbWEuYworKysgYi9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLWRtYS5jCkBAIC01NCw3ICs1NCw3IEBACiAJLnBlcmlvZF9ieXRlc19tYXgJPSAyICogMHhmZmZmLAkvKiBpZiAyIGJ5dGVzIGZvcm1hdCAqLwogCS5wZXJpb2RzX21pbgkJPSA4LAogCS5wZXJpb2RzX21heAkJPSAxMDI0LAkJLyogbm8gbGltaXQgKi8KLQkuYnVmZmVyX2J5dGVzX21heAk9IEFUTUVMX1NTQ19ETUFCVUZfU0laRSwKKwkuYnVmZmVyX2J5dGVzX21heAk9IDUxMiAqIDEwMjQsCiB9OwogCiAvKioKQEAgLTExOSw3ICsxMTksNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfZG1hZW5naW5lX3BjbV9jb25maWcgYXRtZWxfZG1hZW5naW5lX3BjbV9jb25maWcgPSB7CiAJLnByZXBhcmVfc2xhdmVfY29uZmlnID0gYXRtZWxfcGNtX2NvbmZpZ3VyZV9kbWEsCiAJLnBjbV9oYXJkd2FyZSA9ICZhdG1lbF9wY21fZG1hX2hhcmR3YXJlLAotCS5wcmVhbGxvY19idWZmZXJfc2l6ZSA9IEFUTUVMX1NTQ19ETUFCVUZfU0laRSwKKwkucHJlYWxsb2NfYnVmZmVyX3NpemUgPSA2NCAqIDEwMjQsCiB9OwogCiBpbnQgYXRtZWxfcGNtX2RtYV9wbGF0Zm9ybV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLXBkYy5jIGIvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS1wZGMuYwppbmRleCBhMzY2YjM1Li5kYTg2MWI0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLXBkYy5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wY20tcGRjLmMKQEAgLTQ3LDYgKzQ3LDg1IEBACiAjaW5jbHVkZSAiYXRtZWwtcGNtLmgiCiAKIAorc3RhdGljIGludCBhdG1lbF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihzdHJ1Y3Qgc25kX3BjbSAqcGNtLAorCWludCBzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW07CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOworCXNpemVfdCBzaXplID0gQVRNRUxfU1NDX0RNQUJVRl9TSVpFOworCisJYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKKwlidWYtPmRldi5kZXYgPSBwY20tPmNhcmQtPmRldjsKKwlidWYtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisJYnVmLT5hcmVhID0gZG1hX2FsbG9jX2NvaGVyZW50KHBjbS0+Y2FyZC0+ZGV2LCBzaXplLAorCQkJJmJ1Zi0+YWRkciwgR0ZQX0tFUk5FTCk7CisJcHJfZGVidWcoImF0bWVsLXBjbTogYWxsb2MgZG1hIGJ1ZmZlcjogYXJlYT0lcCwgYWRkcj0lcCwgc2l6ZT0lenVcbiIsCisJCQkodm9pZCAqKWJ1Zi0+YXJlYSwgKHZvaWQgKikobG9uZylidWYtPmFkZHIsIHNpemUpOworCisJaWYgKCFidWYtPmFyZWEpCisJCXJldHVybiAtRU5PTUVNOworCisJYnVmLT5ieXRlcyA9IHNpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJcmV0dXJuIHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCSAgICAgICBzdWJzdHJlYW0tPmRtYV9idWZmZXIuYWRkciA+PiBQQUdFX1NISUZULAorCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7Cit9CisKK3N0YXRpYyBpbnQgYXRtZWxfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfY2FyZCAqY2FyZCA9IHJ0ZC0+Y2FyZC0+c25kX2NhcmQ7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCWludCByZXQ7CisKKwlyZXQgPSBkbWFfY29lcmNlX21hc2tfYW5kX2NvaGVyZW50KGNhcmQtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtKSB7CisJCXByX2RlYnVnKCJhdG1lbC1wY206IGFsbG9jYXRpbmcgUENNIHBsYXliYWNrIERNQSBidWZmZXJcbiIpOworCQlyZXQgPSBhdG1lbF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCisJCQlTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW0pIHsKKwkJcHJfZGVidWcoImF0bWVsLXBjbTogYWxsb2NhdGluZyBQQ00gY2FwdHVyZSBETUEgYnVmZmVyXG4iKTsKKwkJcmV0ID0gYXRtZWxfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIocGNtLAorCQkJU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgYXRtZWxfcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZjsKKwlpbnQgc3RyZWFtOworCisJZm9yIChzdHJlYW0gPSAwOyBzdHJlYW0gPCAyOyBzdHJlYW0rKykgeworCQlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW07CisJCWlmICghc3Vic3RyZWFtKQorCQkJY29udGludWU7CisKKwkJYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKwkJaWYgKCFidWYtPmFyZWEpCisJCQljb250aW51ZTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQocGNtLT5jYXJkLT5kZXYsIGJ1Zi0+Ynl0ZXMsCisJCQkJICBidWYtPmFyZWEsIGJ1Zi0+YWRkcik7CisJCWJ1Zi0+YXJlYSA9IE5VTEw7CisJfQorfQorCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKlwKICAqIEhhcmR3YXJlIGRlZmluaXRpb24KIFwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS5jIGIvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWUzZmE1Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wY20uYworKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKgotICogYXRtZWwtcGNtLmMgIC0tICBBTFNBIFBDTSBpbnRlcmZhY2UgZm9yIHRoZSBBdG1lbCBhdG1lbCBTb0MuCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNSBTQU4gUGVvcGxlCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA4IEF0bWVsCi0gKgotICogQXV0aG9yczogU2VkamkgR2FvdWFvdSA8c2VkamkuZ2FvdWFvdUBhdG1lbC5jb20+Ci0gKgotICogQmFzZWQgb24gYXQ5MS1wY20uIGJ5OgotICogRnJhbmsgTWFuZGFyaW5vIDxmbWFuZGFyaW5vQGVuZHJlbGlhLmNvbT4KLSAqIENvcHlyaWdodCAyMDA2IEVuZHJlbGlhIFRlY2hub2xvZ2llcyBJbmMuCi0gKgotICogQmFzZWQgb24gcHhhMnh4LXBjbS5jIGJ5OgotICoKLSAqIEF1dGhvcjoJTmljb2xhcyBQaXRyZQotICogQ3JlYXRlZDoJTm92IDMwLCAyMDA0Ci0gKiBDb3B5cmlnaHQ6CShDKSAyMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSAiYXRtZWwtcGNtLmgiCi0KLXN0YXRpYyBpbnQgYXRtZWxfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIoc3RydWN0IHNuZF9wY20gKnBjbSwKLQlpbnQgc3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3N0cmVhbV0uc3Vic3RyZWFtOwotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKLQlzaXplX3Qgc2l6ZSA9IEFUTUVMX1NTQ19ETUFCVUZfU0laRTsKLQotCWJ1Zi0+ZGV2LnR5cGUgPSBTTkRSVl9ETUFfVFlQRV9ERVY7Ci0JYnVmLT5kZXYuZGV2ID0gcGNtLT5jYXJkLT5kZXY7Ci0JYnVmLT5wcml2YXRlX2RhdGEgPSBOVUxMOwotCWJ1Zi0+YXJlYSA9IGRtYV9hbGxvY19jb2hlcmVudChwY20tPmNhcmQtPmRldiwgc2l6ZSwKLQkJCSZidWYtPmFkZHIsIEdGUF9LRVJORUwpOwotCXByX2RlYnVnKCJhdG1lbC1wY206IGFsbG9jIGRtYSBidWZmZXI6IGFyZWE9JXAsIGFkZHI9JXAsIHNpemU9JXp1XG4iLAotCQkJKHZvaWQgKilidWYtPmFyZWEsICh2b2lkICopKGxvbmcpYnVmLT5hZGRyLCBzaXplKTsKLQotCWlmICghYnVmLT5hcmVhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWJ1Zi0+Ynl0ZXMgPSBzaXplOwotCXJldHVybiAwOwotfQotCi1pbnQgYXRtZWxfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0Jc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0JcmV0dXJuIHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCi0JCSAgICAgICBzdWJzdHJlYW0tPmRtYV9idWZmZXIuYWRkciA+PiBQQUdFX1NISUZULAotCQkgICAgICAgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX3BhZ2VfcHJvdCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChhdG1lbF9wY21fbW1hcCk7Ci0KLWludCBhdG1lbF9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207Ci0JaW50IHJldDsKLQotCXJldCA9IGRtYV9jb2VyY2VfbWFza19hbmRfY29oZXJlbnQoY2FyZC0+ZGV2LCBETUFfQklUX01BU0soMzIpKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0pIHsKLQkJcHJfZGVidWcoImF0bWVsLXBjbTogYWxsb2NhdGluZyBQQ00gcGxheWJhY2sgRE1BIGJ1ZmZlclxuIik7Ci0JCXJldCA9IGF0bWVsX3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKLQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSkgewotCQlwcl9kZWJ1ZygiYXRtZWwtcGNtOiBhbGxvY2F0aW5nIFBDTSBjYXB0dXJlIERNQSBidWZmZXJcbiIpOwotCQlyZXQgPSBhdG1lbF9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCi0JCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUpOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JfQotIG91dDoKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoYXRtZWxfcGNtX25ldyk7Ci0KLXZvaWQgYXRtZWxfcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgKmJ1ZjsKLQlpbnQgc3RyZWFtOwotCi0JZm9yIChzdHJlYW0gPSAwOyBzdHJlYW0gPCAyOyBzdHJlYW0rKykgewotCQlzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW07Ci0JCWlmICghc3Vic3RyZWFtKQotCQkJY29udGludWU7Ci0KLQkJYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKLQkJaWYgKCFidWYtPmFyZWEpCi0JCQljb250aW51ZTsKLQkJZG1hX2ZyZWVfY29oZXJlbnQocGNtLT5jYXJkLT5kZXYsIGJ1Zi0+Ynl0ZXMsCi0JCQkJICBidWYtPmFyZWEsIGJ1Zi0+YWRkcik7Ci0JCWJ1Zi0+YXJlYSA9IE5VTEw7Ci0JfQotfQotRVhQT1JUX1NZTUJPTF9HUEwoYXRtZWxfcGNtX2ZyZWUpOwotCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLmggYi9zb3VuZC9zb2MvYXRtZWwvYXRtZWwtcGNtLmgKaW5kZXggMTJhZTgxNC4uNmVhZjA4MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL2F0bWVsLXBjbS5oCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbC1wY20uaApAQCAtODMsMTEgKzgzLDYgQEAKICNkZWZpbmUgc3NjX3JlYWR4KGJhc2UsIHJlZykgICAgICAgICAgICAoX19yYXdfcmVhZGwoKGJhc2UpICsgKHJlZykpKQogI2RlZmluZSBzc2Nfd3JpdGV4KGJhc2UsIHJlZywgdmFsdWUpICAgIF9fcmF3X3dyaXRlbCgodmFsdWUpLCAoYmFzZSkgKyAocmVnKSkKIAotaW50IGF0bWVsX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCk7Ci12b2lkIGF0bWVsX3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pOwotaW50IGF0bWVsX3BjbV9tbWFwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7Ci0KICNpZiBkZWZpbmVkKENPTkZJR19TTkRfQVRNRUxfU09DX1BEQykgfHwgXAogCWRlZmluZWQoQ09ORklHX1NORF9BVE1FTF9TT0NfUERDX01PRFVMRSkKIGludCBhdG1lbF9wY21fcGRjX3BsYXRmb3JtX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWxfc3NjX2RhaS5jIGIvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuYwppbmRleCBmYjBiN2U4Li44NDFkMDU5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvYXRtZWxfc3NjX2RhaS5jCisrKyBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmMKQEAgLTE4Nyw2ICsxODcsOTQgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKKy8qCisgKiBXaGVuIHRoZSBiaXQgY2xvY2sgaXMgaW5wdXQsIGxpbWl0IHRoZSBtYXhpbXVtIHJhdGUgYWNjb3JkaW5nIHRvIHRoZQorICogU2VyaWFsIENsb2NrIFJhdGlvIENvbnNpZGVyYXRpb25zIHNlY3Rpb24gZnJvbSB0aGUgU1NDIGRvY3VtZW50YXRpb246CisgKgorICogICBUaGUgVHJhbnNtaXR0ZXIgYW5kIHRoZSBSZWNlaXZlciBjYW4gYmUgcHJvZ3JhbW1lZCB0byBvcGVyYXRlCisgKiAgIHdpdGggdGhlIGNsb2NrIHNpZ25hbHMgcHJvdmlkZWQgb24gZWl0aGVyIHRoZSBUSyBvciBSSyBwaW5zLgorICogICBUaGlzIGFsbG93cyB0aGUgU1NDIHRvIHN1cHBvcnQgbWFueSBzbGF2ZS1tb2RlIGRhdGEgdHJhbnNmZXJzLgorICogICBJbiB0aGlzIGNhc2UsIHRoZSBtYXhpbXVtIGNsb2NrIHNwZWVkIGFsbG93ZWQgb24gdGhlIFJLIHBpbiBpczoKKyAqICAgLSBQZXJpcGhlcmFsIGNsb2NrIGRpdmlkZWQgYnkgMiBpZiBSZWNlaXZlciBGcmFtZSBTeW5jaHJvIGlzIGlucHV0CisgKiAgIC0gUGVyaXBoZXJhbCBjbG9jayBkaXZpZGVkIGJ5IDMgaWYgUmVjZWl2ZXIgRnJhbWUgU3luY2hybyBpcyBvdXRwdXQKKyAqICAgSW4gYWRkaXRpb24sIHRoZSBtYXhpbXVtIGNsb2NrIHNwZWVkIGFsbG93ZWQgb24gdGhlIFRLIHBpbiBpczoKKyAqICAgLSBQZXJpcGhlcmFsIGNsb2NrIGRpdmlkZWQgYnkgNiBpZiBUcmFuc21pdCBGcmFtZSBTeW5jaHJvIGlzIGlucHV0CisgKiAgIC0gUGVyaXBoZXJhbCBjbG9jayBkaXZpZGVkIGJ5IDIgaWYgVHJhbnNtaXQgRnJhbWUgU3luY2hybyBpcyBvdXRwdXQKKyAqCisgKiBXaGVuIHRoZSBiaXQgY2xvY2sgaXMgb3V0cHV0LCBsaW1pdCB0aGUgcmF0ZSBhY2NvcmRpbmcgdG8gdGhlCisgKiBTU0MgZGl2aWRlciByZXN0cmljdGlvbnMuCisgKi8KK3N0YXRpYyBpbnQgYXRtZWxfc3NjX2h3X3J1bGVfcmF0ZShzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQkgIHN0cnVjdCBzbmRfcGNtX2h3X3J1bGUgKnJ1bGUpCit7CisJc3RydWN0IGF0bWVsX3NzY19pbmZvICpzc2NfcCA9IHJ1bGUtPnByaXZhdGU7CisJc3RydWN0IHNzY19kZXZpY2UgKnNzYyA9IHNzY19wLT5zc2M7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqaSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgcnVsZS0+dmFyKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsIHQ7CisJc3RydWN0IHNuZF9yYXRudW0gciA9IHsKKwkJLmRlbl9taW4gPSAxLAorCQkuZGVuX21heCA9IDQwOTUsCisJCS5kZW5fc3RlcCA9IDEsCisJfTsKKwl1bnNpZ25lZCBpbnQgbnVtID0gMCwgZGVuID0gMDsKKwlpbnQgZnJhbWVfc2l6ZTsKKwlpbnQgbWNrX2RpdiA9IDI7CisJaW50IHJldDsKKworCWZyYW1lX3NpemUgPSBzbmRfc29jX3BhcmFtc190b19mcmFtZV9zaXplKHBhcmFtcyk7CisJaWYgKGZyYW1lX3NpemUgPCAwKQorCQlyZXR1cm4gZnJhbWVfc2l6ZTsKKworCXN3aXRjaCAoc3NjX3AtPmRhaWZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZTOgorCQlpZiAoKHNzY19wLT5kaXJfbWFzayAmIFNTQ19ESVJfTUFTS19DQVBUVVJFKQorCQkgICAgJiYgc3NjLT5jbGtfZnJvbV9ya19waW4pCisJCQkvKiBSZWNlaXZlciBGcmFtZSBTeW5jaHJvIChpLmUuIGNhcHR1cmUpCisJCQkgKiBpcyBvdXRwdXQgKGZvcm1hdCBpcyBfQ0ZTKSBhbmQgdGhlIFJLIHBpbgorCQkJICogaXMgdXNlZCBmb3IgaW5wdXQgKGZvcm1hdCBpcyBfQ0JNXykuCisJCQkgKi8KKwkJCW1ja19kaXYgPSAzOworCQlicmVhazsKKworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTToKKwkJaWYgKChzc2NfcC0+ZGlyX21hc2sgJiBTU0NfRElSX01BU0tfUExBWUJBQ0spCisJCSAgICAmJiAhc3NjLT5jbGtfZnJvbV9ya19waW4pCisJCQkvKiBUcmFuc21pdCBGcmFtZSBTeW5jaHJvIChpLmUuIHBsYXliYWNrKQorCQkJICogaXMgaW5wdXQgKGZvcm1hdCBpcyBfQ0ZNKSBhbmQgdGhlIFRLIHBpbgorCQkJICogaXMgdXNlZCBmb3IgaW5wdXQgKGZvcm1hdCBfQ0JNXyBidXQgbm90CisJCQkgKiB1c2luZyB0aGUgUksgcGluKS4KKwkJCSAqLworCQkJbWNrX2RpdiA9IDY7CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAoc3NjX3AtPmRhaWZtdCAmIFNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLKSB7CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTOgorCQlyLm51bSA9IHNzY19wLT5tY2tfcmF0ZSAvIG1ja19kaXYgLyBmcmFtZV9zaXplOworCisJCXJldCA9IHNuZF9pbnRlcnZhbF9yYXRudW0oaSwgMSwgJnIsICZudW0sICZkZW4pOworCQlpZiAocmV0ID49IDAgJiYgZGVuICYmIHJ1bGUtPnZhciA9PSBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSkgeworCQkJcGFyYW1zLT5yYXRlX251bSA9IG51bTsKKwkJCXBhcmFtcy0+cmF0ZV9kZW4gPSBkZW47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRlM6CisJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNOgorCQl0Lm1pbiA9IDgwMDA7CisJCXQubWF4ID0gc3NjX3AtPm1ja19yYXRlIC8gbWNrX2RpdiAvIGZyYW1lX3NpemU7CisJCXQub3Blbm1pbiA9IHQub3Blbm1heCA9IDA7CisJCXQuaW50ZWdlciA9IDA7CisJCXJldCA9IHNuZF9pbnRlcnZhbF9yZWZpbmUoaSwgJnQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCiAgKiBEQUkgZnVuY3Rpb25zCkBAIC0yMDAsNiArMjg4LDcgQEAKIAlzdHJ1Y3QgYXRtZWxfc3NjX2luZm8gKnNzY19wID0gJnNzY19pbmZvW2RhaS0+aWRdOwogCXN0cnVjdCBhdG1lbF9wY21fZG1hX3BhcmFtcyAqZG1hX3BhcmFtczsKIAlpbnQgZGlyLCBkaXJfbWFzazsKKwlpbnQgcmV0OwogCiAJcHJfZGVidWcoImF0bWVsX3NzY19zdGFydHVwOiBTU0NfU1I9MHgldVxuIiwKIAkJc3NjX3JlYWRsKHNzY19wLT5zc2MtPnJlZ3MsIFNSKSk7CkBAIC0yMDcsNiArMjk2LDcgQEAKIAkvKiBFbmFibGUgUE1DIHBlcmlwaGVyYWwgY2xvY2sgZm9yIHRoaXMgU1NDICovCiAJcHJfZGVidWcoImF0bWVsX3NzY19kYWk6IFN0YXJ0aW5nIGNsb2NrXG4iKTsKIAljbGtfZW5hYmxlKHNzY19wLT5zc2MtPmNsayk7CisJc3NjX3AtPm1ja19yYXRlID0gY2xrX2dldF9yYXRlKHNzY19wLT5zc2MtPmNsayk7CiAKIAkvKiBSZXNldCB0aGUgU1NDIHRvIGtlZXAgaXQgYXQgYSBjbGVhbiBzdGF0dXMgKi8KIAlzc2Nfd3JpdGVsKHNzY19wLT5zc2MtPnJlZ3MsIENSLCBTU0NfQklUKENSX1NXUlNUKSk7CkBAIC0yMTksNiArMzA5LDE3IEBACiAJCWRpcl9tYXNrID0gU1NDX0RJUl9NQVNLX0NBUFRVUkU7CiAJfQogCisJcmV0ID0gc25kX3BjbV9od19ydWxlX2FkZChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsCisJCQkJICBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkgIGF0bWVsX3NzY19od19ydWxlX3JhdGUsCisJCQkJICBzc2NfcCwKKwkJCQkgIFNORFJWX1BDTV9IV19QQVJBTV9GUkFNRV9CSVRTLAorCQkJCSAgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLCAtMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkYWktPmRldiwgIkZhaWxlZCB0byBzcGVjaWZ5IHJhdGUgcnVsZTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCiAJZG1hX3BhcmFtcyA9ICZzc2NfZG1hX3BhcmFtc1tkYWktPmlkXVtkaXJdOwogCWRtYV9wYXJhbXMtPnNzYyA9IHNzY19wLT5zc2M7CiAJZG1hX3BhcmFtcy0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwpAQCAtNzgzLDggKzg4NCw2IEBACiAjICBkZWZpbmUgYXRtZWxfc3NjX3Jlc3VtZQlOVUxMCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKLSNkZWZpbmUgQVRNRUxfU1NDX1JBVEVTIChTTkRSVl9QQ01fUkFURV84MDAwXzk2MDAwKQotCiAjZGVmaW5lIEFUTUVMX1NTQ19GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1M4ICAgICB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHxcCiAJCQkgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCiAKQEAgLTgwNCwxMiArOTAzLDE2IEBACiAJCS5wbGF5YmFjayA9IHsKIAkJCS5jaGFubmVsc19taW4gPSAxLAogCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBBVE1FTF9TU0NfUkFURVMsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAorCQkJLnJhdGVfbWluID0gODAwMCwKKwkJCS5yYXRlX21heCA9IDM4NDAwMCwKIAkJCS5mb3JtYXRzID0gQVRNRUxfU1NDX0ZPUk1BVFMsfSwKIAkJLmNhcHR1cmUgPSB7CiAJCQkuY2hhbm5lbHNfbWluID0gMSwKIAkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gQVRNRUxfU1NDX1JBVEVTLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfQ09OVElOVU9VUywKKwkJCS5yYXRlX21pbiA9IDgwMDAsCisJCQkucmF0ZV9tYXggPSAzODQwMDAsCiAJCQkuZm9ybWF0cyA9IEFUTUVMX1NTQ19GT1JNQVRTLH0sCiAJCS5vcHMgPSAmYXRtZWxfc3NjX2RhaV9vcHMsCiB9OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuaCBiL3NvdW5kL3NvYy9hdG1lbC9hdG1lbF9zc2NfZGFpLmgKaW5kZXggYjFmMDhkNS4uODBiMTUzOCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2F0bWVsL2F0bWVsX3NzY19kYWkuaAorKysgYi9zb3VuZC9zb2MvYXRtZWwvYXRtZWxfc3NjX2RhaS5oCkBAIC0xMTUsNiArMTE1LDcgQEAKIAl1bnNpZ25lZCBzaG9ydCByY21yX3BlcmlvZDsKIAlzdHJ1Y3QgYXRtZWxfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXNbMl07CiAJc3RydWN0IGF0bWVsX3NzY19zdGF0ZSBzc2Nfc3RhdGU7CisJdW5zaWduZWQgbG9uZyBtY2tfcmF0ZTsKIH07CiAKIGludCBhdG1lbF9zc2Nfc2V0X2F1ZGlvKGludCBzc2NfaWQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9LY29uZmlnIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCmluZGV4IGVhOWYwZTMuLjA2MWM0NjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKQEAgLTcwLDYgKzcwLDcgQEAKIAlzZWxlY3QgU05EX1NPQ19NQVg5ODA5MCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19NQVg5ODA5NSBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19NQVg5ODM1N0EgaWYgR1BJT0xJQgorCXNlbGVjdCBTTkRfU09DX01BWDk4OTI1IGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX01BWDk4NTAgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfTUFYOTc2OCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19NQVg5ODc3IGlmIEkyQwpAQCAtMTQxLDcgKzE0Miw4IEBACiAJc2VsZWN0IFNORF9TT0NfV004NzcwIGlmIFNQSV9NQVNURVIKIAlzZWxlY3QgU05EX1NPQ19XTTg3NzYgaWYgU05EX1NPQ19JMkNfQU5EX1NQSQogCXNlbGVjdCBTTkRfU09DX1dNODc4MgotCXNlbGVjdCBTTkRfU09DX1dNODgwNCBpZiBTTkRfU09DX0kyQ19BTkRfU1BJCisJc2VsZWN0IFNORF9TT0NfV004ODA0X0kyQyBpZiBJMkMKKwlzZWxlY3QgU05EX1NPQ19XTTg4MDRfU1BJIGlmIFNQSV9NQVNURVIKIAlzZWxlY3QgU05EX1NPQ19XTTg5MDAgaWYgSTJDCiAJc2VsZWN0IFNORF9TT0NfV004OTAzIGlmIEkyQwogCXNlbGVjdCBTTkRfU09DX1dNODkwNCBpZiBJMkMKQEAgLTQ2MCw2ICs0NjIsOSBAQAogY29uZmlnIFNORF9TT0NfTUFYOTgzNTdBCiAgICAgICAgdHJpc3RhdGUKIAorY29uZmlnIFNORF9TT0NfTUFYOTg5MjUKKyAgICAgICB0cmlzdGF0ZQorCiBjb25maWcgU05EX1NPQ19NQVg5ODUwCiAJdHJpc3RhdGUKIApAQCAtNzQ0LDggKzc0OSwxOSBAQAogCXRyaXN0YXRlCiAKIGNvbmZpZyBTTkRfU09DX1dNODgwNAotCXRyaXN0YXRlICJXb2xmc29uIE1pY3JvZWxlY3Ryb25pY3MgV004ODA0IFMvUERJRiB0cmFuc2NlaXZlciIKLQlkZXBlbmRzIG9uIFNORF9TT0NfSTJDX0FORF9TUEkKKwl0cmlzdGF0ZQorCitjb25maWcgU05EX1NPQ19XTTg4MDRfSTJDCisJdHJpc3RhdGUgIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyBXTTg4MDQgUy9QRElGIHRyYW5zY2VpdmVyIEkyQyIKKwlkZXBlbmRzIG9uIEkyQworCXNlbGVjdCBTTkRfU09DX1dNODgwNAorCXNlbGVjdCBSRUdNQVBfSTJDCisKK2NvbmZpZyBTTkRfU09DX1dNODgwNF9TUEkKKwl0cmlzdGF0ZSAiV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFdNODgwNCBTL1BESUYgdHJhbnNjZWl2ZXIgU1BJIgorCWRlcGVuZHMgb24gU1BJX01BU1RFUgorCXNlbGVjdCBTTkRfU09DX1dNODgwNAorCXNlbGVjdCBSRUdNQVBfU1BJCiAKIGNvbmZpZyBTTkRfU09DX1dNODkwMAogCXRyaXN0YXRlCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlIGIvc291bmQvc29jL2NvZGVjcy9NYWtlZmlsZQppbmRleCA2OWI4NjY2Li5hYmUyZDdlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL01ha2VmaWxlCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvTWFrZWZpbGUKQEAgLTY1LDYgKzY1LDcgQEAKIHNuZC1zb2MtbWF4OTgwOTAtb2JqcyA6PSBtYXg5ODA5MC5vCiBzbmQtc29jLW1heDk4MDk1LW9ianMgOj0gbWF4OTgwOTUubwogc25kLXNvYy1tYXg5ODM1N2Etb2JqcyA6PSBtYXg5ODM1N2Eubworc25kLXNvYy1tYXg5ODkyNS1vYmpzIDo9IG1heDk4OTI1Lm8KIHNuZC1zb2MtbWF4OTg1MC1vYmpzIDo9IG1heDk4NTAubwogc25kLXNvYy1tYzEzNzgzLW9ianMgOj0gbWMxMzc4My5vCiBzbmQtc29jLW1sMjYxMjQtb2JqcyA6PSBtbDI2MTI0Lm8KQEAgLTE0NSw2ICsxNDYsOCBAQAogc25kLXNvYy13bTg3NzYtb2JqcyA6PSB3bTg3NzYubwogc25kLXNvYy13bTg3ODItb2JqcyA6PSB3bTg3ODIubwogc25kLXNvYy13bTg4MDQtb2JqcyA6PSB3bTg4MDQubworc25kLXNvYy13bTg4MDQtaTJjLW9ianMgOj0gd204ODA0LWkyYy5vCitzbmQtc29jLXdtODgwNC1zcGktb2JqcyA6PSB3bTg4MDQtc3BpLm8KIHNuZC1zb2Mtd204OTAwLW9ianMgOj0gd204OTAwLm8KIHNuZC1zb2Mtd204OTAzLW9ianMgOj0gd204OTAzLm8KIHNuZC1zb2Mtd204OTA0LW9ianMgOj0gd204OTA0Lm8KQEAgLTI0Nyw2ICsyNTAsNyBAQAogb2JqLSQoQ09ORklHX1NORF9TT0NfTUFYOTgwOTApCSs9IHNuZC1zb2MtbWF4OTgwOTAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfTUFYOTgwOTUpCSs9IHNuZC1zb2MtbWF4OTgwOTUubwogb2JqLSQoQ09ORklHX1NORF9TT0NfTUFYOTgzNTdBKQkrPSBzbmQtc29jLW1heDk4MzU3YS5vCitvYmotJChDT05GSUdfU05EX1NPQ19NQVg5ODkyNSkJKz0gc25kLXNvYy1tYXg5ODkyNS5vCiBvYmotJChDT05GSUdfU05EX1NPQ19NQVg5ODUwKQkrPSBzbmQtc29jLW1heDk4NTAubwogb2JqLSQoQ09ORklHX1NORF9TT0NfTUMxMzc4MykJKz0gc25kLXNvYy1tYzEzNzgzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX01MMjYxMjQpCSs9IHNuZC1zb2MtbWwyNjEyNC5vCkBAIC0zMjMsNiArMzI3LDggQEAKIG9iai0kKENPTkZJR19TTkRfU09DX1dNODc3NikJKz0gc25kLXNvYy13bTg3NzYubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV004NzgyKQkrPSBzbmQtc29jLXdtODc4Mi5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg4MDQpCSs9IHNuZC1zb2Mtd204ODA0Lm8KK29iai0kKENPTkZJR19TTkRfU09DX1dNODgwNF9JMkMpICs9IHNuZC1zb2Mtd204ODA0LWkyYy5vCitvYmotJChDT05GSUdfU05EX1NPQ19XTTg4MDRfU1BJKSArPSBzbmQtc29jLXdtODgwNC1zcGkubwogb2JqLSQoQ09ORklHX1NORF9TT0NfV004OTAwKQkrPSBzbmQtc29jLXdtODkwMC5vCiBvYmotJChDT05GSUdfU05EX1NPQ19XTTg5MDMpCSs9IHNuZC1zb2Mtd204OTAzLm8KIG9iai0kKENPTkZJR19TTkRfU09DX1dNODkwNCkJKz0gc25kLXNvYy13bTg5MDQubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hYjg1MDAtY29kZWMuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWI4NTAwLWNvZGVjLmMKaW5kZXggNzg5NTY4OS4uODhjYTljYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hYjg1MDAtY29kZWMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FiODUwMC1jb2RlYy5jCkBAIC0yMDAzLDcgKzIwMDMsNiBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChhYjg1MDBfYXVkaW9fc2V0dXBfbWljcyk7CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2F1ZGlvX3NldF9lYXJfY212KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAkJCQllbnVtIGVhcl9jbV92b2x0YWdlIGVhcl9jbXYpCkBAIC0yMDM2LDcgKzIwMzUsNiBAQAogCiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChhYjg1MDBfYXVkaW9fc2V0X2Vhcl9jbXYpOwogCiBzdGF0aWMgaW50IGFiODUwMF9hdWRpb19zZXRfYml0X2RlbGF5KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAogCQkJCXVuc2lnbmVkIGludCBkZWxheSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWRhdTE5NzcuYwppbmRleCA3MGFiMzU3Li43YWQ4ZTE1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXUxOTc3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZGF1MTk3Ny5jCkBAIC05MzgsMjIgKzkzOCwxNSBAQAogCQlhZGF1MTk3Ny0+ZHZkZF9yZWcgPSBOVUxMOwogCX0KIAotCWFkYXUxOTc3LT5yZXNldF9ncGlvID0gZGV2bV9ncGlvZF9nZXQoZGV2LCAicmVzZXQiKTsKLQlpZiAoSVNfRVJSKGFkYXUxOTc3LT5yZXNldF9ncGlvKSkgewotCQlyZXQgPSBQVFJfRVJSKGFkYXUxOTc3LT5yZXNldF9ncGlvKTsKLQkJaWYgKHJldCAhPSAtRU5PRU5UICYmIHJldCAhPSAtRU5PU1lTKQotCQkJcmV0dXJuIFBUUl9FUlIoYWRhdTE5NzctPnJlc2V0X2dwaW8pOwotCQlhZGF1MTk3Ny0+cmVzZXRfZ3BpbyA9IE5VTEw7Ci0JfQorCWFkYXUxOTc3LT5yZXNldF9ncGlvID0gZGV2bV9ncGlvZF9nZXRfb3B0aW9uYWwoZGV2LCAicmVzZXQiLAorCQkJCQkJICAgICAgIEdQSU9EX09VVF9MT1cpOworCWlmIChJU19FUlIoYWRhdTE5NzctPnJlc2V0X2dwaW8pKQorCQlyZXR1cm4gUFRSX0VSUihhZGF1MTk3Ny0+cmVzZXRfZ3Bpbyk7CiAKIAlkZXZfc2V0X2RydmRhdGEoZGV2LCBhZGF1MTk3Nyk7CiAKLQlpZiAoYWRhdTE5NzctPnJlc2V0X2dwaW8pIHsKLQkJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX291dHB1dChhZGF1MTk3Ny0+cmVzZXRfZ3BpbywgMCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCWlmIChhZGF1MTk3Ny0+cmVzZXRfZ3BpbykKIAkJbmRlbGF5KDEwMCk7Ci0JfQogCiAJcmV0ID0gYWRhdTE5NzdfcG93ZXJfZW5hYmxlKGFkYXUxOTc3KTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hZGF2ODB4LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwppbmRleCBiNjc0ODBmLi40MzczYWRhIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FkYXY4MHguYwpAQCAtMzE3LDcgKzMxNyw3IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CiAJc3RydWN0IGFkYXY4MHggKmFkYXY4MHggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1bnNpZ25lZCBpbnQgZGVlbXBoID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwl1bnNpZ25lZCBpbnQgZGVlbXBoID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CiAKIAlpZiAoZGVlbXBoID4gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zMzMsNyArMzMzLDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3QgYWRhdjgweCAqYWRhdjgweCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGFkYXY4MHgtPmRlZW1waDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGFkYXY4MHgtPmRlZW1waDsKIAlyZXR1cm4gMDsKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTU0LmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDU1NC5jCmluZGV4IDE2Y2U5ZjkuLjI5OGRlZGMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NTU0LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ1NTQuYwpAQCAtODQsNyArODQsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBhazQ1NTRfb2ZfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFrNDU1NF9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiYXNhaGkta2FzZWksYWs0NTU0IiB9LAogCXt9LAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0MS5jCmluZGV4IDcwODYxYzcuLjgxYjU0YTIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NDEuYwpAQCAtNzYsNyArNzYsNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCBhazQ2NDFfcHJpdiAqYWs0NjQxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCiAJaWYgKGRlZW1waCA+IDEpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTIsNyArOTIsNyBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCBhazQ2NDFfcHJpdiAqYWs0NjQxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gYWs0NjQxLT5kZWVtcGg7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBhazQ2NDEtPmRlZW1waDsKIAlyZXR1cm4gMDsKIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY0Mi5jCmluZGV4IGRkZThiNDkuLjEzNTg1ZTggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjQyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hazQ2NDIuYwpAQCAtOTcsNiArOTcsOSBAQAogI2RlZmluZSBQTU1QCQkoMSA8PCAyKSAvKiBNUFdSIHBpbiBQb3dlciBNYW5hZ2VtZW50ICovCiAjZGVmaW5lIE1HQUlOMAkJKDEgPDwgMCkgLyogTUlDIGFtcCBnYWluKi8KIAorLyogU0dfU0wyICovCisjZGVmaW5lIExPUFMJCSgxIDw8IDYpIC8qIFN0ZXJvIExpbmUtb3V0IFBvd2VyIFNhdmUgTW9kZSAqLworCiAvKiBUSU1FUiAqLwogI2RlZmluZSBaVE0ocGFyYW0pCSgocGFyYW0gJiAweDMpIDw8IDQpIC8qIEFMQyBaZXJvIENyb3NzaW5nIFRpbWVPdXQgKi8KICNkZWZpbmUgV1RNKHBhcmFtKQkoKChwYXJhbSAmIDB4NCkgPDwgNCkgfCAoKHBhcmFtICYgMHgzKSA8PCAyKSkKQEAgLTE2OCw2ICsxNzEsMjkgQEAKIAlTT0NfREFQTV9TSU5HTEUoIkRBQ0wiLCBTR19TTDEsIDQsIDEsIDApLAogfTsKIAorLyogZXZlbnQgaGFuZGxlcnMgKi8KK3N0YXRpYyBpbnQgYWs0NjQyX2xvdXRfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkgICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHctPmRhcG0pOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgU05EX1NPQ19EQVBNX1BSRV9QTUQ6CisJY2FzZSBTTkRfU09DX0RBUE1fUFJFX1BNVToKKwkJLyogUG93ZXIgc2F2ZSBtb2RlIE9OICovCisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFNHX1NMMiwgTE9QUywgTE9QUyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1VOgorCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKiBQb3dlciBzYXZlIG1vZGUgT0ZGICovCisJCW1kZWxheSgzMDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBTR19TTDIsIExPUFMsIDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGFrNDY0Ml9kYXBtX3dpZGdldHNbXSA9IHsKIAogCS8qIE91dHB1dHMgKi8KQEAgLTE4MiwxMiArMjA4LDE1IEBACiAKIAlTTkRfU09DX0RBUE1fUEdBKCJEQUNIIiwgTURfQ1RMNCwgMCwgMCwgTlVMTCwgMCksCiAKLQlTTkRfU09DX0RBUE1fTUlYRVIoIkxJTkVPVVQgTWl4ZXIiLCBQV19NR01UMSwgMywgMCwKKwlTTkRfU09DX0RBUE1fTUlYRVJfRSgiTElORU9VVCBNaXhlciIsIFBXX01HTVQxLCAzLCAwLAogCQkJICAgJmFrNDY0Ml9sb3V0X21peGVyX2NvbnRyb2xzWzBdLAotCQkJICAgQVJSQVlfU0laRShhazQ2NDJfbG91dF9taXhlcl9jb250cm9scykpLAorCQkJICAgQVJSQVlfU0laRShhazQ2NDJfbG91dF9taXhlcl9jb250cm9scyksCisJCQkgICBhazQ2NDJfbG91dF9ldmVudCwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1VIHwKKwkJCSAgIFNORF9TT0NfREFQTV9QUkVfUE1EIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKIAogCS8qIERBQyAqLwotCVNORF9TT0NfREFQTV9EQUMoIkRBQyIsICJIaUZpIFBsYXliYWNrIiwgUFdfTUdNVDEsIDIsIDApLAorCVNORF9TT0NfREFQTV9EQUMoIkRBQyIsIE5VTEwsIFBXX01HTVQxLCAyLCAwKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGFrNDY0Ml9pbnRlcmNvbltdID0gewpAQCAtMjA1LDYgKzIzNCw4IEBACiAJeyJEQUNIIiwgTlVMTCwgIkRBQyJ9LAogCiAJeyJMSU5FT1VUIE1peGVyIiwgIkRBQ0wiLCAiREFDIn0sCisKKwl7ICJEQUMiLCBOVUxMLCAiUGxheWJhY2siIH0sCiB9OwogCiAvKgpAQCAtNDY4LDEzICs0OTksMTMgQEAKIAkubmFtZSA9ICJhazQ2NDItaGlmaSIsCiAJLnBsYXliYWNrID0gewogCQkuc3RyZWFtX25hbWUgPSAiUGxheWJhY2siLAotCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJLmNoYW5uZWxzX21pbiA9IDIsCiAJCS5jaGFubmVsc19tYXggPSAyLAogCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAogCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIH0sCiAJLmNhcHR1cmUgPSB7CiAJCS5zdHJlYW1fbmFtZSA9ICJDYXB0dXJlIiwKLQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19taW4gPSAyLAogCQkuY2hhbm5lbHNfbWF4ID0gMiwKIAkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKIAkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvYWs0NjcxLmMKaW5kZXggNjMyZTg5Zi4uMmE1OGIxZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hazQ2NzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2FrNDY3MS5jCkBAIC0zNDMsMjUgKzM0MywyNSBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYWs0NjcxX2ludGVyY29uW10gPSB7Ci0JeyJEQUMgTGVmdCIsICJOVUxMIiwgIlBNUExMIn0sCi0JeyJEQUMgUmlnaHQiLCAiTlVMTCIsICJQTVBMTCJ9LAotCXsiQURDIExlZnQiLCAiTlVMTCIsICJQTVBMTCJ9LAotCXsiQURDIFJpZ2h0IiwgIk5VTEwiLCAiUE1QTEwifSwKKwl7IkRBQyBMZWZ0IiwgTlVMTCwgIlBNUExMIn0sCisJeyJEQUMgUmlnaHQiLCBOVUxMLCAiUE1QTEwifSwKKwl7IkFEQyBMZWZ0IiwgTlVMTCwgIlBNUExMIn0sCisJeyJBREMgUmlnaHQiLCBOVUxMLCAiUE1QTEwifSwKIAogCS8qIE91dHB1dHMgKi8KLQl7IkxPVVQxIiwgIk5VTEwiLCAiTE9VVDEgTWl4ZXIifSwKLQl7IlJPVVQxIiwgIk5VTEwiLCAiUk9VVDEgTWl4ZXIifSwKLQl7IkxPVVQyIiwgIk5VTEwiLCAiTE9VVDIgTWl4IEFtcCJ9LAotCXsiUk9VVDIiLCAiTlVMTCIsICJST1VUMiBNaXggQW1wIn0sCi0JeyJMT1VUMyIsICJOVUxMIiwgIkxPVVQzIE1peGVyIn0sCi0JeyJST1VUMyIsICJOVUxMIiwgIlJPVVQzIE1peGVyIn0sCisJeyJMT1VUMSIsIE5VTEwsICJMT1VUMSBNaXhlciJ9LAorCXsiUk9VVDEiLCBOVUxMLCAiUk9VVDEgTWl4ZXIifSwKKwl7IkxPVVQyIiwgTlVMTCwgIkxPVVQyIE1peCBBbXAifSwKKwl7IlJPVVQyIiwgTlVMTCwgIlJPVVQyIE1peCBBbXAifSwKKwl7IkxPVVQzIiwgTlVMTCwgIkxPVVQzIE1peGVyIn0sCisJeyJST1VUMyIsIE5VTEwsICJST1VUMyBNaXhlciJ9LAogCiAJeyJMT1VUMSBNaXhlciIsICJEQUNMIiwgIkRBQyBMZWZ0In0sCiAJeyJST1VUMSBNaXhlciIsICJEQUNSIiwgIkRBQyBSaWdodCJ9LAogCXsiTE9VVDIgTWl4ZXIiLCAiREFDSEwiLCAiREFDIExlZnQifSwKIAl7IlJPVVQyIE1peGVyIiwgIkRBQ0hSIiwgIkRBQyBSaWdodCJ9LAotCXsiTE9VVDIgTWl4IEFtcCIsICJOVUxMIiwgIkxPVVQyIE1peGVyIn0sCi0JeyJST1VUMiBNaXggQW1wIiwgIk5VTEwiLCAiUk9VVDIgTWl4ZXIifSwKKwl7IkxPVVQyIE1peCBBbXAiLCBOVUxMLCAiTE9VVDIgTWl4ZXIifSwKKwl7IlJPVVQyIE1peCBBbXAiLCBOVUxMLCAiUk9VVDIgTWl4ZXIifSwKIAl7IkxPVVQzIE1peGVyIiwgIkRBQ1NMIiwgIkRBQyBMZWZ0In0sCiAJeyJST1VUMyBNaXhlciIsICJEQUNTUiIsICJEQUMgUmlnaHQifSwKIApAQCAtMzgxLDE4ICszODEsMTggQEAKIAl7IkxJTjIiLCBOVUxMLCAiTWljIEJpYXMifSwKIAl7IlJJTjIiLCBOVUxMLCAiTWljIEJpYXMifSwKIAotCXsiQURDIExlZnQiLCAiTlVMTCIsICJMSU4gTVVYIn0sCi0JeyJBREMgUmlnaHQiLCAiTlVMTCIsICJSSU4gTVVYIn0sCisJeyJBREMgTGVmdCIsIE5VTEwsICJMSU4gTVVYIn0sCisJeyJBREMgUmlnaHQiLCBOVUxMLCAiUklOIE1VWCJ9LAogCiAJLyogQW5hbG9nIExvb3BzICovCi0JeyJMSU4xIE1peGluZyBDaXJjdWl0IiwgIk5VTEwiLCAiTElOMSJ9LAotCXsiUklOMSBNaXhpbmcgQ2lyY3VpdCIsICJOVUxMIiwgIlJJTjEifSwKLQl7IkxJTjIgTWl4aW5nIENpcmN1aXQiLCAiTlVMTCIsICJMSU4yIn0sCi0JeyJSSU4yIE1peGluZyBDaXJjdWl0IiwgIk5VTEwiLCAiUklOMiJ9LAotCXsiTElOMyBNaXhpbmcgQ2lyY3VpdCIsICJOVUxMIiwgIkxJTjMifSwKLQl7IlJJTjMgTWl4aW5nIENpcmN1aXQiLCAiTlVMTCIsICJSSU4zIn0sCi0JeyJMSU40IE1peGluZyBDaXJjdWl0IiwgIk5VTEwiLCAiTElONCJ9LAotCXsiUklONCBNaXhpbmcgQ2lyY3VpdCIsICJOVUxMIiwgIlJJTjQifSwKKwl7IkxJTjEgTWl4aW5nIENpcmN1aXQiLCBOVUxMLCAiTElOMSJ9LAorCXsiUklOMSBNaXhpbmcgQ2lyY3VpdCIsIE5VTEwsICJSSU4xIn0sCisJeyJMSU4yIE1peGluZyBDaXJjdWl0IiwgTlVMTCwgIkxJTjIifSwKKwl7IlJJTjIgTWl4aW5nIENpcmN1aXQiLCBOVUxMLCAiUklOMiJ9LAorCXsiTElOMyBNaXhpbmcgQ2lyY3VpdCIsIE5VTEwsICJMSU4zIn0sCisJeyJSSU4zIE1peGluZyBDaXJjdWl0IiwgTlVMTCwgIlJJTjMifSwKKwl7IkxJTjQgTWl4aW5nIENpcmN1aXQiLCBOVUxMLCAiTElONCJ9LAorCXsiUklONCBNaXhpbmcgQ2lyY3VpdCIsIE5VTEwsICJSSU40In0sCiAKIAl7IkxPVVQxIE1peGVyIiwgIkxJTkwxIiwgIkxJTjEgTWl4aW5nIENpcmN1aXQifSwKIAl7IlJPVVQxIE1peGVyIiwgIlJJTlIxIiwgIlJJTjEgTWl4aW5nIENpcmN1aXQifSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYXJpem9uYS5jIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKaW5kZXggMjkyMDI2MS4uNTdkYTBjZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9hcml6b25hLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxzb3VuZC90bHYuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21mZC9hcml6b25hL2NvcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tZmQvYXJpem9uYS9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2FyaXpvbmEvcmVnaXN0ZXJzLmg+CiAKICNpbmNsdWRlICJhcml6b25hLmgiCkBAIC0yODEsNiArMjgwLDcgQEAKIAogCXN3aXRjaCAoYXJpem9uYS0+dHlwZSkgewogCWNhc2UgV001MTEwOgorCWNhc2UgV004MjgwOgogCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiRFJDMiBTaWduYWwgQWN0aXZpdHkiKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTE3MjksNiArMTcyOSw3IEBACiAKIAlzd2l0Y2ggKGZsbC0+YXJpem9uYS0+dHlwZSkgewogCWNhc2UgV001MTEwOgorCWNhc2UgV004MjgwOgogCQlpZiAoZmxsLT5hcml6b25hLT5yZXYgPCAzIHx8IHN5bmMpCiAJCQlyZXR1cm4gaW5pdF9yYXRpbzsKIAkJYnJlYWs7CkBAIC0xOTAxLDcgKzE5MDIsNyBAQAogc3RhdGljIGludCBhcml6b25hX2VuYWJsZV9mbGwoc3RydWN0IGFyaXpvbmFfZmxsICpmbGwpCiB7CiAJc3RydWN0IGFyaXpvbmEgKmFyaXpvbmEgPSBmbGwtPmFyaXpvbmE7Ci0JaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHRpbWVfbGVmdDsKIAlib29sIHVzZV9zeW5jID0gZmFsc2U7CiAJaW50IGFscmVhZHlfZW5hYmxlZCA9IGFyaXpvbmFfaXNfZW5hYmxlZF9mbGwoZmxsKTsKIAlzdHJ1Y3QgYXJpem9uYV9mbGxfY2ZnIGNmZzsKQEAgLTE5NzcsOSArMTk3OCw5IEBACiAJCXJlZ21hcF91cGRhdGVfYml0c19hc3luYyhhcml6b25hLT5yZWdtYXAsIGZsbC0+YmFzZSArIDEsCiAJCQkJCSBBUklaT05BX0ZMTDFfRlJFRVJVTiwgMCk7CiAKLQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmZsbC0+b2ssCisJdGltZV9sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmbGwtPm9rLAogCQkJCQkgIG1zZWNzX3RvX2ppZmZpZXMoMjUwKSk7Ci0JaWYgKHJldCA9PSAwKQorCWlmICh0aW1lX2xlZnQgPT0gMCkKIAkJYXJpem9uYV9mbGxfd2FybihmbGwsICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgbG9ja1xuIik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3MzNWwzMi5jIGIvc291bmQvc29jL2NvZGVjcy9jczM1bDMyLmMKaW5kZXggZjJiOGFhZC4uNjA1OThiMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczM1bDMyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczM1bDMyLmMKQEAgLTQzNywyMCArNDM3LDEzIEBACiAJfQogCiAJLyogUmVzZXQgdGhlIERldmljZSAqLwotCWNzMzVsMzItPnJlc2V0X2dwaW8gPSBkZXZtX2dwaW9kX2dldCgmaTJjX2NsaWVudC0+ZGV2LAotCQkicmVzZXQtZ3Bpb3MiKTsKLQlpZiAoSVNfRVJSKGNzMzVsMzItPnJlc2V0X2dwaW8pKSB7Ci0JCXJldCA9IFBUUl9FUlIoY3MzNWwzMi0+cmVzZXRfZ3Bpbyk7Ci0JCWlmIChyZXQgIT0gLUVOT0VOVCAmJiByZXQgIT0gLUVOT1NZUykKLQkJCXJldHVybiByZXQ7CisJY3MzNWwzMi0+cmVzZXRfZ3BpbyA9IGRldm1fZ3Bpb2RfZ2V0X29wdGlvbmFsKCZpMmNfY2xpZW50LT5kZXYsCisJCSJyZXNldCIsIEdQSU9EX09VVF9MT1cpOworCWlmIChJU19FUlIoY3MzNWwzMi0+cmVzZXRfZ3BpbykpCisJCXJldHVybiBQVFJfRVJSKGNzMzVsMzItPnJlc2V0X2dwaW8pOwogCi0JCWNzMzVsMzItPnJlc2V0X2dwaW8gPSBOVUxMOwotCX0gZWxzZSB7Ci0JCXJldCA9IGdwaW9kX2RpcmVjdGlvbl9vdXRwdXQoY3MzNWwzMi0+cmVzZXRfZ3BpbywgMCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCWlmIChjczM1bDMyLT5yZXNldF9ncGlvKQogCQlncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAoY3MzNWwzMi0+cmVzZXRfZ3BpbywgMSk7Ci0JfQogCiAJLyogaW5pdGlhbGl6ZSBjb2RlYyAqLwogCXJldCA9IHJlZ21hcF9yZWFkKGNzMzVsMzItPnJlZ21hcCwgQ1MzNUwzMl9ERVZJRF9BQiwgJnJlZyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI2NS5jIGIvc291bmQvc29jL2NvZGVjcy9jczQyNjUuYwppbmRleCBjZTYwODY4Li5jYWM0OGRkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2NzNDI2NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjY1LmMKQEAgLTYwNSwyMSArNjA1LDE0IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JY3M0MjY1LT5yZXNldF9ncGlvID0gZGV2bV9ncGlvZF9nZXQoJmkyY19jbGllbnQtPmRldiwKLQkJInJlc2V0LWdwaW9zIik7Ci0JaWYgKElTX0VSUihjczQyNjUtPnJlc2V0X2dwaW8pKSB7Ci0JCXJldCA9IFBUUl9FUlIoY3M0MjY1LT5yZXNldF9ncGlvKTsKLQkJaWYgKHJldCAhPSAtRU5PRU5UICYmIHJldCAhPSAtRU5PU1lTKQotCQkJcmV0dXJuIHJldDsKKwljczQyNjUtPnJlc2V0X2dwaW8gPSBkZXZtX2dwaW9kX2dldF9vcHRpb25hbCgmaTJjX2NsaWVudC0+ZGV2LAorCQkicmVzZXQiLCBHUElPRF9PVVRfTE9XKTsKKwlpZiAoSVNfRVJSKGNzNDI2NS0+cmVzZXRfZ3BpbykpCisJCXJldHVybiBQVFJfRVJSKGNzNDI2NS0+cmVzZXRfZ3Bpbyk7CiAKLQkJY3M0MjY1LT5yZXNldF9ncGlvID0gTlVMTDsKLQl9IGVsc2UgewotCQlyZXQgPSBncGlvZF9kaXJlY3Rpb25fb3V0cHV0KGNzNDI2NS0+cmVzZXRfZ3BpbywgMCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCWlmIChjczQyNjUtPnJlc2V0X2dwaW8pIHsKIAkJbWRlbGF5KDEpOwogCQlncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAoY3M0MjY1LT5yZXNldF9ncGlvLCAxKTsKLQogCX0KIAogCWkyY19zZXRfY2xpZW50ZGF0YShpMmNfY2xpZW50LCBjczQyNjUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcxLmMKaW5kZXggNzlhNGVmYy4uZTc3MGVlNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9jczQyNzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MS5jCkBAIC0yODYsNyArMjg2LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3QgY3M0MjcxX3ByaXZhdGUgKmNzNDI3MSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGNzNDI3MS0+ZGVlbXBoOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gY3M0MjcxLT5kZWVtcGg7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI5Niw3ICsyOTYsNyBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCBjczQyNzFfcHJpdmF0ZSAqY3M0MjcxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQljczQyNzEtPmRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJY3M0MjcxLT5kZWVtcGggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAlyZXR1cm4gY3M0MjcxX3NldF9kZWVtcGgoY29kZWMpOwogfQogCkBAIC01NjEsMTAgKzU2MSwxMCBAQAogCWlmIChncGlvX2lzX3ZhbGlkKGNzNDI3MS0+Z3Bpb19ucmVzZXQpKSB7CiAJCS8qIFJlc2V0IGNvZGVjICovCiAJCWdwaW9fZGlyZWN0aW9uX291dHB1dChjczQyNzEtPmdwaW9fbnJlc2V0LCAwKTsKLQkJdWRlbGF5KDEpOworCQltZGVsYXkoMSk7CiAJCWdwaW9fc2V0X3ZhbHVlKGNzNDI3MS0+Z3Bpb19ucmVzZXQsIDEpOwogCQkvKiBHaXZlIHRoZSBjb2RlYyB0aW1lIHRvIHdha2UgdXAgKi8KLQkJdWRlbGF5KDEpOworCQltZGVsYXkoMSk7CiAJfQogCiAJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGNzNDI3MS0+cmVnbWFwLCBDUzQyNzFfTU9ERTIsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2N4MjA0NDIuYyBiL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCmluZGV4IDBiMTA5NzkuLjBmMzM0YmMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3gyMDQ0Mi5jCkBAIC00MjAsNyArNDIwLDcgQEAKIAkJCSZjeDIwNDQyX2NvZGVjX2RldiwgJmN4MjA0NDJfZGFpLCAxKTsKIH0KIAotc3RhdGljIGludCBfX2V4aXQgY3gyMDQ0Ml9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3N0YXRpYyBpbnQgY3gyMDQ0Ml9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJnBkZXYtPmRldik7CiAJcmV0dXJuIDA7CkBAIC00MzEsNyArNDMxLDcgQEAKIAkJLm5hbWUgPSAiY3gyMDQ0Mi1jb2RlYyIsCiAJCX0sCiAJLnByb2JlID0gY3gyMDQ0Ml9wbGF0Zm9ybV9wcm9iZSwKLQkucmVtb3ZlID0gX19leGl0X3AoY3gyMDQ0Ml9wbGF0Zm9ybV9yZW1vdmUpLAorCS5yZW1vdmUgPSBjeDIwNDQyX3BsYXRmb3JtX3JlbW92ZSwKIH07CiAKIG1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoY3gyMDQ0Ml9wbGF0Zm9ybV9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9kYTczMnguYyBiL3NvdW5kL3NvYy9jb2RlY3MvZGE3MzJ4LmMKaW5kZXggZmZlOTYxNy4uOTExYzI2YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9kYTczMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2RhNzMyeC5jCkBAIC04NzYsMTEgKzg3NiwxMSBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBkYTczMnhfZGFwbV9yb3V0ZXNbXSA9IHsKIAkvKiBJbnB1dHMgKi8KLQl7IkFVWDFMIFBHQSIsICJOVUxMIiwgIkFVWDFMIn0sCi0JeyJBVVgxUiBQR0EiLCAiTlVMTCIsICJBVVgxUiJ9LAorCXsiQVVYMUwgUEdBIiwgTlVMTCwgIkFVWDFMIn0sCisJeyJBVVgxUiBQR0EiLCBOVUxMLCAiQVVYMVIifSwKIAl7Ik1JQzEgUEdBIiwgTlVMTCwgIk1JQzEifSwKLQl7Ik1JQzIgUEdBIiwgIk5VTEwiLCAiTUlDMiJ9LAotCXsiTUlDMyBQR0EiLCAiTlVMTCIsICJNSUMzIn0sCisJeyJNSUMyIFBHQSIsIE5VTEwsICJNSUMyIn0sCisJeyJNSUMzIFBHQSIsIE5VTEwsICJNSUMzIn0sCiAKIAkvKiBDYXB0dXJlIFBhdGggKi8KIAl7IkFEQzEgTGVmdCBNVVgiLCAiTUlDMSIsICJNSUMxIFBHQSJ9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9lczgzMjguYyBiL3NvdW5kL3NvYy9jb2RlY3MvZXM4MzI4LmMKaW5kZXggZjI3MzI1MS4uYzVmMzVhMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9lczgzMjguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL2VzODMyOC5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3QgZXM4MzI4X3ByaXYgKmVzODMyOCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IGVzODMyOC0+ZGVlbXBoOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gZXM4MzI4LT5kZWVtcGg7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyOSw3ICsxMjksNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCBlczgzMjhfcHJpdiAqZXM4MzI4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCWludCByZXQ7CiAKIAlpZiAoZGVlbXBoID4gMSkKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgwOTAuYwppbmRleCBiMTEyYjFjLi4zZTMzZWYyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL21heDk4MDkwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODA5MC5jCkBAIC0yNjA1LDggKzI2MDUsMjQgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBtYXg5ODA5MF9pMmNfc2h1dGRvd24oc3RydWN0IGkyY19jbGllbnQgKmkyYykKK3sKKwlzdHJ1Y3QgbWF4OTgwOTBfcHJpdiAqbWF4OTgwOTAgPSBkZXZfZ2V0X2RydmRhdGEoJmkyYy0+ZGV2KTsKKworCS8qCisJICogRW5hYmxlIHZvbHVtZSBzbW9vdGhpbmcsIGRpc2FibGUgemVybyBjcm9zcy4gIFRoaXMgd2lsbCBjYXVzZQorCSAqIGEgcXVpY2sgNDBtcyByYW1wIHRvIG11dGUgb24gc2h1dGRvd24uCisJICovCisJcmVnbWFwX3dyaXRlKG1heDk4MDkwLT5yZWdtYXAsCisJCU05ODA5MF9SRUdfTEVWRUxfQ09OVFJPTCwgTTk4MDkwX1ZTRU5OX01BU0spOworCXJlZ21hcF93cml0ZShtYXg5ODA5MC0+cmVnbWFwLAorCQlNOTgwOTBfUkVHX0RFVklDRV9TSFVURE9XTiwgMHgwMCk7CisJbXNsZWVwKDQwKTsKK30KKwogc3RhdGljIGludCBtYXg5ODA5MF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCiB7CisJbWF4OTgwOTBfaTJjX3NodXRkb3duKGNsaWVudCk7CiAJc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZjbGllbnQtPmRldik7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNjk2LDYgKzI3MTIsNyBAQAogCQkuYWNwaV9tYXRjaF90YWJsZSA9IEFDUElfUFRSKG1heDk4MDkwX2FjcGlfbWF0Y2gpLAogCX0sCiAJLnByb2JlICA9IG1heDk4MDkwX2kyY19wcm9iZSwKKwkuc2h1dGRvd24gPSBtYXg5ODA5MF9pMmNfc2h1dGRvd24sCiAJLnJlbW92ZSA9IG1heDk4MDkwX2kyY19yZW1vdmUsCiAJLmlkX3RhYmxlID0gbWF4OTgwOTBfaTJjX2lkLAogfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgzNTdhLmMgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4MzU3YS5jCmluZGV4IGU5ZTZlZmIuLmJmM2U5MzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTgzNTdhLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODM1N2EuYwpAQCAtMjYsOCArMjYsNiBAQAogI2luY2x1ZGUgPHNvdW5kL3NvYy1kYWkuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MtZGFwbS5oPgogCi0jZGVmaW5lIERSVl9OQU1FICJtYXg5ODM1N2EiCi0KIHN0YXRpYyBpbnQgbWF4OTgzNTdhX2RhaW9wc190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCQlpbnQgY21kLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKIHsKQEAgLTg3LDkgKzg1LDkgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIG1heDk4MzU3YV9kYWlfZHJpdmVyID0gewotCS5uYW1lID0gRFJWX05BTUUsCisJLm5hbWUgPSAiSGlGaSIsCiAJLnBsYXliYWNrID0gewotCQkuc3RyZWFtX25hbWUJPSBEUlZfTkFNRSAiLXBsYXliYWNrIiwKKwkJLnN0cmVhbV9uYW1lCT0gIkhpRmkgUGxheWJhY2siLAogCQkuZm9ybWF0cwk9IFNORFJWX1BDTV9GTVRCSVRfUzE2IHwKIAkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMjQgfAogCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MzMiwKQEAgLTEyNyw3ICsxMjUsNyBAQAogCiAjaWZkZWYgQ09ORklHX09GCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtYXg5ODM1N2FfZGV2aWNlX2lkW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJtYXhpbSwiIERSVl9OQU1FLCB9LAorCXsgLmNvbXBhdGlibGUgPSAibWF4aW0sbWF4OTgzNTdhIiB9LAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbWF4OTgzNTdhX2RldmljZV9pZCk7CkBAIC0xMzUsNyArMTMzLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWF4OTgzNTdhX3BsYXRmb3JtX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewotCQkubmFtZSA9IERSVl9OQU1FLAorCQkubmFtZSA9ICJtYXg5ODM1N2EiLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobWF4OTgzNTdhX2RldmljZV9pZCksCiAJfSwKIAkucHJvYmUJPSBtYXg5ODM1N2FfcGxhdGZvcm1fcHJvYmUsCkBAIC0xNDUsNCArMTQzLDMgQEAKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXhpbSBNQVg5ODM1N0EgQ29kZWMgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJWX05BTUUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODkyNS5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODkyNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNWExN2QKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL21heDk4OTI1LmMKQEAgLTAsMCArMSw2NTUgQEAKKy8qCisgKiBtYXg5ODkyNS5jIC0tIEFMU0EgU29DIFN0ZXJlbyBNQVg5ODkyNSBkcml2ZXIKKyAqIENvcHlyaWdodCAyMDEzLTE1IE1heGltIEludGVncmF0ZWQgUHJvZHVjdHMKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9jZGV2Lmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgIm1heDk4OTI1LmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBkYWlfdGV4dFtdID0geworCSJMZWZ0IiwgIlJpZ2h0IiwgIkxlZnRSaWdodCIsICJMZWZ0UmlnaHREaXYyIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWF4OTg5MjVfYm9vc3Rfdm9sdGFnZV90ZXh0W10gPSB7CisJIjguNVYiLCAiOC4yNVYiLCAiOC4wViIsICI3Ljc1ViIsICI3LjVWIiwgIjcuMjVWIiwgIjcuMFYiLCAiNi43NVYiLAorCSI2LjVWIiwgIjYuNVYiLCAiNi41ViIsICI2LjVWIiwgIjYuNVYiLCAiNi41ViIsCSI2LjVWIiwgIjYuNVYiCit9OworCitzdGF0aWMgU09DX0VOVU1fU0lOR0xFX0RFQ0wobWF4OTg5MjVfYm9vc3Rfdm9sdGFnZSwKKwlNQVg5ODkyNV9DT05GSUdVUkFUSU9OLCBNOTg5MjVfQlNUX1ZPVVRfU0hJRlQsCisJbWF4OTg5MjVfYm9vc3Rfdm9sdGFnZV90ZXh0KTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGhwZl90ZXh0W10gPSB7CisJIkRpc2FibGUiLCAiREMgQmxvY2siLCAiMTAwSHoiLAkiMjAwSHoiLCAiNDAwSHoiLCAiODAwSHoiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdfZGVmYXVsdCBtYXg5ODkyNV9yZWdbXSA9IHsKKwl7IDB4MEIsIDB4MDAgfSwgLyogSVJRIEVuYWJsZTAgKi8KKwl7IDB4MEMsIDB4MDAgfSwgLyogSVJRIEVuYWJsZTEgKi8KKwl7IDB4MEQsIDB4MDAgfSwgLyogSVJRIEVuYWJsZTIgKi8KKwl7IDB4MEUsIDB4MDAgfSwgLyogSVJRIENsZWFyMCAqLworCXsgMHgwRiwgMHgwMCB9LCAvKiBJUlEgQ2xlYXIxICovCisJeyAweDEwLCAweDAwIH0sIC8qIElSUSBDbGVhcjIgKi8KKwl7IDB4MTEsIDB4QzAgfSwgLyogTWFwMCAqLworCXsgMHgxMiwgMHgwMCB9LCAvKiBNYXAxICovCisJeyAweDEzLCAweDAwIH0sIC8qIE1hcDIgKi8KKwl7IDB4MTQsIDB4RjAgfSwgLyogTWFwMyAqLworCXsgMHgxNSwgMHgwMCB9LCAvKiBNYXA0ICovCisJeyAweDE2LCAweEFCIH0sIC8qIE1hcDUgKi8KKwl7IDB4MTcsIDB4ODkgfSwgLyogTWFwNiAqLworCXsgMHgxOCwgMHgwMCB9LCAvKiBNYXA3ICovCisJeyAweDE5LCAweDAwIH0sIC8qIE1hcDggKi8KKwl7IDB4MUEsIDB4MDYgfSwgLyogREFJIENsb2NrIE1vZGUgMSAqLworCXsgMHgxQiwgMHhDMCB9LCAvKiBEQUkgQ2xvY2sgTW9kZSAyICovCisJeyAweDFDLCAweDAwIH0sIC8qIERBSSBDbG9jayBEaXZpZGVyIERlbm9taW5hdG9yIE1TQnMgKi8KKwl7IDB4MUQsIDB4MDAgfSwgLyogREFJIENsb2NrIERpdmlkZXIgRGVub21pbmF0b3IgTFNCcyAqLworCXsgMHgxRSwgMHhGMCB9LCAvKiBEQUkgQ2xvY2sgRGl2aWRlciBOdW1lcmF0b3IgTVNCcyAqLworCXsgMHgxRiwgMHgwMCB9LCAvKiBEQUkgQ2xvY2sgRGl2aWRlciBOdW1lcmF0b3IgTFNCcyAqLworCXsgMHgyMCwgMHg1MCB9LCAvKiBGb3JtYXQgKi8KKwl7IDB4MjEsIDB4MDAgfSwgLyogVERNIFNsb3QgU2VsZWN0ICovCisJeyAweDIyLCAweDAwIH0sIC8qIERPVVQgQ29uZmlndXJhdGlvbiBWTU9OICovCisJeyAweDIzLCAweDAwIH0sIC8qIERPVVQgQ29uZmlndXJhdGlvbiBJTU9OICovCisJeyAweDI0LCAweDAwIH0sIC8qIERPVVQgQ29uZmlndXJhdGlvbiBWQkFUICovCisJeyAweDI1LCAweDAwIH0sIC8qIERPVVQgQ29uZmlndXJhdGlvbiBWQlNUICovCisJeyAweDI2LCAweDAwIH0sIC8qIERPVVQgQ29uZmlndXJhdGlvbiBGTEFHICovCisJeyAweDI3LCAweEZGIH0sIC8qIERPVVQgSGlaIENvbmZpZ3VyYXRpb24gMSAqLworCXsgMHgyOCwgMHhGRiB9LCAvKiBET1VUIEhpWiBDb25maWd1cmF0aW9uIDIgKi8KKwl7IDB4MjksIDB4RkYgfSwgLyogRE9VVCBIaVogQ29uZmlndXJhdGlvbiAzICovCisJeyAweDJBLCAweEZGIH0sIC8qIERPVVQgSGlaIENvbmZpZ3VyYXRpb24gNCAqLworCXsgMHgyQiwgMHgwMiB9LCAvKiBET1VUIERyaXZlIFN0cmVuZ3RoICovCisJeyAweDJDLCAweDkwIH0sIC8qIEZpbHRlcnMgKi8KKwl7IDB4MkQsIDB4MDAgfSwgLyogR2FpbiAqLworCXsgMHgyRSwgMHgwMiB9LCAvKiBHYWluIFJhbXBpbmcgKi8KKwl7IDB4MkYsIDB4MDAgfSwgLyogU3BlYWtlciBBbXBsaWZpZXIgKi8KKwl7IDB4MzAsIDB4MEEgfSwgLyogVGhyZXNob2xkICovCisJeyAweDMxLCAweDAwIH0sIC8qIEFMQyBBdHRhY2sgKi8KKwl7IDB4MzIsIDB4ODAgfSwgLyogQUxDIEF0dGVuIGFuZCBSZWxlYXNlICovCisJeyAweDMzLCAweDAwIH0sIC8qIEFMQyBJbmZpbml0ZSBIb2xkIFJlbGVhc2UgKi8KKwl7IDB4MzQsIDB4OTIgfSwgLyogQUxDIENvbmZpZ3VyYXRpb24gKi8KKwl7IDB4MzUsIDB4MDEgfSwgLyogQm9vc3QgQ29udmVydGVyICovCisJeyAweDM2LCAweDAwIH0sIC8qIEJsb2NrIEVuYWJsZSAqLworCXsgMHgzNywgMHgwMCB9LCAvKiBDb25maWd1cmF0aW9uICovCisJeyAweDM4LCAweDAwIH0sIC8qIEdsb2JhbCBFbmFibGUgKi8KKwl7IDB4M0EsIDB4MDAgfSwgLyogQm9vc3QgTGltaXRlciAqLworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBtYXg5ODkyNV9kYWlfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFKE1BWDk4OTI1X0dBSU4sIDUsIEFSUkFZX1NJWkUoZGFpX3RleHQpLCBkYWlfdGV4dCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gbWF4OTg5MjVfaHBmX2VudW0gPQorCVNPQ19FTlVNX1NJTkdMRShNQVg5ODkyNV9GSUxURVJTLCAwLCBBUlJBWV9TSVpFKGhwZl90ZXh0KSwgaHBmX3RleHQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTg5MjVfaHBmX3NlbF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIlJjIEZpbHRlciBNVVggTXV4IiwgbWF4OTg5MjVfaHBmX2VudW0pOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgbWF4OTg5MjVfZGFpX3NlbF9tdXggPQorCVNPQ19EQVBNX0VOVU0oIkRBSSBJTiBNVVggTXV4IiwgbWF4OTg5MjVfZGFpX2VudW0pOworCitzdGF0aWMgaW50IG1heDk4OTI1X2RhY19ldmVudChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKKwkJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgbWF4OTg5MjVfcHJpdiAqbWF4OTg5MjUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QUkVfUE1VOgorCQlyZWdtYXBfdXBkYXRlX2JpdHMobWF4OTg5MjUtPnJlZ21hcCwKKwkJCU1BWDk4OTI1X0JMT0NLX0VOQUJMRSwKKwkJCU05ODkyNV9CU1RfRU5fTUFTSyB8CisJCQlNOTg5MjVfQURDX0lNT05fRU5fTUFTSyB8IE05ODkyNV9BRENfVk1PTl9FTl9NQVNLLAorCQkJTTk4OTI1X0JTVF9FTl9NQVNLIHwKKwkJCU05ODkyNV9BRENfSU1PTl9FTl9NQVNLIHwgTTk4OTI1X0FEQ19WTU9OX0VOX01BU0spOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNRDoKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKG1heDk4OTI1LT5yZWdtYXAsCisJCQlNQVg5ODkyNV9CTE9DS19FTkFCTEUsIE05ODkyNV9CU1RfRU5fTUFTSyB8CisJCQlNOTg5MjVfQURDX0lNT05fRU5fTUFTSyB8IE05ODkyNV9BRENfVk1PTl9FTl9NQVNLLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbWF4OTg5MjVfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0FJRl9JTigiREFJX09VVCIsICJIaUZpIFBsYXliYWNrIiwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKwlTTkRfU09DX0RBUE1fTVVYKCJEQUkgSU4gTVVYIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJCSZtYXg5ODkyNV9kYWlfc2VsX211eCksCisJU05EX1NPQ19EQVBNX01VWCgiUmMgRmlsdGVyIE1VWCIsIFNORF9TT0NfTk9QTSwgMCwgMCwKKwkJCQkmbWF4OTg5MjVfaHBmX3NlbF9tdXgpLAorCVNORF9TT0NfREFQTV9EQUNfRSgiQW1wIEVuYWJsZSIsIE5VTEwsIE1BWDk4OTI1X0JMT0NLX0VOQUJMRSwKKwkJCU05ODkyNV9TUEtfRU5fU0hJRlQsIDAsIG1heDk4OTI1X2RhY19ldmVudCwKKwkJCVNORF9TT0NfREFQTV9QUkVfUE1VIHwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKKwlTTkRfU09DX0RBUE1fU1VQUExZKCJHbG9iYWwgRW5hYmxlIiwgTUFYOTg5MjVfR0xPQkFMX0VOQUJMRSwKKwkJCU05ODkyNV9FTl9TSElGVCwgMCwgTlVMTCwgMCksCisJU05EX1NPQ19EQVBNX09VVFBVVCgiQkVfT1VUIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBtYXg5ODkyNV9hdWRpb19tYXBbXSA9IHsKKwl7IkRBSSBJTiBNVVgiLCAiTGVmdCIsICJEQUlfT1VUIn0sCisJeyJEQUkgSU4gTVVYIiwgIlJpZ2h0IiwgIkRBSV9PVVQifSwKKwl7IkRBSSBJTiBNVVgiLCAiTGVmdFJpZ2h0IiwgIkRBSV9PVVQifSwKKwl7IkRBSSBJTiBNVVgiLCAiTGVmdFJpZ2h0RGl2MiIsICJEQUlfT1VUIn0sCisJeyJSYyBGaWx0ZXIgTVVYIiwgIkRpc2FibGUiLCAiREFJIElOIE1VWCJ9LAorCXsiUmMgRmlsdGVyIE1VWCIsICJEQyBCbG9jayIsICJEQUkgSU4gTVVYIn0sCisJeyJSYyBGaWx0ZXIgTVVYIiwgIjEwMEh6IiwgIkRBSSBJTiBNVVgifSwKKwl7IlJjIEZpbHRlciBNVVgiLCAiMjAwSHoiLCAiREFJIElOIE1VWCJ9LAorCXsiUmMgRmlsdGVyIE1VWCIsICI0MDBIeiIsICJEQUkgSU4gTVVYIn0sCisJeyJSYyBGaWx0ZXIgTVVYIiwgIjgwMEh6IiwgIkRBSSBJTiBNVVgifSwKKwl7IkFtcCBFbmFibGUiLCBOVUxMLCAiUmMgRmlsdGVyIE1VWCJ9LAorCXsiQkVfT1VUIiwgTlVMTCwgIkFtcCBFbmFibGUifSwKKwl7IkJFX09VVCIsIE5VTEwsICJHbG9iYWwgRW5hYmxlIn0sCit9OworCitzdGF0aWMgYm9vbCBtYXg5ODkyNV92b2xhdGlsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIE1BWDk4OTI1X1ZCQVRfREFUQToKKwljYXNlIE1BWDk4OTI1X1ZCU1RfREFUQToKKwljYXNlIE1BWDk4OTI1X0xJVkVfU1RBVFVTMDoKKwljYXNlIE1BWDk4OTI1X0xJVkVfU1RBVFVTMToKKwljYXNlIE1BWDk4OTI1X0xJVkVfU1RBVFVTMjoKKwljYXNlIE1BWDk4OTI1X1NUQVRFMDoKKwljYXNlIE1BWDk4OTI1X1NUQVRFMToKKwljYXNlIE1BWDk4OTI1X1NUQVRFMjoKKwljYXNlIE1BWDk4OTI1X0ZMQUcwOgorCWNhc2UgTUFYOTg5MjVfRkxBRzE6CisJY2FzZSBNQVg5ODkyNV9GTEFHMjoKKwljYXNlIE1BWDk4OTI1X1JFVl9WRVJTSU9OOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBtYXg5ODkyNV9yZWFkYWJsZV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJc3dpdGNoIChyZWcpIHsKKwljYXNlIE1BWDk4OTI1X0lSUV9DTEVBUjA6CisJY2FzZSBNQVg5ODkyNV9JUlFfQ0xFQVIxOgorCWNhc2UgTUFYOTg5MjVfSVJRX0NMRUFSMjoKKwljYXNlIE1BWDk4OTI1X0FMQ19IT0xEX1JMUzoKKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiB0cnVlOworCX0KK30KKworc3RhdGljIERFQ0xBUkVfVExWX0RCX1NDQUxFKG1heDk4OTI1X3Nwa190bHYsIC02MDAsIDEwMCwgMCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtYXg5ODkyNV9zbmRfY29udHJvbHNbXSA9IHsKKwlTT0NfU0lOR0xFX1RMVigiU3BlYWtlciBWb2x1bWUiLCBNQVg5ODkyNV9HQUlOLAorCQlNOTg5MjVfU1BLX0dBSU5fU0hJRlQsICgxPDxNOTg5MjVfU1BLX0dBSU5fV0lEVEgpLTEsIDAsCisJCW1heDk4OTI1X3Nwa190bHYpLAorCVNPQ19TSU5HTEUoIlJhbXAgU3dpdGNoIiwgTUFYOTg5MjVfR0FJTl9SQU1QSU5HLAorCQkJCU05ODkyNV9TUEtfUk1QX0VOX1NISUZULCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJaQ0QgU3dpdGNoIiwgTUFYOTg5MjVfR0FJTl9SQU1QSU5HLAorCQkJCU05ODkyNV9TUEtfWkNEX0VOX1NISUZULCAxLCAwKSwKKwlTT0NfU0lOR0xFKCJBTEMgU3dpdGNoIiwgTUFYOTg5MjVfVEhSRVNIT0xELAorCQkJCU05ODkyNV9BTENfRU5fU0hJRlQsIDEsIDApLAorCVNPQ19TSU5HTEUoIkFMQyBUaHJlc2hvbGQiLCBNQVg5ODkyNV9USFJFU0hPTEQsIE05ODkyNV9BTENfVEhfU0hJRlQsCisJCQkJKDE8PE05ODkyNV9BTENfVEhfV0lEVEgpLTEsIDApLAorCVNPQ19FTlVNKCJCb29zdCBPdXRwdXQgVm9sdGFnZSIsIG1heDk4OTI1X2Jvb3N0X3ZvbHRhZ2UpLAorfTsKKworLyogY29kZWMgc2FtcGxlIHJhdGUgYW5kIG4vbSBkaXZpZGVycyBwYXJhbWV0ZXIgdGFibGUgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCByYXRlOworCWludCAgc3I7CisJaW50IGRpdmlzb3JzWzNdWzJdOworfSByYXRlX3RhYmxlW10gPSB7CisJeworCQkucmF0ZSA9IDgwMDAsCisJCS5zciA9IDAsCisJCS5kaXZpc29ycyA9IHsgezEsIDM3NX0sIHs1LCAxNzY0fSwgezEsIDM4NH0gfQorCX0sCisJeworCQkucmF0ZSA9IDExMDI1LAorCQkuc3IgPSAxLAorCQkuZGl2aXNvcnMgPSB7IHsxNDcsIDQwMDAwfSwgezEsIDI1Nn0sIHsxNDcsIDQwOTYwfSB9CisJfSwKKwl7CisJCS5yYXRlID0gMTIwMDAsCisJCS5zciA9IDIsCisJCS5kaXZpc29ycyA9IHsgezEsIDI1MH0sIHs1LCAxMTc2fSwgezEsIDI1Nn0gfQorCX0sCisJeworCQkucmF0ZSA9IDE2MDAwLAorCQkuc3IgPSAzLAorCQkuZGl2aXNvcnMgPSB7IHsyLCAzNzV9LCB7NSwgODgyfSwgezEsIDE5Mn0gfQorCX0sCisJeworCQkucmF0ZSA9IDIyMDUwLAorCQkuc3IgPSA0LAorCQkuZGl2aXNvcnMgPSB7IHsxNDcsIDIwMDAwfSwgezEsIDEyOH0sIHsxNDcsIDIwNDgwfSB9CisJfSwKKwl7CisJCS5yYXRlID0gMjQwMDAsCisJCS5zciA9IDUsCisJCS5kaXZpc29ycyA9IHsgezEsIDEyNX0sIHs1LCA1ODh9LCB7MSwgMTI4fSB9CisJfSwKKwl7CisJCS5yYXRlID0gMzIwMDAsCisJCS5zciA9IDYsCisJCS5kaXZpc29ycyA9IHsgezQsIDM3NX0sIHs1LCA0NDF9LCB7MSwgOTZ9IH0KKwl9LAorCXsKKwkJLnJhdGUgPSA0NDEwMCwKKwkJLnNyID0gNywKKwkJLmRpdmlzb3JzID0geyB7MTQ3LCAxMDAwMH0sIHsxLCA2NH0sIHsxNDcsIDEwMjQwfSB9CisJfSwKKwl7CisJCS5yYXRlID0gNDgwMDAsCisJCS5zciA9IDgsCisJCS5kaXZpc29ycyA9IHsgezIsIDEyNX0sIHs1LCAyOTR9LCB7MSwgNjR9IH0KKwl9LAorfTsKKworc3RhdGljIGlubGluZSBpbnQgbWF4OTg5MjVfcmF0ZV92YWx1ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJCWludCByYXRlLCBpbnQgY2xvY2ssIGludCAqdmFsdWUsIGludCAqbiwgaW50ICptKQoreworCWludCByZXQgPSAtRUlOVkFMOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmF0ZV90YWJsZSk7IGkrKykgeworCQlpZiAocmF0ZV90YWJsZVtpXS5yYXRlID49IHJhdGUpIHsKKwkJCSp2YWx1ZSA9IHJhdGVfdGFibGVbaV0uc3I7CisJCQkqbiA9IHJhdGVfdGFibGVbaV0uZGl2aXNvcnNbY2xvY2tdWzBdOworCQkJKm0gPSByYXRlX3RhYmxlW2ldLmRpdmlzb3JzW2Nsb2NrXVsxXTsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogc2FtcGxlIHJhdGUgaXMgJWQsIHJldHVybmluZyAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmF0ZV90YWJsZVtpXS5yYXRlLCAqdmFsdWUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1heDk4OTI1X3NldF9zZW5zZV9kYXRhKHN0cnVjdCBtYXg5ODkyNV9wcml2ICptYXg5ODkyNSkKK3sKKwkvKiBzZXQgVk1PTiBzbG90cyAqLworCXJlZ21hcF91cGRhdGVfYml0cyhtYXg5ODkyNS0+cmVnbWFwLAorCQlNQVg5ODkyNV9ET1VUX0NGR19WTU9OLAorCQlNOTg5MjVfREFJX1ZNT05fRU5fTUFTSywgTTk4OTI1X0RBSV9WTU9OX0VOX01BU0spOworCXJlZ21hcF91cGRhdGVfYml0cyhtYXg5ODkyNS0+cmVnbWFwLAorCQlNQVg5ODkyNV9ET1VUX0NGR19WTU9OLAorCQlNOTg5MjVfREFJX1ZNT05fU0xPVF9NQVNLLAorCQltYXg5ODkyNS0+dl9zbG90IDw8IE05ODkyNV9EQUlfVk1PTl9TTE9UX1NISUZUKTsKKwkvKiBzZXQgSU1PTiBzbG90cyAqLworCXJlZ21hcF91cGRhdGVfYml0cyhtYXg5ODkyNS0+cmVnbWFwLAorCQlNQVg5ODkyNV9ET1VUX0NGR19JTU9OLAorCQlNOTg5MjVfREFJX0lNT05fRU5fTUFTSywgTTk4OTI1X0RBSV9JTU9OX0VOX01BU0spOworCXJlZ21hcF91cGRhdGVfYml0cyhtYXg5ODkyNS0+cmVnbWFwLAorCQlNQVg5ODkyNV9ET1VUX0NGR19JTU9OLAorCQlNOTg5MjVfREFJX0lNT05fU0xPVF9NQVNLLAorCQltYXg5ODkyNS0+aV9zbG90IDw8IE05ODkyNV9EQUlfSU1PTl9TTE9UX1NISUZUKTsKK30KKworc3RhdGljIGludCBtYXg5ODkyNV9kYWlfc2V0X2ZtdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSwKKwkJCQkgdW5zaWduZWQgaW50IGZtdCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOworCXN0cnVjdCBtYXg5ODkyNV9wcml2ICptYXg5ODkyNSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCBpbnZlcnQgPSAwOworCisJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiJXM6IGZtdCAweCUwOFhcbiIsIF9fZnVuY19fLCBmbXQpOworCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCU19DRlM6CisJCS8qIHNldCBEQUkgdG8gc2xhdmUgbW9kZSAqLworCQlyZWdtYXBfdXBkYXRlX2JpdHMobWF4OTg5MjUtPnJlZ21hcCwKKwkJCU1BWDk4OTI1X0RBSV9DTEtfTU9ERTIsCisJCQlNOTg5MjVfREFJX01BU19NQVNLLCAwKTsKKwkJbWF4OTg5MjVfc2V0X3NlbnNlX2RhdGEobWF4OTg5MjUpOworCQlicmVhazsKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CisJCS8qCisJCSAqIHNldCBsZWZ0IGNoYW5uZWwgREFJIHRvIG1hc3RlciBtb2RlLAorCQkgKiByaWdodCBjaGFubmVsIGFsd2F5cyBzbGF2ZQorCQkgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKG1heDk4OTI1LT5yZWdtYXAsCisJCQlNQVg5ODkyNV9EQUlfQ0xLX01PREUyLAorCQkJTTk4OTI1X0RBSV9NQVNfTUFTSywgTTk4OTI1X0RBSV9NQVNfTUFTSyk7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTToKKwljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRlM6CisJZGVmYXVsdDoKKwkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiREFJIGNsb2NrIG1vZGUgdW5zdXBwb3J0ZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChmbXQgJiBTTkRfU09DX0RBSUZNVF9JTlZfTUFTSykgeworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfSUY6CisJCWludmVydCA9IE05ODkyNV9EQUlfV0NJX01BU0s7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6CisJCWludmVydCA9IE05ODkyNV9EQUlfQkNJX01BU0s7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfSUY6CisJCWludmVydCA9IE05ODkyNV9EQUlfQkNJX01BU0sgfCBNOTg5MjVfREFJX1dDSV9NQVNLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJEQUkgaW52ZXJ0IG1vZGUgdW5zdXBwb3J0ZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVnbWFwX3VwZGF0ZV9iaXRzKG1heDk4OTI1LT5yZWdtYXAsIE1BWDk4OTI1X0ZPUk1BVCwKKwkJCU05ODkyNV9EQUlfQkNJX01BU0ssIGludmVydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4OTg5MjVfc2V0X2Nsb2NrKHN0cnVjdCBtYXg5ODkyNV9wcml2ICptYXg5ODkyNSwKKwkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJdW5zaWduZWQgaW50IGRhaV9zciA9IDAsIGNsb2NrLCBtZGxsLCBuLCBtOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IG1heDk4OTI1LT5jb2RlYzsKKwlpbnQgcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7CisJLyogQkNMSy9MUkNMSyByYXRpbyBjYWxjdWxhdGlvbiAqLworCWludCBibHJfY2xrX3JhdGlvID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcykgKiBtYXg5ODkyNS0+Y2hfc2l6ZTsKKworCXN3aXRjaCAoYmxyX2Nsa19yYXRpbykgeworCWNhc2UgMzI6CisJCXJlZ21hcF91cGRhdGVfYml0cyhtYXg5ODkyNS0+cmVnbWFwLAorCQkJTUFYOTg5MjVfREFJX0NMS19NT0RFMiwKKwkJCU05ODkyNV9EQUlfQlNFTF9NQVNLLCBNOTg5MjVfREFJX0JTRUxfMzIpOworCQlicmVhazsKKwljYXNlIDQ4OgorCQlyZWdtYXBfdXBkYXRlX2JpdHMobWF4OTg5MjUtPnJlZ21hcCwKKwkJCU1BWDk4OTI1X0RBSV9DTEtfTU9ERTIsCisJCQlNOTg5MjVfREFJX0JTRUxfTUFTSywgTTk4OTI1X0RBSV9CU0VMXzQ4KTsKKwkJYnJlYWs7CisJY2FzZSA2NDoKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKG1heDk4OTI1LT5yZWdtYXAsCisJCQlNQVg5ODkyNV9EQUlfQ0xLX01PREUyLAorCQkJTTk4OTI1X0RBSV9CU0VMX01BU0ssIE05ODkyNV9EQUlfQlNFTF82NCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN3aXRjaCAobWF4OTg5MjUtPnN5c2NsaykgeworCWNhc2UgNjAwMDAwMDoKKwkJY2xvY2sgPSAwOworCQltZGxsICA9IE05ODkyNV9NRExMX01VTFRfTUNMS3gxNjsKKwkJYnJlYWs7CisJY2FzZSAxMTI4OTYwMDoKKwkJY2xvY2sgPSAxOworCQltZGxsICA9IE05ODkyNV9NRExMX01VTFRfTUNMS3g4OworCQlicmVhazsKKwljYXNlIDEyMDAwMDAwOgorCQljbG9jayA9IDA7CisJCW1kbGwgID0gTTk4OTI1X01ETExfTVVMVF9NQ0xLeDg7CisJCWJyZWFrOworCWNhc2UgMTIyODgwMDA6CisJCWNsb2NrID0gMjsKKwkJbWRsbCAgPSBNOTg5MjVfTURMTF9NVUxUX01DTEt4ODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2luZm8obWF4OTg5MjUtPmNvZGVjLT5kZXYsICJ1bnN1cHBvcnRlZCBzeXNjbGsgJWRcbiIsCisJCQkJCW1heDk4OTI1LT5zeXNjbGspOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAobWF4OTg5MjVfcmF0ZV92YWx1ZShjb2RlYywgcmF0ZSwgY2xvY2ssICZkYWlfc3IsICZuLCAmbSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc2V0IERBSV9TUiB0byBjb3JyZWN0IExSQ0xLIGZyZXF1ZW5jeSAqLworCXJlZ21hcF91cGRhdGVfYml0cyhtYXg5ODkyNS0+cmVnbWFwLAorCQkJTUFYOTg5MjVfREFJX0NMS19NT0RFMiwKKwkJCU05ODkyNV9EQUlfU1JfTUFTSywgZGFpX3NyIDw8IE05ODkyNV9EQUlfU1JfU0hJRlQpOworCS8qIHNldCBEQUkgbSBkaXZpZGVyICovCisJcmVnbWFwX3dyaXRlKG1heDk4OTI1LT5yZWdtYXAsCisJCU1BWDk4OTI1X0RBSV9DTEtfRElWX01fTVNCUywgbSA+PiA4KTsKKwlyZWdtYXBfd3JpdGUobWF4OTg5MjUtPnJlZ21hcCwKKwkJTUFYOTg5MjVfREFJX0NMS19ESVZfTV9MU0JTLCBtICYgMHhGRik7CisJLyogc2V0IERBSSBuIGRpdmlkZXIgKi8KKwlyZWdtYXBfd3JpdGUobWF4OTg5MjUtPnJlZ21hcCwKKwkJTUFYOTg5MjVfREFJX0NMS19ESVZfTl9NU0JTLCBuID4+IDgpOworCXJlZ21hcF93cml0ZShtYXg5ODkyNS0+cmVnbWFwLAorCQlNQVg5ODkyNV9EQUlfQ0xLX0RJVl9OX0xTQlMsIG4gJiAweEZGKTsKKwkvKiBzZXQgTURMTCAqLworCXJlZ21hcF91cGRhdGVfYml0cyhtYXg5ODkyNS0+cmVnbWFwLCBNQVg5ODkyNV9EQUlfQ0xLX01PREUxLAorCQkJTTk4OTI1X01ETExfTVVMVF9NQVNLLCBtZGxsIDw8IE05ODkyNV9NRExMX01VTFRfU0hJRlQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1heDk4OTI1X2RhaV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCisJCQkJICAgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgbWF4OTg5MjVfcHJpdiAqbWF4OTg5MjUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXN3aXRjaCAoc25kX3BjbV9mb3JtYXRfd2lkdGgocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSkgeworCWNhc2UgMTY6CisJCXJlZ21hcF91cGRhdGVfYml0cyhtYXg5ODkyNS0+cmVnbWFwLAorCQkJCU1BWDk4OTI1X0ZPUk1BVCwKKwkJCQlNOTg5MjVfREFJX0NIQU5TWl9NQVNLLCBNOTg5MjVfREFJX0NIQU5TWl8xNik7CisJCW1heDk4OTI1LT5jaF9zaXplID0gMTY7CisJCWJyZWFrOworCWNhc2UgMjQ6CisJCXJlZ21hcF91cGRhdGVfYml0cyhtYXg5ODkyNS0+cmVnbWFwLAorCQkJCU1BWDk4OTI1X0ZPUk1BVCwKKwkJCQlNOTg5MjVfREFJX0NIQU5TWl9NQVNLLCBNOTg5MjVfREFJX0NIQU5TWl8yNCk7CisJCW1heDk4OTI1LT5jaF9zaXplID0gMjQ7CisJCWJyZWFrOworCWNhc2UgMzI6CisJCXJlZ21hcF91cGRhdGVfYml0cyhtYXg5ODkyNS0+cmVnbWFwLAorCQkJCU1BWDk4OTI1X0ZPUk1BVCwKKwkJCQlNOTg5MjVfREFJX0NIQU5TWl9NQVNLLCBNOTg5MjVfREFJX0NIQU5TWl8zMik7CisJCW1heDk4OTI1LT5jaF9zaXplID0gMzI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiJXM6IGZvcm1hdCB1bnN1cHBvcnRlZCAlZCIsCisJCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXZfZGJnKGNvZGVjLT5kZXYsICIlczogZm9ybWF0IHN1cHBvcnRlZCAlZCIsCisJCQkJX19mdW5jX18sIHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJcmV0dXJuIG1heDk4OTI1X3NldF9jbG9jayhtYXg5ODkyNSwgcGFyYW1zKTsKK30KKworc3RhdGljIGludCBtYXg5ODkyNV9kYWlfc2V0X3N5c2NsayhzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQkgICBpbnQgY2xrX2lkLCB1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBkYWktPmNvZGVjOworCXN0cnVjdCBtYXg5ODkyNV9wcml2ICptYXg5ODkyNSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJc3dpdGNoIChjbGtfaWQpIHsKKwljYXNlIDA6CisJCS8qIHVzZSBNQ0xLIGZvciBMZWZ0IGNoYW5uZWwsIHJpZ2h0IGNoYW5uZWwgYWx3YXlzIEJDTEsgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKG1heDk4OTI1LT5yZWdtYXAsCisJCQkJTUFYOTg5MjVfREFJX0NMS19NT0RFMSwKKwkJCQlNOTg5MjVfREFJX0NMS19TT1VSQ0VfTUFTSywgMCk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogY29uZmlndXJlIGRhaSBjbG9jayBzb3VyY2UgdG8gQkNMSyBpbnN0ZWFkIG9mIE1DTEsgKi8KKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKG1heDk4OTI1LT5yZWdtYXAsCisJCQkJTUFYOTg5MjVfREFJX0NMS19NT0RFMSwKKwkJCQlNOTg5MjVfREFJX0NMS19TT1VSQ0VfTUFTSywKKwkJCQlNOTg5MjVfREFJX0NMS19TT1VSQ0VfTUFTSyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltYXg5ODkyNS0+c3lzY2xrID0gZnJlcTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNQVg5ODkyNV9GT1JNQVRTIChTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFwKKwkJCVNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIG1heDk4OTI1X2RhaV9vcHMgPSB7CisJLnNldF9zeXNjbGsgPSBtYXg5ODkyNV9kYWlfc2V0X3N5c2NsaywKKwkuc2V0X2ZtdCA9IG1heDk4OTI1X2RhaV9zZXRfZm10LAorCS5od19wYXJhbXMgPSBtYXg5ODkyNV9kYWlfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbWF4OTg5MjVfZGFpW10gPSB7CisJeworCQkubmFtZSA9ICJtYXg5ODkyNS1haWYxIiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIkhpRmkgUGxheWJhY2siLAorCQkJLmNoYW5uZWxzX21pbiA9IDEsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAsCisJCQkuZm9ybWF0cyA9IE1BWDk4OTI1X0ZPUk1BVFMsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkhpRmkgQ2FwdHVyZSIsCisJCQkuY2hhbm5lbHNfbWluID0gMSwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJCS5mb3JtYXRzID0gTUFYOTg5MjVfRk9STUFUUywKKwkJfSwKKwkJLm9wcyA9ICZtYXg5ODkyNV9kYWlfb3BzLAorCX0KK307CisKK3N0YXRpYyBpbnQgbWF4OTg5MjVfcHJvYmUoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCBtYXg5ODkyNV9wcml2ICptYXg5ODkyNSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJbWF4OTg5MjUtPmNvZGVjID0gY29kZWM7CisJY29kZWMtPmNvbnRyb2xfZGF0YSA9IG1heDk4OTI1LT5yZWdtYXA7CisJcmVnbWFwX3dyaXRlKG1heDk4OTI1LT5yZWdtYXAsIE1BWDk4OTI1X0dMT0JBTF9FTkFCTEUsIDB4MDApOworCS8qIEl0J3Mgbm90IHRoZSBkZWZhdWx0IGJ1dCB3ZSBuZWVkIHRvIHNldCBEQUlfRExZICovCisJcmVnbWFwX3dyaXRlKG1heDk4OTI1LT5yZWdtYXAsCisJCQlNQVg5ODkyNV9GT1JNQVQsIE05ODkyNV9EQUlfRExZX01BU0spOworCXJlZ21hcF93cml0ZShtYXg5ODkyNS0+cmVnbWFwLCBNQVg5ODkyNV9URE1fU0xPVF9TRUxFQ1QsIDB4QzgpOworCXJlZ21hcF93cml0ZShtYXg5ODkyNS0+cmVnbWFwLCBNQVg5ODkyNV9ET1VUX0hJWl9DRkcxLCAweEZGKTsKKwlyZWdtYXBfd3JpdGUobWF4OTg5MjUtPnJlZ21hcCwgTUFYOTg5MjVfRE9VVF9ISVpfQ0ZHMiwgMHhGRik7CisJcmVnbWFwX3dyaXRlKG1heDk4OTI1LT5yZWdtYXAsIE1BWDk4OTI1X0RPVVRfSElaX0NGRzMsIDB4RkYpOworCXJlZ21hcF93cml0ZShtYXg5ODkyNS0+cmVnbWFwLCBNQVg5ODkyNV9ET1VUX0hJWl9DRkc0LCAweEYwKTsKKwlyZWdtYXBfd3JpdGUobWF4OTg5MjUtPnJlZ21hcCwgTUFYOTg5MjVfRklMVEVSUywgMHhEOCk7CisJcmVnbWFwX3dyaXRlKG1heDk4OTI1LT5yZWdtYXAsIE1BWDk4OTI1X0FMQ19DT05GSUdVUkFUSU9OLCAweEY4KTsKKwlyZWdtYXBfd3JpdGUobWF4OTg5MjUtPnJlZ21hcCwgTUFYOTg5MjVfQ09ORklHVVJBVElPTiwgMHhGMCk7CisJLyogRGlzYWJsZSBBTEMgbXV0aW5nICovCisJcmVnbWFwX3dyaXRlKG1heDk4OTI1LT5yZWdtYXAsIE1BWDk4OTI1X0JPT1NUX0xJTUlURVIsIDB4RjgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfbWF4OTg5MjUgPSB7CisJLnByb2JlICAgICAgICAgICAgPSBtYXg5ODkyNV9wcm9iZSwKKwkuY29udHJvbHMgPSBtYXg5ODkyNV9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWF4OTg5MjVfc25kX2NvbnRyb2xzKSwKKwkuZGFwbV9yb3V0ZXMgPSBtYXg5ODkyNV9hdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWF4OTg5MjVfYXVkaW9fbWFwKSwKKwkuZGFwbV93aWRnZXRzID0gbWF4OTg5MjVfZGFwbV93aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShtYXg5ODkyNV9kYXBtX3dpZGdldHMpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIG1heDk4OTI1X3JlZ21hcCA9IHsKKwkucmVnX2JpdHMgICAgICAgICA9IDgsCisJLnZhbF9iaXRzICAgICAgICAgPSA4LAorCS5tYXhfcmVnaXN0ZXIgICAgID0gTUFYOTg5MjVfUkVWX1ZFUlNJT04sCisJLnJlZ19kZWZhdWx0cyAgICAgPSBtYXg5ODkyNV9yZWcsCisJLm51bV9yZWdfZGVmYXVsdHMgPSBBUlJBWV9TSVpFKG1heDk4OTI1X3JlZyksCisJLnZvbGF0aWxlX3JlZyAgICAgPSBtYXg5ODkyNV92b2xhdGlsZV9yZWdpc3RlciwKKwkucmVhZGFibGVfcmVnICAgICA9IG1heDk4OTI1X3JlYWRhYmxlX3JlZ2lzdGVyLAorCS5jYWNoZV90eXBlICAgICAgID0gUkVHQ0FDSEVfUkJUUkVFLAorfTsKKworc3RhdGljIGludCBtYXg5ODkyNV9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgICAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQsIHJlZzsKKwl1MzIgdmFsdWU7CisJc3RydWN0IG1heDk4OTI1X3ByaXYgKm1heDk4OTI1OworCisJbWF4OTg5MjUgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LAorCQkJc2l6ZW9mKCptYXg5ODkyNSksIEdGUF9LRVJORUwpOworCWlmICghbWF4OTg5MjUpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgbWF4OTg5MjUpOworCW1heDk4OTI1LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhpMmMsICZtYXg5ODkyNV9yZWdtYXApOworCWlmIChJU19FUlIobWF4OTg5MjUtPnJlZ21hcCkpIHsKKwkJcmV0ID0gUFRSX0VSUihtYXg5ODkyNS0+cmVnbWFwKTsKKwkJZGV2X2VycigmaTJjLT5kZXYsCisJCQkJIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdtYXA6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihpMmMtPmRldi5vZl9ub2RlLCAidm1vbi1zbG90LW5vIiwgJnZhbHVlKSkgeworCQlpZiAodmFsdWUgPiBNOTg5MjVfREFJX1ZNT05fU0xPVF8xRV8xRikgeworCQkJZGV2X2VycigmaTJjLT5kZXYsICJ2bW9uIHNsb3QgbnVtYmVyIGlzIHdyb25nOlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQltYXg5ODkyNS0+dl9zbG90ID0gdmFsdWU7CisJfQorCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIoaTJjLT5kZXYub2Zfbm9kZSwgImltb24tc2xvdC1ubyIsICZ2YWx1ZSkpIHsKKwkJaWYgKHZhbHVlID4gTTk4OTI1X0RBSV9JTU9OX1NMT1RfMUVfMUYpIHsKKwkJCWRldl9lcnIoJmkyYy0+ZGV2LCAiaW1vbiBzbG90IG51bWJlciBpcyB3cm9uZzpcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJbWF4OTg5MjUtPmlfc2xvdCA9IHZhbHVlOworCX0KKwlyZXQgPSByZWdtYXBfcmVhZChtYXg5ODkyNS0+cmVnbWFwLAorCQkJTUFYOTg5MjVfUkVWX1ZFUlNJT04sICZyZWcpOworCWlmICgocmV0IDwgMCkgfHwKKwkJKChyZWcgIT0gTUFYOTg5MjVfVkVSU0lPTikgJiYKKwkJKHJlZyAhPSBNQVg5ODkyNV9WRVJTSU9OMSkpKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LAorCQkJImRldmljZSBpbml0aWFsaXphdGlvbiBlcnJvciAoJWQgMHglMDJYKVxuIiwKKwkJCXJldCwgcmVnKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlkZXZfaW5mbygmaTJjLT5kZXYsICJkZXZpY2UgdmVyc2lvbiAweCUwMlhcbiIsIHJlZyk7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwgJnNvY19jb2RlY19kZXZfbWF4OTg5MjUsCisJCQltYXg5ODkyNV9kYWksIEFSUkFZX1NJWkUobWF4OTg5MjVfZGFpKSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoJmkyYy0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gcmVnaXN0ZXIgY29kZWM6ICVkXG4iLCByZXQpOworZXJyX291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1heDk4OTI1X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmNsaWVudC0+ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIG1heDk4OTI1X2kyY19pZFtdID0geworCXsgIm1heDk4OTI1IiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBtYXg5ODkyNV9pMmNfaWQpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtYXg5ODkyNV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAibWF4aW0sbWF4OTg5MjUiLCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG1heDk4OTI1X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1heDk4OTI1X2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibWF4OTg5MjUiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKG1heDk4OTI1X29mX21hdGNoKSwKKwkJLnBtID0gTlVMTCwKKwl9LAorCS5wcm9iZSAgPSBtYXg5ODkyNV9pMmNfcHJvYmUsCisJLnJlbW92ZSA9IG1heDk4OTI1X2kyY19yZW1vdmUsCisJLmlkX3RhYmxlID0gbWF4OTg5MjVfaTJjX2lkLAorfTsKKworbW9kdWxlX2kyY19kcml2ZXIobWF4OTg5MjVfaTJjX2RyaXZlcikKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBTFNBIFNvQyBNQVg5ODkyNSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlJhbHBoIEJpcnQgPHJkYmlydEBnbWFpbC5jb20+LCBBbmlzaCBrdW1hciA8YW5pc2gua3VtYXJAbWF4aW1pbnRlZ3JhdGVkLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg5MjUuaCBiL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg5MjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzgzMjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODkyNS5oCkBAIC0wLDAgKzEsODMyIEBACisvKgorICogbWF4OTg5MjUuaCAtLSBNQVg5ODkyNSBBTFNBIFNvQyBBdWRpbyBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgMjAxMy0yMDE1IE1heGltIEludGVncmF0ZWQgUHJvZHVjdHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgX01BWDk4OTI1X0gKKyNkZWZpbmUgX01BWDk4OTI1X0gKKworI2RlZmluZQlNQVg5ODkyNV9WRVJTSU9OCTB4NTEKKyNkZWZpbmUJTUFYOTg5MjVfVkVSU0lPTjEJMHg4MAorI2RlZmluZSBNQVg5ODkyNV9WQkFUX0RBVEEJCTB4MDAKKyNkZWZpbmUgTUFYOTg5MjVfVkJTVF9EQVRBCQkweDAxCisjZGVmaW5lIE1BWDk4OTI1X0xJVkVfU1RBVFVTMAkJMHgwMgorI2RlZmluZSBNQVg5ODkyNV9MSVZFX1NUQVRVUzEJCTB4MDMKKyNkZWZpbmUgTUFYOTg5MjVfTElWRV9TVEFUVVMyCQkweDA0CisjZGVmaW5lIE1BWDk4OTI1X1NUQVRFMAkJCTB4MDUKKyNkZWZpbmUgTUFYOTg5MjVfU1RBVEUxCQkJMHgwNgorI2RlZmluZSBNQVg5ODkyNV9TVEFURTIJCQkweDA3CisjZGVmaW5lIE1BWDk4OTI1X0ZMQUcwCQkJMHgwOAorI2RlZmluZSBNQVg5ODkyNV9GTEFHMQkJCTB4MDkKKyNkZWZpbmUgTUFYOTg5MjVfRkxBRzIJCQkweDBBCisjZGVmaW5lIE1BWDk4OTI1X0lSUV9FTkFCTEUwCQkweDBCCisjZGVmaW5lIE1BWDk4OTI1X0lSUV9FTkFCTEUxCQkweDBDCisjZGVmaW5lIE1BWDk4OTI1X0lSUV9FTkFCTEUyCQkweDBECisjZGVmaW5lIE1BWDk4OTI1X0lSUV9DTEVBUjAJCTB4MEUKKyNkZWZpbmUgTUFYOTg5MjVfSVJRX0NMRUFSMQkJMHgwRgorI2RlZmluZSBNQVg5ODkyNV9JUlFfQ0xFQVIyCQkweDEwCisjZGVmaW5lIE1BWDk4OTI1X01BUDAJCQkweDExCisjZGVmaW5lIE1BWDk4OTI1X01BUDEJCQkweDEyCisjZGVmaW5lIE1BWDk4OTI1X01BUDIJCQkweDEzCisjZGVmaW5lIE1BWDk4OTI1X01BUDMJCQkweDE0CisjZGVmaW5lIE1BWDk4OTI1X01BUDQJCQkweDE1CisjZGVmaW5lIE1BWDk4OTI1X01BUDUJCQkweDE2CisjZGVmaW5lIE1BWDk4OTI1X01BUDYJCQkweDE3CisjZGVmaW5lIE1BWDk4OTI1X01BUDcJCQkweDE4CisjZGVmaW5lIE1BWDk4OTI1X01BUDgJCQkweDE5CisjZGVmaW5lIE1BWDk4OTI1X0RBSV9DTEtfTU9ERTEJCTB4MUEKKyNkZWZpbmUgTUFYOTg5MjVfREFJX0NMS19NT0RFMgkJMHgxQgorI2RlZmluZSBNQVg5ODkyNV9EQUlfQ0xLX0RJVl9NX01TQlMJMHgxQworI2RlZmluZSBNQVg5ODkyNV9EQUlfQ0xLX0RJVl9NX0xTQlMJMHgxRAorI2RlZmluZSBNQVg5ODkyNV9EQUlfQ0xLX0RJVl9OX01TQlMJMHgxRQorI2RlZmluZSBNQVg5ODkyNV9EQUlfQ0xLX0RJVl9OX0xTQlMJMHgxRgorI2RlZmluZSBNQVg5ODkyNV9GT1JNQVQJCQkweDIwCisjZGVmaW5lIE1BWDk4OTI1X1RETV9TTE9UX1NFTEVDVAkweDIxCisjZGVmaW5lIE1BWDk4OTI1X0RPVVRfQ0ZHX1ZNT04JCTB4MjIKKyNkZWZpbmUgTUFYOTg5MjVfRE9VVF9DRkdfSU1PTgkJMHgyMworI2RlZmluZSBNQVg5ODkyNV9ET1VUX0NGR19WQkFUCQkweDI0CisjZGVmaW5lIE1BWDk4OTI1X0RPVVRfQ0ZHX1ZCU1QJCTB4MjUKKyNkZWZpbmUgTUFYOTg5MjVfRE9VVF9DRkdfRkxBRwkJMHgyNgorI2RlZmluZSBNQVg5ODkyNV9ET1VUX0hJWl9DRkcxCQkweDI3CisjZGVmaW5lIE1BWDk4OTI1X0RPVVRfSElaX0NGRzIJCTB4MjgKKyNkZWZpbmUgTUFYOTg5MjVfRE9VVF9ISVpfQ0ZHMwkJMHgyOQorI2RlZmluZSBNQVg5ODkyNV9ET1VUX0hJWl9DRkc0CQkweDJBCisjZGVmaW5lIE1BWDk4OTI1X0RPVVRfRFJWX1NUUkVOR1RICTB4MkIKKyNkZWZpbmUgTUFYOTg5MjVfRklMVEVSUwkJMHgyQworI2RlZmluZSBNQVg5ODkyNV9HQUlOCQkJMHgyRAorI2RlZmluZSBNQVg5ODkyNV9HQUlOX1JBTVBJTkcJCTB4MkUKKyNkZWZpbmUgTUFYOTg5MjVfU1BLX0FNUAkJMHgyRgorI2RlZmluZSBNQVg5ODkyNV9USFJFU0hPTEQJCTB4MzAKKyNkZWZpbmUgTUFYOTg5MjVfQUxDX0FUVEFDSwkJMHgzMQorI2RlZmluZSBNQVg5ODkyNV9BTENfQVRURU5fUkxTCQkweDMyCisjZGVmaW5lIE1BWDk4OTI1X0FMQ19IT0xEX1JMUwkJMHgzMworI2RlZmluZSBNQVg5ODkyNV9BTENfQ09ORklHVVJBVElPTgkweDM0CisjZGVmaW5lIE1BWDk4OTI1X0JPT1NUX0NPTlZFUlRFUgkweDM1CisjZGVmaW5lIE1BWDk4OTI1X0JMT0NLX0VOQUJMRQkJMHgzNgorI2RlZmluZSBNQVg5ODkyNV9DT05GSUdVUkFUSU9OCQkweDM3CisjZGVmaW5lIE1BWDk4OTI1X0dMT0JBTF9FTkFCTEUJCTB4MzgKKyNkZWZpbmUgTUFYOTg5MjVfQk9PU1RfTElNSVRFUgkJMHgzQQorI2RlZmluZSBNQVg5ODkyNV9SRVZfVkVSU0lPTgkJMHhGRgorCisjZGVmaW5lIE1BWDk4OTI1X1JFR19DTlQgICAgICAgICAgICAgICAoTUFYOTg5MjVfUjAzQV9CT09TVF9MSU1JVEVSKzEpCisKKy8qIE1BWDk4OTI1IFJlZ2lzdGVyIEJpdCBGaWVsZHMgKi8KKworLyogTUFYOTg5MjVfUjAwMl9MSVZFX1NUQVRVUzAgKi8KKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9TVEFUVVNfTUFTSwkJCSgxPDwzKQorI2RlZmluZSBNOTg5MjVfVEhFUk1XQVJOX1NUQVRVU19TSElGVAkJCTMKKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9TVEFUVVNfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9USEVSTVNIRE5fU1RBVFVTX01BU0sJCQkoMTw8MSkKKyNkZWZpbmUgTTk4OTI1X1RIRVJNU0hETl9TVEFUVVNfU0hJRlQJCQkxCisjZGVmaW5lIE05ODkyNV9USEVSTVNIRE5fU1RBVFVTX1dJRFRICQkJMQorCisvKiBNQVg5ODkyNV9SMDAzX0xJVkVfU1RBVFVTMSAqLworI2RlZmluZSBNOTg5MjVfU1BLQ1VSTlRfU1RBVFVTX01BU0sJCQkoMTw8NSkKKyNkZWZpbmUgTTk4OTI1X1NQS0NVUk5UX1NUQVRVU19TSElGVAkJCTUKKyNkZWZpbmUgTTk4OTI1X1NQS0NVUk5UX1NUQVRVU19XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X1dBVENIRkFJTF9TVEFUVVNfTUFTSwkJCSgxPDw0KQorI2RlZmluZSBNOTg5MjVfV0FUQ0hGQUlMX1NUQVRVU19TSElGVAkJCTQKKyNkZWZpbmUgTTk4OTI1X1dBVENIRkFJTF9TVEFUVVNfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9BTENJTkZIX1NUQVRVU19NQVNLCQkJKDE8PDMpCisjZGVmaW5lIE05ODkyNV9BTENJTkZIX1NUQVRVU19TSElGVAkJCTMKKyNkZWZpbmUgTTk4OTI1X0FMQ0lORkhfU1RBVFVTX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfQUxDQUNUX1NUQVRVU19NQVNLCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9BTENBQ1RfU1RBVFVTX1NISUZUCQkJMgorI2RlZmluZSBNOTg5MjVfQUxDQUNUX1NUQVRVU19XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X0FMQ01VVF9TVEFUVVNfTUFTSwkJCSgxPDwxKQorI2RlZmluZSBNOTg5MjVfQUxDTVVUX1NUQVRVU19TSElGVAkJCTEKKyNkZWZpbmUgTTk4OTI1X0FMQ01VVF9TVEFUVVNfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9BQ0xQX1NUQVRVU19NQVNLCQkJCSgxPDwwKQorI2RlZmluZSBNOTg5MjVfQUNMUF9TVEFUVVNfU0hJRlQJCQkwCisjZGVmaW5lIE05ODkyNV9BQ0xQX1NUQVRVU19XSURUSAkJCTEKKworLyogTUFYOTg5MjVfUjAwNF9MSVZFX1NUQVRVUzIgKi8KKyNkZWZpbmUgTTk4OTI1X1NMT1RPVlJOX1NUQVRVU19NQVNLCQkJKDE8PDYpCisjZGVmaW5lIE05ODkyNV9TTE9UT1ZSTl9TVEFUVVNfU0hJRlQJCQk2CisjZGVmaW5lIE05ODkyNV9TTE9UT1ZSTl9TVEFUVVNfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9JTlZBTFNMT1RfU1RBVFVTX01BU0sJCQkoMTw8NSkKKyNkZWZpbmUgTTk4OTI1X0lOVkFMU0xPVF9TVEFUVVNfU0hJRlQJCQk1CisjZGVmaW5lIE05ODkyNV9JTlZBTFNMT1RfU1RBVFVTX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfU0xPVENORkxUX1NUQVRVU19NQVNLCQkJKDE8PDQpCisjZGVmaW5lIE05ODkyNV9TTE9UQ05GTFRfU1RBVFVTX1NISUZUCQkJNAorI2RlZmluZSBNOTg5MjVfU0xPVENORkxUX1NUQVRVU19XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X1ZCU1RPVkZMX1NUQVRVU19NQVNLCQkJKDE8PDMpCisjZGVmaW5lIE05ODkyNV9WQlNUT1ZGTF9TVEFUVVNfU0hJRlQJCQkzCisjZGVmaW5lIE05ODkyNV9WQlNUT1ZGTF9TVEFUVVNfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9WQkFUT1ZGTF9TVEFUVVNfTUFTSwkJCSgxPDwyKQorI2RlZmluZSBNOTg5MjVfVkJBVE9WRkxfU1RBVFVTX1NISUZUCQkJMgorI2RlZmluZSBNOTg5MjVfVkJBVE9WRkxfU1RBVFVTX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfSU1PTk9WRkxfU1RBVFVTX01BU0sJCQkoMTw8MSkKKyNkZWZpbmUgTTk4OTI1X0lNT05PVkZMX1NUQVRVU19TSElGVAkJCTEKKyNkZWZpbmUgTTk4OTI1X0lNT05PVkZMX1NUQVRVU19XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X1ZNT05PVkZMX1NUQVRVU19NQVNLCQkJKDE8PDApCisjZGVmaW5lIE05ODkyNV9WTU9OT1ZGTF9TVEFUVVNfU0hJRlQJCQkwCisjZGVmaW5lIE05ODkyNV9WTU9OT1ZGTF9TVEFUVVNfV0lEVEgJCQkxCisKKy8qIE1BWDk4OTI1X1IwMDVfU1RBVEUwICovCisjZGVmaW5lIE05ODkyNV9USEVSTVdBUk5fRU5EX1NUQVRFX01BU0sJCQkoMTw8MykKKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9FTkRfU1RBVEVfU0hJRlQJCTMKKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9FTkRfU1RBVEVfV0lEVEgJCTEKKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9CR05fU1RBVEVfTUFTSwkJCSgxPDwyKQorI2RlZmluZSBNOTg5MjVfVEhFUk1XQVJOX0JHTl9TVEFURV9TSElGVAkJMQorI2RlZmluZSBNOTg5MjVfVEhFUk1XQVJOX0JHTl9TVEFURV9XSURUSAkJMQorI2RlZmluZSBNOTg5MjVfVEhFUk1TSEROX0VORF9TVEFURV9NQVNLCQkJKDE8PDEpCisjZGVmaW5lIE05ODkyNV9USEVSTVNIRE5fRU5EX1NUQVRFX1NISUZUCQkxCisjZGVmaW5lIE05ODkyNV9USEVSTVNIRE5fRU5EX1NUQVRFX1dJRFRICQkxCisjZGVmaW5lIE05ODkyNV9USEVSTVNIRE5fQkdOX1NUQVRFX01BU0sJCQkoMTw8MCkKKyNkZWZpbmUgTTk4OTI1X1RIRVJNU0hETl9CR05fU1RBVEVfU0hJRlQJCTAKKyNkZWZpbmUgTTk4OTI1X1RIRVJNU0hETl9CR05fU1RBVEVfV0lEVEgJCTEKKworLyogTUFYOTg5MjVfUjAwNl9TVEFURTEgKi8KKyNkZWZpbmUgTTk4OTI1X1NQUkNVUk5UX1NUQVRFX01BU0sJCQkoMTw8NSkKKyNkZWZpbmUgTTk4OTI1X1NQUkNVUk5UX1NUQVRFX1NISUZUCQkJNQorI2RlZmluZSBNOTg5MjVfU1BSQ1VSTlRfU1RBVEVfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9XQVRDSEZBSUxfU1RBVEVfTUFTSwkJCSgxPDw0KQorI2RlZmluZSBNOTg5MjVfV0FUQ0hGQUlMX1NUQVRFX1NISUZUCQkJNAorI2RlZmluZSBNOTg5MjVfV0FUQ0hGQUlMX1NUQVRFX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfQUxDSU5GSF9TVEFURV9NQVNLCQkJKDE8PDMpCisjZGVmaW5lIE05ODkyNV9BTENJTkZIX1NUQVRFX1NISUZUCQkJMworI2RlZmluZSBNOTg5MjVfQUxDSU5GSF9TVEFURV9XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X0FMQ0FDVF9TVEFURV9NQVNLCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9BTENBQ1RfU1RBVEVfU0hJRlQJCQkyCisjZGVmaW5lIE05ODkyNV9BTENBQ1RfU1RBVEVfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9BTENNVVRfU1RBVEVfTUFTSwkJCSgxPDwxKQorI2RlZmluZSBNOTg5MjVfQUxDTVVUX1NUQVRFX1NISUZUCQkJMQorI2RlZmluZSBNOTg5MjVfQUxDTVVUX1NUQVRFX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfQUxDUF9TVEFURV9NQVNLCQkJCSgxPDwwKQorI2RlZmluZSBNOTg5MjVfQUxDUF9TVEFURV9TSElGVAkJCQkwCisjZGVmaW5lIE05ODkyNV9BTENQX1NUQVRFX1dJRFRICQkJCTEKKworLyogTUFYOTg5MjVfUjAwN19TVEFURTIgKi8KKyNkZWZpbmUgTTk4OTI1X1NMT1RPVlJOX1NUQVRFX01BU0sJCQkoMTw8NikKKyNkZWZpbmUgTTk4OTI1X1NMT1RPVlJOX1NUQVRFX1NISUZUCQkJNgorI2RlZmluZSBNOTg5MjVfU0xPVE9WUk5fU1RBVEVfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9JTlZBTFNMT1RfU1RBVEVfTUFTSwkJCSgxPDw1KQorI2RlZmluZSBNOTg5MjVfSU5WQUxTTE9UX1NUQVRFX1NISUZUCQkJNQorI2RlZmluZSBNOTg5MjVfSU5WQUxTTE9UX1NUQVRFX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfU0xPVENORkxUX1NUQVRFX01BU0sJCQkoMTw8NCkKKyNkZWZpbmUgTTk4OTI1X1NMT1RDTkZMVF9TVEFURV9TSElGVAkJCTQKKyNkZWZpbmUgTTk4OTI1X1NMT1RDTkZMVF9TVEFURV9XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X1ZCU1RPVkZMX1NUQVRFX01BU0sJCQkoMTw8MykKKyNkZWZpbmUgTTk4OTI1X1ZCU1RPVkZMX1NUQVRFX1NISUZUCQkJMworI2RlZmluZSBNOTg5MjVfVkJTVE9WRkxfU1RBVEVfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9WQkFUT1ZGTF9TVEFURV9NQVNLCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9WQkFUT1ZGTF9TVEFURV9TSElGVAkJCTIKKyNkZWZpbmUgTTk4OTI1X1ZCQVRPVkZMX1NUQVRFX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfSU1PTk9WRkxfU1RBVEVfTUFTSwkJCSgxPDwxKQorI2RlZmluZSBNOTg5MjVfSU1PTk9WRkxfU1RBVEVfU0hJRlQJCQkxCisjZGVmaW5lIE05ODkyNV9JTU9OT1ZGTF9TVEFURV9XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X1ZNT05PVkZMX1NUQVRFX01BU0sJCQkoMTw8MCkKKyNkZWZpbmUgTTk4OTI1X1ZNT05PVkZMX1NUQVRFX1NISUZUCQkJMAorI2RlZmluZSBNOTg5MjVfVk1PTk9WRkxfU1RBVEVfV0lEVEgJCQkxCisKKy8qIE1BWDk4OTI1X1IwMDhfRkxBRzAgKi8KKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9FTkRfRkxBR19NQVNLCQkJKDE8PDMpCisjZGVmaW5lIE05ODkyNV9USEVSTVdBUk5fRU5EX0ZMQUdfU0hJRlQJCQkzCisjZGVmaW5lIE05ODkyNV9USEVSTVdBUk5fRU5EX0ZMQUdfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9USEVSTVdBUk5fQkdOX0ZMQUdfTUFTSwkJCSgxPDwyKQorI2RlZmluZSBNOTg5MjVfVEhFUk1XQVJOX0JHTl9GTEFHX1NISUZUCQkJMgorI2RlZmluZSBNOTg5MjVfVEhFUk1XQVJOX0JHTl9GTEFHX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfVEhFUk1TSEROX0VORF9GTEFHX01BU0sJCQkoMTw8MSkKKyNkZWZpbmUgTTk4OTI1X1RIRVJNU0hETl9FTkRfRkxBR19TSElGVAkJCTEKKyNkZWZpbmUgTTk4OTI1X1RIRVJNU0hETl9FTkRfRkxBR19XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X1RIRVJNU0hETl9CR05fRkxBR19NQVNLCQkJKDE8PDApCisjZGVmaW5lIE05ODkyNV9USEVSTVNIRE5fQkdOX0ZMQUdfU0hJRlQJCQkwCisjZGVmaW5lIE05ODkyNV9USEVSTVNIRE5fQkdOX0ZMQUdfV0lEVEgJCQkxCisKKy8qIE1BWDk4OTI1X1IwMDlfRkxBRzEgKi8KKyNkZWZpbmUgTTk4OTI1X1NQS0NVUk5UX0ZMQUdfTUFTSwkJCSgxPDw1KQorI2RlZmluZSBNOTg5MjVfU1BLQ1VSTlRfRkxBR19TSElGVAkJCTUKKyNkZWZpbmUgTTk4OTI1X1NQS0NVUk5UX0ZMQUdfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9XQVRDSEZBSUxfRkxBR19NQVNLCQkJKDE8PDQpCisjZGVmaW5lIE05ODkyNV9XQVRDSEZBSUxfRkxBR19TSElGVAkJCTQKKyNkZWZpbmUgTTk4OTI1X1dBVENIRkFJTF9GTEFHX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfQUxDSU5GSF9GTEFHX01BU0sJCQkoMTw8MykKKyNkZWZpbmUgTTk4OTI1X0FMQ0lORkhfRkxBR19TSElGVAkJCTMKKyNkZWZpbmUgTTk4OTI1X0FMQ0lORkhfRkxBR19XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X0FMQ0FDVF9GTEFHX01BU0sJCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9BTENBQ1RfRkxBR19TSElGVAkJCTIKKyNkZWZpbmUgTTk4OTI1X0FMQ0FDVF9GTEFHX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfQUxDTVVUX0ZMQUdfTUFTSwkJCQkoMTw8MSkKKyNkZWZpbmUgTTk4OTI1X0FMQ01VVF9GTEFHX1NISUZUCQkJMQorI2RlZmluZSBNOTg5MjVfQUxDTVVUX0ZMQUdfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9BTENQX0ZMQUdfTUFTSwkJCQkoMTw8MCkKKyNkZWZpbmUgTTk4OTI1X0FMQ1BfRkxBR19TSElGVAkJCQkwCisjZGVmaW5lIE05ODkyNV9BTENQX0ZMQUdfV0lEVEgJCQkJMQorCisvKiBNQVg5ODkyNV9SMDBBX0ZMQUcyICovCisjZGVmaW5lIE05ODkyNV9TTE9UT1ZSTl9GTEFHX01BU0sJCQkoMTw8NikKKyNkZWZpbmUgTTk4OTI1X1NMT1RPVlJOX0ZMQUdfU0hJRlQJCQk2CisjZGVmaW5lIE05ODkyNV9TTE9UT1ZSTl9GTEFHX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfSU5WQUxTTE9UX0ZMQUdfTUFTSwkJCSgxPDw1KQorI2RlZmluZSBNOTg5MjVfSU5WQUxTTE9UX0ZMQUdfU0hJRlQJCQk1CisjZGVmaW5lIE05ODkyNV9JTlZBTFNMT1RfRkxBR19XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X1NMT1RDTkZMVF9GTEFHX01BU0sJCQkoMTw8NCkKKyNkZWZpbmUgTTk4OTI1X1NMT1RDTkZMVF9GTEFHX1NISUZUCQkJNAorI2RlZmluZSBNOTg5MjVfU0xPVENORkxUX0ZMQUdfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9WQlNUT1ZGTF9GTEFHX01BU0sJCQkoMTw8MykKKyNkZWZpbmUgTTk4OTI1X1ZCU1RPVkZMX0ZMQUdfU0hJRlQJCQkzCisjZGVmaW5lIE05ODkyNV9WQlNUT1ZGTF9GTEFHX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfVkJBVE9WRkxfRkxBR19NQVNLCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9WQkFUT1ZGTF9GTEFHX1NISUZUCQkJMgorI2RlZmluZSBNOTg5MjVfVkJBVE9WRkxfRkxBR19XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X0lNT05PVkZMX0ZMQUdfTUFTSwkJCSgxPDwxKQorI2RlZmluZSBNOTg5MjVfSU1PTk9WRkxfRkxBR19TSElGVAkJCTEKKyNkZWZpbmUgTTk4OTI1X0lNT05PVkZMX0ZMQUdfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9WTU9OT1ZGTF9GTEFHX01BU0sJCQkoMTw8MCkKKyNkZWZpbmUgTTk4OTI1X1ZNT05PVkZMX0ZMQUdfU0hJRlQJCQkwCisjZGVmaW5lIE05ODkyNV9WTU9OT1ZGTF9GTEFHX1dJRFRICQkJMQorCisvKiBNQVg5ODkyNV9SMDBCX0lSUV9FTkFCTEUwICovCisjZGVmaW5lIE05ODkyNV9USEVSTVdBUk5fRU5EX0VOX01BU0sJCQkoMTw8MykKKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9FTkRfRU5fU0hJRlQJCQkzCisjZGVmaW5lIE05ODkyNV9USEVSTVdBUk5fRU5EX0VOX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfVEhFUk1XQVJOX0JHTl9FTl9NQVNLCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9USEVSTVdBUk5fQkdOX0VOX1NISUZUCQkJMgorI2RlZmluZSBNOTg5MjVfVEhFUk1XQVJOX0JHTl9FTl9XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X1RIRVJNU0hETl9FTkRfRU5fTUFTSwkJCSgxPDwxKQorI2RlZmluZSBNOTg5MjVfVEhFUk1TSEROX0VORF9FTl9TSElGVAkJCTEKKyNkZWZpbmUgTTk4OTI1X1RIRVJNU0hETl9FTkRfRU5fV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9USEVSTVNIRE5fQkdOX0VOX01BU0sJCQkoMTw8MCkKKyNkZWZpbmUgTTk4OTI1X1RIRVJNU0hETl9CR05fRU5fU0hJRlQJCQkwCisjZGVmaW5lIE05ODkyNV9USEVSTVNIRE5fQkdOX0VOX1dJRFRICQkJMQorCisvKiBNQVg5ODkyNV9SMDBDX0lSUV9FTkFCTEUxICovCisjZGVmaW5lIE05ODkyNV9TUEtDVVJOVF9FTl9NQVNLCQkJCSgxPDw1KQorI2RlZmluZSBNOTg5MjVfU1BLQ1VSTlRfRU5fU0hJRlQJCQk1CisjZGVmaW5lIE05ODkyNV9TUEtDVVJOVF9FTl9XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X1dBVENIRkFJTF9FTl9NQVNLCQkJKDE8PDQpCisjZGVmaW5lIE05ODkyNV9XQVRDSEZBSUxfRU5fU0hJRlQJCQk0CisjZGVmaW5lIE05ODkyNV9XQVRDSEZBSUxfRU5fV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9BTENJTkZIX0VOX01BU0sJCQkJKDE8PDMpCisjZGVmaW5lIE05ODkyNV9BTENJTkZIX0VOX1NISUZUCQkJCTMKKyNkZWZpbmUgTTk4OTI1X0FMQ0lORkhfRU5fV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfQUxDQUNUX0VOX01BU0sJCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9BTENBQ1RfRU5fU0hJRlQJCQkJMgorI2RlZmluZSBNOTg5MjVfQUxDQUNUX0VOX1dJRFRICQkJCTEKKyNkZWZpbmUgTTk4OTI1X0FMQ01VVF9FTl9NQVNLCQkJCSgxPDwxKQorI2RlZmluZSBNOTg5MjVfQUxDTVVUX0VOX1NISUZUCQkJCTEKKyNkZWZpbmUgTTk4OTI1X0FMQ01VVF9FTl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9BTENQX0VOX01BU0sJCQkJCSgxPDwwKQorI2RlZmluZSBNOTg5MjVfQUxDUF9FTl9TSElGVAkJCQkwCisjZGVmaW5lIE05ODkyNV9BTENQX0VOX1dJRFRICQkJCTEKKworLyogTUFYOTg5MjVfUjAwRF9JUlFfRU5BQkxFMiAqLworI2RlZmluZSBNOTg5MjVfU0xPVE9WUk5fRU5fTUFTSwkJCQkJKDE8PDYpCisjZGVmaW5lIE05ODkyNV9TTE9UT1ZSTl9FTl9TSElGVAkJCQk2CisjZGVmaW5lIE05ODkyNV9TTE9UT1ZSTl9FTl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9JTlZBTFNMT1RfRU5fTUFTSwkJCQkoMTw8NSkKKyNkZWZpbmUgTTk4OTI1X0lOVkFMU0xPVF9FTl9TSElGVAkJCQk1CisjZGVmaW5lIE05ODkyNV9JTlZBTFNMT1RfRU5fV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfU0xPVENORkxUX0VOX01BU0sJCQkJKDE8PDQpCisjZGVmaW5lIE05ODkyNV9TTE9UQ05GTFRfRU5fU0hJRlQJCQkJNAorI2RlZmluZSBNOTg5MjVfU0xPVENORkxUX0VOX1dJRFRICQkJCTEKKyNkZWZpbmUgTTk4OTI1X1ZCU1RPVkZMX0VOX01BU0sJCQkJCSgxPDwzKQorI2RlZmluZSBNOTg5MjVfVkJTVE9WRkxfRU5fU0hJRlQJCQkJMworI2RlZmluZSBNOTg5MjVfVkJTVE9WRkxfRU5fV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfVkJBVE9WRkxfRU5fTUFTSwkJCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9WQkFUT1ZGTF9FTl9TSElGVAkJCQkyCisjZGVmaW5lIE05ODkyNV9WQkFUT1ZGTF9FTl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9JTU9OT1ZGTF9FTl9NQVNLCQkJCQkoMTw8MSkKKyNkZWZpbmUgTTk4OTI1X0lNT05PVkZMX0VOX1NISUZUCQkJCTEKKyNkZWZpbmUgTTk4OTI1X0lNT05PVkZMX0VOX1dJRFRICQkJCTEKKyNkZWZpbmUgTTk4OTI1X1ZNT05PVkZMX0VOX01BU0sJCQkJCSgxPDwwKQorI2RlZmluZSBNOTg5MjVfVk1PTk9WRkxfRU5fU0hJRlQJCQkJMAorI2RlZmluZSBNOTg5MjVfVk1PTk9WRkxfRU5fV0lEVEgJCQkJMQorCisvKiBNQVg5ODkyNV9SMDBFX0lSUV9DTEVBUjAgKi8KKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9FTkRfQ0xSX01BU0sJCQkoMTw8MykKKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9FTkRfQ0xSX1NISUZUCQkJMworI2RlZmluZSBNOTg5MjVfVEhFUk1XQVJOX0VORF9DTFJfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9USEVSTVdBUk5fQkdOX0NMUl9NQVNLCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9USEVSTVdBUk5fQkdOX0NMUl9TSElGVAkJCTIKKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9CR05fQ0xSX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfVEhFUk1TSEROX0VORF9DTFJfTUFTSwkJCSgxPDwxKQorI2RlZmluZSBNOTg5MjVfVEhFUk1TSEROX0VORF9DTFJfU0hJRlQJCQkxCisjZGVmaW5lIE05ODkyNV9USEVSTVNIRE5fRU5EX0NMUl9XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X1RIRVJNU0hETl9CR05fQ0xSX01BU0sJCQkoMTw8MCkKKyNkZWZpbmUgTTk4OTI1X1RIRVJNU0hETl9CR05fQ0xSX1NISUZUCQkJMAorI2RlZmluZSBNOTg5MjVfVEhFUk1TSEROX0JHTl9DTFJfV0lEVEgJCQkxCisKKy8qIE1BWDk4OTI1X1IwMEZfSVJRX0NMRUFSMSAqLworI2RlZmluZSBNOTg5MjVfU1BLQ1VSTlRfQ0xSX01BU0sJCQkJKDE8PDUpCisjZGVmaW5lIE05ODkyNV9TUEtDVVJOVF9DTFJfU0hJRlQJCQkJNQorI2RlZmluZSBNOTg5MjVfU1BLQ1VSTlRfQ0xSX1dJRFRICQkJCTEKKyNkZWZpbmUgTTk4OTI1X1dBVENIRkFJTF9DTFJfTUFTSwkJCQkoMTw8NCkKKyNkZWZpbmUgTTk4OTI1X1dBVENIRkFJTF9DTFJfU0hJRlQJCQkJNAorI2RlZmluZSBNOTg5MjVfV0FUQ0hGQUlMX0NMUl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9BTENJTkZIX0NMUl9NQVNLCQkJCQkoMTw8MykKKyNkZWZpbmUgTTk4OTI1X0FMQ0lORkhfQ0xSX1NISUZUCQkJCTMKKyNkZWZpbmUgTTk4OTI1X0FMQ0lORkhfQ0xSX1dJRFRICQkJCTEKKyNkZWZpbmUgTTk4OTI1X0FMQ0FDVF9DTFJfTUFTSwkJCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9BTENBQ1RfQ0xSX1NISUZUCQkJCQkyCisjZGVmaW5lIE05ODkyNV9BTENBQ1RfQ0xSX1dJRFRICQkJCQkxCisjZGVmaW5lIE05ODkyNV9BTENNVVRfQ0xSX01BU0sJCQkJCSgxPDwxKQorI2RlZmluZSBNOTg5MjVfQUxDTVVUX0NMUl9TSElGVAkJCQkJMQorI2RlZmluZSBNOTg5MjVfQUxDTVVUX0NMUl9XSURUSAkJCQkJMQorI2RlZmluZSBNOTg5MjVfQUxDUF9DTFJfTUFTSwkJCQkJKDE8PDApCisjZGVmaW5lIE05ODkyNV9BTENQX0NMUl9TSElGVAkJCQkJMAorI2RlZmluZSBNOTg5MjVfQUxDUF9DTFJfV0lEVEgJCQkJCTEKKworLyogTUFYOTg5MjVfUjAxMF9JUlFfQ0xFQVIyICovCisjZGVmaW5lIE05ODkyNV9TTE9UT1ZSTl9DTFJfTUFTSwkJCQkoMTw8NikKKyNkZWZpbmUgTTk4OTI1X1NMT1RPVlJOX0NMUl9TSElGVAkJCQk2CisjZGVmaW5lIE05ODkyNV9TTE9UT1ZSTl9DTFJfV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfSU5WQUxTTE9UX0NMUl9NQVNLCQkJCSgxPDw1KQorI2RlZmluZSBNOTg5MjVfSU5WQUxTTE9UX0NMUl9TSElGVAkJCQk1CisjZGVmaW5lIE05ODkyNV9JTlZBTFNMT1RfQ0xSX1dJRFRICQkJCTEKKyNkZWZpbmUgTTk4OTI1X1NMT1RDTkZMVF9DTFJfTUFTSwkJCQkoMTw8NCkKKyNkZWZpbmUgTTk4OTI1X1NMT1RDTkZMVF9DTFJfU0hJRlQJCQkJNAorI2RlZmluZSBNOTg5MjVfU0xPVENORkxUX0NMUl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9WQlNUT1ZGTF9DTFJfTUFTSwkJCQkoMTw8MykKKyNkZWZpbmUgTTk4OTI1X1ZCU1RPVkZMX0NMUl9TSElGVAkJCQkzCisjZGVmaW5lIE05ODkyNV9WQlNUT1ZGTF9DTFJfV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfVkJBVE9WRkxfQ0xSX01BU0sJCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9WQkFUT1ZGTF9DTFJfU0hJRlQJCQkJMgorI2RlZmluZSBNOTg5MjVfVkJBVE9WRkxfQ0xSX1dJRFRICQkJCTEKKyNkZWZpbmUgTTk4OTI1X0lNT05PVkZMX0NMUl9NQVNLCQkJCSgxPDwxKQorI2RlZmluZSBNOTg5MjVfSU1PTk9WRkxfQ0xSX1NISUZUCQkJCTEKKyNkZWZpbmUgTTk4OTI1X0lNT05PVkZMX0NMUl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9WTU9OT1ZGTF9DTFJfTUFTSwkJCQkoMTw8MCkKKyNkZWZpbmUgTTk4OTI1X1ZNT05PVkZMX0NMUl9TSElGVAkJCQkwCisjZGVmaW5lIE05ODkyNV9WTU9OT1ZGTF9DTFJfV0lEVEgJCQkJMQorCisvKiBNQVg5ODkyNV9SMDExX01BUDAgKi8KKyNkZWZpbmUgTTk4OTI1X0VSX1RIRVJNV0FSTl9FTl9NQVNLCQkJCSgxPDw3KQorI2RlZmluZSBNOTg5MjVfRVJfVEhFUk1XQVJOX0VOX1NISUZUCQkJNworI2RlZmluZSBNOTg5MjVfRVJfVEhFUk1XQVJOX0VOX1dJRFRICQkJMQorI2RlZmluZSBNOTg5MjVfRVJfVEhFUk1XQVJOX01BUF9NQVNLCQkJKDB4MDc8PDQpCisjZGVmaW5lIE05ODkyNV9FUl9USEVSTVdBUk5fTUFQX1NISUZUCQkJNAorI2RlZmluZSBNOTg5MjVfRVJfVEhFUk1XQVJOX01BUF9XSURUSAkJCTMKKworLyogTUFYOTg5MjVfUjAxMl9NQVAxICovCisjZGVmaW5lIE05ODkyNV9FUl9BTENNVVRfRU5fTUFTSwkJCQkoMTw8NykKKyNkZWZpbmUgTTk4OTI1X0VSX0FMQ01VVF9FTl9TSElGVAkJCQk3CisjZGVmaW5lIE05ODkyNV9FUl9BTENNVVRfRU5fV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfRVJfQUxDTVVUX01BUF9NQVNLCQkJCSgweDA3PDw0KQorI2RlZmluZSBNOTg5MjVfRVJfQUxDTVVUX01BUF9TSElGVAkJCQk0CisjZGVmaW5lIE05ODkyNV9FUl9BTENNVVRfTUFQX1dJRFRICQkJCTMKKyNkZWZpbmUgTTk4OTI1X0VSX0FMQ1BfRU5fTUFTSwkJCQkJKDE8PDMpCisjZGVmaW5lIE05ODkyNV9FUl9BTENQX0VOX1NISUZUCQkJCQkzCisjZGVmaW5lIE05ODkyNV9FUl9BTENQX0VOX1dJRFRICQkJCQkxCisjZGVmaW5lIE05ODkyNV9FUl9BTENQX01BUF9NQVNLCQkJCQkoMHgwNzw8MCkKKyNkZWZpbmUgTTk4OTI1X0VSX0FMQ1BfTUFQX1NISUZUCQkJCTAKKyNkZWZpbmUgTTk4OTI1X0VSX0FMQ1BfTUFQX1dJRFRICQkJCTMKKworLyogTUFYOTg5MjVfUjAxM19NQVAyICovCisjZGVmaW5lIE05ODkyNV9FUl9BTENJTkZIX0VOX01BU0sJCQkJKDE8PDcpCisjZGVmaW5lIE05ODkyNV9FUl9BTENJTkZIX0VOX1NISUZUCQkJCTcKKyNkZWZpbmUgTTk4OTI1X0VSX0FMQ0lORkhfRU5fV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfRVJfQUxDSU5GSF9NQVBfTUFTSwkJCQkoMHgwNzw8NCkKKyNkZWZpbmUgTTk4OTI1X0VSX0FMQ0lORkhfTUFQX1NISUZUCQkJCTQKKyNkZWZpbmUgTTk4OTI1X0VSX0FMQ0lORkhfTUFQX1dJRFRICQkJCTMKKyNkZWZpbmUgTTk4OTI1X0VSX0FMQ0FDVF9FTl9NQVNLCQkJCSgxPDwzKQorI2RlZmluZSBNOTg5MjVfRVJfQUxDQUNUX0VOX1NISUZUCQkJCTMKKyNkZWZpbmUgTTk4OTI1X0VSX0FMQ0FDVF9FTl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9FUl9BTENBQ1RfTUFQX01BU0sJCQkJKDB4MDc8PDApCisjZGVmaW5lIE05ODkyNV9FUl9BTENBQ1RfTUFQX1NISUZUCQkJCTAKKyNkZWZpbmUgTTk4OTI1X0VSX0FMQ0FDVF9NQVBfV0lEVEgJCQkJMworCisvKiBNQVg5ODkyNV9SMDE0X01BUDMgKi8KKyNkZWZpbmUgTTk4OTI1X0VSX1NQS0NVUk5UX0VOX01BU0sJCQkJKDE8PDcpCisjZGVmaW5lIE05ODkyNV9FUl9TUEtDVVJOVF9FTl9TSElGVAkJCQk3CisjZGVmaW5lIE05ODkyNV9FUl9TUEtDVVJOVF9FTl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9FUl9TUEtDVVJOVF9NQVBfTUFTSwkJCQkoMHgwNzw8NCkKKyNkZWZpbmUgTTk4OTI1X0VSX1NQS0NVUk5UX01BUF9TSElGVAkJCTQKKyNkZWZpbmUgTTk4OTI1X0VSX1NQS0NVUk5UX01BUF9XSURUSAkJCTMKKworLyogTUFYOTg5MjVfUjAxNV9NQVA0ICovCisvKiBSRVNFUlZFRCAqLworCisvKiBNQVg5ODkyNV9SMDE2X01BUDUgKi8KKyNkZWZpbmUgTTk4OTI1X0VSX0lNT05PVkZMX0VOX01BU0sJCQkJKDE8PDcpCisjZGVmaW5lIE05ODkyNV9FUl9JTU9OT1ZGTF9FTl9TSElGVAkJCQk3CisjZGVmaW5lIE05ODkyNV9FUl9JTU9OT1ZGTF9FTl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9FUl9JTU9OT1ZGTF9NQVBfTUFTSwkJCQkoMHgwNzw8NCkKKyNkZWZpbmUgTTk4OTI1X0VSX0lNT05PVkZMX01BUF9TSElGVAkJCTQKKyNkZWZpbmUgTTk4OTI1X0VSX0lNT05PVkZMX01BUF9XSURUSAkJCTMKKyNkZWZpbmUgTTk4OTI1X0VSX1ZNT05PVkZMX0VOX01BU0sJCQkJKDE8PDMpCisjZGVmaW5lIE05ODkyNV9FUl9WTU9OT1ZGTF9FTl9TSElGVAkJCQkzCisjZGVmaW5lIE05ODkyNV9FUl9WTU9OT1ZGTF9FTl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9FUl9WTU9OT1ZGTF9NQVBfTUFTSwkJCQkoMHgwNzw8MCkKKyNkZWZpbmUgTTk4OTI1X0VSX1ZNT05PVkZMX01BUF9TSElGVAkJCTAKKyNkZWZpbmUgTTk4OTI1X0VSX1ZNT05PVkZMX01BUF9XSURUSAkJCTMKKworLyogTUFYOTg5MjVfUjAxN19NQVA2ICovCisjZGVmaW5lIE05ODkyNV9FUl9WQlNUT1ZGTF9FTl9NQVNLCQkJCSgxPDw3KQorI2RlZmluZSBNOTg5MjVfRVJfVkJTVE9WRkxfRU5fU0hJRlQJCQkJNworI2RlZmluZSBNOTg5MjVfRVJfVkJTVE9WRkxfRU5fV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfRVJfVkJTVE9WRkxfTUFQX01BU0sJCQkJKDB4MDc8PDQpCisjZGVmaW5lIE05ODkyNV9FUl9WQlNUT1ZGTF9NQVBfU0hJRlQJCQk0CisjZGVmaW5lIE05ODkyNV9FUl9WQlNUT1ZGTF9NQVBfV0lEVEgJCQkzCisjZGVmaW5lIE05ODkyNV9FUl9WQkFUT1ZGTF9FTl9NQVNLCQkJCSgxPDwzKQorI2RlZmluZSBNOTg5MjVfRVJfVkJBVE9WRkxfRU5fU0hJRlQJCQkJMworI2RlZmluZSBNOTg5MjVfRVJfVkJBVE9WRkxfRU5fV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfRVJfVkJBVE9WRkxfTUFQX01BU0sJCQkJKDB4MDc8PDApCisjZGVmaW5lIE05ODkyNV9FUl9WQkFUT1ZGTF9NQVBfU0hJRlQJCQkwCisjZGVmaW5lIE05ODkyNV9FUl9WQkFUT1ZGTF9NQVBfV0lEVEgJCQkzCisKKy8qIE1BWDk4OTI1X1IwMThfTUFQNyAqLworI2RlZmluZSBNOTg5MjVfRVJfSU5WQUxTTE9UX0VOX01BU0sJCQkJKDE8PDcpCisjZGVmaW5lIE05ODkyNV9FUl9JTlZBTFNMT1RfRU5fU0hJRlQJCQk3CisjZGVmaW5lIE05ODkyNV9FUl9JTlZBTFNMT1RfRU5fV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9FUl9JTlZBTFNMT1RfTUFQX01BU0sJCQkoMHgwNzw8NCkKKyNkZWZpbmUgTTk4OTI1X0VSX0lOVkFMU0xPVF9NQVBfU0hJRlQJCQk0CisjZGVmaW5lIE05ODkyNV9FUl9JTlZBTFNMT1RfTUFQX1dJRFRICQkJMworI2RlZmluZSBNOTg5MjVfRVJfU0xPVENORkxUX0VOX01BU0sJCQkJKDE8PDMpCisjZGVmaW5lIE05ODkyNV9FUl9TTE9UQ05GTFRfRU5fU0hJRlQJCQkzCisjZGVmaW5lIE05ODkyNV9FUl9TTE9UQ05GTFRfRU5fV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9FUl9TTE9UQ05GTFRfTUFQX01BU0sJCQkoMHgwNzw8MCkKKyNkZWZpbmUgTTk4OTI1X0VSX1NMT1RDTkZMVF9NQVBfU0hJRlQJCQkwCisjZGVmaW5lIE05ODkyNV9FUl9TTE9UQ05GTFRfTUFQX1dJRFRICQkJMworCisvKiBNQVg5ODkyNV9SMDE5X01BUDggKi8KKyNkZWZpbmUgTTk4OTI1X0VSX1NMT1RPVlJOX0VOX01BU0sJKDE8PDMpCisjZGVmaW5lIE05ODkyNV9FUl9TTE9UT1ZSTl9FTl9TSElGVAkzCisjZGVmaW5lIE05ODkyNV9FUl9TTE9UT1ZSTl9FTl9XSURUSAkxCisjZGVmaW5lIE05ODkyNV9FUl9TTE9UT1ZSTl9NQVBfTUFTSwkoMHgwNzw8MCkKKyNkZWZpbmUgTTk4OTI1X0VSX1NMT1RPVlJOX01BUF9TSElGVAkwCisjZGVmaW5lIE05ODkyNV9FUl9TTE9UT1ZSTl9NQVBfV0lEVEgJMworCisvKiBNQVg5ODkyNV9SMDFBX0RBSV9DTEtfTU9ERTEgKi8KKyNkZWZpbmUgTTk4OTI1X0RBSV9DTEtfU09VUkNFX01BU0sJKDE8PDYpCisjZGVmaW5lIE05ODkyNV9EQUlfQ0xLX1NPVVJDRV9TSElGVAk2CisjZGVmaW5lIE05ODkyNV9EQUlfQ0xLX1NPVVJDRV9XSURUSAkxCisjZGVmaW5lIE05ODkyNV9NRExMX01VTFRfTUFTSwkJKDB4MEY8PDApCisjZGVmaW5lIE05ODkyNV9NRExMX01VTFRfU0hJRlQJCTAKKyNkZWZpbmUgTTk4OTI1X01ETExfTVVMVF9XSURUSAkJNAorCisjZGVmaW5lIE05ODkyNV9NRExMX01VTFRfTUNMS3g4CQk2CisjZGVmaW5lIE05ODkyNV9NRExMX01VTFRfTUNMS3gxNgk4CisKKy8qIE1BWDk4OTI1X1IwMUJfREFJX0NMS19NT0RFMiAqLworI2RlZmluZSBNOTg5MjVfREFJX1NSX01BU0sJCQkoMHgwRjw8NCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9TUl9TSElGVAkJCTQKKyNkZWZpbmUgTTk4OTI1X0RBSV9TUl9XSURUSAkJCTQKKyNkZWZpbmUgTTk4OTI1X0RBSV9NQVNfTUFTSwkJCSgxPDwzKQorI2RlZmluZSBNOTg5MjVfREFJX01BU19TSElGVAkJCTMKKyNkZWZpbmUgTTk4OTI1X0RBSV9NQVNfV0lEVEgJCQkxCisjZGVmaW5lIE05ODkyNV9EQUlfQlNFTF9NQVNLCQkJKDB4MDc8PDApCisjZGVmaW5lIE05ODkyNV9EQUlfQlNFTF9TSElGVAkJCTAKKyNkZWZpbmUgTTk4OTI1X0RBSV9CU0VMX1dJRFRICQkJMworCisjZGVmaW5lIE05ODkyNV9EQUlfQlNFTF8zMiAoMCA8PCBNOTg5MjVfREFJX0JTRUxfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfQlNFTF80OCAoMSA8PCBNOTg5MjVfREFJX0JTRUxfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfQlNFTF82NCAoMiA8PCBNOTg5MjVfREFJX0JTRUxfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfQlNFTF8yNTYgKDYgPDwgTTk4OTI1X0RBSV9CU0VMX1NISUZUKQorCisvKiBNQVg5ODkyNV9SMDFDX0RBSV9DTEtfRElWX01fTVNCUyAqLworI2RlZmluZSBNOTg5MjVfREFJX01fTVNCU19NQVNLCQkJCQkoMHhGRjw8MCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9NX01TQlNfU0hJRlQJCQkJCTAKKyNkZWZpbmUgTTk4OTI1X0RBSV9NX01TQlNfV0lEVEgJCQkJCTgKKworLyogTUFYOTg5MjVfUjAxRF9EQUlfQ0xLX0RJVl9NX0xTQlMgKi8KKyNkZWZpbmUgTTk4OTI1X0RBSV9NX0xTQlNfTUFTSwkJCQkJKDB4RkY8PDApCisjZGVmaW5lIE05ODkyNV9EQUlfTV9MU0JTX1NISUZUCQkJCQkwCisjZGVmaW5lIE05ODkyNV9EQUlfTV9MU0JTX1dJRFRICQkJCQk4CisKKy8qIE1BWDk4OTI1X1IwMUVfREFJX0NMS19ESVZfTl9NU0JTICovCisjZGVmaW5lIE05ODkyNV9EQUlfTl9NU0JTX01BU0sJCQkJCSgweDdGPDwwKQorI2RlZmluZSBNOTg5MjVfREFJX05fTVNCU19TSElGVAkJCQkJMAorI2RlZmluZSBNOTg5MjVfREFJX05fTVNCU19XSURUSAkJCQkJNworCisvKiBNQVg5ODkyNV9SMDFGX0RBSV9DTEtfRElWX05fTFNCUyAqLworI2RlZmluZSBNOTg5MjVfREFJX05fTFNCU19NQVNLCQkJCQkoMHhGRjw8MCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9OX0xTQlNfU0hJRlQJCQkJCTAKKyNkZWZpbmUgTTk4OTI1X0RBSV9OX0xTQlNfV0lEVEgJCQkJCTgKKworLyogTUFYOTg5MjVfUjAyMF9GT1JNQVQgKi8KKyNkZWZpbmUgTTk4OTI1X0RBSV9DSEFOU1pfTUFTSwkJCQkJKDB4MDM8PDYpCisjZGVmaW5lIE05ODkyNV9EQUlfQ0hBTlNaX1NISUZUCQkJCQk2CisjZGVmaW5lIE05ODkyNV9EQUlfQ0hBTlNaX1dJRFRICQkJCQkyCisjZGVmaW5lIE05ODkyNV9EQUlfRVhUQkNMS19ISVpfTUFTSwkJCQkoMTw8NCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9FWFRCQ0xLX0hJWl9TSElGVAkJCTQKKyNkZWZpbmUgTTk4OTI1X0RBSV9FWFRCQ0xLX0hJWl9XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X0RBSV9XQ0lfTUFTSwkJCQkJCSgxPDwzKQorI2RlZmluZSBNOTg5MjVfREFJX1dDSV9TSElGVAkJCQkJMworI2RlZmluZSBNOTg5MjVfREFJX1dDSV9XSURUSAkJCQkJMQorI2RlZmluZSBNOTg5MjVfREFJX0JDSV9NQVNLCQkJCQkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9EQUlfQkNJX1NISUZUCQkJCQkyCisjZGVmaW5lIE05ODkyNV9EQUlfQkNJX1dJRFRICQkJCQkxCisjZGVmaW5lIE05ODkyNV9EQUlfRExZX01BU0sJCQkJCQkoMTw8MSkKKyNkZWZpbmUgTTk4OTI1X0RBSV9ETFlfU0hJRlQJCQkJCTEKKyNkZWZpbmUgTTk4OTI1X0RBSV9ETFlfV0lEVEgJCQkJCTEKKyNkZWZpbmUgTTk4OTI1X0RBSV9URE1fTUFTSwkJCQkJCSgxPDwwKQorI2RlZmluZSBNOTg5MjVfREFJX1RETV9TSElGVAkJCQkJMAorI2RlZmluZSBNOTg5MjVfREFJX1RETV9XSURUSAkJCQkJMQorCisjZGVmaW5lIE05ODkyNV9EQUlfQ0hBTlNaXzE2ICgxIDw8IE05ODkyNV9EQUlfQ0hBTlNaX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX0NIQU5TWl8yNCAoMiA8PCBNOTg5MjVfREFJX0NIQU5TWl9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9DSEFOU1pfMzIgKDMgPDwgTTk4OTI1X0RBSV9DSEFOU1pfU0hJRlQpCisKKy8qIE1BWDk4OTI1X1IwMjFfVERNX1NMT1RfU0VMRUNUICovCisjZGVmaW5lIE05ODkyNV9EQUlfRE9fRU5fTUFTSwkJCQkJKDE8PDcpCisjZGVmaW5lIE05ODkyNV9EQUlfRE9fRU5fU0hJRlQJCQkJCTcKKyNkZWZpbmUgTTk4OTI1X0RBSV9ET19FTl9XSURUSAkJCQkJMQorI2RlZmluZSBNOTg5MjVfREFJX0RJTl9FTl9NQVNLCQkJCQkoMTw8NikKKyNkZWZpbmUgTTk4OTI1X0RBSV9ESU5fRU5fU0hJRlQJCQkJCTYKKyNkZWZpbmUgTTk4OTI1X0RBSV9ESU5fRU5fV0lEVEgJCQkJCTEKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTlJfU09VUkNFX01BU0sJCQkJKDB4MDc8PDMpCisjZGVmaW5lIE05ODkyNV9EQUlfSU5SX1NPVVJDRV9TSElGVAkJCQkzCisjZGVmaW5lIE05ODkyNV9EQUlfSU5SX1NPVVJDRV9XSURUSAkJCQkzCisjZGVmaW5lIE05ODkyNV9EQUlfSU5MX1NPVVJDRV9NQVNLCQkJCSgweDA3PDwwKQorI2RlZmluZSBNOTg5MjVfREFJX0lOTF9TT1VSQ0VfU0hJRlQJCQkJMAorI2RlZmluZSBNOTg5MjVfREFJX0lOTF9TT1VSQ0VfV0lEVEgJCQkJMworCisvKiBNQVg5ODkyNV9SMDIyX0RPVVRfQ0ZHX1ZNT04gKi8KKyNkZWZpbmUgTTk4OTI1X0RBSV9WTU9OX0VOX01BU0sJCQkJCSgxPDw1KQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fRU5fU0hJRlQJCQkJNQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fRU5fV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF9NQVNLCQkJCSgweDFGPDwwKQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVAkJCQkwCisjZGVmaW5lIE05ODkyNV9EQUlfVk1PTl9TTE9UX1dJRFRICQkJCTUKKworI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF8wMF8wMSAoMCA8PCBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9WTU9OX1NMT1RfMDFfMDIgKDEgPDwgTTk4OTI1X0RBSV9WTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfVk1PTl9TTE9UXzAyXzAzICgyIDw8IE05ODkyNV9EQUlfVk1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF8wM18wNCAoMyA8PCBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9WTU9OX1NMT1RfMDRfMDUgKDQgPDwgTTk4OTI1X0RBSV9WTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfVk1PTl9TTE9UXzA1XzA2ICg1IDw8IE05ODkyNV9EQUlfVk1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF8wNl8wNyAoNiA8PCBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9WTU9OX1NMT1RfMDdfMDggKDcgPDwgTTk4OTI1X0RBSV9WTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfVk1PTl9TTE9UXzA4XzA5ICg4IDw8IE05ODkyNV9EQUlfVk1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF8wOV8wQSAoOSA8PCBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9WTU9OX1NMT1RfMEFfMEIgKDEwIDw8IE05ODkyNV9EQUlfVk1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF8wQl8wQyAoMTEgPDwgTTk4OTI1X0RBSV9WTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfVk1PTl9TTE9UXzBDXzBEICgxMiA8PCBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9WTU9OX1NMT1RfMERfMEUgKDEzIDw8IE05ODkyNV9EQUlfVk1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF8wRV8wRiAoMTQgPDwgTTk4OTI1X0RBSV9WTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfVk1PTl9TTE9UXzBGXzEwICgxNSA8PCBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9WTU9OX1NMT1RfMTBfMTEgKDE2IDw8IE05ODkyNV9EQUlfVk1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF8xMV8xMiAoMTcgPDwgTTk4OTI1X0RBSV9WTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfVk1PTl9TTE9UXzEyXzEzICgxOCA8PCBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9WTU9OX1NMT1RfMTNfMTQgKDE5IDw8IE05ODkyNV9EQUlfVk1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF8xNF8xNSAoMjAgPDwgTTk4OTI1X0RBSV9WTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfVk1PTl9TTE9UXzE1XzE2ICgyMSA8PCBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9WTU9OX1NMT1RfMTZfMTcgKDIyIDw8IE05ODkyNV9EQUlfVk1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF8xN18xOCAoMjMgPDwgTTk4OTI1X0RBSV9WTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfVk1PTl9TTE9UXzE4XzE5ICgyNCA8PCBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9WTU9OX1NMT1RfMTlfMUEgKDI1IDw8IE05ODkyNV9EQUlfVk1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF8xQV8xQiAoMjYgPDwgTTk4OTI1X0RBSV9WTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfVk1PTl9TTE9UXzFCXzFDICgyNyA8PCBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9WTU9OX1NMT1RfMUNfMUQgKDI4IDw8IE05ODkyNV9EQUlfVk1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX1ZNT05fU0xPVF8xRF8xRSAoMjkgPDwgTTk4OTI1X0RBSV9WTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfVk1PTl9TTE9UXzFFXzFGICgzMCA8PCBNOTg5MjVfREFJX1ZNT05fU0xPVF9TSElGVCkKKworLyogTUFYOTg5MjVfUjAyM19ET1VUX0NGR19JTU9OICovCisjZGVmaW5lIE05ODkyNV9EQUlfSU1PTl9FTl9NQVNLCQkJCQkoMTw8NSkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX0VOX1NISUZUCQkJCTUKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX0VOX1dJRFRICQkJCTEKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfTUFTSwkJCQkoMHgxRjw8MCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQJCQkJMAorI2RlZmluZSBNOTg5MjVfREFJX0lNT05fU0xPVF9XSURUSAkJCQk1CisKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfMDBfMDEgKDAgPDwgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfSU1PTl9TTE9UXzAxXzAyICgxIDw8IE05ODkyNV9EQUlfSU1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX0lNT05fU0xPVF8wMl8wMyAoMiA8PCBNOTg5MjVfREFJX0lNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfMDNfMDQgKDMgPDwgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfSU1PTl9TTE9UXzA0XzA1ICg0IDw8IE05ODkyNV9EQUlfSU1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX0lNT05fU0xPVF8wNV8wNiAoNSA8PCBNOTg5MjVfREFJX0lNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfMDZfMDcgKDYgPDwgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfSU1PTl9TTE9UXzA3XzA4ICg3IDw8IE05ODkyNV9EQUlfSU1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX0lNT05fU0xPVF8wOF8wOSAoOCA8PCBNOTg5MjVfREFJX0lNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfMDlfMEEgKDkgPDwgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfSU1PTl9TTE9UXzBBXzBCICgxMCA8PCBNOTg5MjVfREFJX0lNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfMEJfMEMgKDExIDw8IE05ODkyNV9EQUlfSU1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX0lNT05fU0xPVF8wQ18wRCAoMTIgPDwgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfSU1PTl9TTE9UXzBEXzBFICgxMyA8PCBNOTg5MjVfREFJX0lNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfMEVfMEYgKDE0IDw8IE05ODkyNV9EQUlfSU1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX0lNT05fU0xPVF8wRl8xMCAoMTUgPDwgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfSU1PTl9TTE9UXzEwXzExICgxNiA8PCBNOTg5MjVfREFJX0lNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfMTFfMTIgKDE3IDw8IE05ODkyNV9EQUlfSU1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX0lNT05fU0xPVF8xMl8xMyAoMTggPDwgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfSU1PTl9TTE9UXzEzXzE0ICgxOSA8PCBNOTg5MjVfREFJX0lNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfMTRfMTUgKDIwIDw8IE05ODkyNV9EQUlfSU1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX0lNT05fU0xPVF8xNV8xNiAoMjEgPDwgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfSU1PTl9TTE9UXzE2XzE3ICgyMiA8PCBNOTg5MjVfREFJX0lNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfMTdfMTggKDIzIDw8IE05ODkyNV9EQUlfSU1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX0lNT05fU0xPVF8xOF8xOSAoMjQgPDwgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfSU1PTl9TTE9UXzE5XzFBICgyNSA8PCBNOTg5MjVfREFJX0lNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfMUFfMUIgKDI2IDw8IE05ODkyNV9EQUlfSU1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX0lNT05fU0xPVF8xQl8xQyAoMjcgPDwgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUlfSU1PTl9TTE9UXzFDXzFEICgyOCA8PCBNOTg5MjVfREFJX0lNT05fU0xPVF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9JTU9OX1NMT1RfMURfMUUgKDI5IDw8IE05ODkyNV9EQUlfSU1PTl9TTE9UX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFJX0lNT05fU0xPVF8xRV8xRiAoMzAgPDwgTTk4OTI1X0RBSV9JTU9OX1NMT1RfU0hJRlQpCisKKy8qIE1BWDk4OTI1X1IwMjRfRE9VVF9DRkdfVkJBVCAqLworI2RlZmluZSBNOTg5MjVfREFJX1ZCQVRfRU5fTUFTSwkJCQkJKDE8PDUpCisjZGVmaW5lIE05ODkyNV9EQUlfVkJBVF9FTl9TSElGVAkJCQk1CisjZGVmaW5lIE05ODkyNV9EQUlfVkJBVF9FTl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9EQUlfVkJBVF9TTE9UX01BU0sJCQkJKDB4MUY8PDApCisjZGVmaW5lIE05ODkyNV9EQUlfVkJBVF9TTE9UX1NISUZUCQkJCTAKKyNkZWZpbmUgTTk4OTI1X0RBSV9WQkFUX1NMT1RfV0lEVEgJCQkJNQorCisvKiBNQVg5ODkyNV9SMDI1X0RPVVRfQ0ZHX1ZCU1QgKi8KKyNkZWZpbmUgTTk4OTI1X0RBSV9WQlNUX0VOX01BU0sJCQkJCSgxPDw1KQorI2RlZmluZSBNOTg5MjVfREFJX1ZCU1RfRU5fU0hJRlQJCQkJNQorI2RlZmluZSBNOTg5MjVfREFJX1ZCU1RfRU5fV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfREFJX1ZCU1RfU0xPVF9NQVNLCQkJCSgweDFGPDwwKQorI2RlZmluZSBNOTg5MjVfREFJX1ZCU1RfU0xPVF9TSElGVAkJCQkwCisjZGVmaW5lIE05ODkyNV9EQUlfVkJTVF9TTE9UX1dJRFRICQkJCTUKKworLyogTUFYOTg5MjVfUjAyNl9ET1VUX0NGR19GTEFHICovCisjZGVmaW5lIE05ODkyNV9EQUlfRkxBR19FTl9NQVNLCQkJCQkoMTw8NSkKKyNkZWZpbmUgTTk4OTI1X0RBSV9GTEFHX0VOX1NISUZUCQkJCTUKKyNkZWZpbmUgTTk4OTI1X0RBSV9GTEFHX0VOX1dJRFRICQkJCTEKKyNkZWZpbmUgTTk4OTI1X0RBSV9GTEFHX1NMT1RfTUFTSwkJCQkoMHgxRjw8MCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9GTEFHX1NMT1RfU0hJRlQJCQkJMAorI2RlZmluZSBNOTg5MjVfREFJX0ZMQUdfU0xPVF9XSURUSAkJCQk1CisKKy8qIE1BWDk4OTI1X1IwMjdfRE9VVF9ISVpfQ0ZHMSAqLworI2RlZmluZSBNOTg5MjVfREFJX1NMT1RfSElaX0NGRzFfTUFTSwkJCSgweEZGPDwwKQorI2RlZmluZSBNOTg5MjVfREFJX1NMT1RfSElaX0NGRzFfU0hJRlQJCQkwCisjZGVmaW5lIE05ODkyNV9EQUlfU0xPVF9ISVpfQ0ZHMV9XSURUSAkJCTgKKworLyogTUFYOTg5MjVfUjAyOF9ET1VUX0hJWl9DRkcyICovCisjZGVmaW5lIE05ODkyNV9EQUlfU0xPVF9ISVpfQ0ZHMl9NQVNLCQkJKDB4RkY8PDApCisjZGVmaW5lIE05ODkyNV9EQUlfU0xPVF9ISVpfQ0ZHMl9TSElGVAkJCTAKKyNkZWZpbmUgTTk4OTI1X0RBSV9TTE9UX0hJWl9DRkcyX1dJRFRICQkJOAorCisvKiBNQVg5ODkyNV9SMDI5X0RPVVRfSElaX0NGRzMgKi8KKyNkZWZpbmUgTTk4OTI1X0RBSV9TTE9UX0hJWl9DRkczX01BU0sJCQkoMHhGRjw8MCkKKyNkZWZpbmUgTTk4OTI1X0RBSV9TTE9UX0hJWl9DRkczX1NISUZUCQkJMAorI2RlZmluZSBNOTg5MjVfREFJX1NMT1RfSElaX0NGRzNfV0lEVEgJCQk4CisKKy8qIE1BWDk4OTI1X1IwMkFfRE9VVF9ISVpfQ0ZHNCAqLworI2RlZmluZSBNOTg5MjVfREFJX1NMT1RfSElaX0NGRzRfTUFTSwkJCSgweEZGPDwwKQorI2RlZmluZSBNOTg5MjVfREFJX1NMT1RfSElaX0NGRzRfU0hJRlQJCQkwCisjZGVmaW5lIE05ODkyNV9EQUlfU0xPVF9ISVpfQ0ZHNF9XSURUSAkJCTgKKworLyogTUFYOTg5MjVfUjAyQl9ET1VUX0RSVl9TVFJFTkdUSCAqLworI2RlZmluZSBNOTg5MjVfREFJX09VVF9EUklWRV9NQVNLCQkJCSgweDAzPDwwKQorI2RlZmluZSBNOTg5MjVfREFJX09VVF9EUklWRV9TSElGVAkJCQkwCisjZGVmaW5lIE05ODkyNV9EQUlfT1VUX0RSSVZFX1dJRFRICQkJCTIKKworLyogTUFYOTg5MjVfUjAyQ19GSUxURVJTICovCisjZGVmaW5lIE05ODkyNV9BRENfRElUSEVSX0VOX01BU0sJCQkJKDE8PDcpCisjZGVmaW5lIE05ODkyNV9BRENfRElUSEVSX0VOX1NISUZUCQkJCTcKKyNkZWZpbmUgTTk4OTI1X0FEQ19ESVRIRVJfRU5fV0lEVEgJCQkJMQorI2RlZmluZSBNOTg5MjVfSVZfRENCX0VOX01BU0sJCQkJCSgxPDw2KQorI2RlZmluZSBNOTg5MjVfSVZfRENCX0VOX1NISUZUCQkJCQk2CisjZGVmaW5lIE05ODkyNV9JVl9EQ0JfRU5fV0lEVEgJCQkJCTEKKyNkZWZpbmUgTTk4OTI1X0RBQ19ESVRIRVJfRU5fTUFTSwkJCQkoMTw8NCkKKyNkZWZpbmUgTTk4OTI1X0RBQ19ESVRIRVJfRU5fU0hJRlQJCQkJNAorI2RlZmluZSBNOTg5MjVfREFDX0RJVEhFUl9FTl9XSURUSAkJCQkxCisjZGVmaW5lIE05ODkyNV9EQUNfRklMVEVSX01PREVfTUFTSwkJCQkoMTw8MykKKyNkZWZpbmUgTTk4OTI1X0RBQ19GSUxURVJfTU9ERV9TSElGVAkJCTMKKyNkZWZpbmUgTTk4OTI1X0RBQ19GSUxURVJfTU9ERV9XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X0RBQ19IUEZfTUFTSwkJCQkoMHgwNzw8MCkKKyNkZWZpbmUgTTk4OTI1X0RBQ19IUEZfU0hJRlQJCQkJCTAKKyNkZWZpbmUgTTk4OTI1X0RBQ19IUEZfV0lEVEgJCQkJCTMKKyNkZWZpbmUgTTk4OTI1X0RBQ19IUEZfRElTQUJMRQkJKDAgPDwgTTk4OTI1X0RBQ19IUEZfU0hJRlQpCisjZGVmaW5lIE05ODkyNV9EQUNfSFBGX0RDX0JMT0NLCQkoMSA8PCBNOTg5MjVfREFDX0hQRl9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBQ19IUEZfRU5fMTAwCQkoMiA8PCBNOTg5MjVfREFDX0hQRl9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBQ19IUEZfRU5fMjAwCQkoMyA8PCBNOTg5MjVfREFDX0hQRl9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBQ19IUEZfRU5fNDAwCQkoNCA8PCBNOTg5MjVfREFDX0hQRl9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBQ19IUEZfRU5fODAwCQkoNSA8PCBNOTg5MjVfREFDX0hQRl9TSElGVCkKKworLyogTUFYOTg5MjVfUjAyRF9HQUlOICovCisjZGVmaW5lIE05ODkyNV9EQUNfSU5fU0VMX01BU0sJCQkJCSgweDAzPDw1KQorI2RlZmluZSBNOTg5MjVfREFDX0lOX1NFTF9TSElGVAkJCQkJNQorI2RlZmluZSBNOTg5MjVfREFDX0lOX1NFTF9XSURUSAkJCQkJMgorI2RlZmluZSBNOTg5MjVfU1BLX0dBSU5fTUFTSwkJCQkJKDB4MUY8PDApCisjZGVmaW5lIE05ODkyNV9TUEtfR0FJTl9TSElGVAkJCQkJMAorI2RlZmluZSBNOTg5MjVfU1BLX0dBSU5fV0lEVEgJCQkJCTUKKworI2RlZmluZSBNOTg5MjVfREFDX0lOX1NFTF9MRUZUX0RBSSAoMCA8PCBNOTg5MjVfREFDX0lOX1NFTF9TSElGVCkKKyNkZWZpbmUgTTk4OTI1X0RBQ19JTl9TRUxfUklHSFRfREFJICgxIDw8IE05ODkyNV9EQUNfSU5fU0VMX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFDX0lOX1NFTF9TVU1NRURfREFJICgyIDw8IE05ODkyNV9EQUNfSU5fU0VMX1NISUZUKQorI2RlZmluZSBNOTg5MjVfREFDX0lOX1NFTF9ESVYyX1NVTU1FRF9EQUkgKDMgPDwgTTk4OTI1X0RBQ19JTl9TRUxfU0hJRlQpCisKKy8qIE1BWDk4OTI1X1IwMkVfR0FJTl9SQU1QSU5HICovCisjZGVmaW5lIE05ODkyNV9TUEtfUk1QX0VOX01BU0sJCSgxPDwxKQorI2RlZmluZSBNOTg5MjVfU1BLX1JNUF9FTl9TSElGVAkJMQorI2RlZmluZSBNOTg5MjVfU1BLX1JNUF9FTl9XSURUSAkJMQorI2RlZmluZSBNOTg5MjVfU1BLX1pDRF9FTl9NQVNLCQkoMTw8MCkKKyNkZWZpbmUgTTk4OTI1X1NQS19aQ0RfRU5fU0hJRlQJCTAKKyNkZWZpbmUgTTk4OTI1X1NQS19aQ0RfRU5fV0lEVEgJCTEKKworLyogTUFYOTg5MjVfUjAyRl9TUEtfQU1QICovCisjZGVmaW5lIE05ODkyNV9TUEtfTU9ERV9NQVNLCQkoMTw8MCkKKyNkZWZpbmUgTTk4OTI1X1NQS19NT0RFX1NISUZUCQkwCisjZGVmaW5lIE05ODkyNV9TUEtfTU9ERV9XSURUSAkJMQorCisvKiBNQVg5ODkyNV9SMDMwX1RIUkVTSE9MRCAqLworI2RlZmluZSBNOTg5MjVfQUxDX0VOX01BU0sJCQkoMTw8NSkKKyNkZWZpbmUgTTk4OTI1X0FMQ19FTl9TSElGVAkJCTUKKyNkZWZpbmUgTTk4OTI1X0FMQ19FTl9XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X0FMQ19USF9NQVNLCQkJKDB4MUY8PDApCisjZGVmaW5lIE05ODkyNV9BTENfVEhfU0hJRlQJCQkwCisjZGVmaW5lIE05ODkyNV9BTENfVEhfV0lEVEgJCQk1CisKKy8qIE1BWDk4OTI1X1IwMzFfQUxDX0FUVEFDSyAqLworI2RlZmluZSBNOTg5MjVfQUxDX0FUS19TVEVQX01BU0sJKDB4MEY8PDQpCisjZGVmaW5lIE05ODkyNV9BTENfQVRLX1NURVBfU0hJRlQJNAorI2RlZmluZSBNOTg5MjVfQUxDX0FUS19TVEVQX1dJRFRICTQKKyNkZWZpbmUgTTk4OTI1X0FMQ19BVEtfUkFURV9NQVNLCSgweDc8PDApCisjZGVmaW5lIE05ODkyNV9BTENfQVRLX1JBVEVfU0hJRlQJMAorI2RlZmluZSBNOTg5MjVfQUxDX0FUS19SQVRFX1dJRFRICTMKKworLyogTUFYOTg5MjVfUjAzMl9BTENfQVRURU5fUkxTICovCisjZGVmaW5lIE05ODkyNV9BTENfTUFYX0FUVEVOX01BU0sJKDB4MEY8PDQpCisjZGVmaW5lIE05ODkyNV9BTENfTUFYX0FUVEVOX1NISUZUCTQKKyNkZWZpbmUgTTk4OTI1X0FMQ19NQVhfQVRURU5fV0lEVEgJNAorI2RlZmluZSBNOTg5MjVfQUxDX1JMU19SQVRFX01BU0sJKDB4Nzw8MCkKKyNkZWZpbmUgTTk4OTI1X0FMQ19STFNfUkFURV9TSElGVAkwCisjZGVmaW5lIE05ODkyNV9BTENfUkxTX1JBVEVfV0lEVEgJMworCisvKiBNQVg5ODkyNV9SMDMzX0FMQ19IT0xEX1JMUyAqLworI2RlZmluZSBNOTg5MjVfQUxDX1JMU19UR1JfTUFTSwkJKDE8PDApCisjZGVmaW5lIE05ODkyNV9BTENfUkxTX1RHUl9TSElGVAkwCisjZGVmaW5lIE05ODkyNV9BTENfUkxTX1RHUl9XSURUSAkxCisKKy8qIE1BWDk4OTI1X1IwMzRfQUxDX0NPTkZJR1VSQVRJT04gKi8KKyNkZWZpbmUgTTk4OTI1X0FMQ19NVVRFX0VOX01BU0sJCSgxPDw3KQorI2RlZmluZSBNOTg5MjVfQUxDX01VVEVfRU5fU0hJRlQJNworI2RlZmluZSBNOTg5MjVfQUxDX01VVEVfRU5fV0lEVEgJMQorI2RlZmluZSBNOTg5MjVfQUxDX01VVEVfRExZX01BU0sJKDB4MDc8PDQpCisjZGVmaW5lIE05ODkyNV9BTENfTVVURV9ETFlfU0hJRlQJNAorI2RlZmluZSBNOTg5MjVfQUxDX01VVEVfRExZX1dJRFRICTMKKyNkZWZpbmUgTTk4OTI1X0FMQ19STFNfREJUX01BU0sJCSgweDA3PDwwKQorI2RlZmluZSBNOTg5MjVfQUxDX1JMU19EQlRfU0hJRlQJMAorI2RlZmluZSBNOTg5MjVfQUxDX1JMU19EQlRfV0lEVEgJMworCisvKiBNQVg5ODkyNV9SMDM1X0JPT1NUX0NPTlZFUlRFUiAqLworI2RlZmluZSBNOTg5MjVfQlNUX1NZTkNfTUFTSwkJKDE8PDcpCisjZGVmaW5lIE05ODkyNV9CU1RfU1lOQ19TSElGVAkJNworI2RlZmluZSBNOTg5MjVfQlNUX1NZTkNfV0lEVEgJCTEKKyNkZWZpbmUgTTk4OTI1X0JTVF9QSEFTRV9NQVNLCQkoMHgwMzw8NCkKKyNkZWZpbmUgTTk4OTI1X0JTVF9QSEFTRV9TSElGVAkJNAorI2RlZmluZSBNOTg5MjVfQlNUX1BIQVNFX1dJRFRICQkyCisjZGVmaW5lIE05ODkyNV9CU1RfU0tJUF9NT0RFX01BU0sJKDB4MDM8PDApCisjZGVmaW5lIE05ODkyNV9CU1RfU0tJUF9NT0RFX1NISUZUCTAKKyNkZWZpbmUgTTk4OTI1X0JTVF9TS0lQX01PREVfV0lEVEgJMgorCisvKiBNQVg5ODkyNV9SMDM2X0JMT0NLX0VOQUJMRSAqLworI2RlZmluZSBNOTg5MjVfQlNUX0VOX01BU0sJCQkoMTw8NykKKyNkZWZpbmUgTTk4OTI1X0JTVF9FTl9TSElGVAkJCTcKKyNkZWZpbmUgTTk4OTI1X0JTVF9FTl9XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X1dBVENIX0VOX01BU0sJCSgxPDw2KQorI2RlZmluZSBNOTg5MjVfV0FUQ0hfRU5fU0hJRlQJCTYKKyNkZWZpbmUgTTk4OTI1X1dBVENIX0VOX1dJRFRICQkxCisjZGVmaW5lIE05ODkyNV9DTEtNT05fRU5fTUFTSwkJKDE8PDUpCisjZGVmaW5lIE05ODkyNV9DTEtNT05fRU5fU0hJRlQJCTUKKyNkZWZpbmUgTTk4OTI1X0NMS01PTl9FTl9XSURUSAkJMQorI2RlZmluZSBNOTg5MjVfU1BLX0VOX01BU0sJCQkoMTw8NCkKKyNkZWZpbmUgTTk4OTI1X1NQS19FTl9TSElGVAkJCTQKKyNkZWZpbmUgTTk4OTI1X1NQS19FTl9XSURUSAkJCTEKKyNkZWZpbmUgTTk4OTI1X0FEQ19WQlNUX0VOX01BU0sJCSgxPDwzKQorI2RlZmluZSBNOTg5MjVfQURDX1ZCU1RfRU5fU0hJRlQJMworI2RlZmluZSBNOTg5MjVfQURDX1ZCU1RfRU5fV0lEVEgJMQorI2RlZmluZSBNOTg5MjVfQURDX1ZCQVRfRU5fTUFTSwkJKDE8PDIpCisjZGVmaW5lIE05ODkyNV9BRENfVkJBVF9FTl9TSElGVAkyCisjZGVmaW5lIE05ODkyNV9BRENfVkJBVF9FTl9XSURUSAkxCisjZGVmaW5lIE05ODkyNV9BRENfSU1PTl9FTl9NQVNLCQkoMTw8MSkKKyNkZWZpbmUgTTk4OTI1X0FEQ19JTU9OX0VOX1NISUZUCTEKKyNkZWZpbmUgTTk4OTI1X0FEQ19JTU9OX0VOX1dJRFRICTEKKyNkZWZpbmUgTTk4OTI1X0FEQ19WTU9OX0VOX01BU0sJCSgxPDwwKQorI2RlZmluZSBNOTg5MjVfQURDX1ZNT05fRU5fU0hJRlQJMAorI2RlZmluZSBNOTg5MjVfQURDX1ZNT05fRU5fV0lEVEgJMQorCisvKiBNQVg5ODkyNV9SMDM3X0NPTkZJR1VSQVRJT04gKi8KKyNkZWZpbmUgTTk4OTI1X0JTVF9WT1VUX01BU0sJCSgweDBGPDw0KQorI2RlZmluZSBNOTg5MjVfQlNUX1ZPVVRfU0hJRlQJCTQKKyNkZWZpbmUgTTk4OTI1X0JTVF9WT1VUX1dJRFRICQk0CisjZGVmaW5lIE05ODkyNV9USEVSTVdBUk5fTEVWRUxfTUFTSwkoMHgwMzw8MikKKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9MRVZFTF9TSElGVAkJCTIKKyNkZWZpbmUgTTk4OTI1X1RIRVJNV0FSTl9MRVZFTF9XSURUSAkJCTIKKyNkZWZpbmUgTTk4OTI1X1dBVENIX1RJTUVfTUFTSwkJCSgweDAzPDwwKQorI2RlZmluZSBNOTg5MjVfV0FUQ0hfVElNRV9TSElGVAkJCTAKKyNkZWZpbmUgTTk4OTI1X1dBVENIX1RJTUVfV0lEVEgJCQkyCisKKy8qIE1BWDk4OTI1X1IwMzhfR0xPQkFMX0VOQUJMRSAqLworI2RlZmluZSBNOTg5MjVfRU5fTUFTSwkJCSgxPDw3KQorI2RlZmluZSBNOTg5MjVfRU5fU0hJRlQJCQk3CisjZGVmaW5lIE05ODkyNV9FTl9XSURUSAkJCTEKKworLyogTUFYOTg5MjVfUjAzQV9CT09TVF9MSU1JVEVSICovCisjZGVmaW5lIE05ODkyNV9CU1RfSUxJTV9NQVNLCSgweDFGPDwzKQorI2RlZmluZSBNOTg5MjVfQlNUX0lMSU1fU0hJRlQJMworI2RlZmluZSBNOTg5MjVfQlNUX0lMSU1fV0lEVEgJNQorCisvKiBNQVg5ODkyNV9SMEZGX1ZFUlNJT04gKi8KKyNkZWZpbmUgTTk4OTI1X1JFVl9JRF9NQVNLCSgweEZGPDwwKQorI2RlZmluZSBNOTg5MjVfUkVWX0lEX1NISUZUCTAKKyNkZWZpbmUgTTk4OTI1X1JFVl9JRF9XSURUSAk4CisKK3N0cnVjdCBtYXg5ODkyNV9wcml2IHsKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCXN0cnVjdCBtYXg5ODkyNV9wZGF0YSAqcGRhdGE7CisJdW5zaWduZWQgaW50IHN5c2NsazsKKwl1bnNpZ25lZCBpbnQgdl9zbG90OworCXVuc2lnbmVkIGludCBpX3Nsb3Q7CisJdW5zaWduZWQgaW50IHNwa19nYWluOworCXVuc2lnbmVkIGludCBjaF9zaXplOworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY20xNjgxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTE2ODEuYwppbmRleCBhNzIyYTAyLi40NzdlMTNkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3BjbTE2ODEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTE2ODEuYwpAQCAtMTE4LDcgKzExOCw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CiAJc3RydWN0IHBjbTE2ODFfcHJpdmF0ZSAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHByaXYtPmRlZW1waDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHByaXYtPmRlZW1waDsKIAogCXJldHVybiAwOwogfQpAQCAtMTI5LDcgKzEyOSw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CiAJc3RydWN0IHBjbTE2ODFfcHJpdmF0ZSAqcHJpdiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JcHJpdi0+ZGVlbXBoID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlwcml2LT5kZWVtcGggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAogCXJldHVybiBwY20xNjgxX3NldF9kZWVtcGgoY29kZWMpOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9wY201MTJ4LmMgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMnguYwppbmRleCA5OTc0ZjIwLi41YTMwZmRkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMnguYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3BjbTUxMnguYwpAQCAtNTQsNiArNTQsOSBAQAogCWludCBwbGxfZDsKIAlpbnQgcGxsX3A7CiAJdW5zaWduZWQgbG9uZyByZWFsX3BsbDsKKwl1bnNpZ25lZCBsb25nIG92ZXJjbG9ja19wbGw7CisJdW5zaWduZWQgbG9uZyBvdmVyY2xvY2tfZGFjOworCXVuc2lnbmVkIGxvbmcgb3ZlcmNsb2NrX2RzcDsKIH07CiAKIC8qCkBAIC0yMjQsNiArMjI3LDkwIEBACiAJfQogfQogCitzdGF0aWMgaW50IHBjbTUxMnhfb3ZlcmNsb2NrX3BsbF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgcGNtNTEyeF9wcml2ICpwY201MTJ4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHBjbTUxMngtPm92ZXJjbG9ja19wbGw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNtNTEyeF9vdmVyY2xvY2tfcGxsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMnggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXN3aXRjaCAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCkgeworCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXBjbTUxMngtPm92ZXJjbG9ja19wbGwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY201MTJ4X292ZXJjbG9ja19kc3BfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHBjbTUxMnhfcHJpdiAqcGNtNTEyeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBwY201MTJ4LT5vdmVyY2xvY2tfZHNwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBjbTUxMnhfb3ZlcmNsb2NrX2RzcF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKKwlzdHJ1Y3QgcGNtNTEyeF9wcml2ICpwY201MTJ4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisKKwlzd2l0Y2ggKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwpIHsKKwljYXNlIFNORF9TT0NfQklBU19PRkY6CisJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlwY201MTJ4LT5vdmVyY2xvY2tfZHNwID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGNtNTEyeF9vdmVyY2xvY2tfZGFjX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOworCXN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMnggPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcGNtNTEyeC0+b3ZlcmNsb2NrX2RhYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwY201MTJ4X292ZXJjbG9ja19kYWNfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHBjbTUxMnhfcHJpdiAqcGNtNTEyeCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJc3dpdGNoIChjb2RlYy0+ZGFwbS5iaWFzX2xldmVsKSB7CisJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCWNhc2UgU05EX1NPQ19CSUFTX1NUQU5EQlk6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcGNtNTEyeC0+b3ZlcmNsb2NrX2RhYyA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoZGlnaXRhbF90bHYsIC0xMDM1MCwgNTAsIDEpOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGFuYWxvZ190bHYsIC02MDAsIDYwMCwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoYm9vc3RfdGx2LCAwLCA4MCwgMCk7CkBAIC0zMDQsOSArMzkxLDkgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBwY201MTJ4X2NvbnRyb2xzW10gPSB7CiBTT0NfRE9VQkxFX1JfVExWKCJEaWdpdGFsIFBsYXliYWNrIFZvbHVtZSIsIFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMiwKIAkJIFBDTTUxMnhfRElHSVRBTF9WT0xVTUVfMywgMCwgMjU1LCAxLCBkaWdpdGFsX3RsdiksCi1TT0NfRE9VQkxFX1RMVigiUGxheWJhY2sgVm9sdW1lIiwgUENNNTEyeF9BTkFMT0dfR0FJTl9DVFJMLAorU09DX0RPVUJMRV9UTFYoIkFuYWxvZ3VlIFBsYXliYWNrIFZvbHVtZSIsIFBDTTUxMnhfQU5BTE9HX0dBSU5fQ1RSTCwKIAkgICAgICAgUENNNTEyeF9MQUdOX1NISUZULCBQQ001MTJ4X1JBR05fU0hJRlQsIDEsIDEsIGFuYWxvZ190bHYpLAotU09DX0RPVUJMRV9UTFYoIlBsYXliYWNrIEJvb3N0IFZvbHVtZSIsIFBDTTUxMnhfQU5BTE9HX0dBSU5fQk9PU1QsCitTT0NfRE9VQkxFX1RMVigiQW5hbG9ndWUgUGxheWJhY2sgQm9vc3QgVm9sdW1lIiwgUENNNTEyeF9BTkFMT0dfR0FJTl9CT09TVCwKIAkgICAgICAgUENNNTEyeF9BR0JMX1NISUZULCBQQ001MTJ4X0FHQlJfU0hJRlQsIDEsIDAsIGJvb3N0X3RsdiksCiBTT0NfRE9VQkxFKCJEaWdpdGFsIFBsYXliYWNrIFN3aXRjaCIsIFBDTTUxMnhfTVVURSwgUENNNTEyeF9SUU1MX1NISUZULAogCSAgIFBDTTUxMnhfUlFNUl9TSElGVCwgMSwgMSksCkBAIC0zMjgsNiArNDE1LDEzIEBACiBTT0NfRU5VTSgiVm9sdW1lIFJhbXAgVXAgU3RlcCIsIHBjbTUxMnhfdm51cyksCiBTT0NfRU5VTSgiVm9sdW1lIFJhbXAgRG93biBFbWVyZ2VuY3kgUmF0ZSIsIHBjbTUxMnhfdmVkZiksCiBTT0NfRU5VTSgiVm9sdW1lIFJhbXAgRG93biBFbWVyZ2VuY3kgU3RlcCIsIHBjbTUxMnhfdmVkcyksCisKK1NPQ19TSU5HTEVfRVhUKCJNYXggT3ZlcmNsb2NrIFBMTCIsIFNORF9TT0NfTk9QTSwgMCwgMjAsIDAsCisJICAgICAgIHBjbTUxMnhfb3ZlcmNsb2NrX3BsbF9nZXQsIHBjbTUxMnhfb3ZlcmNsb2NrX3BsbF9wdXQpLAorU09DX1NJTkdMRV9FWFQoIk1heCBPdmVyY2xvY2sgRFNQIiwgU05EX1NPQ19OT1BNLCAwLCA0MCwgMCwKKwkgICAgICAgcGNtNTEyeF9vdmVyY2xvY2tfZHNwX2dldCwgcGNtNTEyeF9vdmVyY2xvY2tfZHNwX3B1dCksCitTT0NfU0lOR0xFX0VYVCgiTWF4IE92ZXJjbG9jayBEQUMiLCBTTkRfU09DX05PUE0sIDAsIDQwLCAwLAorCSAgICAgICBwY201MTJ4X292ZXJjbG9ja19kYWNfZ2V0LCBwY201MTJ4X292ZXJjbG9ja19kYWNfcHV0KSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBwY201MTJ4X2RhcG1fd2lkZ2V0c1tdID0gewpAQCAtMzQ2LDYgKzQ0MCw0NSBAQAogCXsgIk9VVFIiLCBOVUxMLCAiREFDUiIgfSwKIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBjbTUxMnhfcGxsX21heChzdHJ1Y3QgcGNtNTEyeF9wcml2ICpwY201MTJ4KQoreworCXJldHVybiAyNTAwMDAwMCArIDI1MDAwMDAwICogcGNtNTEyeC0+b3ZlcmNsb2NrX3BsbCAvIDEwMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGNtNTEyeF9kc3BfbWF4KHN0cnVjdCBwY201MTJ4X3ByaXYgKnBjbTUxMngpCit7CisJcmV0dXJuIDUwMDAwMDAwICsgNTAwMDAwMDAgKiBwY201MTJ4LT5vdmVyY2xvY2tfZHNwIC8gMTAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwY201MTJ4X2RhY19tYXgoc3RydWN0IHBjbTUxMnhfcHJpdiAqcGNtNTEyeCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcmF0ZSkKK3sKKwlyZXR1cm4gcmF0ZSArIHJhdGUgKiBwY201MTJ4LT5vdmVyY2xvY2tfZGFjIC8gMTAwOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwY201MTJ4X3Nja19tYXgoc3RydWN0IHBjbTUxMnhfcHJpdiAqcGNtNTEyeCkKK3sKKwlpZiAoIXBjbTUxMngtPnBsbF9vdXQpCisJCXJldHVybiAyNTAwMDAwMDsKKwlyZXR1cm4gcGNtNTEyeF9wbGxfbWF4KHBjbTUxMngpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwY201MTJ4X25jcF90YXJnZXQoc3RydWN0IHBjbTUxMnhfcHJpdiAqcGNtNTEyeCwKKwkJCQkJdW5zaWduZWQgbG9uZyBkYWNfcmF0ZSkKK3sKKwkvKgorCSAqIElmIHRoZSBEQUMgaXMgbm90IGFjdHVhbGx5IG92ZXJjbG9ja2VkLCB1c2UgdGhlIGdvb2Qgb2xkCisJICogTkNQIHRhcmdldCByYXRlLi4uCisJICovCisJaWYgKGRhY19yYXRlIDw9IDYxNDQwMDApCisJCXJldHVybiAxNTM2MDAwOworCS8qCisJICogLi4uYnV0IGlmIHRoZSBEQUMgaXMgaW4gZmFjdCBvdmVyY2xvY2tlZCwgYnVtcCB0aGUgTkNQIHRhcmdldAorCSAqIHJhdGUgdG8gZ2V0IHRoZSByZWNvbW1lbmRlZCBkaXZpZGVycyBldmVuIHdoZW4gb3ZlcmNsb2NraW5nLgorCSAqLworCXJldHVybiBwY201MTJ4X2RhY19tYXgocGNtNTEyeCwgMTUzNjAwMCk7Cit9CisKIHN0YXRpYyBjb25zdCB1MzIgcGNtNTEyeF9kYWlfcmF0ZXNbXSA9IHsKIAk4MDAwLCAxMTAyNSwgMTYwMDAsIDIyMDUwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCA2NDAwMCwKIAk4ODIwMCwgOTYwMDAsIDE3NjQwMCwgMTkyMDAwLCAzODQwMDAsCkBAIC0zNTksNiArNDkyLDcgQEAKIHN0YXRpYyBpbnQgcGNtNTEyeF9od19ydWxlX3JhdGUoc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMsCiAJCQkJc3RydWN0IHNuZF9wY21faHdfcnVsZSAqcnVsZSkKIHsKKwlzdHJ1Y3QgcGNtNTEyeF9wcml2ICpwY201MTJ4ID0gcnVsZS0+cHJpdmF0ZTsKIAlzdHJ1Y3Qgc25kX2ludGVydmFsIHJhbmdlc1syXTsKIAlpbnQgZnJhbWVfc2l6ZTsKIApAQCAtMzc3LDcgKzUxMSw3IEBACiAJCSAqLwogCQltZW1zZXQocmFuZ2VzLCAwLCBzaXplb2YocmFuZ2VzKSk7CiAJCXJhbmdlc1swXS5taW4gPSA4MDAwOwotCQlyYW5nZXNbMF0ubWF4ID0gMjUwMDAwMDAgLyBmcmFtZV9zaXplIC8gMjsKKwkJcmFuZ2VzWzBdLm1heCA9IHBjbTUxMnhfc2NrX21heChwY201MTJ4KSAvIGZyYW1lX3NpemUgLyAyOwogCQlyYW5nZXNbMV0ubWluID0gRElWX1JPVU5EX1VQKDE2MDAwMDAwLCBmcmFtZV9zaXplKTsKIAkJcmFuZ2VzWzFdLm1heCA9IDM4NDAwMDsKIAkJYnJlYWs7CkBAIC00MDgsNyArNTQyLDcgQEAKIAkJcmV0dXJuIHNuZF9wY21faHdfcnVsZV9hZGQoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAogCQkJCQkgICBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKIAkJCQkJICAgcGNtNTEyeF9od19ydWxlX3JhdGUsCi0JCQkJCSAgIE5VTEwsCisJCQkJCSAgIHBjbTUxMngsCiAJCQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9GUkFNRV9CSVRTLAogCQkJCQkgICBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsIC0xKTsKIApAQCAtNTE3LDYgKzY1MSw4IEBACiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBiY2xrX3JhdGUpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gZGFpLT5kZXY7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3QgcGNtNTEyeF9wcml2ICpwY201MTJ4ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJdW5zaWduZWQgbG9uZyBzY2tfcmF0ZTsKIAlpbnQgcG93MjsKIApAQCAtNTI3LDkgKzY2MywxMCBAQAogCSAqIGFzIG1hbnkgZmFjdG9ycyBvZiAyIGFzIHBvc3NpYmxlLCBhcyB0aGF0IG1ha2VzIGl0IGVhc2llcgogCSAqIHRvIGZpbmQgYSBmYXN0IERBQyByYXRlCiAJICovCi0JcG93MiA9IDEgPDwgZmxzKCgyNTAwMDAwMCAtIDE2MDAwMDAwKSAvIGJjbGtfcmF0ZSk7CisJcG93MiA9IDEgPDwgZmxzKChwY201MTJ4X3BsbF9tYXgocGNtNTEyeCkgLSAxNjAwMDAwMCkgLyBiY2xrX3JhdGUpOwogCWZvciAoOyBwb3cyOyBwb3cyID4+PSAxKSB7Ci0JCXNja19yYXRlID0gcm91bmRkb3duKDI1MDAwMDAwLCBiY2xrX3JhdGUgKiBwb3cyKTsKKwkJc2NrX3JhdGUgPSByb3VuZGRvd24ocGNtNTEyeF9wbGxfbWF4KHBjbTUxMngpLAorCQkJCSAgICAgYmNsa19yYXRlICogcG93Mik7CiAJCWlmIChzY2tfcmF0ZSA+PSAxNjAwMDAwMCkKIAkJCWJyZWFrOwogCX0KQEAgLTU3Niw4ICs3MTMsOCBAQAogCiAJLyogcGxsaW5fcmF0ZSAvIFAgKG9yIGhlcmUsIGRlbikgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAyMCBNSHogKi8KIAlpZiAocGxsaW5fcmF0ZSAvIGRlbiA+IDIwMDAwMDAwICYmIG51bSA8IDgpIHsKLQkJbnVtICo9IDIwMDAwMDAwIC8gKHBsbGluX3JhdGUgLyBkZW4pOwotCQlkZW4gKj0gMjAwMDAwMDAgLyAocGxsaW5fcmF0ZSAvIGRlbik7CisJCW51bSAqPSBESVZfUk9VTkRfVVAocGxsaW5fcmF0ZSAvIGRlbiwgMjAwMDAwMDApOworCQlkZW4gKj0gRElWX1JPVU5EX1VQKHBsbGluX3JhdGUgLyBkZW4sIDIwMDAwMDAwKTsKIAl9CiAJZGV2X2RiZyhkZXYsICJudW0gLyBkZW4gPSAlbHUgLyAlbHVcbiIsIG51bSwgZGVuKTsKIApAQCAtNjc4LDcgKzgxNSw3IEBACiAJCXJldHVybiAwOyAvKiBmdXRpbGUsIHF1aXQgZWFybHkgKi8KIAogCS8qIHJ1biBEQUMgbm8gZmFzdGVyIHRoYW4gNjE0NDAwMCBIeiAqLwotCWZvciAoZGFjX3JhdGUgPSByb3VuZGRvd24oNjE0NDAwMCwgb3NyX3JhdGUpOworCWZvciAoZGFjX3JhdGUgPSByb3VuZGRvd24ocGNtNTEyeF9kYWNfbWF4KHBjbTUxMngsIDYxNDQwMDApLCBvc3JfcmF0ZSk7CiAJICAgICBkYWNfcmF0ZTsKIAkgICAgIGRhY19yYXRlIC09IG9zcl9yYXRlKSB7CiAKQEAgLTgwNSw3ICs5NDIsNyBAQAogCW9zcl9yYXRlID0gMTYgKiBzYW1wbGVfcmF0ZTsKIAogCS8qIHJ1biBEU1Agbm8gZmFzdGVyIHRoYW4gNTAgTUh6ICovCi0JZHNwX2RpdiA9IG1ja19yYXRlID4gNTAwMDAwMDAgPyAyIDogMTsKKwlkc3BfZGl2ID0gbWNrX3JhdGUgPiBwY201MTJ4X2RzcF9tYXgocGNtNTEyeCkgPyAyIDogMTsKIAogCWRhY19yYXRlID0gcGNtNTEyeF9wbGxpbl9kYWNfcmF0ZShkYWksIG9zcl9yYXRlLCBwbGxpbl9yYXRlKTsKIAlpZiAoZGFjX3JhdGUpIHsKQEAgLTgzNiw3ICs5NzMsOCBAQAogCQlkYWNzcmNfcmF0ZSA9IHBsbGluX3JhdGU7CiAJfSBlbHNlIHsKIAkJLyogcnVuIERBQyBubyBmYXN0ZXIgdGhhbiA2MTQ0MDAwIEh6ICovCi0JCXVuc2lnbmVkIGxvbmcgZGFjX211bCA9IDYxNDQwMDAgLyBvc3JfcmF0ZTsKKwkJdW5zaWduZWQgbG9uZyBkYWNfbXVsID0gcGNtNTEyeF9kYWNfbWF4KHBjbTUxMngsIDYxNDQwMDApCisJCQkvIG9zcl9yYXRlOwogCQl1bnNpZ25lZCBsb25nIHNja19tdWwgPSBzY2tfcmF0ZSAvIG9zcl9yYXRlOwogCiAJCWZvciAoOyBkYWNfbXVsOyBkYWNfbXVsLS0pIHsKQEAgLTg2MywyOCArMTAwMSwzMCBAQAogCQlkYWNzcmNfcmF0ZSA9IHNja19yYXRlOwogCX0KIAorCW9zcl9kaXYgPSBESVZfUk9VTkRfQ0xPU0VTVChkYWNfcmF0ZSwgb3NyX3JhdGUpOworCWlmIChvc3JfZGl2ID4gMTI4KSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGZpbmQgT1NSIGRpdmlkZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlkYWNfZGl2ID0gRElWX1JPVU5EX0NMT1NFU1QoZGFjc3JjX3JhdGUsIGRhY19yYXRlKTsKIAlpZiAoZGFjX2RpdiA+IDEyOCkgewogCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBmaW5kIERBQyBkaXZpZGVyXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCWRhY19yYXRlID0gZGFjc3JjX3JhdGUgLyBkYWNfZGl2OwogCi0JbmNwX2RpdiA9IERJVl9ST1VORF9DTE9TRVNUKGRhY3NyY19yYXRlIC8gZGFjX2RpdiwgMTUzNjAwMCk7Ci0JaWYgKG5jcF9kaXYgPiAxMjggfHwgZGFjc3JjX3JhdGUgLyBkYWNfZGl2IC8gbmNwX2RpdiA+IDIwNDgwMDApIHsKKwluY3BfZGl2ID0gRElWX1JPVU5EX0NMT1NFU1QoZGFjX3JhdGUsCisJCQkJICAgIHBjbTUxMnhfbmNwX3RhcmdldChwY201MTJ4LCBkYWNfcmF0ZSkpOworCWlmIChuY3BfZGl2ID4gMTI4IHx8IGRhY19yYXRlIC8gbmNwX2RpdiA+IDIwNDgwMDApIHsKIAkJLyogcnVuIE5DUCBubyBmYXN0ZXIgdGhhbiAyMDQ4MDAwIEh6LCBidXQgd2h5PyAqLwotCQluY3BfZGl2ID0gRElWX1JPVU5EX1VQKGRhY3NyY19yYXRlIC8gZGFjX2RpdiwgMjA0ODAwMCk7CisJCW5jcF9kaXYgPSBESVZfUk9VTkRfVVAoZGFjX3JhdGUsIDIwNDgwMDApOwogCQlpZiAobmNwX2RpdiA+IDEyOCkgewogCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZmluZCBOQ1AgZGl2aWRlclxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KIAotCW9zcl9kaXYgPSBESVZfUk9VTkRfQ0xPU0VTVChkYWNfcmF0ZSwgb3NyX3JhdGUpOwotCWlmIChvc3JfZGl2ID4gMTI4KSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGZpbmQgT1NSIGRpdmlkZXJcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlpZGFjID0gbWNrX3JhdGUgLyAoZHNwX2RpdiAqIHNhbXBsZV9yYXRlKTsKIAogCXJldCA9IHJlZ21hcF93cml0ZShwY201MTJ4LT5yZWdtYXAsIFBDTTUxMnhfRFNQX0NMS0RJViwgZHNwX2RpdiAtIDEpOwpAQCAtOTM3LDExICsxMDc3LDExIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JaWYgKHNhbXBsZV9yYXRlIDw9IDQ4MDAwKQorCWlmIChzYW1wbGVfcmF0ZSA8PSBwY201MTJ4X2RhY19tYXgocGNtNTEyeCwgNDgwMDApKQogCQlmc3NwID0gUENNNTEyeF9GU1NQXzQ4S0haOwotCWVsc2UgaWYgKHNhbXBsZV9yYXRlIDw9IDk2MDAwKQorCWVsc2UgaWYgKHNhbXBsZV9yYXRlIDw9IHBjbTUxMnhfZGFjX21heChwY201MTJ4LCA5NjAwMCkpCiAJCWZzc3AgPSBQQ001MTJ4X0ZTU1BfOTZLSFo7Ci0JZWxzZSBpZiAoc2FtcGxlX3JhdGUgPD0gMTkyMDAwKQorCWVsc2UgaWYgKHNhbXBsZV9yYXRlIDw9IHBjbTUxMnhfZGFjX21heChwY201MTJ4LCAxOTIwMDApKQogCQlmc3NwID0gUENNNTEyeF9GU1NQXzE5MktIWjsKIAllbHNlCiAJCWZzc3AgPSBQQ001MTJ4X0ZTU1BfMzg0S0haOwpAQCAtMTE1NiwyNSArMTI5Niw2IEBACiAJCQkJcmV0LCBwY201MTJ4LT5wbGxfb3V0KTsKIAkJCXJldHVybiByZXQ7CiAJCX0KLQotCQlncGlvID0gUENNNTEyeF9HMU9FIDw8ICg0IC0gMSk7Ci0JCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwY201MTJ4LT5yZWdtYXAsIFBDTTUxMnhfR1BJT19FTiwKLQkJCQkJIGdwaW8sIGdwaW8pOwotCQlpZiAocmV0ICE9IDApIHsKLQkJCWRldl9lcnIoY29kZWMtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgZ3BpbyAlZDogJWRcbiIsCi0JCQkJNCwgcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQlncGlvID0gUENNNTEyeF9HUElPX09VVFBVVF8xICsgNCAtIDE7Ci0JCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwY201MTJ4LT5yZWdtYXAsIGdwaW8sCi0JCQkJCSBQQ001MTJ4X0d4U0wsIFBDTTUxMnhfR3hTTF9QTExMSyk7Ci0JCWlmIChyZXQgIT0gMCkgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCSJGYWlsZWQgdG8gb3V0cHV0IHBsbCBsb2NrIG9uICVkOiAlZFxuIiwKLQkJCQlyZXQsIDQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQogCX0KIAogCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhwY201MTJ4LT5yZWdtYXAsIFBDTTUxMnhfU1lOQ0hST05JWkUsCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0Mjg2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0Mjg2LmMKaW5kZXggZjM3NDg0MC4uMGZjZGEzNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDI4Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQyODYuYwpAQCAtMzk1LDkgKzM5NSwyMCBAQAogCiAJcnQyODYtPmphY2sgPSBqYWNrOwogCi0JLyogU2VuZCBhbiBpbml0aWFsIGVtcHR5IHJlcG9ydCAqLwotCXNuZF9zb2NfamFja19yZXBvcnQocnQyODYtPmphY2ssIDAsCi0JCVNORF9KQUNLX01JQ1JPUEhPTkUgfCBTTkRfSkFDS19IRUFEUEhPTkUpOworCWlmIChqYWNrKSB7CisJCS8qIGVuYWJsZSBJUlEgKi8KKwkJaWYgKHJ0Mjg2LT5qYWNrLT5zdGF0dXMgJiBTTkRfSkFDS19IRUFEUEhPTkUpCisJCQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY29kZWMtPmRhcG0sICJMRE8xIik7CisJCXJlZ21hcF91cGRhdGVfYml0cyhydDI4Ni0+cmVnbWFwLCBSVDI4Nl9JUlFfQ1RSTCwgMHgyLCAweDIpOworCQkvKiBTZW5kIGFuIGluaXRpYWwgZW1wdHkgcmVwb3J0ICovCisJCXNuZF9zb2NfamFja19yZXBvcnQocnQyODYtPmphY2ssIHJ0Mjg2LT5qYWNrLT5zdGF0dXMsCisJCQlTTkRfSkFDS19NSUNST1BIT05FIHwgU05EX0pBQ0tfSEVBRFBIT05FKTsKKwl9IGVsc2UgeworCQkvKiBkaXNhYmxlIElSUSAqLworCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQyODYtPnJlZ21hcCwgUlQyODZfSVJRX0NUUkwsIDB4MiwgMHgwKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkxETzEiKTsKKwl9CisJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTAzNyw3ICsxMDQ4LDYgQEAKIAlzdHJ1Y3QgcnQyODZfcHJpdiAqcnQyODYgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAogCXJ0Mjg2LT5jb2RlYyA9IGNvZGVjOwotCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT0ZGOwogCiAJaWYgKHJ0Mjg2LT5pMmMtPmlycSkgewogCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQyODYtPnJlZ21hcCwKQEAgLTExOTgsNyArMTIwOCw3IEBACiAJCS5pZGVudCA9ICJEZWxsIERpbm8iLAogCQkubWF0Y2hlcyA9IHsKIAkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiMDE0NFA4IikKKwkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiWFBTIDEzIDkzNDMiKQogCQl9CiAJfSwKIAl7IH0KQEAgLTEyMDksNyArMTIxOSw3IEBACiB7CiAJc3RydWN0IHJ0Mjg2X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmaTJjLT5kZXYpOwogCXN0cnVjdCBydDI4Nl9wcml2ICpydDI4NjsKLQlpbnQgaSwgcmV0OworCWludCBpLCByZXQsIHZhbDsKIAogCXJ0Mjg2ID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwJc2l6ZW9mKCpydDI4NiksCiAJCQkJR0ZQX0tFUk5FTCk7CkBAIC0xMjI0LDExICsxMjM0LDE1IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmVnbWFwX3JlYWQocnQyODYtPnJlZ21hcCwKLQkJUlQyODZfR0VUX1BBUkFNKEFDX05PREVfUk9PVCwgQUNfUEFSX1ZFTkRPUl9JRCksICZyZXQpOwotCWlmIChyZXQgIT0gUlQyODZfVkVORE9SX0lEICYmIHJldCAhPSBSVDI4OF9WRU5ET1JfSUQpIHsKKwlyZXQgPSByZWdtYXBfcmVhZChydDI4Ni0+cmVnbWFwLAorCQlSVDI4Nl9HRVRfUEFSQU0oQUNfTk9ERV9ST09ULCBBQ19QQVJfVkVORE9SX0lEKSwgJnZhbCk7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJmkyYy0+ZGV2LCAiSTJDIGVycm9yICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAodmFsICE9IFJUMjg2X1ZFTkRPUl9JRCAmJiB2YWwgIT0gUlQyODhfVkVORE9SX0lEKSB7CiAJCWRldl9lcnIoJmkyYy0+ZGV2LAotCQkJIkRldmljZSB3aXRoIElEIHJlZ2lzdGVyICV4IGlzIG5vdCBydDI4NlxuIiwgcmV0KTsKKwkJCSJEZXZpY2Ugd2l0aCBJRCByZWdpc3RlciAleCBpcyBub3QgcnQyODZcbiIsIHZhbCk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMTIzNiw2ICsxMjUwLDE0IEBACiAJcnQyODYtPmkyYyA9IGkyYzsKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBydDI4Nik7CiAKKwkvKiByZXN0b3JlIGNvZGVjIGRlZmF1bHQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgSU5ERVhfQ0FDSEVfU0laRTsgaSsrKQorCQlyZWdtYXBfd3JpdGUocnQyODYtPnJlZ21hcCwgcnQyODYtPmluZGV4X2NhY2hlW2ldLnJlZywKKwkJCQlydDI4Ni0+aW5kZXhfY2FjaGVbaV0uZGVmKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShydDI4Nl9yZWcpOyBpKyspCisJCXJlZ21hcF93cml0ZShydDI4Ni0+cmVnbWFwLCBydDI4Nl9yZWdbaV0ucmVnLAorCQkJCXJ0Mjg2X3JlZ1tpXS5kZWYpOworCiAJaWYgKHBkYXRhKQogCQlydDI4Ni0+cGRhdGEgPSAqcGRhdGE7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTYzMS5jCmluZGV4IGM2MTg1MjcuLjJjMTBkNzcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9ydDU2MzEuYwpAQCAtMTY3NSw3ICsxNjc1LDcgQEAKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBydDU2MzFfaTJjX2lkKTsKIAogI2lmZGVmIENPTkZJR19PRgotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcnQ1NjMxX2kyY19kdF9pZHNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJ0NTYzMV9pMmNfZHRfaWRzW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJyZWFsdGVrLHJ0NTYzMSJ9LAogCXsgLmNvbXBhdGlibGUgPSAicmVhbHRlayxhbGM1NjMxIn0sCiAJeyB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY0NS5jIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NDUuYwppbmRleCBjOWE0YzViLi42OTUyOGFlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY0NS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQ1LmMKQEAgLTEyNzAsNiArMTI3MCw4IEBACiAJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NDVfUFdSX0FOTEcxLAogCQkJCVJUNTY0NV9QV1JfSFBfTCB8IFJUNTY0NV9QV1JfSFBfUiB8CiAJCQkJUlQ1NjQ1X1BXUl9IQSwgMCk7CisJCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NDVfREVQT1BfTTIsCisJCQkJUlQ1NjQ1X0RFUE9QX01BU0ssIDApOwogCQl9CiAJfQogfQpAQCAtMTUzOCw4ICsxNTQwLDYgQEAKIAogCVNORF9TT0NfREFQTV9TVVBQTFlfUygiYWRjIHN0ZXJlbzEgZmlsdGVyIiwgMSwgUlQ1NjQ1X1BXUl9ESUcyLAogCQlSVDU2NDVfUFdSX0FEQ19TMUZfQklULCAwLCBOVUxMLCAwKSwKLQlTTkRfU09DX0RBUE1fU1VQUExZX1MoImFkYyBzdGVyZW8yIGZpbHRlciIsIDEsIFJUNTY0NV9QV1JfRElHMiwKLQkJUlQ1NjQ1X1BXUl9BRENfUzJGX0JJVCwgMCwgTlVMTCwgMCksCiAJU05EX1NPQ19EQVBNX01JWEVSX0UoIlN0bzEgQURDIE1JWEwiLCBTTkRfU09DX05PUE0sIDAsIDAsCiAJCXJ0NTY0NV9zdG8xX2FkY19sX21peCwgQVJSQVlfU0laRShydDU2NDVfc3RvMV9hZGNfbF9taXgpLAogCQlOVUxMLCAwKSwKQEAgLTE3MjksNyArMTcyOSw2IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIHJ0NTY0NV9kYXBtX3JvdXRlc1tdID0gewogCXsgImFkYyBzdGVyZW8xIGZpbHRlciIsIE5VTEwsICJBREMgU1RPMSBBU1JDIiwgaXNfdXNpbmdfYXNyYyB9LAotCXsgImFkYyBzdGVyZW8yIGZpbHRlciIsIE5VTEwsICJBREMgU1RPMiBBU1JDIiwgaXNfdXNpbmdfYXNyYyB9LAogCXsgImFkYyBtb25vIGxlZnQgZmlsdGVyIiwgTlVMTCwgIkFEQyBNT05PIEwgQVNSQyIsIGlzX3VzaW5nX2FzcmMgfSwKIAl7ICJhZGMgbW9ubyByaWdodCBmaWx0ZXIiLCBOVUxMLCAiQURDIE1PTk8gUiBBU1JDIiwgaXNfdXNpbmdfYXNyYyB9LAogCXsgImRhYyBtb25vIGxlZnQgZmlsdGVyIiwgTlVMTCwgIkRBQyBNT05PIEwgQVNSQyIsIGlzX3VzaW5nX2FzcmMgfSwKQEAgLTIwNTIsNyArMjA1MSw3IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKIAlzdHJ1Y3QgcnQ1NjQ1X3ByaXYgKnJ0NTY0NSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXVuc2lnbmVkIGludCB2YWxfbGVuID0gMCwgdmFsX2NsaywgbWFza19jbGs7CisJdW5zaWduZWQgaW50IHZhbF9sZW4gPSAwLCB2YWxfY2xrLCBtYXNrX2NsaywgZGxfc2Z0OwogCWludCBwcmVfZGl2LCBiY2xrX21zLCBmcmFtZV9zaXplOwogCiAJcnQ1NjQ1LT5scmNrW2RhaS0+aWRdID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKQEAgLTIwNjYsNiArMjA2NSwxNiBAQAogCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJVbnN1cHBvcnRlZCBmcmFtZSBzaXplOiAlZFxuIiwgZnJhbWVfc2l6ZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KKworCXN3aXRjaCAocnQ1NjQ1LT5jb2RlY190eXBlKSB7CisJY2FzZSBDT0RFQ19UWVBFX1JUNTY1MDoKKwkJZGxfc2Z0ID0gNDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGxfc2Z0ID0gMjsKKwkJYnJlYWs7CisJfQorCiAJYmNsa19tcyA9IGZyYW1lX3NpemUgPiAzMjsKIAlydDU2NDUtPmJjbGtbZGFpLT5pZF0gPSBydDU2NDUtPmxyY2tbZGFpLT5pZF0gKiAoMzIgPDwgYmNsa19tcyk7CiAKQEAgLTIwNzgsMTMgKzIwODcsMTMgQEAKIAljYXNlIDE2OgogCQlicmVhazsKIAljYXNlIDIwOgotCQl2YWxfbGVuIHw9IFJUNTY0NV9JMlNfRExfMjA7CisJCXZhbF9sZW4gPSAweDE7CiAJCWJyZWFrOwogCWNhc2UgMjQ6Ci0JCXZhbF9sZW4gfD0gUlQ1NjQ1X0kyU19ETF8yNDsKKwkJdmFsX2xlbiA9IDB4MjsKIAkJYnJlYWs7CiAJY2FzZSA4OgotCQl2YWxfbGVuIHw9IFJUNTY0NV9JMlNfRExfODsKKwkJdmFsX2xlbiA9IDB4MzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0yMDk2LDcgKzIxMDUsNyBAQAogCQl2YWxfY2xrID0gYmNsa19tcyA8PCBSVDU2NDVfSTJTX0JDTEtfTVMxX1NGVCB8CiAJCQlwcmVfZGl2IDw8IFJUNTY0NV9JMlNfUEQxX1NGVDsKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjQ1X0kyUzFfU0RQLAotCQkJUlQ1NjQ1X0kyU19ETF9NQVNLLCB2YWxfbGVuKTsKKwkJCSgweDMgPDwgZGxfc2Z0KSwgKHZhbF9sZW4gPDwgZGxfc2Z0KSk7CiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY0NV9BRERBX0NMSzEsIG1hc2tfY2xrLCB2YWxfY2xrKTsKIAkJYnJlYWs7CiAJY2FzZSAgUlQ1NjQ1X0FJRjI6CkBAIC0yMTA0LDcgKzIxMTMsNyBAQAogCQl2YWxfY2xrID0gYmNsa19tcyA8PCBSVDU2NDVfSTJTX0JDTEtfTVMyX1NGVCB8CiAJCQlwcmVfZGl2IDw8IFJUNTY0NV9JMlNfUEQyX1NGVDsKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjQ1X0kyUzJfU0RQLAotCQkJUlQ1NjQ1X0kyU19ETF9NQVNLLCB2YWxfbGVuKTsKKwkJCSgweDMgPDwgZGxfc2Z0KSwgKHZhbF9sZW4gPDwgZGxfc2Z0KSk7CiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY0NV9BRERBX0NMSzEsIG1hc2tfY2xrLCB2YWxfY2xrKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTIxMTksNyArMjEyOCwxNiBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7CiAJc3RydWN0IHJ0NTY0NV9wcml2ICpydDU2NDUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKLQl1bnNpZ25lZCBpbnQgcmVnX3ZhbCA9IDA7CisJdW5zaWduZWQgaW50IHJlZ192YWwgPSAwLCBwb2xfc2Z0OworCisJc3dpdGNoIChydDU2NDUtPmNvZGVjX3R5cGUpIHsKKwljYXNlIENPREVDX1RZUEVfUlQ1NjUwOgorCQlwb2xfc2Z0ID0gODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcG9sX3NmdCA9IDc7CisJCWJyZWFrOworCX0KIAogCXN3aXRjaCAoZm10ICYgU05EX1NPQ19EQUlGTVRfTUFTVEVSX01BU0spIHsKIAljYXNlIFNORF9TT0NfREFJRk1UX0NCTV9DRk06CkBAIC0yMTM3LDcgKzIxNTUsNyBAQAogCWNhc2UgU05EX1NPQ19EQUlGTVRfTkJfTkY6CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19EQUlGTVRfSUJfTkY6Ci0JCXJlZ192YWwgfD0gUlQ1NjQ1X0kyU19CUF9JTlY7CisJCXJlZ192YWwgfD0gKDEgPDwgcG9sX3NmdCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjE2MSwxMiArMjE3OSwxMiBAQAogCXN3aXRjaCAoZGFpLT5pZCkgewogCWNhc2UgUlQ1NjQ1X0FJRjE6CiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY0NV9JMlMxX1NEUCwKLQkJCVJUNTY0NV9JMlNfTVNfTUFTSyB8IFJUNTY0NV9JMlNfQlBfTUFTSyB8CisJCQlSVDU2NDVfSTJTX01TX01BU0sgfCAoMSA8PCBwb2xfc2Z0KSB8CiAJCQlSVDU2NDVfSTJTX0RGX01BU0ssIHJlZ192YWwpOwogCQlicmVhazsKIAljYXNlIFJUNTY0NV9BSUYyOgogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NDVfSTJTMl9TRFAsCi0JCQlSVDU2NDVfSTJTX01TX01BU0sgfCBSVDU2NDVfSTJTX0JQX01BU0sgfAorCQkJUlQ1NjQ1X0kyU19NU19NQVNLIHwgKDEgPDwgcG9sX3NmdCkgfAogCQkJUlQ1NjQ1X0kyU19ERl9NQVNLLCByZWdfdmFsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTIyODUsMjMgKzIzMDMsNDIgQEAKIAkJCXVuc2lnbmVkIGludCByeF9tYXNrLCBpbnQgc2xvdHMsIGludCBzbG90X3dpZHRoKQogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGRhaS0+Y29kZWM7Ci0JdW5zaWduZWQgaW50IHZhbCA9IDA7CisJc3RydWN0IHJ0NTY0NV9wcml2ICpydDU2NDUgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwl1bnNpZ25lZCBpbnQgaV9zbG90X3NmdCwgb19zbG90X3NmdCwgaV93aWR0aF9zaHQsIG9fd2lkdGhfc2h0LCBlbl9zZnQ7CisJdW5zaWduZWQgaW50IG1hc2ssIHZhbCA9IDA7CiAKKwlzd2l0Y2ggKHJ0NTY0NS0+Y29kZWNfdHlwZSkgeworCWNhc2UgQ09ERUNfVFlQRV9SVDU2NTA6CisJCWVuX3NmdCA9IDE1OworCQlpX3Nsb3Rfc2Z0ID0gMTA7CisJCW9fc2xvdF9zZnQgPSA4OworCQlpX3dpZHRoX3NodCA9IDY7CisJCW9fd2lkdGhfc2h0ID0gNDsKKwkJbWFzayA9IDB4OGZmMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZW5fc2Z0ID0gMTQ7CisJCWlfc2xvdF9zZnQgPSBvX3Nsb3Rfc2Z0ID0gMTI7CisJCWlfd2lkdGhfc2h0ID0gb193aWR0aF9zaHQgPSAxMDsKKwkJbWFzayA9IDB4N2MwMDsKKwkJYnJlYWs7CisJfQogCWlmIChyeF9tYXNrIHx8IHR4X21hc2spIHsKLQkJdmFsIHw9ICgxIDw8IDE0KTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjQ1X0JBU1NfQkFDSywKLQkJCVJUNTY0NV9HX0JCX0JTVF9NQVNLLCBSVDU2NDVfR19CQl9CU1RfMjVEQik7CisJCXZhbCB8PSAoMSA8PCBlbl9zZnQpOworCQlpZiAocnQ1NjQ1LT5jb2RlY190eXBlID09IENPREVDX1RZUEVfUlQ1NjQ1KQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjQ1X0JBU1NfQkFDSywKKwkJCQlSVDU2NDVfR19CQl9CU1RfTUFTSywgUlQ1NjQ1X0dfQkJfQlNUXzI1REIpOwogCX0KIAogCXN3aXRjaCAoc2xvdHMpIHsKIAljYXNlIDQ6Ci0JCXZhbCB8PSAoMSA8PCAxMik7CisJCXZhbCB8PSAoMSA8PCBpX3Nsb3Rfc2Z0KSB8ICgxIDw8IG9fc2xvdF9zZnQpOwogCQlicmVhazsKIAljYXNlIDY6Ci0JCXZhbCB8PSAoMiA8PCAxMik7CisJCXZhbCB8PSAoMiA8PCBpX3Nsb3Rfc2Z0KSB8ICgyIDw8IG9fc2xvdF9zZnQpOwogCQlicmVhazsKIAljYXNlIDg6Ci0JCXZhbCB8PSAoMyA8PCAxMik7CisJCXZhbCB8PSAoMyA8PCBpX3Nsb3Rfc2Z0KSB8ICgzIDw8IG9fc2xvdF9zZnQpOwogCQlicmVhazsKIAljYXNlIDI6CiAJZGVmYXVsdDoKQEAgLTIzMTAsMjAgKzIzNDcsMjAgQEAKIAogCXN3aXRjaCAoc2xvdF93aWR0aCkgewogCWNhc2UgMjA6Ci0JCXZhbCB8PSAoMSA8PCAxMCk7CisJCXZhbCB8PSAoMSA8PCBpX3dpZHRoX3NodCkgfCAoMSA8PCBvX3dpZHRoX3NodCk7CiAJCWJyZWFrOwogCWNhc2UgMjQ6Ci0JCXZhbCB8PSAoMiA8PCAxMCk7CisJCXZhbCB8PSAoMiA8PCBpX3dpZHRoX3NodCkgfCAoMiA8PCBvX3dpZHRoX3NodCk7CiAJCWJyZWFrOwogCWNhc2UgMzI6Ci0JCXZhbCB8PSAoMyA8PCAxMCk7CisJCXZhbCB8PSAoMyA8PCBpX3dpZHRoX3NodCkgfCAoMyA8PCBvX3dpZHRoX3NodCk7CiAJCWJyZWFrOwogCWNhc2UgMTY6CiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQogCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjQ1X1RETV9DVFJMXzEsIDB4N2MwMCwgdmFsKTsKKwlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NDVfVERNX0NUUkxfMSwgbWFzaywgdmFsKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjM2MSw3ICsyMzk4LDggQEAKIAogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKIAkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjQ1X0RFUE9QX00yLCAweDExMDApOwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NDVfR0VOX0NUUkwxLCAweDAxMjgpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NDVfR0VOX0NUUkwxLAorCQkJCVJUNTY0NV9ESUdfR0FURV9DVFJMLCAwKTsKIAkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjQ1X1BXUl9BTkxHMSwKIAkJCQlSVDU2NDVfUFdSX1ZSRUYxIHwgUlQ1NjQ1X1BXUl9NQiB8CiAJCQkJUlQ1NjQ1X1BXUl9CRyB8IFJUNTY0NV9QV1JfVlJFRjIgfApAQCAtMjU5OCw3ICsyNjM2LDcgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyBydDU2NDVfcmVnbWFwID0gewogCS5yZWdfYml0cyA9IDgsCiAJLnZhbF9iaXRzID0gMTYsCi0KKwkudXNlX3NpbmdsZV9ydyA9IHRydWUsCiAJLm1heF9yZWdpc3RlciA9IFJUNTY0NV9WRU5ET1JfSUQyICsgMSArIChBUlJBWV9TSVpFKHJ0NTY0NV9yYW5nZXMpICoKIAkJCQkJICAgICAgIFJUNTY0NV9QUl9TUEFDSU5HKSwKIAkudm9sYXRpbGVfcmVnID0gcnQ1NjQ1X3ZvbGF0aWxlX3JlZ2lzdGVyLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDUuaCBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjQ1LmgKaW5kZXggZGJmZDk4Yy4uZGI3OGU5NCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NDUuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY0NS5oCkBAIC04MDQsOCArODA0LDYgQEAKICNkZWZpbmUgUlQ1NjQ1X1BXUl9EQUNfTUZfTF9CSVQJCQkxMAogI2RlZmluZSBSVDU2NDVfUFdSX0RBQ19NRl9SCQkJKDB4MSA8PCA5KQogI2RlZmluZSBSVDU2NDVfUFdSX0RBQ19NRl9SX0JJVAkJCTkKLSNkZWZpbmUgUlQ1NjQ1X1BXUl9BRENfUzJGCQkJKDB4MSA8PCA4KQotI2RlZmluZSBSVDU2NDVfUFdSX0FEQ19TMkZfQklUCQkJOAogI2RlZmluZSBSVDU2NDVfUFdSX1BETTEJCQkJKDB4MSA8PCA3KQogI2RlZmluZSBSVDU2NDVfUFdSX1BETTFfQklUCQkJNwogI2RlZmluZSBSVDU2NDVfUFdSX1BETTIJCQkJKDB4MSA8PCA2KQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NzAuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjcwLmMKaW5kZXggZmQxMDI2MS4uY2M3Zjg0YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NzAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY3MC5jCkBAIC00MDMsNiArNDAzLDE4OSBAQAogCX0KIH0KIAorLyoqCisgKiBydDU2NzBfaGVhZHNldF9kZXRlY3QgLSBEZXRlY3QgaGVhZHNldC4KKyAqIEBjb2RlYzogU29DIGF1ZGlvIGNvZGVjIGRldmljZS4KKyAqIEBqYWNrX2luc2VydDogSmFjayBpbnNlcnQgb3Igbm90LgorICoKKyAqIERldGVjdCB3aGV0aGVyIGlzIGhlYWRzZXQgb3Igbm90IHdoZW4gamFjayBpbnNlcnRlZC4KKyAqCisgKiBSZXR1cm5zIGRldGVjdCBzdGF0dXMuCisgKi8KKworc3RhdGljIGludCBydDU2NzBfaGVhZHNldF9kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBpbnQgamFja19pbnNlcnQpCit7CisJaW50IHZhbDsKKwlzdHJ1Y3QgcnQ1NjcwX3ByaXYgKnJ0NTY3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCisJaWYgKGphY2tfaW5zZXJ0KSB7CisJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwKKwkJCQkJCSAgICAgICAiTWljIERldCBQb3dlciIpOworCQlzbmRfc29jX2RhcG1fc3luYygmY29kZWMtPmRhcG0pOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NzBfR0VOX0NUUkwzLCAweDQsIDB4MCk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY3MF9DSl9DVFJMMiwKKwkJCVJUNTY3MF9DQkpfREVUX01PREUgfCBSVDU2NzBfQ0JKX01OX0pELAorCQkJUlQ1NjcwX0NCSl9NTl9KRCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY3MF9HUElPX0NUUkwyLCAweDAwMDQpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NzBfR1BJT19DVFJMMSwKKwkJCVJUNTY3MF9HUDFfUElOX01BU0ssIFJUNTY3MF9HUDFfUElOX0lSUSk7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY3MF9DSl9DVFJMMSwKKwkJCVJUNTY3MF9DQkpfQlNUMV9FTiwgUlQ1NjcwX0NCSl9CU1QxX0VOKTsKKwkJc25kX3NvY193cml0ZShjb2RlYywgUlQ1NjcwX0pEX0NUUkwzLCAweDAwZjApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NzBfQ0pfQ1RSTDIsCisJCQlSVDU2NzBfQ0JKX01OX0pELCBSVDU2NzBfQ0JKX01OX0pEKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjcwX0NKX0NUUkwyLAorCQkJUlQ1NjcwX0NCSl9NTl9KRCwgMCk7CisJCW1zbGVlcCgzMDApOworCQl2YWwgPSBzbmRfc29jX3JlYWQoY29kZWMsIFJUNTY3MF9DSl9DVFJMMykgJiAweDc7CisJCWlmICh2YWwgPT0gMHgxIHx8IHZhbCA9PSAweDIpIHsKKwkJCXJ0NTY3MC0+amFja190eXBlID0gU05EX0pBQ0tfSEVBRFNFVDsKKwkJCS8qIGZvciBwdXNoIGJ1dHRvbiAqLworCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjcwX0lOVF9JUlFfU1QsIDB4OCwgMHg4KTsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY3MF9JTF9DTUQsIDB4NDAsIDB4NDApOworCQkJc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NzBfSUxfQ01EKTsKKwkJfSBlbHNlIHsKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFJUNTY3MF9HRU5fQ1RSTDMsIDB4NCwgMHg0KTsKKwkJCXJ0NTY3MC0+amFja190eXBlID0gU05EX0pBQ0tfSEVBRFBIT05FOworCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIk1pYyBEZXQgUG93ZXIiKTsKKwkJCXNuZF9zb2NfZGFwbV9zeW5jKCZjb2RlYy0+ZGFwbSk7CisJCX0KKwl9IGVsc2UgeworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NzBfSU5UX0lSUV9TVCwgMHg4LCAweDApOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBSVDU2NzBfR0VOX0NUUkwzLCAweDQsIDB4NCk7CisJCXJ0NTY3MC0+amFja190eXBlID0gMDsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIk1pYyBEZXQgUG93ZXIiKTsKKwkJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKKwl9CisKKwlyZXR1cm4gcnQ1NjcwLT5qYWNrX3R5cGU7Cit9CisKK3ZvaWQgcnQ1NjcwX2phY2tfc3VzcGVuZChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHJ0NTY3MF9wcml2ICpydDU2NzAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXJ0NTY3MC0+amFja190eXBlX3NhdmVkID0gcnQ1NjcwLT5qYWNrX3R5cGU7CisJcnQ1NjcwX2hlYWRzZXRfZGV0ZWN0KGNvZGVjLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0NTY3MF9qYWNrX3N1c3BlbmQpOworCit2b2lkIHJ0NTY3MF9qYWNrX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHJ0NTY3MF9wcml2ICpydDU2NzAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCWlmIChydDU2NzAtPmphY2tfdHlwZV9zYXZlZCkKKwkJcnQ1NjcwX2hlYWRzZXRfZGV0ZWN0KGNvZGVjLCAxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0NTY3MF9qYWNrX3Jlc3VtZSk7CisKK3N0YXRpYyBpbnQgcnQ1NjcwX2J1dHRvbl9kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQoreworCWludCBidG5fdHlwZSwgdmFsOworCisJdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NzBfSUxfQ01EKTsKKwlidG5fdHlwZSA9IHZhbCAmIDB4ZmY4MDsKKwlzbmRfc29jX3dyaXRlKGNvZGVjLCBSVDU2NzBfSUxfQ01ELCB2YWwpOworCWlmIChidG5fdHlwZSAhPSAwKSB7CisJCW1zbGVlcCgyMCk7CisJCXZhbCA9IHNuZF9zb2NfcmVhZChjb2RlYywgUlQ1NjcwX0lMX0NNRCk7CisJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFJUNTY3MF9JTF9DTUQsIHZhbCk7CisJfQorCisJcmV0dXJuIGJ0bl90eXBlOworfQorCitzdGF0aWMgaW50IHJ0NTY3MF9pcnFfZGV0ZWN0aW9uKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJ0NTY3MF9wcml2ICpydDU2NzAgPSAoc3RydWN0IHJ0NTY3MF9wcml2ICopZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19qYWNrX2dwaW8gKmdwaW8gPSAmcnQ1NjcwLT5ocF9ncGlvOworCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2sgPSBydDU2NzAtPmphY2s7CisJaW50IHZhbCwgYnRuX3R5cGUsIHJlcG9ydCA9IGphY2stPnN0YXR1czsKKworCWlmIChydDU2NzAtPnBkYXRhLmpkX21vZGUgPT0gMSkgLyogMiBwb3J0ICovCisJCXZhbCA9IHNuZF9zb2NfcmVhZChydDU2NzAtPmNvZGVjLCBSVDU2NzBfQV9KRF9DVFJMMSkgJiAweDAwNzA7CisJZWxzZQorCQl2YWwgPSBzbmRfc29jX3JlYWQocnQ1NjcwLT5jb2RlYywgUlQ1NjcwX0FfSkRfQ1RSTDEpICYgMHgwMDIwOworCisJc3dpdGNoICh2YWwpIHsKKwkvKiBqYWNrIGluICovCisJY2FzZSAweDMwOiAvKiAyIHBvcnQgKi8KKwljYXNlIDB4MDogLyogMSBwb3J0IG9yIDIgcG9ydCAqLworCQlpZiAocnQ1NjcwLT5qYWNrX3R5cGUgPT0gMCkgeworCQkJcmVwb3J0ID0gcnQ1NjcwX2hlYWRzZXRfZGV0ZWN0KHJ0NTY3MC0+Y29kZWMsIDEpOworCQkJLyogZm9yIHB1c2ggYnV0dG9uIGFuZCBqYWNrIG91dCAqLworCQkJZ3Bpby0+ZGVib3VuY2VfdGltZSA9IDI1OworCQkJYnJlYWs7CisJCX0KKwkJYnRuX3R5cGUgPSAwOworCQlpZiAoc25kX3NvY19yZWFkKHJ0NTY3MC0+Y29kZWMsIFJUNTY3MF9JTlRfSVJRX1NUKSAmIDB4NCkgeworCQkJLyogYnV0dG9uIHByZXNzZWQgKi8KKwkJCXJlcG9ydCA9IFNORF9KQUNLX0hFQURTRVQ7CisJCQlidG5fdHlwZSA9IHJ0NTY3MF9idXR0b25fZGV0ZWN0KHJ0NTY3MC0+Y29kZWMpOworCQkJc3dpdGNoIChidG5fdHlwZSkgeworCQkJY2FzZSAweDIwMDA6IC8qIHVwICovCisJCQkJcmVwb3J0IHw9IFNORF9KQUNLX0JUTl8xOworCQkJCWJyZWFrOworCQkJY2FzZSAweDA0MDA6IC8qIGNlbnRlciAqLworCQkJCXJlcG9ydCB8PSBTTkRfSkFDS19CVE5fMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgwMDgwOiAvKiBkb3duICovCisJCQkJcmVwb3J0IHw9IFNORF9KQUNLX0JUTl8yOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlkZXZfZXJyKHJ0NTY3MC0+Y29kZWMtPmRldiwKKwkJCQkJIlVuZXhwZWN0ZWQgYnV0dG9uIGNvZGUgMHglMDR4XG4iLAorCQkJCQlidG5fdHlwZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKGJ0bl90eXBlID09IDApLyogYnV0dG9uIHJlbGVhc2UgKi8KKwkJCXJlcG9ydCA9ICBydDU2NzAtPmphY2tfdHlwZTsKKworCQlicmVhazsKKwkvKiBqYWNrIG91dCAqLworCWNhc2UgMHg3MDogLyogMiBwb3J0ICovCisJY2FzZSAweDEwOiAvKiAyIHBvcnQgKi8KKwljYXNlIDB4MjA6IC8qIDEgcG9ydCAqLworCQlyZXBvcnQgPSAwOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKHJ0NTY3MC0+Y29kZWMsIFJUNTY3MF9JTlRfSVJRX1NULCAweDEsIDB4MCk7CisJCXJ0NTY3MF9oZWFkc2V0X2RldGVjdChydDU2NzAtPmNvZGVjLCAwKTsKKwkJZ3Bpby0+ZGVib3VuY2VfdGltZSA9IDE1MDsgLyogZm9yIGphY2sgaW4gKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJlcG9ydDsKK30KKworaW50IHJ0NTY3MF9zZXRfamFja19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2spCit7CisJc3RydWN0IHJ0NTY3MF9wcml2ICpydDU2NzAgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKwlpbnQgcmV0OworCisJcnQ1NjcwLT5qYWNrID0gamFjazsKKwlydDU2NzAtPmhwX2dwaW8uZ3Bpb2RfZGV2ID0gY29kZWMtPmRldjsKKwlydDU2NzAtPmhwX2dwaW8ubmFtZSA9ICJoZWFkcGhvbmUgZGV0ZWN0IjsKKwlydDU2NzAtPmhwX2dwaW8ucmVwb3J0ID0gU05EX0pBQ0tfSEVBRFNFVCB8CisJCVNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEgfCBTTkRfSkFDS19CVE5fMjsKKwlydDU2NzAtPmhwX2dwaW8uZGVib3VuY2VfdGltZSA9IDE1MDsKKwlydDU2NzAtPmhwX2dwaW8ud2FrZSA9IHRydWU7CisJcnQ1NjcwLT5ocF9ncGlvLmRhdGEgPSAoc3RydWN0IHJ0NTY3MF9wcml2ICopcnQ1NjcwOworCXJ0NTY3MC0+aHBfZ3Bpby5qYWNrX3N0YXR1c19jaGVjayA9IHJ0NTY3MF9pcnFfZGV0ZWN0aW9uOworCisJcmV0ID0gc25kX3NvY19qYWNrX2FkZF9ncGlvcyhydDU2NzAtPmphY2ssIDEsCisJCQkmcnQ1NjcwLT5ocF9ncGlvKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY29kZWMtPmRldiwgIkFkZGluZyBqYWNrIEdQSU8gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0NTY3MF9zZXRfamFja19kZXRlY3QpOworCiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUob3V0X3ZvbF90bHYsIC00NjUwLCAxNTAsIDApOwogc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGRhY192b2xfdGx2LCAtNjU2MjUsIDM3NSwgMCk7CiBzdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaW5fdm9sX3RsdiwgLTM0NTAsIDE1MCwgMCk7CkBAIC01MTcsMTEgKzcwMCw5IEBACiAJCQkgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKHNvdXJjZS0+ZGFwbSk7Ci0JdW5zaWduZWQgaW50IHZhbDsKKwlzdHJ1Y3QgcnQ1NjcwX3ByaXYgKnJ0NTY3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCBSVDU2NzBfR0xCX0NMSyk7Ci0JdmFsICY9IFJUNTY3MF9TQ0xLX1NSQ19NQVNLOwotCWlmICh2YWwgPT0gUlQ1NjcwX1NDTEtfU1JDX1BMTDEpCisJaWYgKHJ0NTY3MC0+c3lzY2xrX3NyYyA9PSBSVDU2NzBfU0NMS19TX1BMTDEpCiAJCXJldHVybiAxOwogCWVsc2UKIAkJcmV0dXJuIDA7CkBAIC0yMjcxLDE2ICsyNDUyLDYgQEAKIAlzdHJ1Y3QgcnQ1NjcwX3ByaXYgKnJ0NTY3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXVuc2lnbmVkIGludCByZWdfdmFsID0gMDsKIAotCWlmIChmcmVxID09IHJ0NTY3MC0+c3lzY2xrICYmIGNsa19pZCA9PSBydDU2NzAtPnN5c2Nsa19zcmMpCi0JCXJldHVybiAwOwotCi0JaWYgKHJ0NTY3MC0+cGRhdGEuamRfbW9kZSkgewotCQlpZiAoY2xrX2lkID09IFJUNTY3MF9TQ0xLX1NfUExMMSkKLQkJCXNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlBMTDEiKTsKLQkJZWxzZQotCQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlBMTDEiKTsKLQkJc25kX3NvY19kYXBtX3N5bmMoJmNvZGVjLT5kYXBtKTsKLQl9CiAJc3dpdGNoIChjbGtfaWQpIHsKIAljYXNlIFJUNTY3MF9TQ0xLX1NfTUNMSzoKIAkJcmVnX3ZhbCB8PSBSVDU2NzBfU0NMS19TUkNfTUNMSzsKQEAgLTIyOTgsNyArMjQ2OSw4IEBACiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgUlQ1NjcwX0dMQl9DTEssCiAJCVJUNTY3MF9TQ0xLX1NSQ19NQVNLLCByZWdfdmFsKTsKIAlydDU2NzAtPnN5c2NsayA9IGZyZXE7Ci0JcnQ1NjcwLT5zeXNjbGtfc3JjID0gY2xrX2lkOworCWlmIChjbGtfaWQgIT0gUlQ1NjcwX1NDTEtfU19SQ0NMSykKKwkJcnQ1NjcwLT5zeXNjbGtfc3JjID0gY2xrX2lkOwogCiAJZGV2X2RiZyhkYWktPmRldiwgIlN5c2NsayBpcyAlZEh6IGFuZCBjbG9jayBpZCBpcyAlZFxuIiwgZnJlcSwgY2xrX2lkKTsKIApAQCAtMjUxNyw2ICsyNjg5LDcgQEAKIAlzdHJ1Y3QgcnQ1NjcwX3ByaXYgKnJ0NTY3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCiAJcmVnbWFwX3dyaXRlKHJ0NTY3MC0+cmVnbWFwLCBSVDU2NzBfUkVTRVQsIDApOworCXNuZF9zb2NfamFja19mcmVlX2dwaW9zKHJ0NTY3MC0+amFjaywgMSwgJnJ0NTY3MC0+aHBfZ3Bpbyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2NzYsNiArMjg0OSw3IEBACiAJaWYgKGRtaV9jaGVja19zeXN0ZW0oZG1pX3BsYXRmb3JtX2ludGVsX2JyYXN3ZWxsKSkgewogCQlydDU2NzAtPnBkYXRhLmRtaWNfZW4gPSB0cnVlOwogCQlydDU2NzAtPnBkYXRhLmRtaWMxX2RhdGFfcGluID0gUlQ1NjcwX0RNSUNfREFUQV9JTjJQOworCQlydDU2NzAtPnBkYXRhLmRldl9ncGlvID0gdHJ1ZTsKIAkJcnQ1NjcwLT5wZGF0YS5qZF9tb2RlID0gMTsKIAl9CiAKQEAgLTI3MTcsMTIgKzI4OTEsMTcgQEAKIAkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY3MC0+cmVnbWFwLCBSVDU2NzBfSU4yLAogCQkJCQlSVDU2NzBfSU5fREYyLCBSVDU2NzBfSU5fREYyKTsKIAotCWlmIChpMmMtPmlycSkgeworCWlmIChydDU2NzAtPnBkYXRhLmRldl9ncGlvKSB7CisJCS8qIGZvciBwdXNoIGJ1dHRvbiAqLworCQlyZWdtYXBfd3JpdGUocnQ1NjcwLT5yZWdtYXAsIFJUNTY3MF9JTF9DTUQsIDB4MDAwMCk7CisJCXJlZ21hcF93cml0ZShydDU2NzAtPnJlZ21hcCwgUlQ1NjcwX0lMX0NNRDIsIDB4MDAxMCk7CisJCXJlZ21hcF93cml0ZShydDU2NzAtPnJlZ21hcCwgUlQ1NjcwX0lMX0NNRDMsIDB4MDAxNCk7CisJCS8qIGZvciBpcnEgKi8KIAkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY3MC0+cmVnbWFwLCBSVDU2NzBfR1BJT19DVFJMMSwKIAkJCQkgICBSVDU2NzBfR1AxX1BJTl9NQVNLLCBSVDU2NzBfR1AxX1BJTl9JUlEpOwogCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1NjcwLT5yZWdtYXAsIFJUNTY3MF9HUElPX0NUUkwyLAogCQkJCSAgIFJUNTY3MF9HUDFfUEZfTUFTSywgUlQ1NjcwX0dQMV9QRl9PVVQpOwotCisJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NzAtPnJlZ21hcCwgUlQ1NjcwX0RJR19NSVNDLCAweDgsIDB4OCk7CiAJfQogCiAJaWYgKHJ0NTY3MC0+cGRhdGEuamRfbW9kZSkgewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NzAuaCBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1NjcwLmgKaW5kZXggMjFmOGUxOC4uZGMyYjQ2MiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NzAuaAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY3MC5oCkBAIC0xOTUwLDE3ICsxOTUwLDIwIEBACiB9OwogCiBlbnVtIHsKKwlSVDU2NzBfRE1JQzFfRElTQUJMRUQsCiAJUlQ1NjcwX0RNSUNfREFUQV9HUElPNiwKIAlSVDU2NzBfRE1JQ19EQVRBX0lOMlAsCiAJUlQ1NjcwX0RNSUNfREFUQV9HUElPNywKIH07CiAKIGVudW0geworCVJUNTY3MF9ETUlDMl9ESVNBQkxFRCwKIAlSVDU2NzBfRE1JQ19EQVRBX0dQSU84LAogCVJUNTY3MF9ETUlDX0RBVEFfSU4zTiwKIH07CiAKIGVudW0geworCVJUNTY3MF9ETUlDM19ESVNBQkxFRCwKIAlSVDU2NzBfRE1JQ19EQVRBX0dQSU85LAogCVJUNTY3MF9ETUlDX0RBVEFfR1BJTzEwLAogCVJUNTY3MF9ETUlDX0RBVEFfR1BJTzUsCkBAIC0xOTg1LDYgKzE5ODgsOCBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAlzdHJ1Y3QgcnQ1NjcwX3BsYXRmb3JtX2RhdGEgcGRhdGE7CiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2s7CisJc3RydWN0IHNuZF9zb2NfamFja19ncGlvIGhwX2dwaW87CiAKIAlpbnQgc3lzY2xrOwogCWludCBzeXNjbGtfc3JjOwpAQCAtMTk5OSw2ICsyMDA0LDExIEBACiAJaW50IGRzcF9zdzsgLyogZXhwZWN0ZWQgcGFyYW1ldGVyIHNldHRpbmcgKi8KIAlpbnQgZHNwX3JhdGU7CiAJaW50IGphY2tfdHlwZTsKKwlpbnQgamFja190eXBlX3NhdmVkOwogfTsKIAordm9pZCBydDU2NzBfamFja19zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyk7Cit2b2lkIHJ0NTY3MF9qYWNrX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpOworaW50IHJ0NTY3MF9zZXRfamFja19kZXRlY3Qoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAorCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2spOwogI2VuZGlmIC8qIF9fUlQ1NjcwX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy9ydDU2NzcuYyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1Njc3LmMKaW5kZXggZmI5YzIwZS4uYWYxODI1OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9ydDU2NzcuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3J0NTY3Ny5jCkBAIC03MTgsMTEgKzcxOCwyNCBAQAogCQkJUlQ1Njc3X0xETzFfU0VMX01BU0ssIDB4MCk7CiAJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NzctPnJlZ21hcCwgUlQ1Njc3X1BXUl9BTkxHMiwKIAkJCVJUNTY3N19QV1JfTERPMSwgUlQ1Njc3X1BXUl9MRE8xKTsKLQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY3Ny0+cmVnbWFwLCBSVDU2NzdfR0xCX0NMSzEsCi0JCQlSVDU2NzdfTUNMS19TUkNfTUFTSywgUlQ1Njc3X01DTEsyX1NSQyk7Ci0JCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NzctPnJlZ21hcCwgUlQ1Njc3X0dMQl9DTEsyLAotCQkJUlQ1Njc3X1BMTDJfUFJfU1JDX01BU0sgfCBSVDU2NzdfRFNQX0NMS19TUkNfTUFTSywKLQkJCVJUNTY3N19QTEwyX1BSX1NSQ19NQ0xLMiB8IFJUNTY3N19EU1BfQ0xLX1NSQ19CWVBBU1MpOworCQlzd2l0Y2ggKHJ0NTY3Ny0+dHlwZSkgeworCQljYXNlIFJUNTY3NzoKKwkJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NzctPnJlZ21hcCwgUlQ1Njc3X0dMQl9DTEsxLAorCQkJCVJUNTY3N19NQ0xLX1NSQ19NQVNLLCBSVDU2NzdfTUNMSzJfU1JDKTsKKwkJCXJlZ21hcF91cGRhdGVfYml0cyhydDU2NzctPnJlZ21hcCwgUlQ1Njc3X0dMQl9DTEsyLAorCQkJCVJUNTY3N19QTEwyX1BSX1NSQ19NQVNLIHwKKwkJCQlSVDU2NzdfRFNQX0NMS19TUkNfTUFTSywKKwkJCQlSVDU2NzdfUExMMl9QUl9TUkNfTUNMSzIgfAorCQkJCVJUNTY3N19EU1BfQ0xLX1NSQ19CWVBBU1MpOworCQkJYnJlYWs7CisJCWNhc2UgUlQ1Njc2OgorCQkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY3Ny0+cmVnbWFwLCBSVDU2NzdfR0xCX0NMSzIsCisJCQkJUlQ1Njc3X0RTUF9DTEtfU1JDX01BU0ssCisJCQkJUlQ1Njc3X0RTUF9DTEtfU1JDX0JZUEFTUyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CiAJCXJlZ21hcF93cml0ZShydDU2NzctPnJlZ21hcCwgUlQ1Njc3X1BXUl9EU1AyLCAweDA3ZmYpOwogCQlyZWdtYXBfd3JpdGUocnQ1Njc3LT5yZWdtYXAsIFJUNTY3N19QV1JfRFNQMSwgMHgwN2ZkKTsKIAkJcnQ1Njc3X3NldF9kc3BfbW9kZShjb2RlYywgdHJ1ZSk7CkBAIC0xMDIxLDYgKzEwMzQsMTY5IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogcnQ1Njc3X3NlbF9hc3JjX2Nsa19zcmMgLSBzZWxlY3QgQVNSQyBjbG9jayBzb3VyY2UgZm9yIGEgc2V0IG9mIGZpbHRlcnMKKyAqIEBjb2RlYzogU29DIGF1ZGlvIGNvZGVjIGRldmljZS4KKyAqIEBmaWx0ZXJfbWFzazogbWFzayBvZiBmaWx0ZXJzLgorICogQGNsa19zcmM6IGNsb2NrIHNvdXJjZQorICoKKyAqIFRoZSBBU1JDIGZ1bmN0aW9uIGlzIGZvciBhc3luY2hyb25vdXMgTUNMSyBhbmQgTFJDSy4gQWxzbywgc2luY2UgUlQ1Njc3IGNhbgorICogb25seSBzdXBwb3J0IHN0YW5kYXJkIDMyZnMgb3IgNjRmcyBpMnMgZm9ybWF0LCBBU1JDIHNob3VsZCBiZSBlbmFibGVkIHRvCisgKiBzdXBwb3J0IHNwZWNpYWwgaTJzIGNsb2NrIGZvcm1hdCBzdWNoIGFzIEludGVsJ3MgMTAwZnMoMTAwICogc2FtcGxpbmcgcmF0ZSkuCisgKiBBU1JDIGZ1bmN0aW9uIHdpbGwgdHJhY2sgaTJzIGNsb2NrIGFuZCBnZW5lcmF0ZSBhIGNvcnJlc3BvbmRpbmcgc3lzdGVtIGNsb2NrCisgKiBmb3IgY29kZWMuIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYW4gQVBJIHRvIHNlbGVjdCB0aGUgY2xvY2sgc291cmNlIGZvciBhCisgKiBzZXQgb2YgZmlsdGVycyBzcGVjaWZpZWQgYnkgdGhlIG1hc2suIEFuZCB0aGUgY29kZWMgZHJpdmVyIHdpbGwgdHVybiBvbiBBU1JDCisgKiBmb3IgdGhlc2UgZmlsdGVycyBpZiBBU1JDIGlzIHNlbGVjdGVkIGFzIHRoZWlyIGNsb2NrIHNvdXJjZS4KKyAqLworaW50IHJ0NTY3N19zZWxfYXNyY19jbGtfc3JjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJdW5zaWduZWQgaW50IGZpbHRlcl9tYXNrLCB1bnNpZ25lZCBpbnQgY2xrX3NyYykKK3sKKwlzdHJ1Y3QgcnQ1Njc3X3ByaXYgKnJ0NTY3NyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCXVuc2lnbmVkIGludCBhc3JjM19tYXNrID0gMCwgYXNyYzNfdmFsdWUgPSAwOworCXVuc2lnbmVkIGludCBhc3JjNF9tYXNrID0gMCwgYXNyYzRfdmFsdWUgPSAwOworCXVuc2lnbmVkIGludCBhc3JjNV9tYXNrID0gMCwgYXNyYzVfdmFsdWUgPSAwOworCXVuc2lnbmVkIGludCBhc3JjNl9tYXNrID0gMCwgYXNyYzZfdmFsdWUgPSAwOworCXVuc2lnbmVkIGludCBhc3JjN19tYXNrID0gMCwgYXNyYzdfdmFsdWUgPSAwOworCisJc3dpdGNoIChjbGtfc3JjKSB7CisJY2FzZSBSVDU2NzdfQ0xLX1NFTF9TWVM6CisJY2FzZSBSVDU2NzdfQ0xLX1NFTF9JMlMxX0FTUkM6CisJY2FzZSBSVDU2NzdfQ0xLX1NFTF9JMlMyX0FTUkM6CisJY2FzZSBSVDU2NzdfQ0xLX1NFTF9JMlMzX0FTUkM6CisJY2FzZSBSVDU2NzdfQ0xLX1NFTF9JMlM0X0FTUkM6CisJY2FzZSBSVDU2NzdfQ0xLX1NFTF9JMlM1X0FTUkM6CisJY2FzZSBSVDU2NzdfQ0xLX1NFTF9JMlM2X0FTUkM6CisJY2FzZSBSVDU2NzdfQ0xLX1NFTF9TWVMyOgorCWNhc2UgUlQ1Njc3X0NMS19TRUxfU1lTMzoKKwljYXNlIFJUNTY3N19DTEtfU0VMX1NZUzQ6CisJY2FzZSBSVDU2NzdfQ0xLX1NFTF9TWVM1OgorCWNhc2UgUlQ1Njc3X0NMS19TRUxfU1lTNjoKKwljYXNlIFJUNTY3N19DTEtfU0VMX1NZUzc6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQVNSQyAzICovCisJaWYgKGZpbHRlcl9tYXNrICYgUlQ1Njc3X0RBX1NURVJFT19GSUxURVIpIHsKKwkJYXNyYzNfbWFzayB8PSBSVDU2NzdfREFfU1RPX0NMS19TRUxfTUFTSzsKKwkJYXNyYzNfdmFsdWUgPSAoYXNyYzNfdmFsdWUgJiB+UlQ1Njc3X0RBX1NUT19DTEtfU0VMX01BU0spCisJCQl8IChjbGtfc3JjIDw8IFJUNTY3N19EQV9TVE9fQ0xLX1NFTF9TRlQpOworCX0KKworCWlmIChmaWx0ZXJfbWFzayAmIFJUNTY3N19EQV9NT05PMl9MX0ZJTFRFUikgeworCQlhc3JjM19tYXNrIHw9IFJUNTY3N19EQV9NT05PMkxfQ0xLX1NFTF9NQVNLOworCQlhc3JjM192YWx1ZSA9IChhc3JjM192YWx1ZSAmIH5SVDU2NzdfREFfTU9OTzJMX0NMS19TRUxfTUFTSykKKwkJCXwgKGNsa19zcmMgPDwgUlQ1Njc3X0RBX01PTk8yTF9DTEtfU0VMX1NGVCk7CisJfQorCisJaWYgKGZpbHRlcl9tYXNrICYgUlQ1Njc3X0RBX01PTk8yX1JfRklMVEVSKSB7CisJCWFzcmMzX21hc2sgfD0gUlQ1Njc3X0RBX01PTk8yUl9DTEtfU0VMX01BU0s7CisJCWFzcmMzX3ZhbHVlID0gKGFzcmMzX3ZhbHVlICYgflJUNTY3N19EQV9NT05PMlJfQ0xLX1NFTF9NQVNLKQorCQkJfCAoY2xrX3NyYyA8PCBSVDU2NzdfREFfTU9OTzJSX0NMS19TRUxfU0ZUKTsKKwl9CisKKwlpZiAoYXNyYzNfbWFzaykKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY3Ny0+cmVnbWFwLCBSVDU2NzdfQVNSQ18zLCBhc3JjM19tYXNrLAorCQkJYXNyYzNfdmFsdWUpOworCisJLyogQVNSQyA0ICovCisJaWYgKGZpbHRlcl9tYXNrICYgUlQ1Njc3X0RBX01PTk8zX0xfRklMVEVSKSB7CisJCWFzcmM0X21hc2sgfD0gUlQ1Njc3X0RBX01PTk8zTF9DTEtfU0VMX01BU0s7CisJCWFzcmM0X3ZhbHVlID0gKGFzcmM0X3ZhbHVlICYgflJUNTY3N19EQV9NT05PM0xfQ0xLX1NFTF9NQVNLKQorCQkJfCAoY2xrX3NyYyA8PCBSVDU2NzdfREFfTU9OTzNMX0NMS19TRUxfU0ZUKTsKKwl9CisKKwlpZiAoZmlsdGVyX21hc2sgJiBSVDU2NzdfREFfTU9OTzNfUl9GSUxURVIpIHsKKwkJYXNyYzRfbWFzayB8PSBSVDU2NzdfREFfTU9OTzNSX0NMS19TRUxfTUFTSzsKKwkJYXNyYzRfdmFsdWUgPSAoYXNyYzRfdmFsdWUgJiB+UlQ1Njc3X0RBX01PTk8zUl9DTEtfU0VMX01BU0spCisJCQl8IChjbGtfc3JjIDw8IFJUNTY3N19EQV9NT05PM1JfQ0xLX1NFTF9TRlQpOworCX0KKworCWlmIChmaWx0ZXJfbWFzayAmIFJUNTY3N19EQV9NT05PNF9MX0ZJTFRFUikgeworCQlhc3JjNF9tYXNrIHw9IFJUNTY3N19EQV9NT05PNExfQ0xLX1NFTF9NQVNLOworCQlhc3JjNF92YWx1ZSA9IChhc3JjNF92YWx1ZSAmIH5SVDU2NzdfREFfTU9OTzRMX0NMS19TRUxfTUFTSykKKwkJCXwgKGNsa19zcmMgPDwgUlQ1Njc3X0RBX01PTk80TF9DTEtfU0VMX1NGVCk7CisJfQorCisJaWYgKGZpbHRlcl9tYXNrICYgUlQ1Njc3X0RBX01PTk80X1JfRklMVEVSKSB7CisJCWFzcmM0X21hc2sgfD0gUlQ1Njc3X0RBX01PTk80Ul9DTEtfU0VMX01BU0s7CisJCWFzcmM0X3ZhbHVlID0gKGFzcmM0X3ZhbHVlICYgflJUNTY3N19EQV9NT05PNFJfQ0xLX1NFTF9NQVNLKQorCQkJfCAoY2xrX3NyYyA8PCBSVDU2NzdfREFfTU9OTzRSX0NMS19TRUxfU0ZUKTsKKwl9CisKKwlpZiAoYXNyYzRfbWFzaykKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY3Ny0+cmVnbWFwLCBSVDU2NzdfQVNSQ180LCBhc3JjNF9tYXNrLAorCQkJYXNyYzRfdmFsdWUpOworCisJLyogQVNSQyA1ICovCisJaWYgKGZpbHRlcl9tYXNrICYgUlQ1Njc3X0FEX1NURVJFTzFfRklMVEVSKSB7CisJCWFzcmM1X21hc2sgfD0gUlQ1Njc3X0FEX1NUTzFfQ0xLX1NFTF9NQVNLOworCQlhc3JjNV92YWx1ZSA9IChhc3JjNV92YWx1ZSAmIH5SVDU2NzdfQURfU1RPMV9DTEtfU0VMX01BU0spCisJCQl8IChjbGtfc3JjIDw8IFJUNTY3N19BRF9TVE8xX0NMS19TRUxfU0ZUKTsKKwl9CisKKwlpZiAoZmlsdGVyX21hc2sgJiBSVDU2NzdfQURfU1RFUkVPMl9GSUxURVIpIHsKKwkJYXNyYzVfbWFzayB8PSBSVDU2NzdfQURfU1RPMl9DTEtfU0VMX01BU0s7CisJCWFzcmM1X3ZhbHVlID0gKGFzcmM1X3ZhbHVlICYgflJUNTY3N19BRF9TVE8yX0NMS19TRUxfTUFTSykKKwkJCXwgKGNsa19zcmMgPDwgUlQ1Njc3X0FEX1NUTzJfQ0xLX1NFTF9TRlQpOworCX0KKworCWlmIChmaWx0ZXJfbWFzayAmIFJUNTY3N19BRF9TVEVSRU8zX0ZJTFRFUikgeworCQlhc3JjNV9tYXNrIHw9IFJUNTY3N19BRF9TVE8zX0NMS19TRUxfTUFTSzsKKwkJYXNyYzVfdmFsdWUgPSAoYXNyYzVfdmFsdWUgJiB+UlQ1Njc3X0FEX1NUTzNfQ0xLX1NFTF9NQVNLKQorCQkJfCAoY2xrX3NyYyA8PCBSVDU2NzdfQURfU1RPM19DTEtfU0VMX1NGVCk7CisJfQorCisJaWYgKGZpbHRlcl9tYXNrICYgUlQ1Njc3X0FEX1NURVJFTzRfRklMVEVSKSB7CisJCWFzcmM1X21hc2sgfD0gUlQ1Njc3X0FEX1NUTzRfQ0xLX1NFTF9NQVNLOworCQlhc3JjNV92YWx1ZSA9IChhc3JjNV92YWx1ZSAmIH5SVDU2NzdfQURfU1RPNF9DTEtfU0VMX01BU0spCisJCQl8IChjbGtfc3JjIDw8IFJUNTY3N19BRF9TVE80X0NMS19TRUxfU0ZUKTsKKwl9CisKKwlpZiAoYXNyYzVfbWFzaykKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY3Ny0+cmVnbWFwLCBSVDU2NzdfQVNSQ181LCBhc3JjNV9tYXNrLAorCQkJYXNyYzVfdmFsdWUpOworCisJLyogQVNSQyA2ICovCisJaWYgKGZpbHRlcl9tYXNrICYgUlQ1Njc3X0FEX01PTk9fTF9GSUxURVIpIHsKKwkJYXNyYzZfbWFzayB8PSBSVDU2NzdfQURfTU9OT0xfQ0xLX1NFTF9NQVNLOworCQlhc3JjNl92YWx1ZSA9IChhc3JjNl92YWx1ZSAmIH5SVDU2NzdfQURfTU9OT0xfQ0xLX1NFTF9NQVNLKQorCQkJfCAoY2xrX3NyYyA8PCBSVDU2NzdfQURfTU9OT0xfQ0xLX1NFTF9TRlQpOworCX0KKworCWlmIChmaWx0ZXJfbWFzayAmIFJUNTY3N19BRF9NT05PX1JfRklMVEVSKSB7CisJCWFzcmM2X21hc2sgfD0gUlQ1Njc3X0FEX01PTk9SX0NMS19TRUxfTUFTSzsKKwkJYXNyYzZfdmFsdWUgPSAoYXNyYzZfdmFsdWUgJiB+UlQ1Njc3X0FEX01PTk9SX0NMS19TRUxfTUFTSykKKwkJCXwgKGNsa19zcmMgPDwgUlQ1Njc3X0FEX01PTk9SX0NMS19TRUxfU0ZUKTsKKwl9CisKKwlpZiAoYXNyYzZfbWFzaykKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzKHJ0NTY3Ny0+cmVnbWFwLCBSVDU2NzdfQVNSQ182LCBhc3JjNl9tYXNrLAorCQkJYXNyYzZfdmFsdWUpOworCisJLyogQVNSQyA3ICovCisJaWYgKGZpbHRlcl9tYXNrICYgUlQ1Njc3X0RTUF9PQl8wXzNfRklMVEVSKSB7CisJCWFzcmM3X21hc2sgfD0gUlQ1Njc3X0RTUF9PQl8wXzNfQ0xLX1NFTF9NQVNLOworCQlhc3JjN192YWx1ZSA9IChhc3JjN192YWx1ZSAmIH5SVDU2NzdfRFNQX09CXzBfM19DTEtfU0VMX01BU0spCisJCQl8IChjbGtfc3JjIDw8IFJUNTY3N19EU1BfT0JfMF8zX0NMS19TRUxfU0ZUKTsKKwl9CisKKwlpZiAoZmlsdGVyX21hc2sgJiBSVDU2NzdfRFNQX09CXzRfN19GSUxURVIpIHsKKwkJYXNyYzdfbWFzayB8PSBSVDU2NzdfRFNQX09CXzRfN19DTEtfU0VMX01BU0s7CisJCWFzcmM3X3ZhbHVlID0gKGFzcmM3X3ZhbHVlICYgflJUNTY3N19EU1BfT0JfNF83X0NMS19TRUxfTUFTSykKKwkJCXwgKGNsa19zcmMgPDwgUlQ1Njc3X0RTUF9PQl80XzdfQ0xLX1NFTF9TRlQpOworCX0KKworCWlmIChhc3JjN19tYXNrKQorCQlyZWdtYXBfdXBkYXRlX2JpdHMocnQ1Njc3LT5yZWdtYXAsIFJUNTY3N19BU1JDXzcsIGFzcmM3X21hc2ssCisJCQlhc3JjN192YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJ0NTY3N19zZWxfYXNyY19jbGtfc3JjKTsKKwogLyogRGlnaXRhbCBNaXhlciAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHJ0NTY3N19zdG8xX2FkY19sX21peFtdID0gewogCVNPQ19EQVBNX1NJTkdMRSgiQURDMSBTd2l0Y2giLCBSVDU2NzdfU1RPMV9BRENfTUlYRVIsCkBAIC00NTAwLDEwICs0Njc2LDEwIEBACiAJaWYgKCFydDU2NzctPmRzcF92YWRfZW4pIHsKIAkJcmVnY2FjaGVfY2FjaGVfb25seShydDU2NzctPnJlZ21hcCwgdHJ1ZSk7CiAJCXJlZ2NhY2hlX21hcmtfZGlydHkocnQ1Njc3LT5yZWdtYXApOwotCX0KIAotCWlmIChncGlvX2lzX3ZhbGlkKHJ0NTY3Ny0+cG93X2xkbzIpKQotCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChydDU2NzctPnBvd19sZG8yLCAwKTsKKwkJaWYgKGdwaW9faXNfdmFsaWQocnQ1Njc3LT5wb3dfbGRvMikpCisJCQlncGlvX3NldF92YWx1ZV9jYW5zbGVlcChydDU2NzctPnBvd19sZG8yLCAwKTsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ1MTIsMTIgKzQ2ODgsMTIgQEAKIHsKIAlzdHJ1Y3QgcnQ1Njc3X3ByaXYgKnJ0NTY3NyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JaWYgKGdwaW9faXNfdmFsaWQocnQ1Njc3LT5wb3dfbGRvMikpIHsKLQkJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAocnQ1Njc3LT5wb3dfbGRvMiwgMSk7Ci0JCW1zbGVlcCgxMCk7Ci0JfQotCiAJaWYgKCFydDU2NzctPmRzcF92YWRfZW4pIHsKKwkJaWYgKGdwaW9faXNfdmFsaWQocnQ1Njc3LT5wb3dfbGRvMikpIHsKKwkJCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKHJ0NTY3Ny0+cG93X2xkbzIsIDEpOworCQkJbXNsZWVwKDEwKTsKKwkJfQorCiAJCXJlZ2NhY2hlX2NhY2hlX29ubHkocnQ1Njc3LT5yZWdtYXAsIGZhbHNlKTsKIAkJcmVnY2FjaGVfc3luYyhydDU2NzctPnJlZ21hcCk7CiAJfQpAQCAtNDczMyw3ICs0OTA5LDggQEAKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBydDU2NzdfaTJjX2lkW10gPSB7Ci0JeyAicnQ1Njc3IiwgMCB9LAorCXsgInJ0NTY3NyIsIFJUNTY3NyB9LAorCXsgInJ0NTY3NiIsIFJUNTY3NiB9LAogCXsgfQogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBydDU2NzdfaTJjX2lkKTsKQEAgLTQ4NTAsNiArNTAyNyw4IEBACiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCBydDU2NzcpOwogCisJcnQ1Njc3LT50eXBlID0gaWQtPmRyaXZlcl9kYXRhOworCiAJaWYgKHBkYXRhKQogCQlydDU2NzctPnBkYXRhID0gKnBkYXRhOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY3Ny5oIGIvc291bmQvc29jL2NvZGVjcy9ydDU2NzcuaAppbmRleCBjMGE2MjVmLi45ZGNlYjQxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3J0NTY3Ny5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvcnQ1Njc3LmgKQEAgLTE0MDYsNiArMTQwNiw0NiBAQAogI2RlZmluZSBSVDU2NzdfRFNQX0NMS19TUkNfUExMMgkJCSgweDAgPDwgNykKICNkZWZpbmUgUlQ1Njc3X0RTUF9DTEtfU1JDX0JZUEFTUwkJKDB4MSA8PCA3KQogCisvKiBBU1JDIENvbnRyb2wgMyAoMHg4NSkgKi8KKyNkZWZpbmUgUlQ1Njc3X0RBX1NUT19DTEtfU0VMX01BU0sJCSgweGYgPDwgMTIpCisjZGVmaW5lIFJUNTY3N19EQV9TVE9fQ0xLX1NFTF9TRlQJCTEyCisjZGVmaW5lIFJUNTY3N19EQV9NT05PMkxfQ0xLX1NFTF9NQVNLCQkoMHhmIDw8IDQpCisjZGVmaW5lIFJUNTY3N19EQV9NT05PMkxfQ0xLX1NFTF9TRlQJCTQKKyNkZWZpbmUgUlQ1Njc3X0RBX01PTk8yUl9DTEtfU0VMX01BU0sJCSgweGYgPDwgMCkKKyNkZWZpbmUgUlQ1Njc3X0RBX01PTk8yUl9DTEtfU0VMX1NGVAkJMAorCisvKiBBU1JDIENvbnRyb2wgNCAoMHg4NikgKi8KKyNkZWZpbmUgUlQ1Njc3X0RBX01PTk8zTF9DTEtfU0VMX01BU0sJCSgweGYgPDwgMTIpCisjZGVmaW5lIFJUNTY3N19EQV9NT05PM0xfQ0xLX1NFTF9TRlQJCTEyCisjZGVmaW5lIFJUNTY3N19EQV9NT05PM1JfQ0xLX1NFTF9NQVNLCQkoMHhmIDw8IDgpCisjZGVmaW5lIFJUNTY3N19EQV9NT05PM1JfQ0xLX1NFTF9TRlQJCTgKKyNkZWZpbmUgUlQ1Njc3X0RBX01PTk80TF9DTEtfU0VMX01BU0sJCSgweGYgPDwgNCkKKyNkZWZpbmUgUlQ1Njc3X0RBX01PTk80TF9DTEtfU0VMX1NGVAkJNAorI2RlZmluZSBSVDU2NzdfREFfTU9OTzRSX0NMS19TRUxfTUFTSwkJKDB4ZiA8PCAwKQorI2RlZmluZSBSVDU2NzdfREFfTU9OTzRSX0NMS19TRUxfU0ZUCQkwCisKKy8qIEFTUkMgQ29udHJvbCA1ICgweDg3KSAqLworI2RlZmluZSBSVDU2NzdfQURfU1RPMV9DTEtfU0VMX01BU0sJCSgweGYgPDwgMTIpCisjZGVmaW5lIFJUNTY3N19BRF9TVE8xX0NMS19TRUxfU0ZUCQkxMgorI2RlZmluZSBSVDU2NzdfQURfU1RPMl9DTEtfU0VMX01BU0sJCSgweGYgPDwgOCkKKyNkZWZpbmUgUlQ1Njc3X0FEX1NUTzJfQ0xLX1NFTF9TRlQJCTgKKyNkZWZpbmUgUlQ1Njc3X0FEX1NUTzNfQ0xLX1NFTF9NQVNLCQkoMHhmIDw8IDQpCisjZGVmaW5lIFJUNTY3N19BRF9TVE8zX0NMS19TRUxfU0ZUCQk0CisjZGVmaW5lIFJUNTY3N19BRF9TVE80X0NMS19TRUxfTUFTSwkJKDB4ZiA8PCAwKQorI2RlZmluZSBSVDU2NzdfQURfU1RPNF9DTEtfU0VMX1NGVAkJMAorCisvKiBBU1JDIENvbnRyb2wgNiAoMHg4OCkgKi8KKyNkZWZpbmUgUlQ1Njc3X0FEX01PTk9MX0NMS19TRUxfTUFTSwkJKDB4ZiA8PCAxMikKKyNkZWZpbmUgUlQ1Njc3X0FEX01PTk9MX0NMS19TRUxfU0ZUCQkxMgorI2RlZmluZSBSVDU2NzdfQURfTU9OT1JfQ0xLX1NFTF9NQVNLCQkoMHhmIDw8IDgpCisjZGVmaW5lIFJUNTY3N19BRF9NT05PUl9DTEtfU0VMX1NGVAkJOAorCisvKiBBU1JDIENvbnRyb2wgNyAoMHg4OSkgKi8KKyNkZWZpbmUgUlQ1Njc3X0RTUF9PQl8wXzNfQ0xLX1NFTF9NQVNLCQkoMHhmIDw8IDEyKQorI2RlZmluZSBSVDU2NzdfRFNQX09CXzBfM19DTEtfU0VMX1NGVAkJMTIKKyNkZWZpbmUgUlQ1Njc3X0RTUF9PQl80XzdfQ0xLX1NFTF9NQVNLCQkoMHhmIDw8IDgpCisjZGVmaW5lIFJUNTY3N19EU1BfT0JfNF83X0NMS19TRUxfU0ZUCQk4CisKIC8qIFZBRCBGdW5jdGlvbiBDb250cm9sIDQgKDB4OWYpICovCiAjZGVmaW5lIFJUNTY3N19WQURfU1JDX01BU0sJCQkoMHg3IDw8IDgpCiAjZGVmaW5lIFJUNTY3N19WQURfU1JDX1NGVAkJCTgKQEAgLTE2NjUsNiArMTcwNSw0NyBAQAogCVJUNTY3N19JUlFfSkQzLAogfTsKIAorZW51bSBydDU2NzdfdHlwZSB7CisJUlQ1Njc3LAorCVJUNTY3NiwKK307CisKKy8qIEFTUkMgY2xvY2sgc291cmNlIHNlbGVjdGlvbiAqLworZW51bSB7CisJUlQ1Njc3X0NMS19TRUxfU1lTLAorCVJUNTY3N19DTEtfU0VMX0kyUzFfQVNSQywKKwlSVDU2NzdfQ0xLX1NFTF9JMlMyX0FTUkMsCisJUlQ1Njc3X0NMS19TRUxfSTJTM19BU1JDLAorCVJUNTY3N19DTEtfU0VMX0kyUzRfQVNSQywKKwlSVDU2NzdfQ0xLX1NFTF9JMlM1X0FTUkMsCisJUlQ1Njc3X0NMS19TRUxfSTJTNl9BU1JDLAorCVJUNTY3N19DTEtfU0VMX1NZUzIsCisJUlQ1Njc3X0NMS19TRUxfU1lTMywKKwlSVDU2NzdfQ0xLX1NFTF9TWVM0LAorCVJUNTY3N19DTEtfU0VMX1NZUzUsCisJUlQ1Njc3X0NMS19TRUxfU1lTNiwKKwlSVDU2NzdfQ0xLX1NFTF9TWVM3LAorfTsKKworLyogZmlsdGVyIG1hc2sgKi8KK2VudW0geworCVJUNTY3N19EQV9TVEVSRU9fRklMVEVSID0gMHgxLAorCVJUNTY3N19EQV9NT05PMl9MX0ZJTFRFUiA9ICgweDEgPDwgMSksCisJUlQ1Njc3X0RBX01PTk8yX1JfRklMVEVSID0gKDB4MSA8PCAyKSwKKwlSVDU2NzdfREFfTU9OTzNfTF9GSUxURVIgPSAoMHgxIDw8IDMpLAorCVJUNTY3N19EQV9NT05PM19SX0ZJTFRFUiA9ICgweDEgPDwgNCksCisJUlQ1Njc3X0RBX01PTk80X0xfRklMVEVSID0gKDB4MSA8PCA1KSwKKwlSVDU2NzdfREFfTU9OTzRfUl9GSUxURVIgPSAoMHgxIDw8IDYpLAorCVJUNTY3N19BRF9TVEVSRU8xX0ZJTFRFUiA9ICgweDEgPDwgNyksCisJUlQ1Njc3X0FEX1NURVJFTzJfRklMVEVSID0gKDB4MSA8PCA4KSwKKwlSVDU2NzdfQURfU1RFUkVPM19GSUxURVIgPSAoMHgxIDw8IDkpLAorCVJUNTY3N19BRF9TVEVSRU80X0ZJTFRFUiA9ICgweDEgPDwgMTApLAorCVJUNTY3N19BRF9NT05PX0xfRklMVEVSID0gKDB4MSA8PCAxMSksCisJUlQ1Njc3X0FEX01PTk9fUl9GSUxURVIgPSAoMHgxIDw8IDEyKSwKKwlSVDU2NzdfRFNQX09CXzBfM19GSUxURVIgPSAoMHgxIDw8IDEzKSwKKwlSVDU2NzdfRFNQX09CXzRfN19GSUxURVIgPSAoMHgxIDw8IDE0KSwKK307CisKIHN0cnVjdCBydDU2NzdfcHJpdiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwogCXN0cnVjdCBydDU2NzdfcGxhdGZvcm1fZGF0YSBwZGF0YTsKQEAgLTE2ODEsNiArMTc2Miw3IEBACiAJaW50IHBsbF9pbjsKIAlpbnQgcGxsX291dDsKIAlpbnQgcG93X2xkbzI7IC8qIFBPV19MRE8yIHBpbiAqLworCWVudW0gcnQ1Njc3X3R5cGUgdHlwZTsKICNpZmRlZiBDT05GSUdfR1BJT0xJQgogCXN0cnVjdCBncGlvX2NoaXAgZ3Bpb19jaGlwOwogI2VuZGlmCkBAIC0xNjkwLDQgKzE3NzIsNyBAQAogCWJvb2wgaXNfdnJlZl9zbG93OwogfTsKIAoraW50IHJ0NTY3N19zZWxfYXNyY19jbGtfc3JjKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKKwkJdW5zaWduZWQgaW50IGZpbHRlcl9tYXNrLCB1bnNpZ25lZCBpbnQgY2xrX3NyYyk7CisKICNlbmRpZiAvKiBfX1JUNTY3N19IX18gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvc2d0bDUwMDAuYwppbmRleCBlMTgyZTY1Li4zNTkzYTE0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3NndGw1MDAwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zZ3RsNTAwMC5jCkBAIC0xMTUxLDEzICsxMTUxLDcgQEAKIAkJLyogRW5hYmxlIFZEREMgY2hhcmdlIHB1bXAgKi8KIAkJYW5hX3B3ciB8PSBTR1RMNTAwMF9WRERDX0NIUkdQTVBfUE9XRVJVUDsKIAl9IGVsc2UgaWYgKHZkZGlvID49IDMxMDAgJiYgdmRkYSA+PSAzMTAwKSB7Ci0JCS8qCi0JCSAqIGlmIHZkZGlvIGFuZCB2ZGRkID4gMy4xdiwKLQkJICogY2hhcmdlIHB1bXAgc2hvdWxkIGJlIGNsZWFuIGJlZm9yZSBzZXQgYW5hX3B3cgotCQkgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgU0dUTDUwMDBfQ0hJUF9BTkFfUE9XRVIsCi0JCQkJU0dUTDUwMDBfVkREQ19DSFJHUE1QX1BPV0VSVVAsIDApOwotCisJCWFuYV9wd3IgJj0gflNHVEw1MDAwX1ZERENfQ0hSR1BNUF9QT1dFUlVQOwogCQkvKiBWRERDIHVzZSBWRERJTyByYWlsICovCiAJCWxyZWdfY3RybCB8PSBTR1RMNTAwMF9WRERDX0FTU05fT1ZSRDsKIAkJbHJlZ19jdHJsIHw9IFNHVEw1MDAwX1ZERENfTUFOX0FTU05fVkRESU8gPDwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc245NTAzMS5jIGIvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKaW5kZXggNDdiMjU3ZS4uNzk0N2MwZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmMKQEAgLTUzOCw4ICs1MzgsOCBAQAogCS8qIHNwZWFrZXIgbWFwICovCiAJeyAiSUhGT1VUTCIsIE5VTEwsICJTcGVha2VyIFJhaWwifSwKIAl7ICJJSEZPVVRSIiwgTlVMTCwgIlNwZWFrZXIgUmFpbCJ9LAotCXsgIklIRk9VVEwiLCAiTlVMTCIsICJTcGVha2VyIExlZnQgUGxheWJhY2sifSwKLQl7ICJJSEZPVVRSIiwgIk5VTEwiLCAiU3BlYWtlciBSaWdodCBQbGF5YmFjayJ9LAorCXsgIklIRk9VVEwiLCBOVUxMLCAiU3BlYWtlciBMZWZ0IFBsYXliYWNrIn0sCisJeyAiSUhGT1VUUiIsIE5VTEwsICJTcGVha2VyIFJpZ2h0IFBsYXliYWNrIn0sCiAJeyAiU3BlYWtlciBMZWZ0IFBsYXliYWNrIiwgTlVMTCwgIlNwZWFrZXIgTGVmdCBGaWx0ZXIifSwKIAl7ICJTcGVha2VyIFJpZ2h0IFBsYXliYWNrIiwgTlVMTCwgIlNwZWFrZXIgUmlnaHQgRmlsdGVyIn0sCiAJeyAiU3BlYWtlciBMZWZ0IEZpbHRlciIsIE5VTEwsICJJSEZEQUMgTGVmdCJ9LApAQCAtNzgzLDE5ICs3ODMsMjEgQEAKIAlzbmRfc29jX3dyaXRlKGNvZGVjLCBTTjk1MDMxX0JUTkNUUkwyLCAweDAxKTsKIH0KIAotc3RhdGljIGludCBzbjk1MDMxX2dldF9oZWFkc2V0X3N0YXRlKHN0cnVjdCBzbmRfc29jX2phY2sgKm1mbGRfamFjaykKK3N0YXRpYyBpbnQgc245NTAzMV9nZXRfaGVhZHNldF9zdGF0ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IHNuZF9zb2NfamFjayAqbWZsZF9qYWNrKQogewotCWludCBtaWNiaWFzID0gc245NTAzMV9nZXRfbWljX2JpYXMobWZsZF9qYWNrLT5jb2RlYyk7CisJaW50IG1pY2JpYXMgPSBzbjk1MDMxX2dldF9taWNfYmlhcyhjb2RlYyk7CiAKIAlpbnQgamFja190eXBlID0gc25kX3NvY19qYWNrX2dldF90eXBlKG1mbGRfamFjaywgbWljYmlhcyk7CiAKIAlwcl9kZWJ1ZygiamFjayB0eXBlIGRldGVjdGVkID0gJWRcbiIsIGphY2tfdHlwZSk7CiAJaWYgKGphY2tfdHlwZSA9PSBTTkRfSkFDS19IRUFEU0VUKQotCQlzbjk1MDMxX2VuYWJsZV9qYWNrX2J0bihtZmxkX2phY2stPmNvZGVjKTsKKwkJc245NTAzMV9lbmFibGVfamFja19idG4oY29kZWMpOwogCXJldHVybiBqYWNrX3R5cGU7CiB9CiAKLXZvaWQgc245NTAzMV9qYWNrX2RldGVjdGlvbihzdHJ1Y3QgbWZsZF9qYWNrX2RhdGEgKmphY2tfZGF0YSkKK3ZvaWQgc245NTAzMV9qYWNrX2RldGVjdGlvbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IG1mbGRfamFja19kYXRhICpqYWNrX2RhdGEpCiB7CiAJdW5zaWduZWQgaW50IHN0YXR1czsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IFNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEgfCBTTkRfSkFDS19IRUFEU0VUOwpAQCAtODA5LDExICs4MTEsMTEgQEAKIAkJc3RhdHVzID0gU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX0JUTl8xOwogCX0gZWxzZSBpZiAoamFja19kYXRhLT5pbnRyX2lkICYgMHg0KSB7CiAJCXByX2RlYnVnKCJoZWFkc2V0IG9yIGhlYWRwaG9uZXMgaW5zZXJ0ZWRcbiIpOwotCQlzdGF0dXMgPSBzbjk1MDMxX2dldF9oZWFkc2V0X3N0YXRlKGphY2tfZGF0YS0+bWZsZF9qYWNrKTsKKwkJc3RhdHVzID0gc245NTAzMV9nZXRfaGVhZHNldF9zdGF0ZShjb2RlYywgamFja19kYXRhLT5tZmxkX2phY2spOwogCX0gZWxzZSBpZiAoamFja19kYXRhLT5pbnRyX2lkICYgMHg4KSB7CiAJCXByX2RlYnVnKCJoZWFkc2V0IG9yIGhlYWRwaG9uZXMgcmVtb3ZlZFxuIik7CiAJCXN0YXR1cyA9IDA7Ci0JCXNuOTUwMzFfZGlzYWJsZV9qYWNrX2J0bihqYWNrX2RhdGEtPm1mbGRfamFjay0+Y29kZWMpOworCQlzbjk1MDMxX2Rpc2FibGVfamFja19idG4oY29kZWMpOwogCX0gZWxzZSB7CiAJCXByX2VycigidW5pZGVudGlmaWVkIGludGVycnVwdFxuIik7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc245NTAzMS5oIGIvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmgKaW5kZXggMjAzNzZkMi4uNzY1MWZlNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9zbjk1MDMxLmgKQEAgLTEyNyw2ICsxMjcsNyBAQAogCXN0cnVjdCBzbmRfc29jX2phY2sgKm1mbGRfamFjazsKIH07CiAKLWV4dGVybiB2b2lkIHNuOTUwMzFfamFja19kZXRlY3Rpb24oc3RydWN0IG1mbGRfamFja19kYXRhICpqYWNrX2RhdGEpOworZXh0ZXJuIHZvaWQgc245NTAzMV9qYWNrX2RldGVjdGlvbihzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCisJc3RydWN0IG1mbGRfamFja19kYXRhICpqYWNrX2RhdGEpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzUwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3N0YTM1MC5jCmluZGV4IGJkYTJlZTEuLjY2OWUzMjIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvc3RhMzUwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9zdGEzNTAuYwpAQCAtMTIxMywyNyArMTIxMywxNSBAQAogI2VuZGlmCiAKIAkvKiBHUElPcyAqLwotCXN0YTM1MC0+Z3Bpb2RfbnJlc2V0ID0gZGV2bV9ncGlvZF9nZXQoZGV2LCAicmVzZXQiKTsKLQlpZiAoSVNfRVJSKHN0YTM1MC0+Z3Bpb2RfbnJlc2V0KSkgewotCQlyZXQgPSBQVFJfRVJSKHN0YTM1MC0+Z3Bpb2RfbnJlc2V0KTsKLQkJaWYgKHJldCAhPSAtRU5PRU5UICYmIHJldCAhPSAtRU5PU1lTKQotCQkJcmV0dXJuIHJldDsKKwlzdGEzNTAtPmdwaW9kX25yZXNldCA9IGRldm1fZ3Bpb2RfZ2V0X29wdGlvbmFsKGRldiwgInJlc2V0IiwKKwkJCQkJCSAgICAgICBHUElPRF9PVVRfTE9XKTsKKwlpZiAoSVNfRVJSKHN0YTM1MC0+Z3Bpb2RfbnJlc2V0KSkKKwkJcmV0dXJuIFBUUl9FUlIoc3RhMzUwLT5ncGlvZF9ucmVzZXQpOwogCi0JCXN0YTM1MC0+Z3Bpb2RfbnJlc2V0ID0gTlVMTDsKLQl9IGVsc2UgewotCQlncGlvZF9kaXJlY3Rpb25fb3V0cHV0KHN0YTM1MC0+Z3Bpb2RfbnJlc2V0LCAwKTsKLQl9Ci0KLQlzdGEzNTAtPmdwaW9kX3Bvd2VyX2Rvd24gPSBkZXZtX2dwaW9kX2dldChkZXYsICJwb3dlci1kb3duIik7Ci0JaWYgKElTX0VSUihzdGEzNTAtPmdwaW9kX3Bvd2VyX2Rvd24pKSB7Ci0JCXJldCA9IFBUUl9FUlIoc3RhMzUwLT5ncGlvZF9wb3dlcl9kb3duKTsKLQkJaWYgKHJldCAhPSAtRU5PRU5UICYmIHJldCAhPSAtRU5PU1lTKQotCQkJcmV0dXJuIHJldDsKLQotCQlzdGEzNTAtPmdwaW9kX3Bvd2VyX2Rvd24gPSBOVUxMOwotCX0gZWxzZSB7Ci0JCWdwaW9kX2RpcmVjdGlvbl9vdXRwdXQoc3RhMzUwLT5ncGlvZF9wb3dlcl9kb3duLCAwKTsKLQl9CisJc3RhMzUwLT5ncGlvZF9wb3dlcl9kb3duID0gZGV2bV9ncGlvZF9nZXQoZGV2LCAicG93ZXItZG93biIsCisJCQkJCQkgIEdQSU9EX09VVF9MT1cpOworCWlmIChJU19FUlIoc3RhMzUwLT5ncGlvZF9wb3dlcl9kb3duKSkKKwkJcmV0dXJuIFBUUl9FUlIoc3RhMzUwLT5ncGlvZF9wb3dlcl9kb3duKTsKIAogCS8qIHJlZ3VsYXRvcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGEzNTAtPnN1cHBsaWVzKTsgaSsrKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy90YXMyNTUyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3RhczI1NTIuYwppbmRleCBhZTIzYWNkLi5kZmI0ZmY1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RhczI1NTIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3RhczI1NTIuYwpAQCAtNDg1LDE2ICs0ODUsOSBAQAogCWlmIChkYXRhID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JZGF0YS0+ZW5hYmxlX2dwaW8gPSBkZXZtX2dwaW9kX2dldChkZXYsICJlbmFibGUiKTsKLQlpZiAoSVNfRVJSKGRhdGEtPmVuYWJsZV9ncGlvKSkgewotCQlyZXQgPSBQVFJfRVJSKGRhdGEtPmVuYWJsZV9ncGlvKTsKLQkJaWYgKHJldCAhPSAtRU5PRU5UICYmIHJldCAhPSAtRU5PU1lTKQotCQkJcmV0dXJuIHJldDsKLQotCQlkYXRhLT5lbmFibGVfZ3BpbyA9IE5VTEw7Ci0JfSBlbHNlIHsKLQkJZ3Bpb2RfZGlyZWN0aW9uX291dHB1dChkYXRhLT5lbmFibGVfZ3BpbywgMCk7Ci0JfQorCWRhdGEtPmVuYWJsZV9ncGlvID0gZGV2bV9ncGlvZF9nZXQoZGV2LCAiZW5hYmxlIiwgR1BJT0RfT1VUX0xPVyk7CisJaWYgKElTX0VSUihkYXRhLT5lbmFibGVfZ3BpbykpCisJCXJldHVybiBQVFJfRVJSKGRhdGEtPmVuYWJsZV9ncGlvKTsKIAogCWRhdGEtPnRhczI1NTJfY2xpZW50ID0gY2xpZW50OwogCWRhdGEtPnJlZ21hcCA9IGRldm1fcmVnbWFwX2luaXRfaTJjKGNsaWVudCwgJnRhczI1NTJfcmVnbWFwX2NvbmZpZyk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RhczUwODYuYyBiL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTA4Ni5jCmluZGV4IDI0OWVmNWMuLjMyOTQyYmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTA4Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGFzNTA4Ni5jCkBAIC0yODEsNyArMjgxLDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3QgdGFzNTA4Nl9wcml2YXRlICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gcHJpdi0+ZGVlbXBoOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gcHJpdi0+ZGVlbXBoOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yOTIsNyArMjkyLDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3QgdGFzNTA4Nl9wcml2YXRlICpwcml2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQlwcml2LT5kZWVtcGggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCXByaXYtPmRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCiAJcmV0dXJuIHRhczUwODZfc2V0X2RlZW1waChjb2RlYyk7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLWkyYy5jIGIvc291bmQvc29jL2NvZGVjcy90bHYzMjBhaWMyMy1pMmMuYwppbmRleCBmMTM3MDE5Li43OGE5NGFmIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3RsdjMyMGFpYzIzLWkyYy5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvdGx2MzIwYWljMjMtaTJjLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAlyZXR1cm4gdGx2MzIwYWljMjNfcHJvYmUoJmkyYy0+ZGV2LCByZWdtYXApOwogfQogCi1zdGF0aWMgaW50IF9fZXhpdCB0bHYzMjBhaWMyM19pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCitzdGF0aWMgaW50IHRsdjMyMGFpYzIzX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKIHsKIAlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTU2LDcgKzU2LDcgQEAKIAkJICAgLm9mX21hdGNoX3RhYmxlID0gb2ZfbWF0Y2hfcHRyKHRsdjMyMGFpYzIzX29mX21hdGNoKSwKIAkJICAgfSwKIAkucHJvYmUgPSB0bHYzMjBhaWMyM19pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZXhpdF9wKHRsdjMyMGFpYzIzX2kyY19yZW1vdmUpLAorCS5yZW1vdmUgPSB0bHYzMjBhaWMyM19pMmNfcmVtb3ZlLAogCS5pZF90YWJsZSA9IHRsdjMyMGFpYzIzX2lkLAogfTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTIwMDAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20yMDAwLmMKaW5kZXggOGQ5ZGU0OS4uMjFkNTQwMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTIwMDAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtMjAwMC5jCkBAIC02MTAsNyArNjEwLDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3Qgd20yMDAwX3ByaXYgKndtMjAwMCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKIAotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB3bTIwMDAtPmFuY19hY3RpdmU7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB3bTIwMDAtPmFuY19hY3RpdmU7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYyMCw3ICs2MjAsNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCB3bTIwMDBfcHJpdiAqd20yMDAwID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYpOwotCWludCBhbmNfYWN0aXZlID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXTsKKwlpbnQgYW5jX2FjdGl2ZSA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCWludCByZXQ7CiAKIAlpZiAoYW5jX2FjdGl2ZSA+IDEpCkBAIC02NDMsNyArNjQzLDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3Qgd20yMDAwX3ByaXYgKndtMjAwMCA9IGRldl9nZXRfZHJ2ZGF0YShjb2RlYy0+ZGV2KTsKIAotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB3bTIwMDAtPnNwa19lbmE7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB3bTIwMDAtPnNwa19lbmE7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY1Myw3ICs2NTMsNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCB3bTIwMDBfcHJpdiAqd20yMDAwID0gZGV2X2dldF9kcnZkYXRhKGNvZGVjLT5kZXYpOwotCWludCB2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWludCB2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAlpbnQgcmV0OwogCiAJaWYgKHZhbCA+IDEpCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtMjIwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTIyMDAuYwppbmRleCAxNTU5OTg0Li41YTlkYTI4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtMjIwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd20yMjAwLmMKQEAgLTE1NTQsNyArMTU1NCw2IEBACiAJaW50IHJldDsKIAogCXdtMjIwMC0+Y29kZWMgPSBjb2RlYzsKLQljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX09GRjsKIAogCXJldCA9IHNuZF9zb2NfYWRkX2NvZGVjX2NvbnRyb2xzKGNvZGVjLCB3bV9hZHNwMV9md19jb250cm9scywgMik7CiAJaWYgKHJldCAhPSAwKQpAQCAtMTk0Miw2ICsxOTQxLDcgQEAKIAlzdHJ1Y3Qgd20yMjAwX3ByaXYgKndtMjIwMCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXN0cnVjdCBfZmxsX2RpdiBmYWN0b3JzOwogCWludCByZXQsIGksIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyB0aW1lX2xlZnQ7CiAKIAlpZiAoIUZvdXQpIHsKIAkJZGV2X2RiZyhjb2RlYy0+ZGV2LCAiRkxMIGRpc2FibGVkIik7CkBAIC0yMDIxLDkgKzIwMjEsMTAgQEAKIAkvKiBQb2xsIGZvciB0aGUgbG9jazsgd2lsbCB1c2UgdGhlIGludGVycnVwdCB0byBleGl0IHF1aWNrbHkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CiAJCWlmIChpMmMtPmlycSkgewotCQkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ3bTIyMDAtPmZsbF9sb2NrLAotCQkJCQkJCSAgbXNlY3NfdG9famlmZmllcygyNSkpOwotCQkJaWYgKHJldCA+IDApCisJCQl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoCisJCQkJCQkJJndtMjIwMC0+ZmxsX2xvY2ssCisJCQkJCQkJbXNlY3NfdG9famlmZmllcygyNSkpOworCQkJaWYgKHRpbWVfbGVmdCA+IDApCiAJCQkJYnJlYWs7CiAJCX0gZWxzZSB7CiAJCQltc2xlZXAoMSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jIGIvc291bmQvc29jL2NvZGVjcy93bTUxMDAuYwppbmRleCBlYTA5ZGI1Li45Njc0MDM3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAwLmMKQEAgLTE3NjIsNiArMTc2Miw3IEBACiAJc3RydWN0IF9mbGxfZGl2IGZhY3RvcnM7CiAJc3RydWN0IHdtNTEwMF9mbGwgKmZsbDsKIAlpbnQgcmV0LCBiYXNlLCBsb2NrLCBpLCB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgdGltZV9sZWZ0OwogCiAJc3dpdGNoIChmbGxfaWQpIHsKIAljYXNlIFdNNTEwMF9GTEwxOgpAQCAtMTg0Miw5ICsxODQzLDkgQEAKIAkvKiBQb2xsIGZvciB0aGUgbG9jazsgd2lsbCB1c2UgaW50ZXJydXB0IHdoZW4gd2UgY2FuIHRlc3QgKi8KIAlmb3IgKGkgPSAwOyBpIDwgdGltZW91dDsgaSsrKSB7CiAJCWlmIChpMmMtPmlycSkgewotCQkJcmV0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZmbGwtPmxvY2ssCi0JCQkJCQkJICBtc2Vjc190b19qaWZmaWVzKDI1KSk7Ci0JCQlpZiAocmV0ID4gMCkKKwkJCXRpbWVfbGVmdCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmZmxsLT5sb2NrLAorCQkJCQkJCW1zZWNzX3RvX2ppZmZpZXMoMjUpKTsKKwkJCWlmICh0aW1lX2xlZnQgPiAwKQogCQkJCWJyZWFrOwogCQl9IGVsc2UgewogCQkJbXNsZWVwKDEpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd201MTAyLmMKaW5kZXggNmQwZmUwYS4uMGM2ZDFiYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTUxMDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtNTEwMi5jCkBAIC0xODYxLDcgKzE4NjEsNiBAQAogCUFSSVpPTkFfREFDX0RJR0lUQUxfVk9MVU1FXzJMLAogCUFSSVpPTkFfREFDX0RJR0lUQUxfVk9MVU1FXzJSLAogCUFSSVpPTkFfREFDX0RJR0lUQUxfVk9MVU1FXzNMLAotCUFSSVpPTkFfREFDX0RJR0lUQUxfVk9MVU1FXzNSLAogCUFSSVpPTkFfREFDX0RJR0lUQUxfVk9MVU1FXzRMLAogCUFSSVpPTkFfREFDX0RJR0lUQUxfVk9MVU1FXzRSLAogCUFSSVpPTkFfREFDX0RJR0lUQUxfVk9MVU1FXzVMLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204MzUwLmMKaW5kZXggYzgxYTllYS4uYzY1ZTVhNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTgzNTAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODM1MC5jCkBAIC02OSwxNCArNjksMTQgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tBUlJBWV9TSVpFKHN1cHBseV9uYW1lcyldOwogCWludCBmbGxfZnJlcV9vdXQ7CiAJaW50IGZsbF9mcmVxX2luOworCXN0cnVjdCBkZWxheWVkX3dvcmsgcGdhX3dvcms7CiB9OwogCiAvKgogICogUmFtcCBPVVQxIFBHQSB2b2x1bWUgdG8gbWluaW1pc2UgcG9wcyBhdCBzdHJlYW0gc3RhcnR1cCBhbmQgc2h1dGRvd24uCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHdtODM1MF9vdXQxX3JhbXBfc3RlcChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCitzdGF0aWMgaW5saW5lIGludCB3bTgzNTBfb3V0MV9yYW1wX3N0ZXAoc3RydWN0IHdtODM1MF9kYXRhICp3bTgzNTBfZGF0YSkKIHsKLQlzdHJ1Y3Qgd204MzUwX2RhdGEgKndtODM1MF9kYXRhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IHdtODM1MF9vdXRwdXQgKm91dDEgPSAmd204MzUwX2RhdGEtPm91dDE7CiAJc3RydWN0IHdtODM1MCAqd204MzUwID0gd204MzUwX2RhdGEtPndtODM1MDsKIAlpbnQgbGVmdF9jb21wbGV0ZSA9IDAsIHJpZ2h0X2NvbXBsZXRlID0gMDsKQEAgLTE0MCw5ICsxNDAsOCBAQAogLyoKICAqIFJhbXAgT1VUMiBQR0Egdm9sdW1lIHRvIG1pbmltaXNlIHBvcHMgYXQgc3RyZWFtIHN0YXJ0dXAgYW5kIHNodXRkb3duLgogICovCi1zdGF0aWMgaW5saW5lIGludCB3bTgzNTBfb3V0Ml9yYW1wX3N0ZXAoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQorc3RhdGljIGlubGluZSBpbnQgd204MzUwX291dDJfcmFtcF9zdGVwKHN0cnVjdCB3bTgzNTBfZGF0YSAqd204MzUwX2RhdGEpCiB7Ci0Jc3RydWN0IHdtODM1MF9kYXRhICp3bTgzNTBfZGF0YSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXN0cnVjdCB3bTgzNTBfb3V0cHV0ICpvdXQyID0gJndtODM1MF9kYXRhLT5vdXQyOwogCXN0cnVjdCB3bTgzNTAgKndtODM1MCA9IHdtODM1MF9kYXRhLT53bTgzNTA7CiAJaW50IGxlZnRfY29tcGxldGUgPSAwLCByaWdodF9jb21wbGV0ZSA9IDA7CkBAIC0yMTAsMTAgKzIwOSw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIHdtODM1MF9wZ2Ffd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0KLQkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCwgZGVsYXllZF93b3JrLndvcmspOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyhkYXBtKTsKLQlzdHJ1Y3Qgd204MzUwX2RhdGEgKndtODM1MF9kYXRhID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CisJc3RydWN0IHdtODM1MF9kYXRhICp3bTgzNTBfZGF0YSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd204MzUwX2RhdGEsIHBnYV93b3JrLndvcmspOwogCXN0cnVjdCB3bTgzNTBfb3V0cHV0ICpvdXQxID0gJndtODM1MF9kYXRhLT5vdXQxLAogCSAgICAqb3V0MiA9ICZ3bTgzNTBfZGF0YS0+b3V0MjsKIAlpbnQgaSwgb3V0MV9jb21wbGV0ZSwgb3V0Ml9jb21wbGV0ZTsKQEAgLTIyNiw5ICsyMjMsOSBAQAogCWZvciAoaSA9IDA7IGkgPD0gNjM7IGkrKykgewogCQlvdXQxX2NvbXBsZXRlID0gMSwgb3V0Ml9jb21wbGV0ZSA9IDE7CiAJCWlmIChvdXQxLT5yYW1wICE9IFdNODM1MF9SQU1QX05PTkUpCi0JCQlvdXQxX2NvbXBsZXRlID0gd204MzUwX291dDFfcmFtcF9zdGVwKGNvZGVjKTsKKwkJCW91dDFfY29tcGxldGUgPSB3bTgzNTBfb3V0MV9yYW1wX3N0ZXAod204MzUwX2RhdGEpOwogCQlpZiAob3V0Mi0+cmFtcCAhPSBXTTgzNTBfUkFNUF9OT05FKQotCQkJb3V0Ml9jb21wbGV0ZSA9IHdtODM1MF9vdXQyX3JhbXBfc3RlcChjb2RlYyk7CisJCQlvdXQyX2NvbXBsZXRlID0gd204MzUwX291dDJfcmFtcF9zdGVwKHdtODM1MF9kYXRhKTsKIAogCQkvKiByYW1wIGZpbmlzaGVkID8gKi8KIAkJaWYgKG91dDFfY29tcGxldGUgJiYgb3V0Ml9jb21wbGV0ZSkKQEAgLTI4Myw3ICsyODAsNyBAQAogCQlvdXQtPnJhbXAgPSBXTTgzNTBfUkFNUF9VUDsKIAkJb3V0LT5hY3RpdmUgPSAxOwogCi0JCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29kZWMtPmRhcG0uZGVsYXllZF93b3JrLAorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJndtODM1MF9kYXRhLT5wZ2Ffd29yaywKIAkJCQkgICAgICBtc2Vjc190b19qaWZmaWVzKDEpKTsKIAkJYnJlYWs7CiAKQEAgLTI5MSw3ICsyODgsNyBAQAogCQlvdXQtPnJhbXAgPSBXTTgzNTBfUkFNUF9ET1dOOwogCQlvdXQtPmFjdGl2ZSA9IDA7CiAKLQkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjb2RlYy0+ZGFwbS5kZWxheWVkX3dvcmssCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmd204MzUwX2RhdGEtPnBnYV93b3JrLAogCQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoMSkpOwogCQlicmVhazsKIAl9CkBAIC0xNDkyLDcgKzE0ODksNyBAQAogCS8qIFB1dCB0aGUgY29kZWMgaW50byByZXNldCBpZiBpdCB3YXNuJ3QgYWxyZWFkeSAqLwogCXdtODM1MF9jbGVhcl9iaXRzKHdtODM1MCwgV004MzUwX1BPV0VSX01HTVRfNSwgV004MzUwX0NPREVDX0VOQSk7CiAKLQlJTklUX0RFTEFZRURfV09SSygmY29kZWMtPmRhcG0uZGVsYXllZF93b3JrLCB3bTgzNTBfcGdhX3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5wZ2Ffd29yaywgd204MzUwX3BnYV93b3JrKTsKIAlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+aHBsLndvcmssIHdtODM1MF9ocGxfd29yayk7CiAJSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmhwci53b3JrLCB3bTgzNTBfaHByX3dvcmspOwogCkBAIC0xNTc4LDcgKzE1NzUsNyBAQAogCiAJLyogaWYgdGhlcmUgd2FzIGFueSB3b3JrIHdhaXRpbmcgdGhlbiB3ZSBydW4gaXQgbm93IGFuZAogCSAqIHdhaXQgZm9yIGl0cyBjb21wbGV0aW9uICovCi0JZmx1c2hfZGVsYXllZF93b3JrKCZjb2RlYy0+ZGFwbS5kZWxheWVkX3dvcmspOworCWZsdXNoX2RlbGF5ZWRfd29yaygmcHJpdi0+cGdhX3dvcmspOwogCiAJd204MzUwX2NsZWFyX2JpdHMod204MzUwLCBXTTgzNTBfUE9XRVJfTUdNVF81LCBXTTgzNTBfQ09ERUNfRU5BKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzMxLmMKaW5kZXggMDk4YzE0My4uMjI0NWI2YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3MzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODczMS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KQEAgLTQ1LDYgKzQ2LDcgQEAKIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IHdtODczMV9wcml2IHsKIAlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisJc3RydWN0IGNsayAqbWNsazsKIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tXTTg3MzFfTlVNX1NVUFBMSUVTXTsKIAljb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgKmNvbnN0cmFpbnRzOwogCXVuc2lnbmVkIGludCBzeXNjbGs7CkBAIC0xMjUsNyArMTI3LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3Qgd204NzMxX3ByaXYgKndtODczMSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHdtODczMS0+ZGVlbXBoOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gd204NzMxLT5kZWVtcGg7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEzNSw3ICsxMzcsNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCB3bTg3MzFfcHJpdiAqd204NzMxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCWludCByZXQgPSAwOwogCiAJaWYgKGRlZW1waCA+IDEpCkBAIC0zOTAsNiArMzkyLDggQEAKIAlzd2l0Y2ggKGNsa19pZCkgewogCWNhc2UgV004NzMxX1NZU0NMS19YVEFMOgogCWNhc2UgV004NzMxX1NZU0NMS19NQ0xLOgorCQlpZiAod204NzMxLT5tY2xrICYmIGNsa19zZXRfcmF0ZSh3bTg3MzEtPm1jbGssIGZyZXEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXdtODczMS0+c3lzY2xrX3R5cGUgPSBjbGtfaWQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC00OTEsNiArNDk1LDggQEAKIAogCXN3aXRjaCAobGV2ZWwpIHsKIAljYXNlIFNORF9TT0NfQklBU19PTjoKKwkJaWYgKHdtODczMS0+bWNsaykKKwkJCWNsa19wcmVwYXJlX2VuYWJsZSh3bTg3MzEtPm1jbGspOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgogCQlicmVhazsKQEAgLTUwOSw2ICs1MTUsOCBAQAogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3MzFfUFdSLCByZWcgfCAweDAwNDApOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19PRkY6CisJCWlmICh3bTg3MzEtPm1jbGspCisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUod204NzMxLT5tY2xrKTsKIAkJc25kX3NvY193cml0ZShjb2RlYywgV004NzMxX1BXUiwgMHhmZmZmKTsKIAkJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtODczMS0+c3VwcGxpZXMpLAogCQkJCSAgICAgICB3bTg3MzEtPnN1cHBsaWVzKTsKQEAgLTY2Nyw2ICs2NzUsMTkgQEAKIAlpZiAod204NzMxID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJd204NzMxLT5tY2xrID0gZGV2bV9jbGtfZ2V0KCZzcGktPmRldiwgIm1jbGsiKTsKKwlpZiAoSVNfRVJSKHdtODczMS0+bWNsaykpIHsKKwkJcmV0ID0gUFRSX0VSUih3bTg3MzEtPm1jbGspOworCQlpZiAocmV0ID09IC1FTk9FTlQpIHsKKwkJCXdtODczMS0+bWNsayA9IE5VTEw7CisJCQlkZXZfd2Fybigmc3BpLT5kZXYsICJBc3N1bWluZyBzdGF0aWMgTUNMS1xuIik7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKCZzcGktPmRldiwgIkZhaWxlZCB0byBnZXQgTUNMSzogJWRcbiIsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKIAltdXRleF9pbml0KCZ3bTg3MzEtPmxvY2spOwogCiAJd204NzMxLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZ3bTg3MzFfcmVnbWFwKTsKQEAgLTcxOCw2ICs3MzksMTkgQEAKIAlpZiAod204NzMxID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJd204NzMxLT5tY2xrID0gZGV2bV9jbGtfZ2V0KCZpMmMtPmRldiwgIm1jbGsiKTsKKwlpZiAoSVNfRVJSKHdtODczMS0+bWNsaykpIHsKKwkJcmV0ID0gUFRSX0VSUih3bTg3MzEtPm1jbGspOworCQlpZiAocmV0ID09IC1FTk9FTlQpIHsKKwkJCXdtODczMS0+bWNsayA9IE5VTEw7CisJCQlkZXZfd2FybigmaTJjLT5kZXYsICJBc3N1bWluZyBzdGF0aWMgTUNMS1xuIik7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKCZpMmMtPmRldiwgIkZhaWxlZCB0byBnZXQgTUNMSzogJWRcbiIsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKIAltdXRleF9pbml0KCZ3bTg3MzEtPmxvY2spOwogCiAJd204NzMxLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhpMmMsICZ3bTg3MzFfcmVnbWFwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc0MS5jCmluZGV4IDMxYmI0ODAuLjllNzFjNzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204NzQxLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NDEuYwpAQCAtMTIzLDcgKzEyMyw3IEBACiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzExMjg5W10gPSB7Ci0JNDQxMDAsIDg4MjM1LAorCTQ0MTAwLCA4ODIwMCwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfMTEyODkgPSB7CkBAIC0xNTAsNyArMTUwLDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcmF0ZXNfMTY5MzRbXSA9IHsKLQk0NDEwMCwgODgyMzUsCisJNDQxMDAsIDg4MjAwLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c18xNjkzNCA9IHsKQEAgLTE2OCw3ICsxNjgsNyBAQAogfTsKIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCByYXRlc18yMjU3OVtdID0gewotCTQ0MTAwLCA4ODIzNSwgMTc2NDAwMAorCTQ0MTAwLCA4ODIwMCwgMTc2NDAwCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzIyNTc5ID0gewpAQCAtMTg2LDcgKzE4Niw3IEBACiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHJhdGVzXzM2ODY0W10gPSB7Ci0JNDgwMDAsIDk2MDAwLCAxOTIwMAorCTQ4MDAwLCA5NjAwMCwgMTkyMDAwCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzM2ODY0ID0gewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204NzUzLmMKaW5kZXggMjFjYTNhOS4uYzUwYTU5NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg3NTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc1My5jCkBAIC0xNTMsNiArMTUzLDcgQEAKIAl1bnNpZ25lZCBpbnQgaGlmaV9mbXQ7CiAKIAlpbnQgZGFpX2Z1bmM7CisJc3RydWN0IGRlbGF5ZWRfd29yayBjaGFyZ2Vfd29yazsKIH07CiAKICNkZWZpbmUgd204NzUzX3Jlc2V0KGMpIHNuZF9zb2Nfd3JpdGUoYywgV004NzUzX1JFU0VULCAwKQpAQCAtMTMyNiw5ICsxMzI3LDE5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHdtODc1M19jaGFyZ2Vfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHdtODc1M19wcml2ICp3bTg3NTMgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHdtODc1M19wcml2LCBjaGFyZ2Vfd29yay53b3JrKTsKKworCS8qIFNldCB0byA1MDBrICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHdtODc1My0+cmVnbWFwLCBXTTg3NTNfUFdSMSwgMHgwMTgwLCAweDAxMDApOworfQorCiBzdGF0aWMgaW50IHdtODc1M19zZXRfYmlhc19sZXZlbChzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMsCiAJCQkJIGVudW0gc25kX3NvY19iaWFzX2xldmVsIGxldmVsKQogeworCXN0cnVjdCB3bTg3NTNfcHJpdiAqd204NzUzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJdTE2IHB3cl9yZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODc1M19QV1IxKSAmIDB4ZmUzZTsKIAogCXN3aXRjaCAobGV2ZWwpIHsKQEAgLTEzMzcsMTQgKzEzNDgsMjIgQEAKIAkJc25kX3NvY193cml0ZShjb2RlYywgV004NzUzX1BXUjEsIHB3cl9yZWcgfCAweDAwYzApOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgotCQkvKiBzZXQgdm1pZCB0byA1ayBmb3IgcXVpY2sgcG93ZXIgdXAgKi8KLQkJc25kX3NvY193cml0ZShjb2RlYywgV004NzUzX1BXUjEsIHB3cl9yZWcgfCAweDAxYzEpOworCQkvKiBXYWl0IHVudGlsIGZ1bGx5IGNoYXJnZWQgKi8KKwkJZmx1c2hfZGVsYXllZF93b3JrKCZ3bTg3NTMtPmNoYXJnZV93b3JrKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJLyogbXV0ZSBkYWMgYW5kIHNldCB2bWlkIHRvIDUwMGssIGVuYWJsZSBWUkVGICovCi0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODc1M19QV1IxLCBwd3JfcmVnIHwgMHgwMTQxKTsKKwkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgeworCQkJLyogc2V0IHZtaWQgdG8gNWsgZm9yIHF1aWNrIHBvd2VyIHVwICovCisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3NTNfUFdSMSwgcHdyX3JlZyB8IDB4MDFjMSk7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJndtODc1My0+Y2hhcmdlX3dvcmssCisJCQkJbXNlY3NfdG9famlmZmllcyhjYXBzX2NoYXJnZSkpOworCQl9IGVsc2UgeworCQkJLyogbXV0ZSBkYWMgYW5kIHNldCB2bWlkIHRvIDUwMGssIGVuYWJsZSBWUkVGICovCisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3NTNfUFdSMSwgcHdyX3JlZyB8IDB4MDE0MSk7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgorCQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJndtODc1My0+Y2hhcmdlX3dvcmspOwogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg3NTNfUFdSMSwgMHgwMDAxKTsKIAkJYnJlYWs7CiAJfQpAQCAtMTQyOCwzOCArMTQ0NywxMiBAQAogfSwKIH07CiAKLXN0YXRpYyB2b2lkIHdtODc1M193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0LAotCQkJICAgICBkZWxheWVkX3dvcmsud29yayk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKGRhcG0pOwotCXdtODc1M19zZXRfYmlhc19sZXZlbChjb2RlYywgZGFwbS0+Ymlhc19sZXZlbCk7Ci19Ci0KLXN0YXRpYyBpbnQgd204NzUzX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXdtODc1M19zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgd204NzUzX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCiB7CiAJc3RydWN0IHdtODc1M19wcml2ICp3bTg3NTMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAogCXJlZ2NhY2hlX3N5bmMod204NzUzLT5yZWdtYXApOwogCi0Jd204NzUzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7Ci0KLQkvKiBjaGFyZ2Ugd204NzUzIGNhcHMgKi8KLQlpZiAoY29kZWMtPmRhcG0uc3VzcGVuZF9iaWFzX2xldmVsID09IFNORF9TT0NfQklBU19PTikgewotCQl3bTg3NTNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19QUkVQQVJFKTsKLQkJY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9IFNORF9TT0NfQklBU19PTjsKLQkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9wb3dlcl9lZmZpY2llbnRfd3EsCi0JCQkJICAgJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywKLQkJCQkgICBtc2Vjc190b19qaWZmaWVzKGNhcHNfY2hhcmdlKSk7Ci0JfQotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE0NjgsNyArMTQ2MSw3IEBACiAJc3RydWN0IHdtODc1M19wcml2ICp3bTg3NTMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAlpbnQgcmV0OwogCi0JSU5JVF9ERUxBWUVEX1dPUksoJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywgd204NzUzX3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZ3bTg3NTMtPmNoYXJnZV93b3JrLCB3bTg3NTNfY2hhcmdlX3dvcmspOwogCiAJcmV0ID0gd204NzUzX3Jlc2V0KGNvZGVjKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtMTQ3NiwxNCArMTQ2OSw4IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0Jd204NzUzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfU1RBTkRCWSk7CiAJd204NzUzLT5kYWlfZnVuYyA9IDA7CiAKLQkvKiBjaGFyZ2Ugb3V0cHV0IGNhcHMgKi8KLQl3bTg3NTNfc2V0X2JpYXNfbGV2ZWwoY29kZWMsIFNORF9TT0NfQklBU19QUkVQQVJFKTsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywKLQkJCSAgICAgIG1zZWNzX3RvX2ppZmZpZXMoY2Fwc19jaGFyZ2UpKTsKLQogCS8qIHNldCB0aGUgdXBkYXRlIGJpdHMgKi8KIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg3NTNfTERBQywgMHgwMTAwLCAweDAxMDApOwogCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODc1M19SREFDLCAweDAxMDAsIDB4MDEwMCk7CkBAIC0xNDk5LDIxICsxNDg2LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIHBvd2VyIGRvd24gY2hpcCAqLwotc3RhdGljIGludCB3bTg3NTNfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlmbHVzaF9kZWxheWVkX3dvcmsoJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yayk7Ci0Jd204NzUzX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY29kZWNfZHJpdmVyIHNvY19jb2RlY19kZXZfd204NzUzID0gewogCS5wcm9iZSA9CXdtODc1M19wcm9iZSwKLQkucmVtb3ZlID0Jd204NzUzX3JlbW92ZSwKLQkuc3VzcGVuZCA9CXdtODc1M19zdXNwZW5kLAogCS5yZXN1bWUgPQl3bTg3NTNfcmVzdW1lLAogCS5zZXRfYmlhc19sZXZlbCA9IHdtODc1M19zZXRfYmlhc19sZXZlbCwKKwkuc3VzcGVuZF9iaWFzX29mZiA9IHRydWUsCiAKIAkuY29udHJvbHMgPSB3bTg3NTNfc25kX2NvbnRyb2xzLAogCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKHdtODc1M19zbmRfY29udHJvbHMpLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQtaTJjLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC1pMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTk2ZjVmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg4MDQtaTJjLmMKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIHdtODgwNC1pMmMuYyAgLS0gIFdNODgwNCBTL1BESUYgdHJhbnNjZWl2ZXIgZHJpdmVyIC0gSTJDCisgKgorICogQ29weXJpZ2h0IDIwMTUgQ2lycnVzIExvZ2ljIEluYworICoKKyAqIEF1dGhvcjogQ2hhcmxlcyBLZWVwYXggPGNrZWVwYXhAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworI2luY2x1ZGUgIndtODgwNC5oIgorCitzdGF0aWMgaW50IHdtODgwNF9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOworCisJcmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmd204ODA0X3JlZ21hcF9jb25maWcpOworCWlmIChJU19FUlIocmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIocmVnbWFwKTsKKworCXJldHVybiB3bTg4MDRfcHJvYmUoJmkyYy0+ZGV2LCByZWdtYXApOworfQorCitzdGF0aWMgaW50IHdtODgwNF9pMmNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICppMmMpCit7CisJd204ODA0X3JlbW92ZSgmaTJjLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgd204ODA0X2kyY19pZFtdID0geworCXsgIndtODgwNCIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgd204ODA0X2kyY19pZCk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODgwNF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODgwNCIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd204ODA0X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHdtODgwNF9pMmNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIndtODgwNCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSAmd204ODA0X3BtLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg4MDRfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSB3bTg4MDRfaTJjX3Byb2JlLAorCS5yZW1vdmUgPSB3bTg4MDRfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSB3bTg4MDRfaTJjX2lkCit9OworCittb2R1bGVfaTJjX2RyaXZlcih3bTg4MDRfaTJjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBXTTg4MDQgZHJpdmVyIC0gSTJDIik7CitNT0RVTEVfQVVUSE9SKCJDaGFybGVzIEtlZXBheCA8Y2tlZXBheEBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC1zcGkuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwN2EzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC1zcGkuYwpAQCAtMCwwICsxLDU3IEBACisvKgorICogd204ODA0LXNwaS5jICAtLSAgV004ODA0IFMvUERJRiB0cmFuc2NlaXZlciBkcml2ZXIgLSBTUEkKKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBDaXJydXMgTG9naWMgSW5jCisgKgorICogQXV0aG9yOiBDaGFybGVzIEtlZXBheCA8Y2tlZXBheEBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KKworI2luY2x1ZGUgIndtODgwNC5oIgorCitzdGF0aWMgaW50IHdtODgwNF9zcGlfcHJvYmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgcmVnbWFwICpyZWdtYXA7CisKKwlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZ3bTg4MDRfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihyZWdtYXApKQorCQlyZXR1cm4gUFRSX0VSUihyZWdtYXApOworCisJcmV0dXJuIHdtODgwNF9wcm9iZSgmc3BpLT5kZXYsIHJlZ21hcCk7Cit9CisKK3N0YXRpYyBpbnQgd204ODA0X3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwl3bTg4MDRfcmVtb3ZlKCZzcGktPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHdtODgwNF9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAid2xmLHdtODgwNCIsIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgd204ODA0X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdtODgwNF9zcGlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIndtODgwNCIsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSAmd204ODA0X3BtLAorCQkub2ZfbWF0Y2hfdGFibGUgPSB3bTg4MDRfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSB3bTg4MDRfc3BpX3Byb2JlLAorCS5yZW1vdmUgPSB3bTg4MDRfc3BpX3JlbW92ZQorfTsKKworbW9kdWxlX3NwaV9kcml2ZXIod204ODA0X3NwaV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgV004ODA0IGRyaXZlciAtIFNQSSIpOworTU9EVUxFX0FVVEhPUigiQ2hhcmxlcyBLZWVwYXggPGNrZWVwYXhAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmMKaW5kZXggYjJiMGU2OC4uMWU0MDNmNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg4MDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5jCkBAIC0xMywxMiArMTMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KQEAgLTI3LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvdGx2Lmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhcG0uaD4KIAogI2luY2x1ZGUgIndtODgwNC5oIgogCkBAIC02MCwxOCArNjAsMjMgQEAKIH07CiAKIHN0cnVjdCB3bTg4MDRfcHJpdiB7CisJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCByZWdtYXAgKnJlZ21hcDsKIAlzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSBzdXBwbGllc1tXTTg4MDRfTlVNX1NVUFBMSUVTXTsKIAlzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZGlzYWJsZV9uYltXTTg4MDRfTlVNX1NVUFBMSUVTXTsKIAlpbnQgbWNsa19kaXY7Ci19OwogCi1zdGF0aWMgaW50IHR4c3JjX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCk7CisJc3RydWN0IGdwaW9fZGVzYyAqcmVzZXQ7CisKKwlpbnQgYWlmX3B3cjsKK307CiAKIHN0YXRpYyBpbnQgdHhzcmNfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAogCQkgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKTsKIAorc3RhdGljIGludCB3bTg4MDRfYWlmX2V2ZW50KHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQkJICAgIHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLCBpbnQgZXZlbnQpOworCiAvKgogICogV2UgY2FuJ3QgdXNlIHRoZSBzYW1lIG5vdGlmaWVyIGJsb2NrIGZvciBtb3JlIHRoYW4gb25lIHN1cHBseSBhbmQKICAqIHRoZXJlJ3Mgbm8gd2F5IEkgY2FuIHNlZSB0byBnZXQgZnJvbSBhIGNhbGxiYWNrIHRvIHRoZSBjYWxsZXIKQEAgLTkzLDI2ICs5OCw2MiBAQAogV004ODA0X1JFR1VMQVRPUl9FVkVOVCgxKQogCiBzdGF0aWMgY29uc3QgY2hhciAqdHhzcmNfdGV4dFtdID0geyAiUy9QRElGIFJYIiwgIkFJRiIgfTsKLXN0YXRpYyBTT0NfRU5VTV9TSU5HTEVfRVhUX0RFQ0wodHhzcmMsIHR4c3JjX3RleHQpOworc3RhdGljIGNvbnN0IFNPQ19FTlVNX1NJTkdMRV9ERUNMKHR4c3JjLCBXTTg4MDRfU1BEVFg0LCA2LCB0eHNyY190ZXh0KTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODgwNF9zbmRfY29udHJvbHNbXSA9IHsKLQlTT0NfRU5VTV9FWFQoIklucHV0IFNvdXJjZSIsIHR4c3JjLCB0eHNyY19nZXQsIHR4c3JjX3B1dCksCi0JU09DX1NJTkdMRSgiVFggUGxheWJhY2sgU3dpdGNoIiwgV004ODA0X1BXUkROLCAyLCAxLCAxKSwKLQlTT0NfU0lOR0xFKCJBSUYgUGxheWJhY2sgU3dpdGNoIiwgV004ODA0X1BXUkROLCA0LCAxLCAxKQorc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHdtODgwNF90eF9zb3VyY2VfbXV4W10gPSB7CisJU09DX0RBUE1fRU5VTV9FWFQoIklucHV0IFNvdXJjZSIsIHR4c3JjLAorCQkJICBzbmRfc29jX2RhcG1fZ2V0X2VudW1fZG91YmxlLCB0eHNyY19wdXQpLAogfTsKIAotc3RhdGljIGludCB0eHNyY19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCXVuc2lnbmVkIGludCBzcmM7CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204ODA0X2RhcG1fd2lkZ2V0c1tdID0geworU05EX1NPQ19EQVBNX09VVFBVVCgiU1BESUYgT3V0IiksCitTTkRfU09DX0RBUE1fSU5QVVQoIlNQRElGIEluIiksCiAKLQljb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwotCXNyYyA9IHNuZF9zb2NfcmVhZChjb2RlYywgV004ODA0X1NQRFRYNCk7Ci0JaWYgKHNyYyAmIDB4NDApCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMTsKLQllbHNlCi0JCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMDsKK1NORF9TT0NfREFQTV9QR0EoIlNQRElGVFgiLCBXTTg4MDRfUFdSRE4sIDIsIDEsIE5VTEwsIDApLAorU05EX1NPQ19EQVBNX1BHQSgiU1BESUZSWCIsIFdNODgwNF9QV1JETiwgMSwgMSwgTlVMTCwgMCksCisKK1NORF9TT0NfREFQTV9NVVgoIlR4IFNvdXJjZSIsIFNORF9TT0NfTk9QTSwgNiwgMCwgd204ODA0X3R4X3NvdXJjZV9tdXgpLAorCitTTkRfU09DX0RBUE1fQUlGX09VVF9FKCJBSUZUWCIsIE5VTEwsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCwgd204ODA0X2FpZl9ldmVudCwKKwkJICAgICAgIFNORF9TT0NfREFQTV9QT1NUX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNRCksCitTTkRfU09DX0RBUE1fQUlGX0lOX0UoIkFJRlJYIiwgTlVMTCwgMCwgU05EX1NPQ19OT1BNLCAwLCAwLCB3bTg4MDRfYWlmX2V2ZW50LAorCQkgICAgICBTTkRfU09DX0RBUE1fUE9TVF9QTVUgfCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgd204ODA0X2RhcG1fcm91dGVzW10gPSB7CisJeyAiQUlGUlgiLCBOVUxMLCAiUGxheWJhY2siIH0sCisJeyAiVHggU291cmNlIiwgIkFJRiIsICJBSUZSWCIgfSwKKworCXsgIlNQRElGUlgiLCBOVUxMLCAiU1BESUYgSW4iIH0sCisJeyAiVHggU291cmNlIiwgIlMvUERJRiBSWCIsICJTUERJRlJYIiB9LAorCisJeyAiU1BESUZUWCIsIE5VTEwsICJUeCBTb3VyY2UiIH0sCisJeyAiU1BESUYgT3V0IiwgTlVMTCwgIlNQRElGVFgiIH0sCisKKwl7ICJBSUZUWCIsIE5VTEwsICJTUERJRlJYIiB9LAorCXsgIkNhcHR1cmUiLCBOVUxMLCAiQUlGVFgiIH0sCit9OworCitzdGF0aWMgaW50IHdtODgwNF9haWZfZXZlbnQoc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCQkgICAgc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsIGludCBldmVudCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2RhcG1fdG9fY29kZWMody0+ZGFwbSk7CisJc3RydWN0IHdtODgwNF9wcml2ICp3bTg4MDQgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFNORF9TT0NfREFQTV9QT1NUX1BNVToKKwkJLyogcG93ZXIgdXAgdGhlIGFpZiAqLworCQlpZiAoIXdtODgwNC0+YWlmX3B3cikKKwkJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODgwNF9QV1JETiwgMHgxMCwgMHgwKTsKKwkJd204ODA0LT5haWZfcHdyKys7CisJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQVBNX1BPU1RfUE1EOgorCQkvKiBwb3dlciBkb3duIG9ubHkgYm90aCBwYXRocyBhcmUgZGlzYWJsZWQgKi8KKwkJd204ODA0LT5haWZfcHdyLS07CisJCWlmICghd204ODA0LT5haWZfcHdyKQorCQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004ODA0X1BXUkROLCAweDEwLCAweDEwKTsKKwkJYnJlYWs7CisJfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjAsNDggKzE2MSwzMyBAQAogc3RhdGljIGludCB0eHNyY19wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCiAJCSAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOwotCXVuc2lnbmVkIGludCBzcmMsIHR4cHdyOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV9rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOworCXN0cnVjdCBzb2NfZW51bSAqZSA9IChzdHJ1Y3Qgc29jX2VudW0gKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwl1bnNpZ25lZCBpbnQgdmFsID0gdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA8PCBlLT5zaGlmdF9sOworCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCBlLT5zaGlmdF9sOworCXVuc2lnbmVkIGludCB0eHB3cjsKIAotCWNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7Ci0KLQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gIT0gMAotCQkJJiYgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gIT0gMSkKKwlpZiAodmFsICE9IDAgJiYgdmFsICE9IG1hc2spCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc3JjID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg4MDRfU1BEVFg0KTsKLQlzd2l0Y2ggKChzcmMgJiAweDQwKSA+PiA2KSB7Ci0JY2FzZSAwOgotCQlpZiAoIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKQotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotCWNhc2UgMToKLQkJaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKQotCQkJcmV0dXJuIDA7Ci0JCWJyZWFrOworCXNuZF9zb2NfZGFwbV9tdXRleF9sb2NrKGRhcG0pOworCisJaWYgKHNuZF9zb2NfdGVzdF9iaXRzKGNvZGVjLCBlLT5yZWcsIG1hc2ssIHZhbCkpIHsKKwkJLyogc2F2ZSB0aGUgY3VycmVudCBwb3dlciBzdGF0ZSBvZiB0aGUgdHJhbnNtaXR0ZXIgKi8KKwkJdHhwd3IgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODgwNF9QV1JETikgJiAweDQ7CisKKwkJLyogcG93ZXIgZG93biB0aGUgdHJhbnNtaXR0ZXIgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004ODA0X1BXUkROLCAweDQsIDB4NCk7CisKKwkJLyogc2V0IHRoZSB0eCBzb3VyY2UgKi8KKwkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgZS0+cmVnLCBtYXNrLCB2YWwpOworCisJCS8qIHJlc3RvcmUgdGhlIHRyYW5zbWl0dGVyJ3MgY29uZmlndXJhdGlvbiAqLworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg4MDRfUFdSRE4sIDB4NCwgdHhwd3IpOwogCX0KIAotCS8qIHNhdmUgdGhlIGN1cnJlbnQgcG93ZXIgc3RhdGUgb2YgdGhlIHRyYW5zbWl0dGVyICovCi0JdHhwd3IgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODgwNF9QV1JETikgJiAweDQ7Ci0JLyogcG93ZXIgZG93biB0aGUgdHJhbnNtaXR0ZXIgKi8KLQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg4MDRfUFdSRE4sIDB4NCwgMHg0KTsKLQkvKiBzZXQgdGhlIHR4IHNvdXJjZSAqLwotCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODgwNF9TUERUWDQsIDB4NDAsCi0JCQkgICAgdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPDwgNik7Ci0KLQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQkJLyogcG93ZXIgZG93biB0aGUgcmVjZWl2ZXIgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004ODA0X1BXUkROLCAweDIsIDB4Mik7Ci0JCS8qIHBvd2VyIHVwIHRoZSBBSUYgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004ODA0X1BXUkROLCAweDEwLCAwKTsKLQl9IGVsc2UgewotCQkvKiBkb24ndCBwb3dlciBkb3duIHRoZSBBSUYgLS0gbWF5IGJlIHVzZWQgYXMgYW4gb3V0cHV0ICovCi0JCS8qIHBvd2VyIHVwIHRoZSByZWNlaXZlciAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg4MDRfUFdSRE4sIDB4MiwgMCk7Ci0JfQotCi0JLyogcmVzdG9yZSB0aGUgdHJhbnNtaXR0ZXIncyBjb25maWd1cmF0aW9uICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004ODA0X1BXUkROLCAweDQsIHR4cHdyKTsKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xODUsOSArMjExLDkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgd204ODA0X3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKK3N0YXRpYyBpbnQgd204ODA0X3NvZnRfcmVzZXQoc3RydWN0IHdtODgwNF9wcml2ICp3bTg4MDQpCiB7Ci0JcmV0dXJuIHNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODgwNF9SU1RfREVWSUQxLCAweDApOworCXJldHVybiByZWdtYXBfd3JpdGUod204ODA0LT5yZWdtYXAsIFdNODgwNF9SU1RfREVWSUQxLCAweDApOwogfQogCiBzdGF0aWMgaW50IHdtODgwNF9zZXRfZm10KHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCB1bnNpZ25lZCBpbnQgZm10KQpAQCAtMzc5LDE5ICs0MDUsMTkgQEAKIAkJCSAgaW50IHNvdXJjZSwgdW5zaWduZWQgaW50IGZyZXFfaW4sCiAJCQkgIHVuc2lnbmVkIGludCBmcmVxX291dCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gZGFpLT5jb2RlYzsKKwlzdHJ1Y3Qgd204ODA0X3ByaXYgKndtODgwNCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOworCWJvb2wgY2hhbmdlOwogCi0JY29kZWMgPSBkYWktPmNvZGVjOwogCWlmICghZnJlcV9pbiB8fCAhZnJlcV9vdXQpIHsKIAkJLyogZGlzYWJsZSB0aGUgUExMICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODgwNF9QV1JETiwgMHgxLCAweDEpOwotCQlyZXR1cm4gMDsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzX2NoZWNrKHdtODgwNC0+cmVnbWFwLCBXTTg4MDRfUFdSRE4sCisJCQkJCSAweDEsIDB4MSwgJmNoYW5nZSk7CisJCWlmIChjaGFuZ2UpCisJCQlwbV9ydW50aW1lX3B1dCh3bTg4MDQtPmRldik7CiAJfSBlbHNlIHsKIAkJaW50IHJldDsKIAkJc3RydWN0IHBsbF9kaXYgcGxsX2RpdjsKLQkJc3RydWN0IHdtODgwNF9wcml2ICp3bTg4MDQ7Ci0KLQkJd204ODA0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKIAkJcmV0ID0gcGxsX2ZhY3RvcnMoJnBsbF9kaXYsIGZyZXFfb3V0LCBmcmVxX2luLAogCQkJCSAgd204ODA0LT5tY2xrX2Rpdik7CkBAIC0zOTksNyArNDI1LDEwIEBACiAJCQlyZXR1cm4gcmV0OwogCiAJCS8qIHBvd2VyIGRvd24gdGhlIFBMTCBiZWZvcmUgcmVwcm9ncmFtbWluZyBpdCAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg4MDRfUFdSRE4sIDB4MSwgMHgxKTsKKwkJcmVnbWFwX3VwZGF0ZV9iaXRzX2NoZWNrKHdtODgwNC0+cmVnbWFwLCBXTTg4MDRfUFdSRE4sCisJCQkJCSAweDEsIDB4MSwgJmNoYW5nZSk7CisJCWlmICghY2hhbmdlKQorCQkJcG1fcnVudGltZV9nZXRfc3luYyh3bTg4MDQtPmRldik7CiAKIAkJLyogc2V0IFBMTE4gYW5kIFBSRVNDQUxFICovCiAJCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODgwNF9QTEw0LCAweGYgfCAweDEwLApAQCAtNDc3LDE0MSArNTA2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bTg4MDRfc2V0X2JpYXNfbGV2ZWwoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLAotCQkJCSBlbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCB3bTg4MDRfcHJpdiAqd204ODA0OwotCi0Jd204ODA0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0Jc3dpdGNoIChsZXZlbCkgewotCWNhc2UgU05EX1NPQ19CSUFTX09OOgotCQlicmVhazsKLQljYXNlIFNORF9TT0NfQklBU19QUkVQQVJFOgotCQkvKiBwb3dlciB1cCB0aGUgT1NDIGFuZCB0aGUgUExMICovCi0JCXNuZF9zb2NfdXBkYXRlX2JpdHMoY29kZWMsIFdNODgwNF9QV1JETiwgMHg5LCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0JJQVNfU1RBTkRCWToKLQkJaWYgKGNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPT0gU05EX1NPQ19CSUFTX09GRikgewotCQkJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUod204ODA0LT5zdXBwbGllcyksCi0JCQkJCQkgICAgd204ODA0LT5zdXBwbGllcyk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJZGV2X2Vycihjb2RlYy0+ZGV2LAotCQkJCQkiRmFpbGVkIHRvIGVuYWJsZSBzdXBwbGllczogJWRcbiIsCi0JCQkJCXJldCk7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJCXJlZ2NhY2hlX3N5bmMod204ODA0LT5yZWdtYXApOwotCQl9Ci0JCS8qIHBvd2VyIGRvd24gdGhlIE9TQyBhbmQgdGhlIFBMTCAqLwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg4MDRfUFdSRE4sIDB4OSwgMHg5KTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRfU09DX0JJQVNfT0ZGOgotCQkvKiBwb3dlciBkb3duIHRoZSBPU0MgYW5kIHRoZSBQTEwgKi8KLQkJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004ODA0X1BXUkROLCAweDksIDB4OSk7Ci0JCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKSwKLQkJCQkgICAgICAgd204ODA0LT5zdXBwbGllcyk7Ci0JCWJyZWFrOwotCX0KLQotCWNvZGVjLT5kYXBtLmJpYXNfbGV2ZWwgPSBsZXZlbDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3bTg4MDRfcmVtb3ZlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgd204ODA0X3ByaXYgKndtODgwNDsKLQlpbnQgaTsKLQotCXdtODgwNCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204ODA0LT5zdXBwbGllcyk7ICsraSkKLQkJcmVndWxhdG9yX3VucmVnaXN0ZXJfbm90aWZpZXIod204ODA0LT5zdXBwbGllc1tpXS5jb25zdW1lciwKLQkJCQkJICAgICAgJndtODgwNC0+ZGlzYWJsZV9uYltpXSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd204ODA0X3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgd204ODA0X3ByaXYgKndtODgwNDsKLQlpbnQgaSwgaWQxLCBpZDIsIHJldDsKLQotCXdtODgwNCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204ODA0LT5zdXBwbGllcyk7IGkrKykKLQkJd204ODA0LT5zdXBwbGllc1tpXS5zdXBwbHkgPSB3bTg4MDRfc3VwcGx5X25hbWVzW2ldOwotCi0JcmV0ID0gZGV2bV9yZWd1bGF0b3JfYnVsa19nZXQoY29kZWMtPmRldiwgQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKSwKLQkJCQkgd204ODA0LT5zdXBwbGllcyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBzdXBwbGllczogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jd204ODA0LT5kaXNhYmxlX25iWzBdLm5vdGlmaWVyX2NhbGwgPSB3bTg4MDRfcmVndWxhdG9yX2V2ZW50XzA7Ci0Jd204ODA0LT5kaXNhYmxlX25iWzFdLm5vdGlmaWVyX2NhbGwgPSB3bTg4MDRfcmVndWxhdG9yX2V2ZW50XzE7Ci0KLQkvKiBUaGlzIHNob3VsZCByZWFsbHkgYmUgbW92ZWQgaW50byB0aGUgcmVndWxhdG9yIGNvcmUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKTsgaSsrKSB7Ci0JCXJldCA9IHJlZ3VsYXRvcl9yZWdpc3Rlcl9ub3RpZmllcih3bTg4MDQtPnN1cHBsaWVzW2ldLmNvbnN1bWVyLAotCQkJCQkJICAmd204ODA0LT5kaXNhYmxlX25iW2ldKTsKLQkJaWYgKHJldCAhPSAwKSB7Ci0JCQlkZXZfZXJyKGNvZGVjLT5kZXYsCi0JCQkJIkZhaWxlZCB0byByZWdpc3RlciByZWd1bGF0b3Igbm90aWZpZXI6ICVkXG4iLAotCQkJCXJldCk7Ci0JCX0KLQl9Ci0KLQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKSwKLQkJCQkgICAgd204ODA0LT5zdXBwbGllcyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZDEgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODgwNF9SU1RfREVWSUQxKTsKLQlpZiAoaWQxIDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVhZCBkZXZpY2UgSUQ6ICVkXG4iLCBpZDEpOwotCQlyZXQgPSBpZDE7Ci0JCWdvdG8gZXJyX3JlZ19lbmFibGU7Ci0JfQotCi0JaWQyID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg4MDRfREVWSUQyKTsKLQlpZiAoaWQyIDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVhZCBkZXZpY2UgSUQ6ICVkXG4iLCBpZDIpOwotCQlyZXQgPSBpZDI7Ci0JCWdvdG8gZXJyX3JlZ19lbmFibGU7Ci0JfQotCi0JaWQyID0gKGlkMiA8PCA4KSB8IGlkMTsKLQotCWlmIChpZDIgIT0gMHg4ODA1KSB7Ci0JCWRldl9lcnIoY29kZWMtPmRldiwgIkludmFsaWQgZGV2aWNlIElEOiAlI3hcbiIsIGlkMik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JlZ19lbmFibGU7Ci0JfQotCi0JcmV0ID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg4MDRfREVWUkVWKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gcmVhZCBkZXZpY2UgcmV2aXNpb246ICVkXG4iLAotCQkJcmV0KTsKLQkJZ290byBlcnJfcmVnX2VuYWJsZTsKLQl9Ci0JZGV2X2luZm8oY29kZWMtPmRldiwgInJldmlzaW9uICVjXG4iLCByZXQgKyAnQScpOwotCi0JcmV0ID0gd204ODA0X3Jlc2V0KGNvZGVjKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjLT5kZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIGVycl9yZWdfZW5hYmxlOwotCX0KLQotCXJldHVybiAwOwotCi1lcnJfcmVnX2VuYWJsZToKLQlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUod204ODA0LT5zdXBwbGllcyksIHdtODgwNC0+c3VwcGxpZXMpOwotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYWlfb3BzIHdtODgwNF9kYWlfb3BzID0gewogCS5od19wYXJhbXMgPSB3bTg4MDRfaHdfcGFyYW1zLAogCS5zZXRfZm10ID0gd204ODA0X3NldF9mbXQsCkBAIC02NDksMjIgKzU0MywxNSBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2X3dtODgwNCA9IHsKLQkucHJvYmUgPSB3bTg4MDRfcHJvYmUsCi0JLnJlbW92ZSA9IHdtODgwNF9yZW1vdmUsCi0JLnNldF9iaWFzX2xldmVsID0gd204ODA0X3NldF9iaWFzX2xldmVsLAogCS5pZGxlX2JpYXNfb2ZmID0gdHJ1ZSwKIAotCS5jb250cm9scyA9IHdtODgwNF9zbmRfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204ODA0X3NuZF9jb250cm9scyksCisJLmRhcG1fd2lkZ2V0cyA9IHdtODgwNF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKHdtODgwNF9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IHdtODgwNF9kYXBtX3JvdXRlcywKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRSh3bTg4MDRfZGFwbV9yb3V0ZXMpLAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgd204ODA0X29mX21hdGNoW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJ3bGYsd204ODA0IiwgfSwKLQl7IH0KLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB3bTg4MDRfb2ZfbWF0Y2gpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgd204ODA0X3JlZ21hcF9jb25maWcgPSB7Citjb25zdCBzdHJ1Y3QgcmVnbWFwX2NvbmZpZyB3bTg4MDRfcmVnbWFwX2NvbmZpZyA9IHsKIAkucmVnX2JpdHMgPSA4LAogCS52YWxfYml0cyA9IDgsCiAKQEAgLTY3NSwxMjggKzU2MiwxNjkgQEAKIAkucmVnX2RlZmF1bHRzID0gd204ODA0X3JlZ19kZWZhdWx0cywKIAkubnVtX3JlZ19kZWZhdWx0cyA9IEFSUkFZX1NJWkUod204ODA0X3JlZ19kZWZhdWx0cyksCiB9OworRVhQT1JUX1NZTUJPTF9HUEwod204ODA0X3JlZ21hcF9jb25maWcpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLXN0YXRpYyBpbnQgd204ODA0X3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoraW50IHdtODgwNF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCkKIHsKIAlzdHJ1Y3Qgd204ODA0X3ByaXYgKndtODgwNDsKLQlpbnQgcmV0OworCXVuc2lnbmVkIGludCBpZDEsIGlkMjsKKwlpbnQgaSwgcmV0OwogCi0Jd204ODA0ID0gZGV2bV9remFsbG9jKCZzcGktPmRldiwgc2l6ZW9mICp3bTg4MDQsIEdGUF9LRVJORUwpOworCXdtODgwNCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqd204ODA0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF3bTg4MDQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jd204ODA0LT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X3NwaShzcGksICZ3bTg4MDRfcmVnbWFwX2NvbmZpZyk7Ci0JaWYgKElTX0VSUih3bTg4MDQtPnJlZ21hcCkpIHsKLQkJcmV0ID0gUFRSX0VSUih3bTg4MDQtPnJlZ21hcCk7CisJZGV2X3NldF9kcnZkYXRhKGRldiwgd204ODA0KTsKKworCXdtODgwNC0+ZGV2ID0gZGV2OworCXdtODgwNC0+cmVnbWFwID0gcmVnbWFwOworCisJd204ODA0LT5yZXNldCA9IGRldm1fZ3Bpb2RfZ2V0X29wdGlvbmFsKGRldiwgIndsZixyZXNldCIsCisJCQkJCQlHUElPRF9PVVRfTE9XKTsKKwlpZiAoSVNfRVJSKHdtODgwNC0+cmVzZXQpKSB7CisJCXJldCA9IFBUUl9FUlIod204ODA0LT5yZXNldCk7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCByZXNldCBsaW5lOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlzcGlfc2V0X2RydmRhdGEoc3BpLCB3bTg4MDQpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODgwNC0+c3VwcGxpZXMpOyBpKyspCisJCXdtODgwNC0+c3VwcGxpZXNbaV0uc3VwcGx5ID0gd204ODA0X3N1cHBseV9uYW1lc1tpXTsKIAotCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoJnNwaS0+ZGV2LAotCQkJCSAgICAgJnNvY19jb2RlY19kZXZfd204ODA0LCAmd204ODA0X2RhaSwgMSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdtODgwNF9zcGlfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvZGVjKCZzcGktPmRldik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bTg4MDRfc3BpX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJ3bTg4MDQiLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLm9mX21hdGNoX3RhYmxlID0gd204ODA0X29mX21hdGNoLAotCX0sCi0JLnByb2JlID0gd204ODA0X3NwaV9wcm9iZSwKLQkucmVtb3ZlID0gd204ODA0X3NwaV9yZW1vdmUKLX07Ci0jZW5kaWYKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKLXN0YXRpYyBpbnQgd204ODA0X2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjLAotCQkJICAgIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKLXsKLQlzdHJ1Y3Qgd204ODA0X3ByaXYgKndtODgwNDsKLQlpbnQgcmV0OwotCi0Jd204ODA0ID0gZGV2bV9remFsbG9jKCZpMmMtPmRldiwgc2l6ZW9mICp3bTg4MDQsIEdGUF9LRVJORUwpOwotCWlmICghd204ODA0KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXdtODgwNC0+cmVnbWFwID0gZGV2bV9yZWdtYXBfaW5pdF9pMmMoaTJjLCAmd204ODA0X3JlZ21hcF9jb25maWcpOwotCWlmIChJU19FUlIod204ODA0LT5yZWdtYXApKSB7Ci0JCXJldCA9IFBUUl9FUlIod204ODA0LT5yZWdtYXApOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWkyY19zZXRfY2xpZW50ZGF0YShpMmMsIHdtODgwNCk7Ci0KLQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZpMmMtPmRldiwKLQkJCQkgICAgICZzb2NfY29kZWNfZGV2X3dtODgwNCwgJndtODgwNF9kYWksIDEpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd204ODA0X2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmkyYykKLXsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29kZWMoJmkyYy0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHdtODgwNF9pMmNfaWRbXSA9IHsKLQl7ICJ3bTg4MDQiLCAwIH0sCi0JeyB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIHdtODgwNF9pMmNfaWQpOwotCi1zdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgd204ODA0X2kyY19kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAid204ODA0IiwKLQkJLm93bmVyID0gVEhJU19NT0RVTEUsCi0JCS5vZl9tYXRjaF90YWJsZSA9IHdtODgwNF9vZl9tYXRjaCwKLQl9LAotCS5wcm9iZSA9IHdtODgwNF9pMmNfcHJvYmUsCi0JLnJlbW92ZSA9IHdtODgwNF9pMmNfcmVtb3ZlLAotCS5pZF90YWJsZSA9IHdtODgwNF9pMmNfaWQKLX07Ci0jZW5kaWYKLQotc3RhdGljIGludCBfX2luaXQgd204ODA0X21vZGluaXQodm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKLQlyZXQgPSBpMmNfYWRkX2RyaXZlcigmd204ODA0X2kyY19kcml2ZXIpOworCXJldCA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KGRldiwgQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKSwKKwkJCQkgICAgICB3bTg4MDQtPnN1cHBsaWVzKTsKIAlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIHJlZ2lzdGVyIHdtODgwNCBJMkMgZHJpdmVyOiAlZFxuIiwKLQkJICAgICAgIHJldCk7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3Qgc3VwcGxpZXM6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX1NQSV9NQVNURVIpCi0JcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmd204ODA0X3NwaV9kcml2ZXIpOwotCWlmIChyZXQgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byByZWdpc3RlciB3bTg4MDQgU1BJIGRyaXZlcjogJWRcbiIsCi0JCSAgICAgICByZXQpOworCisJd204ODA0LT5kaXNhYmxlX25iWzBdLm5vdGlmaWVyX2NhbGwgPSB3bTg4MDRfcmVndWxhdG9yX2V2ZW50XzA7CisJd204ODA0LT5kaXNhYmxlX25iWzFdLm5vdGlmaWVyX2NhbGwgPSB3bTg4MDRfcmVndWxhdG9yX2V2ZW50XzE7CisKKwkvKiBUaGlzIHNob3VsZCByZWFsbHkgYmUgbW92ZWQgaW50byB0aGUgcmVndWxhdG9yIGNvcmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKTsgaSsrKSB7CisJCXN0cnVjdCByZWd1bGF0b3IgKnJlZ3VsYXRvciA9IHdtODgwNC0+c3VwcGxpZXNbaV0uY29uc3VtZXI7CisKKwkJcmV0ID0gZGV2bV9yZWd1bGF0b3JfcmVnaXN0ZXJfbm90aWZpZXIocmVndWxhdG9yLAorCQkJCQkJICAgICAgICZ3bTg4MDQtPmRpc2FibGVfbmJbaV0pOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWRldl9lcnIoZGV2LAorCQkJCSJGYWlsZWQgdG8gcmVnaXN0ZXIgcmVndWxhdG9yIG5vdGlmaWVyOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KLSNlbmRpZgorCisJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUod204ODA0LT5zdXBwbGllcyksCisJCQkJICAgIHdtODgwNC0+c3VwcGxpZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZW5hYmxlIHN1cHBsaWVzOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAod204ODA0LT5yZXNldCkKKwkJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKHdtODgwNC0+cmVzZXQsIDEpOworCisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBXTTg4MDRfUlNUX0RFVklEMSwgJmlkMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBkZXZpY2UgSUQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9yZWdfZW5hYmxlOworCX0KKworCXJldCA9IHJlZ21hcF9yZWFkKHJlZ21hcCwgV004ODA0X0RFVklEMiwgJmlkMik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVhZCBkZXZpY2UgSUQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9yZWdfZW5hYmxlOworCX0KKworCWlkMiA9IChpZDIgPDwgOCkgfCBpZDE7CisKKwlpZiAoaWQyICE9IDB4ODgwNSkgeworCQlkZXZfZXJyKGRldiwgIkludmFsaWQgZGV2aWNlIElEOiAlI3hcbiIsIGlkMik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlZ19lbmFibGU7CisJfQorCisJcmV0ID0gcmVnbWFwX3JlYWQocmVnbWFwLCBXTTg4MDRfREVWUkVWLCAmaWQxKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZWFkIGRldmljZSByZXZpc2lvbjogJWRcbiIsCisJCQlyZXQpOworCQlnb3RvIGVycl9yZWdfZW5hYmxlOworCX0KKwlkZXZfaW5mbyhkZXYsICJyZXZpc2lvbiAlY1xuIiwgaWQxICsgJ0EnKTsKKworCWlmICghd204ODA0LT5yZXNldCkgeworCQlyZXQgPSB3bTg4MDRfc29mdF9yZXNldCh3bTg4MDQpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gaXNzdWUgcmVzZXQ6ICVkXG4iLCByZXQpOworCQkJZ290byBlcnJfcmVnX2VuYWJsZTsKKwkJfQorCX0KKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29kZWMoZGV2LCAmc29jX2NvZGVjX2Rldl93bTg4MDQsCisJCQkJICAgICAmd204ODA0X2RhaSwgMSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgQ09ERUM6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9yZWdfZW5hYmxlOworCX0KKworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShkZXYpOworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisJcG1fcnVudGltZV9pZGxlKGRldik7CisKKwlyZXR1cm4gMDsKKworZXJyX3JlZ19lbmFibGU6CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHdtODgwNC0+c3VwcGxpZXMpLCB3bTg4MDQtPnN1cHBsaWVzKTsKIAlyZXR1cm4gcmV0OwogfQotbW9kdWxlX2luaXQod204ODA0X21vZGluaXQpOworRVhQT1JUX1NZTUJPTF9HUEwod204ODA0X3Byb2JlKTsKIAotc3RhdGljIHZvaWQgX19leGl0IHdtODgwNF9leGl0KHZvaWQpCit2b2lkIHdtODgwNF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KQogewotI2lmIElTX0VOQUJMRUQoQ09ORklHX0kyQykKLQlpMmNfZGVsX2RyaXZlcigmd204ODA0X2kyY19kcml2ZXIpOwotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfU1BJX01BU1RFUikKLQlzcGlfdW5yZWdpc3Rlcl9kcml2ZXIoJndtODgwNF9zcGlfZHJpdmVyKTsKLSNlbmRpZgorCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYyhkZXYpOwogfQotbW9kdWxlX2V4aXQod204ODA0X2V4aXQpOworRVhQT1JUX1NZTUJPTF9HUEwod204ODA0X3JlbW92ZSk7CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19QTSkKK3N0YXRpYyBpbnQgd204ODA0X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgd204ODA0X3ByaXYgKndtODgwNCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKSwKKwkJCQkgICAgd204ODA0LT5zdXBwbGllcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHdtODgwNC0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBzdXBwbGllczogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmVnY2FjaGVfc3luYyh3bTg4MDQtPnJlZ21hcCk7CisKKwkvKiBQb3dlciB1cCBPU0NDTEsgKi8KKwlyZWdtYXBfdXBkYXRlX2JpdHMod204ODA0LT5yZWdtYXAsIFdNODgwNF9QV1JETiwgMHg4LCAweDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd204ODA0X3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHdtODgwNF9wcml2ICp3bTg4MDQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCS8qIFBvd2VyIGRvd24gT1NDQ0xLICovCisJcmVnbWFwX3VwZGF0ZV9iaXRzKHdtODgwNC0+cmVnbWFwLCBXTTg4MDRfUFdSRE4sIDB4OCwgMHg4KTsKKworCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoQVJSQVlfU0laRSh3bTg4MDQtPnN1cHBsaWVzKSwKKwkJCSAgICAgICB3bTg4MDQtPnN1cHBsaWVzKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK2NvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHdtODgwNF9wbSA9IHsKKwlTRVRfUlVOVElNRV9QTV9PUFMod204ODA0X3J1bnRpbWVfc3VzcGVuZCwgd204ODA0X3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKHdtODgwNF9wbSk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiQVNvQyBXTTg4MDQgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJEaW1pdHJpcyBQYXBhc3RhbW9zIDxkcEBvcGVuc291cmNlLndvbGZzb25taWNyby5jb20+Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5oIGIvc291bmQvc29jL2NvZGVjcy93bTg4MDQuaAppbmRleCBlNzJkNGY0Li5hYTcyZmE2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODgwNC5oCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204ODA0LmgKQEAgLTEzLDYgKzEzLDggQEAKICNpZm5kZWYgX1dNODgwNF9ICiAjZGVmaW5lIF9XTTg4MDRfSAogCisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisKIC8qCiAgKiBSZWdpc3RlciB2YWx1ZXMuCiAgKi8KQEAgLTYyLDQgKzY0LDEwIEBACiAjZGVmaW5lIFdNODgwNF9NQ0xLRElWXzI1NkZTCQkJMAogI2RlZmluZSBXTTg4MDRfTUNMS0RJVl8xMjhGUwkJCTEKIAorZXh0ZXJuIGNvbnN0IHN0cnVjdCByZWdtYXBfY29uZmlnIHdtODgwNF9yZWdtYXBfY29uZmlnOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHdtODgwNF9wbTsKKworaW50IHdtODgwNF9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZWdtYXAgKnJlZ21hcCk7Cit2b2lkIHdtODgwNF9yZW1vdmUoc3RydWN0IGRldmljZSAqZGV2KTsKKwogI2VuZGlmICAvKiBfV004ODA0X0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwMy5jCmluZGV4IGRkZTQ2MmMuLjA0YjA0ZjggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTAzLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg5MDMuYwpAQCAtNDQyLDcgKzQ0Miw3IEBACiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19rY29udHJvbF9jb2RlYyhrY29udHJvbCk7CiAJc3RydWN0IHdtODkwM19wcml2ICp3bTg5MDMgPSBzbmRfc29jX2NvZGVjX2dldF9kcnZkYXRhKGNvZGVjKTsKIAotCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSB3bTg5MDMtPmRlZW1waDsKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHdtODkwMy0+ZGVlbXBoOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00NTIsNyArNDUyLDcgQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3Qgd204OTAzX3ByaXYgKndtODkwMyA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCWludCBkZWVtcGggPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCWludCBkZWVtcGggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChkZWVtcGggPiAxKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTA0LmMKaW5kZXggZDNiM2Y1Ny4uMjE1ZTkzYyAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5MDQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODkwNC5jCkBAIC01MjUsNyArNTI1LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3Qgd204OTA0X3ByaXYgKndtODkwNCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHdtODkwNC0+ZGVlbXBoOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gd204OTA0LT5kZWVtcGg7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTUzNCw3ICs1MzQsNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCB3bTg5MDRfcHJpdiAqd204OTA0ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCiAJaWYgKGRlZW1waCA+IDEpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NTUuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU1LmMKaW5kZXggMWFiMmQ0Ni4uMDBiZWM5MSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NTUuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk1NS5jCkBAIC0zOTMsNyArMzkzLDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3Qgd204OTU1X3ByaXYgKndtODk1NSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHdtODk1NS0+ZGVlbXBoOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gd204OTU1LT5kZWVtcGg7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQwMiw3ICs0MDIsNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCB3bTg5NTVfcHJpdiAqd204OTU1ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCiAJaWYgKGRlZW1waCA+IDEpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTYwLmMKaW5kZXggY2Y4ZmVjZi4uMzAzNWQ5OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NjAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk2MC5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBzbmRfc29jX2tjb250cm9sX2NvZGVjKGtjb250cm9sKTsKIAlzdHJ1Y3Qgd204OTYwX3ByaXYgKndtODk2MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9IHdtODk2MC0+ZGVlbXBoOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gd204OTYwLT5kZWVtcGg7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5Myw3ICsxOTMsNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2Nfa2NvbnRyb2xfY29kZWMoa2NvbnRyb2wpOwogCXN0cnVjdCB3bTg5NjBfcHJpdiAqd204OTYwID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJaW50IGRlZW1waCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCiAJaWYgKGRlZW1waCA+IDEpCiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTcxLmMKaW5kZXggMzlkZGI5Yi4uZjljYmFiZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5NzEuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk3MS5jCkBAIC0zMSwxMSArMzEsMTEgQEAKIAogI2RlZmluZQlXTTg5NzFfUkVHX0NPVU5UCQk0MwogCi1zdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndtODk3MV93b3JrcSA9IE5VTEw7Ci0KIC8qIGNvZGVjIHByaXZhdGUgZGF0YSAqLwogc3RydWN0IHdtODk3MV9wcml2IHsKIAl1bnNpZ25lZCBpbnQgc3lzY2xrOworCXN0cnVjdCBkZWxheWVkX3dvcmsgY2hhcmdlX3dvcms7CisJc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogfTsKIAogLyoKQEAgLTU1Miw5ICs1NTIsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgd204OTcxX2NoYXJnZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgd204OTcxX3ByaXYgKndtODk3MSA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgd204OTcxX3ByaXYsIGNoYXJnZV93b3JrLndvcmspOworCisJLyogU2V0IHRvIDUwMGsgKi8KKwlyZWdtYXBfdXBkYXRlX2JpdHMod204OTcxLT5yZWdtYXAsIFdNODk3MV9QV1IxLCAweDAxODAsIDB4MDEwMCk7Cit9CisKIHN0YXRpYyBpbnQgd204OTcxX3NldF9iaWFzX2xldmVsKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYywKIAllbnVtIHNuZF9zb2NfYmlhc19sZXZlbCBsZXZlbCkKIHsKKwlzdHJ1Y3Qgd204OTcxX3ByaXYgKndtODk3MSA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwogCXUxNiBwd3JfcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NzFfUFdSMSkgJiAweGZlM2U7CiAKIAlzd2l0Y2ggKGxldmVsKSB7CkBAIC01NjMsMTUgKzU3MywyNCBAQAogCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NzFfUFdSMSwgcHdyX3JlZyB8IDB4MDBjMSk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX1BSRVBBUkU6CisJCS8qIFdhaXQgdW50aWwgZnVsbHkgY2hhcmdlZCAqLworCQlmbHVzaF9kZWxheWVkX3dvcmsoJndtODk3MS0+Y2hhcmdlX3dvcmspOwogCQlicmVhazsKIAljYXNlIFNORF9TT0NfQklBU19TVEFOREJZOgotCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKQorCQlpZiAoY29kZWMtPmRhcG0uYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT0ZGKSB7CiAJCQlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOworCQkJLyogY2hhcmdlIG91dHB1dCBjYXBzIC0gc2V0IHZtaWQgdG8gNWsgZm9yIHF1aWNrIHBvd2VyIHVwICovCisJCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NzFfUFdSMSwgcHdyX3JlZyB8IDB4MDFjMCk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX3Bvd2VyX2VmZmljaWVudF93cSwKKwkJCQkmd204OTcxLT5jaGFyZ2Vfd29yaywgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJCX0gZWxzZSB7CisJCQkvKiBtdXRlIGRhYyBhbmQgc2V0IHZtaWQgdG8gNTAwaywgZW5hYmxlIFZSRUYgKi8KKwkJCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk3MV9QV1IxLCBwd3JfcmVnIHwgMHgwMTQwKTsKKwkJfQogCi0JCS8qIG11dGUgZGFjIGFuZCBzZXQgdm1pZCB0byA1MDBrLCBlbmFibGUgVlJFRiAqLwotCQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NzFfUFdSMSwgcHdyX3JlZyB8IDB4MDE0MCk7CiAJCWJyZWFrOwogCWNhc2UgU05EX1NPQ19CSUFTX09GRjoKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3bTg5NzEtPmNoYXJnZV93b3JrKTsKIAkJc25kX3NvY193cml0ZShjb2RlYywgV004OTcxX1BXUjEsIDB4MDAwMSk7CiAJCWJyZWFrOwogCX0KQEAgLTYxMCw1OCArNjI5LDE0IEBACiAJLm9wcyA9ICZ3bTg5NzFfZGFpX29wcywKIH07CiAKLXN0YXRpYyB2b2lkIHdtODk3MV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0LAotCQkJICAgICBkZWxheWVkX3dvcmsud29yayk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKGRhcG0pOwotCXdtODk3MV9zZXRfYmlhc19sZXZlbChjb2RlYywgY29kZWMtPmRhcG0uYmlhc19sZXZlbCk7Ci19Ci0KLXN0YXRpYyBpbnQgd204OTcxX3N1c3BlbmQoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjKQotewotCXdtODk3MV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX09GRik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgd204OTcxX3Jlc3VtZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0JdTE2IHJlZzsKLQotCXdtODk3MV9zZXRfYmlhc19sZXZlbChjb2RlYywgU05EX1NPQ19CSUFTX1NUQU5EQlkpOwotCi0JLyogY2hhcmdlIHdtODk3MSBjYXBzICovCi0JaWYgKGNvZGVjLT5kYXBtLnN1c3BlbmRfYmlhc19sZXZlbCA9PSBTTkRfU09DX0JJQVNfT04pIHsKLQkJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBXTTg5NzFfUFdSMSkgJiAweGZlM2U7Ci0JCXNuZF9zb2Nfd3JpdGUoY29kZWMsIFdNODk3MV9QV1IxLCByZWcgfCAweDAxYzApOwotCQljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX09OOwotCQlxdWV1ZV9kZWxheWVkX3dvcmsod204OTcxX3dvcmtxLCAmY29kZWMtPmRhcG0uZGVsYXllZF93b3JrLAotCQkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgd204OTcxX3Byb2JlKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKLQlpbnQgcmV0ID0gMDsKLQl1MTYgcmVnOworCXN0cnVjdCB3bTg5NzFfcHJpdiAqd204OTcxID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAKLQlJTklUX0RFTEFZRURfV09SSygmY29kZWMtPmRhcG0uZGVsYXllZF93b3JrLCB3bTg5NzFfd29yayk7Ci0Jd204OTcxX3dvcmtxID0gY3JlYXRlX3dvcmtxdWV1ZSgid204OTcxIik7Ci0JaWYgKHdtODk3MV93b3JrcSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKKwlJTklUX0RFTEFZRURfV09SSygmd204OTcxLT5jaGFyZ2Vfd29yaywgd204OTcxX2NoYXJnZV93b3JrKTsKIAogCXdtODk3MV9yZXNldChjb2RlYyk7CiAKLQkvKiBjaGFyZ2Ugb3V0cHV0IGNhcHMgLSBzZXQgdm1pZCB0byA1ayBmb3IgcXVpY2sgcG93ZXIgdXAgKi8KLQlyZWcgPSBzbmRfc29jX3JlYWQoY29kZWMsIFdNODk3MV9QV1IxKSAmIDB4ZmUzZTsKLQlzbmRfc29jX3dyaXRlKGNvZGVjLCBXTTg5NzFfUFdSMSwgcmVnIHwgMHgwMWMwKTsKLQljb2RlYy0+ZGFwbS5iaWFzX2xldmVsID0gU05EX1NPQ19CSUFTX1NUQU5EQlk7Ci0JcXVldWVfZGVsYXllZF93b3JrKHdtODk3MV93b3JrcSwgJmNvZGVjLT5kYXBtLmRlbGF5ZWRfd29yaywKLQkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7Ci0KIAkvKiBzZXQgdGhlIHVwZGF0ZSBiaXRzICovCiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTcxX0xEQUMsIDB4MDEwMCwgMHgwMTAwKTsKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NzFfUkRBQywgMHgwMTAwLCAweDAxMDApOwpAQCAtNjcyLDI2ICs2NDcsMTMgQEAKIAlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5NzFfTElOVk9MLCAweDAxMDAsIDB4MDEwMCk7CiAJc25kX3NvY191cGRhdGVfYml0cyhjb2RlYywgV004OTcxX1JJTlZPTCwgMHgwMTAwLCAweDAxMDApOwogCi0JcmV0dXJuIHJldDsKLX0KLQotCi0vKiBwb3dlciBkb3duIGNoaXAgKi8KLXN0YXRpYyBpbnQgd204OTcxX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMpCi17Ci0Jd204OTcxX3NldF9iaWFzX2xldmVsKGNvZGVjLCBTTkRfU09DX0JJQVNfT0ZGKTsKLQotCWlmICh3bTg5NzFfd29ya3EpCi0JCWRlc3Ryb3lfd29ya3F1ZXVlKHdtODk3MV93b3JrcSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlY19kcml2ZXIgc29jX2NvZGVjX2Rldl93bTg5NzEgPSB7CiAJLnByb2JlID0Jd204OTcxX3Byb2JlLAotCS5yZW1vdmUgPQl3bTg5NzFfcmVtb3ZlLAotCS5zdXNwZW5kID0Jd204OTcxX3N1c3BlbmQsCi0JLnJlc3VtZSA9CXdtODk3MV9yZXN1bWUsCiAJLnNldF9iaWFzX2xldmVsID0gd204OTcxX3NldF9iaWFzX2xldmVsLAorCS5zdXNwZW5kX2JpYXNfb2ZmID0gdHJ1ZSwKIAogCS5jb250cm9scyA9IHdtODk3MV9zbmRfY29udHJvbHMsCiAJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUod204OTcxX3NuZF9jb250cm9scyksCkBAIC03MTUsNyArNjc3LDYgQEAKIAkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHdtODk3MV9wcml2ICp3bTg5NzE7Ci0Jc3RydWN0IHJlZ21hcCAqcmVnbWFwOwogCWludCByZXQ7CiAKIAl3bTg5NzEgPSBkZXZtX2t6YWxsb2MoJmkyYy0+ZGV2LCBzaXplb2Yoc3RydWN0IHdtODk3MV9wcml2KSwKQEAgLTcyMyw5ICs2ODQsOSBAQAogCWlmICh3bTg5NzEgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhpMmMsICZ3bTg5NzFfcmVnbWFwKTsKLQlpZiAoSVNfRVJSKHJlZ21hcCkpCi0JCXJldHVybiBQVFJfRVJSKHJlZ21hcCk7CisJd204OTcxLT5yZWdtYXAgPSBkZXZtX3JlZ21hcF9pbml0X2kyYyhpMmMsICZ3bTg5NzFfcmVnbWFwKTsKKwlpZiAoSVNfRVJSKHdtODk3MS0+cmVnbWFwKSkKKwkJcmV0dXJuIFBUUl9FUlIod204OTcxLT5yZWdtYXApOwogCiAJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgd204OTcxKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMKaW5kZXggZGM5MmQ1ZS4uMzA4NzQ4YSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jCkBAIC0yMDA5LDcgKzIwMDksNyBAQAogCXN0cnVjdCB3bTg5OTZfcHJpdiAqd204OTk2ID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7CiAJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IHRvX2kyY19jbGllbnQoY29kZWMtPmRldik7CiAJc3RydWN0IF9mbGxfZGl2IGZsbF9kaXY7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgdGltZW91dCwgdGltZV9sZWZ0OwogCWludCByZXQsIHJlZywgcmV0cnk7CiAKIAkvKiBBbnkgY2hhbmdlPyAqLwpAQCAtMjExMCwxMyArMjExMCwxNSBAQAogCWlmIChpMmMtPmlycSkKIAkJdGltZW91dCAqPSAxMDsKIAllbHNlCi0JCXRpbWVvdXQgLz0gMjsKKwkJLyogZW5zdXJlIHRpbWVvdXQgb2YgYXRsZWFzdCAxIGppZmZpZXMgKi8KKwkJdGltZW91dCA9IHRpbWVvdXQvMiA/IDogMTsKIAogCWZvciAocmV0cnkgPSAwOyByZXRyeSA8IDEwOyByZXRyeSsrKSB7Ci0JCXJldCA9IHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd204OTk2LT5mbGxfbG9jaywKLQkJCQkJCSAgdGltZW91dCk7Ci0JCWlmIChyZXQgIT0gMCkgeworCQl0aW1lX2xlZnQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJndtODk5Ni0+ZmxsX2xvY2ssCisJCQkJCQkJdGltZW91dCk7CisJCWlmICh0aW1lX2xlZnQgIT0gMCkgewogCQkJV0FSTl9PTighaTJjLT5pcnEpOworCQkJcmV0ID0gMTsKIAkJCWJyZWFrOwogCQl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMi5jCmluZGV4IDk1MTc1NzEuLjk4Yzk1MjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEyLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTk3MTIuYwpAQCAtMTgwLDcgKzE4MCw3IEBACiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gc25kX3NvY19kYXBtX2tjb250cm9sX2RhcG0oa2NvbnRyb2wpOwogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHNuZF9zb2NfZGFwbV90b19jb2RlYyhkYXBtKTsKIAlzdHJ1Y3Qgd205NzEyX3ByaXYgKndtOTcxMiA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXVuc2lnbmVkIGludCB2YWwgPSB1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdOworCXVuc2lnbmVkIGludCB2YWwgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKIAlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KIAkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwogCXVuc2lnbmVkIGludCBtaXhlciwgbWFzaywgc2hpZnQsIG9sZDsKQEAgLTE5Myw3ICsxOTMsNyBAQAogCiAJbXV0ZXhfbG9jaygmd205NzEyLT5sb2NrKTsKIAlvbGQgPSB3bTk3MTItPmhwX21peGVyW21peGVyXTsKLQlpZiAodWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSkKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pCiAJCXdtOTcxMi0+aHBfbWl4ZXJbbWl4ZXJdIHw9IG1hc2s7CiAJZWxzZQogCQl3bTk3MTItPmhwX21peGVyW21peGVyXSAmPSB+bWFzazsKQEAgLTIzMSw3ICsyMzEsNyBAQAogCW1peGVyID0gbWMtPnNoaWZ0ID4+IDg7CiAJc2hpZnQgPSBtYy0+c2hpZnQgJiAweGZmOwogCi0JdWNvbnRyb2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQogCQkod205NzEyLT5ocF9taXhlclttaXhlcl0gPj4gc2hpZnQpICYgMTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTk3MTMuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd205NzEzLmMKaW5kZXggNjgyMjI5MS4uNzk1NTI5NSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTk3MTMuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtOTcxMy5jCkBAIC0yNTUsNyArMjU1LDcgQEAKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSBzbmRfc29jX2RhcG1fa2NvbnRyb2xfZGFwbShrY29udHJvbCk7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gc25kX3NvY19kYXBtX3RvX2NvZGVjKGRhcG0pOwogCXN0cnVjdCB3bTk3MTNfcHJpdiAqd205NzEzID0gc25kX3NvY19jb2RlY19nZXRfZHJ2ZGF0YShjb2RlYyk7Ci0JdW5zaWduZWQgaW50IHZhbCA9IHVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF07CisJdW5zaWduZWQgaW50IHZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwogCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQogCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CiAJdW5zaWduZWQgaW50IG1peGVyLCBtYXNrLCBzaGlmdCwgb2xkOwpAQCAtMjY4LDcgKzI2OCw3IEBACiAKIAltdXRleF9sb2NrKCZ3bTk3MTMtPmxvY2spOwogCW9sZCA9IHdtOTcxMy0+aHBfbWl4ZXJbbWl4ZXJdOwotCWlmICh1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdKQorCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkKIAkJd205NzEzLT5ocF9taXhlclttaXhlcl0gfD0gbWFzazsKIAllbHNlCiAJCXdtOTcxMy0+aHBfbWl4ZXJbbWl4ZXJdICY9IH5tYXNrOwpAQCAtMzA2LDcgKzMwNiw3IEBACiAJbWl4ZXIgPSBtYy0+c2hpZnQgPj4gODsKIAlzaGlmdCA9IG1jLT5zaGlmdCAmIDB4ZmY7CiAKLQl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CiAJCSh3bTk3MTMtPmhwX21peGVyW21peGVyXSA+PiBzaGlmdCkgJiAxOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtX2Fkc3AuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCmluZGV4IGZmNjdiMzMuLmQwMWMyMDkgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd21fYWRzcC5jCkBAIC00MjAsMTAgKzQyMCw5IEBACiAKIAltZW1jcHkoY3RsLT5jYWNoZSwgcCwgY3RsLT5sZW4pOwogCi0JaWYgKCFjdGwtPmVuYWJsZWQpIHsKLQkJY3RsLT5zZXQgPSAxOworCWN0bC0+c2V0ID0gMTsKKwlpZiAoIWN0bC0+ZW5hYmxlZCkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJcmV0dXJuIHdtX2NvZWZmX3dyaXRlX2NvbnRyb2woa2NvbnRyb2wsIHAsIGN0bC0+bGVuKTsKIH0KQEAgLTExODUsNyArMTE4NCw2IEBACiAJaW50IHJldCwgcG9zLCBibG9ja3MsIHR5cGUsIG9mZnNldCwgcmVnOwogCWNoYXIgKmZpbGU7CiAJc3RydWN0IHdtX2Fkc3BfYnVmICpidWY7Ci0JaW50IHRtcDsKIAogCWZpbGUgPSBremFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGZpbGUgPT0gTlVMTCkKQEAgLTEzMzUsMTIgKzEzMzMsNyBAQAogCQkJfQogCQl9CiAKLQkJdG1wID0gbGUzMl90b19jcHUoYmxrLT5sZW4pICUgNDsKLQkJaWYgKHRtcCkKLQkJCXBvcyArPSBsZTMyX3RvX2NwdShibGstPmxlbikgKyAoNCAtIHRtcCkgKyBzaXplb2YoKmJsayk7Ci0JCWVsc2UKLQkJCXBvcyArPSBsZTMyX3RvX2NwdShibGstPmxlbikgKyBzaXplb2YoKmJsayk7Ci0KKwkJcG9zICs9IChsZTMyX3RvX2NwdShibGstPmxlbikgKyBzaXplb2YoKmJsaykgKyAzKSAmIH4weDAzOwogCQlibG9ja3MrKzsKIAl9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9kYXZpbmNpL0tjb25maWcgYi9zb3VuZC9zb2MvZGF2aW5jaS9LY29uZmlnCmluZGV4IDJiODFjYTQuLjM3MzZkOWEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL0tjb25maWcKKysrIGIvc291bmQvc29jL2RhdmluY2kvS2NvbmZpZwpAQCAtMSwxNCArMSwxNiBAQAogY29uZmlnIFNORF9EQVZJTkNJX1NPQwotCXRyaXN0YXRlICJTb0MgQXVkaW8gZm9yIFRJIERBVklOQ0kiCisJdHJpc3RhdGUKIAlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSQorCXNlbGVjdCBTTkRfRURNQV9TT0MKIAogY29uZmlnIFNORF9FRE1BX1NPQwotCXRyaXN0YXRlICJTb0MgQXVkaW8gZm9yIFRleGFzIEluc3RydW1lbnRzIGNoaXBzIHVzaW5nIGVETUEgKEFNMzNYWC80M1hYKSIKLQlkZXBlbmRzIG9uIFNPQ19BTTMzWFggfHwgU09DX0FNNDNYWAorCXRyaXN0YXRlICJTb0MgQXVkaW8gZm9yIFRleGFzIEluc3RydW1lbnRzIGNoaXBzIHVzaW5nIGVETUEiCisJZGVwZW5kcyBvbiBTT0NfQU0zM1hYIHx8IFNPQ19BTTQzWFggfHwgQVJDSF9EQVZJTkNJCiAJc2VsZWN0IFNORF9TT0NfR0VORVJJQ19ETUFFTkdJTkVfUENNCiAJaGVscAogCSAgU2F5IFkgb3IgTSBoZXJlIGlmIHlvdSB3YW50IGF1ZGlvIHN1cHBvcnQgZm9yIFRJIFNvQyB3aGljaCB1c2VzIGVETUEuCiAJICBUaGUgZm9sbG93aW5nIGxpbmUgb2YgU29DcyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgcGxhdGZvcm0gZHJpdmVyOgorCSAgLSBkYVZpbmNpIGRldmljZXMKIAkgIC0gQU0zMzV4CiAJICAtIEFNNDM3eC9BTTQzOHgKIApAQCAtMTcsNyArMTksNyBAQAogCiBjb25maWcgU05EX0RBVklOQ0lfU09DX01DQVNQCiAJdHJpc3RhdGUgIk11bHRpY2hhbm5lbCBBdWRpbyBTZXJpYWwgUG9ydCAoTWNBU1ApIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBTTkRfREFWSU5DSV9TT0MgfHwgU05EX09NQVBfU09DIHx8IFNORF9FRE1BX1NPQworCWRlcGVuZHMgb24gU05EX09NQVBfU09DIHx8IFNORF9FRE1BX1NPQwogCWhlbHAKIAkgIFNheSBZIG9yIE0gaGVyZSBpZiB5b3Ugd2FudCB0byBoYXZlIHN1cHBvcnQgZm9yIE1jQVNQIElQIGZvdW5kIGluCiAJICB2YXJpb3VzIFRleGFzIEluc3RydW1lbnRzIFNvQ3MgbGlrZToKQEAgLTQ1LDcgKzQ3LDcgQEAKIAogY29uZmlnIFNORF9EQVZJTkNJX1NPQ19FVk0KIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIERhVmluY2kgRE02NDQ2LCBETTM1NSBvciBETTM2NSBFVk0iCi0JZGVwZW5kcyBvbiBTTkRfREFWSU5DSV9TT0MgJiYgSTJDCisJZGVwZW5kcyBvbiBTTkRfRURNQV9TT0MgJiYgSTJDCiAJZGVwZW5kcyBvbiBNQUNIX0RBVklOQ0lfRVZNIHx8IE1BQ0hfREFWSU5DSV9ETTM1NV9FVk0gfHwgTUFDSF9EQVZJTkNJX0RNMzY1X0VWTQogCXNlbGVjdCBTTkRfREFWSU5DSV9TT0NfR0VORVJJQ19FVk0KIAloZWxwCkBAIC03Myw3ICs3NSw3IEBACiAKIGNvbmZpZyAgU05EX0RNNjQ2N19TT0NfRVZNCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBEYVZpbmNpIERNNjQ2NyBFVk0iCi0JZGVwZW5kcyBvbiBTTkRfREFWSU5DSV9TT0MgJiYgTUFDSF9EQVZJTkNJX0RNNjQ2N19FVk0gJiYgSTJDCisJZGVwZW5kcyBvbiBTTkRfRURNQV9TT0MgJiYgTUFDSF9EQVZJTkNJX0RNNjQ2N19FVk0gJiYgSTJDCiAJc2VsZWN0IFNORF9EQVZJTkNJX1NPQ19HRU5FUklDX0VWTQogCXNlbGVjdCBTTkRfU09DX1NQRElGCiAKQEAgLTgyLDcgKzg0LDcgQEAKIAogY29uZmlnICBTTkRfREE4MzBfU09DX0VWTQogCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgREE4MzAvT01BUC1MMTM3IEVWTSIKLQlkZXBlbmRzIG9uIFNORF9EQVZJTkNJX1NPQyAmJiBNQUNIX0RBVklOQ0lfREE4MzBfRVZNICYmIEkyQworCWRlcGVuZHMgb24gU05EX0VETUFfU09DICYmIE1BQ0hfREFWSU5DSV9EQTgzMF9FVk0gJiYgSTJDCiAJc2VsZWN0IFNORF9EQVZJTkNJX1NPQ19HRU5FUklDX0VWTQogCiAJaGVscApAQCAtOTEsNyArOTMsNyBAQAogCiBjb25maWcgIFNORF9EQTg1MF9TT0NfRVZNCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBEQTg1MC9PTUFQLUwxMzggRVZNIgotCWRlcGVuZHMgb24gU05EX0RBVklOQ0lfU09DICYmIE1BQ0hfREFWSU5DSV9EQTg1MF9FVk0gJiYgSTJDCisJZGVwZW5kcyBvbiBTTkRfRURNQV9TT0MgJiYgTUFDSF9EQVZJTkNJX0RBODUwX0VWTSAmJiBJMkMKIAlzZWxlY3QgU05EX0RBVklOQ0lfU09DX0dFTkVSSUNfRVZNCiAJaGVscAogCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYWRkIHN1cHBvcnQgZm9yIFNvQyBhdWRpbyBvbiBUSQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvTWFrZWZpbGUgYi9zb3VuZC9zb2MvZGF2aW5jaS9NYWtlZmlsZQppbmRleCAwOWJmMmJhLi5mODgzOTMzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9NYWtlZmlsZQpAQCAtMSwxMSArMSw5IEBACiAjIERBVklOQ0kgUGxhdGZvcm0gU3VwcG9ydAotc25kLXNvYy1kYXZpbmNpLW9ianMgOj0gZGF2aW5jaS1wY20ubwogc25kLXNvYy1lZG1hLW9ianMgOj0gZWRtYS1wY20ubwogc25kLXNvYy1kYXZpbmNpLWkycy1vYmpzIDo9IGRhdmluY2ktaTJzLm8KIHNuZC1zb2MtZGF2aW5jaS1tY2FzcC1vYmpzOj0gZGF2aW5jaS1tY2FzcC5vCiBzbmQtc29jLWRhdmluY2ktdmNpZi1vYmpzOj0gZGF2aW5jaS12Y2lmLm8KIAotb2JqLSQoQ09ORklHX1NORF9EQVZJTkNJX1NPQykgKz0gc25kLXNvYy1kYXZpbmNpLm8KIG9iai0kKENPTkZJR19TTkRfRURNQV9TT0MpICs9IHNuZC1zb2MtZWRtYS5vCiBvYmotJChDT05GSUdfU05EX0RBVklOQ0lfU09DX0kyUykgKz0gc25kLXNvYy1kYXZpbmNpLWkycy5vCiBvYmotJChDT05GSUdfU05EX0RBVklOQ0lfU09DX01DQVNQKSArPSBzbmQtc29jLWRhdmluY2ktbWNhc3AubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktZXZtLmMKaW5kZXggYjZiYjU5NC4uNzMxZmIwZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1ldm0uYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWV2bS5jCkBAIC0xMTcsNyArMTE3LDYgQEAKIHN0YXRpYyBpbnQgZXZtX2FpYzN4X2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnRkLT5jYXJkOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCA9IGNhcmQtPmRldi0+b2Zfbm9kZTsKIAlpbnQgcmV0OwogCkBAIC0xMzYsOSArMTM1LDkgQEAKIAl9CiAKIAkvKiBub3QgY29ubmVjdGVkICovCi0Jc25kX3NvY19kYXBtX25jX3BpbigmY29kZWMtPmRhcG0sICJNT05PX0xPVVQiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKCZjb2RlYy0+ZGFwbSwgIkhQTENPTSIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oJmNvZGVjLT5kYXBtLCAiSFBSQ09NIik7CisJc25kX3NvY19kYXBtX25jX3BpbigmY2FyZC0+ZGFwbSwgIk1PTk9fTE9VVCIpOworCXNuZF9zb2NfZGFwbV9uY19waW4oJmNhcmQtPmRhcG0sICJIUExDT00iKTsKKwlzbmRfc29jX2RhcG1fbmNfcGluKCZjYXJkLT5kYXBtLCAiSFBSQ09NIik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQyNSwxOCArNDI0LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGRhdmluY2lfZXZtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCXNuZF9zb2NfdW5yZWdpc3Rlcl9jYXJkKGNhcmQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGRhdmluY2lfZXZtX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gZGF2aW5jaV9ldm1fcHJvYmUsCi0JLnJlbW92ZQkJPSBkYXZpbmNpX2V2bV9yZW1vdmUsCiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gImRhdmluY2lfZXZtIiwKIAkJLnBtCT0gJnNuZF9zb2NfcG1fb3BzLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1pMnMuYyBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktaTJzLmMKaW5kZXggMTVmYjI4Zi4uNTZjYjRkOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1pMnMuYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLWkycy5jCkBAIC0yMyw4ICsyMyw5IEBACiAjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgogI2luY2x1ZGUgPHNvdW5kL2luaXR2YWwuaD4KICNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9kbWFlbmdpbmVfcGNtLmg+CiAKLSNpbmNsdWRlICJkYXZpbmNpLXBjbS5oIgorI2luY2x1ZGUgImVkbWEtcGNtLmgiCiAjaW5jbHVkZSAiZGF2aW5jaS1pMnMuaCIKIAogCkBAIC0xMjIsNyArMTIzLDggQEAKIAogc3RydWN0IGRhdmluY2lfbWNic3BfZGV2IHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMJZG1hX3BhcmFtc1syXTsKKwlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgZG1hX2RhdGFbMl07CisJaW50IGRtYV9yZXF1ZXN0WzJdOwogCXZvaWQgX19pb21lbQkJCSpiYXNlOwogI2RlZmluZSBNT0RfRFNQX0EJMAogI2RlZmluZSBNT0RfRFNQX0IJMQpAQCAtNDE5LDggKzQyMSw2IEBACiAJCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewogCXN0cnVjdCBkYXZpbmNpX21jYnNwX2RldiAqZGV2ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKLQlzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyAqZG1hX3BhcmFtcyA9Ci0JCQkJCSZkZXYtPmRtYV9wYXJhbXNbc3Vic3RyZWFtLT5zdHJlYW1dOwogCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmkgPSBOVUxMOwogCWludCBtY2JzcF93b3JkX2xlbmd0aCwgbWFzdGVyOwogCXVuc2lnbmVkIGludCByY3IsIHhjciwgc3JnciwgY2xrX2RpdiwgZnJlcSwgZnJhbWVzaXplOwpAQCAtNTMyLDggKzUzMiw2IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KLQlkbWFfcGFyYW1zLT5hY250ID0gZG1hX3BhcmFtcy0+ZGF0YV90eXBlID0gZGF0YV90eXBlW2ZtdF07Ci0JZG1hX3BhcmFtcy0+Zmlmb19sZXZlbCA9IDA7CiAJbWNic3Bfd29yZF9sZW5ndGggPSBhc3Bfd29yZF9sZW5ndGhbZm10XTsKIAogCXN3aXRjaCAobWFzdGVyKSB7CkBAIC02MDAsMTUgKzU5OCw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBkYXZpbmNpX2kyc19zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgICAgIHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXN0cnVjdCBkYXZpbmNpX21jYnNwX2RldiAqZGV2ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKLQotCXNuZF9zb2NfZGFpX3NldF9kbWFfZGF0YShkYWksIHN1YnN0cmVhbSwgZGV2LT5kbWFfcGFyYW1zKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgZGF2aW5jaV9pMnNfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQogewpAQCAtNjIwLDcgKzYwOSw2IEBACiAjZGVmaW5lIERBVklOQ0lfSTJTX1JBVEVTCVNORFJWX1BDTV9SQVRFXzgwMDBfOTYwMDAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgZGF2aW5jaV9pMnNfZGFpX29wcyA9IHsKLQkuc3RhcnR1cAk9IGRhdmluY2lfaTJzX3N0YXJ0dXAsCiAJLnNodXRkb3duCT0gZGF2aW5jaV9pMnNfc2h1dGRvd24sCiAJLnByZXBhcmUJPSBkYXZpbmNpX2kyc19wcmVwYXJlLAogCS50cmlnZ2VyCT0gZGF2aW5jaV9pMnNfdHJpZ2dlciwKQEAgLTYzMCw3ICs2MTgsMTggQEAKIAogfTsKIAorc3RhdGljIGludCBkYXZpbmNpX2kyc19kYWlfcHJvYmUoc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGRhdmluY2lfbWNic3BfZGV2ICpkZXYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCisJZGFpLT5wbGF5YmFja19kbWFfZGF0YSA9ICZkZXYtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOworCWRhaS0+Y2FwdHVyZV9kbWFfZGF0YSA9ICZkZXYtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV07CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGF2aW5jaV9pMnNfZGFpID0geworCS5wcm9iZSA9IGRhdmluY2lfaTJzX2RhaV9wcm9iZSwKIAkucGxheWJhY2sgPSB7CiAJCS5jaGFubmVsc19taW4gPSAyLAogCQkuY2hhbm5lbHNfbWF4ID0gMiwKQEAgLTY1MSwxMSArNjUwLDkgQEAKIAogc3RhdGljIGludCBkYXZpbmNpX2kyc19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0cnVjdCBzbmRfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAlzdHJ1Y3QgZGF2aW5jaV9tY2JzcF9kZXYgKmRldjsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgKmlvYXJlYSwgKnJlczsKLQllbnVtIGRtYV9ldmVudF9xIGFzcF9jaGFuX3EgPSBFVkVOVFFfMDsKLQllbnVtIGRtYV9ldmVudF9xIHJhbV9jaGFuX3EgPSBFVkVOVFFfMTsKKwlpbnQgKmRtYTsKIAlpbnQgcmV0OwogCiAJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKQEAgLTY3NiwyMiArNjczLDYgQEAKIAkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKLQlpZiAocGRhdGEpIHsKLQkJZGV2LT5lbmFibGVfY2hhbm5lbF9jb21iaW5lID0gcGRhdGEtPmVuYWJsZV9jaGFubmVsX2NvbWJpbmU7Ci0JCWRldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zcmFtX3NpemUgPQotCQkJcGRhdGEtPnNyYW1fc2l6ZV9wbGF5YmFjazsKLQkJZGV2LT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3JhbV9zaXplID0KLQkJCXBkYXRhLT5zcmFtX3NpemVfY2FwdHVyZTsKLQkJZGV2LT5jbGtfaW5wdXRfcGluID0gcGRhdGEtPmNsa19pbnB1dF9waW47Ci0JCWRldi0+aTJzX2FjY3VyYXRlX3NjayA9IHBkYXRhLT5pMnNfYWNjdXJhdGVfc2NrOwotCQlhc3BfY2hhbl9xID0gcGRhdGEtPmFzcF9jaGFuX3E7Ci0JCXJhbV9jaGFuX3EgPSBwZGF0YS0+cmFtX2NoYW5fcTsKLQl9Ci0KLQlkZXYtPmRtYV9wYXJhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uYXNwX2NoYW5fcQk9IGFzcF9jaGFuX3E7Ci0JZGV2LT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnJhbV9jaGFuX3EJPSByYW1fY2hhbl9xOwotCWRldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLmFzcF9jaGFuX3EJPSBhc3BfY2hhbl9xOwotCWRldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnJhbV9jaGFuX3EJPSByYW1fY2hhbl9xOwogCiAJZGV2LT5jbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOwogCWlmIChJU19FUlIoZGV2LT5jbGspKQpAQCAtNzA1LDEwICs2ODYsMTAgQEAKIAkJZ290byBlcnJfcmVsZWFzZV9jbGs7CiAJfQogCi0JZGV2LT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmRtYV9hZGRyID0KKwlkZXYtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmFkZHIgPQogCSAgICAoZG1hX2FkZHJfdCkobWVtLT5zdGFydCArIERBVklOQ0lfTUNCU1BfRFhSX1JFRyk7CiAKLQlkZXYtPmRtYV9wYXJhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5kbWFfYWRkciA9CisJZGV2LT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLmFkZHIgPQogCSAgICAoZG1hX2FkZHJfdCkobWVtLT5zdGFydCArIERBVklOQ0lfTUNCU1BfRFJSX1JFRyk7CiAKIAkvKiBmaXJzdCBUWCwgdGhlbiBSWCAqLwpAQCAtNzE4LDcgKzY5OSw5IEBACiAJCXJldCA9IC1FTlhJTzsKIAkJZ290byBlcnJfcmVsZWFzZV9jbGs7CiAJfQotCWRldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5jaGFubmVsID0gcmVzLT5zdGFydDsKKwlkbWEgPSAmZGV2LT5kbWFfcmVxdWVzdFtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKKwkqZG1hID0gcmVzLT5zdGFydDsKKwlkZXYtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmZpbHRlcl9kYXRhID0gZG1hOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfRE1BLCAxKTsKIAlpZiAoIXJlcykgewpAQCAtNzI2LDkgKzcwOSwxMSBAQAogCQlyZXQgPSAtRU5YSU87CiAJCWdvdG8gZXJyX3JlbGVhc2VfY2xrOwogCX0KLQlkZXYtPmRtYV9wYXJhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5jaGFubmVsID0gcmVzLT5zdGFydDsKLQlkZXYtPmRldiA9ICZwZGV2LT5kZXY7CisJZG1hID0gJmRldi0+ZG1hX3JlcXVlc3RbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXTsKKwkqZG1hID0gcmVzLT5zdGFydDsKKwlkZXYtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uZmlsdGVyX2RhdGEgPSBkbWE7CiAKKwlkZXYtPmRldiA9ICZwZGV2LT5kZXY7CiAJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRldik7CiAKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAmZGF2aW5jaV9pMnNfY29tcG9uZW50LApAQCAtNzM2LDcgKzcyMSw3IEBACiAJaWYgKHJldCAhPSAwKQogCQlnb3RvIGVycl9yZWxlYXNlX2NsazsKIAotCXJldCA9IGRhdmluY2lfc29jX3BsYXRmb3JtX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOworCXJldCA9IGVkbWFfcGNtX3BsYXRmb3JtX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVnaXN0ZXIgUENNIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXJyX3VucmVnaXN0ZXJfY29tcG9uZW50OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1tY2FzcC5jCmluZGV4IGRlM2IxNTUuLmJiNGI3OGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktbWNhc3AuYworKysgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLW1jYXNwLmMKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9kYXZpbmNpX2FzcC5oPgorI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgogCiAjaW5jbHVkZSA8c291bmQvYXNvdW5kZWYuaD4KICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CkBAIC0zNiw3ICszOCw2IEBACiAjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgogI2luY2x1ZGUgPHNvdW5kL29tYXAtcGNtLmg+CiAKLSNpbmNsdWRlICJkYXZpbmNpLXBjbS5oIgogI2luY2x1ZGUgImVkbWEtcGNtLmgiCiAjaW5jbHVkZSAiZGF2aW5jaS1tY2FzcC5oIgogCkBAIC02MiwxMCArNjMsMTUgQEAKIAl1MzIJY29uZmlnX3JlZ3NbQVJSQVlfU0laRShjb250ZXh0X3JlZ3MpXTsKIAl1MzIJYWZpZm9fcmVnc1syXTsgLyogZm9yIHJlYWQvd3JpdGUgZmlmbyBjb250cm9sIHJlZ2lzdGVycyAqLwogCXUzMgkqeHJzcl9yZWdzOyAvKiBmb3Igc2VyaWFsaXplciBjb25maWd1cmF0aW9uICovCisJYm9vbAlwbV9zdGF0ZTsKK307CisKK3N0cnVjdCBkYXZpbmNpX21jYXNwX3J1bGVkYXRhIHsKKwlzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3A7CisJaW50IHNlcmlhbGl6ZXJzOwogfTsKIAogc3RydWN0IGRhdmluY2lfbWNhc3AgewotCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zIGRtYV9wYXJhbXNbMl07CiAJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIGRtYV9kYXRhWzJdOwogCXZvaWQgX19pb21lbSAqYmFzZTsKIAl1MzIgZmlmb19iYXNlOwpAQCAtODIsNiArODgsNyBAQAogCXUxNgliY2xrX2xyY2xrX3JhdGlvOwogCWludAlzdHJlYW1zOwogCXUzMglpcnFfcmVxdWVzdFsyXTsKKwlpbnQJZG1hX3JlcXVlc3RbMl07CiAKIAlpbnQJc3lzY2xrX2ZyZXE7CiAJYm9vbAliY2xrX21hc3RlcjsKQEAgLTk4LDYgKzEwNSw4IEBACiAjaWZkZWYgQ09ORklHX1BNX1NMRUVQCiAJc3RydWN0IGRhdmluY2lfbWNhc3BfY29udGV4dCBjb250ZXh0OwogI2VuZGlmCisKKwlzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9ydWxlZGF0YSBydWxlZGF0YVsyXTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBtY2FzcF9zZXRfYml0cyhzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3AsIHUzMiBvZmZzZXQsCkBAIC00NDEsNiArNDUwLDE4IEBACiAJCW1jYXNwX3NldF9iaXRzKG1jYXNwLCBEQVZJTkNJX01DQVNQX1BESVJfUkVHLCBBRlNYIHwgQUZTUik7CiAJCW1jYXNwLT5iY2xrX21hc3RlciA9IDE7CiAJCWJyZWFrOworCWNhc2UgU05EX1NPQ19EQUlGTVRfQ0JTX0NGTToKKwkJLyogY29kZWMgaXMgY2xvY2sgc2xhdmUgYW5kIGZyYW1lIG1hc3RlciAqLworCQltY2FzcF9zZXRfYml0cyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BQ0xLWENUTF9SRUcsIEFDTEtYRSk7CisJCW1jYXNwX2Nscl9iaXRzKG1jYXNwLCBEQVZJTkNJX01DQVNQX1RYRk1DVExfUkVHLCBBRlNYRSk7CisKKwkJbWNhc3Bfc2V0X2JpdHMobWNhc3AsIERBVklOQ0lfTUNBU1BfQUNMS1JDVExfUkVHLCBBQ0xLUkUpOworCQltY2FzcF9jbHJfYml0cyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9SWEZNQ1RMX1JFRywgQUZTUkUpOworCisJCW1jYXNwX3NldF9iaXRzKG1jYXNwLCBEQVZJTkNJX01DQVNQX1BESVJfUkVHLCBBQ0xLWCB8IEFDTEtSKTsKKwkJbWNhc3BfY2xyX2JpdHMobWNhc3AsIERBVklOQ0lfTUNBU1BfUERJUl9SRUcsIEFGU1ggfCBBRlNSKTsKKwkJbWNhc3AtPmJjbGtfbWFzdGVyID0gMTsKKwkJYnJlYWs7CiAJY2FzZSBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZTOgogCQkvKiBjb2RlYyBpcyBjbG9jayBtYXN0ZXIgYW5kIGZyYW1lIHNsYXZlICovCiAJCW1jYXNwX2Nscl9iaXRzKG1jYXNwLCBEQVZJTkNJX01DQVNQX0FDTEtYQ1RMX1JFRywgQUNMS1hFKTsKQEAgLTUwNyw3ICs1MjgsNyBAQAogCQltY2FzcF9zZXRfYml0cyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9SWEZNQ1RMX1JFRywgRlNSUE9MKTsKIAl9CiBvdXQ6Ci0JcG1fcnVudGltZV9wdXRfc3luYyhtY2FzcC0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dChtY2FzcC0+ZGV2KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC01MTYsNiArNTM3LDcgQEAKIHsKIAlzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3AgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCisJcG1fcnVudGltZV9nZXRfc3luYyhtY2FzcC0+ZGV2KTsKIAlzd2l0Y2ggKGRpdl9pZCkgewogCWNhc2UgMDoJCS8qIE1DTEsgZGl2aWRlciAqLwogCQltY2FzcF9tb2RfYml0cyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BSENMS1hDVExfUkVHLApAQCAtNTQxLDYgKzU2Myw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXBtX3J1bnRpbWVfcHV0KG1jYXNwLT5kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC01NTUsNiArNTc4LDcgQEAKIHsKIAlzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3AgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCisJcG1fcnVudGltZV9nZXRfc3luYyhtY2FzcC0+ZGV2KTsKIAlpZiAoZGlyID09IFNORF9TT0NfQ0xPQ0tfT1VUKSB7CiAJCW1jYXNwX3NldF9iaXRzKG1jYXNwLCBEQVZJTkNJX01DQVNQX0FIQ0xLWENUTF9SRUcsIEFIQ0xLWEUpOwogCQltY2FzcF9zZXRfYml0cyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9BSENMS1JDVExfUkVHLCBBSENMS1JFKTsKQEAgLTU2Nyw2ICs1OTEsNyBAQAogCiAJbWNhc3AtPnN5c2Nsa19mcmVxID0gZnJlcTsKIAorCXBtX3J1bnRpbWVfcHV0KG1jYXNwLT5kZXYpOwogCXJldHVybiAwOwogfQogCkBAIC02MzEsNyArNjU2LDYgQEAKIHN0YXRpYyBpbnQgbWNhc3BfY29tbW9uX2h3X3BhcmFtKHN0cnVjdCBkYXZpbmNpX21jYXNwICptY2FzcCwgaW50IHN0cmVhbSwKIAkJCQkgaW50IHBlcmlvZF93b3JkcywgaW50IGNoYW5uZWxzKQogewotCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zICpkbWFfcGFyYW1zID0gJm1jYXNwLT5kbWFfcGFyYW1zW3N0cmVhbV07CiAJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfZGF0YSA9ICZtY2FzcC0+ZG1hX2RhdGFbc3RyZWFtXTsKIAlpbnQgaTsKIAl1OCB0eF9zZXIgPSAwOwpAQCAtNjk5LDEwICs3MjMsOCBAQAogCQkJICogRm9yIGV4YW1wbGUgaWYgdGhyZWUgc2VyaWFsaXplcnMgYXJlIGVuYWJsZWQgdGhlIERNQQogCQkJICogbmVlZCB0byB0cmFuc2ZlciB0aHJlZSB3b3JkcyBwZXIgRE1BIHJlcXVlc3QuCiAJCQkgKi8KLQkJCWRtYV9wYXJhbXMtPmZpZm9fbGV2ZWwgPSBhY3RpdmVfc2VyaWFsaXplcnM7CiAJCQlkbWFfZGF0YS0+bWF4YnVyc3QgPSBhY3RpdmVfc2VyaWFsaXplcnM7CiAJCX0gZWxzZSB7Ci0JCQlkbWFfcGFyYW1zLT5maWZvX2xldmVsID0gMDsKIAkJCWRtYV9kYXRhLT5tYXhidXJzdCA9IDA7CiAJCX0KIAkJcmV0dXJuIDA7CkBAIC03MzQsNyArNzU2LDYgQEAKIAkvKiBDb25maWd1cmUgdGhlIGJ1cnN0IHNpemUgZm9yIHBsYXRmb3JtIGRyaXZlcnMgKi8KIAlpZiAobnVtZXZ0ID09IDEpCiAJCW51bWV2dCA9IDA7Ci0JZG1hX3BhcmFtcy0+Zmlmb19sZXZlbCA9IG51bWV2dDsKIAlkbWFfZGF0YS0+bWF4YnVyc3QgPSBudW1ldnQ7CiAKIAlyZXR1cm4gMDsKQEAgLTg1NSwxMyArODc2LDM1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZGF2aW5jaV9tY2FzcF9jYWxjX2Nsa19kaXYoc3RydWN0IGRhdmluY2lfbWNhc3AgKm1jYXNwLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBiY2xrX2ZyZXEsCisJCQkJICAgICAgaW50ICplcnJvcl9wcG0pCit7CisJaW50IGRpdiA9IG1jYXNwLT5zeXNjbGtfZnJlcSAvIGJjbGtfZnJlcTsKKwlpbnQgcmVtID0gbWNhc3AtPnN5c2Nsa19mcmVxICUgYmNsa19mcmVxOworCisJaWYgKHJlbSAhPSAwKSB7CisJCWlmIChkaXYgPT0gMCB8fAorCQkgICAgKChtY2FzcC0+c3lzY2xrX2ZyZXEgLyBkaXYpIC0gYmNsa19mcmVxKSA+CisJCSAgICAoYmNsa19mcmVxIC0gKG1jYXNwLT5zeXNjbGtfZnJlcSAvIChkaXYrMSkpKSkgeworCQkJZGl2Kys7CisJCQlyZW0gPSByZW0gLSBiY2xrX2ZyZXE7CisJCX0KKwl9CisJaWYgKGVycm9yX3BwbSkKKwkJKmVycm9yX3BwbSA9CisJCQkoZGl2KjEwMDAwMDAgKyAoaW50KWRpdjY0X2xvbmcoMTAwMDAwMExMKnJlbSwKKwkJCQkJCSAgICAgICAoaW50KWJjbGtfZnJlcSkpCisJCQkvZGl2IC0gMTAwMDAwMDsKKworCXJldHVybiBkaXY7Cit9CisKIHN0YXRpYyBpbnQgZGF2aW5jaV9tY2FzcF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAogCQkJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCiB7CiAJc3RydWN0IGRhdmluY2lfbWNhc3AgKm1jYXNwID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7Ci0Jc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXMgPQotCQkJCQkmbWNhc3AtPmRtYV9wYXJhbXNbc3Vic3RyZWFtLT5zdHJlYW1dOwogCWludCB3b3JkX2xlbmd0aDsKIAlpbnQgY2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKIAlpbnQgcGVyaW9kX3NpemUgPSBwYXJhbXNfcGVyaW9kX3NpemUocGFyYW1zKTsKQEAgLTg3MiwxNiArOTE1LDIwIEBACiAJICogdGhlIG1hY2hpbmUgZHJpdmVyLCB3ZSBuZWVkIHRvIGNhbGN1bGF0ZSB0aGUgcmF0aW8uCiAJICovCiAJaWYgKG1jYXNwLT5iY2xrX21hc3RlciAmJiBtY2FzcC0+YmNsa19kaXYgPT0gMCAmJiBtY2FzcC0+c3lzY2xrX2ZyZXEpIHsKLQkJdW5zaWduZWQgaW50IGJjbGtfZnJlcSA9IHNuZF9zb2NfcGFyYW1zX3RvX2JjbGsocGFyYW1zKTsKLQkJdW5zaWduZWQgaW50IGRpdiA9IG1jYXNwLT5zeXNjbGtfZnJlcSAvIGJjbGtfZnJlcTsKLQkJaWYgKG1jYXNwLT5zeXNjbGtfZnJlcSAlIGJjbGtfZnJlcSAhPSAwKSB7Ci0JCQlpZiAoKChtY2FzcC0+c3lzY2xrX2ZyZXEgLyBkaXYpIC0gYmNsa19mcmVxKSA+Ci0JCQkgICAgKGJjbGtfZnJlcSAtIChtY2FzcC0+c3lzY2xrX2ZyZXEgLyAoZGl2KzEpKSkpCi0JCQkJZGl2Kys7Ci0JCQlkZXZfd2FybihtY2FzcC0+ZGV2LAotCQkJCSAiSW5hY2N1cmF0ZSBCQ0xLOiAldSBIeiAvICV1ICE9ICV1IEh6XG4iLAotCQkJCSBtY2FzcC0+c3lzY2xrX2ZyZXEsIGRpdiwgYmNsa19mcmVxKTsKLQkJfQorCQlpbnQgY2hhbm5lbHMgPSBwYXJhbXNfY2hhbm5lbHMocGFyYW1zKTsKKwkJaW50IHJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCQlpbnQgc2JpdHMgPSBwYXJhbXNfd2lkdGgocGFyYW1zKTsKKwkJaW50IHBwbSwgZGl2OworCisJCWlmIChjaGFubmVscyA+IG1jYXNwLT50ZG1fc2xvdHMpCisJCQljaGFubmVscyA9IG1jYXNwLT50ZG1fc2xvdHM7CisKKwkJZGl2ID0gZGF2aW5jaV9tY2FzcF9jYWxjX2Nsa19kaXYobWNhc3AsIHJhdGUqc2JpdHMqY2hhbm5lbHMsCisJCQkJCQkgJnBwbSk7CisJCWlmIChwcG0pCisJCQlkZXZfaW5mbyhtY2FzcC0+ZGV2LCAiU2FtcGxlLXJhdGUgaXMgb2ZmIGJ5ICVkIFBQTVxuIiwKKwkJCQkgcHBtKTsKKwogCQlfX2RhdmluY2lfbWNhc3Bfc2V0X2Nsa2RpdihjcHVfZGFpLCAxLCBkaXYsIDApOwogCX0KIApAQCAtOTAyLDMxICs5NDksMjYgQEAKIAlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9VODoKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzg6Ci0JCWRtYV9wYXJhbXMtPmRhdGFfdHlwZSA9IDE7CiAJCXdvcmRfbGVuZ3RoID0gODsKIAkJYnJlYWs7CiAKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfVTE2X0xFOgogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEU6Ci0JCWRtYV9wYXJhbXMtPmRhdGFfdHlwZSA9IDI7CiAJCXdvcmRfbGVuZ3RoID0gMTY7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1UyNF8zTEU6CiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF8zTEU6Ci0JCWRtYV9wYXJhbXMtPmRhdGFfdHlwZSA9IDM7CiAJCXdvcmRfbGVuZ3RoID0gMjQ7CiAJCWJyZWFrOwogCiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1UyNF9MRToKIAljYXNlIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFOgotCQlkbWFfcGFyYW1zLT5kYXRhX3R5cGUgPSA0OwogCQl3b3JkX2xlbmd0aCA9IDI0OwogCQlicmVhazsKIAogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9VMzJfTEU6CiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKLQkJZG1hX3BhcmFtcy0+ZGF0YV90eXBlID0gNDsKIAkJd29yZF9sZW5ndGggPSAzMjsKIAkJYnJlYWs7CiAKQEAgLTkzNSwxMSArOTc3LDYgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKG1jYXNwLT52ZXJzaW9uID09IE1DQVNQX1ZFUlNJT05fMiAmJiAhZG1hX3BhcmFtcy0+Zmlmb19sZXZlbCkKLQkJZG1hX3BhcmFtcy0+YWNudCA9IDQ7Ci0JZWxzZQotCQlkbWFfcGFyYW1zLT5hY250ID0gZG1hX3BhcmFtcy0+ZGF0YV90eXBlOwotCiAJZGF2aW5jaV9jb25maWdfY2hhbm5lbF9zaXplKG1jYXNwLCB3b3JkX2xlbmd0aCk7CiAKIAlpZiAobWNhc3AtPm9wX21vZGUgPT0gREFWSU5DSV9NQ0FTUF9JSVNfTU9ERSkKQEAgLTk3MywxMCArMTAxMCwxMjYgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGRhdmluY2lfbWNhc3BfZGFpX3JhdGVzW10gPSB7CisJODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgNjQwMDAsCisJODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMCwKK307CisKKyNkZWZpbmUgREFWSU5DSV9NQVhfUkFURV9FUlJPUl9QUE0gMTAwMAorCitzdGF0aWMgaW50IGRhdmluY2lfbWNhc3BfaHdfcnVsZV9yYXRlKHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3J1bGUgKnJ1bGUpCit7CisJc3RydWN0IGRhdmluY2lfbWNhc3BfcnVsZWRhdGEgKnJkID0gcnVsZS0+cHJpdmF0ZTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyaSA9CisJCWh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCWludCBzYml0cyA9IHBhcmFtc193aWR0aChwYXJhbXMpOworCWludCBjaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCXVuc2lnbmVkIGludCBsaXN0W0FSUkFZX1NJWkUoZGF2aW5jaV9tY2FzcF9kYWlfcmF0ZXMpXTsKKwlpbnQgaSwgY291bnQgPSAwOworCisJaWYgKGNoYW5uZWxzID4gcmQtPm1jYXNwLT50ZG1fc2xvdHMpCisJCWNoYW5uZWxzID0gcmQtPm1jYXNwLT50ZG1fc2xvdHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkYXZpbmNpX21jYXNwX2RhaV9yYXRlcyk7IGkrKykgeworCQlpZiAocmktPm1pbiA8PSBkYXZpbmNpX21jYXNwX2RhaV9yYXRlc1tpXSAmJgorCQkgICAgcmktPm1heCA+PSBkYXZpbmNpX21jYXNwX2RhaV9yYXRlc1tpXSkgeworCQkJdWludCBiY2xrX2ZyZXEgPSBzYml0cypjaGFubmVscyoKKwkJCQlkYXZpbmNpX21jYXNwX2RhaV9yYXRlc1tpXTsKKwkJCWludCBwcG07CisKKwkJCWRhdmluY2lfbWNhc3BfY2FsY19jbGtfZGl2KHJkLT5tY2FzcCwgYmNsa19mcmVxLCAmcHBtKTsKKwkJCWlmIChhYnMocHBtKSA8IERBVklOQ0lfTUFYX1JBVEVfRVJST1JfUFBNKQorCQkJCWxpc3RbY291bnQrK10gPSBkYXZpbmNpX21jYXNwX2RhaV9yYXRlc1tpXTsKKwkJfQorCX0KKwlkZXZfZGJnKHJkLT5tY2FzcC0+ZGV2LAorCQkiJWQgZnJlcXVlbmNpZXMgKCVkLSVkKSBmb3IgJWQgc2JpdHMgYW5kICVkIGNoYW5uZWxzXG4iLAorCQljb3VudCwgcmktPm1pbiwgcmktPm1heCwgc2JpdHMsIGNoYW5uZWxzKTsKKworCXJldHVybiBzbmRfaW50ZXJ2YWxfbGlzdChod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIHJ1bGUtPnZhciksCisJCQkJIGNvdW50LCBsaXN0LCAwKTsKK30KKworc3RhdGljIGludCBkYXZpbmNpX21jYXNwX2h3X3J1bGVfZm9ybWF0KHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19ydWxlICpydWxlKQoreworCXN0cnVjdCBkYXZpbmNpX21jYXNwX3J1bGVkYXRhICpyZCA9IHJ1bGUtPnByaXZhdGU7CisJc3RydWN0IHNuZF9tYXNrICpmbXQgPSBod19wYXJhbV9tYXNrKHBhcmFtcywgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCk7CisJc3RydWN0IHNuZF9tYXNrIG5mbXQ7CisJaW50IHJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCWludCBjaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCWludCBpLCBjb3VudCA9IDA7CisKKwlzbmRfbWFza19ub25lKCZuZm10KTsKKworCWlmIChjaGFubmVscyA+IHJkLT5tY2FzcC0+dGRtX3Nsb3RzKQorCQljaGFubmVscyA9IHJkLT5tY2FzcC0+dGRtX3Nsb3RzOworCisJZm9yIChpID0gMDsgaSA8IFNORFJWX1BDTV9GT1JNQVRfTEFTVDsgaSsrKSB7CisJCWlmIChzbmRfbWFza190ZXN0KGZtdCwgaSkpIHsKKwkJCXVpbnQgYmNsa19mcmVxID0gc25kX3BjbV9mb3JtYXRfd2lkdGgoaSkqY2hhbm5lbHMqcmF0ZTsKKwkJCWludCBwcG07CisKKwkJCWRhdmluY2lfbWNhc3BfY2FsY19jbGtfZGl2KHJkLT5tY2FzcCwgYmNsa19mcmVxLCAmcHBtKTsKKwkJCWlmIChhYnMocHBtKSA8IERBVklOQ0lfTUFYX1JBVEVfRVJST1JfUFBNKSB7CisJCQkJc25kX21hc2tfc2V0KCZuZm10LCBpKTsKKwkJCQljb3VudCsrOworCQkJfQorCQl9CisJfQorCWRldl9kYmcocmQtPm1jYXNwLT5kZXYsCisJCSIlZCBwb3NzaWJsZSBzYW1wbGUgZm9ybWF0IGZvciAlZCBIeiBhbmQgJWQgY2hhbm5lbHNcbiIsCisJCWNvdW50LCByYXRlLCBjaGFubmVscyk7CisKKwlyZXR1cm4gc25kX21hc2tfcmVmaW5lKGZtdCwgJm5mbXQpOworfQorCitzdGF0aWMgaW50IGRhdmluY2lfbWNhc3BfaHdfcnVsZV9jaGFubmVscyhzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKKwkJCQkJICBzdHJ1Y3Qgc25kX3BjbV9od19ydWxlICpydWxlKQoreworCXN0cnVjdCBkYXZpbmNpX21jYXNwX3J1bGVkYXRhICpyZCA9IHJ1bGUtPnByaXZhdGU7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2kgPQorCQlod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisJaW50IHNiaXRzID0gcGFyYW1zX3dpZHRoKHBhcmFtcyk7CisJaW50IHJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCWludCBtYXhfY2hhbl9wZXJfd2lyZSA9IHJkLT5tY2FzcC0+dGRtX3Nsb3RzIDwgY2ktPm1heCA/CisJCXJkLT5tY2FzcC0+dGRtX3Nsb3RzIDogY2ktPm1heDsKKwl1bnNpZ25lZCBpbnQgbGlzdFtjaS0+bWF4IC0gY2ktPm1pbiArIDFdOworCWludCBjMSwgYywgY291bnQgPSAwOworCisJZm9yIChjMSA9IGNpLT5taW47IGMxIDw9IG1heF9jaGFuX3Blcl93aXJlOyBjMSsrKSB7CisJCXVpbnQgYmNsa19mcmVxID0gYzEqc2JpdHMqcmF0ZTsKKwkJaW50IHBwbTsKKworCQlkYXZpbmNpX21jYXNwX2NhbGNfY2xrX2RpdihyZC0+bWNhc3AsIGJjbGtfZnJlcSwgJnBwbSk7CisJCWlmIChhYnMocHBtKSA8IERBVklOQ0lfTUFYX1JBVEVfRVJST1JfUFBNKSB7CisJCQkvKiBJZiB3ZSBjYW4gdXNlIGFsbCB0ZG1fc2xvdHMsIHdlIGNhbiBwdXQgYW55CisJCQkgICBhbW91bnQgb2YgY2hhbm5lbHMgdG8gcmVtYWluaW5nIHdpcmVzIGFzCisJCQkgICBsb25nIGFzIHRoZXkgZml0IGluLiAqLworCQkJaWYgKGMxID09IHJkLT5tY2FzcC0+dGRtX3Nsb3RzKSB7CisJCQkJZm9yIChjID0gYzE7IGMgPD0gcmQtPnNlcmlhbGl6ZXJzKmMxICYmCisJCQkJCSAgICAgYyA8PSBjaS0+bWF4OyBjKyspCisJCQkJCWxpc3RbY291bnQrK10gPSBjOworCQkJfSBlbHNlIHsKKwkJCQlsaXN0W2NvdW50KytdID0gYzE7CisJCQl9CisJCX0KKwl9CisJZGV2X2RiZyhyZC0+bWNhc3AtPmRldiwKKwkJIiVkIHBvc3NpYmxlIGNoYW5uZWwgY291bnRzICglZC0lZCkgZm9yICVkIEh6IGFuZCAlZCBzYml0c1xuIiwKKwkJY291bnQsIGNpLT5taW4sIGNpLT5tYXgsIHJhdGUsIHNiaXRzKTsKKworCXJldHVybiBzbmRfaW50ZXJ2YWxfbGlzdChod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsIHJ1bGUtPnZhciksCisJCQkJIGNvdW50LCBsaXN0LCAwKTsKK30KKwogc3RhdGljIGludCBkYXZpbmNpX21jYXNwX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkJIHN0cnVjdCBzbmRfc29jX2RhaSAqY3B1X2RhaSkKIHsKIAlzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3AgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShjcHVfZGFpKTsKKwlzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9ydWxlZGF0YSAqcnVsZWRhdGEgPQorCQkJCQkmbWNhc3AtPnJ1bGVkYXRhW3N1YnN0cmVhbS0+c3RyZWFtXTsKIAl1MzIgbWF4X2NoYW5uZWxzID0gMDsKIAlpbnQgaSwgZGlyOwogCkBAIC05OTgsNiArMTE1MSw3IEBACiAJCWlmIChtY2FzcC0+c2VyaWFsX2RpcltpXSA9PSBkaXIpCiAJCQltYXhfY2hhbm5lbHMrKzsKIAl9CisJcnVsZWRhdGEtPnNlcmlhbGl6ZXJzID0gbWF4X2NoYW5uZWxzOwogCW1heF9jaGFubmVscyAqPSBtY2FzcC0+dGRtX3Nsb3RzOwogCS8qCiAJICogSWYgdGhlIGFscmVhZHkgYWN0aXZlIHN0cmVhbSBoYXMgbGVzcyBjaGFubmVscyB0aGFuIHRoZSBjYWxjdWxhdGVkCkBAIC0xMDEyLDYgKzExNjYsNDIgQEAKIAlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHN1YnN0cmVhbS0+cnVudGltZSwKIAkJCQkgICAgIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywKIAkJCQkgICAgIDIsIG1heF9jaGFubmVscyk7CisKKwkvKgorCSAqIElmIHdlIHJlbHkgb24gaW1wbGljaXQgQkNMSyBkaXZpZGVyIHNldHRpbmcgd2Ugc2hvdWxkCisJICogc2V0IGNvbnN0cmFpbnRzIGJhc2VkIG9uIHdoYXQgd2UgY2FuIHByb3ZpZGUuCisJICovCisJaWYgKG1jYXNwLT5iY2xrX21hc3RlciAmJiBtY2FzcC0+YmNsa19kaXYgPT0gMCAmJiBtY2FzcC0+c3lzY2xrX2ZyZXEpIHsKKwkJaW50IHJldDsKKworCQlydWxlZGF0YS0+bWNhc3AgPSBtY2FzcDsKKworCQlyZXQgPSBzbmRfcGNtX2h3X3J1bGVfYWRkKHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCQkJICBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkJICBkYXZpbmNpX21jYXNwX2h3X3J1bGVfcmF0ZSwKKwkJCQkJICBydWxlZGF0YSwKKwkJCQkJICBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULAorCQkJCQkgIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywgLTEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gc25kX3BjbV9od19ydWxlX2FkZChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsCisJCQkJCSAgU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCwKKwkJCQkJICBkYXZpbmNpX21jYXNwX2h3X3J1bGVfZm9ybWF0LAorCQkJCQkgIHJ1bGVkYXRhLAorCQkJCQkgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJCQkgIFNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUywgLTEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gc25kX3BjbV9od19ydWxlX2FkZChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsCisJCQkJCSAgU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTLAorCQkJCQkgIGRhdmluY2lfbWNhc3BfaHdfcnVsZV9jaGFubmVscywKKwkJCQkJICBydWxlZGF0YSwKKwkJCQkJICBTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKKwkJCQkJICBTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFULCAtMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMDQzLDE3ICsxMjMzLDggQEAKIHsKIAlzdHJ1Y3QgZGF2aW5jaV9tY2FzcCAqbWNhc3AgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwogCi0JaWYgKG1jYXNwLT52ZXJzaW9uID49IE1DQVNQX1ZFUlNJT05fMykgewotCQkvKiBVc2luZyBkbWFlbmdpbmUgUENNICovCi0JCWRhaS0+cGxheWJhY2tfZG1hX2RhdGEgPQotCQkJCSZtY2FzcC0+ZG1hX2RhdGFbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS107Ci0JCWRhaS0+Y2FwdHVyZV9kbWFfZGF0YSA9Ci0JCQkJJm1jYXNwLT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdOwotCX0gZWxzZSB7Ci0JCS8qIFVzaW5nIGRhdmluY2ktcGNtICovCi0JCWRhaS0+cGxheWJhY2tfZG1hX2RhdGEgPSBtY2FzcC0+ZG1hX3BhcmFtczsKLQkJZGFpLT5jYXB0dXJlX2RtYV9kYXRhID0gbWNhc3AtPmRtYV9wYXJhbXM7Ci0JfQorCWRhaS0+cGxheWJhY2tfZG1hX2RhdGEgPSAmbWNhc3AtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOworCWRhaS0+Y2FwdHVyZV9kbWFfZGF0YSA9ICZtY2FzcC0+ZG1hX2RhdGFbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXTsKIAogCXJldHVybiAwOwogfQpAQCAtMTA2Niw2ICsxMjQ3LDEwIEBACiAJdTMyIHJlZzsKIAlpbnQgaTsKIAorCWNvbnRleHQtPnBtX3N0YXRlID0gcG1fcnVudGltZV9lbmFibGVkKG1jYXNwLT5kZXYpOworCWlmICghY29udGV4dC0+cG1fc3RhdGUpCisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMobWNhc3AtPmRldik7CisKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb250ZXh0X3JlZ3MpOyBpKyspCiAJCWNvbnRleHQtPmNvbmZpZ19yZWdzW2ldID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwgY29udGV4dF9yZWdzW2ldKTsKIApAQCAtMTA4Miw2ICsxMjY3LDggQEAKIAkJY29udGV4dC0+eHJzcl9yZWdzW2ldID0gbWNhc3BfZ2V0X3JlZyhtY2FzcCwKIAkJCQkJCURBVklOQ0lfTUNBU1BfWFJTUkNUTF9SRUcoaSkpOwogCisJcG1fcnVudGltZV9wdXRfc3luYyhtY2FzcC0+ZGV2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMDkyLDYgKzEyNzksOCBAQAogCXUzMiByZWc7CiAJaW50IGk7CiAKKwlwbV9ydW50aW1lX2dldF9zeW5jKG1jYXNwLT5kZXYpOworCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29udGV4dF9yZWdzKTsgaSsrKQogCQltY2FzcF9zZXRfcmVnKG1jYXNwLCBjb250ZXh0X3JlZ3NbaV0sIGNvbnRleHQtPmNvbmZpZ19yZWdzW2ldKTsKIApAQCAtMTEwOCw2ICsxMjk3LDkgQEAKIAkJbWNhc3Bfc2V0X3JlZyhtY2FzcCwgREFWSU5DSV9NQ0FTUF9YUlNSQ1RMX1JFRyhpKSwKIAkJCSAgICAgIGNvbnRleHQtPnhyc3JfcmVnc1tpXSk7CiAKKwlpZiAoIWNvbnRleHQtPnBtX3N0YXRlKQorCQlwbV9ydW50aW1lX3B1dF9zeW5jKG1jYXNwLT5kZXYpOworCiAJcmV0dXJuIDA7CiB9CiAjZWxzZQpAQCAtMTE3MiwyOCArMTM2NCwyNCBAQAogc3RhdGljIHN0cnVjdCBkYXZpbmNpX21jYXNwX3BkYXRhIGRtNjQ2eF9tY2FzcF9wZGF0YSA9IHsKIAkudHhfZG1hX29mZnNldCA9IDB4NDAwLAogCS5yeF9kbWFfb2Zmc2V0ID0gMHg0MDAsCi0JLmFzcF9jaGFuX3EgPSBFVkVOVFFfMCwKIAkudmVyc2lvbiA9IE1DQVNQX1ZFUlNJT05fMSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9wZGF0YSBkYTgzMF9tY2FzcF9wZGF0YSA9IHsKIAkudHhfZG1hX29mZnNldCA9IDB4MjAwMCwKIAkucnhfZG1hX29mZnNldCA9IDB4MjAwMCwKLQkuYXNwX2NoYW5fcSA9IEVWRU5UUV8wLAogCS52ZXJzaW9uID0gTUNBU1BfVkVSU0lPTl8yLAogfTsKIAogc3RhdGljIHN0cnVjdCBkYXZpbmNpX21jYXNwX3BkYXRhIGFtMzN4eF9tY2FzcF9wZGF0YSA9IHsKIAkudHhfZG1hX29mZnNldCA9IDAsCiAJLnJ4X2RtYV9vZmZzZXQgPSAwLAotCS5hc3BfY2hhbl9xID0gRVZFTlRRXzAsCiAJLnZlcnNpb24gPSBNQ0FTUF9WRVJTSU9OXzMsCiB9OwogCiBzdGF0aWMgc3RydWN0IGRhdmluY2lfbWNhc3BfcGRhdGEgZHJhN19tY2FzcF9wZGF0YSA9IHsKIAkudHhfZG1hX29mZnNldCA9IDB4MjAwLAogCS5yeF9kbWFfb2Zmc2V0ID0gMHgyODQsCi0JLmFzcF9jaGFuX3EgPSBFVkVOVFFfMCwKIAkudmVyc2lvbiA9IE1DQVNQX1ZFUlNJT05fNCwKIH07CiAKQEAgLTEzNzAsMTIgKzE1NTgsMTIgQEAKIAogc3RhdGljIGludCBkYXZpbmNpX21jYXNwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgKmRtYV9wYXJhbXM7CiAJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhICpkbWFfZGF0YTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwgKmlvYXJlYSwgKnJlcywgKmRhdDsKIAlzdHJ1Y3QgZGF2aW5jaV9tY2FzcF9wZGF0YSAqcGRhdGE7CiAJc3RydWN0IGRhdmluY2lfbWNhc3AgKm1jYXNwOwogCWNoYXIgKmlycV9uYW1lOworCWludCAqZG1hOwogCWludCBpcnE7CiAJaW50IHJldDsKIApAQCAtMTQxNSwxMyArMTYwMyw2IEBACiAKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAotCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBkZXYtPmRldik7Ci0JaWYgKElTX0VSUl9WQUxVRShyZXQpKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgInBtX3J1bnRpbWVfZ2V0X3N5bmMoKSBmYWlsZWRcbiIpOwotCQlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCiAJbWNhc3AtPmJhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW0pKTsKIAlpZiAoIW1jYXNwLT5iYXNlKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgImlvcmVtYXAgZmFpbGVkXG4iKTsKQEAgLTE1MDksNTkgKzE2OTAsNDUgQEAKIAlpZiAoZGF0KQogCQltY2FzcC0+ZGF0X3BvcnQgPSB0cnVlOwogCi0JZG1hX3BhcmFtcyA9ICZtY2FzcC0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXTsKIAlkbWFfZGF0YSA9ICZtY2FzcC0+ZG1hX2RhdGFbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS107Ci0JZG1hX3BhcmFtcy0+YXNwX2NoYW5fcSA9IHBkYXRhLT5hc3BfY2hhbl9xOwotCWRtYV9wYXJhbXMtPnJhbV9jaGFuX3EgPSBwZGF0YS0+cmFtX2NoYW5fcTsKLQlkbWFfcGFyYW1zLT5zcmFtX3Bvb2wgPSBwZGF0YS0+c3JhbV9wb29sOwotCWRtYV9wYXJhbXMtPnNyYW1fc2l6ZSA9IHBkYXRhLT5zcmFtX3NpemVfcGxheWJhY2s7CiAJaWYgKGRhdCkKLQkJZG1hX3BhcmFtcy0+ZG1hX2FkZHIgPSBkYXQtPnN0YXJ0OworCQlkbWFfZGF0YS0+YWRkciA9IGRhdC0+c3RhcnQ7CiAJZWxzZQotCQlkbWFfcGFyYW1zLT5kbWFfYWRkciA9IG1lbS0+c3RhcnQgKyBwZGF0YS0+dHhfZG1hX29mZnNldDsKKwkJZG1hX2RhdGEtPmFkZHIgPSBtZW0tPnN0YXJ0ICsgcGRhdGEtPnR4X2RtYV9vZmZzZXQ7CiAKLQkvKiBVbmNvbmRpdGlvbmFsIGRtYWVuZ2luZSBzdHVmZiAqLwotCWRtYV9kYXRhLT5hZGRyID0gZG1hX3BhcmFtcy0+ZG1hX2FkZHI7Ci0KKwlkbWEgPSAmbWNhc3AtPmRtYV9yZXF1ZXN0W1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOwogCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMCk7CiAJaWYgKHJlcykKLQkJZG1hX3BhcmFtcy0+Y2hhbm5lbCA9IHJlcy0+c3RhcnQ7CisJCSpkbWEgPSByZXMtPnN0YXJ0OwogCWVsc2UKLQkJZG1hX3BhcmFtcy0+Y2hhbm5lbCA9IHBkYXRhLT50eF9kbWFfY2hhbm5lbDsKKwkJKmRtYSA9IHBkYXRhLT50eF9kbWFfY2hhbm5lbDsKIAogCS8qIGRtYWVuZ2luZSBmaWx0ZXIgZGF0YSBmb3IgRFQgYW5kIG5vbi1EVCBib290ICovCiAJaWYgKHBkZXYtPmRldi5vZl9ub2RlKQogCQlkbWFfZGF0YS0+ZmlsdGVyX2RhdGEgPSAidHgiOwogCWVsc2UKLQkJZG1hX2RhdGEtPmZpbHRlcl9kYXRhID0gJmRtYV9wYXJhbXMtPmNoYW5uZWw7CisJCWRtYV9kYXRhLT5maWx0ZXJfZGF0YSA9IGRtYTsKIAogCS8qIFJYIGlzIG5vdCB2YWxpZCBpbiBESVQgbW9kZSAqLwogCWlmIChtY2FzcC0+b3BfbW9kZSAhPSBEQVZJTkNJX01DQVNQX0RJVF9NT0RFKSB7Ci0JCWRtYV9wYXJhbXMgPSAmbWNhc3AtPmRtYV9wYXJhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXTsKIAkJZG1hX2RhdGEgPSAmbWNhc3AtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV07Ci0JCWRtYV9wYXJhbXMtPmFzcF9jaGFuX3EgPSBwZGF0YS0+YXNwX2NoYW5fcTsKLQkJZG1hX3BhcmFtcy0+cmFtX2NoYW5fcSA9IHBkYXRhLT5yYW1fY2hhbl9xOwotCQlkbWFfcGFyYW1zLT5zcmFtX3Bvb2wgPSBwZGF0YS0+c3JhbV9wb29sOwotCQlkbWFfcGFyYW1zLT5zcmFtX3NpemUgPSBwZGF0YS0+c3JhbV9zaXplX2NhcHR1cmU7CiAJCWlmIChkYXQpCi0JCQlkbWFfcGFyYW1zLT5kbWFfYWRkciA9IGRhdC0+c3RhcnQ7CisJCQlkbWFfZGF0YS0+YWRkciA9IGRhdC0+c3RhcnQ7CiAJCWVsc2UKLQkJCWRtYV9wYXJhbXMtPmRtYV9hZGRyID0gbWVtLT5zdGFydCArIHBkYXRhLT5yeF9kbWFfb2Zmc2V0OworCQkJZG1hX2RhdGEtPmFkZHIgPSBtZW0tPnN0YXJ0ICsgcGRhdGEtPnJ4X2RtYV9vZmZzZXQ7CiAKLQkJLyogVW5jb25kaXRpb25hbCBkbWFlbmdpbmUgc3R1ZmYgKi8KLQkJZG1hX2RhdGEtPmFkZHIgPSBkbWFfcGFyYW1zLT5kbWFfYWRkcjsKLQorCQlkbWEgPSAmbWNhc3AtPmRtYV9yZXF1ZXN0W1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV07CiAJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0RNQSwgMSk7CiAJCWlmIChyZXMpCi0JCQlkbWFfcGFyYW1zLT5jaGFubmVsID0gcmVzLT5zdGFydDsKKwkJCSpkbWEgPSByZXMtPnN0YXJ0OwogCQllbHNlCi0JCQlkbWFfcGFyYW1zLT5jaGFubmVsID0gcGRhdGEtPnJ4X2RtYV9jaGFubmVsOworCQkJKmRtYSA9IHBkYXRhLT5yeF9kbWFfY2hhbm5lbDsKIAogCQkvKiBkbWFlbmdpbmUgZmlsdGVyIGRhdGEgZm9yIERUIGFuZCBub24tRFQgYm9vdCAqLwogCQlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCiAJCQlkbWFfZGF0YS0+ZmlsdGVyX2RhdGEgPSAicngiOwogCQllbHNlCi0JCQlkbWFfZGF0YS0+ZmlsdGVyX2RhdGEgPSAmZG1hX3BhcmFtcy0+Y2hhbm5lbDsKKwkJCWRtYV9kYXRhLT5maWx0ZXJfZGF0YSA9IGRtYTsKIAl9CiAKIAlpZiAobWNhc3AtPnZlcnNpb24gPCBNQ0FTUF9WRVJTSU9OXzMpIHsKQEAgLTE1ODQsMTcgKzE3NTEsMTEgQEAKIAkJZ290byBlcnI7CiAKIAlzd2l0Y2ggKG1jYXNwLT52ZXJzaW9uKSB7Ci0jaWYgSVNfQlVJTFRJTihDT05GSUdfU05EX0RBVklOQ0lfU09DKSB8fCBcCi0JKElTX01PRFVMRShDT05GSUdfU05EX0RBVklOQ0lfU09DX01DQVNQKSAmJiBcCi0JIElTX01PRFVMRShDT05GSUdfU05EX0RBVklOQ0lfU09DKSkKLQljYXNlIE1DQVNQX1ZFUlNJT05fMToKLQljYXNlIE1DQVNQX1ZFUlNJT05fMjoKLQkJcmV0ID0gZGF2aW5jaV9zb2NfcGxhdGZvcm1fcmVnaXN0ZXIoJnBkZXYtPmRldik7Ci0JCWJyZWFrOwotI2VuZGlmCiAjaWYgSVNfQlVJTFRJTihDT05GSUdfU05EX0VETUFfU09DKSB8fCBcCiAJKElTX01PRFVMRShDT05GSUdfU05EX0RBVklOQ0lfU09DX01DQVNQKSAmJiBcCiAJIElTX01PRFVMRShDT05GSUdfU05EX0VETUFfU09DKSkKKwljYXNlIE1DQVNQX1ZFUlNJT05fMToKKwljYXNlIE1DQVNQX1ZFUlNJT05fMjoKIAljYXNlIE1DQVNQX1ZFUlNJT05fMzoKIAkJcmV0ID0gZWRtYV9wY21fcGxhdGZvcm1fcmVnaXN0ZXIoJnBkZXYtPmRldik7CiAJCWJyZWFrOwpAQCAtMTYyMSwxNCArMTc4MiwxMiBAQAogCXJldHVybiAwOwogCiBlcnI6Ci0JcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIAlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkYXZpbmNpX21jYXNwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5jIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgwOWU5ZC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXBjbS5jCisrKyAvZGV2L251bGwKQEAgLTEsODYxICswLDAgQEAKLS8qCi0gKiBBTFNBIFBDTSBpbnRlcmZhY2UgZm9yIHRoZSBUSSBEQVZJTkNJIHByb2Nlc3NvcgotICoKLSAqIEF1dGhvcjogICAgICBWbGFkaW1pciBCYXJpbm92LCA8dmJhcmlub3ZAZW1iZWRkZWRhbGxleS5jb20+Ci0gKiBDb3B5cmlnaHQ6ICAgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiwgPHNvdXJjZUBtdmlzdGEuY29tPgotICogYWRkZWQgU1JBTSBwaW5nL3BvbmcgKEMpIDIwMDggVHJveSBLaXNreSA8dHJveS5raXNreUBib3VuZGFyeWRldmljZXMuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9nZW5hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZWRtYS5oPgotCi0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLQotI2luY2x1ZGUgPGFzbS9kbWEuaD4KLQotI2luY2x1ZGUgImRhdmluY2ktcGNtLmgiCi0KLSNpZmRlZiBERUJVRwotc3RhdGljIHZvaWQgcHJpbnRfYnVmX2luZm8oaW50IHNsb3QsIGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGVkbWFjY19wYXJhbSBwOwotCWlmIChzbG90IDwgMCkKLQkJcmV0dXJuOwotCWVkbWFfcmVhZF9zbG90KHNsb3QsICZwKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IDB4JXgsIG9wdD0leCwgc3JjPSV4LCBhX2JfY250PSV4IGRzdD0leFxuIiwKLQkJCW5hbWUsIHNsb3QsIHAub3B0LCBwLnNyYywgcC5hX2JfY250LCBwLmRzdCk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiAgICBzcmNfZHN0X2JpZHg9JXggbGlua19iY250cmxkPSV4IHNyY19kc3RfY2lkeD0leCBjY250PSV4XG4iLAotCQkJcC5zcmNfZHN0X2JpZHgsIHAubGlua19iY250cmxkLCBwLnNyY19kc3RfY2lkeCwgcC5jY250KTsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCBwcmludF9idWZfaW5mbyhpbnQgc2xvdCwgY2hhciAqbmFtZSkKLXsKLX0KLSNlbmRpZgotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgcGNtX2hhcmR3YXJlX3BsYXliYWNrID0gewotCS5pbmZvID0gKFNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIgfAotCQkgU05EUlZfUENNX0lORk9fTU1BUCB8IFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAotCQkgU05EUlZfUENNX0lORk9fUEFVU0UgfCBTTkRSVl9QQ01fSU5GT19SRVNVTUV8Ci0JCSBTTkRSVl9QQ01fSU5GT19CQVRDSCksCi0JLmJ1ZmZlcl9ieXRlc19tYXggPSAxMjggKiAxMDI0LAotCS5wZXJpb2RfYnl0ZXNfbWluID0gMzIsCi0JLnBlcmlvZF9ieXRlc19tYXggPSA4ICogMTAyNCwKLQkucGVyaW9kc19taW4gPSAxNiwKLQkucGVyaW9kc19tYXggPSAyNTUsCi0JLmZpZm9fc2l6ZSA9IDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgcGNtX2hhcmR3YXJlX2NhcHR1cmUgPSB7Ci0JLmluZm8gPSAoU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfCBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8Ci0JCSBTTkRSVl9QQ01fSU5GT19NTUFQIHwgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCSBTTkRSVl9QQ01fSU5GT19QQVVTRSB8Ci0JCSBTTkRSVl9QQ01fSU5GT19CQVRDSCksCi0JLmJ1ZmZlcl9ieXRlc19tYXggPSAxMjggKiAxMDI0LAotCS5wZXJpb2RfYnl0ZXNfbWluID0gMzIsCi0JLnBlcmlvZF9ieXRlc19tYXggPSA4ICogMTAyNCwKLQkucGVyaW9kc19taW4gPSAxNiwKLQkucGVyaW9kc19tYXggPSAyNTUsCi0JLmZpZm9fc2l6ZSA9IDAsCi19OwotCi0vKgotICogSG93IHBpbmcvcG9uZyB3b3Jrcy4uLi4KLSAqCi0gKiBQbGF5YmFjazoKLSAqIHJhbV9wYXJhbXMgLSBjb3B5cyAyKnBpbmdfc2l6ZSBmcm9tIHN0YXJ0IG9mIFNEUkFNIHRvIGlyYW0sCi0gKiAJbGlua3MgdG8gcmFtX2xpbmsyCi0gKiByYW1fbGluazIgLSBjb3B5cyByZXN0IG9mIFNEUkFNIHRvIGlyYW0gaW4gcGluZ19zaXplIHVuaXRzLAotICogCWxpbmtzIHRvIHJhbV9saW5rCi0gKiByYW1fbGluayAtIGNvcHlzIGVudGlyZSBTRFJBTSB0byBpcmFtIGluIHBpbmdfc2l6ZSB1aW50cywKLSAqIAlsaW5rcyB0byBzZWxmCi0gKgotICogYXNwX3BhcmFtcyAtIHNhbWUgYXMgYXNwX2xpbmtbMF0KLSAqIGFzcF9saW5rWzBdIC0gY29weXMgZnJvbSBsb3dlciBoYWxmIG9mIGlyYW0gdG8gYXNwIHBvcnQKLSAqIAlsaW5rcyB0byBhc3BfbGlua1sxXSwgdHJpZ2dlcnMgaXJhbSBjb3B5IGV2ZW50IG9uIGNvbXBsZXRpb24KLSAqIGFzcF9saW5rWzFdIC0gY29weXMgZnJvbSB1cHBlciBoYWxmIG9mIGlyYW0gdG8gYXNwIHBvcnQKLSAqIAlsaW5rcyB0byBhc3BfbGlua1swXSwgdHJpZ2dlcnMgaXJhbSBjb3B5IGV2ZW50IG9uIGNvbXBsZXRpb24KLSAqIAl0cmlnZ2VycyBpbnRlcnJ1cHQgb25seSBuZWVkZWQgdG8gbGV0IHVwcGVyIFNPQyBsZXZlbHMgdXBkYXRlIHBvc2l0aW9uCi0gKiAJaW4gc3RyZWFtIG9uIGNvbXBsZXRpb24KLSAqCi0gKiBXaGVuIHBsYXliYWNrIGlzIHN0YXJ0ZWQ6Ci0gKiAJcmFtX3BhcmFtcyBzdGFydGVkCi0gKiAJYXNwX3BhcmFtcyBzdGFydGVkCi0gKgotICogQ2FwdHVyZToKLSAqIHJhbV9wYXJhbXMgLSBzYW1lIGFzIHJhbV9saW5rLAotICogCWxpbmtzIHRvIHJhbV9saW5rCi0gKiByYW1fbGluayAtIHNhbWUgYXMgcGxheWJhY2sKLSAqIAlsaW5rcyB0byBzZWxmCi0gKgotICogYXNwX3BhcmFtcyAtIHNhbWUgYXMgcGxheWJhY2sKLSAqIGFzcF9saW5rWzBdIC0gc2FtZSBhcyBwbGF5YmFjawotICogYXNwX2xpbmtbMV0gLSBzYW1lIGFzIHBsYXliYWNrCi0gKgotICogV2hlbiBjYXB0dXJlIGlzIHN0YXJ0ZWQ6Ci0gKiAJYXNwX3BhcmFtcyBzdGFydGVkCi0gKi8KLXN0cnVjdCBkYXZpbmNpX3J1bnRpbWVfZGF0YSB7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCWludCBwZXJpb2Q7CQkvKiBjdXJyZW50IERNQSBwZXJpb2QgKi8KLQlpbnQgYXNwX2NoYW5uZWw7CS8qIE1hc3RlciBETUEgY2hhbm5lbCAqLwotCWludCBhc3BfbGlua1syXTsJLyogYXNwIHBhcmFtZXRlciBsaW5rIGNoYW5uZWwsIHBpbmcvcG9uZyAqLwotCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zICpwYXJhbXM7CS8qIERNQSBwYXJhbXMgKi8KLQlpbnQgcmFtX2NoYW5uZWw7Ci0JaW50IHJhbV9saW5rOwotCWludCByYW1fbGluazI7Ci0Jc3RydWN0IGVkbWFjY19wYXJhbSBhc3BfcGFyYW1zOwotCXN0cnVjdCBlZG1hY2NfcGFyYW0gcmFtX3BhcmFtczsKLX07Ci0KLXN0YXRpYyB2b2lkIGRhdmluY2lfcGNtX3BlcmlvZF9lbGFwc2VkKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBkYXZpbmNpX3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0KLQlwcnRkLT5wZXJpb2QrKzsKLQlpZiAodW5saWtlbHkocHJ0ZC0+cGVyaW9kID49IHJ1bnRpbWUtPnBlcmlvZHMpKQotCQlwcnRkLT5wZXJpb2QgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBkYXZpbmNpX3BjbV9wZXJpb2RfcmVzZXQoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IGRhdmluY2lfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlwcnRkLT5wZXJpb2QgPSAwOwotfQotLyoKLSAqIE5vdCB1c2VkIHdpdGggcGluZy9wb25nCi0gKi8KLXN0YXRpYyB2b2lkIGRhdmluY2lfcGNtX2VucXVldWVfZG1hKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBkYXZpbmNpX3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0JdW5zaWduZWQgaW50IHBlcmlvZF9zaXplOwotCXVuc2lnbmVkIGludCBkbWFfb2Zmc2V0OwotCWRtYV9hZGRyX3QgZG1hX3BvczsKLQlkbWFfYWRkcl90IHNyYywgZHN0OwotCXVuc2lnbmVkIHNob3J0IHNyY19iaWR4LCBkc3RfYmlkeDsKLQl1bnNpZ25lZCBzaG9ydCBzcmNfY2lkeCwgZHN0X2NpZHg7Ci0JdW5zaWduZWQgaW50IGRhdGFfdHlwZTsKLQl1bnNpZ25lZCBzaG9ydCBhY250OwotCXVuc2lnbmVkIGludCBjb3VudDsKLQl1bnNpZ25lZCBpbnQgZmlmb19sZXZlbDsKLQotCXBlcmlvZF9zaXplID0gc25kX3BjbV9saWJfcGVyaW9kX2J5dGVzKHN1YnN0cmVhbSk7Ci0JZG1hX29mZnNldCA9IHBydGQtPnBlcmlvZCAqIHBlcmlvZF9zaXplOwotCWRtYV9wb3MgPSBydW50aW1lLT5kbWFfYWRkciArIGRtYV9vZmZzZXQ7Ci0JZmlmb19sZXZlbCA9IHBydGQtPnBhcmFtcy0+Zmlmb19sZXZlbDsKLQotCXByX2RlYnVnKCJkYXZpbmNpX3BjbTogYXVkaW9fc2V0X2RtYV9wYXJhbXNfcGxheSBjaGFubmVsID0gJWQgIgotCQkiZG1hX3B0ciA9ICV4IHBlcmlvZF9zaXplPSV4XG4iLCBwcnRkLT5hc3BfbGlua1swXSwgZG1hX3BvcywKLQkJcGVyaW9kX3NpemUpOwotCi0JZGF0YV90eXBlID0gcHJ0ZC0+cGFyYW1zLT5kYXRhX3R5cGU7Ci0JY291bnQgPSBwZXJpb2Rfc2l6ZSAvIGRhdGFfdHlwZTsKLQlpZiAoZmlmb19sZXZlbCkKLQkJY291bnQgLz0gZmlmb19sZXZlbDsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCXNyYyA9IGRtYV9wb3M7Ci0JCWRzdCA9IHBydGQtPnBhcmFtcy0+ZG1hX2FkZHI7Ci0JCXNyY19iaWR4ID0gZGF0YV90eXBlOwotCQlkc3RfYmlkeCA9IDQ7Ci0JCXNyY19jaWR4ID0gZGF0YV90eXBlICogZmlmb19sZXZlbDsKLQkJZHN0X2NpZHggPSAwOwotCX0gZWxzZSB7Ci0JCXNyYyA9IHBydGQtPnBhcmFtcy0+ZG1hX2FkZHI7Ci0JCWRzdCA9IGRtYV9wb3M7Ci0JCXNyY19iaWR4ID0gMDsKLQkJZHN0X2JpZHggPSBkYXRhX3R5cGU7Ci0JCXNyY19jaWR4ID0gMDsKLQkJZHN0X2NpZHggPSBkYXRhX3R5cGUgKiBmaWZvX2xldmVsOwotCX0KLQotCWFjbnQgPSBwcnRkLT5wYXJhbXMtPmFjbnQ7Ci0JZWRtYV9zZXRfc3JjKHBydGQtPmFzcF9saW5rWzBdLCBzcmMsIElOQ1IsIFc4QklUKTsKLQllZG1hX3NldF9kZXN0KHBydGQtPmFzcF9saW5rWzBdLCBkc3QsIElOQ1IsIFc4QklUKTsKLQotCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5hc3BfbGlua1swXSwgc3JjX2JpZHgsIHNyY19jaWR4KTsKLQllZG1hX3NldF9kZXN0X2luZGV4KHBydGQtPmFzcF9saW5rWzBdLCBkc3RfYmlkeCwgZHN0X2NpZHgpOwotCi0JaWYgKCFmaWZvX2xldmVsKQotCQllZG1hX3NldF90cmFuc2Zlcl9wYXJhbXMocHJ0ZC0+YXNwX2xpbmtbMF0sIGFjbnQsIGNvdW50LCAxLCAwLAotCQkJCQkJCUFTWU5DKTsKLQllbHNlCi0JCWVkbWFfc2V0X3RyYW5zZmVyX3BhcmFtcyhwcnRkLT5hc3BfbGlua1swXSwgYWNudCwKLQkJCQkJCWZpZm9fbGV2ZWwsCi0JCQkJCQljb3VudCwgZmlmb19sZXZlbCwKLQkJCQkJCUFCU1lOQyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRhdmluY2lfcGNtX2RtYV9pcnEodW5zaWduZWQgbGluaywgdTE2IGNoX3N0YXR1cywgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGRhdGE7Ci0Jc3RydWN0IGRhdmluY2lfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlwcmludF9idWZfaW5mbyhwcnRkLT5yYW1fY2hhbm5lbCwgImkgcmFtX2NoYW5uZWwiKTsKLQlwcl9kZWJ1ZygiZGF2aW5jaV9wY206IGxpbms9JWQsIHN0YXR1cz0weCV4XG4iLCBsaW5rLCBjaF9zdGF0dXMpOwotCi0JaWYgKHVubGlrZWx5KGNoX3N0YXR1cyAhPSBFRE1BX0RNQV9DT01QTEVURSkpCi0JCXJldHVybjsKLQotCWlmIChzbmRfcGNtX3J1bm5pbmcoc3Vic3RyZWFtKSkgewotCQlzcGluX2xvY2soJnBydGQtPmxvY2spOwotCQlpZiAocHJ0ZC0+cmFtX2NoYW5uZWwgPCAwKSB7Ci0JCQkvKiBObyBwaW5nL3BvbmcgbXVzdCBmaXggdXAgbGluayBkbWEgZGF0YSovCi0JCQlkYXZpbmNpX3BjbV9lbnF1ZXVlX2RtYShzdWJzdHJlYW0pOwotCQl9Ci0JCWRhdmluY2lfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci0JCXNwaW5fdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQkJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwotCX0KLX0KLQotI2lmZGVmIENPTkZJR19HRU5FUklDX0FMTE9DQVRPUgotc3RhdGljIGludCBhbGxvY2F0ZV9zcmFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3QgZ2VuX3Bvb2wgKnNyYW1fcG9vbCwgdW5zaWduZWQgc2l6ZSwKLQkJc3RydWN0IHNuZF9wY21faGFyZHdhcmUgKnBwY20pCi17Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOwotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqaXJhbV9kbWEgPSBOVUxMOwotCWRtYV9hZGRyX3QgaXJhbV9waHlzID0gMDsKLQl2b2lkICppcmFtX3ZpcnQgPSBOVUxMOwotCi0JaWYgKGJ1Zi0+cHJpdmF0ZV9kYXRhIHx8ICFzaXplKQotCQlyZXR1cm4gMDsKLQotCXBwY20tPnBlcmlvZF9ieXRlc19tYXggPSBzaXplOwotCWlyYW1fdmlydCA9IGdlbl9wb29sX2RtYV9hbGxvYyhzcmFtX3Bvb2wsIHNpemUsICZpcmFtX3BoeXMpOwotCWlmICghaXJhbV92aXJ0KQotCQlnb3RvIGV4aXQxOwotCWlyYW1fZG1hID0ga3phbGxvYyhzaXplb2YoKmlyYW1fZG1hKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFpcmFtX2RtYSkKLQkJZ290byBleGl0MjsKLQlpcmFtX2RtYS0+YXJlYSA9IGlyYW1fdmlydDsKLQlpcmFtX2RtYS0+YWRkciA9IGlyYW1fcGh5czsKLQltZW1zZXQoaXJhbV9kbWEtPmFyZWEsIDAsIHNpemUpOwotCWlyYW1fZG1hLT5ieXRlcyA9IHNpemU7Ci0JYnVmLT5wcml2YXRlX2RhdGEgPSBpcmFtX2RtYTsKLQlyZXR1cm4gMDsKLWV4aXQyOgotCWlmIChpcmFtX3ZpcnQpCi0JCWdlbl9wb29sX2ZyZWUoc3JhbV9wb29sLCAodW5zaWduZWQpaXJhbV92aXJ0LCBzaXplKTsKLWV4aXQxOgotCXJldHVybiAtRU5PTUVNOwotfQotCi1zdGF0aWMgdm9pZCBkYXZpbmNpX2ZyZWVfc3JhbShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICAgIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqaXJhbV9kbWEpCi17Ci0Jc3RydWN0IGRhdmluY2lfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGdlbl9wb29sICpzcmFtX3Bvb2wgPSBwcnRkLT5wYXJhbXMtPnNyYW1fcG9vbDsKLQotCWdlbl9wb29sX2ZyZWUoc3JhbV9wb29sLCAodW5zaWduZWQpIGlyYW1fZG1hLT5hcmVhLCBpcmFtX2RtYS0+Ynl0ZXMpOwotfQotI2Vsc2UKLXN0YXRpYyBpbnQgYWxsb2NhdGVfc3JhbShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJc3RydWN0IGdlbl9wb29sICpzcmFtX3Bvb2wsIHVuc2lnbmVkIHNpemUsCi0JCXN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlICpwcGNtKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkYXZpbmNpX2ZyZWVfc3JhbShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICAgIHN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqaXJhbV9kbWEpCi17Ci19Ci0jZW5kaWYKLQotLyoKLSAqIE9ubHkgdXNlZCB3aXRoIHBpbmcvcG9uZy4KLSAqIFRoaXMgaXMgY2FsbGVkIGFmdGVyIHJ1bnRpbWUtPmRtYV9hZGRyLCBwZXJpb2RfYnl0ZXMgYW5kIGRhdGFfdHlwZSBhcmUgdmFsaWQKLSAqLwotc3RhdGljIGludCBwaW5nX3BvbmdfZG1hX3NldHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXVuc2lnbmVkIHNob3J0IHJhbV9zcmNfY2lkeCwgcmFtX2RzdF9jaWR4OwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGRhdmluY2lfcnVudGltZV9kYXRhICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqaXJhbV9kbWEgPQotCQkoc3RydWN0IHNuZF9kbWFfYnVmZmVyICopc3Vic3RyZWFtLT5kbWFfYnVmZmVyLnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyAqcGFyYW1zID0gcHJ0ZC0+cGFyYW1zOwotCXVuc2lnbmVkIGludCBkYXRhX3R5cGUgPSBwYXJhbXMtPmRhdGFfdHlwZTsKLQl1bnNpZ25lZCBpbnQgYWNudCA9IHBhcmFtcy0+YWNudDsKLQkvKiBkaXZpZGUgYnkgMiBmb3IgcGluZy9wb25nICovCi0JdW5zaWduZWQgaW50IHBpbmdfc2l6ZSA9IHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pID4+IDE7Ci0JdW5zaWduZWQgaW50IGZpZm9fbGV2ZWwgPSBwcnRkLT5wYXJhbXMtPmZpZm9fbGV2ZWw7Ci0JdW5zaWduZWQgaW50IGNvdW50OwotCWlmICgoZGF0YV90eXBlID09IDApIHx8IChkYXRhX3R5cGUgPiA0KSkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBkYXRhX3R5cGU9JWlcbiIsIF9fZnVuY19fLCBkYXRhX3R5cGUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spIHsKLQkJZG1hX2FkZHJfdCBhc3Bfc3JjX3BvbmcgPSBpcmFtX2RtYS0+YWRkciArIHBpbmdfc2l6ZTsKLQkJcmFtX3NyY19jaWR4ID0gcGluZ19zaXplOwotCQlyYW1fZHN0X2NpZHggPSAtcGluZ19zaXplOwotCQllZG1hX3NldF9zcmMocHJ0ZC0+YXNwX2xpbmtbMV0sIGFzcF9zcmNfcG9uZywgSU5DUiwgVzhCSVQpOwotCi0JCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5hc3BfbGlua1swXSwgZGF0YV90eXBlLAotCQkJCWRhdGFfdHlwZSAqIGZpZm9fbGV2ZWwpOwotCQllZG1hX3NldF9zcmNfaW5kZXgocHJ0ZC0+YXNwX2xpbmtbMV0sIGRhdGFfdHlwZSwKLQkJCQlkYXRhX3R5cGUgKiBmaWZvX2xldmVsKTsKLQotCQllZG1hX3NldF9zcmMocHJ0ZC0+cmFtX2xpbmssIHJ1bnRpbWUtPmRtYV9hZGRyLCBJTkNSLCBXMzJCSVQpOwotCX0gZWxzZSB7Ci0JCWRtYV9hZGRyX3QgYXNwX2RzdF9wb25nID0gaXJhbV9kbWEtPmFkZHIgKyBwaW5nX3NpemU7Ci0JCXJhbV9zcmNfY2lkeCA9IC1waW5nX3NpemU7Ci0JCXJhbV9kc3RfY2lkeCA9IHBpbmdfc2l6ZTsKLQkJZWRtYV9zZXRfZGVzdChwcnRkLT5hc3BfbGlua1sxXSwgYXNwX2RzdF9wb25nLCBJTkNSLCBXOEJJVCk7Ci0KLQkJZWRtYV9zZXRfZGVzdF9pbmRleChwcnRkLT5hc3BfbGlua1swXSwgZGF0YV90eXBlLAotCQkJCWRhdGFfdHlwZSAqIGZpZm9fbGV2ZWwpOwotCQllZG1hX3NldF9kZXN0X2luZGV4KHBydGQtPmFzcF9saW5rWzFdLCBkYXRhX3R5cGUsCi0JCQkJZGF0YV90eXBlICogZmlmb19sZXZlbCk7Ci0KLQkJZWRtYV9zZXRfZGVzdChwcnRkLT5yYW1fbGluaywgcnVudGltZS0+ZG1hX2FkZHIsIElOQ1IsIFczMkJJVCk7Ci0JfQotCi0JaWYgKCFmaWZvX2xldmVsKSB7Ci0JCWNvdW50ID0gcGluZ19zaXplIC8gZGF0YV90eXBlOwotCQllZG1hX3NldF90cmFuc2Zlcl9wYXJhbXMocHJ0ZC0+YXNwX2xpbmtbMF0sIGFjbnQsIGNvdW50LAotCQkJCTEsIDAsIEFTWU5DKTsKLQkJZWRtYV9zZXRfdHJhbnNmZXJfcGFyYW1zKHBydGQtPmFzcF9saW5rWzFdLCBhY250LCBjb3VudCwKLQkJCQkxLCAwLCBBU1lOQyk7Ci0JfSBlbHNlIHsKLQkJY291bnQgPSBwaW5nX3NpemUgLyAoZGF0YV90eXBlICogZmlmb19sZXZlbCk7Ci0JCWVkbWFfc2V0X3RyYW5zZmVyX3BhcmFtcyhwcnRkLT5hc3BfbGlua1swXSwgYWNudCwgZmlmb19sZXZlbCwKLQkJCQljb3VudCwgZmlmb19sZXZlbCwgQUJTWU5DKTsKLQkJZWRtYV9zZXRfdHJhbnNmZXJfcGFyYW1zKHBydGQtPmFzcF9saW5rWzFdLCBhY250LCBmaWZvX2xldmVsLAotCQkJCWNvdW50LCBmaWZvX2xldmVsLCBBQlNZTkMpOwotCX0KLQotCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5yYW1fbGluaywgcGluZ19zaXplLCByYW1fc3JjX2NpZHgpOwotCWVkbWFfc2V0X2Rlc3RfaW5kZXgocHJ0ZC0+cmFtX2xpbmssIHBpbmdfc2l6ZSwgcmFtX2RzdF9jaWR4KTsKLQllZG1hX3NldF90cmFuc2Zlcl9wYXJhbXMocHJ0ZC0+cmFtX2xpbmssIHBpbmdfc2l6ZSwgMiwKLQkJCXJ1bnRpbWUtPnBlcmlvZHMsIDIsIEFTWU5DKTsKLQotCS8qIGluaXQgbWFzdGVyIHBhcmFtcyAqLwotCWVkbWFfcmVhZF9zbG90KHBydGQtPmFzcF9saW5rWzBdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7Ci0JZWRtYV9yZWFkX3Nsb3QocHJ0ZC0+cmFtX2xpbmssICZwcnRkLT5yYW1fcGFyYW1zKTsKLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlzdHJ1Y3QgZWRtYWNjX3BhcmFtIHBfcmFtOwotCQkvKiBDb3B5IGVudGlyZSBpcmFtIGJ1ZmZlciBiZWZvcmUgcGxheWJhY2sgc3RhcnRlZCAqLwotCQlwcnRkLT5yYW1fcGFyYW1zLmFfYl9jbnQgPSAoMSA8PCAxNikgfCAocGluZ19zaXplIDw8IDEpOwotCQkvKiAwIGRzdF9iaWR4ICovCi0JCXBydGQtPnJhbV9wYXJhbXMuc3JjX2RzdF9iaWR4ID0gKHBpbmdfc2l6ZSA8PCAxKTsKLQkJLyogMCBkc3RfY2lkeCAqLwotCQlwcnRkLT5yYW1fcGFyYW1zLnNyY19kc3RfY2lkeCA9IChwaW5nX3NpemUgPDwgMSk7Ci0JCXBydGQtPnJhbV9wYXJhbXMuY2NudCA9IDE7Ci0KLQkJLyogU2tpcCAxc3QgcGVyaW9kICovCi0JCWVkbWFfcmVhZF9zbG90KHBydGQtPnJhbV9saW5rLCAmcF9yYW0pOwotCQlwX3JhbS5zcmMgKz0gKHBpbmdfc2l6ZSA8PCAxKTsKLQkJcF9yYW0uY2NudCAtPSAxOwotCQllZG1hX3dyaXRlX3Nsb3QocHJ0ZC0+cmFtX2xpbmsyLCAmcF9yYW0pOwotCQkvKgotCQkgKiBXaGVuIDFzdCBzdGFydGVkLCByYW0gLT4gaXJhbSBkbWEgY2hhbm5lbCB3aWxsIGZpbGwgdGhlCi0JCSAqIGVudGlyZSBpcmFtLiAgVGhlbiwgd2hlbmV2ZXIgYSBwaW5nL3BvbmcgYXNwIGJ1ZmZlciBmaW5pc2hlcywKLQkJICogMS8yIGlyYW0gd2lsbCBiZSBmaWxsZWQuCi0JCSAqLwotCQlwcnRkLT5yYW1fcGFyYW1zLmxpbmtfYmNudHJsZCA9Ci0JCQlFRE1BX0NIQU5fU0xPVChwcnRkLT5yYW1fbGluazIpIDw8IDU7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKiAxIGFzcCB0eCBvciByeCBjaGFubmVsIHVzaW5nIDIgcGFyYW1ldGVyIGNoYW5uZWxzCi0gKiAxIHJhbSB0by9mcm9tIGlyYW0gY2hhbm5lbCB1c2luZyAxIHBhcmFtZXRlciBjaGFubmVsCi0gKgotICogUGxheWJhY2sKLSAqIHJhbSBjb3B5IGNoYW5uZWwga2lja3Mgb2ZmIGZpcnN0LAotICogMXN0IHJhbSBjb3B5IG9mIGVudGlyZSBpcmFtIGJ1ZmZlciBjb21wbGV0aW9uIGtpY2tzIG9mZiBhc3AgY2hhbm5lbAotICogYXNwIHRjYyBhbHdheXMga2lja3Mgb2ZmIHJhbSBjb3B5IG9mIDEvMiBpcmFtIGJ1ZmZlcgotICoKLSAqIFJlY29yZAotICogYXNwIGNoYW5uZWwgc3RhcnRzLCB0Y2Mga2lja3Mgb2ZmIHJhbSBjb3B5Ci0gKi8KLXN0YXRpYyBpbnQgcmVxdWVzdF9waW5nX3Bvbmcoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBkYXZpbmNpX3J1bnRpbWVfZGF0YSAqcHJ0ZCwKLQkJc3RydWN0IHNuZF9kbWFfYnVmZmVyICppcmFtX2RtYSkKLXsKLQlkbWFfYWRkcl90IGFzcF9zcmNfcGluZzsKLQlkbWFfYWRkcl90IGFzcF9kc3RfcGluZzsKLQlpbnQgcmV0OwotCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zICpwYXJhbXMgPSBwcnRkLT5wYXJhbXM7Ci0KLQkvKiBSZXF1ZXN0IHJhbSBtYXN0ZXIgY2hhbm5lbCAqLwotCXJldCA9IHBydGQtPnJhbV9jaGFubmVsID0gZWRtYV9hbGxvY19jaGFubmVsKEVETUFfQ0hBTk5FTF9BTlksCi0JCQkJICBkYXZpbmNpX3BjbV9kbWFfaXJxLCBzdWJzdHJlYW0sCi0JCQkJICBwcnRkLT5wYXJhbXMtPnJhbV9jaGFuX3EpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGV4aXQxOwotCi0JLyogUmVxdWVzdCByYW0gbGluayBjaGFubmVsICovCi0JcmV0ID0gcHJ0ZC0+cmFtX2xpbmsgPSBlZG1hX2FsbG9jX3Nsb3QoCi0JCQlFRE1BX0NUTFIocHJ0ZC0+cmFtX2NoYW5uZWwpLCBFRE1BX1NMT1RfQU5ZKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBleGl0MjsKLQotCXJldCA9IHBydGQtPmFzcF9saW5rWzFdID0gZWRtYV9hbGxvY19zbG90KAotCQkJRURNQV9DVExSKHBydGQtPmFzcF9jaGFubmVsKSwgRURNQV9TTE9UX0FOWSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXhpdDM7Ci0KLQlwcnRkLT5yYW1fbGluazIgPSAtMTsKLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQlyZXQgPSBwcnRkLT5yYW1fbGluazIgPSBlZG1hX2FsbG9jX3Nsb3QoCi0JCQlFRE1BX0NUTFIocHJ0ZC0+cmFtX2NoYW5uZWwpLCBFRE1BX1NMT1RfQU5ZKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIGV4aXQ0OwotCX0KLQkvKiBjaXJjbGUgcGluZy1wb25nIGJ1ZmZlcnMgKi8KLQllZG1hX2xpbmsocHJ0ZC0+YXNwX2xpbmtbMF0sIHBydGQtPmFzcF9saW5rWzFdKTsKLQllZG1hX2xpbmsocHJ0ZC0+YXNwX2xpbmtbMV0sIHBydGQtPmFzcF9saW5rWzBdKTsKLQkvKiBjaXJjbGUgcmFtIGJ1ZmZlcnMgKi8KLQllZG1hX2xpbmsocHJ0ZC0+cmFtX2xpbmssIHBydGQtPnJhbV9saW5rKTsKLQotCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSB7Ci0JCWFzcF9zcmNfcGluZyA9IGlyYW1fZG1hLT5hZGRyOwotCQlhc3BfZHN0X3BpbmcgPSBwYXJhbXMtPmRtYV9hZGRyOwkvKiBmaWZvICovCi0JfSBlbHNlIHsKLQkJYXNwX3NyY19waW5nID0gcGFyYW1zLT5kbWFfYWRkcjsJLyogZmlmbyAqLwotCQlhc3BfZHN0X3BpbmcgPSBpcmFtX2RtYS0+YWRkcjsKLQl9Ci0JLyogcGluZyAqLwotCWVkbWFfc2V0X3NyYyhwcnRkLT5hc3BfbGlua1swXSwgYXNwX3NyY19waW5nLCBJTkNSLCBXMTZCSVQpOwotCWVkbWFfc2V0X2Rlc3QocHJ0ZC0+YXNwX2xpbmtbMF0sIGFzcF9kc3RfcGluZywgSU5DUiwgVzE2QklUKTsKLQllZG1hX3NldF9zcmNfaW5kZXgocHJ0ZC0+YXNwX2xpbmtbMF0sIDAsIDApOwotCWVkbWFfc2V0X2Rlc3RfaW5kZXgocHJ0ZC0+YXNwX2xpbmtbMF0sIDAsIDApOwotCi0JZWRtYV9yZWFkX3Nsb3QocHJ0ZC0+YXNwX2xpbmtbMF0sICZwcnRkLT5hc3BfcGFyYW1zKTsKLQlwcnRkLT5hc3BfcGFyYW1zLm9wdCAmPSB+KFRDQ01PREUgfCBFRE1BX1RDQygweDNmKSB8IFRDSU5URU4pOwotCXBydGQtPmFzcF9wYXJhbXMub3B0IHw9IFRDQ0hFTiB8Ci0JCUVETUFfVENDKHBydGQtPnJhbV9jaGFubmVsICYgMHgzZik7Ci0JZWRtYV93cml0ZV9zbG90KHBydGQtPmFzcF9saW5rWzBdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7Ci0KLQkvKiBwb25nICovCi0JZWRtYV9zZXRfc3JjKHBydGQtPmFzcF9saW5rWzFdLCBhc3Bfc3JjX3BpbmcsIElOQ1IsIFcxNkJJVCk7Ci0JZWRtYV9zZXRfZGVzdChwcnRkLT5hc3BfbGlua1sxXSwgYXNwX2RzdF9waW5nLCBJTkNSLCBXMTZCSVQpOwotCWVkbWFfc2V0X3NyY19pbmRleChwcnRkLT5hc3BfbGlua1sxXSwgMCwgMCk7Ci0JZWRtYV9zZXRfZGVzdF9pbmRleChwcnRkLT5hc3BfbGlua1sxXSwgMCwgMCk7Ci0KLQllZG1hX3JlYWRfc2xvdChwcnRkLT5hc3BfbGlua1sxXSwgJnBydGQtPmFzcF9wYXJhbXMpOwotCXBydGQtPmFzcF9wYXJhbXMub3B0ICY9IH4oVENDTU9ERSB8IEVETUFfVENDKDB4M2YpKTsKLQkvKiBpbnRlcnJ1cHQgYWZ0ZXIgZXZlcnkgcG9uZyBjb21wbGV0aW9uICovCi0JcHJ0ZC0+YXNwX3BhcmFtcy5vcHQgfD0gVENJTlRFTiB8IFRDQ0hFTiB8Ci0JCUVETUFfVENDKHBydGQtPnJhbV9jaGFubmVsICYgMHgzZik7Ci0JZWRtYV93cml0ZV9zbG90KHBydGQtPmFzcF9saW5rWzFdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7Ci0KLQkvKiByYW0gKi8KLQllZG1hX3NldF9zcmMocHJ0ZC0+cmFtX2xpbmssIGlyYW1fZG1hLT5hZGRyLCBJTkNSLCBXMzJCSVQpOwotCWVkbWFfc2V0X2Rlc3QocHJ0ZC0+cmFtX2xpbmssIGlyYW1fZG1hLT5hZGRyLCBJTkNSLCBXMzJCSVQpOwotCXByX2RlYnVnKCIlczogYXVkaW8gZG1hIGNoYW5uZWxzL3Nsb3RzIGluIHVzZSBmb3IgcmFtOiV1ICV1ICV1LCIKLQkJImZvciBhc3A6JXUgJXUgJXVcbiIsIF9fZnVuY19fLAotCQlwcnRkLT5yYW1fY2hhbm5lbCwgcHJ0ZC0+cmFtX2xpbmssIHBydGQtPnJhbV9saW5rMiwKLQkJcHJ0ZC0+YXNwX2NoYW5uZWwsIHBydGQtPmFzcF9saW5rWzBdLAotCQlwcnRkLT5hc3BfbGlua1sxXSk7Ci0JcmV0dXJuIDA7Ci1leGl0NDoKLQllZG1hX2ZyZWVfY2hhbm5lbChwcnRkLT5hc3BfbGlua1sxXSk7Ci0JcHJ0ZC0+YXNwX2xpbmtbMV0gPSAtMTsKLWV4aXQzOgotCWVkbWFfZnJlZV9jaGFubmVsKHBydGQtPnJhbV9saW5rKTsKLQlwcnRkLT5yYW1fbGluayA9IC0xOwotZXhpdDI6Ci0JZWRtYV9mcmVlX2NoYW5uZWwocHJ0ZC0+cmFtX2NoYW5uZWwpOwotCXBydGQtPnJhbV9jaGFubmVsID0gLTE7Ci1leGl0MToKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGRhdmluY2lfcGNtX2RtYV9yZXF1ZXN0KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqaXJhbV9kbWE7Ci0Jc3RydWN0IGRhdmluY2lfcnVudGltZV9kYXRhICpwcnRkID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgKnBhcmFtcyA9IHBydGQtPnBhcmFtczsKLQlpbnQgcmV0OwotCi0JaWYgKCFwYXJhbXMpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogUmVxdWVzdCBhc3AgbWFzdGVyIERNQSBjaGFubmVsICovCi0JcmV0ID0gcHJ0ZC0+YXNwX2NoYW5uZWwgPSBlZG1hX2FsbG9jX2NoYW5uZWwocGFyYW1zLT5jaGFubmVsLAotCQkJZGF2aW5jaV9wY21fZG1hX2lycSwgc3Vic3RyZWFtLAotCQkJcHJ0ZC0+cGFyYW1zLT5hc3BfY2hhbl9xKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBleGl0MTsKLQotCS8qIFJlcXVlc3QgYXNwIGxpbmsgY2hhbm5lbHMgKi8KLQlyZXQgPSBwcnRkLT5hc3BfbGlua1swXSA9IGVkbWFfYWxsb2Nfc2xvdCgKLQkJCUVETUFfQ1RMUihwcnRkLT5hc3BfY2hhbm5lbCksIEVETUFfU0xPVF9BTlkpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGV4aXQyOwotCi0JaXJhbV9kbWEgPSAoc3RydWN0IHNuZF9kbWFfYnVmZmVyICopc3Vic3RyZWFtLT5kbWFfYnVmZmVyLnByaXZhdGVfZGF0YTsKLQlpZiAoaXJhbV9kbWEpIHsKLQkJaWYgKHJlcXVlc3RfcGluZ19wb25nKHN1YnN0cmVhbSwgcHJ0ZCwgaXJhbV9kbWEpID09IDApCi0JCQlyZXR1cm4gMDsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRtYSBjaGFubmVsIGFsbG9jYXRpb24gZmFpbGVkLCIKLQkJCQkibm90IHVzaW5nIHNyYW1cbiIsIF9fZnVuY19fKTsKLQl9Ci0KLQkvKiBJc3N1ZSB0cmFuc2ZlciBjb21wbGV0aW9uIElSUSB3aGVuIHRoZSBjaGFubmVsIGNvbXBsZXRlcyBhCi0JICogdHJhbnNmZXIsIHRoZW4gYWx3YXlzIHJlbG9hZCBmcm9tIHRoZSBzYW1lIHNsb3QgKGJ5IGEga2luZAotCSAqIG9mIGxvb3BiYWNrIGxpbmspLiAgVGhlIGNvbXBsZXRpb24gSVJRIGhhbmRsZXIgd2lsbCB1cGRhdGUKLQkgKiB0aGUgcmVsb2FkIHNsb3Qgd2l0aCBhIG5ldyBidWZmZXIuCi0JICoKLQkgKiBSRVZJU0lUIHNhdmUgcF9yYW0gaGVyZSBhZnRlciBzZXR0aW5nIHVwIGV2ZXJ5dGhpbmcgZXhjZXB0Ci0JICogdGhlIGJ1ZmZlciBhbmQgaXRzIGxlbmd0aCAoY2NudCkgLi4uIHVzZSBpdCBhcyBhIHRlbXBsYXRlCi0JICogc28gZGF2aW5jaV9wY21fZW5xdWV1ZV9kbWEoKSB0YWtlcyBsZXNzIHRpbWUgaW4gSVJRLgotCSAqLwotCWVkbWFfcmVhZF9zbG90KHBydGQtPmFzcF9saW5rWzBdLCAmcHJ0ZC0+YXNwX3BhcmFtcyk7Ci0JcHJ0ZC0+YXNwX3BhcmFtcy5vcHQgfD0gVENJTlRFTiB8Ci0JCUVETUFfVENDKEVETUFfQ0hBTl9TTE9UKHBydGQtPmFzcF9jaGFubmVsKSk7Ci0JcHJ0ZC0+YXNwX3BhcmFtcy5saW5rX2JjbnRybGQgPSBFRE1BX0NIQU5fU0xPVChwcnRkLT5hc3BfbGlua1swXSkgPDwgNTsKLQllZG1hX3dyaXRlX3Nsb3QocHJ0ZC0+YXNwX2xpbmtbMF0sICZwcnRkLT5hc3BfcGFyYW1zKTsKLQlyZXR1cm4gMDsKLWV4aXQyOgotCWVkbWFfZnJlZV9jaGFubmVsKHBydGQtPmFzcF9jaGFubmVsKTsKLQlwcnRkLT5hc3BfY2hhbm5lbCA9IC0xOwotZXhpdDE6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBkYXZpbmNpX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCXN0cnVjdCBkYXZpbmNpX3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrKCZwcnRkLT5sb2NrKTsKLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKLQkJZWRtYV9zdGFydChwcnRkLT5hc3BfY2hhbm5lbCk7Ci0JCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLICYmCi0JCSAgICBwcnRkLT5yYW1fY2hhbm5lbCA+PSAwKSB7Ci0JCQkvKiBjb3B5IDFzdCBpcmFtIGJ1ZmZlciAqLwotCQkJZWRtYV9zdGFydChwcnRkLT5yYW1fY2hhbm5lbCk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCQllZG1hX3Jlc3VtZShwcnRkLT5hc3BfY2hhbm5lbCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCQllZG1hX3BhdXNlKHBydGQtPmFzcF9jaGFubmVsKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JfQotCi0Jc3Bpbl91bmxvY2soJnBydGQtPmxvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBkYXZpbmNpX3BjbV9wcmVwYXJlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBkYXZpbmNpX3J1bnRpbWVfZGF0YSAqcHJ0ZCA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCi0JZGF2aW5jaV9wY21fcGVyaW9kX3Jlc2V0KHN1YnN0cmVhbSk7Ci0JaWYgKHBydGQtPnJhbV9jaGFubmVsID49IDApIHsKLQkJaW50IHJldCA9IHBpbmdfcG9uZ19kbWFfc2V0dXAoc3Vic3RyZWFtKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCi0JCWVkbWFfd3JpdGVfc2xvdChwcnRkLT5yYW1fY2hhbm5lbCwgJnBydGQtPnJhbV9wYXJhbXMpOwotCQllZG1hX3dyaXRlX3Nsb3QocHJ0ZC0+YXNwX2NoYW5uZWwsICZwcnRkLT5hc3BfcGFyYW1zKTsKLQotCQlwcmludF9idWZfaW5mbyhwcnRkLT5yYW1fY2hhbm5lbCwgInJhbV9jaGFubmVsIik7Ci0JCXByaW50X2J1Zl9pbmZvKHBydGQtPnJhbV9saW5rLCAicmFtX2xpbmsiKTsKLQkJcHJpbnRfYnVmX2luZm8ocHJ0ZC0+cmFtX2xpbmsyLCAicmFtX2xpbmsyIik7Ci0JCXByaW50X2J1Zl9pbmZvKHBydGQtPmFzcF9jaGFubmVsLCAiYXNwX2NoYW5uZWwiKTsKLQkJcHJpbnRfYnVmX2luZm8ocHJ0ZC0+YXNwX2xpbmtbMF0sICJhc3BfbGlua1swXSIpOwotCQlwcmludF9idWZfaW5mbyhwcnRkLT5hc3BfbGlua1sxXSwgImFzcF9saW5rWzFdIik7Ci0KLQkJLyoKLQkJICogVGhlcmUgaXMgYSBwaGFzZSBvZmZzZXQgb2YgMiBwZXJpb2RzIGJldHdlZW4gdGhlIHBvc2l0aW9uCi0JCSAqIHVzZWQgYnkgZG1hIHNldHVwIGFuZCB0aGUgcG9zaXRpb24gcmVwb3J0ZWQgaW4gdGhlIHBvaW50ZXIKLQkJICogZnVuY3Rpb24uCi0JCSAqCi0JCSAqIFRoZSBwaGFzZSBvZmZzZXQsIHdoZW4gbm90IHVzaW5nIHBpbmctcG9uZyBidWZmZXJzLCBpcyBkdWUgdG8KLQkJICogdGhlIHR3byBjb25zZWN1dGl2ZSBjYWxscyB0byBkYXZpbmNpX3BjbV9lbnF1ZXVlX2RtYSgpIGJlbG93LgotCQkgKgotCQkgKiBXaGVyZWFzIGhlcmUsIHdpdGggcGluZy1wb25nIGJ1ZmZlcnMsIHRoZSBwaGFzZSBpcyBkdWUgdG8KLQkJICogdGhlcmUgYmVpbmcgYW4gZW50aXJlIGJ1ZmZlciB0cmFuc2ZlciBjb21wbGV0ZSBiZWZvcmUgdGhlCi0JCSAqIGZpcnN0IGRtYSBjb21wbGV0aW9uIGV2ZW50IHRyaWdnZXJzIGRhdmluY2lfcGNtX2RtYV9pcnEoKS4KLQkJICovCi0JCWRhdmluY2lfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci0JCWRhdmluY2lfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCWRhdmluY2lfcGNtX2VucXVldWVfZG1hKHN1YnN0cmVhbSk7Ci0JZGF2aW5jaV9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKLQotCS8qIENvcHkgc2VsZi1saW5rZWQgcGFyYW1ldGVyIFJBTSBlbnRyeSBpbnRvIG1hc3RlciBjaGFubmVsICovCi0JZWRtYV9yZWFkX3Nsb3QocHJ0ZC0+YXNwX2xpbmtbMF0sICZwcnRkLT5hc3BfcGFyYW1zKTsKLQllZG1hX3dyaXRlX3Nsb3QocHJ0ZC0+YXNwX2NoYW5uZWwsICZwcnRkLT5hc3BfcGFyYW1zKTsKLQlkYXZpbmNpX3BjbV9lbnF1ZXVlX2RtYShzdWJzdHJlYW0pOwotCWRhdmluY2lfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNuZF9wY21fdWZyYW1lc190Ci1kYXZpbmNpX3BjbV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGRhdmluY2lfcnVudGltZV9kYXRhICpwcnRkID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGludCBvZmZzZXQ7Ci0JaW50IGFzcF9jb3VudDsKLQl1bnNpZ25lZCBpbnQgcGVyaW9kX3NpemUgPSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKTsKLQotCS8qCi0JICogVGhlcmUgaXMgYSBwaGFzZSBvZmZzZXQgb2YgMiBwZXJpb2RzIGJldHdlZW4gdGhlIHBvc2l0aW9uIHVzZWQgYnkgZG1hCi0JICogc2V0dXAgYW5kIHRoZSBwb3NpdGlvbiByZXBvcnRlZCBpbiB0aGUgcG9pbnRlciBmdW5jdGlvbi4gRWl0aGVyICsyIGluCi0JICogdGhlIGRtYSBzZXR1cCBvciAtMiBoZXJlIGluIHRoZSBwb2ludGVyIGZ1bmN0aW9uICh3aXRoIHdyYXBwaW5nLAotCSAqIGJvdGgpIGFjY291bnRzIGZvciB0aGlzIG9mZnNldCAtLSBjaG9vc2UgdGhlIGxhdHRlciBzaW5jZSBpdCBtYWtlcwotCSAqIHRoZSBmaXJzdC10aW1lIHNldHVwIGNsZWFyZXIuCi0JICovCi0Jc3Bpbl9sb2NrKCZwcnRkLT5sb2NrKTsKLQlhc3BfY291bnQgPSBwcnRkLT5wZXJpb2QgLSAyOwotCXNwaW5fdW5sb2NrKCZwcnRkLT5sb2NrKTsKLQotCWlmIChhc3BfY291bnQgPCAwKQotCQlhc3BfY291bnQgKz0gcnVudGltZS0+cGVyaW9kczsKLQlhc3BfY291bnQgKj0gcGVyaW9kX3NpemU7Ci0KLQlvZmZzZXQgPSBieXRlc190b19mcmFtZXMocnVudGltZSwgYXNwX2NvdW50KTsKLQlpZiAob2Zmc2V0ID49IHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKQotCQlvZmZzZXQgPSAwOwotCi0JcmV0dXJuIG9mZnNldDsKLX0KLQotc3RhdGljIGludCBkYXZpbmNpX3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGRhdmluY2lfcnVudGltZV9kYXRhICpwcnRkOwotCXN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlICpwcGNtOwotCWludCByZXQgPSAwOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgZGF2aW5jaV9wY21fZG1hX3BhcmFtcyAqcGE7Ci0Jc3RydWN0IGRhdmluY2lfcGNtX2RtYV9wYXJhbXMgKnBhcmFtczsKLQotCXBhID0gc25kX3NvY19kYWlfZ2V0X2RtYV9kYXRhKHJ0ZC0+Y3B1X2RhaSwgc3Vic3RyZWFtKTsKLQlpZiAoIXBhKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlwYXJhbXMgPSAmcGFbc3Vic3RyZWFtLT5zdHJlYW1dOwotCi0JcHBjbSA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKSA/Ci0JCQkmcGNtX2hhcmR3YXJlX3BsYXliYWNrIDogJnBjbV9oYXJkd2FyZV9jYXB0dXJlOwotCWFsbG9jYXRlX3NyYW0oc3Vic3RyZWFtLCBwYXJhbXMtPnNyYW1fcG9vbCwgcGFyYW1zLT5zcmFtX3NpemUsIHBwY20pOwotCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCBwcGNtKTsKLQkvKiBlbnN1cmUgdGhhdCBidWZmZXIgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIHBlcmlvZCBzaXplICovCi0JcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwKLQkJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXBydGQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGF2aW5jaV9ydW50aW1lX2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAocHJ0ZCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNwaW5fbG9ja19pbml0KCZwcnRkLT5sb2NrKTsKLQlwcnRkLT5wYXJhbXMgPSBwYXJhbXM7Ci0JcHJ0ZC0+YXNwX2NoYW5uZWwgPSAtMTsKLQlwcnRkLT5hc3BfbGlua1swXSA9IHBydGQtPmFzcF9saW5rWzFdID0gLTE7Ci0JcHJ0ZC0+cmFtX2NoYW5uZWwgPSAtMTsKLQlwcnRkLT5yYW1fbGluayA9IC0xOwotCXBydGQtPnJhbV9saW5rMiA9IC0xOwotCi0JcnVudGltZS0+cHJpdmF0ZV9kYXRhID0gcHJ0ZDsKLQotCXJldCA9IGRhdmluY2lfcGNtX2RtYV9yZXF1ZXN0KHN1YnN0cmVhbSk7Ci0JaWYgKHJldCkgewotCQlwcmludGsoS0VSTl9FUlIgImRhdmluY2lfcGNtOiBGYWlsZWQgdG8gZ2V0IGRtYSBjaGFubmVsc1xuIik7Ci0JCWtmcmVlKHBydGQpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZGF2aW5jaV9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3QgZGF2aW5jaV9ydW50aW1lX2RhdGEgKnBydGQgPSBydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0KLQlpZiAocHJ0ZC0+cmFtX2NoYW5uZWwgPj0gMCkKLQkJZWRtYV9zdG9wKHBydGQtPnJhbV9jaGFubmVsKTsKLQlpZiAocHJ0ZC0+YXNwX2NoYW5uZWwgPj0gMCkKLQkJZWRtYV9zdG9wKHBydGQtPmFzcF9jaGFubmVsKTsKLQlpZiAocHJ0ZC0+YXNwX2xpbmtbMF0gPj0gMCkKLQkJZWRtYV91bmxpbmsocHJ0ZC0+YXNwX2xpbmtbMF0pOwotCWlmIChwcnRkLT5hc3BfbGlua1sxXSA+PSAwKQotCQllZG1hX3VubGluayhwcnRkLT5hc3BfbGlua1sxXSk7Ci0JaWYgKHBydGQtPnJhbV9saW5rID49IDApCi0JCWVkbWFfdW5saW5rKHBydGQtPnJhbV9saW5rKTsKLQotCWlmIChwcnRkLT5hc3BfbGlua1swXSA+PSAwKQotCQllZG1hX2ZyZWVfc2xvdChwcnRkLT5hc3BfbGlua1swXSk7Ci0JaWYgKHBydGQtPmFzcF9saW5rWzFdID49IDApCi0JCWVkbWFfZnJlZV9zbG90KHBydGQtPmFzcF9saW5rWzFdKTsKLQlpZiAocHJ0ZC0+YXNwX2NoYW5uZWwgPj0gMCkKLQkJZWRtYV9mcmVlX2NoYW5uZWwocHJ0ZC0+YXNwX2NoYW5uZWwpOwotCWlmIChwcnRkLT5yYW1fbGluayA+PSAwKQotCQllZG1hX2ZyZWVfc2xvdChwcnRkLT5yYW1fbGluayk7Ci0JaWYgKHBydGQtPnJhbV9saW5rMiA+PSAwKQotCQllZG1hX2ZyZWVfc2xvdChwcnRkLT5yYW1fbGluazIpOwotCWlmIChwcnRkLT5yYW1fY2hhbm5lbCA+PSAwKQotCQllZG1hX2ZyZWVfY2hhbm5lbChwcnRkLT5yYW1fY2hhbm5lbCk7Ci0KLQlrZnJlZShwcnRkKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRhdmluY2lfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpod19wYXJhbXMpCi17Ci0JcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCi0JCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7Ci19Ci0KLXN0YXRpYyBpbnQgZGF2aW5jaV9wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlyZXR1cm4gc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotfQotCi1zdGF0aWMgaW50IGRhdmluY2lfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQotCXJldHVybiBkbWFfbW1hcF93cml0ZWNvbWJpbmUoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgdm1hLAotCQkJCSAgICAgcnVudGltZS0+ZG1hX2FyZWEsCi0JCQkJICAgICBydW50aW1lLT5kbWFfYWRkciwKLQkJCQkgICAgIHJ1bnRpbWUtPmRtYV9ieXRlcyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgZGF2aW5jaV9wY21fb3BzID0gewotCS5vcGVuID0gCWRhdmluY2lfcGNtX29wZW4sCi0JLmNsb3NlID0gCWRhdmluY2lfcGNtX2Nsb3NlLAotCS5pb2N0bCA9IAlzbmRfcGNtX2xpYl9pb2N0bCwKLQkuaHdfcGFyYW1zID0gCWRhdmluY2lfcGNtX2h3X3BhcmFtcywKLQkuaHdfZnJlZSA9IAlkYXZpbmNpX3BjbV9od19mcmVlLAotCS5wcmVwYXJlID0gCWRhdmluY2lfcGNtX3ByZXBhcmUsCi0JLnRyaWdnZXIgPSAJZGF2aW5jaV9wY21fdHJpZ2dlciwKLQkucG9pbnRlciA9IAlkYXZpbmNpX3BjbV9wb2ludGVyLAotCS5tbWFwID0gCWRhdmluY2lfcGNtX21tYXAsCi19OwotCi1zdGF0aWMgaW50IGRhdmluY2lfcGNtX3ByZWFsbG9jYXRlX2RtYV9idWZmZXIoc3RydWN0IHNuZF9wY20gKnBjbSwgaW50IHN0cmVhbSwKLQkJc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwY20tPnN0cmVhbXNbc3RyZWFtXS5zdWJzdHJlYW07Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWYgPSAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyOwotCi0JYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKLQlidWYtPmRldi5kZXYgPSBwY20tPmNhcmQtPmRldjsKLQlidWYtPnByaXZhdGVfZGF0YSA9IE5VTEw7Ci0JYnVmLT5hcmVhID0gZG1hX2FsbG9jX3dyaXRlY29tYmluZShwY20tPmNhcmQtPmRldiwgc2l6ZSwKLQkJCQkJICAgJmJ1Zi0+YWRkciwgR0ZQX0tFUk5FTCk7Ci0KLQlwcl9kZWJ1ZygiZGF2aW5jaV9wY206IHByZWFsbG9jYXRlX2RtYV9idWZmZXI6IGFyZWE9JXAsIGFkZHI9JXAsICIKLQkJInNpemU9JWRcbiIsICh2b2lkICopIGJ1Zi0+YXJlYSwgKHZvaWQgKikgYnVmLT5hZGRyLCBzaXplKTsKLQotCWlmICghYnVmLT5hcmVhKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWJ1Zi0+Ynl0ZXMgPSBzaXplOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBkYXZpbmNpX3BjbV9mcmVlKHN0cnVjdCBzbmRfcGNtICpwY20pCi17Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyICpidWY7Ci0JaW50IHN0cmVhbTsKLQotCWZvciAoc3RyZWFtID0gMDsgc3RyZWFtIDwgMjsgc3RyZWFtKyspIHsKLQkJc3RydWN0IHNuZF9kbWFfYnVmZmVyICppcmFtX2RtYTsKLQkJc3Vic3RyZWFtID0gcGNtLT5zdHJlYW1zW3N0cmVhbV0uc3Vic3RyZWFtOwotCQlpZiAoIXN1YnN0cmVhbSkKLQkJCWNvbnRpbnVlOwotCi0JCWJ1ZiA9ICZzdWJzdHJlYW0tPmRtYV9idWZmZXI7Ci0JCWlmICghYnVmLT5hcmVhKQotCQkJY29udGludWU7Ci0KLQkJZG1hX2ZyZWVfd3JpdGVjb21iaW5lKHBjbS0+Y2FyZC0+ZGV2LCBidWYtPmJ5dGVzLAotCQkJCSAgICAgIGJ1Zi0+YXJlYSwgYnVmLT5hZGRyKTsKLQkJYnVmLT5hcmVhID0gTlVMTDsKLQkJaXJhbV9kbWEgPSBidWYtPnByaXZhdGVfZGF0YTsKLQkJaWYgKGlyYW1fZG1hKSB7Ci0JCQlkYXZpbmNpX2ZyZWVfc3JhbShzdWJzdHJlYW0sIGlyYW1fZG1hKTsKLQkJCWtmcmVlKGlyYW1fZG1hKTsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBkYXZpbmNpX3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBydGQtPmNhcmQtPnNuZF9jYXJkOwotCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChjYXJkLT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSkgewotCQlyZXQgPSBkYXZpbmNpX3BjbV9wcmVhbGxvY2F0ZV9kbWFfYnVmZmVyKHBjbSwKLQkJCVNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssCi0JCQlwY21faGFyZHdhcmVfcGxheWJhY2suYnVmZmVyX2J5dGVzX21heCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW0pIHsKLQkJcmV0ID0gZGF2aW5jaV9wY21fcHJlYWxsb2NhdGVfZG1hX2J1ZmZlcihwY20sCi0JCQlTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsCi0JCQlwY21faGFyZHdhcmVfY2FwdHVyZS5idWZmZXJfYnl0ZXNfbWF4KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgZGF2aW5jaV9zb2NfcGxhdGZvcm0gPSB7Ci0JLm9wcyA9CQkmZGF2aW5jaV9wY21fb3BzLAotCS5wY21fbmV3ID0gCWRhdmluY2lfcGNtX25ldywKLQkucGNtX2ZyZWUgPSAJZGF2aW5jaV9wY21fZnJlZSwKLX07Ci0KLWludCBkYXZpbmNpX3NvY19wbGF0Zm9ybV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybShkZXYsICZkYXZpbmNpX3NvY19wbGF0Zm9ybSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChkYXZpbmNpX3NvY19wbGF0Zm9ybV9yZWdpc3Rlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIlZsYWRpbWlyIEJhcmlub3YiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiVEkgREFWSU5DSSBQQ00gRE1BIG1vZHVsZSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uaCBiL3NvdW5kL3NvYy9kYXZpbmNpL2RhdmluY2ktcGNtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZTIzNDYuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS1wY20uaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBBTFNBIFBDTSBpbnRlcmZhY2UgZm9yIHRoZSBUSSBEQVZJTkNJIHByb2Nlc3NvcgotICoKLSAqIEF1dGhvcjogICAgICBWbGFkaW1pciBCYXJpbm92LCA8dmJhcmlub3ZAZW1iZWRkZWRhbGxleS5jb20+Ci0gKiBDb3B5cmlnaHQ6ICAgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiwgPHNvdXJjZUBtdmlzdGEuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKi8KLQotI2lmbmRlZiBfREFWSU5DSV9QQ01fSAotI2RlZmluZSBfREFWSU5DSV9QQ01fSAotCi0jaW5jbHVkZSA8bGludXgvZ2VuYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL2RhdmluY2lfYXNwLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9lZG1hLmg+Ci0KLXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zIHsKLQlpbnQgY2hhbm5lbDsJCQkvKiBzeW5jIGRtYSBjaGFubmVsIElEICovCi0JdW5zaWduZWQgc2hvcnQgYWNudDsKLQlkbWFfYWRkcl90IGRtYV9hZGRyOwkJLyogZGV2aWNlIHBoeXNpY2FsIGFkZHJlc3MgZm9yIERNQSAqLwotCXVuc2lnbmVkIHNyYW1fc2l6ZTsKLQlzdHJ1Y3QgZ2VuX3Bvb2wgKnNyYW1fcG9vbDsJLyogU1JBTSBnZW5fcG9vbCBmb3IgcGluZyBwb25nICovCi0JZW51bSBkbWFfZXZlbnRfcSBhc3BfY2hhbl9xOwkvKiBldmVudCBxdWV1ZSBudW1iZXIgZm9yIEFTUCBjaGFubmVsICovCi0JZW51bSBkbWFfZXZlbnRfcSByYW1fY2hhbl9xOwkvKiBldmVudCBxdWV1ZSBudW1iZXIgZm9yIFJBTSBjaGFubmVsICovCi0JdW5zaWduZWQgY2hhciBkYXRhX3R5cGU7CS8qIHhmZXIgZGF0YSB0eXBlICovCi0JdW5zaWduZWQgY2hhciBjb252ZXJ0X21vbm9fc3RlcmVvOwotCXVuc2lnbmVkIGludCBmaWZvX2xldmVsOwotfTsKLQotI2lmIElTX0VOQUJMRUQoQ09ORklHX1NORF9EQVZJTkNJX1NPQykKLWludCBkYXZpbmNpX3NvY19wbGF0Zm9ybV9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGRhdmluY2lfc29jX3BsYXRmb3JtX3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfU05EX0RBVklOQ0lfU09DICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS12Y2lmLmMgYi9zb3VuZC9zb2MvZGF2aW5jaS9kYXZpbmNpLXZjaWYuYwppbmRleCA1YmVlMDQyNy4uZmFiZDA1ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS12Y2lmLmMKKysrIGIvc291bmQvc29jL2RhdmluY2kvZGF2aW5jaS12Y2lmLmMKQEAgLTMzLDggKzMzLDkgQEAKICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2RtYWVuZ2luZV9wY20uaD4KIAotI2luY2x1ZGUgImRhdmluY2ktcGNtLmgiCisjaW5jbHVkZSAiZWRtYS1wY20uaCIKICNpbmNsdWRlICJkYXZpbmNpLWkycy5oIgogCiAjZGVmaW5lIE1PRF9SRUdfQklUKHZhbCwgbWFzaywgc2V0KSBkbyB7IFwKQEAgLTQ3LDcgKzQ4LDggQEAKIAogc3RydWN0IGRhdmluY2lfdmNpZl9kZXYgewogCXN0cnVjdCBkYXZpbmNpX3ZjICpkYXZpbmNpX3ZjOwotCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zCWRtYV9wYXJhbXNbMl07CisJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIGRtYV9kYXRhWzJdOworCWludCBkbWFfcmVxdWVzdFsyXTsKIH07CiAKIHN0YXRpYyB2b2lkIGRhdmluY2lfdmNpZl9zdGFydChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKQEAgLTkzLDggKzk1LDYgQEAKIHsKIAlzdHJ1Y3QgZGF2aW5jaV92Y2lmX2RldiAqZGF2aW5jaV92Y2lmX2RldiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CiAJc3RydWN0IGRhdmluY2lfdmMgKmRhdmluY2lfdmMgPSBkYXZpbmNpX3ZjaWZfZGV2LT5kYXZpbmNpX3ZjOwotCXN0cnVjdCBkYXZpbmNpX3BjbV9kbWFfcGFyYW1zICpkbWFfcGFyYW1zID0KLQkJCSZkYXZpbmNpX3ZjaWZfZGV2LT5kbWFfcGFyYW1zW3N1YnN0cmVhbS0+c3RyZWFtXTsKIAl1MzIgdzsKIAogCS8qIFJlc3RhcnQgdGhlIGNvZGVjIGJlZm9yZSBzZXR1cCAqLwpAQCAtMTEzLDE2ICsxMTMsMTIgQEAKIAkvKiBEZXRlcm1pbmUgeGZlciBkYXRhIHR5cGUgKi8KIAlzd2l0Y2ggKHBhcmFtc19mb3JtYXQocGFyYW1zKSkgewogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9VODoKLQkJZG1hX3BhcmFtcy0+ZGF0YV90eXBlID0gMDsKLQogCQlNT0RfUkVHX0JJVCh3LCBEQVZJTkNJX1ZDX0NUUkxfUkRfQklUU184IHwKIAkJCSAgICBEQVZJTkNJX1ZDX0NUUkxfUkRfVU5TSUdORUQgfAogCQkJICAgIERBVklOQ0lfVkNfQ1RSTF9XRF9CSVRTXzggfAogCQkJICAgIERBVklOQ0lfVkNfQ1RSTF9XRF9VTlNJR05FRCwgMSk7CiAJCWJyZWFrOwogCWNhc2UgU05EUlZfUENNX0ZPUk1BVF9TODoKLQkJZG1hX3BhcmFtcy0+ZGF0YV90eXBlID0gMTsKLQogCQlNT0RfUkVHX0JJVCh3LCBEQVZJTkNJX1ZDX0NUUkxfUkRfQklUU184IHwKIAkJCSAgICBEQVZJTkNJX1ZDX0NUUkxfV0RfQklUU184LCAxKTsKIApAQCAtMTMwLDggKzEyNiw2IEBACiAJCQkgICAgREFWSU5DSV9WQ19DVFJMX1dEX1VOU0lHTkVELCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQkJZG1hX3BhcmFtcy0+ZGF0YV90eXBlID0gMjsKLQogCQlNT0RfUkVHX0JJVCh3LCBEQVZJTkNJX1ZDX0NUUkxfUkRfQklUU184IHwKIAkJCSAgICBEQVZJTkNJX1ZDX0NUUkxfUkRfVU5TSUdORUQgfAogCQkJICAgIERBVklOQ0lfVkNfQ1RSTF9XRF9CSVRTXzggfApAQCAtMTQyLDggKzEzNiw2IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWRtYV9wYXJhbXMtPmFjbnQgID0gZG1hX3BhcmFtcy0+ZGF0YV90eXBlOwotCiAJd3JpdGVsKHcsIGRhdmluY2lfdmMtPmJhc2UgKyBEQVZJTkNJX1ZDX0NUUkwpOwogCiAJcmV0dXJuIDA7CkBAIC0xNzIsMjQgKzE2NCwyNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZGF2aW5jaV92Y2lmX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IGRhdmluY2lfdmNpZl9kZXYgKmRldiA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7Ci0KLQlzbmRfc29jX2RhaV9zZXRfZG1hX2RhdGEoZGFpLCBzdWJzdHJlYW0sIGRldi0+ZG1hX3BhcmFtcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KICNkZWZpbmUgREFWSU5DSV9WQ0lGX1JBVEVTCVNORFJWX1BDTV9SQVRFXzgwMDBfNDgwMDAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgZGF2aW5jaV92Y2lmX2RhaV9vcHMgPSB7Ci0JLnN0YXJ0dXAJPSBkYXZpbmNpX3ZjaWZfc3RhcnR1cCwKIAkudHJpZ2dlcgk9IGRhdmluY2lfdmNpZl90cmlnZ2VyLAogCS5od19wYXJhbXMJPSBkYXZpbmNpX3ZjaWZfaHdfcGFyYW1zLAogfTsKIAorc3RhdGljIGludCBkYXZpbmNpX3ZjaWZfZGFpX3Byb2JlKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBkYXZpbmNpX3ZjaWZfZGV2ICpkZXYgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCisJZGFpLT5wbGF5YmFja19kbWFfZGF0YSA9ICZkZXYtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdOworCWRhaS0+Y2FwdHVyZV9kbWFfZGF0YSA9ICZkZXYtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV07CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgZGF2aW5jaV92Y2lmX2RhaSA9IHsKKwkucHJvYmUgPSBkYXZpbmNpX3ZjaWZfZGFpX3Byb2JlLAogCS5wbGF5YmFjayA9IHsKIAkJLmNoYW5uZWxzX21pbiA9IDEsCiAJCS5jaGFubmVsc19tYXggPSAyLApAQCAtMjI1LDE2ICsyMTgsMTYgQEAKIAogCS8qIERNQSB0eCBwYXJhbXMgKi8KIAlkYXZpbmNpX3ZjaWZfZGV2LT5kYXZpbmNpX3ZjID0gZGF2aW5jaV92YzsKLQlkYXZpbmNpX3ZjaWZfZGV2LT5kbWFfcGFyYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmNoYW5uZWwgPQotCQkJCQlkYXZpbmNpX3ZjLT5kYXZpbmNpX3ZjaWYuZG1hX3R4X2NoYW5uZWw7Ci0JZGF2aW5jaV92Y2lmX2Rldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5kbWFfYWRkciA9Ci0JCQkJCWRhdmluY2lfdmMtPmRhdmluY2lfdmNpZi5kbWFfdHhfYWRkcjsKKwlkYXZpbmNpX3ZjaWZfZGV2LT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5maWx0ZXJfZGF0YSA9CisJCQkJJmRhdmluY2lfdmMtPmRhdmluY2lfdmNpZi5kbWFfdHhfY2hhbm5lbDsKKwlkYXZpbmNpX3ZjaWZfZGV2LT5kbWFfZGF0YVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5hZGRyID0KKwkJCQlkYXZpbmNpX3ZjLT5kYXZpbmNpX3ZjaWYuZG1hX3R4X2FkZHI7CiAKIAkvKiBETUEgcnggcGFyYW1zICovCi0JZGF2aW5jaV92Y2lmX2Rldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLmNoYW5uZWwgPQotCQkJCQlkYXZpbmNpX3ZjLT5kYXZpbmNpX3ZjaWYuZG1hX3J4X2NoYW5uZWw7Ci0JZGF2aW5jaV92Y2lmX2Rldi0+ZG1hX3BhcmFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLmRtYV9hZGRyID0KLQkJCQkJZGF2aW5jaV92Yy0+ZGF2aW5jaV92Y2lmLmRtYV9yeF9hZGRyOworCWRhdmluY2lfdmNpZl9kZXYtPmRtYV9kYXRhW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uZmlsdGVyX2RhdGEgPQorCQkJCSZkYXZpbmNpX3ZjLT5kYXZpbmNpX3ZjaWYuZG1hX3J4X2NoYW5uZWw7CisJZGF2aW5jaV92Y2lmX2Rldi0+ZG1hX2RhdGFbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5hZGRyID0KKwkJCQlkYXZpbmNpX3ZjLT5kYXZpbmNpX3ZjaWYuZG1hX3J4X2FkZHI7CiAKIAlkZXZfc2V0X2RydmRhdGEoJnBkZXYtPmRldiwgZGF2aW5jaV92Y2lmX2Rldik7CiAKQEAgLTI0NSw3ICsyMzgsNyBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGRhdmluY2lfc29jX3BsYXRmb3JtX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOworCXJldCA9IGVkbWFfcGNtX3BsYXRmb3JtX3JlZ2lzdGVyKCZwZGV2LT5kZXYpOwogCWlmIChyZXQpIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVnaXN0ZXIgUENNIGZhaWxlZDogJWRcbiIsIHJldCk7CiAJCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL0tjb25maWcgYi9zb3VuZC9zb2MvZnNsL0tjb25maWcKaW5kZXggMDgxZTQwNi4uMTljMzAyYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9mc2wvS2NvbmZpZwpAQCAtMjQsNyArMjQsNyBAQAogCSAgaW4tdHJlZSBkcml2ZXJzIHNlbGVjdCBpdCBhdXRvbWF0aWNhbGx5LgogCiBjb25maWcgU05EX1NPQ19GU0xfU1NJCi0JdHJpc3RhdGUgIlN5bmNocm9ub3VzIFNlcmlhbCBJbnRlcmZhY2UgbW9kdWxlIHN1cHBvcnQiCisJdHJpc3RhdGUgIlN5bmNocm9ub3VzIFNlcmlhbCBJbnRlcmZhY2UgbW9kdWxlIChTU0kpIHN1cHBvcnQiCiAJc2VsZWN0IFNORF9TT0NfSU1YX1BDTV9ETUEgaWYgU05EX0lNWF9TT0MgIT0gbgogCXNlbGVjdCBTTkRfU09DX0lNWF9QQ01fRklRIGlmIFNORF9JTVhfU09DICE9IG4gJiYgKE1YQ19UWklDIHx8IE1YQ19BVklDKQogCXNlbGVjdCBSRUdNQVBfTU1JTwpAQCAtMzUsNyArMzUsNyBAQAogCSAgaW4tdHJlZSBkcml2ZXJzIHNlbGVjdCBpdCBhdXRvbWF0aWNhbGx5LgogCiBjb25maWcgU05EX1NPQ19GU0xfU1BESUYKLQl0cmlzdGF0ZSAiU29ueS9QaGlsaXBzIERpZ2l0YWwgSW50ZXJmYWNlIG1vZHVsZSBzdXBwb3J0IgorCXRyaXN0YXRlICJTb255L1BoaWxpcHMgRGlnaXRhbCBJbnRlcmZhY2UgKFMvUERJRikgbW9kdWxlIHN1cHBvcnQiCiAJc2VsZWN0IFJFR01BUF9NTUlPCiAJc2VsZWN0IFNORF9TT0NfSU1YX1BDTV9ETUEgaWYgU05EX0lNWF9TT0MgIT0gbgogCXNlbGVjdCBTTkRfU09DX0lNWF9QQ01fRklRIGlmIFNORF9JTVhfU09DICE9IG4gJiYgKE1YQ19UWklDIHx8IE1YQ19BVklDKQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9mc2wtYXNvYy1jYXJkLmMgYi9zb3VuZC9zb2MvZnNsL2ZzbC1hc29jLWNhcmQuYwppbmRleCAzZjY5NTljLi5kZTQzODg3IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2ZzbC1hc29jLWNhcmQuYworKysgYi9zb3VuZC9zb2MvZnNsL2ZzbC1hc29jLWNhcmQuYwpAQCAtNTEyLDYgKzUxMiwxMiBAQAogCW1lbWNweShwcml2LT5kYWlfbGluaywgZnNsX2Fzb2NfY2FyZF9kYWksCiAJICAgICAgIHNpemVvZihzdHJ1Y3Qgc25kX3NvY19kYWlfbGluaykgKiBBUlJBWV9TSVpFKHByaXYtPmRhaV9saW5rKSk7CiAKKwlyZXQgPSBzbmRfc29jX29mX3BhcnNlX2F1ZGlvX3JvdXRpbmcoJnByaXYtPmNhcmQsICJhdWRpby1yb3V0aW5nIik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcGFyc2UgYXVkaW8tcm91dGluZzogJWRcbiIsIHJldCk7CisJCWdvdG8gYXNyY19mYWlsOworCX0KKwogCS8qIE5vcm1hbCBEQUkgTGluayAqLwogCXByaXYtPmRhaV9saW5rWzBdLmNwdV9vZl9ub2RlID0gY3B1X25wOwogCXByaXYtPmRhaV9saW5rWzBdLmNvZGVjX29mX25vZGUgPSBjb2RlY19ucDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvZnNsX3NzaS5jIGIvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKaW5kZXggYjlmYWJiZi4uZThiYjhlZSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKKysrIGIvc291bmQvc29jL2ZzbC9mc2xfc3NpLmMKQEAgLTYwMyw3ICs2MDMsNyBAQAogCWZhY3RvciA9IChkaXYyICsgMSkgKiAoNyAqIHBzciArIDEpICogMjsKIAogCWZvciAoaSA9IDA7IGkgPCAyNTU7IGkrKykgewotCQl0bXByYXRlID0gZnJlcSAqIGZhY3RvciAqIChpICsgMik7CisJCXRtcHJhdGUgPSBmcmVxICogZmFjdG9yICogKGkgKyAxKTsKIAogCQlpZiAoYmF1ZGNsa19pc191c2VkKQogCQkJY2xrcmF0ZSA9IGNsa19nZXRfcmF0ZShzc2lfcHJpdmF0ZS0+YmF1ZGNsayk7CkBAIC0xMjI3LDcgKzEyMjcsNyBAQAogCXNzaV9wcml2YXRlLT5kbWFfcGFyYW1zX3R4LmFkZHIgPSBzc2lfcHJpdmF0ZS0+c3NpX3BoeXMgKyBDQ1NSX1NTSV9TVFgwOwogCXNzaV9wcml2YXRlLT5kbWFfcGFyYW1zX3J4LmFkZHIgPSBzc2lfcHJpdmF0ZS0+c3NpX3BoeXMgKyBDQ1NSX1NTSV9TUlgwOwogCi0JcmV0ID0gIW9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG5wLCAiZG1hcyIsIGRtYXMsIDQpOworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KG5wLCAiZG1hcyIsIGRtYXMsIDQpOwogCWlmIChzc2lfcHJpdmF0ZS0+dXNlX2RtYSAmJiAhcmV0ICYmIGRtYXNbMl0gPT0gSU1YX0RNQVRZUEVfU1NJX0RVQUwpIHsKIAkJc3NpX3ByaXZhdGUtPnVzZV9kdWFsX2ZpZm8gPSB0cnVlOwogCQkvKiBXaGVuIHVzaW5nIGR1YWwgZmlmbyBtb2RlLCB3ZSBuZWVkIHRvIGtlZXAgd2F0ZXJtYXJrCkBAIC0xMjg4LDcgKzEyODgsNyBAQAogCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkOwogCWNvbnN0IGNoYXIgKnAsICpzcHJvcDsKIAljb25zdCB1aW50MzJfdCAqaXByb3A7Ci0Jc3RydWN0IHJlc291cmNlIHJlczsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAl2b2lkIF9faW9tZW0gKmlvbWVtOwogCWNoYXIgbmFtZVs2NF07CiAKQEAgLTEzMzUsMTkgKzEzMzUsMTEgQEAKIAl9CiAJc3NpX3ByaXZhdGUtPmNwdV9kYWlfZHJ2Lm5hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAotCS8qIEdldCB0aGUgYWRkcmVzc2VzIGFuZCBJUlEgKi8KLQlyZXQgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBkZXRlcm1pbmUgZGV2aWNlIHJlc291cmNlc1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXNzaV9wcml2YXRlLT5zc2lfcGh5cyA9IHJlcy5zdGFydDsKLQotCWlvbWVtID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7Ci0JaWYgKCFpb21lbSkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjb3VsZCBub3QgbWFwIGRldmljZSByZXNvdXJjZXNcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpb21lbSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoaW9tZW0pKQorCQlyZXR1cm4gUFRSX0VSUihpb21lbSk7CisJc3NpX3ByaXZhdGUtPnNzaV9waHlzID0gcmVzLT5zdGFydDsKIAogCXJldCA9IG9mX3Byb3BlcnR5X21hdGNoX3N0cmluZyhucCwgImNsb2NrLW5hbWVzIiwgImlwZyIpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0xMzkzLDggKzEzODUsOCBAQAogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAmZnNsX3NzaV9jb21wb25lbnQsCi0JCQkJCSAmc3NpX3ByaXZhdGUtPmNwdV9kYWlfZHJ2LCAxKTsKKwlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZmc2xfc3NpX2NvbXBvbmVudCwKKwkJCQkJICAgICAgJnNzaV9wcml2YXRlLT5jcHVfZGFpX2RydiwgMSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgREFJOiAlZFxuIiwgcmV0KTsKIAkJZ290byBlcnJvcl9hc29jX3JlZ2lzdGVyOwpAQCAtMTQwNywxMyArMTM5OSwxMyBAQAogCQlpZiAocmV0IDwgMCkgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiY291bGQgbm90IGNsYWltIGlycSAldVxuIiwKIAkJCQkJc3NpX3ByaXZhdGUtPmlycSk7Ci0JCQlnb3RvIGVycm9yX2lycTsKKwkJCWdvdG8gZXJyb3JfYXNvY19yZWdpc3RlcjsKIAkJfQogCX0KIAogCXJldCA9IGZzbF9zc2lfZGVidWdmc19jcmVhdGUoJnNzaV9wcml2YXRlLT5kYmdfc3RhdHMsICZwZGV2LT5kZXYpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfaXJxOworCQlnb3RvIGVycm9yX2Fzb2NfcmVnaXN0ZXI7CiAKIAkvKgogCSAqIElmIGNvZGVjLWhhbmRsZSBwcm9wZXJ0eSBpcyBtaXNzaW5nIGZyb20gU1NJIG5vZGUsIHdlIGFzc3VtZQpAQCAtMTQ1NCw5ICsxNDQ2LDYgQEAKIGVycm9yX3NvdW5kX2NhcmQ6CiAJZnNsX3NzaV9kZWJ1Z2ZzX3JlbW92ZSgmc3NpX3ByaXZhdGUtPmRiZ19zdGF0cyk7CiAKLWVycm9yX2lycToKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOwotCiBlcnJvcl9hc29jX3JlZ2lzdGVyOgogCWlmIChzc2lfcHJpdmF0ZS0+c29jLT5pbXgpCiAJCWZzbF9zc2lfaW14X2NsZWFuKHBkZXYsIHNzaV9wcml2YXRlKTsKQEAgLTE0NzIsNyArMTQ2MSw2IEBACiAKIAlpZiAoc3NpX3ByaXZhdGUtPnBkZXYpCiAJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNzaV9wcml2YXRlLT5wZGV2KTsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOwogCiAJaWYgKHNzaV9wcml2YXRlLT5zb2MtPmlteCkKIAkJZnNsX3NzaV9pbXhfY2xlYW4ocGRldiwgc3NpX3ByaXZhdGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ZzbC9pbXgtZXM4MzI4LmMgYi9zb3VuZC9zb2MvZnNsL2lteC1lczgzMjguYwppbmRleCBmOGNmMTBlLi4yMGU3NDAwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL2lteC1lczgzMjguYworKysgYi9zb3VuZC9zb2MvZnNsL2lteC1lczgzMjguYwpAQCAtNTMsOSArNTMsOSBAQAogCiAJLyogSGVhZHBob25lIGphY2sgZGV0ZWN0aW9uICovCiAJaWYgKGdwaW9faXNfdmFsaWQoZGF0YS0+amFja19ncGlvKSkgewotCQlyZXQgPSBzbmRfc29jX2phY2tfbmV3KHJ0ZC0+Y29kZWMsICJIZWFkcGhvbmUiLAotCQkJCSAgICAgICBTTkRfSkFDS19IRUFEUEhPTkUgfCBTTkRfSkFDS19CVE5fMCwKLQkJCQkgICAgICAgJmhlYWRzZXRfamFjayk7CisJCXJldCA9IHNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJIZWFkcGhvbmUiLAorCQkJCQkgICAgU05EX0pBQ0tfSEVBRFBIT05FIHwgU05EX0pBQ0tfQlROXzAsCisJCQkJCSAgICAmaGVhZHNldF9qYWNrLCBOVUxMLCAwKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvbXBjNTIwMF9wc2NfYWM5Ny5jIGIvc291bmQvc29jL2ZzbC9tcGM1MjAwX3BzY19hYzk3LmMKaW5kZXggMDhkMmE4MC4uMGJhYjc2MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9tcGM1MjAwX3BzY19hYzk3LmMKKysrIGIvc291bmQvc29jL2ZzbC9tcGM1MjAwX3BzY19hYzk3LmMKQEAgLTMyNiw3ICszMjYsNyBAQAogfQogCiAvKiBNYXRjaCB0YWJsZSBmb3Igb2ZfcGxhdGZvcm0gYmluZGluZyAqLwotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcHNjX2FjOTdfbWF0Y2hbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBzY19hYzk3X21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMC1wc2MtYWM5NyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLWFjOTciLCB9LAogCXt9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL21wYzUyMDBfcHNjX2kycy5jIGIvc291bmQvc29jL2ZzbC9tcGM1MjAwX3BzY19pMnMuYwppbmRleCA1MWZiMGMwLi5kODIzMjk0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvZnNsL21wYzUyMDBfcHNjX2kycy5jCisrKyBiL3NvdW5kL3NvYy9mc2wvbXBjNTIwMF9wc2NfaTJzLmMKQEAgLTIxNyw3ICsyMTcsNyBAQAogfQogCiAvKiBNYXRjaCB0YWJsZSBmb3Igb2ZfcGxhdGZvcm0gYmluZGluZyAqLwotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcHNjX2kyc19tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcHNjX2kyc19tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAiZnNsLG1wYzUyMDAtcHNjLWkycyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJmc2wsbXBjNTIwMGItcHNjLWkycyIsIH0sCiAJe30KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvcGNtMDMwLWF1ZGlvLWZhYnJpYy5jIGIvc291bmQvc29jL2ZzbC9wY20wMzAtYXVkaW8tZmFicmljLmMKaW5kZXggYzQ0NDU5ZC4uZWM3MzEyMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2ZzbC9wY20wMzAtYXVkaW8tZmFicmljLmMKKysrIGIvc291bmQvc29jL2ZzbC9wY20wMzAtYXVkaW8tZmFicmljLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHBjbTAzMF9hdWRpb19tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcGNtMDMwX2F1ZGlvX21hdGNoW10gPSB7CiAJeyAuY29tcGF0aWJsZSA9ICJwaHl0ZWMscGNtMDMwLWF1ZGlvLWZhYnJpYyIsIH0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvZnNsL3dtMTEzMy1ldjEuYyBiL3NvdW5kL3NvYy9mc2wvd20xMTMzLWV2MS5jCmluZGV4IGE5NTg5MzcuLmI0NTQ5NzIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvd20xMTMzLWV2MS5jCisrKyBiL3NvdW5kL3NvYy9mc2wvd20xMTMzLWV2MS5jCkBAIC0yMDIsMjMgKzIwMiwyMCBAQAogc3RhdGljIGludCB3bTExMzNfZXYxX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAogCS8qIEhlYWRwaG9uZSBqYWNrIGRldGVjdGlvbiAqLwotCXNuZF9zb2NfamFja19uZXcoY29kZWMsICJIZWFkcGhvbmUiLCBTTkRfSkFDS19IRUFEUEhPTkUsICZocF9qYWNrKTsKLQlzbmRfc29jX2phY2tfYWRkX3BpbnMoJmhwX2phY2ssIEFSUkFZX1NJWkUoaHBfamFja19waW5zKSwKLQkJCSAgICAgIGhwX2phY2tfcGlucyk7CisJc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRwaG9uZSIsIFNORF9KQUNLX0hFQURQSE9ORSwKKwkJCSAgICAgICZocF9qYWNrLCBocF9qYWNrX3BpbnMsIEFSUkFZX1NJWkUoaHBfamFja19waW5zKSk7CiAJd204MzUwX2hwX2phY2tfZGV0ZWN0KGNvZGVjLCBXTTgzNTBfSkRSLCAmaHBfamFjaywgU05EX0pBQ0tfSEVBRFBIT05FKTsKIAogCS8qIE1pY3JvcGhvbmUgamFjayBkZXRlY3Rpb24gKi8KLQlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiTWljcm9waG9uZSIsCi0JCQkgU05EX0pBQ0tfTUlDUk9QSE9ORSB8IFNORF9KQUNLX0JUTl8wLCAmbWljX2phY2spOwotCXNuZF9zb2NfamFja19hZGRfcGlucygmbWljX2phY2ssIEFSUkFZX1NJWkUobWljX2phY2tfcGlucyksCi0JCQkgICAgICBtaWNfamFja19waW5zKTsKKwlzbmRfc29jX2NhcmRfamFja19uZXcocnRkLT5jYXJkLCAiTWljcm9waG9uZSIsCisJCQkgICAgICBTTkRfSkFDS19NSUNST1BIT05FIHwgU05EX0pBQ0tfQlROXzAsICZtaWNfamFjaywKKwkJCSAgICAgIG1pY19qYWNrX3BpbnMsIEFSUkFZX1NJWkUobWljX2phY2tfcGlucykpOwogCXdtODM1MF9taWNfamFja19kZXRlY3QoY29kZWMsICZtaWNfamFjaywgU05EX0pBQ0tfTUlDUk9QSE9ORSwKIAkJCSAgICAgICBTTkRfSkFDS19CVE5fMCk7CiAKLQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihkYXBtLCAiTWljIEJpYXMiKTsKKwlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmcnRkLT5jYXJkLT5kYXBtLCAiTWljIEJpYXMiKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQuYyBiL3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMKaW5kZXggZmI1NTBiNS4uMzNmZWVlOSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2dlbmVyaWMvc2ltcGxlLWNhcmQuYworKysgYi9zb3VuZC9zb2MvZ2VuZXJpYy9zaW1wbGUtY2FyZC5jCkBAIC0xMjUsMTQgKzEyNSw2IEBACiB7CiAJaW50IHJldDsKIAotCWlmIChzZXQtPmZtdCkgewotCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGRhaSwgc2V0LT5mbXQpOwotCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKLQkJCWRldl9lcnIoZGFpLT5kZXYsICJzaW1wbGUtY2FyZDogc2V0X2ZtdCBlcnJvclxuIik7Ci0JCQlnb3RvIGVycjsKLQkJfQotCX0KLQogCWlmIChzZXQtPnN5c2NsaykgewogCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGRhaSwgMCwgc2V0LT5zeXNjbGssIDApOwogCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKQEAgLTE3NiwxMSArMTY4LDExIEBACiAJCXJldHVybiByZXQ7CiAKIAlpZiAoZ3Bpb19pc192YWxpZChwcml2LT5ncGlvX2hwX2RldCkpIHsKLQkJc25kX3NvY19qYWNrX25ldyhjb2RlYy0+Y29kZWMsICJIZWFkcGhvbmVzIiwgU05EX0pBQ0tfSEVBRFBIT05FLAotCQkJCSAmc2ltcGxlX2NhcmRfaHBfamFjayk7Ci0JCXNuZF9zb2NfamFja19hZGRfcGlucygmc2ltcGxlX2NhcmRfaHBfamFjaywKLQkJCQkgICAgICBBUlJBWV9TSVpFKHNpbXBsZV9jYXJkX2hwX2phY2tfcGlucyksCi0JCQkJICAgICAgc2ltcGxlX2NhcmRfaHBfamFja19waW5zKTsKKwkJc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRwaG9uZXMiLAorCQkJCSAgICAgIFNORF9KQUNLX0hFQURQSE9ORSwKKwkJCQkgICAgICAmc2ltcGxlX2NhcmRfaHBfamFjaywKKwkJCQkgICAgICBzaW1wbGVfY2FyZF9ocF9qYWNrX3BpbnMsCisJCQkJICAgICAgQVJSQVlfU0laRShzaW1wbGVfY2FyZF9ocF9qYWNrX3BpbnMpKTsKIAogCQlzaW1wbGVfY2FyZF9ocF9qYWNrX2dwaW8uZ3BpbyA9IHByaXYtPmdwaW9faHBfZGV0OwogCQlzaW1wbGVfY2FyZF9ocF9qYWNrX2dwaW8uaW52ZXJ0ID0gcHJpdi0+Z3Bpb19ocF9kZXRfaW52ZXJ0OwpAQCAtMTg5LDExICsxODEsMTEgQEAKIAl9CiAKIAlpZiAoZ3Bpb19pc192YWxpZChwcml2LT5ncGlvX21pY19kZXQpKSB7Ci0JCXNuZF9zb2NfamFja19uZXcoY29kZWMtPmNvZGVjLCAiTWljIEphY2siLCBTTkRfSkFDS19NSUNST1BIT05FLAotCQkJCSAmc2ltcGxlX2NhcmRfbWljX2phY2spOwotCQlzbmRfc29jX2phY2tfYWRkX3BpbnMoJnNpbXBsZV9jYXJkX21pY19qYWNrLAotCQkJCSAgICAgIEFSUkFZX1NJWkUoc2ltcGxlX2NhcmRfbWljX2phY2tfcGlucyksCi0JCQkJICAgICAgc2ltcGxlX2NhcmRfbWljX2phY2tfcGlucyk7CisJCXNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJNaWMgSmFjayIsCisJCQkJICAgICAgU05EX0pBQ0tfTUlDUk9QSE9ORSwKKwkJCQkgICAgICAmc2ltcGxlX2NhcmRfbWljX2phY2ssCisJCQkJICAgICAgc2ltcGxlX2NhcmRfbWljX2phY2tfcGlucywKKwkJCQkgICAgICBBUlJBWV9TSVpFKHNpbXBsZV9jYXJkX21pY19qYWNrX3BpbnMpKTsKIAkJc2ltcGxlX2NhcmRfbWljX2phY2tfZ3Bpby5ncGlvID0gcHJpdi0+Z3Bpb19taWNfZGV0OwogCQlzaW1wbGVfY2FyZF9taWNfamFja19ncGlvLmludmVydCA9IHByaXYtPmdwaW9fbWljX2RldF9pbnZlcnQ7CiAJCXNuZF9zb2NfamFja19hZGRfZ3Bpb3MoJnNpbXBsZV9jYXJkX21pY19qYWNrLCAxLApAQCAtMjY5LDEyICsyNjEsMTAgQEAKIAkJCQkJIHN0cnVjdCBkZXZpY2Vfbm9kZSAqY29kZWMsCiAJCQkJCSBjaGFyICpwcmVmaXgsIGludCBpZHgpCiB7CisJc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rID0gc2ltcGxlX3ByaXZfdG9fbGluayhwcml2LCBpZHgpOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHNpbXBsZV9wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmJpdGNsa21hc3RlciA9IE5VTEw7CiAJc3RydWN0IGRldmljZV9ub2RlICpmcmFtZW1hc3RlciA9IE5VTEw7Ci0Jc3RydWN0IHNpbXBsZV9kYWlfcHJvcHMgKmRhaV9wcm9wcyA9IHNpbXBsZV9wcml2X3RvX3Byb3BzKHByaXYsIGlkeCk7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqY3B1X2RhaSA9ICZkYWlfcHJvcHMtPmNwdV9kYWk7Ci0Jc3RydWN0IGFzb2Nfc2ltcGxlX2RhaSAqY29kZWNfZGFpID0gJmRhaV9wcm9wcy0+Y29kZWNfZGFpOwogCXVuc2lnbmVkIGludCBkYWlmbXQ7CiAKIAlkYWlmbXQgPSBzbmRfc29jX29mX3BhcnNlX2RhaWZtdChub2RlLCBwcmVmaXgsCkBAIC0yODksOCArMjc5LDcgQEAKIAkJICovCiAJCWRldl9kYmcoZGV2LCAiUmV2ZXJ0IHRvIGxlZ2FjeSBkYWlmbXQgcGFyc2luZ1xuIik7CiAKLQkJY3B1X2RhaS0+Zm10ID0gY29kZWNfZGFpLT5mbXQgPQotCQkJc25kX3NvY19vZl9wYXJzZV9kYWlmbXQoY29kZWMsIE5VTEwsIE5VTEwsIE5VTEwpIHwKKwkJZGFpZm10ID0gc25kX3NvY19vZl9wYXJzZV9kYWlmbXQoY29kZWMsIE5VTEwsIE5VTEwsIE5VTEwpIHwKIAkJCShkYWlmbXQgJiB+U05EX1NPQ19EQUlGTVRfQ0xPQ0tfTUFTSyk7CiAJfSBlbHNlIHsKIAkJaWYgKGNvZGVjID09IGJpdGNsa21hc3RlcikKQEAgLTI5OSwxMSArMjg4LDEwIEBACiAJCWVsc2UKIAkJCWRhaWZtdCB8PSAoY29kZWMgPT0gZnJhbWVtYXN0ZXIpID8KIAkJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZNIDogU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzsKLQotCQljcHVfZGFpLT5mbXQJPSBkYWlmbXQ7Ci0JCWNvZGVjX2RhaS0+Zm10CT0gZGFpZm10OwogCX0KIAorCWRhaV9saW5rLT5kYWlfZm10ID0gZGFpZm10OworCiAJb2Zfbm9kZV9wdXQoYml0Y2xrbWFzdGVyKTsKIAlvZl9ub2RlX3B1dChmcmFtZW1hc3Rlcik7CiAKQEAgLTM4NCwxMyArMzcyLDEyIEBACiAJZGFpX2xpbmstPmluaXQgPSBhc29jX3NpbXBsZV9jYXJkX2RhaV9pbml0OwogCiAJZGV2X2RiZyhkZXYsICJcdG5hbWUgOiAlc1xuIiwgZGFpX2xpbmstPnN0cmVhbV9uYW1lKTsKLQlkZXZfZGJnKGRldiwgIlx0Y3B1IDogJXMgLyAlMDR4IC8gJWRcbiIsCisJZGV2X2RiZyhkZXYsICJcdGZvcm1hdCA6ICUwNHhcbiIsIGRhaV9saW5rLT5kYWlfZm10KTsKKwlkZXZfZGJnKGRldiwgIlx0Y3B1IDogJXMgLyAlZFxuIiwKIAkJZGFpX2xpbmstPmNwdV9kYWlfbmFtZSwKLQkJZGFpX3Byb3BzLT5jcHVfZGFpLmZtdCwKIAkJZGFpX3Byb3BzLT5jcHVfZGFpLnN5c2Nsayk7Ci0JZGV2X2RiZyhkZXYsICJcdGNvZGVjIDogJXMgLyAlMDR4IC8gJWRcbiIsCisJZGV2X2RiZyhkZXYsICJcdGNvZGVjIDogJXMgLyAlZFxuIiwKIAkJZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lLAotCQlkYWlfcHJvcHMtPmNvZGVjX2RhaS5mbXQsCiAJCWRhaV9wcm9wcy0+Y29kZWNfZGFpLnN5c2Nsayk7CiAKIAkvKgpAQCAtNTc3LDE0ICs1NjQsMTMgQEAKIAkJZGFpX2xpbmstPmNvZGVjX25hbWUJPSBjaW5mby0+Y29kZWM7CiAJCWRhaV9saW5rLT5jcHVfZGFpX25hbWUJPSBjaW5mby0+Y3B1X2RhaS5uYW1lOwogCQlkYWlfbGluay0+Y29kZWNfZGFpX25hbWUgPSBjaW5mby0+Y29kZWNfZGFpLm5hbWU7CisJCWRhaV9saW5rLT5kYWlfZm10CT0gY2luZm8tPmRhaWZtdDsKIAkJZGFpX2xpbmstPmluaXQJCT0gYXNvY19zaW1wbGVfY2FyZF9kYWlfaW5pdDsKIAkJbWVtY3B5KCZwcml2LT5kYWlfcHJvcHMtPmNwdV9kYWksICZjaW5mby0+Y3B1X2RhaSwKIAkJCQkJc2l6ZW9mKHByaXYtPmRhaV9wcm9wcy0+Y3B1X2RhaSkpOwogCQltZW1jcHkoJnByaXYtPmRhaV9wcm9wcy0+Y29kZWNfZGFpLCAmY2luZm8tPmNvZGVjX2RhaSwKIAkJCQkJc2l6ZW9mKHByaXYtPmRhaV9wcm9wcy0+Y29kZWNfZGFpKSk7CiAKLQkJcHJpdi0+ZGFpX3Byb3BzLT5jcHVfZGFpLmZtdAl8PSBjaW5mby0+ZGFpZm10OwotCQlwcml2LT5kYWlfcHJvcHMtPmNvZGVjX2RhaS5mbXQJfD0gY2luZm8tPmRhaWZtdDsKIAl9CiAKIAlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJnByaXYtPnNuZF9jYXJkLCBwcml2KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9NYWtlZmlsZSBiL3NvdW5kL3NvYy9pbnRlbC9NYWtlZmlsZQppbmRleCBhOGU1M2M0Li5jZDlhZWU5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2ludGVsL01ha2VmaWxlCkBAIC0xLDQyICsxLDEwIEBACiAjIENvcmUgc3VwcG9ydAotc25kLXNvYy1zc3QtZHNwLW9ianMgOj0gc3N0LWRzcC5vIHNzdC1maXJtd2FyZS5vCi1zbmQtc29jLXNzdC1hY3BpLW9ianMgOj0gc3N0LWFjcGkubwotCi1zbmQtc29jLXNzdC1tZmxkLXBsYXRmb3JtLW9ianMgOj0gc3N0LW1mbGQtcGxhdGZvcm0tcGNtLm8gXAotCXNzdC1tZmxkLXBsYXRmb3JtLWNvbXByZXNzLm8gc3N0LWF0b20tY29udHJvbHMubwotc25kLXNvYy1tZmxkLW1hY2hpbmUtb2JqcyA6PSBtZmxkX21hY2hpbmUubwotCi1vYmotJChDT05GSUdfU05EX1NTVF9NRkxEX1BMQVRGT1JNKSArPSBzbmQtc29jLXNzdC1tZmxkLXBsYXRmb3JtLm8KLW9iai0kKENPTkZJR19TTkRfTUZMRF9NQUNISU5FKSArPSBzbmQtc29jLW1mbGQtbWFjaGluZS5vCi0KLW9iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX1NTVCkgKz0gc25kLXNvYy1zc3QtZHNwLm8KLW9iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX1NTVF9BQ1BJKSArPSBzbmQtc29jLXNzdC1hY3BpLm8KK29iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX1NTVCkgKz0gY29tbW9uLwogCiAjIFBsYXRmb3JtIFN1cHBvcnQKLXNuZC1zb2Mtc3N0LWhhc3dlbGwtcGNtLW9ianMgOj0gXAotCXNzdC1oYXN3ZWxsLWlwYy5vIHNzdC1oYXN3ZWxsLXBjbS5vIHNzdC1oYXN3ZWxsLWRzcC5vCi1zbmQtc29jLXNzdC1iYXl0cmFpbC1wY20tb2JqcyA6PSBcCi0Jc3N0LWJheXRyYWlsLWlwYy5vIHNzdC1iYXl0cmFpbC1wY20ubyBzc3QtYmF5dHJhaWwtZHNwLm8KLQotb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfSEFTV0VMTCkgKz0gc25kLXNvYy1zc3QtaGFzd2VsbC1wY20ubwotb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQkFZVFJBSUwpICs9IHNuZC1zb2Mtc3N0LWJheXRyYWlsLXBjbS5vCitvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9IQVNXRUxMKSArPSBoYXN3ZWxsLworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQkFZVFJBSUwpICs9IGJheXRyYWlsLworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQkFZVFJBSUwpICs9IGF0b20vCiAKICMgTWFjaGluZSBzdXBwb3J0Ci1zbmQtc29jLXNzdC1oYXN3ZWxsLW9ianMgOj0gaGFzd2VsbC5vCi1zbmQtc29jLXNzdC1ieXQtcnQ1NjQwLW1hY2gtb2JqcyA6PSBieXQtcnQ1NjQwLm8KLXNuZC1zb2Mtc3N0LWJ5dC1tYXg5ODA5MC1tYWNoLW9ianMgOj0gYnl0LW1heDk4MDkwLm8KLXNuZC1zb2Mtc3N0LWJyb2Fkd2VsbC1vYmpzIDo9IGJyb2Fkd2VsbC5vCi1zbmQtc29jLXNzdC1ieXRjci1kcGNtLXJ0NTY0MC1vYmpzIDo9IGJ5dGNyX2RwY21fcnQ1NjQwLm8KLXNuZC1zb2Mtc3N0LWNodC1ic3ctcnQ1NjcyLW9ianMgOj0gY2h0X2Jzd19ydDU2NzIubwotc25kLXNvYy1zc3QtY2h0LWJzdy1ydDU2NDUtb2JqcyA6PSBjaHRfYnN3X3J0NTY0NS5vCi0KLW9iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0hBU1dFTExfTUFDSCkgKz0gc25kLXNvYy1zc3QtaGFzd2VsbC5vCi1vYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9CWVRfUlQ1NjQwX01BQ0gpICs9IHNuZC1zb2Mtc3N0LWJ5dC1ydDU2NDAtbWFjaC5vCi1vYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9CWVRfTUFYOTgwOTBfTUFDSCkgKz0gc25kLXNvYy1zc3QtYnl0LW1heDk4MDkwLW1hY2gubwotb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQlJPQURXRUxMX01BQ0gpICs9IHNuZC1zb2Mtc3N0LWJyb2Fkd2VsbC5vCi1vYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9CWVRDUl9SVDU2NDBfTUFDSCkgKz0gc25kLXNvYy1zc3QtYnl0Y3ItZHBjbS1ydDU2NDAubwotb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQ0hUX0JTV19SVDU2NzJfTUFDSCkgKz0gc25kLXNvYy1zc3QtY2h0LWJzdy1ydDU2NzIubwotb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQ0hUX0JTV19SVDU2NDVfTUFDSCkgKz0gc25kLXNvYy1zc3QtY2h0LWJzdy1ydDU2NDUubwotCi0jIERTUCBkcml2ZXIKLW9iai0kKENPTkZJR19TTkRfU1NUX0lQQykgKz0gc3N0Lworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfU1NUKSArPSBib2FyZHMvCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9NYWtlZmlsZSBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODA3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKK3NuZC1zb2Mtc3N0LW1mbGQtcGxhdGZvcm0tb2JqcyA6PSBzc3QtbWZsZC1wbGF0Zm9ybS1wY20ubyBcCisJICAgICAgICBzc3QtbWZsZC1wbGF0Zm9ybS1jb21wcmVzcy5vIHNzdC1hdG9tLWNvbnRyb2xzLm8KKworb2JqLSQoQ09ORklHX1NORF9TU1RfTUZMRF9QTEFURk9STSkgKz0gc25kLXNvYy1zc3QtbWZsZC1wbGF0Zm9ybS5vCisKKyMgRFNQIGRyaXZlcgorb2JqLSQoQ09ORklHX1NORF9TU1RfSVBDKSArPSBzc3QvCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWF0b20tY29udHJvbHMuYyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9pbnRlbC9zc3QtYXRvbS1jb250cm9scy5jCnJlbmFtZSB0byBzb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtYXRvbS1jb250cm9scy5jCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWF0b20tY29udHJvbHMuaCBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNvdW5kL3NvYy9pbnRlbC9zc3QtYXRvbS1jb250cm9scy5oCnJlbmFtZSB0byBzb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtYXRvbS1jb250cm9scy5oCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LW1mbGQtZHNwLmggYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtbWZsZC1kc3AuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc291bmQvc29jL2ludGVsL3NzdC1tZmxkLWRzcC5oCnJlbmFtZSB0byBzb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtbWZsZC1kc3AuaApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLXBsYXRmb3JtLWNvbXByZXNzLmMgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtbWZsZC1wbGF0Zm9ybS1jb21wcmVzcy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvaW50ZWwvc3N0LW1mbGQtcGxhdGZvcm0tY29tcHJlc3MuYwpyZW5hbWUgdG8gc291bmQvc29jL2ludGVsL2F0b20vc3N0LW1mbGQtcGxhdGZvcm0tY29tcHJlc3MuYwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0LW1mbGQtcGxhdGZvcm0tcGNtLmMgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QtbWZsZC1wbGF0Zm9ybS1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmJhZjJjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0LW1mbGQtcGxhdGZvcm0tcGNtLmMKQEAgLTAsMCArMSw4MDQgQEAKKy8qCisgKiAgc3N0X21mbGRfcGxhdGZvcm0uYyAtIEludGVsIE1JRCBQbGF0Zm9ybSBkcml2ZXIKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgSW50ZWwgQ29ycAorICogIEF1dGhvcjogVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+CisgKiAgQXV0aG9yOiBIYXJzaGEgUHJpeWEgPHByaXlhLmhhcnNoYUBpbnRlbC5jb20+CisgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybV9zc3RfYXVkaW8uaD4KKyNpbmNsdWRlICJzc3QtbWZsZC1wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInNzdC1hdG9tLWNvbnRyb2xzLmgiCisKK3N0cnVjdCBzc3RfZGV2aWNlICpzc3Q7CitzdGF0aWMgREVGSU5FX01VVEVYKHNzdF9sb2NrKTsKK2V4dGVybiBzdHJ1Y3Qgc25kX2NvbXByX29wcyBzc3RfcGxhdGZvcm1fY29tcHJfb3BzOworCitpbnQgc3N0X3JlZ2lzdGVyX2RzcChzdHJ1Y3Qgc3N0X2RldmljZSAqZGV2KQoreworCWlmIChXQVJOX09OKCFkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRldi0+ZGV2LT5kcml2ZXItPm93bmVyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJbXV0ZXhfbG9jaygmc3N0X2xvY2spOworCWlmIChzc3QpIHsKKwkJZGV2X2VycihkZXYtPmRldiwgIndlIGFscmVhZHkgaGF2ZSBhIGRldmljZSAlc1xuIiwgc3N0LT5uYW1lKTsKKwkJbW9kdWxlX3B1dChkZXYtPmRldi0+ZHJpdmVyLT5vd25lcik7CisJCW11dGV4X3VubG9jaygmc3N0X2xvY2spOworCQlyZXR1cm4gLUVFWElTVDsKKwl9CisJZGV2X2RiZyhkZXYtPmRldiwgInJlZ2lzdGVyaW5nIGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKKwlzc3QgPSBkZXY7CisJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfcmVnaXN0ZXJfZHNwKTsKKworaW50IHNzdF91bnJlZ2lzdGVyX2RzcChzdHJ1Y3Qgc3N0X2RldmljZSAqZGV2KQoreworCWlmIChXQVJOX09OKCFkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZGV2ICE9IHNzdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZzc3RfbG9jayk7CisKKwlpZiAoIXNzdCkgeworCQltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbW9kdWxlX3B1dChzc3QtPmRldi0+ZHJpdmVyLT5vd25lcik7CisJZGV2X2RiZyhkZXYtPmRldiwgInVucmVnICVzXG4iLCBzc3QtPm5hbWUpOworCXNzdCA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfdW5yZWdpc3Rlcl9kc3ApOworCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc3N0X3BsYXRmb3JtX3BjbV9odyA9IHsKKwkuaW5mbyA9CShTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8CisJCQlTTkRSVl9QQ01fSU5GT19ET1VCTEUgfAorCQkJU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJU05EUlZfUENNX0lORk9fUkVTVU1FIHwKKwkJCVNORFJWX1BDTV9JTkZPX01NQVB8CisJCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKKwkJCVNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKKwkJCVNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAorCS5idWZmZXJfYnl0ZXNfbWF4ID0gU1NUX01BWF9CVUZGRVIsCisJLnBlcmlvZF9ieXRlc19taW4gPSBTU1RfTUlOX1BFUklPRF9CWVRFUywKKwkucGVyaW9kX2J5dGVzX21heCA9IFNTVF9NQVhfUEVSSU9EX0JZVEVTLAorCS5wZXJpb2RzX21pbiA9IFNTVF9NSU5fUEVSSU9EUywKKwkucGVyaW9kc19tYXggPSBTU1RfTUFYX1BFUklPRFMsCisJLmZpZm9fc2l6ZSA9IFNTVF9GSUZPX1NJWkUsCit9OworCitzdGF0aWMgc3RydWN0IHNzdF9kZXZfc3RyZWFtX21hcCBkcGNtX3N0cm1fbWFwW10gPSB7CisJezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9LCAvKiBSZXNlcnZlZCwgbm90IGluIHVzZSAqLworCXtNRVJSX0RQQ01fQVVESU8sIDAsIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssIFBJUEVfTUVESUExX0lOLCBTU1RfVEFTS19JRF9NRURJQSwgMH0sCisJe01FUlJfRFBDTV9DT01QUiwgMCwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgUElQRV9NRURJQTBfSU4sIFNTVF9UQVNLX0lEX01FRElBLCAwfSwKKwl7TUVSUl9EUENNX0FVRElPLCAwLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsIFBJUEVfUENNMV9PVVQsIFNTVF9UQVNLX0lEX01FRElBLCAwfSwKK307CisKK3N0YXRpYyBpbnQgc3N0X21lZGlhX2RpZ2l0YWxfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUsIGludCBzdHJlYW0pCit7CisKKwlyZXR1cm4gc3N0X3NlbmRfcGlwZV9nYWlucyhkYWksIHN0cmVhbSwgbXV0ZSk7Cit9CisKKy8qIGhlbHBlciBmdW5jdGlvbnMgKi8KK3ZvaWQgc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSwKKwkJCQkJaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0cmVhbS0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKKwlzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBzdGF0ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdHJlYW0tPnN0YXR1c19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0pCit7CisJaW50IHN0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RyZWFtLT5zdGF0dXNfbG9jaywgZmxhZ3MpOworCXN0YXRlID0gc3RyZWFtLT5zdHJlYW1fc3RhdHVzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0cmVhbS0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gc3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9maWxsX2FsbG9jX3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3NzdF9hbGxvY19wYXJhbXNfZXh0ICphbGxvY19wYXJhbSkKK3sKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbHM7CisJc25kX3BjbV91ZnJhbWVzX3QgcGVyaW9kX3NpemU7CisJc3NpemVfdCBwZXJpb2RieXRlczsKKwlzc2l6ZV90IGJ1ZmZlcl9ieXRlcyA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOworCXUzMiBidWZmZXJfYWRkciA9IHZpcnRfdG9fcGh5cyhzdWJzdHJlYW0tPmRtYV9idWZmZXIuYXJlYSk7CisKKwljaGFubmVscyA9IHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisJcGVyaW9kX3NpemUgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplOworCXBlcmlvZGJ5dGVzID0gc2FtcGxlc190b19ieXRlcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHBlcmlvZF9zaXplKTsKKwlhbGxvY19wYXJhbS0+cmluZ19idWZfaW5mb1swXS5hZGRyID0gYnVmZmVyX2FkZHI7CisJYWxsb2NfcGFyYW0tPnJpbmdfYnVmX2luZm9bMF0uc2l6ZSA9IGJ1ZmZlcl9ieXRlczsKKwlhbGxvY19wYXJhbS0+c2dfY291bnQgPSAxOworCWFsbG9jX3BhcmFtLT5yZXNlcnZlZCA9IDA7CisJYWxsb2NfcGFyYW0tPmZyYWdfc2l6ZSA9IHBlcmlvZGJ5dGVzICogY2hhbm5lbHM7CisKK30KK3N0YXRpYyB2b2lkIHNzdF9maWxsX3BjbV9wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJc3RydWN0IHNuZF9zc3Rfc3RyZWFtX3BhcmFtcyAqcGFyYW0pCit7CisJcGFyYW0tPnVjLnBjbV9wYXJhbXMubnVtX2NoYW4gPSAodTgpIHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisJcGFyYW0tPnVjLnBjbV9wYXJhbXMucGNtX3dkX3N6ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5zYW1wbGVfYml0czsKKwlwYXJhbS0+dWMucGNtX3BhcmFtcy5zZnJlcSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZTsKKworCS8qIFBDTSBzdHJlYW0gdmlhIEFMU0EgaW50ZXJmYWNlICovCisJcGFyYW0tPnVjLnBjbV9wYXJhbXMudXNlX29mZmxvYWRfcGF0aCA9IDA7CisJcGFyYW0tPnVjLnBjbV9wYXJhbXMucmVzZXJ2ZWQyID0gMDsKKwltZW1zZXQocGFyYW0tPnVjLnBjbV9wYXJhbXMuY2hhbm5lbF9tYXAsIDAsIHNpemVvZih1OCkpOworCit9CisKK3N0YXRpYyBpbnQgc3N0X2dldF9zdHJlYW1fbWFwcGluZyhpbnQgZGV2LCBpbnQgc2RldiwgaW50IGRpciwKKwlzdHJ1Y3Qgc3N0X2Rldl9zdHJlYW1fbWFwICptYXAsIGludCBzaXplKQoreworCWludCBpOworCisJaWYgKG1hcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCisJLyogaW5kZXggMCBpcyBub3QgdXNlZCBpbiBzdHJlYW0gbWFwICovCisJZm9yIChpID0gMTsgaSA8IHNpemU7IGkrKykgeworCQlpZiAoKG1hcFtpXS5kZXZfbnVtID09IGRldikgJiYgKG1hcFtpXS5kaXJlY3Rpb24gPT0gZGlyKSkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9maWxsX3N0cmVhbV9wYXJhbXModm9pZCAqc3Vic3RyZWFtLAorCWNvbnN0IHN0cnVjdCBzc3RfZGF0YSAqY3R4LCBzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbXMsIGJvb2wgaXNfY29tcHJlc3MpCit7CisJaW50IG1hcF9zaXplOworCWludCBpbmRleDsKKwlzdHJ1Y3Qgc3N0X2Rldl9zdHJlYW1fbWFwICptYXA7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwc3RyZWFtID0gTlVMTDsKKwlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSA9IE5VTEw7CisKKwltYXAgPSBjdHgtPnBkYXRhLT5wZGV2X3N0cm1fbWFwOworCW1hcF9zaXplID0gY3R4LT5wZGF0YS0+c3RybV9tYXBfc2l6ZTsKKworCWlmIChpc19jb21wcmVzcyA9PSB0cnVlKQorCQljc3RyZWFtID0gKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICopc3Vic3RyZWFtOworCWVsc2UKKwkJcHN0cmVhbSA9IChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKilzdWJzdHJlYW07CisKKwlzdHJfcGFyYW1zLT5zdHJlYW1fdHlwZSA9IFNTVF9TVFJFQU1fVFlQRV9NVVNJQzsKKworCS8qIEZvciBwY20gc3RyZWFtcyAqLworCWlmIChwc3RyZWFtKSB7CisJCWluZGV4ID0gc3N0X2dldF9zdHJlYW1fbWFwcGluZyhwc3RyZWFtLT5wY20tPmRldmljZSwKKwkJCQkJICBwc3RyZWFtLT5udW1iZXIsIHBzdHJlYW0tPnN0cmVhbSwKKwkJCQkJICBtYXAsIG1hcF9zaXplKTsKKwkJaWYgKGluZGV4IDw9IDApCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzdHJfcGFyYW1zLT5zdHJlYW1faWQgPSBpbmRleDsKKwkJc3RyX3BhcmFtcy0+ZGV2aWNlX3R5cGUgPSBtYXBbaW5kZXhdLmRldmljZV9pZDsKKwkJc3RyX3BhcmFtcy0+dGFzayA9IG1hcFtpbmRleF0udGFza19pZDsKKworCQlzdHJfcGFyYW1zLT5vcHMgPSAodTgpcHN0cmVhbS0+c3RyZWFtOworCX0KKworCWlmIChjc3RyZWFtKSB7CisJCWluZGV4ID0gc3N0X2dldF9zdHJlYW1fbWFwcGluZyhjc3RyZWFtLT5kZXZpY2UtPmRldmljZSwKKwkJCQkJICAgICAgIDAsIGNzdHJlYW0tPmRpcmVjdGlvbiwKKwkJCQkJICAgICAgIG1hcCwgbWFwX3NpemUpOworCQlpZiAoaW5kZXggPD0gMCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzdHJfcGFyYW1zLT5zdHJlYW1faWQgPSBpbmRleDsKKwkJc3RyX3BhcmFtcy0+ZGV2aWNlX3R5cGUgPSBtYXBbaW5kZXhdLmRldmljZV9pZDsKKwkJc3RyX3BhcmFtcy0+dGFzayA9IG1hcFtpbmRleF0udGFza19pZDsKKworCQlzdHJfcGFyYW1zLT5vcHMgPSAodTgpY3N0cmVhbS0+ZGlyZWN0aW9uOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fYWxsb2Nfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gPQorCQkJc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zc3Rfc3RyZWFtX3BhcmFtcyBwYXJhbSA9IHt7ezAsfSx9LH07CisJc3RydWN0IHNuZF9zc3RfcGFyYW1zIHN0cl9wYXJhbXMgPSB7MH07CisJc3RydWN0IHNuZF9zc3RfYWxsb2NfcGFyYW1zX2V4dCBhbGxvY19wYXJhbXMgPSB7MH07CisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCBzc3RfZGF0YSAqY3R4ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKworCS8qIHNldCBjb2RlYyBwYXJhbXMgYW5kIGluZm9ybSBTU1QgZHJpdmVyIHRoZSBzYW1lICovCisJc3N0X2ZpbGxfcGNtX3BhcmFtcyhzdWJzdHJlYW0sICZwYXJhbSk7CisJc3N0X2ZpbGxfYWxsb2NfcGFyYW1zKHN1YnN0cmVhbSwgJmFsbG9jX3BhcmFtcyk7CisJc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhOworCXN0cl9wYXJhbXMuc3BhcmFtcyA9IHBhcmFtOworCXN0cl9wYXJhbXMuYXBhcmFtcyA9IGFsbG9jX3BhcmFtczsKKwlzdHJfcGFyYW1zLmNvZGVjID0gU1NUX0NPREVDX1RZUEVfUENNOworCisJLyogZmlsbCB0aGUgZGV2aWNlIHR5cGUgYW5kIHN0cmVhbSBpZCB0byBwYXNzIHRvIFNTVCBkcml2ZXIgKi8KKwlyZXRfdmFsID0gc3N0X2ZpbGxfc3RyZWFtX3BhcmFtcyhzdWJzdHJlYW0sIGN0eCwgJnN0cl9wYXJhbXMsIGZhbHNlKTsKKwlpZiAocmV0X3ZhbCA8IDApCisJCXJldHVybiByZXRfdmFsOworCisJc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQgPSBzdHJfcGFyYW1zLnN0cmVhbV9pZDsKKworCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+b3Blbihzc3QtPmRldiwgJnN0cl9wYXJhbXMpOworCWlmIChyZXRfdmFsIDw9IDApCisJCXJldHVybiByZXRfdmFsOworCisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIHZvaWQgc3N0X3BlcmlvZF9lbGFwc2VkKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGFyZzsKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07CisJaW50IHN0YXR1czsKKworCWlmICghc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnJ1bnRpbWUpCisJCXJldHVybjsKKwlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlpZiAoIXN0cmVhbSkKKwkJcmV0dXJuOworCXN0YXR1cyA9IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0pOworCWlmIChzdGF0dXMgIT0gU1NUX1BMQVRGT1JNX1JVTk5JTkcpCisJCXJldHVybjsKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2luaXRfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSA9CisJCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJaW50IHJldF92YWw7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAic2V0dGluZyBidWZmZXIgcHRyIHBhcmFtXG4iKTsKKwlzc3Rfc2V0X3N0cmVhbV9zdGF0dXMoc3RyZWFtLCBTU1RfUExBVEZPUk1fSU5JVCk7CisJc3RyZWFtLT5zdHJlYW1faW5mby5wZXJpb2RfZWxhcHNlZCA9IHNzdF9wZXJpb2RfZWxhcHNlZDsKKwlzdHJlYW0tPnN0cmVhbV9pbmZvLmFyZyA9IHN1YnN0cmVhbTsKKwlzdHJlYW0tPnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHIgPSAwOworCXN0cmVhbS0+c3RyZWFtX2luZm8uc2ZyZXEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGU7CisJcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5zdHJlYW1faW5pdChzc3QtPmRldiwgJnN0cmVhbS0+c3RyZWFtX2luZm8pOworCWlmIChyZXRfdmFsKQorCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY29udHJvbF9zZXQgcmV0IGVycm9yICVkXG4iLCByZXRfdmFsKTsKKwlyZXR1cm4gcmV0X3ZhbDsKKworfQorCitzdGF0aWMgaW50IHBvd2VyX3VwX3NzdChzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0pCit7CisJcmV0dXJuIHN0cmVhbS0+b3BzLT5wb3dlcihzc3QtPmRldiwgdHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBvd2VyX2Rvd25fc3N0KHN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSkKK3sKKwlzdHJlYW0tPm9wcy0+cG93ZXIoc3N0LT5kZXYsIGZhbHNlKTsKK30KKworc3RhdGljIGludCBzc3RfbWVkaWFfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCisJc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOworCWlmICghc3RyZWFtKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzcGluX2xvY2tfaW5pdCgmc3RyZWFtLT5zdGF0dXNfbG9jayk7CisKKwkvKiBnZXQgdGhlIHNzdCBvcHMgKi8KKwltdXRleF9sb2NrKCZzc3RfbG9jayk7CisJaWYgKCFzc3QgfHwKKwkgICAgIXRyeV9tb2R1bGVfZ2V0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKSkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAibm8gZGV2aWNlIGF2YWlsYWJsZSB0byBydW5cbiIpOworCQlyZXRfdmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXRfb3BzOworCX0KKwlzdHJlYW0tPm9wcyA9IHNzdC0+b3BzOworCW11dGV4X3VubG9jaygmc3N0X2xvY2spOworCisJc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQgPSAwOworCisJc3RyZWFtLT5zdHJlYW1faW5mby5hcmcgPSBzdWJzdHJlYW07CisJLyogYWxsb2NhdGUgbWVtb3J5IGZvciBTU1QgQVBJIHNldCAqLworCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHN0cmVhbTsKKworCXJldF92YWwgPSBwb3dlcl91cF9zc3Qoc3RyZWFtKTsKKwlpZiAocmV0X3ZhbCA8IDApCisJCXJldHVybiByZXRfdmFsOworCisJLyogTWFrZSBzdXJlLCB0aGF0IHRoZSBwZXJpb2Qgc2l6ZSBpcyBhbHdheXMgZXZlbiAqLworCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTLCAyKTsKKworCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAorCQkJIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKK291dF9vcHM6CisJa2ZyZWUoc3RyZWFtKTsKKwltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIHZvaWQgc3N0X21lZGlhX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07CisJaW50IHJldF92YWwgPSAwLCBzdHJfaWQ7CisKKwlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlwb3dlcl9kb3duX3NzdChzdHJlYW0pOworCisJc3RyX2lkID0gc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQ7CisJaWYgKHN0cl9pZCkKKwkJcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5jbG9zZShzc3QtPmRldiwgc3RyX2lkKTsKKwltb2R1bGVfcHV0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKTsKKwlrZnJlZShzdHJlYW0pOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfY3VycmVudF9waXBlX2lkKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAorCQkJCQkgICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNzdF9kYXRhICpzc3QgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCXN0cnVjdCBzc3RfZGV2X3N0cmVhbV9tYXAgKm1hcCA9IHNzdC0+cGRhdGEtPnBkZXZfc3RybV9tYXA7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtID0KKwkJCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOworCXUzMiBzdHJfaWQgPSBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZDsKKwl1bnNpZ25lZCBpbnQgcGlwZV9pZDsKKworCXBpcGVfaWQgPSBtYXBbc3RyX2lkXS5kZXZpY2VfaWQ7CisKKwlkZXZfZGJnKGRhaS0+ZGV2LCAiZ290IHBpcGVfaWQgPSAlI3ggZm9yIHN0cl9pZCA9ICVkXG4iLAorCQkJcGlwZV9pZCwgc3RyX2lkKTsKKwlyZXR1cm4gcGlwZV9pZDsKK30KKworc3RhdGljIGludCBzc3RfbWVkaWFfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOworCWludCByZXRfdmFsID0gMCwgc3RyX2lkOworCisJc3RyZWFtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7CisJc3RyX2lkID0gc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQ7CisJaWYgKHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKSB7CisJCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+c3RyZWFtX2Ryb3Aoc3N0LT5kZXYsIHN0cl9pZCk7CisJCXJldHVybiByZXRfdmFsOworCX0KKworCXJldF92YWwgPSBzc3RfcGxhdGZvcm1fYWxsb2Nfc3RyZWFtKHN1YnN0cmVhbSwgZGFpKTsKKwlpZiAocmV0X3ZhbCA8PSAwKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlzbnByaW50ZihzdWJzdHJlYW0tPnBjbS0+aWQsIHNpemVvZihzdWJzdHJlYW0tPnBjbS0+aWQpLAorCQkJIiVkIiwgc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOworCisJcmV0X3ZhbCA9IHNzdF9wbGF0Zm9ybV9pbml0X3N0cmVhbShzdWJzdHJlYW0pOworCWlmIChyZXRfdmFsKQorCQlyZXR1cm4gcmV0X3ZhbDsKKwlzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmluZm8gPSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUjsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIGludCBzc3RfbWVkaWFfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAorCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7CisJbWVtc2V0KHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEsIDAsIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X21lZGlhX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2VuYWJsZV9zc3Aoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghZGFpLT5hY3RpdmUpIHsKKwkJcmV0ID0gc3N0X2hhbmRsZV92Yl90aW1lcihkYWksIHRydWUpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJcmV0ID0gc2VuZF9zc3BfY21kKGRhaSwgZGFpLT5uYW1lLCAxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc3N0X2Rpc2FibGVfc3NwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJaWYgKCFkYWktPmFjdGl2ZSkgeworCQlzZW5kX3NzcF9jbWQoZGFpLCBkYWktPm5hbWUsIDApOworCQlzc3RfaGFuZGxlX3ZiX3RpbWVyKGRhaSwgZmFsc2UpOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgc3N0X21lZGlhX2RhaV9vcHMgPSB7CisJLnN0YXJ0dXAgPSBzc3RfbWVkaWFfb3BlbiwKKwkuc2h1dGRvd24gPSBzc3RfbWVkaWFfY2xvc2UsCisJLnByZXBhcmUgPSBzc3RfbWVkaWFfcHJlcGFyZSwKKwkuaHdfcGFyYW1zID0gc3N0X21lZGlhX2h3X3BhcmFtcywKKwkuaHdfZnJlZSA9IHNzdF9tZWRpYV9od19mcmVlLAorCS5tdXRlX3N0cmVhbSA9IHNzdF9tZWRpYV9kaWdpdGFsX211dGUsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBzc3RfY29tcHJfZGFpX29wcyA9IHsKKwkubXV0ZV9zdHJlYW0gPSBzc3RfbWVkaWFfZGlnaXRhbF9tdXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgc3N0X2JlX2RhaV9vcHMgPSB7CisJLnN0YXJ0dXAgPSBzc3RfZW5hYmxlX3NzcCwKKwkuc2h1dGRvd24gPSBzc3RfZGlzYWJsZV9zc3AsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzc3RfcGxhdGZvcm1fZGFpW10gPSB7Cit7CisJLm5hbWUgPSAibWVkaWEtY3B1LWRhaSIsCisJLm9wcyA9ICZzc3RfbWVkaWFfZGFpX29wcywKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJIZWFkc2V0IFBsYXliYWNrIiwKKwkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCisJCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80NDEwMHxTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwl9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAiSGVhZHNldCBDYXB0dXJlIiwKKwkJLmNoYW5uZWxzX21pbiA9IDEsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80NDEwMHxTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwl9LAorfSwKK3sKKwkubmFtZSA9ICJjb21wcmVzcy1jcHUtZGFpIiwKKwkuY29tcHJlc3NfZGFpID0gMSwKKwkub3BzID0gJnNzdF9jb21wcl9kYWlfb3BzLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzIFBsYXliYWNrIiwKKwkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCisJCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwl9LAorfSwKKy8qIEJFIENQVSAgRGFpcyAqLworeworCS5uYW1lID0gInNzcDAtcG9ydCIsCisJLm9wcyA9ICZzc3RfYmVfZGFpX29wcywKKwkucGxheWJhY2sgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJzc3AwIFR4IiwKKwkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCisJCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwl9LAorCS5jYXB0dXJlID0geworCQkuc3RyZWFtX25hbWUgPSAic3NwMCBSeCIsCisJCS5jaGFubmVsc19taW4gPSBTU1RfU1RFUkVPLAorCQkuY2hhbm5lbHNfbWF4ID0gU1NUX1NURVJFTywKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJfSwKK30sCit7CisJLm5hbWUgPSAic3NwMS1wb3J0IiwKKwkub3BzID0gJnNzdF9iZV9kYWlfb3BzLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gInNzcDEgVHgiLAorCQkuY2hhbm5lbHNfbWluID0gU1NUX1NURVJFTywKKwkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDB8U05EUlZfUENNX1JBVEVfMTYwMDB8U05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJfSwKKwkuY2FwdHVyZSA9IHsKKwkJLnN0cmVhbV9uYW1lID0gInNzcDEgUngiLAorCQkuY2hhbm5lbHNfbWluID0gU1NUX1NURVJFTywKKwkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDB8U05EUlZfUENNX1JBVEVfMTYwMDB8U05EUlZfUENNX1JBVEVfNDgwMDAsCisJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJfSwKK30sCit7CisJLm5hbWUgPSAic3NwMi1wb3J0IiwKKwkub3BzID0gJnNzdF9iZV9kYWlfb3BzLAorCS5wbGF5YmFjayA9IHsKKwkJLnN0cmVhbV9uYW1lID0gInNzcDIgVHgiLAorCQkuY2hhbm5lbHNfbWluID0gU1NUX1NURVJFTywKKwkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCisJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCX0sCisJLmNhcHR1cmUgPSB7CisJCS5zdHJlYW1fbmFtZSA9ICJzc3AyIFJ4IiwKKwkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCisJCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwl9LAorfSwKK307CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKKworCWlmIChzdWJzdHJlYW0tPnBjbS0+aW50ZXJuYWwpCisJCXJldHVybiAwOworCisJcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlydW50aW1lLT5odyA9IHNzdF9wbGF0Zm9ybV9wY21faHc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJCQlpbnQgY21kKQoreworCWludCByZXRfdmFsID0gMCwgc3RyX2lkOworCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKworCWRldl9kYmcocnRkLT5kZXYsICJzc3RfcGxhdGZvcm1fcGNtX3RyaWdnZXIgY2FsbGVkXG4iKTsKKwlpZiAoc3Vic3RyZWFtLT5wY20tPmludGVybmFsKQorCQlyZXR1cm4gMDsKKwlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdHJfaWQgPSBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJCWRldl9kYmcocnRkLT5kZXYsICJzc3Q6IFRyaWdnZXIgU3RhcnRcbiIpOworCQlzdGF0dXMgPSBTU1RfUExBVEZPUk1fUlVOTklORzsKKwkJc3RyZWFtLT5zdHJlYW1faW5mby5hcmcgPSBzdWJzdHJlYW07CisJCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+c3RyZWFtX3N0YXJ0KHNzdC0+ZGV2LCBzdHJfaWQpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCWRldl9kYmcocnRkLT5kZXYsICJzc3Q6IGluIHN0b3BcbiIpOworCQlzdGF0dXMgPSBTU1RfUExBVEZPUk1fRFJPUFBFRDsKKwkJcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5zdHJlYW1fZHJvcChzc3QtPmRldiwgc3RyX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwkJZGV2X2RiZyhydGQtPmRldiwgInNzdDogaW4gcGF1c2VcbiIpOworCQlzdGF0dXMgPSBTU1RfUExBVEZPUk1fUEFVU0VEOworCQlyZXRfdmFsID0gc3RyZWFtLT5vcHMtPnN0cmVhbV9wYXVzZShzc3QtPmRldiwgc3RyX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAic3N0OiBpbiBwYXVzZSByZWxlYXNlXG4iKTsKKwkJc3RhdHVzID0gU1NUX1BMQVRGT1JNX1JVTk5JTkc7CisJCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+c3RyZWFtX3BhdXNlX3JlbGVhc2Uoc3N0LT5kZXYsIHN0cl9pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcmV0X3ZhbCkKKwkJc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cmVhbSwgc3RhdHVzKTsKKworCXJldHVybiByZXRfdmFsOworfQorCisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBzc3RfcGxhdGZvcm1fcGNtX3BvaW50ZXIKKwkJCShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07CisJaW50IHJldF92YWwsIHN0YXR1czsKKwlzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICpzdHJfaW5mbzsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisKKwlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKKwlzdGF0dXMgPSBzc3RfZ2V0X3N0cmVhbV9zdGF0dXMoc3RyZWFtKTsKKwlpZiAoc3RhdHVzID09IFNTVF9QTEFURk9STV9JTklUKQorCQlyZXR1cm4gMDsKKwlzdHJfaW5mbyA9ICZzdHJlYW0tPnN0cmVhbV9pbmZvOworCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+c3RyZWFtX3JlYWRfdHN0YW1wKHNzdC0+ZGV2LCBzdHJfaW5mbyk7CisJaWYgKHJldF92YWwpIHsKKwkJZGV2X2VycihydGQtPmRldiwgInNzdDogZXJyb3IgY29kZSA9ICVkXG4iLCByZXRfdmFsKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCXN1YnN0cmVhbS0+cnVudGltZS0+ZGVsYXkgPSBzdHJfaW5mby0+cGNtX2RlbGF5OworCXJldHVybiBzdHJfaW5mby0+YnVmZmVyX3B0cjsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzc3RfcGxhdGZvcm1fb3BzID0geworCS5vcGVuID0gc3N0X3BsYXRmb3JtX29wZW4sCisJLmlvY3RsID0gc25kX3BjbV9saWJfaW9jdGwsCisJLnRyaWdnZXIgPSBzc3RfcGxhdGZvcm1fcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIgPSBzc3RfcGxhdGZvcm1fcGNtX3BvaW50ZXIsCit9OworCitzdGF0aWMgaW50IHNzdF9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBydGQtPmNwdV9kYWk7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCWludCByZXR2YWwgPSAwOworCisJaWYgKGRhaS0+ZHJpdmVyLT5wbGF5YmFjay5jaGFubmVsc19taW4gfHwKKwkJCWRhaS0+ZHJpdmVyLT5jYXB0dXJlLmNoYW5uZWxzX21pbikgeworCQlyZXR2YWwgPSAgc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sCisJCQlTTkRSVl9ETUFfVFlQRV9DT05USU5VT1VTLAorCQkJc25kX2RtYV9jb250aW51b3VzX2RhdGEoR0ZQX0RNQSksCisJCQlTU1RfTUlOX0JVRkZFUiwgU1NUX01BWF9CVUZGRVIpOworCQlpZiAocmV0dmFsKSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uZiBmYWlsXG4iKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBzc3Rfc29jX3Byb2JlKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSkKK3sKKwlzdHJ1Y3Qgc3N0X2RhdGEgKmRydiA9IGRldl9nZXRfZHJ2ZGF0YShwbGF0Zm9ybS0+ZGV2KTsKKworCWRydi0+c29jX2NhcmQgPSBwbGF0Zm9ybS0+Y29tcG9uZW50LmNhcmQ7CisJcmV0dXJuIHNzdF9kc3BfaW5pdF92Ml9kcGNtKHBsYXRmb3JtKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBzc3Rfc29jX3BsYXRmb3JtX2RydiAgPSB7CisJLnByb2JlCQk9IHNzdF9zb2NfcHJvYmUsCisJLm9wcwkJPSAmc3N0X3BsYXRmb3JtX29wcywKKwkuY29tcHJfb3BzCT0gJnNzdF9wbGF0Zm9ybV9jb21wcl9vcHMsCisJLnBjbV9uZXcJPSBzc3RfcGNtX25ldywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIHNzdF9jb21wb25lbnQgPSB7CisJLm5hbWUJCT0gInNzdCIsCit9OworCisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNzdF9kYXRhICpkcnY7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc3N0X3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCisJZHJ2ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHJ2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRydiA9PSBOVUxMKSB7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqcGRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAocGRhdGEgPT0gTlVMTCkgeworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwZGF0YS0+cGRldl9zdHJtX21hcCA9IGRwY21fc3RybV9tYXA7CisJcGRhdGEtPnN0cm1fbWFwX3NpemUgPSBBUlJBWV9TSVpFKGRwY21fc3RybV9tYXApOworCWRydi0+cGRhdGEgPSBwZGF0YTsKKwlkcnYtPnBkZXYgPSBwZGV2OworCW11dGV4X2luaXQoJmRydi0+bG9jayk7CisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRydik7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsICZzc3Rfc29jX3BsYXRmb3JtX2Rydik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZWdpc3RlcmluZyBzb2MgcGxhdGZvcm0gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAmc3N0X2NvbXBvbmVudCwKKwkJCQlzc3RfcGxhdGZvcm1fZGFpLCBBUlJBWV9TSVpFKHNzdF9wbGF0Zm9ybV9kYWkpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInJlZ2lzdGVyaW5nIGNwdSBkYWlzIGZhaWxlZFxuIik7CisJCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzc3RfcGxhdGZvcm1fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOworCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJzc3RfcGxhdGZvcm1fcmVtb3ZlIHN1Y2Nlc3NcbiIpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisKK3N0YXRpYyBpbnQgc3N0X3NvY19wcmVwYXJlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgc3N0X2RhdGEgKmRydiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBpOworCisJLyogc3VzcGVuZCBhbGwgcGNtcyBmaXJzdCAqLworCXNuZF9zb2Nfc3VzcGVuZChkcnYtPnNvY19jYXJkLT5kZXYpOworCXNuZF9zb2NfcG93ZXJvZmYoZHJ2LT5zb2NfY2FyZC0+ZGV2KTsKKworCS8qIHNldCB0aGUgU1NQcyB0byBpZGxlICovCisJZm9yIChpID0gMDsgaSA8IGRydi0+c29jX2NhcmQtPm51bV9ydGQ7IGkrKykgeworCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IGRydi0+c29jX2NhcmQtPnJ0ZFtpXS5jcHVfZGFpOworCisJCWlmIChkYWktPmFjdGl2ZSkgeworCQkJc2VuZF9zc3BfY21kKGRhaSwgZGFpLT5uYW1lLCAwKTsKKwkJCXNzdF9oYW5kbGVfdmJfdGltZXIoZGFpLCBmYWxzZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3N0X3NvY19jb21wbGV0ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNzdF9kYXRhICpkcnYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlpbnQgaTsKKworCS8qIHJlc3RhcnQgU1NQcyAqLworCWZvciAoaSA9IDA7IGkgPCBkcnYtPnNvY19jYXJkLT5udW1fcnRkOyBpKyspIHsKKwkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkgPSBkcnYtPnNvY19jYXJkLT5ydGRbaV0uY3B1X2RhaTsKKworCQlpZiAoZGFpLT5hY3RpdmUpIHsKKwkJCXNzdF9oYW5kbGVfdmJfdGltZXIoZGFpLCB0cnVlKTsKKwkJCXNlbmRfc3NwX2NtZChkYWksIGRhaS0+bmFtZSwgMSk7CisJCX0KKwl9CisJc25kX3NvY19yZXN1bWUoZHJ2LT5zb2NfY2FyZC0+ZGV2KTsKK30KKworI2Vsc2UKKworI2RlZmluZSBzc3Rfc29jX3ByZXBhcmUgTlVMTAorI2RlZmluZSBzc3Rfc29jX2NvbXBsZXRlIE5VTEwKKworI2VuZGlmCisKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNzdF9wbGF0Zm9ybV9wbSA9IHsKKwkucHJlcGFyZQk9IHNzdF9zb2NfcHJlcGFyZSwKKwkuY29tcGxldGUJPSBzc3Rfc29jX2NvbXBsZXRlLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3N0X3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gInNzdC1tZmxkLXBsYXRmb3JtIiwKKwkJLnBtICAgICAgICAgICAgID0gJnNzdF9wbGF0Zm9ybV9wbSwKKwl9LAorCS5wcm9iZQkJPSBzc3RfcGxhdGZvcm1fcHJvYmUsCisJLnJlbW92ZQkJPSBzc3RfcGxhdGZvcm1fcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzc3RfcGxhdGZvcm1fZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEludGVsKFIpIE1JRCBQbGF0Zm9ybSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzc3QtbWZsZC1wbGF0Zm9ybSIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0LW1mbGQtcGxhdGZvcm0uaCBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1tZmxkLXBsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5NDMxNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC1tZmxkLXBsYXRmb3JtLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiAgc3N0X21mbGRfcGxhdGZvcm0uaCAtIEludGVsIE1JRCBQbGF0Zm9ybSBkcml2ZXIgaGVhZGVyIGZpbGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDEwIEludGVsIENvcnAKKyAqICBBdXRob3I6IFZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPgorICogIEF1dGhvcjogSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqLworCisjaWZuZGVmIF9fU1NUX1BMQVRGT1JNRFJWX0hfXworI2RlZmluZSBfX1NTVF9QTEFURk9STURSVl9IX18KKworI2luY2x1ZGUgInNzdC1tZmxkLWRzcC5oIgorCitleHRlcm4gc3RydWN0IHNzdF9kZXZpY2UgKnNzdDsKKworI2RlZmluZSBTU1RfTU9OTwkJMQorI2RlZmluZSBTU1RfU1RFUkVPCQkyCisjZGVmaW5lIFNTVF9NQVhfQ0FQCQk1CisKKyNkZWZpbmUgU1NUX01BWF9CVUZGRVIJCSg4MDAqMTAyNCkKKyNkZWZpbmUgU1NUX01JTl9CVUZGRVIJCSg4MDAqMTAyNCkKKyNkZWZpbmUgU1NUX01JTl9QRVJJT0RfQllURVMJMzIKKyNkZWZpbmUgU1NUX01BWF9QRVJJT0RfQllURVMJU1NUX01BWF9CVUZGRVIKKyNkZWZpbmUgU1NUX01JTl9QRVJJT0RTCQkyCisjZGVmaW5lIFNTVF9NQVhfUEVSSU9EUwkJKDEwMjQqMikKKyNkZWZpbmUgU1NUX0ZJRk9fU0laRQkJMAorCitzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvIHsKKwlpbnQgc3RyX2lkOworCXZvaWQgKmFyZzsKKwl2b2lkICgqcGVyaW9kX2VsYXBzZWQpICh2b2lkICphcmcpOworCXVuc2lnbmVkIGxvbmcgbG9uZyBidWZmZXJfcHRyOworCXVuc2lnbmVkIGxvbmcgbG9uZyBwY21fZGVsYXk7CisJaW50IHNmcmVxOworfTsKKworZW51bSBzc3RfZHJ2X3N0YXR1cyB7CisJU1NUX1BMQVRGT1JNX0lOSVQgPSAxLAorCVNTVF9QTEFURk9STV9TVEFSVEVELAorCVNTVF9QTEFURk9STV9SVU5OSU5HLAorCVNTVF9QTEFURk9STV9QQVVTRUQsCisJU1NUX1BMQVRGT1JNX0RST1BQRUQsCit9OworCitlbnVtIHNzdF9zdHJlYW1fb3BzIHsKKwlTVFJFQU1fT1BTX1BMQVlCQUNLID0gMCwKKwlTVFJFQU1fT1BTX0NBUFRVUkUsCit9OworCitlbnVtIHNzdF9hdWRpb19kZXZpY2VfdHlwZSB7CisJU05EX1NTVF9ERVZJQ0VfSEVBRFNFVCA9IDEsCisJU05EX1NTVF9ERVZJQ0VfSUhGLAorCVNORF9TU1RfREVWSUNFX1ZJQlJBLAorCVNORF9TU1RfREVWSUNFX0hBUFRJQywKKwlTTkRfU1NUX0RFVklDRV9DQVBUVVJFLAorCVNORF9TU1RfREVWSUNFX0NPTVBSRVNTLAorfTsKKworLyogUENNIFBhcmFtZXRlcnMgKi8KK3N0cnVjdCBzc3RfcGNtX3BhcmFtcyB7CisJdTE2IGNvZGVjOwkvKiBjb2RlYyB0eXBlICovCisJdTggbnVtX2NoYW47CS8qIDE9TW9ubywgMj1TdGVyZW8gKi8KKwl1OCBwY21fd2Rfc3o7CS8qIDE2LzI0IC0gYml0Ki8KKwl1MzIgcmVzZXJ2ZWQ7CS8qIEJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kICovCisJdTMyIHNmcmVxOwkvKiBTYW1wbGluZyByYXRlIGluIEh6ICovCisJdTMyIHJpbmdfYnVmZmVyX3NpemU7CisJdTMyIHBlcmlvZF9jb3VudDsJLyogcGVyaW9kIGVsYXBzZWQgaW4gc2FtcGxlcyovCisJdTMyIHJpbmdfYnVmZmVyX2FkZHI7Cit9OworCitzdHJ1Y3Qgc3N0X3N0cmVhbV9wYXJhbXMgeworCXUzMiByZXN1bHQ7CisJdTMyIHN0cmVhbV9pZDsKKwl1OCBjb2RlYzsKKwl1OCBvcHM7CisJdTggc3RyZWFtX3R5cGU7CisJdTggZGV2aWNlX3R5cGU7CisJc3RydWN0IHNzdF9wY21fcGFyYW1zIHNwYXJhbXM7Cit9OworCitzdHJ1Y3Qgc3N0X2NvbXByZXNzX2NiIHsKKwl2b2lkICpwYXJhbTsKKwl2b2lkICgqY29tcHJfY2IpKHZvaWQgKnBhcmFtKTsKKwl2b2lkICpkcmFpbl9jYl9wYXJhbTsKKwl2b2lkICgqZHJhaW5fbm90aWZ5KSh2b2lkICpwYXJhbSk7Cit9OworCitzdHJ1Y3QgY29tcHJlc3Nfc3N0X29wcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCpvcGVuKShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqc3RyX3BhcmFtcywgc3RydWN0IHNzdF9jb21wcmVzc19jYiAqY2IpOworCWludCAoKnN0cmVhbV9zdGFydCkoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3RyX2lkKTsKKwlpbnQgKCpzdHJlYW1fZHJvcCkoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3RyX2lkKTsKKwlpbnQgKCpzdHJlYW1fZHJhaW4pKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCk7CisJaW50ICgqc3RyZWFtX3BhcnRpYWxfZHJhaW4pKHN0cnVjdCBkZXZpY2UgKmRldiwJdW5zaWduZWQgaW50IHN0cl9pZCk7CisJaW50ICgqc3RyZWFtX3BhdXNlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQpOworCWludCAoKnN0cmVhbV9wYXVzZV9yZWxlYXNlKShzdHJ1Y3QgZGV2aWNlICpkZXYsCXVuc2lnbmVkIGludCBzdHJfaWQpOworCisJaW50ICgqdHN0YW1wKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQsCisJCQlzdHJ1Y3Qgc25kX2NvbXByX3RzdGFtcCAqdHN0YW1wKTsKKwlpbnQgKCphY2spKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCwKKwkJCXVuc2lnbmVkIGxvbmcgYnl0ZXMpOworCWludCAoKmNsb3NlKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQpOworCWludCAoKmdldF9jYXBzKShzdHJ1Y3Qgc25kX2NvbXByX2NhcHMgKmNhcHMpOworCWludCAoKmdldF9jb2RlY19jYXBzKShzdHJ1Y3Qgc25kX2NvbXByX2NvZGVjX2NhcHMgKmNvZGVjKTsKKwlpbnQgKCpzZXRfbWV0YWRhdGEpKHN0cnVjdCBkZXZpY2UgKmRldiwJdW5zaWduZWQgaW50IHN0cl9pZCwKKwkJCXN0cnVjdCBzbmRfY29tcHJfbWV0YWRhdGEgKm1kYXRhKTsKKwlpbnQgKCpwb3dlcikoc3RydWN0IGRldmljZSAqZGV2LCBib29sIHN0YXRlKTsKK307CisKK3N0cnVjdCBzc3Rfb3BzIHsKKwlpbnQgKCpvcGVuKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqc3RyX3BhcmFtKTsKKwlpbnQgKCpzdHJlYW1faW5pdCkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICpzdHJfaW5mbyk7CisJaW50ICgqc3RyZWFtX3N0YXJ0KShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzdHJfaWQpOworCWludCAoKnN0cmVhbV9kcm9wKShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzdHJfaWQpOworCWludCAoKnN0cmVhbV9wYXVzZSkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc3RyX2lkKTsKKwlpbnQgKCpzdHJlYW1fcGF1c2VfcmVsZWFzZSkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc3RyX2lkKTsKKwlpbnQgKCpzdHJlYW1fcmVhZF90c3RhbXApKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqc3RyX2luZm8pOworCWludCAoKnNlbmRfYnl0ZV9zdHJlYW0pKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNuZF9zc3RfYnl0ZXNfdjIgKmJ5dGVzKTsKKwlpbnQgKCpjbG9zZSkoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3RyX2lkKTsKKwlpbnQgKCpwb3dlcikoc3RydWN0IGRldmljZSAqZGV2LCBib29sIHN0YXRlKTsKK307CisKK3N0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0geworCWludCAgICAgc3RyZWFtX3N0YXR1czsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJc2l6ZV90IGJ5dGVzX3dyaXR0ZW47CisJc3RydWN0IHBjbV9zdHJlYW1faW5mbyBzdHJlYW1faW5mbzsKKwlzdHJ1Y3Qgc3N0X29wcyAqb3BzOworCXN0cnVjdCBjb21wcmVzc19zc3Rfb3BzICpjb21wcl9vcHM7CisJc3BpbmxvY2tfdAlzdGF0dXNfbG9jazsKK307CisKK3N0cnVjdCBzc3RfZGV2aWNlIHsKKwljaGFyICpuYW1lOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc3N0X29wcyAqb3BzOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGNvbXByZXNzX3NzdF9vcHMgKmNvbXByX29wczsKK307CisKK3N0cnVjdCBzc3RfZGF0YTsKKworaW50IHNzdF9kc3BfaW5pdF92Ml9kcGNtKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSk7CitpbnQgc3N0X3NlbmRfcGlwZV9nYWlucyhzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IHN0cmVhbSwgaW50IG11dGUpOworaW50IHNlbmRfc3NwX2NtZChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgY29uc3QgY2hhciAqaWQsIGJvb2wgZW5hYmxlKTsKK2ludCBzc3RfaGFuZGxlX3ZiX3RpbWVyKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBib29sIGVuYWJsZSk7CisKK3ZvaWQgc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSwgaW50IHN0YXRlKTsKK2ludCBzc3RfZmlsbF9zdHJlYW1fcGFyYW1zKHZvaWQgKnN1YnN0cmVhbSwgY29uc3Qgc3RydWN0IHNzdF9kYXRhICpjdHgsCisJCQkgICBzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbXMsIGJvb2wgaXNfY29tcHJlc3MpOworCitzdHJ1Y3Qgc3N0X2FsZ29faW50X2NvbnRyb2xfdjIgeworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCBtYzsKKwl1MTYgbW9kdWxlX2lkOyAvKiBtb2R1bGUgaWRlbnRpZmllZXIgKi8KKwl1MTYgcGlwZV9pZDsgLyogbG9jYXRpb24gaW5mbzogcGlwZV9pZCArIGluc3RhbmNlX2lkICovCisJdTE2IGluc3RhbmNlX2lkOworCXVuc2lnbmVkIGludCB2YWx1ZTsgLyogVmFsdWUgcmVjZWl2ZWQgaXMgc3RvcmVkIGhlcmUgKi8KK307CitzdHJ1Y3Qgc3N0X2RhdGEgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHNzdF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3Qgc25kX3NzdF9ieXRlc192MiAqYnl0ZV9zdHJlYW07CisJc3RydWN0IG11dGV4IGxvY2s7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqc29jX2NhcmQ7Cit9OworaW50IHNzdF9yZWdpc3Rlcl9kc3Aoc3RydWN0IHNzdF9kZXZpY2UgKnNzdCk7CitpbnQgc3N0X3VucmVnaXN0ZXJfZHNwKHN0cnVjdCBzc3RfZGV2aWNlICpzc3QpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0L01ha2VmaWxlIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L01ha2VmaWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvaW50ZWwvc3N0L01ha2VmaWxlCnJlbmFtZSB0byBzb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3QvTWFrZWZpbGUKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3QuYyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmMyZTQyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdC5jCkBAIC0wLDAgKzEsNTU3IEBACisvKgorICogIHNzdC5jIC0gSW50ZWwgU1NUIERyaXZlciBmb3IgYXVkaW8gZW5naW5lCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOC0xNAlJbnRlbCBDb3JwCisgKiAgQXV0aG9yczoJVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+CisgKgkJSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPgorICoJCURoYXJhZ2Vzd2FyaSBSIDxkaGFyYWdlc3dhcmkuckBpbnRlbC5jb20+CisgKgkJS1AgSmVlamEgPGplZWphLmtwQGludGVsLmNvbT4KKyAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxhc20vcGxhdGZvcm1fc3N0X2F1ZGlvLmg+CisjaW5jbHVkZSAiLi4vc3N0LW1mbGQtcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJzc3QuaCIKKyNpbmNsdWRlICIuLi8uLi9jb21tb24vc3N0LWRzcC5oIgorCitNT0RVTEVfQVVUSE9SKCJWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkhhcnNoYSBQcml5YSA8cHJpeWEuaGFyc2hhQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgKFIpIFNTVChSKSBBdWRpbyBFbmdpbmUgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzc3RfaXNfcHJvY2Vzc19yZXBseSh1MzIgbXNnX2lkKQoreworCXJldHVybiAoKG1zZ19pZCAmIFBST0NFU1NfTVNHKSA/IHRydWUgOiBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzc3RfdmFsaWRhdGVfbWFpbGJveF9zaXplKHVuc2lnbmVkIGludCBzaXplKQoreworCXJldHVybiAoKHNpemUgPD0gU1NUX01BSUxCT1hfU0laRSkgPyB0cnVlIDogZmFsc2UpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaW50ZWxfc3N0X2ludGVycnVwdF9tcmZsZChpbnQgaXJxLCB2b2lkICpjb250ZXh0KQoreworCXVuaW9uIGludGVycnVwdF9yZWdfbXJmbGQgaXNyOworCXVuaW9uIGlwY19oZWFkZXJfbXJmbGQgaGVhZGVyOworCXVuaW9uIHNzdF9pbXJfcmVnX21yZmxkIGltcjsKKwlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZyA9IE5VTEw7CisJdW5zaWduZWQgaW50IHNpemUgPSAwOworCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpkcnYgPSAoc3RydWN0IGludGVsX3NzdF9kcnYgKikgY29udGV4dDsKKwlpcnFyZXR1cm5fdCByZXR2YWwgPSBJUlFfSEFORExFRDsKKworCS8qIEludGVycnVwdCBhcnJpdmVkLCBjaGVjayBzcmMgKi8KKwlpc3IuZnVsbCA9IHNzdF9zaGltX3JlYWQ2NChkcnYtPnNoaW0sIFNTVF9JU1JYKTsKKworCWlmIChpc3IucGFydC5kb25lX2ludGVycnVwdCkgeworCQkvKiBDbGVhciBkb25lIGJpdCAqLworCQlzcGluX2xvY2soJmRydi0+aXBjX3NwaW5fbG9jayk7CisJCWhlYWRlci5mdWxsID0gc3N0X3NoaW1fcmVhZDY0KGRydi0+c2hpbSwKKwkJCQkJZHJ2LT5pcGNfcmVnLmlwY3gpOworCQloZWFkZXIucC5oZWFkZXJfaGlnaC5wYXJ0LmRvbmUgPSAwOworCQlzc3Rfc2hpbV93cml0ZTY0KGRydi0+c2hpbSwgZHJ2LT5pcGNfcmVnLmlwY3gsIGhlYWRlci5mdWxsKTsKKworCQkvKiB3cml0ZSAxIHRvIGNsZWFyIHN0YXR1cyByZWdpc3RlciAqLzsKKwkJaXNyLnBhcnQuZG9uZV9pbnRlcnJ1cHQgPSAxOworCQlzc3Rfc2hpbV93cml0ZTY0KGRydi0+c2hpbSwgU1NUX0lTUlgsIGlzci5mdWxsKTsKKwkJc3Bpbl91bmxvY2soJmRydi0+aXBjX3NwaW5fbG9jayk7CisKKwkJLyogd2UgY2FuIHNlbmQgbW9yZSBtZXNzYWdlcyB0byBEU1Agc28gdHJpZ2dlciB3b3JrICovCisJCXF1ZXVlX3dvcmsoZHJ2LT5wb3N0X21zZ193cSwgJmRydi0+aXBjX3Bvc3RfbXNnX3dxKTsKKwkJcmV0dmFsID0gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGlzci5wYXJ0LmJ1c3lfaW50ZXJydXB0KSB7CisJCS8qIG1lc3NhZ2UgZnJvbSBkc3Agc28gY29weSB0aGF0ICovCisJCXNwaW5fbG9jaygmZHJ2LT5pcGNfc3Bpbl9sb2NrKTsKKwkJaW1yLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkNjQoZHJ2LT5zaGltLCBTU1RfSU1SWCk7CisJCWltci5wYXJ0LmJ1c3lfaW50ZXJydXB0ID0gMTsKKwkJc3N0X3NoaW1fd3JpdGU2NChkcnYtPnNoaW0sIFNTVF9JTVJYLCBpbXIuZnVsbCk7CisJCXNwaW5fdW5sb2NrKCZkcnYtPmlwY19zcGluX2xvY2spOworCQloZWFkZXIuZnVsbCA9ICBzc3Rfc2hpbV9yZWFkNjQoZHJ2LT5zaGltLCBkcnYtPmlwY19yZWcuaXBjZCk7CisKKwkJaWYgKHNzdF9jcmVhdGVfaXBjX21zZygmbXNnLCBoZWFkZXIucC5oZWFkZXJfaGlnaC5wYXJ0LmxhcmdlKSkgeworCQkJZHJ2LT5vcHMtPmNsZWFyX2ludGVycnVwdChkcnYpOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisKKwkJaWYgKGhlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQubGFyZ2UpIHsKKwkJCXNpemUgPSBoZWFkZXIucC5oZWFkZXJfbG93X3BheWxvYWQ7CisJCQlpZiAoc3N0X3ZhbGlkYXRlX21haWxib3hfc2l6ZShzaXplKSkgeworCQkJCW1lbWNweV9mcm9taW8obXNnLT5tYWlsYm94X2RhdGEsCisJCQkJCWRydi0+bWFpbGJveCArIGRydi0+bWFpbGJveF9yZWN2X29mZnNldCwgc2l6ZSk7CisJCQl9IGVsc2UgeworCQkJCWRldl9lcnIoZHJ2LT5kZXYsCisJCQkJCSJNYWlsYm94IG5vdCBjb3BpZWQsIHBheWxvYWQgc2l6ZSBpczogJXVcbiIsIHNpemUpOworCQkJCWhlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZCA9IDA7CisJCQl9CisJCX0KKworCQltc2ctPm1yZmxkX2hlYWRlciA9IGhlYWRlcjsKKwkJbXNnLT5pc19wcm9jZXNzX3JlcGx5ID0KKwkJCXNzdF9pc19wcm9jZXNzX3JlcGx5KGhlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQubXNnX2lkKTsKKwkJc3Bpbl9sb2NrKCZkcnYtPnJ4X21zZ19sb2NrKTsKKwkJbGlzdF9hZGRfdGFpbCgmbXNnLT5ub2RlLCAmZHJ2LT5yeF9saXN0KTsKKwkJc3Bpbl91bmxvY2soJmRydi0+cnhfbXNnX2xvY2spOworCQlkcnYtPm9wcy0+Y2xlYXJfaW50ZXJydXB0KGRydik7CisJCXJldHZhbCA9IElSUV9XQUtFX1RIUkVBRDsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGlycXJldHVybl90IGludGVsX3NzdF9pcnFfdGhyZWFkX21yZmxkKGludCBpcnEsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IGludGVsX3NzdF9kcnYgKmRydiA9IChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqKSBjb250ZXh0OworCXN0cnVjdCBpcGNfcG9zdCAqX19tc2csICptc2cgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRydi0+cnhfbXNnX2xvY2ssIGlycV9mbGFncyk7CisJaWYgKGxpc3RfZW1wdHkoJmRydi0+cnhfbGlzdCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHJ2LT5yeF9tc2dfbG9jaywgaXJxX2ZsYWdzKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIF9fbXNnLCAmZHJ2LT5yeF9saXN0LCBub2RlKSB7CisJCWxpc3RfZGVsKCZtc2ctPm5vZGUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnYtPnJ4X21zZ19sb2NrLCBpcnFfZmxhZ3MpOworCQlpZiAobXNnLT5pc19wcm9jZXNzX3JlcGx5KQorCQkJZHJ2LT5vcHMtPnByb2Nlc3NfbWVzc2FnZShtc2cpOworCQllbHNlCisJCQlkcnYtPm9wcy0+cHJvY2Vzc19yZXBseShkcnYsIG1zZyk7CisKKwkJaWYgKG1zZy0+aXNfbGFyZ2UpCisJCQlrZnJlZShtc2ctPm1haWxib3hfZGF0YSk7CisJCWtmcmVlKG1zZyk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkcnYtPnJ4X21zZ19sb2NrLCBpcnFfZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnYtPnJ4X21zZ19sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBzc3Rfc2F2ZV9kc3BfY29udGV4dF92MihzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0KQoreworCWludCByZXQgPSAwOworCisJcmV0ID0gc3N0X3ByZXBhcmVfYW5kX3Bvc3RfbXNnKHNzdCwgU1NUX1RBU0tfSURfTUVESUEsIElQQ19DTUQsCisJCQlJUENfUFJFUF9EMywgUElQRV9SU1ZELCAwLCBOVUxMLCBOVUxMLAorCQkJdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihzc3QtPmRldiwgIm5vdCBzdXNwZW5kaW5nIEZXISEsIEVycjogJWRcbiIsIHJldCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgaW50ZWxfc3N0X29wcyBtcmZsZF9vcHMgPSB7CisJLmludGVycnVwdCA9IGludGVsX3NzdF9pbnRlcnJ1cHRfbXJmbGQsCisJLmlycV90aHJlYWQgPSBpbnRlbF9zc3RfaXJxX3RocmVhZF9tcmZsZCwKKwkuY2xlYXJfaW50ZXJydXB0ID0gaW50ZWxfc3N0X2NsZWFyX2ludHJfbXJmbGQsCisJLnN0YXJ0ID0gc3N0X3N0YXJ0X21yZmxkLAorCS5yZXNldCA9IGludGVsX3NzdF9yZXNldF9kc3BfbXJmbGQsCisJLnBvc3RfbWVzc2FnZSA9IHNzdF9wb3N0X21lc3NhZ2VfbXJmbGQsCisJLnByb2Nlc3NfcmVwbHkgPSBzc3RfcHJvY2Vzc19yZXBseV9tcmZsZCwKKwkuc2F2ZV9kc3BfY29udGV4dCA9ICBzc3Rfc2F2ZV9kc3BfY29udGV4dF92MiwKKwkuYWxsb2Nfc3RyZWFtID0gc3N0X2FsbG9jX3N0cmVhbV9tcmZsZCwKKwkucG9zdF9kb3dubG9hZCA9IHNzdF9wb3N0X2Rvd25sb2FkX21yZmxkLAorfTsKKworaW50IHNzdF9kcml2ZXJfb3BzKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3QpCit7CisKKwlzd2l0Y2ggKHNzdC0+ZGV2X2lkKSB7CisJY2FzZSBTU1RfTVJGTERfUENJX0lEOgorCWNhc2UgU1NUX0JZVF9BQ1BJX0lEOgorCWNhc2UgU1NUX0NIVl9BQ1BJX0lEOgorCQlzc3QtPnRzdGFtcCA9IFNTVF9USU1FX1NUQU1QX01SRkxEOworCQlzc3QtPm9wcyA9ICZtcmZsZF9vcHM7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJZGV2X2Vycihzc3QtPmRldiwKKwkJCSJTU1QgRHJpdmVyIGNhcGFibGl0aWVzIG1pc3NpbmcgZm9yIGRldl9pZDogJXgiLCBzc3QtPmRldl9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX07Cit9CisKK3ZvaWQgc3N0X3Byb2Nlc3NfcGVuZGluZ19tc2coc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHggPSBjb250YWluZXJfb2Yod29yaywKKwkJCXN0cnVjdCBpbnRlbF9zc3RfZHJ2LCBpcGNfcG9zdF9tc2dfd3EpOworCisJY3R4LT5vcHMtPnBvc3RfbWVzc2FnZShjdHgsIE5VTEwsIGZhbHNlKTsKK30KKworc3RhdGljIGludCBzc3Rfd29ya3F1ZXVlX2luaXQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmY3R4LT5tZW1jcHlfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmN0eC0+cnhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmN0eC0+aXBjX2Rpc3BhdGNoX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZjdHgtPmJsb2NrX2xpc3QpOworCUlOSVRfV09SSygmY3R4LT5pcGNfcG9zdF9tc2dfd3EsIHNzdF9wcm9jZXNzX3BlbmRpbmdfbXNnKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjdHgtPndhaXRfcXVldWUpOworCisJY3R4LT5wb3N0X21zZ193cSA9CisJCWNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKCJzc3RfcG9zdF9tc2dfd3EiKTsKKwlpZiAoIWN0eC0+cG9zdF9tc2dfd3EpCisJCXJldHVybiAtRUJVU1k7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNzdF9pbml0X2xvY2tzKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgpCit7CisJbXV0ZXhfaW5pdCgmY3R4LT5zc3RfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmN0eC0+cnhfbXNnX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjdHgtPmlwY19zcGluX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjdHgtPmJsb2NrX2xvY2spOworfQorCitpbnQgc3N0X2FsbG9jX2Rydl9jb250ZXh0KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICoqY3R4LAorCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBkZXZfaWQpCit7CisJKmN0eCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZihzdHJ1Y3QgaW50ZWxfc3N0X2RydiksIEdGUF9LRVJORUwpOworCWlmICghKCpjdHgpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCSgqY3R4KS0+ZGV2ID0gZGV2OworCSgqY3R4KS0+ZGV2X2lkID0gZGV2X2lkOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfYWxsb2NfZHJ2X2NvbnRleHQpOworCitpbnQgc3N0X2NvbnRleHRfaW5pdChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KQoreworCWludCByZXQgPSAwLCBpOworCisJaWYgKCFjdHgtPnBkYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY3R4LT5wZGF0YS0+cHJvYmVfZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZW1jcHkoJmN0eC0+aW5mbywgY3R4LT5wZGF0YS0+cHJvYmVfZGF0YSwgc2l6ZW9mKGN0eC0+aW5mbykpOworCisJcmV0ID0gc3N0X2RyaXZlcl9vcHMoY3R4KTsKKwlpZiAocmV0ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3N0X2luaXRfbG9ja3MoY3R4KTsKKwlzc3Rfc2V0X2Z3X3N0YXRlX2xvY2tlZChjdHgsIFNTVF9SRVNFVCk7CisKKwkvKiBwdnRfaWQgMCByZXNlcnZlZCBmb3IgYXN5bmMgbWVzc2FnZXMgKi8KKwljdHgtPnB2dF9pZCA9IDE7CisJY3R4LT5zdHJlYW1fY250ID0gMDsKKwljdHgtPmZ3X2luX21lbSA9IE5VTEw7CisJLyogd2UgdXNlIG1lbWNweSwgc28gc2V0IHRvIDAgKi8KKwljdHgtPnVzZV9kbWEgPSAwOworCWN0eC0+dXNlX2xsaSA9IDA7CisKKwlpZiAoc3N0X3dvcmtxdWV1ZV9pbml0KGN0eCkpCisJCXJldHVybiAtRUlOVkFMOworCisJY3R4LT5tYWlsYm94X3JlY3Zfb2Zmc2V0ID0gY3R4LT5wZGF0YS0+aXBjX2luZm8tPm1ib3hfcmVjdl9vZmY7CisJY3R4LT5pcGNfcmVnLmlwY3ggPSBTU1RfSVBDWCArIGN0eC0+cGRhdGEtPmlwY19pbmZvLT5pcGNfb2Zmc2V0OworCWN0eC0+aXBjX3JlZy5pcGNkID0gU1NUX0lQQ0QgKyBjdHgtPnBkYXRhLT5pcGNfaW5mby0+aXBjX29mZnNldDsKKworCWRldl9pbmZvKGN0eC0+ZGV2LCAiR290IGRydiBkYXRhIG1heCBzdHJlYW0gJWRcbiIsCisJCQkJY3R4LT5pbmZvLm1heF9zdHJlYW1zKTsKKworCWZvciAoaSA9IDE7IGkgPD0gY3R4LT5pbmZvLm1heF9zdHJlYW1zOyBpKyspIHsKKwkJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW0gPSAmY3R4LT5zdHJlYW1zW2ldOworCisJCW1lbXNldChzdHJlYW0sIDAsIHNpemVvZigqc3RyZWFtKSk7CisJCXN0cmVhbS0+cGlwZV9pZCA9IFBJUEVfUlNWRDsKKwkJbXV0ZXhfaW5pdCgmc3RyZWFtLT5sb2NrKTsKKwl9CisKKwkvKiBSZWdpc3RlciB0aGUgSVNSICovCisJcmV0ID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShjdHgtPmRldiwgY3R4LT5pcnFfbnVtLCBjdHgtPm9wcy0+aW50ZXJydXB0LAorCQkJCQljdHgtPm9wcy0+aXJxX3RocmVhZCwgMCwgU1NUX0RSVl9OQU1FLAorCQkJCQljdHgpOworCWlmIChyZXQpCisJCWdvdG8gZG9fZnJlZV9tZW07CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiUmVnaXN0ZXJlZCBJUlEgJSN4XG4iLCBjdHgtPmlycV9udW0pOworCisJLyogZGVmYXVsdCBpbnRyIGFyZSB1bm1hc2tlZCBzbyBzZXQgdGhpcyBhcyBtYXNrZWQgKi8KKwlzc3Rfc2hpbV93cml0ZTY0KGN0eC0+c2hpbSwgU1NUX0lNUlgsIDB4RkZGRjAwMzgpOworCisJY3R4LT5xb3MgPSBkZXZtX2t6YWxsb2MoY3R4LT5kZXYsCisJCXNpemVvZihzdHJ1Y3QgcG1fcW9zX3JlcXVlc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eC0+cW9zKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZG9fZnJlZV9tZW07CisJfQorCXBtX3Fvc19hZGRfcmVxdWVzdChjdHgtPnFvcywgUE1fUU9TX0NQVV9ETUFfTEFURU5DWSwKKwkJCQlQTV9RT1NfREVGQVVMVF9WQUxVRSk7CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiUmVxdWVzdGluZyBGVyAlcyBub3cuLi5cbiIsIGN0eC0+ZmlybXdhcmVfbmFtZSk7CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIHRydWUsIGN0eC0+ZmlybXdhcmVfbmFtZSwKKwkJCQkgICAgICBjdHgtPmRldiwgR0ZQX0tFUk5FTCwgY3R4LCBzc3RfZmlybXdhcmVfbG9hZF9jYik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiRmlybXdhcmUgZG93bmxvYWQgZmFpbGVkOiVkXG4iLCByZXQpOworCQlnb3RvIGRvX2ZyZWVfbWVtOworCX0KKwlzc3RfcmVnaXN0ZXIoY3R4LT5kZXYpOworCXJldHVybiAwOworCitkb19mcmVlX21lbToKKwlkZXN0cm95X3dvcmtxdWV1ZShjdHgtPnBvc3RfbXNnX3dxKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2NvbnRleHRfaW5pdCk7CisKK3ZvaWQgc3N0X2NvbnRleHRfY2xlYW51cChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KQoreworCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKGN0eC0+ZGV2KTsKKwlwbV9ydW50aW1lX2Rpc2FibGUoY3R4LT5kZXYpOworCXNzdF91bnJlZ2lzdGVyKGN0eC0+ZGV2KTsKKwlzc3Rfc2V0X2Z3X3N0YXRlX2xvY2tlZChjdHgsIFNTVF9TSFVURE9XTik7CisJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShjdHgtPnBvc3RfbXNnX3dxKTsKKwlwbV9xb3NfcmVtb3ZlX3JlcXVlc3QoY3R4LT5xb3MpOworCWtmcmVlKGN0eC0+Zndfc2dfbGlzdC5zcmMpOworCWtmcmVlKGN0eC0+Zndfc2dfbGlzdC5kc3QpOworCWN0eC0+Zndfc2dfbGlzdC5saXN0X2xlbiA9IDA7CisJa2ZyZWUoY3R4LT5md19pbl9tZW0pOworCWN0eC0+ZndfaW5fbWVtID0gTlVMTDsKKwlzc3RfbWVtY3B5X2ZyZWVfcmVzb3VyY2VzKGN0eCk7CisJY3R4ID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9jb250ZXh0X2NsZWFudXApOworCitzdGF0aWMgaW5saW5lIHZvaWQgc3N0X3NhdmVfc2hpbTY0KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsCisJCQkgICAgdm9pZCBfX2lvbWVtICpzaGltLAorCQkJICAgIHN0cnVjdCBzc3Rfc2hpbV9yZWdzNjQgKnNoaW1fcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPmlwY19zcGluX2xvY2ssIGlycV9mbGFncyk7CisKKwlzaGltX3JlZ3MtPmltcnggPSBzc3Rfc2hpbV9yZWFkNjQoc2hpbSwgU1NUX0lNUlgpOworCXNoaW1fcmVncy0+Y3NyID0gc3N0X3NoaW1fcmVhZDY0KHNoaW0sIFNTVF9DU1IpOworCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPmlwY19zcGluX2xvY2ssIGlycV9mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzc3RfcmVzdG9yZV9zaGltNjQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwKKwkJCQkgICAgICB2b2lkIF9faW9tZW0gKnNoaW0sCisJCQkJICAgICAgc3RydWN0IHNzdF9zaGltX3JlZ3M2NCAqc2hpbV9yZWdzKQoreworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCisJLyoKKwkgKiB3ZSBvbmx5IG5lZWQgdG8gcmVzdG9yZSBJTVJYIGZvciB0aGlzIGNhc2UsIHJlc3Qgd2lsbCBiZQorCSAqIGluaXRpYWxpemUgYnkgRlcgb3IgZHJpdmVyIHdoZW4gZmlybXdhcmUgaXMgbG9hZGVkCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+aXBjX3NwaW5fbG9jaywgaXJxX2ZsYWdzKTsKKwlzc3Rfc2hpbV93cml0ZTY0KHNoaW0sIFNTVF9JTVJYLCBzaGltX3JlZ3MtPmltcngpLAorCXNzdF9zaGltX3dyaXRlNjQoc2hpbSwgU1NUX0NTUiwgc2hpbV9yZWdzLT5jc3IpLAorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+aXBjX3NwaW5fbG9jaywgaXJxX2ZsYWdzKTsKK30KKwordm9pZCBzc3RfY29uZmlndXJlX3J1bnRpbWVfcG0oc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCkKK3sKKwlwbV9ydW50aW1lX3NldF9hdXRvc3VzcGVuZF9kZWxheShjdHgtPmRldiwgU1NUX1NVU1BFTkRfREVMQVkpOworCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKGN0eC0+ZGV2KTsKKwkvKgorCSAqIEZvciBhY3BpIGRldmljZXMsIHRoZSBhY3R1YWwgcGh5c2ljYWwgZGV2aWNlIHN0YXRlIGlzCisJICogaW5pdGlhbGx5IGFjdGl2ZS4gU28gY2hhbmdlIHRoZSBzdGF0ZSB0byBhY3RpdmUgYmVmb3JlCisJICogZW5hYmxpbmcgdGhlIHBtCisJICovCisKKwlpZiAoIWFjcGlfZGlzYWJsZWQpCisJCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZShjdHgtPmRldik7CisKKwlwbV9ydW50aW1lX2VuYWJsZShjdHgtPmRldik7CisKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGN0eC0+ZGV2KTsKKwllbHNlCisJCXBtX3J1bnRpbWVfcHV0X25vaWRsZShjdHgtPmRldik7CisKKwlzc3Rfc2F2ZV9zaGltNjQoY3R4LCBjdHgtPnNoaW0sIGN0eC0+c2hpbV9yZWdzNjQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2NvbmZpZ3VyZV9ydW50aW1lX3BtKTsKKworc3RhdGljIGludCBpbnRlbF9zc3RfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoY3R4LT5zc3Rfc3RhdGUgPT0gU1NUX1JFU0VUKSB7CisJCWRldl9kYmcoZGV2LCAiTFBFIGlzIGFscmVhZHkgaW4gUkVTRVQgc3RhdGUsIE5vIGFjdGlvblxuIik7CisJCXJldHVybiAwOworCX0KKwkvKiBzYXZlIGZ3IGNvbnRleHQgKi8KKwlpZiAoY3R4LT5vcHMtPnNhdmVfZHNwX2NvbnRleHQoY3R4KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIE1vdmUgdGhlIFNTVCBzdGF0ZSB0byBSZXNldCAqLworCXNzdF9zZXRfZndfc3RhdGVfbG9ja2VkKGN0eCwgU1NUX1JFU0VUKTsKKworCXN5bmNocm9uaXplX2lycShjdHgtPmlycV9udW0pOworCWZsdXNoX3dvcmtxdWV1ZShjdHgtPnBvc3RfbXNnX3dxKTsKKworCWN0eC0+b3BzLT5yZXNldChjdHgpOworCS8qIHNhdmUgdGhlIHNoaW0gcmVnaXN0ZXJzIGJlY2F1c2UgUE1DIGRvZXNuJ3Qgc2F2ZSBzdGF0ZSAqLworCXNzdF9zYXZlX3NoaW02NChjdHgsIGN0eC0+c2hpbSwgY3R4LT5zaGltX3JlZ3M2NCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGludGVsX3NzdF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNzdF9md19zYXZlICpmd19zYXZlOworCWludCBpLCByZXQgPSAwOworCisJLyogY2hlY2sgZmlyc3QgaWYgd2UgYXJlIGFscmVhZHkgaW4gU1cgcmVzZXQgKi8KKwlpZiAoY3R4LT5zc3Rfc3RhdGUgPT0gU1NUX1JFU0VUKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogY2hlY2sgaWYgYW55IHN0cmVhbSBpcyBhY3RpdmUgYW5kIHJ1bm5pbmcKKwkgKiB0aGV5IHNob3VsZCBhbHJlYWR5IGJ5IHN1c3BlbmQgYnkgc29jX3N1c3BlbmQKKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDw9IGN0eC0+aW5mby5tYXhfc3RyZWFtczsgaSsrKSB7CisJCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtID0gJmN0eC0+c3RyZWFtc1tpXTsKKworCQlpZiAoc3RyZWFtLT5zdGF0dXMgPT0gU1RSRUFNX1JVTk5JTkcpIHsKKwkJCWRldl9lcnIoZGV2LCAic3RyZWFtICVkIGlzIHJ1bm5pbmcsIGNhbnQgc3VzdXBlbmQsIGFib3J0XG4iLCBpKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJc3luY2hyb25pemVfaXJxKGN0eC0+aXJxX251bSk7CisJZmx1c2hfd29ya3F1ZXVlKGN0eC0+cG9zdF9tc2dfd3EpOworCisJLyogTW92ZSB0aGUgU1NUIHN0YXRlIHRvIFJlc2V0ICovCisJc3N0X3NldF9md19zdGF0ZV9sb2NrZWQoY3R4LCBTU1RfUkVTRVQpOworCisJLyogdGVsbCBEU1Agd2UgYXJlIHN1c3BlbmRpbmcgKi8KKwlpZiAoY3R4LT5vcHMtPnNhdmVfZHNwX2NvbnRleHQoY3R4KSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qIHNhdmUgdGhlIG1lbW9yaWVzICovCisJZndfc2F2ZSA9IGt6YWxsb2Moc2l6ZW9mKCpmd19zYXZlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19zYXZlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmd19zYXZlLT5pcmFtID0ga3phbGxvYyhjdHgtPmlyYW1fZW5kIC0gY3R4LT5pcmFtX2Jhc2UsIEdGUF9LRVJORUwpOworCWlmICghZndfc2F2ZS0+aXJhbSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGlyYW07CisJfQorCWZ3X3NhdmUtPmRyYW0gPSBremFsbG9jKGN0eC0+ZHJhbV9lbmQgLSBjdHgtPmRyYW1fYmFzZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19zYXZlLT5kcmFtKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZHJhbTsKKwl9CisJZndfc2F2ZS0+c3JhbSA9IGt6YWxsb2MoU1NUX01BSUxCT1hfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19zYXZlLT5zcmFtKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gc3JhbTsKKwl9CisKKwlmd19zYXZlLT5kZHIgPSBremFsbG9jKGN0eC0+ZGRyX2VuZCAtIGN0eC0+ZGRyX2Jhc2UsIEdGUF9LRVJORUwpOworCWlmICghZndfc2F2ZS0+ZGRyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZGRyOworCX0KKworCW1lbWNweTMyX2Zyb21pbyhmd19zYXZlLT5pcmFtLCBjdHgtPmlyYW0sIGN0eC0+aXJhbV9lbmQgLSBjdHgtPmlyYW1fYmFzZSk7CisJbWVtY3B5MzJfZnJvbWlvKGZ3X3NhdmUtPmRyYW0sIGN0eC0+ZHJhbSwgY3R4LT5kcmFtX2VuZCAtIGN0eC0+ZHJhbV9iYXNlKTsKKwltZW1jcHkzMl9mcm9taW8oZndfc2F2ZS0+c3JhbSwgY3R4LT5tYWlsYm94LCBTU1RfTUFJTEJPWF9TSVpFKTsKKwltZW1jcHkzMl9mcm9taW8oZndfc2F2ZS0+ZGRyLCBjdHgtPmRkciwgY3R4LT5kZHJfZW5kIC0gY3R4LT5kZHJfYmFzZSk7CisKKwljdHgtPmZ3X3NhdmUgPSBmd19zYXZlOworCWN0eC0+b3BzLT5yZXNldChjdHgpOworCXJldHVybiAwOworZGRyOgorCWtmcmVlKGZ3X3NhdmUtPnNyYW0pOworc3JhbToKKwlrZnJlZShmd19zYXZlLT5kcmFtKTsKK2RyYW06CisJa2ZyZWUoZndfc2F2ZS0+aXJhbSk7CitpcmFtOgorCWtmcmVlKGZ3X3NhdmUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW50ZWxfc3N0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzc3RfZndfc2F2ZSAqZndfc2F2ZSA9IGN0eC0+Zndfc2F2ZTsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc3N0X2Jsb2NrICpibG9jazsKKworCWlmICghZndfc2F2ZSkKKwkJcmV0dXJuIDA7CisKKwlzc3Rfc2V0X2Z3X3N0YXRlX2xvY2tlZChjdHgsIFNTVF9GV19MT0FESU5HKTsKKworCS8qIHdlIGhhdmUgdG8gcmVzdG9yZSB0aGUgbWVtb3J5IHNhdmVkICovCisJY3R4LT5vcHMtPnJlc2V0KGN0eCk7CisKKwljdHgtPmZ3X3NhdmUgPSBOVUxMOworCisJbWVtY3B5MzJfdG9pbyhjdHgtPmlyYW0sIGZ3X3NhdmUtPmlyYW0sIGN0eC0+aXJhbV9lbmQgLSBjdHgtPmlyYW1fYmFzZSk7CisJbWVtY3B5MzJfdG9pbyhjdHgtPmRyYW0sIGZ3X3NhdmUtPmRyYW0sIGN0eC0+ZHJhbV9lbmQgLSBjdHgtPmRyYW1fYmFzZSk7CisJbWVtY3B5MzJfdG9pbyhjdHgtPm1haWxib3gsIGZ3X3NhdmUtPnNyYW0sIFNTVF9NQUlMQk9YX1NJWkUpOworCW1lbWNweTMyX3RvaW8oY3R4LT5kZHIsIGZ3X3NhdmUtPmRkciwgY3R4LT5kZHJfZW5kIC0gY3R4LT5kZHJfYmFzZSk7CisKKwlrZnJlZShmd19zYXZlLT5zcmFtKTsKKwlrZnJlZShmd19zYXZlLT5kcmFtKTsKKwlrZnJlZShmd19zYXZlLT5pcmFtKTsKKwlrZnJlZShmd19zYXZlLT5kZHIpOworCWtmcmVlKGZ3X3NhdmUpOworCisJYmxvY2sgPSBzc3RfY3JlYXRlX2Jsb2NrKGN0eCwgMCwgRldfRFdOTF9JRCk7CisJaWYgKGJsb2NrID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisKKwkvKiBzdGFydCBhbmQgd2FpdCBmb3IgYWNrICovCisJY3R4LT5vcHMtPnN0YXJ0KGN0eCk7CisJcmV0ID0gc3N0X3dhaXRfdGltZW91dChjdHgsIGJsb2NrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY3R4LT5kZXYsICJmdyBkb3dubG9hZCBmYWlsZWQgJWRcbiIsIHJldCk7CisJCS8qIEZXIGRvd25sb2FkIGZhaWxlZCBkdWUgdG8gdGltZW91dCAqLworCQlyZXQgPSAtRUJVU1k7CisKKwl9IGVsc2UgeworCQlzc3Rfc2V0X2Z3X3N0YXRlX2xvY2tlZChjdHgsIFNTVF9GV19SVU5OSU5HKTsKKwl9CisKKwlzc3RfZnJlZV9ibG9jayhjdHgsIGJsb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpbnRlbF9zc3RfcG0gPSB7CisJLnN1c3BlbmQgPSBpbnRlbF9zc3Rfc3VzcGVuZCwKKwkucmVzdW1lID0gaW50ZWxfc3N0X3Jlc3VtZSwKKwkucnVudGltZV9zdXNwZW5kID0gaW50ZWxfc3N0X3J1bnRpbWVfc3VzcGVuZCwKK307CitFWFBPUlRfU1lNQk9MX0dQTChpbnRlbF9zc3RfcG0pOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdC5oIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNDkzODYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0LmgKQEAgLTAsMCArMSw1NTkgQEAKKy8qCisgKiAgc3N0LmggLSBJbnRlbCBTU1QgRHJpdmVyIGZvciBhdWRpbyBlbmdpbmUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTE0IEludGVsIENvcnBvcmF0aW9uCisgKiAgQXV0aG9yczoJVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+CisgKgkJSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPgorICoJCURoYXJhZ2Vzd2FyaSBSIDxkaGFyYWdlc3dhcmkuckBpbnRlbC5jb20+CisgKgkJS1AgSmVlamEgPGplZWphLmtwQGludGVsLmNvbT4KKyAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIENvbW1vbiBwcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgU1NUCisgKi8KKyNpZm5kZWYgX19TU1RfSF9fCisjZGVmaW5lIF9fU1NUX0hfXworCisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKworLyogZHJpdmVyIG5hbWVzICovCisjZGVmaW5lIFNTVF9EUlZfTkFNRSAiaW50ZWxfc3N0X2RyaXZlciIKKyNkZWZpbmUgU1NUX01SRkxEX1BDSV9JRCAweDExOUEKKyNkZWZpbmUgU1NUX0JZVF9BQ1BJX0lECTB4ODA4NjBGMjgKKyNkZWZpbmUgU1NUX0NIVl9BQ1BJX0lECTB4ODA4NjIyQTgKKworI2RlZmluZSBTU1RfU1VTUEVORF9ERUxBWSAyMDAwCisjZGVmaW5lIEZXX0NPTlRFWFRfTUVNICg2NCoxMDI0KQorI2RlZmluZSBTU1RfSUNDTV9CT1VOREFSWSA0CisjZGVmaW5lIFNTVF9DT05GSUdfU1NQX1NJR04gMHg3ZmZlODAwMQorCisjZGVmaW5lIE1SRkxEX0ZXX1ZJUlRVQUxfQkFTRSAweEMwMDAwMDAwCisjZGVmaW5lIE1SRkxEX0ZXX0REUl9CQVNFX09GRlNFVCAweDAKKyNkZWZpbmUgTVJGTERfRldfRkVBVFVSRV9CQVNFX09GRlNFVCAweDQKKyNkZWZpbmUgTVJGTERfRldfQlNTX1JFU0VUX0JJVCAwCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpbnRlbF9zc3RfcG07CitlbnVtIHNzdF9zdGF0ZXMgeworCVNTVF9GV19MT0FESU5HID0gMSwKKwlTU1RfRldfUlVOTklORywKKwlTU1RfUkVTRVQsCisJU1NUX1NIVVRET1dOLAorfTsKKworZW51bSBzc3RfYWxnb19vcHMgeworCVNTVF9TRVRfQUxHTyA9IDAsCisJU1NUX0dFVF9BTEdPID0gMSwKK307CisKKyNkZWZpbmUgU1NUX0JMT0NLX1RJTUVPVVQJMTAwMAorCisjZGVmaW5lIEZXX1NJR05BVFVSRV9TSVpFCTQKKyNkZWZpbmUgRldfTkFNRV9TSVpFCQkzMgorCisvKiBzdHJlYW0gc3RhdGVzICovCitlbnVtIHNzdF9zdHJlYW1fc3RhdGVzIHsKKwlTVFJFQU1fVU5fSU5JVAk9IDAsCS8qIEZyZWVkL05vdCB1c2VkIHN0cmVhbSAqLworCVNUUkVBTV9SVU5OSU5HCT0gMSwJLyogUnVubmluZyAqLworCVNUUkVBTV9QQVVTRUQJPSAyLAkvKiBQYXVzZWQgc3RyZWFtICovCisJU1RSRUFNX0RFQ09ERQk9IDMsCS8qIHN0cmVhbSBpcyBpbiBkZWNvZGluZyBvbmx5IHN0YXRlICovCisJU1RSRUFNX0lOSVQJPSA0LAkvKiBzdHJlYW0gaW5pdCwgd2FpdGluZyBmb3IgZGF0YSAqLworCVNUUkVBTV9SRVNFVAk9IDUsCS8qIGZvcmNlIHJlc2V0IG9uIHJlY292ZXJ5ICovCit9OworCitlbnVtIHNzdF9yYW1fdHlwZSB7CisJU1NUX0lSQU0JPSAxLAorCVNTVF9EUkFNCT0gMiwKKwlTU1RfRERSCT0gNSwKKwlTU1RfQ1VTVE9NX0lORk8JPSA3LAkvKiBjb25zaXN0cyBvZiBGVyBiaW5hcnkgaW5mb3JtYXRpb24gKi8KK307CisKKy8qIFNTVCBzaGltIHJlZ2lzdGVycyB0byBzdHJ1Y3R1cmUgbWFwcGluZyAqLwordW5pb24gaW50ZXJydXB0X3JlZyB7CisJc3RydWN0IHsKKwkJdTY0IGRvbmVfaW50ZXJydXB0OjE7CisJCXU2NCBidXN5X2ludGVycnVwdDoxOworCQl1NjQgcnN2ZDo2MjsKKwl9IHBhcnQ7CisJdTY0IGZ1bGw7Cit9OworCit1bmlvbiBzc3RfcGlzcl9yZWcgeworCXN0cnVjdCB7CisJCXUzMiBwc3NwMDoxOworCQl1MzIgcHNzcDE6MTsKKwkJdTMyIHJzdmQwOjM7CisJCXUzMiBkbWFjOjE7CisJCXUzMiByc3ZkMToyNjsKKwl9IHBhcnQ7CisJdTMyIGZ1bGw7Cit9OworCit1bmlvbiBzc3RfcGltcl9yZWcgeworCXN0cnVjdCB7CisJCXUzMiBzc3AwOjE7CisJCXUzMiBzc3AxOjE7CisJCXUzMiByc3ZkMDozOworCQl1MzIgZG1hYzoxOworCQl1MzIgcnN2ZDE6MTA7CisJCXUzMiBzc3AwX3NjOjE7CisJCXUzMiBzc3AxX3NjOjE7CisJCXUzMiByc3ZkMjozOworCQl1MzIgZG1hY19zYzoxOworCQl1MzIgcnN2ZDM6MTA7CisJfSBwYXJ0OworCXUzMiBmdWxsOworfTsKKwordW5pb24gY29uZmlnX3N0YXR1c19yZWdfbXJmbGQgeworCXN0cnVjdCB7CisJCXU2NCBscGVfcmVzZXQ6MTsKKwkJdTY0IGxwZV9yZXNldF92ZWN0b3I6MTsKKwkJdTY0IHJ1bnN0YWxsOjE7CisJCXU2NCBwd2FpdG1vZGU6MTsKKwkJdTY0IGNsa19zZWw6MzsKKwkJdTY0IHJzdmQyOjE7CisJCXU2NCBzc3RfY2xrOjM7CisJCXU2NCB4dF9zbm9vcDoxOworCQl1NjQgcnN2ZDM6NDsKKwkJdTY0IGNsa19zZWwxOjY7CisJCXU2NCBjbGtfZW5hYmxlOjM7CisJCXU2NCByc3ZkNDo2OworCQl1NjQgc2xpbTBiYXNlY2xrOjE7CisJCXU2NCByc3ZkOjMyOworCX0gcGFydDsKKwl1NjQgZnVsbDsKK307CisKK3VuaW9uIGludGVycnVwdF9yZWdfbXJmbGQgeworCXN0cnVjdCB7CisJCXU2NCBkb25lX2ludGVycnVwdDoxOworCQl1NjQgYnVzeV9pbnRlcnJ1cHQ6MTsKKwkJdTY0IHJzdmQ6NjI7CisJfSBwYXJ0OworCXU2NCBmdWxsOworfTsKKwordW5pb24gc3N0X2ltcl9yZWdfbXJmbGQgeworCXN0cnVjdCB7CisJCXU2NCBkb25lX2ludGVycnVwdDoxOworCQl1NjQgYnVzeV9pbnRlcnJ1cHQ6MTsKKwkJdTY0IHJzdmQ6NjI7CisJfSBwYXJ0OworCXU2NCBmdWxsOworfTsKKworLyoqCisgKiBzdHJ1Y3Qgc3N0X2Jsb2NrIC0gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBibG9jayBhIHVzZXIvZncgZGF0YSBjYWxsIHRvIGFub3RoZXIKKyAqIGZ3L3VzZXIgY2FsbAorICoKKyAqIEBjb25kaXRpb246IGNvbmRpdGlvbiBmb3IgYmxvY2tpbmcgY2hlY2sKKyAqIEByZXRfY29kZTogcmV0IGNvZGUgd2hlbiBibG9jayBpcyByZWxlYXNlZAorICogQGRhdGE6IGRhdGEgcHRyCisgKiBAc2l6ZTogc2l6ZSBvZiBkYXRhCisgKiBAb246IGJsb2NrIGNvbmRpdGlvbgorICogQG1zZ19pZDogbXNnX2lkID0gbXNnaWQgaW4gbWZsZC9jdHAsIG1yZmxkID0gTlVMTAorICogQGRydl9pZDogc3RyX2lkIGluIG1mbGQvY3RwLCA9IGRydl9pZCBpbiBtcmZsZAorICogQG5vZGU6IGxpc3QgaGVhZCBub2RlCisgKi8KK3N0cnVjdCBzc3RfYmxvY2sgeworCWJvb2wJY29uZGl0aW9uOworCWludAlyZXRfY29kZTsKKwl2b2lkCSpkYXRhOworCXUzMiAgICAgc2l6ZTsKKwlib29sCW9uOworCXUzMiAgICAgbXNnX2lkOworCXUzMiAgICAgZHJ2X2lkOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKK307CisKKy8qKgorICogc3RydWN0IHN0cmVhbV9pbmZvIC0gc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIHN0cmVhbSBpbmZvcm1hdGlvbgorICoKKyAqIEBzdGF0dXMgOiBzdHJlYW0gY3VycmVudCBzdGF0ZQorICogQHByZXYgOiBzdHJlYW0gcHJldiBzdGF0ZQorICogQG9wcyA6IHN0cmVhbSBvcGVyYXRpb24gcGIvY3AvZHJtLi4uCisgKiBAYnVmczogc3RyZWFtIGJ1ZmZlciBsaXN0CisgKiBAbG9jayA6IHN0cmVhbSBtdXRleCBmb3IgcHJvdGVjdGluZyBzdGF0ZQorICogQHBjbV9zdWJzdHJlYW0gOiBQQ00gc3Vic3RyZWFtCisgKiBAcGVyaW9kX2VsYXBzZWQgOiBQQ00gcGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sKKyAqIEBzZnJlcSA6IHN0cmVhbSBzYW1wbGluZyBmcmVxCisgKiBAc3RyX3R5cGUgOiBzdHJlYW0gdHlwZQorICogQGN1bW1fYnl0ZXMgOiBjdW1tdWxhdGl2ZSBieXRlcyBkZWNvZGVkCisgKiBAc3RyX3R5cGUgOiBzdHJlYW0gdHlwZQorICogQHNyYyA6IHN0cmVhbSBzb3VyY2UKKyAqLworc3RydWN0IHN0cmVhbV9pbmZvIHsKKwl1bnNpZ25lZCBpbnQJCXN0YXR1czsKKwl1bnNpZ25lZCBpbnQJCXByZXY7CisJdW5zaWduZWQgaW50CQlvcHM7CisJc3RydWN0IG11dGV4CQlsb2NrOworCisJdm9pZAkJCSpwY21fc3Vic3RyZWFtOworCXZvaWQgKCpwZXJpb2RfZWxhcHNlZCkodm9pZCAqcGNtX3N1YnN0cmVhbSk7CisKKwl1bnNpZ25lZCBpbnQJCXNmcmVxOworCXUzMgkJCWN1bW1fYnl0ZXM7CisKKwl2b2lkCQkJKmNvbXByX2NiX3BhcmFtOworCXZvaWQgKCpjb21wcl9jYikodm9pZCAqY29tcHJfY2JfcGFyYW0pOworCisJdm9pZAkJCSpkcmFpbl9jYl9wYXJhbTsKKwl2b2lkICgqZHJhaW5fbm90aWZ5KSh2b2lkICpkcmFpbl9jYl9wYXJhbSk7CisKKwl1bnNpZ25lZCBpbnQJCW51bV9jaDsKKwl1bnNpZ25lZCBpbnQJCXBpcGVfaWQ7CisJdW5zaWduZWQgaW50CQlzdHJfaWQ7CisJdW5zaWduZWQgaW50CQl0YXNrX2lkOworfTsKKworI2RlZmluZSBTU1RfRldfU0lHTiAiJFNTVCIKKyNkZWZpbmUgU1NUX0ZXX0xJQl9TSUdOICIkTElCIgorCisvKioKKyAqIHN0cnVjdCBzc3RfZndfaGVhZGVyIC0gRlcgZmlsZSBoZWFkZXJzCisgKgorICogQHNpZ25hdHVyZSA6IEZXIHNpZ25hdHVyZQorICogQGZpbGVfc2l6ZTogc2l6ZSBvZiBmdyBpbWFnZQorICogQG1vZHVsZXMgOiAjIG9mIG1vZHVsZXMKKyAqIEBmaWxlX2Zvcm1hdCA6IHZlcnNpb24gb2YgaGVhZGVyIGZvcm1hdAorICogQHJlc2VydmVkIDogcmVzZXJ2ZWQgZmllbGRzCisgKi8KK3N0cnVjdCBzc3RfZndfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtGV19TSUdOQVRVUkVfU0laRV07CisJdTMyIGZpbGVfc2l6ZTsKKwl1MzIgbW9kdWxlczsKKwl1MzIgZmlsZV9mb3JtYXQ7CisJdTMyIHJlc2VydmVkWzRdOworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfbW9kdWxlX2hlYWRlciAtIG1vZHVsZSBoZWFkZXIgaW4gRlcKKyAqCisgKiBAc2lnbmF0dXJlOiBtb2R1bGUgc2lnbmF0dXJlCisgKiBAbW9kX3NpemU6IHNpemUgb2YgbW9kdWxlCisgKiBAYmxvY2tzOiBibG9jayBjb3VudAorICogQHR5cGU6IGJsb2NrIHR5cGUKKyAqIEBlbnRyeV9wb2ludDogbW9kdWxlIG5ldHJ5IHBvaW50CisgKi8KK3N0cnVjdCBmd19tb2R1bGVfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtGV19TSUdOQVRVUkVfU0laRV07CisJdTMyIG1vZF9zaXplOworCXUzMiBibG9ja3M7CisJdTMyIHR5cGU7CisJdTMyIGVudHJ5X3BvaW50OworfTsKKworLyoqCisgKiBzdHJ1Y3QgZndfYmxvY2tfaW5mbyAtIGJsb2NrIGhlYWRlciBmb3IgRlcKKyAqCisgKiBAdHlwZTogYmxvY2sgcmFtIHR5cGUgSS9ECisgKiBAc2l6ZTogc2l6ZSBvZiBibG9jaworICogQHJhbV9vZmZzZXQ6IG9mZnNldCBpbiByYW0KKyAqLworc3RydWN0IGZ3X2Jsb2NrX2luZm8geworCWVudW0gc3N0X3JhbV90eXBlCXR5cGU7CisJdTMyCQkJc2l6ZTsKKwl1MzIJCQlyYW1fb2Zmc2V0OworCXUzMgkJCXJzdmQ7Cit9OworCitzdHJ1Y3Qgc3N0X3J1bnRpbWVfcGFyYW0geworCXN0cnVjdCBzbmRfc3N0X3J1bnRpbWVfcGFyYW1zIHBhcmFtOworfTsKKworc3RydWN0IHNzdF9zZ19saXN0IHsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdDsKKwlpbnQgbGlzdF9sZW47CisJdW5zaWduZWQgaW50IHNnX2lkeDsKK307CisKK3N0cnVjdCBzc3RfbWVtY3B5X2xpc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgbWVtY3B5bGlzdDsKKwl2b2lkICpkc3RuOworCWNvbnN0IHZvaWQgKnNyYzsKKwl1MzIgc2l6ZTsKKwlib29sIGlzX2lvOworfTsKKworLypGaXJtd2FyZSBNb2R1bGUgSW5mb3JtYXRpb24qLworZW51bSBzc3RfbGliX2R3bmxkX3N0YXR1cyB7CisJU1NUX0xJQl9OT1RfRk9VTkQgPSAwLAorCVNTVF9MSUJfRk9VTkQsCisJU1NUX0xJQl9ET1dOTE9BREVELAorfTsKKworc3RydWN0IHNzdF9tb2R1bGVfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsgLypMaWJyYXJ5IG5hbWUqLworCXUzMglpZDsgLypNb2R1bGUgSUQqLworCXUzMgllbnRyeV9wdDsgLypNb2R1bGUgZW50cnkgcG9pbnQqLworCXU4CXN0YXR1czsgLyptb2R1bGUgc3RhdHVzKi8KKwl1OAlyc3ZkMTsKKwl1MTYJcnN2ZDI7Cit9OworCisvKgorICogU3RydWN0dXJlIGZvciBtYW5hZ2luZyB0aGUgTGlicmFyeSBSZWdpb24oMS41TUIpCisgKiBpbiBERFIgaW4gTWVycmlmaWVsZAorICovCitzdHJ1Y3Qgc3N0X21lbV9tZ3IgeworCXBoeXNfYWRkcl90IGN1cnJlbnRfYmFzZTsKKwlpbnQgYXZhaWw7CisJdW5zaWduZWQgaW50IGNvdW50OworfTsKKworc3RydWN0IHNzdF9pcGNfcmVnIHsKKwlpbnQgaXBjeDsKKwlpbnQgaXBjZDsKK307CisKK3N0cnVjdCBzc3Rfc2hpbV9yZWdzNjQgeworCXU2NCBjc3I7CisJdTY0IHBpc3I7CisJdTY0IHBpbXI7CisJdTY0IGlzcng7CisJdTY0IGlzcmQ7CisJdTY0IGltcng7CisJdTY0IGltcmQ7CisJdTY0IGlwY3g7CisJdTY0IGlwY2Q7CisJdTY0IGlzcnNjOworCXU2NCBpc3JscGVzYzsKKwl1NjQgaW1yc2M7CisJdTY0IGltcmxwZXNjOworCXU2NCBpcGNzYzsKKwl1NjQgaXBjbHBlc2M7CisJdTY0IGNsa2N0bDsKKwl1NjQgY3NyMjsKK307CisKK3N0cnVjdCBzc3RfZndfc2F2ZSB7CisJdm9pZCAqaXJhbTsKKwl2b2lkICpkcmFtOworCXZvaWQgKnNyYW07CisJdm9pZCAqZGRyOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaW50ZWxfc3N0X2RydiAtIGRyaXZlciBvcHMKKyAqCisgKiBAc3N0X3N0YXRlIDogY3VycmVudCBzc3QgZGV2aWNlIHN0YXRlCisgKiBAZGV2X2lkIDogZGV2aWNlIGlkZW50aWZpZXIsIHBjaV9pZCBmb3IgcGNpIGRldmljZXMgYW5kIGFjcGlfaWQgZm9yIGFjcGkKKyAqIAkgICAgIGRldmljZXMKKyAqIEBzaGltIDogU1NUIHNoaW0gcG9pbnRlcgorICogQG1haWxib3ggOiBTU1QgbWFpbGJveCBwb2ludGVyCisgKiBAaXJhbSA6IFNTVCBJUkFNIHBvaW50ZXIKKyAqIEBkcmFtIDogU1NUIERSQU0gcG9pbnRlcgorICogQHBkYXRhIDogU1NUIGluZm8gcGFzc2VkIGFzIGEgcGFydCBvZiBwY2kgcGxhdGZvcm0gZGF0YQorICogQHNoaW1fcGh5X2FkZCA6IFNTVCBzaGltIHBoeSBhZGRyCisgKiBAc2hpbV9yZWdzNjQ6IFN0cnVjdCB0byBzYXZlIHNoaW0gcmVnaXN0ZXJzCisgKiBAaXBjX2Rpc3BhdGNoX2xpc3QgOiBpcGMgbWVzc2FnZXMgZGlzcGF0Y2hlZAorICogQHJ4X2xpc3QgOiB0byBjb3B5IHRoZSBwcm9jZXNzX3JlcGx5L3Byb2Nlc3NfbXNnIGZyb20gRFNQCisgKiBAaXBjX3Bvc3RfbXNnX3dxIDogd3EgdG8gcG9zdCBJUEMgbWVzc2FnZXMgY29udGV4dAorICogQG1hZF9vcHMgOiBNQUQgZHJpdmVyIG9wZXJhdGlvbnMgcmVnaXN0ZXJlZAorICogQG1hZF93cSA6IE1BRCBkcml2ZXIgd3EKKyAqIEBwb3N0X21zZ193cSA6IHdxIHRvIHBvc3QgSVBDIG1lc3NhZ2VzCisgKiBAc3RyZWFtcyA6IHNzdCBzdHJlYW0gY29udGV4dHMKKyAqIEBsaXN0X2xvY2sgOiBzc3QgZHJpdmVyIGxpc3QgbG9jayAoZGVwcmVjYXRlZCkKKyAqIEBpcGNfc3Bpbl9sb2NrIDogc3BpbiBsb2NrIHRvIGhhbmRsZSBhdWRpbyBzaGltIGFjY2VzcyBhbmQgaXBjIHF1ZXVlCisgKiBAYmxvY2tfbG9jayA6IHNwaW4gbG9jayB0byBhZGQgYmxvY2sgdG8gYmxvY2tfbGlzdCBhbmQgYXNzaWduIHB2dF9pZAorICogQHJ4X21zZ19sb2NrIDogc3BpbiBsb2NrIHRvIGhhbmRsZSB0aGUgcnggbWVzc2FnZXMgZnJvbSB0aGUgRFNQCisgKiBAc2NhcmRfb3BzIDogc3N0IGNhcmQgb3BzCisgKiBAcGNpIDogc3N0IHBjaSBkZXZpY2Ugc3RydXR1cmUKKyAqIEBkZXYgOiBwb2ludGVyIHRvIGN1cnJlbnQgZGV2aWNlIHN0cnVjdAorICogQHNzdF9sb2NrIDogc3N0IGRldmljZSBsb2NrCisgKiBAcHZ0X2lkIDogc3N0IHByaXZhdGUgaWQKKyAqIEBzdHJlYW1fY250IDogdG90YWwgc3N0IGFjdGl2ZSBzdHJlYW0gY291bnQKKyAqIEBwYl9zdHJlYW1zIDogdG90YWwgYWN0aXZlIHBiIHN0cmVhbXMKKyAqIEBjcF9zdHJlYW1zIDogdG90YWwgYWN0aXZlIGNwIHN0cmVhbXMKKyAqIEBhdWRpb19zdGFydCA6IGF1ZGlvIHN0YXR1cworICogQHFvcwkJOiBQTSBRb3Mgc3RydWN0CisgKiBmaXJtd2FyZV9uYW1lIDogRmlybXdhcmUgLyBMaWJyYXJ5IG5hbWUKKyAqLworc3RydWN0IGludGVsX3NzdF9kcnYgeworCWludAkJCXNzdF9zdGF0ZTsKKwlpbnQJCQlpcnFfbnVtOworCXVuc2lnbmVkIGludAkJZGV2X2lkOworCXZvaWQgX19pb21lbQkJKmRkcjsKKwl2b2lkIF9faW9tZW0JCSpzaGltOworCXZvaWQgX19pb21lbQkJKm1haWxib3g7CisJdm9pZCBfX2lvbWVtCQkqaXJhbTsKKwl2b2lkIF9faW9tZW0JCSpkcmFtOworCXVuc2lnbmVkIGludAkJbWFpbGJveF9hZGQ7CisJdW5zaWduZWQgaW50CQlpcmFtX2Jhc2U7CisJdW5zaWduZWQgaW50CQlkcmFtX2Jhc2U7CisJdW5zaWduZWQgaW50CQlzaGltX3BoeV9hZGQ7CisJdW5zaWduZWQgaW50CQlpcmFtX2VuZDsKKwl1bnNpZ25lZCBpbnQJCWRyYW1fZW5kOworCXVuc2lnbmVkIGludAkJZGRyX2VuZDsKKwl1bnNpZ25lZCBpbnQJCWRkcl9iYXNlOworCXVuc2lnbmVkIGludAkJbWFpbGJveF9yZWN2X29mZnNldDsKKwlzdHJ1Y3Qgc3N0X3NoaW1fcmVnczY0CSpzaGltX3JlZ3M2NDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICBibG9ja19saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJaXBjX2Rpc3BhdGNoX2xpc3Q7CisJc3RydWN0IHNzdF9wbGF0Zm9ybV9pbmZvICpwZGF0YTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXJ4X2xpc3Q7CisJc3RydWN0IHdvcmtfc3RydWN0ICAgICAgaXBjX3Bvc3RfbXNnX3dxOworCXdhaXRfcXVldWVfaGVhZF90CXdhaXRfcXVldWU7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnBvc3RfbXNnX3dxOworCXVuc2lnbmVkIGludAkJdHN0YW1wOworCS8qIHN0cl9pZCAwIGlzIG5vdCB1c2VkICovCisJc3RydWN0IHN0cmVhbV9pbmZvCXN0cmVhbXNbTUFYX05VTV9TVFJFQU1TKzFdOworCXNwaW5sb2NrX3QJCWlwY19zcGluX2xvY2s7CisJc3BpbmxvY2tfdCAgICAgICAgICAgICAgYmxvY2tfbG9jazsKKwlzcGlubG9ja190CQlyeF9tc2dfbG9jazsKKwlzdHJ1Y3QgcGNpX2RldgkJKnBjaTsKKwlzdHJ1Y3QgZGV2aWNlCQkqZGV2OworCXZvbGF0aWxlIGxvbmcgdW5zaWduZWQgCQlwdnRfaWQ7CisJc3RydWN0IG11dGV4ICAgICAgICAgICAgc3N0X2xvY2s7CisJdW5zaWduZWQgaW50CQlzdHJlYW1fY250OworCXVuc2lnbmVkIGludAkJY3NyX3ZhbHVlOworCXZvaWQJCQkqZndfaW5fbWVtOworCXN0cnVjdCBzc3Rfc2dfbGlzdAlmd19zZ19saXN0LCBsaWJyYXJ5X2xpc3Q7CisJc3RydWN0IGludGVsX3NzdF9vcHMJKm9wczsKKwlzdHJ1Y3Qgc3N0X2luZm8JCWluZm87CisJc3RydWN0IHBtX3Fvc19yZXF1ZXN0CSpxb3M7CisJdW5zaWduZWQgaW50CQl1c2VfZG1hOworCXVuc2lnbmVkIGludAkJdXNlX2xsaTsKKwlhdG9taWNfdAkJZndfY2xlYXJfY29udGV4dDsKKwlib29sCQkJbGliX2R3bmxkX3JlcWQ7CisJc3RydWN0IGxpc3RfaGVhZAltZW1jcHlfbGlzdDsKKwlzdHJ1Y3Qgc3N0X2lwY19yZWcJaXBjX3JlZzsKKwlzdHJ1Y3Qgc3N0X21lbV9tZ3IgICAgICBsaWJfbWVtX21ncjsKKwkvKgorCSAqIEhvbGRlciBmb3IgZmlybXdhcmUgbmFtZS4gRHVlIHRvIGFzeW5jIGNhbGwgaXQgbmVlZHMgdG8gYmUKKwkgKiBwZXJzaXN0ZW50IHRpbGwgd29ya2VyIHRocmVhZCBnZXRzIGNhbGxlZAorCSAqLworCWNoYXIgZmlybXdhcmVfbmFtZVtGV19OQU1FX1NJWkVdOworCisJc3RydWN0IHNzdF9md19zYXZlCSpmd19zYXZlOworfTsKKworLyogbWlzYyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBGV19EV05MX0lEIDB4MDEKKworc3RydWN0IGludGVsX3NzdF9vcHMgeworCWlycXJldHVybl90ICgqaW50ZXJydXB0KShpbnQsIHZvaWQgKik7CisJaXJxcmV0dXJuX3QgKCppcnFfdGhyZWFkKShpbnQsIHZvaWQgKik7CisJdm9pZCAoKmNsZWFyX2ludGVycnVwdCkoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCk7CisJaW50ICgqc3RhcnQpKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgpOworCWludCAoKnJlc2V0KShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KTsKKwl2b2lkICgqcHJvY2Vzc19yZXBseSkoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgc3RydWN0IGlwY19wb3N0ICptc2cpOworCWludCAoKnBvc3RfbWVzc2FnZSkoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwKKwkJCXN0cnVjdCBpcGNfcG9zdCAqbXNnLCBib29sIHN5bmMpOworCXZvaWQgKCpwcm9jZXNzX21lc3NhZ2UpKHN0cnVjdCBpcGNfcG9zdCAqbXNnKTsKKwl2b2lkICgqc2V0X2J5cGFzcykoYm9vbCBzZXQpOworCWludCAoKnNhdmVfZHNwX2NvbnRleHQpKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3QpOworCXZvaWQgKCpyZXN0b3JlX2RzcF9jb250ZXh0KSh2b2lkKTsKKwlpbnQgKCphbGxvY19zdHJlYW0pKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsIHZvaWQgKnBhcmFtcyk7CisJdm9pZCAoKnBvc3RfZG93bmxvYWQpKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3QpOworfTsKKworaW50IHNzdF9wYXVzZV9zdHJlYW0oc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBpbnQgaWQpOworaW50IHNzdF9yZXN1bWVfc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgaW50IGlkKTsKK2ludCBzc3RfZHJvcF9zdHJlYW0oc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBpbnQgaWQpOworaW50IHNzdF9mcmVlX3N0cmVhbShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIGludCBpZCk7CitpbnQgc3N0X3N0YXJ0X3N0cmVhbShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIGludCBzdHJfaWQpOworaW50IHNzdF9zZW5kX2J5dGVfc3RyZWFtX21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsCisJCQlzdHJ1Y3Qgc25kX3NzdF9ieXRlc192MiAqc2J5dGVzKTsKK2ludCBzc3Rfc2V0X3N0cmVhbV9wYXJhbShpbnQgc3RyX2lkLCBzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbSk7CitpbnQgc3N0X3NldF9tZXRhZGF0YShpbnQgc3RyX2lkLCBjaGFyICpwYXJhbXMpOworaW50IHNzdF9nZXRfc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwKKwkJc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pOworaW50IHNzdF9nZXRfc3RyZWFtX2FsbG9jYXRlZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LAorCQlzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbSwKKwkJc3RydWN0IHNuZF9zc3RfbGliX2Rvd25sb2FkICoqbGliX2RubGQpOworaW50IHNzdF9kcmFpbl9zdHJlYW0oc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAorCQlpbnQgc3RyX2lkLCBib29sIHBhcnRpYWxfZHJhaW4pOworaW50IHNzdF9wb3N0X21lc3NhZ2VfbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwKKwkJc3RydWN0IGlwY19wb3N0ICptc2csIGJvb2wgc3luYyk7Cit2b2lkIHNzdF9wcm9jZXNzX3JlcGx5X21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsIHN0cnVjdCBpcGNfcG9zdCAqbXNnKTsKK2ludCBzc3Rfc3RhcnRfbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCk7CitpbnQgaW50ZWxfc3N0X3Jlc2V0X2RzcF9tcmZsZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KTsKK3ZvaWQgaW50ZWxfc3N0X2NsZWFyX2ludHJfbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCk7CisKK2ludCBzc3RfbG9hZF9mdyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KTsKK2ludCBzc3RfbG9hZF9saWJyYXJ5KHN0cnVjdCBzbmRfc3N0X2xpYl9kb3dubG9hZCAqbGliLCB1OCBvcHMpOwordm9pZCBzc3RfcG9zdF9kb3dubG9hZF9tcmZsZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KTsKK2ludCBzc3RfZ2V0X2Jsb2NrX3N0cmVhbShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgpOwordm9pZCBzc3RfbWVtY3B5X2ZyZWVfcmVzb3VyY2VzKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgpOworCitpbnQgc3N0X3dhaXRfaW50ZXJydXB0aWJsZShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsCisJCQkJc3RydWN0IHNzdF9ibG9jayAqYmxvY2spOworaW50IHNzdF93YWl0X3RpbWVvdXQoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAorCQkJc3RydWN0IHNzdF9ibG9jayAqYmxvY2spOworaW50IHNzdF9jcmVhdGVfaXBjX21zZyhzdHJ1Y3QgaXBjX3Bvc3QgKiphcmcsIGJvb2wgbGFyZ2UpOworaW50IGZyZWVfc3RyZWFtX2NvbnRleHQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgdW5zaWduZWQgaW50IHN0cl9pZCk7Cit2b2lkIHNzdF9jbGVhbl9zdHJlYW0oc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW0pOworaW50IGludGVsX3NzdF9yZWdpc3Rlcl9jb21wcmVzcyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0KTsKK2ludCBpbnRlbF9zc3RfcmVtb3ZlX2NvbXByZXNzKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3QpOwordm9pZCBzc3RfY2Rldl9mcmFnbWVudF9lbGFwc2VkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsIGludCBzdHJfaWQpOworaW50IHNzdF9zZW5kX3N5bmNfbXNnKGludCBpcGMsIGludCBzdHJfaWQpOworaW50IHNzdF9nZXRfbnVtX2NoYW5uZWwoc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pOworaW50IHNzdF9nZXRfc2ZyZXEoc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pOworaW50IHNzdF9hbGxvY19zdHJlYW1fbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCB2b2lkICpwYXJhbXMpOwordm9pZCBzc3RfcmVzdG9yZV9md19jb250ZXh0KHZvaWQpOworc3RydWN0IHNzdF9ibG9jayAqc3N0X2NyZWF0ZV9ibG9jayhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LAorCQkJCXUzMiBtc2dfaWQsIHUzMiBkcnZfaWQpOworaW50IHNzdF9jcmVhdGVfYmxvY2tfYW5kX2lwY19tc2coc3RydWN0IGlwY19wb3N0ICoqYXJnLCBib29sIGxhcmdlLAorCQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIHN0cnVjdCBzc3RfYmxvY2sgKipibG9jaywKKwkJdTMyIG1zZ19pZCwgdTMyIGRydl9pZCk7CitpbnQgc3N0X2ZyZWVfYmxvY2soc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgc3RydWN0IHNzdF9ibG9jayAqZnJlZWQpOworaW50IHNzdF93YWtlX3VwX2Jsb2NrKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsIGludCByZXN1bHQsCisJCXUzMiBkcnZfaWQsIHUzMiBpcGMsIHZvaWQgKmRhdGEsIHUzMiBzaXplKTsKK2ludCBzc3RfcmVxdWVzdF9maXJtd2FyZV9hc3luYyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KTsKK2ludCBzc3RfZHJpdmVyX29wcyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0KTsKK3N0cnVjdCBzc3RfcGxhdGZvcm1faW5mbyAqc3N0X2dldF9hY3BpX2RyaXZlcl9kYXRhKGNvbnN0IGNoYXIgKmhpZCk7Cit2b2lkIHNzdF9maXJtd2FyZV9sb2FkX2NiKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKmNvbnRleHQpOworaW50IHNzdF9wcmVwYXJlX2FuZF9wb3N0X21zZyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0LAorCQlpbnQgdGFza19pZCwgaW50IGlwY19tc2csIGludCBjbWRfaWQsIGludCBwaXBlX2lkLAorCQlzaXplX3QgbWJveF9kYXRhX2xlbiwgY29uc3Qgdm9pZCAqbWJveF9kYXRhLCB2b2lkICoqZGF0YSwKKwkJYm9vbCBsYXJnZSwgYm9vbCBmaWxsX2RzcCwgYm9vbCBzeW5jLCBib29sIHJlc3BvbnNlKTsKKwordm9pZCBzc3RfcHJvY2Vzc19wZW5kaW5nX21zZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworaW50IHNzdF9hc3NpZ25fcHZ0X2lkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCk7Cit2b2lkIHNzdF9pbml0X3N0cmVhbShzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbSwKKwkJaW50IGNvZGVjLCBpbnQgc3N0X2lkLCBpbnQgb3BzLCB1OCBzbG90KTsKK2ludCBzc3RfdmFsaWRhdGVfc3RyaWQoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBpbnQgc3RyX2lkKTsKK3N0cnVjdCBzdHJlYW1faW5mbyAqZ2V0X3N0cmVhbV9pbmZvKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwKKwkJaW50IHN0cl9pZCk7CitpbnQgZ2V0X3N0cmVhbV9pZF9tcmZsZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsCisJCXUzMiBwaXBlX2lkKTsKK3UzMiByZWxvY2F0ZV9pbXJfYWRkcl9tcmZsZCh1MzIgYmFzZV9hZGRyKTsKK3ZvaWQgc3N0X2FkZF90b19kaXNwYXRjaF9saXN0X2FuZF9wb3N0KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3QsCisJCQkJCXN0cnVjdCBpcGNfcG9zdCAqbXNnKTsKK2ludCBzc3RfcG1fcnVudGltZV9wdXQoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnYpOworaW50IHNzdF9zaGltX3dyaXRlKHZvaWQgX19pb21lbSAqYWRkciwgaW50IG9mZnNldCwgaW50IHZhbHVlKTsKK3UzMiBzc3Rfc2hpbV9yZWFkKHZvaWQgX19pb21lbSAqYWRkciwgaW50IG9mZnNldCk7Cit1NjQgc3N0X3JlZ19yZWFkNjQodm9pZCBfX2lvbWVtICphZGRyLCBpbnQgb2Zmc2V0KTsKK2ludCBzc3Rfc2hpbV93cml0ZTY0KHZvaWQgX19pb21lbSAqYWRkciwgaW50IG9mZnNldCwgdTY0IHZhbHVlKTsKK3U2NCBzc3Rfc2hpbV9yZWFkNjQodm9pZCBfX2lvbWVtICphZGRyLCBpbnQgb2Zmc2V0KTsKK3ZvaWQgc3N0X3NldF9md19zdGF0ZV9sb2NrZWQoCisJCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgaW50IHNzdF9zdGF0ZSk7Cit2b2lkIHNzdF9maWxsX2hlYWRlcl9tcmZsZCh1bmlvbiBpcGNfaGVhZGVyX21yZmxkICpoZWFkZXIsCisJCQkJaW50IG1zZywgaW50IHRhc2tfaWQsIGludCBsYXJnZSwgaW50IGRydl9pZCk7Cit2b2lkIHNzdF9maWxsX2hlYWRlcl9kc3Aoc3RydWN0IGlwY19kc3BfaGRyICpkc3AsIGludCBtc2csCisJCQkJCWludCBwaXBlX2lkLCBpbnQgbGVuKTsKKworaW50IHNzdF9yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICopOworaW50IHNzdF91bnJlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKik7CisKK2ludCBzc3RfYWxsb2NfZHJ2X2NvbnRleHQoc3RydWN0IGludGVsX3NzdF9kcnYgKipjdHgsCisJCXN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGRldl9pZCk7CitpbnQgc3N0X2NvbnRleHRfaW5pdChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KTsKK3ZvaWQgc3N0X2NvbnRleHRfY2xlYW51cChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KTsKK3ZvaWQgc3N0X2NvbmZpZ3VyZV9ydW50aW1lX3BtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgpOwordm9pZCBtZW1jcHkzMl90b2lvKHZvaWQgX19pb21lbSAqZHN0LCBjb25zdCB2b2lkICpzcmMsIGludCBjb3VudCk7Cit2b2lkIG1lbWNweTMyX2Zyb21pbyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgX19pb21lbSAqc3JjLCBpbnQgY291bnQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfYWNwaS5jIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9hY3BpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmNjkzMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfYWNwaS5jCkBAIC0wLDAgKzEsMzg0IEBACisvKgorICogc3N0X2FjcGkuYyAtIFNTVCAoTFBFKSBkcml2ZXIgaW5pdCBmaWxlIGZvciBBQ1BJIGVudW1lcmF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogIEF1dGhvcnM6CVJhbWVzaCBCYWJ1IEsgViA8UmFtZXNoLkJhYnVAaW50ZWwuY29tPgorICogIEF1dGhvcnM6CU9tYWlyIE1vaGFtbWVkIEFiZHVsbGFoIDxvbWFpci5tLmFiZHVsbGFoQGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybV9zc3RfYXVkaW8uaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvY29tcHJlc3NfZHJpdmVyLmg+CisjaW5jbHVkZSA8YWNwaS9hY2J1ZmZlci5oPgorI2luY2x1ZGUgPGFjcGkvcGxhdGZvcm0vYWNlbnYuaD4KKyNpbmNsdWRlIDxhY3BpL3BsYXRmb3JtL2FjbGludXguaD4KKyNpbmNsdWRlIDxhY3BpL2FjdHlwZXMuaD4KKyNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+CisjaW5jbHVkZSAiLi4vc3N0LW1mbGQtcGxhdGZvcm0uaCIKKyNpbmNsdWRlICIuLi8uLi9jb21tb24vc3N0LWRzcC5oIgorI2luY2x1ZGUgInNzdC5oIgorCitzdHJ1Y3Qgc3N0X21hY2hpbmVzIHsKKwljaGFyICpjb2RlY19pZDsKKwljaGFyIGJvYXJkWzMyXTsKKwljaGFyIG1hY2hpbmVbMzJdOworCXZvaWQgKCptYWNoaW5lX3F1aXJrKSh2b2lkKTsKKwljaGFyIGZpcm13YXJlW0ZXX05BTUVfU0laRV07CisJc3RydWN0IHNzdF9wbGF0Zm9ybV9pbmZvICpwZGF0YTsKKworfTsKKworLyogTFBFIHZpZXdwb2ludCBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgU1NUX0JZVF9JUkFNX1BIWV9TVEFSVAkweGZmMmMwMDAwCisjZGVmaW5lIFNTVF9CWVRfSVJBTV9QSFlfRU5ECTB4ZmYyZDQwMDAKKyNkZWZpbmUgU1NUX0JZVF9EUkFNX1BIWV9TVEFSVAkweGZmMzAwMDAwCisjZGVmaW5lIFNTVF9CWVRfRFJBTV9QSFlfRU5ECTB4ZmYzMjAwMDAKKyNkZWZpbmUgU1NUX0JZVF9JTVJfVklSVF9TVEFSVAkweGMwMDAwMDAwIC8qIHZpcnR1YWwgYWRkciBpbiBMUEUgKi8KKyNkZWZpbmUgU1NUX0JZVF9JTVJfVklSVF9FTkQJMHhjMDFmZmZmZgorI2RlZmluZSBTU1RfQllUX1NISU1fUEhZX0FERFIJMHhmZjM0MDAwMAorI2RlZmluZSBTU1RfQllUX01CT1hfUEhZX0FERFIJMHhmZjM0NDAwMAorI2RlZmluZSBTU1RfQllUX0RNQTBfUEhZX0FERFIJMHhmZjI5ODAwMAorI2RlZmluZSBTU1RfQllUX0RNQTFfUEhZX0FERFIJMHhmZjI5YzAwMAorI2RlZmluZSBTU1RfQllUX1NTUDBfUEhZX0FERFIJMHhmZjJhMDAwMAorI2RlZmluZSBTU1RfQllUX1NTUDJfUEhZX0FERFIJMHhmZjJhMjAwMAorCisjZGVmaW5lIEJZVF9GV19NT0RfVEFCTEVfT0ZGU0VUCTB4ODAwMDAKKyNkZWZpbmUgQllUX0ZXX01PRF9UQUJMRV9TSVpFCTB4MTAwCisjZGVmaW5lIEJZVF9GV19NT0RfT0ZGU0VUCShCWVRfRldfTU9EX1RBQkxFX09GRlNFVCArIEJZVF9GV19NT0RfVEFCTEVfU0laRSkKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzc3RfaW5mbyBieXRfZndwYXJzZV9pbmZvID0geworCS51c2VfZWxmCT0gZmFsc2UsCisJLm1heF9zdHJlYW1zCT0gMjUsCisJLmlyYW1fc3RhcnQJPSBTU1RfQllUX0lSQU1fUEhZX1NUQVJULAorCS5pcmFtX2VuZAk9IFNTVF9CWVRfSVJBTV9QSFlfRU5ELAorCS5pcmFtX3VzZQk9IHRydWUsCisJLmRyYW1fc3RhcnQJPSBTU1RfQllUX0RSQU1fUEhZX1NUQVJULAorCS5kcmFtX2VuZAk9IFNTVF9CWVRfRFJBTV9QSFlfRU5ELAorCS5kcmFtX3VzZQk9IHRydWUsCisJLmltcl9zdGFydAk9IFNTVF9CWVRfSU1SX1ZJUlRfU1RBUlQsCisJLmltcl9lbmQJPSBTU1RfQllUX0lNUl9WSVJUX0VORCwKKwkuaW1yX3VzZQk9IHRydWUsCisJLm1haWxib3hfc3RhcnQJPSBTU1RfQllUX01CT1hfUEhZX0FERFIsCisJLm51bV9wcm9iZXMJPSAwLAorCS5scGVfdmlld3B0X3JxZCAgPSB0cnVlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzc3RfaXBjX2luZm8gYnl0X2lwY19pbmZvID0geworCS5pcGNfb2Zmc2V0ID0gMCwKKwkubWJveF9yZWN2X29mZiA9IDB4NDAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzc3RfbGliX2RubGRfaW5mbyAgYnl0X2xpYl9kbmxkX2luZm8gPSB7CisJLm1vZF9iYXNlICAgICAgICAgICA9IFNTVF9CWVRfSU1SX1ZJUlRfU1RBUlQsCisJLm1vZF9lbmQgICAgICAgICAgICA9IFNTVF9CWVRfSU1SX1ZJUlRfRU5ELAorCS5tb2RfdGFibGVfb2Zmc2V0ICAgPSBCWVRfRldfTU9EX1RBQkxFX09GRlNFVCwKKwkubW9kX3RhYmxlX3NpemUgICAgID0gQllUX0ZXX01PRF9UQUJMRV9TSVpFLAorCS5tb2RfZGRyX2RubGQgICAgICAgPSBmYWxzZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3N0X3Jlc19pbmZvIGJ5dF9ydnBfcmVzX2luZm8gPSB7CisJLnNoaW1fb2Zmc2V0ID0gMHgxNDAwMDAsCisJLnNoaW1fc2l6ZSA9IDB4MDAwMTAwLAorCS5zaGltX3BoeV9hZGRyID0gU1NUX0JZVF9TSElNX1BIWV9BRERSLAorCS5zc3AwX29mZnNldCA9IDB4YTAwMDAsCisJLnNzcDBfc2l6ZSA9IDB4MTAwMCwKKwkuZG1hMF9vZmZzZXQgPSAweDk4MDAwLAorCS5kbWEwX3NpemUgPSAweDQwMDAsCisJLmRtYTFfb2Zmc2V0ID0gMHg5YzAwMCwKKwkuZG1hMV9zaXplID0gMHg0MDAwLAorCS5pcmFtX29mZnNldCA9IDB4MGMwMDAwLAorCS5pcmFtX3NpemUgPSAweDE0MDAwLAorCS5kcmFtX29mZnNldCA9IDB4MTAwMDAwLAorCS5kcmFtX3NpemUgPSAweDI4MDAwLAorCS5tYm94X29mZnNldCA9IDB4MTQ0MDAwLAorCS5tYm94X3NpemUgPSAweDEwMDAsCisJLmFjcGlfbHBlX3Jlc19pbmRleCA9IDAsCisJLmFjcGlfZGRyX2luZGV4ID0gMiwKKwkuYWNwaV9pcGNfaXJxX2luZGV4ID0gNSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X3BsYXRmb3JtX2luZm8gYnl0X3J2cF9wbGF0Zm9ybV9kYXRhID0geworCS5wcm9iZV9kYXRhID0gJmJ5dF9md3BhcnNlX2luZm8sCisJLmlwY19pbmZvID0gJmJ5dF9pcGNfaW5mbywKKwkubGliX2luZm8gPSAmYnl0X2xpYl9kbmxkX2luZm8sCisJLnJlc19pbmZvID0gJmJ5dF9ydnBfcmVzX2luZm8sCisJLnBsYXRmb3JtID0gInNzdC1tZmxkLXBsYXRmb3JtIiwKK307CisKKy8qIENoZXJyeXZpZXcgKENoZXJyeXRyYWlsIGFuZCBCcmFzd2VsbCkgdXNlcyBzYW1lIG1yZmxkIGRwY20gZncgYXMgQmF5dHJhaWwsCisgKiBzbyBwZGF0YSBpcyBzYW1lIGFzIEJheXRyYWlsLgorICovCitzdGF0aWMgc3RydWN0IHNzdF9wbGF0Zm9ybV9pbmZvIGNodl9wbGF0Zm9ybV9kYXRhID0geworCS5wcm9iZV9kYXRhID0gJmJ5dF9md3BhcnNlX2luZm8sCisJLmlwY19pbmZvID0gJmJ5dF9pcGNfaW5mbywKKwkubGliX2luZm8gPSAmYnl0X2xpYl9kbmxkX2luZm8sCisJLnJlc19pbmZvID0gJmJ5dF9ydnBfcmVzX2luZm8sCisJLnBsYXRmb3JtID0gInNzdC1tZmxkLXBsYXRmb3JtIiwKK307CisKK3N0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2dldF9yZXNvdXJjZXMoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJzcmM7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShjdHgtPmRldik7CisKKwkvKiBBbGwgQUNQSSByZXNvdXJjZSByZXF1ZXN0IGhlcmUgKi8KKwkvKiBHZXQgU2hpbSBhZGRyICovCisJcnNyYyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwKKwkJCQkJY3R4LT5wZGF0YS0+cmVzX2luZm8tPmFjcGlfbHBlX3Jlc19pbmRleCk7CisJaWYgKCFyc3JjKSB7CisJCWRldl9lcnIoY3R4LT5kZXYsICJJbnZhbGlkIFNISU0gYmFzZSBmcm9tIElGV0kiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRldl9pbmZvKGN0eC0+ZGV2LCAiTFBFIGJhc2U6ICUjeCBzaXplOiUjeCIsICh1bnNpZ25lZCBpbnQpIHJzcmMtPnN0YXJ0LAorCQkJCQkodW5zaWduZWQgaW50KXJlc291cmNlX3NpemUocnNyYykpOworCisJY3R4LT5pcmFtX2Jhc2UgPSByc3JjLT5zdGFydCArIGN0eC0+cGRhdGEtPnJlc19pbmZvLT5pcmFtX29mZnNldDsKKwljdHgtPmlyYW1fZW5kID0gIGN0eC0+aXJhbV9iYXNlICsgY3R4LT5wZGF0YS0+cmVzX2luZm8tPmlyYW1fc2l6ZSAtIDE7CisJZGV2X2luZm8oY3R4LT5kZXYsICJJUkFNIGJhc2U6ICUjeCIsIGN0eC0+aXJhbV9iYXNlKTsKKwljdHgtPmlyYW0gPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShjdHgtPmRldiwgY3R4LT5pcmFtX2Jhc2UsCisJCQkJCSBjdHgtPnBkYXRhLT5yZXNfaW5mby0+aXJhbV9zaXplKTsKKwlpZiAoIWN0eC0+aXJhbSkgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBJUkFNIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWN0eC0+ZHJhbV9iYXNlID0gcnNyYy0+c3RhcnQgKyBjdHgtPnBkYXRhLT5yZXNfaW5mby0+ZHJhbV9vZmZzZXQ7CisJY3R4LT5kcmFtX2VuZCA9IGN0eC0+ZHJhbV9iYXNlICsgY3R4LT5wZGF0YS0+cmVzX2luZm8tPmRyYW1fc2l6ZSAtIDE7CisJZGV2X2luZm8oY3R4LT5kZXYsICJEUkFNIGJhc2U6ICUjeCIsIGN0eC0+ZHJhbV9iYXNlKTsKKwljdHgtPmRyYW0gPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShjdHgtPmRldiwgY3R4LT5kcmFtX2Jhc2UsCisJCQkJCSBjdHgtPnBkYXRhLT5yZXNfaW5mby0+ZHJhbV9zaXplKTsKKwlpZiAoIWN0eC0+ZHJhbSkgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBEUkFNIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWN0eC0+c2hpbV9waHlfYWRkID0gcnNyYy0+c3RhcnQgKyBjdHgtPnBkYXRhLT5yZXNfaW5mby0+c2hpbV9vZmZzZXQ7CisJZGV2X2luZm8oY3R4LT5kZXYsICJTSElNIGJhc2U6ICUjeCIsIGN0eC0+c2hpbV9waHlfYWRkKTsKKwljdHgtPnNoaW0gPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShjdHgtPmRldiwgY3R4LT5zaGltX3BoeV9hZGQsCisJCQkJCWN0eC0+cGRhdGEtPnJlc19pbmZvLT5zaGltX3NpemUpOworCWlmICghY3R4LT5zaGltKSB7CisJCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIFNISU0iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogcmVhc3NpZ24gcGh5c2ljYWwgYWRkcmVzcyB0byBMUEUgdmlld3BvaW50IGFkZHJlc3MgKi8KKwljdHgtPnNoaW1fcGh5X2FkZCA9IGN0eC0+cGRhdGEtPnJlc19pbmZvLT5zaGltX3BoeV9hZGRyOworCisJLyogR2V0IG1haWxib3ggYWRkciAqLworCWN0eC0+bWFpbGJveF9hZGQgPSByc3JjLT5zdGFydCArIGN0eC0+cGRhdGEtPnJlc19pbmZvLT5tYm94X29mZnNldDsKKwlkZXZfaW5mbyhjdHgtPmRldiwgIk1haWxib3ggYmFzZTogJSN4IiwgY3R4LT5tYWlsYm94X2FkZCk7CisJY3R4LT5tYWlsYm94ID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoY3R4LT5kZXYsIGN0eC0+bWFpbGJveF9hZGQsCisJCQkJCSAgICBjdHgtPnBkYXRhLT5yZXNfaW5mby0+bWJveF9zaXplKTsKKwlpZiAoIWN0eC0+bWFpbGJveCkgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBtYWlsYm94Iik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIHJlYXNzaWduIHBoeXNpY2FsIGFkZHJlc3MgdG8gTFBFIHZpZXdwb2ludCBhZGRyZXNzICovCisJY3R4LT5tYWlsYm94X2FkZCA9IGN0eC0+aW5mby5tYWlsYm94X3N0YXJ0OworCisJcnNyYyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwKKwkJCQkJY3R4LT5wZGF0YS0+cmVzX2luZm8tPmFjcGlfZGRyX2luZGV4KTsKKwlpZiAoIXJzcmMpIHsKKwkJZGV2X2VycihjdHgtPmRldiwgIkludmFsaWQgRERSIGJhc2UgZnJvbSBJRldJIik7CisJCXJldHVybiAtRUlPOworCX0KKwljdHgtPmRkcl9iYXNlID0gcnNyYy0+c3RhcnQ7CisJY3R4LT5kZHJfZW5kID0gcnNyYy0+ZW5kOworCWRldl9pbmZvKGN0eC0+ZGV2LCAiRERSIGJhc2U6ICUjeCIsIGN0eC0+ZGRyX2Jhc2UpOworCWN0eC0+ZGRyID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoY3R4LT5kZXYsIGN0eC0+ZGRyX2Jhc2UsCisJCQkJCXJlc291cmNlX3NpemUocnNyYykpOworCWlmICghY3R4LT5kZHIpIHsKKwkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgRERSIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIEZpbmQgdGhlIElSUSAqLworCWN0eC0+aXJxX251bSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwKKwkJCQljdHgtPnBkYXRhLT5yZXNfaW5mby0+YWNwaV9pcGNfaXJxX2luZGV4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIHNzdF9hY3BpX21hY2hfbWF0Y2goYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbGV2ZWwsCisJCQkJICAgICAgIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXQpCit7CisJKihib29sICopY29udGV4dCA9IHRydWU7CisJcmV0dXJuIEFFX09LOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9tYWNoaW5lcyAqc3N0X2FjcGlfZmluZF9tYWNoaW5lKAorCXN0cnVjdCBzc3RfbWFjaGluZXMgKm1hY2hpbmVzKQoreworCXN0cnVjdCBzc3RfbWFjaGluZXMgKm1hY2g7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJZm9yIChtYWNoID0gbWFjaGluZXM7IG1hY2gtPmNvZGVjX2lkOyBtYWNoKyspCisJCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfZGV2aWNlcyhtYWNoLT5jb2RlY19pZCwKKwkJCQkJCSAgc3N0X2FjcGlfbWFjaF9tYXRjaCwKKwkJCQkJCSAgJmZvdW5kLCBOVUxMKSkgJiYgZm91bmQpCisJCQlyZXR1cm4gbWFjaDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHNzdF9hY3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4OworCWNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaWQ7CisJc3RydWN0IHNzdF9tYWNoaW5lcyAqbWFjaDsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICptZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBsYXRfZGV2OworCXVuc2lnbmVkIGludCBkZXZfaWQ7CisKKwlpZCA9IGFjcGlfbWF0Y2hfZGV2aWNlKGRldi0+ZHJpdmVyLT5hY3BpX21hdGNoX3RhYmxlLCBkZXYpOworCWlmICghaWQpCisJCXJldHVybiAtRU5PREVWOworCWRldl9kYmcoZGV2LCAiZm9yICVzIiwgaWQtPmlkKTsKKworCW1hY2ggPSAoc3RydWN0IHNzdF9tYWNoaW5lcyAqKWlkLT5kcml2ZXJfZGF0YTsKKwltYWNoID0gc3N0X2FjcGlfZmluZF9tYWNoaW5lKG1hY2gpOworCWlmIChtYWNoID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJObyBtYXRjaGluZyBtYWNoaW5lIGRyaXZlciBmb3VuZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IGtzdHJ0b3VpbnQoaWQtPmlkLCAxNiwgJmRldl9pZCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJVbmlxdWUgZGV2aWNlIGlkIGNvbnZlcnNpb24gZXJyb3I6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRldl9kYmcoZGV2LCAiQUNQSSBkZXZpY2UgaWQ6ICV4XG4iLCBkZXZfaWQpOworCisJcGxhdF9kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShkZXYsIG1hY2gtPnBkYXRhLT5wbGF0Zm9ybSwgLTEsIE5VTEwsIDApOworCWlmIChJU19FUlIocGxhdF9kZXYpKSB7CisJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBtYWNoaW5lIGRldmljZTogJXNcbiIsIG1hY2gtPnBkYXRhLT5wbGF0Zm9ybSk7CisJCXJldHVybiBQVFJfRVJSKHBsYXRfZGV2KTsKKwl9CisKKwkvKiBDcmVhdGUgcGxhdGZvcm0gZGV2aWNlIGZvciBzc3QgbWFjaGluZSBkcml2ZXIgKi8KKwltZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX2RhdGEoZGV2LCBtYWNoLT5tYWNoaW5lLCAtMSwgTlVMTCwgMCk7CisJaWYgKElTX0VSUihtZGV2KSkgeworCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBjcmVhdGUgbWFjaGluZSBkZXZpY2U6ICVzXG4iLCBtYWNoLT5tYWNoaW5lKTsKKwkJcmV0dXJuIFBUUl9FUlIobWRldik7CisJfQorCisJcmV0ID0gc3N0X2FsbG9jX2Rydl9jb250ZXh0KCZjdHgsIGRldiwgZGV2X2lkKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEZpbGwgc3N0IHBsYXRmb3JtIGRhdGEgKi8KKwljdHgtPnBkYXRhID0gbWFjaC0+cGRhdGE7CisJc3RyY3B5KGN0eC0+ZmlybXdhcmVfbmFtZSwgbWFjaC0+ZmlybXdhcmUpOworCisJcmV0ID0gc3N0X3BsYXRmb3JtX2dldF9yZXNvdXJjZXMoY3R4KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gc3N0X2NvbnRleHRfaW5pdChjdHgpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogbmVlZCB0byBzYXZlIHNoaW0gcmVnaXN0ZXJzIGluIEJZVCAqLworCWN0eC0+c2hpbV9yZWdzNjQgPSBkZXZtX2t6YWxsb2MoY3R4LT5kZXYsIHNpemVvZigqY3R4LT5zaGltX3JlZ3M2NCksCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghY3R4LT5zaGltX3JlZ3M2NCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRvX3NzdF9jbGVhbnVwOworCX0KKworCXNzdF9jb25maWd1cmVfcnVudGltZV9wbShjdHgpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0eCk7CisJcmV0dXJuIHJldDsKKworZG9fc3N0X2NsZWFudXA6CisJc3N0X2NvbnRleHRfY2xlYW51cChjdHgpOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWRldl9lcnIoY3R4LT5kZXYsICJmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyogaW50ZWxfc3N0X3JlbW92ZSAtIHJlbW92ZSBmdW5jdGlvbgorKgorKiBAcGRldjoJcGxhdGZvcm0gZGV2aWNlIHN0cnVjdHVyZQorKgorKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBPUyB3aGVuIGEgZGV2aWNlIGlzIHVubG9hZGVkCisqIFRoaXMgZnJlZXMgdGhlIGludGVycnVwdCBldGMKKyovCitzdGF0aWMgaW50IHNzdF9hY3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHg7CisKKwljdHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzc3RfY29udGV4dF9jbGVhbnVwKGN0eCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X21hY2hpbmVzIHNzdF9hY3BpX2J5dGNyW10gPSB7CisJeyIxMEVDNTY0MCIsICJUMTAwIiwgImJ5dHQxMDBfcnQ1NjQwIiwgTlVMTCwgImludGVsL2Z3X3NzdF8wZjI4LmJpbiIsCisJCQkJCQkmYnl0X3J2cF9wbGF0Zm9ybV9kYXRhIH0sCisJe30sCit9OworCisvKiBDaGVycnl2aWV3LWJhc2VkIHBsYXRmb3JtczogQ2hlcnJ5VHJhaWwgYW5kIEJyYXN3ZWxsICovCitzdGF0aWMgc3RydWN0IHNzdF9tYWNoaW5lcyBzc3RfYWNwaV9jaHZbXSA9IHsKKwl7IjEwRUM1NjcwIiwgImNodC1ic3ciLCAiY2h0LWJzdy1ydDU2NzIiLCBOVUxMLCAiaW50ZWwvZndfc3N0XzIyYTguYmluIiwKKwkJCQkJCSZjaHZfcGxhdGZvcm1fZGF0YSB9LAorCXsiMTBFQzU2NDUiLCAiY2h0LWJzdyIsICJjaHQtYnN3LXJ0NTY0NSIsIE5VTEwsICJpbnRlbC9md19zc3RfMjJhOC5iaW4iLAorCQkJCQkJJmNodl9wbGF0Zm9ybV9kYXRhIH0sCisJe30sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHNzdF9hY3BpX2lkc1tdID0geworCXsgIjgwODYwRjI4IiwgKHVuc2lnbmVkIGxvbmcpJnNzdF9hY3BpX2J5dGNyfSwKKwl7ICI4MDg2MjJBOCIsICh1bnNpZ25lZCBsb25nKSAmc3N0X2FjcGlfY2h2fSwKKwl7IH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHNzdF9hY3BpX2lkcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNzdF9hY3BpX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQkJCT0gImludGVsX3NzdF9hY3BpIiwKKwkJLmFjcGlfbWF0Y2hfdGFibGUJPSBBQ1BJX1BUUihzc3RfYWNwaV9pZHMpLAorCQkucG0JCQk9ICZpbnRlbF9zc3RfcG0sCisJfSwKKwkucHJvYmUJPSBzc3RfYWNwaV9wcm9iZSwKKwkucmVtb3ZlCT0gc3N0X2FjcGlfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzc3RfYWNwaV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIChSKSBTU1QoUikgQXVkaW8gRW5naW5lIEFDUEkgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJSYW1lc2ggQmFidSBLIFYiKTsKK01PRFVMRV9BVVRIT1IoIk9tYWlyIE1vaGFtbWVkIEFiZHVsbGFoIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInNzdCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9kcnZfaW50ZXJmYWNlLmMgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X2Rydl9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjUwYTlkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9kcnZfaW50ZXJmYWNlLmMKQEAgLTAsMCArMSw3NDEgQEAKKy8qCisgKiAgc3N0X2Rydl9pbnRlcmZhY2UuYyAtIEludGVsIFNTVCBEcml2ZXIgZm9yIGF1ZGlvIGVuZ2luZQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMTQgSW50ZWwgQ29ycAorICogIEF1dGhvcnM6CVZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPgorICoJCUhhcnNoYSBQcml5YSA8cHJpeWEuaGFyc2hhQGludGVsLmNvbT4KKyAqCQlEaGFyYWdlc3dhcmkgUiA8ZGhhcmFnZXN3YXJpLnJAaW50ZWwuY29tKQorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgorI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb21wcmVzc19kcml2ZXIuaD4KKyNpbmNsdWRlIDxhc20vcGxhdGZvcm1fc3N0X2F1ZGlvLmg+CisjaW5jbHVkZSAiLi4vc3N0LW1mbGQtcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJzc3QuaCIKKyNpbmNsdWRlICIuLi8uLi9jb21tb24vc3N0LWRzcC5oIgorCisKKworI2RlZmluZSBOVU1fQ09ERUMgMgorI2RlZmluZSBNSU5fRlJBR01FTlQgMgorI2RlZmluZSBNQVhfRlJBR01FTlQgNAorI2RlZmluZSBNSU5fRlJBR01FTlRfU0laRSAoNTAgKiAxMDI0KQorI2RlZmluZSBNQVhfRlJBR01FTlRfU0laRSAoMTAyNCAqIDEwMjQpCisjZGVmaW5lIFNTVF9HRVRfQllURVNfUEVSX1NBTVBMRShwY21fd2Rfc3opICAoKChwY21fd2Rfc3ogKyAxNSkgPj4gNCkgPDwgMSkKKworaW50IGZyZWVfc3RyZWFtX2NvbnRleHQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgdW5zaWduZWQgaW50IHN0cl9pZCkKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKKwlpbnQgcmV0ID0gMDsKKworCXN0cmVhbSA9IGdldF9zdHJlYW1faW5mbyhjdHgsIHN0cl9pZCk7CisJaWYgKHN0cmVhbSkgeworCQkvKiBzdHJfaWQgaXMgdmFsaWQsIHNvIHN0cmVhbSBpcyBhbGxvYWN0ZWQgKi8KKwkJcmV0ID0gc3N0X2ZyZWVfc3RyZWFtKGN0eCwgc3RyX2lkKTsKKwkJaWYgKHJldCkKKwkJCXNzdF9jbGVhbl9zdHJlYW0oJmN0eC0+c3RyZWFtc1tzdHJfaWRdKTsKKwkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAid2UgdHJpZWQgdG8gZnJlZSBzdHJlYW0gY29udGV4dCAlZCB3aGljaCB3YXMgZnJlZWQhISFcbiIsIHN0cl9pZCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBzc3RfZ2V0X3N0cmVhbV9hbGxvY2F0ZWQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwKKwlzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbSwKKwlzdHJ1Y3Qgc25kX3NzdF9saWJfZG93bmxvYWQgKipsaWJfZG5sZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gY3R4LT5vcHMtPmFsbG9jX3N0cmVhbShjdHgsIHN0cl9wYXJhbSk7CisJaWYgKHJldHZhbCA+IDApCisJCWRldl9kYmcoY3R4LT5kZXYsICJTdHJlYW0gYWxsb2NhdGVkICVkXG4iLCByZXR2YWwpOworCXJldHVybiByZXR2YWw7CisKK30KKworLyoKKyAqIHNzdF9nZXRfc2ZyZXEgLSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3RyZWFtCisgKgorICogQHN0cl9wYXJhbSA6IHN0cmVhbSBwYXJhbXMKKyAqLworaW50IHNzdF9nZXRfc2ZyZXEoc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pCit7CisJc3dpdGNoIChzdHJfcGFyYW0tPmNvZGVjKSB7CisJY2FzZSBTU1RfQ09ERUNfVFlQRV9QQ006CisJCXJldHVybiBzdHJfcGFyYW0tPnNwYXJhbXMudWMucGNtX3BhcmFtcy5zZnJlcTsKKwljYXNlIFNTVF9DT0RFQ19UWVBFX0FBQzoKKwkJcmV0dXJuIHN0cl9wYXJhbS0+c3BhcmFtcy51Yy5hYWNfcGFyYW1zLmV4dGVybmFsc3I7CisJY2FzZSBTU1RfQ09ERUNfVFlQRV9NUDM6CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworLyoKKyAqIHNzdF9nZXRfbnVtX2NoYW5uZWwgLSBnZXQgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGUgc3RyZWFtCisgKgorICogQHN0cl9wYXJhbSA6IHN0cmVhbSBwYXJhbXMKKyAqLworaW50IHNzdF9nZXRfbnVtX2NoYW5uZWwoc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pCit7CisJc3dpdGNoIChzdHJfcGFyYW0tPmNvZGVjKSB7CisJY2FzZSBTU1RfQ09ERUNfVFlQRV9QQ006CisJCXJldHVybiBzdHJfcGFyYW0tPnNwYXJhbXMudWMucGNtX3BhcmFtcy5udW1fY2hhbjsKKwljYXNlIFNTVF9DT0RFQ19UWVBFX01QMzoKKwkJcmV0dXJuIHN0cl9wYXJhbS0+c3BhcmFtcy51Yy5tcDNfcGFyYW1zLm51bV9jaGFuOworCWNhc2UgU1NUX0NPREVDX1RZUEVfQUFDOgorCQlyZXR1cm4gc3RyX3BhcmFtLT5zcGFyYW1zLnVjLmFhY19wYXJhbXMubnVtX2NoYW47CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCisvKgorICogc3N0X2dldF9zdHJlYW0gLSB0aGlzIGZ1bmN0aW9uIHByZXBhcmVzIGZvciBzdHJlYW0gYWxsb2NhdGlvbgorICoKKyAqIEBzdHJfcGFyYW0gOiBzdHJlYW0gcGFyYW0KKyAqLworaW50IHNzdF9nZXRfc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsCisJCQlzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbSkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm87CisKKwkvKiBzdHJlYW0gaXMgbm90IGFsbG9jYXRlZCwgd2UgYXJlIGFsbG9jYXRpbmcgKi8KKwlyZXR2YWwgPSBjdHgtPm9wcy0+YWxsb2Nfc3RyZWFtKGN0eCwgc3RyX3BhcmFtKTsKKwlpZiAocmV0dmFsIDw9IDApIHsKKwkJcmV0dXJuIC1FSU87CisJfQorCS8qIHN0b3JlIHNhbXBsaW5nIGZyZXEgKi8KKwlzdHJfaW5mbyA9ICZjdHgtPnN0cmVhbXNbcmV0dmFsXTsKKwlzdHJfaW5mby0+c2ZyZXEgPSBzc3RfZ2V0X3NmcmVxKHN0cl9wYXJhbSk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50IHNzdF9wb3dlcl9jb250cm9sKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldCA9IDA7CisJaW50IHVzYWdlX2NvdW50ID0gMDsKKworI2lmZGVmIENPTkZJR19QTQorCXVzYWdlX2NvdW50ID0gYXRvbWljX3JlYWQoJmRldi0+cG93ZXIudXNhZ2VfY291bnQpOworI2Vsc2UKKwl1c2FnZV9jb3VudCA9IDE7CisjZW5kaWYKKworCWlmIChzdGF0ZSA9PSB0cnVlKSB7CisJCXJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKKworCQlkZXZfZGJnKGN0eC0+ZGV2LCAiRW5hYmxlOiBwbSB1c2FnZSBjb3VudDogJWRcbiIsIHVzYWdlX2NvdW50KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoY3R4LT5kZXYsICJSdW50aW1lIGdldCBmYWlsZWQgd2l0aCBlcnI6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoKGN0eC0+c3N0X3N0YXRlID09IFNTVF9SRVNFVCkgJiYgKHVzYWdlX2NvdW50ID09IDEpKSB7CisJCQlyZXQgPSBzc3RfbG9hZF9mdyhjdHgpOworCQkJaWYgKHJldCkgeworCQkJCWRldl9lcnIoZGV2LCAiRlcgZG93bmxvYWQgZmFpbCAlZFxuIiwgcmV0KTsKKwkJCQlzc3Rfc2V0X2Z3X3N0YXRlX2xvY2tlZChjdHgsIFNTVF9SRVNFVCk7CisJCQkJcmV0ID0gc3N0X3BtX3J1bnRpbWVfcHV0KGN0eCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlkZXZfZGJnKGN0eC0+ZGV2LCAiRGlzYWJsZTogcG0gdXNhZ2UgY291bnQ6ICVkXG4iLCB1c2FnZV9jb3VudCk7CisJCXJldHVybiBzc3RfcG1fcnVudGltZV9wdXQoY3R4KTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHNzdF9vcGVuX3BjbV9zdHJlYW0gLSBPcGVuIFBDTSBpbnRlcmZhY2UKKyAqCisgKiBAc3RyX3BhcmFtOiBwYXJhbWV0ZXJzIG9mIHBjbSBzdHJlYW0KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBNSUQgc291bmQgY2FyZCBkcml2ZXIgdG8gb3BlbgorICogYSBuZXcgcGNtIGludGVyZmFjZQorICovCitzdGF0aWMgaW50IHNzdF9vcGVuX3BjbV9zdHJlYW0oc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbSkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghc3RyX3BhcmFtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHZhbCA9IHNzdF9nZXRfc3RyZWFtKGN0eCwgc3RyX3BhcmFtKTsKKwlpZiAocmV0dmFsID4gMCkKKwkJY3R4LT5zdHJlYW1fY250Kys7CisJZWxzZQorCQlkZXZfZXJyKGN0eC0+ZGV2LCAic3N0X2dldF9zdHJlYW0gcmV0dXJuZWQgZXJyICVkXG4iLCByZXR2YWwpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBzc3RfY2Rldl9vcGVuKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW1zLCBzdHJ1Y3Qgc3N0X2NvbXByZXNzX2NiICpjYikKK3sKKwlpbnQgc3RyX2lkLCByZXR2YWw7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CisJc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dmFsID0gcG1fcnVudGltZV9nZXRfc3luYyhjdHgtPmRldik7CisJaWYgKHJldHZhbCA8IDApCisJCXJldHVybiByZXR2YWw7CisKKwlzdHJfaWQgPSBzc3RfZ2V0X3N0cmVhbShjdHgsIHN0cl9wYXJhbXMpOworCWlmIChzdHJfaWQgPiAwKSB7CisJCWRldl9kYmcoZGV2LCAic3RyZWFtIGFsbG9jYXRlZCBpbiBzc3RfY2Rldl9vcGVuICVkXG4iLCBzdHJfaWQpOworCQlzdHJlYW0gPSAmY3R4LT5zdHJlYW1zW3N0cl9pZF07CisJCXN0cmVhbS0+Y29tcHJfY2IgPSBjYi0+Y29tcHJfY2I7CisJCXN0cmVhbS0+Y29tcHJfY2JfcGFyYW0gPSBjYi0+cGFyYW07CisJCXN0cmVhbS0+ZHJhaW5fbm90aWZ5ID0gY2ItPmRyYWluX25vdGlmeTsKKwkJc3RyZWFtLT5kcmFpbl9jYl9wYXJhbSA9IGNiLT5kcmFpbl9jYl9wYXJhbTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGRldiwgInN0cmVhbSBlbmNvdW50ZXJlZCBlcnJvciBkdXJpbmcgYWxsb2MgJWRcbiIsIHN0cl9pZCk7CisJCXN0cl9pZCA9IC1FSU5WQUw7CisJCXNzdF9wbV9ydW50aW1lX3B1dChjdHgpOworCX0KKwlyZXR1cm4gc3RyX2lkOworfQorCitzdGF0aWMgaW50IHNzdF9jZGV2X2Nsb3NlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCkKK3sKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOworCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXN0cmVhbSA9IGdldF9zdHJlYW1faW5mbyhjdHgsIHN0cl9pZCk7CisJaWYgKCFzdHJlYW0pIHsKKwkJZGV2X2VycihkZXYsICJzdHJlYW0gaW5mbyBpcyBOVUxMIGZvciBzdHIgJWQhISFcbiIsIHN0cl9pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChzdHJlYW0tPnN0YXR1cyA9PSBTVFJFQU1fUkVTRVQpIHsKKwkJZGV2X2RiZyhkZXYsICJzdHJlYW0gaW4gcmVzZXQgc3RhdGUuLi5cbiIpOworCQlzdHJlYW0tPnN0YXR1cyA9IFNUUkVBTV9VTl9JTklUOworCisJCXJldHZhbCA9IDA7CisJCWdvdG8gcHV0OworCX0KKworCXJldHZhbCA9IHNzdF9mcmVlX3N0cmVhbShjdHgsIHN0cl9pZCk7CitwdXQ6CisJc3RyZWFtLT5jb21wcl9jYl9wYXJhbSA9IE5VTEw7CisJc3RyZWFtLT5jb21wcl9jYiA9IE5VTEw7CisKKwlpZiAocmV0dmFsKQorCQlkZXZfZXJyKGRldiwgImZyZWUgc3RyZWFtIHJldHVybmVkIGVyciAlZFxuIiwgcmV0dmFsKTsKKworCWRldl9kYmcoZGV2LCAiRW5kXG4iKTsKKwlyZXR1cm4gcmV0dmFsOworCit9CisKK3N0YXRpYyBpbnQgc3N0X2NkZXZfYWNrKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCwKKwkJdW5zaWduZWQgbG9uZyBieXRlcykKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3NzdF90c3RhbXAgZndfdHN0YW1wID0gezAsfTsKKwlpbnQgb2Zmc2V0OworCXZvaWQgX19pb21lbSAqYWRkcjsKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlzdHJlYW0gPSBnZXRfc3RyZWFtX2luZm8oY3R4LCBzdHJfaWQpOworCWlmICghc3RyZWFtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHVwZGF0ZSBieXRlcyBzZW50ICovCisJc3RyZWFtLT5jdW1tX2J5dGVzICs9IGJ5dGVzOworCWRldl9kYmcoZGV2LCAiYnl0ZXMgY29waWVkICVkIGluYyBieSAlbGRcbiIsIHN0cmVhbS0+Y3VtbV9ieXRlcywgYnl0ZXMpOworCisJbWVtY3B5X2Zyb21pbygmZndfdHN0YW1wLAorCQkoKHZvaWQgKikoY3R4LT5tYWlsYm94ICsgY3R4LT50c3RhbXApCisJCSsoc3RyX2lkICogc2l6ZW9mKGZ3X3RzdGFtcCkpKSwKKwkJc2l6ZW9mKGZ3X3RzdGFtcCkpOworCisJZndfdHN0YW1wLmJ5dGVzX2NvcGllZCA9IHN0cmVhbS0+Y3VtbV9ieXRlczsKKwlkZXZfZGJnKGRldiwgImJ5dGVzIHNlbnQgdG8gZncgJWxsdSBpbmMgYnkgJWxkXG4iLAorCQkJZndfdHN0YW1wLmJ5dGVzX2NvcGllZCwgYnl0ZXMpOworCisJYWRkciA9ICAoKHZvaWQgKikoY3R4LT5tYWlsYm94ICsgY3R4LT50c3RhbXApKSArCisJCQkoc3RyX2lkICogc2l6ZW9mKGZ3X3RzdGFtcCkpOworCW9mZnNldCA9ICBvZmZzZXRvZihzdHJ1Y3Qgc25kX3NzdF90c3RhbXAsIGJ5dGVzX2NvcGllZCk7CisJc3N0X3NoaW1fd3JpdGUoYWRkciwgb2Zmc2V0LCBmd190c3RhbXAuYnl0ZXNfY29waWVkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfY2Rldl9zZXRfbWV0YWRhdGEoc3RydWN0IGRldmljZSAqZGV2LAorCQl1bnNpZ25lZCBpbnQgc3RyX2lkLCBzdHJ1Y3Qgc25kX2NvbXByX21ldGFkYXRhICptZXRhZGF0YSkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvOworCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWRldl9kYmcoZGV2LCAic2V0IG1ldGFkYXRhIGZvciBzdHJlYW0gJWRcbiIsIHN0cl9pZCk7CisKKwlzdHJfaW5mbyA9IGdldF9zdHJlYW1faW5mbyhjdHgsIHN0cl9pZCk7CisJaWYgKCFzdHJfaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfZGJnKGRldiwgInBpcGUgaWQgPSAlZFxuIiwgc3RyX2luZm8tPnBpcGVfaWQpOworCXJldHZhbCA9IHNzdF9wcmVwYXJlX2FuZF9wb3N0X21zZyhjdHgsIHN0cl9pbmZvLT50YXNrX2lkLCBJUENfQ01ELAorCQkJSVBDX0lBX1NFVF9TVFJFQU1fUEFSQU1TX01SRkxELCBzdHJfaW5mby0+cGlwZV9pZCwKKwkJCXNpemVvZigqbWV0YWRhdGEpLCBtZXRhZGF0YSwgTlVMTCwKKwkJCXRydWUsIHRydWUsIHRydWUsIGZhbHNlKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2NkZXZfc3RyZWFtX3BhdXNlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCkKK3sKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3N0X3BhdXNlX3N0cmVhbShjdHgsIHN0cl9pZCk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2NkZXZfc3RyZWFtX3BhdXNlX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQl1bnNpZ25lZCBpbnQgc3RyX2lkKQoreworCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBzc3RfcmVzdW1lX3N0cmVhbShjdHgsIHN0cl9pZCk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2NkZXZfc3RyZWFtX3N0YXJ0KHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCkKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvOworCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXN0cl9pbmZvID0gZ2V0X3N0cmVhbV9pbmZvKGN0eCwgc3RyX2lkKTsKKwlpZiAoIXN0cl9pbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzdHJfaW5mby0+cHJldiA9IHN0cl9pbmZvLT5zdGF0dXM7CisJc3RyX2luZm8tPnN0YXR1cyA9IFNUUkVBTV9SVU5OSU5HOworCXJldHVybiBzc3Rfc3RhcnRfc3RyZWFtKGN0eCwgc3RyX2lkKTsKK30KKworc3RhdGljIGludCBzc3RfY2Rldl9zdHJlYW1fZHJvcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQpCit7CisJc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHNzdF9kcm9wX3N0cmVhbShjdHgsIHN0cl9pZCk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2NkZXZfc3RyZWFtX2RyYWluKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCkKK3sKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3N0X2RyYWluX3N0cmVhbShjdHgsIHN0cl9pZCwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IHNzdF9jZGV2X3N0cmVhbV9wYXJ0aWFsX2RyYWluKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJdW5zaWduZWQgaW50IHN0cl9pZCkKK3sKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3N0X2RyYWluX3N0cmVhbShjdHgsIHN0cl9pZCwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2NkZXZfdHN0YW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCwKKwkJc3RydWN0IHNuZF9jb21wcl90c3RhbXAgKnRzdGFtcCkKK3sKKwlzdHJ1Y3Qgc25kX3NzdF90c3RhbXAgZndfdHN0YW1wID0gezAsfTsKKwlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwltZW1jcHlfZnJvbWlvKCZmd190c3RhbXAsCisJCSgodm9pZCAqKShjdHgtPm1haWxib3ggKyBjdHgtPnRzdGFtcCkKKwkJKyhzdHJfaWQgKiBzaXplb2YoZndfdHN0YW1wKSkpLAorCQlzaXplb2YoZndfdHN0YW1wKSk7CisKKwlzdHJlYW0gPSBnZXRfc3RyZWFtX2luZm8oY3R4LCBzdHJfaWQpOworCWlmICghc3RyZWFtKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlkZXZfZGJnKGRldiwgInJiX2NvdW50ZXIgJWxsdSBpbiBieXRlc1xuIiwgZndfdHN0YW1wLnJpbmdfYnVmZmVyX2NvdW50ZXIpOworCisJdHN0YW1wLT5jb3BpZWRfdG90YWwgPSBmd190c3RhbXAucmluZ19idWZmZXJfY291bnRlcjsKKwl0c3RhbXAtPnBjbV9mcmFtZXMgPSBmd190c3RhbXAuZnJhbWVzX2RlY29kZWQ7CisJdHN0YW1wLT5wY21faW9fZnJhbWVzID0gZGl2X3U2NChmd190c3RhbXAuaGFyZHdhcmVfY291bnRlciwKKwkJCSh1NjQpc3RyZWFtLT5udW1fY2ggKiBTU1RfR0VUX0JZVEVTX1BFUl9TQU1QTEUoMjQpKTsKKwl0c3RhbXAtPnNhbXBsaW5nX3JhdGUgPSBmd190c3RhbXAuc2FtcGxpbmdfZnJlcXVlbmN5OworCisJZGV2X2RiZyhkZXYsICJQQ00gID0gJXVcbiIsIHRzdGFtcC0+cGNtX2lvX2ZyYW1lcyk7CisJZGV2X2RiZyhkZXYsICJQdHIgUXVlcnkgb24gc3RyaWQgPSAlZCAgY29waWVkX3RvdGFsICVkLCBkZWNvZGVjICVkXG4iLAorCQlzdHJfaWQsIHRzdGFtcC0+Y29waWVkX3RvdGFsLCB0c3RhbXAtPnBjbV9mcmFtZXMpOworCWRldl9kYmcoZGV2LCAicmVuZGVyZWQgJWRcbiIsIHRzdGFtcC0+cGNtX2lvX2ZyYW1lcyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfY2Rldl9jYXBzKHN0cnVjdCBzbmRfY29tcHJfY2FwcyAqY2FwcykKK3sKKwljYXBzLT5udW1fY29kZWNzID0gTlVNX0NPREVDOworCWNhcHMtPm1pbl9mcmFnbWVudF9zaXplID0gTUlOX0ZSQUdNRU5UX1NJWkU7ICAvKiA1MEtCICovCisJY2Fwcy0+bWF4X2ZyYWdtZW50X3NpemUgPSBNQVhfRlJBR01FTlRfU0laRTsgIC8qIDEwMjRLQiAqLworCWNhcHMtPm1pbl9mcmFnbWVudHMgPSBNSU5fRlJBR01FTlQ7CisJY2Fwcy0+bWF4X2ZyYWdtZW50cyA9IE1BWF9GUkFHTUVOVDsKKwljYXBzLT5jb2RlY3NbMF0gPSBTTkRfQVVESU9DT0RFQ19NUDM7CisJY2Fwcy0+Y29kZWNzWzFdID0gU05EX0FVRElPQ09ERUNfQUFDOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9jb21wcl9jb2RlY19jYXBzIGNhcHNfbXAzID0geworCS5udW1fZGVzY3JpcHRvcnMgPSAxLAorCS5kZXNjcmlwdG9yWzBdLm1heF9jaCA9IDIsCisJLmRlc2NyaXB0b3JbMF0uc2FtcGxlX3JhdGVzWzBdID0gNDgwMDAsCisJLmRlc2NyaXB0b3JbMF0uc2FtcGxlX3JhdGVzWzFdID0gNDQxMDAsCisJLmRlc2NyaXB0b3JbMF0uc2FtcGxlX3JhdGVzWzJdID0gMzIwMDAsCisJLmRlc2NyaXB0b3JbMF0uc2FtcGxlX3JhdGVzWzNdID0gMTYwMDAsCisJLmRlc2NyaXB0b3JbMF0uc2FtcGxlX3JhdGVzWzRdID0gODAwMCwKKwkuZGVzY3JpcHRvclswXS5udW1fc2FtcGxlX3JhdGVzID0gNSwKKwkuZGVzY3JpcHRvclswXS5iaXRfcmF0ZVswXSA9IDMyMCwKKwkuZGVzY3JpcHRvclswXS5iaXRfcmF0ZVsxXSA9IDE5MiwKKwkuZGVzY3JpcHRvclswXS5udW1fYml0cmF0ZXMgPSAyLAorCS5kZXNjcmlwdG9yWzBdLnByb2ZpbGVzID0gMCwKKwkuZGVzY3JpcHRvclswXS5tb2RlcyA9IFNORF9BVURJT0NIQU5NT0RFX01QM19TVEVSRU8sCisJLmRlc2NyaXB0b3JbMF0uZm9ybWF0cyA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9jb21wcl9jb2RlY19jYXBzIGNhcHNfYWFjID0geworCS5udW1fZGVzY3JpcHRvcnMgPSAyLAorCS5kZXNjcmlwdG9yWzFdLm1heF9jaCA9IDIsCisJLmRlc2NyaXB0b3JbMF0uc2FtcGxlX3JhdGVzWzBdID0gNDgwMDAsCisJLmRlc2NyaXB0b3JbMF0uc2FtcGxlX3JhdGVzWzFdID0gNDQxMDAsCisJLmRlc2NyaXB0b3JbMF0uc2FtcGxlX3JhdGVzWzJdID0gMzIwMDAsCisJLmRlc2NyaXB0b3JbMF0uc2FtcGxlX3JhdGVzWzNdID0gMTYwMDAsCisJLmRlc2NyaXB0b3JbMF0uc2FtcGxlX3JhdGVzWzRdID0gODAwMCwKKwkuZGVzY3JpcHRvclswXS5udW1fc2FtcGxlX3JhdGVzID0gNSwKKwkuZGVzY3JpcHRvclsxXS5iaXRfcmF0ZVswXSA9IDMyMCwKKwkuZGVzY3JpcHRvclsxXS5iaXRfcmF0ZVsxXSA9IDE5MiwKKwkuZGVzY3JpcHRvclsxXS5udW1fYml0cmF0ZXMgPSAyLAorCS5kZXNjcmlwdG9yWzFdLnByb2ZpbGVzID0gMCwKKwkuZGVzY3JpcHRvclsxXS5tb2RlcyA9IDAsCisJLmRlc2NyaXB0b3JbMV0uZm9ybWF0cyA9CisJCQkoU05EX0FVRElPU1RSRUFNRk9STUFUX01QNEFEVFMgfAorCQkJCVNORF9BVURJT1NUUkVBTUZPUk1BVF9SQVcpLAorfTsKKworc3RhdGljIGludCBzc3RfY2Rldl9jb2RlY19jYXBzKHN0cnVjdCBzbmRfY29tcHJfY29kZWNfY2FwcyAqY29kZWMpCit7CisJaWYgKGNvZGVjLT5jb2RlYyA9PSBTTkRfQVVESU9DT0RFQ19NUDMpCisJCSpjb2RlYyA9IGNhcHNfbXAzOworCWVsc2UgaWYgKGNvZGVjLT5jb2RlYyA9PSBTTkRfQVVESU9DT0RFQ19BQUMpCisJCSpjb2RlYyA9IGNhcHNfYWFjOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzc3RfY2Rldl9mcmFnbWVudF9lbGFwc2VkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsIGludCBzdHJfaWQpCit7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiZnJhZ21lbnQgZWxhcHNlZCBmcm9tIGZpcm13YXJlIGZvciBzdHJfaWQgJWRcbiIsCisJCQlzdHJfaWQpOworCXN0cmVhbSA9ICZjdHgtPnN0cmVhbXNbc3RyX2lkXTsKKwlpZiAoc3RyZWFtLT5jb21wcl9jYikKKwkJc3RyZWFtLT5jb21wcl9jYihzdHJlYW0tPmNvbXByX2NiX3BhcmFtKTsKK30KKworLyoKKyAqIHNzdF9jbG9zZV9wY21fc3RyZWFtIC0gQ2xvc2UgUENNIGludGVyZmFjZQorICoKKyAqIEBzdHJfaWQ6IHN0cmVhbSBpZCB0byBiZSBjbG9zZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBNSUQgc291bmQgY2FyZCBkcml2ZXIgdG8gY2xvc2UKKyAqIGFuIGV4aXN0aW5nIHBjbSBpbnRlcmZhY2UKKyAqLworc3RhdGljIGludCBzc3RfY2xvc2VfcGNtX3N0cmVhbShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQpCit7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc3RyZWFtID0gZ2V0X3N0cmVhbV9pbmZvKGN0eCwgc3RyX2lkKTsKKwlpZiAoIXN0cmVhbSkgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAic3RyZWFtIGluZm8gaXMgTlVMTCBmb3Igc3RyICVkISEhXG4iLCBzdHJfaWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RyZWFtLT5zdGF0dXMgPT0gU1RSRUFNX1JFU0VUKSB7CisJCS8qIHNpbGVudGx5IGZhaWwgaGVyZSBhcyB3ZSBoYXZlIGNsZWFuZWQgdGhlIHN0cmVhbSBlYXJsaWVyICovCisJCWRldl9kYmcoY3R4LT5kZXYsICJzdHJlYW0gaW4gcmVzZXQgc3RhdGUuLi5cbiIpOworCisJCXJldHZhbCA9IDA7CisJCWdvdG8gcHV0OworCX0KKworCXJldHZhbCA9IGZyZWVfc3RyZWFtX2NvbnRleHQoY3R4LCBzdHJfaWQpOworcHV0OgorCXN0cmVhbS0+cGNtX3N1YnN0cmVhbSA9IE5VTEw7CisJc3RyZWFtLT5zdGF0dXMgPSBTVFJFQU1fVU5fSU5JVDsKKwlzdHJlYW0tPnBlcmlvZF9lbGFwc2VkID0gTlVMTDsKKwljdHgtPnN0cmVhbV9jbnQtLTsKKworCWlmIChyZXR2YWwpCisJCWRldl9lcnIoY3R4LT5kZXYsICJmcmVlIHN0cmVhbSByZXR1cm5lZCBlcnIgJWRcbiIsIHJldHZhbCk7CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiRXhpdFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNzdF9jYWxjX3RzdGFtcChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LAorCQlzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICppbmZvLAorCQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9zc3RfdHN0YW1wICpmd190c3RhbXApCit7CisJc2l6ZV90IGRlbGF5X2J5dGVzLCBkZWxheV9mcmFtZXM7CisJc2l6ZV90IGJ1ZmZlcl9zejsKKwl1MzIgcG9pbnRlcl9ieXRlcywgcG9pbnRlcl9zYW1wbGVzOworCisJZGV2X2RiZyhjdHgtPmRldiwgIm1yZmxkIHJpbmdfYnVmZmVyX2NvdW50ZXIgJWxsdSBpbiBieXRlc1xuIiwKKwkJCWZ3X3RzdGFtcC0+cmluZ19idWZmZXJfY291bnRlcik7CisJZGV2X2RiZyhjdHgtPmRldiwgIm1yZmxkIGhhcmR3YXJlX2NvdW50ZXIgJWxsdSBpbiBieXRlc1xuIiwKKwkJCSBmd190c3RhbXAtPmhhcmR3YXJlX2NvdW50ZXIpOworCWlmIChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKQorCQlkZWxheV9ieXRlcyA9IChzaXplX3QpIChmd190c3RhbXAtPnJpbmdfYnVmZmVyX2NvdW50ZXIgLQorCQkJCQlmd190c3RhbXAtPmhhcmR3YXJlX2NvdW50ZXIpOworCWVsc2UKKwkJZGVsYXlfYnl0ZXMgPSAoc2l6ZV90KSAoZndfdHN0YW1wLT5oYXJkd2FyZV9jb3VudGVyIC0KKwkJCQkJZndfdHN0YW1wLT5yaW5nX2J1ZmZlcl9jb3VudGVyKTsKKwlkZWxheV9mcmFtZXMgPSBieXRlc190b19mcmFtZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBkZWxheV9ieXRlcyk7CisJYnVmZmVyX3N6ID0gc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSk7CisJZGl2X3U2NF9yZW0oZndfdHN0YW1wLT5yaW5nX2J1ZmZlcl9jb3VudGVyLCBidWZmZXJfc3osICZwb2ludGVyX2J5dGVzKTsKKwlwb2ludGVyX3NhbXBsZXMgPSBieXRlc190b19zYW1wbGVzKHN1YnN0cmVhbS0+cnVudGltZSwgcG9pbnRlcl9ieXRlcyk7CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAicGNtIGRlbGF5ICV6dSBpbiBieXRlc1xuIiwgZGVsYXlfYnl0ZXMpOworCisJaW5mby0+YnVmZmVyX3B0ciA9IHBvaW50ZXJfc2FtcGxlcyAvIHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7CisKKwlpbmZvLT5wY21fZGVsYXkgPSBkZWxheV9mcmFtZXMgLyBzdWJzdHJlYW0tPnJ1bnRpbWUtPmNoYW5uZWxzOworCWRldl9kYmcoY3R4LT5kZXYsICJidWZmZXIgcHRyICVsbHUgcGNtX2RlbGF5IHJlcDogJWxsdVxuIiwKKwkJCWluZm8tPmJ1ZmZlcl9wdHIsIGluZm8tPnBjbV9kZWxheSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3JlYWRfdGltZXN0YW1wKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3NzdF90c3RhbXAgZndfdHN0YW1wOworCXVuc2lnbmVkIGludCBzdHJfaWQ7CisJc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc3RyX2lkID0gaW5mby0+c3RyX2lkOworCXN0cmVhbSA9IGdldF9zdHJlYW1faW5mbyhjdHgsIHN0cl9pZCk7CisJaWYgKCFzdHJlYW0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFzdHJlYW0tPnBjbV9zdWJzdHJlYW0pCisJCXJldHVybiAtRUlOVkFMOworCXN1YnN0cmVhbSA9IHN0cmVhbS0+cGNtX3N1YnN0cmVhbTsKKworCW1lbWNweV9mcm9taW8oJmZ3X3RzdGFtcCwKKwkJKCh2b2lkICopKGN0eC0+bWFpbGJveCArIGN0eC0+dHN0YW1wKQorCQkJKyAoc3RyX2lkICogc2l6ZW9mKGZ3X3RzdGFtcCkpKSwKKwkJc2l6ZW9mKGZ3X3RzdGFtcCkpOworCXJldHVybiBzc3RfY2FsY190c3RhbXAoY3R4LCBpbmZvLCBzdWJzdHJlYW0sICZmd190c3RhbXApOworfQorCitzdGF0aWMgaW50IHNzdF9zdHJlYW1fc3RhcnQoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc3RyX2lkKQoreworCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm87CisJc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGN0eC0+c3N0X3N0YXRlICE9IFNTVF9GV19SVU5OSU5HKQorCQlyZXR1cm4gMDsKKwlzdHJfaW5mbyA9IGdldF9zdHJlYW1faW5mbyhjdHgsIHN0cl9pZCk7CisJaWYgKCFzdHJfaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3RyX2luZm8tPnByZXYgPSBzdHJfaW5mby0+c3RhdHVzOworCXN0cl9pbmZvLT5zdGF0dXMgPSBTVFJFQU1fUlVOTklORzsKKwlzc3Rfc3RhcnRfc3RyZWFtKGN0eCwgc3RyX2lkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9zdHJlYW1fZHJvcChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzdHJfaWQpCit7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoY3R4LT5zc3Rfc3RhdGUgIT0gU1NUX0ZXX1JVTk5JTkcpCisJCXJldHVybiAwOworCisJc3RyX2luZm8gPSBnZXRfc3RyZWFtX2luZm8oY3R4LCBzdHJfaWQpOworCWlmICghc3RyX2luZm8pCisJCXJldHVybiAtRUlOVkFMOworCXN0cl9pbmZvLT5wcmV2ID0gU1RSRUFNX1VOX0lOSVQ7CisJc3RyX2luZm8tPnN0YXR1cyA9IFNUUkVBTV9JTklUOworCXJldHVybiBzc3RfZHJvcF9zdHJlYW0oY3R4LCBzdHJfaWQpOworfQorCitzdGF0aWMgaW50IHNzdF9zdHJlYW1fcGF1c2Uoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc3RyX2lkKQoreworCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm87CisJc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGN0eC0+c3N0X3N0YXRlICE9IFNTVF9GV19SVU5OSU5HKQorCQlyZXR1cm4gMDsKKworCXN0cl9pbmZvID0gZ2V0X3N0cmVhbV9pbmZvKGN0eCwgc3RyX2lkKTsKKwlpZiAoIXN0cl9pbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzc3RfcGF1c2Vfc3RyZWFtKGN0eCwgc3RyX2lkKTsKK30KKworc3RhdGljIGludCBzc3Rfc3RyZWFtX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzdHJfaWQpCit7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoY3R4LT5zc3Rfc3RhdGUgIT0gU1NUX0ZXX1JVTk5JTkcpCisJCXJldHVybiAwOworCisJc3RyX2luZm8gPSBnZXRfc3RyZWFtX2luZm8oY3R4LCBzdHJfaWQpOworCWlmICghc3RyX2luZm8pCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBzc3RfcmVzdW1lX3N0cmVhbShjdHgsIHN0cl9pZCk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X3N0cmVhbV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqc3RyX2luZm8pCit7CisJaW50IHN0cl9pZCA9IDA7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CisJc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJc3RyX2lkID0gc3RyX2luZm8tPnN0cl9pZDsKKworCWlmIChjdHgtPnNzdF9zdGF0ZSAhPSBTU1RfRldfUlVOTklORykKKwkJcmV0dXJuIDA7CisKKwlzdHJlYW0gPSBnZXRfc3RyZWFtX2luZm8oY3R4LCBzdHJfaWQpOworCWlmICghc3RyZWFtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldl9kYmcoY3R4LT5kZXYsICJzZXR0aW5nIHRoZSBwZXJpb2QgcHRyc1xuIik7CisJc3RyZWFtLT5wY21fc3Vic3RyZWFtID0gc3RyX2luZm8tPmFyZzsKKwlzdHJlYW0tPnBlcmlvZF9lbGFwc2VkID0gc3RyX2luZm8tPnBlcmlvZF9lbGFwc2VkOworCXN0cmVhbS0+c2ZyZXEgPSBzdHJfaW5mby0+c2ZyZXE7CisJc3RyZWFtLT5wcmV2ID0gc3RyZWFtLT5zdGF0dXM7CisJc3RyZWFtLT5zdGF0dXMgPSBTVFJFQU1fSU5JVDsKKwlkZXZfZGJnKGN0eC0+ZGV2LAorCQkicGNtX3N1YnN0cmVhbSAlcCwgcGVyaW9kX2VsYXBzZWQgJXAsIHNmcmVxICVkLCBzdGF0dXMgJWRcbiIsCisJCXN0cmVhbS0+cGNtX3N1YnN0cmVhbSwgc3RyZWFtLT5wZXJpb2RfZWxhcHNlZCwKKwkJc3RyZWFtLT5zZnJlcSwgc3RyZWFtLT5zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzc3Rfc2V0X2J5dGVfc3RyZWFtIC0gU2V0IGdlbmVyaWMgcGFyYW1zCisgKgorICogQGNtZDogY29udHJvbCBjbWQgdG8gYmUgc2V0CisgKiBAYXJnOiBjb21tYW5kIGFyZ3VtZW50CisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgTUlEIHNvdW5kIGNhcmQgZHJpdmVyIHRvIGNvbmZpZ3VyZQorICogU1NUIHJ1bnRpbWUgcGFyYW1zLgorICovCitzdGF0aWMgaW50IHNzdF9zZW5kX2J5dGVfc3RyZWFtKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IHNuZF9zc3RfYnl0ZXNfdjIgKmJ5dGVzKQoreworCWludCByZXRfdmFsID0gMDsKKwlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoTlVMTCA9PSBieXRlcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0X3ZhbCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoY3R4LT5kZXYpOworCWlmIChyZXRfdmFsIDwgMCkKKwkJcmV0dXJuIHJldF92YWw7CisKKwlyZXRfdmFsID0gc3N0X3NlbmRfYnl0ZV9zdHJlYW1fbXJmbGQoY3R4LCBieXRlcyk7CisJc3N0X3BtX3J1bnRpbWVfcHV0KGN0eCk7CisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIHN0cnVjdCBzc3Rfb3BzIHBjbV9vcHMgPSB7CisJLm9wZW4gPSBzc3Rfb3Blbl9wY21fc3RyZWFtLAorCS5zdHJlYW1faW5pdCA9IHNzdF9zdHJlYW1faW5pdCwKKwkuc3RyZWFtX3N0YXJ0ID0gc3N0X3N0cmVhbV9zdGFydCwKKwkuc3RyZWFtX2Ryb3AgPSBzc3Rfc3RyZWFtX2Ryb3AsCisJLnN0cmVhbV9wYXVzZSA9IHNzdF9zdHJlYW1fcGF1c2UsCisJLnN0cmVhbV9wYXVzZV9yZWxlYXNlID0gc3N0X3N0cmVhbV9yZXN1bWUsCisJLnN0cmVhbV9yZWFkX3RzdGFtcCA9IHNzdF9yZWFkX3RpbWVzdGFtcCwKKwkuc2VuZF9ieXRlX3N0cmVhbSA9IHNzdF9zZW5kX2J5dGVfc3RyZWFtLAorCS5jbG9zZSA9IHNzdF9jbG9zZV9wY21fc3RyZWFtLAorCS5wb3dlciA9IHNzdF9wb3dlcl9jb250cm9sLAorfTsKKworc3RhdGljIHN0cnVjdCBjb21wcmVzc19zc3Rfb3BzIGNvbXByX29wcyA9IHsKKwkub3BlbiA9IHNzdF9jZGV2X29wZW4sCisJLmNsb3NlID0gc3N0X2NkZXZfY2xvc2UsCisJLnN0cmVhbV9wYXVzZSA9IHNzdF9jZGV2X3N0cmVhbV9wYXVzZSwKKwkuc3RyZWFtX3BhdXNlX3JlbGVhc2UgPSBzc3RfY2Rldl9zdHJlYW1fcGF1c2VfcmVsZWFzZSwKKwkuc3RyZWFtX3N0YXJ0ID0gc3N0X2NkZXZfc3RyZWFtX3N0YXJ0LAorCS5zdHJlYW1fZHJvcCA9IHNzdF9jZGV2X3N0cmVhbV9kcm9wLAorCS5zdHJlYW1fZHJhaW4gPSBzc3RfY2Rldl9zdHJlYW1fZHJhaW4sCisJLnN0cmVhbV9wYXJ0aWFsX2RyYWluID0gc3N0X2NkZXZfc3RyZWFtX3BhcnRpYWxfZHJhaW4sCisJLnRzdGFtcCA9IHNzdF9jZGV2X3RzdGFtcCwKKwkuYWNrID0gc3N0X2NkZXZfYWNrLAorCS5nZXRfY2FwcyA9IHNzdF9jZGV2X2NhcHMsCisJLmdldF9jb2RlY19jYXBzID0gc3N0X2NkZXZfY29kZWNfY2FwcywKKwkuc2V0X21ldGFkYXRhID0gc3N0X2NkZXZfc2V0X21ldGFkYXRhLAorCS5wb3dlciA9IHNzdF9wb3dlcl9jb250cm9sLAorfTsKKworc3RhdGljIHN0cnVjdCBzc3RfZGV2aWNlIHNzdF9kc3BfZGV2aWNlID0geworCS5uYW1lID0gIkludGVsKFIpIFNTVCBMUEUiLAorCS5kZXYgPSBOVUxMLAorCS5vcHMgPSAmcGNtX29wcywKKwkuY29tcHJfb3BzID0gJmNvbXByX29wcywKK307CisKKy8qCisgKiBzc3RfcmVnaXN0ZXIgLSBmdW5jdGlvbiB0byByZWdpc3RlciBEU1AKKyAqCisgKiBUaGlzIGZ1bmN0aW9ucyByZWdpc3RlcnMgRFNQIHdpdGggdGhlIHBsYXRmb3JtIGRyaXZlcgorICovCitpbnQgc3N0X3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0X3ZhbDsKKworCXNzdF9kc3BfZGV2aWNlLmRldiA9IGRldjsKKwlyZXRfdmFsID0gc3N0X3JlZ2lzdGVyX2RzcCgmc3N0X2RzcF9kZXZpY2UpOworCWlmIChyZXRfdmFsKQorCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byByZWdpc3RlciBEU1Agd2l0aCBwbGF0Zm9ybSBkcml2ZXJcbiIpOworCisJcmV0dXJuIHJldF92YWw7Cit9CisKK2ludCBzc3RfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJcmV0dXJuIHNzdF91bnJlZ2lzdGVyX2RzcCgmc3N0X2RzcF9kZXZpY2UpOworfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9pcGMuYyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfaXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyNzg2MQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfaXBjLmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qCisgKiAgc3N0X2lwYy5jIC0gSW50ZWwgU1NUIERyaXZlciBmb3IgYXVkaW8gZW5naW5lCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOC0xNCBJbnRlbCBDb3Jwb3JhdGlvbgorICogIEF1dGhvcnM6CVZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPgorICoJCUhhcnNoYSBQcml5YSA8cHJpeWEuaGFyc2hhQGludGVsLmNvbT4KKyAqCQlEaGFyYWdlc3dhcmkgUiA8ZGhhcmFnZXN3YXJpLnJAaW50ZWwuY29tPgorICoJCUtQIEplZWphIDxqZWVqYS5rcEBpbnRlbC5jb20+CisgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICovCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb21wcmVzc19kcml2ZXIuaD4KKyNpbmNsdWRlIDxhc20vaW50ZWwtbWlkLmg+CisjaW5jbHVkZSA8YXNtL3BsYXRmb3JtX3NzdF9hdWRpby5oPgorI2luY2x1ZGUgIi4uL3NzdC1tZmxkLXBsYXRmb3JtLmgiCisjaW5jbHVkZSAic3N0LmgiCisjaW5jbHVkZSAiLi4vLi4vY29tbW9uL3NzdC1kc3AuaCIKKworc3RydWN0IHNzdF9ibG9jayAqc3N0X2NyZWF0ZV9ibG9jayhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LAorCQkJCQl1MzIgbXNnX2lkLCB1MzIgZHJ2X2lkKQoreworCXN0cnVjdCBzc3RfYmxvY2sgKm1zZyA9IE5VTEw7CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiRW50ZXJcbiIpOworCW1zZyA9IGt6YWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIE5VTEw7CisJbXNnLT5jb25kaXRpb24gPSBmYWxzZTsKKwltc2ctPm9uID0gdHJ1ZTsKKwltc2ctPm1zZ19pZCA9IG1zZ19pZDsKKwltc2ctPmRydl9pZCA9IGRydl9pZDsKKwlzcGluX2xvY2tfYmgoJmN0eC0+YmxvY2tfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmbXNnLT5ub2RlLCAmY3R4LT5ibG9ja19saXN0KTsKKwlzcGluX3VubG9ja19iaCgmY3R4LT5ibG9ja19sb2NrKTsKKworCXJldHVybiBtc2c7Cit9CisKKy8qCisgKiB3aGlsZSBoYW5kbGluZyB0aGUgaW50ZXJydXB0cywgd2UgbmVlZCB0byBjaGVjayBmb3IgbWVzc2FnZSBzdGF0dXMgYW5kCisgKiB0aGVuIGlmIHdlIGFyZSBibG9ja2luZyBmb3IgYSBtZXNzYWdlCisgKgorICogaGVyZSB3ZSBhcmUgdW5ibG9ja2luZyB0aGUgYmxvY2tlZCBvbmVzLCB0aGlzIGlzIGJhc2VkIG9uIGlkIHdlIGhhdmUKKyAqIHBhc3NlZCBhbmQgc2VhcmNoIHRoYXQgZm9yIGJsb2NrIHRocmVhZHMuCisgKiBXZSB3aWxsIG5vdCBmaW5kIGJsb2NrIGluIHR3byBjYXNlcworICogIGEpIHdoZW4gaXRzIHNtYWxsIG1lc3NhZ2UgYW5kIGJsb2NrIGluIG5vdCB0aGVyZSwgc28gc2lsZW50bHkgaWdub3JlCisgKiAgdGhlbQorICogIGIpIHdoZW4gd2UgYXJlIGFjdHVhbGx5IG5vdCBhYmxlIHRvIGZpbmQgdGhlIGJsb2NrIChidWcgcGVyaGFwcykKKyAqCisgKiAgU2luY2Ugd2UgaGF2ZSBiaXQgb2Ygc21hbGwgbWVzc2FnZXMgd2UgY2FuIHNwYW0ga2VybmVsIGxvZyB3aXRoIGVycgorICogIHByaW50IG9uIGFib3ZlIHNvIG5lZWQgdG8ga2VlcCBhcyBkZWJ1ZyBwcmludHMgd2hpY2ggc2hvdWxkIGJlIGVuYWJsZWQKKyAqICB2aWEgZHluYW1pYyBkZWJ1ZyB3aGlsZSBkZWJ1Z2dpbmcgSVBDIGlzc3VlcworICovCitpbnQgc3N0X3dha2VfdXBfYmxvY2soc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgaW50IHJlc3VsdCwKKwkJdTMyIGRydl9pZCwgdTMyIGlwYywgdm9pZCAqZGF0YSwgdTMyIHNpemUpCit7CisJc3RydWN0IHNzdF9ibG9jayAqYmxvY2sgPSBOVUxMOworCisJZGV2X2RiZyhjdHgtPmRldiwgIkVudGVyXG4iKTsKKworCXNwaW5fbG9ja19iaCgmY3R4LT5ibG9ja19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJsb2NrLCAmY3R4LT5ibG9ja19saXN0LCBub2RlKSB7CisJCWRldl9kYmcoY3R4LT5kZXYsICJCbG9jayBpcGMgJWQsIGRydl9pZCAlZFxuIiwgYmxvY2stPm1zZ19pZCwKKwkJCQkJCQlibG9jay0+ZHJ2X2lkKTsKKwkJaWYgKGJsb2NrLT5tc2dfaWQgPT0gaXBjICYmIGJsb2NrLT5kcnZfaWQgPT0gZHJ2X2lkKSB7CisJCQlkZXZfZGJnKGN0eC0+ZGV2LCAiZnJlZSB1cCB0aGUgYmxvY2tcbiIpOworCQkJYmxvY2stPnJldF9jb2RlID0gcmVzdWx0OworCQkJYmxvY2stPmRhdGEgPSBkYXRhOworCQkJYmxvY2stPnNpemUgPSBzaXplOworCQkJYmxvY2stPmNvbmRpdGlvbiA9IHRydWU7CisJCQlzcGluX3VubG9ja19iaCgmY3R4LT5ibG9ja19sb2NrKTsKKwkJCXdha2VfdXAoJmN0eC0+d2FpdF9xdWV1ZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmY3R4LT5ibG9ja19sb2NrKTsKKwlkZXZfZGJnKGN0eC0+ZGV2LAorCQkiQmxvY2sgbm90IGZvdW5kIG9yIGEgcmVzcG9uc2UgcmVjZWl2ZWQgZm9yIGEgc2hvcnQgbXNnIGZvciBpcGMgJWQsIGRydl9pZCAlZFxuIiwKKwkJaXBjLCBkcnZfaWQpOworCXJldHVybiAtRUlOVkFMOworfQorCitpbnQgc3N0X2ZyZWVfYmxvY2soc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgc3RydWN0IHNzdF9ibG9jayAqZnJlZWQpCit7CisJc3RydWN0IHNzdF9ibG9jayAqYmxvY2sgPSBOVUxMLCAqX19ibG9jazsKKworCWRldl9kYmcoY3R4LT5kZXYsICJFbnRlclxuIik7CisJc3Bpbl9sb2NrX2JoKCZjdHgtPmJsb2NrX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgX19ibG9jaywgJmN0eC0+YmxvY2tfbGlzdCwgbm9kZSkgeworCQlpZiAoYmxvY2sgPT0gZnJlZWQpIHsKKwkJCXByX2RlYnVnKCJwdnRfaWQgZnJlZWQgLS0+ICVkXG4iLCBmcmVlZC0+ZHJ2X2lkKTsKKwkJCS8qIHRvZ2dsZSB0aGUgaW5kZXggcG9zaXRpb24gb2YgcHZ0X2lkICovCisJCQlsaXN0X2RlbCgmZnJlZWQtPm5vZGUpOworCQkJc3Bpbl91bmxvY2tfYmgoJmN0eC0+YmxvY2tfbG9jayk7CisJCQlrZnJlZShmcmVlZC0+ZGF0YSk7CisJCQlmcmVlZC0+ZGF0YSA9IE5VTEw7CisJCQlrZnJlZShmcmVlZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmY3R4LT5ibG9ja19sb2NrKTsKKwlkZXZfZXJyKGN0eC0+ZGV2LCAiYmxvY2sgaXMgYWxyZWFkeSBmcmVlZCEhIVxuIik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBzc3RfcG9zdF9tZXNzYWdlX21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwKKwkJc3RydWN0IGlwY19wb3N0ICppcGNfbXNnLCBib29sIHN5bmMpCit7CisJc3RydWN0IGlwY19wb3N0ICptc2cgPSBpcGNfbXNnOworCXVuaW9uIGlwY19oZWFkZXJfbXJmbGQgaGVhZGVyOworCXVuc2lnbmVkIGludCBsb29wX2NvdW50ID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIkVudGVyOiBzeW5jOiAlZFxuIiwgc3luYyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNzdF9kcnZfY3R4LT5pcGNfc3Bpbl9sb2NrLCBpcnFfZmxhZ3MpOworCWhlYWRlci5mdWxsID0gc3N0X3NoaW1fcmVhZDY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfSVBDWCk7CisJaWYgKHN5bmMpIHsKKwkJd2hpbGUgKGhlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQuYnVzeSkgeworCQkJaWYgKGxvb3BfY291bnQgPiAyNSkgeworCQkJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwKKwkJCQkJInNzdDogQnVzeSB3YWl0IGZhaWxlZCwgY2FudCBzZW5kIHRoaXMgbXNnXG4iKTsKKwkJCQlyZXR2YWwgPSAtRUJVU1k7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQljcHVfcmVsYXgoKTsKKwkJCWxvb3BfY291bnQrKzsKKwkJCWhlYWRlci5mdWxsID0gc3N0X3NoaW1fcmVhZDY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfSVBDWCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAobGlzdF9lbXB0eSgmc3N0X2Rydl9jdHgtPmlwY19kaXNwYXRjaF9saXN0KSkgeworCQkJLyogcXVldWUgaXMgZW1wdHksIG5vdGhpbmcgdG8gc2VuZCAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0X2Rydl9jdHgtPmlwY19zcGluX2xvY2ssIGlycV9mbGFncyk7CisJCQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsCisJCQkJCSJFbXB0eSBtc2cgcXVldWUuLi4gTk8gQWN0aW9uXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGhlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQuYnVzeSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0X2Rydl9jdHgtPmlwY19zcGluX2xvY2ssIGlycV9mbGFncyk7CisJCQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJCdXN5IG5vdCBmcmVlLi4uIHBvc3QgbGF0ZXJcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBjb3B5IG1zZyBmcm9tIGxpc3QgKi8KKwkJbXNnID0gbGlzdF9lbnRyeShzc3RfZHJ2X2N0eC0+aXBjX2Rpc3BhdGNoX2xpc3QubmV4dCwKKwkJCQlzdHJ1Y3QgaXBjX3Bvc3QsIG5vZGUpOworCQlsaXN0X2RlbCgmbXNnLT5ub2RlKTsKKwl9CisJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAic3N0OiBQb3N0IG1lc3NhZ2U6IGhlYWRlciA9ICV4XG4iLAorCQkJCW1zZy0+bXJmbGRfaGVhZGVyLnAuaGVhZGVyX2hpZ2guZnVsbCk7CisJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAic3N0OiBzaXplID0gMHgleFxuIiwKKwkJCW1zZy0+bXJmbGRfaGVhZGVyLnAuaGVhZGVyX2xvd19wYXlsb2FkKTsKKworCWlmIChtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQubGFyZ2UpCisJCW1lbWNweV90b2lvKHNzdF9kcnZfY3R4LT5tYWlsYm94ICsgU1NUX01BSUxCT1hfU0VORCwKKwkJCW1zZy0+bWFpbGJveF9kYXRhLAorCQkJbXNnLT5tcmZsZF9oZWFkZXIucC5oZWFkZXJfbG93X3BheWxvYWQpOworCisJc3N0X3NoaW1fd3JpdGU2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0lQQ1gsIG1zZy0+bXJmbGRfaGVhZGVyLmZ1bGwpOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0X2Rydl9jdHgtPmlwY19zcGluX2xvY2ssIGlycV9mbGFncyk7CisJa2ZyZWUobXNnLT5tYWlsYm94X2RhdGEpOworCWtmcmVlKG1zZyk7CisJcmV0dXJuIHJldHZhbDsKK30KKwordm9pZCBpbnRlbF9zc3RfY2xlYXJfaW50cl9tcmZsZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgpCit7CisJdW5pb24gaW50ZXJydXB0X3JlZ19tcmZsZCBpc3I7CisJdW5pb24gaW50ZXJydXB0X3JlZ19tcmZsZCBpbXI7CisJdW5pb24gaXBjX2hlYWRlcl9tcmZsZCBjbGVhcl9pcGM7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0X2Rydl9jdHgtPmlwY19zcGluX2xvY2ssIGlycV9mbGFncyk7CisJaW1yLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkNjQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9JTVJYKTsKKwlpc3IuZnVsbCA9IHNzdF9zaGltX3JlYWQ2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0lTUlgpOworCisJLyogd3JpdGUgMSB0byBjbGVhciovCisJaXNyLnBhcnQuYnVzeV9pbnRlcnJ1cHQgPSAxOworCXNzdF9zaGltX3dyaXRlNjQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9JU1JYLCBpc3IuZnVsbCk7CisKKwkvKiBTZXQgSUEgZG9uZSBiaXQgKi8KKwljbGVhcl9pcGMuZnVsbCA9IHNzdF9zaGltX3JlYWQ2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0lQQ0QpOworCisJY2xlYXJfaXBjLnAuaGVhZGVyX2hpZ2gucGFydC5idXN5ID0gMDsKKwljbGVhcl9pcGMucC5oZWFkZXJfaGlnaC5wYXJ0LmRvbmUgPSAxOworCWNsZWFyX2lwYy5wLmhlYWRlcl9sb3dfcGF5bG9hZCA9IElQQ19BQ0tfU1VDQ0VTUzsKKwlzc3Rfc2hpbV93cml0ZTY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfSVBDRCwgY2xlYXJfaXBjLmZ1bGwpOworCS8qIHVuIG1hc2sgYnVzeSBpbnRlcnJ1cHQgKi8KKwlpbXIucGFydC5idXN5X2ludGVycnVwdCA9IDA7CisJc3N0X3NoaW1fd3JpdGU2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0lNUlgsIGltci5mdWxsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3RfZHJ2X2N0eC0+aXBjX3NwaW5fbG9jaywgaXJxX2ZsYWdzKTsKK30KKworCisvKgorICogcHJvY2Vzc19md19pbml0IC0gcHJvY2VzcyB0aGUgRlcgaW5pdCBtc2cKKyAqCisgKiBAbXNnOiBJUEMgbWVzc2FnZSBtYWlsYm94IGRhdGEgZnJvbSBGVworICoKKyAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBGVyBpbml0IG1zZyBmcm9tIEZXCisgKiBtYXJrcyBGVyBzdGF0ZSBhbmQgcHJpbnRzIGRlYnVnIGluZm8gb2YgbG9hZGVkIEZXCisgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3NfZndfaW5pdChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsCisJCQl2b2lkICptc2cpCit7CisJc3RydWN0IGlwY19oZWFkZXJfZndfaW5pdCAqaW5pdCA9CisJCShzdHJ1Y3QgaXBjX2hlYWRlcl9md19pbml0ICopbXNnOworCWludCByZXR2YWwgPSAwOworCisJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiKioqIEZXIEluaXQgbXNnIGNhbWUqKipcbiIpOworCWlmIChpbml0LT5yZXN1bHQpIHsKKwkJc3N0X3NldF9md19zdGF0ZV9sb2NrZWQoc3N0X2Rydl9jdHgsIFNTVF9SRVNFVCk7CisJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwgIkZXIEluaXQgZmFpbGVkLCBFcnJvciAleFxuIiwKKwkJCQlpbml0LT5yZXN1bHQpOworCQlyZXR2YWwgPSBpbml0LT5yZXN1bHQ7CisJCWdvdG8gcmV0OworCX0KKworcmV0OgorCXNzdF93YWtlX3VwX2Jsb2NrKHNzdF9kcnZfY3R4LCByZXR2YWwsIEZXX0RXTkxfSUQsIDAgLCBOVUxMLCAwKTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19md19hc3luY19tc2coc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAorCQkJc3RydWN0IGlwY19wb3N0ICptc2cpCit7CisJdTMyIG1zZ19pZDsKKwlpbnQgc3RyX2lkOworCXUzMiBkYXRhX3NpemUsIGk7CisJdm9pZCAqZGF0YV9vZmZzZXQ7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07CisJdW5pb24gaXBjX2hlYWRlcl9oaWdoIG1zZ19oaWdoOworCXUzMiBtc2dfbG93LCBwaXBlX2lkOworCisJbXNnX2hpZ2ggPSBtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9oaWdoOworCW1zZ19sb3cgPSBtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZDsKKwltc2dfaWQgPSAoKHN0cnVjdCBpcGNfZHNwX2hkciAqKW1zZy0+bWFpbGJveF9kYXRhKS0+Y21kX2lkOworCWRhdGFfb2Zmc2V0ID0gKG1zZy0+bWFpbGJveF9kYXRhICsgc2l6ZW9mKHN0cnVjdCBpcGNfZHNwX2hkcikpOworCWRhdGFfc2l6ZSA9ICBtc2dfbG93IC0gKHNpemVvZihzdHJ1Y3QgaXBjX2RzcF9oZHIpKTsKKworCXN3aXRjaCAobXNnX2lkKSB7CisJY2FzZSBJUENfU1NUX1BFUklPRF9FTEFQU0VEX01SRkxEOgorCQlwaXBlX2lkID0gKChzdHJ1Y3QgaXBjX2RzcF9oZHIgKiltc2ctPm1haWxib3hfZGF0YSktPnBpcGVfaWQ7CisJCXN0cl9pZCA9IGdldF9zdHJlYW1faWRfbXJmbGQoc3N0X2Rydl9jdHgsIHBpcGVfaWQpOworCQlpZiAoc3RyX2lkID4gMCkgeworCQkJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LAorCQkJCSJQZXJpb2QgZWxhcHNlZCByY3ZkIGZvciBwaXBlIGlkIDB4JXhcbiIsCisJCQkJcGlwZV9pZCk7CisJCQlzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKKwkJCWlmIChzdHJlYW0tPnBlcmlvZF9lbGFwc2VkKQorCQkJCXN0cmVhbS0+cGVyaW9kX2VsYXBzZWQoc3RyZWFtLT5wY21fc3Vic3RyZWFtKTsKKwkJCWlmIChzdHJlYW0tPmNvbXByX2NiKQorCQkJCXN0cmVhbS0+Y29tcHJfY2Ioc3RyZWFtLT5jb21wcl9jYl9wYXJhbSk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElQQ19JQV9EUkFJTl9TVFJFQU1fTVJGTEQ6CisJCXBpcGVfaWQgPSAoKHN0cnVjdCBpcGNfZHNwX2hkciAqKW1zZy0+bWFpbGJveF9kYXRhKS0+cGlwZV9pZDsKKwkJc3RyX2lkID0gZ2V0X3N0cmVhbV9pZF9tcmZsZChzc3RfZHJ2X2N0eCwgcGlwZV9pZCk7CisJCWlmIChzdHJfaWQgPiAwKSB7CisJCQlzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKKwkJCWlmIChzdHJlYW0tPmRyYWluX25vdGlmeSkKKwkJCQlzdHJlYW0tPmRyYWluX25vdGlmeShzdHJlYW0tPmRyYWluX2NiX3BhcmFtKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgSVBDX0lBX0ZXX0FTWU5DX0VSUl9NUkZMRDoKKwkJZGV2X2Vycihzc3RfZHJ2X2N0eC0+ZGV2LCAiRlcgc2VudCBhc3luYyBlcnJvciBtc2c6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IChkYXRhX3NpemUvNCk7IGkrKykKKwkJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsIE5VTEwsIERVTVBfUFJFRklYX05PTkUsCisJCQkJCTE2LCA0LCBkYXRhX29mZnNldCwgZGF0YV9zaXplLCBmYWxzZSk7CisJCWJyZWFrOworCisJY2FzZSBJUENfSUFfRldfSU5JVF9DTVBMVF9NUkZMRDoKKwkJcHJvY2Vzc19md19pbml0KHNzdF9kcnZfY3R4LCBkYXRhX29mZnNldCk7CisJCWJyZWFrOworCisJY2FzZSBJUENfSUFfQlVGX1VOREVSX1JVTl9NUkZMRDoKKwkJcGlwZV9pZCA9ICgoc3RydWN0IGlwY19kc3BfaGRyICopbXNnLT5tYWlsYm94X2RhdGEpLT5waXBlX2lkOworCQlzdHJfaWQgPSBnZXRfc3RyZWFtX2lkX21yZmxkKHNzdF9kcnZfY3R4LCBwaXBlX2lkKTsKKwkJaWYgKHN0cl9pZCA+IDApCisJCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsCisJCQkJIkJ1ZmZlciB1bmRlci1ydW4gZm9yIHBpcGU6JSN4IHN0cl9pZDolZFxuIiwKKwkJCQlwaXBlX2lkLCBzdHJfaWQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwKKwkJCSJVbnJlY29nbml6ZWQgYXN5bmMgbXNnIGZyb20gRlcgbXNnX2lkICUjeFxuIiwgbXNnX2lkKTsKKwl9Cit9CisKK3ZvaWQgc3N0X3Byb2Nlc3NfcmVwbHlfbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAorCQlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZykKK3sKKwl1bnNpZ25lZCBpbnQgZHJ2X2lkOworCXZvaWQgKmRhdGE7CisJdW5pb24gaXBjX2hlYWRlcl9oaWdoIG1zZ19oaWdoOworCXUzMiBtc2dfbG93OworCXN0cnVjdCBpcGNfZHNwX2hkciAqZHNwX2hkcjsKKwl1bnNpZ25lZCBpbnQgY21kX2lkOworCisJbXNnX2hpZ2ggPSBtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9oaWdoOworCW1zZ19sb3cgPSBtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZDsKKworCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIklQQyBwcm9jZXNzIG1lc3NhZ2UgaGVhZGVyICV4IHBheWxvYWQgJXhcbiIsCisJCQltc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9oaWdoLmZ1bGwsCisJCQltc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZCk7CisKKwlkcnZfaWQgPSBtc2dfaGlnaC5wYXJ0LmRydl9pZDsKKworCS8qIENoZWNrIGZvciBhc3luYyBtZXNzYWdlcyBmaXJzdCAqLworCWlmIChkcnZfaWQgPT0gU1NUX0FTWU5DX0RSVl9JRCkgeworCQkvKkZXIHNlbnQgYXN5bmMgbGFyZ2UgbWVzc2FnZSovCisJCXByb2Nlc3NfZndfYXN5bmNfbXNnKHNzdF9kcnZfY3R4LCBtc2cpOworCQlyZXR1cm47CisJfQorCisJLyogRlcgc2VudCBzaG9ydCBlcnJvciByZXNwb25zZSBmb3IgYW4gSVBDICovCisJaWYgKG1zZ19oaWdoLnBhcnQucmVzdWx0ICYmIGRydl9pZCAmJiAhbXNnX2hpZ2gucGFydC5sYXJnZSkgeworCQkvKiAzMi1iaXQgRlcgZXJyb3IgY29kZSBpbiBtc2dfbG93ICovCisJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwgIkZXIHNlbnQgZXJyb3IgcmVzcG9uc2UgMHgleCIsIG1zZ19sb3cpOworCQlzc3Rfd2FrZV91cF9ibG9jayhzc3RfZHJ2X2N0eCwgbXNnX2hpZ2gucGFydC5yZXN1bHQsCisJCQltc2dfaGlnaC5wYXJ0LmRydl9pZCwKKwkJCW1zZ19oaWdoLnBhcnQubXNnX2lkLCBOVUxMLCAwKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogUHJvY2VzcyBhbGwgdmFsaWQgcmVzcG9uc2VzCisJICogaWYgaXQgaXMgYSBsYXJnZSBtZXNzYWdlLCB0aGUgcGF5bG9hZCBjb250YWlucyB0aGUgc2l6ZSB0bworCSAqIGNvcHkgZnJvbSBtYWlsYm94CisJICoqLworCWlmIChtc2dfaGlnaC5wYXJ0LmxhcmdlKSB7CisJCWRhdGEgPSBremFsbG9jKG1zZ19sb3csIEdGUF9LRVJORUwpOworCQlpZiAoIWRhdGEpCisJCQlyZXR1cm47CisJCW1lbWNweShkYXRhLCAodm9pZCAqKSBtc2ctPm1haWxib3hfZGF0YSwgbXNnX2xvdyk7CisJCS8qIENvcHkgY29tbWFuZCBpZCBzbyB0aGF0IHdlIGNhbiB1c2UgdG8gcHV0IHNzdCB0byByZXNldCAqLworCQlkc3BfaGRyID0gKHN0cnVjdCBpcGNfZHNwX2hkciAqKWRhdGE7CisJCWNtZF9pZCA9IGRzcF9oZHItPmNtZF9pZDsKKwkJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiY21kX2lkICVkXG4iLCBkc3BfaGRyLT5jbWRfaWQpOworCQlpZiAoc3N0X3dha2VfdXBfYmxvY2soc3N0X2Rydl9jdHgsIG1zZ19oaWdoLnBhcnQucmVzdWx0LAorCQkJCW1zZ19oaWdoLnBhcnQuZHJ2X2lkLAorCQkJCW1zZ19oaWdoLnBhcnQubXNnX2lkLCBkYXRhLCBtc2dfbG93KSkKKwkJCWtmcmVlKGRhdGEpOworCX0gZWxzZSB7CisJCXNzdF93YWtlX3VwX2Jsb2NrKHNzdF9kcnZfY3R4LCBtc2dfaGlnaC5wYXJ0LnJlc3VsdCwKKwkJCQltc2dfaGlnaC5wYXJ0LmRydl9pZCwKKwkJCQltc2dfaGlnaC5wYXJ0Lm1zZ19pZCwgTlVMTCwgMCk7CisJfQorCit9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X2xvYWRlci5jIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9sb2FkZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzkxNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9sb2FkZXIuYwpAQCAtMCwwICsxLDQ2MyBAQAorLyoKKyAqICBzc3RfZHNwLmMgLSBJbnRlbCBTU1QgRHJpdmVyIGZvciBhdWRpbyBlbmdpbmUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTE0CUludGVsIENvcnAKKyAqICBBdXRob3JzOglWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4KKyAqCQlIYXJzaGEgUHJpeWEgPHByaXlhLmhhcnNoYUBpbnRlbC5jb20+CisgKgkJRGhhcmFnZXN3YXJpIFIgPGRoYXJhZ2Vzd2FyaS5yQGludGVsLmNvbT4KKyAqCQlLUCBKZWVqYSA8amVlamEua3BAaW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIGFsbCBkc3AgY29udHJvbGxpbmcgZnVuY3Rpb25zIGxpa2UgZmlybXdhcmUgZG93bmxvYWQsCisgKiBzZXR0aW5nL3Jlc2V0dGluZyBkc3AgY29yZXMsIGV0YworICovCisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybV9zc3RfYXVkaW8uaD4KKyNpbmNsdWRlICIuLi9zc3QtbWZsZC1wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInNzdC5oIgorI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9zc3QtZHNwLmgiCisKK3ZvaWQgbWVtY3B5MzJfdG9pbyh2b2lkIF9faW9tZW0gKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBpbnQgY291bnQpCit7CisJLyogX19pb3dyaXRlMzJfY29weSB1c2VzIDMyLWJpdCBjb3VudCB2YWx1ZXMgc28gZGl2aWRlIGJ5IDQgZm9yCisJICogcmlnaHQgY291bnQgaW4gd29yZHMKKwkgKi8KKwlfX2lvd3JpdGUzMl9jb3B5KGRzdCwgc3JjLCBjb3VudC80KTsKK30KKwordm9pZCBtZW1jcHkzMl9mcm9taW8odm9pZCAqZHN0LCBjb25zdCB2b2lkIF9faW9tZW0gKnNyYywgaW50IGNvdW50KQoreworCS8qIF9faW93cml0ZTMyX2NvcHkgdXNlcyAzMi1iaXQgY291bnQgdmFsdWVzIHNvIGRpdmlkZSBieSA0IGZvcgorCSAqIHJpZ2h0IGNvdW50IGluIHdvcmRzCisJICovCisJX19pb3dyaXRlMzJfY29weShkc3QsIHNyYywgY291bnQvNCk7Cit9CisKKy8qKgorICogaW50ZWxfc3N0X3Jlc2V0X2RzcF9tcmZsZCAtIFJlc2V0dGluZyBTU1QgRFNQCisgKgorICogVGhpcyByZXNldHMgRFNQIGluIGNhc2Ugb2YgTVJGTEQgcGxhdGZyb21zCisgKi8KK2ludCBpbnRlbF9zc3RfcmVzZXRfZHNwX21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCkKK3sKKwl1bmlvbiBjb25maWdfc3RhdHVzX3JlZ19tcmZsZCBjc3I7CisKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJzc3Q6IFJlc2V0dGluZyB0aGUgRFNQIGluIG1yZmxkXG4iKTsKKwljc3IuZnVsbCA9IHNzdF9zaGltX3JlYWQ2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUik7CisKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJ2YWx1ZToweCVsbHhcbiIsIGNzci5mdWxsKTsKKworCWNzci5mdWxsIHw9IDB4NzsKKwlzc3Rfc2hpbV93cml0ZTY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSLCBjc3IuZnVsbCk7CisJY3NyLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkNjQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9DU1IpOworCisJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAidmFsdWU6MHglbGx4XG4iLCBjc3IuZnVsbCk7CisKKwljc3IuZnVsbCAmPSB+KDB4MSk7CisJc3N0X3NoaW1fd3JpdGU2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUiwgY3NyLmZ1bGwpOworCisJY3NyLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkNjQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9DU1IpOworCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgInZhbHVlOjB4JWxseFxuIiwgY3NyLmZ1bGwpOworCXJldHVybiAwOworfQorCisvKioKKyAqIHNzdF9zdGFydF9tZXJyaWZpZWxkIC0gU3RhcnQgdGhlIFNTVCBEU1AgcHJvY2Vzc29yCisgKgorICogVGhpcyBzdGFydHMgdGhlIERTUCBpbiBNRVJSSUZJRUxEIHBsYXRmcm9tcworICovCitpbnQgc3N0X3N0YXJ0X21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCkKK3sKKwl1bmlvbiBjb25maWdfc3RhdHVzX3JlZ19tcmZsZCBjc3I7CisKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJzc3Q6IFN0YXJ0aW5nIHRoZSBEU1AgaW4gbXJmbGQgTEFMQUxBTEFcbiIpOworCWNzci5mdWxsID0gc3N0X3NoaW1fcmVhZDY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSKTsKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJ2YWx1ZToweCVsbHhcbiIsIGNzci5mdWxsKTsKKworCWNzci5mdWxsIHw9IDB4NzsKKwlzc3Rfc2hpbV93cml0ZTY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSLCBjc3IuZnVsbCk7CisKKwljc3IuZnVsbCA9IHNzdF9zaGltX3JlYWQ2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUik7CisJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAidmFsdWU6MHglbGx4XG4iLCBjc3IuZnVsbCk7CisKKwljc3IucGFydC54dF9zbm9vcCA9IDE7CisJY3NyLmZ1bGwgJj0gfigweDUpOworCXNzdF9zaGltX3dyaXRlNjQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9DU1IsIGNzci5mdWxsKTsKKworCWNzci5mdWxsID0gc3N0X3NoaW1fcmVhZDY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSKTsKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJzc3Q6IFN0YXJ0aW5nIHRoZSBEU1BfbWVycmlmaWVsZDolbGx4XG4iLAorCQkJY3NyLmZ1bGwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF92YWxpZGF0ZV9md19pbWFnZShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LCB1bnNpZ25lZCBsb25nIHNpemUsCisJCXN0cnVjdCBmd19tb2R1bGVfaGVhZGVyICoqbW9kdWxlLCB1MzIgKm51bV9tb2R1bGVzKQoreworCXN0cnVjdCBzc3RfZndfaGVhZGVyICpoZWFkZXI7CisJY29uc3Qgdm9pZCAqc3N0X2Z3X2luX21lbSA9IGN0eC0+ZndfaW5fbWVtOworCisJZGV2X2RiZyhjdHgtPmRldiwgIkVudGVyXG4iKTsKKworCS8qIFJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkYXRhIHBvaW50ZXIgKi8KKwloZWFkZXIgPSAoc3RydWN0IHNzdF9md19oZWFkZXIgKilzc3RfZndfaW5fbWVtOworCWRldl9kYmcoY3R4LT5kZXYsCisJCSJoZWFkZXIgc2lnbj0lcyBzaXplPSV4IG1vZHVsZXM9JXggZm10PSV4IHNpemU9JXp4XG4iLAorCQloZWFkZXItPnNpZ25hdHVyZSwgaGVhZGVyLT5maWxlX3NpemUsIGhlYWRlci0+bW9kdWxlcywKKwkJaGVhZGVyLT5maWxlX2Zvcm1hdCwgc2l6ZW9mKCpoZWFkZXIpKTsKKworCS8qIHZlcmlmeSBGVyAqLworCWlmICgoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgU1NUX0ZXX1NJR04sIDQpICE9IDApIHx8CisJCShzaXplICE9IGhlYWRlci0+ZmlsZV9zaXplICsgc2l6ZW9mKCpoZWFkZXIpKSkgeworCQkvKiBJbnZhbGlkIEZXIHNpZ25hdHVyZSAqLworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiSW52YWxpZEZXIHNpZ24vZmlsZXNpemUgbWlzbWF0Y2hcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJKm51bV9tb2R1bGVzID0gaGVhZGVyLT5tb2R1bGVzOworCSptb2R1bGUgPSAodm9pZCAqKXNzdF9md19pbl9tZW0gKyBzaXplb2YoKmhlYWRlcik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNzdF9maWxsX21lbWNweV9saXN0IC0gRmlsbCB0aGUgbWVtY3B5IGxpc3QKKyAqCisgKiBAbWVtY3B5X2xpc3Q6IExpc3QgdG8gYmUgZmlsbGVkCisgKiBAZGVzdG46IERlc3RpbmF0aW9uIGFkZHIgdG8gYmUgZmlsbGVkIGluIHRoZSBsaXN0CisgKiBAc3JjOiBTb3VyY2UgYWRkciB0byBiZSBmaWxsZWQgaW4gdGhlIGxpc3QKKyAqIEBzaXplOiBTaXplIHRvIGJlIGZpbGxlZCBpbiB0aGUgbGlzdAorICoKKyAqIEFkZHMgdGhlIG5vZGUgdG8gdGhlIGxpc3QgYWZ0ZXIgcmVxdWlyZWQgZmllbGRzCisgKiBhcmUgcG9wdWxhdGVkIGluIHRoZSBub2RlCisgKi8KK3N0YXRpYyBpbnQgc3N0X2ZpbGxfbWVtY3B5X2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbWVtY3B5X2xpc3QsCisJCQl2b2lkICpkZXN0biwgY29uc3Qgdm9pZCAqc3JjLCB1MzIgc2l6ZSwgYm9vbCBpc19pbykKK3sKKwlzdHJ1Y3Qgc3N0X21lbWNweV9saXN0ICpsaXN0bm9kZTsKKworCWxpc3Rub2RlID0ga3phbGxvYyhzaXplb2YoKmxpc3Rub2RlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGxpc3Rub2RlID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWxpc3Rub2RlLT5kc3RuID0gZGVzdG47CisJbGlzdG5vZGUtPnNyYyA9IHNyYzsKKwlsaXN0bm9kZS0+c2l6ZSA9IHNpemU7CisJbGlzdG5vZGUtPmlzX2lvID0gaXNfaW87CisJbGlzdF9hZGRfdGFpbCgmbGlzdG5vZGUtPm1lbWNweWxpc3QsIG1lbWNweV9saXN0KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNzdF9wYXJzZV9tb2R1bGVfbWVtY3B5IC0gUGFyc2UgYXVkaW8gRlcgbW9kdWxlcyBhbmQgcG9wdWxhdGUgdGhlIG1lbWNweSBsaXN0CisgKgorICogQHNzdF9kcnZfY3R4CQk6IGRyaXZlciBjb250ZXh0CisgKiBAbW9kdWxlCQk6IEZXIG1vZHVsZSBoZWFkZXIKKyAqIEBtZW1jcHlfbGlzdAk6IFBvaW50ZXIgdG8gdGhlIGxpc3QgdG8gYmUgcG9wdWxhdGVkCisgKiBDcmVhdGUgdGhlIG1lbWNweSBsaXN0IGFzIHRoZSBudW1iZXIgb2YgYmxvY2sgdG8gYmUgY29waWVkCisgKiByZXR1cm5zIGVycm9yIG9yIDAgaWYgbW9kdWxlIHNpemVzIGFyZSBwcm9wZXIKKyAqLworc3RhdGljIGludCBzc3RfcGFyc2VfbW9kdWxlX21lbWNweShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsCisJCXN0cnVjdCBmd19tb2R1bGVfaGVhZGVyICptb2R1bGUsIHN0cnVjdCBsaXN0X2hlYWQgKm1lbWNweV9saXN0KQoreworCXN0cnVjdCBmd19ibG9ja19pbmZvICpibG9jazsKKwl1MzIgY291bnQ7CisJaW50IHJldF92YWwgPSAwOworCXZvaWQgX19pb21lbSAqcmFtX2lvbWVtOworCisJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAibW9kdWxlIHNpZ24gJXMgc2l6ZSAleCBibG9ja3MgJXggdHlwZSAleFxuIiwKKwkJCW1vZHVsZS0+c2lnbmF0dXJlLCBtb2R1bGUtPm1vZF9zaXplLAorCQkJbW9kdWxlLT5ibG9ja3MsIG1vZHVsZS0+dHlwZSk7CisJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAibW9kdWxlIGVudHJ5cG9pbnQgMHgleFxuIiwgbW9kdWxlLT5lbnRyeV9wb2ludCk7CisKKwlibG9jayA9ICh2b2lkICopbW9kdWxlICsgc2l6ZW9mKCptb2R1bGUpOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbW9kdWxlLT5ibG9ja3M7IGNvdW50KyspIHsKKwkJaWYgKGJsb2NrLT5zaXplIDw9IDApIHsKKwkJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwgImJsb2NrIHNpemUgaW52YWxpZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzd2l0Y2ggKGJsb2NrLT50eXBlKSB7CisJCWNhc2UgU1NUX0lSQU06CisJCQlyYW1faW9tZW0gPSBzc3RfZHJ2X2N0eC0+aXJhbTsKKwkJCWJyZWFrOworCQljYXNlIFNTVF9EUkFNOgorCQkJcmFtX2lvbWVtID0gc3N0X2Rydl9jdHgtPmRyYW07CisJCQlicmVhazsKKwkJY2FzZSBTU1RfRERSOgorCQkJcmFtX2lvbWVtID0gc3N0X2Rydl9jdHgtPmRkcjsKKwkJCWJyZWFrOworCQljYXNlIFNTVF9DVVNUT01fSU5GTzoKKwkJCWJsb2NrID0gKHZvaWQgKilibG9jayArIHNpemVvZigqYmxvY2spICsgYmxvY2stPnNpemU7CisJCQljb250aW51ZTsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwgIndyb25nIHJhbSB0eXBlMHgleCBpbiBibG9jazB4JXhcbiIsCisJCQkJCWJsb2NrLT50eXBlLCBjb3VudCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXJldF92YWwgPSBzc3RfZmlsbF9tZW1jcHlfbGlzdChtZW1jcHlfbGlzdCwKKwkJCQlyYW1faW9tZW0gKyBibG9jay0+cmFtX29mZnNldCwKKwkJCQkodm9pZCAqKWJsb2NrICsgc2l6ZW9mKCpibG9jayksIGJsb2NrLT5zaXplLCAxKTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKworCQlibG9jayA9ICh2b2lkICopYmxvY2sgKyBzaXplb2YoKmJsb2NrKSArIGJsb2NrLT5zaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzc3RfcGFyc2VfZndfbWVtY3B5IC0gcGFyc2UgdGhlIGZpcm13YXJlIGltYWdlICYgcG9wdWxhdGUgdGhlIGxpc3QgZm9yIG1lbWNweQorICoKKyAqIEBjdHgJCQk6IHBvaW50ZXIgdG8gZHJ2IGNvbnRleHQKKyAqIEBzaXplCQk6IHNpemUgb2YgdGhlIGZpcm13YXJlCisgKiBAZndfbGlzdAkJOiBwb2ludGVyIHRvIGxpc3RfaGVhZCB0byBiZSBwb3B1bGF0ZWQKKyAqIFRoaXMgZnVuY3Rpb24gcGFyc2VzIHRoZSBGVyBpbWFnZSBhbmQgc2F2ZXMgdGhlIHBhcnNlZCBpbWFnZSBpbiB0aGUgbGlzdAorICogZm9yIG1lbWNweQorICovCitzdGF0aWMgaW50IHNzdF9wYXJzZV9md19tZW1jcHkoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmZ3X2xpc3QpCit7CisJc3RydWN0IGZ3X21vZHVsZV9oZWFkZXIgKm1vZHVsZTsKKwl1MzIgY291bnQsIG51bV9tb2R1bGVzOworCWludCByZXRfdmFsOworCisJcmV0X3ZhbCA9IHNzdF92YWxpZGF0ZV9md19pbWFnZShjdHgsIHNpemUsICZtb2R1bGUsICZudW1fbW9kdWxlcyk7CisJaWYgKHJldF92YWwpCisJCXJldHVybiByZXRfdmFsOworCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgbnVtX21vZHVsZXM7IGNvdW50KyspIHsKKwkJcmV0X3ZhbCA9IHNzdF9wYXJzZV9tb2R1bGVfbWVtY3B5KGN0eCwgbW9kdWxlLCBmd19saXN0KTsKKwkJaWYgKHJldF92YWwpCisJCQlyZXR1cm4gcmV0X3ZhbDsKKwkJbW9kdWxlID0gKHZvaWQgKiltb2R1bGUgKyBzaXplb2YoKm1vZHVsZSkgKyBtb2R1bGUtPm1vZF9zaXplOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHNzdF9kb19tZW1jcHkgLSBmdW5jdGlvbiBpbml0aWF0ZXMgdGhlIG1lbWNweQorICoKKyAqIEBtZW1jcHlfbGlzdDogUHRlciB0byBtZW1jcHkgbGlzdCBvbiB3aGljaCB0aGUgbWVtY3B5IG5lZWRzIHRvIGJlIGluaXRpYXRlZAorICoKKyAqIFRyaWdnZXJzIHRoZSBtZW1jcHkKKyAqLworc3RhdGljIHZvaWQgc3N0X2RvX21lbWNweShzdHJ1Y3QgbGlzdF9oZWFkICptZW1jcHlfbGlzdCkKK3sKKwlzdHJ1Y3Qgc3N0X21lbWNweV9saXN0ICpsaXN0bm9kZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobGlzdG5vZGUsIG1lbWNweV9saXN0LCBtZW1jcHlsaXN0KSB7CisJCWlmIChsaXN0bm9kZS0+aXNfaW8gPT0gdHJ1ZSkKKwkJCW1lbWNweTMyX3RvaW8oKHZvaWQgX19pb21lbSAqKWxpc3Rub2RlLT5kc3RuLAorCQkJCQlsaXN0bm9kZS0+c3JjLCBsaXN0bm9kZS0+c2l6ZSk7CisJCWVsc2UKKwkJCW1lbWNweShsaXN0bm9kZS0+ZHN0biwgbGlzdG5vZGUtPnNyYywgbGlzdG5vZGUtPnNpemUpOworCX0KK30KKwordm9pZCBzc3RfbWVtY3B5X2ZyZWVfcmVzb3VyY2VzKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCkKK3sKKwlzdHJ1Y3Qgc3N0X21lbWNweV9saXN0ICpsaXN0bm9kZSwgKnRtcGxpc3Rub2RlOworCisJLyogRnJlZSB0aGUgbGlzdCAqLworCWlmICghbGlzdF9lbXB0eSgmc3N0X2Rydl9jdHgtPm1lbWNweV9saXN0KSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGlzdG5vZGUsIHRtcGxpc3Rub2RlLAorCQkJCSZzc3RfZHJ2X2N0eC0+bWVtY3B5X2xpc3QsIG1lbWNweWxpc3QpIHsKKwkJCWxpc3RfZGVsKCZsaXN0bm9kZS0+bWVtY3B5bGlzdCk7CisJCQlrZnJlZShsaXN0bm9kZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgc3N0X2NhY2hlX2FuZF9wYXJzZV9mdyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0LAorCQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3KQoreworCWludCByZXR2YWwgPSAwOworCisJc3N0LT5md19pbl9tZW0gPSBremFsbG9jKGZ3LT5zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNzdC0+ZndfaW5fbWVtKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gZW5kX3JlbGVhc2U7CisJfQorCWRldl9kYmcoc3N0LT5kZXYsICJjb3BpZWQgZncgdG8gJXAiLCBzc3QtPmZ3X2luX21lbSk7CisJZGV2X2RiZyhzc3QtPmRldiwgInBoeXM6ICVseCIsICh1bnNpZ25lZCBsb25nKXZpcnRfdG9fcGh5cyhzc3QtPmZ3X2luX21lbSkpOworCW1lbWNweShzc3QtPmZ3X2luX21lbSwgZnctPmRhdGEsIGZ3LT5zaXplKTsKKwlyZXR2YWwgPSBzc3RfcGFyc2VfZndfbWVtY3B5KHNzdCwgZnctPnNpemUsICZzc3QtPm1lbWNweV9saXN0KTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoc3N0LT5kZXYsICJGYWlsZWQgdG8gcGFyc2UgZndcbiIpOworCQlrZnJlZShzc3QtPmZ3X2luX21lbSk7CisJCXNzdC0+ZndfaW5fbWVtID0gTlVMTDsKKwl9CisKK2VuZF9yZWxlYXNlOgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworCXJldHVybiByZXR2YWw7CisKK30KKwordm9pZCBzc3RfZmlybXdhcmVfbG9hZF9jYihjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHggPSBjb250ZXh0OworCisJZGV2X2RiZyhjdHgtPmRldiwgIkVudGVyXG4iKTsKKworCWlmIChmdyA9PSBOVUxMKSB7CisJCWRldl9lcnIoY3R4LT5kZXYsICJyZXF1ZXN0IGZ3IGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwltdXRleF9sb2NrKCZjdHgtPnNzdF9sb2NrKTsKKworCWlmIChjdHgtPnNzdF9zdGF0ZSAhPSBTU1RfUkVTRVQgfHwKKwkJCWN0eC0+ZndfaW5fbWVtICE9IE5VTEwpIHsKKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJCW11dGV4X3VubG9jaygmY3R4LT5zc3RfbG9jayk7CisJCXJldHVybjsKKwl9CisKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiUmVxdWVzdCBGdyBjb21wbGV0ZWRcbiIpOworCXNzdF9jYWNoZV9hbmRfcGFyc2VfZncoY3R4LCBmdyk7CisJbXV0ZXhfdW5sb2NrKCZjdHgtPnNzdF9sb2NrKTsKK30KKworLyoKKyAqIHNzdF9yZXF1ZXN0X2Z3IC0gcmVxdWVzdHMgYXVkaW8gZncgZnJvbSBrZXJuZWwgYW5kIHNhdmVzIGEgY29weQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVxdWVzdHMgdGhlIFNTVCBGVyBmcm9tIHRoZSBrZXJuZWwsIHBhcnNlcyBpdCBhbmQKKyAqIHNhdmVzIGEgY29weSBpbiB0aGUgZHJpdmVyIGNvbnRleHQKKyAqLworc3RhdGljIGludCBzc3RfcmVxdWVzdF9mdyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0KQoreworCWludCByZXR2YWwgPSAwOworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisKKwlyZXR2YWwgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgc3N0LT5maXJtd2FyZV9uYW1lLCBzc3QtPmRldik7CisJaWYgKGZ3ID09IE5VTEwpIHsKKwkJZGV2X2Vycihzc3QtPmRldiwgImZ3IGlzIHJldHVybmluZyBhcyBudWxsXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZXR2YWwpIHsKKwkJZGV2X2Vycihzc3QtPmRldiwgInJlcXVlc3QgZncgZmFpbGVkICVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwltdXRleF9sb2NrKCZzc3QtPnNzdF9sb2NrKTsKKwlyZXR2YWwgPSBzc3RfY2FjaGVfYW5kX3BhcnNlX2Z3KHNzdCwgZncpOworCW11dGV4X3VubG9jaygmc3N0LT5zc3RfbG9jayk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogV3JpdGluZyB0aGUgRERSIHBoeXNpY2FsIGJhc2UgdG8gRENDTSBvZmZzZXQKKyAqIHNvIHRoYXQgRlcgY2FuIHVzZSBpdCB0byBzZXR1cCBUTEIKKyAqLworc3RhdGljIHZvaWQgc3N0X2RjY21fY29uZmlnX3dyaXRlKHZvaWQgX19pb21lbSAqZHJhbV9iYXNlLAorCQl1bnNpZ25lZCBpbnQgZGRyX2Jhc2UpCit7CisJdm9pZCBfX2lvbWVtICphZGRyOworCXUzMiBic3NfcmVzZXQgPSAwOworCisJYWRkciA9ICh2b2lkIF9faW9tZW0gKikoZHJhbV9iYXNlICsgTVJGTERfRldfRERSX0JBU0VfT0ZGU0VUKTsKKwltZW1jcHkzMl90b2lvKGFkZHIsICh2b2lkICopJmRkcl9iYXNlLCBzaXplb2YodTMyKSk7CisJYnNzX3Jlc2V0IHw9ICgxIDw8IE1SRkxEX0ZXX0JTU19SRVNFVF9CSVQpOworCWFkZHIgPSAodm9pZCBfX2lvbWVtICopKGRyYW1fYmFzZSArIE1SRkxEX0ZXX0ZFQVRVUkVfQkFTRV9PRkZTRVQpOworCW1lbWNweTMyX3RvaW8oYWRkciwgJmJzc19yZXNldCwgc2l6ZW9mKHUzMikpOworCit9CisKK3ZvaWQgc3N0X3Bvc3RfZG93bmxvYWRfbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCkKK3sKKwlzc3RfZGNjbV9jb25maWdfd3JpdGUoY3R4LT5kcmFtLCBjdHgtPmRkcl9iYXNlKTsKKwlkZXZfZGJnKGN0eC0+ZGV2LCAiY29uZmlnIHdyaXR0ZW4gdG8gRENDTVxuIik7Cit9CisKKy8qKgorICogc3N0X2xvYWRfZncgLSBmdW5jdGlvbiB0byBsb2FkIEZXIGludG8gRFNQCisgKiBUcmFuc2ZlcnMgdGhlIEZXIHRvIERTUCB1c2luZyBkbWEvbWVtY3B5CisgKi8KK2ludCBzc3RfbG9hZF9mdyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgpCit7CisJaW50IHJldF92YWwgPSAwOworCXN0cnVjdCBzc3RfYmxvY2sgKmJsb2NrOworCisJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAic3N0X2xvYWRfZndcbiIpOworCisJaWYgKHNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgIT0gIFNTVF9SRVNFVCB8fAorCQkJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9PSBTU1RfU0hVVERPV04pCisJCXJldHVybiAtRUFHQUlOOworCisJaWYgKCFzc3RfZHJ2X2N0eC0+ZndfaW5fbWVtKSB7CisJCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgInNzdDogRlcgbm90IGluIG1lbW9yeSByZXRyeSB0byBkb3dubG9hZFxuIik7CisJCXJldF92YWwgPSBzc3RfcmVxdWVzdF9mdyhzc3RfZHJ2X2N0eCk7CisJCWlmIChyZXRfdmFsKQorCQkJcmV0dXJuIHJldF92YWw7CisJfQorCisJQlVHX09OKCFzc3RfZHJ2X2N0eC0+ZndfaW5fbWVtKTsKKwlibG9jayA9IHNzdF9jcmVhdGVfYmxvY2soc3N0X2Rydl9jdHgsIDAsIEZXX0RXTkxfSUQpOworCWlmIChibG9jayA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIFByZXZlbnQgQy1zdGF0ZXMgYmV5b25kIEM2ICovCisJcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KHNzdF9kcnZfY3R4LT5xb3MsIDApOworCisJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9GV19MT0FESU5HOworCisJcmV0X3ZhbCA9IHNzdF9kcnZfY3R4LT5vcHMtPnJlc2V0KHNzdF9kcnZfY3R4KTsKKwlpZiAocmV0X3ZhbCkKKwkJZ290byByZXN0b3JlOworCisJc3N0X2RvX21lbWNweSgmc3N0X2Rydl9jdHgtPm1lbWNweV9saXN0KTsKKworCS8qIFdyaXRlIHRoZSBEUkFNL0RDQ00gY29uZmlnIGJlZm9yZSBlbmFibGluZyBGVyAqLworCWlmIChzc3RfZHJ2X2N0eC0+b3BzLT5wb3N0X2Rvd25sb2FkKQorCQlzc3RfZHJ2X2N0eC0+b3BzLT5wb3N0X2Rvd25sb2FkKHNzdF9kcnZfY3R4KTsKKworCS8qIGJyaW5nIHNzdCBvdXQgb2YgcmVzZXQgKi8KKwlyZXRfdmFsID0gc3N0X2Rydl9jdHgtPm9wcy0+c3RhcnQoc3N0X2Rydl9jdHgpOworCWlmIChyZXRfdmFsKQorCQlnb3RvIHJlc3RvcmU7CisKKwlyZXRfdmFsID0gc3N0X3dhaXRfdGltZW91dChzc3RfZHJ2X2N0eCwgYmxvY2spOworCWlmIChyZXRfdmFsKSB7CisJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwgImZ3IGRvd25sb2FkIGZhaWxlZCAlZFxuIiAsIHJldF92YWwpOworCQkvKiBGVyBkb3dubG9hZCBmYWlsZWQgZHVlIHRvIHRpbWVvdXQgKi8KKwkJcmV0X3ZhbCA9IC1FQlVTWTsKKworCX0KKworCityZXN0b3JlOgorCS8qIFJlLWVuYWJsZSBEZWVwZXIgQy1zdGF0ZXMgYmV5b25kIEM2ICovCisJcG1fcW9zX3VwZGF0ZV9yZXF1ZXN0KHNzdF9kcnZfY3R4LT5xb3MsIFBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKKwlzc3RfZnJlZV9ibG9jayhzc3RfZHJ2X2N0eCwgYmxvY2spOworCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgImZ3IGxvYWQgc3VjY2Vzc2Z1bCEhIVxuIik7CisKKwlpZiAoc3N0X2Rydl9jdHgtPm9wcy0+cmVzdG9yZV9kc3BfY29udGV4dCkKKwkJc3N0X2Rydl9jdHgtPm9wcy0+cmVzdG9yZV9kc3BfY29udGV4dCgpOworCXNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgPSBTU1RfRldfUlVOTklORzsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC9zc3RfcGNpLmMgYi9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X3BjaS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvaW50ZWwvc3N0L3NzdF9wY2kuYwpyZW5hbWUgdG8gc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9wY2kuYwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9wdnQuYyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfcHZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRiMzJmZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9hdG9tL3NzdC9zc3RfcHZ0LmMKQEAgLTAsMCArMSw0MjUgQEAKKy8qCisgKiAgc3N0X3B2dC5jIC0gSW50ZWwgU1NUIERyaXZlciBmb3IgYXVkaW8gZW5naW5lCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOC0xNAlJbnRlbCBDb3JwCisgKiAgQXV0aG9yczoJVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+CisgKgkJSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPgorICoJCURoYXJhZ2Vzd2FyaSBSIDxkaGFyYWdlc3dhcmkuckBpbnRlbC5jb20+CisgKgkJS1AgSmVlamEgPGplZWphLmtwQGludGVsLmNvbT4KKyAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8c291bmQvYXNvdW5kLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgorI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybV9zc3RfYXVkaW8uaD4KKyNpbmNsdWRlICIuLi9zc3QtbWZsZC1wbGF0Zm9ybS5oIgorI2luY2x1ZGUgInNzdC5oIgorI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9zc3QtZHNwLmgiCisKK2ludCBzc3Rfc2hpbV93cml0ZSh2b2lkIF9faW9tZW0gKmFkZHIsIGludCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwl3cml0ZWwodmFsdWUsIGFkZHIgKyBvZmZzZXQpOworCXJldHVybiAwOworfQorCit1MzIgc3N0X3NoaW1fcmVhZCh2b2lkIF9faW9tZW0gKmFkZHIsIGludCBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKGFkZHIgKyBvZmZzZXQpOworfQorCit1NjQgc3N0X3JlZ19yZWFkNjQodm9pZCBfX2lvbWVtICphZGRyLCBpbnQgb2Zmc2V0KQoreworCXU2NCB2YWwgPSAwOworCisJbWVtY3B5X2Zyb21pbygmdmFsLCBhZGRyICsgb2Zmc2V0LCBzaXplb2YodmFsKSk7CisKKwlyZXR1cm4gdmFsOworfQorCitpbnQgc3N0X3NoaW1fd3JpdGU2NCh2b2lkIF9faW9tZW0gKmFkZHIsIGludCBvZmZzZXQsIHU2NCB2YWx1ZSkKK3sKKwltZW1jcHlfdG9pbyhhZGRyICsgb2Zmc2V0LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworCXJldHVybiAwOworfQorCit1NjQgc3N0X3NoaW1fcmVhZDY0KHZvaWQgX19pb21lbSAqYWRkciwgaW50IG9mZnNldCkKK3sKKwl1NjQgdmFsID0gMDsKKworCW1lbWNweV9mcm9taW8oJnZhbCwgYWRkciArIG9mZnNldCwgc2l6ZW9mKHZhbCkpOworCXJldHVybiB2YWw7Cit9CisKK3ZvaWQgc3N0X3NldF9md19zdGF0ZV9sb2NrZWQoCisJCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgaW50IHNzdF9zdGF0ZSkKK3sKKwltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOworCXNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgPSBzc3Rfc3RhdGU7CisJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOworfQorCisvKgorICogc3N0X3dhaXRfaW50ZXJydXB0aWJsZSAtIHdhaXQgb24gZXZlbnQKKyAqCisgKiBAc3N0X2Rydl9jdHg6IERyaXZlciBjb250ZXh0CisgKiBAYmxvY2s6IERyaXZlciBibG9jayB0byB3YWl0IG9uCisgKgorICogVGhpcyBmdW5jdGlvbiB3YWl0cyB3aXRob3V0IGEgdGltZW91dCAoYW5kIGlzIGludGVycnVwdGFibGUpIGZvciBhCisgKiBnaXZlbiBibG9jayBldmVudAorICovCitpbnQgc3N0X3dhaXRfaW50ZXJydXB0aWJsZShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsCisJCQkJc3RydWN0IHNzdF9ibG9jayAqYmxvY2spCit7CisJaW50IHJldHZhbCA9IDA7CisKKwlpZiAoIXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShzc3RfZHJ2X2N0eC0+d2FpdF9xdWV1ZSwKKwkJCQlibG9jay0+Y29uZGl0aW9uKSkgeworCQkvKiBldmVudCB3YWtlICovCisJCWlmIChibG9jay0+cmV0X2NvZGUgPCAwKSB7CisJCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsCisJCQkJInN0cmVhbSBmYWlsZWQgJWRcbiIsIGJsb2NrLT5yZXRfY29kZSk7CisJCQlyZXR2YWwgPSAtRUJVU1k7CisJCX0gZWxzZSB7CisJCQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJldmVudCB1cFxuIik7CisJCQlyZXR2YWwgPSAwOworCQl9CisJfSBlbHNlIHsKKwkJZGV2X2Vycihzc3RfZHJ2X2N0eC0+ZGV2LCAic2lnbmFsIGludGVycnVwdGVkXG4iKTsKKwkJcmV0dmFsID0gLUVJTlRSOworCX0KKwlyZXR1cm4gcmV0dmFsOworCit9CisKKy8qCisgKiBzc3Rfd2FpdF90aW1lb3V0IC0gd2FpdCBvbiBldmVudCBmb3IgdGltZW91dAorICoKKyAqIEBzc3RfZHJ2X2N0eDogRHJpdmVyIGNvbnRleHQKKyAqIEBibG9jazogRHJpdmVyIGJsb2NrIHRvIHdhaXQgb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdhaXRzIHdpdGggYSB0aW1lb3V0IHZhbHVlIChhbmQgaXMgbm90IGludGVycnVwdGlibGUpIG9uIGEKKyAqIGdpdmVuIGJsb2NrIGV2ZW50CisgKi8KK2ludCBzc3Rfd2FpdF90aW1lb3V0KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgc3RydWN0IHNzdF9ibG9jayAqYmxvY2spCit7CisJaW50IHJldHZhbCA9IDA7CisKKwkvKgorCSAqIE5PVEU6CisJICogT2JzZXJ2ZWQgdGhhdCBGVyBwcm9jZXNzZXMgdGhlIGFsbG9jIG1zZyBhbmQgcmVwbGllcyBldmVuCisJICogYmVmb3JlIHRoZSBhbGxvYyB0aHJlYWQgaGFzIGZpbmlzaGVkIGV4ZWN1dGlvbgorCSAqLworCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwKKwkJIndhaXRpbmcgZm9yIGNvbmRpdGlvbiAleCBpcGMgJWQgZHJ2X2lkICVkXG4iLAorCQlibG9jay0+Y29uZGl0aW9uLCBibG9jay0+bXNnX2lkLCBibG9jay0+ZHJ2X2lkKTsKKwlpZiAod2FpdF9ldmVudF90aW1lb3V0KHNzdF9kcnZfY3R4LT53YWl0X3F1ZXVlLAorCQkJCWJsb2NrLT5jb25kaXRpb24sCisJCQkJbXNlY3NfdG9famlmZmllcyhTU1RfQkxPQ0tfVElNRU9VVCkpKSB7CisJCS8qIGV2ZW50IHdha2UgKi8KKwkJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiRXZlbnQgd2FrZSAleFxuIiwKKwkJCQlibG9jay0+Y29uZGl0aW9uKTsKKwkJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAibWVzc2FnZSByZXQ6ICVkXG4iLAorCQkJCWJsb2NrLT5yZXRfY29kZSk7CisJCXJldHZhbCA9IC1ibG9jay0+cmV0X2NvZGU7CisJfSBlbHNlIHsKKwkJYmxvY2stPm9uID0gZmFsc2U7CisJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwKKwkJCSJXYWl0IHRpbWVkLW91dCBjb25kaXRpb246JSN4LCBtc2dfaWQ6JSN4IGZ3X3N0YXRlICUjeFxuIiwKKwkJCWJsb2NrLT5jb25kaXRpb24sIGJsb2NrLT5tc2dfaWQsIHNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUpOworCQlzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID0gU1NUX1JFU0VUOworCisJCXJldHZhbCA9IC1FQlVTWTsKKwl9CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIHNzdF9jcmVhdGVfaXBjX21zZyAtIGNyZWF0ZSBhIElQQyBtZXNzYWdlCisgKgorICogQGFyZzogaXBjIG1lc3NhZ2UKKyAqIEBsYXJnZTogbGFyZ2Ugb3Igc2hvcnQgbWVzc2FnZQorICoKKyAqIHRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIHN0cnVjdHVyZXMgdG8gc2VuZCBhIGxhcmdlIG9yIHNob3J0CisgKiBtZXNzYWdlIHRvIHRoZSBmaXJtd2FyZQorICovCitpbnQgc3N0X2NyZWF0ZV9pcGNfbXNnKHN0cnVjdCBpcGNfcG9zdCAqKmFyZywgYm9vbCBsYXJnZSkKK3sKKwlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZzsKKworCW1zZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcGNfcG9zdCksIEdGUF9BVE9NSUMpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAobGFyZ2UpIHsKKwkJbXNnLT5tYWlsYm94X2RhdGEgPSBremFsbG9jKFNTVF9NQUlMQk9YX1NJWkUsIEdGUF9BVE9NSUMpOworCQlpZiAoIW1zZy0+bWFpbGJveF9kYXRhKSB7CisJCQlrZnJlZShtc2cpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9IGVsc2UgeworCQltc2ctPm1haWxib3hfZGF0YSA9IE5VTEw7CisJfQorCW1zZy0+aXNfbGFyZ2UgPSBsYXJnZTsKKwkqYXJnID0gbXNnOworCXJldHVybiAwOworfQorCisvKgorICogc3N0X2NyZWF0ZV9ibG9ja19hbmRfaXBjX21zZyAtIENyZWF0ZXMgSVBDIG1lc3NhZ2UgYW5kIHNzdCBibG9jaworICogQGFyZzogcGFzc2VkIHRvIHNzdF9jcmVhdGVfaXBjX21lc3NhZ2UgQVBJCisgKiBAbGFyZ2U6IGxhcmdlIG9yIHNob3J0IG1lc3NhZ2UKKyAqIEBzc3RfZHJ2X2N0eDogc3N0IGRyaXZlciBjb250ZXh0CisgKiBAYmxvY2s6IHJldHVybiBibG9jayBhbGxvY2F0ZWQKKyAqIEBtc2dfaWQ6IElQQworICogQGRydl9pZDogc3RyZWFtIGlkIG9yIHByaXZhdGUgaWQKKyAqLworaW50IHNzdF9jcmVhdGVfYmxvY2tfYW5kX2lwY19tc2coc3RydWN0IGlwY19wb3N0ICoqYXJnLCBib29sIGxhcmdlLAorCQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIHN0cnVjdCBzc3RfYmxvY2sgKipibG9jaywKKwkJdTMyIG1zZ19pZCwgdTMyIGRydl9pZCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKworCXJldHZhbCA9IHNzdF9jcmVhdGVfaXBjX21zZyhhcmcsIGxhcmdlKTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCSpibG9jayA9IHNzdF9jcmVhdGVfYmxvY2soc3N0X2Rydl9jdHgsIG1zZ19pZCwgZHJ2X2lkKTsKKwlpZiAoKmJsb2NrID09IE5VTEwpIHsKKwkJa2ZyZWUoKmFyZyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gcmV0dmFsOworfQorCisvKgorICogc3N0X2NsZWFuX3N0cmVhbSAtIGNsZWFuIHRoZSBzdHJlYW0gY29udGV4dAorICoKKyAqIEBzdHJlYW06IHN0cmVhbSBzdHJ1Y3R1cmUKKyAqCisgKiB0aGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgc3RyZWFtIGNvbnRleHRzCisgKiBzaG91bGQgYmUgY2FsbGVkIGluIGZyZWUKKyAqLwordm9pZCBzc3RfY2xlYW5fc3RyZWFtKHN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtKQoreworCXN0cmVhbS0+c3RhdHVzID0gU1RSRUFNX1VOX0lOSVQ7CisJc3RyZWFtLT5wcmV2ID0gU1RSRUFNX1VOX0lOSVQ7CisJbXV0ZXhfbG9jaygmc3RyZWFtLT5sb2NrKTsKKwlzdHJlYW0tPmN1bW1fYnl0ZXMgPSAwOworCW11dGV4X3VubG9jaygmc3RyZWFtLT5sb2NrKTsKK30KKworaW50IHNzdF9wcmVwYXJlX2FuZF9wb3N0X21zZyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0LAorCQlpbnQgdGFza19pZCwgaW50IGlwY19tc2csIGludCBjbWRfaWQsIGludCBwaXBlX2lkLAorCQlzaXplX3QgbWJveF9kYXRhX2xlbiwgY29uc3Qgdm9pZCAqbWJveF9kYXRhLCB2b2lkICoqZGF0YSwKKwkJYm9vbCBsYXJnZSwgYm9vbCBmaWxsX2RzcCwgYm9vbCBzeW5jLCBib29sIHJlc3BvbnNlKQoreworCXN0cnVjdCBpcGNfcG9zdCAqbXNnID0gTlVMTDsKKwlzdHJ1Y3QgaXBjX2RzcF9oZHIgZHNwX2hkcjsKKwlzdHJ1Y3Qgc3N0X2Jsb2NrICpibG9jazsKKwlpbnQgcmV0ID0gMCwgcHZ0X2lkOworCisJcHZ0X2lkID0gc3N0X2Fzc2lnbl9wdnRfaWQoc3N0KTsKKwlpZiAocHZ0X2lkIDwgMCkKKwkJcmV0dXJuIHB2dF9pZDsKKworCWlmIChyZXNwb25zZSkKKwkJcmV0ID0gc3N0X2NyZWF0ZV9ibG9ja19hbmRfaXBjX21zZygKKwkJCQkmbXNnLCBsYXJnZSwgc3N0LCAmYmxvY2ssIGlwY19tc2csIHB2dF9pZCk7CisJZWxzZQorCQlyZXQgPSBzc3RfY3JlYXRlX2lwY19tc2coJm1zZywgbGFyZ2UpOworCisJaWYgKHJldCA8IDApIHsKKwkJdGVzdF9hbmRfY2xlYXJfYml0KHB2dF9pZCwgJnNzdC0+cHZ0X2lkKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGV2X2RiZyhzc3QtPmRldiwgInB2dF9pZCA9ICVkLCBwaXBlIGlkID0gJWQsIHRhc2sgPSAlZCBpcGNfbXNnOiAlZFxuIiwKKwkJIHB2dF9pZCwgcGlwZV9pZCwgdGFza19pZCwgaXBjX21zZyk7CisJc3N0X2ZpbGxfaGVhZGVyX21yZmxkKCZtc2ctPm1yZmxkX2hlYWRlciwgaXBjX21zZywKKwkJCQkJdGFza19pZCwgbGFyZ2UsIHB2dF9pZCk7CisJbXNnLT5tcmZsZF9oZWFkZXIucC5oZWFkZXJfbG93X3BheWxvYWQgPSBzaXplb2YoZHNwX2hkcikgKyBtYm94X2RhdGFfbGVuOworCW1zZy0+bXJmbGRfaGVhZGVyLnAuaGVhZGVyX2hpZ2gucGFydC5yZXNfcnFkID0gIXN5bmM7CisJZGV2X2RiZyhzc3QtPmRldiwgImhlYWRlcjoleFxuIiwKKwkJCW1zZy0+bXJmbGRfaGVhZGVyLnAuaGVhZGVyX2hpZ2guZnVsbCk7CisJZGV2X2RiZyhzc3QtPmRldiwgInJlc3BvbnNlIHJxZDogJXgiLAorCQkJbXNnLT5tcmZsZF9oZWFkZXIucC5oZWFkZXJfaGlnaC5wYXJ0LnJlc19ycWQpOworCWRldl9kYmcoc3N0LT5kZXYsICJtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZDolZCIsCisJCQltc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZCk7CisJaWYgKGZpbGxfZHNwKSB7CisJCXNzdF9maWxsX2hlYWRlcl9kc3AoJmRzcF9oZHIsIGNtZF9pZCwgcGlwZV9pZCwgbWJveF9kYXRhX2xlbik7CisJCW1lbWNweShtc2ctPm1haWxib3hfZGF0YSwgJmRzcF9oZHIsIHNpemVvZihkc3BfaGRyKSk7CisJCWlmIChtYm94X2RhdGFfbGVuKSB7CisJCQltZW1jcHkobXNnLT5tYWlsYm94X2RhdGEgKyBzaXplb2YoZHNwX2hkciksCisJCQkJCW1ib3hfZGF0YSwgbWJveF9kYXRhX2xlbik7CisJCX0KKwl9CisKKwlpZiAoc3luYykKKwkJc3N0LT5vcHMtPnBvc3RfbWVzc2FnZShzc3QsIG1zZywgdHJ1ZSk7CisJZWxzZQorCQlzc3RfYWRkX3RvX2Rpc3BhdGNoX2xpc3RfYW5kX3Bvc3Qoc3N0LCBtc2cpOworCisJaWYgKHJlc3BvbnNlKSB7CisJCXJldCA9IHNzdF93YWl0X3RpbWVvdXQoc3N0LCBibG9jayk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIGlmKGJsb2NrLT5kYXRhKSB7CisJCQlpZiAoIWRhdGEpCisJCQkJZ290byBvdXQ7CisJCQkqZGF0YSA9IGt6YWxsb2MoYmxvY2stPnNpemUsIEdGUF9LRVJORUwpOworCQkJaWYgKCEoKmRhdGEpKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dDsKKwkJCX0gZWxzZQorCQkJCW1lbWNweShkYXRhLCAodm9pZCAqKSBibG9jay0+ZGF0YSwgYmxvY2stPnNpemUpOworCQl9CisJfQorb3V0OgorCWlmIChyZXNwb25zZSkKKwkJc3N0X2ZyZWVfYmxvY2soc3N0LCBibG9jayk7CisJdGVzdF9hbmRfY2xlYXJfYml0KHB2dF9pZCwgJnNzdC0+cHZ0X2lkKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc3N0X3BtX3J1bnRpbWVfcHV0KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2KQoreworCWludCByZXQ7CisKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHNzdF9kcnYtPmRldik7CisJcmV0ID0gcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQoc3N0X2Rydi0+ZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzc3RfZmlsbF9oZWFkZXJfbXJmbGQodW5pb24gaXBjX2hlYWRlcl9tcmZsZCAqaGVhZGVyLAorCQkJCWludCBtc2csIGludCB0YXNrX2lkLCBpbnQgbGFyZ2UsIGludCBkcnZfaWQpCit7CisJaGVhZGVyLT5mdWxsID0gMDsKKwloZWFkZXItPnAuaGVhZGVyX2hpZ2gucGFydC5tc2dfaWQgPSBtc2c7CisJaGVhZGVyLT5wLmhlYWRlcl9oaWdoLnBhcnQudGFza19pZCA9IHRhc2tfaWQ7CisJaGVhZGVyLT5wLmhlYWRlcl9oaWdoLnBhcnQubGFyZ2UgPSBsYXJnZTsKKwloZWFkZXItPnAuaGVhZGVyX2hpZ2gucGFydC5kcnZfaWQgPSBkcnZfaWQ7CisJaGVhZGVyLT5wLmhlYWRlcl9oaWdoLnBhcnQuZG9uZSA9IDA7CisJaGVhZGVyLT5wLmhlYWRlcl9oaWdoLnBhcnQuYnVzeSA9IDE7CisJaGVhZGVyLT5wLmhlYWRlcl9oaWdoLnBhcnQucmVzX3JxZCA9IDE7Cit9CisKK3ZvaWQgc3N0X2ZpbGxfaGVhZGVyX2RzcChzdHJ1Y3QgaXBjX2RzcF9oZHIgKmRzcCwgaW50IG1zZywKKwkJCQkJaW50IHBpcGVfaWQsIGludCBsZW4pCit7CisJZHNwLT5jbWRfaWQgPSBtc2c7CisJZHNwLT5tb2RfaW5kZXhfaWQgPSAweGZmOworCWRzcC0+cGlwZV9pZCA9IHBpcGVfaWQ7CisJZHNwLT5sZW5ndGggPSBsZW47CisJZHNwLT5tb2RfaWQgPSAwOworfQorCisjZGVmaW5lIFNTVF9NQVhfQkxPQ0tTIDE1CisvKgorICogc3N0X2Fzc2lnbl9wdnRfaWQgLSBhc3NpZ24gYSBwdnQgaWQgZm9yIHN0cmVhbQorICoKKyAqIEBzc3RfZHJ2X2N0eCA6IGRyaXZlciBjb250ZXh0CisgKgorICogdGhpcyBmdW5jdGlvbiBhc3NpZ25zIGEgcHJpdmF0ZSBpZCBmb3IgY2FsbHMgdGhhdCBkb250IGhhdmUgc3RyZWFtCisgKiBjb250ZXh0IHlldCwgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZAorICogdXNlcyBiaXRzIGZvciB0aGUgaWQsIGFuZCBmaW5kcyBmaXJzdCBmcmVlIGJpdHMgYW5kIGFzc2lnbnMgdGhhdAorICovCitpbnQgc3N0X2Fzc2lnbl9wdnRfaWQoc3RydWN0IGludGVsX3NzdF9kcnYgKmRydikKK3sKKwlpbnQgbG9jYWw7CisKKwlzcGluX2xvY2soJmRydi0+YmxvY2tfbG9jayk7CisJLyogZmluZCBmaXJzdCB6ZXJvIGluZGV4IGZyb20gbHNiICovCisJbG9jYWwgPSBmZnooZHJ2LT5wdnRfaWQpOworCWRldl9kYmcoZHJ2LT5kZXYsICJwdnRfaWQgYXNzaWduZWQgLS0+ICVkXG4iLCBsb2NhbCk7CisJaWYgKGxvY2FsID49IFNTVF9NQVhfQkxPQ0tTKXsKKwkJc3Bpbl91bmxvY2soJmRydi0+YmxvY2tfbG9jayk7CisJCWRldl9lcnIoZHJ2LT5kZXYsICJQVlQgX0lEIGVycm9yOiBubyBmcmVlIGlkIGJsb2NrcyAiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIHRvZ2dsZSB0aGUgaW5kZXggKi8KKwljaGFuZ2VfYml0KGxvY2FsLCAmZHJ2LT5wdnRfaWQpOworCXNwaW5fdW5sb2NrKCZkcnYtPmJsb2NrX2xvY2spOworCXJldHVybiBsb2NhbDsKK30KKwordm9pZCBzc3RfaW5pdF9zdHJlYW0oc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW0sCisJCWludCBjb2RlYywgaW50IHNzdF9pZCwgaW50IG9wcywgdTggc2xvdCkKK3sKKwlzdHJlYW0tPnN0YXR1cyA9IFNUUkVBTV9JTklUOworCXN0cmVhbS0+cHJldiA9IFNUUkVBTV9VTl9JTklUOworCXN0cmVhbS0+b3BzID0gb3BzOworfQorCitpbnQgc3N0X3ZhbGlkYXRlX3N0cmlkKAorCQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIGludCBzdHJfaWQpCit7CisJaWYgKHN0cl9pZCA8PSAwIHx8IHN0cl9pZCA+IHNzdF9kcnZfY3R4LT5pbmZvLm1heF9zdHJlYW1zKSB7CisJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwKKwkJCSJTU1QgRVJSOiBpbnZhbGlkIHN0cmVhbSBpZCA6ICVkLCBtYXggJWRcbiIsCisJCQlzdHJfaWQsIHNzdF9kcnZfY3R4LT5pbmZvLm1heF9zdHJlYW1zKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzdHJlYW1faW5mbyAqZ2V0X3N0cmVhbV9pbmZvKAorCQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIGludCBzdHJfaWQpCit7CisJaWYgKHNzdF92YWxpZGF0ZV9zdHJpZChzc3RfZHJ2X2N0eCwgc3RyX2lkKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdOworfQorCitpbnQgZ2V0X3N0cmVhbV9pZF9tcmZsZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsCisJCXUzMiBwaXBlX2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMTsgaSA8PSBzc3RfZHJ2X2N0eC0+aW5mby5tYXhfc3RyZWFtczsgaSsrKQorCQlpZiAocGlwZV9pZCA9PSBzc3RfZHJ2X2N0eC0+c3RyZWFtc1tpXS5waXBlX2lkKQorCQkJcmV0dXJuIGk7CisKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJubyBzdWNoIHBpcGVfaWQoJXUpIiwgcGlwZV9pZCk7CisJcmV0dXJuIC0xOworfQorCit1MzIgcmVsb2NhdGVfaW1yX2FkZHJfbXJmbGQodTMyIGJhc2VfYWRkcikKK3sKKwkvKiBHZXQgdGhlIGRpZmZlcmVuY2UgZnJvbSA1MTJNQiBhbGlnbmVkIGJhc2UgYWRkciAqLworCS8qIHJlbG9jYXRlIHRoZSBiYXNlICovCisJYmFzZV9hZGRyID0gTVJGTERfRldfVklSVFVBTF9CQVNFICsgKGJhc2VfYWRkciAlICg1MTIgKiAxMDI0ICogMTAyNCkpOworCXJldHVybiBiYXNlX2FkZHI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWxvY2F0ZV9pbXJfYWRkcl9tcmZsZCk7CisKK3ZvaWQgc3N0X2FkZF90b19kaXNwYXRjaF9saXN0X2FuZF9wb3N0KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3QsCisJCQkJCQlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZykKK3sKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPmlwY19zcGluX2xvY2ssIGlycV9mbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmbXNnLT5ub2RlLCAmc3N0LT5pcGNfZGlzcGF0Y2hfbGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5pcGNfc3Bpbl9sb2NrLCBpcnFfZmxhZ3MpOworCXNzdC0+b3BzLT5wb3N0X21lc3NhZ2Uoc3N0LCBOVUxMLCBmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYXRvbS9zc3Qvc3N0X3N0cmVhbS5jIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9zdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzRjNjRjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2F0b20vc3N0L3NzdF9zdHJlYW0uYwpAQCAtMCwwICsxLDQzNyBAQAorLyoKKyAqICBzc3Rfc3RyZWFtLmMgLSBJbnRlbCBTU1QgRHJpdmVyIGZvciBhdWRpbyBlbmdpbmUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTE0IEludGVsIENvcnAKKyAqICBBdXRob3JzOglWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4KKyAqCQlIYXJzaGEgUHJpeWEgPHByaXlhLmhhcnNoYUBpbnRlbC5jb20+CisgKgkJRGhhcmFnZXN3YXJpIFIgPGRoYXJhZ2Vzd2FyaS5yQGludGVsLmNvbT4KKyAqCQlLUCBKZWVqYSA8amVlamEua3BAaW50ZWwuY29tPgorICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvY29tcHJlc3NfZHJpdmVyLmg+CisjaW5jbHVkZSA8YXNtL3BsYXRmb3JtX3NzdF9hdWRpby5oPgorI2luY2x1ZGUgIi4uL3NzdC1tZmxkLXBsYXRmb3JtLmgiCisjaW5jbHVkZSAic3N0LmgiCisjaW5jbHVkZSAiLi4vLi4vY29tbW9uL3NzdC1kc3AuaCIKKworaW50IHNzdF9hbGxvY19zdHJlYW1fbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCB2b2lkICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zc3RfYWxsb2NfbXJmbGQgYWxsb2NfcGFyYW07CisJc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW1zOworCXN0cnVjdCBzbmRfc3N0X3RzdGFtcCBmd190c3RhbXA7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKKwlzdHJ1Y3Qgc25kX3NzdF9hbGxvY19yZXNwb25zZSAqcmVzcG9uc2U7CisJdW5zaWduZWQgaW50IHN0cl9pZCwgcGlwZV9pZCwgdGFza19pZDsKKwlpbnQgaSwgbnVtX2NoLCByZXQgPSAwOworCXZvaWQgKmRhdGEgPSBOVUxMOworCisJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiRW50ZXJcbiIpOworCUJVR19PTighcGFyYW1zKTsKKworCXN0cl9wYXJhbXMgPSAoc3RydWN0IHNuZF9zc3RfcGFyYW1zICopcGFyYW1zOworCW1lbXNldCgmYWxsb2NfcGFyYW0sIDAsIHNpemVvZihhbGxvY19wYXJhbSkpOworCWFsbG9jX3BhcmFtLm9wZXJhdGlvbiA9IHN0cl9wYXJhbXMtPm9wczsKKwlhbGxvY19wYXJhbS5jb2RlY190eXBlID0gc3RyX3BhcmFtcy0+Y29kZWM7CisJYWxsb2NfcGFyYW0uc2dfY291bnQgPSBzdHJfcGFyYW1zLT5hcGFyYW1zLnNnX2NvdW50OworCWFsbG9jX3BhcmFtLnJpbmdfYnVmX2luZm9bMF0uYWRkciA9CisJCXN0cl9wYXJhbXMtPmFwYXJhbXMucmluZ19idWZfaW5mb1swXS5hZGRyOworCWFsbG9jX3BhcmFtLnJpbmdfYnVmX2luZm9bMF0uc2l6ZSA9CisJCXN0cl9wYXJhbXMtPmFwYXJhbXMucmluZ19idWZfaW5mb1swXS5zaXplOworCWFsbG9jX3BhcmFtLmZyYWdfc2l6ZSA9IHN0cl9wYXJhbXMtPmFwYXJhbXMuZnJhZ19zaXplOworCisJbWVtY3B5KCZhbGxvY19wYXJhbS5jb2RlY19wYXJhbXMsICZzdHJfcGFyYW1zLT5zcGFyYW1zLAorCQkJc2l6ZW9mKHN0cnVjdCBzbmRfc3N0X3N0cmVhbV9wYXJhbXMpKTsKKworCS8qCisJICogZmlsbCBjaGFubmVsIG1hcCBwYXJhbXMgZm9yIG11bHRpY2hhbm5lbCBzdXBwb3J0LgorCSAqIElkZWFsbHkgY2hhbm5lbCBtYXAgc2hvdWxkIGJlIHJlY2VpdmVkIGZyb20gdXBwZXIgbGF5ZXJzCisJICogZm9yIG11bHRpY2hhbm5lbCBzdXBwb3J0LgorCSAqIEN1cnJlbnRseSBoYXJkY29kaW5nIGFzIHBlciBGVyByZXFtLgorCSAqLworCW51bV9jaCA9IHNzdF9nZXRfbnVtX2NoYW5uZWwoc3RyX3BhcmFtcyk7CisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlpZiAoaSA8IG51bV9jaCkKKwkJCWFsbG9jX3BhcmFtLmNvZGVjX3BhcmFtcy51Yy5wY21fcGFyYW1zLmNoYW5uZWxfbWFwW2ldID0gaTsKKwkJZWxzZQorCQkJYWxsb2NfcGFyYW0uY29kZWNfcGFyYW1zLnVjLnBjbV9wYXJhbXMuY2hhbm5lbF9tYXBbaV0gPSAweEZGOworCX0KKworCXN0cl9pZCA9IHN0cl9wYXJhbXMtPnN0cmVhbV9pZDsKKwlzdHJfaW5mbyA9IGdldF9zdHJlYW1faW5mbyhzc3RfZHJ2X2N0eCwgc3RyX2lkKTsKKwlpZiAoc3RyX2luZm8gPT0gTlVMTCkgeworCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsICJnZXQgc3RyZWFtIGluZm8gcmV0dXJuZWQgbnVsbFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXBpcGVfaWQgPSBzdHJfcGFyYW1zLT5kZXZpY2VfdHlwZTsKKwl0YXNrX2lkID0gc3RyX3BhcmFtcy0+dGFzazsKKwlzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdLnBpcGVfaWQgPSBwaXBlX2lkOworCXNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF0udGFza19pZCA9IHRhc2tfaWQ7CisJc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXS5udW1fY2ggPSBudW1fY2g7CisKKwlpZiAoc3N0X2Rydl9jdHgtPmluZm8ubHBlX3ZpZXdwdF9ycWQpCisJCWFsbG9jX3BhcmFtLnRzID0gc3N0X2Rydl9jdHgtPmluZm8ubWFpbGJveF9zdGFydCArCisJCQlzc3RfZHJ2X2N0eC0+dHN0YW1wICsgKHN0cl9pZCAqIHNpemVvZihmd190c3RhbXApKTsKKwllbHNlCisJCWFsbG9jX3BhcmFtLnRzID0gc3N0X2Rydl9jdHgtPm1haWxib3hfYWRkICsKKwkJCXNzdF9kcnZfY3R4LT50c3RhbXAgKyAoc3RyX2lkICogc2l6ZW9mKGZ3X3RzdGFtcCkpOworCisJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiYWxsb2MgdHN0YW1wIGxvY2F0aW9uID0gMHgleFxuIiwKKwkJCWFsbG9jX3BhcmFtLnRzKTsKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJhc3NpZ25lZCBwaXBlIGlkIDB4JXggdG8gdGFzayAlZFxuIiwKKwkJCXBpcGVfaWQsIHRhc2tfaWQpOworCisJLyogYWxsb2NhdGUgZGV2aWNlIHR5cGUgY29udGV4dCAqLworCXNzdF9pbml0X3N0cmVhbSgmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXSwgYWxsb2NfcGFyYW0uY29kZWNfdHlwZSwKKwkJCXN0cl9pZCwgYWxsb2NfcGFyYW0ub3BlcmF0aW9uLCAwKTsKKworCWRldl9pbmZvKHNzdF9kcnZfY3R4LT5kZXYsICJBbGxvYyBmb3Igc3RyICVkIHBpcGUgJSN4XG4iLAorCQkJc3RyX2lkLCBwaXBlX2lkKTsKKwlyZXQgPSBzc3RfcHJlcGFyZV9hbmRfcG9zdF9tc2coc3N0X2Rydl9jdHgsIHRhc2tfaWQsIElQQ19DTUQsCisJCQlJUENfSUFfQUxMT0NfU1RSRUFNX01SRkxELCBwaXBlX2lkLCBzaXplb2YoYWxsb2NfcGFyYW0pLAorCQkJJmFsbG9jX3BhcmFtLCBkYXRhLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsICJGVyBhbGxvYyBmYWlsZWQgcmV0ICVkXG4iLCByZXQpOworCQkvKiBhbGxvYyBmYWlsZWQsIHNvIHJlc2V0IHRoZSBzdGF0ZSB0byB1bmluaXQgKi8KKwkJc3RyX2luZm8tPnN0YXR1cyA9IFNUUkVBTV9VTl9JTklUOworCQlzdHJfaWQgPSByZXQ7CisJfSBlbHNlIGlmIChkYXRhKSB7CisJCXJlc3BvbnNlID0gKHN0cnVjdCBzbmRfc3N0X2FsbG9jX3Jlc3BvbnNlICopZGF0YTsKKwkJcmV0ID0gcmVzcG9uc2UtPnN0cl90eXBlLnJlc3VsdDsKKwkJaWYgKCFyZXQpCisJCQlnb3RvIG91dDsKKwkJZGV2X2Vycihzc3RfZHJ2X2N0eC0+ZGV2LCAiRlcgYWxsb2MgZmFpbGVkIHJldCAlZFxuIiwgcmV0KTsKKwkJaWYgKHJldCA9PSBTU1RfRVJSX1NUUkVBTV9JTl9VU0UpIHsKKwkJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwKKwkJCQkiRlcgbm90IGluIGNsZWFuIHN0YXRlLCBzZW5kIGZyZWUgZm9yOiVkXG4iLCBzdHJfaWQpOworCQkJc3N0X2ZyZWVfc3RyZWFtKHNzdF9kcnZfY3R4LCBzdHJfaWQpOworCQl9CisJCXN0cl9pZCA9IC1yZXQ7CisJfQorb3V0OgorCWtmcmVlKGRhdGEpOworCXJldHVybiBzdHJfaWQ7Cit9CisKKy8qKgorKiBzc3Rfc3RhcnRfc3RyZWFtIC0gU2VuZCBtc2cgZm9yIGEgc3RhcnRpbmcgc3RyZWFtCisqIEBzdHJfaWQ6CSBzdHJlYW0gSUQKKyoKKyogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYW55IGZ1bmN0aW9uIHdoaWNoIHdhbnRzIHRvIHN0YXJ0CisqIGEgc3RyZWFtLgorKi8KK2ludCBzc3Rfc3RhcnRfc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgaW50IHN0cl9pZCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvOworCXUxNiBkYXRhID0gMDsKKworCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgInNzdF9zdGFydF9zdHJlYW0gZm9yICVkXG4iLCBzdHJfaWQpOworCXN0cl9pbmZvID0gZ2V0X3N0cmVhbV9pbmZvKHNzdF9kcnZfY3R4LCBzdHJfaWQpOworCWlmICghc3RyX2luZm8pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzdHJfaW5mby0+c3RhdHVzICE9IFNUUkVBTV9SVU5OSU5HKQorCQlyZXR1cm4gLUVCQURSUUM7CisKKwlyZXR2YWwgPSBzc3RfcHJlcGFyZV9hbmRfcG9zdF9tc2coc3N0X2Rydl9jdHgsIHN0cl9pbmZvLT50YXNrX2lkLAorCQkJSVBDX0NNRCwgSVBDX0lBX1NUQVJUX1NUUkVBTV9NUkZMRCwgc3RyX2luZm8tPnBpcGVfaWQsCisJCQlzaXplb2YodTE2KSwgJmRhdGEsIE5VTEwsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKK2ludCBzc3Rfc2VuZF9ieXRlX3N0cmVhbV9tcmZsZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsCisJCXN0cnVjdCBzbmRfc3N0X2J5dGVzX3YyICpieXRlcykKK3sJc3RydWN0IGlwY19wb3N0ICptc2cgPSBOVUxMOworCXUzMiBsZW5ndGg7CisJaW50IHB2dF9pZCwgcmV0ID0gMDsKKwlzdHJ1Y3Qgc3N0X2Jsb2NrICpibG9jayA9IE5VTEw7CisKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsCisJCSJ0eXBlOiV1IGlwY19tc2c6JXUgYmxvY2s6JXUgdGFza19pZDoldSBwaXBlOiAlI3ggbGVuZ3RoOiUjeFxuIiwKKwkJYnl0ZXMtPnR5cGUsIGJ5dGVzLT5pcGNfbXNnLCBieXRlcy0+YmxvY2ssIGJ5dGVzLT50YXNrX2lkLAorCQlieXRlcy0+cGlwZV9pZCwgYnl0ZXMtPmxlbik7CisKKwlpZiAoc3N0X2NyZWF0ZV9pcGNfbXNnKCZtc2csIHRydWUpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXB2dF9pZCA9IHNzdF9hc3NpZ25fcHZ0X2lkKHNzdF9kcnZfY3R4KTsKKwlzc3RfZmlsbF9oZWFkZXJfbXJmbGQoJm1zZy0+bXJmbGRfaGVhZGVyLCBieXRlcy0+aXBjX21zZywKKwkJCWJ5dGVzLT50YXNrX2lkLCAxLCBwdnRfaWQpOworCW1zZy0+bXJmbGRfaGVhZGVyLnAuaGVhZGVyX2hpZ2gucGFydC5yZXNfcnFkID0gYnl0ZXMtPmJsb2NrOworCWxlbmd0aCA9IGJ5dGVzLT5sZW47CisJbXNnLT5tcmZsZF9oZWFkZXIucC5oZWFkZXJfbG93X3BheWxvYWQgPSBsZW5ndGg7CisJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAibGVuZ3RoIGlzICVkXG4iLCBsZW5ndGgpOworCW1lbWNweShtc2ctPm1haWxib3hfZGF0YSwgJmJ5dGVzLT5ieXRlcywgYnl0ZXMtPmxlbik7CisJaWYgKGJ5dGVzLT5ibG9jaykgeworCQlibG9jayA9IHNzdF9jcmVhdGVfYmxvY2soc3N0X2Rydl9jdHgsIGJ5dGVzLT5pcGNfbXNnLCBwdnRfaWQpOworCQlpZiAoYmxvY2sgPT0gTlVMTCkgeworCQkJa2ZyZWUobXNnKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCXNzdF9hZGRfdG9fZGlzcGF0Y2hfbGlzdF9hbmRfcG9zdChzc3RfZHJ2X2N0eCwgbXNnKTsKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZDolZCIsCisJCQltc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZCk7CisKKwlpZiAoYnl0ZXMtPmJsb2NrKSB7CisJCXJldCA9IHNzdF93YWl0X3RpbWVvdXQoc3N0X2Rydl9jdHgsIGJsb2NrKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihzc3RfZHJ2X2N0eC0+ZGV2LCAiZncgcmV0dXJuZWQgZXJyICVkXG4iLCByZXQpOworCQkJc3N0X2ZyZWVfYmxvY2soc3N0X2Rydl9jdHgsIGJsb2NrKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWlmIChieXRlcy0+dHlwZSA9PSBTTkRfU1NUX0JZVEVTX0dFVCkgeworCQkvKgorCQkgKiBjb3B5IHRoZSByZXBseSBhbmQgc2VuZCBiYWNrCisJCSAqIHdlIG5lZWQgdG8gdXBkYXRlIG9ubHkgc3ogYW5kIHBheWxvYWQKKwkJICovCisJCWlmIChieXRlcy0+YmxvY2spIHsKKwkJCXVuc2lnbmVkIGNoYXIgKnIgPSBibG9jay0+ZGF0YTsKKworCQkJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAicmVhZCBiYWNrICVkIGJ5dGVzIiwKKwkJCQkJYnl0ZXMtPmxlbik7CisJCQltZW1jcHkoYnl0ZXMtPmJ5dGVzLCByLCBieXRlcy0+bGVuKTsKKwkJfQorCX0KKwlpZiAoYnl0ZXMtPmJsb2NrKQorCQlzc3RfZnJlZV9ibG9jayhzc3RfZHJ2X2N0eCwgYmxvY2spOworb3V0OgorCXRlc3RfYW5kX2NsZWFyX2JpdChwdnRfaWQsICZzc3RfZHJ2X2N0eC0+cHZ0X2lkKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNzdF9wYXVzZV9zdHJlYW0gLSBTZW5kIG1zZyBmb3IgYSBwYXVzaW5nIHN0cmVhbQorICogQHN0cl9pZDoJIHN0cmVhbSBJRAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFueSBmdW5jdGlvbiB3aGljaCB3YW50cyB0byBwYXVzZQorICogYW4gYWxyZWFkeSBydW5uaW5nIHN0cmVhbS4KKyAqLworaW50IHNzdF9wYXVzZV9zdHJlYW0oc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBpbnQgc3RyX2lkKQoreworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm87CisKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJTU1QgREJHOnNzdF9wYXVzZV9zdHJlYW0gZm9yICVkXG4iLCBzdHJfaWQpOworCXN0cl9pbmZvID0gZ2V0X3N0cmVhbV9pbmZvKHNzdF9kcnZfY3R4LCBzdHJfaWQpOworCWlmICghc3RyX2luZm8pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChzdHJfaW5mby0+c3RhdHVzID09IFNUUkVBTV9QQVVTRUQpCisJCXJldHVybiAwOworCWlmIChzdHJfaW5mby0+c3RhdHVzID09IFNUUkVBTV9SVU5OSU5HIHx8CisJCXN0cl9pbmZvLT5zdGF0dXMgPT0gU1RSRUFNX0lOSVQpIHsKKwkJaWYgKHN0cl9pbmZvLT5wcmV2ID09IFNUUkVBTV9VTl9JTklUKQorCQkJcmV0dXJuIC1FQkFEUlFDOworCisJCXJldHZhbCA9IHNzdF9wcmVwYXJlX2FuZF9wb3N0X21zZyhzc3RfZHJ2X2N0eCwgc3RyX2luZm8tPnRhc2tfaWQsIElQQ19DTUQsCisJCQkJSVBDX0lBX1BBVVNFX1NUUkVBTV9NUkZMRCwgc3RyX2luZm8tPnBpcGVfaWQsCisJCQkJMCwgTlVMTCwgTlVMTCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworCisJCWlmIChyZXR2YWwgPT0gMCkgeworCQkJc3RyX2luZm8tPnByZXYgPSBzdHJfaW5mby0+c3RhdHVzOworCQkJc3RyX2luZm8tPnN0YXR1cyA9IFNUUkVBTV9QQVVTRUQ7CisJCX0gZWxzZSBpZiAocmV0dmFsID09IFNTVF9FUlJfSU5WQUxJRF9TVFJFQU1fSUQpIHsKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJCQltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOworCQkJc3N0X2NsZWFuX3N0cmVhbShzdHJfaW5mbyk7CisJCQltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CisJCX0KKwl9IGVsc2UgeworCQlyZXR2YWwgPSAtRUJBRFJRQzsKKwkJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiU1NUIERCRzpCQURSUUMgZm9yIHN0cmVhbVxuICIpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogc3N0X3Jlc3VtZV9zdHJlYW0gLSBTZW5kIG1zZyBmb3IgcmVzdW1pbmcgc3RyZWFtCisgKiBAc3RyX2lkOgkJc3RyZWFtIElECisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYW55IGZ1bmN0aW9uIHdoaWNoIHdhbnRzIHRvIHJlc3VtZQorICogYW4gYWxyZWFkeSBwYXVzZWQgc3RyZWFtLgorICovCitpbnQgc3N0X3Jlc3VtZV9zdHJlYW0oc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBpbnQgc3RyX2lkKQoreworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm87CisKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJTU1QgREJHOnNzdF9yZXN1bWVfc3RyZWFtIGZvciAlZFxuIiwgc3RyX2lkKTsKKwlzdHJfaW5mbyA9IGdldF9zdHJlYW1faW5mbyhzc3RfZHJ2X2N0eCwgc3RyX2lkKTsKKwlpZiAoIXN0cl9pbmZvKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RyX2luZm8tPnN0YXR1cyA9PSBTVFJFQU1fUlVOTklORykKKwkJCXJldHVybiAwOworCWlmIChzdHJfaW5mby0+c3RhdHVzID09IFNUUkVBTV9QQVVTRUQpIHsKKwkJcmV0dmFsID0gc3N0X3ByZXBhcmVfYW5kX3Bvc3RfbXNnKHNzdF9kcnZfY3R4LCBzdHJfaW5mby0+dGFza19pZCwKKwkJCQlJUENfQ01ELCBJUENfSUFfUkVTVU1FX1NUUkVBTV9NUkZMRCwKKwkJCQlzdHJfaW5mby0+cGlwZV9pZCwgMCwgTlVMTCwgTlVMTCwKKwkJCQl0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisKKwkJaWYgKCFyZXR2YWwpIHsKKwkJCWlmIChzdHJfaW5mby0+cHJldiA9PSBTVFJFQU1fUlVOTklORykKKwkJCQlzdHJfaW5mby0+c3RhdHVzID0gU1RSRUFNX1JVTk5JTkc7CisJCQllbHNlCisJCQkJc3RyX2luZm8tPnN0YXR1cyA9IFNUUkVBTV9JTklUOworCQkJc3RyX2luZm8tPnByZXYgPSBTVFJFQU1fUEFVU0VEOworCQl9IGVsc2UgaWYgKHJldHZhbCA9PSAtU1NUX0VSUl9JTlZBTElEX1NUUkVBTV9JRCkgeworCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CisJCQlzc3RfY2xlYW5fc3RyZWFtKHN0cl9pbmZvKTsKKwkJCW11dGV4X3VubG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHZhbCA9IC1FQkFEUlFDOworCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsICJTU1QgRVJSOiBCQURRUkMgZm9yIHN0cmVhbVxuIik7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworCisvKioKKyAqIHNzdF9kcm9wX3N0cmVhbSAtIFNlbmQgbXNnIGZvciBzdG9wcGluZyBzdHJlYW0KKyAqIEBzdHJfaWQ6CQlzdHJlYW0gSUQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhbnkgZnVuY3Rpb24gd2hpY2ggd2FudHMgdG8gc3RvcAorICogYSBzdHJlYW0uCisgKi8KK2ludCBzc3RfZHJvcF9zdHJlYW0oc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBpbnQgc3RyX2lkKQoreworCWludCByZXR2YWwgPSAwOworCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm87CisKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJTU1QgREJHOnNzdF9kcm9wX3N0cmVhbSBmb3IgJWRcbiIsIHN0cl9pZCk7CisJc3RyX2luZm8gPSBnZXRfc3RyZWFtX2luZm8oc3N0X2Rydl9jdHgsIHN0cl9pZCk7CisJaWYgKCFzdHJfaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc3RyX2luZm8tPnN0YXR1cyAhPSBTVFJFQU1fVU5fSU5JVCkgeworCQlzdHJfaW5mby0+cHJldiA9IFNUUkVBTV9VTl9JTklUOworCQlzdHJfaW5mby0+c3RhdHVzID0gU1RSRUFNX0lOSVQ7CisJCXN0cl9pbmZvLT5jdW1tX2J5dGVzID0gMDsKKwkJcmV0dmFsID0gc3N0X3ByZXBhcmVfYW5kX3Bvc3RfbXNnKHNzdF9kcnZfY3R4LCBzdHJfaW5mby0+dGFza19pZCwKKwkJCQlJUENfQ01ELCBJUENfSUFfRFJPUF9TVFJFQU1fTVJGTEQsCisJCQkJc3RyX2luZm8tPnBpcGVfaWQsIDAsIE5VTEwsIE5VTEwsCisJCQkJdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpOworCX0gZWxzZSB7CisJCXJldHZhbCA9IC1FQkFEUlFDOworCQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJCQURRUkMgZm9yIHN0cmVhbSwgc3RhdGUgJXhcbiIsCisJCQkJc3RyX2luZm8tPnN0YXR1cyk7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorKiBzc3RfZHJhaW5fc3RyZWFtIC0gU2VuZCBtc2cgZm9yIGRyYWluaW5nIHN0cmVhbQorKiBAc3RyX2lkOgkJc3RyZWFtIElECisqCisqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFueSBmdW5jdGlvbiB3aGljaCB3YW50cyB0byBkcmFpbgorKiBhIHN0cmVhbS4KKyovCitpbnQgc3N0X2RyYWluX3N0cmVhbShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsCisJCQlpbnQgc3RyX2lkLCBib29sIHBhcnRpYWxfZHJhaW4pCit7CisJaW50IHJldHZhbCA9IDA7CisJc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKKworCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIlNTVCBEQkc6c3N0X2RyYWluX3N0cmVhbSBmb3IgJWRcbiIsIHN0cl9pZCk7CisJc3RyX2luZm8gPSBnZXRfc3RyZWFtX2luZm8oc3N0X2Rydl9jdHgsIHN0cl9pZCk7CisJaWYgKCFzdHJfaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHN0cl9pbmZvLT5zdGF0dXMgIT0gU1RSRUFNX1JVTk5JTkcgJiYKKwkJc3RyX2luZm8tPnN0YXR1cyAhPSBTVFJFQU1fSU5JVCAmJgorCQlzdHJfaW5mby0+c3RhdHVzICE9IFNUUkVBTV9QQVVTRUQpIHsKKwkJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwgIlNTVCBFUlI6IEJBRFFSQyBmb3Igc3RyZWFtID0gJWRcbiIsCisJCQkJICAgICAgIHN0cl9pbmZvLT5zdGF0dXMpOworCQkJcmV0dXJuIC1FQkFEUlFDOworCX0KKworCXJldHZhbCA9IHNzdF9wcmVwYXJlX2FuZF9wb3N0X21zZyhzc3RfZHJ2X2N0eCwgc3RyX2luZm8tPnRhc2tfaWQsIElQQ19DTUQsCisJCQlJUENfSUFfRFJBSU5fU1RSRUFNX01SRkxELCBzdHJfaW5mby0+cGlwZV9pZCwKKwkJCXNpemVvZih1OCksICZwYXJ0aWFsX2RyYWluLCBOVUxMLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworCS8qCisJICogd2l0aCBuZXcgbm9uIGJsb2NrZWQgZHJhaW4gaW1wbGVtZW50YXRpb24gaW4gY29yZSB3ZSBkb250IG5lZWQgdG8KKwkgKiB3YWl0IGZvciByZXNwc29uc2UsIGFuZCBuZWVkIHRvIG9ubHkgaW52b2tlIGNhbGxiYWNrIGZvciBkcmFpbgorCSAqIGNvbXBsZXRlCisJICovCisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHNzdF9mcmVlX3N0cmVhbSAtIEZyZWVzIGEgc3RyZWFtCisgKiBAc3RyX2lkOgkJc3RyZWFtIElECisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYW55IGZ1bmN0aW9uIHdoaWNoIHdhbnRzIHRvIGZyZWUKKyAqIGEgc3RyZWFtLgorICovCitpbnQgc3N0X2ZyZWVfc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgaW50IHN0cl9pZCkKK3sKKwlpbnQgcmV0dmFsID0gMDsKKwlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvOworCXN0cnVjdCBpbnRlbF9zc3Rfb3BzICpvcHM7CisKKwlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJTU1QgREJHOnNzdF9mcmVlX3N0cmVhbSBmb3IgJWRcbiIsIHN0cl9pZCk7CisKKwltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOworCWlmIChzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID09IFNTVF9SRVNFVCkgeworCQltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CisJc3RyX2luZm8gPSBnZXRfc3RyZWFtX2luZm8oc3N0X2Rydl9jdHgsIHN0cl9pZCk7CisJaWYgKCFzdHJfaW5mbykKKwkJcmV0dXJuIC1FSU5WQUw7CisJb3BzID0gc3N0X2Rydl9jdHgtPm9wczsKKworCW11dGV4X2xvY2soJnN0cl9pbmZvLT5sb2NrKTsKKwlpZiAoc3RyX2luZm8tPnN0YXR1cyAhPSBTVFJFQU1fVU5fSU5JVCkgeworCQlzdHJfaW5mby0+cHJldiA9ICBzdHJfaW5mby0+c3RhdHVzOworCQlzdHJfaW5mby0+c3RhdHVzID0gU1RSRUFNX1VOX0lOSVQ7CisJCW11dGV4X3VubG9jaygmc3RyX2luZm8tPmxvY2spOworCisJCWRldl9pbmZvKHNzdF9kcnZfY3R4LT5kZXYsICJGcmVlIGZvciBzdHIgJWQgcGlwZSAlI3hcbiIsCisJCQkJc3RyX2lkLCBzdHJfaW5mby0+cGlwZV9pZCk7CisJCXJldHZhbCA9IHNzdF9wcmVwYXJlX2FuZF9wb3N0X21zZyhzc3RfZHJ2X2N0eCwgc3RyX2luZm8tPnRhc2tfaWQsIElQQ19DTUQsCisJCQkJSVBDX0lBX0ZSRUVfU1RSRUFNX01SRkxELCBzdHJfaW5mby0+cGlwZV9pZCwgMCwKKwkJCQlOVUxMLCBOVUxMLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisKKwkJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAic3N0OiB3YWl0IGZvciBmcmVlIHJldHVybmVkICVkXG4iLAorCQkJCXJldHZhbCk7CisJCW11dGV4X2xvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CisJCXNzdF9jbGVhbl9zdHJlYW0oc3RyX2luZm8pOworCQltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7CisJCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIlNTVCBEQkc6U3RyZWFtIGZyZWVkXG4iKTsKKwl9IGVsc2UgeworCQltdXRleF91bmxvY2soJnN0cl9pbmZvLT5sb2NrKTsKKwkJcmV0dmFsID0gLUVCQURSUUM7CisJCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIlNTVCBEQkc6QkFEUVJDIGZvciBzdHJlYW1cbiIpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYmF5dHJhaWwvTWFrZWZpbGUgYi9zb3VuZC9zb2MvaW50ZWwvYmF5dHJhaWwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4NDA4YwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9iYXl0cmFpbC9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKK3NuZC1zb2Mtc3N0LWJheXRyYWlsLXBjbS1vYmpzIDo9IFwKKwkgICAgICAgIHNzdC1iYXl0cmFpbC1pcGMubyBzc3QtYmF5dHJhaWwtcGNtLm8gc3N0LWJheXRyYWlsLWRzcC5vCisKK29iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0JBWVRSQUlMKSArPSBzbmQtc29jLXNzdC1iYXl0cmFpbC1wY20ubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2JheXRyYWlsL3NzdC1iYXl0cmFpbC1kc3AuYyBiL3NvdW5kL3NvYy9pbnRlbC9iYXl0cmFpbC9zc3QtYmF5dHJhaWwtZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFkMDIzYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9iYXl0cmFpbC9zc3QtYmF5dHJhaWwtZHNwLmMKQEAgLTAsMCArMSwzNjYgQEAKKy8qCisgKiBJbnRlbCBCYXl0cmFpbCBTU1QgRFNQIGRyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCisjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1kc3AuaCIKKyNpbmNsdWRlICIuLi9jb21tb24vc3N0LWRzcC1wcml2LmgiCisjaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgorCisjZGVmaW5lIFNTVF9CWVRfRldfU0lHTkFUVVJFX1NJWkUJNAorI2RlZmluZSBTU1RfQllUX0ZXX1NJR04JCQkiJFNTVCIKKworI2RlZmluZSBTU1RfQllUX0lSQU1fT0ZGU0VUCTB4QzAwMDAKKyNkZWZpbmUgU1NUX0JZVF9EUkFNX09GRlNFVAkweDEwMDAwMAorI2RlZmluZSBTU1RfQllUX1NISU1fT0ZGU0VUCTB4MTQwMDAwCisKK2VudW0gc3N0X3JhbV90eXBlIHsKKwlTU1RfQllUX0lSQU0JPSAxLAorCVNTVF9CWVRfRFJBTQk9IDIsCisJU1NUX0JZVF9DQUNIRQk9IDMsCit9OworCitzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8geworCWVudW0gc3N0X3JhbV90eXBlCXR5cGU7CS8qIElSQU0vRFJBTSAqLworCXUzMgkJCXNpemU7CS8qIEJ5dGVzICovCisJdTMyCQkJcmFtX29mZnNldDsgLyogT2Zmc2V0IGluIEkvRFJBTSAqLworCXUzMgkJCXJzdmQ7CS8qIFJlc2VydmVkIGZpZWxkICovCit9OworCitzdHJ1Y3QgZndfaGVhZGVyIHsKKwl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTU1RfQllUX0ZXX1NJR05BVFVSRV9TSVpFXTsKKwl1MzIgZmlsZV9zaXplOyAvKiBzaXplIG9mIGZ3IG1pbnVzIHRoaXMgaGVhZGVyICovCisJdTMyIG1vZHVsZXM7IC8qICAjIG9mIG1vZHVsZXMgKi8KKwl1MzIgZmlsZV9mb3JtYXQ7IC8qIHZlcnNpb24gb2YgaGVhZGVyIGZvcm1hdCAqLworCXUzMiByZXNlcnZlZFs0XTsKK307CisKK3N0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW1NTVF9CWVRfRldfU0lHTkFUVVJFX1NJWkVdOworCXUzMiBtb2Rfc2l6ZTsgLyogc2l6ZSBvZiBtb2R1bGUgKi8KKwl1MzIgYmxvY2tzOyAvKiAjIG9mIGJsb2NrcyAqLworCXUzMiB0eXBlOyAvKiBjb2RlYyB0eXBlLCBwcCBsaWIgKi8KKwl1MzIgZW50cnlfcG9pbnQ7Cit9OworCitzdGF0aWMgaW50IHNzdF9ieXRfcGFyc2VfbW9kdWxlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBzc3RfZncgKmZ3LAorCQkJCXN0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgKm1vZHVsZSkKK3sKKwlzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8gKmJsb2NrOworCXN0cnVjdCBzc3RfbW9kdWxlICptb2Q7CisJc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgdGVtcGxhdGU7CisJaW50IGNvdW50OworCisJbWVtc2V0KCZ0ZW1wbGF0ZSwgMCwgc2l6ZW9mKHRlbXBsYXRlKSk7CisJdGVtcGxhdGUuaWQgPSBtb2R1bGUtPnR5cGU7CisJdGVtcGxhdGUuZW50cnkgPSBtb2R1bGUtPmVudHJ5X3BvaW50OworCisJbW9kID0gc3N0X21vZHVsZV9uZXcoZncsICZ0ZW1wbGF0ZSwgTlVMTCk7CisJaWYgKG1vZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJsb2NrID0gKHZvaWQgKiltb2R1bGUgKyBzaXplb2YoKm1vZHVsZSk7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBtb2R1bGUtPmJsb2NrczsgY291bnQrKykgeworCisJCWlmIChibG9jay0+c2l6ZSA8PSAwKSB7CisJCQlkZXZfZXJyKGRzcC0+ZGV2LCAiYmxvY2sgJWQgc2l6ZSBpbnZhbGlkXG4iLCBjb3VudCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCXN3aXRjaCAoYmxvY2stPnR5cGUpIHsKKwkJY2FzZSBTU1RfQllUX0lSQU06CisJCQltb2QtPm9mZnNldCA9IGJsb2NrLT5yYW1fb2Zmc2V0ICsKKwkJCQkJICAgIGRzcC0+YWRkci5pcmFtX29mZnNldDsKKwkJCW1vZC0+dHlwZSA9IFNTVF9NRU1fSVJBTTsKKwkJCWJyZWFrOworCQljYXNlIFNTVF9CWVRfRFJBTToKKwkJCW1vZC0+b2Zmc2V0ID0gYmxvY2stPnJhbV9vZmZzZXQgKworCQkJCQkgICAgZHNwLT5hZGRyLmRyYW1fb2Zmc2V0OworCQkJbW9kLT50eXBlID0gU1NUX01FTV9EUkFNOworCQkJYnJlYWs7CisJCWNhc2UgU1NUX0JZVF9DQUNIRToKKwkJCW1vZC0+b2Zmc2V0ID0gYmxvY2stPnJhbV9vZmZzZXQgKworCQkJCQkgICAgKGRzcC0+YWRkci5md19leHQgLSBkc3AtPmFkZHIubHBlKTsKKwkJCW1vZC0+dHlwZSA9IFNTVF9NRU1fQ0FDSEU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoZHNwLT5kZXYsICJ3cm9uZyByYW0gdHlwZSAweCV4IGluIGJsb2NrMHgleFxuIiwKKwkJCQlibG9jay0+dHlwZSwgY291bnQpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQltb2QtPnNpemUgPSBibG9jay0+c2l6ZTsKKwkJbW9kLT5kYXRhID0gKHZvaWQgKilibG9jayArIHNpemVvZigqYmxvY2spOworCisJCXNzdF9tb2R1bGVfYWxsb2NfYmxvY2tzKG1vZCk7CisKKwkJYmxvY2sgPSAodm9pZCAqKWJsb2NrICsgc2l6ZW9mKCpibG9jaykgKyBibG9jay0+c2l6ZTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wYXJzZV9md19pbWFnZShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpCit7CisJc3RydWN0IGZ3X2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgKm1vZHVsZTsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X2Z3LT5kc3A7CisJaW50IHJldCwgY291bnQ7CisKKwkvKiBSZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGF0YSBwb2ludGVyICovCisJaGVhZGVyID0gKHN0cnVjdCBmd19oZWFkZXIgKilzc3RfZnctPmRtYV9idWY7CisKKwkvKiB2ZXJpZnkgRlcgKi8KKwlpZiAoKHN0cm5jbXAoaGVhZGVyLT5zaWduYXR1cmUsIFNTVF9CWVRfRldfU0lHTiwgNCkgIT0gMCkgfHwKKwkgICAgKHNzdF9mdy0+c2l6ZSAhPSBoZWFkZXItPmZpbGVfc2l6ZSArIHNpemVvZigqaGVhZGVyKSkpIHsKKwkJLyogSW52YWxpZCBGVyBzaWduYXR1cmUgKi8KKwkJZGV2X2Vycihkc3AtPmRldiwgIkludmFsaWQgRlcgc2lnbi9maWxlc2l6ZSBtaXNtYXRjaFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcoZHNwLT5kZXYsCisJCSJoZWFkZXIgc2lnbj0lNHMgc2l6ZT0weCV4IG1vZHVsZXM9MHgleCBmbXQ9MHgleCBzaXplPSV6dVxuIiwKKwkJaGVhZGVyLT5zaWduYXR1cmUsIGhlYWRlci0+ZmlsZV9zaXplLCBoZWFkZXItPm1vZHVsZXMsCisJCWhlYWRlci0+ZmlsZV9mb3JtYXQsIHNpemVvZigqaGVhZGVyKSk7CisKKwltb2R1bGUgPSAodm9pZCAqKXNzdF9mdy0+ZG1hX2J1ZiArIHNpemVvZigqaGVhZGVyKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBoZWFkZXItPm1vZHVsZXM7IGNvdW50KyspIHsKKwkJLyogbW9kdWxlICovCisJCXJldCA9IHNzdF9ieXRfcGFyc2VfbW9kdWxlKGRzcCwgc3N0X2Z3LCBtb2R1bGUpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2Vycihkc3AtPmRldiwgImludmFsaWQgbW9kdWxlICVkXG4iLCBjb3VudCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW1vZHVsZSA9ICh2b2lkICopbW9kdWxlICsgc2l6ZW9mKCptb2R1bGUpICsgbW9kdWxlLT5tb2Rfc2l6ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3N0X2J5dF9kdW1wX3NoaW0oc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwlpbnQgaTsKKwl1NjQgcmVnOworCisJZm9yIChpID0gMDsgaSA8PSAweEYwOyBpICs9IDgpIHsKKwkJcmVnID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIGkpOworCQlpZiAocmVnKQorCQkJZGV2X2RiZyhzc3QtPmRldiwgInNoaW0gMHglMi4yeCB2YWx1ZSAweCUxNi4xNmxseFxuIiwKKwkJCQlpLCByZWcpOworCX0KKworCWZvciAoaSA9IDB4MDA7IGkgPD0gMHhmZjsgaSArPSA0KSB7CisJCXJlZyA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgaSk7CisJCWlmIChyZWcpCisJCQlkZXZfZGJnKHNzdC0+ZGV2LCAicGNpIDB4JTIuMnggdmFsdWUgMHglOC44eFxuIiwKKwkJCQlpLCAodTMyKXJlZyk7CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3N0X2J5dF9pcnEoaW50IGlycSwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gKHN0cnVjdCBzc3RfZHNwICopIGNvbnRleHQ7CisJdTY0IGlzcng7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJnNzdC0+c3BpbmxvY2spOworCisJaXNyeCA9IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3N0LCBTU1RfSVNSWCk7CisJaWYgKGlzcnggJiBTU1RfSVNSWF9ET05FKSB7CisJCS8qIEFEU1AgaGFzIHByb2Nlc3NlZCB0aGUgbWVzc2FnZSByZXF1ZXN0IGZyb20gSUEgKi8KKwkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDWCwKKwkJCQkJCSAgICBTU1RfQllUX0lQQ1hfRE9ORSwgMCk7CisJCXJldCA9IElSUV9XQUtFX1RIUkVBRDsKKwl9CisJaWYgKGlzcnggJiBTU1RfQllUX0lTUlhfUkVRVUVTVCkgeworCQkvKiBtYXNrIG1lc3NhZ2UgcmVxdWVzdCBmcm9tIEFEU1AgYW5kIGRvIHByb2Nlc3NpbmcgbGF0ZXIgKi8KKwkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3N0LCBTU1RfSU1SWCwKKwkJCQkJCSAgICBTU1RfQllUX0lNUlhfUkVRVUVTVCwKKwkJCQkJCSAgICBTU1RfQllUX0lNUlhfUkVRVUVTVCk7CisJCXJldCA9IElSUV9XQUtFX1RIUkVBRDsKKwl9CisKKwlzcGluX3VubG9jaygmc3N0LT5zcGlubG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X2Jvb3Qoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwlpbnQgdHJpZXMgPSAxMDsKKworCS8qCisJICogc2F2ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBleHRlbmRlZCBmaXJtd2FyZSBibG9jayBpbiB0aGUgZmlyc3QKKwkgKiA0IGJ5dGVzIG9mIHRoZSBtYWlsYm94CisJICovCisJbWVtY3B5X3RvaW8oc3N0LT5hZGRyLmxwZSArIFNTVF9CWVRfTUFJTEJPWF9PRkZTRVQsCisJICAgICAgICZzc3QtPnBkYXRhLT5md19iYXNlLCBzaXplb2YodTMyKSk7CisKKwkvKiByZWxlYXNlIHN0YWxsIGFuZCB3YWl0IHRvIHVuc3RhbGwgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9DU1IsIFNTVF9CWVRfQ1NSX1NUQUxMLCAweDApOworCXdoaWxlICh0cmllcy0tKSB7CisJCWlmICghKHNzdF9kc3Bfc2hpbV9yZWFkNjQoc3N0LCBTU1RfQ1NSKSAmCisJCSAgICAgIFNTVF9CWVRfQ1NSX1BXQUlUTU9ERSkpCisJCQlicmVhazsKKwkJbXNsZWVwKDEwMCk7CisJfQorCWlmICh0cmllcyA8IDApIHsKKwkJZGV2X2Vycihzc3QtPmRldiwgInVuYWJsZSB0byBzdGFydCBEU1BcbiIpOworCQlzc3RfYnl0X2R1bXBfc2hpbShzc3QpOworCX0KK30KKworc3RhdGljIHZvaWQgc3N0X2J5dF9yZXNldChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCS8qIHB1dCBEU1AgaW50byByZXNldCwgc2V0IHJlc2V0IHZlY3RvciBhbmQgc3RhbGwgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9DU1IsCisJCVNTVF9CWVRfQ1NSX1JTVCB8IFNTVF9CWVRfQ1NSX1ZFQ1RPUl9TRUwgfCBTU1RfQllUX0NTUl9TVEFMTCwKKwkJU1NUX0JZVF9DU1JfUlNUIHwgU1NUX0JZVF9DU1JfVkVDVE9SX1NFTCB8IFNTVF9CWVRfQ1NSX1NUQUxMKTsKKworCXVkZWxheSgxMCk7CisKKwkvKiB0YWtlIERTUCBvdXQgb2YgcmVzZXQgYW5kIGtlZXAgc3RhbGxlZCBmb3IgRlcgbG9hZGluZyAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0KHNzdCwgU1NUX0NTUiwgU1NUX0JZVF9DU1JfUlNULCAwKTsKK30KKworc3RydWN0IHNzdF9hZHNwX21lbXJlZ2lvbiB7CisJdTMyIHN0YXJ0OworCXUzMiBlbmQ7CisJaW50IGJsb2NrczsKKwllbnVtIHNzdF9tZW1fdHlwZSB0eXBlOworfTsKKworLyogQllUIHRlc3Qgc3R1ZmYgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uIGJ5dF9yZWdpb25bXSA9IHsKKwl7MHhDMDAwMCwgMHgxMDAwMDAsIDgsIFNTVF9NRU1fSVJBTX0sIC8qIEktU1JBTSAtIDggKiAzMmtCICovCisJezB4MTAwMDAwLCAweDE0MDAwMCwgOCwgU1NUX01FTV9EUkFNfSwgLyogRC1TUkFNMCAtIDggKiAzMmtCICovCit9OworCitzdGF0aWMgaW50IHNzdF9ieXRfcmVzb3VyY2VfbWFwKHN0cnVjdCBzc3RfZHNwICpzc3QsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXNzdC0+YWRkci5scGVfYmFzZSA9IHBkYXRhLT5scGVfYmFzZTsKKwlzc3QtPmFkZHIubHBlID0gaW9yZW1hcChwZGF0YS0+bHBlX2Jhc2UsIHBkYXRhLT5scGVfc2l6ZSk7CisJaWYgKCFzc3QtPmFkZHIubHBlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIEFEU1AgUENJIE1NSU8gY29uZmlnIHNwYWNlICovCisJc3N0LT5hZGRyLnBjaV9jZmcgPSBpb3JlbWFwKHBkYXRhLT5wY2ljZmdfYmFzZSwgcGRhdGEtPnBjaWNmZ19zaXplKTsKKwlpZiAoIXNzdC0+YWRkci5wY2lfY2ZnKSB7CisJCWlvdW5tYXAoc3N0LT5hZGRyLmxwZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNTVCBFeHRlbmRlZCBGVyBhbGxvY2F0aW9uICovCisJc3N0LT5hZGRyLmZ3X2V4dCA9IGlvcmVtYXAocGRhdGEtPmZ3X2Jhc2UsIHBkYXRhLT5md19zaXplKTsKKwlpZiAoIXNzdC0+YWRkci5md19leHQpIHsKKwkJaW91bm1hcChzc3QtPmFkZHIucGNpX2NmZyk7CisJCWlvdW5tYXAoc3N0LT5hZGRyLmxwZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNTVCBTaGltICovCisJc3N0LT5hZGRyLnNoaW0gPSBzc3QtPmFkZHIubHBlICsgc3N0LT5hZGRyLnNoaW1fb2Zmc2V0OworCisJc3N0X2RzcF9tYWlsYm94X2luaXQoc3N0LCBTU1RfQllUX01BSUxCT1hfT0ZGU0VUICsgMHgyMDQsCisJCQkgICAgIFNTVF9CWVRfSVBDX01BWF9QQVlMT0FEX1NJWkUsCisJCQkgICAgIFNTVF9CWVRfTUFJTEJPWF9PRkZTRVQsCisJCQkgICAgIFNTVF9CWVRfSVBDX01BWF9QQVlMT0FEX1NJWkUpOworCisJc3N0LT5pcnEgPSBwZGF0YS0+aXJxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9pbml0KHN0cnVjdCBzc3RfZHNwICpzc3QsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCWNvbnN0IHN0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24gKnJlZ2lvbjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IHJldCA9IC1FTk9ERVYsIGksIGosIHJlZ2lvbl9jb3VudDsKKwl1MzIgb2Zmc2V0LCBzaXplOworCisJZGV2ID0gc3N0LT5kZXY7CisKKwlzd2l0Y2ggKHNzdC0+aWQpIHsKKwljYXNlIFNTVF9ERVZfSURfQllUOgorCQlyZWdpb24gPSBieXRfcmVnaW9uOworCQlyZWdpb25fY291bnQgPSBBUlJBWV9TSVpFKGJ5dF9yZWdpb24pOworCQlzc3QtPmFkZHIuaXJhbV9vZmZzZXQgPSBTU1RfQllUX0lSQU1fT0ZGU0VUOworCQlzc3QtPmFkZHIuZHJhbV9vZmZzZXQgPSBTU1RfQllUX0RSQU1fT0ZGU0VUOworCQlzc3QtPmFkZHIuc2hpbV9vZmZzZXQgPSBTU1RfQllUX1NISU1fT0ZGU0VUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgbWVtIHJlc291cmNlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc3N0X2J5dF9yZXNvdXJjZV9tYXAoc3N0LCBwZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gbWFwIHJlc291cmNlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChzc3QtPmRtYV9kZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBlbmFibGUgSW50ZXJydXB0IGZyb20gYm90aCBzaWRlcyAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0KHNzdCwgU1NUX0lNUlgsIDB4MywgMHgwKTsKKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9JTVJELCAweDMsIDB4MCk7CisKKwkvKiByZWdpc3RlciBEU1AgbWVtb3J5IGJsb2NrcyAtIGlkZWFsbHkgd2Ugc2hvdWxkIGdldCB0aGlzIGZyb20gQUNQSSAqLworCWZvciAoaSA9IDA7IGkgPCByZWdpb25fY291bnQ7IGkrKykgeworCQlvZmZzZXQgPSByZWdpb25baV0uc3RhcnQ7CisJCXNpemUgPSAocmVnaW9uW2ldLmVuZCAtIHJlZ2lvbltpXS5zdGFydCkgLyByZWdpb25baV0uYmxvY2tzOworCisJCS8qIHJlZ2lzdGVyIGluZGl2aWR1YWwgbWVtb3J5IGJsb2NrcyAqLworCQlmb3IgKGogPSAwOyBqIDwgcmVnaW9uW2ldLmJsb2NrczsgaisrKSB7CisJCQlzc3RfbWVtX2Jsb2NrX3JlZ2lzdGVyKHNzdCwgb2Zmc2V0LCBzaXplLAorCQkJCQkgICAgICAgcmVnaW9uW2ldLnR5cGUsIE5VTEwsIGosIHNzdCk7CisJCQlvZmZzZXQgKz0gc2l6ZTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X2ZyZWUoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwlzc3RfbWVtX2Jsb2NrX3VucmVnaXN0ZXJfYWxsKHNzdCk7CisJaW91bm1hcChzc3QtPmFkZHIubHBlKTsKKwlpb3VubWFwKHNzdC0+YWRkci5wY2lfY2ZnKTsKKwlpb3VubWFwKHNzdC0+YWRkci5md19leHQpOworfQorCitzdHJ1Y3Qgc3N0X29wcyBzc3RfYnl0X29wcyA9IHsKKwkucmVzZXQgPSBzc3RfYnl0X3Jlc2V0LAorCS5ib290ID0gc3N0X2J5dF9ib290LAorCS53cml0ZSA9IHNzdF9zaGltMzJfd3JpdGUsCisJLnJlYWQgPSBzc3Rfc2hpbTMyX3JlYWQsCisJLndyaXRlNjQgPSBzc3Rfc2hpbTMyX3dyaXRlNjQsCisJLnJlYWQ2NCA9IHNzdF9zaGltMzJfcmVhZDY0LAorCS5yYW1fcmVhZCA9IHNzdF9tZW1jcHlfZnJvbWlvXzMyLAorCS5yYW1fd3JpdGUgPSBzc3RfbWVtY3B5X3RvaW9fMzIsCisJLmlycV9oYW5kbGVyID0gc3N0X2J5dF9pcnEsCisJLmluaXQgPSBzc3RfYnl0X2luaXQsCisJLmZyZWUgPSBzc3RfYnl0X2ZyZWUsCisJLnBhcnNlX2Z3ID0gc3N0X2J5dF9wYXJzZV9md19pbWFnZSwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYmF5dHJhaWwvc3N0LWJheXRyYWlsLWlwYy5jIGIvc291bmQvc29jL2ludGVsL2JheXRyYWlsL3NzdC1iYXl0cmFpbC1pcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWZiMzNiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2JheXRyYWlsL3NzdC1iYXl0cmFpbC1pcGMuYwpAQCAtMCwwICsxLDc3NyBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBJUEMgU3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNpbmNsdWRlICJzc3QtYmF5dHJhaWwtaXBjLmgiCisjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1kc3AuaCIKKyNpbmNsdWRlICIuLi9jb21tb24vc3N0LWRzcC1wcml2LmgiCisjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1pcGMuaCIKKworLyogSVBDIG1lc3NhZ2UgdGltZW91dCAqLworI2RlZmluZSBJUENfVElNRU9VVF9NU0VDUwkzMDAKKyNkZWZpbmUgSVBDX0JPT1RfTVNFQ1MJCTIwMAorCisjZGVmaW5lIElQQ19FTVBUWV9MSVNUX1NJWkUJOAorCisvKiBJUEMgaGVhZGVyIGJpdHMgKi8KKyNkZWZpbmUgSVBDX0hFQURFUl9NU0dfSURfTUFTSwkweGZmCisjZGVmaW5lIElQQ19IRUFERVJfTVNHX0lEKHgpCSgoeCkgJiBJUENfSEVBREVSX01TR19JRF9NQVNLKQorI2RlZmluZSBJUENfSEVBREVSX1NUUl9JRF9TSElGVAk4CisjZGVmaW5lIElQQ19IRUFERVJfU1RSX0lEX01BU0sJMHgxZgorI2RlZmluZSBJUENfSEVBREVSX1NUUl9JRCh4KQkoKCh4KSAmIDB4MWYpIDw8IElQQ19IRUFERVJfU1RSX0lEX1NISUZUKQorI2RlZmluZSBJUENfSEVBREVSX0xBUkdFX1NISUZUCTEzCisjZGVmaW5lIElQQ19IRUFERVJfTEFSR0UoeCkJKCgoeCkgJiAweDEpIDw8IElQQ19IRUFERVJfTEFSR0VfU0hJRlQpCisjZGVmaW5lIElQQ19IRUFERVJfREFUQV9TSElGVAkxNgorI2RlZmluZSBJUENfSEVBREVSX0RBVEFfTUFTSwkweDNmZmYKKyNkZWZpbmUgSVBDX0hFQURFUl9EQVRBKHgpCSgoKHgpICYgMHgzZmZmKSA8PCBJUENfSEVBREVSX0RBVEFfU0hJRlQpCisKKy8qIG1hc2sgZm9yIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIG5vdGlmaWNhdGlvbiBhbmQgcmVwbHkgbWVzc2FnZSAqLworI2RlZmluZSBJUENfTk9USUZJQ0FUSU9OCSgweDEgPDwgNykKKworLyogSTJMIFN0cmVhbSBjb25maWcvY29udHJvbCBtc2dzICovCisjZGVmaW5lIElQQ19JQV9BTExPQ19TVFJFQU0JMHgyMAorI2RlZmluZSBJUENfSUFfRlJFRV9TVFJFQU0JMHgyMQorI2RlZmluZSBJUENfSUFfUEFVU0VfU1RSRUFNCTB4MjQKKyNkZWZpbmUgSVBDX0lBX1JFU1VNRV9TVFJFQU0JMHgyNQorI2RlZmluZSBJUENfSUFfRFJPUF9TVFJFQU0JMHgyNgorI2RlZmluZSBJUENfSUFfU1RBUlRfU1RSRUFNCTB4MzAKKworLyogbm90aWZpY2F0aW9uIG1lc3NhZ2VzICovCisjZGVmaW5lIElQQ19JQV9GV19JTklUX0NNUExUCTB4ODEKKyNkZWZpbmUgSVBDX1NTVF9QRVJJT0RfRUxBUFNFRAkweDk3CisKKy8qIElQQyBtZXNzYWdlcyBiZXR3ZWVuIGhvc3QgYW5kIEFEU1AgKi8KK3N0cnVjdCBzc3RfYnl0X2FkZHJlc3NfaW5mbyB7CisJdTMyIGFkZHI7CisJdTMyIHNpemU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSB7CisJdTggY29kZWNfdHlwZTsKKwl1OCBzdHJfdHlwZTsKKwl1OCBvcGVyYXRpb247CisJdTggcHJvdGVjdGVkX3N0cjsKKwl1OCB0aW1lX3Nsb3RzOworCXU4IHJlc2VydmVkOworCXUxNiByZXN1bHQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9wY21fcGFyYW1zIHsKKwl1OCBudW1fY2hhbjsKKwl1OCBwY21fd2Rfc3o7CisJdTggdXNlX29mZmxvYWRfcGF0aDsKKwl1OCByZXNlcnZlZDsKKwl1MzIgc2ZyZXE7CisJdTggY2hhbm5lbF9tYXBbOF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9mcmFtZXNfaW5mbyB7CisJdTE2IG51bV9lbnRyaWVzOworCXUxNiByc3J2ZDsKKwl1MzIgZnJhZ19zaXplOworCXN0cnVjdCBzc3RfYnl0X2FkZHJlc3NfaW5mbyByaW5nX2J1Zl9pbmZvWzhdOworfSBfX3BhY2tlZDsKKworc3RydWN0IHNzdF9ieXRfYWxsb2NfcGFyYW1zIHsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSBzdHJfdHlwZTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wY21fcGFyYW1zIHBjbV9wYXJhbXM7CisJc3RydWN0IHNzdF9ieXRfZnJhbWVzX2luZm8gZnJhbWVfaW5mbzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzc3RfYnl0X2FsbG9jX3Jlc3BvbnNlIHsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSBzdHJfdHlwZTsKKwl1OCByZXNlcnZlZFs4OF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9zdGFydF9zdHJlYW1fcGFyYW1zIHsKKwl1MzIgYnl0ZV9vZmZzZXQ7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF90c3RhbXAgeworCXU2NCByaW5nX2J1ZmZlcl9jb3VudGVyOworCXU2NCBoYXJkd2FyZV9jb3VudGVyOworCXU2NCBmcmFtZXNfZGVjb2RlZDsKKwl1NjQgYnl0ZXNfZGVjb2RlZDsKKwl1NjQgYnl0ZXNfY29waWVkOworCXUzMiBzYW1wbGluZ19mcmVxdWVuY3k7CisJdTMyIGNoYW5uZWxfcGVha1s4XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzc3RfYnl0X2Z3X3ZlcnNpb24geworCXU4IGJ1aWxkOworCXU4IG1pbm9yOworCXU4IG1ham9yOworCXU4IHR5cGU7Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgc3N0X2J5dF9md19idWlsZF9pbmZvIHsKKwl1OCBkYXRlWzE2XTsKKwl1OCB0aW1lWzE2XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzc3RfYnl0X2Z3X2luaXQgeworCXN0cnVjdCBzc3RfYnl0X2Z3X3ZlcnNpb24gZndfdmVyc2lvbjsKKwlzdHJ1Y3Qgc3N0X2J5dF9md19idWlsZF9pbmZvIGJ1aWxkX2luZm87CisJdTE2IHJlc3VsdDsKKwl1OCBtb2R1bGVfaWQ7CisJdTggZGVidWdfaW5mbzsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBzc3RfYnl0X3N0cmVhbTsKK3N0cnVjdCBzc3RfYnl0OworCisvKiBzdHJlYW0gaW5mb21hdGlvbiAqLworc3RydWN0IHNzdF9ieXRfc3RyZWFtIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisKKwkvKiBjb25maWd1cmF0aW9uICovCisJc3RydWN0IHNzdF9ieXRfYWxsb2NfcGFyYW1zIHJlcXVlc3Q7CisJc3RydWN0IHNzdF9ieXRfYWxsb2NfcmVzcG9uc2UgcmVwbHk7CisKKwkvKiBydW50aW1lIGluZm8gKi8KKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0OworCWludCBzdHJfaWQ7CisJYm9vbCBjb21taXRlZDsKKwlib29sIHJ1bm5pbmc7CisKKwkvKiBkcml2ZXIgY2FsbGJhY2sgKi8KKwl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKTsKKwl2b2lkICpwZGF0YTsKK307CisKKy8qIFNTVCBCYXl0cmFpbCBJUEMgZGF0YSAqLworc3RydWN0IHNzdF9ieXQgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOworCisJLyogc3RyZWFtICovCisJc3RydWN0IGxpc3RfaGVhZCBzdHJlYW1fbGlzdDsKKworCS8qIGJvb3QgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBib290X3dhaXQ7CisJYm9vbCBib290X2NvbXBsZXRlOworCXN0cnVjdCBzc3RfZncgKmZ3OworCisJLyogSVBDIG1lc3NhZ2luZyAqLworCXN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgaXBjOworfTsKKworc3RhdGljIGlubGluZSB1NjQgc3N0X2J5dF9oZWFkZXIoaW50IG1zZ19pZCwgaW50IGRhdGEsIGJvb2wgbGFyZ2UsIGludCBzdHJfaWQpCit7CisJdTY0IGhlYWRlcjsKKworCWhlYWRlciA9IElQQ19IRUFERVJfTVNHX0lEKG1zZ19pZCkgfAorCQkgSVBDX0hFQURFUl9TVFJfSUQoc3RyX2lkKSB8CisJCSBJUENfSEVBREVSX0xBUkdFKGxhcmdlKSB8CisJCSBJUENfSEVBREVSX0RBVEEoZGF0YSkgfAorCQkgU1NUX0JZVF9JUENYX0JVU1k7CisKKwlyZXR1cm4gaGVhZGVyOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBzc3RfYnl0X2hlYWRlcl9tc2dfaWQodTY0IGhlYWRlcikKK3sKKwlyZXR1cm4gaGVhZGVyICYgSVBDX0hFQURFUl9NU0dfSURfTUFTSzsKK30KKworc3RhdGljIGlubGluZSB1OCBzc3RfYnl0X2hlYWRlcl9zdHJfaWQodTY0IGhlYWRlcikKK3sKKwlyZXR1cm4gKGhlYWRlciA+PiBJUENfSEVBREVSX1NUUl9JRF9TSElGVCkgJiBJUENfSEVBREVSX1NUUl9JRF9NQVNLOworfQorCitzdGF0aWMgaW5saW5lIHUxNiBzc3RfYnl0X2hlYWRlcl9kYXRhKHU2NCBoZWFkZXIpCit7CisJcmV0dXJuIChoZWFkZXIgPj4gSVBDX0hFQURFUl9EQVRBX1NISUZUKSAmIElQQ19IRUFERVJfREFUQV9NQVNLOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzc3RfYnl0X2dldF9zdHJlYW0oc3RydWN0IHNzdF9ieXQgKmJ5dCwKKwkJCQkJCSBpbnQgc3RyZWFtX2lkKQoreworCXN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzdHJlYW0sICZieXQtPnN0cmVhbV9saXN0LCBub2RlKSB7CisJCWlmIChzdHJlYW0tPnN0cl9pZCA9PSBzdHJlYW1faWQpCisJCQlyZXR1cm4gc3RyZWFtOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzc3RfYnl0X3N0cmVhbV91cGRhdGUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IGlwY19tZXNzYWdlICptc2cpCit7CisJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW07CisJdTY0IGhlYWRlciA9IG1zZy0+aGVhZGVyOworCXU4IHN0cmVhbV9pZCA9IHNzdF9ieXRfaGVhZGVyX3N0cl9pZChoZWFkZXIpOworCXU4IHN0cmVhbV9tc2cgPSBzc3RfYnl0X2hlYWRlcl9tc2dfaWQoaGVhZGVyKTsKKworCXN0cmVhbSA9IHNzdF9ieXRfZ2V0X3N0cmVhbShieXQsIHN0cmVhbV9pZCk7CisJaWYgKHN0cmVhbSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHN0cmVhbV9tc2cpIHsKKwljYXNlIElQQ19JQV9EUk9QX1NUUkVBTToKKwljYXNlIElQQ19JQV9QQVVTRV9TVFJFQU06CisJY2FzZSBJUENfSUFfRlJFRV9TVFJFQU06CisJCXN0cmVhbS0+cnVubmluZyA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIElQQ19JQV9TVEFSVF9TVFJFQU06CisJY2FzZSBJUENfSUFfUkVTVU1FX1NUUkVBTToKKwkJc3RyZWFtLT5ydW5uaW5nID0gdHJ1ZTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcHJvY2Vzc19yZXBseShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyKQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCisJbXNnID0gc3N0X2lwY19yZXBseV9maW5kX21zZygmYnl0LT5pcGMsIGhlYWRlcik7CisJaWYgKG1zZyA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCWlmIChoZWFkZXIgJiBJUENfSEVBREVSX0xBUkdFKHRydWUpKSB7CisJCW1zZy0+cnhfc2l6ZSA9IHNzdF9ieXRfaGVhZGVyX2RhdGEoaGVhZGVyKTsKKwkJc3N0X2RzcF9pbmJveF9yZWFkKGJ5dC0+ZHNwLCBtc2ctPnJ4X2RhdGEsIG1zZy0+cnhfc2l6ZSk7CisJfQorCisJLyogdXBkYXRlIGFueSBzdHJlYW0gc3RhdGVzICovCisJc3N0X2J5dF9zdHJlYW1fdXBkYXRlKGJ5dCwgbXNnKTsKKworCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCS8qIHdha2UgdXAgKi8KKwlzc3RfaXBjX3R4X21zZ19yZXBseV9jb21wbGV0ZSgmYnl0LT5pcGMsIG1zZyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc3N0X2J5dF9md19yZWFkeShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyKQoreworCWRldl9kYmcoYnl0LT5kZXYsICJpcGM6IERTUCBpcyByZWFkeSAweCVsbFhcbiIsIGhlYWRlcik7CisKKwlieXQtPmJvb3RfY29tcGxldGUgPSB0cnVlOworCXdha2VfdXAoJmJ5dC0+Ym9vdF93YWl0KTsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKHN0cnVjdCBzc3RfYnl0ICpieXQsCisJCQkJCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBieXQtPmRzcDsKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbTsKKwl1NjQgaGVhZGVyOworCXU4IG1zZ19pZCwgc3RyZWFtX2lkOworCWludCBoYW5kbGVkID0gMTsKKworCWhlYWRlciA9IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7CisJbXNnX2lkID0gc3N0X2J5dF9oZWFkZXJfbXNnX2lkKGhlYWRlcik7CisKKwlzd2l0Y2ggKG1zZ19pZCkgeworCWNhc2UgSVBDX1NTVF9QRVJJT0RfRUxBUFNFRDoKKwkJc3RyZWFtX2lkID0gc3N0X2J5dF9oZWFkZXJfc3RyX2lkKGhlYWRlcik7CisJCXN0cmVhbSA9IHNzdF9ieXRfZ2V0X3N0cmVhbShieXQsIHN0cmVhbV9pZCk7CisJCWlmIChzdHJlYW0gJiYgc3RyZWFtLT5ydW5uaW5nICYmIHN0cmVhbS0+bm90aWZ5X3Bvc2l0aW9uKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCAqZmxhZ3MpOworCQkJc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24oc3RyZWFtLCBzdHJlYW0tPnBkYXRhKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCAqZmxhZ3MpOworCQl9CisJCWJyZWFrOworCWNhc2UgSVBDX0lBX0ZXX0lOSVRfQ01QTFQ6CisJCXNzdF9ieXRfZndfcmVhZHkoYnl0LCBoZWFkZXIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNzdF9ieXRfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gc3N0X2RzcF9nZXRfdGhyZWFkX2NvbnRleHQoc3N0KTsKKwlzdHJ1Y3Qgc3N0X2dlbmVyaWNfaXBjICppcGMgPSAmYnl0LT5pcGM7CisJdTY0IGhlYWRlcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCWhlYWRlciA9IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7CisJaWYgKGhlYWRlciAmIFNTVF9CWVRfSVBDRF9CVVNZKSB7CisJCWlmIChoZWFkZXIgJiBJUENfTk9USUZJQ0FUSU9OKSB7CisJCQkvKiBtZXNzYWdlIGZyb20gQURTUCAqLworCQkJc3N0X2J5dF9wcm9jZXNzX25vdGlmaWNhdGlvbihieXQsICZmbGFncyk7CisJCX0gZWxzZSB7CisJCQkvKiByZXBseSBmcm9tIEFEU1AgKi8KKwkJCXNzdF9ieXRfcHJvY2Vzc19yZXBseShieXQsIGhlYWRlcik7CisJCX0KKwkJLyoKKwkJICogY2xlYXIgSVBDRCBCVVNZIGJpdCBhbmQgc2V0IERPTkUgYml0LiBUZWxsIERTUCB3ZSBoYXZlCisJCSAqIHByb2Nlc3NlZCB0aGUgbWVzc2FnZSBhbmQgY2FuIGFjY2VwdCBuZXcuIENsZWFyIGRhdGEgcGFydAorCQkgKiBvZiB0aGUgaGVhZGVyCisJCSAqLworCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzc3QsIFNTVF9JUENELAorCQkJU1NUX0JZVF9JUENEX0RPTkUgfCBTU1RfQllUX0lQQ0RfQlVTWSB8CisJCQlJUENfSEVBREVSX0RBVEEoSVBDX0hFQURFUl9EQVRBX01BU0spLAorCQkJU1NUX0JZVF9JUENEX0RPTkUpOworCQkvKiB1bm1hc2sgbWVzc2FnZSByZXF1ZXN0IGludGVycnVwdHMgKi8KKwkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3N0LCBTU1RfSU1SWCwKKwkJCVNTVF9CWVRfSU1SWF9SRVFVRVNULCAwKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisKKwkvKiBjb250aW51ZSB0byBzZW5kIGFueSByZW1haW5pbmcgbWVzc2FnZXMuLi4gKi8KKwlxdWV1ZV9rdGhyZWFkX3dvcmsoJmlwYy0+a3dvcmtlciwgJmlwYy0+a3dvcmspOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBzdHJlYW0gQVBJICovCitzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnNzdF9ieXRfc3RyZWFtX25ldyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBpbnQgaWQsCisJdTMyICgqbm90aWZ5X3Bvc2l0aW9uKShzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwgdm9pZCAqZGF0YSksCisJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbTsKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gYnl0LT5kc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN0cmVhbSA9IGt6YWxsb2Moc2l6ZW9mKCpzdHJlYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmc3RyZWFtLT5ub2RlLCAmYnl0LT5zdHJlYW1fbGlzdCk7CisJc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24gPSBub3RpZnlfcG9zaXRpb247CisJc3RyZWFtLT5wZGF0YSA9IGRhdGE7CisJc3RyZWFtLT5ieXQgPSBieXQ7CisJc3RyZWFtLT5zdHJfaWQgPSBpZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc3RyZWFtOworfQorCitpbnQgc3N0X2J5dF9zdHJlYW1fc2V0X2JpdHMoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sCisJCQkgICAgaW50IGJpdHMpCit7CisJc3RyZWFtLT5yZXF1ZXN0LnBjbV9wYXJhbXMucGNtX3dkX3N6ID0gYml0czsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX3NldF9jaGFubmVscyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAorCQkJCXN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB1OCBjaGFubmVscykKK3sKKwlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5udW1fY2hhbiA9IGNoYW5uZWxzOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2J5dF9zdHJlYW1fc2V0X3JhdGUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sCisJCQkgICAgdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RyZWFtLT5yZXF1ZXN0LnBjbV9wYXJhbXMuc2ZyZXEgPSByYXRlOworCXJldHVybiAwOworfQorCisvKiBzdHJlYW0gc29uZmlndXJhdGlvbiAqLworaW50IHNzdF9ieXRfc3RyZWFtX3R5cGUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sCisJCQlpbnQgY29kZWNfdHlwZSwgaW50IHN0cmVhbV90eXBlLCBpbnQgb3BlcmF0aW9uKQoreworCXN0cmVhbS0+cmVxdWVzdC5zdHJfdHlwZS5jb2RlY190eXBlID0gY29kZWNfdHlwZTsKKwlzdHJlYW0tPnJlcXVlc3Quc3RyX3R5cGUuc3RyX3R5cGUgPSBzdHJlYW1fdHlwZTsKKwlzdHJlYW0tPnJlcXVlc3Quc3RyX3R5cGUub3BlcmF0aW9uID0gb3BlcmF0aW9uOworCXN0cmVhbS0+cmVxdWVzdC5zdHJfdHlwZS50aW1lX3Nsb3RzID0gMHhjOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9idWZmZXIoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sCisJCQkgIHVpbnQzMl90IGJ1ZmZlcl9hZGRyLCB1aW50MzJfdCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5udW1fZW50cmllcyA9IDE7CisJc3RyZWFtLT5yZXF1ZXN0LmZyYW1lX2luZm8ucmluZ19idWZfaW5mb1swXS5hZGRyID0gYnVmZmVyX2FkZHI7CisJc3RyZWFtLT5yZXF1ZXN0LmZyYW1lX2luZm8ucmluZ19idWZfaW5mb1swXS5zaXplID0gYnVmZmVyX3NpemU7CisJLyogY2FsY3VsYXRlIGJ5dGVzIHBlciA0IG1zIGZyYWdtZW50ICovCisJc3RyZWFtLT5yZXF1ZXN0LmZyYW1lX2luZm8uZnJhZ19zaXplID0KKwkJc3RyZWFtLT5yZXF1ZXN0LnBjbV9wYXJhbXMuc2ZyZXEgKgorCQlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5udW1fY2hhbiAqCisJCXN0cmVhbS0+cmVxdWVzdC5wY21fcGFyYW1zLnBjbV93ZF9zeiAvIDggKgorCQk0IC8gMTAwMDsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9ieXRfc3RyZWFtX2NvbW1pdChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc3N0X2J5dF9hbGxvY19wYXJhbXMgKnN0cl9yZXEgPSAmc3RyZWFtLT5yZXF1ZXN0OworCXN0cnVjdCBzc3RfYnl0X2FsbG9jX3Jlc3BvbnNlICpyZXBseSA9ICZzdHJlYW0tPnJlcGx5OworCXU2NCBoZWFkZXI7CisJaW50IHJldDsKKworCWhlYWRlciA9IHNzdF9ieXRfaGVhZGVyKElQQ19JQV9BTExPQ19TVFJFQU0sCisJCQkJc2l6ZW9mKCpzdHJfcmVxKSArIHNpemVvZih1MzIpLAorCQkJCXRydWUsIHN0cmVhbS0+c3RyX2lkKTsKKwlyZXQgPSBzc3RfaXBjX3R4X21lc3NhZ2Vfd2FpdCgmYnl0LT5pcGMsIGhlYWRlciwgc3RyX3JlcSwKKwkJCQkgICAgICBzaXplb2YoKnN0cl9yZXEpLAorCQkJCSAgICAgIHJlcGx5LCBzaXplb2YoKnJlcGx5KSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihieXQtPmRldiwgImlwYzogZXJyb3Igc3RyZWFtIGNvbW1pdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN0cmVhbS0+Y29tbWl0ZWQgPSB0cnVlOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9mcmVlKHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCXU2NCBoZWFkZXI7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJ5dC0+ZHNwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXN0cmVhbS0+Y29tbWl0ZWQpCisJCWdvdG8gb3V0OworCisJaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX0ZSRUVfU1RSRUFNLCAwLCBmYWxzZSwgc3RyZWFtLT5zdHJfaWQpOworCXJldCA9IHNzdF9pcGNfdHhfbWVzc2FnZV93YWl0KCZieXQtPmlwYywgaGVhZGVyLCBOVUxMLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBmcmVlIHN0cmVhbSAlZCBmYWlsZWRcbiIsCisJCQlzdHJlYW0tPnN0cl9pZCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXN0cmVhbS0+Y29tbWl0ZWQgPSBmYWxzZTsKK291dDoKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZzdHJlYW0tPm5vZGUpOworCWtmcmVlKHN0cmVhbSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKHN0cnVjdCBzc3RfYnl0ICpieXQsIGludCB0eXBlLAorCQkJCSAgICAgaW50IHN0cmVhbV9pZCwgaW50IHdhaXQpCit7CisJdTY0IGhlYWRlcjsKKworCWhlYWRlciA9IHNzdF9ieXRfaGVhZGVyKHR5cGUsIDAsIGZhbHNlLCBzdHJlYW1faWQpOworCWlmICh3YWl0KQorCQlyZXR1cm4gc3N0X2lwY190eF9tZXNzYWdlX3dhaXQoJmJ5dC0+aXBjLCBoZWFkZXIsIE5VTEwsCisJCQkJCQkwLCBOVUxMLCAwKTsKKwllbHNlCisJCXJldHVybiBzc3RfaXBjX3R4X21lc3NhZ2Vfbm93YWl0KCZieXQtPmlwYywgaGVhZGVyLAorCQkJCQkJTlVMTCwgMCk7Cit9CisKKy8qIHN0cmVhbSBBTFNBIHRyaWdnZXIgb3BlcmF0aW9ucyAqLworaW50IHNzdF9ieXRfc3RyZWFtX3N0YXJ0KHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLAorCQkJIHUzMiBzdGFydF9vZmZzZXQpCit7CisJc3RydWN0IHNzdF9ieXRfc3RhcnRfc3RyZWFtX3BhcmFtcyBzdGFydF9zdHJlYW07CisJdm9pZCAqdHhfbXNnOworCXNpemVfdCBzaXplOworCXU2NCBoZWFkZXI7CisJaW50IHJldDsKKworCXN0YXJ0X3N0cmVhbS5ieXRlX29mZnNldCA9IHN0YXJ0X29mZnNldDsKKwloZWFkZXIgPSBzc3RfYnl0X2hlYWRlcihJUENfSUFfU1RBUlRfU1RSRUFNLAorCQkJCXNpemVvZihzdGFydF9zdHJlYW0pICsgc2l6ZW9mKHUzMiksCisJCQkJdHJ1ZSwgc3RyZWFtLT5zdHJfaWQpOworCXR4X21zZyA9ICZzdGFydF9zdHJlYW07CisJc2l6ZSA9IHNpemVvZihzdGFydF9zdHJlYW0pOworCisJcmV0ID0gc3N0X2lwY190eF9tZXNzYWdlX25vd2FpdCgmYnl0LT5pcGMsIGhlYWRlciwgdHhfbXNnLCBzaXplKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihieXQtPmRldiwgImlwYzogZXJyb3IgZmFpbGVkIHRvIHN0YXJ0IHN0cmVhbSAlZFxuIiwKKwkJCXN0cmVhbS0+c3RyX2lkKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9zdG9wKHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQoreworCWludCByZXQ7CisKKwkvKiBkb24ndCBzdG9wIHN0cmVhbXMgdGhhdCBhcmUgbm90IGNvbW1pdGVkICovCisJaWYgKCFzdHJlYW0tPmNvbW1pdGVkKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHNzdF9ieXRfc3RyZWFtX29wZXJhdGlvbnMoYnl0LCBJUENfSUFfRFJPUF9TVFJFQU0sCisJCQkJCXN0cmVhbS0+c3RyX2lkLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihieXQtPmRldiwgImlwYzogZXJyb3IgZmFpbGVkIHRvIHN0b3Agc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5zdHJfaWQpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9wYXVzZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fb3BlcmF0aW9ucyhieXQsIElQQ19JQV9QQVVTRV9TVFJFQU0sCisJCQkJCXN0cmVhbS0+c3RyX2lkLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihieXQtPmRldiwgImlwYzogZXJyb3IgZmFpbGVkIHRvIHBhdXNlIHN0cmVhbSAlZFxuIiwKKwkJCXN0cmVhbS0+c3RyX2lkKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBzc3RfYnl0X3N0cmVhbV9yZXN1bWUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pCit7CisJaW50IHJldDsKKworCXJldCA9IHNzdF9ieXRfc3RyZWFtX29wZXJhdGlvbnMoYnl0LCBJUENfSUFfUkVTVU1FX1NUUkVBTSwKKwkJCQkJc3RyZWFtLT5zdHJfaWQsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBmYWlsZWQgdG8gcmVzdW1lIHN0cmVhbSAlZFxuIiwKKwkJCXN0cmVhbS0+c3RyX2lkKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBzc3RfYnl0X2dldF9kc3BfcG9zaXRpb24oc3RydWN0IHNzdF9ieXQgKmJ5dCwKKwkJCSAgICAgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sIGludCBidWZmZXJfc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gYnl0LT5kc3A7CisJc3RydWN0IHNzdF9ieXRfdHN0YW1wIGZ3X3RzdGFtcDsKKwl1OCBzdHJfaWQgPSBzdHJlYW0tPnN0cl9pZDsKKwl1MzIgdHN0YW1wX29mZnNldDsKKworCXRzdGFtcF9vZmZzZXQgPSBTU1RfQllUX1RJTUVTVEFNUF9PRkZTRVQgKyBzdHJfaWQgKiBzaXplb2YoZndfdHN0YW1wKTsKKwltZW1jcHlfZnJvbWlvKCZmd190c3RhbXAsCisJCSAgICAgIHNzdC0+YWRkci5scGUgKyB0c3RhbXBfb2Zmc2V0LCBzaXplb2YoZndfdHN0YW1wKSk7CisKKwlyZXR1cm4gZG9fZGl2KGZ3X3RzdGFtcC5yaW5nX2J1ZmZlcl9jb3VudGVyLCBidWZmZXJfc2l6ZSk7Cit9CisKK3N0cnVjdCBzc3RfZHNwICpzc3RfYnl0X2dldF9kc3Aoc3RydWN0IHNzdF9ieXQgKmJ5dCkKK3sKKwlyZXR1cm4gYnl0LT5kc3A7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgYnl0X2RldiA9IHsKKwkudGhyZWFkID0gc3N0X2J5dF9pcnFfdGhyZWFkLAorCS5vcHMgPSAmc3N0X2J5dF9vcHMsCit9OworCitpbnQgc3N0X2J5dF9kc3Bfc3VzcGVuZF9sYXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5kc3A7CisKKwlkZXZfZGJnKGJ5dC0+ZGV2LCAiZHNwIHJlc2V0XG4iKTsKKwlzc3RfZHNwX3Jlc2V0KGJ5dC0+ZHNwKTsKKwlzc3RfaXBjX2Ryb3BfYWxsKCZieXQtPmlwYyk7CisJZGV2X2RiZyhieXQtPmRldiwgImRzcCBpbiByZXNldFxuIik7CisKKwlkZXZfZGJnKGJ5dC0+ZGV2LCAiZnJlZSBhbGwgYmxvY2tzIGFuZCB1bmxvYWQgZndcbiIpOworCXNzdF9md191bmxvYWQoYnl0LT5mdyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9ieXRfZHNwX3N1c3BlbmRfbGF0ZSk7CisKK2ludCBzc3RfYnl0X2RzcF9ib290KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5kc3A7CisJaW50IHJldDsKKworCWRldl9kYmcoYnl0LT5kZXYsICJyZWxvYWQgZHNwIGZ3XG4iKTsKKworCXNzdF9kc3BfcmVzZXQoYnl0LT5kc3ApOworCisJcmV0ID0gc3N0X2Z3X3JlbG9hZChieXQtPmZ3KTsKKwlpZiAocmV0IDwgIDApIHsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIHJlbG9hZCBmaXJtd2FyZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogd2FpdCBmb3IgRFNQIGJvb3QgY29tcGxldGlvbiAqLworCWJ5dC0+Ym9vdF9jb21wbGV0ZSA9IGZhbHNlOworCXNzdF9kc3BfYm9vdChieXQtPmRzcCk7CisJZGV2X2RiZyhieXQtPmRldiwgImRzcCBib290aW5nLi4uXG4iKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2J5dF9kc3BfYm9vdCk7CisKK2ludCBzc3RfYnl0X2RzcF93YWl0X2Zvcl9yZWFkeShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfYnl0ICpieXQgPSBwZGF0YS0+ZHNwOworCWludCBlcnI7CisKKwlkZXZfZGJnKGJ5dC0+ZGV2LCAid2FpdCBmb3IgZHNwIHJlYm9vdFxuIik7CisKKwllcnIgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYnl0LT5ib290X3dhaXQsIGJ5dC0+Ym9vdF9jb21wbGV0ZSwKKwkJCQkgbXNlY3NfdG9famlmZmllcyhJUENfQk9PVF9NU0VDUykpOworCWlmIChlcnIgPT0gMCkgeworCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBEU1AgYm9vdCB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZGV2X2RiZyhieXQtPmRldiwgImRzcCByZWJvb3RlZFxuIik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfYnl0X2RzcF93YWl0X2Zvcl9yZWFkeSk7CisKK3N0YXRpYyB2b2lkIGJ5dF90eF9tc2coc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLCBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZykKK3sKKwlpZiAobXNnLT5oZWFkZXIgJiBJUENfSEVBREVSX0xBUkdFKHRydWUpKQorCQlzc3RfZHNwX291dGJveF93cml0ZShpcGMtPmRzcCwgbXNnLT50eF9kYXRhLCBtc2ctPnR4X3NpemUpOworCisJc3N0X2RzcF9zaGltX3dyaXRlNjRfdW5sb2NrZWQoaXBjLT5kc3AsIFNTVF9JUENYLCBtc2ctPmhlYWRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGJ5dF9zaGltX2RiZyhzdHJ1Y3Qgc3N0X2dlbmVyaWNfaXBjICppcGMsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGlwYy0+ZHNwOworCXU2NCBpc3IsIGlwY2QsIGltcngsIGlwY3g7CisKKwlpcGN4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JUENYKTsKKwlpc3IgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lTUlgpOworCWlwY2QgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QpOworCWltcnggPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpOworCisJZGV2X2VycihpcGMtPmRldiwKKwkJImlwYzogLS0lcy0tIGlwY3ggMHglbGx4IGlzciAweCVsbHggaXBjZCAweCVsbHggaW1yeCAweCVsbHhcbiIsCisJCXRleHQsIGlwY3gsIGlzciwgaXBjZCwgaW1yeCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ5dF90eF9kYXRhX2NvcHkoc3RydWN0IGlwY19tZXNzYWdlICptc2csIGNoYXIgKnR4X2RhdGEsCisJc2l6ZV90IHR4X3NpemUpCit7CisJLyogbXNnIGNvbnRlbnQgPSBsb3dlciAzMi1iaXQgb2YgdGhlIGhlYWRlciArIGRhdGEgKi8KKwkqKHUzMiAqKW1zZy0+dHhfZGF0YSA9ICh1MzIpKG1zZy0+aGVhZGVyICYgKHUzMiktMSk7CisJbWVtY3B5KG1zZy0+dHhfZGF0YSArIHNpemVvZih1MzIpLCB0eF9kYXRhLCB0eF9zaXplKTsKKwltc2ctPnR4X3NpemUgKz0gc2l6ZW9mKHUzMik7Cit9CisKK3N0YXRpYyB1NjQgYnl0X3JlcGx5X21zZ19tYXRjaCh1NjQgaGVhZGVyLCB1NjQgKm1hc2spCit7CisJLyogbWF0Y2ggcmVwbHkgdG8gbWVzc2FnZSBzZW50IGJhc2VkIG9uIG1zZyBhbmQgc3RyZWFtIElEcyAqLworCSptYXNrID0gSVBDX0hFQURFUl9NU0dfSURfTUFTSyB8CisJICAgICAgIElQQ19IRUFERVJfU1RSX0lEX01BU0sgPDwgSVBDX0hFQURFUl9TVFJfSURfU0hJRlQ7CisJaGVhZGVyICY9ICptYXNrOworCisJcmV0dXJuIGhlYWRlcjsKK30KKworaW50IHNzdF9ieXRfZHNwX2luaXQoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0OworCXN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYzsKKwlzdHJ1Y3Qgc3N0X2Z3ICpieXRfc3N0X2Z3OworCXN0cnVjdCBzc3RfYnl0X2Z3X2luaXQgaW5pdDsKKwlpbnQgZXJyOworCisJZGV2X2RiZyhkZXYsICJpbml0aWFsaXNpbmcgQnl0IERTUCBJUENcbiIpOworCisJYnl0ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpieXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnl0ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaXBjID0gJmJ5dC0+aXBjOworCWlwYy0+ZGV2ID0gZGV2OworCWlwYy0+b3BzLnR4X21zZyA9IGJ5dF90eF9tc2c7CisJaXBjLT5vcHMuc2hpbV9kYmcgPSBieXRfc2hpbV9kYmc7CisJaXBjLT5vcHMudHhfZGF0YV9jb3B5ID0gYnl0X3R4X2RhdGFfY29weTsKKwlpcGMtPm9wcy5yZXBseV9tc2dfbWF0Y2ggPSBieXRfcmVwbHlfbXNnX21hdGNoOworCisJZXJyID0gc3N0X2lwY19pbml0KGlwYyk7CisJaWYgKGVyciAhPSAwKQorCQlnb3RvIGlwY19pbml0X2VycjsKKworCUlOSVRfTElTVF9IRUFEKCZieXQtPnN0cmVhbV9saXN0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZieXQtPmJvb3Rfd2FpdCk7CisJYnl0X2Rldi50aHJlYWRfY29udGV4dCA9IGJ5dDsKKworCS8qIGluaXQgU1NUIHNoaW0gKi8KKwlieXQtPmRzcCA9IHNzdF9kc3BfbmV3KGRldiwgJmJ5dF9kZXYsIHBkYXRhKTsKKwlpZiAoYnl0LT5kc3AgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGRzcF9uZXdfZXJyOworCX0KKworCWlwYy0+ZHNwID0gYnl0LT5kc3A7CisKKwkvKiBrZWVwIHRoZSBEU1AgaW4gcmVzZXQgc3RhdGUgZm9yIGJhc2UgRlcgbG9hZGluZyAqLworCXNzdF9kc3BfcmVzZXQoYnl0LT5kc3ApOworCisJYnl0X3NzdF9mdyA9IHNzdF9md19uZXcoYnl0LT5kc3AsIHBkYXRhLT5mdywgYnl0KTsKKwlpZiAoYnl0X3NzdF9mdyAgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PREVWOworCQlkZXZfZXJyKGRldiwgImVycm9yOiBmYWlsZWQgdG8gbG9hZCBmaXJtd2FyZVxuIik7CisJCWdvdG8gZndfZXJyOworCX0KKworCS8qIHdhaXQgZm9yIERTUCBib290IGNvbXBsZXRpb24gKi8KKwlzc3RfZHNwX2Jvb3QoYnl0LT5kc3ApOworCWVyciA9IHdhaXRfZXZlbnRfdGltZW91dChieXQtPmJvb3Rfd2FpdCwgYnl0LT5ib290X2NvbXBsZXRlLAorCQkJCSBtc2Vjc190b19qaWZmaWVzKElQQ19CT09UX01TRUNTKSk7CisJaWYgKGVyciA9PSAwKSB7CisJCWVyciA9IC1FSU87CisJCWRldl9lcnIoYnl0LT5kZXYsICJpcGM6IGVycm9yIERTUCBib290IHRpbWVvdXRcbiIpOworCQlnb3RvIGJvb3RfZXJyOworCX0KKworCS8qIHNob3cgZmlybXdhcmUgaW5mb3JtYXRpb24gKi8KKwlzc3RfZHNwX2luYm94X3JlYWQoYnl0LT5kc3AsICZpbml0LCBzaXplb2YoaW5pdCkpOworCWRldl9pbmZvKGJ5dC0+ZGV2LCAiRlcgdmVyc2lvbjogJTAyeC4lMDJ4LiUwMnguJTAyeFxuIiwKKwkJIGluaXQuZndfdmVyc2lvbi5tYWpvciwgaW5pdC5md192ZXJzaW9uLm1pbm9yLAorCQkgaW5pdC5md192ZXJzaW9uLmJ1aWxkLCBpbml0LmZ3X3ZlcnNpb24udHlwZSk7CisJZGV2X2luZm8oYnl0LT5kZXYsICJCdWlsZCB0eXBlOiAleFxuIiwgaW5pdC5md192ZXJzaW9uLnR5cGUpOworCWRldl9pbmZvKGJ5dC0+ZGV2LCAiQnVpbGQgZGF0ZTogJXMgJXNcbiIsCisJCSBpbml0LmJ1aWxkX2luZm8uZGF0ZSwgaW5pdC5idWlsZF9pbmZvLnRpbWUpOworCisJcGRhdGEtPmRzcCA9IGJ5dDsKKwlieXQtPmZ3ID0gYnl0X3NzdF9mdzsKKworCXJldHVybiAwOworCitib290X2VycjoKKwlzc3RfZHNwX3Jlc2V0KGJ5dC0+ZHNwKTsKKwlzc3RfZndfZnJlZShieXRfc3N0X2Z3KTsKK2Z3X2VycjoKKwlzc3RfZHNwX2ZyZWUoYnl0LT5kc3ApOworZHNwX25ld19lcnI6CisJc3N0X2lwY19maW5pKGlwYyk7CitpcGNfaW5pdF9lcnI6CisJa2ZyZWUoYnl0KTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfYnl0X2RzcF9pbml0KTsKKwordm9pZCBzc3RfYnl0X2RzcF9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5kc3A7CisKKwlzc3RfZHNwX3Jlc2V0KGJ5dC0+ZHNwKTsKKwlzc3RfZndfZnJlZV9hbGwoYnl0LT5kc3ApOworCXNzdF9kc3BfZnJlZShieXQtPmRzcCk7CisJc3N0X2lwY19maW5pKCZieXQtPmlwYyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfYnl0X2RzcF9mcmVlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtYmF5dHJhaWwtaXBjLmggYi9zb3VuZC9zb2MvaW50ZWwvYmF5dHJhaWwvc3N0LWJheXRyYWlsLWlwYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5oCnJlbmFtZSB0byBzb3VuZC9zb2MvaW50ZWwvYmF5dHJhaWwvc3N0LWJheXRyYWlsLWlwYy5oCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYmF5dHJhaWwvc3N0LWJheXRyYWlsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL2JheXRyYWlsL3NzdC1iYXl0cmFpbC1wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTU0N2JlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2JheXRyYWlsL3NzdC1iYXl0cmFpbC1wY20uYwpAQCAtMCwwICsxLDUwNSBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBQQ00gU3VwcG9ydAorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgorI2luY2x1ZGUgIi4uL2NvbW1vbi9zc3QtZHNwLXByaXYuaCIKKyNpbmNsdWRlICIuLi9jb21tb24vc3N0LWRzcC5oIgorCisjZGVmaW5lIEJZVF9QQ01fQ09VTlQJCTIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIHNzdF9ieXRfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUkVTVU1FLAorCS5mb3JtYXRzCQk9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwKKwkJCQkgIFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAorCS5wZXJpb2RfYnl0ZXNfbWluCT0gMzg0LAorCS5wZXJpb2RfYnl0ZXNfbWF4CT0gNDgwMDAsCisJLnBlcmlvZHNfbWluCQk9IDIsCisJLnBlcmlvZHNfbWF4CQk9IDI1MCwKKwkuYnVmZmVyX2J5dGVzX21heAk9IDk2MDAwLAorfTsKKworLyogcHJpdmF0ZSBkYXRhIGZvciBlYWNoIFBDTSBEU1Agc3RyZWFtICovCitzdHJ1Y3Qgc3N0X2J5dF9wY21fZGF0YSB7CisJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW07CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CisJc3RydWN0IG11dGV4IG11dGV4OworCisJLyogbGF0ZXN0IERTUCBETUEgaHcgcG9pbnRlciAqLworCXUzMiBod19wdHI7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd29yazsKK307CisKKy8qIHByaXZhdGUgZGF0YSBmb3IgdGhlIGRyaXZlciAqLworc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhIHsKKwkvKiBydW50aW1lIERTUCAqLworCXN0cnVjdCBzc3RfYnl0ICpieXQ7CisKKwkvKiBEQUkgZGF0YSAqLworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhIHBjbVtCWVRfUENNX0NPVU5UXTsKKworCS8qIGZsYWcgaW5kaWNhdGluZyBpcyBzdHJlYW0gY29udGV4dCByZXN0b3JlIG5lZWRlZCBhZnRlciBzdXNwZW5kICovCisJYm9vbCByZXN0b3JlX3N0cmVhbTsKK307CisKKy8qIHRoaXMgbWF5IGdldCBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBieSBvc3MgZW11bGF0aW9uICovCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOworCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9ICZwZGF0YS0+cGNtW3N1YnN0cmVhbS0+c3RyZWFtXTsKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gcGRhdGEtPmJ5dDsKKwl1MzIgcmF0ZSwgYml0czsKKwl1OCBjaGFubmVsczsKKwlpbnQgcmV0LCBwbGF5YmFjayA9IChzdWJzdHJlYW0tPnN0cmVhbSA9PSBTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLKTsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IGh3X3BhcmFtcywgcGNtX2RhdGEgJXBcbiIsIHBjbV9kYXRhKTsKKworCXJldCA9IHNzdF9ieXRfc3RyZWFtX3R5cGUoYnl0LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJCSAgMSwgMSwgIXBsYXliYWNrKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZmFpbGVkIHRvIHNldCBzdHJlYW0gZm9ybWF0ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCXJldCA9IHNzdF9ieXRfc3RyZWFtX3NldF9yYXRlKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwgcmF0ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNvdWxkIG5vdCBzZXQgcmF0ZSAlZFxuIiwgcmF0ZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJYml0cyA9IHNuZF9wY21fZm9ybWF0X3dpZHRoKHBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fc2V0X2JpdHMoYnl0LCBwY21fZGF0YS0+c3RyZWFtLCBiaXRzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY291bGQgbm90IHNldCBmb3JtYXRzICVkXG4iLAorCQkJcGFyYW1zX3JhdGUocGFyYW1zKSk7CisJCXJldHVybiByZXQ7CisJfQorCisJY2hhbm5lbHMgPSAodTgpKHBhcmFtc19jaGFubmVscyhwYXJhbXMpICYgMHhGKTsKKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9zZXRfY2hhbm5lbHMoYnl0LCBwY21fZGF0YS0+c3RyZWFtLCBjaGFubmVscyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNvdWxkIG5vdCBzZXQgY2hhbm5lbHMgJWRcbiIsCisJCQlwYXJhbXNfcmF0ZShwYXJhbXMpKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOworCisJcmV0ID0gc3N0X2J5dF9zdHJlYW1fYnVmZmVyKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwKKwkJCQkgICAgc3Vic3RyZWFtLT5kbWFfYnVmZmVyLmFkZHIsCisJCQkJICAgIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgIlBDTTogZmFpbGVkIHRvIHNldCBETUEgYnVmZmVyICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNzdF9ieXRfc3RyZWFtX2NvbW1pdChieXQsIHBjbV9kYXRhLT5zdHJlYW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJQQ006IGZhaWxlZCBzdHJlYW0gY29tbWl0ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZyhydGQtPmRldiwgIlBDTTogaHdfZnJlZVxuIik7CisJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fcmVzdG9yZV9zdHJlYW1fY29udGV4dChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgKnBjbV9kYXRhID0gJnBkYXRhLT5wY21bc3Vic3RyZWFtLT5zdHJlYW1dOworCXN0cnVjdCBzc3RfYnl0ICpieXQgPSBwZGF0YS0+Ynl0OworCWludCByZXQ7CisKKwkvKiBjb21taXQgc3RyZWFtIHVzaW5nIGV4aXN0aW5nIHN0cmVhbSBwYXJhbXMgKi8KKwlyZXQgPSBzc3RfYnl0X3N0cmVhbV9jb21taXQoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiUENNOiBmYWlsZWQgc3RyZWFtIGNvbW1pdCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzc3RfYnl0X3N0cmVhbV9zdGFydChieXQsIHBjbV9kYXRhLT5zdHJlYW0sIHBjbV9kYXRhLT5od19wdHIpOworCisJZGV2X2RiZyhydGQtPmRldiwgInN0cmVhbSBjb250ZXh0IHJlc3RvcmVkIGF0IG9mZnNldCAlZFxuIiwKKwkJcGNtX2RhdGEtPmh3X3B0cik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3N0X2J5dF9wY21fd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgKnBjbV9kYXRhID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhLCB3b3JrKTsKKworCWlmIChzbmRfcGNtX3J1bm5pbmcocGNtX2RhdGEtPnN1YnN0cmVhbSkpCisJCXNzdF9ieXRfcGNtX3Jlc3RvcmVfc3RyZWFtX2NvbnRleHQocGNtX2RhdGEtPnN1YnN0cmVhbSk7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgKnBjbV9kYXRhID0gJnBkYXRhLT5wY21bc3Vic3RyZWFtLT5zdHJlYW1dOworCXN0cnVjdCBzc3RfYnl0ICpieXQgPSBwZGF0YS0+Ynl0OworCisJZGV2X2RiZyhydGQtPmRldiwgIlBDTTogdHJpZ2dlciAlZFxuIiwgY21kKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwkJcGNtX2RhdGEtPmh3X3B0ciA9IDA7CisJCXNzdF9ieXRfc3RyZWFtX3N0YXJ0KGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwgMCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCQlpZiAocGRhdGEtPnJlc3RvcmVfc3RyZWFtID09IHRydWUpCisJCQlzY2hlZHVsZV93b3JrKCZwY21fZGF0YS0+d29yayk7CisJCWVsc2UKKwkJCXNzdF9ieXRfc3RyZWFtX3Jlc3VtZShieXQsIHBjbV9kYXRhLT5zdHJlYW0pOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCXNzdF9ieXRfc3RyZWFtX3Jlc3VtZShieXQsIHBjbV9kYXRhLT5zdHJlYW0pOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJCXNzdF9ieXRfc3RyZWFtX3N0b3AoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCQlwZGF0YS0+cmVzdG9yZV9zdHJlYW0gPSBmYWxzZTsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXNzdF9ieXRfc3RyZWFtX3BhdXNlKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGJ5dF9ub3RpZnlfcG9pbnRlcihzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3N0X2J5dF9wY21fZGF0YSAqcGNtX2RhdGEgPSBkYXRhOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gcGNtX2RhdGEtPnN1YnN0cmVhbTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gcGRhdGEtPmJ5dDsKKwl1MzIgcG9zLCBod19wb3M7CisKKwlod19wb3MgPSBzc3RfYnl0X2dldF9kc3BfcG9zaXRpb24oYnl0LCBwY21fZGF0YS0+c3RyZWFtLAorCQkJCQkgIHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pKTsKKwlwY21fZGF0YS0+aHdfcHRyID0gaHdfcG9zOworCXBvcyA9IGZyYW1lc190b19ieXRlcyhydW50aW1lLAorCQkJICAgICAgKHJ1bnRpbWUtPmNvbnRyb2wtPmFwcGxfcHRyICUKKwkJCSAgICAgICBydW50aW1lLT5idWZmZXJfc2l6ZSkpOworCisJZGV2X2RiZyhydGQtPmRldiwgIlBDTTogQXBwL0RNQSBwb2ludGVyICV1LyV1IGJ5dGVzXG4iLCBwb3MsIGh3X3Bvcyk7CisKKwlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7CisJcmV0dXJuIHBvczsKK30KKworc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNzdF9ieXRfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgKnBjbV9kYXRhID0gJnBkYXRhLT5wY21bc3Vic3RyZWFtLT5zdHJlYW1dOworCisJZGV2X2RiZyhydGQtPmRldiwgIlBDTTogRE1BIHBvaW50ZXIgJXUgYnl0ZXNcbiIsIHBjbV9kYXRhLT5od19wdHIpOworCisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBwY21fZGF0YS0+aHdfcHRyKTsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wY21fZGF0YSAqcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVtzdWJzdHJlYW0tPnN0cmVhbV07CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7CisKKwlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBvcGVuXG4iKTsKKworCW11dGV4X2xvY2soJnBjbV9kYXRhLT5tdXRleCk7CisKKwlwY21fZGF0YS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCisJc25kX3NvY19zZXRfcnVudGltZV9od3BhcmFtcyhzdWJzdHJlYW0sICZzc3RfYnl0X3BjbV9oYXJkd2FyZSk7CisKKwlwY21fZGF0YS0+c3RyZWFtID0gc3N0X2J5dF9zdHJlYW1fbmV3KGJ5dCwgc3Vic3RyZWFtLT5zdHJlYW0gKyAxLAorCQkJCQkgICAgICBieXRfbm90aWZ5X3BvaW50ZXIsIHBjbV9kYXRhKTsKKwlpZiAocGNtX2RhdGEtPnN0cmVhbSA9PSBOVUxMKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbVxuIik7CisJCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3Qgc3N0X2J5dF9wY21fZGF0YSAqcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVtzdWJzdHJlYW0tPnN0cmVhbV07CisJc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7CisJaW50IHJldDsKKworCWRldl9kYmcocnRkLT5kZXYsICJQQ006IGNsb3NlXG4iKTsKKworCWNhbmNlbF93b3JrX3N5bmMoJnBjbV9kYXRhLT53b3JrKTsKKwltdXRleF9sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCXJldCA9IHNzdF9ieXRfc3RyZWFtX2ZyZWUoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiRnJlZSBzdHJlYW0gZmFpbFxuIik7CisJCWdvdG8gb3V0OworCX0KKwlwY21fZGF0YS0+c3RyZWFtID0gTlVMTDsKKworb3V0OgorCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCisJZGV2X2RiZyhydGQtPmRldiwgIlBDTTogbW1hcFxuIik7CisJcmV0dXJuIHNuZF9wY21fbGliX2RlZmF1bHRfbW1hcChzdWJzdHJlYW0sIHZtYSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9vcHMgc3N0X2J5dF9wY21fb3BzID0geworCS5vcGVuCQk9IHNzdF9ieXRfcGNtX29wZW4sCisJLmNsb3NlCQk9IHNzdF9ieXRfcGNtX2Nsb3NlLAorCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zCT0gc3N0X2J5dF9wY21faHdfcGFyYW1zLAorCS5od19mcmVlCT0gc3N0X2J5dF9wY21faHdfZnJlZSwKKwkudHJpZ2dlcgk9IHNzdF9ieXRfcGNtX3RyaWdnZXIsCisJLnBvaW50ZXIJPSBzc3RfYnl0X3BjbV9wb2ludGVyLAorCS5tbWFwCQk9IHNzdF9ieXRfcGNtX21tYXAsCit9OworCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfcGNtICpwY20gPSBydGQtPnBjbTsKKwlzaXplX3Qgc2l6ZTsKKwlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBydGQtPnBsYXRmb3JtOworCXN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShwbGF0Zm9ybS0+ZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtIHx8CisJICAgIHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSkgeworCQlzaXplID0gc3N0X2J5dF9wY21faGFyZHdhcmUuYnVmZmVyX2J5dGVzX21heDsKKwkJcmV0ID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sCisJCQkJCQkJICAgIFNORFJWX0RNQV9UWVBFX0RFViwKKwkJCQkJCQkgICAgcGRhdGEtPmRtYV9kZXYsCisJCQkJCQkJICAgIHNpemUsIHNpemUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGJ5dF9kYWlzW10gPSB7CisJeworCQkubmFtZSAgPSAiQmF5dHJhaWwgUENNIiwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlN5c3RlbSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0XzNMRSB8CisJCQkJICAgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFuYWxvZyBDYXB0dXJlIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fcHJvYmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQoreworCXN0cnVjdCBzc3RfcGRhdGEgKnBsYXRfZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEocGxhdGZvcm0tPmRldik7CisJc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhICpwcml2X2RhdGE7CisJaW50IGk7CisKKwlpZiAoIXBsYXRfZGF0YSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlwcml2X2RhdGEgPSBkZXZtX2t6YWxsb2MocGxhdGZvcm0tPmRldiwgc2l6ZW9mKCpwcml2X2RhdGEpLAorCQkJCSBHRlBfS0VSTkVMKTsKKwlwcml2X2RhdGEtPmJ5dCA9IHBsYXRfZGF0YS0+ZHNwOworCXNuZF9zb2NfcGxhdGZvcm1fc2V0X2RydmRhdGEocGxhdGZvcm0sIHByaXZfZGF0YSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQllUX1BDTV9DT1VOVDsgaSsrKSB7CisJCW11dGV4X2luaXQoJnByaXZfZGF0YS0+cGNtW2ldLm11dGV4KTsKKwkJSU5JVF9XT1JLKCZwcml2X2RhdGEtPnBjbVtpXS53b3JrLCBzc3RfYnl0X3BjbV93b3JrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfYnl0X3BjbV9yZW1vdmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfcGxhdGZvcm1fZHJpdmVyIGJ5dF9zb2NfcGxhdGZvcm0gPSB7CisJLnByb2JlCQk9IHNzdF9ieXRfcGNtX3Byb2JlLAorCS5yZW1vdmUJCT0gc3N0X2J5dF9wY21fcmVtb3ZlLAorCS5vcHMJCT0gJnNzdF9ieXRfcGNtX29wcywKKwkucGNtX25ldwk9IHNzdF9ieXRfcGNtX25ldywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIGJ5dF9kYWlfY29tcG9uZW50ID0geworCS5uYW1lCQk9ICJieXQtZGFpIiwKK307CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fZGV2X3N1c3BlbmRfbGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOworCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcHJpdl9kYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJldDsKKworCWRldl9kYmcoZGV2LCAic3VzcGVuZGluZyBsYXRlXG4iKTsKKworCXJldCA9IHNzdF9ieXRfZHNwX3N1c3BlbmRfbGF0ZShkZXYsIHNzdF9wZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc3VzcGVuZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcml2X2RhdGEtPnJlc3RvcmVfc3RyZWFtID0gdHJ1ZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fZGV2X3Jlc3VtZV9lYXJseShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShkZXYpOworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgInJlc3VtZSBlYXJseVxuIik7CisKKwkvKiBsb2FkIGZ3IGFuZCBib290IERTUCAqLworCXJldCA9IHNzdF9ieXRfZHNwX2Jvb3QoZGV2LCBzc3RfcGRhdGEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiB3YWl0IGZvciBGVyB0byBmaW5pc2ggYm9vdGluZyAqLworCXJldHVybiBzc3RfYnl0X2RzcF93YWl0X2Zvcl9yZWFkeShkZXYsIHNzdF9wZGF0YSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzc3RfYnl0X3BtX29wcyA9IHsKKwkuc3VzcGVuZF9sYXRlID0gc3N0X2J5dF9wY21fZGV2X3N1c3BlbmRfbGF0ZSwKKwkucmVzdW1lX2Vhcmx5ID0gc3N0X2J5dF9wY21fZGV2X3Jlc3VtZV9lYXJseSwKK307CisKKyNkZWZpbmUgU1NUX0JZVF9QTV9PUFMJKCZzc3RfYnl0X3BtX29wcykKKyNlbHNlCisjZGVmaW5lIFNTVF9CWVRfUE1fT1BTCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgaW50IHNzdF9ieXRfcGNtX2Rldl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzc3RfcGRhdGEgKnNzdF9wZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisJaW50IHJldDsKKworCXJldCA9IHNzdF9ieXRfZHNwX2luaXQoJnBkZXYtPmRldiwgc3N0X3BkYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYsICZieXRfc29jX3BsYXRmb3JtKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfcGxhdDsKKworCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsICZieXRfZGFpX2NvbXBvbmVudCwKKwkJCQkJIGJ5dF9kYWlzLCBBUlJBWV9TSVpFKGJ5dF9kYWlzKSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2NvbXA7CisKKwlyZXR1cm4gMDsKKworZXJyX2NvbXA6CisJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOworZXJyX3BsYXQ6CisJc3N0X2J5dF9kc3BfZnJlZSgmcGRldi0+ZGV2LCBzc3RfcGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2J5dF9wY21fZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzc3RfcGRhdGEgKnNzdF9wZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKKwlzc3RfYnl0X2RzcF9mcmVlKCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3N0X2J5dF9wY21fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImJheXRyYWlsLXBjbS1hdWRpbyIsCisJCS5wbSA9IFNTVF9CWVRfUE1fT1BTLAorCX0sCisKKwkucHJvYmUgPSBzc3RfYnl0X3BjbV9kZXZfcHJvYmUsCisJLnJlbW92ZSA9IHNzdF9ieXRfcGNtX2Rldl9yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzc3RfYnl0X3BjbV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJKYXJra28gTmlrdWxhIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkJheXRyYWlsIFBDTSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpiYXl0cmFpbC1wY20tYXVkaW8iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvTWFrZWZpbGUgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjM3ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL01ha2VmaWxlCkBAIC0wLDAgKzEsMTUgQEAKK3NuZC1zb2Mtc3N0LWhhc3dlbGwtb2JqcyA6PSBoYXN3ZWxsLm8KK3NuZC1zb2Mtc3N0LWJ5dC1ydDU2NDAtbWFjaC1vYmpzIDo9IGJ5dC1ydDU2NDAubworc25kLXNvYy1zc3QtYnl0LW1heDk4MDkwLW1hY2gtb2JqcyA6PSBieXQtbWF4OTgwOTAubworc25kLXNvYy1zc3QtYnJvYWR3ZWxsLW9ianMgOj0gYnJvYWR3ZWxsLm8KK3NuZC1zb2Mtc3N0LWJ5dGNyLXJ0NTY0MC1vYmpzIDo9IGJ5dGNyX3J0NTY0MC5vCitzbmQtc29jLXNzdC1jaHQtYnN3LXJ0NTY3Mi1vYmpzIDo9IGNodF9ic3dfcnQ1NjcyLm8KK3NuZC1zb2Mtc3N0LWNodC1ic3ctcnQ1NjQ1LW9ianMgOj0gY2h0X2Jzd19ydDU2NDUubworCitvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9IQVNXRUxMX01BQ0gpICs9IHNuZC1zb2Mtc3N0LWhhc3dlbGwubworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQllUX1JUNTY0MF9NQUNIKSArPSBzbmQtc29jLXNzdC1ieXQtcnQ1NjQwLW1hY2gubworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQllUX01BWDk4MDkwX01BQ0gpICs9IHNuZC1zb2Mtc3N0LWJ5dC1tYXg5ODA5MC1tYWNoLm8KK29iai0kKENPTkZJR19TTkRfU09DX0lOVEVMX0JST0FEV0VMTF9NQUNIKSArPSBzbmQtc29jLXNzdC1icm9hZHdlbGwubworb2JqLSQoQ09ORklHX1NORF9TT0NfSU5URUxfQllUQ1JfUlQ1NjQwX01BQ0gpICs9IHNuZC1zb2Mtc3N0LWJ5dGNyLXJ0NTY0MC5vCitvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9DSFRfQlNXX1JUNTY3Ml9NQUNIKSArPSBzbmQtc29jLXNzdC1jaHQtYnN3LXJ0NTY3Mi5vCitvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9DSFRfQlNXX1JUNTY0NV9NQUNIKSArPSBzbmQtc29jLXNzdC1jaHQtYnN3LXJ0NTY0NS5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2Jyb2Fkd2VsbC5jIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9icm9hZHdlbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmFmYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9icm9hZHdlbGwuYwpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqIEludGVsIEJyb2Fkd2VsbCBXaWxkY2F0cG9pbnQgU1NUIEF1ZGlvCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKworI2luY2x1ZGUgIi4uL2NvbW1vbi9zc3QtZHNwLmgiCisjaW5jbHVkZSAiLi4vaGFzd2VsbC9zc3QtaGFzd2VsbC1pcGMuaCIKKworI2luY2x1ZGUgIi4uLy4uL2NvZGVjcy9ydDI4Ni5oIgorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFjayBicm9hZHdlbGxfaGVhZHNldDsKKy8qIEhlYWRzZXQgamFjayBkZXRlY3Rpb24gREFQTSBwaW5zICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfamFja19waW4gYnJvYWR3ZWxsX2hlYWRzZXRfcGluc1tdID0geworCXsKKwkJLnBpbiA9ICJNaWMgSmFjayIsCisJCS5tYXNrID0gU05EX0pBQ0tfTUlDUk9QSE9ORSwKKwl9LAorCXsKKwkJLnBpbiA9ICJIZWFkcGhvbmUgSmFjayIsCisJCS5tYXNrID0gU05EX0pBQ0tfSEVBRFBIT05FLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYnJvYWR3ZWxsX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fUElOX1NXSVRDSCgiU3BlYWtlciIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRwaG9uZSBKYWNrIiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYnJvYWR3ZWxsX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSBKYWNrIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX1NQSygiU3BlYWtlciIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIk1pYyBKYWNrIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiRE1JQzEiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJETUlDMiIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9MSU5FKCJMaW5lIEphY2siLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJyb2Fkd2VsbF9ydDI4Nl9tYXBbXSA9IHsKKworCS8qIHNwZWFrZXIgKi8KKwl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPUiJ9LAorCXsiU3BlYWtlciIsIE5VTEwsICJTUE9MIn0sCisKKwkvKiBIUCBqYWNrIGNvbm5lY3RvcnMgLSB1bmtub3duIGlmIHdlIGhhdmUgamFjayBkZXRlY2sgKi8KKwl7IkhlYWRwaG9uZSBKYWNrIiwgTlVMTCwgIkhQTyBQaW4ifSwKKworCS8qIG90aGVyIGphY2tzICovCisJeyJNSUMxIiwgTlVMTCwgIk1pYyBKYWNrIn0sCisJeyJMSU5FMSIsIE5VTEwsICJMaW5lIEphY2sifSwKKworCS8qIGRpZ2l0YWwgbWljcyAqLworCXsiRE1JQzEgUGluIiwgTlVMTCwgIkRNSUMxIn0sCisJeyJETUlDMiBQaW4iLCBOVUxMLCAiRE1JQzIifSwKKworCS8qIENPREVDIEJFIGNvbm5lY3Rpb25zICovCisJeyJTU1AwIENPREVDIElOIiwgTlVMTCwgIkFJRjEgQ2FwdHVyZSJ9LAorCXsiQUlGMSBQbGF5YmFjayIsIE5VTEwsICJTU1AwIENPREVDIE9VVCJ9LAorfTsKKworc3RhdGljIGludCBicm9hZHdlbGxfcnQyODZfY29kZWNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CisJaW50IHJldCA9IDA7CisJcmV0ID0gc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRzZXQiLAorCQlTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzAsICZicm9hZHdlbGxfaGVhZHNldCwKKwkJYnJvYWR3ZWxsX2hlYWRzZXRfcGlucywgQVJSQVlfU0laRShicm9hZHdlbGxfaGVhZHNldF9waW5zKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJ0Mjg2X21pY19kZXRlY3QoY29kZWMsICZicm9hZHdlbGxfaGVhZHNldCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBicm9hZHdlbGxfc3NwMF9maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwkvKiBUaGUgQURTUCB3aWxsIGNvdmVydCB0aGUgRkUgcmF0ZSB0byA0OGssIHN0ZXJlbyAqLworCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IDQ4MDAwOworCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gMjsKKworCS8qIHNldCBTU1AwIHRvIDE2IGJpdCAqLworCXBhcmFtc19zZXRfZm9ybWF0KHBhcmFtcywgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJyb2Fkd2VsbF9ydDI4Nl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IHJldDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDI4Nl9TQ0xLX1NfUExMLCAyNDAwMDAwMCwKKwkJU05EX1NPQ19DTE9DS19JTik7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHN5c2NsayBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGJyb2Fkd2VsbF9ydDI4Nl9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IGJyb2Fkd2VsbF9ydDI4Nl9od19wYXJhbXMsCit9OworCitzdGF0aWMgaW50IGJyb2Fkd2VsbF9ydGRfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShydGQtPnBsYXRmb3JtLT5kZXYpOworCXN0cnVjdCBzc3RfaHN3ICpicm9hZHdlbGwgPSBwZGF0YS0+ZHNwOworCWludCByZXQ7CisKKwkvKiBTZXQgQURTUCBTU1AgcG9ydCBzZXR0aW5ncyAqLworCXJldCA9IHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcoYnJvYWR3ZWxsLCBTU1RfSFNXX0RFVklDRV9TU1BfMCwKKwkJU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzI0X01IWiwKKwkJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfTUFTVEVSLCA5KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBzZXQgZGV2aWNlIGNvbmZpZ1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGJyb2Fkd2VsbCBkaWdpdGFsIGF1ZGlvIGludGVyZmFjZSBnbHVlIC0gY29ubmVjdHMgY29kZWMgPC0tPiBDUFUgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBicm9hZHdlbGxfcnQyODZfZGFpc1tdID0geworCS8qIEZyb250IEVuZCBEQUkgbGlua3MgKi8KKwl7CisJCS5uYW1lID0gIlN5c3RlbSBQQ00iLAorCQkuc3RyZWFtX25hbWUgPSAiU3lzdGVtIFBsYXliYWNrL0NhcHR1cmUiLAorCQkuY3B1X2RhaV9uYW1lID0gIlN5c3RlbSBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMSwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5pbml0ID0gYnJvYWR3ZWxsX3J0ZF9pbml0LAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULCBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiT2ZmbG9hZDAiLAorCQkuc3RyZWFtX25hbWUgPSAiT2ZmbG9hZDAgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIk9mZmxvYWQwIFBpbiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiT2ZmbG9hZDEiLAorCQkuc3RyZWFtX25hbWUgPSAiT2ZmbG9hZDEgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIk9mZmxvYWQxIFBpbiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTG9vcGJhY2sgUENNIiwKKwkJLnN0cmVhbV9uYW1lID0gIkxvb3BiYWNrIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJMb29wYmFjayBQaW4iLAorCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCisJCS5keW5hbWljID0gMCwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwl9LAorCS8qIEJhY2sgRW5kIERBSSBsaW5rcyAqLworCXsKKwkJLyogU1NQMCAtIENvZGVjICovCisJCS5uYW1lID0gIkNvZGVjIiwKKwkJLmJlX2lkID0gMCwKKwkJLmNwdV9kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkubm9fcGNtID0gMSwKKwkJLmNvZGVjX25hbWUgPSAiaTJjLUlOVDM0M0E6MDAiLAorCQkuY29kZWNfZGFpX25hbWUgPSAicnQyODYtYWlmMSIsCisJCS5pbml0ID0gYnJvYWR3ZWxsX3J0Mjg2X2NvZGVjX2luaXQsCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAorCQkJU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBicm9hZHdlbGxfc3NwMF9maXh1cCwKKwkJLm9wcyA9ICZicm9hZHdlbGxfcnQyODZfb3BzLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCX0sCit9OworCitzdGF0aWMgaW50IGJyb2Fkd2VsbF9zdXNwZW5kKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpeworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjYXJkLT5jb2RlY19kZXZfbGlzdCwgY2FyZF9saXN0KSB7CisJCWlmICghc3RyY21wKGNvZGVjLT5jb21wb25lbnQubmFtZSwgImkyYy1JTlQzNDNBOjAwIikpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgImRpc2FibGluZyBqYWNrIGRldGVjdCBiZWZvcmUgZ29pbmcgdG8gc3VzcGVuZC5cbiIpOworCQkJcnQyODZfbWljX2RldGVjdChjb2RlYywgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicm9hZHdlbGxfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpeworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjYXJkLT5jb2RlY19kZXZfbGlzdCwgY2FyZF9saXN0KSB7CisJCWlmICghc3RyY21wKGNvZGVjLT5jb21wb25lbnQubmFtZSwgImkyYy1JTlQzNDNBOjAwIikpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgImVuYWJsaW5nIGphY2sgZGV0ZWN0IGZvciByZXN1bWUuXG4iKTsKKwkJCXJ0Mjg2X21pY19kZXRlY3QoY29kZWMsICZicm9hZHdlbGxfaGVhZHNldCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogYnJvYWR3ZWxsIGF1ZGlvIG1hY2hpbmUgZHJpdmVyIGZvciBXUFQgKyBSVDI4NlMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGJyb2Fkd2VsbF9ydDI4NiA9IHsKKwkubmFtZSA9ICJicm9hZHdlbGwtcnQyODYiLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5kYWlfbGluayA9IGJyb2Fkd2VsbF9ydDI4Nl9kYWlzLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGJyb2Fkd2VsbF9ydDI4Nl9kYWlzKSwKKwkuY29udHJvbHMgPSBicm9hZHdlbGxfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYnJvYWR3ZWxsX2NvbnRyb2xzKSwKKwkuZGFwbV93aWRnZXRzID0gYnJvYWR3ZWxsX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGJyb2Fkd2VsbF93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBicm9hZHdlbGxfcnQyODZfbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJyb2Fkd2VsbF9ydDI4Nl9tYXApLAorCS5mdWxseV9yb3V0ZWQgPSB0cnVlLAorCS5zdXNwZW5kX3ByZSA9IGJyb2Fkd2VsbF9zdXNwZW5kLAorCS5yZXN1bWVfcG9zdCA9IGJyb2Fkd2VsbF9yZXN1bWUsCit9OworCitzdGF0aWMgaW50IGJyb2Fkd2VsbF9hdWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWJyb2Fkd2VsbF9ydDI4Ni5kZXYgPSAmcGRldi0+ZGV2OworCisJcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmYnJvYWR3ZWxsX3J0Mjg2KTsKK30KKworc3RhdGljIGludCBicm9hZHdlbGxfYXVkaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoJmJyb2Fkd2VsbF9ydDI4Nik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJyb2Fkd2VsbF9hdWRpbyA9IHsKKwkucHJvYmUgPSBicm9hZHdlbGxfYXVkaW9fcHJvYmUsCisJLnJlbW92ZSA9IGJyb2Fkd2VsbF9hdWRpb19yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYnJvYWR3ZWxsLWF1ZGlvIiwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihicm9hZHdlbGxfYXVkaW8pCisKKy8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLworTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgWGluZ2NoYW8gV2FuZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBTU1QgQXVkaW8gZm9yIFdQVC9Ccm9hZHdlbGwiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YnJvYWR3ZWxsLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J5dC1tYXg5ODA5MC5jIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieXQtbWF4OTgwOTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWI4Y2M5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieXQtbWF4OTgwOTAuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIEludGVsIEJheXRyYWlsIFNTVCBNQVg5ODA5MCBtYWNoaW5lIGRyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKyNpbmNsdWRlICIuLi8uLi9jb2RlY3MvbWF4OTgwOTAuaCIKKworc3RydWN0IGJ5dF9tYXg5ODA5MF9wcml2YXRlIHsKKwlzdHJ1Y3Qgc25kX3NvY19qYWNrIGphY2s7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYnl0X21heDk4MDkwX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiSW50IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIkV4dCBTcGsiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9tYXg5ODA5MF9hdWRpb19tYXBbXSA9IHsKKwl7IklOMzQiLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKKwl7IkhlYWRzZXQgTWljIiwgTlVMTCwgIk1JQ0JJQVMifSwKKwl7IkRNSUNMIiwgTlVMTCwgIkludCBNaWMifSwKKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUEwifSwKKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUFIifSwKKwl7IkV4dCBTcGsiLCBOVUxMLCAiU1BLTCJ9LAorCXsiRXh0IFNwayIsIE5VTEwsICJTUEtSIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYnl0X21heDk4MDkwX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHBob25lIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHNldCBNaWMiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJJbnQgTWljIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiRXh0IFNwayIpLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfcGluIGhzX2phY2tfcGluc1tdID0geworCXsKKwkJLnBpbgk9ICJIZWFkcGhvbmUiLAorCQkubWFzawk9IFNORF9KQUNLX0hFQURQSE9ORSwKKwl9LAorCXsKKwkJLnBpbgk9ICJIZWFkc2V0IE1pYyIsCisJCS5tYXNrCT0gU05EX0pBQ0tfTUlDUk9QSE9ORSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfZ3BpbyBoc19qYWNrX2dwaW9zW10gPSB7CisJeworCQkubmFtZQkJPSAiaHAtZ3BpbyIsCisJCS5pZHgJCT0gMCwKKwkJLnJlcG9ydAkJPSBTTkRfSkFDS19IRUFEUEhPTkUgfCBTTkRfSkFDS19MSU5FT1VULAorCQkuZGVib3VuY2VfdGltZQk9IDIwMCwKKwl9LAorCXsKKwkJLm5hbWUJCT0gIm1pYy1ncGlvIiwKKwkJLmlkeAkJPSAxLAorCQkuaW52ZXJ0CQk9IDEsCisJCS5yZXBvcnQJCT0gU05EX0pBQ0tfTUlDUk9QSE9ORSwKKwkJLmRlYm91bmNlX3RpbWUJPSAyMDAsCisJfSwKK307CisKK3N0YXRpYyBpbnQgYnl0X21heDk4MDkwX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnVudGltZS0+Y2FyZDsKKwlzdHJ1Y3QgYnl0X21heDk4MDkwX3ByaXZhdGUgKmRydiA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShjYXJkKTsKKwlzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrID0gJmRydi0+amFjazsKKworCWNhcmQtPmRhcG0uaWRsZV9iaWFzX29mZiA9IHRydWU7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKHJ1bnRpbWUtPmNvZGVjX2RhaSwKKwkJCQkgICAgIE05ODA5MF9SRUdfU1lTVEVNX0NMT0NLLAorCQkJCSAgICAgMjUwMDAwMDAsIFNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ2FuJ3Qgc2V0IGNvZGVjIGNsb2NrICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIEVuYWJsZSBqYWNrIGRldGVjdGlvbiAqLworCXJldCA9IHNuZF9zb2NfY2FyZF9qYWNrX25ldyhydW50aW1lLT5jYXJkLCAiSGVhZHNldCIsCisJCQkJICAgIFNORF9KQUNLX0xJTkVPVVQgfCBTTkRfSkFDS19IRUFEU0VULCBqYWNrLAorCQkJCSAgICBoc19qYWNrX3BpbnMsIEFSUkFZX1NJWkUoaHNfamFja19waW5zKSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBzbmRfc29jX2phY2tfYWRkX2dwaW9kcyhjYXJkLT5kZXYtPnBhcmVudCwgamFjaywKKwkJCQkgICAgICAgQVJSQVlfU0laRShoc19qYWNrX2dwaW9zKSwKKwkJCQkgICAgICAgaHNfamFja19ncGlvcyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBieXRfbWF4OTgwOTBfZGFpc1tdID0geworCXsKKwkJLm5hbWUgPSAiQmF5dHJhaWwgQXVkaW8iLAorCQkuc3RyZWFtX25hbWUgPSAiQXVkaW8iLAorCQkuY3B1X2RhaV9uYW1lID0gImJheXRyYWlsLXBjbS1hdWRpbyIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJIaUZpIiwKKwkJLmNvZGVjX25hbWUgPSAiaTJjLTE5M0M5ODkwOjAwIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAiYmF5dHJhaWwtcGNtLWF1ZGlvIiwKKwkJLmluaXQgPSBieXRfbWF4OTgwOTBfaW5pdCwKKwkJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQkgICBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBieXRfbWF4OTgwOTBfY2FyZCA9IHsKKwkubmFtZSA9ICJieXQtbWF4OTgwOTAiLAorCS5kYWlfbGluayA9IGJ5dF9tYXg5ODA5MF9kYWlzLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGJ5dF9tYXg5ODA5MF9kYWlzKSwKKwkuZGFwbV93aWRnZXRzID0gYnl0X21heDk4MDkwX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGJ5dF9tYXg5ODA5MF93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBieXRfbWF4OTgwOTBfYXVkaW9fbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJ5dF9tYXg5ODA5MF9hdWRpb19tYXApLAorCS5jb250cm9scyA9IGJ5dF9tYXg5ODA5MF9jb250cm9scywKKwkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShieXRfbWF4OTgwOTBfY29udHJvbHMpLAorCS5mdWxseV9yb3V0ZWQgPSB0cnVlLAorfTsKKworc3RhdGljIGludCBieXRfbWF4OTgwOTBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0X3ZhbCA9IDA7CisJc3RydWN0IGJ5dF9tYXg5ODA5MF9wcml2YXRlICpwcml2OworCisJcHJpdiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXByaXYpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlieXRfbWF4OTgwOTBfY2FyZC5kZXYgPSAmcGRldi0+ZGV2OworCXNuZF9zb2NfY2FyZF9zZXRfZHJ2ZGF0YSgmYnl0X21heDk4MDkwX2NhcmQsIHByaXYpOworCXJldF92YWwgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmYnl0X21heDk4MDkwX2NhcmQpOworCWlmIChyZXRfdmFsKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJzbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbGVkICVkXG4iLCByZXRfdmFsKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCisJcmV0dXJuIHJldF92YWw7Cit9CisKK3N0YXRpYyBpbnQgYnl0X21heDk4MDkwX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgYnl0X21heDk4MDkwX3ByaXZhdGUgKnByaXYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CisKKwlzbmRfc29jX2phY2tfZnJlZV9ncGlvcygmcHJpdi0+amFjaywgQVJSQVlfU0laRShoc19qYWNrX2dwaW9zKSwKKwkJCQloc19qYWNrX2dwaW9zKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBieXRfbWF4OTgwOTBfZHJpdmVyID0geworCS5wcm9iZSA9IGJ5dF9tYXg5ODA5MF9wcm9iZSwKKwkucmVtb3ZlID0gYnl0X21heDk4MDkwX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJieXQtbWF4OTgwOTAiLAorCQkucG0gPSAmc25kX3NvY19wbV9vcHMsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJ5dF9tYXg5ODA5MF9kcml2ZXIpCisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBJbnRlbChSKSBCYXl0cmFpbCBNYWNoaW5lIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiT21haXIgTWQgQWJkdWxsYWgsIEphcmtrbyBOaWt1bGEiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06Ynl0LW1heDk4MDkwIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J5dC1ydDU2NDAuYyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvYnl0LXJ0NTY0MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODliOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieXQtcnQ1NjQwLmMKQEAgLTAsMCArMSwyMjkgQEAKKy8qCisgKiBJbnRlbCBCYXl0cmFpbCBTU1QgUlQ1NjQwIG1hY2hpbmUgZHJpdmVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8c291bmQvcGNtLmg+CisjaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KKyNpbmNsdWRlICIuLi8uLi9jb2RlY3MvcnQ1NjQwLmgiCisKKyNpbmNsdWRlICIuLi9jb21tb24vc3N0LWRzcC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYnl0X3J0NTY0MF93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkludGVybmFsIE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfYXVkaW9fbWFwW10gPSB7CisJeyJIZWFkc2V0IE1pYyIsIE5VTEwsICJNSUNCSUFTMSJ9LAorCXsiSU4yUCIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAorCXsiSGVhZHBob25lIiwgTlVMTCwgIkhQT0wifSwKKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUE9SIn0sCisJeyJTcGVha2VyIiwgTlVMTCwgIlNQT0xQIn0sCisJeyJTcGVha2VyIiwgTlVMTCwgIlNQT0xOIn0sCisJeyJTcGVha2VyIiwgTlVMTCwgIlNQT1JQIn0sCisJeyJTcGVha2VyIiwgTlVMTCwgIlNQT1JOIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfcnQ1NjQwX2ludG1pY19kbWljMV9tYXBbXSA9IHsKKwl7IkRNSUMxIiwgTlVMTCwgIkludGVybmFsIE1pYyJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X3J0NTY0MF9pbnRtaWNfZG1pYzJfbWFwW10gPSB7CisJeyJETUlDMiIsIE5VTEwsICJJbnRlcm5hbCBNaWMifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfaW50bWljX2luMV9tYXBbXSA9IHsKKwl7IkludGVybmFsIE1pYyIsIE5VTEwsICJNSUNCSUFTMSJ9LAorCXsiSU4xUCIsIE5VTEwsICJJbnRlcm5hbCBNaWMifSwKK307CisKK2VudW0geworCUJZVF9SVDU2NDBfRE1JQzFfTUFQLAorCUJZVF9SVDU2NDBfRE1JQzJfTUFQLAorCUJZVF9SVDU2NDBfSU4xX01BUCwKK307CisKKyNkZWZpbmUgQllUX1JUNTY0MF9NQVAocXVpcmspCSgocXVpcmspICYgMHhmZikKKyNkZWZpbmUgQllUX1JUNTY0MF9ETUlDX0VOCUJJVCgxNikKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgYnl0X3J0NTY0MF9xdWlyayA9IEJZVF9SVDU2NDBfRE1JQzFfTUFQIHwKKwkJCQkJQllUX1JUNTY0MF9ETUlDX0VOOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYnl0X3J0NTY0MF9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRwaG9uZSIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRzZXQgTWljIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSW50ZXJuYWwgTWljIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiU3BlYWtlciIpLAorfTsKKworc3RhdGljIGludCBieXRfcnQ1NjQwX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY0MF9TQ0xLX1NfUExMMSwKKwkJCQkgICAgIHBhcmFtc19yYXRlKHBhcmFtcykgKiAyNTYsCisJCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGNvZGVjX2RhaS0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIGNsb2NrICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgMCwgUlQ1NjQwX1BMTDFfU19CQ0xLMSwKKwkJCQkgIHBhcmFtc19yYXRlKHBhcmFtcykgKiA2NCwKKwkJCQkgIHBhcmFtc19yYXRlKHBhcmFtcykgKiAyNTYpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY29kZWNfZGFpLT5kZXYsICJjYW4ndCBzZXQgY29kZWMgcGxsOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnl0X3J0NTY0MF9xdWlya19jYihjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCit7CisJYnl0X3J0NTY0MF9xdWlyayA9ICh1bnNpZ25lZCBsb25nKWlkLT5kcml2ZXJfZGF0YTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIGJ5dF9ydDU2NDBfcXVpcmtfdGFibGVbXSA9IHsKKwl7CisJCS5jYWxsYmFjayA9IGJ5dF9ydDU2NDBfcXVpcmtfY2IsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQVNVU1RlSyBDT01QVVRFUiBJTkMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlQxMDBUQSIpLAorCQl9LAorCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKUJZVF9SVDU2NDBfSU4xX01BUCwKKwl9LAorCXsKKwkJLmNhbGxiYWNrID0gYnl0X3J0NTY0MF9xdWlya19jYiwKKwkJLm1hdGNoZXMgPSB7CisJCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWZW51ZSA4IFBybyA1ODMwIiksCisJCX0sCisJCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopKEJZVF9SVDU2NDBfRE1JQzJfTUFQIHwKKwkJCQkJCSBCWVRfUlQ1NjQwX0RNSUNfRU4pLAorCX0sCisJe30KK307CisKK3N0YXRpYyBpbnQgYnl0X3J0NTY0MF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydW50aW1lKQoreworCWludCByZXQ7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnVudGltZS0+Y29kZWM7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHJ1bnRpbWUtPmNhcmQ7CisJY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqY3VzdG9tX21hcDsKKwlpbnQgbnVtX3JvdXRlczsKKworCWNhcmQtPmRhcG0uaWRsZV9iaWFzX29mZiA9IHRydWU7CisKKwlyZXQgPSBzbmRfc29jX2FkZF9jYXJkX2NvbnRyb2xzKGNhcmQsIGJ5dF9ydDU2NDBfY29udHJvbHMsCisJCQkJCUFSUkFZX1NJWkUoYnl0X3J0NTY0MF9jb250cm9scykpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gYWRkIGNhcmQgY29udHJvbHNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRtaV9jaGVja19zeXN0ZW0oYnl0X3J0NTY0MF9xdWlya190YWJsZSk7CisJc3dpdGNoIChCWVRfUlQ1NjQwX01BUChieXRfcnQ1NjQwX3F1aXJrKSkgeworCWNhc2UgQllUX1JUNTY0MF9JTjFfTUFQOgorCQljdXN0b21fbWFwID0gYnl0X3J0NTY0MF9pbnRtaWNfaW4xX21hcDsKKwkJbnVtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYnl0X3J0NTY0MF9pbnRtaWNfaW4xX21hcCk7CisJCWJyZWFrOworCWNhc2UgQllUX1JUNTY0MF9ETUlDMl9NQVA6CisJCWN1c3RvbV9tYXAgPSBieXRfcnQ1NjQwX2ludG1pY19kbWljMl9tYXA7CisJCW51bV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfaW50bWljX2RtaWMyX21hcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWN1c3RvbV9tYXAgPSBieXRfcnQ1NjQwX2ludG1pY19kbWljMV9tYXA7CisJCW51bV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfaW50bWljX2RtaWMxX21hcCk7CisJfQorCisJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNhcmQtPmRhcG0sIGN1c3RvbV9tYXAsIG51bV9yb3V0ZXMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfRE1JQ19FTikgeworCQlyZXQgPSBydDU2NDBfZG1pY19lbmFibGUoY29kZWMsIDAsIDApOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoJmNhcmQtPmRhcG0sICJIZWFkcGhvbmUiKTsKKwlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoJmNhcmQtPmRhcG0sICJTcGVha2VyIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGJ5dF9ydDU2NDBfb3BzID0geworCS5od19wYXJhbXMgPSBieXRfcnQ1NjQwX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBieXRfcnQ1NjQwX2RhaXNbXSA9IHsKKwl7CisJCS5uYW1lID0gIkJheXRyYWlsIEF1ZGlvIiwKKwkJLnN0cmVhbV9uYW1lID0gIkF1ZGlvIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1NjQwLWFpZjEiLAorCQkuY29kZWNfbmFtZSA9ICJpMmMtMTBFQzU2NDA6MDAiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKKwkJCSAgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCisJCS5pbml0ID0gYnl0X3J0NTY0MF9pbml0LAorCQkub3BzID0gJmJ5dF9ydDU2NDBfb3BzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBieXRfcnQ1NjQwX2NhcmQgPSB7CisJLm5hbWUgPSAiYnl0LXJ0NTY0MCIsCisJLmRhaV9saW5rID0gYnl0X3J0NTY0MF9kYWlzLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfZGFpcyksCisJLmRhcG1fd2lkZ2V0cyA9IGJ5dF9ydDU2NDBfd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYnl0X3J0NTY0MF93aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBieXRfcnQ1NjQwX2F1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShieXRfcnQ1NjQwX2F1ZGlvX21hcCksCisJLmZ1bGx5X3JvdXRlZCA9IHRydWUsCit9OworCitzdGF0aWMgaW50IGJ5dF9ydDU2NDBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJmJ5dF9ydDU2NDBfY2FyZDsKKworCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7CisJcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsIGNhcmQpOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBieXRfcnQ1NjQwX2F1ZGlvID0geworCS5wcm9iZSA9IGJ5dF9ydDU2NDBfcHJvYmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYnl0LXJ0NTY0MCIsCisJCS5wbSA9ICZzbmRfc29jX3BtX29wcywKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYnl0X3J0NTY0MF9hdWRpbykKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEludGVsKFIpIEJheXRyYWlsIE1hY2hpbmUgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJPbWFpciBNZCBBYmR1bGxhaCwgSmFya2tvIE5pa3VsYSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpieXQtcnQ1NjQwIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2J5dGNyX3J0NTY0MC5jIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieXRjcl9ydDU2NDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjU1ZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9ieXRjcl9ydDU2NDAuYwpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqICBieXRfY3JfZHBjbV9ydDU2NDAuYyAtIEFTb2MgTWFjaGluZSBkcml2ZXIgZm9yIEludGVsIEJ5dCBDUiBwbGF0Zm9ybQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTQgSW50ZWwgQ29ycAorICogIEF1dGhvcjogU3ViaHJhbnN1IFMuIFBydXN0eSA8c3ViaHJhbnN1LnMucHJ1c3R5QGludGVsLmNvbT4KKyAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSAiLi4vLi4vY29kZWNzL3J0NTY0MC5oIgorI2luY2x1ZGUgIi4uL2F0b20vc3N0LWF0b20tY29udHJvbHMuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGJ5dF9kYXBtX3dpZGdldHNbXSA9IHsKKwlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZSIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkhlYWRzZXQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiSW50IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TUEsoIkV4dCBTcGsiLCBOVUxMKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9hdWRpb19tYXBbXSA9IHsKKwl7IklOMlAiLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKKwl7IklOMk4iLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKKwl7IkhlYWRzZXQgTWljIiwgTlVMTCwgIk1JQ0JJQVMxIn0sCisJeyJJTjFQIiwgTlVMTCwgIk1JQ0JJQVMxIn0sCisJeyJMRE8yIiwgTlVMTCwgIkludCBNaWMifSwKKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUE9MIn0sCisJeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBPUiJ9LAorCXsiRXh0IFNwayIsIE5VTEwsICJTUE9MUCJ9LAorCXsiRXh0IFNwayIsIE5VTEwsICJTUE9MTiJ9LAorCXsiRXh0IFNwayIsIE5VTEwsICJTUE9SUCJ9LAorCXsiRXh0IFNwayIsIE5VTEwsICJTUE9STiJ9LAorCisJeyJBSUYxIFBsYXliYWNrIiwgTlVMTCwgInNzcDIgVHgifSwKKwl7InNzcDIgVHgiLCBOVUxMLCAiY29kZWNfb3V0MCJ9LAorCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQxIn0sCisJeyJjb2RlY19pbjAiLCBOVUxMLCAic3NwMiBSeCJ9LAorCXsiY29kZWNfaW4xIiwgTlVMTCwgInNzcDIgUngifSwKKwl7InNzcDIgUngiLCBOVUxMLCAiQUlGMSBDYXB0dXJlIn0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYnl0X21jX2NvbnRyb2xzW10gPSB7CisJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHBob25lIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSGVhZHNldCBNaWMiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJJbnQgTWljIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiRXh0IFNwayIpLAorfTsKKworc3RhdGljIGludCBieXRfYWlmMV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCWludCByZXQ7CisKKwlzbmRfc29jX2RhaV9zZXRfYmNsa19yYXRpbyhjb2RlY19kYWksIDUwKTsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NDBfU0NMS19TX1BMTDEsCisJCQkJICAgICBwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyLAorCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBjbG9jayAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgMCwgUlQ1NjQwX1BMTDFfU19CQ0xLMSwKKwkJCQkgIHBhcmFtc19yYXRlKHBhcmFtcykgKiA1MCwKKwkJCQkgIHBhcmFtc19yYXRlKHBhcmFtcykgKiA1MTIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJjYW4ndCBzZXQgY29kZWMgcGxsOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX3BjbV9zdHJlYW0gYnl0X2RhaV9wYXJhbXMgPSB7CisJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSwKKwkucmF0ZV9taW4gPSA0ODAwMCwKKwkucmF0ZV9tYXggPSA0ODAwMCwKKwkuY2hhbm5lbHNfbWluID0gMiwKKwkuY2hhbm5lbHNfbWF4ID0gMiwKK307CisKK3N0YXRpYyBpbnQgYnl0X2NvZGVjX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwkvKiBUaGUgRFNQIHdpbGwgY292ZXJ0IHRoZSBGRSByYXRlIHRvIDQ4aywgc3RlcmVvLCAyNGJpdHMgKi8KKwlyYXRlLT5taW4gPSByYXRlLT5tYXggPSA0ODAwMDsKKwljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDI7CisKKwkvKiBzZXQgU1NQMiB0byAyNC1iaXQgKi8KKwlwYXJhbXNfc2V0X2Zvcm1hdChwYXJhbXMsIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCByYXRlc180ODAwMFtdID0geworCTQ4MDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c180ODAwMCA9IHsKKwkuY291bnQgPSBBUlJBWV9TSVpFKHJhdGVzXzQ4MDAwKSwKKwkubGlzdCAgPSByYXRlc180ODAwMCwKK307CisKK3N0YXRpYyBpbnQgYnl0X2FpZjFfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkmY29uc3RyYWludHNfNDgwMDApOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGJ5dF9haWYxX29wcyA9IHsKKwkuc3RhcnR1cCA9IGJ5dF9haWYxX3N0YXJ0dXAsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGJ5dF9iZV9zc3AyX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gYnl0X2FpZjFfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGJ5dF9kYWlsaW5rW10gPSB7CisJW01FUlJfRFBDTV9BVURJT10gPSB7CisJCS5uYW1lID0gIkJheXRyYWlsIEF1ZGlvIFBvcnQiLAorCQkuc3RyZWFtX25hbWUgPSAiQmF5dHJhaWwgQXVkaW8iLAorCQkuY3B1X2RhaV9uYW1lID0gIm1lZGlhLWNwdS1kYWkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAic3N0LW1mbGQtcGxhdGZvcm0iLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuZHluYW1pYyA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5vcHMgPSAmYnl0X2FpZjFfb3BzLAorCX0sCisJW01FUlJfRFBDTV9DT01QUl0gPSB7CisJCS5uYW1lID0gIkJheXRyYWlsIENvbXByZXNzZWQgUG9ydCIsCisJCS5zdHJlYW1fbmFtZSA9ICJCYXl0cmFpbCBDb21wcmVzcyIsCisJCS5jcHVfZGFpX25hbWUgPSAiY29tcHJlc3MtY3B1LWRhaSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCisJCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJzc3QtbWZsZC1wbGF0Zm9ybSIsCisJfSwKKwkJLyogYmFjayBlbmRzICovCisJeworCQkubmFtZSA9ICJTU1AyLUNvZGVjIiwKKwkJLmJlX2lkID0gMSwKKwkJLmNwdV9kYWlfbmFtZSA9ICJzc3AyLXBvcnQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJzc3QtbWZsZC1wbGF0Zm9ybSIsCisJCS5ub19wY20gPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1NjQwLWFpZjEiLAorCQkuY29kZWNfbmFtZSA9ICJpMmMtMTBFQzU2NDA6MDAiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GCisJCQkJCQl8IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBieXRfY29kZWNfZml4dXAsCisJCS5pZ25vcmVfc3VzcGVuZCA9IDEsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5vcHMgPSAmYnl0X2JlX3NzcDJfb3BzLAorCX0sCit9OworCisvKiBTb0MgY2FyZCAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc25kX3NvY19jYXJkX2J5dCA9IHsKKwkubmFtZSA9ICJiYXl0cmFpbGNyYXVkaW8iLAorCS5kYWlfbGluayA9IGJ5dF9kYWlsaW5rLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGJ5dF9kYWlsaW5rKSwKKwkuZGFwbV93aWRnZXRzID0gYnl0X2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYnl0X2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gYnl0X2F1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShieXRfYXVkaW9fbWFwKSwKKwkuY29udHJvbHMgPSBieXRfbWNfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYnl0X21jX2NvbnRyb2xzKSwKK307CisKK3N0YXRpYyBpbnQgc25kX2J5dF9tY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXRfdmFsID0gMDsKKworCS8qIHJlZ2lzdGVyIHRoZSBzb2MgY2FyZCAqLworCXNuZF9zb2NfY2FyZF9ieXQuZGV2ID0gJnBkZXYtPmRldjsKKworCXJldF92YWwgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmc25kX3NvY19jYXJkX2J5dCk7CisJaWYgKHJldF92YWwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbGVkICVkXG4iLCByZXRfdmFsKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZzbmRfc29jX2NhcmRfYnl0KTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kX2J5dF9tY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiYnl0dDEwMF9ydDU2NDAiLAorCQkucG0gPSAmc25kX3NvY19wbV9vcHMsCisJfSwKKwkucHJvYmUgPSBzbmRfYnl0X21jX3Byb2JlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzbmRfYnl0X21jX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBJbnRlbChSKSBCYXl0cmFpbCBDUiBNYWNoaW5lIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiU3ViaHJhbnN1IFMuIFBydXN0eSA8c3ViaHJhbnN1LnMucHJ1c3R5QGludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06Ynl0dDEwMF9ydDU2NDAiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvY2h0X2Jzd19ydDU2NDUuYyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvY2h0X2Jzd19ydDU2NDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGEyOGIyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9jaHRfYnN3X3J0NTY0NS5jCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogIGNodC1ic3ctcnQ1NjQ1LmMgLSBBU29jIE1hY2hpbmUgZHJpdmVyIGZvciBJbnRlbCBDaGVycnl2aWV3LWJhc2VkIHBsYXRmb3JtcworICogICAgICAgICAgICAgICAgICAgICBDaGVycnl0cmFpbCBhbmQgQnJhc3dlbGwsIHdpdGggUlQ1NjQ1IGNvZGVjLgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTUgSW50ZWwgQ29ycAorICogIEF1dGhvcjogRmFuZywgWWFuZyBBIDx5YW5nLmEuZmFuZ0BpbnRlbC5jb20+CisgKgkgICAgICAgIE4sSGFyc2hhcHJpeWEgPGhhcnNoYXByaXlhLm5AaW50ZWwuY29tPgorICogIFRoaXMgZmlsZSBpcyBtb2RpZmllZCBmcm9tIGNodF9ic3dfcnQ1NjcyLmMKKyAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorI2luY2x1ZGUgIi4uLy4uL2NvZGVjcy9ydDU2NDUuaCIKKyNpbmNsdWRlICIuLi9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmgiCisKKyNkZWZpbmUgQ0hUX1BMQVRfQ0xLXzNfSFoJMTkyMDAwMDAKKyNkZWZpbmUgQ0hUX0NPREVDX0RBSQkicnQ1NjQ1LWFpZjEiCisKK3N0cnVjdCBjaHRfbWNfcHJpdmF0ZSB7CisJc3RydWN0IHNuZF9zb2NfamFjayBocF9qYWNrOworCXN0cnVjdCBzbmRfc29jX2phY2sgbWljX2phY2s7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfc29jX2RhaSAqY2h0X2dldF9jb2RlY19kYWkoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fcnRkOyBpKyspIHsKKwkJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKKworCQlydGQgPSBjYXJkLT5ydGQgKyBpOworCQlpZiAoIXN0cm5jbXAocnRkLT5jb2RlY19kYWktPm5hbWUsIENIVF9DT0RFQ19EQUksCisJCQkgICAgIHN0cmxlbihDSFRfQ09ERUNfREFJKSkpCisJCQlyZXR1cm4gcnRkLT5jb2RlY19kYWk7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHBsYXRmb3JtX2Nsb2NrX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCisJCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmssIGludCAgZXZlbnQpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gZGFwbS0+Y2FyZDsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJY29kZWNfZGFpID0gY2h0X2dldF9jb2RlY19kYWkoY2FyZCk7CisJaWYgKCFjb2RlY19kYWkpIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsICJDb2RlYyBkYWkgbm90IGZvdW5kOyBVbmFibGUgdG8gc2V0IHBsYXRmb3JtIGNsb2NrXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKCFTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTZXQgY29kZWMgc3lzY2xrIHNvdXJjZSB0byBpdHMgaW50ZXJuYWwgY2xvY2sgYmVjYXVzZSBjb2RlYyBQTEwgd2lsbAorCSAqIGJlIG9mZiB3aGVuIGlkbGUgYW5kIE1DTEsgd2lsbCBhbHNvIGJlIG9mZiBieSBBQ1BJIHdoZW4gY29kZWMgaXMKKwkgKiBydW50aW1lIHN1c3BlbmRlZC4gQ29kZWMgbmVlZHMgY2xvY2sgZm9yIGphY2sgZGV0ZWN0aW9uIGFuZCBidXR0b24KKwkgKiBwcmVzcy4KKwkgKi8KKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgUlQ1NjQ1X1NDTEtfU19SQ0NMSywKKwkJCTAsIFNORF9TT0NfQ0xPQ0tfSU4pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHN5c2NsazogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBjaHRfZGFwbV93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkludCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fU1BLKCJFeHQgU3BrIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX1NVUFBMWSgiUGxhdGZvcm0gQ2xvY2siLCBTTkRfU09DX05PUE0sIDAsIDAsCisJCQlwbGF0Zm9ybV9jbG9ja19jb250cm9sLCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgY2h0X2F1ZGlvX21hcFtdID0geworCXsiSU4xUCIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAorCXsiSU4xTiIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAorCXsiRE1JQyBMMSIsIE5VTEwsICJJbnQgTWljIn0sCisJeyJETUlDIFIxIiwgTlVMTCwgIkludCBNaWMifSwKKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUE9MIn0sCisJeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBPUiJ9LAorCXsiRXh0IFNwayIsIE5VTEwsICJTUE9MIn0sCisJeyJFeHQgU3BrIiwgTlVMTCwgIlNQT1IifSwKKwl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAic3NwMiBUeCJ9LAorCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQwIn0sCisJeyJzc3AyIFR4IiwgTlVMTCwgImNvZGVjX291dDEifSwKKwl7ImNvZGVjX2luMCIsIE5VTEwsICJzc3AyIFJ4IiB9LAorCXsiY29kZWNfaW4xIiwgTlVMTCwgInNzcDIgUngiIH0sCisJeyJzc3AyIFJ4IiwgTlVMTCwgIkFJRjEgQ2FwdHVyZSJ9LAorCXsiSGVhZHBob25lIiwgTlVMTCwgIlBsYXRmb3JtIENsb2NrIn0sCisJeyJIZWFkc2V0IE1pYyIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAorCXsiSW50IE1pYyIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAorCXsiRXh0IFNwayIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNodF9tY19jb250cm9sc1tdID0geworCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRwaG9uZSIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRzZXQgTWljIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSW50IE1pYyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkV4dCBTcGsiKSwKK307CisKK3N0YXRpYyBpbnQgY2h0X2FpZjFfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKKwlpbnQgcmV0OworCisJLyogc2V0IGNvZGVjIFBMTCBzb3VyY2UgdG8gdGhlIDE5LjJNSHogcGxhdGZvcm0gY2xvY2sgKE1DTEspICovCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsIFJUNTY0NV9QTEwxX1NfTUNMSywKKwkJCQkgIENIVF9QTEFUX0NMS18zX0haLCBwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHBsbDogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY0NV9TQ0xLX1NfUExMMSwKKwkJCQlwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyLCBTTkRfU09DX0NMT0NLX0lOKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHN5c2NsazogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2h0X2NvZGVjX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydW50aW1lLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ1bnRpbWUtPmNvZGVjX2RhaTsKKwlzdHJ1Y3QgY2h0X21jX3ByaXZhdGUgKmN0eCA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydW50aW1lLT5jYXJkKTsKKworCS8qIFNlbGVjdCBjbGtfaTJzMV9hc3JjIGFzIEFTUkMgY2xvY2sgc291cmNlICovCisJcnQ1NjQ1X3NlbF9hc3JjX2Nsa19zcmMoY29kZWMsCisJCQkJUlQ1NjQ1X0RBX1NURVJFT19GSUxURVIgfAorCQkJCVJUNTY0NV9EQV9NT05PX0xfRklMVEVSIHwKKwkJCQlSVDU2NDVfREFfTU9OT19SX0ZJTFRFUiB8CisJCQkJUlQ1NjQ1X0FEX1NURVJFT19GSUxURVIsCisJCQkJUlQ1NjQ1X0NMS19TRUxfSTJTMV9BU1JDKTsKKworCS8qIFRETSA0IHNsb3RzIDI0IGJpdCwgc2V0IFJ4ICYgVHggYml0bWFzayB0byA0IGFjdGl2ZSBzbG90cyAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChjb2RlY19kYWksIDB4RiwgMHhGLCA0LCAyNCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydW50aW1lLT5kZXYsICJjYW4ndCBzZXQgY29kZWMgVERNIHNsb3QgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc25kX3NvY19jYXJkX2phY2tfbmV3KHJ1bnRpbWUtPmNhcmQsICJIZWFkcGhvbmUgSmFjayIsCisJCQkJICAgIFNORF9KQUNLX0hFQURQSE9ORSwgJmN0eC0+aHBfamFjaywKKwkJCQkgICAgTlVMTCwgMCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHJ1bnRpbWUtPmRldiwgIkhQIGphY2sgY3JlYXRpb24gZmFpbGVkICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNuZF9zb2NfY2FyZF9qYWNrX25ldyhydW50aW1lLT5jYXJkLCAiTWljIEphY2siLAorCQkJCSAgICBTTkRfSkFDS19NSUNST1BIT05FLCAmY3R4LT5taWNfamFjaywKKwkJCQkgICAgTlVMTCwgMCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHJ1bnRpbWUtPmRldiwgIk1pYyBqYWNrIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlydDU2NDVfc2V0X2phY2tfZGV0ZWN0KGNvZGVjLCAmY3R4LT5ocF9qYWNrLCAmY3R4LT5taWNfamFjayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNodF9jb2RlY19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAorCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCisJCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOworCisJLyogVGhlIERTUCB3aWxsIGNvdmVydCB0aGUgRkUgcmF0ZSB0byA0OGssIHN0ZXJlbywgMjRiaXRzICovCisJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gNDgwMDA7CisJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAyOworCisJLyogc2V0IFNTUDIgdG8gMjQtYml0ICovCisJcGFyYW1zX3NldF9mb3JtYXQocGFyYW1zLCBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNfNDgwMDBbXSA9IHsKKwk0ODAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfNDgwMDAgPSB7CisJLmNvdW50ID0gQVJSQVlfU0laRShyYXRlc180ODAwMCksCisJLmxpc3QgID0gcmF0ZXNfNDgwMDAsCit9OworCitzdGF0aWMgaW50IGNodF9haWYxX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHN1YnN0cmVhbS0+cnVudGltZSwgMCwKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAorCQkJJmNvbnN0cmFpbnRzXzQ4MDAwKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBjaHRfYWlmMV9vcHMgPSB7CisJLnN0YXJ0dXAgPSBjaHRfYWlmMV9zdGFydHVwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBjaHRfYmVfc3NwMl9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IGNodF9haWYxX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBjaHRfZGFpbGlua1tdID0geworCVtNRVJSX0RQQ01fQVVESU9dID0geworCQkubmFtZSA9ICJBdWRpbyBQb3J0IiwKKwkJLnN0cmVhbV9uYW1lID0gIkF1ZGlvIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtZWRpYS1jcHUtZGFpIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gInNzdC1tZmxkLXBsYXRmb3JtIiwKKwkJLmlnbm9yZV9zdXNwZW5kID0gMSwKKwkJLmR5bmFtaWMgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkub3BzID0gJmNodF9haWYxX29wcywKKwl9LAorCVtNRVJSX0RQQ01fQ09NUFJdID0geworCQkubmFtZSA9ICJDb21wcmVzc2VkIFBvcnQiLAorCQkuc3RyZWFtX25hbWUgPSAiQ29tcHJlc3MiLAorCQkuY3B1X2RhaV9uYW1lID0gImNvbXByZXNzLWNwdS1kYWkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAic3N0LW1mbGQtcGxhdGZvcm0iLAorCX0sCisJLyogQ09ERUM8LT5DT0RFQyBsaW5rICovCisJLyogYmFjayBlbmRzICovCisJeworCQkubmFtZSA9ICJTU1AyLUNvZGVjIiwKKwkJLmJlX2lkID0gMSwKKwkJLmNwdV9kYWlfbmFtZSA9ICJzc3AyLXBvcnQiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJzc3QtbWZsZC1wbGF0Zm9ybSIsCisJCS5ub19wY20gPSAxLAorCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1NjQ1LWFpZjEiLAorCQkuY29kZWNfbmFtZSA9ICJpMmMtMTBFQzU2NDU6MDAiLAorCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0RTUF9CIHwgU05EX1NPQ19EQUlGTVRfSUJfTkYKKwkJCQkJfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorCQkuaW5pdCA9IGNodF9jb2RlY19pbml0LAorCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gY2h0X2NvZGVjX2ZpeHVwLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuZHBjbV9wbGF5YmFjayA9IDEsCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCQkub3BzID0gJmNodF9iZV9zc3AyX29wcywKKwl9LAorfTsKKworLyogU29DIGNhcmQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9zb2NfY2FyZF9jaHQgPSB7CisJLm5hbWUgPSAiY2h0cnQ1NjQ1IiwKKwkuZGFpX2xpbmsgPSBjaHRfZGFpbGluaywKKwkubnVtX2xpbmtzID0gQVJSQVlfU0laRShjaHRfZGFpbGluayksCisJLmRhcG1fd2lkZ2V0cyA9IGNodF9kYXBtX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGNodF9kYXBtX3dpZGdldHMpLAorCS5kYXBtX3JvdXRlcyA9IGNodF9hdWRpb19tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoY2h0X2F1ZGlvX21hcCksCisJLmNvbnRyb2xzID0gY2h0X21jX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGNodF9tY19jb250cm9scyksCit9OworCitzdGF0aWMgaW50IHNuZF9jaHRfbWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0X3ZhbCA9IDA7CisJc3RydWN0IGNodF9tY19wcml2YXRlICpkcnY7CisKKwlkcnYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpkcnYpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWRydikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzbmRfc29jX2NhcmRfY2h0LmRldiA9ICZwZGV2LT5kZXY7CisJc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKCZzbmRfc29jX2NhcmRfY2h0LCBkcnYpOworCXJldF92YWwgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmc25kX3NvY19jYXJkX2NodCk7CisJaWYgKHJldF92YWwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCBmYWlsZWQgJWRcbiIsIHJldF92YWwpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJnNuZF9zb2NfY2FyZF9jaHQpOworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRfY2h0X21jX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJjaHQtYnN3LXJ0NTY0NSIsCisJCS5wbSA9ICZzbmRfc29jX3BtX29wcywKKwl9LAorCS5wcm9iZSA9IHNuZF9jaHRfbWNfcHJvYmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNuZF9jaHRfbWNfZHJpdmVyKQorCitNT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgSW50ZWwoUikgQnJhc3dlbGwgTWFjaGluZSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkZhbmcsIFlhbmcgQSxOLEhhcnNoYXByaXlhIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmNodC1ic3ctcnQ1NjQ1Iik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2NodF9ic3dfcnQ1NjcyLmMgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2NodF9ic3dfcnQ1NjcyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5Y2M1YgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvY2h0X2Jzd19ydDU2NzIuYwpAQCAtMCwwICsxLDM2NiBAQAorLyoKKyAqICBjaHRfYnN3X3J0NTY3Mi5jIC0gQVNvYyBNYWNoaW5lIGRyaXZlciBmb3IgSW50ZWwgQ2hlcnJ5dmlldy1iYXNlZCBwbGF0Zm9ybXMKKyAqICAgICAgICAgICAgICAgICAgICAgQ2hlcnJ5dHJhaWwgYW5kIEJyYXN3ZWxsLCB3aXRoIFJUNTY3MiBjb2RlYy4KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDE0IEludGVsIENvcnAKKyAqICBBdXRob3I6IFN1YmhyYW5zdSBTLiBQcnVzdHkgPHN1YmhyYW5zdS5zLnBydXN0eUBpbnRlbC5jb20+CisgKiAgICAgICAgICBNZW5nZG9uZyBMaW4gPG1lbmdkb25nLmxpbkBpbnRlbC5jb20+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvamFjay5oPgorI2luY2x1ZGUgIi4uLy4uL2NvZGVjcy9ydDU2NzAuaCIKKyNpbmNsdWRlICIuLi9hdG9tL3NzdC1hdG9tLWNvbnRyb2xzLmgiCisKKy8qIFRoZSBwbGF0Zm9ybSBjbG9jayAjMyBvdXRwdXRzIDE5LjJNaHogY2xvY2sgdG8gY29kZWMgYXMgSTJTIE1DTEsgKi8KKyNkZWZpbmUgQ0hUX1BMQVRfQ0xLXzNfSFoJMTkyMDAwMDAKKyNkZWZpbmUgQ0hUX0NPREVDX0RBSQkicnQ1NjcwLWFpZjEiCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrIGNodF9ic3dfaGVhZHNldDsKKworLyogSGVhZHNldCBqYWNrIGRldGVjdGlvbiBEQVBNIHBpbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrX3BpbiBjaHRfYnN3X2hlYWRzZXRfcGluc1tdID0geworCXsKKwkJLnBpbiA9ICJIZWFkc2V0IE1pYyIsCisJCS5tYXNrID0gU05EX0pBQ0tfTUlDUk9QSE9ORSwKKwl9LAorCXsKKwkJLnBpbiA9ICJIZWFkcGhvbmUiLAorCQkubWFzayA9IFNORF9KQUNLX0hFQURQSE9ORSwKKwl9LAorfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc25kX3NvY19kYWkgKmNodF9nZXRfY29kZWNfZGFpKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FyZC0+bnVtX3J0ZDsgaSsrKSB7CisJCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQ7CisKKwkJcnRkID0gY2FyZC0+cnRkICsgaTsKKwkJaWYgKCFzdHJuY21wKHJ0ZC0+Y29kZWNfZGFpLT5uYW1lLCBDSFRfQ09ERUNfREFJLAorCQkJICAgICBzdHJsZW4oQ0hUX0NPREVDX0RBSSkpKQorCQkJcmV0dXJuIHJ0ZC0+Y29kZWNfZGFpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBwbGF0Zm9ybV9jbG9ja19jb250cm9sKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3LAorCQlzdHJ1Y3Qgc25kX2tjb250cm9sICprLCBpbnQgIGV2ZW50KQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9IHctPmRhcG07CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IGRhcG0tPmNhcmQ7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWk7CisJaW50IHJldDsKKworCWNvZGVjX2RhaSA9IGNodF9nZXRfY29kZWNfZGFpKGNhcmQpOworCWlmICghY29kZWNfZGFpKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQ29kZWMgZGFpIG5vdCBmb3VuZDsgVW5hYmxlIHRvIHNldCBwbGF0Zm9ybSBjbG9ja1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChTTkRfU09DX0RBUE1fRVZFTlRfT04oZXZlbnQpKSB7CisJCS8qIHNldCBjb2RlYyBQTEwgc291cmNlIHRvIHRoZSAxOS4yTUh6IHBsYXRmb3JtIGNsb2NrIChNQ0xLKSAqLworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgMCwgUlQ1NjcwX1BMTDFfU19NQ0xLLAorCQkJCUNIVF9QTEFUX0NMS18zX0haLCA0ODAwMCAqIDUxMik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGNhcmQtPmRldiwgImNhbid0IHNldCBjb2RlYyBwbGw6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qIHNldCBjb2RlYyBzeXNjbGsgc291cmNlIHRvIFBMTCAqLworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgUlQ1NjcwX1NDTEtfU19QTEwxLAorCQkJNDgwMDAgKiA1MTIsIFNORF9TT0NfQ0xPQ0tfSU4pOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycihjYXJkLT5kZXYsICJjYW4ndCBzZXQgY29kZWMgc3lzY2xrOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiBTZXQgY29kZWMgc3lzY2xrIHNvdXJjZSB0byBpdHMgaW50ZXJuYWwgY2xvY2sgYmVjYXVzZSBjb2RlYworCQkgKiBQTEwgd2lsbCBiZSBvZmYgd2hlbiBpZGxlIGFuZCBNQ0xLIHdpbGwgYWxzbyBiZSBvZmYgYnkgQUNQSQorCQkgKiB3aGVuIGNvZGVjIGlzIHJ1bnRpbWUgc3VzcGVuZGVkLiBDb2RlYyBuZWVkcyBjbG9jayBmb3IgamFjaworCQkgKiBkZXRlY3Rpb24gYW5kIGJ1dHRvbiBwcmVzcy4KKwkJICovCisJCXNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NzBfU0NMS19TX1JDQ0xLLAorCQkJCSAgICAgICA0ODAwMCAqIDUxMiwgU05EX1NPQ19DTE9DS19JTik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgY2h0X2RhcG1fd2lkZ2V0c1tdID0geworCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKKwlTTkRfU09DX0RBUE1fTUlDKCJJbnQgTWljIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX1NQSygiRXh0IFNwayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9TVVBQTFkoIlBsYXRmb3JtIENsb2NrIiwgU05EX1NPQ19OT1BNLCAwLCAwLAorCQkJcGxhdGZvcm1fY2xvY2tfY29udHJvbCwgU05EX1NPQ19EQVBNX1BSRV9QTVUgfAorCQkJU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGNodF9hdWRpb19tYXBbXSA9IHsKKwl7IklOMVAiLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKKwl7IklOMU4iLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKKwl7IkRNSUMgTDEiLCBOVUxMLCAiSW50IE1pYyJ9LAorCXsiRE1JQyBSMSIsIE5VTEwsICJJbnQgTWljIn0sCisJeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBPTCJ9LAorCXsiSGVhZHBob25lIiwgTlVMTCwgIkhQT1IifSwKKwl7IkV4dCBTcGsiLCBOVUxMLCAiU1BPTFAifSwKKwl7IkV4dCBTcGsiLCBOVUxMLCAiU1BPTE4ifSwKKwl7IkV4dCBTcGsiLCBOVUxMLCAiU1BPUlAifSwKKwl7IkV4dCBTcGsiLCBOVUxMLCAiU1BPUk4ifSwKKwl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAic3NwMiBUeCJ9LAorCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQwIn0sCisJeyJzc3AyIFR4IiwgTlVMTCwgImNvZGVjX291dDEifSwKKwl7ImNvZGVjX2luMCIsIE5VTEwsICJzc3AyIFJ4In0sCisJeyJjb2RlY19pbjEiLCBOVUxMLCAic3NwMiBSeCJ9LAorCXsic3NwMiBSeCIsIE5VTEwsICJBSUYxIENhcHR1cmUifSwKKwl7IkhlYWRwaG9uZSIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAorCXsiSGVhZHNldCBNaWMiLCBOVUxMLCAiUGxhdGZvcm0gQ2xvY2sifSwKKwl7IkludCBNaWMiLCBOVUxMLCAiUGxhdGZvcm0gQ2xvY2sifSwKKwl7IkV4dCBTcGsiLCBOVUxMLCAiUGxhdGZvcm0gQ2xvY2sifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjaHRfbWNfY29udHJvbHNbXSA9IHsKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkcGhvbmUiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkc2V0IE1pYyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkludCBNaWMiKSwKKwlTT0NfREFQTV9QSU5fU1dJVENIKCJFeHQgU3BrIiksCit9OworCitzdGF0aWMgaW50IGNodF9haWYxX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7CisJaW50IHJldDsKKworCS8qIHNldCBjb2RlYyBQTEwgc291cmNlIHRvIHRoZSAxOS4yTUh6IHBsYXRmb3JtIGNsb2NrIChNQ0xLKSAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCAwLCBSVDU2NzBfUExMMV9TX01DTEssCisJCQkJICBDSFRfUExBVF9DTEtfM19IWiwgcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUxMik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBwbGw6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHNldCBjb2RlYyBzeXNjbGsgc291cmNlIHRvIFBMTCAqLworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NzBfU0NMS19TX1BMTDEsCisJCQkJICAgICBwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyLAorCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBzeXNjbGs6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaHRfY29kZWNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnVudGltZS0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CisKKwkvKiBURE0gNCBzbG90cyAyNCBiaXQsIHNldCBSeCAmIFR4IGJpdG1hc2sgdG8gNCBhY3RpdmUgc2xvdHMgKi8KKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY29kZWNfZGFpLCAweEYsIDB4RiwgNCwgMjQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnVudGltZS0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIFRETSBzbG90ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFNlbGVjdCBjb2RlYyBBU1JDIGNsb2NrIHNvdXJjZSB0byB0cmFjayBJMlMxIGNsb2NrLCBiZWNhdXNlIGNvZGVjCisJICogaXMgaW4gc2xhdmUgbW9kZSBhbmQgMTAwZnMgSTJTIGZvcm1hdCAoQkNMSyA9IDEwMCAqIExSQ0xLKSBjYW5ub3QKKwkgKiBiZSBzdXBwb3J0ZWQgYnkgUlQ1NjcyLiBPdGhlcndpc2UsIEFTUkMgd2lsbCBiZSBkaXNhYmxlZCBhbmQgY2F1c2UKKwkgKiBub2lzZS4KKwkgKi8KKwlydDU2NzBfc2VsX2FzcmNfY2xrX3NyYyhjb2RlYywKKwkJCQlSVDU2NzBfREFfU1RFUkVPX0ZJTFRFUgorCQkJCXwgUlQ1NjcwX0RBX01PTk9fTF9GSUxURVIKKwkJCQl8IFJUNTY3MF9EQV9NT05PX1JfRklMVEVSCisJCQkJfCBSVDU2NzBfQURfU1RFUkVPX0ZJTFRFUgorCQkJCXwgUlQ1NjcwX0FEX01PTk9fTF9GSUxURVIKKwkJCQl8IFJUNTY3MF9BRF9NT05PX1JfRklMVEVSLAorCQkJCVJUNTY3MF9DTEtfU0VMX0kyUzFfQVNSQyk7CisKKyAgICAgICAgcmV0ID0gc25kX3NvY19jYXJkX2phY2tfbmV3KHJ1bnRpbWUtPmNhcmQsICJIZWFkc2V0IiwKKyAgICAgICAgICAgICAgICBTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzAgfAorICAgICAgICAgICAgICAgIFNORF9KQUNLX0JUTl8xIHwgU05EX0pBQ0tfQlROXzIsICZjaHRfYnN3X2hlYWRzZXQsCisgICAgICAgICAgICAgICAgY2h0X2Jzd19oZWFkc2V0X3BpbnMsIEFSUkFZX1NJWkUoY2h0X2Jzd19oZWFkc2V0X3BpbnMpKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisJcnQ1NjcwX3NldF9qYWNrX2RldGVjdChjb2RlYywgJmNodF9ic3dfaGVhZHNldCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2h0X2NvZGVjX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7CisKKwkvKiBUaGUgRFNQIHdpbGwgY292ZXJ0IHRoZSBGRSByYXRlIHRvIDQ4aywgc3RlcmVvLCAyNGJpdHMgKi8KKwlyYXRlLT5taW4gPSByYXRlLT5tYXggPSA0ODAwMDsKKwljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDI7CisKKwkvKiBzZXQgU1NQMiB0byAyNC1iaXQgKi8KKwlwYXJhbXNfc2V0X2Zvcm1hdChwYXJhbXMsIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCByYXRlc180ODAwMFtdID0geworCTQ4MDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c180ODAwMCA9IHsKKwkuY291bnQgPSBBUlJBWV9TSVpFKHJhdGVzXzQ4MDAwKSwKKwkubGlzdCAgPSByYXRlc180ODAwMCwKK307CisKK3N0YXRpYyBpbnQgY2h0X2FpZjFfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlyZXR1cm4gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCisJCQkmY29uc3RyYWludHNfNDgwMDApOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGNodF9haWYxX29wcyA9IHsKKwkuc3RhcnR1cCA9IGNodF9haWYxX3N0YXJ0dXAsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGNodF9iZV9zc3AyX29wcyA9IHsKKwkuaHdfcGFyYW1zID0gY2h0X2FpZjFfaHdfcGFyYW1zLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGNodF9kYWlsaW5rW10gPSB7CisJLyogRnJvbnQgRW5kIERBSSBsaW5rcyAqLworCVtNRVJSX0RQQ01fQVVESU9dID0geworCQkubmFtZSA9ICJBdWRpbyBQb3J0IiwKKwkJLnN0cmVhbV9uYW1lID0gIkF1ZGlvIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJtZWRpYS1jcHUtZGFpIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gInNzdC1tZmxkLXBsYXRmb3JtIiwKKwkJLm5vbmF0b21pYyA9IHRydWUsCisJCS5keW5hbWljID0gMSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwkJLm9wcyA9ICZjaHRfYWlmMV9vcHMsCisJfSwKKwlbTUVSUl9EUENNX0NPTVBSXSA9IHsKKwkJLm5hbWUgPSAiQ29tcHJlc3NlZCBQb3J0IiwKKwkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJjb21wcmVzcy1jcHUtZGFpIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCisJCS5wbGF0Zm9ybV9uYW1lID0gInNzdC1tZmxkLXBsYXRmb3JtIiwKKwl9LAorCisJLyogQmFjayBFbmQgREFJIGxpbmtzICovCisJeworCQkvKiBTU1AyIC0gQ29kZWMgKi8KKwkJLm5hbWUgPSAiU1NQMi1Db2RlYyIsCisJCS5iZV9pZCA9IDEsCisJCS5jcHVfZGFpX25hbWUgPSAic3NwMi1wb3J0IiwKKwkJLnBsYXRmb3JtX25hbWUgPSAic3N0LW1mbGQtcGxhdGZvcm0iLAorCQkubm9fcGNtID0gMSwKKwkJLm5vbmF0b21pYyA9IHRydWUsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJydDU2NzAtYWlmMSIsCisJCS5jb2RlY19uYW1lID0gImkyYy0xMEVDNTY3MDowMCIsCisJCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfRFNQX0IgfCBTTkRfU09DX0RBSUZNVF9JQl9ORgorCQkJCQl8IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCisJCS5pbml0ID0gY2h0X2NvZGVjX2luaXQsCisJCS5iZV9od19wYXJhbXNfZml4dXAgPSBjaHRfY29kZWNfZml4dXAsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJCS5vcHMgPSAmY2h0X2JlX3NzcDJfb3BzLAorCX0sCit9OworCitzdGF0aWMgaW50IGNodF9zdXNwZW5kX3ByZShzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjYXJkLT5jb2RlY19kZXZfbGlzdCwgY2FyZF9saXN0KSB7CisJCWlmICghc3RyY21wKGNvZGVjLT5jb21wb25lbnQubmFtZSwgImkyYy0xMEVDNTY3MDowMCIpKSB7CisJCQlkZXZfZGJnKGNvZGVjLT5kZXYsICJkaXNhYmxpbmcgamFjayBkZXRlY3QgYmVmb3JlIGdvaW5nIHRvIHN1c3BlbmQuXG4iKTsKKwkJCXJ0NTY3MF9qYWNrX3N1c3BlbmQoY29kZWMpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2h0X3Jlc3VtZV9wb3N0KHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmNhcmQtPmNvZGVjX2Rldl9saXN0LCBjYXJkX2xpc3QpIHsKKwkJaWYgKCFzdHJjbXAoY29kZWMtPmNvbXBvbmVudC5uYW1lLCAiaTJjLTEwRUM1NjcwOjAwIikpIHsKKwkJCWRldl9kYmcoY29kZWMtPmRldiwgImVuYWJsaW5nIGphY2sgZGV0ZWN0IGZvciByZXN1bWUuXG4iKTsKKwkJCXJ0NTY3MF9qYWNrX3Jlc3VtZShjb2RlYyk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBTb0MgY2FyZCAqLworc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc25kX3NvY19jYXJkX2NodCA9IHsKKwkubmFtZSA9ICJjaGVycnl0cmFpbGNyYXVkaW8iLAorCS5kYWlfbGluayA9IGNodF9kYWlsaW5rLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGNodF9kYWlsaW5rKSwKKwkuZGFwbV93aWRnZXRzID0gY2h0X2RhcG1fd2lkZ2V0cywKKwkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY2h0X2RhcG1fd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gY2h0X2F1ZGlvX21hcCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjaHRfYXVkaW9fbWFwKSwKKwkuY29udHJvbHMgPSBjaHRfbWNfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY2h0X21jX2NvbnRyb2xzKSwKKwkuc3VzcGVuZF9wcmUgPSBjaHRfc3VzcGVuZF9wcmUsCisJLnJlc3VtZV9wb3N0ID0gY2h0X3Jlc3VtZV9wb3N0LAorfTsKKworc3RhdGljIGludCBzbmRfY2h0X21jX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldF92YWwgPSAwOworCisJLyogcmVnaXN0ZXIgdGhlIHNvYyBjYXJkICovCisJc25kX3NvY19jYXJkX2NodC5kZXYgPSAmcGRldi0+ZGV2OworCXJldF92YWwgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmc25kX3NvY19jYXJkX2NodCk7CisJaWYgKHJldF92YWwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCBmYWlsZWQgJWRcbiIsIHJldF92YWwpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgJnNuZF9zb2NfY2FyZF9jaHQpOworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRfY2h0X21jX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJjaHQtYnN3LXJ0NTY3MiIsCisJfSwKKwkucHJvYmUgPSBzbmRfY2h0X21jX3Byb2JlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzbmRfY2h0X21jX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBJbnRlbChSKSBCYXl0cmFpbCBDUiBNYWNoaW5lIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiU3ViaHJhbnN1IFMuIFBydXN0eSwgTWVuZ2RvbmcgTGluIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmNodC1ic3ctcnQ1NjcyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2hhc3dlbGwuYyBiL3NvdW5kL3NvYy9pbnRlbC9ib2FyZHMvaGFzd2VsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNTU4NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL2hhc3dlbGwuYwpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIEludGVsIEhhc3dlbGwgTHlueHBvaW50IFNTVCBBdWRpbworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvY29yZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKworI2luY2x1ZGUgIi4uL2NvbW1vbi9zc3QtZHNwLmgiCisjaW5jbHVkZSAiLi4vaGFzd2VsbC9zc3QtaGFzd2VsbC1pcGMuaCIKKworI2luY2x1ZGUgIi4uLy4uL2NvZGVjcy9ydDU2NDAuaCIKKworLyogSGFzd2VsbCBVTFQgcGxhdGZvcm1zIGhhdmUgYSBIZWFkcGhvbmUgYW5kIE1pYyBqYWNrICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgaGFzd2VsbF93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmVzIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiTWljIiwgTlVMTCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBoYXN3ZWxsX3J0NTY0MF9tYXBbXSA9IHsKKworCXsiSGVhZHBob25lcyIsIE5VTEwsICJIUE9SIn0sCisJeyJIZWFkcGhvbmVzIiwgTlVMTCwgIkhQT0wifSwKKwl7IklOMlAiLCBOVUxMLCAiTWljIn0sCisKKwkvKiBDT0RFQyBCRSBjb25uZWN0aW9ucyAqLworCXsiU1NQMCBDT0RFQyBJTiIsIE5VTEwsICJBSUYxIENhcHR1cmUifSwKKwl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAiU1NQMCBDT0RFQyBPVVQifSwKK307CisKK3N0YXRpYyBpbnQgaGFzd2VsbF9zc3AwX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOworCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAorCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKKworCS8qIFRoZSBBRFNQIHdpbGwgY292ZXJ0IHRoZSBGRSByYXRlIHRvIDQ4aywgc3RlcmVvICovCisJcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gNDgwMDA7CisJY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAyOworCisJLyogc2V0IFNTUDAgdG8gMTYgYml0ICovCisJcGFyYW1zX3NldF9mb3JtYXQocGFyYW1zLCBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFzd2VsbF9ydDU2NDBfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOworCWludCByZXQ7CisKKwlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgUlQ1NjQwX1NDTEtfU19NQ0xLLCAxMjI4ODAwMCwKKwkJU05EX1NPQ19DTE9DS19JTik7CisKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHN5c2NsayBjb25maWd1cmF0aW9uXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBzZXQgY29ycmVjdCBjb2RlYyBmaWx0ZXIgZm9yIERBSSBmb3JtYXQgYW5kIGNsb2NrIGNvbmZpZyAqLworCXNuZF9zb2NfdXBkYXRlX2JpdHMocnRkLT5jb2RlYywgMHg4MywgMHhmZmZmLCAweDgwMDApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBoYXN3ZWxsX3J0NTY0MF9vcHMgPSB7CisJLmh3X3BhcmFtcyA9IGhhc3dlbGxfcnQ1NjQwX2h3X3BhcmFtcywKK307CisKK3N0YXRpYyBpbnQgaGFzd2VsbF9ydGRfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQoreworCXN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShydGQtPnBsYXRmb3JtLT5kZXYpOworCXN0cnVjdCBzc3RfaHN3ICpoYXN3ZWxsID0gcGRhdGEtPmRzcDsKKwlpbnQgcmV0OworCisJLyogU2V0IEFEU1AgU1NQIHBvcnQgc2V0dGluZ3MgKi8KKwlyZXQgPSBzc3RfaHN3X2RldmljZV9zZXRfY29uZmlnKGhhc3dlbGwsIFNTVF9IU1dfREVWSUNFX1NTUF8wLAorCQlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfMjRfTUhaLAorCQlTU1RfSFNXX0RFVklDRV9DTE9DS19NQVNURVIsIDkpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJmYWlsZWQgdG8gc2V0IGRldmljZSBjb25maWdcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgaGFzd2VsbF9ydDU2NDBfZGFpc1tdID0geworCS8qIEZyb250IEVuZCBEQUkgbGlua3MgKi8KKwl7CisJCS5uYW1lID0gIlN5c3RlbSIsCisJCS5zdHJlYW1fbmFtZSA9ICJTeXN0ZW0gUGxheWJhY2svQ2FwdHVyZSIsCisJCS5jcHVfZGFpX25hbWUgPSAiU3lzdGVtIFBpbiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLmluaXQgPSBoYXN3ZWxsX3J0ZF9pbml0LAorCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULCBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKKwkJLmRwY21fcGxheWJhY2sgPSAxLAorCQkuZHBjbV9jYXB0dXJlID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiT2ZmbG9hZDAiLAorCQkuc3RyZWFtX25hbWUgPSAiT2ZmbG9hZDAgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIk9mZmxvYWQwIFBpbiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiT2ZmbG9hZDEiLAorCQkuc3RyZWFtX25hbWUgPSAiT2ZmbG9hZDEgUGxheWJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIk9mZmxvYWQxIFBpbiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkJLmR5bmFtaWMgPSAxLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTG9vcGJhY2siLAorCQkuc3RyZWFtX25hbWUgPSAiTG9vcGJhY2siLAorCQkuY3B1X2RhaV9uYW1lID0gIkxvb3BiYWNrIFBpbiIsCisJCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkJLmR5bmFtaWMgPSAwLAorCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKKwkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCisJCS5kcGNtX2NhcHR1cmUgPSAxLAorCX0sCisKKwkvKiBCYWNrIEVuZCBEQUkgbGlua3MgKi8KKwl7CisJCS8qIFNTUDAgLSBDb2RlYyAqLworCQkubmFtZSA9ICJDb2RlYyIsCisJCS5iZV9pZCA9IDAsCisJCS5jcHVfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKKwkJLm5vX3BjbSA9IDEsCisJCS5jb2RlY19uYW1lID0gImkyYy1JTlQzM0NBOjAwIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gInJ0NTY0MC1haWYxIiwKKwkJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORiB8CisJCQlTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAorCQkuaWdub3JlX3N1c3BlbmQgPSAxLAorCQkuaWdub3JlX3BtZG93bl90aW1lID0gMSwKKwkJLmJlX2h3X3BhcmFtc19maXh1cCA9IGhhc3dlbGxfc3NwMF9maXh1cCwKKwkJLm9wcyA9ICZoYXN3ZWxsX3J0NTY0MF9vcHMsCisJCS5kcGNtX3BsYXliYWNrID0gMSwKKwkJLmRwY21fY2FwdHVyZSA9IDEsCisJfSwKK307CisKKy8qIGF1ZGlvIG1hY2hpbmUgZHJpdmVyIGZvciBIYXN3ZWxsIEx5bnhwb2ludCBEU1AgKyBSVDU2NDAgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIGhhc3dlbGxfcnQ1NjQwID0geworCS5uYW1lID0gImhhc3dlbGwtcnQ1NjQwIiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkuZGFpX2xpbmsgPSBoYXN3ZWxsX3J0NTY0MF9kYWlzLAorCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGhhc3dlbGxfcnQ1NjQwX2RhaXMpLAorCS5kYXBtX3dpZGdldHMgPSBoYXN3ZWxsX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGhhc3dlbGxfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gaGFzd2VsbF9ydDU2NDBfbWFwLAorCS5udW1fZGFwbV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGhhc3dlbGxfcnQ1NjQwX21hcCksCisJLmZ1bGx5X3JvdXRlZCA9IHRydWUsCit9OworCitzdGF0aWMgaW50IGhhc3dlbGxfYXVkaW9fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwloYXN3ZWxsX3J0NTY0MC5kZXYgPSAmcGRldi0+ZGV2OworCisJcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZoYXN3ZWxsX3J0NTY0MCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGhhc3dlbGxfYXVkaW8gPSB7CisJLnByb2JlID0gaGFzd2VsbF9hdWRpb19wcm9iZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJoYXN3ZWxsLWF1ZGlvIiwKKwl9LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihoYXN3ZWxsX2F1ZGlvKQorCisvKiBNb2R1bGUgaW5mb3JtYXRpb24gKi8KK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QsIFhpbmdjaGFvIFdhbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgU1NUIEF1ZGlvIGZvciBIYXN3ZWxsIEx5bnhwb2ludCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpoYXN3ZWxsLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYm9hcmRzL21mbGRfbWFjaGluZS5jIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9tZmxkX21hY2hpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWMwOWEwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2JvYXJkcy9tZmxkX21hY2hpbmUuYwpAQCAtMCwwICsxLDQzMCBAQAorLyoKKyAqICBtZmxkX21hY2hpbmUuYyAtIEFTb2MgTWFjaGluZSBkcml2ZXIgZm9yIEludGVsIE1lZGZpZWxkIE1JRCBwbGF0Zm9ybQorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgSW50ZWwgQ29ycAorICogIEF1dGhvcjogVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+CisgKiAgQXV0aG9yOiBIYXJzaGEgUHJpeWEgPHByaXlhLmhhcnNoYUBpbnRlbC5jb20+CisgKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgorICoKKyAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisjaW5jbHVkZSAiLi4vY29kZWNzL3NuOTUwMzEuaCIKKworI2RlZmluZSBNSURfTU9OTyAxCisjZGVmaW5lIE1JRF9TVEVSRU8gMgorI2RlZmluZSBNSURfTUFYX0NBUCA1CisjZGVmaW5lIE1GTERfSkFDS19JTlNFUlQgMHgwNAorCitlbnVtIHNvY19taWNfYmlhc196b25lcyB7CisJTUZMRF9NVl9TVEFSVCA9IDAsCisJLyogbWljIGJpYXMgdm9sdXRhZ2UgcmFuZ2UgZm9yIEhlYWRwaG9uZXMqLworCU1GTERfTVZfSFAgPSA0MDAsCisJLyogbWljIGJpYXMgdm9sdXRhZ2UgcmFuZ2UgZm9yIEFtZXJpY2FuIEhlYWRzZXQqLworCU1GTERfTVZfQU1fSFMgPSA2NTAsCisJLyogbWljIGJpYXMgdm9sdXRhZ2UgcmFuZ2UgZm9yIEhlYWRzZXQqLworCU1GTERfTVZfSFMgPSAyMDAwLAorCU1GTERfTVZfVU5ERUZJTkVELAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludAloc19zd2l0Y2g7CitzdGF0aWMgdW5zaWduZWQgaW50CWxvX2RhYzsKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqbWZsZF9jb2RlYzsKKworc3RydWN0IG1mbGRfbWNfcHJpdmF0ZSB7CisJdm9pZCBfX2lvbWVtICppbnRfYmFzZTsKKwl1OCBpbnRlcnJ1cHRfc3RhdHVzOworfTsKKworc3RydWN0IHNuZF9zb2NfamFjayBtZmxkX2phY2s7CisKKy8qSGVhZHNldCBqYWNrIGRldGVjdGlvbiBEQVBNIHBpbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrX3BpbiBtZmxkX2phY2tfcGluc1tdID0geworCXsKKwkJLnBpbiA9ICJIZWFkcGhvbmVzIiwKKwkJLm1hc2sgPSBTTkRfSkFDS19IRUFEUEhPTkUsCisJfSwKKwl7CisJCS5waW4gPSAiQU1JQzEiLAorCQkubWFzayA9IFNORF9KQUNLX01JQ1JPUEhPTkUsCisJfSwKK307CisKKy8qIGphY2sgZGV0ZWN0aW9uIHZvbHRhZ2Ugem9uZXMgKi8KK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrX3pvbmUgbWZsZF96b25lc1tdID0geworCXtNRkxEX01WX1NUQVJULCBNRkxEX01WX0FNX0hTLCBTTkRfSkFDS19IRUFEUEhPTkV9LAorCXtNRkxEX01WX0FNX0hTLCBNRkxEX01WX0hTLCBTTkRfSkFDS19IRUFEU0VUfSwKK307CisKKy8qIHNvdW5kIGNhcmQgY29udHJvbHMgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpoZWFkc2V0X3N3aXRjaF90ZXh0W10gPSB7IkVhcnBpZWNlIiwgIkhlYWRzZXQifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmxvX3RleHRbXSA9IHsiVmlicmEiLCAiSGVhZHNldCIsICJJSEYiLCAiTm9uZSJ9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGhlYWRzZXRfZW51bSA9CisJU09DX0VOVU1fU0lOR0xFX0VYVCgyLCBoZWFkc2V0X3N3aXRjaF90ZXh0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NfZW51bSBsb19lbnVtID0KKwlTT0NfRU5VTV9TSU5HTEVfRVhUKDQsIGxvX3RleHQpOworCitzdGF0aWMgaW50IGhlYWRzZXRfZ2V0X3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGhzX3N3aXRjaDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZWFkc2V0X3NldF9zd2l0Y2goc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY2FyZC0+ZGFwbTsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9PSBoc19zd2l0Y2gpCisJCXJldHVybiAwOworCisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKKwkJcHJfZGVidWcoImhzX3NldCBIUyBwYXRoXG4iKTsKKwkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZXMiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJFUE9VVCIpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJoc19zZXQgRVAgcGF0aFxuIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lcyIpOworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRVBPVVQiKTsKKwl9CisKKwlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKKworCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7CisKKwloc19zd2l0Y2ggPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsb19lbmFibGVfb3V0X3BpbnMoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtKQoreworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJJSEZPVVRMIik7CisJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIklIRk9VVFIiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORU9VVEwiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORU9VVFIiKTsKKwlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiVklCMU9VVCIpOworCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJWSUIyT1VUIik7CisJaWYgKGhzX3N3aXRjaCkgeworCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lcyIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVQT1VUIik7CisJfSBlbHNlIHsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7CisJCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJFUE9VVCIpOworCX0KK30KKworc3RhdGljIGludCBsb19nZXRfc3dpdGNoKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gbG9fZGFjOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxvX3NldF9zd2l0Y2goc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHNuZF9rY29udHJvbF9jaGlwKGtjb250cm9sKTsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY2FyZC0+ZGFwbTsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9PSBsb19kYWMpCisJCXJldHVybiAwOworCisJc25kX3NvY19kYXBtX211dGV4X2xvY2soZGFwbSk7CisKKwkvKiB3ZSBkb250IHdhbnQgdG8gd29yayB3aXRoIGxhc3Qgc3RhdGUgb2YgbGluZW91dCBzbyBqdXN0IGVuYWJsZSBhbGwKKwkgKiBwaW5zIGFuZCB0aGVuIGRpc2FibGUgcGlucyBub3QgcmVxdWlyZWQKKwkgKi8KKwlsb19lbmFibGVfb3V0X3BpbnMoZGFwbSk7CisKKwlzd2l0Y2ggKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKSB7CisJY2FzZSAwOgorCQlwcl9kZWJ1Zygic2V0IHZpYnJhIHBhdGhcbiIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlZJQjFPVVQiKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJWSUIyT1VUIik7CisJCXNuZF9zb2NfdXBkYXRlX2JpdHMobWZsZF9jb2RlYywgU045NTAzMV9MT0NUTCwgMHg2NiwgMCk7CisJCWJyZWFrOworCisJY2FzZSAxOgorCQlwcl9kZWJ1Zygic2V0IGhzICBwYXRoXG4iKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRVBPVVQiKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtZmxkX2NvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDIyKTsKKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXByX2RlYnVnKCJzZXQgc3BrciBwYXRoXG4iKTsKKwkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJJSEZPVVRMIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSUhGT1VUUiIpOworCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1mbGRfY29kZWMsIFNOOTUwMzFfTE9DVEwsIDB4NjYsIDB4NDQpOworCQlicmVhazsKKworCWNhc2UgMzoKKwkJcHJfZGVidWcoInNldCBudWxsIHBhdGhcbiIpOworCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkxJTkVPVVRMIik7CisJCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORU9VVFIiKTsKKwkJc25kX3NvY191cGRhdGVfYml0cyhtZmxkX2NvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAweDY2KTsKKwkJYnJlYWs7CisJfQorCisJc25kX3NvY19kYXBtX3N5bmNfdW5sb2NrZWQoZGFwbSk7CisKKwlzbmRfc29jX2RhcG1fbXV0ZXhfdW5sb2NrKGRhcG0pOworCisJbG9fZGFjID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBtZmxkX3NuZF9jb250cm9sc1tdID0geworCVNPQ19FTlVNX0VYVCgiUGxheWJhY2sgU3dpdGNoIiwgaGVhZHNldF9lbnVtLAorCQkJaGVhZHNldF9nZXRfc3dpdGNoLCBoZWFkc2V0X3NldF9zd2l0Y2gpLAorCVNPQ19FTlVNX0VYVCgiTGluZW91dCBNdXgiLCBsb19lbnVtLAorCQkJbG9fZ2V0X3N3aXRjaCwgbG9fc2V0X3N3aXRjaCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgbWZsZF93aWRnZXRzW10gPSB7CisJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmVzIiwgTlVMTCksCisJU05EX1NPQ19EQVBNX01JQygiTWljIiwgTlVMTCksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBtZmxkX21hcFtdID0geworCXsiSGVhZHBob25lcyIsIE5VTEwsICJIUE9VVFIifSwKKwl7IkhlYWRwaG9uZXMiLCBOVUxMLCAiSFBPVVRMIn0sCisJeyJNaWMiLCBOVUxMLCAiQU1JQzEifSwKK307CisKK3N0YXRpYyB2b2lkIG1mbGRfamFja19jaGVjayh1bnNpZ25lZCBpbnQgaW50cl9zdGF0dXMpCit7CisJc3RydWN0IG1mbGRfamFja19kYXRhIGphY2tfZGF0YTsKKworCWlmICghbWZsZF9jb2RlYykKKwkJcmV0dXJuOworCisJamFja19kYXRhLm1mbGRfamFjayA9ICZtZmxkX2phY2s7CisJamFja19kYXRhLmludHJfaWQgPSBpbnRyX3N0YXR1czsKKworCXNuOTUwMzFfamFja19kZXRlY3Rpb24obWZsZF9jb2RlYywgJmphY2tfZGF0YSk7CisJLyogVE9ETzogYWRkIGFtZXJpY2FuIGhlYWRzZXQgZGV0ZWN0aW9uIHBvc3QgZ3Bpb2xpYiBzdXBwb3J0ICovCit9CisKK3N0YXRpYyBpbnQgbWZsZF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydW50aW1lKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZydW50aW1lLT5jYXJkLT5kYXBtOworCWludCByZXRfdmFsOworCisJLyogZGVmYXVsdCBpcyBlYXJwaWVjZSBwaW4sIHVzZXJzcGFjZSBzZXRzIGl0IGV4cGxjaXRseSAqLworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lcyIpOworCS8qIGRlZmF1bHQgaXMgbGluZW91dCBOQywgdXNlcnNwYWNlIHNldHMgaXQgZXhwbGNpdGx5ICovCisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMSU5FT1VUTCIpOworCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTElORU9VVFIiKTsKKwlsb19kYWMgPSAzOworCWhzX3N3aXRjaCA9IDA7CisJLyogd2UgZG9udCB1c2UgbGluZWluIGluIHRoaXMgc28gc2V0IHRvIE5DICovCisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMSU5FSU5MIik7CisJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMSU5FSU5SIik7CisKKwkvKiBIZWFkc2V0IGFuZCBidXR0b24gamFjayBkZXRlY3Rpb24gKi8KKwlyZXRfdmFsID0gc25kX3NvY19jYXJkX2phY2tfbmV3KHJ1bnRpbWUtPmNhcmQsCisJCQkiSW50ZWwoUikgTUlEIEF1ZGlvIEphY2siLCBTTkRfSkFDS19IRUFEU0VUIHwKKwkJCVNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEsICZtZmxkX2phY2ssCisJCQltZmxkX2phY2tfcGlucywgQVJSQVlfU0laRShtZmxkX2phY2tfcGlucykpOworCWlmIChyZXRfdmFsKSB7CisJCXByX2VycigiamFjayBjcmVhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKKwlyZXRfdmFsID0gc25kX3NvY19qYWNrX2FkZF96b25lcygmbWZsZF9qYWNrLAorCQkJQVJSQVlfU0laRShtZmxkX3pvbmVzKSwgbWZsZF96b25lcyk7CisJaWYgKHJldF92YWwpIHsKKwkJcHJfZXJyKCJhZGRpbmcgamFjayB6b25lcyBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0X3ZhbDsKKwl9CisKKwltZmxkX2NvZGVjID0gcnVudGltZS0+Y29kZWM7CisKKwkvKiB3ZSB3YW50IHRvIGNoZWNrIGlmIGFueXRoaW5nIGlzIGluc2VydGVkIGF0IGJvb3QsCisJICogc28gc2VuZCBhIGZha2UgZXZlbnQgdG8gY29kZWMgYW5kIGl0IHdpbGwgcmVhZCBhZGMKKwkgKiB0byBmaW5kIGlmIGFueXRoaW5nIGlzIHRoZXJlIG9yIG5vdCAqLworCW1mbGRfamFja19jaGVjayhNRkxEX0pBQ0tfSU5TRVJUKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIG1mbGRfbXNpY19kYWlsaW5rW10gPSB7CisJeworCQkubmFtZSA9ICJNZWRmaWVsZCBIZWFkc2V0IiwKKwkJLnN0cmVhbV9uYW1lID0gIkhlYWRzZXQiLAorCQkuY3B1X2RhaV9uYW1lID0gIkhlYWRzZXQtY3B1LWRhaSIsCisJCS5jb2RlY19kYWlfbmFtZSA9ICJTTjk1MDMxIEhlYWRzZXQiLAorCQkuY29kZWNfbmFtZSA9ICJzbjk1MDMxIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAic3N0LXBsYXRmb3JtIiwKKwkJLmluaXQgPSBtZmxkX2luaXQsCisJfSwKKwl7CisJCS5uYW1lID0gIk1lZGZpZWxkIFNwZWFrZXIiLAorCQkuc3RyZWFtX25hbWUgPSAiU3BlYWtlciIsCisJCS5jcHVfZGFpX25hbWUgPSAiU3BlYWtlci1jcHUtZGFpIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIlNOOTUwMzEgU3BlYWtlciIsCisJCS5jb2RlY19uYW1lID0gInNuOTUwMzEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJzc3QtcGxhdGZvcm0iLAorCQkuaW5pdCA9IE5VTEwsCisJfSwKKwl7CisJCS5uYW1lID0gIk1lZGZpZWxkIFZpYnJhIiwKKwkJLnN0cmVhbV9uYW1lID0gIlZpYnJhMSIsCisJCS5jcHVfZGFpX25hbWUgPSAiVmlicmExLWNwdS1kYWkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAiU045NTAzMSBWaWJyYTEiLAorCQkuY29kZWNfbmFtZSA9ICJzbjk1MDMxIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAic3N0LXBsYXRmb3JtIiwKKwkJLmluaXQgPSBOVUxMLAorCX0sCisJeworCQkubmFtZSA9ICJNZWRmaWVsZCBIYXB0aWNzIiwKKwkJLnN0cmVhbV9uYW1lID0gIlZpYnJhMiIsCisJCS5jcHVfZGFpX25hbWUgPSAiVmlicmEyLWNwdS1kYWkiLAorCQkuY29kZWNfZGFpX25hbWUgPSAiU045NTAzMSBWaWJyYTIiLAorCQkuY29kZWNfbmFtZSA9ICJzbjk1MDMxIiwKKwkJLnBsYXRmb3JtX25hbWUgPSAic3N0LXBsYXRmb3JtIiwKKwkJLmluaXQgPSBOVUxMLAorCX0sCisJeworCQkubmFtZSA9ICJNZWRmaWVsZCBDb21wcmVzcyIsCisJCS5zdHJlYW1fbmFtZSA9ICJTcGVha2VyIiwKKwkJLmNwdV9kYWlfbmFtZSA9ICJDb21wcmVzcy1jcHUtZGFpIiwKKwkJLmNvZGVjX2RhaV9uYW1lID0gIlNOOTUwMzEgU3BlYWtlciIsCisJCS5jb2RlY19uYW1lID0gInNuOTUwMzEiLAorCQkucGxhdGZvcm1fbmFtZSA9ICJzc3QtcGxhdGZvcm0iLAorCQkuaW5pdCA9IE5VTEwsCisJfSwKK307CisKKy8qIFNvQyBjYXJkICovCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBzbmRfc29jX2NhcmRfbWZsZCA9IHsKKwkubmFtZSA9ICJtZWRmaWVsZF9hdWRpbyIsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmRhaV9saW5rID0gbWZsZF9tc2ljX2RhaWxpbmssCisJLm51bV9saW5rcyA9IEFSUkFZX1NJWkUobWZsZF9tc2ljX2RhaWxpbmspLAorCisJLmNvbnRyb2xzID0gbWZsZF9zbmRfY29udHJvbHMsCisJLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUobWZsZF9zbmRfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSBtZmxkX3dpZGdldHMsCisJLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKG1mbGRfd2lkZ2V0cyksCisJLmRhcG1fcm91dGVzID0gbWZsZF9tYXAsCisJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUobWZsZF9tYXApLAorfTsKKworc3RhdGljIGlycXJldHVybl90IHNuZF9tZmxkX2phY2tfaW50cl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldikKK3sKKwlzdHJ1Y3QgbWZsZF9tY19wcml2YXRlICptY19wcml2YXRlID0gKHN0cnVjdCBtZmxkX21jX3ByaXZhdGUgKikgZGV2OworCisJbWVtY3B5X2Zyb21pbygmbWNfcHJpdmF0ZS0+aW50ZXJydXB0X3N0YXR1cywKKwkJCSgodm9pZCAqKShtY19wcml2YXRlLT5pbnRfYmFzZSkpLAorCQkJc2l6ZW9mKHU4KSk7CisJcmV0dXJuIElSUV9XQUtFX1RIUkVBRDsKK30KKworc3RhdGljIGlycXJldHVybl90IHNuZF9tZmxkX2phY2tfZGV0ZWN0aW9uKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1mbGRfbWNfcHJpdmF0ZSAqbWNfZHJ2X2N0eCA9IChzdHJ1Y3QgbWZsZF9tY19wcml2YXRlICopIGRhdGE7CisKKwltZmxkX2phY2tfY2hlY2sobWNfZHJ2X2N0eC0+aW50ZXJydXB0X3N0YXR1cyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgc25kX21mbGRfbWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0X3ZhbCA9IDAsIGlycTsKKwlzdHJ1Y3QgbWZsZF9tY19wcml2YXRlICptY19kcnZfY3R4OworCXN0cnVjdCByZXNvdXJjZSAqaXJxX21lbTsKKworCXByX2RlYnVnKCJzbmRfbWZsZF9tY19wcm9iZSBjYWxsZWRcbiIpOworCisJLyogcmV0cml2ZSB0aGUgaXJxIG51bWJlciAqLworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisKKwkvKiBhdWRpbyBpbnRlcnJ1cHQgYmFzZSBvZiBTUkFNIGxvY2F0aW9uIHdoZXJlCisJICogaW50ZXJydXB0cyBhcmUgc3RvcmVkIGJ5IFN5c3RlbSBGVyAqLworCW1jX2Rydl9jdHggPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptY19kcnZfY3R4KSwgR0ZQX0FUT01JQyk7CisJaWYgKCFtY19kcnZfY3R4KSB7CisJCXByX2VycigiYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpcnFfbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZSgKKwkJCQlwZGV2LCBJT1JFU09VUkNFX01FTSwgIklSUV9CQVNFIik7CisJaWYgKCFpcnFfbWVtKSB7CisJCXByX2Vycigibm8gbWVtIHJlc291cmNlIGdpdmVuXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCW1jX2Rydl9jdHgtPmludF9iYXNlID0gZGV2bV9pb3JlbWFwX25vY2FjaGUoJnBkZXYtPmRldiwgaXJxX21lbS0+c3RhcnQsCisJCQkJCQkgICAgcmVzb3VyY2Vfc2l6ZShpcnFfbWVtKSk7CisJaWYgKCFtY19kcnZfY3R4LT5pbnRfYmFzZSkgeworCQlwcl9lcnIoIk1hcHBpbmcgb2YgY2FjaGUgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIHJlZ2lzdGVyIGZvciBpbnRlcnJ1cHQgKi8KKwlyZXRfdmFsID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycSgmcGRldi0+ZGV2LCBpcnEsCisJCQlzbmRfbWZsZF9qYWNrX2ludHJfaGFuZGxlciwKKwkJCXNuZF9tZmxkX2phY2tfZGV0ZWN0aW9uLAorCQkJSVJRRl9TSEFSRUQsIHBkZXYtPmRldi5kcml2ZXItPm5hbWUsIG1jX2Rydl9jdHgpOworCWlmIChyZXRfdmFsKSB7CisJCXByX2VycigiY2Fubm90IHJlZ2lzdGVyIElSUVxuIik7CisJCXJldHVybiByZXRfdmFsOworCX0KKwkvKiByZWdpc3RlciB0aGUgc29jIGNhcmQgKi8KKwlzbmRfc29jX2NhcmRfbWZsZC5kZXYgPSAmcGRldi0+ZGV2OworCXJldF92YWwgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmc25kX3NvY19jYXJkX21mbGQpOworCWlmIChyZXRfdmFsKSB7CisJCXByX2RlYnVnKCJzbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbGVkICVkXG4iLCByZXRfdmFsKTsKKwkJcmV0dXJuIHJldF92YWw7CisJfQorCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1jX2Rydl9jdHgpOworCXByX2RlYnVnKCJzdWNjZXNzZnVsbHkgZXhpdGVkIHByb2JlXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kX21mbGRfbWNfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm1zaWNfYXVkaW8iLAorCX0sCisJLnByb2JlID0gc25kX21mbGRfbWNfcHJvYmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNuZF9tZmxkX21jX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQVNvQyBJbnRlbChSKSBNSUQgTWFjaGluZSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPiIpOworTU9EVUxFX0FVVEhPUigiSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTptc2ljLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYnJvYWR3ZWxsLmMgYi9zb3VuZC9zb2MvaW50ZWwvYnJvYWR3ZWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZjdkMDEuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL2Jyb2Fkd2VsbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qCi0gKiBJbnRlbCBCcm9hZHdlbGwgV2lsZGNhdHBvaW50IFNTVCBBdWRpbwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0KLSNpbmNsdWRlICJzc3QtZHNwLmgiCi0jaW5jbHVkZSAic3N0LWhhc3dlbGwtaXBjLmgiCi0KLSNpbmNsdWRlICIuLi9jb2RlY3MvcnQyODYuaCIKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2sgYnJvYWR3ZWxsX2hlYWRzZXQ7Ci0vKiBIZWFkc2V0IGphY2sgZGV0ZWN0aW9uIERBUE0gcGlucyAqLwotc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfcGluIGJyb2Fkd2VsbF9oZWFkc2V0X3BpbnNbXSA9IHsKLQl7Ci0JCS5waW4gPSAiTWljIEphY2siLAotCQkubWFzayA9IFNORF9KQUNLX01JQ1JPUEhPTkUsCi0JfSwKLQl7Ci0JCS5waW4gPSAiSGVhZHBob25lIEphY2siLAotCQkubWFzayA9IFNORF9KQUNLX0hFQURQSE9ORSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGJyb2Fkd2VsbF9jb250cm9sc1tdID0gewotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIlNwZWFrZXIiKSwKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkcGhvbmUgSmFjayIpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGJyb2Fkd2VsbF93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUgSmFjayIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJNaWMgSmFjayIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkRNSUMxIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiRE1JQzIiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTElORSgiTGluZSBKYWNrIiwgTlVMTCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBicm9hZHdlbGxfcnQyODZfbWFwW10gPSB7Ci0KLQkvKiBzcGVha2VyICovCi0JeyJTcGVha2VyIiwgTlVMTCwgIlNQT1IifSwKLQl7IlNwZWFrZXIiLCBOVUxMLCAiU1BPTCJ9LAotCi0JLyogSFAgamFjayBjb25uZWN0b3JzIC0gdW5rbm93biBpZiB3ZSBoYXZlIGphY2sgZGV0ZWNrICovCi0JeyJIZWFkcGhvbmUgSmFjayIsIE5VTEwsICJIUE8gUGluIn0sCi0KLQkvKiBvdGhlciBqYWNrcyAqLwotCXsiTUlDMSIsIE5VTEwsICJNaWMgSmFjayJ9LAotCXsiTElORTEiLCBOVUxMLCAiTGluZSBKYWNrIn0sCi0KLQkvKiBkaWdpdGFsIG1pY3MgKi8KLQl7IkRNSUMxIFBpbiIsIE5VTEwsICJETUlDMSJ9LAotCXsiRE1JQzIgUGluIiwgTlVMTCwgIkRNSUMyIn0sCi0KLQkvKiBDT0RFQyBCRSBjb25uZWN0aW9ucyAqLwotCXsiU1NQMCBDT0RFQyBJTiIsIE5VTEwsICJBSUYxIENhcHR1cmUifSwKLQl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAiU1NQMCBDT0RFQyBPVVQifSwKLX07Ci0KLXN0YXRpYyBpbnQgYnJvYWR3ZWxsX3J0Mjg2X2NvZGVjX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCWludCByZXQgPSAwOwotCXJldCA9IHNuZF9zb2NfamFja19uZXcoY29kZWMsICJIZWFkc2V0IiwKLQkJU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX0JUTl8wLCAmYnJvYWR3ZWxsX2hlYWRzZXQpOwotCi0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHNuZF9zb2NfamFja19hZGRfcGlucygmYnJvYWR3ZWxsX2hlYWRzZXQsCi0JCUFSUkFZX1NJWkUoYnJvYWR3ZWxsX2hlYWRzZXRfcGlucyksCi0JCWJyb2Fkd2VsbF9oZWFkc2V0X3BpbnMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlydDI4Nl9taWNfZGV0ZWN0KGNvZGVjLCAmYnJvYWR3ZWxsX2hlYWRzZXQpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgYnJvYWR3ZWxsX3NzcDBfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKLQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7Ci0Jc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOwotCi0JLyogVGhlIEFEU1Agd2lsbCBjb3ZlcnQgdGhlIEZFIHJhdGUgdG8gNDhrLCBzdGVyZW8gKi8KLQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSA0ODAwMDsKLQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDI7Ci0KLQkvKiBzZXQgU1NQMCB0byAxNiBiaXQgKi8KLQlzbmRfbWFza19zZXQoJnBhcmFtcy0+bWFza3NbU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCAtCi0JCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLXSwKLQkJCQkgICAgU05EUlZfUENNX0ZPUk1BVF9TMTZfTEUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJyb2Fkd2VsbF9ydDI4Nl9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0Jc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDI4Nl9TQ0xLX1NfUExMLCAyNDAwMDAwMCwKLQkJU05EX1NPQ19DTE9DS19JTik7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHN5c2NsayBjb25maWd1cmF0aW9uXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGJyb2Fkd2VsbF9ydDI4Nl9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IGJyb2Fkd2VsbF9ydDI4Nl9od19wYXJhbXMsCi19OwotCi1zdGF0aWMgaW50IGJyb2Fkd2VsbF9ydGRfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShydGQtPnBsYXRmb3JtLT5kZXYpOwotCXN0cnVjdCBzc3RfaHN3ICpicm9hZHdlbGwgPSBwZGF0YS0+ZHNwOwotCWludCByZXQ7Ci0KLQkvKiBTZXQgQURTUCBTU1AgcG9ydCBzZXR0aW5ncyAqLwotCXJldCA9IHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcoYnJvYWR3ZWxsLCBTU1RfSFNXX0RFVklDRV9TU1BfMCwKLQkJU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzI0X01IWiwKLQkJU1NUX0hTV19ERVZJQ0VfQ0xPQ0tfTUFTVEVSLCA5KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBzZXQgZGV2aWNlIGNvbmZpZ1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGJyb2Fkd2VsbCBkaWdpdGFsIGF1ZGlvIGludGVyZmFjZSBnbHVlIC0gY29ubmVjdHMgY29kZWMgPC0tPiBDUFUgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBicm9hZHdlbGxfcnQyODZfZGFpc1tdID0gewotCS8qIEZyb250IEVuZCBEQUkgbGlua3MgKi8KLQl7Ci0JCS5uYW1lID0gIlN5c3RlbSBQQ00iLAotCQkuc3RyZWFtX25hbWUgPSAiU3lzdGVtIFBsYXliYWNrL0NhcHR1cmUiLAotCQkuY3B1X2RhaV9uYW1lID0gIlN5c3RlbSBQaW4iLAotCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCi0JCS5keW5hbWljID0gMSwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5pbml0ID0gYnJvYWR3ZWxsX3J0ZF9pbml0LAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULCBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSAiT2ZmbG9hZDAiLAotCQkuc3RyZWFtX25hbWUgPSAiT2ZmbG9hZDAgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIk9mZmxvYWQwIFBpbiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSAiT2ZmbG9hZDEiLAotCQkuc3RyZWFtX25hbWUgPSAiT2ZmbG9hZDEgUGxheWJhY2siLAotCQkuY3B1X2RhaV9uYW1lID0gIk9mZmxvYWQxIFBpbiIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKLQkJLmR5bmFtaWMgPSAxLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLnRyaWdnZXIgPSB7U05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVCwgU05EX1NPQ19EUENNX1RSSUdHRVJfUE9TVH0sCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQl9LAotCXsKLQkJLm5hbWUgPSAiTG9vcGJhY2sgUENNIiwKLQkJLnN0cmVhbV9uYW1lID0gIkxvb3BiYWNrIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJMb29wYmFjayBQaW4iLAotCQkucGxhdGZvcm1fbmFtZSA9ICJoYXN3ZWxsLXBjbS1hdWRpbyIsCi0JCS5keW5hbWljID0gMCwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQl9LAotCS8qIEJhY2sgRW5kIERBSSBsaW5rcyAqLwotCXsKLQkJLyogU1NQMCAtIENvZGVjICovCi0JCS5uYW1lID0gIkNvZGVjIiwKLQkJLmJlX2lkID0gMCwKLQkJLmNwdV9kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkubm9fcGNtID0gMSwKLQkJLmNvZGVjX25hbWUgPSAiaTJjLUlOVDM0M0E6MDAiLAotCQkuY29kZWNfZGFpX25hbWUgPSAicnQyODYtYWlmMSIsCi0JCS5pbml0ID0gYnJvYWR3ZWxsX3J0Mjg2X2NvZGVjX2luaXQsCi0JCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAotCQkJU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmlnbm9yZV9wbWRvd25fdGltZSA9IDEsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBicm9hZHdlbGxfc3NwMF9maXh1cCwKLQkJLm9wcyA9ICZicm9hZHdlbGxfcnQyODZfb3BzLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCX0sCi19OwotCi0vKiBicm9hZHdlbGwgYXVkaW8gbWFjaGluZSBkcml2ZXIgZm9yIFdQVCArIFJUMjg2UyAqLwotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgYnJvYWR3ZWxsX3J0Mjg2ID0gewotCS5uYW1lID0gImJyb2Fkd2VsbC1ydDI4NiIsCi0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLmRhaV9saW5rID0gYnJvYWR3ZWxsX3J0Mjg2X2RhaXMsCi0JLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoYnJvYWR3ZWxsX3J0Mjg2X2RhaXMpLAotCS5jb250cm9scyA9IGJyb2Fkd2VsbF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShicm9hZHdlbGxfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSBicm9hZHdlbGxfd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYnJvYWR3ZWxsX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGJyb2Fkd2VsbF9ydDI4Nl9tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYnJvYWR3ZWxsX3J0Mjg2X21hcCksCi0JLmZ1bGx5X3JvdXRlZCA9IHRydWUsCi19OwotCi1zdGF0aWMgaW50IGJyb2Fkd2VsbF9hdWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWJyb2Fkd2VsbF9ydDI4Ni5kZXYgPSAmcGRldi0+ZGV2OwotCi0JcmV0dXJuIHNuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmYnJvYWR3ZWxsX3J0Mjg2KTsKLX0KLQotc3RhdGljIGludCBicm9hZHdlbGxfYXVkaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NhcmQoJmJyb2Fkd2VsbF9ydDI4Nik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGJyb2Fkd2VsbF9hdWRpbyA9IHsKLQkucHJvYmUgPSBicm9hZHdlbGxfYXVkaW9fcHJvYmUsCi0JLnJlbW92ZSA9IGJyb2Fkd2VsbF9hdWRpb19yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiYnJvYWR3ZWxsLWF1ZGlvIiwKLQl9LAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihicm9hZHdlbGxfYXVkaW8pCi0KLS8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgWGluZ2NoYW8gV2FuZyIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBTU1QgQXVkaW8gZm9yIFdQVC9Ccm9hZHdlbGwiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06YnJvYWR3ZWxsLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYnl0LW1heDk4MDkwLmMgYi9zb3VuZC9zb2MvaW50ZWwvYnl0LW1heDk4MDkwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MzJhZmUuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL2J5dC1tYXg5ODA5MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBJbnRlbCBCYXl0cmFpbCBTU1QgTUFYOTgwOTAgbWFjaGluZSBkcml2ZXIKLSAqIENvcHlyaWdodCAoYykgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+Ci0jaW5jbHVkZSAiLi4vY29kZWNzL21heDk4MDkwLmgiCi0KLXN0cnVjdCBieXRfbWF4OTgwOTBfcHJpdmF0ZSB7Ci0Jc3RydWN0IHNuZF9zb2NfamFjayBqYWNrOwotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IGJ5dF9tYXg5ODA5MF93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkludCBNaWMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fU1BLKCJFeHQgU3BrIiwgTlVMTCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfbWF4OTgwOTBfYXVkaW9fbWFwW10gPSB7Ci0JeyJJTjM0IiwgTlVMTCwgIkhlYWRzZXQgTWljIn0sCi0JeyJIZWFkc2V0IE1pYyIsIE5VTEwsICJNSUNCSUFTIn0sCi0JeyJETUlDTCIsIE5VTEwsICJJbnQgTWljIn0sCi0JeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBMIn0sCi0JeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBSIn0sCi0JeyJFeHQgU3BrIiwgTlVMTCwgIlNQS0wifSwKLQl7IkV4dCBTcGsiLCBOVUxMLCAiU1BLUiJ9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGJ5dF9tYXg5ODA5MF9jb250cm9sc1tdID0gewotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRwaG9uZSIpLAotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRzZXQgTWljIiksCi0JU09DX0RBUE1fUElOX1NXSVRDSCgiSW50IE1pYyIpLAotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkV4dCBTcGsiKSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrX3BpbiBoc19qYWNrX3BpbnNbXSA9IHsKLQl7Ci0JCS5waW4JPSAiSGVhZHBob25lIiwKLQkJLm1hc2sJPSBTTkRfSkFDS19IRUFEUEhPTkUsCi0JfSwKLQl7Ci0JCS5waW4JPSAiSGVhZHNldCBNaWMiLAotCQkubWFzawk9IFNORF9KQUNLX01JQ1JPUEhPTkUsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19qYWNrX2dwaW8gaHNfamFja19ncGlvc1tdID0gewotCXsKLQkJLm5hbWUJCT0gImhwLWdwaW8iLAotCQkuaWR4CQk9IDAsCi0JCS5yZXBvcnQJCT0gU05EX0pBQ0tfSEVBRFBIT05FIHwgU05EX0pBQ0tfTElORU9VVCwKLQkJLmRlYm91bmNlX3RpbWUJPSAyMDAsCi0JfSwKLQl7Ci0JCS5uYW1lCQk9ICJtaWMtZ3BpbyIsCi0JCS5pZHgJCT0gMSwKLQkJLmludmVydAkJPSAxLAotCQkucmVwb3J0CQk9IFNORF9KQUNLX01JQ1JPUEhPTkUsCi0JCS5kZWJvdW5jZV90aW1lCT0gMjAwLAotCX0sCi19OwotCi1zdGF0aWMgaW50IGJ5dF9tYXg5ODA5MF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydW50aW1lKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnVudGltZS0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHJ1bnRpbWUtPmNhcmQ7Ci0Jc3RydWN0IGJ5dF9tYXg5ODA5MF9wcml2YXRlICpkcnYgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7Ci0Jc3RydWN0IHNuZF9zb2NfamFjayAqamFjayA9ICZkcnYtPmphY2s7Ci0KLQljYXJkLT5kYXBtLmlkbGVfYmlhc19vZmYgPSB0cnVlOwotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2NsayhydW50aW1lLT5jb2RlY19kYWksCi0JCQkJICAgICBNOTgwOTBfUkVHX1NZU1RFTV9DTE9DSywKLQkJCQkgICAgIDI1MDAwMDAwLCBTTkRfU09DX0NMT0NLX0lOKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNhcmQtPmRldiwgIkNhbid0IHNldCBjb2RlYyBjbG9jayAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBFbmFibGUgamFjayBkZXRlY3Rpb24gKi8KLQlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHNldCIsCi0JCQkgICAgICAgU05EX0pBQ0tfTElORU9VVCB8IFNORF9KQUNLX0hFQURTRVQsIGphY2spOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2phY2tfYWRkX3BpbnMoamFjaywgQVJSQVlfU0laRShoc19qYWNrX3BpbnMpLAotCQkJCSAgICBoc19qYWNrX3BpbnMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gc25kX3NvY19qYWNrX2FkZF9ncGlvZHMoY2FyZC0+ZGV2LT5wYXJlbnQsIGphY2ssCi0JCQkJICAgICAgIEFSUkFZX1NJWkUoaHNfamFja19ncGlvcyksCi0JCQkJICAgICAgIGhzX2phY2tfZ3Bpb3MpOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgYnl0X21heDk4MDkwX2RhaXNbXSA9IHsKLQl7Ci0JCS5uYW1lID0gIkJheXRyYWlsIEF1ZGlvIiwKLQkJLnN0cmVhbV9uYW1lID0gIkF1ZGlvIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAotCQkuY29kZWNfZGFpX25hbWUgPSAiSGlGaSIsCi0JCS5jb2RlY19uYW1lID0gImkyYy0xOTNDOTg5MDowMCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gImJheXRyYWlsLXBjbS1hdWRpbyIsCi0JCS5pbml0ID0gYnl0X21heDk4MDkwX2luaXQsCi0JCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAotCQkJICAgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUywKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgYnl0X21heDk4MDkwX2NhcmQgPSB7Ci0JLm5hbWUgPSAiYnl0LW1heDk4MDkwIiwKLQkuZGFpX2xpbmsgPSBieXRfbWF4OTgwOTBfZGFpcywKLQkubnVtX2xpbmtzID0gQVJSQVlfU0laRShieXRfbWF4OTgwOTBfZGFpcyksCi0JLmRhcG1fd2lkZ2V0cyA9IGJ5dF9tYXg5ODA5MF93aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRShieXRfbWF4OTgwOTBfd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gYnl0X21heDk4MDkwX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShieXRfbWF4OTgwOTBfYXVkaW9fbWFwKSwKLQkuY29udHJvbHMgPSBieXRfbWF4OTgwOTBfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoYnl0X21heDk4MDkwX2NvbnRyb2xzKSwKLQkuZnVsbHlfcm91dGVkID0gdHJ1ZSwKLX07Ci0KLXN0YXRpYyBpbnQgYnl0X21heDk4MDkwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0JaW50IHJldF92YWwgPSAwOwotCXN0cnVjdCBieXRfbWF4OTgwOTBfcHJpdmF0ZSAqcHJpdjsKLQotCXByaXYgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcml2KSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFwcml2KSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JYnl0X21heDk4MDkwX2NhcmQuZGV2ID0gJnBkZXYtPmRldjsKLQlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJmJ5dF9tYXg5ODA5MF9jYXJkLCBwcml2KTsKLQlyZXRfdmFsID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJmJ5dF9tYXg5ODA5MF9jYXJkKTsKLQlpZiAocmV0X3ZhbCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkic25kX3NvY19yZWdpc3Rlcl9jYXJkIGZhaWxlZCAlZFxuIiwgcmV0X3ZhbCk7Ci0JCXJldHVybiByZXRfdmFsOwotCX0KLQotCXJldHVybiByZXRfdmFsOwotfQotCi1zdGF0aWMgaW50IGJ5dF9tYXg5ODA5MF9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGJ5dF9tYXg5ODA5MF9wcml2YXRlICpwcml2ID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKGNhcmQpOwotCi0Jc25kX3NvY19qYWNrX2ZyZWVfZ3Bpb3MoJnByaXYtPmphY2ssIEFSUkFZX1NJWkUoaHNfamFja19ncGlvcyksCi0JCQkJaHNfamFja19ncGlvcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYnl0X21heDk4MDkwX2RyaXZlciA9IHsKLQkucHJvYmUgPSBieXRfbWF4OTgwOTBfcHJvYmUsCi0JLnJlbW92ZSA9IGJ5dF9tYXg5ODA5MF9yZW1vdmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiYnl0LW1heDk4MDkwIiwKLQkJLnBtID0gJnNuZF9zb2NfcG1fb3BzLAotCX0sCi19OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihieXRfbWF4OTgwOTBfZHJpdmVyKQotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgSW50ZWwoUikgQmF5dHJhaWwgTWFjaGluZSBkcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIk9tYWlyIE1kIEFiZHVsbGFoLCBKYXJra28gTmlrdWxhIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJ5dC1tYXg5ODA5MCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2J5dC1ydDU2NDAuYyBiL3NvdW5kL3NvYy9pbnRlbC9ieXQtcnQ1NjQwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NGVhYWQuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL2J5dC1ydDU2NDAuYworKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKgotICogSW50ZWwgQmF5dHJhaWwgU1NUIFJUNTY0MCBtYWNoaW5lIGRyaXZlcgotICogQ29weXJpZ2h0IChjKSAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1pLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+Ci0jaW5jbHVkZSAiLi4vY29kZWNzL3J0NTY0MC5oIgotCi0jaW5jbHVkZSAic3N0LWRzcC5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYnl0X3J0NTY0MF93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkludGVybmFsIE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9TUEsoIlNwZWFrZXIiLCBOVUxMKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfYXVkaW9fbWFwW10gPSB7Ci0JeyJIZWFkc2V0IE1pYyIsIE5VTEwsICJNSUNCSUFTMSJ9LAotCXsiSU4yUCIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAotCXsiSGVhZHBob25lIiwgTlVMTCwgIkhQT0wifSwKLQl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUE9SIn0sCi0JeyJTcGVha2VyIiwgTlVMTCwgIlNQT0xQIn0sCi0JeyJTcGVha2VyIiwgTlVMTCwgIlNQT0xOIn0sCi0JeyJTcGVha2VyIiwgTlVMTCwgIlNQT1JQIn0sCi0JeyJTcGVha2VyIiwgTlVMTCwgIlNQT1JOIn0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBieXRfcnQ1NjQwX2ludG1pY19kbWljMV9tYXBbXSA9IHsKLQl7IkRNSUMxIiwgTlVMTCwgIkludGVybmFsIE1pYyJ9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X3J0NTY0MF9pbnRtaWNfZG1pYzJfbWFwW10gPSB7Ci0JeyJETUlDMiIsIE5VTEwsICJJbnRlcm5hbCBNaWMifSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGJ5dF9ydDU2NDBfaW50bWljX2luMV9tYXBbXSA9IHsKLQl7IkludGVybmFsIE1pYyIsIE5VTEwsICJNSUNCSUFTMSJ9LAotCXsiSU4xUCIsIE5VTEwsICJJbnRlcm5hbCBNaWMifSwKLX07Ci0KLWVudW0gewotCUJZVF9SVDU2NDBfRE1JQzFfTUFQLAotCUJZVF9SVDU2NDBfRE1JQzJfTUFQLAotCUJZVF9SVDU2NDBfSU4xX01BUCwKLX07Ci0KLSNkZWZpbmUgQllUX1JUNTY0MF9NQVAocXVpcmspCSgocXVpcmspICYgMHhmZikKLSNkZWZpbmUgQllUX1JUNTY0MF9ETUlDX0VOCUJJVCgxNikKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgYnl0X3J0NTY0MF9xdWlyayA9IEJZVF9SVDU2NDBfRE1JQzFfTUFQIHwKLQkJCQkJQllUX1JUNTY0MF9ETUlDX0VOOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgYnl0X3J0NTY0MF9jb250cm9sc1tdID0gewotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRwaG9uZSIpLAotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRzZXQgTWljIiksCi0JU09DX0RBUE1fUElOX1NXSVRDSCgiSW50ZXJuYWwgTWljIiksCi0JU09DX0RBUE1fUElOX1NXSVRDSCgiU3BlYWtlciIpLAotfTsKLQotc3RhdGljIGludCBieXRfcnQ1NjQwX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY0MF9TQ0xLX1NfUExMMSwKLQkJCQkgICAgIHBhcmFtc19yYXRlKHBhcmFtcykgKiAyNTYsCi0JCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGNvZGVjX2RhaS0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIGNsb2NrICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfcGxsKGNvZGVjX2RhaSwgMCwgUlQ1NjQwX1BMTDFfU19CQ0xLMSwKLQkJCQkgIHBhcmFtc19yYXRlKHBhcmFtcykgKiA2NCwKLQkJCQkgIHBhcmFtc19yYXRlKHBhcmFtcykgKiAyNTYpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY29kZWNfZGFpLT5kZXYsICJjYW4ndCBzZXQgY29kZWMgcGxsOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYnl0X3J0NTY0MF9xdWlya19jYihjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCAqaWQpCi17Ci0JYnl0X3J0NTY0MF9xdWlyayA9ICh1bnNpZ25lZCBsb25nKWlkLT5kcml2ZXJfZGF0YTsKLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkIGJ5dF9ydDU2NDBfcXVpcmtfdGFibGVbXSA9IHsKLQl7Ci0JCS5jYWxsYmFjayA9IGJ5dF9ydDU2NDBfcXVpcmtfY2IsCi0JCS5tYXRjaGVzID0gewotCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQVNVU1RlSyBDT01QVVRFUiBJTkMuIiksCi0JCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlQxMDBUQSIpLAotCQl9LAotCQkuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZyAqKUJZVF9SVDU2NDBfSU4xX01BUCwKLQl9LAotCXsKLQkJLmNhbGxiYWNrID0gYnl0X3J0NTY0MF9xdWlya19jYiwKLQkJLm1hdGNoZXMgPSB7Ci0JCQlETUlfTUFUQ0goRE1JX1NZU19WRU5ET1IsICJEZWxsSW5jLiIpLAotCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJWZW51ZSA4IFBybyA1ODMwIiksCi0JCX0sCi0JCS5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nICopKEJZVF9SVDU2NDBfRE1JQzJfTUFQIHwKLQkJCQkJCSBCWVRfUlQ1NjQwX0RNSUNfRU4pLAotCX0sCi0Je30KLX07Ci0KLXN0YXRpYyBpbnQgYnl0X3J0NTY0MF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydW50aW1lKQotewotCWludCByZXQ7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnVudGltZS0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9IHJ1bnRpbWUtPmNhcmQ7Ci0JY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSAqY3VzdG9tX21hcDsKLQlpbnQgbnVtX3JvdXRlczsKLQotCWNhcmQtPmRhcG0uaWRsZV9iaWFzX29mZiA9IHRydWU7Ci0KLQlyZXQgPSBzbmRfc29jX2FkZF9jYXJkX2NvbnRyb2xzKGNhcmQsIGJ5dF9ydDU2NDBfY29udHJvbHMsCi0JCQkJCUFSUkFZX1NJWkUoYnl0X3J0NTY0MF9jb250cm9scykpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsICJ1bmFibGUgdG8gYWRkIGNhcmQgY29udHJvbHNcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWRtaV9jaGVja19zeXN0ZW0oYnl0X3J0NTY0MF9xdWlya190YWJsZSk7Ci0Jc3dpdGNoIChCWVRfUlQ1NjQwX01BUChieXRfcnQ1NjQwX3F1aXJrKSkgewotCWNhc2UgQllUX1JUNTY0MF9JTjFfTUFQOgotCQljdXN0b21fbWFwID0gYnl0X3J0NTY0MF9pbnRtaWNfaW4xX21hcDsKLQkJbnVtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYnl0X3J0NTY0MF9pbnRtaWNfaW4xX21hcCk7Ci0JCWJyZWFrOwotCWNhc2UgQllUX1JUNTY0MF9ETUlDMl9NQVA6Ci0JCWN1c3RvbV9tYXAgPSBieXRfcnQ1NjQwX2ludG1pY19kbWljMl9tYXA7Ci0JCW51bV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfaW50bWljX2RtaWMyX21hcCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWN1c3RvbV9tYXAgPSBieXRfcnQ1NjQwX2ludG1pY19kbWljMV9tYXA7Ci0JCW51bV9yb3V0ZXMgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfaW50bWljX2RtaWMxX21hcCk7Ci0JfQotCi0JcmV0ID0gc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNhcmQtPmRhcG0sIGN1c3RvbV9tYXAsIG51bV9yb3V0ZXMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoYnl0X3J0NTY0MF9xdWlyayAmIEJZVF9SVDU2NDBfRE1JQ19FTikgewotCQlyZXQgPSBydDU2NDBfZG1pY19lbmFibGUoY29kZWMsIDAsIDApOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoJmNhcmQtPmRhcG0sICJIZWFkcGhvbmUiKTsKLQlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoJmNhcmQtPmRhcG0sICJTcGVha2VyIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGJ5dF9ydDU2NDBfb3BzID0gewotCS5od19wYXJhbXMgPSBieXRfcnQ1NjQwX2h3X3BhcmFtcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBieXRfcnQ1NjQwX2RhaXNbXSA9IHsKLQl7Ci0JCS5uYW1lID0gIkJheXRyYWlsIEF1ZGlvIiwKLQkJLnN0cmVhbV9uYW1lID0gIkF1ZGlvIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAotCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1NjQwLWFpZjEiLAotCQkuY29kZWNfbmFtZSA9ICJpMmMtMTBFQzU2NDA6MDAiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAotCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCSAgIFNORF9TT0NfREFJRk1UX0NCU19DRlMsCi0JCS5pbml0ID0gYnl0X3J0NTY0MF9pbml0LAotCQkub3BzID0gJmJ5dF9ydDU2NDBfb3BzLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBieXRfcnQ1NjQwX2NhcmQgPSB7Ci0JLm5hbWUgPSAiYnl0LXJ0NTY0MCIsCi0JLmRhaV9saW5rID0gYnl0X3J0NTY0MF9kYWlzLAotCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGJ5dF9ydDU2NDBfZGFpcyksCi0JLmRhcG1fd2lkZ2V0cyA9IGJ5dF9ydDU2NDBfd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYnl0X3J0NTY0MF93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBieXRfcnQ1NjQwX2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShieXRfcnQ1NjQwX2F1ZGlvX21hcCksCi0JLmZ1bGx5X3JvdXRlZCA9IHRydWUsCi19OwotCi1zdGF0aWMgaW50IGJ5dF9ydDU2NDBfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gJmJ5dF9ydDU2NDBfY2FyZDsKLQotCWNhcmQtPmRldiA9ICZwZGV2LT5kZXY7Ci0JcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsIGNhcmQpOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBieXRfcnQ1NjQwX2F1ZGlvID0gewotCS5wcm9iZSA9IGJ5dF9ydDU2NDBfcHJvYmUsCi0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiYnl0LXJ0NTY0MCIsCi0JCS5wbSA9ICZzbmRfc29jX3BtX29wcywKLQl9LAotfTsKLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYnl0X3J0NTY0MF9hdWRpbykKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEludGVsKFIpIEJheXRyYWlsIE1hY2hpbmUgZHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJPbWFpciBNZCBBYmR1bGxhaCwgSmFya2tvIE5pa3VsYSIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpieXQtcnQ1NjQwIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvYnl0Y3JfZHBjbV9ydDU2NDAuYyBiL3NvdW5kL3NvYy9pbnRlbC9ieXRjcl9kcGNtX3J0NTY0MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTMwODYyLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9ieXRjcl9kcGNtX3J0NTY0MC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qCi0gKiAgYnl0X2NyX2RwY21fcnQ1NjQwLmMgLSBBU29jIE1hY2hpbmUgZHJpdmVyIGZvciBJbnRlbCBCeXQgQ1IgcGxhdGZvcm0KLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDE0IEludGVsIENvcnAKLSAqICBBdXRob3I6IFN1YmhyYW5zdSBTLiBQcnVzdHkgPHN1YmhyYW5zdS5zLnBydXN0eUBpbnRlbC5jb20+Ci0gKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgIi4uL2NvZGVjcy9ydDU2NDAuaCIKLSNpbmNsdWRlICJzc3QtYXRvbS1jb250cm9scy5oIgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgYnl0X2RhcG1fd2lkZ2V0c1tdID0gewotCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJJbnQgTWljIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX1NQSygiRXh0IFNwayIsIE5VTEwpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgYnl0X2F1ZGlvX21hcFtdID0gewotCXsiSU4yUCIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAotCXsiSU4yTiIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAotCXsiSGVhZHNldCBNaWMiLCBOVUxMLCAiTUlDQklBUzEifSwKLQl7IklOMVAiLCBOVUxMLCAiTUlDQklBUzEifSwKLQl7IkxETzIiLCBOVUxMLCAiSW50IE1pYyJ9LAotCXsiSGVhZHBob25lIiwgTlVMTCwgIkhQT0wifSwKLQl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUE9SIn0sCi0JeyJFeHQgU3BrIiwgTlVMTCwgIlNQT0xQIn0sCi0JeyJFeHQgU3BrIiwgTlVMTCwgIlNQT0xOIn0sCi0JeyJFeHQgU3BrIiwgTlVMTCwgIlNQT1JQIn0sCi0JeyJFeHQgU3BrIiwgTlVMTCwgIlNQT1JOIn0sCi0KLQl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAic3NwMiBUeCJ9LAotCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQwIn0sCi0JeyJzc3AyIFR4IiwgTlVMTCwgImNvZGVjX291dDEifSwKLQl7ImNvZGVjX2luMCIsIE5VTEwsICJzc3AyIFJ4In0sCi0JeyJjb2RlY19pbjEiLCBOVUxMLCAic3NwMiBSeCJ9LAotCXsic3NwMiBSeCIsIE5VTEwsICJBSUYxIENhcHR1cmUifSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBieXRfbWNfY29udHJvbHNbXSA9IHsKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkcGhvbmUiKSwKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkc2V0IE1pYyIpLAotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkludCBNaWMiKSwKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJFeHQgU3BrIiksCi19OwotCi1zdGF0aWMgaW50IGJ5dF9haWYxX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0JaW50IHJldDsKLQotCXNuZF9zb2NfZGFpX3NldF9iY2xrX3JhdGlvKGNvZGVjX2RhaSwgNTApOwotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY0MF9TQ0xLX1NfUExMMSwKLQkJCQkgICAgIHBhcmFtc19yYXRlKHBhcmFtcykgKiA1MTIsCi0JCQkJICAgICBTTkRfU09DX0NMT0NLX0lOKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIGNsb2NrICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCAwLCBSVDU2NDBfUExMMV9TX0JDTEsxLAotCQkJCSAgcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUwLAotCQkJCSAgcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUxMik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBwbGw6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfcGNtX3N0cmVhbSBieXRfZGFpX3BhcmFtcyA9IHsKLQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFLAotCS5yYXRlX21pbiA9IDQ4MDAwLAotCS5yYXRlX21heCA9IDQ4MDAwLAotCS5jaGFubmVsc19taW4gPSAyLAotCS5jaGFubmVsc19tYXggPSAyLAotfTsKLQotc3RhdGljIGludCBieXRfY29kZWNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKLQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOwotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKLQotCS8qIFRoZSBEU1Agd2lsbCBjb3ZlcnQgdGhlIEZFIHJhdGUgdG8gNDhrLCBzdGVyZW8sIDI0Yml0cyAqLwotCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IDQ4MDAwOwotCWNoYW5uZWxzLT5taW4gPSBjaGFubmVscy0+bWF4ID0gMjsKLQotCS8qIHNldCBTU1AyIHRvIDI0LWJpdCAqLwotCXNuZF9tYXNrX3NldCgmcGFyYW1zLT5tYXNrc1tTTkRSVl9QQ01fSFdfUEFSQU1fRk9STUFUIC0KLQkJCQkgICAgU05EUlZfUENNX0hXX1BBUkFNX0ZJUlNUX01BU0tdLAotCQkJCSAgICBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgcmF0ZXNfNDgwMDBbXSA9IHsKLQk0ODAwMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3BjbV9od19jb25zdHJhaW50X2xpc3QgY29uc3RyYWludHNfNDgwMDAgPSB7Ci0JLmNvdW50ID0gQVJSQVlfU0laRShyYXRlc180ODAwMCksCi0JLmxpc3QgID0gcmF0ZXNfNDgwMDAsCi19OwotCi1zdGF0aWMgaW50IGJ5dF9haWYxX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0JcmV0dXJuIHNuZF9wY21faHdfY29uc3RyYWludF9saXN0KHN1YnN0cmVhbS0+cnVudGltZSwgMCwKLQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFLAotCQkJJmNvbnN0cmFpbnRzXzQ4MDAwKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBieXRfYWlmMV9vcHMgPSB7Ci0JLnN0YXJ0dXAgPSBieXRfYWlmMV9zdGFydHVwLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyBieXRfYmVfc3NwMl9vcHMgPSB7Ci0JLmh3X3BhcmFtcyA9IGJ5dF9haWYxX2h3X3BhcmFtcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBieXRfZGFpbGlua1tdID0gewotCVtNRVJSX0RQQ01fQVVESU9dID0gewotCQkubmFtZSA9ICJCYXl0cmFpbCBBdWRpbyBQb3J0IiwKLQkJLnN0cmVhbV9uYW1lID0gIkJheXRyYWlsIEF1ZGlvIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJtZWRpYS1jcHUtZGFpIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInNuZC1zb2MtZHVtbXktZGFpIiwKLQkJLmNvZGVjX25hbWUgPSAic25kLXNvYy1kdW1teSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gInNzdC1tZmxkLXBsYXRmb3JtIiwKLQkJLmlnbm9yZV9zdXNwZW5kID0gMSwKLQkJLmR5bmFtaWMgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkub3BzID0gJmJ5dF9haWYxX29wcywKLQl9LAotCVtNRVJSX0RQQ01fQ09NUFJdID0gewotCQkubmFtZSA9ICJCYXl0cmFpbCBDb21wcmVzc2VkIFBvcnQiLAotCQkuc3RyZWFtX25hbWUgPSAiQmF5dHJhaWwgQ29tcHJlc3MiLAotCQkuY3B1X2RhaV9uYW1lID0gImNvbXByZXNzLWNwdS1kYWkiLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAic3N0LW1mbGQtcGxhdGZvcm0iLAotCX0sCi0JCS8qIGJhY2sgZW5kcyAqLwotCXsKLQkJLm5hbWUgPSAiU1NQMi1Db2RlYyIsCi0JCS5iZV9pZCA9IDEsCi0JCS5jcHVfZGFpX25hbWUgPSAic3NwMi1wb3J0IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAic3N0LW1mbGQtcGxhdGZvcm0iLAotCQkubm9fcGNtID0gMSwKLQkJLmNvZGVjX2RhaV9uYW1lID0gInJ0NTY0MC1haWYxIiwKLQkJLmNvZGVjX25hbWUgPSAiaTJjLTEwRUM1NjQwOjAwIiwKLQkJLmRhaV9mbXQgPSBTTkRfU09DX0RBSUZNVF9JMlMgfCBTTkRfU09DX0RBSUZNVF9OQl9ORgotCQkJCQkJfCBTTkRfU09DX0RBSUZNVF9DQlNfQ0ZTLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gYnl0X2NvZGVjX2ZpeHVwLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCQkub3BzID0gJmJ5dF9iZV9zc3AyX29wcywKLQl9LAotfTsKLQotLyogU29DIGNhcmQgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9zb2NfY2FyZF9ieXQgPSB7Ci0JLm5hbWUgPSAiYmF5dHJhaWxjcmF1ZGlvIiwKLQkuZGFpX2xpbmsgPSBieXRfZGFpbGluaywKLQkubnVtX2xpbmtzID0gQVJSQVlfU0laRShieXRfZGFpbGluayksCi0JLmRhcG1fd2lkZ2V0cyA9IGJ5dF9kYXBtX3dpZGdldHMsCi0JLm51bV9kYXBtX3dpZGdldHMgPSBBUlJBWV9TSVpFKGJ5dF9kYXBtX3dpZGdldHMpLAotCS5kYXBtX3JvdXRlcyA9IGJ5dF9hdWRpb19tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYnl0X2F1ZGlvX21hcCksCi0JLmNvbnRyb2xzID0gYnl0X21jX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGJ5dF9tY19jb250cm9scyksCi19OwotCi1zdGF0aWMgaW50IHNuZF9ieXRfbWNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0X3ZhbCA9IDA7Ci0KLQkvKiByZWdpc3RlciB0aGUgc29jIGNhcmQgKi8KLQlzbmRfc29jX2NhcmRfYnl0LmRldiA9ICZwZGV2LT5kZXY7Ci0KLQlyZXRfdmFsID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJnNuZF9zb2NfY2FyZF9ieXQpOwotCWlmIChyZXRfdmFsKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgImRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkIGZhaWxlZCAlZFxuIiwgcmV0X3ZhbCk7Ci0JCXJldHVybiByZXRfdmFsOwotCX0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmc25kX3NvY19jYXJkX2J5dCk7Ci0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuZF9ieXRfbWNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImJ5dHQxMDBfcnQ1NjQwIiwKLQkJLnBtID0gJnNuZF9zb2NfcG1fb3BzLAotCX0sCi0JLnByb2JlID0gc25kX2J5dF9tY19wcm9iZSwKLX07Ci0KLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc25kX2J5dF9tY19kcml2ZXIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkFTb0MgSW50ZWwoUikgQmF5dHJhaWwgQ1IgTWFjaGluZSBkcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIlN1YmhyYW5zdSBTLiBQcnVzdHkgPHN1YmhyYW5zdS5zLnBydXN0eUBpbnRlbC5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJ5dHQxMDBfcnQ1NjQwIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvY2h0X2Jzd19ydDU2NDUuYyBiL3NvdW5kL3NvYy9pbnRlbC9jaHRfYnN3X3J0NTY0NS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDI5NjE3Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9jaHRfYnN3X3J0NTY0NS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8qCi0gKiAgY2h0LWJzdy1ydDU2NDUuYyAtIEFTb2MgTWFjaGluZSBkcml2ZXIgZm9yIEludGVsIENoZXJyeXZpZXctYmFzZWQgcGxhdGZvcm1zCi0gKiAgICAgICAgICAgICAgICAgICAgIENoZXJyeXRyYWlsIGFuZCBCcmFzd2VsbCwgd2l0aCBSVDU2NDUgY29kZWMuCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxNSBJbnRlbCBDb3JwCi0gKiAgQXV0aG9yOiBGYW5nLCBZYW5nIEEgPHlhbmcuYS5mYW5nQGludGVsLmNvbT4KLSAqCSAgICAgICAgTixIYXJzaGFwcml5YSA8aGFyc2hhcHJpeWEubkBpbnRlbC5jb20+Ci0gKiAgVGhpcyBmaWxlIGlzIG1vZGlmaWVkIGZyb20gY2h0X2Jzd19ydDU2NzIuYwotICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+Ci0jaW5jbHVkZSAiLi4vY29kZWNzL3J0NTY0NS5oIgotI2luY2x1ZGUgInNzdC1hdG9tLWNvbnRyb2xzLmgiCi0KLSNkZWZpbmUgQ0hUX1BMQVRfQ0xLXzNfSFoJMTkyMDAwMDAKLSNkZWZpbmUgQ0hUX0NPREVDX0RBSQkicnQ1NjQ1LWFpZjEiCi0KLXN0cnVjdCBjaHRfbWNfcHJpdmF0ZSB7Ci0Jc3RydWN0IHNuZF9zb2NfamFjayBocF9qYWNrOwotCXN0cnVjdCBzbmRfc29jX2phY2sgbWljX2phY2s7Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzbmRfc29jX2RhaSAqY2h0X2dldF9jb2RlY19kYWkoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fcnRkOyBpKyspIHsKLQkJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZDsKLQotCQlydGQgPSBjYXJkLT5ydGQgKyBpOwotCQlpZiAoIXN0cm5jbXAocnRkLT5jb2RlY19kYWktPm5hbWUsIENIVF9DT0RFQ19EQUksCi0JCQkgICAgIHN0cmxlbihDSFRfQ09ERUNfREFJKSkpCi0JCQlyZXR1cm4gcnRkLT5jb2RlY19kYWk7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgaW50IHBsYXRmb3JtX2Nsb2NrX2NvbnRyb2woc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncsCi0JCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmssIGludCAgZXZlbnQpCi17Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gZGFwbS0+Y2FyZDsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaTsKLQlpbnQgcmV0OwotCi0JY29kZWNfZGFpID0gY2h0X2dldF9jb2RlY19kYWkoY2FyZCk7Ci0JaWYgKCFjb2RlY19kYWkpIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsICJDb2RlYyBkYWkgbm90IGZvdW5kOyBVbmFibGUgdG8gc2V0IHBsYXRmb3JtIGNsb2NrXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKCFTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBTZXQgY29kZWMgc3lzY2xrIHNvdXJjZSB0byBpdHMgaW50ZXJuYWwgY2xvY2sgYmVjYXVzZSBjb2RlYyBQTEwgd2lsbAotCSAqIGJlIG9mZiB3aGVuIGlkbGUgYW5kIE1DTEsgd2lsbCBhbHNvIGJlIG9mZiBieSBBQ1BJIHdoZW4gY29kZWMgaXMKLQkgKiBydW50aW1lIHN1c3BlbmRlZC4gQ29kZWMgbmVlZHMgY2xvY2sgZm9yIGphY2sgZGV0ZWN0aW9uIGFuZCBidXR0b24KLQkgKiBwcmVzcy4KLQkgKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgUlQ1NjQ1X1NDTEtfU19SQ0NMSywKLQkJCTAsIFNORF9TT0NfQ0xPQ0tfSU4pOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoY2FyZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHN5c2NsazogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBjaHRfZGFwbV93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmUiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJIZWFkc2V0IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9NSUMoIkludCBNaWMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fU1BLKCJFeHQgU3BrIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX1NVUFBMWSgiUGxhdGZvcm0gQ2xvY2siLCBTTkRfU09DX05PUE0sIDAsIDAsCi0JCQlwbGF0Zm9ybV9jbG9ja19jb250cm9sLCBTTkRfU09DX0RBUE1fUE9TVF9QTUQpLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgY2h0X2F1ZGlvX21hcFtdID0gewotCXsiSU4xUCIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAotCXsiSU4xTiIsIE5VTEwsICJIZWFkc2V0IE1pYyJ9LAotCXsiRE1JQyBMMSIsIE5VTEwsICJJbnQgTWljIn0sCi0JeyJETUlDIFIxIiwgTlVMTCwgIkludCBNaWMifSwKLQl7IkhlYWRwaG9uZSIsIE5VTEwsICJIUE9MIn0sCi0JeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBPUiJ9LAotCXsiRXh0IFNwayIsIE5VTEwsICJTUE9MIn0sCi0JeyJFeHQgU3BrIiwgTlVMTCwgIlNQT1IifSwKLQl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAic3NwMiBUeCJ9LAotCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQwIn0sCi0JeyJzc3AyIFR4IiwgTlVMTCwgImNvZGVjX291dDEifSwKLQl7ImNvZGVjX2luMCIsIE5VTEwsICJzc3AyIFJ4IiB9LAotCXsiY29kZWNfaW4xIiwgTlVMTCwgInNzcDIgUngiIH0sCi0JeyJzc3AyIFJ4IiwgTlVMTCwgIkFJRjEgQ2FwdHVyZSJ9LAotCXsiSGVhZHBob25lIiwgTlVMTCwgIlBsYXRmb3JtIENsb2NrIn0sCi0JeyJIZWFkc2V0IE1pYyIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAotCXsiSW50IE1pYyIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAotCXsiRXh0IFNwayIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGNodF9tY19jb250cm9sc1tdID0gewotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRwaG9uZSIpLAotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRzZXQgTWljIiksCi0JU09DX0RBUE1fUElOX1NXSVRDSCgiSW50IE1pYyIpLAotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkV4dCBTcGsiKSwKLX07Ci0KLXN0YXRpYyBpbnQgY2h0X2FpZjFfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlpbnQgcmV0OwotCi0JLyogc2V0IGNvZGVjIFBMTCBzb3VyY2UgdG8gdGhlIDE5LjJNSHogcGxhdGZvcm0gY2xvY2sgKE1DTEspICovCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsIFJUNTY0NV9QTEwxX1NfTUNMSywKLQkJCQkgIENIVF9QTEFUX0NMS18zX0haLCBwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHBsbDogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3N5c2Nsayhjb2RlY19kYWksIFJUNTY0NV9TQ0xLX1NfUExMMSwKLQkJCQlwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyLCBTTkRfU09DX0NMT0NLX0lOKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIHN5c2NsazogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2h0X2NvZGVjX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydW50aW1lLT5jb2RlYzsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ1bnRpbWUtPmNvZGVjX2RhaTsKLQlzdHJ1Y3QgY2h0X21jX3ByaXZhdGUgKmN0eCA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydW50aW1lLT5jYXJkKTsKLQotCS8qIFNlbGVjdCBjbGtfaTJzMV9hc3JjIGFzIEFTUkMgY2xvY2sgc291cmNlICovCi0JcnQ1NjQ1X3NlbF9hc3JjX2Nsa19zcmMoY29kZWMsCi0JCQkJUlQ1NjQ1X0RBX1NURVJFT19GSUxURVIgfAotCQkJCVJUNTY0NV9EQV9NT05PX0xfRklMVEVSIHwKLQkJCQlSVDU2NDVfREFfTU9OT19SX0ZJTFRFUiB8Ci0JCQkJUlQ1NjQ1X0FEX1NURVJFT19GSUxURVIsCi0JCQkJUlQ1NjQ1X0NMS19TRUxfSTJTMV9BU1JDKTsKLQotCS8qIFRETSA0IHNsb3RzIDI0IGJpdCwgc2V0IFJ4ICYgVHggYml0bWFzayB0byA0IGFjdGl2ZSBzbG90cyAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF90ZG1fc2xvdChjb2RlY19kYWksIDB4RiwgMHhGLCA0LCAyNCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihydW50aW1lLT5kZXYsICJjYW4ndCBzZXQgY29kZWMgVERNIHNsb3QgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwKLQkJCQlTTkRfSkFDS19IRUFEUEhPTkUsCi0JCQkJJmN0eC0+aHBfamFjayk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHJ1bnRpbWUtPmRldiwgIkhQIGphY2sgY3JlYXRpb24gZmFpbGVkICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHNuZF9zb2NfamFja19uZXcoY29kZWMsICJNaWMgSmFjayIsCi0JCQkJU05EX0pBQ0tfTUlDUk9QSE9ORSwKLQkJCQkmY3R4LT5taWNfamFjayk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKHJ1bnRpbWUtPmRldiwgIk1pYyBqYWNrIGNyZWF0aW9uIGZhaWxlZCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlydDU2NDVfc2V0X2phY2tfZGV0ZWN0KGNvZGVjLCAmY3R4LT5ocF9qYWNrLCAmY3R4LT5taWNfamFjayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNodF9jb2RlY19maXh1cChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkLAotCQkJICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKnJhdGUgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSk7Ci0Jc3RydWN0IHNuZF9pbnRlcnZhbCAqY2hhbm5lbHMgPSBod19wYXJhbV9pbnRlcnZhbChwYXJhbXMsCi0JCQkJCQlTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMpOwotCi0JLyogVGhlIERTUCB3aWxsIGNvdmVydCB0aGUgRkUgcmF0ZSB0byA0OGssIHN0ZXJlbywgMjRiaXRzICovCi0JcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gNDgwMDA7Ci0JY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAyOwotCi0JLyogc2V0IFNTUDIgdG8gMjQtYml0ICovCi0Jc25kX21hc2tfc2V0KCZwYXJhbXMtPm1hc2tzW1NORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQgLQotCQkJCSAgICBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTS10sCi0JCQkJICAgIFNORFJWX1BDTV9GT1JNQVRfUzI0X0xFKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCByYXRlc180ODAwMFtdID0gewotCTQ4MDAwLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdCBjb25zdHJhaW50c180ODAwMCA9IHsKLQkuY291bnQgPSBBUlJBWV9TSVpFKHJhdGVzXzQ4MDAwKSwKLQkubGlzdCAgPSByYXRlc180ODAwMCwKLX07Ci0KLXN0YXRpYyBpbnQgY2h0X2FpZjFfc3RhcnR1cChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlyZXR1cm4gc25kX3BjbV9od19jb25zdHJhaW50X2xpc3Qoc3Vic3RyZWFtLT5ydW50aW1lLCAwLAotCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUsCi0JCQkmY29uc3RyYWludHNfNDgwMDApOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGNodF9haWYxX29wcyA9IHsKLQkuc3RhcnR1cCA9IGNodF9haWYxX3N0YXJ0dXAsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGNodF9iZV9zc3AyX29wcyA9IHsKLQkuaHdfcGFyYW1zID0gY2h0X2FpZjFfaHdfcGFyYW1zLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGNodF9kYWlsaW5rW10gPSB7Ci0JW01FUlJfRFBDTV9BVURJT10gPSB7Ci0JCS5uYW1lID0gIkF1ZGlvIFBvcnQiLAotCQkuc3RyZWFtX25hbWUgPSAiQXVkaW8iLAotCQkuY3B1X2RhaV9uYW1lID0gIm1lZGlhLWNwdS1kYWkiLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAic3N0LW1mbGQtcGxhdGZvcm0iLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5vcHMgPSAmY2h0X2FpZjFfb3BzLAotCX0sCi0JW01FUlJfRFBDTV9DT01QUl0gPSB7Ci0JCS5uYW1lID0gIkNvbXByZXNzZWQgUG9ydCIsCi0JCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiY29tcHJlc3MtY3B1LWRhaSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJzc3QtbWZsZC1wbGF0Zm9ybSIsCi0JfSwKLQkvKiBDT0RFQzwtPkNPREVDIGxpbmsgKi8KLQkvKiBiYWNrIGVuZHMgKi8KLQl7Ci0JCS5uYW1lID0gIlNTUDItQ29kZWMiLAotCQkuYmVfaWQgPSAxLAotCQkuY3B1X2RhaV9uYW1lID0gInNzcDItcG9ydCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gInNzdC1tZmxkLXBsYXRmb3JtIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJydDU2NDUtYWlmMSIsCi0JCS5jb2RlY19uYW1lID0gImkyYy0xMEVDNTY0NTowMCIsCi0JCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfRFNQX0IgfCBTTkRfU09DX0RBSUZNVF9JQl9ORgotCQkJCQl8IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCi0JCS5pbml0ID0gY2h0X2NvZGVjX2luaXQsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBjaHRfY29kZWNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5vcHMgPSAmY2h0X2JlX3NzcDJfb3BzLAotCX0sCi19OwotCi0vKiBTb0MgY2FyZCAqLwotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc25kX3NvY19jYXJkX2NodCA9IHsKLQkubmFtZSA9ICJjaHRydDU2NDUiLAotCS5kYWlfbGluayA9IGNodF9kYWlsaW5rLAotCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGNodF9kYWlsaW5rKSwKLQkuZGFwbV93aWRnZXRzID0gY2h0X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY2h0X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY2h0X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjaHRfYXVkaW9fbWFwKSwKLQkuY29udHJvbHMgPSBjaHRfbWNfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY2h0X21jX2NvbnRyb2xzKSwKLX07Ci0KLXN0YXRpYyBpbnQgc25kX2NodF9tY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByZXRfdmFsID0gMDsKLQlzdHJ1Y3QgY2h0X21jX3ByaXZhdGUgKmRydjsKLQotCWRydiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRydiksIEdGUF9BVE9NSUMpOwotCWlmICghZHJ2KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCXNuZF9zb2NfY2FyZF9jaHQuZGV2ID0gJnBkZXYtPmRldjsKLQlzbmRfc29jX2NhcmRfc2V0X2RydmRhdGEoJnNuZF9zb2NfY2FyZF9jaHQsIGRydik7Ci0JcmV0X3ZhbCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZzbmRfc29jX2NhcmRfY2h0KTsKLQlpZiAocmV0X3ZhbCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsCi0JCQkic25kX3NvY19yZWdpc3Rlcl9jYXJkIGZhaWxlZCAlZFxuIiwgcmV0X3ZhbCk7Ci0JCXJldHVybiByZXRfdmFsOwotCX0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCAmc25kX3NvY19jYXJkX2NodCk7Ci0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNuZF9jaHRfbWNfZHJpdmVyID0gewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImNodC1ic3ctcnQ1NjQ1IiwKLQkJLnBtID0gJnNuZF9zb2NfcG1fb3BzLAotCX0sCi0JLnByb2JlID0gc25kX2NodF9tY19wcm9iZSwKLX07Ci0KLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc25kX2NodF9tY19kcml2ZXIpCi0KLU1PRFVMRV9ERVNDUklQVElPTigiQVNvQyBJbnRlbChSKSBCcmFzd2VsbCBNYWNoaW5lIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiRmFuZywgWWFuZyBBLE4sSGFyc2hhcHJpeWEiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLU1PRFVMRV9BTElBUygicGxhdGZvcm06Y2h0LWJzdy1ydDU2NDUiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9jaHRfYnN3X3J0NTY3Mi5jIGIvc291bmQvc29jL2ludGVsL2NodF9ic3dfcnQ1NjcyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDE2NjIuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL2NodF9ic3dfcnQ1NjcyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTggKzAsMCBAQAotLyoKLSAqICBjaHRfYnN3X3J0NTY3Mi5jIC0gQVNvYyBNYWNoaW5lIGRyaXZlciBmb3IgSW50ZWwgQ2hlcnJ5dmlldy1iYXNlZCBwbGF0Zm9ybXMKLSAqICAgICAgICAgICAgICAgICAgICAgQ2hlcnJ5dHJhaWwgYW5kIEJyYXN3ZWxsLCB3aXRoIFJUNTY3MiBjb2RlYy4KLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDE0IEludGVsIENvcnAKLSAqICBBdXRob3I6IFN1YmhyYW5zdSBTLiBQcnVzdHkgPHN1YmhyYW5zdS5zLnBydXN0eUBpbnRlbC5jb20+Ci0gKiAgICAgICAgICBNZW5nZG9uZyBMaW4gPG1lbmdkb25nLmxpbkBpbnRlbC5jb20+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSAiLi4vY29kZWNzL3J0NTY3MC5oIgotI2luY2x1ZGUgInNzdC1hdG9tLWNvbnRyb2xzLmgiCi0KLS8qIFRoZSBwbGF0Zm9ybSBjbG9jayAjMyBvdXRwdXRzIDE5LjJNaHogY2xvY2sgdG8gY29kZWMgYXMgSTJTIE1DTEsgKi8KLSNkZWZpbmUgQ0hUX1BMQVRfQ0xLXzNfSFoJMTkyMDAwMDAKLSNkZWZpbmUgQ0hUX0NPREVDX0RBSQkicnQ1NjcwLWFpZjEiCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNuZF9zb2NfZGFpICpjaHRfZ2V0X2NvZGVjX2RhaShzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9ydGQ7IGkrKykgewotCQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkOwotCi0JCXJ0ZCA9IGNhcmQtPnJ0ZCArIGk7Ci0JCWlmICghc3RybmNtcChydGQtPmNvZGVjX2RhaS0+bmFtZSwgQ0hUX0NPREVDX0RBSSwKLQkJCSAgICAgc3RybGVuKENIVF9DT0RFQ19EQUkpKSkKLQkJCXJldHVybiBydGQtPmNvZGVjX2RhaTsKLQl9Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgcGxhdGZvcm1fY2xvY2tfY29udHJvbChzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCAqdywKLQkJc3RydWN0IHNuZF9rY29udHJvbCAqaywgaW50ICBldmVudCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSB3LT5kYXBtOwotCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBkYXBtLT5jYXJkOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpOwotCi0JY29kZWNfZGFpID0gY2h0X2dldF9jb2RlY19kYWkoY2FyZCk7Ci0JaWYgKCFjb2RlY19kYWkpIHsKLQkJZGV2X2VycihjYXJkLT5kZXYsICJDb2RlYyBkYWkgbm90IGZvdW5kOyBVbmFibGUgdG8gc2V0IHBsYXRmb3JtIGNsb2NrXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKCFTTkRfU09DX0RBUE1fRVZFTlRfT0ZGKGV2ZW50KSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBTZXQgY29kZWMgc3lzY2xrIHNvdXJjZSB0byBpdHMgaW50ZXJuYWwgY2xvY2sgYmVjYXVzZSBjb2RlYyBQTEwgd2lsbAotCSAqIGJlIG9mZiB3aGVuIGlkbGUgYW5kIE1DTEsgd2lsbCBhbHNvIGJlIG9mZiBieSBBQ1BJIHdoZW4gY29kZWMgaXMKLQkgKiBydW50aW1lIHN1c3BlbmRlZC4gQ29kZWMgbmVlZHMgY2xvY2sgZm9yIGphY2sgZGV0ZWN0aW9uIGFuZCBidXR0b24KLQkgKiBwcmVzcy4KLQkgKi8KLQlzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGNvZGVjX2RhaSwgUlQ1NjcwX1NDTEtfU19SQ0NMSywKLQkJCSAgICAgICAwLCBTTkRfU09DX0NMT0NLX0lOKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgY2h0X2RhcG1fd2lkZ2V0c1tdID0gewotCVNORF9TT0NfREFQTV9IUCgiSGVhZHBob25lIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiSGVhZHNldCBNaWMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJJbnQgTWljIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX1NQSygiRXh0IFNwayIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9TVVBQTFkoIlBsYXRmb3JtIENsb2NrIiwgU05EX1NPQ19OT1BNLCAwLCAwLAotCQkJcGxhdGZvcm1fY2xvY2tfY29udHJvbCwgU05EX1NPQ19EQVBNX1BPU1RfUE1EKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGNodF9hdWRpb19tYXBbXSA9IHsKLQl7IklOMVAiLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKLQl7IklOMU4iLCBOVUxMLCAiSGVhZHNldCBNaWMifSwKLQl7IkRNSUMgTDEiLCBOVUxMLCAiSW50IE1pYyJ9LAotCXsiRE1JQyBSMSIsIE5VTEwsICJJbnQgTWljIn0sCi0JeyJIZWFkcGhvbmUiLCBOVUxMLCAiSFBPTCJ9LAotCXsiSGVhZHBob25lIiwgTlVMTCwgIkhQT1IifSwKLQl7IkV4dCBTcGsiLCBOVUxMLCAiU1BPTFAifSwKLQl7IkV4dCBTcGsiLCBOVUxMLCAiU1BPTE4ifSwKLQl7IkV4dCBTcGsiLCBOVUxMLCAiU1BPUlAifSwKLQl7IkV4dCBTcGsiLCBOVUxMLCAiU1BPUk4ifSwKLQl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAic3NwMiBUeCJ9LAotCXsic3NwMiBUeCIsIE5VTEwsICJjb2RlY19vdXQwIn0sCi0JeyJzc3AyIFR4IiwgTlVMTCwgImNvZGVjX291dDEifSwKLQl7ImNvZGVjX2luMCIsIE5VTEwsICJzc3AyIFJ4In0sCi0JeyJjb2RlY19pbjEiLCBOVUxMLCAic3NwMiBSeCJ9LAotCXsic3NwMiBSeCIsIE5VTEwsICJBSUYxIENhcHR1cmUifSwKLQl7IkhlYWRwaG9uZSIsIE5VTEwsICJQbGF0Zm9ybSBDbG9jayJ9LAotCXsiSGVhZHNldCBNaWMiLCBOVUxMLCAiUGxhdGZvcm0gQ2xvY2sifSwKLQl7IkludCBNaWMiLCBOVUxMLCAiUGxhdGZvcm0gQ2xvY2sifSwKLQl7IkV4dCBTcGsiLCBOVUxMLCAiUGxhdGZvcm0gQ2xvY2sifSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBjaHRfbWNfY29udHJvbHNbXSA9IHsKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkcGhvbmUiKSwKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJIZWFkc2V0IE1pYyIpLAotCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkludCBNaWMiKSwKLQlTT0NfREFQTV9QSU5fU1dJVENIKCJFeHQgU3BrIiksCi19OwotCi1zdGF0aWMgaW50IGNodF9haWYxX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0JaW50IHJldDsKLQotCS8qIHNldCBjb2RlYyBQTEwgc291cmNlIHRvIHRoZSAxOS4yTUh6IHBsYXRmb3JtIGNsb2NrIChNQ0xLKSAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9wbGwoY29kZWNfZGFpLCAwLCBSVDU2NzBfUExMMV9TX01DTEssCi0JCQkJICBDSFRfUExBVF9DTEtfM19IWiwgcGFyYW1zX3JhdGUocGFyYW1zKSAqIDUxMik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBwbGw6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIHNldCBjb2RlYyBzeXNjbGsgc291cmNlIHRvIFBMTCAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NzBfU0NMS19TX1BMTDEsCi0JCQkJICAgICBwYXJhbXNfcmF0ZShwYXJhbXMpICogNTEyLAotCQkJCSAgICAgU05EX1NPQ19DTE9DS19JTik7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihydGQtPmRldiwgImNhbid0IHNldCBjb2RlYyBzeXNjbGs6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaHRfY29kZWNfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnVudGltZSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnVudGltZS0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7Ci0KLQkvKiBURE0gNCBzbG90cyAyNCBiaXQsIHNldCBSeCAmIFR4IGJpdG1hc2sgdG8gNCBhY3RpdmUgc2xvdHMgKi8KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfdGRtX3Nsb3QoY29kZWNfZGFpLCAweEYsIDB4RiwgNCwgMjQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocnVudGltZS0+ZGV2LCAiY2FuJ3Qgc2V0IGNvZGVjIFRETSBzbG90ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIFNlbGVjdCBjb2RlYyBBU1JDIGNsb2NrIHNvdXJjZSB0byB0cmFjayBJMlMxIGNsb2NrLCBiZWNhdXNlIGNvZGVjCi0JICogaXMgaW4gc2xhdmUgbW9kZSBhbmQgMTAwZnMgSTJTIGZvcm1hdCAoQkNMSyA9IDEwMCAqIExSQ0xLKSBjYW5ub3QKLQkgKiBiZSBzdXBwb3J0ZWQgYnkgUlQ1NjcyLiBPdGhlcndpc2UsIEFTUkMgd2lsbCBiZSBkaXNhYmxlZCBhbmQgY2F1c2UKLQkgKiBub2lzZS4KLQkgKi8KLQlydDU2NzBfc2VsX2FzcmNfY2xrX3NyYyhjb2RlYywKLQkJCQlSVDU2NzBfREFfU1RFUkVPX0ZJTFRFUgotCQkJCXwgUlQ1NjcwX0RBX01PTk9fTF9GSUxURVIKLQkJCQl8IFJUNTY3MF9EQV9NT05PX1JfRklMVEVSCi0JCQkJfCBSVDU2NzBfQURfU1RFUkVPX0ZJTFRFUgotCQkJCXwgUlQ1NjcwX0FEX01PTk9fTF9GSUxURVIKLQkJCQl8IFJUNTY3MF9BRF9NT05PX1JfRklMVEVSLAotCQkJCVJUNTY3MF9DTEtfU0VMX0kyUzFfQVNSQyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2h0X2NvZGVjX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JCQkgICAgc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKLQkJCVNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpjaGFubmVscyA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKLQkJCQkJCVNORFJWX1BDTV9IV19QQVJBTV9DSEFOTkVMUyk7Ci0KLQkvKiBUaGUgRFNQIHdpbGwgY292ZXJ0IHRoZSBGRSByYXRlIHRvIDQ4aywgc3RlcmVvLCAyNGJpdHMgKi8KLQlyYXRlLT5taW4gPSByYXRlLT5tYXggPSA0ODAwMDsKLQljaGFubmVscy0+bWluID0gY2hhbm5lbHMtPm1heCA9IDI7Ci0KLQkvKiBzZXQgU1NQMiB0byAyNC1iaXQgKi8KLQlzbmRfbWFza19zZXQoJnBhcmFtcy0+bWFza3NbU05EUlZfUENNX0hXX1BBUkFNX0ZPUk1BVCAtCi0JCQkJICAgIFNORFJWX1BDTV9IV19QQVJBTV9GSVJTVF9NQVNLXSwKLQkJCQkgICAgU05EUlZfUENNX0ZPUk1BVF9TMjRfTEUpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHJhdGVzXzQ4MDAwW10gPSB7Ci0JNDgwMDAsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faHdfY29uc3RyYWludF9saXN0IGNvbnN0cmFpbnRzXzQ4MDAwID0gewotCS5jb3VudCA9IEFSUkFZX1NJWkUocmF0ZXNfNDgwMDApLAotCS5saXN0ICA9IHJhdGVzXzQ4MDAwLAotfTsKLQotc3RhdGljIGludCBjaHRfYWlmMV9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbGlzdChzdWJzdHJlYW0tPnJ1bnRpbWUsIDAsCi0JCQlTTkRSVl9QQ01fSFdfUEFSQU1fUkFURSwKLQkJCSZjb25zdHJhaW50c180ODAwMCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgY2h0X2FpZjFfb3BzID0gewotCS5zdGFydHVwID0gY2h0X2FpZjFfc3RhcnR1cCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgY2h0X2JlX3NzcDJfb3BzID0gewotCS5od19wYXJhbXMgPSBjaHRfYWlmMV9od19wYXJhbXMsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgY2h0X2RhaWxpbmtbXSA9IHsKLQkvKiBGcm9udCBFbmQgREFJIGxpbmtzICovCi0JW01FUlJfRFBDTV9BVURJT10gPSB7Ci0JCS5uYW1lID0gIkF1ZGlvIFBvcnQiLAotCQkuc3RyZWFtX25hbWUgPSAiQXVkaW8iLAotCQkuY3B1X2RhaV9uYW1lID0gIm1lZGlhLWNwdS1kYWkiLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuY29kZWNfbmFtZSA9ICJzbmQtc29jLWR1bW15IiwKLQkJLnBsYXRmb3JtX25hbWUgPSAic3N0LW1mbGQtcGxhdGZvcm0iLAotCQkuaWdub3JlX3N1c3BlbmQgPSAxLAotCQkuZHluYW1pYyA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5vcHMgPSAmY2h0X2FpZjFfb3BzLAotCX0sCi0JW01FUlJfRFBDTV9DT01QUl0gPSB7Ci0JCS5uYW1lID0gIkNvbXByZXNzZWQgUG9ydCIsCi0JCS5zdHJlYW1fbmFtZSA9ICJDb21wcmVzcyIsCi0JCS5jcHVfZGFpX25hbWUgPSAiY29tcHJlc3MtY3B1LWRhaSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJzc3QtbWZsZC1wbGF0Zm9ybSIsCi0JfSwKLQotCS8qIEJhY2sgRW5kIERBSSBsaW5rcyAqLwotCXsKLQkJLyogU1NQMiAtIENvZGVjICovCi0JCS5uYW1lID0gIlNTUDItQ29kZWMiLAotCQkuYmVfaWQgPSAxLAotCQkuY3B1X2RhaV9uYW1lID0gInNzcDItcG9ydCIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gInNzdC1tZmxkLXBsYXRmb3JtIiwKLQkJLm5vX3BjbSA9IDEsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJydDU2NzAtYWlmMSIsCi0JCS5jb2RlY19uYW1lID0gImkyYy0xMEVDNTY3MDowMCIsCi0JCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfRFNQX0IgfCBTTkRfU09DX0RBSUZNVF9JQl9ORgotCQkJCQl8IFNORF9TT0NfREFJRk1UX0NCU19DRlMsCi0JCS5pbml0ID0gY2h0X2NvZGVjX2luaXQsCi0JCS5iZV9od19wYXJhbXNfZml4dXAgPSBjaHRfY29kZWNfZml4dXAsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5kcGNtX3BsYXliYWNrID0gMSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JCS5vcHMgPSAmY2h0X2JlX3NzcDJfb3BzLAotCX0sCi19OwotCi0vKiBTb0MgY2FyZCAqLwotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgc25kX3NvY19jYXJkX2NodCA9IHsKLQkubmFtZSA9ICJjaGVycnl0cmFpbGNyYXVkaW8iLAotCS5kYWlfbGluayA9IGNodF9kYWlsaW5rLAotCS5udW1fbGlua3MgPSBBUlJBWV9TSVpFKGNodF9kYWlsaW5rKSwKLQkuZGFwbV93aWRnZXRzID0gY2h0X2RhcG1fd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoY2h0X2RhcG1fd2lkZ2V0cyksCi0JLmRhcG1fcm91dGVzID0gY2h0X2F1ZGlvX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShjaHRfYXVkaW9fbWFwKSwKLQkuY29udHJvbHMgPSBjaHRfbWNfY29udHJvbHMsCi0JLm51bV9jb250cm9scyA9IEFSUkFZX1NJWkUoY2h0X21jX2NvbnRyb2xzKSwKLX07Ci0KLXN0YXRpYyBpbnQgc25kX2NodF9tY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByZXRfdmFsID0gMDsKLQotCS8qIHJlZ2lzdGVyIHRoZSBzb2MgY2FyZCAqLwotCXNuZF9zb2NfY2FyZF9jaHQuZGV2ID0gJnBkZXYtPmRldjsKLQlyZXRfdmFsID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJnNuZF9zb2NfY2FyZF9jaHQpOwotCWlmIChyZXRfdmFsKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwKLQkJCSJzbmRfc29jX3JlZ2lzdGVyX2NhcmQgZmFpbGVkICVkXG4iLCByZXRfdmFsKTsKLQkJcmV0dXJuIHJldF92YWw7Ci0JfQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZzbmRfc29jX2NhcmRfY2h0KTsKLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc25kX2NodF9tY19kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiY2h0LWJzdy1ydDU2NzIiLAotCQkucG0gPSAmc25kX3NvY19wbV9vcHMsCi0JfSwKLQkucHJvYmUgPSBzbmRfY2h0X21jX3Byb2JlLAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzbmRfY2h0X21jX2RyaXZlcik7Ci0KLU1PRFVMRV9ERVNDUklQVElPTigiQVNvQyBJbnRlbChSKSBCYXl0cmFpbCBDUiBNYWNoaW5lIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiU3ViaHJhbnN1IFMuIFBydXN0eSwgTWVuZ2RvbmcgTGluIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmNodC1ic3ctcnQ1NjcyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvY29tbW9uL01ha2VmaWxlIGIvc291bmQvc29jL2ludGVsL2NvbW1vbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjQxNTRjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2NvbW1vbi9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKK3NuZC1zb2Mtc3N0LWRzcC1vYmpzIDo9IHNzdC1kc3AubyBzc3QtZmlybXdhcmUubworc25kLXNvYy1zc3QtYWNwaS1vYmpzIDo9IHNzdC1hY3BpLm8KK3NuZC1zb2Mtc3N0LWlwYy1vYmpzIDo9IHNzdC1pcGMubworCitvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9TU1QpICs9IHNuZC1zb2Mtc3N0LWRzcC5vIHNuZC1zb2Mtc3N0LWlwYy5vCitvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9TU1RfQUNQSSkgKz0gc25kLXNvYy1zc3QtYWNwaS5vCisKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWFjcGkuYyBiL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWFjcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmYyOTNmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2NvbW1vbi9zc3QtYWNwaS5jCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogSW50ZWwgU1NUIGxvYWRlciBvbiBBQ1BJIHN5c3RlbXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorCisjZGVmaW5lIFNTVF9MUFRfRFNQX0RNQV9BRERSX09GRlNFVAkweDBGMDAwMAorI2RlZmluZSBTU1RfV1BUX0RTUF9ETUFfQUREUl9PRkZTRVQJMHgwRkUwMDAKKyNkZWZpbmUgU1NUX0xQVF9EU1BfRE1BX1NJWkUJCSgxMDI0IC0gMSkKKworLyogRGVzY3JpcHRvciBmb3IgU1NUIEFTb0MgbWFjaGluZSBkcml2ZXIgKi8KK3N0cnVjdCBzc3RfYWNwaV9tYWNoIHsKKwkvKiBBQ1BJIElEIGZvciB0aGUgbWF0Y2hpbmcgbWFjaGluZSBkcml2ZXIuIEF1ZGlvIGNvZGVjIGZvciBpbnN0YW5jZSAqLworCWNvbnN0IHU4IGlkW0FDUElfSURfTEVOXTsKKwkvKiBtYWNoaW5lIGRyaXZlciBuYW1lICovCisJY29uc3QgY2hhciAqZHJ2X25hbWU7CisJLyogZmlybXdhcmUgZmlsZSBuYW1lICovCisJY29uc3QgY2hhciAqZndfZmlsZW5hbWU7Cit9OworCisvKiBEZXNjcmlwdG9yIGZvciBzZXR0aW5nIHVwIFNTVCBwbGF0Zm9ybSBkYXRhICovCitzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyB7CisJY29uc3QgY2hhciAqZHJ2X25hbWU7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2hpbmVzOworCS8qIFBsYXRmb3JtIHJlc291cmNlIGluZGV4ZXMuIE11c3Qgc2V0IHRvIC0xIGlmIG5vdCB1c2VkICovCisJaW50IHJlc2luZGV4X2xwZV9iYXNlOworCWludCByZXNpbmRleF9wY2ljZmdfYmFzZTsKKwlpbnQgcmVzaW5kZXhfZndfYmFzZTsKKwlpbnQgaXJxaW5kZXhfaG9zdF9pcGM7CisJaW50IHJlc2luZGV4X2RtYV9iYXNlOworCS8qIFVuaXF1ZSBudW1iZXIgaWRlbnRpZnlpbmcgdGhlIFNTVCBjb3JlIG9uIHBsYXRmb3JtICovCisJaW50IHNzdF9pZDsKKwkvKiBETUEgb25seSB2YWxpZCB3aGVuIHJlc2luZGV4X2RtYV9iYXNlICE9IC0xKi8KKwlpbnQgZG1hX2VuZ2luZTsKKwlpbnQgZG1hX3NpemU7Cit9OworCitzdHJ1Y3Qgc3N0X2FjcGlfcHJpdiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldl9tYWNoOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZfcGNtOworCXN0cnVjdCBzc3RfcGRhdGEgc3N0X3BkYXRhOworCXN0cnVjdCBzc3RfYWNwaV9kZXNjICpkZXNjOworCXN0cnVjdCBzc3RfYWNwaV9tYWNoICptYWNoOworfTsKKworc3RhdGljIHZvaWQgc3N0X2FjcGlfZndfY2IoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gY29udGV4dDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBzc3RfYWNwaV9wcml2ICpzc3RfYWNwaSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzc3RfcGRhdGEgKnNzdF9wZGF0YSA9ICZzc3RfYWNwaS0+c3N0X3BkYXRhOworCXN0cnVjdCBzc3RfYWNwaV9kZXNjICpkZXNjID0gc3N0X2FjcGktPmRlc2M7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2ggPSBzc3RfYWNwaS0+bWFjaDsKKworCXNzdF9wZGF0YS0+ZncgPSBmdzsKKwlpZiAoIWZ3KSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IGxvYWQgZmlybXdhcmUgJXNcbiIsIG1hY2gtPmZ3X2ZpbGVuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHJlZ2lzdGVyIFBDTSBhbmQgREFJIGRyaXZlciAqLworCXNzdF9hY3BpLT5wZGV2X3BjbSA9CisJCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKGRldiwgZGVzYy0+ZHJ2X25hbWUsIC0xLAorCQkJCQkgICAgICBzc3RfcGRhdGEsIHNpemVvZigqc3N0X3BkYXRhKSk7CisJaWYgKElTX0VSUihzc3RfYWNwaS0+cGRldl9wY20pKSB7CisJCWRldl9lcnIoZGV2LCAiQ2Fubm90IHJlZ2lzdGVyIGRldmljZSAlcy4gRXJyb3IgJWRcbiIsCisJCQlkZXNjLT5kcnZfbmFtZSwgKGludClQVFJfRVJSKHNzdF9hY3BpLT5wZGV2X3BjbSkpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIHNzdF9hY3BpX21hY2hfbWF0Y2goYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgbGV2ZWwsCisJCQkJICAgICAgIHZvaWQgKmNvbnRleHQsIHZvaWQgKipyZXQpCit7CisJKihib29sICopY29udGV4dCA9IHRydWU7CisJcmV0dXJuIEFFX09LOworfQorCitzdGF0aWMgc3RydWN0IHNzdF9hY3BpX21hY2ggKnNzdF9hY3BpX2ZpbmRfbWFjaGluZSgKKwlzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCAqbWFjaGluZXMpCit7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2g7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCisJZm9yIChtYWNoID0gbWFjaGluZXM7IG1hY2gtPmlkWzBdOyBtYWNoKyspCisJCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfZGV2aWNlcyhtYWNoLT5pZCwKKwkJCQkJCSAgc3N0X2FjcGlfbWFjaF9tYXRjaCwKKwkJCQkJCSAgJmZvdW5kLCBOVUxMKSkgJiYgZm91bmQpCisJCQlyZXR1cm4gbWFjaDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHNzdF9hY3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBzc3RfYWNwaV9wcml2ICpzc3RfYWNwaTsKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGE7CisJc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2g7CisJc3RydWN0IHNzdF9hY3BpX2Rlc2MgKmRlc2M7CisJc3RydWN0IHJlc291cmNlICptbWlvOworCWludCByZXQgPSAwOworCisJc3N0X2FjcGkgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnNzdF9hY3BpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHNzdF9hY3BpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaWQgPSBhY3BpX21hdGNoX2RldmljZShkZXYtPmRyaXZlci0+YWNwaV9tYXRjaF90YWJsZSwgZGV2KTsKKwlpZiAoIWlkKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRlc2MgPSAoc3RydWN0IHNzdF9hY3BpX2Rlc2MgKilpZC0+ZHJpdmVyX2RhdGE7CisJbWFjaCA9IHNzdF9hY3BpX2ZpbmRfbWFjaGluZShkZXNjLT5tYWNoaW5lcyk7CisJaWYgKG1hY2ggPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIk5vIG1hdGNoaW5nIEFTb0MgbWFjaGluZSBkcml2ZXIgZm91bmRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzc3RfcGRhdGEgPSAmc3N0X2FjcGktPnNzdF9wZGF0YTsKKwlzc3RfcGRhdGEtPmlkID0gZGVzYy0+c3N0X2lkOworCXNzdF9wZGF0YS0+ZG1hX2RldiA9IGRldjsKKwlzc3RfYWNwaS0+ZGVzYyA9IGRlc2M7CisJc3N0X2FjcGktPm1hY2ggPSBtYWNoOworCisJc3N0X3BkYXRhLT5yZXNpbmRleF9kbWFfYmFzZSA9IGRlc2MtPnJlc2luZGV4X2RtYV9iYXNlOworCWlmIChkZXNjLT5yZXNpbmRleF9kbWFfYmFzZSA+PSAwKSB7CisJCXNzdF9wZGF0YS0+ZG1hX2VuZ2luZSA9IGRlc2MtPmRtYV9lbmdpbmU7CisJCXNzdF9wZGF0YS0+ZG1hX2Jhc2UgPSBkZXNjLT5yZXNpbmRleF9kbWFfYmFzZTsKKwkJc3N0X3BkYXRhLT5kbWFfc2l6ZSA9IGRlc2MtPmRtYV9zaXplOworCX0KKworCWlmIChkZXNjLT5pcnFpbmRleF9ob3N0X2lwYyA+PSAwKQorCQlzc3RfcGRhdGEtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgZGVzYy0+aXJxaW5kZXhfaG9zdF9pcGMpOworCisJaWYgKGRlc2MtPnJlc2luZGV4X2xwZV9iYXNlID49IDApIHsKKwkJbW1pbyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwKKwkJCQkJICAgICBkZXNjLT5yZXNpbmRleF9scGVfYmFzZSk7CisJCWlmIChtbWlvKSB7CisJCQlzc3RfcGRhdGEtPmxwZV9iYXNlID0gbW1pby0+c3RhcnQ7CisJCQlzc3RfcGRhdGEtPmxwZV9zaXplID0gcmVzb3VyY2Vfc2l6ZShtbWlvKTsKKwkJfQorCX0KKworCWlmIChkZXNjLT5yZXNpbmRleF9wY2ljZmdfYmFzZSA+PSAwKSB7CisJCW1taW8gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCSAgICAgZGVzYy0+cmVzaW5kZXhfcGNpY2ZnX2Jhc2UpOworCQlpZiAobW1pbykgeworCQkJc3N0X3BkYXRhLT5wY2ljZmdfYmFzZSA9IG1taW8tPnN0YXJ0OworCQkJc3N0X3BkYXRhLT5wY2ljZmdfc2l6ZSA9IHJlc291cmNlX3NpemUobW1pbyk7CisJCX0KKwl9CisKKwlpZiAoZGVzYy0+cmVzaW5kZXhfZndfYmFzZSA+PSAwKSB7CisJCW1taW8gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCSAgICAgZGVzYy0+cmVzaW5kZXhfZndfYmFzZSk7CisJCWlmIChtbWlvKSB7CisJCQlzc3RfcGRhdGEtPmZ3X2Jhc2UgPSBtbWlvLT5zdGFydDsKKwkJCXNzdF9wZGF0YS0+Zndfc2l6ZSA9IHJlc291cmNlX3NpemUobW1pbyk7CisJCX0KKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzc3RfYWNwaSk7CisKKwkvKiByZWdpc3RlciBtYWNoaW5lIGRyaXZlciAqLworCXNzdF9hY3BpLT5wZGV2X21hY2ggPQorCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShkZXYsIG1hY2gtPmRydl9uYW1lLCAtMSwKKwkJCQkJICAgICAgc3N0X3BkYXRhLCBzaXplb2YoKnNzdF9wZGF0YSkpOworCWlmIChJU19FUlIoc3N0X2FjcGktPnBkZXZfbWFjaCkpCisJCXJldHVybiBQVFJfRVJSKHNzdF9hY3BpLT5wZGV2X21hY2gpOworCisJLyogY29udGludWUgU1NUIHByb2JpbmcgYWZ0ZXIgZmlybXdhcmUgaXMgbG9hZGVkICovCisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIHRydWUsIG1hY2gtPmZ3X2ZpbGVuYW1lLAorCQkJCSAgICAgIGRldiwgR0ZQX0tFUk5FTCwgcGRldiwgc3N0X2FjcGlfZndfY2IpOworCWlmIChyZXQpCisJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNzdF9hY3BpLT5wZGV2X21hY2gpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzc3RfYWNwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qgc3N0X2FjcGlfcHJpdiAqc3N0X2FjcGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSAmc3N0X2FjcGktPnNzdF9wZGF0YTsKKworCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNzdF9hY3BpLT5wZGV2X21hY2gpOworCWlmICghSVNfRVJSX09SX05VTEwoc3N0X2FjcGktPnBkZXZfcGNtKSkKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc3N0X2FjcGktPnBkZXZfcGNtKTsKKwlyZWxlYXNlX2Zpcm13YXJlKHNzdF9wZGF0YS0+ZncpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCBoYXN3ZWxsX21hY2hpbmVzW10gPSB7CisJeyAiSU5UMzNDQSIsICJoYXN3ZWxsLWF1ZGlvIiwgImludGVsL0ludGNTU1QxLmJpbiIgfSwKKwl7fQorfTsKKworc3RhdGljIHN0cnVjdCBzc3RfYWNwaV9kZXNjIHNzdF9hY3BpX2hhc3dlbGxfZGVzYyA9IHsKKwkuZHJ2X25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAorCS5tYWNoaW5lcyA9IGhhc3dlbGxfbWFjaGluZXMsCisJLnJlc2luZGV4X2xwZV9iYXNlID0gMCwKKwkucmVzaW5kZXhfcGNpY2ZnX2Jhc2UgPSAxLAorCS5yZXNpbmRleF9md19iYXNlID0gLTEsCisJLmlycWluZGV4X2hvc3RfaXBjID0gMCwKKwkuc3N0X2lkID0gU1NUX0RFVl9JRF9MWU5YX1BPSU5ULAorCS5kbWFfZW5naW5lID0gU1NUX0RNQV9UWVBFX0RXLAorCS5yZXNpbmRleF9kbWFfYmFzZSA9IFNTVF9MUFRfRFNQX0RNQV9BRERSX09GRlNFVCwKKwkuZG1hX3NpemUgPSBTU1RfTFBUX0RTUF9ETUFfU0laRSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCBicm9hZHdlbGxfbWFjaGluZXNbXSA9IHsKKwl7ICJJTlQzNDNBIiwgImJyb2Fkd2VsbC1hdWRpbyIsICJpbnRlbC9JbnRjU1NUMi5iaW4iIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyBzc3RfYWNwaV9icm9hZHdlbGxfZGVzYyA9IHsKKwkuZHJ2X25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAorCS5tYWNoaW5lcyA9IGJyb2Fkd2VsbF9tYWNoaW5lcywKKwkucmVzaW5kZXhfbHBlX2Jhc2UgPSAwLAorCS5yZXNpbmRleF9wY2ljZmdfYmFzZSA9IDEsCisJLnJlc2luZGV4X2Z3X2Jhc2UgPSAtMSwKKwkuaXJxaW5kZXhfaG9zdF9pcGMgPSAwLAorCS5zc3RfaWQgPSBTU1RfREVWX0lEX1dJTERDQVRfUE9JTlQsCisJLmRtYV9lbmdpbmUgPSBTU1RfRE1BX1RZUEVfRFcsCisJLnJlc2luZGV4X2RtYV9iYXNlID0gU1NUX1dQVF9EU1BfRE1BX0FERFJfT0ZGU0VULAorCS5kbWFfc2l6ZSA9IFNTVF9MUFRfRFNQX0RNQV9TSVpFLAorfTsKKworc3RhdGljIHN0cnVjdCBzc3RfYWNwaV9tYWNoIGJheXRyYWlsX21hY2hpbmVzW10gPSB7CisJeyAiMTBFQzU2NDAiLCAiYnl0LXJ0NTY0MCIsICJpbnRlbC9md19zc3RfMGYyOC5iaW4tNDhrSHpfaTJzX21hc3RlciIgfSwKKwl7ICIxOTNDOTg5MCIsICJieXQtbWF4OTgwOTAiLCAiaW50ZWwvZndfc3N0XzBmMjguYmluLTQ4a0h6X2kyc19tYXN0ZXIiIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyBzc3RfYWNwaV9iYXl0cmFpbF9kZXNjID0geworCS5kcnZfbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAorCS5tYWNoaW5lcyA9IGJheXRyYWlsX21hY2hpbmVzLAorCS5yZXNpbmRleF9scGVfYmFzZSA9IDAsCisJLnJlc2luZGV4X3BjaWNmZ19iYXNlID0gMSwKKwkucmVzaW5kZXhfZndfYmFzZSA9IDIsCisJLmlycWluZGV4X2hvc3RfaXBjID0gNSwKKwkuc3N0X2lkID0gU1NUX0RFVl9JRF9CWVQsCisJLnJlc2luZGV4X2RtYV9iYXNlID0gLTEsCit9OworCitzdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHNzdF9hY3BpX21hdGNoW10gPSB7CisJeyAiSU5UMzNDOCIsICh1bnNpZ25lZCBsb25nKSZzc3RfYWNwaV9oYXN3ZWxsX2Rlc2MgfSwKKwl7ICJJTlQzNDM4IiwgKHVuc2lnbmVkIGxvbmcpJnNzdF9hY3BpX2Jyb2Fkd2VsbF9kZXNjIH0sCisJeyAiODA4NjBGMjgiLCAodW5zaWduZWQgbG9uZykmc3N0X2FjcGlfYmF5dHJhaWxfZGVzYyB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgc3N0X2FjcGlfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzc3RfYWNwaV9kcml2ZXIgPSB7CisJLnByb2JlID0gc3N0X2FjcGlfcHJvYmUsCisJLnJlbW92ZSA9IHNzdF9hY3BpX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzc3QtYWNwaSIsCisJCS5hY3BpX21hdGNoX3RhYmxlID0gQUNQSV9QVFIoc3N0X2FjcGlfbWF0Y2gpLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzc3RfYWNwaV9kcml2ZXIpOworCitNT0RVTEVfQVVUSE9SKCJKYXJra28gTmlrdWxhIDxqYXJra28ubmlrdWxhQGxpbnV4LmludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgU1NUIGxvYWRlciBvbiBBQ1BJIHN5c3RlbXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWRzcC1wcml2LmggYi9zb3VuZC9zb2MvaW50ZWwvY29tbW9uL3NzdC1kc3AtcHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NmQ1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvY29tbW9uL3NzdC1kc3AtcHJpdi5oCkBAIC0wLDAgKzEsMzczIEBACisvKgorICogSW50ZWwgU21hcnQgU291bmQgVGVjaG5vbG9neQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIF9fU09VTkRfU09DX1NTVF9EU1BfUFJJVl9ICisjZGVmaW5lIF9fU09VTkRfU09DX1NTVF9EU1BfUFJJVl9ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisKK3N0cnVjdCBzc3RfbWVtX2Jsb2NrOworc3RydWN0IHNzdF9tb2R1bGU7CitzdHJ1Y3Qgc3N0X2Z3OworCisvKiBkbyB3ZSBuZWVkIHRvIHJlbW92ZSBvciBrZWVwICovCisjZGVmaW5lIERTUF9EUkFNX0FERFJfT0ZGU0VUCQkweDQwMDAwMAorCisvKgorICogRFNQIE9wZXJhdGlvbnMgZXhwb3J0ZWQgYnkgcGxhdGZvcm0gQXVkaW8gRFNQIGRyaXZlci4KKyAqLworc3RydWN0IHNzdF9vcHMgeworCS8qIERTUCBjb3JlIGJvb3QgLyByZXNldCAqLworCXZvaWQgKCpib290KShzdHJ1Y3Qgc3N0X2RzcCAqKTsKKwl2b2lkICgqcmVzZXQpKHN0cnVjdCBzc3RfZHNwICopOworCWludCAoKndha2UpKHN0cnVjdCBzc3RfZHNwICopOworCXZvaWQgKCpzbGVlcCkoc3RydWN0IHNzdF9kc3AgKik7CisJdm9pZCAoKnN0YWxsKShzdHJ1Y3Qgc3N0X2RzcCAqKTsKKworCS8qIFNoaW0gSU8gKi8KKwl2b2lkICgqd3JpdGUpKHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKTsKKwl1MzIgKCpyZWFkKSh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpOworCXZvaWQgKCp3cml0ZTY0KSh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQsIHU2NCB2YWx1ZSk7CisJdTY0ICgqcmVhZDY0KSh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpOworCisJLyogRFNQIEkvRFJBTSBJTyAqLworCXZvaWQgKCpyYW1fcmVhZCkoc3RydWN0IHNzdF9kc3AgKnNzdCwgdm9pZCAgKmRlc3QsIHZvaWQgX19pb21lbSAqc3JjLAorCQlzaXplX3QgYnl0ZXMpOworCXZvaWQgKCpyYW1fd3JpdGUpKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgX19pb21lbSAqZGVzdCwgdm9pZCAqc3JjLAorCQlzaXplX3QgYnl0ZXMpOworCisJdm9pZCAoKmR1bXApKHN0cnVjdCBzc3RfZHNwICopOworCisJLyogSVJRIGhhbmRsZXJzICovCisJaXJxcmV0dXJuX3QgKCppcnFfaGFuZGxlcikoaW50IGlycSwgdm9pZCAqY29udGV4dCk7CisKKwkvKiBTU1QgaW5pdCBhbmQgZnJlZSAqLworCWludCAoKmluaXQpKHN0cnVjdCBzc3RfZHNwICpzc3QsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKTsKKwl2b2lkICgqZnJlZSkoc3RydWN0IHNzdF9kc3AgKnNzdCk7CisKKwkvKiBGVyBtb2R1bGUgcGFyc2VyL2xvYWRlciAqLworCWludCAoKnBhcnNlX2Z3KShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpOworfTsKKworLyoKKyAqIEF1ZGlvIERTUCBtZW1vcnkgb2Zmc2V0cyBhbmQgYWRkcmVzc2VzLgorICovCitzdHJ1Y3Qgc3N0X2FkZHIgeworCXUzMiBscGVfYmFzZTsKKwl1MzIgc2hpbV9vZmZzZXQ7CisJdTMyIGlyYW1fb2Zmc2V0OworCXUzMiBkcmFtX29mZnNldDsKKwl1MzIgZHNwX2lyYW1fb2Zmc2V0OworCXUzMiBkc3BfZHJhbV9vZmZzZXQ7CisJdm9pZCBfX2lvbWVtICpscGU7CisJdm9pZCBfX2lvbWVtICpzaGltOworCXZvaWQgX19pb21lbSAqcGNpX2NmZzsKKwl2b2lkIF9faW9tZW0gKmZ3X2V4dDsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgTWFpbGJveCBjb25maWd1cmF0aW9uLgorICovCitzdHJ1Y3Qgc3N0X21haWxib3ggeworCXZvaWQgX19pb21lbSAqaW5fYmFzZTsKKwl2b2lkIF9faW9tZW0gKm91dF9iYXNlOworCXNpemVfdCBpbl9zaXplOworCXNpemVfdCBvdXRfc2l6ZTsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgbWVtb3J5IGJsb2NrIHR5cGVzLgorICovCitlbnVtIHNzdF9tZW1fdHlwZSB7CisJU1NUX01FTV9JUkFNID0gMCwKKwlTU1RfTUVNX0RSQU0gPSAxLAorCVNTVF9NRU1fQU5ZICA9IDIsCisJU1NUX01FTV9DQUNIRT0gMywKK307CisKKy8qCisgKiBBdWRpbyBEU1AgR2VuZXJpYyBGaXJtd2FyZSBGaWxlLgorICoKKyAqIFNTVCBGaXJtd2FyZSBmaWxlcyBjYW4gY29uc2lzdCBvZiAxLi5OIG1vZHVsZXMuIFRoaXMgZ2VuZXJpYyBzdHJ1Y3R1cmUgaXMKKyAqIHVzZWQgdG8gbWFuYWdlIGVhY2ggZmlybXdhcmUgZmlsZSBhbmQgaXQncyBtb2R1bGVzIHJlZ2FyZGxlc3Mgb2YgU1NUIGZpcm13YXJlCisgKiB0eXBlLiBBIFNTVCBkcml2ZXIgbWF5IGxvYWQgbXVsdGlwbGUgRlcgZmlsZXMuCisgKi8KK3N0cnVjdCBzc3RfZncgeworCXN0cnVjdCBzc3RfZHNwICpkc3A7CisKKwkvKiBiYXNlIGFkZHJlc3NlcyBvZiBGVyBmaWxlIGRhdGEgKi8KKwlkbWFfYWRkcl90IGRtYWJsZV9md19wYWRkcjsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBmdyBkYXRhICovCisJdm9pZCAqZG1hX2J1ZjsJCQkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgZncgZGF0YSAqLworCXUzMiBzaXplOwkJCS8qIHNpemUgb2YgZncgZGF0YSAqLworCisJLyogbGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBEU1AgbGlzdCBvZiBGVyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbW9kdWxlX2xpc3Q7CS8qIEZXIGxpc3Qgb2YgbW9kdWxlcyAqLworCisJdm9pZCAqcHJpdmF0ZTsJCQkvKiBjb3JlIGRvZXNuJ3QgdG91Y2ggdGhpcyAqLworfTsKKworLyoKKyAqIEF1ZGlvIERTUCBHZW5lcmljIE1vZHVsZSBUZW1wbGF0ZS4KKyAqCisgKiBVc2VkIHRvIGRlZmluZSBhbmQgcmVnaXN0ZXIgYSBuZXcgRlcgbW9kdWxlLiBUaGlzIGRhdGEgaXMgZXh0cmFjdGVkIGZyb20KKyAqIEZXIG1vZHVsZSBoZWFkZXIgaW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCBzc3RfbW9kdWxlX3RlbXBsYXRlIHsKKwl1MzIgaWQ7CisJdTMyIGVudHJ5OwkJCS8qIGVudHJ5IHBvaW50ICovCisJdTMyIHNjcmF0Y2hfc2l6ZTsKKwl1MzIgcGVyc2lzdGVudF9zaXplOworfTsKKworLyoKKyAqIEJsb2NrIEFsbG9jYXRvciAtIFVzZWQgdG8gYWxsb2NhdGUgYmxvY2tzIG9mIERTUCBtZW1vcnkuCisgKi8KK3N0cnVjdCBzc3RfYmxvY2tfYWxsb2NhdG9yIHsKKwl1MzIgaWQ7CisJdTMyIG9mZnNldDsKKwlpbnQgc2l6ZTsKKwllbnVtIHNzdF9tZW1fdHlwZSB0eXBlOworfTsKKworLyoKKyAqIFJ1bnRpbWUgTW9kdWxlIEluc3RhbmNlIC0gQSBtb2R1bGUgb2JqZWN0IGNhbiBiZSBpbnN0YW5jaWF0ZWQgbXVsdGlwbGUKKyAqIHRpbWVzIHdpdGhpbiB0aGUgRFNQIEZXLgorICovCitzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lIHsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOworCWludCBpZDsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlOwkvKiBwYXJlbnQgbW9kdWxlIHdlIGJlbG9uZyB0b28gKi8KKworCXUzMiBwZXJzaXN0ZW50X29mZnNldDsJCS8qIHByaXZhdGUgbWVtb3J5IG9mZnNldCAqLworCXZvaWQgKnByaXZhdGU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBibG9ja19saXN0OwkvKiBsaXN0IG9mIGJsb2NrcyB1c2VkICovCit9OworCisvKgorICogUnVudGltZSBNb2R1bGUgQ29udGV4dCAtIFRoZSBydW50aW1lIGNvbnRleHQgbXVzdCBiZSBtYW51YWxseSBzdG9yZWQgYnkgdGhlCisgKiBkcml2ZXIgcHJpb3IgdG8gZW50ZXIgUzMgYW5kIHJlc3RvcmVkIGFmdGVyIGxlYXZpbmcgUzMuIFRoaXMgc2hvdWxkIHJlYWxseSBiZQorICogcGFydCBvZiB0aGUgbWVtb3J5IGNvbnRleHQgc2F2ZWQgYnkgdGhlIGVudGVyIEQzIG1lc3NhZ2UgSVBDID8/PworICovCitzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lX2NvbnRleHQgeworCWRtYV9hZGRyX3QgZG1hX2J1ZmZlcjsKKwl1MzIgKmJ1ZmZlcjsKK307CisKKy8qCisgKiBBdWRpbyBEU1AgTW9kdWxlIFN0YXRlCisgKi8KK2VudW0gc3N0X21vZHVsZV9zdGF0ZSB7CisJU1NUX01PRFVMRV9TVEFURV9VTkxPQURFRCA9IDAsCS8qIGRlZmF1bHQgc3RhdGUgKi8KKwlTU1RfTU9EVUxFX1NUQVRFX0xPQURFRCwKKwlTU1RfTU9EVUxFX1NUQVRFX0lOSVRJQUxJWkVELAkvKiBhbmQgaW5hY3RpdmUgKi8KKwlTU1RfTU9EVUxFX1NUQVRFX0FDVElWRSwKK307CisKKy8qCisgKiBBdWRpbyBEU1AgR2VuZXJpYyBNb2R1bGUuCisgKgorICogRWFjaCBGaXJtd2FyZSBmaWxlIGNhbiBjb25zaXN0IG9mIDEuLk4gbW9kdWxlcy4gQSBtb2R1bGUgY2FuIHNwYW4gbXVsdGlwbGUKKyAqIEFEU1AgbWVtb3J5IGJsb2Nrcy4gVGhlIHNpbXBsZXN0IEZXIHdpbGwgYmUgYSBmaWxlIHdpdGggMSBtb2R1bGUuIEEgbW9kdWxlCisgKiBjYW4gYmUgaW5zdGFuY2lhdGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBEU1AuCisgKi8KK3N0cnVjdCBzc3RfbW9kdWxlIHsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOworCXN0cnVjdCBzc3RfZncgKnNzdF9mdzsJCS8qIHBhcmVudCBGVyB3ZSBiZWxvbmcgdG9vICovCisKKwkvKiBtb2R1bGUgY29uZmlndXJhdGlvbiAqLworCXUzMiBpZDsKKwl1MzIgZW50cnk7CQkJLyogbW9kdWxlIGVudHJ5IHBvaW50ICovCisJczMyIG9mZnNldDsJCQkvKiBtb2R1bGUgb2Zmc2V0IGluIGZpcm13YXJlIGZpbGUgKi8KKwl1MzIgc2l6ZTsJCQkvKiBtb2R1bGUgc2l6ZSAqLworCXUzMiBzY3JhdGNoX3NpemU7CQkvKiBnbG9iYWwgc2NyYXRjaCBtZW1vcnkgcmVxdWlyZWQgKi8KKwl1MzIgcGVyc2lzdGVudF9zaXplOwkJLyogcHJpdmF0ZSBtZW1vcnkgcmVxdWlyZWQgKi8KKwllbnVtIHNzdF9tZW1fdHlwZSB0eXBlOwkJLyogZGVzdGluYXRpb24gbWVtb3J5IHR5cGUgKi8KKwl1MzIgZGF0YV9vZmZzZXQ7CQkvKiBvZmZzZXQgaW4gQURTUCBtZW1vcnkgc3BhY2UgKi8KKwl2b2lkICpkYXRhOwkJCS8qIG1vZHVsZSBkYXRhICovCisKKwkvKiBydW50aW1lICovCisJdTMyIHVzYWdlX2NvdW50OwkJLyogY2FuIGJlIHVubG9hZGVkIGlmIGNvdW50ID09IDAgKi8KKwl2b2lkICpwcml2YXRlOwkJCS8qIGNvcmUgZG9lc24ndCB0b3VjaCB0aGlzICovCisKKwkvKiBsaXN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgYmxvY2tfbGlzdDsJLyogTW9kdWxlIGxpc3Qgb2YgYmxvY2tzIGluIHVzZSAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIERTUCBsaXN0IG9mIG1vZHVsZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZnc7CS8qIEZXIGxpc3Qgb2YgbW9kdWxlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgcnVudGltZV9saXN0OwkvKiBsaXN0IG9mIHJ1bnRpbWUgbW9kdWxlIG9iamVjdHMqLworCisJLyogc3RhdGUgKi8KKwllbnVtIHNzdF9tb2R1bGVfc3RhdGUgc3RhdGU7Cit9OworCisvKgorICogU1NUIE1lbW9yeSBCbG9jayBvcGVyYXRpb25zLgorICovCitzdHJ1Y3Qgc3N0X2Jsb2NrX29wcyB7CisJaW50ICgqZW5hYmxlKShzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2spOworCWludCAoKmRpc2FibGUpKHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jayk7Cit9OworCisvKgorICogU1NUIEdlbmVyaWMgTWVtb3J5IEJsb2NrLgorICoKKyAqIFNTVCBBRFAgIG1lbW9yeSBoYXMgbXVsdGlwbGUgSVJBTSBhbmQgRFJBTSBibG9ja3MuIFNvbWUgQURTUCBibG9ja3MgY2FuIGJlCisgKiBwb3dlciBnYXRlZC4KKyAqLworc3RydWN0IHNzdF9tZW1fYmxvY2sgeworCXN0cnVjdCBzc3RfZHNwICpkc3A7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZTsJLyogbW9kdWxlIHRoYXQgdXNlcyB0aGlzIGJsb2NrICovCisKKwkvKiBibG9jayBjb25maWcgKi8KKwl1MzIgb2Zmc2V0OwkJCS8qIG9mZnNldCBmcm9tIGJhc2UgKi8KKwl1MzIgc2l6ZTsJCQkvKiBibG9jayBzaXplICovCisJdTMyIGluZGV4OwkJCS8qIGJsb2NrIGluZGV4IDAuLk4gKi8KKwllbnVtIHNzdF9tZW1fdHlwZSB0eXBlOwkJLyogYmxvY2sgbWVtb3J5IHR5cGUgSVJBTS9EUkFNICovCisJc3RydWN0IHNzdF9ibG9ja19vcHMgKm9wczsJLyogYmxvY2sgb3BlcmF0aW9ucywgaWYgYW55ICovCisKKwkvKiBibG9jayBzdGF0dXMgKi8KKwl1MzIgYnl0ZXNfdXNlZDsJCQkvKiBieXRlcyBpbiB1c2UgYnkgbW9kdWxlcyAqLworCXZvaWQgKnByaXZhdGU7CQkJLyogZ2VuZXJpYyBjb3JlIGRvZXMgbm90IHRvdWNoIHRoaXMgKi8KKwlpbnQgdXNlcnM7CQkJLyogbnVtYmVyIG9mIG1vZHVsZXMgdXNpbmcgdGhpcyBibG9jayAqLworCisJLyogYmxvY2sgbGlzdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG1vZHVsZV9saXN0OwkvKiBNb2R1bGUgbGlzdCBvZiBibG9ja3MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBNYXAgbGlzdCBvZiBmcmVlL3VzZWQgYmxvY2tzICovCit9OworCisvKgorICogR2VuZXJpYyBTU1QgU2hpbSBJbnRlcmZhY2UuCisgKi8KK3N0cnVjdCBzc3RfZHNwIHsKKworCS8qIHJ1bnRpbWUgKi8KKwlzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgKnNzdF9kZXY7CisJc3BpbmxvY2tfdCBzcGlubG9jazsJLyogSVBDIGxvY2tpbmcgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CS8qIERTUCBGVyBsb2NrICovCisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXY7CisJdm9pZCAqdGhyZWFkX2NvbnRleHQ7CisJaW50IGlycTsKKwl1MzIgaWQ7CisKKwkvKiBsaXN0IG9mIGZyZWUgYW5kIHVzZWQgQURTUCBtZW1vcnkgYmxvY2tzICovCisJc3RydWN0IGxpc3RfaGVhZCB1c2VkX2Jsb2NrX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2Jsb2NrX2xpc3Q7CisKKwkvKiBvcGVyYXRpb25zICovCisJc3RydWN0IHNzdF9vcHMgKm9wczsKKworCS8qIGRlYnVnIEZTICovCisJc3RydWN0IGRlbnRyeSAqZGVidWdmc19yb290OworCisJLyogYmFzZSBhZGRyZXNzZXMgKi8KKwlzdHJ1Y3Qgc3N0X2FkZHIgYWRkcjsKKworCS8qIG1haWxib3ggKi8KKwlzdHJ1Y3Qgc3N0X21haWxib3ggbWFpbGJveDsKKworCS8qIFNTVCBGVyBmaWxlcyBsb2FkZWQgYW5kIHRoZWlyIG1vZHVsZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIG1vZHVsZV9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgZndfbGlzdDsKKworCS8qIHNjcmF0Y2ggYnVmZmVyICovCisJc3RydWN0IGxpc3RfaGVhZCBzY3JhdGNoX2Jsb2NrX2xpc3Q7CisJdTMyIHNjcmF0Y2hfb2Zmc2V0OworCXUzMiBzY3JhdGNoX3NpemU7CisKKwkvKiBwbGF0Zm9ybSBkYXRhICovCisJc3RydWN0IHNzdF9wZGF0YSAqcGRhdGE7CisKKwkvKiBETUEgRlcgbG9hZGluZyAqLworCXN0cnVjdCBzc3RfZG1hICpkbWE7CisJYm9vbCBmd191c2VfZG1hOworfTsKKworLyogU2l6ZSBvcHRpbWlzZWQgRFJBTS9JUkFNIG1lbWNweSAqLworc3RhdGljIGlubGluZSB2b2lkIHNzdF9kc3Bfd3JpdGUoc3RydWN0IHNzdF9kc3AgKnNzdCwgdm9pZCAqc3JjLAorCXUzMiBkZXN0X29mZnNldCwgc2l6ZV90IGJ5dGVzKQoreworCXNzdC0+b3BzLT5yYW1fd3JpdGUoc3N0LCBzc3QtPmFkZHIubHBlICsgZGVzdF9vZmZzZXQsIHNyYywgYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3N0X2RzcF9yZWFkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKmRlc3QsCisJdTMyIHNyY19vZmZzZXQsIHNpemVfdCBieXRlcykKK3sKKwlzc3QtPm9wcy0+cmFtX3JlYWQoc3N0LCBkZXN0LCBzc3QtPmFkZHIubHBlICsgc3JjX29mZnNldCwgYnl0ZXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKnNzdF9kc3BfZ2V0X3RocmVhZF9jb250ZXh0KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJcmV0dXJuIHNzdC0+dGhyZWFkX2NvbnRleHQ7Cit9CisKKy8qIENyZWF0ZS9GcmVlIEZXIGZpbGVzIC0gY2FuIGNvbnRhaW4gbXVsdGlwbGUgbW9kdWxlcyAqLworc3RydWN0IHNzdF9mdyAqc3N0X2Z3X25ldyhzdHJ1Y3Qgc3N0X2RzcCAqZHNwLAorCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKnByaXZhdGUpOwordm9pZCBzc3RfZndfZnJlZShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpOwordm9pZCBzc3RfZndfZnJlZV9hbGwoc3RydWN0IHNzdF9kc3AgKmRzcCk7CitpbnQgc3N0X2Z3X3JlbG9hZChzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpOwordm9pZCBzc3RfZndfdW5sb2FkKHN0cnVjdCBzc3RfZncgKnNzdF9mdyk7CisKKy8qIENyZWF0ZS9GcmVlIGZpcm13YXJlIG1vZHVsZXMgKi8KK3N0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlX25ldyhzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncsCisJc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgKnRlbXBsYXRlLCB2b2lkICpwcml2YXRlKTsKK3ZvaWQgc3N0X21vZHVsZV9mcmVlKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpOworc3RydWN0IHNzdF9tb2R1bGUgKnNzdF9tb2R1bGVfZ2V0X2Zyb21faWQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIGlkKTsKK2ludCBzc3RfbW9kdWxlX2FsbG9jX2Jsb2NrcyhzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlKTsKK2ludCBzc3RfbW9kdWxlX2ZyZWVfYmxvY2tzKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpOworCisvKiBDcmVhdGUvRnJlZSBmaXJtd2FyZSBtb2R1bGUgcnVudGltZSBpbnN0YW5jZXMgKi8KK3N0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnNzdF9tb2R1bGVfcnVudGltZV9uZXcoc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSwKKwlpbnQgaWQsIHZvaWQgKnByaXZhdGUpOwordm9pZCBzc3RfbW9kdWxlX3J1bnRpbWVfZnJlZShzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lKTsKK3N0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnNzdF9tb2R1bGVfcnVudGltZV9nZXRfZnJvbV9pZCgKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlLCB1MzIgaWQpOworaW50IHNzdF9tb2R1bGVfcnVudGltZV9hbGxvY19ibG9ja3Moc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZSwKKwlpbnQgb2Zmc2V0KTsKK2ludCBzc3RfbW9kdWxlX3J1bnRpbWVfZnJlZV9ibG9ja3Moc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZSk7CitpbnQgc3N0X21vZHVsZV9ydW50aW1lX3NhdmUoc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZSwKKwlzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lX2NvbnRleHQgKmNvbnRleHQpOworaW50IHNzdF9tb2R1bGVfcnVudGltZV9yZXN0b3JlKHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUsCisJc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZV9jb250ZXh0ICpjb250ZXh0KTsKKworLyogZ2VuZXJpYyBibG9jayBhbGxvY2F0aW9uICovCitpbnQgc3N0X2FsbG9jX2Jsb2NrcyhzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCBzdHJ1Y3Qgc3N0X2Jsb2NrX2FsbG9jYXRvciAqYmEsCisJc3RydWN0IGxpc3RfaGVhZCAqYmxvY2tfbGlzdCk7CitpbnQgc3N0X2ZyZWVfYmxvY2tzKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBsaXN0X2hlYWQgKmJsb2NrX2xpc3QpOworCisvKiBzY3JhdGNoIGFsbG9jYXRpb24gKi8KK2ludCBzc3RfYmxvY2tfYWxsb2Nfc2NyYXRjaChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKTsKK3ZvaWQgc3N0X2Jsb2NrX2ZyZWVfc2NyYXRjaChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKTsKKworLyogUmVnaXN0ZXIgdGhlIERTUHMgbWVtb3J5IGJsb2NrcyAtIHdvdWxkIGJlIG5pY2UgdG8gcmVhZCBmcm9tIEFDUEkgKi8KK3N0cnVjdCBzc3RfbWVtX2Jsb2NrICpzc3RfbWVtX2Jsb2NrX3JlZ2lzdGVyKHN0cnVjdCBzc3RfZHNwICpkc3AsIHUzMiBvZmZzZXQsCisJdTMyIHNpemUsIGVudW0gc3N0X21lbV90eXBlIHR5cGUsIHN0cnVjdCBzc3RfYmxvY2tfb3BzICpvcHMsIHUzMiBpbmRleCwKKwl2b2lkICpwcml2YXRlKTsKK3ZvaWQgc3N0X21lbV9ibG9ja191bnJlZ2lzdGVyX2FsbChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKTsKKworLyogQ3JlYXRlL0ZyZWUgRE1BIHJlc291cmNlcyAqLworaW50IHNzdF9kbWFfbmV3KHN0cnVjdCBzc3RfZHNwICpzc3QpOwordm9pZCBzc3RfZG1hX2ZyZWUoc3RydWN0IHNzdF9kbWEgKmRtYSk7CisKK3UzMiBzc3RfZHNwX2dldF9vZmZzZXQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIG9mZnNldCwKKwllbnVtIHNzdF9tZW1fdHlwZSB0eXBlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC1kc3AuYyBiL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWRzcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC5jCnJlbmFtZSB0byBzb3VuZC9zb2MvaW50ZWwvY29tbW9uL3NzdC1kc3AuYwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2NvbW1vbi9zc3QtZHNwLmggYi9zb3VuZC9zb2MvaW50ZWwvY29tbW9uL3NzdC1kc3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmFlYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2NvbW1vbi9zc3QtZHNwLmgKQEAgLTAsMCArMSwyODUgQEAKKy8qCisgKiBJbnRlbCBTbWFydCBTb3VuZCBUZWNobm9sb2d5IChTU1QpIENvcmUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfX1NPVU5EX1NPQ19TU1RfRFNQX0gKKyNkZWZpbmUgX19TT1VORF9TT0NfU1NUX0RTUF9ICisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisvKiBTU1QgRGV2aWNlIElEcyAgKi8KKyNkZWZpbmUgU1NUX0RFVl9JRF9MWU5YX1BPSU5UCQkweDMzQzgKKyNkZWZpbmUgU1NUX0RFVl9JRF9XSUxEQ0FUX1BPSU5UCTB4MzQzOAorI2RlZmluZSBTU1RfREVWX0lEX0JZVAkJCTB4MEYyOAorCisvKiBTdXBwb3J0ZWQgU1NUIERNQSBEZXZpY2VzICovCisjZGVmaW5lIFNTVF9ETUFfVFlQRV9EVwkJMQorCisvKiBhdXRvc3VzcGVuZCBkZWxheSA1cyovCisjZGVmaW5lIFNTVF9SVU5USU1FX1NVU1BFTkRfREVMQVkJKDUgKiAxMDAwKQorCisvKiBTU1QgU2hpbSByZWdpc3RlciBtYXAKKyAqIFRoZSByZWdpc3RlciBuYW1pbmcgY2FuIGRpZmZlciBiZXR3ZWVuIHByb2R1Y3RzLiBTb21lIHByb2R1Y3RzIGFsc28KKyAqIGNvbnRhaW4gZXh0cmEgZnVuY3Rpb25hbGl0eS4KKyAqLworI2RlZmluZSBTU1RfQ1NSCQkJMHgwMAorI2RlZmluZSBTU1RfUElTUgkJMHgwOAorI2RlZmluZSBTU1RfUElNUgkJMHgxMAorI2RlZmluZSBTU1RfSVNSWAkJMHgxOAorI2RlZmluZSBTU1RfSVNSRAkJMHgyMAorI2RlZmluZSBTU1RfSU1SWAkJMHgyOAorI2RlZmluZSBTU1RfSU1SRAkJMHgzMAorI2RlZmluZSBTU1RfSVBDWAkJMHgzOCAvKiBJUEMgSUEgLT4gU1NUICovCisjZGVmaW5lIFNTVF9JUENECQkweDQwIC8qIElQQyBTU1QgLT4gSUEgKi8KKyNkZWZpbmUgU1NUX0lTUlNDCQkweDQ4CisjZGVmaW5lIFNTVF9JU1JMUEVTQwkJMHg1MAorI2RlZmluZSBTU1RfSU1SU0MJCTB4NTgKKyNkZWZpbmUgU1NUX0lNUkxQRVNDCQkweDYwCisjZGVmaW5lIFNTVF9JUENTQwkJMHg2OAorI2RlZmluZSBTU1RfSVBDTFBFU0MJCTB4NzAKKyNkZWZpbmUgU1NUX0NMS0NUTAkJMHg3OAorI2RlZmluZSBTU1RfQ1NSMgkJMHg4MAorI2RlZmluZSBTU1RfTFRSQwkJMHhFMAorI2RlZmluZSBTU1RfSE1EQwkJMHhFOAorCisjZGVmaW5lIFNTVF9TSElNX0JFR0lOCQlTU1RfQ1NSCisjZGVmaW5lIFNTVF9TSElNX0VORAkJU1NUX0hETUMKKworI2RlZmluZSBTU1RfREJHTwkJMHhGMAorCisjZGVmaW5lIFNTVF9TSElNX1NJWkUJCTB4MTAwCisjZGVmaW5lIFNTVF9QV01DVFJMICAgICAgICAgICAgIDB4MTAwMAorCisvKiBTU1QgU2hpbSBSZWdpc3RlciBiaXRzCisgKiBUaGUgcmVnaXN0ZXIgYml0IG5hbWluZyBjYW4gZGlmZmVyIGJldHdlZW4gcHJvZHVjdHMuIFNvbWUgcHJvZHVjdHMgYWxzbworICogY29udGFpbiBleHRyYSBmdW5jdGlvbmFsaXR5LgorICovCisKKy8qIENTUiAvIENTICovCisjZGVmaW5lIFNTVF9DU1JfUlNUCQkoMHgxIDw8IDEpCisjZGVmaW5lIFNTVF9DU1JfU0JDUzAJCSgweDEgPDwgMikKKyNkZWZpbmUgU1NUX0NTUl9TQkNTMQkJKDB4MSA8PCAzKQorI2RlZmluZSBTU1RfQ1NSX0RDUyh4KQkJKHggPDwgNCkKKyNkZWZpbmUgU1NUX0NTUl9EQ1NfTUFTSwkoMHg3IDw8IDQpCisjZGVmaW5lIFNTVF9DU1JfU1RBTEwJCSgweDEgPDwgMTApCisjZGVmaW5lIFNTVF9DU1JfUzBJT0NTCQkoMHgxIDw8IDIxKQorI2RlZmluZSBTU1RfQ1NSX1MxSU9DUwkJKDB4MSA8PCAyMykKKyNkZWZpbmUgU1NUX0NTUl9MUENTCQkoMHgxIDw8IDMxKQorI2RlZmluZSBTU1RfQ1NSXzI0TUhaX0xQQ1MJKFNTVF9DU1JfU0JDUzAgfCBTU1RfQ1NSX1NCQ1MxIHwgU1NUX0NTUl9MUENTKQorI2RlZmluZSBTU1RfQ1NSXzI0TUhaX05PX0xQQ1MJKFNTVF9DU1JfU0JDUzAgfCBTU1RfQ1NSX1NCQ1MxKQorI2RlZmluZSBTU1RfQllUX0NTUl9SU1QJCSgweDEgPDwgMCkKKyNkZWZpbmUgU1NUX0JZVF9DU1JfVkVDVE9SX1NFTAkoMHgxIDw8IDEpCisjZGVmaW5lIFNTVF9CWVRfQ1NSX1NUQUxMCSgweDEgPDwgMikKKyNkZWZpbmUgU1NUX0JZVF9DU1JfUFdBSVRNT0RFCSgweDEgPDwgMykKKworLyogIElTUlggLyBJU0MgKi8KKyNkZWZpbmUgU1NUX0lTUlhfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSVNSWF9ET05FCQkoMHgxIDw8IDApCisjZGVmaW5lIFNTVF9CWVRfSVNSWF9SRVFVRVNUCSgweDEgPDwgMSkKKworLyogIElTUkQgLyBJU0QgKi8KKyNkZWZpbmUgU1NUX0lTUkRfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSVNSRF9ET05FCQkoMHgxIDw8IDApCisKKy8qIElNUlggLyBJTUMgKi8KKyNkZWZpbmUgU1NUX0lNUlhfQlVTWQkJKDB4MSA8PCAxKQorI2RlZmluZSBTU1RfSU1SWF9ET05FCQkoMHgxIDw8IDApCisjZGVmaW5lIFNTVF9CWVRfSU1SWF9SRVFVRVNUCSgweDEgPDwgMSkKKworLyogSU1SRCAvIElNRCAqLworI2RlZmluZSBTU1RfSU1SRF9ET05FCQkoMHgxIDw8IDApCisjZGVmaW5lIFNTVF9JTVJEX0JVU1kJCSgweDEgPDwgMSkKKyNkZWZpbmUgU1NUX0lNUkRfU1NQMAkJKDB4MSA8PCAxNikKKyNkZWZpbmUgU1NUX0lNUkRfRE1BQzAJCSgweDEgPDwgMjEpCisjZGVmaW5lIFNTVF9JTVJEX0RNQUMxCQkoMHgxIDw8IDIyKQorI2RlZmluZSBTU1RfSU1SRF9ETUFDCQkoU1NUX0lNUkRfRE1BQzAgfCBTU1RfSU1SRF9ETUFDMSkKKworLyogIElQQ1ggLyBJUENDICovCisjZGVmaW5lCVNTVF9JUENYX0RPTkUJCSgweDEgPDwgMzApCisjZGVmaW5lCVNTVF9JUENYX0JVU1kJCSgweDEgPDwgMzEpCisjZGVmaW5lIFNTVF9CWVRfSVBDWF9ET05FCSgodTY0KTB4MSA8PCA2MikKKyNkZWZpbmUgU1NUX0JZVF9JUENYX0JVU1kJKCh1NjQpMHgxIDw8IDYzKQorCisvKiAgSVBDRCAqLworI2RlZmluZQlTU1RfSVBDRF9ET05FCQkoMHgxIDw8IDMwKQorI2RlZmluZQlTU1RfSVBDRF9CVVNZCQkoMHgxIDw8IDMxKQorI2RlZmluZSBTU1RfQllUX0lQQ0RfRE9ORQkoKHU2NCkweDEgPDwgNjIpCisjZGVmaW5lIFNTVF9CWVRfSVBDRF9CVVNZCSgodTY0KTB4MSA8PCA2MykKKworLyogQ0xLQ1RMICovCisjZGVmaW5lIFNTVF9DTEtDVExfU01PUyh4KQkoeCA8PCAyNCkKKyNkZWZpbmUgU1NUX0NMS0NUTF9NQVNLCQkoMyA8PCAyNCkKKyNkZWZpbmUgU1NUX0NMS0NUTF9EQ1BMQ0cJKDEgPDwgMTgpCisjZGVmaW5lIFNTVF9DTEtDVExfU0NPRTEJKDEgPDwgMTcpCisjZGVmaW5lIFNTVF9DTEtDVExfU0NPRTAJKDEgPDwgMTYpCisKKy8qIENTUjIgLyBDUzIgKi8KKyNkZWZpbmUgU1NUX0NTUjJfU0RGRF9TU1AwCSgxIDw8IDEpCisjZGVmaW5lIFNTVF9DU1IyX1NERkRfU1NQMQkoMSA8PCAyKQorCisvKiBMVFJDICovCisjZGVmaW5lIFNTVF9MVFJDX1ZBTCh4KQkJKHggPDwgMCkKKworLyogSE1EQyAqLworI2RlZmluZSBTU1RfSE1EQ19IRERBMCh4KQkoeCA8PCAwKQorI2RlZmluZSBTU1RfSE1EQ19IRERBMSh4KQkoeCA8PCA3KQorI2RlZmluZSBTU1RfSE1EQ19IRERBX0UwX0NIMAkxCisjZGVmaW5lIFNTVF9ITURDX0hEREFfRTBfQ0gxCTIKKyNkZWZpbmUgU1NUX0hNRENfSEREQV9FMF9DSDIJNAorI2RlZmluZSBTU1RfSE1EQ19IRERBX0UwX0NIMwk4CisjZGVmaW5lIFNTVF9ITURDX0hEREFfRTFfQ0gwCVNTVF9ITURDX0hEREExKFNTVF9ITURDX0hEREFfRTBfQ0gwKQorI2RlZmluZSBTU1RfSE1EQ19IRERBX0UxX0NIMQlTU1RfSE1EQ19IRERBMShTU1RfSE1EQ19IRERBX0UwX0NIMSkKKyNkZWZpbmUgU1NUX0hNRENfSEREQV9FMV9DSDIJU1NUX0hNRENfSEREQTEoU1NUX0hNRENfSEREQV9FMF9DSDIpCisjZGVmaW5lIFNTVF9ITURDX0hEREFfRTFfQ0gzCVNTVF9ITURDX0hEREExKFNTVF9ITURDX0hEREFfRTBfQ0gzKQorI2RlZmluZSBTU1RfSE1EQ19IRERBX0UwX0FMTENICShTU1RfSE1EQ19IRERBX0UwX0NIMCB8IFNTVF9ITURDX0hEREFfRTBfQ0gxIHwgXAorCQkJCSBTU1RfSE1EQ19IRERBX0UwX0NIMiB8IFNTVF9ITURDX0hEREFfRTBfQ0gzKQorI2RlZmluZSBTU1RfSE1EQ19IRERBX0UxX0FMTENICShTU1RfSE1EQ19IRERBX0UxX0NIMCB8IFNTVF9ITURDX0hEREFfRTFfQ0gxIHwgXAorCQkJCSBTU1RfSE1EQ19IRERBX0UxX0NIMiB8IFNTVF9ITURDX0hEREFfRTFfQ0gzKQorCisKKy8qIFNTVCBWZW5kb3IgRGVmaW5lZCBSZWdpc3RlcnMgYW5kIGJpdHMgKi8KKyNkZWZpbmUgU1NUX1ZEUlRDVEwwCQkweGEwCisjZGVmaW5lIFNTVF9WRFJUQ1RMMQkJMHhhNAorI2RlZmluZSBTU1RfVkRSVENUTDIJCTB4YTgKKyNkZWZpbmUgU1NUX1ZEUlRDVEwzCQkweGFDCisKKy8qIFZEUlRDVEwwICovCisjZGVmaW5lIFNTVF9WRFJUQ0wwX0QzUEdECQkoMSA8PCAwKQorI2RlZmluZSBTU1RfVkRSVENMMF9EM1NSQU1QR0QJCSgxIDw8IDEpCisjZGVmaW5lIFNTVF9WRFJUQ0wwX0RTUkFNUEdFX1NISUZUCTEyCisjZGVmaW5lIFNTVF9WRFJUQ0wwX0RTUkFNUEdFX01BU0sJKDB4ZmZmZmYgPDwgU1NUX1ZEUlRDTDBfRFNSQU1QR0VfU0hJRlQpCisjZGVmaW5lIFNTVF9WRFJUQ0wwX0lTUkFNUEdFX1NISUZUCTIKKyNkZWZpbmUgU1NUX1ZEUlRDTDBfSVNSQU1QR0VfTUFTSwkoMHgzZmYgPDwgU1NUX1ZEUlRDTDBfSVNSQU1QR0VfU0hJRlQpCisKKy8qIFZEUlRDVEwyICovCisjZGVmaW5lIFNTVF9WRFJUQ0wyX0RDTENHRQkJKDEgPDwgMSkKKyNkZWZpbmUgU1NUX1ZEUlRDTDJfRFRDR0UJCSgxIDw8IDEwKQorI2RlZmluZSBTU1RfVkRSVENMMl9BUExMU0VfTUFTSwkJKDEgPDwgMzEpCisKKy8qIFBNQ1MgKi8KKyNkZWZpbmUgU1NUX1BNQ1MJCTB4ODQKKyNkZWZpbmUgU1NUX1BNQ1NfUFNfTUFTSwkweDMKKworc3RydWN0IHNzdF9kc3A7CisKKy8qCisgKiBTU1QgRGV2aWNlLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHBvcHVsYXRlZCBieSB0aGUgU1NUIGNvcmUgZHJpdmVyLgorICovCitzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgeworCS8qIE1hbmRhdG9yeSBmaWVsZHMgKi8KKwlzdHJ1Y3Qgc3N0X29wcyAqb3BzOworCWlycXJldHVybl90ICgqdGhyZWFkKShpbnQgaXJxLCB2b2lkICpjb250ZXh0KTsKKwl2b2lkICp0aHJlYWRfY29udGV4dDsKK307CisKKy8qCisgKiBTU1QgUGxhdGZvcm0gRGF0YS4KKyAqLworc3RydWN0IHNzdF9wZGF0YSB7CisJLyogQUNQSSBkYXRhICovCisJdTMyIGxwZV9iYXNlOworCXUzMiBscGVfc2l6ZTsKKwl1MzIgcGNpY2ZnX2Jhc2U7CisJdTMyIHBjaWNmZ19zaXplOworCXUzMiBmd19iYXNlOworCXUzMiBmd19zaXplOworCWludCBpcnE7CisKKwkvKiBGaXJtd2FyZSAqLworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisKKwkvKiBETUEgKi8KKwlpbnQgcmVzaW5kZXhfZG1hX2Jhc2U7IC8qIG90aGVyIGZpZWxkcyBpbnZhbGlkIGlmIGVxdWFscyB0byAtMSAqLworCXUzMiBkbWFfYmFzZTsKKwl1MzIgZG1hX3NpemU7CisJaW50IGRtYV9lbmdpbmU7CisJc3RydWN0IGRldmljZSAqZG1hX2RldjsKKworCS8qIERTUCAqLworCXUzMiBpZDsKKwl2b2lkICpkc3A7Cit9OworCisvKiBJbml0aWFsaXphdGlvbiAqLworc3RydWN0IHNzdF9kc3AgKnNzdF9kc3BfbmV3KHN0cnVjdCBkZXZpY2UgKmRldiwKKwlzdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgKnNzdF9kZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKTsKK3ZvaWQgc3N0X2RzcF9mcmVlKHN0cnVjdCBzc3RfZHNwICpzc3QpOworCisvKiBTSElNIFJlYWQgLyBXcml0ZSAqLwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGUoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKTsKK3UzMiBzc3RfZHNwX3NoaW1fcmVhZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KTsKK2ludCBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHMoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQl1MzIgbWFzaywgdTMyIHZhbHVlKTsKK3ZvaWQgc3N0X2RzcF9zaGltX3dyaXRlNjQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwgdTY0IHZhbHVlKTsKK3U2NCBzc3RfZHNwX3NoaW1fcmVhZDY0KHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQpOworaW50IHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0KHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsCisJCQkJdTY0IG1hc2ssIHU2NCB2YWx1ZSk7CisKKy8qIFNISU0gUmVhZCAvIFdyaXRlIFVubG9ja2VkIGZvciBjYWxsZXJzIGFscmVhZHkgaG9sZGluZyBzc3QgbG9jayAqLwordm9pZCBzc3RfZHNwX3NoaW1fd3JpdGVfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKTsKK3UzMiBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KTsKK2ludCBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwKKwkJCQl1MzIgbWFzaywgdTMyIHZhbHVlKTsKK3ZvaWQgc3N0X2RzcF9zaGltX3dyaXRlNjRfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCwgdTY0IHZhbHVlKTsKK3U2NCBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQpOworaW50IHNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0X3VubG9ja2VkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsCisJCQkJCXU2NCBtYXNrLCB1NjQgdmFsdWUpOworCisvKiBJbnRlcm5hbCBnZW5lcmljIGxvdy1sZXZlbCBTU1QgSU8gZnVuY3Rpb25zIC0gY2FuIGJlIG92ZXJpZGRlbiAqLwordm9pZCBzc3Rfc2hpbTMyX3dyaXRlKHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKTsKK3UzMiBzc3Rfc2hpbTMyX3JlYWQodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0KTsKK3ZvaWQgc3N0X3NoaW0zMl93cml0ZTY0KHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCwgdTY0IHZhbHVlKTsKK3U2NCBzc3Rfc2hpbTMyX3JlYWQ2NCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpOwordm9pZCBzc3RfbWVtY3B5X3RvaW9fMzIoc3RydWN0IHNzdF9kc3AgKnNzdCwKKwkJCXZvaWQgX19pb21lbSAqZGVzdCwgdm9pZCAqc3JjLCBzaXplX3QgYnl0ZXMpOwordm9pZCBzc3RfbWVtY3B5X2Zyb21pb18zMihzdHJ1Y3Qgc3N0X2RzcCAqc3N0LAorCQkJICB2b2lkICpkZXN0LCB2b2lkIF9faW9tZW0gKnNyYywgc2l6ZV90IGJ5dGVzKTsKKworLyogRFNQIHJlc2V0ICYgYm9vdCAqLwordm9pZCBzc3RfZHNwX3Jlc2V0KHN0cnVjdCBzc3RfZHNwICpzc3QpOworaW50IHNzdF9kc3BfYm9vdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KTsKK2ludCBzc3RfZHNwX3dha2Uoc3RydWN0IHNzdF9kc3AgKnNzdCk7Cit2b2lkIHNzdF9kc3Bfc2xlZXAoc3RydWN0IHNzdF9kc3AgKnNzdCk7Cit2b2lkIHNzdF9kc3Bfc3RhbGwoc3RydWN0IHNzdF9kc3AgKnNzdCk7CisKKy8qIERNQSAqLworaW50IHNzdF9kc3BfZG1hX2dldF9jaGFubmVsKHN0cnVjdCBzc3RfZHNwICpkc3AsIGludCBjaGFuX2lkKTsKK3ZvaWQgc3N0X2RzcF9kbWFfcHV0X2NoYW5uZWwoc3RydWN0IHNzdF9kc3AgKmRzcCk7CitpbnQgc3N0X2RzcF9kbWFfY29weWZyb20oc3RydWN0IHNzdF9kc3AgKnNzdCwgZG1hX2FkZHJfdCBkZXN0X2FkZHIsCisJZG1hX2FkZHJfdCBzcmNfYWRkciwgc2l6ZV90IHNpemUpOworaW50IHNzdF9kc3BfZG1hX2NvcHl0byhzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBkbWFfYWRkcl90IGRlc3RfYWRkciwKKwlkbWFfYWRkcl90IHNyY19hZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qIE1zZyBJTyAqLwordm9pZCBzc3RfZHNwX2lwY19tc2dfdHgoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIG1zZyk7Cit1MzIgc3N0X2RzcF9pcGNfbXNnX3J4KHN0cnVjdCBzc3RfZHNwICpkc3ApOworCisvKiBNYWlsYm94IG1hbmFnZW1lbnQgKi8KK2ludCBzc3RfZHNwX21haWxib3hfaW5pdChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgaW5ib3hfb2Zmc2V0LAorCXNpemVfdCBpbmJveF9zaXplLCB1MzIgb3V0Ym94X29mZnNldCwgc2l6ZV90IG91dGJveF9zaXplKTsKK3ZvaWQgc3N0X2RzcF9pbmJveF93cml0ZShzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB2b2lkICptZXNzYWdlLCBzaXplX3QgYnl0ZXMpOwordm9pZCBzc3RfZHNwX2luYm94X3JlYWQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKTsKK3ZvaWQgc3N0X2RzcF9vdXRib3hfd3JpdGUoc3RydWN0IHNzdF9kc3AgKmRzcCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKTsKK3ZvaWQgc3N0X2RzcF9vdXRib3hfcmVhZChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB2b2lkICptZXNzYWdlLCBzaXplX3QgYnl0ZXMpOwordm9pZCBzc3RfZHNwX21haWxib3hfZHVtcChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCBzaXplX3QgYnl0ZXMpOworCisvKiBEZWJ1ZyAqLwordm9pZCBzc3RfZHNwX2R1bXAoc3RydWN0IHNzdF9kc3AgKnNzdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2NvbW1vbi9zc3QtZmlybXdhcmUuYyBiL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWZpcm13YXJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjY2E2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWZpcm13YXJlLmMKQEAgLTAsMCArMSwxMjA1IEBACisvKgorICogSW50ZWwgU1NUIEZpcm13YXJlIExvYWRlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKworLyogc3VwcG9ydGVkIERNQSBlbmdpbmUgZHJpdmVycyAqLworI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RhdGEvZG1hLWR3Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hL2R3Lmg+CisKKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisKKyNpbmNsdWRlICJzc3QtZHNwLmgiCisjaW5jbHVkZSAic3N0LWRzcC1wcml2LmgiCisKKyNkZWZpbmUgU1NUX0RNQV9SRVNPVVJDRVMJMgorI2RlZmluZSBTU1RfRFNQX0RNQV9NQVhfQlVSU1QJMHgzCisjZGVmaW5lIFNTVF9IU1dfQkxPQ0tfQU5ZCTB4ZmZmZmZmZmYKKworI2RlZmluZSBTU1RfSFNXX01BU0tfRE1BX0FERFJfRFNQIDB4ZmZmMDAwMDAKKworc3RydWN0IHNzdF9kbWEgeworCXN0cnVjdCBzc3RfZHNwICpzc3Q7CisKKwlzdHJ1Y3QgZHdfZG1hX2NoaXAgKmNoaXA7CisKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CisJc3RydWN0IGRtYV9jaGFuICpjaDsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzc3RfbWVtY3B5MzIodm9sYXRpbGUgdm9pZCBfX2lvbWVtICpkZXN0LCB2b2lkICpzcmMsIHUzMiBieXRlcykKK3sKKwkvKiBfX2lvd3JpdGUzMl9jb3B5IHVzZSAzMmJpdCBzaXplIHZhbHVlcyBzbyBkaXZpZGUgYnkgNCAqLworCV9faW93cml0ZTMyX2NvcHkoKHZvaWQgKilkZXN0LCBzcmMsIGJ5dGVzLzQpOworfQorCitzdGF0aWMgdm9pZCBzc3RfZG1hX3RyYW5zZmVyX2NvbXBsZXRlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gKHN0cnVjdCBzc3RfZHNwICopYXJnOworCisJZGV2X2RiZyhzc3QtPmRldiwgIkRNQTogY2FsbGJhY2tcbiIpOworfQorCitzdGF0aWMgaW50IHNzdF9kc3BfZG1hX2NvcHkoc3RydWN0IHNzdF9kc3AgKnNzdCwgZG1hX2FkZHJfdCBkZXN0X2FkZHIsCisJZG1hX2FkZHJfdCBzcmNfYWRkciwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjOworCXN0cnVjdCBzc3RfZG1hICpkbWEgPSBzc3QtPmRtYTsKKworCWlmIChkbWEtPmNoID09IE5VTEwpIHsKKwkJZGV2X2Vycihzc3QtPmRldiwgImVycm9yOiBubyBETUEgY2hhbm5lbFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRldl9kYmcoc3N0LT5kZXYsICJETUE6IHNyYzogMHglbHggZGVzdCAweCVseCBzaXplICV6dVxuIiwKKwkJKHVuc2lnbmVkIGxvbmcpc3JjX2FkZHIsICh1bnNpZ25lZCBsb25nKWRlc3RfYWRkciwgc2l6ZSk7CisKKwlkZXNjID0gZG1hLT5jaC0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5KGRtYS0+Y2gsIGRlc3RfYWRkciwKKwkJc3JjX2FkZHIsIHNpemUsIERNQV9DVFJMX0FDSyk7CisJaWYgKCFkZXNjKXsKKwkJZGV2X2Vycihzc3QtPmRldiwgImVycm9yOiBkbWEgcHJlcCBtZW1jcHkgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGVzYy0+Y2FsbGJhY2sgPSBzc3RfZG1hX3RyYW5zZmVyX2NvbXBsZXRlOworCWRlc2MtPmNhbGxiYWNrX3BhcmFtID0gc3N0OworCisJZGVzYy0+dHhfc3VibWl0KGRlc2MpOworCWRtYV93YWl0X2Zvcl9hc3luY190eChkZXNjKTsKKworCXJldHVybiAwOworfQorCisvKiBjb3B5IHRvIERTUCAqLworaW50IHNzdF9kc3BfZG1hX2NvcHl0byhzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBkbWFfYWRkcl90IGRlc3RfYWRkciwKKwlkbWFfYWRkcl90IHNyY19hZGRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gc3N0X2RzcF9kbWFfY29weShzc3QsIGRlc3RfYWRkciB8IFNTVF9IU1dfTUFTS19ETUFfQUREUl9EU1AsCisJCQlzcmNfYWRkciwgc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX2RtYV9jb3B5dG8pOworCisvKiBjb3B5IGZyb20gRFNQICovCitpbnQgc3N0X2RzcF9kbWFfY29weWZyb20oc3RydWN0IHNzdF9kc3AgKnNzdCwgZG1hX2FkZHJfdCBkZXN0X2FkZHIsCisJZG1hX2FkZHJfdCBzcmNfYWRkciwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuIHNzdF9kc3BfZG1hX2NvcHkoc3N0LCBkZXN0X2FkZHIsCisJCXNyY19hZGRyIHwgU1NUX0hTV19NQVNLX0RNQV9BRERSX0RTUCwgc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZHNwX2RtYV9jb3B5ZnJvbSk7CisKKy8qIHJlbW92ZSBtb2R1bGUgZnJvbSBtZW1vcnkgLSBjYWxsZXJzIGhvbGQgbG9ja3MgKi8KK3N0YXRpYyB2b2lkIGJsb2NrX2xpc3RfcmVtb3ZlKHN0cnVjdCBzc3RfZHNwICpkc3AsCisJc3RydWN0IGxpc3RfaGVhZCAqYmxvY2tfbGlzdCkKK3sKKwlzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2ssICp0bXA7CisJaW50IGVycjsKKworCS8qIGRpc2FibGUgZWFjaCBibG9jayAgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJsb2NrLCBibG9ja19saXN0LCBtb2R1bGVfbGlzdCkgeworCisJCWlmIChibG9jay0+b3BzICYmIGJsb2NrLT5vcHMtPmRpc2FibGUpIHsKKwkJCWVyciA9IGJsb2NrLT5vcHMtPmRpc2FibGUoYmxvY2spOworCQkJaWYgKGVyciA8IDApCisJCQkJZGV2X2Vycihkc3AtPmRldiwKKwkJCQkJImVycm9yOiBjYW50IGRpc2FibGUgYmxvY2sgJWQ6JWRcbiIsCisJCQkJCWJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgpOworCQl9CisJfQorCisJLyogbWFyayBlYWNoIGJsb2NrIGFzIGZyZWUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgYmxvY2tfbGlzdCwgbW9kdWxlX2xpc3QpIHsKKwkJbGlzdF9kZWwoJmJsb2NrLT5tb2R1bGVfbGlzdCk7CisJCWxpc3RfbW92ZSgmYmxvY2stPmxpc3QsICZkc3AtPmZyZWVfYmxvY2tfbGlzdCk7CisJCWRldl9kYmcoZHNwLT5kZXYsICJibG9jayBmcmVlZCAlZDolZCBhdCBvZmZzZXQgMHgleFxuIiwKKwkJCWJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgsIGJsb2NrLT5vZmZzZXQpOworCX0KK30KKworLyogcHJlcGFyZSB0aGUgbWVtb3J5IGJsb2NrIHRvIHJlY2VpdmUgZGF0YSBmcm9tIGhvc3QgLSBjYWxsZXJzIGhvbGQgbG9ja3MgKi8KK3N0YXRpYyBpbnQgYmxvY2tfbGlzdF9wcmVwYXJlKHN0cnVjdCBzc3RfZHNwICpkc3AsCisJc3RydWN0IGxpc3RfaGVhZCAqYmxvY2tfbGlzdCkKK3sKKwlzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2s7CisJaW50IHJldCA9IDA7CisKKwkvKiBlbmFibGUgZWFjaCBibG9jayBzbyB0aGF0J3MgaXQnZSByZWFkeSBmb3IgZGF0YSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssIGJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7CisKKwkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZW5hYmxlICYmICFibG9jay0+dXNlcnMpIHsKKwkJCXJldCA9IGJsb2NrLT5vcHMtPmVuYWJsZShibG9jayk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoZHNwLT5kZXYsCisJCQkJCSJlcnJvcjogY2FudCBkaXNhYmxlIGJsb2NrICVkOiVkXG4iLAorCQkJCQlibG9jay0+dHlwZSwgYmxvY2stPmluZGV4KTsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmV0OworCitlcnI6CisJbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgYmxvY2tfbGlzdCwgbW9kdWxlX2xpc3QpIHsKKwkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZGlzYWJsZSkKKwkJCWJsb2NrLT5vcHMtPmRpc2FibGUoYmxvY2spOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGR3X2RtYV9wbGF0Zm9ybV9kYXRhIGR3X3BkYXRhID0geworCS5pc19wcml2YXRlID0gMSwKKwkuY2hhbl9hbGxvY2F0aW9uX29yZGVyID0gQ0hBTl9BTExPQ0FUSU9OX0FTQ0VORElORywKKwkuY2hhbl9wcmlvcml0eSA9IENIQU5fUFJJT1JJVFlfQVNDRU5ESU5HLAorfTsKKworc3RhdGljIHN0cnVjdCBkd19kbWFfY2hpcCAqZHdfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcmVzb3VyY2UgKm1lbSwKKwlpbnQgaXJxKQoreworCXN0cnVjdCBkd19kbWFfY2hpcCAqY2hpcDsKKwlpbnQgZXJyOworCisJY2hpcCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOworCWlmICghY2hpcCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwljaGlwLT5pcnEgPSBpcnE7CisJY2hpcC0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZShkZXYsIG1lbSk7CisJaWYgKElTX0VSUihjaGlwLT5yZWdzKSkKKwkJcmV0dXJuIEVSUl9DQVNUKGNoaXAtPnJlZ3MpOworCisJZXJyID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSygzMSkpOworCWlmIChlcnIpCisJCXJldHVybiBFUlJfUFRSKGVycik7CisKKwljaGlwLT5kZXYgPSBkZXY7CisJZXJyID0gZHdfZG1hX3Byb2JlKGNoaXAsICZkd19wZGF0YSk7CisJaWYgKGVycikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworCXJldHVybiBjaGlwOworfQorCitzdGF0aWMgdm9pZCBkd19yZW1vdmUoc3RydWN0IGR3X2RtYV9jaGlwICpjaGlwKQoreworCWR3X2RtYV9yZW1vdmUoY2hpcCk7Cit9CisKK3N0YXRpYyBib29sIGRtYV9jaGFuX2ZpbHRlcihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSAoc3RydWN0IHNzdF9kc3AgKilwYXJhbTsKKworCXJldHVybiBjaGFuLT5kZXZpY2UtPmRldiA9PSBkc3AtPmRtYV9kZXY7Cit9CisKK2ludCBzc3RfZHNwX2RtYV9nZXRfY2hhbm5lbChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCBpbnQgY2hhbl9pZCkKK3sKKwlzdHJ1Y3Qgc3N0X2RtYSAqZG1hID0gZHNwLT5kbWE7CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgc2xhdmU7CisJZG1hX2NhcF9tYXNrX3QgbWFzazsKKwlpbnQgcmV0OworCisJZG1hX2NhcF96ZXJvKG1hc2spOworCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgbWFzayk7CisJZG1hX2NhcF9zZXQoRE1BX01FTUNQWSwgbWFzayk7CisKKwlkbWEtPmNoID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBkbWFfY2hhbl9maWx0ZXIsIGRzcCk7CisJaWYgKGRtYS0+Y2ggPT0gTlVMTCkgeworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IERNQSByZXF1ZXN0IGNoYW5uZWwgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbWVtc2V0KCZzbGF2ZSwgMCwgc2l6ZW9mKHNsYXZlKSk7CisJc2xhdmUuZGlyZWN0aW9uID0gRE1BX01FTV9UT19ERVY7CisJc2xhdmUuc3JjX2FkZHJfd2lkdGggPQorCQlzbGF2ZS5kc3RfYWRkcl93aWR0aCA9IERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOworCXNsYXZlLnNyY19tYXhidXJzdCA9IHNsYXZlLmRzdF9tYXhidXJzdCA9IFNTVF9EU1BfRE1BX01BWF9CVVJTVDsKKworCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoZG1hLT5jaCwgJnNsYXZlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogdW5hYmxlIHRvIHNldCBETUEgc2xhdmUgY29uZmlnICVkXG4iLAorCQkJcmV0KTsKKwkJZG1hX3JlbGVhc2VfY2hhbm5lbChkbWEtPmNoKTsKKwkJZG1hLT5jaCA9IE5VTEw7CisJfQorCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3BfZG1hX2dldF9jaGFubmVsKTsKKwordm9pZCBzc3RfZHNwX2RtYV9wdXRfY2hhbm5lbChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKQoreworCXN0cnVjdCBzc3RfZG1hICpkbWEgPSBkc3AtPmRtYTsKKworCWlmICghZG1hLT5jaCkKKwkJcmV0dXJuOworCisJZG1hX3JlbGVhc2VfY2hhbm5lbChkbWEtPmNoKTsKKwlkbWEtPmNoID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3BfZG1hX3B1dF9jaGFubmVsKTsKKworaW50IHNzdF9kbWFfbmV3KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gc3N0LT5wZGF0YTsKKwlzdHJ1Y3Qgc3N0X2RtYSAqZG1hOworCXN0cnVjdCByZXNvdXJjZSBtZW07CisJY29uc3QgY2hhciAqZG1hX2Rldl9uYW1lOworCWludCByZXQgPSAwOworCisJaWYgKHNzdC0+cGRhdGEtPnJlc2luZGV4X2RtYV9iYXNlID09IC0xKQorCQkvKiBETUEgaXMgbm90IHVzZWQsIHJldHVybiBhbmQgc3F1ZWxzaCBlcnJvciBtZXNzYWdlcyAqLworCQlyZXR1cm4gMDsKKworCS8qIGNvbmZpZ3VyZSB0aGUgY29ycmVjdCBwbGF0Zm9ybSBkYXRhIGZvciB3aGF0ZXZlciBETUEgZW5naW5lCisJKiBpcyBhdHRhY2hlZCB0byB0aGUgQURTUCBJUC4gKi8KKwlzd2l0Y2ggKHNzdC0+cGRhdGEtPmRtYV9lbmdpbmUpIHsKKwljYXNlIFNTVF9ETUFfVFlQRV9EVzoKKwkJZG1hX2Rldl9uYW1lID0gImR3X2RtYWMiOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHNzdC0+ZGV2LCAiZXJyb3I6IGludmFsaWQgRE1BIGVuZ2luZSAlZFxuIiwKKwkJCXNzdC0+cGRhdGEtPmRtYV9lbmdpbmUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkbWEgPSBkZXZtX2t6YWxsb2Moc3N0LT5kZXYsIHNpemVvZihzdHJ1Y3Qgc3N0X2RtYSksIEdGUF9LRVJORUwpOworCWlmICghZG1hKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRtYS0+c3N0ID0gc3N0OworCisJbWVtc2V0KCZtZW0sIDAsIHNpemVvZihtZW0pKTsKKworCW1lbS5zdGFydCA9IHNzdC0+YWRkci5scGVfYmFzZSArIHNzdF9wZGF0YS0+ZG1hX2Jhc2U7CisJbWVtLmVuZCAgID0gc3N0LT5hZGRyLmxwZV9iYXNlICsgc3N0X3BkYXRhLT5kbWFfYmFzZSArIHNzdF9wZGF0YS0+ZG1hX3NpemUgLSAxOworCW1lbS5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCisJLyogbm93IHJlZ2lzdGVyIERNQSBlbmdpbmUgZGV2aWNlICovCisJZG1hLT5jaGlwID0gZHdfcHJvYmUoc3N0LT5kbWFfZGV2LCAmbWVtLCBzc3RfcGRhdGEtPmlycSk7CisJaWYgKElTX0VSUihkbWEtPmNoaXApKSB7CisJCWRldl9lcnIoc3N0LT5kZXYsICJlcnJvcjogRE1BIGRldmljZSByZWdpc3RlciBmYWlsZWRcbiIpOworCQlyZXQgPSBQVFJfRVJSKGRtYS0+Y2hpcCk7CisJCWdvdG8gZXJyX2RtYV9kZXY7CisJfQorCisJc3N0LT5kbWEgPSBkbWE7CisJc3N0LT5md191c2VfZG1hID0gdHJ1ZTsKKwlyZXR1cm4gMDsKKworZXJyX2RtYV9kZXY6CisJZGV2bV9rZnJlZShzc3QtPmRldiwgZG1hKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzc3RfZG1hX25ldyk7CisKK3ZvaWQgc3N0X2RtYV9mcmVlKHN0cnVjdCBzc3RfZG1hICpkbWEpCit7CisKKwlpZiAoZG1hID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChkbWEtPmNoKQorCQlkbWFfcmVsZWFzZV9jaGFubmVsKGRtYS0+Y2gpOworCisJaWYgKGRtYS0+Y2hpcCkKKwkJZHdfcmVtb3ZlKGRtYS0+Y2hpcCk7CisKK30KK0VYUE9SVF9TWU1CT0woc3N0X2RtYV9mcmVlKTsKKworLyogY3JlYXRlIG5ldyBnZW5lcmljIGZpcm13YXJlIG9iamVjdCAqLworc3RydWN0IHNzdF9mdyAqc3N0X2Z3X25ldyhzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCAKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LCB2b2lkICpwcml2YXRlKQoreworCXN0cnVjdCBzc3RfZncgKnNzdF9mdzsKKwlpbnQgZXJyOworCisJaWYgKCFkc3AtPm9wcy0+cGFyc2VfZncpCisJCXJldHVybiBOVUxMOworCisJc3N0X2Z3ID0ga3phbGxvYyhzaXplb2YoKnNzdF9mdyksIEdGUF9LRVJORUwpOworCWlmIChzc3RfZncgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzc3RfZnctPmRzcCA9IGRzcDsKKwlzc3RfZnctPnByaXZhdGUgPSBwcml2YXRlOworCXNzdF9mdy0+c2l6ZSA9IGZ3LT5zaXplOworCisJLyogYWxsb2NhdGUgRE1BIGJ1ZmZlciB0byBzdG9yZSBGVyBkYXRhICovCisJc3N0X2Z3LT5kbWFfYnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KGRzcC0+ZG1hX2Rldiwgc3N0X2Z3LT5zaXplLAorCQkJCSZzc3RfZnctPmRtYWJsZV9md19wYWRkciwgR0ZQX0RNQSB8IEdGUF9LRVJORUwpOworCWlmICghc3N0X2Z3LT5kbWFfYnVmKSB7CisJCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogRE1BIGFsbG9jIGZhaWxlZFxuIik7CisJCWtmcmVlKHNzdF9mdyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIGNvcHkgRlcgZGF0YSB0byBETUEtYWJsZSBtZW1vcnkgKi8KKwltZW1jcHkoKHZvaWQgKilzc3RfZnctPmRtYV9idWYsICh2b2lkICopZnctPmRhdGEsIGZ3LT5zaXplKTsKKworCWlmIChkc3AtPmZ3X3VzZV9kbWEpIHsKKwkJZXJyID0gc3N0X2RzcF9kbWFfZ2V0X2NoYW5uZWwoZHNwLCAwKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGNoYW5fZXJyOworCX0KKworCS8qIGNhbGwgY29yZSBzcGVjaWZpYyBGVyBwYXNlciB0byBsb2FkIEZXIGRhdGEgaW50byBEU1AgKi8KKwllcnIgPSBkc3AtPm9wcy0+cGFyc2VfZncoc3N0X2Z3KTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IHBhcnNlIGZ3IGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZ290byBwYXJzZV9lcnI7CisJfQorCisJaWYgKGRzcC0+ZndfdXNlX2RtYSkKKwkJc3N0X2RzcF9kbWFfcHV0X2NoYW5uZWwoZHNwKTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZzc3RfZnctPmxpc3QsICZkc3AtPmZ3X2xpc3QpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisKKwlyZXR1cm4gc3N0X2Z3OworCitwYXJzZV9lcnI6CisJaWYgKGRzcC0+ZndfdXNlX2RtYSkKKwkJc3N0X2RzcF9kbWFfcHV0X2NoYW5uZWwoZHNwKTsKK2NoYW5fZXJyOgorCWRtYV9mcmVlX2NvaGVyZW50KGRzcC0+ZG1hX2Rldiwgc3N0X2Z3LT5zaXplLAorCQkJCXNzdF9mdy0+ZG1hX2J1ZiwKKwkJCQlzc3RfZnctPmRtYWJsZV9md19wYWRkcik7CisJc3N0X2Z3LT5kbWFfYnVmID0gTlVMTDsKKwlrZnJlZShzc3RfZncpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2Z3X25ldyk7CisKK2ludCBzc3RfZndfcmVsb2FkKHN0cnVjdCBzc3RfZncgKnNzdF9mdykKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X2Z3LT5kc3A7CisJaW50IHJldDsKKworCWRldl9kYmcoZHNwLT5kZXYsICJyZWxvYWRpbmcgZmlybXdhcmVcbiIpOworCisJLyogY2FsbCBjb3JlIHNwZWNpZmljIEZXIHBhc2VyIHRvIGxvYWQgRlcgZGF0YSBpbnRvIERTUCAqLworCXJldCA9IGRzcC0+b3BzLT5wYXJzZV9mdyhzc3RfZncpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IHBhcnNlIGZ3IGZhaWxlZCAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZndfcmVsb2FkKTsKKwordm9pZCBzc3RfZndfdW5sb2FkKHN0cnVjdCBzc3RfZncgKnNzdF9mdykKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X2Z3LT5kc3A7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSwgKm10bXA7CisJc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZSwgKnJ0bXA7CisKKwlkZXZfZGJnKGRzcC0+ZGV2LCAidW5sb2FkaW5nIGZpcm13YXJlXG4iKTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCisJLyogY2hlY2sgbW9kdWxlIGJ5IG1vZHVsZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtb2R1bGUsIG10bXAsICZkc3AtPm1vZHVsZV9saXN0LCBsaXN0KSB7CisJCWlmIChtb2R1bGUtPnNzdF9mdyA9PSBzc3RfZncpIHsKKworCQkJLyogcmVtb3ZlIHJ1bnRpbWUgbW9kdWxlcyAqLworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJ1bnRpbWUsIHJ0bXAsICZtb2R1bGUtPnJ1bnRpbWVfbGlzdCwgbGlzdCkgeworCisJCQkJYmxvY2tfbGlzdF9yZW1vdmUoZHNwLCAmcnVudGltZS0+YmxvY2tfbGlzdCk7CisJCQkJbGlzdF9kZWwoJnJ1bnRpbWUtPmxpc3QpOworCQkJCWtmcmVlKHJ1bnRpbWUpOworCQkJfQorCisJCQkvKiBub3cgcmVtb3ZlIHRoZSBtb2R1bGUgKi8KKwkJCWJsb2NrX2xpc3RfcmVtb3ZlKGRzcCwgJm1vZHVsZS0+YmxvY2tfbGlzdCk7CisJCQlsaXN0X2RlbCgmbW9kdWxlLT5saXN0KTsKKwkJCWtmcmVlKG1vZHVsZSk7CisJCX0KKwl9CisKKwkvKiByZW1vdmUgYWxsIHNjcmF0Y2ggYmxvY2tzICovCisJYmxvY2tfbGlzdF9yZW1vdmUoZHNwLCAmZHNwLT5zY3JhdGNoX2Jsb2NrX2xpc3QpOworCisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9md191bmxvYWQpOworCisvKiBmcmVlIHNpbmdsZSBmaXJtd2FyZSBvYmplY3QgKi8KK3ZvaWQgc3N0X2Z3X2ZyZWUoc3RydWN0IHNzdF9mdyAqc3N0X2Z3KQoreworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfZnctPmRzcDsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfZGVsKCZzc3RfZnctPmxpc3QpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisKKwlpZiAoc3N0X2Z3LT5kbWFfYnVmKQorCQlkbWFfZnJlZV9jb2hlcmVudChkc3AtPmRtYV9kZXYsIHNzdF9mdy0+c2l6ZSwgc3N0X2Z3LT5kbWFfYnVmLAorCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIpOworCWtmcmVlKHNzdF9mdyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZndfZnJlZSk7CisKKy8qIGZyZWUgYWxsIGZpcm13YXJlIG9iamVjdHMgKi8KK3ZvaWQgc3N0X2Z3X2ZyZWVfYWxsKHN0cnVjdCBzc3RfZHNwICpkc3ApCit7CisJc3RydWN0IHNzdF9mdyAqc3N0X2Z3LCAqdDsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzc3RfZncsIHQsICZkc3AtPmZ3X2xpc3QsIGxpc3QpIHsKKworCQlsaXN0X2RlbCgmc3N0X2Z3LT5saXN0KTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kZXYsIHNzdF9mdy0+c2l6ZSwgc3N0X2Z3LT5kbWFfYnVmLAorCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIpOworCQlrZnJlZShzc3RfZncpOworCX0KKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2Z3X2ZyZWVfYWxsKTsKKworLyogY3JlYXRlIGEgbmV3IFNTVCBnZW5lcmljIG1vZHVsZSBmcm9tIEZXIHRlbXBsYXRlICovCitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9uZXcoc3RydWN0IHNzdF9mdyAqc3N0X2Z3LAorCXN0cnVjdCBzc3RfbW9kdWxlX3RlbXBsYXRlICp0ZW1wbGF0ZSwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X2Z3LT5kc3A7CisJc3RydWN0IHNzdF9tb2R1bGUgKnNzdF9tb2R1bGU7CisKKwlzc3RfbW9kdWxlID0ga3phbGxvYyhzaXplb2YoKnNzdF9tb2R1bGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3N0X21vZHVsZSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXNzdF9tb2R1bGUtPmlkID0gdGVtcGxhdGUtPmlkOworCXNzdF9tb2R1bGUtPmRzcCA9IGRzcDsKKwlzc3RfbW9kdWxlLT5zc3RfZncgPSBzc3RfZnc7CisJc3N0X21vZHVsZS0+c2NyYXRjaF9zaXplID0gdGVtcGxhdGUtPnNjcmF0Y2hfc2l6ZTsKKwlzc3RfbW9kdWxlLT5wZXJzaXN0ZW50X3NpemUgPSB0ZW1wbGF0ZS0+cGVyc2lzdGVudF9zaXplOworCXNzdF9tb2R1bGUtPmVudHJ5ID0gdGVtcGxhdGUtPmVudHJ5OworCXNzdF9tb2R1bGUtPnN0YXRlID0gU1NUX01PRFVMRV9TVEFURV9VTkxPQURFRDsKKworCUlOSVRfTElTVF9IRUFEKCZzc3RfbW9kdWxlLT5ibG9ja19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmc3N0X21vZHVsZS0+cnVudGltZV9saXN0KTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZzc3RfbW9kdWxlLT5saXN0LCAmZHNwLT5tb2R1bGVfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKworCXJldHVybiBzc3RfbW9kdWxlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9uZXcpOworCisvKiBmcmVlIGZpcm13YXJlIG1vZHVsZSBhbmQgcmVtb3ZlIGZyb20gYXZhaWxhYmxlIGxpc3QgKi8KK3ZvaWQgc3N0X21vZHVsZV9mcmVlKHN0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlKQoreworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfbW9kdWxlLT5kc3A7CisKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKwlsaXN0X2RlbCgmc3N0X21vZHVsZS0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKworCWtmcmVlKHNzdF9tb2R1bGUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9mcmVlKTsKKworc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqc3N0X21vZHVsZV9ydW50aW1lX25ldyhzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlLAorCWludCBpZCwgdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gbW9kdWxlLT5kc3A7CisJc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZTsKKworCXJ1bnRpbWUgPSBremFsbG9jKHNpemVvZigqcnVudGltZSksIEdGUF9LRVJORUwpOworCWlmIChydW50aW1lID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcnVudGltZS0+aWQgPSBpZDsKKwlydW50aW1lLT5kc3AgPSBkc3A7CisJcnVudGltZS0+bW9kdWxlID0gbW9kdWxlOworCUlOSVRfTElTVF9IRUFEKCZydW50aW1lLT5ibG9ja19saXN0KTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfYWRkKCZydW50aW1lLT5saXN0LCAmbW9kdWxlLT5ydW50aW1lX2xpc3QpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisKKwlyZXR1cm4gcnVudGltZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9tb2R1bGVfcnVudGltZV9uZXcpOworCit2b2lkIHNzdF9tb2R1bGVfcnVudGltZV9mcmVlKHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IHJ1bnRpbWUtPmRzcDsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWxpc3RfZGVsKCZydW50aW1lLT5saXN0KTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCisJa2ZyZWUocnVudGltZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX3J1bnRpbWVfZnJlZSk7CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqZmluZF9ibG9jayhzdHJ1Y3Qgc3N0X2RzcCAqZHNwLAorCXN0cnVjdCBzc3RfYmxvY2tfYWxsb2NhdG9yICpiYSkKK3sKKwlzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2s7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJsb2NrLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGJsb2NrLT50eXBlID09IGJhLT50eXBlICYmIGJsb2NrLT5vZmZzZXQgPT0gYmEtPm9mZnNldCkKKwkJCXJldHVybiBibG9jazsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogQmxvY2sgYWxsb2NhdG9yIG11c3QgYmUgb24gYmxvY2sgYm91bmRhcnkgKi8KK3N0YXRpYyBpbnQgYmxvY2tfYWxsb2NfY29udGlndW91cyhzdHJ1Y3Qgc3N0X2RzcCAqZHNwLAorCXN0cnVjdCBzc3RfYmxvY2tfYWxsb2NhdG9yICpiYSwgc3RydWN0IGxpc3RfaGVhZCAqYmxvY2tfbGlzdCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcCA9IExJU1RfSEVBRF9JTklUKHRtcCk7CisJc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOworCXUzMiBibG9ja19zdGFydCA9IFNTVF9IU1dfQkxPQ0tfQU5ZOworCWludCBzaXplID0gYmEtPnNpemUsIG9mZnNldCA9IGJhLT5vZmZzZXQ7CisKKwl3aGlsZSAoYmEtPnNpemUgPiAwKSB7CisKKwkJYmxvY2sgPSBmaW5kX2Jsb2NrKGRzcCwgYmEpOworCQlpZiAoIWJsb2NrKSB7CisJCQlsaXN0X3NwbGljZSgmdG1wLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QpOworCisJCQliYS0+c2l6ZSA9IHNpemU7CisJCQliYS0+b2Zmc2V0ID0gb2Zmc2V0OworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQlsaXN0X21vdmVfdGFpbCgmYmxvY2stPmxpc3QsICZ0bXApOworCQliYS0+b2Zmc2V0ICs9IGJsb2NrLT5zaXplOworCQliYS0+c2l6ZSAtPSBibG9jay0+c2l6ZTsKKwl9CisJYmEtPnNpemUgPSBzaXplOworCWJhLT5vZmZzZXQgPSBvZmZzZXQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJsb2NrLCAmdG1wLCBsaXN0KSB7CisKKwkJaWYgKGJsb2NrLT5vZmZzZXQgPCBibG9ja19zdGFydCkKKwkJCWJsb2NrX3N0YXJ0ID0gYmxvY2stPm9mZnNldDsKKworCQlsaXN0X2FkZCgmYmxvY2stPm1vZHVsZV9saXN0LCBibG9ja19saXN0KTsKKworCQlkZXZfZGJnKGRzcC0+ZGV2LCAiYmxvY2sgYWxsb2NhdGVkICVkOiVkIGF0IG9mZnNldCAweCV4XG4iLAorCQkJYmxvY2stPnR5cGUsIGJsb2NrLT5pbmRleCwgYmxvY2stPm9mZnNldCk7CisJfQorCisJbGlzdF9zcGxpY2UoJnRtcCwgJmRzcC0+dXNlZF9ibG9ja19saXN0KTsKKwlyZXR1cm4gMDsKK30KKworLyogYWxsb2NhdGUgZmlyc3QgZnJlZSBEU1AgYmxvY2tzIGZvciBkYXRhIC0gY2FsbGVycyBob2xkIGxvY2tzICovCitzdGF0aWMgaW50IGJsb2NrX2FsbG9jKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBzc3RfYmxvY2tfYWxsb2NhdG9yICpiYSwKKwlzdHJ1Y3QgbGlzdF9oZWFkICpibG9ja19saXN0KQoreworCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaywgKnRtcDsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChiYS0+c2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIGZpbmQgZmlyc3QgZnJlZSB3aG9sZSBibG9ja3MgdGhhdCBjYW4gaG9sZCBtb2R1bGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0LCBsaXN0KSB7CisKKwkJLyogaWdub3JlIGJsb2NrcyB3aXRoIHdyb25nIHR5cGUgKi8KKwkJaWYgKGJsb2NrLT50eXBlICE9IGJhLT50eXBlKQorCQkJY29udGludWU7CisKKwkJaWYgKGJhLT5zaXplID4gYmxvY2stPnNpemUpCisJCQljb250aW51ZTsKKworCQliYS0+b2Zmc2V0ID0gYmxvY2stPm9mZnNldDsKKwkJYmxvY2stPmJ5dGVzX3VzZWQgPSBiYS0+c2l6ZSAlIGJsb2NrLT5zaXplOworCQlsaXN0X2FkZCgmYmxvY2stPm1vZHVsZV9saXN0LCBibG9ja19saXN0KTsKKwkJbGlzdF9tb3ZlKCZibG9jay0+bGlzdCwgJmRzcC0+dXNlZF9ibG9ja19saXN0KTsKKwkJZGV2X2RiZyhkc3AtPmRldiwgImJsb2NrIGFsbG9jYXRlZCAlZDolZCBhdCBvZmZzZXQgMHgleFxuIiwKKwkJCWJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgsIGJsb2NrLT5vZmZzZXQpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB0aGVuIGZpbmQgZnJlZSBtdWx0aXBsZSBibG9ja3MgdGhhdCBjYW4gaG9sZCBtb2R1bGUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0LCBsaXN0KSB7CisKKwkJLyogaWdub3JlIGJsb2NrcyB3aXRoIHdyb25nIHR5cGUgKi8KKwkJaWYgKGJsb2NrLT50eXBlICE9IGJhLT50eXBlKQorCQkJY29udGludWU7CisKKwkJLyogZG8gd2Ugc3BhbiA+IDEgYmxvY2tzICovCisJCWlmIChiYS0+c2l6ZSA+IGJsb2NrLT5zaXplKSB7CisKKwkJCS8qIGFsaWduIGJhIHRvIGJsb2NrIGJvdW5kYXJ5ICovCisJCQliYS0+b2Zmc2V0ID0gYmxvY2stPm9mZnNldDsKKworCQkJcmV0ID0gYmxvY2tfYWxsb2NfY29udGlndW91cyhkc3AsIGJhLCBibG9ja19saXN0KTsKKwkJCWlmIChyZXQgPT0gMCkKKwkJCQlyZXR1cm4gcmV0OworCisJCX0KKwl9CisKKwkvKiBub3QgZW5vdWdoIGZyZWUgYmxvY2sgc3BhY2UgKi8KKwlyZXR1cm4gLUVOT01FTTsKK30KKworaW50IHNzdF9hbGxvY19ibG9ja3Moc3RydWN0IHNzdF9kc3AgKmRzcCwgc3RydWN0IHNzdF9ibG9ja19hbGxvY2F0b3IgKmJhLAorCXN0cnVjdCBsaXN0X2hlYWQgKmJsb2NrX2xpc3QpCit7CisJaW50IHJldDsKKworCWRldl9kYmcoZHNwLT5kZXYsICJibG9jayByZXF1ZXN0IDB4JXggYnl0ZXMgYXQgb2Zmc2V0IDB4JXggdHlwZSAlZFxuIiwKKwkJYmEtPnNpemUsIGJhLT5vZmZzZXQsIGJhLT50eXBlKTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCisJcmV0ID0gYmxvY2tfYWxsb2MoZHNwLCBiYSwgYmxvY2tfbGlzdCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBjYW4ndCBhbGxvYyBibG9ja3MgJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHByZXBhcmUgRFNQIGJsb2NrcyBmb3IgbW9kdWxlIHVzYWdlICovCisJcmV0ID0gYmxvY2tfbGlzdF9wcmVwYXJlKGRzcCwgYmxvY2tfbGlzdCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogcHJlcGFyZSBmYWlsZWRcbiIpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2FsbG9jX2Jsb2Nrcyk7CisKK2ludCBzc3RfZnJlZV9ibG9ja3Moc3RydWN0IHNzdF9kc3AgKmRzcCwgc3RydWN0IGxpc3RfaGVhZCAqYmxvY2tfbGlzdCkKK3sKKwltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKKwlibG9ja19saXN0X3JlbW92ZShkc3AsIGJsb2NrX2xpc3QpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfZnJlZV9ibG9ja3MpOworCisvKiBhbGxvY2F0ZSBtZW1vcnkgYmxvY2tzIGZvciBzdGF0aWMgbW9kdWxlIGFkZHJlc3NlcyAtIGNhbGxlcnMgaG9sZCBsb2NrcyAqLworc3RhdGljIGludCBibG9ja19hbGxvY19maXhlZChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCBzdHJ1Y3Qgc3N0X2Jsb2NrX2FsbG9jYXRvciAqYmEsCisJc3RydWN0IGxpc3RfaGVhZCAqYmxvY2tfbGlzdCkKK3sKKwlzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2ssICp0bXA7CisJc3RydWN0IHNzdF9ibG9ja19hbGxvY2F0b3IgYmFfdG1wID0gKmJhOworCXUzMiBlbmQgPSBiYS0+b2Zmc2V0ICsgYmEtPnNpemUsIGJsb2NrX2VuZDsKKwlpbnQgZXJyOworCisJLyogb25seSBJUkFNL0RSQU0gYmxvY2tzIGFyZSBtYW5hZ2VkICovCisJaWYgKGJhLT50eXBlICE9IFNTVF9NRU1fSVJBTSAmJiBiYS0+dHlwZSAhPSBTU1RfTUVNX0RSQU0pCisJCXJldHVybiAwOworCisJLyogYXJlIGJsb2NrcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoaXMgbW9kdWxlICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsIGJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7CisKKwkJLyogaWdub3JlIGJsb2NrcyB3aXRoIHdyb25nIHR5cGUgKi8KKwkJaWYgKGJsb2NrLT50eXBlICE9IGJhLT50eXBlKQorCQkJY29udGludWU7CisKKwkJYmxvY2tfZW5kID0gYmxvY2stPm9mZnNldCArIGJsb2NrLT5zaXplOworCisJCS8qIGZpbmQgYmxvY2sgdGhhdCBob2xkcyBzZWN0aW9uICovCisJCWlmIChiYS0+b2Zmc2V0ID49IGJsb2NrLT5vZmZzZXQgJiYgZW5kIDw9IGJsb2NrX2VuZCkKKwkJCXJldHVybiAwOworCisJCS8qIGRvZXMgYmxvY2sgc3BhbiBtb3JlIHRoYW4gMSBzZWN0aW9uICovCisJCWlmIChiYS0+b2Zmc2V0ID49IGJsb2NrLT5vZmZzZXQgJiYgYmEtPm9mZnNldCA8IGJsb2NrX2VuZCkgeworCisJCQkvKiBhbGlnbiBiYSB0byBibG9jayBib3VuZGFyeSAqLworCQkJYmFfdG1wLnNpemUgLT0gYmxvY2tfZW5kIC0gYmEtPm9mZnNldDsKKwkJCWJhX3RtcC5vZmZzZXQgPSBibG9ja19lbmQ7CisJCQllcnIgPSBibG9ja19hbGxvY19jb250aWd1b3VzKGRzcCwgJmJhX3RtcCwgYmxvY2tfbGlzdCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJLyogbW9kdWxlIGFscmVhZHkgb3ducyBibG9ja3MgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyogZmluZCBmaXJzdCBmcmVlIGJsb2NrcyB0aGF0IGNhbiBob2xkIHNlY3Rpb24gaW4gZnJlZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZkc3AtPmZyZWVfYmxvY2tfbGlzdCwgbGlzdCkgeworCQlibG9ja19lbmQgPSBibG9jay0+b2Zmc2V0ICsgYmxvY2stPnNpemU7CisKKwkJLyogaWdub3JlIGJsb2NrcyB3aXRoIHdyb25nIHR5cGUgKi8KKwkJaWYgKGJsb2NrLT50eXBlICE9IGJhLT50eXBlKQorCQkJY29udGludWU7CisKKwkJLyogZmluZCBibG9jayB0aGF0IGhvbGRzIHNlY3Rpb24gKi8KKwkJaWYgKGJhLT5vZmZzZXQgPj0gYmxvY2stPm9mZnNldCAmJiBlbmQgPD0gYmxvY2tfZW5kKSB7CisKKwkJCS8qIGFkZCBibG9jayAqLworCQkJbGlzdF9tb3ZlKCZibG9jay0+bGlzdCwgJmRzcC0+dXNlZF9ibG9ja19saXN0KTsKKwkJCWxpc3RfYWRkKCZibG9jay0+bW9kdWxlX2xpc3QsIGJsb2NrX2xpc3QpOworCQkJZGV2X2RiZyhkc3AtPmRldiwgImJsb2NrIGFsbG9jYXRlZCAlZDolZCBhdCBvZmZzZXQgMHgleFxuIiwKKwkJCQlibG9jay0+dHlwZSwgYmxvY2stPmluZGV4LCBibG9jay0+b2Zmc2V0KTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogZG9lcyBibG9jayBzcGFuIG1vcmUgdGhhbiAxIHNlY3Rpb24gKi8KKwkJaWYgKGJhLT5vZmZzZXQgPj0gYmxvY2stPm9mZnNldCAmJiBiYS0+b2Zmc2V0IDwgYmxvY2tfZW5kKSB7CisKKwkJCS8qIGFkZCBibG9jayAqLworCQkJbGlzdF9tb3ZlKCZibG9jay0+bGlzdCwgJmRzcC0+dXNlZF9ibG9ja19saXN0KTsKKwkJCWxpc3RfYWRkKCZibG9jay0+bW9kdWxlX2xpc3QsIGJsb2NrX2xpc3QpOworCQkJLyogYWxpZ24gYmEgdG8gYmxvY2sgYm91bmRhcnkgKi8KKwkJCWJhX3RtcC5zaXplIC09IGJsb2NrX2VuZCAtIGJhLT5vZmZzZXQ7CisJCQliYV90bXAub2Zmc2V0ID0gYmxvY2tfZW5kOworCisJCQllcnIgPSBibG9ja19hbGxvY19jb250aWd1b3VzKGRzcCwgJmJhX3RtcCwgYmxvY2tfbGlzdCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyogTG9hZCBmaXhlZCBtb2R1bGUgZGF0YSBpbnRvIERTUCBtZW1vcnkgYmxvY2tzICovCitpbnQgc3N0X21vZHVsZV9hbGxvY19ibG9ja3Moc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gbW9kdWxlLT5kc3A7CisJc3RydWN0IHNzdF9mdyAqc3N0X2Z3ID0gbW9kdWxlLT5zc3RfZnc7CisJc3RydWN0IHNzdF9ibG9ja19hbGxvY2F0b3IgYmE7CisJaW50IHJldDsKKworCW1lbXNldCgmYmEsIDAsIHNpemVvZihiYSkpOworCWJhLnNpemUgPSBtb2R1bGUtPnNpemU7CisJYmEudHlwZSA9IG1vZHVsZS0+dHlwZTsKKwliYS5vZmZzZXQgPSBtb2R1bGUtPm9mZnNldDsKKworCWRldl9kYmcoZHNwLT5kZXYsICJibG9jayByZXF1ZXN0IDB4JXggYnl0ZXMgYXQgb2Zmc2V0IDB4JXggdHlwZSAlZFxuIiwKKwkJYmEuc2l6ZSwgYmEub2Zmc2V0LCBiYS50eXBlKTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCisJLyogYWxsb2MgYmxvY2tzIHRoYXQgaW5jbHVkZXMgdGhpcyBzZWN0aW9uICovCisJcmV0ID0gYmxvY2tfYWxsb2NfZml4ZWQoZHNwLCAmYmEsICZtb2R1bGUtPmJsb2NrX2xpc3QpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHNwLT5kZXYsCisJCQkiZXJyb3I6IG5vIGZyZWUgYmxvY2tzIGZvciBzZWN0aW9uIGF0IG9mZnNldCAweCV4IHNpemUgMHgleFxuIiwKKwkJCW1vZHVsZS0+b2Zmc2V0LCBtb2R1bGUtPnNpemUpOworCQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBwcmVwYXJlIERTUCBibG9ja3MgZm9yIG1vZHVsZSBjb3B5ICovCisJcmV0ID0gYmxvY2tfbGlzdF9wcmVwYXJlKGRzcCwgJm1vZHVsZS0+YmxvY2tfbGlzdCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBmdyBtb2R1bGUgcHJlcGFyZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBjb3B5IHBhcnRpYWwgbW9kdWxlIGRhdGEgdG8gYmxvY2tzICovCisJaWYgKGRzcC0+ZndfdXNlX2RtYSkgeworCQlyZXQgPSBzc3RfZHNwX2RtYV9jb3B5dG8oZHNwLAorCQkJZHNwLT5hZGRyLmxwZV9iYXNlICsgbW9kdWxlLT5vZmZzZXQsCisJCQlzc3RfZnctPmRtYWJsZV9md19wYWRkciArIG1vZHVsZS0+ZGF0YV9vZmZzZXQsCisJCQltb2R1bGUtPnNpemUpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBtb2R1bGUgY29weSBmYWlsZWRcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UKKwkJc3N0X21lbWNweTMyKGRzcC0+YWRkci5scGUgKyBtb2R1bGUtPm9mZnNldCwgbW9kdWxlLT5kYXRhLAorCQkJbW9kdWxlLT5zaXplKTsKKworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIHJldDsKKworZXJyOgorCWJsb2NrX2xpc3RfcmVtb3ZlKGRzcCwgJm1vZHVsZS0+YmxvY2tfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9hbGxvY19ibG9ja3MpOworCisvKiBVbmxvYWQgZW50aXJlIG1vZHVsZSBmcm9tIERTUCBtZW1vcnkgKi8KK2ludCBzc3RfbW9kdWxlX2ZyZWVfYmxvY2tzKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisJYmxvY2tfbGlzdF9yZW1vdmUoZHNwLCAmbW9kdWxlLT5ibG9ja19saXN0KTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9mcmVlX2Jsb2Nrcyk7CisKK2ludCBzc3RfbW9kdWxlX3J1bnRpbWVfYWxsb2NfYmxvY2tzKHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUsCisJaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gcnVudGltZS0+ZHNwOworCXN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUgPSBydW50aW1lLT5tb2R1bGU7CisJc3RydWN0IHNzdF9ibG9ja19hbGxvY2F0b3IgYmE7CisJaW50IHJldDsKKworCWlmIChtb2R1bGUtPnBlcnNpc3RlbnRfc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCgmYmEsIDAsIHNpemVvZihiYSkpOworCWJhLnNpemUgPSBtb2R1bGUtPnBlcnNpc3RlbnRfc2l6ZTsKKwliYS50eXBlID0gU1NUX01FTV9EUkFNOworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisKKwkvKiBkbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGF0IGEgZml4ZWQgYWRkcmVzcyA/ICovCisJaWYgKG9mZnNldCAhPSAwKSB7CisKKwkJYmEub2Zmc2V0ID0gb2Zmc2V0OworCisJCWRldl9kYmcoZHNwLT5kZXYsICJwZXJzaXN0ZW50IGZpeGVkIGJsb2NrIHJlcXVlc3QgMHgleCBieXRlcyB0eXBlICVkIG9mZnNldCAweCV4XG4iLAorCQkJYmEuc2l6ZSwgYmEudHlwZSwgYmEub2Zmc2V0KTsKKworCQkvKiBhbGxvYyBibG9ja3MgdGhhdCBpbmNsdWRlcyB0aGlzIHNlY3Rpb24gKi8KKwkJcmV0ID0gYmxvY2tfYWxsb2NfZml4ZWQoZHNwLCAmYmEsICZydW50aW1lLT5ibG9ja19saXN0KTsKKworCX0gZWxzZSB7CisJCWRldl9kYmcoZHNwLT5kZXYsICJwZXJzaXN0ZW50IGJsb2NrIHJlcXVlc3QgMHgleCBieXRlcyB0eXBlICVkXG4iLAorCQkJYmEuc2l6ZSwgYmEudHlwZSk7CisKKwkJLyogYWxsb2MgYmxvY2tzIHRoYXQgaW5jbHVkZXMgdGhpcyBzZWN0aW9uICovCisJCXJldCA9IGJsb2NrX2FsbG9jKGRzcCwgJmJhLCAmcnVudGltZS0+YmxvY2tfbGlzdCk7CisJfQorCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHNwLT5kZXYsCisJCSJlcnJvcjogbm8gZnJlZSBibG9ja3MgZm9yIHJ1bnRpbWUgbW9kdWxlIHNpemUgMHgleFxuIiwKKwkJCW1vZHVsZS0+cGVyc2lzdGVudF9zaXplKTsKKwkJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJ1bnRpbWUtPnBlcnNpc3RlbnRfb2Zmc2V0ID0gYmEub2Zmc2V0OworCisJLyogcHJlcGFyZSBEU1AgYmxvY2tzIGZvciBtb2R1bGUgY29weSAqLworCXJldCA9IGJsb2NrX2xpc3RfcHJlcGFyZShkc3AsICZydW50aW1lLT5ibG9ja19saXN0KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IHJ1bnRpbWUgYmxvY2sgcHJlcGFyZSBmYWlsZWRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCXJldHVybiByZXQ7CisKK2VycjoKKwlibG9ja19saXN0X3JlbW92ZShkc3AsICZtb2R1bGUtPmJsb2NrX2xpc3QpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9tb2R1bGVfcnVudGltZV9hbGxvY19ibG9ja3MpOworCitpbnQgc3N0X21vZHVsZV9ydW50aW1lX2ZyZWVfYmxvY2tzKHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IHJ1bnRpbWUtPmRzcDsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWJsb2NrX2xpc3RfcmVtb3ZlKGRzcCwgJnJ1bnRpbWUtPmJsb2NrX2xpc3QpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX3J1bnRpbWVfZnJlZV9ibG9ja3MpOworCitpbnQgc3N0X21vZHVsZV9ydW50aW1lX3NhdmUoc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZSwKKwlzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lX2NvbnRleHQgKmNvbnRleHQpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IHJ1bnRpbWUtPmRzcDsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlID0gcnVudGltZS0+bW9kdWxlOworCWludCByZXQgPSAwOworCisJZGV2X2RiZyhkc3AtPmRldiwgInNhdmluZyBydW50aW1lICVkIG1lbW9yeSBhdCAweCV4IHNpemUgMHgleFxuIiwKKwkJcnVudGltZS0+aWQsIHJ1bnRpbWUtPnBlcnNpc3RlbnRfb2Zmc2V0LAorCQltb2R1bGUtPnBlcnNpc3RlbnRfc2l6ZSk7CisKKwljb250ZXh0LT5idWZmZXIgPSBkbWFfYWxsb2NfY29oZXJlbnQoZHNwLT5kbWFfZGV2LAorCQltb2R1bGUtPnBlcnNpc3RlbnRfc2l6ZSwKKwkJJmNvbnRleHQtPmRtYV9idWZmZXIsIEdGUF9ETUEgfCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNvbnRleHQtPmJ1ZmZlcikgeworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IERNQSBjb250ZXh0IGFsbG9jIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCisJaWYgKGRzcC0+ZndfdXNlX2RtYSkgeworCisJCXJldCA9IHNzdF9kc3BfZG1hX2dldF9jaGFubmVsKGRzcCwgMCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisKKwkJcmV0ID0gc3N0X2RzcF9kbWFfY29weWZyb20oZHNwLCBjb250ZXh0LT5kbWFfYnVmZmVyLAorCQkJZHNwLT5hZGRyLmxwZV9iYXNlICsgcnVudGltZS0+cGVyc2lzdGVudF9vZmZzZXQsCisJCQltb2R1bGUtPnBlcnNpc3RlbnRfc2l6ZSk7CisJCXNzdF9kc3BfZG1hX3B1dF9jaGFubmVsKGRzcCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGNvbnRleHQgY29weSBmYWlsZWRcbiIpOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UKKwkJc3N0X21lbWNweTMyKGNvbnRleHQtPmJ1ZmZlciwgZHNwLT5hZGRyLmxwZSArCisJCQlydW50aW1lLT5wZXJzaXN0ZW50X29mZnNldCwKKwkJCW1vZHVsZS0+cGVyc2lzdGVudF9zaXplKTsKKworZXJyOgorCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9tb2R1bGVfcnVudGltZV9zYXZlKTsKKworaW50IHNzdF9tb2R1bGVfcnVudGltZV9yZXN0b3JlKHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUsCisJc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZV9jb250ZXh0ICpjb250ZXh0KQoreworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBydW50aW1lLT5kc3A7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSA9IHJ1bnRpbWUtPm1vZHVsZTsKKwlpbnQgcmV0ID0gMDsKKworCWRldl9kYmcoZHNwLT5kZXYsICJyZXN0b3JpbmcgcnVudGltZSAlZCBtZW1vcnkgYXQgMHgleCBzaXplIDB4JXhcbiIsCisJCXJ1bnRpbWUtPmlkLCBydW50aW1lLT5wZXJzaXN0ZW50X29mZnNldCwKKwkJbW9kdWxlLT5wZXJzaXN0ZW50X3NpemUpOworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisKKwlpZiAoIWNvbnRleHQtPmJ1ZmZlcikgeworCQlkZXZfaW5mbyhkc3AtPmRldiwgIm5vIGNvbnRleHQgYnVmZmVyIG5lZWQgdG8gcmVzdG9yZSFcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoZHNwLT5md191c2VfZG1hKSB7CisKKwkJcmV0ID0gc3N0X2RzcF9kbWFfZ2V0X2NoYW5uZWwoZHNwLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIGVycjsKKworCQlyZXQgPSBzc3RfZHNwX2RtYV9jb3B5dG8oZHNwLAorCQkJZHNwLT5hZGRyLmxwZV9iYXNlICsgcnVudGltZS0+cGVyc2lzdGVudF9vZmZzZXQsCisJCQljb250ZXh0LT5kbWFfYnVmZmVyLCBtb2R1bGUtPnBlcnNpc3RlbnRfc2l6ZSk7CisJCXNzdF9kc3BfZG1hX3B1dF9jaGFubmVsKGRzcCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IG1vZHVsZSBjb3B5IGZhaWxlZFxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gZWxzZQorCQlzc3RfbWVtY3B5MzIoZHNwLT5hZGRyLmxwZSArIHJ1bnRpbWUtPnBlcnNpc3RlbnRfb2Zmc2V0LAorCQkJY29udGV4dC0+YnVmZmVyLCBtb2R1bGUtPnBlcnNpc3RlbnRfc2l6ZSk7CisKKwlkbWFfZnJlZV9jb2hlcmVudChkc3AtPmRtYV9kZXYsIG1vZHVsZS0+cGVyc2lzdGVudF9zaXplLAorCQkJCWNvbnRleHQtPmJ1ZmZlciwgY29udGV4dC0+ZG1hX2J1ZmZlcik7CisJY29udGV4dC0+YnVmZmVyID0gTlVMTDsKKworZXJyOgorCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9tb2R1bGVfcnVudGltZV9yZXN0b3JlKTsKKworLyogcmVnaXN0ZXIgYSBEU1AgbWVtb3J5IGJsb2NrIGZvciB1c2Ugd2l0aCBGVyBiYXNlZCBtb2R1bGVzICovCitzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqc3N0X21lbV9ibG9ja19yZWdpc3RlcihzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgb2Zmc2V0LAorCXUzMiBzaXplLCBlbnVtIHNzdF9tZW1fdHlwZSB0eXBlLCBzdHJ1Y3Qgc3N0X2Jsb2NrX29wcyAqb3BzLCB1MzIgaW5kZXgsCisJdm9pZCAqcHJpdmF0ZSkKK3sKKwlzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2s7CisKKwlibG9jayA9IGt6YWxsb2Moc2l6ZW9mKCpibG9jayksIEdGUF9LRVJORUwpOworCWlmIChibG9jayA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWJsb2NrLT5vZmZzZXQgPSBvZmZzZXQ7CisJYmxvY2stPnNpemUgPSBzaXplOworCWJsb2NrLT5pbmRleCA9IGluZGV4OworCWJsb2NrLT50eXBlID0gdHlwZTsKKwlibG9jay0+ZHNwID0gZHNwOworCWJsb2NrLT5wcml2YXRlID0gcHJpdmF0ZTsKKwlibG9jay0+b3BzID0gb3BzOworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisJbGlzdF9hZGQoJmJsb2NrLT5saXN0LCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QpOworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisKKwlyZXR1cm4gYmxvY2s7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbWVtX2Jsb2NrX3JlZ2lzdGVyKTsKKworLyogdW5yZWdpc3RlciBhbGwgRFNQIG1lbW9yeSBibG9ja3MgKi8KK3ZvaWQgc3N0X21lbV9ibG9ja191bnJlZ2lzdGVyX2FsbChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKQoreworCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaywgKnRtcDsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCisJLyogdW5yZWdpc3RlciB1c2VkIGJsb2NrcyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCAmZHNwLT51c2VkX2Jsb2NrX2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmJsb2NrLT5saXN0KTsKKwkJa2ZyZWUoYmxvY2spOworCX0KKworCS8qIHVucmVnaXN0ZXIgZnJlZSBibG9ja3MgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsKCZibG9jay0+bGlzdCk7CisJCWtmcmVlKGJsb2NrKTsKKwl9CisKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21lbV9ibG9ja191bnJlZ2lzdGVyX2FsbCk7CisKKy8qIGFsbG9jYXRlIHNjcmF0Y2ggYnVmZmVyIGJsb2NrcyAqLworaW50IHNzdF9ibG9ja19hbGxvY19zY3JhdGNoKHN0cnVjdCBzc3RfZHNwICpkc3ApCit7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZTsKKwlzdHJ1Y3Qgc3N0X2Jsb2NrX2FsbG9jYXRvciBiYTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7CisKKwkvKiBjYWxjdWxhdGUgcmVxdWlyZWQgc2NyYXRjaCBzaXplICovCisJZHNwLT5zY3JhdGNoX3NpemUgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kdWxlLCAmZHNwLT5tb2R1bGVfbGlzdCwgbGlzdCkgeworCQlkZXZfZGJnKGRzcC0+ZGV2LCAibW9kdWxlICVkIHNjcmF0Y2ggcmVxIDB4JXggYnl0ZXNcbiIsCisJCQltb2R1bGUtPmlkLCBtb2R1bGUtPnNjcmF0Y2hfc2l6ZSk7CisJCWlmIChkc3AtPnNjcmF0Y2hfc2l6ZSA8IG1vZHVsZS0+c2NyYXRjaF9zaXplKQorCQkJZHNwLT5zY3JhdGNoX3NpemUgPSBtb2R1bGUtPnNjcmF0Y2hfc2l6ZTsKKwl9CisKKwlkZXZfZGJnKGRzcC0+ZGV2LCAic2NyYXRjaCBidWZmZXIgcmVxdWlyZWQgaXMgMHgleCBieXRlc1xuIiwKKwkJZHNwLT5zY3JhdGNoX3NpemUpOworCisJaWYgKGRzcC0+c2NyYXRjaF9zaXplID09IDApIHsKKwkJZGV2X2luZm8oZHNwLT5kZXYsICJubyBtb2R1bGVzIG5lZWQgc2NyYXRjaCBidWZmZXJcbiIpOworCQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBhbGxvY2F0ZSBibG9ja3MgZm9yIG1vZHVsZSBzY3JhdGNoIGJ1ZmZlcnMgKi8KKwlkZXZfZGJnKGRzcC0+ZGV2LCAiYWxsb2NhdGluZyBzY3JhdGNoIGJsb2Nrc1xuIik7CisKKwliYS5zaXplID0gZHNwLT5zY3JhdGNoX3NpemU7CisJYmEudHlwZSA9IFNTVF9NRU1fRFJBTTsKKworCS8qIGRvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYXQgZml4ZWQgb2Zmc2V0ICovCisJaWYgKGRzcC0+c2NyYXRjaF9vZmZzZXQgIT0gMCkgeworCisJCWRldl9kYmcoZHNwLT5kZXYsICJibG9jayByZXF1ZXN0IDB4JXggYnl0ZXMgdHlwZSAlZCBhdCAweCV4XG4iLAorCQkJYmEuc2l6ZSwgYmEudHlwZSwgYmEub2Zmc2V0KTsKKworCQliYS5vZmZzZXQgPSBkc3AtPnNjcmF0Y2hfb2Zmc2V0OworCisJCS8qIGFsbG9jIGJsb2NrcyB0aGF0IGluY2x1ZGVzIHRoaXMgc2VjdGlvbiAqLworCQlyZXQgPSBibG9ja19hbGxvY19maXhlZChkc3AsICZiYSwgJmRzcC0+c2NyYXRjaF9ibG9ja19saXN0KTsKKworCX0gZWxzZSB7CisJCWRldl9kYmcoZHNwLT5kZXYsICJibG9jayByZXF1ZXN0IDB4JXggYnl0ZXMgdHlwZSAlZFxuIiwKKwkJCWJhLnNpemUsIGJhLnR5cGUpOworCisJCWJhLm9mZnNldCA9IDA7CisJCXJldCA9IGJsb2NrX2FsbG9jKGRzcCwgJmJhLCAmZHNwLT5zY3JhdGNoX2Jsb2NrX2xpc3QpOworCX0KKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGNhbid0IGFsbG9jIHNjcmF0Y2ggYmxvY2tzXG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBibG9ja19saXN0X3ByZXBhcmUoZHNwLCAmZHNwLT5zY3JhdGNoX2Jsb2NrX2xpc3QpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogc2NyYXRjaCBibG9jayBwcmVwYXJlIGZhaWxlZFxuIik7CisJCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogYXNzaWduIHRoZSBzYW1lIG9mZnNldCBvZiBzY3JhdGNoIHRvIGVhY2ggbW9kdWxlICovCisJZHNwLT5zY3JhdGNoX29mZnNldCA9IGJhLm9mZnNldDsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCXJldHVybiBkc3AtPnNjcmF0Y2hfc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9ibG9ja19hbGxvY19zY3JhdGNoKTsKKworLyogZnJlZSBhbGwgc2NyYXRjaCBibG9ja3MgKi8KK3ZvaWQgc3N0X2Jsb2NrX2ZyZWVfc2NyYXRjaChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKQoreworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCWJsb2NrX2xpc3RfcmVtb3ZlKGRzcCwgJmRzcC0+c2NyYXRjaF9ibG9ja19saXN0KTsKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2Jsb2NrX2ZyZWVfc2NyYXRjaCk7CisKKy8qIGdldCBhIG1vZHVsZSBmcm9tIGl0J3MgdW5pcXVlIElEICovCitzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9nZXRfZnJvbV9pZChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgaWQpCit7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZTsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2R1bGUsICZkc3AtPm1vZHVsZV9saXN0LCBsaXN0KSB7CisJCWlmIChtb2R1bGUtPmlkID09IGlkKSB7CisJCQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCQkJcmV0dXJuIG1vZHVsZTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX2dldF9mcm9tX2lkKTsKKworc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqc3N0X21vZHVsZV9ydW50aW1lX2dldF9mcm9tX2lkKAorCXN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUsIHUzMiBpZCkKK3sKKwlzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lOworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBtb2R1bGUtPmRzcDsKKworCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShydW50aW1lLCAmbW9kdWxlLT5ydW50aW1lX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHJ1bnRpbWUtPmlkID09IGlkKSB7CisJCQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCQkJcmV0dXJuIHJ1bnRpbWU7CisJCX0KKwl9CisKKwltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9ydW50aW1lX2dldF9mcm9tX2lkKTsKKworLyogcmV0dXJucyBibG9jayBhZGRyZXNzIGluIERTUCBhZGRyZXNzIHNwYWNlICovCit1MzIgc3N0X2RzcF9nZXRfb2Zmc2V0KHN0cnVjdCBzc3RfZHNwICpkc3AsIHUzMiBvZmZzZXQsCisJZW51bSBzc3RfbWVtX3R5cGUgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNTVF9NRU1fSVJBTToKKwkJcmV0dXJuIG9mZnNldCAtIGRzcC0+YWRkci5pcmFtX29mZnNldCArCisJCQlkc3AtPmFkZHIuZHNwX2lyYW1fb2Zmc2V0OworCWNhc2UgU1NUX01FTV9EUkFNOgorCQlyZXR1cm4gb2Zmc2V0IC0gZHNwLT5hZGRyLmRyYW1fb2Zmc2V0ICsKKwkJCWRzcC0+YWRkci5kc3BfZHJhbV9vZmZzZXQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9nZXRfb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWlwYy5jIGIvc291bmQvc29jL2ludGVsL2NvbW1vbi9zc3QtaXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2MmE1NQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9jb21tb24vc3N0LWlwYy5jCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogSW50ZWwgU1NUIGdlbmVyaWMgSVBDIFN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgorCisjaW5jbHVkZSAic3N0LWRzcC5oIgorI2luY2x1ZGUgInNzdC1kc3AtcHJpdi5oIgorI2luY2x1ZGUgInNzdC1pcGMuaCIKKworLyogSVBDIG1lc3NhZ2UgdGltZW91dCAobXNlY3MpICovCisjZGVmaW5lIElQQ19USU1FT1VUX01TRUNTCTMwMAorCisjZGVmaW5lIElQQ19FTVBUWV9MSVNUX1NJWkUJOAorCisvKiBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIHN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnX2dldF9lbXB0eShzdHJ1Y3Qgc3N0X2dlbmVyaWNfaXBjICppcGMpCit7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2cgPSBOVUxMOworCisJaWYgKCFsaXN0X2VtcHR5KCZpcGMtPmVtcHR5X2xpc3QpKSB7CisJCW1zZyA9IGxpc3RfZmlyc3RfZW50cnkoJmlwYy0+ZW1wdHlfbGlzdCwgc3RydWN0IGlwY19tZXNzYWdlLAorCQkJbGlzdCk7CisJCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCX0KKworCXJldHVybiBtc2c7Cit9CisKK3N0YXRpYyBpbnQgdHhfd2FpdF9kb25lKHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYywKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZywgdm9pZCAqcnhfZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwkvKiB3YWl0IGZvciBEU1AgY29tcGxldGlvbiAoaW4gYWxsIGNhc2VzIGF0bSBpbmMgcGVuZGluZykgKi8KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQobXNnLT53YWl0cSwgbXNnLT5jb21wbGV0ZSwKKwkJbXNlY3NfdG9famlmZmllcyhJUENfVElNRU9VVF9NU0VDUykpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlwYy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCWlmIChyZXQgPT0gMCkgeworCQlpZiAoaXBjLT5vcHMuc2hpbV9kYmcgIT0gTlVMTCkKKwkJCWlwYy0+b3BzLnNoaW1fZGJnKGlwYywgIm1lc3NhZ2UgdGltZW91dCIpOworCisJCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCQlyZXQgPSAtRVRJTUVET1VUOworCX0gZWxzZSB7CisKKwkJLyogY29weSB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIERTUCAqLworCQlpZiAobXNnLT5yeF9zaXplKQorCQkJbWVtY3B5KHJ4X2RhdGEsIG1zZy0+cnhfZGF0YSwgbXNnLT5yeF9zaXplKTsKKwkJcmV0ID0gbXNnLT5lcnJubzsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZpcGMtPmVtcHR5X2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwYy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXBjX3R4X21lc3NhZ2Uoc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLCB1NjQgaGVhZGVyLAorCXZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcywgdm9pZCAqcnhfZGF0YSwKKwlzaXplX3QgcnhfYnl0ZXMsIGludCB3YWl0KQoreworCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXBjLT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisKKwltc2cgPSBtc2dfZ2V0X2VtcHR5KGlwYyk7CisJaWYgKG1zZyA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwYy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW1zZy0+aGVhZGVyID0gaGVhZGVyOworCW1zZy0+dHhfc2l6ZSA9IHR4X2J5dGVzOworCW1zZy0+cnhfc2l6ZSA9IHJ4X2J5dGVzOworCW1zZy0+d2FpdCA9IHdhaXQ7CisJbXNnLT5lcnJubyA9IDA7CisJbXNnLT5wZW5kaW5nID0gZmFsc2U7CisJbXNnLT5jb21wbGV0ZSA9IGZhbHNlOworCisJaWYgKCh0eF9ieXRlcykgJiYgKGlwYy0+b3BzLnR4X2RhdGFfY29weSAhPSBOVUxMKSkKKwkJaXBjLT5vcHMudHhfZGF0YV9jb3B5KG1zZywgdHhfZGF0YSwgdHhfYnl0ZXMpOworCisJbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmaXBjLT50eF9saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcGMtPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKKworCXF1ZXVlX2t0aHJlYWRfd29yaygmaXBjLT5rd29ya2VyLCAmaXBjLT5rd29yayk7CisKKwlpZiAod2FpdCkKKwkJcmV0dXJuIHR4X3dhaXRfZG9uZShpcGMsIG1zZywgcnhfZGF0YSk7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc2dfZW1wdHlfbGlzdF9pbml0KHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYykKK3sKKwlpbnQgaTsKKworCWlwYy0+bXNnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGlwY19tZXNzYWdlKSAqCisJCUlQQ19FTVBUWV9MSVNUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmIChpcGMtPm1zZyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBJUENfRU1QVFlfTElTVF9TSVpFOyBpKyspIHsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaXBjLT5tc2dbaV0ud2FpdHEpOworCQlsaXN0X2FkZCgmaXBjLT5tc2dbaV0ubGlzdCwgJmlwYy0+ZW1wdHlfbGlzdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlwY190eF9tc2dzKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCit7CisJc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMsIGt3b3JrKTsKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU2NCBpcGN4OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlwYy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKGxpc3RfZW1wdHkoJmlwYy0+dHhfbGlzdCkgfHwgaXBjLT5wZW5kaW5nKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwYy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogaWYgdGhlIERTUCBpcyBidXN5LCB3ZSB3aWxsIFRYIG1lc3NhZ2VzIGFmdGVyIElSUS4KKwkgKiBhbHNvIHBvc3Rwb25lIGlmIHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHByb2Nlc2luZyBjb21wbGV0aW9uIGlycSovCisJaXBjeCA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKGlwYy0+ZHNwLCBTU1RfSVBDWCk7CisJaWYgKGlwY3ggJiAoU1NUX0lQQ1hfQlVTWSB8IFNTVF9JUENYX0RPTkUpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwYy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJbXNnID0gbGlzdF9maXJzdF9lbnRyeSgmaXBjLT50eF9saXN0LCBzdHJ1Y3QgaXBjX21lc3NhZ2UsIGxpc3QpOworCWxpc3RfbW92ZSgmbXNnLT5saXN0LCAmaXBjLT5yeF9saXN0KTsKKworCWlmIChpcGMtPm9wcy50eF9tc2cgIT0gTlVMTCkKKwkJaXBjLT5vcHMudHhfbXNnKGlwYywgbXNnKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlwYy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOworfQorCitpbnQgc3N0X2lwY190eF9tZXNzYWdlX3dhaXQoc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLCB1NjQgaGVhZGVyLAorCXZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcywgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzKQoreworCXJldHVybiBpcGNfdHhfbWVzc2FnZShpcGMsIGhlYWRlciwgdHhfZGF0YSwgdHhfYnl0ZXMsCisJCXJ4X2RhdGEsIHJ4X2J5dGVzLCAxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9pcGNfdHhfbWVzc2FnZV93YWl0KTsKKworaW50IHNzdF9pcGNfdHhfbWVzc2FnZV9ub3dhaXQoc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLCB1NjQgaGVhZGVyLAorCXZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcykKK3sKKwlyZXR1cm4gaXBjX3R4X21lc3NhZ2UoaXBjLCBoZWFkZXIsIHR4X2RhdGEsIHR4X2J5dGVzLAorCQlOVUxMLCAwLCAwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9pcGNfdHhfbWVzc2FnZV9ub3dhaXQpOworCitzdHJ1Y3QgaXBjX21lc3NhZ2UgKnNzdF9pcGNfcmVwbHlfZmluZF9tc2coc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLAorCXU2NCBoZWFkZXIpCit7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2c7CisJdTY0IG1hc2s7CisKKwlpZiAoaXBjLT5vcHMucmVwbHlfbXNnX21hdGNoICE9IE5VTEwpCisJCWhlYWRlciA9IGlwYy0+b3BzLnJlcGx5X21zZ19tYXRjaChoZWFkZXIsICZtYXNrKTsKKworCWlmIChsaXN0X2VtcHR5KCZpcGMtPnJ4X2xpc3QpKSB7CisJCWRldl9lcnIoaXBjLT5kZXYsICJlcnJvcjogcnggbGlzdCBlbXB0eSBidXQgcmVjZWl2ZWQgMHglbGx4XG4iLAorCQkJaGVhZGVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtc2csICZpcGMtPnJ4X2xpc3QsIGxpc3QpIHsKKwkJaWYgKChtc2ctPmhlYWRlciAmIG1hc2spID09IGhlYWRlcikKKwkJCXJldHVybiBtc2c7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzc3RfaXBjX3JlcGx5X2ZpbmRfbXNnKTsKKworLyogbG9ja3MgaGVsZCBieSBjYWxsZXIgKi8KK3ZvaWQgc3N0X2lwY190eF9tc2dfcmVwbHlfY29tcGxldGUoc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLAorCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnKQoreworCW1zZy0+Y29tcGxldGUgPSB0cnVlOworCisJaWYgKCFtc2ctPndhaXQpCisJCWxpc3RfYWRkX3RhaWwoJm1zZy0+bGlzdCwgJmlwYy0+ZW1wdHlfbGlzdCk7CisJZWxzZQorCQl3YWtlX3VwKCZtc2ctPndhaXRxKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9pcGNfdHhfbXNnX3JlcGx5X2NvbXBsZXRlKTsKKwordm9pZCBzc3RfaXBjX2Ryb3BfYWxsKHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYykKK3sKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZywgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0eF9kcm9wX2NudCA9IDAsIHJ4X2Ryb3BfY250ID0gMDsKKworCS8qIGRyb3AgYWxsIFRYIGFuZCBSeCBtZXNzYWdlcyBiZWZvcmUgd2Ugc3RhbGwgKyByZXNldCBEU1AgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaXBjLT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCB0bXAsICZpcGMtPnR4X2xpc3QsIGxpc3QpIHsKKwkJbGlzdF9tb3ZlKCZtc2ctPmxpc3QsICZpcGMtPmVtcHR5X2xpc3QpOworCQl0eF9kcm9wX2NudCsrOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIHRtcCwgJmlwYy0+cnhfbGlzdCwgbGlzdCkgeworCQlsaXN0X21vdmUoJm1zZy0+bGlzdCwgJmlwYy0+ZW1wdHlfbGlzdCk7CisJCXJ4X2Ryb3BfY250Kys7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXBjLT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7CisKKwlpZiAodHhfZHJvcF9jbnQgfHwgcnhfZHJvcF9jbnQpCisJCWRldl9lcnIoaXBjLT5kZXYsICJkcm9wcGVkIElQQyBtc2cgUlg9JWQsIFRYPSVkXG4iLAorCQkJdHhfZHJvcF9jbnQsIHJ4X2Ryb3BfY250KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9pcGNfZHJvcF9hbGwpOworCitpbnQgc3N0X2lwY19pbml0KHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYykKK3sKKwlpbnQgcmV0OworCisJSU5JVF9MSVNUX0hFQUQoJmlwYy0+dHhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmlwYy0+cnhfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmlwYy0+ZW1wdHlfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaXBjLT53YWl0X3R4cSk7CisKKwlyZXQgPSBtc2dfZW1wdHlfbGlzdF9pbml0KGlwYyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRU5PTUVNOworCisJLyogc3RhcnQgdGhlIElQQyBtZXNzYWdlIHRocmVhZCAqLworCWluaXRfa3RocmVhZF93b3JrZXIoJmlwYy0+a3dvcmtlcik7CisJaXBjLT50eF90aHJlYWQgPSBrdGhyZWFkX3J1bihrdGhyZWFkX3dvcmtlcl9mbiwKKwkJCQkJJmlwYy0+a3dvcmtlciwgIiVzIiwKKwkJCQkJZGV2X25hbWUoaXBjLT5kZXYpKTsKKwlpZiAoSVNfRVJSKGlwYy0+dHhfdGhyZWFkKSkgeworCQlkZXZfZXJyKGlwYy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBjcmVhdGUgbWVzc2FnZSBUWCB0YXNrXG4iKTsKKwkJcmV0ID0gUFRSX0VSUihpcGMtPnR4X3RocmVhZCk7CisJCWtmcmVlKGlwYy0+bXNnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpbml0X2t0aHJlYWRfd29yaygmaXBjLT5rd29yaywgaXBjX3R4X21zZ3MpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2lwY19pbml0KTsKKwordm9pZCBzc3RfaXBjX2Zpbmkoc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjKQoreworCWlmIChpcGMtPnR4X3RocmVhZCkKKwkJa3RocmVhZF9zdG9wKGlwYy0+dHhfdGhyZWFkKTsKKworCWlmIChpcGMtPm1zZykKKwkJa2ZyZWUoaXBjLT5tc2cpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2lwY19maW5pKTsKKworLyogTW9kdWxlIGluZm9ybWF0aW9uICovCitNT0RVTEVfQVVUSE9SKCJKaW4gWWFvIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIFNTVCBJUEMgZ2VuZXJpYyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2NvbW1vbi9zc3QtaXBjLmggYi9zb3VuZC9zb2MvaW50ZWwvY29tbW9uL3NzdC1pcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjVlYTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2NvbW1vbi9zc3QtaXBjLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIEludGVsIFNTVCBnZW5lcmljIElQQyBTdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpZm5kZWYgX19TU1RfR0VORVJJQ19JUENfSAorI2RlZmluZSBfX1NTVF9HRU5FUklDX0lQQ19ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisKKyNkZWZpbmUgSVBDX01BWF9NQUlMQk9YX0JZVEVTCTI1NgorCitzdHJ1Y3QgaXBjX21lc3NhZ2UgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1NjQgaGVhZGVyOworCisJLyogZGlyZWN0aW9uIHdydCBob3N0IENQVSAqLworCWNoYXIgdHhfZGF0YVtJUENfTUFYX01BSUxCT1hfQllURVNdOworCXNpemVfdCB0eF9zaXplOworCWNoYXIgcnhfZGF0YVtJUENfTUFYX01BSUxCT1hfQllURVNdOworCXNpemVfdCByeF9zaXplOworCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7CisJYm9vbCBwZW5kaW5nOworCWJvb2wgY29tcGxldGU7CisJYm9vbCB3YWl0OworCWludCBlcnJubzsKK307CisKK3N0cnVjdCBzc3RfZ2VuZXJpY19pcGM7CisKK3N0cnVjdCBzc3RfcGxhdF9pcGNfb3BzIHsKKwl2b2lkICgqdHhfbXNnKShzdHJ1Y3Qgc3N0X2dlbmVyaWNfaXBjICosIHN0cnVjdCBpcGNfbWVzc2FnZSAqKTsKKwl2b2lkICgqc2hpbV9kYmcpKHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKiwgY29uc3QgY2hhciAqKTsKKwl2b2lkICgqdHhfZGF0YV9jb3B5KShzdHJ1Y3QgaXBjX21lc3NhZ2UgKiwgY2hhciAqLCBzaXplX3QpOworCXU2NCAgKCpyZXBseV9tc2dfbWF0Y2gpKHU2NCBoZWFkZXIsIHU2NCAqbWFzayk7Cit9OworCisvKiBTU1QgZ2VuZXJpYyBJUEMgZGF0YSAqLworc3RydWN0IHNzdF9nZW5lcmljX2lwYyB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBzc3RfZHNwICpkc3A7CisKKwkvKiBJUEMgbWVzc2FnaW5nICovCisJc3RydWN0IGxpc3RfaGVhZCB0eF9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgcnhfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGVtcHR5X2xpc3Q7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF90eHE7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0eF90aHJlYWQ7CisJc3RydWN0IGt0aHJlYWRfd29ya2VyIGt3b3JrZXI7CisJc3RydWN0IGt0aHJlYWRfd29yayBrd29yazsKKwlib29sIHBlbmRpbmc7CisJc3RydWN0IGlwY19tZXNzYWdlICptc2c7CisKKwlzdHJ1Y3Qgc3N0X3BsYXRfaXBjX29wcyBvcHM7Cit9OworCitpbnQgc3N0X2lwY190eF9tZXNzYWdlX3dhaXQoc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLCB1NjQgaGVhZGVyLAorCXZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcywgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzKTsKKworaW50IHNzdF9pcGNfdHhfbWVzc2FnZV9ub3dhaXQoc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLCB1NjQgaGVhZGVyLAorCXZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcyk7CisKK3N0cnVjdCBpcGNfbWVzc2FnZSAqc3N0X2lwY19yZXBseV9maW5kX21zZyhzdHJ1Y3Qgc3N0X2dlbmVyaWNfaXBjICppcGMsCisJdTY0IGhlYWRlcik7CisKK3ZvaWQgc3N0X2lwY190eF9tc2dfcmVwbHlfY29tcGxldGUoc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjLAorCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnKTsKKwordm9pZCBzc3RfaXBjX2Ryb3BfYWxsKHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYyk7CitpbnQgc3N0X2lwY19pbml0KHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYyk7Cit2b2lkIHNzdF9pcGNfZmluaShzdHJ1Y3Qgc3N0X2dlbmVyaWNfaXBjICppcGMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsLmMgYi9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVkZjUxLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoKLSAqIEludGVsIEhhc3dlbGwgTHlueHBvaW50IFNTVCBBdWRpbwotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8c291bmQvY29yZS5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KLQotI2luY2x1ZGUgInNzdC1kc3AuaCIKLSNpbmNsdWRlICJzc3QtaGFzd2VsbC1pcGMuaCIKLQotI2luY2x1ZGUgIi4uL2NvZGVjcy9ydDU2NDAuaCIKLQotLyogSGFzd2VsbCBVTFQgcGxhdGZvcm1zIGhhdmUgYSBIZWFkcGhvbmUgYW5kIE1pYyBqYWNrICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgaGFzd2VsbF93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmVzIiwgTlVMTCksCi0JU05EX1NPQ19EQVBNX01JQygiTWljIiwgTlVMTCksCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBoYXN3ZWxsX3J0NTY0MF9tYXBbXSA9IHsKLQotCXsiSGVhZHBob25lcyIsIE5VTEwsICJIUE9SIn0sCi0JeyJIZWFkcGhvbmVzIiwgTlVMTCwgIkhQT0wifSwKLQl7IklOMlAiLCBOVUxMLCAiTWljIn0sCi0KLQkvKiBDT0RFQyBCRSBjb25uZWN0aW9ucyAqLwotCXsiU1NQMCBDT0RFQyBJTiIsIE5VTEwsICJBSUYxIENhcHR1cmUifSwKLQl7IkFJRjEgUGxheWJhY2siLCBOVUxMLCAiU1NQMCBDT0RFQyBPVVQifSwKLX07Ci0KLXN0YXRpYyBpbnQgaGFzd2VsbF9zc3AwX2ZpeHVwKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX2ludGVydmFsICpyYXRlID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJU05EUlZfUENNX0hXX1BBUkFNX1JBVEUpOwotCXN0cnVjdCBzbmRfaW50ZXJ2YWwgKmNoYW5uZWxzID0gaHdfcGFyYW1faW50ZXJ2YWwocGFyYW1zLAotCQkJCQkJU05EUlZfUENNX0hXX1BBUkFNX0NIQU5ORUxTKTsKLQotCS8qIFRoZSBBRFNQIHdpbGwgY292ZXJ0IHRoZSBGRSByYXRlIHRvIDQ4aywgc3RlcmVvICovCi0JcmF0ZS0+bWluID0gcmF0ZS0+bWF4ID0gNDgwMDA7Ci0JY2hhbm5lbHMtPm1pbiA9IGNoYW5uZWxzLT5tYXggPSAyOwotCi0JLyogc2V0IFNTUDAgdG8gMTYgYml0ICovCi0Jc25kX21hc2tfc2V0KCZwYXJhbXMtPm1hc2tzW1NORFJWX1BDTV9IV19QQVJBTV9GT1JNQVQgLQotCQkJCSAgICBTTkRSVl9QQ01fSFdfUEFSQU1fRklSU1RfTUFTS10sCi0JCQkJICAgIFNORFJWX1BDTV9GT1JNQVRfUzE2X0xFKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBoYXN3ZWxsX3J0NTY0MF9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0Jc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0JaW50IHJldDsKLQotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoY29kZWNfZGFpLCBSVDU2NDBfU0NMS19TX01DTEssIDEyMjg4MDAwLAotCQlTTkRfU09DX0NMT0NLX0lOKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsICJjYW4ndCBzZXQgY29kZWMgc3lzY2xrIGNvbmZpZ3VyYXRpb25cbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIHNldCBjb3JyZWN0IGNvZGVjIGZpbHRlciBmb3IgREFJIGZvcm1hdCBhbmQgY2xvY2sgY29uZmlnICovCi0Jc25kX3NvY191cGRhdGVfYml0cyhydGQtPmNvZGVjLCAweDgzLCAweGZmZmYsIDB4ODAwMCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIGhhc3dlbGxfcnQ1NjQwX29wcyA9IHsKLQkuaHdfcGFyYW1zID0gaGFzd2VsbF9ydDU2NDBfaHdfcGFyYW1zLAotfTsKLQotc3RhdGljIGludCBoYXN3ZWxsX3J0ZF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHJ0ZC0+cGxhdGZvcm0tPmRldik7Ci0Jc3RydWN0IHNzdF9oc3cgKmhhc3dlbGwgPSBwZGF0YS0+ZHNwOwotCWludCByZXQ7Ci0KLQkvKiBTZXQgQURTUCBTU1AgcG9ydCBzZXR0aW5ncyAqLwotCXJldCA9IHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcoaGFzd2VsbCwgU1NUX0hTV19ERVZJQ0VfU1NQXzAsCi0JCVNTVF9IU1dfREVWSUNFX01DTEtfRlJFUV8yNF9NSFosCi0JCVNTVF9IU1dfREVWSUNFX0NMT0NLX01BU1RFUiwgOSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihydGQtPmRldiwgImZhaWxlZCB0byBzZXQgZGV2aWNlIGNvbmZpZ1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBoYXN3ZWxsX3J0NTY0MF9kYWlzW10gPSB7Ci0JLyogRnJvbnQgRW5kIERBSSBsaW5rcyAqLwotCXsKLQkJLm5hbWUgPSAiU3lzdGVtIiwKLQkJLnN0cmVhbV9uYW1lID0gIlN5c3RlbSBQbGF5YmFjay9DYXB0dXJlIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJTeXN0ZW0gUGluIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAotCQkuZHluYW1pYyA9IDEsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkuaW5pdCA9IGhhc3dlbGxfcnRkX2luaXQsCi0JCS50cmlnZ2VyID0ge1NORF9TT0NfRFBDTV9UUklHR0VSX1BPU1QsIFNORF9TT0NfRFBDTV9UUklHR0VSX1BPU1R9LAotCQkuZHBjbV9wbGF5YmFjayA9IDEsCi0JCS5kcGNtX2NhcHR1cmUgPSAxLAotCX0sCi0JewotCQkubmFtZSA9ICJPZmZsb2FkMCIsCi0JCS5zdHJlYW1fbmFtZSA9ICJPZmZsb2FkMCBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAiT2ZmbG9hZDAgUGluIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAotCQkuZHluYW1pYyA9IDEsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULCBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCX0sCi0JewotCQkubmFtZSA9ICJPZmZsb2FkMSIsCi0JCS5zdHJlYW1fbmFtZSA9ICJPZmZsb2FkMSBQbGF5YmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAiT2ZmbG9hZDEgUGluIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAotCQkuZHluYW1pYyA9IDEsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULCBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCX0sCi0JewotCQkubmFtZSA9ICJMb29wYmFjayIsCi0JCS5zdHJlYW1fbmFtZSA9ICJMb29wYmFjayIsCi0JCS5jcHVfZGFpX25hbWUgPSAiTG9vcGJhY2sgUGluIiwKLQkJLnBsYXRmb3JtX25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAotCQkuZHluYW1pYyA9IDAsCi0JCS5jb2RlY19uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkuY29kZWNfZGFpX25hbWUgPSAic25kLXNvYy1kdW1teS1kYWkiLAotCQkudHJpZ2dlciA9IHtTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NULCBTTkRfU09DX0RQQ01fVFJJR0dFUl9QT1NUfSwKLQkJLmRwY21fY2FwdHVyZSA9IDEsCi0JfSwKLQotCS8qIEJhY2sgRW5kIERBSSBsaW5rcyAqLwotCXsKLQkJLyogU1NQMCAtIENvZGVjICovCi0JCS5uYW1lID0gIkNvZGVjIiwKLQkJLmJlX2lkID0gMCwKLQkJLmNwdV9kYWlfbmFtZSA9ICJzbmQtc29jLWR1bW15LWRhaSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gInNuZC1zb2MtZHVtbXkiLAotCQkubm9fcGNtID0gMSwKLQkJLmNvZGVjX25hbWUgPSAiaTJjLUlOVDMzQ0E6MDAiLAotCQkuY29kZWNfZGFpX25hbWUgPSAicnQ1NjQwLWFpZjEiLAotCQkuZGFpX2ZtdCA9IFNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCVNORF9TT0NfREFJRk1UX0NCU19DRlMsCi0JCS5pZ25vcmVfc3VzcGVuZCA9IDEsCi0JCS5pZ25vcmVfcG1kb3duX3RpbWUgPSAxLAotCQkuYmVfaHdfcGFyYW1zX2ZpeHVwID0gaGFzd2VsbF9zc3AwX2ZpeHVwLAotCQkub3BzID0gJmhhc3dlbGxfcnQ1NjQwX29wcywKLQkJLmRwY21fcGxheWJhY2sgPSAxLAotCQkuZHBjbV9jYXB0dXJlID0gMSwKLQl9LAotfTsKLQotLyogYXVkaW8gbWFjaGluZSBkcml2ZXIgZm9yIEhhc3dlbGwgTHlueHBvaW50IERTUCArIFJUNTY0MCAqLwotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NhcmQgaGFzd2VsbF9ydDU2NDAgPSB7Ci0JLm5hbWUgPSAiaGFzd2VsbC1ydDU2NDAiLAotCS5vd25lciA9IFRISVNfTU9EVUxFLAotCS5kYWlfbGluayA9IGhhc3dlbGxfcnQ1NjQwX2RhaXMsCi0JLm51bV9saW5rcyA9IEFSUkFZX1NJWkUoaGFzd2VsbF9ydDU2NDBfZGFpcyksCi0JLmRhcG1fd2lkZ2V0cyA9IGhhc3dlbGxfd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoaGFzd2VsbF93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBoYXN3ZWxsX3J0NTY0MF9tYXAsCi0JLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoaGFzd2VsbF9ydDU2NDBfbWFwKSwKLQkuZnVsbHlfcm91dGVkID0gdHJ1ZSwKLX07Ci0KLXN0YXRpYyBpbnQgaGFzd2VsbF9hdWRpb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWhhc3dlbGxfcnQ1NjQwLmRldiA9ICZwZGV2LT5kZXY7Ci0KLQlyZXR1cm4gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnBkZXYtPmRldiwgJmhhc3dlbGxfcnQ1NjQwKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaGFzd2VsbF9hdWRpbyA9IHsKLQkucHJvYmUgPSBoYXN3ZWxsX2F1ZGlvX3Byb2JlLAotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lID0gImhhc3dlbGwtYXVkaW8iLAotCX0sCi19OwotCi1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGhhc3dlbGxfYXVkaW8pCi0KLS8qIE1vZHVsZSBpbmZvcm1hdGlvbiAqLwotTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgWGluZ2NoYW8gV2FuZyIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCBTU1QgQXVkaW8gZm9yIEhhc3dlbGwgTHlueHBvaW50Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmhhc3dlbGwtYXVkaW8iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsL01ha2VmaWxlIGIvc291bmQvc29jL2ludGVsL2hhc3dlbGwvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxNzIzMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorc25kLXNvYy1zc3QtaGFzd2VsbC1wY20tb2JqcyA6PSBcCisJICAgICAgICBzc3QtaGFzd2VsbC1pcGMubyBzc3QtaGFzd2VsbC1wY20ubyBzc3QtaGFzd2VsbC1kc3AubworCitvYmotJChDT05GSUdfU05EX1NPQ19JTlRFTF9IQVNXRUxMKSArPSBzbmQtc29jLXNzdC1oYXN3ZWxsLXBjbS5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC9zc3QtaGFzd2VsbC1kc3AuYyBiL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsL3NzdC1oYXN3ZWxsLWRzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOTQ5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC9zc3QtaGFzd2VsbC1kc3AuYwpAQCAtMCwwICsxLDcwOSBAQAorLyoKKyAqIEludGVsIEhhc3dlbGwgU1NUIERTUCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorCisjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1kc3AuaCIKKyNpbmNsdWRlICIuLi9jb21tb24vc3N0LWRzcC1wcml2LmgiCisjaW5jbHVkZSAiLi4vaGFzd2VsbC9zc3QtaGFzd2VsbC1pcGMuaCIKKworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9oc3dhZHNwLmg+CisKKyNkZWZpbmUgU1NUX0hTV19GV19TSUdOQVRVUkVfU0laRQk0CisjZGVmaW5lIFNTVF9IU1dfRldfU0lHTgkJCSIkU1NUIgorI2RlZmluZSBTU1RfSFNXX0ZXX0xJQl9TSUdOCQkiJExJQiIKKworI2RlZmluZSBTU1RfV1BUX1NISU1fT0ZGU0VUCTB4RkIwMDAKKyNkZWZpbmUgU1NUX0xQX1NISU1fT0ZGU0VUCTB4RTcwMDAKKyNkZWZpbmUgU1NUX1dQVF9JUkFNX09GRlNFVAkweEEwMDAwCisjZGVmaW5lIFNTVF9MUF9JUkFNX09GRlNFVAkweDgwMDAwCisjZGVmaW5lIFNTVF9XUFRfRFNQX0RSQU1fT0ZGU0VUCTB4NDAwMDAwCisjZGVmaW5lIFNTVF9XUFRfRFNQX0lSQU1fT0ZGU0VUCTB4MDAwMDAKKyNkZWZpbmUgU1NUX0xQVF9EU1BfRFJBTV9PRkZTRVQJMHg0MDAwMDAKKyNkZWZpbmUgU1NUX0xQVF9EU1BfSVJBTV9PRkZTRVQJMHgwMDAwMAorCisjZGVmaW5lIFNTVF9TSElNX1BNX1JFRwkJMHg4NAorCisjZGVmaW5lIFNTVF9IU1dfSVJBTQkxCisjZGVmaW5lIFNTVF9IU1dfRFJBTQkyCisjZGVmaW5lIFNTVF9IU1dfUkVHUwkzCisKK3N0cnVjdCBkbWFfYmxvY2tfaW5mbyB7CisJX19sZTMyIHR5cGU7CQkvKiBJUkFNL0RSQU0gKi8KKwlfX2xlMzIgc2l6ZTsJCS8qIEJ5dGVzICovCisJX19sZTMyIHJhbV9vZmZzZXQ7CS8qIE9mZnNldCBpbiBJL0RSQU0gKi8KKwlfX2xlMzIgcnN2ZDsJCS8qIFJlc2VydmVkIGZpZWxkICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgZndfbW9kdWxlX2luZm8geworCV9fbGUzMiBwZXJzaXN0ZW50X3NpemU7CisJX19sZTMyIHNjcmF0Y2hfc2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBmd19oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW1NTVF9IU1dfRldfU0lHTkFUVVJFX1NJWkVdOyAvKiBGVyBzaWduYXR1cmUgKi8KKwlfX2xlMzIgZmlsZV9zaXplOwkJLyogc2l6ZSBvZiBmdyBtaW51cyB0aGlzIGhlYWRlciAqLworCV9fbGUzMiBtb2R1bGVzOwkJLyogICMgb2YgbW9kdWxlcyAqLworCV9fbGUzMiBmaWxlX2Zvcm1hdDsJLyogdmVyc2lvbiBvZiBoZWFkZXIgZm9ybWF0ICovCisJX19sZTMyIHJlc2VydmVkWzRdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGZ3X21vZHVsZV9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW1NTVF9IU1dfRldfU0lHTkFUVVJFX1NJWkVdOyAvKiBtb2R1bGUgc2lnbmF0dXJlICovCisJX19sZTMyIG1vZF9zaXplOwkvKiBzaXplIG9mIG1vZHVsZSAqLworCV9fbGUzMiBibG9ja3M7CS8qICMgb2YgYmxvY2tzICovCisJX19sZTE2IHBhZGRpbmc7CisJX19sZTE2IHR5cGU7CS8qIGNvZGVjIHR5cGUsIHBwIGxpYiAqLworCV9fbGUzMiBlbnRyeV9wb2ludDsKKwlzdHJ1Y3QgZndfbW9kdWxlX2luZm8gaW5mbzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpYyB2b2lkIGhzd19mcmVlKHN0cnVjdCBzc3RfZHNwICpzc3QpOworCitzdGF0aWMgaW50IGhzd19wYXJzZV9tb2R1bGUoc3RydWN0IHNzdF9kc3AgKmRzcCwgc3RydWN0IHNzdF9mdyAqZncsCisJc3RydWN0IGZ3X21vZHVsZV9oZWFkZXIgKm1vZHVsZSkKK3sKKwlzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8gKmJsb2NrOworCXN0cnVjdCBzc3RfbW9kdWxlICptb2Q7CisJc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgdGVtcGxhdGU7CisJaW50IGNvdW50LCByZXQ7CisJdm9pZCBfX2lvbWVtICpyYW07CisKKwkvKiBUT0RPOiBhbGxvd2VkIG1vZHVsZSB0eXBlcyBuZWVkIHRvIGJlIGNvbmZpZ3VyYWJsZSAqLworCWlmIChtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfQkFTRV9GVworCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfUENNX1NZU1RFTQorCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfUENNCisJCSYmIG1vZHVsZS0+dHlwZSAhPSBTU1RfSFNXX01PRFVMRV9QQ01fUkVGRVJFTkNFCisJCSYmIG1vZHVsZS0+dHlwZSAhPSBTU1RfSFNXX01PRFVMRV9QQ01fQ0FQVFVSRQorCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfV0FWRVMKKwkJJiYgbW9kdWxlLT50eXBlICE9IFNTVF9IU1dfTU9EVUxFX0xQQUwpCisJCXJldHVybiAwOworCisJZGV2X2RiZyhkc3AtPmRldiwgIm5ldyBtb2R1bGUgc2lnbiAweCVzIHNpemUgMHgleCBibG9ja3MgMHgleCB0eXBlIDB4JXhcbiIsCisJCW1vZHVsZS0+c2lnbmF0dXJlLCBtb2R1bGUtPm1vZF9zaXplLAorCQltb2R1bGUtPmJsb2NrcywgbW9kdWxlLT50eXBlKTsKKwlkZXZfZGJnKGRzcC0+ZGV2LCAiIGVudHJ5cG9pbnQgMHgleFxuIiwgbW9kdWxlLT5lbnRyeV9wb2ludCk7CisJZGV2X2RiZyhkc3AtPmRldiwgIiBwZXJzaXN0ZW50IDB4JXggc2NyYXRjaCAweCV4XG4iLAorCQltb2R1bGUtPmluZm8ucGVyc2lzdGVudF9zaXplLCBtb2R1bGUtPmluZm8uc2NyYXRjaF9zaXplKTsKKworCW1lbXNldCgmdGVtcGxhdGUsIDAsIHNpemVvZih0ZW1wbGF0ZSkpOworCXRlbXBsYXRlLmlkID0gbW9kdWxlLT50eXBlOworCXRlbXBsYXRlLmVudHJ5ID0gbW9kdWxlLT5lbnRyeV9wb2ludCAtIDQ7CisJdGVtcGxhdGUucGVyc2lzdGVudF9zaXplID0gbW9kdWxlLT5pbmZvLnBlcnNpc3RlbnRfc2l6ZTsKKwl0ZW1wbGF0ZS5zY3JhdGNoX3NpemUgPSBtb2R1bGUtPmluZm8uc2NyYXRjaF9zaXplOworCisJbW9kID0gc3N0X21vZHVsZV9uZXcoZncsICZ0ZW1wbGF0ZSwgTlVMTCk7CisJaWYgKG1vZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJsb2NrID0gKHZvaWQgKiltb2R1bGUgKyBzaXplb2YoKm1vZHVsZSk7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBtb2R1bGUtPmJsb2NrczsgY291bnQrKykgeworCisJCWlmIChibG9jay0+c2l6ZSA8PSAwKSB7CisJCQlkZXZfZXJyKGRzcC0+ZGV2LAorCQkJCSJlcnJvcjogYmxvY2sgJWQgc2l6ZSBpbnZhbGlkXG4iLCBjb3VudCk7CisJCQlzc3RfbW9kdWxlX2ZyZWUobW9kKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJc3dpdGNoIChibG9jay0+dHlwZSkgeworCQljYXNlIFNTVF9IU1dfSVJBTToKKwkJCXJhbSA9IGRzcC0+YWRkci5scGU7CisJCQltb2QtPm9mZnNldCA9CisJCQkJYmxvY2stPnJhbV9vZmZzZXQgKyBkc3AtPmFkZHIuaXJhbV9vZmZzZXQ7CisJCQltb2QtPnR5cGUgPSBTU1RfTUVNX0lSQU07CisJCQlicmVhazsKKwkJY2FzZSBTU1RfSFNXX0RSQU06CisJCWNhc2UgU1NUX0hTV19SRUdTOgorCQkJcmFtID0gZHNwLT5hZGRyLmxwZTsKKwkJCW1vZC0+b2Zmc2V0ID0gYmxvY2stPnJhbV9vZmZzZXQ7CisJCQltb2QtPnR5cGUgPSBTU1RfTUVNX0RSQU07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogYmFkIHR5cGUgMHgleCBmb3IgYmxvY2sgMHgleFxuIiwKKwkJCQlibG9jay0+dHlwZSwgY291bnQpOworCQkJc3N0X21vZHVsZV9mcmVlKG1vZCk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCW1vZC0+c2l6ZSA9IGJsb2NrLT5zaXplOworCQltb2QtPmRhdGEgPSAodm9pZCAqKWJsb2NrICsgc2l6ZW9mKCpibG9jayk7CisJCW1vZC0+ZGF0YV9vZmZzZXQgPSBtb2QtPmRhdGEgLSBmdy0+ZG1hX2J1ZjsKKworCQlkZXZfZGJnKGRzcC0+ZGV2LCAibW9kdWxlIGJsb2NrICVkIHR5cGUgMHgleCAiCisJCQkic2l6ZSAweCV4ID09PiByYW0gJXAgb2Zmc2V0IDB4JXhcbiIsCisJCQljb3VudCwgbW9kLT50eXBlLCBibG9jay0+c2l6ZSwgcmFtLAorCQkJYmxvY2stPnJhbV9vZmZzZXQpOworCisJCXJldCA9IHNzdF9tb2R1bGVfYWxsb2NfYmxvY2tzKG1vZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGNvdWxkIG5vdCBhbGxvY2F0ZSBibG9ja3MgZm9yIG1vZHVsZSAlZFxuIiwKKwkJCQljb3VudCk7CisJCQlzc3RfbW9kdWxlX2ZyZWUobW9kKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlibG9jayA9ICh2b2lkICopYmxvY2sgKyBzaXplb2YoKmJsb2NrKSArIGJsb2NrLT5zaXplOworCX0KKwltb2QtPnN0YXRlID0gU1NUX01PRFVMRV9TVEFURV9MT0FERUQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfcGFyc2VfZndfaW1hZ2Uoc3RydWN0IHNzdF9mdyAqc3N0X2Z3KQoreworCXN0cnVjdCBmd19oZWFkZXIgKmhlYWRlcjsKKwlzdHJ1Y3QgZndfbW9kdWxlX2hlYWRlciAqbW9kdWxlOworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfZnctPmRzcDsKKwlpbnQgcmV0LCBjb3VudDsKKworCS8qIFJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkYXRhIHBvaW50ZXIgKi8KKwloZWFkZXIgPSAoc3RydWN0IGZ3X2hlYWRlciAqKXNzdF9mdy0+ZG1hX2J1ZjsKKworCS8qIHZlcmlmeSBGVyAqLworCWlmICgoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgU1NUX0hTV19GV19TSUdOLCA0KSAhPSAwKSB8fAorCQkoc3N0X2Z3LT5zaXplICE9IGhlYWRlci0+ZmlsZV9zaXplICsgc2l6ZW9mKCpoZWFkZXIpKSkgeworCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGludmFsaWQgZncgc2lnbi9maWxlc2l6ZSBtaXNtYXRjaFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcoZHNwLT5kZXYsICJoZWFkZXIgc2l6ZT0weCV4IG1vZHVsZXM9MHgleCBmbXQ9MHgleCBzaXplPSV6dVxuIiwKKwkJaGVhZGVyLT5maWxlX3NpemUsIGhlYWRlci0+bW9kdWxlcywKKwkJaGVhZGVyLT5maWxlX2Zvcm1hdCwgc2l6ZW9mKCpoZWFkZXIpKTsKKworCS8qIHBhcnNlIGVhY2ggbW9kdWxlICovCisJbW9kdWxlID0gKHZvaWQgKilzc3RfZnctPmRtYV9idWYgKyBzaXplb2YoKmhlYWRlcik7CisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgaGVhZGVyLT5tb2R1bGVzOyBjb3VudCsrKSB7CisKKwkJLyogbW9kdWxlICovCisJCXJldCA9IGhzd19wYXJzZV9tb2R1bGUoZHNwLCBzc3RfZncsIG1vZHVsZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGludmFsaWQgbW9kdWxlICVkXG4iLCBjb3VudCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCW1vZHVsZSA9ICh2b2lkICopbW9kdWxlICsgc2l6ZW9mKCptb2R1bGUpICsgbW9kdWxlLT5tb2Rfc2l6ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGhzd19pcnEoaW50IGlycSwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gKHN0cnVjdCBzc3RfZHNwICopIGNvbnRleHQ7CisJdTMyIGlzcjsKKwlpbnQgcmV0ID0gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJnNzdC0+c3BpbmxvY2spOworCisJLyogSW50ZXJydXB0IGFycml2ZWQsIGNoZWNrIHNyYyAqLworCWlzciA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lTUlgpOworCWlmIChpc3IgJiBTU1RfSVNSWF9ET05FKSB7CisJCXRyYWNlX3NzdF9pcnFfZG9uZShpc3IsCisJCQlzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JTVJYKSk7CisKKwkJLyogTWFzayBEb25lIGludGVycnVwdCBiZWZvcmUgcmV0dXJuICovCisJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJU1NUX0lNUlhfRE9ORSwgU1NUX0lNUlhfRE9ORSk7CisJCXJldCA9IElSUV9XQUtFX1RIUkVBRDsKKwl9CisKKwlpZiAoaXNyICYgU1NUX0lTUlhfQlVTWSkgeworCQl0cmFjZV9zc3RfaXJxX2J1c3koaXNyLAorCQkJc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSU1SWCkpOworCisJCS8qIE1hc2sgQnVzeSBpbnRlcnJ1cHQgYmVmb3JlIHJldHVybiAqLworCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfSU1SWCwKKwkJCVNTVF9JTVJYX0JVU1ksIFNTVF9JTVJYX0JVU1kpOworCQlyZXQgPSBJUlFfV0FLRV9USFJFQUQ7CisJfQorCisJc3Bpbl91bmxvY2soJnNzdC0+c3BpbmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGhzd19zZXRfZHNwX0QzKHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJdTMyIHZhbDsKKwl1MzIgcmVnOworCisJLyogRGlzYWJsZSBjb3JlIGNsb2NrIGdhdGluZyAoVkRSVENUTDIuRENMQ0dFID0gMCkgKi8KKwlyZWcgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7CisJcmVnICY9IH4oU1NUX1ZEUlRDTDJfRENMQ0dFIHwgU1NUX1ZEUlRDTDJfRFRDR0UpOworCXdyaXRlbChyZWcsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKKworCS8qIGVuYWJsZSBwb3dlciBnYXRpbmcgYW5kIHN3aXRjaCBvZmYgRFJBTSAmIElSQU0gYmxvY2tzICovCisJdmFsID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOworCXZhbCB8PSBTU1RfVkRSVENMMF9EU1JBTVBHRV9NQVNLIHwKKwkJU1NUX1ZEUlRDTDBfSVNSQU1QR0VfTUFTSzsKKwl2YWwgJj0gfihTU1RfVkRSVENMMF9EM1BHRCB8IFNTVF9WRFJUQ0wwX0QzU1JBTVBHRCk7CisJd3JpdGVsKHZhbCwgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOworCisJLyogc3dpdGNoIG9mZiBhdWRpbyBQTEwgKi8KKwl2YWwgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7CisJdmFsIHw9IFNTVF9WRFJUQ0wyX0FQTExTRV9NQVNLOworCXdyaXRlbCh2YWwsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKKworCS8qIGRpc2FibGUgTUNMSyhjbGtjdGwuc21vcyA9IDApICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0NMS0NUTCwKKwkJU1NUX0NMS0NUTF9NQVNLLCAwKTsKKworCS8qIFNldCBEMyBzdGF0ZSwgZGVsYXkgNTAgdXMgKi8KKwl2YWwgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9QTUNTKTsKKwl2YWwgfD0gU1NUX1BNQ1NfUFNfTUFTSzsKKwl3cml0ZWwodmFsLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9QTUNTKTsKKwl1ZGVsYXkoNTApOworCisJLyogRW5hYmxlIGNvcmUgY2xvY2sgZ2F0aW5nIChWRFJUQ1RMMi5EQ0xDR0UgPSAxKSwgZGVsYXkgNTAgdXMgKi8KKwlyZWcgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7CisJcmVnIHw9IFNTVF9WRFJUQ0wyX0RDTENHRSB8IFNTVF9WRFJUQ0wyX0RUQ0dFOworCXdyaXRlbChyZWcsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKKworCXVkZWxheSg1MCk7CisKK30KKworc3RhdGljIHZvaWQgaHN3X3Jlc2V0KHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJLyogcHV0IERTUCBpbnRvIHJlc2V0IGFuZCBzdGFsbCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9DU1IsCisJCVNTVF9DU1JfUlNUIHwgU1NUX0NTUl9TVEFMTCwKKwkJU1NUX0NTUl9SU1QgfCBTU1RfQ1NSX1NUQUxMKTsKKworCS8qIGtlZXAgaW4gcmVzZXQgZm9yIDEwbXMgKi8KKwltZGVsYXkoMTApOworCisJLyogdGFrZSBEU1Agb3V0IG9mIHJlc2V0IGFuZCBrZWVwIHN0YWxsZWQgZm9yIEZXIGxvYWRpbmcgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSLAorCQlTU1RfQ1NSX1JTVCB8IFNTVF9DU1JfU1RBTEwsIFNTVF9DU1JfU1RBTEwpOworfQorCitzdGF0aWMgaW50IGhzd19zZXRfZHNwX0QwKHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJaW50IHRyaWVzID0gMTA7CisJdTMyIHJlZywgZndfZHVtcF9iaXQ7CisKKwkvKiBEaXNhYmxlIGNvcmUgY2xvY2sgZ2F0aW5nIChWRFJUQ1RMMi5EQ0xDR0UgPSAwKSAqLworCXJlZyA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKKwlyZWcgJj0gfihTU1RfVkRSVENMMl9EQ0xDR0UgfCBTU1RfVkRSVENMMl9EVENHRSk7CisJd3JpdGVsKHJlZywgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOworCisJLyogRGlzYWJsZSBEM1BHIChWRFJUQ1RMMC5EM1BHRCA9IDEpICovCisJcmVnID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOworCXJlZyB8PSBTU1RfVkRSVENMMF9EM1BHRDsKKwl3cml0ZWwocmVnLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMCk7CisKKwkvKiBTZXQgRDAgc3RhdGUgKi8KKwlyZWcgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9QTUNTKTsKKwlyZWcgJj0gflNTVF9QTUNTX1BTX01BU0s7CisJd3JpdGVsKHJlZywgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfUE1DUyk7CisKKwkvKiBjaGVjayB0aGF0IEFEU1Agc2hpbSBpcyBlbmFibGVkICovCisJd2hpbGUgKHRyaWVzLS0pIHsKKwkJcmVnID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfUE1DUykgJiBTU1RfUE1DU19QU19NQVNLOworCQlpZiAocmVnID09IDApCisJCQlnb3RvIGZpbmlzaDsKKworCQltc2xlZXAoMSk7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7CisKK2ZpbmlzaDoKKwkvKiBzZWxlY3QgU1NQMSAxOS4yTUh6IGJhc2UgY2xvY2ssIFNTUCBjbG9jayAwLCB0dXJuIG9mZiBMb3cgUG93ZXIgQ2xvY2sgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSLAorCQlTU1RfQ1NSX1MxSU9DUyB8IFNTVF9DU1JfU0JDUzEgfCBTU1RfQ1NSX0xQQ1MsIDB4MCk7CisKKwkvKiBzdGFsbCBEU1AgY29yZSwgc2V0IGNsayB0byAxOTIvOTZNaHogKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LAorCQlTU1RfQ1NSLCBTU1RfQ1NSX1NUQUxMIHwgU1NUX0NTUl9EQ1NfTUFTSywKKwkJU1NUX0NTUl9TVEFMTCB8IFNTVF9DU1JfRENTKDQpKTsKKworCS8qIFNldCAyNE1IeiBNQ0xLLCBwcmV2ZW50IGxvY2FsIGNsb2NrIGdhdGluZywgZW5hYmxlIFNTUDAgY2xvY2sgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ0xLQ1RMLAorCQlTU1RfQ0xLQ1RMX01BU0sgfCBTU1RfQ0xLQ1RMX0RDUExDRyB8IFNTVF9DTEtDVExfU0NPRTAsCisJCVNTVF9DTEtDVExfTUFTSyB8IFNTVF9DTEtDVExfRENQTENHIHwgU1NUX0NMS0NUTF9TQ09FMCk7CisKKwkvKiBTdGFsbCBhbmQgcmVzZXQgY29yZSwgc2V0IENTUiAqLworCWhzd19yZXNldChzc3QpOworCisJLyogRW5hYmxlIGNvcmUgY2xvY2sgZ2F0aW5nIChWRFJUQ1RMMi5EQ0xDR0UgPSAxKSwgZGVsYXkgNTAgdXMgKi8KKwlyZWcgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7CisJcmVnIHw9IFNTVF9WRFJUQ0wyX0RDTENHRSB8IFNTVF9WRFJUQ0wyX0RUQ0dFOworCXdyaXRlbChyZWcsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKKworCXVkZWxheSg1MCk7CisKKwkvKiBzd2l0Y2ggb24gYXVkaW8gUExMICovCisJcmVnID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOworCXJlZyAmPSB+U1NUX1ZEUlRDTDJfQVBMTFNFX01BU0s7CisJd3JpdGVsKHJlZywgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOworCisJLyogc2V0IGRlZmF1bHQgcG93ZXIgZ2F0aW5nIGNvbnRyb2wsIGVuYWJsZSBwb3dlciBnYXRpbmcgY29udHJvbCBmb3IgYWxsIGJsb2Nrcy4gdGhhdCBpcywKKwljYW4ndCBiZSBhY2Nlc3NlZCwgcGxlYXNlIGVuYWJsZSBlYWNoIGJsb2NrIGJlZm9yZSBhY2Nlc3NpbmcuICovCisJcmVnID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOworCXJlZyB8PSBTU1RfVkRSVENMMF9EU1JBTVBHRV9NQVNLIHwgU1NUX1ZEUlRDTDBfSVNSQU1QR0VfTUFTSzsKKwkvKiBmb3IgRDAsIGFsd2F5cyBlbmFibGUgdGhlIGJsb2NrKERTUkFNWzBdKSB1c2VkIGZvciBGVyBkdW1wICovCisJZndfZHVtcF9iaXQgPSAxIDw8IFNTVF9WRFJUQ0wwX0RTUkFNUEdFX1NISUZUOworCXdyaXRlbChyZWcgJiB+ZndfZHVtcF9iaXQsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKKworCisJLyogZGlzYWJsZSBETUEgZmluaXNoIGZ1bmN0aW9uIGZvciBTU1AwICYgU1NQMSAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9DU1IyLCBTU1RfQ1NSMl9TREZEX1NTUDEsCisJCVNTVF9DU1IyX1NERkRfU1NQMSk7CisKKwkvKiBzZXQgb24tZGVtb25kIG1vZGUgb24gZW5naW5lIDAsMSBmb3IgYWxsIGNoYW5uZWxzICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKHNzdCwgU1NUX0hNREMsCisJCQlTU1RfSE1EQ19IRERBX0UwX0FMTENIIHwgU1NUX0hNRENfSEREQV9FMV9BTExDSCwKKwkJCVNTVF9ITURDX0hEREFfRTBfQUxMQ0ggfCBTU1RfSE1EQ19IRERBX0UxX0FMTENIKTsKKworCS8qIEVuYWJsZSBJbnRlcnJ1cHQgZnJvbSBib3RoIHNpZGVzICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKHNzdCwgU1NUX0lNUlgsIChTU1RfSU1SWF9CVVNZIHwgU1NUX0lNUlhfRE9ORSksCisJCQkJIDB4MCk7CisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKHNzdCwgU1NUX0lNUkQsIChTU1RfSU1SRF9ET05FIHwgU1NUX0lNUkRfQlVTWSB8CisJCQkJU1NUX0lNUkRfU1NQMCB8IFNTVF9JTVJEX0RNQUMpLCAweDApOworCisJLyogY2xlYXIgSVBDIHJlZ2lzdGVycyAqLworCXNzdF9kc3Bfc2hpbV93cml0ZShzc3QsIFNTVF9JUENYLCAweDApOworCXNzdF9kc3Bfc2hpbV93cml0ZShzc3QsIFNTVF9JUENELCAweDApOworCXNzdF9kc3Bfc2hpbV93cml0ZShzc3QsIDB4ODAsIDB4Nik7CisJc3N0X2RzcF9zaGltX3dyaXRlKHNzdCwgMHhlMCwgMHgzMDBhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoc3dfYm9vdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCS8qIHNldCBvcG9ydHVuaXN0aWMgbW9kZSBvbiBlbmdpbmUgMCwxIGZvciBhbGwgY2hhbm5lbHMgKi8KKwlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHMoc3N0LCBTU1RfSE1EQywKKwkJCVNTVF9ITURDX0hEREFfRTBfQUxMQ0ggfCBTU1RfSE1EQ19IRERBX0UxX0FMTENILCAwKTsKKworCS8qIHNldCBEU1AgdG8gUlVOICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0NTUiwgU1NUX0NTUl9TVEFMTCwgMHgwKTsKK30KKworc3RhdGljIHZvaWQgaHN3X3N0YWxsKHN0cnVjdCBzc3RfZHNwICpzc3QpCit7CisJLyogc3RhbGwgRFNQICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKHNzdCwgU1NUX0NTUiwKKwkJU1NUX0NTUl8yNE1IWl9MUENTIHwgU1NUX0NTUl9TVEFMTCwKKwkJU1NUX0NTUl9TVEFMTCB8IFNTVF9DU1JfMjRNSFpfTFBDUyk7Cit9CisKK3N0YXRpYyB2b2lkIGhzd19zbGVlcChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQoreworCWRldl9kYmcoc3N0LT5kZXYsICJIU1dfUE0gZHNwIHJ1bnRpbWUgc3VzcGVuZFxuIik7CisKKwkvKiBwdXQgRFNQIGludG8gcmVzZXQgYW5kIHN0YWxsICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKHNzdCwgU1NUX0NTUiwKKwkJU1NUX0NTUl8yNE1IWl9MUENTIHwgU1NUX0NTUl9SU1QgfCBTU1RfQ1NSX1NUQUxMLAorCQlTU1RfQ1NSX1JTVCB8IFNTVF9DU1JfU1RBTEwgfCBTU1RfQ1NSXzI0TUhaX0xQQ1MpOworCisJaHN3X3NldF9kc3BfRDMoc3N0KTsKKwlkZXZfZGJnKHNzdC0+ZGV2LCAiSFNXX1BNIGRzcCBydW50aW1lIHN1c3BlbmQgZXhpdFxuIik7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3dha2Uoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwlpbnQgcmV0OworCisJZGV2X2RiZyhzc3QtPmRldiwgIkhTV19QTSBkc3AgcnVudGltZSByZXN1bWVcbiIpOworCisJcmV0ID0gaHN3X3NldF9kc3BfRDAoc3N0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWRldl9kYmcoc3N0LT5kZXYsICJIU1dfUE0gZHNwIHJ1bnRpbWUgcmVzdW1lIGV4aXRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24geworCXUzMiBzdGFydDsKKwl1MzIgZW5kOworCWludCBibG9ja3M7CisJZW51bSBzc3RfbWVtX3R5cGUgdHlwZTsKK307CisKKy8qIGx5bnggcG9pbnQgQURTUCBtZW0gcmVnaW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24gbHBfcmVnaW9uW10gPSB7CisJezB4MDAwMDAsIDB4NDAwMDAsIDgsIFNTVF9NRU1fRFJBTX0sIC8qIEQtU1JBTTAgLSA4ICogMzJrQiAqLworCXsweDQwMDAwLCAweDgwMDAwLCA4LCBTU1RfTUVNX0RSQU19LCAvKiBELVNSQU0xIC0gOCAqIDMya0IgKi8KKwl7MHg4MDAwMCwgMHhFMDAwMCwgMTIsIFNTVF9NRU1fSVJBTX0sIC8qIEktU1JBTSAtIDEyICogMzJrQiAqLworfTsKKworLyogd2lsZCBjYXQgcG9pbnQgQURTUCBtZW0gcmVnaW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24gd3B0X3JlZ2lvbltdID0geworCXsweDAwMDAwLCAweEEwMDAwLCAyMCwgU1NUX01FTV9EUkFNfSwgLyogRC1TUkFNMCxELVNSQU0xLEQtU1JBTTIgLSAyMCAqIDMya0IgKi8KKwl7MHhBMDAwMCwgMHhGMDAwMCwgMTAsIFNTVF9NRU1fSVJBTX0sIC8qIEktU1JBTSAtIDEwICogMzJrQiAqLworfTsKKworc3RhdGljIGludCBoc3dfYWNwaV9yZXNvdXJjZV9tYXAoc3RydWN0IHNzdF9kc3AgKnNzdCwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCit7CisJLyogQURTUCBEUkFNICYgSVJBTSAqLworCXNzdC0+YWRkci5scGVfYmFzZSA9IHBkYXRhLT5scGVfYmFzZTsKKwlzc3QtPmFkZHIubHBlID0gaW9yZW1hcChwZGF0YS0+bHBlX2Jhc2UsIHBkYXRhLT5scGVfc2l6ZSk7CisJaWYgKCFzc3QtPmFkZHIubHBlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIEFEU1AgUENJIE1NSU8gY29uZmlnIHNwYWNlICovCisJc3N0LT5hZGRyLnBjaV9jZmcgPSBpb3JlbWFwKHBkYXRhLT5wY2ljZmdfYmFzZSwgcGRhdGEtPnBjaWNmZ19zaXplKTsKKwlpZiAoIXNzdC0+YWRkci5wY2lfY2ZnKSB7CisJCWlvdW5tYXAoc3N0LT5hZGRyLmxwZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIFNTVCBTaGltICovCisJc3N0LT5hZGRyLnNoaW0gPSBzc3QtPmFkZHIubHBlICsgc3N0LT5hZGRyLnNoaW1fb2Zmc2V0OworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc3N0X3NyYW1fc2hpZnQgeworCXUzMiBkZXZfaWQ7CS8qIFNTVCBEZXZpY2UgSURzICAqLworCXUzMiBpcmFtX3NoaWZ0OworCXUzMiBkcmFtX3NoaWZ0OworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzc3Rfc3JhbV9zaGlmdCBzcmFtX3NoaWZ0W10gPSB7CisJe1NTVF9ERVZfSURfTFlOWF9QT0lOVCwgNiwgMTZ9LCAvKiBscCAqLworCXtTU1RfREVWX0lEX1dJTERDQVRfUE9JTlQsIDIsIDEyfSwgLyogd3B0ICovCit9OworCitzdGF0aWMgdTMyIGhzd19ibG9ja19nZXRfYml0KHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaykKK3sKKwl1MzIgYml0ID0gMCwgc2hpZnQgPSAwLCBpbmRleDsKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gYmxvY2stPmRzcDsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IEFSUkFZX1NJWkUoc3JhbV9zaGlmdCk7IGluZGV4KyspIHsKKwkJaWYgKHNyYW1fc2hpZnRbaW5kZXhdLmRldl9pZCA9PSBzc3QtPmlkKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGluZGV4IDwgQVJSQVlfU0laRShzcmFtX3NoaWZ0KSkgeworCQlzd2l0Y2ggKGJsb2NrLT50eXBlKSB7CisJCWNhc2UgU1NUX01FTV9EUkFNOgorCQkJc2hpZnQgPSBzcmFtX3NoaWZ0W2luZGV4XS5kcmFtX3NoaWZ0OworCQkJYnJlYWs7CisJCWNhc2UgU1NUX01FTV9JUkFNOgorCQkJc2hpZnQgPSBzcmFtX3NoaWZ0W2luZGV4XS5pcmFtX3NoaWZ0OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzaGlmdCA9IDA7CisJCX0KKwl9IGVsc2UKKwkJc2hpZnQgPSAwOworCisJYml0ID0gMSA8PCAoYmxvY2stPmluZGV4ICsgc2hpZnQpOworCisJcmV0dXJuIGJpdDsKK30KKworLypkdW1teSByZWFkIGEgU1JBTSBibG9jay4qLworc3RhdGljIHZvaWQgc3N0X21lbV9ibG9ja19kdW1teV9yZWFkKHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaykKK3sKKwl1MzIgc2l6ZTsKKwl1OCB0bXBfYnVmWzRdOworCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBibG9jay0+ZHNwOworCisJc2l6ZSA9IGJsb2NrLT5zaXplID4gNCA/IDQgOiBibG9jay0+c2l6ZTsKKwltZW1jcHlfZnJvbWlvKHRtcF9idWYsIHNzdC0+YWRkci5scGUgKyBibG9jay0+b2Zmc2V0LCBzaXplKTsKK30KKworLyogZW5hYmxlIDMya0IgbWVtb3J5IGJsb2NrIC0gbG9ja3MgaGVsZCBieSBjYWxsZXIgKi8KK3N0YXRpYyBpbnQgaHN3X2Jsb2NrX2VuYWJsZShzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2spCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJsb2NrLT5kc3A7CisJdTMyIGJpdCwgdmFsOworCisJaWYgKGJsb2NrLT51c2VycysrID4gMCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGJsb2NrLT5kc3AtPmRldiwgIiBlbmFibGVkIGJsb2NrICVkOiVkIGF0IG9mZnNldCAweCV4XG4iLAorCQlibG9jay0+dHlwZSwgYmxvY2stPmluZGV4LCBibG9jay0+b2Zmc2V0KTsKKworCS8qIERpc2FibGUgY29yZSBjbG9jayBnYXRpbmcgKFZEUlRDVEwyLkRDTENHRSA9IDApICovCisJdmFsID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOworCXZhbCAmPSB+U1NUX1ZEUlRDTDJfRENMQ0dFOworCXdyaXRlbCh2YWwsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKKworCXZhbCA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKKwliaXQgPSBoc3dfYmxvY2tfZ2V0X2JpdChibG9jayk7CisJd3JpdGVsKHZhbCAmIH5iaXQsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKKworCS8qIHdhaXQgMTggRFNQIGNsb2NrIHRpY2tzICovCisJdWRlbGF5KDEwKTsKKworCS8qIEVuYWJsZSBjb3JlIGNsb2NrIGdhdGluZyAoVkRSVENUTDIuRENMQ0dFID0gMSksIGRlbGF5IDUwIHVzICovCisJdmFsID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOworCXZhbCB8PSBTU1RfVkRSVENMMl9EQ0xDR0U7CisJd3JpdGVsKHZhbCwgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOworCisJdWRlbGF5KDUwKTsKKworCS8qYWRkIGEgZHVtbXkgcmVhZCBiZWZvcmUgdGhlIFNSQU0gYmxvY2sgaXMgd3JpdHRlbiwgb3RoZXJ3aXNlIHRoZSB3cml0aW5nIG1heSBtaXNzIGJ5dGVzIHNvbWV0aW1lcy4qLworCXNzdF9tZW1fYmxvY2tfZHVtbXlfcmVhZChibG9jayk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGRpc2FibGUgMzJrQiBtZW1vcnkgYmxvY2sgLSBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLworc3RhdGljIGludCBoc3dfYmxvY2tfZGlzYWJsZShzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2spCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJsb2NrLT5kc3A7CisJdTMyIGJpdCwgdmFsOworCisJaWYgKC0tYmxvY2stPnVzZXJzID4gMCkKKwkJcmV0dXJuIDA7CisKKwlkZXZfZGJnKGJsb2NrLT5kc3AtPmRldiwgIiBkaXNhYmxlZCBibG9jayAlZDolZCBhdCBvZmZzZXQgMHgleFxuIiwKKwkJYmxvY2stPnR5cGUsIGJsb2NrLT5pbmRleCwgYmxvY2stPm9mZnNldCk7CisKKwkvKiBEaXNhYmxlIGNvcmUgY2xvY2sgZ2F0aW5nIChWRFJUQ1RMMi5EQ0xDR0UgPSAwKSAqLworCXZhbCA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKKwl2YWwgJj0gflNTVF9WRFJUQ0wyX0RDTENHRTsKKwl3cml0ZWwodmFsLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7CisKKworCXZhbCA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKKwliaXQgPSBoc3dfYmxvY2tfZ2V0X2JpdChibG9jayk7CisJLyogZG9uJ3QgZGlzYWJsZSBEU1JBTVswXSwga2VlcCBpdCBhbHdheXMgZW5hYmxlIGZvciBGVyBkdW1wKi8KKwlpZiAoYml0ICE9ICgxIDw8IFNTVF9WRFJUQ0wwX0RTUkFNUEdFX1NISUZUKSkKKwkJd3JpdGVsKHZhbCB8IGJpdCwgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOworCisJLyogd2FpdCAxOCBEU1AgY2xvY2sgdGlja3MgKi8KKwl1ZGVsYXkoMTApOworCisJLyogRW5hYmxlIGNvcmUgY2xvY2sgZ2F0aW5nIChWRFJUQ1RMMi5EQ0xDR0UgPSAxKSwgZGVsYXkgNTAgdXMgKi8KKwl2YWwgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7CisJdmFsIHw9IFNTVF9WRFJUQ0wyX0RDTENHRTsKKwl3cml0ZWwodmFsLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7CisKKwl1ZGVsYXkoNTApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3N0X2Jsb2NrX29wcyBzc3RfaHN3X29wcyA9IHsKKwkuZW5hYmxlID0gaHN3X2Jsb2NrX2VuYWJsZSwKKwkuZGlzYWJsZSA9IGhzd19ibG9ja19kaXNhYmxlLAorfTsKKworc3RhdGljIGludCBoc3dfaW5pdChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKK3sKKwljb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uICpyZWdpb247CisJc3RydWN0IGRldmljZSAqZGV2OworCWludCByZXQgPSAtRU5PREVWLCBpLCBqLCByZWdpb25fY291bnQ7CisJdTMyIG9mZnNldCwgc2l6ZSwgZndfZHVtcF9iaXQ7CisKKwlkZXYgPSBzc3QtPmRtYV9kZXY7CisKKwlzd2l0Y2ggKHNzdC0+aWQpIHsKKwljYXNlIFNTVF9ERVZfSURfTFlOWF9QT0lOVDoKKwkJcmVnaW9uID0gbHBfcmVnaW9uOworCQlyZWdpb25fY291bnQgPSBBUlJBWV9TSVpFKGxwX3JlZ2lvbik7CisJCXNzdC0+YWRkci5pcmFtX29mZnNldCA9IFNTVF9MUF9JUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLmRzcF9pcmFtX29mZnNldCA9IFNTVF9MUFRfRFNQX0lSQU1fT0ZGU0VUOworCQlzc3QtPmFkZHIuZHNwX2RyYW1fb2Zmc2V0ID0gU1NUX0xQVF9EU1BfRFJBTV9PRkZTRVQ7CisJCXNzdC0+YWRkci5zaGltX29mZnNldCA9IFNTVF9MUF9TSElNX09GRlNFVDsKKwkJYnJlYWs7CisJY2FzZSBTU1RfREVWX0lEX1dJTERDQVRfUE9JTlQ6CisJCXJlZ2lvbiA9IHdwdF9yZWdpb247CisJCXJlZ2lvbl9jb3VudCA9IEFSUkFZX1NJWkUod3B0X3JlZ2lvbik7CisJCXNzdC0+YWRkci5pcmFtX29mZnNldCA9IFNTVF9XUFRfSVJBTV9PRkZTRVQ7CisJCXNzdC0+YWRkci5kc3BfaXJhbV9vZmZzZXQgPSBTU1RfV1BUX0RTUF9JUkFNX09GRlNFVDsKKwkJc3N0LT5hZGRyLmRzcF9kcmFtX29mZnNldCA9IFNTVF9XUFRfRFNQX0RSQU1fT0ZGU0VUOworCQlzc3QtPmFkZHIuc2hpbV9vZmZzZXQgPSBTU1RfV1BUX1NISU1fT0ZGU0VUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGRldiwgImVycm9yOiBmYWlsZWQgdG8gZ2V0IG1lbSByZXNvdXJjZXNcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGhzd19hY3BpX3Jlc291cmNlX21hcChzc3QsIHBkYXRhKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImVycm9yOiBmYWlsZWQgdG8gbWFwIHJlc291cmNlc1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogZW5hYmxlIHRoZSBEU1AgU0hJTSAqLworCXJldCA9IGhzd19zZXRfZHNwX0QwKHNzdCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIHNldCBEU1AgRDAgYW5kIHJlc2V0IFNISU1cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRtYV9jb2VyY2VfbWFza19hbmRfY29oZXJlbnQoZGV2LCBETUFfQklUX01BU0soMzEpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisKKwkvKiByZWdpc3RlciBEU1AgbWVtb3J5IGJsb2NrcyAtIGlkZWFsbHkgd2Ugc2hvdWxkIGdldCB0aGlzIGZyb20gQUNQSSAqLworCWZvciAoaSA9IDA7IGkgPCByZWdpb25fY291bnQ7IGkrKykgeworCQlvZmZzZXQgPSByZWdpb25baV0uc3RhcnQ7CisJCXNpemUgPSAocmVnaW9uW2ldLmVuZCAtIHJlZ2lvbltpXS5zdGFydCkgLyByZWdpb25baV0uYmxvY2tzOworCisJCS8qIHJlZ2lzdGVyIGluZGl2aWR1YWwgbWVtb3J5IGJsb2NrcyAqLworCQlmb3IgKGogPSAwOyBqIDwgcmVnaW9uW2ldLmJsb2NrczsgaisrKSB7CisJCQlzc3RfbWVtX2Jsb2NrX3JlZ2lzdGVyKHNzdCwgb2Zmc2V0LCBzaXplLAorCQkJCXJlZ2lvbltpXS50eXBlLCAmc3N0X2hzd19vcHMsIGosIHNzdCk7CisJCQlvZmZzZXQgKz0gc2l6ZTsKKwkJfQorCX0KKworCS8qIGFsd2F5cyBlbmFibGUgdGhlIGJsb2NrKERTUkFNWzBdKSB1c2VkIGZvciBGVyBkdW1wICovCisJZndfZHVtcF9iaXQgPSAxIDw8IFNTVF9WRFJUQ0wwX0RTUkFNUEdFX1NISUZUOworCS8qIHNldCBkZWZhdWx0IHBvd2VyIGdhdGluZyBjb250cm9sLCBlbmFibGUgcG93ZXIgZ2F0aW5nIGNvbnRyb2wgZm9yIGFsbCBibG9ja3MuIHRoYXQgaXMsCisJY2FuJ3QgYmUgYWNjZXNzZWQsIHBsZWFzZSBlbmFibGUgZWFjaCBibG9jayBiZWZvcmUgYWNjZXNzaW5nLiAqLworCXdyaXRlbCgweGZmZmZmZmZmICYgfmZ3X2R1bXBfYml0LCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaHN3X2ZyZWUoc3RydWN0IHNzdF9kc3AgKnNzdCkKK3sKKwlzc3RfbWVtX2Jsb2NrX3VucmVnaXN0ZXJfYWxsKHNzdCk7CisJaW91bm1hcChzc3QtPmFkZHIubHBlKTsKKwlpb3VubWFwKHNzdC0+YWRkci5wY2lfY2ZnKTsKK30KKworc3RydWN0IHNzdF9vcHMgaGFzd2VsbF9vcHMgPSB7CisJLnJlc2V0ID0gaHN3X3Jlc2V0LAorCS5ib290ID0gaHN3X2Jvb3QsCisJLnN0YWxsID0gaHN3X3N0YWxsLAorCS53YWtlID0gaHN3X3dha2UsCisJLnNsZWVwID0gaHN3X3NsZWVwLAorCS53cml0ZSA9IHNzdF9zaGltMzJfd3JpdGUsCisJLnJlYWQgPSBzc3Rfc2hpbTMyX3JlYWQsCisJLndyaXRlNjQgPSBzc3Rfc2hpbTMyX3dyaXRlNjQsCisJLnJlYWQ2NCA9IHNzdF9zaGltMzJfcmVhZDY0LAorCS5yYW1fcmVhZCA9IHNzdF9tZW1jcHlfZnJvbWlvXzMyLAorCS5yYW1fd3JpdGUgPSBzc3RfbWVtY3B5X3RvaW9fMzIsCisJLmlycV9oYW5kbGVyID0gaHN3X2lycSwKKwkuaW5pdCA9IGhzd19pbml0LAorCS5mcmVlID0gaHN3X2ZyZWUsCisJLnBhcnNlX2Z3ID0gaHN3X3BhcnNlX2Z3X2ltYWdlLAorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsL3NzdC1oYXN3ZWxsLWlwYy5jIGIvc291bmQvc29jL2ludGVsL2hhc3dlbGwvc3N0LWhhc3dlbGwtaXBjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0YTFlOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsL3NzdC1oYXN3ZWxsLWlwYy5jCkBAIC0wLDAgKzEsMjIyMCBAQAorLyoKKyAqICBJbnRlbCBTU1QgSGFzd2VsbC9Ccm9hZHdlbGwgSVBDIFN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgorCisjaW5jbHVkZSAic3N0LWhhc3dlbGwtaXBjLmgiCisjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1kc3AuaCIKKyNpbmNsdWRlICIuLi9jb21tb24vc3N0LWRzcC1wcml2LmgiCisjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1pcGMuaCIKKworLyogR2xvYmFsIE1lc3NhZ2UgLSBHZW5lcmljICovCisjZGVmaW5lIElQQ19HTEJfVFlQRV9TSElGVAkyNAorI2RlZmluZSBJUENfR0xCX1RZUEVfTUFTSwkoMHgxZiA8PCBJUENfR0xCX1RZUEVfU0hJRlQpCisjZGVmaW5lIElQQ19HTEJfVFlQRSh4KQkJKHggPDwgSVBDX0dMQl9UWVBFX1NISUZUKQorCisvKiBHbG9iYWwgTWVzc2FnZSAtIFJlcGx5ICovCisjZGVmaW5lIElQQ19HTEJfUkVQTFlfU0hJRlQJMAorI2RlZmluZSBJUENfR0xCX1JFUExZX01BU0sJKDB4MWYgPDwgSVBDX0dMQl9SRVBMWV9TSElGVCkKKyNkZWZpbmUgSVBDX0dMQl9SRVBMWV9UWVBFKHgpCSh4IDw8IElQQ19HTEJfUkVQTFlfVFlQRV9TSElGVCkKKworLyogU3RyZWFtIE1lc3NhZ2UgLSBHZW5lcmljICovCisjZGVmaW5lIElQQ19TVFJfVFlQRV9TSElGVAkyMAorI2RlZmluZSBJUENfU1RSX1RZUEVfTUFTSwkoMHhmIDw8IElQQ19TVFJfVFlQRV9TSElGVCkKKyNkZWZpbmUgSVBDX1NUUl9UWVBFKHgpCQkoeCA8PCBJUENfU1RSX1RZUEVfU0hJRlQpCisjZGVmaW5lIElQQ19TVFJfSURfU0hJRlQJMTYKKyNkZWZpbmUgSVBDX1NUUl9JRF9NQVNLCQkoMHhmIDw8IElQQ19TVFJfSURfU0hJRlQpCisjZGVmaW5lIElQQ19TVFJfSUQoeCkJCSh4IDw8IElQQ19TVFJfSURfU0hJRlQpCisKKy8qIFN0cmVhbSBNZXNzYWdlIC0gUmVwbHkgKi8KKyNkZWZpbmUgSVBDX1NUUl9SRVBMWV9TSElGVAkwCisjZGVmaW5lIElQQ19TVFJfUkVQTFlfTUFTSwkoMHgxZiA8PCBJUENfU1RSX1JFUExZX1NISUZUKQorCisvKiBTdHJlYW0gU3RhZ2UgTWVzc2FnZSAtIEdlbmVyaWMgKi8KKyNkZWZpbmUgSVBDX1NUR19UWVBFX1NISUZUCTEyCisjZGVmaW5lIElQQ19TVEdfVFlQRV9NQVNLCSgweGYgPDwgSVBDX1NUR19UWVBFX1NISUZUKQorI2RlZmluZSBJUENfU1RHX1RZUEUoeCkJCSh4IDw8IElQQ19TVEdfVFlQRV9TSElGVCkKKyNkZWZpbmUgSVBDX1NUR19JRF9TSElGVAkxMAorI2RlZmluZSBJUENfU1RHX0lEX01BU0sJCSgweDMgPDwgSVBDX1NUR19JRF9TSElGVCkKKyNkZWZpbmUgSVBDX1NUR19JRCh4KQkJKHggPDwgSVBDX1NUR19JRF9TSElGVCkKKworLyogU3RyZWFtIFN0YWdlIE1lc3NhZ2UgLSBSZXBseSAqLworI2RlZmluZSBJUENfU1RHX1JFUExZX1NISUZUCTAKKyNkZWZpbmUgSVBDX1NUR19SRVBMWV9NQVNLCSgweDFmIDw8IElQQ19TVEdfUkVQTFlfU0hJRlQpCisKKy8qIERlYnVnIExvZyBNZXNzYWdlIC0gR2VuZXJpYyAqLworI2RlZmluZSBJUENfTE9HX09QX1NISUZUCTIwCisjZGVmaW5lIElQQ19MT0dfT1BfTUFTSwkJKDB4ZiA8PCBJUENfTE9HX09QX1NISUZUKQorI2RlZmluZSBJUENfTE9HX09QX1RZUEUoeCkJKHggPDwgSVBDX0xPR19PUF9TSElGVCkKKyNkZWZpbmUgSVBDX0xPR19JRF9TSElGVAkxNgorI2RlZmluZSBJUENfTE9HX0lEX01BU0sJCSgweGYgPDwgSVBDX0xPR19JRF9TSElGVCkKKyNkZWZpbmUgSVBDX0xPR19JRCh4KQkJKHggPDwgSVBDX0xPR19JRF9TSElGVCkKKworLyogTW9kdWxlIE1lc3NhZ2UgKi8KKyNkZWZpbmUgSVBDX01PRFVMRV9PUEVSQVRJT05fU0hJRlQJMjAKKyNkZWZpbmUgSVBDX01PRFVMRV9PUEVSQVRJT05fTUFTSwkoMHhmIDw8IElQQ19NT0RVTEVfT1BFUkFUSU9OX1NISUZUKQorI2RlZmluZSBJUENfTU9EVUxFX09QRVJBVElPTih4KQkoeCA8PCBJUENfTU9EVUxFX09QRVJBVElPTl9TSElGVCkKKworI2RlZmluZSBJUENfTU9EVUxFX0lEX1NISUZUCTE2CisjZGVmaW5lIElQQ19NT0RVTEVfSURfTUFTSwkoMHhmIDw8IElQQ19NT0RVTEVfSURfU0hJRlQpCisjZGVmaW5lIElQQ19NT0RVTEVfSUQoeCkJKHggPDwgSVBDX01PRFVMRV9JRF9TSElGVCkKKworLyogSVBDIG1lc3NhZ2UgdGltZW91dCAobXNlY3MpICovCisjZGVmaW5lIElQQ19USU1FT1VUX01TRUNTCTMwMAorI2RlZmluZSBJUENfQk9PVF9NU0VDUwkJMjAwCisjZGVmaW5lIElQQ19NU0dfV0FJVAkJMAorI2RlZmluZSBJUENfTVNHX05PV0FJVAkJMQorCisvKiBGaXJtd2FyZSBSZWFkeSBNZXNzYWdlICovCisjZGVmaW5lIElQQ19GV19SRUFEWQkJKDB4MSA8PCAyOSkKKyNkZWZpbmUgSVBDX1NUQVRVU19NQVNLCQkoMHgzIDw8IDMwKQorCisjZGVmaW5lIElQQ19FTVBUWV9MSVNUX1NJWkUJOAorI2RlZmluZSBJUENfTUFYX1NUUkVBTVMJCTQKKworLyogTWFpbGJveCAqLworI2RlZmluZSBJUENfTUFYX01BSUxCT1hfQllURVMJMjU2CisKKyNkZWZpbmUgSU5WQUxJRF9TVFJFQU1fSFdfSUQJMHhmZmZmZmZmZgorCisvKiBHbG9iYWwgTWVzc2FnZSAtIFR5cGVzIGFuZCBSZXBsaWVzICovCitlbnVtIGlwY19nbGJfdHlwZSB7CisJSVBDX0dMQl9HRVRfRldfVkVSU0lPTiA9IDAsCQkvKiBSZXRyaWV2ZXMgZmlybXdhcmUgdmVyc2lvbiAqLworCUlQQ19HTEJfUEVSRk9STUFOQ0VfTU9OSVRPUiA9IDEsCS8qIFBlcmZvcm1hbmNlIG1vbml0b3JpbmcgYWN0aW9ucyAqLworCUlQQ19HTEJfQUxMT0NBVEVfU1RSRUFNID0gMywJCS8qIFJlcXVlc3QgdG8gYWxsb2NhdGUgbmV3IHN0cmVhbSAqLworCUlQQ19HTEJfRlJFRV9TVFJFQU0gPSA0LAkJLyogUmVxdWVzdCB0byBmcmVlIHN0cmVhbSAqLworCUlQQ19HTEJfR0VUX0ZXX0NBUEFCSUxJVElFUyA9IDUsCS8qIFJldHJpZXZlcyBmaXJtd2FyZSBjYXBhYmlsaXRpZXMgKi8KKwlJUENfR0xCX1NUUkVBTV9NRVNTQUdFID0gNiwJCS8qIE1lc3NhZ2UgZGlyZWN0ZWQgdG8gc3RyZWFtIG9yIGl0cyBzdGFnZXMgKi8KKwkvKiBSZXF1ZXN0IHRvIHN0b3JlIGZpcm13YXJlIGNvbnRleHQgZHVyaW5nIEQwLT5EMyB0cmFuc2l0aW9uICovCisJSVBDX0dMQl9SRVFVRVNUX0RVTVAgPSA3LAorCS8qIFJlcXVlc3QgdG8gcmVzdG9yZSBmaXJtd2FyZSBjb250ZXh0IGR1cmluZyBEMy0+RDAgdHJhbnNpdGlvbiAqLworCUlQQ19HTEJfUkVTVE9SRV9DT05URVhUID0gOCwKKwlJUENfR0xCX0dFVF9ERVZJQ0VfRk9STUFUUyA9IDksCQkvKiBTZXQgZGV2aWNlIGZvcm1hdCAqLworCUlQQ19HTEJfU0VUX0RFVklDRV9GT1JNQVRTID0gMTAsCS8qIEdldCBkZXZpY2UgZm9ybWF0ICovCisJSVBDX0dMQl9TSE9SVF9SRVBMWSA9IDExLAorCUlQQ19HTEJfRU5URVJfRFhfU1RBVEUgPSAxMiwKKwlJUENfR0xCX0dFVF9NSVhFUl9TVFJFQU1fSU5GTyA9IDEzLAkvKiBSZXF1ZXN0IG1peGVyIHN0cmVhbSBwYXJhbXMgKi8KKwlJUENfR0xCX0RFQlVHX0xPR19NRVNTQUdFID0gMTQsCQkvKiBNZXNzYWdlIHRvIG9yIGZyb20gdGhlIGRlYnVnIGxvZ2dlci4gKi8KKwlJUENfR0xCX01PRFVMRV9PUEVSQVRJT04gPSAxNSwJCS8qIE1lc3NhZ2UgdG8gbG9hZGFibGUgZncgbW9kdWxlICovCisJSVBDX0dMQl9SRVFVRVNUX1RSQU5TRkVSID0gMTYsIAkJLyogPCBSZXF1ZXN0IFRyYW5zZmVyIGZvciBob3N0ICovCisJSVBDX0dMQl9NQVhfSVBDX01FU1NBR0VfVFlQRSA9IDE3LAkvKiBNYXhpbXVtIG1lc3NhZ2UgbnVtYmVyICovCit9OworCitlbnVtIGlwY19nbGJfcmVwbHkgeworCUlQQ19HTEJfUkVQTFlfU1VDQ0VTUyA9IDAsCQkvKiBUaGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLiAqLworCUlQQ19HTEJfUkVQTFlfRVJST1JfSU5WQUxJRF9QQVJBTSA9IDEsCS8qIEludmFsaWQgcGFyYW1ldGVyIHdhcyBwYXNzZWQuICovCisJSVBDX0dMQl9SRVBMWV9VTktOT1dOX01FU1NBR0VfVFlQRSA9IDIsCS8qIFVrbm93biBtZXNzYWdlIHR5cGUgd2FzIHJlc2NlaXZlZC4gKi8KKwlJUENfR0xCX1JFUExZX09VVF9PRl9SRVNPVVJDRVMgPSAzLAkvKiBObyByZXNvdXJjZXMgdG8gc2F0aXNmeSB0aGUgcmVxdWVzdC4gKi8KKwlJUENfR0xCX1JFUExZX0JVU1kgPSA0LAkJCS8qIFRoZSBzeXN0ZW0gb3IgcmVzb3VyY2UgaXMgYnVzeS4gKi8KKwlJUENfR0xCX1JFUExZX1BFTkRJTkcgPSA1LAkJLyogVGhlIGFjdGlvbiB3YXMgc2NoZWR1bGVkIGZvciBwcm9jZXNzaW5nLiAgKi8KKwlJUENfR0xCX1JFUExZX0ZBSUxVUkUgPSA2LAkJLyogQ3JpdGljYWwgZXJyb3IgaGFwcGVuZWQuICovCisJSVBDX0dMQl9SRVBMWV9JTlZBTElEX1JFUVVFU1QgPSA3LAkvKiBSZXF1ZXN0IGNhbiBub3QgYmUgY29tcGxldGVkLiAqLworCUlQQ19HTEJfUkVQTFlfU1RBR0VfVU5JTklUSUFMSVpFRCA9IDgsCS8qIFByb2Nlc3Npbmcgc3RhZ2Ugd2FzIHVuaW5pdGlhbGl6ZWQuICovCisJSVBDX0dMQl9SRVBMWV9OT1RfRk9VTkQgPSA5LAkJLyogUmVxdWlyZWQgcmVzb3VyY2UgY2FuIG5vdCBiZSBmb3VuZC4gKi8KKwlJUENfR0xCX1JFUExZX1NPVVJDRV9OT1RfU1RBUlRFRCA9IDEwLAkvKiBTb3VyY2Ugd2FzIG5vdCBzdGFydGVkLiAqLworfTsKKworZW51bSBpcGNfbW9kdWxlX29wZXJhdGlvbiB7CisJSVBDX01PRFVMRV9OT1RJRklDQVRJT04gPSAwLAorCUlQQ19NT0RVTEVfRU5BQkxFID0gMSwKKwlJUENfTU9EVUxFX0RJU0FCTEUgPSAyLAorCUlQQ19NT0RVTEVfR0VUX1BBUkFNRVRFUiA9IDMsCisJSVBDX01PRFVMRV9TRVRfUEFSQU1FVEVSID0gNCwKKwlJUENfTU9EVUxFX0dFVF9JTkZPID0gNSwKKwlJUENfTU9EVUxFX01BWF9NRVNTQUdFCit9OworCisvKiBTdHJlYW0gTWVzc2FnZSAtIFR5cGVzICovCitlbnVtIGlwY19zdHJfb3BlcmF0aW9uIHsKKwlJUENfU1RSX1JFU0VUID0gMCwKKwlJUENfU1RSX1BBVVNFID0gMSwKKwlJUENfU1RSX1JFU1VNRSA9IDIsCisJSVBDX1NUUl9TVEFHRV9NRVNTQUdFID0gMywKKwlJUENfU1RSX05PVElGSUNBVElPTiA9IDQsCisJSVBDX1NUUl9NQVhfTUVTU0FHRQorfTsKKworLyogU3RyZWFtIFN0YWdlIE1lc3NhZ2UgVHlwZXMgKi8KK2VudW0gaXBjX3N0Z19vcGVyYXRpb24geworCUlQQ19TVEdfR0VUX1ZPTFVNRSA9IDAsCisJSVBDX1NUR19TRVRfVk9MVU1FLAorCUlQQ19TVEdfU0VUX1dSSVRFX1BPU0lUSU9OLAorCUlQQ19TVEdfU0VUX0ZYX0VOQUJMRSwKKwlJUENfU1RHX1NFVF9GWF9ESVNBQkxFLAorCUlQQ19TVEdfU0VUX0ZYX0dFVF9QQVJBTSwKKwlJUENfU1RHX1NFVF9GWF9TRVRfUEFSQU0sCisJSVBDX1NUR19TRVRfRlhfR0VUX0lORk8sCisJSVBDX1NUR19NVVRFX0xPT1BCQUNLLAorCUlQQ19TVEdfTUFYX01FU1NBR0UKK307CisKKy8qIFN0cmVhbSBTdGFnZSBNZXNzYWdlIFR5cGVzIEZvciBOb3RpZmljYXRpb24qLworZW51bSBpcGNfc3RnX29wZXJhdGlvbl9ub3RpZnkgeworCUlQQ19QT1NJVElPTl9DSEFOR0VEID0gMCwKKwlJUENfU1RHX0dMSVRDSCwKKwlJUENfU1RHX01BWF9OT1RJRlkKK307CisKK2VudW0gaXBjX2dsaXRjaF90eXBlIHsKKwlJUENfR0xJVENIX1VOREVSUlVOID0gMSwKKwlJUENfR0xJVENIX0RFQ09ERVJfRVJST1IsCisJSVBDX0dMSVRDSF9ET1VCTEVEX1dSSVRFX1BPUywKKwlJUENfR0xJVENIX01BWAorfTsKKworLyogRGVidWcgQ29udHJvbCAqLworZW51bSBpcGNfZGVidWdfb3BlcmF0aW9uIHsKKwlJUENfREVCVUdfRU5BQkxFX0xPRyA9IDAsCisJSVBDX0RFQlVHX0RJU0FCTEVfTE9HID0gMSwKKwlJUENfREVCVUdfUkVRVUVTVF9MT0dfRFVNUCA9IDIsCisJSVBDX0RFQlVHX05PVElGWV9MT0dfRFVNUCA9IDMsCisJSVBDX0RFQlVHX01BWF9ERUJVR19MT0cKK307CisKKy8qIEZpcm13YXJlIFJlYWR5ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfcmVhZHkgeworCXUzMiBpbmJveF9vZmZzZXQ7CisJdTMyIG91dGJveF9vZmZzZXQ7CisJdTMyIGluYm94X3NpemU7CisJdTMyIG91dGJveF9zaXplOworCXUzMiBmd19pbmZvX3NpemU7CisJdTggZndfaW5mb1tJUENfTUFYX01BSUxCT1hfQllURVMgLSA1ICogc2l6ZW9mKHUzMildOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfc3RyZWFtOworc3RydWN0IHNzdF9oc3c7CisKKy8qIFN0cmVhbSBpbmZvbWF0aW9uICovCitzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0geworCS8qIGNvbmZpZ3VyYXRpb24gKi8KKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcSByZXF1ZXN0OworCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fYWxsb2NfcmVwbHkgcmVwbHk7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9mcmVlX3JlcSBmcmVlX3JlcTsKKworCS8qIE1peGVyIGluZm8gKi8KKwl1MzIgbXV0ZV92b2x1bWVbU1NUX0hTV19OT19DSEFOTkVMU107CisJdTMyIG11dGVbU1NUX0hTV19OT19DSEFOTkVMU107CisKKwkvKiBydW50aW1lIGluZm8gKi8KKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3OworCWludCBob3N0X2lkOworCWJvb2wgY29tbWl0ZWQ7CisJYm9vbCBydW5uaW5nOworCisJLyogTm90aWZpY2F0aW9uIHdvcmsgKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgbm90aWZ5X3dvcms7CisJdTMyIGhlYWRlcjsKKworCS8qIFBvc2l0aW9uIGluZm8gZnJvbSBEU1AgKi8KKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX3NldF9wb3NpdGlvbiB3cG9zOworCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZ2V0X3Bvc2l0aW9uIHJwb3M7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9nbGl0Y2hfcG9zaXRpb24gZ2xpdGNoOworCisJLyogVm9sdW1lIGluZm8gKi8KKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSB2b2xfcmVxOworCisJLyogZHJpdmVyIGNhbGxiYWNrICovCisJdTMyICgqbm90aWZ5X3Bvc2l0aW9uKShzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdm9pZCAqZGF0YSk7CisJdm9pZCAqcGRhdGE7CisKKwkvKiByZWNvcmQgdGhlIGZ3IHJlYWQgcG9zaXRpb24gd2hlbiBwbGF5YmFjayAqLworCXNuZF9wY21fdWZyYW1lc190IG9sZF9wb3NpdGlvbjsKKwlib29sIHBsYXlfc2lsZW5jZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Cit9OworCisvKiBGVyBsb2cgcmluZyBpbmZvcm1hdGlvbiAqLworc3RydWN0IHNzdF9oc3dfbG9nX3N0cmVhbSB7CisJZG1hX2FkZHJfdCBkbWFfYWRkcjsKKwl1bnNpZ25lZCBjaGFyICpkbWFfYXJlYTsKKwl1bnNpZ25lZCBjaGFyICpyaW5nX2Rlc2NyOworCWludCBwYWdlczsKKwlpbnQgc2l6ZTsKKworCS8qIE5vdGlmaWNhdGlvbiB3b3JrICovCisJc3RydWN0IHdvcmtfc3RydWN0IG5vdGlmeV93b3JrOworCXdhaXRfcXVldWVfaGVhZF90IHJlYWRlcnNfd2FpdF9xOworCXN0cnVjdCBtdXRleCByd19tdXRleDsKKworCXUzMiBsYXN0X3BvczsKKwl1MzIgY3Vycl9wb3M7CisJdTMyIHJlYWRlcl9wb3M7CisKKwkvKiBmdyBsb2cgY29uZmlnICovCisJdTMyIGNvbmZpZ1tTU1RfSFNXX0ZXX0xPR19DT05GSUdfRFdPUkRTXTsKKworCXN0cnVjdCBzc3RfaHN3ICpoc3c7Cit9OworCisvKiBTU1QgSGFzd2VsbCBJUEMgZGF0YSAqLworc3RydWN0IHNzdF9oc3cgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZfcGNtOworCisJLyogRlcgY29uZmlnICovCisJc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3JlYWR5IGZ3X3JlYWR5OworCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uIHZlcnNpb247CisJYm9vbCBmd19kb25lOworCXN0cnVjdCBzc3RfZncgKnNzdF9mdzsKKworCS8qIHN0cmVhbSAqLworCXN0cnVjdCBsaXN0X2hlYWQgc3RyZWFtX2xpc3Q7CisKKwkvKiBnbG9iYWwgbWl4ZXIgKi8KKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2luZm9fcmVwbHkgbWl4ZXJfaW5mbzsKKwllbnVtIHNzdF9oc3dfdm9sdW1lX2N1cnZlIGN1cnZlX3R5cGU7CisJdTMyIGN1cnZlX2R1cmF0aW9uOworCXUzMiBtdXRlW1NTVF9IU1dfTk9fQ0hBTk5FTFNdOworCXUzMiBtdXRlX3ZvbHVtZVtTU1RfSFNXX05PX0NIQU5ORUxTXTsKKworCS8qIERYICovCisJc3RydWN0IHNzdF9oc3dfaXBjX2R4X3JlcGx5IGR4OworCXZvaWQgKmR4X2NvbnRleHQ7CisJZG1hX2FkZHJfdCBkeF9jb250ZXh0X3BhZGRyOworCisJLyogYm9vdCAqLworCXdhaXRfcXVldWVfaGVhZF90IGJvb3Rfd2FpdDsKKwlib29sIGJvb3RfY29tcGxldGU7CisJYm9vbCBzaHV0ZG93bjsKKworCS8qIElQQyBtZXNzYWdpbmcgKi8KKwlzdHJ1Y3Qgc3N0X2dlbmVyaWNfaXBjIGlwYzsKKworCS8qIEZXIGxvZyBzdHJlYW0gKi8KKwlzdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtIGxvZ19zdHJlYW07CisKKwkvKiBmbGFncyBiaXQgZmllbGQgdG8gdHJhY2sgbW9kdWxlIHN0YXRlIHdoZW4gcmVzdW1lIGZyb20gUlREMywKKwkgKiBlYWNoIGJpdCByZXByZXNlbnQgc3RhdGUgKGVuYWJsZWQvZGlzYWJsZWQpIG9mIHNpbmdsZSBtb2R1bGUgKi8KKwl1MzIgZW5hYmxlZF9tb2R1bGVzX3J0ZDM7CisKKwkvKiBidWZmZXIgdG8gc3RvcmUgcGFyYW1ldGVyIGxpbmVzICovCisJdTMyIHBhcmFtX2lkeF93OwkvKiB3cml0ZSBpbmRleCAqLworCXUzMiBwYXJhbV9pZHhfcjsJLyogcmVhZCBpbmRleCAqLworCXU4IHBhcmFtX2J1ZltXQVZFU19QQVJBTV9MSU5FU11bV0FWRVNfUEFSQU1fQ09VTlRdOworfTsKKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2hzd2Fkc3AuaD4KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9nbG9iYWxfdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX0dMQl9UWVBFX01BU0spID4+IElQQ19HTEJfVFlQRV9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9nbG9iYWxfcmVwbHkodTMyIG1zZykKK3sKKwlyZXR1cm4gKG1zZyAmIElQQ19HTEJfUkVQTFlfTUFTSykgPj4gSVBDX0dMQl9SRVBMWV9TSElGVDsKK30KKworc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9zdHJlYW1fdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX1NUUl9UWVBFX01BU0spID4+ICBJUENfU1RSX1RZUEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19nZXRfc3RhZ2VfdHlwZSh1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX1NUR19UWVBFX01BU0spID4+ICBJUENfU1RHX1RZUEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19nZXRfc3RyZWFtX2lkKHUzMiBtc2cpCit7CisJcmV0dXJuIChtc2cgJiBJUENfU1RSX0lEX01BU0spID4+ICBJUENfU1RSX0lEX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBtc2dfZ2V0X25vdGlmeV9yZWFzb24odTMyIG1zZykKK3sKKwlyZXR1cm4gKG1zZyAmIElQQ19TVEdfVFlQRV9NQVNLKSA+PiBJUENfU1RHX1RZUEVfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19nZXRfbW9kdWxlX29wZXJhdGlvbih1MzIgbXNnKQoreworCXJldHVybiAobXNnICYgSVBDX01PRFVMRV9PUEVSQVRJT05fTUFTSykgPj4gSVBDX01PRFVMRV9PUEVSQVRJT05fU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG1zZ19nZXRfbW9kdWxlX2lkKHUzMiBtc2cpCit7CisJcmV0dXJuIChtc2cgJiBJUENfTU9EVUxFX0lEX01BU0spID4+IElQQ19NT0RVTEVfSURfU0hJRlQ7Cit9CisKK3UzMiBjcmVhdGVfY2hhbm5lbF9tYXAoZW51bSBzc3RfaHN3X2NoYW5uZWxfY29uZmlnIGNvbmZpZykKK3sKKwlzd2l0Y2ggKGNvbmZpZykgeworCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR19NT05POgorCQlyZXR1cm4gKDB4RkZGRkZGRjAgfCBTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSKTsKKwljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfU1RFUkVPOgorCQlyZXR1cm4gKDB4RkZGRkZGMDAgfCBTU1RfSFNXX0NIQU5ORUxfTEVGVAorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUIDw8IDQpKTsKKwljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfMl9QT0lOVF8xOgorCQlyZXR1cm4gKDB4RkZGRkYwMDAgfCBTU1RfSFNXX0NIQU5ORUxfTEVGVAorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUIDw8IDQpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfTEZFIDw8IDggKSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzNfUE9JTlRfMDoKKwkJcmV0dXJuICgweEZGRkZGMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9DRU5URVIgPDwgNCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzNfUE9JTlRfMToKKwkJcmV0dXJuICgweEZGRkYwMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9DRU5URVIgPDwgNCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xGRSA8PCAxMikpOworCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR19RVUFUUk86CisJCXJldHVybiAoMHhGRkZGMDAwMCB8IFNTVF9IU1dfQ0hBTk5FTF9MRUZUCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFQgPDwgNCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRUZUX1NVUlJPVU5EIDw8IDgpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFRfU1VSUk9VTkQgPDwgMTIpKTsKKwljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfNF9QT0lOVF8wOgorCQlyZXR1cm4gKDB4RkZGRjAwMDAgfCBTU1RfSFNXX0NIQU5ORUxfTEVGVAorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0NFTlRFUiA8PCA0KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUIDw8IDgpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSX1NVUlJPVU5EIDw8IDEyKSk7CisJY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzVfUE9JTlRfMDoKKwkJcmV0dXJuICgweEZGRjAwMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9DRU5URVIgPDwgNCkKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xFRlRfU1VSUk9VTkQgPDwgMTIpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFRfU1VSUk9VTkQgPDwgMTYpKTsKKwljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfNV9QT0lOVF8xOgorCQlyZXR1cm4gKDB4RkYwMDAwMDAgfCBTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfTEVGVCA8PCA0KQorCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUIDw8IDgpCisJCQl8IChTU1RfSFNXX0NIQU5ORUxfTEVGVF9TVVJST1VORCA8PCAxMikKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVF9TVVJST1VORCA8PCAxNikKKwkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRkUgPDwgMjApKTsKKwljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfRFVBTF9NT05POgorCQlyZXR1cm4gKDB4RkZGRkZGMDAgfCBTU1RfSFNXX0NIQU5ORUxfTEVGVAorCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xFRlQgPDwgNCkpOworCWRlZmF1bHQ6CisJCXJldHVybiAweEZGRkZGRkZGOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqZ2V0X3N0cmVhbV9ieV9pZChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCWludCBzdHJlYW1faWQpCit7CisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW07CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cmVhbSwgJmhzdy0+c3RyZWFtX2xpc3QsIG5vZGUpIHsKKwkJaWYgKHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkID09IHN0cmVhbV9pZCkKKwkJCXJldHVybiBzdHJlYW07CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGhzd19md19yZWFkeShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyKQoreworCXN0cnVjdCBzc3RfaHN3X2lwY19md19yZWFkeSBmd19yZWFkeTsKKwl1MzIgb2Zmc2V0OworCXU4IGZ3X2luZm9bSVBDX01BWF9NQUlMQk9YX0JZVEVTIC0gNSAqIHNpemVvZih1MzIpXTsKKwljaGFyICp0bXBbNV0sICpwaW5mbzsKKwlpbnQgaSA9IDA7CisKKwlvZmZzZXQgPSAoaGVhZGVyICYgMHgxRkZGRkZGRikgPDwgMzsKKworCWRldl9kYmcoaHN3LT5kZXYsICJpcGM6IERTUCBpcyByZWFkeSAweCU4Ljh4IG9mZnNldCAlZFxuIiwKKwkJaGVhZGVyLCBvZmZzZXQpOworCisJLyogY29weSBkYXRhIGZyb20gdGhlIERTUCBGVyByZWFkeSBvZmZzZXQgKi8KKwlzc3RfZHNwX3JlYWQoaHN3LT5kc3AsICZmd19yZWFkeSwgb2Zmc2V0LCBzaXplb2YoZndfcmVhZHkpKTsKKworCXNzdF9kc3BfbWFpbGJveF9pbml0KGhzdy0+ZHNwLCBmd19yZWFkeS5pbmJveF9vZmZzZXQsCisJCWZ3X3JlYWR5LmluYm94X3NpemUsIGZ3X3JlYWR5Lm91dGJveF9vZmZzZXQsCisJCWZ3X3JlYWR5Lm91dGJveF9zaXplKTsKKworCWhzdy0+Ym9vdF9jb21wbGV0ZSA9IHRydWU7CisJd2FrZV91cCgmaHN3LT5ib290X3dhaXQpOworCisJZGV2X2RiZyhoc3ctPmRldiwgIiBtYWlsYm94IHVwc3RyZWFtIDB4JXggLSBzaXplIDB4JXhcbiIsCisJCWZ3X3JlYWR5LmluYm94X29mZnNldCwgZndfcmVhZHkuaW5ib3hfc2l6ZSk7CisJZGV2X2RiZyhoc3ctPmRldiwgIiBtYWlsYm94IGRvd25zdHJlYW0gMHgleCAtIHNpemUgMHgleFxuIiwKKwkJZndfcmVhZHkub3V0Ym94X29mZnNldCwgZndfcmVhZHkub3V0Ym94X3NpemUpOworCWlmIChmd19yZWFkeS5md19pbmZvX3NpemUgPCBzaXplb2YoZndfcmVhZHkuZndfaW5mbykpIHsKKwkJZndfcmVhZHkuZndfaW5mb1tmd19yZWFkeS5md19pbmZvX3NpemVdID0gMDsKKwkJZGV2X2RiZyhoc3ctPmRldiwgIiBGaXJtd2FyZSBpbmZvOiAlcyBcbiIsIGZ3X3JlYWR5LmZ3X2luZm8pOworCisJCS8qIGxvZyB0aGUgRlcgdmVyc2lvbiBpbmZvIGdvdCBmcm9tIHRoZSBtYWlsYm94IGhlcmUuICovCisJCW1lbWNweShmd19pbmZvLCBmd19yZWFkeS5md19pbmZvLCBmd19yZWFkeS5md19pbmZvX3NpemUpOworCQlwaW5mbyA9ICZmd19pbmZvWzBdOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0bXApOyBpKyspCisJCQl0bXBbaV0gPSBzdHJzZXAoJnBpbmZvLCAiICIpOworCQlkZXZfaW5mbyhoc3ctPmRldiwgIkZXIGxvYWRlZCwgbWFpbGJveCByZWFkYmFjayBGVyBpbmZvOiB0eXBlICVzLCAtICIKKwkJCSJ2ZXJzaW9uOiAlcy4lcywgYnVpbGQgJXMsIHNvdXJjZSBjb21taXQgaWQ6ICVzXG4iLAorCQkJdG1wWzBdLCB0bXBbMV0sIHRtcFsyXSwgdG1wWzNdLCB0bXBbNF0pOworCX0KK30KKworc3RhdGljIHZvaWQgaHN3X25vdGlmaWNhdGlvbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJc3RydWN0IHNzdF9oc3dfc3RyZWFtLCBub3RpZnlfd29yayk7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9nbGl0Y2hfcG9zaXRpb24gKmdsaXRjaCA9ICZzdHJlYW0tPmdsaXRjaDsKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2dldF9wb3NpdGlvbiAqcG9zID0gJnN0cmVhbS0+cnBvczsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gc3RyZWFtLT5oc3c7CisJdTMyIHJlYXNvbjsKKworCXJlYXNvbiA9IG1zZ19nZXRfbm90aWZ5X3JlYXNvbihzdHJlYW0tPmhlYWRlcik7CisKKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgSVBDX1NUR19HTElUQ0g6CisJCXRyYWNlX2lwY19ub3RpZmljYXRpb24oIkRTUCBzdHJlYW0gdW5kZXIvb3ZlcnJ1biIsCisJCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7CisJCXNzdF9kc3BfaW5ib3hfcmVhZChoc3ctPmRzcCwgZ2xpdGNoLCBzaXplb2YoKmdsaXRjaCkpOworCisJCWRldl9lcnIoaHN3LT5kZXYsICJnbGl0Y2ggJWQgcG9zIDB4JXggd3JpdGUgcG9zIDB4JXhcbiIsCisJCQlnbGl0Y2gtPmdsaXRjaF90eXBlLCBnbGl0Y2gtPnByZXNlbnRfcG9zLAorCQkJZ2xpdGNoLT53cml0ZV9wb3MpOworCQlicmVhazsKKworCWNhc2UgSVBDX1BPU0lUSU9OX0NIQU5HRUQ6CisJCXRyYWNlX2lwY19ub3RpZmljYXRpb24oIkRTUCBzdHJlYW0gcG9zaXRpb24gY2hhbmdlZCBmb3IiLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCQlzc3RfZHNwX2luYm94X3JlYWQoaHN3LT5kc3AsIHBvcywgc2l6ZW9mKCpwb3MpKTsKKworCQlpZiAoc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24pCisJCQlzdHJlYW0tPm5vdGlmeV9wb3NpdGlvbihzdHJlYW0sIHN0cmVhbS0+cGRhdGEpOworCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogdW5rbm93biBub3RpZmljYXRpb24gMHgleFxuIiwKKwkJCXN0cmVhbS0+aGVhZGVyKTsKKwkJYnJlYWs7CisJfQorCisJLyogdGVsbCBEU1AgdGhhdCBub3RpZmljYXRpb24gaGFzIGJlZW4gaGFuZGxlZCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0cyhoc3ctPmRzcCwgU1NUX0lQQ0QsCisJCVNTVF9JUENEX0JVU1kgfCBTU1RfSVBDRF9ET05FLCBTU1RfSVBDRF9ET05FKTsKKworCS8qIHVubWFzayBidXN5IGludGVycnVwdCAqLworCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0cyhoc3ctPmRzcCwgU1NUX0lNUlgsIFNTVF9JTVJYX0JVU1ksIDApOworfQorCitzdGF0aWMgdm9pZCBoc3dfc3RyZWFtX3VwZGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZykKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbTsKKwl1MzIgaGVhZGVyID0gbXNnLT5oZWFkZXIgJiB+KElQQ19TVEFUVVNfTUFTSyB8IElQQ19HTEJfUkVQTFlfTUFTSyk7CisJdTMyIHN0cmVhbV9pZCA9IG1zZ19nZXRfc3RyZWFtX2lkKGhlYWRlcik7CisJdTMyIHN0cmVhbV9tc2cgPSBtc2dfZ2V0X3N0cmVhbV90eXBlKGhlYWRlcik7CisKKwlzdHJlYW0gPSBnZXRfc3RyZWFtX2J5X2lkKGhzdywgc3RyZWFtX2lkKTsKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJCXJldHVybjsKKworCXN3aXRjaCAoc3RyZWFtX21zZykgeworCWNhc2UgSVBDX1NUUl9TVEFHRV9NRVNTQUdFOgorCWNhc2UgSVBDX1NUUl9OT1RJRklDQVRJT046CisJCWJyZWFrOworCWNhc2UgSVBDX1NUUl9SRVNFVDoKKwkJdHJhY2VfaXBjX25vdGlmaWNhdGlvbigic3RyZWFtIHJlc2V0Iiwgc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCQlicmVhazsKKwljYXNlIElQQ19TVFJfUEFVU0U6CisJCXN0cmVhbS0+cnVubmluZyA9IGZhbHNlOworCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJzdHJlYW0gcGF1c2VkIiwKKwkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKKwkJYnJlYWs7CisJY2FzZSBJUENfU1RSX1JFU1VNRToKKwkJc3RyZWFtLT5ydW5uaW5nID0gdHJ1ZTsKKwkJdHJhY2VfaXBjX25vdGlmaWNhdGlvbigic3RyZWFtIHJ1bm5pbmciLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHN3X3Byb2Nlc3NfcmVwbHkoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKK3sKKwlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKKwl1MzIgcmVwbHkgPSBtc2dfZ2V0X2dsb2JhbF9yZXBseShoZWFkZXIpOworCisJdHJhY2VfaXBjX3JlcGx5KCJwcm9jZXNzaW5nIC0tPiIsIGhlYWRlcik7CisKKwltc2cgPSBzc3RfaXBjX3JlcGx5X2ZpbmRfbXNnKCZoc3ctPmlwYywgaGVhZGVyKTsKKwlpZiAobXNnID09IE5VTEwpIHsKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogY2FuJ3QgZmluZCBtZXNzYWdlIGhlYWRlciIsIGhlYWRlcik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGZpcnN0IHByb2Nlc3MgdGhlIGhlYWRlciAqLworCXN3aXRjaCAocmVwbHkpIHsKKwljYXNlIElQQ19HTEJfUkVQTFlfUEVORElORzoKKwkJdHJhY2VfaXBjX3BlbmRpbmdfcmVwbHkoInJlY2VpdmVkIiwgaGVhZGVyKTsKKwkJbXNnLT5wZW5kaW5nID0gdHJ1ZTsKKwkJaHN3LT5pcGMucGVuZGluZyA9IHRydWU7CisJCXJldHVybiAxOworCWNhc2UgSVBDX0dMQl9SRVBMWV9TVUNDRVNTOgorCQlpZiAobXNnLT5wZW5kaW5nKSB7CisJCQl0cmFjZV9pcGNfcGVuZGluZ19yZXBseSgiY29tcGxldGVkIiwgaGVhZGVyKTsKKwkJCXNzdF9kc3BfaW5ib3hfcmVhZChoc3ctPmRzcCwgbXNnLT5yeF9kYXRhLAorCQkJCW1zZy0+cnhfc2l6ZSk7CisJCQloc3ctPmlwYy5wZW5kaW5nID0gZmFsc2U7CisJCX0gZWxzZSB7CisJCQkvKiBjb3B5IGRhdGEgZnJvbSB0aGUgRFNQICovCisJCQlzc3RfZHNwX291dGJveF9yZWFkKGhzdy0+ZHNwLCBtc2ctPnJ4X2RhdGEsCisJCQkJbXNnLT5yeF9zaXplKTsKKwkJfQorCQlicmVhazsKKwkvKiB0aGVzZSB3aWxsIGJlIHJhcmUgLSBidXQgdXNlZnVsIGZvciBkZWJ1ZyAqLworCWNhc2UgSVBDX0dMQl9SRVBMWV9VTktOT1dOX01FU1NBR0VfVFlQRToKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogdW5rbm93biBtZXNzYWdlIHR5cGUiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVCQURNU0c7CisJCWJyZWFrOworCWNhc2UgSVBDX0dMQl9SRVBMWV9PVVRfT0ZfUkVTT1VSQ0VTOgorCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiBvdXQgb2YgcmVzb3VyY2VzIiwgaGVhZGVyKTsKKwkJbXNnLT5lcnJubyA9IC1FTk9NRU07CisJCWJyZWFrOworCWNhc2UgSVBDX0dMQl9SRVBMWV9CVVNZOgorCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiByZXBseSBidXN5IiwgaGVhZGVyKTsKKwkJbXNnLT5lcnJubyA9IC1FQlVTWTsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX0ZBSUxVUkU6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IHJlcGx5IGZhaWx1cmUiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX1NUQUdFX1VOSU5JVElBTElaRUQ6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IHN0YWdlIHVuaW5pdGlhbGl6ZWQiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX05PVF9GT1VORDoKKwkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogcmVwbHkgbm90IGZvdW5kIiwgaGVhZGVyKTsKKwkJbXNnLT5lcnJubyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgSVBDX0dMQl9SRVBMWV9TT1VSQ0VfTk9UX1NUQVJURUQ6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IHNvdXJjZSBub3Qgc3RhcnRlZCIsIGhlYWRlcik7CisJCW1zZy0+ZXJybm8gPSAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElQQ19HTEJfUkVQTFlfSU5WQUxJRF9SRVFVRVNUOgorCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiBpbnZhbGlkIHJlcXVlc3QiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1JFUExZX0VSUk9SX0lOVkFMSURfUEFSQU06CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IGludmFsaWQgcGFyYW1ldGVyIiwgaGVhZGVyKTsKKwkJbXNnLT5lcnJubyA9IC1FSU5WQUw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IHVua25vd24gcmVwbHkiLCBoZWFkZXIpOworCQltc2ctPmVycm5vID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJLyogdXBkYXRlIGFueSBzdHJlYW0gc3RhdGVzICovCisJaWYgKG1zZ19nZXRfZ2xvYmFsX3R5cGUoaGVhZGVyKSA9PSBJUENfR0xCX1NUUkVBTV9NRVNTQUdFKQorCQloc3dfc3RyZWFtX3VwZGF0ZShoc3csIG1zZyk7CisKKwkvKiB3YWtlIHVwIGFuZCByZXR1cm4gdGhlIGVycm9yIGlmIHdlIGhhdmUgd2FpdGVycyBvbiB0aGlzIG1lc3NhZ2UgPyAqLworCWxpc3RfZGVsKCZtc2ctPmxpc3QpOworCXNzdF9pcGNfdHhfbXNnX3JlcGx5X2NvbXBsZXRlKCZoc3ctPmlwYywgbXNnKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhzd19tb2R1bGVfbWVzc2FnZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyKQoreworCXUzMiBvcGVyYXRpb24sIG1vZHVsZV9pZDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlvcGVyYXRpb24gPSBtc2dfZ2V0X21vZHVsZV9vcGVyYXRpb24oaGVhZGVyKTsKKwltb2R1bGVfaWQgPSBtc2dfZ2V0X21vZHVsZV9pZChoZWFkZXIpOworCWRldl9kYmcoaHN3LT5kZXYsICJyZWNlaXZlZCBtb2R1bGUgbWVzc2FnZSBoZWFkZXI6IDB4JTguOHhcbiIsCisJCQloZWFkZXIpOworCWRldl9kYmcoaHN3LT5kZXYsICJvcGVyYXRpb246IDB4JTguOHggbW9kdWxlX2lkOiAweCU4Ljh4XG4iLAorCQkJb3BlcmF0aW9uLCBtb2R1bGVfaWQpOworCisJc3dpdGNoIChvcGVyYXRpb24pIHsKKwljYXNlIElQQ19NT0RVTEVfTk9USUZJQ0FUSU9OOgorCQlkZXZfZGJnKGhzdy0+ZGV2LCAibW9kdWxlIG5vdGlmaWNhdGlvbiByZWNlaXZlZCIpOworCQloYW5kbGVkID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaGFuZGxlZCA9IGhzd19wcm9jZXNzX3JlcGx5KGhzdywgaGVhZGVyKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3N0cmVhbV9tZXNzYWdlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBoZWFkZXIpCit7CisJdTMyIHN0cmVhbV9tc2csIHN0cmVhbV9pZCwgc3RhZ2VfdHlwZTsKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbTsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlzdHJlYW1fbXNnID0gbXNnX2dldF9zdHJlYW1fdHlwZShoZWFkZXIpOworCXN0cmVhbV9pZCA9IG1zZ19nZXRfc3RyZWFtX2lkKGhlYWRlcik7CisJc3RhZ2VfdHlwZSA9IG1zZ19nZXRfc3RhZ2VfdHlwZShoZWFkZXIpOworCisJc3RyZWFtID0gZ2V0X3N0cmVhbV9ieV9pZChoc3csIHN0cmVhbV9pZCk7CisJaWYgKHN0cmVhbSA9PSBOVUxMKQorCQlyZXR1cm4gaGFuZGxlZDsKKworCXN0cmVhbS0+aGVhZGVyID0gaGVhZGVyOworCisJc3dpdGNoIChzdHJlYW1fbXNnKSB7CisJY2FzZSBJUENfU1RSX1NUQUdFX01FU1NBR0U6CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RhZ2UgbXNnIG5vdCBpbXBsZW1lbnRlZCAweCU4Ljh4XG4iLAorCQkJaGVhZGVyKTsKKwkJYnJlYWs7CisJY2FzZSBJUENfU1RSX05PVElGSUNBVElPTjoKKwkJc2NoZWR1bGVfd29yaygmc3RyZWFtLT5ub3RpZnlfd29yayk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGhhbmRsZSBwZW5kaW5nIG1lc3NhZ2UgY29tcGxldGUgcmVxdWVzdCAqLworCQloYW5kbGVkID0gaHN3X3Byb2Nlc3NfcmVwbHkoaHN3LCBoZWFkZXIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIGludCBoc3dfbG9nX21lc3NhZ2Uoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKK3sKKwl1MzIgb3BlcmF0aW9uID0gKGhlYWRlciAmIElQQ19MT0dfT1BfTUFTSykgPj4gIElQQ19MT0dfT1BfU0hJRlQ7CisJc3RydWN0IHNzdF9oc3dfbG9nX3N0cmVhbSAqc3RyZWFtID0gJmhzdy0+bG9nX3N0cmVhbTsKKwlpbnQgcmV0ID0gMTsKKworCWlmIChvcGVyYXRpb24gIT0gSVBDX0RFQlVHX1JFUVVFU1RfTE9HX0RVTVApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwKKwkJCSJlcnJvcjogbG9nIG1zZyBub3QgaW1wbGVtZW50ZWQgMHglOC44eFxuIiwgaGVhZGVyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbXV0ZXhfbG9jaygmc3RyZWFtLT5yd19tdXRleCk7CisJc3RyZWFtLT5sYXN0X3BvcyA9IHN0cmVhbS0+Y3Vycl9wb3M7CisJc3N0X2RzcF9pbmJveF9yZWFkKAorCQloc3ctPmRzcCwgJnN0cmVhbS0+Y3Vycl9wb3MsIHNpemVvZihzdHJlYW0tPmN1cnJfcG9zKSk7CisJbXV0ZXhfdW5sb2NrKCZzdHJlYW0tPnJ3X211dGV4KTsKKworCXNjaGVkdWxlX3dvcmsoJnN0cmVhbS0+bm90aWZ5X3dvcmspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoc3dfcHJvY2Vzc19ub3RpZmljYXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdykKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gaHN3LT5kc3A7CisJdTMyIHR5cGUsIGhlYWRlcjsKKwlpbnQgaGFuZGxlZCA9IDE7CisKKwloZWFkZXIgPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JUENEKTsKKwl0eXBlID0gbXNnX2dldF9nbG9iYWxfdHlwZShoZWFkZXIpOworCisJdHJhY2VfaXBjX3JlcXVlc3QoInByb2Nlc3NpbmcgLS0+IiwgaGVhZGVyKTsKKworCS8qIEZXIFJlYWR5IGlzIGEgc3BlY2lhbCBjYXNlICovCisJaWYgKCFoc3ctPmJvb3RfY29tcGxldGUgJiYgaGVhZGVyICYgSVBDX0ZXX1JFQURZKSB7CisJCWhzd19md19yZWFkeShoc3csIGhlYWRlcik7CisJCXJldHVybiBoYW5kbGVkOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgSVBDX0dMQl9HRVRfRldfVkVSU0lPTjoKKwljYXNlIElQQ19HTEJfQUxMT0NBVEVfU1RSRUFNOgorCWNhc2UgSVBDX0dMQl9GUkVFX1NUUkVBTToKKwljYXNlIElQQ19HTEJfR0VUX0ZXX0NBUEFCSUxJVElFUzoKKwljYXNlIElQQ19HTEJfUkVRVUVTVF9EVU1QOgorCWNhc2UgSVBDX0dMQl9HRVRfREVWSUNFX0ZPUk1BVFM6CisJY2FzZSBJUENfR0xCX1NFVF9ERVZJQ0VfRk9STUFUUzoKKwljYXNlIElQQ19HTEJfRU5URVJfRFhfU1RBVEU6CisJY2FzZSBJUENfR0xCX0dFVF9NSVhFUl9TVFJFQU1fSU5GTzoKKwljYXNlIElQQ19HTEJfTUFYX0lQQ19NRVNTQUdFX1RZUEU6CisJY2FzZSBJUENfR0xCX1JFU1RPUkVfQ09OVEVYVDoKKwljYXNlIElQQ19HTEJfU0hPUlRfUkVQTFk6CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogbWVzc2FnZSB0eXBlICVkIGhlYWRlciAweCV4XG4iLAorCQkJdHlwZSwgaGVhZGVyKTsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX1NUUkVBTV9NRVNTQUdFOgorCQloYW5kbGVkID0gaHN3X3N0cmVhbV9tZXNzYWdlKGhzdywgaGVhZGVyKTsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX0RFQlVHX0xPR19NRVNTQUdFOgorCQloYW5kbGVkID0gaHN3X2xvZ19tZXNzYWdlKGhzdywgaGVhZGVyKTsKKwkJYnJlYWs7CisJY2FzZSBJUENfR0xCX01PRFVMRV9PUEVSQVRJT046CisJCWhhbmRsZWQgPSBoc3dfbW9kdWxlX21lc3NhZ2UoaHN3LCBoZWFkZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHVuZXhwZWN0ZWQgdHlwZSAlZCBoZHIgMHglOC44eFxuIiwKKwkJCXR5cGUsIGhlYWRlcik7CisJCWJyZWFrOworCX0KKworCXJldHVybiBoYW5kbGVkOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaHN3X2lycV90aHJlYWQoaW50IGlycSwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gKHN0cnVjdCBzc3RfZHNwICopIGNvbnRleHQ7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHNzdF9kc3BfZ2V0X3RocmVhZF9jb250ZXh0KHNzdCk7CisJc3RydWN0IHNzdF9nZW5lcmljX2lwYyAqaXBjID0gJmhzdy0+aXBjOworCXUzMiBpcGN4LCBpcGNkOworCWludCBoYW5kbGVkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJaXBjeCA9IHNzdF9kc3BfaXBjX21zZ19yeChoc3ctPmRzcCk7CisJaXBjZCA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QpOworCisJLyogcmVwbHkgbWVzc2FnZSBmcm9tIERTUCAqLworCWlmIChpcGN4ICYgU1NUX0lQQ1hfRE9ORSkgeworCisJCS8qIEhhbmRsZSBJbW1lZGlhdGUgcmVwbHkgZnJvbSBEU1AgQ29yZSAqLworCQloYW5kbGVkID0gaHN3X3Byb2Nlc3NfcmVwbHkoaHN3LCBpcGN4KTsKKworCQlpZiAoaGFuZGxlZCA+IDApIHsKKwkJCS8qIGNsZWFyIERPTkUgYml0IC0gdGVsbCBEU1Agd2UgaGF2ZSBjb21wbGV0ZWQgKi8KKwkJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JUENYLAorCQkJCVNTVF9JUENYX0RPTkUsIDApOworCisJCQkvKiB1bm1hc2sgRG9uZSBpbnRlcnJ1cHQgKi8KKwkJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJCVNTVF9JTVJYX0RPTkUsIDApOworCQl9CisJfQorCisJLyogbmV3IG1lc3NhZ2UgZnJvbSBEU1AgKi8KKwlpZiAoaXBjZCAmIFNTVF9JUENEX0JVU1kpIHsKKworCQkvKiBIYW5kbGUgTm90aWZpY2F0aW9uIGFuZCBEZWxheWVkIHJlcGx5IGZyb20gRFNQIENvcmUgKi8KKwkJaGFuZGxlZCA9IGhzd19wcm9jZXNzX25vdGlmaWNhdGlvbihoc3cpOworCisJCS8qIGNsZWFyIEJVU1kgYml0IGFuZCBzZXQgRE9ORSBiaXQgLSBhY2NlcHQgbmV3IG1lc3NhZ2VzICovCisJCWlmIChoYW5kbGVkID4gMCkgeworCQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QsCisJCQkJU1NUX0lQQ0RfQlVTWSB8IFNTVF9JUENEX0RPTkUsIFNTVF9JUENEX0RPTkUpOworCisJCQkvKiB1bm1hc2sgYnVzeSBpbnRlcnJ1cHQgKi8KKwkJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLAorCQkJCVNTVF9JTVJYX0JVU1ksIDApOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJLyogY29udGludWUgdG8gc2VuZCBhbnkgcmVtYWluaW5nIG1lc3NhZ2VzLi4uICovCisJcXVldWVfa3RocmVhZF93b3JrKCZpcGMtPmt3b3JrZXIsICZpcGMtPmt3b3JrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworaW50IHNzdF9oc3dfZndfZ2V0X3ZlcnNpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfdmVyc2lvbiAqdmVyc2lvbikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3N0X2lwY190eF9tZXNzYWdlX3dhaXQoJmhzdy0+aXBjLAorCQlJUENfR0xCX1RZUEUoSVBDX0dMQl9HRVRfRldfVkVSU0lPTiksCisJCU5VTEwsIDAsIHZlcnNpb24sIHNpemVvZigqdmVyc2lvbikpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGdldCB2ZXJzaW9uIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBNaXhlciBDb250cm9scyAqLworaW50IHNzdF9oc3dfc3RyZWFtX2dldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwgdTMyICp2b2x1bWUpCit7CisJaWYgKGNoYW5uZWwgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNzdF9kc3BfcmVhZChoc3ctPmRzcCwgdm9sdW1lLAorCQlzdHJlYW0tPnJlcGx5LnZvbHVtZV9yZWdpc3Rlcl9hZGRyZXNzW2NoYW5uZWxdLAorCQlzaXplb2YoKnZvbHVtZSkpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHN0cmVhbSB2b2x1bWUgKi8KK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsIHUzMiB2b2x1bWUpCit7CisJc3RydWN0IHNzdF9oc3dfaXBjX3ZvbHVtZV9yZXEgKnJlcTsKKwl1MzIgaGVhZGVyOworCWludCByZXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic2V0IHN0cmVhbSB2b2x1bWUiLCBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7CisKKwlpZiAoY2hhbm5lbCA+PSAyICYmIGNoYW5uZWwgIT0gU1NUX0hTV19DSEFOTkVMU19BTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfU1RSRUFNX01FU1NBR0UpIHwKKwkJSVBDX1NUUl9UWVBFKElQQ19TVFJfU1RBR0VfTUVTU0FHRSk7CisJaGVhZGVyIHw9IChzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCA8PCBJUENfU1RSX0lEX1NISUZUKTsKKwloZWFkZXIgfD0gKElQQ19TVEdfU0VUX1ZPTFVNRSA8PCBJUENfU1RHX1RZUEVfU0hJRlQpOworCWhlYWRlciB8PSAoc3RhZ2VfaWQgPDwgSVBDX1NUR19JRF9TSElGVCk7CisKKwlyZXEgPSAmc3RyZWFtLT52b2xfcmVxOworCXJlcS0+dGFyZ2V0X3ZvbHVtZSA9IHZvbHVtZTsKKworCS8qIHNldCBib3RoIGF0IHNhbWUgdGltZSA/ICovCisJaWYgKGNoYW5uZWwgPT0gU1NUX0hTV19DSEFOTkVMU19BTEwpIHsKKwkJaWYgKGhzdy0+bXV0ZVswXSAmJiBoc3ctPm11dGVbMV0pIHsKKwkJCWhzdy0+bXV0ZV92b2x1bWVbMF0gPSBoc3ctPm11dGVfdm9sdW1lWzFdID0gdm9sdW1lOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoaHN3LT5tdXRlWzBdKQorCQkJcmVxLT5jaGFubmVsID0gMTsKKwkJZWxzZSBpZiAoaHN3LT5tdXRlWzFdKQorCQkJcmVxLT5jaGFubmVsID0gMDsKKwkJZWxzZQorCQkJcmVxLT5jaGFubmVsID0gU1NUX0hTV19DSEFOTkVMU19BTEw7CisJfSBlbHNlIHsKKwkJLyogc2V0IG9ubHkgMSBjaGFubmVsICovCisJCWlmIChoc3ctPm11dGVbY2hhbm5lbF0pIHsKKwkJCWhzdy0+bXV0ZV92b2x1bWVbY2hhbm5lbF0gPSB2b2x1bWU7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXEtPmNoYW5uZWwgPSBjaGFubmVsOworCX0KKworCXJldCA9IHNzdF9pcGNfdHhfbWVzc2FnZV93YWl0KCZoc3ctPmlwYywgaGVhZGVyLCByZXEsCisJCXNpemVvZigqcmVxKSwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzZXQgc3RyZWFtIHZvbHVtZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyICp2b2x1bWUpCit7CisJaWYgKGNoYW5uZWwgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNzdF9kc3BfcmVhZChoc3ctPmRzcCwgdm9sdW1lLAorCQloc3ctPm1peGVyX2luZm8udm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbY2hhbm5lbF0sCisJCXNpemVvZigqdm9sdW1lKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZ2xvYmFsIG1peGVyIHZvbHVtZSAqLworaW50IHNzdF9oc3dfbWl4ZXJfc2V0X3ZvbHVtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsLAorCXUzMiB2b2x1bWUpCit7CisJc3RydWN0IHNzdF9oc3dfaXBjX3ZvbHVtZV9yZXEgcmVxOworCXUzMiBoZWFkZXI7CisJaW50IHJldDsKKworCXRyYWNlX2lwY19yZXF1ZXN0KCJzZXQgbWl4ZXIgdm9sdW1lIiwgdm9sdW1lKTsKKworCWlmIChjaGFubmVsID49IDIgJiYgY2hhbm5lbCAhPSBTU1RfSFNXX0NIQU5ORUxTX0FMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBzZXQgYm90aCBhdCBzYW1lIHRpbWUgPyAqLworCWlmIChjaGFubmVsID09IFNTVF9IU1dfQ0hBTk5FTFNfQUxMKSB7CisJCWlmIChoc3ctPm11dGVbMF0gJiYgaHN3LT5tdXRlWzFdKSB7CisJCQloc3ctPm11dGVfdm9sdW1lWzBdID0gaHN3LT5tdXRlX3ZvbHVtZVsxXSA9IHZvbHVtZTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgaWYgKGhzdy0+bXV0ZVswXSkKKwkJCXJlcS5jaGFubmVsID0gMTsKKwkJZWxzZSBpZiAoaHN3LT5tdXRlWzFdKQorCQkJcmVxLmNoYW5uZWwgPSAwOworCQllbHNlCisJCQlyZXEuY2hhbm5lbCA9IFNTVF9IU1dfQ0hBTk5FTFNfQUxMOworCX0gZWxzZSB7CisJCS8qIHNldCBvbmx5IDEgY2hhbm5lbCAqLworCQlpZiAoaHN3LT5tdXRlW2NoYW5uZWxdKSB7CisJCQloc3ctPm11dGVfdm9sdW1lW2NoYW5uZWxdID0gdm9sdW1lOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmVxLmNoYW5uZWwgPSBjaGFubmVsOworCX0KKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX1NUUkVBTV9NRVNTQUdFKSB8CisJCUlQQ19TVFJfVFlQRShJUENfU1RSX1NUQUdFX01FU1NBR0UpOworCWhlYWRlciB8PSAoaHN3LT5taXhlcl9pbmZvLm1peGVyX2h3X2lkIDw8IElQQ19TVFJfSURfU0hJRlQpOworCWhlYWRlciB8PSAoSVBDX1NUR19TRVRfVk9MVU1FIDw8IElQQ19TVEdfVFlQRV9TSElGVCk7CisJaGVhZGVyIHw9IChzdGFnZV9pZCA8PCBJUENfU1RHX0lEX1NISUZUKTsKKworCXJlcS5jdXJ2ZV9kdXJhdGlvbiA9IGhzdy0+Y3VydmVfZHVyYXRpb247CisJcmVxLmN1cnZlX3R5cGUgPSBoc3ctPmN1cnZlX3R5cGU7CisJcmVxLnRhcmdldF92b2x1bWUgPSB2b2x1bWU7CisKKwlyZXQgPSBzc3RfaXBjX3R4X21lc3NhZ2Vfd2FpdCgmaHN3LT5pcGMsIGhlYWRlciwgJnJlcSwKKwkJc2l6ZW9mKHJlcSksIE5VTEwsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc2V0IG1peGVyIHZvbHVtZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCisvKiBTdHJlYW0gQVBJICovCitzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnNzdF9oc3dfc3RyZWFtX25ldyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBpbnQgaWQsCisJdTMyICgqbm90aWZ5X3Bvc2l0aW9uKShzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdm9pZCAqZGF0YSksCisJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbTsKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gaHN3LT5kc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN0cmVhbSA9IGt6YWxsb2Moc2l6ZW9mKCpzdHJlYW0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RyZWFtID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKKwlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCA9IElOVkFMSURfU1RSRUFNX0hXX0lEOworCWxpc3RfYWRkKCZzdHJlYW0tPm5vZGUsICZoc3ctPnN0cmVhbV9saXN0KTsKKwlzdHJlYW0tPm5vdGlmeV9wb3NpdGlvbiA9IG5vdGlmeV9wb3NpdGlvbjsKKwlzdHJlYW0tPnBkYXRhID0gZGF0YTsKKwlzdHJlYW0tPmhzdyA9IGhzdzsKKwlzdHJlYW0tPmhvc3RfaWQgPSBpZDsKKworCS8qIHdvcmsgdG8gcHJvY2VzcyBub3RpZmljYXRpb24gbWVzc2FnZXMgKi8KKwlJTklUX1dPUksoJnN0cmVhbS0+bm90aWZ5X3dvcmssIGhzd19ub3RpZmljYXRpb25fd29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHN0cmVhbTsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX2ZyZWUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCit7CisJdTMyIGhlYWRlcjsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gaHN3LT5kc3A7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghc3RyZWFtKSB7CisJCWRldl93YXJuKGhzdy0+ZGV2LCAid2FybmluZzogc3RyZWFtIGlzIE5VTEwsIG5vIHN0cmVhbSB0byBmcmVlLCBpZ25vcmUgaXQuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogZG9udCBmcmVlIERTUCBzdHJlYW1zIHRoYXQgYXJlIG5vdCBjb21taXRlZCAqLworCWlmICghc3RyZWFtLT5jb21taXRlZCkKKwkJZ290byBvdXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIGZyZWUiLCBzdHJlYW0tPmhvc3RfaWQpOworCisJc3RyZWFtLT5mcmVlX3JlcS5zdHJlYW1faWQgPSBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZDsKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9GUkVFX1NUUkVBTSk7CisKKwlyZXQgPSBzc3RfaXBjX3R4X21lc3NhZ2Vfd2FpdCgmaHN3LT5pcGMsIGhlYWRlciwgJnN0cmVhbS0+ZnJlZV9yZXEsCisJCXNpemVvZihzdHJlYW0tPmZyZWVfcmVxKSwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBmcmVlIHN0cmVhbSAlZCBmYWlsZWRcbiIsCisJCQlzdHJlYW0tPmZyZWVfcmVxLnN0cmVhbV9pZCk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKworCXRyYWNlX2hzd19zdHJlYW1fZnJlZV9yZXEoc3RyZWFtLCAmc3RyZWFtLT5mcmVlX3JlcSk7CisKK291dDoKKwljYW5jZWxfd29ya19zeW5jKCZzdHJlYW0tPm5vdGlmeV93b3JrKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZzdHJlYW0tPm5vZGUpOworCWtmcmVlKHN0cmVhbSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9iaXRzKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIGVudW0gc3N0X2hzd19iaXRkZXB0aCBiaXRzKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IGJpdHNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LmJpdGRlcHRoID0gYml0czsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9jaGFubmVscyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBpbnQgY2hhbm5lbHMpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgY2hhbm5lbHNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LmNoX251bSA9IGNoYW5uZWxzOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3JhdGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgaW50IHJhdGUpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgcmF0ZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQuZnJlcXVlbmN5ID0gcmF0ZTsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9tYXBfY29uZmlnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBtYXAsCisJZW51bSBzc3RfaHN3X2NoYW5uZWxfY29uZmlnIGNvbmZpZykKK3sKKwlpZiAoc3RyZWFtLT5jb21taXRlZCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBtYXBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0Lm1hcCA9IG1hcDsKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LmNvbmZpZyA9IGNvbmZpZzsKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9zdHlsZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBlbnVtIHNzdF9oc3dfaW50ZXJsZWF2aW5nIHN0eWxlKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IHN0eWxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtLT5yZXF1ZXN0LmZvcm1hdC5zdHlsZSA9IHN0eWxlOworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZhbGlkKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBiaXRzKQoreworCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IHZhbGlkIGJpdHNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LnZhbGlkX2JpdCA9IGJpdHM7CisJcmV0dXJuIDA7Cit9CisKKy8qIFN0cmVhbSBDb25maWd1cmF0aW9uICovCitpbnQgc3N0X2hzd19zdHJlYW1fZm9ybWF0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWVudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCBwYXRoX2lkLAorCWVudW0gc3N0X2hzd19zdHJlYW1fdHlwZSBzdHJlYW1fdHlwZSwKKwllbnVtIHNzdF9oc3dfc3RyZWFtX2Zvcm1hdCBmb3JtYXRfaWQpCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgZm9ybWF0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RyZWFtLT5yZXF1ZXN0LnBhdGhfaWQgPSBwYXRoX2lkOworCXN0cmVhbS0+cmVxdWVzdC5zdHJlYW1fdHlwZSA9IHN0cmVhbV90eXBlOworCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXRfaWQgPSBmb3JtYXRfaWQ7CisKKwl0cmFjZV9oc3dfc3RyZWFtX2FsbG9jX3JlcXVlc3Qoc3RyZWFtLCAmc3RyZWFtLT5yZXF1ZXN0KTsKKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fYnVmZmVyKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCXUzMiByaW5nX3B0X2FkZHJlc3MsIHUzMiBudW1fcGFnZXMsCisJdTMyIHJpbmdfc2l6ZSwgdTMyIHJpbmdfb2Zmc2V0LCB1MzIgcmluZ19maXJzdF9wZm4pCit7CisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBidWZmZXJcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19wdF9hZGRyZXNzID0gcmluZ19wdF9hZGRyZXNzOworCXN0cmVhbS0+cmVxdWVzdC5yaW5naW5mby5udW1fcGFnZXMgPSBudW1fcGFnZXM7CisJc3RyZWFtLT5yZXF1ZXN0LnJpbmdpbmZvLnJpbmdfc2l6ZSA9IHJpbmdfc2l6ZTsKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19vZmZzZXQgPSByaW5nX29mZnNldDsKKwlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19maXJzdF9wZm4gPSByaW5nX2ZpcnN0X3BmbjsKKworCXRyYWNlX2hzd19zdHJlYW1fYnVmZmVyKHN0cmVhbSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9tb2R1bGVfaW5mbyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lKQoreworCXN0cnVjdCBzc3RfaHN3X21vZHVsZV9tYXAgKm1hcCA9ICZzdHJlYW0tPnJlcXVlc3QubWFwOworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfaHN3X2dldF9kc3AoaHN3KTsKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlID0gcnVudGltZS0+bW9kdWxlOworCisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgbW9kdWxlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogb25seSBzdXBwb3J0IGluaXRpYWwgbW9kdWxlIGF0bSAqLworCW1hcC0+bW9kdWxlX2VudHJpZXNfY291bnQgPSAxOworCW1hcC0+bW9kdWxlX2VudHJpZXNbMF0ubW9kdWxlX2lkID0gbW9kdWxlLT5pZDsKKwltYXAtPm1vZHVsZV9lbnRyaWVzWzBdLmVudHJ5X3BvaW50ID0gbW9kdWxlLT5lbnRyeTsKKworCXN0cmVhbS0+cmVxdWVzdC5wZXJzaXN0ZW50X21lbS5vZmZzZXQgPQorCQlzc3RfZHNwX2dldF9vZmZzZXQoZHNwLCBydW50aW1lLT5wZXJzaXN0ZW50X29mZnNldCwgU1NUX01FTV9EUkFNKTsKKwlzdHJlYW0tPnJlcXVlc3QucGVyc2lzdGVudF9tZW0uc2l6ZSA9IG1vZHVsZS0+cGVyc2lzdGVudF9zaXplOworCisJc3RyZWFtLT5yZXF1ZXN0LnNjcmF0Y2hfbWVtLm9mZnNldCA9CisJCXNzdF9kc3BfZ2V0X29mZnNldChkc3AsIGRzcC0+c2NyYXRjaF9vZmZzZXQsIFNTVF9NRU1fRFJBTSk7CisJc3RyZWFtLT5yZXF1ZXN0LnNjcmF0Y2hfbWVtLnNpemUgPSBkc3AtPnNjcmF0Y2hfc2l6ZTsKKworCWRldl9kYmcoaHN3LT5kZXYsICJtb2R1bGUgJWQgcnVudGltZSAlZCB1c2luZzpcbiIsIG1vZHVsZS0+aWQsCisJCXJ1bnRpbWUtPmlkKTsKKwlkZXZfZGJnKGhzdy0+ZGV2LCAiIHBlcnNpc3RlbnQgb2Zmc2V0IDB4JXggYnl0ZXMgMHgleFxuIiwKKwkJc3RyZWFtLT5yZXF1ZXN0LnBlcnNpc3RlbnRfbWVtLm9mZnNldCwKKwkJc3RyZWFtLT5yZXF1ZXN0LnBlcnNpc3RlbnRfbWVtLnNpemUpOworCWRldl9kYmcoaHN3LT5kZXYsICIgc2NyYXRjaCBvZmZzZXQgMHgleCBieXRlcyAweCV4XG4iLAorCQlzdHJlYW0tPnJlcXVlc3Quc2NyYXRjaF9tZW0ub2Zmc2V0LAorCQlzdHJlYW0tPnJlcXVlc3Quc2NyYXRjaF9tZW0uc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX2NvbW1pdChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcSAqc3RyX3JlcSA9ICZzdHJlYW0tPnJlcXVlc3Q7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXBseSAqcmVwbHkgPSAmc3RyZWFtLT5yZXBseTsKKwl1MzIgaGVhZGVyOworCWludCByZXQ7CisKKwlpZiAoIXN0cmVhbSkgeworCQlkZXZfd2Fybihoc3ctPmRldiwgIndhcm5pbmc6IHN0cmVhbSBpcyBOVUxMLCBubyBzdHJlYW0gdG8gY29tbWl0LCBpZ25vcmUgaXQuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKKwkJZGV2X3dhcm4oaHN3LT5kZXYsICJ3YXJuaW5nOiBzdHJlYW0gaXMgYWxyZWFkeSBjb21taXR0ZWQsIGlnbm9yZSBpdC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIGFsbG9jIiwgc3RyZWFtLT5ob3N0X2lkKTsKKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX0FMTE9DQVRFX1NUUkVBTSk7CisKKwlyZXQgPSBzc3RfaXBjX3R4X21lc3NhZ2Vfd2FpdCgmaHN3LT5pcGMsIGhlYWRlciwgc3RyX3JlcSwKKwkJc2l6ZW9mKCpzdHJfcmVxKSwgcmVwbHksIHNpemVvZigqcmVwbHkpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlzdHJlYW0tPmNvbW1pdGVkID0gMTsKKwl0cmFjZV9oc3dfc3RyZWFtX2FsbG9jX3JlcGx5KHN0cmVhbSk7CisKKwlyZXR1cm4gMDsKK30KKworc25kX3BjbV91ZnJhbWVzX3Qgc3N0X2hzd19zdHJlYW1fZ2V0X29sZF9wb3NpdGlvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKQoreworCXJldHVybiBzdHJlYW0tPm9sZF9wb3NpdGlvbjsKK30KKwordm9pZCBzc3RfaHN3X3N0cmVhbV9zZXRfb2xkX3Bvc2l0aW9uKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHNuZF9wY21fdWZyYW1lc190IHZhbCkKK3sKKwlzdHJlYW0tPm9sZF9wb3NpdGlvbiA9IHZhbDsKK30KKworYm9vbCBzc3RfaHN3X3N0cmVhbV9nZXRfc2lsZW5jZV9zdGFydChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKQoreworCXJldHVybiBzdHJlYW0tPnBsYXlfc2lsZW5jZTsKK30KKwordm9pZCBzc3RfaHN3X3N0cmVhbV9zZXRfc2lsZW5jZV9zdGFydChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBib29sIHZhbCkKK3sKKwlzdHJlYW0tPnBsYXlfc2lsZW5jZSA9IHZhbDsKK30KKworLyogU3RyZWFtIEluZm9ybWF0aW9uIC0gdGhlc2UgY2FsbHMgY291bGQgYmUgaW5saW5lIGJ1dCB3ZSB3YW50IHRoZSBJUEMKKyBBQkkgdG8gYmUgb3BhcXVlIHRvIGNsaWVudCBQQ00gZHJpdmVycyB0byBjb3BlIHdpdGggYW55IGZ1dHVyZSBBQkkgY2hhbmdlcyAqLworaW50IHNzdF9oc3dfbWl4ZXJfZ2V0X2luZm8oc3RydWN0IHNzdF9oc3cgKmhzdykKK3sKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2luZm9fcmVwbHkgKnJlcGx5OworCXUzMiBoZWFkZXI7CisJaW50IHJldDsKKworCXJlcGx5ID0gJmhzdy0+bWl4ZXJfaW5mbzsKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9HRVRfTUlYRVJfU1RSRUFNX0lORk8pOworCisJdHJhY2VfaXBjX3JlcXVlc3QoImdldCBnbG9iYWwgbWl4ZXIgaW5mbyIsIDApOworCisJcmV0ID0gc3N0X2lwY190eF9tZXNzYWdlX3dhaXQoJmhzdy0+aXBjLCBoZWFkZXIsIE5VTEwsIDAsCisJCXJlcGx5LCBzaXplb2YoKnJlcGx5KSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBnZXQgc3RyZWFtIGluZm8gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0cmFjZV9oc3dfbWl4ZXJfaW5mb19yZXBseShyZXBseSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogU2VuZCBzdHJlYW0gY29tbWFuZCAqLworc3RhdGljIGludCBzc3RfaHN3X3N0cmVhbV9vcGVyYXRpb25zKHN0cnVjdCBzc3RfaHN3ICpoc3csIGludCB0eXBlLAorCWludCBzdHJlYW1faWQsIGludCB3YWl0KQoreworCXUzMiBoZWFkZXI7CisKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9TVFJFQU1fTUVTU0FHRSkgfCBJUENfU1RSX1RZUEUodHlwZSk7CisJaGVhZGVyIHw9IChzdHJlYW1faWQgPDwgSVBDX1NUUl9JRF9TSElGVCk7CisKKwlpZiAod2FpdCkKKwkJcmV0dXJuIHNzdF9pcGNfdHhfbWVzc2FnZV93YWl0KCZoc3ctPmlwYywgaGVhZGVyLAorCQkJTlVMTCwgMCwgTlVMTCwgMCk7CisJZWxzZQorCQlyZXR1cm4gc3N0X2lwY190eF9tZXNzYWdlX25vd2FpdCgmaHN3LT5pcGMsIGhlYWRlciwgTlVMTCwgMCk7Cit9CisKKy8qIFN0cmVhbSBBTFNBIHRyaWdnZXIgb3BlcmF0aW9ucyAqLworaW50IHNzdF9oc3dfc3RyZWFtX3BhdXNlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWludCB3YWl0KQoreworCWludCByZXQ7CisKKwlpZiAoIXN0cmVhbSkgeworCQlkZXZfd2Fybihoc3ctPmRldiwgIndhcm5pbmc6IHN0cmVhbSBpcyBOVUxMLCBubyBzdHJlYW0gdG8gcGF1c2UsIGlnbm9yZSBpdC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIHBhdXNlIiwgc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fb3BlcmF0aW9ucyhoc3csIElQQ19TVFJfUEFVU0UsCisJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkLCB3YWl0KTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBmYWlsZWQgdG8gcGF1c2Ugc3RyZWFtICVkXG4iLAorCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9oc3dfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwlpbnQgd2FpdCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCFzdHJlYW0pIHsKKwkJZGV2X3dhcm4oaHN3LT5kZXYsICJ3YXJuaW5nOiBzdHJlYW0gaXMgTlVMTCwgbm8gc3RyZWFtIHRvIHJlc3VtZSwgaWdub3JlIGl0LlxuIik7CisJCXJldHVybiAwOworCX0KKworCXRyYWNlX2lwY19yZXF1ZXN0KCJzdHJlYW0gcmVzdW1lIiwgc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fb3BlcmF0aW9ucyhoc3csIElQQ19TVFJfUkVTVU1FLAorCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCwgd2FpdCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHJlc3VtZSBzdHJlYW0gJWRcbiIsCisJCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc3N0X2hzd19zdHJlYW1fcmVzZXQoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCit7CisJaW50IHJldCwgdHJpZXMgPSAxMDsKKworCWlmICghc3RyZWFtKSB7CisJCWRldl93YXJuKGhzdy0+ZGV2LCAid2FybmluZzogc3RyZWFtIGlzIE5VTEwsIG5vIHN0cmVhbSB0byByZXNldCwgaWdub3JlIGl0LlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIGRvbnQgcmVzZXQgc3RyZWFtcyB0aGF0IGFyZSBub3QgY29tbWl0ZWQgKi8KKwlpZiAoIXN0cmVhbS0+Y29tbWl0ZWQpCisJCXJldHVybiAwOworCisJLyogd2FpdCBmb3IgcGF1c2UgdG8gY29tcGxldGUgYmVmb3JlIHdlIHJlc2V0IHRoZSBzdHJlYW0gKi8KKwl3aGlsZSAoc3RyZWFtLT5ydW5uaW5nICYmIHRyaWVzLS0pCisJCW1zbGVlcCgxKTsKKwlpZiAoIXRyaWVzKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogcmVzZXQgc3RyZWFtICVkIHN0aWxsIHJ1bm5pbmdcbiIsCisJCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRyYWNlX2lwY19yZXF1ZXN0KCJzdHJlYW0gcmVzZXQiLCBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9vcGVyYXRpb25zKGhzdywgSVBDX1NUUl9SRVNFVCwKKwkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQsIDEpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byByZXNldCBzdHJlYW0gJWRcbiIsCisJCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7CisJcmV0dXJuIHJldDsKK30KKworLyogU3RyZWFtIHBvaW50ZXIgcG9zaXRpb25zICovCit1MzIgc3N0X2hzd19nZXRfZHNwX3Bvc2l0aW9uKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCit7CisJdTMyIHJwb3M7CisKKwlzc3RfZHNwX3JlYWQoaHN3LT5kc3AsICZycG9zLAorCQlzdHJlYW0tPnJlcGx5LnJlYWRfcG9zaXRpb25fcmVnaXN0ZXJfYWRkcmVzcywgc2l6ZW9mKHJwb3MpKTsKKworCXJldHVybiBycG9zOworfQorCisvKiBTdHJlYW0gcHJlc2VudGF0aW9uIChtb25vdG9uaWMpIHBvc2l0aW9ucyAqLwordTY0IHNzdF9oc3dfZ2V0X2RzcF9wcmVzZW50YXRpb25fcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKK3sKKwl1NjQgcHBvczsKKworCXNzdF9kc3BfcmVhZChoc3ctPmRzcCwgJnBwb3MsCisJCXN0cmVhbS0+cmVwbHkucHJlc2VudGF0aW9uX3Bvc2l0aW9uX3JlZ2lzdGVyX2FkZHJlc3MsCisJCXNpemVvZihwcG9zKSk7CisKKwlyZXR1cm4gcHBvczsKK30KKworLyogcGh5c2ljYWwgQkUgY29uZmlnICovCitpbnQgc3N0X2hzd19kZXZpY2Vfc2V0X2NvbmZpZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCWVudW0gc3N0X2hzd19kZXZpY2VfaWQgZGV2LCBlbnVtIHNzdF9oc3dfZGV2aWNlX21jbGsgbWNsaywKKwllbnVtIHNzdF9oc3dfZGV2aWNlX21vZGUgbW9kZSwgdTMyIGNsb2NrX2RpdmlkZXIpCit7CisJc3RydWN0IHNzdF9oc3dfaXBjX2RldmljZV9jb25maWdfcmVxIGNvbmZpZzsKKwl1MzIgaGVhZGVyOworCWludCByZXQ7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgic2V0IGRldmljZSBjb25maWciLCBkZXYpOworCisJY29uZmlnLnNzcF9pbnRlcmZhY2UgPSBkZXY7CisJY29uZmlnLmNsb2NrX2ZyZXF1ZW5jeSA9IG1jbGs7CisJY29uZmlnLm1vZGUgPSBtb2RlOworCWNvbmZpZy5jbG9ja19kaXZpZGVyID0gY2xvY2tfZGl2aWRlcjsKKwlpZiAobW9kZSA9PSBTU1RfSFNXX0RFVklDRV9URE1fQ0xPQ0tfTUFTVEVSKQorCQljb25maWcuY2hhbm5lbHMgPSA0OworCWVsc2UKKwkJY29uZmlnLmNoYW5uZWxzID0gMjsKKworCXRyYWNlX2hzd19kZXZpY2VfY29uZmlnX3JlcSgmY29uZmlnKTsKKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX1NFVF9ERVZJQ0VfRk9STUFUUyk7CisKKwlyZXQgPSBzc3RfaXBjX3R4X21lc3NhZ2Vfd2FpdCgmaHN3LT5pcGMsIGhlYWRlciwgJmNvbmZpZywKKwkJc2l6ZW9mKGNvbmZpZyksIE5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHNldCBkZXZpY2UgZm9ybWF0cyBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcpOworCisvKiBEWCBDb25maWcgKi8KK2ludCBzc3RfaHN3X2R4X3NldF9zdGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCWVudW0gc3N0X2hzd19keF9zdGF0ZSBzdGF0ZSwgc3RydWN0IHNzdF9oc3dfaXBjX2R4X3JlcGx5ICpkeCkKK3sKKwl1MzIgaGVhZGVyLCBzdGF0ZV87CisJaW50IHJldCwgaXRlbTsKKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX0VOVEVSX0RYX1NUQVRFKTsKKwlzdGF0ZV8gPSBzdGF0ZTsKKworCXRyYWNlX2lwY19yZXF1ZXN0KCJQTSBlbnRlciBEeCBzdGF0ZSIsIHN0YXRlKTsKKworCXJldCA9IHNzdF9pcGNfdHhfbWVzc2FnZV93YWl0KCZoc3ctPmlwYywgaGVhZGVyLCAmc3RhdGVfLAorCQlzaXplb2Yoc3RhdGVfKSwgZHgsIHNpemVvZigqZHgpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiaXBjOiBlcnJvciBzZXQgZHggc3RhdGUgJWQgZmFpbGVkXG4iLCBzdGF0ZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJZm9yIChpdGVtID0gMDsgaXRlbSA8IGR4LT5lbnRyaWVzX25vOyBpdGVtKyspIHsKKwkJZGV2X2RiZyhoc3ctPmRldiwKKwkJCSJJdGVtWyVkXSBvZmZzZXRbJXhdIC0gc2l6ZVsleF0gLSBzb3VyY2VbJXhdXG4iLAorCQkJaXRlbSwgZHgtPm1lbV9pbmZvW2l0ZW1dLm9mZnNldCwKKwkJCWR4LT5tZW1faW5mb1tpdGVtXS5zaXplLAorCQkJZHgtPm1lbV9pbmZvW2l0ZW1dLnNvdXJjZSk7CisJfQorCWRldl9kYmcoaHN3LT5kZXYsICJpcGM6IGdvdCAlZCBlbnRyeSBudW1iZXJzIGZvciBzdGF0ZSAlZFxuIiwKKwkJZHgtPmVudHJpZXNfbm8sIHN0YXRlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnNzdF9oc3dfcnVudGltZV9tb2R1bGVfY3JlYXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJaW50IG1vZF9pZCwgaW50IG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gaHN3LT5kc3A7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZTsKKwlzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lOworCWludCBlcnI7CisKKwltb2R1bGUgPSBzc3RfbW9kdWxlX2dldF9mcm9tX2lkKGRzcCwgbW9kX2lkKTsKKwlpZiAobW9kdWxlID09IE5VTEwpIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gZ2V0IG1vZHVsZSAlZCBmb3IgcGNtXG4iLAorCQkJbW9kX2lkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcnVudGltZSA9IHNzdF9tb2R1bGVfcnVudGltZV9uZXcobW9kdWxlLCBtb2RfaWQsIE5VTEwpOworCWlmIChydW50aW1lID09IE5VTEwpIHsKKwkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gY3JlYXRlIG1vZHVsZSAlZCBydW50aW1lXG4iLAorCQkJbW9kX2lkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZXJyID0gc3N0X21vZHVsZV9ydW50aW1lX2FsbG9jX2Jsb2NrcyhydW50aW1lLCBvZmZzZXQpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGFsbG9jIGJsb2NrcyBmb3IgbW9kdWxlICVkIHJ1bnRpbWVcbiIsCisJCQltb2RfaWQpOworCQlzc3RfbW9kdWxlX3J1bnRpbWVfZnJlZShydW50aW1lKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJZGV2X2RiZyhkc3AtPmRldiwgInJ1bnRpbWUgaWQgJWQgY3JlYXRlZCBmb3IgbW9kdWxlICVkXG4iLCBydW50aW1lLT5pZCwKKwkJbW9kX2lkKTsKKwlyZXR1cm4gcnVudGltZTsKK30KKwordm9pZCBzc3RfaHN3X3J1bnRpbWVfbW9kdWxlX2ZyZWUoc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZSkKK3sKKwlzc3RfbW9kdWxlX3J1bnRpbWVfZnJlZV9ibG9ja3MocnVudGltZSk7CisJc3N0X21vZHVsZV9ydW50aW1lX2ZyZWUocnVudGltZSk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgc3N0X2hzd19keF9zdGF0ZV9kdW1wKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGhzdy0+ZHNwOworCXUzMiBpdGVtLCBvZmZzZXQsIHNpemU7CisJaW50IHJldCA9IDA7CisKKwl0cmFjZV9pcGNfcmVxdWVzdCgiUE0gc3RhdGUgZHVtcC4gSXRlbXMgIyIsIFNTVF9IU1dfTUFYX0RYX1JFR0lPTlMpOworCisJaWYgKGhzdy0+ZHguZW50cmllc19ubyA+IFNTVF9IU1dfTUFYX0RYX1JFR0lPTlMpIHsKKwkJZGV2X2Vycihoc3ctPmRldiwKKwkJCSJlcnJvcjogbnVtYmVyIG9mIEZXIGNvbnRleHQgcmVnaW9ucyBncmVhdGVyIHRoYW4gJWRcbiIsCisJCQlTU1RfSFNXX01BWF9EWF9SRUdJT05TKTsKKwkJbWVtc2V0KCZoc3ctPmR4LCAwLCBzaXplb2YoaHN3LT5keCkpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBzc3RfZHNwX2RtYV9nZXRfY2hhbm5lbChzc3QsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogY2FudCBhbGxvY2F0ZSBkbWEgY2hhbm5lbCAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBzZXQgb24tZGVtb25kIG1vZGUgb24gZW5naW5lIDAgY2hhbm5lbCAzICovCisJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKHNzdCwgU1NUX0hNREMsCisJCQlTU1RfSE1EQ19IRERBX0UwX0FMTENIIHwgU1NUX0hNRENfSEREQV9FMV9BTExDSCwKKwkJCVNTVF9ITURDX0hEREFfRTBfQUxMQ0ggfCBTU1RfSE1EQ19IRERBX0UxX0FMTENIKTsKKworCWZvciAoaXRlbSA9IDA7IGl0ZW0gPCBoc3ctPmR4LmVudHJpZXNfbm87IGl0ZW0rKykgeworCQlpZiAoaHN3LT5keC5tZW1faW5mb1tpdGVtXS5zb3VyY2UgPT0gU1NUX0hTV19EWF9UWVBFX01FTU9SWV9EVU1QCisJCQkmJiBoc3ctPmR4Lm1lbV9pbmZvW2l0ZW1dLm9mZnNldCA+IERTUF9EUkFNX0FERFJfT0ZGU0VUCisJCQkmJiBoc3ctPmR4Lm1lbV9pbmZvW2l0ZW1dLm9mZnNldCA8CisJCQlEU1BfRFJBTV9BRERSX09GRlNFVCArIFNTVF9IU1dfRFhfQ09OVEVYVF9TSVpFKSB7CisKKwkJCW9mZnNldCA9IGhzdy0+ZHgubWVtX2luZm9baXRlbV0ub2Zmc2V0CisJCQkJCS0gRFNQX0RSQU1fQUREUl9PRkZTRVQ7CisJCQlzaXplID0gKGhzdy0+ZHgubWVtX2luZm9baXRlbV0uc2l6ZSArIDMpICYgKH4zKTsKKworCQkJcmV0ID0gc3N0X2RzcF9kbWFfY29weWZyb20oc3N0LCBoc3ctPmR4X2NvbnRleHRfcGFkZHIgKyBvZmZzZXQsCisJCQkJc3N0LT5hZGRyLmxwZV9iYXNlICsgb2Zmc2V0LCBzaXplKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2Vycihoc3ctPmRldiwKKwkJCQkJImVycm9yOiBGVyBjb250ZXh0IGR1bXAgZmFpbGVkXG4iKTsKKwkJCQltZW1zZXQoJmhzdy0+ZHgsIDAsIHNpemVvZihoc3ctPmR4KSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKK291dDoKKwlzc3RfZHNwX2RtYV9wdXRfY2hhbm5lbChzc3QpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3N0X2hzd19keF9zdGF0ZV9yZXN0b3JlKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGhzdy0+ZHNwOworCXUzMiBpdGVtLCBvZmZzZXQsIHNpemU7CisJaW50IHJldDsKKworCWZvciAoaXRlbSA9IDA7IGl0ZW0gPCBoc3ctPmR4LmVudHJpZXNfbm87IGl0ZW0rKykgeworCQlpZiAoaHN3LT5keC5tZW1faW5mb1tpdGVtXS5zb3VyY2UgPT0gU1NUX0hTV19EWF9UWVBFX01FTU9SWV9EVU1QCisJCQkmJiBoc3ctPmR4Lm1lbV9pbmZvW2l0ZW1dLm9mZnNldCA+IERTUF9EUkFNX0FERFJfT0ZGU0VUCisJCQkmJiBoc3ctPmR4Lm1lbV9pbmZvW2l0ZW1dLm9mZnNldCA8CisJCQlEU1BfRFJBTV9BRERSX09GRlNFVCArIFNTVF9IU1dfRFhfQ09OVEVYVF9TSVpFKSB7CisKKwkJCW9mZnNldCA9IGhzdy0+ZHgubWVtX2luZm9baXRlbV0ub2Zmc2V0CisJCQkJCS0gRFNQX0RSQU1fQUREUl9PRkZTRVQ7CisJCQlzaXplID0gKGhzdy0+ZHgubWVtX2luZm9baXRlbV0uc2l6ZSArIDMpICYgKH4zKTsKKworCQkJcmV0ID0gc3N0X2RzcF9kbWFfY29weXRvKHNzdCwgc3N0LT5hZGRyLmxwZV9iYXNlICsgb2Zmc2V0LAorCQkJCWhzdy0+ZHhfY29udGV4dF9wYWRkciArIG9mZnNldCwgc2l6ZSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoaHN3LT5kZXYsCisJCQkJCSJlcnJvcjogRlcgY29udGV4dCByZXN0b3JlIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19kc3BfbG9hZChzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQoreworCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBoc3ctPmRzcDsKKwlzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncsICp0OworCWludCByZXQ7CisKKwlkZXZfZGJnKGhzdy0+ZGV2LCAibG9hZGluZyBhdWRpbyBEU1AuLi4uIik7CisKKwlyZXQgPSBzc3RfZHNwX3dha2UoZHNwKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byB3YWtlIGF1ZGlvIERTUFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldCA9IHNzdF9kc3BfZG1hX2dldF9jaGFubmVsKGRzcCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBjYW50IGFsbG9jYXRlIGRtYSBjaGFubmVsICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9yZXZlcnNlKHNzdF9mdywgdCwgJmRzcC0+ZndfbGlzdCwgbGlzdCkgeworCQlyZXQgPSBzc3RfZndfcmVsb2FkKHNzdF9mdyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IFNTVCBGVyByZWxvYWQgZmFpbGVkXG4iKTsKKwkJCXNzdF9kc3BfZG1hX3B1dF9jaGFubmVsKGRzcCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlyZXQgPSBzc3RfYmxvY2tfYWxsb2Nfc2NyYXRjaChoc3ctPmRzcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3N0X2RzcF9kbWFfcHV0X2NoYW5uZWwoZHNwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc3RfaHN3X2RzcF9yZXN0b3JlKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IGhzdy0+ZHNwOworCWludCByZXQ7CisKKwlkZXZfZGJnKGhzdy0+ZGV2LCAicmVzdG9yaW5nIGF1ZGlvIERTUC4uLi4iKTsKKworCXJldCA9IHNzdF9kc3BfZG1hX2dldF9jaGFubmVsKGRzcCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBjYW50IGFsbG9jYXRlIGRtYSBjaGFubmVsICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHNzdF9oc3dfZHhfc3RhdGVfcmVzdG9yZShoc3cpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogU1NUIEZXIGNvbnRleHQgcmVzdG9yZSBmYWlsZWRcbiIpOworCQlzc3RfZHNwX2RtYV9wdXRfY2hhbm5lbChkc3ApOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3N0X2RzcF9kbWFfcHV0X2NoYW5uZWwoZHNwKTsKKworCS8qIHdhaXQgZm9yIERTUCBib290IGNvbXBsZXRpb24gKi8KKwlzc3RfZHNwX2Jvb3QoZHNwKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBzc3RfaHN3X2RzcF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IHNzdF9oc3cgKmhzdykKK3sKKwlpbnQgcmV0OworCisJZGV2X2RiZyhoc3ctPmRldiwgImF1ZGlvIGRzcCBydW50aW1lIHN1c3BlbmRcbiIpOworCisJcmV0ID0gc3N0X2hzd19keF9zZXRfc3RhdGUoaHN3LCBTU1RfSFNXX0RYX1NUQVRFX0QzLCAmaHN3LT5keCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzc3RfZHNwX3N0YWxsKGhzdy0+ZHNwKTsKKworCXJldCA9IHNzdF9oc3dfZHhfc3RhdGVfZHVtcChoc3cpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJc3N0X2lwY19kcm9wX2FsbCgmaHN3LT5pcGMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X2RzcF9ydW50aW1lX3NsZWVwKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJc3RydWN0IHNzdF9mdyAqc3N0X2Z3LCAqdDsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gaHN3LT5kc3A7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3N0X2Z3LCB0LCAmZHNwLT5md19saXN0LCBsaXN0KSB7CisJCXNzdF9md191bmxvYWQoc3N0X2Z3KTsKKwl9CisJc3N0X2Jsb2NrX2ZyZWVfc2NyYXRjaChkc3ApOworCisJaHN3LT5ib290X2NvbXBsZXRlID0gZmFsc2U7CisKKwlzc3RfZHNwX3NsZWVwKGRzcCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNzdF9oc3dfZHNwX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaHN3LT5kZXY7CisJaW50IHJldDsKKworCWRldl9kYmcoZGV2LCAiYXVkaW8gZHNwIHJ1bnRpbWUgcmVzdW1lXG4iKTsKKworCWlmIChoc3ctPmJvb3RfY29tcGxldGUpCisJCXJldHVybiAxOyAvKiB0ZWxsIGNhbGxlciBubyBhY3Rpb24gaXMgcmVxdWlyZWQgKi8KKworCXJldCA9IHNzdF9oc3dfZHNwX3Jlc3RvcmUoaHN3KTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihkZXYsICJlcnJvcjogYXVkaW8gRFNQIGJvb3QgZmFpbHVyZVxuIik7CisKKwlzc3RfaHN3X2luaXRfbW9kdWxlX3N0YXRlKGhzdyk7CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaHN3LT5ib290X3dhaXQsIGhzdy0+Ym9vdF9jb21wbGV0ZSwKKwkJbXNlY3NfdG9famlmZmllcyhJUENfQk9PVF9NU0VDUykpOworCWlmIChyZXQgPT0gMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGF1ZGlvIERTUCBib290IHRpbWVvdXQgSVBDRCAweCV4IElQQ1ggMHgleFxuIiwKKwkJCXNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKGhzdy0+ZHNwLCBTU1RfSVBDRCksCisJCQlzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChoc3ctPmRzcCwgU1NUX0lQQ1gpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogU2V0IEFEU1AgU1NQIHBvcnQgc2V0dGluZ3MgKi8KKwlyZXQgPSBzc3RfaHN3X2RldmljZV9zZXRfY29uZmlnKGhzdywgU1NUX0hTV19ERVZJQ0VfU1NQXzAsCisJCQkJCVNTVF9IU1dfREVWSUNFX01DTEtfRlJFUV8yNF9NSFosCisJCQkJCVNTVF9IU1dfREVWSUNFX0NMT0NLX01BU1RFUiwgOSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGV2LCAiZXJyb3I6IFNTUCByZS1pbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdHJ1Y3Qgc3N0X2RzcCAqc3N0X2hzd19nZXRfZHNwKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJcmV0dXJuIGhzdy0+ZHNwOworfQorCit2b2lkIHNzdF9oc3dfaW5pdF9tb2R1bGVfc3RhdGUoc3RydWN0IHNzdF9oc3cgKmhzdykKK3sKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlOworCWVudW0gc3N0X2hzd19tb2R1bGVfaWQgaWQ7CisKKwkvKiB0aGUgYmFzZSBmdyBjb250YWlucyBzZXZlcmFsIG1vZHVsZXMgKi8KKwlmb3IgKGlkID0gU1NUX0hTV19NT0RVTEVfQkFTRV9GVzsgaWQgPCBTU1RfSFNXX01BWF9NT0RVTEVfSUQ7IGlkKyspIHsKKwkJbW9kdWxlID0gc3N0X21vZHVsZV9nZXRfZnJvbV9pZChoc3ctPmRzcCwgaWQpOworCQlpZiAobW9kdWxlKSB7CisJCQkvKiBtb2R1bGUgd2F2ZXMgaXMgYWN0aXZlIG9ubHkgYWZ0ZXIgYmVpbmcgZW5hYmxlZCAqLworCQkJaWYgKGlkID09IFNTVF9IU1dfTU9EVUxFX1dBVkVTKQorCQkJCW1vZHVsZS0+c3RhdGUgPSBTU1RfTU9EVUxFX1NUQVRFX0lOSVRJQUxJWkVEOworCQkJZWxzZQorCQkJCW1vZHVsZS0+c3RhdGUgPSBTU1RfTU9EVUxFX1NUQVRFX0FDVElWRTsKKwkJfQorCX0KK30KKworYm9vbCBzc3RfaHN3X2lzX21vZHVsZV9sb2FkZWQoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIG1vZHVsZV9pZCkKK3sKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlOworCisJbW9kdWxlID0gc3N0X21vZHVsZV9nZXRfZnJvbV9pZChoc3ctPmRzcCwgbW9kdWxlX2lkKTsKKwlpZiAobW9kdWxlID09IE5VTEwgfHwgbW9kdWxlLT5zdGF0ZSA9PSBTU1RfTU9EVUxFX1NUQVRFX1VOTE9BREVEKQorCQlyZXR1cm4gZmFsc2U7CisJZWxzZQorCQlyZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBzc3RfaHN3X2lzX21vZHVsZV9hY3RpdmUoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIG1vZHVsZV9pZCkKK3sKKwlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlOworCisJbW9kdWxlID0gc3N0X21vZHVsZV9nZXRfZnJvbV9pZChoc3ctPmRzcCwgbW9kdWxlX2lkKTsKKwlpZiAobW9kdWxlICE9IE5VTEwgJiYgbW9kdWxlLT5zdGF0ZSA9PSBTU1RfTU9EVUxFX1NUQVRFX0FDVElWRSkKKwkJcmV0dXJuIHRydWU7CisJZWxzZQorCQlyZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgc3N0X2hzd19zZXRfbW9kdWxlX2VuYWJsZWRfcnRkMyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgbW9kdWxlX2lkKQoreworCWhzdy0+ZW5hYmxlZF9tb2R1bGVzX3J0ZDMgfD0gKDEgPDwgbW9kdWxlX2lkKTsKK30KKwordm9pZCBzc3RfaHN3X3NldF9tb2R1bGVfZGlzYWJsZWRfcnRkMyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgbW9kdWxlX2lkKQoreworCWhzdy0+ZW5hYmxlZF9tb2R1bGVzX3J0ZDMgJj0gfigxIDw8IG1vZHVsZV9pZCk7Cit9CisKK2Jvb2wgc3N0X2hzd19pc19tb2R1bGVfZW5hYmxlZF9ydGQzKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBtb2R1bGVfaWQpCit7CisJcmV0dXJuIGhzdy0+ZW5hYmxlZF9tb2R1bGVzX3J0ZDMgJiAoMSA8PCBtb2R1bGVfaWQpOworfQorCit2b2lkIHNzdF9oc3dfcmVzZXRfcGFyYW1fYnVmKHN0cnVjdCBzc3RfaHN3ICpoc3cpCit7CisJaHN3LT5wYXJhbV9pZHhfdyA9IDA7CisJaHN3LT5wYXJhbV9pZHhfciA9IDA7CisJbWVtc2V0KCh2b2lkICopaHN3LT5wYXJhbV9idWYsIDAsIHNpemVvZihoc3ctPnBhcmFtX2J1ZikpOworfQorCitpbnQgc3N0X2hzd19zdG9yZV9wYXJhbV9saW5lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHU4ICpidWYpCit7CisJLyogc2F2ZSBsaW5lIHRvIHRoZSBmaXJzdCBhdmFpbGFibGUgcG9zaXRpb24gb2YgcGFyYW0gYnVmZmVyICovCisJaWYgKGhzdy0+cGFyYW1faWR4X3cgPiBXQVZFU19QQVJBTV9MSU5FUyAtIDEpIHsKKwkJZGV2X3dhcm4oaHN3LT5kZXYsICJ3YXJuaW5nOiBwYXJhbSBidWZmZXIgb3ZlcmZsb3chXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisJbWVtY3B5KGhzdy0+cGFyYW1fYnVmW2hzdy0+cGFyYW1faWR4X3ddLCBidWYsIFdBVkVTX1BBUkFNX0NPVU5UKTsKKwloc3ctPnBhcmFtX2lkeF93Kys7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X2xvYWRfcGFyYW1fbGluZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1OCAqYnVmKQoreworCXU4IGlkID0gMDsKKworCS8qIHJlYWQgdGhlIGZpcnN0IG1hdGNoaW5nIGxpbmUgZnJvbSBwYXJhbSBidWZmZXIgKi8KKwl3aGlsZSAoaHN3LT5wYXJhbV9pZHhfciA8IFdBVkVTX1BBUkFNX0xJTkVTKSB7CisJCWlkID0gaHN3LT5wYXJhbV9idWZbaHN3LT5wYXJhbV9pZHhfcl1bMF07CisJCWhzdy0+cGFyYW1faWR4X3IrKzsKKwkJaWYgKGJ1ZlswXSA9PSBpZCkgeworCQkJbWVtY3B5KGJ1ZiwgaHN3LT5wYXJhbV9idWZbaHN3LT5wYXJhbV9pZHhfcl0sCisJCQkJV0FWRVNfUEFSQU1fQ09VTlQpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGhzdy0+cGFyYW1faWR4X3IgPiBXQVZFU19QQVJBTV9MSU5FUyAtIDEpIHsKKwkJZGV2X2RiZyhoc3ctPmRldiwgImVuZCBvZiBidWZmZXIsIHJvbGwgdG8gdGhlIGJlZ2lubmluZ1xuIik7CisJCWhzdy0+cGFyYW1faWR4X3IgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBzc3RfaHN3X2xhdW5jaF9wYXJhbV9idWYoc3RydWN0IHNzdF9oc3cgKmhzdykKK3sKKwlpbnQgcmV0LCBpZHg7CisKKwlpZiAoIXNzdF9oc3dfaXNfbW9kdWxlX2FjdGl2ZShoc3csIFNTVF9IU1dfTU9EVUxFX1dBVkVTKSkgeworCQlkZXZfZGJnKGhzdy0+ZGV2LCAibW9kdWxlIHdhdmVzIGlzIG5vdCBhY3RpdmVcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBwdXQgYWxsIHBhcmFtIGxpbmVzIHRvIERTUCB0aHJvdWdoIGlwYyAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgaHN3LT5wYXJhbV9pZHhfdzsgaWR4KyspIHsKKwkJcmV0ID0gc3N0X2hzd19tb2R1bGVfc2V0X3BhcmFtKGhzdywKKwkJCVNTVF9IU1dfTU9EVUxFX1dBVkVTLCAwLCBoc3ctPnBhcmFtX2J1ZltpZHhdWzBdLAorCQkJV0FWRVNfUEFSQU1fQ09VTlQsIGhzdy0+cGFyYW1fYnVmW2lkeF0pOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitpbnQgc3N0X2hzd19tb2R1bGVfbG9hZChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXUzMiBtb2R1bGVfaWQsIHUzMiBpbnN0YW5jZV9pZCwgY2hhciAqbmFtZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3ID0gTlVMTDsKKwlzdHJ1Y3Qgc3N0X2Z3ICpoc3dfc3N0X2Z3OworCXN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaHN3LT5kZXY7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IGhzdy0+ZHNwOworCisJZGV2X2RiZyhkZXYsICJzc3RfaHN3X21vZHVsZV9sb2FkIGlkPSVkLCBuYW1lPSclcyciLCBtb2R1bGVfaWQsIG5hbWUpOworCisJbW9kdWxlID0gc3N0X21vZHVsZV9nZXRfZnJvbV9pZChkc3AsIG1vZHVsZV9pZCk7CisJaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisJCS8qIGxvYWRpbmcgZm9yIHRoZSBmaXJzdCB0aW1lICovCisJCWlmIChtb2R1bGVfaWQgPT0gU1NUX0hTV19NT0RVTEVfQkFTRV9GVykgeworCQkJLyogZm9yIGJhc2UgbW9kdWxlOiB1c2UgZncgcmVxdWVzdGVkIGluIGFjcGkgcHJvYmUgKi8KKwkJCWZ3ID0gZHNwLT5wZGF0YS0+Znc7CisJCQlpZiAoIWZ3KSB7CisJCQkJZGV2X2VycihkZXYsICJyZXF1ZXN0IEJhc2UgZncgZmFpbGVkXG4iKTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHRyeSBhbmQgbG9hZCBhbnkgb3RoZXIgb3B0aW9uYWwgbW9kdWxlcyBpZiB0aGV5IGFyZQorCQkJICogYXZhaWxhYmxlLiBVc2UgZGV2X2luZm8gaW5zdGVhZCBvZiBkZXZfZXJyIGluIGNhc2UKKwkJCSAqIHJlcXVlc3QgZmlybXdhcmUgZmFpbGVkICovCisJCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgbmFtZSwgZGV2KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfaW5mbyhkZXYsICJmdyBpbWFnZSAlcyBub3QgYXZhaWxhYmxlKCVkKVxuIiwKKwkJCQkJCW5hbWUsIHJldCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQloc3dfc3N0X2Z3ID0gc3N0X2Z3X25ldyhkc3AsIGZ3LCBoc3cpOworCQlpZiAoaHN3X3NzdF9mdyAgPT0gTlVMTCkgeworCQkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIGxvYWQgZmlybXdhcmVcbiIpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1vZHVsZSA9IHNzdF9tb2R1bGVfZ2V0X2Zyb21faWQoZHNwLCBtb2R1bGVfaWQpOworCQlpZiAobW9kdWxlID09IE5VTEwpIHsKKwkJCWRldl9lcnIoZGV2LCAiZXJyb3I6IG5vIG1vZHVsZSAlZCBpbiBmaXJtd2FyZSAlc1xuIiwKKwkJCQkJbW9kdWxlX2lkLCBuYW1lKTsKKwkJfQorCX0gZWxzZQorCQlkZXZfaW5mbyhkZXYsICJtb2R1bGUgJWQgKCVzKSBhbHJlYWR5IGxvYWRlZFxuIiwKKwkJCQltb2R1bGVfaWQsIG5hbWUpOworb3V0OgorCS8qIHJlbGVhc2UgZncsIGJ1dCBiYXNlIGZ3IHNob3VsZCBiZSByZWxlYXNlZCBieSBhY3BpIGRyaXZlciAqLworCWlmIChmdyAmJiBtb2R1bGVfaWQgIT0gU1NUX0hTV19NT0RVTEVfQkFTRV9GVykKKwkJcmVsZWFzZV9maXJtd2FyZShmdyk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQgc3N0X2hzd19tb2R1bGVfZW5hYmxlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJdTMyIG1vZHVsZV9pZCwgdTMyIGluc3RhbmNlX2lkKQoreworCWludCByZXQ7CisJdTMyIGhlYWRlciA9IDA7CisJc3RydWN0IHNzdF9oc3dfaXBjX21vZHVsZV9jb25maWcgY29uZmlnOworCXN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGU7CisJc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoc3ctPmRldjsKKwlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gaHN3LT5kc3A7CisKKwlpZiAoIXNzdF9oc3dfaXNfbW9kdWxlX2xvYWRlZChoc3csIG1vZHVsZV9pZCkpIHsKKwkJZGV2X2RiZyhkZXYsICJtb2R1bGUgJWQgbm90IGxvYWRlZFxuIiwgbW9kdWxlX2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHNzdF9oc3dfaXNfbW9kdWxlX2FjdGl2ZShoc3csIG1vZHVsZV9pZCkpIHsKKwkJZGV2X2luZm8oZGV2LCAibW9kdWxlICVkIGFscmVhZHkgZW5hYmxlZFxuIiwgbW9kdWxlX2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbW9kdWxlID0gc3N0X21vZHVsZV9nZXRfZnJvbV9pZChkc3AsIG1vZHVsZV9pZCk7CisJaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAibW9kdWxlICVkIG5vdCB2YWxpZFxuIiwgbW9kdWxlX2lkKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlydW50aW1lID0gc3N0X21vZHVsZV9ydW50aW1lX2dldF9mcm9tX2lkKG1vZHVsZSwgbW9kdWxlX2lkKTsKKwlpZiAocnVudGltZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAicnVudGltZSAlZCBub3QgdmFsaWQiLCBtb2R1bGVfaWQpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX01PRFVMRV9PUEVSQVRJT04pIHwKKwkJCUlQQ19NT0RVTEVfT1BFUkFUSU9OKElQQ19NT0RVTEVfRU5BQkxFKSB8CisJCQlJUENfTU9EVUxFX0lEKG1vZHVsZV9pZCk7CisJZGV2X2RiZyhkZXYsICJtb2R1bGUgZW5hYmxlIGhlYWRlcjogJXhcbiIsIGhlYWRlcik7CisKKwljb25maWcubWFwLm1vZHVsZV9lbnRyaWVzX2NvdW50ID0gMTsKKwljb25maWcubWFwLm1vZHVsZV9lbnRyaWVzWzBdLm1vZHVsZV9pZCA9IG1vZHVsZS0+aWQ7CisJY29uZmlnLm1hcC5tb2R1bGVfZW50cmllc1swXS5lbnRyeV9wb2ludCA9IG1vZHVsZS0+ZW50cnk7CisKKwljb25maWcucGVyc2lzdGVudF9tZW0ub2Zmc2V0ID0KKwkJc3N0X2RzcF9nZXRfb2Zmc2V0KGRzcCwKKwkJCXJ1bnRpbWUtPnBlcnNpc3RlbnRfb2Zmc2V0LCBTU1RfTUVNX0RSQU0pOworCWNvbmZpZy5wZXJzaXN0ZW50X21lbS5zaXplID0gbW9kdWxlLT5wZXJzaXN0ZW50X3NpemU7CisKKwljb25maWcuc2NyYXRjaF9tZW0ub2Zmc2V0ID0KKwkJc3N0X2RzcF9nZXRfb2Zmc2V0KGRzcCwKKwkJCWRzcC0+c2NyYXRjaF9vZmZzZXQsIFNTVF9NRU1fRFJBTSk7CisJY29uZmlnLnNjcmF0Y2hfbWVtLnNpemUgPSBtb2R1bGUtPnNjcmF0Y2hfc2l6ZTsKKwlkZXZfZGJnKGRldiwgIm1vZCAlZCBlbmFibGUgcDolZCBAICV4LCBzOiVkIEAgJXgsIGVwOiAleCIsCisJCWNvbmZpZy5tYXAubW9kdWxlX2VudHJpZXNbMF0ubW9kdWxlX2lkLAorCQljb25maWcucGVyc2lzdGVudF9tZW0uc2l6ZSwKKwkJY29uZmlnLnBlcnNpc3RlbnRfbWVtLm9mZnNldCwKKwkJY29uZmlnLnNjcmF0Y2hfbWVtLnNpemUsIGNvbmZpZy5zY3JhdGNoX21lbS5vZmZzZXQsCisJCWNvbmZpZy5tYXAubW9kdWxlX2VudHJpZXNbMF0uZW50cnlfcG9pbnQpOworCisJcmV0ID0gc3N0X2lwY190eF9tZXNzYWdlX3dhaXQoJmhzdy0+aXBjLCBoZWFkZXIsCisJCQkmY29uZmlnLCBzaXplb2YoY29uZmlnKSwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGV2LCAiaXBjOiBtb2R1bGUgZW5hYmxlIGZhaWxlZCAtICVkXG4iLCByZXQpOworCWVsc2UKKwkJbW9kdWxlLT5zdGF0ZSA9IFNTVF9NT0RVTEVfU1RBVEVfQUNUSVZFOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHNzdF9oc3dfbW9kdWxlX2Rpc2FibGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwl1MzIgbW9kdWxlX2lkLCB1MzIgaW5zdGFuY2VfaWQpCit7CisJaW50IHJldDsKKwl1MzIgaGVhZGVyOworCXN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaHN3LT5kZXY7CisJc3RydWN0IHNzdF9kc3AgKmRzcCA9IGhzdy0+ZHNwOworCisJaWYgKCFzc3RfaHN3X2lzX21vZHVsZV9sb2FkZWQoaHN3LCBtb2R1bGVfaWQpKSB7CisJCWRldl9kYmcoZGV2LCAibW9kdWxlICVkIG5vdCBsb2FkZWRcbiIsIG1vZHVsZV9pZCk7CisJCXJldHVybiAwOworCX0KKworCWlmICghc3N0X2hzd19pc19tb2R1bGVfYWN0aXZlKGhzdywgbW9kdWxlX2lkKSkgeworCQlkZXZfaW5mbyhkZXYsICJtb2R1bGUgJWQgYWxyZWFkeSBkaXNhYmxlZFxuIiwgbW9kdWxlX2lkKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbW9kdWxlID0gc3N0X21vZHVsZV9nZXRfZnJvbV9pZChkc3AsIG1vZHVsZV9pZCk7CisJaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAibW9kdWxlICVkIG5vdCB2YWxpZFxuIiwgbW9kdWxlX2lkKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9NT0RVTEVfT1BFUkFUSU9OKSB8CisJCQlJUENfTU9EVUxFX09QRVJBVElPTihJUENfTU9EVUxFX0RJU0FCTEUpIHwKKwkJCUlQQ19NT0RVTEVfSUQobW9kdWxlX2lkKTsKKworCXJldCA9IHNzdF9pcGNfdHhfbWVzc2FnZV93YWl0KCZoc3ctPmlwYywgaGVhZGVyLCAgTlVMTCwgMCwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoZGV2LCAibW9kdWxlIGRpc2FibGUgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisJZWxzZQorCQltb2R1bGUtPnN0YXRlID0gU1NUX01PRFVMRV9TVEFURV9JTklUSUFMSVpFRDsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBzc3RfaHN3X21vZHVsZV9zZXRfcGFyYW0oc3RydWN0IHNzdF9oc3cgKmhzdywKKwl1MzIgbW9kdWxlX2lkLCB1MzIgaW5zdGFuY2VfaWQsIHUzMiBwYXJhbWV0ZXJfaWQsCisJdTMyIHBhcmFtX3NpemUsIGNoYXIgKnBhcmFtKQoreworCWludCByZXQ7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IE5VTEw7CisJdTMyIGhlYWRlciA9IDA7CisJdTMyIHBheWxvYWRfc2l6ZSA9IDAsIHRyYW5zZmVyX3BhcmFtZXRlcl9zaXplID0gMDsKKwlkbWFfYWRkcl90IGRtYV9hZGRyID0gMDsKKwlzdHJ1Y3Qgc3N0X2hzd190cmFuc2Zlcl9wYXJhbWV0ZXIgKnBhcmFtZXRlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoc3ctPmRldjsKKworCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX01PRFVMRV9PUEVSQVRJT04pIHwKKwkJCUlQQ19NT0RVTEVfT1BFUkFUSU9OKElQQ19NT0RVTEVfU0VUX1BBUkFNRVRFUikgfAorCQkJSVBDX01PRFVMRV9JRChtb2R1bGVfaWQpOworCWRldl9kYmcoZGV2LCAic3N0X2hzd19tb2R1bGVfc2V0X3BhcmFtIGhlYWRlcj0leFxuIiwgaGVhZGVyKTsKKworCXBheWxvYWRfc2l6ZSA9IHBhcmFtX3NpemUgKworCQlzaXplb2Yoc3RydWN0IHNzdF9oc3dfdHJhbnNmZXJfcGFyYW1ldGVyKSAtCisJCXNpemVvZihzdHJ1Y3Qgc3N0X2hzd190cmFuc2Zlcl9saXN0KTsKKwlkZXZfZGJnKGRldiwgInBhcmFtZXRlciBzaXplIDogJWRcbiIsIHBhcmFtX3NpemUpOworCWRldl9kYmcoZGV2LCAicGF5bG9hZCBzaXplICAgOiAlZFxuIiwgcGF5bG9hZF9zaXplKTsKKworCWlmIChwYXlsb2FkX3NpemUgPD0gU1NUX0hTV19JUENfTUFYX1NIT1JUX1BBUkFNRVRFUl9TSVpFKSB7CisJCS8qIHNob3J0IHBhcmFtZXRlciwgbWFpbGJveCBjYW4gY29udGFpbiBkYXRhICovCisJCWRldl9kYmcoZGV2LCAidHJhbnNmZXIgcGFyYW1ldGVyIHNpemUgOiAlZFxuIiwKKwkJCXRyYW5zZmVyX3BhcmFtZXRlcl9zaXplKTsKKworCQl0cmFuc2Zlcl9wYXJhbWV0ZXJfc2l6ZSA9IEFMSUdOKHBheWxvYWRfc2l6ZSwgNCk7CisJCWRldl9kYmcoZGV2LCAidHJhbnNmZXIgcGFyYW1ldGVyIGFsaWduZWQgc2l6ZSA6ICVkXG4iLAorCQkJdHJhbnNmZXJfcGFyYW1ldGVyX3NpemUpOworCisJCXBhcmFtZXRlciA9IGt6YWxsb2ModHJhbnNmZXJfcGFyYW1ldGVyX3NpemUsIEdGUF9LRVJORUwpOworCQlpZiAocGFyYW1ldGVyID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQltZW1jcHkocGFyYW1ldGVyLT5kYXRhLCBwYXJhbSwgcGFyYW1fc2l6ZSk7CisJfSBlbHNlIHsKKwkJZGV2X3dhcm4oZGV2LCAidHJhbnNmZXIgcGFyYW1ldGVyIHNpemUgdG9vIGxhcmdlISIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwYXJhbWV0ZXItPnBhcmFtZXRlcl9pZCA9IHBhcmFtZXRlcl9pZDsKKwlwYXJhbWV0ZXItPmRhdGFfc2l6ZSA9IHBhcmFtX3NpemU7CisKKwlyZXQgPSBzc3RfaXBjX3R4X21lc3NhZ2Vfd2FpdCgmaHN3LT5pcGMsIGhlYWRlciwKKwkJcGFyYW1ldGVyLCB0cmFuc2Zlcl9wYXJhbWV0ZXJfc2l6ZSAsIE5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGRldiwgImlwYzogbW9kdWxlIHNldCBwYXJhbWV0ZXIgZmFpbGVkIC0gJWRcbiIsIHJldCk7CisKKwlrZnJlZShwYXJhbWV0ZXIpOworCisJaWYgKGRhdGEpCisJCWRtYV9mcmVlX2NvaGVyZW50KGhzdy0+ZHNwLT5kbWFfZGV2LAorCQkJcGFyYW1fc2l6ZSwgKHZvaWQgKilkYXRhLCBkbWFfYWRkcik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNzdF9kc3BfZGV2aWNlIGhzd19kZXYgPSB7CisJLnRocmVhZCA9IGhzd19pcnFfdGhyZWFkLAorCS5vcHMgPSAmaGFzd2VsbF9vcHMsCit9OworCitzdGF0aWMgdm9pZCBoc3dfdHhfbXNnKHN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYywgc3RydWN0IGlwY19tZXNzYWdlICptc2cpCit7CisJLyogc2VuZCB0aGUgbWVzc2FnZSAqLworCXNzdF9kc3Bfb3V0Ym94X3dyaXRlKGlwYy0+ZHNwLCBtc2ctPnR4X2RhdGEsIG1zZy0+dHhfc2l6ZSk7CisJc3N0X2RzcF9pcGNfbXNnX3R4KGlwYy0+ZHNwLCBtc2ctPmhlYWRlcik7Cit9CisKK3N0YXRpYyB2b2lkIGhzd19zaGltX2RiZyhzdHJ1Y3Qgc3N0X2dlbmVyaWNfaXBjICppcGMsIGNvbnN0IGNoYXIgKnRleHQpCit7CisJc3RydWN0IHNzdF9kc3AgKnNzdCA9IGlwYy0+ZHNwOworCXUzMiBpc3IsIGlwY2QsIGltcngsIGlwY3g7CisKKwlpcGN4ID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDWCk7CisJaXNyID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVNSWCk7CisJaXBjZCA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QpOworCWltcnggPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JTVJYKTsKKworCWRldl9lcnIoaXBjLT5kZXYsCisJCSJpcGM6IC0tJXMtLSBpcGN4IDB4JTguOHggaXNyIDB4JTguOHggaXBjZCAweCU4Ljh4IGltcnggMHglOC44eFxuIiwKKwkJdGV4dCwgaXBjeCwgaXNyLCBpcGNkLCBpbXJ4KTsKK30KKworc3RhdGljIHZvaWQgaHN3X3R4X2RhdGFfY29weShzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZywgY2hhciAqdHhfZGF0YSwKKwlzaXplX3QgdHhfc2l6ZSkKK3sKKwltZW1jcHkobXNnLT50eF9kYXRhLCB0eF9kYXRhLCB0eF9zaXplKTsKK30KKworc3RhdGljIHU2NCBoc3dfcmVwbHlfbXNnX21hdGNoKHU2NCBoZWFkZXIsIHU2NCAqbWFzaykKK3sKKwkvKiBjbGVhciByZXBseSBiaXRzICYgc3RhdHVzIGJpdHMgKi8KKwloZWFkZXIgJj0gfihJUENfU1RBVFVTX01BU0sgfCBJUENfR0xCX1JFUExZX01BU0spOworCSptYXNrID0gKHU2NCktMTsKKworCXJldHVybiBoZWFkZXI7Cit9CisKK2ludCBzc3RfaHN3X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCit7CisJc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3ZlcnNpb24gdmVyc2lvbjsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3OworCXN0cnVjdCBzc3RfZ2VuZXJpY19pcGMgKmlwYzsKKwlpbnQgcmV0OworCisJZGV2X2RiZyhkZXYsICJpbml0aWFsaXNpbmcgQXVkaW8gRFNQIElQQ1xuIik7CisKKwloc3cgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhzdyksIEdGUF9LRVJORUwpOworCWlmIChoc3cgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpcGMgPSAmaHN3LT5pcGM7CisJaXBjLT5kZXYgPSBkZXY7CisJaXBjLT5vcHMudHhfbXNnID0gaHN3X3R4X21zZzsKKwlpcGMtPm9wcy5zaGltX2RiZyA9IGhzd19zaGltX2RiZzsKKwlpcGMtPm9wcy50eF9kYXRhX2NvcHkgPSBoc3dfdHhfZGF0YV9jb3B5OworCWlwYy0+b3BzLnJlcGx5X21zZ19tYXRjaCA9IGhzd19yZXBseV9tc2dfbWF0Y2g7CisKKwlyZXQgPSBzc3RfaXBjX2luaXQoaXBjKTsKKwlpZiAocmV0ICE9IDApCisJCWdvdG8gaXBjX2luaXRfZXJyOworCisJSU5JVF9MSVNUX0hFQUQoJmhzdy0+c3RyZWFtX2xpc3QpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhzdy0+Ym9vdF93YWl0KTsKKwloc3dfZGV2LnRocmVhZF9jb250ZXh0ID0gaHN3OworCisJLyogaW5pdCBTU1Qgc2hpbSAqLworCWhzdy0+ZHNwID0gc3N0X2RzcF9uZXcoZGV2LCAmaHN3X2RldiwgcGRhdGEpOworCWlmIChoc3ctPmRzcCA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZHNwX25ld19lcnI7CisJfQorCisJaXBjLT5kc3AgPSBoc3ctPmRzcDsKKworCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgZm9yIGNvbnRleHQgc3RvcmFnZSAqLworCWhzdy0+ZHhfY29udGV4dCA9IGRtYV9hbGxvY19jb2hlcmVudChoc3ctPmRzcC0+ZG1hX2RldiwKKwkJU1NUX0hTV19EWF9DT05URVhUX1NJWkUsICZoc3ctPmR4X2NvbnRleHRfcGFkZHIsIEdGUF9LRVJORUwpOworCWlmIChoc3ctPmR4X2NvbnRleHQgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRtYV9lcnI7CisJfQorCisJLyoga2VlcCB0aGUgRFNQIGluIHJlc2V0IHN0YXRlIGZvciBiYXNlIEZXIGxvYWRpbmcgKi8KKwlzc3RfZHNwX3Jlc2V0KGhzdy0+ZHNwKTsKKworCS8qIGxvYWQgYmFzZSBtb2R1bGUgYW5kIG90aGVyIG1vZHVsZXMgaW4gYmFzZSBmaXJtd2FyZSBpbWFnZSAqLworCXJldCA9IHNzdF9oc3dfbW9kdWxlX2xvYWQoaHN3LCBTU1RfSFNXX01PRFVMRV9CQVNFX0ZXLCAwLCAiQmFzZSIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGZ3X2VycjsKKworCS8qIHRyeSB0byBsb2FkIG1vZHVsZSB3YXZlcyAqLworCXNzdF9oc3dfbW9kdWxlX2xvYWQoaHN3LCBTU1RfSFNXX01PRFVMRV9XQVZFUywgMCwgImludGVsL0ludGNQUDAxLmJpbiIpOworCisJLyogYWxsb2NhdGUgc2NyYXRjaCBtZW0gcmVnaW9ucyAqLworCXJldCA9IHNzdF9ibG9ja19hbGxvY19zY3JhdGNoKGhzdy0+ZHNwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBib290X2VycjsKKworCS8qIGluaXQgcGFyYW0gYnVmZmVyICovCisJc3N0X2hzd19yZXNldF9wYXJhbV9idWYoaHN3KTsKKworCS8qIHdhaXQgZm9yIERTUCBib290IGNvbXBsZXRpb24gKi8KKwlzc3RfZHNwX2Jvb3QoaHN3LT5kc3ApOworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChoc3ctPmJvb3Rfd2FpdCwgaHN3LT5ib290X2NvbXBsZXRlLAorCQltc2Vjc190b19qaWZmaWVzKElQQ19CT09UX01TRUNTKSk7CisJaWYgKHJldCA9PSAwKSB7CisJCXJldCA9IC1FSU87CisJCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogYXVkaW8gRFNQIGJvb3QgdGltZW91dCBJUENEIDB4JXggSVBDWCAweCV4XG4iLAorCQkJc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoaHN3LT5kc3AsIFNTVF9JUENEKSwKKwkJCXNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKGhzdy0+ZHNwLCBTU1RfSVBDWCkpOworCQlnb3RvIGJvb3RfZXJyOworCX0KKworCS8qIGluaXQgbW9kdWxlIHN0YXRlIGFmdGVyIGJvb3QgKi8KKwlzc3RfaHN3X2luaXRfbW9kdWxlX3N0YXRlKGhzdyk7CisKKwkvKiBnZXQgdGhlIEZXIHZlcnNpb24gKi8KKwlzc3RfaHN3X2Z3X2dldF92ZXJzaW9uKGhzdywgJnZlcnNpb24pOworCisJLyogZ2V0IHRoZSBnbG9iYWxtaXhlciAqLworCXJldCA9IHNzdF9oc3dfbWl4ZXJfZ2V0X2luZm8oaHN3KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBnZXQgc3RyZWFtIGluZm9cbiIpOworCQlnb3RvIGJvb3RfZXJyOworCX0KKworCXBkYXRhLT5kc3AgPSBoc3c7CisJcmV0dXJuIDA7CisKK2Jvb3RfZXJyOgorCXNzdF9kc3BfcmVzZXQoaHN3LT5kc3ApOworCXNzdF9md19mcmVlX2FsbChoc3ctPmRzcCk7Citmd19lcnI6CisJZG1hX2ZyZWVfY29oZXJlbnQoaHN3LT5kc3AtPmRtYV9kZXYsIFNTVF9IU1dfRFhfQ09OVEVYVF9TSVpFLAorCQkJaHN3LT5keF9jb250ZXh0LCBoc3ctPmR4X2NvbnRleHRfcGFkZHIpOworZG1hX2VycjoKKwlzc3RfZHNwX2ZyZWUoaHN3LT5kc3ApOworZHNwX25ld19lcnI6CisJc3N0X2lwY19maW5pKGlwYyk7CitpcGNfaW5pdF9lcnI6CisJa2ZyZWUoaHN3KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2hzd19kc3BfaW5pdCk7CisKK3ZvaWQgc3N0X2hzd19kc3BfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+ZHNwOworCisJc3N0X2RzcF9yZXNldChoc3ctPmRzcCk7CisJc3N0X2Z3X2ZyZWVfYWxsKGhzdy0+ZHNwKTsKKwlkbWFfZnJlZV9jb2hlcmVudChoc3ctPmRzcC0+ZG1hX2RldiwgU1NUX0hTV19EWF9DT05URVhUX1NJWkUsCisJCQloc3ctPmR4X2NvbnRleHQsIGhzdy0+ZHhfY29udGV4dF9wYWRkcik7CisJc3N0X2RzcF9mcmVlKGhzdy0+ZHNwKTsKKwlzc3RfaXBjX2ZpbmkoJmhzdy0+aXBjKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNzdF9oc3dfZHNwX2ZyZWUpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL2hhc3dlbGwvc3N0LWhhc3dlbGwtaXBjLmggYi9zb3VuZC9zb2MvaW50ZWwvaGFzd2VsbC9zc3QtaGFzd2VsbC1pcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQ3MWFlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL2ludGVsL2hhc3dlbGwvc3N0LWhhc3dlbGwtaXBjLmgKQEAgLTAsMCArMSw1MzQgQEAKKy8qCisgKiBJbnRlbCBTU1QgSGFzd2VsbC9Ccm9hZHdlbGwgSVBDIFN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2lmbmRlZiBfX1NTVF9IQVNXRUxMX0lQQ19ICisjZGVmaW5lIF9fU1NUX0hBU1dFTExfSVBDX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvYXNvdW5kLmg+CisKKyNkZWZpbmUgU1NUX0hTV19OT19DSEFOTkVMUwkJNAorI2RlZmluZSBTU1RfSFNXX01BWF9EWF9SRUdJT05TCQkxNAorI2RlZmluZSBTU1RfSFNXX0RYX0NPTlRFWFRfU0laRSAgICAgICAgKDY0MCAqIDEwMjQpCisjZGVmaW5lIFNTVF9IU1dfQ0hBTk5FTFNfQUxMCQkweGZmZmZmZmZmCisKKyNkZWZpbmUgU1NUX0hTV19GV19MT0dfQ09ORklHX0RXT1JEUwkxMgorI2RlZmluZSBTU1RfSFNXX0dMT0JBTF9MT0cJCTE1CisKKy8qKgorICogVXBmcm9udCBkZWZpbmVkIG1heGltdW0gbWVzc2FnZSBzaXplIHRoYXQgaXMKKyAqIGV4cGVjdGVkIGJ5IHRoZSBpbi9vdXQgY29tbXVuaWNhdGlvbiBwaXBlcyBpbiBGVy4KKyAqLworI2RlZmluZSBTU1RfSFNXX0lQQ19NQVhfUEFZTE9BRF9TSVpFCTQwMAorI2RlZmluZSBTU1RfSFNXX01BWF9JTkZPX1NJWkUJCTY0CisjZGVmaW5lIFNTVF9IU1dfQlVJTERfSEFTSF9MRU5HVEgJNDAKKyNkZWZpbmUgU1NUX0hTV19JUENfTUFYX1NIT1JUX1BBUkFNRVRFUl9TSVpFCTUwMAorI2RlZmluZSBXQVZFU19QQVJBTV9DT1VOVAkJMTI4CisjZGVmaW5lIFdBVkVTX1BBUkFNX0xJTkVTCQkxNjAKKworc3RydWN0IHNzdF9oc3c7CitzdHJ1Y3Qgc3N0X2hzd19zdHJlYW07CitzdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtOworc3RydWN0IHNzdF9wZGF0YTsKK3N0cnVjdCBzc3RfbW9kdWxlOworc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZTsKK2V4dGVybiBzdHJ1Y3Qgc3N0X29wcyBoYXN3ZWxsX29wczsKKworLyogU3RyZWFtIEFsbG9jYXRlIFBhdGggSUQgKi8KK2VudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCB7CisJU1NUX0hTV19TVFJFQU1fUEFUSF9TU1AwX09VVCA9IDAsCisJU1NUX0hTV19TVFJFQU1fUEFUSF9TU1AwX0lOID0gMSwKKwlTU1RfSFNXX1NUUkVBTV9QQVRIX01BWF9QQVRIX0lEID0gMiwKK307CisKKy8qIFN0cmVhbSBBbGxvY2F0ZSBTdHJlYW0gVHlwZSAqLworZW51bSBzc3RfaHN3X3N0cmVhbV90eXBlIHsKKwlTU1RfSFNXX1NUUkVBTV9UWVBFX1JFTkRFUiA9IDAsCisJU1NUX0hTV19TVFJFQU1fVFlQRV9TWVNURU0gPSAxLAorCVNTVF9IU1dfU1RSRUFNX1RZUEVfQ0FQVFVSRSA9IDIsCisJU1NUX0hTV19TVFJFQU1fVFlQRV9MT09QQkFDSyA9IDMsCisJU1NUX0hTV19TVFJFQU1fVFlQRV9NQVhfU1RSRUFNX1RZUEUgPSA0LAorfTsKKworLyogU3RyZWFtIEFsbG9jYXRlIFN0cmVhbSBGb3JtYXQgKi8KK2VudW0gc3N0X2hzd19zdHJlYW1fZm9ybWF0IHsKKwlTU1RfSFNXX1NUUkVBTV9GT1JNQVRfUENNX0ZPUk1BVCA9IDAsCisJU1NUX0hTV19TVFJFQU1fRk9STUFUX01QM19GT1JNQVQgPSAxLAorCVNTVF9IU1dfU1RSRUFNX0ZPUk1BVF9BQUNfRk9STUFUID0gMiwKKwlTU1RfSFNXX1NUUkVBTV9GT1JNQVRfTUFYX0ZPUk1BVF9JRCA9IDMsCit9OworCisvKiBEZXZpY2UgSUQgKi8KK2VudW0gc3N0X2hzd19kZXZpY2VfaWQgeworCVNTVF9IU1dfREVWSUNFX1NTUF8wICAgPSAwLAorCVNTVF9IU1dfREVWSUNFX1NTUF8xICAgPSAxLAorfTsKKworLyogRGV2aWNlIE1hc3RlciBDbG9jayBGcmVxdWVuY3kgKi8KK2VudW0gc3N0X2hzd19kZXZpY2VfbWNsayB7CisJU1NUX0hTV19ERVZJQ0VfTUNMS19PRkYgICAgICAgICA9IDAsCisJU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzZfTUhaICA9IDEsCisJU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzEyX01IWiA9IDIsCisJU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzI0X01IWiA9IDMsCit9OworCisvKiBEZXZpY2UgQ2xvY2sgTWFzdGVyICovCitlbnVtIHNzdF9oc3dfZGV2aWNlX21vZGUgeworCVNTVF9IU1dfREVWSUNFX0NMT0NLX1NMQVZFICAgPSAwLAorCVNTVF9IU1dfREVWSUNFX0NMT0NLX01BU1RFUiAgPSAxLAorCVNTVF9IU1dfREVWSUNFX1RETV9DTE9DS19NQVNURVIgPSAyLAorfTsKKworLyogRFggUG93ZXIgU3RhdGUgKi8KK2VudW0gc3N0X2hzd19keF9zdGF0ZSB7CisJU1NUX0hTV19EWF9TVEFURV9EMCAgICAgPSAwLAorCVNTVF9IU1dfRFhfU1RBVEVfRDEgICAgID0gMSwKKwlTU1RfSFNXX0RYX1NUQVRFX0QzICAgICA9IDMsCisJU1NUX0hTV19EWF9TVEFURV9NQVgJPSAzLAorfTsKKworLyogQXVkaW8gc3RyZWFtIHN0YWdlIElEcyAqLworZW51bSBzc3RfaHN3X2Z4X3N0YWdlX2lkIHsKKwlTU1RfSFNXX1NUQUdFX0lEX1dBVkVTID0gMCwKKwlTU1RfSFNXX1NUQUdFX0lEX0RUUyAgID0gMSwKKwlTU1RfSFNXX1NUQUdFX0lEX0RPTEJZID0gMiwKKwlTU1RfSFNXX1NUQUdFX0lEX0JPT1NUID0gMywKKwlTU1RfSFNXX1NUQUdFX0lEX01BWF9GWF9JRAorfTsKKworLyogRFggU3RhdGUgVHlwZSAqLworZW51bSBzc3RfaHN3X2R4X3R5cGUgeworCVNTVF9IU1dfRFhfVFlQRV9GV19JTUFHRSA9IDAsCisJU1NUX0hTV19EWF9UWVBFX01FTU9SWV9EVU1QID0gMQorfTsKKworLyogVm9sdW1lIEN1cnZlIFR5cGUqLworZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSB7CisJU1NUX0hTV19WT0xVTUVfQ1VSVkVfTk9ORSA9IDAsCisJU1NUX0hTV19WT0xVTUVfQ1VSVkVfRkFERSA9IDEKK307CisKKy8qIFNhbXBsZSBvcmRlcmluZyAqLworZW51bSBzc3RfaHN3X2ludGVybGVhdmluZyB7CisJU1NUX0hTV19JTlRFUkxFQVZJTkdfUEVSX0NIQU5ORUwgPSAwLAorCVNTVF9IU1dfSU5URVJMRUFWSU5HX1BFUl9TQU1QTEUgID0gMSwKK307CisKKy8qIENoYW5uZWwgaW5kaWNlcyAqLworZW51bSBzc3RfaHN3X2NoYW5uZWxfaW5kZXggeworCVNTVF9IU1dfQ0hBTk5FTF9MRUZUICAgICAgICAgICAgPSAwLAorCVNTVF9IU1dfQ0hBTk5FTF9DRU5URVIgICAgICAgICAgPSAxLAorCVNTVF9IU1dfQ0hBTk5FTF9SSUdIVCAgICAgICAgICAgPSAyLAorCVNTVF9IU1dfQ0hBTk5FTF9MRUZUX1NVUlJPVU5EICAgPSAzLAorCVNTVF9IU1dfQ0hBTk5FTF9DRU5URVJfU1VSUk9VTkQgPSAzLAorCVNTVF9IU1dfQ0hBTk5FTF9SSUdIVF9TVVJST1VORCAgPSA0LAorCVNTVF9IU1dfQ0hBTk5FTF9MRkUgICAgICAgICAgICAgPSA3LAorCVNTVF9IU1dfQ0hBTk5FTF9JTlZBTElEICAgICAgICAgPSAweEYsCit9OworCisvKiBMaXN0IG9mIHN1cHBvcnRlZCBjaGFubmVsIG1hcHMuICovCitlbnVtIHNzdF9oc3dfY2hhbm5lbF9jb25maWcgeworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfTU9OTyAgICAgID0gMCwgLyogbW9ubyBvbmx5LiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfU1RFUkVPICAgID0gMSwgLyogTCAmIFIuICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR18yX1BPSU5UXzEgPSAyLCAvKiBMLCBSICYgTEZFOyBQQ00gb25seS4gKi8KKwlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzNfUE9JTlRfMCA9IDMsIC8qIEwsIEMgJiBSOyBNUDMgJiBBQUMgb25seS4gKi8KKwlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzNfUE9JTlRfMSA9IDQsIC8qIEwsIEMsIFIgJiBMRkU7IFBDTSBvbmx5LiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfUVVBVFJPICAgID0gNSwgLyogTCwgUiwgTHMgJiBSczsgUENNIG9ubHkuICovCisJU1NUX0hTV19DSEFOTkVMX0NPTkZJR180X1BPSU5UXzAgPSA2LCAvKiBMLCBDLCBSICYgQ3M7IE1QMyAmIEFBQyBvbmx5LiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfNV9QT0lOVF8wID0gNywgLyogTCwgQywgUiwgTHMgJiBScy4gKi8KKwlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzVfUE9JTlRfMSA9IDgsIC8qIEwsIEMsIFIsIExzLCBScyAmIExGRS4gKi8KKwlTU1RfSFNXX0NIQU5ORUxfQ09ORklHX0RVQUxfTU9OTyA9IDksIC8qIE9uZSBjaGFubmVsIHJlcGxpY2F0ZWQgaW4gdHdvLiAqLworCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfSU5WQUxJRCwKK307CisKKy8qIExpc3Qgb2Ygc3VwcG9ydGVkIGJpdCBkZXB0aHMuICovCitlbnVtIHNzdF9oc3dfYml0ZGVwdGggeworCVNTVF9IU1dfREVQVEhfOEJJVCAgPSA4LAorCVNTVF9IU1dfREVQVEhfMTZCSVQgPSAxNiwKKwlTU1RfSFNXX0RFUFRIXzI0QklUID0gMjQsIC8qIERlZmF1bHQuICovCisJU1NUX0hTV19ERVBUSF8zMkJJVCA9IDMyLAorCVNTVF9IU1dfREVQVEhfSU5WQUxJRCA9IDMzLAorfTsKKworZW51bSBzc3RfaHN3X21vZHVsZV9pZCB7CisJU1NUX0hTV19NT0RVTEVfQkFTRV9GVyA9IDB4MCwKKwlTU1RfSFNXX01PRFVMRV9NUDMgICAgID0gMHgxLAorCVNTVF9IU1dfTU9EVUxFX0FBQ181XzEgPSAweDIsCisJU1NUX0hTV19NT0RVTEVfQUFDXzJfMCA9IDB4MywKKwlTU1RfSFNXX01PRFVMRV9TUkMgICAgID0gMHg0LAorCVNTVF9IU1dfTU9EVUxFX1dBVkVTICAgPSAweDUsCisJU1NUX0hTV19NT0RVTEVfRE9MQlkgICA9IDB4NiwKKwlTU1RfSFNXX01PRFVMRV9CT09TVCAgID0gMHg3LAorCVNTVF9IU1dfTU9EVUxFX0xQQUwgICAgPSAweDgsCisJU1NUX0hTV19NT0RVTEVfRFRTICAgICA9IDB4OSwKKwlTU1RfSFNXX01PRFVMRV9QQ01fQ0FQVFVSRSA9IDB4QSwKKwlTU1RfSFNXX01PRFVMRV9QQ01fU1lTVEVNID0gMHhCLAorCVNTVF9IU1dfTU9EVUxFX1BDTV9SRUZFUkVOQ0UgPSAweEMsCisJU1NUX0hTV19NT0RVTEVfUENNID0gMHhELAorCVNTVF9IU1dfTU9EVUxFX0JMVUVUT09USF9SRU5ERVJfTU9EVUxFID0gMHhFLAorCVNTVF9IU1dfTU9EVUxFX0JMVUVUT09USF9DQVBUVVJFX01PRFVMRSA9IDB4RiwKKwlTU1RfSFNXX01BWF9NT0RVTEVfSUQsCit9OworCitlbnVtIHNzdF9oc3dfcGVyZm9ybWFuY2VfYWN0aW9uIHsKKwlTU1RfSFNXX1BFUkZfU1RBUlQgPSAwLAorCVNTVF9IU1dfUEVSRl9TVE9QID0gMSwKK307CisKK3N0cnVjdCBzc3RfaHN3X3RyYW5zZmVyX2luZm8geworCXVpbnQzMl90IGRlc3RpbmF0aW9uOyAgICAgICAvKiBkZXN0aW5hdGlvbiBhZGRyZXNzICovCisJdWludDMyX3QgcmV2ZXJzZToxOyAgICAgICAgIC8qIGlmIDEgZGF0YSBmbG93cyBmcm9tIGRlc3RpbmF0aW9uICovCisJdWludDMyX3Qgc2l6ZTozMTsgICAgICAgICAgIC8qIHRyYW5zZmVyIHNpemUgaW4gYnl0ZXMuKi8KKwl1aW50MTZfdCBmaXJzdF9wYWdlX29mZnNldDsgLyogb2Zmc2V0IHRvIGRhdGEgaW4gdGhlIGZpcnN0IHBhZ2UuICovCisJdWludDhfdCAgcGFja2VkX3BhZ2VzOyAgIC8qIHBhZ2UgYWRkcmVzc2VzLiBFYWNoIG9jY3VwaWVzIDIwIGJpdHMgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzc3RfaHN3X3RyYW5zZmVyX2xpc3QgeworCXVpbnQzMl90IHRyYW5zZmVyc19jb3VudDsKKwlzdHJ1Y3Qgc3N0X2hzd190cmFuc2Zlcl9pbmZvIHRyYW5zZmVyczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzc3RfaHN3X3RyYW5zZmVyX3BhcmFtZXRlciB7CisJdWludDMyX3QgcGFyYW1ldGVyX2lkOworCXVpbnQzMl90IGRhdGFfc2l6ZTsKKwl1bmlvbiB7CisJCXVpbnQ4X3QgZGF0YVsxXTsKKwkJc3RydWN0IHNzdF9oc3dfdHJhbnNmZXJfbGlzdCB0cmFuc2Zlcl9saXN0OworCX07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTU1QgZmlybXdhcmUgbW9kdWxlIGluZm8gKi8KK3N0cnVjdCBzc3RfaHN3X21vZHVsZV9pbmZvIHsKKwl1OCBuYW1lW1NTVF9IU1dfTUFYX0lORk9fU0laRV07CisJdTggdmVyc2lvbltTU1RfSFNXX01BWF9JTkZPX1NJWkVdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogTW9kdWxlIGVudHJ5IHBvaW50ICovCitzdHJ1Y3Qgc3N0X2hzd19tb2R1bGVfZW50cnkgeworCWVudW0gc3N0X2hzd19tb2R1bGVfaWQgbW9kdWxlX2lkOworCXUzMiBlbnRyeV9wb2ludDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIE1vZHVsZSBtYXAgLSBhbGlnbmVtZW50IG1hdGNoZXMgRFNQICovCitzdHJ1Y3Qgc3N0X2hzd19tb2R1bGVfbWFwIHsKKwl1OCBtb2R1bGVfZW50cmllc19jb3VudDsKKwlzdHJ1Y3Qgc3N0X2hzd19tb2R1bGVfZW50cnkgbW9kdWxlX2VudHJpZXNbMV07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc3N0X2hzd19tZW1vcnlfaW5mbyB7CisJdTMyIG9mZnNldDsKKwl1MzIgc2l6ZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzc3RfaHN3X2Z4X2VuYWJsZSB7CisJc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCBtb2R1bGVfbWFwOworCXN0cnVjdCBzc3RfaHN3X21lbW9yeV9pbmZvIHBlcnNpc3RlbnRfbWVtOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfaXBjX21vZHVsZV9jb25maWcgeworCXN0cnVjdCBzc3RfaHN3X21vZHVsZV9tYXAgbWFwOworCXN0cnVjdCBzc3RfaHN3X21lbW9yeV9pbmZvIHBlcnNpc3RlbnRfbWVtOworCXN0cnVjdCBzc3RfaHN3X21lbW9yeV9pbmZvIHNjcmF0Y2hfbWVtOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfZ2V0X2Z4X3BhcmFtIHsKKwl1MzIgcGFyYW1ldGVyX2lkOworCXUzMiBwYXJhbV9zaXplOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNzdF9oc3dfcGVyZl9hY3Rpb24geworCXUzMiBhY3Rpb247Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc3N0X2hzd19wZXJmX2RhdGEgeworCXU2NCB0aW1lc3RhbXA7CisJdTY0IGN5Y2xlczsKKwl1NjQgZGF0YXRpbWU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBGVyB2ZXJzaW9uICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfdmVyc2lvbiB7CisJdTggYnVpbGQ7CisJdTggbWlub3I7CisJdTggbWFqb3I7CisJdTggdHlwZTsKKwl1OCBmd19idWlsZF9oYXNoW1NTVF9IU1dfQlVJTERfSEFTSF9MRU5HVEhdOworCXUzMiBmd19sb2dfcHJvdmlkZXJzX2hhc2g7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTdHJlYW0gcmluZyBpbmZvICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX3JpbmcgeworCXUzMiByaW5nX3B0X2FkZHJlc3M7CisJdTMyIG51bV9wYWdlczsKKwl1MzIgcmluZ19zaXplOworCXUzMiByaW5nX29mZnNldDsKKwl1MzIgcmluZ19maXJzdF9wZm47Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEZWJ1ZyBEdW1wIExvZyBFbmFibGUgUmVxdWVzdCAqLworc3RydWN0IHNzdF9oc3dfaXBjX2RlYnVnX2xvZ19lbmFibGVfcmVxIHsKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX3JpbmcgcmluZ2luZm87CisJdTMyIGNvbmZpZ1tTU1RfSFNXX0ZXX0xPR19DT05GSUdfRFdPUkRTXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIERlYnVnIER1bXAgTG9nIFJlcGx5ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfZGVidWdfbG9nX3JlcGx5IHsKKwl1MzIgbG9nX2J1ZmZlcl9iZWdpbmluZzsKKwl1MzIgbG9nX2J1ZmZlcl9zaXplOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogU3RyZWFtIGdsaXRjaCBwb3NpdGlvbiAqLworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9nbGl0Y2hfcG9zaXRpb24geworCXUzMiBnbGl0Y2hfdHlwZTsKKwl1MzIgcHJlc2VudF9wb3M7CisJdTMyIHdyaXRlX3BvczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBnZXQgcG9zaXRpb24gKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZ2V0X3Bvc2l0aW9uIHsKKwl1MzIgcG9zaXRpb247CisJdTMyIGZ3X2N5Y2xlX2NvdW50OworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogU3RyZWFtIHNldCBwb3NpdGlvbiAqLworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9zZXRfcG9zaXRpb24geworCXUzMiBwb3NpdGlvbjsKKwl1MzIgZW5kX29mX2J1ZmZlcjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBGcmVlIFJlcXVlc3QgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZnJlZV9yZXEgeworCXU4IHN0cmVhbV9pZDsKKwl1OCByZXNlcnZlZFszXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFNldCBWb2x1bWUgUmVxdWVzdCAqLworc3RydWN0IHNzdF9oc3dfaXBjX3ZvbHVtZV9yZXEgeworCXUzMiBjaGFubmVsOworCXUzMiB0YXJnZXRfdm9sdW1lOworCXU2NCBjdXJ2ZV9kdXJhdGlvbjsKKwl1MzIgY3VydmVfdHlwZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIERldmljZSBDb25maWd1cmF0aW9uIFJlcXVlc3QgKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19kZXZpY2VfY29uZmlnX3JlcSB7CisJdTMyIHNzcF9pbnRlcmZhY2U7CisJdTMyIGNsb2NrX2ZyZXF1ZW5jeTsKKwl1MzIgbW9kZTsKKwl1MTYgY2xvY2tfZGl2aWRlcjsKKwl1OCBjaGFubmVsczsKKwl1OCByZXNlcnZlZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIEF1ZGlvIERhdGEgZm9ybWF0cyAqLworc3RydWN0IHNzdF9oc3dfYXVkaW9fZGF0YV9mb3JtYXRfaXBjIHsKKwl1MzIgZnJlcXVlbmN5OworCXUzMiBiaXRkZXB0aDsKKwl1MzIgbWFwOworCXUzMiBjb25maWc7CisJdTMyIHN0eWxlOworCXU4IGNoX251bTsKKwl1OCB2YWxpZF9iaXQ7CisJdTggcmVzZXJ2ZWRbMl07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBTdHJlYW0gQWxsb2NhdGUgUmVxdWVzdCAqLworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXEgeworCXU4IHBhdGhfaWQ7CisJdTggc3RyZWFtX3R5cGU7CisJdTggZm9ybWF0X2lkOworCXU4IHJlc2VydmVkOworCXN0cnVjdCBzc3RfaHN3X2F1ZGlvX2RhdGFfZm9ybWF0X2lwYyBmb3JtYXQ7CisJc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9yaW5nIHJpbmdpbmZvOworCXN0cnVjdCBzc3RfaHN3X21vZHVsZV9tYXAgbWFwOworCXN0cnVjdCBzc3RfaHN3X21lbW9yeV9pbmZvIHBlcnNpc3RlbnRfbWVtOworCXN0cnVjdCBzc3RfaHN3X21lbW9yeV9pbmZvIHNjcmF0Y2hfbWVtOworCXUzMiBudW1iZXJfb2Zfbm90aWZpY2F0aW9uczsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFN0cmVhbSBBbGxvY2F0ZSBSZXBseSAqLworc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXBseSB7CisJdTMyIHN0cmVhbV9od19pZDsKKwl1MzIgbWl4ZXJfaHdfaWQ7IC8vIHJldHVybnMgcmF0ZSA/Pz8/CisJdTMyIHJlYWRfcG9zaXRpb25fcmVnaXN0ZXJfYWRkcmVzczsKKwl1MzIgcHJlc2VudGF0aW9uX3Bvc2l0aW9uX3JlZ2lzdGVyX2FkZHJlc3M7CisJdTMyIHBlYWtfbWV0ZXJfcmVnaXN0ZXJfYWRkcmVzc1tTU1RfSFNXX05PX0NIQU5ORUxTXTsKKwl1MzIgdm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbU1NUX0hTV19OT19DSEFOTkVMU107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBHZXQgTWl4ZXIgU3RyZWFtIEluZm8gKi8KK3N0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1faW5mb19yZXBseSB7CisJdTMyIG1peGVyX2h3X2lkOworCXUzMiBwZWFrX21ldGVyX3JlZ2lzdGVyX2FkZHJlc3NbU1NUX0hTV19OT19DSEFOTkVMU107CisJdTMyIHZvbHVtZV9yZWdpc3Rlcl9hZGRyZXNzW1NTVF9IU1dfTk9fQ0hBTk5FTFNdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogRFggU3RhdGUgUmVxdWVzdCAqLworc3RydWN0IHNzdF9oc3dfaXBjX2R4X3JlcSB7CisJdTggc3RhdGU7CisJdTggcmVzZXJ2ZWRbM107Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBEWCBTdGF0ZSBSZXBseSBNZW1vcnkgSW5mbyBJdGVtICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfZHhfbWVtb3J5X2l0ZW0geworCXUzMiBvZmZzZXQ7CisJdTMyIHNpemU7CisJdTMyIHNvdXJjZTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIERYIFN0YXRlIFJlcGx5ICovCitzdHJ1Y3Qgc3N0X2hzd19pcGNfZHhfcmVwbHkgeworCXUzMiBlbnRyaWVzX25vOworCXN0cnVjdCBzc3RfaHN3X2lwY19keF9tZW1vcnlfaXRlbSBtZW1faW5mb1tTU1RfSFNXX01BWF9EWF9SRUdJT05TXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uOworCisvKiBTU1QgSW5pdCAmIEZyZWUgKi8KK3N0cnVjdCBzc3RfaHN3ICpzc3RfaHN3X25ldyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IHU4ICpmdywgc2l6ZV90IGZ3X2xlbmd0aCwKKwl1MzIgZndfb2Zmc2V0KTsKK3ZvaWQgc3N0X2hzd19mcmVlKHN0cnVjdCBzc3RfaHN3ICpoc3cpOworaW50IHNzdF9oc3dfZndfZ2V0X3ZlcnNpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfdmVyc2lvbiAqdmVyc2lvbik7Cit1MzIgY3JlYXRlX2NoYW5uZWxfbWFwKGVudW0gc3N0X2hzd19jaGFubmVsX2NvbmZpZyBjb25maWcpOworCisvKiBTdHJlYW0gTWl4ZXIgQ29udHJvbHMgLSAqLworaW50IHNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwgdTMyIHZvbHVtZSk7CitpbnQgc3N0X2hzd19zdHJlYW1fZ2V0X3ZvbHVtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsLCB1MzIgKnZvbHVtZSk7CisKKy8qIEdsb2JhbCBNaXhlciBDb250cm9scyAtICovCitpbnQgc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyIHZvbHVtZSk7CitpbnQgc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsCisJdTMyICp2b2x1bWUpOworCisvKiBTdHJlYW0gQVBJICovCitzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnNzdF9oc3dfc3RyZWFtX25ldyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBpbnQgaWQsCisJdTMyICgqZ2V0X3dyaXRlX3Bvc2l0aW9uKShzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdm9pZCAqZGF0YSksCisJdm9pZCAqZGF0YSk7CisKK2ludCBzc3RfaHN3X3N0cmVhbV9mcmVlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKKworLyogU3RyZWFtIENvbmZpZ3VyYXRpb24gKi8KK2ludCBzc3RfaHN3X3N0cmVhbV9mb3JtYXQoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJZW51bSBzc3RfaHN3X3N0cmVhbV9wYXRoX2lkIHBhdGhfaWQsCisJZW51bSBzc3RfaHN3X3N0cmVhbV90eXBlIHN0cmVhbV90eXBlLAorCWVudW0gc3N0X2hzd19zdHJlYW1fZm9ybWF0IGZvcm1hdF9pZCk7CisKK2ludCBzc3RfaHN3X3N0cmVhbV9idWZmZXIoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJdTMyIHJpbmdfcHRfYWRkcmVzcywgdTMyIG51bV9wYWdlcywKKwl1MzIgcmluZ19zaXplLCB1MzIgcmluZ19vZmZzZXQsIHUzMiByaW5nX2ZpcnN0X3Bmbik7CisKK2ludCBzc3RfaHN3X3N0cmVhbV9jb21taXQoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pOworCitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZhbGlkKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCXUzMiBiaXRzKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfcmF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwlpbnQgcmF0ZSk7CitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X2JpdHMoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCisJZW51bSBzc3RfaHN3X2JpdGRlcHRoIGJpdHMpOworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9jaGFubmVscyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBpbnQgY2hhbm5lbHMpOworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9tYXBfY29uZmlnKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBtYXAsCisJZW51bSBzc3RfaHN3X2NoYW5uZWxfY29uZmlnIGNvbmZpZyk7CitpbnQgc3N0X2hzd19zdHJlYW1fc2V0X3N0eWxlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWVudW0gc3N0X2hzd19pbnRlcmxlYXZpbmcgc3R5bGUpOworaW50IHNzdF9oc3dfc3RyZWFtX3NldF9tb2R1bGVfaW5mbyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfcG1lbW9yeV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBvZmZzZXQsIHUzMiBzaXplKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9zZXRfc21lbW9yeV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBvZmZzZXQsIHUzMiBzaXplKTsKK3NuZF9wY21fdWZyYW1lc190IHNzdF9oc3dfc3RyZWFtX2dldF9vbGRfcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7Cit2b2lkIHNzdF9oc3dfc3RyZWFtX3NldF9vbGRfcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgc25kX3BjbV91ZnJhbWVzX3QgdmFsKTsKK2Jvb2wgc3N0X2hzd19zdHJlYW1fZ2V0X3NpbGVuY2Vfc3RhcnQoc3RydWN0IHNzdF9oc3cgKmhzdywKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7Cit2b2lkIHNzdF9oc3dfc3RyZWFtX3NldF9zaWxlbmNlX3N0YXJ0KHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIGJvb2wgdmFsKTsKK2ludCBzc3RfaHN3X21peGVyX2dldF9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3cpOworCisvKiBTdHJlYW0gQUxTQSB0cmlnZ2VyIG9wZXJhdGlvbnMgKi8KK2ludCBzc3RfaHN3X3N0cmVhbV9wYXVzZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKKwlpbnQgd2FpdCk7CitpbnQgc3N0X2hzd19zdHJlYW1fcmVzdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAorCWludCB3YWl0KTsKK2ludCBzc3RfaHN3X3N0cmVhbV9yZXNldChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7CisKKy8qIFN0cmVhbSBwb2ludGVyIHBvc2l0aW9ucyAqLworaW50IHNzdF9oc3dfc3RyZWFtX2dldF9yZWFkX3BvcyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgKnBvc2l0aW9uKTsKK2ludCBzc3RfaHN3X3N0cmVhbV9nZXRfd3JpdGVfcG9zKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiAqcG9zaXRpb24pOwordTMyIHNzdF9oc3dfZ2V0X2RzcF9wb3NpdGlvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKK3U2NCBzc3RfaHN3X2dldF9kc3BfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pOworCisvKiBIVyBwb3J0IGNvbmZpZyAqLworaW50IHNzdF9oc3dfZGV2aWNlX3NldF9jb25maWcoc3RydWN0IHNzdF9oc3cgKmhzdywKKwllbnVtIHNzdF9oc3dfZGV2aWNlX2lkIGRldiwgZW51bSBzc3RfaHN3X2RldmljZV9tY2xrIG1jbGssCisJZW51bSBzc3RfaHN3X2RldmljZV9tb2RlIG1vZGUsIHUzMiBjbG9ja19kaXZpZGVyKTsKKworLyogRFggQ29uZmlnICovCitpbnQgc3N0X2hzd19keF9zZXRfc3RhdGUoc3RydWN0IHNzdF9oc3cgKmhzdywKKwllbnVtIHNzdF9oc3dfZHhfc3RhdGUgc3RhdGUsIHN0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSAqZHgpOworCisvKiBpbml0ICovCitpbnQgc3N0X2hzd19kc3BfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKTsKK3ZvaWQgc3N0X2hzd19kc3BfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKTsKK3N0cnVjdCBzc3RfZHNwICpzc3RfaHN3X2dldF9kc3Aoc3RydWN0IHNzdF9oc3cgKmhzdyk7CisKKy8qIGZ3IG1vZHVsZSBmdW5jdGlvbiAqLwordm9pZCBzc3RfaHN3X2luaXRfbW9kdWxlX3N0YXRlKHN0cnVjdCBzc3RfaHN3ICpoc3cpOworYm9vbCBzc3RfaHN3X2lzX21vZHVsZV9sb2FkZWQoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIG1vZHVsZV9pZCk7Citib29sIHNzdF9oc3dfaXNfbW9kdWxlX2FjdGl2ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgbW9kdWxlX2lkKTsKK3ZvaWQgc3N0X2hzd19zZXRfbW9kdWxlX2VuYWJsZWRfcnRkMyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgbW9kdWxlX2lkKTsKK3ZvaWQgc3N0X2hzd19zZXRfbW9kdWxlX2Rpc2FibGVkX3J0ZDMoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIG1vZHVsZV9pZCk7Citib29sIHNzdF9oc3dfaXNfbW9kdWxlX2VuYWJsZWRfcnRkMyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgbW9kdWxlX2lkKTsKK3ZvaWQgc3N0X2hzd19yZXNldF9wYXJhbV9idWYoc3RydWN0IHNzdF9oc3cgKmhzdyk7CitpbnQgc3N0X2hzd19zdG9yZV9wYXJhbV9saW5lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHU4ICpidWYpOworaW50IHNzdF9oc3dfbG9hZF9wYXJhbV9saW5lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHU4ICpidWYpOworaW50IHNzdF9oc3dfbGF1bmNoX3BhcmFtX2J1ZihzdHJ1Y3Qgc3N0X2hzdyAqaHN3KTsKKworaW50IHNzdF9oc3dfbW9kdWxlX2xvYWQoc3RydWN0IHNzdF9oc3cgKmhzdywKKwl1MzIgbW9kdWxlX2lkLCB1MzIgaW5zdGFuY2VfaWQsIGNoYXIgKm5hbWUpOworaW50IHNzdF9oc3dfbW9kdWxlX2VuYWJsZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXUzMiBtb2R1bGVfaWQsIHUzMiBpbnN0YW5jZV9pZCk7CitpbnQgc3N0X2hzd19tb2R1bGVfZGlzYWJsZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAorCXUzMiBtb2R1bGVfaWQsIHUzMiBpbnN0YW5jZV9pZCk7CitpbnQgc3N0X2hzd19tb2R1bGVfc2V0X3BhcmFtKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJdTMyIG1vZHVsZV9pZCwgdTMyIGluc3RhbmNlX2lkLCB1MzIgcGFyYW1ldGVyX2lkLAorCXUzMiBwYXJhbV9zaXplLCBjaGFyICpwYXJhbSk7CisKKy8qIHJ1bnRpbWUgbW9kdWxlIG1hbmFnZW1lbnQgKi8KK3N0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnNzdF9oc3dfcnVudGltZV9tb2R1bGVfY3JlYXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csCisJaW50IG1vZF9pZCwgaW50IG9mZnNldCk7Cit2b2lkIHNzdF9oc3dfcnVudGltZV9tb2R1bGVfZnJlZShzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lKTsKKworLyogUE0gKi8KK2ludCBzc3RfaHN3X2RzcF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3KTsKK2ludCBzc3RfaHN3X2RzcF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IHNzdF9oc3cgKmhzdyk7CitpbnQgc3N0X2hzd19kc3BfbG9hZChzdHJ1Y3Qgc3N0X2hzdyAqaHN3KTsKK2ludCBzc3RfaHN3X2RzcF9ydW50aW1lX3NsZWVwKHN0cnVjdCBzc3RfaHN3ICpoc3cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsL3NzdC1oYXN3ZWxsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL2hhc3dlbGwvc3N0LWhhc3dlbGwtcGNtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhZTA0MAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9pbnRlbC9oYXN3ZWxsL3NzdC1oYXN3ZWxsLXBjbS5jCkBAIC0wLDAgKzEsMTQwNSBAQAorLyoKKyAqIEludGVsIFNTVCBIYXN3ZWxsL0Jyb2Fkd2VsbCBQQ00gU3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgorI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgorCisjaW5jbHVkZSAiLi4vaGFzd2VsbC9zc3QtaGFzd2VsbC1pcGMuaCIKKyNpbmNsdWRlICIuLi9jb21tb24vc3N0LWRzcC1wcml2LmgiCisjaW5jbHVkZSAiLi4vY29tbW9uL3NzdC1kc3AuaCIKKworI2RlZmluZSBIU1dfUENNX0NPVU5UCQk2CisjZGVmaW5lIEhTV19WT0xVTUVfTUFYCQkweDdGRkZGRkZGCS8qIDBkQiAqLworCisjZGVmaW5lIFNTVF9PTERfUE9TSVRJT04oZCwgciwgbykgKChkKSArCQlcCisJCQlmcmFtZXNfdG9fYnl0ZXMociwgbykpCisjZGVmaW5lIFNTVF9TQU1QTEVTKHIsIHgpIChieXRlc190b19zYW1wbGVzKHIsCVwKKwkJCWZyYW1lc190b19ieXRlcyhyLCAoeCkpKSkKKworLyogc2ltcGxlIHZvbHVtZSB0YWJsZSAqLworc3RhdGljIGNvbnN0IHUzMiB2b2x1bWVfbWFwW10gPSB7CisJSFNXX1ZPTFVNRV9NQVggPj4gMzAsCisJSFNXX1ZPTFVNRV9NQVggPj4gMjksCisJSFNXX1ZPTFVNRV9NQVggPj4gMjgsCisJSFNXX1ZPTFVNRV9NQVggPj4gMjcsCisJSFNXX1ZPTFVNRV9NQVggPj4gMjYsCisJSFNXX1ZPTFVNRV9NQVggPj4gMjUsCisJSFNXX1ZPTFVNRV9NQVggPj4gMjQsCisJSFNXX1ZPTFVNRV9NQVggPj4gMjMsCisJSFNXX1ZPTFVNRV9NQVggPj4gMjIsCisJSFNXX1ZPTFVNRV9NQVggPj4gMjEsCisJSFNXX1ZPTFVNRV9NQVggPj4gMjAsCisJSFNXX1ZPTFVNRV9NQVggPj4gMTksCisJSFNXX1ZPTFVNRV9NQVggPj4gMTgsCisJSFNXX1ZPTFVNRV9NQVggPj4gMTcsCisJSFNXX1ZPTFVNRV9NQVggPj4gMTYsCisJSFNXX1ZPTFVNRV9NQVggPj4gMTUsCisJSFNXX1ZPTFVNRV9NQVggPj4gMTQsCisJSFNXX1ZPTFVNRV9NQVggPj4gMTMsCisJSFNXX1ZPTFVNRV9NQVggPj4gMTIsCisJSFNXX1ZPTFVNRV9NQVggPj4gMTEsCisJSFNXX1ZPTFVNRV9NQVggPj4gMTAsCisJSFNXX1ZPTFVNRV9NQVggPj4gOSwKKwlIU1dfVk9MVU1FX01BWCA+PiA4LAorCUhTV19WT0xVTUVfTUFYID4+IDcsCisJSFNXX1ZPTFVNRV9NQVggPj4gNiwKKwlIU1dfVk9MVU1FX01BWCA+PiA1LAorCUhTV19WT0xVTUVfTUFYID4+IDQsCisJSFNXX1ZPTFVNRV9NQVggPj4gMywKKwlIU1dfVk9MVU1FX01BWCA+PiAyLAorCUhTV19WT0xVTUVfTUFYID4+IDEsCisJSFNXX1ZPTFVNRV9NQVggPj4gMCwKK307CisKKyNkZWZpbmUgSFNXX1BDTV9QRVJJT0RTX01BWAk2NAorI2RlZmluZSBIU1dfUENNX1BFUklPRFNfTUlOCTIKKworI2RlZmluZSBIU1dfUENNX0RBSV9JRF9TWVNURU0JMAorI2RlZmluZSBIU1dfUENNX0RBSV9JRF9PRkZMT0FEMAkxCisjZGVmaW5lIEhTV19QQ01fREFJX0lEX09GRkxPQUQxCTIKKyNkZWZpbmUgSFNXX1BDTV9EQUlfSURfTE9PUEJBQ0sJMworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3BjbV9oYXJkd2FyZSBoc3dfcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCSAgU05EUlZfUENNX0lORk9fUkVTVU1FIHwKKwkJCQkgIFNORFJWX1BDTV9JTkZPX05PX1BFUklPRF9XQUtFVVAgfAorCQkJCSAgU05EUlZfUENNX0lORk9fRFJBSU5fVFJJR0dFUiwKKwkuZm9ybWF0cwkJPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwKKwkJCQkgIFNORFJWX1BDTV9GTVRCSVRfUzMyX0xFLAorCS5wZXJpb2RfYnl0ZXNfbWluCT0gUEFHRV9TSVpFLAorCS5wZXJpb2RfYnl0ZXNfbWF4CT0gKEhTV19QQ01fUEVSSU9EU19NQVggLyBIU1dfUENNX1BFUklPRFNfTUlOKSAqIFBBR0VfU0laRSwKKwkucGVyaW9kc19taW4JCT0gSFNXX1BDTV9QRVJJT0RTX01JTiwKKwkucGVyaW9kc19tYXgJCT0gSFNXX1BDTV9QRVJJT0RTX01BWCwKKwkuYnVmZmVyX2J5dGVzX21heAk9IEhTV19QQ01fUEVSSU9EU19NQVggKiBQQUdFX1NJWkUsCit9OworCitzdHJ1Y3QgaHN3X3BjbV9tb2R1bGVfbWFwIHsKKwlpbnQgZGFpX2lkOworCWludCBzdHJlYW07CisJZW51bSBzc3RfaHN3X21vZHVsZV9pZCBtb2RfaWQ7Cit9OworCisvKiBwcml2YXRlIGRhdGEgZm9yIGVhY2ggUENNIERTUCBzdHJlYW0gKi8KK3N0cnVjdCBoc3dfcGNtX2RhdGEgeworCWludCBkYWlfaWQ7CisJc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW07CisJc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZTsKKwlzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lX2NvbnRleHQgY29udGV4dDsKKwlzdHJ1Y3Qgc25kX3BjbSAqaHN3X3BjbTsKKwl1MzIgdm9sdW1lWzJdOworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOworCXN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICpjc3RyZWFtOworCXVuc2lnbmVkIGludCB3cG9zOworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlib29sIGFsbG9jYXRlZDsKKwlpbnQgcGVyc2lzdGVudF9vZmZzZXQ7Cit9OworCitlbnVtIGhzd19wbV9zdGF0ZSB7CisJSFNXX1BNX1NUQVRFX0QwID0gMCwKKwlIU1dfUE1fU1RBVEVfUlREMyA9IDEsCisJSFNXX1BNX1NUQVRFX0QzID0gMiwKK307CisKKy8qIHByaXZhdGUgZGF0YSBmb3IgdGhlIGRyaXZlciAqLworc3RydWN0IGhzd19wcml2X2RhdGEgeworCS8qIHJ1bnRpbWUgRFNQICovCisJc3RydWN0IHNzdF9oc3cgKmhzdzsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJZW51bSBoc3dfcG1fc3RhdGUgcG1fc3RhdGU7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqc29jX2NhcmQ7CisJc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZV93YXZlczsgLyogc291bmQgZWZmZWN0IG1vZHVsZSAqLworCisJLyogcGFnZSB0YWJsZXMgKi8KKwlzdHJ1Y3Qgc25kX2RtYV9idWZmZXIgZG1hYltIU1dfUENNX0NPVU5UXVsyXTsKKworCS8qIERBSSBkYXRhICovCisJc3RydWN0IGhzd19wY21fZGF0YSBwY21bSFNXX1BDTV9DT1VOVF1bMl07Cit9OworCisKKy8qIHN0YXRpYyBtYXBwaW5ncyBiZXR3ZWVuIFBDTXMgYW5kIG1vZHVsZXMgLSBtYXkgYmUgZHluYW1pYyBpbiBmdXR1cmUgKi8KK3N0YXRpYyBzdHJ1Y3QgaHN3X3BjbV9tb2R1bGVfbWFwIG1vZF9tYXBbXSA9IHsKKwl7SFNXX1BDTV9EQUlfSURfU1lTVEVNLCAwLCBTU1RfSFNXX01PRFVMRV9QQ01fU1lTVEVNfSwKKwl7SFNXX1BDTV9EQUlfSURfT0ZGTE9BRDAsIDAsIFNTVF9IU1dfTU9EVUxFX1BDTX0sCisJe0hTV19QQ01fREFJX0lEX09GRkxPQUQxLCAwLCBTU1RfSFNXX01PRFVMRV9QQ019LAorCXtIU1dfUENNX0RBSV9JRF9MT09QQkFDSywgMSwgU1NUX0hTV19NT0RVTEVfUENNX1JFRkVSRU5DRX0sCisJe0hTV19QQ01fREFJX0lEX1NZU1RFTSwgMSwgU1NUX0hTV19NT0RVTEVfUENNX0NBUFRVUkV9LAorfTsKKworc3RhdGljIHUzMiBoc3dfbm90aWZ5X3BvaW50ZXIoc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEpOworCitzdGF0aWMgaW5saW5lIHUzMiBoc3dfbWl4ZXJfdG9faXBjKHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlpZiAodmFsdWUgPj0gQVJSQVlfU0laRSh2b2x1bWVfbWFwKSkKKwkJcmV0dXJuIHZvbHVtZV9tYXBbMF07CisJZWxzZQorCQlyZXR1cm4gdm9sdW1lX21hcFt2YWx1ZV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGhzd19pcGNfdG9fbWl4ZXIodTMyIHZhbHVlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodm9sdW1lX21hcCk7IGkrKykgeworCQlpZiAodm9sdW1lX21hcFtpXSA+PSB2YWx1ZSkKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiBpIC0gMTsKK30KKworc3RhdGljIGludCBoc3dfc3RyZWFtX3ZvbHVtZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX3NvY19rY29udHJvbF9wbGF0Zm9ybShrY29udHJvbCk7CisJc3RydWN0IHNvY19taXhlcl9jb250cm9sICptYyA9CisJCShzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKilrY29udHJvbC0+cHJpdmF0ZV92YWx1ZTsKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcGRhdGEgPQorCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHBsYXRmb3JtKTsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwl1MzIgdm9sdW1lOworCWludCBkYWksIHN0cmVhbTsKKworCWRhaSA9IG1vZF9tYXBbbWMtPnJlZ10uZGFpX2lkOworCXN0cmVhbSA9IG1vZF9tYXBbbWMtPnJlZ10uc3RyZWFtOworCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bZGFpXVtzdHJlYW1dOworCisJbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlwbV9ydW50aW1lX2dldF9zeW5jKHBkYXRhLT5kZXYpOworCisJaWYgKCFwY21fZGF0YS0+c3RyZWFtKSB7CisJCXBjbV9kYXRhLT52b2x1bWVbMF0gPQorCQkJaHN3X21peGVyX3RvX2lwYyh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJCXBjbV9kYXRhLT52b2x1bWVbMV0gPQorCQkJaHN3X21peGVyX3RvX2lwYyh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSk7CisJCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kocGRhdGEtPmRldik7CisJCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHBkYXRhLT5kZXYpOworCQltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7CisJCXJldHVybiAwOworCX0KKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9PQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSkgeworCQl2b2x1bWUgPSBoc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKKwkJLyogYXBwbHkgdm9sdW1lIHZhbHVlIHRvIGFsbCBjaGFubmVscyAqLworCQlzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCwgU1NUX0hTV19DSEFOTkVMU19BTEwsIHZvbHVtZSk7CisJfSBlbHNlIHsKKwkJdm9sdW1lID0gaHN3X21peGVyX3RvX2lwYyh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAwLCB2b2x1bWUpOworCQl2b2x1bWUgPSBoc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKTsKKwkJc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZShoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDAsIDEsIHZvbHVtZSk7CisJfQorCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShwZGF0YS0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwZGF0YS0+ZGV2KTsKKwltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3N0cmVhbV92b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9zb2Nfa2NvbnRyb2xfcGxhdGZvcm0oa2NvbnRyb2wpOworCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQorCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGE7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJdTMyIHZvbHVtZTsKKwlpbnQgZGFpLCBzdHJlYW07CisKKwlkYWkgPSBtb2RfbWFwW21jLT5yZWddLmRhaV9pZDsKKwlzdHJlYW0gPSBtb2RfbWFwW21jLT5yZWddLnN0cmVhbTsKKwlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW2RhaV1bc3RyZWFtXTsKKworCW11dGV4X2xvY2soJnBjbV9kYXRhLT5tdXRleCk7CisJcG1fcnVudGltZV9nZXRfc3luYyhwZGF0YS0+ZGV2KTsKKworCWlmICghcGNtX2RhdGEtPnN0cmVhbSkgeworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9CisJCQloc3dfaXBjX3RvX21peGVyKHBjbV9kYXRhLT52b2x1bWVbMF0pOworCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9CisJCQloc3dfaXBjX3RvX21peGVyKHBjbV9kYXRhLT52b2x1bWVbMV0pOworCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBkYXRhLT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwZGF0YS0+ZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzc3RfaHN3X3N0cmVhbV9nZXRfdm9sdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCwgMCwgJnZvbHVtZSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBoc3dfaXBjX3RvX21peGVyKHZvbHVtZSk7CisJc3N0X2hzd19zdHJlYW1fZ2V0X3ZvbHVtZShoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDAsIDEsICZ2b2x1bWUpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gaHN3X2lwY190b19taXhlcih2b2x1bWUpOworCisJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShwZGF0YS0+ZGV2KTsKKwlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwZGF0YS0+ZGV2KTsKKwltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfdm9sdW1lX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBzbmRfc29jX2tjb250cm9sX3BsYXRmb3JtKGtjb250cm9sKTsKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcGRhdGEgPSBzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHBsYXRmb3JtKTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwl1MzIgdm9sdW1lOworCisJcG1fcnVudGltZV9nZXRfc3luYyhwZGF0YS0+ZGV2KTsKKworCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9PQorCQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSkgeworCisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCQlzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCAwLCBTU1RfSFNXX0NIQU5ORUxTX0FMTCwgdm9sdW1lKTsKKworCX0gZWxzZSB7CisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOworCQlzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCAwLCAwLCB2b2x1bWUpOworCisJCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pOworCQlzc3RfaHN3X21peGVyX3NldF92b2x1bWUoaHN3LCAwLCAxLCB2b2x1bWUpOworCX0KKworCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kocGRhdGEtPmRldik7CisJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQocGRhdGEtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3ZvbHVtZV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX3NvY19rY29udHJvbF9wbGF0Zm9ybShrY29udHJvbCk7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0gc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJdW5zaWduZWQgaW50IHZvbHVtZSA9IDA7CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKHBkYXRhLT5kZXYpOworCXNzdF9oc3dfbWl4ZXJfZ2V0X3ZvbHVtZShoc3csIDAsIDAsICZ2b2x1bWUpOworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaHN3X2lwY190b19taXhlcih2b2x1bWUpOworCisJc3N0X2hzd19taXhlcl9nZXRfdm9sdW1lKGhzdywgMCwgMSwgJnZvbHVtZSk7CisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPSBoc3dfaXBjX3RvX21peGVyKHZvbHVtZSk7CisKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBkYXRhLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHBkYXRhLT5kZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd193YXZlc19zd2l0Y2hfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9zb2Nfa2NvbnRyb2xfcGxhdGZvcm0oa2NvbnRyb2wpOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OworCWVudW0gc3N0X2hzd19tb2R1bGVfaWQgaWQgPSBTU1RfSFNXX01PRFVMRV9XQVZFUzsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0KKwkJKHNzdF9oc3dfaXNfbW9kdWxlX2FjdGl2ZShoc3csIGlkKSB8fAorCQlzc3RfaHN3X2lzX21vZHVsZV9lbmFibGVkX3J0ZDMoaHN3LCBpZCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd193YXZlc19zd2l0Y2hfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9zb2Nfa2NvbnRyb2xfcGxhdGZvcm0oa2NvbnRyb2wpOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OworCWludCByZXQgPSAwOworCWVudW0gc3N0X2hzd19tb2R1bGVfaWQgaWQgPSBTU1RfSFNXX01PRFVMRV9XQVZFUzsKKwlib29sIHN3aXRjaF9vbiA9IChib29sKXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJLyogaWYgbW9kdWxlIGlzIGluIFJBTSBvbiB0aGUgRFNQLCBhcHBseSB1c2VyIHNldHRpbmdzIHRvIG1vZHVsZSB0aHJvdWdoCisJICogaXBjLiBJZiBtb2R1bGUgaXMgbm90IGluIFJBTSBvbiB0aGUgRFNQLCBzdG9yZSB1c2VyIHNldHRpbmcgZm9yCisJICogdHJhY2sgKi8KKwlpZiAoc3N0X2hzd19pc19tb2R1bGVfbG9hZGVkKGhzdywgaWQpKSB7CisJCWlmIChzd2l0Y2hfb24gPT0gc3N0X2hzd19pc19tb2R1bGVfYWN0aXZlKGhzdywgaWQpKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKHN3aXRjaF9vbikKKwkJCXJldCA9IHNzdF9oc3dfbW9kdWxlX2VuYWJsZShoc3csIGlkLCAwKTsKKwkJZWxzZQorCQkJcmV0ID0gc3N0X2hzd19tb2R1bGVfZGlzYWJsZShoc3csIGlkLCAwKTsKKwl9IGVsc2UgeworCQlpZiAoc3dpdGNoX29uID09IHNzdF9oc3dfaXNfbW9kdWxlX2VuYWJsZWRfcnRkMyhoc3csIGlkKSkKKwkJCXJldHVybiAwOworCisJCWlmIChzd2l0Y2hfb24pCisJCQlzc3RfaHN3X3NldF9tb2R1bGVfZW5hYmxlZF9ydGQzKGhzdywgaWQpOworCQllbHNlCisJCQlzc3RfaHN3X3NldF9tb2R1bGVfZGlzYWJsZWRfcnRkMyhoc3csIGlkKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhzd193YXZlc19wYXJhbV9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX3NvY19rY29udHJvbF9wbGF0Zm9ybShrY29udHJvbCk7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0gc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisKKwkvKiByZXR1cm4gYSBtYXRjaGluZyBsaW5lIGZyb20gcGFyYW0gYnVmZmVyICovCisJcmV0dXJuIHNzdF9oc3dfbG9hZF9wYXJhbV9saW5lKGhzdywgdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEpOworfQorCitzdGF0aWMgaW50IGhzd193YXZlc19wYXJhbV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX3NvY19rY29udHJvbF9wbGF0Zm9ybShrY29udHJvbCk7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0gc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJaW50IHJldDsKKwllbnVtIHNzdF9oc3dfbW9kdWxlX2lkIGlkID0gU1NUX0hTV19NT0RVTEVfV0FWRVM7CisJaW50IHBhcmFtX2lkID0gdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGFbMF07CisJaW50IHBhcmFtX3NpemUgPSBXQVZFU19QQVJBTV9DT1VOVDsKKworCS8qIGNsZWFyIHBhcmFtIGJ1ZmZlciBhbmQgcmVzZXQgYnVmZmVyIGluZGV4ICovCisJaWYgKHBhcmFtX2lkID09IDB4RkYpIHsKKwkJc3N0X2hzd19yZXNldF9wYXJhbV9idWYoaHN3KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogc3RvcmUgcGFyYW1zIGludG8gYnVmZmVyICovCisJcmV0ID0gc3N0X2hzd19zdG9yZV9wYXJhbV9saW5lKGhzdywgdWNvbnRyb2wtPnZhbHVlLmJ5dGVzLmRhdGEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHNzdF9oc3dfaXNfbW9kdWxlX2FjdGl2ZShoc3csIGlkKSkKKwkJcmV0ID0gc3N0X2hzd19tb2R1bGVfc2V0X3BhcmFtKGhzdywgaWQsIDAsIHBhcmFtX2lkLAorCQkJCXBhcmFtX3NpemUsIHVjb250cm9sLT52YWx1ZS5ieXRlcy5kYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBUTFYgdXNlZCBieSBib3RoIGdsb2JhbCBhbmQgc3RyZWFtIHZvbHVtZXMgKi8KK3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9TQ0FMRShoc3dfdm9sX3RsdiwgLTkwMDAsIDMwMCwgMSk7CisKKy8qIFN5c3RlbSBQaW4gaGFzIG5vIHZvbHVtZSBjb250cm9sICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgaHN3X3ZvbHVtZV9jb250cm9sc1tdID0geworCS8qIEdsb2JhbCBEU1Agdm9sdW1lICovCisJU09DX0RPVUJMRV9FWFRfVExWKCJNYXN0ZXIgUGxheWJhY2sgVm9sdW1lIiwgMCwgMCwgOCwKKwkJQVJSQVlfU0laRSh2b2x1bWVfbWFwKSAtIDEsIDAsCisJCWhzd192b2x1bWVfZ2V0LCBoc3dfdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAorCS8qIE9mZmxvYWQgMCB2b2x1bWUgKi8KKwlTT0NfRE9VQkxFX0VYVF9UTFYoIk1lZGlhMCBQbGF5YmFjayBWb2x1bWUiLCAxLCAwLCA4LAorCQlBUlJBWV9TSVpFKHZvbHVtZV9tYXApIC0gMSwgMCwKKwkJaHN3X3N0cmVhbV92b2x1bWVfZ2V0LCBoc3dfc3RyZWFtX3ZvbHVtZV9wdXQsIGhzd192b2xfdGx2KSwKKwkvKiBPZmZsb2FkIDEgdm9sdW1lICovCisJU09DX0RPVUJMRV9FWFRfVExWKCJNZWRpYTEgUGxheWJhY2sgVm9sdW1lIiwgMiwgMCwgOCwKKwkJQVJSQVlfU0laRSh2b2x1bWVfbWFwKSAtIDEsIDAsCisJCWhzd19zdHJlYW1fdm9sdW1lX2dldCwgaHN3X3N0cmVhbV92b2x1bWVfcHV0LCBoc3dfdm9sX3RsdiksCisJLyogTWljIENhcHR1cmUgdm9sdW1lICovCisJU09DX0RPVUJMRV9FWFRfVExWKCJNaWMgQ2FwdHVyZSBWb2x1bWUiLCA0LCAwLCA4LAorCQlBUlJBWV9TSVpFKHZvbHVtZV9tYXApIC0gMSwgMCwKKwkJaHN3X3N0cmVhbV92b2x1bWVfZ2V0LCBoc3dfc3RyZWFtX3ZvbHVtZV9wdXQsIGhzd192b2xfdGx2KSwKKwkvKiBlbmFibGUvZGlzYWJsZSBtb2R1bGUgd2F2ZXMgKi8KKwlTT0NfU0lOR0xFX0JPT0xfRVhUKCJXYXZlcyBTd2l0Y2giLCAwLAorCQloc3dfd2F2ZXNfc3dpdGNoX2dldCwgaHN3X3dhdmVzX3N3aXRjaF9wdXQpLAorCS8qIHNldCBwYXJhbWV0ZXJzIHRvIG1vZHVsZSB3YXZlcyAqLworCVNORF9TT0NfQllURVNfRVhUKCJXYXZlcyBTZXQgUGFyYW0iLCBXQVZFU19QQVJBTV9DT1VOVCwKKwkJaHN3X3dhdmVzX3BhcmFtX2dldCwgaHN3X3dhdmVzX3BhcmFtX3B1dCksCit9OworCisvKiBDcmVhdGUgRE1BIGJ1ZmZlciBwYWdlIHRhYmxlIGZvciBEU1AgKi8KK3N0YXRpYyBpbnQgY3JlYXRlX2Fkc3BfcGFnZV90YWJsZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcGRhdGEsIHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCisJdW5zaWduZWQgY2hhciAqZG1hX2FyZWEsIHNpemVfdCBzaXplLCBpbnQgcGNtKQoreworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hYiA9IHNuZF9wY21fZ2V0X2RtYV9idWYoc3Vic3RyZWFtKTsKKwlpbnQgaSwgcGFnZXMsIHN0cmVhbSA9IHN1YnN0cmVhbS0+c3RyZWFtOworCisJcGFnZXMgPSBzbmRfc2didWZfYWxpZ25lZF9wYWdlcyhzaXplKTsKKworCWRldl9kYmcocnRkLT5kZXYsICJnZW5lcmF0aW5nIHBhZ2UgdGFibGUgZm9yICVwIHNpemUgMHglenUgcGFnZXMgJWRcbiIsCisJCWRtYV9hcmVhLCBzaXplLCBwYWdlcyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgeworCQl1MzIgaWR4ID0gKCgoaSA8PCAyKSArIGkpKSA+PiAxOworCQl1MzIgcGZuID0gc25kX3NnYnVmX2dldF9hZGRyKGRtYWIsIGkgKiBQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7CisJCXUzMiAqcGdfdGFibGU7CisKKwkJZGV2X2RiZyhydGQtPmRldiwgInBmbiBpICVpIGlkeCAlZCBwZm4gJXhcbiIsIGksIGlkeCwgcGZuKTsKKworCQlwZ190YWJsZSA9ICh1MzIgKikocGRhdGEtPmRtYWJbcGNtXVtzdHJlYW1dLmFyZWEgKyBpZHgpOworCisJCWlmIChpICYgMSkKKwkJCSpwZ190YWJsZSB8PSAocGZuIDw8IDQpOworCQllbHNlCisJCQkqcGdfdGFibGUgfD0gcGZuOworCX0KKworCXJldHVybiAwOworfQorCisvKiB0aGlzIG1heSBnZXQgY2FsbGVkIHNldmVyYWwgdGltZXMgYnkgb3NzIGVtdWxhdGlvbiAqLworc3RhdGljIGludCBoc3dfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGE7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZV9kYXRhOworCXN0cnVjdCBzc3RfZHNwICpkc3A7CisJc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiOworCWVudW0gc3N0X2hzd19zdHJlYW1fdHlwZSBzdHJlYW1fdHlwZTsKKwllbnVtIHNzdF9oc3dfc3RyZWFtX3BhdGhfaWQgcGF0aF9pZDsKKwl1MzIgcmF0ZSwgYml0cywgbWFwLCBwYWdlcywgbW9kdWxlX2lkOworCXU4IGNoYW5uZWxzOworCWludCByZXQsIGRhaTsKKworCWRhaSA9IG1vZF9tYXBbcnRkLT5jcHVfZGFpLT5pZF0uZGFpX2lkOworCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bZGFpXVtzdWJzdHJlYW0tPnN0cmVhbV07CisKKwkvKiBjaGVjayBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIGEgc3Vic2VxdWVudCB0aW1lICovCisJaWYgKHBjbV9kYXRhLT5hbGxvY2F0ZWQpIHsKKwkJcmV0ID0gc3N0X2hzd19zdHJlYW1fcmVzZXQoaHN3LCBwY21fZGF0YS0+c3RyZWFtKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiZXJyb3I6IHJlc2V0IHN0cmVhbSBmYWlsZWQgJWRcbiIsCisJCQkJcmV0KTsKKworCQlyZXQgPSBzc3RfaHN3X3N0cmVhbV9mcmVlKGhzdywgcGNtX2RhdGEtPnN0cmVhbSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZyZWUgc3RyZWFtIGZhaWxlZCAlZFxuIiwKKwkJCQlyZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlwY21fZGF0YS0+YWxsb2NhdGVkID0gZmFsc2U7CisKKwkJcGNtX2RhdGEtPnN0cmVhbSA9IHNzdF9oc3dfc3RyZWFtX25ldyhoc3csIHJ0ZC0+Y3B1X2RhaS0+aWQsCisJCQloc3dfbm90aWZ5X3BvaW50ZXIsIHBjbV9kYXRhKTsKKwkJaWYgKHBjbV9kYXRhLT5zdHJlYW0gPT0gTlVMTCkgeworCQkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qIHN0cmVhbSBkaXJlY3Rpb24gKi8KKwlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKKwkJcGF0aF9pZCA9IFNTVF9IU1dfU1RSRUFNX1BBVEhfU1NQMF9PVVQ7CisJZWxzZQorCQlwYXRoX2lkID0gU1NUX0hTV19TVFJFQU1fUEFUSF9TU1AwX0lOOworCisJLyogRFNQIHN0cmVhbSB0eXBlIGRlcGVuZHMgb24gREFJIElEICovCisJc3dpdGNoIChydGQtPmNwdV9kYWktPmlkKSB7CisJY2FzZSAwOgorCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgeworCQkJc3RyZWFtX3R5cGUgPSBTU1RfSFNXX1NUUkVBTV9UWVBFX1NZU1RFTTsKKwkJCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTV9TWVNURU07CisJCX0KKwkJZWxzZSB7CisJCQlzdHJlYW1fdHlwZSA9IFNTVF9IU1dfU1RSRUFNX1RZUEVfQ0FQVFVSRTsKKwkJCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTV9DQVBUVVJFOworCQl9CisJCWJyZWFrOworCWNhc2UgMToKKwljYXNlIDI6CisJCXN0cmVhbV90eXBlID0gU1NUX0hTV19TVFJFQU1fVFlQRV9SRU5ERVI7CisJCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQkvKiBwYXRoIElEIG5lZWRzIHRvIGJlIE9VVCBmb3IgbG9vcGJhY2sgKi8KKwkJc3RyZWFtX3R5cGUgPSBTU1RfSFNXX1NUUkVBTV9UWVBFX0xPT1BCQUNLOworCQlwYXRoX2lkID0gU1NUX0hTV19TVFJFQU1fUEFUSF9TU1AwX09VVDsKKwkJbW9kdWxlX2lkID0gU1NUX0hTV19NT0RVTEVfUENNX1JFRkVSRU5DRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBpbnZhbGlkIERBSSBJRCAlZFxuIiwKKwkJCXJ0ZC0+Y3B1X2RhaS0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9OworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fZm9ybWF0KGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJcGF0aF9pZCwgc3RyZWFtX3R5cGUsIFNTVF9IU1dfU1RSRUFNX0ZPUk1BVF9QQ01fRk9STUFUKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBzZXQgZm9ybWF0ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCXJldCA9IHNzdF9oc3dfc3RyZWFtX3NldF9yYXRlKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgcmF0ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBjb3VsZCBub3Qgc2V0IHJhdGUgJWRcbiIsIHJhdGUpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKKwkJYml0cyA9IFNTVF9IU1dfREVQVEhfMTZCSVQ7CisJCXNzdF9oc3dfc3RyZWFtX3NldF92YWxpZChoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDE2KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKKwkJYml0cyA9IFNTVF9IU1dfREVQVEhfMzJCSVQ7CisJCXNzdF9oc3dfc3RyZWFtX3NldF92YWxpZChoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDI0KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1M4OgorCQliaXRzID0gU1NUX0hTV19ERVBUSF84QklUOworCQlzc3RfaHN3X3N0cmVhbV9zZXRfdmFsaWQoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCA4KTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKKwkJYml0cyA9IFNTVF9IU1dfREVQVEhfMzJCSVQ7CisJCXNzdF9oc3dfc3RyZWFtX3NldF92YWxpZChoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDMyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBpbnZhbGlkIGZvcm1hdCAlZFxuIiwKKwkJCXBhcmFtc19mb3JtYXQocGFyYW1zKSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHNzdF9oc3dfc3RyZWFtX3NldF9iaXRzKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgYml0cyk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBjb3VsZCBub3Qgc2V0IGJpdHMgJWRcbiIsIGJpdHMpOworCQlyZXR1cm4gcmV0OworCX0KKworCWNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7CisJbWFwID0gY3JlYXRlX2NoYW5uZWxfbWFwKFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfU1RFUkVPKTsKKwlzc3RfaHN3X3N0cmVhbV9zZXRfbWFwX2NvbmZpZyhoc3csIHBjbV9kYXRhLT5zdHJlYW0sCisJCQltYXAsIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfU1RFUkVPKTsKKworCXJldCA9IHNzdF9oc3dfc3RyZWFtX3NldF9jaGFubmVscyhoc3csIHBjbV9kYXRhLT5zdHJlYW0sIGNoYW5uZWxzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGNvdWxkIG5vdCBzZXQgY2hhbm5lbHMgJWRcbiIsCisJCQljaGFubmVscyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgUENNICVkXG4iLAorCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWRtYWIgPSBzbmRfcGNtX2dldF9kbWFfYnVmKHN1YnN0cmVhbSk7CisKKwlyZXQgPSBjcmVhdGVfYWRzcF9wYWdlX3RhYmxlKHN1YnN0cmVhbSwgcGRhdGEsIHJ0ZCwgcnVudGltZS0+ZG1hX2FyZWEsCisJCXJ1bnRpbWUtPmRtYV9ieXRlcywgcnRkLT5jcHVfZGFpLT5pZCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzc3RfaHN3X3N0cmVhbV9zZXRfc3R5bGUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQlTU1RfSFNXX0lOVEVSTEVBVklOR19QRVJfQ0hBTk5FTCk7CisKKwlpZiAocnVudGltZS0+ZG1hX2J5dGVzICUgUEFHRV9TSVpFKQorCQlwYWdlcyA9IChydW50aW1lLT5kbWFfYnl0ZXMgLyBQQUdFX1NJWkUpICsgMTsKKwllbHNlCisJCXBhZ2VzID0gcnVudGltZS0+ZG1hX2J5dGVzIC8gUEFHRV9TSVpFOworCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fYnVmZmVyKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKKwkJcGRhdGEtPmRtYWJbcnRkLT5jcHVfZGFpLT5pZF1bc3Vic3RyZWFtLT5zdHJlYW1dLmFkZHIsCisJCXBhZ2VzLCBydW50aW1lLT5kbWFfYnl0ZXMsIDAsCisJCXNuZF9zZ2J1Zl9nZXRfYWRkcihkbWFiLCAwKSA+PiBQQUdFX1NISUZUKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBzZXQgRE1BIGJ1ZmZlciAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkc3AgPSBzc3RfaHN3X2dldF9kc3AoaHN3KTsKKworCW1vZHVsZV9kYXRhID0gc3N0X21vZHVsZV9nZXRfZnJvbV9pZChkc3AsIG1vZHVsZV9pZCk7CisJaWYgKG1vZHVsZV9kYXRhID09IE5VTEwpIHsKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gZ2V0IG1vZHVsZSBjb25maWdcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzc3RfaHN3X3N0cmVhbV9zZXRfbW9kdWxlX2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAorCQlwY21fZGF0YS0+cnVudGltZSk7CisKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9jb21taXQoaHN3LCBwY21fZGF0YS0+c3RyZWFtKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBjb21taXQgc3RyZWFtICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghcGNtX2RhdGEtPmFsbG9jYXRlZCkgeworCQkvKiBTZXQgcHJldmlvdXMgc2F2ZWQgdm9sdW1lICovCisJCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLAorCQkJCTAsIHBjbV9kYXRhLT52b2x1bWVbMF0pOworCQlzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCwKKwkJCQkxLCBwY21fZGF0YS0+dm9sdW1lWzFdKTsKKwkJcGNtX2RhdGEtPmFsbG9jYXRlZCA9IHRydWU7CisJfQorCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fcGF1c2UoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAxKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gcGF1c2UgJWRcbiIsIHJldCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd19wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YTsKKwlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnNzdF9zdHJlYW07CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzbmRfcGNtX3VmcmFtZXNfdCBwb3M7CisJaW50IGRhaTsKKworCWRhaSA9IG1vZF9tYXBbcnRkLT5jcHVfZGFpLT5pZF0uZGFpX2lkOworCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bZGFpXVtzdWJzdHJlYW0tPnN0cmVhbV07CisJc3N0X3N0cmVhbSA9IHBjbV9kYXRhLT5zdHJlYW07CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgorCQlzc3RfaHN3X3N0cmVhbV9zZXRfc2lsZW5jZV9zdGFydChoc3csIHNzdF9zdHJlYW0sIGZhbHNlKTsKKwkJc3N0X2hzd19zdHJlYW1fcmVzdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCk7CisJCWJyZWFrOworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgorCQlzc3RfaHN3X3N0cmVhbV9zZXRfc2lsZW5jZV9zdGFydChoc3csIHNzdF9zdHJlYW0sIGZhbHNlKTsKKwkJc3N0X2hzd19zdHJlYW1fcGF1c2UoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9EUkFJTjoKKwkJcG9zID0gcnVudGltZS0+Y29udHJvbC0+YXBwbF9wdHIgJSBydW50aW1lLT5idWZmZXJfc2l6ZTsKKwkJc3N0X2hzd19zdHJlYW1fc2V0X29sZF9wb3NpdGlvbihoc3csIHBjbV9kYXRhLT5zdHJlYW0sIHBvcyk7CisJCXNzdF9oc3dfc3RyZWFtX3NldF9zaWxlbmNlX3N0YXJ0KGhzdywgc3N0X3N0cmVhbSwgdHJ1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdTMyIGhzd19ub3RpZnlfcG9pbnRlcihzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YSA9IGRhdGE7CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwY21fZGF0YS0+c3Vic3RyZWFtOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJdTMyIHBvczsKKwlzbmRfcGNtX3VmcmFtZXNfdCBwb3NpdGlvbiA9IGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLAorCQkgc3N0X2hzd19nZXRfZHNwX3Bvc2l0aW9uKGhzdywgcGNtX2RhdGEtPnN0cmVhbSkpOworCXVuc2lnbmVkIGNoYXIgKmRtYV9hcmVhID0gcnVudGltZS0+ZG1hX2FyZWE7CisJc25kX3BjbV91ZnJhbWVzX3QgZG1hX2ZyYW1lcyA9CisJCWJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBydW50aW1lLT5kbWFfYnl0ZXMpOworCXNuZF9wY21fdWZyYW1lc190IG9sZF9wb3NpdGlvbjsKKwlzc2l6ZV90IHNhbXBsZXM7CisKKwlwb3MgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwKKwkJKHJ1bnRpbWUtPmNvbnRyb2wtPmFwcGxfcHRyICUgcnVudGltZS0+YnVmZmVyX3NpemUpKTsKKworCWRldl92ZGJnKHJ0ZC0+ZGV2LCAiUENNOiBBcHAgcG9pbnRlciAlZCBieXRlc1xuIiwgcG9zKTsKKworCS8qIFNTVCBmdyBkb24ndCBrbm93IHdoZXJlIHRvIHN0b3AgZG1hCisJICogU28sIFNTVCBkcml2ZXIgbmVlZCB0byBjbGVhbiB0aGUgZGF0YSB3aGljaCBoYXMgYmVlbiBjb25zdW1lZAorCSAqLworCWlmIChkbWFfYXJlYSA9PSBOVUxMIHx8IGRtYV9mcmFtZXMgPD0gMAorCQl8fCAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQorCQl8fCAhc3N0X2hzd19zdHJlYW1fZ2V0X3NpbGVuY2Vfc3RhcnQoaHN3LCBzdHJlYW0pKSB7CisJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKKwkJcmV0dXJuIHBvczsKKwl9CisKKwlvbGRfcG9zaXRpb24gPSBzc3RfaHN3X3N0cmVhbV9nZXRfb2xkX3Bvc2l0aW9uKGhzdywgc3RyZWFtKTsKKwlpZiAocG9zaXRpb24gPiBvbGRfcG9zaXRpb24pIHsKKwkJaWYgKHBvc2l0aW9uIDwgZG1hX2ZyYW1lcykgeworCQkJc2FtcGxlcyA9IFNTVF9TQU1QTEVTKHJ1bnRpbWUsIHBvc2l0aW9uIC0gb2xkX3Bvc2l0aW9uKTsKKwkJCXNuZF9wY21fZm9ybWF0X3NldF9zaWxlbmNlKHJ1bnRpbWUtPmZvcm1hdCwKKwkJCQlTU1RfT0xEX1BPU0lUSU9OKGRtYV9hcmVhLAorCQkJCQlydW50aW1lLCBvbGRfcG9zaXRpb24pLAorCQkJCXNhbXBsZXMpOworCQl9IGVsc2UKKwkJCWRldl9lcnIocnRkLT5kZXYsICJQQ006IHBvc2l0aW9uIGlzIHdyb25nXG4iKTsKKwl9IGVsc2UgeworCQlpZiAob2xkX3Bvc2l0aW9uIDwgZG1hX2ZyYW1lcykgeworCQkJc2FtcGxlcyA9IFNTVF9TQU1QTEVTKHJ1bnRpbWUsCisJCQkJZG1hX2ZyYW1lcyAtIG9sZF9wb3NpdGlvbik7CisJCQlzbmRfcGNtX2Zvcm1hdF9zZXRfc2lsZW5jZShydW50aW1lLT5mb3JtYXQsCisJCQkJU1NUX09MRF9QT1NJVElPTihkbWFfYXJlYSwKKwkJCQkJcnVudGltZSwgb2xkX3Bvc2l0aW9uKSwKKwkJCQlzYW1wbGVzKTsKKwkJfSBlbHNlCisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiUENNOiBkbWFfYnl0ZXMgaXMgd3JvbmdcbiIpOworCQlpZiAocG9zaXRpb24gPCBkbWFfZnJhbWVzKSB7CisJCQlzYW1wbGVzID0gU1NUX1NBTVBMRVMocnVudGltZSwgcG9zaXRpb24pOworCQkJc25kX3BjbV9mb3JtYXRfc2V0X3NpbGVuY2UocnVudGltZS0+Zm9ybWF0LAorCQkJCWRtYV9hcmVhLCBzYW1wbGVzKTsKKwkJfSBlbHNlCisJCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiUENNOiBwb3NpdGlvbiBpcyB3cm9uZ1xuIik7CisJfQorCXNzdF9oc3dfc3RyZWFtX3NldF9vbGRfcG9zaXRpb24oaHN3LCBzdHJlYW0sIHBvc2l0aW9uKTsKKworCS8qIGxldCBhbHNhIGtub3cgd2UgaGF2ZSBwbGF5IGEgcGVyaW9kICovCisJc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOworCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBoc3dfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwlzbmRfcGNtX3VmcmFtZXNfdCBvZmZzZXQ7CisJdWludDY0X3QgcHBvczsKKwl1MzIgcG9zaXRpb247CisJaW50IGRhaTsKKworCWRhaSA9IG1vZF9tYXBbcnRkLT5jcHVfZGFpLT5pZF0uZGFpX2lkOworCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bZGFpXVtzdWJzdHJlYW0tPnN0cmVhbV07CisJcG9zaXRpb24gPSBzc3RfaHN3X2dldF9kc3BfcG9zaXRpb24oaHN3LCBwY21fZGF0YS0+c3RyZWFtKTsKKworCW9mZnNldCA9IGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBwb3NpdGlvbik7CisJcHBvcyA9IHNzdF9oc3dfZ2V0X2RzcF9wcmVzZW50YXRpb25fcG9zaXRpb24oaHN3LCBwY21fZGF0YS0+c3RyZWFtKTsKKworCWRldl92ZGJnKHJ0ZC0+ZGV2LCAiUENNOiBETUEgcG9pbnRlciAlZHUgYnl0ZXMsIHBvcyAlbGx1XG4iLAorCQlwb3NpdGlvbiwgcHBvcyk7CisJcmV0dXJuIG9mZnNldDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7CisJc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGE7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJaW50IGRhaTsKKworCWRhaSA9IG1vZF9tYXBbcnRkLT5jcHVfZGFpLT5pZF0uZGFpX2lkOworCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bZGFpXVtzdWJzdHJlYW0tPnN0cmVhbV07CisKKwltdXRleF9sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMocGRhdGEtPmRldik7CisKKwlzbmRfc29jX3BjbV9zZXRfZHJ2ZGF0YShydGQsIHBjbV9kYXRhKTsKKwlwY21fZGF0YS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOworCisJc25kX3NvY19zZXRfcnVudGltZV9od3BhcmFtcyhzdWJzdHJlYW0sICZoc3dfcGNtX2hhcmR3YXJlKTsKKworCXBjbV9kYXRhLT5zdHJlYW0gPSBzc3RfaHN3X3N0cmVhbV9uZXcoaHN3LCBydGQtPmNwdV9kYWktPmlkLAorCQloc3dfbm90aWZ5X3BvaW50ZXIsIHBjbV9kYXRhKTsKKwlpZiAocGNtX2RhdGEtPnN0cmVhbSA9PSBOVUxMKSB7CisJCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGNyZWF0ZSBzdHJlYW1cbiIpOworCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBkYXRhLT5kZXYpOworCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwZGF0YS0+ZGV2KTsKKwkJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHN3X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwlpbnQgcmV0LCBkYWk7CisKKwlkYWkgPSBtb2RfbWFwW3J0ZC0+Y3B1X2RhaS0+aWRdLmRhaV9pZDsKKwlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW2RhaV1bc3Vic3RyZWFtLT5zdHJlYW1dOworCisJbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXQgPSBzc3RfaHN3X3N0cmVhbV9yZXNldChoc3csIHBjbV9kYXRhLT5zdHJlYW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcocnRkLT5kZXYsICJlcnJvcjogcmVzZXQgc3RyZWFtIGZhaWxlZCAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gc3N0X2hzd19zdHJlYW1fZnJlZShoc3csIHBjbV9kYXRhLT5zdHJlYW0pOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcocnRkLT5kZXYsICJlcnJvcjogZnJlZSBzdHJlYW0gZmFpbGVkICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJcGNtX2RhdGEtPmFsbG9jYXRlZCA9IDA7CisJcGNtX2RhdGEtPnN0cmVhbSA9IE5VTEw7CisKK291dDoKKwlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBkYXRhLT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHBkYXRhLT5kZXYpOworCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGhzd19wY21fb3BzID0geworCS5vcGVuCQk9IGhzd19wY21fb3BlbiwKKwkuY2xvc2UJCT0gaHN3X3BjbV9jbG9zZSwKKwkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCisJLmh3X3BhcmFtcwk9IGhzd19wY21faHdfcGFyYW1zLAorCS5od19mcmVlCT0gaHN3X3BjbV9od19mcmVlLAorCS50cmlnZ2VyCT0gaHN3X3BjbV90cmlnZ2VyLAorCS5wb2ludGVyCT0gaHN3X3BjbV9wb2ludGVyLAorCS5wYWdlCQk9IHNuZF9wY21fc2didWZfb3BzX3BhZ2UsCit9OworCitzdGF0aWMgaW50IGhzd19wY21fY3JlYXRlX21vZHVsZXMoc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhKQoreworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OworCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW9kX21hcCk7IGkrKykgeworCQlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW21vZF9tYXBbaV0uZGFpX2lkXVttb2RfbWFwW2ldLnN0cmVhbV07CisKKwkJLyogY3JlYXRlIG5ldyBydW50aW1lIG1vZHVsZSwgdXNlIHNhbWUgb2Zmc2V0IGlmIHJlY3JlYXRlZCAqLworCQlwY21fZGF0YS0+cnVudGltZSA9IHNzdF9oc3dfcnVudGltZV9tb2R1bGVfY3JlYXRlKGhzdywKKwkJCW1vZF9tYXBbaV0ubW9kX2lkLCBwY21fZGF0YS0+cGVyc2lzdGVudF9vZmZzZXQpOworCQlpZiAocGNtX2RhdGEtPnJ1bnRpbWUgPT0gTlVMTCkKKwkJCWdvdG8gZXJyOworCQlwY21fZGF0YS0+cGVyc2lzdGVudF9vZmZzZXQgPQorCQkJcGNtX2RhdGEtPnJ1bnRpbWUtPnBlcnNpc3RlbnRfb2Zmc2V0OworCX0KKworCS8qIGNyZWF0ZSBydW50aW1lIGJsb2NrcyBmb3IgbW9kdWxlIHdhdmVzICovCisJaWYgKHNzdF9oc3dfaXNfbW9kdWxlX2xvYWRlZChoc3csIFNTVF9IU1dfTU9EVUxFX1dBVkVTKSkgeworCQlwZGF0YS0+cnVudGltZV93YXZlcyA9IHNzdF9oc3dfcnVudGltZV9tb2R1bGVfY3JlYXRlKGhzdywKKwkJCVNTVF9IU1dfTU9EVUxFX1dBVkVTLCAwKTsKKwkJaWYgKHBkYXRhLT5ydW50aW1lX3dhdmVzID09IE5VTEwpCisJCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWZvciAoLS1pOyBpID49IDA7IGktLSkgeworCQlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW21vZF9tYXBbaV0uZGFpX2lkXVttb2RfbWFwW2ldLnN0cmVhbV07CisJCXNzdF9oc3dfcnVudGltZV9tb2R1bGVfZnJlZShwY21fZGF0YS0+cnVudGltZSk7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIGhzd19wY21fZnJlZV9tb2R1bGVzKHN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSkKK3sKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vZF9tYXApOyBpKyspIHsKKwkJcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVttb2RfbWFwW2ldLmRhaV9pZF1bbW9kX21hcFtpXS5zdHJlYW1dOworCQlzc3RfaHN3X3J1bnRpbWVfbW9kdWxlX2ZyZWUocGNtX2RhdGEtPnJ1bnRpbWUpOworCX0KKwlpZiAoc3N0X2hzd19pc19tb2R1bGVfbG9hZGVkKGhzdywgU1NUX0hTV19NT0RVTEVfV0FWRVMpKSB7CisJCXNzdF9oc3dfcnVudGltZV9tb2R1bGVfZnJlZShwZGF0YS0+cnVudGltZV93YXZlcyk7CisJfQorfQorCitzdGF0aWMgaW50IGhzd19wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOworCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07CisJc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHBsYXRmb3JtLT5kZXYpOworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwcml2X2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEocGxhdGZvcm0tPmRldik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcGRhdGEtPmRtYV9kZXY7CisJaW50IHJldCA9IDA7CisKKwlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSB8fAorCQkJcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7CisJCXJldCA9IHNuZF9wY21fbGliX3ByZWFsbG9jYXRlX3BhZ2VzX2Zvcl9hbGwocGNtLAorCQkJU05EUlZfRE1BX1RZUEVfREVWX1NHLAorCQkJZGV2LAorCQkJaHN3X3BjbV9oYXJkd2FyZS5idWZmZXJfYnl0ZXNfbWF4LAorCQkJaHN3X3BjbV9oYXJkd2FyZS5idWZmZXJfYnl0ZXNfbWF4KTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycihydGQtPmRldiwgImRtYSBidWZmZXIgYWxsb2NhdGlvbiBmYWlsZWQgJWRcbiIsCisJCQkJcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0pCisJCXByaXZfZGF0YS0+cGNtW3J0ZC0+Y3B1X2RhaS0+aWRdW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLmhzd19wY20gPSBwY207CisJaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLnN1YnN0cmVhbSkKKwkJcHJpdl9kYXRhLT5wY21bcnRkLT5jcHVfZGFpLT5pZF1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5oc3dfcGNtID0gcGNtOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBIU1dfRk9STUFUUyBcCisJKFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUpCisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19kYWlfZHJpdmVyIGhzd19kYWlzW10gPSB7CisJeworCQkubmFtZSAgPSAiU3lzdGVtIFBpbiIsCisJCS5pZCA9IEhTV19QQ01fREFJX0lEX1NZU1RFTSwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIlN5c3RlbSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCisJCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCisJCX0sCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkFuYWxvZyBDYXB0dXJlIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDQsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKKwkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKKwkJfSwKKwl9LAorCXsKKwkJLyogUENNICovCisJCS5uYW1lICA9ICJPZmZsb2FkMCBQaW4iLAorCQkuaWQgPSBIU1dfUENNX0RBSV9JRF9PRkZMT0FEMCwKKwkJLnBsYXliYWNrID0geworCQkJLnN0cmVhbV9uYW1lID0gIk9mZmxvYWQwIFBsYXliYWNrIiwKKwkJCS5jaGFubmVsc19taW4gPSAyLAorCQkJLmNoYW5uZWxzX21heCA9IDIsCisJCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKKwkJCS5mb3JtYXRzID0gSFNXX0ZPUk1BVFMsCisJCX0sCisJfSwKKwl7CisJCS8qIFBDTSAqLworCQkubmFtZSAgPSAiT2ZmbG9hZDEgUGluIiwKKwkJLmlkID0gSFNXX1BDTV9EQUlfSURfT0ZGTE9BRDEsCisJCS5wbGF5YmFjayA9IHsKKwkJCS5zdHJlYW1fbmFtZSA9ICJPZmZsb2FkMSBQbGF5YmFjayIsCisJCQkuY2hhbm5lbHNfbWluID0gMiwKKwkJCS5jaGFubmVsc19tYXggPSAyLAorCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJCQkuZm9ybWF0cyA9IEhTV19GT1JNQVRTLAorCQl9LAorCX0sCisJeworCQkubmFtZSAgPSAiTG9vcGJhY2sgUGluIiwKKwkJLmlkID0gSFNXX1BDTV9EQUlfSURfTE9PUEJBQ0ssCisJCS5jYXB0dXJlID0geworCQkJLnN0cmVhbV9uYW1lID0gIkxvb3BiYWNrIENhcHR1cmUiLAorCQkJLmNoYW5uZWxzX21pbiA9IDIsCisJCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAorCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd2lkZ2V0c1tdID0geworCisJLyogQmFja2VuZCBEQUlzICAqLworCVNORF9TT0NfREFQTV9BSUZfSU4oIlNTUDAgQ09ERUMgSU4iLCBOVUxMLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAorCVNORF9TT0NfREFQTV9BSUZfT1VUKCJTU1AwIENPREVDIE9VVCIsIE5VTEwsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9JTigiU1NQMSBCVCBJTiIsIE5VTEwsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCisJU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNTUDEgQlQgT1VUIiwgTlVMTCwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKKworCS8qIEdsb2JhbCBQbGF5YmFjayBNaXhlciAqLworCVNORF9TT0NfREFQTV9NSVhFUigiUGxheWJhY2sgVk1peGVyIiwgU05EX1NPQ19OT1BNLCAwLCAwLCBOVUxMLCAwKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIGdyYXBoW10gPSB7CisKKwkvKiBQbGF5YmFjayBNaXhlciAqLworCXsiUGxheWJhY2sgVk1peGVyIiwgTlVMTCwgIlN5c3RlbSBQbGF5YmFjayJ9LAorCXsiUGxheWJhY2sgVk1peGVyIiwgTlVMTCwgIk9mZmxvYWQwIFBsYXliYWNrIn0sCisJeyJQbGF5YmFjayBWTWl4ZXIiLCBOVUxMLCAiT2ZmbG9hZDEgUGxheWJhY2sifSwKKworCXsiU1NQMCBDT0RFQyBPVVQiLCBOVUxMLCAiUGxheWJhY2sgVk1peGVyIn0sCisKKwl7IkFuYWxvZyBDYXB0dXJlIiwgTlVMTCwgIlNTUDAgQ09ERUMgSU4ifSwKK307CisKK3N0YXRpYyBpbnQgaHN3X3BjbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCit7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnByaXZfZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOworCXN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhID0gZGV2X2dldF9wbGF0ZGF0YShwbGF0Zm9ybS0+ZGV2KTsKKwlzdHJ1Y3QgZGV2aWNlICpkbWFfZGV2LCAqZGV2OworCWludCBpLCByZXQgPSAwOworCisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXYgPSBwbGF0Zm9ybS0+ZGV2OworCWRtYV9kZXYgPSBwZGF0YS0+ZG1hX2RldjsKKworCXByaXZfZGF0YS0+aHN3ID0gcGRhdGEtPmRzcDsKKwlwcml2X2RhdGEtPmRldiA9IHBsYXRmb3JtLT5kZXY7CisJcHJpdl9kYXRhLT5wbV9zdGF0ZSA9IEhTV19QTV9TVEFURV9EMDsKKwlwcml2X2RhdGEtPnNvY19jYXJkID0gcGxhdGZvcm0tPmNvbXBvbmVudC5jYXJkOworCisJLyogYWxsb2NhdGUgRFNQIGJ1ZmZlciBwYWdlIHRhYmxlcyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhzd19kYWlzKTsgaSsrKSB7CisKKwkJLyogcGxheWJhY2sgKi8KKwkJaWYgKGhzd19kYWlzW2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbikgeworCQkJbXV0ZXhfaW5pdCgmcHJpdl9kYXRhLT5wY21baV1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10ubXV0ZXgpOworCQkJcmV0ID0gc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIGRtYV9kZXYsCisJCQkJUEFHRV9TSVpFLCAmcHJpdl9kYXRhLT5kbWFiW2ldWzBdKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gZXJyOworCQl9CisKKwkJLyogY2FwdHVyZSAqLworCQlpZiAoaHN3X2RhaXNbaV0uY2FwdHVyZS5jaGFubmVsc19taW4pIHsKKwkJCW11dGV4X2luaXQoJnByaXZfZGF0YS0+cGNtW2ldW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0ubXV0ZXgpOworCQkJcmV0ID0gc25kX2RtYV9hbGxvY19wYWdlcyhTTkRSVl9ETUFfVFlQRV9ERVYsIGRtYV9kZXYsCisJCQkJUEFHRV9TSVpFLCAmcHJpdl9kYXRhLT5kbWFiW2ldWzFdKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gZXJyOworCQl9CisJfQorCisJLyogYWxsb2NhdGUgcnVudGltZSBtb2R1bGVzICovCisJcmV0ID0gaHN3X3BjbV9jcmVhdGVfbW9kdWxlcyhwcml2X2RhdGEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCS8qIGVuYWJsZSBydW50aW1lIFBNIHdpdGggYXV0byBzdXNwZW5kICovCisJcG1fcnVudGltZV9zZXRfYXV0b3N1c3BlbmRfZGVsYXkocGxhdGZvcm0tPmRldiwKKwkJU1NUX1JVTlRJTUVfU1VTUEVORF9ERUxBWSk7CisJcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQocGxhdGZvcm0tPmRldik7CisJcG1fcnVudGltZV9lbmFibGUocGxhdGZvcm0tPmRldik7CisJcG1fcnVudGltZV9pZGxlKHBsYXRmb3JtLT5kZXYpOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlmb3IgKC0taTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKGhzd19kYWlzW2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbikKKwkJCXNuZF9kbWFfZnJlZV9wYWdlcygmcHJpdl9kYXRhLT5kbWFiW2ldWzBdKTsKKwkJaWYgKGhzd19kYWlzW2ldLmNhcHR1cmUuY2hhbm5lbHNfbWluKQorCQkJc25kX2RtYV9mcmVlX3BhZ2VzKCZwcml2X2RhdGEtPmRtYWJbaV1bMV0pOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhzd19wY21fcmVtb3ZlKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSkKK3sKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcHJpdl9kYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7CisJaW50IGk7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUocGxhdGZvcm0tPmRldik7CisJaHN3X3BjbV9mcmVlX21vZHVsZXMocHJpdl9kYXRhKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhzd19kYWlzKTsgaSsrKSB7CisJCWlmIChoc3dfZGFpc1tpXS5wbGF5YmFjay5jaGFubmVsc19taW4pCisJCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJnByaXZfZGF0YS0+ZG1hYltpXVswXSk7CisJCWlmIChoc3dfZGFpc1tpXS5jYXB0dXJlLmNoYW5uZWxzX21pbikKKwkJCXNuZF9kbWFfZnJlZV9wYWdlcygmcHJpdl9kYXRhLT5kbWFiW2ldWzFdKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBoc3dfc29jX3BsYXRmb3JtID0geworCS5wcm9iZQkJPSBoc3dfcGNtX3Byb2JlLAorCS5yZW1vdmUJCT0gaHN3X3BjbV9yZW1vdmUsCisJLm9wcwkJPSAmaHN3X3BjbV9vcHMsCisJLnBjbV9uZXcJPSBoc3dfcGNtX25ldywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIGhzd19kYWlfY29tcG9uZW50ID0geworCS5uYW1lID0gImhhc3dlbGwtZGFpIiwKKwkuY29udHJvbHMgPSBoc3dfdm9sdW1lX2NvbnRyb2xzLAorCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGhzd192b2x1bWVfY29udHJvbHMpLAorCS5kYXBtX3dpZGdldHMgPSB3aWRnZXRzLAorCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3aWRnZXRzKSwKKwkuZGFwbV9yb3V0ZXMgPSBncmFwaCwKKwkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShncmFwaCksCit9OworCitzdGF0aWMgaW50IGhzd19wY21fZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcHJpdl9kYXRhOworCWludCByZXQ7CisKKwlpZiAoIXNzdF9wZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcml2X2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcml2X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXZfZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBzc3RfaHN3X2RzcF9pbml0KCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiAtRU5PREVWOworCisJcHJpdl9kYXRhLT5oc3cgPSBzc3RfcGRhdGEtPmRzcDsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2X2RhdGEpOworCisJcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LCAmaHN3X3NvY19wbGF0Zm9ybSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3BsYXQ7CisKKwlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAmaHN3X2RhaV9jb21wb25lbnQsCisJCWhzd19kYWlzLCBBUlJBWV9TSVpFKGhzd19kYWlzKSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2NvbXA7CisKKwlyZXR1cm4gMDsKKworZXJyX2NvbXA6CisJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOworZXJyX3BsYXQ6CisJc3N0X2hzd19kc3BfZnJlZSgmcGRldi0+ZGV2LCBzc3RfcGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd19wY21fZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzc3RfcGRhdGEgKnNzdF9wZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7CisKKwlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7CisJc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKKwlzc3RfaHN3X2RzcF9mcmVlKCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgaW50IGhzd19wY21fcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoc3dfcGNtX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7CisJaW50IHJldDsKKworCWlmIChwZGF0YS0+cG1fc3RhdGUgPj0gSFNXX1BNX1NUQVRFX1JURDMpCisJCXJldHVybiAwOworCisJLyogZncgbW9kdWxlcyB3aWxsIGJlIHVubG9hZGVkIG9uIFJURDMsIHNldCBmbGFnIHRvIHRyYWNrICovCisJaWYgKHNzdF9oc3dfaXNfbW9kdWxlX2FjdGl2ZShoc3csIFNTVF9IU1dfTU9EVUxFX1dBVkVTKSkgeworCQlyZXQgPSBzc3RfaHN3X21vZHVsZV9kaXNhYmxlKGhzdywgU1NUX0hTV19NT0RVTEVfV0FWRVMsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXNzdF9oc3dfc2V0X21vZHVsZV9lbmFibGVkX3J0ZDMoaHN3LCBTU1RfSFNXX01PRFVMRV9XQVZFUyk7CisJfQorCXNzdF9oc3dfZHNwX3J1bnRpbWVfc3VzcGVuZChoc3cpOworCXNzdF9oc3dfZHNwX3J1bnRpbWVfc2xlZXAoaHN3KTsKKwlwZGF0YS0+cG1fc3RhdGUgPSBIU1dfUE1fU1RBVEVfUlREMzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhzd19wY21fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OworCWludCByZXQ7CisKKwlpZiAocGRhdGEtPnBtX3N0YXRlICE9IEhTV19QTV9TVEFURV9SVEQzKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHNzdF9oc3dfZHNwX2xvYWQoaHN3KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWxvYWQgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gaHN3X3BjbV9jcmVhdGVfbW9kdWxlcyhwZGF0YSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIG1vZHVsZXMgJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc3N0X2hzd19kc3BfcnVudGltZV9yZXN1bWUoaHN3KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwllbHNlIGlmIChyZXQgPT0gMSkgLyogbm8gYWN0aW9uIHJlcXVpcmVkICovCisJCXJldHVybiAwOworCisJLyogY2hlY2sgZmxhZyB3aGVuIHJlc3VtZSAqLworCWlmIChzc3RfaHN3X2lzX21vZHVsZV9lbmFibGVkX3J0ZDMoaHN3LCBTU1RfSFNXX01PRFVMRV9XQVZFUykpIHsKKwkJcmV0ID0gc3N0X2hzd19tb2R1bGVfZW5hYmxlKGhzdywgU1NUX0hTV19NT0RVTEVfV0FWRVMsIDApOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCS8qIHB1dCBwYXJhbWV0ZXJzIGZyb20gYnVmZmVyIHRvIGRzcCAqLworCQlyZXQgPSBzc3RfaHN3X2xhdW5jaF9wYXJhbV9idWYoaHN3KTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQkvKiB1bnNldCBmbGFnICovCisJCXNzdF9oc3dfc2V0X21vZHVsZV9kaXNhYmxlZF9ydGQzKGhzdywgU1NUX0hTV19NT0RVTEVfV0FWRVMpOworCX0KKworCXBkYXRhLT5wbV9zdGF0ZSA9IEhTV19QTV9TVEFURV9EMDsKKwlyZXR1cm4gcmV0OworfQorCisjZWxzZQorI2RlZmluZSBoc3dfcGNtX3J1bnRpbWVfaWRsZQkJTlVMTAorI2RlZmluZSBoc3dfcGNtX3J1bnRpbWVfc3VzcGVuZAkJTlVMTAorI2RlZmluZSBoc3dfcGNtX3J1bnRpbWVfcmVzdW1lCQlOVUxMCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgdm9pZCBoc3dfcGNtX2NvbXBsZXRlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKKwlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YTsKKwlpbnQgaSwgZXJyOworCisJaWYgKHBkYXRhLT5wbV9zdGF0ZSAhPSBIU1dfUE1fU1RBVEVfRDMpCisJCXJldHVybjsKKworCWVyciA9IHNzdF9oc3dfZHNwX2xvYWQoaHN3KTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWxvYWQgJWRcbiIsIGVycik7CisJCXJldHVybjsKKwl9CisKKwllcnIgPSBoc3dfcGNtX2NyZWF0ZV9tb2R1bGVzKHBkYXRhKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBjcmVhdGUgbW9kdWxlcyAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vZF9tYXApOyBpKyspIHsKKwkJcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVttb2RfbWFwW2ldLmRhaV9pZF1bbW9kX21hcFtpXS5zdHJlYW1dOworCisJCWlmICghcGNtX2RhdGEtPnN1YnN0cmVhbSkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IHNzdF9tb2R1bGVfcnVudGltZV9yZXN0b3JlKHBjbV9kYXRhLT5ydW50aW1lLAorCQkJJnBjbV9kYXRhLT5jb250ZXh0KTsKKwkJaWYgKGVyciA8IDApCisJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZXN0b3JlIGNvbnRleHQgZm9yIFBDTSAlZFxuIiwgaSk7CisJfQorCisJc25kX3NvY19yZXN1bWUocGRhdGEtPnNvY19jYXJkLT5kZXYpOworCisJZXJyID0gc3N0X2hzd19kc3BfcnVudGltZV9yZXN1bWUoaHN3KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuOworCWVsc2UgaWYgKGVyciA9PSAxKSAvKiBubyBhY3Rpb24gcmVxdWlyZWQgKi8KKwkJcmV0dXJuOworCisJcGRhdGEtPnBtX3N0YXRlID0gSFNXX1BNX1NUQVRFX0QwOworCXJldHVybjsKK30KKworc3RhdGljIGludCBoc3dfcGNtX3ByZXBhcmUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OworCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhOworCWludCBpLCBlcnI7CisKKwlpZiAocGRhdGEtPnBtX3N0YXRlID09IEhTV19QTV9TVEFURV9EMykKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAocGRhdGEtPnBtX3N0YXRlID09IEhTV19QTV9TVEFURV9EMCkgeworCQkvKiBzdXNwZW5kIGFsbCBhY3RpdmUgc3RyZWFtcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtb2RfbWFwKTsgaSsrKSB7CisJCQlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW21vZF9tYXBbaV0uZGFpX2lkXVttb2RfbWFwW2ldLnN0cmVhbV07CisKKwkJCWlmICghcGNtX2RhdGEtPnN1YnN0cmVhbSkKKwkJCQljb250aW51ZTsKKwkJCWRldl9kYmcoZGV2LCAic3VzcGVuZGluZyBwY20gJWRcbiIsIGkpOworCQkJc25kX3BjbV9zdXNwZW5kX2FsbChwY21fZGF0YS0+aHN3X3BjbSk7CisKKwkJCS8qIFdlIG5lZWQgdG8gd2FpdCB1bnRpbCB0aGUgRFNQIEZXIHN0b3BzIHRoZSBzdHJlYW1zICovCisJCQltc2xlZXAoMik7CisJCX0KKworCQkvKiBwcmVzZXJ2ZSBwZXJzaXN0ZW50IG1lbW9yeSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtb2RfbWFwKTsgaSsrKSB7CisJCQlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW21vZF9tYXBbaV0uZGFpX2lkXVttb2RfbWFwW2ldLnN0cmVhbV07CisKKwkJCWlmICghcGNtX2RhdGEtPnN1YnN0cmVhbSkKKwkJCQljb250aW51ZTsKKworCQkJZGV2X2RiZyhkZXYsICJzYXZpbmcgY29udGV4dCBwY20gJWRcbiIsIGkpOworCQkJZXJyID0gc3N0X21vZHVsZV9ydW50aW1lX3NhdmUocGNtX2RhdGEtPnJ1bnRpbWUsCisJCQkJJnBjbV9kYXRhLT5jb250ZXh0KTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHNhdmUgY29udGV4dCBmb3IgUENNICVkXG4iLCBpKTsKKwkJfQorCQkvKiBlbnRlciBEMyBzdGF0ZSBhbmQgc3RhbGwgKi8KKwkJc3N0X2hzd19kc3BfcnVudGltZV9zdXNwZW5kKGhzdyk7CisJCS8qIHB1dCB0aGUgRFNQIHRvIHNsZWVwICovCisJCXNzdF9oc3dfZHNwX3J1bnRpbWVfc2xlZXAoaHN3KTsKKwl9CisKKwlzbmRfc29jX3N1c3BlbmQocGRhdGEtPnNvY19jYXJkLT5kZXYpOworCXNuZF9zb2NfcG93ZXJvZmYocGRhdGEtPnNvY19jYXJkLT5kZXYpOworCisJcGRhdGEtPnBtX3N0YXRlID0gSFNXX1BNX1NUQVRFX0QzOworCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlCisjZGVmaW5lIGhzd19wY21fcHJlcGFyZQkJTlVMTAorI2RlZmluZSBoc3dfcGNtX2NvbXBsZXRlCU5VTEwKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaHN3X3BjbV9wbSA9IHsKKwkucnVudGltZV9pZGxlID0gaHN3X3BjbV9ydW50aW1lX2lkbGUsCisJLnJ1bnRpbWVfc3VzcGVuZCA9IGhzd19wY21fcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9IGhzd19wY21fcnVudGltZV9yZXN1bWUsCisJLnByZXBhcmUgPSBoc3dfcGNtX3ByZXBhcmUsCisJLmNvbXBsZXRlID0gaHN3X3BjbV9jb21wbGV0ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGhzd19wY21fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gImhhc3dlbGwtcGNtLWF1ZGlvIiwKKwkJLnBtID0gJmhzd19wY21fcG0sCisJfSwKKworCS5wcm9iZSA9IGhzd19wY21fZGV2X3Byb2JlLAorCS5yZW1vdmUgPSBoc3dfcGNtX2Rldl9yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihoc3dfcGNtX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkxpYW0gR2lyZHdvb2QsIFhpbmdjaGFvIFdhbmciKTsKK01PRFVMRV9ERVNDUklQVElPTigiSGFzd2VsbC9MeW54cG9pbnQgKyBCcm9hZHdlbGwvV2lsZGNhdHBvaW50IFBDTSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpoYXN3ZWxsLXBjbS1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL21mbGRfbWFjaGluZS5jIGIvc291bmQvc29jL2ludGVsL21mbGRfbWFjaGluZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGI3YTU3Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9tZmxkX21hY2hpbmUuYworKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKgotICogIG1mbGRfbWFjaGluZS5jIC0gQVNvYyBNYWNoaW5lIGRyaXZlciBmb3IgSW50ZWwgTWVkZmllbGQgTUlEIHBsYXRmb3JtCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxMCBJbnRlbCBDb3JwCi0gKiAgQXV0aG9yOiBWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4KLSAqICBBdXRob3I6IEhhcnNoYSBQcml5YSA8cHJpeWEuaGFyc2hhQGludGVsLmNvbT4KLSAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiAgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqLwotCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL2phY2suaD4KLSNpbmNsdWRlICIuLi9jb2RlY3Mvc245NTAzMS5oIgotCi0jZGVmaW5lIE1JRF9NT05PIDEKLSNkZWZpbmUgTUlEX1NURVJFTyAyCi0jZGVmaW5lIE1JRF9NQVhfQ0FQIDUKLSNkZWZpbmUgTUZMRF9KQUNLX0lOU0VSVCAweDA0Ci0KLWVudW0gc29jX21pY19iaWFzX3pvbmVzIHsKLQlNRkxEX01WX1NUQVJUID0gMCwKLQkvKiBtaWMgYmlhcyB2b2x1dGFnZSByYW5nZSBmb3IgSGVhZHBob25lcyovCi0JTUZMRF9NVl9IUCA9IDQwMCwKLQkvKiBtaWMgYmlhcyB2b2x1dGFnZSByYW5nZSBmb3IgQW1lcmljYW4gSGVhZHNldCovCi0JTUZMRF9NVl9BTV9IUyA9IDY1MCwKLQkvKiBtaWMgYmlhcyB2b2x1dGFnZSByYW5nZSBmb3IgSGVhZHNldCovCi0JTUZMRF9NVl9IUyA9IDIwMDAsCi0JTUZMRF9NVl9VTkRFRklORUQsCi19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50CWhzX3N3aXRjaDsKLXN0YXRpYyB1bnNpZ25lZCBpbnQJbG9fZGFjOwotc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjICptZmxkX2NvZGVjOwotCi1zdHJ1Y3QgbWZsZF9tY19wcml2YXRlIHsKLQl2b2lkIF9faW9tZW0gKmludF9iYXNlOwotCXU4IGludGVycnVwdF9zdGF0dXM7Ci19OwotCi1zdHJ1Y3Qgc25kX3NvY19qYWNrIG1mbGRfamFjazsKLQotLypIZWFkc2V0IGphY2sgZGV0ZWN0aW9uIERBUE0gcGlucyAqLwotc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfcGluIG1mbGRfamFja19waW5zW10gPSB7Ci0JewotCQkucGluID0gIkhlYWRwaG9uZXMiLAotCQkubWFzayA9IFNORF9KQUNLX0hFQURQSE9ORSwKLQl9LAotCXsKLQkJLnBpbiA9ICJBTUlDMSIsCi0JCS5tYXNrID0gU05EX0pBQ0tfTUlDUk9QSE9ORSwKLQl9LAotfTsKLQotLyogamFjayBkZXRlY3Rpb24gdm9sdGFnZSB6b25lcyAqLwotc3RhdGljIHN0cnVjdCBzbmRfc29jX2phY2tfem9uZSBtZmxkX3pvbmVzW10gPSB7Ci0Je01GTERfTVZfU1RBUlQsIE1GTERfTVZfQU1fSFMsIFNORF9KQUNLX0hFQURQSE9ORX0sCi0Je01GTERfTVZfQU1fSFMsIE1GTERfTVZfSFMsIFNORF9KQUNLX0hFQURTRVR9LAotfTsKLQotLyogc291bmQgY2FyZCBjb250cm9scyAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmhlYWRzZXRfc3dpdGNoX3RleHRbXSA9IHsiRWFycGllY2UiLCAiSGVhZHNldCJ9OwotCi1zdGF0aWMgY29uc3QgY2hhciAqbG9fdGV4dFtdID0geyJWaWJyYSIsICJIZWFkc2V0IiwgIklIRiIsICJOb25lIn07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX2VudW0gaGVhZHNldF9lbnVtID0KLQlTT0NfRU5VTV9TSU5HTEVfRVhUKDIsIGhlYWRzZXRfc3dpdGNoX3RleHQpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNvY19lbnVtIGxvX2VudW0gPQotCVNPQ19FTlVNX1NJTkdMRV9FWFQoNCwgbG9fdGV4dCk7Ci0KLXN0YXRpYyBpbnQgaGVhZHNldF9nZXRfc3dpdGNoKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaHNfc3dpdGNoOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhlYWRzZXRfc2V0X3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjYXJkLT5kYXBtOwotCi0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID09IGhzX3N3aXRjaCkKLQkJcmV0dXJuIDA7Ci0KLQlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKLQotCWlmICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSkgewotCQlwcl9kZWJ1ZygiaHNfc2V0IEhTIHBhdGhcbiIpOwotCQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSGVhZHBob25lcyIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVQT1VUIik7Ci0JfSBlbHNlIHsKLQkJcHJfZGVidWcoImhzX3NldCBFUCBwYXRoXG4iKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJFUE9VVCIpOwotCX0KLQotCXNuZF9zb2NfZGFwbV9zeW5jX3VubG9ja2VkKGRhcG0pOwotCi0Jc25kX3NvY19kYXBtX211dGV4X3VubG9jayhkYXBtKTsKLQotCWhzX3N3aXRjaCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGxvX2VuYWJsZV9vdXRfcGlucyhzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0pCi17Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIklIRk9VVEwiKTsKLQlzbmRfc29jX2RhcG1fZW5hYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiSUhGT1VUUiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJMSU5FT1VUTCIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJMSU5FT1VUUiIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJWSUIxT1VUIik7Ci0Jc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlZJQjJPVVQiKTsKLQlpZiAoaHNfc3dpdGNoKSB7Ci0JCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluX3VubG9ja2VkKGRhcG0sICJIZWFkcGhvbmVzIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiRVBPVVQiKTsKLQl9IGVsc2UgewotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZXMiKTsKLQkJc25kX3NvY19kYXBtX2VuYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkVQT1VUIik7Ci0JfQotfQotCi1zdGF0aWMgaW50IGxvX2dldF9zd2l0Y2goc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0Jc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0JdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSBsb19kYWM7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbG9fc2V0X3N3aXRjaChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjYXJkLT5kYXBtOwotCi0JaWYgKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID09IGxvX2RhYykKLQkJcmV0dXJuIDA7Ci0KLQlzbmRfc29jX2RhcG1fbXV0ZXhfbG9jayhkYXBtKTsKLQotCS8qIHdlIGRvbnQgd2FudCB0byB3b3JrIHdpdGggbGFzdCBzdGF0ZSBvZiBsaW5lb3V0IHNvIGp1c3QgZW5hYmxlIGFsbAotCSAqIHBpbnMgYW5kIHRoZW4gZGlzYWJsZSBwaW5zIG5vdCByZXF1aXJlZAotCSAqLwotCWxvX2VuYWJsZV9vdXRfcGlucyhkYXBtKTsKLQotCXN3aXRjaCAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pIHsKLQljYXNlIDA6Ci0JCXByX2RlYnVnKCJzZXQgdmlicmEgcGF0aFxuIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiVklCMU9VVCIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIlZJQjJPVVQiKTsKLQkJc25kX3NvY191cGRhdGVfYml0cyhtZmxkX2NvZGVjLCBTTjk1MDMxX0xPQ1RMLCAweDY2LCAwKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDE6Ci0JCXByX2RlYnVnKCJzZXQgaHMgIHBhdGhcbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIkhlYWRwaG9uZXMiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJFUE9VVCIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1mbGRfY29kZWMsIFNOOTUwMzFfTE9DVEwsIDB4NjYsIDB4MjIpOwotCQlicmVhazsKLQotCWNhc2UgMjoKLQkJcHJfZGVidWcoInNldCBzcGtyIHBhdGhcbiIpOwotCQlzbmRfc29jX2RhcG1fZGlzYWJsZV9waW5fdW5sb2NrZWQoZGFwbSwgIklIRk9VVEwiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJJSEZPVVRSIik7Ci0JCXNuZF9zb2NfdXBkYXRlX2JpdHMobWZsZF9jb2RlYywgU045NTAzMV9MT0NUTCwgMHg2NiwgMHg0NCk7Ci0JCWJyZWFrOwotCi0JY2FzZSAzOgotCQlwcl9kZWJ1Zygic2V0IG51bGwgcGF0aFxuIik7Ci0JCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3Bpbl91bmxvY2tlZChkYXBtLCAiTElORU9VVEwiKTsKLQkJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluX3VubG9ja2VkKGRhcG0sICJMSU5FT1VUUiIpOwotCQlzbmRfc29jX3VwZGF0ZV9iaXRzKG1mbGRfY29kZWMsIFNOOTUwMzFfTE9DVEwsIDB4NjYsIDB4NjYpOwotCQlicmVhazsKLQl9Ci0KLQlzbmRfc29jX2RhcG1fc3luY191bmxvY2tlZChkYXBtKTsKLQotCXNuZF9zb2NfZGFwbV9tdXRleF91bmxvY2soZGFwbSk7Ci0KLQlsb19kYWMgPSB1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IG1mbGRfc25kX2NvbnRyb2xzW10gPSB7Ci0JU09DX0VOVU1fRVhUKCJQbGF5YmFjayBTd2l0Y2giLCBoZWFkc2V0X2VudW0sCi0JCQloZWFkc2V0X2dldF9zd2l0Y2gsIGhlYWRzZXRfc2V0X3N3aXRjaCksCi0JU09DX0VOVU1fRVhUKCJMaW5lb3V0IE11eCIsIGxvX2VudW0sCi0JCQlsb19nZXRfc3dpdGNoLCBsb19zZXRfc3dpdGNoKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCBtZmxkX3dpZGdldHNbXSA9IHsKLQlTTkRfU09DX0RBUE1fSFAoIkhlYWRwaG9uZXMiLCBOVUxMKSwKLQlTTkRfU09DX0RBUE1fTUlDKCJNaWMiLCBOVUxMKSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlIG1mbGRfbWFwW10gPSB7Ci0JeyJIZWFkcGhvbmVzIiwgTlVMTCwgIkhQT1VUUiJ9LAotCXsiSGVhZHBob25lcyIsIE5VTEwsICJIUE9VVEwifSwKLQl7Ik1pYyIsIE5VTEwsICJBTUlDMSJ9LAotfTsKLQotc3RhdGljIHZvaWQgbWZsZF9qYWNrX2NoZWNrKHVuc2lnbmVkIGludCBpbnRyX3N0YXR1cykKLXsKLQlzdHJ1Y3QgbWZsZF9qYWNrX2RhdGEgamFja19kYXRhOwotCi0JamFja19kYXRhLm1mbGRfamFjayA9ICZtZmxkX2phY2s7Ci0JamFja19kYXRhLmludHJfaWQgPSBpbnRyX3N0YXR1czsKLQotCXNuOTUwMzFfamFja19kZXRlY3Rpb24oJmphY2tfZGF0YSk7Ci0JLyogVE9ETzogYWRkIGFtZXJpY2FuIGhlYWRzZXQgZGV0ZWN0aW9uIHBvc3QgZ3Bpb2xpYiBzdXBwb3J0ICovCi19Ci0KLXN0YXRpYyBpbnQgbWZsZF9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydW50aW1lKQotewotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZydW50aW1lLT5jYXJkLT5kYXBtOwotCWludCByZXRfdmFsOwotCi0JbWZsZF9jb2RlYyA9IHJ1bnRpbWUtPmNvZGVjOwotCi0JLyogZGVmYXVsdCBpcyBlYXJwaWVjZSBwaW4sIHVzZXJzcGFjZSBzZXRzIGl0IGV4cGxjaXRseSAqLwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiSGVhZHBob25lcyIpOwotCS8qIGRlZmF1bHQgaXMgbGluZW91dCBOQywgdXNlcnNwYWNlIHNldHMgaXQgZXhwbGNpdGx5ICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMSU5FT1VUTCIpOwotCXNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTElORU9VVFIiKTsKLQlsb19kYWMgPSAzOwotCWhzX3N3aXRjaCA9IDA7Ci0JLyogd2UgZG9udCB1c2UgbGluZWluIGluIHRoaXMgc28gc2V0IHRvIE5DICovCi0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMSU5FSU5MIik7Ci0Jc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMSU5FSU5SIik7Ci0KLQkvKiBIZWFkc2V0IGFuZCBidXR0b24gamFjayBkZXRlY3Rpb24gKi8KLQlyZXRfdmFsID0gc25kX3NvY19qYWNrX25ldyhtZmxkX2NvZGVjLCAiSW50ZWwoUikgTUlEIEF1ZGlvIEphY2siLAotCQkJU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX0JUTl8wIHwKLQkJCVNORF9KQUNLX0JUTl8xLCAmbWZsZF9qYWNrKTsKLQlpZiAocmV0X3ZhbCkgewotCQlwcl9lcnIoImphY2sgY3JlYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJldF92YWw7Ci0JfQotCi0JcmV0X3ZhbCA9IHNuZF9zb2NfamFja19hZGRfcGlucygmbWZsZF9qYWNrLAotCQkJQVJSQVlfU0laRShtZmxkX2phY2tfcGlucyksIG1mbGRfamFja19waW5zKTsKLQlpZiAocmV0X3ZhbCkgewotCQlwcl9lcnIoImFkZGluZyBqYWNrIHBpbnMgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJldF92YWw7Ci0JfQotCXJldF92YWwgPSBzbmRfc29jX2phY2tfYWRkX3pvbmVzKCZtZmxkX2phY2ssCi0JCQlBUlJBWV9TSVpFKG1mbGRfem9uZXMpLCBtZmxkX3pvbmVzKTsKLQlpZiAocmV0X3ZhbCkgewotCQlwcl9lcnIoImFkZGluZyBqYWNrIHpvbmVzIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXRfdmFsOwotCX0KLQotCS8qIHdlIHdhbnQgdG8gY2hlY2sgaWYgYW55dGhpbmcgaXMgaW5zZXJ0ZWQgYXQgYm9vdCwKLQkgKiBzbyBzZW5kIGEgZmFrZSBldmVudCB0byBjb2RlYyBhbmQgaXQgd2lsbCByZWFkIGFkYwotCSAqIHRvIGZpbmQgaWYgYW55dGhpbmcgaXMgdGhlcmUgb3Igbm90ICovCi0JbWZsZF9qYWNrX2NoZWNrKE1GTERfSkFDS19JTlNFUlQpOwotCXJldHVybiByZXRfdmFsOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbWZsZF9tc2ljX2RhaWxpbmtbXSA9IHsKLQl7Ci0JCS5uYW1lID0gIk1lZGZpZWxkIEhlYWRzZXQiLAotCQkuc3RyZWFtX25hbWUgPSAiSGVhZHNldCIsCi0JCS5jcHVfZGFpX25hbWUgPSAiSGVhZHNldC1jcHUtZGFpIiwKLQkJLmNvZGVjX2RhaV9uYW1lID0gIlNOOTUwMzEgSGVhZHNldCIsCi0JCS5jb2RlY19uYW1lID0gInNuOTUwMzEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJzc3QtcGxhdGZvcm0iLAotCQkuaW5pdCA9IG1mbGRfaW5pdCwKLQl9LAotCXsKLQkJLm5hbWUgPSAiTWVkZmllbGQgU3BlYWtlciIsCi0JCS5zdHJlYW1fbmFtZSA9ICJTcGVha2VyIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJTcGVha2VyLWNwdS1kYWkiLAotCQkuY29kZWNfZGFpX25hbWUgPSAiU045NTAzMSBTcGVha2VyIiwKLQkJLmNvZGVjX25hbWUgPSAic245NTAzMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gInNzdC1wbGF0Zm9ybSIsCi0JCS5pbml0ID0gTlVMTCwKLQl9LAotCXsKLQkJLm5hbWUgPSAiTWVkZmllbGQgVmlicmEiLAotCQkuc3RyZWFtX25hbWUgPSAiVmlicmExIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJWaWJyYTEtY3B1LWRhaSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJTTjk1MDMxIFZpYnJhMSIsCi0JCS5jb2RlY19uYW1lID0gInNuOTUwMzEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJzc3QtcGxhdGZvcm0iLAotCQkuaW5pdCA9IE5VTEwsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIk1lZGZpZWxkIEhhcHRpY3MiLAotCQkuc3RyZWFtX25hbWUgPSAiVmlicmEyIiwKLQkJLmNwdV9kYWlfbmFtZSA9ICJWaWJyYTItY3B1LWRhaSIsCi0JCS5jb2RlY19kYWlfbmFtZSA9ICJTTjk1MDMxIFZpYnJhMiIsCi0JCS5jb2RlY19uYW1lID0gInNuOTUwMzEiLAotCQkucGxhdGZvcm1fbmFtZSA9ICJzc3QtcGxhdGZvcm0iLAotCQkuaW5pdCA9IE5VTEwsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIk1lZGZpZWxkIENvbXByZXNzIiwKLQkJLnN0cmVhbV9uYW1lID0gIlNwZWFrZXIiLAotCQkuY3B1X2RhaV9uYW1lID0gIkNvbXByZXNzLWNwdS1kYWkiLAotCQkuY29kZWNfZGFpX25hbWUgPSAiU045NTAzMSBTcGVha2VyIiwKLQkJLmNvZGVjX25hbWUgPSAic245NTAzMSIsCi0JCS5wbGF0Zm9ybV9uYW1lID0gInNzdC1wbGF0Zm9ybSIsCi0JCS5pbml0ID0gTlVMTCwKLQl9LAotfTsKLQotLyogU29DIGNhcmQgKi8KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9zb2NfY2FyZF9tZmxkID0gewotCS5uYW1lID0gIm1lZGZpZWxkX2F1ZGlvIiwKLQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkuZGFpX2xpbmsgPSBtZmxkX21zaWNfZGFpbGluaywKLQkubnVtX2xpbmtzID0gQVJSQVlfU0laRShtZmxkX21zaWNfZGFpbGluayksCi0KLQkuY29udHJvbHMgPSBtZmxkX3NuZF9jb250cm9scywKLQkubnVtX2NvbnRyb2xzID0gQVJSQVlfU0laRShtZmxkX3NuZF9jb250cm9scyksCi0JLmRhcG1fd2lkZ2V0cyA9IG1mbGRfd2lkZ2V0cywKLQkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUobWZsZF93aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBtZmxkX21hcCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShtZmxkX21hcCksCi19OwotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc25kX21mbGRfamFja19pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2KQotewotCXN0cnVjdCBtZmxkX21jX3ByaXZhdGUgKm1jX3ByaXZhdGUgPSAoc3RydWN0IG1mbGRfbWNfcHJpdmF0ZSAqKSBkZXY7Ci0KLQltZW1jcHlfZnJvbWlvKCZtY19wcml2YXRlLT5pbnRlcnJ1cHRfc3RhdHVzLAotCQkJKCh2b2lkICopKG1jX3ByaXZhdGUtPmludF9iYXNlKSksCi0JCQlzaXplb2YodTgpKTsKLQlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc25kX21mbGRfamFja19kZXRlY3Rpb24oaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgbWZsZF9tY19wcml2YXRlICptY19kcnZfY3R4ID0gKHN0cnVjdCBtZmxkX21jX3ByaXZhdGUgKikgZGF0YTsKLQotCWlmIChtZmxkX2phY2suY29kZWMgPT0gTlVMTCkKLQkJcmV0dXJuIElSUV9IQU5ETEVEOwotCW1mbGRfamFja19jaGVjayhtY19kcnZfY3R4LT5pbnRlcnJ1cHRfc3RhdHVzKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotc3RhdGljIGludCBzbmRfbWZsZF9tY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByZXRfdmFsID0gMCwgaXJxOwotCXN0cnVjdCBtZmxkX21jX3ByaXZhdGUgKm1jX2Rydl9jdHg7Ci0Jc3RydWN0IHJlc291cmNlICppcnFfbWVtOwotCi0JcHJfZGVidWcoInNuZF9tZmxkX21jX3Byb2JlIGNhbGxlZFxuIik7Ci0KLQkvKiByZXRyaXZlIHRoZSBpcnEgbnVtYmVyICovCi0JaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKLQotCS8qIGF1ZGlvIGludGVycnVwdCBiYXNlIG9mIFNSQU0gbG9jYXRpb24gd2hlcmUKLQkgKiBpbnRlcnJ1cHRzIGFyZSBzdG9yZWQgYnkgU3lzdGVtIEZXICovCi0JbWNfZHJ2X2N0eCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm1jX2Rydl9jdHgpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW1jX2Rydl9jdHgpIHsKLQkJcHJfZXJyKCJhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlycV9tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKAotCQkJCXBkZXYsIElPUkVTT1VSQ0VfTUVNLCAiSVJRX0JBU0UiKTsKLQlpZiAoIWlycV9tZW0pIHsKLQkJcHJfZXJyKCJubyBtZW0gcmVzb3VyY2UgZ2l2ZW5cbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JbWNfZHJ2X2N0eC0+aW50X2Jhc2UgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZSgmcGRldi0+ZGV2LCBpcnFfbWVtLT5zdGFydCwKLQkJCQkJCSAgICByZXNvdXJjZV9zaXplKGlycV9tZW0pKTsKLQlpZiAoIW1jX2Rydl9jdHgtPmludF9iYXNlKSB7Ci0JCXByX2VycigiTWFwcGluZyBvZiBjYWNoZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JLyogcmVnaXN0ZXIgZm9yIGludGVycnVwdCAqLwotCXJldF92YWwgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKCZwZGV2LT5kZXYsIGlycSwKLQkJCXNuZF9tZmxkX2phY2tfaW50cl9oYW5kbGVyLAotCQkJc25kX21mbGRfamFja19kZXRlY3Rpb24sCi0JCQlJUlFGX1NIQVJFRCwgcGRldi0+ZGV2LmRyaXZlci0+bmFtZSwgbWNfZHJ2X2N0eCk7Ci0JaWYgKHJldF92YWwpIHsKLQkJcHJfZXJyKCJjYW5ub3QgcmVnaXN0ZXIgSVJRXG4iKTsKLQkJcmV0dXJuIHJldF92YWw7Ci0JfQotCS8qIHJlZ2lzdGVyIHRoZSBzb2MgY2FyZCAqLwotCXNuZF9zb2NfY2FyZF9tZmxkLmRldiA9ICZwZGV2LT5kZXY7Ci0JcmV0X3ZhbCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsICZzbmRfc29jX2NhcmRfbWZsZCk7Ci0JaWYgKHJldF92YWwpIHsKLQkJcHJfZGVidWcoInNuZF9zb2NfcmVnaXN0ZXJfY2FyZCBmYWlsZWQgJWRcbiIsIHJldF92YWwpOwotCQlyZXR1cm4gcmV0X3ZhbDsKLQl9Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbWNfZHJ2X2N0eCk7Ci0JcHJfZGVidWcoInN1Y2Nlc3NmdWxseSBleGl0ZWQgcHJvYmVcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmRfbWZsZF9tY19kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAibXNpY19hdWRpbyIsCi0JfSwKLQkucHJvYmUgPSBzbmRfbWZsZF9tY19wcm9iZSwKLX07Ci0KLW1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc25kX21mbGRfbWNfZHJpdmVyKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEludGVsKFIpIE1JRCBNYWNoaW5lIGRyaXZlciIpOwotTU9EVUxFX0FVVEhPUigiVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+Iik7Ci1NT0RVTEVfQVVUSE9SKCJIYXJzaGEgUHJpeWEgPHByaXlhLmhhcnNoYUBpbnRlbC5jb20+Iik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOm1zaWMtYXVkaW8iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtYWNwaS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1hY3BpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZDg0NTYuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL3NzdC1hY3BpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoKLSAqIEludGVsIFNTVCBsb2FkZXIgb24gQUNQSSBzeXN0ZW1zCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Ci0jaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLQotI2luY2x1ZGUgInNzdC1kc3AuaCIKLQotI2RlZmluZSBTU1RfTFBUX0RTUF9ETUFfQUREUl9PRkZTRVQJMHgwRjAwMDAKLSNkZWZpbmUgU1NUX1dQVF9EU1BfRE1BX0FERFJfT0ZGU0VUCTB4MEZFMDAwCi0jZGVmaW5lIFNTVF9MUFRfRFNQX0RNQV9TSVpFCQkoMTAyNCAtIDEpCi0KLS8qIERlc2NyaXB0b3IgZm9yIFNTVCBBU29DIG1hY2hpbmUgZHJpdmVyICovCi1zdHJ1Y3Qgc3N0X2FjcGlfbWFjaCB7Ci0JLyogQUNQSSBJRCBmb3IgdGhlIG1hdGNoaW5nIG1hY2hpbmUgZHJpdmVyLiBBdWRpbyBjb2RlYyBmb3IgaW5zdGFuY2UgKi8KLQljb25zdCB1OCBpZFtBQ1BJX0lEX0xFTl07Ci0JLyogbWFjaGluZSBkcml2ZXIgbmFtZSAqLwotCWNvbnN0IGNoYXIgKmRydl9uYW1lOwotCS8qIGZpcm13YXJlIGZpbGUgbmFtZSAqLwotCWNvbnN0IGNoYXIgKmZ3X2ZpbGVuYW1lOwotfTsKLQotLyogRGVzY3JpcHRvciBmb3Igc2V0dGluZyB1cCBTU1QgcGxhdGZvcm0gZGF0YSAqLwotc3RydWN0IHNzdF9hY3BpX2Rlc2MgewotCWNvbnN0IGNoYXIgKmRydl9uYW1lOwotCXN0cnVjdCBzc3RfYWNwaV9tYWNoICptYWNoaW5lczsKLQkvKiBQbGF0Zm9ybSByZXNvdXJjZSBpbmRleGVzLiBNdXN0IHNldCB0byAtMSBpZiBub3QgdXNlZCAqLwotCWludCByZXNpbmRleF9scGVfYmFzZTsKLQlpbnQgcmVzaW5kZXhfcGNpY2ZnX2Jhc2U7Ci0JaW50IHJlc2luZGV4X2Z3X2Jhc2U7Ci0JaW50IGlycWluZGV4X2hvc3RfaXBjOwotCWludCByZXNpbmRleF9kbWFfYmFzZTsKLQkvKiBVbmlxdWUgbnVtYmVyIGlkZW50aWZ5aW5nIHRoZSBTU1QgY29yZSBvbiBwbGF0Zm9ybSAqLwotCWludCBzc3RfaWQ7Ci0JLyogRE1BIG9ubHkgdmFsaWQgd2hlbiByZXNpbmRleF9kbWFfYmFzZSAhPSAtMSovCi0JaW50IGRtYV9lbmdpbmU7Ci0JaW50IGRtYV9zaXplOwotfTsKLQotc3RydWN0IHNzdF9hY3BpX3ByaXYgewotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXZfbWFjaDsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2X3BjbTsKLQlzdHJ1Y3Qgc3N0X3BkYXRhIHNzdF9wZGF0YTsKLQlzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyAqZGVzYzsKLQlzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCAqbWFjaDsKLX07Ci0KLXN0YXRpYyB2b2lkIHNzdF9hY3BpX2Z3X2NiKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGNvbnRleHQ7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3Qgc3N0X2FjcGlfcHJpdiAqc3N0X2FjcGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSAmc3N0X2FjcGktPnNzdF9wZGF0YTsKLQlzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyAqZGVzYyA9IHNzdF9hY3BpLT5kZXNjOwotCXN0cnVjdCBzc3RfYWNwaV9tYWNoICptYWNoID0gc3N0X2FjcGktPm1hY2g7Ci0KLQlzc3RfcGRhdGEtPmZ3ID0gZnc7Ci0JaWYgKCFmdykgewotCQlkZXZfZXJyKGRldiwgIkNhbm5vdCBsb2FkIGZpcm13YXJlICVzXG4iLCBtYWNoLT5md19maWxlbmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiByZWdpc3RlciBQQ00gYW5kIERBSSBkcml2ZXIgKi8KLQlzc3RfYWNwaS0+cGRldl9wY20gPQotCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShkZXYsIGRlc2MtPmRydl9uYW1lLCAtMSwKLQkJCQkJICAgICAgc3N0X3BkYXRhLCBzaXplb2YoKnNzdF9wZGF0YSkpOwotCWlmIChJU19FUlIoc3N0X2FjcGktPnBkZXZfcGNtKSkgewotCQlkZXZfZXJyKGRldiwgIkNhbm5vdCByZWdpc3RlciBkZXZpY2UgJXMuIEVycm9yICVkXG4iLAotCQkJZGVzYy0+ZHJ2X25hbWUsIChpbnQpUFRSX0VSUihzc3RfYWNwaS0+cGRldl9wY20pKTsKLQl9Ci0KLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyBhY3BpX3N0YXR1cyBzc3RfYWNwaV9tYWNoX21hdGNoKGFjcGlfaGFuZGxlIGhhbmRsZSwgdTMyIGxldmVsLAotCQkJCSAgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0KQotewotCSooYm9vbCAqKWNvbnRleHQgPSB0cnVlOwotCXJldHVybiBBRV9PSzsKLX0KLQotc3RhdGljIHN0cnVjdCBzc3RfYWNwaV9tYWNoICpzc3RfYWNwaV9maW5kX21hY2hpbmUoCi0Jc3RydWN0IHNzdF9hY3BpX21hY2ggKm1hY2hpbmVzKQotewotCXN0cnVjdCBzc3RfYWNwaV9tYWNoICptYWNoOwotCWJvb2wgZm91bmQgPSBmYWxzZTsKLQotCWZvciAobWFjaCA9IG1hY2hpbmVzOyBtYWNoLT5pZFswXTsgbWFjaCsrKQotCQlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2RldmljZXMobWFjaC0+aWQsCi0JCQkJCQkgIHNzdF9hY3BpX21hY2hfbWF0Y2gsCi0JCQkJCQkgICZmb3VuZCwgTlVMTCkpICYmIGZvdW5kKQotCQkJcmV0dXJuIG1hY2g7Ci0KLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBzc3RfYWNwaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWNvbnN0IHN0cnVjdCBhY3BpX2RldmljZV9pZCAqaWQ7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKLQlzdHJ1Y3Qgc3N0X2FjcGlfcHJpdiAqc3N0X2FjcGk7Ci0Jc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhOwotCXN0cnVjdCBzc3RfYWNwaV9tYWNoICptYWNoOwotCXN0cnVjdCBzc3RfYWNwaV9kZXNjICpkZXNjOwotCXN0cnVjdCByZXNvdXJjZSAqbW1pbzsKLQlpbnQgcmV0ID0gMDsKLQotCXNzdF9hY3BpID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzc3RfYWNwaSksIEdGUF9LRVJORUwpOwotCWlmIChzc3RfYWNwaSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWlkID0gYWNwaV9tYXRjaF9kZXZpY2UoZGV2LT5kcml2ZXItPmFjcGlfbWF0Y2hfdGFibGUsIGRldik7Ci0JaWYgKCFpZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQlkZXNjID0gKHN0cnVjdCBzc3RfYWNwaV9kZXNjICopaWQtPmRyaXZlcl9kYXRhOwotCW1hY2ggPSBzc3RfYWNwaV9maW5kX21hY2hpbmUoZGVzYy0+bWFjaGluZXMpOwotCWlmIChtYWNoID09IE5VTEwpIHsKLQkJZGV2X2VycihkZXYsICJObyBtYXRjaGluZyBBU29DIG1hY2hpbmUgZHJpdmVyIGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0Jc3N0X3BkYXRhID0gJnNzdF9hY3BpLT5zc3RfcGRhdGE7Ci0Jc3N0X3BkYXRhLT5pZCA9IGRlc2MtPnNzdF9pZDsKLQlzc3RfcGRhdGEtPmRtYV9kZXYgPSBkZXY7Ci0Jc3N0X2FjcGktPmRlc2MgPSBkZXNjOwotCXNzdF9hY3BpLT5tYWNoID0gbWFjaDsKLQotCWlmIChkZXNjLT5yZXNpbmRleF9kbWFfYmFzZSA+PSAwKSB7Ci0JCXNzdF9wZGF0YS0+ZG1hX2VuZ2luZSA9IGRlc2MtPmRtYV9lbmdpbmU7Ci0JCXNzdF9wZGF0YS0+ZG1hX2Jhc2UgPSBkZXNjLT5yZXNpbmRleF9kbWFfYmFzZTsKLQkJc3N0X3BkYXRhLT5kbWFfc2l6ZSA9IGRlc2MtPmRtYV9zaXplOwotCX0KLQotCWlmIChkZXNjLT5pcnFpbmRleF9ob3N0X2lwYyA+PSAwKQotCQlzc3RfcGRhdGEtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgZGVzYy0+aXJxaW5kZXhfaG9zdF9pcGMpOwotCi0JaWYgKGRlc2MtPnJlc2luZGV4X2xwZV9iYXNlID49IDApIHsKLQkJbW1pbyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwKLQkJCQkJICAgICBkZXNjLT5yZXNpbmRleF9scGVfYmFzZSk7Ci0JCWlmIChtbWlvKSB7Ci0JCQlzc3RfcGRhdGEtPmxwZV9iYXNlID0gbW1pby0+c3RhcnQ7Ci0JCQlzc3RfcGRhdGEtPmxwZV9zaXplID0gcmVzb3VyY2Vfc2l6ZShtbWlvKTsKLQkJfQotCX0KLQotCWlmIChkZXNjLT5yZXNpbmRleF9wY2ljZmdfYmFzZSA+PSAwKSB7Ci0JCW1taW8gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCSAgICAgZGVzYy0+cmVzaW5kZXhfcGNpY2ZnX2Jhc2UpOwotCQlpZiAobW1pbykgewotCQkJc3N0X3BkYXRhLT5wY2ljZmdfYmFzZSA9IG1taW8tPnN0YXJ0OwotCQkJc3N0X3BkYXRhLT5wY2ljZmdfc2l6ZSA9IHJlc291cmNlX3NpemUobW1pbyk7Ci0JCX0KLQl9Ci0KLQlpZiAoZGVzYy0+cmVzaW5kZXhfZndfYmFzZSA+PSAwKSB7Ci0JCW1taW8gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sCi0JCQkJCSAgICAgZGVzYy0+cmVzaW5kZXhfZndfYmFzZSk7Ci0JCWlmIChtbWlvKSB7Ci0JCQlzc3RfcGRhdGEtPmZ3X2Jhc2UgPSBtbWlvLT5zdGFydDsKLQkJCXNzdF9wZGF0YS0+Zndfc2l6ZSA9IHJlc291cmNlX3NpemUobW1pbyk7Ci0JCX0KLQl9Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBzc3RfYWNwaSk7Ci0KLQkvKiByZWdpc3RlciBtYWNoaW5lIGRyaXZlciAqLwotCXNzdF9hY3BpLT5wZGV2X21hY2ggPQotCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShkZXYsIG1hY2gtPmRydl9uYW1lLCAtMSwKLQkJCQkJICAgICAgc3N0X3BkYXRhLCBzaXplb2YoKnNzdF9wZGF0YSkpOwotCWlmIChJU19FUlIoc3N0X2FjcGktPnBkZXZfbWFjaCkpCi0JCXJldHVybiBQVFJfRVJSKHNzdF9hY3BpLT5wZGV2X21hY2gpOwotCi0JLyogY29udGludWUgU1NUIHByb2JpbmcgYWZ0ZXIgZmlybXdhcmUgaXMgbG9hZGVkICovCi0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIHRydWUsIG1hY2gtPmZ3X2ZpbGVuYW1lLAotCQkJCSAgICAgIGRldiwgR0ZQX0tFUk5FTCwgcGRldiwgc3N0X2FjcGlfZndfY2IpOwotCWlmIChyZXQpCi0JCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNzdF9hY3BpLT5wZGV2X21hY2gpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzc3RfYWNwaV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3Qgc3N0X2FjcGlfcHJpdiAqc3N0X2FjcGkgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSAmc3N0X2FjcGktPnNzdF9wZGF0YTsKLQotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNzdF9hY3BpLT5wZGV2X21hY2gpOwotCWlmICghSVNfRVJSX09SX05VTEwoc3N0X2FjcGktPnBkZXZfcGNtKSkKLQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc3N0X2FjcGktPnBkZXZfcGNtKTsKLQlyZWxlYXNlX2Zpcm13YXJlKHNzdF9wZGF0YS0+ZncpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCBoYXN3ZWxsX21hY2hpbmVzW10gPSB7Ci0JeyAiSU5UMzNDQSIsICJoYXN3ZWxsLWF1ZGlvIiwgImludGVsL0ludGNTU1QxLmJpbiIgfSwKLQl7fQotfTsKLQotc3RhdGljIHN0cnVjdCBzc3RfYWNwaV9kZXNjIHNzdF9hY3BpX2hhc3dlbGxfZGVzYyA9IHsKLQkuZHJ2X25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAotCS5tYWNoaW5lcyA9IGhhc3dlbGxfbWFjaGluZXMsCi0JLnJlc2luZGV4X2xwZV9iYXNlID0gMCwKLQkucmVzaW5kZXhfcGNpY2ZnX2Jhc2UgPSAxLAotCS5yZXNpbmRleF9md19iYXNlID0gLTEsCi0JLmlycWluZGV4X2hvc3RfaXBjID0gMCwKLQkuc3N0X2lkID0gU1NUX0RFVl9JRF9MWU5YX1BPSU5ULAotCS5kbWFfZW5naW5lID0gU1NUX0RNQV9UWVBFX0RXLAotCS5yZXNpbmRleF9kbWFfYmFzZSA9IFNTVF9MUFRfRFNQX0RNQV9BRERSX09GRlNFVCwKLQkuZG1hX3NpemUgPSBTU1RfTFBUX0RTUF9ETUFfU0laRSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfbWFjaCBicm9hZHdlbGxfbWFjaGluZXNbXSA9IHsKLQl7ICJJTlQzNDNBIiwgImJyb2Fkd2VsbC1hdWRpbyIsICJpbnRlbC9JbnRjU1NUMi5iaW4iIH0sCi0Je30KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyBzc3RfYWNwaV9icm9hZHdlbGxfZGVzYyA9IHsKLQkuZHJ2X25hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAotCS5tYWNoaW5lcyA9IGJyb2Fkd2VsbF9tYWNoaW5lcywKLQkucmVzaW5kZXhfbHBlX2Jhc2UgPSAwLAotCS5yZXNpbmRleF9wY2ljZmdfYmFzZSA9IDEsCi0JLnJlc2luZGV4X2Z3X2Jhc2UgPSAtMSwKLQkuaXJxaW5kZXhfaG9zdF9pcGMgPSAwLAotCS5zc3RfaWQgPSBTU1RfREVWX0lEX1dJTERDQVRfUE9JTlQsCi0JLmRtYV9lbmdpbmUgPSBTU1RfRE1BX1RZUEVfRFcsCi0JLnJlc2luZGV4X2RtYV9iYXNlID0gU1NUX1dQVF9EU1BfRE1BX0FERFJfT0ZGU0VULAotCS5kbWFfc2l6ZSA9IFNTVF9MUFRfRFNQX0RNQV9TSVpFLAotfTsKLQotc3RhdGljIHN0cnVjdCBzc3RfYWNwaV9tYWNoIGJheXRyYWlsX21hY2hpbmVzW10gPSB7Ci0JeyAiMTBFQzU2NDAiLCAiYnl0LXJ0NTY0MCIsICJpbnRlbC9md19zc3RfMGYyOC5iaW4tNDhrSHpfaTJzX21hc3RlciIgfSwKLQl7ICIxOTNDOTg5MCIsICJieXQtbWF4OTgwOTAiLCAiaW50ZWwvZndfc3N0XzBmMjguYmluLTQ4a0h6X2kyc19tYXN0ZXIiIH0sCi0Je30KLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3N0X2FjcGlfZGVzYyBzc3RfYWNwaV9iYXl0cmFpbF9kZXNjID0gewotCS5kcnZfbmFtZSA9ICJiYXl0cmFpbC1wY20tYXVkaW8iLAotCS5tYWNoaW5lcyA9IGJheXRyYWlsX21hY2hpbmVzLAotCS5yZXNpbmRleF9scGVfYmFzZSA9IDAsCi0JLnJlc2luZGV4X3BjaWNmZ19iYXNlID0gMSwKLQkucmVzaW5kZXhfZndfYmFzZSA9IDIsCi0JLmlycWluZGV4X2hvc3RfaXBjID0gNSwKLQkuc3N0X2lkID0gU1NUX0RFVl9JRF9CWVQsCi0JLnJlc2luZGV4X2RtYV9iYXNlID0gLTEsCi19OwotCi1zdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHNzdF9hY3BpX21hdGNoW10gPSB7Ci0JeyAiSU5UMzNDOCIsICh1bnNpZ25lZCBsb25nKSZzc3RfYWNwaV9oYXN3ZWxsX2Rlc2MgfSwKLQl7ICJJTlQzNDM4IiwgKHVuc2lnbmVkIGxvbmcpJnNzdF9hY3BpX2Jyb2Fkd2VsbF9kZXNjIH0sCi0JeyAiODA4NjBGMjgiLCAodW5zaWduZWQgbG9uZykmc3N0X2FjcGlfYmF5dHJhaWxfZGVzYyB9LAotCXsgfQotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUoYWNwaSwgc3N0X2FjcGlfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzc3RfYWNwaV9kcml2ZXIgPSB7Ci0JLnByb2JlID0gc3N0X2FjcGlfcHJvYmUsCi0JLnJlbW92ZSA9IHNzdF9hY3BpX3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9ICJzc3QtYWNwaSIsCi0JCS5hY3BpX21hdGNoX3RhYmxlID0gQUNQSV9QVFIoc3N0X2FjcGlfbWF0Y2gpLAotCX0sCi19OwotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzc3RfYWNwaV9kcml2ZXIpOwotCi1NT0RVTEVfQVVUSE9SKCJKYXJra28gTmlrdWxhIDxqYXJra28ubmlrdWxhQGxpbnV4LmludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiSW50ZWwgU1NUIGxvYWRlciBvbiBBQ1BJIHN5c3RlbXMiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtYmF5dHJhaWwtZHNwLmMgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWRzcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTllNTY3Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtYmF5dHJhaWwtZHNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotLyoKLSAqIEludGVsIEJheXRyYWlsIFNTVCBEU1AgZHJpdmVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTQsIEludGVsIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAotICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0KLSNpbmNsdWRlICJzc3QtZHNwLmgiCi0jaW5jbHVkZSAic3N0LWRzcC1wcml2LmgiCi0jaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgotCi0jZGVmaW5lIFNTVF9CWVRfRldfU0lHTkFUVVJFX1NJWkUJNAotI2RlZmluZSBTU1RfQllUX0ZXX1NJR04JCQkiJFNTVCIKLQotI2RlZmluZSBTU1RfQllUX0lSQU1fT0ZGU0VUCTB4QzAwMDAKLSNkZWZpbmUgU1NUX0JZVF9EUkFNX09GRlNFVAkweDEwMDAwMAotI2RlZmluZSBTU1RfQllUX1NISU1fT0ZGU0VUCTB4MTQwMDAwCi0KLWVudW0gc3N0X3JhbV90eXBlIHsKLQlTU1RfQllUX0lSQU0JPSAxLAotCVNTVF9CWVRfRFJBTQk9IDIsCi0JU1NUX0JZVF9DQUNIRQk9IDMsCi19OwotCi1zdHJ1Y3QgZG1hX2Jsb2NrX2luZm8gewotCWVudW0gc3N0X3JhbV90eXBlCXR5cGU7CS8qIElSQU0vRFJBTSAqLwotCXUzMgkJCXNpemU7CS8qIEJ5dGVzICovCi0JdTMyCQkJcmFtX29mZnNldDsgLyogT2Zmc2V0IGluIEkvRFJBTSAqLwotCXUzMgkJCXJzdmQ7CS8qIFJlc2VydmVkIGZpZWxkICovCi19OwotCi1zdHJ1Y3QgZndfaGVhZGVyIHsKLQl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtTU1RfQllUX0ZXX1NJR05BVFVSRV9TSVpFXTsKLQl1MzIgZmlsZV9zaXplOyAvKiBzaXplIG9mIGZ3IG1pbnVzIHRoaXMgaGVhZGVyICovCi0JdTMyIG1vZHVsZXM7IC8qICAjIG9mIG1vZHVsZXMgKi8KLQl1MzIgZmlsZV9mb3JtYXQ7IC8qIHZlcnNpb24gb2YgaGVhZGVyIGZvcm1hdCAqLwotCXUzMiByZXNlcnZlZFs0XTsKLX07Ci0KLXN0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgewotCXVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW1NTVF9CWVRfRldfU0lHTkFUVVJFX1NJWkVdOwotCXUzMiBtb2Rfc2l6ZTsgLyogc2l6ZSBvZiBtb2R1bGUgKi8KLQl1MzIgYmxvY2tzOyAvKiAjIG9mIGJsb2NrcyAqLwotCXUzMiB0eXBlOyAvKiBjb2RlYyB0eXBlLCBwcCBsaWIgKi8KLQl1MzIgZW50cnlfcG9pbnQ7Ci19OwotCi1zdGF0aWMgaW50IHNzdF9ieXRfcGFyc2VfbW9kdWxlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBzc3RfZncgKmZ3LAotCQkJCXN0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgKm1vZHVsZSkKLXsKLQlzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8gKmJsb2NrOwotCXN0cnVjdCBzc3RfbW9kdWxlICptb2Q7Ci0Jc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgdGVtcGxhdGU7Ci0JaW50IGNvdW50OwotCi0JbWVtc2V0KCZ0ZW1wbGF0ZSwgMCwgc2l6ZW9mKHRlbXBsYXRlKSk7Ci0JdGVtcGxhdGUuaWQgPSBtb2R1bGUtPnR5cGU7Ci0JdGVtcGxhdGUuZW50cnkgPSBtb2R1bGUtPmVudHJ5X3BvaW50OwotCi0JbW9kID0gc3N0X21vZHVsZV9uZXcoZncsICZ0ZW1wbGF0ZSwgTlVMTCk7Ci0JaWYgKG1vZCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWJsb2NrID0gKHZvaWQgKiltb2R1bGUgKyBzaXplb2YoKm1vZHVsZSk7Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBtb2R1bGUtPmJsb2NrczsgY291bnQrKykgewotCi0JCWlmIChibG9jay0+c2l6ZSA8PSAwKSB7Ci0JCQlkZXZfZXJyKGRzcC0+ZGV2LCAiYmxvY2sgJWQgc2l6ZSBpbnZhbGlkXG4iLCBjb3VudCk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXN3aXRjaCAoYmxvY2stPnR5cGUpIHsKLQkJY2FzZSBTU1RfQllUX0lSQU06Ci0JCQltb2QtPm9mZnNldCA9IGJsb2NrLT5yYW1fb2Zmc2V0ICsKLQkJCQkJICAgIGRzcC0+YWRkci5pcmFtX29mZnNldDsKLQkJCW1vZC0+dHlwZSA9IFNTVF9NRU1fSVJBTTsKLQkJCWJyZWFrOwotCQljYXNlIFNTVF9CWVRfRFJBTToKLQkJCW1vZC0+b2Zmc2V0ID0gYmxvY2stPnJhbV9vZmZzZXQgKwotCQkJCQkgICAgZHNwLT5hZGRyLmRyYW1fb2Zmc2V0OwotCQkJbW9kLT50eXBlID0gU1NUX01FTV9EUkFNOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NUX0JZVF9DQUNIRToKLQkJCW1vZC0+b2Zmc2V0ID0gYmxvY2stPnJhbV9vZmZzZXQgKwotCQkJCQkgICAgKGRzcC0+YWRkci5md19leHQgLSBkc3AtPmFkZHIubHBlKTsKLQkJCW1vZC0+dHlwZSA9IFNTVF9NRU1fQ0FDSEU7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRldl9lcnIoZHNwLT5kZXYsICJ3cm9uZyByYW0gdHlwZSAweCV4IGluIGJsb2NrMHgleFxuIiwKLQkJCQlibG9jay0+dHlwZSwgY291bnQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQltb2QtPnNpemUgPSBibG9jay0+c2l6ZTsKLQkJbW9kLT5kYXRhID0gKHZvaWQgKilibG9jayArIHNpemVvZigqYmxvY2spOwotCi0JCXNzdF9tb2R1bGVfYWxsb2NfYmxvY2tzKG1vZCk7Ci0KLQkJYmxvY2sgPSAodm9pZCAqKWJsb2NrICsgc2l6ZW9mKCpibG9jaykgKyBibG9jay0+c2l6ZTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2J5dF9wYXJzZV9md19pbWFnZShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpCi17Ci0Jc3RydWN0IGZ3X2hlYWRlciAqaGVhZGVyOwotCXN0cnVjdCBzc3RfYnl0X2Z3X21vZHVsZV9oZWFkZXIgKm1vZHVsZTsKLQlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X2Z3LT5kc3A7Ci0JaW50IHJldCwgY291bnQ7Ci0KLQkvKiBSZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGF0YSBwb2ludGVyICovCi0JaGVhZGVyID0gKHN0cnVjdCBmd19oZWFkZXIgKilzc3RfZnctPmRtYV9idWY7Ci0KLQkvKiB2ZXJpZnkgRlcgKi8KLQlpZiAoKHN0cm5jbXAoaGVhZGVyLT5zaWduYXR1cmUsIFNTVF9CWVRfRldfU0lHTiwgNCkgIT0gMCkgfHwKLQkgICAgKHNzdF9mdy0+c2l6ZSAhPSBoZWFkZXItPmZpbGVfc2l6ZSArIHNpemVvZigqaGVhZGVyKSkpIHsKLQkJLyogSW52YWxpZCBGVyBzaWduYXR1cmUgKi8KLQkJZGV2X2Vycihkc3AtPmRldiwgIkludmFsaWQgRlcgc2lnbi9maWxlc2l6ZSBtaXNtYXRjaFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldl9kYmcoZHNwLT5kZXYsCi0JCSJoZWFkZXIgc2lnbj0lNHMgc2l6ZT0weCV4IG1vZHVsZXM9MHgleCBmbXQ9MHgleCBzaXplPSV6dVxuIiwKLQkJaGVhZGVyLT5zaWduYXR1cmUsIGhlYWRlci0+ZmlsZV9zaXplLCBoZWFkZXItPm1vZHVsZXMsCi0JCWhlYWRlci0+ZmlsZV9mb3JtYXQsIHNpemVvZigqaGVhZGVyKSk7Ci0KLQltb2R1bGUgPSAodm9pZCAqKXNzdF9mdy0+ZG1hX2J1ZiArIHNpemVvZigqaGVhZGVyKTsKLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBoZWFkZXItPm1vZHVsZXM7IGNvdW50KyspIHsKLQkJLyogbW9kdWxlICovCi0JCXJldCA9IHNzdF9ieXRfcGFyc2VfbW9kdWxlKGRzcCwgc3N0X2Z3LCBtb2R1bGUpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2Vycihkc3AtPmRldiwgImludmFsaWQgbW9kdWxlICVkXG4iLCBjb3VudCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCW1vZHVsZSA9ICh2b2lkICopbW9kdWxlICsgc2l6ZW9mKCptb2R1bGUpICsgbW9kdWxlLT5tb2Rfc2l6ZTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3N0X2J5dF9kdW1wX3NoaW0oc3RydWN0IHNzdF9kc3AgKnNzdCkKLXsKLQlpbnQgaTsKLQl1NjQgcmVnOwotCi0JZm9yIChpID0gMDsgaSA8PSAweEYwOyBpICs9IDgpIHsKLQkJcmVnID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIGkpOwotCQlpZiAocmVnKQotCQkJZGV2X2RiZyhzc3QtPmRldiwgInNoaW0gMHglMi4yeCB2YWx1ZSAweCUxNi4xNmxseFxuIiwKLQkJCQlpLCByZWcpOwotCX0KLQotCWZvciAoaSA9IDB4MDA7IGkgPD0gMHhmZjsgaSArPSA0KSB7Ci0JCXJlZyA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgaSk7Ci0JCWlmIChyZWcpCi0JCQlkZXZfZGJnKHNzdC0+ZGV2LCAicGNpIDB4JTIuMnggdmFsdWUgMHglOC44eFxuIiwKLQkJCQlpLCAodTMyKXJlZyk7Ci0JfQotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgc3N0X2J5dF9pcnEoaW50IGlycSwgdm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gKHN0cnVjdCBzc3RfZHNwICopIGNvbnRleHQ7Ci0JdTY0IGlzcng7Ci0JaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7Ci0KLQlzcGluX2xvY2soJnNzdC0+c3BpbmxvY2spOwotCi0JaXNyeCA9IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3N0LCBTU1RfSVNSWCk7Ci0JaWYgKGlzcnggJiBTU1RfSVNSWF9ET05FKSB7Ci0JCS8qIEFEU1AgaGFzIHByb2Nlc3NlZCB0aGUgbWVzc2FnZSByZXF1ZXN0IGZyb20gSUEgKi8KLQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDWCwKLQkJCQkJCSAgICBTU1RfQllUX0lQQ1hfRE9ORSwgMCk7Ci0JCXJldCA9IElSUV9XQUtFX1RIUkVBRDsKLQl9Ci0JaWYgKGlzcnggJiBTU1RfQllUX0lTUlhfUkVRVUVTVCkgewotCQkvKiBtYXNrIG1lc3NhZ2UgcmVxdWVzdCBmcm9tIEFEU1AgYW5kIGRvIHByb2Nlc3NpbmcgbGF0ZXIgKi8KLQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzNjRfdW5sb2NrZWQoc3N0LCBTU1RfSU1SWCwKLQkJCQkJCSAgICBTU1RfQllUX0lNUlhfUkVRVUVTVCwKLQkJCQkJCSAgICBTU1RfQllUX0lNUlhfUkVRVUVTVCk7Ci0JCXJldCA9IElSUV9XQUtFX1RIUkVBRDsKLQl9Ci0KLQlzcGluX3VubG9jaygmc3N0LT5zcGlubG9jayk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBzc3RfYnl0X2Jvb3Qoc3RydWN0IHNzdF9kc3AgKnNzdCkKLXsKLQlpbnQgdHJpZXMgPSAxMDsKLQotCS8qCi0JICogc2F2ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBleHRlbmRlZCBmaXJtd2FyZSBibG9jayBpbiB0aGUgZmlyc3QKLQkgKiA0IGJ5dGVzIG9mIHRoZSBtYWlsYm94Ci0JICovCi0JbWVtY3B5X3RvaW8oc3N0LT5hZGRyLmxwZSArIFNTVF9CWVRfTUFJTEJPWF9PRkZTRVQsCi0JICAgICAgICZzc3QtPnBkYXRhLT5md19iYXNlLCBzaXplb2YodTMyKSk7Ci0KLQkvKiByZWxlYXNlIHN0YWxsIGFuZCB3YWl0IHRvIHVuc3RhbGwgKi8KLQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9DU1IsIFNTVF9CWVRfQ1NSX1NUQUxMLCAweDApOwotCXdoaWxlICh0cmllcy0tKSB7Ci0JCWlmICghKHNzdF9kc3Bfc2hpbV9yZWFkNjQoc3N0LCBTU1RfQ1NSKSAmCi0JCSAgICAgIFNTVF9CWVRfQ1NSX1BXQUlUTU9ERSkpCi0JCQlicmVhazsKLQkJbXNsZWVwKDEwMCk7Ci0JfQotCWlmICh0cmllcyA8IDApIHsKLQkJZGV2X2Vycihzc3QtPmRldiwgInVuYWJsZSB0byBzdGFydCBEU1BcbiIpOwotCQlzc3RfYnl0X2R1bXBfc2hpbShzc3QpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgc3N0X2J5dF9yZXNldChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQotewotCS8qIHB1dCBEU1AgaW50byByZXNldCwgc2V0IHJlc2V0IHZlY3RvciBhbmQgc3RhbGwgKi8KLQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9DU1IsCi0JCVNTVF9CWVRfQ1NSX1JTVCB8IFNTVF9CWVRfQ1NSX1ZFQ1RPUl9TRUwgfCBTU1RfQllUX0NTUl9TVEFMTCwKLQkJU1NUX0JZVF9DU1JfUlNUIHwgU1NUX0JZVF9DU1JfVkVDVE9SX1NFTCB8IFNTVF9CWVRfQ1NSX1NUQUxMKTsKLQotCXVkZWxheSgxMCk7Ci0KLQkvKiB0YWtlIERTUCBvdXQgb2YgcmVzZXQgYW5kIGtlZXAgc3RhbGxlZCBmb3IgRlcgbG9hZGluZyAqLwotCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0KHNzdCwgU1NUX0NTUiwgU1NUX0JZVF9DU1JfUlNULCAwKTsKLX0KLQotc3RydWN0IHNzdF9hZHNwX21lbXJlZ2lvbiB7Ci0JdTMyIHN0YXJ0OwotCXUzMiBlbmQ7Ci0JaW50IGJsb2NrczsKLQllbnVtIHNzdF9tZW1fdHlwZSB0eXBlOwotfTsKLQotLyogQllUIHRlc3Qgc3R1ZmYgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3N0X2Fkc3BfbWVtcmVnaW9uIGJ5dF9yZWdpb25bXSA9IHsKLQl7MHhDMDAwMCwgMHgxMDAwMDAsIDgsIFNTVF9NRU1fSVJBTX0sIC8qIEktU1JBTSAtIDggKiAzMmtCICovCi0JezB4MTAwMDAwLCAweDE0MDAwMCwgOCwgU1NUX01FTV9EUkFNfSwgLyogRC1TUkFNMCAtIDggKiAzMmtCICovCi19OwotCi1zdGF0aWMgaW50IHNzdF9ieXRfcmVzb3VyY2VfbWFwKHN0cnVjdCBzc3RfZHNwICpzc3QsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQotewotCXNzdC0+YWRkci5scGVfYmFzZSA9IHBkYXRhLT5scGVfYmFzZTsKLQlzc3QtPmFkZHIubHBlID0gaW9yZW1hcChwZGF0YS0+bHBlX2Jhc2UsIHBkYXRhLT5scGVfc2l6ZSk7Ci0JaWYgKCFzc3QtPmFkZHIubHBlKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCS8qIEFEU1AgUENJIE1NSU8gY29uZmlnIHNwYWNlICovCi0Jc3N0LT5hZGRyLnBjaV9jZmcgPSBpb3JlbWFwKHBkYXRhLT5wY2ljZmdfYmFzZSwgcGRhdGEtPnBjaWNmZ19zaXplKTsKLQlpZiAoIXNzdC0+YWRkci5wY2lfY2ZnKSB7Ci0JCWlvdW5tYXAoc3N0LT5hZGRyLmxwZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIFNTVCBFeHRlbmRlZCBGVyBhbGxvY2F0aW9uICovCi0Jc3N0LT5hZGRyLmZ3X2V4dCA9IGlvcmVtYXAocGRhdGEtPmZ3X2Jhc2UsIHBkYXRhLT5md19zaXplKTsKLQlpZiAoIXNzdC0+YWRkci5md19leHQpIHsKLQkJaW91bm1hcChzc3QtPmFkZHIucGNpX2NmZyk7Ci0JCWlvdW5tYXAoc3N0LT5hZGRyLmxwZSk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCS8qIFNTVCBTaGltICovCi0Jc3N0LT5hZGRyLnNoaW0gPSBzc3QtPmFkZHIubHBlICsgc3N0LT5hZGRyLnNoaW1fb2Zmc2V0OwotCi0Jc3N0X2RzcF9tYWlsYm94X2luaXQoc3N0LCBTU1RfQllUX01BSUxCT1hfT0ZGU0VUICsgMHgyMDQsCi0JCQkgICAgIFNTVF9CWVRfSVBDX01BWF9QQVlMT0FEX1NJWkUsCi0JCQkgICAgIFNTVF9CWVRfTUFJTEJPWF9PRkZTRVQsCi0JCQkgICAgIFNTVF9CWVRfSVBDX01BWF9QQVlMT0FEX1NJWkUpOwotCi0Jc3N0LT5pcnEgPSBwZGF0YS0+aXJxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2J5dF9pbml0KHN0cnVjdCBzc3RfZHNwICpzc3QsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQotewotCWNvbnN0IHN0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24gKnJlZ2lvbjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IHJldCA9IC1FTk9ERVYsIGksIGosIHJlZ2lvbl9jb3VudDsKLQl1MzIgb2Zmc2V0LCBzaXplOwotCi0JZGV2ID0gc3N0LT5kZXY7Ci0KLQlzd2l0Y2ggKHNzdC0+aWQpIHsKLQljYXNlIFNTVF9ERVZfSURfQllUOgotCQlyZWdpb24gPSBieXRfcmVnaW9uOwotCQlyZWdpb25fY291bnQgPSBBUlJBWV9TSVpFKGJ5dF9yZWdpb24pOwotCQlzc3QtPmFkZHIuaXJhbV9vZmZzZXQgPSBTU1RfQllUX0lSQU1fT0ZGU0VUOwotCQlzc3QtPmFkZHIuZHJhbV9vZmZzZXQgPSBTU1RfQllUX0RSQU1fT0ZGU0VUOwotCQlzc3QtPmFkZHIuc2hpbV9vZmZzZXQgPSBTU1RfQllUX1NISU1fT0ZGU0VUOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgbWVtIHJlc291cmNlc1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gc3N0X2J5dF9yZXNvdXJjZV9tYXAoc3N0LCBwZGF0YSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gbWFwIHJlc291cmNlc1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChzc3QtPmRtYV9kZXYsIERNQV9CSVRfTUFTSygzMikpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBlbmFibGUgSW50ZXJydXB0IGZyb20gYm90aCBzaWRlcyAqLwotCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0KHNzdCwgU1NUX0lNUlgsIDB4MywgMHgwKTsKLQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzc3QsIFNTVF9JTVJELCAweDMsIDB4MCk7Ci0KLQkvKiByZWdpc3RlciBEU1AgbWVtb3J5IGJsb2NrcyAtIGlkZWFsbHkgd2Ugc2hvdWxkIGdldCB0aGlzIGZyb20gQUNQSSAqLwotCWZvciAoaSA9IDA7IGkgPCByZWdpb25fY291bnQ7IGkrKykgewotCQlvZmZzZXQgPSByZWdpb25baV0uc3RhcnQ7Ci0JCXNpemUgPSAocmVnaW9uW2ldLmVuZCAtIHJlZ2lvbltpXS5zdGFydCkgLyByZWdpb25baV0uYmxvY2tzOwotCi0JCS8qIHJlZ2lzdGVyIGluZGl2aWR1YWwgbWVtb3J5IGJsb2NrcyAqLwotCQlmb3IgKGogPSAwOyBqIDwgcmVnaW9uW2ldLmJsb2NrczsgaisrKSB7Ci0JCQlzc3RfbWVtX2Jsb2NrX3JlZ2lzdGVyKHNzdCwgb2Zmc2V0LCBzaXplLAotCQkJCQkgICAgICAgcmVnaW9uW2ldLnR5cGUsIE5VTEwsIGosIHNzdCk7Ci0JCQlvZmZzZXQgKz0gc2l6ZTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzc3RfYnl0X2ZyZWUoc3RydWN0IHNzdF9kc3AgKnNzdCkKLXsKLQlzc3RfbWVtX2Jsb2NrX3VucmVnaXN0ZXJfYWxsKHNzdCk7Ci0JaW91bm1hcChzc3QtPmFkZHIubHBlKTsKLQlpb3VubWFwKHNzdC0+YWRkci5wY2lfY2ZnKTsKLQlpb3VubWFwKHNzdC0+YWRkci5md19leHQpOwotfQotCi1zdHJ1Y3Qgc3N0X29wcyBzc3RfYnl0X29wcyA9IHsKLQkucmVzZXQgPSBzc3RfYnl0X3Jlc2V0LAotCS5ib290ID0gc3N0X2J5dF9ib290LAotCS53cml0ZSA9IHNzdF9zaGltMzJfd3JpdGUsCi0JLnJlYWQgPSBzc3Rfc2hpbTMyX3JlYWQsCi0JLndyaXRlNjQgPSBzc3Rfc2hpbTMyX3dyaXRlNjQsCi0JLnJlYWQ2NCA9IHNzdF9zaGltMzJfcmVhZDY0LAotCS5yYW1fcmVhZCA9IHNzdF9tZW1jcHlfZnJvbWlvXzMyLAotCS5yYW1fd3JpdGUgPSBzc3RfbWVtY3B5X3RvaW9fMzIsCi0JLmlycV9oYW5kbGVyID0gc3N0X2J5dF9pcnEsCi0JLmluaXQgPSBzc3RfYnl0X2luaXQsCi0JLmZyZWUgPSBzc3RfYnl0X2ZyZWUsCi0JLnBhcnNlX2Z3ID0gc3N0X2J5dF9wYXJzZV9md19pbWFnZSwKLX07CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5jIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1pcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRhZDk4Yy4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLWlwYy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTgzICswLDAgQEAKLS8qCi0gKiBJbnRlbCBCYXl0cmFpbCBTU1QgSVBDIFN1cHBvcnQKLSAqIENvcHlyaWdodCAoYykgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotCi0jaW5jbHVkZSAic3N0LWJheXRyYWlsLWlwYy5oIgotI2luY2x1ZGUgInNzdC1kc3AuaCIKLSNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKLQotLyogSVBDIG1lc3NhZ2UgdGltZW91dCAqLwotI2RlZmluZSBJUENfVElNRU9VVF9NU0VDUwkzMDAKLSNkZWZpbmUgSVBDX0JPT1RfTVNFQ1MJCTIwMAotCi0jZGVmaW5lIElQQ19FTVBUWV9MSVNUX1NJWkUJOAotCi0vKiBJUEMgaGVhZGVyIGJpdHMgKi8KLSNkZWZpbmUgSVBDX0hFQURFUl9NU0dfSURfTUFTSwkweGZmCi0jZGVmaW5lIElQQ19IRUFERVJfTVNHX0lEKHgpCSgoeCkgJiBJUENfSEVBREVSX01TR19JRF9NQVNLKQotI2RlZmluZSBJUENfSEVBREVSX1NUUl9JRF9TSElGVAk4Ci0jZGVmaW5lIElQQ19IRUFERVJfU1RSX0lEX01BU0sJMHgxZgotI2RlZmluZSBJUENfSEVBREVSX1NUUl9JRCh4KQkoKCh4KSAmIDB4MWYpIDw8IElQQ19IRUFERVJfU1RSX0lEX1NISUZUKQotI2RlZmluZSBJUENfSEVBREVSX0xBUkdFX1NISUZUCTEzCi0jZGVmaW5lIElQQ19IRUFERVJfTEFSR0UoeCkJKCgoeCkgJiAweDEpIDw8IElQQ19IRUFERVJfTEFSR0VfU0hJRlQpCi0jZGVmaW5lIElQQ19IRUFERVJfREFUQV9TSElGVAkxNgotI2RlZmluZSBJUENfSEVBREVSX0RBVEFfTUFTSwkweDNmZmYKLSNkZWZpbmUgSVBDX0hFQURFUl9EQVRBKHgpCSgoKHgpICYgMHgzZmZmKSA8PCBJUENfSEVBREVSX0RBVEFfU0hJRlQpCi0KLS8qIG1hc2sgZm9yIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIG5vdGlmaWNhdGlvbiBhbmQgcmVwbHkgbWVzc2FnZSAqLwotI2RlZmluZSBJUENfTk9USUZJQ0FUSU9OCSgweDEgPDwgNykKLQotLyogSTJMIFN0cmVhbSBjb25maWcvY29udHJvbCBtc2dzICovCi0jZGVmaW5lIElQQ19JQV9BTExPQ19TVFJFQU0JMHgyMAotI2RlZmluZSBJUENfSUFfRlJFRV9TVFJFQU0JMHgyMQotI2RlZmluZSBJUENfSUFfUEFVU0VfU1RSRUFNCTB4MjQKLSNkZWZpbmUgSVBDX0lBX1JFU1VNRV9TVFJFQU0JMHgyNQotI2RlZmluZSBJUENfSUFfRFJPUF9TVFJFQU0JMHgyNgotI2RlZmluZSBJUENfSUFfU1RBUlRfU1RSRUFNCTB4MzAKLQotLyogbm90aWZpY2F0aW9uIG1lc3NhZ2VzICovCi0jZGVmaW5lIElQQ19JQV9GV19JTklUX0NNUExUCTB4ODEKLSNkZWZpbmUgSVBDX1NTVF9QRVJJT0RfRUxBUFNFRAkweDk3Ci0KLS8qIElQQyBtZXNzYWdlcyBiZXR3ZWVuIGhvc3QgYW5kIEFEU1AgKi8KLXN0cnVjdCBzc3RfYnl0X2FkZHJlc3NfaW5mbyB7Ci0JdTMyIGFkZHI7Ci0JdTMyIHNpemU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSB7Ci0JdTggY29kZWNfdHlwZTsKLQl1OCBzdHJfdHlwZTsKLQl1OCBvcGVyYXRpb247Ci0JdTggcHJvdGVjdGVkX3N0cjsKLQl1OCB0aW1lX3Nsb3RzOwotCXU4IHJlc2VydmVkOwotCXUxNiByZXN1bHQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3N0X2J5dF9wY21fcGFyYW1zIHsKLQl1OCBudW1fY2hhbjsKLQl1OCBwY21fd2Rfc3o7Ci0JdTggdXNlX29mZmxvYWRfcGF0aDsKLQl1OCByZXNlcnZlZDsKLQl1MzIgc2ZyZXE7Ci0JdTggY2hhbm5lbF9tYXBbOF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3N0X2J5dF9mcmFtZXNfaW5mbyB7Ci0JdTE2IG51bV9lbnRyaWVzOwotCXUxNiByc3J2ZDsKLQl1MzIgZnJhZ19zaXplOwotCXN0cnVjdCBzc3RfYnl0X2FkZHJlc3NfaW5mbyByaW5nX2J1Zl9pbmZvWzhdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IHNzdF9ieXRfYWxsb2NfcGFyYW1zIHsKLQlzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSBzdHJfdHlwZTsKLQlzdHJ1Y3Qgc3N0X2J5dF9wY21fcGFyYW1zIHBjbV9wYXJhbXM7Ci0Jc3RydWN0IHNzdF9ieXRfZnJhbWVzX2luZm8gZnJhbWVfaW5mbzsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzc3RfYnl0X2FsbG9jX3Jlc3BvbnNlIHsKLQlzdHJ1Y3Qgc3N0X2J5dF9zdHJfdHlwZSBzdHJfdHlwZTsKLQl1OCByZXNlcnZlZFs4OF07Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3N0X2J5dF9zdGFydF9zdHJlYW1fcGFyYW1zIHsKLQl1MzIgYnl0ZV9vZmZzZXQ7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3N0X2J5dF90c3RhbXAgewotCXU2NCByaW5nX2J1ZmZlcl9jb3VudGVyOwotCXU2NCBoYXJkd2FyZV9jb3VudGVyOwotCXU2NCBmcmFtZXNfZGVjb2RlZDsKLQl1NjQgYnl0ZXNfZGVjb2RlZDsKLQl1NjQgYnl0ZXNfY29waWVkOwotCXUzMiBzYW1wbGluZ19mcmVxdWVuY3k7Ci0JdTMyIGNoYW5uZWxfcGVha1s4XTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzc3RfYnl0X2Z3X3ZlcnNpb24gewotCXU4IGJ1aWxkOwotCXU4IG1pbm9yOwotCXU4IG1ham9yOwotCXU4IHR5cGU7Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3Qgc3N0X2J5dF9md19idWlsZF9pbmZvIHsKLQl1OCBkYXRlWzE2XTsKLQl1OCB0aW1lWzE2XTsKLX0gX19wYWNrZWQ7Ci0KLXN0cnVjdCBzc3RfYnl0X2Z3X2luaXQgewotCXN0cnVjdCBzc3RfYnl0X2Z3X3ZlcnNpb24gZndfdmVyc2lvbjsKLQlzdHJ1Y3Qgc3N0X2J5dF9md19idWlsZF9pbmZvIGJ1aWxkX2luZm87Ci0JdTE2IHJlc3VsdDsKLQl1OCBtb2R1bGVfaWQ7Ci0JdTggZGVidWdfaW5mbzsKLX0gX19wYWNrZWQ7Ci0KLS8qIGRyaXZlciBpbnRlcm5hbCBJUEMgbWVzc2FnZSBzdHJ1Y3R1cmUgKi8KLXN0cnVjdCBpcGNfbWVzc2FnZSB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXU2NCBoZWFkZXI7Ci0KLQkvKiBkaXJlY3Rpb24gd3J0IGhvc3QgQ1BVICovCi0JY2hhciB0eF9kYXRhW1NTVF9CWVRfSVBDX01BWF9QQVlMT0FEX1NJWkVdOwotCXNpemVfdCB0eF9zaXplOwotCWNoYXIgcnhfZGF0YVtTU1RfQllUX0lQQ19NQVhfUEFZTE9BRF9TSVpFXTsKLQlzaXplX3Qgcnhfc2l6ZTsKLQotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRxOwotCWJvb2wgY29tcGxldGU7Ci0JYm9vbCB3YWl0OwotCWludCBlcnJubzsKLX07Ci0KLXN0cnVjdCBzc3RfYnl0X3N0cmVhbTsKLXN0cnVjdCBzc3RfYnl0OwotCi0vKiBzdHJlYW0gaW5mb21hdGlvbiAqLwotc3RydWN0IHNzdF9ieXRfc3RyZWFtIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7Ci0KLQkvKiBjb25maWd1cmF0aW9uICovCi0Jc3RydWN0IHNzdF9ieXRfYWxsb2NfcGFyYW1zIHJlcXVlc3Q7Ci0Jc3RydWN0IHNzdF9ieXRfYWxsb2NfcmVzcG9uc2UgcmVwbHk7Ci0KLQkvKiBydW50aW1lIGluZm8gKi8KLQlzdHJ1Y3Qgc3N0X2J5dCAqYnl0OwotCWludCBzdHJfaWQ7Ci0JYm9vbCBjb21taXRlZDsKLQlib29sIHJ1bm5pbmc7Ci0KLQkvKiBkcml2ZXIgY2FsbGJhY2sgKi8KLQl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKTsKLQl2b2lkICpwZGF0YTsKLX07Ci0KLS8qIFNTVCBCYXl0cmFpbCBJUEMgZGF0YSAqLwotc3RydWN0IHNzdF9ieXQgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOwotCi0JLyogc3RyZWFtICovCi0Jc3RydWN0IGxpc3RfaGVhZCBzdHJlYW1fbGlzdDsKLQotCS8qIGJvb3QgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBib290X3dhaXQ7Ci0JYm9vbCBib290X2NvbXBsZXRlOwotCXN0cnVjdCBzc3RfZncgKmZ3OwotCi0JLyogSVBDIG1lc3NhZ2luZyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgdHhfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBlbXB0eV9saXN0OwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfdHhxOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHhfdGhyZWFkOwotCXN0cnVjdCBrdGhyZWFkX3dvcmtlciBrd29ya2VyOwotCXN0cnVjdCBrdGhyZWFkX3dvcmsga3dvcms7Ci0Jc3RydWN0IGlwY19tZXNzYWdlICptc2c7Ci19OwotCi1zdGF0aWMgaW5saW5lIHU2NCBzc3RfYnl0X2hlYWRlcihpbnQgbXNnX2lkLCBpbnQgZGF0YSwgYm9vbCBsYXJnZSwgaW50IHN0cl9pZCkKLXsKLQl1NjQgaGVhZGVyOwotCi0JaGVhZGVyID0gSVBDX0hFQURFUl9NU0dfSUQobXNnX2lkKSB8Ci0JCSBJUENfSEVBREVSX1NUUl9JRChzdHJfaWQpIHwKLQkJIElQQ19IRUFERVJfTEFSR0UobGFyZ2UpIHwKLQkJIElQQ19IRUFERVJfREFUQShkYXRhKSB8Ci0JCSBTU1RfQllUX0lQQ1hfQlVTWTsKLQotCXJldHVybiBoZWFkZXI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IHNzdF9ieXRfaGVhZGVyX21zZ19pZCh1NjQgaGVhZGVyKQotewotCXJldHVybiBoZWFkZXIgJiBJUENfSEVBREVSX01TR19JRF9NQVNLOwotfQotCi1zdGF0aWMgaW5saW5lIHU4IHNzdF9ieXRfaGVhZGVyX3N0cl9pZCh1NjQgaGVhZGVyKQotewotCXJldHVybiAoaGVhZGVyID4+IElQQ19IRUFERVJfU1RSX0lEX1NISUZUKSAmIElQQ19IRUFERVJfU1RSX0lEX01BU0s7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTE2IHNzdF9ieXRfaGVhZGVyX2RhdGEodTY0IGhlYWRlcikKLXsKLQlyZXR1cm4gKGhlYWRlciA+PiBJUENfSEVBREVSX0RBVEFfU0hJRlQpICYgSVBDX0hFQURFUl9EQVRBX01BU0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnNzdF9ieXRfZ2V0X3N0cmVhbShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAotCQkJCQkJIGludCBzdHJlYW1faWQpCi17Ci0Jc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW07Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cmVhbSwgJmJ5dC0+c3RyZWFtX2xpc3QsIG5vZGUpIHsKLQkJaWYgKHN0cmVhbS0+c3RyX2lkID09IHN0cmVhbV9pZCkKLQkJCXJldHVybiBzdHJlYW07Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHNzdF9ieXRfaXBjX3NoaW1fZGJnKHN0cnVjdCBzc3RfYnl0ICpieXQsIGNvbnN0IGNoYXIgKnRleHQpCi17Ci0Jc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJ5dC0+ZHNwOwotCXU2NCBpc3IsIGlwY2QsIGltcngsIGlwY3g7Ci0KLQlpcGN4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JUENYKTsKLQlpc3IgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lTUlgpOwotCWlwY2QgPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QpOwotCWltcnggPSBzc3RfZHNwX3NoaW1fcmVhZDY0X3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpOwotCi0JZGV2X2VycihieXQtPmRldiwKLQkJImlwYzogLS0lcy0tIGlwY3ggMHglbGx4IGlzciAweCVsbHggaXBjZCAweCVsbHggaW1yeCAweCVsbHhcbiIsCi0JCXRleHQsIGlwY3gsIGlzciwgaXBjZCwgaW1yeCk7Ci19Ci0KLS8qIGxvY2tzIGhlbGQgYnkgY2FsbGVyICovCi1zdGF0aWMgc3RydWN0IGlwY19tZXNzYWdlICpzc3RfYnl0X21zZ19nZXRfZW1wdHkoc3RydWN0IHNzdF9ieXQgKmJ5dCkKLXsKLQlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZyA9IE5VTEw7Ci0KLQlpZiAoIWxpc3RfZW1wdHkoJmJ5dC0+ZW1wdHlfbGlzdCkpIHsKLQkJbXNnID0gbGlzdF9maXJzdF9lbnRyeSgmYnl0LT5lbXB0eV9saXN0LAotCQkJCSAgICAgICBzdHJ1Y3QgaXBjX21lc3NhZ2UsIGxpc3QpOwotCQlsaXN0X2RlbCgmbXNnLT5saXN0KTsKLQl9Ci0KLQlyZXR1cm4gbXNnOwotfQotCi1zdGF0aWMgdm9pZCBzc3RfYnl0X2lwY190eF9tc2dzKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCi17Ci0Jc3RydWN0IHNzdF9ieXQgKmJ5dCA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3N0X2J5dCwga3dvcmspOwotCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOwotCXU2NCBpcGN4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Ci0JaWYgKGxpc3RfZW1wdHkoJmJ5dC0+dHhfbGlzdCkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBpZiB0aGUgRFNQIGlzIGJ1c3kgd2Ugd2lsbCBUWCBtZXNzYWdlcyBhZnRlciBJUlEgKi8KLQlpcGN4ID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChieXQtPmRzcCwgU1NUX0lQQ1gpOwotCWlmIChpcGN4ICYgU1NUX0JZVF9JUENYX0JVU1kpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZieXQtPnR4X2xpc3QsIHN0cnVjdCBpcGNfbWVzc2FnZSwgbGlzdCk7Ci0KLQlsaXN0X21vdmUoJm1zZy0+bGlzdCwgJmJ5dC0+cnhfbGlzdCk7Ci0KLQkvKiBzZW5kIHRoZSBtZXNzYWdlICovCi0JaWYgKG1zZy0+aGVhZGVyICYgSVBDX0hFQURFUl9MQVJHRSh0cnVlKSkKLQkJc3N0X2RzcF9vdXRib3hfd3JpdGUoYnl0LT5kc3AsIG1zZy0+dHhfZGF0YSwgbXNnLT50eF9zaXplKTsKLQlzc3RfZHNwX3NoaW1fd3JpdGU2NF91bmxvY2tlZChieXQtPmRzcCwgU1NUX0lQQ1gsIG1zZy0+aGVhZGVyKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc3N0X2J5dF90eF9tc2dfcmVwbHlfY29tcGxldGUoc3RydWN0IHNzdF9ieXQgKmJ5dCwKLQkJCQkJCSBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZykKLXsKLQltc2ctPmNvbXBsZXRlID0gdHJ1ZTsKLQotCWlmICghbXNnLT53YWl0KQotCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZieXQtPmVtcHR5X2xpc3QpOwotCWVsc2UKLQkJd2FrZV91cCgmbXNnLT53YWl0cSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNzdF9ieXRfZHJvcF9hbGwoc3RydWN0IHNzdF9ieXQgKmJ5dCkKLXsKLQlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZywgKnRtcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogZHJvcCBhbGwgVFggYW5kIFJ4IG1lc3NhZ2VzIGJlZm9yZSB3ZSBzdGFsbCArIHJlc2V0IERTUCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZieXQtPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCB0bXAsICZieXQtPnR4X2xpc3QsIGxpc3QpIHsKLQkJbGlzdF9tb3ZlKCZtc2ctPmxpc3QsICZieXQtPmVtcHR5X2xpc3QpOwotCX0KLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIHRtcCwgJmJ5dC0+cnhfbGlzdCwgbGlzdCkgewotCQlsaXN0X21vdmUoJm1zZy0+bGlzdCwgJmJ5dC0+ZW1wdHlfbGlzdCk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2J5dF90eF93YWl0X2RvbmUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IGlwY19tZXNzYWdlICptc2csCi0JCQkJdm9pZCAqcnhfZGF0YSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQ7Ci0KLQkvKiB3YWl0IGZvciBEU1AgY29tcGxldGlvbiAqLwotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChtc2ctPndhaXRxLCBtc2ctPmNvbXBsZXRlLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKElQQ19USU1FT1VUX01TRUNTKSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYnl0LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Ci0JaWYgKHJldCA9PSAwKSB7Ci0JCWxpc3RfZGVsKCZtc2ctPmxpc3QpOwotCQlzc3RfYnl0X2lwY19zaGltX2RiZyhieXQsICJtZXNzYWdlIHRpbWVvdXQiKTsKLQotCQlyZXQgPSAtRVRJTUVET1VUOwotCX0gZWxzZSB7Ci0KLQkJLyogY29weSB0aGUgZGF0YSByZXR1cm5lZCBmcm9tIERTUCAqLwotCQlpZiAobXNnLT5yeF9zaXplKQotCQkJbWVtY3B5KHJ4X2RhdGEsIG1zZy0+cnhfZGF0YSwgbXNnLT5yeF9zaXplKTsKLQkJcmV0ID0gbXNnLT5lcnJubzsKLQl9Ci0KLQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZieXQtPmVtcHR5X2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2J5dF9pcGNfdHhfbWVzc2FnZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAotCQkJCSAgdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzLAotCQkJCSAgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzLCBpbnQgd2FpdCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOwotCi0JbXNnID0gc3N0X2J5dF9tc2dfZ2V0X2VtcHR5KGJ5dCk7Ci0JaWYgKG1zZyA9PSBOVUxMKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ5dC0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCW1zZy0+aGVhZGVyID0gaGVhZGVyOwotCW1zZy0+dHhfc2l6ZSA9IHR4X2J5dGVzOwotCW1zZy0+cnhfc2l6ZSA9IHJ4X2J5dGVzOwotCW1zZy0+d2FpdCA9IHdhaXQ7Ci0JbXNnLT5lcnJubyA9IDA7Ci0JbXNnLT5jb21wbGV0ZSA9IGZhbHNlOwotCi0JaWYgKHR4X2J5dGVzKSB7Ci0JCS8qIG1zZyBjb250ZW50ID0gbG93ZXIgMzItYml0IG9mIHRoZSBoZWFkZXIgKyBkYXRhICovCi0JCSoodTMyICopbXNnLT50eF9kYXRhID0gKHUzMikoaGVhZGVyICYgKHUzMiktMSk7Ci0JCW1lbWNweShtc2ctPnR4X2RhdGEgKyBzaXplb2YodTMyKSwgdHhfZGF0YSwgdHhfYnl0ZXMpOwotCQltc2ctPnR4X3NpemUgKz0gc2l6ZW9mKHUzMik7Ci0JfQotCi0JbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmYnl0LT50eF9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZieXQtPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCXF1ZXVlX2t0aHJlYWRfd29yaygmYnl0LT5rd29ya2VyLCAmYnl0LT5rd29yayk7Ci0KLQlpZiAod2FpdCkKLQkJcmV0dXJuIHNzdF9ieXRfdHhfd2FpdF9kb25lKGJ5dCwgbXNnLCByeF9kYXRhKTsKLQllbHNlCi0JCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBzc3RfYnl0X2lwY190eF9tc2dfd2FpdChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAotCQkJCQkgIHZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcywKLQkJCQkJICB2b2lkICpyeF9kYXRhLCBzaXplX3QgcnhfYnl0ZXMpCi17Ci0JcmV0dXJuIHNzdF9ieXRfaXBjX3R4X21lc3NhZ2UoYnl0LCBoZWFkZXIsIHR4X2RhdGEsIHR4X2J5dGVzLAotCQkJCSAgICAgIHJ4X2RhdGEsIHJ4X2J5dGVzLCAxKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc3N0X2J5dF9pcGNfdHhfbXNnX25vd2FpdChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyLAotCQkJCQkJdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzKQotewotCXJldHVybiBzc3RfYnl0X2lwY190eF9tZXNzYWdlKGJ5dCwgaGVhZGVyLCB0eF9kYXRhLCB0eF9ieXRlcywKLQkJCQkgICAgICBOVUxMLCAwLCAwKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpcGNfbWVzc2FnZSAqc3N0X2J5dF9yZXBseV9maW5kX21zZyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LAotCQkJCQkJICB1NjQgaGVhZGVyKQotewotCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnID0gTlVMTCwgKl9tc2c7Ci0JdTY0IG1hc2s7Ci0KLQkvKiBtYXRjaCByZXBseSB0byBtZXNzYWdlIHNlbnQgYmFzZWQgb24gbXNnIGFuZCBzdHJlYW0gSURzICovCi0JbWFzayA9IElQQ19IRUFERVJfTVNHX0lEX01BU0sgfAotCSAgICAgICBJUENfSEVBREVSX1NUUl9JRF9NQVNLIDw8IElQQ19IRUFERVJfU1RSX0lEX1NISUZUOwotCWhlYWRlciAmPSBtYXNrOwotCi0JaWYgKGxpc3RfZW1wdHkoJmJ5dC0+cnhfbGlzdCkpIHsKLQkJZGV2X2VycihieXQtPmRldiwKLQkJCSJpcGM6IHJ4IGxpc3QgaXMgZW1wdHkgYnV0IHJlY2VpdmVkIDB4JWxseFxuIiwgaGVhZGVyKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShfbXNnLCAmYnl0LT5yeF9saXN0LCBsaXN0KSB7Ci0JCWlmICgoX21zZy0+aGVhZGVyICYgbWFzaykgPT0gaGVhZGVyKSB7Ci0JCQltc2cgPSBfbXNnOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLW91dDoKLQlyZXR1cm4gbXNnOwotfQotCi1zdGF0aWMgdm9pZCBzc3RfYnl0X3N0cmVhbV91cGRhdGUoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IGlwY19tZXNzYWdlICptc2cpCi17Ci0Jc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW07Ci0JdTY0IGhlYWRlciA9IG1zZy0+aGVhZGVyOwotCXU4IHN0cmVhbV9pZCA9IHNzdF9ieXRfaGVhZGVyX3N0cl9pZChoZWFkZXIpOwotCXU4IHN0cmVhbV9tc2cgPSBzc3RfYnl0X2hlYWRlcl9tc2dfaWQoaGVhZGVyKTsKLQotCXN0cmVhbSA9IHNzdF9ieXRfZ2V0X3N0cmVhbShieXQsIHN0cmVhbV9pZCk7Ci0JaWYgKHN0cmVhbSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlzd2l0Y2ggKHN0cmVhbV9tc2cpIHsKLQljYXNlIElQQ19JQV9EUk9QX1NUUkVBTToKLQljYXNlIElQQ19JQV9QQVVTRV9TVFJFQU06Ci0JY2FzZSBJUENfSUFfRlJFRV9TVFJFQU06Ci0JCXN0cmVhbS0+cnVubmluZyA9IGZhbHNlOwotCQlicmVhazsKLQljYXNlIElQQ19JQV9TVEFSVF9TVFJFQU06Ci0JY2FzZSBJUENfSUFfUkVTVU1FX1NUUkVBTToKLQkJc3RyZWFtLT5ydW5uaW5nID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JfQotfQotCi1zdGF0aWMgaW50IHNzdF9ieXRfcHJvY2Vzc19yZXBseShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyKQotewotCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOwotCi0JbXNnID0gc3N0X2J5dF9yZXBseV9maW5kX21zZyhieXQsIGhlYWRlcik7Ci0JaWYgKG1zZyA9PSBOVUxMKQotCQlyZXR1cm4gMTsKLQotCWlmIChoZWFkZXIgJiBJUENfSEVBREVSX0xBUkdFKHRydWUpKSB7Ci0JCW1zZy0+cnhfc2l6ZSA9IHNzdF9ieXRfaGVhZGVyX2RhdGEoaGVhZGVyKTsKLQkJc3N0X2RzcF9pbmJveF9yZWFkKGJ5dC0+ZHNwLCBtc2ctPnJ4X2RhdGEsIG1zZy0+cnhfc2l6ZSk7Ci0JfQotCi0JLyogdXBkYXRlIGFueSBzdHJlYW0gc3RhdGVzICovCi0Jc3N0X2J5dF9zdHJlYW1fdXBkYXRlKGJ5dCwgbXNnKTsKLQotCWxpc3RfZGVsKCZtc2ctPmxpc3QpOwotCS8qIHdha2UgdXAgKi8KLQlzc3RfYnl0X3R4X21zZ19yZXBseV9jb21wbGV0ZShieXQsIG1zZyk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgc3N0X2J5dF9md19yZWFkeShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCB1NjQgaGVhZGVyKQotewotCWRldl9kYmcoYnl0LT5kZXYsICJpcGM6IERTUCBpcyByZWFkeSAweCVsbFhcbiIsIGhlYWRlcik7Ci0KLQlieXQtPmJvb3RfY29tcGxldGUgPSB0cnVlOwotCXdha2VfdXAoJmJ5dC0+Ym9vdF93YWl0KTsKLX0KLQotc3RhdGljIGludCBzc3RfYnl0X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKHN0cnVjdCBzc3RfYnl0ICpieXQsCi0JCQkJCXVuc2lnbmVkIGxvbmcgKmZsYWdzKQotewotCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBieXQtPmRzcDsKLQlzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbTsKLQl1NjQgaGVhZGVyOwotCXU4IG1zZ19pZCwgc3RyZWFtX2lkOwotCWludCBoYW5kbGVkID0gMTsKLQotCWhlYWRlciA9IHNzdF9kc3Bfc2hpbV9yZWFkNjRfdW5sb2NrZWQoc3N0LCBTU1RfSVBDRCk7Ci0JbXNnX2lkID0gc3N0X2J5dF9oZWFkZXJfbXNnX2lkKGhlYWRlcik7Ci0KLQlzd2l0Y2ggKG1zZ19pZCkgewotCWNhc2UgSVBDX1NTVF9QRVJJT0RfRUxBUFNFRDoKLQkJc3RyZWFtX2lkID0gc3N0X2J5dF9oZWFkZXJfc3RyX2lkKGhlYWRlcik7Ci0JCXN0cmVhbSA9IHNzdF9ieXRfZ2V0X3N0cmVhbShieXQsIHN0cmVhbV9pZCk7Ci0JCWlmIChzdHJlYW0gJiYgc3RyZWFtLT5ydW5uaW5nICYmIHN0cmVhbS0+bm90aWZ5X3Bvc2l0aW9uKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCAqZmxhZ3MpOwotCQkJc3RyZWFtLT5ub3RpZnlfcG9zaXRpb24oc3RyZWFtLCBzdHJlYW0tPnBkYXRhKTsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCAqZmxhZ3MpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSVBDX0lBX0ZXX0lOSVRfQ01QTFQ6Ci0JCXNzdF9ieXRfZndfcmVhZHkoYnl0LCBoZWFkZXIpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gaGFuZGxlZDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IHNzdF9ieXRfaXJxX3RocmVhZChpbnQgaXJxLCB2b2lkICpjb250ZXh0KQotewotCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKLQlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gc3N0X2RzcF9nZXRfdGhyZWFkX2NvbnRleHQoc3N0KTsKLQl1NjQgaGVhZGVyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOwotCi0JaGVhZGVyID0gc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzc3QsIFNTVF9JUENEKTsKLQlpZiAoaGVhZGVyICYgU1NUX0JZVF9JUENEX0JVU1kpIHsKLQkJaWYgKGhlYWRlciAmIElQQ19OT1RJRklDQVRJT04pIHsKLQkJCS8qIG1lc3NhZ2UgZnJvbSBBRFNQICovCi0JCQlzc3RfYnl0X3Byb2Nlc3Nfbm90aWZpY2F0aW9uKGJ5dCwgJmZsYWdzKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHJlcGx5IGZyb20gQURTUCAqLwotCQkJc3N0X2J5dF9wcm9jZXNzX3JlcGx5KGJ5dCwgaGVhZGVyKTsKLQkJfQotCQkvKgotCQkgKiBjbGVhciBJUENEIEJVU1kgYml0IGFuZCBzZXQgRE9ORSBiaXQuIFRlbGwgRFNQIHdlIGhhdmUKLQkJICogcHJvY2Vzc2VkIHRoZSBtZXNzYWdlIGFuZCBjYW4gYWNjZXB0IG5ldy4gQ2xlYXIgZGF0YSBwYXJ0Ci0JCSAqIG9mIHRoZSBoZWFkZXIKLQkJICovCi0JCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0czY0X3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QsCi0JCQlTU1RfQllUX0lQQ0RfRE9ORSB8IFNTVF9CWVRfSVBDRF9CVVNZIHwKLQkJCUlQQ19IRUFERVJfREFUQShJUENfSEVBREVSX0RBVEFfTUFTSyksCi0JCQlTU1RfQllUX0lQQ0RfRE9ORSk7Ci0JCS8qIHVubWFzayBtZXNzYWdlIHJlcXVlc3QgaW50ZXJydXB0cyAqLwotCQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzc3QsIFNTVF9JTVJYLAotCQkJU1NUX0JZVF9JTVJYX1JFUVVFU1QsIDApOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCS8qIGNvbnRpbnVlIHRvIHNlbmQgYW55IHJlbWFpbmluZyBtZXNzYWdlcy4uLiAqLwotCXF1ZXVlX2t0aHJlYWRfd29yaygmYnl0LT5rd29ya2VyLCAmYnl0LT5rd29yayk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qIHN0cmVhbSBBUEkgKi8KLXN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3N0X2J5dF9zdHJlYW1fbmV3KHN0cnVjdCBzc3RfYnl0ICpieXQsIGludCBpZCwKLQl1MzIgKCpub3RpZnlfcG9zaXRpb24pKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKSwKLQl2b2lkICpkYXRhKQotewotCXN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtOwotCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBieXQtPmRzcDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOwotCWlmIChzdHJlYW0gPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkKCZzdHJlYW0tPm5vZGUsICZieXQtPnN0cmVhbV9saXN0KTsKLQlzdHJlYW0tPm5vdGlmeV9wb3NpdGlvbiA9IG5vdGlmeV9wb3NpdGlvbjsKLQlzdHJlYW0tPnBkYXRhID0gZGF0YTsKLQlzdHJlYW0tPmJ5dCA9IGJ5dDsKLQlzdHJlYW0tPnN0cl9pZCA9IGlkOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiBzdHJlYW07Ci19Ci0KLWludCBzc3RfYnl0X3N0cmVhbV9zZXRfYml0cyhzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKLQkJCSAgICBpbnQgYml0cykKLXsKLQlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5wY21fd2Rfc3ogPSBiaXRzOwotCXJldHVybiAwOwotfQotCi1pbnQgc3N0X2J5dF9zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfYnl0ICpieXQsCi0JCQkJc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0sIHU4IGNoYW5uZWxzKQotewotCXN0cmVhbS0+cmVxdWVzdC5wY21fcGFyYW1zLm51bV9jaGFuID0gY2hhbm5lbHM7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzc3RfYnl0X3N0cmVhbV9zZXRfcmF0ZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgcmF0ZSkKLXsKLQlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5zZnJlcSA9IHJhdGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIHN0cmVhbSBzb25maWd1cmF0aW9uICovCi1pbnQgc3N0X2J5dF9zdHJlYW1fdHlwZShzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKLQkJCWludCBjb2RlY190eXBlLCBpbnQgc3RyZWFtX3R5cGUsIGludCBvcGVyYXRpb24pCi17Ci0Jc3RyZWFtLT5yZXF1ZXN0LnN0cl90eXBlLmNvZGVjX3R5cGUgPSBjb2RlY190eXBlOwotCXN0cmVhbS0+cmVxdWVzdC5zdHJfdHlwZS5zdHJfdHlwZSA9IHN0cmVhbV90eXBlOwotCXN0cmVhbS0+cmVxdWVzdC5zdHJfdHlwZS5vcGVyYXRpb24gPSBvcGVyYXRpb247Ci0Jc3RyZWFtLT5yZXF1ZXN0LnN0cl90eXBlLnRpbWVfc2xvdHMgPSAweGM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHNzdF9ieXRfc3RyZWFtX2J1ZmZlcihzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKLQkJCSAgdWludDMyX3QgYnVmZmVyX2FkZHIsIHVpbnQzMl90IGJ1ZmZlcl9zaXplKQotewotCXN0cmVhbS0+cmVxdWVzdC5mcmFtZV9pbmZvLm51bV9lbnRyaWVzID0gMTsKLQlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5yaW5nX2J1Zl9pbmZvWzBdLmFkZHIgPSBidWZmZXJfYWRkcjsKLQlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5yaW5nX2J1Zl9pbmZvWzBdLnNpemUgPSBidWZmZXJfc2l6ZTsKLQkvKiBjYWxjdWxhdGUgYnl0ZXMgcGVyIDQgbXMgZnJhZ21lbnQgKi8KLQlzdHJlYW0tPnJlcXVlc3QuZnJhbWVfaW5mby5mcmFnX3NpemUgPQotCQlzdHJlYW0tPnJlcXVlc3QucGNtX3BhcmFtcy5zZnJlcSAqCi0JCXN0cmVhbS0+cmVxdWVzdC5wY21fcGFyYW1zLm51bV9jaGFuICoKLQkJc3RyZWFtLT5yZXF1ZXN0LnBjbV9wYXJhbXMucGNtX3dkX3N6IC8gOCAqCi0JCTQgLyAxMDAwOwotCXJldHVybiAwOwotfQotCi1pbnQgc3N0X2J5dF9zdHJlYW1fY29tbWl0KHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQotewotCXN0cnVjdCBzc3RfYnl0X2FsbG9jX3BhcmFtcyAqc3RyX3JlcSA9ICZzdHJlYW0tPnJlcXVlc3Q7Ci0Jc3RydWN0IHNzdF9ieXRfYWxsb2NfcmVzcG9uc2UgKnJlcGx5ID0gJnN0cmVhbS0+cmVwbHk7Ci0JdTY0IGhlYWRlcjsKLQlpbnQgcmV0OwotCi0JaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX0FMTE9DX1NUUkVBTSwKLQkJCQlzaXplb2YoKnN0cl9yZXEpICsgc2l6ZW9mKHUzMiksCi0JCQkJdHJ1ZSwgc3RyZWFtLT5zdHJfaWQpOwotCXJldCA9IHNzdF9ieXRfaXBjX3R4X21zZ193YWl0KGJ5dCwgaGVhZGVyLCBzdHJfcmVxLCBzaXplb2YoKnN0cl9yZXEpLAotCQkJCSAgICAgIHJlcGx5LCBzaXplb2YoKnJlcGx5KSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihieXQtPmRldiwgImlwYzogZXJyb3Igc3RyZWFtIGNvbW1pdCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXN0cmVhbS0+Y29tbWl0ZWQgPSB0cnVlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBzc3RfYnl0X3N0cmVhbV9mcmVlKHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQotewotCXU2NCBoZWFkZXI7Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJ5dC0+ZHNwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIXN0cmVhbS0+Y29tbWl0ZWQpCi0JCWdvdG8gb3V0OwotCi0JaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX0ZSRUVfU1RSRUFNLCAwLCBmYWxzZSwgc3RyZWFtLT5zdHJfaWQpOwotCXJldCA9IHNzdF9ieXRfaXBjX3R4X21zZ193YWl0KGJ5dCwgaGVhZGVyLCBOVUxMLCAwLCBOVUxMLCAwKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBmcmVlIHN0cmVhbSAlZCBmYWlsZWRcbiIsCi0JCQlzdHJlYW0tPnN0cl9pZCk7Ci0JCXJldHVybiAtRUFHQUlOOwotCX0KLQotCXN0cmVhbS0+Y29tbWl0ZWQgPSBmYWxzZTsKLW91dDoKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOwotCWxpc3RfZGVsKCZzdHJlYW0tPm5vZGUpOwotCWtmcmVlKHN0cmVhbSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKHN0cnVjdCBzc3RfYnl0ICpieXQsIGludCB0eXBlLAotCQkJCSAgICAgaW50IHN0cmVhbV9pZCwgaW50IHdhaXQpCi17Ci0JdTY0IGhlYWRlcjsKLQotCWhlYWRlciA9IHNzdF9ieXRfaGVhZGVyKHR5cGUsIDAsIGZhbHNlLCBzdHJlYW1faWQpOwotCWlmICh3YWl0KQotCQlyZXR1cm4gc3N0X2J5dF9pcGNfdHhfbXNnX3dhaXQoYnl0LCBoZWFkZXIsIE5VTEwsIDAsIE5VTEwsIDApOwotCWVsc2UKLQkJcmV0dXJuIHNzdF9ieXRfaXBjX3R4X21zZ19ub3dhaXQoYnl0LCBoZWFkZXIsIE5VTEwsIDApOwotfQotCi0vKiBzdHJlYW0gQUxTQSB0cmlnZ2VyIG9wZXJhdGlvbnMgKi8KLWludCBzc3RfYnl0X3N0cmVhbV9zdGFydChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSwKLQkJCSB1MzIgc3RhcnRfb2Zmc2V0KQotewotCXN0cnVjdCBzc3RfYnl0X3N0YXJ0X3N0cmVhbV9wYXJhbXMgc3RhcnRfc3RyZWFtOwotCXZvaWQgKnR4X21zZzsKLQlzaXplX3Qgc2l6ZTsKLQl1NjQgaGVhZGVyOwotCWludCByZXQ7Ci0KLQlzdGFydF9zdHJlYW0uYnl0ZV9vZmZzZXQgPSBzdGFydF9vZmZzZXQ7Ci0JaGVhZGVyID0gc3N0X2J5dF9oZWFkZXIoSVBDX0lBX1NUQVJUX1NUUkVBTSwKLQkJCQlzaXplb2Yoc3RhcnRfc3RyZWFtKSArIHNpemVvZih1MzIpLAotCQkJCXRydWUsIHN0cmVhbS0+c3RyX2lkKTsKLQl0eF9tc2cgPSAmc3RhcnRfc3RyZWFtOwotCXNpemUgPSBzaXplb2Yoc3RhcnRfc3RyZWFtKTsKLQotCXJldCA9IHNzdF9ieXRfaXBjX3R4X21zZ19ub3dhaXQoYnl0LCBoZWFkZXIsIHR4X21zZywgc2l6ZSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoYnl0LT5kZXYsICJpcGM6IGVycm9yIGZhaWxlZCB0byBzdGFydCBzdHJlYW0gJWRcbiIsCi0JCQlzdHJlYW0tPnN0cl9pZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgc3N0X2J5dF9zdHJlYW1fc3RvcChzdHJ1Y3Qgc3N0X2J5dCAqYnl0LCBzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbSkKLXsKLQlpbnQgcmV0OwotCi0JLyogZG9uJ3Qgc3RvcCBzdHJlYW1zIHRoYXQgYXJlIG5vdCBjb21taXRlZCAqLwotCWlmICghc3RyZWFtLT5jb21taXRlZCkKLQkJcmV0dXJuIDA7Ci0KLQlyZXQgPSBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKGJ5dCwgSVBDX0lBX0RST1BfU1RSRUFNLAotCQkJCQlzdHJlYW0tPnN0cl9pZCwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoYnl0LT5kZXYsICJpcGM6IGVycm9yIGZhaWxlZCB0byBzdG9wIHN0cmVhbSAlZFxuIiwKLQkJCXN0cmVhbS0+c3RyX2lkKTsKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgc3N0X2J5dF9zdHJlYW1fcGF1c2Uoc3RydWN0IHNzdF9ieXQgKmJ5dCwgc3RydWN0IHNzdF9ieXRfc3RyZWFtICpzdHJlYW0pCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHNzdF9ieXRfc3RyZWFtX29wZXJhdGlvbnMoYnl0LCBJUENfSUFfUEFVU0VfU1RSRUFNLAotCQkJCQlzdHJlYW0tPnN0cl9pZCwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoYnl0LT5kZXYsICJpcGM6IGVycm9yIGZhaWxlZCB0byBwYXVzZSBzdHJlYW0gJWRcbiIsCi0JCQlzdHJlYW0tPnN0cl9pZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgc3N0X2J5dF9zdHJlYW1fcmVzdW1lKHN0cnVjdCBzc3RfYnl0ICpieXQsIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtKQotewotCWludCByZXQ7Ci0KLQlyZXQgPSBzc3RfYnl0X3N0cmVhbV9vcGVyYXRpb25zKGJ5dCwgSVBDX0lBX1JFU1VNRV9TVFJFQU0sCi0JCQkJCXN0cmVhbS0+c3RyX2lkLCAwKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihieXQtPmRldiwgImlwYzogZXJyb3IgZmFpbGVkIHRvIHJlc3VtZSBzdHJlYW0gJWRcbiIsCi0JCQlzdHJlYW0tPnN0cl9pZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgc3N0X2J5dF9nZXRfZHNwX3Bvc2l0aW9uKHN0cnVjdCBzc3RfYnl0ICpieXQsCi0JCQkgICAgIHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCBpbnQgYnVmZmVyX3NpemUpCi17Ci0Jc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJ5dC0+ZHNwOwotCXN0cnVjdCBzc3RfYnl0X3RzdGFtcCBmd190c3RhbXA7Ci0JdTggc3RyX2lkID0gc3RyZWFtLT5zdHJfaWQ7Ci0JdTMyIHRzdGFtcF9vZmZzZXQ7Ci0KLQl0c3RhbXBfb2Zmc2V0ID0gU1NUX0JZVF9USU1FU1RBTVBfT0ZGU0VUICsgc3RyX2lkICogc2l6ZW9mKGZ3X3RzdGFtcCk7Ci0JbWVtY3B5X2Zyb21pbygmZndfdHN0YW1wLAotCQkgICAgICBzc3QtPmFkZHIubHBlICsgdHN0YW1wX29mZnNldCwgc2l6ZW9mKGZ3X3RzdGFtcCkpOwotCi0JcmV0dXJuIGRvX2Rpdihmd190c3RhbXAucmluZ19idWZmZXJfY291bnRlciwgYnVmZmVyX3NpemUpOwotfQotCi1zdGF0aWMgaW50IG1zZ19lbXB0eV9saXN0X2luaXQoc3RydWN0IHNzdF9ieXQgKmJ5dCkKLXsKLQlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKLQlpbnQgaTsKLQotCWJ5dC0+bXNnID0ga3phbGxvYyhzaXplb2YoKm1zZykgKiBJUENfRU1QVFlfTElTVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoYnl0LT5tc2cgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSVBDX0VNUFRZX0xJU1RfU0laRTsgaSsrKSB7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ5dC0+bXNnW2ldLndhaXRxKTsKLQkJbGlzdF9hZGQoJmJ5dC0+bXNnW2ldLmxpc3QsICZieXQtPmVtcHR5X2xpc3QpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3Qgc3N0X2RzcCAqc3N0X2J5dF9nZXRfZHNwKHN0cnVjdCBzc3RfYnl0ICpieXQpCi17Ci0JcmV0dXJuIGJ5dC0+ZHNwOwotfQotCi1zdGF0aWMgc3RydWN0IHNzdF9kc3BfZGV2aWNlIGJ5dF9kZXYgPSB7Ci0JLnRocmVhZCA9IHNzdF9ieXRfaXJxX3RocmVhZCwKLQkub3BzID0gJnNzdF9ieXRfb3BzLAotfTsKLQotaW50IHNzdF9ieXRfZHNwX3N1c3BlbmRfbGF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQotewotCXN0cnVjdCBzc3RfYnl0ICpieXQgPSBwZGF0YS0+ZHNwOwotCi0JZGV2X2RiZyhieXQtPmRldiwgImRzcCByZXNldFxuIik7Ci0Jc3N0X2RzcF9yZXNldChieXQtPmRzcCk7Ci0Jc3N0X2J5dF9kcm9wX2FsbChieXQpOwotCWRldl9kYmcoYnl0LT5kZXYsICJkc3AgaW4gcmVzZXRcbiIpOwotCi0JZGV2X2RiZyhieXQtPmRldiwgImZyZWUgYWxsIGJsb2NrcyBhbmQgdW5sb2FkIGZ3XG4iKTsKLQlzc3RfZndfdW5sb2FkKGJ5dC0+ZncpOwotCi0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfYnl0X2RzcF9zdXNwZW5kX2xhdGUpOwotCi1pbnQgc3N0X2J5dF9kc3BfYm9vdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQotewotCXN0cnVjdCBzc3RfYnl0ICpieXQgPSBwZGF0YS0+ZHNwOwotCWludCByZXQ7Ci0KLQlkZXZfZGJnKGJ5dC0+ZGV2LCAicmVsb2FkIGRzcCBmd1xuIik7Ci0KLQlzc3RfZHNwX3Jlc2V0KGJ5dC0+ZHNwKTsKLQotCXJldCA9IHNzdF9md19yZWxvYWQoYnl0LT5mdyk7Ci0JaWYgKHJldCA8ICAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiZXJyb3I6IGZhaWxlZCB0byByZWxvYWQgZmlybXdhcmVcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIHdhaXQgZm9yIERTUCBib290IGNvbXBsZXRpb24gKi8KLQlieXQtPmJvb3RfY29tcGxldGUgPSBmYWxzZTsKLQlzc3RfZHNwX2Jvb3QoYnl0LT5kc3ApOwotCWRldl9kYmcoYnl0LT5kZXYsICJkc3AgYm9vdGluZy4uLlxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9ieXRfZHNwX2Jvb3QpOwotCi1pbnQgc3N0X2J5dF9kc3Bfd2FpdF9mb3JfcmVhZHkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKLXsKLQlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gcGRhdGEtPmRzcDsKLQlpbnQgZXJyOwotCi0JZGV2X2RiZyhieXQtPmRldiwgIndhaXQgZm9yIGRzcCByZWJvb3RcbiIpOwotCi0JZXJyID0gd2FpdF9ldmVudF90aW1lb3V0KGJ5dC0+Ym9vdF93YWl0LCBieXQtPmJvb3RfY29tcGxldGUsCi0JCQkJIG1zZWNzX3RvX2ppZmZpZXMoSVBDX0JPT1RfTVNFQ1MpKTsKLQlpZiAoZXJyID09IDApIHsKLQkJZGV2X2VycihieXQtPmRldiwgImlwYzogZXJyb3IgRFNQIGJvb3QgdGltZW91dFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWRldl9kYmcoYnl0LT5kZXYsICJkc3AgcmVib290ZWRcbiIpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2J5dF9kc3Bfd2FpdF9mb3JfcmVhZHkpOwotCi1pbnQgc3N0X2J5dF9kc3BfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQotewotCXN0cnVjdCBzc3RfYnl0ICpieXQ7Ci0Jc3RydWN0IHNzdF9mdyAqYnl0X3NzdF9mdzsKLQlzdHJ1Y3Qgc3N0X2J5dF9md19pbml0IGluaXQ7Ci0JaW50IGVycjsKLQotCWRldl9kYmcoZGV2LCAiaW5pdGlhbGlzaW5nIEJ5dCBEU1AgSVBDXG4iKTsKLQotCWJ5dCA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqYnl0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGJ5dCA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWJ5dC0+ZGV2ID0gZGV2OwotCUlOSVRfTElTVF9IRUFEKCZieXQtPnN0cmVhbV9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmYnl0LT50eF9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmYnl0LT5yeF9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmYnl0LT5lbXB0eV9saXN0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZieXQtPmJvb3Rfd2FpdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYnl0LT53YWl0X3R4cSk7Ci0KLQllcnIgPSBtc2dfZW1wdHlfbGlzdF9pbml0KGJ5dCk7Ci0JaWYgKGVyciA8IDApCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogc3RhcnQgdGhlIElQQyBtZXNzYWdlIHRocmVhZCAqLwotCWluaXRfa3RocmVhZF93b3JrZXIoJmJ5dC0+a3dvcmtlcik7Ci0JYnl0LT50eF90aHJlYWQgPSBrdGhyZWFkX3J1bihrdGhyZWFkX3dvcmtlcl9mbiwKLQkJCQkgICAgICZieXQtPmt3b3JrZXIsICIlcyIsCi0JCQkJICAgICBkZXZfbmFtZShieXQtPmRldikpOwotCWlmIChJU19FUlIoYnl0LT50eF90aHJlYWQpKSB7Ci0JCWVyciA9IFBUUl9FUlIoYnl0LT50eF90aHJlYWQpOwotCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiZXJyb3IgZmFpbGVkIHRvIGNyZWF0ZSBtZXNzYWdlIFRYIHRhc2tcbiIpOwotCQlnb3RvIGVycl9mcmVlX21zZzsKLQl9Ci0JaW5pdF9rdGhyZWFkX3dvcmsoJmJ5dC0+a3dvcmssIHNzdF9ieXRfaXBjX3R4X21zZ3MpOwotCi0JYnl0X2Rldi50aHJlYWRfY29udGV4dCA9IGJ5dDsKLQotCS8qIGluaXQgU1NUIHNoaW0gKi8KLQlieXQtPmRzcCA9IHNzdF9kc3BfbmV3KGRldiwgJmJ5dF9kZXYsIHBkYXRhKTsKLQlpZiAoYnl0LT5kc3AgPT0gTlVMTCkgewotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIGRzcF9lcnI7Ci0JfQotCi0JLyoga2VlcCB0aGUgRFNQIGluIHJlc2V0IHN0YXRlIGZvciBiYXNlIEZXIGxvYWRpbmcgKi8KLQlzc3RfZHNwX3Jlc2V0KGJ5dC0+ZHNwKTsKLQotCWJ5dF9zc3RfZncgPSBzc3RfZndfbmV3KGJ5dC0+ZHNwLCBwZGF0YS0+ZncsIGJ5dCk7Ci0JaWYgKGJ5dF9zc3RfZncgID09IE5VTEwpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZGV2X2VycihkZXYsICJlcnJvcjogZmFpbGVkIHRvIGxvYWQgZmlybXdhcmVcbiIpOwotCQlnb3RvIGZ3X2VycjsKLQl9Ci0KLQkvKiB3YWl0IGZvciBEU1AgYm9vdCBjb21wbGV0aW9uICovCi0Jc3N0X2RzcF9ib290KGJ5dC0+ZHNwKTsKLQllcnIgPSB3YWl0X2V2ZW50X3RpbWVvdXQoYnl0LT5ib290X3dhaXQsIGJ5dC0+Ym9vdF9jb21wbGV0ZSwKLQkJCQkgbXNlY3NfdG9famlmZmllcyhJUENfQk9PVF9NU0VDUykpOwotCWlmIChlcnIgPT0gMCkgewotCQllcnIgPSAtRUlPOwotCQlkZXZfZXJyKGJ5dC0+ZGV2LCAiaXBjOiBlcnJvciBEU1AgYm9vdCB0aW1lb3V0XG4iKTsKLQkJZ290byBib290X2VycjsKLQl9Ci0KLQkvKiBzaG93IGZpcm13YXJlIGluZm9ybWF0aW9uICovCi0Jc3N0X2RzcF9pbmJveF9yZWFkKGJ5dC0+ZHNwLCAmaW5pdCwgc2l6ZW9mKGluaXQpKTsKLQlkZXZfaW5mbyhieXQtPmRldiwgIkZXIHZlcnNpb246ICUwMnguJTAyeC4lMDJ4LiUwMnhcbiIsCi0JCSBpbml0LmZ3X3ZlcnNpb24ubWFqb3IsIGluaXQuZndfdmVyc2lvbi5taW5vciwKLQkJIGluaXQuZndfdmVyc2lvbi5idWlsZCwgaW5pdC5md192ZXJzaW9uLnR5cGUpOwotCWRldl9pbmZvKGJ5dC0+ZGV2LCAiQnVpbGQgdHlwZTogJXhcbiIsIGluaXQuZndfdmVyc2lvbi50eXBlKTsKLQlkZXZfaW5mbyhieXQtPmRldiwgIkJ1aWxkIGRhdGU6ICVzICVzXG4iLAotCQkgaW5pdC5idWlsZF9pbmZvLmRhdGUsIGluaXQuYnVpbGRfaW5mby50aW1lKTsKLQotCXBkYXRhLT5kc3AgPSBieXQ7Ci0JYnl0LT5mdyA9IGJ5dF9zc3RfZnc7Ci0KLQlyZXR1cm4gMDsKLQotYm9vdF9lcnI6Ci0Jc3N0X2RzcF9yZXNldChieXQtPmRzcCk7Ci0Jc3N0X2Z3X2ZyZWUoYnl0X3NzdF9mdyk7Ci1md19lcnI6Ci0Jc3N0X2RzcF9mcmVlKGJ5dC0+ZHNwKTsKLWRzcF9lcnI6Ci0Ja3RocmVhZF9zdG9wKGJ5dC0+dHhfdGhyZWFkKTsKLWVycl9mcmVlX21zZzoKLQlrZnJlZShieXQtPm1zZyk7Ci0KLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2J5dF9kc3BfaW5pdCk7Ci0KLXZvaWQgc3N0X2J5dF9kc3BfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQotewotCXN0cnVjdCBzc3RfYnl0ICpieXQgPSBwZGF0YS0+ZHNwOwotCi0Jc3N0X2RzcF9yZXNldChieXQtPmRzcCk7Ci0Jc3N0X2Z3X2ZyZWVfYWxsKGJ5dC0+ZHNwKTsKLQlzc3RfZHNwX2ZyZWUoYnl0LT5kc3ApOwotCWt0aHJlYWRfc3RvcChieXQtPnR4X3RocmVhZCk7Ci0Ja2ZyZWUoYnl0LT5tc2cpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2J5dF9kc3BfZnJlZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1iYXl0cmFpbC1wY20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI0YzQ5Yy4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWJheXRyYWlsLXBjbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qCi0gKiBJbnRlbCBCYXl0cmFpbCBTU1QgUENNIFN1cHBvcnQKLSAqIENvcHlyaWdodCAoYykgMjAxNCwgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCi0gKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgInNzdC1iYXl0cmFpbC1pcGMuaCIKLSNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKLSNpbmNsdWRlICJzc3QtZHNwLmgiCi0KLSNkZWZpbmUgQllUX1BDTV9DT1VOVAkJMgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc3N0X2J5dF9wY21faGFyZHdhcmUgPSB7Ci0JLmluZm8JCQk9IFNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCSAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJICBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQkJICBTTkRSVl9QQ01fSU5GT19QQVVTRSB8Ci0JCQkJICBTTkRSVl9QQ01fSU5GT19SRVNVTUUsCi0JLmZvcm1hdHMJCT0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUgfAotCQkJCSAgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUsCi0JLnBlcmlvZF9ieXRlc19taW4JPSAzODQsCi0JLnBlcmlvZF9ieXRlc19tYXgJPSA0ODAwMCwKLQkucGVyaW9kc19taW4JCT0gMiwKLQkucGVyaW9kc19tYXgJCT0gMjUwLAotCS5idWZmZXJfYnl0ZXNfbWF4CT0gOTYwMDAsCi19OwotCi0vKiBwcml2YXRlIGRhdGEgZm9yIGVhY2ggUENNIERTUCBzdHJlYW0gKi8KLXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhIHsKLQlzdHJ1Y3Qgc3N0X2J5dF9zdHJlYW0gKnN0cmVhbTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Ci0KLQkvKiBsYXRlc3QgRFNQIERNQSBodyBwb2ludGVyICovCi0JdTMyIGh3X3B0cjsKLQotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOwotfTsKLQotLyogcHJpdmF0ZSBkYXRhIGZvciB0aGUgZHJpdmVyICovCi1zdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgewotCS8qIHJ1bnRpbWUgRFNQICovCi0Jc3RydWN0IHNzdF9ieXQgKmJ5dDsKLQotCS8qIERBSSBkYXRhICovCi0Jc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgcGNtW0JZVF9QQ01fQ09VTlRdOwotCi0JLyogZmxhZyBpbmRpY2F0aW5nIGlzIHN0cmVhbSBjb250ZXh0IHJlc3RvcmUgbmVlZGVkIGFmdGVyIHN1c3BlbmQgKi8KLQlib29sIHJlc3RvcmVfc3RyZWFtOwotfTsKLQotLyogdGhpcyBtYXkgZ2V0IGNhbGxlZCBzZXZlcmFsIHRpbWVzIGJ5IG9zcyBlbXVsYXRpb24gKi8KLXN0YXRpYyBpbnQgc3N0X2J5dF9wY21faHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhICpwZGF0YSA9Ci0JCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7Ci0Jc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEgKnBjbV9kYXRhID0gJnBkYXRhLT5wY21bc3Vic3RyZWFtLT5zdHJlYW1dOwotCXN0cnVjdCBzc3RfYnl0ICpieXQgPSBwZGF0YS0+Ynl0OwotCXUzMiByYXRlLCBiaXRzOwotCXU4IGNoYW5uZWxzOwotCWludCByZXQsIHBsYXliYWNrID0gKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spOwotCi0JZGV2X2RiZyhydGQtPmRldiwgIlBDTTogaHdfcGFyYW1zLCBwY21fZGF0YSAlcFxuIiwgcGNtX2RhdGEpOwotCi0JcmV0ID0gc3N0X2J5dF9zdHJlYW1fdHlwZShieXQsIHBjbV9kYXRhLT5zdHJlYW0sCi0JCQkJICAxLCAxLCAhcGxheWJhY2spOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsICJmYWlsZWQgdG8gc2V0IHN0cmVhbSBmb3JtYXQgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmF0ZSA9IHBhcmFtc19yYXRlKHBhcmFtcyk7Ci0JcmV0ID0gc3N0X2J5dF9zdHJlYW1fc2V0X3JhdGUoYnl0LCBwY21fZGF0YS0+c3RyZWFtLCByYXRlKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY291bGQgbm90IHNldCByYXRlICVkXG4iLCByYXRlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQliaXRzID0gc25kX3BjbV9mb3JtYXRfd2lkdGgocGFyYW1zX2Zvcm1hdChwYXJhbXMpKTsKLQlyZXQgPSBzc3RfYnl0X3N0cmVhbV9zZXRfYml0cyhieXQsIHBjbV9kYXRhLT5zdHJlYW0sIGJpdHMpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsICJjb3VsZCBub3Qgc2V0IGZvcm1hdHMgJWRcbiIsCi0JCQlwYXJhbXNfcmF0ZShwYXJhbXMpKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQljaGFubmVscyA9ICh1OCkocGFyYW1zX2NoYW5uZWxzKHBhcmFtcykgJiAweEYpOwotCXJldCA9IHNzdF9ieXRfc3RyZWFtX3NldF9jaGFubmVscyhieXQsIHBjbV9kYXRhLT5zdHJlYW0sIGNoYW5uZWxzKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY291bGQgbm90IHNldCBjaGFubmVscyAlZFxuIiwKLQkJCXBhcmFtc19yYXRlKHBhcmFtcykpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7Ci0KLQlyZXQgPSBzc3RfYnl0X3N0cmVhbV9idWZmZXIoYnl0LCBwY21fZGF0YS0+c3RyZWFtLAotCQkJCSAgICBzdWJzdHJlYW0tPmRtYV9idWZmZXIuYWRkciwKLQkJCQkgICAgcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiUENNOiBmYWlsZWQgdG8gc2V0IERNQSBidWZmZXIgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gc3N0X2J5dF9zdHJlYW1fY29tbWl0KGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihydGQtPmRldiwgIlBDTTogZmFpbGVkIHN0cmVhbSBjb21taXQgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2J5dF9wY21faHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0KLQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBod19mcmVlXG4iKTsKLQlzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzc3RfYnl0X3BjbV9yZXN0b3JlX3N0cmVhbV9jb250ZXh0KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnBkYXRhID0KLQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKLQlzdHJ1Y3Qgc3N0X2J5dF9wY21fZGF0YSAqcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVtzdWJzdHJlYW0tPnN0cmVhbV07Ci0Jc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7Ci0JaW50IHJldDsKLQotCS8qIGNvbW1pdCBzdHJlYW0gdXNpbmcgZXhpc3Rpbmcgc3RyZWFtIHBhcmFtcyAqLwotCXJldCA9IHNzdF9ieXRfc3RyZWFtX2NvbW1pdChieXQsIHBjbV9kYXRhLT5zdHJlYW0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsICJQQ006IGZhaWxlZCBzdHJlYW0gY29tbWl0ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXNzdF9ieXRfc3RyZWFtX3N0YXJ0KGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSwgcGNtX2RhdGEtPmh3X3B0cik7Ci0KLQlkZXZfZGJnKHJ0ZC0+ZGV2LCAic3RyZWFtIGNvbnRleHQgcmVzdG9yZWQgYXQgb2Zmc2V0ICVkXG4iLAotCQlwY21fZGF0YS0+aHdfcHRyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzc3RfYnl0X3BjbV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3Qgc3N0X2J5dF9wY21fZGF0YSAqcGNtX2RhdGEgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNzdF9ieXRfcGNtX2RhdGEsIHdvcmspOwotCi0JaWYgKHNuZF9wY21fcnVubmluZyhwY21fZGF0YS0+c3Vic3RyZWFtKSkKLQkJc3N0X2J5dF9wY21fcmVzdG9yZV9zdHJlYW1fY29udGV4dChwY21fZGF0YS0+c3Vic3RyZWFtKTsKLX0KLQotc3RhdGljIGludCBzc3RfYnl0X3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLCBpbnQgY21kKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnBkYXRhID0KLQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKLQlzdHJ1Y3Qgc3N0X2J5dF9wY21fZGF0YSAqcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVtzdWJzdHJlYW0tPnN0cmVhbV07Ci0Jc3RydWN0IHNzdF9ieXQgKmJ5dCA9IHBkYXRhLT5ieXQ7Ci0KLQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiB0cmlnZ2VyICVkXG4iLCBjbWQpOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgotCQlwY21fZGF0YS0+aHdfcHRyID0gMDsKLQkJc3N0X2J5dF9zdHJlYW1fc3RhcnQoYnl0LCBwY21fZGF0YS0+c3RyZWFtLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JCWlmIChwZGF0YS0+cmVzdG9yZV9zdHJlYW0gPT0gdHJ1ZSkKLQkJCXNjaGVkdWxlX3dvcmsoJnBjbV9kYXRhLT53b3JrKTsKLQkJZWxzZQotCQkJc3N0X2J5dF9zdHJlYW1fcmVzdW1lKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKLQkJc3N0X2J5dF9zdHJlYW1fcmVzdW1lKGJ5dCwgcGNtX2RhdGEtPnN0cmVhbSk7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQkJc3N0X2J5dF9zdHJlYW1fc3RvcChieXQsIHBjbV9kYXRhLT5zdHJlYW0pOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Ci0JCXBkYXRhLT5yZXN0b3JlX3N0cmVhbSA9IGZhbHNlOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKLQkJc3N0X2J5dF9zdHJlYW1fcGF1c2UoYnl0LCBwY21fZGF0YS0+c3RyZWFtKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1MzIgYnl0X25vdGlmeV9wb2ludGVyKHN0cnVjdCBzc3RfYnl0X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9IGRhdGE7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwY21fZGF0YS0+c3Vic3RyZWFtOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQotCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOwotCXN0cnVjdCBzc3RfYnl0ICpieXQgPSBwZGF0YS0+Ynl0OwotCXUzMiBwb3MsIGh3X3BvczsKLQotCWh3X3BvcyA9IHNzdF9ieXRfZ2V0X2RzcF9wb3NpdGlvbihieXQsIHBjbV9kYXRhLT5zdHJlYW0sCi0JCQkJCSAgc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSkpOwotCXBjbV9kYXRhLT5od19wdHIgPSBod19wb3M7Ci0JcG9zID0gZnJhbWVzX3RvX2J5dGVzKHJ1bnRpbWUsCi0JCQkgICAgICAocnVudGltZS0+Y29udHJvbC0+YXBwbF9wdHIgJQotCQkJICAgICAgIHJ1bnRpbWUtPmJ1ZmZlcl9zaXplKSk7Ci0KLQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBBcHAvRE1BIHBvaW50ZXIgJXUvJXUgYnl0ZXNcbiIsIHBvcywgaHdfcG9zKTsKLQotCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKLQlyZXR1cm4gcG9zOwotfQotCi1zdGF0aWMgc25kX3BjbV91ZnJhbWVzX3Qgc3N0X2J5dF9wY21fcG9pbnRlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnBkYXRhID0KLQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKLQlzdHJ1Y3Qgc3N0X2J5dF9wY21fZGF0YSAqcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVtzdWJzdHJlYW0tPnN0cmVhbV07Ci0KLQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBETUEgcG9pbnRlciAldSBieXRlc1xuIiwgcGNtX2RhdGEtPmh3X3B0cik7Ci0KLQlyZXR1cm4gYnl0ZXNfdG9fZnJhbWVzKHJ1bnRpbWUsIHBjbV9kYXRhLT5od19wdHIpOwotfQotCi1zdGF0aWMgaW50IHNzdF9ieXRfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQotCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOwotCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9ICZwZGF0YS0+cGNtW3N1YnN0cmVhbS0+c3RyZWFtXTsKLQlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gcGRhdGEtPmJ5dDsKLQotCWRldl9kYmcocnRkLT5kZXYsICJQQ006IG9wZW5cbiIpOwotCi0JbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKLQotCXBjbV9kYXRhLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0KLQlzbmRfc29jX3NldF9ydW50aW1lX2h3cGFyYW1zKHN1YnN0cmVhbSwgJnNzdF9ieXRfcGNtX2hhcmR3YXJlKTsKLQotCXBjbV9kYXRhLT5zdHJlYW0gPSBzc3RfYnl0X3N0cmVhbV9uZXcoYnl0LCBzdWJzdHJlYW0tPnN0cmVhbSArIDEsCi0JCQkJCSAgICAgIGJ5dF9ub3RpZnlfcG9pbnRlciwgcGNtX2RhdGEpOwotCWlmIChwY21fZGF0YS0+c3RyZWFtID09IE5VTEwpIHsKLQkJZGV2X2VycihydGQtPmRldiwgImZhaWxlZCB0byBjcmVhdGUgc3RyZWFtXG4iKTsKLQkJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2J5dF9wY21fY2xvc2Uoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzc3RfYnl0X3ByaXZfZGF0YSAqcGRhdGEgPQotCQlzbmRfc29jX3BsYXRmb3JtX2dldF9kcnZkYXRhKHJ0ZC0+cGxhdGZvcm0pOwotCXN0cnVjdCBzc3RfYnl0X3BjbV9kYXRhICpwY21fZGF0YSA9ICZwZGF0YS0+cGNtW3N1YnN0cmVhbS0+c3RyZWFtXTsKLQlzdHJ1Y3Qgc3N0X2J5dCAqYnl0ID0gcGRhdGEtPmJ5dDsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZyhydGQtPmRldiwgIlBDTTogY2xvc2VcbiIpOwotCi0JY2FuY2VsX3dvcmtfc3luYygmcGNtX2RhdGEtPndvcmspOwotCW11dGV4X2xvY2soJnBjbV9kYXRhLT5tdXRleCk7Ci0JcmV0ID0gc3N0X2J5dF9zdHJlYW1fZnJlZShieXQsIHBjbV9kYXRhLT5zdHJlYW0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9kYmcocnRkLT5kZXYsICJGcmVlIHN0cmVhbSBmYWlsXG4iKTsKLQkJZ290byBvdXQ7Ci0JfQotCXBjbV9kYXRhLT5zdHJlYW0gPSBOVUxMOwotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2J5dF9wY21fbW1hcChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0KLQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiUENNOiBtbWFwXG4iKTsKLQlyZXR1cm4gc25kX3BjbV9saWJfZGVmYXVsdF9tbWFwKHN1YnN0cmVhbSwgdm1hKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzc3RfYnl0X3BjbV9vcHMgPSB7Ci0JLm9wZW4JCT0gc3N0X2J5dF9wY21fb3BlbiwKLQkuY2xvc2UJCT0gc3N0X2J5dF9wY21fY2xvc2UsCi0JLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLAotCS5od19wYXJhbXMJPSBzc3RfYnl0X3BjbV9od19wYXJhbXMsCi0JLmh3X2ZyZWUJPSBzc3RfYnl0X3BjbV9od19mcmVlLAotCS50cmlnZ2VyCT0gc3N0X2J5dF9wY21fdHJpZ2dlciwKLQkucG9pbnRlcgk9IHNzdF9ieXRfcGNtX3BvaW50ZXIsCi0JLm1tYXAJCT0gc3N0X2J5dF9wY21fbW1hcCwKLX07Ci0KLXN0YXRpYyBpbnQgc3N0X2J5dF9wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCi17Ci0Jc3RydWN0IHNuZF9wY20gKnBjbSA9IHJ0ZC0+cGNtOwotCXNpemVfdCBzaXplOwotCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHJ0ZC0+cGxhdGZvcm07Ci0Jc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHBsYXRmb3JtLT5kZXYpOwotCWludCByZXQgPSAwOwotCi0JaWYgKHBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW0gfHwKLQkgICAgcGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKSB7Ci0JCXNpemUgPSBzc3RfYnl0X3BjbV9oYXJkd2FyZS5idWZmZXJfYnl0ZXNfbWF4OwotCQlyZXQgPSBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwKLQkJCQkJCQkgICAgU05EUlZfRE1BX1RZUEVfREVWLAotCQkJCQkJCSAgICBwZGF0YS0+ZG1hX2RldiwKLQkJCQkJCQkgICAgc2l6ZSwgc2l6ZSk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsICJkbWEgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkICVkXG4iLAotCQkJCXJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgYnl0X2RhaXNbXSA9IHsKLQl7Ci0JCS5uYW1lICA9ICJCYXl0cmFpbCBQQ00iLAotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU3lzdGVtIFBsYXliYWNrIiwKLQkJCS5jaGFubmVsc19taW4gPSAyLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMjRfM0xFIHwKLQkJCQkgICBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQW5hbG9nIENhcHR1cmUiLAotCQkJLmNoYW5uZWxzX21pbiA9IDIsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJfSwKLQl9LAotfTsKLQotc3RhdGljIGludCBzc3RfYnl0X3BjbV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCi17Ci0Jc3RydWN0IHNzdF9wZGF0YSAqcGxhdF9kYXRhID0gZGV2X2dldF9wbGF0ZGF0YShwbGF0Zm9ybS0+ZGV2KTsKLQlzdHJ1Y3Qgc3N0X2J5dF9wcml2X2RhdGEgKnByaXZfZGF0YTsKLQlpbnQgaTsKLQotCWlmICghcGxhdF9kYXRhKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXByaXZfZGF0YSA9IGRldm1fa3phbGxvYyhwbGF0Zm9ybS0+ZGV2LCBzaXplb2YoKnByaXZfZGF0YSksCi0JCQkJIEdGUF9LRVJORUwpOwotCXByaXZfZGF0YS0+Ynl0ID0gcGxhdF9kYXRhLT5kc3A7Ci0Jc25kX3NvY19wbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwbGF0Zm9ybSwgcHJpdl9kYXRhKTsKLQotCWZvciAoaSA9IDA7IGkgPCBCWVRfUENNX0NPVU5UOyBpKyspIHsKLQkJbXV0ZXhfaW5pdCgmcHJpdl9kYXRhLT5wY21baV0ubXV0ZXgpOwotCQlJTklUX1dPUksoJnByaXZfZGF0YS0+cGNtW2ldLndvcmssIHNzdF9ieXRfcGNtX3dvcmspOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNzdF9ieXRfcGNtX3JlbW92ZShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgYnl0X3NvY19wbGF0Zm9ybSA9IHsKLQkucHJvYmUJCT0gc3N0X2J5dF9wY21fcHJvYmUsCi0JLnJlbW92ZQkJPSBzc3RfYnl0X3BjbV9yZW1vdmUsCi0JLm9wcwkJPSAmc3N0X2J5dF9wY21fb3BzLAotCS5wY21fbmV3CT0gc3N0X2J5dF9wY21fbmV3LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgYnl0X2RhaV9jb21wb25lbnQgPSB7Ci0JLm5hbWUJCT0gImJ5dC1kYWkiLAotfTsKLQotI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBzc3RfYnl0X3BjbV9kZXZfc3VzcGVuZF9sYXRlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7Ci0Jc3RydWN0IHNzdF9ieXRfcHJpdl9kYXRhICpwcml2X2RhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZyhkZXYsICJzdXNwZW5kaW5nIGxhdGVcbiIpOwotCi0JcmV0ID0gc3N0X2J5dF9kc3Bfc3VzcGVuZF9sYXRlKGRldiwgc3N0X3BkYXRhKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBzdXNwZW5kICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByaXZfZGF0YS0+cmVzdG9yZV9zdHJlYW0gPSB0cnVlOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzc3RfYnl0X3BjbV9kZXZfcmVzdW1lX2Vhcmx5KHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKGRldik7Ci0JaW50IHJldDsKLQotCWRldl9kYmcoZGV2LCAicmVzdW1lIGVhcmx5XG4iKTsKLQotCS8qIGxvYWQgZncgYW5kIGJvb3QgRFNQICovCi0JcmV0ID0gc3N0X2J5dF9kc3BfYm9vdChkZXYsIHNzdF9wZGF0YSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIHdhaXQgZm9yIEZXIHRvIGZpbmlzaCBib290aW5nICovCi0JcmV0dXJuIHNzdF9ieXRfZHNwX3dhaXRfZm9yX3JlYWR5KGRldiwgc3N0X3BkYXRhKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNzdF9ieXRfcG1fb3BzID0gewotCS5zdXNwZW5kX2xhdGUgPSBzc3RfYnl0X3BjbV9kZXZfc3VzcGVuZF9sYXRlLAotCS5yZXN1bWVfZWFybHkgPSBzc3RfYnl0X3BjbV9kZXZfcmVzdW1lX2Vhcmx5LAotfTsKLQotI2RlZmluZSBTU1RfQllUX1BNX09QUwkoJnNzdF9ieXRfcG1fb3BzKQotI2Vsc2UKLSNkZWZpbmUgU1NUX0JZVF9QTV9PUFMJTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBpbnQgc3N0X2J5dF9wY21fZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3N0X2J5dF9kc3BfaW5pdCgmcGRldi0+ZGV2LCBzc3RfcGRhdGEpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwgJmJ5dF9zb2NfcGxhdGZvcm0pOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycl9wbGF0OwotCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwgJmJ5dF9kYWlfY29tcG9uZW50LAotCQkJCQkgYnl0X2RhaXMsIEFSUkFZX1NJWkUoYnl0X2RhaXMpKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJfY29tcDsKLQotCXJldHVybiAwOwotCi1lcnJfY29tcDoKLQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7Ci1lcnJfcGxhdDoKLQlzc3RfYnl0X2RzcF9mcmVlKCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzc3RfYnl0X3BjbV9kZXZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQotCXNuZF9zb2NfdW5yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2KTsKLQlzbmRfc29jX3VucmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYpOwotCXNzdF9ieXRfZHNwX2ZyZWUoJnBkZXYtPmRldiwgc3N0X3BkYXRhKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzc3RfYnl0X3BjbV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiYmF5dHJhaWwtcGNtLWF1ZGlvIiwKLQkJLnBtID0gU1NUX0JZVF9QTV9PUFMsCi0JfSwKLQotCS5wcm9iZSA9IHNzdF9ieXRfcGNtX2Rldl9wcm9iZSwKLQkucmVtb3ZlID0gc3N0X2J5dF9wY21fZGV2X3JlbW92ZSwKLX07Ci1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNzdF9ieXRfcGNtX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIkphcmtrbyBOaWt1bGEiKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQmF5dHJhaWwgUENNIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmJheXRyYWlsLXBjbS1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC1kc3AtcHJpdi5oIGIvc291bmQvc29jL2ludGVsL3NzdC1kc3AtcHJpdi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWRhMDMwLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtZHNwLXByaXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKgotICogSW50ZWwgU21hcnQgU291bmQgVGVjaG5vbG9neQotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fU09VTkRfU09DX1NTVF9EU1BfUFJJVl9ICi0jZGVmaW5lIF9fU09VTkRfU09DX1NTVF9EU1BfUFJJVl9ICi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0KLXN0cnVjdCBzc3RfbWVtX2Jsb2NrOwotc3RydWN0IHNzdF9tb2R1bGU7Ci1zdHJ1Y3Qgc3N0X2Z3OwotCi0vKiBkbyB3ZSBuZWVkIHRvIHJlbW92ZSBvciBrZWVwICovCi0jZGVmaW5lIERTUF9EUkFNX0FERFJfT0ZGU0VUCQkweDQwMDAwMAotCi0vKgotICogRFNQIE9wZXJhdGlvbnMgZXhwb3J0ZWQgYnkgcGxhdGZvcm0gQXVkaW8gRFNQIGRyaXZlci4KLSAqLwotc3RydWN0IHNzdF9vcHMgewotCS8qIERTUCBjb3JlIGJvb3QgLyByZXNldCAqLwotCXZvaWQgKCpib290KShzdHJ1Y3Qgc3N0X2RzcCAqKTsKLQl2b2lkICgqcmVzZXQpKHN0cnVjdCBzc3RfZHNwICopOwotCWludCAoKndha2UpKHN0cnVjdCBzc3RfZHNwICopOwotCXZvaWQgKCpzbGVlcCkoc3RydWN0IHNzdF9kc3AgKik7Ci0Jdm9pZCAoKnN0YWxsKShzdHJ1Y3Qgc3N0X2RzcCAqKTsKLQotCS8qIFNoaW0gSU8gKi8KLQl2b2lkICgqd3JpdGUpKHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCwgdTMyIHZhbHVlKTsKLQl1MzIgKCpyZWFkKSh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpOwotCXZvaWQgKCp3cml0ZTY0KSh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQsIHU2NCB2YWx1ZSk7Ci0JdTY0ICgqcmVhZDY0KSh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQpOwotCi0JLyogRFNQIEkvRFJBTSBJTyAqLwotCXZvaWQgKCpyYW1fcmVhZCkoc3RydWN0IHNzdF9kc3AgKnNzdCwgdm9pZCAgKmRlc3QsIHZvaWQgX19pb21lbSAqc3JjLAotCQlzaXplX3QgYnl0ZXMpOwotCXZvaWQgKCpyYW1fd3JpdGUpKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgX19pb21lbSAqZGVzdCwgdm9pZCAqc3JjLAotCQlzaXplX3QgYnl0ZXMpOwotCi0Jdm9pZCAoKmR1bXApKHN0cnVjdCBzc3RfZHNwICopOwotCi0JLyogSVJRIGhhbmRsZXJzICovCi0JaXJxcmV0dXJuX3QgKCppcnFfaGFuZGxlcikoaW50IGlycSwgdm9pZCAqY29udGV4dCk7Ci0KLQkvKiBTU1QgaW5pdCBhbmQgZnJlZSAqLwotCWludCAoKmluaXQpKHN0cnVjdCBzc3RfZHNwICpzc3QsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKTsKLQl2b2lkICgqZnJlZSkoc3RydWN0IHNzdF9kc3AgKnNzdCk7Ci0KLQkvKiBGVyBtb2R1bGUgcGFyc2VyL2xvYWRlciAqLwotCWludCAoKnBhcnNlX2Z3KShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpOwotfTsKLQotLyoKLSAqIEF1ZGlvIERTUCBtZW1vcnkgb2Zmc2V0cyBhbmQgYWRkcmVzc2VzLgotICovCi1zdHJ1Y3Qgc3N0X2FkZHIgewotCXUzMiBscGVfYmFzZTsKLQl1MzIgc2hpbV9vZmZzZXQ7Ci0JdTMyIGlyYW1fb2Zmc2V0OwotCXUzMiBkcmFtX29mZnNldDsKLQl1MzIgZHNwX2lyYW1fb2Zmc2V0OwotCXUzMiBkc3BfZHJhbV9vZmZzZXQ7Ci0Jdm9pZCBfX2lvbWVtICpscGU7Ci0Jdm9pZCBfX2lvbWVtICpzaGltOwotCXZvaWQgX19pb21lbSAqcGNpX2NmZzsKLQl2b2lkIF9faW9tZW0gKmZ3X2V4dDsKLX07Ci0KLS8qCi0gKiBBdWRpbyBEU1AgTWFpbGJveCBjb25maWd1cmF0aW9uLgotICovCi1zdHJ1Y3Qgc3N0X21haWxib3ggewotCXZvaWQgX19pb21lbSAqaW5fYmFzZTsKLQl2b2lkIF9faW9tZW0gKm91dF9iYXNlOwotCXNpemVfdCBpbl9zaXplOwotCXNpemVfdCBvdXRfc2l6ZTsKLX07Ci0KLS8qCi0gKiBBdWRpbyBEU1AgbWVtb3J5IGJsb2NrIHR5cGVzLgotICovCi1lbnVtIHNzdF9tZW1fdHlwZSB7Ci0JU1NUX01FTV9JUkFNID0gMCwKLQlTU1RfTUVNX0RSQU0gPSAxLAotCVNTVF9NRU1fQU5ZICA9IDIsCi0JU1NUX01FTV9DQUNIRT0gMywKLX07Ci0KLS8qCi0gKiBBdWRpbyBEU1AgR2VuZXJpYyBGaXJtd2FyZSBGaWxlLgotICoKLSAqIFNTVCBGaXJtd2FyZSBmaWxlcyBjYW4gY29uc2lzdCBvZiAxLi5OIG1vZHVsZXMuIFRoaXMgZ2VuZXJpYyBzdHJ1Y3R1cmUgaXMKLSAqIHVzZWQgdG8gbWFuYWdlIGVhY2ggZmlybXdhcmUgZmlsZSBhbmQgaXQncyBtb2R1bGVzIHJlZ2FyZGxlc3Mgb2YgU1NUIGZpcm13YXJlCi0gKiB0eXBlLiBBIFNTVCBkcml2ZXIgbWF5IGxvYWQgbXVsdGlwbGUgRlcgZmlsZXMuCi0gKi8KLXN0cnVjdCBzc3RfZncgewotCXN0cnVjdCBzc3RfZHNwICpkc3A7Ci0KLQkvKiBiYXNlIGFkZHJlc3NlcyBvZiBGVyBmaWxlIGRhdGEgKi8KLQlkbWFfYWRkcl90IGRtYWJsZV9md19wYWRkcjsJLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBmdyBkYXRhICovCi0Jdm9pZCAqZG1hX2J1ZjsJCQkvKiB2aXJ0dWFsIGFkZHJlc3Mgb2YgZncgZGF0YSAqLwotCXUzMiBzaXplOwkJCS8qIHNpemUgb2YgZncgZGF0YSAqLwotCi0JLyogbGlzdHMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CQkvKiBEU1AgbGlzdCBvZiBGVyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbW9kdWxlX2xpc3Q7CS8qIEZXIGxpc3Qgb2YgbW9kdWxlcyAqLwotCi0Jdm9pZCAqcHJpdmF0ZTsJCQkvKiBjb3JlIGRvZXNuJ3QgdG91Y2ggdGhpcyAqLwotfTsKLQotLyoKLSAqIEF1ZGlvIERTUCBHZW5lcmljIE1vZHVsZSBUZW1wbGF0ZS4KLSAqCi0gKiBVc2VkIHRvIGRlZmluZSBhbmQgcmVnaXN0ZXIgYSBuZXcgRlcgbW9kdWxlLiBUaGlzIGRhdGEgaXMgZXh0cmFjdGVkIGZyb20KLSAqIEZXIG1vZHVsZSBoZWFkZXIgaW5mb3JtYXRpb24uCi0gKi8KLXN0cnVjdCBzc3RfbW9kdWxlX3RlbXBsYXRlIHsKLQl1MzIgaWQ7Ci0JdTMyIGVudHJ5OwkJCS8qIGVudHJ5IHBvaW50ICovCi0JdTMyIHNjcmF0Y2hfc2l6ZTsKLQl1MzIgcGVyc2lzdGVudF9zaXplOwotfTsKLQotLyoKLSAqIEJsb2NrIEFsbG9jYXRvciAtIFVzZWQgdG8gYWxsb2NhdGUgYmxvY2tzIG9mIERTUCBtZW1vcnkuCi0gKi8KLXN0cnVjdCBzc3RfYmxvY2tfYWxsb2NhdG9yIHsKLQl1MzIgaWQ7Ci0JdTMyIG9mZnNldDsKLQlpbnQgc2l6ZTsKLQllbnVtIHNzdF9tZW1fdHlwZSB0eXBlOwotfTsKLQotLyoKLSAqIFJ1bnRpbWUgTW9kdWxlIEluc3RhbmNlIC0gQSBtb2R1bGUgb2JqZWN0IGNhbiBiZSBpbnN0YW5jaWF0ZWQgbXVsdGlwbGUKLSAqIHRpbWVzIHdpdGhpbiB0aGUgRFNQIEZXLgotICovCi1zdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lIHsKLQlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOwotCWludCBpZDsKLQlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlOwkvKiBwYXJlbnQgbW9kdWxlIHdlIGJlbG9uZyB0b28gKi8KLQotCXUzMiBwZXJzaXN0ZW50X29mZnNldDsJCS8qIHByaXZhdGUgbWVtb3J5IG9mZnNldCAqLwotCXZvaWQgKnByaXZhdGU7Ci0KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBibG9ja19saXN0OwkvKiBsaXN0IG9mIGJsb2NrcyB1c2VkICovCi19OwotCi0vKgotICogUnVudGltZSBNb2R1bGUgQ29udGV4dCAtIFRoZSBydW50aW1lIGNvbnRleHQgbXVzdCBiZSBtYW51YWxseSBzdG9yZWQgYnkgdGhlCi0gKiBkcml2ZXIgcHJpb3IgdG8gZW50ZXIgUzMgYW5kIHJlc3RvcmVkIGFmdGVyIGxlYXZpbmcgUzMuIFRoaXMgc2hvdWxkIHJlYWxseSBiZQotICogcGFydCBvZiB0aGUgbWVtb3J5IGNvbnRleHQgc2F2ZWQgYnkgdGhlIGVudGVyIEQzIG1lc3NhZ2UgSVBDID8/PwotICovCi1zdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lX2NvbnRleHQgewotCWRtYV9hZGRyX3QgZG1hX2J1ZmZlcjsKLQl1MzIgKmJ1ZmZlcjsKLX07Ci0KLS8qCi0gKiBBdWRpbyBEU1AgR2VuZXJpYyBNb2R1bGUuCi0gKgotICogRWFjaCBGaXJtd2FyZSBmaWxlIGNhbiBjb25zaXN0IG9mIDEuLk4gbW9kdWxlcy4gQSBtb2R1bGUgY2FuIHNwYW4gbXVsdGlwbGUKLSAqIEFEU1AgbWVtb3J5IGJsb2Nrcy4gVGhlIHNpbXBsZXN0IEZXIHdpbGwgYmUgYSBmaWxlIHdpdGggMSBtb2R1bGUuIEEgbW9kdWxlCi0gKiBjYW4gYmUgaW5zdGFuY2lhdGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBEU1AuCi0gKi8KLXN0cnVjdCBzc3RfbW9kdWxlIHsKLQlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOwotCXN0cnVjdCBzc3RfZncgKnNzdF9mdzsJCS8qIHBhcmVudCBGVyB3ZSBiZWxvbmcgdG9vICovCi0KLQkvKiBtb2R1bGUgY29uZmlndXJhdGlvbiAqLwotCXUzMiBpZDsKLQl1MzIgZW50cnk7CQkJLyogbW9kdWxlIGVudHJ5IHBvaW50ICovCi0JczMyIG9mZnNldDsJCQkvKiBtb2R1bGUgb2Zmc2V0IGluIGZpcm13YXJlIGZpbGUgKi8KLQl1MzIgc2l6ZTsJCQkvKiBtb2R1bGUgc2l6ZSAqLwotCXUzMiBzY3JhdGNoX3NpemU7CQkvKiBnbG9iYWwgc2NyYXRjaCBtZW1vcnkgcmVxdWlyZWQgKi8KLQl1MzIgcGVyc2lzdGVudF9zaXplOwkJLyogcHJpdmF0ZSBtZW1vcnkgcmVxdWlyZWQgKi8KLQllbnVtIHNzdF9tZW1fdHlwZSB0eXBlOwkJLyogZGVzdGluYXRpb24gbWVtb3J5IHR5cGUgKi8KLQl1MzIgZGF0YV9vZmZzZXQ7CQkvKiBvZmZzZXQgaW4gQURTUCBtZW1vcnkgc3BhY2UgKi8KLQl2b2lkICpkYXRhOwkJCS8qIG1vZHVsZSBkYXRhICovCi0KLQkvKiBydW50aW1lICovCi0JdTMyIHVzYWdlX2NvdW50OwkJLyogY2FuIGJlIHVubG9hZGVkIGlmIGNvdW50ID09IDAgKi8KLQl2b2lkICpwcml2YXRlOwkJCS8qIGNvcmUgZG9lc24ndCB0b3VjaCB0aGlzICovCi0KLQkvKiBsaXN0cyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgYmxvY2tfbGlzdDsJLyogTW9kdWxlIGxpc3Qgb2YgYmxvY2tzIGluIHVzZSAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIERTUCBsaXN0IG9mIG1vZHVsZXMgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3RfZnc7CS8qIEZXIGxpc3Qgb2YgbW9kdWxlcyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgcnVudGltZV9saXN0OwkvKiBsaXN0IG9mIHJ1bnRpbWUgbW9kdWxlIG9iamVjdHMqLwotfTsKLQotLyoKLSAqIFNTVCBNZW1vcnkgQmxvY2sgb3BlcmF0aW9ucy4KLSAqLwotc3RydWN0IHNzdF9ibG9ja19vcHMgewotCWludCAoKmVuYWJsZSkoc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrKTsKLQlpbnQgKCpkaXNhYmxlKShzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2spOwotfTsKLQotLyoKLSAqIFNTVCBHZW5lcmljIE1lbW9yeSBCbG9jay4KLSAqCi0gKiBTU1QgQURQICBtZW1vcnkgaGFzIG11bHRpcGxlIElSQU0gYW5kIERSQU0gYmxvY2tzLiBTb21lIEFEU1AgYmxvY2tzIGNhbiBiZQotICogcG93ZXIgZ2F0ZWQuCi0gKi8KLXN0cnVjdCBzc3RfbWVtX2Jsb2NrIHsKLQlzdHJ1Y3Qgc3N0X2RzcCAqZHNwOwotCXN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGU7CS8qIG1vZHVsZSB0aGF0IHVzZXMgdGhpcyBibG9jayAqLwotCi0JLyogYmxvY2sgY29uZmlnICovCi0JdTMyIG9mZnNldDsJCQkvKiBvZmZzZXQgZnJvbSBiYXNlICovCi0JdTMyIHNpemU7CQkJLyogYmxvY2sgc2l6ZSAqLwotCXUzMiBpbmRleDsJCQkvKiBibG9jayBpbmRleCAwLi5OICovCi0JZW51bSBzc3RfbWVtX3R5cGUgdHlwZTsJCS8qIGJsb2NrIG1lbW9yeSB0eXBlIElSQU0vRFJBTSAqLwotCXN0cnVjdCBzc3RfYmxvY2tfb3BzICpvcHM7CS8qIGJsb2NrIG9wZXJhdGlvbnMsIGlmIGFueSAqLwotCi0JLyogYmxvY2sgc3RhdHVzICovCi0JdTMyIGJ5dGVzX3VzZWQ7CQkJLyogYnl0ZXMgaW4gdXNlIGJ5IG1vZHVsZXMgKi8KLQl2b2lkICpwcml2YXRlOwkJCS8qIGdlbmVyaWMgY29yZSBkb2VzIG5vdCB0b3VjaCB0aGlzICovCi0JaW50IHVzZXJzOwkJCS8qIG51bWJlciBvZiBtb2R1bGVzIHVzaW5nIHRoaXMgYmxvY2sgKi8KLQotCS8qIGJsb2NrIGxpc3RzICovCi0Jc3RydWN0IGxpc3RfaGVhZCBtb2R1bGVfbGlzdDsJLyogTW9kdWxlIGxpc3Qgb2YgYmxvY2tzICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogTWFwIGxpc3Qgb2YgZnJlZS91c2VkIGJsb2NrcyAqLwotfTsKLQotLyoKLSAqIEdlbmVyaWMgU1NUIFNoaW0gSW50ZXJmYWNlLgotICovCi1zdHJ1Y3Qgc3N0X2RzcCB7Ci0KLQkvKiBydW50aW1lICovCi0Jc3RydWN0IHNzdF9kc3BfZGV2aWNlICpzc3RfZGV2OwotCXNwaW5sb2NrX3Qgc3BpbmxvY2s7CS8qIElQQyBsb2NraW5nICovCi0Jc3RydWN0IG11dGV4IG11dGV4OwkvKiBEU1AgRlcgbG9jayAqLwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgZGV2aWNlICpkbWFfZGV2OwotCXZvaWQgKnRocmVhZF9jb250ZXh0OwotCWludCBpcnE7Ci0JdTMyIGlkOwotCi0JLyogbGlzdCBvZiBmcmVlIGFuZCB1c2VkIEFEU1AgbWVtb3J5IGJsb2NrcyAqLwotCXN0cnVjdCBsaXN0X2hlYWQgdXNlZF9ibG9ja19saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9ibG9ja19saXN0OwotCi0JLyogb3BlcmF0aW9ucyAqLwotCXN0cnVjdCBzc3Rfb3BzICpvcHM7Ci0KLQkvKiBkZWJ1ZyBGUyAqLwotCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcm9vdDsKLQotCS8qIGJhc2UgYWRkcmVzc2VzICovCi0Jc3RydWN0IHNzdF9hZGRyIGFkZHI7Ci0KLQkvKiBtYWlsYm94ICovCi0Jc3RydWN0IHNzdF9tYWlsYm94IG1haWxib3g7Ci0KLQkvKiBTU1QgRlcgZmlsZXMgbG9hZGVkIGFuZCB0aGVpciBtb2R1bGVzICovCi0Jc3RydWN0IGxpc3RfaGVhZCBtb2R1bGVfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGZ3X2xpc3Q7Ci0KLQkvKiBzY3JhdGNoIGJ1ZmZlciAqLwotCXN0cnVjdCBsaXN0X2hlYWQgc2NyYXRjaF9ibG9ja19saXN0OwotCXUzMiBzY3JhdGNoX29mZnNldDsKLQl1MzIgc2NyYXRjaF9zaXplOwotCi0JLyogcGxhdGZvcm0gZGF0YSAqLwotCXN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhOwotCi0JLyogRE1BIEZXIGxvYWRpbmcgKi8KLQlzdHJ1Y3Qgc3N0X2RtYSAqZG1hOwotCWJvb2wgZndfdXNlX2RtYTsKLX07Ci0KLS8qIFNpemUgb3B0aW1pc2VkIERSQU0vSVJBTSBtZW1jcHkgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzc3RfZHNwX3dyaXRlKHN0cnVjdCBzc3RfZHNwICpzc3QsIHZvaWQgKnNyYywKLQl1MzIgZGVzdF9vZmZzZXQsIHNpemVfdCBieXRlcykKLXsKLQlzc3QtPm9wcy0+cmFtX3dyaXRlKHNzdCwgc3N0LT5hZGRyLmxwZSArIGRlc3Rfb2Zmc2V0LCBzcmMsIGJ5dGVzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNzdF9kc3BfcmVhZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB2b2lkICpkZXN0LAotCXUzMiBzcmNfb2Zmc2V0LCBzaXplX3QgYnl0ZXMpCi17Ci0Jc3N0LT5vcHMtPnJhbV9yZWFkKHNzdCwgZGVzdCwgc3N0LT5hZGRyLmxwZSArIHNyY19vZmZzZXQsIGJ5dGVzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkICpzc3RfZHNwX2dldF90aHJlYWRfY29udGV4dChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQotewotCXJldHVybiBzc3QtPnRocmVhZF9jb250ZXh0OwotfQotCi0vKiBDcmVhdGUvRnJlZSBGVyBmaWxlcyAtIGNhbiBjb250YWluIG11bHRpcGxlIG1vZHVsZXMgKi8KLXN0cnVjdCBzc3RfZncgKnNzdF9md19uZXcoc3RydWN0IHNzdF9kc3AgKmRzcCwKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LCB2b2lkICpwcml2YXRlKTsKLXZvaWQgc3N0X2Z3X2ZyZWUoc3RydWN0IHNzdF9mdyAqc3N0X2Z3KTsKLXZvaWQgc3N0X2Z3X2ZyZWVfYWxsKHN0cnVjdCBzc3RfZHNwICpkc3ApOwotaW50IHNzdF9md19yZWxvYWQoc3RydWN0IHNzdF9mdyAqc3N0X2Z3KTsKLXZvaWQgc3N0X2Z3X3VubG9hZChzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpOwotCi0vKiBDcmVhdGUvRnJlZSBmaXJtd2FyZSBtb2R1bGVzICovCi1zdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZV9uZXcoc3RydWN0IHNzdF9mdyAqc3N0X2Z3LAotCXN0cnVjdCBzc3RfbW9kdWxlX3RlbXBsYXRlICp0ZW1wbGF0ZSwgdm9pZCAqcHJpdmF0ZSk7Ci12b2lkIHNzdF9tb2R1bGVfZnJlZShzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlKTsKLXN0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlX2dldF9mcm9tX2lkKHN0cnVjdCBzc3RfZHNwICpkc3AsIHUzMiBpZCk7Ci1pbnQgc3N0X21vZHVsZV9hbGxvY19ibG9ja3Moc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSk7Ci1pbnQgc3N0X21vZHVsZV9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlKTsKLQotLyogQ3JlYXRlL0ZyZWUgZmlybXdhcmUgbW9kdWxlIHJ1bnRpbWUgaW5zdGFuY2VzICovCi1zdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpzc3RfbW9kdWxlX3J1bnRpbWVfbmV3KHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUsCi0JaW50IGlkLCB2b2lkICpwcml2YXRlKTsKLXZvaWQgc3N0X21vZHVsZV9ydW50aW1lX2ZyZWUoc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZSk7Ci1zdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpzc3RfbW9kdWxlX3J1bnRpbWVfZ2V0X2Zyb21faWQoCi0Jc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSwgdTMyIGlkKTsKLWludCBzc3RfbW9kdWxlX3J1bnRpbWVfYWxsb2NfYmxvY2tzKHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUsCi0JaW50IG9mZnNldCk7Ci1pbnQgc3N0X21vZHVsZV9ydW50aW1lX2ZyZWVfYmxvY2tzKHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUpOwotaW50IHNzdF9tb2R1bGVfcnVudGltZV9zYXZlKHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUsCi0Jc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZV9jb250ZXh0ICpjb250ZXh0KTsKLWludCBzc3RfbW9kdWxlX3J1bnRpbWVfcmVzdG9yZShzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lLAotCXN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWVfY29udGV4dCAqY29udGV4dCk7Ci0KLS8qIGdlbmVyaWMgYmxvY2sgYWxsb2NhdGlvbiAqLwotaW50IHNzdF9hbGxvY19ibG9ja3Moc3RydWN0IHNzdF9kc3AgKmRzcCwgc3RydWN0IHNzdF9ibG9ja19hbGxvY2F0b3IgKmJhLAotCXN0cnVjdCBsaXN0X2hlYWQgKmJsb2NrX2xpc3QpOwotaW50IHNzdF9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCBzdHJ1Y3QgbGlzdF9oZWFkICpibG9ja19saXN0KTsKLQotLyogc2NyYXRjaCBhbGxvY2F0aW9uICovCi1pbnQgc3N0X2Jsb2NrX2FsbG9jX3NjcmF0Y2goc3RydWN0IHNzdF9kc3AgKmRzcCk7Ci12b2lkIHNzdF9ibG9ja19mcmVlX3NjcmF0Y2goc3RydWN0IHNzdF9kc3AgKmRzcCk7Ci0KLS8qIFJlZ2lzdGVyIHRoZSBEU1BzIG1lbW9yeSBibG9ja3MgLSB3b3VsZCBiZSBuaWNlIHRvIHJlYWQgZnJvbSBBQ1BJICovCi1zdHJ1Y3Qgc3N0X21lbV9ibG9jayAqc3N0X21lbV9ibG9ja19yZWdpc3RlcihzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgb2Zmc2V0LAotCXUzMiBzaXplLCBlbnVtIHNzdF9tZW1fdHlwZSB0eXBlLCBzdHJ1Y3Qgc3N0X2Jsb2NrX29wcyAqb3BzLCB1MzIgaW5kZXgsCi0Jdm9pZCAqcHJpdmF0ZSk7Ci12b2lkIHNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwoc3RydWN0IHNzdF9kc3AgKmRzcCk7Ci0KLS8qIENyZWF0ZS9GcmVlIERNQSByZXNvdXJjZXMgKi8KLWludCBzc3RfZG1hX25ldyhzdHJ1Y3Qgc3N0X2RzcCAqc3N0KTsKLXZvaWQgc3N0X2RtYV9mcmVlKHN0cnVjdCBzc3RfZG1hICpkbWEpOwotCi11MzIgc3N0X2RzcF9nZXRfb2Zmc2V0KHN0cnVjdCBzc3RfZHNwICpkc3AsIHUzMiBvZmZzZXQsCi0JZW51bSBzc3RfbWVtX3R5cGUgdHlwZSk7Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtZHNwLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWRzcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjkxZTMyLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtZHNwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoKLSAqIEludGVsIFNtYXJ0IFNvdW5kIFRlY2hub2xvZ3kgKFNTVCkgQ29yZQotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaWZuZGVmIF9fU09VTkRfU09DX1NTVF9EU1BfSAotI2RlZmluZSBfX1NPVU5EX1NPQ19TU1RfRFNQX0gKLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0KLS8qIFNTVCBEZXZpY2UgSURzICAqLwotI2RlZmluZSBTU1RfREVWX0lEX0xZTlhfUE9JTlQJCTB4MzNDOAotI2RlZmluZSBTU1RfREVWX0lEX1dJTERDQVRfUE9JTlQJMHgzNDM4Ci0jZGVmaW5lIFNTVF9ERVZfSURfQllUCQkJMHgwRjI4Ci0KLS8qIFN1cHBvcnRlZCBTU1QgRE1BIERldmljZXMgKi8KLSNkZWZpbmUgU1NUX0RNQV9UWVBFX0RXCQkxCi0jZGVmaW5lIFNTVF9ETUFfVFlQRV9NSUQJMgotCi0vKiBhdXRvc3VzcGVuZCBkZWxheSA1cyovCi0jZGVmaW5lIFNTVF9SVU5USU1FX1NVU1BFTkRfREVMQVkJKDUgKiAxMDAwKQotCi0vKiBTU1QgU2hpbSByZWdpc3RlciBtYXAKLSAqIFRoZSByZWdpc3RlciBuYW1pbmcgY2FuIGRpZmZlciBiZXR3ZWVuIHByb2R1Y3RzLiBTb21lIHByb2R1Y3RzIGFsc28KLSAqIGNvbnRhaW4gZXh0cmEgZnVuY3Rpb25hbGl0eS4KLSAqLwotI2RlZmluZSBTU1RfQ1NSCQkJMHgwMAotI2RlZmluZSBTU1RfUElTUgkJMHgwOAotI2RlZmluZSBTU1RfUElNUgkJMHgxMAotI2RlZmluZSBTU1RfSVNSWAkJMHgxOAotI2RlZmluZSBTU1RfSVNSRAkJMHgyMAotI2RlZmluZSBTU1RfSU1SWAkJMHgyOAotI2RlZmluZSBTU1RfSU1SRAkJMHgzMAotI2RlZmluZSBTU1RfSVBDWAkJMHgzOCAvKiBJUEMgSUEgLT4gU1NUICovCi0jZGVmaW5lIFNTVF9JUENECQkweDQwIC8qIElQQyBTU1QgLT4gSUEgKi8KLSNkZWZpbmUgU1NUX0lTUlNDCQkweDQ4Ci0jZGVmaW5lIFNTVF9JU1JMUEVTQwkJMHg1MAotI2RlZmluZSBTU1RfSU1SU0MJCTB4NTgKLSNkZWZpbmUgU1NUX0lNUkxQRVNDCQkweDYwCi0jZGVmaW5lIFNTVF9JUENTQwkJMHg2OAotI2RlZmluZSBTU1RfSVBDTFBFU0MJCTB4NzAKLSNkZWZpbmUgU1NUX0NMS0NUTAkJMHg3OAotI2RlZmluZSBTU1RfQ1NSMgkJMHg4MAotI2RlZmluZSBTU1RfTFRSQwkJMHhFMAotI2RlZmluZSBTU1RfSE1EQwkJMHhFOAotCi0jZGVmaW5lIFNTVF9TSElNX0JFR0lOCQlTU1RfQ1NSCi0jZGVmaW5lIFNTVF9TSElNX0VORAkJU1NUX0hETUMKLQotI2RlZmluZSBTU1RfREJHTwkJMHhGMAotCi0jZGVmaW5lIFNTVF9TSElNX1NJWkUJCTB4MTAwCi0jZGVmaW5lIFNTVF9QV01DVFJMICAgICAgICAgICAgIDB4MTAwMAotCi0vKiBTU1QgU2hpbSBSZWdpc3RlciBiaXRzCi0gKiBUaGUgcmVnaXN0ZXIgYml0IG5hbWluZyBjYW4gZGlmZmVyIGJldHdlZW4gcHJvZHVjdHMuIFNvbWUgcHJvZHVjdHMgYWxzbwotICogY29udGFpbiBleHRyYSBmdW5jdGlvbmFsaXR5LgotICovCi0KLS8qIENTUiAvIENTICovCi0jZGVmaW5lIFNTVF9DU1JfUlNUCQkoMHgxIDw8IDEpCi0jZGVmaW5lIFNTVF9DU1JfU0JDUzAJCSgweDEgPDwgMikKLSNkZWZpbmUgU1NUX0NTUl9TQkNTMQkJKDB4MSA8PCAzKQotI2RlZmluZSBTU1RfQ1NSX0RDUyh4KQkJKHggPDwgNCkKLSNkZWZpbmUgU1NUX0NTUl9EQ1NfTUFTSwkoMHg3IDw8IDQpCi0jZGVmaW5lIFNTVF9DU1JfU1RBTEwJCSgweDEgPDwgMTApCi0jZGVmaW5lIFNTVF9DU1JfUzBJT0NTCQkoMHgxIDw8IDIxKQotI2RlZmluZSBTU1RfQ1NSX1MxSU9DUwkJKDB4MSA8PCAyMykKLSNkZWZpbmUgU1NUX0NTUl9MUENTCQkoMHgxIDw8IDMxKQotI2RlZmluZSBTU1RfQ1NSXzI0TUhaX0xQQ1MJKFNTVF9DU1JfU0JDUzAgfCBTU1RfQ1NSX1NCQ1MxIHwgU1NUX0NTUl9MUENTKQotI2RlZmluZSBTU1RfQ1NSXzI0TUhaX05PX0xQQ1MJKFNTVF9DU1JfU0JDUzAgfCBTU1RfQ1NSX1NCQ1MxKQotI2RlZmluZSBTU1RfQllUX0NTUl9SU1QJCSgweDEgPDwgMCkKLSNkZWZpbmUgU1NUX0JZVF9DU1JfVkVDVE9SX1NFTAkoMHgxIDw8IDEpCi0jZGVmaW5lIFNTVF9CWVRfQ1NSX1NUQUxMCSgweDEgPDwgMikKLSNkZWZpbmUgU1NUX0JZVF9DU1JfUFdBSVRNT0RFCSgweDEgPDwgMykKLQotLyogIElTUlggLyBJU0MgKi8KLSNkZWZpbmUgU1NUX0lTUlhfQlVTWQkJKDB4MSA8PCAxKQotI2RlZmluZSBTU1RfSVNSWF9ET05FCQkoMHgxIDw8IDApCi0jZGVmaW5lIFNTVF9CWVRfSVNSWF9SRVFVRVNUCSgweDEgPDwgMSkKLQotLyogIElTUkQgLyBJU0QgKi8KLSNkZWZpbmUgU1NUX0lTUkRfQlVTWQkJKDB4MSA8PCAxKQotI2RlZmluZSBTU1RfSVNSRF9ET05FCQkoMHgxIDw8IDApCi0KLS8qIElNUlggLyBJTUMgKi8KLSNkZWZpbmUgU1NUX0lNUlhfQlVTWQkJKDB4MSA8PCAxKQotI2RlZmluZSBTU1RfSU1SWF9ET05FCQkoMHgxIDw8IDApCi0jZGVmaW5lIFNTVF9CWVRfSU1SWF9SRVFVRVNUCSgweDEgPDwgMSkKLQotLyogSU1SRCAvIElNRCAqLwotI2RlZmluZSBTU1RfSU1SRF9ET05FCQkoMHgxIDw8IDApCi0jZGVmaW5lIFNTVF9JTVJEX0JVU1kJCSgweDEgPDwgMSkKLSNkZWZpbmUgU1NUX0lNUkRfU1NQMAkJKDB4MSA8PCAxNikKLSNkZWZpbmUgU1NUX0lNUkRfRE1BQzAJCSgweDEgPDwgMjEpCi0jZGVmaW5lIFNTVF9JTVJEX0RNQUMxCQkoMHgxIDw8IDIyKQotI2RlZmluZSBTU1RfSU1SRF9ETUFDCQkoU1NUX0lNUkRfRE1BQzAgfCBTU1RfSU1SRF9ETUFDMSkKLQotLyogIElQQ1ggLyBJUENDICovCi0jZGVmaW5lCVNTVF9JUENYX0RPTkUJCSgweDEgPDwgMzApCi0jZGVmaW5lCVNTVF9JUENYX0JVU1kJCSgweDEgPDwgMzEpCi0jZGVmaW5lIFNTVF9CWVRfSVBDWF9ET05FCSgodTY0KTB4MSA8PCA2MikKLSNkZWZpbmUgU1NUX0JZVF9JUENYX0JVU1kJKCh1NjQpMHgxIDw8IDYzKQotCi0vKiAgSVBDRCAqLwotI2RlZmluZQlTU1RfSVBDRF9ET05FCQkoMHgxIDw8IDMwKQotI2RlZmluZQlTU1RfSVBDRF9CVVNZCQkoMHgxIDw8IDMxKQotI2RlZmluZSBTU1RfQllUX0lQQ0RfRE9ORQkoKHU2NCkweDEgPDwgNjIpCi0jZGVmaW5lIFNTVF9CWVRfSVBDRF9CVVNZCSgodTY0KTB4MSA8PCA2MykKLQotLyogQ0xLQ1RMICovCi0jZGVmaW5lIFNTVF9DTEtDVExfU01PUyh4KQkoeCA8PCAyNCkKLSNkZWZpbmUgU1NUX0NMS0NUTF9NQVNLCQkoMyA8PCAyNCkKLSNkZWZpbmUgU1NUX0NMS0NUTF9EQ1BMQ0cJKDEgPDwgMTgpCi0jZGVmaW5lIFNTVF9DTEtDVExfU0NPRTEJKDEgPDwgMTcpCi0jZGVmaW5lIFNTVF9DTEtDVExfU0NPRTAJKDEgPDwgMTYpCi0KLS8qIENTUjIgLyBDUzIgKi8KLSNkZWZpbmUgU1NUX0NTUjJfU0RGRF9TU1AwCSgxIDw8IDEpCi0jZGVmaW5lIFNTVF9DU1IyX1NERkRfU1NQMQkoMSA8PCAyKQotCi0vKiBMVFJDICovCi0jZGVmaW5lIFNTVF9MVFJDX1ZBTCh4KQkJKHggPDwgMCkKLQotLyogSE1EQyAqLwotI2RlZmluZSBTU1RfSE1EQ19IRERBMCh4KQkoeCA8PCAwKQotI2RlZmluZSBTU1RfSE1EQ19IRERBMSh4KQkoeCA8PCA3KQotI2RlZmluZSBTU1RfSE1EQ19IRERBX0UwX0NIMAkxCi0jZGVmaW5lIFNTVF9ITURDX0hEREFfRTBfQ0gxCTIKLSNkZWZpbmUgU1NUX0hNRENfSEREQV9FMF9DSDIJNAotI2RlZmluZSBTU1RfSE1EQ19IRERBX0UwX0NIMwk4Ci0jZGVmaW5lIFNTVF9ITURDX0hEREFfRTFfQ0gwCVNTVF9ITURDX0hEREExKFNTVF9ITURDX0hEREFfRTBfQ0gwKQotI2RlZmluZSBTU1RfSE1EQ19IRERBX0UxX0NIMQlTU1RfSE1EQ19IRERBMShTU1RfSE1EQ19IRERBX0UwX0NIMSkKLSNkZWZpbmUgU1NUX0hNRENfSEREQV9FMV9DSDIJU1NUX0hNRENfSEREQTEoU1NUX0hNRENfSEREQV9FMF9DSDIpCi0jZGVmaW5lIFNTVF9ITURDX0hEREFfRTFfQ0gzCVNTVF9ITURDX0hEREExKFNTVF9ITURDX0hEREFfRTBfQ0gzKQotI2RlZmluZSBTU1RfSE1EQ19IRERBX0UwX0FMTENICShTU1RfSE1EQ19IRERBX0UwX0NIMCB8IFNTVF9ITURDX0hEREFfRTBfQ0gxIHwgXAotCQkJCSBTU1RfSE1EQ19IRERBX0UwX0NIMiB8IFNTVF9ITURDX0hEREFfRTBfQ0gzKQotI2RlZmluZSBTU1RfSE1EQ19IRERBX0UxX0FMTENICShTU1RfSE1EQ19IRERBX0UxX0NIMCB8IFNTVF9ITURDX0hEREFfRTFfQ0gxIHwgXAotCQkJCSBTU1RfSE1EQ19IRERBX0UxX0NIMiB8IFNTVF9ITURDX0hEREFfRTFfQ0gzKQotCi0KLS8qIFNTVCBWZW5kb3IgRGVmaW5lZCBSZWdpc3RlcnMgYW5kIGJpdHMgKi8KLSNkZWZpbmUgU1NUX1ZEUlRDVEwwCQkweGEwCi0jZGVmaW5lIFNTVF9WRFJUQ1RMMQkJMHhhNAotI2RlZmluZSBTU1RfVkRSVENUTDIJCTB4YTgKLSNkZWZpbmUgU1NUX1ZEUlRDVEwzCQkweGFDCi0KLS8qIFZEUlRDVEwwICovCi0jZGVmaW5lIFNTVF9WRFJUQ0wwX0QzUEdECQkoMSA8PCAwKQotI2RlZmluZSBTU1RfVkRSVENMMF9EM1NSQU1QR0QJCSgxIDw8IDEpCi0jZGVmaW5lIFNTVF9WRFJUQ0wwX0RTUkFNUEdFX1NISUZUCTEyCi0jZGVmaW5lIFNTVF9WRFJUQ0wwX0RTUkFNUEdFX01BU0sJKDB4ZmZmZmYgPDwgU1NUX1ZEUlRDTDBfRFNSQU1QR0VfU0hJRlQpCi0jZGVmaW5lIFNTVF9WRFJUQ0wwX0lTUkFNUEdFX1NISUZUCTIKLSNkZWZpbmUgU1NUX1ZEUlRDTDBfSVNSQU1QR0VfTUFTSwkoMHgzZmYgPDwgU1NUX1ZEUlRDTDBfSVNSQU1QR0VfU0hJRlQpCi0KLS8qIFZEUlRDVEwyICovCi0jZGVmaW5lIFNTVF9WRFJUQ0wyX0RDTENHRQkJKDEgPDwgMSkKLSNkZWZpbmUgU1NUX1ZEUlRDTDJfRFRDR0UJCSgxIDw8IDEwKQotI2RlZmluZSBTU1RfVkRSVENMMl9BUExMU0VfTUFTSwkJKDEgPDwgMzEpCi0KLS8qIFBNQ1MgKi8KLSNkZWZpbmUgU1NUX1BNQ1MJCTB4ODQKLSNkZWZpbmUgU1NUX1BNQ1NfUFNfTUFTSwkweDMKLQotc3RydWN0IHNzdF9kc3A7Ci0KLS8qCi0gKiBTU1QgRGV2aWNlLgotICoKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHBvcHVsYXRlZCBieSB0aGUgU1NUIGNvcmUgZHJpdmVyLgotICovCi1zdHJ1Y3Qgc3N0X2RzcF9kZXZpY2UgewotCS8qIE1hbmRhdG9yeSBmaWVsZHMgKi8KLQlzdHJ1Y3Qgc3N0X29wcyAqb3BzOwotCWlycXJldHVybl90ICgqdGhyZWFkKShpbnQgaXJxLCB2b2lkICpjb250ZXh0KTsKLQl2b2lkICp0aHJlYWRfY29udGV4dDsKLX07Ci0KLS8qCi0gKiBTU1QgUGxhdGZvcm0gRGF0YS4KLSAqLwotc3RydWN0IHNzdF9wZGF0YSB7Ci0JLyogQUNQSSBkYXRhICovCi0JdTMyIGxwZV9iYXNlOwotCXUzMiBscGVfc2l6ZTsKLQl1MzIgcGNpY2ZnX2Jhc2U7Ci0JdTMyIHBjaWNmZ19zaXplOwotCXUzMiBmd19iYXNlOwotCXUzMiBmd19zaXplOwotCWludCBpcnE7Ci0KLQkvKiBGaXJtd2FyZSAqLwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7Ci0KLQkvKiBETUEgKi8KLQl1MzIgZG1hX2Jhc2U7Ci0JdTMyIGRtYV9zaXplOwotCWludCBkbWFfZW5naW5lOwotCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXY7Ci0KLQkvKiBEU1AgKi8KLQl1MzIgaWQ7Ci0Jdm9pZCAqZHNwOwotfTsKLQotLyogSW5pdGlhbGl6YXRpb24gKi8KLXN0cnVjdCBzc3RfZHNwICpzc3RfZHNwX25ldyhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0Jc3RydWN0IHNzdF9kc3BfZGV2aWNlICpzc3RfZGV2LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSk7Ci12b2lkIHNzdF9kc3BfZnJlZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KTsKLQotLyogU0hJTSBSZWFkIC8gV3JpdGUgKi8KLXZvaWQgc3N0X2RzcF9zaGltX3dyaXRlKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSk7Ci11MzIgc3N0X2RzcF9zaGltX3JlYWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCk7Ci1pbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsCi0JCQkJdTMyIG1hc2ssIHUzMiB2YWx1ZSk7Ci12b2lkIHNzdF9kc3Bfc2hpbV93cml0ZTY0KHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsIHU2NCB2YWx1ZSk7Ci11NjQgc3N0X2RzcF9zaGltX3JlYWQ2NChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KTsKLWludCBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LAotCQkJCXU2NCBtYXNrLCB1NjQgdmFsdWUpOwotCi0vKiBTSElNIFJlYWQgLyBXcml0ZSBVbmxvY2tlZCBmb3IgY2FsbGVycyBhbHJlYWR5IGhvbGRpbmcgc3N0IGxvY2sgKi8KLXZvaWQgc3N0X2RzcF9zaGltX3dyaXRlX3VubG9ja2VkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSk7Ci11MzIgc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3RydWN0IHNzdF9kc3AgKnNzdCwgdTMyIG9mZnNldCk7Ci1pbnQgc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsCi0JCQkJdTMyIG1hc2ssIHUzMiB2YWx1ZSk7Ci12b2lkIHNzdF9kc3Bfc2hpbV93cml0ZTY0X3VubG9ja2VkKHN0cnVjdCBzc3RfZHNwICpzc3QsIHUzMiBvZmZzZXQsIHU2NCB2YWx1ZSk7Ci11NjQgc3N0X2RzcF9zaGltX3JlYWQ2NF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0KTsKLWludCBzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHM2NF91bmxvY2tlZChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCB1MzIgb2Zmc2V0LAotCQkJCQl1NjQgbWFzaywgdTY0IHZhbHVlKTsKLQotLyogSW50ZXJuYWwgZ2VuZXJpYyBsb3ctbGV2ZWwgU1NUIElPIGZ1bmN0aW9ucyAtIGNhbiBiZSBvdmVyaWRkZW4gKi8KLXZvaWQgc3N0X3NoaW0zMl93cml0ZSh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQsIHUzMiB2YWx1ZSk7Ci11MzIgc3N0X3NoaW0zMl9yZWFkKHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG9mZnNldCk7Ci12b2lkIHNzdF9zaGltMzJfd3JpdGU2NCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBvZmZzZXQsIHU2NCB2YWx1ZSk7Ci11NjQgc3N0X3NoaW0zMl9yZWFkNjQodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgb2Zmc2V0KTsKLXZvaWQgc3N0X21lbWNweV90b2lvXzMyKHN0cnVjdCBzc3RfZHNwICpzc3QsCi0JCQl2b2lkIF9faW9tZW0gKmRlc3QsIHZvaWQgKnNyYywgc2l6ZV90IGJ5dGVzKTsKLXZvaWQgc3N0X21lbWNweV9mcm9taW9fMzIoc3RydWN0IHNzdF9kc3AgKnNzdCwKLQkJCSAgdm9pZCAqZGVzdCwgdm9pZCBfX2lvbWVtICpzcmMsIHNpemVfdCBieXRlcyk7Ci0KLS8qIERTUCByZXNldCAmIGJvb3QgKi8KLXZvaWQgc3N0X2RzcF9yZXNldChzdHJ1Y3Qgc3N0X2RzcCAqc3N0KTsKLWludCBzc3RfZHNwX2Jvb3Qoc3RydWN0IHNzdF9kc3AgKnNzdCk7Ci1pbnQgc3N0X2RzcF93YWtlKHN0cnVjdCBzc3RfZHNwICpzc3QpOwotdm9pZCBzc3RfZHNwX3NsZWVwKHN0cnVjdCBzc3RfZHNwICpzc3QpOwotdm9pZCBzc3RfZHNwX3N0YWxsKHN0cnVjdCBzc3RfZHNwICpzc3QpOwotCi0vKiBETUEgKi8KLWludCBzc3RfZHNwX2RtYV9nZXRfY2hhbm5lbChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCBpbnQgY2hhbl9pZCk7Ci12b2lkIHNzdF9kc3BfZG1hX3B1dF9jaGFubmVsKHN0cnVjdCBzc3RfZHNwICpkc3ApOwotaW50IHNzdF9kc3BfZG1hX2NvcHlmcm9tKHN0cnVjdCBzc3RfZHNwICpzc3QsIGRtYV9hZGRyX3QgZGVzdF9hZGRyLAotCWRtYV9hZGRyX3Qgc3JjX2FkZHIsIHNpemVfdCBzaXplKTsKLWludCBzc3RfZHNwX2RtYV9jb3B5dG8oc3RydWN0IHNzdF9kc3AgKnNzdCwgZG1hX2FkZHJfdCBkZXN0X2FkZHIsCi0JZG1hX2FkZHJfdCBzcmNfYWRkciwgc2l6ZV90IHNpemUpOwotCi0vKiBNc2cgSU8gKi8KLXZvaWQgc3N0X2RzcF9pcGNfbXNnX3R4KHN0cnVjdCBzc3RfZHNwICpkc3AsIHUzMiBtc2cpOwotdTMyIHNzdF9kc3BfaXBjX21zZ19yeChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKTsKLQotLyogTWFpbGJveCBtYW5hZ2VtZW50ICovCi1pbnQgc3N0X2RzcF9tYWlsYm94X2luaXQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIGluYm94X29mZnNldCwKLQlzaXplX3QgaW5ib3hfc2l6ZSwgdTMyIG91dGJveF9vZmZzZXQsIHNpemVfdCBvdXRib3hfc2l6ZSk7Ci12b2lkIHNzdF9kc3BfaW5ib3hfd3JpdGUoc3RydWN0IHNzdF9kc3AgKmRzcCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKTsKLXZvaWQgc3N0X2RzcF9pbmJveF9yZWFkKHN0cnVjdCBzc3RfZHNwICpkc3AsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcyk7Ci12b2lkIHNzdF9kc3Bfb3V0Ym94X3dyaXRlKHN0cnVjdCBzc3RfZHNwICpkc3AsIHZvaWQgKm1lc3NhZ2UsIHNpemVfdCBieXRlcyk7Ci12b2lkIHNzdF9kc3Bfb3V0Ym94X3JlYWQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdm9pZCAqbWVzc2FnZSwgc2l6ZV90IGJ5dGVzKTsKLXZvaWQgc3N0X2RzcF9tYWlsYm94X2R1bXAoc3RydWN0IHNzdF9kc3AgKmRzcCwgc2l6ZV90IGJ5dGVzKTsKLQotLyogRGVidWcgKi8KLXZvaWQgc3N0X2RzcF9kdW1wKHN0cnVjdCBzc3RfZHNwICpzc3QpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtZmlybXdhcmUuYyBiL3NvdW5kL3NvYy9pbnRlbC9zc3QtZmlybXdhcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3MWVmNi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWZpcm13YXJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA1ICswLDAgQEAKLS8qCi0gKiBJbnRlbCBTU1QgRmlybXdhcmUgTG9hZGVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotCi0vKiBzdXBwb3J0ZWQgRE1BIGVuZ2luZSBkcml2ZXJzICovCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9kbWEtZHcuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEvZHcuaD4KLQotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLQotI2luY2x1ZGUgInNzdC1kc3AuaCIKLSNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKLQotI2RlZmluZSBTU1RfRE1BX1JFU09VUkNFUwkyCi0jZGVmaW5lIFNTVF9EU1BfRE1BX01BWF9CVVJTVAkweDMKLSNkZWZpbmUgU1NUX0hTV19CTE9DS19BTlkJMHhmZmZmZmZmZgotCi0jZGVmaW5lIFNTVF9IU1dfTUFTS19ETUFfQUREUl9EU1AgMHhmZmYwMDAwMAotCi1zdHJ1Y3Qgc3N0X2RtYSB7Ci0Jc3RydWN0IHNzdF9kc3AgKnNzdDsKLQotCXN0cnVjdCBkd19kbWFfY2hpcCAqY2hpcDsKLQotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKLQlzdHJ1Y3QgZG1hX2NoYW4gKmNoOwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIHNzdF9tZW1jcHkzMih2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmRlc3QsIHZvaWQgKnNyYywgdTMyIGJ5dGVzKQotewotCS8qIF9faW93cml0ZTMyX2NvcHkgdXNlIDMyYml0IHNpemUgdmFsdWVzIHNvIGRpdmlkZSBieSA0ICovCi0JX19pb3dyaXRlMzJfY29weSgodm9pZCAqKWRlc3QsIHNyYywgYnl0ZXMvNCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNzdF9kbWFfdHJhbnNmZXJfY29tcGxldGUodm9pZCAqYXJnKQotewotCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKilhcmc7Ci0KLQlkZXZfZGJnKHNzdC0+ZGV2LCAiRE1BOiBjYWxsYmFja1xuIik7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2RzcF9kbWFfY29weShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBkbWFfYWRkcl90IGRlc3RfYWRkciwKLQlkbWFfYWRkcl90IHNyY19hZGRyLCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7Ci0Jc3RydWN0IHNzdF9kbWEgKmRtYSA9IHNzdC0+ZG1hOwotCi0JaWYgKGRtYS0+Y2ggPT0gTlVMTCkgewotCQlkZXZfZXJyKHNzdC0+ZGV2LCAiZXJyb3I6IG5vIERNQSBjaGFubmVsXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JZGV2X2RiZyhzc3QtPmRldiwgIkRNQTogc3JjOiAweCVseCBkZXN0IDB4JWx4IHNpemUgJXp1XG4iLAotCQkodW5zaWduZWQgbG9uZylzcmNfYWRkciwgKHVuc2lnbmVkIGxvbmcpZGVzdF9hZGRyLCBzaXplKTsKLQotCWRlc2MgPSBkbWEtPmNoLT5kZXZpY2UtPmRldmljZV9wcmVwX2RtYV9tZW1jcHkoZG1hLT5jaCwgZGVzdF9hZGRyLAotCQlzcmNfYWRkciwgc2l6ZSwgRE1BX0NUUkxfQUNLKTsKLQlpZiAoIWRlc2MpewotCQlkZXZfZXJyKHNzdC0+ZGV2LCAiZXJyb3I6IGRtYSBwcmVwIG1lbWNweSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlkZXNjLT5jYWxsYmFjayA9IHNzdF9kbWFfdHJhbnNmZXJfY29tcGxldGU7Ci0JZGVzYy0+Y2FsbGJhY2tfcGFyYW0gPSBzc3Q7Ci0KLQlkZXNjLT50eF9zdWJtaXQoZGVzYyk7Ci0JZG1hX3dhaXRfZm9yX2FzeW5jX3R4KGRlc2MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGNvcHkgdG8gRFNQICovCi1pbnQgc3N0X2RzcF9kbWFfY29weXRvKHN0cnVjdCBzc3RfZHNwICpzc3QsIGRtYV9hZGRyX3QgZGVzdF9hZGRyLAotCWRtYV9hZGRyX3Qgc3JjX2FkZHIsIHNpemVfdCBzaXplKQotewotCXJldHVybiBzc3RfZHNwX2RtYV9jb3B5KHNzdCwgZGVzdF9hZGRyIHwgU1NUX0hTV19NQVNLX0RNQV9BRERSX0RTUCwKLQkJCXNyY19hZGRyLCBzaXplKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3BfZG1hX2NvcHl0byk7Ci0KLS8qIGNvcHkgZnJvbSBEU1AgKi8KLWludCBzc3RfZHNwX2RtYV9jb3B5ZnJvbShzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBkbWFfYWRkcl90IGRlc3RfYWRkciwKLQlkbWFfYWRkcl90IHNyY19hZGRyLCBzaXplX3Qgc2l6ZSkKLXsKLQlyZXR1cm4gc3N0X2RzcF9kbWFfY29weShzc3QsIGRlc3RfYWRkciwKLQkJc3JjX2FkZHIgfCBTU1RfSFNXX01BU0tfRE1BX0FERFJfRFNQLCBzaXplKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3BfZG1hX2NvcHlmcm9tKTsKLQotLyogcmVtb3ZlIG1vZHVsZSBmcm9tIG1lbW9yeSAtIGNhbGxlcnMgaG9sZCBsb2NrcyAqLwotc3RhdGljIHZvaWQgYmxvY2tfbGlzdF9yZW1vdmUoc3RydWN0IHNzdF9kc3AgKmRzcCwKLQlzdHJ1Y3QgbGlzdF9oZWFkICpibG9ja19saXN0KQotewotCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaywgKnRtcDsKLQlpbnQgZXJyOwotCi0JLyogZGlzYWJsZSBlYWNoIGJsb2NrICAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoYmxvY2ssIGJsb2NrX2xpc3QsIG1vZHVsZV9saXN0KSB7Ci0KLQkJaWYgKGJsb2NrLT5vcHMgJiYgYmxvY2stPm9wcy0+ZGlzYWJsZSkgewotCQkJZXJyID0gYmxvY2stPm9wcy0+ZGlzYWJsZShibG9jayk7Ci0JCQlpZiAoZXJyIDwgMCkKLQkJCQlkZXZfZXJyKGRzcC0+ZGV2LAotCQkJCQkiZXJyb3I6IGNhbnQgZGlzYWJsZSBibG9jayAlZDolZFxuIiwKLQkJCQkJYmxvY2stPnR5cGUsIGJsb2NrLT5pbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKiBtYXJrIGVhY2ggYmxvY2sgYXMgZnJlZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCBibG9ja19saXN0LCBtb2R1bGVfbGlzdCkgewotCQlsaXN0X2RlbCgmYmxvY2stPm1vZHVsZV9saXN0KTsKLQkJbGlzdF9tb3ZlKCZibG9jay0+bGlzdCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0KTsKLQkJZGV2X2RiZyhkc3AtPmRldiwgImJsb2NrIGZyZWVkICVkOiVkIGF0IG9mZnNldCAweCV4XG4iLAotCQkJYmxvY2stPnR5cGUsIGJsb2NrLT5pbmRleCwgYmxvY2stPm9mZnNldCk7Ci0JfQotfQotCi0vKiBwcmVwYXJlIHRoZSBtZW1vcnkgYmxvY2sgdG8gcmVjZWl2ZSBkYXRhIGZyb20gaG9zdCAtIGNhbGxlcnMgaG9sZCBsb2NrcyAqLwotc3RhdGljIGludCBibG9ja19saXN0X3ByZXBhcmUoc3RydWN0IHNzdF9kc3AgKmRzcCwKLQlzdHJ1Y3QgbGlzdF9oZWFkICpibG9ja19saXN0KQotewotCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jazsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIGVuYWJsZSBlYWNoIGJsb2NrIHNvIHRoYXQncyBpdCdlIHJlYWR5IGZvciBkYXRhICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgYmxvY2tfbGlzdCwgbW9kdWxlX2xpc3QpIHsKLQotCQlpZiAoYmxvY2stPm9wcyAmJiBibG9jay0+b3BzLT5lbmFibGUgJiYgIWJsb2NrLT51c2VycykgewotCQkJcmV0ID0gYmxvY2stPm9wcy0+ZW5hYmxlKGJsb2NrKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJZGV2X2Vycihkc3AtPmRldiwKLQkJCQkJImVycm9yOiBjYW50IGRpc2FibGUgYmxvY2sgJWQ6JWRcbiIsCi0JCQkJCWJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgpOwotCQkJCWdvdG8gZXJyOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci0KLWVycjoKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJsb2NrLCBibG9ja19saXN0LCBtb2R1bGVfbGlzdCkgewotCQlpZiAoYmxvY2stPm9wcyAmJiBibG9jay0+b3BzLT5kaXNhYmxlKQotCQkJYmxvY2stPm9wcy0+ZGlzYWJsZShibG9jayk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZHdfZG1hX3BsYXRmb3JtX2RhdGEgZHdfcGRhdGEgPSB7Ci0JLmlzX3ByaXZhdGUgPSAxLAotCS5jaGFuX2FsbG9jYXRpb25fb3JkZXIgPSBDSEFOX0FMTE9DQVRJT05fQVNDRU5ESU5HLAotCS5jaGFuX3ByaW9yaXR5ID0gQ0hBTl9QUklPUklUWV9BU0NFTkRJTkcsCi19OwotCi1zdGF0aWMgc3RydWN0IGR3X2RtYV9jaGlwICpkd19wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCByZXNvdXJjZSAqbWVtLAotCWludCBpcnEpCi17Ci0Jc3RydWN0IGR3X2RtYV9jaGlwICpjaGlwOwotCWludCBlcnI7Ci0KLQljaGlwID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpjaGlwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjaGlwKQotCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQotCWNoaXAtPmlycSA9IGlycTsKLQljaGlwLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgbWVtKTsKLQlpZiAoSVNfRVJSKGNoaXAtPnJlZ3MpKQotCQlyZXR1cm4gRVJSX0NBU1QoY2hpcC0+cmVncyk7Ci0KLQllcnIgPSBkbWFfY29lcmNlX21hc2tfYW5kX2NvaGVyZW50KGRldiwgRE1BX0JJVF9NQVNLKDMxKSk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKLQotCWNoaXAtPmRldiA9IGRldjsKLQllcnIgPSBkd19kbWFfcHJvYmUoY2hpcCwgJmR3X3BkYXRhKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gRVJSX1BUUihlcnIpOwotCi0JcmV0dXJuIGNoaXA7Ci19Ci0KLXN0YXRpYyB2b2lkIGR3X3JlbW92ZShzdHJ1Y3QgZHdfZG1hX2NoaXAgKmNoaXApCi17Ci0JZHdfZG1hX3JlbW92ZShjaGlwKTsKLX0KLQotc3RhdGljIGJvb2wgZG1hX2NoYW5fZmlsdGVyKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCi17Ci0Jc3RydWN0IHNzdF9kc3AgKmRzcCA9IChzdHJ1Y3Qgc3N0X2RzcCAqKXBhcmFtOwotCi0JcmV0dXJuIGNoYW4tPmRldmljZS0+ZGV2ID09IGRzcC0+ZG1hX2RldjsKLX0KLQotaW50IHNzdF9kc3BfZG1hX2dldF9jaGFubmVsKHN0cnVjdCBzc3RfZHNwICpkc3AsIGludCBjaGFuX2lkKQotewotCXN0cnVjdCBzc3RfZG1hICpkbWEgPSBkc3AtPmRtYTsKLQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBzbGF2ZTsKLQlkbWFfY2FwX21hc2tfdCBtYXNrOwotCWludCByZXQ7Ci0KLQkvKiBUaGUgSW50ZWwgTUlEIERNQSBlbmdpbmUgZHJpdmVyIG5lZWRzIHRoZSBzbGF2ZSBjb25maWcgc2V0IGJ1dAotCSAqIFN5bm9wc2lzIERNQSBlbmdpbmUgZHJpdmVyIHNhZmVseSBpZ25vcmVzIHRoZSBzbGF2ZSBjb25maWcgKi8KLQlkbWFfY2FwX3plcm8obWFzayk7Ci0JZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtYXNrKTsKLQlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBtYXNrKTsKLQotCWRtYS0+Y2ggPSBkbWFfcmVxdWVzdF9jaGFubmVsKG1hc2ssIGRtYV9jaGFuX2ZpbHRlciwgZHNwKTsKLQlpZiAoZG1hLT5jaCA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogRE1BIHJlcXVlc3QgY2hhbm5lbCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQltZW1zZXQoJnNsYXZlLCAwLCBzaXplb2Yoc2xhdmUpKTsKLQlzbGF2ZS5kaXJlY3Rpb24gPSBETUFfTUVNX1RPX0RFVjsKLQlzbGF2ZS5zcmNfYWRkcl93aWR0aCA9Ci0JCXNsYXZlLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7Ci0Jc2xhdmUuc3JjX21heGJ1cnN0ID0gc2xhdmUuZHN0X21heGJ1cnN0ID0gU1NUX0RTUF9ETUFfTUFYX0JVUlNUOwotCi0JcmV0ID0gZG1hZW5naW5lX3NsYXZlX2NvbmZpZyhkbWEtPmNoLCAmc2xhdmUpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiB1bmFibGUgdG8gc2V0IERNQSBzbGF2ZSBjb25maWcgJWRcbiIsCi0JCQlyZXQpOwotCQlkbWFfcmVsZWFzZV9jaGFubmVsKGRtYS0+Y2gpOwotCQlkbWEtPmNoID0gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9kbWFfZ2V0X2NoYW5uZWwpOwotCi12b2lkIHNzdF9kc3BfZG1hX3B1dF9jaGFubmVsKHN0cnVjdCBzc3RfZHNwICpkc3ApCi17Ci0Jc3RydWN0IHNzdF9kbWEgKmRtYSA9IGRzcC0+ZG1hOwotCi0JaWYgKCFkbWEtPmNoKQotCQlyZXR1cm47Ci0KLQlkbWFfcmVsZWFzZV9jaGFubmVsKGRtYS0+Y2gpOwotCWRtYS0+Y2ggPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2RzcF9kbWFfcHV0X2NoYW5uZWwpOwotCi1pbnQgc3N0X2RtYV9uZXcoc3RydWN0IHNzdF9kc3AgKnNzdCkKLXsKLQlzdHJ1Y3Qgc3N0X3BkYXRhICpzc3RfcGRhdGEgPSBzc3QtPnBkYXRhOwotCXN0cnVjdCBzc3RfZG1hICpkbWE7Ci0Jc3RydWN0IHJlc291cmNlIG1lbTsKLQljb25zdCBjaGFyICpkbWFfZGV2X25hbWU7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBjb25maWd1cmUgdGhlIGNvcnJlY3QgcGxhdGZvcm0gZGF0YSBmb3Igd2hhdGV2ZXIgRE1BIGVuZ2luZQotCSogaXMgYXR0YWNoZWQgdG8gdGhlIEFEU1AgSVAuICovCi0Jc3dpdGNoIChzc3QtPnBkYXRhLT5kbWFfZW5naW5lKSB7Ci0JY2FzZSBTU1RfRE1BX1RZUEVfRFc6Ci0JCWRtYV9kZXZfbmFtZSA9ICJkd19kbWFjIjsKLQkJYnJlYWs7Ci0JY2FzZSBTU1RfRE1BX1RZUEVfTUlEOgotCQlkbWFfZGV2X25hbWUgPSAiSW50ZWwgTUlEIERNQSI7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoc3N0LT5kZXYsICJlcnJvcjogaW52YWxpZCBETUEgZW5naW5lICVkXG4iLAotCQkJc3N0LT5wZGF0YS0+ZG1hX2VuZ2luZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRtYSA9IGRldm1fa3phbGxvYyhzc3QtPmRldiwgc2l6ZW9mKHN0cnVjdCBzc3RfZG1hKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFkbWEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZG1hLT5zc3QgPSBzc3Q7Ci0KLQltZW1zZXQoJm1lbSwgMCwgc2l6ZW9mKG1lbSkpOwotCi0JbWVtLnN0YXJ0ID0gc3N0LT5hZGRyLmxwZV9iYXNlICsgc3N0X3BkYXRhLT5kbWFfYmFzZTsKLQltZW0uZW5kICAgPSBzc3QtPmFkZHIubHBlX2Jhc2UgKyBzc3RfcGRhdGEtPmRtYV9iYXNlICsgc3N0X3BkYXRhLT5kbWFfc2l6ZSAtIDE7Ci0JbWVtLmZsYWdzID0gSU9SRVNPVVJDRV9NRU07Ci0KLQkvKiBub3cgcmVnaXN0ZXIgRE1BIGVuZ2luZSBkZXZpY2UgKi8KLQlkbWEtPmNoaXAgPSBkd19wcm9iZShzc3QtPmRtYV9kZXYsICZtZW0sIHNzdF9wZGF0YS0+aXJxKTsKLQlpZiAoSVNfRVJSKGRtYS0+Y2hpcCkpIHsKLQkJZGV2X2Vycihzc3QtPmRldiwgImVycm9yOiBETUEgZGV2aWNlIHJlZ2lzdGVyIGZhaWxlZFxuIik7Ci0JCXJldCA9IFBUUl9FUlIoZG1hLT5jaGlwKTsKLQkJZ290byBlcnJfZG1hX2RldjsKLQl9Ci0KLQlzc3QtPmRtYSA9IGRtYTsKLQlzc3QtPmZ3X3VzZV9kbWEgPSB0cnVlOwotCXJldHVybiAwOwotCi1lcnJfZG1hX2RldjoKLQlkZXZtX2tmcmVlKHNzdC0+ZGV2LCBkbWEpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKHNzdF9kbWFfbmV3KTsKLQotdm9pZCBzc3RfZG1hX2ZyZWUoc3RydWN0IHNzdF9kbWEgKmRtYSkKLXsKLQotCWlmIChkbWEgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JaWYgKGRtYS0+Y2gpCi0JCWRtYV9yZWxlYXNlX2NoYW5uZWwoZG1hLT5jaCk7Ci0KLQlpZiAoZG1hLT5jaGlwKQotCQlkd19yZW1vdmUoZG1hLT5jaGlwKTsKLQotfQotRVhQT1JUX1NZTUJPTChzc3RfZG1hX2ZyZWUpOwotCi0vKiBjcmVhdGUgbmV3IGdlbmVyaWMgZmlybXdhcmUgb2JqZWN0ICovCi1zdHJ1Y3Qgc3N0X2Z3ICpzc3RfZndfbmV3KHN0cnVjdCBzc3RfZHNwICpkc3AsIAotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncsIHZvaWQgKnByaXZhdGUpCi17Ci0Jc3RydWN0IHNzdF9mdyAqc3N0X2Z3OwotCWludCBlcnI7Ci0KLQlpZiAoIWRzcC0+b3BzLT5wYXJzZV9mdykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlzc3RfZncgPSBremFsbG9jKHNpemVvZigqc3N0X2Z3KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHNzdF9mdyA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXNzdF9mdy0+ZHNwID0gZHNwOwotCXNzdF9mdy0+cHJpdmF0ZSA9IHByaXZhdGU7Ci0Jc3N0X2Z3LT5zaXplID0gZnctPnNpemU7Ci0KLQkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyIHRvIHN0b3JlIEZXIGRhdGEgKi8KLQlzc3RfZnctPmRtYV9idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoZHNwLT5kbWFfZGV2LCBzc3RfZnctPnNpemUsCi0JCQkJJnNzdF9mdy0+ZG1hYmxlX2Z3X3BhZGRyLCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzc3RfZnctPmRtYV9idWYpIHsKLQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBETUEgYWxsb2MgZmFpbGVkXG4iKTsKLQkJa2ZyZWUoc3N0X2Z3KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyogY29weSBGVyBkYXRhIHRvIERNQS1hYmxlIG1lbW9yeSAqLwotCW1lbWNweSgodm9pZCAqKXNzdF9mdy0+ZG1hX2J1ZiwgKHZvaWQgKilmdy0+ZGF0YSwgZnctPnNpemUpOwotCi0JaWYgKGRzcC0+ZndfdXNlX2RtYSkgewotCQllcnIgPSBzc3RfZHNwX2RtYV9nZXRfY2hhbm5lbChkc3AsIDApOwotCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gY2hhbl9lcnI7Ci0JfQotCi0JLyogY2FsbCBjb3JlIHNwZWNpZmljIEZXIHBhc2VyIHRvIGxvYWQgRlcgZGF0YSBpbnRvIERTUCAqLwotCWVyciA9IGRzcC0+b3BzLT5wYXJzZV9mdyhzc3RfZncpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogcGFyc2UgZncgZmFpbGVkICVkXG4iLCBlcnIpOwotCQlnb3RvIHBhcnNlX2VycjsKLQl9Ci0KLQlpZiAoZHNwLT5md191c2VfZG1hKQotCQlzc3RfZHNwX2RtYV9wdXRfY2hhbm5lbChkc3ApOwotCi0JbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7Ci0JbGlzdF9hZGQoJnNzdF9mdy0+bGlzdCwgJmRzcC0+ZndfbGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLQotCXJldHVybiBzc3RfZnc7Ci0KLXBhcnNlX2VycjoKLQlpZiAoZHNwLT5md191c2VfZG1hKQotCQlzc3RfZHNwX2RtYV9wdXRfY2hhbm5lbChkc3ApOwotY2hhbl9lcnI6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kbWFfZGV2LCBzc3RfZnctPnNpemUsCi0JCQkJc3N0X2Z3LT5kbWFfYnVmLAotCQkJCXNzdF9mdy0+ZG1hYmxlX2Z3X3BhZGRyKTsKLQlzc3RfZnctPmRtYV9idWYgPSBOVUxMOwotCWtmcmVlKHNzdF9mdyk7Ci0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfZndfbmV3KTsKLQotaW50IHNzdF9md19yZWxvYWQoc3RydWN0IHNzdF9mdyAqc3N0X2Z3KQotewotCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfZnctPmRzcDsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZyhkc3AtPmRldiwgInJlbG9hZGluZyBmaXJtd2FyZVxuIik7Ci0KLQkvKiBjYWxsIGNvcmUgc3BlY2lmaWMgRlcgcGFzZXIgdG8gbG9hZCBGVyBkYXRhIGludG8gRFNQICovCi0JcmV0ID0gZHNwLT5vcHMtPnBhcnNlX2Z3KHNzdF9mdyk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogcGFyc2UgZncgZmFpbGVkICVkXG4iLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9md19yZWxvYWQpOwotCi12b2lkIHNzdF9md191bmxvYWQoc3RydWN0IHNzdF9mdyAqc3N0X2Z3KQotewotCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfZnctPmRzcDsKLQlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlLCAqbXRtcDsKLQlzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lLCAqcnRtcDsKLQotCWRldl9kYmcoZHNwLT5kZXYsICJ1bmxvYWRpbmcgZmlybXdhcmVcbiIpOwotCi0JbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7Ci0KLQkvKiBjaGVjayBtb2R1bGUgYnkgbW9kdWxlICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1vZHVsZSwgbXRtcCwgJmRzcC0+bW9kdWxlX2xpc3QsIGxpc3QpIHsKLQkJaWYgKG1vZHVsZS0+c3N0X2Z3ID09IHNzdF9mdykgewotCi0JCQkvKiByZW1vdmUgcnVudGltZSBtb2R1bGVzICovCi0JCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocnVudGltZSwgcnRtcCwgJm1vZHVsZS0+cnVudGltZV9saXN0LCBsaXN0KSB7Ci0KLQkJCQlibG9ja19saXN0X3JlbW92ZShkc3AsICZydW50aW1lLT5ibG9ja19saXN0KTsKLQkJCQlsaXN0X2RlbCgmcnVudGltZS0+bGlzdCk7Ci0JCQkJa2ZyZWUocnVudGltZSk7Ci0JCQl9Ci0KLQkJCS8qIG5vdyByZW1vdmUgdGhlIG1vZHVsZSAqLwotCQkJYmxvY2tfbGlzdF9yZW1vdmUoZHNwLCAmbW9kdWxlLT5ibG9ja19saXN0KTsKLQkJCWxpc3RfZGVsKCZtb2R1bGUtPmxpc3QpOwotCQkJa2ZyZWUobW9kdWxlKTsKLQkJfQotCX0KLQotCS8qIHJlbW92ZSBhbGwgc2NyYXRjaCBibG9ja3MgKi8KLQlibG9ja19saXN0X3JlbW92ZShkc3AsICZkc3AtPnNjcmF0Y2hfYmxvY2tfbGlzdCk7Ci0KLQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2Z3X3VubG9hZCk7Ci0KLS8qIGZyZWUgc2luZ2xlIGZpcm13YXJlIG9iamVjdCAqLwotdm9pZCBzc3RfZndfZnJlZShzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncpCi17Ci0Jc3RydWN0IHNzdF9kc3AgKmRzcCA9IHNzdF9mdy0+ZHNwOwotCi0JbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7Ci0JbGlzdF9kZWwoJnNzdF9mdy0+bGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLQotCWlmIChzc3RfZnctPmRtYV9idWYpCi0JCWRtYV9mcmVlX2NvaGVyZW50KGRzcC0+ZG1hX2Rldiwgc3N0X2Z3LT5zaXplLCBzc3RfZnctPmRtYV9idWYsCi0JCQlzc3RfZnctPmRtYWJsZV9md19wYWRkcik7Ci0Ja2ZyZWUoc3N0X2Z3KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9md19mcmVlKTsKLQotLyogZnJlZSBhbGwgZmlybXdhcmUgb2JqZWN0cyAqLwotdm9pZCBzc3RfZndfZnJlZV9hbGwoc3RydWN0IHNzdF9kc3AgKmRzcCkKLXsKLQlzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncsICp0OwotCi0JbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNzdF9mdywgdCwgJmRzcC0+ZndfbGlzdCwgbGlzdCkgewotCi0JCWxpc3RfZGVsKCZzc3RfZnctPmxpc3QpOwotCQlkbWFfZnJlZV9jb2hlcmVudChkc3AtPmRldiwgc3N0X2Z3LT5zaXplLCBzc3RfZnctPmRtYV9idWYsCi0JCQlzc3RfZnctPmRtYWJsZV9md19wYWRkcik7Ci0JCWtmcmVlKHNzdF9mdyk7Ci0JfQotCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfZndfZnJlZV9hbGwpOwotCi0vKiBjcmVhdGUgYSBuZXcgU1NUIGdlbmVyaWMgbW9kdWxlIGZyb20gRlcgdGVtcGxhdGUgKi8KLXN0cnVjdCBzc3RfbW9kdWxlICpzc3RfbW9kdWxlX25ldyhzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZncsCi0Jc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgKnRlbXBsYXRlLCB2b2lkICpwcml2YXRlKQotewotCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfZnctPmRzcDsKLQlzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZTsKLQotCXNzdF9tb2R1bGUgPSBremFsbG9jKHNpemVvZigqc3N0X21vZHVsZSksIEdGUF9LRVJORUwpOwotCWlmIChzc3RfbW9kdWxlID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0Jc3N0X21vZHVsZS0+aWQgPSB0ZW1wbGF0ZS0+aWQ7Ci0Jc3N0X21vZHVsZS0+ZHNwID0gZHNwOwotCXNzdF9tb2R1bGUtPnNzdF9mdyA9IHNzdF9mdzsKLQlzc3RfbW9kdWxlLT5zY3JhdGNoX3NpemUgPSB0ZW1wbGF0ZS0+c2NyYXRjaF9zaXplOwotCXNzdF9tb2R1bGUtPnBlcnNpc3RlbnRfc2l6ZSA9IHRlbXBsYXRlLT5wZXJzaXN0ZW50X3NpemU7Ci0Jc3N0X21vZHVsZS0+ZW50cnkgPSB0ZW1wbGF0ZS0+ZW50cnk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmc3N0X21vZHVsZS0+YmxvY2tfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNzdF9tb2R1bGUtPnJ1bnRpbWVfbGlzdCk7Ci0KLQltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKLQlsaXN0X2FkZCgmc3N0X21vZHVsZS0+bGlzdCwgJmRzcC0+bW9kdWxlX2xpc3QpOwotCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7Ci0KLQlyZXR1cm4gc3N0X21vZHVsZTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9tb2R1bGVfbmV3KTsKLQotLyogZnJlZSBmaXJtd2FyZSBtb2R1bGUgYW5kIHJlbW92ZSBmcm9tIGF2YWlsYWJsZSBsaXN0ICovCi12b2lkIHNzdF9tb2R1bGVfZnJlZShzdHJ1Y3Qgc3N0X21vZHVsZSAqc3N0X21vZHVsZSkKLXsKLQlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gc3N0X21vZHVsZS0+ZHNwOwotCi0JbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7Ci0JbGlzdF9kZWwoJnNzdF9tb2R1bGUtPmxpc3QpOwotCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7Ci0KLQlrZnJlZShzc3RfbW9kdWxlKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9tb2R1bGVfZnJlZSk7Ci0KLXN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnNzdF9tb2R1bGVfcnVudGltZV9uZXcoc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSwKLQlpbnQgaWQsIHZvaWQgKnByaXZhdGUpCi17Ci0Jc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOwotCXN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWU7Ci0KLQlydW50aW1lID0ga3phbGxvYyhzaXplb2YoKnJ1bnRpbWUpLCBHRlBfS0VSTkVMKTsKLQlpZiAocnVudGltZSA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXJ1bnRpbWUtPmlkID0gaWQ7Ci0JcnVudGltZS0+ZHNwID0gZHNwOwotCXJ1bnRpbWUtPm1vZHVsZSA9IG1vZHVsZTsKLQlJTklUX0xJU1RfSEVBRCgmcnVudGltZS0+YmxvY2tfbGlzdCk7Ci0KLQltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKLQlsaXN0X2FkZCgmcnVudGltZS0+bGlzdCwgJm1vZHVsZS0+cnVudGltZV9saXN0KTsKLQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOwotCi0JcmV0dXJuIHJ1bnRpbWU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX3J1bnRpbWVfbmV3KTsKLQotdm9pZCBzc3RfbW9kdWxlX3J1bnRpbWVfZnJlZShzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lKQotewotCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBydW50aW1lLT5kc3A7Ci0KLQltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKLQlsaXN0X2RlbCgmcnVudGltZS0+bGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLQotCWtmcmVlKHJ1bnRpbWUpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9ydW50aW1lX2ZyZWUpOwotCi1zdGF0aWMgc3RydWN0IHNzdF9tZW1fYmxvY2sgKmZpbmRfYmxvY2soc3RydWN0IHNzdF9kc3AgKmRzcCwKLQlzdHJ1Y3Qgc3N0X2Jsb2NrX2FsbG9jYXRvciAqYmEpCi17Ci0Jc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgJmRzcC0+ZnJlZV9ibG9ja19saXN0LCBsaXN0KSB7Ci0JCWlmIChibG9jay0+dHlwZSA9PSBiYS0+dHlwZSAmJiBibG9jay0+b2Zmc2V0ID09IGJhLT5vZmZzZXQpCi0JCQlyZXR1cm4gYmxvY2s7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIEJsb2NrIGFsbG9jYXRvciBtdXN0IGJlIG9uIGJsb2NrIGJvdW5kYXJ5ICovCi1zdGF0aWMgaW50IGJsb2NrX2FsbG9jX2NvbnRpZ3VvdXMoc3RydWN0IHNzdF9kc3AgKmRzcCwKLQlzdHJ1Y3Qgc3N0X2Jsb2NrX2FsbG9jYXRvciAqYmEsIHN0cnVjdCBsaXN0X2hlYWQgKmJsb2NrX2xpc3QpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCB0bXAgPSBMSVNUX0hFQURfSU5JVCh0bXApOwotCXN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jazsKLQl1MzIgYmxvY2tfc3RhcnQgPSBTU1RfSFNXX0JMT0NLX0FOWTsKLQlpbnQgc2l6ZSA9IGJhLT5zaXplLCBvZmZzZXQgPSBiYS0+b2Zmc2V0OwotCi0Jd2hpbGUgKGJhLT5zaXplID4gMCkgewotCi0JCWJsb2NrID0gZmluZF9ibG9jayhkc3AsIGJhKTsKLQkJaWYgKCFibG9jaykgewotCQkJbGlzdF9zcGxpY2UoJnRtcCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0KTsKLQotCQkJYmEtPnNpemUgPSBzaXplOwotCQkJYmEtPm9mZnNldCA9IG9mZnNldDsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJbGlzdF9tb3ZlX3RhaWwoJmJsb2NrLT5saXN0LCAmdG1wKTsKLQkJYmEtPm9mZnNldCArPSBibG9jay0+c2l6ZTsKLQkJYmEtPnNpemUgLT0gYmxvY2stPnNpemU7Ci0JfQotCWJhLT5zaXplID0gc2l6ZTsKLQliYS0+b2Zmc2V0ID0gb2Zmc2V0OwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShibG9jaywgJnRtcCwgbGlzdCkgewotCi0JCWlmIChibG9jay0+b2Zmc2V0IDwgYmxvY2tfc3RhcnQpCi0JCQlibG9ja19zdGFydCA9IGJsb2NrLT5vZmZzZXQ7Ci0KLQkJbGlzdF9hZGQoJmJsb2NrLT5tb2R1bGVfbGlzdCwgYmxvY2tfbGlzdCk7Ci0KLQkJZGV2X2RiZyhkc3AtPmRldiwgImJsb2NrIGFsbG9jYXRlZCAlZDolZCBhdCBvZmZzZXQgMHgleFxuIiwKLQkJCWJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgsIGJsb2NrLT5vZmZzZXQpOwotCX0KLQotCWxpc3Rfc3BsaWNlKCZ0bXAsICZkc3AtPnVzZWRfYmxvY2tfbGlzdCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qIGFsbG9jYXRlIGZpcnN0IGZyZWUgRFNQIGJsb2NrcyBmb3IgZGF0YSAtIGNhbGxlcnMgaG9sZCBsb2NrcyAqLwotc3RhdGljIGludCBibG9ja19hbGxvYyhzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCBzdHJ1Y3Qgc3N0X2Jsb2NrX2FsbG9jYXRvciAqYmEsCi0Jc3RydWN0IGxpc3RfaGVhZCAqYmxvY2tfbGlzdCkKLXsKLQlzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2ssICp0bXA7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoYmEtPnNpemUgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBmaW5kIGZpcnN0IGZyZWUgd2hvbGUgYmxvY2tzIHRoYXQgY2FuIGhvbGQgbW9kdWxlICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZkc3AtPmZyZWVfYmxvY2tfbGlzdCwgbGlzdCkgewotCi0JCS8qIGlnbm9yZSBibG9ja3Mgd2l0aCB3cm9uZyB0eXBlICovCi0JCWlmIChibG9jay0+dHlwZSAhPSBiYS0+dHlwZSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChiYS0+c2l6ZSA+IGJsb2NrLT5zaXplKQotCQkJY29udGludWU7Ci0KLQkJYmEtPm9mZnNldCA9IGJsb2NrLT5vZmZzZXQ7Ci0JCWJsb2NrLT5ieXRlc191c2VkID0gYmEtPnNpemUgJSBibG9jay0+c2l6ZTsKLQkJbGlzdF9hZGQoJmJsb2NrLT5tb2R1bGVfbGlzdCwgYmxvY2tfbGlzdCk7Ci0JCWxpc3RfbW92ZSgmYmxvY2stPmxpc3QsICZkc3AtPnVzZWRfYmxvY2tfbGlzdCk7Ci0JCWRldl9kYmcoZHNwLT5kZXYsICJibG9jayBhbGxvY2F0ZWQgJWQ6JWQgYXQgb2Zmc2V0IDB4JXhcbiIsCi0JCQlibG9jay0+dHlwZSwgYmxvY2stPmluZGV4LCBibG9jay0+b2Zmc2V0KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogdGhlbiBmaW5kIGZyZWUgbXVsdGlwbGUgYmxvY2tzIHRoYXQgY2FuIGhvbGQgbW9kdWxlICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZkc3AtPmZyZWVfYmxvY2tfbGlzdCwgbGlzdCkgewotCi0JCS8qIGlnbm9yZSBibG9ja3Mgd2l0aCB3cm9uZyB0eXBlICovCi0JCWlmIChibG9jay0+dHlwZSAhPSBiYS0+dHlwZSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGRvIHdlIHNwYW4gPiAxIGJsb2NrcyAqLwotCQlpZiAoYmEtPnNpemUgPiBibG9jay0+c2l6ZSkgewotCi0JCQkvKiBhbGlnbiBiYSB0byBibG9jayBib3VuZGFyeSAqLwotCQkJYmEtPm9mZnNldCA9IGJsb2NrLT5vZmZzZXQ7Ci0KLQkJCXJldCA9IGJsb2NrX2FsbG9jX2NvbnRpZ3VvdXMoZHNwLCBiYSwgYmxvY2tfbGlzdCk7Ci0JCQlpZiAocmV0ID09IDApCi0JCQkJcmV0dXJuIHJldDsKLQotCQl9Ci0JfQotCi0JLyogbm90IGVub3VnaCBmcmVlIGJsb2NrIHNwYWNlICovCi0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLWludCBzc3RfYWxsb2NfYmxvY2tzKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBzc3RfYmxvY2tfYWxsb2NhdG9yICpiYSwKLQlzdHJ1Y3QgbGlzdF9oZWFkICpibG9ja19saXN0KQotewotCWludCByZXQ7Ci0KLQlkZXZfZGJnKGRzcC0+ZGV2LCAiYmxvY2sgcmVxdWVzdCAweCV4IGJ5dGVzIGF0IG9mZnNldCAweCV4IHR5cGUgJWRcbiIsCi0JCWJhLT5zaXplLCBiYS0+b2Zmc2V0LCBiYS0+dHlwZSk7Ci0KLQltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKLQotCXJldCA9IGJsb2NrX2FsbG9jKGRzcCwgYmEsIGJsb2NrX2xpc3QpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogY2FuJ3QgYWxsb2MgYmxvY2tzICVkXG4iLCByZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBwcmVwYXJlIERTUCBibG9ja3MgZm9yIG1vZHVsZSB1c2FnZSAqLwotCXJldCA9IGJsb2NrX2xpc3RfcHJlcGFyZShkc3AsIGJsb2NrX2xpc3QpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IHByZXBhcmUgZmFpbGVkXG4iKTsKLQotb3V0OgotCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9hbGxvY19ibG9ja3MpOwotCi1pbnQgc3N0X2ZyZWVfYmxvY2tzKHN0cnVjdCBzc3RfZHNwICpkc3AsIHN0cnVjdCBsaXN0X2hlYWQgKmJsb2NrX2xpc3QpCi17Ci0JbXV0ZXhfbG9jaygmZHNwLT5tdXRleCk7Ci0JYmxvY2tfbGlzdF9yZW1vdmUoZHNwLCBibG9ja19saXN0KTsKLQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2ZyZWVfYmxvY2tzKTsKLQotLyogYWxsb2NhdGUgbWVtb3J5IGJsb2NrcyBmb3Igc3RhdGljIG1vZHVsZSBhZGRyZXNzZXMgLSBjYWxsZXJzIGhvbGQgbG9ja3MgKi8KLXN0YXRpYyBpbnQgYmxvY2tfYWxsb2NfZml4ZWQoc3RydWN0IHNzdF9kc3AgKmRzcCwgc3RydWN0IHNzdF9ibG9ja19hbGxvY2F0b3IgKmJhLAotCXN0cnVjdCBsaXN0X2hlYWQgKmJsb2NrX2xpc3QpCi17Ci0Jc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrLCAqdG1wOwotCXN0cnVjdCBzc3RfYmxvY2tfYWxsb2NhdG9yIGJhX3RtcCA9ICpiYTsKLQl1MzIgZW5kID0gYmEtPm9mZnNldCArIGJhLT5zaXplLCBibG9ja19lbmQ7Ci0JaW50IGVycjsKLQotCS8qIG9ubHkgSVJBTS9EUkFNIGJsb2NrcyBhcmUgbWFuYWdlZCAqLwotCWlmIChiYS0+dHlwZSAhPSBTU1RfTUVNX0lSQU0gJiYgYmEtPnR5cGUgIT0gU1NUX01FTV9EUkFNKQotCQlyZXR1cm4gMDsKLQotCS8qIGFyZSBibG9ja3MgYWxyZWFkeSBhdHRhY2hlZCB0byB0aGlzIG1vZHVsZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCBibG9ja19saXN0LCBtb2R1bGVfbGlzdCkgewotCi0JCS8qIGlnbm9yZSBibG9ja3Mgd2l0aCB3cm9uZyB0eXBlICovCi0JCWlmIChibG9jay0+dHlwZSAhPSBiYS0+dHlwZSkKLQkJCWNvbnRpbnVlOwotCi0JCWJsb2NrX2VuZCA9IGJsb2NrLT5vZmZzZXQgKyBibG9jay0+c2l6ZTsKLQotCQkvKiBmaW5kIGJsb2NrIHRoYXQgaG9sZHMgc2VjdGlvbiAqLwotCQlpZiAoYmEtPm9mZnNldCA+PSBibG9jay0+b2Zmc2V0ICYmIGVuZCA8PSBibG9ja19lbmQpCi0JCQlyZXR1cm4gMDsKLQotCQkvKiBkb2VzIGJsb2NrIHNwYW4gbW9yZSB0aGFuIDEgc2VjdGlvbiAqLwotCQlpZiAoYmEtPm9mZnNldCA+PSBibG9jay0+b2Zmc2V0ICYmIGJhLT5vZmZzZXQgPCBibG9ja19lbmQpIHsKLQotCQkJLyogYWxpZ24gYmEgdG8gYmxvY2sgYm91bmRhcnkgKi8KLQkJCWJhX3RtcC5zaXplIC09IGJsb2NrX2VuZCAtIGJhLT5vZmZzZXQ7Ci0JCQliYV90bXAub2Zmc2V0ID0gYmxvY2tfZW5kOwotCQkJZXJyID0gYmxvY2tfYWxsb2NfY29udGlndW91cyhkc3AsICZiYV90bXAsIGJsb2NrX2xpc3QpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJCS8qIG1vZHVsZSBhbHJlYWR5IG93bnMgYmxvY2tzICovCi0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCS8qIGZpbmQgZmlyc3QgZnJlZSBibG9ja3MgdGhhdCBjYW4gaG9sZCBzZWN0aW9uIGluIGZyZWUgbGlzdCAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgdG1wLCAmZHNwLT5mcmVlX2Jsb2NrX2xpc3QsIGxpc3QpIHsKLQkJYmxvY2tfZW5kID0gYmxvY2stPm9mZnNldCArIGJsb2NrLT5zaXplOwotCi0JCS8qIGlnbm9yZSBibG9ja3Mgd2l0aCB3cm9uZyB0eXBlICovCi0JCWlmIChibG9jay0+dHlwZSAhPSBiYS0+dHlwZSkKLQkJCWNvbnRpbnVlOwotCi0JCS8qIGZpbmQgYmxvY2sgdGhhdCBob2xkcyBzZWN0aW9uICovCi0JCWlmIChiYS0+b2Zmc2V0ID49IGJsb2NrLT5vZmZzZXQgJiYgZW5kIDw9IGJsb2NrX2VuZCkgewotCi0JCQkvKiBhZGQgYmxvY2sgKi8KLQkJCWxpc3RfbW92ZSgmYmxvY2stPmxpc3QsICZkc3AtPnVzZWRfYmxvY2tfbGlzdCk7Ci0JCQlsaXN0X2FkZCgmYmxvY2stPm1vZHVsZV9saXN0LCBibG9ja19saXN0KTsKLQkJCWRldl9kYmcoZHNwLT5kZXYsICJibG9jayBhbGxvY2F0ZWQgJWQ6JWQgYXQgb2Zmc2V0IDB4JXhcbiIsCi0JCQkJYmxvY2stPnR5cGUsIGJsb2NrLT5pbmRleCwgYmxvY2stPm9mZnNldCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCS8qIGRvZXMgYmxvY2sgc3BhbiBtb3JlIHRoYW4gMSBzZWN0aW9uICovCi0JCWlmIChiYS0+b2Zmc2V0ID49IGJsb2NrLT5vZmZzZXQgJiYgYmEtPm9mZnNldCA8IGJsb2NrX2VuZCkgewotCi0JCQkvKiBhZGQgYmxvY2sgKi8KLQkJCWxpc3RfbW92ZSgmYmxvY2stPmxpc3QsICZkc3AtPnVzZWRfYmxvY2tfbGlzdCk7Ci0JCQlsaXN0X2FkZCgmYmxvY2stPm1vZHVsZV9saXN0LCBibG9ja19saXN0KTsKLQkJCS8qIGFsaWduIGJhIHRvIGJsb2NrIGJvdW5kYXJ5ICovCi0JCQliYV90bXAuc2l6ZSAtPSBibG9ja19lbmQgLSBiYS0+b2Zmc2V0OwotCQkJYmFfdG1wLm9mZnNldCA9IGJsb2NrX2VuZDsKLQotCQkJZXJyID0gYmxvY2tfYWxsb2NfY29udGlndW91cyhkc3AsICZiYV90bXAsIGJsb2NrX2xpc3QpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLS8qIExvYWQgZml4ZWQgbW9kdWxlIGRhdGEgaW50byBEU1AgbWVtb3J5IGJsb2NrcyAqLwotaW50IHNzdF9tb2R1bGVfYWxsb2NfYmxvY2tzKHN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUpCi17Ci0Jc3RydWN0IHNzdF9kc3AgKmRzcCA9IG1vZHVsZS0+ZHNwOwotCXN0cnVjdCBzc3RfZncgKnNzdF9mdyA9IG1vZHVsZS0+c3N0X2Z3OwotCXN0cnVjdCBzc3RfYmxvY2tfYWxsb2NhdG9yIGJhOwotCWludCByZXQ7Ci0KLQltZW1zZXQoJmJhLCAwLCBzaXplb2YoYmEpKTsKLQliYS5zaXplID0gbW9kdWxlLT5zaXplOwotCWJhLnR5cGUgPSBtb2R1bGUtPnR5cGU7Ci0JYmEub2Zmc2V0ID0gbW9kdWxlLT5vZmZzZXQ7Ci0KLQlkZXZfZGJnKGRzcC0+ZGV2LCAiYmxvY2sgcmVxdWVzdCAweCV4IGJ5dGVzIGF0IG9mZnNldCAweCV4IHR5cGUgJWRcbiIsCi0JCWJhLnNpemUsIGJhLm9mZnNldCwgYmEudHlwZSk7Ci0KLQltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKLQotCS8qIGFsbG9jIGJsb2NrcyB0aGF0IGluY2x1ZGVzIHRoaXMgc2VjdGlvbiAqLwotCXJldCA9IGJsb2NrX2FsbG9jX2ZpeGVkKGRzcCwgJmJhLCAmbW9kdWxlLT5ibG9ja19saXN0KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRzcC0+ZGV2LAotCQkJImVycm9yOiBubyBmcmVlIGJsb2NrcyBmb3Igc2VjdGlvbiBhdCBvZmZzZXQgMHgleCBzaXplIDB4JXhcbiIsCi0JCQltb2R1bGUtPm9mZnNldCwgbW9kdWxlLT5zaXplKTsKLQkJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogcHJlcGFyZSBEU1AgYmxvY2tzIGZvciBtb2R1bGUgY29weSAqLwotCXJldCA9IGJsb2NrX2xpc3RfcHJlcGFyZShkc3AsICZtb2R1bGUtPmJsb2NrX2xpc3QpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogZncgbW9kdWxlIHByZXBhcmUgZmFpbGVkXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyogY29weSBwYXJ0aWFsIG1vZHVsZSBkYXRhIHRvIGJsb2NrcyAqLwotCWlmIChkc3AtPmZ3X3VzZV9kbWEpIHsKLQkJcmV0ID0gc3N0X2RzcF9kbWFfY29weXRvKGRzcCwKLQkJCWRzcC0+YWRkci5scGVfYmFzZSArIG1vZHVsZS0+b2Zmc2V0LAotCQkJc3N0X2Z3LT5kbWFibGVfZndfcGFkZHIgKyBtb2R1bGUtPmRhdGFfb2Zmc2V0LAotCQkJbW9kdWxlLT5zaXplKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogbW9kdWxlIGNvcHkgZmFpbGVkXG4iKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfSBlbHNlCi0JCXNzdF9tZW1jcHkzMihkc3AtPmFkZHIubHBlICsgbW9kdWxlLT5vZmZzZXQsIG1vZHVsZS0+ZGF0YSwKLQkJCW1vZHVsZS0+c2l6ZSk7Ci0KLQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOwotCXJldHVybiByZXQ7Ci0KLWVycjoKLQlibG9ja19saXN0X3JlbW92ZShkc3AsICZtb2R1bGUtPmJsb2NrX2xpc3QpOwotCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9tb2R1bGVfYWxsb2NfYmxvY2tzKTsKLQotLyogVW5sb2FkIGVudGlyZSBtb2R1bGUgZnJvbSBEU1AgbWVtb3J5ICovCi1pbnQgc3N0X21vZHVsZV9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlKQotewotCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBtb2R1bGUtPmRzcDsKLQotCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOwotCWJsb2NrX2xpc3RfcmVtb3ZlKGRzcCwgJm1vZHVsZS0+YmxvY2tfbGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9tb2R1bGVfZnJlZV9ibG9ja3MpOwotCi1pbnQgc3N0X21vZHVsZV9ydW50aW1lX2FsbG9jX2Jsb2NrcyhzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lLAotCWludCBvZmZzZXQpCi17Ci0Jc3RydWN0IHNzdF9kc3AgKmRzcCA9IHJ1bnRpbWUtPmRzcDsKLQlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlID0gcnVudGltZS0+bW9kdWxlOwotCXN0cnVjdCBzc3RfYmxvY2tfYWxsb2NhdG9yIGJhOwotCWludCByZXQ7Ci0KLQlpZiAobW9kdWxlLT5wZXJzaXN0ZW50X3NpemUgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQltZW1zZXQoJmJhLCAwLCBzaXplb2YoYmEpKTsKLQliYS5zaXplID0gbW9kdWxlLT5wZXJzaXN0ZW50X3NpemU7Ci0JYmEudHlwZSA9IFNTVF9NRU1fRFJBTTsKLQotCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOwotCi0JLyogZG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhdCBhIGZpeGVkIGFkZHJlc3MgPyAqLwotCWlmIChvZmZzZXQgIT0gMCkgewotCi0JCWJhLm9mZnNldCA9IG9mZnNldDsKLQotCQlkZXZfZGJnKGRzcC0+ZGV2LCAicGVyc2lzdGVudCBmaXhlZCBibG9jayByZXF1ZXN0IDB4JXggYnl0ZXMgdHlwZSAlZCBvZmZzZXQgMHgleFxuIiwKLQkJCWJhLnNpemUsIGJhLnR5cGUsIGJhLm9mZnNldCk7Ci0KLQkJLyogYWxsb2MgYmxvY2tzIHRoYXQgaW5jbHVkZXMgdGhpcyBzZWN0aW9uICovCi0JCXJldCA9IGJsb2NrX2FsbG9jX2ZpeGVkKGRzcCwgJmJhLCAmcnVudGltZS0+YmxvY2tfbGlzdCk7Ci0KLQl9IGVsc2UgewotCQlkZXZfZGJnKGRzcC0+ZGV2LCAicGVyc2lzdGVudCBibG9jayByZXF1ZXN0IDB4JXggYnl0ZXMgdHlwZSAlZFxuIiwKLQkJCWJhLnNpemUsIGJhLnR5cGUpOwotCi0JCS8qIGFsbG9jIGJsb2NrcyB0aGF0IGluY2x1ZGVzIHRoaXMgc2VjdGlvbiAqLwotCQlyZXQgPSBibG9ja19hbGxvYyhkc3AsICZiYSwgJnJ1bnRpbWUtPmJsb2NrX2xpc3QpOwotCX0KLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRzcC0+ZGV2LAotCQkiZXJyb3I6IG5vIGZyZWUgYmxvY2tzIGZvciBydW50aW1lIG1vZHVsZSBzaXplIDB4JXhcbiIsCi0JCQltb2R1bGUtPnBlcnNpc3RlbnRfc2l6ZSk7Ci0JCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlydW50aW1lLT5wZXJzaXN0ZW50X29mZnNldCA9IGJhLm9mZnNldDsKLQotCS8qIHByZXBhcmUgRFNQIGJsb2NrcyBmb3IgbW9kdWxlIGNvcHkgKi8KLQlyZXQgPSBibG9ja19saXN0X3ByZXBhcmUoZHNwLCAmcnVudGltZS0+YmxvY2tfbGlzdCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBydW50aW1lIGJsb2NrIHByZXBhcmUgZmFpbGVkXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLQlyZXR1cm4gcmV0OwotCi1lcnI6Ci0JYmxvY2tfbGlzdF9yZW1vdmUoZHNwLCAmbW9kdWxlLT5ibG9ja19saXN0KTsKLQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX3J1bnRpbWVfYWxsb2NfYmxvY2tzKTsKLQotaW50IHNzdF9tb2R1bGVfcnVudGltZV9mcmVlX2Jsb2NrcyhzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lKQotewotCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBydW50aW1lLT5kc3A7Ci0KLQltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKLQlibG9ja19saXN0X3JlbW92ZShkc3AsICZydW50aW1lLT5ibG9ja19saXN0KTsKLQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9ydW50aW1lX2ZyZWVfYmxvY2tzKTsKLQotaW50IHNzdF9tb2R1bGVfcnVudGltZV9zYXZlKHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUsCi0Jc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZV9jb250ZXh0ICpjb250ZXh0KQotewotCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBydW50aW1lLT5kc3A7Ci0Jc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZSA9IHJ1bnRpbWUtPm1vZHVsZTsKLQlpbnQgcmV0ID0gMDsKLQotCWRldl9kYmcoZHNwLT5kZXYsICJzYXZpbmcgcnVudGltZSAlZCBtZW1vcnkgYXQgMHgleCBzaXplIDB4JXhcbiIsCi0JCXJ1bnRpbWUtPmlkLCBydW50aW1lLT5wZXJzaXN0ZW50X29mZnNldCwKLQkJbW9kdWxlLT5wZXJzaXN0ZW50X3NpemUpOwotCi0JY29udGV4dC0+YnVmZmVyID0gZG1hX2FsbG9jX2NvaGVyZW50KGRzcC0+ZG1hX2RldiwKLQkJbW9kdWxlLT5wZXJzaXN0ZW50X3NpemUsCi0JCSZjb250ZXh0LT5kbWFfYnVmZmVyLCBHRlBfRE1BIHwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjb250ZXh0LT5idWZmZXIpIHsKLQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBETUEgY29udGV4dCBhbGxvYyBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKLQotCWlmIChkc3AtPmZ3X3VzZV9kbWEpIHsKLQotCQlyZXQgPSBzc3RfZHNwX2RtYV9nZXRfY2hhbm5lbChkc3AsIDApOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gZXJyOwotCi0JCXJldCA9IHNzdF9kc3BfZG1hX2NvcHlmcm9tKGRzcCwgY29udGV4dC0+ZG1hX2J1ZmZlciwKLQkJCWRzcC0+YWRkci5scGVfYmFzZSArIHJ1bnRpbWUtPnBlcnNpc3RlbnRfb2Zmc2V0LAotCQkJbW9kdWxlLT5wZXJzaXN0ZW50X3NpemUpOwotCQlzc3RfZHNwX2RtYV9wdXRfY2hhbm5lbChkc3ApOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBjb250ZXh0IGNvcHkgZmFpbGVkXG4iKTsKLQkJCWdvdG8gZXJyOwotCQl9Ci0JfSBlbHNlCi0JCXNzdF9tZW1jcHkzMihjb250ZXh0LT5idWZmZXIsIGRzcC0+YWRkci5scGUgKwotCQkJcnVudGltZS0+cGVyc2lzdGVudF9vZmZzZXQsCi0JCQltb2R1bGUtPnBlcnNpc3RlbnRfc2l6ZSk7Ci0KLWVycjoKLQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX3J1bnRpbWVfc2F2ZSk7Ci0KLWludCBzc3RfbW9kdWxlX3J1bnRpbWVfcmVzdG9yZShzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lLAotCXN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWVfY29udGV4dCAqY29udGV4dCkKLXsKLQlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gcnVudGltZS0+ZHNwOwotCXN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUgPSBydW50aW1lLT5tb2R1bGU7Ci0JaW50IHJldCA9IDA7Ci0KLQlkZXZfZGJnKGRzcC0+ZGV2LCAicmVzdG9yaW5nIHJ1bnRpbWUgJWQgbWVtb3J5IGF0IDB4JXggc2l6ZSAweCV4XG4iLAotCQlydW50aW1lLT5pZCwgcnVudGltZS0+cGVyc2lzdGVudF9vZmZzZXQsCi0JCW1vZHVsZS0+cGVyc2lzdGVudF9zaXplKTsKLQotCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOwotCi0JaWYgKCFjb250ZXh0LT5idWZmZXIpIHsKLQkJZGV2X2luZm8oZHNwLT5kZXYsICJubyBjb250ZXh0IGJ1ZmZlciBuZWVkIHRvIHJlc3RvcmUhXG4iKTsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKGRzcC0+ZndfdXNlX2RtYSkgewotCi0JCXJldCA9IHNzdF9kc3BfZG1hX2dldF9jaGFubmVsKGRzcCwgMCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBlcnI7Ci0KLQkJcmV0ID0gc3N0X2RzcF9kbWFfY29weXRvKGRzcCwKLQkJCWRzcC0+YWRkci5scGVfYmFzZSArIHJ1bnRpbWUtPnBlcnNpc3RlbnRfb2Zmc2V0LAotCQkJY29udGV4dC0+ZG1hX2J1ZmZlciwgbW9kdWxlLT5wZXJzaXN0ZW50X3NpemUpOwotCQlzc3RfZHNwX2RtYV9wdXRfY2hhbm5lbChkc3ApOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBtb2R1bGUgY29weSBmYWlsZWRcbiIpOwotCQkJZ290byBlcnI7Ci0JCX0KLQl9IGVsc2UKLQkJc3N0X21lbWNweTMyKGRzcC0+YWRkci5scGUgKyBydW50aW1lLT5wZXJzaXN0ZW50X29mZnNldCwKLQkJCWNvbnRleHQtPmJ1ZmZlciwgbW9kdWxlLT5wZXJzaXN0ZW50X3NpemUpOwotCi0JZG1hX2ZyZWVfY29oZXJlbnQoZHNwLT5kbWFfZGV2LCBtb2R1bGUtPnBlcnNpc3RlbnRfc2l6ZSwKLQkJCQljb250ZXh0LT5idWZmZXIsIGNvbnRleHQtPmRtYV9idWZmZXIpOwotCWNvbnRleHQtPmJ1ZmZlciA9IE5VTEw7Ci0KLWVycjoKLQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfbW9kdWxlX3J1bnRpbWVfcmVzdG9yZSk7Ci0KLS8qIHJlZ2lzdGVyIGEgRFNQIG1lbW9yeSBibG9jayBmb3IgdXNlIHdpdGggRlcgYmFzZWQgbW9kdWxlcyAqLwotc3RydWN0IHNzdF9tZW1fYmxvY2sgKnNzdF9tZW1fYmxvY2tfcmVnaXN0ZXIoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIG9mZnNldCwKLQl1MzIgc2l6ZSwgZW51bSBzc3RfbWVtX3R5cGUgdHlwZSwgc3RydWN0IHNzdF9ibG9ja19vcHMgKm9wcywgdTMyIGluZGV4LAotCXZvaWQgKnByaXZhdGUpCi17Ci0Jc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrOwotCi0JYmxvY2sgPSBremFsbG9jKHNpemVvZigqYmxvY2spLCBHRlBfS0VSTkVMKTsKLQlpZiAoYmxvY2sgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlibG9jay0+b2Zmc2V0ID0gb2Zmc2V0OwotCWJsb2NrLT5zaXplID0gc2l6ZTsKLQlibG9jay0+aW5kZXggPSBpbmRleDsKLQlibG9jay0+dHlwZSA9IHR5cGU7Ci0JYmxvY2stPmRzcCA9IGRzcDsKLQlibG9jay0+cHJpdmF0ZSA9IHByaXZhdGU7Ci0JYmxvY2stPm9wcyA9IG9wczsKLQotCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOwotCWxpc3RfYWRkKCZibG9jay0+bGlzdCwgJmRzcC0+ZnJlZV9ibG9ja19saXN0KTsKLQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOwotCi0JcmV0dXJuIGJsb2NrOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21lbV9ibG9ja19yZWdpc3Rlcik7Ci0KLS8qIHVucmVnaXN0ZXIgYWxsIERTUCBtZW1vcnkgYmxvY2tzICovCi12b2lkIHNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwoc3RydWN0IHNzdF9kc3AgKmRzcCkKLXsKLQlzdHJ1Y3Qgc3N0X21lbV9ibG9jayAqYmxvY2ssICp0bXA7Ci0KLQltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKLQotCS8qIHVucmVnaXN0ZXIgdXNlZCBibG9ja3MgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmxvY2ssIHRtcCwgJmRzcC0+dXNlZF9ibG9ja19saXN0LCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZibG9jay0+bGlzdCk7Ci0JCWtmcmVlKGJsb2NrKTsKLQl9Ci0KLQkvKiB1bnJlZ2lzdGVyIGZyZWUgYmxvY2tzICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJsb2NrLCB0bXAsICZkc3AtPmZyZWVfYmxvY2tfbGlzdCwgbGlzdCkgewotCQlsaXN0X2RlbCgmYmxvY2stPmxpc3QpOwotCQlrZnJlZShibG9jayk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwpOwotCi0vKiBhbGxvY2F0ZSBzY3JhdGNoIGJ1ZmZlciBibG9ja3MgKi8KLWludCBzc3RfYmxvY2tfYWxsb2Nfc2NyYXRjaChzdHJ1Y3Qgc3N0X2RzcCAqZHNwKQotewotCXN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGU7Ci0Jc3RydWN0IHNzdF9ibG9ja19hbGxvY2F0b3IgYmE7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmRzcC0+bXV0ZXgpOwotCi0JLyogY2FsY3VsYXRlIHJlcXVpcmVkIHNjcmF0Y2ggc2l6ZSAqLwotCWRzcC0+c2NyYXRjaF9zaXplID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1vZHVsZSwgJmRzcC0+bW9kdWxlX2xpc3QsIGxpc3QpIHsKLQkJZGV2X2RiZyhkc3AtPmRldiwgIm1vZHVsZSAlZCBzY3JhdGNoIHJlcSAweCV4IGJ5dGVzXG4iLAotCQkJbW9kdWxlLT5pZCwgbW9kdWxlLT5zY3JhdGNoX3NpemUpOwotCQlpZiAoZHNwLT5zY3JhdGNoX3NpemUgPCBtb2R1bGUtPnNjcmF0Y2hfc2l6ZSkKLQkJCWRzcC0+c2NyYXRjaF9zaXplID0gbW9kdWxlLT5zY3JhdGNoX3NpemU7Ci0JfQotCi0JZGV2X2RiZyhkc3AtPmRldiwgInNjcmF0Y2ggYnVmZmVyIHJlcXVpcmVkIGlzIDB4JXggYnl0ZXNcbiIsCi0JCWRzcC0+c2NyYXRjaF9zaXplKTsKLQotCWlmIChkc3AtPnNjcmF0Y2hfc2l6ZSA9PSAwKSB7Ci0JCWRldl9pbmZvKGRzcC0+ZGV2LCAibm8gbW9kdWxlcyBuZWVkIHNjcmF0Y2ggYnVmZmVyXG4iKTsKLQkJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogYWxsb2NhdGUgYmxvY2tzIGZvciBtb2R1bGUgc2NyYXRjaCBidWZmZXJzICovCi0JZGV2X2RiZyhkc3AtPmRldiwgImFsbG9jYXRpbmcgc2NyYXRjaCBibG9ja3NcbiIpOwotCi0JYmEuc2l6ZSA9IGRzcC0+c2NyYXRjaF9zaXplOwotCWJhLnR5cGUgPSBTU1RfTUVNX0RSQU07Ci0KLQkvKiBkbyB3ZSBuZWVkIHRvIGFsbG9jYXRlIGF0IGZpeGVkIG9mZnNldCAqLwotCWlmIChkc3AtPnNjcmF0Y2hfb2Zmc2V0ICE9IDApIHsKLQotCQlkZXZfZGJnKGRzcC0+ZGV2LCAiYmxvY2sgcmVxdWVzdCAweCV4IGJ5dGVzIHR5cGUgJWQgYXQgMHgleFxuIiwKLQkJCWJhLnNpemUsIGJhLnR5cGUsIGJhLm9mZnNldCk7Ci0KLQkJYmEub2Zmc2V0ID0gZHNwLT5zY3JhdGNoX29mZnNldDsKLQotCQkvKiBhbGxvYyBibG9ja3MgdGhhdCBpbmNsdWRlcyB0aGlzIHNlY3Rpb24gKi8KLQkJcmV0ID0gYmxvY2tfYWxsb2NfZml4ZWQoZHNwLCAmYmEsICZkc3AtPnNjcmF0Y2hfYmxvY2tfbGlzdCk7Ci0KLQl9IGVsc2UgewotCQlkZXZfZGJnKGRzcC0+ZGV2LCAiYmxvY2sgcmVxdWVzdCAweCV4IGJ5dGVzIHR5cGUgJWRcbiIsCi0JCQliYS5zaXplLCBiYS50eXBlKTsKLQotCQliYS5vZmZzZXQgPSAwOwotCQlyZXQgPSBibG9ja19hbGxvYyhkc3AsICZiYSwgJmRzcC0+c2NyYXRjaF9ibG9ja19saXN0KTsKLQl9Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBjYW4ndCBhbGxvYyBzY3JhdGNoIGJsb2Nrc1xuIik7Ci0JCW11dGV4X3VubG9jaygmZHNwLT5tdXRleCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gYmxvY2tfbGlzdF9wcmVwYXJlKGRzcCwgJmRzcC0+c2NyYXRjaF9ibG9ja19saXN0KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IHNjcmF0Y2ggYmxvY2sgcHJlcGFyZSBmYWlsZWRcbiIpOwotCQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIGFzc2lnbiB0aGUgc2FtZSBvZmZzZXQgb2Ygc2NyYXRjaCB0byBlYWNoIG1vZHVsZSAqLwotCWRzcC0+c2NyYXRjaF9vZmZzZXQgPSBiYS5vZmZzZXQ7Ci0JbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLQlyZXR1cm4gZHNwLT5zY3JhdGNoX3NpemU7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfYmxvY2tfYWxsb2Nfc2NyYXRjaCk7Ci0KLS8qIGZyZWUgYWxsIHNjcmF0Y2ggYmxvY2tzICovCi12b2lkIHNzdF9ibG9ja19mcmVlX3NjcmF0Y2goc3RydWN0IHNzdF9kc3AgKmRzcCkKLXsKLQltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKLQlibG9ja19saXN0X3JlbW92ZShkc3AsICZkc3AtPnNjcmF0Y2hfYmxvY2tfbGlzdCk7Ci0JbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9ibG9ja19mcmVlX3NjcmF0Y2gpOwotCi0vKiBnZXQgYSBtb2R1bGUgZnJvbSBpdCdzIHVuaXF1ZSBJRCAqLwotc3RydWN0IHNzdF9tb2R1bGUgKnNzdF9tb2R1bGVfZ2V0X2Zyb21faWQoc3RydWN0IHNzdF9kc3AgKmRzcCwgdTMyIGlkKQotewotCXN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGU7Ci0KLQltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkobW9kdWxlLCAmZHNwLT5tb2R1bGVfbGlzdCwgbGlzdCkgewotCQlpZiAobW9kdWxlLT5pZCA9PSBpZCkgewotCQkJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLQkJCXJldHVybiBtb2R1bGU7Ci0JCX0KLQl9Ci0KLQltdXRleF91bmxvY2soJmRzcC0+bXV0ZXgpOwotCXJldHVybiBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X21vZHVsZV9nZXRfZnJvbV9pZCk7Ci0KLXN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnNzdF9tb2R1bGVfcnVudGltZV9nZXRfZnJvbV9pZCgKLQlzdHJ1Y3Qgc3N0X21vZHVsZSAqbW9kdWxlLCB1MzIgaWQpCi17Ci0Jc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZTsKLQlzdHJ1Y3Qgc3N0X2RzcCAqZHNwID0gbW9kdWxlLT5kc3A7Ci0KLQltdXRleF9sb2NrKCZkc3AtPm11dGV4KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkocnVudGltZSwgJm1vZHVsZS0+cnVudGltZV9saXN0LCBsaXN0KSB7Ci0JCWlmIChydW50aW1lLT5pZCA9PSBpZCkgewotCQkJbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLQkJCXJldHVybiBydW50aW1lOwotCQl9Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZkc3AtPm11dGV4KTsKLQlyZXR1cm4gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9tb2R1bGVfcnVudGltZV9nZXRfZnJvbV9pZCk7Ci0KLS8qIHJldHVybnMgYmxvY2sgYWRkcmVzcyBpbiBEU1AgYWRkcmVzcyBzcGFjZSAqLwotdTMyIHNzdF9kc3BfZ2V0X29mZnNldChzdHJ1Y3Qgc3N0X2RzcCAqZHNwLCB1MzIgb2Zmc2V0LAotCWVudW0gc3N0X21lbV90eXBlIHR5cGUpCi17Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBTU1RfTUVNX0lSQU06Ci0JCXJldHVybiBvZmZzZXQgLSBkc3AtPmFkZHIuaXJhbV9vZmZzZXQgKwotCQkJZHNwLT5hZGRyLmRzcF9pcmFtX29mZnNldDsKLQljYXNlIFNTVF9NRU1fRFJBTToKLQkJcmV0dXJuIG9mZnNldCAtIGRzcC0+YWRkci5kcmFtX29mZnNldCArCi0JCQlkc3AtPmFkZHIuZHNwX2RyYW1fb2Zmc2V0OwotCWRlZmF1bHQ6Ci0JCXJldHVybiAwOwotCX0KLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9kc3BfZ2V0X29mZnNldCk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtZHNwLmMgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtZHNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MmZmYWUuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLWRzcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzA5ICswLDAgQEAKLS8qCi0gKiBJbnRlbCBIYXN3ZWxsIFNTVCBEU1AgZHJpdmVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCi0gKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLQotI2luY2x1ZGUgInNzdC1kc3AuaCIKLSNpbmNsdWRlICJzc3QtZHNwLXByaXYuaCIKLSNpbmNsdWRlICJzc3QtaGFzd2VsbC1pcGMuaCIKLQotI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9oc3dhZHNwLmg+Ci0KLSNkZWZpbmUgU1NUX0hTV19GV19TSUdOQVRVUkVfU0laRQk0Ci0jZGVmaW5lIFNTVF9IU1dfRldfU0lHTgkJCSIkU1NUIgotI2RlZmluZSBTU1RfSFNXX0ZXX0xJQl9TSUdOCQkiJExJQiIKLQotI2RlZmluZSBTU1RfV1BUX1NISU1fT0ZGU0VUCTB4RkIwMDAKLSNkZWZpbmUgU1NUX0xQX1NISU1fT0ZGU0VUCTB4RTcwMDAKLSNkZWZpbmUgU1NUX1dQVF9JUkFNX09GRlNFVAkweEEwMDAwCi0jZGVmaW5lIFNTVF9MUF9JUkFNX09GRlNFVAkweDgwMDAwCi0jZGVmaW5lIFNTVF9XUFRfRFNQX0RSQU1fT0ZGU0VUCTB4NDAwMDAwCi0jZGVmaW5lIFNTVF9XUFRfRFNQX0lSQU1fT0ZGU0VUCTB4MDAwMDAKLSNkZWZpbmUgU1NUX0xQVF9EU1BfRFJBTV9PRkZTRVQJMHg0MDAwMDAKLSNkZWZpbmUgU1NUX0xQVF9EU1BfSVJBTV9PRkZTRVQJMHgwMDAwMAotCi0jZGVmaW5lIFNTVF9TSElNX1BNX1JFRwkJMHg4NAotCi0jZGVmaW5lIFNTVF9IU1dfSVJBTQkxCi0jZGVmaW5lIFNTVF9IU1dfRFJBTQkyCi0jZGVmaW5lIFNTVF9IU1dfUkVHUwkzCi0KLXN0cnVjdCBkbWFfYmxvY2tfaW5mbyB7Ci0JX19sZTMyIHR5cGU7CQkvKiBJUkFNL0RSQU0gKi8KLQlfX2xlMzIgc2l6ZTsJCS8qIEJ5dGVzICovCi0JX19sZTMyIHJhbV9vZmZzZXQ7CS8qIE9mZnNldCBpbiBJL0RSQU0gKi8KLQlfX2xlMzIgcnN2ZDsJCS8qIFJlc2VydmVkIGZpZWxkICovCi19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgZndfbW9kdWxlX2luZm8gewotCV9fbGUzMiBwZXJzaXN0ZW50X3NpemU7Ci0JX19sZTMyIHNjcmF0Y2hfc2l6ZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBmd19oZWFkZXIgewotCXVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW1NTVF9IU1dfRldfU0lHTkFUVVJFX1NJWkVdOyAvKiBGVyBzaWduYXR1cmUgKi8KLQlfX2xlMzIgZmlsZV9zaXplOwkJLyogc2l6ZSBvZiBmdyBtaW51cyB0aGlzIGhlYWRlciAqLwotCV9fbGUzMiBtb2R1bGVzOwkJLyogICMgb2YgbW9kdWxlcyAqLwotCV9fbGUzMiBmaWxlX2Zvcm1hdDsJLyogdmVyc2lvbiBvZiBoZWFkZXIgZm9ybWF0ICovCi0JX19sZTMyIHJlc2VydmVkWzRdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IGZ3X21vZHVsZV9oZWFkZXIgewotCXVuc2lnbmVkIGNoYXIgc2lnbmF0dXJlW1NTVF9IU1dfRldfU0lHTkFUVVJFX1NJWkVdOyAvKiBtb2R1bGUgc2lnbmF0dXJlICovCi0JX19sZTMyIG1vZF9zaXplOwkvKiBzaXplIG9mIG1vZHVsZSAqLwotCV9fbGUzMiBibG9ja3M7CS8qICMgb2YgYmxvY2tzICovCi0JX19sZTE2IHBhZGRpbmc7Ci0JX19sZTE2IHR5cGU7CS8qIGNvZGVjIHR5cGUsIHBwIGxpYiAqLwotCV9fbGUzMiBlbnRyeV9wb2ludDsKLQlzdHJ1Y3QgZndfbW9kdWxlX2luZm8gaW5mbzsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0YXRpYyB2b2lkIGhzd19mcmVlKHN0cnVjdCBzc3RfZHNwICpzc3QpOwotCi1zdGF0aWMgaW50IGhzd19wYXJzZV9tb2R1bGUoc3RydWN0IHNzdF9kc3AgKmRzcCwgc3RydWN0IHNzdF9mdyAqZncsCi0Jc3RydWN0IGZ3X21vZHVsZV9oZWFkZXIgKm1vZHVsZSkKLXsKLQlzdHJ1Y3QgZG1hX2Jsb2NrX2luZm8gKmJsb2NrOwotCXN0cnVjdCBzc3RfbW9kdWxlICptb2Q7Ci0Jc3RydWN0IHNzdF9tb2R1bGVfdGVtcGxhdGUgdGVtcGxhdGU7Ci0JaW50IGNvdW50LCByZXQ7Ci0Jdm9pZCBfX2lvbWVtICpyYW07Ci0KLQkvKiBUT0RPOiBhbGxvd2VkIG1vZHVsZSB0eXBlcyBuZWVkIHRvIGJlIGNvbmZpZ3VyYWJsZSAqLwotCWlmIChtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfQkFTRV9GVwotCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfUENNX1NZU1RFTQotCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfUENNCi0JCSYmIG1vZHVsZS0+dHlwZSAhPSBTU1RfSFNXX01PRFVMRV9QQ01fUkVGRVJFTkNFCi0JCSYmIG1vZHVsZS0+dHlwZSAhPSBTU1RfSFNXX01PRFVMRV9QQ01fQ0FQVFVSRQotCQkmJiBtb2R1bGUtPnR5cGUgIT0gU1NUX0hTV19NT0RVTEVfTFBBTCkKLQkJcmV0dXJuIDA7Ci0KLQlkZXZfZGJnKGRzcC0+ZGV2LCAibmV3IG1vZHVsZSBzaWduIDB4JXMgc2l6ZSAweCV4IGJsb2NrcyAweCV4IHR5cGUgMHgleFxuIiwKLQkJbW9kdWxlLT5zaWduYXR1cmUsIG1vZHVsZS0+bW9kX3NpemUsCi0JCW1vZHVsZS0+YmxvY2tzLCBtb2R1bGUtPnR5cGUpOwotCWRldl9kYmcoZHNwLT5kZXYsICIgZW50cnlwb2ludCAweCV4XG4iLCBtb2R1bGUtPmVudHJ5X3BvaW50KTsKLQlkZXZfZGJnKGRzcC0+ZGV2LCAiIHBlcnNpc3RlbnQgMHgleCBzY3JhdGNoIDB4JXhcbiIsCi0JCW1vZHVsZS0+aW5mby5wZXJzaXN0ZW50X3NpemUsIG1vZHVsZS0+aW5mby5zY3JhdGNoX3NpemUpOwotCi0JbWVtc2V0KCZ0ZW1wbGF0ZSwgMCwgc2l6ZW9mKHRlbXBsYXRlKSk7Ci0JdGVtcGxhdGUuaWQgPSBtb2R1bGUtPnR5cGU7Ci0JdGVtcGxhdGUuZW50cnkgPSBtb2R1bGUtPmVudHJ5X3BvaW50IC0gNDsKLQl0ZW1wbGF0ZS5wZXJzaXN0ZW50X3NpemUgPSBtb2R1bGUtPmluZm8ucGVyc2lzdGVudF9zaXplOwotCXRlbXBsYXRlLnNjcmF0Y2hfc2l6ZSA9IG1vZHVsZS0+aW5mby5zY3JhdGNoX3NpemU7Ci0KLQltb2QgPSBzc3RfbW9kdWxlX25ldyhmdywgJnRlbXBsYXRlLCBOVUxMKTsKLQlpZiAobW9kID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYmxvY2sgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKTsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG1vZHVsZS0+YmxvY2tzOyBjb3VudCsrKSB7Ci0KLQkJaWYgKGJsb2NrLT5zaXplIDw9IDApIHsKLQkJCWRldl9lcnIoZHNwLT5kZXYsCi0JCQkJImVycm9yOiBibG9jayAlZCBzaXplIGludmFsaWRcbiIsIGNvdW50KTsKLQkJCXNzdF9tb2R1bGVfZnJlZShtb2QpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlzd2l0Y2ggKGJsb2NrLT50eXBlKSB7Ci0JCWNhc2UgU1NUX0hTV19JUkFNOgotCQkJcmFtID0gZHNwLT5hZGRyLmxwZTsKLQkJCW1vZC0+b2Zmc2V0ID0KLQkJCQlibG9jay0+cmFtX29mZnNldCArIGRzcC0+YWRkci5pcmFtX29mZnNldDsKLQkJCW1vZC0+dHlwZSA9IFNTVF9NRU1fSVJBTTsKLQkJCWJyZWFrOwotCQljYXNlIFNTVF9IU1dfRFJBTToKLQkJCXJhbSA9IGRzcC0+YWRkci5scGU7Ci0JCQltb2QtPm9mZnNldCA9IGJsb2NrLT5yYW1fb2Zmc2V0OwotCQkJbW9kLT50eXBlID0gU1NUX01FTV9EUkFNOwotCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGJhZCB0eXBlIDB4JXggZm9yIGJsb2NrIDB4JXhcbiIsCi0JCQkJYmxvY2stPnR5cGUsIGNvdW50KTsKLQkJCXNzdF9tb2R1bGVfZnJlZShtb2QpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQltb2QtPnNpemUgPSBibG9jay0+c2l6ZTsKLQkJbW9kLT5kYXRhID0gKHZvaWQgKilibG9jayArIHNpemVvZigqYmxvY2spOwotCQltb2QtPmRhdGFfb2Zmc2V0ID0gbW9kLT5kYXRhIC0gZnctPmRtYV9idWY7Ci0KLQkJZGV2X2RiZyhkc3AtPmRldiwgIm1vZHVsZSBibG9jayAlZCB0eXBlIDB4JXggIgotCQkJInNpemUgMHgleCA9PT4gcmFtICVwIG9mZnNldCAweCV4XG4iLAotCQkJY291bnQsIG1vZC0+dHlwZSwgYmxvY2stPnNpemUsIHJhbSwKLQkJCWJsb2NrLT5yYW1fb2Zmc2V0KTsKLQotCQlyZXQgPSBzc3RfbW9kdWxlX2FsbG9jX2Jsb2Nrcyhtb2QpOwotCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2Vycihkc3AtPmRldiwgImVycm9yOiBjb3VsZCBub3QgYWxsb2NhdGUgYmxvY2tzIGZvciBtb2R1bGUgJWRcbiIsCi0JCQkJY291bnQpOwotCQkJc3N0X21vZHVsZV9mcmVlKG1vZCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJYmxvY2sgPSAodm9pZCAqKWJsb2NrICsgc2l6ZW9mKCpibG9jaykgKyBibG9jay0+c2l6ZTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBoc3dfcGFyc2VfZndfaW1hZ2Uoc3RydWN0IHNzdF9mdyAqc3N0X2Z3KQotewotCXN0cnVjdCBmd19oZWFkZXIgKmhlYWRlcjsKLQlzdHJ1Y3QgZndfbW9kdWxlX2hlYWRlciAqbW9kdWxlOwotCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBzc3RfZnctPmRzcDsKLQlpbnQgcmV0LCBjb3VudDsKLQotCS8qIFJlYWQgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkYXRhIHBvaW50ZXIgKi8KLQloZWFkZXIgPSAoc3RydWN0IGZ3X2hlYWRlciAqKXNzdF9mdy0+ZG1hX2J1ZjsKLQotCS8qIHZlcmlmeSBGVyAqLwotCWlmICgoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwgU1NUX0hTV19GV19TSUdOLCA0KSAhPSAwKSB8fAotCQkoc3N0X2Z3LT5zaXplICE9IGhlYWRlci0+ZmlsZV9zaXplICsgc2l6ZW9mKCpoZWFkZXIpKSkgewotCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGludmFsaWQgZncgc2lnbi9maWxlc2l6ZSBtaXNtYXRjaFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRldl9kYmcoZHNwLT5kZXYsICJoZWFkZXIgc2l6ZT0weCV4IG1vZHVsZXM9MHgleCBmbXQ9MHgleCBzaXplPSV6dVxuIiwKLQkJaGVhZGVyLT5maWxlX3NpemUsIGhlYWRlci0+bW9kdWxlcywKLQkJaGVhZGVyLT5maWxlX2Zvcm1hdCwgc2l6ZW9mKCpoZWFkZXIpKTsKLQotCS8qIHBhcnNlIGVhY2ggbW9kdWxlICovCi0JbW9kdWxlID0gKHZvaWQgKilzc3RfZnctPmRtYV9idWYgKyBzaXplb2YoKmhlYWRlcik7Ci0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgaGVhZGVyLT5tb2R1bGVzOyBjb3VudCsrKSB7Ci0KLQkJLyogbW9kdWxlICovCi0JCXJldCA9IGhzd19wYXJzZV9tb2R1bGUoZHNwLCBzc3RfZncsIG1vZHVsZSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGludmFsaWQgbW9kdWxlICVkXG4iLCBjb3VudCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCW1vZHVsZSA9ICh2b2lkICopbW9kdWxlICsgc2l6ZW9mKCptb2R1bGUpICsgbW9kdWxlLT5tb2Rfc2l6ZTsKLQl9Ci0KLQkvKiBhbGxvY2F0ZSBzY3JhdGNoIG1lbSByZWdpb25zICovCi0Jc3N0X2Jsb2NrX2FsbG9jX3NjcmF0Y2goZHNwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgaHN3X2lycShpbnQgaXJxLCB2b2lkICpjb250ZXh0KQotewotCXN0cnVjdCBzc3RfZHNwICpzc3QgPSAoc3RydWN0IHNzdF9kc3AgKikgY29udGV4dDsKLQl1MzIgaXNyOwotCWludCByZXQgPSBJUlFfTk9ORTsKLQotCXNwaW5fbG9jaygmc3N0LT5zcGlubG9jayk7Ci0KLQkvKiBJbnRlcnJ1cHQgYXJyaXZlZCwgY2hlY2sgc3JjICovCi0JaXNyID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSVNSWCk7Ci0JaWYgKGlzciAmIFNTVF9JU1JYX0RPTkUpIHsKLQkJdHJhY2Vfc3N0X2lycV9kb25lKGlzciwKLQkJCXNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgpKTsKLQotCQkvKiBNYXNrIERvbmUgaW50ZXJydXB0IGJlZm9yZSByZXR1cm4gKi8KLQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lNUlgsCi0JCQlTU1RfSU1SWF9ET05FLCBTU1RfSU1SWF9ET05FKTsKLQkJcmV0ID0gSVJRX1dBS0VfVEhSRUFEOwotCX0KLQotCWlmIChpc3IgJiBTU1RfSVNSWF9CVVNZKSB7Ci0JCXRyYWNlX3NzdF9pcnFfYnVzeShpc3IsCi0JCQlzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JTVJYKSk7Ci0KLQkJLyogTWFzayBCdXN5IGludGVycnVwdCBiZWZvcmUgcmV0dXJuICovCi0JCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLAotCQkJU1NUX0lNUlhfQlVTWSwgU1NUX0lNUlhfQlVTWSk7Ci0JCXJldCA9IElSUV9XQUtFX1RIUkVBRDsKLQl9Ci0KLQlzcGluX3VubG9jaygmc3N0LT5zcGlubG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaHN3X3NldF9kc3BfRDMoc3RydWN0IHNzdF9kc3AgKnNzdCkKLXsKLQl1MzIgdmFsOwotCXUzMiByZWc7Ci0KLQkvKiBEaXNhYmxlIGNvcmUgY2xvY2sgZ2F0aW5nIChWRFJUQ1RMMi5EQ0xDR0UgPSAwKSAqLwotCXJlZyA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKLQlyZWcgJj0gfihTU1RfVkRSVENMMl9EQ0xDR0UgfCBTU1RfVkRSVENMMl9EVENHRSk7Ci0Jd3JpdGVsKHJlZywgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOwotCi0JLyogZW5hYmxlIHBvd2VyIGdhdGluZyBhbmQgc3dpdGNoIG9mZiBEUkFNICYgSVJBTSBibG9ja3MgKi8KLQl2YWwgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMCk7Ci0JdmFsIHw9IFNTVF9WRFJUQ0wwX0RTUkFNUEdFX01BU0sgfAotCQlTU1RfVkRSVENMMF9JU1JBTVBHRV9NQVNLOwotCXZhbCAmPSB+KFNTVF9WRFJUQ0wwX0QzUEdEIHwgU1NUX1ZEUlRDTDBfRDNTUkFNUEdEKTsKLQl3cml0ZWwodmFsLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMCk7Ci0KLQkvKiBzd2l0Y2ggb2ZmIGF1ZGlvIFBMTCAqLwotCXZhbCA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKLQl2YWwgfD0gU1NUX1ZEUlRDTDJfQVBMTFNFX01BU0s7Ci0Jd3JpdGVsKHZhbCwgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOwotCi0JLyogZGlzYWJsZSBNQ0xLKGNsa2N0bC5zbW9zID0gMCkgKi8KLQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ0xLQ1RMLAotCQlTU1RfQ0xLQ1RMX01BU0ssIDApOwotCi0JLyogU2V0IEQzIHN0YXRlLCBkZWxheSA1MCB1cyAqLwotCXZhbCA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1BNQ1MpOwotCXZhbCB8PSBTU1RfUE1DU19QU19NQVNLOwotCXdyaXRlbCh2YWwsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1BNQ1MpOwotCXVkZWxheSg1MCk7Ci0KLQkvKiBFbmFibGUgY29yZSBjbG9jayBnYXRpbmcgKFZEUlRDVEwyLkRDTENHRSA9IDEpLCBkZWxheSA1MCB1cyAqLwotCXJlZyA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKLQlyZWcgfD0gU1NUX1ZEUlRDTDJfRENMQ0dFIHwgU1NUX1ZEUlRDTDJfRFRDR0U7Ci0Jd3JpdGVsKHJlZywgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOwotCi0JdWRlbGF5KDUwKTsKLQotfQotCi1zdGF0aWMgdm9pZCBoc3dfcmVzZXQoc3RydWN0IHNzdF9kc3AgKnNzdCkKLXsKLQkvKiBwdXQgRFNQIGludG8gcmVzZXQgYW5kIHN0YWxsICovCi0Jc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0NTUiwKLQkJU1NUX0NTUl9SU1QgfCBTU1RfQ1NSX1NUQUxMLAotCQlTU1RfQ1NSX1JTVCB8IFNTVF9DU1JfU1RBTEwpOwotCi0JLyoga2VlcCBpbiByZXNldCBmb3IgMTBtcyAqLwotCW1kZWxheSgxMCk7Ci0KLQkvKiB0YWtlIERTUCBvdXQgb2YgcmVzZXQgYW5kIGtlZXAgc3RhbGxlZCBmb3IgRlcgbG9hZGluZyAqLwotCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9DU1IsCi0JCVNTVF9DU1JfUlNUIHwgU1NUX0NTUl9TVEFMTCwgU1NUX0NTUl9TVEFMTCk7Ci19Ci0KLXN0YXRpYyBpbnQgaHN3X3NldF9kc3BfRDAoc3RydWN0IHNzdF9kc3AgKnNzdCkKLXsKLQlpbnQgdHJpZXMgPSAxMDsKLQl1MzIgcmVnLCBmd19kdW1wX2JpdDsKLQotCS8qIERpc2FibGUgY29yZSBjbG9jayBnYXRpbmcgKFZEUlRDVEwyLkRDTENHRSA9IDApICovCi0JcmVnID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOwotCXJlZyAmPSB+KFNTVF9WRFJUQ0wyX0RDTENHRSB8IFNTVF9WRFJUQ0wyX0RUQ0dFKTsKLQl3cml0ZWwocmVnLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7Ci0KLQkvKiBEaXNhYmxlIEQzUEcgKFZEUlRDVEwwLkQzUEdEID0gMSkgKi8KLQlyZWcgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMCk7Ci0JcmVnIHw9IFNTVF9WRFJUQ0wwX0QzUEdEOwotCXdyaXRlbChyZWcsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKLQotCS8qIFNldCBEMCBzdGF0ZSAqLwotCXJlZyA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1BNQ1MpOwotCXJlZyAmPSB+U1NUX1BNQ1NfUFNfTUFTSzsKLQl3cml0ZWwocmVnLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9QTUNTKTsKLQotCS8qIGNoZWNrIHRoYXQgQURTUCBzaGltIGlzIGVuYWJsZWQgKi8KLQl3aGlsZSAodHJpZXMtLSkgewotCQlyZWcgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9QTUNTKSAmIFNTVF9QTUNTX1BTX01BU0s7Ci0JCWlmIChyZWcgPT0gMCkKLQkJCWdvdG8gZmluaXNoOwotCi0JCW1zbGVlcCgxKTsKLQl9Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLQotZmluaXNoOgotCS8qIHNlbGVjdCBTU1AxIDE5LjJNSHogYmFzZSBjbG9jaywgU1NQIGNsb2NrIDAsIHR1cm4gb2ZmIExvdyBQb3dlciBDbG9jayAqLwotCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9DU1IsCi0JCVNTVF9DU1JfUzFJT0NTIHwgU1NUX0NTUl9TQkNTMSB8IFNTVF9DU1JfTFBDUywgMHgwKTsKLQotCS8qIHN0YWxsIERTUCBjb3JlLCBzZXQgY2xrIHRvIDE5Mi85Nk1oeiAqLwotCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsCi0JCVNTVF9DU1IsIFNTVF9DU1JfU1RBTEwgfCBTU1RfQ1NSX0RDU19NQVNLLAotCQlTU1RfQ1NSX1NUQUxMIHwgU1NUX0NTUl9EQ1MoNCkpOwotCi0JLyogU2V0IDI0TUh6IE1DTEssIHByZXZlbnQgbG9jYWwgY2xvY2sgZ2F0aW5nLCBlbmFibGUgU1NQMCBjbG9jayAqLwotCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9DTEtDVEwsCi0JCVNTVF9DTEtDVExfTUFTSyB8IFNTVF9DTEtDVExfRENQTENHIHwgU1NUX0NMS0NUTF9TQ09FMCwKLQkJU1NUX0NMS0NUTF9NQVNLIHwgU1NUX0NMS0NUTF9EQ1BMQ0cgfCBTU1RfQ0xLQ1RMX1NDT0UwKTsKLQotCS8qIFN0YWxsIGFuZCByZXNldCBjb3JlLCBzZXQgQ1NSICovCi0JaHN3X3Jlc2V0KHNzdCk7Ci0KLQkvKiBFbmFibGUgY29yZSBjbG9jayBnYXRpbmcgKFZEUlRDVEwyLkRDTENHRSA9IDEpLCBkZWxheSA1MCB1cyAqLwotCXJlZyA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKLQlyZWcgfD0gU1NUX1ZEUlRDTDJfRENMQ0dFIHwgU1NUX1ZEUlRDTDJfRFRDR0U7Ci0Jd3JpdGVsKHJlZywgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOwotCi0JdWRlbGF5KDUwKTsKLQotCS8qIHN3aXRjaCBvbiBhdWRpbyBQTEwgKi8KLQlyZWcgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7Ci0JcmVnICY9IH5TU1RfVkRSVENMMl9BUExMU0VfTUFTSzsKLQl3cml0ZWwocmVnLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7Ci0KLQkvKiBzZXQgZGVmYXVsdCBwb3dlciBnYXRpbmcgY29udHJvbCwgZW5hYmxlIHBvd2VyIGdhdGluZyBjb250cm9sIGZvciBhbGwgYmxvY2tzLiB0aGF0IGlzLAotCWNhbid0IGJlIGFjY2Vzc2VkLCBwbGVhc2UgZW5hYmxlIGVhY2ggYmxvY2sgYmVmb3JlIGFjY2Vzc2luZy4gKi8KLQlyZWcgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMCk7Ci0JcmVnIHw9IFNTVF9WRFJUQ0wwX0RTUkFNUEdFX01BU0sgfCBTU1RfVkRSVENMMF9JU1JBTVBHRV9NQVNLOwotCS8qIGZvciBEMCwgYWx3YXlzIGVuYWJsZSB0aGUgYmxvY2soRFNSQU1bMF0pIHVzZWQgZm9yIEZXIGR1bXAgKi8KLQlmd19kdW1wX2JpdCA9IDEgPDwgU1NUX1ZEUlRDTDBfRFNSQU1QR0VfU0hJRlQ7Ci0Jd3JpdGVsKHJlZyAmIH5md19kdW1wX2JpdCwgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOwotCi0KLQkvKiBkaXNhYmxlIERNQSBmaW5pc2ggZnVuY3Rpb24gZm9yIFNTUDAgJiBTU1AxICovCi0Jc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0NTUjIsIFNTVF9DU1IyX1NERkRfU1NQMSwKLQkJU1NUX0NTUjJfU0RGRF9TU1AxKTsKLQotCS8qIHNldCBvbi1kZW1vbmQgbW9kZSBvbiBlbmdpbmUgMCwxIGZvciBhbGwgY2hhbm5lbHMgKi8KLQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHMoc3N0LCBTU1RfSE1EQywKLQkJCVNTVF9ITURDX0hEREFfRTBfQUxMQ0ggfCBTU1RfSE1EQ19IRERBX0UxX0FMTENILAotCQkJU1NUX0hNRENfSEREQV9FMF9BTExDSCB8IFNTVF9ITURDX0hEREFfRTFfQUxMQ0gpOwotCi0JLyogRW5hYmxlIEludGVycnVwdCBmcm9tIGJvdGggc2lkZXMgKi8KLQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHMoc3N0LCBTU1RfSU1SWCwgKFNTVF9JTVJYX0JVU1kgfCBTU1RfSU1SWF9ET05FKSwKLQkJCQkgMHgwKTsKLQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHMoc3N0LCBTU1RfSU1SRCwgKFNTVF9JTVJEX0RPTkUgfCBTU1RfSU1SRF9CVVNZIHwKLQkJCQlTU1RfSU1SRF9TU1AwIHwgU1NUX0lNUkRfRE1BQyksIDB4MCk7Ci0KLQkvKiBjbGVhciBJUEMgcmVnaXN0ZXJzICovCi0Jc3N0X2RzcF9zaGltX3dyaXRlKHNzdCwgU1NUX0lQQ1gsIDB4MCk7Ci0Jc3N0X2RzcF9zaGltX3dyaXRlKHNzdCwgU1NUX0lQQ0QsIDB4MCk7Ci0Jc3N0X2RzcF9zaGltX3dyaXRlKHNzdCwgMHg4MCwgMHg2KTsKLQlzc3RfZHNwX3NoaW1fd3JpdGUoc3N0LCAweGUwLCAweDMwMGEpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhzd19ib290KHN0cnVjdCBzc3RfZHNwICpzc3QpCi17Ci0JLyogc2V0IG9wb3J0dW5pc3RpYyBtb2RlIG9uIGVuZ2luZSAwLDEgZm9yIGFsbCBjaGFubmVscyAqLwotCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0cyhzc3QsIFNTVF9ITURDLAotCQkJU1NUX0hNRENfSEREQV9FMF9BTExDSCB8IFNTVF9ITURDX0hEREFfRTFfQUxMQ0gsIDApOwotCi0JLyogc2V0IERTUCB0byBSVU4gKi8KLQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHNfdW5sb2NrZWQoc3N0LCBTU1RfQ1NSLCBTU1RfQ1NSX1NUQUxMLCAweDApOwotfQotCi1zdGF0aWMgdm9pZCBoc3dfc3RhbGwoc3RydWN0IHNzdF9kc3AgKnNzdCkKLXsKLQkvKiBzdGFsbCBEU1AgKi8KLQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHMoc3N0LCBTU1RfQ1NSLAotCQlTU1RfQ1NSXzI0TUhaX0xQQ1MgfCBTU1RfQ1NSX1NUQUxMLAotCQlTU1RfQ1NSX1NUQUxMIHwgU1NUX0NTUl8yNE1IWl9MUENTKTsKLX0KLQotc3RhdGljIHZvaWQgaHN3X3NsZWVwKHN0cnVjdCBzc3RfZHNwICpzc3QpCi17Ci0JZGV2X2RiZyhzc3QtPmRldiwgIkhTV19QTSBkc3AgcnVudGltZSBzdXNwZW5kXG4iKTsKLQotCS8qIHB1dCBEU1AgaW50byByZXNldCBhbmQgc3RhbGwgKi8KLQlzc3RfZHNwX3NoaW1fdXBkYXRlX2JpdHMoc3N0LCBTU1RfQ1NSLAotCQlTU1RfQ1NSXzI0TUhaX0xQQ1MgfCBTU1RfQ1NSX1JTVCB8IFNTVF9DU1JfU1RBTEwsCi0JCVNTVF9DU1JfUlNUIHwgU1NUX0NTUl9TVEFMTCB8IFNTVF9DU1JfMjRNSFpfTFBDUyk7Ci0KLQloc3dfc2V0X2RzcF9EMyhzc3QpOwotCWRldl9kYmcoc3N0LT5kZXYsICJIU1dfUE0gZHNwIHJ1bnRpbWUgc3VzcGVuZCBleGl0XG4iKTsKLX0KLQotc3RhdGljIGludCBoc3dfd2FrZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQotewotCWludCByZXQ7Ci0KLQlkZXZfZGJnKHNzdC0+ZGV2LCAiSFNXX1BNIGRzcCBydW50aW1lIHJlc3VtZVxuIik7Ci0KLQlyZXQgPSBoc3dfc2V0X2RzcF9EMChzc3QpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JZGV2X2RiZyhzc3QtPmRldiwgIkhTV19QTSBkc3AgcnVudGltZSByZXN1bWUgZXhpdFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IHNzdF9hZHNwX21lbXJlZ2lvbiB7Ci0JdTMyIHN0YXJ0OwotCXUzMiBlbmQ7Ci0JaW50IGJsb2NrczsKLQllbnVtIHNzdF9tZW1fdHlwZSB0eXBlOwotfTsKLQotLyogbHlueCBwb2ludCBBRFNQIG1lbSByZWdpb25zICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNzdF9hZHNwX21lbXJlZ2lvbiBscF9yZWdpb25bXSA9IHsKLQl7MHgwMDAwMCwgMHg0MDAwMCwgOCwgU1NUX01FTV9EUkFNfSwgLyogRC1TUkFNMCAtIDggKiAzMmtCICovCi0JezB4NDAwMDAsIDB4ODAwMDAsIDgsIFNTVF9NRU1fRFJBTX0sIC8qIEQtU1JBTTEgLSA4ICogMzJrQiAqLwotCXsweDgwMDAwLCAweEUwMDAwLCAxMiwgU1NUX01FTV9JUkFNfSwgLyogSS1TUkFNIC0gMTIgKiAzMmtCICovCi19OwotCi0vKiB3aWxkIGNhdCBwb2ludCBBRFNQIG1lbSByZWdpb25zICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNzdF9hZHNwX21lbXJlZ2lvbiB3cHRfcmVnaW9uW10gPSB7Ci0JezB4MDAwMDAsIDB4QTAwMDAsIDIwLCBTU1RfTUVNX0RSQU19LCAvKiBELVNSQU0wLEQtU1JBTTEsRC1TUkFNMiAtIDIwICogMzJrQiAqLwotCXsweEEwMDAwLCAweEYwMDAwLCAxMCwgU1NUX01FTV9JUkFNfSwgLyogSS1TUkFNIC0gMTAgKiAzMmtCICovCi19OwotCi1zdGF0aWMgaW50IGhzd19hY3BpX3Jlc291cmNlX21hcChzdHJ1Y3Qgc3N0X2RzcCAqc3N0LCBzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSkKLXsKLQkvKiBBRFNQIERSQU0gJiBJUkFNICovCi0Jc3N0LT5hZGRyLmxwZV9iYXNlID0gcGRhdGEtPmxwZV9iYXNlOwotCXNzdC0+YWRkci5scGUgPSBpb3JlbWFwKHBkYXRhLT5scGVfYmFzZSwgcGRhdGEtPmxwZV9zaXplKTsKLQlpZiAoIXNzdC0+YWRkci5scGUpCi0JCXJldHVybiAtRU5PREVWOwotCi0JLyogQURTUCBQQ0kgTU1JTyBjb25maWcgc3BhY2UgKi8KLQlzc3QtPmFkZHIucGNpX2NmZyA9IGlvcmVtYXAocGRhdGEtPnBjaWNmZ19iYXNlLCBwZGF0YS0+cGNpY2ZnX3NpemUpOwotCWlmICghc3N0LT5hZGRyLnBjaV9jZmcpIHsKLQkJaW91bm1hcChzc3QtPmFkZHIubHBlKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JLyogU1NUIFNoaW0gKi8KLQlzc3QtPmFkZHIuc2hpbSA9IHNzdC0+YWRkci5scGUgKyBzc3QtPmFkZHIuc2hpbV9vZmZzZXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0cnVjdCBzc3Rfc3JhbV9zaGlmdCB7Ci0JdTMyIGRldl9pZDsJLyogU1NUIERldmljZSBJRHMgICovCi0JdTMyIGlyYW1fc2hpZnQ7Ci0JdTMyIGRyYW1fc2hpZnQ7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNzdF9zcmFtX3NoaWZ0IHNyYW1fc2hpZnRbXSA9IHsKLQl7U1NUX0RFVl9JRF9MWU5YX1BPSU5ULCA2LCAxNn0sIC8qIGxwICovCi0Je1NTVF9ERVZfSURfV0lMRENBVF9QT0lOVCwgMiwgMTJ9LCAvKiB3cHQgKi8KLX07Ci0KLXN0YXRpYyB1MzIgaHN3X2Jsb2NrX2dldF9iaXQoc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrKQotewotCXUzMiBiaXQgPSAwLCBzaGlmdCA9IDAsIGluZGV4OwotCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBibG9jay0+ZHNwOwotCi0JZm9yIChpbmRleCA9IDA7IGluZGV4IDwgQVJSQVlfU0laRShzcmFtX3NoaWZ0KTsgaW5kZXgrKykgewotCQlpZiAoc3JhbV9zaGlmdFtpbmRleF0uZGV2X2lkID09IHNzdC0+aWQpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaW5kZXggPCBBUlJBWV9TSVpFKHNyYW1fc2hpZnQpKSB7Ci0JCXN3aXRjaCAoYmxvY2stPnR5cGUpIHsKLQkJY2FzZSBTU1RfTUVNX0RSQU06Ci0JCQlzaGlmdCA9IHNyYW1fc2hpZnRbaW5kZXhdLmRyYW1fc2hpZnQ7Ci0JCQlicmVhazsKLQkJY2FzZSBTU1RfTUVNX0lSQU06Ci0JCQlzaGlmdCA9IHNyYW1fc2hpZnRbaW5kZXhdLmlyYW1fc2hpZnQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXNoaWZ0ID0gMDsKLQkJfQotCX0gZWxzZQotCQlzaGlmdCA9IDA7Ci0KLQliaXQgPSAxIDw8IChibG9jay0+aW5kZXggKyBzaGlmdCk7Ci0KLQlyZXR1cm4gYml0OwotfQotCi0vKmR1bW15IHJlYWQgYSBTUkFNIGJsb2NrLiovCi1zdGF0aWMgdm9pZCBzc3RfbWVtX2Jsb2NrX2R1bW15X3JlYWQoc3RydWN0IHNzdF9tZW1fYmxvY2sgKmJsb2NrKQotewotCXUzMiBzaXplOwotCXU4IHRtcF9idWZbNF07Ci0Jc3RydWN0IHNzdF9kc3AgKnNzdCA9IGJsb2NrLT5kc3A7Ci0KLQlzaXplID0gYmxvY2stPnNpemUgPiA0ID8gNCA6IGJsb2NrLT5zaXplOwotCW1lbWNweV9mcm9taW8odG1wX2J1Ziwgc3N0LT5hZGRyLmxwZSArIGJsb2NrLT5vZmZzZXQsIHNpemUpOwotfQotCi0vKiBlbmFibGUgMzJrQiBtZW1vcnkgYmxvY2sgLSBsb2NrcyBoZWxkIGJ5IGNhbGxlciAqLwotc3RhdGljIGludCBoc3dfYmxvY2tfZW5hYmxlKHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaykKLXsKLQlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gYmxvY2stPmRzcDsKLQl1MzIgYml0LCB2YWw7Ci0KLQlpZiAoYmxvY2stPnVzZXJzKysgPiAwKQotCQlyZXR1cm4gMDsKLQotCWRldl9kYmcoYmxvY2stPmRzcC0+ZGV2LCAiIGVuYWJsZWQgYmxvY2sgJWQ6JWQgYXQgb2Zmc2V0IDB4JXhcbiIsCi0JCWJsb2NrLT50eXBlLCBibG9jay0+aW5kZXgsIGJsb2NrLT5vZmZzZXQpOwotCi0JLyogRGlzYWJsZSBjb3JlIGNsb2NrIGdhdGluZyAoVkRSVENUTDIuRENMQ0dFID0gMCkgKi8KLQl2YWwgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7Ci0JdmFsICY9IH5TU1RfVkRSVENMMl9EQ0xDR0U7Ci0Jd3JpdGVsKHZhbCwgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOwotCi0JdmFsID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOwotCWJpdCA9IGhzd19ibG9ja19nZXRfYml0KGJsb2NrKTsKLQl3cml0ZWwodmFsICYgfmJpdCwgc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOwotCi0JLyogd2FpdCAxOCBEU1AgY2xvY2sgdGlja3MgKi8KLQl1ZGVsYXkoMTApOwotCi0JLyogRW5hYmxlIGNvcmUgY2xvY2sgZ2F0aW5nIChWRFJUQ1RMMi5EQ0xDR0UgPSAxKSwgZGVsYXkgNTAgdXMgKi8KLQl2YWwgPSByZWFkbChzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7Ci0JdmFsIHw9IFNTVF9WRFJUQ0wyX0RDTENHRTsKLQl3cml0ZWwodmFsLCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMik7Ci0KLQl1ZGVsYXkoNTApOwotCi0JLyphZGQgYSBkdW1teSByZWFkIGJlZm9yZSB0aGUgU1JBTSBibG9jayBpcyB3cml0dGVuLCBvdGhlcndpc2UgdGhlIHdyaXRpbmcgbWF5IG1pc3MgYnl0ZXMgc29tZXRpbWVzLiovCi0Jc3N0X21lbV9ibG9ja19kdW1teV9yZWFkKGJsb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogZGlzYWJsZSAzMmtCIG1lbW9yeSBibG9jayAtIGxvY2tzIGhlbGQgYnkgY2FsbGVyICovCi1zdGF0aWMgaW50IGhzd19ibG9ja19kaXNhYmxlKHN0cnVjdCBzc3RfbWVtX2Jsb2NrICpibG9jaykKLXsKLQlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gYmxvY2stPmRzcDsKLQl1MzIgYml0LCB2YWw7Ci0KLQlpZiAoLS1ibG9jay0+dXNlcnMgPiAwKQotCQlyZXR1cm4gMDsKLQotCWRldl9kYmcoYmxvY2stPmRzcC0+ZGV2LCAiIGRpc2FibGVkIGJsb2NrICVkOiVkIGF0IG9mZnNldCAweCV4XG4iLAotCQlibG9jay0+dHlwZSwgYmxvY2stPmluZGV4LCBibG9jay0+b2Zmc2V0KTsKLQotCS8qIERpc2FibGUgY29yZSBjbG9jayBnYXRpbmcgKFZEUlRDVEwyLkRDTENHRSA9IDApICovCi0JdmFsID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDIpOwotCXZhbCAmPSB+U1NUX1ZEUlRDTDJfRENMQ0dFOwotCXdyaXRlbCh2YWwsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKLQotCi0JdmFsID0gcmVhZGwoc3N0LT5hZGRyLnBjaV9jZmcgKyBTU1RfVkRSVENUTDApOwotCWJpdCA9IGhzd19ibG9ja19nZXRfYml0KGJsb2NrKTsKLQkvKiBkb24ndCBkaXNhYmxlIERTUkFNWzBdLCBrZWVwIGl0IGFsd2F5cyBlbmFibGUgZm9yIEZXIGR1bXAqLwotCWlmIChiaXQgIT0gKDEgPDwgU1NUX1ZEUlRDTDBfRFNSQU1QR0VfU0hJRlQpKQotCQl3cml0ZWwodmFsIHwgYml0LCBzc3QtPmFkZHIucGNpX2NmZyArIFNTVF9WRFJUQ1RMMCk7Ci0KLQkvKiB3YWl0IDE4IERTUCBjbG9jayB0aWNrcyAqLwotCXVkZWxheSgxMCk7Ci0KLQkvKiBFbmFibGUgY29yZSBjbG9jayBnYXRpbmcgKFZEUlRDVEwyLkRDTENHRSA9IDEpLCBkZWxheSA1MCB1cyAqLwotCXZhbCA9IHJlYWRsKHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKLQl2YWwgfD0gU1NUX1ZEUlRDTDJfRENMQ0dFOwotCXdyaXRlbCh2YWwsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwyKTsKLQotCXVkZWxheSg1MCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzc3RfYmxvY2tfb3BzIHNzdF9oc3dfb3BzID0gewotCS5lbmFibGUgPSBoc3dfYmxvY2tfZW5hYmxlLAotCS5kaXNhYmxlID0gaHN3X2Jsb2NrX2Rpc2FibGUsCi19OwotCi1zdGF0aWMgaW50IGhzd19pbml0KHN0cnVjdCBzc3RfZHNwICpzc3QsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQotewotCWNvbnN0IHN0cnVjdCBzc3RfYWRzcF9tZW1yZWdpb24gKnJlZ2lvbjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IHJldCA9IC1FTk9ERVYsIGksIGosIHJlZ2lvbl9jb3VudDsKLQl1MzIgb2Zmc2V0LCBzaXplLCBmd19kdW1wX2JpdDsKLQotCWRldiA9IHNzdC0+ZG1hX2RldjsKLQotCXN3aXRjaCAoc3N0LT5pZCkgewotCWNhc2UgU1NUX0RFVl9JRF9MWU5YX1BPSU5UOgotCQlyZWdpb24gPSBscF9yZWdpb247Ci0JCXJlZ2lvbl9jb3VudCA9IEFSUkFZX1NJWkUobHBfcmVnaW9uKTsKLQkJc3N0LT5hZGRyLmlyYW1fb2Zmc2V0ID0gU1NUX0xQX0lSQU1fT0ZGU0VUOwotCQlzc3QtPmFkZHIuZHNwX2lyYW1fb2Zmc2V0ID0gU1NUX0xQVF9EU1BfSVJBTV9PRkZTRVQ7Ci0JCXNzdC0+YWRkci5kc3BfZHJhbV9vZmZzZXQgPSBTU1RfTFBUX0RTUF9EUkFNX09GRlNFVDsKLQkJc3N0LT5hZGRyLnNoaW1fb2Zmc2V0ID0gU1NUX0xQX1NISU1fT0ZGU0VUOwotCQlicmVhazsKLQljYXNlIFNTVF9ERVZfSURfV0lMRENBVF9QT0lOVDoKLQkJcmVnaW9uID0gd3B0X3JlZ2lvbjsKLQkJcmVnaW9uX2NvdW50ID0gQVJSQVlfU0laRSh3cHRfcmVnaW9uKTsKLQkJc3N0LT5hZGRyLmlyYW1fb2Zmc2V0ID0gU1NUX1dQVF9JUkFNX09GRlNFVDsKLQkJc3N0LT5hZGRyLmRzcF9pcmFtX29mZnNldCA9IFNTVF9XUFRfRFNQX0lSQU1fT0ZGU0VUOwotCQlzc3QtPmFkZHIuZHNwX2RyYW1fb2Zmc2V0ID0gU1NUX1dQVF9EU1BfRFJBTV9PRkZTRVQ7Ci0JCXNzdC0+YWRkci5zaGltX29mZnNldCA9IFNTVF9XUFRfU0hJTV9PRkZTRVQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBnZXQgbWVtIHJlc291cmNlc1xuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gaHN3X2FjcGlfcmVzb3VyY2VfbWFwKHNzdCwgcGRhdGEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBtYXAgcmVzb3VyY2VzXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBlbmFibGUgdGhlIERTUCBTSElNICovCi0JcmV0ID0gaHN3X3NldF9kc3BfRDAoc3N0KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgImVycm9yOiBmYWlsZWQgdG8gc2V0IERTUCBEMCBhbmQgcmVzZXQgU0hJTVxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudChkZXYsIERNQV9CSVRfTUFTSygzMSkpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQotCS8qIHJlZ2lzdGVyIERTUCBtZW1vcnkgYmxvY2tzIC0gaWRlYWxseSB3ZSBzaG91bGQgZ2V0IHRoaXMgZnJvbSBBQ1BJICovCi0JZm9yIChpID0gMDsgaSA8IHJlZ2lvbl9jb3VudDsgaSsrKSB7Ci0JCW9mZnNldCA9IHJlZ2lvbltpXS5zdGFydDsKLQkJc2l6ZSA9IChyZWdpb25baV0uZW5kIC0gcmVnaW9uW2ldLnN0YXJ0KSAvIHJlZ2lvbltpXS5ibG9ja3M7Ci0KLQkJLyogcmVnaXN0ZXIgaW5kaXZpZHVhbCBtZW1vcnkgYmxvY2tzICovCi0JCWZvciAoaiA9IDA7IGogPCByZWdpb25baV0uYmxvY2tzOyBqKyspIHsKLQkJCXNzdF9tZW1fYmxvY2tfcmVnaXN0ZXIoc3N0LCBvZmZzZXQsIHNpemUsCi0JCQkJcmVnaW9uW2ldLnR5cGUsICZzc3RfaHN3X29wcywgaiwgc3N0KTsKLQkJCW9mZnNldCArPSBzaXplOwotCQl9Ci0JfQotCi0JLyogYWx3YXlzIGVuYWJsZSB0aGUgYmxvY2soRFNSQU1bMF0pIHVzZWQgZm9yIEZXIGR1bXAgKi8KLQlmd19kdW1wX2JpdCA9IDEgPDwgU1NUX1ZEUlRDTDBfRFNSQU1QR0VfU0hJRlQ7Ci0JLyogc2V0IGRlZmF1bHQgcG93ZXIgZ2F0aW5nIGNvbnRyb2wsIGVuYWJsZSBwb3dlciBnYXRpbmcgY29udHJvbCBmb3IgYWxsIGJsb2Nrcy4gdGhhdCBpcywKLQljYW4ndCBiZSBhY2Nlc3NlZCwgcGxlYXNlIGVuYWJsZSBlYWNoIGJsb2NrIGJlZm9yZSBhY2Nlc3NpbmcuICovCi0Jd3JpdGVsKDB4ZmZmZmZmZmYgJiB+ZndfZHVtcF9iaXQsIHNzdC0+YWRkci5wY2lfY2ZnICsgU1NUX1ZEUlRDVEwwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBoc3dfZnJlZShzdHJ1Y3Qgc3N0X2RzcCAqc3N0KQotewotCXNzdF9tZW1fYmxvY2tfdW5yZWdpc3Rlcl9hbGwoc3N0KTsKLQlpb3VubWFwKHNzdC0+YWRkci5scGUpOwotCWlvdW5tYXAoc3N0LT5hZGRyLnBjaV9jZmcpOwotfQotCi1zdHJ1Y3Qgc3N0X29wcyBoYXN3ZWxsX29wcyA9IHsKLQkucmVzZXQgPSBoc3dfcmVzZXQsCi0JLmJvb3QgPSBoc3dfYm9vdCwKLQkuc3RhbGwgPSBoc3dfc3RhbGwsCi0JLndha2UgPSBoc3dfd2FrZSwKLQkuc2xlZXAgPSBoc3dfc2xlZXAsCi0JLndyaXRlID0gc3N0X3NoaW0zMl93cml0ZSwKLQkucmVhZCA9IHNzdF9zaGltMzJfcmVhZCwKLQkud3JpdGU2NCA9IHNzdF9zaGltMzJfd3JpdGU2NCwKLQkucmVhZDY0ID0gc3N0X3NoaW0zMl9yZWFkNjQsCi0JLnJhbV9yZWFkID0gc3N0X21lbWNweV9mcm9taW9fMzIsCi0JLnJhbV93cml0ZSA9IHNzdF9tZW1jcHlfdG9pb18zMiwKLQkuaXJxX2hhbmRsZXIgPSBoc3dfaXJxLAotCS5pbml0ID0gaHN3X2luaXQsCi0JLmZyZWUgPSBoc3dfZnJlZSwKLQkucGFyc2VfZncgPSBoc3dfcGFyc2VfZndfaW1hZ2UsCi19OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLWlwYy5jIGIvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLWlwYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTRhZjU2Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1pcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMDAgKzAsMCBAQAotLyoKLSAqICBJbnRlbCBTU1QgSGFzd2VsbC9Ccm9hZHdlbGwgSVBDIFN1cHBvcnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPHNvdW5kL2Fzb3VuZC5oPgotCi0jaW5jbHVkZSAic3N0LWhhc3dlbGwtaXBjLmgiCi0jaW5jbHVkZSAic3N0LWRzcC5oIgotI2luY2x1ZGUgInNzdC1kc3AtcHJpdi5oIgotCi0vKiBHbG9iYWwgTWVzc2FnZSAtIEdlbmVyaWMgKi8KLSNkZWZpbmUgSVBDX0dMQl9UWVBFX1NISUZUCTI0Ci0jZGVmaW5lIElQQ19HTEJfVFlQRV9NQVNLCSgweDFmIDw8IElQQ19HTEJfVFlQRV9TSElGVCkKLSNkZWZpbmUgSVBDX0dMQl9UWVBFKHgpCQkoeCA8PCBJUENfR0xCX1RZUEVfU0hJRlQpCi0KLS8qIEdsb2JhbCBNZXNzYWdlIC0gUmVwbHkgKi8KLSNkZWZpbmUgSVBDX0dMQl9SRVBMWV9TSElGVAkwCi0jZGVmaW5lIElQQ19HTEJfUkVQTFlfTUFTSwkoMHgxZiA8PCBJUENfR0xCX1JFUExZX1NISUZUKQotI2RlZmluZSBJUENfR0xCX1JFUExZX1RZUEUoeCkJKHggPDwgSVBDX0dMQl9SRVBMWV9UWVBFX1NISUZUKQotCi0vKiBTdHJlYW0gTWVzc2FnZSAtIEdlbmVyaWMgKi8KLSNkZWZpbmUgSVBDX1NUUl9UWVBFX1NISUZUCTIwCi0jZGVmaW5lIElQQ19TVFJfVFlQRV9NQVNLCSgweGYgPDwgSVBDX1NUUl9UWVBFX1NISUZUKQotI2RlZmluZSBJUENfU1RSX1RZUEUoeCkJCSh4IDw8IElQQ19TVFJfVFlQRV9TSElGVCkKLSNkZWZpbmUgSVBDX1NUUl9JRF9TSElGVAkxNgotI2RlZmluZSBJUENfU1RSX0lEX01BU0sJCSgweGYgPDwgSVBDX1NUUl9JRF9TSElGVCkKLSNkZWZpbmUgSVBDX1NUUl9JRCh4KQkJKHggPDwgSVBDX1NUUl9JRF9TSElGVCkKLQotLyogU3RyZWFtIE1lc3NhZ2UgLSBSZXBseSAqLwotI2RlZmluZSBJUENfU1RSX1JFUExZX1NISUZUCTAKLSNkZWZpbmUgSVBDX1NUUl9SRVBMWV9NQVNLCSgweDFmIDw8IElQQ19TVFJfUkVQTFlfU0hJRlQpCi0KLS8qIFN0cmVhbSBTdGFnZSBNZXNzYWdlIC0gR2VuZXJpYyAqLwotI2RlZmluZSBJUENfU1RHX1RZUEVfU0hJRlQJMTIKLSNkZWZpbmUgSVBDX1NUR19UWVBFX01BU0sJKDB4ZiA8PCBJUENfU1RHX1RZUEVfU0hJRlQpCi0jZGVmaW5lIElQQ19TVEdfVFlQRSh4KQkJKHggPDwgSVBDX1NUR19UWVBFX1NISUZUKQotI2RlZmluZSBJUENfU1RHX0lEX1NISUZUCTEwCi0jZGVmaW5lIElQQ19TVEdfSURfTUFTSwkJKDB4MyA8PCBJUENfU1RHX0lEX1NISUZUKQotI2RlZmluZSBJUENfU1RHX0lEKHgpCQkoeCA8PCBJUENfU1RHX0lEX1NISUZUKQotCi0vKiBTdHJlYW0gU3RhZ2UgTWVzc2FnZSAtIFJlcGx5ICovCi0jZGVmaW5lIElQQ19TVEdfUkVQTFlfU0hJRlQJMAotI2RlZmluZSBJUENfU1RHX1JFUExZX01BU0sJKDB4MWYgPDwgSVBDX1NUR19SRVBMWV9TSElGVCkKLQotLyogRGVidWcgTG9nIE1lc3NhZ2UgLSBHZW5lcmljICovCi0jZGVmaW5lIElQQ19MT0dfT1BfU0hJRlQJMjAKLSNkZWZpbmUgSVBDX0xPR19PUF9NQVNLCQkoMHhmIDw8IElQQ19MT0dfT1BfU0hJRlQpCi0jZGVmaW5lIElQQ19MT0dfT1BfVFlQRSh4KQkoeCA8PCBJUENfTE9HX09QX1NISUZUKQotI2RlZmluZSBJUENfTE9HX0lEX1NISUZUCTE2Ci0jZGVmaW5lIElQQ19MT0dfSURfTUFTSwkJKDB4ZiA8PCBJUENfTE9HX0lEX1NISUZUKQotI2RlZmluZSBJUENfTE9HX0lEKHgpCQkoeCA8PCBJUENfTE9HX0lEX1NISUZUKQotCi0vKiBJUEMgbWVzc2FnZSB0aW1lb3V0IChtc2VjcykgKi8KLSNkZWZpbmUgSVBDX1RJTUVPVVRfTVNFQ1MJMzAwCi0jZGVmaW5lIElQQ19CT09UX01TRUNTCQkyMDAKLSNkZWZpbmUgSVBDX01TR19XQUlUCQkwCi0jZGVmaW5lIElQQ19NU0dfTk9XQUlUCQkxCi0KLS8qIEZpcm13YXJlIFJlYWR5IE1lc3NhZ2UgKi8KLSNkZWZpbmUgSVBDX0ZXX1JFQURZCQkoMHgxIDw8IDI5KQotI2RlZmluZSBJUENfU1RBVFVTX01BU0sJCSgweDMgPDwgMzApCi0KLSNkZWZpbmUgSVBDX0VNUFRZX0xJU1RfU0laRQk4Ci0jZGVmaW5lIElQQ19NQVhfU1RSRUFNUwkJNAotCi0vKiBNYWlsYm94ICovCi0jZGVmaW5lIElQQ19NQVhfTUFJTEJPWF9CWVRFUwkyNTYKLQotI2RlZmluZSBJTlZBTElEX1NUUkVBTV9IV19JRAkweGZmZmZmZmZmCi0KLS8qIEdsb2JhbCBNZXNzYWdlIC0gVHlwZXMgYW5kIFJlcGxpZXMgKi8KLWVudW0gaXBjX2dsYl90eXBlIHsKLQlJUENfR0xCX0dFVF9GV19WRVJTSU9OID0gMCwJCS8qIFJldHJpZXZlcyBmaXJtd2FyZSB2ZXJzaW9uICovCi0JSVBDX0dMQl9QRVJGT1JNQU5DRV9NT05JVE9SID0gMSwJLyogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBhY3Rpb25zICovCi0JSVBDX0dMQl9BTExPQ0FURV9TVFJFQU0gPSAzLAkJLyogUmVxdWVzdCB0byBhbGxvY2F0ZSBuZXcgc3RyZWFtICovCi0JSVBDX0dMQl9GUkVFX1NUUkVBTSA9IDQsCQkvKiBSZXF1ZXN0IHRvIGZyZWUgc3RyZWFtICovCi0JSVBDX0dMQl9HRVRfRldfQ0FQQUJJTElUSUVTID0gNSwJLyogUmV0cmlldmVzIGZpcm13YXJlIGNhcGFiaWxpdGllcyAqLwotCUlQQ19HTEJfU1RSRUFNX01FU1NBR0UgPSA2LAkJLyogTWVzc2FnZSBkaXJlY3RlZCB0byBzdHJlYW0gb3IgaXRzIHN0YWdlcyAqLwotCS8qIFJlcXVlc3QgdG8gc3RvcmUgZmlybXdhcmUgY29udGV4dCBkdXJpbmcgRDAtPkQzIHRyYW5zaXRpb24gKi8KLQlJUENfR0xCX1JFUVVFU1RfRFVNUCA9IDcsCi0JLyogUmVxdWVzdCB0byByZXN0b3JlIGZpcm13YXJlIGNvbnRleHQgZHVyaW5nIEQzLT5EMCB0cmFuc2l0aW9uICovCi0JSVBDX0dMQl9SRVNUT1JFX0NPTlRFWFQgPSA4LAotCUlQQ19HTEJfR0VUX0RFVklDRV9GT1JNQVRTID0gOSwJCS8qIFNldCBkZXZpY2UgZm9ybWF0ICovCi0JSVBDX0dMQl9TRVRfREVWSUNFX0ZPUk1BVFMgPSAxMCwJLyogR2V0IGRldmljZSBmb3JtYXQgKi8KLQlJUENfR0xCX1NIT1JUX1JFUExZID0gMTEsCi0JSVBDX0dMQl9FTlRFUl9EWF9TVEFURSA9IDEyLAotCUlQQ19HTEJfR0VUX01JWEVSX1NUUkVBTV9JTkZPID0gMTMsCS8qIFJlcXVlc3QgbWl4ZXIgc3RyZWFtIHBhcmFtcyAqLwotCUlQQ19HTEJfREVCVUdfTE9HX01FU1NBR0UgPSAxNCwJCS8qIE1lc3NhZ2UgdG8gb3IgZnJvbSB0aGUgZGVidWcgbG9nZ2VyLiAqLwotCUlQQ19HTEJfUkVRVUVTVF9UUkFOU0ZFUiA9IDE2LCAJCS8qIDwgUmVxdWVzdCBUcmFuc2ZlciBmb3IgaG9zdCAqLwotCUlQQ19HTEJfTUFYX0lQQ19NRVNTQUdFX1RZUEUgPSAxNywJLyogTWF4aW11bSBtZXNzYWdlIG51bWJlciAqLwotfTsKLQotZW51bSBpcGNfZ2xiX3JlcGx5IHsKLQlJUENfR0xCX1JFUExZX1NVQ0NFU1MgPSAwLAkJLyogVGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4gKi8KLQlJUENfR0xCX1JFUExZX0VSUk9SX0lOVkFMSURfUEFSQU0gPSAxLAkvKiBJbnZhbGlkIHBhcmFtZXRlciB3YXMgcGFzc2VkLiAqLwotCUlQQ19HTEJfUkVQTFlfVU5LTk9XTl9NRVNTQUdFX1RZUEUgPSAyLAkvKiBVa25vd24gbWVzc2FnZSB0eXBlIHdhcyByZXNjZWl2ZWQuICovCi0JSVBDX0dMQl9SRVBMWV9PVVRfT0ZfUkVTT1VSQ0VTID0gMywJLyogTm8gcmVzb3VyY2VzIHRvIHNhdGlzZnkgdGhlIHJlcXVlc3QuICovCi0JSVBDX0dMQl9SRVBMWV9CVVNZID0gNCwJCQkvKiBUaGUgc3lzdGVtIG9yIHJlc291cmNlIGlzIGJ1c3kuICovCi0JSVBDX0dMQl9SRVBMWV9QRU5ESU5HID0gNSwJCS8qIFRoZSBhY3Rpb24gd2FzIHNjaGVkdWxlZCBmb3IgcHJvY2Vzc2luZy4gICovCi0JSVBDX0dMQl9SRVBMWV9GQUlMVVJFID0gNiwJCS8qIENyaXRpY2FsIGVycm9yIGhhcHBlbmVkLiAqLwotCUlQQ19HTEJfUkVQTFlfSU5WQUxJRF9SRVFVRVNUID0gNywJLyogUmVxdWVzdCBjYW4gbm90IGJlIGNvbXBsZXRlZC4gKi8KLQlJUENfR0xCX1JFUExZX1NUQUdFX1VOSU5JVElBTElaRUQgPSA4LAkvKiBQcm9jZXNzaW5nIHN0YWdlIHdhcyB1bmluaXRpYWxpemVkLiAqLwotCUlQQ19HTEJfUkVQTFlfTk9UX0ZPVU5EID0gOSwJCS8qIFJlcXVpcmVkIHJlc291cmNlIGNhbiBub3QgYmUgZm91bmQuICovCi0JSVBDX0dMQl9SRVBMWV9TT1VSQ0VfTk9UX1NUQVJURUQgPSAxMCwJLyogU291cmNlIHdhcyBub3Qgc3RhcnRlZC4gKi8KLX07Ci0KLS8qIFN0cmVhbSBNZXNzYWdlIC0gVHlwZXMgKi8KLWVudW0gaXBjX3N0cl9vcGVyYXRpb24gewotCUlQQ19TVFJfUkVTRVQgPSAwLAotCUlQQ19TVFJfUEFVU0UgPSAxLAotCUlQQ19TVFJfUkVTVU1FID0gMiwKLQlJUENfU1RSX1NUQUdFX01FU1NBR0UgPSAzLAotCUlQQ19TVFJfTk9USUZJQ0FUSU9OID0gNCwKLQlJUENfU1RSX01BWF9NRVNTQUdFCi19OwotCi0vKiBTdHJlYW0gU3RhZ2UgTWVzc2FnZSBUeXBlcyAqLwotZW51bSBpcGNfc3RnX29wZXJhdGlvbiB7Ci0JSVBDX1NUR19HRVRfVk9MVU1FID0gMCwKLQlJUENfU1RHX1NFVF9WT0xVTUUsCi0JSVBDX1NUR19TRVRfV1JJVEVfUE9TSVRJT04sCi0JSVBDX1NUR19TRVRfRlhfRU5BQkxFLAotCUlQQ19TVEdfU0VUX0ZYX0RJU0FCTEUsCi0JSVBDX1NUR19TRVRfRlhfR0VUX1BBUkFNLAotCUlQQ19TVEdfU0VUX0ZYX1NFVF9QQVJBTSwKLQlJUENfU1RHX1NFVF9GWF9HRVRfSU5GTywKLQlJUENfU1RHX01VVEVfTE9PUEJBQ0ssCi0JSVBDX1NUR19NQVhfTUVTU0FHRQotfTsKLQotLyogU3RyZWFtIFN0YWdlIE1lc3NhZ2UgVHlwZXMgRm9yIE5vdGlmaWNhdGlvbiovCi1lbnVtIGlwY19zdGdfb3BlcmF0aW9uX25vdGlmeSB7Ci0JSVBDX1BPU0lUSU9OX0NIQU5HRUQgPSAwLAotCUlQQ19TVEdfR0xJVENILAotCUlQQ19TVEdfTUFYX05PVElGWQotfTsKLQotZW51bSBpcGNfZ2xpdGNoX3R5cGUgewotCUlQQ19HTElUQ0hfVU5ERVJSVU4gPSAxLAotCUlQQ19HTElUQ0hfREVDT0RFUl9FUlJPUiwKLQlJUENfR0xJVENIX0RPVUJMRURfV1JJVEVfUE9TLAotCUlQQ19HTElUQ0hfTUFYCi19OwotCi0vKiBEZWJ1ZyBDb250cm9sICovCi1lbnVtIGlwY19kZWJ1Z19vcGVyYXRpb24gewotCUlQQ19ERUJVR19FTkFCTEVfTE9HID0gMCwKLQlJUENfREVCVUdfRElTQUJMRV9MT0cgPSAxLAotCUlQQ19ERUJVR19SRVFVRVNUX0xPR19EVU1QID0gMiwKLQlJUENfREVCVUdfTk9USUZZX0xPR19EVU1QID0gMywKLQlJUENfREVCVUdfTUFYX0RFQlVHX0xPRwotfTsKLQotLyogRmlybXdhcmUgUmVhZHkgKi8KLXN0cnVjdCBzc3RfaHN3X2lwY19md19yZWFkeSB7Ci0JdTMyIGluYm94X29mZnNldDsKLQl1MzIgb3V0Ym94X29mZnNldDsKLQl1MzIgaW5ib3hfc2l6ZTsKLQl1MzIgb3V0Ym94X3NpemU7Ci0JdTMyIGZ3X2luZm9fc2l6ZTsKLQl1OCBmd19pbmZvW0lQQ19NQVhfTUFJTEJPWF9CWVRFUyAtIDUgKiBzaXplb2YodTMyKV07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3QgaXBjX21lc3NhZ2UgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQl1MzIgaGVhZGVyOwotCi0JLyogZGlyZWN0aW9uIHdydCBob3N0IENQVSAqLwotCWNoYXIgdHhfZGF0YVtJUENfTUFYX01BSUxCT1hfQllURVNdOwotCXNpemVfdCB0eF9zaXplOwotCWNoYXIgcnhfZGF0YVtJUENfTUFYX01BSUxCT1hfQllURVNdOwotCXNpemVfdCByeF9zaXplOwotCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdHE7Ci0JYm9vbCBwZW5kaW5nOwotCWJvb2wgY29tcGxldGU7Ci0JYm9vbCB3YWl0OwotCWludCBlcnJubzsKLX07Ci0KLXN0cnVjdCBzc3RfaHN3X3N0cmVhbTsKLXN0cnVjdCBzc3RfaHN3OwotCi0vKiBTdHJlYW0gaW5mb21hdGlvbiAqLwotc3RydWN0IHNzdF9oc3dfc3RyZWFtIHsKLQkvKiBjb25maWd1cmF0aW9uICovCi0Jc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9hbGxvY19yZXEgcmVxdWVzdDsKLQlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcGx5IHJlcGx5OwotCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZnJlZV9yZXEgZnJlZV9yZXE7Ci0KLQkvKiBNaXhlciBpbmZvICovCi0JdTMyIG11dGVfdm9sdW1lW1NTVF9IU1dfTk9fQ0hBTk5FTFNdOwotCXUzMiBtdXRlW1NTVF9IU1dfTk9fQ0hBTk5FTFNdOwotCi0JLyogcnVudGltZSBpbmZvICovCi0Jc3RydWN0IHNzdF9oc3cgKmhzdzsKLQlpbnQgaG9zdF9pZDsKLQlib29sIGNvbW1pdGVkOwotCWJvb2wgcnVubmluZzsKLQotCS8qIE5vdGlmaWNhdGlvbiB3b3JrICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IG5vdGlmeV93b3JrOwotCXUzMiBoZWFkZXI7Ci0KLQkvKiBQb3NpdGlvbiBpbmZvIGZyb20gRFNQICovCi0Jc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9zZXRfcG9zaXRpb24gd3BvczsKLQlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2dldF9wb3NpdGlvbiBycG9zOwotCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZ2xpdGNoX3Bvc2l0aW9uIGdsaXRjaDsKLQotCS8qIFZvbHVtZSBpbmZvICovCi0Jc3RydWN0IHNzdF9oc3dfaXBjX3ZvbHVtZV9yZXEgdm9sX3JlcTsKLQotCS8qIGRyaXZlciBjYWxsYmFjayAqLwotCXUzMiAoKm5vdGlmeV9wb3NpdGlvbikoc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHZvaWQgKmRhdGEpOwotCXZvaWQgKnBkYXRhOwotCi0JLyogcmVjb3JkIHRoZSBmdyByZWFkIHBvc2l0aW9uIHdoZW4gcGxheWJhY2sgKi8KLQlzbmRfcGNtX3VmcmFtZXNfdCBvbGRfcG9zaXRpb247Ci0JYm9vbCBwbGF5X3NpbGVuY2U7Ci0Jc3RydWN0IGxpc3RfaGVhZCBub2RlOwotfTsKLQotLyogRlcgbG9nIHJpbmcgaW5mb3JtYXRpb24gKi8KLXN0cnVjdCBzc3RfaHN3X2xvZ19zdHJlYW0gewotCWRtYV9hZGRyX3QgZG1hX2FkZHI7Ci0JdW5zaWduZWQgY2hhciAqZG1hX2FyZWE7Ci0JdW5zaWduZWQgY2hhciAqcmluZ19kZXNjcjsKLQlpbnQgcGFnZXM7Ci0JaW50IHNpemU7Ci0KLQkvKiBOb3RpZmljYXRpb24gd29yayAqLwotCXN0cnVjdCB3b3JrX3N0cnVjdCBub3RpZnlfd29yazsKLQl3YWl0X3F1ZXVlX2hlYWRfdCByZWFkZXJzX3dhaXRfcTsKLQlzdHJ1Y3QgbXV0ZXggcndfbXV0ZXg7Ci0KLQl1MzIgbGFzdF9wb3M7Ci0JdTMyIGN1cnJfcG9zOwotCXUzMiByZWFkZXJfcG9zOwotCi0JLyogZncgbG9nIGNvbmZpZyAqLwotCXUzMiBjb25maWdbU1NUX0hTV19GV19MT0dfQ09ORklHX0RXT1JEU107Ci0KLQlzdHJ1Y3Qgc3N0X2hzdyAqaHN3OwotfTsKLQotLyogU1NUIEhhc3dlbGwgSVBDIGRhdGEgKi8KLXN0cnVjdCBzc3RfaHN3IHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHNzdF9kc3AgKmRzcDsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2X3BjbTsKLQotCS8qIEZXIGNvbmZpZyAqLwotCXN0cnVjdCBzc3RfaHN3X2lwY19md19yZWFkeSBmd19yZWFkeTsKLQlzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfdmVyc2lvbiB2ZXJzaW9uOwotCWJvb2wgZndfZG9uZTsKLQlzdHJ1Y3Qgc3N0X2Z3ICpzc3RfZnc7Ci0KLQkvKiBzdHJlYW0gKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHN0cmVhbV9saXN0OwotCi0JLyogZ2xvYmFsIG1peGVyICovCi0Jc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5IG1peGVyX2luZm87Ci0JZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSBjdXJ2ZV90eXBlOwotCXUzMiBjdXJ2ZV9kdXJhdGlvbjsKLQl1MzIgbXV0ZVtTU1RfSFNXX05PX0NIQU5ORUxTXTsKLQl1MzIgbXV0ZV92b2x1bWVbU1NUX0hTV19OT19DSEFOTkVMU107Ci0KLQkvKiBEWCAqLwotCXN0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSBkeDsKLQl2b2lkICpkeF9jb250ZXh0OwotCWRtYV9hZGRyX3QgZHhfY29udGV4dF9wYWRkcjsKLQotCS8qIGJvb3QgKi8KLQl3YWl0X3F1ZXVlX2hlYWRfdCBib290X3dhaXQ7Ci0JYm9vbCBib290X2NvbXBsZXRlOwotCWJvb2wgc2h1dGRvd247Ci0KLQkvKiBJUEMgbWVzc2FnaW5nICovCi0Jc3RydWN0IGxpc3RfaGVhZCB0eF9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgcnhfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGVtcHR5X2xpc3Q7Ci0Jd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF90eHE7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0eF90aHJlYWQ7Ci0Jc3RydWN0IGt0aHJlYWRfd29ya2VyIGt3b3JrZXI7Ci0Jc3RydWN0IGt0aHJlYWRfd29yayBrd29yazsKLQlib29sIHBlbmRpbmc7Ci0Jc3RydWN0IGlwY19tZXNzYWdlICptc2c7Ci0KLQkvKiBGVyBsb2cgc3RyZWFtICovCi0Jc3RydWN0IHNzdF9oc3dfbG9nX3N0cmVhbSBsb2dfc3RyZWFtOwotfTsKLQotI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCi0jaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2hzd2Fkc3AuaD4KLQotc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9nbG9iYWxfdHlwZSh1MzIgbXNnKQotewotCXJldHVybiAobXNnICYgSVBDX0dMQl9UWVBFX01BU0spID4+IElQQ19HTEJfVFlQRV9TSElGVDsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9nbG9iYWxfcmVwbHkodTMyIG1zZykKLXsKLQlyZXR1cm4gKG1zZyAmIElQQ19HTEJfUkVQTFlfTUFTSykgPj4gSVBDX0dMQl9SRVBMWV9TSElGVDsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgbXNnX2dldF9zdHJlYW1fdHlwZSh1MzIgbXNnKQotewotCXJldHVybiAobXNnICYgSVBDX1NUUl9UWVBFX01BU0spID4+ICBJUENfU1RSX1RZUEVfU0hJRlQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIG1zZ19nZXRfc3RhZ2VfdHlwZSh1MzIgbXNnKQotewotCXJldHVybiAobXNnICYgSVBDX1NUR19UWVBFX01BU0spID4+ICBJUENfU1RHX1RZUEVfU0hJRlQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIG1zZ19nZXRfc3RyZWFtX2lkKHUzMiBtc2cpCi17Ci0JcmV0dXJuIChtc2cgJiBJUENfU1RSX0lEX01BU0spID4+ICBJUENfU1RSX0lEX1NISUZUOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBtc2dfZ2V0X25vdGlmeV9yZWFzb24odTMyIG1zZykKLXsKLQlyZXR1cm4gKG1zZyAmIElQQ19TVEdfVFlQRV9NQVNLKSA+PiBJUENfU1RHX1RZUEVfU0hJRlQ7Ci19Ci0KLXUzMiBjcmVhdGVfY2hhbm5lbF9tYXAoZW51bSBzc3RfaHN3X2NoYW5uZWxfY29uZmlnIGNvbmZpZykKLXsKLQlzd2l0Y2ggKGNvbmZpZykgewotCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR19NT05POgotCQlyZXR1cm4gKDB4RkZGRkZGRjAgfCBTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSKTsKLQljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfU1RFUkVPOgotCQlyZXR1cm4gKDB4RkZGRkZGMDAgfCBTU1RfSFNXX0NIQU5ORUxfTEVGVAotCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUIDw8IDQpKTsKLQljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfMl9QT0lOVF8xOgotCQlyZXR1cm4gKDB4RkZGRkYwMDAgfCBTU1RfSFNXX0NIQU5ORUxfTEVGVAotCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUIDw8IDQpCi0JCQl8IChTU1RfSFNXX0NIQU5ORUxfTEZFIDw8IDggKSk7Ci0JY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzNfUE9JTlRfMDoKLQkJcmV0dXJuICgweEZGRkZGMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKLQkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9DRU5URVIgPDwgNCkKLQkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KSk7Ci0JY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzNfUE9JTlRfMToKLQkJcmV0dXJuICgweEZGRkYwMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKLQkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9DRU5URVIgPDwgNCkKLQkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KQotCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xGRSA8PCAxMikpOwotCWNhc2UgU1NUX0hTV19DSEFOTkVMX0NPTkZJR19RVUFUUk86Ci0JCXJldHVybiAoMHhGRkZGMDAwMCB8IFNTVF9IU1dfQ0hBTk5FTF9MRUZUCi0JCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFQgPDwgNCkKLQkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRUZUX1NVUlJPVU5EIDw8IDgpCi0JCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFRfU1VSUk9VTkQgPDwgMTIpKTsKLQljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfNF9QT0lOVF8wOgotCQlyZXR1cm4gKDB4RkZGRjAwMDAgfCBTU1RfSFNXX0NIQU5ORUxfTEVGVAotCQkJfCAoU1NUX0hTV19DSEFOTkVMX0NFTlRFUiA8PCA0KQotCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUIDw8IDgpCi0JCQl8IChTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSX1NVUlJPVU5EIDw8IDEyKSk7Ci0JY2FzZSBTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzVfUE9JTlRfMDoKLQkJcmV0dXJuICgweEZGRjAwMDAwIHwgU1NUX0hTV19DSEFOTkVMX0xFRlQKLQkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9DRU5URVIgPDwgNCkKLQkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVCA8PCA4KQotCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xFRlRfU1VSUk9VTkQgPDwgMTIpCi0JCQl8IChTU1RfSFNXX0NIQU5ORUxfUklHSFRfU1VSUk9VTkQgPDwgMTYpKTsKLQljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfNV9QT0lOVF8xOgotCQlyZXR1cm4gKDB4RkYwMDAwMDAgfCBTU1RfSFNXX0NIQU5ORUxfQ0VOVEVSCi0JCQl8IChTU1RfSFNXX0NIQU5ORUxfTEVGVCA8PCA0KQotCQkJfCAoU1NUX0hTV19DSEFOTkVMX1JJR0hUIDw8IDgpCi0JCQl8IChTU1RfSFNXX0NIQU5ORUxfTEVGVF9TVVJST1VORCA8PCAxMikKLQkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9SSUdIVF9TVVJST1VORCA8PCAxNikKLQkJCXwgKFNTVF9IU1dfQ0hBTk5FTF9MRkUgPDwgMjApKTsKLQljYXNlIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfRFVBTF9NT05POgotCQlyZXR1cm4gKDB4RkZGRkZGMDAgfCBTU1RfSFNXX0NIQU5ORUxfTEVGVAotCQkJfCAoU1NUX0hTV19DSEFOTkVMX0xFRlQgPDwgNCkpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAweEZGRkZGRkZGOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqZ2V0X3N0cmVhbV9ieV9pZChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCWludCBzdHJlYW1faWQpCi17Ci0Jc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW07Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN0cmVhbSwgJmhzdy0+c3RyZWFtX2xpc3QsIG5vZGUpIHsKLQkJaWYgKHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkID09IHN0cmVhbV9pZCkKLQkJCXJldHVybiBzdHJlYW07Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGlwY19zaGltX2RiZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBjb25zdCBjaGFyICp0ZXh0KQotewotCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBoc3ctPmRzcDsKLQl1MzIgaXNyLCBpcGNkLCBpbXJ4LCBpcGN4OwotCi0JaXBjeCA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lQQ1gpOwotCWlzciA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lTUlgpOwotCWlwY2QgPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JUENEKTsKLQlpbXJ4ID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoc3N0LCBTU1RfSU1SWCk7Ci0KLQlkZXZfZXJyKGhzdy0+ZGV2LCAiaXBjOiAtLSVzLS0gaXBjeCAweCU4Ljh4IGlzciAweCU4Ljh4IGlwY2QgMHglOC44eCBpbXJ4IDB4JTguOHhcbiIsCi0JCXRleHQsIGlwY3gsIGlzciwgaXBjZCwgaW1yeCk7Ci19Ci0KLS8qIGxvY2tzIGhlbGQgYnkgY2FsbGVyICovCi1zdGF0aWMgc3RydWN0IGlwY19tZXNzYWdlICptc2dfZ2V0X2VtcHR5KHN0cnVjdCBzc3RfaHN3ICpoc3cpCi17Ci0Jc3RydWN0IGlwY19tZXNzYWdlICptc2cgPSBOVUxMOwotCi0JaWYgKCFsaXN0X2VtcHR5KCZoc3ctPmVtcHR5X2xpc3QpKSB7Ci0JCW1zZyA9IGxpc3RfZmlyc3RfZW50cnkoJmhzdy0+ZW1wdHlfbGlzdCwgc3RydWN0IGlwY19tZXNzYWdlLAotCQkJbGlzdCk7Ci0JCWxpc3RfZGVsKCZtc2ctPmxpc3QpOwotCX0KLQotCXJldHVybiBtc2c7Ci19Ci0KLXN0YXRpYyB2b2lkIGlwY190eF9tc2dzKHN0cnVjdCBrdGhyZWFkX3dvcmsgKndvcmspCi17Ci0Jc3RydWN0IHNzdF9oc3cgKmhzdyA9Ci0JCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc3N0X2hzdywga3dvcmspOwotCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGlwY3g7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQlpZiAobGlzdF9lbXB0eSgmaHN3LT50eF9saXN0KSB8fCBoc3ctPnBlbmRpbmcpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBpZiB0aGUgRFNQIGlzIGJ1c3ksIHdlIHdpbGwgVFggbWVzc2FnZXMgYWZ0ZXIgSVJRLgotCSAqIGFsc28gcG9zdHBvbmUgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgcHJvY2VzaW5nIGNvbXBsZXRpb24gaXJxKi8KLQlpcGN4ID0gc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoaHN3LT5kc3AsIFNTVF9JUENYKTsKLQlpZiAoaXBjeCAmIChTU1RfSVBDWF9CVVNZIHwgU1NUX0lQQ1hfRE9ORSkpIHsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQltc2cgPSBsaXN0X2ZpcnN0X2VudHJ5KCZoc3ctPnR4X2xpc3QsIHN0cnVjdCBpcGNfbWVzc2FnZSwgbGlzdCk7Ci0KLQlsaXN0X21vdmUoJm1zZy0+bGlzdCwgJmhzdy0+cnhfbGlzdCk7Ci0KLQkvKiBzZW5kIHRoZSBtZXNzYWdlICovCi0Jc3N0X2RzcF9vdXRib3hfd3JpdGUoaHN3LT5kc3AsIG1zZy0+dHhfZGF0YSwgbXNnLT50eF9zaXplKTsKLQlzc3RfZHNwX2lwY19tc2dfdHgoaHN3LT5kc3AsIG1zZy0+aGVhZGVyIHwgU1NUX0lQQ1hfQlVTWSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKLX0KLQotLyogbG9ja3MgaGVsZCBieSBjYWxsZXIgKi8KLXN0YXRpYyB2b2lkIHR4X21zZ19yZXBseV9jb21wbGV0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZykKLXsKLQltc2ctPmNvbXBsZXRlID0gdHJ1ZTsKLQl0cmFjZV9pcGNfcmVwbHkoImNvbXBsZXRlZCIsIG1zZy0+aGVhZGVyKTsKLQotCWlmICghbXNnLT53YWl0KQotCQlsaXN0X2FkZF90YWlsKCZtc2ctPmxpc3QsICZoc3ctPmVtcHR5X2xpc3QpOwotCWVsc2UKLQkJd2FrZV91cCgmbXNnLT53YWl0cSk7Ci19Ci0KLXN0YXRpYyBpbnQgdHhfd2FpdF9kb25lKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnLAotCXZvaWQgKnJ4X2RhdGEpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0OwotCi0JLyogd2FpdCBmb3IgRFNQIGNvbXBsZXRpb24gKGluIGFsbCBjYXNlcyBhdG0gaW5jIHBlbmRpbmcpICovCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KG1zZy0+d2FpdHEsIG1zZy0+Y29tcGxldGUsCi0JCW1zZWNzX3RvX2ppZmZpZXMoSVBDX1RJTUVPVVRfTVNFQ1MpKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKLQlpZiAocmV0ID09IDApIHsKLQkJaXBjX3NoaW1fZGJnKGhzdywgIm1lc3NhZ2UgdGltZW91dCIpOwotCi0JCXRyYWNlX2lwY19lcnJvcigiZXJyb3IgbWVzc2FnZSB0aW1lb3V0IGZvciIsIG1zZy0+aGVhZGVyKTsKLQkJbGlzdF9kZWwoJm1zZy0+bGlzdCk7Ci0JCXJldCA9IC1FVElNRURPVVQ7Ci0JfSBlbHNlIHsKLQotCQkvKiBjb3B5IHRoZSBkYXRhIHJldHVybmVkIGZyb20gRFNQICovCi0JCWlmIChtc2ctPnJ4X3NpemUpCi0JCQltZW1jcHkocnhfZGF0YSwgbXNnLT5yeF9kYXRhLCBtc2ctPnJ4X3NpemUpOwotCQlyZXQgPSBtc2ctPmVycm5vOwotCX0KLQotCWxpc3RfYWRkX3RhaWwoJm1zZy0+bGlzdCwgJmhzdy0+ZW1wdHlfbGlzdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaHN3LT5kc3AtPnNwaW5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpcGNfdHhfbWVzc2FnZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyLCB2b2lkICp0eF9kYXRhLAotCXNpemVfdCB0eF9ieXRlcywgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzLCBpbnQgd2FpdCkKLXsKLQlzdHJ1Y3QgaXBjX21lc3NhZ2UgKm1zZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmhzdy0+ZHNwLT5zcGlubG9jaywgZmxhZ3MpOwotCi0JbXNnID0gbXNnX2dldF9lbXB0eShoc3cpOwotCWlmIChtc2cgPT0gTlVMTCkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlpZiAodHhfYnl0ZXMpCi0JCW1lbWNweShtc2ctPnR4X2RhdGEsIHR4X2RhdGEsIHR4X2J5dGVzKTsKLQotCW1zZy0+aGVhZGVyID0gaGVhZGVyOwotCW1zZy0+dHhfc2l6ZSA9IHR4X2J5dGVzOwotCW1zZy0+cnhfc2l6ZSA9IHJ4X2J5dGVzOwotCW1zZy0+d2FpdCA9IHdhaXQ7Ci0JbXNnLT5lcnJubyA9IDA7Ci0JbXNnLT5wZW5kaW5nID0gZmFsc2U7Ci0JbXNnLT5jb21wbGV0ZSA9IGZhbHNlOwotCi0JbGlzdF9hZGRfdGFpbCgmbXNnLT5saXN0LCAmaHN3LT50eF9saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCXF1ZXVlX2t0aHJlYWRfd29yaygmaHN3LT5rd29ya2VyLCAmaHN3LT5rd29yayk7Ci0KLQlpZiAod2FpdCkKLQkJcmV0dXJuIHR4X3dhaXRfZG9uZShoc3csIG1zZywgcnhfZGF0YSk7Ci0JZWxzZQotCQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXBjX3R4X21lc3NhZ2Vfd2FpdChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyLAotCXZvaWQgKnR4X2RhdGEsIHNpemVfdCB0eF9ieXRlcywgdm9pZCAqcnhfZGF0YSwgc2l6ZV90IHJ4X2J5dGVzKQotewotCXJldHVybiBpcGNfdHhfbWVzc2FnZShoc3csIGhlYWRlciwgdHhfZGF0YSwgdHhfYnl0ZXMsIHJ4X2RhdGEsCi0JCXJ4X2J5dGVzLCAxKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXBjX3R4X21lc3NhZ2Vfbm93YWl0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBoZWFkZXIsCi0Jdm9pZCAqdHhfZGF0YSwgc2l6ZV90IHR4X2J5dGVzKQotewotCXJldHVybiBpcGNfdHhfbWVzc2FnZShoc3csIGhlYWRlciwgdHhfZGF0YSwgdHhfYnl0ZXMsIE5VTEwsIDAsIDApOwotfQotCi1zdGF0aWMgdm9pZCBoc3dfZndfcmVhZHkoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKLXsKLQlzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfcmVhZHkgZndfcmVhZHk7Ci0JdTMyIG9mZnNldDsKLQl1OCBmd19pbmZvW0lQQ19NQVhfTUFJTEJPWF9CWVRFUyAtIDUgKiBzaXplb2YodTMyKV07Ci0JY2hhciAqdG1wWzVdLCAqcGluZm87Ci0JaW50IGkgPSAwOwotCi0Jb2Zmc2V0ID0gKGhlYWRlciAmIDB4MUZGRkZGRkYpIDw8IDM7Ci0KLQlkZXZfZGJnKGhzdy0+ZGV2LCAiaXBjOiBEU1AgaXMgcmVhZHkgMHglOC44eCBvZmZzZXQgJWRcbiIsCi0JCWhlYWRlciwgb2Zmc2V0KTsKLQotCS8qIGNvcHkgZGF0YSBmcm9tIHRoZSBEU1AgRlcgcmVhZHkgb2Zmc2V0ICovCi0Jc3N0X2RzcF9yZWFkKGhzdy0+ZHNwLCAmZndfcmVhZHksIG9mZnNldCwgc2l6ZW9mKGZ3X3JlYWR5KSk7Ci0KLQlzc3RfZHNwX21haWxib3hfaW5pdChoc3ctPmRzcCwgZndfcmVhZHkuaW5ib3hfb2Zmc2V0LAotCQlmd19yZWFkeS5pbmJveF9zaXplLCBmd19yZWFkeS5vdXRib3hfb2Zmc2V0LAotCQlmd19yZWFkeS5vdXRib3hfc2l6ZSk7Ci0KLQloc3ctPmJvb3RfY29tcGxldGUgPSB0cnVlOwotCXdha2VfdXAoJmhzdy0+Ym9vdF93YWl0KTsKLQotCWRldl9kYmcoaHN3LT5kZXYsICIgbWFpbGJveCB1cHN0cmVhbSAweCV4IC0gc2l6ZSAweCV4XG4iLAotCQlmd19yZWFkeS5pbmJveF9vZmZzZXQsIGZ3X3JlYWR5LmluYm94X3NpemUpOwotCWRldl9kYmcoaHN3LT5kZXYsICIgbWFpbGJveCBkb3duc3RyZWFtIDB4JXggLSBzaXplIDB4JXhcbiIsCi0JCWZ3X3JlYWR5Lm91dGJveF9vZmZzZXQsIGZ3X3JlYWR5Lm91dGJveF9zaXplKTsKLQlpZiAoZndfcmVhZHkuZndfaW5mb19zaXplIDwgc2l6ZW9mKGZ3X3JlYWR5LmZ3X2luZm8pKSB7Ci0JCWZ3X3JlYWR5LmZ3X2luZm9bZndfcmVhZHkuZndfaW5mb19zaXplXSA9IDA7Ci0JCWRldl9kYmcoaHN3LT5kZXYsICIgRmlybXdhcmUgaW5mbzogJXMgXG4iLCBmd19yZWFkeS5md19pbmZvKTsKLQotCQkvKiBsb2cgdGhlIEZXIHZlcnNpb24gaW5mbyBnb3QgZnJvbSB0aGUgbWFpbGJveCBoZXJlLiAqLwotCQltZW1jcHkoZndfaW5mbywgZndfcmVhZHkuZndfaW5mbywgZndfcmVhZHkuZndfaW5mb19zaXplKTsKLQkJcGluZm8gPSAmZndfaW5mb1swXTsKLQkJZm9yIChpID0gMDsgaSA8IHNpemVvZih0bXApIC8gc2l6ZW9mKGNoYXIgKik7IGkrKykKLQkJCXRtcFtpXSA9IHN0cnNlcCgmcGluZm8sICIgIik7Ci0JCWRldl9pbmZvKGhzdy0+ZGV2LCAiRlcgbG9hZGVkLCBtYWlsYm94IHJlYWRiYWNrIEZXIGluZm86IHR5cGUgJXMsIC0gIgotCQkJInZlcnNpb246ICVzLiVzLCBidWlsZCAlcywgc291cmNlIGNvbW1pdCBpZDogJXNcbiIsCi0JCQl0bXBbMF0sIHRtcFsxXSwgdG1wWzJdLCB0bXBbM10sIHRtcFs0XSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBoc3dfbm90aWZpY2F0aW9uX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtID0gY29udGFpbmVyX29mKHdvcmssCi0JCQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0sIG5vdGlmeV93b3JrKTsKLQlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2dsaXRjaF9wb3NpdGlvbiAqZ2xpdGNoID0gJnN0cmVhbS0+Z2xpdGNoOwotCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fZ2V0X3Bvc2l0aW9uICpwb3MgPSAmc3RyZWFtLT5ycG9zOwotCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBzdHJlYW0tPmhzdzsKLQl1MzIgcmVhc29uOwotCi0JcmVhc29uID0gbXNnX2dldF9ub3RpZnlfcmVhc29uKHN0cmVhbS0+aGVhZGVyKTsKLQotCXN3aXRjaCAocmVhc29uKSB7Ci0JY2FzZSBJUENfU1RHX0dMSVRDSDoKLQkJdHJhY2VfaXBjX25vdGlmaWNhdGlvbigiRFNQIHN0cmVhbSB1bmRlci9vdmVycnVuIiwKLQkJCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKLQkJc3N0X2RzcF9pbmJveF9yZWFkKGhzdy0+ZHNwLCBnbGl0Y2gsIHNpemVvZigqZ2xpdGNoKSk7Ci0KLQkJZGV2X2Vycihoc3ctPmRldiwgImdsaXRjaCAlZCBwb3MgMHgleCB3cml0ZSBwb3MgMHgleFxuIiwKLQkJCWdsaXRjaC0+Z2xpdGNoX3R5cGUsIGdsaXRjaC0+cHJlc2VudF9wb3MsCi0JCQlnbGl0Y2gtPndyaXRlX3Bvcyk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUENfUE9TSVRJT05fQ0hBTkdFRDoKLQkJdHJhY2VfaXBjX25vdGlmaWNhdGlvbigiRFNQIHN0cmVhbSBwb3NpdGlvbiBjaGFuZ2VkIGZvciIsCi0JCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7Ci0JCXNzdF9kc3BfaW5ib3hfcmVhZChoc3ctPmRzcCwgcG9zLCBzaXplb2YoKnBvcykpOwotCi0JCWlmIChzdHJlYW0tPm5vdGlmeV9wb3NpdGlvbikKLQkJCXN0cmVhbS0+bm90aWZ5X3Bvc2l0aW9uKHN0cmVhbSwgc3RyZWFtLT5wZGF0YSk7Ci0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiB1bmtub3duIG5vdGlmaWNhdGlvbiAweCV4XG4iLAotCQkJc3RyZWFtLT5oZWFkZXIpOwotCQlicmVhazsKLQl9Ci0KLQkvKiB0ZWxsIERTUCB0aGF0IG5vdGlmaWNhdGlvbiBoYXMgYmVlbiBoYW5kbGVkICovCi0Jc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKGhzdy0+ZHNwLCBTU1RfSVBDRCwKLQkJU1NUX0lQQ0RfQlVTWSB8IFNTVF9JUENEX0RPTkUsIFNTVF9JUENEX0RPTkUpOwotCi0JLyogdW5tYXNrIGJ1c3kgaW50ZXJydXB0ICovCi0Jc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzKGhzdy0+ZHNwLCBTU1RfSU1SWCwgU1NUX0lNUlhfQlVTWSwgMCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXBjX21lc3NhZ2UgKnJlcGx5X2ZpbmRfbXNnKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBoZWFkZXIpCi17Ci0Jc3RydWN0IGlwY19tZXNzYWdlICptc2c7Ci0KLQkvKiBjbGVhciByZXBseSBiaXRzICYgc3RhdHVzIGJpdHMgKi8KLQloZWFkZXIgJj0gfihJUENfU1RBVFVTX01BU0sgfCBJUENfR0xCX1JFUExZX01BU0spOwotCi0JaWYgKGxpc3RfZW1wdHkoJmhzdy0+cnhfbGlzdCkpIHsKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiByeCBsaXN0IGVtcHR5IGJ1dCByZWNlaXZlZCAweCV4XG4iLAotCQkJaGVhZGVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShtc2csICZoc3ctPnJ4X2xpc3QsIGxpc3QpIHsKLQkJaWYgKG1zZy0+aGVhZGVyID09IGhlYWRlcikKLQkJCXJldHVybiBtc2c7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGhzd19zdHJlYW1fdXBkYXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnKQotewotCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtOwotCXUzMiBoZWFkZXIgPSBtc2ctPmhlYWRlciAmIH4oSVBDX1NUQVRVU19NQVNLIHwgSVBDX0dMQl9SRVBMWV9NQVNLKTsKLQl1MzIgc3RyZWFtX2lkID0gbXNnX2dldF9zdHJlYW1faWQoaGVhZGVyKTsKLQl1MzIgc3RyZWFtX21zZyA9IG1zZ19nZXRfc3RyZWFtX3R5cGUoaGVhZGVyKTsKLQotCXN0cmVhbSA9IGdldF9zdHJlYW1fYnlfaWQoaHN3LCBzdHJlYW1faWQpOwotCWlmIChzdHJlYW0gPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0Jc3dpdGNoIChzdHJlYW1fbXNnKSB7Ci0JY2FzZSBJUENfU1RSX1NUQUdFX01FU1NBR0U6Ci0JY2FzZSBJUENfU1RSX05PVElGSUNBVElPTjoKLQkJYnJlYWs7Ci0JY2FzZSBJUENfU1RSX1JFU0VUOgotCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJzdHJlYW0gcmVzZXQiLCBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7Ci0JCWJyZWFrOwotCWNhc2UgSVBDX1NUUl9QQVVTRToKLQkJc3RyZWFtLT5ydW5uaW5nID0gZmFsc2U7Ci0JCXRyYWNlX2lwY19ub3RpZmljYXRpb24oInN0cmVhbSBwYXVzZWQiLAotCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOwotCQlicmVhazsKLQljYXNlIElQQ19TVFJfUkVTVU1FOgotCQlzdHJlYW0tPnJ1bm5pbmcgPSB0cnVlOwotCQl0cmFjZV9pcGNfbm90aWZpY2F0aW9uKCJzdHJlYW0gcnVubmluZyIsCi0JCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludCBoc3dfcHJvY2Vzc19yZXBseShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgaGVhZGVyKQotewotCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnOwotCXUzMiByZXBseSA9IG1zZ19nZXRfZ2xvYmFsX3JlcGx5KGhlYWRlcik7Ci0KLQl0cmFjZV9pcGNfcmVwbHkoInByb2Nlc3NpbmcgLS0+IiwgaGVhZGVyKTsKLQotCW1zZyA9IHJlcGx5X2ZpbmRfbXNnKGhzdywgaGVhZGVyKTsKLQlpZiAobXNnID09IE5VTEwpIHsKLQkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogY2FuJ3QgZmluZCBtZXNzYWdlIGhlYWRlciIsIGhlYWRlcik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qIGZpcnN0IHByb2Nlc3MgdGhlIGhlYWRlciAqLwotCXN3aXRjaCAocmVwbHkpIHsKLQljYXNlIElQQ19HTEJfUkVQTFlfUEVORElORzoKLQkJdHJhY2VfaXBjX3BlbmRpbmdfcmVwbHkoInJlY2VpdmVkIiwgaGVhZGVyKTsKLQkJbXNnLT5wZW5kaW5nID0gdHJ1ZTsKLQkJaHN3LT5wZW5kaW5nID0gdHJ1ZTsKLQkJcmV0dXJuIDE7Ci0JY2FzZSBJUENfR0xCX1JFUExZX1NVQ0NFU1M6Ci0JCWlmIChtc2ctPnBlbmRpbmcpIHsKLQkJCXRyYWNlX2lwY19wZW5kaW5nX3JlcGx5KCJjb21wbGV0ZWQiLCBoZWFkZXIpOwotCQkJc3N0X2RzcF9pbmJveF9yZWFkKGhzdy0+ZHNwLCBtc2ctPnJ4X2RhdGEsCi0JCQkJbXNnLT5yeF9zaXplKTsKLQkJCWhzdy0+cGVuZGluZyA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJLyogY29weSBkYXRhIGZyb20gdGhlIERTUCAqLwotCQkJc3N0X2RzcF9vdXRib3hfcmVhZChoc3ctPmRzcCwgbXNnLT5yeF9kYXRhLAotCQkJCW1zZy0+cnhfc2l6ZSk7Ci0JCX0KLQkJYnJlYWs7Ci0JLyogdGhlc2Ugd2lsbCBiZSByYXJlIC0gYnV0IHVzZWZ1bCBmb3IgZGVidWcgKi8KLQljYXNlIElQQ19HTEJfUkVQTFlfVU5LTk9XTl9NRVNTQUdFX1RZUEU6Ci0JCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IHVua25vd24gbWVzc2FnZSB0eXBlIiwgaGVhZGVyKTsKLQkJbXNnLT5lcnJubyA9IC1FQkFETVNHOwotCQlicmVhazsKLQljYXNlIElQQ19HTEJfUkVQTFlfT1VUX09GX1JFU09VUkNFUzoKLQkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogb3V0IG9mIHJlc291cmNlcyIsIGhlYWRlcik7Ci0JCW1zZy0+ZXJybm8gPSAtRU5PTUVNOwotCQlicmVhazsKLQljYXNlIElQQ19HTEJfUkVQTFlfQlVTWToKLQkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogcmVwbHkgYnVzeSIsIGhlYWRlcik7Ci0JCW1zZy0+ZXJybm8gPSAtRUJVU1k7Ci0JCWJyZWFrOwotCWNhc2UgSVBDX0dMQl9SRVBMWV9GQUlMVVJFOgotCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiByZXBseSBmYWlsdXJlIiwgaGVhZGVyKTsKLQkJbXNnLT5lcnJubyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgSVBDX0dMQl9SRVBMWV9TVEFHRV9VTklOSVRJQUxJWkVEOgotCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiBzdGFnZSB1bmluaXRpYWxpemVkIiwgaGVhZGVyKTsKLQkJbXNnLT5lcnJubyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgSVBDX0dMQl9SRVBMWV9OT1RfRk9VTkQ6Ci0JCXRyYWNlX2lwY19lcnJvcigiZXJyb3I6IHJlcGx5IG5vdCBmb3VuZCIsIGhlYWRlcik7Ci0JCW1zZy0+ZXJybm8gPSAtRUlOVkFMOwotCQlicmVhazsKLQljYXNlIElQQ19HTEJfUkVQTFlfU09VUkNFX05PVF9TVEFSVEVEOgotCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiBzb3VyY2Ugbm90IHN0YXJ0ZWQiLCBoZWFkZXIpOwotCQltc2ctPmVycm5vID0gLUVJTlZBTDsKLQkJYnJlYWs7Ci0JY2FzZSBJUENfR0xCX1JFUExZX0lOVkFMSURfUkVRVUVTVDoKLQkJdHJhY2VfaXBjX2Vycm9yKCJlcnJvcjogaW52YWxpZCByZXF1ZXN0IiwgaGVhZGVyKTsKLQkJbXNnLT5lcnJubyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCWNhc2UgSVBDX0dMQl9SRVBMWV9FUlJPUl9JTlZBTElEX1BBUkFNOgotCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiBpbnZhbGlkIHBhcmFtZXRlciIsIGhlYWRlcik7Ci0JCW1zZy0+ZXJybm8gPSAtRUlOVkFMOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQl0cmFjZV9pcGNfZXJyb3IoImVycm9yOiB1bmtub3duIHJlcGx5IiwgaGVhZGVyKTsKLQkJbXNnLT5lcnJubyA9IC1FSU5WQUw7Ci0JCWJyZWFrOwotCX0KLQotCS8qIHVwZGF0ZSBhbnkgc3RyZWFtIHN0YXRlcyAqLwotCWlmIChtc2dfZ2V0X2dsb2JhbF90eXBlKGhlYWRlcikgPT0gSVBDX0dMQl9TVFJFQU1fTUVTU0FHRSkKLQkJaHN3X3N0cmVhbV91cGRhdGUoaHN3LCBtc2cpOwotCi0JLyogd2FrZSB1cCBhbmQgcmV0dXJuIHRoZSBlcnJvciBpZiB3ZSBoYXZlIHdhaXRlcnMgb24gdGhpcyBtZXNzYWdlID8gKi8KLQlsaXN0X2RlbCgmbXNnLT5saXN0KTsKLQl0eF9tc2dfcmVwbHlfY29tcGxldGUoaHN3LCBtc2cpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaHN3X3N0cmVhbV9tZXNzYWdlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHUzMiBoZWFkZXIpCi17Ci0JdTMyIHN0cmVhbV9tc2csIHN0cmVhbV9pZCwgc3RhZ2VfdHlwZTsKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbTsKLQlpbnQgaGFuZGxlZCA9IDA7Ci0KLQlzdHJlYW1fbXNnID0gbXNnX2dldF9zdHJlYW1fdHlwZShoZWFkZXIpOwotCXN0cmVhbV9pZCA9IG1zZ19nZXRfc3RyZWFtX2lkKGhlYWRlcik7Ci0Jc3RhZ2VfdHlwZSA9IG1zZ19nZXRfc3RhZ2VfdHlwZShoZWFkZXIpOwotCi0Jc3RyZWFtID0gZ2V0X3N0cmVhbV9ieV9pZChoc3csIHN0cmVhbV9pZCk7Ci0JaWYgKHN0cmVhbSA9PSBOVUxMKQotCQlyZXR1cm4gaGFuZGxlZDsKLQotCXN0cmVhbS0+aGVhZGVyID0gaGVhZGVyOwotCi0Jc3dpdGNoIChzdHJlYW1fbXNnKSB7Ci0JY2FzZSBJUENfU1RSX1NUQUdFX01FU1NBR0U6Ci0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RhZ2UgbXNnIG5vdCBpbXBsZW1lbnRlZCAweCU4Ljh4XG4iLAotCQkJaGVhZGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBJUENfU1RSX05PVElGSUNBVElPTjoKLQkJc2NoZWR1bGVfd29yaygmc3RyZWFtLT5ub3RpZnlfd29yayk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCS8qIGhhbmRsZSBwZW5kaW5nIG1lc3NhZ2UgY29tcGxldGUgcmVxdWVzdCAqLwotCQloYW5kbGVkID0gaHN3X3Byb2Nlc3NfcmVwbHkoaHN3LCBoZWFkZXIpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gaGFuZGxlZDsKLX0KLQotc3RhdGljIGludCBoc3dfbG9nX21lc3NhZ2Uoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIGhlYWRlcikKLXsKLQl1MzIgb3BlcmF0aW9uID0gKGhlYWRlciAmIElQQ19MT0dfT1BfTUFTSykgPj4gIElQQ19MT0dfT1BfU0hJRlQ7Ci0Jc3RydWN0IHNzdF9oc3dfbG9nX3N0cmVhbSAqc3RyZWFtID0gJmhzdy0+bG9nX3N0cmVhbTsKLQlpbnQgcmV0ID0gMTsKLQotCWlmIChvcGVyYXRpb24gIT0gSVBDX0RFQlVHX1JFUVVFU1RfTE9HX0RVTVApIHsKLQkJZGV2X2Vycihoc3ctPmRldiwKLQkJCSJlcnJvcjogbG9nIG1zZyBub3QgaW1wbGVtZW50ZWQgMHglOC44eFxuIiwgaGVhZGVyKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXV0ZXhfbG9jaygmc3RyZWFtLT5yd19tdXRleCk7Ci0Jc3RyZWFtLT5sYXN0X3BvcyA9IHN0cmVhbS0+Y3Vycl9wb3M7Ci0Jc3N0X2RzcF9pbmJveF9yZWFkKAotCQloc3ctPmRzcCwgJnN0cmVhbS0+Y3Vycl9wb3MsIHNpemVvZihzdHJlYW0tPmN1cnJfcG9zKSk7Ci0JbXV0ZXhfdW5sb2NrKCZzdHJlYW0tPnJ3X211dGV4KTsKLQotCXNjaGVkdWxlX3dvcmsoJnN0cmVhbS0+bm90aWZ5X3dvcmspOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBoc3dfcHJvY2Vzc19ub3RpZmljYXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdykKLXsKLQlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gaHN3LT5kc3A7Ci0JdTMyIHR5cGUsIGhlYWRlcjsKLQlpbnQgaGFuZGxlZCA9IDE7Ci0KLQloZWFkZXIgPSBzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChzc3QsIFNTVF9JUENEKTsKLQl0eXBlID0gbXNnX2dldF9nbG9iYWxfdHlwZShoZWFkZXIpOwotCi0JdHJhY2VfaXBjX3JlcXVlc3QoInByb2Nlc3NpbmcgLS0+IiwgaGVhZGVyKTsKLQotCS8qIEZXIFJlYWR5IGlzIGEgc3BlY2lhbCBjYXNlICovCi0JaWYgKCFoc3ctPmJvb3RfY29tcGxldGUgJiYgaGVhZGVyICYgSVBDX0ZXX1JFQURZKSB7Ci0JCWhzd19md19yZWFkeShoc3csIGhlYWRlcik7Ci0JCXJldHVybiBoYW5kbGVkOwotCX0KLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgSVBDX0dMQl9HRVRfRldfVkVSU0lPTjoKLQljYXNlIElQQ19HTEJfQUxMT0NBVEVfU1RSRUFNOgotCWNhc2UgSVBDX0dMQl9GUkVFX1NUUkVBTToKLQljYXNlIElQQ19HTEJfR0VUX0ZXX0NBUEFCSUxJVElFUzoKLQljYXNlIElQQ19HTEJfUkVRVUVTVF9EVU1QOgotCWNhc2UgSVBDX0dMQl9HRVRfREVWSUNFX0ZPUk1BVFM6Ci0JY2FzZSBJUENfR0xCX1NFVF9ERVZJQ0VfRk9STUFUUzoKLQljYXNlIElQQ19HTEJfRU5URVJfRFhfU1RBVEU6Ci0JY2FzZSBJUENfR0xCX0dFVF9NSVhFUl9TVFJFQU1fSU5GTzoKLQljYXNlIElQQ19HTEJfTUFYX0lQQ19NRVNTQUdFX1RZUEU6Ci0JY2FzZSBJUENfR0xCX1JFU1RPUkVfQ09OVEVYVDoKLQljYXNlIElQQ19HTEJfU0hPUlRfUkVQTFk6Ci0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogbWVzc2FnZSB0eXBlICVkIGhlYWRlciAweCV4XG4iLAotCQkJdHlwZSwgaGVhZGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBJUENfR0xCX1NUUkVBTV9NRVNTQUdFOgotCQloYW5kbGVkID0gaHN3X3N0cmVhbV9tZXNzYWdlKGhzdywgaGVhZGVyKTsKLQkJYnJlYWs7Ci0JY2FzZSBJUENfR0xCX0RFQlVHX0xPR19NRVNTQUdFOgotCQloYW5kbGVkID0gaHN3X2xvZ19tZXNzYWdlKGhzdywgaGVhZGVyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiB1bmV4cGVjdGVkIHR5cGUgJWQgaGRyIDB4JTguOHhcbiIsCi0JCQl0eXBlLCBoZWFkZXIpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gaGFuZGxlZDsKLX0KLQotc3RhdGljIGlycXJldHVybl90IGhzd19pcnFfdGhyZWFkKGludCBpcnEsIHZvaWQgKmNvbnRleHQpCi17Ci0Jc3RydWN0IHNzdF9kc3AgKnNzdCA9IChzdHJ1Y3Qgc3N0X2RzcCAqKSBjb250ZXh0OwotCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBzc3RfZHNwX2dldF90aHJlYWRfY29udGV4dChzc3QpOwotCXUzMiBpcGN4LCBpcGNkOwotCWludCBoYW5kbGVkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOwotCi0JaXBjeCA9IHNzdF9kc3BfaXBjX21zZ19yeChoc3ctPmRzcCk7Ci0JaXBjZCA9IHNzdF9kc3Bfc2hpbV9yZWFkX3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QpOwotCi0JLyogcmVwbHkgbWVzc2FnZSBmcm9tIERTUCAqLwotCWlmIChpcGN4ICYgU1NUX0lQQ1hfRE9ORSkgewotCi0JCS8qIEhhbmRsZSBJbW1lZGlhdGUgcmVwbHkgZnJvbSBEU1AgQ29yZSAqLwotCQloYW5kbGVkID0gaHN3X3Byb2Nlc3NfcmVwbHkoaHN3LCBpcGN4KTsKLQotCQlpZiAoaGFuZGxlZCA+IDApIHsKLQkJCS8qIGNsZWFyIERPTkUgYml0IC0gdGVsbCBEU1Agd2UgaGF2ZSBjb21wbGV0ZWQgKi8KLQkJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JUENYLAotCQkJCVNTVF9JUENYX0RPTkUsIDApOwotCi0JCQkvKiB1bm1hc2sgRG9uZSBpbnRlcnJ1cHQgKi8KLQkJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLAotCQkJCVNTVF9JTVJYX0RPTkUsIDApOwotCQl9Ci0JfQotCi0JLyogbmV3IG1lc3NhZ2UgZnJvbSBEU1AgKi8KLQlpZiAoaXBjZCAmIFNTVF9JUENEX0JVU1kpIHsKLQotCQkvKiBIYW5kbGUgTm90aWZpY2F0aW9uIGFuZCBEZWxheWVkIHJlcGx5IGZyb20gRFNQIENvcmUgKi8KLQkJaGFuZGxlZCA9IGhzd19wcm9jZXNzX25vdGlmaWNhdGlvbihoc3cpOwotCi0JCS8qIGNsZWFyIEJVU1kgYml0IGFuZCBzZXQgRE9ORSBiaXQgLSBhY2NlcHQgbmV3IG1lc3NhZ2VzICovCi0JCWlmIChoYW5kbGVkID4gMCkgewotCQkJc3N0X2RzcF9zaGltX3VwZGF0ZV9iaXRzX3VubG9ja2VkKHNzdCwgU1NUX0lQQ0QsCi0JCQkJU1NUX0lQQ0RfQlVTWSB8IFNTVF9JUENEX0RPTkUsIFNTVF9JUENEX0RPTkUpOwotCi0JCQkvKiB1bm1hc2sgYnVzeSBpbnRlcnJ1cHQgKi8KLQkJCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0c191bmxvY2tlZChzc3QsIFNTVF9JTVJYLAotCQkJCVNTVF9JTVJYX0JVU1ksIDApOwotCQl9Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOwotCi0JLyogY29udGludWUgdG8gc2VuZCBhbnkgcmVtYWluaW5nIG1lc3NhZ2VzLi4uICovCi0JcXVldWVfa3RocmVhZF93b3JrKCZoc3ctPmt3b3JrZXIsICZoc3ctPmt3b3JrKTsKLQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLQotaW50IHNzdF9oc3dfZndfZ2V0X3ZlcnNpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19pcGNfZndfdmVyc2lvbiAqdmVyc2lvbikKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gaXBjX3R4X21lc3NhZ2Vfd2FpdChoc3csIElQQ19HTEJfVFlQRShJUENfR0xCX0dFVF9GV19WRVJTSU9OKSwKLQkJTlVMTCwgMCwgdmVyc2lvbiwgc2l6ZW9mKCp2ZXJzaW9uKSk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogZ2V0IHZlcnNpb24gZmFpbGVkXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qIE1peGVyIENvbnRyb2xzICovCi1pbnQgc3N0X2hzd19zdHJlYW1fZ2V0X3ZvbHVtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKLQl1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsLCB1MzIgKnZvbHVtZSkKLXsKLQlpZiAoY2hhbm5lbCA+IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3N0X2RzcF9yZWFkKGhzdy0+ZHNwLCB2b2x1bWUsCi0JCXN0cmVhbS0+cmVwbHkudm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbY2hhbm5lbF0sCi0JCXNpemVvZigqdm9sdW1lKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogc3RyZWFtIHZvbHVtZSAqLwotaW50IHNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwgdTMyIHZvbHVtZSkKLXsKLQlzdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSAqcmVxOwotCXUzMiBoZWFkZXI7Ci0JaW50IHJldDsKLQotCXRyYWNlX2lwY19yZXF1ZXN0KCJzZXQgc3RyZWFtIHZvbHVtZSIsIHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkKTsKLQotCWlmIChjaGFubmVsID49IDIgJiYgY2hhbm5lbCAhPSBTU1RfSFNXX0NIQU5ORUxTX0FMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9TVFJFQU1fTUVTU0FHRSkgfAotCQlJUENfU1RSX1RZUEUoSVBDX1NUUl9TVEFHRV9NRVNTQUdFKTsKLQloZWFkZXIgfD0gKHN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkIDw8IElQQ19TVFJfSURfU0hJRlQpOwotCWhlYWRlciB8PSAoSVBDX1NUR19TRVRfVk9MVU1FIDw8IElQQ19TVEdfVFlQRV9TSElGVCk7Ci0JaGVhZGVyIHw9IChzdGFnZV9pZCA8PCBJUENfU1RHX0lEX1NISUZUKTsKLQotCXJlcSA9ICZzdHJlYW0tPnZvbF9yZXE7Ci0JcmVxLT50YXJnZXRfdm9sdW1lID0gdm9sdW1lOwotCi0JLyogc2V0IGJvdGggYXQgc2FtZSB0aW1lID8gKi8KLQlpZiAoY2hhbm5lbCA9PSBTU1RfSFNXX0NIQU5ORUxTX0FMTCkgewotCQlpZiAoaHN3LT5tdXRlWzBdICYmIGhzdy0+bXV0ZVsxXSkgewotCQkJaHN3LT5tdXRlX3ZvbHVtZVswXSA9IGhzdy0+bXV0ZV92b2x1bWVbMV0gPSB2b2x1bWU7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChoc3ctPm11dGVbMF0pCi0JCQlyZXEtPmNoYW5uZWwgPSAxOwotCQllbHNlIGlmIChoc3ctPm11dGVbMV0pCi0JCQlyZXEtPmNoYW5uZWwgPSAwOwotCQllbHNlCi0JCQlyZXEtPmNoYW5uZWwgPSBTU1RfSFNXX0NIQU5ORUxTX0FMTDsKLQl9IGVsc2UgewotCQkvKiBzZXQgb25seSAxIGNoYW5uZWwgKi8KLQkJaWYgKGhzdy0+bXV0ZVtjaGFubmVsXSkgewotCQkJaHN3LT5tdXRlX3ZvbHVtZVtjaGFubmVsXSA9IHZvbHVtZTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXJlcS0+Y2hhbm5lbCA9IGNoYW5uZWw7Ci0JfQotCi0JcmV0ID0gaXBjX3R4X21lc3NhZ2Vfd2FpdChoc3csIGhlYWRlciwgcmVxLCBzaXplb2YoKnJlcSksIE5VTEwsIDApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc2V0IHN0cmVhbSB2b2x1bWUgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHNzdF9oc3dfbWl4ZXJfZ2V0X3ZvbHVtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCB1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsLAotCXUzMiAqdm9sdW1lKQotewotCWlmIChjaGFubmVsID4gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzc3RfZHNwX3JlYWQoaHN3LT5kc3AsIHZvbHVtZSwKLQkJaHN3LT5taXhlcl9pbmZvLnZvbHVtZV9yZWdpc3Rlcl9hZGRyZXNzW2NoYW5uZWxdLAotCQlzaXplb2YoKnZvbHVtZSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIGdsb2JhbCBtaXhlciB2b2x1bWUgKi8KLWludCBzc3RfaHN3X21peGVyX3NldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwKLQl1MzIgdm9sdW1lKQotewotCXN0cnVjdCBzc3RfaHN3X2lwY192b2x1bWVfcmVxIHJlcTsKLQl1MzIgaGVhZGVyOwotCWludCByZXQ7Ci0KLQl0cmFjZV9pcGNfcmVxdWVzdCgic2V0IG1peGVyIHZvbHVtZSIsIHZvbHVtZSk7Ci0KLQlpZiAoY2hhbm5lbCA+PSAyICYmIGNoYW5uZWwgIT0gU1NUX0hTV19DSEFOTkVMU19BTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogc2V0IGJvdGggYXQgc2FtZSB0aW1lID8gKi8KLQlpZiAoY2hhbm5lbCA9PSBTU1RfSFNXX0NIQU5ORUxTX0FMTCkgewotCQlpZiAoaHN3LT5tdXRlWzBdICYmIGhzdy0+bXV0ZVsxXSkgewotCQkJaHN3LT5tdXRlX3ZvbHVtZVswXSA9IGhzdy0+bXV0ZV92b2x1bWVbMV0gPSB2b2x1bWU7Ci0JCQlyZXR1cm4gMDsKLQkJfSBlbHNlIGlmIChoc3ctPm11dGVbMF0pCi0JCQlyZXEuY2hhbm5lbCA9IDE7Ci0JCWVsc2UgaWYgKGhzdy0+bXV0ZVsxXSkKLQkJCXJlcS5jaGFubmVsID0gMDsKLQkJZWxzZQotCQkJcmVxLmNoYW5uZWwgPSBTU1RfSFNXX0NIQU5ORUxTX0FMTDsKLQl9IGVsc2UgewotCQkvKiBzZXQgb25seSAxIGNoYW5uZWwgKi8KLQkJaWYgKGhzdy0+bXV0ZVtjaGFubmVsXSkgewotCQkJaHN3LT5tdXRlX3ZvbHVtZVtjaGFubmVsXSA9IHZvbHVtZTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXJlcS5jaGFubmVsID0gY2hhbm5lbDsKLQl9Ci0KLQloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9TVFJFQU1fTUVTU0FHRSkgfAotCQlJUENfU1RSX1RZUEUoSVBDX1NUUl9TVEFHRV9NRVNTQUdFKTsKLQloZWFkZXIgfD0gKGhzdy0+bWl4ZXJfaW5mby5taXhlcl9od19pZCA8PCBJUENfU1RSX0lEX1NISUZUKTsKLQloZWFkZXIgfD0gKElQQ19TVEdfU0VUX1ZPTFVNRSA8PCBJUENfU1RHX1RZUEVfU0hJRlQpOwotCWhlYWRlciB8PSAoc3RhZ2VfaWQgPDwgSVBDX1NUR19JRF9TSElGVCk7Ci0KLQlyZXEuY3VydmVfZHVyYXRpb24gPSBoc3ctPmN1cnZlX2R1cmF0aW9uOwotCXJlcS5jdXJ2ZV90eXBlID0gaHN3LT5jdXJ2ZV90eXBlOwotCXJlcS50YXJnZXRfdm9sdW1lID0gdm9sdW1lOwotCi0JcmV0ID0gaXBjX3R4X21lc3NhZ2Vfd2FpdChoc3csIGhlYWRlciwgJnJlcSwgc2l6ZW9mKHJlcSksIE5VTEwsIDApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc2V0IG1peGVyIHZvbHVtZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiBTdHJlYW0gQVBJICovCi1zdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnNzdF9oc3dfc3RyZWFtX25ldyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBpbnQgaWQsCi0JdTMyICgqbm90aWZ5X3Bvc2l0aW9uKShzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdm9pZCAqZGF0YSksCi0Jdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbTsKLQlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gaHN3LT5kc3A7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXN0cmVhbSA9IGt6YWxsb2Moc2l6ZW9mKCpzdHJlYW0pLCBHRlBfS0VSTkVMKTsKLQlpZiAoc3RyZWFtID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNzdC0+c3BpbmxvY2ssIGZsYWdzKTsKLQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCA9IElOVkFMSURfU1RSRUFNX0hXX0lEOwotCWxpc3RfYWRkKCZzdHJlYW0tPm5vZGUsICZoc3ctPnN0cmVhbV9saXN0KTsKLQlzdHJlYW0tPm5vdGlmeV9wb3NpdGlvbiA9IG5vdGlmeV9wb3NpdGlvbjsKLQlzdHJlYW0tPnBkYXRhID0gZGF0YTsKLQlzdHJlYW0tPmhzdyA9IGhzdzsKLQlzdHJlYW0tPmhvc3RfaWQgPSBpZDsKLQotCS8qIHdvcmsgdG8gcHJvY2VzcyBub3RpZmljYXRpb24gbWVzc2FnZXMgKi8KLQlJTklUX1dPUksoJnN0cmVhbS0+bm90aWZ5X3dvcmssIGhzd19ub3RpZmljYXRpb25fd29yayk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0LT5zcGlubG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHN0cmVhbTsKLX0KLQotaW50IHNzdF9oc3dfc3RyZWFtX2ZyZWUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCi17Ci0JdTMyIGhlYWRlcjsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc3N0X2RzcCAqc3N0ID0gaHN3LT5kc3A7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghc3RyZWFtKSB7Ci0JCWRldl93YXJuKGhzdy0+ZGV2LCAid2FybmluZzogc3RyZWFtIGlzIE5VTEwsIG5vIHN0cmVhbSB0byBmcmVlLCBpZ25vcmUgaXQuXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogZG9udCBmcmVlIERTUCBzdHJlYW1zIHRoYXQgYXJlIG5vdCBjb21taXRlZCAqLwotCWlmICghc3RyZWFtLT5jb21taXRlZCkKLQkJZ290byBvdXQ7Ci0KLQl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIGZyZWUiLCBzdHJlYW0tPmhvc3RfaWQpOwotCi0Jc3RyZWFtLT5mcmVlX3JlcS5zdHJlYW1faWQgPSBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZDsKLQloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9GUkVFX1NUUkVBTSk7Ci0KLQlyZXQgPSBpcGNfdHhfbWVzc2FnZV93YWl0KGhzdywgaGVhZGVyLCAmc3RyZWFtLT5mcmVlX3JlcSwKLQkJc2l6ZW9mKHN0cmVhbS0+ZnJlZV9yZXEpLCBOVUxMLCAwKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZyZWUgc3RyZWFtICVkIGZhaWxlZFxuIiwKLQkJCXN0cmVhbS0+ZnJlZV9yZXEuc3RyZWFtX2lkKTsKLQkJcmV0dXJuIC1FQUdBSU47Ci0JfQotCi0JdHJhY2VfaHN3X3N0cmVhbV9mcmVlX3JlcShzdHJlYW0sICZzdHJlYW0tPmZyZWVfcmVxKTsKLQotb3V0OgotCWNhbmNlbF93b3JrX3N5bmMoJnN0cmVhbS0+bm90aWZ5X3dvcmspOwotCXNwaW5fbG9ja19pcnFzYXZlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7Ci0JbGlzdF9kZWwoJnN0cmVhbS0+bm9kZSk7Ci0Ja2ZyZWUoc3RyZWFtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3QtPnNwaW5sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgc3N0X2hzd19zdHJlYW1fc2V0X2JpdHMoc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgZW51bSBzc3RfaHN3X2JpdGRlcHRoIGJpdHMpCi17Ci0JaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgYml0c1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQuYml0ZGVwdGggPSBiaXRzOwotCXJldHVybiAwOwotfQotCi1pbnQgc3N0X2hzd19zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfaHN3ICpoc3csCi0Jc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIGludCBjaGFubmVscykKLXsKLQlpZiAoc3RyZWFtLT5jb21taXRlZCkgewotCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBjaGFubmVsc1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQuY2hfbnVtID0gY2hhbm5lbHM7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzc3RfaHN3X3N0cmVhbV9zZXRfcmF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBpbnQgcmF0ZSkKLXsKLQlpZiAoc3RyZWFtLT5jb21taXRlZCkgewotCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCByYXRlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Jc3RyZWFtLT5yZXF1ZXN0LmZvcm1hdC5mcmVxdWVuY3kgPSByYXRlOwotCXJldHVybiAwOwotfQotCi1pbnQgc3N0X2hzd19zdHJlYW1fc2V0X21hcF9jb25maWcoc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIG1hcCwKLQllbnVtIHNzdF9oc3dfY2hhbm5lbF9jb25maWcgY29uZmlnKQotewotCWlmIChzdHJlYW0tPmNvbW1pdGVkKSB7Ci0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc3RyZWFtIGNvbW1pdHRlZCBmb3Igc2V0IG1hcFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQubWFwID0gbWFwOwotCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQuY29uZmlnID0gY29uZmlnOwotCXJldHVybiAwOwotfQotCi1pbnQgc3N0X2hzd19zdHJlYW1fc2V0X3N0eWxlKHN0cnVjdCBzc3RfaHN3ICpoc3csCi0Jc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIGVudW0gc3N0X2hzd19pbnRlcmxlYXZpbmcgc3R5bGUpCi17Ci0JaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgc3R5bGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzdHJlYW0tPnJlcXVlc3QuZm9ybWF0LnN0eWxlID0gc3R5bGU7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBzc3RfaHN3X3N0cmVhbV9zZXRfdmFsaWQoc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIGJpdHMpCi17Ci0JaWYgKHN0cmVhbS0+Y29tbWl0ZWQpIHsKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0dGVkIGZvciBzZXQgdmFsaWQgYml0c1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0cmVhbS0+cmVxdWVzdC5mb3JtYXQudmFsaWRfYml0ID0gYml0czsKLQlyZXR1cm4gMDsKLX0KLQotLyogU3RyZWFtIENvbmZpZ3VyYXRpb24gKi8KLWludCBzc3RfaHN3X3N0cmVhbV9mb3JtYXQoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCi0JZW51bSBzc3RfaHN3X3N0cmVhbV9wYXRoX2lkIHBhdGhfaWQsCi0JZW51bSBzc3RfaHN3X3N0cmVhbV90eXBlIHN0cmVhbV90eXBlLAotCWVudW0gc3N0X2hzd19zdHJlYW1fZm9ybWF0IGZvcm1hdF9pZCkKLXsKLQlpZiAoc3RyZWFtLT5jb21taXRlZCkgewotCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBmb3JtYXRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzdHJlYW0tPnJlcXVlc3QucGF0aF9pZCA9IHBhdGhfaWQ7Ci0Jc3RyZWFtLT5yZXF1ZXN0LnN0cmVhbV90eXBlID0gc3RyZWFtX3R5cGU7Ci0Jc3RyZWFtLT5yZXF1ZXN0LmZvcm1hdF9pZCA9IGZvcm1hdF9pZDsKLQotCXRyYWNlX2hzd19zdHJlYW1fYWxsb2NfcmVxdWVzdChzdHJlYW0sICZzdHJlYW0tPnJlcXVlc3QpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBzc3RfaHN3X3N0cmVhbV9idWZmZXIoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCi0JdTMyIHJpbmdfcHRfYWRkcmVzcywgdTMyIG51bV9wYWdlcywKLQl1MzIgcmluZ19zaXplLCB1MzIgcmluZ19vZmZzZXQsIHUzMiByaW5nX2ZpcnN0X3BmbikKLXsKLQlpZiAoc3RyZWFtLT5jb21taXRlZCkgewotCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIGJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN0cmVhbS0+cmVxdWVzdC5yaW5naW5mby5yaW5nX3B0X2FkZHJlc3MgPSByaW5nX3B0X2FkZHJlc3M7Ci0Jc3RyZWFtLT5yZXF1ZXN0LnJpbmdpbmZvLm51bV9wYWdlcyA9IG51bV9wYWdlczsKLQlzdHJlYW0tPnJlcXVlc3QucmluZ2luZm8ucmluZ19zaXplID0gcmluZ19zaXplOwotCXN0cmVhbS0+cmVxdWVzdC5yaW5naW5mby5yaW5nX29mZnNldCA9IHJpbmdfb2Zmc2V0OwotCXN0cmVhbS0+cmVxdWVzdC5yaW5naW5mby5yaW5nX2ZpcnN0X3BmbiA9IHJpbmdfZmlyc3RfcGZuOwotCi0JdHJhY2VfaHN3X3N0cmVhbV9idWZmZXIoc3RyZWFtKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgc3N0X2hzd19zdHJlYW1fc2V0X21vZHVsZV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCi0Jc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUpCi17Ci0Jc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCAqbWFwID0gJnN0cmVhbS0+cmVxdWVzdC5tYXA7Ci0Jc3RydWN0IHNzdF9kc3AgKmRzcCA9IHNzdF9oc3dfZ2V0X2RzcChoc3cpOwotCXN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGUgPSBydW50aW1lLT5tb2R1bGU7Ci0KLQlpZiAoc3RyZWFtLT5jb21taXRlZCkgewotCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IHN0cmVhbSBjb21taXR0ZWQgZm9yIHNldCBtb2R1bGVcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBvbmx5IHN1cHBvcnQgaW5pdGlhbCBtb2R1bGUgYXRtICovCi0JbWFwLT5tb2R1bGVfZW50cmllc19jb3VudCA9IDE7Ci0JbWFwLT5tb2R1bGVfZW50cmllc1swXS5tb2R1bGVfaWQgPSBtb2R1bGUtPmlkOwotCW1hcC0+bW9kdWxlX2VudHJpZXNbMF0uZW50cnlfcG9pbnQgPSBtb2R1bGUtPmVudHJ5OwotCi0Jc3RyZWFtLT5yZXF1ZXN0LnBlcnNpc3RlbnRfbWVtLm9mZnNldCA9Ci0JCXNzdF9kc3BfZ2V0X29mZnNldChkc3AsIHJ1bnRpbWUtPnBlcnNpc3RlbnRfb2Zmc2V0LCBTU1RfTUVNX0RSQU0pOwotCXN0cmVhbS0+cmVxdWVzdC5wZXJzaXN0ZW50X21lbS5zaXplID0gbW9kdWxlLT5wZXJzaXN0ZW50X3NpemU7Ci0KLQlzdHJlYW0tPnJlcXVlc3Quc2NyYXRjaF9tZW0ub2Zmc2V0ID0KLQkJc3N0X2RzcF9nZXRfb2Zmc2V0KGRzcCwgZHNwLT5zY3JhdGNoX29mZnNldCwgU1NUX01FTV9EUkFNKTsKLQlzdHJlYW0tPnJlcXVlc3Quc2NyYXRjaF9tZW0uc2l6ZSA9IGRzcC0+c2NyYXRjaF9zaXplOwotCi0JZGV2X2RiZyhoc3ctPmRldiwgIm1vZHVsZSAlZCBydW50aW1lICVkIHVzaW5nOlxuIiwgbW9kdWxlLT5pZCwKLQkJcnVudGltZS0+aWQpOwotCWRldl9kYmcoaHN3LT5kZXYsICIgcGVyc2lzdGVudCBvZmZzZXQgMHgleCBieXRlcyAweCV4XG4iLAotCQlzdHJlYW0tPnJlcXVlc3QucGVyc2lzdGVudF9tZW0ub2Zmc2V0LAotCQlzdHJlYW0tPnJlcXVlc3QucGVyc2lzdGVudF9tZW0uc2l6ZSk7Ci0JZGV2X2RiZyhoc3ctPmRldiwgIiBzY3JhdGNoIG9mZnNldCAweCV4IGJ5dGVzIDB4JXhcbiIsCi0JCXN0cmVhbS0+cmVxdWVzdC5zY3JhdGNoX21lbS5vZmZzZXQsCi0JCXN0cmVhbS0+cmVxdWVzdC5zY3JhdGNoX21lbS5zaXplKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgc3N0X2hzd19zdHJlYW1fY29tbWl0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKQotewotCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fYWxsb2NfcmVxICpzdHJfcmVxID0gJnN0cmVhbS0+cmVxdWVzdDsKLQlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcGx5ICpyZXBseSA9ICZzdHJlYW0tPnJlcGx5OwotCXUzMiBoZWFkZXI7Ci0JaW50IHJldDsKLQotCWlmICghc3RyZWFtKSB7Ci0JCWRldl93YXJuKGhzdy0+ZGV2LCAid2FybmluZzogc3RyZWFtIGlzIE5VTEwsIG5vIHN0cmVhbSB0byBjb21taXQsIGlnbm9yZSBpdC5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAoc3RyZWFtLT5jb21taXRlZCkgewotCQlkZXZfd2Fybihoc3ctPmRldiwgIndhcm5pbmc6IHN0cmVhbSBpcyBhbHJlYWR5IGNvbW1pdHRlZCwgaWdub3JlIGl0LlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXRyYWNlX2lwY19yZXF1ZXN0KCJzdHJlYW0gYWxsb2MiLCBzdHJlYW0tPmhvc3RfaWQpOwotCi0JaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfQUxMT0NBVEVfU1RSRUFNKTsKLQotCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIHN0cl9yZXEsIHNpemVvZigqc3RyX3JlcSksCi0JCXJlcGx5LCBzaXplb2YoKnJlcGx5KSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBzdHJlYW0gY29tbWl0IGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc3RyZWFtLT5jb21taXRlZCA9IDE7Ci0JdHJhY2VfaHN3X3N0cmVhbV9hbGxvY19yZXBseShzdHJlYW0pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXNuZF9wY21fdWZyYW1lc190IHNzdF9oc3dfc3RyZWFtX2dldF9vbGRfcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKLXsKLQlyZXR1cm4gc3RyZWFtLT5vbGRfcG9zaXRpb247Ci19Ci0KLXZvaWQgc3N0X2hzd19zdHJlYW1fc2V0X29sZF9wb3NpdGlvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpCi17Ci0Jc3RyZWFtLT5vbGRfcG9zaXRpb24gPSB2YWw7Ci19Ci0KLWJvb2wgc3N0X2hzd19zdHJlYW1fZ2V0X3NpbGVuY2Vfc3RhcnQoc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKLXsKLQlyZXR1cm4gc3RyZWFtLT5wbGF5X3NpbGVuY2U7Ci19Ci0KLXZvaWQgc3N0X2hzd19zdHJlYW1fc2V0X3NpbGVuY2Vfc3RhcnQoc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgYm9vbCB2YWwpCi17Ci0Jc3RyZWFtLT5wbGF5X3NpbGVuY2UgPSB2YWw7Ci19Ci0KLS8qIFN0cmVhbSBJbmZvcm1hdGlvbiAtIHRoZXNlIGNhbGxzIGNvdWxkIGJlIGlubGluZSBidXQgd2Ugd2FudCB0aGUgSVBDCi0gQUJJIHRvIGJlIG9wYXF1ZSB0byBjbGllbnQgUENNIGRyaXZlcnMgdG8gY29wZSB3aXRoIGFueSBmdXR1cmUgQUJJIGNoYW5nZXMgKi8KLWludCBzc3RfaHN3X21peGVyX2dldF9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3cpCi17Ci0Jc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5ICpyZXBseTsKLQl1MzIgaGVhZGVyOwotCWludCByZXQ7Ci0KLQlyZXBseSA9ICZoc3ctPm1peGVyX2luZm87Ci0JaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfR0VUX01JWEVSX1NUUkVBTV9JTkZPKTsKLQotCXRyYWNlX2lwY19yZXF1ZXN0KCJnZXQgZ2xvYmFsIG1peGVyIGluZm8iLCAwKTsKLQotCXJldCA9IGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIE5VTEwsIDAsIHJlcGx5LCBzaXplb2YoKnJlcGx5KSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBnZXQgc3RyZWFtIGluZm8gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQl0cmFjZV9oc3dfbWl4ZXJfaW5mb19yZXBseShyZXBseSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogU2VuZCBzdHJlYW0gY29tbWFuZCAqLwotc3RhdGljIGludCBzc3RfaHN3X3N0cmVhbV9vcGVyYXRpb25zKHN0cnVjdCBzc3RfaHN3ICpoc3csIGludCB0eXBlLAotCWludCBzdHJlYW1faWQsIGludCB3YWl0KQotewotCXUzMiBoZWFkZXI7Ci0KLQloZWFkZXIgPSBJUENfR0xCX1RZUEUoSVBDX0dMQl9TVFJFQU1fTUVTU0FHRSkgfCBJUENfU1RSX1RZUEUodHlwZSk7Ci0JaGVhZGVyIHw9IChzdHJlYW1faWQgPDwgSVBDX1NUUl9JRF9TSElGVCk7Ci0KLQlpZiAod2FpdCkKLQkJcmV0dXJuIGlwY190eF9tZXNzYWdlX3dhaXQoaHN3LCBoZWFkZXIsIE5VTEwsIDAsIE5VTEwsIDApOwotCWVsc2UKLQkJcmV0dXJuIGlwY190eF9tZXNzYWdlX25vd2FpdChoc3csIGhlYWRlciwgTlVMTCwgMCk7Ci19Ci0KLS8qIFN0cmVhbSBBTFNBIHRyaWdnZXIgb3BlcmF0aW9ucyAqLwotaW50IHNzdF9oc3dfc3RyZWFtX3BhdXNlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAotCWludCB3YWl0KQotewotCWludCByZXQ7Ci0KLQlpZiAoIXN0cmVhbSkgewotCQlkZXZfd2Fybihoc3ctPmRldiwgIndhcm5pbmc6IHN0cmVhbSBpcyBOVUxMLCBubyBzdHJlYW0gdG8gcGF1c2UsIGlnbm9yZSBpdC5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl0cmFjZV9pcGNfcmVxdWVzdCgic3RyZWFtIHBhdXNlIiwgc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOwotCi0JcmV0ID0gc3N0X2hzd19zdHJlYW1fb3BlcmF0aW9ucyhoc3csIElQQ19TVFJfUEFVU0UsCi0JCXN0cmVhbS0+cmVwbHkuc3RyZWFtX2h3X2lkLCB3YWl0KTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBmYWlsZWQgdG8gcGF1c2Ugc3RyZWFtICVkXG4iLAotCQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IHNzdF9oc3dfc3RyZWFtX3Jlc3VtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKLQlpbnQgd2FpdCkKLXsKLQlpbnQgcmV0OwotCi0JaWYgKCFzdHJlYW0pIHsKLQkJZGV2X3dhcm4oaHN3LT5kZXYsICJ3YXJuaW5nOiBzdHJlYW0gaXMgTlVMTCwgbm8gc3RyZWFtIHRvIHJlc3VtZSwgaWdub3JlIGl0LlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXRyYWNlX2lwY19yZXF1ZXN0KCJzdHJlYW0gcmVzdW1lIiwgc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQpOwotCi0JcmV0ID0gc3N0X2hzd19zdHJlYW1fb3BlcmF0aW9ucyhoc3csIElQQ19TVFJfUkVTVU1FLAotCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCwgd2FpdCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIHJlc3VtZSBzdHJlYW0gJWRcbiIsCi0JCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgc3N0X2hzd19zdHJlYW1fcmVzZXQoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCi17Ci0JaW50IHJldCwgdHJpZXMgPSAxMDsKLQotCWlmICghc3RyZWFtKSB7Ci0JCWRldl93YXJuKGhzdy0+ZGV2LCAid2FybmluZzogc3RyZWFtIGlzIE5VTEwsIG5vIHN0cmVhbSB0byByZXNldCwgaWdub3JlIGl0LlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIGRvbnQgcmVzZXQgc3RyZWFtcyB0aGF0IGFyZSBub3QgY29tbWl0ZWQgKi8KLQlpZiAoIXN0cmVhbS0+Y29tbWl0ZWQpCi0JCXJldHVybiAwOwotCi0JLyogd2FpdCBmb3IgcGF1c2UgdG8gY29tcGxldGUgYmVmb3JlIHdlIHJlc2V0IHRoZSBzdHJlYW0gKi8KLQl3aGlsZSAoc3RyZWFtLT5ydW5uaW5nICYmIHRyaWVzLS0pCi0JCW1zbGVlcCgxKTsKLQlpZiAoIXRyaWVzKSB7Ci0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogcmVzZXQgc3RyZWFtICVkIHN0aWxsIHJ1bm5pbmdcbiIsCi0JCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXRyYWNlX2lwY19yZXF1ZXN0KCJzdHJlYW0gcmVzZXQiLCBzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7Ci0KLQlyZXQgPSBzc3RfaHN3X3N0cmVhbV9vcGVyYXRpb25zKGhzdywgSVBDX1NUUl9SRVNFVCwKLQkJc3RyZWFtLT5yZXBseS5zdHJlYW1faHdfaWQsIDEpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byByZXNldCBzdHJlYW0gJWRcbiIsCi0JCQlzdHJlYW0tPnJlcGx5LnN0cmVhbV9od19pZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogU3RyZWFtIHBvaW50ZXIgcG9zaXRpb25zICovCi11MzIgc3N0X2hzd19nZXRfZHNwX3Bvc2l0aW9uKHN0cnVjdCBzc3RfaHN3ICpoc3csCi0Jc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pCi17Ci0JdTMyIHJwb3M7Ci0KLQlzc3RfZHNwX3JlYWQoaHN3LT5kc3AsICZycG9zLAotCQlzdHJlYW0tPnJlcGx5LnJlYWRfcG9zaXRpb25fcmVnaXN0ZXJfYWRkcmVzcywgc2l6ZW9mKHJwb3MpKTsKLQotCXJldHVybiBycG9zOwotfQotCi0vKiBTdHJlYW0gcHJlc2VudGF0aW9uIChtb25vdG9uaWMpIHBvc2l0aW9ucyAqLwotdTY0IHNzdF9oc3dfZ2V0X2RzcF9wcmVzZW50YXRpb25fcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSkKLXsKLQl1NjQgcHBvczsKLQotCXNzdF9kc3BfcmVhZChoc3ctPmRzcCwgJnBwb3MsCi0JCXN0cmVhbS0+cmVwbHkucHJlc2VudGF0aW9uX3Bvc2l0aW9uX3JlZ2lzdGVyX2FkZHJlc3MsCi0JCXNpemVvZihwcG9zKSk7Ci0KLQlyZXR1cm4gcHBvczsKLX0KLQotLyogcGh5c2ljYWwgQkUgY29uZmlnICovCi1pbnQgc3N0X2hzd19kZXZpY2Vfc2V0X2NvbmZpZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCWVudW0gc3N0X2hzd19kZXZpY2VfaWQgZGV2LCBlbnVtIHNzdF9oc3dfZGV2aWNlX21jbGsgbWNsaywKLQllbnVtIHNzdF9oc3dfZGV2aWNlX21vZGUgbW9kZSwgdTMyIGNsb2NrX2RpdmlkZXIpCi17Ci0Jc3RydWN0IHNzdF9oc3dfaXBjX2RldmljZV9jb25maWdfcmVxIGNvbmZpZzsKLQl1MzIgaGVhZGVyOwotCWludCByZXQ7Ci0KLQl0cmFjZV9pcGNfcmVxdWVzdCgic2V0IGRldmljZSBjb25maWciLCBkZXYpOwotCi0JY29uZmlnLnNzcF9pbnRlcmZhY2UgPSBkZXY7Ci0JY29uZmlnLmNsb2NrX2ZyZXF1ZW5jeSA9IG1jbGs7Ci0JY29uZmlnLm1vZGUgPSBtb2RlOwotCWNvbmZpZy5jbG9ja19kaXZpZGVyID0gY2xvY2tfZGl2aWRlcjsKLQlpZiAobW9kZSA9PSBTU1RfSFNXX0RFVklDRV9URE1fQ0xPQ0tfTUFTVEVSKQotCQljb25maWcuY2hhbm5lbHMgPSA0OwotCWVsc2UKLQkJY29uZmlnLmNoYW5uZWxzID0gMjsKLQotCXRyYWNlX2hzd19kZXZpY2VfY29uZmlnX3JlcSgmY29uZmlnKTsKLQotCWhlYWRlciA9IElQQ19HTEJfVFlQRShJUENfR0xCX1NFVF9ERVZJQ0VfRk9STUFUUyk7Ci0KLQlyZXQgPSBpcGNfdHhfbWVzc2FnZV93YWl0KGhzdywgaGVhZGVyLCAmY29uZmlnLCBzaXplb2YoY29uZmlnKSwKLQkJTlVMTCwgMCk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogc2V0IGRldmljZSBmb3JtYXRzIGZhaWxlZFxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2hzd19kZXZpY2Vfc2V0X2NvbmZpZyk7Ci0KLS8qIERYIENvbmZpZyAqLwotaW50IHNzdF9oc3dfZHhfc2V0X3N0YXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csCi0JZW51bSBzc3RfaHN3X2R4X3N0YXRlIHN0YXRlLCBzdHJ1Y3Qgc3N0X2hzd19pcGNfZHhfcmVwbHkgKmR4KQotewotCXUzMiBoZWFkZXIsIHN0YXRlXzsKLQlpbnQgcmV0LCBpdGVtOwotCi0JaGVhZGVyID0gSVBDX0dMQl9UWVBFKElQQ19HTEJfRU5URVJfRFhfU1RBVEUpOwotCXN0YXRlXyA9IHN0YXRlOwotCi0JdHJhY2VfaXBjX3JlcXVlc3QoIlBNIGVudGVyIER4IHN0YXRlIiwgc3RhdGUpOwotCi0JcmV0ID0gaXBjX3R4X21lc3NhZ2Vfd2FpdChoc3csIGhlYWRlciwgJnN0YXRlXywgc2l6ZW9mKHN0YXRlXyksCi0JCWR4LCBzaXplb2YoKmR4KSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihoc3ctPmRldiwgImlwYzogZXJyb3Igc2V0IGR4IHN0YXRlICVkIGZhaWxlZFxuIiwgc3RhdGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWZvciAoaXRlbSA9IDA7IGl0ZW0gPCBkeC0+ZW50cmllc19ubzsgaXRlbSsrKSB7Ci0JCWRldl9kYmcoaHN3LT5kZXYsCi0JCQkiSXRlbVslZF0gb2Zmc2V0WyV4XSAtIHNpemVbJXhdIC0gc291cmNlWyV4XVxuIiwKLQkJCWl0ZW0sIGR4LT5tZW1faW5mb1tpdGVtXS5vZmZzZXQsCi0JCQlkeC0+bWVtX2luZm9baXRlbV0uc2l6ZSwKLQkJCWR4LT5tZW1faW5mb1tpdGVtXS5zb3VyY2UpOwotCX0KLQlkZXZfZGJnKGhzdy0+ZGV2LCAiaXBjOiBnb3QgJWQgZW50cnkgbnVtYmVycyBmb3Igc3RhdGUgJWRcbiIsCi0JCWR4LT5lbnRyaWVzX25vLCBzdGF0ZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpzc3RfaHN3X3J1bnRpbWVfbW9kdWxlX2NyZWF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCWludCBtb2RfaWQsIGludCBvZmZzZXQpCi17Ci0Jc3RydWN0IHNzdF9kc3AgKmRzcCA9IGhzdy0+ZHNwOwotCXN0cnVjdCBzc3RfbW9kdWxlICptb2R1bGU7Ci0Jc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqcnVudGltZTsKLQlpbnQgZXJyOwotCi0JbW9kdWxlID0gc3N0X21vZHVsZV9nZXRfZnJvbV9pZChkc3AsIG1vZF9pZCk7Ci0JaWYgKG1vZHVsZSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGdldCBtb2R1bGUgJWQgZm9yIHBjbVxuIiwKLQkJCW1vZF9pZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCXJ1bnRpbWUgPSBzc3RfbW9kdWxlX3J1bnRpbWVfbmV3KG1vZHVsZSwgbW9kX2lkLCBOVUxMKTsKLQlpZiAocnVudGltZSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoZHNwLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGNyZWF0ZSBtb2R1bGUgJWQgcnVudGltZVxuIiwKLQkJCW1vZF9pZCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWVyciA9IHNzdF9tb2R1bGVfcnVudGltZV9hbGxvY19ibG9ja3MocnVudGltZSwgb2Zmc2V0KTsKLQlpZiAoZXJyIDwgMCkgewotCQlkZXZfZXJyKGRzcC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBhbGxvYyBibG9ja3MgZm9yIG1vZHVsZSAlZCBydW50aW1lXG4iLAotCQkJbW9kX2lkKTsKLQkJc3N0X21vZHVsZV9ydW50aW1lX2ZyZWUocnVudGltZSk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWRldl9kYmcoZHNwLT5kZXYsICJydW50aW1lIGlkICVkIGNyZWF0ZWQgZm9yIG1vZHVsZSAlZFxuIiwgcnVudGltZS0+aWQsCi0JCW1vZF9pZCk7Ci0JcmV0dXJuIHJ1bnRpbWU7Ci19Ci0KLXZvaWQgc3N0X2hzd19ydW50aW1lX21vZHVsZV9mcmVlKHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUpCi17Ci0Jc3N0X21vZHVsZV9ydW50aW1lX2ZyZWVfYmxvY2tzKHJ1bnRpbWUpOwotCXNzdF9tb2R1bGVfcnVudGltZV9mcmVlKHJ1bnRpbWUpOwotfQotCi0jaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHNzdF9oc3dfZHhfc3RhdGVfZHVtcChzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQotewotCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBoc3ctPmRzcDsKLQl1MzIgaXRlbSwgb2Zmc2V0LCBzaXplOwotCWludCByZXQgPSAwOwotCi0JdHJhY2VfaXBjX3JlcXVlc3QoIlBNIHN0YXRlIGR1bXAuIEl0ZW1zICMiLCBTU1RfSFNXX01BWF9EWF9SRUdJT05TKTsKLQotCWlmIChoc3ctPmR4LmVudHJpZXNfbm8gPiBTU1RfSFNXX01BWF9EWF9SRUdJT05TKSB7Ci0JCWRldl9lcnIoaHN3LT5kZXYsCi0JCQkiZXJyb3I6IG51bWJlciBvZiBGVyBjb250ZXh0IHJlZ2lvbnMgZ3JlYXRlciB0aGFuICVkXG4iLAotCQkJU1NUX0hTV19NQVhfRFhfUkVHSU9OUyk7Ci0JCW1lbXNldCgmaHN3LT5keCwgMCwgc2l6ZW9mKGhzdy0+ZHgpKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gc3N0X2RzcF9kbWFfZ2V0X2NoYW5uZWwoc3N0LCAwKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IGNhbnQgYWxsb2NhdGUgZG1hIGNoYW5uZWwgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyogc2V0IG9uLWRlbW9uZCBtb2RlIG9uIGVuZ2luZSAwIGNoYW5uZWwgMyAqLwotCXNzdF9kc3Bfc2hpbV91cGRhdGVfYml0cyhzc3QsIFNTVF9ITURDLAotCQkJU1NUX0hNRENfSEREQV9FMF9BTExDSCB8IFNTVF9ITURDX0hEREFfRTFfQUxMQ0gsCi0JCQlTU1RfSE1EQ19IRERBX0UwX0FMTENIIHwgU1NUX0hNRENfSEREQV9FMV9BTExDSCk7Ci0KLQlmb3IgKGl0ZW0gPSAwOyBpdGVtIDwgaHN3LT5keC5lbnRyaWVzX25vOyBpdGVtKyspIHsKLQkJaWYgKGhzdy0+ZHgubWVtX2luZm9baXRlbV0uc291cmNlID09IFNTVF9IU1dfRFhfVFlQRV9NRU1PUllfRFVNUAotCQkJJiYgaHN3LT5keC5tZW1faW5mb1tpdGVtXS5vZmZzZXQgPiBEU1BfRFJBTV9BRERSX09GRlNFVAotCQkJJiYgaHN3LT5keC5tZW1faW5mb1tpdGVtXS5vZmZzZXQgPAotCQkJRFNQX0RSQU1fQUREUl9PRkZTRVQgKyBTU1RfSFNXX0RYX0NPTlRFWFRfU0laRSkgewotCi0JCQlvZmZzZXQgPSBoc3ctPmR4Lm1lbV9pbmZvW2l0ZW1dLm9mZnNldAotCQkJCQktIERTUF9EUkFNX0FERFJfT0ZGU0VUOwotCQkJc2l6ZSA9IChoc3ctPmR4Lm1lbV9pbmZvW2l0ZW1dLnNpemUgKyAzKSAmICh+Myk7Ci0KLQkJCXJldCA9IHNzdF9kc3BfZG1hX2NvcHlmcm9tKHNzdCwgaHN3LT5keF9jb250ZXh0X3BhZGRyICsgb2Zmc2V0LAotCQkJCXNzdC0+YWRkci5scGVfYmFzZSArIG9mZnNldCwgc2l6ZSk7Ci0JCQlpZiAocmV0IDwgMCkgewotCQkJCWRldl9lcnIoaHN3LT5kZXYsCi0JCQkJCSJlcnJvcjogRlcgY29udGV4dCBkdW1wIGZhaWxlZFxuIik7Ci0JCQkJbWVtc2V0KCZoc3ctPmR4LCAwLCBzaXplb2YoaHN3LT5keCkpOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQl9Ci0JfQotCi1vdXQ6Ci0Jc3N0X2RzcF9kbWFfcHV0X2NoYW5uZWwoc3N0KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHNzdF9oc3dfZHhfc3RhdGVfcmVzdG9yZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQotewotCXN0cnVjdCBzc3RfZHNwICpzc3QgPSBoc3ctPmRzcDsKLQl1MzIgaXRlbSwgb2Zmc2V0LCBzaXplOwotCWludCByZXQ7Ci0KLQlmb3IgKGl0ZW0gPSAwOyBpdGVtIDwgaHN3LT5keC5lbnRyaWVzX25vOyBpdGVtKyspIHsKLQkJaWYgKGhzdy0+ZHgubWVtX2luZm9baXRlbV0uc291cmNlID09IFNTVF9IU1dfRFhfVFlQRV9NRU1PUllfRFVNUAotCQkJJiYgaHN3LT5keC5tZW1faW5mb1tpdGVtXS5vZmZzZXQgPiBEU1BfRFJBTV9BRERSX09GRlNFVAotCQkJJiYgaHN3LT5keC5tZW1faW5mb1tpdGVtXS5vZmZzZXQgPAotCQkJRFNQX0RSQU1fQUREUl9PRkZTRVQgKyBTU1RfSFNXX0RYX0NPTlRFWFRfU0laRSkgewotCi0JCQlvZmZzZXQgPSBoc3ctPmR4Lm1lbV9pbmZvW2l0ZW1dLm9mZnNldAotCQkJCQktIERTUF9EUkFNX0FERFJfT0ZGU0VUOwotCQkJc2l6ZSA9IChoc3ctPmR4Lm1lbV9pbmZvW2l0ZW1dLnNpemUgKyAzKSAmICh+Myk7Ci0KLQkJCXJldCA9IHNzdF9kc3BfZG1hX2NvcHl0byhzc3QsIHNzdC0+YWRkci5scGVfYmFzZSArIG9mZnNldCwKLQkJCQloc3ctPmR4X2NvbnRleHRfcGFkZHIgKyBvZmZzZXQsIHNpemUpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlkZXZfZXJyKGhzdy0+ZGV2LAotCQkJCQkiZXJyb3I6IEZXIGNvbnRleHQgcmVzdG9yZSBmYWlsZWRcbiIpOwotCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3N0X2hzd19kcm9wX2FsbChzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQotewotCXN0cnVjdCBpcGNfbWVzc2FnZSAqbXNnLCAqdG1wOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHR4X2Ryb3BfY250ID0gMCwgcnhfZHJvcF9jbnQgPSAwOwotCi0JLyogZHJvcCBhbGwgVFggYW5kIFJ4IG1lc3NhZ2VzIGJlZm9yZSB3ZSBzdGFsbCArIHJlc2V0IERTUCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIHRtcCwgJmhzdy0+dHhfbGlzdCwgbGlzdCkgewotCQlsaXN0X21vdmUoJm1zZy0+bGlzdCwgJmhzdy0+ZW1wdHlfbGlzdCk7Ci0JCXR4X2Ryb3BfY250Kys7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgdG1wLCAmaHN3LT5yeF9saXN0LCBsaXN0KSB7Ci0JCWxpc3RfbW92ZSgmbXNnLT5saXN0LCAmaHN3LT5lbXB0eV9saXN0KTsKLQkJcnhfZHJvcF9jbnQrKzsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoc3ctPmRzcC0+c3BpbmxvY2ssIGZsYWdzKTsKLQotCWlmICh0eF9kcm9wX2NudCB8fCByeF9kcm9wX2NudCkKLQkJZGV2X2Vycihoc3ctPmRldiwgImRyb3BwZWQgSVBDIG1zZyBSWD0lZCwgVFg9JWRcbiIsCi0JCQl0eF9kcm9wX2NudCwgcnhfZHJvcF9jbnQpOwotfQotCi1pbnQgc3N0X2hzd19kc3BfbG9hZChzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQotewotCXN0cnVjdCBzc3RfZHNwICpkc3AgPSBoc3ctPmRzcDsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZyhoc3ctPmRldiwgImxvYWRpbmcgYXVkaW8gRFNQLi4uLiIpOwotCi0JcmV0ID0gc3N0X2RzcF93YWtlKGRzcCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBmYWlsZWQgdG8gd2FrZSBhdWRpbyBEU1BcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyZXQgPSBzc3RfZHNwX2RtYV9nZXRfY2hhbm5lbChkc3AsIDApOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogY2FudCBhbGxvY2F0ZSBkbWEgY2hhbm5lbCAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBzc3RfZndfcmVsb2FkKGhzdy0+c3N0X2Z3KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGhzdy0+ZGV2LCAiZXJyb3I6IFNTVCBGVyByZWxvYWQgZmFpbGVkXG4iKTsKLQkJc3N0X2RzcF9kbWFfcHV0X2NoYW5uZWwoZHNwKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jc3N0X2RzcF9kbWFfcHV0X2NoYW5uZWwoZHNwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzc3RfaHN3X2RzcF9yZXN0b3JlKHN0cnVjdCBzc3RfaHN3ICpoc3cpCi17Ci0Jc3RydWN0IHNzdF9kc3AgKmRzcCA9IGhzdy0+ZHNwOwotCWludCByZXQ7Ci0KLQlkZXZfZGJnKGhzdy0+ZGV2LCAicmVzdG9yaW5nIGF1ZGlvIERTUC4uLi4iKTsKLQotCXJldCA9IHNzdF9kc3BfZG1hX2dldF9jaGFubmVsKGRzcCwgMCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBjYW50IGFsbG9jYXRlIGRtYSBjaGFubmVsICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHNzdF9oc3dfZHhfc3RhdGVfcmVzdG9yZShoc3cpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogU1NUIEZXIGNvbnRleHQgcmVzdG9yZSBmYWlsZWRcbiIpOwotCQlzc3RfZHNwX2RtYV9wdXRfY2hhbm5lbChkc3ApOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0Jc3N0X2RzcF9kbWFfcHV0X2NoYW5uZWwoZHNwKTsKLQotCS8qIHdhaXQgZm9yIERTUCBib290IGNvbXBsZXRpb24gKi8KLQlzc3RfZHNwX2Jvb3QoZHNwKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBzc3RfaHN3X2RzcF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IHNzdF9oc3cgKmhzdykKLXsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZyhoc3ctPmRldiwgImF1ZGlvIGRzcCBydW50aW1lIHN1c3BlbmRcbiIpOwotCi0JcmV0ID0gc3N0X2hzd19keF9zZXRfc3RhdGUoaHN3LCBTU1RfSFNXX0RYX1NUQVRFX0QzLCAmaHN3LT5keCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlzc3RfZHNwX3N0YWxsKGhzdy0+ZHNwKTsKLQotCXJldCA9IHNzdF9oc3dfZHhfc3RhdGVfZHVtcChoc3cpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0Jc3N0X2hzd19kcm9wX2FsbChoc3cpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBzc3RfaHN3X2RzcF9ydW50aW1lX3NsZWVwKHN0cnVjdCBzc3RfaHN3ICpoc3cpCi17Ci0Jc3N0X2Z3X3VubG9hZChoc3ctPnNzdF9mdyk7Ci0Jc3N0X2Jsb2NrX2ZyZWVfc2NyYXRjaChoc3ctPmRzcCk7Ci0KLQloc3ctPmJvb3RfY29tcGxldGUgPSBmYWxzZTsKLQotCXNzdF9kc3Bfc2xlZXAoaHN3LT5kc3ApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBzc3RfaHN3X2RzcF9ydW50aW1lX3Jlc3VtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3KQotewotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhzdy0+ZGV2OwotCWludCByZXQ7Ci0KLQlkZXZfZGJnKGRldiwgImF1ZGlvIGRzcCBydW50aW1lIHJlc3VtZVxuIik7Ci0KLQlpZiAoaHN3LT5ib290X2NvbXBsZXRlKQotCQlyZXR1cm4gMTsgLyogdGVsbCBjYWxsZXIgbm8gYWN0aW9uIGlzIHJlcXVpcmVkICovCi0KLQlyZXQgPSBzc3RfaHN3X2RzcF9yZXN0b3JlKGhzdyk7Ci0JaWYgKHJldCA8IDApCi0JCWRldl9lcnIoZGV2LCAiZXJyb3I6IGF1ZGlvIERTUCBib290IGZhaWx1cmVcbiIpOwotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGhzdy0+Ym9vdF93YWl0LCBoc3ctPmJvb3RfY29tcGxldGUsCi0JCW1zZWNzX3RvX2ppZmZpZXMoSVBDX0JPT1RfTVNFQ1MpKTsKLQlpZiAocmV0ID09IDApIHsKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBhdWRpbyBEU1AgYm9vdCB0aW1lb3V0IElQQ0QgMHgleCBJUENYIDB4JXhcbiIsCi0JCQlzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChoc3ctPmRzcCwgU1NUX0lQQ0QpLAotCQkJc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoaHN3LT5kc3AsIFNTVF9JUENYKSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qIFNldCBBRFNQIFNTUCBwb3J0IHNldHRpbmdzICovCi0JcmV0ID0gc3N0X2hzd19kZXZpY2Vfc2V0X2NvbmZpZyhoc3csIFNTVF9IU1dfREVWSUNFX1NTUF8wLAotCQkJCQlTU1RfSFNXX0RFVklDRV9NQ0xLX0ZSRVFfMjRfTUhaLAotCQkJCQlTU1RfSFNXX0RFVklDRV9DTE9DS19NQVNURVIsIDkpOwotCWlmIChyZXQgPCAwKQotCQlkZXZfZXJyKGRldiwgImVycm9yOiBTU1AgcmUtaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBtc2dfZW1wdHlfbGlzdF9pbml0KHN0cnVjdCBzc3RfaHN3ICpoc3cpCi17Ci0JaW50IGk7Ci0KLQloc3ctPm1zZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpcGNfbWVzc2FnZSkgKgotCQlJUENfRU1QVFlfTElTVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoaHN3LT5tc2cgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSVBDX0VNUFRZX0xJU1RfU0laRTsgaSsrKSB7Ci0JCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhzdy0+bXNnW2ldLndhaXRxKTsKLQkJbGlzdF9hZGQoJmhzdy0+bXNnW2ldLmxpc3QsICZoc3ctPmVtcHR5X2xpc3QpOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3Qgc3N0X2RzcCAqc3N0X2hzd19nZXRfZHNwKHN0cnVjdCBzc3RfaHN3ICpoc3cpCi17Ci0JcmV0dXJuIGhzdy0+ZHNwOwotfQotCi1zdGF0aWMgc3RydWN0IHNzdF9kc3BfZGV2aWNlIGhzd19kZXYgPSB7Ci0JLnRocmVhZCA9IGhzd19pcnFfdGhyZWFkLAotCS5vcHMgPSAmaGFzd2VsbF9vcHMsCi19OwotCi1pbnQgc3N0X2hzd19kc3BfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzc3RfcGRhdGEgKnBkYXRhKQotewotCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uIHZlcnNpb247Ci0Jc3RydWN0IHNzdF9oc3cgKmhzdzsKLQlpbnQgcmV0OwotCi0JZGV2X2RiZyhkZXYsICJpbml0aWFsaXNpbmcgQXVkaW8gRFNQIElQQ1xuIik7Ci0KLQloc3cgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmhzdyksIEdGUF9LRVJORUwpOwotCWlmIChoc3cgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQloc3ctPmRldiA9IGRldjsKLQlJTklUX0xJU1RfSEVBRCgmaHN3LT5zdHJlYW1fbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmhzdy0+dHhfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmhzdy0+cnhfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmhzdy0+ZW1wdHlfbGlzdCk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmaHN3LT5ib290X3dhaXQpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhzdy0+d2FpdF90eHEpOwotCi0JcmV0ID0gbXNnX2VtcHR5X2xpc3RfaW5pdChoc3cpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIHN0YXJ0IHRoZSBJUEMgbWVzc2FnZSB0aHJlYWQgKi8KLQlpbml0X2t0aHJlYWRfd29ya2VyKCZoc3ctPmt3b3JrZXIpOwotCWhzdy0+dHhfdGhyZWFkID0ga3RocmVhZF9ydW4oa3RocmVhZF93b3JrZXJfZm4sCi0JCQkJCSAgICZoc3ctPmt3b3JrZXIsICIlcyIsCi0JCQkJCSAgIGRldl9uYW1lKGhzdy0+ZGV2KSk7Ci0JaWYgKElTX0VSUihoc3ctPnR4X3RocmVhZCkpIHsKLQkJcmV0ID0gUFRSX0VSUihoc3ctPnR4X3RocmVhZCk7Ci0JCWRldl9lcnIoaHN3LT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGNyZWF0ZSBtZXNzYWdlIFRYIHRhc2tcbiIpOwotCQlnb3RvIGVycl9mcmVlX21zZzsKLQl9Ci0JaW5pdF9rdGhyZWFkX3dvcmsoJmhzdy0+a3dvcmssIGlwY190eF9tc2dzKTsKLQotCWhzd19kZXYudGhyZWFkX2NvbnRleHQgPSBoc3c7Ci0KLQkvKiBpbml0IFNTVCBzaGltICovCi0JaHN3LT5kc3AgPSBzc3RfZHNwX25ldyhkZXYsICZoc3dfZGV2LCBwZGF0YSk7Ci0JaWYgKGhzdy0+ZHNwID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBkc3BfZXJyOwotCX0KLQotCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgZm9yIGNvbnRleHQgc3RvcmFnZSAqLwotCWhzdy0+ZHhfY29udGV4dCA9IGRtYV9hbGxvY19jb2hlcmVudChoc3ctPmRzcC0+ZG1hX2RldiwKLQkJU1NUX0hTV19EWF9DT05URVhUX1NJWkUsICZoc3ctPmR4X2NvbnRleHRfcGFkZHIsIEdGUF9LRVJORUwpOwotCWlmIChoc3ctPmR4X2NvbnRleHQgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGRtYV9lcnI7Ci0JfQotCi0JLyoga2VlcCB0aGUgRFNQIGluIHJlc2V0IHN0YXRlIGZvciBiYXNlIEZXIGxvYWRpbmcgKi8KLQlzc3RfZHNwX3Jlc2V0KGhzdy0+ZHNwKTsKLQotCWhzdy0+c3N0X2Z3ID0gc3N0X2Z3X25ldyhoc3ctPmRzcCwgcGRhdGEtPmZ3LCBoc3cpOwotCWlmIChoc3ctPnNzdF9mdyA9PSBOVUxMKSB7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWRldl9lcnIoZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBsb2FkIGZpcm13YXJlXG4iKTsKLQkJZ290byBmd19lcnI7Ci0JfQotCi0JLyogd2FpdCBmb3IgRFNQIGJvb3QgY29tcGxldGlvbiAqLwotCXNzdF9kc3BfYm9vdChoc3ctPmRzcCk7Ci0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGhzdy0+Ym9vdF93YWl0LCBoc3ctPmJvb3RfY29tcGxldGUsCi0JCW1zZWNzX3RvX2ppZmZpZXMoSVBDX0JPT1RfTVNFQ1MpKTsKLQlpZiAocmV0ID09IDApIHsKLQkJcmV0ID0gLUVJTzsKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBhdWRpbyBEU1AgYm9vdCB0aW1lb3V0IElQQ0QgMHgleCBJUENYIDB4JXhcbiIsCi0JCQlzc3RfZHNwX3NoaW1fcmVhZF91bmxvY2tlZChoc3ctPmRzcCwgU1NUX0lQQ0QpLAotCQkJc3N0X2RzcF9zaGltX3JlYWRfdW5sb2NrZWQoaHN3LT5kc3AsIFNTVF9JUENYKSk7Ci0JCWdvdG8gYm9vdF9lcnI7Ci0JfQotCi0JLyogZ2V0IHRoZSBGVyB2ZXJzaW9uICovCi0Jc3N0X2hzd19md19nZXRfdmVyc2lvbihoc3csICZ2ZXJzaW9uKTsKLQotCS8qIGdldCB0aGUgZ2xvYmFsbWl4ZXIgKi8KLQlyZXQgPSBzc3RfaHN3X21peGVyX2dldF9pbmZvKGhzdyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihoc3ctPmRldiwgImVycm9yOiBmYWlsZWQgdG8gZ2V0IHN0cmVhbSBpbmZvXG4iKTsKLQkJZ290byBib290X2VycjsKLQl9Ci0KLQlwZGF0YS0+ZHNwID0gaHN3OwotCXJldHVybiAwOwotCi1ib290X2VycjoKLQlzc3RfZHNwX3Jlc2V0KGhzdy0+ZHNwKTsKLQlzc3RfZndfZnJlZShoc3ctPnNzdF9mdyk7Ci1md19lcnI6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoaHN3LT5kc3AtPmRtYV9kZXYsIFNTVF9IU1dfRFhfQ09OVEVYVF9TSVpFLAotCQkJaHN3LT5keF9jb250ZXh0LCBoc3ctPmR4X2NvbnRleHRfcGFkZHIpOwotZG1hX2VycjoKLQlzc3RfZHNwX2ZyZWUoaHN3LT5kc3ApOwotZHNwX2VycjoKLQlrdGhyZWFkX3N0b3AoaHN3LT50eF90aHJlYWQpOwotZXJyX2ZyZWVfbXNnOgotCWtmcmVlKGhzdy0+bXNnKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfaHN3X2RzcF9pbml0KTsKLQotdm9pZCBzc3RfaHN3X2RzcF9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpCi17Ci0Jc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5kc3A7Ci0KLQlzc3RfZHNwX3Jlc2V0KGhzdy0+ZHNwKTsKLQlzc3RfZndfZnJlZV9hbGwoaHN3LT5kc3ApOwotCWRtYV9mcmVlX2NvaGVyZW50KGhzdy0+ZHNwLT5kbWFfZGV2LCBTU1RfSFNXX0RYX0NPTlRFWFRfU0laRSwKLQkJCWhzdy0+ZHhfY29udGV4dCwgaHN3LT5keF9jb250ZXh0X3BhZGRyKTsKLQlzc3RfZHNwX2ZyZWUoaHN3LT5kc3ApOwotCWt0aHJlYWRfc3RvcChoc3ctPnR4X3RocmVhZCk7Ci0Ja2ZyZWUoaHN3LT5tc2cpOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2hzd19kc3BfZnJlZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LWhhc3dlbGwtaXBjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ODA5NjAuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLWlwYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDgxICswLDAgQEAKLS8qCi0gKiBJbnRlbCBTU1QgSGFzd2VsbC9Ccm9hZHdlbGwgSVBDIFN1cHBvcnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KLSAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2lmbmRlZiBfX1NTVF9IQVNXRUxMX0lQQ19ICi0jZGVmaW5lIF9fU1NUX0hBU1dFTExfSVBDX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8c291bmQvYXNvdW5kLmg+Ci0KLSNkZWZpbmUgU1NUX0hTV19OT19DSEFOTkVMUwkJNAotI2RlZmluZSBTU1RfSFNXX01BWF9EWF9SRUdJT05TCQkxNAotI2RlZmluZSBTU1RfSFNXX0RYX0NPTlRFWFRfU0laRSAgICAgICAgKDY0MCAqIDEwMjQpCi0jZGVmaW5lIFNTVF9IU1dfQ0hBTk5FTFNfQUxMCQkweGZmZmZmZmZmCi0KLSNkZWZpbmUgU1NUX0hTV19GV19MT0dfQ09ORklHX0RXT1JEUwkxMgotI2RlZmluZSBTU1RfSFNXX0dMT0JBTF9MT0cJCTE1Ci0KLS8qKgotICogVXBmcm9udCBkZWZpbmVkIG1heGltdW0gbWVzc2FnZSBzaXplIHRoYXQgaXMKLSAqIGV4cGVjdGVkIGJ5IHRoZSBpbi9vdXQgY29tbXVuaWNhdGlvbiBwaXBlcyBpbiBGVy4KLSAqLwotI2RlZmluZSBTU1RfSFNXX0lQQ19NQVhfUEFZTE9BRF9TSVpFCTQwMAotI2RlZmluZSBTU1RfSFNXX01BWF9JTkZPX1NJWkUJCTY0Ci0jZGVmaW5lIFNTVF9IU1dfQlVJTERfSEFTSF9MRU5HVEgJNDAKLQotc3RydWN0IHNzdF9oc3c7Ci1zdHJ1Y3Qgc3N0X2hzd19zdHJlYW07Ci1zdHJ1Y3Qgc3N0X2hzd19sb2dfc3RyZWFtOwotc3RydWN0IHNzdF9wZGF0YTsKLXN0cnVjdCBzc3RfbW9kdWxlOwotc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZTsKLWV4dGVybiBzdHJ1Y3Qgc3N0X29wcyBoYXN3ZWxsX29wczsKLQotLyogU3RyZWFtIEFsbG9jYXRlIFBhdGggSUQgKi8KLWVudW0gc3N0X2hzd19zdHJlYW1fcGF0aF9pZCB7Ci0JU1NUX0hTV19TVFJFQU1fUEFUSF9TU1AwX09VVCA9IDAsCi0JU1NUX0hTV19TVFJFQU1fUEFUSF9TU1AwX0lOID0gMSwKLQlTU1RfSFNXX1NUUkVBTV9QQVRIX01BWF9QQVRIX0lEID0gMiwKLX07Ci0KLS8qIFN0cmVhbSBBbGxvY2F0ZSBTdHJlYW0gVHlwZSAqLwotZW51bSBzc3RfaHN3X3N0cmVhbV90eXBlIHsKLQlTU1RfSFNXX1NUUkVBTV9UWVBFX1JFTkRFUiA9IDAsCi0JU1NUX0hTV19TVFJFQU1fVFlQRV9TWVNURU0gPSAxLAotCVNTVF9IU1dfU1RSRUFNX1RZUEVfQ0FQVFVSRSA9IDIsCi0JU1NUX0hTV19TVFJFQU1fVFlQRV9MT09QQkFDSyA9IDMsCi0JU1NUX0hTV19TVFJFQU1fVFlQRV9NQVhfU1RSRUFNX1RZUEUgPSA0LAotfTsKLQotLyogU3RyZWFtIEFsbG9jYXRlIFN0cmVhbSBGb3JtYXQgKi8KLWVudW0gc3N0X2hzd19zdHJlYW1fZm9ybWF0IHsKLQlTU1RfSFNXX1NUUkVBTV9GT1JNQVRfUENNX0ZPUk1BVCA9IDAsCi0JU1NUX0hTV19TVFJFQU1fRk9STUFUX01QM19GT1JNQVQgPSAxLAotCVNTVF9IU1dfU1RSRUFNX0ZPUk1BVF9BQUNfRk9STUFUID0gMiwKLQlTU1RfSFNXX1NUUkVBTV9GT1JNQVRfTUFYX0ZPUk1BVF9JRCA9IDMsCi19OwotCi0vKiBEZXZpY2UgSUQgKi8KLWVudW0gc3N0X2hzd19kZXZpY2VfaWQgewotCVNTVF9IU1dfREVWSUNFX1NTUF8wICAgPSAwLAotCVNTVF9IU1dfREVWSUNFX1NTUF8xICAgPSAxLAotfTsKLQotLyogRGV2aWNlIE1hc3RlciBDbG9jayBGcmVxdWVuY3kgKi8KLWVudW0gc3N0X2hzd19kZXZpY2VfbWNsayB7Ci0JU1NUX0hTV19ERVZJQ0VfTUNMS19PRkYgICAgICAgICA9IDAsCi0JU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzZfTUhaICA9IDEsCi0JU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzEyX01IWiA9IDIsCi0JU1NUX0hTV19ERVZJQ0VfTUNMS19GUkVRXzI0X01IWiA9IDMsCi19OwotCi0vKiBEZXZpY2UgQ2xvY2sgTWFzdGVyICovCi1lbnVtIHNzdF9oc3dfZGV2aWNlX21vZGUgewotCVNTVF9IU1dfREVWSUNFX0NMT0NLX1NMQVZFICAgPSAwLAotCVNTVF9IU1dfREVWSUNFX0NMT0NLX01BU1RFUiAgPSAxLAotCVNTVF9IU1dfREVWSUNFX1RETV9DTE9DS19NQVNURVIgPSAyLAotfTsKLQotLyogRFggUG93ZXIgU3RhdGUgKi8KLWVudW0gc3N0X2hzd19keF9zdGF0ZSB7Ci0JU1NUX0hTV19EWF9TVEFURV9EMCAgICAgPSAwLAotCVNTVF9IU1dfRFhfU1RBVEVfRDEgICAgID0gMSwKLQlTU1RfSFNXX0RYX1NUQVRFX0QzICAgICA9IDMsCi0JU1NUX0hTV19EWF9TVEFURV9NQVgJPSAzLAotfTsKLQotLyogQXVkaW8gc3RyZWFtIHN0YWdlIElEcyAqLwotZW51bSBzc3RfaHN3X2Z4X3N0YWdlX2lkIHsKLQlTU1RfSFNXX1NUQUdFX0lEX1dBVkVTID0gMCwKLQlTU1RfSFNXX1NUQUdFX0lEX0RUUyAgID0gMSwKLQlTU1RfSFNXX1NUQUdFX0lEX0RPTEJZID0gMiwKLQlTU1RfSFNXX1NUQUdFX0lEX0JPT1NUID0gMywKLQlTU1RfSFNXX1NUQUdFX0lEX01BWF9GWF9JRAotfTsKLQotLyogRFggU3RhdGUgVHlwZSAqLwotZW51bSBzc3RfaHN3X2R4X3R5cGUgewotCVNTVF9IU1dfRFhfVFlQRV9GV19JTUFHRSA9IDAsCi0JU1NUX0hTV19EWF9UWVBFX01FTU9SWV9EVU1QID0gMQotfTsKLQotLyogVm9sdW1lIEN1cnZlIFR5cGUqLwotZW51bSBzc3RfaHN3X3ZvbHVtZV9jdXJ2ZSB7Ci0JU1NUX0hTV19WT0xVTUVfQ1VSVkVfTk9ORSA9IDAsCi0JU1NUX0hTV19WT0xVTUVfQ1VSVkVfRkFERSA9IDEKLX07Ci0KLS8qIFNhbXBsZSBvcmRlcmluZyAqLwotZW51bSBzc3RfaHN3X2ludGVybGVhdmluZyB7Ci0JU1NUX0hTV19JTlRFUkxFQVZJTkdfUEVSX0NIQU5ORUwgPSAwLAotCVNTVF9IU1dfSU5URVJMRUFWSU5HX1BFUl9TQU1QTEUgID0gMSwKLX07Ci0KLS8qIENoYW5uZWwgaW5kaWNlcyAqLwotZW51bSBzc3RfaHN3X2NoYW5uZWxfaW5kZXggewotCVNTVF9IU1dfQ0hBTk5FTF9MRUZUICAgICAgICAgICAgPSAwLAotCVNTVF9IU1dfQ0hBTk5FTF9DRU5URVIgICAgICAgICAgPSAxLAotCVNTVF9IU1dfQ0hBTk5FTF9SSUdIVCAgICAgICAgICAgPSAyLAotCVNTVF9IU1dfQ0hBTk5FTF9MRUZUX1NVUlJPVU5EICAgPSAzLAotCVNTVF9IU1dfQ0hBTk5FTF9DRU5URVJfU1VSUk9VTkQgPSAzLAotCVNTVF9IU1dfQ0hBTk5FTF9SSUdIVF9TVVJST1VORCAgPSA0LAotCVNTVF9IU1dfQ0hBTk5FTF9MRkUgICAgICAgICAgICAgPSA3LAotCVNTVF9IU1dfQ0hBTk5FTF9JTlZBTElEICAgICAgICAgPSAweEYsCi19OwotCi0vKiBMaXN0IG9mIHN1cHBvcnRlZCBjaGFubmVsIG1hcHMuICovCi1lbnVtIHNzdF9oc3dfY2hhbm5lbF9jb25maWcgewotCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfTU9OTyAgICAgID0gMCwgLyogbW9ubyBvbmx5LiAqLwotCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfU1RFUkVPICAgID0gMSwgLyogTCAmIFIuICovCi0JU1NUX0hTV19DSEFOTkVMX0NPTkZJR18yX1BPSU5UXzEgPSAyLCAvKiBMLCBSICYgTEZFOyBQQ00gb25seS4gKi8KLQlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzNfUE9JTlRfMCA9IDMsIC8qIEwsIEMgJiBSOyBNUDMgJiBBQUMgb25seS4gKi8KLQlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzNfUE9JTlRfMSA9IDQsIC8qIEwsIEMsIFIgJiBMRkU7IFBDTSBvbmx5LiAqLwotCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfUVVBVFJPICAgID0gNSwgLyogTCwgUiwgTHMgJiBSczsgUENNIG9ubHkuICovCi0JU1NUX0hTV19DSEFOTkVMX0NPTkZJR180X1BPSU5UXzAgPSA2LCAvKiBMLCBDLCBSICYgQ3M7IE1QMyAmIEFBQyBvbmx5LiAqLwotCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfNV9QT0lOVF8wID0gNywgLyogTCwgQywgUiwgTHMgJiBScy4gKi8KLQlTU1RfSFNXX0NIQU5ORUxfQ09ORklHXzVfUE9JTlRfMSA9IDgsIC8qIEwsIEMsIFIsIExzLCBScyAmIExGRS4gKi8KLQlTU1RfSFNXX0NIQU5ORUxfQ09ORklHX0RVQUxfTU9OTyA9IDksIC8qIE9uZSBjaGFubmVsIHJlcGxpY2F0ZWQgaW4gdHdvLiAqLwotCVNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfSU5WQUxJRCwKLX07Ci0KLS8qIExpc3Qgb2Ygc3VwcG9ydGVkIGJpdCBkZXB0aHMuICovCi1lbnVtIHNzdF9oc3dfYml0ZGVwdGggewotCVNTVF9IU1dfREVQVEhfOEJJVCAgPSA4LAotCVNTVF9IU1dfREVQVEhfMTZCSVQgPSAxNiwKLQlTU1RfSFNXX0RFUFRIXzI0QklUID0gMjQsIC8qIERlZmF1bHQuICovCi0JU1NUX0hTV19ERVBUSF8zMkJJVCA9IDMyLAotCVNTVF9IU1dfREVQVEhfSU5WQUxJRCA9IDMzLAotfTsKLQotZW51bSBzc3RfaHN3X21vZHVsZV9pZCB7Ci0JU1NUX0hTV19NT0RVTEVfQkFTRV9GVyA9IDB4MCwKLQlTU1RfSFNXX01PRFVMRV9NUDMgICAgID0gMHgxLAotCVNTVF9IU1dfTU9EVUxFX0FBQ181XzEgPSAweDIsCi0JU1NUX0hTV19NT0RVTEVfQUFDXzJfMCA9IDB4MywKLQlTU1RfSFNXX01PRFVMRV9TUkMgICAgID0gMHg0LAotCVNTVF9IU1dfTU9EVUxFX1dBVkVTICAgPSAweDUsCi0JU1NUX0hTV19NT0RVTEVfRE9MQlkgICA9IDB4NiwKLQlTU1RfSFNXX01PRFVMRV9CT09TVCAgID0gMHg3LAotCVNTVF9IU1dfTU9EVUxFX0xQQUwgICAgPSAweDgsCi0JU1NUX0hTV19NT0RVTEVfRFRTICAgICA9IDB4OSwKLQlTU1RfSFNXX01PRFVMRV9QQ01fQ0FQVFVSRSA9IDB4QSwKLQlTU1RfSFNXX01PRFVMRV9QQ01fU1lTVEVNID0gMHhCLAotCVNTVF9IU1dfTU9EVUxFX1BDTV9SRUZFUkVOQ0UgPSAweEMsCi0JU1NUX0hTV19NT0RVTEVfUENNID0gMHhELAotCVNTVF9IU1dfTU9EVUxFX0JMVUVUT09USF9SRU5ERVJfTU9EVUxFID0gMHhFLAotCVNTVF9IU1dfTU9EVUxFX0JMVUVUT09USF9DQVBUVVJFX01PRFVMRSA9IDB4RiwKLQlTU1RfSFNXX01BWF9NT0RVTEVfSUQsCi19OwotCi1lbnVtIHNzdF9oc3dfcGVyZm9ybWFuY2VfYWN0aW9uIHsKLQlTU1RfSFNXX1BFUkZfU1RBUlQgPSAwLAotCVNTVF9IU1dfUEVSRl9TVE9QID0gMSwKLX07Ci0KLS8qIFNTVCBmaXJtd2FyZSBtb2R1bGUgaW5mbyAqLwotc3RydWN0IHNzdF9oc3dfbW9kdWxlX2luZm8gewotCXU4IG5hbWVbU1NUX0hTV19NQVhfSU5GT19TSVpFXTsKLQl1OCB2ZXJzaW9uW1NTVF9IU1dfTUFYX0lORk9fU0laRV07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKiBNb2R1bGUgZW50cnkgcG9pbnQgKi8KLXN0cnVjdCBzc3RfaHN3X21vZHVsZV9lbnRyeSB7Ci0JZW51bSBzc3RfaHN3X21vZHVsZV9pZCBtb2R1bGVfaWQ7Ci0JdTMyIGVudHJ5X3BvaW50OwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyogTW9kdWxlIG1hcCAtIGFsaWduZW1lbnQgbWF0Y2hlcyBEU1AgKi8KLXN0cnVjdCBzc3RfaHN3X21vZHVsZV9tYXAgewotCXU4IG1vZHVsZV9lbnRyaWVzX2NvdW50OwotCXN0cnVjdCBzc3RfaHN3X21vZHVsZV9lbnRyeSBtb2R1bGVfZW50cmllc1sxXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBzc3RfaHN3X21lbW9yeV9pbmZvIHsKLQl1MzIgb2Zmc2V0OwotCXUzMiBzaXplOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHNzdF9oc3dfZnhfZW5hYmxlIHsKLQlzdHJ1Y3Qgc3N0X2hzd19tb2R1bGVfbWFwIG1vZHVsZV9tYXA7Ci0Jc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8gcGVyc2lzdGVudF9tZW07Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3Qgc3N0X2hzd19nZXRfZnhfcGFyYW0gewotCXUzMiBwYXJhbWV0ZXJfaWQ7Ci0JdTMyIHBhcmFtX3NpemU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi1zdHJ1Y3Qgc3N0X2hzd19wZXJmX2FjdGlvbiB7Ci0JdTMyIGFjdGlvbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLXN0cnVjdCBzc3RfaHN3X3BlcmZfZGF0YSB7Ci0JdTY0IHRpbWVzdGFtcDsKLQl1NjQgY3ljbGVzOwotCXU2NCBkYXRhdGltZTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIEZXIHZlcnNpb24gKi8KLXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uIHsKLQl1OCBidWlsZDsKLQl1OCBtaW5vcjsKLQl1OCBtYWpvcjsKLQl1OCB0eXBlOwotCXU4IGZ3X2J1aWxkX2hhc2hbU1NUX0hTV19CVUlMRF9IQVNIX0xFTkdUSF07Ci0JdTMyIGZ3X2xvZ19wcm92aWRlcnNfaGFzaDsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIFN0cmVhbSByaW5nIGluZm8gKi8KLXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fcmluZyB7Ci0JdTMyIHJpbmdfcHRfYWRkcmVzczsKLQl1MzIgbnVtX3BhZ2VzOwotCXUzMiByaW5nX3NpemU7Ci0JdTMyIHJpbmdfb2Zmc2V0OwotCXUzMiByaW5nX2ZpcnN0X3BmbjsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIERlYnVnIER1bXAgTG9nIEVuYWJsZSBSZXF1ZXN0ICovCi1zdHJ1Y3Qgc3N0X2hzd19pcGNfZGVidWdfbG9nX2VuYWJsZV9yZXEgewotCXN0cnVjdCBzc3RfaHN3X2lwY19zdHJlYW1fcmluZyByaW5naW5mbzsKLQl1MzIgY29uZmlnW1NTVF9IU1dfRldfTE9HX0NPTkZJR19EV09SRFNdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyogRGVidWcgRHVtcCBMb2cgUmVwbHkgKi8KLXN0cnVjdCBzc3RfaHN3X2lwY19kZWJ1Z19sb2dfcmVwbHkgewotCXUzMiBsb2dfYnVmZmVyX2JlZ2luaW5nOwotCXUzMiBsb2dfYnVmZmVyX3NpemU7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKiBTdHJlYW0gZ2xpdGNoIHBvc2l0aW9uICovCi1zdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2dsaXRjaF9wb3NpdGlvbiB7Ci0JdTMyIGdsaXRjaF90eXBlOwotCXUzMiBwcmVzZW50X3BvczsKLQl1MzIgd3JpdGVfcG9zOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyogU3RyZWFtIGdldCBwb3NpdGlvbiAqLwotc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9nZXRfcG9zaXRpb24gewotCXUzMiBwb3NpdGlvbjsKLQl1MzIgZndfY3ljbGVfY291bnQ7Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKiBTdHJlYW0gc2V0IHBvc2l0aW9uICovCi1zdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX3NldF9wb3NpdGlvbiB7Ci0JdTMyIHBvc2l0aW9uOwotCXUzMiBlbmRfb2ZfYnVmZmVyOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyogU3RyZWFtIEZyZWUgUmVxdWVzdCAqLwotc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9mcmVlX3JlcSB7Ci0JdTggc3RyZWFtX2lkOwotCXU4IHJlc2VydmVkWzNdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyogU2V0IFZvbHVtZSBSZXF1ZXN0ICovCi1zdHJ1Y3Qgc3N0X2hzd19pcGNfdm9sdW1lX3JlcSB7Ci0JdTMyIGNoYW5uZWw7Ci0JdTMyIHRhcmdldF92b2x1bWU7Ci0JdTY0IGN1cnZlX2R1cmF0aW9uOwotCXUzMiBjdXJ2ZV90eXBlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyogRGV2aWNlIENvbmZpZ3VyYXRpb24gUmVxdWVzdCAqLwotc3RydWN0IHNzdF9oc3dfaXBjX2RldmljZV9jb25maWdfcmVxIHsKLQl1MzIgc3NwX2ludGVyZmFjZTsKLQl1MzIgY2xvY2tfZnJlcXVlbmN5OwotCXUzMiBtb2RlOwotCXUxNiBjbG9ja19kaXZpZGVyOwotCXU4IGNoYW5uZWxzOwotCXU4IHJlc2VydmVkOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyogQXVkaW8gRGF0YSBmb3JtYXRzICovCi1zdHJ1Y3Qgc3N0X2hzd19hdWRpb19kYXRhX2Zvcm1hdF9pcGMgewotCXUzMiBmcmVxdWVuY3k7Ci0JdTMyIGJpdGRlcHRoOwotCXUzMiBtYXA7Ci0JdTMyIGNvbmZpZzsKLQl1MzIgc3R5bGU7Ci0JdTggY2hfbnVtOwotCXU4IHZhbGlkX2JpdDsKLQl1OCByZXNlcnZlZFsyXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIFN0cmVhbSBBbGxvY2F0ZSBSZXF1ZXN0ICovCi1zdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcSB7Ci0JdTggcGF0aF9pZDsKLQl1OCBzdHJlYW1fdHlwZTsKLQl1OCBmb3JtYXRfaWQ7Ci0JdTggcmVzZXJ2ZWQ7Ci0Jc3RydWN0IHNzdF9oc3dfYXVkaW9fZGF0YV9mb3JtYXRfaXBjIGZvcm1hdDsKLQlzdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX3JpbmcgcmluZ2luZm87Ci0Jc3RydWN0IHNzdF9oc3dfbW9kdWxlX21hcCBtYXA7Ci0Jc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8gcGVyc2lzdGVudF9tZW07Ci0Jc3RydWN0IHNzdF9oc3dfbWVtb3J5X2luZm8gc2NyYXRjaF9tZW07Ci0JdTMyIG51bWJlcl9vZl9ub3RpZmljYXRpb25zOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyogU3RyZWFtIEFsbG9jYXRlIFJlcGx5ICovCi1zdHJ1Y3Qgc3N0X2hzd19pcGNfc3RyZWFtX2FsbG9jX3JlcGx5IHsKLQl1MzIgc3RyZWFtX2h3X2lkOwotCXUzMiBtaXhlcl9od19pZDsgLy8gcmV0dXJucyByYXRlID8/Pz8KLQl1MzIgcmVhZF9wb3NpdGlvbl9yZWdpc3Rlcl9hZGRyZXNzOwotCXUzMiBwcmVzZW50YXRpb25fcG9zaXRpb25fcmVnaXN0ZXJfYWRkcmVzczsKLQl1MzIgcGVha19tZXRlcl9yZWdpc3Rlcl9hZGRyZXNzW1NTVF9IU1dfTk9fQ0hBTk5FTFNdOwotCXUzMiB2b2x1bWVfcmVnaXN0ZXJfYWRkcmVzc1tTU1RfSFNXX05PX0NIQU5ORUxTXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIEdldCBNaXhlciBTdHJlYW0gSW5mbyAqLwotc3RydWN0IHNzdF9oc3dfaXBjX3N0cmVhbV9pbmZvX3JlcGx5IHsKLQl1MzIgbWl4ZXJfaHdfaWQ7Ci0JdTMyIHBlYWtfbWV0ZXJfcmVnaXN0ZXJfYWRkcmVzc1tTU1RfSFNXX05PX0NIQU5ORUxTXTsKLQl1MzIgdm9sdW1lX3JlZ2lzdGVyX2FkZHJlc3NbU1NUX0hTV19OT19DSEFOTkVMU107Ci19IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0vKiBEWCBTdGF0ZSBSZXF1ZXN0ICovCi1zdHJ1Y3Qgc3N0X2hzd19pcGNfZHhfcmVxIHsKLQl1OCBzdGF0ZTsKLQl1OCByZXNlcnZlZFszXTsKLX0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLS8qIERYIFN0YXRlIFJlcGx5IE1lbW9yeSBJbmZvIEl0ZW0gKi8KLXN0cnVjdCBzc3RfaHN3X2lwY19keF9tZW1vcnlfaXRlbSB7Ci0JdTMyIG9mZnNldDsKLQl1MzIgc2l6ZTsKLQl1MzIgc291cmNlOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotLyogRFggU3RhdGUgUmVwbHkgKi8KLXN0cnVjdCBzc3RfaHN3X2lwY19keF9yZXBseSB7Ci0JdTMyIGVudHJpZXNfbm87Ci0Jc3RydWN0IHNzdF9oc3dfaXBjX2R4X21lbW9yeV9pdGVtIG1lbV9pbmZvW1NTVF9IU1dfTUFYX0RYX1JFR0lPTlNdOwotfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKLQotc3RydWN0IHNzdF9oc3dfaXBjX2Z3X3ZlcnNpb247Ci0KLS8qIFNTVCBJbml0ICYgRnJlZSAqLwotc3RydWN0IHNzdF9oc3cgKnNzdF9oc3dfbmV3KHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgdTggKmZ3LCBzaXplX3QgZndfbGVuZ3RoLAotCXUzMiBmd19vZmZzZXQpOwotdm9pZCBzc3RfaHN3X2ZyZWUoc3RydWN0IHNzdF9oc3cgKmhzdyk7Ci1pbnQgc3N0X2hzd19md19nZXRfdmVyc2lvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCXN0cnVjdCBzc3RfaHN3X2lwY19md192ZXJzaW9uICp2ZXJzaW9uKTsKLXUzMiBjcmVhdGVfY2hhbm5lbF9tYXAoZW51bSBzc3RfaHN3X2NoYW5uZWxfY29uZmlnIGNvbmZpZyk7Ci0KLS8qIFN0cmVhbSBNaXhlciBDb250cm9scyAtICovCi1pbnQgc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB1MzIgc3RhZ2VfaWQsIHUzMiBjaGFubmVsLCB1MzIgdm9sdW1lKTsKLWludCBzc3RfaHN3X3N0cmVhbV9nZXRfdm9sdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3csCi0Jc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiBzdGFnZV9pZCwgdTMyIGNoYW5uZWwsIHUzMiAqdm9sdW1lKTsKLQotLyogR2xvYmFsIE1peGVyIENvbnRyb2xzIC0gKi8KLWludCBzc3RfaHN3X21peGVyX3NldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwKLQl1MzIgdm9sdW1lKTsKLWludCBzc3RfaHN3X21peGVyX2dldF92b2x1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywgdTMyIHN0YWdlX2lkLCB1MzIgY2hhbm5lbCwKLQl1MzIgKnZvbHVtZSk7Ci0KLS8qIFN0cmVhbSBBUEkgKi8KLXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3N0X2hzd19zdHJlYW1fbmV3KHN0cnVjdCBzc3RfaHN3ICpoc3csIGludCBpZCwKLQl1MzIgKCpnZXRfd3JpdGVfcG9zaXRpb24pKHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKSwKLQl2b2lkICpkYXRhKTsKLQotaW50IHNzdF9oc3dfc3RyZWFtX2ZyZWUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pOwotCi0vKiBTdHJlYW0gQ29uZmlndXJhdGlvbiAqLwotaW50IHNzdF9oc3dfc3RyZWFtX2Zvcm1hdChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKLQllbnVtIHNzdF9oc3dfc3RyZWFtX3BhdGhfaWQgcGF0aF9pZCwKLQllbnVtIHNzdF9oc3dfc3RyZWFtX3R5cGUgc3RyZWFtX3R5cGUsCi0JZW51bSBzc3RfaHN3X3N0cmVhbV9mb3JtYXQgZm9ybWF0X2lkKTsKLQotaW50IHNzdF9oc3dfc3RyZWFtX2J1ZmZlcihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKLQl1MzIgcmluZ19wdF9hZGRyZXNzLCB1MzIgbnVtX3BhZ2VzLAotCXUzMiByaW5nX3NpemUsIHUzMiByaW5nX29mZnNldCwgdTMyIHJpbmdfZmlyc3RfcGZuKTsKLQotaW50IHNzdF9oc3dfc3RyZWFtX2NvbW1pdChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7Ci0KLWludCBzc3RfaHN3X3N0cmVhbV9zZXRfdmFsaWQoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCi0JdTMyIGJpdHMpOwotaW50IHNzdF9oc3dfc3RyZWFtX3NldF9yYXRlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAotCWludCByYXRlKTsKLWludCBzc3RfaHN3X3N0cmVhbV9zZXRfYml0cyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LCBzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwKLQllbnVtIHNzdF9oc3dfYml0ZGVwdGggYml0cyk7Ci1pbnQgc3N0X2hzd19zdHJlYW1fc2V0X2NoYW5uZWxzKHN0cnVjdCBzc3RfaHN3ICpoc3csCi0Jc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIGludCBjaGFubmVscyk7Ci1pbnQgc3N0X2hzd19zdHJlYW1fc2V0X21hcF9jb25maWcoc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIG1hcCwKLQllbnVtIHNzdF9oc3dfY2hhbm5lbF9jb25maWcgY29uZmlnKTsKLWludCBzc3RfaHN3X3N0cmVhbV9zZXRfc3R5bGUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCi0JZW51bSBzc3RfaHN3X2ludGVybGVhdmluZyBzdHlsZSk7Ci1pbnQgc3N0X2hzd19zdHJlYW1fc2V0X21vZHVsZV9pbmZvKHN0cnVjdCBzc3RfaHN3ICpoc3csCi0Jc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUpOwotaW50IHNzdF9oc3dfc3RyZWFtX3NldF9wbWVtb3J5X2luZm8oc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIG9mZnNldCwgdTMyIHNpemUpOwotaW50IHNzdF9oc3dfc3RyZWFtX3NldF9zbWVtb3J5X2luZm8oc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyIG9mZnNldCwgdTMyIHNpemUpOwotc25kX3BjbV91ZnJhbWVzX3Qgc3N0X2hzd19zdHJlYW1fZ2V0X29sZF9wb3NpdGlvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKLXZvaWQgc3N0X2hzd19zdHJlYW1fc2V0X29sZF9wb3NpdGlvbihzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCBzbmRfcGNtX3VmcmFtZXNfdCB2YWwpOwotYm9vbCBzc3RfaHN3X3N0cmVhbV9nZXRfc2lsZW5jZV9zdGFydChzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCXN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKLXZvaWQgc3N0X2hzd19zdHJlYW1fc2V0X3NpbGVuY2Vfc3RhcnQoc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgYm9vbCB2YWwpOwotaW50IHNzdF9oc3dfbWl4ZXJfZ2V0X2luZm8oc3RydWN0IHNzdF9oc3cgKmhzdyk7Ci0KLS8qIFN0cmVhbSBBTFNBIHRyaWdnZXIgb3BlcmF0aW9ucyAqLwotaW50IHNzdF9oc3dfc3RyZWFtX3BhdXNlKHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLAotCWludCB3YWl0KTsKLWludCBzc3RfaHN3X3N0cmVhbV9yZXN1bWUoc3RydWN0IHNzdF9oc3cgKmhzdywgc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sCi0JaW50IHdhaXQpOwotaW50IHNzdF9oc3dfc3RyZWFtX3Jlc2V0KHN0cnVjdCBzc3RfaHN3ICpoc3csIHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtKTsKLQotLyogU3RyZWFtIHBvaW50ZXIgcG9zaXRpb25zICovCi1pbnQgc3N0X2hzd19zdHJlYW1fZ2V0X3JlYWRfcG9zKHN0cnVjdCBzc3RfaHN3ICpoc3csCi0Jc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0sIHUzMiAqcG9zaXRpb24pOwotaW50IHNzdF9oc3dfc3RyZWFtX2dldF93cml0ZV9wb3Moc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdTMyICpwb3NpdGlvbik7Ci11MzIgc3N0X2hzd19nZXRfZHNwX3Bvc2l0aW9uKHN0cnVjdCBzc3RfaHN3ICpoc3csCi0Jc3RydWN0IHNzdF9oc3dfc3RyZWFtICpzdHJlYW0pOwotdTY0IHNzdF9oc3dfZ2V0X2RzcF9wcmVzZW50YXRpb25fcG9zaXRpb24oc3RydWN0IHNzdF9oc3cgKmhzdywKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSk7Ci0KLS8qIEhXIHBvcnQgY29uZmlnICovCi1pbnQgc3N0X2hzd19kZXZpY2Vfc2V0X2NvbmZpZyhzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCWVudW0gc3N0X2hzd19kZXZpY2VfaWQgZGV2LCBlbnVtIHNzdF9oc3dfZGV2aWNlX21jbGsgbWNsaywKLQllbnVtIHNzdF9oc3dfZGV2aWNlX21vZGUgbW9kZSwgdTMyIGNsb2NrX2RpdmlkZXIpOwotCi0vKiBEWCBDb25maWcgKi8KLWludCBzc3RfaHN3X2R4X3NldF9zdGF0ZShzdHJ1Y3Qgc3N0X2hzdyAqaHN3LAotCWVudW0gc3N0X2hzd19keF9zdGF0ZSBzdGF0ZSwgc3RydWN0IHNzdF9oc3dfaXBjX2R4X3JlcGx5ICpkeCk7Ci0KLS8qIGluaXQgKi8KLWludCBzc3RfaHN3X2RzcF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOwotdm9pZCBzc3RfaHN3X2RzcF9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEpOwotc3RydWN0IHNzdF9kc3AgKnNzdF9oc3dfZ2V0X2RzcChzdHJ1Y3Qgc3N0X2hzdyAqaHN3KTsKLQotLyogcnVudGltZSBtb2R1bGUgbWFuYWdlbWVudCAqLwotc3RydWN0IHNzdF9tb2R1bGVfcnVudGltZSAqc3N0X2hzd19ydW50aW1lX21vZHVsZV9jcmVhdGUoc3RydWN0IHNzdF9oc3cgKmhzdywKLQlpbnQgbW9kX2lkLCBpbnQgb2Zmc2V0KTsKLXZvaWQgc3N0X2hzd19ydW50aW1lX21vZHVsZV9mcmVlKHN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWUgKnJ1bnRpbWUpOwotCi0vKiBQTSAqLwotaW50IHNzdF9oc3dfZHNwX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBzc3RfaHN3ICpoc3cpOwotaW50IHNzdF9oc3dfZHNwX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3Qgc3N0X2hzdyAqaHN3KTsKLWludCBzc3RfaHN3X2RzcF9sb2FkKHN0cnVjdCBzc3RfaHN3ICpoc3cpOwotaW50IHNzdF9oc3dfZHNwX3J1bnRpbWVfc2xlZXAoc3RydWN0IHNzdF9oc3cgKmhzdyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLXBjbS5jIGIvc291bmQvc29jL2ludGVsL3NzdC1oYXN3ZWxsLXBjbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTIxZThmLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9zc3QtaGFzd2VsbC1wY20uYworKysgL2Rldi9udWxsCkBAIC0xLDEyNzcgKzAsMCBAQAotLyoKLSAqIEludGVsIFNTVCBIYXN3ZWxsL0Jyb2Fkd2VsbCBQQ00gU3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgotICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+Ci0jaW5jbHVkZSA8c291bmQvZG1hZW5naW5lX3BjbS5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgotI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgotCi0jaW5jbHVkZSAic3N0LWhhc3dlbGwtaXBjLmgiCi0jaW5jbHVkZSAic3N0LWRzcC1wcml2LmgiCi0jaW5jbHVkZSAic3N0LWRzcC5oIgotCi0jZGVmaW5lIEhTV19QQ01fQ09VTlQJCTYKLSNkZWZpbmUgSFNXX1ZPTFVNRV9NQVgJCTB4N0ZGRkZGRkYJLyogMGRCICovCi0KLSNkZWZpbmUgU1NUX09MRF9QT1NJVElPTihkLCByLCBvKSAoKGQpICsJCVwKLQkJCWZyYW1lc190b19ieXRlcyhyLCBvKSkKLSNkZWZpbmUgU1NUX1NBTVBMRVMociwgeCkgKGJ5dGVzX3RvX3NhbXBsZXMociwJXAotCQkJZnJhbWVzX3RvX2J5dGVzKHIsICh4KSkpKQotCi0vKiBzaW1wbGUgdm9sdW1lIHRhYmxlICovCi1zdGF0aWMgY29uc3QgdTMyIHZvbHVtZV9tYXBbXSA9IHsKLQlIU1dfVk9MVU1FX01BWCA+PiAzMCwKLQlIU1dfVk9MVU1FX01BWCA+PiAyOSwKLQlIU1dfVk9MVU1FX01BWCA+PiAyOCwKLQlIU1dfVk9MVU1FX01BWCA+PiAyNywKLQlIU1dfVk9MVU1FX01BWCA+PiAyNiwKLQlIU1dfVk9MVU1FX01BWCA+PiAyNSwKLQlIU1dfVk9MVU1FX01BWCA+PiAyNCwKLQlIU1dfVk9MVU1FX01BWCA+PiAyMywKLQlIU1dfVk9MVU1FX01BWCA+PiAyMiwKLQlIU1dfVk9MVU1FX01BWCA+PiAyMSwKLQlIU1dfVk9MVU1FX01BWCA+PiAyMCwKLQlIU1dfVk9MVU1FX01BWCA+PiAxOSwKLQlIU1dfVk9MVU1FX01BWCA+PiAxOCwKLQlIU1dfVk9MVU1FX01BWCA+PiAxNywKLQlIU1dfVk9MVU1FX01BWCA+PiAxNiwKLQlIU1dfVk9MVU1FX01BWCA+PiAxNSwKLQlIU1dfVk9MVU1FX01BWCA+PiAxNCwKLQlIU1dfVk9MVU1FX01BWCA+PiAxMywKLQlIU1dfVk9MVU1FX01BWCA+PiAxMiwKLQlIU1dfVk9MVU1FX01BWCA+PiAxMSwKLQlIU1dfVk9MVU1FX01BWCA+PiAxMCwKLQlIU1dfVk9MVU1FX01BWCA+PiA5LAotCUhTV19WT0xVTUVfTUFYID4+IDgsCi0JSFNXX1ZPTFVNRV9NQVggPj4gNywKLQlIU1dfVk9MVU1FX01BWCA+PiA2LAotCUhTV19WT0xVTUVfTUFYID4+IDUsCi0JSFNXX1ZPTFVNRV9NQVggPj4gNCwKLQlIU1dfVk9MVU1FX01BWCA+PiAzLAotCUhTV19WT0xVTUVfTUFYID4+IDIsCi0JSFNXX1ZPTFVNRV9NQVggPj4gMSwKLQlIU1dfVk9MVU1FX01BWCA+PiAwLAotfTsKLQotI2RlZmluZSBIU1dfUENNX1BFUklPRFNfTUFYCTY0Ci0jZGVmaW5lIEhTV19QQ01fUEVSSU9EU19NSU4JMgotCi0jZGVmaW5lIEhTV19QQ01fREFJX0lEX1NZU1RFTQkwCi0jZGVmaW5lIEhTV19QQ01fREFJX0lEX09GRkxPQUQwCTEKLSNkZWZpbmUgSFNXX1BDTV9EQUlfSURfT0ZGTE9BRDEJMgotI2RlZmluZSBIU1dfUENNX0RBSV9JRF9MT09QQkFDSwkzCi0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIGhzd19wY21faGFyZHdhcmUgPSB7Ci0JLmluZm8JCQk9IFNORFJWX1BDTV9JTkZPX01NQVAgfAotCQkJCSAgU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8Ci0JCQkJICBTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQkJICBTTkRSVl9QQ01fSU5GT19QQVVTRSB8Ci0JCQkJICBTTkRSVl9QQ01fSU5GT19SRVNVTUUgfAotCQkJCSAgU05EUlZfUENNX0lORk9fTk9fUEVSSU9EX1dBS0VVUCB8Ci0JCQkJICBTTkRSVl9QQ01fSU5GT19EUkFJTl9UUklHR0VSLAotCS5mb3JtYXRzCQk9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfAotCQkJCSAgU05EUlZfUENNX0ZNVEJJVF9TMzJfTEUsCi0JLnBlcmlvZF9ieXRlc19taW4JPSBQQUdFX1NJWkUsCi0JLnBlcmlvZF9ieXRlc19tYXgJPSAoSFNXX1BDTV9QRVJJT0RTX01BWCAvIEhTV19QQ01fUEVSSU9EU19NSU4pICogUEFHRV9TSVpFLAotCS5wZXJpb2RzX21pbgkJPSBIU1dfUENNX1BFUklPRFNfTUlOLAotCS5wZXJpb2RzX21heAkJPSBIU1dfUENNX1BFUklPRFNfTUFYLAotCS5idWZmZXJfYnl0ZXNfbWF4CT0gSFNXX1BDTV9QRVJJT0RTX01BWCAqIFBBR0VfU0laRSwKLX07Ci0KLXN0cnVjdCBoc3dfcGNtX21vZHVsZV9tYXAgewotCWludCBkYWlfaWQ7Ci0JaW50IHN0cmVhbTsKLQllbnVtIHNzdF9oc3dfbW9kdWxlX2lkIG1vZF9pZDsKLX07Ci0KLS8qIHByaXZhdGUgZGF0YSBmb3IgZWFjaCBQQ00gRFNQIHN0cmVhbSAqLwotc3RydWN0IGhzd19wY21fZGF0YSB7Ci0JaW50IGRhaV9pZDsKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbTsKLQlzdHJ1Y3Qgc3N0X21vZHVsZV9ydW50aW1lICpydW50aW1lOwotCXN0cnVjdCBzc3RfbW9kdWxlX3J1bnRpbWVfY29udGV4dCBjb250ZXh0OwotCXN0cnVjdCBzbmRfcGNtICpoc3dfcGNtOwotCXUzMiB2b2x1bWVbMl07Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07Ci0Jc3RydWN0IHNuZF9jb21wcl9zdHJlYW0gKmNzdHJlYW07Ci0JdW5zaWduZWQgaW50IHdwb3M7Ci0Jc3RydWN0IG11dGV4IG11dGV4OwotCWJvb2wgYWxsb2NhdGVkOwotCWludCBwZXJzaXN0ZW50X29mZnNldDsKLX07Ci0KLWVudW0gaHN3X3BtX3N0YXRlIHsKLQlIU1dfUE1fU1RBVEVfRDAgPSAwLAotCUhTV19QTV9TVEFURV9SVEQzID0gMSwKLQlIU1dfUE1fU1RBVEVfRDMgPSAyLAotfTsKLQotLyogcHJpdmF0ZSBkYXRhIGZvciB0aGUgZHJpdmVyICovCi1zdHJ1Y3QgaHN3X3ByaXZfZGF0YSB7Ci0JLyogcnVudGltZSBEU1AgKi8KLQlzdHJ1Y3Qgc3N0X2hzdyAqaHN3OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQllbnVtIGhzd19wbV9zdGF0ZSBwbV9zdGF0ZTsKLQlzdHJ1Y3Qgc25kX3NvY19jYXJkICpzb2NfY2FyZDsKLQotCS8qIHBhZ2UgdGFibGVzICovCi0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyIGRtYWJbSFNXX1BDTV9DT1VOVF1bMl07Ci0KLQkvKiBEQUkgZGF0YSAqLwotCXN0cnVjdCBoc3dfcGNtX2RhdGEgcGNtW0hTV19QQ01fQ09VTlRdWzJdOwotfTsKLQotCi0vKiBzdGF0aWMgbWFwcGluZ3MgYmV0d2VlbiBQQ01zIGFuZCBtb2R1bGVzIC0gbWF5IGJlIGR5bmFtaWMgaW4gZnV0dXJlICovCi1zdGF0aWMgc3RydWN0IGhzd19wY21fbW9kdWxlX21hcCBtb2RfbWFwW10gPSB7Ci0Je0hTV19QQ01fREFJX0lEX1NZU1RFTSwgMCwgU1NUX0hTV19NT0RVTEVfUENNX1NZU1RFTX0sCi0Je0hTV19QQ01fREFJX0lEX09GRkxPQUQwLCAwLCBTU1RfSFNXX01PRFVMRV9QQ019LAotCXtIU1dfUENNX0RBSV9JRF9PRkZMT0FEMSwgMCwgU1NUX0hTV19NT0RVTEVfUENNfSwKLQl7SFNXX1BDTV9EQUlfSURfTE9PUEJBQ0ssIDEsIFNTVF9IU1dfTU9EVUxFX1BDTV9SRUZFUkVOQ0V9LAotCXtIU1dfUENNX0RBSV9JRF9TWVNURU0sIDEsIFNTVF9IU1dfTU9EVUxFX1BDTV9DQVBUVVJFfSwKLX07Ci0KLXN0YXRpYyB1MzIgaHN3X25vdGlmeV9wb2ludGVyKHN0cnVjdCBzc3RfaHN3X3N0cmVhbSAqc3RyZWFtLCB2b2lkICpkYXRhKTsKLQotc3RhdGljIGlubGluZSB1MzIgaHN3X21peGVyX3RvX2lwYyh1bnNpZ25lZCBpbnQgdmFsdWUpCi17Ci0JaWYgKHZhbHVlID49IEFSUkFZX1NJWkUodm9sdW1lX21hcCkpCi0JCXJldHVybiB2b2x1bWVfbWFwWzBdOwotCWVsc2UKLQkJcmV0dXJuIHZvbHVtZV9tYXBbdmFsdWVdOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBoc3dfaXBjX3RvX21peGVyKHUzMiB2YWx1ZSkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZvbHVtZV9tYXApOyBpKyspIHsKLQkJaWYgKHZvbHVtZV9tYXBbaV0gPj0gdmFsdWUpCi0JCQlyZXR1cm4gaTsKLQl9Ci0KLQlyZXR1cm4gaSAtIDE7Ci19Ci0KLXN0YXRpYyBpbnQgaHN3X3N0cmVhbV92b2x1bWVfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9zb2Nfa2NvbnRyb2xfcGxhdGZvcm0oa2NvbnRyb2wpOwotCXN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqbWMgPQotCQkoc3RydWN0IHNvY19taXhlcl9jb250cm9sICopa2NvbnRyb2wtPnByaXZhdGVfdmFsdWU7Ci0Jc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KLQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7Ci0Jc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGE7Ci0Jc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7Ci0JdTMyIHZvbHVtZTsKLQlpbnQgZGFpLCBzdHJlYW07Ci0KLQlkYWkgPSBtb2RfbWFwW21jLT5yZWddLmRhaV9pZDsKLQlzdHJlYW0gPSBtb2RfbWFwW21jLT5yZWddLnN0cmVhbTsKLQlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW2RhaV1bc3RyZWFtXTsKLQotCW11dGV4X2xvY2soJnBjbV9kYXRhLT5tdXRleCk7Ci0JcG1fcnVudGltZV9nZXRfc3luYyhwZGF0YS0+ZGV2KTsKLQotCWlmICghcGNtX2RhdGEtPnN0cmVhbSkgewotCQlwY21fZGF0YS0+dm9sdW1lWzBdID0KLQkJCWhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCQlwY21fZGF0YS0+dm9sdW1lWzFdID0KLQkJCWhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pOwotCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBkYXRhLT5kZXYpOwotCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwZGF0YS0+ZGV2KTsKLQkJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0KLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIHsKLQkJdm9sdW1lID0gaHN3X21peGVyX3RvX2lwYyh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSk7Ci0JCS8qIGFwcGx5IHZvbHVtZSB2YWx1ZSB0byBhbGwgY2hhbm5lbHMgKi8KLQkJc3N0X2hzd19zdHJlYW1fc2V0X3ZvbHVtZShoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDAsIFNTVF9IU1dfQ0hBTk5FTFNfQUxMLCB2b2x1bWUpOwotCX0gZWxzZSB7Ci0JCXZvbHVtZSA9IGhzd19taXhlcl90b19pcGModWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0pOwotCQlzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCwgMCwgdm9sdW1lKTsKLQkJdm9sdW1lID0gaHN3X21peGVyX3RvX2lwYyh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSk7Ci0JCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAxLCB2b2x1bWUpOwotCX0KLQotCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kocGRhdGEtPmRldik7Ci0JcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQocGRhdGEtPmRldik7Ci0JbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhzd19zdHJlYW1fdm9sdW1lX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKLQkJCQlzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0gPSBzbmRfc29jX2tjb250cm9sX3BsYXRmb3JtKGtjb250cm9sKTsKLQlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgKm1jID0KLQkJKHN0cnVjdCBzb2NfbWl4ZXJfY29udHJvbCAqKWtjb250cm9sLT5wcml2YXRlX3ZhbHVlOwotCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9Ci0JCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOwotCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhOwotCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OwotCXUzMiB2b2x1bWU7Ci0JaW50IGRhaSwgc3RyZWFtOwotCi0JZGFpID0gbW9kX21hcFttYy0+cmVnXS5kYWlfaWQ7Ci0Jc3RyZWFtID0gbW9kX21hcFttYy0+cmVnXS5zdHJlYW07Ci0JcGNtX2RhdGEgPSAmcGRhdGEtPnBjbVtkYWldW3N0cmVhbV07Ci0KLQltdXRleF9sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOwotCXBtX3J1bnRpbWVfZ2V0X3N5bmMocGRhdGEtPmRldik7Ci0KLQlpZiAoIXBjbV9kYXRhLT5zdHJlYW0pIHsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPQotCQkJaHN3X2lwY190b19taXhlcihwY21fZGF0YS0+dm9sdW1lWzBdKTsKLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gPQotCQkJaHN3X2lwY190b19taXhlcihwY21fZGF0YS0+dm9sdW1lWzFdKTsKLQkJcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShwZGF0YS0+ZGV2KTsKLQkJcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQocGRhdGEtPmRldik7Ci0JCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc3N0X2hzd19zdHJlYW1fZ2V0X3ZvbHVtZShoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDAsIDAsICZ2b2x1bWUpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gaHN3X2lwY190b19taXhlcih2b2x1bWUpOwotCXNzdF9oc3dfc3RyZWFtX2dldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLCAxLCAmdm9sdW1lKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IGhzd19pcGNfdG9fbWl4ZXIodm9sdW1lKTsKLQotCXBtX3J1bnRpbWVfbWFya19sYXN0X2J1c3kocGRhdGEtPmRldik7Ci0JcG1fcnVudGltZV9wdXRfYXV0b3N1c3BlbmQocGRhdGEtPmRldik7Ci0JbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaHN3X3ZvbHVtZV9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCi0JCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gc25kX3NvY19rY29udHJvbF9wbGF0Zm9ybShrY29udHJvbCk7Ci0Jc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0gc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7Ci0Jc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7Ci0JdTMyIHZvbHVtZTsKLQotCXBtX3J1bnRpbWVfZ2V0X3N5bmMocGRhdGEtPmRldik7Ci0KLQlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0KLQkJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMV0pIHsKLQotCQl2b2x1bWUgPSBoc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQkJc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKGhzdywgMCwgU1NUX0hTV19DSEFOTkVMU19BTEwsIHZvbHVtZSk7Ci0KLQl9IGVsc2UgewotCQl2b2x1bWUgPSBoc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdKTsKLQkJc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKGhzdywgMCwgMCwgdm9sdW1lKTsKLQotCQl2b2x1bWUgPSBoc3dfbWl4ZXJfdG9faXBjKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdKTsKLQkJc3N0X2hzd19taXhlcl9zZXRfdm9sdW1lKGhzdywgMCwgMSwgdm9sdW1lKTsKLQl9Ci0KLQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBkYXRhLT5kZXYpOwotCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHBkYXRhLT5kZXYpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhzd192b2x1bWVfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAotCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQotewotCXN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSA9IHNuZF9zb2Nfa2NvbnRyb2xfcGxhdGZvcm0oa2NvbnRyb2wpOwotCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9IHNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocGxhdGZvcm0pOwotCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OwotCXVuc2lnbmVkIGludCB2b2x1bWUgPSAwOwotCi0JcG1fcnVudGltZV9nZXRfc3luYyhwZGF0YS0+ZGV2KTsKLQlzc3RfaHN3X21peGVyX2dldF92b2x1bWUoaHN3LCAwLCAwLCAmdm9sdW1lKTsKLQl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IGhzd19pcGNfdG9fbWl4ZXIodm9sdW1lKTsKLQotCXNzdF9oc3dfbWl4ZXJfZ2V0X3ZvbHVtZShoc3csIDAsIDEsICZ2b2x1bWUpOwotCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzFdID0gaHN3X2lwY190b19taXhlcih2b2x1bWUpOwotCi0JcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShwZGF0YS0+ZGV2KTsKLQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwZGF0YS0+ZGV2KTsKLQlyZXR1cm4gMDsKLX0KLQotLyogVExWIHVzZWQgYnkgYm90aCBnbG9iYWwgYW5kIHN0cmVhbSB2b2x1bWVzICovCi1zdGF0aWMgY29uc3QgREVDTEFSRV9UTFZfREJfU0NBTEUoaHN3X3ZvbF90bHYsIC05MDAwLCAzMDAsIDEpOwotCi0vKiBTeXN0ZW0gUGluIGhhcyBubyB2b2x1bWUgY29udHJvbCAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGhzd192b2x1bWVfY29udHJvbHNbXSA9IHsKLQkvKiBHbG9iYWwgRFNQIHZvbHVtZSAqLwotCVNPQ19ET1VCTEVfRVhUX1RMVigiTWFzdGVyIFBsYXliYWNrIFZvbHVtZSIsIDAsIDAsIDgsCi0JCUFSUkFZX1NJWkUodm9sdW1lX21hcCkgLSAxLCAwLAotCQloc3dfdm9sdW1lX2dldCwgaHN3X3ZvbHVtZV9wdXQsIGhzd192b2xfdGx2KSwKLQkvKiBPZmZsb2FkIDAgdm9sdW1lICovCi0JU09DX0RPVUJMRV9FWFRfVExWKCJNZWRpYTAgUGxheWJhY2sgVm9sdW1lIiwgMSwgMCwgOCwKLQkJQVJSQVlfU0laRSh2b2x1bWVfbWFwKSAtIDEsIDAsCi0JCWhzd19zdHJlYW1fdm9sdW1lX2dldCwgaHN3X3N0cmVhbV92b2x1bWVfcHV0LCBoc3dfdm9sX3RsdiksCi0JLyogT2ZmbG9hZCAxIHZvbHVtZSAqLwotCVNPQ19ET1VCTEVfRVhUX1RMVigiTWVkaWExIFBsYXliYWNrIFZvbHVtZSIsIDIsIDAsIDgsCi0JCUFSUkFZX1NJWkUodm9sdW1lX21hcCkgLSAxLCAwLAotCQloc3dfc3RyZWFtX3ZvbHVtZV9nZXQsIGhzd19zdHJlYW1fdm9sdW1lX3B1dCwgaHN3X3ZvbF90bHYpLAotCS8qIE1pYyBDYXB0dXJlIHZvbHVtZSAqLwotCVNPQ19ET1VCTEVfRVhUX1RMVigiTWljIENhcHR1cmUgVm9sdW1lIiwgNCwgMCwgOCwKLQkJQVJSQVlfU0laRSh2b2x1bWVfbWFwKSAtIDEsIDAsCi0JCWhzd19zdHJlYW1fdm9sdW1lX2dldCwgaHN3X3N0cmVhbV92b2x1bWVfcHV0LCBoc3dfdm9sX3RsdiksCi19OwotCi0vKiBDcmVhdGUgRE1BIGJ1ZmZlciBwYWdlIHRhYmxlIGZvciBEU1AgKi8KLXN0YXRpYyBpbnQgY3JlYXRlX2Fkc3BfcGFnZV90YWJsZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcGRhdGEsIHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQsCi0JdW5zaWduZWQgY2hhciAqZG1hX2FyZWEsIHNpemVfdCBzaXplLCBpbnQgcGNtKQotewotCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqZG1hYiA9IHNuZF9wY21fZ2V0X2RtYV9idWYoc3Vic3RyZWFtKTsKLQlpbnQgaSwgcGFnZXMsIHN0cmVhbSA9IHN1YnN0cmVhbS0+c3RyZWFtOwotCi0JcGFnZXMgPSBzbmRfc2didWZfYWxpZ25lZF9wYWdlcyhzaXplKTsKLQotCWRldl9kYmcocnRkLT5kZXYsICJnZW5lcmF0aW5nIHBhZ2UgdGFibGUgZm9yICVwIHNpemUgMHglenUgcGFnZXMgJWRcbiIsCi0JCWRtYV9hcmVhLCBzaXplLCBwYWdlcyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGFnZXM7IGkrKykgewotCQl1MzIgaWR4ID0gKCgoaSA8PCAyKSArIGkpKSA+PiAxOwotCQl1MzIgcGZuID0gc25kX3NnYnVmX2dldF9hZGRyKGRtYWIsIGkgKiBQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7Ci0JCXUzMiAqcGdfdGFibGU7Ci0KLQkJZGV2X2RiZyhydGQtPmRldiwgInBmbiBpICVpIGlkeCAlZCBwZm4gJXhcbiIsIGksIGlkeCwgcGZuKTsKLQotCQlwZ190YWJsZSA9ICh1MzIgKikocGRhdGEtPmRtYWJbcGNtXVtzdHJlYW1dLmFyZWEgKyBpZHgpOwotCi0JCWlmIChpICYgMSkKLQkJCSpwZ190YWJsZSB8PSAocGZuIDw8IDQpOwotCQllbHNlCi0JCQkqcGdfdGFibGUgfD0gcGZuOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKiB0aGlzIG1heSBnZXQgY2FsbGVkIHNldmVyYWwgdGltZXMgYnkgb3NzIGVtdWxhdGlvbiAqLwotc3RhdGljIGludCBoc3dfcGNtX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCSAgICAgIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3BjbV9ydW50aW1lICpydW50aW1lID0gc3Vic3RyZWFtLT5ydW50aW1lOwotCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9Ci0JCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7Ci0Jc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGE7Ci0Jc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7Ci0Jc3RydWN0IHNzdF9tb2R1bGUgKm1vZHVsZV9kYXRhOwotCXN0cnVjdCBzc3RfZHNwICpkc3A7Ci0Jc3RydWN0IHNuZF9kbWFfYnVmZmVyICpkbWFiOwotCWVudW0gc3N0X2hzd19zdHJlYW1fdHlwZSBzdHJlYW1fdHlwZTsKLQllbnVtIHNzdF9oc3dfc3RyZWFtX3BhdGhfaWQgcGF0aF9pZDsKLQl1MzIgcmF0ZSwgYml0cywgbWFwLCBwYWdlcywgbW9kdWxlX2lkOwotCXU4IGNoYW5uZWxzOwotCWludCByZXQsIGRhaTsKLQotCWRhaSA9IG1vZF9tYXBbcnRkLT5jcHVfZGFpLT5pZF0uZGFpX2lkOwotCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bZGFpXVtzdWJzdHJlYW0tPnN0cmVhbV07Ci0KLQkvKiBjaGVjayBpZiB3ZSBhcmUgYmVpbmcgY2FsbGVkIGEgc3Vic2VxdWVudCB0aW1lICovCi0JaWYgKHBjbV9kYXRhLT5hbGxvY2F0ZWQpIHsKLQkJcmV0ID0gc3N0X2hzd19zdHJlYW1fcmVzZXQoaHN3LCBwY21fZGF0YS0+c3RyZWFtKTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiZXJyb3I6IHJlc2V0IHN0cmVhbSBmYWlsZWQgJWRcbiIsCi0JCQkJcmV0KTsKLQotCQlyZXQgPSBzc3RfaHN3X3N0cmVhbV9mcmVlKGhzdywgcGNtX2RhdGEtPnN0cmVhbSk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZyZWUgc3RyZWFtIGZhaWxlZCAlZFxuIiwKLQkJCQlyZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlwY21fZGF0YS0+YWxsb2NhdGVkID0gZmFsc2U7Ci0KLQkJcGNtX2RhdGEtPnN0cmVhbSA9IHNzdF9oc3dfc3RyZWFtX25ldyhoc3csIHJ0ZC0+Y3B1X2RhaS0+aWQsCi0JCQloc3dfbm90aWZ5X3BvaW50ZXIsIHBjbV9kYXRhKTsKLQkJaWYgKHBjbV9kYXRhLT5zdHJlYW0gPT0gTlVMTCkgewotCQkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbVxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCS8qIHN0cmVhbSBkaXJlY3Rpb24gKi8KLQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKLQkJcGF0aF9pZCA9IFNTVF9IU1dfU1RSRUFNX1BBVEhfU1NQMF9PVVQ7Ci0JZWxzZQotCQlwYXRoX2lkID0gU1NUX0hTV19TVFJFQU1fUEFUSF9TU1AwX0lOOwotCi0JLyogRFNQIHN0cmVhbSB0eXBlIGRlcGVuZHMgb24gREFJIElEICovCi0Jc3dpdGNoIChydGQtPmNwdV9kYWktPmlkKSB7Ci0JY2FzZSAwOgotCQlpZiAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykgewotCQkJc3RyZWFtX3R5cGUgPSBTU1RfSFNXX1NUUkVBTV9UWVBFX1NZU1RFTTsKLQkJCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTV9TWVNURU07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdHJlYW1fdHlwZSA9IFNTVF9IU1dfU1RSRUFNX1RZUEVfQ0FQVFVSRTsKLQkJCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTV9DQVBUVVJFOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgMToKLQljYXNlIDI6Ci0JCXN0cmVhbV90eXBlID0gU1NUX0hTV19TVFJFQU1fVFlQRV9SRU5ERVI7Ci0JCW1vZHVsZV9pZCA9IFNTVF9IU1dfTU9EVUxFX1BDTTsKLQkJYnJlYWs7Ci0JY2FzZSAzOgotCQkvKiBwYXRoIElEIG5lZWRzIHRvIGJlIE9VVCBmb3IgbG9vcGJhY2sgKi8KLQkJc3RyZWFtX3R5cGUgPSBTU1RfSFNXX1NUUkVBTV9UWVBFX0xPT1BCQUNLOwotCQlwYXRoX2lkID0gU1NUX0hTV19TVFJFQU1fUEFUSF9TU1AwX09VVDsKLQkJbW9kdWxlX2lkID0gU1NUX0hTV19NT0RVTEVfUENNX1JFRkVSRU5DRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBpbnZhbGlkIERBSSBJRCAlZFxuIiwKLQkJCXJ0ZC0+Y3B1X2RhaS0+aWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9OwotCi0JcmV0ID0gc3N0X2hzd19zdHJlYW1fZm9ybWF0KGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKLQkJcGF0aF9pZCwgc3RyZWFtX3R5cGUsIFNTVF9IU1dfU1RSRUFNX0ZPUk1BVF9QQ01fRk9STUFUKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBzZXQgZm9ybWF0ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOwotCXJldCA9IHNzdF9oc3dfc3RyZWFtX3NldF9yYXRlKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgcmF0ZSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBjb3VsZCBub3Qgc2V0IHJhdGUgJWRcbiIsIHJhdGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXN3aXRjaCAocGFyYW1zX2Zvcm1hdChwYXJhbXMpKSB7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MxNl9MRToKLQkJYml0cyA9IFNTVF9IU1dfREVQVEhfMTZCSVQ7Ci0JCXNzdF9oc3dfc3RyZWFtX3NldF92YWxpZChoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDE2KTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MyNF9MRToKLQkJYml0cyA9IFNTVF9IU1dfREVQVEhfMzJCSVQ7Ci0JCXNzdF9oc3dfc3RyZWFtX3NldF92YWxpZChoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDI0KTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1M4OgotCQliaXRzID0gU1NUX0hTV19ERVBUSF84QklUOwotCQlzc3RfaHN3X3N0cmVhbV9zZXRfdmFsaWQoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCA4KTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fRk9STUFUX1MzMl9MRToKLQkJYml0cyA9IFNTVF9IU1dfREVQVEhfMzJCSVQ7Ci0JCXNzdF9oc3dfc3RyZWFtX3NldF92YWxpZChoc3csIHBjbV9kYXRhLT5zdHJlYW0sIDMyKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBpbnZhbGlkIGZvcm1hdCAlZFxuIiwKLQkJCXBhcmFtc19mb3JtYXQocGFyYW1zKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldCA9IHNzdF9oc3dfc3RyZWFtX3NldF9iaXRzKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgYml0cyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBjb3VsZCBub3Qgc2V0IGJpdHMgJWRcbiIsIGJpdHMpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKHBhcmFtcyk7Ci0JbWFwID0gY3JlYXRlX2NoYW5uZWxfbWFwKFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfU1RFUkVPKTsKLQlzc3RfaHN3X3N0cmVhbV9zZXRfbWFwX2NvbmZpZyhoc3csIHBjbV9kYXRhLT5zdHJlYW0sCi0JCQltYXAsIFNTVF9IU1dfQ0hBTk5FTF9DT05GSUdfU1RFUkVPKTsKLQotCXJldCA9IHNzdF9oc3dfc3RyZWFtX3NldF9jaGFubmVscyhoc3csIHBjbV9kYXRhLT5zdHJlYW0sIGNoYW5uZWxzKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGNvdWxkIG5vdCBzZXQgY2hhbm5lbHMgJWRcbiIsCi0JCQljaGFubmVscyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgUENNICVkXG4iLAotCQkJcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWRtYWIgPSBzbmRfcGNtX2dldF9kbWFfYnVmKHN1YnN0cmVhbSk7Ci0KLQlyZXQgPSBjcmVhdGVfYWRzcF9wYWdlX3RhYmxlKHN1YnN0cmVhbSwgcGRhdGEsIHJ0ZCwgcnVudGltZS0+ZG1hX2FyZWEsCi0JCXJ1bnRpbWUtPmRtYV9ieXRlcywgcnRkLT5jcHVfZGFpLT5pZCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlzc3RfaHN3X3N0cmVhbV9zZXRfc3R5bGUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLAotCQlTU1RfSFNXX0lOVEVSTEVBVklOR19QRVJfQ0hBTk5FTCk7Ci0KLQlpZiAocnVudGltZS0+ZG1hX2J5dGVzICUgUEFHRV9TSVpFKQotCQlwYWdlcyA9IChydW50aW1lLT5kbWFfYnl0ZXMgLyBQQUdFX1NJWkUpICsgMTsKLQllbHNlCi0JCXBhZ2VzID0gcnVudGltZS0+ZG1hX2J5dGVzIC8gUEFHRV9TSVpFOwotCi0JcmV0ID0gc3N0X2hzd19zdHJlYW1fYnVmZmVyKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwKLQkJcGRhdGEtPmRtYWJbcnRkLT5jcHVfZGFpLT5pZF1bc3Vic3RyZWFtLT5zdHJlYW1dLmFkZHIsCi0JCXBhZ2VzLCBydW50aW1lLT5kbWFfYnl0ZXMsIDAsCi0JCXNuZF9zZ2J1Zl9nZXRfYWRkcihkbWFiLCAwKSA+PiBQQUdFX1NISUZUKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBzZXQgRE1BIGJ1ZmZlciAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlkc3AgPSBzc3RfaHN3X2dldF9kc3AoaHN3KTsKLQotCW1vZHVsZV9kYXRhID0gc3N0X21vZHVsZV9nZXRfZnJvbV9pZChkc3AsIG1vZHVsZV9pZCk7Ci0JaWYgKG1vZHVsZV9kYXRhID09IE5VTEwpIHsKLQkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gZ2V0IG1vZHVsZSBjb25maWdcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlzc3RfaHN3X3N0cmVhbV9zZXRfbW9kdWxlX2luZm8oaHN3LCBwY21fZGF0YS0+c3RyZWFtLAotCQlwY21fZGF0YS0+cnVudGltZSk7Ci0KLQlyZXQgPSBzc3RfaHN3X3N0cmVhbV9jb21taXQoaHN3LCBwY21fZGF0YS0+c3RyZWFtKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZXJyb3I6IGZhaWxlZCB0byBjb21taXQgc3RyZWFtICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmICghcGNtX2RhdGEtPmFsbG9jYXRlZCkgewotCQkvKiBTZXQgcHJldmlvdXMgc2F2ZWQgdm9sdW1lICovCi0JCXNzdF9oc3dfc3RyZWFtX3NldF92b2x1bWUoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwLAotCQkJCTAsIHBjbV9kYXRhLT52b2x1bWVbMF0pOwotCQlzc3RfaHN3X3N0cmVhbV9zZXRfdm9sdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCwKLQkJCQkxLCBwY21fZGF0YS0+dm9sdW1lWzFdKTsKLQkJcGNtX2RhdGEtPmFsbG9jYXRlZCA9IHRydWU7Ci0JfQotCi0JcmV0ID0gc3N0X2hzd19zdHJlYW1fcGF1c2UoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAxKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihydGQtPmRldiwgImVycm9yOiBmYWlsZWQgdG8gcGF1c2UgJWRcbiIsIHJldCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBoc3dfcGNtX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc25kX3BjbV9saWJfZnJlZV9wYWdlcyhzdWJzdHJlYW0pOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhzd19wY21fdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwgaW50IGNtZCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KLQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKLQlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YTsKLQlzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnNzdF9zdHJlYW07Ci0Jc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlzbmRfcGNtX3VmcmFtZXNfdCBwb3M7Ci0JaW50IGRhaTsKLQotCWRhaSA9IG1vZF9tYXBbcnRkLT5jcHVfZGFpLT5pZF0uZGFpX2lkOwotCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bZGFpXVtzdWJzdHJlYW0tPnN0cmVhbV07Ci0Jc3N0X3N0cmVhbSA9IHBjbV9kYXRhLT5zdHJlYW07Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9SRUxFQVNFOgotCQlzc3RfaHN3X3N0cmVhbV9zZXRfc2lsZW5jZV9zdGFydChoc3csIHNzdF9zdHJlYW0sIGZhbHNlKTsKLQkJc3N0X2hzd19zdHJlYW1fcmVzdW1lKGhzdywgcGNtX2RhdGEtPnN0cmVhbSwgMCk7Ci0JCWJyZWFrOwotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RPUDoKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NVU1BFTkQ6Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCQlzc3RfaHN3X3N0cmVhbV9zZXRfc2lsZW5jZV9zdGFydChoc3csIHNzdF9zdHJlYW0sIGZhbHNlKTsKLQkJc3N0X2hzd19zdHJlYW1fcGF1c2UoaHN3LCBwY21fZGF0YS0+c3RyZWFtLCAwKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9EUkFJTjoKLQkJcG9zID0gcnVudGltZS0+Y29udHJvbC0+YXBwbF9wdHIgJSBydW50aW1lLT5idWZmZXJfc2l6ZTsKLQkJc3N0X2hzd19zdHJlYW1fc2V0X29sZF9wb3NpdGlvbihoc3csIHBjbV9kYXRhLT5zdHJlYW0sIHBvcyk7Ci0JCXNzdF9oc3dfc3RyZWFtX3NldF9zaWxlbmNlX3N0YXJ0KGhzdywgc3N0X3N0cmVhbSwgdHJ1ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTMyIGhzd19ub3RpZnlfcG9pbnRlcihzdHJ1Y3Qgc3N0X2hzd19zdHJlYW0gKnN0cmVhbSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YSA9IGRhdGE7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPSBwY21fZGF0YS0+c3Vic3RyZWFtOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9Ci0JCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7Ci0Jc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7Ci0JdTMyIHBvczsKLQlzbmRfcGNtX3VmcmFtZXNfdCBwb3NpdGlvbiA9IGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLAotCQkgc3N0X2hzd19nZXRfZHNwX3Bvc2l0aW9uKGhzdywgcGNtX2RhdGEtPnN0cmVhbSkpOwotCXVuc2lnbmVkIGNoYXIgKmRtYV9hcmVhID0gcnVudGltZS0+ZG1hX2FyZWE7Ci0Jc25kX3BjbV91ZnJhbWVzX3QgZG1hX2ZyYW1lcyA9Ci0JCWJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBydW50aW1lLT5kbWFfYnl0ZXMpOwotCXNuZF9wY21fdWZyYW1lc190IG9sZF9wb3NpdGlvbjsKLQlzc2l6ZV90IHNhbXBsZXM7Ci0KLQlwb3MgPSBmcmFtZXNfdG9fYnl0ZXMocnVudGltZSwKLQkJKHJ1bnRpbWUtPmNvbnRyb2wtPmFwcGxfcHRyICUgcnVudGltZS0+YnVmZmVyX3NpemUpKTsKLQotCWRldl92ZGJnKHJ0ZC0+ZGV2LCAiUENNOiBBcHAgcG9pbnRlciAlZCBieXRlc1xuIiwgcG9zKTsKLQotCS8qIFNTVCBmdyBkb24ndCBrbm93IHdoZXJlIHRvIHN0b3AgZG1hCi0JICogU28sIFNTVCBkcml2ZXIgbmVlZCB0byBjbGVhbiB0aGUgZGF0YSB3aGljaCBoYXMgYmVlbiBjb25zdW1lZAotCSAqLwotCWlmIChkbWFfYXJlYSA9PSBOVUxMIHx8IGRtYV9mcmFtZXMgPD0gMAotCQl8fCAoc3Vic3RyZWFtLT5zdHJlYW0gPT0gU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFKQotCQl8fCAhc3N0X2hzd19zdHJlYW1fZ2V0X3NpbGVuY2Vfc3RhcnQoaHN3LCBzdHJlYW0pKSB7Ci0JCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQlvbGRfcG9zaXRpb24gPSBzc3RfaHN3X3N0cmVhbV9nZXRfb2xkX3Bvc2l0aW9uKGhzdywgc3RyZWFtKTsKLQlpZiAocG9zaXRpb24gPiBvbGRfcG9zaXRpb24pIHsKLQkJaWYgKHBvc2l0aW9uIDwgZG1hX2ZyYW1lcykgewotCQkJc2FtcGxlcyA9IFNTVF9TQU1QTEVTKHJ1bnRpbWUsIHBvc2l0aW9uIC0gb2xkX3Bvc2l0aW9uKTsKLQkJCXNuZF9wY21fZm9ybWF0X3NldF9zaWxlbmNlKHJ1bnRpbWUtPmZvcm1hdCwKLQkJCQlTU1RfT0xEX1BPU0lUSU9OKGRtYV9hcmVhLAotCQkJCQlydW50aW1lLCBvbGRfcG9zaXRpb24pLAotCQkJCXNhbXBsZXMpOwotCQl9IGVsc2UKLQkJCWRldl9lcnIocnRkLT5kZXYsICJQQ006IHBvc2l0aW9uIGlzIHdyb25nXG4iKTsKLQl9IGVsc2UgewotCQlpZiAob2xkX3Bvc2l0aW9uIDwgZG1hX2ZyYW1lcykgewotCQkJc2FtcGxlcyA9IFNTVF9TQU1QTEVTKHJ1bnRpbWUsCi0JCQkJZG1hX2ZyYW1lcyAtIG9sZF9wb3NpdGlvbik7Ci0JCQlzbmRfcGNtX2Zvcm1hdF9zZXRfc2lsZW5jZShydW50aW1lLT5mb3JtYXQsCi0JCQkJU1NUX09MRF9QT1NJVElPTihkbWFfYXJlYSwKLQkJCQkJcnVudGltZSwgb2xkX3Bvc2l0aW9uKSwKLQkJCQlzYW1wbGVzKTsKLQkJfSBlbHNlCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiUENNOiBkbWFfYnl0ZXMgaXMgd3JvbmdcbiIpOwotCQlpZiAocG9zaXRpb24gPCBkbWFfZnJhbWVzKSB7Ci0JCQlzYW1wbGVzID0gU1NUX1NBTVBMRVMocnVudGltZSwgcG9zaXRpb24pOwotCQkJc25kX3BjbV9mb3JtYXRfc2V0X3NpbGVuY2UocnVudGltZS0+Zm9ybWF0LAotCQkJCWRtYV9hcmVhLCBzYW1wbGVzKTsKLQkJfSBlbHNlCi0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiUENNOiBwb3NpdGlvbiBpcyB3cm9uZ1xuIik7Ci0JfQotCXNzdF9oc3dfc3RyZWFtX3NldF9vbGRfcG9zaXRpb24oaHN3LCBzdHJlYW0sIHBvc2l0aW9uKTsKLQotCS8qIGxldCBhbHNhIGtub3cgd2UgaGF2ZSBwbGF5IGEgcGVyaW9kICovCi0Jc25kX3BjbV9wZXJpb2RfZWxhcHNlZChzdWJzdHJlYW0pOwotCXJldHVybiBwb3M7Ci19Ci0KLXN0YXRpYyBzbmRfcGNtX3VmcmFtZXNfdCBoc3dfcGNtX3BvaW50ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KLQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKLQlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YTsKLQlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKLQlzbmRfcGNtX3VmcmFtZXNfdCBvZmZzZXQ7Ci0JdWludDY0X3QgcHBvczsKLQl1MzIgcG9zaXRpb247Ci0JaW50IGRhaTsKLQotCWRhaSA9IG1vZF9tYXBbcnRkLT5jcHVfZGFpLT5pZF0uZGFpX2lkOwotCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bZGFpXVtzdWJzdHJlYW0tPnN0cmVhbV07Ci0JcG9zaXRpb24gPSBzc3RfaHN3X2dldF9kc3BfcG9zaXRpb24oaHN3LCBwY21fZGF0YS0+c3RyZWFtKTsKLQotCW9mZnNldCA9IGJ5dGVzX3RvX2ZyYW1lcyhydW50aW1lLCBwb3NpdGlvbik7Ci0JcHBvcyA9IHNzdF9oc3dfZ2V0X2RzcF9wcmVzZW50YXRpb25fcG9zaXRpb24oaHN3LCBwY21fZGF0YS0+c3RyZWFtKTsKLQotCWRldl92ZGJnKHJ0ZC0+ZGV2LCAiUENNOiBETUEgcG9pbnRlciAlZHUgYnl0ZXMsIHBvcyAlbGx1XG4iLAotCQlwb3NpdGlvbiwgcHBvcyk7Ci0JcmV0dXJuIG9mZnNldDsKLX0KLQotc3RhdGljIGludCBoc3dfcGNtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9Ci0JCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEocnRkLT5wbGF0Zm9ybSk7Ci0Jc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGE7Ci0Jc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7Ci0JaW50IGRhaTsKLQotCWRhaSA9IG1vZF9tYXBbcnRkLT5jcHVfZGFpLT5pZF0uZGFpX2lkOwotCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bZGFpXVtzdWJzdHJlYW0tPnN0cmVhbV07Ci0KLQltdXRleF9sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOwotCXBtX3J1bnRpbWVfZ2V0X3N5bmMocGRhdGEtPmRldik7Ci0KLQlzbmRfc29jX3BjbV9zZXRfZHJ2ZGF0YShydGQsIHBjbV9kYXRhKTsKLQlwY21fZGF0YS0+c3Vic3RyZWFtID0gc3Vic3RyZWFtOwotCi0Jc25kX3NvY19zZXRfcnVudGltZV9od3BhcmFtcyhzdWJzdHJlYW0sICZoc3dfcGNtX2hhcmR3YXJlKTsKLQotCXBjbV9kYXRhLT5zdHJlYW0gPSBzc3RfaHN3X3N0cmVhbV9uZXcoaHN3LCBydGQtPmNwdV9kYWktPmlkLAotCQloc3dfbm90aWZ5X3BvaW50ZXIsIHBjbV9kYXRhKTsKLQlpZiAocGNtX2RhdGEtPnN0cmVhbSA9PSBOVUxMKSB7Ci0JCWRldl9lcnIocnRkLT5kZXYsICJlcnJvcjogZmFpbGVkIHRvIGNyZWF0ZSBzdHJlYW1cbiIpOwotCQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBkYXRhLT5kZXYpOwotCQlwbV9ydW50aW1lX3B1dF9hdXRvc3VzcGVuZChwZGF0YS0+ZGV2KTsKLQkJbXV0ZXhfdW5sb2NrKCZwY21fZGF0YS0+bXV0ZXgpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF91bmxvY2soJnBjbV9kYXRhLT5tdXRleCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaHN3X3BjbV9jbG9zZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0KLQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShydGQtPnBsYXRmb3JtKTsKLQlzdHJ1Y3QgaHN3X3BjbV9kYXRhICpwY21fZGF0YTsKLQlzdHJ1Y3Qgc3N0X2hzdyAqaHN3ID0gcGRhdGEtPmhzdzsKLQlpbnQgcmV0LCBkYWk7Ci0KLQlkYWkgPSBtb2RfbWFwW3J0ZC0+Y3B1X2RhaS0+aWRdLmRhaV9pZDsKLQlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW2RhaV1bc3Vic3RyZWFtLT5zdHJlYW1dOwotCi0JbXV0ZXhfbG9jaygmcGNtX2RhdGEtPm11dGV4KTsKLQlyZXQgPSBzc3RfaHN3X3N0cmVhbV9yZXNldChoc3csIHBjbV9kYXRhLT5zdHJlYW0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9kYmcocnRkLT5kZXYsICJlcnJvcjogcmVzZXQgc3RyZWFtIGZhaWxlZCAlZFxuIiwgcmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gc3N0X2hzd19zdHJlYW1fZnJlZShoc3csIHBjbV9kYXRhLT5zdHJlYW0pOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9kYmcocnRkLT5kZXYsICJlcnJvcjogZnJlZSBzdHJlYW0gZmFpbGVkICVkXG4iLCByZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0JcGNtX2RhdGEtPmFsbG9jYXRlZCA9IDA7Ci0JcGNtX2RhdGEtPnN0cmVhbSA9IE5VTEw7Ci0KLW91dDoKLQlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KHBkYXRhLT5kZXYpOwotCXBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHBkYXRhLT5kZXYpOwotCW11dGV4X3VubG9jaygmcGNtX2RhdGEtPm11dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGhzd19wY21fb3BzID0gewotCS5vcGVuCQk9IGhzd19wY21fb3BlbiwKLQkuY2xvc2UJCT0gaHN3X3BjbV9jbG9zZSwKLQkuaW9jdGwJCT0gc25kX3BjbV9saWJfaW9jdGwsCi0JLmh3X3BhcmFtcwk9IGhzd19wY21faHdfcGFyYW1zLAotCS5od19mcmVlCT0gaHN3X3BjbV9od19mcmVlLAotCS50cmlnZ2VyCT0gaHN3X3BjbV90cmlnZ2VyLAotCS5wb2ludGVyCT0gaHN3X3BjbV9wb2ludGVyLAotCS5wYWdlCQk9IHNuZF9wY21fc2didWZfb3BzX3BhZ2UsCi19OwotCi1zdGF0aWMgaW50IGhzd19wY21fY3JlYXRlX21vZHVsZXMoc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhKQotewotCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OwotCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW9kX21hcCk7IGkrKykgewotCQlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW21vZF9tYXBbaV0uZGFpX2lkXVttb2RfbWFwW2ldLnN0cmVhbV07Ci0KLQkJLyogY3JlYXRlIG5ldyBydW50aW1lIG1vZHVsZSwgdXNlIHNhbWUgb2Zmc2V0IGlmIHJlY3JlYXRlZCAqLwotCQlwY21fZGF0YS0+cnVudGltZSA9IHNzdF9oc3dfcnVudGltZV9tb2R1bGVfY3JlYXRlKGhzdywKLQkJCW1vZF9tYXBbaV0ubW9kX2lkLCBwY21fZGF0YS0+cGVyc2lzdGVudF9vZmZzZXQpOwotCQlpZiAocGNtX2RhdGEtPnJ1bnRpbWUgPT0gTlVMTCkKLQkJCWdvdG8gZXJyOwotCQlwY21fZGF0YS0+cGVyc2lzdGVudF9vZmZzZXQgPQotCQkJcGNtX2RhdGEtPnJ1bnRpbWUtPnBlcnNpc3RlbnRfb2Zmc2V0OwotCX0KLQotCXJldHVybiAwOwotCi1lcnI6Ci0JZm9yICgtLWk7IGkgPj0gMDsgaS0tKSB7Ci0JCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bbW9kX21hcFtpXS5kYWlfaWRdW21vZF9tYXBbaV0uc3RyZWFtXTsKLQkJc3N0X2hzd19ydW50aW1lX21vZHVsZV9mcmVlKHBjbV9kYXRhLT5ydW50aW1lKTsKLQl9Ci0KLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIHZvaWQgaHN3X3BjbV9mcmVlX21vZHVsZXMoc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhKQotewotCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW9kX21hcCk7IGkrKykgewotCQlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW21vZF9tYXBbaV0uZGFpX2lkXVttb2RfbWFwW2ldLnN0cmVhbV07Ci0KLQkJc3N0X2hzd19ydW50aW1lX21vZHVsZV9mcmVlKHBjbV9kYXRhLT5ydW50aW1lKTsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgaHN3X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207Ci0Jc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtID0gcnRkLT5wbGF0Zm9ybTsKLQlzdHJ1Y3Qgc3N0X3BkYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEocGxhdGZvcm0tPmRldik7Ci0Jc3RydWN0IGhzd19wcml2X2RhdGEgKnByaXZfZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShwbGF0Zm9ybS0+ZGV2KTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwZGF0YS0+ZG1hX2RldjsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtIHx8Ci0JCQlwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5zdWJzdHJlYW0pIHsKLQkJcmV0ID0gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbChwY20sCi0JCQlTTkRSVl9ETUFfVFlQRV9ERVZfU0csCi0JCQlkZXYsCi0JCQloc3dfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXgsCi0JCQloc3dfcGNtX2hhcmR3YXJlLmJ1ZmZlcl9ieXRlc19tYXgpOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiZG1hIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCAlZFxuIiwKLQkJCQlyZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0tdLnN1YnN0cmVhbSkKLQkJcHJpdl9kYXRhLT5wY21bcnRkLT5jcHVfZGFpLT5pZF1bU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uaHN3X3BjbSA9IHBjbTsKLQlpZiAocGNtLT5zdHJlYW1zW1NORFJWX1BDTV9TVFJFQU1fQ0FQVFVSRV0uc3Vic3RyZWFtKQotCQlwcml2X2RhdGEtPnBjbVtydGQtPmNwdV9kYWktPmlkXVtTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkVdLmhzd19wY20gPSBwY207Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jZGVmaW5lIEhTV19GT1JNQVRTIFwKLQkoU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSkKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgaHN3X2RhaXNbXSA9IHsKLQl7Ci0JCS5uYW1lICA9ICJTeXN0ZW0gUGluIiwKLQkJLmlkID0gSFNXX1BDTV9EQUlfSURfU1lTVEVNLAotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiU3lzdGVtIFBsYXliYWNrIiwKLQkJCS5jaGFubmVsc19taW4gPSAyLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMjRfTEUgfCBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQkJfSwKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiQW5hbG9nIENhcHR1cmUiLAotCQkJLmNoYW5uZWxzX21pbiA9IDIsCi0JCQkuY2hhbm5lbHNfbWF4ID0gNCwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCQl9LAotCX0sCi0JewotCQkvKiBQQ00gKi8KLQkJLm5hbWUgID0gIk9mZmxvYWQwIFBpbiIsCi0JCS5pZCA9IEhTV19QQ01fREFJX0lEX09GRkxPQUQwLAotCQkucGxheWJhY2sgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiT2ZmbG9hZDAgUGxheWJhY2siLAotCQkJLmNoYW5uZWxzX21pbiA9IDIsCi0JCQkuY2hhbm5lbHNfbWF4ID0gMiwKLQkJCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDBfMTkyMDAwLAotCQkJLmZvcm1hdHMgPSBIU1dfRk9STUFUUywKLQkJfSwKLQl9LAotCXsKLQkJLyogUENNICovCi0JCS5uYW1lICA9ICJPZmZsb2FkMSBQaW4iLAotCQkuaWQgPSBIU1dfUENNX0RBSV9JRF9PRkZMT0FEMSwKLQkJLnBsYXliYWNrID0gewotCQkJLnN0cmVhbV9uYW1lID0gIk9mZmxvYWQxIFBsYXliYWNrIiwKLQkJCS5jaGFubmVsc19taW4gPSAyLAotCQkJLmNoYW5uZWxzX21heCA9IDIsCi0JCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzE5MjAwMCwKLQkJCS5mb3JtYXRzID0gSFNXX0ZPUk1BVFMsCi0JCX0sCi0JfSwKLQl7Ci0JCS5uYW1lICA9ICJMb29wYmFjayBQaW4iLAotCQkuaWQgPSBIU1dfUENNX0RBSV9JRF9MT09QQkFDSywKLQkJLmNhcHR1cmUgPSB7Ci0JCQkuc3RyZWFtX25hbWUgPSAiTG9vcGJhY2sgQ2FwdHVyZSIsCi0JCQkuY2hhbm5lbHNfbWluID0gMiwKLQkJCS5jaGFubmVsc19tYXggPSAyLAotCQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCi0JCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzI0X0xFIHwgU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JCX0sCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3aWRnZXRzW10gPSB7Ci0KLQkvKiBCYWNrZW5kIERBSXMgICovCi0JU05EX1NPQ19EQVBNX0FJRl9JTigiU1NQMCBDT0RFQyBJTiIsIE5VTEwsIDAsIFNORF9TT0NfTk9QTSwgMCwgMCksCi0JU05EX1NPQ19EQVBNX0FJRl9PVVQoIlNTUDAgQ09ERUMgT1VUIiwgTlVMTCwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX0lOKCJTU1AxIEJUIElOIiwgTlVMTCwgMCwgU05EX1NPQ19OT1BNLCAwLCAwKSwKLQlTTkRfU09DX0RBUE1fQUlGX09VVCgiU1NQMSBCVCBPVVQiLCBOVUxMLCAwLCBTTkRfU09DX05PUE0sIDAsIDApLAotCi0JLyogR2xvYmFsIFBsYXliYWNrIE1peGVyICovCi0JU05EX1NPQ19EQVBNX01JWEVSKCJQbGF5YmFjayBWTWl4ZXIiLCBTTkRfU09DX05PUE0sIDAsIDAsIE5VTEwsIDApLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgZ3JhcGhbXSA9IHsKLQotCS8qIFBsYXliYWNrIE1peGVyICovCi0JeyJQbGF5YmFjayBWTWl4ZXIiLCBOVUxMLCAiU3lzdGVtIFBsYXliYWNrIn0sCi0JeyJQbGF5YmFjayBWTWl4ZXIiLCBOVUxMLCAiT2ZmbG9hZDAgUGxheWJhY2sifSwKLQl7IlBsYXliYWNrIFZNaXhlciIsIE5VTEwsICJPZmZsb2FkMSBQbGF5YmFjayJ9LAotCi0JeyJTU1AwIENPREVDIE9VVCIsIE5VTEwsICJQbGF5YmFjayBWTWl4ZXIifSwKLQotCXsiQW5hbG9nIENhcHR1cmUiLCBOVUxMLCAiU1NQMCBDT0RFQyBJTiJ9LAotfTsKLQotc3RhdGljIGludCBoc3dfcGNtX3Byb2JlKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSkKLXsKLQlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcHJpdl9kYXRhID0gc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7Ci0Jc3RydWN0IHNzdF9wZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X3BsYXRkYXRhKHBsYXRmb3JtLT5kZXYpOwotCXN0cnVjdCBkZXZpY2UgKmRtYV9kZXYsICpkZXY7Ci0JaW50IGksIHJldCA9IDA7Ci0KLQlpZiAoIXBkYXRhKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWRldiA9IHBsYXRmb3JtLT5kZXY7Ci0JZG1hX2RldiA9IHBkYXRhLT5kbWFfZGV2OwotCi0JcHJpdl9kYXRhLT5oc3cgPSBwZGF0YS0+ZHNwOwotCXByaXZfZGF0YS0+ZGV2ID0gcGxhdGZvcm0tPmRldjsKLQlwcml2X2RhdGEtPnBtX3N0YXRlID0gSFNXX1BNX1NUQVRFX0QwOwotCXByaXZfZGF0YS0+c29jX2NhcmQgPSBwbGF0Zm9ybS0+Y29tcG9uZW50LmNhcmQ7Ci0KLQkvKiBhbGxvY2F0ZSBEU1AgYnVmZmVyIHBhZ2UgdGFibGVzICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaHN3X2RhaXMpOyBpKyspIHsKLQotCQkvKiBwbGF5YmFjayAqLwotCQlpZiAoaHN3X2RhaXNbaV0ucGxheWJhY2suY2hhbm5lbHNfbWluKSB7Ci0JCQltdXRleF9pbml0KCZwcml2X2RhdGEtPnBjbVtpXVtTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5tdXRleCk7Ci0JCQlyZXQgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgZG1hX2RldiwKLQkJCQlQQUdFX1NJWkUsICZwcml2X2RhdGEtPmRtYWJbaV1bMF0pOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBlcnI7Ci0JCX0KLQotCQkvKiBjYXB0dXJlICovCi0JCWlmIChoc3dfZGFpc1tpXS5jYXB0dXJlLmNoYW5uZWxzX21pbikgewotCQkJbXV0ZXhfaW5pdCgmcHJpdl9kYXRhLT5wY21baV1bU05EUlZfUENNX1NUUkVBTV9DQVBUVVJFXS5tdXRleCk7Ci0JCQlyZXQgPSBzbmRfZG1hX2FsbG9jX3BhZ2VzKFNORFJWX0RNQV9UWVBFX0RFViwgZG1hX2RldiwKLQkJCQlQQUdFX1NJWkUsICZwcml2X2RhdGEtPmRtYWJbaV1bMV0pOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBlcnI7Ci0JCX0KLQl9Ci0KLQkvKiBhbGxvY2F0ZSBydW50aW1lIG1vZHVsZXMgKi8KLQloc3dfcGNtX2NyZWF0ZV9tb2R1bGVzKHByaXZfZGF0YSk7Ci0KLQkvKiBlbmFibGUgcnVudGltZSBQTSB3aXRoIGF1dG8gc3VzcGVuZCAqLwotCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KHBsYXRmb3JtLT5kZXYsCi0JCVNTVF9SVU5USU1FX1NVU1BFTkRfREVMQVkpOwotCXBtX3J1bnRpbWVfdXNlX2F1dG9zdXNwZW5kKHBsYXRmb3JtLT5kZXYpOwotCXBtX3J1bnRpbWVfZW5hYmxlKHBsYXRmb3JtLT5kZXYpOwotCXBtX3J1bnRpbWVfaWRsZShwbGF0Zm9ybS0+ZGV2KTsKLQotCXJldHVybiAwOwotCi1lcnI6Ci0JZm9yICg7aSA+PSAwOyBpLS0pIHsKLQkJaWYgKGhzd19kYWlzW2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbikKLQkJCXNuZF9kbWFfZnJlZV9wYWdlcygmcHJpdl9kYXRhLT5kbWFiW2ldWzBdKTsKLQkJaWYgKGhzd19kYWlzW2ldLmNhcHR1cmUuY2hhbm5lbHNfbWluKQotCQkJc25kX2RtYV9mcmVlX3BhZ2VzKCZwcml2X2RhdGEtPmRtYWJbaV1bMV0pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGhzd19wY21fcmVtb3ZlKHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtICpwbGF0Zm9ybSkKLXsKLQlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcHJpdl9kYXRhID0KLQkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwbGF0Zm9ybSk7Ci0JaW50IGk7Ci0KLQlwbV9ydW50aW1lX2Rpc2FibGUocGxhdGZvcm0tPmRldik7Ci0JaHN3X3BjbV9mcmVlX21vZHVsZXMocHJpdl9kYXRhKTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhzd19kYWlzKTsgaSsrKSB7Ci0JCWlmIChoc3dfZGFpc1tpXS5wbGF5YmFjay5jaGFubmVsc19taW4pCi0JCQlzbmRfZG1hX2ZyZWVfcGFnZXMoJnByaXZfZGF0YS0+ZG1hYltpXVswXSk7Ci0JCWlmIChoc3dfZGFpc1tpXS5jYXB0dXJlLmNoYW5uZWxzX21pbikKLQkJCXNuZF9kbWFfZnJlZV9wYWdlcygmcHJpdl9kYXRhLT5kbWFiW2ldWzFdKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBoc3dfc29jX3BsYXRmb3JtID0gewotCS5wcm9iZQkJPSBoc3dfcGNtX3Byb2JlLAotCS5yZW1vdmUJCT0gaHN3X3BjbV9yZW1vdmUsCi0JLm9wcwkJPSAmaHN3X3BjbV9vcHMsCi0JLnBjbV9uZXcJPSBoc3dfcGNtX25ldywKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIGhzd19kYWlfY29tcG9uZW50ID0gewotCS5uYW1lID0gImhhc3dlbGwtZGFpIiwKLQkuY29udHJvbHMgPSBoc3dfdm9sdW1lX2NvbnRyb2xzLAotCS5udW1fY29udHJvbHMgPSBBUlJBWV9TSVpFKGhzd192b2x1bWVfY29udHJvbHMpLAotCS5kYXBtX3dpZGdldHMgPSB3aWRnZXRzLAotCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3aWRnZXRzKSwKLQkuZGFwbV9yb3V0ZXMgPSBncmFwaCwKLQkubnVtX2RhcG1fcm91dGVzID0gQVJSQVlfU0laRShncmFwaCksCi19OwotCi1zdGF0aWMgaW50IGhzd19wY21fZGV2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCi17Ci0Jc3RydWN0IHNzdF9wZGF0YSAqc3N0X3BkYXRhID0gZGV2X2dldF9wbGF0ZGF0YSgmcGRldi0+ZGV2KTsKLQlzdHJ1Y3QgaHN3X3ByaXZfZGF0YSAqcHJpdl9kYXRhOwotCWludCByZXQ7Ci0KLQlpZiAoIXNzdF9wZGF0YSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwcml2X2RhdGEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwcml2X2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXZfZGF0YSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXQgPSBzc3RfaHN3X2RzcF9pbml0KCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiAtRU5PREVWOwotCi0JcHJpdl9kYXRhLT5oc3cgPSBzc3RfcGRhdGEtPmRzcDsKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2X2RhdGEpOwotCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LCAmaHN3X3NvY19wbGF0Zm9ybSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX3BsYXQ7Ci0KLQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LCAmaHN3X2RhaV9jb21wb25lbnQsCi0JCWhzd19kYWlzLCBBUlJBWV9TSVpFKGhzd19kYWlzKSk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyX2NvbXA7Ci0KLQlyZXR1cm4gMDsKLQotZXJyX2NvbXA6Ci0Jc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOwotZXJyX3BsYXQ6Ci0Jc3N0X2hzd19kc3BfZnJlZSgmcGRldi0+ZGV2LCBzc3RfcGRhdGEpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhzd19wY21fZGV2X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzc3RfcGRhdGEgKnNzdF9wZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoJnBkZXYtPmRldik7Ci0KLQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7Ci0Jc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKLQlzc3RfaHN3X2RzcF9mcmVlKCZwZGV2LT5kZXYsIHNzdF9wZGF0YSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTQotCi1zdGF0aWMgaW50IGhzd19wY21fcnVudGltZV9pZGxlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBoc3dfcGNtX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7Ci0KLQlpZiAocGRhdGEtPnBtX3N0YXRlID49IEhTV19QTV9TVEFURV9SVEQzKQotCQlyZXR1cm4gMDsKLQotCXNzdF9oc3dfZHNwX3J1bnRpbWVfc3VzcGVuZChoc3cpOwotCXNzdF9oc3dfZHNwX3J1bnRpbWVfc2xlZXAoaHN3KTsKLQlwZGF0YS0+cG1fc3RhdGUgPSBIU1dfUE1fU1RBVEVfUlREMzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhzd19wY21fcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OwotCWludCByZXQ7Ci0KLQlpZiAocGRhdGEtPnBtX3N0YXRlICE9IEhTV19QTV9TVEFURV9SVEQzKQotCQlyZXR1cm4gMDsKLQotCXJldCA9IHNzdF9oc3dfZHNwX2xvYWQoaHN3KTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byByZWxvYWQgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gaHN3X3BjbV9jcmVhdGVfbW9kdWxlcyhwZGF0YSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY3JlYXRlIG1vZHVsZXMgJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gc3N0X2hzd19kc3BfcnVudGltZV9yZXN1bWUoaHN3KTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQllbHNlIGlmIChyZXQgPT0gMSkgLyogbm8gYWN0aW9uIHJlcXVpcmVkICovCi0JCXJldHVybiAwOwotCi0JcGRhdGEtPnBtX3N0YXRlID0gSFNXX1BNX1NUQVRFX0QwOwotCXJldHVybiByZXQ7Ci19Ci0KLSNlbHNlCi0jZGVmaW5lIGhzd19wY21fcnVudGltZV9pZGxlCQlOVUxMCi0jZGVmaW5lIGhzd19wY21fcnVudGltZV9zdXNwZW5kCQlOVUxMCi0jZGVmaW5lIGhzd19wY21fcnVudGltZV9yZXN1bWUJCU5VTEwKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1BNCi0KLXN0YXRpYyB2b2lkIGhzd19wY21fY29tcGxldGUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBoc3dfcHJpdl9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCXN0cnVjdCBzc3RfaHN3ICpoc3cgPSBwZGF0YS0+aHN3OwotCXN0cnVjdCBoc3dfcGNtX2RhdGEgKnBjbV9kYXRhOwotCWludCBpLCBlcnI7Ci0KLQlpZiAocGRhdGEtPnBtX3N0YXRlICE9IEhTV19QTV9TVEFURV9EMykKLQkJcmV0dXJuOwotCi0JZXJyID0gc3N0X2hzd19kc3BfbG9hZChoc3cpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlbG9hZCAlZFxuIiwgZXJyKTsKLQkJcmV0dXJuOwotCX0KLQotCWVyciA9IGhzd19wY21fY3JlYXRlX21vZHVsZXMocGRhdGEpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGNyZWF0ZSBtb2R1bGVzICVkXG4iLCBlcnIpOwotCQlyZXR1cm47Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobW9kX21hcCk7IGkrKykgewotCQlwY21fZGF0YSA9ICZwZGF0YS0+cGNtW21vZF9tYXBbaV0uZGFpX2lkXVttb2RfbWFwW2ldLnN0cmVhbV07Ci0KLQkJaWYgKCFwY21fZGF0YS0+c3Vic3RyZWFtKQotCQkJY29udGludWU7Ci0KLQkJZXJyID0gc3N0X21vZHVsZV9ydW50aW1lX3Jlc3RvcmUocGNtX2RhdGEtPnJ1bnRpbWUsCi0JCQkmcGNtX2RhdGEtPmNvbnRleHQpOwotCQlpZiAoZXJyIDwgMCkKLQkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJlc3RvcmUgY29udGV4dCBmb3IgUENNICVkXG4iLCBpKTsKLQl9Ci0KLQlzbmRfc29jX3Jlc3VtZShwZGF0YS0+c29jX2NhcmQtPmRldik7Ci0KLQllcnIgPSBzc3RfaHN3X2RzcF9ydW50aW1lX3Jlc3VtZShoc3cpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm47Ci0JZWxzZSBpZiAoZXJyID09IDEpIC8qIG5vIGFjdGlvbiByZXF1aXJlZCAqLwotCQlyZXR1cm47Ci0KLQlwZGF0YS0+cG1fc3RhdGUgPSBIU1dfUE1fU1RBVEVfRDA7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgaW50IGhzd19wY21fcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGhzd19wcml2X2RhdGEgKnBkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0Jc3RydWN0IHNzdF9oc3cgKmhzdyA9IHBkYXRhLT5oc3c7Ci0Jc3RydWN0IGhzd19wY21fZGF0YSAqcGNtX2RhdGE7Ci0JaW50IGksIGVycjsKLQotCWlmIChwZGF0YS0+cG1fc3RhdGUgPT0gSFNXX1BNX1NUQVRFX0QzKQotCQlyZXR1cm4gMDsKLQllbHNlIGlmIChwZGF0YS0+cG1fc3RhdGUgPT0gSFNXX1BNX1NUQVRFX0QwKSB7Ci0JCS8qIHN1c3BlbmQgYWxsIGFjdGl2ZSBzdHJlYW1zICovCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vZF9tYXApOyBpKyspIHsKLQkJCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bbW9kX21hcFtpXS5kYWlfaWRdW21vZF9tYXBbaV0uc3RyZWFtXTsKLQotCQkJaWYgKCFwY21fZGF0YS0+c3Vic3RyZWFtKQotCQkJCWNvbnRpbnVlOwotCQkJZGV2X2RiZyhkZXYsICJzdXNwZW5kaW5nIHBjbSAlZFxuIiwgaSk7Ci0JCQlzbmRfcGNtX3N1c3BlbmRfYWxsKHBjbV9kYXRhLT5oc3dfcGNtKTsKLQotCQkJLyogV2UgbmVlZCB0byB3YWl0IHVudGlsIHRoZSBEU1AgRlcgc3RvcHMgdGhlIHN0cmVhbXMgKi8KLQkJCW1zbGVlcCgyKTsKLQkJfQotCi0JCS8qIHByZXNlcnZlIHBlcnNpc3RlbnQgbWVtb3J5ICovCi0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1vZF9tYXApOyBpKyspIHsKLQkJCXBjbV9kYXRhID0gJnBkYXRhLT5wY21bbW9kX21hcFtpXS5kYWlfaWRdW21vZF9tYXBbaV0uc3RyZWFtXTsKLQotCQkJaWYgKCFwY21fZGF0YS0+c3Vic3RyZWFtKQotCQkJCWNvbnRpbnVlOwotCi0JCQlkZXZfZGJnKGRldiwgInNhdmluZyBjb250ZXh0IHBjbSAlZFxuIiwgaSk7Ci0JCQllcnIgPSBzc3RfbW9kdWxlX3J1bnRpbWVfc2F2ZShwY21fZGF0YS0+cnVudGltZSwKLQkJCQkmcGNtX2RhdGEtPmNvbnRleHQpOwotCQkJaWYgKGVyciA8IDApCi0JCQkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gc2F2ZSBjb250ZXh0IGZvciBQQ00gJWRcbiIsIGkpOwotCQl9Ci0JCS8qIGVudGVyIEQzIHN0YXRlIGFuZCBzdGFsbCAqLwotCQlzc3RfaHN3X2RzcF9ydW50aW1lX3N1c3BlbmQoaHN3KTsKLQkJLyogcHV0IHRoZSBEU1AgdG8gc2xlZXAgKi8KLQkJc3N0X2hzd19kc3BfcnVudGltZV9zbGVlcChoc3cpOwotCX0KLQotCXNuZF9zb2Nfc3VzcGVuZChwZGF0YS0+c29jX2NhcmQtPmRldik7Ci0Jc25kX3NvY19wb3dlcm9mZihwZGF0YS0+c29jX2NhcmQtPmRldik7Ci0KLQlwZGF0YS0+cG1fc3RhdGUgPSBIU1dfUE1fU1RBVEVfRDM7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2Vsc2UKLSNkZWZpbmUgaHN3X3BjbV9wcmVwYXJlCQlOVUxMCi0jZGVmaW5lIGhzd19wY21fY29tcGxldGUJTlVMTAotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBoc3dfcGNtX3BtID0gewotCS5ydW50aW1lX2lkbGUgPSBoc3dfcGNtX3J1bnRpbWVfaWRsZSwKLQkucnVudGltZV9zdXNwZW5kID0gaHN3X3BjbV9ydW50aW1lX3N1c3BlbmQsCi0JLnJ1bnRpbWVfcmVzdW1lID0gaHN3X3BjbV9ydW50aW1lX3Jlc3VtZSwKLQkucHJlcGFyZSA9IGhzd19wY21fcHJlcGFyZSwKLQkuY29tcGxldGUgPSBoc3dfcGNtX2NvbXBsZXRlLAotfTsKLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgaHN3X3BjbV9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUgPSAiaGFzd2VsbC1wY20tYXVkaW8iLAotCQkucG0gPSAmaHN3X3BjbV9wbSwKLQl9LAotCi0JLnByb2JlID0gaHN3X3BjbV9kZXZfcHJvYmUsCi0JLnJlbW92ZSA9IGhzd19wY21fZGV2X3JlbW92ZSwKLX07Ci1tb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGhzd19wY21fZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiTGlhbSBHaXJkd29vZCwgWGluZ2NoYW8gV2FuZyIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJIYXN3ZWxsL0x5bnhwb2ludCArIEJyb2Fkd2VsbC9XaWxkY2F0cG9pbnQgUENNIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQUxJQVMoInBsYXRmb3JtOmhhc3dlbGwtcGNtLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0LW1mbGQtcGxhdGZvcm0tcGNtLmMgYi9zb3VuZC9zb2MvaW50ZWwvc3N0LW1mbGQtcGxhdGZvcm0tcGNtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MjNjYmUuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLXBsYXRmb3JtLXBjbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQ0ICswLDAgQEAKLS8qCi0gKiAgc3N0X21mbGRfcGxhdGZvcm0uYyAtIEludGVsIE1JRCBQbGF0Zm9ybSBkcml2ZXIKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDEwLTIwMTQgSW50ZWwgQ29ycAotICogIEF1dGhvcjogVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+Ci0gKiAgQXV0aG9yOiBIYXJzaGEgUHJpeWEgPHByaXlhLmhhcnNoYUBpbnRlbC5jb20+Ci0gKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICovCi0jZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10Ci0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotI2luY2x1ZGUgPHNvdW5kL2NvbXByZXNzX2RyaXZlci5oPgotI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybV9zc3RfYXVkaW8uaD4KLSNpbmNsdWRlICJzc3QtbWZsZC1wbGF0Zm9ybS5oIgotI2luY2x1ZGUgInNzdC1hdG9tLWNvbnRyb2xzLmgiCi0KLXN0cnVjdCBzc3RfZGV2aWNlICpzc3Q7Ci1zdGF0aWMgREVGSU5FX01VVEVYKHNzdF9sb2NrKTsKLWV4dGVybiBzdHJ1Y3Qgc25kX2NvbXByX29wcyBzc3RfcGxhdGZvcm1fY29tcHJfb3BzOwotCi1pbnQgc3N0X3JlZ2lzdGVyX2RzcChzdHJ1Y3Qgc3N0X2RldmljZSAqZGV2KQotewotCWlmIChXQVJOX09OKCFkZXYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRldi0+ZGV2LT5kcml2ZXItPm93bmVyKSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JbXV0ZXhfbG9jaygmc3N0X2xvY2spOwotCWlmIChzc3QpIHsKLQkJZGV2X2VycihkZXYtPmRldiwgIndlIGFscmVhZHkgaGF2ZSBhIGRldmljZSAlc1xuIiwgc3N0LT5uYW1lKTsKLQkJbW9kdWxlX3B1dChkZXYtPmRldi0+ZHJpdmVyLT5vd25lcik7Ci0JCW11dGV4X3VubG9jaygmc3N0X2xvY2spOwotCQlyZXR1cm4gLUVFWElTVDsKLQl9Ci0JZGV2X2RiZyhkZXYtPmRldiwgInJlZ2lzdGVyaW5nIGRldmljZSAlc1xuIiwgZGV2LT5uYW1lKTsKLQlzc3QgPSBkZXY7Ci0JbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfcmVnaXN0ZXJfZHNwKTsKLQotaW50IHNzdF91bnJlZ2lzdGVyX2RzcChzdHJ1Y3Qgc3N0X2RldmljZSAqZGV2KQotewotCWlmIChXQVJOX09OKCFkZXYpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZGV2ICE9IHNzdCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZzc3RfbG9jayk7Ci0KLQlpZiAoIXNzdCkgewotCQltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JbW9kdWxlX3B1dChzc3QtPmRldi0+ZHJpdmVyLT5vd25lcik7Ci0JZGV2X2RiZyhkZXYtPmRldiwgInVucmVnICVzXG4iLCBzc3QtPm5hbWUpOwotCXNzdCA9IE5VTEw7Ci0JbXV0ZXhfdW5sb2NrKCZzc3RfbG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfdW5yZWdpc3Rlcl9kc3ApOwotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgc3N0X3BsYXRmb3JtX3BjbV9odyA9IHsKLQkuaW5mbyA9CShTTkRSVl9QQ01fSU5GT19JTlRFUkxFQVZFRCB8Ci0JCQlTTkRSVl9QQ01fSU5GT19ET1VCTEUgfAotCQkJU05EUlZfUENNX0lORk9fUEFVU0UgfAotCQkJU05EUlZfUENNX0lORk9fUkVTVU1FIHwKLQkJCVNORFJWX1BDTV9JTkZPX01NQVB8Ci0JCQlTTkRSVl9QQ01fSU5GT19NTUFQX1ZBTElEIHwKLQkJCVNORFJWX1BDTV9JTkZPX0JMT0NLX1RSQU5TRkVSIHwKLQkJCVNORFJWX1BDTV9JTkZPX1NZTkNfU1RBUlQpLAotCS5idWZmZXJfYnl0ZXNfbWF4ID0gU1NUX01BWF9CVUZGRVIsCi0JLnBlcmlvZF9ieXRlc19taW4gPSBTU1RfTUlOX1BFUklPRF9CWVRFUywKLQkucGVyaW9kX2J5dGVzX21heCA9IFNTVF9NQVhfUEVSSU9EX0JZVEVTLAotCS5wZXJpb2RzX21pbiA9IFNTVF9NSU5fUEVSSU9EUywKLQkucGVyaW9kc19tYXggPSBTU1RfTUFYX1BFUklPRFMsCi0JLmZpZm9fc2l6ZSA9IFNTVF9GSUZPX1NJWkUsCi19OwotCi1zdGF0aWMgc3RydWN0IHNzdF9kZXZfc3RyZWFtX21hcCBkcGNtX3N0cm1fbWFwW10gPSB7Ci0JezB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZ9LCAvKiBSZXNlcnZlZCwgbm90IGluIHVzZSAqLwotCXtNRVJSX0RQQ01fQVVESU8sIDAsIFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0ssIFBJUEVfTUVESUExX0lOLCBTU1RfVEFTS19JRF9NRURJQSwgMH0sCi0Je01FUlJfRFBDTV9DT01QUiwgMCwgU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSywgUElQRV9NRURJQTBfSU4sIFNTVF9UQVNLX0lEX01FRElBLCAwfSwKLQl7TUVSUl9EUENNX0FVRElPLCAwLCBTTkRSVl9QQ01fU1RSRUFNX0NBUFRVUkUsIFBJUEVfUENNMV9PVVQsIFNTVF9UQVNLX0lEX01FRElBLCAwfSwKLX07Ci0KLXN0YXRpYyBpbnQgc3N0X21lZGlhX2RpZ2l0YWxfbXV0ZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgaW50IG11dGUsIGludCBzdHJlYW0pCi17Ci0KLQlyZXR1cm4gc3N0X3NlbmRfcGlwZV9nYWlucyhkYWksIHN0cmVhbSwgbXV0ZSk7Ci19Ci0KLS8qIGhlbHBlciBmdW5jdGlvbnMgKi8KLXZvaWQgc3N0X3NldF9zdHJlYW1fc3RhdHVzKHN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSwKLQkJCQkJaW50IHN0YXRlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnN0cmVhbS0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKLQlzdHJlYW0tPnN0cmVhbV9zdGF0dXMgPSBzdGF0ZTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdHJlYW0tPnN0YXR1c19sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0pCi17Ci0JaW50IHN0YXRlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RyZWFtLT5zdGF0dXNfbG9jaywgZmxhZ3MpOwotCXN0YXRlID0gc3RyZWFtLT5zdHJlYW1fc3RhdHVzOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0cmVhbS0+c3RhdHVzX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gc3RhdGU7Ci19Ci0KLXN0YXRpYyB2b2lkIHNzdF9maWxsX2FsbG9jX3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJCQlzdHJ1Y3Qgc25kX3NzdF9hbGxvY19wYXJhbXNfZXh0ICphbGxvY19wYXJhbSkKLXsKLQl1bnNpZ25lZCBpbnQgY2hhbm5lbHM7Ci0Jc25kX3BjbV91ZnJhbWVzX3QgcGVyaW9kX3NpemU7Ci0Jc3NpemVfdCBwZXJpb2RieXRlczsKLQlzc2l6ZV90IGJ1ZmZlcl9ieXRlcyA9IHNuZF9wY21fbGliX2J1ZmZlcl9ieXRlcyhzdWJzdHJlYW0pOwotCXUzMiBidWZmZXJfYWRkciA9IHZpcnRfdG9fcGh5cyhzdWJzdHJlYW0tPmRtYV9idWZmZXIuYXJlYSk7Ci0KLQljaGFubmVscyA9IHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7Ci0JcGVyaW9kX3NpemUgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnBlcmlvZF9zaXplOwotCXBlcmlvZGJ5dGVzID0gc2FtcGxlc190b19ieXRlcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIHBlcmlvZF9zaXplKTsKLQlhbGxvY19wYXJhbS0+cmluZ19idWZfaW5mb1swXS5hZGRyID0gYnVmZmVyX2FkZHI7Ci0JYWxsb2NfcGFyYW0tPnJpbmdfYnVmX2luZm9bMF0uc2l6ZSA9IGJ1ZmZlcl9ieXRlczsKLQlhbGxvY19wYXJhbS0+c2dfY291bnQgPSAxOwotCWFsbG9jX3BhcmFtLT5yZXNlcnZlZCA9IDA7Ci0JYWxsb2NfcGFyYW0tPmZyYWdfc2l6ZSA9IHBlcmlvZGJ5dGVzICogY2hhbm5lbHM7Ci0KLX0KLXN0YXRpYyB2b2lkIHNzdF9maWxsX3BjbV9wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJc3RydWN0IHNuZF9zc3Rfc3RyZWFtX3BhcmFtcyAqcGFyYW0pCi17Ci0JcGFyYW0tPnVjLnBjbV9wYXJhbXMubnVtX2NoYW4gPSAodTgpIHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7Ci0JcGFyYW0tPnVjLnBjbV9wYXJhbXMucGNtX3dkX3N6ID0gc3Vic3RyZWFtLT5ydW50aW1lLT5zYW1wbGVfYml0czsKLQlwYXJhbS0+dWMucGNtX3BhcmFtcy5zZnJlcSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cmF0ZTsKLQotCS8qIFBDTSBzdHJlYW0gdmlhIEFMU0EgaW50ZXJmYWNlICovCi0JcGFyYW0tPnVjLnBjbV9wYXJhbXMudXNlX29mZmxvYWRfcGF0aCA9IDA7Ci0JcGFyYW0tPnVjLnBjbV9wYXJhbXMucmVzZXJ2ZWQyID0gMDsKLQltZW1zZXQocGFyYW0tPnVjLnBjbV9wYXJhbXMuY2hhbm5lbF9tYXAsIDAsIHNpemVvZih1OCkpOwotCi19Ci0KLXN0YXRpYyBpbnQgc3N0X2dldF9zdHJlYW1fbWFwcGluZyhpbnQgZGV2LCBpbnQgc2RldiwgaW50IGRpciwKLQlzdHJ1Y3Qgc3N0X2Rldl9zdHJlYW1fbWFwICptYXAsIGludCBzaXplKQotewotCWludCBpOwotCi0JaWYgKG1hcCA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCi0JLyogaW5kZXggMCBpcyBub3QgdXNlZCBpbiBzdHJlYW0gbWFwICovCi0JZm9yIChpID0gMTsgaSA8IHNpemU7IGkrKykgewotCQlpZiAoKG1hcFtpXS5kZXZfbnVtID09IGRldikgJiYgKG1hcFtpXS5kaXJlY3Rpb24gPT0gZGlyKSkKLQkJCXJldHVybiBpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotaW50IHNzdF9maWxsX3N0cmVhbV9wYXJhbXModm9pZCAqc3Vic3RyZWFtLAotCWNvbnN0IHN0cnVjdCBzc3RfZGF0YSAqY3R4LCBzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbXMsIGJvb2wgaXNfY29tcHJlc3MpCi17Ci0JaW50IG1hcF9zaXplOwotCWludCBpbmRleDsKLQlzdHJ1Y3Qgc3N0X2Rldl9zdHJlYW1fbWFwICptYXA7Ci0Jc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpwc3RyZWFtID0gTlVMTDsKLQlzdHJ1Y3Qgc25kX2NvbXByX3N0cmVhbSAqY3N0cmVhbSA9IE5VTEw7Ci0KLQltYXAgPSBjdHgtPnBkYXRhLT5wZGV2X3N0cm1fbWFwOwotCW1hcF9zaXplID0gY3R4LT5wZGF0YS0+c3RybV9tYXBfc2l6ZTsKLQotCWlmIChpc19jb21wcmVzcyA9PSB0cnVlKQotCQljc3RyZWFtID0gKHN0cnVjdCBzbmRfY29tcHJfc3RyZWFtICopc3Vic3RyZWFtOwotCWVsc2UKLQkJcHN0cmVhbSA9IChzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKilzdWJzdHJlYW07Ci0KLQlzdHJfcGFyYW1zLT5zdHJlYW1fdHlwZSA9IFNTVF9TVFJFQU1fVFlQRV9NVVNJQzsKLQotCS8qIEZvciBwY20gc3RyZWFtcyAqLwotCWlmIChwc3RyZWFtKSB7Ci0JCWluZGV4ID0gc3N0X2dldF9zdHJlYW1fbWFwcGluZyhwc3RyZWFtLT5wY20tPmRldmljZSwKLQkJCQkJICBwc3RyZWFtLT5udW1iZXIsIHBzdHJlYW0tPnN0cmVhbSwKLQkJCQkJICBtYXAsIG1hcF9zaXplKTsKLQkJaWYgKGluZGV4IDw9IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlzdHJfcGFyYW1zLT5zdHJlYW1faWQgPSBpbmRleDsKLQkJc3RyX3BhcmFtcy0+ZGV2aWNlX3R5cGUgPSBtYXBbaW5kZXhdLmRldmljZV9pZDsKLQkJc3RyX3BhcmFtcy0+dGFzayA9IG1hcFtpbmRleF0udGFza19pZDsKLQotCQlzdHJfcGFyYW1zLT5vcHMgPSAodTgpcHN0cmVhbS0+c3RyZWFtOwotCX0KLQotCWlmIChjc3RyZWFtKSB7Ci0JCWluZGV4ID0gc3N0X2dldF9zdHJlYW1fbWFwcGluZyhjc3RyZWFtLT5kZXZpY2UtPmRldmljZSwKLQkJCQkJICAgICAgIDAsIGNzdHJlYW0tPmRpcmVjdGlvbiwKLQkJCQkJICAgICAgIG1hcCwgbWFwX3NpemUpOwotCQlpZiAoaW5kZXggPD0gMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlzdHJfcGFyYW1zLT5zdHJlYW1faWQgPSBpbmRleDsKLQkJc3RyX3BhcmFtcy0+ZGV2aWNlX3R5cGUgPSBtYXBbaW5kZXhdLmRldmljZV9pZDsKLQkJc3RyX3BhcmFtcy0+dGFzayA9IG1hcFtpbmRleF0udGFza19pZDsKLQotCQlzdHJfcGFyYW1zLT5vcHMgPSAodTgpY3N0cmVhbS0+ZGlyZWN0aW9uOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fYWxsb2Nfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0gPQotCQkJc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zc3Rfc3RyZWFtX3BhcmFtcyBwYXJhbSA9IHt7ezAsfSx9LH07Ci0Jc3RydWN0IHNuZF9zc3RfcGFyYW1zIHN0cl9wYXJhbXMgPSB7MH07Ci0Jc3RydWN0IHNuZF9zc3RfYWxsb2NfcGFyYW1zX2V4dCBhbGxvY19wYXJhbXMgPSB7MH07Ci0JaW50IHJldF92YWwgPSAwOwotCXN0cnVjdCBzc3RfZGF0YSAqY3R4ID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKLQotCS8qIHNldCBjb2RlYyBwYXJhbXMgYW5kIGluZm9ybSBTU1QgZHJpdmVyIHRoZSBzYW1lICovCi0Jc3N0X2ZpbGxfcGNtX3BhcmFtcyhzdWJzdHJlYW0sICZwYXJhbSk7Ci0Jc3N0X2ZpbGxfYWxsb2NfcGFyYW1zKHN1YnN0cmVhbSwgJmFsbG9jX3BhcmFtcyk7Ci0Jc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSA9IHN1YnN0cmVhbS0+ZG1hX2J1ZmZlci5hcmVhOwotCXN0cl9wYXJhbXMuc3BhcmFtcyA9IHBhcmFtOwotCXN0cl9wYXJhbXMuYXBhcmFtcyA9IGFsbG9jX3BhcmFtczsKLQlzdHJfcGFyYW1zLmNvZGVjID0gU1NUX0NPREVDX1RZUEVfUENNOwotCi0JLyogZmlsbCB0aGUgZGV2aWNlIHR5cGUgYW5kIHN0cmVhbSBpZCB0byBwYXNzIHRvIFNTVCBkcml2ZXIgKi8KLQlyZXRfdmFsID0gc3N0X2ZpbGxfc3RyZWFtX3BhcmFtcyhzdWJzdHJlYW0sIGN0eCwgJnN0cl9wYXJhbXMsIGZhbHNlKTsKLQlpZiAocmV0X3ZhbCA8IDApCi0JCXJldHVybiByZXRfdmFsOwotCi0Jc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQgPSBzdHJfcGFyYW1zLnN0cmVhbV9pZDsKLQotCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+b3Blbihzc3QtPmRldiwgJnN0cl9wYXJhbXMpOwotCWlmIChyZXRfdmFsIDw9IDApCi0JCXJldHVybiByZXRfdmFsOwotCi0KLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIHZvaWQgc3N0X3BlcmlvZF9lbGFwc2VkKHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGFyZzsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07Ci0JaW50IHN0YXR1czsKLQotCWlmICghc3Vic3RyZWFtIHx8ICFzdWJzdHJlYW0tPnJ1bnRpbWUpCi0JCXJldHVybjsKLQlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlpZiAoIXN0cmVhbSkKLQkJcmV0dXJuOwotCXN0YXR1cyA9IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0pOwotCWlmIChzdGF0dXMgIT0gU1NUX1BMQVRGT1JNX1JVTk5JTkcpCi0JCXJldHVybjsKLQlzbmRfcGNtX3BlcmlvZF9lbGFwc2VkKHN1YnN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX2luaXRfc3RyZWFtKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSA9Ci0JCQlzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJldF92YWw7Ci0KLQlkZXZfZGJnKHJ0ZC0+ZGV2LCAic2V0dGluZyBidWZmZXIgcHRyIHBhcmFtXG4iKTsKLQlzc3Rfc2V0X3N0cmVhbV9zdGF0dXMoc3RyZWFtLCBTU1RfUExBVEZPUk1fSU5JVCk7Ci0Jc3RyZWFtLT5zdHJlYW1faW5mby5wZXJpb2RfZWxhcHNlZCA9IHNzdF9wZXJpb2RfZWxhcHNlZDsKLQlzdHJlYW0tPnN0cmVhbV9pbmZvLmFyZyA9IHN1YnN0cmVhbTsKLQlzdHJlYW0tPnN0cmVhbV9pbmZvLmJ1ZmZlcl9wdHIgPSAwOwotCXN0cmVhbS0+c3RyZWFtX2luZm8uc2ZyZXEgPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnJhdGU7Ci0JcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5zdHJlYW1faW5pdChzc3QtPmRldiwgJnN0cmVhbS0+c3RyZWFtX2luZm8pOwotCWlmIChyZXRfdmFsKQotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAiY29udHJvbF9zZXQgcmV0IGVycm9yICVkXG4iLCByZXRfdmFsKTsKLQlyZXR1cm4gcmV0X3ZhbDsKLQotfQotCi1zdGF0aWMgaW50IHBvd2VyX3VwX3NzdChzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0pCi17Ci0JcmV0dXJuIHN0cmVhbS0+b3BzLT5wb3dlcihzc3QtPmRldiwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBvd2VyX2Rvd25fc3N0KHN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbSkKLXsKLQlzdHJlYW0tPm9wcy0+cG93ZXIoc3N0LT5kZXYsIGZhbHNlKTsKLX0KLQotc3RhdGljIGludCBzc3RfbWVkaWFfb3BlbihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0JaW50IHJldF92YWwgPSAwOwotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCi0Jc3RyZWFtID0ga3phbGxvYyhzaXplb2YoKnN0cmVhbSksIEdGUF9LRVJORUwpOwotCWlmICghc3RyZWFtKQotCQlyZXR1cm4gLUVOT01FTTsKLQlzcGluX2xvY2tfaW5pdCgmc3RyZWFtLT5zdGF0dXNfbG9jayk7Ci0KLQkvKiBnZXQgdGhlIHNzdCBvcHMgKi8KLQltdXRleF9sb2NrKCZzc3RfbG9jayk7Ci0JaWYgKCFzc3QgfHwKLQkgICAgIXRyeV9tb2R1bGVfZ2V0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKSkgewotCQlkZXZfZXJyKGRhaS0+ZGV2LCAibm8gZGV2aWNlIGF2YWlsYWJsZSB0byBydW5cbiIpOwotCQlyZXRfdmFsID0gLUVOT0RFVjsKLQkJZ290byBvdXRfb3BzOwotCX0KLQlzdHJlYW0tPm9wcyA9IHNzdC0+b3BzOwotCW11dGV4X3VubG9jaygmc3N0X2xvY2spOwotCi0Jc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQgPSAwOwotCi0Jc3RyZWFtLT5zdHJlYW1faW5mby5hcmcgPSBzdWJzdHJlYW07Ci0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciBTU1QgQVBJIHNldCAqLwotCXJ1bnRpbWUtPnByaXZhdGVfZGF0YSA9IHN0cmVhbTsKLQotCXJldF92YWwgPSBwb3dlcl91cF9zc3Qoc3RyZWFtKTsKLQlpZiAocmV0X3ZhbCA8IDApCi0JCXJldHVybiByZXRfdmFsOwotCi0JLyogTWFrZSBzdXJlLCB0aGF0IHRoZSBwZXJpb2Qgc2l6ZSBpcyBhbHdheXMgZXZlbiAqLwotCXNuZF9wY21faHdfY29uc3RyYWludF9zdGVwKHN1YnN0cmVhbS0+cnVudGltZSwgMCwKLQkJCSAgIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTLCAyKTsKLQotCXJldHVybiBzbmRfcGNtX2h3X2NvbnN0cmFpbnRfaW50ZWdlcihydW50aW1lLAotCQkJIFNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKLW91dF9vcHM6Ci0Ja2ZyZWUoc3RyZWFtKTsKLQltdXRleF91bmxvY2soJnNzdF9sb2NrKTsKLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIHZvaWQgc3N0X21lZGlhX2Nsb3NlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW07Ci0JaW50IHJldF92YWwgPSAwLCBzdHJfaWQ7Ci0KLQlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlwb3dlcl9kb3duX3NzdChzdHJlYW0pOwotCi0Jc3RyX2lkID0gc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQ7Ci0JaWYgKHN0cl9pZCkKLQkJcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5jbG9zZShzc3QtPmRldiwgc3RyX2lkKTsKLQltb2R1bGVfcHV0KHNzdC0+ZGV2LT5kcml2ZXItPm93bmVyKTsKLQlrZnJlZShzdHJlYW0pOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfY3VycmVudF9waXBlX2lkKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLAotCQkJCQkgICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNzdF9kYXRhICpzc3QgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOwotCXN0cnVjdCBzc3RfZGV2X3N0cmVhbV9tYXAgKm1hcCA9IHNzdC0+cGRhdGEtPnBkZXZfc3RybV9tYXA7Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtID0KLQkJCXN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXUzMiBzdHJfaWQgPSBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZDsKLQl1bnNpZ25lZCBpbnQgcGlwZV9pZDsKLQotCXBpcGVfaWQgPSBtYXBbc3RyX2lkXS5kZXZpY2VfaWQ7Ci0KLQlkZXZfZGJnKGRhaS0+ZGV2LCAiZ290IHBpcGVfaWQgPSAlI3ggZm9yIHN0cl9pZCA9ICVkXG4iLAotCQkJcGlwZV9pZCwgc3RyX2lkKTsKLQlyZXR1cm4gcGlwZV9pZDsKLX0KLQotc3RhdGljIGludCBzc3RfbWVkaWFfcHJlcGFyZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKLQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0Jc3RydWN0IHNzdF9ydW50aW1lX3N0cmVhbSAqc3RyZWFtOwotCWludCByZXRfdmFsID0gMCwgc3RyX2lkOwotCi0Jc3RyZWFtID0gc3Vic3RyZWFtLT5ydW50aW1lLT5wcml2YXRlX2RhdGE7Ci0Jc3RyX2lkID0gc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQ7Ci0JaWYgKHN0cmVhbS0+c3RyZWFtX2luZm8uc3RyX2lkKSB7Ci0JCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+c3RyZWFtX2Ryb3Aoc3N0LT5kZXYsIHN0cl9pZCk7Ci0JCXJldHVybiByZXRfdmFsOwotCX0KLQotCXJldF92YWwgPSBzc3RfcGxhdGZvcm1fYWxsb2Nfc3RyZWFtKHN1YnN0cmVhbSwgZGFpKTsKLQlpZiAocmV0X3ZhbCA8PSAwKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQlzbnByaW50ZihzdWJzdHJlYW0tPnBjbS0+aWQsIHNpemVvZihzdWJzdHJlYW0tPnBjbS0+aWQpLAotCQkJIiVkIiwgc3RyZWFtLT5zdHJlYW1faW5mby5zdHJfaWQpOwotCi0JcmV0X3ZhbCA9IHNzdF9wbGF0Zm9ybV9pbml0X3N0cmVhbShzdWJzdHJlYW0pOwotCWlmIChyZXRfdmFsKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQlzdWJzdHJlYW0tPnJ1bnRpbWUtPmh3LmluZm8gPSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUjsKLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIGludCBzc3RfbWVkaWFfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zLAotCQkJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7Ci0JbWVtc2V0KHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FyZWEsIDAsIHBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X21lZGlhX2h3X2ZyZWUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQotewotCXJldHVybiBzbmRfcGNtX2xpYl9mcmVlX3BhZ2VzKHN1YnN0cmVhbSk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2VuYWJsZV9zc3Aoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghZGFpLT5hY3RpdmUpIHsKLQkJcmV0ID0gc3N0X2hhbmRsZV92Yl90aW1lcihkYWksIHRydWUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQkJcmV0ID0gc2VuZF9zc3BfY21kKGRhaSwgZGFpLT5uYW1lLCAxKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgc3N0X2Rpc2FibGVfc3NwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCi17Ci0JaWYgKCFkYWktPmFjdGl2ZSkgewotCQlzZW5kX3NzcF9jbWQoZGFpLCBkYWktPm5hbWUsIDApOwotCQlzc3RfaGFuZGxlX3ZiX3RpbWVyKGRhaSwgZmFsc2UpOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgc3N0X21lZGlhX2RhaV9vcHMgPSB7Ci0JLnN0YXJ0dXAgPSBzc3RfbWVkaWFfb3BlbiwKLQkuc2h1dGRvd24gPSBzc3RfbWVkaWFfY2xvc2UsCi0JLnByZXBhcmUgPSBzc3RfbWVkaWFfcHJlcGFyZSwKLQkuaHdfcGFyYW1zID0gc3N0X21lZGlhX2h3X3BhcmFtcywKLQkuaHdfZnJlZSA9IHNzdF9tZWRpYV9od19mcmVlLAotCS5tdXRlX3N0cmVhbSA9IHNzdF9tZWRpYV9kaWdpdGFsX211dGUsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBzc3RfY29tcHJfZGFpX29wcyA9IHsKLQkubXV0ZV9zdHJlYW0gPSBzc3RfbWVkaWFfZGlnaXRhbF9tdXRlLAotfTsKLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9vcHMgc3N0X2JlX2RhaV9vcHMgPSB7Ci0JLnN0YXJ0dXAgPSBzc3RfZW5hYmxlX3NzcCwKLQkuc2h1dGRvd24gPSBzc3RfZGlzYWJsZV9zc3AsCi19OwotCi1zdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciBzc3RfcGxhdGZvcm1fZGFpW10gPSB7Ci17Ci0JLm5hbWUgPSAibWVkaWEtY3B1LWRhaSIsCi0JLm9wcyA9ICZzc3RfbWVkaWFfZGFpX29wcywKLQkucGxheWJhY2sgPSB7Ci0JCS5zdHJlYW1fbmFtZSA9ICJIZWFkc2V0IFBsYXliYWNrIiwKLQkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCi0JCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80NDEwMHxTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQl9LAotCS5jYXB0dXJlID0gewotCQkuc3RyZWFtX25hbWUgPSAiSGVhZHNldCBDYXB0dXJlIiwKLQkJLmNoYW5uZWxzX21pbiA9IDEsCi0JCS5jaGFubmVsc19tYXggPSAyLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80NDEwMHxTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQl9LAotfSwKLXsKLQkubmFtZSA9ICJjb21wcmVzcy1jcHUtZGFpIiwKLQkuY29tcHJlc3NfZGFpID0gMSwKLQkub3BzID0gJnNzdF9jb21wcl9kYWlfb3BzLAotCS5wbGF5YmFjayA9IHsKLQkJLnN0cmVhbV9uYW1lID0gIkNvbXByZXNzIFBsYXliYWNrIiwKLQkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCi0JCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQl9LAotfSwKLS8qIEJFIENQVSAgRGFpcyAqLwotewotCS5uYW1lID0gInNzcDAtcG9ydCIsCi0JLm9wcyA9ICZzc3RfYmVfZGFpX29wcywKLQkucGxheWJhY2sgPSB7Ci0JCS5zdHJlYW1fbmFtZSA9ICJzc3AwIFR4IiwKLQkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCi0JCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQl9LAotCS5jYXB0dXJlID0gewotCQkuc3RyZWFtX25hbWUgPSAic3NwMCBSeCIsCi0JCS5jaGFubmVsc19taW4gPSBTU1RfU1RFUkVPLAotCQkuY2hhbm5lbHNfbWF4ID0gU1NUX1NURVJFTywKLQkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfNDgwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JfSwKLX0sCi17Ci0JLm5hbWUgPSAic3NwMS1wb3J0IiwKLQkub3BzID0gJnNzdF9iZV9kYWlfb3BzLAotCS5wbGF5YmFjayA9IHsKLQkJLnN0cmVhbV9uYW1lID0gInNzcDEgVHgiLAotCQkuY2hhbm5lbHNfbWluID0gU1NUX1NURVJFTywKLQkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDB8U05EUlZfUENNX1JBVEVfMTYwMDB8U05EUlZfUENNX1JBVEVfNDgwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JfSwKLQkuY2FwdHVyZSA9IHsKLQkJLnN0cmVhbV9uYW1lID0gInNzcDEgUngiLAotCQkuY2hhbm5lbHNfbWluID0gU1NUX1NURVJFTywKLQkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzgwMDB8U05EUlZfUENNX1JBVEVfMTYwMDB8U05EUlZfUENNX1JBVEVfNDgwMDAsCi0JCS5mb3JtYXRzID0gU05EUlZfUENNX0ZNVEJJVF9TMTZfTEUsCi0JfSwKLX0sCi17Ci0JLm5hbWUgPSAic3NwMi1wb3J0IiwKLQkub3BzID0gJnNzdF9iZV9kYWlfb3BzLAotCS5wbGF5YmFjayA9IHsKLQkJLnN0cmVhbV9uYW1lID0gInNzcDIgVHgiLAotCQkuY2hhbm5lbHNfbWluID0gU1NUX1NURVJFTywKLQkJLmNoYW5uZWxzX21heCA9IFNTVF9TVEVSRU8sCi0JCS5yYXRlcyA9IFNORFJWX1BDTV9SQVRFXzQ4MDAwLAotCQkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAotCX0sCi0JLmNhcHR1cmUgPSB7Ci0JCS5zdHJlYW1fbmFtZSA9ICJzc3AyIFJ4IiwKLQkJLmNoYW5uZWxzX21pbiA9IFNTVF9TVEVSRU8sCi0JCS5jaGFubmVsc19tYXggPSBTU1RfU1RFUkVPLAotCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV80ODAwMCwKLQkJLmZvcm1hdHMgPSBTTkRSVl9QQ01fRk1UQklUX1MxNl9MRSwKLQl9LAotfSwKLX07Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX29wZW4oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCi17Ci0Jc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZTsKLQotCWlmIChzdWJzdHJlYW0tPnBjbS0+aW50ZXJuYWwpCi0JCXJldHVybiAwOwotCi0JcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKLQlydW50aW1lLT5odyA9IHNzdF9wbGF0Zm9ybV9wY21faHc7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3BjbV90cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCQlpbnQgY21kKQotewotCWludCByZXRfdmFsID0gMCwgc3RyX2lkOwotCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKLQlpbnQgc3RhdHVzOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQotCWRldl9kYmcocnRkLT5kZXYsICJzc3RfcGxhdGZvcm1fcGNtX3RyaWdnZXIgY2FsbGVkXG4iKTsKLQlpZiAoc3Vic3RyZWFtLT5wY20tPmludGVybmFsKQotCQlyZXR1cm4gMDsKLQlzdHJlYW0gPSBzdWJzdHJlYW0tPnJ1bnRpbWUtPnByaXZhdGVfZGF0YTsKLQlzdHJfaWQgPSBzdHJlYW0tPnN0cmVhbV9pbmZvLnN0cl9pZDsKLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6Ci0JCWRldl9kYmcocnRkLT5kZXYsICJzc3Q6IFRyaWdnZXIgU3RhcnRcbiIpOwotCQlzdGF0dXMgPSBTU1RfUExBVEZPUk1fUlVOTklORzsKLQkJc3RyZWFtLT5zdHJlYW1faW5mby5hcmcgPSBzdWJzdHJlYW07Ci0JCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+c3RyZWFtX3N0YXJ0KHNzdC0+ZGV2LCBzdHJfaWQpOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6Ci0JCWRldl9kYmcocnRkLT5kZXYsICJzc3Q6IGluIHN0b3BcbiIpOwotCQlzdGF0dXMgPSBTU1RfUExBVEZPUk1fRFJPUFBFRDsKLQkJcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5zdHJlYW1fZHJvcChzc3QtPmRldiwgc3RyX2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9QQVVTRV9QVVNIOgotCQlkZXZfZGJnKHJ0ZC0+ZGV2LCAic3N0OiBpbiBwYXVzZVxuIik7Ci0JCXN0YXR1cyA9IFNTVF9QTEFURk9STV9QQVVTRUQ7Ci0JCXJldF92YWwgPSBzdHJlYW0tPm9wcy0+c3RyZWFtX3BhdXNlKHNzdC0+ZGV2LCBzdHJfaWQpOwotCQlicmVhazsKLQljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6Ci0JCWRldl9kYmcocnRkLT5kZXYsICJzc3Q6IGluIHBhdXNlIHJlbGVhc2VcbiIpOwotCQlzdGF0dXMgPSBTU1RfUExBVEZPUk1fUlVOTklORzsKLQkJcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5zdHJlYW1fcGF1c2VfcmVsZWFzZShzc3QtPmRldiwgc3RyX2lkKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCFyZXRfdmFsKQotCQlzc3Rfc2V0X3N0cmVhbV9zdGF0dXMoc3RyZWFtLCBzdGF0dXMpOwotCi0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLQotc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNzdF9wbGF0Zm9ybV9wY21fcG9pbnRlcgotCQkJKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQotewotCXN0cnVjdCBzc3RfcnVudGltZV9zdHJlYW0gKnN0cmVhbTsKLQlpbnQgcmV0X3ZhbCwgc3RhdHVzOwotCXN0cnVjdCBwY21fc3RyZWFtX2luZm8gKnN0cl9pbmZvOwotCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKLQotCXN0cmVhbSA9IHN1YnN0cmVhbS0+cnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXN0YXR1cyA9IHNzdF9nZXRfc3RyZWFtX3N0YXR1cyhzdHJlYW0pOwotCWlmIChzdGF0dXMgPT0gU1NUX1BMQVRGT1JNX0lOSVQpCi0JCXJldHVybiAwOwotCXN0cl9pbmZvID0gJnN0cmVhbS0+c3RyZWFtX2luZm87Ci0JcmV0X3ZhbCA9IHN0cmVhbS0+b3BzLT5zdHJlYW1fcmVhZF90c3RhbXAoc3N0LT5kZXYsIHN0cl9pbmZvKTsKLQlpZiAocmV0X3ZhbCkgewotCQlkZXZfZXJyKHJ0ZC0+ZGV2LCAic3N0OiBlcnJvciBjb2RlID0gJWRcbiIsIHJldF92YWwpOwotCQlyZXR1cm4gcmV0X3ZhbDsKLQl9Ci0Jc3Vic3RyZWFtLT5ydW50aW1lLT5kZWxheSA9IHN0cl9pbmZvLT5wY21fZGVsYXk7Ci0JcmV0dXJuIHN0cl9pbmZvLT5idWZmZXJfcHRyOwotfQotCi1zdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIHNzdF9wbGF0Zm9ybV9vcHMgPSB7Ci0JLm9wZW4gPSBzc3RfcGxhdGZvcm1fb3BlbiwKLQkuaW9jdGwgPSBzbmRfcGNtX2xpYl9pb2N0bCwKLQkudHJpZ2dlciA9IHNzdF9wbGF0Zm9ybV9wY21fdHJpZ2dlciwKLQkucG9pbnRlciA9IHNzdF9wbGF0Zm9ybV9wY21fcG9pbnRlciwKLX07Ci0KLXN0YXRpYyBpbnQgc3N0X3BjbV9uZXcoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKLQlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlpZiAoZGFpLT5kcml2ZXItPnBsYXliYWNrLmNoYW5uZWxzX21pbiB8fAotCQkJZGFpLT5kcml2ZXItPmNhcHR1cmUuY2hhbm5lbHNfbWluKSB7Ci0JCXJldHZhbCA9ICBzbmRfcGNtX2xpYl9wcmVhbGxvY2F0ZV9wYWdlc19mb3JfYWxsKHBjbSwKLQkJCVNORFJWX0RNQV9UWVBFX0NPTlRJTlVPVVMsCi0JCQlzbmRfZG1hX2NvbnRpbnVvdXNfZGF0YShHRlBfRE1BKSwKLQkJCVNTVF9NSU5fQlVGRkVSLCBTU1RfTUFYX0JVRkZFUik7Ci0JCWlmIChyZXR2YWwpIHsKLQkJCWRldl9lcnIocnRkLT5kZXYsICJkbWEgYnVmZmVyIGFsbG9jYXRpb25mIGZhaWxcbiIpOwotCQkJcmV0dXJuIHJldHZhbDsKLQkJfQotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IHNzdF9zb2NfcHJvYmUoc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtKQotewotCXJldHVybiBzc3RfZHNwX2luaXRfdjJfZHBjbShwbGF0Zm9ybSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgc3N0X3NvY19wbGF0Zm9ybV9kcnYgID0gewotCS5wcm9iZQkJPSBzc3Rfc29jX3Byb2JlLAotCS5vcHMJCT0gJnNzdF9wbGF0Zm9ybV9vcHMsCi0JLmNvbXByX29wcwk9ICZzc3RfcGxhdGZvcm1fY29tcHJfb3BzLAotCS5wY21fbmV3CT0gc3N0X3BjbV9uZXcsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfY29tcG9uZW50X2RyaXZlciBzc3RfY29tcG9uZW50ID0gewotCS5uYW1lCQk9ICJzc3QiLAotfTsKLQotCi1zdGF0aWMgaW50IHNzdF9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBzc3RfZGF0YSAqZHJ2OwotCWludCByZXQ7Ci0Jc3RydWN0IHNzdF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKLQotCWRydiA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRydiksIEdGUF9LRVJORUwpOwotCWlmIChkcnYgPT0gTlVMTCkgewotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnBkYXRhKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBkYXRhID09IE5VTEwpIHsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcGRhdGEtPnBkZXZfc3RybV9tYXAgPSBkcGNtX3N0cm1fbWFwOwotCXBkYXRhLT5zdHJtX21hcF9zaXplID0gQVJSQVlfU0laRShkcGNtX3N0cm1fbWFwKTsKLQlkcnYtPnBkYXRhID0gcGRhdGE7Ci0JZHJ2LT5wZGV2ID0gcGRldjsKLQltdXRleF9pbml0KCZkcnYtPmxvY2spOwotCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBkcnYpOwotCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybSgmcGRldi0+ZGV2LCAmc3N0X3NvY19wbGF0Zm9ybV9kcnYpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVnaXN0ZXJpbmcgc29jIHBsYXRmb3JtIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gc25kX3NvY19yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldiwgJnNzdF9jb21wb25lbnQsCi0JCQkJc3N0X3BsYXRmb3JtX2RhaSwgQVJSQVlfU0laRShzc3RfcGxhdGZvcm1fZGFpKSk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJyZWdpc3RlcmluZyBjcHUgZGFpcyBmYWlsZWRcbiIpOwotCQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3BsYXRmb3JtX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCi0Jc25kX3NvY191bnJlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2KTsKLQlzbmRfc29jX3VucmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldik7Ci0JZGV2X2RiZygmcGRldi0+ZGV2LCAic3N0X3BsYXRmb3JtX3JlbW92ZSBzdWNjZXNzXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3N0X3BsYXRmb3JtX2RyaXZlciA9IHsKLQkuZHJpdmVyCQk9IHsKLQkJLm5hbWUJCT0gInNzdC1tZmxkLXBsYXRmb3JtIiwKLQl9LAotCS5wcm9iZQkJPSBzc3RfcGxhdGZvcm1fcHJvYmUsCi0JLnJlbW92ZQkJPSBzc3RfcGxhdGZvcm1fcmVtb3ZlLAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzc3RfcGxhdGZvcm1fZHJpdmVyKTsKLQotTU9EVUxFX0RFU0NSSVBUSU9OKCJBU29DIEludGVsKFIpIE1JRCBQbGF0Zm9ybSBkcml2ZXIiKTsKLU1PRFVMRV9BVVRIT1IoIlZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPiIpOwotTU9EVUxFX0FVVEhPUigiSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPiIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwotTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzc3QtbWZsZC1wbGF0Zm9ybSIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC1tZmxkLXBsYXRmb3JtLmggYi9zb3VuZC9zb2MvaW50ZWwvc3N0LW1mbGQtcGxhdGZvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzljOGQxMi4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc3N0LW1mbGQtcGxhdGZvcm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogIHNzdF9tZmxkX3BsYXRmb3JtLmggLSBJbnRlbCBNSUQgUGxhdGZvcm0gZHJpdmVyIGhlYWRlciBmaWxlCi0gKgotICogIENvcHlyaWdodCAoQykgMjAxMCBJbnRlbCBDb3JwCi0gKiAgQXV0aG9yOiBWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4KLSAqICBBdXRob3I6IEhhcnNoYSBQcml5YSA8cHJpeWEuaGFyc2hhQGludGVsLmNvbT4KLSAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKi8KLQotI2lmbmRlZiBfX1NTVF9QTEFURk9STURSVl9IX18KLSNkZWZpbmUgX19TU1RfUExBVEZPUk1EUlZfSF9fCi0KLSNpbmNsdWRlICJzc3QtbWZsZC1kc3AuaCIKLQotZXh0ZXJuIHN0cnVjdCBzc3RfZGV2aWNlICpzc3Q7Ci0KLSNkZWZpbmUgU1NUX01PTk8JCTEKLSNkZWZpbmUgU1NUX1NURVJFTwkJMgotI2RlZmluZSBTU1RfTUFYX0NBUAkJNQotCi0jZGVmaW5lIFNTVF9NQVhfQlVGRkVSCQkoODAwKjEwMjQpCi0jZGVmaW5lIFNTVF9NSU5fQlVGRkVSCQkoODAwKjEwMjQpCi0jZGVmaW5lIFNTVF9NSU5fUEVSSU9EX0JZVEVTCTMyCi0jZGVmaW5lIFNTVF9NQVhfUEVSSU9EX0JZVEVTCVNTVF9NQVhfQlVGRkVSCi0jZGVmaW5lIFNTVF9NSU5fUEVSSU9EUwkJMgotI2RlZmluZSBTU1RfTUFYX1BFUklPRFMJCSgxMDI0KjIpCi0jZGVmaW5lIFNTVF9GSUZPX1NJWkUJCTAKLQotc3RydWN0IHBjbV9zdHJlYW1faW5mbyB7Ci0JaW50IHN0cl9pZDsKLQl2b2lkICphcmc7Ci0Jdm9pZCAoKnBlcmlvZF9lbGFwc2VkKSAodm9pZCAqYXJnKTsKLQl1bnNpZ25lZCBsb25nIGxvbmcgYnVmZmVyX3B0cjsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcGNtX2RlbGF5OwotCWludCBzZnJlcTsKLX07Ci0KLWVudW0gc3N0X2Rydl9zdGF0dXMgewotCVNTVF9QTEFURk9STV9JTklUID0gMSwKLQlTU1RfUExBVEZPUk1fU1RBUlRFRCwKLQlTU1RfUExBVEZPUk1fUlVOTklORywKLQlTU1RfUExBVEZPUk1fUEFVU0VELAotCVNTVF9QTEFURk9STV9EUk9QUEVELAotfTsKLQotZW51bSBzc3Rfc3RyZWFtX29wcyB7Ci0JU1RSRUFNX09QU19QTEFZQkFDSyA9IDAsCi0JU1RSRUFNX09QU19DQVBUVVJFLAotfTsKLQotZW51bSBzc3RfYXVkaW9fZGV2aWNlX3R5cGUgewotCVNORF9TU1RfREVWSUNFX0hFQURTRVQgPSAxLAotCVNORF9TU1RfREVWSUNFX0lIRiwKLQlTTkRfU1NUX0RFVklDRV9WSUJSQSwKLQlTTkRfU1NUX0RFVklDRV9IQVBUSUMsCi0JU05EX1NTVF9ERVZJQ0VfQ0FQVFVSRSwKLQlTTkRfU1NUX0RFVklDRV9DT01QUkVTUywKLX07Ci0KLS8qIFBDTSBQYXJhbWV0ZXJzICovCi1zdHJ1Y3Qgc3N0X3BjbV9wYXJhbXMgewotCXUxNiBjb2RlYzsJLyogY29kZWMgdHlwZSAqLwotCXU4IG51bV9jaGFuOwkvKiAxPU1vbm8sIDI9U3RlcmVvICovCi0JdTggcGNtX3dkX3N6OwkvKiAxNi8yNCAtIGJpdCovCi0JdTMyIHJlc2VydmVkOwkvKiBCaXRyYXRlIGluIGJpdHMgcGVyIHNlY29uZCAqLwotCXUzMiBzZnJlcTsJLyogU2FtcGxpbmcgcmF0ZSBpbiBIeiAqLwotCXUzMiByaW5nX2J1ZmZlcl9zaXplOwotCXUzMiBwZXJpb2RfY291bnQ7CS8qIHBlcmlvZCBlbGFwc2VkIGluIHNhbXBsZXMqLwotCXUzMiByaW5nX2J1ZmZlcl9hZGRyOwotfTsKLQotc3RydWN0IHNzdF9zdHJlYW1fcGFyYW1zIHsKLQl1MzIgcmVzdWx0OwotCXUzMiBzdHJlYW1faWQ7Ci0JdTggY29kZWM7Ci0JdTggb3BzOwotCXU4IHN0cmVhbV90eXBlOwotCXU4IGRldmljZV90eXBlOwotCXN0cnVjdCBzc3RfcGNtX3BhcmFtcyBzcGFyYW1zOwotfTsKLQotc3RydWN0IHNzdF9jb21wcmVzc19jYiB7Ci0Jdm9pZCAqcGFyYW07Ci0Jdm9pZCAoKmNvbXByX2NiKSh2b2lkICpwYXJhbSk7Ci0Jdm9pZCAqZHJhaW5fY2JfcGFyYW07Ci0Jdm9pZCAoKmRyYWluX25vdGlmeSkodm9pZCAqcGFyYW0pOwotfTsKLQotc3RydWN0IGNvbXByZXNzX3NzdF9vcHMgewotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JaW50ICgqb3Blbikoc3RydWN0IGRldmljZSAqZGV2LAotCQlzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbXMsIHN0cnVjdCBzc3RfY29tcHJlc3NfY2IgKmNiKTsKLQlpbnQgKCpzdHJlYW1fc3RhcnQpKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCk7Ci0JaW50ICgqc3RyZWFtX2Ryb3ApKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCk7Ci0JaW50ICgqc3RyZWFtX2RyYWluKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQpOwotCWludCAoKnN0cmVhbV9wYXJ0aWFsX2RyYWluKShzdHJ1Y3QgZGV2aWNlICpkZXYsCXVuc2lnbmVkIGludCBzdHJfaWQpOwotCWludCAoKnN0cmVhbV9wYXVzZSkoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3RyX2lkKTsKLQlpbnQgKCpzdHJlYW1fcGF1c2VfcmVsZWFzZSkoc3RydWN0IGRldmljZSAqZGV2LAl1bnNpZ25lZCBpbnQgc3RyX2lkKTsKLQotCWludCAoKnRzdGFtcCkoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3RyX2lkLAotCQkJc3RydWN0IHNuZF9jb21wcl90c3RhbXAgKnRzdGFtcCk7Ci0JaW50ICgqYWNrKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQsCi0JCQl1bnNpZ25lZCBsb25nIGJ5dGVzKTsKLQlpbnQgKCpjbG9zZSkoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3RyX2lkKTsKLQlpbnQgKCpnZXRfY2Fwcykoc3RydWN0IHNuZF9jb21wcl9jYXBzICpjYXBzKTsKLQlpbnQgKCpnZXRfY29kZWNfY2Fwcykoc3RydWN0IHNuZF9jb21wcl9jb2RlY19jYXBzICpjb2RlYyk7Ci0JaW50ICgqc2V0X21ldGFkYXRhKShzdHJ1Y3QgZGV2aWNlICpkZXYsCXVuc2lnbmVkIGludCBzdHJfaWQsCi0JCQlzdHJ1Y3Qgc25kX2NvbXByX21ldGFkYXRhICptZGF0YSk7Ci0JaW50ICgqcG93ZXIpKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBzdGF0ZSk7Ci19OwotCi1zdHJ1Y3Qgc3N0X29wcyB7Ci0JaW50ICgqb3Blbikoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbSk7Ci0JaW50ICgqc3RyZWFtX2luaXQpKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqc3RyX2luZm8pOwotCWludCAoKnN0cmVhbV9zdGFydCkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc3RyX2lkKTsKLQlpbnQgKCpzdHJlYW1fZHJvcCkoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgc3RyX2lkKTsKLQlpbnQgKCpzdHJlYW1fcGF1c2UpKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHN0cl9pZCk7Ci0JaW50ICgqc3RyZWFtX3BhdXNlX3JlbGVhc2UpKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHN0cl9pZCk7Ci0JaW50ICgqc3RyZWFtX3JlYWRfdHN0YW1wKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwY21fc3RyZWFtX2luZm8gKnN0cl9pbmZvKTsKLQlpbnQgKCpzZW5kX2J5dGVfc3RyZWFtKShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzbmRfc3N0X2J5dGVzX3YyICpieXRlcyk7Ci0JaW50ICgqY2xvc2UpKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCk7Ci0JaW50ICgqcG93ZXIpKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBzdGF0ZSk7Ci19OwotCi1zdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtIHsKLQlpbnQgICAgIHN0cmVhbV9zdGF0dXM7Ci0JdW5zaWduZWQgaW50IGlkOwotCXNpemVfdCBieXRlc193cml0dGVuOwotCXN0cnVjdCBwY21fc3RyZWFtX2luZm8gc3RyZWFtX2luZm87Ci0Jc3RydWN0IHNzdF9vcHMgKm9wczsKLQlzdHJ1Y3QgY29tcHJlc3Nfc3N0X29wcyAqY29tcHJfb3BzOwotCXNwaW5sb2NrX3QJc3RhdHVzX2xvY2s7Ci19OwotCi1zdHJ1Y3Qgc3N0X2RldmljZSB7Ci0JY2hhciAqbmFtZTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jc3RydWN0IHNzdF9vcHMgKm9wczsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCBjb21wcmVzc19zc3Rfb3BzICpjb21wcl9vcHM7Ci19OwotCi1zdHJ1Y3Qgc3N0X2RhdGE7Ci0KLWludCBzc3RfZHNwX2luaXRfdjJfZHBjbShzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybSAqcGxhdGZvcm0pOwotaW50IHNzdF9zZW5kX3BpcGVfZ2FpbnMoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGludCBzdHJlYW0sIGludCBtdXRlKTsKLWludCBzZW5kX3NzcF9jbWQoc3RydWN0IHNuZF9zb2NfZGFpICpkYWksIGNvbnN0IGNoYXIgKmlkLCBib29sIGVuYWJsZSk7Ci1pbnQgc3N0X2hhbmRsZV92Yl90aW1lcihzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwgYm9vbCBlbmFibGUpOwotCi12b2lkIHNzdF9zZXRfc3RyZWFtX3N0YXR1cyhzdHJ1Y3Qgc3N0X3J1bnRpbWVfc3RyZWFtICpzdHJlYW0sIGludCBzdGF0ZSk7Ci1pbnQgc3N0X2ZpbGxfc3RyZWFtX3BhcmFtcyh2b2lkICpzdWJzdHJlYW0sIGNvbnN0IHN0cnVjdCBzc3RfZGF0YSAqY3R4LAotCQkJICAgc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW1zLCBib29sIGlzX2NvbXByZXNzKTsKLQotc3RydWN0IHNzdF9hbGdvX2ludF9jb250cm9sX3YyIHsKLQlzdHJ1Y3Qgc29jX21peGVyX2NvbnRyb2wgbWM7Ci0JdTE2IG1vZHVsZV9pZDsgLyogbW9kdWxlIGlkZW50aWZpZWVyICovCi0JdTE2IHBpcGVfaWQ7IC8qIGxvY2F0aW9uIGluZm86IHBpcGVfaWQgKyBpbnN0YW5jZV9pZCAqLwotCXUxNiBpbnN0YW5jZV9pZDsKLQl1bnNpZ25lZCBpbnQgdmFsdWU7IC8qIFZhbHVlIHJlY2VpdmVkIGlzIHN0b3JlZCBoZXJlICovCi19Owotc3RydWN0IHNzdF9kYXRhIHsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OwotCXN0cnVjdCBzc3RfcGxhdGZvcm1fZGF0YSAqcGRhdGE7Ci0Jc3RydWN0IHNuZF9zc3RfYnl0ZXNfdjIgKmJ5dGVfc3RyZWFtOwotCXN0cnVjdCBtdXRleCBsb2NrOwotfTsKLWludCBzc3RfcmVnaXN0ZXJfZHNwKHN0cnVjdCBzc3RfZGV2aWNlICpzc3QpOwotaW50IHNzdF91bnJlZ2lzdGVyX2RzcChzdHJ1Y3Qgc3N0X2RldmljZSAqc3N0KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC9zc3QuYyBiL3NvdW5kL3NvYy9pbnRlbC9zc3Qvc3N0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExYzU3ODYuLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL3NzdC9zc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKgotICogIHNzdC5jIC0gSW50ZWwgU1NUIERyaXZlciBmb3IgYXVkaW8gZW5naW5lCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOC0xNAlJbnRlbCBDb3JwCi0gKiAgQXV0aG9yczoJVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+Ci0gKgkJSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPgotICoJCURoYXJhZ2Vzd2FyaSBSIDxkaGFyYWdlc3dhcmkuckBpbnRlbC5jb20+Ci0gKgkJS1AgSmVlamEgPGplZWphLmtwQGludGVsLmNvbT4KLSAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgotI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxhc20vcGxhdGZvcm1fc3N0X2F1ZGlvLmg+Ci0jaW5jbHVkZSAiLi4vc3N0LW1mbGQtcGxhdGZvcm0uaCIKLSNpbmNsdWRlICJzc3QuaCIKLSNpbmNsdWRlICIuLi9zc3QtZHNwLmgiCi0KLU1PRFVMRV9BVVRIT1IoIlZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPiIpOwotTU9EVUxFX0FVVEhPUigiSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlbCAoUikgU1NUKFIpIEF1ZGlvIEVuZ2luZSBEcml2ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKLQotc3RhdGljIGlubGluZSBib29sIHNzdF9pc19wcm9jZXNzX3JlcGx5KHUzMiBtc2dfaWQpCi17Ci0JcmV0dXJuICgobXNnX2lkICYgUFJPQ0VTU19NU0cpID8gdHJ1ZSA6IGZhbHNlKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIHNzdF92YWxpZGF0ZV9tYWlsYm94X3NpemUodW5zaWduZWQgaW50IHNpemUpCi17Ci0JcmV0dXJuICgoc2l6ZSA8PSBTU1RfTUFJTEJPWF9TSVpFKSA/IHRydWUgOiBmYWxzZSk7Ci19Ci0KLXN0YXRpYyBpcnFyZXR1cm5fdCBpbnRlbF9zc3RfaW50ZXJydXB0X21yZmxkKGludCBpcnEsIHZvaWQgKmNvbnRleHQpCi17Ci0JdW5pb24gaW50ZXJydXB0X3JlZ19tcmZsZCBpc3I7Ci0JdW5pb24gaXBjX2hlYWRlcl9tcmZsZCBoZWFkZXI7Ci0JdW5pb24gc3N0X2ltcl9yZWdfbXJmbGQgaW1yOwotCXN0cnVjdCBpcGNfcG9zdCAqbXNnID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7Ci0Jc3RydWN0IGludGVsX3NzdF9kcnYgKmRydiA9IChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqKSBjb250ZXh0OwotCWlycXJldHVybl90IHJldHZhbCA9IElSUV9IQU5ETEVEOwotCi0JLyogSW50ZXJydXB0IGFycml2ZWQsIGNoZWNrIHNyYyAqLwotCWlzci5mdWxsID0gc3N0X3NoaW1fcmVhZDY0KGRydi0+c2hpbSwgU1NUX0lTUlgpOwotCi0JaWYgKGlzci5wYXJ0LmRvbmVfaW50ZXJydXB0KSB7Ci0JCS8qIENsZWFyIGRvbmUgYml0ICovCi0JCXNwaW5fbG9jaygmZHJ2LT5pcGNfc3Bpbl9sb2NrKTsKLQkJaGVhZGVyLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkNjQoZHJ2LT5zaGltLAotCQkJCQlkcnYtPmlwY19yZWcuaXBjeCk7Ci0JCWhlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQuZG9uZSA9IDA7Ci0JCXNzdF9zaGltX3dyaXRlNjQoZHJ2LT5zaGltLCBkcnYtPmlwY19yZWcuaXBjeCwgaGVhZGVyLmZ1bGwpOwotCi0JCS8qIHdyaXRlIDEgdG8gY2xlYXIgc3RhdHVzIHJlZ2lzdGVyICovOwotCQlpc3IucGFydC5kb25lX2ludGVycnVwdCA9IDE7Ci0JCXNzdF9zaGltX3dyaXRlNjQoZHJ2LT5zaGltLCBTU1RfSVNSWCwgaXNyLmZ1bGwpOwotCQlzcGluX3VubG9jaygmZHJ2LT5pcGNfc3Bpbl9sb2NrKTsKLQotCQkvKiB3ZSBjYW4gc2VuZCBtb3JlIG1lc3NhZ2VzIHRvIERTUCBzbyB0cmlnZ2VyIHdvcmsgKi8KLQkJcXVldWVfd29yayhkcnYtPnBvc3RfbXNnX3dxLCAmZHJ2LT5pcGNfcG9zdF9tc2dfd3EpOwotCQlyZXR2YWwgPSBJUlFfSEFORExFRDsKLQl9Ci0KLQlpZiAoaXNyLnBhcnQuYnVzeV9pbnRlcnJ1cHQpIHsKLQkJLyogbWVzc2FnZSBmcm9tIGRzcCBzbyBjb3B5IHRoYXQgKi8KLQkJc3Bpbl9sb2NrKCZkcnYtPmlwY19zcGluX2xvY2spOwotCQlpbXIuZnVsbCA9IHNzdF9zaGltX3JlYWQ2NChkcnYtPnNoaW0sIFNTVF9JTVJYKTsKLQkJaW1yLnBhcnQuYnVzeV9pbnRlcnJ1cHQgPSAxOwotCQlzc3Rfc2hpbV93cml0ZTY0KGRydi0+c2hpbSwgU1NUX0lNUlgsIGltci5mdWxsKTsKLQkJc3Bpbl91bmxvY2soJmRydi0+aXBjX3NwaW5fbG9jayk7Ci0JCWhlYWRlci5mdWxsID0gIHNzdF9zaGltX3JlYWQ2NChkcnYtPnNoaW0sIGRydi0+aXBjX3JlZy5pcGNkKTsKLQotCQlpZiAoc3N0X2NyZWF0ZV9pcGNfbXNnKCZtc2csIGhlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQubGFyZ2UpKSB7Ci0JCQlkcnYtPm9wcy0+Y2xlYXJfaW50ZXJydXB0KGRydik7Ci0JCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JCX0KLQotCQlpZiAoaGVhZGVyLnAuaGVhZGVyX2hpZ2gucGFydC5sYXJnZSkgewotCQkJc2l6ZSA9IGhlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZDsKLQkJCWlmIChzc3RfdmFsaWRhdGVfbWFpbGJveF9zaXplKHNpemUpKSB7Ci0JCQkJbWVtY3B5X2Zyb21pbyhtc2ctPm1haWxib3hfZGF0YSwKLQkJCQkJZHJ2LT5tYWlsYm94ICsgZHJ2LT5tYWlsYm94X3JlY3Zfb2Zmc2V0LCBzaXplKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGV2X2VycihkcnYtPmRldiwKLQkJCQkJIk1haWxib3ggbm90IGNvcGllZCwgcGF5bG9hZCBzaXplIGlzOiAldVxuIiwgc2l6ZSk7Ci0JCQkJaGVhZGVyLnAuaGVhZGVyX2xvd19wYXlsb2FkID0gMDsKLQkJCX0KLQkJfQotCi0JCW1zZy0+bXJmbGRfaGVhZGVyID0gaGVhZGVyOwotCQltc2ctPmlzX3Byb2Nlc3NfcmVwbHkgPQotCQkJc3N0X2lzX3Byb2Nlc3NfcmVwbHkoaGVhZGVyLnAuaGVhZGVyX2hpZ2gucGFydC5tc2dfaWQpOwotCQlzcGluX2xvY2soJmRydi0+cnhfbXNnX2xvY2spOwotCQlsaXN0X2FkZF90YWlsKCZtc2ctPm5vZGUsICZkcnYtPnJ4X2xpc3QpOwotCQlzcGluX3VubG9jaygmZHJ2LT5yeF9tc2dfbG9jayk7Ci0JCWRydi0+b3BzLT5jbGVhcl9pbnRlcnJ1cHQoZHJ2KTsKLQkJcmV0dmFsID0gSVJRX1dBS0VfVEhSRUFEOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgaW50ZWxfc3N0X2lycV90aHJlYWRfbXJmbGQoaW50IGlycSwgdm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqZHJ2ID0gKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICopIGNvbnRleHQ7Ci0Jc3RydWN0IGlwY19wb3N0ICpfX21zZywgKm1zZyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZHJ2LT5yeF9tc2dfbG9jaywgaXJxX2ZsYWdzKTsKLQlpZiAobGlzdF9lbXB0eSgmZHJ2LT5yeF9saXN0KSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkcnYtPnJ4X21zZ19sb2NrLCBpcnFfZmxhZ3MpOwotCQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci0JfQotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgX19tc2csICZkcnYtPnJ4X2xpc3QsIG5vZGUpIHsKLQkJbGlzdF9kZWwoJm1zZy0+bm9kZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRydi0+cnhfbXNnX2xvY2ssIGlycV9mbGFncyk7Ci0JCWlmIChtc2ctPmlzX3Byb2Nlc3NfcmVwbHkpCi0JCQlkcnYtPm9wcy0+cHJvY2Vzc19tZXNzYWdlKG1zZyk7Ci0JCWVsc2UKLQkJCWRydi0+b3BzLT5wcm9jZXNzX3JlcGx5KGRydiwgbXNnKTsKLQotCQlpZiAobXNnLT5pc19sYXJnZSkKLQkJCWtmcmVlKG1zZy0+bWFpbGJveF9kYXRhKTsKLQkJa2ZyZWUobXNnKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRydi0+cnhfbXNnX2xvY2ssIGlycV9mbGFncyk7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRydi0+cnhfbXNnX2xvY2ssIGlycV9mbGFncyk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IHNzdF9zYXZlX2RzcF9jb250ZXh0X3YyKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3QpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBzc3RfcHJlcGFyZV9hbmRfcG9zdF9tc2coc3N0LCBTU1RfVEFTS19JRF9NRURJQSwgSVBDX0NNRCwKLQkJCUlQQ19QUkVQX0QzLCBQSVBFX1JTVkQsIDAsIE5VTEwsIE5VTEwsCi0JCQl0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHNzdC0+ZGV2LCAibm90IHN1c3BlbmRpbmcgRlchISwgRXJyOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIHN0cnVjdCBpbnRlbF9zc3Rfb3BzIG1yZmxkX29wcyA9IHsKLQkuaW50ZXJydXB0ID0gaW50ZWxfc3N0X2ludGVycnVwdF9tcmZsZCwKLQkuaXJxX3RocmVhZCA9IGludGVsX3NzdF9pcnFfdGhyZWFkX21yZmxkLAotCS5jbGVhcl9pbnRlcnJ1cHQgPSBpbnRlbF9zc3RfY2xlYXJfaW50cl9tcmZsZCwKLQkuc3RhcnQgPSBzc3Rfc3RhcnRfbXJmbGQsCi0JLnJlc2V0ID0gaW50ZWxfc3N0X3Jlc2V0X2RzcF9tcmZsZCwKLQkucG9zdF9tZXNzYWdlID0gc3N0X3Bvc3RfbWVzc2FnZV9tcmZsZCwKLQkucHJvY2Vzc19yZXBseSA9IHNzdF9wcm9jZXNzX3JlcGx5X21yZmxkLAotCS5zYXZlX2RzcF9jb250ZXh0ID0gIHNzdF9zYXZlX2RzcF9jb250ZXh0X3YyLAotCS5hbGxvY19zdHJlYW0gPSBzc3RfYWxsb2Nfc3RyZWFtX21yZmxkLAotCS5wb3N0X2Rvd25sb2FkID0gc3N0X3Bvc3RfZG93bmxvYWRfbXJmbGQsCi19OwotCi1pbnQgc3N0X2RyaXZlcl9vcHMoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdCkKLXsKLQotCXN3aXRjaCAoc3N0LT5kZXZfaWQpIHsKLQljYXNlIFNTVF9NUkZMRF9QQ0lfSUQ6Ci0JY2FzZSBTU1RfQllUX0FDUElfSUQ6Ci0JY2FzZSBTU1RfQ0hWX0FDUElfSUQ6Ci0JCXNzdC0+dHN0YW1wID0gU1NUX1RJTUVfU1RBTVBfTVJGTEQ7Ci0JCXNzdC0+b3BzID0gJm1yZmxkX29wczsKLQkJcmV0dXJuIDA7Ci0KLQlkZWZhdWx0OgotCQlkZXZfZXJyKHNzdC0+ZGV2LAotCQkJIlNTVCBEcml2ZXIgY2FwYWJsaXRpZXMgbWlzc2luZyBmb3IgZGV2X2lkOiAleCIsIHNzdC0+ZGV2X2lkKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfTsKLX0KLQotdm9pZCBzc3RfcHJvY2Vzc19wZW5kaW5nX21zZyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGNvbnRhaW5lcl9vZih3b3JrLAotCQkJc3RydWN0IGludGVsX3NzdF9kcnYsIGlwY19wb3N0X21zZ193cSk7Ci0KLQljdHgtPm9wcy0+cG9zdF9tZXNzYWdlKGN0eCwgTlVMTCwgZmFsc2UpOwotfQotCi1zdGF0aWMgaW50IHNzdF93b3JrcXVldWVfaW5pdChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KQotewotCUlOSVRfTElTVF9IRUFEKCZjdHgtPm1lbWNweV9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmY3R4LT5yeF9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmY3R4LT5pcGNfZGlzcGF0Y2hfbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmN0eC0+YmxvY2tfbGlzdCk7Ci0JSU5JVF9XT1JLKCZjdHgtPmlwY19wb3N0X21zZ193cSwgc3N0X3Byb2Nlc3NfcGVuZGluZ19tc2cpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmN0eC0+d2FpdF9xdWV1ZSk7Ci0KLQljdHgtPnBvc3RfbXNnX3dxID0KLQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoInNzdF9wb3N0X21zZ193cSIpOwotCWlmICghY3R4LT5wb3N0X21zZ193cSkKLQkJcmV0dXJuIC1FQlVTWTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3N0X2luaXRfbG9ja3Moc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCkKLXsKLQltdXRleF9pbml0KCZjdHgtPnNzdF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmY3R4LT5yeF9tc2dfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmN0eC0+aXBjX3NwaW5fbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmN0eC0+YmxvY2tfbG9jayk7Ci19Ci0KLWludCBzc3RfYWxsb2NfZHJ2X2NvbnRleHQoc3RydWN0IGludGVsX3NzdF9kcnYgKipjdHgsCi0JCXN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGRldl9pZCkKLXsKLQkqY3R4ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKHN0cnVjdCBpbnRlbF9zc3RfZHJ2KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCEoKmN0eCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JKCpjdHgpLT5kZXYgPSBkZXY7Ci0JKCpjdHgpLT5kZXZfaWQgPSBkZXZfaWQ7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHNzdF9hbGxvY19kcnZfY29udGV4dCk7Ci0KLWludCBzc3RfY29udGV4dF9pbml0KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgpCi17Ci0JaW50IHJldCA9IDAsIGk7Ci0KLQlpZiAoIWN0eC0+cGRhdGEpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFjdHgtPnBkYXRhLT5wcm9iZV9kYXRhKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW1lbWNweSgmY3R4LT5pbmZvLCBjdHgtPnBkYXRhLT5wcm9iZV9kYXRhLCBzaXplb2YoY3R4LT5pbmZvKSk7Ci0KLQlyZXQgPSBzc3RfZHJpdmVyX29wcyhjdHgpOwotCWlmIChyZXQgIT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlzc3RfaW5pdF9sb2NrcyhjdHgpOwotCXNzdF9zZXRfZndfc3RhdGVfbG9ja2VkKGN0eCwgU1NUX1JFU0VUKTsKLQotCS8qIHB2dF9pZCAwIHJlc2VydmVkIGZvciBhc3luYyBtZXNzYWdlcyAqLwotCWN0eC0+cHZ0X2lkID0gMTsKLQljdHgtPnN0cmVhbV9jbnQgPSAwOwotCWN0eC0+ZndfaW5fbWVtID0gTlVMTDsKLQkvKiB3ZSB1c2UgbWVtY3B5LCBzbyBzZXQgdG8gMCAqLwotCWN0eC0+dXNlX2RtYSA9IDA7Ci0JY3R4LT51c2VfbGxpID0gMDsKLQotCWlmIChzc3Rfd29ya3F1ZXVlX2luaXQoY3R4KSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQljdHgtPm1haWxib3hfcmVjdl9vZmZzZXQgPSBjdHgtPnBkYXRhLT5pcGNfaW5mby0+bWJveF9yZWN2X29mZjsKLQljdHgtPmlwY19yZWcuaXBjeCA9IFNTVF9JUENYICsgY3R4LT5wZGF0YS0+aXBjX2luZm8tPmlwY19vZmZzZXQ7Ci0JY3R4LT5pcGNfcmVnLmlwY2QgPSBTU1RfSVBDRCArIGN0eC0+cGRhdGEtPmlwY19pbmZvLT5pcGNfb2Zmc2V0OwotCi0JZGV2X2luZm8oY3R4LT5kZXYsICJHb3QgZHJ2IGRhdGEgbWF4IHN0cmVhbSAlZFxuIiwKLQkJCQljdHgtPmluZm8ubWF4X3N0cmVhbXMpOwotCi0JZm9yIChpID0gMTsgaSA8PSBjdHgtPmluZm8ubWF4X3N0cmVhbXM7IGkrKykgewotCQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbSA9ICZjdHgtPnN0cmVhbXNbaV07Ci0KLQkJbWVtc2V0KHN0cmVhbSwgMCwgc2l6ZW9mKCpzdHJlYW0pKTsKLQkJc3RyZWFtLT5waXBlX2lkID0gUElQRV9SU1ZEOwotCQltdXRleF9pbml0KCZzdHJlYW0tPmxvY2spOwotCX0KLQotCS8qIFJlZ2lzdGVyIHRoZSBJU1IgKi8KLQlyZXQgPSBkZXZtX3JlcXVlc3RfdGhyZWFkZWRfaXJxKGN0eC0+ZGV2LCBjdHgtPmlycV9udW0sIGN0eC0+b3BzLT5pbnRlcnJ1cHQsCi0JCQkJCWN0eC0+b3BzLT5pcnFfdGhyZWFkLCAwLCBTU1RfRFJWX05BTUUsCi0JCQkJCWN0eCk7Ci0JaWYgKHJldCkKLQkJZ290byBkb19mcmVlX21lbTsKLQotCWRldl9kYmcoY3R4LT5kZXYsICJSZWdpc3RlcmVkIElSUSAlI3hcbiIsIGN0eC0+aXJxX251bSk7Ci0KLQkvKiBkZWZhdWx0IGludHIgYXJlIHVubWFza2VkIHNvIHNldCB0aGlzIGFzIG1hc2tlZCAqLwotCXNzdF9zaGltX3dyaXRlNjQoY3R4LT5zaGltLCBTU1RfSU1SWCwgMHhGRkZGMDAzOCk7Ci0KLQljdHgtPnFvcyA9IGRldm1fa3phbGxvYyhjdHgtPmRldiwKLQkJc2l6ZW9mKHN0cnVjdCBwbV9xb3NfcmVxdWVzdCksIEdGUF9LRVJORUwpOwotCWlmICghY3R4LT5xb3MpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBkb19mcmVlX21lbTsKLQl9Ci0JcG1fcW9zX2FkZF9yZXF1ZXN0KGN0eC0+cW9zLCBQTV9RT1NfQ1BVX0RNQV9MQVRFTkNZLAotCQkJCVBNX1FPU19ERUZBVUxUX1ZBTFVFKTsKLQotCWRldl9kYmcoY3R4LT5kZXYsICJSZXF1ZXN0aW5nIEZXICVzIG5vdy4uLlxuIiwgY3R4LT5maXJtd2FyZV9uYW1lKTsKLQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgdHJ1ZSwgY3R4LT5maXJtd2FyZV9uYW1lLAotCQkJCSAgICAgIGN0eC0+ZGV2LCBHRlBfS0VSTkVMLCBjdHgsIHNzdF9maXJtd2FyZV9sb2FkX2NiKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJGaXJtd2FyZSBkb3dubG9hZCBmYWlsZWQ6JWRcbiIsIHJldCk7Ci0JCWdvdG8gZG9fZnJlZV9tZW07Ci0JfQotCXNzdF9yZWdpc3RlcihjdHgtPmRldik7Ci0JcmV0dXJuIDA7Ci0KLWRvX2ZyZWVfbWVtOgotCWRlc3Ryb3lfd29ya3F1ZXVlKGN0eC0+cG9zdF9tc2dfd3EpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfY29udGV4dF9pbml0KTsKLQotdm9pZCBzc3RfY29udGV4dF9jbGVhbnVwKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgpCi17Ci0JcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoY3R4LT5kZXYpOwotCXBtX3J1bnRpbWVfZGlzYWJsZShjdHgtPmRldik7Ci0Jc3N0X3VucmVnaXN0ZXIoY3R4LT5kZXYpOwotCXNzdF9zZXRfZndfc3RhdGVfbG9ja2VkKGN0eCwgU1NUX1NIVVRET1dOKTsKLQlmbHVzaF9zY2hlZHVsZWRfd29yaygpOwotCWRlc3Ryb3lfd29ya3F1ZXVlKGN0eC0+cG9zdF9tc2dfd3EpOwotCXBtX3Fvc19yZW1vdmVfcmVxdWVzdChjdHgtPnFvcyk7Ci0Ja2ZyZWUoY3R4LT5md19zZ19saXN0LnNyYyk7Ci0Ja2ZyZWUoY3R4LT5md19zZ19saXN0LmRzdCk7Ci0JY3R4LT5md19zZ19saXN0Lmxpc3RfbGVuID0gMDsKLQlrZnJlZShjdHgtPmZ3X2luX21lbSk7Ci0JY3R4LT5md19pbl9tZW0gPSBOVUxMOwotCXNzdF9tZW1jcHlfZnJlZV9yZXNvdXJjZXMoY3R4KTsKLQljdHggPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwoc3N0X2NvbnRleHRfY2xlYW51cCk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzc3Rfc2F2ZV9zaGltNjQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwKLQkJCSAgICB2b2lkIF9faW9tZW0gKnNoaW0sCi0JCQkgICAgc3RydWN0IHNzdF9zaGltX3JlZ3M2NCAqc2hpbV9yZWdzKQotewotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+aXBjX3NwaW5fbG9jaywgaXJxX2ZsYWdzKTsKLQotCXNoaW1fcmVncy0+aW1yeCA9IHNzdF9zaGltX3JlYWQ2NChzaGltLCBTU1RfSU1SWCk7Ci0Jc2hpbV9yZWdzLT5jc3IgPSBzc3Rfc2hpbV9yZWFkNjQoc2hpbSwgU1NUX0NTUik7Ci0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+aXBjX3NwaW5fbG9jaywgaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNzdF9yZXN0b3JlX3NoaW02NChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LAotCQkJCSAgICAgIHZvaWQgX19pb21lbSAqc2hpbSwKLQkJCQkgICAgICBzdHJ1Y3Qgc3N0X3NoaW1fcmVnczY0ICpzaGltX3JlZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0KLQkvKgotCSAqIHdlIG9ubHkgbmVlZCB0byByZXN0b3JlIElNUlggZm9yIHRoaXMgY2FzZSwgcmVzdCB3aWxsIGJlCi0JICogaW5pdGlhbGl6ZSBieSBGVyBvciBkcml2ZXIgd2hlbiBmaXJtd2FyZSBpcyBsb2FkZWQKLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY3R4LT5pcGNfc3Bpbl9sb2NrLCBpcnFfZmxhZ3MpOwotCXNzdF9zaGltX3dyaXRlNjQoc2hpbSwgU1NUX0lNUlgsIHNoaW1fcmVncy0+aW1yeCksCi0Jc3N0X3NoaW1fd3JpdGU2NChzaGltLCBTU1RfQ1NSLCBzaGltX3JlZ3MtPmNzciksCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3R4LT5pcGNfc3Bpbl9sb2NrLCBpcnFfZmxhZ3MpOwotfQotCi12b2lkIHNzdF9jb25maWd1cmVfcnVudGltZV9wbShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KQotewotCXBtX3J1bnRpbWVfc2V0X2F1dG9zdXNwZW5kX2RlbGF5KGN0eC0+ZGV2LCBTU1RfU1VTUEVORF9ERUxBWSk7Ci0JcG1fcnVudGltZV91c2VfYXV0b3N1c3BlbmQoY3R4LT5kZXYpOwotCS8qCi0JICogRm9yIGFjcGkgZGV2aWNlcywgdGhlIGFjdHVhbCBwaHlzaWNhbCBkZXZpY2Ugc3RhdGUgaXMKLQkgKiBpbml0aWFsbHkgYWN0aXZlLiBTbyBjaGFuZ2UgdGhlIHN0YXRlIHRvIGFjdGl2ZSBiZWZvcmUKLQkgKiBlbmFibGluZyB0aGUgcG0KLQkgKi8KLQotCWlmICghYWNwaV9kaXNhYmxlZCkKLQkJcG1fcnVudGltZV9zZXRfYWN0aXZlKGN0eC0+ZGV2KTsKLQotCXBtX3J1bnRpbWVfZW5hYmxlKGN0eC0+ZGV2KTsKLQotCWlmIChhY3BpX2Rpc2FibGVkKQotCQlwbV9ydW50aW1lX3NldF9hY3RpdmUoY3R4LT5kZXYpOwotCWVsc2UKLQkJcG1fcnVudGltZV9wdXRfbm9pZGxlKGN0eC0+ZGV2KTsKLQotCXNzdF9zYXZlX3NoaW02NChjdHgsIGN0eC0+c2hpbSwgY3R4LT5zaGltX3JlZ3M2NCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzc3RfY29uZmlndXJlX3J1bnRpbWVfcG0pOwotCi1zdGF0aWMgaW50IGludGVsX3NzdF9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmIChjdHgtPnNzdF9zdGF0ZSA9PSBTU1RfUkVTRVQpIHsKLQkJZGV2X2RiZyhkZXYsICJMUEUgaXMgYWxyZWFkeSBpbiBSRVNFVCBzdGF0ZSwgTm8gYWN0aW9uXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCS8qIHNhdmUgZncgY29udGV4dCAqLwotCWlmIChjdHgtPm9wcy0+c2F2ZV9kc3BfY29udGV4dChjdHgpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JLyogTW92ZSB0aGUgU1NUIHN0YXRlIHRvIFJlc2V0ICovCi0Jc3N0X3NldF9md19zdGF0ZV9sb2NrZWQoY3R4LCBTU1RfUkVTRVQpOwotCi0Jc3luY2hyb25pemVfaXJxKGN0eC0+aXJxX251bSk7Ci0JZmx1c2hfd29ya3F1ZXVlKGN0eC0+cG9zdF9tc2dfd3EpOwotCi0JY3R4LT5vcHMtPnJlc2V0KGN0eCk7Ci0JLyogc2F2ZSB0aGUgc2hpbSByZWdpc3RlcnMgYmVjYXVzZSBQTUMgZG9lc24ndCBzYXZlIHN0YXRlICovCi0Jc3N0X3NhdmVfc2hpbTY0KGN0eCwgY3R4LT5zaGltLCBjdHgtPnNoaW1fcmVnczY0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaW50ZWxfc3N0X3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoY3R4LT5zc3Rfc3RhdGUgPT0gU1NUX1JFU0VUKSB7Ci0JCXJldCA9IHNzdF9sb2FkX2Z3KGN0eCk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoZGV2LCAiRlcgZG93bmxvYWQgZmFpbCAlZFxuIiwgcmV0KTsKLQkJCXNzdF9zZXRfZndfc3RhdGVfbG9ja2VkKGN0eCwgU1NUX1JFU0VUKTsKLQkJfQotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1jb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpbnRlbF9zc3RfcG0gPSB7Ci0JLnJ1bnRpbWVfc3VzcGVuZCA9IGludGVsX3NzdF9ydW50aW1lX3N1c3BlbmQsCi0JLnJ1bnRpbWVfcmVzdW1lID0gaW50ZWxfc3N0X3J1bnRpbWVfcmVzdW1lLAotfTsKLUVYUE9SVF9TWU1CT0xfR1BMKGludGVsX3NzdF9wbSk7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0L3NzdC5oIGIvc291bmQvc29jL2ludGVsL3NzdC9zc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyYmM0OC4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc3N0L3NzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQ3ICswLDAgQEAKLS8qCi0gKiAgc3N0LmggLSBJbnRlbCBTU1QgRHJpdmVyIGZvciBhdWRpbyBlbmdpbmUKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA4LTE0IEludGVsIENvcnBvcmF0aW9uCi0gKiAgQXV0aG9yczoJVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+Ci0gKgkJSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPgotICoJCURoYXJhZ2Vzd2FyaSBSIDxkaGFyYWdlc3dhcmkuckBpbnRlbC5jb20+Ci0gKgkJS1AgSmVlamEgPGplZWphLmtwQGludGVsLmNvbT4KLSAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKgotICogIENvbW1vbiBwcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgU1NUCi0gKi8KLSNpZm5kZWYgX19TU1RfSF9fCi0jZGVmaW5lIF9fU1NUX0hfXwotCi0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLQotLyogZHJpdmVyIG5hbWVzICovCi0jZGVmaW5lIFNTVF9EUlZfTkFNRSAiaW50ZWxfc3N0X2RyaXZlciIKLSNkZWZpbmUgU1NUX01SRkxEX1BDSV9JRCAweDExOUEKLSNkZWZpbmUgU1NUX0JZVF9BQ1BJX0lECTB4ODA4NjBGMjgKLSNkZWZpbmUgU1NUX0NIVl9BQ1BJX0lECTB4ODA4NjIyQTgKLQotI2RlZmluZSBTU1RfU1VTUEVORF9ERUxBWSAyMDAwCi0jZGVmaW5lIEZXX0NPTlRFWFRfTUVNICg2NCoxMDI0KQotI2RlZmluZSBTU1RfSUNDTV9CT1VOREFSWSA0Ci0jZGVmaW5lIFNTVF9DT05GSUdfU1NQX1NJR04gMHg3ZmZlODAwMQotCi0jZGVmaW5lIE1SRkxEX0ZXX1ZJUlRVQUxfQkFTRSAweEMwMDAwMDAwCi0jZGVmaW5lIE1SRkxEX0ZXX0REUl9CQVNFX09GRlNFVCAweDAKLSNkZWZpbmUgTVJGTERfRldfRkVBVFVSRV9CQVNFX09GRlNFVCAweDQKLSNkZWZpbmUgTVJGTERfRldfQlNTX1JFU0VUX0JJVCAwCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBpbnRlbF9zc3RfcG07Ci1lbnVtIHNzdF9zdGF0ZXMgewotCVNTVF9GV19MT0FESU5HID0gMSwKLQlTU1RfRldfUlVOTklORywKLQlTU1RfUkVTRVQsCi0JU1NUX1NIVVRET1dOLAotfTsKLQotZW51bSBzc3RfYWxnb19vcHMgewotCVNTVF9TRVRfQUxHTyA9IDAsCi0JU1NUX0dFVF9BTEdPID0gMSwKLX07Ci0KLSNkZWZpbmUgU1NUX0JMT0NLX1RJTUVPVVQJMTAwMAotCi0jZGVmaW5lIEZXX1NJR05BVFVSRV9TSVpFCTQKLSNkZWZpbmUgRldfTkFNRV9TSVpFCQkzMgotCi0vKiBzdHJlYW0gc3RhdGVzICovCi1lbnVtIHNzdF9zdHJlYW1fc3RhdGVzIHsKLQlTVFJFQU1fVU5fSU5JVAk9IDAsCS8qIEZyZWVkL05vdCB1c2VkIHN0cmVhbSAqLwotCVNUUkVBTV9SVU5OSU5HCT0gMSwJLyogUnVubmluZyAqLwotCVNUUkVBTV9QQVVTRUQJPSAyLAkvKiBQYXVzZWQgc3RyZWFtICovCi0JU1RSRUFNX0RFQ09ERQk9IDMsCS8qIHN0cmVhbSBpcyBpbiBkZWNvZGluZyBvbmx5IHN0YXRlICovCi0JU1RSRUFNX0lOSVQJPSA0LAkvKiBzdHJlYW0gaW5pdCwgd2FpdGluZyBmb3IgZGF0YSAqLwotCVNUUkVBTV9SRVNFVAk9IDUsCS8qIGZvcmNlIHJlc2V0IG9uIHJlY292ZXJ5ICovCi19OwotCi1lbnVtIHNzdF9yYW1fdHlwZSB7Ci0JU1NUX0lSQU0JPSAxLAotCVNTVF9EUkFNCT0gMiwKLQlTU1RfRERSCT0gNSwKLQlTU1RfQ1VTVE9NX0lORk8JPSA3LAkvKiBjb25zaXN0cyBvZiBGVyBiaW5hcnkgaW5mb3JtYXRpb24gKi8KLX07Ci0KLS8qIFNTVCBzaGltIHJlZ2lzdGVycyB0byBzdHJ1Y3R1cmUgbWFwcGluZyAqLwotdW5pb24gaW50ZXJydXB0X3JlZyB7Ci0Jc3RydWN0IHsKLQkJdTY0IGRvbmVfaW50ZXJydXB0OjE7Ci0JCXU2NCBidXN5X2ludGVycnVwdDoxOwotCQl1NjQgcnN2ZDo2MjsKLQl9IHBhcnQ7Ci0JdTY0IGZ1bGw7Ci19OwotCi11bmlvbiBzc3RfcGlzcl9yZWcgewotCXN0cnVjdCB7Ci0JCXUzMiBwc3NwMDoxOwotCQl1MzIgcHNzcDE6MTsKLQkJdTMyIHJzdmQwOjM7Ci0JCXUzMiBkbWFjOjE7Ci0JCXUzMiByc3ZkMToyNjsKLQl9IHBhcnQ7Ci0JdTMyIGZ1bGw7Ci19OwotCi11bmlvbiBzc3RfcGltcl9yZWcgewotCXN0cnVjdCB7Ci0JCXUzMiBzc3AwOjE7Ci0JCXUzMiBzc3AxOjE7Ci0JCXUzMiByc3ZkMDozOwotCQl1MzIgZG1hYzoxOwotCQl1MzIgcnN2ZDE6MTA7Ci0JCXUzMiBzc3AwX3NjOjE7Ci0JCXUzMiBzc3AxX3NjOjE7Ci0JCXUzMiByc3ZkMjozOwotCQl1MzIgZG1hY19zYzoxOwotCQl1MzIgcnN2ZDM6MTA7Ci0JfSBwYXJ0OwotCXUzMiBmdWxsOwotfTsKLQotdW5pb24gY29uZmlnX3N0YXR1c19yZWdfbXJmbGQgewotCXN0cnVjdCB7Ci0JCXU2NCBscGVfcmVzZXQ6MTsKLQkJdTY0IGxwZV9yZXNldF92ZWN0b3I6MTsKLQkJdTY0IHJ1bnN0YWxsOjE7Ci0JCXU2NCBwd2FpdG1vZGU6MTsKLQkJdTY0IGNsa19zZWw6MzsKLQkJdTY0IHJzdmQyOjE7Ci0JCXU2NCBzc3RfY2xrOjM7Ci0JCXU2NCB4dF9zbm9vcDoxOwotCQl1NjQgcnN2ZDM6NDsKLQkJdTY0IGNsa19zZWwxOjY7Ci0JCXU2NCBjbGtfZW5hYmxlOjM7Ci0JCXU2NCByc3ZkNDo2OwotCQl1NjQgc2xpbTBiYXNlY2xrOjE7Ci0JCXU2NCByc3ZkOjMyOwotCX0gcGFydDsKLQl1NjQgZnVsbDsKLX07Ci0KLXVuaW9uIGludGVycnVwdF9yZWdfbXJmbGQgewotCXN0cnVjdCB7Ci0JCXU2NCBkb25lX2ludGVycnVwdDoxOwotCQl1NjQgYnVzeV9pbnRlcnJ1cHQ6MTsKLQkJdTY0IHJzdmQ6NjI7Ci0JfSBwYXJ0OwotCXU2NCBmdWxsOwotfTsKLQotdW5pb24gc3N0X2ltcl9yZWdfbXJmbGQgewotCXN0cnVjdCB7Ci0JCXU2NCBkb25lX2ludGVycnVwdDoxOwotCQl1NjQgYnVzeV9pbnRlcnJ1cHQ6MTsKLQkJdTY0IHJzdmQ6NjI7Ci0JfSBwYXJ0OwotCXU2NCBmdWxsOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3Qgc3N0X2Jsb2NrIC0gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBibG9jayBhIHVzZXIvZncgZGF0YSBjYWxsIHRvIGFub3RoZXIKLSAqIGZ3L3VzZXIgY2FsbAotICoKLSAqIEBjb25kaXRpb246IGNvbmRpdGlvbiBmb3IgYmxvY2tpbmcgY2hlY2sKLSAqIEByZXRfY29kZTogcmV0IGNvZGUgd2hlbiBibG9jayBpcyByZWxlYXNlZAotICogQGRhdGE6IGRhdGEgcHRyCi0gKiBAc2l6ZTogc2l6ZSBvZiBkYXRhCi0gKiBAb246IGJsb2NrIGNvbmRpdGlvbgotICogQG1zZ19pZDogbXNnX2lkID0gbXNnaWQgaW4gbWZsZC9jdHAsIG1yZmxkID0gTlVMTAotICogQGRydl9pZDogc3RyX2lkIGluIG1mbGQvY3RwLCA9IGRydl9pZCBpbiBtcmZsZAotICogQG5vZGU6IGxpc3QgaGVhZCBub2RlCi0gKi8KLXN0cnVjdCBzc3RfYmxvY2sgewotCWJvb2wJY29uZGl0aW9uOwotCWludAlyZXRfY29kZTsKLQl2b2lkCSpkYXRhOwotCXUzMiAgICAgc2l6ZTsKLQlib29sCW9uOwotCXUzMiAgICAgbXNnX2lkOwotCXUzMiAgICAgZHJ2X2lkOwotCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKLX07Ci0KLS8qKgotICogc3RydWN0IHN0cmVhbV9pbmZvIC0gc3RydWN0dXJlIHRoYXQgaG9sZHMgdGhlIHN0cmVhbSBpbmZvcm1hdGlvbgotICoKLSAqIEBzdGF0dXMgOiBzdHJlYW0gY3VycmVudCBzdGF0ZQotICogQHByZXYgOiBzdHJlYW0gcHJldiBzdGF0ZQotICogQG9wcyA6IHN0cmVhbSBvcGVyYXRpb24gcGIvY3AvZHJtLi4uCi0gKiBAYnVmczogc3RyZWFtIGJ1ZmZlciBsaXN0Ci0gKiBAbG9jayA6IHN0cmVhbSBtdXRleCBmb3IgcHJvdGVjdGluZyBzdGF0ZQotICogQHBjbV9zdWJzdHJlYW0gOiBQQ00gc3Vic3RyZWFtCi0gKiBAcGVyaW9kX2VsYXBzZWQgOiBQQ00gcGVyaW9kIGVsYXBzZWQgY2FsbGJhY2sKLSAqIEBzZnJlcSA6IHN0cmVhbSBzYW1wbGluZyBmcmVxCi0gKiBAc3RyX3R5cGUgOiBzdHJlYW0gdHlwZQotICogQGN1bW1fYnl0ZXMgOiBjdW1tdWxhdGl2ZSBieXRlcyBkZWNvZGVkCi0gKiBAc3RyX3R5cGUgOiBzdHJlYW0gdHlwZQotICogQHNyYyA6IHN0cmVhbSBzb3VyY2UKLSAqLwotc3RydWN0IHN0cmVhbV9pbmZvIHsKLQl1bnNpZ25lZCBpbnQJCXN0YXR1czsKLQl1bnNpZ25lZCBpbnQJCXByZXY7Ci0JdW5zaWduZWQgaW50CQlvcHM7Ci0Jc3RydWN0IG11dGV4CQlsb2NrOwotCi0Jdm9pZAkJCSpwY21fc3Vic3RyZWFtOwotCXZvaWQgKCpwZXJpb2RfZWxhcHNlZCkodm9pZCAqcGNtX3N1YnN0cmVhbSk7Ci0KLQl1bnNpZ25lZCBpbnQJCXNmcmVxOwotCXUzMgkJCWN1bW1fYnl0ZXM7Ci0KLQl2b2lkCQkJKmNvbXByX2NiX3BhcmFtOwotCXZvaWQgKCpjb21wcl9jYikodm9pZCAqY29tcHJfY2JfcGFyYW0pOwotCi0Jdm9pZAkJCSpkcmFpbl9jYl9wYXJhbTsKLQl2b2lkICgqZHJhaW5fbm90aWZ5KSh2b2lkICpkcmFpbl9jYl9wYXJhbSk7Ci0KLQl1bnNpZ25lZCBpbnQJCW51bV9jaDsKLQl1bnNpZ25lZCBpbnQJCXBpcGVfaWQ7Ci0JdW5zaWduZWQgaW50CQlzdHJfaWQ7Ci0JdW5zaWduZWQgaW50CQl0YXNrX2lkOwotfTsKLQotI2RlZmluZSBTU1RfRldfU0lHTiAiJFNTVCIKLSNkZWZpbmUgU1NUX0ZXX0xJQl9TSUdOICIkTElCIgotCi0vKioKLSAqIHN0cnVjdCBzc3RfZndfaGVhZGVyIC0gRlcgZmlsZSBoZWFkZXJzCi0gKgotICogQHNpZ25hdHVyZSA6IEZXIHNpZ25hdHVyZQotICogQGZpbGVfc2l6ZTogc2l6ZSBvZiBmdyBpbWFnZQotICogQG1vZHVsZXMgOiAjIG9mIG1vZHVsZXMKLSAqIEBmaWxlX2Zvcm1hdCA6IHZlcnNpb24gb2YgaGVhZGVyIGZvcm1hdAotICogQHJlc2VydmVkIDogcmVzZXJ2ZWQgZmllbGRzCi0gKi8KLXN0cnVjdCBzc3RfZndfaGVhZGVyIHsKLQl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtGV19TSUdOQVRVUkVfU0laRV07Ci0JdTMyIGZpbGVfc2l6ZTsKLQl1MzIgbW9kdWxlczsKLQl1MzIgZmlsZV9mb3JtYXQ7Ci0JdTMyIHJlc2VydmVkWzRdOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgZndfbW9kdWxlX2hlYWRlciAtIG1vZHVsZSBoZWFkZXIgaW4gRlcKLSAqCi0gKiBAc2lnbmF0dXJlOiBtb2R1bGUgc2lnbmF0dXJlCi0gKiBAbW9kX3NpemU6IHNpemUgb2YgbW9kdWxlCi0gKiBAYmxvY2tzOiBibG9jayBjb3VudAotICogQHR5cGU6IGJsb2NrIHR5cGUKLSAqIEBlbnRyeV9wb2ludDogbW9kdWxlIG5ldHJ5IHBvaW50Ci0gKi8KLXN0cnVjdCBmd19tb2R1bGVfaGVhZGVyIHsKLQl1bnNpZ25lZCBjaGFyIHNpZ25hdHVyZVtGV19TSUdOQVRVUkVfU0laRV07Ci0JdTMyIG1vZF9zaXplOwotCXUzMiBibG9ja3M7Ci0JdTMyIHR5cGU7Ci0JdTMyIGVudHJ5X3BvaW50OwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgZndfYmxvY2tfaW5mbyAtIGJsb2NrIGhlYWRlciBmb3IgRlcKLSAqCi0gKiBAdHlwZTogYmxvY2sgcmFtIHR5cGUgSS9ECi0gKiBAc2l6ZTogc2l6ZSBvZiBibG9jawotICogQHJhbV9vZmZzZXQ6IG9mZnNldCBpbiByYW0KLSAqLwotc3RydWN0IGZ3X2Jsb2NrX2luZm8gewotCWVudW0gc3N0X3JhbV90eXBlCXR5cGU7Ci0JdTMyCQkJc2l6ZTsKLQl1MzIJCQlyYW1fb2Zmc2V0OwotCXUzMgkJCXJzdmQ7Ci19OwotCi1zdHJ1Y3Qgc3N0X3J1bnRpbWVfcGFyYW0gewotCXN0cnVjdCBzbmRfc3N0X3J1bnRpbWVfcGFyYW1zIHBhcmFtOwotfTsKLQotc3RydWN0IHNzdF9zZ19saXN0IHsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYzsKLQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdDsKLQlpbnQgbGlzdF9sZW47Ci0JdW5zaWduZWQgaW50IHNnX2lkeDsKLX07Ci0KLXN0cnVjdCBzc3RfbWVtY3B5X2xpc3QgewotCXN0cnVjdCBsaXN0X2hlYWQgbWVtY3B5bGlzdDsKLQl2b2lkICpkc3RuOwotCWNvbnN0IHZvaWQgKnNyYzsKLQl1MzIgc2l6ZTsKLQlib29sIGlzX2lvOwotfTsKLQotLypGaXJtd2FyZSBNb2R1bGUgSW5mb3JtYXRpb24qLwotZW51bSBzc3RfbGliX2R3bmxkX3N0YXR1cyB7Ci0JU1NUX0xJQl9OT1RfRk9VTkQgPSAwLAotCVNTVF9MSUJfRk9VTkQsCi0JU1NUX0xJQl9ET1dOTE9BREVELAotfTsKLQotc3RydWN0IHNzdF9tb2R1bGVfaW5mbyB7Ci0JY29uc3QgY2hhciAqbmFtZTsgLypMaWJyYXJ5IG5hbWUqLwotCXUzMglpZDsgLypNb2R1bGUgSUQqLwotCXUzMgllbnRyeV9wdDsgLypNb2R1bGUgZW50cnkgcG9pbnQqLwotCXU4CXN0YXR1czsgLyptb2R1bGUgc3RhdHVzKi8KLQl1OAlyc3ZkMTsKLQl1MTYJcnN2ZDI7Ci19OwotCi0vKgotICogU3RydWN0dXJlIGZvciBtYW5hZ2luZyB0aGUgTGlicmFyeSBSZWdpb24oMS41TUIpCi0gKiBpbiBERFIgaW4gTWVycmlmaWVsZAotICovCi1zdHJ1Y3Qgc3N0X21lbV9tZ3IgewotCXBoeXNfYWRkcl90IGN1cnJlbnRfYmFzZTsKLQlpbnQgYXZhaWw7Ci0JdW5zaWduZWQgaW50IGNvdW50OwotfTsKLQotc3RydWN0IHNzdF9pcGNfcmVnIHsKLQlpbnQgaXBjeDsKLQlpbnQgaXBjZDsKLX07Ci0KLXN0cnVjdCBzc3Rfc2hpbV9yZWdzNjQgewotCXU2NCBjc3I7Ci0JdTY0IHBpc3I7Ci0JdTY0IHBpbXI7Ci0JdTY0IGlzcng7Ci0JdTY0IGlzcmQ7Ci0JdTY0IGltcng7Ci0JdTY0IGltcmQ7Ci0JdTY0IGlwY3g7Ci0JdTY0IGlwY2Q7Ci0JdTY0IGlzcnNjOwotCXU2NCBpc3JscGVzYzsKLQl1NjQgaW1yc2M7Ci0JdTY0IGltcmxwZXNjOwotCXU2NCBpcGNzYzsKLQl1NjQgaXBjbHBlc2M7Ci0JdTY0IGNsa2N0bDsKLQl1NjQgY3NyMjsKLX07Ci0KLS8qKgotICogc3RydWN0IGludGVsX3NzdF9kcnYgLSBkcml2ZXIgb3BzCi0gKgotICogQHNzdF9zdGF0ZSA6IGN1cnJlbnQgc3N0IGRldmljZSBzdGF0ZQotICogQGRldl9pZCA6IGRldmljZSBpZGVudGlmaWVyLCBwY2lfaWQgZm9yIHBjaSBkZXZpY2VzIGFuZCBhY3BpX2lkIGZvciBhY3BpCi0gKiAJICAgICBkZXZpY2VzCi0gKiBAc2hpbSA6IFNTVCBzaGltIHBvaW50ZXIKLSAqIEBtYWlsYm94IDogU1NUIG1haWxib3ggcG9pbnRlcgotICogQGlyYW0gOiBTU1QgSVJBTSBwb2ludGVyCi0gKiBAZHJhbSA6IFNTVCBEUkFNIHBvaW50ZXIKLSAqIEBwZGF0YSA6IFNTVCBpbmZvIHBhc3NlZCBhcyBhIHBhcnQgb2YgcGNpIHBsYXRmb3JtIGRhdGEKLSAqIEBzaGltX3BoeV9hZGQgOiBTU1Qgc2hpbSBwaHkgYWRkcgotICogQHNoaW1fcmVnczY0OiBTdHJ1Y3QgdG8gc2F2ZSBzaGltIHJlZ2lzdGVycwotICogQGlwY19kaXNwYXRjaF9saXN0IDogaXBjIG1lc3NhZ2VzIGRpc3BhdGNoZWQKLSAqIEByeF9saXN0IDogdG8gY29weSB0aGUgcHJvY2Vzc19yZXBseS9wcm9jZXNzX21zZyBmcm9tIERTUAotICogQGlwY19wb3N0X21zZ193cSA6IHdxIHRvIHBvc3QgSVBDIG1lc3NhZ2VzIGNvbnRleHQKLSAqIEBtYWRfb3BzIDogTUFEIGRyaXZlciBvcGVyYXRpb25zIHJlZ2lzdGVyZWQKLSAqIEBtYWRfd3EgOiBNQUQgZHJpdmVyIHdxCi0gKiBAcG9zdF9tc2dfd3EgOiB3cSB0byBwb3N0IElQQyBtZXNzYWdlcwotICogQHN0cmVhbXMgOiBzc3Qgc3RyZWFtIGNvbnRleHRzCi0gKiBAbGlzdF9sb2NrIDogc3N0IGRyaXZlciBsaXN0IGxvY2sgKGRlcHJlY2F0ZWQpCi0gKiBAaXBjX3NwaW5fbG9jayA6IHNwaW4gbG9jayB0byBoYW5kbGUgYXVkaW8gc2hpbSBhY2Nlc3MgYW5kIGlwYyBxdWV1ZQotICogQGJsb2NrX2xvY2sgOiBzcGluIGxvY2sgdG8gYWRkIGJsb2NrIHRvIGJsb2NrX2xpc3QgYW5kIGFzc2lnbiBwdnRfaWQKLSAqIEByeF9tc2dfbG9jayA6IHNwaW4gbG9jayB0byBoYW5kbGUgdGhlIHJ4IG1lc3NhZ2VzIGZyb20gdGhlIERTUAotICogQHNjYXJkX29wcyA6IHNzdCBjYXJkIG9wcwotICogQHBjaSA6IHNzdCBwY2kgZGV2aWNlIHN0cnV0dXJlCi0gKiBAZGV2IDogcG9pbnRlciB0byBjdXJyZW50IGRldmljZSBzdHJ1Y3QKLSAqIEBzc3RfbG9jayA6IHNzdCBkZXZpY2UgbG9jawotICogQHB2dF9pZCA6IHNzdCBwcml2YXRlIGlkCi0gKiBAc3RyZWFtX2NudCA6IHRvdGFsIHNzdCBhY3RpdmUgc3RyZWFtIGNvdW50Ci0gKiBAcGJfc3RyZWFtcyA6IHRvdGFsIGFjdGl2ZSBwYiBzdHJlYW1zCi0gKiBAY3Bfc3RyZWFtcyA6IHRvdGFsIGFjdGl2ZSBjcCBzdHJlYW1zCi0gKiBAYXVkaW9fc3RhcnQgOiBhdWRpbyBzdGF0dXMKLSAqIEBxb3MJCTogUE0gUW9zIHN0cnVjdAotICogZmlybXdhcmVfbmFtZSA6IEZpcm13YXJlIC8gTGlicmFyeSBuYW1lCi0gKi8KLXN0cnVjdCBpbnRlbF9zc3RfZHJ2IHsKLQlpbnQJCQlzc3Rfc3RhdGU7Ci0JaW50CQkJaXJxX251bTsKLQl1bnNpZ25lZCBpbnQJCWRldl9pZDsKLQl2b2lkIF9faW9tZW0JCSpkZHI7Ci0Jdm9pZCBfX2lvbWVtCQkqc2hpbTsKLQl2b2lkIF9faW9tZW0JCSptYWlsYm94OwotCXZvaWQgX19pb21lbQkJKmlyYW07Ci0Jdm9pZCBfX2lvbWVtCQkqZHJhbTsKLQl1bnNpZ25lZCBpbnQJCW1haWxib3hfYWRkOwotCXVuc2lnbmVkIGludAkJaXJhbV9iYXNlOwotCXVuc2lnbmVkIGludAkJZHJhbV9iYXNlOwotCXVuc2lnbmVkIGludAkJc2hpbV9waHlfYWRkOwotCXVuc2lnbmVkIGludAkJaXJhbV9lbmQ7Ci0JdW5zaWduZWQgaW50CQlkcmFtX2VuZDsKLQl1bnNpZ25lZCBpbnQJCWRkcl9lbmQ7Ci0JdW5zaWduZWQgaW50CQlkZHJfYmFzZTsKLQl1bnNpZ25lZCBpbnQJCW1haWxib3hfcmVjdl9vZmZzZXQ7Ci0Jc3RydWN0IHNzdF9zaGltX3JlZ3M2NAkqc2hpbV9yZWdzNjQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAgICAgICAgYmxvY2tfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkCWlwY19kaXNwYXRjaF9saXN0OwotCXN0cnVjdCBzc3RfcGxhdGZvcm1faW5mbyAqcGRhdGE7Ci0Jc3RydWN0IGxpc3RfaGVhZAlyeF9saXN0OwotCXN0cnVjdCB3b3JrX3N0cnVjdCAgICAgIGlwY19wb3N0X21zZ193cTsKLQl3YWl0X3F1ZXVlX2hlYWRfdAl3YWl0X3F1ZXVlOwotCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpwb3N0X21zZ193cTsKLQl1bnNpZ25lZCBpbnQJCXRzdGFtcDsKLQkvKiBzdHJfaWQgMCBpcyBub3QgdXNlZCAqLwotCXN0cnVjdCBzdHJlYW1faW5mbwlzdHJlYW1zW01BWF9OVU1fU1RSRUFNUysxXTsKLQlzcGlubG9ja190CQlpcGNfc3Bpbl9sb2NrOwotCXNwaW5sb2NrX3QgICAgICAgICAgICAgIGJsb2NrX2xvY2s7Ci0Jc3BpbmxvY2tfdAkJcnhfbXNnX2xvY2s7Ci0Jc3RydWN0IHBjaV9kZXYJCSpwY2k7Ci0Jc3RydWN0IGRldmljZQkJKmRldjsKLQl2b2xhdGlsZSBsb25nIHVuc2lnbmVkIAkJcHZ0X2lkOwotCXN0cnVjdCBtdXRleCAgICAgICAgICAgIHNzdF9sb2NrOwotCXVuc2lnbmVkIGludAkJc3RyZWFtX2NudDsKLQl1bnNpZ25lZCBpbnQJCWNzcl92YWx1ZTsKLQl2b2lkCQkJKmZ3X2luX21lbTsKLQlzdHJ1Y3Qgc3N0X3NnX2xpc3QJZndfc2dfbGlzdCwgbGlicmFyeV9saXN0OwotCXN0cnVjdCBpbnRlbF9zc3Rfb3BzCSpvcHM7Ci0Jc3RydWN0IHNzdF9pbmZvCQlpbmZvOwotCXN0cnVjdCBwbV9xb3NfcmVxdWVzdAkqcW9zOwotCXVuc2lnbmVkIGludAkJdXNlX2RtYTsKLQl1bnNpZ25lZCBpbnQJCXVzZV9sbGk7Ci0JYXRvbWljX3QJCWZ3X2NsZWFyX2NvbnRleHQ7Ci0JYm9vbAkJCWxpYl9kd25sZF9yZXFkOwotCXN0cnVjdCBsaXN0X2hlYWQJbWVtY3B5X2xpc3Q7Ci0Jc3RydWN0IHNzdF9pcGNfcmVnCWlwY19yZWc7Ci0Jc3RydWN0IHNzdF9tZW1fbWdyICAgICAgbGliX21lbV9tZ3I7Ci0JLyoKLQkgKiBIb2xkZXIgZm9yIGZpcm13YXJlIG5hbWUuIER1ZSB0byBhc3luYyBjYWxsIGl0IG5lZWRzIHRvIGJlCi0JICogcGVyc2lzdGVudCB0aWxsIHdvcmtlciB0aHJlYWQgZ2V0cyBjYWxsZWQKLQkgKi8KLQljaGFyIGZpcm13YXJlX25hbWVbRldfTkFNRV9TSVpFXTsKLX07Ci0KLS8qIG1pc2MgZGVmaW5pdGlvbnMgKi8KLSNkZWZpbmUgRldfRFdOTF9JRCAweDAxCi0KLXN0cnVjdCBpbnRlbF9zc3Rfb3BzIHsKLQlpcnFyZXR1cm5fdCAoKmludGVycnVwdCkoaW50LCB2b2lkICopOwotCWlycXJldHVybl90ICgqaXJxX3RocmVhZCkoaW50LCB2b2lkICopOwotCXZvaWQgKCpjbGVhcl9pbnRlcnJ1cHQpKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgpOwotCWludCAoKnN0YXJ0KShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KTsKLQlpbnQgKCpyZXNldCkoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCk7Ci0Jdm9pZCAoKnByb2Nlc3NfcmVwbHkpKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsIHN0cnVjdCBpcGNfcG9zdCAqbXNnKTsKLQlpbnQgKCpwb3N0X21lc3NhZ2UpKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsCi0JCQlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZywgYm9vbCBzeW5jKTsKLQl2b2lkICgqcHJvY2Vzc19tZXNzYWdlKShzdHJ1Y3QgaXBjX3Bvc3QgKm1zZyk7Ci0Jdm9pZCAoKnNldF9ieXBhc3MpKGJvb2wgc2V0KTsKLQlpbnQgKCpzYXZlX2RzcF9jb250ZXh0KShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0KTsKLQl2b2lkICgqcmVzdG9yZV9kc3BfY29udGV4dCkodm9pZCk7Ci0JaW50ICgqYWxsb2Nfc3RyZWFtKShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LCB2b2lkICpwYXJhbXMpOwotCXZvaWQgKCpwb3N0X2Rvd25sb2FkKShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0KTsKLX07Ci0KLWludCBzc3RfcGF1c2Vfc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgaW50IGlkKTsKLWludCBzc3RfcmVzdW1lX3N0cmVhbShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIGludCBpZCk7Ci1pbnQgc3N0X2Ryb3Bfc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgaW50IGlkKTsKLWludCBzc3RfZnJlZV9zdHJlYW0oc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBpbnQgaWQpOwotaW50IHNzdF9zdGFydF9zdHJlYW0oc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBpbnQgc3RyX2lkKTsKLWludCBzc3Rfc2VuZF9ieXRlX3N0cmVhbV9tcmZsZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LAotCQkJc3RydWN0IHNuZF9zc3RfYnl0ZXNfdjIgKnNieXRlcyk7Ci1pbnQgc3N0X3NldF9zdHJlYW1fcGFyYW0oaW50IHN0cl9pZCwgc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pOwotaW50IHNzdF9zZXRfbWV0YWRhdGEoaW50IHN0cl9pZCwgY2hhciAqcGFyYW1zKTsKLWludCBzc3RfZ2V0X3N0cmVhbShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsCi0JCXN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqc3RyX3BhcmFtKTsKLWludCBzc3RfZ2V0X3N0cmVhbV9hbGxvY2F0ZWQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwKLQkJc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0sCi0JCXN0cnVjdCBzbmRfc3N0X2xpYl9kb3dubG9hZCAqKmxpYl9kbmxkKTsKLWludCBzc3RfZHJhaW5fc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwKLQkJaW50IHN0cl9pZCwgYm9vbCBwYXJ0aWFsX2RyYWluKTsKLWludCBzc3RfcG9zdF9tZXNzYWdlX21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsCi0JCXN0cnVjdCBpcGNfcG9zdCAqbXNnLCBib29sIHN5bmMpOwotdm9pZCBzc3RfcHJvY2Vzc19yZXBseV9tcmZsZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LCBzdHJ1Y3QgaXBjX3Bvc3QgKm1zZyk7Ci1pbnQgc3N0X3N0YXJ0X21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgpOwotaW50IGludGVsX3NzdF9yZXNldF9kc3BfbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCk7Ci12b2lkIGludGVsX3NzdF9jbGVhcl9pbnRyX21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgpOwotCi1pbnQgc3N0X2xvYWRfZncoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCk7Ci1pbnQgc3N0X2xvYWRfbGlicmFyeShzdHJ1Y3Qgc25kX3NzdF9saWJfZG93bmxvYWQgKmxpYiwgdTggb3BzKTsKLXZvaWQgc3N0X3Bvc3RfZG93bmxvYWRfbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCk7Ci1pbnQgc3N0X2dldF9ibG9ja19zdHJlYW0oc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4KTsKLXZvaWQgc3N0X21lbWNweV9mcmVlX3Jlc291cmNlcyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KTsKLQotaW50IHNzdF93YWl0X2ludGVycnVwdGlibGUoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAotCQkJCXN0cnVjdCBzc3RfYmxvY2sgKmJsb2NrKTsKLWludCBzc3Rfd2FpdF90aW1lb3V0KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwKLQkJCXN0cnVjdCBzc3RfYmxvY2sgKmJsb2NrKTsKLWludCBzc3RfY3JlYXRlX2lwY19tc2coc3RydWN0IGlwY19wb3N0ICoqYXJnLCBib29sIGxhcmdlKTsKLWludCBmcmVlX3N0cmVhbV9jb250ZXh0KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsIHVuc2lnbmVkIGludCBzdHJfaWQpOwotdm9pZCBzc3RfY2xlYW5fc3RyZWFtKHN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtKTsKLWludCBpbnRlbF9zc3RfcmVnaXN0ZXJfY29tcHJlc3Moc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdCk7Ci1pbnQgaW50ZWxfc3N0X3JlbW92ZV9jb21wcmVzcyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0KTsKLXZvaWQgc3N0X2NkZXZfZnJhZ21lbnRfZWxhcHNlZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LCBpbnQgc3RyX2lkKTsKLWludCBzc3Rfc2VuZF9zeW5jX21zZyhpbnQgaXBjLCBpbnQgc3RyX2lkKTsKLWludCBzc3RfZ2V0X251bV9jaGFubmVsKHN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqc3RyX3BhcmFtKTsKLWludCBzc3RfZ2V0X3NmcmVxKHN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqc3RyX3BhcmFtKTsKLWludCBzc3RfYWxsb2Nfc3RyZWFtX21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgdm9pZCAqcGFyYW1zKTsKLXZvaWQgc3N0X3Jlc3RvcmVfZndfY29udGV4dCh2b2lkKTsKLXN0cnVjdCBzc3RfYmxvY2sgKnNzdF9jcmVhdGVfYmxvY2soc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwKLQkJCQl1MzIgbXNnX2lkLCB1MzIgZHJ2X2lkKTsKLWludCBzc3RfY3JlYXRlX2Jsb2NrX2FuZF9pcGNfbXNnKHN0cnVjdCBpcGNfcG9zdCAqKmFyZywgYm9vbCBsYXJnZSwKLQkJc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBzdHJ1Y3Qgc3N0X2Jsb2NrICoqYmxvY2ssCi0JCXUzMiBtc2dfaWQsIHUzMiBkcnZfaWQpOwotaW50IHNzdF9mcmVlX2Jsb2NrKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsIHN0cnVjdCBzc3RfYmxvY2sgKmZyZWVkKTsKLWludCBzc3Rfd2FrZV91cF9ibG9jayhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LCBpbnQgcmVzdWx0LAotCQl1MzIgZHJ2X2lkLCB1MzIgaXBjLCB2b2lkICpkYXRhLCB1MzIgc2l6ZSk7Ci1pbnQgc3N0X3JlcXVlc3RfZmlybXdhcmVfYXN5bmMoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCk7Ci1pbnQgc3N0X2RyaXZlcl9vcHMoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdCk7Ci1zdHJ1Y3Qgc3N0X3BsYXRmb3JtX2luZm8gKnNzdF9nZXRfYWNwaV9kcml2ZXJfZGF0YShjb25zdCBjaGFyICpoaWQpOwotdm9pZCBzc3RfZmlybXdhcmVfbG9hZF9jYihjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3LCB2b2lkICpjb250ZXh0KTsKLWludCBzc3RfcHJlcGFyZV9hbmRfcG9zdF9tc2coc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdCwKLQkJaW50IHRhc2tfaWQsIGludCBpcGNfbXNnLCBpbnQgY21kX2lkLCBpbnQgcGlwZV9pZCwKLQkJc2l6ZV90IG1ib3hfZGF0YV9sZW4sIGNvbnN0IHZvaWQgKm1ib3hfZGF0YSwgdm9pZCAqKmRhdGEsCi0JCWJvb2wgbGFyZ2UsIGJvb2wgZmlsbF9kc3AsIGJvb2wgc3luYywgYm9vbCByZXNwb25zZSk7Ci0KLXZvaWQgc3N0X3Byb2Nlc3NfcGVuZGluZ19tc2coc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLWludCBzc3RfYXNzaWduX3B2dF9pZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgpOwotdm9pZCBzc3RfaW5pdF9zdHJlYW0oc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW0sCi0JCWludCBjb2RlYywgaW50IHNzdF9pZCwgaW50IG9wcywgdTggc2xvdCk7Ci1pbnQgc3N0X3ZhbGlkYXRlX3N0cmlkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgaW50IHN0cl9pZCk7Ci1zdHJ1Y3Qgc3RyZWFtX2luZm8gKmdldF9zdHJlYW1faW5mbyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsCi0JCWludCBzdHJfaWQpOwotaW50IGdldF9zdHJlYW1faWRfbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAotCQl1MzIgcGlwZV9pZCk7Ci11MzIgcmVsb2NhdGVfaW1yX2FkZHJfbXJmbGQodTMyIGJhc2VfYWRkcik7Ci12b2lkIHNzdF9hZGRfdG9fZGlzcGF0Y2hfbGlzdF9hbmRfcG9zdChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0LAotCQkJCQlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZyk7Ci1pbnQgc3N0X3BtX3J1bnRpbWVfcHV0KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2KTsKLWludCBzc3Rfc2hpbV93cml0ZSh2b2lkIF9faW9tZW0gKmFkZHIsIGludCBvZmZzZXQsIGludCB2YWx1ZSk7Ci11MzIgc3N0X3NoaW1fcmVhZCh2b2lkIF9faW9tZW0gKmFkZHIsIGludCBvZmZzZXQpOwotdTY0IHNzdF9yZWdfcmVhZDY0KHZvaWQgX19pb21lbSAqYWRkciwgaW50IG9mZnNldCk7Ci1pbnQgc3N0X3NoaW1fd3JpdGU2NCh2b2lkIF9faW9tZW0gKmFkZHIsIGludCBvZmZzZXQsIHU2NCB2YWx1ZSk7Ci11NjQgc3N0X3NoaW1fcmVhZDY0KHZvaWQgX19pb21lbSAqYWRkciwgaW50IG9mZnNldCk7Ci12b2lkIHNzdF9zZXRfZndfc3RhdGVfbG9ja2VkKAotCQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIGludCBzc3Rfc3RhdGUpOwotdm9pZCBzc3RfZmlsbF9oZWFkZXJfbXJmbGQodW5pb24gaXBjX2hlYWRlcl9tcmZsZCAqaGVhZGVyLAotCQkJCWludCBtc2csIGludCB0YXNrX2lkLCBpbnQgbGFyZ2UsIGludCBkcnZfaWQpOwotdm9pZCBzc3RfZmlsbF9oZWFkZXJfZHNwKHN0cnVjdCBpcGNfZHNwX2hkciAqZHNwLCBpbnQgbXNnLAotCQkJCQlpbnQgcGlwZV9pZCwgaW50IGxlbik7Ci0KLWludCBzc3RfcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqKTsKLWludCBzc3RfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICopOwotCi1pbnQgc3N0X2FsbG9jX2Rydl9jb250ZXh0KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICoqY3R4LAotCQlzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBkZXZfaWQpOwotaW50IHNzdF9jb250ZXh0X2luaXQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCk7Ci12b2lkIHNzdF9jb250ZXh0X2NsZWFudXAoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCk7Ci12b2lkIHNzdF9jb25maWd1cmVfcnVudGltZV9wbShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC9zc3RfYWNwaS5jIGIvc291bmQvc29jL2ludGVsL3NzdC9zc3RfYWNwaS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzgyZGZkLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9zc3Qvc3N0X2FjcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NCArMCwwIEBACi0vKgotICogc3N0X2FjcGkuYyAtIFNTVCAoTFBFKSBkcml2ZXIgaW5pdCBmaWxlIGZvciBBQ1BJIGVudW1lcmF0aW9uLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMywgSW50ZWwgQ29ycG9yYXRpb24uCi0gKgotICogIEF1dGhvcnM6CVJhbWVzaCBCYWJ1IEsgViA8UmFtZXNoLkJhYnVAaW50ZWwuY29tPgotICogIEF1dGhvcnM6CU9tYWlyIE1vaGFtbWVkIEFiZHVsbGFoIDxvbWFpci5tLmFiZHVsbGFoQGludGVsLmNvbT4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKLSAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybV9zc3RfYXVkaW8uaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvY29tcHJlc3NfZHJpdmVyLmg+Ci0jaW5jbHVkZSA8YWNwaS9hY2J1ZmZlci5oPgotI2luY2x1ZGUgPGFjcGkvcGxhdGZvcm0vYWNlbnYuaD4KLSNpbmNsdWRlIDxhY3BpL3BsYXRmb3JtL2FjbGludXguaD4KLSNpbmNsdWRlIDxhY3BpL2FjdHlwZXMuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGlfYnVzLmg+Ci0jaW5jbHVkZSAiLi4vc3N0LW1mbGQtcGxhdGZvcm0uaCIKLSNpbmNsdWRlICIuLi9zc3QtZHNwLmgiCi0jaW5jbHVkZSAic3N0LmgiCi0KLXN0cnVjdCBzc3RfbWFjaGluZXMgewotCWNoYXIgKmNvZGVjX2lkOwotCWNoYXIgYm9hcmRbMzJdOwotCWNoYXIgbWFjaGluZVszMl07Ci0Jdm9pZCAoKm1hY2hpbmVfcXVpcmspKHZvaWQpOwotCWNoYXIgZmlybXdhcmVbRldfTkFNRV9TSVpFXTsKLQlzdHJ1Y3Qgc3N0X3BsYXRmb3JtX2luZm8gKnBkYXRhOwotCi19OwotCi0vKiBMUEUgdmlld3BvaW50IGFkZHJlc3NlcyAqLwotI2RlZmluZSBTU1RfQllUX0lSQU1fUEhZX1NUQVJUCTB4ZmYyYzAwMDAKLSNkZWZpbmUgU1NUX0JZVF9JUkFNX1BIWV9FTkQJMHhmZjJkNDAwMAotI2RlZmluZSBTU1RfQllUX0RSQU1fUEhZX1NUQVJUCTB4ZmYzMDAwMDAKLSNkZWZpbmUgU1NUX0JZVF9EUkFNX1BIWV9FTkQJMHhmZjMyMDAwMAotI2RlZmluZSBTU1RfQllUX0lNUl9WSVJUX1NUQVJUCTB4YzAwMDAwMDAgLyogdmlydHVhbCBhZGRyIGluIExQRSAqLwotI2RlZmluZSBTU1RfQllUX0lNUl9WSVJUX0VORAkweGMwMWZmZmZmCi0jZGVmaW5lIFNTVF9CWVRfU0hJTV9QSFlfQUREUgkweGZmMzQwMDAwCi0jZGVmaW5lIFNTVF9CWVRfTUJPWF9QSFlfQUREUgkweGZmMzQ0MDAwCi0jZGVmaW5lIFNTVF9CWVRfRE1BMF9QSFlfQUREUgkweGZmMjk4MDAwCi0jZGVmaW5lIFNTVF9CWVRfRE1BMV9QSFlfQUREUgkweGZmMjljMDAwCi0jZGVmaW5lIFNTVF9CWVRfU1NQMF9QSFlfQUREUgkweGZmMmEwMDAwCi0jZGVmaW5lIFNTVF9CWVRfU1NQMl9QSFlfQUREUgkweGZmMmEyMDAwCi0KLSNkZWZpbmUgQllUX0ZXX01PRF9UQUJMRV9PRkZTRVQJMHg4MDAwMAotI2RlZmluZSBCWVRfRldfTU9EX1RBQkxFX1NJWkUJMHgxMDAKLSNkZWZpbmUgQllUX0ZXX01PRF9PRkZTRVQJKEJZVF9GV19NT0RfVEFCTEVfT0ZGU0VUICsgQllUX0ZXX01PRF9UQUJMRV9TSVpFKQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNzdF9pbmZvIGJ5dF9md3BhcnNlX2luZm8gPSB7Ci0JLnVzZV9lbGYJPSBmYWxzZSwKLQkubWF4X3N0cmVhbXMJPSAyNSwKLQkuaXJhbV9zdGFydAk9IFNTVF9CWVRfSVJBTV9QSFlfU1RBUlQsCi0JLmlyYW1fZW5kCT0gU1NUX0JZVF9JUkFNX1BIWV9FTkQsCi0JLmlyYW1fdXNlCT0gdHJ1ZSwKLQkuZHJhbV9zdGFydAk9IFNTVF9CWVRfRFJBTV9QSFlfU1RBUlQsCi0JLmRyYW1fZW5kCT0gU1NUX0JZVF9EUkFNX1BIWV9FTkQsCi0JLmRyYW1fdXNlCT0gdHJ1ZSwKLQkuaW1yX3N0YXJ0CT0gU1NUX0JZVF9JTVJfVklSVF9TVEFSVCwKLQkuaW1yX2VuZAk9IFNTVF9CWVRfSU1SX1ZJUlRfRU5ELAotCS5pbXJfdXNlCT0gdHJ1ZSwKLQkubWFpbGJveF9zdGFydAk9IFNTVF9CWVRfTUJPWF9QSFlfQUREUiwKLQkubnVtX3Byb2Jlcwk9IDAsCi0JLmxwZV92aWV3cHRfcnFkICA9IHRydWUsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNzdF9pcGNfaW5mbyBieXRfaXBjX2luZm8gPSB7Ci0JLmlwY19vZmZzZXQgPSAwLAotCS5tYm94X3JlY3Zfb2ZmID0gMHg0MDAsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNzdF9saWJfZG5sZF9pbmZvICBieXRfbGliX2RubGRfaW5mbyA9IHsKLQkubW9kX2Jhc2UgICAgICAgICAgID0gU1NUX0JZVF9JTVJfVklSVF9TVEFSVCwKLQkubW9kX2VuZCAgICAgICAgICAgID0gU1NUX0JZVF9JTVJfVklSVF9FTkQsCi0JLm1vZF90YWJsZV9vZmZzZXQgICA9IEJZVF9GV19NT0RfVEFCTEVfT0ZGU0VULAotCS5tb2RfdGFibGVfc2l6ZSAgICAgPSBCWVRfRldfTU9EX1RBQkxFX1NJWkUsCi0JLm1vZF9kZHJfZG5sZCAgICAgICA9IGZhbHNlLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzc3RfcmVzX2luZm8gYnl0X3J2cF9yZXNfaW5mbyA9IHsKLQkuc2hpbV9vZmZzZXQgPSAweDE0MDAwMCwKLQkuc2hpbV9zaXplID0gMHgwMDAxMDAsCi0JLnNoaW1fcGh5X2FkZHIgPSBTU1RfQllUX1NISU1fUEhZX0FERFIsCi0JLnNzcDBfb2Zmc2V0ID0gMHhhMDAwMCwKLQkuc3NwMF9zaXplID0gMHgxMDAwLAotCS5kbWEwX29mZnNldCA9IDB4OTgwMDAsCi0JLmRtYTBfc2l6ZSA9IDB4NDAwMCwKLQkuZG1hMV9vZmZzZXQgPSAweDljMDAwLAotCS5kbWExX3NpemUgPSAweDQwMDAsCi0JLmlyYW1fb2Zmc2V0ID0gMHgwYzAwMDAsCi0JLmlyYW1fc2l6ZSA9IDB4MTQwMDAsCi0JLmRyYW1fb2Zmc2V0ID0gMHgxMDAwMDAsCi0JLmRyYW1fc2l6ZSA9IDB4MjgwMDAsCi0JLm1ib3hfb2Zmc2V0ID0gMHgxNDQwMDAsCi0JLm1ib3hfc2l6ZSA9IDB4MTAwMCwKLQkuYWNwaV9scGVfcmVzX2luZGV4ID0gMCwKLQkuYWNwaV9kZHJfaW5kZXggPSAyLAotCS5hY3BpX2lwY19pcnFfaW5kZXggPSA1LAotfTsKLQotc3RhdGljIHN0cnVjdCBzc3RfcGxhdGZvcm1faW5mbyBieXRfcnZwX3BsYXRmb3JtX2RhdGEgPSB7Ci0JLnByb2JlX2RhdGEgPSAmYnl0X2Z3cGFyc2VfaW5mbywKLQkuaXBjX2luZm8gPSAmYnl0X2lwY19pbmZvLAotCS5saWJfaW5mbyA9ICZieXRfbGliX2RubGRfaW5mbywKLQkucmVzX2luZm8gPSAmYnl0X3J2cF9yZXNfaW5mbywKLQkucGxhdGZvcm0gPSAic3N0LW1mbGQtcGxhdGZvcm0iLAotfTsKLQotLyogQ2hlcnJ5dmlldyAoQ2hlcnJ5dHJhaWwgYW5kIEJyYXN3ZWxsKSB1c2VzIHNhbWUgbXJmbGQgZHBjbSBmdyBhcyBCYXl0cmFpbCwKLSAqIHNvIHBkYXRhIGlzIHNhbWUgYXMgQmF5dHJhaWwuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3N0X3BsYXRmb3JtX2luZm8gY2h2X3BsYXRmb3JtX2RhdGEgPSB7Ci0JLnByb2JlX2RhdGEgPSAmYnl0X2Z3cGFyc2VfaW5mbywKLQkuaXBjX2luZm8gPSAmYnl0X2lwY19pbmZvLAotCS5saWJfaW5mbyA9ICZieXRfbGliX2RubGRfaW5mbywKLQkucmVzX2luZm8gPSAmYnl0X3J2cF9yZXNfaW5mbywKLQkucGxhdGZvcm0gPSAic3N0LW1mbGQtcGxhdGZvcm0iLAotfTsKLQotc3RhdGljIGludCBzc3RfcGxhdGZvcm1fZ2V0X3Jlc291cmNlcyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4KQotewotCXN0cnVjdCByZXNvdXJjZSAqcnNyYzsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGN0eC0+ZGV2KTsKLQotCS8qIEFsbCBBQ1BJIHJlc291cmNlIHJlcXVlc3QgaGVyZSAqLwotCS8qIEdldCBTaGltIGFkZHIgKi8KLQlyc3JjID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAotCQkJCQljdHgtPnBkYXRhLT5yZXNfaW5mby0+YWNwaV9scGVfcmVzX2luZGV4KTsKLQlpZiAoIXJzcmMpIHsKLQkJZGV2X2VycihjdHgtPmRldiwgIkludmFsaWQgU0hJTSBiYXNlIGZyb20gSUZXSSIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JZGV2X2luZm8oY3R4LT5kZXYsICJMUEUgYmFzZTogJSN4IHNpemU6JSN4IiwgKHVuc2lnbmVkIGludCkgcnNyYy0+c3RhcnQsCi0JCQkJCSh1bnNpZ25lZCBpbnQpcmVzb3VyY2Vfc2l6ZShyc3JjKSk7Ci0KLQljdHgtPmlyYW1fYmFzZSA9IHJzcmMtPnN0YXJ0ICsgY3R4LT5wZGF0YS0+cmVzX2luZm8tPmlyYW1fb2Zmc2V0OwotCWN0eC0+aXJhbV9lbmQgPSAgY3R4LT5pcmFtX2Jhc2UgKyBjdHgtPnBkYXRhLT5yZXNfaW5mby0+aXJhbV9zaXplIC0gMTsKLQlkZXZfaW5mbyhjdHgtPmRldiwgIklSQU0gYmFzZTogJSN4IiwgY3R4LT5pcmFtX2Jhc2UpOwotCWN0eC0+aXJhbSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKGN0eC0+ZGV2LCBjdHgtPmlyYW1fYmFzZSwKLQkJCQkJIGN0eC0+cGRhdGEtPnJlc19pbmZvLT5pcmFtX3NpemUpOwotCWlmICghY3R4LT5pcmFtKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIElSQU0iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JY3R4LT5kcmFtX2Jhc2UgPSByc3JjLT5zdGFydCArIGN0eC0+cGRhdGEtPnJlc19pbmZvLT5kcmFtX29mZnNldDsKLQljdHgtPmRyYW1fZW5kID0gY3R4LT5kcmFtX2Jhc2UgKyBjdHgtPnBkYXRhLT5yZXNfaW5mby0+ZHJhbV9zaXplIC0gMTsKLQlkZXZfaW5mbyhjdHgtPmRldiwgIkRSQU0gYmFzZTogJSN4IiwgY3R4LT5kcmFtX2Jhc2UpOwotCWN0eC0+ZHJhbSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKGN0eC0+ZGV2LCBjdHgtPmRyYW1fYmFzZSwKLQkJCQkJIGN0eC0+cGRhdGEtPnJlc19pbmZvLT5kcmFtX3NpemUpOwotCWlmICghY3R4LT5kcmFtKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIERSQU0iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JY3R4LT5zaGltX3BoeV9hZGQgPSByc3JjLT5zdGFydCArIGN0eC0+cGRhdGEtPnJlc19pbmZvLT5zaGltX29mZnNldDsKLQlkZXZfaW5mbyhjdHgtPmRldiwgIlNISU0gYmFzZTogJSN4IiwgY3R4LT5zaGltX3BoeV9hZGQpOwotCWN0eC0+c2hpbSA9IGRldm1faW9yZW1hcF9ub2NhY2hlKGN0eC0+ZGV2LCBjdHgtPnNoaW1fcGh5X2FkZCwKLQkJCQkJY3R4LT5wZGF0YS0+cmVzX2luZm8tPnNoaW1fc2l6ZSk7Ci0JaWYgKCFjdHgtPnNoaW0pIHsKLQkJZGV2X2VycihjdHgtPmRldiwgInVuYWJsZSB0byBtYXAgU0hJTSIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiByZWFzc2lnbiBwaHlzaWNhbCBhZGRyZXNzIHRvIExQRSB2aWV3cG9pbnQgYWRkcmVzcyAqLwotCWN0eC0+c2hpbV9waHlfYWRkID0gY3R4LT5wZGF0YS0+cmVzX2luZm8tPnNoaW1fcGh5X2FkZHI7Ci0KLQkvKiBHZXQgbWFpbGJveCBhZGRyICovCi0JY3R4LT5tYWlsYm94X2FkZCA9IHJzcmMtPnN0YXJ0ICsgY3R4LT5wZGF0YS0+cmVzX2luZm8tPm1ib3hfb2Zmc2V0OwotCWRldl9pbmZvKGN0eC0+ZGV2LCAiTWFpbGJveCBiYXNlOiAlI3giLCBjdHgtPm1haWxib3hfYWRkKTsKLQljdHgtPm1haWxib3ggPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShjdHgtPmRldiwgY3R4LT5tYWlsYm94X2FkZCwKLQkJCQkJICAgIGN0eC0+cGRhdGEtPnJlc19pbmZvLT5tYm94X3NpemUpOwotCWlmICghY3R4LT5tYWlsYm94KSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJ1bmFibGUgdG8gbWFwIG1haWxib3giKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogcmVhc3NpZ24gcGh5c2ljYWwgYWRkcmVzcyB0byBMUEUgdmlld3BvaW50IGFkZHJlc3MgKi8KLQljdHgtPm1haWxib3hfYWRkID0gY3R4LT5pbmZvLm1haWxib3hfc3RhcnQ7Ci0KLQlyc3JjID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLAotCQkJCQljdHgtPnBkYXRhLT5yZXNfaW5mby0+YWNwaV9kZHJfaW5kZXgpOwotCWlmICghcnNyYykgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAiSW52YWxpZCBERFIgYmFzZSBmcm9tIElGV0kiKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCWN0eC0+ZGRyX2Jhc2UgPSByc3JjLT5zdGFydDsKLQljdHgtPmRkcl9lbmQgPSByc3JjLT5lbmQ7Ci0JZGV2X2luZm8oY3R4LT5kZXYsICJERFIgYmFzZTogJSN4IiwgY3R4LT5kZHJfYmFzZSk7Ci0JY3R4LT5kZHIgPSBkZXZtX2lvcmVtYXBfbm9jYWNoZShjdHgtPmRldiwgY3R4LT5kZHJfYmFzZSwKLQkJCQkJcmVzb3VyY2Vfc2l6ZShyc3JjKSk7Ci0JaWYgKCFjdHgtPmRkcikgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAidW5hYmxlIHRvIG1hcCBERFIiKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogRmluZCB0aGUgSVJRICovCi0JY3R4LT5pcnFfbnVtID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LAotCQkJCWN0eC0+cGRhdGEtPnJlc19pbmZvLT5hY3BpX2lwY19pcnFfaW5kZXgpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgYWNwaV9zdGF0dXMgc3N0X2FjcGlfbWFjaF9tYXRjaChhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsZXZlbCwKLQkJCQkgICAgICAgdm9pZCAqY29udGV4dCwgdm9pZCAqKnJldCkKLXsKLQkqKGJvb2wgKiljb250ZXh0ID0gdHJ1ZTsKLQlyZXR1cm4gQUVfT0s7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3N0X21hY2hpbmVzICpzc3RfYWNwaV9maW5kX21hY2hpbmUoCi0Jc3RydWN0IHNzdF9tYWNoaW5lcyAqbWFjaGluZXMpCi17Ci0Jc3RydWN0IHNzdF9tYWNoaW5lcyAqbWFjaDsKLQlib29sIGZvdW5kID0gZmFsc2U7Ci0KLQlmb3IgKG1hY2ggPSBtYWNoaW5lczsgbWFjaC0+Y29kZWNfaWQ7IG1hY2grKykKLQkJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9kZXZpY2VzKG1hY2gtPmNvZGVjX2lkLAotCQkJCQkJICBzc3RfYWNwaV9tYWNoX21hdGNoLAotCQkJCQkJICAmZm91bmQsIE5VTEwpKSAmJiBmb3VuZCkKLQkJCXJldHVybiBtYWNoOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2FjcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OwotCWludCByZXQgPSAwOwotCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHg7Ci0JY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkICppZDsKLQlzdHJ1Y3Qgc3N0X21hY2hpbmVzICptYWNoOwotCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm1kZXY7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdF9kZXY7Ci0JdW5zaWduZWQgaW50IGRldl9pZDsKLQotCWlkID0gYWNwaV9tYXRjaF9kZXZpY2UoZGV2LT5kcml2ZXItPmFjcGlfbWF0Y2hfdGFibGUsIGRldik7Ci0JaWYgKCFpZCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JZGV2X2RiZyhkZXYsICJmb3IgJXMiLCBpZC0+aWQpOwotCi0JbWFjaCA9IChzdHJ1Y3Qgc3N0X21hY2hpbmVzICopaWQtPmRyaXZlcl9kYXRhOwotCW1hY2ggPSBzc3RfYWNwaV9maW5kX21hY2hpbmUobWFjaCk7Ci0JaWYgKG1hY2ggPT0gTlVMTCkgewotCQlkZXZfZXJyKGRldiwgIk5vIG1hdGNoaW5nIG1hY2hpbmUgZHJpdmVyIGZvdW5kXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmV0ID0ga3N0cnRvdWludChpZC0+aWQsIDE2LCAmZGV2X2lkKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKGRldiwgIlVuaXF1ZSBkZXZpY2UgaWQgY29udmVyc2lvbiBlcnJvcjogJWRcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZGV2X2RiZyhkZXYsICJBQ1BJIGRldmljZSBpZDogJXhcbiIsIGRldl9pZCk7Ci0KLQlwbGF0X2RldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9kYXRhKGRldiwgbWFjaC0+cGRhdGEtPnBsYXRmb3JtLCAtMSwgTlVMTCwgMCk7Ci0JaWYgKElTX0VSUihwbGF0X2RldikpIHsKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY3JlYXRlIG1hY2hpbmUgZGV2aWNlOiAlc1xuIiwgbWFjaC0+cGRhdGEtPnBsYXRmb3JtKTsKLQkJcmV0dXJuIFBUUl9FUlIocGxhdF9kZXYpOwotCX0KLQotCS8qIENyZWF0ZSBwbGF0Zm9ybSBkZXZpY2UgZm9yIHNzdCBtYWNoaW5lIGRyaXZlciAqLwotCW1kZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfZGF0YShkZXYsIG1hY2gtPm1hY2hpbmUsIC0xLCBOVUxMLCAwKTsKLQlpZiAoSVNfRVJSKG1kZXYpKSB7Ci0JCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBtYWNoaW5lIGRldmljZTogJXNcbiIsIG1hY2gtPm1hY2hpbmUpOwotCQlyZXR1cm4gUFRSX0VSUihtZGV2KTsKLQl9Ci0KLQlyZXQgPSBzc3RfYWxsb2NfZHJ2X2NvbnRleHQoJmN0eCwgZGV2LCBkZXZfaWQpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogRmlsbCBzc3QgcGxhdGZvcm0gZGF0YSAqLwotCWN0eC0+cGRhdGEgPSBtYWNoLT5wZGF0YTsKLQlzdHJjcHkoY3R4LT5maXJtd2FyZV9uYW1lLCBtYWNoLT5maXJtd2FyZSk7Ci0KLQlyZXQgPSBzc3RfcGxhdGZvcm1fZ2V0X3Jlc291cmNlcyhjdHgpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzc3RfY29udGV4dF9pbml0KGN0eCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBuZWVkIHRvIHNhdmUgc2hpbSByZWdpc3RlcnMgaW4gQllUICovCi0JY3R4LT5zaGltX3JlZ3M2NCA9IGRldm1fa3phbGxvYyhjdHgtPmRldiwgc2l6ZW9mKCpjdHgtPnNoaW1fcmVnczY0KSwKLQkJCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFjdHgtPnNoaW1fcmVnczY0KSB7Ci0JCXJldHVybiAtRU5PTUVNOwotCQlnb3RvIGRvX3NzdF9jbGVhbnVwOwotCX0KLQotCXNzdF9jb25maWd1cmVfcnVudGltZV9wbShjdHgpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGN0eCk7Ci0JcmV0dXJuIHJldDsKLQotZG9fc3N0X2NsZWFudXA6Ci0Jc3N0X2NvbnRleHRfY2xlYW51cChjdHgpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotCWRldl9lcnIoY3R4LT5kZXYsICJmYWlsZWQgd2l0aCAlZFxuIiwgcmV0KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSogaW50ZWxfc3N0X3JlbW92ZSAtIHJlbW92ZSBmdW5jdGlvbgotKgotKiBAcGRldjoJcGxhdGZvcm0gZGV2aWNlIHN0cnVjdHVyZQotKgotKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBPUyB3aGVuIGEgZGV2aWNlIGlzIHVubG9hZGVkCi0qIFRoaXMgZnJlZXMgdGhlIGludGVycnVwdCBldGMKLSovCi1zdGF0aWMgaW50IHNzdF9hY3BpX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHg7Ci0KLQljdHggPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQlzc3RfY29udGV4dF9jbGVhbnVwKGN0eCk7Ci0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3N0X21hY2hpbmVzIHNzdF9hY3BpX2J5dGNyW10gPSB7Ci0JeyIxMEVDNTY0MCIsICJUMTAwIiwgImJ5dHQxMDBfcnQ1NjQwIiwgTlVMTCwgImludGVsL2Z3X3NzdF8wZjI4LmJpbiIsCi0JCQkJCQkmYnl0X3J2cF9wbGF0Zm9ybV9kYXRhIH0sCi0Je30sCi19OwotCi0vKiBDaGVycnl2aWV3LWJhc2VkIHBsYXRmb3JtczogQ2hlcnJ5VHJhaWwgYW5kIEJyYXN3ZWxsICovCi1zdGF0aWMgc3RydWN0IHNzdF9tYWNoaW5lcyBzc3RfYWNwaV9jaHZbXSA9IHsKLQl7IjEwRUM1NjcwIiwgImNodC1ic3ciLCAiY2h0LWJzdy1ydDU2NzIiLCBOVUxMLCAiaW50ZWwvZndfc3N0XzIyYTguYmluIiwKLQkJCQkJCSZjaHZfcGxhdGZvcm1fZGF0YSB9LAotCXsiMTBFQzU2NDUiLCAiY2h0LWJzdyIsICJjaHQtYnN3LXJ0NTY0NSIsIE5VTEwsICJpbnRlbC9md19zc3RfMjJhOC5iaW4iLAotCQkJCQkJJmNodl9wbGF0Zm9ybV9kYXRhIH0sCi0Je30sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZGV2aWNlX2lkIHNzdF9hY3BpX2lkc1tdID0gewotCXsgIjgwODYwRjI4IiwgKHVuc2lnbmVkIGxvbmcpJnNzdF9hY3BpX2J5dGNyfSwKLQl7ICI4MDg2MjJBOCIsICh1bnNpZ25lZCBsb25nKSAmc3N0X2FjcGlfY2h2fSwKLQl7IH0sCi19OwotCi1NT0RVTEVfREVWSUNFX1RBQkxFKGFjcGksIHNzdF9hY3BpX2lkcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHNzdF9hY3BpX2RyaXZlciA9IHsKLQkuZHJpdmVyID0gewotCQkubmFtZQkJCT0gImludGVsX3NzdF9hY3BpIiwKLQkJLmFjcGlfbWF0Y2hfdGFibGUJPSBBQ1BJX1BUUihzc3RfYWNwaV9pZHMpLAotCQkucG0JCQk9ICZpbnRlbF9zc3RfcG0sCi0JfSwKLQkucHJvYmUJPSBzc3RfYWNwaV9wcm9iZSwKLQkucmVtb3ZlCT0gc3N0X2FjcGlfcmVtb3ZlLAotfTsKLQotbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzc3RfYWNwaV9kcml2ZXIpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIChSKSBTU1QoUikgQXVkaW8gRW5naW5lIEFDUEkgRHJpdmVyIik7Ci1NT0RVTEVfQVVUSE9SKCJSYW1lc2ggQmFidSBLIFYiKTsKLU1PRFVMRV9BVVRIT1IoIk9tYWlyIE1vaGFtbWVkIEFiZHVsbGFoIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfQUxJQVMoInNzdCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC9zc3RfZHJ2X2ludGVyZmFjZS5jIGIvc291bmQvc29jL2ludGVsL3NzdC9zc3RfZHJ2X2ludGVyZmFjZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjc1ZWYzLi4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9zc3Qvc3N0X2Rydl9pbnRlcmZhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDY4NiArMCwwIEBACi0vKgotICogIHNzdF9kcnZfaW50ZXJmYWNlLmMgLSBJbnRlbCBTU1QgRHJpdmVyIGZvciBhdWRpbyBlbmdpbmUKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA4LTE0IEludGVsIENvcnAKLSAqICBBdXRob3JzOglWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4KLSAqCQlIYXJzaGEgUHJpeWEgPHByaXlhLmhhcnNoYUBpbnRlbC5jb20+Ci0gKgkJRGhhcmFnZXN3YXJpIFIgPGRoYXJhZ2Vzd2FyaS5yQGludGVsLmNvbSkKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KLSNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvY29tcHJlc3NfZHJpdmVyLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXRmb3JtX3NzdF9hdWRpby5oPgotI2luY2x1ZGUgIi4uL3NzdC1tZmxkLXBsYXRmb3JtLmgiCi0jaW5jbHVkZSAic3N0LmgiCi0jaW5jbHVkZSAiLi4vc3N0LWRzcC5oIgotCi0KLQotI2RlZmluZSBOVU1fQ09ERUMgMgotI2RlZmluZSBNSU5fRlJBR01FTlQgMgotI2RlZmluZSBNQVhfRlJBR01FTlQgNAotI2RlZmluZSBNSU5fRlJBR01FTlRfU0laRSAoNTAgKiAxMDI0KQotI2RlZmluZSBNQVhfRlJBR01FTlRfU0laRSAoMTAyNCAqIDEwMjQpCi0jZGVmaW5lIFNTVF9HRVRfQllURVNfUEVSX1NBTVBMRShwY21fd2Rfc3opICAoKChwY21fd2Rfc3ogKyAxNSkgPj4gNCkgPDwgMSkKLQotaW50IGZyZWVfc3RyZWFtX2NvbnRleHQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgdW5zaWduZWQgaW50IHN0cl9pZCkKLXsKLQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKLQlpbnQgcmV0ID0gMDsKLQotCXN0cmVhbSA9IGdldF9zdHJlYW1faW5mbyhjdHgsIHN0cl9pZCk7Ci0JaWYgKHN0cmVhbSkgewotCQkvKiBzdHJfaWQgaXMgdmFsaWQsIHNvIHN0cmVhbSBpcyBhbGxvYWN0ZWQgKi8KLQkJcmV0ID0gc3N0X2ZyZWVfc3RyZWFtKGN0eCwgc3RyX2lkKTsKLQkJaWYgKHJldCkKLQkJCXNzdF9jbGVhbl9zdHJlYW0oJmN0eC0+c3RyZWFtc1tzdHJfaWRdKTsKLQkJcmV0dXJuIHJldDsKLQl9IGVsc2UgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAid2UgdHJpZWQgdG8gZnJlZSBzdHJlYW0gY29udGV4dCAlZCB3aGljaCB3YXMgZnJlZWQhISFcbiIsIHN0cl9pZCk7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBzc3RfZ2V0X3N0cmVhbV9hbGxvY2F0ZWQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwKLQlzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbSwKLQlzdHJ1Y3Qgc25kX3NzdF9saWJfZG93bmxvYWQgKipsaWJfZG5sZCkKLXsKLQlpbnQgcmV0dmFsOwotCi0JcmV0dmFsID0gY3R4LT5vcHMtPmFsbG9jX3N0cmVhbShjdHgsIHN0cl9wYXJhbSk7Ci0JaWYgKHJldHZhbCA+IDApCi0JCWRldl9kYmcoY3R4LT5kZXYsICJTdHJlYW0gYWxsb2NhdGVkICVkXG4iLCByZXR2YWwpOwotCXJldHVybiByZXR2YWw7Ci0KLX0KLQotLyoKLSAqIHNzdF9nZXRfc2ZyZXEgLSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgc3RyZWFtCi0gKgotICogQHN0cl9wYXJhbSA6IHN0cmVhbSBwYXJhbXMKLSAqLwotaW50IHNzdF9nZXRfc2ZyZXEoc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pCi17Ci0Jc3dpdGNoIChzdHJfcGFyYW0tPmNvZGVjKSB7Ci0JY2FzZSBTU1RfQ09ERUNfVFlQRV9QQ006Ci0JCXJldHVybiBzdHJfcGFyYW0tPnNwYXJhbXMudWMucGNtX3BhcmFtcy5zZnJlcTsKLQljYXNlIFNTVF9DT0RFQ19UWVBFX0FBQzoKLQkJcmV0dXJuIHN0cl9wYXJhbS0+c3BhcmFtcy51Yy5hYWNfcGFyYW1zLmV4dGVybmFsc3I7Ci0JY2FzZSBTU1RfQ09ERUNfVFlQRV9NUDM6Ci0JCXJldHVybiAwOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLX0KLQotLyoKLSAqIHNzdF9nZXRfbnVtX2NoYW5uZWwgLSBnZXQgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGUgc3RyZWFtCi0gKgotICogQHN0cl9wYXJhbSA6IHN0cmVhbSBwYXJhbXMKLSAqLwotaW50IHNzdF9nZXRfbnVtX2NoYW5uZWwoc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pCi17Ci0Jc3dpdGNoIChzdHJfcGFyYW0tPmNvZGVjKSB7Ci0JY2FzZSBTU1RfQ09ERUNfVFlQRV9QQ006Ci0JCXJldHVybiBzdHJfcGFyYW0tPnNwYXJhbXMudWMucGNtX3BhcmFtcy5udW1fY2hhbjsKLQljYXNlIFNTVF9DT0RFQ19UWVBFX01QMzoKLQkJcmV0dXJuIHN0cl9wYXJhbS0+c3BhcmFtcy51Yy5tcDNfcGFyYW1zLm51bV9jaGFuOwotCWNhc2UgU1NUX0NPREVDX1RZUEVfQUFDOgotCQlyZXR1cm4gc3RyX3BhcmFtLT5zcGFyYW1zLnVjLmFhY19wYXJhbXMubnVtX2NoYW47Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotfQotCi0vKgotICogc3N0X2dldF9zdHJlYW0gLSB0aGlzIGZ1bmN0aW9uIHByZXBhcmVzIGZvciBzdHJlYW0gYWxsb2NhdGlvbgotICoKLSAqIEBzdHJfcGFyYW0gOiBzdHJlYW0gcGFyYW0KLSAqLwotaW50IHNzdF9nZXRfc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsCi0JCQlzdHJ1Y3Qgc25kX3NzdF9wYXJhbXMgKnN0cl9wYXJhbSkKLXsKLQlpbnQgcmV0dmFsOwotCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm87Ci0KLQkvKiBzdHJlYW0gaXMgbm90IGFsbG9jYXRlZCwgd2UgYXJlIGFsbG9jYXRpbmcgKi8KLQlyZXR2YWwgPSBjdHgtPm9wcy0+YWxsb2Nfc3RyZWFtKGN0eCwgc3RyX3BhcmFtKTsKLQlpZiAocmV0dmFsIDw9IDApIHsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCS8qIHN0b3JlIHNhbXBsaW5nIGZyZXEgKi8KLQlzdHJfaW5mbyA9ICZjdHgtPnN0cmVhbXNbcmV0dmFsXTsKLQlzdHJfaW5mby0+c2ZyZXEgPSBzc3RfZ2V0X3NmcmVxKHN0cl9wYXJhbSk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IHNzdF9wb3dlcl9jb250cm9sKHN0cnVjdCBkZXZpY2UgKmRldiwgYm9vbCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlkZXZfZGJnKGN0eC0+ZGV2LCAic3RhdGU6JWQiLCBzdGF0ZSk7Ci0JaWYgKHN0YXRlID09IHRydWUpCi0JCXJldHVybiBwbV9ydW50aW1lX2dldF9zeW5jKGRldik7Ci0JZWxzZQotCQlyZXR1cm4gc3N0X3BtX3J1bnRpbWVfcHV0KGN0eCk7Ci19Ci0KLS8qCi0gKiBzc3Rfb3Blbl9wY21fc3RyZWFtIC0gT3BlbiBQQ00gaW50ZXJmYWNlCi0gKgotICogQHN0cl9wYXJhbTogcGFyYW1ldGVycyBvZiBwY20gc3RyZWFtCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgTUlEIHNvdW5kIGNhcmQgZHJpdmVyIHRvIG9wZW4KLSAqIGEgbmV3IHBjbSBpbnRlcmZhY2UKLSAqLwotc3RhdGljIGludCBzc3Rfb3Blbl9wY21fc3RyZWFtKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IHNuZF9zc3RfcGFyYW1zICpzdHJfcGFyYW0pCi17Ci0JaW50IHJldHZhbDsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoIXN0cl9wYXJhbSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR2YWwgPSBzc3RfZ2V0X3N0cmVhbShjdHgsIHN0cl9wYXJhbSk7Ci0JaWYgKHJldHZhbCA+IDApCi0JCWN0eC0+c3RyZWFtX2NudCsrOwotCWVsc2UKLQkJZGV2X2VycihjdHgtPmRldiwgInNzdF9nZXRfc3RyZWFtIHJldHVybmVkIGVyciAlZFxuIiwgcmV0dmFsKTsKLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2NkZXZfb3BlbihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqc3RyX3BhcmFtcywgc3RydWN0IHNzdF9jb21wcmVzc19jYiAqY2IpCi17Ci0JaW50IHN0cl9pZCwgcmV0dmFsOwotCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwotCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXJldHZhbCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoY3R4LT5kZXYpOwotCWlmIChyZXR2YWwgPCAwKQotCQlyZXR1cm4gcmV0dmFsOwotCi0Jc3RyX2lkID0gc3N0X2dldF9zdHJlYW0oY3R4LCBzdHJfcGFyYW1zKTsKLQlpZiAoc3RyX2lkID4gMCkgewotCQlkZXZfZGJnKGRldiwgInN0cmVhbSBhbGxvY2F0ZWQgaW4gc3N0X2NkZXZfb3BlbiAlZFxuIiwgc3RyX2lkKTsKLQkJc3RyZWFtID0gJmN0eC0+c3RyZWFtc1tzdHJfaWRdOwotCQlzdHJlYW0tPmNvbXByX2NiID0gY2ItPmNvbXByX2NiOwotCQlzdHJlYW0tPmNvbXByX2NiX3BhcmFtID0gY2ItPnBhcmFtOwotCQlzdHJlYW0tPmRyYWluX25vdGlmeSA9IGNiLT5kcmFpbl9ub3RpZnk7Ci0JCXN0cmVhbS0+ZHJhaW5fY2JfcGFyYW0gPSBjYi0+ZHJhaW5fY2JfcGFyYW07Ci0JfSBlbHNlIHsKLQkJZGV2X2VycihkZXYsICJzdHJlYW0gZW5jb3VudGVyZWQgZXJyb3IgZHVyaW5nIGFsbG9jICVkXG4iLCBzdHJfaWQpOwotCQlzdHJfaWQgPSAtRUlOVkFMOwotCQlzc3RfcG1fcnVudGltZV9wdXQoY3R4KTsKLQl9Ci0JcmV0dXJuIHN0cl9pZDsKLX0KLQotc3RhdGljIGludCBzc3RfY2Rldl9jbG9zZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQpCi17Ci0JaW50IHJldHZhbDsKLQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlzdHJlYW0gPSBnZXRfc3RyZWFtX2luZm8oY3R4LCBzdHJfaWQpOwotCWlmICghc3RyZWFtKSB7Ci0JCWRldl9lcnIoZGV2LCAic3RyZWFtIGluZm8gaXMgTlVMTCBmb3Igc3RyICVkISEhXG4iLCBzdHJfaWQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoc3RyZWFtLT5zdGF0dXMgPT0gU1RSRUFNX1JFU0VUKSB7Ci0JCWRldl9kYmcoZGV2LCAic3RyZWFtIGluIHJlc2V0IHN0YXRlLi4uXG4iKTsKLQkJc3RyZWFtLT5zdGF0dXMgPSBTVFJFQU1fVU5fSU5JVDsKLQotCQlyZXR2YWwgPSAwOwotCQlnb3RvIHB1dDsKLQl9Ci0KLQlyZXR2YWwgPSBzc3RfZnJlZV9zdHJlYW0oY3R4LCBzdHJfaWQpOwotcHV0OgotCXN0cmVhbS0+Y29tcHJfY2JfcGFyYW0gPSBOVUxMOwotCXN0cmVhbS0+Y29tcHJfY2IgPSBOVUxMOwotCi0JaWYgKHJldHZhbCkKLQkJZGV2X2VycihkZXYsICJmcmVlIHN0cmVhbSByZXR1cm5lZCBlcnIgJWRcbiIsIHJldHZhbCk7Ci0KLQlkZXZfZGJnKGRldiwgIkVuZFxuIik7Ci0JcmV0dXJuIHJldHZhbDsKLQotfQotCi1zdGF0aWMgaW50IHNzdF9jZGV2X2FjayhzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQsCi0JCXVuc2lnbmVkIGxvbmcgYnl0ZXMpCi17Ci0Jc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07Ci0Jc3RydWN0IHNuZF9zc3RfdHN0YW1wIGZ3X3RzdGFtcCA9IHswLH07Ci0JaW50IG9mZnNldDsKLQl2b2lkIF9faW9tZW0gKmFkZHI7Ci0Jc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0Jc3RyZWFtID0gZ2V0X3N0cmVhbV9pbmZvKGN0eCwgc3RyX2lkKTsKLQlpZiAoIXN0cmVhbSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiB1cGRhdGUgYnl0ZXMgc2VudCAqLwotCXN0cmVhbS0+Y3VtbV9ieXRlcyArPSBieXRlczsKLQlkZXZfZGJnKGRldiwgImJ5dGVzIGNvcGllZCAlZCBpbmMgYnkgJWxkXG4iLCBzdHJlYW0tPmN1bW1fYnl0ZXMsIGJ5dGVzKTsKLQotCW1lbWNweV9mcm9taW8oJmZ3X3RzdGFtcCwKLQkJKCh2b2lkICopKGN0eC0+bWFpbGJveCArIGN0eC0+dHN0YW1wKQotCQkrKHN0cl9pZCAqIHNpemVvZihmd190c3RhbXApKSksCi0JCXNpemVvZihmd190c3RhbXApKTsKLQotCWZ3X3RzdGFtcC5ieXRlc19jb3BpZWQgPSBzdHJlYW0tPmN1bW1fYnl0ZXM7Ci0JZGV2X2RiZyhkZXYsICJieXRlcyBzZW50IHRvIGZ3ICVsbHUgaW5jIGJ5ICVsZFxuIiwKLQkJCWZ3X3RzdGFtcC5ieXRlc19jb3BpZWQsIGJ5dGVzKTsKLQotCWFkZHIgPSAgKCh2b2lkICopKGN0eC0+bWFpbGJveCArIGN0eC0+dHN0YW1wKSkgKwotCQkJKHN0cl9pZCAqIHNpemVvZihmd190c3RhbXApKTsKLQlvZmZzZXQgPSAgb2Zmc2V0b2Yoc3RydWN0IHNuZF9zc3RfdHN0YW1wLCBieXRlc19jb3BpZWQpOwotCXNzdF9zaGltX3dyaXRlKGFkZHIsIG9mZnNldCwgZndfdHN0YW1wLmJ5dGVzX2NvcGllZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2NkZXZfc2V0X21ldGFkYXRhKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdW5zaWduZWQgaW50IHN0cl9pZCwgc3RydWN0IHNuZF9jb21wcl9tZXRhZGF0YSAqbWV0YWRhdGEpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0Jc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlkZXZfZGJnKGRldiwgInNldCBtZXRhZGF0YSBmb3Igc3RyZWFtICVkXG4iLCBzdHJfaWQpOwotCi0Jc3RyX2luZm8gPSBnZXRfc3RyZWFtX2luZm8oY3R4LCBzdHJfaWQpOwotCWlmICghc3RyX2luZm8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZGV2X2RiZyhkZXYsICJwaXBlIGlkID0gJWRcbiIsIHN0cl9pbmZvLT5waXBlX2lkKTsKLQlyZXR2YWwgPSBzc3RfcHJlcGFyZV9hbmRfcG9zdF9tc2coY3R4LCBzdHJfaW5mby0+dGFza19pZCwgSVBDX0NNRCwKLQkJCUlQQ19JQV9TRVRfU1RSRUFNX1BBUkFNU19NUkZMRCwgc3RyX2luZm8tPnBpcGVfaWQsCi0JCQlzaXplb2YoKm1ldGFkYXRhKSwgbWV0YWRhdGEsIE5VTEwsCi0JCQl0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgaW50IHNzdF9jZGV2X3N0cmVhbV9wYXVzZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQpCi17Ci0Jc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIHNzdF9wYXVzZV9zdHJlYW0oY3R4LCBzdHJfaWQpOwotfQotCi1zdGF0aWMgaW50IHNzdF9jZGV2X3N0cmVhbV9wYXVzZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJdW5zaWduZWQgaW50IHN0cl9pZCkKLXsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlyZXR1cm4gc3N0X3Jlc3VtZV9zdHJlYW0oY3R4LCBzdHJfaWQpOwotfQotCi1zdGF0aWMgaW50IHNzdF9jZGV2X3N0cmVhbV9zdGFydChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQpCi17Ci0Jc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlzdHJfaW5mbyA9IGdldF9zdHJlYW1faW5mbyhjdHgsIHN0cl9pZCk7Ci0JaWYgKCFzdHJfaW5mbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0Jc3RyX2luZm8tPnByZXYgPSBzdHJfaW5mby0+c3RhdHVzOwotCXN0cl9pbmZvLT5zdGF0dXMgPSBTVFJFQU1fUlVOTklORzsKLQlyZXR1cm4gc3N0X3N0YXJ0X3N0cmVhbShjdHgsIHN0cl9pZCk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X2NkZXZfc3RyZWFtX2Ryb3Aoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgc3RyX2lkKQotewotCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCXJldHVybiBzc3RfZHJvcF9zdHJlYW0oY3R4LCBzdHJfaWQpOwotfQotCi1zdGF0aWMgaW50IHNzdF9jZGV2X3N0cmVhbV9kcmFpbihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQpCi17Ci0Jc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIHNzdF9kcmFpbl9zdHJlYW0oY3R4LCBzdHJfaWQsIGZhbHNlKTsKLX0KLQotc3RhdGljIGludCBzc3RfY2Rldl9zdHJlYW1fcGFydGlhbF9kcmFpbihzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCXVuc2lnbmVkIGludCBzdHJfaWQpCi17Ci0Jc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JcmV0dXJuIHNzdF9kcmFpbl9zdHJlYW0oY3R4LCBzdHJfaWQsIHRydWUpOwotfQotCi1zdGF0aWMgaW50IHNzdF9jZGV2X3RzdGFtcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBzdHJfaWQsCi0JCXN0cnVjdCBzbmRfY29tcHJfdHN0YW1wICp0c3RhbXApCi17Ci0Jc3RydWN0IHNuZF9zc3RfdHN0YW1wIGZ3X3RzdGFtcCA9IHswLH07Ci0Jc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07Ci0Jc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JbWVtY3B5X2Zyb21pbygmZndfdHN0YW1wLAotCQkoKHZvaWQgKikoY3R4LT5tYWlsYm94ICsgY3R4LT50c3RhbXApCi0JCSsoc3RyX2lkICogc2l6ZW9mKGZ3X3RzdGFtcCkpKSwKLQkJc2l6ZW9mKGZ3X3RzdGFtcCkpOwotCi0Jc3RyZWFtID0gZ2V0X3N0cmVhbV9pbmZvKGN0eCwgc3RyX2lkKTsKLQlpZiAoIXN0cmVhbSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZGV2X2RiZyhkZXYsICJyYl9jb3VudGVyICVsbHUgaW4gYnl0ZXNcbiIsIGZ3X3RzdGFtcC5yaW5nX2J1ZmZlcl9jb3VudGVyKTsKLQotCXRzdGFtcC0+Y29waWVkX3RvdGFsID0gZndfdHN0YW1wLnJpbmdfYnVmZmVyX2NvdW50ZXI7Ci0JdHN0YW1wLT5wY21fZnJhbWVzID0gZndfdHN0YW1wLmZyYW1lc19kZWNvZGVkOwotCXRzdGFtcC0+cGNtX2lvX2ZyYW1lcyA9IGRpdl91NjQoZndfdHN0YW1wLmhhcmR3YXJlX2NvdW50ZXIsCi0JCQkodTY0KSgoc3RyZWFtLT5udW1fY2gpICogU1NUX0dFVF9CWVRFU19QRVJfU0FNUExFKDI0KSkpOwotCXRzdGFtcC0+c2FtcGxpbmdfcmF0ZSA9IGZ3X3RzdGFtcC5zYW1wbGluZ19mcmVxdWVuY3k7Ci0KLQlkZXZfZGJnKGRldiwgIlBDTSAgPSAldVxuIiwgdHN0YW1wLT5wY21faW9fZnJhbWVzKTsKLQlkZXZfZGJnKGRldiwgIlB0ciBRdWVyeSBvbiBzdHJpZCA9ICVkICBjb3BpZWRfdG90YWwgJWQsIGRlY29kZWMgJWRcbiIsCi0JCXN0cl9pZCwgdHN0YW1wLT5jb3BpZWRfdG90YWwsIHRzdGFtcC0+cGNtX2ZyYW1lcyk7Ci0JZGV2X2RiZyhkZXYsICJyZW5kZXJlZCAlZFxuIiwgdHN0YW1wLT5wY21faW9fZnJhbWVzKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNzdF9jZGV2X2NhcHMoc3RydWN0IHNuZF9jb21wcl9jYXBzICpjYXBzKQotewotCWNhcHMtPm51bV9jb2RlY3MgPSBOVU1fQ09ERUM7Ci0JY2Fwcy0+bWluX2ZyYWdtZW50X3NpemUgPSBNSU5fRlJBR01FTlRfU0laRTsgIC8qIDUwS0IgKi8KLQljYXBzLT5tYXhfZnJhZ21lbnRfc2l6ZSA9IE1BWF9GUkFHTUVOVF9TSVpFOyAgLyogMTAyNEtCICovCi0JY2Fwcy0+bWluX2ZyYWdtZW50cyA9IE1JTl9GUkFHTUVOVDsKLQljYXBzLT5tYXhfZnJhZ21lbnRzID0gTUFYX0ZSQUdNRU5UOwotCWNhcHMtPmNvZGVjc1swXSA9IFNORF9BVURJT0NPREVDX01QMzsKLQljYXBzLT5jb2RlY3NbMV0gPSBTTkRfQVVESU9DT0RFQ19BQUM7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2NvbXByX2NvZGVjX2NhcHMgY2Fwc19tcDMgPSB7Ci0JLm51bV9kZXNjcmlwdG9ycyA9IDEsCi0JLmRlc2NyaXB0b3JbMF0ubWF4X2NoID0gMiwKLQkuZGVzY3JpcHRvclswXS5zYW1wbGVfcmF0ZXNbMF0gPSA0ODAwMCwKLQkuZGVzY3JpcHRvclswXS5zYW1wbGVfcmF0ZXNbMV0gPSA0NDEwMCwKLQkuZGVzY3JpcHRvclswXS5zYW1wbGVfcmF0ZXNbMl0gPSAzMjAwMCwKLQkuZGVzY3JpcHRvclswXS5zYW1wbGVfcmF0ZXNbM10gPSAxNjAwMCwKLQkuZGVzY3JpcHRvclswXS5zYW1wbGVfcmF0ZXNbNF0gPSA4MDAwLAotCS5kZXNjcmlwdG9yWzBdLm51bV9zYW1wbGVfcmF0ZXMgPSA1LAotCS5kZXNjcmlwdG9yWzBdLmJpdF9yYXRlWzBdID0gMzIwLAotCS5kZXNjcmlwdG9yWzBdLmJpdF9yYXRlWzFdID0gMTkyLAotCS5kZXNjcmlwdG9yWzBdLm51bV9iaXRyYXRlcyA9IDIsCi0JLmRlc2NyaXB0b3JbMF0ucHJvZmlsZXMgPSAwLAotCS5kZXNjcmlwdG9yWzBdLm1vZGVzID0gU05EX0FVRElPQ0hBTk1PREVfTVAzX1NURVJFTywKLQkuZGVzY3JpcHRvclswXS5mb3JtYXRzID0gMCwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgc25kX2NvbXByX2NvZGVjX2NhcHMgY2Fwc19hYWMgPSB7Ci0JLm51bV9kZXNjcmlwdG9ycyA9IDIsCi0JLmRlc2NyaXB0b3JbMV0ubWF4X2NoID0gMiwKLQkuZGVzY3JpcHRvclswXS5zYW1wbGVfcmF0ZXNbMF0gPSA0ODAwMCwKLQkuZGVzY3JpcHRvclswXS5zYW1wbGVfcmF0ZXNbMV0gPSA0NDEwMCwKLQkuZGVzY3JpcHRvclswXS5zYW1wbGVfcmF0ZXNbMl0gPSAzMjAwMCwKLQkuZGVzY3JpcHRvclswXS5zYW1wbGVfcmF0ZXNbM10gPSAxNjAwMCwKLQkuZGVzY3JpcHRvclswXS5zYW1wbGVfcmF0ZXNbNF0gPSA4MDAwLAotCS5kZXNjcmlwdG9yWzBdLm51bV9zYW1wbGVfcmF0ZXMgPSA1LAotCS5kZXNjcmlwdG9yWzFdLmJpdF9yYXRlWzBdID0gMzIwLAotCS5kZXNjcmlwdG9yWzFdLmJpdF9yYXRlWzFdID0gMTkyLAotCS5kZXNjcmlwdG9yWzFdLm51bV9iaXRyYXRlcyA9IDIsCi0JLmRlc2NyaXB0b3JbMV0ucHJvZmlsZXMgPSAwLAotCS5kZXNjcmlwdG9yWzFdLm1vZGVzID0gMCwKLQkuZGVzY3JpcHRvclsxXS5mb3JtYXRzID0KLQkJCShTTkRfQVVESU9TVFJFQU1GT1JNQVRfTVA0QURUUyB8Ci0JCQkJU05EX0FVRElPU1RSRUFNRk9STUFUX1JBVyksCi19OwotCi1zdGF0aWMgaW50IHNzdF9jZGV2X2NvZGVjX2NhcHMoc3RydWN0IHNuZF9jb21wcl9jb2RlY19jYXBzICpjb2RlYykKLXsKLQlpZiAoY29kZWMtPmNvZGVjID09IFNORF9BVURJT0NPREVDX01QMykKLQkJKmNvZGVjID0gY2Fwc19tcDM7Ci0JZWxzZSBpZiAoY29kZWMtPmNvZGVjID09IFNORF9BVURJT0NPREVDX0FBQykKLQkJKmNvZGVjID0gY2Fwc19hYWM7Ci0JZWxzZQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiAwOwotfQotCi12b2lkIHNzdF9jZGV2X2ZyYWdtZW50X2VsYXBzZWQoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgaW50IHN0cl9pZCkKLXsKLQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKLQotCWRldl9kYmcoY3R4LT5kZXYsICJmcmFnbWVudCBlbGFwc2VkIGZyb20gZmlybXdhcmUgZm9yIHN0cl9pZCAlZFxuIiwKLQkJCXN0cl9pZCk7Ci0Jc3RyZWFtID0gJmN0eC0+c3RyZWFtc1tzdHJfaWRdOwotCWlmIChzdHJlYW0tPmNvbXByX2NiKQotCQlzdHJlYW0tPmNvbXByX2NiKHN0cmVhbS0+Y29tcHJfY2JfcGFyYW0pOwotfQotCi0vKgotICogc3N0X2Nsb3NlX3BjbV9zdHJlYW0gLSBDbG9zZSBQQ00gaW50ZXJmYWNlCi0gKgotICogQHN0cl9pZDogc3RyZWFtIGlkIHRvIGJlIGNsb3NlZAotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IE1JRCBzb3VuZCBjYXJkIGRyaXZlciB0byBjbG9zZQotICogYW4gZXhpc3RpbmcgcGNtIGludGVyZmFjZQotICovCi1zdGF0aWMgaW50IHNzdF9jbG9zZV9wY21fc3RyZWFtKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHN0cl9pZCkKLXsKLQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbTsKLQlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlzdHJlYW0gPSBnZXRfc3RyZWFtX2luZm8oY3R4LCBzdHJfaWQpOwotCWlmICghc3RyZWFtKSB7Ci0JCWRldl9lcnIoY3R4LT5kZXYsICJzdHJlYW0gaW5mbyBpcyBOVUxMIGZvciBzdHIgJWQhISFcbiIsIHN0cl9pZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmIChzdHJlYW0tPnN0YXR1cyA9PSBTVFJFQU1fUkVTRVQpIHsKLQkJLyogc2lsZW50bHkgZmFpbCBoZXJlIGFzIHdlIGhhdmUgY2xlYW5lZCB0aGUgc3RyZWFtIGVhcmxpZXIgKi8KLQkJZGV2X2RiZyhjdHgtPmRldiwgInN0cmVhbSBpbiByZXNldCBzdGF0ZS4uLlxuIik7Ci0KLQkJcmV0dmFsID0gMDsKLQkJZ290byBwdXQ7Ci0JfQotCi0JcmV0dmFsID0gZnJlZV9zdHJlYW1fY29udGV4dChjdHgsIHN0cl9pZCk7Ci1wdXQ6Ci0Jc3RyZWFtLT5wY21fc3Vic3RyZWFtID0gTlVMTDsKLQlzdHJlYW0tPnN0YXR1cyA9IFNUUkVBTV9VTl9JTklUOwotCXN0cmVhbS0+cGVyaW9kX2VsYXBzZWQgPSBOVUxMOwotCWN0eC0+c3RyZWFtX2NudC0tOwotCi0JaWYgKHJldHZhbCkKLQkJZGV2X2VycihjdHgtPmRldiwgImZyZWUgc3RyZWFtIHJldHVybmVkIGVyciAlZFxuIiwgcmV0dmFsKTsKLQotCWRldl9kYmcoY3R4LT5kZXYsICJFeGl0XG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc3N0X2NhbGNfdHN0YW1wKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsCi0JCXN0cnVjdCBwY21fc3RyZWFtX2luZm8gKmluZm8sCi0JCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQlzdHJ1Y3Qgc25kX3NzdF90c3RhbXAgKmZ3X3RzdGFtcCkKLXsKLQlzaXplX3QgZGVsYXlfYnl0ZXMsIGRlbGF5X2ZyYW1lczsKLQlzaXplX3QgYnVmZmVyX3N6OwotCXUzMiBwb2ludGVyX2J5dGVzLCBwb2ludGVyX3NhbXBsZXM7Ci0KLQlkZXZfZGJnKGN0eC0+ZGV2LCAibXJmbGQgcmluZ19idWZmZXJfY291bnRlciAlbGx1IGluIGJ5dGVzXG4iLAotCQkJZndfdHN0YW1wLT5yaW5nX2J1ZmZlcl9jb3VudGVyKTsKLQlkZXZfZGJnKGN0eC0+ZGV2LCAibXJmbGQgaGFyZHdhcmVfY291bnRlciAlbGx1IGluIGJ5dGVzXG4iLAotCQkJIGZ3X3RzdGFtcC0+aGFyZHdhcmVfY291bnRlcik7Ci0JaWYgKHN1YnN0cmVhbS0+c3RyZWFtID09IFNORFJWX1BDTV9TVFJFQU1fUExBWUJBQ0spCi0JCWRlbGF5X2J5dGVzID0gKHNpemVfdCkgKGZ3X3RzdGFtcC0+cmluZ19idWZmZXJfY291bnRlciAtCi0JCQkJCWZ3X3RzdGFtcC0+aGFyZHdhcmVfY291bnRlcik7Ci0JZWxzZQotCQlkZWxheV9ieXRlcyA9IChzaXplX3QpIChmd190c3RhbXAtPmhhcmR3YXJlX2NvdW50ZXIgLQotCQkJCQlmd190c3RhbXAtPnJpbmdfYnVmZmVyX2NvdW50ZXIpOwotCWRlbGF5X2ZyYW1lcyA9IGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIGRlbGF5X2J5dGVzKTsKLQlidWZmZXJfc3ogPSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKTsKLQlkaXZfdTY0X3JlbShmd190c3RhbXAtPnJpbmdfYnVmZmVyX2NvdW50ZXIsIGJ1ZmZlcl9zeiwgJnBvaW50ZXJfYnl0ZXMpOwotCXBvaW50ZXJfc2FtcGxlcyA9IGJ5dGVzX3RvX3NhbXBsZXMoc3Vic3RyZWFtLT5ydW50aW1lLCBwb2ludGVyX2J5dGVzKTsKLQotCWRldl9kYmcoY3R4LT5kZXYsICJwY20gZGVsYXkgJXp1IGluIGJ5dGVzXG4iLCBkZWxheV9ieXRlcyk7Ci0KLQlpbmZvLT5idWZmZXJfcHRyID0gcG9pbnRlcl9zYW1wbGVzIC8gc3Vic3RyZWFtLT5ydW50aW1lLT5jaGFubmVsczsKLQotCWluZm8tPnBjbV9kZWxheSA9IGRlbGF5X2ZyYW1lcyAvIHN1YnN0cmVhbS0+cnVudGltZS0+Y2hhbm5lbHM7Ci0JZGV2X2RiZyhjdHgtPmRldiwgImJ1ZmZlciBwdHIgJWxsdSBwY21fZGVsYXkgcmVwOiAlbGx1XG4iLAotCQkJaW5mby0+YnVmZmVyX3B0ciwgaW5mby0+cGNtX2RlbGF5KTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzc3RfcmVhZF90aW1lc3RhbXAoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGNtX3N0cmVhbV9pbmZvICppbmZvKQotewotCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtOwotCXN0cnVjdCBzbmRfc3N0X3RzdGFtcCBmd190c3RhbXA7Ci0JdW5zaWduZWQgaW50IHN0cl9pZDsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlzdHJfaWQgPSBpbmZvLT5zdHJfaWQ7Ci0Jc3RyZWFtID0gZ2V0X3N0cmVhbV9pbmZvKGN0eCwgc3RyX2lkKTsKLQlpZiAoIXN0cmVhbSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoIXN0cmVhbS0+cGNtX3N1YnN0cmVhbSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0Jc3Vic3RyZWFtID0gc3RyZWFtLT5wY21fc3Vic3RyZWFtOwotCi0JbWVtY3B5X2Zyb21pbygmZndfdHN0YW1wLAotCQkoKHZvaWQgKikoY3R4LT5tYWlsYm94ICsgY3R4LT50c3RhbXApCi0JCQkrIChzdHJfaWQgKiBzaXplb2YoZndfdHN0YW1wKSkpLAotCQlzaXplb2YoZndfdHN0YW1wKSk7Ci0JcmV0dXJuIHNzdF9jYWxjX3RzdGFtcChjdHgsIGluZm8sIHN1YnN0cmVhbSwgJmZ3X3RzdGFtcCk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3N0cmVhbV9zdGFydChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBzdHJfaWQpCi17Ci0Jc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoY3R4LT5zc3Rfc3RhdGUgIT0gU1NUX0ZXX1JVTk5JTkcpCi0JCXJldHVybiAwOwotCXN0cl9pbmZvID0gZ2V0X3N0cmVhbV9pbmZvKGN0eCwgc3RyX2lkKTsKLQlpZiAoIXN0cl9pbmZvKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlzdHJfaW5mby0+cHJldiA9IHN0cl9pbmZvLT5zdGF0dXM7Ci0Jc3RyX2luZm8tPnN0YXR1cyA9IFNUUkVBTV9SVU5OSU5HOwotCXNzdF9zdGFydF9zdHJlYW0oY3R4LCBzdHJfaWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3N0cmVhbV9kcm9wKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IHN0cl9pZCkKLXsKLQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvOwotCXN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHggPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWlmIChjdHgtPnNzdF9zdGF0ZSAhPSBTU1RfRldfUlVOTklORykKLQkJcmV0dXJuIDA7Ci0KLQlzdHJfaW5mbyA9IGdldF9zdHJlYW1faW5mbyhjdHgsIHN0cl9pZCk7Ci0JaWYgKCFzdHJfaW5mbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0Jc3RyX2luZm8tPnByZXYgPSBTVFJFQU1fVU5fSU5JVDsKLQlzdHJfaW5mby0+c3RhdHVzID0gU1RSRUFNX0lOSVQ7Ci0JcmV0dXJuIHNzdF9kcm9wX3N0cmVhbShjdHgsIHN0cl9pZCk7Ci19Ci0KLXN0YXRpYyBpbnQgc3N0X3N0cmVhbV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBjbV9zdHJlYW1faW5mbyAqc3RyX2luZm8pCi17Ci0JaW50IHN0cl9pZCA9IDA7Ci0Jc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07Ci0Jc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0Jc3RyX2lkID0gc3RyX2luZm8tPnN0cl9pZDsKLQotCWlmIChjdHgtPnNzdF9zdGF0ZSAhPSBTU1RfRldfUlVOTklORykKLQkJcmV0dXJuIDA7Ci0KLQlzdHJlYW0gPSBnZXRfc3RyZWFtX2luZm8oY3R4LCBzdHJfaWQpOwotCWlmICghc3RyZWFtKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldl9kYmcoY3R4LT5kZXYsICJzZXR0aW5nIHRoZSBwZXJpb2QgcHRyc1xuIik7Ci0Jc3RyZWFtLT5wY21fc3Vic3RyZWFtID0gc3RyX2luZm8tPmFyZzsKLQlzdHJlYW0tPnBlcmlvZF9lbGFwc2VkID0gc3RyX2luZm8tPnBlcmlvZF9lbGFwc2VkOwotCXN0cmVhbS0+c2ZyZXEgPSBzdHJfaW5mby0+c2ZyZXE7Ci0Jc3RyZWFtLT5wcmV2ID0gc3RyZWFtLT5zdGF0dXM7Ci0Jc3RyZWFtLT5zdGF0dXMgPSBTVFJFQU1fSU5JVDsKLQlkZXZfZGJnKGN0eC0+ZGV2LAotCQkicGNtX3N1YnN0cmVhbSAlcCwgcGVyaW9kX2VsYXBzZWQgJXAsIHNmcmVxICVkLCBzdGF0dXMgJWRcbiIsCi0JCXN0cmVhbS0+cGNtX3N1YnN0cmVhbSwgc3RyZWFtLT5wZXJpb2RfZWxhcHNlZCwKLQkJc3RyZWFtLT5zZnJlcSwgc3RyZWFtLT5zdGF0dXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBzc3Rfc2V0X2J5dGVfc3RyZWFtIC0gU2V0IGdlbmVyaWMgcGFyYW1zCi0gKgotICogQGNtZDogY29udHJvbCBjbWQgdG8gYmUgc2V0Ci0gKiBAYXJnOiBjb21tYW5kIGFyZ3VtZW50Ci0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgTUlEIHNvdW5kIGNhcmQgZHJpdmVyIHRvIGNvbmZpZ3VyZQotICogU1NUIHJ1bnRpbWUgcGFyYW1zLgotICovCi1zdGF0aWMgaW50IHNzdF9zZW5kX2J5dGVfc3RyZWFtKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IHNuZF9zc3RfYnl0ZXNfdjIgKmJ5dGVzKQotewotCWludCByZXRfdmFsID0gMDsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlpZiAoTlVMTCA9PSBieXRlcykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0X3ZhbCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoY3R4LT5kZXYpOwotCWlmIChyZXRfdmFsIDwgMCkKLQkJcmV0dXJuIHJldF92YWw7Ci0KLQlyZXRfdmFsID0gc3N0X3NlbmRfYnl0ZV9zdHJlYW1fbXJmbGQoY3R4LCBieXRlcyk7Ci0Jc3N0X3BtX3J1bnRpbWVfcHV0KGN0eCk7Ci0KLQlyZXR1cm4gcmV0X3ZhbDsKLX0KLQotc3RhdGljIHN0cnVjdCBzc3Rfb3BzIHBjbV9vcHMgPSB7Ci0JLm9wZW4gPSBzc3Rfb3Blbl9wY21fc3RyZWFtLAotCS5zdHJlYW1faW5pdCA9IHNzdF9zdHJlYW1faW5pdCwKLQkuc3RyZWFtX3N0YXJ0ID0gc3N0X3N0cmVhbV9zdGFydCwKLQkuc3RyZWFtX2Ryb3AgPSBzc3Rfc3RyZWFtX2Ryb3AsCi0JLnN0cmVhbV9yZWFkX3RzdGFtcCA9IHNzdF9yZWFkX3RpbWVzdGFtcCwKLQkuc2VuZF9ieXRlX3N0cmVhbSA9IHNzdF9zZW5kX2J5dGVfc3RyZWFtLAotCS5jbG9zZSA9IHNzdF9jbG9zZV9wY21fc3RyZWFtLAotCS5wb3dlciA9IHNzdF9wb3dlcl9jb250cm9sLAotfTsKLQotc3RhdGljIHN0cnVjdCBjb21wcmVzc19zc3Rfb3BzIGNvbXByX29wcyA9IHsKLQkub3BlbiA9IHNzdF9jZGV2X29wZW4sCi0JLmNsb3NlID0gc3N0X2NkZXZfY2xvc2UsCi0JLnN0cmVhbV9wYXVzZSA9IHNzdF9jZGV2X3N0cmVhbV9wYXVzZSwKLQkuc3RyZWFtX3BhdXNlX3JlbGVhc2UgPSBzc3RfY2Rldl9zdHJlYW1fcGF1c2VfcmVsZWFzZSwKLQkuc3RyZWFtX3N0YXJ0ID0gc3N0X2NkZXZfc3RyZWFtX3N0YXJ0LAotCS5zdHJlYW1fZHJvcCA9IHNzdF9jZGV2X3N0cmVhbV9kcm9wLAotCS5zdHJlYW1fZHJhaW4gPSBzc3RfY2Rldl9zdHJlYW1fZHJhaW4sCi0JLnN0cmVhbV9wYXJ0aWFsX2RyYWluID0gc3N0X2NkZXZfc3RyZWFtX3BhcnRpYWxfZHJhaW4sCi0JLnRzdGFtcCA9IHNzdF9jZGV2X3RzdGFtcCwKLQkuYWNrID0gc3N0X2NkZXZfYWNrLAotCS5nZXRfY2FwcyA9IHNzdF9jZGV2X2NhcHMsCi0JLmdldF9jb2RlY19jYXBzID0gc3N0X2NkZXZfY29kZWNfY2FwcywKLQkuc2V0X21ldGFkYXRhID0gc3N0X2NkZXZfc2V0X21ldGFkYXRhLAotCS5wb3dlciA9IHNzdF9wb3dlcl9jb250cm9sLAotfTsKLQotc3RhdGljIHN0cnVjdCBzc3RfZGV2aWNlIHNzdF9kc3BfZGV2aWNlID0gewotCS5uYW1lID0gIkludGVsKFIpIFNTVCBMUEUiLAotCS5kZXYgPSBOVUxMLAotCS5vcHMgPSAmcGNtX29wcywKLQkuY29tcHJfb3BzID0gJmNvbXByX29wcywKLX07Ci0KLS8qCi0gKiBzc3RfcmVnaXN0ZXIgLSBmdW5jdGlvbiB0byByZWdpc3RlciBEU1AKLSAqCi0gKiBUaGlzIGZ1bmN0aW9ucyByZWdpc3RlcnMgRFNQIHdpdGggdGhlIHBsYXRmb3JtIGRyaXZlcgotICovCi1pbnQgc3N0X3JlZ2lzdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlpbnQgcmV0X3ZhbDsKLQotCXNzdF9kc3BfZGV2aWNlLmRldiA9IGRldjsKLQlyZXRfdmFsID0gc3N0X3JlZ2lzdGVyX2RzcCgmc3N0X2RzcF9kZXZpY2UpOwotCWlmIChyZXRfdmFsKQotCQlkZXZfZXJyKGRldiwgIlVuYWJsZSB0byByZWdpc3RlciBEU1Agd2l0aCBwbGF0Zm9ybSBkcml2ZXJcbiIpOwotCi0JcmV0dXJuIHJldF92YWw7Ci19Ci0KLWludCBzc3RfdW5yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIHNzdF91bnJlZ2lzdGVyX2RzcCgmc3N0X2RzcF9kZXZpY2UpOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC9zc3RfaXBjLmMgYi9zb3VuZC9zb2MvaW50ZWwvc3N0L3NzdF9pcGMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ZTYwOS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc3N0L3NzdF9pcGMuYworKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKgotICogIHNzdF9pcGMuYyAtIEludGVsIFNTVCBEcml2ZXIgZm9yIGF1ZGlvIGVuZ2luZQotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMTQgSW50ZWwgQ29ycG9yYXRpb24KLSAqICBBdXRob3JzOglWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4KLSAqCQlIYXJzaGEgUHJpeWEgPHByaXlhLmhhcnNoYUBpbnRlbC5jb20+Ci0gKgkJRGhhcmFnZXN3YXJpIFIgPGRoYXJhZ2Vzd2FyaS5yQGludGVsLmNvbT4KLSAqCQlLUCBKZWVqYSA8amVlamEua3BAaW50ZWwuY29tPgotICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvY29tcHJlc3NfZHJpdmVyLmg+Ci0jaW5jbHVkZSA8YXNtL2ludGVsLW1pZC5oPgotI2luY2x1ZGUgPGFzbS9wbGF0Zm9ybV9zc3RfYXVkaW8uaD4KLSNpbmNsdWRlICIuLi9zc3QtbWZsZC1wbGF0Zm9ybS5oIgotI2luY2x1ZGUgInNzdC5oIgotI2luY2x1ZGUgIi4uL3NzdC1kc3AuaCIKLQotc3RydWN0IHNzdF9ibG9jayAqc3N0X2NyZWF0ZV9ibG9jayhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4LAotCQkJCQl1MzIgbXNnX2lkLCB1MzIgZHJ2X2lkKQotewotCXN0cnVjdCBzc3RfYmxvY2sgKm1zZyA9IE5VTEw7Ci0KLQlkZXZfZGJnKGN0eC0+ZGV2LCAiRW50ZXJcbiIpOwotCW1zZyA9IGt6YWxsb2Moc2l6ZW9mKCptc2cpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuIE5VTEw7Ci0JbXNnLT5jb25kaXRpb24gPSBmYWxzZTsKLQltc2ctPm9uID0gdHJ1ZTsKLQltc2ctPm1zZ19pZCA9IG1zZ19pZDsKLQltc2ctPmRydl9pZCA9IGRydl9pZDsKLQlzcGluX2xvY2tfYmgoJmN0eC0+YmxvY2tfbG9jayk7Ci0JbGlzdF9hZGRfdGFpbCgmbXNnLT5ub2RlLCAmY3R4LT5ibG9ja19saXN0KTsKLQlzcGluX3VubG9ja19iaCgmY3R4LT5ibG9ja19sb2NrKTsKLQotCXJldHVybiBtc2c7Ci19Ci0KLS8qCi0gKiB3aGlsZSBoYW5kbGluZyB0aGUgaW50ZXJydXB0cywgd2UgbmVlZCB0byBjaGVjayBmb3IgbWVzc2FnZSBzdGF0dXMgYW5kCi0gKiB0aGVuIGlmIHdlIGFyZSBibG9ja2luZyBmb3IgYSBtZXNzYWdlCi0gKgotICogaGVyZSB3ZSBhcmUgdW5ibG9ja2luZyB0aGUgYmxvY2tlZCBvbmVzLCB0aGlzIGlzIGJhc2VkIG9uIGlkIHdlIGhhdmUKLSAqIHBhc3NlZCBhbmQgc2VhcmNoIHRoYXQgZm9yIGJsb2NrIHRocmVhZHMuCi0gKiBXZSB3aWxsIG5vdCBmaW5kIGJsb2NrIGluIHR3byBjYXNlcwotICogIGEpIHdoZW4gaXRzIHNtYWxsIG1lc3NhZ2UgYW5kIGJsb2NrIGluIG5vdCB0aGVyZSwgc28gc2lsZW50bHkgaWdub3JlCi0gKiAgdGhlbQotICogIGIpIHdoZW4gd2UgYXJlIGFjdHVhbGx5IG5vdCBhYmxlIHRvIGZpbmQgdGhlIGJsb2NrIChidWcgcGVyaGFwcykKLSAqCi0gKiAgU2luY2Ugd2UgaGF2ZSBiaXQgb2Ygc21hbGwgbWVzc2FnZXMgd2UgY2FuIHNwYW0ga2VybmVsIGxvZyB3aXRoIGVycgotICogIHByaW50IG9uIGFib3ZlIHNvIG5lZWQgdG8ga2VlcCBhcyBkZWJ1ZyBwcmludHMgd2hpY2ggc2hvdWxkIGJlIGVuYWJsZWQKLSAqICB2aWEgZHluYW1pYyBkZWJ1ZyB3aGlsZSBkZWJ1Z2dpbmcgSVBDIGlzc3VlcwotICovCi1pbnQgc3N0X3dha2VfdXBfYmxvY2soc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgaW50IHJlc3VsdCwKLQkJdTMyIGRydl9pZCwgdTMyIGlwYywgdm9pZCAqZGF0YSwgdTMyIHNpemUpCi17Ci0Jc3RydWN0IHNzdF9ibG9jayAqYmxvY2sgPSBOVUxMOwotCi0JZGV2X2RiZyhjdHgtPmRldiwgIkVudGVyXG4iKTsKLQotCXNwaW5fbG9ja19iaCgmY3R4LT5ibG9ja19sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJsb2NrLCAmY3R4LT5ibG9ja19saXN0LCBub2RlKSB7Ci0JCWRldl9kYmcoY3R4LT5kZXYsICJCbG9jayBpcGMgJWQsIGRydl9pZCAlZFxuIiwgYmxvY2stPm1zZ19pZCwKLQkJCQkJCQlibG9jay0+ZHJ2X2lkKTsKLQkJaWYgKGJsb2NrLT5tc2dfaWQgPT0gaXBjICYmIGJsb2NrLT5kcnZfaWQgPT0gZHJ2X2lkKSB7Ci0JCQlkZXZfZGJnKGN0eC0+ZGV2LCAiZnJlZSB1cCB0aGUgYmxvY2tcbiIpOwotCQkJYmxvY2stPnJldF9jb2RlID0gcmVzdWx0OwotCQkJYmxvY2stPmRhdGEgPSBkYXRhOwotCQkJYmxvY2stPnNpemUgPSBzaXplOwotCQkJYmxvY2stPmNvbmRpdGlvbiA9IHRydWU7Ci0JCQlzcGluX3VubG9ja19iaCgmY3R4LT5ibG9ja19sb2NrKTsKLQkJCXdha2VfdXAoJmN0eC0+d2FpdF9xdWV1ZSk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmY3R4LT5ibG9ja19sb2NrKTsKLQlkZXZfZGJnKGN0eC0+ZGV2LAotCQkiQmxvY2sgbm90IGZvdW5kIG9yIGEgcmVzcG9uc2UgcmVjZWl2ZWQgZm9yIGEgc2hvcnQgbXNnIGZvciBpcGMgJWQsIGRydl9pZCAlZFxuIiwKLQkJaXBjLCBkcnZfaWQpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi1pbnQgc3N0X2ZyZWVfYmxvY2soc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgc3RydWN0IHNzdF9ibG9jayAqZnJlZWQpCi17Ci0Jc3RydWN0IHNzdF9ibG9jayAqYmxvY2sgPSBOVUxMLCAqX19ibG9jazsKLQotCWRldl9kYmcoY3R4LT5kZXYsICJFbnRlclxuIik7Ci0Jc3Bpbl9sb2NrX2JoKCZjdHgtPmJsb2NrX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShibG9jaywgX19ibG9jaywgJmN0eC0+YmxvY2tfbGlzdCwgbm9kZSkgewotCQlpZiAoYmxvY2sgPT0gZnJlZWQpIHsKLQkJCXByX2RlYnVnKCJwdnRfaWQgZnJlZWQgLS0+ICVkXG4iLCBmcmVlZC0+ZHJ2X2lkKTsKLQkJCS8qIHRvZ2dsZSB0aGUgaW5kZXggcG9zaXRpb24gb2YgcHZ0X2lkICovCi0JCQlsaXN0X2RlbCgmZnJlZWQtPm5vZGUpOwotCQkJc3Bpbl91bmxvY2tfYmgoJmN0eC0+YmxvY2tfbG9jayk7Ci0JCQlrZnJlZShmcmVlZC0+ZGF0YSk7Ci0JCQlmcmVlZC0+ZGF0YSA9IE5VTEw7Ci0JCQlrZnJlZShmcmVlZCk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlzcGluX3VubG9ja19iaCgmY3R4LT5ibG9ja19sb2NrKTsKLQlkZXZfZXJyKGN0eC0+ZGV2LCAiYmxvY2sgaXMgYWxyZWFkeSBmcmVlZCEhIVxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLWludCBzc3RfcG9zdF9tZXNzYWdlX21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwKLQkJc3RydWN0IGlwY19wb3N0ICppcGNfbXNnLCBib29sIHN5bmMpCi17Ci0Jc3RydWN0IGlwY19wb3N0ICptc2cgPSBpcGNfbXNnOwotCXVuaW9uIGlwY19oZWFkZXJfbXJmbGQgaGVhZGVyOwotCXVuc2lnbmVkIGludCBsb29wX2NvdW50ID0gMDsKLQlpbnQgcmV0dmFsID0gMDsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQotCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIkVudGVyOiBzeW5jOiAlZFxuIiwgc3luYyk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNzdF9kcnZfY3R4LT5pcGNfc3Bpbl9sb2NrLCBpcnFfZmxhZ3MpOwotCWhlYWRlci5mdWxsID0gc3N0X3NoaW1fcmVhZDY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfSVBDWCk7Ci0JaWYgKHN5bmMpIHsKLQkJd2hpbGUgKGhlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQuYnVzeSkgewotCQkJaWYgKGxvb3BfY291bnQgPiAyNSkgewotCQkJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwKLQkJCQkJInNzdDogQnVzeSB3YWl0IGZhaWxlZCwgY2FudCBzZW5kIHRoaXMgbXNnXG4iKTsKLQkJCQlyZXR2YWwgPSAtRUJVU1k7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQljcHVfcmVsYXgoKTsKLQkJCWxvb3BfY291bnQrKzsKLQkJCWhlYWRlci5mdWxsID0gc3N0X3NoaW1fcmVhZDY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfSVBDWCk7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAobGlzdF9lbXB0eSgmc3N0X2Rydl9jdHgtPmlwY19kaXNwYXRjaF9saXN0KSkgewotCQkJLyogcXVldWUgaXMgZW1wdHksIG5vdGhpbmcgdG8gc2VuZCAqLwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0X2Rydl9jdHgtPmlwY19zcGluX2xvY2ssIGlycV9mbGFncyk7Ci0JCQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsCi0JCQkJCSJFbXB0eSBtc2cgcXVldWUuLi4gTk8gQWN0aW9uXG4iKTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJaWYgKGhlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQuYnVzeSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0X2Rydl9jdHgtPmlwY19zcGluX2xvY2ssIGlycV9mbGFncyk7Ci0JCQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJCdXN5IG5vdCBmcmVlLi4uIHBvc3QgbGF0ZXJcbiIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQkvKiBjb3B5IG1zZyBmcm9tIGxpc3QgKi8KLQkJbXNnID0gbGlzdF9lbnRyeShzc3RfZHJ2X2N0eC0+aXBjX2Rpc3BhdGNoX2xpc3QubmV4dCwKLQkJCQlzdHJ1Y3QgaXBjX3Bvc3QsIG5vZGUpOwotCQlsaXN0X2RlbCgmbXNnLT5ub2RlKTsKLQl9Ci0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAic3N0OiBQb3N0IG1lc3NhZ2U6IGhlYWRlciA9ICV4XG4iLAotCQkJCW1zZy0+bXJmbGRfaGVhZGVyLnAuaGVhZGVyX2hpZ2guZnVsbCk7Ci0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAic3N0OiBzaXplID0gMHgleFxuIiwKLQkJCW1zZy0+bXJmbGRfaGVhZGVyLnAuaGVhZGVyX2xvd19wYXlsb2FkKTsKLQotCWlmIChtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQubGFyZ2UpCi0JCW1lbWNweV90b2lvKHNzdF9kcnZfY3R4LT5tYWlsYm94ICsgU1NUX01BSUxCT1hfU0VORCwKLQkJCW1zZy0+bWFpbGJveF9kYXRhLAotCQkJbXNnLT5tcmZsZF9oZWFkZXIucC5oZWFkZXJfbG93X3BheWxvYWQpOwotCi0Jc3N0X3NoaW1fd3JpdGU2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0lQQ1gsIG1zZy0+bXJmbGRfaGVhZGVyLmZ1bGwpOwotCi1vdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3N0X2Rydl9jdHgtPmlwY19zcGluX2xvY2ssIGlycV9mbGFncyk7Ci0Ja2ZyZWUobXNnLT5tYWlsYm94X2RhdGEpOwotCWtmcmVlKG1zZyk7Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotdm9pZCBpbnRlbF9zc3RfY2xlYXJfaW50cl9tcmZsZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgpCi17Ci0JdW5pb24gaW50ZXJydXB0X3JlZ19tcmZsZCBpc3I7Ci0JdW5pb24gaW50ZXJydXB0X3JlZ19tcmZsZCBpbXI7Ci0JdW5pb24gaXBjX2hlYWRlcl9tcmZsZCBjbGVhcl9pcGM7Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0X2Rydl9jdHgtPmlwY19zcGluX2xvY2ssIGlycV9mbGFncyk7Ci0JaW1yLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkNjQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9JTVJYKTsKLQlpc3IuZnVsbCA9IHNzdF9zaGltX3JlYWQ2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0lTUlgpOwotCi0JLyogd3JpdGUgMSB0byBjbGVhciovCi0JaXNyLnBhcnQuYnVzeV9pbnRlcnJ1cHQgPSAxOwotCXNzdF9zaGltX3dyaXRlNjQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9JU1JYLCBpc3IuZnVsbCk7Ci0KLQkvKiBTZXQgSUEgZG9uZSBiaXQgKi8KLQljbGVhcl9pcGMuZnVsbCA9IHNzdF9zaGltX3JlYWQ2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0lQQ0QpOwotCi0JY2xlYXJfaXBjLnAuaGVhZGVyX2hpZ2gucGFydC5idXN5ID0gMDsKLQljbGVhcl9pcGMucC5oZWFkZXJfaGlnaC5wYXJ0LmRvbmUgPSAxOwotCWNsZWFyX2lwYy5wLmhlYWRlcl9sb3dfcGF5bG9hZCA9IElQQ19BQ0tfU1VDQ0VTUzsKLQlzc3Rfc2hpbV93cml0ZTY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfSVBDRCwgY2xlYXJfaXBjLmZ1bGwpOwotCS8qIHVuIG1hc2sgYnVzeSBpbnRlcnJ1cHQgKi8KLQlpbXIucGFydC5idXN5X2ludGVycnVwdCA9IDA7Ci0Jc3N0X3NoaW1fd3JpdGU2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0lNUlgsIGltci5mdWxsKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzc3RfZHJ2X2N0eC0+aXBjX3NwaW5fbG9jaywgaXJxX2ZsYWdzKTsKLX0KLQotCi0vKgotICogcHJvY2Vzc19md19pbml0IC0gcHJvY2VzcyB0aGUgRlcgaW5pdCBtc2cKLSAqCi0gKiBAbXNnOiBJUEMgbWVzc2FnZSBtYWlsYm94IGRhdGEgZnJvbSBGVwotICoKLSAqIFRoaXMgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSBGVyBpbml0IG1zZyBmcm9tIEZXCi0gKiBtYXJrcyBGVyBzdGF0ZSBhbmQgcHJpbnRzIGRlYnVnIGluZm8gb2YgbG9hZGVkIEZXCi0gKi8KLXN0YXRpYyB2b2lkIHByb2Nlc3NfZndfaW5pdChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsCi0JCQl2b2lkICptc2cpCi17Ci0Jc3RydWN0IGlwY19oZWFkZXJfZndfaW5pdCAqaW5pdCA9Ci0JCShzdHJ1Y3QgaXBjX2hlYWRlcl9md19pbml0ICopbXNnOwotCWludCByZXR2YWwgPSAwOwotCi0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiKioqIEZXIEluaXQgbXNnIGNhbWUqKipcbiIpOwotCWlmIChpbml0LT5yZXN1bHQpIHsKLQkJc3N0X3NldF9md19zdGF0ZV9sb2NrZWQoc3N0X2Rydl9jdHgsIFNTVF9SRVNFVCk7Ci0JCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwgIkZXIEluaXQgZmFpbGVkLCBFcnJvciAleFxuIiwKLQkJCQlpbml0LT5yZXN1bHQpOwotCQlyZXR2YWwgPSBpbml0LT5yZXN1bHQ7Ci0JCWdvdG8gcmV0OwotCX0KLQotcmV0OgotCXNzdF93YWtlX3VwX2Jsb2NrKHNzdF9kcnZfY3R4LCByZXR2YWwsIEZXX0RXTkxfSUQsIDAgLCBOVUxMLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgcHJvY2Vzc19md19hc3luY19tc2coc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAotCQkJc3RydWN0IGlwY19wb3N0ICptc2cpCi17Ci0JdTMyIG1zZ19pZDsKLQlpbnQgc3RyX2lkOwotCXUzMiBkYXRhX3NpemUsIGk7Ci0Jdm9pZCAqZGF0YV9vZmZzZXQ7Ci0Jc3RydWN0IHN0cmVhbV9pbmZvICpzdHJlYW07Ci0JdW5pb24gaXBjX2hlYWRlcl9oaWdoIG1zZ19oaWdoOwotCXUzMiBtc2dfbG93LCBwaXBlX2lkOwotCi0JbXNnX2hpZ2ggPSBtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9oaWdoOwotCW1zZ19sb3cgPSBtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZDsKLQltc2dfaWQgPSAoKHN0cnVjdCBpcGNfZHNwX2hkciAqKW1zZy0+bWFpbGJveF9kYXRhKS0+Y21kX2lkOwotCWRhdGFfb2Zmc2V0ID0gKG1zZy0+bWFpbGJveF9kYXRhICsgc2l6ZW9mKHN0cnVjdCBpcGNfZHNwX2hkcikpOwotCWRhdGFfc2l6ZSA9ICBtc2dfbG93IC0gKHNpemVvZihzdHJ1Y3QgaXBjX2RzcF9oZHIpKTsKLQotCXN3aXRjaCAobXNnX2lkKSB7Ci0JY2FzZSBJUENfU1NUX1BFUklPRF9FTEFQU0VEX01SRkxEOgotCQlwaXBlX2lkID0gKChzdHJ1Y3QgaXBjX2RzcF9oZHIgKiltc2ctPm1haWxib3hfZGF0YSktPnBpcGVfaWQ7Ci0JCXN0cl9pZCA9IGdldF9zdHJlYW1faWRfbXJmbGQoc3N0X2Rydl9jdHgsIHBpcGVfaWQpOwotCQlpZiAoc3RyX2lkID4gMCkgewotCQkJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LAotCQkJCSJQZXJpb2QgZWxhcHNlZCByY3ZkIGZvciBwaXBlIGlkIDB4JXhcbiIsCi0JCQkJcGlwZV9pZCk7Ci0JCQlzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKLQkJCWlmIChzdHJlYW0tPnBlcmlvZF9lbGFwc2VkKQotCQkJCXN0cmVhbS0+cGVyaW9kX2VsYXBzZWQoc3RyZWFtLT5wY21fc3Vic3RyZWFtKTsKLQkJCWlmIChzdHJlYW0tPmNvbXByX2NiKQotCQkJCXN0cmVhbS0+Y29tcHJfY2Ioc3RyZWFtLT5jb21wcl9jYl9wYXJhbSk7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIElQQ19JQV9EUkFJTl9TVFJFQU1fTVJGTEQ6Ci0JCXBpcGVfaWQgPSAoKHN0cnVjdCBpcGNfZHNwX2hkciAqKW1zZy0+bWFpbGJveF9kYXRhKS0+cGlwZV9pZDsKLQkJc3RyX2lkID0gZ2V0X3N0cmVhbV9pZF9tcmZsZChzc3RfZHJ2X2N0eCwgcGlwZV9pZCk7Ci0JCWlmIChzdHJfaWQgPiAwKSB7Ci0JCQlzdHJlYW0gPSAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKLQkJCWlmIChzdHJlYW0tPmRyYWluX25vdGlmeSkKLQkJCQlzdHJlYW0tPmRyYWluX25vdGlmeShzdHJlYW0tPmRyYWluX2NiX3BhcmFtKTsKLQkJfQotCQlicmVhazsKLQotCWNhc2UgSVBDX0lBX0ZXX0FTWU5DX0VSUl9NUkZMRDoKLQkJZGV2X2Vycihzc3RfZHJ2X2N0eC0+ZGV2LCAiRlcgc2VudCBhc3luYyBlcnJvciBtc2c6XG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IChkYXRhX3NpemUvNCk7IGkrKykKLQkJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsIE5VTEwsIERVTVBfUFJFRklYX05PTkUsCi0JCQkJCTE2LCA0LCBkYXRhX29mZnNldCwgZGF0YV9zaXplLCBmYWxzZSk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUENfSUFfRldfSU5JVF9DTVBMVF9NUkZMRDoKLQkJcHJvY2Vzc19md19pbml0KHNzdF9kcnZfY3R4LCBkYXRhX29mZnNldCk7Ci0JCWJyZWFrOwotCi0JY2FzZSBJUENfSUFfQlVGX1VOREVSX1JVTl9NUkZMRDoKLQkJcGlwZV9pZCA9ICgoc3RydWN0IGlwY19kc3BfaGRyICopbXNnLT5tYWlsYm94X2RhdGEpLT5waXBlX2lkOwotCQlzdHJfaWQgPSBnZXRfc3RyZWFtX2lkX21yZmxkKHNzdF9kcnZfY3R4LCBwaXBlX2lkKTsKLQkJaWYgKHN0cl9pZCA+IDApCi0JCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsCi0JCQkJIkJ1ZmZlciB1bmRlci1ydW4gZm9yIHBpcGU6JSN4IHN0cl9pZDolZFxuIiwKLQkJCQlwaXBlX2lkLCBzdHJfaWQpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwKLQkJCSJVbnJlY29nbml6ZWQgYXN5bmMgbXNnIGZyb20gRlcgbXNnX2lkICUjeFxuIiwgbXNnX2lkKTsKLQl9Ci19Ci0KLXZvaWQgc3N0X3Byb2Nlc3NfcmVwbHlfbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAotCQlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZykKLXsKLQl1bnNpZ25lZCBpbnQgZHJ2X2lkOwotCXZvaWQgKmRhdGE7Ci0JdW5pb24gaXBjX2hlYWRlcl9oaWdoIG1zZ19oaWdoOwotCXUzMiBtc2dfbG93OwotCXN0cnVjdCBpcGNfZHNwX2hkciAqZHNwX2hkcjsKLQl1bnNpZ25lZCBpbnQgY21kX2lkOwotCi0JbXNnX2hpZ2ggPSBtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9oaWdoOwotCW1zZ19sb3cgPSBtc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZDsKLQotCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIklQQyBwcm9jZXNzIG1lc3NhZ2UgaGVhZGVyICV4IHBheWxvYWQgJXhcbiIsCi0JCQltc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9oaWdoLmZ1bGwsCi0JCQltc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9sb3dfcGF5bG9hZCk7Ci0KLQlkcnZfaWQgPSBtc2dfaGlnaC5wYXJ0LmRydl9pZDsKLQotCS8qIENoZWNrIGZvciBhc3luYyBtZXNzYWdlcyBmaXJzdCAqLwotCWlmIChkcnZfaWQgPT0gU1NUX0FTWU5DX0RSVl9JRCkgewotCQkvKkZXIHNlbnQgYXN5bmMgbGFyZ2UgbWVzc2FnZSovCi0JCXByb2Nlc3NfZndfYXN5bmNfbXNnKHNzdF9kcnZfY3R4LCBtc2cpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogRlcgc2VudCBzaG9ydCBlcnJvciByZXNwb25zZSBmb3IgYW4gSVBDICovCi0JaWYgKG1zZ19oaWdoLnBhcnQucmVzdWx0ICYmIGRydl9pZCAmJiAhbXNnX2hpZ2gucGFydC5sYXJnZSkgewotCQkvKiAzMi1iaXQgRlcgZXJyb3IgY29kZSBpbiBtc2dfbG93ICovCi0JCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwgIkZXIHNlbnQgZXJyb3IgcmVzcG9uc2UgMHgleCIsIG1zZ19sb3cpOwotCQlzc3Rfd2FrZV91cF9ibG9jayhzc3RfZHJ2X2N0eCwgbXNnX2hpZ2gucGFydC5yZXN1bHQsCi0JCQltc2dfaGlnaC5wYXJ0LmRydl9pZCwKLQkJCW1zZ19oaWdoLnBhcnQubXNnX2lkLCBOVUxMLCAwKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogUHJvY2VzcyBhbGwgdmFsaWQgcmVzcG9uc2VzCi0JICogaWYgaXQgaXMgYSBsYXJnZSBtZXNzYWdlLCB0aGUgcGF5bG9hZCBjb250YWlucyB0aGUgc2l6ZSB0bwotCSAqIGNvcHkgZnJvbSBtYWlsYm94Ci0JICoqLwotCWlmIChtc2dfaGlnaC5wYXJ0LmxhcmdlKSB7Ci0JCWRhdGEgPSBremFsbG9jKG1zZ19sb3csIEdGUF9LRVJORUwpOwotCQlpZiAoIWRhdGEpCi0JCQlyZXR1cm47Ci0JCW1lbWNweShkYXRhLCAodm9pZCAqKSBtc2ctPm1haWxib3hfZGF0YSwgbXNnX2xvdyk7Ci0JCS8qIENvcHkgY29tbWFuZCBpZCBzbyB0aGF0IHdlIGNhbiB1c2UgdG8gcHV0IHNzdCB0byByZXNldCAqLwotCQlkc3BfaGRyID0gKHN0cnVjdCBpcGNfZHNwX2hkciAqKWRhdGE7Ci0JCWNtZF9pZCA9IGRzcF9oZHItPmNtZF9pZDsKLQkJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiY21kX2lkICVkXG4iLCBkc3BfaGRyLT5jbWRfaWQpOwotCQlpZiAoc3N0X3dha2VfdXBfYmxvY2soc3N0X2Rydl9jdHgsIG1zZ19oaWdoLnBhcnQucmVzdWx0LAotCQkJCW1zZ19oaWdoLnBhcnQuZHJ2X2lkLAotCQkJCW1zZ19oaWdoLnBhcnQubXNnX2lkLCBkYXRhLCBtc2dfbG93KSkKLQkJCWtmcmVlKGRhdGEpOwotCX0gZWxzZSB7Ci0JCXNzdF93YWtlX3VwX2Jsb2NrKHNzdF9kcnZfY3R4LCBtc2dfaGlnaC5wYXJ0LnJlc3VsdCwKLQkJCQltc2dfaGlnaC5wYXJ0LmRydl9pZCwKLQkJCQltc2dfaGlnaC5wYXJ0Lm1zZ19pZCwgTlVMTCwgMCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvaW50ZWwvc3N0L3NzdF9sb2FkZXIuYyBiL3NvdW5kL3NvYy9pbnRlbC9zc3Qvc3N0X2xvYWRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODg4Y2Q3Li4wMDAwMDAwCi0tLSBhL3NvdW5kL3NvYy9pbnRlbC9zc3Qvc3N0X2xvYWRlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8qCi0gKiAgc3N0X2RzcC5jIC0gSW50ZWwgU1NUIERyaXZlciBmb3IgYXVkaW8gZW5naW5lCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwOC0xNAlJbnRlbCBDb3JwCi0gKiAgQXV0aG9yczoJVmlub2QgS291bCA8dmlub2Qua291bEBpbnRlbC5jb20+Ci0gKgkJSGFyc2hhIFByaXlhIDxwcml5YS5oYXJzaGFAaW50ZWwuY29tPgotICoJCURoYXJhZ2Vzd2FyaSBSIDxkaGFyYWdlc3dhcmkuckBpbnRlbC5jb20+Ci0gKgkJS1AgSmVlamEgPGplZWphLmtwQGludGVsLmNvbT4KLSAqICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKgotICogIFRoaXMgZmlsZSBjb250YWlucyBhbGwgZHNwIGNvbnRyb2xsaW5nIGZ1bmN0aW9ucyBsaWtlIGZpcm13YXJlIGRvd25sb2FkLAotICogc2V0dGluZy9yZXNldHRpbmcgZHNwIGNvcmVzLCBldGMKLSAqLwotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb21wcmVzc19kcml2ZXIuaD4KLSNpbmNsdWRlIDxhc20vcGxhdGZvcm1fc3N0X2F1ZGlvLmg+Ci0jaW5jbHVkZSAiLi4vc3N0LW1mbGQtcGxhdGZvcm0uaCIKLSNpbmNsdWRlICJzc3QuaCIKLSNpbmNsdWRlICIuLi9zc3QtZHNwLmgiCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtZW1jcHkzMl90b2lvKHZvaWQgX19pb21lbSAqZHN0LCBjb25zdCB2b2lkICpzcmMsIGludCBjb3VudCkKLXsKLQkvKiBfX2lvd3JpdGUzMl9jb3B5IHVzZXMgMzItYml0IGNvdW50IHZhbHVlcyBzbyBkaXZpZGUgYnkgNCBmb3IKLQkgKiByaWdodCBjb3VudCBpbiB3b3JkcwotCSAqLwotCV9faW93cml0ZTMyX2NvcHkoZHN0LCBzcmMsIGNvdW50LzQpOwotfQotCi0vKioKLSAqIGludGVsX3NzdF9yZXNldF9kc3BfbXJmbGQgLSBSZXNldHRpbmcgU1NUIERTUAotICoKLSAqIFRoaXMgcmVzZXRzIERTUCBpbiBjYXNlIG9mIE1SRkxEIHBsYXRmcm9tcwotICovCi1pbnQgaW50ZWxfc3N0X3Jlc2V0X2RzcF9tcmZsZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgpCi17Ci0JdW5pb24gY29uZmlnX3N0YXR1c19yZWdfbXJmbGQgY3NyOwotCi0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAic3N0OiBSZXNldHRpbmcgdGhlIERTUCBpbiBtcmZsZFxuIik7Ci0JY3NyLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkNjQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9DU1IpOwotCi0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAidmFsdWU6MHglbGx4XG4iLCBjc3IuZnVsbCk7Ci0KLQljc3IuZnVsbCB8PSAweDc7Ci0Jc3N0X3NoaW1fd3JpdGU2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUiwgY3NyLmZ1bGwpOwotCWNzci5mdWxsID0gc3N0X3NoaW1fcmVhZDY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSKTsKLQotCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgInZhbHVlOjB4JWxseFxuIiwgY3NyLmZ1bGwpOwotCi0JY3NyLmZ1bGwgJj0gfigweDEpOwotCXNzdF9zaGltX3dyaXRlNjQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9DU1IsIGNzci5mdWxsKTsKLQotCWNzci5mdWxsID0gc3N0X3NoaW1fcmVhZDY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSKTsKLQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJ2YWx1ZToweCVsbHhcbiIsIGNzci5mdWxsKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBzc3Rfc3RhcnRfbWVycmlmaWVsZCAtIFN0YXJ0IHRoZSBTU1QgRFNQIHByb2Nlc3NvcgotICoKLSAqIFRoaXMgc3RhcnRzIHRoZSBEU1AgaW4gTUVSUklGSUVMRCBwbGF0ZnJvbXMKLSAqLwotaW50IHNzdF9zdGFydF9tcmZsZChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgpCi17Ci0JdW5pb24gY29uZmlnX3N0YXR1c19yZWdfbXJmbGQgY3NyOwotCi0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAic3N0OiBTdGFydGluZyB0aGUgRFNQIGluIG1yZmxkIExBTEFMQUxBXG4iKTsKLQljc3IuZnVsbCA9IHNzdF9zaGltX3JlYWQ2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUik7Ci0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAidmFsdWU6MHglbGx4XG4iLCBjc3IuZnVsbCk7Ci0KLQljc3IuZnVsbCB8PSAweDc7Ci0Jc3N0X3NoaW1fd3JpdGU2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUiwgY3NyLmZ1bGwpOwotCi0JY3NyLmZ1bGwgPSBzc3Rfc2hpbV9yZWFkNjQoc3N0X2Rydl9jdHgtPnNoaW0sIFNTVF9DU1IpOwotCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgInZhbHVlOjB4JWxseFxuIiwgY3NyLmZ1bGwpOwotCi0JY3NyLnBhcnQueHRfc25vb3AgPSAxOwotCWNzci5mdWxsICY9IH4oMHg1KTsKLQlzc3Rfc2hpbV93cml0ZTY0KHNzdF9kcnZfY3R4LT5zaGltLCBTU1RfQ1NSLCBjc3IuZnVsbCk7Ci0KLQljc3IuZnVsbCA9IHNzdF9zaGltX3JlYWQ2NChzc3RfZHJ2X2N0eC0+c2hpbSwgU1NUX0NTUik7Ci0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAic3N0OiBTdGFydGluZyB0aGUgRFNQX21lcnJpZmllbGQ6JWxseFxuIiwKLQkJCWNzci5mdWxsKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzc3RfdmFsaWRhdGVfZndfaW1hZ2Uoc3RydWN0IGludGVsX3NzdF9kcnYgKmN0eCwgdW5zaWduZWQgbG9uZyBzaXplLAotCQlzdHJ1Y3QgZndfbW9kdWxlX2hlYWRlciAqKm1vZHVsZSwgdTMyICpudW1fbW9kdWxlcykKLXsKLQlzdHJ1Y3Qgc3N0X2Z3X2hlYWRlciAqaGVhZGVyOwotCWNvbnN0IHZvaWQgKnNzdF9md19pbl9tZW0gPSBjdHgtPmZ3X2luX21lbTsKLQotCWRldl9kYmcoY3R4LT5kZXYsICJFbnRlclxuIik7Ci0KLQkvKiBSZWFkIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgZGF0YSBwb2ludGVyICovCi0JaGVhZGVyID0gKHN0cnVjdCBzc3RfZndfaGVhZGVyICopc3N0X2Z3X2luX21lbTsKLQlkZXZfZGJnKGN0eC0+ZGV2LAotCQkiaGVhZGVyIHNpZ249JXMgc2l6ZT0leCBtb2R1bGVzPSV4IGZtdD0leCBzaXplPSV6eFxuIiwKLQkJaGVhZGVyLT5zaWduYXR1cmUsIGhlYWRlci0+ZmlsZV9zaXplLCBoZWFkZXItPm1vZHVsZXMsCi0JCWhlYWRlci0+ZmlsZV9mb3JtYXQsIHNpemVvZigqaGVhZGVyKSk7Ci0KLQkvKiB2ZXJpZnkgRlcgKi8KLQlpZiAoKHN0cm5jbXAoaGVhZGVyLT5zaWduYXR1cmUsIFNTVF9GV19TSUdOLCA0KSAhPSAwKSB8fAotCQkoc2l6ZSAhPSBoZWFkZXItPmZpbGVfc2l6ZSArIHNpemVvZigqaGVhZGVyKSkpIHsKLQkJLyogSW52YWxpZCBGVyBzaWduYXR1cmUgKi8KLQkJZGV2X2VycihjdHgtPmRldiwgIkludmFsaWRGVyBzaWduL2ZpbGVzaXplIG1pc21hdGNoXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCSpudW1fbW9kdWxlcyA9IGhlYWRlci0+bW9kdWxlczsKLQkqbW9kdWxlID0gKHZvaWQgKilzc3RfZndfaW5fbWVtICsgc2l6ZW9mKCpoZWFkZXIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBzc3RfZmlsbF9tZW1jcHlfbGlzdCAtIEZpbGwgdGhlIG1lbWNweSBsaXN0Ci0gKgotICogQG1lbWNweV9saXN0OiBMaXN0IHRvIGJlIGZpbGxlZAotICogQGRlc3RuOiBEZXN0aW5hdGlvbiBhZGRyIHRvIGJlIGZpbGxlZCBpbiB0aGUgbGlzdAotICogQHNyYzogU291cmNlIGFkZHIgdG8gYmUgZmlsbGVkIGluIHRoZSBsaXN0Ci0gKiBAc2l6ZTogU2l6ZSB0byBiZSBmaWxsZWQgaW4gdGhlIGxpc3QKLSAqCi0gKiBBZGRzIHRoZSBub2RlIHRvIHRoZSBsaXN0IGFmdGVyIHJlcXVpcmVkIGZpZWxkcwotICogYXJlIHBvcHVsYXRlZCBpbiB0aGUgbm9kZQotICovCi1zdGF0aWMgaW50IHNzdF9maWxsX21lbWNweV9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKm1lbWNweV9saXN0LAotCQkJdm9pZCAqZGVzdG4sIGNvbnN0IHZvaWQgKnNyYywgdTMyIHNpemUsIGJvb2wgaXNfaW8pCi17Ci0Jc3RydWN0IHNzdF9tZW1jcHlfbGlzdCAqbGlzdG5vZGU7Ci0KLQlsaXN0bm9kZSA9IGt6YWxsb2Moc2l6ZW9mKCpsaXN0bm9kZSksIEdGUF9LRVJORUwpOwotCWlmIChsaXN0bm9kZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlsaXN0bm9kZS0+ZHN0biA9IGRlc3RuOwotCWxpc3Rub2RlLT5zcmMgPSBzcmM7Ci0JbGlzdG5vZGUtPnNpemUgPSBzaXplOwotCWxpc3Rub2RlLT5pc19pbyA9IGlzX2lvOwotCWxpc3RfYWRkX3RhaWwoJmxpc3Rub2RlLT5tZW1jcHlsaXN0LCBtZW1jcHlfbGlzdCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBzc3RfcGFyc2VfbW9kdWxlX21lbWNweSAtIFBhcnNlIGF1ZGlvIEZXIG1vZHVsZXMgYW5kIHBvcHVsYXRlIHRoZSBtZW1jcHkgbGlzdAotICoKLSAqIEBzc3RfZHJ2X2N0eAkJOiBkcml2ZXIgY29udGV4dAotICogQG1vZHVsZQkJOiBGVyBtb2R1bGUgaGVhZGVyCi0gKiBAbWVtY3B5X2xpc3QJOiBQb2ludGVyIHRvIHRoZSBsaXN0IHRvIGJlIHBvcHVsYXRlZAotICogQ3JlYXRlIHRoZSBtZW1jcHkgbGlzdCBhcyB0aGUgbnVtYmVyIG9mIGJsb2NrIHRvIGJlIGNvcGllZAotICogcmV0dXJucyBlcnJvciBvciAwIGlmIG1vZHVsZSBzaXplcyBhcmUgcHJvcGVyCi0gKi8KLXN0YXRpYyBpbnQgc3N0X3BhcnNlX21vZHVsZV9tZW1jcHkoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAotCQlzdHJ1Y3QgZndfbW9kdWxlX2hlYWRlciAqbW9kdWxlLCBzdHJ1Y3QgbGlzdF9oZWFkICptZW1jcHlfbGlzdCkKLXsKLQlzdHJ1Y3QgZndfYmxvY2tfaW5mbyAqYmxvY2s7Ci0JdTMyIGNvdW50OwotCWludCByZXRfdmFsID0gMDsKLQl2b2lkIF9faW9tZW0gKnJhbV9pb21lbTsKLQotCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIm1vZHVsZSBzaWduICVzIHNpemUgJXggYmxvY2tzICV4IHR5cGUgJXhcbiIsCi0JCQltb2R1bGUtPnNpZ25hdHVyZSwgbW9kdWxlLT5tb2Rfc2l6ZSwKLQkJCW1vZHVsZS0+YmxvY2tzLCBtb2R1bGUtPnR5cGUpOwotCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIm1vZHVsZSBlbnRyeXBvaW50IDB4JXhcbiIsIG1vZHVsZS0+ZW50cnlfcG9pbnQpOwotCi0JYmxvY2sgPSAodm9pZCAqKW1vZHVsZSArIHNpemVvZigqbW9kdWxlKTsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG1vZHVsZS0+YmxvY2tzOyBjb3VudCsrKSB7Ci0JCWlmIChibG9jay0+c2l6ZSA8PSAwKSB7Ci0JCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsICJibG9jayBzaXplIGludmFsaWRcbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQkJc3dpdGNoIChibG9jay0+dHlwZSkgewotCQljYXNlIFNTVF9JUkFNOgotCQkJcmFtX2lvbWVtID0gc3N0X2Rydl9jdHgtPmlyYW07Ci0JCQlicmVhazsKLQkJY2FzZSBTU1RfRFJBTToKLQkJCXJhbV9pb21lbSA9IHNzdF9kcnZfY3R4LT5kcmFtOwotCQkJYnJlYWs7Ci0JCWNhc2UgU1NUX0REUjoKLQkJCXJhbV9pb21lbSA9IHNzdF9kcnZfY3R4LT5kZHI7Ci0JCQlicmVhazsKLQkJY2FzZSBTU1RfQ1VTVE9NX0lORk86Ci0JCQlibG9jayA9ICh2b2lkICopYmxvY2sgKyBzaXplb2YoKmJsb2NrKSArIGJsb2NrLT5zaXplOwotCQkJY29udGludWU7Ci0JCWRlZmF1bHQ6Ci0JCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsICJ3cm9uZyByYW0gdHlwZTB4JXggaW4gYmxvY2sweCV4XG4iLAotCQkJCQlibG9jay0+dHlwZSwgY291bnQpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KLQotCQlyZXRfdmFsID0gc3N0X2ZpbGxfbWVtY3B5X2xpc3QobWVtY3B5X2xpc3QsCi0JCQkJcmFtX2lvbWVtICsgYmxvY2stPnJhbV9vZmZzZXQsCi0JCQkJKHZvaWQgKilibG9jayArIHNpemVvZigqYmxvY2spLCBibG9jay0+c2l6ZSwgMSk7Ci0JCWlmIChyZXRfdmFsKQotCQkJcmV0dXJuIHJldF92YWw7Ci0KLQkJYmxvY2sgPSAodm9pZCAqKWJsb2NrICsgc2l6ZW9mKCpibG9jaykgKyBibG9jay0+c2l6ZTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogc3N0X3BhcnNlX2Z3X21lbWNweSAtIHBhcnNlIHRoZSBmaXJtd2FyZSBpbWFnZSAmIHBvcHVsYXRlIHRoZSBsaXN0IGZvciBtZW1jcHkKLSAqCi0gKiBAY3R4CQkJOiBwb2ludGVyIHRvIGRydiBjb250ZXh0Ci0gKiBAc2l6ZQkJOiBzaXplIG9mIHRoZSBmaXJtd2FyZQotICogQGZ3X2xpc3QJCTogcG9pbnRlciB0byBsaXN0X2hlYWQgdG8gYmUgcG9wdWxhdGVkCi0gKiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgRlcgaW1hZ2UgYW5kIHNhdmVzIHRoZSBwYXJzZWQgaW1hZ2UgaW4gdGhlIGxpc3QKLSAqIGZvciBtZW1jcHkKLSAqLwotc3RhdGljIGludCBzc3RfcGFyc2VfZndfbWVtY3B5KHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKLQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpmd19saXN0KQotewotCXN0cnVjdCBmd19tb2R1bGVfaGVhZGVyICptb2R1bGU7Ci0JdTMyIGNvdW50LCBudW1fbW9kdWxlczsKLQlpbnQgcmV0X3ZhbDsKLQotCXJldF92YWwgPSBzc3RfdmFsaWRhdGVfZndfaW1hZ2UoY3R4LCBzaXplLCAmbW9kdWxlLCAmbnVtX21vZHVsZXMpOwotCWlmIChyZXRfdmFsKQotCQlyZXR1cm4gcmV0X3ZhbDsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IG51bV9tb2R1bGVzOyBjb3VudCsrKSB7Ci0JCXJldF92YWwgPSBzc3RfcGFyc2VfbW9kdWxlX21lbWNweShjdHgsIG1vZHVsZSwgZndfbGlzdCk7Ci0JCWlmIChyZXRfdmFsKQotCQkJcmV0dXJuIHJldF92YWw7Ci0JCW1vZHVsZSA9ICh2b2lkICopbW9kdWxlICsgc2l6ZW9mKCptb2R1bGUpICsgbW9kdWxlLT5tb2Rfc2l6ZTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBzc3RfZG9fbWVtY3B5IC0gZnVuY3Rpb24gaW5pdGlhdGVzIHRoZSBtZW1jcHkKLSAqCi0gKiBAbWVtY3B5X2xpc3Q6IFB0ZXIgdG8gbWVtY3B5IGxpc3Qgb24gd2hpY2ggdGhlIG1lbWNweSBuZWVkcyB0byBiZSBpbml0aWF0ZWQKLSAqCi0gKiBUcmlnZ2VycyB0aGUgbWVtY3B5Ci0gKi8KLXN0YXRpYyB2b2lkIHNzdF9kb19tZW1jcHkoc3RydWN0IGxpc3RfaGVhZCAqbWVtY3B5X2xpc3QpCi17Ci0Jc3RydWN0IHNzdF9tZW1jcHlfbGlzdCAqbGlzdG5vZGU7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpc3Rub2RlLCBtZW1jcHlfbGlzdCwgbWVtY3B5bGlzdCkgewotCQlpZiAobGlzdG5vZGUtPmlzX2lvID09IHRydWUpCi0JCQltZW1jcHkzMl90b2lvKCh2b2lkIF9faW9tZW0gKilsaXN0bm9kZS0+ZHN0biwKLQkJCQkJbGlzdG5vZGUtPnNyYywgbGlzdG5vZGUtPnNpemUpOwotCQllbHNlCi0JCQltZW1jcHkobGlzdG5vZGUtPmRzdG4sIGxpc3Rub2RlLT5zcmMsIGxpc3Rub2RlLT5zaXplKTsKLQl9Ci19Ci0KLXZvaWQgc3N0X21lbWNweV9mcmVlX3Jlc291cmNlcyhzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgpCi17Ci0Jc3RydWN0IHNzdF9tZW1jcHlfbGlzdCAqbGlzdG5vZGUsICp0bXBsaXN0bm9kZTsKLQotCS8qIEZyZWUgdGhlIGxpc3QgKi8KLQlpZiAoIWxpc3RfZW1wdHkoJnNzdF9kcnZfY3R4LT5tZW1jcHlfbGlzdCkpIHsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxpc3Rub2RlLCB0bXBsaXN0bm9kZSwKLQkJCQkmc3N0X2Rydl9jdHgtPm1lbWNweV9saXN0LCBtZW1jcHlsaXN0KSB7Ci0JCQlsaXN0X2RlbCgmbGlzdG5vZGUtPm1lbWNweWxpc3QpOwotCQkJa2ZyZWUobGlzdG5vZGUpOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IHNzdF9jYWNoZV9hbmRfcGFyc2VfZncoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdCwKLQkJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdykKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQotCXNzdC0+ZndfaW5fbWVtID0ga3phbGxvYyhmdy0+c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzc3QtPmZ3X2luX21lbSkgewotCQlyZXR2YWwgPSAtRU5PTUVNOwotCQlnb3RvIGVuZF9yZWxlYXNlOwotCX0KLQlkZXZfZGJnKHNzdC0+ZGV2LCAiY29waWVkIGZ3IHRvICVwIiwgc3N0LT5md19pbl9tZW0pOwotCWRldl9kYmcoc3N0LT5kZXYsICJwaHlzOiAlbHgiLCAodW5zaWduZWQgbG9uZyl2aXJ0X3RvX3BoeXMoc3N0LT5md19pbl9tZW0pKTsKLQltZW1jcHkoc3N0LT5md19pbl9tZW0sIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7Ci0JcmV0dmFsID0gc3N0X3BhcnNlX2Z3X21lbWNweShzc3QsIGZ3LT5zaXplLCAmc3N0LT5tZW1jcHlfbGlzdCk7Ci0JaWYgKHJldHZhbCkgewotCQlkZXZfZXJyKHNzdC0+ZGV2LCAiRmFpbGVkIHRvIHBhcnNlIGZ3XG4iKTsKLQkJa2ZyZWUoc3N0LT5md19pbl9tZW0pOwotCQlzc3QtPmZ3X2luX21lbSA9IE5VTEw7Ci0JfQotCi1lbmRfcmVsZWFzZToKLQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQlyZXR1cm4gcmV0dmFsOwotCi19Ci0KLXZvaWQgc3N0X2Zpcm13YXJlX2xvYWRfY2IoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqY3R4ID0gY29udGV4dDsKLQotCWRldl9kYmcoY3R4LT5kZXYsICJFbnRlclxuIik7Ci0KLQlpZiAoZncgPT0gTlVMTCkgewotCQlkZXZfZXJyKGN0eC0+ZGV2LCAicmVxdWVzdCBmdyBmYWlsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JbXV0ZXhfbG9jaygmY3R4LT5zc3RfbG9jayk7Ci0KLQlpZiAoY3R4LT5zc3Rfc3RhdGUgIT0gU1NUX1JFU0VUIHx8Ci0JCQljdHgtPmZ3X2luX21lbSAhPSBOVUxMKSB7Ci0JCXJlbGVhc2VfZmlybXdhcmUoZncpOwotCQltdXRleF91bmxvY2soJmN0eC0+c3N0X2xvY2spOwotCQlyZXR1cm47Ci0JfQotCi0JZGV2X2RiZyhjdHgtPmRldiwgIlJlcXVlc3QgRncgY29tcGxldGVkXG4iKTsKLQlzc3RfY2FjaGVfYW5kX3BhcnNlX2Z3KGN0eCwgZncpOwotCW11dGV4X3VubG9jaygmY3R4LT5zc3RfbG9jayk7Ci19Ci0KLS8qCi0gKiBzc3RfcmVxdWVzdF9mdyAtIHJlcXVlc3RzIGF1ZGlvIGZ3IGZyb20ga2VybmVsIGFuZCBzYXZlcyBhIGNvcHkKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHJlcXVlc3RzIHRoZSBTU1QgRlcgZnJvbSB0aGUga2VybmVsLCBwYXJzZXMgaXQgYW5kCi0gKiBzYXZlcyBhIGNvcHkgaW4gdGhlIGRyaXZlciBjb250ZXh0Ci0gKi8KLXN0YXRpYyBpbnQgc3N0X3JlcXVlc3RfZncoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwotCi0JcmV0dmFsID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIHNzdC0+ZmlybXdhcmVfbmFtZSwgc3N0LT5kZXYpOwotCWlmIChmdyA9PSBOVUxMKSB7Ci0JCWRldl9lcnIoc3N0LT5kZXYsICJmdyBpcyByZXR1cm5pbmcgYXMgbnVsbFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpZiAocmV0dmFsKSB7Ci0JCWRldl9lcnIoc3N0LT5kZXYsICJyZXF1ZXN0IGZ3IGZhaWxlZCAlZFxuIiwgcmV0dmFsKTsKLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0JbXV0ZXhfbG9jaygmc3N0LT5zc3RfbG9jayk7Ci0JcmV0dmFsID0gc3N0X2NhY2hlX2FuZF9wYXJzZV9mdyhzc3QsIGZ3KTsKLQltdXRleF91bmxvY2soJnNzdC0+c3N0X2xvY2spOwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqIFdyaXRpbmcgdGhlIEREUiBwaHlzaWNhbCBiYXNlIHRvIERDQ00gb2Zmc2V0Ci0gKiBzbyB0aGF0IEZXIGNhbiB1c2UgaXQgdG8gc2V0dXAgVExCCi0gKi8KLXN0YXRpYyB2b2lkIHNzdF9kY2NtX2NvbmZpZ193cml0ZSh2b2lkIF9faW9tZW0gKmRyYW1fYmFzZSwKLQkJdW5zaWduZWQgaW50IGRkcl9iYXNlKQotewotCXZvaWQgX19pb21lbSAqYWRkcjsKLQl1MzIgYnNzX3Jlc2V0ID0gMDsKLQotCWFkZHIgPSAodm9pZCBfX2lvbWVtICopKGRyYW1fYmFzZSArIE1SRkxEX0ZXX0REUl9CQVNFX09GRlNFVCk7Ci0JbWVtY3B5MzJfdG9pbyhhZGRyLCAodm9pZCAqKSZkZHJfYmFzZSwgc2l6ZW9mKHUzMikpOwotCWJzc19yZXNldCB8PSAoMSA8PCBNUkZMRF9GV19CU1NfUkVTRVRfQklUKTsKLQlhZGRyID0gKHZvaWQgX19pb21lbSAqKShkcmFtX2Jhc2UgKyBNUkZMRF9GV19GRUFUVVJFX0JBU0VfT0ZGU0VUKTsKLQltZW1jcHkzMl90b2lvKGFkZHIsICZic3NfcmVzZXQsIHNpemVvZih1MzIpKTsKLQotfQotCi12b2lkIHNzdF9wb3N0X2Rvd25sb2FkX21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpjdHgpCi17Ci0Jc3N0X2RjY21fY29uZmlnX3dyaXRlKGN0eC0+ZHJhbSwgY3R4LT5kZHJfYmFzZSk7Ci0JZGV2X2RiZyhjdHgtPmRldiwgImNvbmZpZyB3cml0dGVuIHRvIERDQ01cbiIpOwotfQotCi0vKioKLSAqIHNzdF9sb2FkX2Z3IC0gZnVuY3Rpb24gdG8gbG9hZCBGVyBpbnRvIERTUAotICogVHJhbnNmZXJzIHRoZSBGVyB0byBEU1AgdXNpbmcgZG1hL21lbWNweQotICovCi1pbnQgc3N0X2xvYWRfZncoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4KQotewotCWludCByZXRfdmFsID0gMDsKLQlzdHJ1Y3Qgc3N0X2Jsb2NrICpibG9jazsKLQotCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgInNzdF9sb2FkX2Z3XG4iKTsKLQotCWlmIChzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlICE9ICBTU1RfUkVTRVQgfHwKLQkJCXNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgPT0gU1NUX1NIVVRET1dOKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWlmICghc3N0X2Rydl9jdHgtPmZ3X2luX21lbSkgewotCQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJzc3Q6IEZXIG5vdCBpbiBtZW1vcnkgcmV0cnkgdG8gZG93bmxvYWRcbiIpOwotCQlyZXRfdmFsID0gc3N0X3JlcXVlc3RfZncoc3N0X2Rydl9jdHgpOwotCQlpZiAocmV0X3ZhbCkKLQkJCXJldHVybiByZXRfdmFsOwotCX0KLQotCUJVR19PTighc3N0X2Rydl9jdHgtPmZ3X2luX21lbSk7Ci0JYmxvY2sgPSBzc3RfY3JlYXRlX2Jsb2NrKHNzdF9kcnZfY3R4LCAwLCBGV19EV05MX0lEKTsKLQlpZiAoYmxvY2sgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBQcmV2ZW50IEMtc3RhdGVzIGJleW9uZCBDNiAqLwotCXBtX3Fvc191cGRhdGVfcmVxdWVzdChzc3RfZHJ2X2N0eC0+cW9zLCAwKTsKLQotCXNzdF9kcnZfY3R4LT5zc3Rfc3RhdGUgPSBTU1RfRldfTE9BRElORzsKLQotCXJldF92YWwgPSBzc3RfZHJ2X2N0eC0+b3BzLT5yZXNldChzc3RfZHJ2X2N0eCk7Ci0JaWYgKHJldF92YWwpCi0JCWdvdG8gcmVzdG9yZTsKLQotCXNzdF9kb19tZW1jcHkoJnNzdF9kcnZfY3R4LT5tZW1jcHlfbGlzdCk7Ci0KLQkvKiBXcml0ZSB0aGUgRFJBTS9EQ0NNIGNvbmZpZyBiZWZvcmUgZW5hYmxpbmcgRlcgKi8KLQlpZiAoc3N0X2Rydl9jdHgtPm9wcy0+cG9zdF9kb3dubG9hZCkKLQkJc3N0X2Rydl9jdHgtPm9wcy0+cG9zdF9kb3dubG9hZChzc3RfZHJ2X2N0eCk7Ci0KLQkvKiBicmluZyBzc3Qgb3V0IG9mIHJlc2V0ICovCi0JcmV0X3ZhbCA9IHNzdF9kcnZfY3R4LT5vcHMtPnN0YXJ0KHNzdF9kcnZfY3R4KTsKLQlpZiAocmV0X3ZhbCkKLQkJZ290byByZXN0b3JlOwotCi0JcmV0X3ZhbCA9IHNzdF93YWl0X3RpbWVvdXQoc3N0X2Rydl9jdHgsIGJsb2NrKTsKLQlpZiAocmV0X3ZhbCkgewotCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsICJmdyBkb3dubG9hZCBmYWlsZWQgJWRcbiIgLCByZXRfdmFsKTsKLQkJLyogRlcgZG93bmxvYWQgZmFpbGVkIGR1ZSB0byB0aW1lb3V0ICovCi0JCXJldF92YWwgPSAtRUJVU1k7Ci0KLQl9Ci0KLQotcmVzdG9yZToKLQkvKiBSZS1lbmFibGUgRGVlcGVyIEMtc3RhdGVzIGJleW9uZCBDNiAqLwotCXBtX3Fvc191cGRhdGVfcmVxdWVzdChzc3RfZHJ2X2N0eC0+cW9zLCBQTV9RT1NfREVGQVVMVF9WQUxVRSk7Ci0Jc3N0X2ZyZWVfYmxvY2soc3N0X2Rydl9jdHgsIGJsb2NrKTsKLQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJmdyBsb2FkIHN1Y2Nlc3NmdWwhISFcbiIpOwotCi0JaWYgKHNzdF9kcnZfY3R4LT5vcHMtPnJlc3RvcmVfZHNwX2NvbnRleHQpCi0JCXNzdF9kcnZfY3R4LT5vcHMtPnJlc3RvcmVfZHNwX2NvbnRleHQoKTsKLQlzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID0gU1NUX0ZXX1JVTk5JTkc7Ci0JcmV0dXJuIHJldF92YWw7Ci19Ci0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9pbnRlbC9zc3Qvc3N0X3B2dC5jIGIvc291bmQvc29jL2ludGVsL3NzdC9zc3RfcHZ0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNzcyMDguLjAwMDAwMDAKLS0tIGEvc291bmQvc29jL2ludGVsL3NzdC9zc3RfcHZ0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLyoKLSAqICBzc3RfcHZ0LmMgLSBJbnRlbCBTU1QgRHJpdmVyIGZvciBhdWRpbyBlbmdpbmUKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAyMDA4LTE0CUludGVsIENvcnAKLSAqICBBdXRob3JzOglWaW5vZCBLb3VsIDx2aW5vZC5rb3VsQGludGVsLmNvbT4KLSAqCQlIYXJzaGEgUHJpeWEgPHByaXlhLmhhcnNoYUBpbnRlbC5jb20+Ci0gKgkJRGhhcmFnZXN3YXJpIFIgPGRoYXJhZ2Vzd2FyaS5yQGludGVsLmNvbT4KLSAqCQlLUCBKZWVqYSA8amVlamEua3BAaW50ZWwuY29tPgotICogIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxzb3VuZC9hc291bmQuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvc29jLmg+Ci0jaW5jbHVkZSA8c291bmQvY29tcHJlc3NfZHJpdmVyLmg+Ci0jaW5jbHVkZSA8YXNtL3BsYXRmb3JtX3NzdF9hdWRpby5oPgotI2luY2x1ZGUgIi4uL3NzdC1tZmxkLXBsYXRmb3JtLmgiCi0jaW5jbHVkZSAic3N0LmgiCi0jaW5jbHVkZSAiLi4vc3N0LWRzcC5oIgotCi1pbnQgc3N0X3NoaW1fd3JpdGUodm9pZCBfX2lvbWVtICphZGRyLCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCi17Ci0Jd3JpdGVsKHZhbHVlLCBhZGRyICsgb2Zmc2V0KTsKLQlyZXR1cm4gMDsKLX0KLQotdTMyIHNzdF9zaGltX3JlYWQodm9pZCBfX2lvbWVtICphZGRyLCBpbnQgb2Zmc2V0KQotewotCXJldHVybiByZWFkbChhZGRyICsgb2Zmc2V0KTsKLX0KLQotdTY0IHNzdF9yZWdfcmVhZDY0KHZvaWQgX19pb21lbSAqYWRkciwgaW50IG9mZnNldCkKLXsKLQl1NjQgdmFsID0gMDsKLQotCW1lbWNweV9mcm9taW8oJnZhbCwgYWRkciArIG9mZnNldCwgc2l6ZW9mKHZhbCkpOwotCi0JcmV0dXJuIHZhbDsKLX0KLQotaW50IHNzdF9zaGltX3dyaXRlNjQodm9pZCBfX2lvbWVtICphZGRyLCBpbnQgb2Zmc2V0LCB1NjQgdmFsdWUpCi17Ci0JbWVtY3B5X3RvaW8oYWRkciArIG9mZnNldCwgJnZhbHVlLCBzaXplb2YodmFsdWUpKTsKLQlyZXR1cm4gMDsKLX0KLQotdTY0IHNzdF9zaGltX3JlYWQ2NCh2b2lkIF9faW9tZW0gKmFkZHIsIGludCBvZmZzZXQpCi17Ci0JdTY0IHZhbCA9IDA7Ci0KLQltZW1jcHlfZnJvbWlvKCZ2YWwsIGFkZHIgKyBvZmZzZXQsIHNpemVvZih2YWwpKTsKLQlyZXR1cm4gdmFsOwotfQotCi12b2lkIHNzdF9zZXRfZndfc3RhdGVfbG9ja2VkKAotCQlzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIGludCBzc3Rfc3RhdGUpCi17Ci0JbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKLQlzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlID0gc3N0X3N0YXRlOwotCW11dGV4X3VubG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKLX0KLQotLyoKLSAqIHNzdF93YWl0X2ludGVycnVwdGlibGUgLSB3YWl0IG9uIGV2ZW50Ci0gKgotICogQHNzdF9kcnZfY3R4OiBEcml2ZXIgY29udGV4dAotICogQGJsb2NrOiBEcml2ZXIgYmxvY2sgdG8gd2FpdCBvbgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2FpdHMgd2l0aG91dCBhIHRpbWVvdXQgKGFuZCBpcyBpbnRlcnJ1cHRhYmxlKSBmb3IgYQotICogZ2l2ZW4gYmxvY2sgZXZlbnQKLSAqLwotaW50IHNzdF93YWl0X2ludGVycnVwdGlibGUoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAotCQkJCXN0cnVjdCBzc3RfYmxvY2sgKmJsb2NrKQotewotCWludCByZXR2YWwgPSAwOwotCi0JaWYgKCF3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoc3N0X2Rydl9jdHgtPndhaXRfcXVldWUsCi0JCQkJYmxvY2stPmNvbmRpdGlvbikpIHsKLQkJLyogZXZlbnQgd2FrZSAqLwotCQlpZiAoYmxvY2stPnJldF9jb2RlIDwgMCkgewotCQkJZGV2X2Vycihzc3RfZHJ2X2N0eC0+ZGV2LAotCQkJCSJzdHJlYW0gZmFpbGVkICVkXG4iLCBibG9jay0+cmV0X2NvZGUpOwotCQkJcmV0dmFsID0gLUVCVVNZOwotCQl9IGVsc2UgewotCQkJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiZXZlbnQgdXBcbiIpOwotCQkJcmV0dmFsID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwgInNpZ25hbCBpbnRlcnJ1cHRlZFxuIik7Ci0JCXJldHZhbCA9IC1FSU5UUjsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLQotfQotCi11bnNpZ25lZCBsb25nIGxvbmcgcmVhZF9zaGltX2RhdGEoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdCwgaW50IGFkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIHZhbCA9IDA7Ci0KLQlzd2l0Y2ggKHNzdC0+ZGV2X2lkKSB7Ci0JY2FzZSBTU1RfTVJGTERfUENJX0lEOgotCWNhc2UgU1NUX0JZVF9BQ1BJX0lEOgotCQl2YWwgPSBzc3Rfc2hpbV9yZWFkNjQoc3N0LT5zaGltLCBhZGRyKTsKLQkJYnJlYWs7Ci0JfQotCXJldHVybiB2YWw7Ci19Ci0KLXZvaWQgd3JpdGVfc2hpbV9kYXRhKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3QsIGludCBhZGRyLAotCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhKQotewotCXN3aXRjaCAoc3N0LT5kZXZfaWQpIHsKLQljYXNlIFNTVF9NUkZMRF9QQ0lfSUQ6Ci0JY2FzZSBTU1RfQllUX0FDUElfSUQ6Ci0JCXNzdF9zaGltX3dyaXRlNjQoc3N0LT5zaGltLCBhZGRyLCAodTY0KSBkYXRhKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKgotICogc3N0X3dhaXRfdGltZW91dCAtIHdhaXQgb24gZXZlbnQgZm9yIHRpbWVvdXQKLSAqCi0gKiBAc3N0X2Rydl9jdHg6IERyaXZlciBjb250ZXh0Ci0gKiBAYmxvY2s6IERyaXZlciBibG9jayB0byB3YWl0IG9uCi0gKgotICogVGhpcyBmdW5jdGlvbiB3YWl0cyB3aXRoIGEgdGltZW91dCB2YWx1ZSAoYW5kIGlzIG5vdCBpbnRlcnJ1cHRpYmxlKSBvbiBhCi0gKiBnaXZlbiBibG9jayBldmVudAotICovCi1pbnQgc3N0X3dhaXRfdGltZW91dChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIHN0cnVjdCBzc3RfYmxvY2sgKmJsb2NrKQotewotCWludCByZXR2YWwgPSAwOwotCi0JLyoKLQkgKiBOT1RFOgotCSAqIE9ic2VydmVkIHRoYXQgRlcgcHJvY2Vzc2VzIHRoZSBhbGxvYyBtc2cgYW5kIHJlcGxpZXMgZXZlbgotCSAqIGJlZm9yZSB0aGUgYWxsb2MgdGhyZWFkIGhhcyBmaW5pc2hlZCBleGVjdXRpb24KLQkgKi8KLQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsCi0JCSJ3YWl0aW5nIGZvciBjb25kaXRpb24gJXggaXBjICVkIGRydl9pZCAlZFxuIiwKLQkJYmxvY2stPmNvbmRpdGlvbiwgYmxvY2stPm1zZ19pZCwgYmxvY2stPmRydl9pZCk7Ci0JaWYgKHdhaXRfZXZlbnRfdGltZW91dChzc3RfZHJ2X2N0eC0+d2FpdF9xdWV1ZSwKLQkJCQlibG9jay0+Y29uZGl0aW9uLAotCQkJCW1zZWNzX3RvX2ppZmZpZXMoU1NUX0JMT0NLX1RJTUVPVVQpKSkgewotCQkvKiBldmVudCB3YWtlICovCi0JCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIkV2ZW50IHdha2UgJXhcbiIsCi0JCQkJYmxvY2stPmNvbmRpdGlvbik7Ci0JCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIm1lc3NhZ2UgcmV0OiAlZFxuIiwKLQkJCQlibG9jay0+cmV0X2NvZGUpOwotCQlyZXR2YWwgPSAtYmxvY2stPnJldF9jb2RlOwotCX0gZWxzZSB7Ci0JCWJsb2NrLT5vbiA9IGZhbHNlOwotCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsCi0JCQkiV2FpdCB0aW1lZC1vdXQgY29uZGl0aW9uOiUjeCwgbXNnX2lkOiUjeCBmd19zdGF0ZSAlI3hcbiIsCi0JCQlibG9jay0+Y29uZGl0aW9uLCBibG9jay0+bXNnX2lkLCBzc3RfZHJ2X2N0eC0+c3N0X3N0YXRlKTsKLQkJc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9IFNTVF9SRVNFVDsKLQotCQlyZXR2YWwgPSAtRUJVU1k7Ci0JfQotCXJldHVybiByZXR2YWw7Ci19Ci0KLS8qCi0gKiBzc3RfY3JlYXRlX2lwY19tc2cgLSBjcmVhdGUgYSBJUEMgbWVzc2FnZQotICoKLSAqIEBhcmc6IGlwYyBtZXNzYWdlCi0gKiBAbGFyZ2U6IGxhcmdlIG9yIHNob3J0IG1lc3NhZ2UKLSAqCi0gKiB0aGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBzdHJ1Y3R1cmVzIHRvIHNlbmQgYSBsYXJnZSBvciBzaG9ydAotICogbWVzc2FnZSB0byB0aGUgZmlybXdhcmUKLSAqLwotaW50IHNzdF9jcmVhdGVfaXBjX21zZyhzdHJ1Y3QgaXBjX3Bvc3QgKiphcmcsIGJvb2wgbGFyZ2UpCi17Ci0Jc3RydWN0IGlwY19wb3N0ICptc2c7Ci0KLQltc2cgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXBjX3Bvc3QpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuIC1FTk9NRU07Ci0JaWYgKGxhcmdlKSB7Ci0JCW1zZy0+bWFpbGJveF9kYXRhID0ga3phbGxvYyhTU1RfTUFJTEJPWF9TSVpFLCBHRlBfQVRPTUlDKTsKLQkJaWYgKCFtc2ctPm1haWxib3hfZGF0YSkgewotCQkJa2ZyZWUobXNnKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfSBlbHNlIHsKLQkJbXNnLT5tYWlsYm94X2RhdGEgPSBOVUxMOwotCX0KLQltc2ctPmlzX2xhcmdlID0gbGFyZ2U7Ci0JKmFyZyA9IG1zZzsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIHNzdF9jcmVhdGVfYmxvY2tfYW5kX2lwY19tc2cgLSBDcmVhdGVzIElQQyBtZXNzYWdlIGFuZCBzc3QgYmxvY2sKLSAqIEBhcmc6IHBhc3NlZCB0byBzc3RfY3JlYXRlX2lwY19tZXNzYWdlIEFQSQotICogQGxhcmdlOiBsYXJnZSBvciBzaG9ydCBtZXNzYWdlCi0gKiBAc3N0X2Rydl9jdHg6IHNzdCBkcml2ZXIgY29udGV4dAotICogQGJsb2NrOiByZXR1cm4gYmxvY2sgYWxsb2NhdGVkCi0gKiBAbXNnX2lkOiBJUEMKLSAqIEBkcnZfaWQ6IHN0cmVhbSBpZCBvciBwcml2YXRlIGlkCi0gKi8KLWludCBzc3RfY3JlYXRlX2Jsb2NrX2FuZF9pcGNfbXNnKHN0cnVjdCBpcGNfcG9zdCAqKmFyZywgYm9vbCBsYXJnZSwKLQkJc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBzdHJ1Y3Qgc3N0X2Jsb2NrICoqYmxvY2ssCi0JCXUzMiBtc2dfaWQsIHUzMiBkcnZfaWQpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0KLQlyZXR2YWwgPSBzc3RfY3JlYXRlX2lwY19tc2coYXJnLCBsYXJnZSk7Ci0JaWYgKHJldHZhbCkKLQkJcmV0dXJuIHJldHZhbDsKLQkqYmxvY2sgPSBzc3RfY3JlYXRlX2Jsb2NrKHNzdF9kcnZfY3R4LCBtc2dfaWQsIGRydl9pZCk7Ci0JaWYgKCpibG9jayA9PSBOVUxMKSB7Ci0JCWtmcmVlKCphcmcpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoKLSAqIHNzdF9jbGVhbl9zdHJlYW0gLSBjbGVhbiB0aGUgc3RyZWFtIGNvbnRleHQKLSAqCi0gKiBAc3RyZWFtOiBzdHJlYW0gc3RydWN0dXJlCi0gKgotICogdGhpcyBmdW5jdGlvbiByZXNldHMgdGhlIHN0cmVhbSBjb250ZXh0cwotICogc2hvdWxkIGJlIGNhbGxlZCBpbiBmcmVlCi0gKi8KLXZvaWQgc3N0X2NsZWFuX3N0cmVhbShzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cmVhbSkKLXsKLQlzdHJlYW0tPnN0YXR1cyA9IFNUUkVBTV9VTl9JTklUOwotCXN0cmVhbS0+cHJldiA9IFNUUkVBTV9VTl9JTklUOwotCW11dGV4X2xvY2soJnN0cmVhbS0+bG9jayk7Ci0Jc3RyZWFtLT5jdW1tX2J5dGVzID0gMDsKLQltdXRleF91bmxvY2soJnN0cmVhbS0+bG9jayk7Ci19Ci0KLWludCBzc3RfcHJlcGFyZV9hbmRfcG9zdF9tc2coc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdCwKLQkJaW50IHRhc2tfaWQsIGludCBpcGNfbXNnLCBpbnQgY21kX2lkLCBpbnQgcGlwZV9pZCwKLQkJc2l6ZV90IG1ib3hfZGF0YV9sZW4sIGNvbnN0IHZvaWQgKm1ib3hfZGF0YSwgdm9pZCAqKmRhdGEsCi0JCWJvb2wgbGFyZ2UsIGJvb2wgZmlsbF9kc3AsIGJvb2wgc3luYywgYm9vbCByZXNwb25zZSkKLXsKLQlzdHJ1Y3QgaXBjX3Bvc3QgKm1zZyA9IE5VTEw7Ci0Jc3RydWN0IGlwY19kc3BfaGRyIGRzcF9oZHI7Ci0Jc3RydWN0IHNzdF9ibG9jayAqYmxvY2s7Ci0JaW50IHJldCA9IDAsIHB2dF9pZDsKLQotCXB2dF9pZCA9IHNzdF9hc3NpZ25fcHZ0X2lkKHNzdCk7Ci0JaWYgKHB2dF9pZCA8IDApCi0JCXJldHVybiBwdnRfaWQ7Ci0KLQlpZiAocmVzcG9uc2UpCi0JCXJldCA9IHNzdF9jcmVhdGVfYmxvY2tfYW5kX2lwY19tc2coCi0JCQkJJm1zZywgbGFyZ2UsIHNzdCwgJmJsb2NrLCBpcGNfbXNnLCBwdnRfaWQpOwotCWVsc2UKLQkJcmV0ID0gc3N0X2NyZWF0ZV9pcGNfbXNnKCZtc2csIGxhcmdlKTsKLQotCWlmIChyZXQgPCAwKSB7Ci0JCXRlc3RfYW5kX2NsZWFyX2JpdChwdnRfaWQsICZzc3QtPnB2dF9pZCk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWRldl9kYmcoc3N0LT5kZXYsICJwdnRfaWQgPSAlZCwgcGlwZSBpZCA9ICVkLCB0YXNrID0gJWQgaXBjX21zZzogJWRcbiIsCi0JCSBwdnRfaWQsIHBpcGVfaWQsIHRhc2tfaWQsIGlwY19tc2cpOwotCXNzdF9maWxsX2hlYWRlcl9tcmZsZCgmbXNnLT5tcmZsZF9oZWFkZXIsIGlwY19tc2csCi0JCQkJCXRhc2tfaWQsIGxhcmdlLCBwdnRfaWQpOwotCW1zZy0+bXJmbGRfaGVhZGVyLnAuaGVhZGVyX2xvd19wYXlsb2FkID0gc2l6ZW9mKGRzcF9oZHIpICsgbWJveF9kYXRhX2xlbjsKLQltc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQucmVzX3JxZCA9ICFzeW5jOwotCWRldl9kYmcoc3N0LT5kZXYsICJoZWFkZXI6JXhcbiIsCi0JCQltc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9oaWdoLmZ1bGwpOwotCWRldl9kYmcoc3N0LT5kZXYsICJyZXNwb25zZSBycWQ6ICV4IiwKLQkJCW1zZy0+bXJmbGRfaGVhZGVyLnAuaGVhZGVyX2hpZ2gucGFydC5yZXNfcnFkKTsKLQlkZXZfZGJnKHNzdC0+ZGV2LCAibXNnLT5tcmZsZF9oZWFkZXIucC5oZWFkZXJfbG93X3BheWxvYWQ6JWQiLAotCQkJbXNnLT5tcmZsZF9oZWFkZXIucC5oZWFkZXJfbG93X3BheWxvYWQpOwotCWlmIChmaWxsX2RzcCkgewotCQlzc3RfZmlsbF9oZWFkZXJfZHNwKCZkc3BfaGRyLCBjbWRfaWQsIHBpcGVfaWQsIG1ib3hfZGF0YV9sZW4pOwotCQltZW1jcHkobXNnLT5tYWlsYm94X2RhdGEsICZkc3BfaGRyLCBzaXplb2YoZHNwX2hkcikpOwotCQlpZiAobWJveF9kYXRhX2xlbikgewotCQkJbWVtY3B5KG1zZy0+bWFpbGJveF9kYXRhICsgc2l6ZW9mKGRzcF9oZHIpLAotCQkJCQltYm94X2RhdGEsIG1ib3hfZGF0YV9sZW4pOwotCQl9Ci0JfQotCi0JaWYgKHN5bmMpCi0JCXNzdC0+b3BzLT5wb3N0X21lc3NhZ2Uoc3N0LCBtc2csIHRydWUpOwotCWVsc2UKLQkJc3N0X2FkZF90b19kaXNwYXRjaF9saXN0X2FuZF9wb3N0KHNzdCwgbXNnKTsKLQotCWlmIChyZXNwb25zZSkgewotCQlyZXQgPSBzc3Rfd2FpdF90aW1lb3V0KHNzdCwgYmxvY2spOwotCQlpZiAocmV0IDwgMCkgewotCQkJZ290byBvdXQ7Ci0JCX0gZWxzZSBpZihibG9jay0+ZGF0YSkgewotCQkJaWYgKCFkYXRhKQotCQkJCWdvdG8gb3V0OwotCQkJKmRhdGEgPSBremFsbG9jKGJsb2NrLT5zaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghKCpkYXRhKSkgewotCQkJCXJldCA9IC1FTk9NRU07Ci0JCQkJZ290byBvdXQ7Ci0JCQl9IGVsc2UKLQkJCQltZW1jcHkoZGF0YSwgKHZvaWQgKikgYmxvY2stPmRhdGEsIGJsb2NrLT5zaXplKTsKLQkJfQotCX0KLW91dDoKLQlpZiAocmVzcG9uc2UpCi0JCXNzdF9mcmVlX2Jsb2NrKHNzdCwgYmxvY2spOwotCXRlc3RfYW5kX2NsZWFyX2JpdChwdnRfaWQsICZzc3QtPnB2dF9pZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHNzdF9wbV9ydW50aW1lX3B1dChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2RydikKLXsKLQlpbnQgcmV0OwotCi0JcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeShzc3RfZHJ2LT5kZXYpOwotCXJldCA9IHBtX3J1bnRpbWVfcHV0X2F1dG9zdXNwZW5kKHNzdF9kcnYtPmRldik7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLXZvaWQgc3N0X2ZpbGxfaGVhZGVyX21yZmxkKHVuaW9uIGlwY19oZWFkZXJfbXJmbGQgKmhlYWRlciwKLQkJCQlpbnQgbXNnLCBpbnQgdGFza19pZCwgaW50IGxhcmdlLCBpbnQgZHJ2X2lkKQotewotCWhlYWRlci0+ZnVsbCA9IDA7Ci0JaGVhZGVyLT5wLmhlYWRlcl9oaWdoLnBhcnQubXNnX2lkID0gbXNnOwotCWhlYWRlci0+cC5oZWFkZXJfaGlnaC5wYXJ0LnRhc2tfaWQgPSB0YXNrX2lkOwotCWhlYWRlci0+cC5oZWFkZXJfaGlnaC5wYXJ0LmxhcmdlID0gbGFyZ2U7Ci0JaGVhZGVyLT5wLmhlYWRlcl9oaWdoLnBhcnQuZHJ2X2lkID0gZHJ2X2lkOwotCWhlYWRlci0+cC5oZWFkZXJfaGlnaC5wYXJ0LmRvbmUgPSAwOwotCWhlYWRlci0+cC5oZWFkZXJfaGlnaC5wYXJ0LmJ1c3kgPSAxOwotCWhlYWRlci0+cC5oZWFkZXJfaGlnaC5wYXJ0LnJlc19ycWQgPSAxOwotfQotCi12b2lkIHNzdF9maWxsX2hlYWRlcl9kc3Aoc3RydWN0IGlwY19kc3BfaGRyICpkc3AsIGludCBtc2csCi0JCQkJCWludCBwaXBlX2lkLCBpbnQgbGVuKQotewotCWRzcC0+Y21kX2lkID0gbXNnOwotCWRzcC0+bW9kX2luZGV4X2lkID0gMHhmZjsKLQlkc3AtPnBpcGVfaWQgPSBwaXBlX2lkOwotCWRzcC0+bGVuZ3RoID0gbGVuOwotCWRzcC0+bW9kX2lkID0gMDsKLX0KLQotI2RlZmluZSBTU1RfTUFYX0JMT0NLUyAxNQotLyoKLSAqIHNzdF9hc3NpZ25fcHZ0X2lkIC0gYXNzaWduIGEgcHZ0IGlkIGZvciBzdHJlYW0KLSAqCi0gKiBAc3N0X2Rydl9jdHggOiBkcml2ZXIgY29udGV4dAotICoKLSAqIHRoaXMgZnVuY3Rpb24gYXNzaWducyBhIHByaXZhdGUgaWQgZm9yIGNhbGxzIHRoYXQgZG9udCBoYXZlIHN0cmVhbQotICogY29udGV4dCB5ZXQsIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQKLSAqIHVzZXMgYml0cyBmb3IgdGhlIGlkLCBhbmQgZmluZHMgZmlyc3QgZnJlZSBiaXRzIGFuZCBhc3NpZ25zIHRoYXQKLSAqLwotaW50IHNzdF9hc3NpZ25fcHZ0X2lkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpkcnYpCi17Ci0JaW50IGxvY2FsOwotCi0Jc3Bpbl9sb2NrKCZkcnYtPmJsb2NrX2xvY2spOwotCS8qIGZpbmQgZmlyc3QgemVybyBpbmRleCBmcm9tIGxzYiAqLwotCWxvY2FsID0gZmZ6KGRydi0+cHZ0X2lkKTsKLQlkZXZfZGJnKGRydi0+ZGV2LCAicHZ0X2lkIGFzc2lnbmVkIC0tPiAlZFxuIiwgbG9jYWwpOwotCWlmIChsb2NhbCA+PSBTU1RfTUFYX0JMT0NLUyl7Ci0JCXNwaW5fdW5sb2NrKCZkcnYtPmJsb2NrX2xvY2spOwotCQlkZXZfZXJyKGRydi0+ZGV2LCAiUFZUIF9JRCBlcnJvcjogbm8gZnJlZSBpZCBibG9ja3MgIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQkvKiB0b2dnbGUgdGhlIGluZGV4ICovCi0JY2hhbmdlX2JpdChsb2NhbCwgJmRydi0+cHZ0X2lkKTsKLQlzcGluX3VubG9jaygmZHJ2LT5ibG9ja19sb2NrKTsKLQlyZXR1cm4gbG9jYWw7Ci19Ci0KLXZvaWQgc3N0X2luaXRfc3RyZWFtKHN0cnVjdCBzdHJlYW1faW5mbyAqc3RyZWFtLAotCQlpbnQgY29kZWMsIGludCBzc3RfaWQsIGludCBvcHMsIHU4IHNsb3QpCi17Ci0Jc3RyZWFtLT5zdGF0dXMgPSBTVFJFQU1fSU5JVDsKLQlzdHJlYW0tPnByZXYgPSBTVFJFQU1fVU5fSU5JVDsKLQlzdHJlYW0tPm9wcyA9IG9wczsKLX0KLQotaW50IHNzdF92YWxpZGF0ZV9zdHJpZCgKLQkJc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBpbnQgc3RyX2lkKQotewotCWlmIChzdHJfaWQgPD0gMCB8fCBzdHJfaWQgPiBzc3RfZHJ2X2N0eC0+aW5mby5tYXhfc3RyZWFtcykgewotCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsCi0JCQkiU1NUIEVSUjogaW52YWxpZCBzdHJlYW0gaWQgOiAlZCwgbWF4ICVkXG4iLAotCQkJc3RyX2lkLCBzc3RfZHJ2X2N0eC0+aW5mby5tYXhfc3RyZWFtcyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3Qgc3RyZWFtX2luZm8gKmdldF9zdHJlYW1faW5mbygKLQkJc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LCBpbnQgc3RyX2lkKQotewotCWlmIChzc3RfdmFsaWRhdGVfc3RyaWQoc3N0X2Rydl9jdHgsIHN0cl9pZCkpCi0JCXJldHVybiBOVUxMOwotCXJldHVybiAmc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXTsKLX0KLQotaW50IGdldF9zdHJlYW1faWRfbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAotCQl1MzIgcGlwZV9pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDE7IGkgPD0gc3N0X2Rydl9jdHgtPmluZm8ubWF4X3N0cmVhbXM7IGkrKykKLQkJaWYgKHBpcGVfaWQgPT0gc3N0X2Rydl9jdHgtPnN0cmVhbXNbaV0ucGlwZV9pZCkKLQkJCXJldHVybiBpOwotCi0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAibm8gc3VjaCBwaXBlX2lkKCV1KSIsIHBpcGVfaWQpOwotCXJldHVybiAtMTsKLX0KLQotdTMyIHJlbG9jYXRlX2ltcl9hZGRyX21yZmxkKHUzMiBiYXNlX2FkZHIpCi17Ci0JLyogR2V0IHRoZSBkaWZmZXJlbmNlIGZyb20gNTEyTUIgYWxpZ25lZCBiYXNlIGFkZHIgKi8KLQkvKiByZWxvY2F0ZSB0aGUgYmFzZSAqLwotCWJhc2VfYWRkciA9IE1SRkxEX0ZXX1ZJUlRVQUxfQkFTRSArIChiYXNlX2FkZHIgJSAoNTEyICogMTAyNCAqIDEwMjQpKTsKLQlyZXR1cm4gYmFzZV9hZGRyOwotfQotRVhQT1JUX1NZTUJPTF9HUEwocmVsb2NhdGVfaW1yX2FkZHJfbXJmbGQpOwotCi12b2lkIHNzdF9hZGRfdG9fZGlzcGF0Y2hfbGlzdF9hbmRfcG9zdChzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0LAotCQkJCQkJc3RydWN0IGlwY19wb3N0ICptc2cpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3N0LT5pcGNfc3Bpbl9sb2NrLCBpcnFfZmxhZ3MpOwotCWxpc3RfYWRkX3RhaWwoJm1zZy0+bm9kZSwgJnNzdC0+aXBjX2Rpc3BhdGNoX2xpc3QpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNzdC0+aXBjX3NwaW5fbG9jaywgaXJxX2ZsYWdzKTsKLQlzc3QtPm9wcy0+cG9zdF9tZXNzYWdlKHNzdCwgTlVMTCwgZmFsc2UpOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2ludGVsL3NzdC9zc3Rfc3RyZWFtLmMgYi9zb3VuZC9zb2MvaW50ZWwvc3N0L3NzdF9zdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlMmE0MS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvaW50ZWwvc3N0L3NzdF9zdHJlYW0uYworKysgL2Rldi9udWxsCkBAIC0xLDQzNyArMCwwIEBACi0vKgotICogIHNzdF9zdHJlYW0uYyAtIEludGVsIFNTVCBEcml2ZXIgZm9yIGF1ZGlvIGVuZ2luZQotICoKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMTQgSW50ZWwgQ29ycAotICogIEF1dGhvcnM6CVZpbm9kIEtvdWwgPHZpbm9kLmtvdWxAaW50ZWwuY29tPgotICoJCUhhcnNoYSBQcml5YSA8cHJpeWEuaGFyc2hhQGludGVsLmNvbT4KLSAqCQlEaGFyYWdlc3dhcmkgUiA8ZGhhcmFnZXN3YXJpLnJAaW50ZWwuY29tPgotICoJCUtQIEplZWphIDxqZWVqYS5rcEBpbnRlbC5jb20+Ci0gKiAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgotICovCi0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgotI2luY2x1ZGUgPHNvdW5kL2NvcmUuaD4KLSNpbmNsdWRlIDxzb3VuZC9wY20uaD4KLSNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KLSNpbmNsdWRlIDxzb3VuZC9jb21wcmVzc19kcml2ZXIuaD4KLSNpbmNsdWRlIDxhc20vcGxhdGZvcm1fc3N0X2F1ZGlvLmg+Ci0jaW5jbHVkZSAiLi4vc3N0LW1mbGQtcGxhdGZvcm0uaCIKLSNpbmNsdWRlICJzc3QuaCIKLSNpbmNsdWRlICIuLi9zc3QtZHNwLmgiCi0KLWludCBzc3RfYWxsb2Nfc3RyZWFtX21yZmxkKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgdm9pZCAqcGFyYW1zKQotewotCXN0cnVjdCBzbmRfc3N0X2FsbG9jX21yZmxkIGFsbG9jX3BhcmFtOwotCXN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqc3RyX3BhcmFtczsKLQlzdHJ1Y3Qgc25kX3NzdF90c3RhbXAgZndfdHN0YW1wOwotCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm87Ci0Jc3RydWN0IHNuZF9zc3RfYWxsb2NfcmVzcG9uc2UgKnJlc3BvbnNlOwotCXVuc2lnbmVkIGludCBzdHJfaWQsIHBpcGVfaWQsIHRhc2tfaWQ7Ci0JaW50IGksIG51bV9jaCwgcmV0ID0gMDsKLQl2b2lkICpkYXRhID0gTlVMTDsKLQotCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIkVudGVyXG4iKTsKLQlCVUdfT04oIXBhcmFtcyk7Ci0KLQlzdHJfcGFyYW1zID0gKHN0cnVjdCBzbmRfc3N0X3BhcmFtcyAqKXBhcmFtczsKLQltZW1zZXQoJmFsbG9jX3BhcmFtLCAwLCBzaXplb2YoYWxsb2NfcGFyYW0pKTsKLQlhbGxvY19wYXJhbS5vcGVyYXRpb24gPSBzdHJfcGFyYW1zLT5vcHM7Ci0JYWxsb2NfcGFyYW0uY29kZWNfdHlwZSA9IHN0cl9wYXJhbXMtPmNvZGVjOwotCWFsbG9jX3BhcmFtLnNnX2NvdW50ID0gc3RyX3BhcmFtcy0+YXBhcmFtcy5zZ19jb3VudDsKLQlhbGxvY19wYXJhbS5yaW5nX2J1Zl9pbmZvWzBdLmFkZHIgPQotCQlzdHJfcGFyYW1zLT5hcGFyYW1zLnJpbmdfYnVmX2luZm9bMF0uYWRkcjsKLQlhbGxvY19wYXJhbS5yaW5nX2J1Zl9pbmZvWzBdLnNpemUgPQotCQlzdHJfcGFyYW1zLT5hcGFyYW1zLnJpbmdfYnVmX2luZm9bMF0uc2l6ZTsKLQlhbGxvY19wYXJhbS5mcmFnX3NpemUgPSBzdHJfcGFyYW1zLT5hcGFyYW1zLmZyYWdfc2l6ZTsKLQotCW1lbWNweSgmYWxsb2NfcGFyYW0uY29kZWNfcGFyYW1zLCAmc3RyX3BhcmFtcy0+c3BhcmFtcywKLQkJCXNpemVvZihzdHJ1Y3Qgc25kX3NzdF9zdHJlYW1fcGFyYW1zKSk7Ci0KLQkvKgotCSAqIGZpbGwgY2hhbm5lbCBtYXAgcGFyYW1zIGZvciBtdWx0aWNoYW5uZWwgc3VwcG9ydC4KLQkgKiBJZGVhbGx5IGNoYW5uZWwgbWFwIHNob3VsZCBiZSByZWNlaXZlZCBmcm9tIHVwcGVyIGxheWVycwotCSAqIGZvciBtdWx0aWNoYW5uZWwgc3VwcG9ydC4KLQkgKiBDdXJyZW50bHkgaGFyZGNvZGluZyBhcyBwZXIgRlcgcmVxbS4KLQkgKi8KLQludW1fY2ggPSBzc3RfZ2V0X251bV9jaGFubmVsKHN0cl9wYXJhbXMpOwotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLQkJaWYgKGkgPCBudW1fY2gpCi0JCQlhbGxvY19wYXJhbS5jb2RlY19wYXJhbXMudWMucGNtX3BhcmFtcy5jaGFubmVsX21hcFtpXSA9IGk7Ci0JCWVsc2UKLQkJCWFsbG9jX3BhcmFtLmNvZGVjX3BhcmFtcy51Yy5wY21fcGFyYW1zLmNoYW5uZWxfbWFwW2ldID0gMHhGRjsKLQl9Ci0KLQlzdHJfaWQgPSBzdHJfcGFyYW1zLT5zdHJlYW1faWQ7Ci0Jc3RyX2luZm8gPSBnZXRfc3RyZWFtX2luZm8oc3N0X2Rydl9jdHgsIHN0cl9pZCk7Ci0JaWYgKHN0cl9pbmZvID09IE5VTEwpIHsKLQkJZGV2X2Vycihzc3RfZHJ2X2N0eC0+ZGV2LCAiZ2V0IHN0cmVhbSBpbmZvIHJldHVybmVkIG51bGxcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwaXBlX2lkID0gc3RyX3BhcmFtcy0+ZGV2aWNlX3R5cGU7Ci0JdGFza19pZCA9IHN0cl9wYXJhbXMtPnRhc2s7Ci0Jc3N0X2Rydl9jdHgtPnN0cmVhbXNbc3RyX2lkXS5waXBlX2lkID0gcGlwZV9pZDsKLQlzc3RfZHJ2X2N0eC0+c3RyZWFtc1tzdHJfaWRdLnRhc2tfaWQgPSB0YXNrX2lkOwotCXNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF0ubnVtX2NoID0gbnVtX2NoOwotCi0JaWYgKHNzdF9kcnZfY3R4LT5pbmZvLmxwZV92aWV3cHRfcnFkKQotCQlhbGxvY19wYXJhbS50cyA9IHNzdF9kcnZfY3R4LT5pbmZvLm1haWxib3hfc3RhcnQgKwotCQkJc3N0X2Rydl9jdHgtPnRzdGFtcCArIChzdHJfaWQgKiBzaXplb2YoZndfdHN0YW1wKSk7Ci0JZWxzZQotCQlhbGxvY19wYXJhbS50cyA9IHNzdF9kcnZfY3R4LT5tYWlsYm94X2FkZCArCi0JCQlzc3RfZHJ2X2N0eC0+dHN0YW1wICsgKHN0cl9pZCAqIHNpemVvZihmd190c3RhbXApKTsKLQotCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgImFsbG9jIHRzdGFtcCBsb2NhdGlvbiA9IDB4JXhcbiIsCi0JCQlhbGxvY19wYXJhbS50cyk7Ci0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiYXNzaWduZWQgcGlwZSBpZCAweCV4IHRvIHRhc2sgJWRcbiIsCi0JCQlwaXBlX2lkLCB0YXNrX2lkKTsKLQotCS8qIGFsbG9jYXRlIGRldmljZSB0eXBlIGNvbnRleHQgKi8KLQlzc3RfaW5pdF9zdHJlYW0oJnNzdF9kcnZfY3R4LT5zdHJlYW1zW3N0cl9pZF0sIGFsbG9jX3BhcmFtLmNvZGVjX3R5cGUsCi0JCQlzdHJfaWQsIGFsbG9jX3BhcmFtLm9wZXJhdGlvbiwgMCk7Ci0KLQlkZXZfaW5mbyhzc3RfZHJ2X2N0eC0+ZGV2LCAiQWxsb2MgZm9yIHN0ciAlZCBwaXBlICUjeFxuIiwKLQkJCXN0cl9pZCwgcGlwZV9pZCk7Ci0JcmV0ID0gc3N0X3ByZXBhcmVfYW5kX3Bvc3RfbXNnKHNzdF9kcnZfY3R4LCB0YXNrX2lkLCBJUENfQ01ELAotCQkJSVBDX0lBX0FMTE9DX1NUUkVBTV9NUkZMRCwgcGlwZV9pZCwgc2l6ZW9mKGFsbG9jX3BhcmFtKSwKLQkJCSZhbGxvY19wYXJhbSwgZGF0YSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCi0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycihzc3RfZHJ2X2N0eC0+ZGV2LCAiRlcgYWxsb2MgZmFpbGVkIHJldCAlZFxuIiwgcmV0KTsKLQkJLyogYWxsb2MgZmFpbGVkLCBzbyByZXNldCB0aGUgc3RhdGUgdG8gdW5pbml0ICovCi0JCXN0cl9pbmZvLT5zdGF0dXMgPSBTVFJFQU1fVU5fSU5JVDsKLQkJc3RyX2lkID0gcmV0OwotCX0gZWxzZSBpZiAoZGF0YSkgewotCQlyZXNwb25zZSA9IChzdHJ1Y3Qgc25kX3NzdF9hbGxvY19yZXNwb25zZSAqKWRhdGE7Ci0JCXJldCA9IHJlc3BvbnNlLT5zdHJfdHlwZS5yZXN1bHQ7Ci0JCWlmICghcmV0KQotCQkJZ290byBvdXQ7Ci0JCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwgIkZXIGFsbG9jIGZhaWxlZCByZXQgJWRcbiIsIHJldCk7Ci0JCWlmIChyZXQgPT0gU1NUX0VSUl9TVFJFQU1fSU5fVVNFKSB7Ci0JCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsCi0JCQkJIkZXIG5vdCBpbiBjbGVhbiBzdGF0ZSwgc2VuZCBmcmVlIGZvcjolZFxuIiwgc3RyX2lkKTsKLQkJCXNzdF9mcmVlX3N0cmVhbShzc3RfZHJ2X2N0eCwgc3RyX2lkKTsKLQkJfQotCQlzdHJfaWQgPSAtcmV0OwotCX0KLW91dDoKLQlrZnJlZShkYXRhKTsKLQlyZXR1cm4gc3RyX2lkOwotfQotCi0vKioKLSogc3N0X3N0YXJ0X3N0cmVhbSAtIFNlbmQgbXNnIGZvciBhIHN0YXJ0aW5nIHN0cmVhbQotKiBAc3RyX2lkOgkgc3RyZWFtIElECi0qCi0qIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFueSBmdW5jdGlvbiB3aGljaCB3YW50cyB0byBzdGFydAotKiBhIHN0cmVhbS4KLSovCi1pbnQgc3N0X3N0YXJ0X3N0cmVhbShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIGludCBzdHJfaWQpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0Jc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKLQl1MTYgZGF0YSA9IDA7Ci0KLQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJzc3Rfc3RhcnRfc3RyZWFtIGZvciAlZFxuIiwgc3RyX2lkKTsKLQlzdHJfaW5mbyA9IGdldF9zdHJlYW1faW5mbyhzc3RfZHJ2X2N0eCwgc3RyX2lkKTsKLQlpZiAoIXN0cl9pbmZvKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoc3RyX2luZm8tPnN0YXR1cyAhPSBTVFJFQU1fUlVOTklORykKLQkJcmV0dXJuIC1FQkFEUlFDOwotCi0JcmV0dmFsID0gc3N0X3ByZXBhcmVfYW5kX3Bvc3RfbXNnKHNzdF9kcnZfY3R4LCBzdHJfaW5mby0+dGFza19pZCwKLQkJCUlQQ19DTUQsIElQQ19JQV9TVEFSVF9TVFJFQU1fTVJGTEQsIHN0cl9pbmZvLT5waXBlX2lkLAotCQkJc2l6ZW9mKHUxNiksICZkYXRhLCBOVUxMLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSk7Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi1pbnQgc3N0X3NlbmRfYnl0ZV9zdHJlYW1fbXJmbGQoc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAotCQlzdHJ1Y3Qgc25kX3NzdF9ieXRlc192MiAqYnl0ZXMpCi17CXN0cnVjdCBpcGNfcG9zdCAqbXNnID0gTlVMTDsKLQl1MzIgbGVuZ3RoOwotCWludCBwdnRfaWQsIHJldCA9IDA7Ci0Jc3RydWN0IHNzdF9ibG9jayAqYmxvY2sgPSBOVUxMOwotCi0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LAotCQkidHlwZToldSBpcGNfbXNnOiV1IGJsb2NrOiV1IHRhc2tfaWQ6JXUgcGlwZTogJSN4IGxlbmd0aDolI3hcbiIsCi0JCWJ5dGVzLT50eXBlLCBieXRlcy0+aXBjX21zZywgYnl0ZXMtPmJsb2NrLCBieXRlcy0+dGFza19pZCwKLQkJYnl0ZXMtPnBpcGVfaWQsIGJ5dGVzLT5sZW4pOwotCi0JaWYgKHNzdF9jcmVhdGVfaXBjX21zZygmbXNnLCB0cnVlKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwdnRfaWQgPSBzc3RfYXNzaWduX3B2dF9pZChzc3RfZHJ2X2N0eCk7Ci0Jc3N0X2ZpbGxfaGVhZGVyX21yZmxkKCZtc2ctPm1yZmxkX2hlYWRlciwgYnl0ZXMtPmlwY19tc2csCi0JCQlieXRlcy0+dGFza19pZCwgMSwgcHZ0X2lkKTsKLQltc2ctPm1yZmxkX2hlYWRlci5wLmhlYWRlcl9oaWdoLnBhcnQucmVzX3JxZCA9IGJ5dGVzLT5ibG9jazsKLQlsZW5ndGggPSBieXRlcy0+bGVuOwotCW1zZy0+bXJmbGRfaGVhZGVyLnAuaGVhZGVyX2xvd19wYXlsb2FkID0gbGVuZ3RoOwotCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgImxlbmd0aCBpcyAlZFxuIiwgbGVuZ3RoKTsKLQltZW1jcHkobXNnLT5tYWlsYm94X2RhdGEsICZieXRlcy0+Ynl0ZXMsIGJ5dGVzLT5sZW4pOwotCWlmIChieXRlcy0+YmxvY2spIHsKLQkJYmxvY2sgPSBzc3RfY3JlYXRlX2Jsb2NrKHNzdF9kcnZfY3R4LCBieXRlcy0+aXBjX21zZywgcHZ0X2lkKTsKLQkJaWYgKGJsb2NrID09IE5VTEwpIHsKLQkJCWtmcmVlKG1zZyk7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQlzc3RfYWRkX3RvX2Rpc3BhdGNoX2xpc3RfYW5kX3Bvc3Qoc3N0X2Rydl9jdHgsIG1zZyk7Ci0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAibXNnLT5tcmZsZF9oZWFkZXIucC5oZWFkZXJfbG93X3BheWxvYWQ6JWQiLAotCQkJbXNnLT5tcmZsZF9oZWFkZXIucC5oZWFkZXJfbG93X3BheWxvYWQpOwotCi0JaWYgKGJ5dGVzLT5ibG9jaykgewotCQlyZXQgPSBzc3Rfd2FpdF90aW1lb3V0KHNzdF9kcnZfY3R4LCBibG9jayk7Ci0JCWlmIChyZXQpIHsKLQkJCWRldl9lcnIoc3N0X2Rydl9jdHgtPmRldiwgImZ3IHJldHVybmVkIGVyciAlZFxuIiwgcmV0KTsKLQkJCXNzdF9mcmVlX2Jsb2NrKHNzdF9kcnZfY3R4LCBibG9jayk7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQlpZiAoYnl0ZXMtPnR5cGUgPT0gU05EX1NTVF9CWVRFU19HRVQpIHsKLQkJLyoKLQkJICogY29weSB0aGUgcmVwbHkgYW5kIHNlbmQgYmFjawotCQkgKiB3ZSBuZWVkIHRvIHVwZGF0ZSBvbmx5IHN6IGFuZCBwYXlsb2FkCi0JCSAqLwotCQlpZiAoYnl0ZXMtPmJsb2NrKSB7Ci0JCQl1bnNpZ25lZCBjaGFyICpyID0gYmxvY2stPmRhdGE7Ci0KLQkJCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgInJlYWQgYmFjayAlZCBieXRlcyIsCi0JCQkJCWJ5dGVzLT5sZW4pOwotCQkJbWVtY3B5KGJ5dGVzLT5ieXRlcywgciwgYnl0ZXMtPmxlbik7Ci0JCX0KLQl9Ci0JaWYgKGJ5dGVzLT5ibG9jaykKLQkJc3N0X2ZyZWVfYmxvY2soc3N0X2Rydl9jdHgsIGJsb2NrKTsKLW91dDoKLQl0ZXN0X2FuZF9jbGVhcl9iaXQocHZ0X2lkLCAmc3N0X2Rydl9jdHgtPnB2dF9pZCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBzc3RfcGF1c2Vfc3RyZWFtIC0gU2VuZCBtc2cgZm9yIGEgcGF1c2luZyBzdHJlYW0KLSAqIEBzdHJfaWQ6CSBzdHJlYW0gSUQKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhbnkgZnVuY3Rpb24gd2hpY2ggd2FudHMgdG8gcGF1c2UKLSAqIGFuIGFscmVhZHkgcnVubmluZyBzdHJlYW0uCi0gKi8KLWludCBzc3RfcGF1c2Vfc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgaW50IHN0cl9pZCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvOwotCi0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiU1NUIERCRzpzc3RfcGF1c2Vfc3RyZWFtIGZvciAlZFxuIiwgc3RyX2lkKTsKLQlzdHJfaW5mbyA9IGdldF9zdHJlYW1faW5mbyhzc3RfZHJ2X2N0eCwgc3RyX2lkKTsKLQlpZiAoIXN0cl9pbmZvKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoc3RyX2luZm8tPnN0YXR1cyA9PSBTVFJFQU1fUEFVU0VEKQotCQlyZXR1cm4gMDsKLQlpZiAoc3RyX2luZm8tPnN0YXR1cyA9PSBTVFJFQU1fUlVOTklORyB8fAotCQlzdHJfaW5mby0+c3RhdHVzID09IFNUUkVBTV9JTklUKSB7Ci0JCWlmIChzdHJfaW5mby0+cHJldiA9PSBTVFJFQU1fVU5fSU5JVCkKLQkJCXJldHVybiAtRUJBRFJRQzsKLQotCQlyZXR2YWwgPSBzc3RfcHJlcGFyZV9hbmRfcG9zdF9tc2coc3N0X2Rydl9jdHgsIHN0cl9pbmZvLT50YXNrX2lkLCBJUENfQ01ELAotCQkJCUlQQ19JQV9QQVVTRV9TVFJFQU1fTVJGTEQsIHN0cl9pbmZvLT5waXBlX2lkLAotCQkJCTAsIE5VTEwsIE5VTEwsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQotCQlpZiAocmV0dmFsID09IDApIHsKLQkJCXN0cl9pbmZvLT5wcmV2ID0gc3RyX2luZm8tPnN0YXR1czsKLQkJCXN0cl9pbmZvLT5zdGF0dXMgPSBTVFJFQU1fUEFVU0VEOwotCQl9IGVsc2UgaWYgKHJldHZhbCA9PSBTU1RfRVJSX0lOVkFMSURfU1RSRUFNX0lEKSB7Ci0JCQlyZXR2YWwgPSAtRUlOVkFMOwotCQkJbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKLQkJCXNzdF9jbGVhbl9zdHJlYW0oc3RyX2luZm8pOwotCQkJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCQl9Ci0JfSBlbHNlIHsKLQkJcmV0dmFsID0gLUVCQURSUUM7Ci0JCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgIlNTVCBEQkc6QkFEUlFDIGZvciBzdHJlYW1cbiAiKTsKLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSAqIHNzdF9yZXN1bWVfc3RyZWFtIC0gU2VuZCBtc2cgZm9yIHJlc3VtaW5nIHN0cmVhbQotICogQHN0cl9pZDoJCXN0cmVhbSBJRAotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFueSBmdW5jdGlvbiB3aGljaCB3YW50cyB0byByZXN1bWUKLSAqIGFuIGFscmVhZHkgcGF1c2VkIHN0cmVhbS4KLSAqLwotaW50IHNzdF9yZXN1bWVfc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgaW50IHN0cl9pZCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvOwotCi0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiU1NUIERCRzpzc3RfcmVzdW1lX3N0cmVhbSBmb3IgJWRcbiIsIHN0cl9pZCk7Ci0Jc3RyX2luZm8gPSBnZXRfc3RyZWFtX2luZm8oc3N0X2Rydl9jdHgsIHN0cl9pZCk7Ci0JaWYgKCFzdHJfaW5mbykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHN0cl9pbmZvLT5zdGF0dXMgPT0gU1RSRUFNX1JVTk5JTkcpCi0JCQlyZXR1cm4gMDsKLQlpZiAoc3RyX2luZm8tPnN0YXR1cyA9PSBTVFJFQU1fUEFVU0VEKSB7Ci0JCXJldHZhbCA9IHNzdF9wcmVwYXJlX2FuZF9wb3N0X21zZyhzc3RfZHJ2X2N0eCwgc3RyX2luZm8tPnRhc2tfaWQsCi0JCQkJSVBDX0NNRCwgSVBDX0lBX1JFU1VNRV9TVFJFQU1fTVJGTEQsCi0JCQkJc3RyX2luZm8tPnBpcGVfaWQsIDAsIE5VTEwsIE5VTEwsCi0JCQkJdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCi0JCWlmICghcmV0dmFsKSB7Ci0JCQlpZiAoc3RyX2luZm8tPnByZXYgPT0gU1RSRUFNX1JVTk5JTkcpCi0JCQkJc3RyX2luZm8tPnN0YXR1cyA9IFNUUkVBTV9SVU5OSU5HOwotCQkJZWxzZQotCQkJCXN0cl9pbmZvLT5zdGF0dXMgPSBTVFJFQU1fSU5JVDsKLQkJCXN0cl9pbmZvLT5wcmV2ID0gU1RSRUFNX1BBVVNFRDsKLQkJfSBlbHNlIGlmIChyZXR2YWwgPT0gLVNTVF9FUlJfSU5WQUxJRF9TVFJFQU1fSUQpIHsKLQkJCXJldHZhbCA9IC1FSU5WQUw7Ci0JCQltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCQkJc3N0X2NsZWFuX3N0cmVhbShzdHJfaW5mbyk7Ci0JCQltdXRleF91bmxvY2soJnNzdF9kcnZfY3R4LT5zc3RfbG9jayk7Ci0JCX0KLQl9IGVsc2UgewotCQlyZXR2YWwgPSAtRUJBRFJRQzsKLQkJZGV2X2Vycihzc3RfZHJ2X2N0eC0+ZGV2LCAiU1NUIEVSUjogQkFEUVJDIGZvciBzdHJlYW1cbiIpOwotCX0KLQotCXJldHVybiByZXR2YWw7Ci19Ci0KLQotLyoqCi0gKiBzc3RfZHJvcF9zdHJlYW0gLSBTZW5kIG1zZyBmb3Igc3RvcHBpbmcgc3RyZWFtCi0gKiBAc3RyX2lkOgkJc3RyZWFtIElECi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgYW55IGZ1bmN0aW9uIHdoaWNoIHdhbnRzIHRvIHN0b3AKLSAqIGEgc3RyZWFtLgotICovCi1pbnQgc3N0X2Ryb3Bfc3RyZWFtKHN0cnVjdCBpbnRlbF9zc3RfZHJ2ICpzc3RfZHJ2X2N0eCwgaW50IHN0cl9pZCkKLXsKLQlpbnQgcmV0dmFsID0gMDsKLQlzdHJ1Y3Qgc3RyZWFtX2luZm8gKnN0cl9pbmZvOwotCi0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiU1NUIERCRzpzc3RfZHJvcF9zdHJlYW0gZm9yICVkXG4iLCBzdHJfaWQpOwotCXN0cl9pbmZvID0gZ2V0X3N0cmVhbV9pbmZvKHNzdF9kcnZfY3R4LCBzdHJfaWQpOwotCWlmICghc3RyX2luZm8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKHN0cl9pbmZvLT5zdGF0dXMgIT0gU1RSRUFNX1VOX0lOSVQpIHsKLQkJc3RyX2luZm8tPnByZXYgPSBTVFJFQU1fVU5fSU5JVDsKLQkJc3RyX2luZm8tPnN0YXR1cyA9IFNUUkVBTV9JTklUOwotCQlzdHJfaW5mby0+Y3VtbV9ieXRlcyA9IDA7Ci0JCXJldHZhbCA9IHNzdF9wcmVwYXJlX2FuZF9wb3N0X21zZyhzc3RfZHJ2X2N0eCwgc3RyX2luZm8tPnRhc2tfaWQsCi0JCQkJSVBDX0NNRCwgSVBDX0lBX0RST1BfU1RSRUFNX01SRkxELAotCQkJCXN0cl9pbmZvLT5waXBlX2lkLCAwLCBOVUxMLCBOVUxMLAotCQkJCXRydWUsIHRydWUsIHRydWUsIGZhbHNlKTsKLQl9IGVsc2UgewotCQlyZXR2YWwgPSAtRUJBRFJRQzsKLQkJZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiQkFEUVJDIGZvciBzdHJlYW0sIHN0YXRlICV4XG4iLAotCQkJCXN0cl9pbmZvLT5zdGF0dXMpOwotCX0KLQlyZXR1cm4gcmV0dmFsOwotfQotCi0vKioKLSogc3N0X2RyYWluX3N0cmVhbSAtIFNlbmQgbXNnIGZvciBkcmFpbmluZyBzdHJlYW0KLSogQHN0cl9pZDoJCXN0cmVhbSBJRAotKgotKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBhbnkgZnVuY3Rpb24gd2hpY2ggd2FudHMgdG8gZHJhaW4KLSogYSBzdHJlYW0uCi0qLwotaW50IHNzdF9kcmFpbl9zdHJlYW0oc3RydWN0IGludGVsX3NzdF9kcnYgKnNzdF9kcnZfY3R4LAotCQkJaW50IHN0cl9pZCwgYm9vbCBwYXJ0aWFsX2RyYWluKQotewotCWludCByZXR2YWwgPSAwOwotCXN0cnVjdCBzdHJlYW1faW5mbyAqc3RyX2luZm87Ci0KLQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJTU1QgREJHOnNzdF9kcmFpbl9zdHJlYW0gZm9yICVkXG4iLCBzdHJfaWQpOwotCXN0cl9pbmZvID0gZ2V0X3N0cmVhbV9pbmZvKHNzdF9kcnZfY3R4LCBzdHJfaWQpOwotCWlmICghc3RyX2luZm8pCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChzdHJfaW5mby0+c3RhdHVzICE9IFNUUkVBTV9SVU5OSU5HICYmCi0JCXN0cl9pbmZvLT5zdGF0dXMgIT0gU1RSRUFNX0lOSVQgJiYKLQkJc3RyX2luZm8tPnN0YXR1cyAhPSBTVFJFQU1fUEFVU0VEKSB7Ci0JCQlkZXZfZXJyKHNzdF9kcnZfY3R4LT5kZXYsICJTU1QgRVJSOiBCQURRUkMgZm9yIHN0cmVhbSA9ICVkXG4iLAotCQkJCSAgICAgICBzdHJfaW5mby0+c3RhdHVzKTsKLQkJCXJldHVybiAtRUJBRFJRQzsKLQl9Ci0KLQlyZXR2YWwgPSBzc3RfcHJlcGFyZV9hbmRfcG9zdF9tc2coc3N0X2Rydl9jdHgsIHN0cl9pbmZvLT50YXNrX2lkLCBJUENfQ01ELAotCQkJSVBDX0lBX0RSQUlOX1NUUkVBTV9NUkZMRCwgc3RyX2luZm8tPnBpcGVfaWQsCi0JCQlzaXplb2YodTgpLCAmcGFydGlhbF9kcmFpbiwgTlVMTCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLQkvKgotCSAqIHdpdGggbmV3IG5vbiBibG9ja2VkIGRyYWluIGltcGxlbWVudGF0aW9uIGluIGNvcmUgd2UgZG9udCBuZWVkIHRvCi0JICogd2FpdCBmb3IgcmVzcHNvbnNlLCBhbmQgbmVlZCB0byBvbmx5IGludm9rZSBjYWxsYmFjayBmb3IgZHJhaW4KLQkgKiBjb21wbGV0ZQotCSAqLwotCi0JcmV0dXJuIHJldHZhbDsKLX0KLQotLyoqCi0gKiBzc3RfZnJlZV9zdHJlYW0gLSBGcmVlcyBhIHN0cmVhbQotICogQHN0cl9pZDoJCXN0cmVhbSBJRAotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IGFueSBmdW5jdGlvbiB3aGljaCB3YW50cyB0byBmcmVlCi0gKiBhIHN0cmVhbS4KLSAqLwotaW50IHNzdF9mcmVlX3N0cmVhbShzdHJ1Y3QgaW50ZWxfc3N0X2RydiAqc3N0X2Rydl9jdHgsIGludCBzdHJfaWQpCi17Ci0JaW50IHJldHZhbCA9IDA7Ci0Jc3RydWN0IHN0cmVhbV9pbmZvICpzdHJfaW5mbzsKLQlzdHJ1Y3QgaW50ZWxfc3N0X29wcyAqb3BzOwotCi0JZGV2X2RiZyhzc3RfZHJ2X2N0eC0+ZGV2LCAiU1NUIERCRzpzc3RfZnJlZV9zdHJlYW0gZm9yICVkXG4iLCBzdHJfaWQpOwotCi0JbXV0ZXhfbG9jaygmc3N0X2Rydl9jdHgtPnNzdF9sb2NrKTsKLQlpZiAoc3N0X2Rydl9jdHgtPnNzdF9zdGF0ZSA9PSBTU1RfUkVTRVQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCXN0cl9pbmZvID0gZ2V0X3N0cmVhbV9pbmZvKHNzdF9kcnZfY3R4LCBzdHJfaWQpOwotCWlmICghc3RyX2luZm8pCi0JCXJldHVybiAtRUlOVkFMOwotCW9wcyA9IHNzdF9kcnZfY3R4LT5vcHM7Ci0KLQltdXRleF9sb2NrKCZzdHJfaW5mby0+bG9jayk7Ci0JaWYgKHN0cl9pbmZvLT5zdGF0dXMgIT0gU1RSRUFNX1VOX0lOSVQpIHsKLQkJc3RyX2luZm8tPnByZXYgPSAgc3RyX2luZm8tPnN0YXR1czsKLQkJc3RyX2luZm8tPnN0YXR1cyA9IFNUUkVBTV9VTl9JTklUOwotCQltdXRleF91bmxvY2soJnN0cl9pbmZvLT5sb2NrKTsKLQotCQlkZXZfaW5mbyhzc3RfZHJ2X2N0eC0+ZGV2LCAiRnJlZSBmb3Igc3RyICVkIHBpcGUgJSN4XG4iLAotCQkJCXN0cl9pZCwgc3RyX2luZm8tPnBpcGVfaWQpOwotCQlyZXR2YWwgPSBzc3RfcHJlcGFyZV9hbmRfcG9zdF9tc2coc3N0X2Rydl9jdHgsIHN0cl9pbmZvLT50YXNrX2lkLCBJUENfQ01ELAotCQkJCUlQQ19JQV9GUkVFX1NUUkVBTV9NUkZMRCwgc3RyX2luZm8tPnBpcGVfaWQsIDAsCi0JCQkJTlVMTCwgTlVMTCwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCi0JCWRldl9kYmcoc3N0X2Rydl9jdHgtPmRldiwgInNzdDogd2FpdCBmb3IgZnJlZSByZXR1cm5lZCAlZFxuIiwKLQkJCQlyZXR2YWwpOwotCQltdXRleF9sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCQlzc3RfY2xlYW5fc3RyZWFtKHN0cl9pbmZvKTsKLQkJbXV0ZXhfdW5sb2NrKCZzc3RfZHJ2X2N0eC0+c3N0X2xvY2spOwotCQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJTU1QgREJHOlN0cmVhbSBmcmVlZFxuIik7Ci0JfSBlbHNlIHsKLQkJbXV0ZXhfdW5sb2NrKCZzdHJfaW5mby0+bG9jayk7Ci0JCXJldHZhbCA9IC1FQkFEUlFDOwotCQlkZXZfZGJnKHNzdF9kcnZfY3R4LT5kZXYsICJTU1QgREJHOkJBRFFSQyBmb3Igc3RyZWFtXG4iKTsKLQl9Ci0KLQlyZXR1cm4gcmV0dmFsOwotfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2p6NDc0MC9qejQ3NDAtaTJzLmMgYi9zb3VuZC9zb2Mvano0NzQwL2p6NDc0MC1pMnMuYwppbmRleCAwN2Y3NzgxLi5iMDVmYjFjIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvano0NzQwL2p6NDc0MC1pMnMuYworKysgYi9zb3VuZC9zb2Mvano0NzQwL2p6NDc0MC1pMnMuYwpAQCAtNTgsNiArNTgsMTIgQEAKIAogI2RlZmluZSBKWl9BSUNfQ09ORl9GSUZPX1JYX1RIUkVTSE9MRF9PRkZTRVQgMTIKICNkZWZpbmUgSlpfQUlDX0NPTkZfRklGT19UWF9USFJFU0hPTERfT0ZGU0VUIDgKKyNkZWZpbmUgSlo0NzgwX0FJQ19DT05GX0ZJRk9fUlhfVEhSRVNIT0xEX09GRlNFVCAyNAorI2RlZmluZSBKWjQ3ODBfQUlDX0NPTkZfRklGT19UWF9USFJFU0hPTERfT0ZGU0VUIDE2CisjZGVmaW5lIEpaNDc4MF9BSUNfQ09ORl9GSUZPX1JYX1RIUkVTSE9MRF9NQVNLIFwKKwkJCSgweGYgPDwgSlo0NzgwX0FJQ19DT05GX0ZJRk9fUlhfVEhSRVNIT0xEX09GRlNFVCkKKyNkZWZpbmUgSlo0NzgwX0FJQ19DT05GX0ZJRk9fVFhfVEhSRVNIT0xEX01BU0sgXAorCQkJKDB4MWYgPDwgIEpaNDc4MF9BSUNfQ09ORl9GSUZPX1RYX1RIUkVTSE9MRF9PRkZTRVQpCiAKICNkZWZpbmUgSlpfQUlDX0NUUkxfT1VUUFVUX1NBTVBMRV9TSVpFX01BU0sgKDB4NyA8PCAxOSkKICNkZWZpbmUgSlpfQUlDX0NUUkxfSU5QVVRfU0FNUExFX1NJWkVfTUFTSyAoMHg3IDw8IDE2KQpAQCAtNzksNiArODUsNyBAQAogI2RlZmluZSBKWl9BSUNfQ1RSTF9JTlBVVF9TQU1QTEVfU0laRV9PRkZTRVQgIDE2CiAKICNkZWZpbmUgSlpfQUlDX0kyU19GTVRfRElTQUJMRV9CSVRfQ0xLIEJJVCgxMikKKyNkZWZpbmUgSlpfQUlDX0kyU19GTVRfRElTQUJMRV9CSVRfSUNMSyBCSVQoMTMpCiAjZGVmaW5lIEpaX0FJQ19JMlNfRk1UX0VOQUJMRV9TWVNfQ0xLIEJJVCg0KQogI2RlZmluZSBKWl9BSUNfSTJTX0ZNVF9NU0IgQklUKDApCiAKQEAgLTg3LDYgKzk0LDEzIEBACiAjZGVmaW5lIEpaX0FJQ19DTEtfRElWX01BU0sgMHhmCiAjZGVmaW5lIEkyU0RJVl9EVl9TSElGVCA4CiAjZGVmaW5lIEkyU0RJVl9EVl9NQVNLICgweGYgPDwgSTJTRElWX0RWX1NISUZUKQorI2RlZmluZSBJMlNESVZfSURWX1NISUZUIDgKKyNkZWZpbmUgSTJTRElWX0lEVl9NQVNLICgweGYgPDwgSTJTRElWX0lEVl9TSElGVCkKKworZW51bSBqejQ3eHhfaTJzX3ZlcnNpb24geworCUpaX0kyU19KWjQ3NDAsCisJSlpfSTJTX0paNDc4MCwKK307CiAKIHN0cnVjdCBqejQ3NDBfaTJzIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKQEAgLTk4LDYgKzExMiw4IEBACiAKIAlzdHJ1Y3Qgc25kX2RtYWVuZ2luZV9kYWlfZG1hX2RhdGEgcGxheWJhY2tfZG1hX2RhdGE7CiAJc3RydWN0IHNuZF9kbWFlbmdpbmVfZGFpX2RtYV9kYXRhIGNhcHR1cmVfZG1hX2RhdGE7CisKKwllbnVtIGp6NDd4eF9pMnNfdmVyc2lvbiB2ZXJzaW9uOwogfTsKIAogc3RhdGljIGlubGluZSB1aW50MzJfdCBqejQ3NDBfaTJzX3JlYWQoY29uc3Qgc3RydWN0IGp6NDc0MF9pMnMgKmkycywKQEAgLTI2NywxMyArMjgzLDIyIEBACiAJCQljdHJsIHw9IEpaX0FJQ19DVFJMX01PTk9fVE9fU1RFUkVPOwogCQllbHNlCiAJCQljdHJsICY9IH5KWl9BSUNfQ1RSTF9NT05PX1RPX1NURVJFTzsKKworCQlkaXZfcmVnICY9IH5JMlNESVZfRFZfTUFTSzsKKwkJZGl2X3JlZyB8PSAoZGl2IC0gMSkgPDwgSTJTRElWX0RWX1NISUZUOwogCX0gZWxzZSB7CiAJCWN0cmwgJj0gfkpaX0FJQ19DVFJMX0lOUFVUX1NBTVBMRV9TSVpFX01BU0s7CiAJCWN0cmwgfD0gc2FtcGxlX3NpemUgPDwgSlpfQUlDX0NUUkxfSU5QVVRfU0FNUExFX1NJWkVfT0ZGU0VUOworCisJCWlmIChpMnMtPnZlcnNpb24gPj0gSlpfSTJTX0paNDc4MCkgeworCQkJZGl2X3JlZyAmPSB+STJTRElWX0lEVl9NQVNLOworCQkJZGl2X3JlZyB8PSAoZGl2IC0gMSkgPDwgSTJTRElWX0lEVl9TSElGVDsKKwkJfSBlbHNlIHsKKwkJCWRpdl9yZWcgJj0gfkkyU0RJVl9EVl9NQVNLOworCQkJZGl2X3JlZyB8PSAoZGl2IC0gMSkgPDwgSTJTRElWX0RWX1NISUZUOworCQl9CiAJfQogCi0JZGl2X3JlZyAmPSB+STJTRElWX0RWX01BU0s7Ci0JZGl2X3JlZyB8PSAoZGl2IC0gMSkgPDwgSTJTRElWX0RWX1NISUZUOwogCWp6NDc0MF9pMnNfd3JpdGUoaTJzLCBKWl9SRUdfQUlDX0NUUkwsIGN0cmwpOwogCWp6NDc0MF9pMnNfd3JpdGUoaTJzLCBKWl9SRUdfQUlDX0NMS19ESVYsIGRpdl9yZWcpOwogCkBAIC0zNjksMTEgKzM5NCwxOSBAQAogCXNuZF9zb2NfZGFpX2luaXRfZG1hX2RhdGEoZGFpLCAmaTJzLT5wbGF5YmFja19kbWFfZGF0YSwKIAkJJmkycy0+Y2FwdHVyZV9kbWFfZGF0YSk7CiAKLQljb25mID0gKDcgPDwgSlpfQUlDX0NPTkZfRklGT19SWF9USFJFU0hPTERfT0ZGU0VUKSB8Ci0JCSg4IDw8IEpaX0FJQ19DT05GX0ZJRk9fVFhfVEhSRVNIT0xEX09GRlNFVCkgfAotCQlKWl9BSUNfQ09ORl9PVkVSRkxPV19QTEFZX0xBU1QgfAotCQlKWl9BSUNfQ09ORl9JMlMgfAotCQlKWl9BSUNfQ09ORl9JTlRFUk5BTF9DT0RFQzsKKwlpZiAoaTJzLT52ZXJzaW9uID49IEpaX0kyU19KWjQ3ODApIHsKKwkJY29uZiA9ICg3IDw8IEpaNDc4MF9BSUNfQ09ORl9GSUZPX1JYX1RIUkVTSE9MRF9PRkZTRVQpIHwKKwkJCSg4IDw8IEpaNDc4MF9BSUNfQ09ORl9GSUZPX1RYX1RIUkVTSE9MRF9PRkZTRVQpIHwKKwkJCUpaX0FJQ19DT05GX09WRVJGTE9XX1BMQVlfTEFTVCB8CisJCQlKWl9BSUNfQ09ORl9JMlMgfAorCQkJSlpfQUlDX0NPTkZfSU5URVJOQUxfQ09ERUM7CisJfSBlbHNlIHsKKwkJY29uZiA9ICg3IDw8IEpaX0FJQ19DT05GX0ZJRk9fUlhfVEhSRVNIT0xEX09GRlNFVCkgfAorCQkJKDggPDwgSlpfQUlDX0NPTkZfRklGT19UWF9USFJFU0hPTERfT0ZGU0VUKSB8CisJCQlKWl9BSUNfQ09ORl9PVkVSRkxPV19QTEFZX0xBU1QgfAorCQkJSlpfQUlDX0NPTkZfSTJTIHwKKwkJCUpaX0FJQ19DT05GX0lOVEVSTkFMX0NPREVDOworCX0KIAogCWp6NDc0MF9pMnNfd3JpdGUoaTJzLCBKWl9SRUdfQUlDX0NPTkYsIEpaX0FJQ19DT05GX1JFU0VUKTsKIAlqejQ3NDBfaTJzX3dyaXRlKGkycywgSlpfUkVHX0FJQ19DT05GLCBjb25mKTsKQEAgLTQyMiwxMyArNDU1LDM0IEBACiAJLnJlc3VtZSA9IGp6NDc0MF9pMnNfcmVzdW1lLAogfTsKIAorc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgano0NzgwX2kyc19kYWkgPSB7CisJLnByb2JlID0gano0NzQwX2kyc19kYWlfcHJvYmUsCisJLnJlbW92ZSA9IGp6NDc0MF9pMnNfZGFpX3JlbW92ZSwKKwkucGxheWJhY2sgPSB7CisJCS5jaGFubmVsc19taW4gPSAxLAorCQkuY2hhbm5lbHNfbWF4ID0gMiwKKwkJLnJhdGVzID0gU05EUlZfUENNX1JBVEVfODAwMF80ODAwMCwKKwkJLmZvcm1hdHMgPSBKWjQ3NDBfSTJTX0ZNVFMsCisJfSwKKwkuY2FwdHVyZSA9IHsKKwkJLmNoYW5uZWxzX21pbiA9IDIsCisJCS5jaGFubmVsc19tYXggPSAyLAorCQkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV84MDAwXzQ4MDAwLAorCQkuZm9ybWF0cyA9IEpaNDc0MF9JMlNfRk1UUywKKwl9LAorCS5vcHMgPSAmano0NzQwX2kyc19kYWlfb3BzLAorCS5zdXNwZW5kID0gano0NzQwX2kyc19zdXNwZW5kLAorCS5yZXN1bWUgPSBqejQ3NDBfaTJzX3Jlc3VtZSwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyIGp6NDc0MF9pMnNfY29tcG9uZW50ID0gewogCS5uYW1lCQk9ICJqejQ3NDAtaTJzIiwKIH07CiAKICNpZmRlZiBDT05GSUdfT0YKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGp6NDc0MF9vZl9tYXRjaGVzW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJpbmdlbmljLGp6NDc0MC1pMnMiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJpbmdlbmljLGp6NDc0MC1pMnMiLCAuZGF0YSA9ICh2b2lkICopSlpfSTJTX0paNDc0MCB9LAorCXsgLmNvbXBhdGlibGUgPSAiaW5nZW5pYyxqejQ3ODAtaTJzIiwgLmRhdGEgPSAodm9pZCAqKUpaX0kyU19KWjQ3ODAgfSwKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CiAjZW5kaWYKQEAgLTQzOCwxMSArNDkyLDE2IEBACiAJc3RydWN0IGp6NDc0MF9pMnMgKmkyczsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKIAlpbnQgcmV0OworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOwogCiAJaTJzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqaTJzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFpMnMpCiAJCXJldHVybiAtRU5PTUVNOwogCisJbWF0Y2ggPSBvZl9tYXRjaF9kZXZpY2Uoano0NzQwX29mX21hdGNoZXMsICZwZGV2LT5kZXYpOworCWlmIChtYXRjaCkKKwkJaTJzLT52ZXJzaW9uID0gKGVudW0gano0N3h4X2kyc192ZXJzaW9uKW1hdGNoLT5kYXRhOworCiAJbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpMnMtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgbWVtKTsKIAlpZiAoSVNfRVJSKGkycy0+YmFzZSkpCkBAIC00NjAsOCArNTE5LDEzIEBACiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpMnMpOwogCi0JcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAotCQkmano0NzQwX2kyc19jb21wb25lbnQsICZqejQ3NDBfaTJzX2RhaSwgMSk7CisJaWYgKGkycy0+dmVyc2lvbiA9PSBKWl9JMlNfSlo0NzgwKQorCQlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCisJCQkmano0NzQwX2kyc19jb21wb25lbnQsICZqejQ3ODBfaTJzX2RhaSwgMSk7CisJZWxzZQorCQlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KCZwZGV2LT5kZXYsCisJCQkmano0NzQwX2kyc19jb21wb25lbnQsICZqejQ3NDBfaTJzX2RhaSwgMSk7CisKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtaTJzLmMgYi9zb3VuZC9zb2Mva2lya3dvb2Qva2lya3dvb2QtaTJzLmMKaW5kZXggZDE5NDgzMC4uM2EzNmQ2MCAxMDA2NDQKLS0tIGEvc291bmQvc29jL2tpcmt3b29kL2tpcmt3b29kLWkycy5jCisrKyBiL3NvdW5kL3NvYy9raXJrd29vZC9raXJrd29vZC1pMnMuYwpAQCAtNjQzLDcgKzY0Myw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfT0YKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG12ZWJ1X2F1ZGlvX29mX21hdGNoW10gPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdmVidV9hdWRpb19vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAibWFydmVsbCxraXJrd29vZC1hdWRpbyIgfSwKIAl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsZG92ZS1hdWRpbyIgfSwKIAl7IC5jb21wYXRpYmxlID0gIm1hcnZlbGwsYXJtYWRhMzcwLWF1ZGlvIiB9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL251YzkwMC9udWM5MDAtYXVkaW8uaCBiL3NvdW5kL3NvYy9udWM5MDAvbnVjOTAwLWF1ZGlvLmgKaW5kZXggNTlmN2U4ZS4uZDBiNzI1NyAxMDA2NDQKLS0tIGEvc291bmQvc29jL251YzkwMC9udWM5MDAtYXVkaW8uaAorKysgYi9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1hdWRpby5oCkBAIC0xMDAsMTAgKzEwMCw3IEBACiBzdHJ1Y3QgbnVjOTAwX2F1ZGlvIHsKIAl2b2lkIF9faW9tZW0gKm1taW87CiAJc3BpbmxvY2tfdCBsb2NrOwotCWRtYV9hZGRyX3QgZG1hX2FkZHJbMl07Ci0JdW5zaWduZWQgbG9uZyBidWZmZXJzaXplWzJdOwogCXVuc2lnbmVkIGxvbmcgaXJxX251bTsKLQlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IGRldmljZSAqZGV2OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL251YzkwMC9udWM5MDAtcGNtLmMgYi9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1wY20uYwppbmRleCBiODA5ZmE5Li41YWU1Y2ExIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1wY20uYworKysgYi9zb3VuZC9zb2MvbnVjOTAwL251YzkwMC1wY20uYwpAQCAtNDIsMjkgKzQyLDEwIEBACiBzdGF0aWMgaW50IG51YzkwMF9kbWFfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAogCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQogewotCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7Ci0Jc3RydWN0IG51YzkwMF9hdWRpbyAqbnVjOTAwX2F1ZGlvID0gcnVudGltZS0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBzbmRfcGNtX2xpYl9tYWxsb2NfcGFnZXMoc3Vic3RyZWFtLCBwYXJhbXNfYnVmZmVyX2J5dGVzKHBhcmFtcykpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm51YzkwMF9hdWRpby0+bG9jaywgZmxhZ3MpOwotCi0JbnVjOTAwX2F1ZGlvLT5zdWJzdHJlYW0gPSBzdWJzdHJlYW07Ci0JbnVjOTAwX2F1ZGlvLT5kbWFfYWRkcltzdWJzdHJlYW0tPnN0cmVhbV0gPSBydW50aW1lLT5kbWFfYWRkcjsKLQludWM5MDBfYXVkaW8tPmJ1ZmZlcnNpemVbc3Vic3RyZWFtLT5zdHJlYW1dID0KLQkJCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMocGFyYW1zKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm51YzkwMF9hdWRpby0+bG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gc25kX3BjbV9saWJfbWFsbG9jX3BhZ2VzKHN1YnN0cmVhbSwgcGFyYW1zX2J1ZmZlcl9ieXRlcyhwYXJhbXMpKTsKIH0KIAotc3RhdGljIHZvaWQgbnVjOTAwX3VwZGF0ZV9kbWFfcmVnaXN0ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCi0JCQkJZG1hX2FkZHJfdCBkbWFfYWRkciwgc2l6ZV90IGNvdW50KQorc3RhdGljIHZvaWQgbnVjOTAwX3VwZGF0ZV9kbWFfcmVnaXN0ZXIoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCiB7CiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKIAlzdHJ1Y3QgbnVjOTAwX2F1ZGlvICpudWM5MDBfYXVkaW8gPSBydW50aW1lLT5wcml2YXRlX2RhdGE7CkBAIC03OCw4ICs1OSw4IEBACiAJCW1taW9fbGVuID0gbnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9SRFNUX0xFTkdUSDsKIAl9CiAKLQlBVURJT19XUklURShtbWlvX2FkZHIsIGRtYV9hZGRyKTsKLQlBVURJT19XUklURShtbWlvX2xlbiwgY291bnQpOworCUFVRElPX1dSSVRFKG1taW9fYWRkciwgcnVudGltZS0+ZG1hX2FkZHIpOworCUFVRElPX1dSSVRFKG1taW9fbGVuLCBydW50aW1lLT5kbWFfYnl0ZXMpOwogfQogCiBzdGF0aWMgdm9pZCBudWM5MDBfZG1hX3N0YXJ0KHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQpAQCAtMTcwLDkgKzE1MSw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbnVjOTAwX2F1ZGlvLT5sb2NrLCBmbGFncyk7CiAKLQludWM5MDBfdXBkYXRlX2RtYV9yZWdpc3RlcihzdWJzdHJlYW0sCi0JCQkJbnVjOTAwX2F1ZGlvLT5kbWFfYWRkcltzdWJzdHJlYW0tPnN0cmVhbV0sCi0JCQkJbnVjOTAwX2F1ZGlvLT5idWZmZXJzaXplW3N1YnN0cmVhbS0+c3RyZWFtXSk7CisJbnVjOTAwX3VwZGF0ZV9kbWFfcmVnaXN0ZXIoc3Vic3RyZWFtKTsKIAogCXZhbCA9IEFVRElPX1JFQUQobnVjOTAwX2F1ZGlvLT5tbWlvICsgQUNUTF9SRVNFVCk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcgYi9zb3VuZC9zb2Mvb21hcC9LY29uZmlnCmluZGV4IGEyY2QzNDguLjY3NjhlNGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL0tjb25maWcKKysrIGIvc291bmQvc29jL29tYXAvS2NvbmZpZwpAQCAtMTAwLDE3ICsxMDAsMTkgQEAKIAogY29uZmlnIFNORF9PTUFQX1NPQ19PTUFQX0FCRV9UV0w2MDQwCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBPTUFQIGJvYXJkcyB1c2luZyBBQkUgYW5kIHR3bDYwNDAgY29kZWMiCi0JZGVwZW5kcyBvbiBUV0w2MDQwX0NPUkUgJiYgU05EX09NQVBfU09DICYmIChBUkNIX09NQVA0IHx8IENPTVBJTEVfVEVTVCkKKwlkZXBlbmRzIG9uIFRXTDYwNDBfQ09SRSAmJiBTTkRfT01BUF9TT0MgJiYgKEFSQ0hfT01BUDQgfHwgU09DX09NQVA1IHx8IENPTVBJTEVfVEVTVCkKIAlzZWxlY3QgU05EX09NQVBfU09DX0RNSUMKIAlzZWxlY3QgU05EX09NQVBfU09DX01DUERNCiAJc2VsZWN0IFNORF9TT0NfVFdMNjA0MAogCXNlbGVjdCBTTkRfU09DX0RNSUMKKwlzZWxlY3QgQ09NTU9OX0NMS19QQUxNQVMgaWYgTUZEX1BBTE1BUwogCWhlbHAKIAkgIFNheSBZIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gT01BUCBib2FyZHMgdXNpbmcKIAkgIEFCRSBhbmQgdHdsNjA0MCBjb2RlYy4gVGhpcyBkcml2ZXIgY3VycmVudGx5IHN1cHBvcnRzOgogCSAgLSBTRFA0NDMwL0JsYXplIGJvYXJkcwogCSAgLSBQYW5kYUJvYXJkICg0NDMwKQogCSAgLSBQYW5kYUJvYXJkRVMgKDQ0NjApCisJICAtIG9tYXA1LXVldm0gKDU0MzIpCiAKIGNvbmZpZyBTTkRfT01BUF9TT0NfT01BUDNfUEFORE9SQQogCXRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgT01BUDMgUGFuZG9yYSIKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL2Ftcy1kZWx0YS5jIGIvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKaW5kZXggNzA2NjEzMC4uMTZjYzk1ZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKKysrIGIvc291bmQvc29jL29tYXAvYW1zLWRlbHRhLmMKQEAgLTQ3OSw4ICs0NzksOCBAQAogCiAJLyogQWRkIGhvb2sgc3dpdGNoIC0gY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgY29kZWMgZnJvbSB1c2Vyc3BhY2UKIAkgKiBldmVuIGlmIGxpbmUgZGlzY2lwbGluZSBmYWlscyAqLwotCXJldCA9IHNuZF9zb2NfamFja19uZXcocnRkLT5jb2RlYywgImhvb2tfc3dpdGNoIiwKLQkJCQlTTkRfSkFDS19IRUFEU0VULCAmYW1zX2RlbHRhX2hvb2tfc3dpdGNoKTsKKwlyZXQgPSBzbmRfc29jX2NhcmRfamFja19uZXcoY2FyZCwgImhvb2tfc3dpdGNoIiwgU05EX0pBQ0tfSEVBRFNFVCwKKwkJCQkgICAgJmFtc19kZWx0YV9ob29rX3N3aXRjaCwgTlVMTCwgMCk7CiAJaWYgKHJldCkKIAkJZGV2X3dhcm4oY2FyZC0+ZGV2LAogCQkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgcmVzb3VyY2VzIGZvciBob29rIHN3aXRjaCwgIgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL29tYXAvbjgxMC5jIGIvc291bmQvc29jL29tYXAvbjgxMC5jCmluZGV4IDVkN2Y5Y2UuLmRjYjUzMzYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL244MTAuYworKysgYi9zb3VuZC9zb2Mvb21hcC9uODEwLmMKQEAgLTk4LDEyICs5OCwxMSBAQAogewogCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CiAJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAKIAlzbmRfcGNtX2h3X2NvbnN0cmFpbnRfbWlubWF4KHJ1bnRpbWUsCiAJCQkJICAgICBTTkRSVl9QQ01fSFdfUEFSQU1fQ0hBTk5FTFMsIDIsIDIpOwogCi0JbjgxMF9leHRfY29udHJvbCgmY29kZWMtPmRhcG0pOworCW44MTBfZXh0X2NvbnRyb2woJnJ0ZC0+Y2FyZC0+ZGFwbSk7CiAJcmV0dXJuIGNsa19wcmVwYXJlX2VuYWJsZShzeXNfY2xrb3V0Mik7CiB9CiAKQEAgLTI1NSwyNCArMjU0LDYgQEAKIAkJICAgICBuODEwX2dldF9pbnB1dCwgbjgxMF9zZXRfaW5wdXQpLAogfTsKIAotc3RhdGljIGludCBuODEwX2FpYzMzX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKLXsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKLQotCS8qIE5vdCBjb25uZWN0ZWQgKi8KLQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNT05PX0xPVVQiKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJIUExDT00iKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJIUFJDT00iKTsKLQlzbmRfc29jX2RhcG1fbmNfcGluKGRhcG0sICJNSUMzTCIpOwotCXNuZF9zb2NfZGFwbV9uY19waW4oZGFwbSwgIk1JQzNSIik7Ci0Jc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTFSIik7Ci0Jc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTJMIik7Ci0Jc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElORTJSIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyogRGlnaXRhbCBhdWRpbyBpbnRlcmZhY2UgZ2x1ZSAtIGNvbm5lY3RzIGNvZGVjIDwtLT4gQ1BVICovCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgbjgxMF9kYWkgPSB7CiAJLm5hbWUgPSAiVExWMzIwQUlDMzMiLApAQCAtMjgzLDcgKzI2NCw2IEBACiAJLmNvZGVjX2RhaV9uYW1lID0gInRsdjMyMGFpYzN4LWhpZmkiLAogCS5kYWlfZm10ID0gU05EX1NPQ19EQUlGTVRfSTJTIHwgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAogCQkgICBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZNLAotCS5pbml0ID0gbjgxMF9haWMzM19pbml0LAogCS5vcHMgPSAmbjgxMF9vcHMsCiB9OwogCkBAIC0zMDAsNiArMjgwLDcgQEAKIAkubnVtX2RhcG1fd2lkZ2V0cyA9IEFSUkFZX1NJWkUoYWljMzNfZGFwbV93aWRnZXRzKSwKIAkuZGFwbV9yb3V0ZXMgPSBhdWRpb19tYXAsCiAJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKKwkuZnVsbHlfcm91dGVkID0gdHJ1ZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpuODEwX3NuZF9kZXZpY2U7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwLWFiZS10d2w2MDQwLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLWFiZS10d2w2MDQwLmMKaW5kZXggYjljNjVmMS4uMDg0M2E2OCAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcC1hYmUtdHdsNjA0MC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtYWJlLXR3bDYwNDAuYwpAQCAtMTgyLDE3ICsxODIsMTcgQEAKIAogCS8qIEhlYWRzZXQgamFjayBkZXRlY3Rpb24gb25seSBpZiBpdCBpcyBzdXBwb3J0ZWQgKi8KIAlpZiAocHJpdi0+amFja19kZXRlY3Rpb24pIHsKLQkJcmV0ID0gc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRzZXQgSmFjayIsCi0JCQkJCVNORF9KQUNLX0hFQURTRVQsICZoc19qYWNrKTsKKwkJcmV0ID0gc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRzZXQgSmFjayIsCisJCQkJCSAgICBTTkRfSkFDS19IRUFEU0VULCAmaHNfamFjaywKKwkJCQkJICAgIGhzX2phY2tfcGlucywKKwkJCQkJICAgIEFSUkFZX1NJWkUoaHNfamFja19waW5zKSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCi0JCXJldCA9IHNuZF9zb2NfamFja19hZGRfcGlucygmaHNfamFjaywgQVJSQVlfU0laRShoc19qYWNrX3BpbnMpLAotCQkJCQloc19qYWNrX3BpbnMpOwogCQl0d2w2MDQwX2hzX2phY2tfZGV0ZWN0KGNvZGVjLCAmaHNfamFjaywgU05EX0pBQ0tfSEVBRFNFVCk7CiAJfQogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fcm91dGUgZG1pY19hdWRpb19tYXBbXSA9IHsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL29tYXAtaGRtaS1hdWRpby5jIGIvc291bmQvc29jL29tYXAvb21hcC1oZG1pLWF1ZGlvLmMKaW5kZXggZjdlYjQyYS4uNDc3NWRhNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvb21hcC1oZG1pLWF1ZGlvLmMKKysrIGIvc291bmQvc29jL29tYXAvb21hcC1oZG1pLWF1ZGlvLmMKQEAgLTE0Miw4ICsxNDIsNiBAQAogCiAJaWVjLT5zdGF0dXNbMF0gfD0gSUVDOTU4X0FFUzBfQ09OX0VNUEhBU0lTX05PTkU7CiAKLQlpZWMtPnN0YXR1c1swXSB8PSBJRUM5NThfQUVTMV9QUk9fTU9ERV9OT1RJRDsKLQogCWllYy0+c3RhdHVzWzFdID0gSUVDOTU4X0FFUzFfQ09OX0dFTkVSQUw7CiAKIAlpZWMtPnN0YXR1c1syXSB8PSBJRUM5NThfQUVTMl9DT05fU09VUkNFX1VOU1BFQzsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9vbWFwL29tYXAtcGNtLmMgYi9zb3VuZC9zb2Mvb21hcC9vbWFwLXBjbS5jCmluZGV4IDEzNDNlY2IuLjZiYjYyM2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtcGNtLmMKKysrIGIvc291bmQvc29jL29tYXAvb21hcC1wY20uYwpAQCAtMzksNyArMzksNyBAQAogI2RlZmluZSBwY21fb21hcDE1MTAoKQkwCiAjZW5kaWYKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG9tYXBfcGNtX2hhcmR3YXJlID0geworc3RhdGljIHN0cnVjdCBzbmRfcGNtX2hhcmR3YXJlIG9tYXBfcGNtX2hhcmR3YXJlID0gewogCS5pbmZvCQkJPSBTTkRSVl9QQ01fSU5GT19NTUFQIHwKIAkJCQkgIFNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQgfAogCQkJCSAgU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfApAQCAtNTMsNiArNTMsMjQgQEAKIAkuYnVmZmVyX2J5dGVzX21heAk9IDEyOCAqIDEwMjQsCiB9OwogCisvKiBzRE1BIHN1cHBvcnRzIG9ubHkgMSwgMiwgYW5kIDQgYnl0ZSB0cmFuc2ZlciBlbGVtZW50cy4gKi8KK3N0YXRpYyB2b2lkIG9tYXBfcGNtX2xpbWl0X3N1cHBvcnRlZF9mb3JtYXRzKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU05EUlZfUENNX0ZPUk1BVF9MQVNUOyBpKyspIHsKKwkJc3dpdGNoIChzbmRfcGNtX2Zvcm1hdF9waHlzaWNhbF93aWR0aChpKSkgeworCQljYXNlIDg6CisJCWNhc2UgMTY6CisJCWNhc2UgMzI6CisJCQlvbWFwX3BjbV9oYXJkd2FyZS5mb3JtYXRzIHw9ICgxTEwgPDwgaSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorfQorCiAvKiB0aGlzIG1heSBnZXQgY2FsbGVkIHNldmVyYWwgdGltZXMgYnkgb3NzIGVtdWxhdGlvbiAqLwogc3RhdGljIGludCBvbWFwX3BjbV9od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCiAJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKQEAgLTIzNSw2ICsyNTMsNyBAQAogCiBpbnQgb21hcF9wY21fcGxhdGZvcm1fcmVnaXN0ZXIoc3RydWN0IGRldmljZSAqZGV2KQogeworCW9tYXBfcGNtX2xpbWl0X3N1cHBvcnRlZF9mb3JtYXRzKCk7CiAJcmV0dXJuIGRldm1fc25kX3NvY19yZWdpc3Rlcl9wbGF0Zm9ybShkZXYsICZvbWFwX3NvY19wbGF0Zm9ybSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX3BjbV9wbGF0Zm9ybV9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9vbWFwLXR3bDQwMzAuYyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtdHdsNDAzMC5jCmluZGV4IGZiMWY2YmIuLjM2NzNhZGEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9vbWFwL29tYXAtdHdsNDAzMC5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL29tYXAtdHdsNDAzMC5jCkBAIC0xNzAsMTQgKzE3MCwxMCBAQAogCWlmIChwcml2LT5qYWNrX2RldGVjdCA+IDApIHsKIAkJaHNfamFja19ncGlvc1swXS5ncGlvID0gcHJpdi0+amFja19kZXRlY3Q7CiAKLQkJcmV0ID0gc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRzZXQgSmFjayIsIFNORF9KQUNLX0hFQURTRVQsCi0JCQkJICAgICAgICZwcml2LT5oc19qYWNrKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJcmV0ID0gc25kX3NvY19qYWNrX2FkZF9waW5zKCZwcml2LT5oc19qYWNrLAotCQkJCQkgICAgQVJSQVlfU0laRShoc19qYWNrX3BpbnMpLAotCQkJCQkgICAgaHNfamFja19waW5zKTsKKwkJcmV0ID0gc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRzZXQgSmFjayIsCisJCQkJCSAgICBTTkRfSkFDS19IRUFEU0VULCAmcHJpdi0+aHNfamFjaywKKwkJCQkJICAgIGhzX2phY2tfcGlucywKKwkJCQkJICAgIEFSUkFZX1NJWkUoaHNfamFja19waW5zKSk7CiAJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvb21hcC9yeDUxLmMgYi9zb3VuZC9zb2Mvb21hcC9yeDUxLmMKaW5kZXggN2YyOTkzNS4uYzJkZGYwZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL29tYXAvcng1MS5jCisrKyBiL3NvdW5kL3NvYy9vbWFwL3J4NTEuYwpAQCAtMzExLDkgKzMxMSw5IEBACiAJfQogCiAJLyogQVYgamFjayBkZXRlY3Rpb24gKi8KLQllcnIgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiQVYgSmFjayIsCi0JCQkgICAgICAgU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX1ZJREVPT1VULAotCQkJICAgICAgICZyeDUxX2F2X2phY2spOworCWVyciA9IHNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJBViBKYWNrIiwKKwkJCQkgICAgU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX1ZJREVPT1VULAorCQkJCSAgICAmcng1MV9hdl9qYWNrLCBOVUxMLCAwKTsKIAlpZiAoZXJyKSB7CiAJCWRldl9lcnIoY2FyZC0+ZGV2LCAiRmFpbGVkIHRvIGFkZCBBViBKYWNrXG4iKTsKIAkJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvaHg0NzAwLmMgYi9zb3VuZC9zb2MvcHhhL2h4NDcwMC5jCmluZGV4IDczZWI1ZGQuLjlmOGJlN2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvaHg0NzAwLmMKKysrIGIvc291bmQvc29jL3B4YS9oeDQ3MDAuYwpAQCAtMTI2LDE3ICsxMjYsMTIgQEAKICAqLwogc3RhdGljIGludCBoeDQ3MDBfYWs0NjQxX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBydGQtPmNvZGVjOwogCWludCBlcnI7CiAKIAkvKiBKYWNrIGRldGVjdGlvbiBBUEkgc3R1ZmYgKi8KLQllcnIgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lIEphY2siLAotCQkJCVNORF9KQUNLX0hFQURQSE9ORSwgJmhzX2phY2spOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQllcnIgPSBzbmRfc29jX2phY2tfYWRkX3BpbnMoJmhzX2phY2ssIEFSUkFZX1NJWkUoaHNfamFja19waW4pLAotCQkJCQloc19qYWNrX3Bpbik7CisJZXJyID0gc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRwaG9uZSBKYWNrIiwKKwkJCQkgICAgU05EX0pBQ0tfSEVBRFBIT05FLCAmaHNfamFjaywgaHNfamFja19waW4sCisJCQkJICAgIEFSUkFZX1NJWkUoaHNfamFja19waW4pKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcHhhL3BhbG0yN3guYyBiL3NvdW5kL3NvYy9weGEvcGFsbTI3eC5jCmluZGV4IDkxMDMzNmMuLmMyMGJiYzAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvcGFsbTI3eC5jCisrKyBiL3NvdW5kL3NvYy9weGEvcGFsbTI3eC5jCkBAIC03NSwxNyArNzUsMTIgQEAKIAogc3RhdGljIGludCBwYWxtMjd4X2FjOTdfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAJaW50IGVycjsKIAogCS8qIEphY2sgZGV0ZWN0aW9uIEFQSSBzdHVmZiAqLwotCWVyciA9IHNuZF9zb2NfamFja19uZXcoY29kZWMsICJIZWFkcGhvbmUgSmFjayIsCi0JCQkJU05EX0pBQ0tfSEVBRFBIT05FLCAmaHNfamFjayk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IHNuZF9zb2NfamFja19hZGRfcGlucygmaHNfamFjaywgQVJSQVlfU0laRShoc19qYWNrX3BpbnMpLAotCQkJCWhzX2phY2tfcGlucyk7CisJZXJyID0gc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRwaG9uZSBKYWNrIiwKKwkJCQkgICAgU05EX0pBQ0tfSEVBRFBIT05FLCAmaHNfamFjaywgaHNfamFja19waW5zLAorCQkJCSAgICBBUlJBWV9TSVpFKGhzX2phY2tfcGlucykpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvdHRjLWRrYi5jIGIvc291bmQvc29jL3B4YS90dGMtZGtiLmMKaW5kZXggNTAwMWRiYi4uMTc1M2M3ZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3B4YS90dGMtZGtiLmMKKysrIGIvc291bmQvc29jL3B4YS90dGMtZGtiLmMKQEAgLTc4LDE1ICs3OCwxMiBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7CiAKIAkvKiBIZWFkc2V0IGphY2sgZGV0ZWN0aW9uICovCi0Jc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwgU05EX0pBQ0tfSEVBRFBIT05FCi0JCQl8IFNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEgfCBTTkRfSkFDS19CVE5fMiwKLQkJCSZoc19qYWNrKTsKLQlzbmRfc29jX2phY2tfYWRkX3BpbnMoJmhzX2phY2ssIEFSUkFZX1NJWkUoaHNfamFja19waW5zKSwKLQkJCSAgICAgIGhzX2phY2tfcGlucyk7Ci0Jc25kX3NvY19qYWNrX25ldyhjb2RlYywgIk1pY3JvcGhvbmUgSmFjayIsIFNORF9KQUNLX01JQ1JPUEhPTkUsCi0JCQkgJm1pY19qYWNrKTsKLQlzbmRfc29jX2phY2tfYWRkX3BpbnMoJm1pY19qYWNrLCBBUlJBWV9TSVpFKG1pY19qYWNrX3BpbnMpLAotCQkJICAgICAgbWljX2phY2tfcGlucyk7CisJc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRwaG9uZSBKYWNrIiwgU05EX0pBQ0tfSEVBRFBIT05FIHwKKwkJCSAgICAgIFNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEgfCBTTkRfSkFDS19CVE5fMiwKKwkJCSAgICAgICZoc19qYWNrLCBoc19qYWNrX3BpbnMsIEFSUkFZX1NJWkUoaHNfamFja19waW5zKSk7CisJc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIk1pY3JvcGhvbmUgSmFjayIsIFNORF9KQUNLX01JQ1JPUEhPTkUsCisJCQkgICAgICAmbWljX2phY2ssIG1pY19qYWNrX3BpbnMsCisJCQkgICAgICBBUlJBWV9TSVpFKG1pY19qYWNrX3BpbnMpKTsKIAogCS8qIGhlYWRwaG9uZSwgbWljcm9waG9uZSBkZXRlY3Rpb24gJiBoZWFkc2V0IHNob3J0IGRldGVjdGlvbiAqLwogCXBtODYweF9oc19qYWNrX2RldGVjdChjb2RlYywgJmhzX2phY2ssIFNORF9KQUNLX0hFQURQSE9ORSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvejIuYyBiL3NvdW5kL3NvYy9weGEvejIuYwppbmRleCA3NmNjYjE3Li5iY2JmYmU4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvcHhhL3oyLmMKKysrIGIvc291bmQvc29jL3B4YS96Mi5jCkBAIC0xNDMsMTMgKzE0Myw5IEBACiAJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNT05PMSIpOwogCiAJLyogSmFjayBkZXRlY3Rpb24gQVBJIHN0dWZmICovCi0JcmV0ID0gc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRzZXQgSmFjayIsIFNORF9KQUNLX0hFQURTRVQsCi0JCQkJJmhzX2phY2spOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyOwotCi0JcmV0ID0gc25kX3NvY19qYWNrX2FkZF9waW5zKCZoc19qYWNrLCBBUlJBWV9TSVpFKGhzX2phY2tfcGlucyksCi0JCQkJaHNfamFja19waW5zKTsKKwlyZXQgPSBzbmRfc29jX2NhcmRfamFja19uZXcocnRkLT5jYXJkLCAiSGVhZHNldCBKYWNrIiwgU05EX0pBQ0tfSEVBRFNFVCwKKwkJCQkgICAgJmhzX2phY2ssIGhzX2phY2tfcGlucywKKwkJCQkgICAgQVJSQVlfU0laRShoc19qYWNrX3BpbnMpKTsKIAlpZiAocmV0KQogCQlnb3RvIGVycjsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3Fjb20vS2NvbmZpZyBiL3NvdW5kL3NvYy9xY29tL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1OGU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9xY29tL0tjb25maWcKQEAgLTAsMCArMSwyNSBAQAorY29uZmlnIFNORF9TT0NfUUNPTQorCXRyaXN0YXRlICJBU29DIHN1cHBvcnQgZm9yIFFDT00gcGxhdGZvcm1zIgorCWhlbHAKKyAgICAgICAgICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IHRvIHVzZSBhdWRpbyBkZXZpY2VzCisgICAgICAgICAgaW4gUXVhbGNvbW0gVGVjaG5vbG9naWVzIFNPQy1iYXNlZCBwbGF0Zm9ybXMuCisKK2NvbmZpZyBTTkRfU09DX0xQQVNTX0NQVQorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBTTkRfU09DX1FDT00KKwlzZWxlY3QgUkVHTUFQX01NSU8KKworY29uZmlnIFNORF9TT0NfTFBBU1NfUExBVEZPUk0KKwl0cmlzdGF0ZQorCWRlcGVuZHMgb24gU05EX1NPQ19RQ09NCisJc2VsZWN0IFJFR01BUF9NTUlPCisKK2NvbmZpZyBTTkRfU09DX1NUT1JNCisJdHJpc3RhdGUgIkFTb0MgSTJTIHN1cHBvcnQgZm9yIFN0b3JtIGJvYXJkcyIKKwlkZXBlbmRzIG9uIChBUkNIX1FDT00gJiYgU05EX1NPQ19RQ09NKSB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgU05EX1NPQ19MUEFTU19DUFUKKwlzZWxlY3QgU05EX1NPQ19MUEFTU19QTEFURk9STQorCXNlbGVjdCBTTkRfU09DX01BWDk4MzU3QQorCWhlbHAKKyAgICAgICAgICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IGFkZCBzdXBwb3J0IGZvciBTb0MgYXVkaW8gb24gdGhlCisgICAgICAgICAgUXVhbGNvbW0gVGVjaG5vbG9naWVzIElQUTgwNlgtYmFzZWQgU3Rvcm0gYm9hcmQuCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcWNvbS9NYWtlZmlsZSBiL3NvdW5kL3NvYy9xY29tL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Y2U5NmMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcWNvbS9NYWtlZmlsZQpAQCAtMCwwICsxLDExIEBACisjIFBsYXRmb3JtCitzbmQtc29jLWxwYXNzLWNwdS1vYmpzIDo9IGxwYXNzLWNwdS5vCitzbmQtc29jLWxwYXNzLXBsYXRmb3JtLW9ianMgOj0gbHBhc3MtcGxhdGZvcm0ubworCitvYmotJChDT05GSUdfU05EX1NPQ19MUEFTU19DUFUpICs9IHNuZC1zb2MtbHBhc3MtY3B1Lm8KK29iai0kKENPTkZJR19TTkRfU09DX0xQQVNTX1BMQVRGT1JNKSArPSBzbmQtc29jLWxwYXNzLXBsYXRmb3JtLm8KKworIyBNYWNoaW5lCitzbmQtc29jLXN0b3JtLW9ianMgOj0gc3Rvcm0ubworCitvYmotJChDT05GSUdfU05EX1NPQ19TVE9STSkgKz0gc25kLXNvYy1zdG9ybS5vCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcWNvbS9scGFzcy1jcHUuYyBiL3NvdW5kL3NvYy9xY29tL2xwYXNzLWNwdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OThkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcWNvbS9scGFzcy1jcHUuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIGxwYXNzLWNwdS5jIC0tIEFMU0EgU29DIENQVSBEQUkgZHJpdmVyIGZvciBRVGkgTFBBU1MKKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2RfZGV2aWNldGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MtZGFpLmg+CisjaW5jbHVkZSAibHBhc3MtbHBhaWYtaXBxODA2eC5oIgorI2luY2x1ZGUgImxwYXNzLmgiCisKK3N0YXRpYyBpbnQgbHBhc3NfY3B1X2RhaW9wc19zZXRfc3lzY2xrKHN0cnVjdCBzbmRfc29jX2RhaSAqZGFpLCBpbnQgY2xrX2lkLAorCQl1bnNpZ25lZCBpbnQgZnJlcSwgaW50IGRpcikKK3sKKwlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJaW50IHJldDsKKworCXJldCA9IGNsa19zZXRfcmF0ZShkcnZkYXRhLT5taTJzX29zcl9jbGssIGZyZXEpOworCWlmIChyZXQpCisJCWRldl9lcnIoZGFpLT5kZXYsICIlcygpIGVycm9yIHNldHRpbmcgbWkycyBvc3JjbGsgdG8gJXU6ICVkXG4iLAorCQkJCV9fZnVuY19fLCBmcmVxLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBscGFzc19jcHVfZGFpb3BzX3N0YXJ0dXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBscGFzc19kYXRhICpkcnZkYXRhID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRydmRhdGEtPm1pMnNfb3NyX2Nsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXMoKSBlcnJvciBpbiBlbmFibGluZyBtaTJzIG9zciBjbGs6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkcnZkYXRhLT5taTJzX2JpdF9jbGspOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzKCkgZXJyb3IgaW4gZW5hYmxpbmcgbWkycyBiaXQgY2xrOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydmRhdGEtPm1pMnNfb3NyX2Nsayk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGxwYXNzX2NwdV9kYWlvcHNfc2h1dGRvd24oc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBscGFzc19kYXRhICpkcnZkYXRhID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKworCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnZkYXRhLT5taTJzX2JpdF9jbGspOworCWNsa19kaXNhYmxlX3VucHJlcGFyZShkcnZkYXRhLT5taTJzX29zcl9jbGspOworfQorCitzdGF0aWMgaW50IGxwYXNzX2NwdV9kYWlvcHNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywgc3RydWN0IHNuZF9zb2NfZGFpICpkYWkpCit7CisJc3RydWN0IGxwYXNzX2RhdGEgKmRydmRhdGEgPSBzbmRfc29jX2RhaV9nZXRfZHJ2ZGF0YShkYWkpOworCXNuZF9wY21fZm9ybWF0X3QgZm9ybWF0ID0gcGFyYW1zX2Zvcm1hdChwYXJhbXMpOworCXVuc2lnbmVkIGludCBjaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCXVuc2lnbmVkIGludCByYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKKwl1bnNpZ25lZCBpbnQgcmVndmFsOworCWludCBiaXR3aWR0aCwgcmV0OworCisJYml0d2lkdGggPSBzbmRfcGNtX2Zvcm1hdF93aWR0aChmb3JtYXQpOworCWlmIChiaXR3aWR0aCA8IDApIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzKCkgaW52YWxpZCBiaXQgd2lkdGggZ2l2ZW46ICVkXG4iLAorCQkJCV9fZnVuY19fLCBiaXR3aWR0aCk7CisJCXJldHVybiBiaXR3aWR0aDsKKwl9CisKKwlyZWd2YWwgPSBMUEFJRl9JMlNDVExfTE9PUEJBQ0tfRElTQUJMRSB8CisJCQlMUEFJRl9JMlNDVExfV1NTUkNfSU5URVJOQUw7CisKKwlzd2l0Y2ggKGJpdHdpZHRoKSB7CisJY2FzZSAxNjoKKwkJcmVndmFsIHw9IExQQUlGX0kyU0NUTF9CSVRXSURUSF8xNjsKKwkJYnJlYWs7CisJY2FzZSAyNDoKKwkJcmVndmFsIHw9IExQQUlGX0kyU0NUTF9CSVRXSURUSF8yNDsKKwkJYnJlYWs7CisJY2FzZSAzMjoKKwkJcmVndmFsIHw9IExQQUlGX0kyU0NUTF9CSVRXSURUSF8zMjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkYWktPmRldiwgIiVzKCkgaW52YWxpZCBiaXR3aWR0aCBnaXZlbjogJWRcbiIsCisJCQkJX19mdW5jX18sIGJpdHdpZHRoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3dpdGNoIChjaGFubmVscykgeworCWNhc2UgMToKKwkJcmVndmFsIHw9IExQQUlGX0kyU0NUTF9TUEtNT0RFX1NEMDsKKwkJcmVndmFsIHw9IExQQUlGX0kyU0NUTF9TUEtNT05PX01PTk87CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcmVndmFsIHw9IExQQUlGX0kyU0NUTF9TUEtNT0RFX1NEMDsKKwkJcmVndmFsIHw9IExQQUlGX0kyU0NUTF9TUEtNT05PX1NURVJFTzsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlyZWd2YWwgfD0gTFBBSUZfSTJTQ1RMX1NQS01PREVfUVVBRDAxOworCQlyZWd2YWwgfD0gTFBBSUZfSTJTQ1RMX1NQS01PTk9fU1RFUkVPOworCQlicmVhazsKKwljYXNlIDY6CisJCXJlZ3ZhbCB8PSBMUEFJRl9JMlNDVExfU1BLTU9ERV82Q0g7CisJCXJlZ3ZhbCB8PSBMUEFJRl9JMlNDVExfU1BLTU9OT19TVEVSRU87CisJCWJyZWFrOworCWNhc2UgODoKKwkJcmVndmFsIHw9IExQQUlGX0kyU0NUTF9TUEtNT0RFXzhDSDsKKwkJcmVndmFsIHw9IExQQUlGX0kyU0NUTF9TUEtNT05PX1NURVJFTzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkYWktPmRldiwgIiVzKCkgaW52YWxpZCBjaGFubmVscyBnaXZlbjogJXVcbiIsCisJCQkJX19mdW5jX18sIGNoYW5uZWxzKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gcmVnbWFwX3dyaXRlKGRydmRhdGEtPmxwYWlmX21hcCwKKwkJCUxQQUlGX0kyU0NUTF9SRUcoTFBBSUZfSTJTX1BPUlRfTUkyUyksIHJlZ3ZhbCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIGkyc2N0bCByZWc6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGNsa19zZXRfcmF0ZShkcnZkYXRhLT5taTJzX2JpdF9jbGssIHJhdGUgKiBiaXR3aWR0aCAqIDIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkYWktPmRldiwgIiVzKCkgZXJyb3Igc2V0dGluZyBtaTJzIGJpdGNsayB0byAldTogJWRcbiIsCisJCQkJX19mdW5jX18sIHJhdGUgKiBiaXR3aWR0aCAqIDIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbHBhc3NfY3B1X2RhaW9wc19od19mcmVlKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF93cml0ZShkcnZkYXRhLT5scGFpZl9tYXAsCisJCQlMUEFJRl9JMlNDVExfUkVHKExQQUlGX0kyU19QT1JUX01JMlMpLCAwKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIGkyc2N0bCByZWc6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBscGFzc19jcHVfZGFpb3BzX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpKQoreworCXN0cnVjdCBscGFzc19kYXRhICpkcnZkYXRhID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoZGFpKTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRydmRhdGEtPmxwYWlmX21hcCwKKwkJCUxQQUlGX0kyU0NUTF9SRUcoTFBBSUZfSTJTX1BPUlRfTUkyUyksCisJCQlMUEFJRl9JMlNDVExfU1BLRU5fTUFTSywgTFBBSUZfSTJTQ1RMX1NQS0VOX0VOQUJMRSk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkYWktPmRldiwgIiVzKCkgZXJyb3Igd3JpdGluZyB0byBpMnNjdGwgcmVnOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbHBhc3NfY3B1X2RhaW9wc190cmlnZ2VyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlpbnQgY21kLCBzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJaW50IHJldDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVEFSVDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1JFU1VNRToKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1JFTEVBU0U6CisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkcnZkYXRhLT5scGFpZl9tYXAsCisJCQkJTFBBSUZfSTJTQ1RMX1JFRyhMUEFJRl9JMlNfUE9SVF9NSTJTKSwKKwkJCQlMUEFJRl9JMlNDVExfU1BLRU5fTUFTSywKKwkJCQlMUEFJRl9JMlNDVExfU1BLRU5fRU5BQkxFKTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIoZGFpLT5kZXYsICIlcygpIGVycm9yIHdyaXRpbmcgdG8gaTJzY3RsIHJlZzogJWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUT1A6CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVVNQRU5EOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUFVTSDoKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRydmRhdGEtPmxwYWlmX21hcCwKKwkJCQlMUEFJRl9JMlNDVExfUkVHKExQQUlGX0kyU19QT1JUX01JMlMpLAorCQkJCUxQQUlGX0kyU0NUTF9TUEtFTl9NQVNLLAorCQkJCUxQQUlGX0kyU0NUTF9TUEtFTl9ESVNBQkxFKTsKKwkJaWYgKHJldCkKKwkJCWRldl9lcnIoZGFpLT5kZXYsICIlcygpIGVycm9yIHdyaXRpbmcgdG8gaTJzY3RsIHJlZzogJWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX29wcyBscGFzc19jcHVfZGFpX29wcyA9IHsKKwkuc2V0X3N5c2Nsawk9IGxwYXNzX2NwdV9kYWlvcHNfc2V0X3N5c2NsaywKKwkuc3RhcnR1cAk9IGxwYXNzX2NwdV9kYWlvcHNfc3RhcnR1cCwKKwkuc2h1dGRvd24JPSBscGFzc19jcHVfZGFpb3BzX3NodXRkb3duLAorCS5od19wYXJhbXMJPSBscGFzc19jcHVfZGFpb3BzX2h3X3BhcmFtcywKKwkuaHdfZnJlZQk9IGxwYXNzX2NwdV9kYWlvcHNfaHdfZnJlZSwKKwkucHJlcGFyZQk9IGxwYXNzX2NwdV9kYWlvcHNfcHJlcGFyZSwKKwkudHJpZ2dlcgk9IGxwYXNzX2NwdV9kYWlvcHNfdHJpZ2dlciwKK307CisKK3N0YXRpYyBpbnQgbHBhc3NfY3B1X2RhaV9wcm9iZShzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSkKK3sKKwlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9IHNuZF9zb2NfZGFpX2dldF9kcnZkYXRhKGRhaSk7CisJaW50IHJldDsKKworCS8qIGVuc3VyZSBhdWRpbyBoYXJkd2FyZSBpcyBkaXNhYmxlZCAqLworCXJldCA9IHJlZ21hcF93cml0ZShkcnZkYXRhLT5scGFpZl9tYXAsCisJCQlMUEFJRl9JMlNDVExfUkVHKExQQUlGX0kyU19QT1JUX01JMlMpLCAwKTsKKwlpZiAocmV0KQorCQlkZXZfZXJyKGRhaS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIGkyc2N0bCByZWc6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9kcml2ZXIgbHBhc3NfY3B1X2RhaV9kcml2ZXIgPSB7CisJLnBsYXliYWNrID0geworCQkuc3RyZWFtX25hbWUJPSAibHBhc3MtY3B1LXBsYXliYWNrIiwKKwkJLmZvcm1hdHMJPSBTTkRSVl9QQ01fRk1UQklUX1MxNiB8CisJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzI0IHwKKwkJCQkJU05EUlZfUENNX0ZNVEJJVF9TMzIsCisJCS5yYXRlcwkJPSBTTkRSVl9QQ01fUkFURV84MDAwIHwKKwkJCQkJU05EUlZfUENNX1JBVEVfMTYwMDAgfAorCQkJCQlTTkRSVl9QQ01fUkFURV8zMjAwMCB8CisJCQkJCVNORFJWX1BDTV9SQVRFXzQ4MDAwIHwKKwkJCQkJU05EUlZfUENNX1JBVEVfOTYwMDAsCisJCS5yYXRlX21pbgk9IDgwMDAsCisJCS5yYXRlX21heAk9IDk2MDAwLAorCQkuY2hhbm5lbHNfbWluCT0gMSwKKwkJLmNoYW5uZWxzX21heAk9IDgsCisJfSwKKwkucHJvYmUJPSAmbHBhc3NfY3B1X2RhaV9wcm9iZSwKKwkub3BzICAgID0gJmxwYXNzX2NwdV9kYWlfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudF9kcml2ZXIgbHBhc3NfY3B1X2NvbXBfZHJpdmVyID0geworCS5uYW1lID0gImxwYXNzLWNwdSIsCit9OworCitzdGF0aWMgYm9vbCBscGFzc19jcHVfcmVnbWFwX3dyaXRlYWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCByZWcpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTFBBSUZfSTJTX1BPUlRfTlVNOyArK2kpCisJCWlmIChyZWcgPT0gTFBBSUZfSTJTQ1RMX1JFRyhpKSkKKwkJCXJldHVybiB0cnVlOworCisJZm9yIChpID0gMDsgaSA8IExQQUlGX0lSUV9QT1JUX05VTTsgKytpKSB7CisJCWlmIChyZWcgPT0gTFBBSUZfSVJRRU5fUkVHKGkpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChyZWcgPT0gTFBBSUZfSVJRQ0xFQVJfUkVHKGkpKQorCQkJcmV0dXJuIHRydWU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IExQQUlGX1JETUFfQ0hBTl9OVU07ICsraSkgeworCQlpZiAocmVnID09IExQQUlGX1JETUFDVExfUkVHKGkpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChyZWcgPT0gTFBBSUZfUkRNQUJBU0VfUkVHKGkpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChyZWcgPT0gTFBBSUZfUkRNQUJVRkZfUkVHKGkpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChyZWcgPT0gTFBBSUZfUkRNQVBFUl9SRUcoaSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGxwYXNzX2NwdV9yZWdtYXBfcmVhZGFibGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IExQQUlGX0kyU19QT1JUX05VTTsgKytpKQorCQlpZiAocmVnID09IExQQUlGX0kyU0NUTF9SRUcoaSkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCWZvciAoaSA9IDA7IGkgPCBMUEFJRl9JUlFfUE9SVF9OVU07ICsraSkgeworCQlpZiAocmVnID09IExQQUlGX0lSUUVOX1JFRyhpKSkKKwkJCXJldHVybiB0cnVlOworCQlpZiAocmVnID09IExQQUlGX0lSUVNUQVRfUkVHKGkpKQorCQkJcmV0dXJuIHRydWU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IExQQUlGX1JETUFfQ0hBTl9OVU07ICsraSkgeworCQlpZiAocmVnID09IExQQUlGX1JETUFDVExfUkVHKGkpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChyZWcgPT0gTFBBSUZfUkRNQUJBU0VfUkVHKGkpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChyZWcgPT0gTFBBSUZfUkRNQUJVRkZfUkVHKGkpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChyZWcgPT0gTFBBSUZfUkRNQUNVUlJfUkVHKGkpKQorCQkJcmV0dXJuIHRydWU7CisJCWlmIChyZWcgPT0gTFBBSUZfUkRNQVBFUl9SRUcoaSkpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGxwYXNzX2NwdV9yZWdtYXBfdm9sYXRpbGUoc3RydWN0IGRldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcmVnKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IExQQUlGX0lSUV9QT1JUX05VTTsgKytpKQorCQlpZiAocmVnID09IExQQUlGX0lSUVNUQVRfUkVHKGkpKQorCQkJcmV0dXJuIHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgTFBBSUZfUkRNQV9DSEFOX05VTTsgKytpKQorCQlpZiAocmVnID09IExQQUlGX1JETUFDVVJSX1JFRyhpKSkKKwkJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJlZ21hcF9jb25maWcgbHBhc3NfY3B1X3JlZ21hcF9jb25maWcgPSB7CisJLnJlZ19iaXRzID0gMzIsCisJLnJlZ19zdHJpZGUgPSA0LAorCS52YWxfYml0cyA9IDMyLAorCS5tYXhfcmVnaXN0ZXIgPSBMUEFJRl9SRE1BUEVSX1JFRyhMUEFJRl9SRE1BX0NIQU5fTUFYKSwKKwkud3JpdGVhYmxlX3JlZyA9IGxwYXNzX2NwdV9yZWdtYXBfd3JpdGVhYmxlLAorCS5yZWFkYWJsZV9yZWcgPSBscGFzc19jcHVfcmVnbWFwX3JlYWRhYmxlLAorCS52b2xhdGlsZV9yZWcgPSBscGFzc19jcHVfcmVnbWFwX3ZvbGF0aWxlLAorCS5jYWNoZV90eXBlID0gUkVHQ0FDSEVfRkxBVCwKK307CisKK3N0YXRpYyBpbnQgbHBhc3NfY3B1X3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGxwYXNzX2RhdGEgKmRydmRhdGE7CisJc3RydWN0IGRldmljZV9ub2RlICpkc3Bfb2Zfbm9kZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgcmV0OworCisJZHNwX29mX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKHBkZXYtPmRldi5vZl9ub2RlLCAicWNvbSxhZHNwIiwgMCk7CisJaWYgKGRzcF9vZl9ub2RlKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzKCkgRFNQIGV4aXN0cyBhbmQgaG9sZHMgYXVkaW8gcmVzb3VyY2VzXG4iLAorCQkJCV9fZnVuY19fKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlkcnZkYXRhID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgbHBhc3NfZGF0YSksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIWRydmRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRydmRhdGEpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgImxwYXNzLWxwYWlmIik7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMoKSBlcnJvciBnZXR0aW5nIHJlc291cmNlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRydmRhdGEtPmxwYWlmID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUigodm9pZCBjb25zdCBfX2ZvcmNlICopZHJ2ZGF0YS0+bHBhaWYpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzKCkgZXJyb3IgbWFwcGluZyByZWcgcmVzb3VyY2U6ICVsZFxuIiwKKwkJCQlfX2Z1bmNfXywKKwkJCQlQVFJfRVJSKCh2b2lkIGNvbnN0IF9fZm9yY2UgKilkcnZkYXRhLT5scGFpZikpOworCQlyZXR1cm4gUFRSX0VSUigodm9pZCBjb25zdCBfX2ZvcmNlICopZHJ2ZGF0YS0+bHBhaWYpOworCX0KKworCWRydmRhdGEtPmxwYWlmX21hcCA9IGRldm1fcmVnbWFwX2luaXRfbW1pbygmcGRldi0+ZGV2LCBkcnZkYXRhLT5scGFpZiwKKwkJCSZscGFzc19jcHVfcmVnbWFwX2NvbmZpZyk7CisJaWYgKElTX0VSUihkcnZkYXRhLT5scGFpZl9tYXApKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzKCkgZXJyb3IgaW5pdGlhbGl6aW5nIHJlZ21hcDogJWxkXG4iLAorCQkJCV9fZnVuY19fLCBQVFJfRVJSKGRydmRhdGEtPmxwYWlmX21hcCkpOworCQlyZXR1cm4gUFRSX0VSUihkcnZkYXRhLT5scGFpZl9tYXApOworCX0KKworCWRydmRhdGEtPm1pMnNfb3NyX2NsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAibWkycy1vc3ItY2xrIik7CisJaWYgKElTX0VSUihkcnZkYXRhLT5taTJzX29zcl9jbGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzKCkgZXJyb3IgZ2V0dGluZyBtaTJzLW9zci1jbGs6ICVsZFxuIiwKKwkJCQlfX2Z1bmNfXywgUFRSX0VSUihkcnZkYXRhLT5taTJzX29zcl9jbGspKTsKKwkJcmV0dXJuIFBUUl9FUlIoZHJ2ZGF0YS0+bWkyc19vc3JfY2xrKTsKKwl9CisKKwlkcnZkYXRhLT5taTJzX2JpdF9jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgIm1pMnMtYml0LWNsayIpOworCWlmIChJU19FUlIoZHJ2ZGF0YS0+bWkyc19iaXRfY2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcygpIGVycm9yIGdldHRpbmcgbWkycy1iaXQtY2xrOiAlbGRcbiIsCisJCQkJX19mdW5jX18sIFBUUl9FUlIoZHJ2ZGF0YS0+bWkyc19iaXRfY2xrKSk7CisJCXJldHVybiBQVFJfRVJSKGRydmRhdGEtPm1pMnNfYml0X2Nsayk7CisJfQorCisJZHJ2ZGF0YS0+YWhiaXhfY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJhaGJpeC1jbGsiKTsKKwlpZiAoSVNfRVJSKGRydmRhdGEtPmFoYml4X2NsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiJXMoKSBlcnJvciBnZXR0aW5nIGFoYml4LWNsazogJWxkXG4iLAorCQkJCV9fZnVuY19fLCBQVFJfRVJSKGRydmRhdGEtPmFoYml4X2NsaykpOworCQlyZXR1cm4gUFRSX0VSUihkcnZkYXRhLT5haGJpeF9jbGspOworCX0KKworCXJldCA9IGNsa19zZXRfcmF0ZShkcnZkYXRhLT5haGJpeF9jbGssIExQQVNTX0FIQklYX0NMT0NLX0ZSRVFVRU5DWSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcygpIGVycm9yIHNldHRpbmcgcmF0ZSBvbiBhaGJpeF9jbGs6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlkZXZfZGJnKCZwZGV2LT5kZXYsICIlcygpIHNldCBhaGJpeF9jbGsgcmF0ZSB0byAlbHVcbiIsIF9fZnVuY19fLAorCQkJY2xrX2dldF9yYXRlKGRydmRhdGEtPmFoYml4X2NsaykpOworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRydmRhdGEtPmFoYml4X2Nsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcygpIGVycm9yIGVuYWJsaW5nIGFoYml4X2NsazogJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZGV2bV9zbmRfc29jX3JlZ2lzdGVyX2NvbXBvbmVudCgmcGRldi0+ZGV2LAorCQkJJmxwYXNzX2NwdV9jb21wX2RyaXZlciwgJmxwYXNzX2NwdV9kYWlfZHJpdmVyLCAxKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzKCkgZXJyb3IgcmVnaXN0ZXJpbmcgY3B1IGRyaXZlcjogJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX2NsazsKKwl9CisKKwlyZXQgPSBhc29jX3Fjb21fbHBhc3NfcGxhdGZvcm1fcmVnaXN0ZXIocGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcygpIGVycm9yIHJlZ2lzdGVyaW5nIHBsYXRmb3JtIGRyaXZlcjogJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX2NsazsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2NsazoKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZHJ2ZGF0YS0+YWhiaXhfY2xrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxwYXNzX2NwdV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRydmRhdGEtPmFoYml4X2Nsayk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbHBhc3NfY3B1X2RldmljZV9pZFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicWNvbSxscGFzcy1jcHUiIH0sCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBscGFzc19jcHVfZGV2aWNlX2lkKTsKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBscGFzc19jcHVfcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIJPSB7CisJCS5uYW1lCQk9ICJscGFzcy1jcHUiLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBvZl9tYXRjaF9wdHIobHBhc3NfY3B1X2RldmljZV9pZCksCisJfSwKKwkucHJvYmUJPSBscGFzc19jcHVfcGxhdGZvcm1fcHJvYmUsCisJLnJlbW92ZQk9IGxwYXNzX2NwdV9wbGF0Zm9ybV9yZW1vdmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihscGFzc19jcHVfcGxhdGZvcm1fZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJRVGkgTFBBU1MgQ1BVIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3Fjb20vbHBhc3MtbHBhaWYtaXBxODA2eC5oIGIvc291bmQvc29jL3Fjb20vbHBhc3MtbHBhaWYtaXBxODA2eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDIzYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2MvcWNvbS9scGFzcy1scGFpZi1pcHE4MDZ4LmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBscGFzcy1scGFpZi1pcHE4MDZ4LmggLS0gRGVmaW5pdGlvbnMgZm9yIHRoZSBRVGkgTFBBSUYgaW4gdGhlIGlwcTgwNnggTFBBU1MKKyAqLworCisjaWZuZGVmIF9fTFBBU1NfTFBBSUZfSF9fCisjZGVmaW5lIF9fTFBBU1NfTFBBSUZfSF9fCisKKyNkZWZpbmUgTFBBSUZfQkFOS19PRkZTRVQJCTB4MTAwMAorCisvKiBMUEFJRiBJMlMgKi8KKworI2RlZmluZSBMUEFJRl9JMlNDVExfUkVHX0JBU0UJCTB4MDAxMAorI2RlZmluZSBMUEFJRl9JMlNDVExfUkVHX1NUUklERQkJMHg0CisjZGVmaW5lIExQQUlGX0kyU0NUTF9SRUdfQUREUihhZGRyLCBwb3J0KSBcCisJKExQQUlGX0kyU0NUTF9SRUdfQkFTRSArIChhZGRyKSArIChMUEFJRl9JMlNDVExfUkVHX1NUUklERSAqIChwb3J0KSkpCisKK2VudW0gbHBhaWZfaTJzX3BvcnRzIHsKKwlMUEFJRl9JMlNfUE9SVF9NSU4JCT0gMCwKKworCUxQQUlGX0kyU19QT1JUX0NPREVDX1NQSwk9IDAsCisJTFBBSUZfSTJTX1BPUlRfQ09ERUNfTUlDCT0gMSwKKwlMUEFJRl9JMlNfUE9SVF9TRUNfU1BLCQk9IDIsCisJTFBBSUZfSTJTX1BPUlRfU0VDX01JQwkJPSAzLAorCUxQQUlGX0kyU19QT1JUX01JMlMJCT0gNCwKKworCUxQQUlGX0kyU19QT1JUX01BWAkJPSA0LAorCUxQQUlGX0kyU19QT1JUX05VTQkJPSA1LAorfTsKKworI2RlZmluZSBMUEFJRl9JMlNDVExfUkVHKHBvcnQpCQlMUEFJRl9JMlNDVExfUkVHX0FERFIoMHgwLCAocG9ydCkpCisKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX0xPT1BCQUNLX01BU0sJMHg4MDAwCisjZGVmaW5lIExQQUlGX0kyU0NUTF9MT09QQkFDS19TSElGVAkxNQorI2RlZmluZSBMUEFJRl9JMlNDVExfTE9PUEJBQ0tfRElTQUJMRQkoMCA8PCBMUEFJRl9JMlNDVExfTE9PUEJBQ0tfU0hJRlQpCisjZGVmaW5lIExQQUlGX0kyU0NUTF9MT09QQkFDS19FTkFCTEUJKDEgPDwgTFBBSUZfSTJTQ1RMX0xPT1BCQUNLX1NISUZUKQorCisjZGVmaW5lIExQQUlGX0kyU0NUTF9TUEtFTl9NQVNLCQkweDQwMDAKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX1NQS0VOX1NISUZUCTE0CisjZGVmaW5lIExQQUlGX0kyU0NUTF9TUEtFTl9ESVNBQkxFCSgwIDw8IExQQUlGX0kyU0NUTF9TUEtFTl9TSElGVCkKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX1NQS0VOX0VOQUJMRQkoMSA8PCBMUEFJRl9JMlNDVExfU1BLRU5fU0hJRlQpCisKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX1NQS01PREVfTUFTSwkweDNDMDAKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX1NQS01PREVfU0hJRlQJMTAKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX1NQS01PREVfTk9ORQkoMCA8PCBMUEFJRl9JMlNDVExfU1BLTU9ERV9TSElGVCkKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX1NQS01PREVfU0QwCSgxIDw8IExQQUlGX0kyU0NUTF9TUEtNT0RFX1NISUZUKQorI2RlZmluZSBMUEFJRl9JMlNDVExfU1BLTU9ERV9TRDEJKDIgPDwgTFBBSUZfSTJTQ1RMX1NQS01PREVfU0hJRlQpCisjZGVmaW5lIExQQUlGX0kyU0NUTF9TUEtNT0RFX1NEMgkoMyA8PCBMUEFJRl9JMlNDVExfU1BLTU9ERV9TSElGVCkKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX1NQS01PREVfU0QzCSg0IDw8IExQQUlGX0kyU0NUTF9TUEtNT0RFX1NISUZUKQorI2RlZmluZSBMUEFJRl9JMlNDVExfU1BLTU9ERV9RVUFEMDEJKDUgPDwgTFBBSUZfSTJTQ1RMX1NQS01PREVfU0hJRlQpCisjZGVmaW5lIExQQUlGX0kyU0NUTF9TUEtNT0RFX1FVQUQyMwkoNiA8PCBMUEFJRl9JMlNDVExfU1BLTU9ERV9TSElGVCkKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX1NQS01PREVfNkNICSg3IDw8IExQQUlGX0kyU0NUTF9TUEtNT0RFX1NISUZUKQorI2RlZmluZSBMUEFJRl9JMlNDVExfU1BLTU9ERV84Q0gJKDggPDwgTFBBSUZfSTJTQ1RMX1NQS01PREVfU0hJRlQpCisKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX1NQS01PTk9fTUFTSwkweDAyMDAKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX1NQS01PTk9fU0hJRlQJOQorI2RlZmluZSBMUEFJRl9JMlNDVExfU1BLTU9OT19TVEVSRU8JKDAgPDwgTFBBSUZfSTJTQ1RMX1NQS01PTk9fU0hJRlQpCisjZGVmaW5lIExQQUlGX0kyU0NUTF9TUEtNT05PX01PTk8JKDEgPDwgTFBBSUZfSTJTQ1RMX1NQS01PTk9fU0hJRlQpCisKKyNkZWZpbmUgTFBBSUZfSTJTQ1RMX1dTU1JDX01BU0sJCTB4MDAwNAorI2RlZmluZSBMUEFJRl9JMlNDVExfV1NTUkNfU0hJRlQJMgorI2RlZmluZSBMUEFJRl9JMlNDVExfV1NTUkNfSU5URVJOQUwJKDAgPDwgTFBBSUZfSTJTQ1RMX1dTU1JDX1NISUZUKQorI2RlZmluZSBMUEFJRl9JMlNDVExfV1NTUkNfRVhURVJOQUwJKDEgPDwgTFBBSUZfSTJTQ1RMX1dTU1JDX1NISUZUKQorCisjZGVmaW5lIExQQUlGX0kyU0NUTF9CSVRXSURUSF9NQVNLCTB4MDAwMworI2RlZmluZSBMUEFJRl9JMlNDVExfQklUV0lEVEhfU0hJRlQJMAorI2RlZmluZSBMUEFJRl9JMlNDVExfQklUV0lEVEhfMTYJKDAgPDwgTFBBSUZfSTJTQ1RMX0JJVFdJRFRIX1NISUZUKQorI2RlZmluZSBMUEFJRl9JMlNDVExfQklUV0lEVEhfMjQJKDEgPDwgTFBBSUZfSTJTQ1RMX0JJVFdJRFRIX1NISUZUKQorI2RlZmluZSBMUEFJRl9JMlNDVExfQklUV0lEVEhfMzIJKDIgPDwgTFBBSUZfSTJTQ1RMX0JJVFdJRFRIX1NISUZUKQorCisvKiBMUEFJRiBJUlEgKi8KKworI2RlZmluZSBMUEFJRl9JUlFfUkVHX0JBU0UJCTB4MzAwMAorI2RlZmluZSBMUEFJRl9JUlFfUkVHX1NUUklERQkJMHgxMDAwCisjZGVmaW5lIExQQUlGX0lSUV9SRUdfQUREUihhZGRyLCBwb3J0KSBcCisJKExQQUlGX0lSUV9SRUdfQkFTRSArIChhZGRyKSArIChMUEFJRl9JUlFfUkVHX1NUUklERSAqIChwb3J0KSkpCisKK2VudW0gbHBhaWZfaXJxX3BvcnRzIHsKKwlMUEFJRl9JUlFfUE9SVF9NSU4JCT0gMCwKKworCUxQQUlGX0lSUV9QT1JUX0hPU1QJCT0gMCwKKwlMUEFJRl9JUlFfUE9SVF9BRFNQCQk9IDEsCisKKwlMUEFJRl9JUlFfUE9SVF9NQVgJCT0gMiwKKwlMUEFJRl9JUlFfUE9SVF9OVU0JCT0gMywKK307CisKKyNkZWZpbmUgTFBBSUZfSVJRRU5fUkVHKHBvcnQpCQlMUEFJRl9JUlFfUkVHX0FERFIoMHgwLCAocG9ydCkpCisjZGVmaW5lIExQQUlGX0lSUVNUQVRfUkVHKHBvcnQpCQlMUEFJRl9JUlFfUkVHX0FERFIoMHg0LCAocG9ydCkpCisjZGVmaW5lIExQQUlGX0lSUUNMRUFSX1JFRyhwb3J0KQlMUEFJRl9JUlFfUkVHX0FERFIoMHhDLCAocG9ydCkpCisKKyNkZWZpbmUgTFBBSUZfSVJRX0JJVFNUUklERQkJMworI2RlZmluZSBMUEFJRl9JUlFfUEVSKGNoYW4pCQkoMSA8PCAoTFBBSUZfSVJRX0JJVFNUUklERSAqIChjaGFuKSkpCisjZGVmaW5lIExQQUlGX0lSUV9YUlVOKGNoYW4pCQkoMiA8PCAoTFBBSUZfSVJRX0JJVFNUUklERSAqIChjaGFuKSkpCisjZGVmaW5lIExQQUlGX0lSUV9FUlIoY2hhbikJCSg0IDw8IChMUEFJRl9JUlFfQklUU1RSSURFICogKGNoYW4pKSkKKyNkZWZpbmUgTFBBSUZfSVJRX0FMTChjaGFuKQkJKDcgPDwgKExQQUlGX0lSUV9CSVRTVFJJREUgKiAoY2hhbikpKQorCisvKiBMUEFJRiBETUEgKi8KKworI2RlZmluZSBMUEFJRl9SRE1BX1JFR19CQVNFCQkweDYwMDAKKyNkZWZpbmUgTFBBSUZfUkRNQV9SRUdfU1RSSURFCQkweDEwMDAKKyNkZWZpbmUgTFBBSUZfUkRNQV9SRUdfQUREUihhZGRyLCBjaGFuKSBcCisJKExQQUlGX1JETUFfUkVHX0JBU0UgKyAoYWRkcikgKyAoTFBBSUZfUkRNQV9SRUdfU1RSSURFICogKGNoYW4pKSkKKworZW51bSBscGFpZl9kbWFfY2hhbm5lbHMgeworCUxQQUlGX1JETUFfQ0hBTl9NSU4JCT0gMCwKKworCUxQQUlGX1JETUFfQ0hBTl9NSTJTCQk9IDAsCisJTFBBSUZfUkRNQV9DSEFOX1BDTTAJCT0gMSwKKwlMUEFJRl9SRE1BX0NIQU5fUENNMQkJPSAyLAorCisJTFBBSUZfUkRNQV9DSEFOX01BWAkJPSA0LAorCUxQQUlGX1JETUFfQ0hBTl9OVU0JCT0gNSwKK307CisKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9SRUcoY2hhbikJCUxQQUlGX1JETUFfUkVHX0FERFIoMHgwMCwgKGNoYW4pKQorI2RlZmluZSBMUEFJRl9SRE1BQkFTRV9SRUcoY2hhbikJTFBBSUZfUkRNQV9SRUdfQUREUigweDA0LCAoY2hhbikpCisjZGVmaW5lCUxQQUlGX1JETUFCVUZGX1JFRyhjaGFuKQlMUEFJRl9SRE1BX1JFR19BRERSKDB4MDgsIChjaGFuKSkKKyNkZWZpbmUgTFBBSUZfUkRNQUNVUlJfUkVHKGNoYW4pCUxQQUlGX1JETUFfUkVHX0FERFIoMHgwQywgKGNoYW4pKQorI2RlZmluZQlMUEFJRl9SRE1BUEVSX1JFRyhjaGFuKQkJTFBBSUZfUkRNQV9SRUdfQUREUigweDEwLCAoY2hhbikpCisKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9CVVJTVEVOX01BU0sJMHg4MDAKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9CVVJTVEVOX1NISUZUCTExCisjZGVmaW5lIExQQUlGX1JETUFDVExfQlVSU1RFTl9TSU5HTEUJKDAgPDwgTFBBSUZfUkRNQUNUTF9CVVJTVEVOX1NISUZUKQorI2RlZmluZSBMUEFJRl9SRE1BQ1RMX0JVUlNURU5fSU5DUjQJKDEgPDwgTFBBSUZfUkRNQUNUTF9CVVJTVEVOX1NISUZUKQorCisjZGVmaW5lIExQQUlGX1JETUFDVExfV1BTQ05UX01BU0sJMHg3MDAKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9XUFNDTlRfU0hJRlQJOAorI2RlZmluZSBMUEFJRl9SRE1BQ1RMX1dQU0NOVF9PTkUJKDAgPDwgTFBBSUZfUkRNQUNUTF9XUFNDTlRfU0hJRlQpCisjZGVmaW5lIExQQUlGX1JETUFDVExfV1BTQ05UX1RXTwkoMSA8PCBMUEFJRl9SRE1BQ1RMX1dQU0NOVF9TSElGVCkKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9XUFNDTlRfVEhSRUUJKDIgPDwgTFBBSUZfUkRNQUNUTF9XUFNDTlRfU0hJRlQpCisjZGVmaW5lIExQQUlGX1JETUFDVExfV1BTQ05UX0ZPVVIJKDMgPDwgTFBBSUZfUkRNQUNUTF9XUFNDTlRfU0hJRlQpCisjZGVmaW5lIExQQUlGX1JETUFDVExfV1BTQ05UX1NJWAkoNSA8PCBMUEFJRl9SRE1BQ1RMX1dQU0NOVF9TSElGVCkKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9XUFNDTlRfRUlHSFQJKDcgPDwgTFBBSUZfUkRNQUNUTF9XUFNDTlRfU0hJRlQpCisKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9BVURJTlRGX01BU0sJMHgwRjAKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9BVURJTlRGX1NISUZUCTQKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9BVURJTlRGX05PTkUJKDAgPDwgTFBBSUZfUkRNQUNUTF9BVURJTlRGX1NISUZUKQorI2RlZmluZSBMUEFJRl9SRE1BQ1RMX0FVRElOVEZfQ09ERUMJKDEgPDwgTFBBSUZfUkRNQUNUTF9BVURJTlRGX1NISUZUKQorI2RlZmluZSBMUEFJRl9SRE1BQ1RMX0FVRElOVEZfUENNCSgyIDw8IExQQUlGX1JETUFDVExfQVVESU5URl9TSElGVCkKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9BVURJTlRGX1NFQ19JMlMJKDMgPDwgTFBBSUZfUkRNQUNUTF9BVURJTlRGX1NISUZUKQorI2RlZmluZSBMUEFJRl9SRE1BQ1RMX0FVRElOVEZfTUkyUwkoNCA8PCBMUEFJRl9SRE1BQ1RMX0FVRElOVEZfU0hJRlQpCisjZGVmaW5lIExQQUlGX1JETUFDVExfQVVESU5URl9IRE1JCSg1IDw8IExQQUlGX1JETUFDVExfQVVESU5URl9TSElGVCkKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9BVURJTlRGX1NFQ19QQ00JKDcgPDwgTFBBSUZfUkRNQUNUTF9BVURJTlRGX1NISUZUKQorCisjZGVmaW5lIExQQUlGX1JETUFDVExfRklGT1dNX01BU0sJMHgwMEUKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9GSUZPV01fU0hJRlQJMQorI2RlZmluZSBMUEFJRl9SRE1BQ1RMX0ZJRk9XTV8xCQkoMCA8PCBMUEFJRl9SRE1BQ1RMX0ZJRk9XTV9TSElGVCkKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9GSUZPV01fMgkJKDEgPDwgTFBBSUZfUkRNQUNUTF9GSUZPV01fU0hJRlQpCisjZGVmaW5lIExQQUlGX1JETUFDVExfRklGT1dNXzMJCSgyIDw8IExQQUlGX1JETUFDVExfRklGT1dNX1NISUZUKQorI2RlZmluZSBMUEFJRl9SRE1BQ1RMX0ZJRk9XTV80CQkoMyA8PCBMUEFJRl9SRE1BQ1RMX0ZJRk9XTV9TSElGVCkKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9GSUZPV01fNQkJKDQgPDwgTFBBSUZfUkRNQUNUTF9GSUZPV01fU0hJRlQpCisjZGVmaW5lIExQQUlGX1JETUFDVExfRklGT1dNXzYJCSg1IDw8IExQQUlGX1JETUFDVExfRklGT1dNX1NISUZUKQorI2RlZmluZSBMUEFJRl9SRE1BQ1RMX0ZJRk9XTV83CQkoNiA8PCBMUEFJRl9SRE1BQ1RMX0ZJRk9XTV9TSElGVCkKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9GSUZPV01fOAkJKDcgPDwgTFBBSUZfUkRNQUNUTF9GSUZPV01fU0hJRlQpCisKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9FTkFCTEVfTUFTSwkweDEKKyNkZWZpbmUgTFBBSUZfUkRNQUNUTF9FTkFCTEVfU0hJRlQJMAorI2RlZmluZSBMUEFJRl9SRE1BQ1RMX0VOQUJMRV9PRkYJKDAgPDwgTFBBSUZfUkRNQUNUTF9FTkFCTEVfU0hJRlQpCisjZGVmaW5lIExQQUlGX1JETUFDVExfRU5BQkxFX09OCQkoMSA8PCBMUEFJRl9SRE1BQ1RMX0VOQUJMRV9TSElGVCkKKworI2VuZGlmIC8qIF9fTFBBU1NfTFBBSUZfSF9fICovCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcWNvbS9scGFzcy1wbGF0Zm9ybS5jIGIvc291bmQvc29jL3Fjb20vbHBhc3MtcGxhdGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmE2MjgwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3Fjb20vbHBhc3MtcGxhdGZvcm0uYwpAQCAtMCwwICsxLDUyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExLDIwMTMtMjAxNSBUaGUgTGludXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYW5kCisgKiBvbmx5IHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIGxwYXNzLXBsYXRmb3JtLmMgLS0gQUxTQSBTb0MgcGxhdGZvcm0gZHJpdmVyIGZvciBRVGkgTFBBU1MKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8c291bmQvbWVtYWxsb2MuaD4KKyNpbmNsdWRlIDxzb3VuZC9wY20uaD4KKyNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSAibHBhc3MtbHBhaWYtaXBxODA2eC5oIgorI2luY2x1ZGUgImxwYXNzLmgiCisKKyNkZWZpbmUgTFBBU1NfUExBVEZPUk1fQlVGRkVSX1NJWkUJKDE2ICogMTAyNCkKKyNkZWZpbmUgTFBBU1NfUExBVEZPUk1fUEVSSU9EUwkJMgorCitzdGF0aWMgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgbHBhc3NfcGxhdGZvcm1fcGNtX2hhcmR3YXJlID0geworCS5pbmZvCQkJPQlTTkRSVl9QQ01fSU5GT19NTUFQIHwKKwkJCQkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCB8CisJCQkJCVNORFJWX1BDTV9JTkZPX0lOVEVSTEVBVkVEIHwKKwkJCQkJU05EUlZfUENNX0lORk9fUEFVU0UgfAorCQkJCQlTTkRSVl9QQ01fSU5GT19SRVNVTUUsCisJLmZvcm1hdHMJCT0JU05EUlZfUENNX0ZNVEJJVF9TMTYgfAorCQkJCQlTTkRSVl9QQ01fRk1UQklUX1MyNCB8CisJCQkJCVNORFJWX1BDTV9GTVRCSVRfUzMyLAorCS5yYXRlcwkJCT0JU05EUlZfUENNX1JBVEVfODAwMF8xOTIwMDAsCisJLnJhdGVfbWluCQk9CTgwMDAsCisJLnJhdGVfbWF4CQk9CTE5MjAwMCwKKwkuY2hhbm5lbHNfbWluCQk9CTEsCisJLmNoYW5uZWxzX21heAkJPQk4LAorCS5idWZmZXJfYnl0ZXNfbWF4CT0JTFBBU1NfUExBVEZPUk1fQlVGRkVSX1NJWkUsCisJLnBlcmlvZF9ieXRlc19tYXgJPQlMUEFTU19QTEFURk9STV9CVUZGRVJfU0laRSAvCisJCQkJCQlMUEFTU19QTEFURk9STV9QRVJJT0RTLAorCS5wZXJpb2RfYnl0ZXNfbWluCT0JTFBBU1NfUExBVEZPUk1fQlVGRkVSX1NJWkUgLworCQkJCQkJTFBBU1NfUExBVEZPUk1fUEVSSU9EUywKKwkucGVyaW9kc19taW4JCT0JTFBBU1NfUExBVEZPUk1fUEVSSU9EUywKKwkucGVyaW9kc19tYXgJCT0JTFBBU1NfUExBVEZPUk1fUEVSSU9EUywKKwkuZmlmb19zaXplCQk9CTAsCit9OworCitzdGF0aWMgaW50IGxwYXNzX3BsYXRmb3JtX3BjbW9wc19vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19ydW50aW1lID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmbHBhc3NfcGxhdGZvcm1fcGNtX2hhcmR3YXJlKTsKKworCXJ1bnRpbWUtPmRtYV9ieXRlcyA9IGxwYXNzX3BsYXRmb3JtX3BjbV9oYXJkd2FyZS5idWZmZXJfYnl0ZXNfbWF4OworCisJcmV0ID0gc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwKKwkJCVNORFJWX1BDTV9IV19QQVJBTV9QRVJJT0RTKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHNvY19ydW50aW1lLT5kZXYsICIlcygpIHNldHRpbmcgY29uc3RyYWludHMgZmFpbGVkOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc25kX3BjbV9zZXRfcnVudGltZV9idWZmZXIoc3Vic3RyZWFtLCAmc3Vic3RyZWFtLT5kbWFfYnVmZmVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxwYXNzX3BsYXRmb3JtX3BjbW9wc19od19wYXJhbXMoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcnVudGltZSA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBscGFzc19kYXRhICpkcnZkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzb2NfcnVudGltZS0+cGxhdGZvcm0pOworCXNuZF9wY21fZm9ybWF0X3QgZm9ybWF0ID0gcGFyYW1zX2Zvcm1hdChwYXJhbXMpOworCXVuc2lnbmVkIGludCBjaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOworCXVuc2lnbmVkIGludCByZWd2YWw7CisJaW50IGJpdHdpZHRoOworCWludCByZXQ7CisKKwliaXR3aWR0aCA9IHNuZF9wY21fZm9ybWF0X3dpZHRoKGZvcm1hdCk7CisJaWYgKGJpdHdpZHRoIDwgMCkgeworCQlkZXZfZXJyKHNvY19ydW50aW1lLT5kZXYsICIlcygpIGludmFsaWQgYml0IHdpZHRoIGdpdmVuOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgYml0d2lkdGgpOworCQlyZXR1cm4gYml0d2lkdGg7CisJfQorCisJcmVndmFsID0gTFBBSUZfUkRNQUNUTF9CVVJTVEVOX0lOQ1I0IHwKKwkJCUxQQUlGX1JETUFDVExfQVVESU5URl9NSTJTIHwKKwkJCUxQQUlGX1JETUFDVExfRklGT1dNXzg7CisKKwlzd2l0Y2ggKGJpdHdpZHRoKSB7CisJY2FzZSAxNjoKKwkJc3dpdGNoIChjaGFubmVscykgeworCQljYXNlIDE6CisJCWNhc2UgMjoKKwkJCXJlZ3ZhbCB8PSBMUEFJRl9SRE1BQ1RMX1dQU0NOVF9PTkU7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJcmVndmFsIHw9IExQQUlGX1JETUFDVExfV1BTQ05UX1RXTzsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlyZWd2YWwgfD0gTFBBSUZfUkRNQUNUTF9XUFNDTlRfVEhSRUU7CisJCQlicmVhazsKKwkJY2FzZSA4OgorCQkJcmVndmFsIHw9IExQQUlGX1JETUFDVExfV1BTQ05UX0ZPVVI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWRldl9lcnIoc29jX3J1bnRpbWUtPmRldiwgIiVzKCkgaW52YWxpZCBQQ00gY29uZmlnIGdpdmVuOiBidz0lZCwgY2g9JXVcbiIsCisJCQkJCV9fZnVuY19fLCBiaXR3aWR0aCwgY2hhbm5lbHMpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAyNDoKKwljYXNlIDMyOgorCQlzd2l0Y2ggKGNoYW5uZWxzKSB7CisJCWNhc2UgMToKKwkJCXJlZ3ZhbCB8PSBMUEFJRl9SRE1BQ1RMX1dQU0NOVF9PTkU7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcmVndmFsIHw9IExQQUlGX1JETUFDVExfV1BTQ05UX1RXTzsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlyZWd2YWwgfD0gTFBBSUZfUkRNQUNUTF9XUFNDTlRfRk9VUjsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlyZWd2YWwgfD0gTFBBSUZfUkRNQUNUTF9XUFNDTlRfU0lYOworCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCXJlZ3ZhbCB8PSBMUEFJRl9SRE1BQ1RMX1dQU0NOVF9FSUdIVDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBpbnZhbGlkIFBDTSBjb25maWcgZ2l2ZW46IGJ3PSVkLCBjaD0ldVxuIiwKKwkJCQkJX19mdW5jX18sIGJpdHdpZHRoLCBjaGFubmVscyk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHNvY19ydW50aW1lLT5kZXYsICIlcygpIGludmFsaWQgUENNIGNvbmZpZyBnaXZlbjogYnc9JWQsIGNoPSV1XG4iLAorCQkJCV9fZnVuY19fLCBiaXR3aWR0aCwgY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSByZWdtYXBfd3JpdGUoZHJ2ZGF0YS0+bHBhaWZfbWFwLAorCQkJTFBBSUZfUkRNQUNUTF9SRUcoTFBBSUZfUkRNQV9DSEFOX01JMlMpLCByZWd2YWwpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIHJkbWFjdGwgcmVnOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscGFzc19wbGF0Zm9ybV9wY21vcHNfaHdfZnJlZShzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3J1bnRpbWUgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEoc29jX3J1bnRpbWUtPnBsYXRmb3JtKTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3dyaXRlKGRydmRhdGEtPmxwYWlmX21hcCwKKwkJCUxQQUlGX1JETUFDVExfUkVHKExQQUlGX1JETUFfQ0hBTl9NSTJTKSwgMCk7CisJaWYgKHJldCkKKwkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIHJkbWFjdGwgcmVnOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbHBhc3NfcGxhdGZvcm1fcGNtb3BzX3ByZXBhcmUoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0pCit7CisJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHN1YnN0cmVhbS0+cnVudGltZTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3J1bnRpbWUgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEoc29jX3J1bnRpbWUtPnBsYXRmb3JtKTsKKwlpbnQgcmV0OworCisJcmV0ID0gcmVnbWFwX3dyaXRlKGRydmRhdGEtPmxwYWlmX21hcCwKKwkJCUxQQUlGX1JETUFCQVNFX1JFRyhMUEFJRl9SRE1BX0NIQU5fTUkyUyksCisJCQlydW50aW1lLT5kbWFfYWRkcik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHNvY19ydW50aW1lLT5kZXYsICIlcygpIGVycm9yIHdyaXRpbmcgdG8gcmRtYWJhc2UgcmVnOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWdtYXBfd3JpdGUoZHJ2ZGF0YS0+bHBhaWZfbWFwLAorCQkJTFBBSUZfUkRNQUJVRkZfUkVHKExQQUlGX1JETUFfQ0hBTl9NSTJTKSwKKwkJCShzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKSA+PiAyKSAtIDEpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIHJkbWFidWZmIHJlZzogJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcmVnbWFwX3dyaXRlKGRydmRhdGEtPmxwYWlmX21hcCwKKwkJCUxQQUlGX1JETUFQRVJfUkVHKExQQUlGX1JETUFfQ0hBTl9NSTJTKSwKKwkJCShzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKSA+PiAyKSAtIDEpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIHJkbWFwZXIgcmVnOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWdtYXBfdXBkYXRlX2JpdHMoZHJ2ZGF0YS0+bHBhaWZfbWFwLAorCQkJTFBBSUZfUkRNQUNUTF9SRUcoTFBBSUZfUkRNQV9DSEFOX01JMlMpLAorCQkJTFBBSUZfUkRNQUNUTF9FTkFCTEVfTUFTSywgTFBBSUZfUkRNQUNUTF9FTkFCTEVfT04pOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIHJkbWFjdGwgcmVnOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBscGFzc19wbGF0Zm9ybV9wY21vcHNfdHJpZ2dlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJaW50IGNtZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3J1bnRpbWUgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEoc29jX3J1bnRpbWUtPnBsYXRmb3JtKTsKKwlpbnQgcmV0OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1NUQVJUOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUkVTVU1FOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRToKKwkJLyogY2xlYXIgc3RhdHVzIGJlZm9yZSBlbmFibGluZyBpbnRlcnJ1cHRzICovCisJCXJldCA9IHJlZ21hcF93cml0ZShkcnZkYXRhLT5scGFpZl9tYXAsCisJCQkJTFBBSUZfSVJRQ0xFQVJfUkVHKExQQUlGX0lSUV9QT1JUX0hPU1QpLAorCQkJCUxQQUlGX0lSUV9BTEwoTFBBSUZfUkRNQV9DSEFOX01JMlMpKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIGlycWNsZWFyIHJlZzogJWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkcnZkYXRhLT5scGFpZl9tYXAsCisJCQkJTFBBSUZfSVJRRU5fUkVHKExQQUlGX0lSUV9QT1JUX0hPU1QpLAorCQkJCUxQQUlGX0lSUV9BTEwoTFBBSUZfUkRNQV9DSEFOX01JMlMpLAorCQkJCUxQQUlGX0lSUV9BTEwoTFBBSUZfUkRNQV9DSEFOX01JMlMpKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIGlycWVuIHJlZzogJWRcbiIsCisJCQkJCV9fZnVuY19fLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkcnZkYXRhLT5scGFpZl9tYXAsCisJCQkJTFBBSUZfUkRNQUNUTF9SRUcoTFBBSUZfUkRNQV9DSEFOX01JMlMpLAorCQkJCUxQQUlGX1JETUFDVExfRU5BQkxFX01BU0ssCisJCQkJTFBBSUZfUkRNQUNUTF9FTkFCTEVfT04pOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHNvY19ydW50aW1lLT5kZXYsICIlcygpIGVycm9yIHdyaXRpbmcgdG8gcmRtYWN0bCByZWc6ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgorCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDoKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6CisJCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhkcnZkYXRhLT5scGFpZl9tYXAsCisJCQkJTFBBSUZfUkRNQUNUTF9SRUcoTFBBSUZfUkRNQV9DSEFOX01JMlMpLAorCQkJCUxQQUlGX1JETUFDVExfRU5BQkxFX01BU0ssCisJCQkJTFBBSUZfUkRNQUNUTF9FTkFCTEVfT0ZGKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIHJkbWFjdGwgcmVnOiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJcmV0ID0gcmVnbWFwX3VwZGF0ZV9iaXRzKGRydmRhdGEtPmxwYWlmX21hcCwKKwkJCQlMUEFJRl9JUlFFTl9SRUcoTFBBSUZfSVJRX1BPUlRfSE9TVCksCisJCQkJTFBBSUZfSVJRX0FMTChMUEFJRl9SRE1BX0NIQU5fTUkyUyksIDApOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHNvY19ydW50aW1lLT5kZXYsICIlcygpIGVycm9yIHdyaXRpbmcgdG8gaXJxZW4gcmVnOiAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc25kX3BjbV91ZnJhbWVzX3QgbHBhc3NfcGxhdGZvcm1fcGNtb3BzX3BvaW50ZXIoCisJCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpzb2NfcnVudGltZSA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBscGFzc19kYXRhICpkcnZkYXRhID0KKwkJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEoc29jX3J1bnRpbWUtPnBsYXRmb3JtKTsKKwl1bnNpZ25lZCBpbnQgYmFzZV9hZGRyLCBjdXJyX2FkZHI7CisJaW50IHJldDsKKworCXJldCA9IHJlZ21hcF9yZWFkKGRydmRhdGEtPmxwYWlmX21hcCwKKwkJCUxQQUlGX1JETUFCQVNFX1JFRyhMUEFJRl9SRE1BX0NIQU5fTUkyUyksICZiYXNlX2FkZHIpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBlcnJvciByZWFkaW5nIGZyb20gcmRtYWJhc2UgcmVnOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSByZWdtYXBfcmVhZChkcnZkYXRhLT5scGFpZl9tYXAsCisJCQlMUEFJRl9SRE1BQ1VSUl9SRUcoTFBBSUZfUkRNQV9DSEFOX01JMlMpLCAmY3Vycl9hZGRyKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc29jX3J1bnRpbWUtPmRldiwgIiVzKCkgZXJyb3IgcmVhZGluZyBmcm9tIHJkbWFjdXJyIHJlZzogJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIGJ5dGVzX3RvX2ZyYW1lcyhzdWJzdHJlYW0tPnJ1bnRpbWUsIGN1cnJfYWRkciAtIGJhc2VfYWRkcik7Cit9CisKK3N0YXRpYyBpbnQgbHBhc3NfcGxhdGZvcm1fcGNtb3BzX21tYXAoc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSBzdWJzdHJlYW0tPnJ1bnRpbWU7CisKKwlyZXR1cm4gZG1hX21tYXBfY29oZXJlbnQoc3Vic3RyZWFtLT5wY20tPmNhcmQtPmRldiwgdm1hLAorCQkJcnVudGltZS0+ZG1hX2FyZWEsIHJ1bnRpbWUtPmRtYV9hZGRyLAorCQkJcnVudGltZS0+ZG1hX2J5dGVzKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBscGFzc19wbGF0Zm9ybV9wY21fb3BzID0geworCS5vcGVuCQk9IGxwYXNzX3BsYXRmb3JtX3BjbW9wc19vcGVuLAorCS5pb2N0bAkJPSBzbmRfcGNtX2xpYl9pb2N0bCwKKwkuaHdfcGFyYW1zCT0gbHBhc3NfcGxhdGZvcm1fcGNtb3BzX2h3X3BhcmFtcywKKwkuaHdfZnJlZQk9IGxwYXNzX3BsYXRmb3JtX3BjbW9wc19od19mcmVlLAorCS5wcmVwYXJlCT0gbHBhc3NfcGxhdGZvcm1fcGNtb3BzX3ByZXBhcmUsCisJLnRyaWdnZXIJPSBscGFzc19wbGF0Zm9ybV9wY21vcHNfdHJpZ2dlciwKKwkucG9pbnRlcgk9IGxwYXNzX3BsYXRmb3JtX3BjbW9wc19wb2ludGVyLAorCS5tbWFwCQk9IGxwYXNzX3BsYXRmb3JtX3BjbW9wc19tbWFwLAorfTsKKworc3RhdGljIGlycXJldHVybl90IGxwYXNzX3BsYXRmb3JtX2xwYWlmX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3J1bnRpbWUgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbHBhc3NfZGF0YSAqZHJ2ZGF0YSA9CisJCXNuZF9zb2NfcGxhdGZvcm1fZ2V0X2RydmRhdGEoc29jX3J1bnRpbWUtPnBsYXRmb3JtKTsKKwl1bnNpZ25lZCBpbnQgaW50ZXJydXB0czsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKwlpbnQgcnY7CisKKwlydiA9IHJlZ21hcF9yZWFkKGRydmRhdGEtPmxwYWlmX21hcCwKKwkJCUxQQUlGX0lSUVNUQVRfUkVHKExQQUlGX0lSUV9QT1JUX0hPU1QpLCAmaW50ZXJydXB0cyk7CisJaWYgKHJ2KSB7CisJCWRldl9lcnIoc29jX3J1bnRpbWUtPmRldiwgIiVzKCkgZXJyb3IgcmVhZGluZyBmcm9tIGlycXN0YXQgcmVnOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcnYpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCWludGVycnVwdHMgJj0gTFBBSUZfSVJRX0FMTChMUEFJRl9SRE1BX0NIQU5fTUkyUyk7CisKKwlpZiAoaW50ZXJydXB0cyAmIExQQUlGX0lSUV9QRVIoTFBBSUZfUkRNQV9DSEFOX01JMlMpKSB7CisJCXJ2ID0gcmVnbWFwX3dyaXRlKGRydmRhdGEtPmxwYWlmX21hcCwKKwkJCQlMUEFJRl9JUlFDTEVBUl9SRUcoTFBBSUZfSVJRX1BPUlRfSE9TVCksCisJCQkJTFBBSUZfSVJRX1BFUihMUEFJRl9SRE1BX0NIQU5fTUkyUykpOworCQlpZiAocnYpIHsKKwkJCWRldl9lcnIoc29jX3J1bnRpbWUtPmRldiwgIiVzKCkgZXJyb3Igd3JpdGluZyB0byBpcnFjbGVhciByZWc6ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcnYpOworCQkJcmV0dXJuIElSUV9OT05FOworCQl9CisJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGludGVycnVwdHMgJiBMUEFJRl9JUlFfWFJVTihMUEFJRl9SRE1BX0NIQU5fTUkyUykpIHsKKwkJcnYgPSByZWdtYXBfd3JpdGUoZHJ2ZGF0YS0+bHBhaWZfbWFwLAorCQkJCUxQQUlGX0lSUUNMRUFSX1JFRyhMUEFJRl9JUlFfUE9SVF9IT1NUKSwKKwkJCQlMUEFJRl9JUlFfWFJVTihMUEFJRl9SRE1BX0NIQU5fTUkyUykpOworCQlpZiAocnYpIHsKKwkJCWRldl9lcnIoc29jX3J1bnRpbWUtPmRldiwgIiVzKCkgZXJyb3Igd3JpdGluZyB0byBpcnFjbGVhciByZWc6ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcnYpOworCQkJcmV0dXJuIElSUV9OT05FOworCQl9CisJCWRldl93YXJuKHNvY19ydW50aW1lLT5kZXYsICIlcygpIHhydW4gd2FybmluZ1xuIiwgX19mdW5jX18pOworCQlzbmRfcGNtX3N0b3Aoc3Vic3RyZWFtLCBTTkRSVl9QQ01fU1RBVEVfWFJVTik7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0KKworCWlmIChpbnRlcnJ1cHRzICYgTFBBSUZfSVJRX0VSUihMUEFJRl9SRE1BX0NIQU5fTUkyUykpIHsKKwkJcnYgPSByZWdtYXBfd3JpdGUoZHJ2ZGF0YS0+bHBhaWZfbWFwLAorCQkJCUxQQUlGX0lSUUNMRUFSX1JFRyhMUEFJRl9JUlFfUE9SVF9IT1NUKSwKKwkJCQlMUEFJRl9JUlFfRVJSKExQQUlGX1JETUFfQ0hBTl9NSTJTKSk7CisJCWlmIChydikgeworCQkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBlcnJvciB3cml0aW5nIHRvIGlycWNsZWFyIHJlZzogJWRcbiIsCisJCQkJCV9fZnVuY19fLCBydik7CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KKwkJZGV2X2Vycihzb2NfcnVudGltZS0+ZGV2LCAiJXMoKSBidXMgYWNjZXNzIGVycm9yXG4iLCBfX2Z1bmNfXyk7CisJCXNuZF9wY21fc3RvcChzdWJzdHJlYW0sIFNORFJWX1BDTV9TVEFURV9ESVNDT05ORUNURUQpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxwYXNzX3BsYXRmb3JtX2FsbG9jX2J1ZmZlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19ydW50aW1lKQoreworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKwlzaXplX3Qgc2l6ZSA9IGxwYXNzX3BsYXRmb3JtX3BjbV9oYXJkd2FyZS5idWZmZXJfYnl0ZXNfbWF4OworCisJYnVmLT5kZXYudHlwZSA9IFNORFJWX0RNQV9UWVBFX0RFVjsKKwlidWYtPmRldi5kZXYgPSBzb2NfcnVudGltZS0+ZGV2OworCWJ1Zi0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlidWYtPmFyZWEgPSBkbWFfYWxsb2NfY29oZXJlbnQoc29jX3J1bnRpbWUtPmRldiwgc2l6ZSwgJmJ1Zi0+YWRkciwKKwkJCUdGUF9LRVJORUwpOworCWlmICghYnVmLT5hcmVhKSB7CisJCWRldl9lcnIoc29jX3J1bnRpbWUtPmRldiwgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgRE1BIGJ1ZmZlclxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlidWYtPmJ5dGVzID0gc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBscGFzc19wbGF0Zm9ybV9mcmVlX2J1ZmZlcihzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKKwkJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19ydW50aW1lKQoreworCXN0cnVjdCBzbmRfZG1hX2J1ZmZlciAqYnVmID0gJnN1YnN0cmVhbS0+ZG1hX2J1ZmZlcjsKKworCWlmIChidWYtPmFyZWEpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoc29jX3J1bnRpbWUtPmRldiwgYnVmLT5ieXRlcywgYnVmLT5hcmVhLAorCQkJCWJ1Zi0+YWRkcik7CisJfQorCWJ1Zi0+YXJlYSA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbHBhc3NfcGxhdGZvcm1fcGNtX25ldyhzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3J1bnRpbWUpCit7CisJc3RydWN0IHNuZF9wY20gKnBjbSA9IHNvY19ydW50aW1lLT5wY207CisJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0gPQorCQlwY20tPnN0cmVhbXNbU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDS10uc3Vic3RyZWFtOworCXN0cnVjdCBscGFzc19kYXRhICpkcnZkYXRhID0KKwkJc25kX3NvY19wbGF0Zm9ybV9nZXRfZHJ2ZGF0YShzb2NfcnVudGltZS0+cGxhdGZvcm0pOworCWludCByZXQ7CisKKwlzb2NfcnVudGltZS0+ZGV2LT5jb2hlcmVudF9kbWFfbWFzayA9IERNQV9CSVRfTUFTSygzMik7CisJc29jX3J1bnRpbWUtPmRldi0+ZG1hX21hc2sgPSAmc29jX3J1bnRpbWUtPmRldi0+Y29oZXJlbnRfZG1hX21hc2s7CisKKwlyZXQgPSBscGFzc19wbGF0Zm9ybV9hbGxvY19idWZmZXIoc3Vic3RyZWFtLCBzb2NfcnVudGltZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoc29jX3J1bnRpbWUtPmRldiwgZHJ2ZGF0YS0+bHBhaWZfaXJxLAorCQkJbHBhc3NfcGxhdGZvcm1fbHBhaWZfaXJxLCBJUlFGX1RSSUdHRVJfUklTSU5HLAorCQkJImxwYXNzLWlycS1scGFpZiIsIHN1YnN0cmVhbSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKHNvY19ydW50aW1lLT5kZXYsICIlcygpIGlycSByZXF1ZXN0IGZhaWxlZDogJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCWdvdG8gZXJyX2J1ZjsKKwl9CisKKwkvKiBlbnN1cmUgYXVkaW8gaGFyZHdhcmUgaXMgZGlzYWJsZWQgKi8KKwlyZXQgPSByZWdtYXBfd3JpdGUoZHJ2ZGF0YS0+bHBhaWZfbWFwLAorCQkJTFBBSUZfSVJRRU5fUkVHKExQQUlGX0lSUV9QT1JUX0hPU1QpLCAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc29jX3J1bnRpbWUtPmRldiwgIiVzKCkgZXJyb3Igd3JpdGluZyB0byBpcnFlbiByZWc6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXQgPSByZWdtYXBfd3JpdGUoZHJ2ZGF0YS0+bHBhaWZfbWFwLAorCQkJTFBBSUZfUkRNQUNUTF9SRUcoTFBBSUZfUkRNQV9DSEFOX01JMlMpLCAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoc29jX3J1bnRpbWUtPmRldiwgIiVzKCkgZXJyb3Igd3JpdGluZyB0byByZG1hY3RsIHJlZzogJWRcbiIsCisJCQkJX19mdW5jX18sIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9idWY6CisJbHBhc3NfcGxhdGZvcm1fZnJlZV9idWZmZXIoc3Vic3RyZWFtLCBzb2NfcnVudGltZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbHBhc3NfcGxhdGZvcm1fcGNtX2ZyZWUoc3RydWN0IHNuZF9wY20gKnBjbSkKK3sKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9CisJCXBjbS0+c3RyZWFtc1tTTkRSVl9QQ01fU1RSRUFNX1BMQVlCQUNLXS5zdWJzdHJlYW07CisJc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnNvY19ydW50aW1lID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7CisKKwlscGFzc19wbGF0Zm9ybV9mcmVlX2J1ZmZlcihzdWJzdHJlYW0sIHNvY19ydW50aW1lKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBscGFzc19wbGF0Zm9ybV9kcml2ZXIgPSB7CisJLnBjbV9uZXcJPSBscGFzc19wbGF0Zm9ybV9wY21fbmV3LAorCS5wY21fZnJlZQk9IGxwYXNzX3BsYXRmb3JtX3BjbV9mcmVlLAorCS5vcHMJCT0gJmxwYXNzX3BsYXRmb3JtX3BjbV9vcHMsCit9OworCitpbnQgYXNvY19xY29tX2xwYXNzX3BsYXRmb3JtX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGxwYXNzX2RhdGEgKmRydmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWRydmRhdGEtPmxwYWlmX2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJscGFzcy1pcnEtbHBhaWYiKTsKKwlpZiAoZHJ2ZGF0YS0+bHBhaWZfaXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcygpIGVycm9yIGdldHRpbmcgaXJxIGhhbmRsZTogJWRcbiIsCisJCQkJX19mdW5jX18sIGRydmRhdGEtPmxwYWlmX2lycSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfcGxhdGZvcm0oJnBkZXYtPmRldiwKKwkJCSZscGFzc19wbGF0Zm9ybV9kcml2ZXIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXNvY19xY29tX2xwYXNzX3BsYXRmb3JtX3JlZ2lzdGVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJRVGkgTFBBU1MgUGxhdGZvcm0gRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvcWNvbS9scGFzcy5oIGIvc291bmQvc29jL3Fjb20vbHBhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yzk5YjNkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvc29jL3Fjb20vbHBhc3MuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsMjAxMy0yMDE1IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhbmQKKyAqIG9ubHkgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogbHBhc3MuaCAtIERlZmluaXRpb25zIGZvciB0aGUgUVRpIExQQVNTCisgKi8KKworI2lmbmRlZiBfX0xQQVNTX0hfXworI2RlZmluZSBfX0xQQVNTX0hfXworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKworI2RlZmluZSBMUEFTU19BSEJJWF9DTE9DS19GUkVRVUVOQ1kJCTEzMTA3MjAwMAorCisvKiBCb3RoIHRoZSBDUFUgREFJIGFuZCBwbGF0Zm9ybSBkcml2ZXJzIHdpbGwgYWNjZXNzIHRoaXMgZGF0YSAqLworc3RydWN0IGxwYXNzX2RhdGEgeworCisJLyogQUhCLUkvWCBidXMgY2xvY2tzIGluc2lkZSB0aGUgbG93LXBvd2VyIGF1ZGlvIHN1YnN5c3RlbSAoTFBBU1MpICovCisJc3RydWN0IGNsayAqYWhiaXhfY2xrOworCisJLyogTUkyUyBzeXN0ZW0gY2xvY2sgKi8KKwlzdHJ1Y3QgY2xrICptaTJzX29zcl9jbGs7CisKKwkvKiBNSTJTIGJpdCBjbG9jayAoZGVyaXZlZCBmcm9tIHN5c3RlbSBjbG9jayBieSBhIGRpdmlkZXIgKi8KKwlzdHJ1Y3QgY2xrICptaTJzX2JpdF9jbGs7CisKKwkvKiBsb3ctcG93ZXIgYXVkaW8gaW50ZXJmYWNlIChMUEFJRikgcmVnaXN0ZXJzICovCisJdm9pZCBfX2lvbWVtICpscGFpZjsKKworCS8qIHJlZ21hcCBiYWNrZWQgYnkgdGhlIGxvdy1wb3dlciBhdWRpbyBpbnRlcmZhY2UgKExQQUlGKSByZWdpc3RlcnMgKi8KKwlzdHJ1Y3QgcmVnbWFwICpscGFpZl9tYXA7CisKKwkvKiBpbnRlcnJ1cHRzIGZyb20gdGhlIGxvdy1wb3dlciBhdWRpbyBpbnRlcmZhY2UgKExQQUlGKSAqLworCWludCBscGFpZl9pcnE7Cit9OworCisvKiByZWdpc3RlciB0aGUgcGxhdGZvcm0gZHJpdmVyIGZyb20gdGhlIENQVSBEQUkgZHJpdmVyICovCitpbnQgYXNvY19xY29tX2xwYXNzX3BsYXRmb3JtX3JlZ2lzdGVyKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKik7CisKKyNlbmRpZiAvKiBfX0xQQVNTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3Fjb20vc3Rvcm0uYyBiL3NvdW5kL3NvYy9xY29tL3N0b3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiZDI5NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9xY29tL3N0b3JtLmMKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwyMDEzLTIwMTUgVGhlIExpbnV4IEZvdW5kYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBzdG9ybS5jIC0tIEFMU0EgU29DIG1hY2hpbmUgZHJpdmVyIGZvciBRVGkgaXBxODA2eC1iYXNlZCBTdG9ybSBib2FyZAorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZF9kZXZpY2V0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbS5oPgorI2luY2x1ZGUgPHNvdW5kL3BjbV9wYXJhbXMuaD4KKyNpbmNsdWRlIDxzb3VuZC9zb2MuaD4KKworI2RlZmluZSBTVE9STV9TWVNDTEtfTVVMVAkJCTQKKworc3RhdGljIGludCBzdG9ybV9vcHNfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqc29jX3J1bnRpbWUgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gc29jX3J1bnRpbWUtPmNhcmQ7CisJc25kX3BjbV9mb3JtYXRfdCBmb3JtYXQgPSBwYXJhbXNfZm9ybWF0KHBhcmFtcyk7CisJdW5zaWduZWQgaW50IHJhdGUgPSBwYXJhbXNfcmF0ZShwYXJhbXMpOworCXVuc2lnbmVkIGludCBzeXNjbGtfZnJlcTsKKwlpbnQgYml0d2lkdGgsIHJldDsKKworCWJpdHdpZHRoID0gc25kX3BjbV9mb3JtYXRfd2lkdGgoZm9ybWF0KTsKKwlpZiAoYml0d2lkdGggPCAwKSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiJXMoKSBpbnZhbGlkIGJpdCB3aWR0aCBnaXZlbjogJWRcbiIsCisJCQkJX19mdW5jX18sIGJpdHdpZHRoKTsKKwkJcmV0dXJuIGJpdHdpZHRoOworCX0KKworCS8qCisJICogYXMgdGhlIENQVSBEQUkgaXMgdGhlIEkyUyBidXMgbWFzdGVyIGFuZCBubyBzeXN0ZW0gY2xvY2sgaXMgbmVlZGVkIGJ5CisJICogdGhlIE1BWDk4MzU3YSBEQUMsIHNpbXBseSBzZXQgdGhlIHN5c3RlbSBjbG9jayB0byBiZSBhIGNvbnN0YW50CisJICogbXVsdGlwbGUgb2YgdGhlIGJpdCBjbG9jayBmb3IgdGhlIGNsb2NrIGRpdmlkZXIKKwkgKi8KKwlzeXNjbGtfZnJlcSA9IHJhdGUgKiBiaXR3aWR0aCAqIDIgKiBTVE9STV9TWVNDTEtfTVVMVDsKKworCXJldCA9IHNuZF9zb2NfZGFpX3NldF9zeXNjbGsoc29jX3J1bnRpbWUtPmNwdV9kYWksIDAsIHN5c2Nsa19mcmVxLCAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY2FyZC0+ZGV2LCAiJXMoKSBlcnJvciBzZXR0aW5nIHN5c2NsayB0byAldTogJWRcbiIsCisJCQkJX19mdW5jX18sIHN5c2Nsa19mcmVxLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9zb2Nfb3BzIHN0b3JtX3NvY19vcHMgPSB7CisJLmh3X3BhcmFtcwk9IHN0b3JtX29wc19od19wYXJhbXMsCit9OworCitzdGF0aWMgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgc3Rvcm1fZGFpX2xpbmsgPSB7CisJLm5hbWUJCT0gIlByaW1hcnkiLAorCS5zdHJlYW1fbmFtZQk9ICJQcmltYXJ5IiwKKwkuY29kZWNfZGFpX25hbWUJPSAiSGlGaSIsCisJLm9wcwkJPSAmc3Rvcm1fc29jX29wcywKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHN0b3JtX3NvY19jYXJkID0geworCS5uYW1lCT0gImlwcTgwNngtc3Rvcm0iLAorCS5kZXYJPSBOVUxMLAorfTsKKworc3RhdGljIGludCBzdG9ybV9wYXJzZV9vZihzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQoreworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IGNhcmQtPmRhaV9saW5rOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBjYXJkLT5kZXYtPm9mX25vZGU7CisKKwlkYWlfbGluay0+Y3B1X29mX25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKG5wLCAiY3B1IiwgMCk7CisJaWYgKCFkYWlfbGluay0+Y3B1X29mX25vZGUpIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsICIlcygpIGVycm9yIGdldHRpbmcgY3B1IHBoYW5kbGVcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGFpX2xpbmstPnBsYXRmb3JtX29mX25vZGUgPSBkYWlfbGluay0+Y3B1X29mX25vZGU7CisKKwlkYWlfbGluay0+Y29kZWNfb2Zfbm9kZSA9IG9mX3BhcnNlX3BoYW5kbGUobnAsICJjb2RlYyIsIDApOworCWlmICghZGFpX2xpbmstPmNvZGVjX29mX25vZGUpIHsKKwkJZGV2X2VycihjYXJkLT5kZXYsICIlcygpIGVycm9yIGdldHRpbmcgY29kZWMgcGhhbmRsZVxuIiwKKwkJCQlfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0b3JtX3BsYXRmb3JtX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCA9ICZzdG9ybV9zb2NfY2FyZDsKKwlpbnQgcmV0OworCisJaWYgKGNhcmQtPmRldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcygpIGVycm9yLCBleGlzdGluZyBzb3VuZGNhcmRcbiIsCisJCQkJX19mdW5jX18pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJY2FyZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBjYXJkKTsKKworCXJldCA9IHNuZF9zb2Nfb2ZfcGFyc2VfY2FyZF9uYW1lKGNhcmQsICJxY29tLG1vZGVsIik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcygpIGVycm9yIHBhcnNpbmcgY2FyZCBuYW1lOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljYXJkLT5kYWlfbGluawk9ICZzdG9ybV9kYWlfbGluazsKKwljYXJkLT5udW1fbGlua3MJPSAxOworCisJcmV0ID0gc3Rvcm1fcGFyc2Vfb2YoY2FyZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICIlcygpIGVycm9yIHJlc29sdmluZyBkYWkgbGlua3M6ICVkXG4iLAorCQkJCV9fZnVuY19fLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGRldm1fc25kX3NvY19yZWdpc3Rlcl9jYXJkKCZwZGV2LT5kZXYsIGNhcmQpOworCWlmIChyZXQgPT0gLUVQUk9CRV9ERUZFUikgeworCQljYXJkLT5kZXYgPSBOVUxMOworCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIiVzKCkgZXJyb3IgcmVnaXN0ZXJpbmcgc291bmRjYXJkOiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgc3Rvcm1fZGV2aWNlX2lkW10gID0geworCXsgLmNvbXBhdGlibGUgPSAiZ29vZ2xlLHN0b3JtLWF1ZGlvIiB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHN0b3JtX2RldmljZV9pZCk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3Rvcm1fcGxhdGZvcm1fZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInN0b3JtLWF1ZGlvIiwKKwkJLm9mX21hdGNoX3RhYmxlID0KKwkJCW9mX21hdGNoX3B0cihzdG9ybV9kZXZpY2VfaWQpLAorCX0sCisJLnByb2JlID0gc3Rvcm1fcGxhdGZvcm1fcHJvYmUsCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzdG9ybV9wbGF0Zm9ybV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlFUaSBJUFE4MDZ4LWJhc2VkIFN0b3JtIE1hY2hpbmUgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9oMTk0MF91ZGExMzgwLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9oMTk0MF91ZGExMzgwLmMKaW5kZXggNTliMDQ0Mi4uYzcyZTlmYiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvaDE5NDBfdWRhMTM4MC5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL2gxOTQwX3VkYTEzODAuYwpAQCAtMTYyLDEzICsxNjIsOCBAQAogCiBzdGF0aWMgaW50IGgxOTQwX3VkYTEzODBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0KLQlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCBTTkRfSkFDS19IRUFEUEhPTkUsCi0JCSZocF9qYWNrKTsKLQotCXNuZF9zb2NfamFja19hZGRfcGlucygmaHBfamFjaywgQVJSQVlfU0laRShocF9qYWNrX3BpbnMpLAotCQlocF9qYWNrX3BpbnMpOworCXNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJIZWFkcGhvbmUgSmFjayIsIFNORF9KQUNLX0hFQURQSE9ORSwKKwkJJmhwX2phY2ssIGhwX2phY2tfcGlucywgQVJSQVlfU0laRShocF9qYWNrX3BpbnMpKTsKIAogCXNuZF9zb2NfamFja19hZGRfZ3Bpb3MoJmhwX2phY2ssIEFSUkFZX1NJWkUoaHBfamFja19ncGlvcyksCiAJCWhwX2phY2tfZ3Bpb3MpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvbGl0dGxlbWlsbC5jIGIvc291bmQvc29jL3NhbXN1bmcvbGl0dGxlbWlsbC5jCmluZGV4IDE0MTUxOWMuLjMxYTgyMGUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2xpdHRsZW1pbGwuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9saXR0bGVtaWxsLmMKQEAgLTI2MCwxMiArMjYwLDEyIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHNldCIsCi0JCQkgICAgICAgU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX01FQ0hBTklDQUwgfAotCQkJICAgICAgIFNORF9KQUNLX0JUTl8wIHwgU05EX0pBQ0tfQlROXzEgfAotCQkJICAgICAgIFNORF9KQUNLX0JUTl8yIHwgU05EX0pBQ0tfQlROXzMgfAotCQkJICAgICAgIFNORF9KQUNLX0JUTl80IHwgU05EX0pBQ0tfQlROXzUsCi0JCQkgICAgICAgJmxpdHRsZW1pbGxfaGVhZHNldCk7CisJcmV0ID0gc25kX3NvY19jYXJkX2phY2tfbmV3KGNhcmQsICJIZWFkc2V0IiwKKwkJCQkgICAgU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX01FQ0hBTklDQUwgfAorCQkJCSAgICBTTkRfSkFDS19CVE5fMCB8IFNORF9KQUNLX0JUTl8xIHwKKwkJCQkgICAgU05EX0pBQ0tfQlROXzIgfCBTTkRfSkFDS19CVE5fMyB8CisJCQkJICAgIFNORF9KQUNLX0JUTl80IHwgU05EX0pBQ0tfQlROXzUsCisJCQkJICAgICZsaXR0bGVtaWxsX2hlYWRzZXQsIE5VTEwsIDApOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL2xvd2xhbmQuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL2xvd2xhbmQuYwppbmRleCAyNDNkZWE3Li41ZjE1NjA5IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9sb3dsYW5kLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvbG93bGFuZC5jCkBAIC01NiwxNiArNTYsMTAgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHNldCIsCi0JCQkgICAgICAgU05EX0pBQ0tfTElORU9VVCB8IFNORF9KQUNLX0hFQURTRVQgfAotCQkJICAgICAgIFNORF9KQUNLX0JUTl8wLAotCQkJICAgICAgICZsb3dsYW5kX2hlYWRzZXQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBzbmRfc29jX2phY2tfYWRkX3BpbnMoJmxvd2xhbmRfaGVhZHNldCwKLQkJCQkgICAgQVJSQVlfU0laRShsb3dsYW5kX2hlYWRzZXRfcGlucyksCi0JCQkJICAgIGxvd2xhbmRfaGVhZHNldF9waW5zKTsKKwlyZXQgPSBzbmRfc29jX2NhcmRfamFja19uZXcocnRkLT5jYXJkLCAiSGVhZHNldCIsIFNORF9KQUNLX0xJTkVPVVQgfAorCQkJCSAgICBTTkRfSkFDS19IRUFEU0VUIHwgU05EX0pBQ0tfQlROXzAsCisJCQkJICAgICZsb3dsYW5kX2hlYWRzZXQsIGxvd2xhbmRfaGVhZHNldF9waW5zLAorCQkJCSAgICBBUlJBWV9TSVpFKGxvd2xhbmRfaGVhZHNldF9waW5zKSk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYyBiL3NvdW5kL3NvYy9zYW1zdW5nL3J4MTk1MF91ZGExMzgwLmMKaW5kZXggODczZjJjYi4uMzVlMzdjNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvcngxOTUwX3VkYTEzODAuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9yeDE5NTBfdWRhMTM4MC5jCkBAIC0yMTEsMTMgKzIxMSw4IEBACiAKIHN0YXRpYyBpbnQgcngxOTUwX3VkYTEzODBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0KLQlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lIEphY2siLCBTTkRfSkFDS19IRUFEUEhPTkUsCi0JCSZocF9qYWNrKTsKLQotCXNuZF9zb2NfamFja19hZGRfcGlucygmaHBfamFjaywgQVJSQVlfU0laRShocF9qYWNrX3BpbnMpLAotCQlocF9qYWNrX3BpbnMpOworCXNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJIZWFkcGhvbmUgSmFjayIsIFNORF9KQUNLX0hFQURQSE9ORSwKKwkJJmhwX2phY2ssIGhwX2phY2tfcGlucywgQVJSQVlfU0laRShocF9qYWNrX3BpbnMpKTsKIAogCXNuZF9zb2NfamFja19hZGRfZ3Bpb3MoJmhwX2phY2ssIEFSUkFZX1NJWkUoaHBfamFja19ncGlvcyksCiAJCWhwX2phY2tfZ3Bpb3MpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NhbXN1bmcvc21hcnRxX3dtODk4Ny5jIGIvc291bmQvc29jL3NhbXN1bmcvc21hcnRxX3dtODk4Ny5jCmluZGV4IDgyOTFkMmEuLmRmYmUyZGIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtYXJ0cV93bTg5ODcuYworKysgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWFydHFfd204OTg3LmMKQEAgLTE1MSwxMyArMTUxLDEwIEBACiAJc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJIZWFkcGhvbmUgSmFjayIpOwogCiAJLyogSGVhZHBob25lIGphY2sgZGV0ZWN0aW9uICovCi0JZXJyID0gc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZSBKYWNrIiwKLQkJCSAgICAgICBTTkRfSkFDS19IRUFEUEhPTkUsICZzbWFydHFfamFjayk7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWVyciA9IHNuZF9zb2NfamFja19hZGRfcGlucygmc21hcnRxX2phY2ssIEFSUkFZX1NJWkUoc21hcnRxX2phY2tfcGlucyksCi0JCQkJICAgIHNtYXJ0cV9qYWNrX3BpbnMpOworCWVyciA9IHNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJIZWFkcGhvbmUgSmFjayIsCisJCQkJICAgIFNORF9KQUNLX0hFQURQSE9ORSwgJnNtYXJ0cV9qYWNrLAorCQkJCSAgICBzbWFydHFfamFja19waW5zLAorCQkJCSAgICBBUlJBWV9TSVpFKHNtYXJ0cV9qYWNrX3BpbnMpKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGV5c2lkZS5jIGIvc291bmQvc29jL3NhbXN1bmcvc3BleXNpZGUuYwppbmRleCA1ZWM3YzUyLi4yZGNiOTg4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGV5c2lkZS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlLmMKQEAgLTE1MywxNiArMTUzLDEwIEBACiAJCXByX2VycigiRmFpbGVkIHRvIHJlcXVlc3QgSFBfU0VMIEdQSU86ICVkXG4iLCByZXQpOwogCWdwaW9fZGlyZWN0aW9uX291dHB1dChXTTg5OTZfSFBTRUxfR1BJTywgc3BleXNpZGVfamFja19wb2xhcml0eSk7CiAKLQlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHNldCIsCi0JCQkgICAgICAgU05EX0pBQ0tfTElORU9VVCB8IFNORF9KQUNLX0hFQURTRVQgfAotCQkJICAgICAgIFNORF9KQUNLX0JUTl8wLAotCQkJICAgICAgICZzcGV5c2lkZV9oZWFkc2V0KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gc25kX3NvY19qYWNrX2FkZF9waW5zKCZzcGV5c2lkZV9oZWFkc2V0LAotCQkJCSAgICBBUlJBWV9TSVpFKHNwZXlzaWRlX2hlYWRzZXRfcGlucyksCi0JCQkJICAgIHNwZXlzaWRlX2hlYWRzZXRfcGlucyk7CisJcmV0ID0gc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRzZXQiLCBTTkRfSkFDS19MSU5FT1VUIHwKKwkJCQkgICAgU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX0JUTl8wLAorCQkJCSAgICAmc3BleXNpZGVfaGVhZHNldCwgc3BleXNpZGVfaGVhZHNldF9waW5zLAorCQkJCSAgICBBUlJBWV9TSVpFKHNwZXlzaWRlX2hlYWRzZXRfcGlucykpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3RvYmVybW9yeS5jIGIvc291bmQvc29jL3NhbXN1bmcvdG9iZXJtb3J5LmMKaW5kZXggOWM4MDUwNi4uODVjY2ZiNyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvdG9iZXJtb3J5LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvdG9iZXJtb3J5LmMKQEAgLTE3OSwxNSArMTc5LDEwIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHNldCIsCi0JCQkgICAgICAgU05EX0pBQ0tfSEVBRFNFVCB8IFNORF9KQUNLX0JUTl8wLAotCQkJICAgICAgICZ0b2Jlcm1vcnlfaGVhZHNldCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHNuZF9zb2NfamFja19hZGRfcGlucygmdG9iZXJtb3J5X2hlYWRzZXQsCi0JCQkJICAgIEFSUkFZX1NJWkUodG9iZXJtb3J5X2hlYWRzZXRfcGlucyksCi0JCQkJICAgIHRvYmVybW9yeV9oZWFkc2V0X3BpbnMpOworCXJldCA9IHNuZF9zb2NfY2FyZF9qYWNrX25ldyhjYXJkLCAiSGVhZHNldCIsIFNORF9KQUNLX0hFQURTRVQgfAorCQkJCSAgICBTTkRfSkFDS19CVE5fMCwgJnRvYmVybW9yeV9oZWFkc2V0LAorCQkJCSAgICB0b2Jlcm1vcnlfaGVhZHNldF9waW5zLAorCQkJCSAgICBBUlJBWV9TSVpFKHRvYmVybW9yeV9oZWFkc2V0X3BpbnMpKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvS2NvbmZpZyBiL3NvdW5kL3NvYy9zaC9LY29uZmlnCmluZGV4IDgwMjQ1YjYuLjA3MTE0YjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9LY29uZmlnCisrKyBiL3NvdW5kL3NvYy9zaC9LY29uZmlnCkBAIC0zNiwxMSArMzYsMTcgQEAKIAogY29uZmlnIFNORF9TT0NfUkNBUgogCXRyaXN0YXRlICJSLUNhciBzZXJpZXMgU1JVL1NDVS9TU0lVL1NTSSBzdXBwb3J0IgorCWRlcGVuZHMgb24gRE1BX09GCiAJc2VsZWN0IFNORF9TSU1QTEVfQ0FSRAogCXNlbGVjdCBSRUdNQVBfTU1JTwogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgUi1DYXIgU1VSL1NDVS9TU0lVL1NTSSBzb3VuZCBzdXBwb3J0CiAKK2NvbmZpZyBTTkRfU09DX1JTUkNfQ0FSRAorCXRyaXN0YXRlICJSZW5lc2FzIFNhbXBsaW5nIFJhdGUgQ29udmVydCBTb3VuZCBDYXJkIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc2ltcGxlIHNvdW5kIGlmIHlvdSBuZWVkIHNhbXBsaW5nIHJhdGUgY29udmVydAorCiAjIwogIyMgQm9hcmRzCiAjIwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL2ZzaS5jIGIvc291bmQvc29jL3NoL2ZzaS5jCmluZGV4IGI4N2IyMmUuLjBjMmFmMjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9mc2kuYworKysgYi9zb3VuZC9zb2Mvc2gvZnNpLmMKQEAgLTE4NzYsNyArMTg3Niw0MCBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNpX29mX21hdGNoW107CitzdGF0aWMgY29uc3Qgc3RydWN0IGZzaV9jb3JlIGZzaTFfY29yZSA9IHsKKwkudmVyCT0gMSwKKworCS8qIEludGVycnVwdCAqLworCS5pbnRfc3QJPSBJTlRfU1QsCisJLmllbXNrCT0gSUVNU0ssCisJLmltc2sJPSBJTVNLLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmc2lfY29yZSBmc2kyX2NvcmUgPSB7CisJLnZlcgk9IDIsCisKKwkvKiBJbnRlcnJ1cHQgKi8KKwkuaW50X3N0CT0gQ1BVX0lOVF9TVCwKKwkuaWVtc2sJPSBDUFVfSUVNU0ssCisJLmltc2sJPSBDUFVfSU1TSywKKwkuYV9tY2xrCT0gQV9NU1RfQ1RMUiwKKwkuYl9tY2xrCT0gQl9NU1RfQ1RMUiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzaV9vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzaF9mc2kiLAkuZGF0YSA9ICZmc2kxX2NvcmV9LAorCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzaF9mc2kyIiwJLmRhdGEgPSAmZnNpMl9jb3JlfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBmc2lfb2ZfbWF0Y2gpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBmc2lfaWRfdGFibGVbXSA9IHsKKwl7ICJzaF9mc2kiLAkoa2VybmVsX3Vsb25nX3QpJmZzaTFfY29yZSB9LAorCXsgInNoX2ZzaTIiLAkoa2VybmVsX3Vsb25nX3QpJmZzaTJfY29yZSB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIGZzaV9pZF90YWJsZSk7CisKIHN0YXRpYyBpbnQgZnNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IGZzaV9tYXN0ZXIgKm1hc3RlcjsKQEAgLTIwNzIsNDAgKzIxMDUsNiBAQAogCS5yZXN1bWUJCQk9IGZzaV9yZXN1bWUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGZzaV9jb3JlIGZzaTFfY29yZSA9IHsKLQkudmVyCT0gMSwKLQotCS8qIEludGVycnVwdCAqLwotCS5pbnRfc3QJPSBJTlRfU1QsCi0JLmllbXNrCT0gSUVNU0ssCi0JLmltc2sJPSBJTVNLLAotfTsKLQotc3RhdGljIHN0cnVjdCBmc2lfY29yZSBmc2kyX2NvcmUgPSB7Ci0JLnZlcgk9IDIsCi0KLQkvKiBJbnRlcnJ1cHQgKi8KLQkuaW50X3N0CT0gQ1BVX0lOVF9TVCwKLQkuaWVtc2sJPSBDUFVfSUVNU0ssCi0JLmltc2sJPSBDUFVfSU1TSywKLQkuYV9tY2xrCT0gQV9NU1RfQ1RMUiwKLQkuYl9tY2xrCT0gQl9NU1RfQ1RMUiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzaV9vZl9tYXRjaFtdID0gewotCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzaF9mc2kiLAkuZGF0YSA9ICZmc2kxX2NvcmV9LAotCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxzaF9mc2kyIiwJLmRhdGEgPSAmZnNpMl9jb3JlfSwKLQl7fSwKLX07Ci1NT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBmc2lfb2ZfbWF0Y2gpOwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBmc2lfaWRfdGFibGVbXSA9IHsKLQl7ICJzaF9mc2kiLAkoa2VybmVsX3Vsb25nX3QpJmZzaTFfY29yZSB9LAotCXsgInNoX2ZzaTIiLAkoa2VybmVsX3Vsb25nX3QpJmZzaTJfY29yZSB9LAotCXt9LAotfTsKLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIGZzaV9pZF90YWJsZSk7Ci0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZzaV9kcml2ZXIgPSB7CiAJLmRyaXZlciAJPSB7CiAJCS5uYW1lCT0gImZzaS1wY20tYXVkaW8iLApAQCAtMjExOSw3ICsyMTE4LDcgQEAKIAogbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihmc2lfZHJpdmVyKTsKIAotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlckggb25jaGlwIEZTSSBhdWRpbyBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkt1bmlub3JpIE1vcmltb3RvIDxtb3JpbW90by5rdW5pbm9yaUByZW5lc2FzLmNvbT4iKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06ZnNpLXBjbS1hdWRpbyIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvTWFrZWZpbGUgYi9zb3VuZC9zb2Mvc2gvcmNhci9NYWtlZmlsZQppbmRleCA5YWM1MzY0Li5mMWI0NDUxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9NYWtlZmlsZQorKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9NYWtlZmlsZQpAQCAtMSwyICsxLDUgQEAKLXNuZC1zb2MtcmNhci1vYmpzCTo9IGNvcmUubyBnZW4ubyBzcmMubyBhZGcubyBzc2kubyBkdmMubwotb2JqLSQoQ09ORklHX1NORF9TT0NfUkNBUikJKz0gc25kLXNvYy1yY2FyLm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitzbmQtc29jLXJjYXItb2Jqcwk6PSBjb3JlLm8gZ2VuLm8gZG1hLm8gc3JjLm8gYWRnLm8gc3NpLm8gZHZjLm8KK29iai0kKENPTkZJR19TTkRfU09DX1JDQVIpCSs9IHNuZC1zb2MtcmNhci5vCisKK3NuZC1zb2MtcnNyYy1jYXJkLW9ianMJOj0gcnNyYy1jYXJkLm8KK29iai0kKENPTkZJR19TTkRfU09DX1JTUkNfQ0FSRCkJKz0gc25kLXNvYy1yc3JjLWNhcmQubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvYWRnLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9hZGcuYwppbmRleCA3YWMzNWM5Li5mZWZjODgxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9hZGcuYworKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9hZGcuYwpAQCAtMTgzLDYgKzE4Myw4IEBACiAKIAlyc25kX21vZF9ic2V0KG1vZCwgRElWX0VOLCBlbiwgZW4pOwogCisJZGV2X2RiZyhkZXYsICJjb252ZXJ0IHJhdGUgJWQgPC0+ICVkXG4iLCBzcmNfcmF0ZSwgZHN0X3JhdGUpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQzMiw3ICs0MzQsNSBAQAogCiAJcHJpdi0+YWRnID0gYWRnOwogCi0JZGV2X2RiZyhkZXYsICJhZGcgcHJvYmVkXG4iKTsKLQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvY29yZS5jIGIvc291bmQvc29jL3NoL3JjYXIvY29yZS5jCmluZGV4IDExMDU3N2M1Li45ZjQ4ZDc1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9jb3JlLmMKKysrIGIvc291bmQvc29jL3NoL3JjYXIvY29yZS5jCkBAIC05NCwyMSArOTQsMjAgQEAKICAqCiAgKi8KICNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvc2hkbWEtYmFzZS5oPgogI2luY2x1ZGUgInJzbmQuaCIKIAogI2RlZmluZSBSU05EX1JBVEVTIFNORFJWX1BDTV9SQVRFXzgwMDBfOTYwMDAKICNkZWZpbmUgUlNORF9GTVRTIChTTkRSVl9QQ01fRk1UQklUX1MyNF9MRSB8IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFKQogCi1zdGF0aWMgc3RydWN0IHJzbmRfb2ZfZGF0YSByc25kX29mX2RhdGFfZ2VuMSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhIHJzbmRfb2ZfZGF0YV9nZW4xID0gewogCS5mbGFncyA9IFJTTkRfR0VOMSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcnNuZF9vZl9kYXRhIHJzbmRfb2ZfZGF0YV9nZW4yID0geworc3RhdGljIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgcnNuZF9vZl9kYXRhX2dlbjIgPSB7CiAJLmZsYWdzID0gUlNORF9HRU4yLAogfTsKIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgcnNuZF9vZl9tYXRjaFtdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgcnNuZF9vZl9tYXRjaFtdID0gewogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyY2FyX3NvdW5kLWdlbjEiLCAuZGF0YSA9ICZyc25kX29mX2RhdGFfZ2VuMSB9LAogCXsgLmNvbXBhdGlibGUgPSAicmVuZXNhcyxyY2FyX3NvdW5kLWdlbjIiLCAuZGF0YSA9ICZyc25kX29mX2RhdGFfZ2VuMiB9LAogCXt9LApAQCAtMTM4LDI0OSArMTM3LDM3IEBACiAJcmV0dXJuIG1vZC0+b3BzLT5uYW1lOwogfQogCi1jaGFyICpyc25kX21vZF9kbWFfbmFtZShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKK3N0cnVjdCBkbWFfY2hhbiAqcnNuZF9tb2RfZG1hX3JlcShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKIHsKLQlpZiAoIW1vZCB8fCAhbW9kLT5vcHMpCi0JCXJldHVybiAidW5rbm93biI7CisJaWYgKCFtb2QgfHwgIW1vZC0+b3BzIHx8ICFtb2QtPm9wcy0+ZG1hX3JlcSkKKwkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoIW1vZC0+b3BzLT5kbWFfbmFtZSkKLQkJcmV0dXJuIG1vZC0+b3BzLT5uYW1lOwotCi0JcmV0dXJuIG1vZC0+b3BzLT5kbWFfbmFtZShtb2QpOworCXJldHVybiBtb2QtPm9wcy0+ZG1hX3JlcShtb2QpOwogfQogCi12b2lkIHJzbmRfbW9kX2luaXQoc3RydWN0IHJzbmRfbW9kICptb2QsCitpbnQgcnNuZF9tb2RfaW5pdChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKIAkJICAgc3RydWN0IHJzbmRfbW9kX29wcyAqb3BzLAogCQkgICBzdHJ1Y3QgY2xrICpjbGssCiAJCSAgIGVudW0gcnNuZF9tb2RfdHlwZSB0eXBlLAogCQkgICBpbnQgaWQpCiB7CisJaW50IHJldCA9IGNsa19wcmVwYXJlKGNsayk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJbW9kLT5pZAkJPSBpZDsKIAltb2QtPm9wcwk9IG9wczsKIAltb2QtPnR5cGUJPSB0eXBlOwogCW1vZC0+Y2xrCT0gY2xrOworCisJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqCXJzbmRfZG1hIGZ1bmN0aW9ucwotICovCi12b2lkIHJzbmRfZG1hX3N0b3Aoc3RydWN0IHJzbmRfZG1hICpkbWEpCit2b2lkIHJzbmRfbW9kX3F1aXQoc3RydWN0IHJzbmRfbW9kICptb2QpCiB7Ci0JZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoZG1hLT5jaGFuKTsKLX0KLQotc3RhdGljIHZvaWQgcnNuZF9kbWFfY29tcGxldGUodm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgcnNuZF9kbWEgKmRtYSA9IChzdHJ1Y3QgcnNuZF9kbWEgKilkYXRhOwotCXN0cnVjdCByc25kX21vZCAqbW9kID0gcnNuZF9kbWFfdG9fbW9kKGRtYSk7Ci0Jc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSByc25kX21vZF90b19pbyhtb2QpOwotCi0JLyoKLQkgKiBSZW5lc2FzIHNvdW5kIEdlbjEgbmVlZHMgMSBETUFDLAotCSAqIEdlbjIgbmVlZHMgMiBETUFDLgotCSAqIEluIEdlbjIgY2FzZSwgaXQgYXJlIEF1ZGlvLURNQUMsIGFuZCBBdWRpby1ETUFDLXBlcmktcGVyaS4KLQkgKiBCdXQsIEF1ZGlvLURNQUMtcGVyaS1wZXJpIGRvZXNuJ3QgaGF2ZSBpbnRlcnJ1cHQsCi0JICogYW5kIHRoaXMgZHJpdmVyIGlzIGFzc3VtaW5nIHRoYXQgaGVyZS4KLQkgKgotCSAqIElmIEF1ZGlvLURNQUMtcGVyaS1wZXJpIGhhcyBpbnRlcnJwdCwKLQkgKiByc25kX2RhaV9wb2ludGVyX3VwZGF0ZSgpIHdpbGwgYmUgY2FsbGVkIHR3aWNlLAotCSAqIGFudCBpdCB3aWxsIGJyZWFrcyBpby0+Ynl0ZV9wb3MKLQkgKi8KLQotCXJzbmRfZGFpX3BvaW50ZXJfdXBkYXRlKGlvLCBpby0+Ynl0ZV9wZXJfcGVyaW9kKTsKLX0KLQotdm9pZCByc25kX2RtYV9zdGFydChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkKLXsKLQlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCA9IHJzbmRfZG1hX3RvX21vZChkbWEpOwotCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7Ci0Jc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSByc25kX21vZF90b19pbyhtb2QpOwotCXN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtID0gaW8tPnN1YnN0cmVhbTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwotCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYzsKLQotCWRlc2MgPSBkbWFlbmdpbmVfcHJlcF9kbWFfY3ljbGljKGRtYS0+Y2hhbiwKLQkJCQkJIChkbWEtPmFkZHIpID8gZG1hLT5hZGRyIDoKLQkJCQkJIHN1YnN0cmVhbS0+cnVudGltZS0+ZG1hX2FkZHIsCi0JCQkJCSBzbmRfcGNtX2xpYl9idWZmZXJfYnl0ZXMoc3Vic3RyZWFtKSwKLQkJCQkJIHNuZF9wY21fbGliX3BlcmlvZF9ieXRlcyhzdWJzdHJlYW0pLAotCQkJCQkgZG1hLT5kaXIsCi0JCQkJCSBETUFfUFJFUF9JTlRFUlJVUFQgfCBETUFfQ1RSTF9BQ0spOwotCi0JaWYgKCFkZXNjKSB7Ci0JCWRldl9lcnIoZGV2LCAiZG1hZW5naW5lX3ByZXBfc2xhdmVfc2coKSBmYWlsXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWRlc2MtPmNhbGxiYWNrCQk9IHJzbmRfZG1hX2NvbXBsZXRlOwotCWRlc2MtPmNhbGxiYWNrX3BhcmFtCT0gZG1hOwotCi0JaWYgKGRtYWVuZ2luZV9zdWJtaXQoZGVzYykgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiZG1hZW5naW5lX3N1Ym1pdCgpIGZhaWxcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoZG1hLT5jaGFuKTsKLX0KLQotaW50IHJzbmRfZG1hX2F2YWlsYWJsZShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkKLXsKLQlyZXR1cm4gISFkbWEtPmNoYW47Ci19Ci0KLSNkZWZpbmUgRE1BX05BTUVfU0laRSAxNgotI2RlZmluZSBNT0RfTUFYIDQgLyogTUVNL1NTSS9TUkMvRFZDICovCi1zdGF0aWMgaW50IF9yc25kX2RtYV9vZl9uYW1lKGNoYXIgKmRtYV9uYW1lLCBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKLXsKLQlpZiAobW9kKQotCQlyZXR1cm4gc25wcmludGYoZG1hX25hbWUsIERNQV9OQU1FX1NJWkUgLyAyLCAiJXMlZCIsCi0JCQkgcnNuZF9tb2RfZG1hX25hbWUobW9kKSwgcnNuZF9tb2RfaWQobW9kKSk7Ci0JZWxzZQotCQlyZXR1cm4gc25wcmludGYoZG1hX25hbWUsIERNQV9OQU1FX1NJWkUgLyAyLCAibWVtIik7Ci0KLX0KLQotc3RhdGljIHZvaWQgcnNuZF9kbWFfb2ZfbmFtZShzdHJ1Y3QgcnNuZF9tb2QgKm1vZF9mcm9tLAotCQkJICAgICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZF90bywKLQkJCSAgICAgY2hhciAqZG1hX25hbWUpCi17Ci0JaW50IGluZGV4ID0gMDsKLQotCWluZGV4ID0gX3JzbmRfZG1hX29mX25hbWUoZG1hX25hbWUgKyBpbmRleCwgbW9kX2Zyb20pOwotCSooZG1hX25hbWUgKyBpbmRleCsrKSA9ICdfJzsKLQlpbmRleCA9IF9yc25kX2RtYV9vZl9uYW1lKGRtYV9uYW1lICsgaW5kZXgsIG1vZF90byk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJzbmRfZG1hX29mX3BhdGgoc3RydWN0IHJzbmRfZG1hICpkbWEsCi0JCQkgICAgIGludCBpc19wbGF5LAotCQkJICAgICBzdHJ1Y3QgcnNuZF9tb2QgKiptb2RfZnJvbSwKLQkJCSAgICAgc3RydWN0IHJzbmRfbW9kICoqbW9kX3RvKQotewotCXN0cnVjdCByc25kX21vZCAqdGhpcyA9IHJzbmRfZG1hX3RvX21vZChkbWEpOwotCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvID0gcnNuZF9tb2RfdG9faW8odGhpcyk7Ci0Jc3RydWN0IHJzbmRfbW9kICpzc2kgPSByc25kX2lvX3RvX21vZF9zc2koaW8pOwotCXN0cnVjdCByc25kX21vZCAqc3JjID0gcnNuZF9pb190b19tb2Rfc3JjKGlvKTsKLQlzdHJ1Y3QgcnNuZF9tb2QgKmR2YyA9IHJzbmRfaW9fdG9fbW9kX2R2Yyhpbyk7Ci0Jc3RydWN0IHJzbmRfbW9kICptb2RbTU9EX01BWF07Ci0JaW50IGksIGluZGV4OwotCi0KLQlmb3IgKGkgPSAwOyBpIDwgTU9EX01BWDsgaSsrKQotCQltb2RbaV0gPSBOVUxMOwotCi0JLyoKLQkgKiBpbiBwbGF5IGNhc2UuLi4KLQkgKgotCSAqIHNyYyAtPiBkc3QKLQkgKgotCSAqIG1lbSAtPiBTU0kKLQkgKiBtZW0gLT4gU1JDIC0+IFNTSQotCSAqIG1lbSAtPiBTUkMgLT4gRFZDIC0+IFNTSQotCSAqLwotCW1vZFswXSA9IE5VTEw7IC8qIGZvciAibWVtIiAqLwotCWluZGV4ID0gMTsKLQlmb3IgKGkgPSAxOyBpIDwgTU9EX01BWDsgaSsrKSB7Ci0JCWlmICghc3JjKSB7Ci0JCQltb2RbaV0gPSBzc2k7Ci0JCX0gZWxzZSBpZiAoIWR2YykgewotCQkJbW9kW2ldID0gc3JjOwotCQkJc3JjID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCWlmICgoIWlzX3BsYXkpICYmICh0aGlzID09IHNyYykpCi0JCQkJdGhpcyA9IGR2YzsKLQotCQkJbW9kW2ldID0gKGlzX3BsYXkpID8gc3JjIDogZHZjOwotCQkJaSsrOwotCQkJbW9kW2ldID0gKGlzX3BsYXkpID8gZHZjIDogc3JjOwotCQkJc3JjID0gTlVMTDsKLQkJCWR2YyA9IE5VTEw7Ci0JCX0KLQotCQlpZiAobW9kW2ldID09IHRoaXMpCi0JCQlpbmRleCA9IGk7Ci0KLQkJaWYgKG1vZFtpXSA9PSBzc2kpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaXNfcGxheSkgewotCQkqbW9kX2Zyb20gPSBtb2RbaW5kZXggLSAxXTsKLQkJKm1vZF90byAgID0gbW9kW2luZGV4XTsKLQl9IGVsc2UgewotCQkqbW9kX2Zyb20gPSBtb2RbaW5kZXhdOwotCQkqbW9kX3RvICAgPSBtb2RbaW5kZXggLSAxXTsKLQl9Ci19Ci0KLWludCByc25kX2RtYV9pbml0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIHN0cnVjdCByc25kX2RtYSAqZG1hLAotCQkgIGludCBpc19wbGF5LCBpbnQgaWQpCi17Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKLQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBjZmc7Ci0Jc3RydWN0IHJzbmRfbW9kICptb2RfZnJvbTsKLQlzdHJ1Y3QgcnNuZF9tb2QgKm1vZF90bzsKLQljaGFyIGRtYV9uYW1lW0RNQV9OQU1FX1NJWkVdOwotCWRtYV9jYXBfbWFza190IG1hc2s7Ci0JaW50IHJldDsKLQotCWlmIChkbWEtPmNoYW4pIHsKLQkJZGV2X2VycihkZXYsICJpdCBhbHJlYWR5IGhhcyBkbWEgY2hhbm5lbFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWRtYV9jYXBfemVybyhtYXNrKTsKLQlkbWFfY2FwX3NldChETUFfU0xBVkUsIG1hc2spOwotCi0JcnNuZF9kbWFfb2ZfcGF0aChkbWEsIGlzX3BsYXksICZtb2RfZnJvbSwgJm1vZF90byk7Ci0JcnNuZF9kbWFfb2ZfbmFtZShtb2RfZnJvbSwgbW9kX3RvLCBkbWFfbmFtZSk7Ci0KLQljZmcuc2xhdmVfaWQJPSBpZDsKLQljZmcuZGlyZWN0aW9uCT0gaXNfcGxheSA/IERNQV9NRU1fVE9fREVWIDogRE1BX0RFVl9UT19NRU07Ci0JY2ZnLnNyY19hZGRyCT0gcnNuZF9nZW5fZG1hX2FkZHIocHJpdiwgbW9kX2Zyb20sIGlzX3BsYXksIDEpOwotCWNmZy5kc3RfYWRkcgk9IHJzbmRfZ2VuX2RtYV9hZGRyKHByaXYsIG1vZF90bywgICBpc19wbGF5LCAwKTsKLQljZmcuc3JjX2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzsKLQljZmcuZHN0X2FkZHJfd2lkdGggPSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzsKLQotCWRldl9kYmcoZGV2LCAiZG1hIDogJXMgJXBhZCAtPiAlcGFkXG4iLAotCQlkbWFfbmFtZSwgJmNmZy5zcmNfYWRkciwgJmNmZy5kc3RfYWRkcik7Ci0KLQlkbWEtPmNoYW4gPSBkbWFfcmVxdWVzdF9zbGF2ZV9jaGFubmVsX2NvbXBhdChtYXNrLCBzaGRtYV9jaGFuX2ZpbHRlciwKLQkJCQkJCSAgICAgKHZvaWQgKilpZCwgZGV2LAotCQkJCQkJICAgICBkbWFfbmFtZSk7Ci0JaWYgKCFkbWEtPmNoYW4pIHsKLQkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgZG1hIGNoYW5uZWxcbiIpOwotCQlnb3RvIHJzbmRfZG1hX2NoYW5uZWxfZXJyOwotCX0KLQotCXJldCA9IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoZG1hLT5jaGFuLCAmY2ZnKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byByc25kX2RtYV9pbml0X2VycjsKLQotCWRtYS0+YWRkciA9IGlzX3BsYXkgPyBjZmcuc3JjX2FkZHIgOiBjZmcuZHN0X2FkZHI7Ci0JZG1hLT5kaXIgPSBpc19wbGF5ID8gRE1BX01FTV9UT19ERVYgOiBETUFfREVWX1RPX01FTTsKLQotCXJldHVybiAwOwotCi1yc25kX2RtYV9pbml0X2VycjoKLQlyc25kX2RtYV9xdWl0KHByaXYsIGRtYSk7Ci1yc25kX2RtYV9jaGFubmVsX2VycjoKLQotCS8qCi0JICogRE1BIGZhaWxlZC4gdHJ5IHRvIFBJTyBtb2RlCi0JICogc2VlCi0JICoJcnNuZF9zc2lfZmFsbGJhY2soKQotCSAqCXJzbmRfcmRhaV9jb250aW51YW5jZV9wcm9iZSgpCi0JICovCi0JcmV0dXJuIC1FQUdBSU47Ci19Ci0KLXZvaWQgIHJzbmRfZG1hX3F1aXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJICAgIHN0cnVjdCByc25kX2RtYSAqZG1hKQotewotCWlmIChkbWEtPmNoYW4pCi0JCWRtYV9yZWxlYXNlX2NoYW5uZWwoZG1hLT5jaGFuKTsKLQotCWRtYS0+Y2hhbiA9IE5VTEw7CisJaWYgKG1vZC0+Y2xrKQorCQljbGtfdW5wcmVwYXJlKG1vZC0+Y2xrKTsKIH0KIAogLyoKQEAgLTQxNiw3ICsyMDMsNyBAQAogKHsJCQkJCQkJCVwKIAlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwkJXAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CQlcCi0JdTMyIG1hc2sgPSAxIDw8IF9fcnNuZF9tb2Rfc2hpZnRfIyNmdW5jOwkJCVwKKwl1MzIgbWFzayA9ICgxIDw8IF9fcnNuZF9tb2Rfc2hpZnRfIyNmdW5jKSAmIH4oMSA8PCAzMSk7CVwKIAl1MzIgY2FsbCA9IF9fcnNuZF9tb2RfY2FsbF8jI2Z1bmMgPDwgX19yc25kX21vZF9zaGlmdF8jI2Z1bmM7CVwKIAlpbnQgcmV0ID0gMDsJCQkJCQkJXAogCWlmICgobW9kLT5zdGF0dXMgJiBtYXNrKSA9PSBjYWxsKSB7CQkJCVwKQEAgLTQ1OCw3ICsyNDUsNyBAQAogCQlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOwogCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwogCi0JCWRldl9lcnIoZGV2LCAiJXMlZCBpcyBub3QgZW1wdHlcbiIsCisJCWRldl9lcnIoZGV2LCAiJXNbJWRdIGlzIG5vdCBlbXB0eVxuIiwKIAkJCXJzbmRfbW9kX25hbWUobW9kKSwKIAkJCXJzbmRfbW9kX2lkKG1vZCkpOwogCQlyZXR1cm4gLUVJTzsKQEAgLTg3NCwyMCArNjYxLDI4IEBACiAJCWRydltpXS5uYW1lCT0gcmRhaVtpXS5uYW1lOwogCQlkcnZbaV0ub3BzCT0gJnJzbmRfc29jX2RhaV9vcHM7CiAJCWlmIChwbW9kKSB7CisJCQlzbnByaW50ZihyZGFpW2ldLnBsYXliYWNrLm5hbWUsIFJTTkRfREFJX05BTUVfU0laRSwKKwkJCQkgIkRBSSVkIFBsYXliYWNrIiwgaSk7CisKIAkJCWRydltpXS5wbGF5YmFjay5yYXRlcwkJPSBSU05EX1JBVEVTOwogCQkJZHJ2W2ldLnBsYXliYWNrLmZvcm1hdHMJCT0gUlNORF9GTVRTOwogCQkJZHJ2W2ldLnBsYXliYWNrLmNoYW5uZWxzX21pbgk9IDI7CiAJCQlkcnZbaV0ucGxheWJhY2suY2hhbm5lbHNfbWF4CT0gMjsKKwkJCWRydltpXS5wbGF5YmFjay5zdHJlYW1fbmFtZQk9IHJkYWlbaV0ucGxheWJhY2submFtZTsKIAogCQkJcmRhaVtpXS5wbGF5YmFjay5pbmZvID0gJmluZm8tPmRhaV9pbmZvW2ldLnBsYXliYWNrOwogCQkJcmRhaVtpXS5wbGF5YmFjay5yZGFpID0gcmRhaSArIGk7CiAJCQlyc25kX3BhdGhfaW5pdChwcml2LCAmcmRhaVtpXSwgJnJkYWlbaV0ucGxheWJhY2spOwogCQl9CiAJCWlmIChjbW9kKSB7CisJCQlzbnByaW50ZihyZGFpW2ldLmNhcHR1cmUubmFtZSwgUlNORF9EQUlfTkFNRV9TSVpFLAorCQkJCSAiREFJJWQgQ2FwdHVyZSIsIGkpOworCiAJCQlkcnZbaV0uY2FwdHVyZS5yYXRlcwkJPSBSU05EX1JBVEVTOwogCQkJZHJ2W2ldLmNhcHR1cmUuZm9ybWF0cwkJPSBSU05EX0ZNVFM7CiAJCQlkcnZbaV0uY2FwdHVyZS5jaGFubmVsc19taW4JPSAyOwogCQkJZHJ2W2ldLmNhcHR1cmUuY2hhbm5lbHNfbWF4CT0gMjsKKwkJCWRydltpXS5jYXB0dXJlLnN0cmVhbV9uYW1lCT0gcmRhaVtpXS5jYXB0dXJlLm5hbWU7CiAKIAkJCXJkYWlbaV0uY2FwdHVyZS5pbmZvID0gJmluZm8tPmRhaV9pbmZvW2ldLmNhcHR1cmU7CiAJCQlyZGFpW2ldLmNhcHR1cmUucmRhaSA9IHJkYWkgKyBpOwpAQCAtOTMzLDYgKzcyOCwxNSBAQAogc3RhdGljIGludCByc25kX2h3X3BhcmFtcyhzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSwKIAkJCSBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmh3X3BhcmFtcykKIHsKKwlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJzbmRfc3Vic3RyZWFtX3RvX2RhaShzdWJzdHJlYW0pOworCXN0cnVjdCByc25kX2RhaSAqcmRhaSA9IHJzbmRfZGFpX3RvX3JkYWkoZGFpKTsKKwlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyA9IHJzbmRfcmRhaV90b19pbyhyZGFpLCBzdWJzdHJlYW0pOworCWludCByZXQ7CisKKwlyZXQgPSByc25kX2RhaV9jYWxsKGh3X3BhcmFtcywgaW8sIHN1YnN0cmVhbSwgaHdfcGFyYW1zKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCiAJcmV0dXJuIHNuZF9wY21fbGliX21hbGxvY19wYWdlcyhzdWJzdHJlYW0sCiAJCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CiB9CkBAIC0xMTk3LDYgKzEwMDEsNyBAQAogCQkJICAgIGNvbnN0IHN0cnVjdCByc25kX29mX2RhdGEgKm9mX2RhdGEsCiAJCQkgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikgPSB7CiAJCXJzbmRfZ2VuX3Byb2JlLAorCQlyc25kX2RtYV9wcm9iZSwKIAkJcnNuZF9zc2lfcHJvYmUsCiAJCXJzbmRfc3JjX3Byb2JlLAogCQlyc25kX2R2Y19wcm9iZSwKQEAgLTEyOTAsNiArMTA5NSwxMiBAQAogewogCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IHJzbmRfZGFpICpyZGFpOworCXZvaWQgKCpyZW1vdmVfZnVuY1tdKShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJICAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikgPSB7CisJCXJzbmRfc3NpX3JlbW92ZSwKKwkJcnNuZF9zcmNfcmVtb3ZlLAorCQlyc25kX2R2Y19yZW1vdmUsCisJfTsKIAlpbnQgcmV0ID0gMCwgaTsKIAogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKQEAgLTEyOTksNiArMTExMCw5IEBACiAJCXJldCB8PSByc25kX2RhaV9jYWxsKHJlbW92ZSwgJnJkYWktPmNhcHR1cmUsIHByaXYpOwogCX0KIAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJlbW92ZV9mdW5jKTsgaSsrKQorCQlyZW1vdmVfZnVuY1tpXShwZGV2LCBwcml2KTsKKwogCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb21wb25lbnQoJnBkZXYtPmRldik7CiAJc25kX3NvY191bnJlZ2lzdGVyX3BsYXRmb3JtKCZwZGV2LT5kZXYpOwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9kbWEuYyBiL3NvdW5kL3NvYy9zaC9yY2FyL2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMzc1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9kbWEuYwpAQCAtMCwwICsxLDYxNiBAQAorLyoKKyAqIFJlbmVzYXMgUi1DYXIgQXVkaW8gRE1BQyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFJlbmVzYXMgRWxlY3Ryb25pY3MgQ29ycC4KKyAqIENvcHlyaWdodCAoYykgMjAxNSBLdW5pbm9yaSBNb3JpbW90byA8a3VuaW5vcmkubW9yaW1vdG8uZ3hAcmVuZXNhcy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZG1hLmg+CisjaW5jbHVkZSAicnNuZC5oIgorCisvKgorICogQXVkaW8gRE1BQyBwZXJpIHBlcmkgcmVnaXN0ZXIKKyAqLworI2RlZmluZSBQRE1BU0FSCQkweDAwCisjZGVmaW5lIFBETUFEQVIJCTB4MDQKKyNkZWZpbmUgUERNQUNIQ1IJMHgwYworCisvKiBQRE1BQ0hDUiAqLworI2RlZmluZSBQRE1BQ0hDUl9ERQkJKDEgPDwgMCkKKworc3RydWN0IHJzbmRfZG1hX2N0cmwgeworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgZG1hcHBfbnVtOworfTsKKworI2RlZmluZSByc25kX3ByaXZfdG9fZG1hYyhwKQkoKHN0cnVjdCByc25kX2RtYV9jdHJsICopKHApLT5kbWEpCisKKy8qCisgKgkJQXVkaW8gRE1BQworICovCitzdGF0aWMgdm9pZCByc25kX2RtYWVuX2NvbXBsZXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJzbmRfZG1hICpkbWEgPSAoc3RydWN0IHJzbmRfZG1hICopZGF0YTsKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCA9IHJzbmRfZG1hX3RvX21vZChkbWEpOworCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvID0gcnNuZF9tb2RfdG9faW8obW9kKTsKKworCS8qCisJICogUmVuZXNhcyBzb3VuZCBHZW4xIG5lZWRzIDEgRE1BQywKKwkgKiBHZW4yIG5lZWRzIDIgRE1BQy4KKwkgKiBJbiBHZW4yIGNhc2UsIGl0IGFyZSBBdWRpby1ETUFDLCBhbmQgQXVkaW8tRE1BQy1wZXJpLXBlcmkuCisJICogQnV0LCBBdWRpby1ETUFDLXBlcmktcGVyaSBkb2Vzbid0IGhhdmUgaW50ZXJydXB0LAorCSAqIGFuZCB0aGlzIGRyaXZlciBpcyBhc3N1bWluZyB0aGF0IGhlcmUuCisJICoKKwkgKiBJZiBBdWRpby1ETUFDLXBlcmktcGVyaSBoYXMgaW50ZXJycHQsCisJICogcnNuZF9kYWlfcG9pbnRlcl91cGRhdGUoKSB3aWxsIGJlIGNhbGxlZCB0d2ljZSwKKwkgKiBhbnQgaXQgd2lsbCBicmVha3MgaW8tPmJ5dGVfcG9zCisJICovCisKKwlyc25kX2RhaV9wb2ludGVyX3VwZGF0ZShpbywgaW8tPmJ5dGVfcGVyX3BlcmlvZCk7Cit9CisKK3N0YXRpYyB2b2lkIHJzbmRfZG1hZW5fc3RvcChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkKK3sKKwlzdHJ1Y3QgcnNuZF9kbWFlbiAqZG1hZW4gPSByc25kX2RtYV90b19kbWFlbihkbWEpOworCisJZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoZG1hZW4tPmNoYW4pOworfQorCitzdGF0aWMgdm9pZCByc25kX2RtYWVuX3N0YXJ0KHN0cnVjdCByc25kX2RtYSAqZG1hKQoreworCXN0cnVjdCByc25kX2RtYWVuICpkbWFlbiA9IHJzbmRfZG1hX3RvX2RtYWVuKGRtYSk7CisJc3RydWN0IHJzbmRfbW9kICptb2QgPSByc25kX2RtYV90b19tb2QoZG1hKTsKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOworCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvID0gcnNuZF9tb2RfdG9faW8obW9kKTsKKwlzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnN1YnN0cmVhbSA9IGlvLT5zdWJzdHJlYW07CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKmRlc2M7CisJaW50IGlzX3BsYXkgPSByc25kX2lvX2lzX3BsYXkoaW8pOworCisJZGVzYyA9IGRtYWVuZ2luZV9wcmVwX2RtYV9jeWNsaWMoZG1hZW4tPmNoYW4sCisJCQkJCSBzdWJzdHJlYW0tPnJ1bnRpbWUtPmRtYV9hZGRyLAorCQkJCQkgc25kX3BjbV9saWJfYnVmZmVyX2J5dGVzKHN1YnN0cmVhbSksCisJCQkJCSBzbmRfcGNtX2xpYl9wZXJpb2RfYnl0ZXMoc3Vic3RyZWFtKSwKKwkJCQkJIGlzX3BsYXkgPyBETUFfTUVNX1RPX0RFViA6IERNQV9ERVZfVE9fTUVNLAorCQkJCQkgRE1BX1BSRVBfSU5URVJSVVBUIHwgRE1BX0NUUkxfQUNLKTsKKworCWlmICghZGVzYykgeworCQlkZXZfZXJyKGRldiwgImRtYWVuZ2luZV9wcmVwX3NsYXZlX3NnKCkgZmFpbFxuIik7CisJCXJldHVybjsKKwl9CisKKwlkZXNjLT5jYWxsYmFjawkJPSByc25kX2RtYWVuX2NvbXBsZXRlOworCWRlc2MtPmNhbGxiYWNrX3BhcmFtCT0gZG1hOworCisJaWYgKGRtYWVuZ2luZV9zdWJtaXQoZGVzYykgPCAwKSB7CisJCWRldl9lcnIoZGV2LCAiZG1hZW5naW5lX3N1Ym1pdCgpIGZhaWxcbiIpOworCQlyZXR1cm47CisJfQorCisJZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoZG1hZW4tPmNoYW4pOworfQorCitzdHJ1Y3QgZG1hX2NoYW4gKnJzbmRfZG1hX3JlcXVlc3RfY2hhbm5lbChzdHJ1Y3QgZGV2aWNlX25vZGUgKm9mX25vZGUsCisJCQkJCSAgc3RydWN0IHJzbmRfbW9kICptb2QsIGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJaW50IGkgPSAwOworCisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShvZl9ub2RlLCBucCkgeworCQlpZiAoaSA9PSByc25kX21vZF9pZChtb2QpKQorCQkJYnJlYWs7CisJCWkrKzsKKwl9CisKKwljaGFuID0gb2ZfZG1hX3JlcXVlc3Rfc2xhdmVfY2hhbm5lbChucCwgbmFtZSk7CisKKwlvZl9ub2RlX3B1dChucCk7CisJb2Zfbm9kZV9wdXQob2Zfbm9kZSk7CisKKwlyZXR1cm4gY2hhbjsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfY2hhbiAqcnNuZF9kbWFlbl9yZXF1ZXN0X2NoYW5uZWwoc3RydWN0IHJzbmRfbW9kICptb2RfZnJvbSwKKwkJCQkJCSAgIHN0cnVjdCByc25kX21vZCAqbW9kX3RvKQoreworCWlmICgoIW1vZF9mcm9tICYmICFtb2RfdG8pIHx8CisJICAgIChtb2RfZnJvbSAmJiBtb2RfdG8pKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChtb2RfZnJvbSkKKwkJcmV0dXJuIHJzbmRfbW9kX2RtYV9yZXEobW9kX2Zyb20pOworCWVsc2UKKwkJcmV0dXJuIHJzbmRfbW9kX2RtYV9yZXEobW9kX3RvKTsKK30KKworc3RhdGljIGludCByc25kX2RtYWVuX2luaXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgc3RydWN0IHJzbmRfZG1hICpkbWEsIGludCBpZCwKKwkJCSAgIHN0cnVjdCByc25kX21vZCAqbW9kX2Zyb20sIHN0cnVjdCByc25kX21vZCAqbW9kX3RvKQoreworCXN0cnVjdCByc25kX2RtYWVuICpkbWFlbiA9IHJzbmRfZG1hX3RvX2RtYWVuKGRtYSk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKwlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyBjZmcgPSB7fTsKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCA9IHJzbmRfZG1hX3RvX21vZChkbWEpOworCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvID0gcnNuZF9tb2RfdG9faW8obW9kKTsKKwlpbnQgaXNfcGxheSA9IHJzbmRfaW9faXNfcGxheShpbyk7CisJaW50IHJldDsKKworCWlmIChkbWFlbi0+Y2hhbikgeworCQlkZXZfZXJyKGRldiwgIml0IGFscmVhZHkgaGFzIGRtYSBjaGFubmVsXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGRldi0+b2Zfbm9kZSkgeworCQlkbWFlbi0+Y2hhbiA9IHJzbmRfZG1hZW5fcmVxdWVzdF9jaGFubmVsKG1vZF9mcm9tLCBtb2RfdG8pOworCX0gZWxzZSB7CisJCWRtYV9jYXBfbWFza190IG1hc2s7CisKKwkJZG1hX2NhcF96ZXJvKG1hc2spOworCQlkbWFfY2FwX3NldChETUFfU0xBVkUsIG1hc2spOworCisJCWRtYWVuLT5jaGFuID0gZG1hX3JlcXVlc3RfY2hhbm5lbChtYXNrLCBzaGRtYV9jaGFuX2ZpbHRlciwKKwkJCQkJCSAgKHZvaWQgKilpZCk7CisJfQorCWlmIChJU19FUlJfT1JfTlVMTChkbWFlbi0+Y2hhbikpIHsKKwkJZGV2X2VycihkZXYsICJjYW4ndCBnZXQgZG1hIGNoYW5uZWxcbiIpOworCQlnb3RvIHJzbmRfZG1hX2NoYW5uZWxfZXJyOworCX0KKworCWNmZy5kaXJlY3Rpb24JPSBpc19wbGF5ID8gRE1BX01FTV9UT19ERVYgOiBETUFfREVWX1RPX01FTTsKKwljZmcuc3JjX2FkZHIJPSBkbWEtPnNyY19hZGRyOworCWNmZy5kc3RfYWRkcgk9IGRtYS0+ZHN0X2FkZHI7CisJY2ZnLnNyY19hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7CisJY2ZnLmRzdF9hZGRyX3dpZHRoID0gRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM7CisKKwlkZXZfZGJnKGRldiwgImRtYSA6ICVwYWQgLT4gJXBhZFxuIiwKKwkJJmNmZy5zcmNfYWRkciwgJmNmZy5kc3RfYWRkcik7CisKKwlyZXQgPSBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKGRtYWVuLT5jaGFuLCAmY2ZnKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byByc25kX2RtYV9pbml0X2VycjsKKworCXJldHVybiAwOworCityc25kX2RtYV9pbml0X2VycjoKKwlyc25kX2RtYV9xdWl0KGRtYSk7Cityc25kX2RtYV9jaGFubmVsX2VycjoKKworCS8qCisJICogRE1BIGZhaWxlZC4gdHJ5IHRvIFBJTyBtb2RlCisJICogc2VlCisJICoJcnNuZF9zc2lfZmFsbGJhY2soKQorCSAqCXJzbmRfcmRhaV9jb250aW51YW5jZV9wcm9iZSgpCisJICovCisJcmV0dXJuIC1FQUdBSU47Cit9CisKK3N0YXRpYyB2b2lkIHJzbmRfZG1hZW5fcXVpdChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkKK3sKKwlzdHJ1Y3QgcnNuZF9kbWFlbiAqZG1hZW4gPSByc25kX2RtYV90b19kbWFlbihkbWEpOworCisJaWYgKGRtYWVuLT5jaGFuKQorCQlkbWFfcmVsZWFzZV9jaGFubmVsKGRtYWVuLT5jaGFuKTsKKworCWRtYWVuLT5jaGFuID0gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCByc25kX2RtYV9vcHMgcnNuZF9kbWFlbl9vcHMgPSB7CisJLnN0YXJ0CT0gcnNuZF9kbWFlbl9zdGFydCwKKwkuc3RvcAk9IHJzbmRfZG1hZW5fc3RvcCwKKwkuaW5pdAk9IHJzbmRfZG1hZW5faW5pdCwKKwkucXVpdAk9IHJzbmRfZG1hZW5fcXVpdCwKK307CisKKy8qCisgKgkJQXVkaW8gRE1BQyBwZXJpIHBlcmkKKyAqLworc3RhdGljIGNvbnN0IHU4IGdlbjJfaWRfdGFibGVfc3NpdVtdID0geworCTB4MDAsIC8qIFNTSTAwICovCisJMHgwNCwgLyogU1NJMTAgKi8KKwkweDA4LCAvKiBTU0kyMCAqLworCTB4MGMsIC8qIFNTSTMgICovCisJMHgwZCwgLyogU1NJNCAgKi8KKwkweDBlLCAvKiBTU0k1ICAqLworCTB4MGYsIC8qIFNTSTYgICovCisJMHgxMCwgLyogU1NJNyAgKi8KKwkweDExLCAvKiBTU0k4ICAqLworCTB4MTIsIC8qIFNTSTkwICovCit9Oworc3RhdGljIGNvbnN0IHU4IGdlbjJfaWRfdGFibGVfc2N1W10gPSB7CisJMHgyZCwgLyogU0NVX1NSQ0kwICovCisJMHgyZSwgLyogU0NVX1NSQ0kxICovCisJMHgyZiwgLyogU0NVX1NSQ0kyICovCisJMHgzMCwgLyogU0NVX1NSQ0kzICovCisJMHgzMSwgLyogU0NVX1NSQ0k0ICovCisJMHgzMiwgLyogU0NVX1NSQ0k1ICovCisJMHgzMywgLyogU0NVX1NSQ0k2ICovCisJMHgzNCwgLyogU0NVX1NSQ0k3ICovCisJMHgzNSwgLyogU0NVX1NSQ0k4ICovCisJMHgzNiwgLyogU0NVX1NSQ0k5ICovCit9Oworc3RhdGljIGNvbnN0IHU4IGdlbjJfaWRfdGFibGVfY21kW10gPSB7CisJMHgzNywgLyogU0NVX0NNRDAgKi8KKwkweDM4LCAvKiBTQ1VfQ01EMSAqLworfTsKKworc3RhdGljIHUzMiByc25kX2RtYXBwX2dldF9pZChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKK3sKKwlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyA9IHJzbmRfbW9kX3RvX2lvKG1vZCk7CisJc3RydWN0IHJzbmRfbW9kICpzc2kgPSByc25kX2lvX3RvX21vZF9zc2koaW8pOworCXN0cnVjdCByc25kX21vZCAqc3JjID0gcnNuZF9pb190b19tb2Rfc3JjKGlvKTsKKwlzdHJ1Y3QgcnNuZF9tb2QgKmR2YyA9IHJzbmRfaW9fdG9fbW9kX2R2Yyhpbyk7CisJY29uc3QgdTggKmVudHJ5ID0gTlVMTDsKKwlpbnQgaWQgPSByc25kX21vZF9pZChtb2QpOworCWludCBzaXplID0gMDsKKworCWlmIChtb2QgPT0gc3NpKSB7CisJCWVudHJ5ID0gZ2VuMl9pZF90YWJsZV9zc2l1OworCQlzaXplID0gQVJSQVlfU0laRShnZW4yX2lkX3RhYmxlX3NzaXUpOworCX0gZWxzZSBpZiAobW9kID09IHNyYykgeworCQllbnRyeSA9IGdlbjJfaWRfdGFibGVfc2N1OworCQlzaXplID0gQVJSQVlfU0laRShnZW4yX2lkX3RhYmxlX3NjdSk7CisJfSBlbHNlIGlmIChtb2QgPT0gZHZjKSB7CisJCWVudHJ5ID0gZ2VuMl9pZF90YWJsZV9jbWQ7CisJCXNpemUgPSBBUlJBWV9TSVpFKGdlbjJfaWRfdGFibGVfY21kKTsKKwl9CisKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm4gMHhGRjsKKworCWlmIChzaXplIDw9IGlkKQorCQlyZXR1cm4gMHhGRjsKKworCXJldHVybiBlbnRyeVtpZF07Cit9CisKK3N0YXRpYyB1MzIgcnNuZF9kbWFwcF9nZXRfY2hjcihzdHJ1Y3QgcnNuZF9tb2QgKm1vZF9mcm9tLAorCQkJICAgICAgIHN0cnVjdCByc25kX21vZCAqbW9kX3RvKQoreworCXJldHVybgkocnNuZF9kbWFwcF9nZXRfaWQobW9kX2Zyb20pIDw8IDI0KSArCisJCShyc25kX2RtYXBwX2dldF9pZChtb2RfdG8pIDw8IDE2KTsKK30KKworI2RlZmluZSByc25kX2RtYXBwX2FkZHIoZG1hYywgZG1hLCByZWcpIFwKKwkoZG1hYy0+YmFzZSArIDB4MjAgKyByZWcgKyBcCisJICgweDEwICogcnNuZF9kbWFfdG9fZG1hcHAoZG1hKS0+ZG1hcHBfaWQpKQorc3RhdGljIHZvaWQgcnNuZF9kbWFwcF93cml0ZShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwgdTMyIGRhdGEsIHUzMiByZWcpCit7CisJc3RydWN0IHJzbmRfbW9kICptb2QgPSByc25kX2RtYV90b19tb2QoZG1hKTsKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOworCXN0cnVjdCByc25kX2RtYV9jdHJsICpkbWFjID0gcnNuZF9wcml2X3RvX2RtYWMocHJpdik7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKworCWRldl9kYmcoZGV2LCAidyAlcCA6ICUwOHhcbiIsIHJzbmRfZG1hcHBfYWRkcihkbWFjLCBkbWEsIHJlZyksIGRhdGEpOworCisJaW93cml0ZTMyKGRhdGEsIHJzbmRfZG1hcHBfYWRkcihkbWFjLCBkbWEsIHJlZykpOworfQorCitzdGF0aWMgdTMyIHJzbmRfZG1hcHBfcmVhZChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwgdTMyIHJlZykKK3sKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCA9IHJzbmRfZG1hX3RvX21vZChkbWEpOworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CisJc3RydWN0IHJzbmRfZG1hX2N0cmwgKmRtYWMgPSByc25kX3ByaXZfdG9fZG1hYyhwcml2KTsKKworCXJldHVybiBpb3JlYWQzMihyc25kX2RtYXBwX2FkZHIoZG1hYywgZG1hLCByZWcpKTsKK30KKworc3RhdGljIHZvaWQgcnNuZF9kbWFwcF9zdG9wKHN0cnVjdCByc25kX2RtYSAqZG1hKQoreworCWludCBpOworCisJcnNuZF9kbWFwcF93cml0ZShkbWEsIDAsIFBETUFDSENSKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKKwkJaWYgKDAgPT0gcnNuZF9kbWFwcF9yZWFkKGRtYSwgUERNQUNIQ1IpKQorCQkJcmV0dXJuOworCQl1ZGVsYXkoMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCByc25kX2RtYXBwX3N0YXJ0KHN0cnVjdCByc25kX2RtYSAqZG1hKQoreworCXN0cnVjdCByc25kX2RtYXBwICpkbWFwcCA9IHJzbmRfZG1hX3RvX2RtYXBwKGRtYSk7CisKKwlyc25kX2RtYXBwX3dyaXRlKGRtYSwgZG1hLT5zcmNfYWRkciwJUERNQVNBUik7CisJcnNuZF9kbWFwcF93cml0ZShkbWEsIGRtYS0+ZHN0X2FkZHIsCVBETUFEQVIpOworCXJzbmRfZG1hcHBfd3JpdGUoZG1hLCBkbWFwcC0+Y2hjciwJUERNQUNIQ1IpOworfQorCitzdGF0aWMgaW50IHJzbmRfZG1hcHBfaW5pdChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LCBzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwgaW50IGlkLAorCQkJICAgc3RydWN0IHJzbmRfbW9kICptb2RfZnJvbSwgc3RydWN0IHJzbmRfbW9kICptb2RfdG8pCit7CisJc3RydWN0IHJzbmRfZG1hcHAgKmRtYXBwID0gcnNuZF9kbWFfdG9fZG1hcHAoZG1hKTsKKwlzdHJ1Y3QgcnNuZF9kbWFfY3RybCAqZG1hYyA9IHJzbmRfcHJpdl90b19kbWFjKHByaXYpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CisKKwlkbWFwcC0+ZG1hcHBfaWQgPSBkbWFjLT5kbWFwcF9udW07CisJZG1hcHAtPmNoY3IgPSByc25kX2RtYXBwX2dldF9jaGNyKG1vZF9mcm9tLCBtb2RfdG8pIHwgUERNQUNIQ1JfREU7CisKKwlkbWFjLT5kbWFwcF9udW0rKzsKKworCXJzbmRfZG1hcHBfc3RvcChkbWEpOworCisJZGV2X2RiZyhkZXYsICJpZC9zcmMvZHN0L2NoY3IgPSAlZC8lcGFkLyVwYWQvJTA4eFxuIiwKKwkJZG1hcHAtPmRtYXBwX2lkLCAmZG1hLT5zcmNfYWRkciwgJmRtYS0+ZHN0X2FkZHIsIGRtYXBwLT5jaGNyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHJzbmRfZG1hX29wcyByc25kX2RtYXBwX29wcyA9IHsKKwkuc3RhcnQJPSByc25kX2RtYXBwX3N0YXJ0LAorCS5zdG9wCT0gcnNuZF9kbWFwcF9zdG9wLAorCS5pbml0CT0gcnNuZF9kbWFwcF9pbml0LAorCS5xdWl0CT0gcnNuZF9kbWFwcF9zdG9wLAorfTsKKworLyoKKyAqCQlDb21tb24gRE1BQyBJbnRlcmZhY2UKKyAqLworCisvKgorICoJRE1BIHJlYWQvd3JpdGUgcmVnaXN0ZXIgb2Zmc2V0CisgKgorICoJUlNORF94eHhfSV9OCWZvciBBdWRpbyBETUFDIGlucHV0CisgKglSU05EX3h4eF9PX04JZm9yIEF1ZGlvIERNQUMgb3V0cHV0CisgKglSU05EX3h4eF9JX1AJZm9yIEF1ZGlvIERNQUMgcGVyaSBwZXJpIGlucHV0CisgKglSU05EX3h4eF9PX1AJZm9yIEF1ZGlvIERNQUMgcGVyaSBwZXJpIG91dHB1dAorICoKKyAqCWV4KSBSLUNhciBIMiBjYXNlCisgKgkgICAgICBtb2QgICAgICAgIC8gRE1BQyBpbiAgICAvIERNQUMgb3V0ICAgLyBETUFDIFBQIGluIC8gRE1BQyBwcCBvdXQKKyAqCVNTSSA6IDB4ZWM1NDEwMDAgLyAweGVjMjQxMDA4IC8gMHhlYzI0MTAwYworICoJU1NJVTogMHhlYzU0MTAwMCAvIDB4ZWMxMDAwMDAgLyAweGVjMTAwMDAwIC8gMHhlYzQwMDAwMCAvIDB4ZWM0MDAwMDAKKyAqCVNDVSA6IDB4ZWM1MDAwMDAgLyAweGVjMDAwMDAwIC8gMHhlYzAwNDAwMCAvIDB4ZWMzMDAwMDAgLyAweGVjMzA0MDAwCisgKglDTUQgOiAweGVjNTAwMDAwIC8gICAgICAgICAgICAvIDB4ZWMwMDgwMDAgICAgICAgICAgICAgICAgMHhlYzMwODAwMAorICovCisjZGVmaW5lIFJETUFfU1NJX0lfTihhZGRyLCBpKQkoYWRkciAjI19yZWcgLSAweDAwMzAwMDAwICsgKDB4NDAgKiBpKSArIDB4OCkKKyNkZWZpbmUgUkRNQV9TU0lfT19OKGFkZHIsIGkpCShhZGRyICMjX3JlZyAtIDB4MDAzMDAwMDAgKyAoMHg0MCAqIGkpICsgMHhjKQorCisjZGVmaW5lIFJETUFfU1NJVV9JX04oYWRkciwgaSkJKGFkZHIgIyNfcmVnIC0gMHgwMDQ0MTAwMCArICgweDEwMDAgKiBpKSkKKyNkZWZpbmUgUkRNQV9TU0lVX09fTihhZGRyLCBpKQkoYWRkciAjI19yZWcgLSAweDAwNDQxMDAwICsgKDB4MTAwMCAqIGkpKQorCisjZGVmaW5lIFJETUFfU1NJVV9JX1AoYWRkciwgaSkJKGFkZHIgIyNfcmVnIC0gMHgwMDE0MTAwMCArICgweDEwMDAgKiBpKSkKKyNkZWZpbmUgUkRNQV9TU0lVX09fUChhZGRyLCBpKQkoYWRkciAjI19yZWcgLSAweDAwMTQxMDAwICsgKDB4MTAwMCAqIGkpKQorCisjZGVmaW5lIFJETUFfU1JDX0lfTihhZGRyLCBpKQkoYWRkciAjI19yZWcgLSAweDAwNTAwMDAwICsgKDB4NDAwICogaSkpCisjZGVmaW5lIFJETUFfU1JDX09fTihhZGRyLCBpKQkoYWRkciAjI19yZWcgLSAweDAwNGZjMDAwICsgKDB4NDAwICogaSkpCisKKyNkZWZpbmUgUkRNQV9TUkNfSV9QKGFkZHIsIGkpCShhZGRyICMjX3JlZyAtIDB4MDAyMDAwMDAgKyAoMHg0MDAgKiBpKSkKKyNkZWZpbmUgUkRNQV9TUkNfT19QKGFkZHIsIGkpCShhZGRyICMjX3JlZyAtIDB4MDAxZmMwMDAgKyAoMHg0MDAgKiBpKSkKKworI2RlZmluZSBSRE1BX0NNRF9PX04oYWRkciwgaSkJKGFkZHIgIyNfcmVnIC0gMHgwMDRmODAwMCArICgweDQwMCAqIGkpKQorI2RlZmluZSBSRE1BX0NNRF9PX1AoYWRkciwgaSkJKGFkZHIgIyNfcmVnIC0gMHgwMDFmODAwMCArICgweDQwMCAqIGkpKQorCitzdGF0aWMgZG1hX2FkZHJfdAorcnNuZF9nZW4yX2RtYV9hZGRyKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCisJCSAgIHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkgICBpbnQgaXNfcGxheSwgaW50IGlzX2Zyb20pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKKwlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyA9IHJzbmRfbW9kX3RvX2lvKG1vZCk7CisJcGh5c19hZGRyX3Qgc3NpX3JlZyA9IHJzbmRfZ2VuX2dldF9waHlfYWRkcihwcml2LCBSU05EX0dFTjJfU1NJKTsKKwlwaHlzX2FkZHJfdCBzcmNfcmVnID0gcnNuZF9nZW5fZ2V0X3BoeV9hZGRyKHByaXYsIFJTTkRfR0VOMl9TQ1UpOworCWludCBpc19zc2kgPSAhIShyc25kX2lvX3RvX21vZF9zc2koaW8pID09IG1vZCk7CisJaW50IHVzZV9zcmMgPSAhIXJzbmRfaW9fdG9fbW9kX3NyYyhpbyk7CisJaW50IHVzZV9kdmMgPSAhIXJzbmRfaW9fdG9fbW9kX2R2Yyhpbyk7CisJaW50IGlkID0gcnNuZF9tb2RfaWQobW9kKTsKKwlzdHJ1Y3QgZG1hX2FkZHIgeworCQlkbWFfYWRkcl90IG91dF9hZGRyOworCQlkbWFfYWRkcl90IGluX2FkZHI7CisJfSBkbWFfYWRkcnNbM11bMl1bM10gPSB7CisJCS8qIFNSQyAqLworCQl7e3sgMCwJCQkJMCB9LAorCQkgIC8qIENhcHR1cmUgKi8KKwkJICB7IFJETUFfU1JDX09fTihzcmMsIGlkKSwJUkRNQV9TUkNfSV9QKHNyYywgaWQpIH0sCisJCSAgeyBSRE1BX0NNRF9PX04oc3JjLCBpZCksCVJETUFfU1JDX0lfUChzcmMsIGlkKSB9IH0sCisJCSAvKiBQbGF5YmFjayAqLworCQkge3sgMCwJCQkJMCwgfSwKKwkJICB7IFJETUFfU1JDX09fUChzcmMsIGlkKSwJUkRNQV9TUkNfSV9OKHNyYywgaWQpIH0sCisJCSAgeyBSRE1BX0NNRF9PX1Aoc3JjLCBpZCksCVJETUFfU1JDX0lfTihzcmMsIGlkKSB9IH0KKwkJfSwKKwkJLyogU1NJICovCisJCS8qIENhcHR1cmUgKi8KKwkJe3t7IFJETUFfU1NJX09fTihzc2ksIGlkKSwJMCB9LAorCQkgIHsgUkRNQV9TU0lVX09fUChzc2ksIGlkKSwJMCB9LAorCQkgIHsgUkRNQV9TU0lVX09fUChzc2ksIGlkKSwJMCB9IH0sCisJCSAvKiBQbGF5YmFjayAqLworCQkge3sgMCwJCQkJUkRNQV9TU0lfSV9OKHNzaSwgaWQpIH0sCisJCSAgeyAwLAkJCQlSRE1BX1NTSVVfSV9QKHNzaSwgaWQpIH0sCisJCSAgeyAwLAkJCQlSRE1BX1NTSVVfSV9QKHNzaSwgaWQpIH0gfQorCQl9LAorCQkvKiBTU0lVICovCisJCS8qIENhcHR1cmUgKi8KKwkJe3t7IFJETUFfU1NJVV9PX04oc3NpLCBpZCksCTAgfSwKKwkJICB7IFJETUFfU1NJVV9PX1Aoc3NpLCBpZCksCTAgfSwKKwkJICB7IFJETUFfU1NJVV9PX1Aoc3NpLCBpZCksCTAgfSB9LAorCQkgLyogUGxheWJhY2sgKi8KKwkJIHt7IDAsCQkJCVJETUFfU1NJVV9JX04oc3NpLCBpZCkgfSwKKwkJICB7IDAsCQkJCVJETUFfU1NJVV9JX1Aoc3NpLCBpZCkgfSwKKwkJICB7IDAsCQkJCVJETUFfU1NJVV9JX1Aoc3NpLCBpZCkgfSB9IH0sCisJfTsKKworCS8qIGl0IHNob3VsZG4ndCBoYXBwZW4gKi8KKwlpZiAodXNlX2R2YyAmJiAhdXNlX3NyYykKKwkJZGV2X2VycihkZXYsICJEVkMgaXMgc2VsZWN0ZWQgd2l0aG91dCBTUkNcbiIpOworCisJLyogdXNlIFNTSVUgb3IgU1NJID8gKi8KKwlpZiAoaXNfc3NpICYmIHJzbmRfc3NpX3VzZV9idXNpZihtb2QpKQorCQlpc19zc2krKzsKKworCXJldHVybiAoaXNfZnJvbSkgPworCQlkbWFfYWRkcnNbaXNfc3NpXVtpc19wbGF5XVt1c2Vfc3JjICsgdXNlX2R2Y10ub3V0X2FkZHIgOgorCQlkbWFfYWRkcnNbaXNfc3NpXVtpc19wbGF5XVt1c2Vfc3JjICsgdXNlX2R2Y10uaW5fYWRkcjsKK30KKworc3RhdGljIGRtYV9hZGRyX3QgcnNuZF9kbWFfYWRkcihzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAorCQkJCXN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJCWludCBpc19wbGF5LCBpbnQgaXNfZnJvbSkKK3sKKwkvKgorCSAqIGdlbjEgdXNlcyBkZWZhdWx0IERNQSBhZGRyCisJICovCisJaWYgKHJzbmRfaXNfZ2VuMShwcml2KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIW1vZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcnNuZF9nZW4yX2RtYV9hZGRyKHByaXYsIG1vZCwgaXNfcGxheSwgaXNfZnJvbSk7Cit9CisKKyNkZWZpbmUgTU9EX01BWCA0IC8qIE1FTS9TU0kvU1JDL0RWQyAqLworc3RhdGljIHZvaWQgcnNuZF9kbWFfb2ZfcGF0aChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwKKwkJCSAgICAgaW50IGlzX3BsYXksCisJCQkgICAgIHN0cnVjdCByc25kX21vZCAqKm1vZF9mcm9tLAorCQkJICAgICBzdHJ1Y3QgcnNuZF9tb2QgKiptb2RfdG8pCit7CisJc3RydWN0IHJzbmRfbW9kICp0aGlzID0gcnNuZF9kbWFfdG9fbW9kKGRtYSk7CisJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSByc25kX21vZF90b19pbyh0aGlzKTsKKwlzdHJ1Y3QgcnNuZF9tb2QgKnNzaSA9IHJzbmRfaW9fdG9fbW9kX3NzaShpbyk7CisJc3RydWN0IHJzbmRfbW9kICpzcmMgPSByc25kX2lvX3RvX21vZF9zcmMoaW8pOworCXN0cnVjdCByc25kX21vZCAqZHZjID0gcnNuZF9pb190b19tb2RfZHZjKGlvKTsKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZFtNT0RfTUFYXTsKKwlpbnQgaSwgaW5kZXg7CisKKworCWZvciAoaSA9IDA7IGkgPCBNT0RfTUFYOyBpKyspCisJCW1vZFtpXSA9IE5VTEw7CisKKwkvKgorCSAqIGluIHBsYXkgY2FzZS4uLgorCSAqCisJICogc3JjIC0+IGRzdAorCSAqCisJICogbWVtIC0+IFNTSQorCSAqIG1lbSAtPiBTUkMgLT4gU1NJCisJICogbWVtIC0+IFNSQyAtPiBEVkMgLT4gU1NJCisJICovCisJbW9kWzBdID0gTlVMTDsgLyogZm9yICJtZW0iICovCisJaW5kZXggPSAxOworCWZvciAoaSA9IDE7IGkgPCBNT0RfTUFYOyBpKyspIHsKKwkJaWYgKCFzcmMpIHsKKwkJCW1vZFtpXSA9IHNzaTsKKwkJfSBlbHNlIGlmICghZHZjKSB7CisJCQltb2RbaV0gPSBzcmM7CisJCQlzcmMgPSBOVUxMOworCQl9IGVsc2UgeworCQkJaWYgKCghaXNfcGxheSkgJiYgKHRoaXMgPT0gc3JjKSkKKwkJCQl0aGlzID0gZHZjOworCisJCQltb2RbaV0gPSAoaXNfcGxheSkgPyBzcmMgOiBkdmM7CisJCQlpKys7CisJCQltb2RbaV0gPSAoaXNfcGxheSkgPyBkdmMgOiBzcmM7CisJCQlzcmMgPSBOVUxMOworCQkJZHZjID0gTlVMTDsKKwkJfQorCisJCWlmIChtb2RbaV0gPT0gdGhpcykKKwkJCWluZGV4ID0gaTsKKworCQlpZiAobW9kW2ldID09IHNzaSkKKwkJCWJyZWFrOworCX0KKworCWlmIChpc19wbGF5KSB7CisJCSptb2RfZnJvbSA9IG1vZFtpbmRleCAtIDFdOworCQkqbW9kX3RvICAgPSBtb2RbaW5kZXhdOworCX0gZWxzZSB7CisJCSptb2RfZnJvbSA9IG1vZFtpbmRleF07CisJCSptb2RfdG8gICA9IG1vZFtpbmRleCAtIDFdOworCX0KK30KKwordm9pZCByc25kX2RtYV9zdG9wKHN0cnVjdCByc25kX2RtYSAqZG1hKQoreworCWRtYS0+b3BzLT5zdG9wKGRtYSk7Cit9CisKK3ZvaWQgcnNuZF9kbWFfc3RhcnQoc3RydWN0IHJzbmRfZG1hICpkbWEpCit7CisJZG1hLT5vcHMtPnN0YXJ0KGRtYSk7Cit9CisKK3ZvaWQgcnNuZF9kbWFfcXVpdChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSkKK3sKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCA9IHJzbmRfZG1hX3RvX21vZChkbWEpOworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CisJc3RydWN0IHJzbmRfZG1hX2N0cmwgKmRtYWMgPSByc25kX3ByaXZfdG9fZG1hYyhwcml2KTsKKworCWlmICghZG1hYykKKwkJcmV0dXJuOworCisJZG1hLT5vcHMtPnF1aXQoZG1hKTsKK30KKworaW50IHJzbmRfZG1hX2luaXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgc3RydWN0IHJzbmRfZG1hICpkbWEsIGludCBpZCkKK3sKKwlzdHJ1Y3QgcnNuZF9tb2QgKm1vZCA9IHJzbmRfZG1hX3RvX21vZChkbWEpOworCXN0cnVjdCByc25kX21vZCAqbW9kX2Zyb207CisJc3RydWN0IHJzbmRfbW9kICptb2RfdG87CisJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSByc25kX21vZF90b19pbyhtb2QpOworCXN0cnVjdCByc25kX2RtYV9jdHJsICpkbWFjID0gcnNuZF9wcml2X3RvX2RtYWMocHJpdik7CisJaW50IGlzX3BsYXkgPSByc25kX2lvX2lzX3BsYXkoaW8pOworCisJLyoKKwkgKiBETUEgZmFpbGVkLiB0cnkgdG8gUElPIG1vZGUKKwkgKiBzZWUKKwkgKglyc25kX3NzaV9mYWxsYmFjaygpCisJICoJcnNuZF9yZGFpX2NvbnRpbnVhbmNlX3Byb2JlKCkKKwkgKi8KKwlpZiAoIWRtYWMpCisJCXJldHVybiAtRUFHQUlOOworCisJcnNuZF9kbWFfb2ZfcGF0aChkbWEsIGlzX3BsYXksICZtb2RfZnJvbSwgJm1vZF90byk7CisKKwlkbWEtPnNyY19hZGRyID0gcnNuZF9kbWFfYWRkcihwcml2LCBtb2RfZnJvbSwgaXNfcGxheSwgMSk7CisJZG1hLT5kc3RfYWRkciA9IHJzbmRfZG1hX2FkZHIocHJpdiwgbW9kX3RvLCAgIGlzX3BsYXksIDApOworCisJLyogZm9yIEdlbjIgKi8KKwlpZiAobW9kX2Zyb20gJiYgbW9kX3RvKQorCQlkbWEtPm9wcyA9ICZyc25kX2RtYXBwX29wczsKKwllbHNlCisJCWRtYS0+b3BzID0gJnJzbmRfZG1hZW5fb3BzOworCisJLyogZm9yIEdlbjEsIG92ZXJ3cml0ZSAqLworCWlmIChyc25kX2lzX2dlbjEocHJpdikpCisJCWRtYS0+b3BzID0gJnJzbmRfZG1hZW5fb3BzOworCisJcmV0dXJuIGRtYS0+b3BzLT5pbml0KHByaXYsIGRtYSwgaWQsIG1vZF9mcm9tLCBtb2RfdG8pOworfQorCitpbnQgcnNuZF9kbWFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJICAgY29uc3Qgc3RydWN0IHJzbmRfb2ZfZGF0YSAqb2ZfZGF0YSwKKwkJICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOworCXN0cnVjdCByc25kX2RtYV9jdHJsICpkbWFjOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJLyoKKwkgKiBmb3IgR2VuMQorCSAqLworCWlmIChyc25kX2lzX2dlbjEocHJpdikpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBmb3IgR2VuMgorCSAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJhdWRtYXBwIik7CisJZG1hYyA9IGRldm1fa3phbGxvYyhkZXYsIHNpemVvZigqZG1hYyksIEdGUF9LRVJORUwpOworCWlmICghZG1hYyB8fCAhcmVzKSB7CisJCWRldl9lcnIoZGV2LCAiZG1hIGFsbG9jYXRlIGZhaWxlZFxuIik7CisJCXJldHVybiAwOyAvKiBpdCB3aWxsIGJlIFBJTyBtb2RlICovCisJfQorCisJZG1hYy0+ZG1hcHBfbnVtID0gMDsKKwlkbWFjLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKGRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGRtYWMtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihkbWFjLT5iYXNlKTsKKworCXByaXYtPmRtYSA9IGRtYWM7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL2R2Yy5jIGIvc291bmQvc29jL3NoL3JjYXIvZHZjLmMKaW5kZXggZDdmOWVkOS4uZTVmY2IwNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NoL3JjYXIvZHZjLmMKKysrIGIvc291bmQvc29jL3NoL3JjYXIvZHZjLmMKQEAgLTI0LDYgKzI0LDkgQEAKIAlzdHJ1Y3QgcnNuZF9rY3RybF9jZmdfcyByZG93bjsJLyogUmFtcCBSYXRlIERvd24gKi8KIH07CiAKKyNkZWZpbmUgcnNuZF9kdmNfb2Zfbm9kZShwcml2KSBcCisJb2ZfZ2V0X2NoaWxkX2J5X25hbWUocnNuZF9wcml2X3RvX2Rldihwcml2KS0+b2Zfbm9kZSwgInJjYXJfc291bmQsZHZjIikKKwogI2RlZmluZSByc25kX21vZF90b19kdmMoX21vZCkJXAogCWNvbnRhaW5lcl9vZigoX21vZCksIHN0cnVjdCByc25kX2R2YywgbW9kKQogCkBAIC0zMyw3ICszNiw3IEBACiAJICAgICAoKHBvcykgPSAoc3RydWN0IHJzbmRfZHZjICopKHByaXYpLT5kdmMgKyBpKTsJXAogCSAgICAgaSsrKQogCi1zdGF0aWMgY29uc3QgY2hhciBjb25zdCAqZHZjX3JhbXBfcmF0ZVtdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkdmNfcmFtcF9yYXRlW10gPSB7CiAJIjEyOCBkQi8xIHN0ZXAiLAkgLyogMDAwMDAgKi8KIAkiNjQgZEIvMSBzdGVwIiwJCSAvKiAwMDAwMSAqLwogCSIzMiBkQi8xIHN0ZXAiLAkJIC8qIDAwMDEwICovCkBAIC0xMTYsMTcgKzExOSw2IEBACiAJcnNuZF9tb2Rfd3JpdGUobW9kLCBEVkNfRFZVRVIsIDEpOwogfQogCi1zdGF0aWMgaW50IHJzbmRfZHZjX3Byb2JlX2dlbjIoc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkgICAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwotCi0JZGV2X2RiZyhkZXYsICIlc1slZF0gKEdlbjIpIGlzIHByb2JlZFxuIiwKLQkJcnNuZF9tb2RfbmFtZShtb2QpLCByc25kX21vZF9pZChtb2QpKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHJzbmRfZHZjX3JlbW92ZV9nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkJCXN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CkBAIC0yNjksOSArMjYxLDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZG1hX2NoYW4gKnJzbmRfZHZjX2RtYV9yZXEoc3RydWN0IHJzbmRfbW9kICptb2QpCit7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKKworCXJldHVybiByc25kX2RtYV9yZXF1ZXN0X2NoYW5uZWwocnNuZF9kdmNfb2Zfbm9kZShwcml2KSwKKwkJCQkJbW9kLCAidHgiKTsKK30KKwogc3RhdGljIHN0cnVjdCByc25kX21vZF9vcHMgcnNuZF9kdmNfb3BzID0gewogCS5uYW1lCQk9IERWQ19OQU1FLAotCS5wcm9iZQkJPSByc25kX2R2Y19wcm9iZV9nZW4yLAorCS5kbWFfcmVxCT0gcnNuZF9kdmNfZG1hX3JlcSwKIAkucmVtb3ZlCQk9IHJzbmRfZHZjX3JlbW92ZV9nZW4yLAogCS5pbml0CQk9IHJzbmRfZHZjX2luaXQsCiAJLnF1aXQJCT0gcnNuZF9kdmNfcXVpdCwKQEAgLTMzMyw3ICszMzMsNyBAQAogCXN0cnVjdCByc25kX2R2YyAqZHZjOwogCXN0cnVjdCBjbGsgKmNsazsKIAljaGFyIG5hbWVbUlNORF9EVkNfTkFNRV9TSVpFXTsKLQlpbnQgaSwgbnI7CisJaW50IGksIG5yLCByZXQ7CiAKIAlyc25kX29mX3BhcnNlX2R2YyhwZGV2LCBvZl9kYXRhLCBwcml2KTsKIApAQCAtMzY2LDExICszNjYsMjIgQEAKIAogCQlkdmMtPmluZm8gPSAmaW5mby0+ZHZjX2luZm9baV07CiAKLQkJcnNuZF9tb2RfaW5pdCgmZHZjLT5tb2QsICZyc25kX2R2Y19vcHMsCisJCXJldCA9IHJzbmRfbW9kX2luaXQoJmR2Yy0+bW9kLCAmcnNuZF9kdmNfb3BzLAogCQkJICAgICAgY2xrLCBSU05EX01PRF9EVkMsIGkpOwotCi0JCWRldl9kYmcoZGV2LCAiQ01EJWQgcHJvYmVkXG4iLCBpKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJfQogCiAJcmV0dXJuIDA7CiB9CisKK3ZvaWQgcnNuZF9kdmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgcnNuZF9kdmMgKmR2YzsKKwlpbnQgaTsKKworCWZvcl9lYWNoX3JzbmRfZHZjKGR2YywgcHJpdiwgaSkgeworCQlyc25kX21vZF9xdWl0KCZkdmMtPm1vZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvZ2VuLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9nZW4uYwppbmRleCBkZTA2ODVmLi44YzdkYzUxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9nZW4uYworKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9nZW4uYwpAQCAtMjgsNiArMjgsNyBAQAogCiAJc3RydWN0IHJlZ21hcCAqcmVnbWFwW1JTTkRfQkFTRV9NQVhdOwogCXN0cnVjdCByZWdtYXBfZmllbGQgKnJlZ3NbUlNORF9SRUdfTUFYXTsKKwlwaHlzX2FkZHJfdCByZXNbUlNORF9SRUdfTUFYXTsKIH07CiAKICNkZWZpbmUgcnNuZF9wcml2X3RvX2dlbihwKQkoKHN0cnVjdCByc25kX2dlbiAqKShwKS0+Z2VuKQpAQCAtMTE4LDExICsxMTksMTkgQEAKIAkJCQkgIG1hc2ssIGRhdGEpOwogfQogCi0jZGVmaW5lIHJzbmRfZ2VuX3JlZ21hcF9pbml0KHByaXYsIGlkX3NpemUsIHJlZ19pZCwgY29uZikJCVwKLQlfcnNuZF9nZW5fcmVnbWFwX2luaXQocHJpdiwgaWRfc2l6ZSwgcmVnX2lkLCBjb25mLCBBUlJBWV9TSVpFKGNvbmYpKQorcGh5c19hZGRyX3QgcnNuZF9nZW5fZ2V0X3BoeV9hZGRyKHN0cnVjdCByc25kX3ByaXYgKnByaXYsIGludCByZWdfaWQpCit7CisJc3RydWN0IHJzbmRfZ2VuICpnZW4gPSByc25kX3ByaXZfdG9fZ2VuKHByaXYpOworCisJcmV0dXJuCWdlbi0+cmVzW3JlZ19pZF07Cit9CisKKyNkZWZpbmUgcnNuZF9nZW5fcmVnbWFwX2luaXQocHJpdiwgaWRfc2l6ZSwgcmVnX2lkLCBuYW1lLCBjb25mKQkJXAorCV9yc25kX2dlbl9yZWdtYXBfaW5pdChwcml2LCBpZF9zaXplLCByZWdfaWQsIG5hbWUsIGNvbmYsIEFSUkFZX1NJWkUoY29uZikpCiBzdGF0aWMgaW50IF9yc25kX2dlbl9yZWdtYXBfaW5pdChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAogCQkJCSBpbnQgaWRfc2l6ZSwKIAkJCQkgaW50IHJlZ19pZCwKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwKIAkJCQkgc3RydWN0IHJzbmRfcmVnbWFwX2ZpZWxkX2NvbmYgKmNvbmYsCiAJCQkJIGludCBjb25mX3NpemUpCiB7CkBAIC0xNDEsOCArMTUwLDExIEBACiAJcmVnYy5yZWdfYml0cyA9IDMyOwogCXJlZ2MudmFsX2JpdHMgPSAzMjsKIAlyZWdjLnJlZ19zdHJpZGUgPSA0OworCXJlZ2MubmFtZSA9IG5hbWU7CiAKLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIHJlZ19pZCk7CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX01FTSwgbmFtZSk7CisJaWYgKCFyZXMpCisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgcmVnX2lkKTsKIAlpZiAoIXJlcykKIAkJcmV0dXJuIC1FTk9ERVY7CiAKQEAgLTE1Niw2ICsxNjgsNyBAQAogCiAJZ2VuLT5iYXNlW3JlZ19pZF0gPSBiYXNlOwogCWdlbi0+cmVnbWFwW3JlZ19pZF0gPSByZWdtYXA7CisJZ2VuLT5yZXNbcmVnX2lkXSA9IHJlcy0+c3RhcnQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY29uZl9zaXplOyBpKyspIHsKIApAQCAtMTc2LDEyNSArMTg5LDExIEBACiB9CiAKIC8qCi0gKglETUEgcmVhZC93cml0ZSByZWdpc3RlciBvZmZzZXQKLSAqCi0gKglSU05EX3h4eF9JX04JZm9yIEF1ZGlvIERNQUMgaW5wdXQKLSAqCVJTTkRfeHh4X09fTglmb3IgQXVkaW8gRE1BQyBvdXRwdXQKLSAqCVJTTkRfeHh4X0lfUAlmb3IgQXVkaW8gRE1BQyBwZXJpIHBlcmkgaW5wdXQKLSAqCVJTTkRfeHh4X09fUAlmb3IgQXVkaW8gRE1BQyBwZXJpIHBlcmkgb3V0cHV0Ci0gKgotICoJZXgpIFItQ2FyIEgyIGNhc2UKLSAqCSAgICAgIG1vZCAgICAgICAgLyBETUFDIGluICAgIC8gRE1BQyBvdXQgICAvIERNQUMgUFAgaW4gLyBETUFDIHBwIG91dAotICoJU1NJIDogMHhlYzU0MTAwMCAvIDB4ZWMyNDEwMDggLyAweGVjMjQxMDBjCi0gKglTU0lVOiAweGVjNTQxMDAwIC8gMHhlYzEwMDAwMCAvIDB4ZWMxMDAwMDAgLyAweGVjNDAwMDAwIC8gMHhlYzQwMDAwMAotICoJU0NVIDogMHhlYzUwMDAwMCAvIDB4ZWMwMDAwMDAgLyAweGVjMDA0MDAwIC8gMHhlYzMwMDAwMCAvIDB4ZWMzMDQwMDAKLSAqCUNNRCA6IDB4ZWM1MDAwMDAgLyAgICAgICAgICAgIC8gMHhlYzAwODAwMCAgICAgICAgICAgICAgICAweGVjMzA4MDAwCi0gKi8KLSNkZWZpbmUgUkRNQV9TU0lfSV9OKGFkZHIsIGkpCShhZGRyICMjX3JlZyAtIDB4MDAzMDAwMDAgKyAoMHg0MCAqIGkpICsgMHg4KQotI2RlZmluZSBSRE1BX1NTSV9PX04oYWRkciwgaSkJKGFkZHIgIyNfcmVnIC0gMHgwMDMwMDAwMCArICgweDQwICogaSkgKyAweGMpCi0KLSNkZWZpbmUgUkRNQV9TU0lVX0lfTihhZGRyLCBpKQkoYWRkciAjI19yZWcgLSAweDAwNDQxMDAwICsgKDB4MTAwMCAqIGkpKQotI2RlZmluZSBSRE1BX1NTSVVfT19OKGFkZHIsIGkpCShhZGRyICMjX3JlZyAtIDB4MDA0NDEwMDAgKyAoMHgxMDAwICogaSkpCi0KLSNkZWZpbmUgUkRNQV9TU0lVX0lfUChhZGRyLCBpKQkoYWRkciAjI19yZWcgLSAweDAwMTQxMDAwICsgKDB4MTAwMCAqIGkpKQotI2RlZmluZSBSRE1BX1NTSVVfT19QKGFkZHIsIGkpCShhZGRyICMjX3JlZyAtIDB4MDAxNDEwMDAgKyAoMHgxMDAwICogaSkpCi0KLSNkZWZpbmUgUkRNQV9TUkNfSV9OKGFkZHIsIGkpCShhZGRyICMjX3JlZyAtIDB4MDA1MDAwMDAgKyAoMHg0MDAgKiBpKSkKLSNkZWZpbmUgUkRNQV9TUkNfT19OKGFkZHIsIGkpCShhZGRyICMjX3JlZyAtIDB4MDA0ZmMwMDAgKyAoMHg0MDAgKiBpKSkKLQotI2RlZmluZSBSRE1BX1NSQ19JX1AoYWRkciwgaSkJKGFkZHIgIyNfcmVnIC0gMHgwMDIwMDAwMCArICgweDQwMCAqIGkpKQotI2RlZmluZSBSRE1BX1NSQ19PX1AoYWRkciwgaSkJKGFkZHIgIyNfcmVnIC0gMHgwMDFmYzAwMCArICgweDQwMCAqIGkpKQotCi0jZGVmaW5lIFJETUFfQ01EX09fTihhZGRyLCBpKQkoYWRkciAjI19yZWcgLSAweDAwNGY4MDAwICsgKDB4NDAwICogaSkpCi0jZGVmaW5lIFJETUFfQ01EX09fUChhZGRyLCBpKQkoYWRkciAjI19yZWcgLSAweDAwMWY4MDAwICsgKDB4NDAwICogaSkpCi0KLXN0YXRpYyBkbWFfYWRkcl90Ci1yc25kX2dlbjJfZG1hX2FkZHIoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJICAgc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCSAgIGludCBpc19wbGF5LCBpbnQgaXNfZnJvbSkKLXsKLQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gcnNuZF9wcml2X3RvX3BkZXYocHJpdik7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKLQlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyA9IHJzbmRfbW9kX3RvX2lvKG1vZCk7Ci0JZG1hX2FkZHJfdCBzc2lfcmVnID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsCi0JCQkJSU9SRVNPVVJDRV9NRU0sIFJTTkRfR0VOMl9TU0kpLT5zdGFydDsKLQlkbWFfYWRkcl90IHNyY19yZWcgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwKLQkJCQlJT1JFU09VUkNFX01FTSwgUlNORF9HRU4yX1NDVSktPnN0YXJ0OwotCWludCBpc19zc2kgPSAhIShyc25kX2lvX3RvX21vZF9zc2koaW8pID09IG1vZCk7Ci0JaW50IHVzZV9zcmMgPSAhIXJzbmRfaW9fdG9fbW9kX3NyYyhpbyk7Ci0JaW50IHVzZV9kdmMgPSAhIXJzbmRfaW9fdG9fbW9kX2R2Yyhpbyk7Ci0JaW50IGlkID0gcnNuZF9tb2RfaWQobW9kKTsKLQlzdHJ1Y3QgZG1hX2FkZHIgewotCQlkbWFfYWRkcl90IG91dF9hZGRyOwotCQlkbWFfYWRkcl90IGluX2FkZHI7Ci0JfSBkbWFfYWRkcnNbM11bMl1bM10gPSB7Ci0JCS8qIFNSQyAqLwotCQl7e3sgMCwJCQkJMCB9LAotCQkvKiBDYXB0dXJlICovCi0JCSAgeyBSRE1BX1NSQ19PX04oc3JjLCBpZCksCVJETUFfU1JDX0lfUChzcmMsIGlkKSB9LAotCQkgIHsgUkRNQV9DTURfT19OKHNyYywgaWQpLAlSRE1BX1NSQ19JX1Aoc3JjLCBpZCkgfSB9LAotCQkgLyogUGxheWJhY2sgKi8KLQkJIHt7IDAsCQkJCTAsIH0sCi0JCSAgeyBSRE1BX1NSQ19PX1Aoc3JjLCBpZCksCVJETUFfU1JDX0lfTihzcmMsIGlkKSB9LAotCQkgIHsgUkRNQV9DTURfT19QKHNyYywgaWQpLAlSRE1BX1NSQ19JX04oc3JjLCBpZCkgfSB9Ci0JCX0sCi0JCS8qIFNTSSAqLwotCQkvKiBDYXB0dXJlICovCi0JCXt7eyBSRE1BX1NTSV9PX04oc3NpLCBpZCksCTAgfSwKLQkJICB7IFJETUFfU1NJVV9PX1Aoc3NpLCBpZCksCTAgfSwKLQkJICB7IFJETUFfU1NJVV9PX1Aoc3NpLCBpZCksCTAgfSB9LAotCQkgLyogUGxheWJhY2sgKi8KLQkJIHt7IDAsCQkJCVJETUFfU1NJX0lfTihzc2ksIGlkKSB9LAotCQkgIHsgMCwJCQkJUkRNQV9TU0lVX0lfUChzc2ksIGlkKSB9LAotCQkgIHsgMCwJCQkJUkRNQV9TU0lVX0lfUChzc2ksIGlkKSB9IH0KLQkJfSwKLQkJLyogU1NJVSAqLwotCQkvKiBDYXB0dXJlICovCi0JCXt7eyBSRE1BX1NTSVVfT19OKHNzaSwgaWQpLAkwIH0sCi0JCSAgeyBSRE1BX1NTSVVfT19QKHNzaSwgaWQpLAkwIH0sCi0JCSAgeyBSRE1BX1NTSVVfT19QKHNzaSwgaWQpLAkwIH0gfSwKLQkJIC8qIFBsYXliYWNrICovCi0JCSB7eyAwLAkJCQlSRE1BX1NTSVVfSV9OKHNzaSwgaWQpIH0sCi0JCSAgeyAwLAkJCQlSRE1BX1NTSVVfSV9QKHNzaSwgaWQpIH0sCi0JCSAgeyAwLAkJCQlSRE1BX1NTSVVfSV9QKHNzaSwgaWQpIH0gfSB9LAotCX07Ci0KLQkvKiBpdCBzaG91bGRuJ3QgaGFwcGVuICovCi0JaWYgKHVzZV9kdmMgJiYgIXVzZV9zcmMpCi0JCWRldl9lcnIoZGV2LCAiRFZDIGlzIHNlbGVjdGVkIHdpdGhvdXQgU1JDXG4iKTsKLQotCS8qIHVzZSBTU0lVIG9yIFNTSSA/ICovCi0JaWYgKGlzX3NzaSAmJiAoMCA9PSBzdHJjbXAocnNuZF9tb2RfZG1hX25hbWUobW9kKSwgInNzaXUiKSkpCi0JCWlzX3NzaSsrOwotCi0JcmV0dXJuIChpc19mcm9tKSA/Ci0JCWRtYV9hZGRyc1tpc19zc2ldW2lzX3BsYXldW3VzZV9zcmMgKyB1c2VfZHZjXS5vdXRfYWRkciA6Ci0JCWRtYV9hZGRyc1tpc19zc2ldW2lzX3BsYXldW3VzZV9zcmMgKyB1c2VfZHZjXS5pbl9hZGRyOwotfQotCi1kbWFfYWRkcl90IHJzbmRfZ2VuX2RtYV9hZGRyKHN0cnVjdCByc25kX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkJICAgICBpbnQgaXNfcGxheSwgaW50IGlzX2Zyb20pCi17Ci0JLyoKLQkgKiBnZW4xIHVzZXMgZGVmYXVsdCBETUEgYWRkcgotCSAqLwotCWlmIChyc25kX2lzX2dlbjEocHJpdikpCi0JCXJldHVybiAwOwotCi0JaWYgKCFtb2QpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIHJzbmRfZ2VuMl9kbWFfYWRkcihwcml2LCBtb2QsIGlzX3BsYXksIGlzX2Zyb20pOwotfQotCi0vKgogICoJCUdlbjIKICAqLwogc3RhdGljIGludCByc25kX2dlbjJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKIAkJCSAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAlzdHJ1Y3QgcnNuZF9yZWdtYXBfZmllbGRfY29uZiBjb25mX3NzaXVbXSA9IHsKIAkJUlNORF9HRU5fU19SRUcoU1NJX01PREUwLAkweDgwMCksCiAJCVJTTkRfR0VOX1NfUkVHKFNTSV9NT0RFMSwJMHg4MDQpLApAQCAtMzY4LDE4ICsyNjcsMTYgQEAKIAlpbnQgcmV0X2FkZzsKIAlpbnQgcmV0X3NzaTsKIAotCXJldF9zc2l1ID0gcnNuZF9nZW5fcmVnbWFwX2luaXQocHJpdiwgMTAsIFJTTkRfR0VOMl9TU0lVLCBjb25mX3NzaXUpOwotCXJldF9zY3UgID0gcnNuZF9nZW5fcmVnbWFwX2luaXQocHJpdiwgMTAsIFJTTkRfR0VOMl9TQ1UsICBjb25mX3NjdSk7Ci0JcmV0X2FkZyAgPSByc25kX2dlbl9yZWdtYXBfaW5pdChwcml2LCAxMCwgUlNORF9HRU4yX0FERywgIGNvbmZfYWRnKTsKLQlyZXRfc3NpICA9IHJzbmRfZ2VuX3JlZ21hcF9pbml0KHByaXYsIDEwLCBSU05EX0dFTjJfU1NJLCAgY29uZl9zc2kpOworCXJldF9zc2l1ID0gcnNuZF9nZW5fcmVnbWFwX2luaXQocHJpdiwgMTAsIFJTTkRfR0VOMl9TU0lVLCAic3NpdSIsIGNvbmZfc3NpdSk7CisJcmV0X3NjdSAgPSByc25kX2dlbl9yZWdtYXBfaW5pdChwcml2LCAxMCwgUlNORF9HRU4yX1NDVSwgICJzY3UiLCAgY29uZl9zY3UpOworCXJldF9hZGcgID0gcnNuZF9nZW5fcmVnbWFwX2luaXQocHJpdiwgMTAsIFJTTkRfR0VOMl9BREcsICAiYWRnIiwgIGNvbmZfYWRnKTsKKwlyZXRfc3NpICA9IHJzbmRfZ2VuX3JlZ21hcF9pbml0KHByaXYsIDEwLCBSU05EX0dFTjJfU1NJLCAgInNzaSIsICBjb25mX3NzaSk7CiAJaWYgKHJldF9zc2l1IDwgMCB8fAogCSAgICByZXRfc2N1ICA8IDAgfHwKIAkgICAgcmV0X2FkZyAgPCAwIHx8CiAJICAgIHJldF9zc2kgIDwgMCkKIAkJcmV0dXJuIHJldF9zc2l1IHwgcmV0X3NjdSB8IHJldF9hZGcgfCByZXRfc3NpOwogCi0JZGV2X2RiZyhkZXYsICJHZW4yIGlzIHByb2JlZFxuIik7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzkwLDcgKzI4Nyw2IEBACiBzdGF0aWMgaW50IHJzbmRfZ2VuMV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQkJICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKIHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwogCXN0cnVjdCByc25kX3JlZ21hcF9maWVsZF9jb25mIGNvbmZfc3J1W10gPSB7CiAJCVJTTkRfR0VOX1NfUkVHKFNSQ19ST1VURV9TRUwsCTB4MDApLAogCQlSU05EX0dFTl9TX1JFRyhTUkNfVE1HX1NFTDAsCTB4MDgpLApAQCAtNDQwLDE2ICszMzYsMTQgQEAKIAlpbnQgcmV0X2FkZzsKIAlpbnQgcmV0X3NzaTsKIAotCXJldF9zcnUgID0gcnNuZF9nZW5fcmVnbWFwX2luaXQocHJpdiwgOSwgUlNORF9HRU4xX1NSVSwgIGNvbmZfc3J1KTsKLQlyZXRfYWRnICA9IHJzbmRfZ2VuX3JlZ21hcF9pbml0KHByaXYsIDksIFJTTkRfR0VOMV9BREcsICBjb25mX2FkZyk7Ci0JcmV0X3NzaSAgPSByc25kX2dlbl9yZWdtYXBfaW5pdChwcml2LCA5LCBSU05EX0dFTjFfU1NJLCAgY29uZl9zc2kpOworCXJldF9zcnUgID0gcnNuZF9nZW5fcmVnbWFwX2luaXQocHJpdiwgOSwgUlNORF9HRU4xX1NSVSwgInNydSIsIGNvbmZfc3J1KTsKKwlyZXRfYWRnICA9IHJzbmRfZ2VuX3JlZ21hcF9pbml0KHByaXYsIDksIFJTTkRfR0VOMV9BREcsICJhZGciLCBjb25mX2FkZyk7CisJcmV0X3NzaSAgPSByc25kX2dlbl9yZWdtYXBfaW5pdChwcml2LCA5LCBSU05EX0dFTjFfU1NJLCAic3NpIiwgY29uZl9zc2kpOwogCWlmIChyZXRfc3J1ICA8IDAgfHwKIAkgICAgcmV0X2FkZyAgPCAwIHx8CiAJICAgIHJldF9zc2kgIDwgMCkKIAkJcmV0dXJuIHJldF9zcnUgfCByZXRfYWRnIHwgcmV0X3NzaTsKIAotCWRldl9kYmcoZGV2LCAiR2VuMSBpcyBwcm9iZWRcbiIpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL3JzbmQuaCBiL3NvdW5kL3NvYy9zaC9yY2FyL3JzbmQuaAppbmRleCBlNzkxNGJkLi40ZTZkZTY4IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9yc25kLmgKKysrIGIvc291bmQvc29jL3NoL3JjYXIvcnNuZC5oCkBAIC0xNzAsMjEgKzE3MCw0NyBAQAogLyoKICAqCVItQ2FyIERNQQogICovCi1zdHJ1Y3QgcnNuZF9kbWEgewotCXN0cnVjdCBzaF9kbWFlX3NsYXZlCXNsYXZlOwotCXN0cnVjdCBkbWFfY2hhbgkJKmNoYW47Ci0JZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcjsKLQlkbWFfYWRkcl90CQlhZGRyOworc3RydWN0IHJzbmRfZG1hOworc3RydWN0IHJzbmRfZG1hX29wcyB7CisJdm9pZCAoKnN0YXJ0KShzdHJ1Y3QgcnNuZF9kbWEgKmRtYSk7CisJdm9pZCAoKnN0b3ApKHN0cnVjdCByc25kX2RtYSAqZG1hKTsKKwlpbnQgKCppbml0KShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LCBzdHJ1Y3QgcnNuZF9kbWEgKmRtYSwgaW50IGlkLAorCQkgICAgc3RydWN0IHJzbmRfbW9kICptb2RfZnJvbSwgc3RydWN0IHJzbmRfbW9kICptb2RfdG8pOworCXZvaWQgICgqcXVpdCkoc3RydWN0IHJzbmRfZG1hICpkbWEpOwogfTsKIAorc3RydWN0IHJzbmRfZG1hZW4geworCXN0cnVjdCBkbWFfY2hhbgkJKmNoYW47Cit9OworCitzdHJ1Y3QgcnNuZF9kbWFwcCB7CisJaW50CQkJZG1hcHBfaWQ7CisJdTMyCQkJY2hjcjsKK307CisKK3N0cnVjdCByc25kX2RtYSB7CisJc3RydWN0IHJzbmRfZG1hX29wcwkqb3BzOworCWRtYV9hZGRyX3QJCXNyY19hZGRyOworCWRtYV9hZGRyX3QJCWRzdF9hZGRyOworCXVuaW9uIHsKKwkJc3RydWN0IHJzbmRfZG1hZW4gZW47CisJCXN0cnVjdCByc25kX2RtYXBwIHBwOworCX0gZG1hOworfTsKKyNkZWZpbmUgcnNuZF9kbWFfdG9fZG1hZW4oZG1hKQkoJihkbWEpLT5kbWEuZW4pCisjZGVmaW5lIHJzbmRfZG1hX3RvX2RtYXBwKGRtYSkJKCYoZG1hKS0+ZG1hLnBwKQorCiB2b2lkIHJzbmRfZG1hX3N0YXJ0KHN0cnVjdCByc25kX2RtYSAqZG1hKTsKIHZvaWQgcnNuZF9kbWFfc3RvcChzdHJ1Y3QgcnNuZF9kbWEgKmRtYSk7Ci1pbnQgcnNuZF9kbWFfYXZhaWxhYmxlKHN0cnVjdCByc25kX2RtYSAqZG1hKTsKLWludCByc25kX2RtYV9pbml0KHN0cnVjdCByc25kX3ByaXYgKnByaXYsIHN0cnVjdCByc25kX2RtYSAqZG1hLAotCWludCBpc19wbGF5LCBpbnQgaWQpOwotdm9pZCAgcnNuZF9kbWFfcXVpdChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAotCQkgICAgc3RydWN0IHJzbmRfZG1hICpkbWEpOworaW50IHJzbmRfZG1hX2luaXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgc3RydWN0IHJzbmRfZG1hICpkbWEsIGludCBpZCk7Cit2b2lkICByc25kX2RtYV9xdWl0KHN0cnVjdCByc25kX2RtYSAqZG1hKTsKK2ludCByc25kX2RtYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAorCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKK3N0cnVjdCBkbWFfY2hhbiAqcnNuZF9kbWFfcmVxdWVzdF9jaGFubmVsKHN0cnVjdCBkZXZpY2Vfbm9kZSAqb2Zfbm9kZSwKKwkJCQkJICBzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwgY2hhciAqbmFtZSk7CiAKKyNkZWZpbmUgcnNuZF9kbWFfdG9fbW9kKF9kbWEpIGNvbnRhaW5lcl9vZigoX2RtYSksIHN0cnVjdCByc25kX21vZCwgZG1hKQogCiAvKgogICoJUi1DYXIgc291bmQgbW9kCkBAIC0xOTgsNyArMjI0LDcgQEAKIAogc3RydWN0IHJzbmRfbW9kX29wcyB7CiAJY2hhciAqbmFtZTsKLQljaGFyKiAoKmRtYV9uYW1lKShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7CisJc3RydWN0IGRtYV9jaGFuKiAoKmRtYV9yZXEpKHN0cnVjdCByc25kX21vZCAqbW9kKTsKIAlpbnQgKCpwcm9iZSkoc3RydWN0IHJzbmRfbW9kICptb2QsCiAJCSAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7CiAJaW50ICgqcmVtb3ZlKShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKQEAgLTIxMyw2ICsyMzksOSBAQAogCQkgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7CiAJaW50ICgqcGNtX25ldykoc3RydWN0IHJzbmRfbW9kICptb2QsCiAJCSAgICAgICBzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKTsKKwlpbnQgKCpod19wYXJhbXMpKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJIHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAorCQkJIHN0cnVjdCBzbmRfcGNtX2h3X3BhcmFtcyAqaHdfcGFyYW1zKTsKIAlpbnQgKCpmYWxsYmFjaykoc3RydWN0IHJzbmRfbW9kICptb2QsCiAJCQlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKIH07CkBAIC0yMzYsNiArMjY1LDkgQEAKICAqIDIJMDogc3RhcnQJMTogc3RvcAogICogMwkwOiBwY21fbmV3CiAgKiA0CTA6IGZhbGxiYWNrCisgKgorICogMzEgYml0IGlzIGFsd2F5cyBjYWxsZWQgKHNlZSBfX3JzbmRfbW9kX2NhbGwpCisgKiAzMQkwOiBod19wYXJhbXMKICAqLwogI2RlZmluZSBfX3JzbmRfbW9kX3NoaWZ0X3Byb2JlCQkwCiAjZGVmaW5lIF9fcnNuZF9tb2Rfc2hpZnRfcmVtb3ZlCQkwCkBAIC0yNDUsNiArMjc3LDcgQEAKICNkZWZpbmUgX19yc25kX21vZF9zaGlmdF9zdG9wCQkyCiAjZGVmaW5lIF9fcnNuZF9tb2Rfc2hpZnRfcGNtX25ldwkzCiAjZGVmaW5lIF9fcnNuZF9tb2Rfc2hpZnRfZmFsbGJhY2sJNAorI2RlZmluZSBfX3JzbmRfbW9kX3NoaWZ0X2h3X3BhcmFtcwkzMSAvKiBhbHdheXMgY2FsbGVkICovCiAKICNkZWZpbmUgX19yc25kX21vZF9jYWxsX3Byb2JlCQkwCiAjZGVmaW5lIF9fcnNuZF9tb2RfY2FsbF9yZW1vdmUJCTEKQEAgLTI1NCwyOCArMjg3LDMwIEBACiAjZGVmaW5lIF9fcnNuZF9tb2RfY2FsbF9zdG9wCQkxCiAjZGVmaW5lIF9fcnNuZF9tb2RfY2FsbF9wY21fbmV3CQkwCiAjZGVmaW5lIF9fcnNuZF9tb2RfY2FsbF9mYWxsYmFjawkwCisjZGVmaW5lIF9fcnNuZF9tb2RfY2FsbF9od19wYXJhbXMJMAogCiAjZGVmaW5lIHJzbmRfbW9kX3RvX3ByaXYobW9kKSAocnNuZF9pb190b19wcml2KHJzbmRfbW9kX3RvX2lvKG1vZCkpKQogI2RlZmluZSByc25kX21vZF90b19kbWEobW9kKSAoJihtb2QpLT5kbWEpCi0jZGVmaW5lIHJzbmRfZG1hX3RvX21vZChfZG1hKSBjb250YWluZXJfb2YoKF9kbWEpLCBzdHJ1Y3QgcnNuZF9tb2QsIGRtYSkKICNkZWZpbmUgcnNuZF9tb2RfdG9faW8obW9kKSAoKG1vZCktPmlvKQogI2RlZmluZSByc25kX21vZF9pZChtb2QpICgobW9kKS0+aWQpCi0jZGVmaW5lIHJzbmRfbW9kX2h3X3N0YXJ0KG1vZCkJY2xrX3ByZXBhcmVfZW5hYmxlKChtb2QpLT5jbGspCi0jZGVmaW5lIHJzbmRfbW9kX2h3X3N0b3AobW9kKQljbGtfZGlzYWJsZV91bnByZXBhcmUoKG1vZCktPmNsaykKKyNkZWZpbmUgcnNuZF9tb2RfaHdfc3RhcnQobW9kKQljbGtfZW5hYmxlKChtb2QpLT5jbGspCisjZGVmaW5lIHJzbmRfbW9kX2h3X3N0b3AobW9kKQljbGtfZGlzYWJsZSgobW9kKS0+Y2xrKQogCi12b2lkIHJzbmRfbW9kX2luaXQoc3RydWN0IHJzbmRfbW9kICptb2QsCitpbnQgcnNuZF9tb2RfaW5pdChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKIAkJICAgc3RydWN0IHJzbmRfbW9kX29wcyAqb3BzLAogCQkgICBzdHJ1Y3QgY2xrICpjbGssCiAJCSAgIGVudW0gcnNuZF9tb2RfdHlwZSB0eXBlLAogCQkgICBpbnQgaWQpOwordm9pZCByc25kX21vZF9xdWl0KHN0cnVjdCByc25kX21vZCAqbW9kKTsKIGNoYXIgKnJzbmRfbW9kX25hbWUoc3RydWN0IHJzbmRfbW9kICptb2QpOwotY2hhciAqcnNuZF9tb2RfZG1hX25hbWUoc3RydWN0IHJzbmRfbW9kICptb2QpOworc3RydWN0IGRtYV9jaGFuICpyc25kX21vZF9kbWFfcmVxKHN0cnVjdCByc25kX21vZCAqbW9kKTsKIAogLyoKICAqCVItQ2FyIHNvdW5kIERBSQogICovCiAjZGVmaW5lIFJTTkRfREFJX05BTUVfU0laRQkxNgogc3RydWN0IHJzbmRfZGFpX3N0cmVhbSB7CisJY2hhciBuYW1lW1JTTkRfREFJX05BTUVfU0laRV07CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW07CiAJc3RydWN0IHJzbmRfbW9kICptb2RbUlNORF9NT0RfTUFYXTsKIAlzdHJ1Y3QgcnNuZF9kYWlfcGF0aF9pbmZvICppbmZvOyAvKiByY2FyX3NuZC5oICovCkBAIC0zMzEsOSArMzY2LDcgQEAKIHZvaWQgX19pb21lbSAqcnNuZF9nZW5fcmVnX2dldChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAogCQkJICAgICAgIHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkJICAgICAgIGVudW0gcnNuZF9yZWcgcmVnKTsKLWRtYV9hZGRyX3QgcnNuZF9nZW5fZG1hX2FkZHIoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKLQkJICAgICAgIHN0cnVjdCByc25kX21vZCAqbW9kLAotCQkgICAgICAgaW50IGlzX3BsYXksICBpbnQgaXNfZnJvbSk7CitwaHlzX2FkZHJfdCByc25kX2dlbl9nZXRfcGh5X2FkZHIoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgaW50IHJlZ19pZCk7CiAKICNkZWZpbmUgcnNuZF9pc19nZW4xKHMpCQkoKChzKS0+aW5mby0+ZmxhZ3MgJiBSU05EX0dFTl9NQVNLKSA9PSBSU05EX0dFTjEpCiAjZGVmaW5lIHJzbmRfaXNfZ2VuMihzKQkJKCgocyktPmluZm8tPmZsYWdzICYgUlNORF9HRU5fTUFTSykgPT0gUlNORF9HRU4yKQpAQCAtMzg5LDYgKzQyMiwxMSBAQAogCXZvaWQgKmFkZzsKIAogCS8qCisJICogYmVsb3cgdmFsdWUgd2lsbCBiZSBmaWxsZWQgb24gcnNuZF9kbWFfcHJvYmUoKQorCSAqLworCXZvaWQgKmRtYTsKKworCS8qCiAJICogYmVsb3cgdmFsdWUgd2lsbCBiZSBmaWxsZWQgb24gcnNuZF9zc2lfcHJvYmUoKQogCSAqLwogCXZvaWQgKnNzaTsKQEAgLTQxNCwxOSArNDUyLDYgQEAKICNkZWZpbmUgcnNuZF9sb2NrKHByaXYsIGZsYWdzKSBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpCiAjZGVmaW5lIHJzbmRfdW5sb2NrKHByaXYsIGZsYWdzKSBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncykKIAotI2RlZmluZSByc25kX2luZm9faXNfcGxheWJhY2socHJpdiwgdHlwZSkJCQkJXAotKHsJCQkJCQkJCQlcCi0Jc3RydWN0IHJjYXJfc25kX2luZm8gKmluZm8gPSByc25kX3ByaXZfdG9faW5mbyhwcml2KTsJCVwKLQlpbnQgaSwgaXNfcGxheSA9IDA7CQkJCQkJXAotCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5kYWlfaW5mb19ucjsgaSsrKSB7CQkJXAotCQlpZiAoaW5mby0+ZGFpX2luZm9baV0ucGxheWJhY2sudHlwZSA9PSAodHlwZSktPmluZm8pIHsJXAotCQkJaXNfcGxheSA9IDE7CQkJCQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCX0JCQkJCQkJXAotCX0JCQkJCQkJCVwKLQlpc19wbGF5OwkJCQkJCQlcCi19KQotCiAvKgogICoJcnNuZF9rY3RybAogICovCkBAIC00ODAsNiArNTA1LDggQEAKIGludCByc25kX3NyY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAogCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKK3ZvaWQgcnNuZF9zcmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7CiBzdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc3JjX21vZF9nZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgaW50IGlkKTsKIHVuc2lnbmVkIGludCByc25kX3NyY19nZXRfc3NpX3JhdGUoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwKIAkJCQkgICBzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbywKQEAgLTQ5OCw5ICs1MjUsMTIgQEAKIGludCByc25kX3NzaV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQkgICBjb25zdCBzdHJ1Y3QgcnNuZF9vZl9kYXRhICpvZl9kYXRhLAogCQkgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KTsKK3ZvaWQgcnNuZF9zc2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdik7CiBzdHJ1Y3QgcnNuZF9tb2QgKnJzbmRfc3NpX21vZF9nZXQoc3RydWN0IHJzbmRfcHJpdiAqcHJpdiwgaW50IGlkKTsKIGludCByc25kX3NzaV9pc19waW5fc2hhcmluZyhzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7CiBpbnQgcnNuZF9zc2lfaXNfZG1hX21vZGUoc3RydWN0IHJzbmRfbW9kICptb2QpOworaW50IHJzbmRfc3NpX3VzZV9idXNpZihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCk7CiAKIC8qCiAgKglSLUNhciBEVkMKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zaC9yY2FyL3JzcmMtY2FyZC5jIGIvc291bmQvc29jL3NoL3JjYXIvcnNyYy1jYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4NTE3YQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL3JzcmMtY2FyZC5jCkBAIC0wLDAgKzEsNTEyIEBACisvKgorICogUmVuZXNhcyBTYW1wbGluZyBSYXRlIENvbnZlcnQgU291bmQgQ2FyZCBmb3IgRFBDTQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgorICogS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPgorICoKKyAqIGJhc2VkIG9uICR7TElOVVh9L3NvdW5kL3NvYy9nZW5lcmljL3NpbXBsZS1jYXJkLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxzb3VuZC9qYWNrLmg+CisjaW5jbHVkZSA8c291bmQvc29jLmg+CisjaW5jbHVkZSA8c291bmQvc29jLWRhaS5oPgorCitzdHJ1Y3QgcnNyY19jYXJkX29mX2RhdGEgeworCWNvbnN0IGNoYXIgKnByZWZpeDsKKwljb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3JvdXRlICpyb3V0ZXM7CisJaW50IG51bV9yb3V0ZXM7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSByb3V0ZXNfc3NpMF9hazQ2NDJbXSA9IHsKKwl7ImFrNDY0MiBQbGF5YmFjayIsIE5VTEwsICJEQUkwIFBsYXliYWNrIn0sCisJeyJEQUkwIENhcHR1cmUiLCBOVUxMLCAiYWs0NjQyIENhcHR1cmUifSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnNyY19jYXJkX29mX2RhdGEgcm91dGVzX29mX3NzaTBfYWs0NjQyID0geworCS5wcmVmaXgJCT0gImFrNDY0MiIsCisJLnJvdXRlcwkJPSByb3V0ZXNfc3NpMF9hazQ2NDIsCisJLm51bV9yb3V0ZXMJPSBBUlJBWV9TSVpFKHJvdXRlc19zc2kwX2FrNDY0MiksCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCByc3JjX2NhcmRfb2ZfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gInJlbmVzYXMscnNyYy1jYXJkLGxhZ2VyIiwJLmRhdGEgPSAmcm91dGVzX29mX3NzaTBfYWs0NjQyIH0sCisJeyAuY29tcGF0aWJsZSA9ICJyZW5lc2FzLHJzcmMtY2FyZCxrb2Vsc2NoIiwJLmRhdGEgPSAmcm91dGVzX29mX3NzaTBfYWs0NjQyIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgcnNyY19jYXJkX29mX21hdGNoKTsKKworc3RydWN0IHJzcmNfY2FyZF9kYWkgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgaW50IGZtdDsKKwl1bnNpZ25lZCBpbnQgc3lzY2xrOworCXN0cnVjdCBjbGsgKmNsazsKK307CisKKyNkZWZpbmUgUlNSQ19GQl9OVU0JMiAvKiBGRS9CRSAqLworI2RlZmluZSBJRFhfQ1BVCQkwCisjZGVmaW5lIElEWF9DT0RFQwkxCitzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgeworCXN0cnVjdCBzbmRfc29jX2NhcmQgc25kX2NhcmQ7CisJc3RydWN0IHJzcmNfY2FyZF9kYWlfcHJvcHMgeworCQlzdHJ1Y3QgcnNyY19jYXJkX2RhaSBjcHVfZGFpOworCQlzdHJ1Y3QgcnNyY19jYXJkX2RhaSBjb2RlY19kYWk7CisJfSBkYWlfcHJvcHNbUlNSQ19GQl9OVU1dOworCXN0cnVjdCBzbmRfc29jX2NvZGVjX2NvbmYgY29kZWNfY29uZjsKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayBkYWlfbGlua1tSU1JDX0ZCX05VTV07CisJdTMyIGNvbnZlcnRfcmF0ZTsKK307CisKKyNkZWZpbmUgcnNyY19wcml2X3RvX2Rldihwcml2KSAoKHByaXYpLT5zbmRfY2FyZC5kZXYpCisjZGVmaW5lIHJzcmNfcHJpdl90b19saW5rKHByaXYsIGkpICgocHJpdiktPnNuZF9jYXJkLmRhaV9saW5rICsgaSkKKyNkZWZpbmUgcnNyY19wcml2X3RvX3Byb3BzKHByaXYsIGkpICgocHJpdiktPmRhaV9wcm9wcyArIGkpCisjZGVmaW5lIHJzcmNfZGV2X3RvX29mX2RhdGEoZGV2KSAob2ZfbWF0Y2hfZGV2aWNlKHJzcmNfY2FyZF9vZl9tYXRjaCwgKGRldikpLT5kYXRhKQorCitzdGF0aWMgaW50IHJzcmNfY2FyZF9zdGFydHVwKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYgPQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKKwlzdHJ1Y3QgcnNyY19jYXJkX2RhaV9wcm9wcyAqZGFpX3Byb3BzID0KKwkJJnByaXYtPmRhaV9wcm9wc1tydGQgLSBydGQtPmNhcmQtPnJ0ZF07CisJaW50IHJldDsKKworCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShkYWlfcHJvcHMtPmNwdV9kYWkuY2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKGRhaV9wcm9wcy0+Y29kZWNfZGFpLmNsayk7CisJaWYgKHJldCkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGRhaV9wcm9wcy0+Y3B1X2RhaS5jbGspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcnNyY19jYXJkX3NodXRkb3duKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQgPSBzdWJzdHJlYW0tPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYgPQlzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKKwlzdHJ1Y3QgcnNyY19jYXJkX2RhaV9wcm9wcyAqZGFpX3Byb3BzID0KKwkJJnByaXYtPmRhaV9wcm9wc1tydGQgLSBydGQtPmNhcmQtPnJ0ZF07CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZGFpX3Byb3BzLT5jcHVfZGFpLmNsayk7CisKKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZGFpX3Byb3BzLT5jb2RlY19kYWkuY2xrKTsKK30KKworc3RhdGljIHN0cnVjdCBzbmRfc29jX29wcyByc3JjX2NhcmRfb3BzID0geworCS5zdGFydHVwID0gcnNyY19jYXJkX3N0YXJ0dXAsCisJLnNodXRkb3duID0gcnNyY19jYXJkX3NodXRkb3duLAorfTsKKworc3RhdGljIGludCBfX3JzcmNfY2FyZF9kYWlfaW5pdChzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSwKKwkJCQlzdHJ1Y3QgcnNyY19jYXJkX2RhaSAqc2V0KQoreworCWludCByZXQ7CisKKwlpZiAoc2V0LT5mbXQpIHsKKwkJcmV0ID0gc25kX3NvY19kYWlfc2V0X2ZtdChkYWksIHNldC0+Zm10KTsKKwkJaWYgKHJldCAmJiByZXQgIT0gLUVOT1RTVVBQKSB7CisJCQlkZXZfZXJyKGRhaS0+ZGV2LCAic2V0X2ZtdCBlcnJvclxuIik7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCWlmIChzZXQtPnN5c2NsaykgeworCQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfc3lzY2xrKGRhaSwgMCwgc2V0LT5zeXNjbGssIDApOworCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PVFNVUFApIHsKKwkJCWRldl9lcnIoZGFpLT5kZXYsICJzZXRfc3lzY2xrIGVycm9yXG4iKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfQorCisJcmV0ID0gMDsKKworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnNyY19jYXJkX2RhaV9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2ID0Jc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CisJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlYyA9IHJ0ZC0+Y29kZWNfZGFpOworCXN0cnVjdCBzbmRfc29jX2RhaSAqY3B1ID0gcnRkLT5jcHVfZGFpOworCXN0cnVjdCByc3JjX2NhcmRfZGFpX3Byb3BzICpkYWlfcHJvcHM7CisJaW50IG51bSwgcmV0OworCisJbnVtID0gcnRkIC0gcnRkLT5jYXJkLT5ydGQ7CisJZGFpX3Byb3BzID0gJnByaXYtPmRhaV9wcm9wc1tudW1dOworCXJldCA9IF9fcnNyY19jYXJkX2RhaV9pbml0KGNvZGVjLCAmZGFpX3Byb3BzLT5jb2RlY19kYWkpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gX19yc3JjX2NhcmRfZGFpX2luaXQoY3B1LCAmZGFpX3Byb3BzLT5jcHVfZGFpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzcmNfY2FyZF9iZV9od19wYXJhbXNfZml4dXAoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCwKKwkJCQkJc3RydWN0IHNuZF9wY21faHdfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2ID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CisJc3RydWN0IHNuZF9pbnRlcnZhbCAqcmF0ZSA9IGh3X3BhcmFtX2ludGVydmFsKHBhcmFtcywKKwkJCQkJCSAgICAgIFNORFJWX1BDTV9IV19QQVJBTV9SQVRFKTsKKworCWlmICghcHJpdi0+Y29udmVydF9yYXRlKQorCQlyZXR1cm4gMDsKKworCXJhdGUtPm1pbiA9IHJhdGUtPm1heCA9IHByaXYtPmNvbnZlcnRfcmF0ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cityc3JjX2NhcmRfc3ViX3BhcnNlX29mKHN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdiwKKwkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCSAgICAgICBzdHJ1Y3QgcnNyY19jYXJkX2RhaSAqZGFpLAorCQkgICAgICAgc3RydWN0IHNuZF9zb2NfZGFpX2xpbmsgKmRhaV9saW5rLAorCQkgICAgICAgaW50ICphcmdzX2NvdW50KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzcmNfcHJpdl90b19kZXYocHJpdik7CisJY29uc3Qgc3RydWN0IHJzcmNfY2FyZF9vZl9kYXRhICpvZl9kYXRhID0gcnNyY19kZXZfdG9fb2ZfZGF0YShkZXYpOworCXN0cnVjdCBvZl9waGFuZGxlX2FyZ3MgYXJnczsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKipwX25vZGU7CisJc3RydWN0IGNsayAqY2xrOworCWNvbnN0IGNoYXIgKipkYWlfbmFtZTsKKwljb25zdCBjaGFyICoqbmFtZTsKKwl1MzIgdmFsOworCWludCByZXQ7CisKKwlpZiAoYXJnc19jb3VudCkgeworCQlwX25vZGUJCT0gJmRhaV9saW5rLT5jcHVfb2Zfbm9kZTsKKwkJZGFpX25hbWUJPSAmZGFpX2xpbmstPmNwdV9kYWlfbmFtZTsKKwkJbmFtZQkJPSAmZGFpX2xpbmstPmNwdV9uYW1lOworCX0gZWxzZSB7CisJCXBfbm9kZQkJPSAmZGFpX2xpbmstPmNvZGVjX29mX25vZGU7CisJCWRhaV9uYW1lCT0gJmRhaV9saW5rLT5jb2RlY19kYWlfbmFtZTsKKwkJbmFtZQkJPSAmZGFpX2xpbmstPmNvZGVjX25hbWU7CisJfQorCisJaWYgKCFucCkgeworCQkvKiB1c2Ugc25kLXNvYy1kdW1teSAqLworCQkqcF9ub2RlCQk9IE5VTEw7CisJCSpkYWlfbmFtZQk9ICJzbmQtc29jLWR1bW15LWRhaSI7CisJCSpuYW1lCQk9ICJzbmQtc29jLWR1bW15IjsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBHZXQgbm9kZSB2aWEgInNvdW5kLWRhaSA9IDwmcGhhbmRsZSBwb3J0PiIKKwkgKiBpdCB3aWxsIGJlIHVzZWQgYXMgeHh4X29mX25vZGUgb24gc29jX2JpbmRfZGFpX2xpbmsoKQorCSAqLworCXJldCA9IG9mX3BhcnNlX3BoYW5kbGVfd2l0aF9hcmdzKG5wLCAic291bmQtZGFpIiwKKwkJCQkJICIjc291bmQtZGFpLWNlbGxzIiwgMCwgJmFyZ3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkqcF9ub2RlID0gYXJncy5ucDsKKworCS8qIEdldCBkYWktPm5hbWUgKi8KKwlyZXQgPSBzbmRfc29jX29mX2dldF9kYWlfbmFtZShucCwgZGFpX25hbWUpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBGSVhNRQorCSAqCisJICogcnNyYyBhc3N1bWVzIERQQ00gcGxheWJhY2svY2FwdHVyZQorCSAqLworCWRhaV9saW5rLT5kcGNtX3BsYXliYWNrID0gMTsKKwlkYWlfbGluay0+ZHBjbV9jYXB0dXJlID0gMTsKKworCWlmIChhcmdzX2NvdW50KSB7CisJCSphcmdzX2NvdW50ID0gYXJncy5hcmdzX2NvdW50OworCQlkYWlfbGluay0+ZHluYW1pYyA9IDE7CisJfSBlbHNlIHsKKwkJZGFpX2xpbmstPm5vX3BjbSA9IDE7CisJCXByaXYtPmNvZGVjX2NvbmYub2Zfbm9kZSA9ICgqcF9ub2RlKTsKKwkJcHJpdi0+Y29kZWNfY29uZi5uYW1lX3ByZWZpeCA9IG9mX2RhdGEtPnByZWZpeDsKKwl9CisKKwkvKgorCSAqIFBhcnNlIGRhaS0+c3lzY2xrIGNvbWUgZnJvbSAiY2xvY2tzID0gPCZ4eHg+IgorCSAqIChpZiBzeXN0ZW0gaGFzIGNvbW1vbiBjbG9jaykKKwkgKiAgb3IgInN5c3RlbS1jbG9jay1mcmVxdWVuY3kgPSA8eHh4PiIKKwkgKiAgb3IgZGV2aWNlJ3MgbW9kdWxlIGNsb2NrLgorCSAqLworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJjbG9ja3MiKSkgeworCQljbGsgPSBvZl9jbGtfZ2V0KG5wLCAwKTsKKwkJaWYgKElTX0VSUihjbGspKSB7CisJCQlyZXQgPSBQVFJfRVJSKGNsayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJZGFpLT5zeXNjbGsgPSBjbGtfZ2V0X3JhdGUoY2xrKTsKKwkJZGFpLT5jbGsgPSBjbGs7CisJfSBlbHNlIGlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJzeXN0ZW0tY2xvY2stZnJlcXVlbmN5IiwgJnZhbCkpIHsKKwkJZGFpLT5zeXNjbGsgPSB2YWw7CisJfSBlbHNlIHsKKwkJY2xrID0gb2ZfY2xrX2dldChhcmdzLm5wLCAwKTsKKwkJaWYgKCFJU19FUlIoY2xrKSkKKwkJCWRhaS0+c3lzY2xrID0gY2xrX2dldF9yYXRlKGNsayk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNyY19jYXJkX3BhcnNlX2RhaWZtdChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJICBzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvZGVjLAorCQkJCSAgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmJpdGNsa21hc3RlciA9IE5VTEw7CisJc3RydWN0IGRldmljZV9ub2RlICpmcmFtZW1hc3RlciA9IE5VTEw7CisJc3RydWN0IHJzcmNfY2FyZF9kYWlfcHJvcHMgKmRhaV9wcm9wcyA9IHJzcmNfcHJpdl90b19wcm9wcyhwcml2LCBpZHgpOworCXN0cnVjdCByc3JjX2NhcmRfZGFpICpjcHVfZGFpID0gJmRhaV9wcm9wcy0+Y3B1X2RhaTsKKwlzdHJ1Y3QgcnNyY19jYXJkX2RhaSAqY29kZWNfZGFpID0gJmRhaV9wcm9wcy0+Y29kZWNfZGFpOworCXVuc2lnbmVkIGludCBkYWlmbXQ7CisKKwlkYWlmbXQgPSBzbmRfc29jX29mX3BhcnNlX2RhaWZtdChub2RlLCBOVUxMLAorCQkJCQkgJmJpdGNsa21hc3RlciwgJmZyYW1lbWFzdGVyKTsKKwlkYWlmbXQgJj0gflNORF9TT0NfREFJRk1UX01BU1RFUl9NQVNLOworCisJaWYgKCFiaXRjbGttYXN0ZXIgJiYgIWZyYW1lbWFzdGVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb2RlYyA9PSBiaXRjbGttYXN0ZXIpCisJCWRhaWZtdCB8PSAoY29kZWMgPT0gZnJhbWVtYXN0ZXIpID8KKwkJCVNORF9TT0NfREFJRk1UX0NCTV9DRk0gOiBTTkRfU09DX0RBSUZNVF9DQk1fQ0ZTOworCWVsc2UKKwkJZGFpZm10IHw9IChjb2RlYyA9PSBmcmFtZW1hc3RlcikgPworCQkJU05EX1NPQ19EQUlGTVRfQ0JTX0NGTSA6IFNORF9TT0NfREFJRk1UX0NCU19DRlM7CisKKwljcHVfZGFpLT5mbXQJPSBkYWlmbXQ7CisJY29kZWNfZGFpLT5mbXQJPSBkYWlmbXQ7CisKKwlvZl9ub2RlX3B1dChiaXRjbGttYXN0ZXIpOworCW9mX25vZGVfcHV0KGZyYW1lbWFzdGVyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJzcmNfY2FyZF9kYWlfbGlua19vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkJIHN0cnVjdCByc3JjX2NhcmRfcHJpdiAqcHJpdiwKKwkJCQkgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc3JjX3ByaXZfdG9fZGV2KHByaXYpOworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluayA9IHJzcmNfcHJpdl90b19saW5rKHByaXYsIGlkeCk7CisJc3RydWN0IHJzcmNfY2FyZF9kYWlfcHJvcHMgKmRhaV9wcm9wcyA9IHJzcmNfcHJpdl90b19wcm9wcyhwcml2LCBpZHgpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1ID0gTlVMTDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvZGVjID0gTlVMTDsKKwljaGFyICpuYW1lOworCWNoYXIgcHJvcFsxMjhdOworCWludCByZXQsIGNwdV9hcmdzOworCisJY3B1ID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobm9kZSwgImNwdSIpOworCWNvZGVjID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUobm9kZSwgImNvZGVjIik7CisKKwlpZiAoIWNwdSB8fCAhY29kZWMpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2VycihkZXYsICIlczogQ2FuJ3QgZmluZCAlcyBEVCBub2RlXG4iLCBfX2Z1bmNfXywgcHJvcCk7CisJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOworCX0KKworCXJldCA9IHJzcmNfY2FyZF9wYXJzZV9kYWlmbXQobm9kZSwgcHJpdiwgY29kZWMsIGlkeCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOworCisJcmV0ID0gcnNyY19jYXJkX3N1Yl9wYXJzZV9vZihwcml2LCAoaWR4ID09IElEWF9DUFUpID8gY3B1IDogTlVMTCwKKwkJCQkgICAgICZkYWlfcHJvcHMtPmNwdV9kYWksCisJCQkJICAgICBkYWlfbGluaywKKwkJCQkgICAgICZjcHVfYXJncyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOworCisJcmV0ID0gcnNyY19jYXJkX3N1Yl9wYXJzZV9vZihwcml2LCAoaWR4ID09IElEWF9DT0RFQykgPyBjb2RlYyA6IE5VTEwsCisJCQkJICAgICAmZGFpX3Byb3BzLT5jb2RlY19kYWksCisJCQkJICAgICBkYWlfbGluaywKKwkJCQkgICAgIE5VTEwpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGRhaV9saW5rX29mX2VycjsKKworCWlmICghZGFpX2xpbmstPmNwdV9kYWlfbmFtZSB8fCAhZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZGFpX2xpbmtfb2ZfZXJyOworCX0KKworCS8qIFNpbXBsZSBDYXJkIGFzc3VtZXMgcGxhdGZvcm0gPT0gY3B1ICovCisJZGFpX2xpbmstPnBsYXRmb3JtX29mX25vZGUgPSBkYWlfbGluay0+Y3B1X29mX25vZGU7CisKKwkvKiBEQUkgbGluayBuYW1lIGlzIGNyZWF0ZWQgZnJvbSBDUFUvQ09ERUMgZGFpIG5hbWUgKi8KKwluYW1lID0gZGV2bV9remFsbG9jKGRldiwKKwkJCSAgICBzdHJsZW4oZGFpX2xpbmstPmNwdV9kYWlfbmFtZSkgICArCisJCQkgICAgc3RybGVuKGRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSkgKyAyLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghbmFtZSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGRhaV9saW5rX29mX2VycjsKKwl9CisKKwlzcHJpbnRmKG5hbWUsICIlcy0lcyIsIGRhaV9saW5rLT5jcHVfZGFpX25hbWUsCisJCWRhaV9saW5rLT5jb2RlY19kYWlfbmFtZSk7CisJZGFpX2xpbmstPm5hbWUgPSBkYWlfbGluay0+c3RyZWFtX25hbWUgPSBuYW1lOworCWRhaV9saW5rLT5vcHMgPSAmcnNyY19jYXJkX29wczsKKwlkYWlfbGluay0+aW5pdCA9IHJzcmNfY2FyZF9kYWlfaW5pdDsKKworCWlmIChpZHggPT0gSURYX0NPREVDKQorCQlkYWlfbGluay0+YmVfaHdfcGFyYW1zX2ZpeHVwID0gcnNyY19jYXJkX2JlX2h3X3BhcmFtc19maXh1cDsKKworCWRldl9kYmcoZGV2LCAiXHRuYW1lIDogJXNcbiIsIGRhaV9saW5rLT5zdHJlYW1fbmFtZSk7CisJZGV2X2RiZyhkZXYsICJcdGNwdSA6ICVzIC8gJTA0eCAvICVkXG4iLAorCQlkYWlfbGluay0+Y3B1X2RhaV9uYW1lLAorCQlkYWlfcHJvcHMtPmNwdV9kYWkuZm10LAorCQlkYWlfcHJvcHMtPmNwdV9kYWkuc3lzY2xrKTsKKwlkZXZfZGJnKGRldiwgIlx0Y29kZWMgOiAlcyAvICUwNHggLyAlZFxuIiwKKwkJZGFpX2xpbmstPmNvZGVjX2RhaV9uYW1lLAorCQlkYWlfcHJvcHMtPmNvZGVjX2RhaS5mbXQsCisJCWRhaV9wcm9wcy0+Y29kZWNfZGFpLnN5c2Nsayk7CisKKwkvKgorCSAqIEluIHNvY19iaW5kX2RhaV9saW5rKCkgd2lsbCBjaGVjayBjcHUgbmFtZSBhZnRlcgorCSAqIG9mX25vZGUgbWF0Y2hpbmcgaWYgZGFpX2xpbmsgaGFzIGNwdV9kYWlfbmFtZS4KKwkgKiBidXQsIGl0IHdpbGwgbmV2ZXIgbWF0Y2ggaWYgbmFtZSB3YXMgY3JlYXRlZCBieQorCSAqIGZtdF9zaW5nbGVfbmFtZSgpIHJlbW92ZSBjcHVfZGFpX25hbWUgaWYgY3B1X2FyZ3MKKwkgKiB3YXMgMC4gU2VlOgorCSAqCWZtdF9zaW5nbGVfbmFtZSgpCisJICoJZm10X211bHRpcGxlX25hbWUoKQorCSAqLworCWlmICghY3B1X2FyZ3MpCisJCWRhaV9saW5rLT5jcHVfZGFpX25hbWUgPSBOVUxMOworCitkYWlfbGlua19vZl9lcnI6CisJb2Zfbm9kZV9wdXQoY3B1KTsKKwlvZl9ub2RlX3B1dChjb2RlYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJzcmNfY2FyZF9wYXJzZV9vZihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsCisJCQkgICAgICBzdHJ1Y3QgcnNyY19jYXJkX3ByaXYgKnByaXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnNyY19wcml2X3RvX2Rldihwcml2KTsKKwljb25zdCBzdHJ1Y3QgcnNyY19jYXJkX29mX2RhdGEgKm9mX2RhdGEgPSByc3JjX2Rldl90b19vZl9kYXRhKGRldik7CisJaW50IHJldDsKKwlpbnQgaTsKKworCWlmICghbm9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBQYXJzZSB0aGUgY2FyZCBuYW1lIGZyb20gRFQgKi8KKwlzbmRfc29jX29mX3BhcnNlX2NhcmRfbmFtZSgmcHJpdi0+c25kX2NhcmQsICJjYXJkLW5hbWUiKTsKKworCS8qIERBUE0gcm91dGVzICovCisJcHJpdi0+c25kX2NhcmQub2ZfZGFwbV9yb3V0ZXMJCT0gb2ZfZGF0YS0+cm91dGVzOworCXByaXYtPnNuZF9jYXJkLm51bV9vZl9kYXBtX3JvdXRlcwk9IG9mX2RhdGEtPm51bV9yb3V0ZXM7CisKKwkvKiBzYW1wbGluZyByYXRlIGNvbnZlcnQgKi8KKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihub2RlLCAiY29udmVydC1yYXRlIiwgJnByaXYtPmNvbnZlcnRfcmF0ZSk7CisKKwlkZXZfZGJnKGRldiwgIk5ldyByc3JjLWF1ZGlvLWNhcmQ6ICVzICglZClcbiIsCisJCXByaXYtPnNuZF9jYXJkLm5hbWUgPyBwcml2LT5zbmRfY2FyZC5uYW1lIDogIiIsCisJCXByaXYtPmNvbnZlcnRfcmF0ZSk7CisKKwkvKiBGRS9CRSAqLworCWZvciAoaSA9IDA7IGkgPCBSU1JDX0ZCX05VTTsgaSsrKSB7CisJCXJldCA9IHJzcmNfY2FyZF9kYWlfbGlua19vZihub2RlLCBwcml2LCBpKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghcHJpdi0+c25kX2NhcmQubmFtZSkKKwkJcHJpdi0+c25kX2NhcmQubmFtZSA9IHByaXYtPnNuZF9jYXJkLmRhaV9saW5rLT5uYW1lOworCisJcmV0dXJuIDA7Cit9CisKKy8qIERlY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIGRldmljZSBub2RlcyAqLworc3RhdGljIGludCByc3JjX2NhcmRfdW5yZWYoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3Qgc25kX3NvY19kYWlfbGluayAqZGFpX2xpbms7CisJaW50IG51bV9saW5rczsKKworCWZvciAobnVtX2xpbmtzID0gMCwgZGFpX2xpbmsgPSBjYXJkLT5kYWlfbGluazsKKwkgICAgIG51bV9saW5rcyA8IGNhcmQtPm51bV9saW5rczsKKwkgICAgIG51bV9saW5rcysrLCBkYWlfbGluaysrKSB7CisJCW9mX25vZGVfcHV0KGRhaV9saW5rLT5jcHVfb2Zfbm9kZSk7CisJCW9mX25vZGVfcHV0KGRhaV9saW5rLT5jb2RlY19vZl9ub2RlKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNyY19jYXJkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJzcmNfY2FyZF9wcml2ICpwcml2OworCXN0cnVjdCBzbmRfc29jX2RhaV9saW5rICpkYWlfbGluazsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlpbnQgcmV0OworCisJLyogQWxsb2NhdGUgdGhlIHByaXZhdGUgZGF0YSAqLworCXByaXYgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKnByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogSW5pdCBzbmRfc29jX2NhcmQgKi8KKwlwcml2LT5zbmRfY2FyZC5vd25lciA9IFRISVNfTU9EVUxFOworCXByaXYtPnNuZF9jYXJkLmRldiA9IGRldjsKKwlkYWlfbGluayA9IHByaXYtPmRhaV9saW5rOworCXByaXYtPnNuZF9jYXJkLmRhaV9saW5rID0gZGFpX2xpbms7CisJcHJpdi0+c25kX2NhcmQubnVtX2xpbmtzID0gUlNSQ19GQl9OVU07CisJcHJpdi0+c25kX2NhcmQuY29kZWNfY29uZiA9ICZwcml2LT5jb2RlY19jb25mOworCXByaXYtPnNuZF9jYXJkLm51bV9jb25maWdzID0gMTsKKworCXJldCA9IHJzcmNfY2FyZF9wYXJzZV9vZihucCwgcHJpdik7CisJaWYgKHJldCA8IDApIHsKKwkJaWYgKHJldCAhPSAtRVBST0JFX0RFRkVSKQorCQkJZGV2X2VycihkZXYsICJwYXJzZSBlcnJvciAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnI7CisJfQorCisJc25kX3NvY19jYXJkX3NldF9kcnZkYXRhKCZwcml2LT5zbmRfY2FyZCwgcHJpdik7CisKKwlyZXQgPSBkZXZtX3NuZF9zb2NfcmVnaXN0ZXJfY2FyZCgmcGRldi0+ZGV2LCAmcHJpdi0+c25kX2NhcmQpOworCWlmIChyZXQgPj0gMCkKKwkJcmV0dXJuIHJldDsKK2VycjoKKwlyc3JjX2NhcmRfdW5yZWYoJnByaXYtPnNuZF9jYXJkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcnNyY19jYXJkX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJldHVybiByc3JjX2NhcmRfdW5yZWYoY2FyZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJzcmNfY2FyZCA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJyZW5lc2FzLXNyYy1hdWRpby1jYXJkIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gcnNyY19jYXJkX29mX21hdGNoLAorCX0sCisJLnByb2JlID0gcnNyY19jYXJkX3Byb2JlLAorCS5yZW1vdmUgPSByc3JjX2NhcmRfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihyc3JjX2NhcmQpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnJlbmVzYXMtc3JjLWF1ZGlvLWNhcmQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVuZXNhcyBTYW1wbGluZyBSYXRlIENvbnZlcnQgU291bmQgQ2FyZCIpOworTU9EVUxFX0FVVEhPUigiS3VuaW5vcmkgTW9yaW1vdG8gPGt1bmlub3JpLm1vcmltb3RvLmd4QHJlbmVzYXMuY29tPiIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NoL3JjYXIvc3JjLmMgYi9zb3VuZC9zb2Mvc2gvcmNhci9zcmMuYwppbmRleCA4MWMxODJiLi4zYmViMzJlIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2gvcmNhci9zcmMuYworKysgYi9zb3VuZC9zb2Mvc2gvcmNhci9zcmMuYwpAQCAtMjIsMTYgKzIyLDIwIEBACiBzdHJ1Y3QgcnNuZF9zcmMgewogCXN0cnVjdCByc25kX3NyY19wbGF0Zm9ybV9pbmZvICppbmZvOyAvKiByY2FyX3NuZC5oICovCiAJc3RydWN0IHJzbmRfbW9kIG1vZDsKKwlzdHJ1Y3QgcnNuZF9rY3RybF9jZmdfcyBzZW47ICAvKiBzeW5jIGNvbnZlcnQgZW5hYmxlICovCisJc3RydWN0IHJzbmRfa2N0cmxfY2ZnX3Mgc3luYzsgLyogc3luYyBjb252ZXJ0ICovCisJdTMyIGNvbnZlcnRfcmF0ZTsgLyogc2FtcGxpbmcgcmF0ZSBjb252ZXJ0ICovCiAJaW50IGVycjsKIH07CiAKICNkZWZpbmUgUlNORF9TUkNfTkFNRV9TSVpFIDE2CiAKLSNkZWZpbmUgcnNuZF9zcmNfY29udmVydF9yYXRlKHApICgocCktPmluZm8tPmNvbnZlcnRfcmF0ZSkKKyNkZWZpbmUgcnNuZF9lbmFibGVfc3luY19jb252ZXJ0KHNyYykgKChzcmMpLT5zZW4udmFsKQorI2RlZmluZSByc25kX3NyY19vZl9ub2RlKHByaXYpIFwKKwlvZl9nZXRfY2hpbGRfYnlfbmFtZShyc25kX3ByaXZfdG9fZGV2KHByaXYpLT5vZl9ub2RlLCAicmNhcl9zb3VuZCxzcmMiKQorCiAjZGVmaW5lIHJzbmRfbW9kX3RvX3NyYyhfbW9kKQkJCQlcCiAJY29udGFpbmVyX29mKChfbW9kKSwgc3RydWN0IHJzbmRfc3JjLCBtb2QpCi0jZGVmaW5lIHJzbmRfc3JjX2RtYV9hdmFpbGFibGUoc3JjKSBcCi0JcnNuZF9kbWFfYXZhaWxhYmxlKHJzbmRfbW9kX3RvX2RtYSgmKHNyYyktPm1vZCkpCiAKICNkZWZpbmUgZm9yX2VhY2hfcnNuZF9zcmMocG9zLCBwcml2LCBpKQkJCQlcCiAJZm9yICgoaSkgPSAwOwkJCQkJCVwKQEAgLTExMyw2ICsxMTcsMTcgQEAKIC8qCiAgKgkJR2VuMS9HZW4yIGNvbW1vbiBmdW5jdGlvbnMKICAqLworc3RhdGljIHN0cnVjdCBkbWFfY2hhbiAqcnNuZF9zcmNfZG1hX3JlcShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKK3sKKwlzdHJ1Y3QgcnNuZF9wcml2ICpwcml2ID0gcnNuZF9tb2RfdG9fcHJpdihtb2QpOworCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvID0gcnNuZF9tb2RfdG9faW8obW9kKTsKKwlpbnQgaXNfcGxheSA9IHJzbmRfaW9faXNfcGxheShpbyk7CisKKwlyZXR1cm4gcnNuZF9kbWFfcmVxdWVzdF9jaGFubmVsKHJzbmRfc3JjX29mX25vZGUocHJpdiksCisJCQkJCW1vZCwKKwkJCQkJaXNfcGxheSA/ICJyeCIgOiAidHgiKTsKK30KKwogaW50IHJzbmRfc3JjX3NzaXVfc3RhcnQoc3RydWN0IHJzbmRfbW9kICpzc2lfbW9kLAogCQkJaW50IHVzZV9idXNpZikKIHsKQEAgLTIyMCw2ICsyMzUsMzAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHUzMiByc25kX3NyY19jb252ZXJ0X3JhdGUoc3RydWN0IHJzbmRfc3JjICpzcmMpCit7CisJc3RydWN0IHJzbmRfbW9kICptb2QgPSAmc3JjLT5tb2Q7CisJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSByc25kX21vZF90b19pbyhtb2QpOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSByc25kX2lvX3RvX3J1bnRpbWUoaW8pOworCXUzMiBjb252ZXJ0X3JhdGU7CisKKwlpZiAoIXJ1bnRpbWUpCisJCXJldHVybiAwOworCisJaWYgKCFyc25kX2VuYWJsZV9zeW5jX2NvbnZlcnQoc3JjKSkKKwkJcmV0dXJuIHNyYy0+Y29udmVydF9yYXRlOworCisJY29udmVydF9yYXRlID0gc3JjLT5zeW5jLnZhbDsKKworCWlmICghY29udmVydF9yYXRlKQorCQljb252ZXJ0X3JhdGUgPSBzcmMtPmNvbnZlcnRfcmF0ZTsKKworCWlmICghY29udmVydF9yYXRlKQorCQljb252ZXJ0X3JhdGUgPSBydW50aW1lLT5yYXRlOworCisJcmV0dXJuIGNvbnZlcnRfcmF0ZTsKK30KKwogdW5zaWduZWQgaW50IHJzbmRfc3JjX2dldF9zc2lfcmF0ZShzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LAogCQkJCSAgIHN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvLAogCQkJCSAgIHN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUpCkBAIC0yNzYsNyArMzE1LDQzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcnNuZF9zcmNfaW5pdChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKK3N0YXRpYyBpbnQgcnNuZF9zcmNfaHdfcGFyYW1zKHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICAgICAgc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtICpzdWJzdHJlYW0sCisJCQkgICAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmZlX3BhcmFtcykKK3sKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCXN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpmZSA9IHN1YnN0cmVhbS0+cHJpdmF0ZV9kYXRhOworCisJLyogZGVmYXVsdCB2YWx1ZSAobWFpbmx5IGZvciBub24tRFQpICovCisJc3JjLT5jb252ZXJ0X3JhdGUgPSBzcmMtPmluZm8tPmNvbnZlcnRfcmF0ZTsKKworCS8qCisJICogU1JDIGFzc3VtZXMgdGhhdCBpdCBpcyB1c2VkIHVuZGVyIERQQ00gaWYgdXNlciB3YW50IHRvIHVzZQorCSAqIHNhbXBsaW5nIHJhdGUgY29udmVydC4gVGhlbiwgU1JDIHNob3VsZCBiZSBGRS4KKwkgKiBBbmQgdGhlbiwgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCAqYWZ0ZXIqIEJFIHNldHRpbmdzLgorCSAqIHRoaXMgbWVhbnMsIGVhY2ggQkUgYWxyZWFkeSBoYXMgZml4dXBlZCBod19wYXJhbXMuCisJICogc2VlCisJICoJZHBjbV9mZV9kYWlfaHdfcGFyYW1zKCkKKwkgKglkcGNtX2JlX2RhaV9od19wYXJhbXMoKQorCSAqLworCWlmIChmZS0+ZGFpX2xpbmstPmR5bmFtaWMpIHsKKwkJaW50IHN0cmVhbSA9IHN1YnN0cmVhbS0+c3RyZWFtOworCQlzdHJ1Y3Qgc25kX3NvY19kcGNtICpkcGNtOworCQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKmJlX3BhcmFtczsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRwY20sICZmZS0+ZHBjbVtzdHJlYW1dLmJlX2NsaWVudHMsIGxpc3RfYmUpIHsKKwkJCWJlX3BhcmFtcyA9ICZkcGNtLT5od19wYXJhbXM7CisKKwkJCWlmIChwYXJhbXNfcmF0ZShmZV9wYXJhbXMpICE9IHBhcmFtc19yYXRlKGJlX3BhcmFtcykpCisJCQkJc3JjLT5jb252ZXJ0X3JhdGUgPSBwYXJhbXNfcmF0ZShiZV9wYXJhbXMpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnNuZF9zcmNfaW5pdChzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKKwkJCSBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQogewogCXN0cnVjdCByc25kX3NyYyAqc3JjID0gcnNuZF9tb2RfdG9fc3JjKG1vZCk7CiAKQEAgLTI4NCw2ICszNTksOSBAQAogCiAJc3JjLT5lcnIgPSAwOwogCisJLyogcmVzZXQgc3luYyBjb252ZXJ0X3JhdGUgKi8KKwlzcmMtPnN5bmMudmFsID0gMDsKKwogCS8qCiAJICogSW5pdGlhbGl6ZSB0aGUgb3BlcmF0aW9uIG9mIHRoZSBTUkMgaW50ZXJuYWwgY2lyY3VpdHMKIAkgKiBzZWUgcnNuZF9zcmNfc3RhcnQoKQpAQCAtMzA1LDYgKzM4MywxMSBAQAogCQlkZXZfd2FybihkZXYsICIlc1slZF0gdW5kZXIvb3ZlciBmbG93IGVyciA9ICVkXG4iLAogCQkJIHJzbmRfbW9kX25hbWUobW9kKSwgcnNuZF9tb2RfaWQobW9kKSwgc3JjLT5lcnIpOwogCisJc3JjLT5jb252ZXJ0X3JhdGUgPSAwOworCisJLyogcmVzZXQgc3luYyBjb252ZXJ0X3JhdGUgKi8KKwlzcmMtPnN5bmMudmFsID0gMDsKKwogCXJldHVybiAwOwogfQogCkBAIC00NDgsMjMgKzUzMSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJzbmRfc3JjX3Byb2JlX2dlbjEoc3RydWN0IHJzbmRfbW9kICptb2QsCi0JCQkgICAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSByc25kX3ByaXZfdG9fZGV2KHByaXYpOwotCi0JZGV2X2RiZyhkZXYsICIlc1slZF0gKEdlbjEpIGlzIHByb2JlZFxuIiwKLQkJcnNuZF9tb2RfbmFtZShtb2QpLCByc25kX21vZF9pZChtb2QpKTsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHJzbmRfc3JjX2luaXRfZ2VuMShzdHJ1Y3QgcnNuZF9tb2QgKm1vZCwKIAkJCSAgICAgIHN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHJzbmRfc3JjX2luaXQobW9kKTsKKwlyZXQgPSByc25kX3NyY19pbml0KG1vZCwgcHJpdik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTUwNSwxMSArNTc3LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcnNuZF9tb2Rfb3BzIHJzbmRfc3JjX2dlbjFfb3BzID0gewogCS5uYW1lCT0gU1JDX05BTUUsCi0JLnByb2JlCT0gcnNuZF9zcmNfcHJvYmVfZ2VuMSwKKwkuZG1hX3JlcSA9IHJzbmRfc3JjX2RtYV9yZXEsCiAJLmluaXQJPSByc25kX3NyY19pbml0X2dlbjEsCiAJLnF1aXQJPSByc25kX3NyY19xdWl0LAogCS5zdGFydAk9IHJzbmRfc3JjX3N0YXJ0X2dlbjEsCiAJLnN0b3AJPSByc25kX3NyY19zdG9wX2dlbjEsCisJLmh3X3BhcmFtcyA9IHJzbmRfc3JjX2h3X3BhcmFtcywKIH07CiAKIC8qCkBAIC02MDcsMTMgKzY4MCwxNyBAQAogCiAJaWYgKHJzbmRfc3JjX2Vycm9yX3JlY29yZF9nZW4yKG1vZCkpIHsKIAkJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKKwkJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKIAkJc3RydWN0IGRldmljZSAqZGV2ID0gcnNuZF9wcml2X3RvX2Rldihwcml2KTsKIAotCQlfcnNuZF9zcmNfc3RvcF9nZW4yKG1vZCk7Ci0JCV9yc25kX3NyY19zdGFydF9nZW4yKG1vZCk7Ci0KIAkJZGV2X2RiZyhkZXYsICIlc1slZF0gcmVzdGFydFxuIiwKIAkJCXJzbmRfbW9kX25hbWUobW9kKSwgcnNuZF9tb2RfaWQobW9kKSk7CisKKwkJX3JzbmRfc3JjX3N0b3BfZ2VuMihtb2QpOworCQlpZiAoc3JjLT5lcnIgPCAxMDI0KQorCQkJX3JzbmRfc3JjX3N0YXJ0X2dlbjIobW9kKTsKKwkJZWxzZQorCQkJZGV2X3dhcm4oZGV2LCAibm8gbW9yZSBTUkMgcmVzdGFydFxuIik7CiAJfQogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwpAQCAtNjI3LDYgKzcwNCw3IEBACiAJc3RydWN0IHNuZF9wY21fcnVudGltZSAqcnVudGltZSA9IHJzbmRfaW9fdG9fcnVudGltZShpbyk7CiAJc3RydWN0IHJzbmRfc3JjICpzcmMgPSByc25kX21vZF90b19zcmMobW9kKTsKIAl1MzIgY29udmVydF9yYXRlID0gcnNuZF9zcmNfY29udmVydF9yYXRlKHNyYyk7CisJdTMyIGNyLCByb3V0ZTsKIAl1aW50IHJhdGlvOwogCWludCByZXQ7CiAKQEAgLTY0NywxMyArNzI1LDIxIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyc25kX21vZF93cml0ZShtb2QsIFNSQ19TUkNDUiwgMHgwMDAxMTExMCk7Ci0KKwljcgk9IDB4MDAwMTExMTA7CisJcm91dGUJPSAweDA7CiAJaWYgKGNvbnZlcnRfcmF0ZSkgewotCQkvKiBHZW4xL0dlbjIgYXJlIG5vdCBjb21wYXRpYmxlICovCi0JCXJzbmRfbW9kX3dyaXRlKG1vZCwgU1JDX1JPVVRFX01PREUwLCAxKTsKKwkJcm91dGUJPSAweDE7CisKKwkJaWYgKHJzbmRfZW5hYmxlX3N5bmNfY29udmVydChzcmMpKSB7CisJCQljciB8PSAweDE7CisJCQlyb3V0ZSB8PSByc25kX2lvX2lzX3BsYXkoaW8pID8KKwkJCQkoMHgxIDw8IDI0KSA6ICgweDEgPDwgMjUpOworCQl9CiAJfQogCisJcnNuZF9tb2Rfd3JpdGUobW9kLCBTUkNfU1JDQ1IsIGNyKTsKKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19ST1VURV9NT0RFMCwgcm91dGUpOworCiAJc3dpdGNoIChyc25kX21vZF9pZChtb2QpKSB7CiAJY2FzZSA1OgogCWNhc2UgNjoKQEAgLTcwOCwyNCArNzk0LDEyIEBACiAJCQkJICAgICAgIElSUUZfU0hBUkVELAogCQkJCSAgICAgICBkZXZfbmFtZShkZXYpLCBtb2QpOwogCQlpZiAocmV0KQotCQkJZ290byByc25kX3NyY19wcm9iZV9nZW4yX2ZhaWw7CisJCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldCA9IHJzbmRfZG1hX2luaXQocHJpdiwKIAkJCSAgICByc25kX21vZF90b19kbWEobW9kKSwKLQkJCSAgICByc25kX2luZm9faXNfcGxheWJhY2socHJpdiwgc3JjKSwKIAkJCSAgICBzcmMtPmluZm8tPmRtYV9pZCk7Ci0JaWYgKHJldCkKLQkJZ290byByc25kX3NyY19wcm9iZV9nZW4yX2ZhaWw7Ci0KLQlkZXZfZGJnKGRldiwgIiVzWyVkXSAoR2VuMikgaXMgcHJvYmVkXG4iLAotCQlyc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCi0JcmV0dXJuIHJldDsKLQotcnNuZF9zcmNfcHJvYmVfZ2VuMl9mYWlsOgotCWRldl9lcnIoZGV2LCAiJXNbJWRdIChHZW4yKSBmYWlsZWRcbiIsCi0JCXJzbmRfbW9kX25hbWUobW9kKSwgcnNuZF9tb2RfaWQobW9kKSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNzMzLDcgKzgwNyw3IEBACiBzdGF0aWMgaW50IHJzbmRfc3JjX3JlbW92ZV9nZW4yKHN0cnVjdCByc25kX21vZCAqbW9kLAogCQkJCXN0cnVjdCByc25kX3ByaXYgKnByaXYpCiB7Ci0JcnNuZF9kbWFfcXVpdChwcml2LCByc25kX21vZF90b19kbWEobW9kKSk7CisJcnNuZF9kbWFfcXVpdChyc25kX21vZF90b19kbWEobW9kKSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc0Myw3ICs4MTcsNyBAQAogewogCWludCByZXQ7CiAKLQlyZXQgPSByc25kX3NyY19pbml0KG1vZCk7CisJcmV0ID0gcnNuZF9zcmNfaW5pdChtb2QsIHByaXYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC03NzgsMTQgKzg1Miw5MSBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIHJzbmRfc3JjX3JlY29udmVydF91cGRhdGUoc3RydWN0IHJzbmRfbW9kICptb2QpCit7CisJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSByc25kX21vZF90b19pbyhtb2QpOworCXN0cnVjdCBzbmRfcGNtX3J1bnRpbWUgKnJ1bnRpbWUgPSByc25kX2lvX3RvX3J1bnRpbWUoaW8pOworCXN0cnVjdCByc25kX3NyYyAqc3JjID0gcnNuZF9tb2RfdG9fc3JjKG1vZCk7CisJdTMyIGNvbnZlcnRfcmF0ZSA9IHJzbmRfc3JjX2NvbnZlcnRfcmF0ZShzcmMpOworCXUzMiBmc3JhdGU7CisKKwlpZiAoIXJ1bnRpbWUpCisJCXJldHVybjsKKworCWlmICghY29udmVydF9yYXRlKQorCQljb252ZXJ0X3JhdGUgPSBydW50aW1lLT5yYXRlOworCisJZnNyYXRlID0gMHgwNDAwMDAwIC8gY29udmVydF9yYXRlICogcnVudGltZS0+cmF0ZTsKKworCS8qIHVwZGF0ZSBJRlMgKi8KKwlyc25kX21vZF93cml0ZShtb2QsIFNSQ19JRlNWUiwgZnNyYXRlKTsKK30KKworc3RhdGljIGludCByc25kX3NyY19wY21fbmV3KHN0cnVjdCByc25kX21vZCAqbW9kLAorCQkJICAgIHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit7CisJc3RydWN0IHJzbmRfcHJpdiAqcHJpdiA9IHJzbmRfbW9kX3RvX3ByaXYobW9kKTsKKwlzdHJ1Y3QgcnNuZF9kYWlfc3RyZWFtICppbyA9IHJzbmRfbW9kX3RvX2lvKG1vZCk7CisJc3RydWN0IHJzbmRfZGFpICpyZGFpID0gcnNuZF9pb190b19yZGFpKGlvKTsKKwlzdHJ1Y3QgcnNuZF9zcmMgKnNyYyA9IHJzbmRfbW9kX3RvX3NyYyhtb2QpOworCWludCByZXQ7CisKKwkvKgorCSAqIGVuYWJsZSBTUkMgc3luYyBjb252ZXJ0IGlmIHBvc3NpYmxlCisJICovCisKKwkvKgorCSAqIEdlbjEgaXMgbm90IHN1cHBvcnRlZAorCSAqLworCWlmIChyc25kX2lzX2dlbjEocHJpdikpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBTUkMgc3luYyBjb252ZXJ0IG5lZWRzIGNsb2NrIG1hc3RlcgorCSAqLworCWlmICghcnNuZF9yZGFpX2lzX2Nsa19tYXN0ZXIocmRhaSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBXZSBjYW4ndCB1c2UgU1JDIHN5bmMgY29udmVydAorCSAqIGlmIGl0IGhhcyBEVkMKKwkgKi8KKwlpZiAocnNuZF9pb190b19tb2RfZHZjKGlvKSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIGVuYWJsZSBzeW5jIGNvbnZlcnQKKwkgKi8KKwlyZXQgPSByc25kX2tjdHJsX25ld19zKG1vZCwgcnRkLAorCQkJICAgICAgIHJzbmRfaW9faXNfcGxheShpbykgPworCQkJICAgICAgICJTUkMgT3V0IFJhdGUgU3dpdGNoIiA6CisJCQkgICAgICAgIlNSQyBJbiBSYXRlIFN3aXRjaCIsCisJCQkgICAgICAgcnNuZF9zcmNfcmVjb252ZXJ0X3VwZGF0ZSwKKwkJCSAgICAgICAmc3JjLT5zZW4sIDEpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gcnNuZF9rY3RybF9uZXdfcyhtb2QsIHJ0ZCwKKwkJCSAgICAgICByc25kX2lvX2lzX3BsYXkoaW8pID8KKwkJCSAgICAgICAiU1JDIE91dCBSYXRlIiA6CisJCQkgICAgICAgIlNSQyBJbiBSYXRlIiwKKwkJCSAgICAgICByc25kX3NyY19yZWNvbnZlcnRfdXBkYXRlLAorCQkJICAgICAgICZzcmMtPnN5bmMsIDE5MjAwMCk7CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgc3RydWN0IHJzbmRfbW9kX29wcyByc25kX3NyY19nZW4yX29wcyA9IHsKIAkubmFtZQk9IFNSQ19OQU1FLAorCS5kbWFfcmVxID0gcnNuZF9zcmNfZG1hX3JlcSwKIAkucHJvYmUJPSByc25kX3NyY19wcm9iZV9nZW4yLAogCS5yZW1vdmUJPSByc25kX3NyY19yZW1vdmVfZ2VuMiwKIAkuaW5pdAk9IHJzbmRfc3JjX2luaXRfZ2VuMiwKIAkucXVpdAk9IHJzbmRfc3JjX3F1aXQsCiAJLnN0YXJ0CT0gcnNuZF9zcmNfc3RhcnRfZ2VuMiwKIAkuc3RvcAk9IHJzbmRfc3JjX3N0b3BfZ2VuMiwKKwkuaHdfcGFyYW1zID0gcnNuZF9zcmNfaHdfcGFyYW1zLAorCS5wY21fbmV3ID0gcnNuZF9zcmNfcGNtX25ldywKIH07CiAKIHN0cnVjdCByc25kX21vZCAqcnNuZF9zcmNfbW9kX2dldChzdHJ1Y3QgcnNuZF9wcml2ICpwcml2LCBpbnQgaWQpCkBAIC04MTAsNyArOTYxLDcgQEAKIAlpZiAoIW9mX2RhdGEpCiAJCXJldHVybjsKIAotCXNyY19ub2RlID0gb2ZfZ2V0X2NoaWxkX2J5X25hbWUoZGV2LT5vZl9ub2RlLCAicmNhcl9zb3VuZCxzcmMiKTsKKwlzcmNfbm9kZSA9IHJzbmRfc3JjX29mX25vZGUocHJpdik7CiAJaWYgKCFzcmNfbm9kZSkKIAkJcmV0dXJuOwogCkBAIC04NTAsNyArMTAwMSw3IEBACiAJc3RydWN0IHJzbmRfbW9kX29wcyAqb3BzOwogCXN0cnVjdCBjbGsgKmNsazsKIAljaGFyIG5hbWVbUlNORF9TUkNfTkFNRV9TSVpFXTsKLQlpbnQgaSwgbnI7CisJaW50IGksIG5yLCByZXQ7CiAKIAlvcHMgPSBOVUxMOwogCWlmIChyc25kX2lzX2dlbjEocHJpdikpCkBAIC04OTAsMTAgKzEwNDEsMjEgQEAKIAogCQlzcmMtPmluZm8gPSAmaW5mby0+c3JjX2luZm9baV07CiAKLQkJcnNuZF9tb2RfaW5pdCgmc3JjLT5tb2QsIG9wcywgY2xrLCBSU05EX01PRF9TUkMsIGkpOwotCi0JCWRldl9kYmcoZGV2LCAiU1JDJWQgcHJvYmVkXG4iLCBpKTsKKwkJcmV0ID0gcnNuZF9tb2RfaW5pdCgmc3JjLT5tb2QsIG9wcywgY2xrLCBSU05EX01PRF9TUkMsIGkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXR1cm4gMDsKIH0KKwordm9pZCByc25kX3NyY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJICAgICBzdHJ1Y3QgcnNuZF9wcml2ICpwcml2KQoreworCXN0cnVjdCByc25kX3NyYyAqc3JjOworCWludCBpOworCisJZm9yX2VhY2hfcnNuZF9zcmMoc3JjLCBwcml2LCBpKSB7CisJCXJzbmRfbW9kX3F1aXQoJnNyYy0+bW9kKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2gvcmNhci9zc2kuYyBiL3NvdW5kL3NvYy9zaC9yY2FyL3NzaS5jCmluZGV4IDllN2I2MjcuLjdiYjljMDggMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zaC9yY2FyL3NzaS5jCisrKyBiL3NvdW5kL3NvYy9zaC9yY2FyL3NzaS5jCkBAIC04MCwxMyArODAsMTMgQEAKICNkZWZpbmUgcnNuZF9tb2RfdG9fc3NpKF9tb2QpIGNvbnRhaW5lcl9vZigoX21vZCksIHN0cnVjdCByc25kX3NzaSwgbW9kKQogI2RlZmluZSByc25kX2RtYV90b19zc2koZG1hKSAgcnNuZF9tb2RfdG9fc3NpKHJzbmRfZG1hX3RvX21vZChkbWEpKQogI2RlZmluZSByc25kX3NzaV9waW9fYXZhaWxhYmxlKHNzaSkgKChzc2kpLT5pbmZvLT5pcnEgPiAwKQotI2RlZmluZSByc25kX3NzaV9kbWFfYXZhaWxhYmxlKHNzaSkgXAotCXJzbmRfZG1hX2F2YWlsYWJsZShyc25kX21vZF90b19kbWEoJihzc2kpLT5tb2QpKQogI2RlZmluZSByc25kX3NzaV9jbGtfZnJvbV9wYXJlbnQoc3NpKSAoKHNzaSktPnBhcmVudCkKICNkZWZpbmUgcnNuZF9zc2lfbW9kZV9mbGFncyhwKSAoKHApLT5pbmZvLT5mbGFncykKICNkZWZpbmUgcnNuZF9zc2lfZGFpX2lkKHNzaSkgKChzc2kpLT5pbmZvLT5kYWlfaWQpCisjZGVmaW5lIHJzbmRfc3NpX29mX25vZGUocHJpdikgXAorCW9mX2dldF9jaGlsZF9ieV9uYW1lKHJzbmRfcHJpdl90b19kZXYocHJpdiktPm9mX25vZGUsICJyY2FyX3NvdW5kLHNzaSIpCiAKLXN0YXRpYyBpbnQgcnNuZF9zc2lfdXNlX2J1c2lmKHN0cnVjdCByc25kX21vZCAqbW9kKQoraW50IHJzbmRfc3NpX3VzZV9idXNpZihzdHJ1Y3QgcnNuZF9tb2QgKm1vZCkKIHsKIAlzdHJ1Y3QgcnNuZF9zc2kgKnNzaSA9IHJzbmRfbW9kX3RvX3NzaShtb2QpOwogCXN0cnVjdCByc25kX2RhaV9zdHJlYW0gKmlvID0gcnNuZF9tb2RfdG9faW8obW9kKTsKQEAgLTQxNiwxMSArNDE2LDE0IEBACiAJCS8qCiAJCSAqIHJlc3RhcnQgU1NJCiAJCSAqLwotCQlyc25kX3NzaV9zdG9wKG1vZCwgcHJpdik7Ci0JCXJzbmRfc3NpX3N0YXJ0KG1vZCwgcHJpdik7Ci0KIAkJZGV2X2RiZyhkZXYsICIlc1slZF0gcmVzdGFydFxuIiwKIAkJCXJzbmRfbW9kX25hbWUobW9kKSwgcnNuZF9tb2RfaWQobW9kKSk7CisKKwkJcnNuZF9zc2lfc3RvcChtb2QsIHByaXYpOworCQlpZiAoc3NpLT5lcnIgPCAxMDI0KQorCQkJcnNuZF9zc2lfc3RhcnQobW9kLCBwcml2KTsKKwkJZWxzZQorCQkJZGV2X3dhcm4oZGV2LCAibm8gbW9yZSBTU0kgcmVzdGFydFxuIik7CiAJfQogCiAJcnNuZF9zc2lfcmVjb3JkX2Vycm9yKHNzaSwgc3RhdHVzKTsKQEAgLTQ0MiwxMiArNDQ1LDYgQEAKIAkJCSAgICAgICByc25kX3NzaV9pbnRlcnJ1cHQsCiAJCQkgICAgICAgSVJRRl9TSEFSRUQsCiAJCQkgICAgICAgZGV2X25hbWUoZGV2KSwgc3NpKTsKLQlpZiAocmV0KQotCQlkZXZfZXJyKGRldiwgIiVzWyVkXSAoUElPKSByZXF1ZXN0IGludGVycnVwdCBmYWlsZWRcbiIsCi0JCQlyc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCWVsc2UKLQkJZGV2X2RiZyhkZXYsICIlc1slZF0gKFBJTykgaXMgcHJvYmVkXG4iLAotCQkJcnNuZF9tb2RfbmFtZShtb2QpLCByc25kX21vZF9pZChtb2QpKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00NzQsMjMgKzQ3MSwxMSBAQAogCQkJICAgICAgIElSUUZfU0hBUkVELAogCQkJICAgICAgIGRldl9uYW1lKGRldiksIHNzaSk7CiAJaWYgKHJldCkKLQkJZ290byByc25kX3NzaV9kbWFfcHJvYmVfZmFpbDsKKwkJcmV0dXJuIHJldDsKIAogCXJldCA9IHJzbmRfZG1hX2luaXQoCiAJCXByaXYsIHJzbmRfbW9kX3RvX2RtYShtb2QpLAotCQlyc25kX2luZm9faXNfcGxheWJhY2socHJpdiwgc3NpKSwKIAkJZG1hX2lkKTsKLQlpZiAocmV0KQotCQlnb3RvIHJzbmRfc3NpX2RtYV9wcm9iZV9mYWlsOwotCi0JZGV2X2RiZyhkZXYsICIlc1slZF0gKERNQSkgaXMgcHJvYmVkXG4iLAotCQlyc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwotCi0JcmV0dXJuIHJldDsKLQotcnNuZF9zc2lfZG1hX3Byb2JlX2ZhaWw6Ci0JZGV2X2VycihkZXYsICIlc1slZF0gKERNQSkgaXMgZmFpbGVkXG4iLAotCQlyc25kX21vZF9uYW1lKG1vZCksIHJzbmRfbW9kX2lkKG1vZCkpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTUwMiw3ICs0ODcsNyBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJzbmRfcHJpdl90b19kZXYocHJpdik7CiAJaW50IGlycSA9IHNzaS0+aW5mby0+aXJxOwogCi0JcnNuZF9kbWFfcXVpdChwcml2LCByc25kX21vZF90b19kbWEobW9kKSk7CisJcnNuZF9kbWFfcXVpdChyc25kX21vZF90b19kbWEobW9kKSk7CiAKIAkvKiBQSU8gd2lsbCByZXF1ZXN0IElSUSBhZ2FpbiAqLwogCWRldm1fZnJlZV9pcnEoZGV2LCBpcnEsIHNzaSk7CkBAIC01NTQsMTQgKzUzOSwyNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY2hhciAqcnNuZF9zc2lfZG1hX25hbWUoc3RydWN0IHJzbmRfbW9kICptb2QpCitzdGF0aWMgc3RydWN0IGRtYV9jaGFuICpyc25kX3NzaV9kbWFfcmVxKHN0cnVjdCByc25kX21vZCAqbW9kKQogewotCXJldHVybiByc25kX3NzaV91c2VfYnVzaWYobW9kKSA/ICJzc2l1IiA6IFNTSV9OQU1FOworCXN0cnVjdCByc25kX3ByaXYgKnByaXYgPSByc25kX21vZF90b19wcml2KG1vZCk7CisJc3RydWN0IHJzbmRfZGFpX3N0cmVhbSAqaW8gPSByc25kX21vZF90b19pbyhtb2QpOworCWludCBpc19wbGF5ID0gcnNuZF9pb19pc19wbGF5KGlvKTsKKwljaGFyICpuYW1lOworCisJaWYgKHJzbmRfc3NpX3VzZV9idXNpZihtb2QpKQorCQluYW1lID0gaXNfcGxheSA/ICJyeHUiIDogInR4dSI7CisJZWxzZQorCQluYW1lID0gaXNfcGxheSA/ICJyeCIgOiAidHgiOworCisJcmV0dXJuIHJzbmRfZG1hX3JlcXVlc3RfY2hhbm5lbChyc25kX3NzaV9vZl9ub2RlKHByaXYpLAorCQkJCQltb2QsIG5hbWUpOwogfQogCiBzdGF0aWMgc3RydWN0IHJzbmRfbW9kX29wcyByc25kX3NzaV9kbWFfb3BzID0gewogCS5uYW1lCT0gU1NJX05BTUUsCi0JLmRtYV9uYW1lID0gcnNuZF9zc2lfZG1hX25hbWUsCisJLmRtYV9yZXEgPSByc25kX3NzaV9kbWFfcmVxLAogCS5wcm9iZQk9IHJzbmRfc3NpX2RtYV9wcm9iZSwKIAkucmVtb3ZlCT0gcnNuZF9zc2lfZG1hX3JlbW92ZSwKIAkuaW5pdAk9IHJzbmRfc3NpX2luaXQsCkBAIC02MzYsNyArNjMyLDcgQEAKIAlpZiAoIW9mX2RhdGEpCiAJCXJldHVybjsKIAotCW5vZGUgPSBvZl9nZXRfY2hpbGRfYnlfbmFtZShkZXYtPm9mX25vZGUsICJyY2FyX3NvdW5kLHNzaSIpOworCW5vZGUgPSByc25kX3NzaV9vZl9ub2RlKHByaXYpOwogCWlmICghbm9kZSkKIAkJcmV0dXJuOwogCkBAIC02OTcsNyArNjkzLDcgQEAKIAlzdHJ1Y3QgY2xrICpjbGs7CiAJc3RydWN0IHJzbmRfc3NpICpzc2k7CiAJY2hhciBuYW1lW1JTTkRfU1NJX05BTUVfU0laRV07Ci0JaW50IGksIG5yOworCWludCBpLCBuciwgcmV0OwogCiAJcnNuZF9vZl9wYXJzZV9zc2kocGRldiwgb2ZfZGF0YSwgcHJpdik7CiAKQEAgLTczMiwxMCArNzI4LDIzIEBACiAJCWVsc2UgaWYgKHJzbmRfc3NpX3Bpb19hdmFpbGFibGUoc3NpKSkKIAkJCW9wcyA9ICZyc25kX3NzaV9waW9fb3BzOwogCi0JCXJzbmRfbW9kX2luaXQoJnNzaS0+bW9kLCBvcHMsIGNsaywgUlNORF9NT0RfU1NJLCBpKTsKKwkJcmV0ID0gcnNuZF9tb2RfaW5pdCgmc3NpLT5tb2QsIG9wcywgY2xrLCBSU05EX01PRF9TU0ksIGkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAogCQlyc25kX3NzaV9wYXJlbnRfY2xrX3NldHVwKHByaXYsIHNzaSk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CisKK3ZvaWQgcnNuZF9zc2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgICAgc3RydWN0IHJzbmRfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgcnNuZF9zc2kgKnNzaTsKKwlpbnQgaTsKKworCWZvcl9lYWNoX3JzbmRfc3NpKHNzaSwgcHJpdiwgaSkgeworCQlyc25kX21vZF9xdWl0KCZzc2ktPm1vZCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1jb3JlLmMgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwppbmRleCAzMDU3OWNhLi4yMzczMjUyIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNvcmUuYworKysgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwpAQCAtMjkyLDYgKzI5Miw5IEBACiAKIHN0YXRpYyB2b2lkIHNvY19pbml0X2NvbXBvbmVudF9kZWJ1Z2ZzKHN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50KQogeworCWlmICghY29tcG9uZW50LT5jYXJkLT5kZWJ1Z2ZzX2NhcmRfcm9vdCkKKwkJcmV0dXJuOworCiAJaWYgKGNvbXBvbmVudC0+ZGVidWdmc19wcmVmaXgpIHsKIAkJY2hhciAqbmFtZTsKIApAQCAtMzQ3LDYgKzM1MCw4IEBACiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJbXV0ZXhfbG9jaygmY2xpZW50X211dGV4KTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29kZWMsICZjb2RlY19saXN0LCBsaXN0KSB7CiAJCWxlbiA9IHNucHJpbnRmKGJ1ZiArIHJldCwgUEFHRV9TSVpFIC0gcmV0LCAiJXNcbiIsCiAJCQkgICAgICAgY29kZWMtPmNvbXBvbmVudC5uYW1lKTsKQEAgLTM1OCw2ICszNjMsOCBAQAogCQl9CiAJfQogCisJbXV0ZXhfdW5sb2NrKCZjbGllbnRfbXV0ZXgpOworCiAJaWYgKHJldCA+PSAwKQogCQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcmV0KTsKIApAQCAtMzgyLDYgKzM4OSw4IEBACiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwogCisJbXV0ZXhfbG9jaygmY2xpZW50X211dGV4KTsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY29tcG9uZW50LCAmY29tcG9uZW50X2xpc3QsIGxpc3QpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShkYWksICZjb21wb25lbnQtPmRhaV9saXN0LCBsaXN0KSB7CiAJCQlsZW4gPSBzbnByaW50ZihidWYgKyByZXQsIFBBR0VfU0laRSAtIHJldCwgIiVzXG4iLApAQCAtMzk1LDYgKzQwNCw4IEBACiAJCX0KIAl9CiAKKwltdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7CisKIAlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcmV0KTsKIAogCWtmcmVlKGJ1Zik7CkBAIC00MTgsNiArNDI5LDggQEAKIAlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwltdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwbGF0Zm9ybSwgJnBsYXRmb3JtX2xpc3QsIGxpc3QpIHsKIAkJbGVuID0gc25wcmludGYoYnVmICsgcmV0LCBQQUdFX1NJWkUgLSByZXQsICIlc1xuIiwKIAkJCSAgICAgICBwbGF0Zm9ybS0+Y29tcG9uZW50Lm5hbWUpOwpAQCAtNDI5LDYgKzQ0Miw4IEBACiAJCX0KIAl9CiAKKwltdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7CisKIAlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcmV0KTsKIAogCWtmcmVlKGJ1Zik7CkBAIC00NDMsNiArNDU4LDkgQEAKIAogc3RhdGljIHZvaWQgc29jX2luaXRfY2FyZF9kZWJ1Z2ZzKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCiB7CisJaWYgKCFzbmRfc29jX2RlYnVnZnNfcm9vdCkKKwkJcmV0dXJuOworCiAJY2FyZC0+ZGVidWdmc19jYXJkX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoY2FyZC0+bmFtZSwKIAkJCQkJCSAgICAgc25kX3NvY19kZWJ1Z2ZzX3Jvb3QpOwogCWlmICghY2FyZC0+ZGVidWdmc19jYXJkX3Jvb3QpIHsKQEAgLTQ2NCw2ICs0ODIsMzQgQEAKIAlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoY2FyZC0+ZGVidWdmc19jYXJkX3Jvb3QpOwogfQogCisKK3N0YXRpYyB2b2lkIHNuZF9zb2NfZGVidWdmc19pbml0KHZvaWQpCit7CisJc25kX3NvY19kZWJ1Z2ZzX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImFzb2MiLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHNuZF9zb2NfZGVidWdmc19yb290KSB8fCAhc25kX3NvY19kZWJ1Z2ZzX3Jvb3QpIHsKKwkJcHJfd2FybigiQVNvQzogRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeVxuIik7CisJCXNuZF9zb2NfZGVidWdmc19yb290ID0gTlVMTDsKKwkJcmV0dXJuOworCX0KKworCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgiY29kZWNzIiwgMDQ0NCwgc25kX3NvY19kZWJ1Z2ZzX3Jvb3QsIE5VTEwsCisJCQkJICZjb2RlY19saXN0X2ZvcHMpKQorCQlwcl93YXJuKCJBU29DOiBGYWlsZWQgdG8gY3JlYXRlIENPREVDIGxpc3QgZGVidWdmcyBmaWxlXG4iKTsKKworCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgiZGFpcyIsIDA0NDQsIHNuZF9zb2NfZGVidWdmc19yb290LCBOVUxMLAorCQkJCSAmZGFpX2xpc3RfZm9wcykpCisJCXByX3dhcm4oIkFTb0M6IEZhaWxlZCB0byBjcmVhdGUgREFJIGxpc3QgZGVidWdmcyBmaWxlXG4iKTsKKworCWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgicGxhdGZvcm1zIiwgMDQ0NCwgc25kX3NvY19kZWJ1Z2ZzX3Jvb3QsIE5VTEwsCisJCQkJICZwbGF0Zm9ybV9saXN0X2ZvcHMpKQorCQlwcl93YXJuKCJBU29DOiBGYWlsZWQgdG8gY3JlYXRlIHBsYXRmb3JtIGxpc3QgZGVidWdmcyBmaWxlXG4iKTsKK30KKworc3RhdGljIHZvaWQgc25kX3NvY19kZWJ1Z2ZzX2V4aXQodm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoc25kX3NvY19kZWJ1Z2ZzX3Jvb3QpOworfQorCiAjZWxzZQogCiAjZGVmaW5lIHNvY19pbml0X2NvZGVjX2RlYnVnZnMgTlVMTApAQCAtNDg1LDYgKzUzMSwxNSBAQAogc3RhdGljIGlubGluZSB2b2lkIHNvY19jbGVhbnVwX2NhcmRfZGVidWdmcyhzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkKQogewogfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc25kX3NvY19kZWJ1Z2ZzX2luaXQodm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNuZF9zb2NfZGVidWdmc19leGl0KHZvaWQpCit7Cit9CisKICNlbmRpZgogCiBzdHJ1Y3Qgc25kX3BjbV9zdWJzdHJlYW0gKnNuZF9zb2NfZ2V0X2RhaV9zdWJzdHJlYW0oc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwKQEAgLTU4MywxNSArNjM4LDkgQEAKIAkJCWNwdV9kYWktPmRyaXZlci0+c3VzcGVuZChjcHVfZGFpKTsKIAl9CiAKLQkvKiBjbG9zZSBhbnkgd2FpdGluZyBzdHJlYW1zIGFuZCBzYXZlIHN0YXRlICovCi0JZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9ydGQ7IGkrKykgewotCQlzdHJ1Y3Qgc25kX3NvY19kYWkgKipjb2RlY19kYWlzID0gY2FyZC0+cnRkW2ldLmNvZGVjX2RhaXM7CisJLyogY2xvc2UgYW55IHdhaXRpbmcgc3RyZWFtcyAqLworCWZvciAoaSA9IDA7IGkgPCBjYXJkLT5udW1fcnRkOyBpKyspCiAJCWZsdXNoX2RlbGF5ZWRfd29yaygmY2FyZC0+cnRkW2ldLmRlbGF5ZWRfd29yayk7Ci0JCWZvciAoaiA9IDA7IGogPCBjYXJkLT5ydGRbaV0ubnVtX2NvZGVjczsgaisrKSB7Ci0JCQljb2RlY19kYWlzW2pdLT5jb2RlYy0+ZGFwbS5zdXNwZW5kX2JpYXNfbGV2ZWwgPQotCQkJCQljb2RlY19kYWlzW2pdLT5jb2RlYy0+ZGFwbS5iaWFzX2xldmVsOwotCQl9Ci0JfQogCiAJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9ydGQ7IGkrKykgewogCkBAIC04MzYsNiArODg1LDggQEAKIHsKIAlzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudDsKIAorCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmNsaWVudF9tdXRleCk7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbXBvbmVudCwgJmNvbXBvbmVudF9saXN0LCBsaXN0KSB7CiAJCWlmIChvZl9ub2RlKSB7CiAJCQlpZiAoY29tcG9uZW50LT5kZXYtPm9mX25vZGUgPT0gb2Zfbm9kZSkKQEAgLTg1NCw2ICs5MDUsOCBAQAogCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY29tcG9uZW50OwogCXN0cnVjdCBzbmRfc29jX2RhaSAqZGFpOwogCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmY2xpZW50X211dGV4KTsKKwogCS8qIEZpbmQgQ1BVIERBSSBmcm9tIHJlZ2lzdGVyZWQgREFJcyovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb21wb25lbnQsICZjb21wb25lbnRfbGlzdCwgbGlzdCkgewogCQlpZiAoZGxjLT5vZl9ub2RlICYmIGNvbXBvbmVudC0+ZGV2LT5vZl9ub2RlICE9IGRsYy0+b2Zfbm9kZSkKQEAgLTEyNDUsNyArMTI5OCw4IEBACiAJY2FwdHVyZV93ID0gY3B1X2RhaS0+Y2FwdHVyZV93aWRnZXQ7CiAJaWYgKHBsYXlfdyAmJiBjYXB0dXJlX3cpIHsKIAkJcmV0ID0gc25kX3NvY19kYXBtX25ld19wY20oY2FyZCwgZGFpX2xpbmstPnBhcmFtcywKLQkJCQkJICAgY2FwdHVyZV93LCBwbGF5X3cpOworCQkJCQkgICBkYWlfbGluay0+bnVtX3BhcmFtcywgY2FwdHVyZV93LAorCQkJCQkgICBwbGF5X3cpOwogCQlpZiAocmV0ICE9IDApIHsKIAkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQVNvQzogQ2FuJ3QgbGluayAlcyB0byAlczogJWRcbiIsCiAJCQkJcGxheV93LT5uYW1lLCBjYXB0dXJlX3ctPm5hbWUsIHJldCk7CkBAIC0xMjU3LDcgKzEzMTEsOCBAQAogCWNhcHR1cmVfdyA9IGNvZGVjX2RhaS0+Y2FwdHVyZV93aWRnZXQ7CiAJaWYgKHBsYXlfdyAmJiBjYXB0dXJlX3cpIHsKIAkJcmV0ID0gc25kX3NvY19kYXBtX25ld19wY20oY2FyZCwgZGFpX2xpbmstPnBhcmFtcywKLQkJCQkJICAgY2FwdHVyZV93LCBwbGF5X3cpOworCQkJCQkgICBkYWlfbGluay0+bnVtX3BhcmFtcywgY2FwdHVyZV93LAorCQkJCQkgICBwbGF5X3cpOwogCQlpZiAocmV0ICE9IDApIHsKIAkJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQVNvQzogQ2FuJ3QgbGluayAlcyB0byAlczogJWRcbiIsCiAJCQkJcGxheV93LT5uYW1lLCBjYXB0dXJlX3ctPm5hbWUsIHJldCk7CkBAIC0xMzA2LDIxICsxMzYxLDE3IEBACiAJCX0KIAl9CiAKKwlpZiAoZGFpX2xpbmstPmRhaV9mbXQpCisJCXNuZF9zb2NfcnVudGltZV9zZXRfZGFpX2ZtdChydGQsIGRhaV9saW5rLT5kYWlfZm10KTsKKwogCXJldCA9IHNvY19wb3N0X2NvbXBvbmVudF9pbml0KHJ0ZCwgZGFpX2xpbmstPm5hbWUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAkvKiBhZGQgRFBDTSBzeXNmcyBlbnRyaWVzICovCi0JaWYgKGRhaV9saW5rLT5keW5hbWljKSB7Ci0JCXJldCA9IHNvY19kcGNtX2RlYnVnZnNfYWRkKHJ0ZCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKHJ0ZC0+ZGV2LAotCQkJCSJBU29DOiBmYWlsZWQgdG8gYWRkIGRwY20gc3lzZnMgZW50cmllczogJWRcbiIsCi0JCQkJcmV0KTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9CisJaWYgKGRhaV9saW5rLT5keW5hbWljKQorCQlzb2NfZHBjbV9kZWJ1Z2ZzX2FkZChydGQpOwogI2VuZGlmCiAKIAlpZiAoY3B1X2RhaS0+ZHJpdmVyLT5jb21wcmVzc19kYWkpIHsKQEAgLTE0MTAsNyArMTQ2MSw2IEBACiAKIAkvKiB1bnJlZ2lzdGVyIHRoZSBydGQgZGV2aWNlICovCiAJaWYgKHJ0ZC0+ZGV2X3JlZ2lzdGVyZWQpIHsKLQkJZGV2aWNlX3JlbW92ZV9maWxlKHJ0ZC0+ZGV2LCAmZGV2X2F0dHJfY29kZWNfcmVnKTsKIAkJZGV2aWNlX3VucmVnaXN0ZXIocnRkLT5kZXYpOwogCQlydGQtPmRldl9yZWdpc3RlcmVkID0gMDsKIAl9CkBAIC0xNTA4LDYgKzE1NTgsNyBAQAogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAlpbnQgcmV0LCBpLCBvcmRlcjsKIAorCW11dGV4X2xvY2soJmNsaWVudF9tdXRleCk7CiAJbXV0ZXhfbG9ja19uZXN0ZWQoJmNhcmQtPm11dGV4LCBTTkRfU09DX0NBUkRfQ0xBU1NfSU5JVCk7CiAKIAkvKiBiaW5kIERBSXMgKi8KQEAgLTE1NDMsNiArMTU5NCw4IEBACiAJCWdvdG8gYmFzZV9lcnJvcjsKIAl9CiAKKwlzb2NfaW5pdF9jYXJkX2RlYnVnZnMoY2FyZCk7CisKIAljYXJkLT5kYXBtLmJpYXNfbGV2ZWwgPSBTTkRfU09DX0JJQVNfT0ZGOwogCWNhcmQtPmRhcG0uZGV2ID0gY2FyZC0+ZGV2OwogCWNhcmQtPmRhcG0uY2FyZCA9IGNhcmQ7CkBAIC0xNTYxLDYgKzE2MTQsMTAgQEAKIAkJc25kX3NvY19kYXBtX25ld19jb250cm9scygmY2FyZC0+ZGFwbSwgY2FyZC0+ZGFwbV93aWRnZXRzLAogCQkJCQkgIGNhcmQtPm51bV9kYXBtX3dpZGdldHMpOwogCisJaWYgKGNhcmQtPm9mX2RhcG1fd2lkZ2V0cykKKwkJc25kX3NvY19kYXBtX25ld19jb250cm9scygmY2FyZC0+ZGFwbSwgY2FyZC0+b2ZfZGFwbV93aWRnZXRzLAorCQkJCQkgIGNhcmQtPm51bV9vZl9kYXBtX3dpZGdldHMpOworCiAJLyogaW5pdGlhbGlzZSB0aGUgc291bmQgY2FyZCBvbmx5IG9uY2UgKi8KIAlpZiAoY2FyZC0+cHJvYmUpIHsKIAkJcmV0ID0gY2FyZC0+cHJvYmUoY2FyZCk7CkBAIC0xNjE2LDExICsxNjczLDkgQEAKIAkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNhcmQtPmRhcG0sIGNhcmQtPmRhcG1fcm91dGVzLAogCQkJCQljYXJkLT5udW1fZGFwbV9yb3V0ZXMpOwogCi0JZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9saW5rczsgaSsrKSB7Ci0JCWlmIChjYXJkLT5kYWlfbGlua1tpXS5kYWlfZm10KQotCQkJc25kX3NvY19ydW50aW1lX3NldF9kYWlfZm10KCZjYXJkLT5ydGRbaV0sCi0JCQkJY2FyZC0+ZGFpX2xpbmtbaV0uZGFpX2ZtdCk7Ci0JfQorCWlmIChjYXJkLT5vZl9kYXBtX3JvdXRlcykKKwkJc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoJmNhcmQtPmRhcG0sIGNhcmQtPm9mX2RhcG1fcm91dGVzLAorCQkJCQljYXJkLT5udW1fb2ZfZGFwbV9yb3V0ZXMpOwogCiAJc25wcmludGYoY2FyZC0+c25kX2NhcmQtPnNob3J0bmFtZSwgc2l6ZW9mKGNhcmQtPnNuZF9jYXJkLT5zaG9ydG5hbWUpLAogCQkgIiVzIiwgY2FyZC0+bmFtZSk7CkBAIC0xNjYyLDYgKzE3MTcsNyBAQAogCWNhcmQtPmluc3RhbnRpYXRlZCA9IDE7CiAJc25kX3NvY19kYXBtX3N5bmMoJmNhcmQtPmRhcG0pOwogCW11dGV4X3VubG9jaygmY2FyZC0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmY2xpZW50X211dGV4KTsKIAogCXJldHVybiAwOwogCkBAIC0xNjc2LDEwICsxNzMyLDEyIEBACiAJaWYgKGNhcmQtPnJlbW92ZSkKIAkJY2FyZC0+cmVtb3ZlKGNhcmQpOwogCisJc29jX2NsZWFudXBfY2FyZF9kZWJ1Z2ZzKGNhcmQpOwogCXNuZF9jYXJkX2ZyZWUoY2FyZC0+c25kX2NhcmQpOwogCiBiYXNlX2Vycm9yOgogCW11dGV4X3VubG9jaygmY2FyZC0+bXV0ZXgpOworCW11dGV4X3VubG9jaygmY2xpZW50X211dGV4KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0yMzUzLDggKzI0MTEsNiBAQAogCiAJc25kX3NvY19pbml0aWFsaXplX2NhcmRfbGlzdHMoY2FyZCk7CiAKLQlzb2NfaW5pdF9jYXJkX2RlYnVnZnMoY2FyZCk7Ci0KIAljYXJkLT5ydGQgPSBkZXZtX2t6YWxsb2MoY2FyZC0+ZGV2LAogCQkJCSBzaXplb2Yoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUpICoKIAkJCQkgKGNhcmQtPm51bV9saW5rcyArIGNhcmQtPm51bV9hdXhfZGV2cyksCkBAIC0yMzg1LDcgKzI0NDEsNyBAQAogCiAJcmV0ID0gc25kX3NvY19pbnN0YW50aWF0ZV9jYXJkKGNhcmQpOwogCWlmIChyZXQgIT0gMCkKLQkJc29jX2NsZWFudXBfY2FyZF9kZWJ1Z2ZzKGNhcmQpOworCQlyZXR1cm4gcmV0OwogCiAJLyogZGVhY3RpdmF0ZSBwaW5zIHRvIHNsZWVwIHN0YXRlICovCiAJZm9yIChpID0gMDsgaSA8IGNhcmQtPm51bV9ydGQ7IGkrKykgewpAQCAtMjcxMywxMyArMjc2OSw2IEBACiAJbGlzdF9kZWwoJmNvbXBvbmVudC0+bGlzdCk7CiB9CiAKLXN0YXRpYyB2b2lkIHNuZF9zb2NfY29tcG9uZW50X2RlbChzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnQgKmNvbXBvbmVudCkKLXsKLQltdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOwotCXNuZF9zb2NfY29tcG9uZW50X2RlbF91bmxvY2tlZChjb21wb25lbnQpOwotCW11dGV4X3VubG9jaygmY2xpZW50X211dGV4KTsKLX0KLQogaW50IHNuZF9zb2NfcmVnaXN0ZXJfY29tcG9uZW50KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgc25kX3NvY19jb21wb25lbnRfZHJpdmVyICpjbXBudF9kcnYsCiAJCQkgICAgICAgc3RydWN0IHNuZF9zb2NfZGFpX2RyaXZlciAqZGFpX2RydiwKQEAgLTI3NDMsNyArMjc5Miw3IEBACiAKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2RhaXMoY21wbnQsIGRhaV9kcnYsIG51bV9kYWksIHRydWUpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiQVNvQzogRmFpbGVkIHRvIHJlZ3N0ZXIgREFJczogJWRcbiIsIHJldCk7CisJCWRldl9lcnIoZGV2LCAiQVNvQzogRmFpbGVkIHRvIHJlZ2lzdGVyIERBSXM6ICVkXG4iLCByZXQpOwogCQlnb3RvIGVycl9jbGVhbnVwOwogCX0KIApAQCAtMjc2NywxNCArMjgxNiwxNyBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvbXBvbmVudCAqY21wbnQ7CiAKKwltdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY21wbnQsICZjb21wb25lbnRfbGlzdCwgbGlzdCkgewogCQlpZiAoZGV2ID09IGNtcG50LT5kZXYgJiYgY21wbnQtPnJlZ2lzdGVyZWRfYXNfY29tcG9uZW50KQogCQkJZ290byBmb3VuZDsKIAl9CisJbXV0ZXhfdW5sb2NrKCZjbGllbnRfbXV0ZXgpOwogCXJldHVybjsKIAogZm91bmQ6Ci0Jc25kX3NvY19jb21wb25lbnRfZGVsKGNtcG50KTsKKwlzbmRfc29jX2NvbXBvbmVudF9kZWxfdW5sb2NrZWQoY21wbnQpOworCW11dGV4X3VubG9jaygmY2xpZW50X211dGV4KTsKIAlzbmRfc29jX2NvbXBvbmVudF9jbGVhbnVwKGNtcG50KTsKIAlrZnJlZShjbXBudCk7CiB9CkBAIC0yODgyLDEwICsyOTM0LDE0IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfcGxhdGZvcm0gKnBsYXRmb3JtOwogCisJbXV0ZXhfbG9jaygmY2xpZW50X211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBsYXRmb3JtLCAmcGxhdGZvcm1fbGlzdCwgbGlzdCkgewotCQlpZiAoZGV2ID09IHBsYXRmb3JtLT5kZXYpCisJCWlmIChkZXYgPT0gcGxhdGZvcm0tPmRldikgeworCQkJbXV0ZXhfdW5sb2NrKCZjbGllbnRfbXV0ZXgpOwogCQkJcmV0dXJuIHBsYXRmb3JtOworCQl9CiAJfQorCW11dGV4X3VubG9jaygmY2xpZW50X211dGV4KTsKIAogCXJldHVybiBOVUxMOwogfQpAQCAtMzA1Nyw3ICszMTEzLDcgQEAKIAogCXJldCA9IHNuZF9zb2NfcmVnaXN0ZXJfZGFpcygmY29kZWMtPmNvbXBvbmVudCwgZGFpX2RydiwgbnVtX2RhaSwgZmFsc2UpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoZGV2LCAiQVNvQzogRmFpbGVkIHRvIHJlZ3N0ZXIgREFJczogJWRcbiIsIHJldCk7CisJCWRldl9lcnIoZGV2LCAiQVNvQzogRmFpbGVkIHRvIHJlZ2lzdGVyIERBSXM6ICVkXG4iLCByZXQpOwogCQlnb3RvIGVycl9jbGVhbnVwOwogCX0KIApAQCAtMzA5MCwxNSArMzE0NiwxNSBAQAogewogCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYzsKIAorCW11dGV4X2xvY2soJmNsaWVudF9tdXRleCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb2RlYywgJmNvZGVjX2xpc3QsIGxpc3QpIHsKIAkJaWYgKGRldiA9PSBjb2RlYy0+ZGV2KQogCQkJZ290byBmb3VuZDsKIAl9CisJbXV0ZXhfdW5sb2NrKCZjbGllbnRfbXV0ZXgpOwogCXJldHVybjsKIAogZm91bmQ6Ci0KLQltdXRleF9sb2NrKCZjbGllbnRfbXV0ZXgpOwogCWxpc3RfZGVsKCZjb2RlYy0+bGlzdCk7CiAJc25kX3NvY19jb21wb25lbnRfZGVsX3VubG9ja2VkKCZjb2RlYy0+Y29tcG9uZW50KTsKIAltdXRleF91bmxvY2soJmNsaWVudF9tdXRleCk7CkBAIC0zMjIzLDggKzMyNzksOCBAQAogCQl3aWRnZXRzW2ldLm5hbWUgPSB3bmFtZTsKIAl9CiAKLQljYXJkLT5kYXBtX3dpZGdldHMgPSB3aWRnZXRzOwotCWNhcmQtPm51bV9kYXBtX3dpZGdldHMgPSBudW1fd2lkZ2V0czsKKwljYXJkLT5vZl9kYXBtX3dpZGdldHMgPSB3aWRnZXRzOworCWNhcmQtPm51bV9vZl9kYXBtX3dpZGdldHMgPSBudW1fd2lkZ2V0czsKIAogCXJldHVybiAwOwogfQpAQCAtMzMwOCw4ICszMzY0LDggQEAKIAkJfQogCX0KIAotCWNhcmQtPm51bV9kYXBtX3JvdXRlcyA9IG51bV9yb3V0ZXM7Ci0JY2FyZC0+ZGFwbV9yb3V0ZXMgPSByb3V0ZXM7CisJY2FyZC0+bnVtX29mX2RhcG1fcm91dGVzID0gbnVtX3JvdXRlczsKKwljYXJkLT5vZl9kYXBtX3JvdXRlcyA9IHJvdXRlczsKIAogCXJldHVybiAwOwogfQpAQCAtMzU2OCwyNiArMzYyNCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IHNuZF9zb2NfaW5pdCh2b2lkKQogewotI2lmZGVmIENPTkZJR19ERUJVR19GUwotCXNuZF9zb2NfZGVidWdmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJhc29jIiwgTlVMTCk7Ci0JaWYgKElTX0VSUihzbmRfc29jX2RlYnVnZnNfcm9vdCkgfHwgIXNuZF9zb2NfZGVidWdmc19yb290KSB7Ci0JCXByX3dhcm4oIkFTb0M6IEZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnlcbiIpOwotCQlzbmRfc29jX2RlYnVnZnNfcm9vdCA9IE5VTEw7Ci0JfQotCi0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjb2RlY3MiLCAwNDQ0LCBzbmRfc29jX2RlYnVnZnNfcm9vdCwgTlVMTCwKLQkJCQkgJmNvZGVjX2xpc3RfZm9wcykpCi0JCXByX3dhcm4oIkFTb0M6IEZhaWxlZCB0byBjcmVhdGUgQ09ERUMgbGlzdCBkZWJ1Z2ZzIGZpbGVcbiIpOwotCi0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJkYWlzIiwgMDQ0NCwgc25kX3NvY19kZWJ1Z2ZzX3Jvb3QsIE5VTEwsCi0JCQkJICZkYWlfbGlzdF9mb3BzKSkKLQkJcHJfd2FybigiQVNvQzogRmFpbGVkIHRvIGNyZWF0ZSBEQUkgbGlzdCBkZWJ1Z2ZzIGZpbGVcbiIpOwotCi0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJwbGF0Zm9ybXMiLCAwNDQ0LCBzbmRfc29jX2RlYnVnZnNfcm9vdCwgTlVMTCwKLQkJCQkgJnBsYXRmb3JtX2xpc3RfZm9wcykpCi0JCXByX3dhcm4oIkFTb0M6IEZhaWxlZCB0byBjcmVhdGUgcGxhdGZvcm0gbGlzdCBkZWJ1Z2ZzIGZpbGVcbiIpOwotI2VuZGlmCi0KKwlzbmRfc29jX2RlYnVnZnNfaW5pdCgpOwogCXNuZF9zb2NfdXRpbF9pbml0KCk7CiAKIAlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzb2NfZHJpdmVyKTsKQEAgLTM1OTcsOSArMzYzNCw5IEBACiBzdGF0aWMgdm9pZCBfX2V4aXQgc25kX3NvY19leGl0KHZvaWQpCiB7CiAJc25kX3NvY191dGlsX2V4aXQoKTsKKwlzbmRfc29jX2RlYnVnZnNfZXhpdCgpOwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCi0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKHNuZF9zb2NfZGVidWdmc19yb290KTsKICNlbmRpZgogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzb2NfZHJpdmVyKTsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtZGFwbS5jIGIvc291bmQvc29jL3NvYy1kYXBtLmMKaW5kZXggYjZmODgyMC4uZGVmZTBmMCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1kYXBtLmMKKysrIGIvc291bmQvc29jL3NvYy1kYXBtLmMKQEAgLTQ3MywxNiArNDczLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfZGFwbV9rY29udHJvbF9kYXBtKTsKIAotLyoqCi0gKiBzbmRfc29jX2RhcG1fa2NvbnRyb2xfY29kZWMoKSAtIFJldHVybnMgdGhlIGNvZGVjIGFzc29jaWF0ZWQgdG8gYSBrY29udHJvbAotICogQGtjb250cm9sOiBUaGUga2NvbnRyb2wKLSAqLwotc3RydWN0IHNuZF9zb2NfY29kZWMgKnNuZF9zb2NfZGFwbV9rY29udHJvbF9jb2RlYyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCkKLXsKLQlyZXR1cm4gc25kX3NvY19kYXBtX3RvX2NvZGVjKHNuZF9zb2NfZGFwbV9rY29udHJvbF9kYXBtKGtjb250cm9sKSk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChzbmRfc29jX2RhcG1fa2NvbnRyb2xfY29kZWMpOwotCiBzdGF0aWMgdm9pZCBkYXBtX3Jlc2V0KHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQpCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7CkBAIC04NTMsNiArODQzLDM2IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIGNyZWF0ZSBuZXcgZGFwbSBkYWkgbGluayBjb250cm9sICovCitzdGF0aWMgaW50IGRhcG1fbmV3X2RhaV9saW5rKHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3KQoreworCWludCBpLCByZXQ7CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2w7CisJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gdy0+ZGFwbTsKKwlzdHJ1Y3Qgc25kX2NhcmQgKmNhcmQgPSBkYXBtLT5jYXJkLT5zbmRfY2FyZDsKKworCS8qIGNyZWF0ZSBjb250cm9sIGZvciBsaW5rcyB3aXRoID4gMSBjb25maWcgKi8KKwlpZiAody0+bnVtX3BhcmFtcyA8PSAxKQorCQlyZXR1cm4gMDsKKworCS8qIGFkZCBrY29udHJvbCAqLworCWZvciAoaSA9IDA7IGkgPCB3LT5udW1fa2NvbnRyb2xzOyBpKyspIHsKKwkJa2NvbnRyb2wgPSBzbmRfc29jX2NuZXcoJnctPmtjb250cm9sX25ld3NbaV0sIHcsCisJCQkJCXctPm5hbWUsIE5VTEwpOworCQlyZXQgPSBzbmRfY3RsX2FkZChjYXJkLCBrY29udHJvbCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKGRhcG0tPmRldiwKKwkJCQkiQVNvQzogZmFpbGVkIHRvIGFkZCB3aWRnZXQgJXMgZGFwbSBrY29udHJvbCAlczogJWRcbiIsCisJCQkJdy0+bmFtZSwgdy0+a2NvbnRyb2xfbmV3c1tpXS5uYW1lLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlrY29udHJvbC0+cHJpdmF0ZV9kYXRhID0gdzsKKwkJdy0+a2NvbnRyb2xzW2ldID0ga2NvbnRyb2w7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIC8qIFdlIGltcGxlbWVudCBwb3dlciBkb3duIG9uIHN1c3BlbmQgYnkgY2hlY2tpbmcgdGhlIHBvd2VyIHN0YXRlIG9mCiAgKiB0aGUgQUxTQSBjYXJkIC0gd2hlbiB3ZSBhcmUgc3VzcGVuZGluZyB0aGUgQUxTQSBzdGF0ZSBmb3IgdGhlIGNhcmQKICAqIGlzIHNldCB0byBEMy4KQEAgLTE4OTgsNiArMTkxOCw5IEBACiB7CiAJc3RydWN0IGRlbnRyeSAqZDsKIAorCWlmICghcGFyZW50KQorCQlyZXR1cm47CisKIAlkYXBtLT5kZWJ1Z2ZzX2RhcG0gPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImRhcG0iLCBwYXJlbnQpOwogCiAJaWYgKCFkYXBtLT5kZWJ1Z2ZzX2RhcG0pIHsKQEAgLTI3MTksNiArMjc0Miw5IEBACiAJCWNhc2Ugc25kX3NvY19kYXBtX291dF9kcnY6CiAJCQlkYXBtX25ld19wZ2Eodyk7CiAJCQlicmVhazsKKwkJY2FzZSBzbmRfc29jX2RhcG1fZGFpX2xpbms6CisJCQlkYXBtX25ld19kYWlfbGluayh3KTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KQEAgLTMxOTMsNyArMzIxOSw3IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9wYXRoICpzb3VyY2VfcCwgKnNpbmtfcDsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKnNvdXJjZSwgKnNpbms7Ci0JY29uc3Qgc3RydWN0IHNuZF9zb2NfcGNtX3N0cmVhbSAqY29uZmlnID0gdy0+cGFyYW1zOworCWNvbnN0IHN0cnVjdCBzbmRfc29jX3BjbV9zdHJlYW0gKmNvbmZpZyA9IHctPnBhcmFtcyArIHctPnBhcmFtc19zZWxlY3Q7CiAJc3RydWN0IHNuZF9wY21fc3Vic3RyZWFtIHN1YnN0cmVhbTsKIAlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcyA9IE5VTEw7CiAJdTY0IGZtdDsKQEAgLTMyODUsMjIgKzMzMTEsOTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IHNuZF9zb2NfZGFwbV9kYWlfbGlua19nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICp3ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSB3LT5wYXJhbXNfc2VsZWN0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX3NvY19kYXBtX2RhaV9saW5rX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKncgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisKKwkvKiBDYW4ndCBjaGFuZ2UgdGhlIGNvbmZpZyB3aGVuIHdpZGdldCBpcyBhbHJlYWR5IHBvd2VyZWQgKi8KKwlpZiAody0+cG93ZXIpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPT0gdy0+cGFyYW1zX3NlbGVjdCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPj0gdy0+bnVtX3BhcmFtcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3LT5wYXJhbXNfc2VsZWN0ID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlyZXR1cm4gMDsKK30KKwogaW50IHNuZF9zb2NfZGFwbV9uZXdfcGNtKHN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQsCiAJCQkgY29uc3Qgc3RydWN0IHNuZF9zb2NfcGNtX3N0cmVhbSAqcGFyYW1zLAorCQkJIHVuc2lnbmVkIGludCBudW1fcGFyYW1zLAogCQkJIHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0ICpzb3VyY2UsCiAJCQkgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnNpbmspCiB7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgdGVtcGxhdGU7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgKnc7Ci0Jc2l6ZV90IGxlbjsKIAljaGFyICpsaW5rX25hbWU7Ci0JaW50IHJldDsKKwlpbnQgcmV0LCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIHByaXZhdGVfdmFsdWU7CisJY29uc3QgY2hhciAqKndfcGFyYW1fdGV4dDsKKwlzdHJ1Y3Qgc29jX2VudW0gd19wYXJhbV9lbnVtW10gPSB7CisJCVNPQ19FTlVNX1NJTkdMRSgwLCAwLCAwLCBOVUxMKSwKKwl9OworCXN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IGtjb250cm9sX2RhaV9saW5rW10gPSB7CisJCVNPQ19FTlVNX0VYVChOVUxMLCB3X3BhcmFtX2VudW1bMF0sCisJCQkgICAgIHNuZF9zb2NfZGFwbV9kYWlfbGlua19nZXQsCisJCQkgICAgIHNuZF9zb2NfZGFwbV9kYWlfbGlua19wdXQpLAorCX07CisJY29uc3Qgc3RydWN0IHNuZF9zb2NfcGNtX3N0cmVhbSAqY29uZmlnID0gcGFyYW1zOwogCi0JbGVuID0gc3RybGVuKHNvdXJjZS0+bmFtZSkgKyBzdHJsZW4oc2luay0+bmFtZSkgKyAyOwotCWxpbmtfbmFtZSA9IGRldm1fa3phbGxvYyhjYXJkLT5kZXYsIGxlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFsaW5rX25hbWUpCisJd19wYXJhbV90ZXh0ID0gZGV2bV9rY2FsbG9jKGNhcmQtPmRldiwgbnVtX3BhcmFtcywKKwkJCQkJc2l6ZW9mKGNoYXIgKiksIEdGUF9LRVJORUwpOworCWlmICghd19wYXJhbV90ZXh0KQogCQlyZXR1cm4gLUVOT01FTTsKLQlzbnByaW50ZihsaW5rX25hbWUsIGxlbiwgIiVzLSVzIiwgc291cmNlLT5uYW1lLCBzaW5rLT5uYW1lKTsKKworCWxpbmtfbmFtZSA9IGRldm1fa2FzcHJpbnRmKGNhcmQtPmRldiwgR0ZQX0tFUk5FTCwgIiVzLSVzIiwKKwkJCQkgICBzb3VyY2UtPm5hbWUsIHNpbmstPm5hbWUpOworCWlmICghbGlua19uYW1lKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0ZnJlZV93X3BhcmFtOworCX0KKworCWZvciAoY291bnQgPSAwIDsgY291bnQgPCBudW1fcGFyYW1zOyBjb3VudCsrKSB7CisJCWlmICghY29uZmlnLT5zdHJlYW1fbmFtZSkgeworCQkJZGV2X3dhcm4oY2FyZC0+ZGFwbS5kZXYsCisJCQkJIkFTb0M6IGFub255bW91cyBjb25maWcgJWQgZm9yIGRhaSBsaW5rICVzXG4iLAorCQkJCWNvdW50LCBsaW5rX25hbWUpOworCQkJd19wYXJhbV90ZXh0W2NvdW50XSA9CisJCQkJZGV2bV9rYXNwcmludGYoY2FyZC0+ZGV2LCBHRlBfS0VSTkVMLAorCQkJCQkgICAgICAgIkFub255bW91cyBDb25maWd1cmF0aW9uICVkIiwKKwkJCQkJICAgICAgIGNvdW50KTsKKwkJCWlmICghd19wYXJhbV90ZXh0W2NvdW50XSkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXRmcmVlX2xpbmtfbmFtZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXdfcGFyYW1fdGV4dFtjb3VudF0gPSBkZXZtX2ttZW1kdXAoY2FyZC0+ZGV2LAorCQkJCQkJY29uZmlnLT5zdHJlYW1fbmFtZSwKKwkJCQkJCXN0cmxlbihjb25maWctPnN0cmVhbV9uYW1lKSArIDEsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghd19wYXJhbV90ZXh0W2NvdW50XSkgeworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBvdXRmcmVlX2xpbmtfbmFtZTsKKwkJCX0KKwkJfQorCQljb25maWcrKzsKKwl9CisJd19wYXJhbV9lbnVtWzBdLml0ZW1zID0gbnVtX3BhcmFtczsKKwl3X3BhcmFtX2VudW1bMF0udGV4dHMgPSB3X3BhcmFtX3RleHQ7CiAKIAltZW1zZXQoJnRlbXBsYXRlLCAwLCBzaXplb2YodGVtcGxhdGUpKTsKIAl0ZW1wbGF0ZS5yZWcgPSBTTkRfU09DX05PUE07CkBAIC0zMzA5LDYgKzM0MTAsMzAgQEAKIAl0ZW1wbGF0ZS5ldmVudCA9IHNuZF9zb2NfZGFpX2xpbmtfZXZlbnQ7CiAJdGVtcGxhdGUuZXZlbnRfZmxhZ3MgPSBTTkRfU09DX0RBUE1fUFJFX1BNVSB8IFNORF9TT0NfREFQTV9QT1NUX1BNVSB8CiAJCVNORF9TT0NfREFQTV9QUkVfUE1EOworCXRlbXBsYXRlLm51bV9rY29udHJvbHMgPSAxOworCS8qIGR1cGxpY2F0ZSB3X3BhcmFtX2VudW0gb24gaGVhcCBzbyB0aGF0IG1lbW9yeSBwZXJzaXN0cyAqLworCXByaXZhdGVfdmFsdWUgPQorCQkodW5zaWduZWQgbG9uZykgZGV2bV9rbWVtZHVwKGNhcmQtPmRldiwKKwkJCSh2b2lkICopKGtjb250cm9sX2RhaV9saW5rWzBdLnByaXZhdGVfdmFsdWUpLAorCQkJc2l6ZW9mKHN0cnVjdCBzb2NfZW51bSksIEdGUF9LRVJORUwpOworCWlmICghcHJpdmF0ZV92YWx1ZSkgeworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkFTb0M6IEZhaWxlZCB0byBjcmVhdGUgY29udHJvbCBmb3IgJXMgd2lkZ2V0XG4iLAorCQkJbGlua19uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRmcmVlX2xpbmtfbmFtZTsKKwl9CisJa2NvbnRyb2xfZGFpX2xpbmtbMF0ucHJpdmF0ZV92YWx1ZSA9IHByaXZhdGVfdmFsdWU7CisJLyogZHVwbGljYXRlIGtjb250cm9sX2RhaV9saW5rIG9uIGhlYXAgc28gdGhhdCBtZW1vcnkgcGVyc2lzdHMgKi8KKwl0ZW1wbGF0ZS5rY29udHJvbF9uZXdzID0KKwkJCQlkZXZtX2ttZW1kdXAoY2FyZC0+ZGV2LCAma2NvbnRyb2xfZGFpX2xpbmtbMF0sCisJCQkJCXNpemVvZihzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyksCisJCQkJCUdGUF9LRVJORUwpOworCWlmICghdGVtcGxhdGUua2NvbnRyb2xfbmV3cykgeworCQlkZXZfZXJyKGNhcmQtPmRldiwgIkFTb0M6IEZhaWxlZCB0byBjcmVhdGUgY29udHJvbCBmb3IgJXMgd2lkZ2V0XG4iLAorCQkJbGlua19uYW1lKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRmcmVlX3ByaXZhdGVfdmFsdWU7CisJfQogCiAJZGV2X2RiZyhjYXJkLT5kZXYsICJBU29DOiBhZGRpbmcgJXMgd2lkZ2V0XG4iLCBsaW5rX25hbWUpOwogCkBAIC0zMzE2LDE1ICszNDQxLDMyIEBACiAJaWYgKCF3KSB7CiAJCWRldl9lcnIoY2FyZC0+ZGV2LCAiQVNvQzogRmFpbGVkIHRvIGNyZWF0ZSAlcyB3aWRnZXRcbiIsCiAJCQlsaW5rX25hbWUpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRmcmVlX2tjb250cm9sX25ld3M7CiAJfQogCiAJdy0+cGFyYW1zID0gcGFyYW1zOworCXctPm51bV9wYXJhbXMgPSBudW1fcGFyYW1zOwogCiAJcmV0ID0gc25kX3NvY19kYXBtX2FkZF9wYXRoKCZjYXJkLT5kYXBtLCBzb3VyY2UsIHcsIE5VTEwsIE5VTEwpOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0ZnJlZV93OwogCXJldHVybiBzbmRfc29jX2RhcG1fYWRkX3BhdGgoJmNhcmQtPmRhcG0sIHcsIHNpbmssIE5VTEwsIE5VTEwpOworCitvdXRmcmVlX3c6CisJZGV2bV9rZnJlZShjYXJkLT5kZXYsIHcpOworb3V0ZnJlZV9rY29udHJvbF9uZXdzOgorCWRldm1fa2ZyZWUoY2FyZC0+ZGV2LCAodm9pZCAqKXRlbXBsYXRlLmtjb250cm9sX25ld3MpOworb3V0ZnJlZV9wcml2YXRlX3ZhbHVlOgorCWRldm1fa2ZyZWUoY2FyZC0+ZGV2LCAodm9pZCAqKXByaXZhdGVfdmFsdWUpOworb3V0ZnJlZV9saW5rX25hbWU6CisJZGV2bV9rZnJlZShjYXJkLT5kZXYsIGxpbmtfbmFtZSk7CitvdXRmcmVlX3dfcGFyYW06CisJZm9yIChjb3VudCA9IDAgOyBjb3VudCA8IG51bV9wYXJhbXM7IGNvdW50KyspCisJCWRldm1fa2ZyZWUoY2FyZC0+ZGV2LCAodm9pZCAqKXdfcGFyYW1fdGV4dFtjb3VudF0pOworCWRldm1fa2ZyZWUoY2FyZC0+ZGV2LCB3X3BhcmFtX3RleHQpOworCisJcmV0dXJuIHJldDsKIH0KIAogaW50IHNuZF9zb2NfZGFwbV9uZXdfZGFpX3dpZGdldHMoc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1qYWNrLmMgYi9zb3VuZC9zb2Mvc29jLWphY2suYwppbmRleCA0MzgwZGNjLi45ZjYwYzI1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWphY2suYworKysgYi9zb3VuZC9zb2Mvc29jLWphY2suYwpAQCAtMjIsMzAgKzIyLDQyIEBACiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Fzb2MuaD4KIAogLyoqCi0gKiBzbmRfc29jX2phY2tfbmV3IC0gQ3JlYXRlIGEgbmV3IGphY2sKLSAqIEBjb2RlYzogQVNvQyBjb2RlYworICogc25kX3NvY19jYXJkX2phY2tfbmV3IC0gQ3JlYXRlIGEgbmV3IGphY2sKKyAqIEBjYXJkOiAgQVNvQyBjYXJkCiAgKiBAaWQ6ICAgIGFuIGlkZW50aWZ5aW5nIHN0cmluZyBmb3IgdGhpcyBqYWNrCiAgKiBAdHlwZTogIGEgYml0bWFzayBvZiBlbnVtIHNuZF9qYWNrX3R5cGUgdmFsdWVzIHRoYXQgY2FuIGJlIGRldGVjdGVkIGJ5CiAgKiAgICAgICAgIHRoaXMgamFjawogICogQGphY2s6ICBzdHJ1Y3R1cmUgdG8gdXNlIGZvciB0aGUgamFjaworICogQHBpbnM6ICBBcnJheSBvZiBqYWNrIHBpbnMgdG8gYmUgYWRkZWQgdG8gdGhlIGphY2sgb3IgTlVMTAorICogQG51bV9waW5zOiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIEBwaW5zIGFycmF5CiAgKgogICogQ3JlYXRlcyBhIG5ldyBqYWNrIG9iamVjdC4KICAqCiAgKiBSZXR1cm5zIHplcm8gaWYgc3VjY2Vzc2Z1bCwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCiAgKiBPbiBzdWNjZXNzIGphY2sgd2lsbCBiZSBpbml0aWFsaXNlZC4KICAqLwotaW50IHNuZF9zb2NfamFja19uZXcoc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjLCBjb25zdCBjaGFyICppZCwgaW50IHR5cGUsCi0JCSAgICAgc3RydWN0IHNuZF9zb2NfamFjayAqamFjaykKK2ludCBzbmRfc29jX2NhcmRfamFja19uZXcoc3RydWN0IHNuZF9zb2NfY2FyZCAqY2FyZCwgY29uc3QgY2hhciAqaWQsIGludCB0eXBlLAorCXN0cnVjdCBzbmRfc29jX2phY2sgKmphY2ssIHN0cnVjdCBzbmRfc29jX2phY2tfcGluICpwaW5zLAorCXVuc2lnbmVkIGludCBudW1fcGlucykKIHsKKwlpbnQgcmV0OworCiAJbXV0ZXhfaW5pdCgmamFjay0+bXV0ZXgpOwotCWphY2stPmNvZGVjID0gY29kZWM7CisJamFjay0+Y2FyZCA9IGNhcmQ7CiAJSU5JVF9MSVNUX0hFQUQoJmphY2stPnBpbnMpOwogCUlOSVRfTElTVF9IRUFEKCZqYWNrLT5qYWNrX3pvbmVzKTsKIAlCTE9DS0lOR19JTklUX05PVElGSUVSX0hFQUQoJmphY2stPm5vdGlmaWVyKTsKIAotCXJldHVybiBzbmRfamFja19uZXcoY29kZWMtPmNvbXBvbmVudC5jYXJkLT5zbmRfY2FyZCwgaWQsIHR5cGUsICZqYWNrLT5qYWNrKTsKKwlyZXQgPSBzbmRfamFja19uZXcoY2FyZC0+c25kX2NhcmQsIGlkLCB0eXBlLCAmamFjay0+amFjayk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChudW1fcGlucykKKwkJcmV0dXJuIHNuZF9zb2NfamFja19hZGRfcGlucyhqYWNrLCBudW1fcGlucywgcGlucyk7CisKKwlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHNuZF9zb2NfamFja19uZXcpOworRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19jYXJkX2phY2tfbmV3KTsKIAogLyoqCiAgKiBzbmRfc29jX2phY2tfcmVwb3J0IC0gUmVwb3J0IHRoZSBjdXJyZW50IHN0YXR1cyBmb3IgYSBqYWNrCkBAIC02Myw3ICs3NSw2IEBACiAgKi8KIHZvaWQgc25kX3NvY19qYWNrX3JlcG9ydChzdHJ1Y3Qgc25kX3NvY19qYWNrICpqYWNrLCBpbnQgc3RhdHVzLCBpbnQgbWFzaykKIHsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWM7CiAJc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtOwogCXN0cnVjdCBzbmRfc29jX2phY2tfcGluICpwaW47CiAJdW5zaWduZWQgaW50IHN5bmMgPSAwOwpAQCAtNzQsOCArODUsNyBAQAogCWlmICghamFjaykKIAkJcmV0dXJuOwogCi0JY29kZWMgPSBqYWNrLT5jb2RlYzsKLQlkYXBtID0gICZjb2RlYy0+ZGFwbTsKKwlkYXBtID0gJmphY2stPmNhcmQtPmRhcG07CiAKIAltdXRleF9sb2NrKCZqYWNrLT5tdXRleCk7CiAKQEAgLTE3NSwxMiArMTg1LDEyIEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogCQlpZiAoIXBpbnNbaV0ucGluKSB7Ci0JCQlkZXZfZXJyKGphY2stPmNvZGVjLT5kZXYsICJBU29DOiBObyBuYW1lIGZvciBwaW4gJWRcbiIsCisJCQlkZXZfZXJyKGphY2stPmNhcmQtPmRldiwgIkFTb0M6IE5vIG5hbWUgZm9yIHBpbiAlZFxuIiwKIAkJCQlpKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmICghcGluc1tpXS5tYXNrKSB7Ci0JCQlkZXZfZXJyKGphY2stPmNvZGVjLT5kZXYsICJBU29DOiBObyBtYXNrIGZvciBwaW4gJWQiCisJCQlkZXZfZXJyKGphY2stPmNhcmQtPmRldiwgIkFTb0M6IE5vIG1hc2sgZm9yIHBpbiAlZCIKIAkJCQkiICglcylcbiIsIGksIHBpbnNbaV0ucGluKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0yNjAsNyArMjcwLDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBncGlvX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc25kX3NvY19qYWNrX2dwaW8gKmdwaW8gPSBkYXRhOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGdwaW8tPmphY2stPmNvZGVjLT5jb21wb25lbnQuY2FyZC0+ZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGdwaW8tPmphY2stPmNhcmQtPmRldjsKIAogCXRyYWNlX3NuZF9zb2NfamFja19pcnEoZ3Bpby0+bmFtZSk7CiAKQEAgLTI5OSw3ICszMDksNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJaWYgKCFncGlvc1tpXS5uYW1lKSB7Ci0JCQlkZXZfZXJyKGphY2stPmNvZGVjLT5kZXYsCisJCQlkZXZfZXJyKGphY2stPmNhcmQtPmRldiwKIAkJCQkiQVNvQzogTm8gbmFtZSBmb3IgZ3BpbyBhdCBpbmRleCAlZFxuIiwgaSk7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byB1bmRvOwpAQCAtMzIwLDcgKzMzMCw3IEBACiAJCX0gZWxzZSB7CiAJCQkvKiBsZWdhY3kgR1BJTyBudW1iZXIgKi8KIAkJCWlmICghZ3Bpb19pc192YWxpZChncGlvc1tpXS5ncGlvKSkgewotCQkJCWRldl9lcnIoamFjay0+Y29kZWMtPmRldiwKKwkJCQlkZXZfZXJyKGphY2stPmNhcmQtPmRldiwKIAkJCQkJIkFTb0M6IEludmFsaWQgZ3BpbyAlZFxuIiwKIAkJCQkJZ3Bpb3NbaV0uZ3Bpbyk7CiAJCQkJcmV0ID0gLUVJTlZBTDsKQEAgLTM1MCw3ICszNjAsNyBAQAogCQlpZiAoZ3Bpb3NbaV0ud2FrZSkgewogCQkJcmV0ID0gaXJxX3NldF9pcnFfd2FrZShncGlvZF90b19pcnEoZ3Bpb3NbaV0uZGVzYyksIDEpOwogCQkJaWYgKHJldCAhPSAwKQotCQkJCWRldl9lcnIoamFjay0+Y29kZWMtPmRldiwKKwkJCQlkZXZfZXJyKGphY2stPmNhcmQtPmRldiwKIAkJCQkJIkFTb0M6IEZhaWxlZCB0byBtYXJrIEdQSU8gYXQgaW5kZXggJWQgYXMgd2FrZSBzb3VyY2U6ICVkXG4iLAogCQkJCQlpLCByZXQpOwogCQl9CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc29jLXBjbS5jIGIvc291bmQvc29jL3NvYy1wY20uYwppbmRleCA2YjAxMzZlLi4zNWZlNThmNCAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NvYy1wY20uYworKysgYi9zb3VuZC9zb2Mvc29jLXBjbS5jCkBAIC0xMDk3LDggKzEwOTcsOSBAQAogCQkJc3RyZWFtID8gIjwtIiA6ICItPiIsIGJlLT5kYWlfbGluay0+bmFtZSk7CiAKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKLQlkcGNtLT5kZWJ1Z2ZzX3N0YXRlID0gZGVidWdmc19jcmVhdGVfdTMyKGJlLT5kYWlfbGluay0+bmFtZSwgMDY0NCwKLQkJCWZlLT5kZWJ1Z2ZzX2RwY21fcm9vdCwgJmRwY20tPnN0YXRlKTsKKwlpZiAoZmUtPmRlYnVnZnNfZHBjbV9yb290KQorCQlkcGNtLT5kZWJ1Z2ZzX3N0YXRlID0gZGVidWdmc19jcmVhdGVfdTMyKGJlLT5kYWlfbGluay0+bmFtZSwgMDY0NCwKKwkJCQlmZS0+ZGVidWdmc19kcGNtX3Jvb3QsICZkcGNtLT5zdGF0ZSk7CiAjZW5kaWYKIAlyZXR1cm4gMTsKIH0KQEAgLTI1MTEsNiArMjUxMiw3IEBACiAJLyogREFQTSBkYWkgbGluayBzdHJlYW0gd29yayAqLwogCUlOSVRfREVMQVlFRF9XT1JLKCZydGQtPmRlbGF5ZWRfd29yaywgY2xvc2VfZGVsYXllZF93b3JrKTsKIAorCXBjbS0+bm9uYXRvbWljID0gcnRkLT5kYWlfbGluay0+bm9uYXRvbWljOwogCXJ0ZC0+cGNtID0gcGNtOwogCXBjbS0+cHJpdmF0ZV9kYXRhID0gcnRkOwogCkBAIC0yODAyLDEwICsyODA0LDEzIEBACiAJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAogfTsKIAotaW50IHNvY19kcGNtX2RlYnVnZnNfYWRkKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCit2b2lkIHNvY19kcGNtX2RlYnVnZnNfYWRkKHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CiAJaWYgKCFydGQtPmRhaV9saW5rKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOworCisJaWYgKCFydGQtPmNhcmQtPmRlYnVnZnNfY2FyZF9yb290KQorCQlyZXR1cm47CiAKIAlydGQtPmRlYnVnZnNfZHBjbV9yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKHJ0ZC0+ZGFpX2xpbmstPm5hbWUsCiAJCQlydGQtPmNhcmQtPmRlYnVnZnNfY2FyZF9yb290KTsKQEAgLTI4MTMsMTMgKzI4MTgsMTEgQEAKIAkJZGV2X2RiZyhydGQtPmRldiwKIAkJCSAiQVNvQzogRmFpbGVkIHRvIGNyZWF0ZSBkcGNtIGRlYnVnZnMgZGlyZWN0b3J5ICVzXG4iLAogCQkJIHJ0ZC0+ZGFpX2xpbmstPm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuOwogCX0KIAogCXJ0ZC0+ZGVidWdmc19kcGNtX3N0YXRlID0gZGVidWdmc19jcmVhdGVfZmlsZSgic3RhdGUiLCAwNDQ0LAogCQkJCQkJcnRkLT5kZWJ1Z2ZzX2RwY21fcm9vdCwKIAkJCQkJCXJ0ZCwgJmRwY21fc3RhdGVfZm9wcyk7Ci0KLQlyZXR1cm4gMDsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX2FsYzU2MzIuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9hbGM1NjMyLmMKaW5kZXggNzY5YWNhMi4uYmEyNzJlMiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX2FsYzU2MzIuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfYWxjNTYzMi5jCkBAIC0xMDEsMTYgKzEwMSwxMiBAQAogCiBzdGF0aWMgaW50IHRlZ3JhX2FsYzU2MzJfYXNvY19pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlzdHJ1Y3QgdGVncmFfYWxjNTYzMiAqbWFjaGluZSA9IHNuZF9zb2NfY2FyZF9nZXRfZHJ2ZGF0YShydGQtPmNhcmQpOwogCi0Jc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRzZXQgSmFjayIsIFNORF9KQUNLX0hFQURTRVQsCi0JCQkgJnRlZ3JhX2FsYzU2MzJfaHNfamFjayk7Ci0Jc25kX3NvY19qYWNrX2FkZF9waW5zKCZ0ZWdyYV9hbGM1NjMyX2hzX2phY2ssCi0JCQlBUlJBWV9TSVpFKHRlZ3JhX2FsYzU2MzJfaHNfamFja19waW5zKSwKLQkJCXRlZ3JhX2FsYzU2MzJfaHNfamFja19waW5zKTsKKwlzbmRfc29jX2NhcmRfamFja19uZXcocnRkLT5jYXJkLCAiSGVhZHNldCBKYWNrIiwgU05EX0pBQ0tfSEVBRFNFVCwKKwkJCSAgICAgICZ0ZWdyYV9hbGM1NjMyX2hzX2phY2ssCisJCQkgICAgICB0ZWdyYV9hbGM1NjMyX2hzX2phY2tfcGlucywKKwkJCSAgICAgIEFSUkFZX1NJWkUodGVncmFfYWxjNTYzMl9oc19qYWNrX3BpbnMpKTsKIAogCWlmIChncGlvX2lzX3ZhbGlkKG1hY2hpbmUtPmdwaW9faHBfZGV0KSkgewogCQl0ZWdyYV9hbGM1NjMyX2hwX2phY2tfZ3Bpby5ncGlvID0gbWFjaGluZS0+Z3Bpb19ocF9kZXQ7CkBAIC0xMTksNyArMTE1LDcgQEAKIAkJCQkJCSZ0ZWdyYV9hbGM1NjMyX2hwX2phY2tfZ3Bpbyk7CiAJfQogCi0Jc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oZGFwbSwgIk1JQ0JJQVMxIik7CisJc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oJnJ0ZC0+Y2FyZC0+ZGFwbSwgIk1JQ0JJQVMxIik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9tYXg5ODA5MC5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX21heDk4MDkwLmMKaW5kZXggYWYzZmI5OS4uOTAyZGEzNiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX21heDk4MDkwLmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX21heDk4MDkwLmMKQEAgLTEzMywyNCArMTMzLDI2IEBACiAJU05EX1NPQ19EQVBNX0hQKCJIZWFkcGhvbmVzIiwgTlVMTCksCiAJU05EX1NPQ19EQVBNX1NQSygiU3BlYWtlcnMiLCBOVUxMKSwKIAlTTkRfU09DX0RBUE1fTUlDKCJNaWMgSmFjayIsIE5VTEwpLAorCVNORF9TT0NfREFQTV9NSUMoIkludCBNaWMiLCBOVUxMKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0ZWdyYV9tYXg5ODA5MF9jb250cm9sc1tdID0geworCVNPQ19EQVBNX1BJTl9TV0lUQ0goIkhlYWRwaG9uZXMiKSwKIAlTT0NfREFQTV9QSU5fU1dJVENIKCJTcGVha2VycyIpLAorCVNPQ19EQVBNX1BJTl9TV0lUQ0goIk1pYyBKYWNrIiksCisJU09DX0RBUE1fUElOX1NXSVRDSCgiSW50IE1pYyIpLAogfTsKIAogc3RhdGljIGludCB0ZWdyYV9tYXg5ODA5MF9hc29jX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7CiAJc3RydWN0IHRlZ3JhX21heDk4MDkwICptYWNoaW5lID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CiAKIAlpZiAoZ3Bpb19pc192YWxpZChtYWNoaW5lLT5ncGlvX2hwX2RldCkpIHsKLQkJc25kX3NvY19qYWNrX25ldyhjb2RlYywgIkhlYWRwaG9uZXMiLCBTTkRfSkFDS19IRUFEUEhPTkUsCi0JCQkJJnRlZ3JhX21heDk4MDkwX2hwX2phY2spOwotCQlzbmRfc29jX2phY2tfYWRkX3BpbnMoJnRlZ3JhX21heDk4MDkwX2hwX2phY2ssCi0JCQkJQVJSQVlfU0laRSh0ZWdyYV9tYXg5ODA5MF9ocF9qYWNrX3BpbnMpLAotCQkJCXRlZ3JhX21heDk4MDkwX2hwX2phY2tfcGlucyk7CisJCXNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJIZWFkcGhvbmVzIiwKKwkJCQkgICAgICBTTkRfSkFDS19IRUFEUEhPTkUsCisJCQkJICAgICAgJnRlZ3JhX21heDk4MDkwX2hwX2phY2ssCisJCQkJICAgICAgdGVncmFfbWF4OTgwOTBfaHBfamFja19waW5zLAorCQkJCSAgICAgIEFSUkFZX1NJWkUodGVncmFfbWF4OTgwOTBfaHBfamFja19waW5zKSk7CiAKIAkJdGVncmFfbWF4OTgwOTBfaHBfamFja19ncGlvLmdwaW8gPSBtYWNoaW5lLT5ncGlvX2hwX2RldDsKIAkJc25kX3NvY19qYWNrX2FkZF9ncGlvcygmdGVncmFfbWF4OTgwOTBfaHBfamFjaywKQEAgLTE1OSwxMSArMTYxLDExIEBACiAJfQogCiAJaWYgKGdwaW9faXNfdmFsaWQobWFjaGluZS0+Z3Bpb19taWNfZGV0KSkgewotCQlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiTWljIEphY2siLCBTTkRfSkFDS19NSUNST1BIT05FLAotCQkJCSAmdGVncmFfbWF4OTgwOTBfbWljX2phY2spOwotCQlzbmRfc29jX2phY2tfYWRkX3BpbnMoJnRlZ3JhX21heDk4MDkwX21pY19qYWNrLAotCQkJCSAgICAgIEFSUkFZX1NJWkUodGVncmFfbWF4OTgwOTBfbWljX2phY2tfcGlucyksCi0JCQkJICAgICAgdGVncmFfbWF4OTgwOTBfbWljX2phY2tfcGlucyk7CisJCXNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJNaWMgSmFjayIsCisJCQkJICAgICAgU05EX0pBQ0tfTUlDUk9QSE9ORSwKKwkJCQkgICAgICAmdGVncmFfbWF4OTgwOTBfbWljX2phY2ssCisJCQkJICAgICAgdGVncmFfbWF4OTgwOTBfbWljX2phY2tfcGlucywKKwkJCQkgICAgICBBUlJBWV9TSVpFKHRlZ3JhX21heDk4MDkwX21pY19qYWNrX3BpbnMpKTsKIAogCQl0ZWdyYV9tYXg5ODA5MF9taWNfamFja19ncGlvLmdwaW8gPSBtYWNoaW5lLT5ncGlvX21pY19kZXQ7CiAJCXNuZF9zb2NfamFja19hZGRfZ3Bpb3MoJnRlZ3JhX21heDk4MDkwX21pY19qYWNrLApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3J0NTY0MC5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3J0NTY0MC5jCmluZGV4IGVkNzU5YTMuLjc3M2RhZWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9ydDU2NDAuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfcnQ1NjQwLmMKQEAgLTEwOCwxNSArMTA4LDExIEBACiAKIHN0YXRpYyBpbnQgdGVncmFfcnQ1NjQwX2Fzb2NfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQogewotCXN0cnVjdCBzbmRfc29jX2RhaSAqY29kZWNfZGFpID0gcnRkLT5jb2RlY19kYWk7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gY29kZWNfZGFpLT5jb2RlYzsKIAlzdHJ1Y3QgdGVncmFfcnQ1NjQwICptYWNoaW5lID0gc25kX3NvY19jYXJkX2dldF9kcnZkYXRhKHJ0ZC0+Y2FyZCk7CiAKLQlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiSGVhZHBob25lcyIsIFNORF9KQUNLX0hFQURQSE9ORSwKLQkJCSAmdGVncmFfcnQ1NjQwX2hwX2phY2spOwotCXNuZF9zb2NfamFja19hZGRfcGlucygmdGVncmFfcnQ1NjQwX2hwX2phY2ssCi0JCQlBUlJBWV9TSVpFKHRlZ3JhX3J0NTY0MF9ocF9qYWNrX3BpbnMpLAotCQkJdGVncmFfcnQ1NjQwX2hwX2phY2tfcGlucyk7CisJc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRwaG9uZXMiLCBTTkRfSkFDS19IRUFEUEhPTkUsCisJCQkgICAgICAmdGVncmFfcnQ1NjQwX2hwX2phY2ssIHRlZ3JhX3J0NTY0MF9ocF9qYWNrX3BpbnMsCisJCQkgICAgICBBUlJBWV9TSVpFKHRlZ3JhX3J0NTY0MF9ocF9qYWNrX3BpbnMpKTsKIAogCWlmIChncGlvX2lzX3ZhbGlkKG1hY2hpbmUtPmdwaW9faHBfZGV0KSkgewogCQl0ZWdyYV9ydDU2NDBfaHBfamFja19ncGlvLmdwaW8gPSBtYWNoaW5lLT5ncGlvX2hwX2RldDsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9ydDU2NzcuYyBiL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV9ydDU2NzcuYwppbmRleCBlNGNmOTc4Li4xNDcwODczIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvdGVncmEvdGVncmFfcnQ1Njc3LmMKKysrIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3J0NTY3Ny5jCkBAIC0xNDEsMTUgKzE0MSwxMSBAQAogCiBzdGF0aWMgaW50IHRlZ3JhX3J0NTY3N19hc29jX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwogCXN0cnVjdCB0ZWdyYV9ydDU2NzcgKm1hY2hpbmUgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEocnRkLT5jYXJkKTsKIAotCXNuZF9zb2NfamFja19uZXcoY29kZWMsICJIZWFkcGhvbmUgSmFjayIsIFNORF9KQUNLX0hFQURQSE9ORSwKLQkJCSZ0ZWdyYV9ydDU2NzdfaHBfamFjayk7Ci0Jc25kX3NvY19qYWNrX2FkZF9waW5zKCZ0ZWdyYV9ydDU2NzdfaHBfamFjaywgMSwKLQkJCSZ0ZWdyYV9ydDU2NzdfaHBfamFja19waW5zKTsKKwlzbmRfc29jX2NhcmRfamFja19uZXcocnRkLT5jYXJkLCAiSGVhZHBob25lIEphY2siLCBTTkRfSkFDS19IRUFEUEhPTkUsCisJCQkgICAgICAmdGVncmFfcnQ1Njc3X2hwX2phY2ssCisJCQkgICAgICAmdGVncmFfcnQ1Njc3X2hwX2phY2tfcGlucywgMSk7CiAKIAlpZiAoZ3Bpb19pc192YWxpZChtYWNoaW5lLT5ncGlvX2hwX2RldCkpIHsKIAkJdGVncmFfcnQ1Njc3X2hwX2phY2tfZ3Bpby5ncGlvID0gbWFjaGluZS0+Z3Bpb19ocF9kZXQ7CkBAIC0xNTgsMTAgKzE1NCw5IEBACiAJfQogCiAKLQlzbmRfc29jX2phY2tfbmV3KGNvZGVjLCAiTWljIEphY2siLCBTTkRfSkFDS19NSUNST1BIT05FLAotCQkJJnRlZ3JhX3J0NTY3N19taWNfamFjayk7Ci0Jc25kX3NvY19qYWNrX2FkZF9waW5zKCZ0ZWdyYV9ydDU2NzdfbWljX2phY2ssIDEsCi0JCQkmdGVncmFfcnQ1Njc3X21pY19qYWNrX3BpbnMpOworCXNuZF9zb2NfY2FyZF9qYWNrX25ldyhydGQtPmNhcmQsICJNaWMgSmFjayIsIFNORF9KQUNLX01JQ1JPUEhPTkUsCisJCQkgICAgICAmdGVncmFfcnQ1Njc3X21pY19qYWNrLAorCQkJICAgICAgJnRlZ3JhX3J0NTY3N19taWNfamFja19waW5zLCAxKTsKIAogCWlmIChncGlvX2lzX3ZhbGlkKG1hY2hpbmUtPmdwaW9fbWljX3ByZXNlbnQpKSB7CiAJCXRlZ3JhX3J0NTY3N19taWNfamFja19ncGlvLmdwaW8gPSBtYWNoaW5lLT5ncGlvX21pY19wcmVzZW50OwpAQCAtMTY5LDcgKzE2NCw3IEBACiAJCQkJJnRlZ3JhX3J0NTY3N19taWNfamFja19ncGlvKTsKIAl9CiAKLQlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbihkYXBtLCAiTUlDQklBUzEiKTsKKwlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmcnRkLT5jYXJkLT5kYXBtLCAiTUlDQklBUzEiKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzMxLDcgKzMyNiw2IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0ZWdyYV9ydDU2NzdfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lID0gRFJWX05BTUUsCi0JCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkucG0gPSAmc25kX3NvY19wbV9vcHMsCiAJCS5vZl9tYXRjaF90YWJsZSA9IHRlZ3JhX3J0NTY3N19vZl9tYXRjaCwKIAl9LApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtODkwMy5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtODkwMy5jCmluZGV4IGU1MjQyMGQuLjIxNjA0MDAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV93bTg5MDMuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfd204OTAzLmMKQEAgLTE3MSwzMSArMTcxLDI4IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKIAlzdHJ1Y3Qgc25kX3NvY19jb2RlYyAqY29kZWMgPSBjb2RlY19kYWktPmNvZGVjOwotCXN0cnVjdCBzbmRfc29jX2RhcG1fY29udGV4dCAqZGFwbSA9ICZjb2RlYy0+ZGFwbTsKIAlzdHJ1Y3Qgc25kX3NvY19jYXJkICpjYXJkID0gcnRkLT5jYXJkOwogCXN0cnVjdCB0ZWdyYV93bTg5MDMgKm1hY2hpbmUgPSBzbmRfc29jX2NhcmRfZ2V0X2RydmRhdGEoY2FyZCk7CiAKIAlpZiAoZ3Bpb19pc192YWxpZChtYWNoaW5lLT5ncGlvX2hwX2RldCkpIHsKIAkJdGVncmFfd204OTAzX2hwX2phY2tfZ3Bpby5ncGlvID0gbWFjaGluZS0+Z3Bpb19ocF9kZXQ7Ci0JCXNuZF9zb2NfamFja19uZXcoY29kZWMsICJIZWFkcGhvbmUgSmFjayIsIFNORF9KQUNLX0hFQURQSE9ORSwKLQkJCQkmdGVncmFfd204OTAzX2hwX2phY2spOwotCQlzbmRfc29jX2phY2tfYWRkX3BpbnMoJnRlZ3JhX3dtODkwM19ocF9qYWNrLAotCQkJCQlBUlJBWV9TSVpFKHRlZ3JhX3dtODkwM19ocF9qYWNrX3BpbnMpLAotCQkJCQl0ZWdyYV93bTg5MDNfaHBfamFja19waW5zKTsKKwkJc25kX3NvY19jYXJkX2phY2tfbmV3KHJ0ZC0+Y2FyZCwgIkhlYWRwaG9uZSBKYWNrIiwKKwkJCQkgICAgICBTTkRfSkFDS19IRUFEUEhPTkUsICZ0ZWdyYV93bTg5MDNfaHBfamFjaywKKwkJCQkgICAgICB0ZWdyYV93bTg5MDNfaHBfamFja19waW5zLAorCQkJCSAgICAgIEFSUkFZX1NJWkUodGVncmFfd204OTAzX2hwX2phY2tfcGlucykpOwogCQlzbmRfc29jX2phY2tfYWRkX2dwaW9zKCZ0ZWdyYV93bTg5MDNfaHBfamFjaywKIAkJCQkJMSwKIAkJCQkJJnRlZ3JhX3dtODkwM19ocF9qYWNrX2dwaW8pOwogCX0KIAotCXNuZF9zb2NfamFja19uZXcoY29kZWMsICJNaWMgSmFjayIsIFNORF9KQUNLX01JQ1JPUEhPTkUsCi0JCQkgJnRlZ3JhX3dtODkwM19taWNfamFjayk7Ci0Jc25kX3NvY19qYWNrX2FkZF9waW5zKCZ0ZWdyYV93bTg5MDNfbWljX2phY2ssCi0JCQkgICAgICBBUlJBWV9TSVpFKHRlZ3JhX3dtODkwM19taWNfamFja19waW5zKSwKLQkJCSAgICAgIHRlZ3JhX3dtODkwM19taWNfamFja19waW5zKTsKKwlzbmRfc29jX2NhcmRfamFja19uZXcocnRkLT5jYXJkLCAiTWljIEphY2siLCBTTkRfSkFDS19NSUNST1BIT05FLAorCQkJICAgICAgJnRlZ3JhX3dtODkwM19taWNfamFjaywKKwkJCSAgICAgIHRlZ3JhX3dtODkwM19taWNfamFja19waW5zLAorCQkJICAgICAgQVJSQVlfU0laRSh0ZWdyYV93bTg5MDNfbWljX2phY2tfcGlucykpOwogCXdtODkwM19taWNfZGV0ZWN0KGNvZGVjLCAmdGVncmFfd204OTAzX21pY19qYWNrLCBTTkRfSkFDS19NSUNST1BIT05FLAogCQkJCTApOwogCi0Jc25kX3NvY19kYXBtX2ZvcmNlX2VuYWJsZV9waW4oZGFwbSwgIk1JQ0JJQVMiKTsKKwlzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmY2FyZC0+ZGFwbSwgIk1JQ0JJQVMiKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtOTcxMi5jIGIvc291bmQvc29jL3RlZ3JhL3RlZ3JhX3dtOTcxMi5jCmluZGV4IDI4NjhiNDguLjY0OTJmODEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy90ZWdyYS90ZWdyYV93bTk3MTIuYworKysgYi9zb3VuZC9zb2MvdGVncmEvdGVncmFfd205NzEyLmMKQEAgLTQ2LDExICs0Niw3IEBACiAKIHN0YXRpYyBpbnQgdGVncmFfd205NzEyX2luaXQoc3RydWN0IHNuZF9zb2NfcGNtX3J1bnRpbWUgKnJ0ZCkKIHsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNvZGVjX2RhaSA9IHJ0ZC0+Y29kZWNfZGFpOwotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IGNvZGVjX2RhaS0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCi0JcmV0dXJuIHNuZF9zb2NfZGFwbV9mb3JjZV9lbmFibGVfcGluKGRhcG0sICJNaWMgQmlhcyIpOworCXJldHVybiBzbmRfc29jX2RhcG1fZm9yY2VfZW5hYmxlX3BpbigmcnRkLT5jYXJkLT5kYXBtLCAiTWljIEJpYXMiKTsKIH0KIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHRlZ3JhX3dtOTcxMl9kYWkgPSB7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvdXg1MDAvbW9wNTAwX2FiODUwMC5jIGIvc291bmQvc29jL3V4NTAwL21vcDUwMF9hYjg1MDAuYwppbmRleCBhYTY1MzcwLi5iODFhN2E0YyAxMDA2NDQKLS0tIGEvc291bmQvc29jL3V4NTAwL21vcDUwMF9hYjg1MDAuYworKysgYi9zb3VuZC9zb2MvdXg1MDAvbW9wNTAwX2FiODUwMC5jCkBAIC0zNjIsNyArMzYyLDcgQEAKIAogaW50IG1vcDUwMF9hYjg1MDBfbWFjaGluZV9pbml0KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7Ci0Jc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKKwlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmcnRkLT5jYXJkLT5kYXBtOwogCXN0cnVjdCBkZXZpY2UgKmRldiA9IHJ0ZC0+Y2FyZC0+ZGV2OwogCXN0cnVjdCBtb3A1MDBfYWI4NTAwX2RydmRhdGEgKmRydmRhdGE7CiAJaW50IHJldDsKQEAgLTQwNywyMyArNDA3LDIzIEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkVhcnBpZWNlIik7Ci0JcmV0IHw9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJTcGVha2VyIExlZnQiKTsKLQlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIlNwZWFrZXIgUmlnaHQiKTsKLQlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkxpbmVPdXQgTGVmdCIpOwotCXJldCB8PSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiTGluZU91dCBSaWdodCIpOwotCXJldCB8PSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiVmlicmEgMSIpOwotCXJldCB8PSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiVmlicmEgMiIpOwotCXJldCB8PSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiTWljIDEiKTsKLQlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIk1pYyAyIik7Ci0JcmV0IHw9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJMaW5lSW4gTGVmdCIpOwotCXJldCB8PSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiTGluZUluIFJpZ2h0Iik7Ci0JcmV0IHw9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJETWljIDEiKTsKLQlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkRNaWMgMiIpOwotCXJldCB8PSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiRE1pYyAzIik7Ci0JcmV0IHw9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbigmY29kZWMtPmRhcG0sICJETWljIDQiKTsKLQlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKCZjb2RlYy0+ZGFwbSwgIkRNaWMgNSIpOwotCXJldCB8PSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oJmNvZGVjLT5kYXBtLCAiRE1pYyA2Iik7CisJcmV0ID0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJFYXJwaWVjZSIpOworCXJldCB8PSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIgTGVmdCIpOworCXJldCB8PSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIlNwZWFrZXIgUmlnaHQiKTsKKwlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lT3V0IExlZnQiKTsKKwlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lT3V0IFJpZ2h0Iik7CisJcmV0IHw9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiVmlicmEgMSIpOworCXJldCB8PSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIlZpYnJhIDIiKTsKKwlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJNaWMgMSIpOworCXJldCB8PSBzbmRfc29jX2RhcG1fZGlzYWJsZV9waW4oZGFwbSwgIk1pYyAyIik7CisJcmV0IHw9IHNuZF9zb2NfZGFwbV9kaXNhYmxlX3BpbihkYXBtLCAiTGluZUluIExlZnQiKTsKKwlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJMaW5lSW4gUmlnaHQiKTsKKwlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJETWljIDEiKTsKKwlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJETWljIDIiKTsKKwlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJETWljIDMiKTsKKwlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJETWljIDQiKTsKKwlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJETWljIDUiKTsKKwlyZXQgfD0gc25kX3NvY19kYXBtX2Rpc2FibGVfcGluKGRhcG0sICJETWljIDYiKTsKIAogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMgYi9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMKaW5kZXggZGM5ZGYwMC4uMzM3YzMxNyAxMDA2NDQKLS0tIGEvc291bmQvdXNiL21peGVyX3F1aXJrcy5jCisrKyBiL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYwpAQCAtMTkyLDYgKzE5Miw3IEBACiAJeyBVU0JfSUQoMHgwNDFlLCAweDMwNDApLCAyLCAyLCA2LCA2LCAgMiwgIDB4NmU5MSB9LCAvKiBMaXZlISAyNC1iaXQgKi8KIAl7IFVTQl9JRCgweDA0MWUsIDB4MzA0MiksIDAsIDEsIDEsIDEsICAxLCAgMHgwMDBkIH0sIC8qIFVzYiBYLUZpIFM1MSAqLwogCXsgVVNCX0lEKDB4MDQxZSwgMHgzMGRmKSwgMCwgMSwgMSwgMSwgIDEsICAweDAwMGQgfSwgLyogVXNiIFgtRmkgUzUxIFBybyAqLworCXsgVVNCX0lEKDB4MDQxZSwgMHgzMjM3KSwgMCwgMSwgMSwgMSwgIDEsICAweDAwMGQgfSwgLyogVXNiIFgtRmkgUzUxIFBybyAqLwogCXsgVVNCX0lEKDB4MDQxZSwgMHgzMDQ4KSwgMiwgMiwgNiwgNiwgIDIsICAweDZlOTEgfSwgLyogVG9zaGliYSBTQjA1MDAgKi8KIH07CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9xdWlya3MuYyBiL3NvdW5kL3VzYi9xdWlya3MuYwppbmRleCA3NTNhNDdkLi43YzVhNzAxIDEwMDY0NAotLS0gYS9zb3VuZC91c2IvcXVpcmtzLmMKKysrIGIvc291bmQvdXNiL3F1aXJrcy5jCkBAIC0xMTEzLDI0ICsxMTEzLDM3IEBACiAKIGJvb2wgc25kX3VzYl9nZXRfc2FtcGxlX3JhdGVfcXVpcmsoc3RydWN0IHNuZF91c2JfYXVkaW8gKmNoaXApCiB7Ci0JLyogTVMgTGlmZWNhbSBIRC01MDAwIGRvZXNuJ3Qgc3VwcG9ydCByZWFkaW5nIHRoZSBzYW1wbGUgcmF0ZS4gKi8KLQlyZXR1cm4gY2hpcC0+dXNiX2lkID09IFVTQl9JRCgweDA0NUUsIDB4MDc2RCk7CisJLyogZGV2aWNlcyB3aGljaCBkbyBub3Qgc3VwcG9ydCByZWFkaW5nIHRoZSBzYW1wbGUgcmF0ZS4gKi8KKwlzd2l0Y2ggKGNoaXAtPnVzYl9pZCkgeworCWNhc2UgVVNCX0lEKDB4MDQ1RSwgMHgwNzVEKTogLyogTVMgTGlmZWNhbSBDaW5lbWEgICovCisJY2FzZSBVU0JfSUQoMHgwNDVFLCAweDA3NkQpOiAvKiBNUyBMaWZlY2FtIEhELTUwMDAgKi8KKwljYXNlIFVTQl9JRCgweDA0RDgsIDB4RkVFQSk6IC8qIEJlbmNobWFyayBEQUMxIFByZSAqLworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOwogfQogCiAvKiBNYXJhbnR6L0Rlbm9uIFVTQiBEQUNzIG5lZWQgYSB2ZW5kb3IgY21kIHRvIHN3aXRjaAogICogYmV0d2VlbiBQQ00gYW5kIG5hdGl2ZSBEU0QgbW9kZQogICovCitzdGF0aWMgYm9vbCBpc19tYXJhbnR6X2Rlbm9uX2RhYyh1bnNpZ25lZCBpbnQgaWQpCit7CisJc3dpdGNoIChpZCkgeworCWNhc2UgVVNCX0lEKDB4MTU0ZSwgMHgxMDAzKTogLyogRGVub24gREEtMzAwVVNCICovCisJY2FzZSBVU0JfSUQoMHgxNTRlLCAweDMwMDUpOiAvKiBNYXJhbnR6IEhELURBQzEgKi8KKwljYXNlIFVTQl9JRCgweDE1NGUsIDB4MzAwNik6IC8qIE1hcmFudHogU0EtMTRTMSAqLworCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCiBpbnQgc25kX3VzYl9zZWxlY3RfbW9kZV9xdWlyayhzdHJ1Y3Qgc25kX3VzYl9zdWJzdHJlYW0gKnN1YnMsCiAJCQkgICAgICBzdHJ1Y3QgYXVkaW9mb3JtYXQgKmZtdCkKIHsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gc3Vicy0+ZGV2OwogCWludCBlcnI7CiAKLQlzd2l0Y2ggKHN1YnMtPnN0cmVhbS0+Y2hpcC0+dXNiX2lkKSB7Ci0JY2FzZSBVU0JfSUQoMHgxNTRlLCAweDEwMDMpOiAvKiBEZW5vbiBEQS0zMDBVU0IgKi8KLQljYXNlIFVTQl9JRCgweDE1NGUsIDB4MzAwNSk6IC8qIE1hcmFudHogSEQtREFDMSAqLwotCWNhc2UgVVNCX0lEKDB4MTU0ZSwgMHgzMDA2KTogLyogTWFyYW50eiBTQS0xNFMxICovCi0KKwlpZiAoaXNfbWFyYW50el9kZW5vbl9kYWMoc3Vicy0+c3RyZWFtLT5jaGlwLT51c2JfaWQpKSB7CiAJCS8qIEZpcnN0IHN3aXRjaCB0byBhbHQgc2V0IDAsIG90aGVyd2lzZSB0aGUgbW9kZSBzd2l0Y2ggY21kCiAJCSAqIHdpbGwgbm90IGJlIGFjY2VwdGVkIGJ5IHRoZSBEQUMKIAkJICovCkBAIC0xMjAzLDE3ICsxMjE2LDEwIEBACiAJLyogTWFyYW50ei9EZW5vbiBkZXZpY2VzIHdpdGggVVNCIERBQyBmdW5jdGlvbmFsaXR5IG5lZWQgYSBkZWxheQogCSAqIGFmdGVyIGVhY2ggY2xhc3MgY29tcGxpYW50IHJlcXVlc3QKIAkgKi8KLQlpZiAoKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gMHgxNTRlKSAmJgotCSAgICAocmVxdWVzdHR5cGUgJiBVU0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9DTEFTUykgewotCi0JCXN3aXRjaCAobGUxNl90b19jcHUoZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkpIHsKLQkJY2FzZSAweDEwMDM6IC8qIERlbm9uIERBMzAwLVVTQiAqLwotCQljYXNlIDB4MzAwNTogLyogTWFyYW50eiBIRC1EQUMxICovCi0JCWNhc2UgMHgzMDA2OiAvKiBNYXJhbnR6IFNBLTE0UzEgKi8KLQkJCW1kZWxheSgyMCk7Ci0JCQlicmVhazsKLQkJfQotCX0KKwlpZiAoaXNfbWFyYW50el9kZW5vbl9kYWMoVVNCX0lEKGxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCQkJCWxlMTZfdG9fY3B1KGRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKSkKKwkgICAgJiYgKHJlcXVlc3R0eXBlICYgVVNCX1RZUEVfTUFTSykgPT0gVVNCX1RZUEVfQ0xBU1MpCisJCW1kZWxheSgyMCk7CiAKIAkvKiBab29tIFIxNi8yNCBuZWVkcyBhIHRpbnkgZGVsYXkgaGVyZSwgb3RoZXJ3aXNlIHJlcXVlc3RzIGxpa2UKIAkgKiBnZXQvc2V0IGZyZXF1ZW5jeSByZXR1cm4gYXMgZmFpbGVkIGRlc3BpdGUgYWN0dWFsbHkgc3VjY2VlZGluZy4KQEAgLTEyNjgsMTUgKzEyNzQsOSBAQAogCX0KIAogCS8qIERlbm9uL01hcmFudHogZGV2aWNlcyB3aXRoIFVTQiBEQUMgZnVuY3Rpb25hbGl0eSAqLwotCXN3aXRjaCAoY2hpcC0+dXNiX2lkKSB7Ci0JY2FzZSBVU0JfSUQoMHgxNTRlLCAweDEwMDMpOiAvKiBEZW5vbiBEQTMwMC1VU0IgKi8KLQljYXNlIFVTQl9JRCgweDE1NGUsIDB4MzAwNSk6IC8qIE1hcmFudHogSEQtREFDMSAqLwotCWNhc2UgVVNCX0lEKDB4MTU0ZSwgMHgzMDA2KTogLyogTWFyYW50eiBTQS0xNFMxICovCisJaWYgKGlzX21hcmFudHpfZGVub25fZGFjKGNoaXAtPnVzYl9pZCkpIHsKIAkJaWYgKGZwLT5hbHRzZXR0aW5nID09IDIpCiAJCQlyZXR1cm4gU05EUlZfUENNX0ZNVEJJVF9EU0RfVTMyX0JFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkL0J1aWxkLmluY2x1ZGUgYi90b29scy9idWlsZC9CdWlsZC5pbmNsdWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOGRhYWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9idWlsZC9CdWlsZC5pbmNsdWRlCkBAIC0wLDAgKzEsODEgQEAKKyMjIworIyBidWlsZDogR2VuZXJpYyBkZWZpbml0aW9ucworIworIyAgTG90cyBvZiB0aGlzIGNvZGUgaGF2ZSBiZWVuIGJvcnJvd2VkIG9yIGhlYXZpbHkgaW5zcGlyZWQgZnJvbSBwYXJ0cworIyAgb2Yga2J1aWxkIGNvZGUsIHdoaWNoIGlzIG5vdCBjcmVkaXRlZCwgYnV0IG1vc3RseSBkZXZlbG9wZWQgYnk6CisjCisjICBDb3B5cmlnaHQgKEMpIFNhbSBSYXZuYm9yZyA8c2FtQG1hcnMucmF2bmJvcmcub3JnPiwgMjAxNQorIyAgQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcyA8dG9ydmFsZHNAbGludXgtZm91bmRhdGlvbi5vcmc+LCAyMDE1CisjCisKKyMjIworIyBDb252ZW5pZW50IHZhcmlhYmxlcworY29tbWEgICA6PSAsCitzcXVvdGUgIDo9ICcKKworIyMjCisjIE5hbWUgb2YgdGFyZ2V0IHdpdGggYSAnLicgYXMgZmlsZW5hbWUgcHJlZml4LiBmb28vYmFyLm8gPT4gZm9vLy5iYXIubworZG90LXRhcmdldCA9ICQoZGlyICRAKS4kKG5vdGRpciAkQCkKKworIyMjCisjIGZpbGVuYW1lIG9mIHRhcmdldCB3aXRoIGRpcmVjdG9yeSBhbmQgZXh0ZW5zaW9uIHN0cmlwcGVkCitiYXNldGFyZ2V0ID0gJChiYXNlbmFtZSAkKG5vdGRpciAkQCkpCisKKyMjIworIyBUaGUgdGVtcG9yYXJ5IGZpbGUgdG8gc2F2ZSBnY2MgLU1EIGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMgbXVzdCBub3QKKyMgY29udGFpbiBhIGNvbW1hCitkZXBmaWxlID0gJChzdWJzdCAkKGNvbW1hKSxfLCQoZG90LXRhcmdldCkuZCkKKworIyMjCisjIENoZWNrIGlmIGJvdGggYXJndW1lbnRzIGhhcyBzYW1lIGFyZ3VtZW50cy4gUmVzdWx0IGlzIGVtcHR5IHN0cmluZyBpZiBlcXVhbC4KK2FyZy1jaGVjayA9ICQoc3RyaXAgJChmaWx0ZXItb3V0ICQoY21kXyQoMSkpLCAkKGNtZF8kQCkpIFwKKyAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXItb3V0ICQoY21kXyRAKSwgICAkKGNtZF8kKDEpKSkgKQorCisjIyMKKyMgRXNjYXBlIHNpbmdsZSBxdW90ZSBmb3IgdXNlIGluIGVjaG8gc3RhdGVtZW50cworZXNjc3EgPSAkKHN1YnN0ICQoc3F1b3RlKSwnXCQoc3F1b3RlKScsJDEpCisKKyMgRWNobyBjb21tYW5kCisjIFNob3J0IHZlcnNpb24gaXMgdXNlZCwgaWYgJChxdWlldCkgZXF1YWxzIGBxdWlldF8nLCBvdGhlcndpc2UgZnVsbCBvbmUuCitlY2hvLWNtZCA9ICQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSxcCisgICAgICAgICAgIGVjaG8gJyAgJChjYWxsIGVzY3NxLCQoJChxdWlldCljbWRfJCgxKSkpJzspCisKKyMjIworIyBSZXBsYWNlID4kPCB3aXRoID4kJDwgdG8gcHJlc2VydmUgJCB3aGVuIHJlbG9hZGluZyB0aGUgLmNtZCBmaWxlCisjIChuZWVkZWQgZm9yIG1ha2UpCisjIFJlcGxhY2UgPiM8IHdpdGggPlwjPCB0byBhdm9pZCBzdGFydGluZyBhIGNvbW1lbnQgaW4gdGhlIC5jbWQgZmlsZQorIyAobmVlZGVkIGZvciBtYWtlKQorIyBSZXBsYWNlID4nPCB3aXRoID4nXCcnPCB0byBiZSBhYmxlIHRvIGVuY2xvc2UgdGhlIHdob2xlIHN0cmluZyBpbiAnLi4uJworIyAobmVlZGVkIGZvciB0aGUgc2hlbGwpCittYWtlLWNtZCA9ICQoY2FsbCBlc2NzcSwkKHN1YnN0IFwjLFxcXCMsJChzdWJzdCAkJCwkJCQkLCQoY21kXyQoMSkpKSkpCisKKyMjIworIyBGaW5kIGFueSBwcmVyZXF1aXNpdGVzIHRoYXQgaXMgbmV3ZXIgdGhhbiB0YXJnZXQgb3IgdGhhdCBkb2VzIG5vdCBleGlzdC4KKyMgUEhPTlkgdGFyZ2V0cyBza2lwcGVkIGluIGJvdGggY2FzZXMuCithbnktcHJlcmVxID0gJChmaWx0ZXItb3V0ICQoUEhPTlkpLCQ/KSAkKGZpbHRlci1vdXQgJChQSE9OWSkgJCh3aWxkY2FyZCAkXiksJF4pCisKKyMjIworIyBpZl9jaGFuZ2VkX2RlcCAgLSBleGVjdXRlIGNvbW1hbmQgaWYgYW55IHByZXJlcXVpc2l0ZSBpcyBuZXdlciB0aGFuCisjICAgICAgICAgICAgICAgICAgIHRhcmdldCwgb3IgY29tbWFuZCBsaW5lIGhhcyBjaGFuZ2VkIGFuZCB1cGRhdGUKKyMgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzIGluIHRoZSBjbWQgZmlsZQoraWZfY2hhbmdlZF9kZXAgPSAkKGlmICQoc3RyaXAgJChhbnktcHJlcmVxKSAkKGFyZy1jaGVjaykpLCAgICAgICAgIFwKKwlAc2V0IC1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkkKGVjaG8tY21kKSAkKGNtZF8kKDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwljYXQgJChkZXBmaWxlKSA+ICQoZG90LXRhcmdldCkuY21kOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlwcmludGYgJyVzXG4nICdjbWRfJEAgOj0gJChtYWtlLWNtZCknID4+ICQoZG90LXRhcmdldCkuY21kKQorCisjIGlmX2NoYW5nZWQgICAgICAtIGV4ZWN1dGUgY29tbWFuZCBpZiBhbnkgcHJlcmVxdWlzaXRlIGlzIG5ld2VyIHRoYW4KKyMgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCBvciBjb21tYW5kIGxpbmUgaGFzIGNoYW5nZWQKK2lmX2NoYW5nZWQgPSAkKGlmICQoc3RyaXAgJChhbnktcHJlcmVxKSAkKGFyZy1jaGVjaykpLCAgICAgICAgICAgICBcCisJQHNldCAtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJJChlY2hvLWNtZCkgJChjbWRfJCgxKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcHJpbnRmICclc1xuJyAnY21kXyRAIDo9ICQobWFrZS1jbWQpJyA+ICQoZG90LXRhcmdldCkuY21kKQorCisjIyMKKyMgQyBmbGFncyB0byBiZSB1c2VkIGluIHJ1bGUgZGVmaW5pdGlvbnMsIGluY2x1ZGVzOgorIyAtIGRlcGZpbGUgZ2VuZXJhdGlvbgorIyAtIGdsb2JhbCAkKENGTEFHUykKKyMgLSBwZXIgdGFyZ2V0IEMgZmxhZ3MKKyMgLSBwZXIgb2JqZWN0IEMgZmxhZ3MKKyMgLSBCVUlMRF9TVFIgbWFjcm8gdG8gYWxsb3cgJy1EIiQodmFyaWFibGUpIicgY29uc3RydWN0cworY19mbGFncyA9IC1XcCwtTUQsJChkZXBmaWxlKSwtTVQsJEAgJChDRkxBR1MpIC1EIkJVSUxEX1NUUihzKT1cI3MiICQoQ0ZMQUdTXyQoYmFzZXRhcmdldCkubykgJChDRkxBR1NfJChvYmopKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQvRG9jdW1lbnRhdGlvbi9CdWlsZC50eHQgYi90b29scy9idWlsZC9Eb2N1bWVudGF0aW9uL0J1aWxkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGFkMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYnVpbGQvRG9jdW1lbnRhdGlvbi9CdWlsZC50eHQKQEAgLTAsMCArMSwxMzkgQEAKK0J1aWxkIEZyYW1ld29yaworPT09PT09PT09PT09PT09CisKK1RoZSBwZXJmIGJ1aWxkIGZyYW1ld29yayB3YXMgYWRvcHRlZCBmcm9tIHRoZSBrZXJuZWwgYnVpbGQgc3lzdGVtLCBoZW5jZSB0aGUKK2lkZWEgYW5kIHRoZSB3YXkgaG93IG9iamVjdHMgYXJlIGJ1aWx0IGlzIHRoZSBzYW1lLgorCitCYXNpY2FsbHkgdGhlIHVzZXIgcHJvdmlkZXMgc2V0IG9mICdCdWlsZCcgZmlsZXMgdGhhdCBsaXN0IG9iamVjdHMgYW5kCitkaXJlY3RvcmllcyB0byBuZXN0IGZvciBzcGVjaWZpYyB0YXJnZXQgdG8gYmUgYnVpbGQuCisKK1VubGlrZSB0aGUga2VybmVsIHdlIGRvbid0IGhhdmUgYSBzaW5nbGUgYnVpbGQgb2JqZWN0ICdvYmoteScgbGlzdCB0aGF0IHdoZXJlCit3ZSBzZXR1cCBzb3VyY2Ugb2JqZWN0cywgYnV0IHdlIHN1cHBvcnQgbW9yZS4gVGhpcyBhbGxvd3Mgb25lICdCdWlsZCcgZmlsZSB0bworY2FycnkgYSBzb3VyY2VzIGxpc3QgZm9yIG11bHRpcGxlIGJ1aWxkIG9iamVjdHMuCisKK2EpIEJ1aWxkIGZyYW1ld29yayBtYWtlZmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGJ1aWxkIGZyYW1ld29yayBjb25zaXN0cyBvZiAyIE1ha2VmaWxlczoKKworICBCdWlsZC5pbmNsdWRlCisgIE1ha2VmaWxlLmJ1aWxkCisKK1doaWxlIHRoZSAnQnVpbGQuaW5jbHVkZScgZmlsZSBjb250YWlucyBqdXN0IHNvbWUgZ2VuZXJpYyBkZWZpbml0aW9ucywgdGhlCisnTWFrZWZpbGUuYnVpbGQnIGZpbGUgaXMgdGhlIG1ha2VmaWxlIHVzZWQgZnJvbSB0aGUgb3V0c2lkZS4gSXQncworaW50ZXJmYWNlL3VzYWdlIGlzIGZvbGxvd2luZzoKKworICAkIG1ha2UgLWYgdG9vbHMvYnVpbGQvTWFrZWZpbGUgc3JjdHJlZT0kKEtTUkMpIGRpcj0kKERJUikgb2JqPSQoT0JKRUNUKQorCit3aGVyZToKKworICBLU1JDICAgLSBpcyB0aGUgcGF0aCB0byBrZXJuZWwgc291cmNlcworICBESVIgICAgLSBpcyB0aGUgcGF0aCB0byB0aGUgcHJvamVjdCB0byBiZSBidWlsdAorICBPQkpFQ1QgLSBpcyB0aGUgbmFtZSBvZiB0aGUgYnVpbGQgb2JqZWN0CisKK1doZW4gc3VjY2VmdWxseSBmaW5pc2hlZCB0aGUgJChESVIpIGRpcmVjdG9yeSBjb250YWlucyB0aGUgZmluYWwgb2JqZWN0IGZpbGUKK2NhbGxlZCAkKE9CSkVDVCktaW4ubzoKKworICAkIGxzICQoRElSKS8kKE9CSkVDVCktaW4ubworCit3aGljaCBpbmNsdWRlcyBhbGwgY29tcGlsZWQgc291cmNlcyBkZXNjcmliZWQgaW4gJ0J1aWxkJyBtYWtlZmlsZXMuCisKK2EpIEJ1aWxkIG1ha2VmaWxlcworLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB1c2VyIHN1cHBsaWVzICdCdWlsZCcgbWFrZWZpbGVzIHRoYXQgY29udGFpbnMgYSBvYmplY3RzIGxpc3QsIGFuZCBjb25uZWN0cwordGhlIGJ1aWxkIHRvIG5lc3RlZCBkaXJlY3Rvcmllcy4KKworQXNzdW1lIHdlIGhhdmUgdGhlIGZvbGxvd2luZyBwcm9qZWN0IHN0cnVjdHVyZToKKworICBleC9hLmMKKyAgICAvYi5jCisgICAgL2MuYworICAgIC9kLmMKKyAgICAvYXJjaC9lLmMKKyAgICAvYXJjaC9mLmMKKworT3V0IG9mIHdoaWNoIHlvdSBidWlsZCB0aGUgJ2V4JyBiaW5hcnkgJyBhbmQgdGhlICdsaWJleC5hJyBsaWJyYXJ5OgorCisgICdleCcgICAgICAtIGNvbnNpc3RzIG9mICdhLm8nLCAnYi5vJyBhbmQgbGliZXguYQorICAnbGliZXguYScgLSBjb25zaXN0cyBvZiAnYy5vJywgJ2QubycsICdlLm8nIGFuZCAnZi5vJworCitUaGUgYnVpbGQgZnJhbWV3b3JrIGRvZXMgbm90IGNyZWF0ZSB0aGUgJ2V4JyBhbmQgJ2xpYmV4LmEnIGJpbmFyaWVzIGZvciB5b3UsIGl0Citvbmx5IHByZXBhcmVzIHByb3BlciBvYmplY3RzIHRvIGJlIGNvbXBpbGVkIGFuZCBncm91cGVkIHRvZ2V0aGVyLgorCitUbyBmb2xsb3cgdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSB1c2VyIHByb3ZpZGVzIGZvbGxvd2luZyAnQnVpbGQnIGZpbGVzOgorCisgIGV4L0J1aWxkOgorICAgIGV4LXkgKz0gYS5vCisgICAgZXgteSArPSBiLm8KKworICAgIGxpYmV4LXkgKz0gYy5vCisgICAgbGliZXgteSArPSBkLm8KKyAgICBsaWJleC15ICs9IGFyY2gvCisKKyAgZXgvYXJjaC9CdWlsZDoKKyAgICBsaWJleC15ICs9IGUubworICAgIGxpYmV4LXkgKz0gZi5vCisKK2FuZCBydW5zOgorCisgICQgbWFrZSAtZiB0b29scy9idWlsZC9NYWtlZmlsZS5idWlsZCBkaXI9LiBvYmo9ZXgKKyAgJCBtYWtlIC1mIHRvb2xzL2J1aWxkL01ha2VmaWxlLmJ1aWxkIGRpcj0uIG9iaj1saWJleAorCit3aGljaCBjcmVhdGVzIHRoZSBmb2xsb3dpbmcgb2JqZWN0czoKKworICBleC9leC1pbi5vCisgIGV4L2xpYmV4LWluLm8KKwordGhhdCBjb250YWluIHJlcXVlc3Qgb2JqZWN0cyBuYW1lcyBpbiBCdWlsZCBmaWxlcy4KKworSXQncyBvbmx5IGEgbWF0dGVyIG9mIDIgc2luZ2xlIGNvbW1hbmRzIHRvIGNyZWF0ZSB0aGUgZmluYWwgYmluYXJpZXM6CisKKyAgJCBhciAgcmNzIGxpYmV4LmEgbGliZXgtaW4ubworICAkIGdjYyAtbyBleCBleC1pbi5vIGxpYmV4LmEKKworWW91IGNhbiBjaGVjayB0aGUgJ2V4JyBleGFtcGxlIGluICd0b29scy9idWlsZC90ZXN0cy9leCcgZm9yIG1vcmUgZGV0YWlscy4KKworYikgUnVsZXMKKy0tLS0tLS0tCisKK1RoZSBidWlsZCBmcmFtZXdvcmsgcHJvdmlkZXMgc3RhbmRhcmQgY29tcGlsYXRpb24gcnVsZXMgdG8gaGFuZGxlIC5TIGFuZCAuYworY29tcGlsYXRpb24uCisKK0l0J3MgcG9zc2libGUgdG8gaW5jbHVkZSBzcGVjaWFsIHJ1bGUgaWYgbmVlZGVkIChsaWtlIHdlIGRvIGZvciBmbGV4IG9yIGJpc29uCitjb2RlIGdlbmVyYXRpb24pLgorCitjKSBDRkxBR1MKKy0tLS0tLS0tLQorCitJdCdzIHBvc3NpYmxlIHRvIGFsdGVyIHRoZSBzdGFuZGFyZCBvYmplY3QgQyBmbGFncyBpbiB0aGUgZm9sbG93aW5nIHdheToKKworICBDRkxBR1NfcGVyZi5vICs9ICcuLi4nIC0gYWx0ZXJzIENGTEFHUyBmb3IgcGVyZi5vIG9iamVjdAorICBDRkxBR1NfZ3RrICs9ICcuLi4nICAgIC0gYWx0ZXJzIENGTEFHUyBmb3IgZ3RrIGJ1aWxkIG9iamVjdAorCitUaGlzIEMgZmxhZ3MgY2hhbmdlcyBoYXMgdGhlIHNjb3BlIG9mIHRoZSBCdWlsZCBtYWtlZmlsZSB0aGV5IGFyZSBkZWZpbmVkIGluLgorCisKK2QpIERlcGVuZGVuY2llcworLS0tLS0tLS0tLS0tLS0tCisKK0ZvciBlYWNoIGJ1aWx0IG9iamVjdCBmaWxlICdhLm8nIHRoZSAnLmEuY21kJyBpcyBjcmVhdGVkIGFuZCBob2xkczoKKworICAtIENvbW1hbmQgbGluZSB1c2VkIHRvIGJ1aWx0IHRoYXQgb2JqZWN0CisgICAgKGZvciBlYWNoIG9iamVjdCkKKworICAtIERlcGVuZGVuY3kgcnVsZXMgZ2VuZXJhdGVkIGJ5ICdnY2MgLVdwLC1NRCwuLi4nCisgICAgKGZvciBjb21waWxlZCBvYmplY3QpCisKK0FsbCBleGlzdGluZyAnLmNtZCcgZmlsZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBCdWlsZCBwcm9jZXNzIHRvIGZvbGxvdyBwcm9wZXJseQordGhlIGRlcGVuZGVuY2llcyBhbmQgdHJpZ2dlciBhIHJlYnVpbGQgd2hlbiBuZWNlc3NhcnkuCisKKworZSkgU2luZ2xlIHJ1bGVzCistLS0tLS0tLS0tLS0tLS0KKworSXQncyBwb3NzaWJsZSB0byBidWlsZCBzaW5nbGUgb2JqZWN0IGZpbGUgYnkgY2hvaWNlLCBsaWtlOgorCisgICQgbWFrZSB1dGlsL21hcC5vICAgICMgb2JqZWN0cworICAkIG1ha2UgdXRpbC9tYXAuaSAgICAjIHByZXByb2Nlc3NvcgorICAkIG1ha2UgdXRpbC9tYXAucyAgICAjIGFzc2VtYmx5CmRpZmYgLS1naXQgYS90b29scy9idWlsZC9NYWtlZmlsZS5idWlsZCBiL3Rvb2xzL2J1aWxkL01ha2VmaWxlLmJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZGY1NzIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9idWlsZC9NYWtlZmlsZS5idWlsZApAQCAtMCwwICsxLDEzMCBAQAorIyMjCisjIE1haW4gYnVpbGQgbWFrZWZpbGUuCisjCisjICBMb3RzIG9mIHRoaXMgY29kZSBoYXZlIGJlZW4gYm9ycm93ZWQgb3IgaGVhdmlseSBpbnNwaXJlZCBmcm9tIHBhcnRzCisjICBvZiBrYnVpbGQgY29kZSwgd2hpY2ggaXMgbm90IGNyZWRpdGVkLCBidXQgbW9zdGx5IGRldmVsb3BlZCBieToKKyMKKyMgIENvcHlyaWdodCAoQykgU2FtIFJhdm5ib3JnIDxzYW1AbWFycy5yYXZuYm9yZy5vcmc+LCAyMDE1CisjICBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzIDx0b3J2YWxkc0BsaW51eC1mb3VuZGF0aW9uLm9yZz4sIDIwMTUKKyMKKworUEhPTlkgOj0gX19idWlsZAorX19idWlsZDoKKworaWZlcSAoJChWKSwxKQorICBxdWlldCA9CisgIFEgPQorZWxzZQorICBxdWlldD1xdWlldF8KKyAgUT1ACitlbmRpZgorCitidWlsZC1kaXIgOj0gJChzcmN0cmVlKS90b29scy9idWlsZAorCisjIEdlbmVyaWMgZGVmaW5pdGlvbnMKK2luY2x1ZGUgJChidWlsZC1kaXIpL0J1aWxkLmluY2x1ZGUKKworIyBkbyBub3QgZm9yY2UgZGV0ZWN0ZWQgY29uZmlndXJhdGlvbgorLWluY2x1ZGUgLmNvbmZpZy1kZXRlY3RlZAorCisjIEluaXQgYWxsIHJlbGV2YW50IHZhcmlhYmxlcyB1c2VkIGluIGJ1aWxkIGZpbGVzIHNvCisjIDEpIHRoZXkgaGF2ZSBjb3JyZWN0IHR5cGUKKyMgMikgdGhleSBkbyBub3QgaW5oZXJpdCBhbnkgdmFsdWUgZnJvbSB0aGUgZW52aXJvbm1lbnQKK3N1YmRpci15ICAgICA6PQorb2JqLXkgICAgICAgIDo9CitzdWJkaXIteSAgICAgOj0KK3N1YmRpci1vYmoteSA6PQorCisjIEJ1aWxkIGRlZmluaXRpb25zCitidWlsZC1maWxlIDo9ICQoZGlyKS9CdWlsZAoraW5jbHVkZSAkKGJ1aWxkLWZpbGUpCisKK3F1aWV0X2NtZF9mbGV4ICA9IEZMRVggICAgICRACitxdWlldF9jbWRfYmlzb24gPSBCSVNPTiAgICAkQAorCisjIENyZWF0ZSBkaXJlY3RvcnkgdW5sZXNzIGl0IGV4aXN0cworcXVpZXRfY21kX21rZGlyID0gTUtESVIgICAgJChkaXIgJEApCisgICAgICBjbWRfbWtkaXIgPSBta2RpciAtcCAkKGRpciAkQCkKKyAgICAgcnVsZV9ta2RpciA9ICQoaWYgJCh3aWxkY2FyZCAkKGRpciAkQCkpLCxAJChjYWxsIGVjaG8tY21kLG1rZGlyKSAkKGNtZF9ta2RpcikpCisKKyMgQ29tcGlsZSBjb21tYW5kCitxdWlldF9jbWRfY2Nfb19jID0gQ0MgICAgICAgJEAKKyAgICAgIGNtZF9jY19vX2MgPSAkKENDKSAkKGNfZmxhZ3MpIC1jIC1vICRAICQ8CisKK3F1aWV0X2NtZF9jY19pX2MgPSBDUFAgICAgICAkQAorICAgICAgY21kX2NjX2lfYyA9ICQoQ0MpICQoY19mbGFncykgLUUgLW8gJEAgJDwKKworcXVpZXRfY21kX2NjX3NfYyA9IEFTICAgICAgICRACisgICAgICBjbWRfY2Nfc19jID0gJChDQykgJChjX2ZsYWdzKSAtUyAtbyAkQCAkPAorCisjIExpbmsgYWdyZWdhdGUgY29tbWFuZAorIyBJZiB0aGVyZSdzIG5vdGhpbmcgdG8gbGluaywgY3JlYXRlIGVtcHR5ICRAIG9iamVjdC4KK3F1aWV0X2NtZF9sZF9tdWx0aSA9IExEICAgICAgICRACisgICAgICBjbWRfbGRfbXVsdGkgPSAkKGlmICQoc3RyaXAgJChvYmoteSkpLFwKKwkJICAgICAgICQoTEQpIC1yIC1vICRAICQob2JqLXkpLHJtIC1mICRAOyAkKEFSKSByY3MgJEApCisKKyMgQnVpbGQgcnVsZXMKKyQoT1VUUFVUKSUubzogJS5jIEZPUkNFCisJJChjYWxsIHJ1bGVfbWtkaXIpCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNjX29fYykKKworJChPVVRQVVQpJS5vOiAlLlMgRk9SQ0UKKwkkKGNhbGwgcnVsZV9ta2RpcikKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfb19jKQorCiskKE9VVFBVVCklLmk6ICUuYyBGT1JDRQorCSQoY2FsbCBydWxlX21rZGlyKQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19pX2MpCisKKyQoT1VUUFVUKSUuaTogJS5TIEZPUkNFCisJJChjYWxsIHJ1bGVfbWtkaXIpCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNjX2lfYykKKworJChPVVRQVVQpJS5zOiAlLmMgRk9SQ0UKKwkkKGNhbGwgcnVsZV9ta2RpcikKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfc19jKQorCisjIEdhdGhlciBidWlsZCBkYXRhOgorIyAgIG9iai15ICAgICAgICAtIGxpc3Qgb2YgYnVpbGQgb2JqZWN0cworIyAgIHN1YmRpci15ICAgICAtIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gbmVzdAorIyAgIHN1YmRpci1vYmoteSAtIGxpc3Qgb2YgZGlyZWN0b3JpZXMgb2JqZWN0cyAnZGlyLyQob2JqKS1pbi5vJworb2JqLXkgICAgICAgIDo9ICQoJChvYmopLXkpCitzdWJkaXIteSAgICAgOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai15KSkpCitvYmoteSAgICAgICAgOj0gJChwYXRzdWJzdCAlLywgJS8kKG9iaiktaW4ubywgJChvYmoteSkpCitzdWJkaXItb2JqLXkgOj0gJChmaWx0ZXIgJS8kKG9iaiktaW4ubywgJChvYmoteSkpCisKKyMgJyQoT1VUUFVUKS9kaXInIHByZWZpeCB0byBhbGwgb2JqZWN0cworcHJlZml4ICAgICAgIDo9ICQoc3Vic3QgLi8sLCQoT1VUUFVUKSQoZGlyKS8pCitvYmoteSAgICAgICAgOj0gJChhZGRwcmVmaXggJChwcmVmaXgpLCQob2JqLXkpKQorc3ViZGlyLW9iai15IDo9ICQoYWRkcHJlZml4ICQocHJlZml4KSwkKHN1YmRpci1vYmoteSkpCisKKyMgRmluYWwgJyQob2JqKS1pbi5vJyBvYmplY3QKK2luLXRhcmdldCA6PSAkKHByZWZpeCkkKG9iaiktaW4ubworCitQSE9OWSArPSAkKHN1YmRpci15KQorCiskKHN1YmRpci15KToKKwkkKFEpJChNQUtFKSAtZiAkKGJ1aWxkLWRpcikvTWFrZWZpbGUuYnVpbGQgZGlyPSQoZGlyKS8kQCBvYmo9JChvYmopCisKKyQoc29ydCAkKHN1YmRpci1vYmoteSkpOiAkKHN1YmRpci15KSA7CisKKyQoaW4tdGFyZ2V0KTogJChvYmoteSkgRk9SQ0UKKwkkKGNhbGwgcnVsZV9ta2RpcikKKwkkKGNhbGwgaWZfY2hhbmdlZCxsZF9tdWx0aSkKKworX19idWlsZDogJChpbi10YXJnZXQpCisJQDoKKworUEhPTlkgKz0gRk9SQ0UKK0ZPUkNFOgorCisjIEluY2x1ZGUgYWxsIGNtZCBmaWxlcyB0byBnZXQgYWxsIHRoZSBkZXBlbmRlbmN5IHJ1bGVzCisjIGZvciBhbGwgb2JqZWN0cyBpbmNsdWRlZAordGFyZ2V0cyAgIDo9ICQod2lsZGNhcmQgJChzb3J0ICQob2JqLXkpICQoaW4tdGFyZ2V0KSAkKE1BS0VDTURHT0FMUykpKQorY21kX2ZpbGVzIDo9ICQod2lsZGNhcmQgJChmb3JlYWNoIGYsJCh0YXJnZXRzKSwkKGRpciAkKGYpKS4kKG5vdGRpciAkKGYpKS5jbWQpKQorCitpZm5lcSAoJChjbWRfZmlsZXMpLCkKKyAgaW5jbHVkZSAkKGNtZF9maWxlcykKK2VuZGlmCisKKy5QSE9OWTogJChQSE9OWSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkL01ha2VmaWxlLmZlYXR1cmUgYi90b29scy9idWlsZC9NYWtlZmlsZS5mZWF0dXJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMGIwY2EKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9idWlsZC9NYWtlZmlsZS5mZWF0dXJlCkBAIC0wLDAgKzEsMTcxIEBACitmZWF0dXJlX2RpciA6PSAkKHNyY3RyZWUpL3Rvb2xzL2J1aWxkL2ZlYXR1cmUKKworaWZuZXEgKCQoT1VUUFVUKSwpCisgIE9VVFBVVF9GRUFUVVJFUyA9ICQoT1VUUFVUKWZlYXR1cmUvCisgICQoc2hlbGwgbWtkaXIgLXAgJChPVVRQVVRfRkVBVFVSRVMpKQorZW5kaWYKKworZmVhdHVyZV9jaGVjayA9ICQoZXZhbCAkKGZlYXR1cmVfY2hlY2tfY29kZSkpCitkZWZpbmUgZmVhdHVyZV9jaGVja19jb2RlCisgIGZlYXR1cmUtJCgxKSA6PSAkKHNoZWxsICQoTUFLRSkgT1VUUFVUPSQoT1VUUFVUX0ZFQVRVUkVTKSBDRkxBR1M9IiQoRVhUUkFfQ0ZMQUdTKSAkKEZFQVRVUkVfQ0hFQ0tfQ0ZMQUdTLSQoMSkpIiBMREZMQUdTPSIkKExERkxBR1MpICQoRkVBVFVSRV9DSEVDS19MREZMQUdTLSQoMSkpIiAtQyAkKGZlYXR1cmVfZGlyKSB0ZXN0LSQxLmJpbiA+L2Rldi9udWxsIDI+L2Rldi9udWxsICYmIGVjaG8gMSB8fCBlY2hvIDApCitlbmRlZgorCitmZWF0dXJlX3NldCA9ICQoZXZhbCAkKGZlYXR1cmVfc2V0X2NvZGUpKQorZGVmaW5lIGZlYXR1cmVfc2V0X2NvZGUKKyAgZmVhdHVyZS0kKDEpIDo9IDEKK2VuZGVmCisKKyMKKyMgQnVpbGQgdGhlIGZlYXR1cmUgY2hlY2sgYmluYXJpZXMgaW4gcGFyYWxsZWwsIGlnbm9yZSBlcnJvcnMsIGlnbm9yZSByZXR1cm4gdmFsdWUgYW5kIHN1cHByZXNzIG91dHB1dDoKKyMKKworIworIyBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYSBjb21wbGV0ZSBsaXN0IG9mIGFsbCBmZWF0dXJlIHRlc3RzLCBqdXN0CisjIHRob3NlIHRoYXQgYXJlIHR5cGljYWxseSBidWlsdCBvbiBhIGZ1bGx5IGNvbmZpZ3VyZWQgc3lzdGVtLgorIworIyBbIEZlYXR1cmUgdGVzdHMgbm90IG1lbnRpb25lZCBoZXJlIGhhdmUgdG8gYmUgYnVpbHQgZXhwbGljaXRseSBpbgorIyAgIHRoZSBydWxlIHRoYXQgdXNlcyB0aGVtIC0gYW4gZXhhbXBsZSBmb3IgdGhhdCBpcyB0aGUgJ2Jpb25pYycKKyMgICBmZWF0dXJlIGNoZWNrLiBdCisjCitGRUFUVVJFX1RFU1RTID0JCQlcCisJYmFja3RyYWNlCQkJXAorCWR3YXJmCQkJCVwKKwlmb3J0aWZ5LXNvdXJjZQkJCVwKKwlzeW5jLWNvbXBhcmUtYW5kLXN3YXAJCVwKKwlnbGliYwkJCQlcCisJZ3RrMgkJCQlcCisJZ3RrMi1pbmZvYmFyCQkJXAorCWxpYmF1ZGl0CQkJXAorCWxpYmJmZAkJCQlcCisJbGliZWxmCQkJCVwKKwlsaWJlbGYtZ2V0cGhkcm51bQkJXAorCWxpYmVsZi1tbWFwCQkJXAorCWxpYm51bWEJCQkJXAorCWxpYnBlcmwJCQkJXAorCWxpYnB5dGhvbgkJCVwKKwlsaWJweXRob24tdmVyc2lvbgkJXAorCWxpYnNsYW5nCQkJXAorCWxpYnVud2luZAkJCVwKKwlwdGhyZWFkLWF0dHItc2V0YWZmaW5pdHktbnAJXAorCXN0YWNrcHJvdGVjdG9yLWFsbAkJXAorCXRpbWVyZmQJCQkJXAorCWxpYmR3LWR3YXJmLXVud2luZAkJXAorCXpsaWIJCQkJXAorCWx6bWEKKworRkVBVFVSRV9ESVNQTEFZID0JCQlcCisJZHdhcmYJCQkJXAorCWdsaWJjCQkJCVwKKwlndGsyCQkJCVwKKwlsaWJhdWRpdAkJCVwKKwlsaWJiZmQJCQkJXAorCWxpYmVsZgkJCQlcCisJbGlibnVtYQkJCQlcCisJbGlicGVybAkJCQlcCisJbGlicHl0aG9uCQkJXAorCWxpYnNsYW5nCQkJXAorCWxpYnVud2luZAkJCVwKKwlsaWJkdy1kd2FyZi11bndpbmQJCVwKKwl6bGliCQkJCVwKKwlsem1hCisKKyMgU2V0IEZFQVRVUkVfQ0hFQ0tfKEN8TEQpRkxBR1MtYWxsIGZvciBhbGwgRkVBVFVSRV9URVNUUyBmZWF0dXJlcy4KKyMgSWYgaW4gdGhlIGZ1dHVyZSB3ZSBuZWVkIHBlci1mZWF0dXJlIGNoZWNrcy9mbGFncyBmb3IgZmVhdHVyZXMgbm90CisjIG1lbnRpb25lZCBpbiB0aGlzIGxpc3Qgd2UgbmVlZCB0byByZWZhY3RvciB0aGlzIDstKS4KK3NldF90ZXN0X2FsbF9mbGFncyA9ICQoZXZhbCAkKHNldF90ZXN0X2FsbF9mbGFnc19jb2RlKSkKK2RlZmluZSBzZXRfdGVzdF9hbGxfZmxhZ3NfY29kZQorICBGRUFUVVJFX0NIRUNLX0NGTEFHUy1hbGwgICs9ICQoRkVBVFVSRV9DSEVDS19DRkxBR1MtJCgxKSkKKyAgRkVBVFVSRV9DSEVDS19MREZMQUdTLWFsbCArPSAkKEZFQVRVUkVfQ0hFQ0tfTERGTEFHUy0kKDEpKQorZW5kZWYKKworJChmb3JlYWNoIGZlYXQsJChGRUFUVVJFX1RFU1RTKSwkKGNhbGwgc2V0X3Rlc3RfYWxsX2ZsYWdzLCQoZmVhdCkpKQorCisjCisjIFNwZWNpYWwgZmFzdC1wYXRoIGZvciB0aGUgJ2FsbCBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlJyBjYXNlOgorIworJChjYWxsIGZlYXR1cmVfY2hlY2ssYWxsLCQoTVNHKSkKKworIworIyBKdXN0IGluIGNhc2UgdGhlIGJ1aWxkIGZyZXNobHkgZmFpbGVkLCBtYWtlIHN1cmUgd2UgcHJpbnQgdGhlCisjIGZlYXR1cmUgbWF0cml4OgorIworaWZlcSAoJChmZWF0dXJlLWFsbCksIDEpCisgICMKKyAgIyB0ZXN0LWFsbC5jIHBhc3NlZCAtIGp1c3Qgc2V0IGFsbCB0aGUgY29yZSBmZWF0dXJlIGZsYWdzIHRvIDE6CisgICMKKyAgJChmb3JlYWNoIGZlYXQsJChGRUFUVVJFX1RFU1RTKSwkKGNhbGwgZmVhdHVyZV9zZXQsJChmZWF0KSkpCitlbHNlCisgICQoc2hlbGwgJChNQUtFKSBPVVRQVVQ9JChPVVRQVVRfRkVBVFVSRVMpIENGTEFHUz0iJChFWFRSQV9DRkxBR1MpIiBMREZMQUdTPSQoTERGTEFHUykgLWkgLWogLUMgJChmZWF0dXJlX2RpcikgJChhZGRzdWZmaXggLmJpbiwkKEZFQVRVUkVfVEVTVFMpKSA+L2Rldi9udWxsIDI+JjEpCisgICQoZm9yZWFjaCBmZWF0LCQoRkVBVFVSRV9URVNUUyksJChjYWxsIGZlYXR1cmVfY2hlY2ssJChmZWF0KSkpCitlbmRpZgorCisjCisjIFByaW50IHRoZSByZXN1bHQgb2YgdGhlIGZlYXR1cmUgdGVzdDoKKyMKK2ZlYXR1cmVfcHJpbnRfc3RhdHVzID0gJChldmFsICQoZmVhdHVyZV9wcmludF9zdGF0dXNfY29kZSkpICQoaW5mbyAkKE1TRykpCisKK2RlZmluZSBmZWF0dXJlX3ByaW50X3N0YXR1c19jb2RlCisgIGlmZXEgKCQoZmVhdHVyZS0kKDEpKSwgMSkKKyAgICBNU0cgPSAkKHNoZWxsIHByaW50ZiAnLi4uJTMwczogWyBcMDMzWzMybW9uXDAzM1ttICBdJyAkKDEpKQorICBlbHNlCisgICAgTVNHID0gJChzaGVsbCBwcmludGYgJy4uLiUzMHM6IFsgXDAzM1szMW1PRkZcMDMzW20gXScgJCgxKSkKKyAgZW5kaWYKK2VuZGVmCisKK2ZlYXR1cmVfcHJpbnRfdGV4dCA9ICQoZXZhbCAkKGZlYXR1cmVfcHJpbnRfdGV4dF9jb2RlKSkgJChpbmZvICQoTVNHKSkKK2RlZmluZSBmZWF0dXJlX3ByaW50X3RleHRfY29kZQorICAgIE1TRyA9ICQoc2hlbGwgcHJpbnRmICcuLi4lMzBzOiAlcycgJCgxKSAkKDIpKQorZW5kZWYKKworRkVBVFVSRV9EVU1QIDo9ICQoZm9yZWFjaCBmZWF0LCQoRkVBVFVSRV9ESVNQTEFZKSxmZWF0dXJlLSQoZmVhdCkoJChmZWF0dXJlLSQoZmVhdCkpKSkKK0ZFQVRVUkVfRFVNUF9GSUxFIDo9ICQoc2hlbGwgdG91Y2ggJChPVVRQVVQpRkVBVFVSRS1EVU1QOyBjYXQgJChPVVRQVVQpRkVBVFVSRS1EVU1QKQorCitpZmVxICgkKGR3YXJmLXBvc3QtdW53aW5kKSwxKQorICBGRUFUVVJFX0RVTVAgKz0gZHdhcmYtcG9zdC11bndpbmQoJChkd2FyZi1wb3N0LXVud2luZC10ZXh0KSkKK2VuZGlmCisKKyMgVGhlICQoZmVhdHVyZV9kaXNwbGF5KSBjb250cm9scyB0aGUgZGVmYXVsdCBkZXRlY3Rpb24gbWVzc2FnZQorIyBvdXRwdXQuIEl0J3Mgc2V0IGlmOgorIyAtIGRldGVjdGVkIGZlYXR1cmVzIGRpZmZlcmVzIGZyb20gc3RvcmVkIGZlYXR1cmVzIGZyb20KKyMgICBsYXN0IGJ1aWxkIChpbiBGRUFUVVJFLURVTVAgZmlsZSkKKyMgLSBvbmUgb2YgdGhlICQoRkVBVFVSRV9ESVNQTEFZKSBpcyBub3QgZGV0ZWN0ZWQKKyMgLSBWRiBpcyBlbmFibGVkCisKK2lmbmVxICgiJChGRUFUVVJFX0RVTVApIiwiJChGRUFUVVJFX0RVTVBfRklMRSkiKQorICAkKHNoZWxsIGVjaG8gIiQoRkVBVFVSRV9EVU1QKSIgPiAkKE9VVFBVVClGRUFUVVJFLURVTVApCisgIGZlYXR1cmVfZGlzcGxheSA6PSAxCitlbmRpZgorCitmZWF0dXJlX2Rpc3BsYXlfY2hlY2sgPSAkKGV2YWwgJChmZWF0dXJlX2NoZWNrX2NvZGUpKQorZGVmaW5lIGZlYXR1cmVfZGlzcGxheV9jaGVja19jb2RlCisgIGlmbmVxICgkKGZlYXR1cmUtJCgxKSksIDEpCisgICAgZmVhdHVyZV9kaXNwbGF5IDo9IDEKKyAgZW5kaWYKK2VuZGVmCisKKyQoZm9yZWFjaCBmZWF0LCQoRkVBVFVSRV9ESVNQTEFZKSwkKGNhbGwgZmVhdHVyZV9kaXNwbGF5X2NoZWNrLCQoZmVhdCkpKQorCitpZmVxICgkKFZGKSwxKQorICBmZWF0dXJlX2Rpc3BsYXkgOj0gMQorICBmZWF0dXJlX3ZlcmJvc2UgOj0gMQorZW5kaWYKKworaWZlcSAoJChmZWF0dXJlX2Rpc3BsYXkpLDEpCisgICQoaW5mbyApCisgICQoaW5mbyBBdXRvLWRldGVjdGluZyBzeXN0ZW0gZmVhdHVyZXM6KQorICAkKGZvcmVhY2ggZmVhdCwkKEZFQVRVUkVfRElTUExBWSksJChjYWxsIGZlYXR1cmVfcHJpbnRfc3RhdHVzLCQoZmVhdCksKSkKKworICBpZmVxICgkKGR3YXJmLXBvc3QtdW53aW5kKSwxKQorICAgICQoY2FsbCBmZWF0dXJlX3ByaW50X3RleHQsIkRXQVJGIHBvc3QgdW53aW5kIGxpYnJhcnkiLCAkKGR3YXJmLXBvc3QtdW53aW5kLXRleHQpKQorICBlbmRpZgorCisgIGlmbmVxICgkKGZlYXR1cmVfdmVyYm9zZSksMSkKKyAgICAkKGluZm8gKQorICBlbmRpZgorZW5kaWYKKworaWZlcSAoJChmZWF0dXJlX3ZlcmJvc2UpLDEpCisgIFRNUCA6PSAkKGZpbHRlci1vdXQgJChGRUFUVVJFX0RJU1BMQVkpLCQoRkVBVFVSRV9URVNUUykpCisgICQoZm9yZWFjaCBmZWF0LCQoVE1QKSwkKGNhbGwgZmVhdHVyZV9wcmludF9zdGF0dXMsJChmZWF0KSwpKQorICAkKGluZm8gKQorZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvLmdpdGlnbm9yZSBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWIzMzViCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMyBAQAorKi5kCisqLmJpbgorKi5vdXRwdXQKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvTWFrZWZpbGUgYi90b29scy9idWlsZC9mZWF0dXJlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2M2VkOGYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9idWlsZC9mZWF0dXJlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTY0IEBACisKK0ZJTEVTPQkJCQkJXAorCXRlc3QtYWxsLmJpbgkJCVwKKwl0ZXN0LWJhY2t0cmFjZS5iaW4JCVwKKwl0ZXN0LWJpb25pYy5iaW4JCQlcCisJdGVzdC1kd2FyZi5iaW4JCQlcCisJdGVzdC1mb3J0aWZ5LXNvdXJjZS5iaW4JCVwKKwl0ZXN0LXN5bmMtY29tcGFyZS1hbmQtc3dhcC5iaW4JXAorCXRlc3QtZ2xpYmMuYmluCQkJXAorCXRlc3QtZ3RrMi5iaW4JCQlcCisJdGVzdC1ndGsyLWluZm9iYXIuYmluCQlcCisJdGVzdC1oZWxsby5iaW4JCQlcCisJdGVzdC1saWJhdWRpdC5iaW4JCVwKKwl0ZXN0LWxpYmJmZC5iaW4JCQlcCisJdGVzdC1saWJlcnR5LmJpbgkJXAorCXRlc3QtbGliZXJ0eS16LmJpbgkJXAorCXRlc3QtY3BsdXMtZGVtYW5nbGUuYmluCQlcCisJdGVzdC1saWJlbGYuYmluCQkJXAorCXRlc3QtbGliZWxmLWdldHBoZHJudW0uYmluCVwKKwl0ZXN0LWxpYmVsZi1tbWFwLmJpbgkJXAorCXRlc3QtbGlibnVtYS5iaW4JCVwKKwl0ZXN0LWxpYnBlcmwuYmluCQlcCisJdGVzdC1saWJweXRob24uYmluCQlcCisJdGVzdC1saWJweXRob24tdmVyc2lvbi5iaW4JXAorCXRlc3QtbGlic2xhbmcuYmluCQlcCisJdGVzdC1saWJ1bndpbmQuYmluCQlcCisJdGVzdC1saWJ1bndpbmQtZGVidWctZnJhbWUuYmluCVwKKwl0ZXN0LXB0aHJlYWQtYXR0ci1zZXRhZmZpbml0eS1ucC5iaW4JXAorCXRlc3Qtc3RhY2twcm90ZWN0b3ItYWxsLmJpbglcCisJdGVzdC10aW1lcmZkLmJpbgkJXAorCXRlc3QtbGliZHctZHdhcmYtdW53aW5kLmJpbglcCisJdGVzdC1saWJiYWJlbHRyYWNlLmJpbgkJXAorCXRlc3QtY29tcGlsZS0zMi5iaW4JCVwKKwl0ZXN0LWNvbXBpbGUteDMyLmJpbgkJXAorCXRlc3QtemxpYi5iaW4JCQlcCisJdGVzdC1sem1hLmJpbgorCitDQyA6PSAkKENST1NTX0NPTVBJTEUpZ2NjIC1NRAorUEtHX0NPTkZJRyA6PSAkKENST1NTX0NPTVBJTEUpcGtnLWNvbmZpZworCithbGw6ICQoRklMRVMpCisKK19fQlVJTEQgPSAkKENDKSAkKENGTEFHUykgLVdhbGwgLVdlcnJvciAtbyAkKE9VVFBVVCkkQCAkKHBhdHN1YnN0ICUuYmluLCUuYywkQCkgJChMREZMQUdTKQorICBCVUlMRCA9ICQoX19CVUlMRCkgPiAkKE9VVFBVVCkkKEA6LmJpbj0ubWFrZS5vdXRwdXQpIDI+JjEKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCit0ZXN0LWFsbC5iaW46CisJJChCVUlMRCkgLWZzdGFjay1wcm90ZWN0b3ItYWxsIC1PMiAtRF9GT1JUSUZZX1NPVVJDRT0yIC1sZHcgLWxlbGYgLWxudW1hIC1sZWxmIC1sYXVkaXQgLUkvdXNyL2luY2x1ZGUvc2xhbmcgLWxzbGFuZyAkKHNoZWxsICQoUEtHX0NPTkZJRykgLS1saWJzIC0tY2ZsYWdzIGd0aystMi4wIDI+L2Rldi9udWxsKSAkKEZMQUdTX1BFUkxfRU1CRUQpICQoRkxBR1NfUFlUSE9OX0VNQkVEKSAtRFBBQ0tBR0U9JyJwZXJmIicgLWxiZmQgLWxkbCAtbHogLWxsem1hCisKK3Rlc3QtaGVsbG8uYmluOgorCSQoQlVJTEQpCisKK3Rlc3QtcHRocmVhZC1hdHRyLXNldGFmZmluaXR5LW5wLmJpbjoKKwkkKEJVSUxEKSAtRF9HTlVfU09VUkNFIC1scHRocmVhZAorCit0ZXN0LXN0YWNrcHJvdGVjdG9yLWFsbC5iaW46CisJJChCVUlMRCkgLWZzdGFjay1wcm90ZWN0b3ItYWxsCisKK3Rlc3QtZm9ydGlmeS1zb3VyY2UuYmluOgorCSQoQlVJTEQpIC1PMiAtRF9GT1JUSUZZX1NPVVJDRT0yCisKK3Rlc3QtYmlvbmljLmJpbjoKKwkkKEJVSUxEKQorCit0ZXN0LWxpYmVsZi5iaW46CisJJChCVUlMRCkgLWxlbGYKKwordGVzdC1nbGliYy5iaW46CisJJChCVUlMRCkKKwordGVzdC1kd2FyZi5iaW46CisJJChCVUlMRCkgLWxkdworCit0ZXN0LWxpYmVsZi1tbWFwLmJpbjoKKwkkKEJVSUxEKSAtbGVsZgorCit0ZXN0LWxpYmVsZi1nZXRwaGRybnVtLmJpbjoKKwkkKEJVSUxEKSAtbGVsZgorCit0ZXN0LWxpYm51bWEuYmluOgorCSQoQlVJTEQpIC1sbnVtYQorCit0ZXN0LWxpYnVud2luZC5iaW46CisJJChCVUlMRCkgLWxlbGYKKwordGVzdC1saWJ1bndpbmQtZGVidWctZnJhbWUuYmluOgorCSQoQlVJTEQpIC1sZWxmCisKK3Rlc3QtbGliYXVkaXQuYmluOgorCSQoQlVJTEQpIC1sYXVkaXQKKwordGVzdC1saWJzbGFuZy5iaW46CisJJChCVUlMRCkgLUkvdXNyL2luY2x1ZGUvc2xhbmcgLWxzbGFuZworCit0ZXN0LWd0azIuYmluOgorCSQoQlVJTEQpICQoc2hlbGwgJChQS0dfQ09ORklHKSAtLWxpYnMgLS1jZmxhZ3MgZ3RrKy0yLjAgMj4vZGV2L251bGwpCisKK3Rlc3QtZ3RrMi1pbmZvYmFyLmJpbjoKKwkkKEJVSUxEKSAkKHNoZWxsICQoUEtHX0NPTkZJRykgLS1saWJzIC0tY2ZsYWdzIGd0aystMi4wIDI+L2Rldi9udWxsKQorCitncmVwLWxpYnMgID0gJChmaWx0ZXIgLWwlLCQoMSkpCitzdHJpcC1saWJzID0gJChmaWx0ZXItb3V0IC1sJSwkKDEpKQorCitQRVJMX0VNQkVEX0xET1BUUyA9ICQoc2hlbGwgcGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBsZG9wdHMgMj4vZGV2L251bGwpCitQRVJMX0VNQkVEX0xERkxBR1MgPSAkKGNhbGwgc3RyaXAtbGlicywkKFBFUkxfRU1CRURfTERPUFRTKSkKK1BFUkxfRU1CRURfTElCQUREID0gJChjYWxsIGdyZXAtbGlicywkKFBFUkxfRU1CRURfTERPUFRTKSkKK1BFUkxfRU1CRURfQ0NPUFRTID0gYHBlcmwgLU1FeHRVdGlsczo6RW1iZWQgLWUgY2NvcHRzIDI+L2Rldi9udWxsYAorRkxBR1NfUEVSTF9FTUJFRD0kKFBFUkxfRU1CRURfQ0NPUFRTKSAkKFBFUkxfRU1CRURfTERPUFRTKQorCit0ZXN0LWxpYnBlcmwuYmluOgorCSQoQlVJTEQpICQoRkxBR1NfUEVSTF9FTUJFRCkKKwordGVzdC1saWJweXRob24uYmluOgorCSQoQlVJTEQpCisKK3Rlc3QtbGlicHl0aG9uLXZlcnNpb24uYmluOgorCSQoQlVJTEQpCisKK3Rlc3QtbGliYmZkLmJpbjoKKwkkKEJVSUxEKSAtRFBBQ0tBR0U9JyJwZXJmIicgLWxiZmQgLWx6IC1saWJlcnR5IC1sZGwKKwordGVzdC1saWJlcnR5LmJpbjoKKwkkKENDKSAtV2FsbCAtV2Vycm9yIC1vICQoT1VUUFVUKSRAIHRlc3QtbGliYmZkLmMgLURQQUNLQUdFPScicGVyZiInIC1sYmZkIC1sZGwgLWxpYmVydHkKKwordGVzdC1saWJlcnR5LXouYmluOgorCSQoQ0MpIC1XYWxsIC1XZXJyb3IgLW8gJChPVVRQVVQpJEAgdGVzdC1saWJiZmQuYyAtRFBBQ0tBR0U9JyJwZXJmIicgLWxiZmQgLWxkbCAtbGliZXJ0eSAtbHoKKwordGVzdC1jcGx1cy1kZW1hbmdsZS5iaW46CisJJChCVUlMRCkgLWxpYmVydHkKKwordGVzdC1iYWNrdHJhY2UuYmluOgorCSQoQlVJTEQpCisKK3Rlc3QtdGltZXJmZC5iaW46CisJJChCVUlMRCkKKwordGVzdC1saWJkdy1kd2FyZi11bndpbmQuYmluOgorCSQoQlVJTEQpICMgLWxkdyBwcm92aWRlZCBieSAkKEZFQVRVUkVfQ0hFQ0tfTERGTEFHUy1saWJkdy1kd2FyZi11bndpbmQpCisKK3Rlc3QtbGliYmFiZWx0cmFjZS5iaW46CisJJChCVUlMRCkgIyAtbGJhYmVsdHJhY2UgcHJvdmlkZWQgYnkgJChGRUFUVVJFX0NIRUNLX0xERkxBR1MtbGliYmFiZWx0cmFjZSkKKwordGVzdC1zeW5jLWNvbXBhcmUtYW5kLXN3YXAuYmluOgorCSQoQlVJTEQpCisKK3Rlc3QtY29tcGlsZS0zMi5iaW46CisJJChDQykgLW0zMiAtbyAkKE9VVFBVVCkkQCB0ZXN0LWNvbXBpbGUuYworCit0ZXN0LWNvbXBpbGUteDMyLmJpbjoKKwkkKENDKSAtbXgzMiAtbyAkKE9VVFBVVCkkQCB0ZXN0LWNvbXBpbGUuYworCit0ZXN0LXpsaWIuYmluOgorCSQoQlVJTEQpIC1segorCit0ZXN0LWx6bWEuYmluOgorCSQoQlVJTEQpIC1sbHptYQorCistaW5jbHVkZSAqLmQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGVhbjoKKwlybSAtZiAkKEZJTEVTKSAqLmQgJChGSUxFUzouYmluPS5tYWtlLm91dHB1dCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1hbGwuYyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1hbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDY4OWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWFsbC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogdGVzdC1hbGwuYzogVHJ5IHRvIGJ1aWxkIGFsbCB0aGUgbWFpbiB0ZXN0Y2FzZXMgYXQgb25jZS4KKyAqCisgKiBBIHdlbGwtY29uZmlndXJlZCBzeXN0ZW0gd2lsbCBoYXZlIGFsbCB0aGUgcHJlcmVxcyBpbnN0YWxsZWQsIHNvIHdlIGNhbiBzcGVlZAorICogdXAgYXV0by1kZXRlY3Rpb24gb24gc3VjaCBzeXN0ZW1zLgorICovCisKKy8qCisgKiBRdWlyazogUHl0aG9uIGFuZCBQZXJsIGhlYWRlcnMgY2Fubm90IGJlIGluIGFyYml0cmFyeSBwbGFjZXMsIHNvIGtlZXAKKyAqIHRoZXNlIDMgdGVzdGNhc2VzIGF0IHRoZSB0b3A6CisgKi8KKyNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfbGlicHl0aG9uCisjIGluY2x1ZGUgInRlc3QtbGlicHl0aG9uLmMiCisjdW5kZWYgbWFpbgorCisjZGVmaW5lIG1haW4gbWFpbl90ZXN0X2xpYnB5dGhvbl92ZXJzaW9uCisjIGluY2x1ZGUgInRlc3QtbGlicHl0aG9uLXZlcnNpb24uYyIKKyN1bmRlZiBtYWluCisKKyNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfbGlicGVybAorIyBpbmNsdWRlICJ0ZXN0LWxpYnBlcmwuYyIKKyN1bmRlZiBtYWluCisKKyNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfaGVsbG8KKyMgaW5jbHVkZSAidGVzdC1oZWxsby5jIgorI3VuZGVmIG1haW4KKworI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJlbGYKKyMgaW5jbHVkZSAidGVzdC1saWJlbGYuYyIKKyN1bmRlZiBtYWluCisKKyNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfbGliZWxmX21tYXAKKyMgaW5jbHVkZSAidGVzdC1saWJlbGYtbW1hcC5jIgorI3VuZGVmIG1haW4KKworI2RlZmluZSBtYWluIG1haW5fdGVzdF9nbGliYworIyBpbmNsdWRlICJ0ZXN0LWdsaWJjLmMiCisjdW5kZWYgbWFpbgorCisjZGVmaW5lIG1haW4gbWFpbl90ZXN0X2R3YXJmCisjIGluY2x1ZGUgInRlc3QtZHdhcmYuYyIKKyN1bmRlZiBtYWluCisKKyNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfbGliZWxmX2dldHBoZHJudW0KKyMgaW5jbHVkZSAidGVzdC1saWJlbGYtZ2V0cGhkcm51bS5jIgorI3VuZGVmIG1haW4KKworI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJ1bndpbmQKKyMgaW5jbHVkZSAidGVzdC1saWJ1bndpbmQuYyIKKyN1bmRlZiBtYWluCisKKyNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfbGliYXVkaXQKKyMgaW5jbHVkZSAidGVzdC1saWJhdWRpdC5jIgorI3VuZGVmIG1haW4KKworI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJzbGFuZworIyBpbmNsdWRlICJ0ZXN0LWxpYnNsYW5nLmMiCisjdW5kZWYgbWFpbgorCisjZGVmaW5lIG1haW4gbWFpbl90ZXN0X2d0azIKKyMgaW5jbHVkZSAidGVzdC1ndGsyLmMiCisjdW5kZWYgbWFpbgorCisjZGVmaW5lIG1haW4gbWFpbl90ZXN0X2d0azJfaW5mb2JhcgorIyBpbmNsdWRlICJ0ZXN0LWd0azItaW5mb2Jhci5jIgorI3VuZGVmIG1haW4KKworI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJiZmQKKyMgaW5jbHVkZSAidGVzdC1saWJiZmQuYyIKKyN1bmRlZiBtYWluCisKKyNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfYmFja3RyYWNlCisjIGluY2x1ZGUgInRlc3QtYmFja3RyYWNlLmMiCisjdW5kZWYgbWFpbgorCisjZGVmaW5lIG1haW4gbWFpbl90ZXN0X2xpYm51bWEKKyMgaW5jbHVkZSAidGVzdC1saWJudW1hLmMiCisjdW5kZWYgbWFpbgorCisjZGVmaW5lIG1haW4gbWFpbl90ZXN0X3RpbWVyZmQKKyMgaW5jbHVkZSAidGVzdC10aW1lcmZkLmMiCisjdW5kZWYgbWFpbgorCisjZGVmaW5lIG1haW4gbWFpbl90ZXN0X3N0YWNrcHJvdGVjdG9yX2FsbAorIyBpbmNsdWRlICJ0ZXN0LXN0YWNrcHJvdGVjdG9yLWFsbC5jIgorI3VuZGVmIG1haW4KKworI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJkd19kd2FyZl91bndpbmQKKyMgaW5jbHVkZSAidGVzdC1saWJkdy1kd2FyZi11bndpbmQuYyIKKyN1bmRlZiBtYWluCisKKyNkZWZpbmUgbWFpbiBtYWluX3Rlc3Rfc3luY19jb21wYXJlX2FuZF9zd2FwCisjIGluY2x1ZGUgInRlc3Qtc3luYy1jb21wYXJlLWFuZC1zd2FwLmMiCisjdW5kZWYgbWFpbgorCisjZGVmaW5lIG1haW4gbWFpbl90ZXN0X3psaWIKKyMgaW5jbHVkZSAidGVzdC16bGliLmMiCisjdW5kZWYgbWFpbgorCisjZGVmaW5lIG1haW4gbWFpbl90ZXN0X3B0aHJlYWRfYXR0cl9zZXRhZmZpbml0eV9ucAorIyBpbmNsdWRlICJ0ZXN0LXB0aHJlYWQtYXR0ci1zZXRhZmZpbml0eS1ucC5jIgorI3VuZGVmIG1haW4KKworIyBpZiAwCisvKgorICogRGlzYWJsZSBsaWJiYWJlbHRyYWNlIGNoZWNrIGZvciB0ZXN0LWFsbCwgYmVjYXVzZSB0aGUgcmVxdWVzdGVkCisgKiBsaWJyYXJ5IHZlcnNpb24gaXMgbm90IHJlbGVhc2VkIHlldCBpbiBtb3N0IGRpc3RyaWJ1dGlvbnMuIFdpbGwKKyAqIHJlZW5hYmxlIGxhdGVyLgorICovCisKKyNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfbGliYmFiZWx0cmFjZQorIyBpbmNsdWRlICJ0ZXN0LWxpYmJhYmVsdHJhY2UuYyIKKyN1bmRlZiBtYWluCisjZW5kaWYKKworI2RlZmluZSBtYWluIG1haW5fdGVzdF9sem1hCisjIGluY2x1ZGUgInRlc3QtbHptYS5jIgorI3VuZGVmIG1haW4KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwltYWluX3Rlc3RfbGlicHl0aG9uKCk7CisJbWFpbl90ZXN0X2xpYnB5dGhvbl92ZXJzaW9uKCk7CisJbWFpbl90ZXN0X2xpYnBlcmwoKTsKKwltYWluX3Rlc3RfaGVsbG8oKTsKKwltYWluX3Rlc3RfbGliZWxmKCk7CisJbWFpbl90ZXN0X2xpYmVsZl9tbWFwKCk7CisJbWFpbl90ZXN0X2dsaWJjKCk7CisJbWFpbl90ZXN0X2R3YXJmKCk7CisJbWFpbl90ZXN0X2xpYmVsZl9nZXRwaGRybnVtKCk7CisJbWFpbl90ZXN0X2xpYnVud2luZCgpOworCW1haW5fdGVzdF9saWJhdWRpdCgpOworCW1haW5fdGVzdF9saWJzbGFuZygpOworCW1haW5fdGVzdF9ndGsyKGFyZ2MsIGFyZ3YpOworCW1haW5fdGVzdF9ndGsyX2luZm9iYXIoYXJnYywgYXJndik7CisJbWFpbl90ZXN0X2xpYmJmZCgpOworCW1haW5fdGVzdF9iYWNrdHJhY2UoKTsKKwltYWluX3Rlc3RfbGlibnVtYSgpOworCW1haW5fdGVzdF90aW1lcmZkKCk7CisJbWFpbl90ZXN0X3N0YWNrcHJvdGVjdG9yX2FsbCgpOworCW1haW5fdGVzdF9saWJkd19kd2FyZl91bndpbmQoKTsKKwltYWluX3Rlc3Rfc3luY19jb21wYXJlX2FuZF9zd2FwKGFyZ2MsIGFyZ3YpOworCW1haW5fdGVzdF96bGliKCk7CisJbWFpbl90ZXN0X3B0aHJlYWRfYXR0cl9zZXRhZmZpbml0eV9ucCgpOworCW1haW5fdGVzdF9sem1hKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtYmFja3RyYWNlLmMgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtYmFja3RyYWNlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtYmFja3RyYWNlLmMKcmVuYW1lIHRvIHRvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1iYWNrdHJhY2UuYwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1iaW9uaWMuYyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1iaW9uaWMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1iaW9uaWMuYwpyZW5hbWUgdG8gdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWJpb25pYy5jCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWNvbXBpbGUuYyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1jb21waWxlLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtY29tcGlsZS5jCnJlbmFtZSB0byB0b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtY29tcGlsZS5jCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWNwbHVzLWRlbWFuZ2xlLmMgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtY3BsdXMtZGVtYW5nbGUuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1jcGx1cy1kZW1hbmdsZS5jCnJlbmFtZSB0byB0b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtY3BsdXMtZGVtYW5nbGUuYwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1kd2FyZi5jIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWR3YXJmLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtZHdhcmYuYwpyZW5hbWUgdG8gdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWR3YXJmLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtZm9ydGlmeS1zb3VyY2UuYyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1mb3J0aWZ5LXNvdXJjZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWZvcnRpZnktc291cmNlLmMKcmVuYW1lIHRvIHRvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1mb3J0aWZ5LXNvdXJjZS5jCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWdsaWJjLmMgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtZ2xpYmMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1nbGliYy5jCnJlbmFtZSB0byB0b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtZ2xpYmMuYwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1ndGsyLWluZm9iYXIuYyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1ndGsyLWluZm9iYXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1ndGsyLWluZm9iYXIuYwpyZW5hbWUgdG8gdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWd0azItaW5mb2Jhci5jCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWd0azIuYyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1ndGsyLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtZ3RrMi5jCnJlbmFtZSB0byB0b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtZ3RrMi5jCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWhlbGxvLmMgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtaGVsbG8uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1oZWxsby5jCnJlbmFtZSB0byB0b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtaGVsbG8uYwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1saWJhdWRpdC5jIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWxpYmF1ZGl0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGliYXVkaXQuYwpyZW5hbWUgdG8gdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWxpYmF1ZGl0LmMKZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1saWJiYWJlbHRyYWNlLmMgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtbGliYmFiZWx0cmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZjgwMmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtbGliYmFiZWx0cmFjZS5jCkBAIC0wLDAgKzEsOSBAQAorCisjaW5jbHVkZSA8YmFiZWx0cmFjZS9jdGYtd3JpdGVyL3dyaXRlci5oPgorI2luY2x1ZGUgPGJhYmVsdHJhY2UvY3RmLWlyL3N0cmVhbS1jbGFzcy5oPgorCitpbnQgbWFpbih2b2lkKQoreworCWJ0X2N0Zl9zdHJlYW1fY2xhc3NfZ2V0X3BhY2tldF9jb250ZXh0X3R5cGUoKHZvaWQgKikgMCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYmJmZC5jIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWxpYmJmZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYmJmZC5jCnJlbmFtZSB0byB0b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtbGliYmZkLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGliZHctZHdhcmYtdW53aW5kLmMgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtbGliZHctZHdhcmYtdW53aW5kLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGliZHctZHdhcmYtdW53aW5kLmMKcmVuYW1lIHRvIHRvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1saWJkdy1kd2FyZi11bndpbmQuYwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1saWJlbGYtZ2V0cGhkcm51bS5jIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWxpYmVsZi1nZXRwaGRybnVtLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGliZWxmLWdldHBoZHJudW0uYwpyZW5hbWUgdG8gdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWxpYmVsZi1nZXRwaGRybnVtLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGliZWxmLW1tYXAuYyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1saWJlbGYtbW1hcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYmVsZi1tbWFwLmMKcmVuYW1lIHRvIHRvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1saWJlbGYtbW1hcC5jCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYmVsZi5jIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWxpYmVsZi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYmVsZi5jCnJlbmFtZSB0byB0b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtbGliZWxmLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGlibnVtYS5jIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWxpYm51bWEuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1saWJudW1hLmMKcmVuYW1lIHRvIHRvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1saWJudW1hLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGlicGVybC5jIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWxpYnBlcmwuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1saWJwZXJsLmMKcmVuYW1lIHRvIHRvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1saWJwZXJsLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGlicHl0aG9uLXZlcnNpb24uYyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1saWJweXRob24tdmVyc2lvbi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYnB5dGhvbi12ZXJzaW9uLmMKcmVuYW1lIHRvIHRvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1saWJweXRob24tdmVyc2lvbi5jCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYnB5dGhvbi5jIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWxpYnB5dGhvbi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYnB5dGhvbi5jCnJlbmFtZSB0byB0b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtbGlicHl0aG9uLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGlic2xhbmcuYyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1saWJzbGFuZy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYnNsYW5nLmMKcmVuYW1lIHRvIHRvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1saWJzbGFuZy5jCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYnVud2luZC1kZWJ1Zy1mcmFtZS5jIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWxpYnVud2luZC1kZWJ1Zy1mcmFtZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LWxpYnVud2luZC1kZWJ1Zy1mcmFtZS5jCnJlbmFtZSB0byB0b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtbGlidW53aW5kLWRlYnVnLWZyYW1lLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGlidW53aW5kLmMgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtbGlidW53aW5kLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtbGlidW53aW5kLmMKcmVuYW1lIHRvIHRvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1saWJ1bndpbmQuYwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LWx6bWEuYyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1sem1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhZGM4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1sem1hLmMKQEAgLTAsMCArMSwxMCBAQAorI2luY2x1ZGUgPGx6bWEuaD4KKworaW50IG1haW4odm9pZCkKK3sKKwlsem1hX3N0cmVhbSBzdHJtID0gTFpNQV9TVFJFQU1fSU5JVDsKKwlpbnQgcmV0OworCisJcmV0ID0gbHptYV9zdHJlYW1fZGVjb2Rlcigmc3RybSwgVUlOVDY0X01BWCwgTFpNQV9DT05DQVRFTkFURUQpOworCXJldHVybiByZXQgPyAtMSA6IDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtcHRocmVhZC1hdHRyLXNldGFmZmluaXR5LW5wLmMgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtcHRocmVhZC1hdHRyLXNldGFmZmluaXR5LW5wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhZGE1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1wdGhyZWFkLWF0dHItc2V0YWZmaW5pdHktbnAuYwpAQCAtMCwwICsxLDE3IEBACisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHNjaGVkLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJaW50IHJldCA9IDA7CisJcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7CisJY3B1X3NldF90IGNzOworCisJcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsKKwlDUFVfWkVSTygmY3MpOworCisJcmV0ID0gcHRocmVhZF9hdHRyX3NldGFmZmluaXR5X25wKCZ0aHJlYWRfYXR0ciwgc2l6ZW9mKGNzKSwgJmNzKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LXN0YWNrcHJvdGVjdG9yLWFsbC5jIGIvdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LXN0YWNrcHJvdGVjdG9yLWFsbC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LXN0YWNrcHJvdGVjdG9yLWFsbC5jCnJlbmFtZSB0byB0b29scy9idWlsZC9mZWF0dXJlL3Rlc3Qtc3RhY2twcm90ZWN0b3ItYWxsLmMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3Qtc3luYy1jb21wYXJlLWFuZC1zd2FwLmMgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3Qtc3luYy1jb21wYXJlLWFuZC1zd2FwLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3Qtc3luYy1jb21wYXJlLWFuZC1zd2FwLmMKcmVuYW1lIHRvIHRvb2xzL2J1aWxkL2ZlYXR1cmUvdGVzdC1zeW5jLWNvbXBhcmUtYW5kLXN3YXAuYwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC10aW1lcmZkLmMgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtdGltZXJmZC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LXRpbWVyZmQuYwpyZW5hbWUgdG8gdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LXRpbWVyZmQuYwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC16bGliLmMgYi90b29scy9idWlsZC9mZWF0dXJlL3Rlc3QtemxpYi5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LXpsaWIuYwpyZW5hbWUgdG8gdG9vbHMvYnVpbGQvZmVhdHVyZS90ZXN0LXpsaWIuYwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQvdGVzdHMvZXgvQnVpbGQgYi90b29scy9idWlsZC90ZXN0cy9leC9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTZjM2U2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYnVpbGQvdGVzdHMvZXgvQnVpbGQKQEAgLTAsMCArMSw4IEBACitleC15ICs9IGV4Lm8KK2V4LXkgKz0gYS5vCitleC15ICs9IGIubworZXgteSArPSBlbXB0eS8KKworbGliZXgteSArPSBjLm8KK2xpYmV4LXkgKz0gZC5vCitsaWJleC15ICs9IGFyY2gvCmRpZmYgLS1naXQgYS90b29scy9idWlsZC90ZXN0cy9leC9NYWtlZmlsZSBiL3Rvb2xzL2J1aWxkL3Rlc3RzL2V4L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZDI0NzYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9idWlsZC90ZXN0cy9leC9NYWtlZmlsZQpAQCAtMCwwICsxLDIzIEBACitleHBvcnQgc3JjdHJlZSA6PSAuLi8uLi8uLi8uLgorZXhwb3J0IENDICAgICAgOj0gZ2NjCitleHBvcnQgTEQgICAgICA6PSBsZAorZXhwb3J0IEFSICAgICAgOj0gYXIKKworYnVpbGQgOj0gLWYgJChzcmN0cmVlKS90b29scy9idWlsZC9NYWtlZmlsZS5idWlsZCBkaXI9LiBvYmoKK2V4OiBleC1pbi5vIGxpYmV4LWluLm8KKwlnY2MgLW8gJEAgJF4KKworZXguJTogRk9SQ0UKKwltYWtlIC1mICQoc3JjdHJlZSkvdG9vbHMvYnVpbGQvTWFrZWZpbGUuYnVpbGQgZGlyPS4gJEAKKworZXgtaW4ubzogRk9SQ0UKKwltYWtlICQoYnVpbGQpPWV4CisKK2xpYmV4LWluLm86IEZPUkNFCisJbWFrZSAkKGJ1aWxkKT1saWJleAorCitjbGVhbjoKKwlmaW5kIC4gLW5hbWUgJyoubycgLWRlbGV0ZSAtbyAtbmFtZSAnXC4qLmNtZCcgLWRlbGV0ZSAtbyAtbmFtZSAnXC4qLmQnIC1kZWxldGUKKwlybSAtZiBleCBleC5pIGV4LnMKKworLlBIT05ZOiBGT1JDRQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQvdGVzdHMvZXgvYS5jIGIvdG9vbHMvYnVpbGQvdGVzdHMvZXgvYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MTc2MjcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9idWlsZC90ZXN0cy9leC9hLmMKQEAgLTAsMCArMSw1IEBACisKK2ludCBhKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9idWlsZC90ZXN0cy9leC9hcmNoL0J1aWxkIGIvdG9vbHMvYnVpbGQvdGVzdHMvZXgvYXJjaC9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTUwNjE4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYnVpbGQvdGVzdHMvZXgvYXJjaC9CdWlsZApAQCAtMCwwICsxLDIgQEAKK2xpYmV4LXkgKz0gZS5vCitsaWJleC15ICs9IGYubwpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQvdGVzdHMvZXgvYXJjaC9lLmMgYi90b29scy9idWlsZC90ZXN0cy9leC9hcmNoL2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWFhNGExCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYnVpbGQvdGVzdHMvZXgvYXJjaC9lLmMKQEAgLTAsMCArMSw1IEBACisKK2ludCBlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9idWlsZC90ZXN0cy9leC9hcmNoL2YuYyBiL3Rvb2xzL2J1aWxkL3Rlc3RzL2V4L2FyY2gvZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjM2U5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9idWlsZC90ZXN0cy9leC9hcmNoL2YuYwpAQCAtMCwwICsxLDUgQEAKKworaW50IGYodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkL3Rlc3RzL2V4L2IuYyBiL3Rvb2xzL2J1aWxkL3Rlc3RzL2V4L2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjRmZjljCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYnVpbGQvdGVzdHMvZXgvYi5jCkBAIC0wLDAgKzEsNSBAQAorCitpbnQgYih2b2lkKQoreworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQvdGVzdHMvZXgvYy5jIGIvdG9vbHMvYnVpbGQvdGVzdHMvZXgvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTZkMDIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9idWlsZC90ZXN0cy9leC9jLmMKQEAgLTAsMCArMSw1IEBACisKK2ludCBjKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9idWlsZC90ZXN0cy9leC9kLmMgYi90b29scy9idWlsZC90ZXN0cy9leC9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBkYzBmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2J1aWxkL3Rlc3RzL2V4L2QuYwpAQCAtMCwwICsxLDUgQEAKKworaW50IGQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2J1aWxkL3Rlc3RzL2V4L2VtcHR5L0J1aWxkIGIvdG9vbHMvYnVpbGQvdGVzdHMvZXgvZW1wdHkvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2J1aWxkL3Rlc3RzL2V4L2VtcHR5L0J1aWxkCmRpZmYgLS1naXQgYS90b29scy9idWlsZC90ZXN0cy9leC9leC5jIGIvdG9vbHMvYnVpbGQvdGVzdHMvZXgvZXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQyZWIyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYnVpbGQvdGVzdHMvZXgvZXguYwpAQCAtMCwwICsxLDE5IEBACisKK2ludCBhKHZvaWQpOworaW50IGIodm9pZCk7CitpbnQgYyh2b2lkKTsKK2ludCBkKHZvaWQpOworaW50IGUodm9pZCk7CitpbnQgZih2b2lkKTsKKworaW50IG1haW4odm9pZCkKK3sKKwlhKCk7CisJYigpOworCWMoKTsKKwlkKCk7CisJZSgpOworCWYoKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQvdGVzdHMvcnVuLnNoIGIvdG9vbHMvYnVpbGQvdGVzdHMvcnVuLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU0OTRmOGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9idWlsZC90ZXN0cy9ydW4uc2gKQEAgLTAsMCArMSw0MiBAQAorIyEvYmluL3NoCisKK2Z1bmN0aW9uIHRlc3RfZXggeworCW1ha2UgLUMgZXggVj0xIGNsZWFuID4gZXgub3V0IDI+JjEKKwltYWtlIC1DIGV4IFY9MSA+PiBleC5vdXQgMj4mMQorCisJaWYgWyAhIC14IC4vZXgvZXggXTsgdGhlbgorCSAgZWNobyBGQUlMRUQKKwkgIGV4aXQgLTEKKwlmaQorCisJbWFrZSAtQyBleCBWPTEgY2xlYW4gPiAvZGV2L251bGwgMj4mMQorCXJtIC1mIGV4Lm91dAorfQorCitmdW5jdGlvbiB0ZXN0X2V4X3N1ZmZpeCB7CisJbWFrZSAtQyBleCBWPTEgY2xlYW4gPiBleC5vdXQgMj4mMQorCisJIyB1c2UgLXJSIHRvIGRpc2FibGUgbWFrZSdzIGJ1aWx0aW4gcnVsZXMKKwltYWtlIC1yUiAtQyBleCBWPTEgZXgubyA+PiBleC5vdXQgMj4mMQorCW1ha2UgLXJSIC1DIGV4IFY9MSBleC5pID4+IGV4Lm91dCAyPiYxCisJbWFrZSAtclIgLUMgZXggVj0xIGV4LnMgPj4gZXgub3V0IDI+JjEKKworCWlmIFsgLXggLi9leC9leCBdOyB0aGVuCisJICBlY2hvIEZBSUxFRAorCSAgZXhpdCAtMQorCWZpCisKKwlpZiBbICEgLWYgLi9leC9leC5vIC1vICEgLWYgLi9leC9leC5pIC1vICEgLWYgLi9leC9leC5zIF07IHRoZW4KKwkgIGVjaG8gRkFJTEVECisJICBleGl0IC0xCisJZmkKKworCW1ha2UgLUMgZXggVj0xIGNsZWFuID4gL2Rldi9udWxsIDI+JjEKKwlybSAtZiBleC5vdXQKK30KK2VjaG8gLW4gVGVzdGluZy4uCisKK3Rlc3RfZXgKK3Rlc3RfZXhfc3VmZml4CisKK2VjaG8gT0sKZGlmZiAtLWdpdCBhL3Rvb2xzL2lpby9NYWtlZmlsZSBiL3Rvb2xzL2lpby9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjdhZTZkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWlvL01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKK0NDID0gZ2NjCitDRkxBR1MgPSAtV2FsbCAtZyAtRF9HTlVfU09VUkNFCisKK2FsbDogaWlvX2V2ZW50X21vbml0b3IgbHNpaW8gZ2VuZXJpY19idWZmZXIKKworaWlvX2V2ZW50X21vbml0b3I6IGlpb19ldmVudF9tb25pdG9yLm8gaWlvX3V0aWxzLm8KKworbHNpaW86IGxzaWlvLm8gaWlvX3V0aWxzLm8KKworZ2VuZXJpY19idWZmZXI6IGdlbmVyaWNfYnVmZmVyLm8gaWlvX3V0aWxzLm8KKworJS5vOiAlLmMgaWlvX3V0aWxzLmgKKworLlBIT05ZOiBjbGVhbgorY2xlYW46CisJcm0gLWYgKi5vIGlpb19ldmVudF9tb25pdG9yIGxzaWlvIGdlbmVyaWNfYnVmZmVyCmRpZmYgLS1naXQgYS90b29scy9paW8vZ2VuZXJpY19idWZmZXIuYyBiL3Rvb2xzL2lpby9nZW5lcmljX2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MDU0OTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9paW8vZ2VuZXJpY19idWZmZXIuYwpAQCAtMCwwICsxLDM1OSBAQAorLyogSW5kdXN0cmlhbGlvIGJ1ZmZlciB0ZXN0IGNvZGUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEpvbmF0aGFuIENhbWVyb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBwcmltYXJpbHkgaW50ZW5kZWQgYXMgYW4gZXhhbXBsZSBhcHBsaWNhdGlvbi4KKyAqIFJlYWRzIHRoZSBjdXJyZW50IGJ1ZmZlciBzZXR1cCBmcm9tIHN5c2ZzIGFuZCBzdGFydHMgYSBzaG9ydCBjYXB0dXJlCisgKiBmcm9tIHRoZSBzcGVjaWZpZWQgZGV2aWNlLCBwcmV0dHkgcHJpbnRpbmcgdGhlIHJlc3VsdCBhZnRlciBhcHByb3ByaWF0ZQorICogY29udmVyc2lvbi4KKyAqCisgKiBDb21tYW5kIGxpbmUgcGFyYW1ldGVycworICogZ2VuZXJpY19idWZmZXIgLW4gPGRldmljZV9uYW1lPiAtdCA8dHJpZ2dlcl9uYW1lPgorICogSWYgdHJpZ2dlciBuYW1lIGlzIG5vdCBzcGVjaWZpZWQgdGhlIHByb2dyYW0gYXNzdW1lcyB5b3Ugd2FudCBhIGRhdGFyZWFkeQorICogdHJpZ2dlciBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZSBhbmQgZ29lcyBsb29raW5nIGZvciBpdC4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSAiaWlvX3V0aWxzLmgiCisKKy8qKgorICogc2l6ZV9mcm9tX2NoYW5uZWxhcnJheSgpIC0gY2FsY3VsYXRlIHRoZSBzdG9yYWdlIHNpemUgb2YgYSBzY2FuCisgKiBAY2hhbm5lbHM6CQl0aGUgY2hhbm5lbCBpbmZvIGFycmF5CisgKiBAbnVtX2NoYW5uZWxzOgludW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBIYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGZpbGxpbmcgdGhlIGNoYW5uZWxzW2ldLmxvY2F0aW9uIHZhbHVlcyB1c2VkCisgKiBpbiBwcm9jZXNzaW5nIHRoZSBidWZmZXIgb3V0cHV0LgorICoqLworaW50IHNpemVfZnJvbV9jaGFubmVsYXJyYXkoc3RydWN0IGlpb19jaGFubmVsX2luZm8gKmNoYW5uZWxzLCBpbnQgbnVtX2NoYW5uZWxzKQoreworCWludCBieXRlcyA9IDA7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkgPCBudW1fY2hhbm5lbHMpIHsKKwkJaWYgKGJ5dGVzICUgY2hhbm5lbHNbaV0uYnl0ZXMgPT0gMCkKKwkJCWNoYW5uZWxzW2ldLmxvY2F0aW9uID0gYnl0ZXM7CisJCWVsc2UKKwkJCWNoYW5uZWxzW2ldLmxvY2F0aW9uID0gYnl0ZXMgLSBieXRlcyVjaGFubmVsc1tpXS5ieXRlcworCQkJCSsgY2hhbm5lbHNbaV0uYnl0ZXM7CisJCWJ5dGVzID0gY2hhbm5lbHNbaV0ubG9jYXRpb24gKyBjaGFubmVsc1tpXS5ieXRlczsKKwkJaSsrOworCX0KKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3ZvaWQgcHJpbnQyYnl0ZShpbnQgaW5wdXQsIHN0cnVjdCBpaW9fY2hhbm5lbF9pbmZvICppbmZvKQoreworCS8qIEZpcnN0IHN3YXAgaWYgaW5jb3JyZWN0IGVuZGlhbiAqLworCWlmIChpbmZvLT5iZSkKKwkJaW5wdXQgPSBiZTE2dG9oKCh1aW50MTZfdClpbnB1dCk7CisJZWxzZQorCQlpbnB1dCA9IGxlMTZ0b2goKHVpbnQxNl90KWlucHV0KTsKKworCS8qCisJICogU2hpZnQgYmVmb3JlIGNvbnZlcnNpb24gdG8gYXZvaWQgc2lnbiBleHRlbnNpb24KKwkgKiBvZiBsZWZ0IGFsaWduZWQgZGF0YQorCSAqLworCWlucHV0ID4+PSBpbmZvLT5zaGlmdDsKKwlpZiAoaW5mby0+aXNfc2lnbmVkKSB7CisJCWludDE2X3QgdmFsID0gaW5wdXQ7CisKKwkJdmFsICY9ICgxIDw8IGluZm8tPmJpdHNfdXNlZCkgLSAxOworCQl2YWwgPSAoaW50MTZfdCkodmFsIDw8ICgxNiAtIGluZm8tPmJpdHNfdXNlZCkpID4+CisJCQkoMTYgLSBpbmZvLT5iaXRzX3VzZWQpOworCQlwcmludGYoIiUwNWYgIiwgKChmbG9hdCl2YWwgKyBpbmZvLT5vZmZzZXQpKmluZm8tPnNjYWxlKTsKKwl9IGVsc2UgeworCQl1aW50MTZfdCB2YWwgPSBpbnB1dDsKKworCQl2YWwgJj0gKDEgPDwgaW5mby0+Yml0c191c2VkKSAtIDE7CisJCXByaW50ZigiJTA1ZiAiLCAoKGZsb2F0KXZhbCArIGluZm8tPm9mZnNldCkqaW5mby0+c2NhbGUpOworCX0KK30KKy8qKgorICogcHJvY2Vzc19zY2FuKCkgLSBwcmludCBvdXQgdGhlIHZhbHVlcyBpbiBTSSB1bml0cworICogQGRhdGE6CQlwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgc2NhbgorICogQGNoYW5uZWxzOgkJaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYW5uZWxzLiBOb3RlCisgKiAgc2l6ZV9mcm9tX2NoYW5uZWxhcnJheSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgZmlyc3QgdG8gZmlsbCB0aGUKKyAqICBsb2NhdGlvbiBvZmZzZXRzLgorICogQG51bV9jaGFubmVsczoJbnVtYmVyIG9mIGNoYW5uZWxzCisgKiovCit2b2lkIHByb2Nlc3Nfc2NhbihjaGFyICpkYXRhLAorCQkgIHN0cnVjdCBpaW9fY2hhbm5lbF9pbmZvICpjaGFubmVscywKKwkJICBpbnQgbnVtX2NoYW5uZWxzKQoreworCWludCBrOworCisJZm9yIChrID0gMDsgayA8IG51bV9jaGFubmVsczsgaysrKQorCQlzd2l0Y2ggKGNoYW5uZWxzW2tdLmJ5dGVzKSB7CisJCQkvKiBvbmx5IGEgZmV3IGNhc2VzIGltcGxlbWVudGVkIHNvIGZhciAqLworCQljYXNlIDI6CisJCQlwcmludDJieXRlKCoodWludDE2X3QgKikoZGF0YSArIGNoYW5uZWxzW2tdLmxvY2F0aW9uKSwKKwkJCQkgICAmY2hhbm5lbHNba10pOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWlmICghY2hhbm5lbHNba10uaXNfc2lnbmVkKSB7CisJCQkJdWludDMyX3QgdmFsID0gKih1aW50MzJfdCAqKQorCQkJCQkoZGF0YSArIGNoYW5uZWxzW2tdLmxvY2F0aW9uKTsKKwkJCQlwcmludGYoIiUwNWYgIiwgKChmbG9hdCl2YWwgKworCQkJCQkJIGNoYW5uZWxzW2tdLm9mZnNldCkqCisJCQkJICAgICAgIGNoYW5uZWxzW2tdLnNjYWxlKTsKKworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgODoKKwkJCWlmIChjaGFubmVsc1trXS5pc19zaWduZWQpIHsKKwkJCQlpbnQ2NF90IHZhbCA9ICooaW50NjRfdCAqKQorCQkJCQkoZGF0YSArCisJCQkJCSBjaGFubmVsc1trXS5sb2NhdGlvbik7CisJCQkJaWYgKCh2YWwgPj4gY2hhbm5lbHNba10uYml0c191c2VkKSAmIDEpCisJCQkJCXZhbCA9ICh2YWwgJiBjaGFubmVsc1trXS5tYXNrKSB8CisJCQkJCQl+Y2hhbm5lbHNba10ubWFzazsKKwkJCQkvKiBzcGVjaWFsIGNhc2UgZm9yIHRpbWVzdGFtcCAqLworCQkJCWlmIChjaGFubmVsc1trXS5zY2FsZSA9PSAxLjBmICYmCisJCQkJICAgIGNoYW5uZWxzW2tdLm9mZnNldCA9PSAwLjBmKQorCQkJCQlwcmludGYoIiUiIFBSSWQ2NCAiICIsIHZhbCk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIiUwNWYgIiwgKChmbG9hdCl2YWwgKworCQkJCQkJCSBjaGFubmVsc1trXS5vZmZzZXQpKgorCQkJCQkgICAgICAgY2hhbm5lbHNba10uc2NhbGUpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCXByaW50ZigiXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgbnVtX2xvb3BzID0gMjsKKwl1bnNpZ25lZCBsb25nIHRpbWVkZWxheSA9IDEwMDAwMDA7CisJdW5zaWduZWQgbG9uZyBidWZfbGVuID0gMTI4OworCisJaW50IHJldCwgYywgaSwgaiwgdG9yZWFkOworCWludCBmcDsKKworCWludCBudW1fY2hhbm5lbHM7CisJY2hhciAqdHJpZ2dlcl9uYW1lID0gTlVMTCwgKmRldmljZV9uYW1lID0gTlVMTDsKKwljaGFyICpkZXZfZGlyX25hbWUsICpidWZfZGlyX25hbWU7CisKKwlpbnQgZGF0YXJkeXRyaWdnZXIgPSAxOworCWNoYXIgKmRhdGE7CisJc3NpemVfdCByZWFkX3NpemU7CisJaW50IGRldl9udW0sIHRyaWdfbnVtOworCWNoYXIgKmJ1ZmZlcl9hY2Nlc3M7CisJaW50IHNjYW5fc2l6ZTsKKwlpbnQgbm9ldmVudHMgPSAwOworCWludCBub3RyaWdnZXIgPSAwOworCWNoYXIgKmR1bW15OworCisJc3RydWN0IGlpb19jaGFubmVsX2luZm8gKmNoYW5uZWxzOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJsOnc6YzpldDpuOmciKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ24nOgorCQkJZGV2aWNlX25hbWUgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQl0cmlnZ2VyX25hbWUgPSBvcHRhcmc7CisJCQlkYXRhcmR5dHJpZ2dlciA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQlub2V2ZW50cyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQludW1fbG9vcHMgPSBzdHJ0b3VsKG9wdGFyZywgJmR1bW15LCAxMCk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl0aW1lZGVsYXkgPSBzdHJ0b3VsKG9wdGFyZywgJmR1bW15LCAxMCk7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlidWZfbGVuID0gc3RydG91bChvcHRhcmcsICZkdW1teSwgMTApOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOgorCQkJbm90cmlnZ2VyID0gMTsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCWlmIChkZXZpY2VfbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwkvKiBGaW5kIHRoZSBkZXZpY2UgcmVxdWVzdGVkICovCisJZGV2X251bSA9IGZpbmRfdHlwZV9ieV9uYW1lKGRldmljZV9uYW1lLCAiaWlvOmRldmljZSIpOworCWlmIChkZXZfbnVtIDwgMCkgeworCQlwcmludGYoIkZhaWxlZCB0byBmaW5kIHRoZSAlc1xuIiwgZGV2aWNlX25hbWUpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJcHJpbnRmKCJpaW8gZGV2aWNlIG51bWJlciBiZWluZyB1c2VkIGlzICVkXG4iLCBkZXZfbnVtKTsKKworCWFzcHJpbnRmKCZkZXZfZGlyX25hbWUsICIlc2lpbzpkZXZpY2UlZCIsIGlpb19kaXIsIGRldl9udW0pOworCisJaWYgKCFub3RyaWdnZXIpIHsKKwkJaWYgKHRyaWdnZXJfbmFtZSA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogQnVpbGQgdGhlIHRyaWdnZXIgbmFtZS4gSWYgaXQgaXMgZGV2aWNlIGFzc29jaWF0ZWQKKwkJCSAqIGl0cyBuYW1lIGlzIDxkZXZpY2VfbmFtZT5fZGV2W25dIHdoZXJlIG4gbWF0Y2hlcworCQkJICogdGhlIGRldmljZSBudW1iZXIgZm91bmQgYWJvdmUuCisJCQkgKi8KKwkJCXJldCA9IGFzcHJpbnRmKCZ0cmlnZ2VyX25hbWUsCisJCQkJICAgICAgICIlcy1kZXYlZCIsIGRldmljZV9uYW1lLCBkZXZfbnVtKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycm9yX3JldDsKKwkJCX0KKwkJfQorCisJCS8qIFZlcmlmeSB0aGUgdHJpZ2dlciBleGlzdHMgKi8KKwkJdHJpZ19udW0gPSBmaW5kX3R5cGVfYnlfbmFtZSh0cmlnZ2VyX25hbWUsICJ0cmlnZ2VyIik7CisJCWlmICh0cmlnX251bSA8IDApIHsKKwkJCXByaW50ZigiRmFpbGVkIHRvIGZpbmQgdGhlIHRyaWdnZXIgJXNcbiIsIHRyaWdnZXJfbmFtZSk7CisJCQlyZXQgPSAtRU5PREVWOworCQkJZ290byBlcnJvcl9mcmVlX3RyaWdnZXJuYW1lOworCQl9CisJCXByaW50ZigiaWlvIHRyaWdnZXIgbnVtYmVyIGJlaW5nIHVzZWQgaXMgJWRcbiIsIHRyaWdfbnVtKTsKKwl9IGVsc2UKKwkJcHJpbnRmKCJ0cmlnZ2VyLWxlc3MgbW9kZSBzZWxlY3RlZFxuIik7CisKKwkvKgorCSAqIFBhcnNlIHRoZSBmaWxlcyBpbiBzY2FuX2VsZW1lbnRzIHRvIGlkZW50aWZ5IHdoYXQgY2hhbm5lbHMgYXJlCisJICogcHJlc2VudAorCSAqLworCXJldCA9IGJ1aWxkX2NoYW5uZWxfYXJyYXkoZGV2X2Rpcl9uYW1lLCAmY2hhbm5lbHMsICZudW1fY2hhbm5lbHMpOworCWlmIChyZXQpIHsKKwkJcHJpbnRmKCJQcm9ibGVtIHJlYWRpbmcgc2NhbiBlbGVtZW50IGluZm9ybWF0aW9uXG4iKTsKKwkJcHJpbnRmKCJkaWFnICVzXG4iLCBkZXZfZGlyX25hbWUpOworCQlnb3RvIGVycm9yX2ZyZWVfdHJpZ2dlcm5hbWU7CisJfQorCisJLyoKKwkgKiBDb25zdHJ1Y3QgdGhlIGRpcmVjdG9yeSBuYW1lIGZvciB0aGUgYXNzb2NpYXRlZCBidWZmZXIuCisJICogQXMgd2Uga25vdyB0aGF0IHRoZSBsaXMzbDAyZHEgaGFzIG9ubHkgb25lIGJ1ZmZlciB0aGlzIG1heQorCSAqIGJlIGJ1aWx0IHJhdGhlciB0aGFuIGZvdW5kLgorCSAqLworCXJldCA9IGFzcHJpbnRmKCZidWZfZGlyX25hbWUsCisJCSAgICAgICAiJXNpaW86ZGV2aWNlJWQvYnVmZmVyIiwgaWlvX2RpciwgZGV2X251bSk7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX3RyaWdnZXJuYW1lOworCX0KKworCWlmICghbm90cmlnZ2VyKSB7CisJCXByaW50ZigiJXMgJXNcbiIsIGRldl9kaXJfbmFtZSwgdHJpZ2dlcl9uYW1lKTsKKwkJLyogU2V0IHRoZSBkZXZpY2UgdHJpZ2dlciB0byBiZSB0aGUgZGF0YSByZWFkeSB0cmlnZ2VyIGZvdW5kCisJCSAqIGFib3ZlICovCisJCXJldCA9IHdyaXRlX3N5c2ZzX3N0cmluZ19hbmRfdmVyaWZ5KCJ0cmlnZ2VyL2N1cnJlbnRfdHJpZ2dlciIsCisJCQkJCQkgICAgZGV2X2Rpcl9uYW1lLAorCQkJCQkJICAgIHRyaWdnZXJfbmFtZSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGYoIkZhaWxlZCB0byB3cml0ZSBjdXJyZW50X3RyaWdnZXIgZmlsZVxuIik7CisJCQlnb3RvIGVycm9yX2ZyZWVfYnVmX2Rpcl9uYW1lOworCQl9CisJfQorCisJLyogU2V0dXAgcmluZyBidWZmZXIgcGFyYW1ldGVycyAqLworCXJldCA9IHdyaXRlX3N5c2ZzX2ludCgibGVuZ3RoIiwgYnVmX2Rpcl9uYW1lLCBidWZfbGVuKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9mcmVlX2J1Zl9kaXJfbmFtZTsKKworCS8qIEVuYWJsZSB0aGUgYnVmZmVyICovCisJcmV0ID0gd3JpdGVfc3lzZnNfaW50KCJlbmFibGUiLCBidWZfZGlyX25hbWUsIDEpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycm9yX2ZyZWVfYnVmX2Rpcl9uYW1lOworCXNjYW5fc2l6ZSA9IHNpemVfZnJvbV9jaGFubmVsYXJyYXkoY2hhbm5lbHMsIG51bV9jaGFubmVscyk7CisJZGF0YSA9IG1hbGxvYyhzY2FuX3NpemUqYnVmX2xlbik7CisJaWYgKCFkYXRhKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9idWZfZGlyX25hbWU7CisJfQorCisJcmV0ID0gYXNwcmludGYoJmJ1ZmZlcl9hY2Nlc3MsICIvZGV2L2lpbzpkZXZpY2UlZCIsIGRldl9udW0pOworCWlmIChyZXQgPCAwKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9kYXRhOworCX0KKworCS8qIEF0dGVtcHQgdG8gb3BlbiBub24gYmxvY2tpbmcgdGhlIGFjY2VzcyBkZXYgKi8KKwlmcCA9IG9wZW4oYnVmZmVyX2FjY2VzcywgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsKKwlpZiAoZnAgPT0gLTEpIHsgLyogSWYgaXQgaXNuJ3QgdGhlcmUgbWFrZSB0aGUgbm9kZSAqLworCQlwcmludGYoIkZhaWxlZCB0byBvcGVuICVzXG4iLCBidWZmZXJfYWNjZXNzKTsKKwkJcmV0ID0gLWVycm5vOworCQlnb3RvIGVycm9yX2ZyZWVfYnVmZmVyX2FjY2VzczsKKwl9CisKKwkvKiBXYWl0IGZvciBldmVudHMgMTAgdGltZXMgKi8KKwlmb3IgKGogPSAwOyBqIDwgbnVtX2xvb3BzOyBqKyspIHsKKwkJaWYgKCFub2V2ZW50cykgeworCQkJc3RydWN0IHBvbGxmZCBwZmQgPSB7CisJCQkJLmZkID0gZnAsCisJCQkJLmV2ZW50cyA9IFBPTExJTiwKKwkJCX07CisKKwkJCXBvbGwoJnBmZCwgMSwgLTEpOworCQkJdG9yZWFkID0gYnVmX2xlbjsKKworCQl9IGVsc2UgeworCQkJdXNsZWVwKHRpbWVkZWxheSk7CisJCQl0b3JlYWQgPSA2NDsKKwkJfQorCisJCXJlYWRfc2l6ZSA9IHJlYWQoZnAsCisJCQkJIGRhdGEsCisJCQkJIHRvcmVhZCpzY2FuX3NpemUpOworCQlpZiAocmVhZF9zaXplIDwgMCkgeworCQkJaWYgKGVycm5vID09IC1FQUdBSU4pIHsKKwkJCQlwcmludGYoIm5vdGhpbmcgYXZhaWxhYmxlXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZQorCQkJCWJyZWFrOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCByZWFkX3NpemUvc2Nhbl9zaXplOyBpKyspCisJCQlwcm9jZXNzX3NjYW4oZGF0YSArIHNjYW5fc2l6ZSppLAorCQkJCSAgICAgY2hhbm5lbHMsCisJCQkJICAgICBudW1fY2hhbm5lbHMpOworCX0KKworCS8qIFN0b3AgdGhlIGJ1ZmZlciAqLworCXJldCA9IHdyaXRlX3N5c2ZzX2ludCgiZW5hYmxlIiwgYnVmX2Rpcl9uYW1lLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcl9jbG9zZV9idWZmZXJfYWNjZXNzOworCisJaWYgKCFub3RyaWdnZXIpCisJCS8qIERpc2Nvbm5lY3QgdGhlIHRyaWdnZXIgLSBqdXN0IHdyaXRlIGEgZHVtbXkgbmFtZS4gKi8KKwkJd3JpdGVfc3lzZnNfc3RyaW5nKCJ0cmlnZ2VyL2N1cnJlbnRfdHJpZ2dlciIsCisJCQkJICAgZGV2X2Rpcl9uYW1lLCAiTlVMTCIpOworCitlcnJvcl9jbG9zZV9idWZmZXJfYWNjZXNzOgorCWNsb3NlKGZwKTsKK2Vycm9yX2ZyZWVfZGF0YToKKwlmcmVlKGRhdGEpOworZXJyb3JfZnJlZV9idWZmZXJfYWNjZXNzOgorCWZyZWUoYnVmZmVyX2FjY2Vzcyk7CitlcnJvcl9mcmVlX2J1Zl9kaXJfbmFtZToKKwlmcmVlKGJ1Zl9kaXJfbmFtZSk7CitlcnJvcl9mcmVlX3RyaWdnZXJuYW1lOgorCWlmIChkYXRhcmR5dHJpZ2dlcikKKwkJZnJlZSh0cmlnZ2VyX25hbWUpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9paW8vaWlvX2V2ZW50X21vbml0b3IuYyBiL3Rvb2xzL2lpby9paW9fZXZlbnRfbW9uaXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyN2MyNzEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9paW8vaWlvX2V2ZW50X21vbml0b3IuYwpAQCAtMCwwICsxLDMwOCBAQAorLyogSW5kdXN0cmlhbGlvIGV2ZW50IHRlc3QgY29kZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiBMYXJzLVBldGVyIENsYXVzZW4gPGxhcnNAbWV0YWZvby5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBwcmltYXJpbHkgaW50ZW5kZWQgYXMgYW4gZXhhbXBsZSBhcHBsaWNhdGlvbi4KKyAqIFJlYWRzIHRoZSBjdXJyZW50IGJ1ZmZlciBzZXR1cCBmcm9tIHN5c2ZzIGFuZCBzdGFydHMgYSBzaG9ydCBjYXB0dXJlCisgKiBmcm9tIHRoZSBzcGVjaWZpZWQgZGV2aWNlLCBwcmV0dHkgcHJpbnRpbmcgdGhlIHJlc3VsdCBhZnRlciBhcHByb3ByaWF0ZQorICogY29udmVyc2lvbi4KKyAqCisgKiBVc2FnZToKKyAqCWlpb19ldmVudF9tb25pdG9yIDxkZXZpY2VfbmFtZT4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSAiaWlvX3V0aWxzLmgiCisjaW5jbHVkZSA8bGludXgvaWlvL2V2ZW50cy5oPgorI2luY2x1ZGUgPGxpbnV4L2lpby90eXBlcy5oPgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpb19jaGFuX3R5cGVfbmFtZV9zcGVjW10gPSB7CisJW0lJT19WT0xUQUdFXSA9ICJ2b2x0YWdlIiwKKwlbSUlPX0NVUlJFTlRdID0gImN1cnJlbnQiLAorCVtJSU9fUE9XRVJdID0gInBvd2VyIiwKKwlbSUlPX0FDQ0VMXSA9ICJhY2NlbCIsCisJW0lJT19BTkdMX1ZFTF0gPSAiYW5nbHZlbCIsCisJW0lJT19NQUdOXSA9ICJtYWduIiwKKwlbSUlPX0xJR0hUXSA9ICJpbGx1bWluYW5jZSIsCisJW0lJT19JTlRFTlNJVFldID0gImludGVuc2l0eSIsCisJW0lJT19QUk9YSU1JVFldID0gInByb3hpbWl0eSIsCisJW0lJT19URU1QXSA9ICJ0ZW1wIiwKKwlbSUlPX0lOQ0xJXSA9ICJpbmNsaSIsCisJW0lJT19ST1RdID0gInJvdCIsCisJW0lJT19BTkdMXSA9ICJhbmdsIiwKKwlbSUlPX1RJTUVTVEFNUF0gPSAidGltZXN0YW1wIiwKKwlbSUlPX0NBUEFDSVRBTkNFXSA9ICJjYXBhY2l0YW5jZSIsCisJW0lJT19BTFRWT0xUQUdFXSA9ICJhbHR2b2x0YWdlIiwKKwlbSUlPX0NDVF0gPSAiY2N0IiwKKwlbSUlPX1BSRVNTVVJFXSA9ICJwcmVzc3VyZSIsCisJW0lJT19IVU1JRElUWVJFTEFUSVZFXSA9ICJodW1pZGl0eXJlbGF0aXZlIiwKKwlbSUlPX0FDVElWSVRZXSA9ICJhY3Rpdml0eSIsCisJW0lJT19TVEVQU10gPSAic3RlcHMiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBpaW9fZXZfdHlwZV90ZXh0W10gPSB7CisJW0lJT19FVl9UWVBFX1RIUkVTSF0gPSAidGhyZXNoIiwKKwlbSUlPX0VWX1RZUEVfTUFHXSA9ICJtYWciLAorCVtJSU9fRVZfVFlQRV9ST0NdID0gInJvYyIsCisJW0lJT19FVl9UWVBFX1RIUkVTSF9BREFQVElWRV0gPSAidGhyZXNoX2FkYXB0aXZlIiwKKwlbSUlPX0VWX1RZUEVfTUFHX0FEQVBUSVZFXSA9ICJtYWdfYWRhcHRpdmUiLAorCVtJSU9fRVZfVFlQRV9DSEFOR0VdID0gImNoYW5nZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGlpb19ldl9kaXJfdGV4dFtdID0geworCVtJSU9fRVZfRElSX0VJVEhFUl0gPSAiZWl0aGVyIiwKKwlbSUlPX0VWX0RJUl9SSVNJTkddID0gInJpc2luZyIsCisJW0lJT19FVl9ESVJfRkFMTElOR10gPSAiZmFsbGluZyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaWlvX21vZGlmaWVyX25hbWVzW10gPSB7CisJW0lJT19NT0RfWF0gPSAieCIsCisJW0lJT19NT0RfWV0gPSAieSIsCisJW0lJT19NT0RfWl0gPSAieiIsCisJW0lJT19NT0RfWF9BTkRfWV0gPSAieCZ5IiwKKwlbSUlPX01PRF9YX0FORF9aXSA9ICJ4JnoiLAorCVtJSU9fTU9EX1lfQU5EX1pdID0gInkmeiIsCisJW0lJT19NT0RfWF9BTkRfWV9BTkRfWl0gPSAieCZ5JnoiLAorCVtJSU9fTU9EX1hfT1JfWV0gPSAieHx5IiwKKwlbSUlPX01PRF9YX09SX1pdID0gInh8eiIsCisJW0lJT19NT0RfWV9PUl9aXSA9ICJ5fHoiLAorCVtJSU9fTU9EX1hfT1JfWV9PUl9aXSA9ICJ4fHl8eiIsCisJW0lJT19NT0RfTElHSFRfQk9USF0gPSAiYm90aCIsCisJW0lJT19NT0RfTElHSFRfSVJdID0gImlyIiwKKwlbSUlPX01PRF9ST09UX1NVTV9TUVVBUkVEX1hfWV0gPSAic3FydCh4XjIreV4yKSIsCisJW0lJT19NT0RfU1VNX1NRVUFSRURfWF9ZX1pdID0gInheMit5XjIrel4yIiwKKwlbSUlPX01PRF9MSUdIVF9DTEVBUl0gPSAiY2xlYXIiLAorCVtJSU9fTU9EX0xJR0hUX1JFRF0gPSAicmVkIiwKKwlbSUlPX01PRF9MSUdIVF9HUkVFTl0gPSAiZ3JlZW4iLAorCVtJSU9fTU9EX0xJR0hUX0JMVUVdID0gImJsdWUiLAorCVtJSU9fTU9EX1FVQVRFUk5JT05dID0gInF1YXRlcm5pb24iLAorCVtJSU9fTU9EX1RFTVBfQU1CSUVOVF0gPSAiYW1iaWVudCIsCisJW0lJT19NT0RfVEVNUF9PQkpFQ1RdID0gIm9iamVjdCIsCisJW0lJT19NT0RfTk9SVEhfTUFHTl0gPSAiZnJvbV9ub3J0aF9tYWduZXRpYyIsCisJW0lJT19NT0RfTk9SVEhfVFJVRV0gPSAiZnJvbV9ub3J0aF90cnVlIiwKKwlbSUlPX01PRF9OT1JUSF9NQUdOX1RJTFRfQ09NUF0gPSAiZnJvbV9ub3J0aF9tYWduZXRpY190aWx0X2NvbXAiLAorCVtJSU9fTU9EX05PUlRIX1RSVUVfVElMVF9DT01QXSA9ICJmcm9tX25vcnRoX3RydWVfdGlsdF9jb21wIiwKKwlbSUlPX01PRF9SVU5OSU5HXSA9ICJydW5uaW5nIiwKKwlbSUlPX01PRF9KT0dHSU5HXSA9ICJqb2dnaW5nIiwKKwlbSUlPX01PRF9XQUxLSU5HXSA9ICJ3YWxraW5nIiwKKwlbSUlPX01PRF9TVElMTF0gPSAic3RpbGwiLAorfTsKKworc3RhdGljIGJvb2wgZXZlbnRfaXNfa25vd24oc3RydWN0IGlpb19ldmVudF9kYXRhICpldmVudCkKK3sKKwllbnVtIGlpb19jaGFuX3R5cGUgdHlwZSA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfQ0hBTl9UWVBFKGV2ZW50LT5pZCk7CisJZW51bSBpaW9fbW9kaWZpZXIgbW9kID0gSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9NT0RJRklFUihldmVudC0+aWQpOworCWVudW0gaWlvX2V2ZW50X3R5cGUgZXZfdHlwZSA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfVFlQRShldmVudC0+aWQpOworCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIgPSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0RJUihldmVudC0+aWQpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBJSU9fVk9MVEFHRToKKwljYXNlIElJT19DVVJSRU5UOgorCWNhc2UgSUlPX1BPV0VSOgorCWNhc2UgSUlPX0FDQ0VMOgorCWNhc2UgSUlPX0FOR0xfVkVMOgorCWNhc2UgSUlPX01BR046CisJY2FzZSBJSU9fTElHSFQ6CisJY2FzZSBJSU9fSU5URU5TSVRZOgorCWNhc2UgSUlPX1BST1hJTUlUWToKKwljYXNlIElJT19URU1QOgorCWNhc2UgSUlPX0lOQ0xJOgorCWNhc2UgSUlPX1JPVDoKKwljYXNlIElJT19BTkdMOgorCWNhc2UgSUlPX1RJTUVTVEFNUDoKKwljYXNlIElJT19DQVBBQ0lUQU5DRToKKwljYXNlIElJT19BTFRWT0xUQUdFOgorCWNhc2UgSUlPX0NDVDoKKwljYXNlIElJT19QUkVTU1VSRToKKwljYXNlIElJT19IVU1JRElUWVJFTEFUSVZFOgorCWNhc2UgSUlPX0FDVElWSVRZOgorCWNhc2UgSUlPX1NURVBTOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJc3dpdGNoIChtb2QpIHsKKwljYXNlIElJT19OT19NT0Q6CisJY2FzZSBJSU9fTU9EX1g6CisJY2FzZSBJSU9fTU9EX1k6CisJY2FzZSBJSU9fTU9EX1o6CisJY2FzZSBJSU9fTU9EX1hfQU5EX1k6CisJY2FzZSBJSU9fTU9EX1hfQU5EX1o6CisJY2FzZSBJSU9fTU9EX1lfQU5EX1o6CisJY2FzZSBJSU9fTU9EX1hfQU5EX1lfQU5EX1o6CisJY2FzZSBJSU9fTU9EX1hfT1JfWToKKwljYXNlIElJT19NT0RfWF9PUl9aOgorCWNhc2UgSUlPX01PRF9ZX09SX1o6CisJY2FzZSBJSU9fTU9EX1hfT1JfWV9PUl9aOgorCWNhc2UgSUlPX01PRF9MSUdIVF9CT1RIOgorCWNhc2UgSUlPX01PRF9MSUdIVF9JUjoKKwljYXNlIElJT19NT0RfUk9PVF9TVU1fU1FVQVJFRF9YX1k6CisJY2FzZSBJSU9fTU9EX1NVTV9TUVVBUkVEX1hfWV9aOgorCWNhc2UgSUlPX01PRF9MSUdIVF9DTEVBUjoKKwljYXNlIElJT19NT0RfTElHSFRfUkVEOgorCWNhc2UgSUlPX01PRF9MSUdIVF9HUkVFTjoKKwljYXNlIElJT19NT0RfTElHSFRfQkxVRToKKwljYXNlIElJT19NT0RfUVVBVEVSTklPTjoKKwljYXNlIElJT19NT0RfVEVNUF9BTUJJRU5UOgorCWNhc2UgSUlPX01PRF9URU1QX09CSkVDVDoKKwljYXNlIElJT19NT0RfTk9SVEhfTUFHTjoKKwljYXNlIElJT19NT0RfTk9SVEhfVFJVRToKKwljYXNlIElJT19NT0RfTk9SVEhfTUFHTl9USUxUX0NPTVA6CisJY2FzZSBJSU9fTU9EX05PUlRIX1RSVUVfVElMVF9DT01QOgorCWNhc2UgSUlPX01PRF9SVU5OSU5HOgorCWNhc2UgSUlPX01PRF9KT0dHSU5HOgorCWNhc2UgSUlPX01PRF9XQUxLSU5HOgorCWNhc2UgSUlPX01PRF9TVElMTDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN3aXRjaCAoZXZfdHlwZSkgeworCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIOgorCWNhc2UgSUlPX0VWX1RZUEVfTUFHOgorCWNhc2UgSUlPX0VWX1RZUEVfUk9DOgorCWNhc2UgSUlPX0VWX1RZUEVfVEhSRVNIX0FEQVBUSVZFOgorCWNhc2UgSUlPX0VWX1RZUEVfTUFHX0FEQVBUSVZFOgorCWNhc2UgSUlPX0VWX1RZUEVfQ0hBTkdFOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJc3dpdGNoIChkaXIpIHsKKwljYXNlIElJT19FVl9ESVJfRUlUSEVSOgorCWNhc2UgSUlPX0VWX0RJUl9SSVNJTkc6CisJY2FzZSBJSU9fRVZfRElSX0ZBTExJTkc6CisJY2FzZSBJSU9fRVZfRElSX05PTkU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZXZlbnQoc3RydWN0IGlpb19ldmVudF9kYXRhICpldmVudCkKK3sKKwllbnVtIGlpb19jaGFuX3R5cGUgdHlwZSA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfQ0hBTl9UWVBFKGV2ZW50LT5pZCk7CisJZW51bSBpaW9fbW9kaWZpZXIgbW9kID0gSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9NT0RJRklFUihldmVudC0+aWQpOworCWVudW0gaWlvX2V2ZW50X3R5cGUgZXZfdHlwZSA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfVFlQRShldmVudC0+aWQpOworCWVudW0gaWlvX2V2ZW50X2RpcmVjdGlvbiBkaXIgPSBJSU9fRVZFTlRfQ09ERV9FWFRSQUNUX0RJUihldmVudC0+aWQpOworCWludCBjaGFuID0gSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9DSEFOKGV2ZW50LT5pZCk7CisJaW50IGNoYW4yID0gSUlPX0VWRU5UX0NPREVfRVhUUkFDVF9DSEFOMihldmVudC0+aWQpOworCWJvb2wgZGlmZiA9IElJT19FVkVOVF9DT0RFX0VYVFJBQ1RfRElGRihldmVudC0+aWQpOworCisJaWYgKCFldmVudF9pc19rbm93bihldmVudCkpIHsKKwkJcHJpbnRmKCJVbmtub3duIGV2ZW50OiB0aW1lOiAlbGxkLCBpZDogJWxseFxuIiwKKwkJCQlldmVudC0+dGltZXN0YW1wLCBldmVudC0+aWQpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKCJFdmVudDogdGltZTogJWxsZCwgIiwgZXZlbnQtPnRpbWVzdGFtcCk7CisKKwlpZiAobW9kICE9IElJT19OT19NT0QpIHsKKwkJcHJpbnRmKCJ0eXBlOiAlcyglcyksICIsCisJCQlpaW9fY2hhbl90eXBlX25hbWVfc3BlY1t0eXBlXSwKKwkJCWlpb19tb2RpZmllcl9uYW1lc1ttb2RdKTsKKwl9IGVsc2UgeworCQlwcmludGYoInR5cGU6ICVzLCAiLAorCQkJaWlvX2NoYW5fdHlwZV9uYW1lX3NwZWNbdHlwZV0pOworCX0KKworCWlmIChkaWZmICYmIGNoYW4gPj0gMCAmJiBjaGFuMiA+PSAwKQorCQlwcmludGYoImNoYW5uZWw6ICVkLSVkLCAiLCBjaGFuLCBjaGFuMik7CisJZWxzZSBpZiAoY2hhbiA+PSAwKQorCQlwcmludGYoImNoYW5uZWw6ICVkLCAiLCBjaGFuKTsKKworCXByaW50ZigiZXZ0eXBlOiAlcyIsIGlpb19ldl90eXBlX3RleHRbZXZfdHlwZV0pOworCisJaWYgKGRpciAhPSBJSU9fRVZfRElSX05PTkUpCisJCXByaW50ZigiLCBkaXJlY3Rpb246ICVzIiwgaWlvX2V2X2Rpcl90ZXh0W2Rpcl0pOworCXByaW50ZigiXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBpaW9fZXZlbnRfZGF0YSBldmVudDsKKwljb25zdCBjaGFyICpkZXZpY2VfbmFtZTsKKwljaGFyICpjaHJkZXZfbmFtZTsKKwlpbnQgcmV0OworCWludCBkZXZfbnVtOworCWludCBmZCwgZXZlbnRfZmQ7CisKKwlpZiAoYXJnYyA8PSAxKSB7CisJCXByaW50ZigiVXNhZ2U6ICVzIDxkZXZpY2VfbmFtZT5cbiIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gLTE7CisJfQorCisJZGV2aWNlX25hbWUgPSBhcmd2WzFdOworCisJZGV2X251bSA9IGZpbmRfdHlwZV9ieV9uYW1lKGRldmljZV9uYW1lLCAiaWlvOmRldmljZSIpOworCWlmIChkZXZfbnVtID49IDApIHsKKwkJcHJpbnRmKCJGb3VuZCBJSU8gZGV2aWNlIHdpdGggbmFtZSAlcyB3aXRoIGRldmljZSBudW1iZXIgJWRcbiIsCisJCQlkZXZpY2VfbmFtZSwgZGV2X251bSk7CisJCXJldCA9IGFzcHJpbnRmKCZjaHJkZXZfbmFtZSwgIi9kZXYvaWlvOmRldmljZSVkIiwgZGV2X251bSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJZ290byBlcnJvcl9yZXQ7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJZiB3ZSBjYW4ndCBmaW5kIGEgSUlPIGRldmljZSBieSBuYW1lIGFzc3VtZSBkZXZpY2VfbmFtZSBpcyBhCisJCSAgIElJTyBjaHJkZXYgKi8KKwkJY2hyZGV2X25hbWUgPSBzdHJkdXAoZGV2aWNlX25hbWUpOworCX0KKworCWZkID0gb3BlbihjaHJkZXZfbmFtZSwgMCk7CisJaWYgKGZkID09IC0xKSB7CisJCWZwcmludGYoc3Rkb3V0LCAiRmFpbGVkIHRvIG9wZW4gJXNcbiIsIGNocmRldl9uYW1lKTsKKwkJcmV0ID0gLWVycm5vOworCQlnb3RvIGVycm9yX2ZyZWVfY2hyZGV2X25hbWU7CisJfQorCisJcmV0ID0gaW9jdGwoZmQsIElJT19HRVRfRVZFTlRfRkRfSU9DVEwsICZldmVudF9mZCk7CisKKwljbG9zZShmZCk7CisKKwlpZiAocmV0ID09IC0xIHx8IGV2ZW50X2ZkID09IC0xKSB7CisJCWZwcmludGYoc3Rkb3V0LCAiRmFpbGVkIHRvIHJldHJpZXZlIGV2ZW50IGZkXG4iKTsKKwkJcmV0ID0gLWVycm5vOworCQlnb3RvIGVycm9yX2ZyZWVfY2hyZGV2X25hbWU7CisJfQorCisJd2hpbGUgKHRydWUpIHsKKwkJcmV0ID0gcmVhZChldmVudF9mZCwgJmV2ZW50LCBzaXplb2YoZXZlbnQpKTsKKwkJaWYgKHJldCA9PSAtMSkgeworCQkJaWYgKGVycm5vID09IEVBR0FJTikgeworCQkJCXByaW50Zigibm90aGluZyBhdmFpbGFibGVcbiIpOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlwZXJyb3IoIkZhaWxlZCB0byByZWFkIGV2ZW50IGZyb20gZGV2aWNlIik7CisJCQkJcmV0ID0gLWVycm5vOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcHJpbnRfZXZlbnQoJmV2ZW50KTsKKwl9CisKKwljbG9zZShldmVudF9mZCk7CitlcnJvcl9mcmVlX2NocmRldl9uYW1lOgorCWZyZWUoY2hyZGV2X25hbWUpOworZXJyb3JfcmV0OgorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9paW8vaWlvX3V0aWxzLmMgYi90b29scy9paW8vaWlvX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2NDUyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lpby9paW9fdXRpbHMuYwpAQCAtMCwwICsxLDY2OSBAQAorLyogSUlPIC0gdXNlZnVsIHNldCBvZiB1dGlsIGZ1bmN0aW9uYWxpdHkKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggSm9uYXRoYW4gQ2FtZXJvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX0lJT19VVElMU19ICisjZGVmaW5lIF9JSU9fVVRJTFNfSAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAiaWlvX3V0aWxzLmgiCisKK2NvbnN0IGNoYXIgKmlpb19kaXIgPSAiL3N5cy9idXMvaWlvL2RldmljZXMvIjsKKworc3RhdGljIGNoYXIgKiBjb25zdCBpaW9fZGlyZWN0aW9uW10gPSB7CisJImluIiwKKwkib3V0IiwKK307CisKKy8qKgorICogaWlvdXRpbHNfYnJlYWtfdXBfbmFtZSgpIC0gZXh0cmFjdCBnZW5lcmljIG5hbWUgZnJvbSBmdWxsIGNoYW5uZWwgbmFtZQorICogQGZ1bGxfbmFtZTogdGhlIGZ1bGwgY2hhbm5lbCBuYW1lCisgKiBAZ2VuZXJpY19uYW1lOiB0aGUgb3V0cHV0IGdlbmVyaWMgY2hhbm5lbCBuYW1lCisgKiovCitpbnQgaWlvdXRpbHNfYnJlYWtfdXBfbmFtZShjb25zdCBjaGFyICpmdWxsX25hbWUsCisJCQkJICBjaGFyICoqZ2VuZXJpY19uYW1lKQoreworCWNoYXIgKmN1cnJlbnQ7CisJY2hhciAqdywgKnI7CisJY2hhciAqd29ya2luZywgKnByZWZpeCA9ICIiOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihpaW9fZGlyZWN0aW9uKSAvIHNpemVvZihpaW9fZGlyZWN0aW9uWzBdKTsgaSsrKQorCQlpZiAoIXN0cm5jbXAoZnVsbF9uYW1lLCBpaW9fZGlyZWN0aW9uW2ldLAorCQkJICAgICBzdHJsZW4oaWlvX2RpcmVjdGlvbltpXSkpKSB7CisJCQlwcmVmaXggPSBpaW9fZGlyZWN0aW9uW2ldOworCQkJYnJlYWs7CisJCX0KKworCWN1cnJlbnQgPSBzdHJkdXAoZnVsbF9uYW1lICsgc3RybGVuKHByZWZpeCkgKyAxKTsKKwl3b3JraW5nID0gc3RydG9rKGN1cnJlbnQsICJfXDAiKTsKKworCXcgPSB3b3JraW5nOworCXIgPSB3b3JraW5nOworCisJd2hpbGUgKCpyICE9ICdcMCcpIHsKKwkJaWYgKCFpc2RpZ2l0KCpyKSkgeworCQkJKncgPSAqcjsKKwkJCXcrKzsKKwkJfQorCQlyKys7CisJfQorCSp3ID0gJ1wwJzsKKwlhc3ByaW50ZihnZW5lcmljX25hbWUsICIlc18lcyIsIHByZWZpeCwgd29ya2luZyk7CisJZnJlZShjdXJyZW50KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlpb3V0aWxzX2dldF90eXBlKCkgLSBmaW5kIGFuZCBwcm9jZXNzIF90eXBlIGF0dHJpYnV0ZSBkYXRhCisgKiBAaXNfc2lnbmVkOiBvdXRwdXQgd2hldGhlciBjaGFubmVsIGlzIHNpZ25lZAorICogQGJ5dGVzOiBvdXRwdXQgaG93IG1hbnkgYnl0ZXMgdGhlIGNoYW5uZWwgc3RvcmFnZSBvY2N1cGllcworICogQG1hc2s6IG91dHB1dCBhIGJpdCBtYXNrIGZvciB0aGUgcmF3IGRhdGEKKyAqIEBiZTogYmlnIGVuZGlhbgorICogQGRldmljZV9kaXI6IHRoZSBpaW8gZGV2aWNlIGRpcmVjdG9yeQorICogQG5hbWU6IHRoZSBjaGFubmVsIG5hbWUKKyAqIEBnZW5lcmljX25hbWU6IHRoZSBjaGFubmVsIHR5cGUgbmFtZQorICoqLworaW50IGlpb3V0aWxzX2dldF90eXBlKHVuc2lnbmVkICppc19zaWduZWQsCisJCQkgICAgIHVuc2lnbmVkICpieXRlcywKKwkJCSAgICAgdW5zaWduZWQgKmJpdHNfdXNlZCwKKwkJCSAgICAgdW5zaWduZWQgKnNoaWZ0LAorCQkJICAgICB1aW50NjRfdCAqbWFzaywKKwkJCSAgICAgdW5zaWduZWQgKmJlLAorCQkJICAgICBjb25zdCBjaGFyICpkZXZpY2VfZGlyLAorCQkJICAgICBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICBjb25zdCBjaGFyICpnZW5lcmljX25hbWUpCit7CisJRklMRSAqc3lzZnNmcDsKKwlpbnQgcmV0OworCURJUiAqZHA7CisJY2hhciAqc2Nhbl9lbF9kaXIsICpidWlsdG5hbWUsICpidWlsdG5hbWVfZ2VuZXJpYywgKmZpbGVuYW1lID0gMDsKKwljaGFyIHNpZ25jaGFyLCBlbmRpYW5jaGFyOworCXVuc2lnbmVkIHBhZGludDsKKwljb25zdCBzdHJ1Y3QgZGlyZW50ICplbnQ7CisKKwlyZXQgPSBhc3ByaW50Zigmc2Nhbl9lbF9kaXIsIEZPUk1BVF9TQ0FOX0VMRU1FTlRTX0RJUiwgZGV2aWNlX2Rpcik7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXJldCA9IGFzcHJpbnRmKCZidWlsdG5hbWUsIEZPUk1BVF9UWVBFX0ZJTEUsIG5hbWUpOworCWlmIChyZXQgPCAwKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9zY2FuX2VsX2RpcjsKKwl9CisJcmV0ID0gYXNwcmludGYoJmJ1aWx0bmFtZV9nZW5lcmljLCBGT1JNQVRfVFlQRV9GSUxFLCBnZW5lcmljX25hbWUpOworCWlmIChyZXQgPCAwKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV9idWlsdG5hbWU7CisJfQorCisJZHAgPSBvcGVuZGlyKHNjYW5fZWxfZGlyKTsKKwlpZiAoZHAgPT0gTlVMTCkgeworCQlyZXQgPSAtZXJybm87CisJCWdvdG8gZXJyb3JfZnJlZV9idWlsdG5hbWVfZ2VuZXJpYzsKKwl9CisJd2hpbGUgKGVudCA9IHJlYWRkaXIoZHApLCBlbnQgIT0gTlVMTCkKKwkJLyoKKwkJICogRG8gd2UgYWxsb3cgZGV2aWNlcyB0byBvdmVycmlkZSBhIGdlbmVyaWMgbmFtZSB3aXRoCisJCSAqIGEgc3BlY2lmaWMgb25lPworCQkgKi8KKwkJaWYgKChzdHJjbXAoYnVpbHRuYW1lLCBlbnQtPmRfbmFtZSkgPT0gMCkgfHwKKwkJICAgIChzdHJjbXAoYnVpbHRuYW1lX2dlbmVyaWMsIGVudC0+ZF9uYW1lKSA9PSAwKSkgeworCQkJcmV0ID0gYXNwcmludGYoJmZpbGVuYW1lLAorCQkJCSAgICAgICAiJXMvJXMiLCBzY2FuX2VsX2RpciwgZW50LT5kX25hbWUpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyb3JfY2xvc2VkaXI7CisJCQl9CisJCQlzeXNmc2ZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisJCQlpZiAoc3lzZnNmcCA9PSBOVUxMKSB7CisJCQkJcHJpbnRmKCJmYWlsZWQgdG8gb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworCQkJCXJldCA9IC1lcnJubzsKKwkJCQlnb3RvIGVycm9yX2ZyZWVfZmlsZW5hbWU7CisJCQl9CisKKwkJCXJldCA9IGZzY2FuZihzeXNmc2ZwLAorCQkJCSAgICAgIiVjZTolYyV1LyV1Pj4ldSIsCisJCQkJICAgICAmZW5kaWFuY2hhciwKKwkJCQkgICAgICZzaWduY2hhciwKKwkJCQkgICAgIGJpdHNfdXNlZCwKKwkJCQkgICAgICZwYWRpbnQsIHNoaWZ0KTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJpbnRmKCJmYWlsZWQgdG8gcGFzcyBzY2FuIHR5cGUgZGVzY3JpcHRpb25cbiIpOworCQkJCXJldCA9IC1lcnJubzsKKwkJCQlnb3RvIGVycm9yX2Nsb3NlX3N5c2ZzZnA7CisJCQl9CisJCQkqYmUgPSAoZW5kaWFuY2hhciA9PSAnYicpOworCQkJKmJ5dGVzID0gcGFkaW50IC8gODsKKwkJCWlmICgqYml0c191c2VkID09IDY0KQorCQkJCSptYXNrID0gfjA7CisJCQllbHNlCisJCQkJKm1hc2sgPSAoMSA8PCAqYml0c191c2VkKSAtIDE7CisJCQlpZiAoc2lnbmNoYXIgPT0gJ3MnKQorCQkJCSppc19zaWduZWQgPSAxOworCQkJZWxzZQorCQkJCSppc19zaWduZWQgPSAwOworCQkJZmNsb3NlKHN5c2ZzZnApOworCQkJZnJlZShmaWxlbmFtZSk7CisKKwkJCWZpbGVuYW1lID0gMDsKKwkJCXN5c2ZzZnAgPSAwOworCQl9CitlcnJvcl9jbG9zZV9zeXNmc2ZwOgorCWlmIChzeXNmc2ZwKQorCQlmY2xvc2Uoc3lzZnNmcCk7CitlcnJvcl9mcmVlX2ZpbGVuYW1lOgorCWlmIChmaWxlbmFtZSkKKwkJZnJlZShmaWxlbmFtZSk7CitlcnJvcl9jbG9zZWRpcjoKKwljbG9zZWRpcihkcCk7CitlcnJvcl9mcmVlX2J1aWx0bmFtZV9nZW5lcmljOgorCWZyZWUoYnVpbHRuYW1lX2dlbmVyaWMpOworZXJyb3JfZnJlZV9idWlsdG5hbWU6CisJZnJlZShidWlsdG5hbWUpOworZXJyb3JfZnJlZV9zY2FuX2VsX2RpcjoKKwlmcmVlKHNjYW5fZWxfZGlyKTsKK2Vycm9yX3JldDoKKwlyZXR1cm4gcmV0OworfQorCitpbnQgaWlvdXRpbHNfZ2V0X3BhcmFtX2Zsb2F0KGZsb2F0ICpvdXRwdXQsCisJCQkJICAgIGNvbnN0IGNoYXIgKnBhcmFtX25hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKmRldmljZV9kaXIsCisJCQkJICAgIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgIGNvbnN0IGNoYXIgKmdlbmVyaWNfbmFtZSkKK3sKKwlGSUxFICpzeXNmc2ZwOworCWludCByZXQ7CisJRElSICpkcDsKKwljaGFyICpidWlsdG5hbWUsICpidWlsdG5hbWVfZ2VuZXJpYzsKKwljaGFyICpmaWxlbmFtZSA9IE5VTEw7CisJY29uc3Qgc3RydWN0IGRpcmVudCAqZW50OworCisJcmV0ID0gYXNwcmludGYoJmJ1aWx0bmFtZSwgIiVzXyVzIiwgbmFtZSwgcGFyYW1fbmFtZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9yZXQ7CisJfQorCXJldCA9IGFzcHJpbnRmKCZidWlsdG5hbWVfZ2VuZXJpYywKKwkJICAgICAgICIlc18lcyIsIGdlbmVyaWNfbmFtZSwgcGFyYW1fbmFtZSk7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9mcmVlX2J1aWx0bmFtZTsKKwl9CisJZHAgPSBvcGVuZGlyKGRldmljZV9kaXIpOworCWlmIChkcCA9PSBOVUxMKSB7CisJCXJldCA9IC1lcnJubzsKKwkJZ290byBlcnJvcl9mcmVlX2J1aWx0bmFtZV9nZW5lcmljOworCX0KKwl3aGlsZSAoZW50ID0gcmVhZGRpcihkcCksIGVudCAhPSBOVUxMKQorCQlpZiAoKHN0cmNtcChidWlsdG5hbWUsIGVudC0+ZF9uYW1lKSA9PSAwKSB8fAorCQkgICAgKHN0cmNtcChidWlsdG5hbWVfZ2VuZXJpYywgZW50LT5kX25hbWUpID09IDApKSB7CisJCQlyZXQgPSBhc3ByaW50ZigmZmlsZW5hbWUsCisJCQkJICAgICAgICIlcy8lcyIsIGRldmljZV9kaXIsIGVudC0+ZF9uYW1lKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycm9yX2Nsb3NlZGlyOworCQkJfQorCQkJc3lzZnNmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCQkJaWYgKCFzeXNmc2ZwKSB7CisJCQkJcmV0ID0gLWVycm5vOworCQkJCWdvdG8gZXJyb3JfZnJlZV9maWxlbmFtZTsKKwkJCX0KKwkJCWZzY2FuZihzeXNmc2ZwLCAiJWYiLCBvdXRwdXQpOworCQkJYnJlYWs7CisJCX0KK2Vycm9yX2ZyZWVfZmlsZW5hbWU6CisJaWYgKGZpbGVuYW1lKQorCQlmcmVlKGZpbGVuYW1lKTsKK2Vycm9yX2Nsb3NlZGlyOgorCWNsb3NlZGlyKGRwKTsKK2Vycm9yX2ZyZWVfYnVpbHRuYW1lX2dlbmVyaWM6CisJZnJlZShidWlsdG5hbWVfZ2VuZXJpYyk7CitlcnJvcl9mcmVlX2J1aWx0bmFtZToKKwlmcmVlKGJ1aWx0bmFtZSk7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBic29ydF9jaGFubmVsX2FycmF5X2J5X2luZGV4KCkgLSByZW9yZGVyIHNvIHRoYXQgdGhlIGFycmF5IGlzIGluIGluZGV4IG9yZGVyCisgKgorICoqLworCit2b2lkIGJzb3J0X2NoYW5uZWxfYXJyYXlfYnlfaW5kZXgoc3RydWN0IGlpb19jaGFubmVsX2luZm8gKipjaV9hcnJheSwKKwkJCQkJIGludCBjbnQpCit7CisKKwlzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyB0ZW1wOworCWludCB4LCB5OworCisJZm9yICh4ID0gMDsgeCA8IGNudDsgeCsrKQorCQlmb3IgKHkgPSAwOyB5IDwgKGNudCAtIDEpOyB5KyspCisJCQlpZiAoKCpjaV9hcnJheSlbeV0uaW5kZXggPiAoKmNpX2FycmF5KVt5KzFdLmluZGV4KSB7CisJCQkJdGVtcCA9ICgqY2lfYXJyYXkpW3kgKyAxXTsKKwkJCQkoKmNpX2FycmF5KVt5ICsgMV0gPSAoKmNpX2FycmF5KVt5XTsKKwkJCQkoKmNpX2FycmF5KVt5XSA9IHRlbXA7CisJCQl9Cit9CisKKy8qKgorICogYnVpbGRfY2hhbm5lbF9hcnJheSgpIC0gZnVuY3Rpb24gdG8gZmlndXJlIG91dCB3aGF0IGNoYW5uZWxzIGFyZSBwcmVzZW50CisgKiBAZGV2aWNlX2RpcjogdGhlIElJTyBkZXZpY2UgZGlyZWN0b3J5IGluIHN5c2ZzCisgKiBACisgKiovCitpbnQgYnVpbGRfY2hhbm5lbF9hcnJheShjb25zdCBjaGFyICpkZXZpY2VfZGlyLAorCQkJICAgICAgc3RydWN0IGlpb19jaGFubmVsX2luZm8gKipjaV9hcnJheSwKKwkJCSAgICAgIGludCAqY291bnRlcikKK3sKKwlESVIgKmRwOworCUZJTEUgKnN5c2ZzZnA7CisJaW50IGNvdW50LCBpOworCXN0cnVjdCBpaW9fY2hhbm5lbF9pbmZvICpjdXJyZW50OworCWludCByZXQ7CisJY29uc3Qgc3RydWN0IGRpcmVudCAqZW50OworCWNoYXIgKnNjYW5fZWxfZGlyOworCWNoYXIgKmZpbGVuYW1lOworCisJKmNvdW50ZXIgPSAwOworCXJldCA9IGFzcHJpbnRmKCZzY2FuX2VsX2RpciwgRk9STUFUX1NDQU5fRUxFTUVOVFNfRElSLCBkZXZpY2VfZGlyKTsKKwlpZiAocmV0IDwgMCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yX3JldDsKKwl9CisJZHAgPSBvcGVuZGlyKHNjYW5fZWxfZGlyKTsKKwlpZiAoZHAgPT0gTlVMTCkgeworCQlyZXQgPSAtZXJybm87CisJCWdvdG8gZXJyb3JfZnJlZV9uYW1lOworCX0KKwl3aGlsZSAoZW50ID0gcmVhZGRpcihkcCksIGVudCAhPSBOVUxMKQorCQlpZiAoc3RyY21wKGVudC0+ZF9uYW1lICsgc3RybGVuKGVudC0+ZF9uYW1lKSAtIHN0cmxlbigiX2VuIiksCisJCQkgICAiX2VuIikgPT0gMCkgeworCQkJcmV0ID0gYXNwcmludGYoJmZpbGVuYW1lLAorCQkJCSAgICAgICAiJXMvJXMiLCBzY2FuX2VsX2RpciwgZW50LT5kX25hbWUpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gZXJyb3JfY2xvc2VfZGlyOworCQkJfQorCQkJc3lzZnNmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCQkJaWYgKHN5c2ZzZnAgPT0gTlVMTCkgeworCQkJCXJldCA9IC1lcnJubzsKKwkJCQlmcmVlKGZpbGVuYW1lKTsKKwkJCQlnb3RvIGVycm9yX2Nsb3NlX2RpcjsKKwkJCX0KKwkJCWZzY2FuZihzeXNmc2ZwLCAiJWkiLCAmcmV0KTsKKwkJCWlmIChyZXQgPT0gMSkKKwkJCQkoKmNvdW50ZXIpKys7CisJCQlmY2xvc2Uoc3lzZnNmcCk7CisJCQlmcmVlKGZpbGVuYW1lKTsKKwkJfQorCSpjaV9hcnJheSA9IG1hbGxvYyhzaXplb2YoKipjaV9hcnJheSkgKiAoKmNvdW50ZXIpKTsKKwlpZiAoKmNpX2FycmF5ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl9jbG9zZV9kaXI7CisJfQorCXNlZWtkaXIoZHAsIDApOworCWNvdW50ID0gMDsKKwl3aGlsZSAoZW50ID0gcmVhZGRpcihkcCksIGVudCAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoZW50LT5kX25hbWUgKyBzdHJsZW4oZW50LT5kX25hbWUpIC0gc3RybGVuKCJfZW4iKSwKKwkJCSAgICJfZW4iKSA9PSAwKSB7CisJCQlpbnQgY3VycmVudF9lbmFibGVkID0gMDsKKworCQkJY3VycmVudCA9ICYoKmNpX2FycmF5KVtjb3VudCsrXTsKKwkJCXJldCA9IGFzcHJpbnRmKCZmaWxlbmFtZSwKKwkJCQkgICAgICAgIiVzLyVzIiwgc2Nhbl9lbF9kaXIsIGVudC0+ZF9uYW1lKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQkvKiBkZWNyZW1lbnQgY291bnQgdG8gYXZvaWQgZnJlZWluZyBuYW1lICovCisJCQkJY291bnQtLTsKKwkJCQlnb3RvIGVycm9yX2NsZWFudXBfYXJyYXk7CisJCQl9CisJCQlzeXNmc2ZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisJCQlpZiAoc3lzZnNmcCA9PSBOVUxMKSB7CisJCQkJZnJlZShmaWxlbmFtZSk7CisJCQkJcmV0ID0gLWVycm5vOworCQkJCWdvdG8gZXJyb3JfY2xlYW51cF9hcnJheTsKKwkJCX0KKwkJCWZzY2FuZihzeXNmc2ZwLCAiJWkiLCAmY3VycmVudF9lbmFibGVkKTsKKwkJCWZjbG9zZShzeXNmc2ZwKTsKKworCQkJaWYgKCFjdXJyZW50X2VuYWJsZWQpIHsKKwkJCQlmcmVlKGZpbGVuYW1lKTsKKwkJCQljb3VudC0tOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQljdXJyZW50LT5zY2FsZSA9IDEuMDsKKwkJCWN1cnJlbnQtPm9mZnNldCA9IDA7CisJCQljdXJyZW50LT5uYW1lID0gc3RybmR1cChlbnQtPmRfbmFtZSwKKwkJCQkJCXN0cmxlbihlbnQtPmRfbmFtZSkgLQorCQkJCQkJc3RybGVuKCJfZW4iKSk7CisJCQlpZiAoY3VycmVudC0+bmFtZSA9PSBOVUxMKSB7CisJCQkJZnJlZShmaWxlbmFtZSk7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIGVycm9yX2NsZWFudXBfYXJyYXk7CisJCQl9CisJCQkvKiBHZXQgdGhlIGdlbmVyaWMgYW5kIHNwZWNpZmljIG5hbWUgZWxlbWVudHMgKi8KKwkJCXJldCA9IGlpb3V0aWxzX2JyZWFrX3VwX25hbWUoY3VycmVudC0+bmFtZSwKKwkJCQkJCSAgICAgJmN1cnJlbnQtPmdlbmVyaWNfbmFtZSk7CisJCQlpZiAocmV0KSB7CisJCQkJZnJlZShmaWxlbmFtZSk7CisJCQkJZ290byBlcnJvcl9jbGVhbnVwX2FycmF5OworCQkJfQorCQkJcmV0ID0gYXNwcmludGYoJmZpbGVuYW1lLAorCQkJCSAgICAgICAiJXMvJXNfaW5kZXgiLAorCQkJCSAgICAgICBzY2FuX2VsX2RpciwKKwkJCQkgICAgICAgY3VycmVudC0+bmFtZSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWZyZWUoZmlsZW5hbWUpOworCQkJCXJldCA9IC1FTk9NRU07CisJCQkJZ290byBlcnJvcl9jbGVhbnVwX2FycmF5OworCQkJfQorCQkJc3lzZnNmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCQkJZnNjYW5mKHN5c2ZzZnAsICIldSIsICZjdXJyZW50LT5pbmRleCk7CisJCQlmY2xvc2Uoc3lzZnNmcCk7CisJCQlmcmVlKGZpbGVuYW1lKTsKKwkJCS8qIEZpbmQgdGhlIHNjYWxlICovCisJCQlyZXQgPSBpaW91dGlsc19nZXRfcGFyYW1fZmxvYXQoJmN1cnJlbnQtPnNjYWxlLAorCQkJCQkJICAgICAgICJzY2FsZSIsCisJCQkJCQkgICAgICAgZGV2aWNlX2RpciwKKwkJCQkJCSAgICAgICBjdXJyZW50LT5uYW1lLAorCQkJCQkJICAgICAgIGN1cnJlbnQtPmdlbmVyaWNfbmFtZSk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlnb3RvIGVycm9yX2NsZWFudXBfYXJyYXk7CisJCQlyZXQgPSBpaW91dGlsc19nZXRfcGFyYW1fZmxvYXQoJmN1cnJlbnQtPm9mZnNldCwKKwkJCQkJCSAgICAgICAib2Zmc2V0IiwKKwkJCQkJCSAgICAgICBkZXZpY2VfZGlyLAorCQkJCQkJICAgICAgIGN1cnJlbnQtPm5hbWUsCisJCQkJCQkgICAgICAgY3VycmVudC0+Z2VuZXJpY19uYW1lKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gZXJyb3JfY2xlYW51cF9hcnJheTsKKwkJCXJldCA9IGlpb3V0aWxzX2dldF90eXBlKCZjdXJyZW50LT5pc19zaWduZWQsCisJCQkJCQkmY3VycmVudC0+Ynl0ZXMsCisJCQkJCQkmY3VycmVudC0+Yml0c191c2VkLAorCQkJCQkJJmN1cnJlbnQtPnNoaWZ0LAorCQkJCQkJJmN1cnJlbnQtPm1hc2ssCisJCQkJCQkmY3VycmVudC0+YmUsCisJCQkJCQlkZXZpY2VfZGlyLAorCQkJCQkJY3VycmVudC0+bmFtZSwKKwkJCQkJCWN1cnJlbnQtPmdlbmVyaWNfbmFtZSk7CisJCX0KKwl9CisKKwljbG9zZWRpcihkcCk7CisJLyogcmVvcmRlciBzbyB0aGF0IHRoZSBhcnJheSBpcyBpbiBpbmRleCBvcmRlciAqLworCWJzb3J0X2NoYW5uZWxfYXJyYXlfYnlfaW5kZXgoY2lfYXJyYXksICpjb3VudGVyKTsKKworCXJldHVybiAwOworCitlcnJvcl9jbGVhbnVwX2FycmF5OgorCWZvciAoaSA9IGNvdW50IC0gMTsgIGkgPj0gMDsgaS0tKQorCQlmcmVlKCgqY2lfYXJyYXkpW2ldLm5hbWUpOworCWZyZWUoKmNpX2FycmF5KTsKK2Vycm9yX2Nsb3NlX2RpcjoKKwljbG9zZWRpcihkcCk7CitlcnJvcl9mcmVlX25hbWU6CisJZnJlZShzY2FuX2VsX2Rpcik7CitlcnJvcl9yZXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBmaW5kX3R5cGVfYnlfbmFtZSgpIC0gZnVuY3Rpb24gdG8gbWF0Y2ggdG9wIGxldmVsIHR5cGVzIGJ5IG5hbWUKKyAqIEBuYW1lOiB0b3AgbGV2ZWwgdHlwZSBpbnN0YW5jZSBuYW1lCisgKiBAdHlwZTogdGhlIHR5cGUgb2YgdG9wIGxldmVsIGluc3RhbmNlIGJlaW5nIHNvcnQKKyAqCisgKiBUeXBpY2FsIHR5cGVzIHRoaXMgaXMgdXNlZCBmb3IgYXJlIGRldmljZSBhbmQgdHJpZ2dlci4KKyAqKi8KK2ludCBmaW5kX3R5cGVfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlKQoreworCWNvbnN0IHN0cnVjdCBkaXJlbnQgKmVudDsKKwlpbnQgbnVtYmVyLCBudW1zdHJsZW47CisKKwlGSUxFICpuYW1lRmlsZTsKKwlESVIgKmRwOworCWNoYXIgdGhpc25hbWVbSUlPX01BWF9OQU1FX0xFTkdUSF07CisJY2hhciAqZmlsZW5hbWU7CisKKwlkcCA9IG9wZW5kaXIoaWlvX2Rpcik7CisJaWYgKGRwID09IE5VTEwpIHsKKwkJcHJpbnRmKCJObyBpbmR1c3RyaWFsaW8gZGV2aWNlcyBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwl3aGlsZSAoZW50ID0gcmVhZGRpcihkcCksIGVudCAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAoZW50LT5kX25hbWUsICIuIikgIT0gMCAmJgorCQkJc3RyY21wKGVudC0+ZF9uYW1lLCAiLi4iKSAhPSAwICYmCisJCQlzdHJsZW4oZW50LT5kX25hbWUpID4gc3RybGVuKHR5cGUpICYmCisJCQlzdHJuY21wKGVudC0+ZF9uYW1lLCB0eXBlLCBzdHJsZW4odHlwZSkpID09IDApIHsKKwkJCW51bXN0cmxlbiA9IHNzY2FuZihlbnQtPmRfbmFtZSArIHN0cmxlbih0eXBlKSwKKwkJCQkJICAgIiVkIiwKKwkJCQkJICAgJm51bWJlcik7CisJCQkvKiB2ZXJpZnkgdGhlIG5leHQgY2hhcmFjdGVyIGlzIG5vdCBhIGNvbG9uICovCisJCQlpZiAoc3RybmNtcChlbnQtPmRfbmFtZSArIHN0cmxlbih0eXBlKSArIG51bXN0cmxlbiwKKwkJCQkJIjoiLAorCQkJCQkxKSAhPSAwKSB7CisJCQkJZmlsZW5hbWUgPSBtYWxsb2Moc3RybGVuKGlpb19kaXIpCisJCQkJCQkrIHN0cmxlbih0eXBlKQorCQkJCQkJKyBudW1zdHJsZW4KKwkJCQkJCSsgNik7CisJCQkJaWYgKGZpbGVuYW1lID09IE5VTEwpIHsKKwkJCQkJY2xvc2VkaXIoZHApOworCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQl9CisJCQkJc3ByaW50ZihmaWxlbmFtZSwgIiVzJXMlZC9uYW1lIiwKKwkJCQkJaWlvX2RpciwKKwkJCQkJdHlwZSwKKwkJCQkJbnVtYmVyKTsKKwkJCQluYW1lRmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCQkJCWlmICghbmFtZUZpbGUpIHsKKwkJCQkJZnJlZShmaWxlbmFtZSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlmcmVlKGZpbGVuYW1lKTsKKwkJCQlmc2NhbmYobmFtZUZpbGUsICIlcyIsIHRoaXNuYW1lKTsKKwkJCQlmY2xvc2UobmFtZUZpbGUpOworCQkJCWlmIChzdHJjbXAobmFtZSwgdGhpc25hbWUpID09IDApIHsKKwkJCQkJY2xvc2VkaXIoZHApOworCQkJCQlyZXR1cm4gbnVtYmVyOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwljbG9zZWRpcihkcCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK2ludCBfd3JpdGVfc3lzZnNfaW50KGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlZGlyLCBpbnQgdmFsLCBpbnQgdmVyaWZ5KQoreworCWludCByZXQgPSAwOworCUZJTEUgKnN5c2ZzZnA7CisJaW50IHRlc3Q7CisJY2hhciAqdGVtcCA9IG1hbGxvYyhzdHJsZW4oYmFzZWRpcikgKyBzdHJsZW4oZmlsZW5hbWUpICsgMik7CisKKwlpZiAodGVtcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzcHJpbnRmKHRlbXAsICIlcy8lcyIsIGJhc2VkaXIsIGZpbGVuYW1lKTsKKwlzeXNmc2ZwID0gZm9wZW4odGVtcCwgInciKTsKKwlpZiAoc3lzZnNmcCA9PSBOVUxMKSB7CisJCXByaW50ZigiZmFpbGVkIHRvIG9wZW4gJXNcbiIsIHRlbXApOworCQlyZXQgPSAtZXJybm87CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisJZnByaW50ZihzeXNmc2ZwLCAiJWQiLCB2YWwpOworCWZjbG9zZShzeXNmc2ZwKTsKKwlpZiAodmVyaWZ5KSB7CisJCXN5c2ZzZnAgPSBmb3Blbih0ZW1wLCAiciIpOworCQlpZiAoc3lzZnNmcCA9PSBOVUxMKSB7CisJCQlwcmludGYoImZhaWxlZCB0byBvcGVuICVzXG4iLCB0ZW1wKTsKKwkJCXJldCA9IC1lcnJubzsKKwkJCWdvdG8gZXJyb3JfZnJlZTsKKwkJfQorCQlmc2NhbmYoc3lzZnNmcCwgIiVkIiwgJnRlc3QpOworCQlmY2xvc2Uoc3lzZnNmcCk7CisJCWlmICh0ZXN0ICE9IHZhbCkgeworCQkJcHJpbnRmKCJQb3NzaWJsZSBmYWlsdXJlIGluIGludCB3cml0ZSAlZCB0byAlcyVzXG4iLAorCQkJCXZhbCwKKwkJCQliYXNlZGlyLAorCQkJCWZpbGVuYW1lKTsKKwkJCXJldCA9IC0xOworCQl9CisJfQorZXJyb3JfZnJlZToKKwlmcmVlKHRlbXApOworCXJldHVybiByZXQ7Cit9CisKK2ludCB3cml0ZV9zeXNmc19pbnQoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJhc2VkaXIsIGludCB2YWwpCit7CisJcmV0dXJuIF93cml0ZV9zeXNmc19pbnQoZmlsZW5hbWUsIGJhc2VkaXIsIHZhbCwgMCk7Cit9CisKK2ludCB3cml0ZV9zeXNmc19pbnRfYW5kX3ZlcmlmeShjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpciwgaW50IHZhbCkKK3sKKwlyZXR1cm4gX3dyaXRlX3N5c2ZzX2ludChmaWxlbmFtZSwgYmFzZWRpciwgdmFsLCAxKTsKK30KKworaW50IF93cml0ZV9zeXNmc19zdHJpbmcoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJhc2VkaXIsIGNoYXIgKnZhbCwgaW50IHZlcmlmeSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlGSUxFICAqc3lzZnNmcDsKKwljaGFyICp0ZW1wID0gbWFsbG9jKHN0cmxlbihiYXNlZGlyKSArIHN0cmxlbihmaWxlbmFtZSkgKyAyKTsKKworCWlmICh0ZW1wID09IE5VTEwpIHsKKwkJcHJpbnRmKCJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3ByaW50Zih0ZW1wLCAiJXMvJXMiLCBiYXNlZGlyLCBmaWxlbmFtZSk7CisJc3lzZnNmcCA9IGZvcGVuKHRlbXAsICJ3Iik7CisJaWYgKHN5c2ZzZnAgPT0gTlVMTCkgeworCQlwcmludGYoIkNvdWxkIG5vdCBvcGVuICVzXG4iLCB0ZW1wKTsKKwkJcmV0ID0gLWVycm5vOworCQlnb3RvIGVycm9yX2ZyZWU7CisJfQorCWZwcmludGYoc3lzZnNmcCwgIiVzIiwgdmFsKTsKKwlmY2xvc2Uoc3lzZnNmcCk7CisJaWYgKHZlcmlmeSkgeworCQlzeXNmc2ZwID0gZm9wZW4odGVtcCwgInIiKTsKKwkJaWYgKHN5c2ZzZnAgPT0gTlVMTCkgeworCQkJcHJpbnRmKCJjb3VsZCBub3Qgb3BlbiBmaWxlIHRvIHZlcmlmeVxuIik7CisJCQlyZXQgPSAtZXJybm87CisJCQlnb3RvIGVycm9yX2ZyZWU7CisJCX0KKwkJZnNjYW5mKHN5c2ZzZnAsICIlcyIsIHRlbXApOworCQlmY2xvc2Uoc3lzZnNmcCk7CisJCWlmIChzdHJjbXAodGVtcCwgdmFsKSAhPSAwKSB7CisJCQlwcmludGYoIlBvc3NpYmxlIGZhaWx1cmUgaW4gc3RyaW5nIHdyaXRlIG9mICVzICIKKwkJCQkiU2hvdWxkIGJlICVzICIKKwkJCQkid3JpdHRlbiB0byAlc1wlc1xuIiwKKwkJCQl0ZW1wLAorCQkJCXZhbCwKKwkJCQliYXNlZGlyLAorCQkJCWZpbGVuYW1lKTsKKwkJCXJldCA9IC0xOworCQl9CisJfQorZXJyb3JfZnJlZToKKwlmcmVlKHRlbXApOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB3cml0ZV9zeXNmc19zdHJpbmdfYW5kX3ZlcmlmeSgpIC0gc3RyaW5nIHdyaXRlLCByZWFkYmFjayBhbmQgdmVyaWZ5CisgKiBAZmlsZW5hbWU6IG5hbWUgb2YgZmlsZSB0byB3cml0ZSB0bworICogQGJhc2VkaXI6IHRoZSBzeXNmcyBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIGZpbGUgaXMgdG8gYmUgZm91bmQKKyAqIEB2YWw6IHRoZSBzdHJpbmcgdG8gd3JpdGUKKyAqKi8KK2ludCB3cml0ZV9zeXNmc19zdHJpbmdfYW5kX3ZlcmlmeShjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpciwgY2hhciAqdmFsKQoreworCXJldHVybiBfd3JpdGVfc3lzZnNfc3RyaW5nKGZpbGVuYW1lLCBiYXNlZGlyLCB2YWwsIDEpOworfQorCitpbnQgd3JpdGVfc3lzZnNfc3RyaW5nKGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlZGlyLCBjaGFyICp2YWwpCit7CisJcmV0dXJuIF93cml0ZV9zeXNmc19zdHJpbmcoZmlsZW5hbWUsIGJhc2VkaXIsIHZhbCwgMCk7Cit9CisKK2ludCByZWFkX3N5c2ZzX3Bvc2ludChjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpcikKK3sKKwlpbnQgcmV0OworCUZJTEUgICpzeXNmc2ZwOworCWNoYXIgKnRlbXAgPSBtYWxsb2Moc3RybGVuKGJhc2VkaXIpICsgc3RybGVuKGZpbGVuYW1lKSArIDIpOworCisJaWYgKHRlbXAgPT0gTlVMTCkgeworCQlwcmludGYoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3ByaW50Zih0ZW1wLCAiJXMvJXMiLCBiYXNlZGlyLCBmaWxlbmFtZSk7CisJc3lzZnNmcCA9IGZvcGVuKHRlbXAsICJyIik7CisJaWYgKHN5c2ZzZnAgPT0gTlVMTCkgeworCQlyZXQgPSAtZXJybm87CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisJZnNjYW5mKHN5c2ZzZnAsICIlZFxuIiwgJnJldCk7CisJZmNsb3NlKHN5c2ZzZnApOworZXJyb3JfZnJlZToKKwlmcmVlKHRlbXApOworCXJldHVybiByZXQ7Cit9CisKK2ludCByZWFkX3N5c2ZzX2Zsb2F0KGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlZGlyLCBmbG9hdCAqdmFsKQoreworCWludCByZXQgPSAwOworCUZJTEUgICpzeXNmc2ZwOworCWNoYXIgKnRlbXAgPSBtYWxsb2Moc3RybGVuKGJhc2VkaXIpICsgc3RybGVuKGZpbGVuYW1lKSArIDIpOworCisJaWYgKHRlbXAgPT0gTlVMTCkgeworCQlwcmludGYoIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJc3ByaW50Zih0ZW1wLCAiJXMvJXMiLCBiYXNlZGlyLCBmaWxlbmFtZSk7CisJc3lzZnNmcCA9IGZvcGVuKHRlbXAsICJyIik7CisJaWYgKHN5c2ZzZnAgPT0gTlVMTCkgeworCQlyZXQgPSAtZXJybm87CisJCWdvdG8gZXJyb3JfZnJlZTsKKwl9CisJZnNjYW5mKHN5c2ZzZnAsICIlZlxuIiwgdmFsKTsKKwlmY2xvc2Uoc3lzZnNmcCk7CitlcnJvcl9mcmVlOgorCWZyZWUodGVtcCk7CisJcmV0dXJuIHJldDsKK30KKworaW50IHJlYWRfc3lzZnNfc3RyaW5nKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpiYXNlZGlyLCBjaGFyICpzdHIpCit7CisJaW50IHJldCA9IDA7CisJRklMRSAgKnN5c2ZzZnA7CisJY2hhciAqdGVtcCA9IG1hbGxvYyhzdHJsZW4oYmFzZWRpcikgKyBzdHJsZW4oZmlsZW5hbWUpICsgMik7CisKKwlpZiAodGVtcCA9PSBOVUxMKSB7CisJCXByaW50ZigiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzcHJpbnRmKHRlbXAsICIlcy8lcyIsIGJhc2VkaXIsIGZpbGVuYW1lKTsKKwlzeXNmc2ZwID0gZm9wZW4odGVtcCwgInIiKTsKKwlpZiAoc3lzZnNmcCA9PSBOVUxMKSB7CisJCXJldCA9IC1lcnJubzsKKwkJZ290byBlcnJvcl9mcmVlOworCX0KKwlmc2NhbmYoc3lzZnNmcCwgIiVzXG4iLCBzdHIpOworCWZjbG9zZShzeXNmc2ZwKTsKK2Vycm9yX2ZyZWU6CisJZnJlZSh0ZW1wKTsKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLyogX0lJT19VVElMU19IICovCmRpZmYgLS1naXQgYS90b29scy9paW8vaWlvX3V0aWxzLmggYi90b29scy9paW8vaWlvX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjODM3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lpby9paW9fdXRpbHMuaApAQCAtMCwwICsxLDcxIEBACisjaWZuZGVmIF9JSU9fVVRJTFNfSF8KKyNkZWZpbmUgX0lJT19VVElMU19IXworCisvKiBJSU8gLSB1c2VmdWwgc2V0IG9mIHV0aWwgZnVuY3Rpb25hbGl0eQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBKb25hdGhhbiBDYW1lcm9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIE1hZGUgdXAgdmFsdWUgdG8gbGltaXQgYWxsb2NhdGlvbiBzaXplcyAqLworI2RlZmluZSBJSU9fTUFYX05BTUVfTEVOR1RIIDMwCisKKyNkZWZpbmUgRk9STUFUX1NDQU5fRUxFTUVOVFNfRElSICIlcy9zY2FuX2VsZW1lbnRzIgorI2RlZmluZSBGT1JNQVRfVFlQRV9GSUxFICIlc190eXBlIgorCitleHRlcm4gY29uc3QgY2hhciAqaWlvX2RpcjsKKworLyoqCisgKiBzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyAtIGluZm9ybWF0aW9uIGFib3V0IGEgZ2l2ZW4gY2hhbm5lbAorICogQG5hbWU6IGNoYW5uZWwgbmFtZQorICogQGdlbmVyaWNfbmFtZTogZ2VuZXJhbCBuYW1lIGZvciBjaGFubmVsIHR5cGUKKyAqIEBzY2FsZTogc2NhbGUgZmFjdG9yIHRvIGJlIGFwcGxpZWQgZm9yIGNvbnZlcnNpb24gdG8gc2kgdW5pdHMKKyAqIEBvZmZzZXQ6IG9mZnNldCB0byBiZSBhcHBsaWVkIGZvciBjb252ZXJzaW9uIHRvIHNpIHVuaXRzCisgKiBAaW5kZXg6IHRoZSBjaGFubmVsIGluZGV4IGluIHRoZSBidWZmZXIgb3V0cHV0CisgKiBAYnl0ZXM6IG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBpbiBidWZmZXIgb3V0cHV0CisgKiBAbWFzazogYSBiaXQgbWFzayBmb3IgdGhlIHJhdyBvdXRwdXQKKyAqIEBpc19zaWduZWQ6IGlzIHRoZSByYXcgdmFsdWUgc3RvcmVkIHNpZ25lZAorICogQGVuYWJsZWQ6IGlzIHRoaXMgY2hhbm5lbCBlbmFibGVkCisgKiovCitzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyB7CisJY2hhciAqbmFtZTsKKwljaGFyICpnZW5lcmljX25hbWU7CisJZmxvYXQgc2NhbGU7CisJZmxvYXQgb2Zmc2V0OworCXVuc2lnbmVkIGluZGV4OworCXVuc2lnbmVkIGJ5dGVzOworCXVuc2lnbmVkIGJpdHNfdXNlZDsKKwl1bnNpZ25lZCBzaGlmdDsKKwl1aW50NjRfdCBtYXNrOworCXVuc2lnbmVkIGJlOworCXVuc2lnbmVkIGlzX3NpZ25lZDsKKwl1bnNpZ25lZCBsb2NhdGlvbjsKK307CisKK2ludCBpaW91dGlsc19icmVha191cF9uYW1lKGNvbnN0IGNoYXIgKmZ1bGxfbmFtZSwgY2hhciAqKmdlbmVyaWNfbmFtZSk7CitpbnQgaWlvdXRpbHNfZ2V0X3R5cGUodW5zaWduZWQgKmlzX3NpZ25lZCwgdW5zaWduZWQgKmJ5dGVzLAorCQkJCQkgIHVuc2lnbmVkICpiaXRzX3VzZWQsIHVuc2lnbmVkICpzaGlmdCwKKwkJCQkJICB1aW50NjRfdCAqbWFzaywgdW5zaWduZWQgKmJlLAorCQkJCQkgIGNvbnN0IGNoYXIgKmRldmljZV9kaXIsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgY29uc3QgY2hhciAqZ2VuZXJpY19uYW1lKTsKK2ludCBpaW91dGlsc19nZXRfcGFyYW1fZmxvYXQoZmxvYXQgKm91dHB1dCwgY29uc3QgY2hhciAqcGFyYW1fbmFtZSwKKwkJCQkJCQkgY29uc3QgY2hhciAqZGV2aWNlX2RpciwgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJCQkgY29uc3QgY2hhciAqZ2VuZXJpY19uYW1lKTsKK3ZvaWQgYnNvcnRfY2hhbm5lbF9hcnJheV9ieV9pbmRleChzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyAqKmNpX2FycmF5LCBpbnQgY250KTsKK2ludCBidWlsZF9jaGFubmVsX2FycmF5KGNvbnN0IGNoYXIgKmRldmljZV9kaXIsCisJCQkJCQlzdHJ1Y3QgaWlvX2NoYW5uZWxfaW5mbyAqKmNpX2FycmF5LCBpbnQgKmNvdW50ZXIpOworaW50IGZpbmRfdHlwZV9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUpOworaW50IHdyaXRlX3N5c2ZzX2ludChjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpciwgaW50IHZhbCk7CitpbnQgd3JpdGVfc3lzZnNfaW50X2FuZF92ZXJpZnkoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmJhc2VkaXIsIGludCB2YWwpOworaW50IHdyaXRlX3N5c2ZzX3N0cmluZ19hbmRfdmVyaWZ5KGNoYXIgKmZpbGVuYW1lLCBjaGFyICpiYXNlZGlyLCBjaGFyICp2YWwpOworaW50IHdyaXRlX3N5c2ZzX3N0cmluZyhjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpciwgY2hhciAqdmFsKTsKK2ludCByZWFkX3N5c2ZzX3Bvc2ludChjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpcik7CitpbnQgcmVhZF9zeXNmc19mbG9hdChjaGFyICpmaWxlbmFtZSwgY2hhciAqYmFzZWRpciwgZmxvYXQgKnZhbCk7CitpbnQgcmVhZF9zeXNmc19zdHJpbmcoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmJhc2VkaXIsIGNoYXIgKnN0cik7CisKKyNlbmRpZiAvKiBfSUlPX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS90b29scy9paW8vbHNpaW8uYyBiL3Rvb2xzL2lpby9sc2lpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODU0NDAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9paW8vbHNpaW8uYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIEluZHVzdHJpYWwgSS9PIHV0aWxpdGllcyAtIGxzaWlvLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgTWFudWVsIFN0YWhsIDxtYW51ZWwuc3RhaGxAaWlzLmZyYXVuaG9mZXIuZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL2Rpci5oPgorI2luY2x1ZGUgImlpb191dGlscy5oIgorCisKK3N0YXRpYyBlbnVtIHZlcmJvc2l0eSB7CisJVkVSQkxFVkVMX0RFRkFVTFQsCS8qIDAgZ2l2ZXMgbHNwY2kgYmVoYXZpb3VyICovCisJVkVSQkxFVkVMX1NFTlNPUlMsCS8qIDEgbGlzdHMgc2Vuc29ycyAqLworfSB2ZXJibGV2ZWwgPSBWRVJCTEVWRUxfREVGQVVMVDsKKworY29uc3QgY2hhciAqdHlwZV9kZXZpY2UgPSAiaWlvOmRldmljZSI7Citjb25zdCBjaGFyICp0eXBlX3RyaWdnZXIgPSAidHJpZ2dlciI7CisKKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfcHJlZml4KGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXJldHVybiBzdHJsZW4oc3RyKSA+IHN0cmxlbihwcmVmaXgpICYmCisJCXN0cm5jbXAoc3RyLCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKSA9PSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjaGVja19wb3N0Zml4KGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqcG9zdGZpeCkKK3sKKwlyZXR1cm4gc3RybGVuKHN0cikgPiBzdHJsZW4ocG9zdGZpeCkgJiYKKwkJc3RyY21wKHN0ciArIHN0cmxlbihzdHIpIC0gc3RybGVuKHBvc3RmaXgpLCBwb3N0Zml4KSA9PSAwOworfQorCitzdGF0aWMgaW50IGR1bXBfY2hhbm5lbHMoY29uc3QgY2hhciAqZGV2X2Rpcl9uYW1lKQoreworCURJUiAqZHA7CisJY29uc3Qgc3RydWN0IGRpcmVudCAqZW50OworCisJZHAgPSBvcGVuZGlyKGRldl9kaXJfbmFtZSk7CisJaWYgKGRwID09IE5VTEwpCisJCXJldHVybiAtZXJybm87CisJd2hpbGUgKGVudCA9IHJlYWRkaXIoZHApLCBlbnQgIT0gTlVMTCkKKwkJaWYgKGNoZWNrX3ByZWZpeChlbnQtPmRfbmFtZSwgImluXyIpICYmCisJCSAgICBjaGVja19wb3N0Zml4KGVudC0+ZF9uYW1lLCAiX3JhdyIpKSB7CisJCQlwcmludGYoIiAgICUtMTBzXG4iLCBlbnQtPmRfbmFtZSk7CisJCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bXBfb25lX2RldmljZShjb25zdCBjaGFyICpkZXZfZGlyX25hbWUpCit7CisJY2hhciBuYW1lW0lJT19NQVhfTkFNRV9MRU5HVEhdOworCWludCBkZXZfaWR4OworCWludCByZXR2YWw7CisKKwlyZXR2YWwgPSBzc2NhbmYoZGV2X2Rpcl9uYW1lICsgc3RybGVuKGlpb19kaXIpICsgc3RybGVuKHR5cGVfZGV2aWNlKSwKKwkJCSIlaSIsICZkZXZfaWR4KTsKKwlpZiAocmV0dmFsICE9IDEpCisJCXJldHVybiAtRUlOVkFMOworCXJlYWRfc3lzZnNfc3RyaW5nKCJuYW1lIiwgZGV2X2Rpcl9uYW1lLCBuYW1lKTsKKwlwcmludGYoIkRldmljZSAlMDNkOiAlc1xuIiwgZGV2X2lkeCwgbmFtZSk7CisKKwlpZiAodmVyYmxldmVsID49IFZFUkJMRVZFTF9TRU5TT1JTKQorCQlyZXR1cm4gZHVtcF9jaGFubmVscyhkZXZfZGlyX25hbWUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bXBfb25lX3RyaWdnZXIoY29uc3QgY2hhciAqZGV2X2Rpcl9uYW1lKQoreworCWNoYXIgbmFtZVtJSU9fTUFYX05BTUVfTEVOR1RIXTsKKwlpbnQgZGV2X2lkeDsKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gc3NjYW5mKGRldl9kaXJfbmFtZSArIHN0cmxlbihpaW9fZGlyKSArIHN0cmxlbih0eXBlX3RyaWdnZXIpLAorCQkJIiVpIiwgJmRldl9pZHgpOworCWlmIChyZXR2YWwgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmVhZF9zeXNmc19zdHJpbmcoIm5hbWUiLCBkZXZfZGlyX25hbWUsIG5hbWUpOworCXByaW50ZigiVHJpZ2dlciAlMDNkOiAlc1xuIiwgZGV2X2lkeCwgbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfZGV2aWNlcyh2b2lkKQoreworCWNvbnN0IHN0cnVjdCBkaXJlbnQgKmVudDsKKwlESVIgKmRwOworCisJZHAgPSBvcGVuZGlyKGlpb19kaXIpOworCWlmIChkcCA9PSBOVUxMKSB7CisJCXByaW50ZigiTm8gaW5kdXN0cmlhbCBJL08gZGV2aWNlcyBhdmFpbGFibGVcbiIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKGVudCA9IHJlYWRkaXIoZHApLCBlbnQgIT0gTlVMTCkgeworCQlpZiAoY2hlY2tfcHJlZml4KGVudC0+ZF9uYW1lLCB0eXBlX2RldmljZSkpIHsKKwkJCWNoYXIgKmRldl9kaXJfbmFtZTsKKworCQkJYXNwcmludGYoJmRldl9kaXJfbmFtZSwgIiVzJXMiLCBpaW9fZGlyLCBlbnQtPmRfbmFtZSk7CisJCQlkdW1wX29uZV9kZXZpY2UoZGV2X2Rpcl9uYW1lKTsKKwkJCWZyZWUoZGV2X2Rpcl9uYW1lKTsKKwkJCWlmICh2ZXJibGV2ZWwgPj0gVkVSQkxFVkVMX1NFTlNPUlMpCisJCQkJcHJpbnRmKCJcbiIpOworCQl9CisJfQorCXJld2luZGRpcihkcCk7CisJd2hpbGUgKGVudCA9IHJlYWRkaXIoZHApLCBlbnQgIT0gTlVMTCkgeworCQlpZiAoY2hlY2tfcHJlZml4KGVudC0+ZF9uYW1lLCB0eXBlX3RyaWdnZXIpKSB7CisJCQljaGFyICpkZXZfZGlyX25hbWU7CisKKwkJCWFzcHJpbnRmKCZkZXZfZGlyX25hbWUsICIlcyVzIiwgaWlvX2RpciwgZW50LT5kX25hbWUpOworCQkJZHVtcF9vbmVfdHJpZ2dlcihkZXZfZGlyX25hbWUpOworCQkJZnJlZShkZXZfZGlyX25hbWUpOworCQl9CisJfQorCWNsb3NlZGlyKGRwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBjLCBlcnIgPSAwOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJkOkQ6diIpKSAhPSBFT0YpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ3YnOgorCQkJdmVyYmxldmVsKys7CisJCQlicmVhazsKKworCQljYXNlICc/JzoKKwkJZGVmYXVsdDoKKwkJCWVycisrOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGVyciB8fCBhcmdjID4gb3B0aW5kKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGxzaWlvIFtvcHRpb25zXS4uLlxuIgorCQkJIkxpc3QgaW5kdXN0cmlhbCBJL08gZGV2aWNlc1xuIgorCQkJIiAgLXYsIC0tdmVyYm9zZVxuIgorCQkJIiAgICAgIEluY3JlYXNlIHZlcmJvc2l0eSAobWF5IGJlIGdpdmVuIG11bHRpcGxlIHRpbWVzKVxuIgorCQkJKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlkdW1wX2RldmljZXMoKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2FwaS9CdWlsZCBiL3Rvb2xzL2xpYi9hcGkvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1Mzk2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xpYi9hcGkvQnVpbGQKQEAgLTAsMCArMSwyIEBACitsaWJhcGkteSArPSBmZC8KK2xpYmFwaS15ICs9IGZzLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2FwaS9NYWtlZmlsZSBiL3Rvb2xzL2xpYi9hcGkvTWFrZWZpbGUKaW5kZXggMzZjMDhiMS4uZDhmZTI5ZiAxMDA2NDQKLS0tIGEvdG9vbHMvbGliL2FwaS9NYWtlZmlsZQorKysgYi90b29scy9saWIvYXBpL01ha2VmaWxlCkBAIC0xLDQ5ICsxLDQzIEBACiBpbmNsdWRlIC4uLy4uL3NjcmlwdHMvTWFrZWZpbGUuaW5jbHVkZQogaW5jbHVkZSAuLi8uLi9wZXJmL2NvbmZpZy91dGlsaXRpZXMubWFrCQkjIFFVSUVUX0NMRUFOCiAKK2lmZXEgKCQoc3JjdHJlZSksKQorc3JjdHJlZSA6PSAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJChzaGVsbCBwd2QpKSkKK3NyY3RyZWUgOj0gJChwYXRzdWJzdCAlLywlLCQoZGlyICQoc3JjdHJlZSkpKQorc3JjdHJlZSA6PSAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJChzcmN0cmVlKSkpCisjJChpbmZvIERldGVybWluZWQgJ3NyY3RyZWUnIHRvIGJlICQoc3JjdHJlZSkpCitlbmRpZgorCiBDQyA9ICQoQ1JPU1NfQ09NUElMRSlnY2MKIEFSID0gJChDUk9TU19DT01QSUxFKWFyCiAKLSMgZ3VhcmQgYWdhaW5zdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLUxJQl9IPQotTElCX09CSlM9CitNQUtFRkxBR1MgKz0gLS1uby1wcmludC1kaXJlY3RvcnkKIAotTElCX0ggKz0gZnMvZGVidWdmcy5oCi1MSUJfSCArPSBmcy9mcy5oCi0jIFNlZSBjb21tZW50IGJlbG93IGFib3V0IHBpZ2d5YmFja2luZy4uLgotTElCX0ggKz0gZmQvYXJyYXkuaAorTElCRklMRSA9ICQoT1VUUFVUKWxpYmFwaS5hCiAKLUxJQl9PQkpTICs9ICQoT1VUUFVUKWZzL2RlYnVnZnMubwotTElCX09CSlMgKz0gJChPVVRQVVQpZnMvZnMubwotIyBYWFggcGlnZ3liYWNraW5nIGhlcmUsIG5lZWQgdG8gaW50cm9kdWNlIGxpYmFwaWtmZCwgb3IgcmVuYW1lIHRoaXMKLSMgdG8gcGxhaW4gbGliYXBpay5hIGFuZCBtYWtlIGl0IGhhdmUgaXQgYWxsIGFwaSBnb29kaWVzCi1MSUJfT0JKUyArPSAkKE9VVFBVVClmZC9hcnJheS5vCi0KLUxJQkZJTEUgPSBsaWJhcGlrZnMuYQotCi1DRkxBR1MgPSAtZ2dkYjMgLVdhbGwgLVdleHRyYSAtc3RkPWdudTk5IC1XZXJyb3IgLU82IC1EX0ZPUlRJRllfU09VUkNFPTIgJChFWFRSQV9XQVJOSU5HUykgJChFWFRSQV9DRkxBR1MpIC1mUElDCi1FWFRMSUJTID0gLWxlbGYgLWxwdGhyZWFkIC1scnQgLWxtCi1BTExfQ0ZMQUdTID0gJChDRkxBR1MpICQoQkFTSUNfQ0ZMQUdTKSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0UgLURfRklMRV9PRkZTRVRfQklUUz02NAotQUxMX0xERkxBR1MgPSAkKExERkxBR1MpCitDRkxBR1MgOj0gJChFWFRSQV9XQVJOSU5HUykgJChFWFRSQV9DRkxBR1MpCitDRkxBR1MgKz0gLWdnZGIzIC1XYWxsIC1XZXh0cmEgLXN0ZD1nbnU5OSAtV2Vycm9yIC1PNiAtRF9GT1JUSUZZX1NPVVJDRT0yIC1mUElDCitDRkxBR1MgKz0gLURfTEFSR0VGSUxFNjRfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQKIAogUk0gPSBybSAtZgogCi0kKExJQkZJTEUpOiAkKExJQl9PQkpTKQotCSQoUVVJRVRfQVIpJChSTSkgJEAgJiYgJChBUikgcmNzICQoT1VUUFVUKSRAICQoTElCX09CSlMpCitidWlsZCAgOj0gLWYgJChzcmN0cmVlKS90b29scy9idWlsZC9NYWtlZmlsZS5idWlsZCBkaXI9LiBvYmoKK0FQSV9JTiA6PSAkKE9VVFBVVClsaWJhcGktaW4ubwogCi0kKExJQl9PQkpTKTogJChMSUJfSCkKK2V4cG9ydCBzcmN0cmVlIE9VVFBVVCBDQyBMRCBDRkxBR1MgVgogCi1saWJhcGlfZGlyczoKLQkkKFFVSUVUX01LRElSKW1rZGlyIC1wICQoT1VUUFVUKWZkICQoT1VUUFVUKWZzCithbGw6ICQoTElCRklMRSkKIAotJChPVVRQVVQpJS5vOiAlLmMgbGliYXBpX2RpcnMKLQkkKFFVSUVUX0NDKSQoQ0MpIC1vICRAIC1jICQoQUxMX0NGTEFHUykgJDwKLSQoT1VUUFVUKSUuczogJS5jIGxpYmFwaV9kaXJzCi0JJChRVUlFVF9DQykkKENDKSAtUyAkKEFMTF9DRkxBR1MpICQ8Ci0kKE9VVFBVVCklLm86ICUuUyBsaWJhcGlfZGlycwotCSQoUVVJRVRfQ0MpJChDQykgLW8gJEAgLWMgJChBTExfQ0ZMQUdTKSAkPAorJChBUElfSU4pOiBGT1JDRQorCUAkKE1BS0UpICQoYnVpbGQpPWxpYmFwaQorCiskKExJQkZJTEUpOiAkKEFQSV9JTikKKwkkKFFVSUVUX0FSKSQoUk0pICRAICYmICQoQVIpIHJjcyAkQCAkKEFQSV9JTikKIAogY2xlYW46Ci0JJChjYWxsIFFVSUVUX0NMRUFOLCBsaWJhcGkpICQoUk0pICQoTElCX09CSlMpICQoTElCRklMRSkKKwkkKGNhbGwgUVVJRVRfQ0xFQU4sIGxpYmFwaSkgJChSTSkgJChMSUJGSUxFKTsgXAorCWZpbmQgJChpZiAkKE9VVFBVVCksJChPVVRQVVQpLC4pIC1uYW1lIFwqLm8gfCB4YXJncyAkKFJNKQogCi0uUEhPTlk6IGNsZWFuCitGT1JDRToKKworLlBIT05ZOiBjbGVhbiBGT1JDRQpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2FwaS9mZC9CdWlsZCBiL3Rvb2xzL2xpYi9hcGkvZmQvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1ZDk5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xpYi9hcGkvZmQvQnVpbGQKQEAgLTAsMCArMSBAQAorbGliYXBpLXkgKz0gYXJyYXkubwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2FwaS9mcy9CdWlsZCBiL3Rvb2xzL2xpYi9hcGkvZnMvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlNWE0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xpYi9hcGkvZnMvQnVpbGQKQEAgLTAsMCArMSw0IEBACitsaWJhcGkteSArPSBmcy5vCitsaWJhcGkteSArPSBkZWJ1Z2ZzLm8KK2xpYmFwaS15ICs9IGZpbmRmcy5vCitsaWJhcGkteSArPSB0cmFjZWZzLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9hcGkvZnMvZGVidWdmcy5jIGIvdG9vbHMvbGliL2FwaS9mcy9kZWJ1Z2ZzLmMKaW5kZXggZDJiMThlOC4uODMwNWIzZSAxMDA2NDQKLS0tIGEvdG9vbHMvbGliL2FwaS9mcy9kZWJ1Z2ZzLmMKKysrIGIvdG9vbHMvbGliL2FwaS9mcy9kZWJ1Z2ZzLmMKQEAgLTMsNzUgKzMsNTAgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KICNpbmNsdWRlIDxzeXMvdmZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgImRlYnVnZnMuaCIKIAotY2hhciBkZWJ1Z2ZzX21vdW50cG9pbnRbUEFUSF9NQVggKyAxXSA9ICIvc3lzL2tlcm5lbC9kZWJ1ZyI7CisjaWZuZGVmIERFQlVHRlNfREVGQVVMVF9QQVRICisjZGVmaW5lIERFQlVHRlNfREVGQVVMVF9QQVRICQkiL3N5cy9rZXJuZWwvZGVidWciCisjZW5kaWYKKworY2hhciBkZWJ1Z2ZzX21vdW50cG9pbnRbUEFUSF9NQVggKyAxXSA9IERFQlVHRlNfREVGQVVMVF9QQVRIOwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGRlYnVnZnNfa25vd25fbW91bnRwb2ludHNbXSA9IHsKLQkiL3N5cy9rZXJuZWwvZGVidWciLAorCURFQlVHRlNfREVGQVVMVF9QQVRILAogCSIvZGVidWciLAogCTAsCiB9OwogCiBzdGF0aWMgYm9vbCBkZWJ1Z2ZzX2ZvdW5kOwogCitib29sIGRlYnVnZnNfY29uZmlndXJlZCh2b2lkKQoreworCXJldHVybiBkZWJ1Z2ZzX2ZpbmRfbW91bnRwb2ludCgpICE9IE5VTEw7Cit9CisKIC8qIGZpbmQgdGhlIHBhdGggdG8gdGhlIG1vdW50ZWQgZGVidWdmcyAqLwogY29uc3QgY2hhciAqZGVidWdmc19maW5kX21vdW50cG9pbnQodm9pZCkKIHsKLQljb25zdCBjaGFyICogY29uc3QgKnB0cjsKLQljaGFyIHR5cGVbMTAwXTsKLQlGSUxFICpmcDsKKwljb25zdCBjaGFyICpyZXQ7CiAKIAlpZiAoZGVidWdmc19mb3VuZCkKIAkJcmV0dXJuIChjb25zdCBjaGFyICopZGVidWdmc19tb3VudHBvaW50OwogCi0JcHRyID0gZGVidWdmc19rbm93bl9tb3VudHBvaW50czsKLQl3aGlsZSAoKnB0cikgewotCQlpZiAoZGVidWdmc192YWxpZF9tb3VudHBvaW50KCpwdHIpID09IDApIHsKLQkJCWRlYnVnZnNfZm91bmQgPSB0cnVlOwotCQkJc3RyY3B5KGRlYnVnZnNfbW91bnRwb2ludCwgKnB0cik7Ci0JCQlyZXR1cm4gZGVidWdmc19tb3VudHBvaW50OwotCQl9Ci0JCXB0cisrOwotCX0KKwlyZXQgPSBmaW5kX21vdW50cG9pbnQoImRlYnVnZnMiLCAobG9uZykgREVCVUdGU19NQUdJQywKKwkJCSAgICAgIGRlYnVnZnNfbW91bnRwb2ludCwgUEFUSF9NQVggKyAxLAorCQkJICAgICAgZGVidWdmc19rbm93bl9tb3VudHBvaW50cyk7CisJaWYgKHJldCkKKwkJZGVidWdmc19mb3VuZCA9IHRydWU7CiAKLQkvKiBnaXZlIHVwIGFuZCBwYXJzZSAvcHJvYy9tb3VudHMgKi8KLQlmcCA9IGZvcGVuKCIvcHJvYy9tb3VudHMiLCAiciIpOwotCWlmIChmcCA9PSBOVUxMKQotCQlyZXR1cm4gTlVMTDsKLQotCXdoaWxlIChmc2NhbmYoZnAsICIlKnMgJSIgU1RSKFBBVEhfTUFYKSAicyAlOTlzICUqcyAlKmQgJSpkXG4iLAotCQkgICAgICBkZWJ1Z2ZzX21vdW50cG9pbnQsIHR5cGUpID09IDIpIHsKLQkJaWYgKHN0cmNtcCh0eXBlLCAiZGVidWdmcyIpID09IDApCi0JCQlicmVhazsKLQl9Ci0JZmNsb3NlKGZwKTsKLQotCWlmIChzdHJjbXAodHlwZSwgImRlYnVnZnMiKSAhPSAwKQotCQlyZXR1cm4gTlVMTDsKLQotCWRlYnVnZnNfZm91bmQgPSB0cnVlOwotCi0JcmV0dXJuIGRlYnVnZnNfbW91bnRwb2ludDsKLX0KLQotLyogdmVyaWZ5IHRoYXQgYSBtb3VudHBvaW50IGlzIGFjdHVhbGx5IGEgZGVidWdmcyBpbnN0YW5jZSAqLwotCi1pbnQgZGVidWdmc192YWxpZF9tb3VudHBvaW50KGNvbnN0IGNoYXIgKmRlYnVnZnMpCi17Ci0Jc3RydWN0IHN0YXRmcyBzdF9mczsKLQotCWlmIChzdGF0ZnMoZGVidWdmcywgJnN0X2ZzKSA8IDApCi0JCXJldHVybiAtRU5PRU5UOwotCWVsc2UgaWYgKChsb25nKXN0X2ZzLmZfdHlwZSAhPSAobG9uZylERUJVR0ZTX01BR0lDKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qIG1vdW50IHRoZSBkZWJ1Z2ZzIHNvbWV3aGVyZSBpZiBpdCdzIG5vdCBtb3VudGVkICovCkBAIC04Nyw3ICs2Miw3IEBACiAJCW1vdW50cG9pbnQgPSBnZXRlbnYoUEVSRl9ERUJVR0ZTX0VOVklST05NRU5UKTsKIAkJLyogaWYgbm8gZW52aXJvbm1lbnQgdmFyaWFibGUsIHVzZSBkZWZhdWx0ICovCiAJCWlmIChtb3VudHBvaW50ID09IE5VTEwpCi0JCQltb3VudHBvaW50ID0gIi9zeXMva2VybmVsL2RlYnVnIjsKKwkJCW1vdW50cG9pbnQgPSBERUJVR0ZTX0RFRkFVTFRfUEFUSDsKIAl9CiAKIAlpZiAobW91bnQoTlVMTCwgbW91bnRwb2ludCwgImRlYnVnZnMiLCAwLCBOVUxMKSA8IDApCmRpZmYgLS1naXQgYS90b29scy9saWIvYXBpL2ZzL2RlYnVnZnMuaCBiL3Rvb2xzL2xpYi9hcGkvZnMvZGVidWdmcy5oCmluZGV4IDA3Mzk4ODEuLjQ1NTAyMzYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYi9hcGkvZnMvZGVidWdmcy5oCisrKyBiL3Rvb2xzL2xpYi9hcGkvZnMvZGVidWdmcy5oCkBAIC0xLDE2ICsxLDcgQEAKICNpZm5kZWYgX19BUElfREVCVUdGU19IX18KICNkZWZpbmUgX19BUElfREVCVUdGU19IX18KIAotI2RlZmluZSBfU1RSKHgpICN4Ci0jZGVmaW5lIFNUUih4KSBfU1RSKHgpCi0KLS8qCi0gKiBPbiBtb3N0IHN5c3RlbXMgPGxpbWl0cy5oPiB3b3VsZCBoYXZlIGdpdmVuIHVzIHRoaXMsIGJ1dCAgbm90IG9uIHNvbWUgc3lzdGVtcwotICogKGUuZy4gR05VL0h1cmQpLgotICovCi0jaWZuZGVmIFBBVEhfTUFYCi0jZGVmaW5lIFBBVEhfTUFYIDQwOTYKLSNlbmRpZgorI2luY2x1ZGUgImZpbmRmcy5oIgogCiAjaWZuZGVmIERFQlVHRlNfTUFHSUMKICNkZWZpbmUgREVCVUdGU19NQUdJQyAgICAgICAgICAweDY0NjI2NzIwCkBAIC0yMCw4ICsxMSw4IEBACiAjZGVmaW5lIFBFUkZfREVCVUdGU19FTlZJUk9OTUVOVCAiUEVSRl9ERUJVR0ZTX0RJUiIKICNlbmRpZgogCitib29sIGRlYnVnZnNfY29uZmlndXJlZCh2b2lkKTsKIGNvbnN0IGNoYXIgKmRlYnVnZnNfZmluZF9tb3VudHBvaW50KHZvaWQpOwotaW50IGRlYnVnZnNfdmFsaWRfbW91bnRwb2ludChjb25zdCBjaGFyICpkZWJ1Z2ZzKTsKIGNoYXIgKmRlYnVnZnNfbW91bnQoY29uc3QgY2hhciAqbW91bnRwb2ludCk7CiAKIGV4dGVybiBjaGFyIGRlYnVnZnNfbW91bnRwb2ludFtdOwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2FwaS9mcy9maW5kZnMuYyBiL3Rvb2xzL2xpYi9hcGkvZnMvZmluZGZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk5NDZjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xpYi9hcGkvZnMvZmluZGZzLmMKQEAgLTAsMCArMSw2MyBAQAorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorCisjaW5jbHVkZSAiZmluZGZzLmgiCisKKy8qIHZlcmlmeSB0aGF0IGEgbW91bnRwb2ludCBpcyBhY3R1YWxseSB0aGUgdHlwZSB3ZSB3YW50ICovCisKK2ludCB2YWxpZF9tb3VudHBvaW50KGNvbnN0IGNoYXIgKm1vdW50LCBsb25nIG1hZ2ljKQoreworCXN0cnVjdCBzdGF0ZnMgc3RfZnM7CisKKwlpZiAoc3RhdGZzKG1vdW50LCAmc3RfZnMpIDwgMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJZWxzZSBpZiAoKGxvbmcpc3RfZnMuZl90eXBlICE9IG1hZ2ljKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJldHVybiAwOworfQorCisvKiBmaW5kIHRoZSBwYXRoIHRvIGEgbW91bnRlZCBmaWxlIHN5c3RlbSAqLworY29uc3QgY2hhciAqZmluZF9tb3VudHBvaW50KGNvbnN0IGNoYXIgKmZzdHlwZSwgbG9uZyBtYWdpYywKKwkJCSAgICBjaGFyICptb3VudHBvaW50LCBpbnQgbGVuLAorCQkJICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa25vd25fbW91bnRwb2ludHMpCit7CisJY29uc3QgY2hhciAqIGNvbnN0ICpwdHI7CisJY2hhciBmb3JtYXRbMTI4XTsKKwljaGFyIHR5cGVbMTAwXTsKKwlGSUxFICpmcDsKKworCWlmIChrbm93bl9tb3VudHBvaW50cykgeworCQlwdHIgPSBrbm93bl9tb3VudHBvaW50czsKKwkJd2hpbGUgKCpwdHIpIHsKKwkJCWlmICh2YWxpZF9tb3VudHBvaW50KCpwdHIsIG1hZ2ljKSA9PSAwKSB7CisJCQkJc3RybmNweShtb3VudHBvaW50LCAqcHRyLCBsZW4gLSAxKTsKKwkJCQltb3VudHBvaW50W2xlbi0xXSA9IDA7CisJCQkJcmV0dXJuIG1vdW50cG9pbnQ7CisJCQl9CisJCQlwdHIrKzsKKwkJfQorCX0KKworCS8qIGdpdmUgdXAgYW5kIHBhcnNlIC9wcm9jL21vdW50cyAqLworCWZwID0gZm9wZW4oIi9wcm9jL21vdW50cyIsICJyIik7CisJaWYgKGZwID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc25wcmludGYoZm9ybWF0LCAxMjgsICIlJSpzICUlJWRzICUlOTlzICUlKnMgJSUqZCAlJSpkXG4iLCBsZW4pOworCisJd2hpbGUgKGZzY2FuZihmcCwgZm9ybWF0LCBtb3VudHBvaW50LCB0eXBlKSA9PSAyKSB7CisJCWlmIChzdHJjbXAodHlwZSwgZnN0eXBlKSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWZjbG9zZShmcCk7CisKKwlpZiAoc3RyY21wKHR5cGUsIGZzdHlwZSkgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gbW91bnRwb2ludDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9hcGkvZnMvZmluZGZzLmggYi90b29scy9saWIvYXBpL2ZzL2ZpbmRmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZjVkMDUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9saWIvYXBpL2ZzL2ZpbmRmcy5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgX19BUElfRklOREZTX0hfXworI2RlZmluZSBfX0FQSV9GSU5ERlNfSF9fCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNkZWZpbmUgX1NUUih4KSAjeAorI2RlZmluZSBTVFIoeCkgX1NUUih4KQorCisvKgorICogT24gbW9zdCBzeXN0ZW1zIDxsaW1pdHMuaD4gd291bGQgaGF2ZSBnaXZlbiB1cyB0aGlzLCBidXQgIG5vdCBvbiBzb21lIHN5c3RlbXMKKyAqIChlLmcuIEdOVS9IdXJkKS4KKyAqLworI2lmbmRlZiBQQVRIX01BWAorI2RlZmluZSBQQVRIX01BWCA0MDk2CisjZW5kaWYKKworY29uc3QgY2hhciAqZmluZF9tb3VudHBvaW50KGNvbnN0IGNoYXIgKmZzdHlwZSwgbG9uZyBtYWdpYywKKwkJCSAgICBjaGFyICptb3VudHBvaW50LCBpbnQgbGVuLAorCQkJICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa25vd25fbW91bnRwb2ludHMpOworCitpbnQgdmFsaWRfbW91bnRwb2ludChjb25zdCBjaGFyICptb3VudCwgbG9uZyBtYWdpYyk7CisKKyNlbmRpZiAvKiBfX0FQSV9GSU5ERlNfSF9fICovCmRpZmYgLS1naXQgYS90b29scy9saWIvYXBpL2ZzL3RyYWNlZnMuYyBiL3Rvb2xzL2xpYi9hcGkvZnMvdHJhY2Vmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YWE5NjgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9saWIvYXBpL2ZzL3RyYWNlZnMuYwpAQCAtMCwwICsxLDc4IEBACisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzeXMvdmZzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworI2luY2x1ZGUgInRyYWNlZnMuaCIKKworI2lmbmRlZiBUUkFDRUZTX0RFRkFVTFRfUEFUSAorI2RlZmluZSBUUkFDRUZTX0RFRkFVTFRfUEFUSAkJIi9zeXMva2VybmVsL3RyYWNpbmciCisjZW5kaWYKKworY2hhciB0cmFjZWZzX21vdW50cG9pbnRbUEFUSF9NQVggKyAxXSA9IFRSQUNFRlNfREVGQVVMVF9QQVRIOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRyYWNlZnNfa25vd25fbW91bnRwb2ludHNbXSA9IHsKKwlUUkFDRUZTX0RFRkFVTFRfUEFUSCwKKwkiL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZyIsCisJIi90cmFjaW5nIiwKKwkiL3RyYWNlIiwKKwkwLAorfTsKKworc3RhdGljIGJvb2wgdHJhY2Vmc19mb3VuZDsKKworYm9vbCB0cmFjZWZzX2NvbmZpZ3VyZWQodm9pZCkKK3sKKwlyZXR1cm4gdHJhY2Vmc19maW5kX21vdW50cG9pbnQoKSAhPSBOVUxMOworfQorCisvKiBmaW5kIHRoZSBwYXRoIHRvIHRoZSBtb3VudGVkIHRyYWNlZnMgKi8KK2NvbnN0IGNoYXIgKnRyYWNlZnNfZmluZF9tb3VudHBvaW50KHZvaWQpCit7CisJY29uc3QgY2hhciAqcmV0OworCisJaWYgKHRyYWNlZnNfZm91bmQpCisJCXJldHVybiAoY29uc3QgY2hhciAqKXRyYWNlZnNfbW91bnRwb2ludDsKKworCXJldCA9IGZpbmRfbW91bnRwb2ludCgidHJhY2VmcyIsIChsb25nKSBUUkFDRUZTX01BR0lDLAorCQkJICAgICAgdHJhY2Vmc19tb3VudHBvaW50LCBQQVRIX01BWCArIDEsCisJCQkgICAgICB0cmFjZWZzX2tub3duX21vdW50cG9pbnRzKTsKKworCWlmIChyZXQpCisJCXRyYWNlZnNfZm91bmQgPSB0cnVlOworCisJcmV0dXJuIHJldDsKK30KKworLyogbW91bnQgdGhlIHRyYWNlZnMgc29tZXdoZXJlIGlmIGl0J3Mgbm90IG1vdW50ZWQgKi8KK2NoYXIgKnRyYWNlZnNfbW91bnQoY29uc3QgY2hhciAqbW91bnRwb2ludCkKK3sKKwkvKiBzZWUgaWYgaXQncyBhbHJlYWR5IG1vdW50ZWQgKi8KKwlpZiAodHJhY2Vmc19maW5kX21vdW50cG9pbnQoKSkKKwkJZ290byBvdXQ7CisKKwkvKiBpZiBub3QgbW91bnRlZCBhbmQgbm8gYXJndW1lbnQgKi8KKwlpZiAobW91bnRwb2ludCA9PSBOVUxMKSB7CisJCS8qIHNlZSBpZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgKi8KKwkJbW91bnRwb2ludCA9IGdldGVudihQRVJGX1RSQUNFRlNfRU5WSVJPTk1FTlQpOworCQkvKiBpZiBubyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgdXNlIGRlZmF1bHQgKi8KKwkJaWYgKG1vdW50cG9pbnQgPT0gTlVMTCkKKwkJCW1vdW50cG9pbnQgPSBUUkFDRUZTX0RFRkFVTFRfUEFUSDsKKwl9CisKKwlpZiAobW91bnQoTlVMTCwgbW91bnRwb2ludCwgInRyYWNlZnMiLCAwLCBOVUxMKSA8IDApCisJCXJldHVybiBOVUxMOworCisJLyogc2F2ZSB0aGUgbW91bnRwb2ludCAqLworCXRyYWNlZnNfZm91bmQgPSB0cnVlOworCXN0cm5jcHkodHJhY2Vmc19tb3VudHBvaW50LCBtb3VudHBvaW50LCBzaXplb2YodHJhY2Vmc19tb3VudHBvaW50KSk7CitvdXQ6CisJcmV0dXJuIHRyYWNlZnNfbW91bnRwb2ludDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9hcGkvZnMvdHJhY2Vmcy5oIGIvdG9vbHMvbGliL2FwaS9mcy90cmFjZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3ODBhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xpYi9hcGkvZnMvdHJhY2Vmcy5oCkBAIC0wLDAgKzEsMjEgQEAKKyNpZm5kZWYgX19BUElfVFJBQ0VGU19IX18KKyNkZWZpbmUgX19BUElfVFJBQ0VGU19IX18KKworI2luY2x1ZGUgImZpbmRmcy5oIgorCisjaWZuZGVmIFRSQUNFRlNfTUFHSUMKKyNkZWZpbmUgVFJBQ0VGU19NQUdJQyAgICAgICAgICAweDc0NzI2MTYzCisjZW5kaWYKKworI2lmbmRlZiBQRVJGX1RSQUNFRlNfRU5WSVJPTk1FTlQKKyNkZWZpbmUgUEVSRl9UUkFDRUZTX0VOVklST05NRU5UICJQRVJGX1RSQUNFRlNfRElSIgorI2VuZGlmCisKK2Jvb2wgdHJhY2Vmc19jb25maWd1cmVkKHZvaWQpOworY29uc3QgY2hhciAqdHJhY2Vmc19maW5kX21vdW50cG9pbnQodm9pZCk7CitpbnQgdHJhY2Vmc192YWxpZF9tb3VudHBvaW50KGNvbnN0IGNoYXIgKmRlYnVnZnMpOworY2hhciAqdHJhY2Vmc19tb3VudChjb25zdCBjaGFyICptb3VudHBvaW50KTsKKworZXh0ZXJuIGNoYXIgdHJhY2Vmc19tb3VudHBvaW50W107CisKKyNlbmRpZiAvKiBfX0FQSV9ERUJVR0ZTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvbGliL2xvY2tkZXAvQnVpbGQgYi90b29scy9saWIvbG9ja2RlcC9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjY2NzM1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbGliL2xvY2tkZXAvQnVpbGQKQEAgLTAsMCArMSBAQAorbGlibG9ja2RlcC15ICs9IGNvbW1vbi5vIGxvY2tkZXAubyBwcmVsb2FkLm8gcmJ0cmVlLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi9sb2NrZGVwL01ha2VmaWxlIGIvdG9vbHMvbGliL2xvY2tkZXAvTWFrZWZpbGUKaW5kZXggNGI4NjZjNS4uMGMzNTZmYiAxMDA2NDQKLS0tIGEvdG9vbHMvbGliL2xvY2tkZXAvTWFrZWZpbGUKKysrIGIvdG9vbHMvbGliL2xvY2tkZXAvTWFrZWZpbGUKQEAgLTM1LDYgKzM1LDEwIEBACiAKIGV4cG9ydCBERVNURElSIERFU1RESVJfU1EgSU5TVEFMTAogCitNQUtFRkxBR1MgKz0gLS1uby1wcmludC1kaXJlY3RvcnkKKworaW5jbHVkZSAuLi8uLi9zY3JpcHRzL01ha2VmaWxlLmluY2x1ZGUKKwogIyBjb3B5IGEgYml0IGZyb20gTGludXgga2J1aWxkCiAKIGlmZXEgKCIkKG9yaWdpbiBWKSIsICJjb21tYW5kIGxpbmUiKQpAQCAtNDQsNTYgKzQ4LDIxIEBACiAgIFZFUkJPU0UgPSAwCiBlbmRpZgogCi1pZmVxICgiJChvcmlnaW4gTykiLCAiY29tbWFuZCBsaW5lIikKLSAgQlVJTERfT1VUUFVUIDo9ICQoTykKK2lmZXEgKCQoc3JjdHJlZSksKQorc3JjdHJlZSA6PSAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJChzaGVsbCBwd2QpKSkKK3NyY3RyZWUgOj0gJChwYXRzdWJzdCAlLywlLCQoZGlyICQoc3JjdHJlZSkpKQorc3JjdHJlZSA6PSAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJChzcmN0cmVlKSkpCisjJChpbmZvIERldGVybWluZWQgJ3NyY3RyZWUnIHRvIGJlICQoc3JjdHJlZSkpCiBlbmRpZgogCi1pZmVxICgkKEJVSUxEX1NSQyksKQotaWZuZXEgKCQoQlVJTERfT1VUUFVUKSwpCi0KLWRlZmluZSBidWlsZF9vdXRwdXQKLQkkKGlmICQoVkVSQk9TRToxPSksQCkkKE1BS0UpIC1DICQoQlVJTERfT1VUUFVUKQlcCi0JQlVJTERfU1JDPSQoQ1VSRElSKSAtZiAkKENVUkRJUikvTWFrZWZpbGUgJDEKLWVuZGVmCi0KLXNhdmVkLW91dHB1dCA6PSAkKEJVSUxEX09VVFBVVCkKLUJVSUxEX09VVFBVVCA6PSAkKHNoZWxsIGNkICQoQlVJTERfT1VUUFVUKSAmJiAvYmluL3B3ZCkKLSQoaWYgJChCVUlMRF9PVVRQVVQpLCwgXAotICAgICAkKGVycm9yIG91dHB1dCBkaXJlY3RvcnkgIiQoc2F2ZWQtb3V0cHV0KSIgZG9lcyBub3QgZXhpc3QpKQotCi1hbGw6IHN1Yi1tYWtlCi0KLWd1aTogZm9yY2UKLQkkKGNhbGwgYnVpbGRfb3V0cHV0LCBhbGxfY21kKQotCi0kKGZpbHRlci1vdXQgZ3VpLCQoTUFLRUNNREdPQUxTKSk6IHN1Yi1tYWtlCi0KLXN1Yi1tYWtlOiBmb3JjZQotCSQoY2FsbCBidWlsZF9vdXRwdXQsICQoTUFLRUNNREdPQUxTKSkKLQotCi0jIExlYXZlIHByb2Nlc3NpbmcgdG8gYWJvdmUgaW52b2NhdGlvbiBvZiBtYWtlCi1za2lwLW1ha2VmaWxlIDo9IDEKLQotZW5kaWYgIyBCVUlMRF9PVVRQVVQKLWVuZGlmICMgQlVJTERfU1JDCi0KLSMgV2UgcHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgTWFrZWZpbGUgaWYgdGhpcyBpcyB0aGUgZmluYWwgaW52b2NhdGlvbiBvZiBtYWtlCi1pZmVxICgkKHNraXAtbWFrZWZpbGUpLCkKLQotc3JjdHJlZQkJOj0gJChyZWFscGF0aCAkKGlmICQoQlVJTERfU1JDKSwkKEJVSUxEX1NSQyksJChDVVJESVIpKSkKLW9ianRyZWUJCTo9ICQocmVhbHBhdGggJChDVVJESVIpKQotc3JjCQk6PSAkKHNyY3RyZWUpCi1vYmoJCTo9ICQob2JqdHJlZSkKLQotZXhwb3J0IHByZWZpeCBsaWJkaXIgYmluZGlyIHNyYyBvYmoKLQogIyBTaGVsbCBxdW90ZXMKIGxpYmRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQobGliZGlyKSkKIGJpbmRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoYmluZGlyKSkKIAotTElCX0ZJTEUgPSBsaWJsb2NrZGVwLmEgbGlibG9ja2RlcC5zby4kKExJQkxPQ0tERVBfVkVSU0lPTikKK0xJQl9JTiA6PSAkKE9VVFBVVClsaWJsb2NrZGVwLWluLm8KKwogQklOX0ZJTEUgPSBsb2NrZGVwCitMSUJfRklMRSA9ICQoT1VUUFVUKWxpYmxvY2tkZXAuYSAkKE9VVFBVVClsaWJsb2NrZGVwLnNvLiQoTElCTE9DS0RFUF9WRVJTSU9OKQogCiBDT05GSUdfSU5DTFVERVMgPQogQ09ORklHX0xJQlMJPQpAQCAtMTA4LDMzICs3NywyMyBAQAogCiAjIFNldCBjb21waWxlIG9wdGlvbiBDRkxBR1MgaWYgbm90IHNldCBlbHNld2hlcmUKIENGTEFHUyA/PSAtZyAtRENPTkZJR19MT0NLREVQIC1EQ09ORklHX1NUQUNLVFJBQ0UgLURDT05GSUdfUFJPVkVfTE9DS0lORyAtREJJVFNfUEVSX0xPTkc9X19XT1JEU0laRSAtRExJQkxPQ0tERVBfVkVSU0lPTj0nIiQoTElCTE9DS0RFUF9WRVJTSU9OKSInIC1yZHluYW1pYyAtTzAgLWcKK0NGTEFHUyArPSAtZlBJQwogCiBvdmVycmlkZSBDRkxBR1MgKz0gJChDT05GSUdfRkxBR1MpICQoSU5DTFVERVMpICQoUExVR0lOX0RJUl9TUSkKIAogaWZlcSAoJChWRVJCT1NFKSwxKQogICBRID0KLSAgcHJpbnRfY29tcGlsZSA9Ci0gIHByaW50X2FwcF9idWlsZCA9Ci0gIHByaW50X2ZwaWNfY29tcGlsZSA9CiAgIHByaW50X3NoYXJlZF9saWJfY29tcGlsZSA9CiAgIHByaW50X2luc3RhbGwgPQogZWxzZQogICBRID0gQAotICBwcmludF9jb21waWxlID0JCWVjaG8gJyAgQ0MgICAgICAgICAgICAgICAgICckKE9CSik7Ci0gIHByaW50X2FwcF9idWlsZCA9CQllY2hvICcgIEJVSUxEICAgICAgICAgICAgICAnJChPQkopOwotICBwcmludF9mcGljX2NvbXBpbGUgPQkJZWNobyAnICBDQyBGUElDICAgICAgICAgICAgJyQoT0JKKTsKLSAgcHJpbnRfc2hhcmVkX2xpYl9jb21waWxlID0JZWNobyAnICBCVUlMRCBTSEFSRUQgTElCICAgJyQoT0JKKTsKLSAgcHJpbnRfc3RhdGljX2xpYl9idWlsZCA9CWVjaG8gJyAgQlVJTEQgU1RBVElDIExJQiAgICckKE9CSik7Ci0gIHByaW50X2luc3RhbGwgPQkJZWNobyAnICBJTlNUQUxMICAgICAnJDEnCXRvCSQoREVTVERJUl9TUSkkMic7CisgIHByaW50X3NoYXJlZF9saWJfY29tcGlsZSA9CWVjaG8gJyAgTEQgICAgICAgJyQoT0JKKTsKKyAgcHJpbnRfc3RhdGljX2xpYl9idWlsZCA9CWVjaG8gJyAgTEQgICAgICAgJyQoT0JKKTsKKyAgcHJpbnRfaW5zdGFsbCA9CQllY2hvICcgIElOU1RBTEwgICckMScJdG8JJChERVNURElSX1NRKSQyJzsKIGVuZGlmCiAKLWRvX2ZwaWNfY29tcGlsZSA9CQkJCQlcCi0JKCQocHJpbnRfZnBpY19jb21waWxlKQkJCQlcCi0JJChDQykgLWMgJChDRkxBR1MpICQoRVhUKSAtZlBJQyAkPCAtbyAkQCkKLQotZG9fYXBwX2J1aWxkID0JCQkJCQlcCi0JKCQocHJpbnRfYXBwX2J1aWxkKQkJCQlcCi0JJChDQykgJF4gLXJkeW5hbWljIC1vICRAICQoQ09ORklHX0xJQlMpICQoTElCUykpCitleHBvcnQgc3JjdHJlZSBPVVRQVVQgQ0MgTEQgQ0ZMQUdTIFYKK2J1aWxkIDo9IC1mICQoc3JjdHJlZSkvdG9vbHMvYnVpbGQvTWFrZWZpbGUuYnVpbGQgZGlyPS4gb2JqCiAKIGRvX2NvbXBpbGVfc2hhcmVkX2xpYnJhcnkgPQkJCVwKIAkoJChwcmludF9zaGFyZWRfbGliX2NvbXBpbGUpCQlcCkBAIC0xNDQsMjIgKzEwMyw2IEBACiAJKCQocHJpbnRfc3RhdGljX2xpYl9idWlsZCkJCVwKIAkkKFJNKSAkQDsgICQoQVIpIHJjcyAkQCAkXikKIAotCi1kZWZpbmUgZG9fY29tcGlsZQotCSQocHJpbnRfY29tcGlsZSkJCQkJCQlcCi0JJChDQykgLWMgJChDRkxBR1MpICQoRVhUKSAkPCAtbyAkKG9iaikvJEA7Ci1lbmRlZgotCi0kKG9iaikvJS5vOiAkKHNyYykvJS5jCi0JJChRKSQoY2FsbCBkb19jb21waWxlKQotCi0lLm86ICQoc3JjKS8lLmMKLQkkKFEpJChjYWxsIGRvX2NvbXBpbGUpCi0KLVBFVkVOVF9MSUJfT0JKUyA9IGNvbW1vbi5vIGxvY2tkZXAubyBwcmVsb2FkLm8gcmJ0cmVlLm8KLQotQUxMX09CSlMgPSAkKFBFVkVOVF9MSUJfT0JKUykKLQogQ01EX1RBUkdFVFMgPSAkKExJQl9GSUxFKQogCiBUQVJHRVRTID0gJChDTURfVEFSR0VUUykKQEAgLTE2OSw0MiArMTEyLDE1IEBACiAKIGFsbF9jbWQ6ICQoQ01EX1RBUkdFVFMpCiAKLWxpYmxvY2tkZXAuc28uJChMSUJMT0NLREVQX1ZFUlNJT04pOiAkKFBFVkVOVF9MSUJfT0JKUykKKyQoTElCX0lOKTogZm9yY2UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT1saWJsb2NrZGVwCisKK2xpYmxvY2tkZXAuc28uJChMSUJMT0NLREVQX1ZFUlNJT04pOiAkKExJQl9JTikKIAkkKFEpJChkb19jb21waWxlX3NoYXJlZF9saWJyYXJ5KQogCi1saWJsb2NrZGVwLmE6ICQoUEVWRU5UX0xJQl9PQkpTKQorbGlibG9ja2RlcC5hOiAkKExJQl9JTikKIAkkKFEpJChkb19idWlsZF9zdGF0aWNfbGliKQogCi0kKFBFVkVOVF9MSUJfT0JKUyk6ICUubzogJChzcmMpLyUuYwotCSQoUSkkKGRvX2ZwaWNfY29tcGlsZSkKLQotIyMgbWFrZSBkZXBzCi0KLWFsbF9vYmpzIDo9ICQoc29ydCAkKEFMTF9PQkpTKSkKLWFsbF9kZXBzIDo9ICQoYWxsX29ianM6JS5vPS4lLmQpCi0KLSMgbGV0IC5kIGZpbGUgYWxzbyBkZXBlbmRzIG9uIHRoZSBzb3VyY2UgYW5kIGhlYWRlciBmaWxlcwotZGVmaW5lIGNoZWNrX2RlcHMKLQkJQHNldCAtZTsgJChSTSkgJEA7IFwKLQkJJChDQykgLU1NICQoQ0ZMQUdTKSAkPCA+ICRALiQkJCQ7IFwKLQkJc2VkICdzLFwoJCpcKVwub1sgOl0qLFwxLm8gJEAgOiAsZycgPCAkQC4kJCQkID4gJEA7IFwKLQkJJChSTSkgJEAuJCQkJAotZW5kZWYKLQotJChhbGxfZGVwcyk6IC4lLmQ6ICQoc3JjKS8lLmMKLQkkKFEpJChjYWxsIGNoZWNrX2RlcHMpCi0KLSQoYWxsX29ianMpIDogJS5vIDogLiUuZAotCi1kZXBfaW5jbHVkZXMgOj0gJCh3aWxkY2FyZCAkKGFsbF9kZXBzKSkKLQotaWZuZXEgKCQoZGVwX2luY2x1ZGVzKSwpCi0gaW5jbHVkZSAkKGRlcF9pbmNsdWRlcykKLWVuZGlmCi0KLSMjIyBEZXRlY3QgZW52aXJvbm1lbnQgY2hhbmdlcwotVFJBQ0tfQ0ZMQUdTID0gJChzdWJzdCAnLCdcJycsJChDRkxBR1MpKTokKEFSQ0gpOiQoQ1JPU1NfQ09NUElMRSkKLQogdGFnczoJZm9yY2UKIAkkKFJNKSB0YWdzCiAJZmluZCAuIC1uYW1lICcqLltjaF0nIHwgeGFyZ3MgY3RhZ3MgLS1leHRyYT0rZiAtLWMta2luZHM9K3B4IFwKQEAgLTIzMyw4ICsxNDksNiBAQAogCSQoUk0pICoubyAqfiAkKFRBUkdFVFMpICouYSAqbGlibG9ja2RlcCouc28qICQoVkVSU0lPTl9GSUxFUykgLiouZAogCSQoUk0pIHRhZ3MgVEFHUwogCi1lbmRpZiAjIHNraXAtbWFrZWZpbGUKLQogUEhPTlkgKz0gZm9yY2UKIGZvcmNlOgogCmRpZmYgLS1naXQgYS90b29scy9saWIvdHJhY2VldmVudC9CdWlsZCBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L0J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ODFkMDUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9saWIvdHJhY2VldmVudC9CdWlsZApAQCAtMCwwICsxLDE3IEBACitsaWJ0cmFjZWV2ZW50LXkgKz0gZXZlbnQtcGFyc2UubworbGlidHJhY2VldmVudC15ICs9IGV2ZW50LXBsdWdpbi5vCitsaWJ0cmFjZWV2ZW50LXkgKz0gdHJhY2Utc2VxLm8KK2xpYnRyYWNlZXZlbnQteSArPSBwYXJzZS1maWx0ZXIubworbGlidHJhY2VldmVudC15ICs9IHBhcnNlLXV0aWxzLm8KK2xpYnRyYWNlZXZlbnQteSArPSBrYnVmZmVyLXBhcnNlLm8KKworcGx1Z2luX2piZDIteSAgICAgICAgICs9IHBsdWdpbl9qYmQyLm8KK3BsdWdpbl9ocnRpbWVyLXkgICAgICArPSBwbHVnaW5faHJ0aW1lci5vCitwbHVnaW5fa21lbS15ICAgICAgICAgKz0gcGx1Z2luX2ttZW0ubworcGx1Z2luX2t2bS15ICAgICAgICAgICs9IHBsdWdpbl9rdm0ubworcGx1Z2luX21hYzgwMjExLXkgICAgICs9IHBsdWdpbl9tYWM4MDIxMS5vCitwbHVnaW5fc2NoZWRfc3dpdGNoLXkgKz0gcGx1Z2luX3NjaGVkX3N3aXRjaC5vCitwbHVnaW5fZnVuY3Rpb24teSAgICAgKz0gcGx1Z2luX2Z1bmN0aW9uLm8KK3BsdWdpbl94ZW4teSAgICAgICAgICArPSBwbHVnaW5feGVuLm8KK3BsdWdpbl9zY3NpLXkgICAgICAgICArPSBwbHVnaW5fc2NzaS5vCitwbHVnaW5fY2ZnODAyMTEteSAgICAgKz0gcGx1Z2luX2NmZzgwMjExLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi90cmFjZWV2ZW50L01ha2VmaWxlIGIvdG9vbHMvbGliL3RyYWNlZXZlbnQvTWFrZWZpbGUKaW5kZXggMDA1YzljYy4uZDQxMGRhMyAxMDA2NDQKLS0tIGEvdG9vbHMvbGliL3RyYWNlZXZlbnQvTWFrZWZpbGUKKysrIGIvdG9vbHMvbGliL3RyYWNlZXZlbnQvTWFrZWZpbGUKQEAgLTY3LDcgKzY3LDcgQEAKIFBMVUdJTl9ESVJfU1EgPSAnJChzdWJzdCAnLCdcJycsJChQTFVHSU5fRElSKSknCiBlbmRpZgogCi1pbmNsdWRlICQoaWYgJChCVUlMRF9TUkMpLCQoQlVJTERfU1JDKS8pLi4vLi4vc2NyaXB0cy9NYWtlZmlsZS5pbmNsdWRlCitpbmNsdWRlIC4uLy4uL3NjcmlwdHMvTWFrZWZpbGUuaW5jbHVkZQogCiAjIGNvcHkgYSBiaXQgZnJvbSBMaW51eCBrYnVpbGQKIApAQCAtNzgsNDAgKzc4LDEzIEBACiAgIFZFUkJPU0UgPSAwCiBlbmRpZgogCi1pZmVxICgiJChvcmlnaW4gTykiLCAiY29tbWFuZCBsaW5lIikKLSAgQlVJTERfT1VUUFVUIDo9ICQoTykKK2lmZXEgKCQoc3JjdHJlZSksKQorc3JjdHJlZSA6PSAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJChzaGVsbCBwd2QpKSkKK3NyY3RyZWUgOj0gJChwYXRzdWJzdCAlLywlLCQoZGlyICQoc3JjdHJlZSkpKQorc3JjdHJlZSA6PSAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJChzcmN0cmVlKSkpCisjJChpbmZvIERldGVybWluZWQgJ3NyY3RyZWUnIHRvIGJlICQoc3JjdHJlZSkpCiBlbmRpZgogCi1pZmVxICgkKEJVSUxEX1NSQyksKQotaWZuZXEgKCQoT1VUUFVUKSwpCi0KLWRlZmluZSBidWlsZF9vdXRwdXQKLSAgJChpZiAkKFZFUkJPU0U6MT0pLEApKyQoTUFLRSkgLUMgJChPVVRQVVQpIFwKLSAgQlVJTERfU1JDPSQoQ1VSRElSKS8gLWYgJChDVVJESVIpL01ha2VmaWxlICQxCi1lbmRlZgotCi1hbGw6IHN1Yi1tYWtlCi0KLSQoTUFLRUNNREdPQUxTKTogc3ViLW1ha2UKLQotc3ViLW1ha2U6IGZvcmNlCi0JJChjYWxsIGJ1aWxkX291dHB1dCwgJChNQUtFQ01ER09BTFMpKQotCi0KLSMgTGVhdmUgcHJvY2Vzc2luZyB0byBhYm92ZSBpbnZvY2F0aW9uIG9mIG1ha2UKLXNraXAtbWFrZWZpbGUgOj0gMQotCi1lbmRpZiAjIE9VVFBVVAotZW5kaWYgIyBCVUlMRF9TUkMKLQotIyBXZSBwcm9jZXNzIHRoZSByZXN0IG9mIHRoZSBNYWtlZmlsZSBpZiB0aGlzIGlzIHRoZSBmaW5hbCBpbnZvY2F0aW9uIG9mIG1ha2UKLWlmZXEgKCQoc2tpcC1tYWtlZmlsZSksKQotCi1zcmN0cmVlCQk6PSAkKGlmICQoQlVJTERfU1JDKSwkKEJVSUxEX1NSQyksJChDVVJESVIpKQotb2JqdHJlZQkJOj0gJChDVVJESVIpCi1zcmMJCTo9ICQoc3JjdHJlZSkKLW9iagkJOj0gJChvYmp0cmVlKQotCiBleHBvcnQgcHJlZml4IGJpbmRpciBzcmMgb2JqCiAKICMgU2hlbGwgcXVvdGVzCkBAIC0xMzIsMTYgKzEwNSwxOSBAQAogT0JKCQk9ICRACiBOCQk9CiAKLWV4cG9ydCBRIFZFUkJPU0UKLQogRVZFTlRfUEFSU0VfVkVSU0lPTiA9ICQoRVBfVkVSU0lPTikuJChFUF9QQVRDSExFVkVMKS4kKEVQX0VYVFJBVkVSU0lPTikKIAotSU5DTFVERVMgPSAtSS4gLUkgJChzcmN0cmVlKS8uLi8uLi9pbmNsdWRlICQoQ09ORklHX0lOQ0xVREVTKQorSU5DTFVERVMgPSAtSS4gLUkgJChzcmN0cmVlKS90b29scy9pbmNsdWRlICQoQ09ORklHX0lOQ0xVREVTKQogCi0jIFNldCBjb21waWxlIG9wdGlvbiBDRkxBR1MgaWYgbm90IHNldCBlbHNld2hlcmUKLUNGTEFHUyA/PSAtZyAtV2FsbAorIyBTZXQgY29tcGlsZSBvcHRpb24gQ0ZMQUdTCitpZmRlZiBFWFRSQV9DRkxBR1MKKyAgQ0ZMQUdTIDo9ICQoRVhUUkFfQ0ZMQUdTKQorZWxzZQorICBDRkxBR1MgOj0gLWcgLVdhbGwKK2VuZGlmCiAKICMgQXBwZW5kIHJlcXVpcmVkIENGTEFHUworb3ZlcnJpZGUgQ0ZMQUdTICs9IC1mUElDCiBvdmVycmlkZSBDRkxBR1MgKz0gJChDT05GSUdfRkxBR1MpICQoSU5DTFVERVMpICQoUExVR0lOX0RJUl9TUSkKIG92ZXJyaWRlIENGTEFHUyArPSAkKHVkaXM4Ni1mbGFncykgLURfR05VX1NPVVJDRQogCkBAIC0xNTEsNzQgKzEyNyw1OCBAQAogICBRID0gQAogZW5kaWYKIAotZG9fY29tcGlsZV9zaGFyZWRfbGlicmFyeSA9CQkJXAotCSgkKHByaW50X3NoYXJlZF9saWJfY29tcGlsZSkJCVwKLQkkKENDKSAtLXNoYXJlZCAkXiAtbyAkQCkKKyMgRGlzYWJsZSBjb21tYW5kIGxpbmUgdmFyaWFibGVzIChDRkxBR1MpIG92ZXJpZGUgZnJvbSB0b3AKKyMgbGV2ZWwgTWFrZWZpbGUgKHBlcmYpLCBvdGhlcndpc2UgYnVpbGQgTWFrZWZpbGUgd2lsbCBnZXQKKyMgdGhlIHNhbWUgY29tbWFuZCBsaW5lIHNldHVwLgorTUFLRU9WRVJSSURFUz0KIAotZG9fcGx1Z2luX2J1aWxkID0JCQkJXAotCSgkKHByaW50X3BsdWdpbl9idWlsZCkJCQlcCi0JJChDQykgJChDRkxBR1MpIC1zaGFyZWQgLW5vc3RhcnRmaWxlcyAtbyAkQCAkPCkKK2V4cG9ydCBzcmN0cmVlIE9VVFBVVCBDQyBMRCBDRkxBR1MgVgorYnVpbGQgOj0gLWYgJChzcmN0cmVlKS90b29scy9idWlsZC9NYWtlZmlsZS5idWlsZCBkaXI9LiBvYmoKIAotZG9fYnVpbGRfc3RhdGljX2xpYiA9CQkJCVwKLQkoJChwcmludF9zdGF0aWNfbGliX2J1aWxkKQkJXAotCSQoUk0pICRAOyAgJChBUikgcmNzICRAICReKQorUExVR0lOUyAgPSBwbHVnaW5famJkMi5zbworUExVR0lOUyArPSBwbHVnaW5faHJ0aW1lci5zbworUExVR0lOUyArPSBwbHVnaW5fa21lbS5zbworUExVR0lOUyArPSBwbHVnaW5fa3ZtLnNvCitQTFVHSU5TICs9IHBsdWdpbl9tYWM4MDIxMS5zbworUExVR0lOUyArPSBwbHVnaW5fc2NoZWRfc3dpdGNoLnNvCitQTFVHSU5TICs9IHBsdWdpbl9mdW5jdGlvbi5zbworUExVR0lOUyArPSBwbHVnaW5feGVuLnNvCitQTFVHSU5TICs9IHBsdWdpbl9zY3NpLnNvCitQTFVHSU5TICs9IHBsdWdpbl9jZmc4MDIxMS5zbwogCitQTFVHSU5TICAgIDo9ICQoYWRkcHJlZml4ICQoT1VUUFVUKSwkKFBMVUdJTlMpKQorUExVR0lOU19JTiA6PSAkKFBMVUdJTlM6LnNvPS1pbi5vKQogCi1kb19jb21waWxlID0gJChRVUlFVF9DQykkKENDKSAtYyAkKENGTEFHUykgJChFWFQpICQ8IC1vICQob2JqKS8kQDsKLQotJChvYmopLyUubzogJChzcmMpLyUuYwotCSQoY2FsbCBkb19jb21waWxlKQotCi0lLm86ICQoc3JjKS8lLmMKLQkkKGNhbGwgZG9fY29tcGlsZSkKLQotUEVWRU5UX0xJQl9PQkpTICA9IGV2ZW50LXBhcnNlLm8KLVBFVkVOVF9MSUJfT0JKUyArPSBldmVudC1wbHVnaW4ubwotUEVWRU5UX0xJQl9PQkpTICs9IHRyYWNlLXNlcS5vCi1QRVZFTlRfTElCX09CSlMgKz0gcGFyc2UtZmlsdGVyLm8KLVBFVkVOVF9MSUJfT0JKUyArPSBwYXJzZS11dGlscy5vCi1QRVZFTlRfTElCX09CSlMgKz0ga2J1ZmZlci1wYXJzZS5vCi0KLVBMVUdJTl9PQkpTICA9IHBsdWdpbl9qYmQyLm8KLVBMVUdJTl9PQkpTICs9IHBsdWdpbl9ocnRpbWVyLm8KLVBMVUdJTl9PQkpTICs9IHBsdWdpbl9rbWVtLm8KLVBMVUdJTl9PQkpTICs9IHBsdWdpbl9rdm0ubwotUExVR0lOX09CSlMgKz0gcGx1Z2luX21hYzgwMjExLm8KLVBMVUdJTl9PQkpTICs9IHBsdWdpbl9zY2hlZF9zd2l0Y2gubwotUExVR0lOX09CSlMgKz0gcGx1Z2luX2Z1bmN0aW9uLm8KLVBMVUdJTl9PQkpTICs9IHBsdWdpbl94ZW4ubwotUExVR0lOX09CSlMgKz0gcGx1Z2luX3Njc2kubwotUExVR0lOX09CSlMgKz0gcGx1Z2luX2NmZzgwMjExLm8KLQotUExVR0lOUyA6PSAkKFBMVUdJTl9PQkpTOi5vPS5zbykKLQotQUxMX09CSlMgPSAkKFBFVkVOVF9MSUJfT0JKUykgJChQTFVHSU5fT0JKUykKK1RFX0lOICAgIDo9ICQoT1VUUFVUKWxpYnRyYWNlZXZlbnQtaW4ubworTElCX0ZJTEUgOj0gJChhZGRwcmVmaXggJChPVVRQVVQpLCQoTElCX0ZJTEUpKQogCiBDTURfVEFSR0VUUyA9ICQoTElCX0ZJTEUpICQoUExVR0lOUykKIAogVEFSR0VUUyA9ICQoQ01EX1RBUkdFVFMpCiAKLQogYWxsOiBhbGxfY21kCiAKIGFsbF9jbWQ6ICQoQ01EX1RBUkdFVFMpCiAKLWxpYnRyYWNlZXZlbnQuc286ICQoUEVWRU5UX0xJQl9PQkpTKQorJChURV9JTik6IGZvcmNlCisJJChRKSQoTUFLRSkgJChidWlsZCk9bGlidHJhY2VldmVudAorCiskKE9VVFBVVClsaWJ0cmFjZWV2ZW50LnNvOiAkKFRFX0lOKQogCSQoUVVJRVRfTElOSykkKENDKSAtLXNoYXJlZCAkXiAtbyAkQAogCi1saWJ0cmFjZWV2ZW50LmE6ICQoUEVWRU5UX0xJQl9PQkpTKQorJChPVVRQVVQpbGlidHJhY2VldmVudC5hOiAkKFRFX0lOKQogCSQoUVVJRVRfTElOSykkKFJNKSAkQDsgJChBUikgcmNzICRAICReCiAKIHBsdWdpbnM6ICQoUExVR0lOUykKIAotJChQRVZFTlRfTElCX09CSlMpOiAlLm86ICQoc3JjKS8lLmMgVFJBQ0VFVkVOVC1DRkxBR1MKLQkkKFFVSUVUX0NDX0ZQSUMpJChDQykgLWMgJChDRkxBR1MpICQoRVhUKSAtZlBJQyAkPCAtbyAkQAorX19wbHVnaW5fb2JqID0gJChub3RkaXIgJEApCisgIHBsdWdpbl9vYmogPSAkKF9fcGx1Z2luX29iajotaW4ubz0pCiAKLSQoUExVR0lOX09CSlMpOiAlLm8gOiAkKHNyYykvJS5jCi0JJChRVUlFVF9DQ19GUElDKSQoQ0MpIC1jICQoQ0ZMQUdTKSAtZlBJQyAtbyAkQCAkPAorJChQTFVHSU5TX0lOKTogZm9yY2UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKHBsdWdpbl9vYmopCiAKLSQoUExVR0lOUyk6ICUuc286ICUubwotCSQoUVVJRVRfTElOSykkKENDKSAkKENGTEFHUykgLXNoYXJlZCAtbm9zdGFydGZpbGVzIC1vICRAICQ8CiskKE9VVFBVVCklLnNvOiAkKE9VVFBVVCklLWluLm8KKwkkKFFVSUVUX0xJTkspJChDQykgJChDRkxBR1MpIC1zaGFyZWQgLW5vc3RhcnRmaWxlcyAtbyAkQCAkXgogCiBkZWZpbmUgbWFrZV92ZXJzaW9uLmgKICAgKGVjaG8gJy8qIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRG8gbm90IG1vZGlmeS4gKi8nOwkJXApAQCAtMjU1LDQwICsyMTUsNiBAQAogICAgZmkpOwogZW5kZWYKIAotIyMgbWFrZSBkZXBzCi0KLWFsbF9vYmpzIDo9ICQoc29ydCAkKEFMTF9PQkpTKSkKLWFsbF9kZXBzIDo9ICQoYWxsX29ianM6JS5vPS4lLmQpCi0KLSMgbGV0IC5kIGZpbGUgYWxzbyBkZXBlbmRzIG9uIHRoZSBzb3VyY2UgYW5kIGhlYWRlciBmaWxlcwotZGVmaW5lIGNoZWNrX2RlcHMKLSAgQHNldCAtZTsgJChSTSkgJEA7IFwKLSAgJChDQykgLU1NICQoQ0ZMQUdTKSAkPCA+ICRALiQkJCQ7IFwKLSAgc2VkICdzLFwoJCpcKVwub1sgOl0qLFwxLm8gJEAgOiAsZycgPCAkQC4kJCQkID4gJEA7IFwKLSAgJChSTSkgJEAuJCQkJAotZW5kZWYKLQotJChhbGxfZGVwcyk6IC4lLmQ6ICQoc3JjKS8lLmMKLQkkKFEpJChjYWxsIGNoZWNrX2RlcHMpCi0KLSQoYWxsX29ianMpIDogJS5vIDogLiUuZAotCi1kZXBfaW5jbHVkZXMgOj0gJCh3aWxkY2FyZCAkKGFsbF9kZXBzKSkKLQotaWZuZXEgKCQoZGVwX2luY2x1ZGVzKSwpCi0gaW5jbHVkZSAkKGRlcF9pbmNsdWRlcykKLWVuZGlmCi0KLSMjIyBEZXRlY3QgZW52aXJvbm1lbnQgY2hhbmdlcwotVFJBQ0tfQ0ZMQUdTID0gJChzdWJzdCAnLCdcJycsJChDRkxBR1MpKTokKEFSQ0gpOiQoQ1JPU1NfQ09NUElMRSkKLQotVFJBQ0VFVkVOVC1DRkxBR1M6IGZvcmNlCi0JQEZMQUdTPSckKFRSQUNLX0NGTEFHUyknOyBcCi0JICAgIGlmIHRlc3QgeCIkJEZMQUdTIiAhPSB4ImBjYXQgVFJBQ0VFVkVOVC1DRkxBR1MgMj4vZGV2L251bGxgIiA7IHRoZW4gXAotCQllY2hvIDE+JjIgIiAgRkxBR1M6ICAgKiBuZXcgYnVpbGQgZmxhZ3Mgb3IgY3Jvc3MgY29tcGlsZXIiOyBcCi0JCWVjaG8gIiQkRkxBR1MiID5UUkFDRUVWRU5ULUNGTEFHUzsgXAotICAgICAgICAgICAgZmkKLQogdGFnczoJZm9yY2UKIAkkKFJNKSB0YWdzCiAJZmluZCAuIC1uYW1lICcqLltjaF0nIHwgeGFyZ3MgY3RhZ3MgLS1leHRyYT0rZiAtLWMta2luZHM9K3B4IFwKQEAgLTMyNywxNCArMjUzLDkgQEAKIAkJJChSTSkgKi5vICp+ICQoVEFSR0VUUykgKi5hICouc28gJChWRVJTSU9OX0ZJTEVTKSAuKi5kIFwKIAkJJChSTSkgVFJBQ0VFVkVOVC1DRkxBR1MgdGFncyBUQUdTCiAKLWVuZGlmICMgc2tpcC1tYWtlZmlsZQotCiBQSE9OWSArPSBmb3JjZSBwbHVnaW5zCiBmb3JjZToKIAotcGx1Z2luczoKLQlAZWNobyA+IC9kZXYvbnVsbAotCiAjIERlY2xhcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSAuUEhPTlkgdmFyaWFibGUgYXMgcGhvbnkuICBXZSBrZWVwIHRoYXQKICMgaW5mb3JtYXRpb24gaW4gYSB2YXJpYWJsZSBzbyB3ZSBjYW4gdXNlIGl0IGluIGlmX2NoYW5nZWQgYW5kIGZyaWVuZHMuCiAuUEhPTlk6ICQoUEhPTlkpCmRpZmYgLS1naXQgYS90b29scy9saWIvdHJhY2VldmVudC9ldmVudC1wYXJzZS5jIGIvdG9vbHMvbGliL3RyYWNlZXZlbnQvZXZlbnQtcGFyc2UuYwppbmRleCBhZmUyMGVkLi5lMDkxN2MwIDEwMDY0NAotLS0gYS90b29scy9saWIvdHJhY2VldmVudC9ldmVudC1wYXJzZS5jCisrKyBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L2V2ZW50LXBhcnNlLmMKQEAgLTMwNCw3ICszMDQsMTAgQEAKIAlpZiAoIWl0ZW0pCiAJCXJldHVybiAtMTsKIAotCWl0ZW0tPmNvbW0gPSBzdHJkdXAoY29tbSk7CisJaWYgKGNvbW0pCisJCWl0ZW0tPmNvbW0gPSBzdHJkdXAoY29tbSk7CisJZWxzZQorCQlpdGVtLT5jb21tID0gc3RyZHVwKCI8Li4uPiIpOwogCWlmICghaXRlbS0+Y29tbSkgewogCQlmcmVlKGl0ZW0pOwogCQlyZXR1cm4gLTE7CkBAIC0zMTgsOSArMzIxLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgcGV2ZW50X3JlZ2lzdGVyX3RyYWNlX2Nsb2NrKHN0cnVjdCBwZXZlbnQgKnBldmVudCwgY2hhciAqdHJhY2VfY2xvY2spCitpbnQgcGV2ZW50X3JlZ2lzdGVyX3RyYWNlX2Nsb2NrKHN0cnVjdCBwZXZlbnQgKnBldmVudCwgY29uc3QgY2hhciAqdHJhY2VfY2xvY2spCiB7Ci0JcGV2ZW50LT50cmFjZV9jbG9jayA9IHRyYWNlX2Nsb2NrOworCXBldmVudC0+dHJhY2VfY2xvY2sgPSBzdHJkdXAodHJhY2VfY2xvY2spOworCWlmICghcGV2ZW50LT50cmFjZV9jbG9jaykgeworCQllcnJubyA9IEVOT01FTTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RydWN0IGZ1bmNfbWFwIHsKQEAgLTc1OCw2ICs3NjYsMTEgQEAKIAkJZnJlZV9hcmcoYXJnLT5oZXguZmllbGQpOwogCQlmcmVlX2FyZyhhcmctPmhleC5zaXplKTsKIAkJYnJlYWs7CisJY2FzZSBQUklOVF9JTlRfQVJSQVk6CisJCWZyZWVfYXJnKGFyZy0+aW50X2FycmF5LmZpZWxkKTsKKwkJZnJlZV9hcmcoYXJnLT5pbnRfYXJyYXkuY291bnQpOworCQlmcmVlX2FyZyhhcmctPmludF9hcnJheS5lbF9zaXplKTsKKwkJYnJlYWs7CiAJY2FzZSBQUklOVF9UWVBFOgogCQlmcmVlKGFyZy0+dHlwZWNhc3QudHlwZSk7CiAJCWZyZWVfYXJnKGFyZy0+dHlwZWNhc3QuaXRlbSk7CkBAIC0xOTI2LDcgKzE5MzksMjIgQEAKIAkJCWdvdG8gb3V0X3dhcm5fZnJlZTsKIAogCQl0eXBlID0gcHJvY2Vzc19hcmdfdG9rZW4oZXZlbnQsIHJpZ2h0LCB0b2ssIHR5cGUpOwotCQlhcmctPm9wLnJpZ2h0ID0gcmlnaHQ7CisKKwkJaWYgKHJpZ2h0LT50eXBlID09IFBSSU5UX09QICYmCisJCSAgICBnZXRfb3BfcHJpbyhhcmctPm9wLm9wKSA8IGdldF9vcF9wcmlvKHJpZ2h0LT5vcC5vcCkpIHsKKwkJCXN0cnVjdCBwcmludF9hcmcgdG1wOworCisJCQkvKiByb3RhdGUgb3BzIGFjY29yZGluZyB0byB0aGUgcHJpb3JpdHkgKi8KKwkJCWFyZy0+b3AucmlnaHQgPSByaWdodC0+b3AubGVmdDsKKworCQkJdG1wID0gKmFyZzsKKwkJCSphcmcgPSAqcmlnaHQ7CisJCQkqcmlnaHQgPSB0bXA7CisKKwkJCWFyZy0+b3AubGVmdCA9IHJpZ2h0OworCQl9IGVsc2UgeworCQkJYXJnLT5vcC5yaWdodCA9IHJpZ2h0OworCQl9CiAKIAl9IGVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgIlsiKSA9PSAwKSB7CiAKQEAgLTIwMTQsNiArMjA0MiwzOCBAQAogCXJldHVybiBFVkVOVF9FUlJPUjsKIH0KIAorc3RhdGljIGludCBhbGxvY19hbmRfcHJvY2Vzc19kZWxpbShzdHJ1Y3QgZXZlbnRfZm9ybWF0ICpldmVudCwgY2hhciAqbmV4dF90b2tlbiwKKwkJCQkgICBzdHJ1Y3QgcHJpbnRfYXJnICoqcHJpbnRfYXJnKQoreworCXN0cnVjdCBwcmludF9hcmcgKmZpZWxkOworCWVudW0gZXZlbnRfdHlwZSB0eXBlOworCWNoYXIgKnRva2VuOworCWludCByZXQgPSAwOworCisJZmllbGQgPSBhbGxvY19hcmcoKTsKKwlpZiAoIWZpZWxkKSB7CisJCWRvX3dhcm5pbmdfZXZlbnQoZXZlbnQsICIlczogbm90IGVub3VnaCBtZW1vcnkhIiwgX19mdW5jX18pOworCQllcnJubyA9IEVOT01FTTsKKwkJcmV0dXJuIC0xOworCX0KKworCXR5cGUgPSBwcm9jZXNzX2FyZyhldmVudCwgZmllbGQsICZ0b2tlbik7CisKKwlpZiAodGVzdF90eXBlX3Rva2VuKHR5cGUsIHRva2VuLCBFVkVOVF9ERUxJTSwgbmV4dF90b2tlbikpIHsKKwkJZXJybm8gPSBFSU5WQUw7CisJCXJldCA9IC0xOworCQlmcmVlX2FyZyhmaWVsZCk7CisJCWdvdG8gb3V0X2ZyZWVfdG9rZW47CisJfQorCisJKnByaW50X2FyZyA9IGZpZWxkOworCitvdXRfZnJlZV90b2tlbjoKKwlmcmVlX3Rva2VuKHRva2VuKTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBjaGFyICphcmdfZXZhbCAoc3RydWN0IHByaW50X2FyZyAqYXJnKTsKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZwpAQCAtMjQ4Niw0OSArMjU0Niw0NiBAQAogc3RhdGljIGVudW0gZXZlbnRfdHlwZQogcHJvY2Vzc19oZXgoc3RydWN0IGV2ZW50X2Zvcm1hdCAqZXZlbnQsIHN0cnVjdCBwcmludF9hcmcgKmFyZywgY2hhciAqKnRvaykKIHsKLQlzdHJ1Y3QgcHJpbnRfYXJnICpmaWVsZDsKLQllbnVtIGV2ZW50X3R5cGUgdHlwZTsKLQljaGFyICp0b2tlbiA9IE5VTEw7Ci0KIAltZW1zZXQoYXJnLCAwLCBzaXplb2YoKmFyZykpOwogCWFyZy0+dHlwZSA9IFBSSU5UX0hFWDsKIAotCWZpZWxkID0gYWxsb2NfYXJnKCk7Ci0JaWYgKCFmaWVsZCkgewotCQlkb193YXJuaW5nX2V2ZW50KGV2ZW50LCAiJXM6IG5vdCBlbm91Z2ggbWVtb3J5ISIsIF9fZnVuY19fKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9CisJaWYgKGFsbG9jX2FuZF9wcm9jZXNzX2RlbGltKGV2ZW50LCAiLCIsICZhcmctPmhleC5maWVsZCkpCisJCWdvdG8gb3V0OwogCi0JdHlwZSA9IHByb2Nlc3NfYXJnKGV2ZW50LCBmaWVsZCwgJnRva2VuKTsKKwlpZiAoYWxsb2NfYW5kX3Byb2Nlc3NfZGVsaW0oZXZlbnQsICIpIiwgJmFyZy0+aGV4LnNpemUpKQorCQlnb3RvIGZyZWVfZmllbGQ7CiAKLQlpZiAodGVzdF90eXBlX3Rva2VuKHR5cGUsIHRva2VuLCBFVkVOVF9ERUxJTSwgIiwiKSkKLQkJZ290byBvdXRfZnJlZTsKKwlyZXR1cm4gcmVhZF90b2tlbl9pdGVtKHRvayk7CiAKLQlhcmctPmhleC5maWVsZCA9IGZpZWxkOworZnJlZV9maWVsZDoKKwlmcmVlX2FyZyhhcmctPmhleC5maWVsZCk7CitvdXQ6CisJKnRvayA9IE5VTEw7CisJcmV0dXJuIEVWRU5UX0VSUk9SOworfQogCi0JZnJlZV90b2tlbih0b2tlbik7CitzdGF0aWMgZW51bSBldmVudF90eXBlCitwcm9jZXNzX2ludF9hcnJheShzdHJ1Y3QgZXZlbnRfZm9ybWF0ICpldmVudCwgc3RydWN0IHByaW50X2FyZyAqYXJnLCBjaGFyICoqdG9rKQoreworCW1lbXNldChhcmcsIDAsIHNpemVvZigqYXJnKSk7CisJYXJnLT50eXBlID0gUFJJTlRfSU5UX0FSUkFZOwogCi0JZmllbGQgPSBhbGxvY19hcmcoKTsKLQlpZiAoIWZpZWxkKSB7Ci0JCWRvX3dhcm5pbmdfZXZlbnQoZXZlbnQsICIlczogbm90IGVub3VnaCBtZW1vcnkhIiwgX19mdW5jX18pOwotCQkqdG9rID0gTlVMTDsKLQkJcmV0dXJuIEVWRU5UX0VSUk9SOwotCX0KKwlpZiAoYWxsb2NfYW5kX3Byb2Nlc3NfZGVsaW0oZXZlbnQsICIsIiwgJmFyZy0+aW50X2FycmF5LmZpZWxkKSkKKwkJZ290byBvdXQ7CiAKLQl0eXBlID0gcHJvY2Vzc19hcmcoZXZlbnQsIGZpZWxkLCAmdG9rZW4pOworCWlmIChhbGxvY19hbmRfcHJvY2Vzc19kZWxpbShldmVudCwgIiwiLCAmYXJnLT5pbnRfYXJyYXkuY291bnQpKQorCQlnb3RvIGZyZWVfZmllbGQ7CiAKLQlpZiAodGVzdF90eXBlX3Rva2VuKHR5cGUsIHRva2VuLCBFVkVOVF9ERUxJTSwgIikiKSkKLQkJZ290byBvdXRfZnJlZTsKKwlpZiAoYWxsb2NfYW5kX3Byb2Nlc3NfZGVsaW0oZXZlbnQsICIpIiwgJmFyZy0+aW50X2FycmF5LmVsX3NpemUpKQorCQlnb3RvIGZyZWVfc2l6ZTsKIAotCWFyZy0+aGV4LnNpemUgPSBmaWVsZDsKKwlyZXR1cm4gcmVhZF90b2tlbl9pdGVtKHRvayk7CiAKLQlmcmVlX3Rva2VuKHRva2VuKTsKLQl0eXBlID0gcmVhZF90b2tlbl9pdGVtKHRvayk7Ci0JcmV0dXJuIHR5cGU7Ci0KLSBvdXRfZnJlZToKLQlmcmVlX2FyZyhmaWVsZCk7Ci0JZnJlZV90b2tlbih0b2tlbik7CitmcmVlX3NpemU6CisJZnJlZV9hcmcoYXJnLT5pbnRfYXJyYXkuY291bnQpOworZnJlZV9maWVsZDoKKwlmcmVlX2FyZyhhcmctPmludF9hcnJheS5maWVsZCk7CitvdXQ6CiAJKnRvayA9IE5VTEw7CiAJcmV0dXJuIEVWRU5UX0VSUk9SOwogfQpAQCAtMjgyOCw2ICsyODg1LDEwIEBACiAJCWZyZWVfdG9rZW4odG9rZW4pOwogCQlyZXR1cm4gcHJvY2Vzc19oZXgoZXZlbnQsIGFyZywgdG9rKTsKIAl9CisJaWYgKHN0cmNtcCh0b2tlbiwgIl9fcHJpbnRfYXJyYXkiKSA9PSAwKSB7CisJCWZyZWVfdG9rZW4odG9rZW4pOworCQlyZXR1cm4gcHJvY2Vzc19pbnRfYXJyYXkoZXZlbnQsIGFyZywgdG9rKTsKKwl9CiAJaWYgKHN0cmNtcCh0b2tlbiwgIl9fZ2V0X3N0ciIpID09IDApIHsKIAkJZnJlZV90b2tlbih0b2tlbik7CiAJCXJldHVybiBwcm9jZXNzX3N0cihldmVudCwgYXJnLCB0b2spOwpAQCAtMzM1Niw2ICszNDE3LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBQUklOVF9GTEFHUzoKIAljYXNlIFBSSU5UX1NZTUJPTDoKKwljYXNlIFBSSU5UX0lOVF9BUlJBWToKIAljYXNlIFBSSU5UX0hFWDoKIAkJYnJlYWs7CiAJY2FzZSBQUklOVF9UWVBFOgpAQCAtMzU2OCw3ICszNjMwLDcgQEAKIAl7ICJIUlRJTUVSX1JFU1RBUlQiLCAxIH0sCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGV2YWxfZmxhZyhjb25zdCBjaGFyICpmbGFnKQorc3RhdGljIGxvbmcgbG9uZyBldmFsX2ZsYWcoY29uc3QgY2hhciAqZmxhZykKIHsKIAlpbnQgaTsKIApAQCAtMzU4NCw3ICszNjQ2LDcgQEAKIAkJaWYgKHN0cmNtcChmbGFnc1tpXS5uYW1lLCBmbGFnKSA9PSAwKQogCQkJcmV0dXJuIGZsYWdzW2ldLnZhbHVlOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIC0xTEw7CiB9CiAKIHN0YXRpYyB2b2lkIHByaW50X3N0cl90b19zZXEoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm9ybWF0LApAQCAtMzY1OCw3ICszNzIwLDcgQEAKIAlzdHJ1Y3QgcHJpbnRfZmxhZ19zeW0gKmZsYWc7CiAJc3RydWN0IGZvcm1hdF9maWVsZCAqZmllbGQ7CiAJc3RydWN0IHByaW50a19tYXAgKnByaW50azsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdmFsLCBmdmFsOworCWxvbmcgbG9uZyB2YWwsIGZ2YWw7CiAJdW5zaWduZWQgbG9uZyBhZGRyOwogCWNoYXIgKnN0cjsKIAl1bnNpZ25lZCBjaGFyICpoZXg7CkBAIC0zNzE3LDExICszNzc5LDExIEBACiAJCXByaW50ID0gMDsKIAkJZm9yIChmbGFnID0gYXJnLT5mbGFncy5mbGFnczsgZmxhZzsgZmxhZyA9IGZsYWctPm5leHQpIHsKIAkJCWZ2YWwgPSBldmFsX2ZsYWcoZmxhZy0+dmFsdWUpOwotCQkJaWYgKCF2YWwgJiYgIWZ2YWwpIHsKKwkJCWlmICghdmFsICYmIGZ2YWwgPCAwKSB7CiAJCQkJcHJpbnRfc3RyX3RvX3NlcShzLCBmb3JtYXQsIGxlbl9hcmcsIGZsYWctPnN0cik7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoZnZhbCAmJiAodmFsICYgZnZhbCkgPT0gZnZhbCkgeworCQkJaWYgKGZ2YWwgPiAwICYmICh2YWwgJiBmdmFsKSA9PSBmdmFsKSB7CiAJCQkJaWYgKHByaW50ICYmIGFyZy0+ZmxhZ3MuZGVsaW0pCiAJCQkJCXRyYWNlX3NlcV9wdXRzKHMsIGFyZy0+ZmxhZ3MuZGVsaW0pOwogCQkJCXByaW50X3N0cl90b19zZXEocywgZm9ybWF0LCBsZW5fYXJnLCBmbGFnLT5zdHIpOwpAQCAtMzc2Niw2ICszODI4LDU0IEBACiAJCX0KIAkJYnJlYWs7CiAKKwljYXNlIFBSSU5UX0lOVF9BUlJBWTogeworCQl2b2lkICpudW07CisJCWludCBlbF9zaXplOworCisJCWlmIChhcmctPmludF9hcnJheS5maWVsZC0+dHlwZSA9PSBQUklOVF9EWU5BTUlDX0FSUkFZKSB7CisJCQl1bnNpZ25lZCBsb25nIG9mZnNldDsKKwkJCXN0cnVjdCBmb3JtYXRfZmllbGQgKmZpZWxkID0KKwkJCQlhcmctPmludF9hcnJheS5maWVsZC0+ZHluYXJyYXkuZmllbGQ7CisJCQlvZmZzZXQgPSBwZXZlbnRfcmVhZF9udW1iZXIocGV2ZW50LAorCQkJCQkJICAgIGRhdGEgKyBmaWVsZC0+b2Zmc2V0LAorCQkJCQkJICAgIGZpZWxkLT5zaXplKTsKKwkJCW51bSA9IGRhdGEgKyAob2Zmc2V0ICYgMHhmZmZmKTsKKwkJfSBlbHNlIHsKKwkJCWZpZWxkID0gYXJnLT5pbnRfYXJyYXkuZmllbGQtPmZpZWxkLmZpZWxkOworCQkJaWYgKCFmaWVsZCkgeworCQkJCXN0ciA9IGFyZy0+aW50X2FycmF5LmZpZWxkLT5maWVsZC5uYW1lOworCQkJCWZpZWxkID0gcGV2ZW50X2ZpbmRfYW55X2ZpZWxkKGV2ZW50LCBzdHIpOworCQkJCWlmICghZmllbGQpCisJCQkJCWdvdG8gb3V0X3dhcm5pbmdfZmllbGQ7CisJCQkJYXJnLT5pbnRfYXJyYXkuZmllbGQtPmZpZWxkLmZpZWxkID0gZmllbGQ7CisJCQl9CisJCQludW0gPSBkYXRhICsgZmllbGQtPm9mZnNldDsKKwkJfQorCQlsZW4gPSBldmFsX251bV9hcmcoZGF0YSwgc2l6ZSwgZXZlbnQsIGFyZy0+aW50X2FycmF5LmNvdW50KTsKKwkJZWxfc2l6ZSA9IGV2YWxfbnVtX2FyZyhkYXRhLCBzaXplLCBldmVudCwKKwkJCQkgICAgICAgYXJnLT5pbnRfYXJyYXkuZWxfc2l6ZSk7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkJaWYgKGkpCisJCQkJdHJhY2Vfc2VxX3B1dGMocywgJyAnKTsKKworCQkJaWYgKGVsX3NpemUgPT0gMSkgeworCQkJCXRyYWNlX3NlcV9wcmludGYocywgIiV1IiwgKih1aW50OF90ICopbnVtKTsKKwkJCX0gZWxzZSBpZiAoZWxfc2l6ZSA9PSAyKSB7CisJCQkJdHJhY2Vfc2VxX3ByaW50ZihzLCAiJXUiLCAqKHVpbnQxNl90ICopbnVtKTsKKwkJCX0gZWxzZSBpZiAoZWxfc2l6ZSA9PSA0KSB7CisJCQkJdHJhY2Vfc2VxX3ByaW50ZihzLCAiJXUiLCAqKHVpbnQzMl90ICopbnVtKTsKKwkJCX0gZWxzZSBpZiAoZWxfc2l6ZSA9PSA4KSB7CisJCQkJdHJhY2Vfc2VxX3ByaW50ZihzLCAiJWx1IiwgKih1aW50NjRfdCAqKW51bSk7CisJCQl9IGVsc2UgeworCQkJCXRyYWNlX3NlcV9wcmludGYocywgIkJBRCBTSVpFOiVkIDB4JXgiLAorCQkJCQkJIGVsX3NpemUsICoodWludDhfdCAqKW51bSk7CisJCQkJZWxfc2l6ZSA9IDE7CisJCQl9CisKKwkJCW51bSArPSBlbF9zaXplOworCQl9CisJCWJyZWFrOworCX0KIAljYXNlIFBSSU5UX1RZUEU6CiAJCWJyZWFrOwogCWNhc2UgUFJJTlRfU1RSSU5HOiB7CkBAIC0zOTc2LDcgKzQwODYsNyBAQAogCWlmIChhc3ByaW50ZigmYXJnLT5hdG9tLmF0b20sICIlbGxkIiwgaXApIDwgMCkKIAkJZ290byBvdXRfZnJlZTsKIAotCS8qIHNraXAgdGhlIGZpcnN0ICIlcGY6ICIgKi8KKwkvKiBza2lwIHRoZSBmaXJzdCAiJXBzOiAiICovCiAJZm9yIChwdHIgPSBmbXQgKyA1LCBicHRyID0gZGF0YSArIGZpZWxkLT5vZmZzZXQ7CiAJICAgICBicHRyIDwgZGF0YSArIHNpemUgJiYgKnB0cjsgcHRyKyspIHsKIAkJaW50IGxzID0gMDsKQEAgLTM5OTcsNiArNDEwNywxMCBAQAogCQkJCWdvdG8gcHJvY2Vzc19hZ2FpbjsKIAkJCWNhc2UgJy4nOgogCQkJCWdvdG8gcHJvY2Vzc19hZ2FpbjsKKwkJCWNhc2UgJ3onOgorCQkJY2FzZSAnWic6CisJCQkJbHMgPSAxOworCQkJCWdvdG8gcHJvY2Vzc19hZ2FpbjsKIAkJCWNhc2UgJ3AnOgogCQkJCWxzID0gMTsKIAkJCQkvKiBmYWxsIHRocm91Z2ggKi8KQEAgLTQ5MzksNiArNTA1Myw5NiBAQAogCXJldHVybiBjb21tOwogfQogCitzdGF0aWMgc3RydWN0IGNtZGxpbmUgKgorcGlkX2Zyb21fY21kbGlzdChzdHJ1Y3QgcGV2ZW50ICpwZXZlbnQsIGNvbnN0IGNoYXIgKmNvbW0sIHN0cnVjdCBjbWRsaW5lICpuZXh0KQoreworCXN0cnVjdCBjbWRsaW5lX2xpc3QgKmNtZGxpc3QgPSAoc3RydWN0IGNtZGxpbmVfbGlzdCAqKW5leHQ7CisKKwlpZiAoY21kbGlzdCkKKwkJY21kbGlzdCA9IGNtZGxpc3QtPm5leHQ7CisJZWxzZQorCQljbWRsaXN0ID0gcGV2ZW50LT5jbWRsaXN0OworCisJd2hpbGUgKGNtZGxpc3QgJiYgc3RyY21wKGNtZGxpc3QtPmNvbW0sIGNvbW0pICE9IDApCisJCWNtZGxpc3QgPSBjbWRsaXN0LT5uZXh0OworCisJcmV0dXJuIChzdHJ1Y3QgY21kbGluZSAqKWNtZGxpc3Q7Cit9CisKKy8qKgorICogcGV2ZW50X2RhdGFfcGlkX2Zyb21fY29tbSAtIHJldHVybiB0aGUgcGlkIGZyb20gYSBnaXZlbiBjb21tCisgKiBAcGV2ZW50OiBhIGhhbmRsZSB0byB0aGUgcGV2ZW50CisgKiBAY29tbTogdGhlIGNtZGxpbmUgdG8gZmluZCB0aGUgcGlkIGZyb20KKyAqIEBuZXh0OiB0aGUgY21kbGluZSBzdHJ1Y3R1cmUgdG8gZmluZCB0aGUgbmV4dCBjb21tCisgKgorICogVGhpcyByZXR1cm5zIHRoZSBjbWRsaW5lIHN0cnVjdHVyZSB0aGF0IGhvbGRzIGEgcGlkIGZvciBhIGdpdmVuCisgKiBjb21tLCBvciBOVUxMIGlmIG5vbmUgZm91bmQuIEFzIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIHBpZCBmb3IKKyAqIGEgZ2l2ZW4gY29tbSwgdGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwgY2FuIGJlIHBhc3NlZCBiYWNrIGludG8KKyAqIGEgcmVjdXJyaW5nIGNhbGwgaW4gdGhlIEBuZXh0IHBhcmFtYXRlciwgYW5kIHRoZW4gaXQgd2lsbCBmaW5kIHRoZQorICogbmV4dCBwaWQuCisgKiBBbHNvLCBpdCBkb2VzIGEgbGluZWFyIHNlYWNoLCBzbyBpdCBtYXkgYmUgc2xvdy4KKyAqLworc3RydWN0IGNtZGxpbmUgKnBldmVudF9kYXRhX3BpZF9mcm9tX2NvbW0oc3RydWN0IHBldmVudCAqcGV2ZW50LCBjb25zdCBjaGFyICpjb21tLAorCQkJCQkgIHN0cnVjdCBjbWRsaW5lICpuZXh0KQoreworCXN0cnVjdCBjbWRsaW5lICpjbWRsaW5lOworCisJLyoKKwkgKiBJZiB0aGUgY21kbGluZXMgaGF2ZSBub3QgYmVlbiBjb252ZXJ0ZWQgeWV0LCB0aGVuIHVzZQorCSAqIHRoZSBsaXN0LgorCSAqLworCWlmICghcGV2ZW50LT5jbWRsaW5lcykKKwkJcmV0dXJuIHBpZF9mcm9tX2NtZGxpc3QocGV2ZW50LCBjb21tLCBuZXh0KTsKKworCWlmIChuZXh0KSB7CisJCS8qCisJCSAqIFRoZSBuZXh0IHBvaW50ZXIgY291bGQgaGF2ZSBiZWVuIHN0aWxsIGZyb20KKwkJICogYSBwcmV2aW91cyBjYWxsIGJlZm9yZSBjbWRsaW5lcyB3ZXJlIGNyZWF0ZWQKKwkJICovCisJCWlmIChuZXh0IDwgcGV2ZW50LT5jbWRsaW5lcyB8fAorCQkgICAgbmV4dCA+PSBwZXZlbnQtPmNtZGxpbmVzICsgcGV2ZW50LT5jbWRsaW5lX2NvdW50KQorCQkJbmV4dCA9IE5VTEw7CisJCWVsc2UKKwkJCWNtZGxpbmUgID0gbmV4dCsrOworCX0KKworCWlmICghbmV4dCkKKwkJY21kbGluZSA9IHBldmVudC0+Y21kbGluZXM7CisKKwl3aGlsZSAoY21kbGluZSA8IHBldmVudC0+Y21kbGluZXMgKyBwZXZlbnQtPmNtZGxpbmVfY291bnQpIHsKKwkJaWYgKHN0cmNtcChjbWRsaW5lLT5jb21tLCBjb21tKSA9PSAwKQorCQkJcmV0dXJuIGNtZGxpbmU7CisJCWNtZGxpbmUrKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogcGV2ZW50X2NtZGxpbmVfcGlkIC0gcmV0dXJuIHRoZSBwaWQgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGNtZGxpbmUKKyAqIEBjbWRsaW5lOiBUaGUgY21kbGluZSBzdHJ1Y3R1cmUgdG8gZ2V0IHRoZSBwaWQgZnJvbQorICoKKyAqIFJldHVybnMgdGhlIHBpZCBmb3IgYSBnaXZlIGNtZGxpbmUuIElmIEBjbWRsaW5lIGlzIE5VTEwsIHRoZW4KKyAqIC0xIGlzIHJldHVybmVkLgorICovCitpbnQgcGV2ZW50X2NtZGxpbmVfcGlkKHN0cnVjdCBwZXZlbnQgKnBldmVudCwgc3RydWN0IGNtZGxpbmUgKmNtZGxpbmUpCit7CisJc3RydWN0IGNtZGxpbmVfbGlzdCAqY21kbGlzdCA9IChzdHJ1Y3QgY21kbGluZV9saXN0ICopY21kbGluZTsKKworCWlmICghY21kbGluZSkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBJZiBjbWRsaW5lcyBoYXZlIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LCBvciBjbWRsaW5lIGlzCisJICogbm90IHBhcnQgb2YgdGhlIGFycmF5LCB0aGVuIHRyZWF0IGl0IGFzIGEgY21kbGlzdCBpbnN0ZWFkLgorCSAqLworCWlmICghcGV2ZW50LT5jbWRsaW5lcyB8fAorCSAgICBjbWRsaW5lIDwgcGV2ZW50LT5jbWRsaW5lcyB8fAorCSAgICBjbWRsaW5lID49IHBldmVudC0+Y21kbGluZXMgKyBwZXZlbnQtPmNtZGxpbmVfY291bnQpCisJCXJldHVybiBjbWRsaXN0LT5waWQ7CisKKwlyZXR1cm4gY21kbGluZS0+cGlkOworfQorCiAvKioKICAqIHBldmVudF9kYXRhX2NvbW1fZnJvbV9waWQgLSBwYXJzZSB0aGUgZGF0YSBpbnRvIHRoZSBwcmludCBmb3JtYXQKICAqIEBzOiB0aGUgdHJhY2Vfc2VxIHRvIHdyaXRlIHRvCkBAIC01MjU2LDYgKzU0NjAsMTUgQEAKIAkJcHJpbnRfYXJncyhhcmdzLT5oZXguc2l6ZSk7CiAJCXByaW50ZigiKSIpOwogCQlicmVhazsKKwljYXNlIFBSSU5UX0lOVF9BUlJBWToKKwkJcHJpbnRmKCJfX3ByaW50X2FycmF5KCIpOworCQlwcmludF9hcmdzKGFyZ3MtPmludF9hcnJheS5maWVsZCk7CisJCXByaW50ZigiLCAiKTsKKwkJcHJpbnRfYXJncyhhcmdzLT5pbnRfYXJyYXkuY291bnQpOworCQlwcmludGYoIiwgIik7CisJCXByaW50X2FyZ3MoYXJncy0+aW50X2FycmF5LmVsX3NpemUpOworCQlwcmludGYoIikiKTsKKwkJYnJlYWs7CiAJY2FzZSBQUklOVF9TVFJJTkc6CiAJY2FzZSBQUklOVF9CU1RSSU5HOgogCQlwcmludGYoIl9fZ2V0X3N0ciglcykiLCBhcmdzLT5zdHJpbmcuc3RyaW5nKTsKQEAgLTYyMjgsMTUgKzY0NDEsMjAgQEAKIAlwZXZlbnQtPnJlZl9jb3VudCsrOwogfQogCit2b2lkIHBldmVudF9mcmVlX2Zvcm1hdF9maWVsZChzdHJ1Y3QgZm9ybWF0X2ZpZWxkICpmaWVsZCkKK3sKKwlmcmVlKGZpZWxkLT50eXBlKTsKKwlmcmVlKGZpZWxkLT5uYW1lKTsKKwlmcmVlKGZpZWxkKTsKK30KKwogc3RhdGljIHZvaWQgZnJlZV9mb3JtYXRfZmllbGRzKHN0cnVjdCBmb3JtYXRfZmllbGQgKmZpZWxkKQogewogCXN0cnVjdCBmb3JtYXRfZmllbGQgKm5leHQ7CiAKIAl3aGlsZSAoZmllbGQpIHsKIAkJbmV4dCA9IGZpZWxkLT5uZXh0OwotCQlmcmVlKGZpZWxkLT50eXBlKTsKLQkJZnJlZShmaWVsZC0+bmFtZSk7Ci0JCWZyZWUoZmllbGQpOworCQlwZXZlbnRfZnJlZV9mb3JtYXRfZmllbGQoZmllbGQpOwogCQlmaWVsZCA9IG5leHQ7CiAJfQogfQpAQCAtNjM0MSw2ICs2NTU5LDcgQEAKIAkJZnJlZV9oYW5kbGVyKGhhbmRsZSk7CiAJfQogCisJZnJlZShwZXZlbnQtPnRyYWNlX2Nsb2NrKTsKIAlmcmVlKHBldmVudC0+ZXZlbnRzKTsKIAlmcmVlKHBldmVudC0+c29ydF9ldmVudHMpOwogCmRpZmYgLS1naXQgYS90b29scy9saWIvdHJhY2VldmVudC9ldmVudC1wYXJzZS5oIGIvdG9vbHMvbGliL3RyYWNlZXZlbnQvZXZlbnQtcGFyc2UuaAppbmRleCA3YTM4NzNmLi44NmE1ODM5IDEwMDY0NAotLS0gYS90b29scy9saWIvdHJhY2VldmVudC9ldmVudC1wYXJzZS5oCisrKyBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L2V2ZW50LXBhcnNlLmgKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KICNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHJlZ2V4Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKQEAgLTkxLDYgKzkyLDcgQEAKIAogZXh0ZXJuIHZvaWQgdHJhY2Vfc2VxX3Rlcm1pbmF0ZShzdHJ1Y3QgdHJhY2Vfc2VxICpzKTsKIAorZXh0ZXJuIGludCB0cmFjZV9zZXFfZG9fZnByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBGSUxFICpmcCk7CiBleHRlcm4gaW50IHRyYWNlX3NlcV9kb19wcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcyk7CiAKIApAQCAtMTE0LDcgKzExNiw3IEBACiAJY2hhcgkJCQkqbmFtZTsKIAljaGFyCQkJCSpwbHVnaW5fYWxpYXM7CiAJY2hhcgkJCQkqZGVzY3JpcHRpb247Ci0JY2hhcgkJCQkqdmFsdWU7CisJY29uc3QgY2hhcgkJCSp2YWx1ZTsKIAl2b2lkCQkJCSpwcml2OwogCWludAkJCQlzZXQ7CiB9OwpAQCAtMTUyLDYgKzE1NCwxMCBAQAogICogICAucGx1Z2luX2FsaWFzIGlzIHVzZWQgdG8gZ2l2ZSBhIHNob3J0ZXIgbmFtZSB0byBhY2Nlc3MKICAqICAgdGhlIHZhaXJhYmxlLiBVc2VmdWwgaWYgYSBwbHVnaW4gaGFuZGxlcyBtb3JlIHRoYW4gb25lIGV2ZW50LgogICoKKyAqICAgSWYgLnZhbHVlIGlzIG5vdCBzZXQsIHRoZW4gaXQgaXMgY29uc2lkZXJlZCBhIGJvb2xlYW4gYW5kIG9ubHkKKyAqICAgLnNldCB3aWxsIGJlIHByb2Nlc3NlZC4gSWYgLnZhbHVlIGlzIGRlZmluZWQsIHRoZW4gaXQgaXMgY29uc2lkZXJlZAorICogICBhIHN0cmluZyBvcHRpb24gYW5kIC5zZXQgd2lsbCBiZSBpZ25vcmVkLgorICoKICAqIFBFVkVOVF9QTFVHSU5fQUxJQVM6IChvcHRpb25hbCkKICAqICAgVGhlIG5hbWUgdG8gdXNlIGZvciBmaW5kaW5nIG9wdGlvbnMgKHVzZXMgZmlsZW5hbWUgaWYgbm90IGRlZmluZWQpCiAgKi8KQEAgLTI0NSw2ICsyNTEsMTIgQEAKIAlzdHJ1Y3QgcHJpbnRfYXJnCSpzaXplOwogfTsKIAorc3RydWN0IHByaW50X2FyZ19pbnRfYXJyYXkgeworCXN0cnVjdCBwcmludF9hcmcJKmZpZWxkOworCXN0cnVjdCBwcmludF9hcmcJKmNvdW50OworCXN0cnVjdCBwcmludF9hcmcJKmVsX3NpemU7Cit9OworCiBzdHJ1Y3QgcHJpbnRfYXJnX2R5bmFycmF5IHsKIAlzdHJ1Y3QgZm9ybWF0X2ZpZWxkCSpmaWVsZDsKIAlzdHJ1Y3QgcHJpbnRfYXJnCSppbmRleDsKQEAgLTI3Myw2ICsyODUsNyBAQAogCVBSSU5UX0ZMQUdTLAogCVBSSU5UX1NZTUJPTCwKIAlQUklOVF9IRVgsCisJUFJJTlRfSU5UX0FSUkFZLAogCVBSSU5UX1RZUEUsCiAJUFJJTlRfU1RSSU5HLAogCVBSSU5UX0JTVFJJTkcsCkBAIC0yOTIsNiArMzA1LDcgQEAKIAkJc3RydWN0IHByaW50X2FyZ19mbGFncwkJZmxhZ3M7CiAJCXN0cnVjdCBwcmludF9hcmdfc3ltYm9sCQlzeW1ib2w7CiAJCXN0cnVjdCBwcmludF9hcmdfaGV4CQloZXg7CisJCXN0cnVjdCBwcmludF9hcmdfaW50X2FycmF5CWludF9hcnJheTsKIAkJc3RydWN0IHByaW50X2FyZ19mdW5jCQlmdW5jOwogCQlzdHJ1Y3QgcHJpbnRfYXJnX3N0cmluZwkJc3RyaW5nOwogCQlzdHJ1Y3QgcHJpbnRfYXJnX2JpdG1hc2sJYml0bWFzazsKQEAgLTU5Nyw3ICs2MTEsNyBAQAogfTsKIAogaW50IHBldmVudF9yZWdpc3Rlcl9jb21tKHN0cnVjdCBwZXZlbnQgKnBldmVudCwgY29uc3QgY2hhciAqY29tbSwgaW50IHBpZCk7Ci12b2lkIHBldmVudF9yZWdpc3Rlcl90cmFjZV9jbG9jayhzdHJ1Y3QgcGV2ZW50ICpwZXZlbnQsIGNoYXIgKnRyYWNlX2Nsb2NrKTsKK2ludCBwZXZlbnRfcmVnaXN0ZXJfdHJhY2VfY2xvY2soc3RydWN0IHBldmVudCAqcGV2ZW50LCBjb25zdCBjaGFyICp0cmFjZV9jbG9jayk7CiBpbnQgcGV2ZW50X3JlZ2lzdGVyX2Z1bmN0aW9uKHN0cnVjdCBwZXZlbnQgKnBldmVudCwgY2hhciAqbmFtZSwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBsb25nIGFkZHIsIGNoYXIgKm1vZCk7CiBpbnQgcGV2ZW50X3JlZ2lzdGVyX3ByaW50X3N0cmluZyhzdHJ1Y3QgcGV2ZW50ICpwZXZlbnQsIGNvbnN0IGNoYXIgKmZtdCwKQEAgLTYxNyw2ICs2MzEsNyBAQAogCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiwKIAkJCQkgICAgICB1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKnN5cyk7CiB2b2lkIHBldmVudF9mcmVlX2Zvcm1hdChzdHJ1Y3QgZXZlbnRfZm9ybWF0ICpldmVudCk7Cit2b2lkIHBldmVudF9mcmVlX2Zvcm1hdF9maWVsZChzdHJ1Y3QgZm9ybWF0X2ZpZWxkICpmaWVsZCk7CiAKIHZvaWQgKnBldmVudF9nZXRfZmllbGRfcmF3KHN0cnVjdCB0cmFjZV9zZXEgKnMsIHN0cnVjdCBldmVudF9mb3JtYXQgKmV2ZW50LAogCQkJICAgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHBldmVudF9yZWNvcmQgKnJlY29yZCwKQEAgLTY3NSw2ICs2OTAsMTEgQEAKIHN0cnVjdCBldmVudF9mb3JtYXQgKnBldmVudF9kYXRhX2V2ZW50X2Zyb21fdHlwZShzdHJ1Y3QgcGV2ZW50ICpwZXZlbnQsIGludCB0eXBlKTsKIGludCBwZXZlbnRfZGF0YV9waWQoc3RydWN0IHBldmVudCAqcGV2ZW50LCBzdHJ1Y3QgcGV2ZW50X3JlY29yZCAqcmVjKTsKIGNvbnN0IGNoYXIgKnBldmVudF9kYXRhX2NvbW1fZnJvbV9waWQoc3RydWN0IHBldmVudCAqcGV2ZW50LCBpbnQgcGlkKTsKK3N0cnVjdCBjbWRsaW5lOworc3RydWN0IGNtZGxpbmUgKnBldmVudF9kYXRhX3BpZF9mcm9tX2NvbW0oc3RydWN0IHBldmVudCAqcGV2ZW50LCBjb25zdCBjaGFyICpjb21tLAorCQkJCQkgIHN0cnVjdCBjbWRsaW5lICpuZXh0KTsKK2ludCBwZXZlbnRfY21kbGluZV9waWQoc3RydWN0IHBldmVudCAqcGV2ZW50LCBzdHJ1Y3QgY21kbGluZSAqY21kbGluZSk7CisKIHZvaWQgcGV2ZW50X2V2ZW50X2luZm8oc3RydWN0IHRyYWNlX3NlcSAqcywgc3RydWN0IGV2ZW50X2Zvcm1hdCAqZXZlbnQsCiAJCSAgICAgICBzdHJ1Y3QgcGV2ZW50X3JlY29yZCAqcmVjb3JkKTsKIGludCBwZXZlbnRfc3RyZXJyb3Ioc3RydWN0IHBldmVudCAqcGV2ZW50LCBlbnVtIHBldmVudF9lcnJubyBlcnJudW0sCmRpZmYgLS1naXQgYS90b29scy9saWIvdHJhY2VldmVudC9ldmVudC1wbHVnaW4uYyBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L2V2ZW50LXBsdWdpbi5jCmluZGV4IDEzNjE2MmMuLmExNjc1NmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYi90cmFjZWV2ZW50L2V2ZW50LXBsdWdpbi5jCisrKyBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L2V2ZW50LXBsdWdpbi5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogICovCiAKKyNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KQEAgLTQ5LDYgKzUwLDUyIEBACiAJdm9pZAkJCSpoYW5kbGU7CiB9OwogCitzdGF0aWMgdm9pZCBsb3dlcl9jYXNlKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cikKKwkJcmV0dXJuOworCWZvciAoOyAqc3RyOyBzdHIrKykKKwkJKnN0ciA9IHRvbG93ZXIoKnN0cik7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX29wdGlvbl92YWx1ZShzdHJ1Y3QgcGV2ZW50X3BsdWdpbl9vcHRpb24gKm9wLCBjb25zdCBjaGFyICp2YWwpCit7CisJY2hhciAqb3BfdmFsOworCisJaWYgKCF2YWwpIHsKKwkJLyogdG9nZ2xlLCBvbmx5IGlmIG9wdGlvbiBpcyBib29sZWFuICovCisJCWlmIChvcC0+dmFsdWUpCisJCQkvKiBXYXJuPyAqLworCQkJcmV0dXJuIDA7CisJCW9wLT5zZXQgXj0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgb3B0aW9uIGhhcyBhIHZhbHVlIHRoZW4gaXQgdGFrZXMgYSBzdHJpbmcKKwkgKiBvdGhlcndpc2UgdGhlIG9wdGlvbiBpcyBhIGJvb2xlYW4uCisJICovCisJaWYgKG9wLT52YWx1ZSkgeworCQlvcC0+dmFsdWUgPSB2YWw7CisJCXJldHVybiAwOworCX0KKworCS8qIE9wdGlvbiBpcyBib29sZWFuLCBtdXN0IGJlIGVpdGhlciAiMSIsICIwIiwgInRydWUiIG9yICJmYWxzZSIgKi8KKworCW9wX3ZhbCA9IHN0cmR1cCh2YWwpOworCWlmICghb3BfdmFsKQorCQlyZXR1cm4gLTE7CisJbG93ZXJfY2FzZShvcF92YWwpOworCisJaWYgKHN0cmNtcCh2YWwsICIxIikgPT0gMCB8fCBzdHJjbXAodmFsLCAidHJ1ZSIpID09IDApCisJCW9wLT5zZXQgPSAxOworCWVsc2UgaWYgKHN0cmNtcCh2YWwsICIwIikgPT0gMCB8fCBzdHJjbXAodmFsLCAiZmFsc2UiKSA9PSAwKQorCQlvcC0+c2V0ID0gMDsKKwlmcmVlKG9wX3ZhbCk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoqCiAgKiB0cmFjZWV2ZW50X3BsdWdpbl9saXN0X29wdGlvbnMgLSBnZXQgbGlzdCBvZiBwbHVnaW4gb3B0aW9ucwogICoKQEAgLTEyMCw2ICsxNjcsNyBAQAogewogCXN0cnVjdCB0cmFjZV9wbHVnaW5fb3B0aW9ucyAqb3A7CiAJY2hhciAqcGx1Z2luOworCWludCByZXQgPSAwOwogCiAJaWYgKG9wdGlvbi0+cGx1Z2luX2FsaWFzKSB7CiAJCXBsdWdpbiA9IHN0cmR1cChvcHRpb24tPnBsdWdpbl9hbGlhcyk7CkBAIC0xNDQsOSArMTkyLDEwIEBACiAJCWlmIChzdHJjbXAob3AtPm9wdGlvbiwgb3B0aW9uLT5uYW1lKSAhPSAwKQogCQkJY29udGludWU7CiAKLQkJb3B0aW9uLT52YWx1ZSA9IG9wLT52YWx1ZTsKLQkJb3B0aW9uLT5zZXQgXj0gMTsKLQkJZ290byBvdXQ7CisJCXJldCA9IHVwZGF0ZV9vcHRpb25fdmFsdWUob3B0aW9uLCBvcC0+dmFsdWUpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCWJyZWFrOwogCX0KIAogCS8qIGZpcnN0IGxvb2sgZm9yIHVubmFtZWQgb3B0aW9ucyAqLwpAQCAtMTU2LDE0ICsyMDUsMTMgQEAKIAkJaWYgKHN0cmNtcChvcC0+b3B0aW9uLCBvcHRpb24tPm5hbWUpICE9IDApCiAJCQljb250aW51ZTsKIAotCQlvcHRpb24tPnZhbHVlID0gb3AtPnZhbHVlOwotCQlvcHRpb24tPnNldCBePSAxOworCQlyZXQgPSB1cGRhdGVfb3B0aW9uX3ZhbHVlKG9wdGlvbiwgb3AtPnZhbHVlKTsKIAkJYnJlYWs7CiAJfQogCiAgb3V0OgogCWZyZWUocGx1Z2luKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi90cmFjZWV2ZW50L2tidWZmZXItcGFyc2UuYyBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L2tidWZmZXItcGFyc2UuYwppbmRleCBkY2M2NjUyLi4zYmNhZGEzIDEwMDY0NAotLS0gYS90b29scy9saWIvdHJhY2VldmVudC9rYnVmZmVyLXBhcnNlLmMKKysrIGIvdG9vbHMvbGliL3RyYWNlZXZlbnQva2J1ZmZlci1wYXJzZS5jCkBAIC0zNzIsNyArMzcyLDYgQEAKIAlzd2l0Y2ggKHR5cGVfbGVuKSB7CiAJY2FzZSBLQlVGRkVSX1RZUEVfUEFERElORzoKIAkJKmxlbmd0aCA9IHJlYWRfNChrYnVmLCBkYXRhKTsKLQkJZGF0YSArPSAqbGVuZ3RoOwogCQlicmVhazsKIAogCWNhc2UgS0JVRkZFUl9UWVBFX1RJTUVfRVhURU5EOgpAQCAtNzMwLDMgKzcyOSwxNCBAQAogCiAJa2J1Zi0+bmV4dF9ldmVudCA9IF9fb2xkX25leHRfZXZlbnQ7CiB9CisKKy8qKgorICoga2J1ZmZlcl9zdGFydF9vZl9kYXRhIC0gcmV0dXJuIG9mZnNldCBvZiB3aGVyZSBkYXRhIHN0YXJ0cyBvbiBzdWJidWZmZXIKKyAqIEBrYnVmOglUaGUga2J1ZmZlcgorICoKKyAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9uIHRoZSBzdWJidWZmZXIgd2hlcmUgdGhlIGRhdGEgc3RhcnRzLgorICovCitpbnQga2J1ZmZlcl9zdGFydF9vZl9kYXRhKHN0cnVjdCBrYnVmZmVyICprYnVmKQoreworCXJldHVybiBrYnVmLT5zdGFydDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2xpYi90cmFjZWV2ZW50L2tidWZmZXIuaCBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L2tidWZmZXIuaAppbmRleCBjODMxZjY0Li4wM2RjZTc1IDEwMDY0NAotLS0gYS90b29scy9saWIvdHJhY2VldmVudC9rYnVmZmVyLmgKKysrIGIvdG9vbHMvbGliL3RyYWNlZXZlbnQva2J1ZmZlci5oCkBAIC02Myw1ICs2Myw2IEBACiBpbnQga2J1ZmZlcl9zdWJidWZmZXJfc2l6ZShzdHJ1Y3Qga2J1ZmZlciAqa2J1Zik7CiAKIHZvaWQga2J1ZmZlcl9zZXRfb2xkX2Zvcm1hdChzdHJ1Y3Qga2J1ZmZlciAqa2J1Zik7CitpbnQga2J1ZmZlcl9zdGFydF9vZl9kYXRhKHN0cnVjdCBrYnVmZmVyICprYnVmKTsKIAogI2VuZGlmIC8qIF9LX0JVRkZFUl9IICovCmRpZmYgLS1naXQgYS90b29scy9saWIvdHJhY2VldmVudC9wYXJzZS1maWx0ZXIuYyBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L3BhcnNlLWZpbHRlci5jCmluZGV4IGI1MDIzNDQuLjAxNDRiM2QgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYi90cmFjZWV2ZW50L3BhcnNlLWZpbHRlci5jCisrKyBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L3BhcnNlLWZpbHRlci5jCkBAIC0xMDU4LDYgKzEwNTgsNyBAQAogCQkJCQkqcGFyZyA9IGN1cnJlbnRfb3A7CiAJCQkJZWxzZQogCQkJCQkqcGFyZyA9IGN1cnJlbnRfZXhwOworCQkJCWZyZWUodG9rZW4pOwogCQkJCXJldHVybiBQRVZFTlRfRVJSTk9fX1VOQkFMQU5DRURfUEFSRU47CiAJCQl9CiAJCQlicmVhazsKQEAgLTExNjgsNiArMTE2OSw3IEBACiAKIAkqcGFyZyA9IGN1cnJlbnRfb3A7CiAKKwlmcmVlKHRva2VuKTsKIAlyZXR1cm4gMDsKIAogIGZhaWxfYWxsb2M6CmRpZmYgLS1naXQgYS90b29scy9saWIvdHJhY2VldmVudC90cmFjZS1zZXEuYyBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L3RyYWNlLXNlcS5jCmluZGV4IGVjM2JkMTYuLjI5MmRjOWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2xpYi90cmFjZWV2ZW50L3RyYWNlLXNlcS5jCisrKyBiL3Rvb2xzL2xpYi90cmFjZWV2ZW50L3RyYWNlLXNlcS5jCkBAIC0yMzEsMTkgKzIzMSwyNCBAQAogCXMtPmJ1ZmZlcltzLT5sZW5dID0gMDsKIH0KIAotaW50IHRyYWNlX3NlcV9kb19wcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcykKK2ludCB0cmFjZV9zZXFfZG9fZnByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBGSUxFICpmcCkKIHsKIAlUUkFDRV9TRVFfQ0hFQ0socyk7CiAKIAlzd2l0Y2ggKHMtPnN0YXRlKSB7CiAJY2FzZSBUUkFDRV9TRVFfX0dPT0Q6Ci0JCXJldHVybiBwcmludGYoIiUuKnMiLCBzLT5sZW4sIHMtPmJ1ZmZlcik7CisJCXJldHVybiBmcHJpbnRmKGZwLCAiJS4qcyIsIHMtPmxlbiwgcy0+YnVmZmVyKTsKIAljYXNlIFRSQUNFX1NFUV9fQlVGRkVSX1BPSVNPTkVEOgotCQlwdXRzKCJVc2FnZSBvZiB0cmFjZV9zZXEgYWZ0ZXIgaXQgd2FzIGRlc3Ryb3llZCIpOworCQlmcHJpbnRmKGZwLCAiJXNcbiIsICJVc2FnZSBvZiB0cmFjZV9zZXEgYWZ0ZXIgaXQgd2FzIGRlc3Ryb3llZCIpOwogCQlicmVhazsKIAljYXNlIFRSQUNFX1NFUV9fTUVNX0FMTE9DX0ZBSUxFRDoKLQkJcHV0cygiQ2FuJ3QgYWxsb2NhdGUgdHJhY2Vfc2VxIGJ1ZmZlciBtZW1vcnkiKTsKKwkJZnByaW50ZihmcCwgIiVzXG4iLCAiQ2FuJ3QgYWxsb2NhdGUgdHJhY2Vfc2VxIGJ1ZmZlciBtZW1vcnkiKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiAtMTsKIH0KKworaW50IHRyYWNlX3NlcV9kb19wcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcykKK3sKKwlyZXR1cm4gdHJhY2Vfc2VxX2RvX2ZwcmludGYocywgc3Rkb3V0KTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL25ldC9icGZfZXhwLmwgYi90b29scy9uZXQvYnBmX2V4cC5sCmluZGV4IDgzM2E5NjYuLjdjYzcyYTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL25ldC9icGZfZXhwLmwKKysrIGIvdG9vbHMvbmV0L2JwZl9leHAubApAQCAtOTAsOCArOTAsMTAgQEAKICIjIj8oImhhdHlwZSIpCXsgcmV0dXJuIEtfSEFUWVBFOyB9CiAiIyI/KCJyeGhhc2giKQl7IHJldHVybiBLX1JYSEFTSDsgfQogIiMiPygiY3B1IikJeyByZXR1cm4gS19DUFU7IH0KLSIjIj8oInZsYW5fdGNpIikgeyByZXR1cm4gS19WTEFOVDsgfQotIiMiPygidmxhbl9wciIpCXsgcmV0dXJuIEtfVkxBTlA7IH0KKyIjIj8oInZsYW5fdGNpIikJeyByZXR1cm4gS19WTEFOX1RDSTsgfQorIiMiPygidmxhbl9wciIpCQl7IHJldHVybiBLX1ZMQU5fQVZBSUw7IH0KKyIjIj8oInZsYW5fYXZhaWwiKQl7IHJldHVybiBLX1ZMQU5fQVZBSUw7IH0KKyIjIj8oInZsYW5fdHBpZCIpCXsgcmV0dXJuIEtfVkxBTl9UUElEOyB9CiAiIyI/KCJyYW5kIikJeyByZXR1cm4gS19SQU5EOyB9CiAKICI6IgkJeyByZXR1cm4gJzonOyB9CmRpZmYgLS1naXQgYS90b29scy9uZXQvYnBmX2V4cC55IGIvdG9vbHMvbmV0L2JwZl9leHAueQppbmRleCBlNjMwNmM1Li5lMjRlZWExIDEwMDY0NAotLS0gYS90b29scy9uZXQvYnBmX2V4cC55CisrKyBiL3Rvb2xzL25ldC9icGZfZXhwLnkKQEAgLTU2LDcgKzU2LDcgQEAKICV0b2tlbiBPUF9MRFhJCiAKICV0b2tlbiBLX1BLVF9MRU4gS19QUk9UTyBLX1RZUEUgS19OTEFUVFIgS19OTEFUVFJfTkVTVCBLX01BUksgS19RVUVVRSBLX0hBVFlQRQotJXRva2VuIEtfUlhIQVNIIEtfQ1BVIEtfSUZJRFggS19WTEFOVCBLX1ZMQU5QIEtfUE9GRiBLX1JBTkQKKyV0b2tlbiBLX1JYSEFTSCBLX0NQVSBLX0lGSURYIEtfVkxBTl9UQ0kgS19WTEFOX0FWQUlMIEtfVkxBTl9UUElEIEtfUE9GRiBLX1JBTkQKIAogJXRva2VuICc6JyAnLCcgJ1snICddJyAnKCcgJyknICd4JyAnYScgJysnICdNJyAnKicgJyYnICcjJyAnJScKIApAQCAtMTU1LDEwICsxNTUsMTAgQEAKIAl8IE9QX0xEQiBLX0NQVSB7CiAJCWJwZl9zZXRfY3Vycl9pbnN0cihCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDAsIDAsCiAJCQkJICAgU0tGX0FEX09GRiArIFNLRl9BRF9DUFUpOyB9Ci0JfCBPUF9MREIgS19WTEFOVCB7CisJfCBPUF9MREIgS19WTEFOX1RDSSB7CiAJCWJwZl9zZXRfY3Vycl9pbnN0cihCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDAsIDAsCiAJCQkJICAgU0tGX0FEX09GRiArIFNLRl9BRF9WTEFOX1RBRyk7IH0KLQl8IE9QX0xEQiBLX1ZMQU5QIHsKKwl8IE9QX0xEQiBLX1ZMQU5fQVZBSUwgewogCQlicGZfc2V0X2N1cnJfaW5zdHIoQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTLCAwLCAwLAogCQkJCSAgIFNLRl9BRF9PRkYgKyBTS0ZfQURfVkxBTl9UQUdfUFJFU0VOVCk7IH0KIAl8IE9QX0xEQiBLX1BPRkYgewpAQCAtMTY3LDYgKzE2Nyw5IEBACiAJfCBPUF9MREIgS19SQU5EIHsKIAkJYnBmX3NldF9jdXJyX2luc3RyKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0FCUywgMCwgMCwKIAkJCQkgICBTS0ZfQURfT0ZGICsgU0tGX0FEX1JBTkRPTSk7IH0KKwl8IE9QX0xEQiBLX1ZMQU5fVFBJRCB7CisJCWJwZl9zZXRfY3Vycl9pbnN0cihCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDAsIDAsCisJCQkJICAgU0tGX0FEX09GRiArIFNLRl9BRF9WTEFOX1RQSUQpOyB9CiAJOwogCiBsZGgKQEAgLTIwNiwxMCArMjA5LDEwIEBACiAJfCBPUF9MREggS19DUFUgewogCQlicGZfc2V0X2N1cnJfaW5zdHIoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwLCAwLAogCQkJCSAgIFNLRl9BRF9PRkYgKyBTS0ZfQURfQ1BVKTsgfQotCXwgT1BfTERIIEtfVkxBTlQgeworCXwgT1BfTERIIEtfVkxBTl9UQ0kgewogCQlicGZfc2V0X2N1cnJfaW5zdHIoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwLCAwLAogCQkJCSAgIFNLRl9BRF9PRkYgKyBTS0ZfQURfVkxBTl9UQUcpOyB9Ci0JfCBPUF9MREggS19WTEFOUCB7CisJfCBPUF9MREggS19WTEFOX0FWQUlMIHsKIAkJYnBmX3NldF9jdXJyX2luc3RyKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCwgMCwKIAkJCQkgICBTS0ZfQURfT0ZGICsgU0tGX0FEX1ZMQU5fVEFHX1BSRVNFTlQpOyB9CiAJfCBPUF9MREggS19QT0ZGIHsKQEAgLTIxOCw2ICsyMjEsOSBAQAogCXwgT1BfTERIIEtfUkFORCB7CiAJCWJwZl9zZXRfY3Vycl9pbnN0cihCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDAsIDAsCiAJCQkJICAgU0tGX0FEX09GRiArIFNLRl9BRF9SQU5ET00pOyB9CisJfCBPUF9MREggS19WTEFOX1RQSUQgeworCQlicGZfc2V0X2N1cnJfaW5zdHIoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwLCAwLAorCQkJCSAgIFNLRl9BRF9PRkYgKyBTS0ZfQURfVkxBTl9UUElEKTsgfQogCTsKIAogbGRpCkBAIC0yNjIsMTAgKzI2OCwxMCBAQAogCXwgT1BfTEQgS19DUFUgewogCQlicGZfc2V0X2N1cnJfaW5zdHIoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLCAwLCAwLAogCQkJCSAgIFNLRl9BRF9PRkYgKyBTS0ZfQURfQ1BVKTsgfQotCXwgT1BfTEQgS19WTEFOVCB7CisJfCBPUF9MRCBLX1ZMQU5fVENJIHsKIAkJYnBmX3NldF9jdXJyX2luc3RyKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywgMCwgMCwKIAkJCQkgICBTS0ZfQURfT0ZGICsgU0tGX0FEX1ZMQU5fVEFHKTsgfQotCXwgT1BfTEQgS19WTEFOUCB7CisJfCBPUF9MRCBLX1ZMQU5fQVZBSUwgewogCQlicGZfc2V0X2N1cnJfaW5zdHIoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLCAwLCAwLAogCQkJCSAgIFNLRl9BRF9PRkYgKyBTS0ZfQURfVkxBTl9UQUdfUFJFU0VOVCk7IH0KIAl8IE9QX0xEIEtfUE9GRiB7CkBAIC0yNzQsNiArMjgwLDkgQEAKIAl8IE9QX0xEIEtfUkFORCB7CiAJCWJwZl9zZXRfY3Vycl9pbnN0cihCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsIDAsIDAsCiAJCQkJICAgU0tGX0FEX09GRiArIFNLRl9BRF9SQU5ET00pOyB9CisJfCBPUF9MRCBLX1ZMQU5fVFBJRCB7CisJCWJwZl9zZXRfY3Vycl9pbnN0cihCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsIDAsIDAsCisJCQkJICAgU0tGX0FEX09GRiArIFNLRl9BRF9WTEFOX1RQSUQpOyB9CiAJfCBPUF9MRCAnTScgJ1snIG51bWJlciAnXScgewogCQlicGZfc2V0X2N1cnJfaW5zdHIoQlBGX0xEIHwgQlBGX01FTSwgMCwgMCwgJDQpOyB9CiAJfCBPUF9MRCAnWycgJ3gnICcrJyBudW1iZXIgJ10nIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvLmdpdGlnbm9yZSBiL3Rvb2xzL3BlcmYvLmdpdGlnbm9yZQppbmRleCA0MDM5OWMzLi44MTJmOTA0IDEwMDY0NAotLS0gYS90b29scy9wZXJmLy5naXRpZ25vcmUKKysrIGIvdG9vbHMvcGVyZi8uZ2l0aWdub3JlCkBAIC0xLDYgKzEsNyBAQAogUEVSRi1DRkxBR1MKIFBFUkYtR1VJLVZBUlMKIFBFUkYtVkVSU0lPTi1GSUxFCitGRUFUVVJFLURVTVAKIHBlcmYKIHBlcmYtcmVhZC12ZHNvMzIKIHBlcmYtcmVhZC12ZHNveDMyCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0J1aWxkIGIvdG9vbHMvcGVyZi9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzczNzBlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9CdWlsZApAQCAtMCwwICsxLDQ0IEBACitwZXJmLXkgKz0gYnVpbHRpbi1iZW5jaC5vCitwZXJmLXkgKz0gYnVpbHRpbi1hbm5vdGF0ZS5vCitwZXJmLXkgKz0gYnVpbHRpbi1kaWZmLm8KK3BlcmYteSArPSBidWlsdGluLWV2bGlzdC5vCitwZXJmLXkgKz0gYnVpbHRpbi1oZWxwLm8KK3BlcmYteSArPSBidWlsdGluLXNjaGVkLm8KK3BlcmYteSArPSBidWlsdGluLWJ1aWxkaWQtbGlzdC5vCitwZXJmLXkgKz0gYnVpbHRpbi1idWlsZGlkLWNhY2hlLm8KK3BlcmYteSArPSBidWlsdGluLWxpc3QubworcGVyZi15ICs9IGJ1aWx0aW4tcmVjb3JkLm8KK3BlcmYteSArPSBidWlsdGluLXJlcG9ydC5vCitwZXJmLXkgKz0gYnVpbHRpbi1zdGF0Lm8KK3BlcmYteSArPSBidWlsdGluLXRpbWVjaGFydC5vCitwZXJmLXkgKz0gYnVpbHRpbi10b3AubworcGVyZi15ICs9IGJ1aWx0aW4tc2NyaXB0Lm8KK3BlcmYteSArPSBidWlsdGluLWttZW0ubworcGVyZi15ICs9IGJ1aWx0aW4tbG9jay5vCitwZXJmLXkgKz0gYnVpbHRpbi1rdm0ubworcGVyZi15ICs9IGJ1aWx0aW4taW5qZWN0Lm8KK3BlcmYteSArPSBidWlsdGluLW1lbS5vCitwZXJmLXkgKz0gYnVpbHRpbi1kYXRhLm8KKworcGVyZi0kKENPTkZJR19BVURJVCkgKz0gYnVpbHRpbi10cmFjZS5vCitwZXJmLSQoQ09ORklHX0xJQkVMRikgKz0gYnVpbHRpbi1wcm9iZS5vCisKK3BlcmYteSArPSBiZW5jaC8KK3BlcmYteSArPSB0ZXN0cy8KKworcGVyZi15ICs9IHBlcmYubworCitwYXRocyArPSAtRFBFUkZfSFRNTF9QQVRIPSJCVUlMRF9TVFIoJChodG1sZGlyX1NRKSkiCitwYXRocyArPSAtRFBFUkZfSU5GT19QQVRIPSJCVUlMRF9TVFIoJChpbmZvZGlyX1NRKSkiCitwYXRocyArPSAtRFBFUkZfTUFOX1BBVEg9IkJVSUxEX1NUUigkKG1hbmRpcl9TUSkpIgorCitDRkxBR1NfYnVpbHRpbi1oZWxwLm8gICAgICArPSAkKHBhdGhzKQorQ0ZMQUdTX2J1aWx0aW4tdGltZWNoYXJ0Lm8gKz0gJChwYXRocykKK0NGTEFHU19wZXJmLm8gICAgICAgICAgICAgICs9IC1EUEVSRl9IVE1MX1BBVEg9IkJVSUxEX1NUUigkKGh0bWxkaXJfU1EpKSIgLWluY2x1ZGUgJChPVVRQVVQpUEVSRi1WRVJTSU9OLUZJTEUKKworbGlicGVyZi15ICs9IHV0aWwvCitsaWJwZXJmLXkgKz0gYXJjaC8KK2xpYnBlcmYteSArPSB1aS8KK2xpYnBlcmYteSArPSBzY3JpcHRzLworCitndGsteSArPSB1aS9ndGsvCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vQnVpbGQudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL0J1aWxkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmZjNjUwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL0J1aWxkLnR4dApAQCAtMCwwICsxLDQ5IEBACisKKzEpIHBlcmYgYnVpbGQKKz09PT09PT09PT09PT0KK1RoZSBwZXJmIGJ1aWxkIHByb2Nlc3MgY29uc2lzdHMgb2Ygc2V2ZXJhbCBzZXBhcmF0ZWQgYnVpbGRpbmcgYmxvY2tzLAord2hpY2ggYXJlIGxpbmtlZCB0b2dldGhlciB0byBmb3JtIHRoZSBwZXJmIGJpbmFyeToKKyAgLSBsaWJwZXJmIGxpYnJhcnkgKHN0YXRpYykKKyAgLSBwZXJmIGJ1aWx0aW4gY29tbWFuZHMKKyAgLSB0cmFjZWV2ZW50IGxpYnJhcnkgKHN0YXRpYykKKyAgLSBHVEsgdWkgbGlicmFyeQorCitTZXZlcmFsIG1ha2VmaWxlcyBnb3Zlcm4gdGhlIHBlcmYgYnVpbGQ6CisKKyAgLSBNYWtlZmlsZQorICAgIHRvcCBsZXZlbCBNYWtlZmlsZSB3b3JraW5nIGFzIGEgd3JhcHBlciB0aGF0IGNhbGxzIHRoZSBtYWluCisgICAgTWFrZWZpbGUucGVyZiB3aXRoIGEgLWogb3B0aW9uIHRvIGRvIHBhcmFsbGVsIGJ1aWxkcy4KKworICAtIE1ha2VmaWxlLnBlcmYKKyAgICBtYWluIG1ha2VmaWxlIHRoYXQgdHJpZ2dlcnMgYnVpbGQgb2YgYWxsIHBlcmYgb2JqZWN0cyBpbmNsdWRpbmcKKyAgICBpbnN0YWxsYXRpb24gYW5kIGRvY3VtZW50YXRpb24gcHJvY2Vzc2luZy4KKworICAtIHRvb2xzL2J1aWxkL01ha2VmaWxlLmJ1aWxkCisgICAgbWFpbiBtYWtlZmlsZSBvZiB0aGUgYnVpbGQgZnJhbWV3b3JrCisKKyAgLSB0b29scy9idWlsZC9CdWlsZC5pbmNsdWRlCisgICAgYnVpbGQgZnJhbWV3b3JrIGdlbmVyaWMgZGVmaW5pdGlvbnMKKworICAtIEJ1aWxkIG1ha2VmaWxlcworICAgIG1ha2VmaWxlcyB0aGF0IGRlZmluZXMgYnVpbGQgb2JqZWN0cworCitQbGVhc2UgcmVmZXIgdG8gdG9vbHMvYnVpbGQvRG9jdW1lbnRhdGlvbi9CdWlsZC50eHQgZm9yIG1vcmUKK2luZm9ybWF0aW9uIGFib3V0IGJ1aWxkIGZyYW1ld29yay4KKworCisyKSBwZXJmIGJ1aWxkCis9PT09PT09PT09PT09CitUaGUgTWFrZWZpbGUucGVyZiB0cmlnZ2VycyB0aGUgYnVpbGQgZnJhbWV3b3JrIGZvciBidWlsZCBvYmplY3RzOgorICAgcGVyZiwgbGlicGVyZiwgZ3RrCisKK3Jlc3VsdGluZyBpbiBmb2xsb3dpbmcgb2JqZWN0czoKKyAgJCBscyAgKi1pbi5vCisgIGd0ay1pbi5vICBsaWJwZXJmLWluLm8gIHBlcmYtaW4ubworCitUaG9zZSBvYmplY3RzIGFyZSB0aGVuIHVzZWQgaW4gZmluYWwgbGlua2luZzoKKyAgbGlicGVyZi1ndGsuc28gPC0gZ3RrLWluLm8gIGxpYnBlcmYtaW4ubworICBwZXJmICAgICAgICAgICA8LSBwZXJmLWluLm8gbGlicGVyZi1pbi5vCisKKworTk9URSB0aGlzIGRlc2NyaXB0aW9uIGlzIG9taXR0aW5nIG90aGVyIGxpYnJhcmllcyBpbnZvbHZlZCwgb25seQorICAgICBmb2N1c2luZyBvbiBidWlsZCBmcmFtZXdvcmsgb3V0Y29tZXMKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWJ1aWxkaWQtY2FjaGUudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYnVpbGRpZC1jYWNoZS50eHQKaW5kZXggMDI5NGM1Ny4uZGQwN2I1NSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYnVpbGRpZC1jYWNoZS50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYnVpbGRpZC1jYWNoZS50eHQKQEAgLTEyLDkgKzEyLDkgQEAKIAogREVTQ1JJUFRJT04KIC0tLS0tLS0tLS0tCi1UaGlzIGNvbW1hbmQgbWFuYWdlcyB0aGUgYnVpbGQtaWQgY2FjaGUuIEl0IGNhbiBhZGQgYW5kIHJlbW92ZSBmaWxlcyB0by9mcm9tCi10aGUgY2FjaGUuIEluIHRoZSBmdXR1cmUgaXQgc2hvdWxkIGFzIHdlbGwgcHVyZ2Ugb2xkZXIgZW50cmllcywgc2V0IHVwcGVyCi1saW1pdHMgZm9yIHRoZSBzcGFjZSB1c2VkIGJ5IHRoZSBjYWNoZSwgZXRjLgorVGhpcyBjb21tYW5kIG1hbmFnZXMgdGhlIGJ1aWxkLWlkIGNhY2hlLiBJdCBjYW4gYWRkLCByZW1vdmUsIHVwZGF0ZSBhbmQgcHVyZ2UKK2ZpbGVzIHRvL2Zyb20gdGhlIGNhY2hlLiBJbiB0aGUgZnV0dXJlIGl0IHNob3VsZCBhcyB3ZWxsIHNldCB1cHBlciBsaW1pdHMgZm9yCit0aGUgc3BhY2UgdXNlZCBieSB0aGUgY2FjaGUsIGV0Yy4KIAogT1BUSU9OUwogLS0tLS0tLQpAQCAtMzYsMTQgKzM2LDI0IEBACiAgICAgICAgIGFjdHVhbGx5IG1hZGUuCiAtcjo6CiAtLXJlbW92ZT06OgotICAgICAgICBSZW1vdmUgc3BlY2lmaWVkIGZpbGUgZnJvbSB0aGUgY2FjaGUuCisgICAgICAgIFJlbW92ZSBhIGNhY2hlZCBiaW5hcnkgd2hpY2ggaGFzIHNhbWUgYnVpbGQtaWQgb2Ygc3BlY2lmaWVkIGZpbGUKKyAgICAgICAgZnJvbSB0aGUgY2FjaGUuCistcDo6CistLXB1cmdlPTo6CisgICAgICAgIFB1cmdlIGFsbCBjYWNoZWQgYmluYXJpZXMgaW5jbHVkaW5nIG9sZGVyIGNhY2hlcyB3aGljaCBoYXZlIHNwZWNpZmllZAorCXBhdGggZnJvbSB0aGUgY2FjaGUuCiAtTTo6CiAtLW1pc3Npbmc9OjoKIAlMaXN0IG1pc3NpbmcgYnVpbGQgaWRzIGluIHRoZSBjYWNoZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgogLXU6OgotLS11cGRhdGU6OgotCVVwZGF0ZSBzcGVjaWZpZWQgZmlsZSBvZiB0aGUgY2FjaGUuIEl0IGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSBrYWxsc3ltcwotCWtlcm5lbCBkc28gdG8gdm1saW51eCBpbiBvcmRlciB0byBzdXBwb3J0IGFubm90YXRpb24uCistLXVwZGF0ZT06OgorCVVwZGF0ZSBzcGVjaWZpZWQgZmlsZSBvZiB0aGUgY2FjaGUuIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgcmVtb3ZlCisJb2xkZXIgZW50aXJlcyBzaW5jZSB0aG9zZSBtYXkgYmUgc3RpbGwgbmVlZGVkIGZvciBhbm5vdGF0aW5nIG9sZAorCShvciByZW1vdGUpIHBlcmYuZGF0YS4gT25seSBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgY2FjaGUgd2hpY2ggaGFzCisJZXhhY3RseSBzYW1lIGJ1aWxkLWlkLCB0aGF0IGlzIHJlcGxhY2VkIGJ5IG5ldyBvbmUuIEl0IGNhbiBiZSB1c2VkCisJdG8gdXBkYXRlIGthbGxzeW1zIGFuZCBrZXJuZWwgZHNvIHRvIHZtbGludXggaW4gb3JkZXIgdG8gc3VwcG9ydAorCWFubm90YXRpb24uCisKIC12OjoKIC0tdmVyYm9zZTo6CiAJQmUgbW9yZSB2ZXJib3NlLgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtZGF0YS50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1kYXRhLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZThmYTFhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtZGF0YS50eHQKQEAgLTAsMCArMSw0MCBAQAorcGVyZi1kYXRhKDEpCis9PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitwZXJmLWRhdGEgLSBEYXRhIGZpbGUgcmVsYXRlZCBwcm9jZXNzaW5nCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ3BlcmYgZGF0YScgWzxjb21tb24gb3B0aW9ucz5dIDxjb21tYW5kPiBbPG9wdGlvbnM+XSIsCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorRGF0YSBmaWxlIHJlbGF0ZWQgcHJvY2Vzc2luZy4KKworQ09NTUFORFMKKy0tLS0tLS0tCitjb252ZXJ0OjoKKwlDb252ZXJ0cyBwZXJmIGRhdGEgZmlsZSBpbnRvIGFub3RoZXIgZm9ybWF0IChvbmx5IENURiBbMV0gZm9ybWF0IGlzIHN1cHBvcnQgYnkgbm93KS4KKwlJdCdzIHBvc3NpYmxlIHRvIHNldCBkYXRhLWNvbnZlcnQgZGVidWcgdmFyaWFibGUgdG8gZ2V0IGRlYnVnIG1lc3NhZ2VzIGZyb20gY29udmVyc2lvbiwKKwlsaWtlOgorCSAgcGVyZiAtLWRlYnVnIGRhdGEtY29udmVydCBkYXRhIGNvbnZlcnQgLi4uCisKK09QVElPTlMgZm9yICdjb252ZXJ0JworLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLXRvLWN0Zjo6CisJVHJpZ2dlcnMgdGhlIENURiBjb252ZXJzaW9uLCBzcGVjaWZ5IHRoZSBwYXRoIG9mIENURiBkYXRhIGRpcmVjdG9yeS4KKworLWk6OgorCVNwZWNpZnkgaW5wdXQgcGVyZiBkYXRhIGZpbGUgcGF0aC4KKworLXY6OgorLS12ZXJib3NlOjoKKyAgICAgICAgQmUgbW9yZSB2ZXJib3NlIChzaG93IGNvdW50ZXIgb3BlbiBlcnJvcnMsIGV0YykuCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua3BlcmY6cGVyZlsxXQorWzFdIENvbW1vbiBUcmFjZSBGb3JtYXQgLSBodHRwOi8vd3d3LmVmZmljaW9zLmNvbS9jdGYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWRpZmYudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtZGlmZi50eHQKaW5kZXggZTQ2M2NhYS4uZDFkZWI1NyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtZGlmZi50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtZGlmZi50eHQKQEAgLTIwLDEyICsyMCwyMCBAQAogVGhlIGRpZmZlcmVudGlhbCBwcm9maWxlIGlzIGRpc3BsYXllZCBvbmx5IGZvciBldmVudHMgbWF0Y2hpbmcgYm90aAogc3BlY2lmaWVkIHBlcmYuZGF0YSBmaWxlcy4KIAorSWYgbm8gcGFyYW1ldGVycyBhcmUgcGFzc2VkIHRoZSBzYW1wbGVzIHdpbGwgYmUgc29ydGVkIGJ5IGRzbyBhbmQgc3ltYm9sLgorQXMgdGhlIHBlcmYuZGF0YSBmaWxlcyBjb3VsZCBjb21lIGZyb20gZGlmZmVyZW50IGJpbmFyaWVzLCB0aGUgc3ltYm9scyBhZGRyZXNzZXMKK2NvdWxkIHZhcnkuIFNvIHBlcmYgZGlmZiBpcyBiYXNlZCBvbiB0aGUgY29tcGFyaXNvbiBvZiB0aGUgZmlsZXMgYW5kCitzeW1ib2xzIG5hbWUuCisKIE9QVElPTlMKIC0tLS0tLS0KIC1EOjoKIC0tZHVtcC1yYXctdHJhY2U6OgogICAgICAgICBEdW1wIHJhdyB0cmFjZSBpbiBBU0NJSS4KIAorLS1rYWxsc3ltcz08ZmlsZT46OgorICAgICAgICBrYWxsc3ltcyBwYXRobmFtZQorCiAtbTo6CiAtLW1vZHVsZXM6OgogICAgICAgICBMb2FkIG1vZHVsZSBzeW1ib2xzLiBXQVJOSU5HOiB1c2Ugb25seSB3aXRoIC1rIGFuZCBMSVZFIGtlcm5lbApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYta21lbS50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1rbWVtLnR4dAppbmRleCA3YzhmYmJmLi4xNTAyNTNjIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1rbWVtLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1rbWVtLnR4dApAQCAtMjUsNiArMjUsMTAgQEAKIC0taW5wdXQ9PGZpbGU+OjoKIAlTZWxlY3QgdGhlIGlucHV0IGZpbGUgKGRlZmF1bHQ6IHBlcmYuZGF0YSB1bmxlc3Mgc3RkaW4gaXMgYSBmaWZvKQogCistdjo6CistLXZlcmJvc2U6OgorICAgICAgICBCZSBtb3JlIHZlcmJvc2UuIChzaG93IHN5bWJvbCBhZGRyZXNzLCBldGMpCisKIC0tY2FsbGVyOjoKIAlTaG93IHBlci1jYWxsc2l0ZSBzdGF0aXN0aWNzCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWxpc3QudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtbGlzdC50eHQKaW5kZXggM2UyYWVjOS4uYmFkYTg5MyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtbGlzdC50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtbGlzdC50eHQKQEAgLTI2LDYgKzI2LDcgQEAKICB1IC0gdXNlci1zcGFjZSBjb3VudGluZwogIGsgLSBrZXJuZWwgY291bnRpbmcKICBoIC0gaHlwZXJ2aXNvciBjb3VudGluZworIEkgLSBub24gaWRsZSBjb3VudGluZwogIEcgLSBndWVzdCBjb3VudGluZyAoaW4gS1ZNIGd1ZXN0cykKICBIIC0gaG9zdCBjb3VudGluZyAobm90IGluIEtWTSBndWVzdHMpCiAgcCAtIHByZWNpc2UgbGV2ZWwKQEAgLTEyNyw2ICsxMjgsMTIgQEAKIE9uZSBvciBtb3JlIHR5cGVzIGNhbiBiZSB1c2VkIGF0IHRoZSBzYW1lIHRpbWUsIGxpc3RpbmcgdGhlIGV2ZW50cyBmb3IgdGhlCiB0eXBlcyBzcGVjaWZpZWQuCiAKK1N1cHBvcnQgcmF3IGZvcm1hdDoKKworLiAnLS1yYXctZHVtcCcsIHNob3dzIHRoZSByYXctZHVtcCBvZiBhbGwgdGhlIGV2ZW50cy4KKy4gJy0tcmF3LWR1bXAgW2h3fHN3fGNhY2hlfHRyYWNlcG9pbnR8cG11fGV2ZW50X2dsb2JdJywgc2hvd3MgdGhlIHJhdy1kdW1wIG9mCisgIGEgY2VydGFpbiBraW5kIG9mIGV2ZW50cy4KKwogU0VFIEFMU08KIC0tLS0tLS0tCiBsaW5rcGVyZjpwZXJmLXN0YXRbMV0sIGxpbmtwZXJmOnBlcmYtdG9wWzFdLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcHJvYmUudHh0CmluZGV4IGFhYTg2OWIuLjIzOTYwOWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXByb2JlLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1wcm9iZS50eHQKQEAgLTQ3LDYgKzQ3LDEyIEBACiAtdjo6CiAtLXZlcmJvc2U6OgogICAgICAgICBCZSBtb3JlIHZlcmJvc2UgKHNob3cgcGFyc2VkIGFyZ3VtZW50cywgZXRjKS4KKwlDYW4gbm90IHVzZSB3aXRoIC1xLgorCistcTo6CistLXF1aWV0OjoKKwlCZSBxdWlldCAoZG8gbm90IHNob3cgYW55IG1lc3NhZ2VzIGluY2x1ZGluZyBlcnJvcnMpLgorCUNhbiBub3QgdXNlIHdpdGggLXYuCiAKIC1hOjoKIC0tYWRkPTo6CkBAIC05Niw3ICsxMDIsNyBAQAogCURyeSBydW4uIFdpdGggdGhpcyBvcHRpb24sIC0tYWRkIGFuZCAtLWRlbCBkb2Vzbid0IGV4ZWN1dGUgYWN0dWFsCiAJYWRkaW5nIGFuZCByZW1vdmFsIG9wZXJhdGlvbnMuCiAKLS0tbWF4LXByb2Jlczo6CistLW1heC1wcm9iZXM9TlVNOjoKIAlTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHByb2JlIHBvaW50cyBmb3IgYW4gZXZlbnQuIERlZmF1bHQgaXMgMTI4LgogCiAteDo6CkBAIC0xMDQsOCArMTEwLDEzIEBACiAJU3BlY2lmeSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlIG9yIHNoYXJlZCBsaWJyYXJ5IGZpbGUgZm9yIHVzZXIKIAlzcGFjZSB0cmFjaW5nLiBDYW4gYWxzbyBiZSB1c2VkIHdpdGggLS1mdW5jcyBvcHRpb24uCiAKKy0tZGVtYW5nbGU6OgorCURlbWFuZ2xlIGFwcGxpY2F0aW9uIHN5bWJvbHMuIC0tbm8tZGVtYW5nbGUgaXMgYWxzbyBhdmFpbGFibGUKKwlmb3IgZGlzYWJsaW5nIGRlbWFuZ2xpbmcuCisKIC0tZGVtYW5nbGUta2VybmVsOjoKLQlEZW1hbmdsZSBrZXJuZWwgc3ltYm9scy4KKwlEZW1hbmdsZSBrZXJuZWwgc3ltYm9scy4gLS1uby1kZW1hbmdsZS1rZXJuZWwgaXMgYWxzbyBhdmFpbGFibGUKKwlmb3IgZGlzYWJsaW5nIGtlcm5lbCBkZW1hbmdsaW5nLgogCiBJbiBhYnNlbmNlIG9mIC1tLy14IG9wdGlvbnMsIHBlcmYgcHJvYmUgY2hlY2tzIGlmIHRoZSBmaXJzdCBhcmd1bWVudCBhZnRlcgogdGhlIG9wdGlvbnMgaXMgYW4gYWJzb2x1dGUgcGF0aCBuYW1lLiBJZiBpdHMgYW4gYWJzb2x1dGUgcGF0aCwgcGVyZiBwcm9iZQpAQCAtMTM3LDYgKzE0OCw3IEBACiAgW05BTUU9XUxPQ0FMVkFSfCRyZXR2YWx8JVJFR3xAU1lNQk9MWzpUWVBFXQogCiAnTkFNRScgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoaXMgYXJndW1lbnQgKG9wdGlvbmFsKS4gWW91IGNhbiB1c2UgdGhlIG5hbWUgb2YgbG9jYWwgdmFyaWFibGUsIGxvY2FsIGRhdGEgc3RydWN0dXJlIG1lbWJlciAoZS5nLiB2YXItPmZpZWxkLCB2YXIuZmllbGQyKSwgbG9jYWwgYXJyYXkgd2l0aCBmaXhlZCBpbmRleCAoZS5nLiBhcnJheVsxXSwgdmFyLT5hcnJheVswXSwgdmFyLT5wb2ludGVyWzJdKSwgb3Iga3Byb2JlLXRyYWNlciBhcmd1bWVudCBmb3JtYXQgKGUuZy4gJHJldHZhbCwgJWF4LCBldGMpLiBOb3RlIHRoYXQgdGhlIG5hbWUgb2YgdGhpcyBhcmd1bWVudCB3aWxsIGJlIHNldCBhcyB0aGUgbGFzdCBtZW1iZXIgbmFtZSBpZiB5b3Ugc3BlY2lmeSBhIGxvY2FsIGRhdGEgc3RydWN0dXJlIG1lbWJlciAoZS5nLiBmaWVsZDIgZm9yICd2YXItPmZpZWxkMS5maWVsZDInLikKKyckdmFycycgc3BlY2lhbCBhcmd1bWVudCBpcyBhbHNvIGF2YWlsYWJsZSBmb3IgTkFNRSwgaXQgaXMgZXhwYW5kZWQgdG8gdGhlIGxvY2FsIHZhcmlhYmxlcyB3aGljaCBjYW4gYWNjZXNzIGF0IGdpdmVuIHByb2JlIHBvaW50LgogJ1RZUEUnIGNhc3RzIHRoZSB0eXBlIG9mIHRoaXMgYXJndW1lbnQgKG9wdGlvbmFsKS4gSWYgb21pdHRlZCwgcGVyZiBwcm9iZSBhdXRvbWF0aWNhbGx5IHNldCB0aGUgdHlwZSBiYXNlZCBvbiBkZWJ1Z2luZm8uIFlvdSBjYW4gc3BlY2lmeSAnc3RyaW5nJyB0eXBlIG9ubHkgZm9yIHRoZSBsb2NhbCB2YXJpYWJsZSBvciBzdHJ1Y3R1cmUgbWVtYmVyIHdoaWNoIGlzIGFuIGFycmF5IG9mIG9yIGEgcG9pbnRlciB0byAnY2hhcicgb3IgJ3Vuc2lnbmVkIGNoYXInIHR5cGUuCiAKIE9uIHg4NiBzeXN0ZW1zICVSRUcgaXMgYWx3YXlzIHRoZSBzaG9ydCBmb3JtIG9mIHRoZSByZWdpc3RlcjogZm9yIGV4YW1wbGUgJUFYLiAlUkFYIG9yICVFQVggaXMgbm90IHZhbGlkLgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVjb3JkLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlY29yZC50eHQKaW5kZXggMzFlOTc3NC4uNDg0N2E3OSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVjb3JkLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0CkBAIC01NSw2ICs1NSwxMSBAQAogICAgICAgICAgIElmIHlvdSB3YW50IHRvIHByb2ZpbGUgd3JpdGUgYWNjZXNzZXMgaW4gWzB4MTAwMH4xMDA4KSwganVzdCBzZXQKICAgICAgICAgICAnbWVtOjB4MTAwMC84OncnLgogCisJLSBhIGdyb3VwIG9mIGV2ZW50cyBzdXJyb3VuZGVkIGJ5IGEgcGFpciBvZiBicmFjZSAoIntldmVudDEsZXZlbnQyLC4uLn0iKS4KKwkgIEVhY2ggZXZlbnQgaXMgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgdGhlIGdyb3VwIHNob3VsZCBiZSBxdW90ZWQgdG8KKwkgIHByZXZlbnQgdGhlIHNoZWxsIGludGVycHJldGF0aW9uLiAgWW91IGFsc28gbmVlZCB0byB1c2UgLS1ncm91cCBvbgorCSAgInBlcmYgcmVwb3J0IiB0byB2aWV3IGdyb3VwIGV2ZW50cyB0b2dldGhlci4KKwogLS1maWx0ZXI9PGZpbHRlcj46OgogICAgICAgICBFdmVudCBmaWx0ZXIuCiAKQEAgLTYyLDkgKzY3LDYgQEAKIC0tYWxsLWNwdXM6OgogICAgICAgICBTeXN0ZW0td2lkZSBjb2xsZWN0aW9uIGZyb20gYWxsIENQVXMuCiAKLS1sOjoKLSAgICAgICAgU2NhbGUgY291bnRlciB2YWx1ZXMuCi0KIC1wOjoKIC0tcGlkPTo6CiAJUmVjb3JkIGV2ZW50cyBvbiBleGlzdGluZyBwcm9jZXNzIElEIChjb21tYSBzZXBhcmF0ZWQgbGlzdCkuCkBAIC0xMDcsNiArMTA5LDEwIEBACiAJc3BlY2lmaWNhdGlvbiB3aXRoIGFwcGVuZGVkIHVuaXQgY2hhcmFjdGVyIC0gQi9LL00vRy4gVGhlCiAJc2l6ZSBpcyByb3VuZGVkIHVwIHRvIGhhdmUgbmVhcmVzdCBwYWdlcyBwb3dlciBvZiB0d28gdmFsdWUuCiAKKy0tZ3JvdXA6OgorCVB1dCBhbGwgZXZlbnRzIGluIGEgc2luZ2xlIGV2ZW50IGdyb3VwLiAgVGhpcyBwcmVjZWRlcyB0aGUgLS1ldmVudAorCW9wdGlvbiBhbmQgcmVtYWlucyBvbmx5IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAgU2VlIC0tZXZlbnQuCisKIC1nOjoKIAlFbmFibGVzIGNhbGwtZ3JhcGggKHN0YWNrIGNoYWluL2JhY2t0cmFjZSkgcmVjb3JkaW5nLgogCkBAIC0xMTUsMTMgKzEyMSwxOSBAQAogCWltcGxpZXMgLWcuCiAKIAlBbGxvd3Mgc3BlY2lmeWluZyAiZnAiIChmcmFtZSBwb2ludGVyKSBvciAiZHdhcmYiCi0JKERXQVJGJ3MgQ0ZJIC0gQ2FsbCBGcmFtZSBJbmZvcm1hdGlvbikgYXMgdGhlIG1ldGhvZCB0byBjb2xsZWN0CisJKERXQVJGJ3MgQ0ZJIC0gQ2FsbCBGcmFtZSBJbmZvcm1hdGlvbikgb3IgImxiciIKKwkoSGFyZHdhcmUgTGFzdCBCcmFuY2ggUmVjb3JkIGZhY2lsaXR5KSBhcyB0aGUgbWV0aG9kIHRvIGNvbGxlY3QKIAl0aGUgaW5mb3JtYXRpb24gdXNlZCB0byBzaG93IHRoZSBjYWxsIGdyYXBocy4KIAogCUluIHNvbWUgc3lzdGVtcywgd2hlcmUgYmluYXJpZXMgYXJlIGJ1aWxkIHdpdGggZ2NjCiAJLS1mb21pdC1mcmFtZS1wb2ludGVyLCB1c2luZyB0aGUgImZwIiBtZXRob2Qgd2lsbCBwcm9kdWNlIGJvZ3VzCiAJY2FsbCBncmFwaHMsIHVzaW5nICJkd2FyZiIsIGlmIGF2YWlsYWJsZSAocGVyZiB0b29scyBsaW5rZWQgdG8KIAl0aGUgbGlidW53aW5kIGxpYnJhcnkpIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisJVXNpbmcgdGhlICJsYnIiIG1ldGhvZCBkb2Vzbid0IHJlcXVpcmUgYW55IGNvbXBpbGVyIG9wdGlvbnMuIEl0CisJd2lsbCBwcm9kdWNlIGNhbGwgZ3JhcGhzIGZyb20gdGhlIGhhcmR3YXJlIExCUiByZWdpc3RlcnMuIFRoZQorCW1haW4gbGltaXRpb24gaXMgdGhhdCBpdCBpcyBvbmx5IGF2YWlsYWJsZSBvbiBuZXcgSW50ZWwKKwlwbGF0Zm9ybXMsIHN1Y2ggYXMgSGFzd2VsbC4gSXQgY2FuIG9ubHkgZ2V0IHVzZXIgY2FsbCBjaGFpbi4gSXQKKwlkb2Vzbid0IHdvcmsgd2l0aCBicmFuY2ggc3RhY2sgc2FtcGxpbmcgYXQgdGhlIHNhbWUgdGltZS4KIAogLXE6OgogLS1xdWlldDo6CkBAIC0yMzUsNiArMjQ3LDE2IEBACiBlYWNoIHNhbXBsZS4gTGlzdCBvZiBjYXB0dXJlZCByZWdpc3RlcnMgZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlLiBUaGlzIG9wdGlvbgogaXMgb2ZmIGJ5IGRlZmF1bHQuCiAKKy0tcnVubmluZy10aW1lOjoKK1JlY29yZCBydW5uaW5nIGFuZCBlbmFibGVkIHRpbWUgZm9yIHJlYWQgZXZlbnRzICg6UykKKworLWs6OgorLS1jbG9ja2lkOjoKK1NldHMgdGhlIGNsb2NrIGlkIHRvIHVzZSBmb3IgdGhlIHZhcmlvdXMgdGltZSBmaWVsZHMgaW4gdGhlIHBlcmZfZXZlbnRfdHlwZQorcmVjb3Jkcy4gU2VlIGNsb2NrX2dldHRpbWUoKS4gSW4gcGFydGljdWxhciBDTE9DS19NT05PVE9OSUMgYW5kCitDTE9DS19NT05PVE9OSUNfUkFXIGFyZSBzdXBwb3J0ZWQsIHNvbWUgZXZlbnRzIG1pZ2h0IGFsc28gYWxsb3cKK0NMT0NLX0JPT1RUSU1FLCBDTE9DS19SRUFMVElNRSBhbmQgQ0xPQ0tfVEFJLgorCiBTRUUgQUxTTwogLS0tLS0tLS0KIGxpbmtwZXJmOnBlcmYtc3RhdFsxXSwgbGlua3BlcmY6cGVyZi1saXN0WzFdCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZXBvcnQudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVwb3J0LnR4dAppbmRleCBkZDdjY2NkLi40ODc5Y2Y2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZXBvcnQudHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlcG9ydC50eHQKQEAgLTQwLDYgKzQwLDExIEBACiAJT25seSBjb25zaWRlciBzeW1ib2xzIGluIHRoZXNlIGNvbW1zLiBDU1YgdGhhdCB1bmRlcnN0YW5kcwogCWZpbGU6Ly9maWxlbmFtZSBlbnRyaWVzLiAgVGhpcyBvcHRpb24gd2lsbCBhZmZlY3QgdGhlIHBlcmNlbnRhZ2Ugb2YKIAl0aGUgb3ZlcmhlYWQgY29sdW1uLiAgU2VlIC0tcGVyY2VudGFnZSBmb3IgbW9yZSBpbmZvLgorLS1waWQ9OjoKKyAgICAgICAgT25seSBzaG93IGV2ZW50cyBmb3IgZ2l2ZW4gcHJvY2VzcyBJRCAoY29tbWEgc2VwYXJhdGVkIGxpc3QpLgorCistLXRpZD06OgorICAgICAgICBPbmx5IHNob3cgZXZlbnRzIGZvciBnaXZlbiB0aHJlYWQgSUQgKGNvbW1hIHNlcGFyYXRlZCBsaXN0KS4KIC1kOjoKIC0tZHNvcz06OgogCU9ubHkgY29uc2lkZXIgc3ltYm9scyBpbiB0aGVzZSBkc29zLiBDU1YgdGhhdCB1bmRlcnN0YW5kcwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc2NyaXB0LnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXNjcmlwdC50eHQKaW5kZXggYTIxZWVjMC4uNzk0NDU3NSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc2NyaXB0LnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zY3JpcHQudHh0CkBAIC0xOTMsNiArMTkzLDEyIEBACiAJT25seSBkaXNwbGF5IGV2ZW50cyBmb3IgdGhlc2UgY29tbXMuIENTViB0aGF0IHVuZGVyc3RhbmRzCiAJZmlsZTovL2ZpbGVuYW1lIGVudHJpZXMuCiAKKy0tcGlkPTo6CisJT25seSBzaG93IGV2ZW50cyBmb3IgZ2l2ZW4gcHJvY2VzcyBJRCAoY29tbWEgc2VwYXJhdGVkIGxpc3QpLgorCistLXRpZD06OgorCU9ubHkgc2hvdyBldmVudHMgZm9yIGdpdmVuIHRocmVhZCBJRCAoY29tbWEgc2VwYXJhdGVkIGxpc3QpLgorCiAtSTo6CiAtLXNob3ctaW5mbzo6CiAJRGlzcGxheSBleHRlbmRlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGVyZi5kYXRhIGZpbGUuIFRoaXMgYWRkcwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtdHJhY2UudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtdHJhY2UudHh0CmluZGV4IDdlMWIxZjIuLmJhMDNmZDUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXRyYWNlLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi10cmFjZS50eHQKQEAgLTU1LDYgKzU1LDkgQEAKIC0tdWlkPTo6CiAgICAgICAgIFJlY29yZCBldmVudHMgaW4gdGhyZWFkcyBvd25lZCBieSB1aWQuIE5hbWUgb3IgbnVtYmVyLgogCistLWZpbHRlci1waWRzPTo6CisJRmlsdGVyIG91dCBldmVudHMgZm9yIHRoZXNlIHBpZHMgYW5kIGZvciAndHJhY2UnIGl0c2VsZiAoY29tbWEgc2VwYXJhdGVkIGxpc3QpLgorCiAtdjo6CiAtLXZlcmJvc2U9OjoKICAgICAgICAgVmVyYm9zaXR5IGxldmVsLgpAQCAtMTE1LDYgKzExOCw5IEBACiAtLXN5c2NhbGxzOjoKIAlUcmFjZSBzeXN0ZW0gY2FsbHMuIFRoaXMgb3B0aW9ucyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCiAKKy0tZXZlbnQ6OgorCVRyYWNlIG90aGVyIGV2ZW50cywgc2VlICdwZXJmIGxpc3QnIGZvciBhIGNvbXBsZXRlIGxpc3QuCisKIFBBR0VGQVVMVFMKIC0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYudHh0CmluZGV4IDFlOGU0MDAuLjJiMTMxNzcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi50eHQKQEAgLTEzLDExICsxMywxNiBAQAogT1BUSU9OUwogLS0tLS0tLQogLS1kZWJ1Zzo6Ci0JU2V0dXAgZGVidWcgdmFyaWFibGUgKGp1c3QgdmVyYm9zZSBmb3Igbm93KSBpbiB2YWx1ZQorCVNldHVwIGRlYnVnIHZhcmlhYmxlIChzZWUgbGlzdCBiZWxvdykgaW4gdmFsdWUKIAlyYW5nZSAoMCwgMTApLiBVc2UgbGlrZToKIAkgIC0tZGVidWcgdmVyYm9zZSAgICMgc2V0cyB2ZXJib3NlID0gMQogCSAgLS1kZWJ1ZyB2ZXJib3NlPTIgIyBzZXRzIHZlcmJvc2UgPSAyCiAKKwlMaXN0IG9mIGRlYnVnIHZhcmlhYmxlcyBhbGxvd2VkIHRvIHNldDoKKwkgIHZlcmJvc2UgICAgICAgICAgLSBnZW5lcmFsIGRlYnVnIG1lc3NhZ2VzCisJICBvcmRlcmVkLWV2ZW50cyAgIC0gb3JkZXJlZCBldmVudHMgb2JqZWN0IGRlYnVnIG1lc3NhZ2VzCisJICBkYXRhLWNvbnZlcnQgICAgIC0gZGF0YSBjb252ZXJ0IGNvbW1hbmQgZGVidWcgbWVzc2FnZXMKKwogLS1idWlsZGlkLWRpcjo6CiAJU2V0dXAgYnVpbGRpZCBjYWNoZSBkaXJlY3RvcnkuIEl0IGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhbgogCWJ1aWxkaWQuZGlyIGNvbmZpZyBmaWxlIG9wdGlvbi4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvTUFOSUZFU1QgYi90b29scy9wZXJmL01BTklGRVNUCmluZGV4IGZiYmZkYzMuLjExY2NiYjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvTUFOSUZFU1QKKysrIGIvdG9vbHMvcGVyZi9NQU5JRkVTVApAQCAtMSw1ICsxLDYgQEAKIHRvb2xzL3BlcmYKIHRvb2xzL3NjcmlwdHMKK3Rvb2xzL2J1aWxkCiB0b29scy9saWIvdHJhY2VldmVudAogdG9vbHMvbGliL2FwaQogdG9vbHMvbGliL3N5bWJvbC9rYWxsc3ltcy5jCmRpZmYgLS1naXQgYS90b29scy9wZXJmL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9NYWtlZmlsZQppbmRleCBjYjJlNTg2Li5jNjk5ZGMzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUKQEAgLTI0LDggKzI0LDggQEAKICMgKFRvIG92ZXJyaWRlIGl0LCBydW4gJ21ha2UgSk9CUz0xJyBhbmQgc2ltaWxhci4pCiAjCiBpZmVxICgkKEpPQlMpLCkKLSAgSk9CUyA6PSAkKHNoZWxsIGdyZXAgLWMgXnByb2Nlc3NvciAvcHJvYy9jcHVpbmZvIDI+L2Rldi9udWxsKQotICBpZmVxICgkKEpPQlMpLCkKKyAgSk9CUyA6PSAkKHNoZWxsIGVncmVwIC1jICdecHJvY2Vzc29yfF5DUFUnIC9wcm9jL2NwdWluZm8gMj4vZGV2L251bGwpCisgIGlmZXEgKCQoSk9CUyksMCkKICAgICBKT0JTIDo9IDEKICAgZW5kaWYKIGVuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL01ha2VmaWxlLnBlcmYgYi90b29scy9wZXJmL01ha2VmaWxlLnBlcmYKaW5kZXggYWE2YTUwNC4uYzQzYTIwNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9NYWtlZmlsZS5wZXJmCisrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUucGVyZgpAQCAtNjgsNyArNjgsMTEgQEAKICMgZm9yIHJlYWRpbmcgdGhlIHgzMiBtb2RlIDMyLWJpdCBjb21wYXRpYmlsaXR5IFZEU08gaW4gNjQtYml0IG1vZGUKICMKICMgRGVmaW5lIE5PX1pMSUIgaWYgeW91IGRvIG5vdCB3YW50IHRvIHN1cHBvcnQgY29tcHJlc3NlZCBrZXJuZWwgbW9kdWxlcwotCisjCisjIERlZmluZSBMSUJCQUJFTFRSQUNFIGlmIHlvdSBETyB3YW50IGxpYmJhYmVsdHJhY2Ugc3VwcG9ydAorIyBmb3IgQ1RGIGRhdGEgZm9ybWF0LgorIworIyBEZWZpbmUgTk9fTFpNQSBpZiB5b3UgZG8gbm90IHdhbnQgdG8gc3VwcG9ydCBjb21wcmVzc2VkICh4eikga2VybmVsIG1vZHVsZXMKIAogaWZlcSAoJChzcmN0cmVlKSwpCiBzcmN0cmVlIDo9ICQocGF0c3Vic3QgJS8sJSwkKGRpciAkKHNoZWxsIHB3ZCkpKQpAQCAtODIsMTMgKzg2LDI5IEBACiAKIGlmbmVxICgkKE9VVFBVVCksKQogIyQoaW5mbyBEZXRlcm1pbmVkICdPVVRQVVQnIHRvIGJlICQoT1VUUFVUKSkKKyMgQWRkaW5nICQoT1VUUFVUKSBhcyBhIGRpcmVjdG9yeSB0byBsb29rIGZvciBzb3VyY2UgZmlsZXMsCisjIGJlY2F1c2UgdXNlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZXMgYXMgc291cmNlcyBkZXBlbmRlbmN5CisjIGZvciBmbGV4L2Jpc29uIHBhcnNlcnMuCitWUEFUSCArPSAkKE9VVFBVVCkKK2V4cG9ydCBWUEFUSAogZW5kaWYKIAoraWZlcSAoJChWKSwxKQorICBRID0KK2Vsc2UKKyAgUSA9IEAKK2VuZGlmCisKKyMgRG8gbm90IHVzZSBtYWtlJ3MgYnVpbHQtaW4gcnVsZXMKKyMgKHRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2UgYW5kIGF2b2lkcyBoYXJkLXRvLWRlYnVnIGJlaGF2aW91cik7CitNQUtFRkxBR1MgKz0gLXIKKwogJChPVVRQVVQpUEVSRi1WRVJTSU9OLUZJTEU6IC4uLy4uLy5naXQvSEVBRAotCUAkKFNIRUxMX1BBVEgpIHV0aWwvUEVSRi1WRVJTSU9OLUdFTiAkKE9VVFBVVCkKLQlAdG91Y2ggJChPVVRQVVQpUEVSRi1WRVJTSU9OLUZJTEUKKwkkKFEpJChTSEVMTF9QQVRIKSB1dGlsL1BFUkYtVkVSU0lPTi1HRU4gJChPVVRQVVQpCisJJChRKXRvdWNoICQoT1VUUFVUKVBFUkYtVkVSU0lPTi1GSUxFCiAKIENDID0gJChDUk9TU19DT01QSUxFKWdjYworTEQgPSAkKENST1NTX0NPTVBJTEUpbGQKIEFSID0gJChDUk9TU19DT01QSUxFKWFyCiBQS0dfQ09ORklHID0gJChDUk9TU19DT01QSUxFKXBrZy1jb25maWcKIApAQCAtMTI3LDEwICsxNDcsNiBAQAogU1BBUlNFX0ZMQUdTID0gLURfX0JJR19FTkRJQU5fXyAtRF9fcG93ZXJwY19fCiAKICMgR3VhcmQgYWdhaW5zdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKLUJVSUxUSU5fT0JKUyA9Ci1MSUJfSCA9Ci1MSUJfT0JKUyA9Ci1HVEtfT0JKUyA9CiBQWVJGX09CSlMgPQogU0NSSVBUX1NIID0KIApAQCAtMTU1LDggKzE3MSw4IEBACiBMSUJUUkFDRUVWRU5UID0gJChURV9QQVRIKWxpYnRyYWNlZXZlbnQuYQogZXhwb3J0IExJQlRSQUNFRVZFTlQKIAotTElCQVBJS0ZTID0gJChMSUJfUEFUSClsaWJhcGlrZnMuYQotZXhwb3J0IExJQkFQSUtGUworTElCQVBJID0gJChMSUJfUEFUSClsaWJhcGkuYQorZXhwb3J0IExJQkFQSQogCiAjIHB5dGhvbiBleHRlbnNpb24gYnVpbGQgZGlyZWN0b3JpZXMKIFBZVEhPTl9FWFRCVUlMRCAgICAgOj0gJChPVVRQVVQpcHl0aG9uX2V4dF9idWlsZC8KQEAgLTE2Nyw3ICsxODMsNyBAQAogcHl0aG9uLWNsZWFuIDo9ICQoY2FsbCBRVUlFVF9DTEVBTiwgcHl0aG9uKSAkKFJNKSAtciAkKFBZVEhPTl9FWFRCVUlMRCkgJChPVVRQVVQpcHl0aG9uL3BlcmYuc28KIAogUFlUSE9OX0VYVF9TUkNTIDo9ICQoc2hlbGwgZ3JlcCAtdiBeXCMgdXRpbC9weXRob24tZXh0LXNvdXJjZXMpCi1QWVRIT05fRVhUX0RFUFMgOj0gdXRpbC9weXRob24tZXh0LXNvdXJjZXMgdXRpbC9zZXR1cC5weSAkKExJQlRSQUNFRVZFTlQpICQoTElCQVBJS0ZTKQorUFlUSE9OX0VYVF9ERVBTIDo9IHV0aWwvcHl0aG9uLWV4dC1zb3VyY2VzIHV0aWwvc2V0dXAucHkgJChMSUJUUkFDRUVWRU5UKSAkKExJQkFQSSkKIAogJChPVVRQVVQpcHl0aG9uL3BlcmYuc286ICQoUFlUSE9OX0VYVF9TUkNTKSAkKFBZVEhPTl9FWFRfREVQUykKIAkkKFFVSUVUX0dFTilDRkxBR1M9JyQoQ0ZMQUdTKScgJChQWVRIT05fV09SRCkgdXRpbC9zZXR1cC5weSBcCkBAIC0yMDYsMjk3ICsyMjIsOSBAQAogCiBleHBvcnQgUEVSTF9QQVRICiAKLSQoT1VUUFVUKXV0aWwvcGFyc2UtZXZlbnRzLWZsZXguYzogdXRpbC9wYXJzZS1ldmVudHMubCAkKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy1iaXNvbi5jCi0JJChRVUlFVF9GTEVYKSQoRkxFWCkgLW8gJEAgLS1oZWFkZXItZmlsZT0kKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy1mbGV4LmggJChQQVJTRVJfREVCVUdfRkxFWCkgdXRpbC9wYXJzZS1ldmVudHMubAotCi0kKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy1iaXNvbi5jOiB1dGlsL3BhcnNlLWV2ZW50cy55Ci0JJChRVUlFVF9CSVNPTikkKEJJU09OKSAtdiB1dGlsL3BhcnNlLWV2ZW50cy55IC1kICQoUEFSU0VSX0RFQlVHX0JJU09OKSAtbyAkKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy1iaXNvbi5jIC1wIHBhcnNlX2V2ZW50c18KLQotJChPVVRQVVQpdXRpbC9wbXUtZmxleC5jOiB1dGlsL3BtdS5sICQoT1VUUFVUKXV0aWwvcG11LWJpc29uLmMKLQkkKFFVSUVUX0ZMRVgpJChGTEVYKSAtbyAkQCAtLWhlYWRlci1maWxlPSQoT1VUUFVUKXV0aWwvcG11LWZsZXguaCB1dGlsL3BtdS5sCi0KLSQoT1VUUFVUKXV0aWwvcG11LWJpc29uLmM6IHV0aWwvcG11LnkKLQkkKFFVSUVUX0JJU09OKSQoQklTT04pIC12IHV0aWwvcG11LnkgLWQgLW8gJChPVVRQVVQpdXRpbC9wbXUtYmlzb24uYyAtcCBwZXJmX3BtdV8KLQotJChPVVRQVVQpdXRpbC9wYXJzZS1ldmVudHMubzogJChPVVRQVVQpdXRpbC9wYXJzZS1ldmVudHMtZmxleC5jICQoT1VUUFVUKXV0aWwvcGFyc2UtZXZlbnRzLWJpc29uLmMKLSQoT1VUUFVUKXV0aWwvcG11Lm86ICQoT1VUUFVUKXV0aWwvcG11LWZsZXguYyAkKE9VVFBVVCl1dGlsL3BtdS1iaXNvbi5jCi0KIExJQl9GSUxFPSQoT1VUUFVUKWxpYnBlcmYuYQogCi1MSUJfSCArPSAuLi9saWIvc3ltYm9sL2thbGxzeW1zLmgKLUxJQl9IICs9IC4uLy4uL2luY2x1ZGUvdWFwaS9saW51eC9wZXJmX2V2ZW50LmgKLUxJQl9IICs9IC4uLy4uL2luY2x1ZGUvbGludXgvcmJ0cmVlLmgKLUxJQl9IICs9IC4uLy4uL2luY2x1ZGUvbGludXgvbGlzdC5oCi1MSUJfSCArPSAuLi8uLi9pbmNsdWRlL3VhcGkvbGludXgvY29uc3QuaAotTElCX0ggKz0gLi4vaW5jbHVkZS9saW51eC9oYXNoLmgKLUxJQl9IICs9IC4uLy4uL2luY2x1ZGUvbGludXgvc3RyaW5naWZ5LmgKLUxJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9iaXRtYXAuaAotTElCX0ggKz0gLi4vaW5jbHVkZS9saW51eC9iaXRvcHMuaAotTElCX0ggKz0gLi4vaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMvYXJjaF9od2VpZ2h0LmgKLUxJQl9IICs9IC4uL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0b3BzL2F0b21pYy5oCi1MSUJfSCArPSAuLi9pbmNsdWRlL2FzbS1nZW5lcmljL2JpdG9wcy9jb25zdF9od2VpZ2h0LmgKLUxJQl9IICs9IC4uL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0b3BzL2ZpbmQuaAotTElCX0ggKz0gLi4vaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMvZmxzNjQuaAotTElCX0ggKz0gLi4vaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMvZmxzLmgKLUxJQl9IICs9IC4uL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0b3BzL19fZmZzLmgKLUxJQl9IICs9IC4uL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0b3BzL19fZmxzLmgKLUxJQl9IICs9IC4uL2luY2x1ZGUvYXNtLWdlbmVyaWMvYml0b3BzL2h3ZWlnaHQuaAotTElCX0ggKz0gLi4vaW5jbHVkZS9hc20tZ2VuZXJpYy9iaXRvcHMuaAotTElCX0ggKz0gLi4vaW5jbHVkZS9saW51eC9jb21waWxlci5oCi1MSUJfSCArPSAuLi9pbmNsdWRlL2xpbnV4L2xvZzIuaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2xpbnV4L2NvbnN0LmgKLUxJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9jdHlwZS5oCi1MSUJfSCArPSB1dGlsL2luY2x1ZGUvbGludXgva2VybmVsLmgKLUxJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9saXN0LmgKLUxJQl9IICs9IC4uL2luY2x1ZGUvbGludXgvZXhwb3J0LmgKLUxJQl9IICs9IHV0aWwvaW5jbHVkZS9saW51eC9wb2lzb24uaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2xpbnV4L3JidHJlZS5oCi1MSUJfSCArPSB1dGlsL2luY2x1ZGUvbGludXgvcmJ0cmVlX2F1Z21lbnRlZC5oCi1MSUJfSCArPSB1dGlsL2luY2x1ZGUvbGludXgvc3RyaW5nLmgKLUxJQl9IICs9IC4uL2luY2x1ZGUvbGludXgvdHlwZXMuaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2xpbnV4L2xpbmthZ2UuaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2FzbS9hc20tb2Zmc2V0cy5oCi1MSUJfSCArPSAuLi9pbmNsdWRlL2FzbS9idWcuaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2FzbS9ieXRlb3JkZXIuaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2FzbS9zd2FiLmgKLUxJQl9IICs9IHV0aWwvaW5jbHVkZS9hc20vc3lzdGVtLmgKLUxJQl9IICs9IHV0aWwvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCi1MSUJfSCArPSB1dGlsL2luY2x1ZGUvZHdhcmYtcmVncy5oCi1MSUJfSCArPSB1dGlsL2luY2x1ZGUvYXNtL2R3YXJmMi5oCi1MSUJfSCArPSB1dGlsL2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaAotTElCX0ggKz0gdXRpbC9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaAotTElCX0ggKz0gcGVyZi5oCi1MSUJfSCArPSB1dGlsL2Fubm90YXRlLmgKLUxJQl9IICs9IHV0aWwvY2FjaGUuaAotTElCX0ggKz0gdXRpbC9jYWxsY2hhaW4uaAotTElCX0ggKz0gdXRpbC9idWlsZC1pZC5oCi1MSUJfSCArPSB1dGlsL2RiLWV4cG9ydC5oCi1MSUJfSCArPSB1dGlsL2RlYnVnLmgKLUxJQl9IICs9IHV0aWwvcG11LmgKLUxJQl9IICs9IHV0aWwvZXZlbnQuaAotTElCX0ggKz0gdXRpbC9ldnNlbC5oCi1MSUJfSCArPSB1dGlsL2V2bGlzdC5oCi1MSUJfSCArPSB1dGlsL2V4ZWNfY21kLmgKLUxJQl9IICs9IHV0aWwvZmluZC12ZHNvLW1hcC5jCi1MSUJfSCArPSB1dGlsL2xldmVuc2h0ZWluLmgKLUxJQl9IICs9IHV0aWwvbWFjaGluZS5oCi1MSUJfSCArPSB1dGlsL21hcC5oCi1MSUJfSCArPSB1dGlsL3BhcnNlLW9wdGlvbnMuaAotTElCX0ggKz0gdXRpbC9wYXJzZS1ldmVudHMuaAotTElCX0ggKz0gdXRpbC9xdW90ZS5oCi1MSUJfSCArPSB1dGlsL3V0aWwuaAotTElCX0ggKz0gdXRpbC94eWFycmF5LmgKLUxJQl9IICs9IHV0aWwvaGVhZGVyLmgKLUxJQl9IICs9IHV0aWwvaGVscC5oCi1MSUJfSCArPSB1dGlsL3Nlc3Npb24uaAotTElCX0ggKz0gdXRpbC9vcmRlcmVkLWV2ZW50cy5oCi1MSUJfSCArPSB1dGlsL3N0cmJ1Zi5oCi1MSUJfSCArPSB1dGlsL3N0cmxpc3QuaAotTElCX0ggKz0gdXRpbC9zdHJmaWx0ZXIuaAotTElCX0ggKz0gdXRpbC9zdmdoZWxwZXIuaAotTElCX0ggKz0gdXRpbC90b29sLmgKLUxJQl9IICs9IHV0aWwvcnVuLWNvbW1hbmQuaAotTElCX0ggKz0gdXRpbC9zaWdjaGFpbi5oCi1MSUJfSCArPSB1dGlsL2Rzby5oCi1MSUJfSCArPSB1dGlsL3N5bWJvbC5oCi1MSUJfSCArPSB1dGlsL2NvbG9yLmgKLUxJQl9IICs9IHV0aWwvdmFsdWVzLmgKLUxJQl9IICs9IHV0aWwvc29ydC5oCi1MSUJfSCArPSB1dGlsL2hpc3QuaAotTElCX0ggKz0gdXRpbC9jb21tLmgKLUxJQl9IICs9IHV0aWwvdGhyZWFkLmgKLUxJQl9IICs9IHV0aWwvdGhyZWFkX21hcC5oCi1MSUJfSCArPSB1dGlsL3RyYWNlLWV2ZW50LmgKLUxJQl9IICs9IHV0aWwvcHJvYmUtZmluZGVyLmgKLUxJQl9IICs9IHV0aWwvZHdhcmYtYXV4LmgKLUxJQl9IICs9IHV0aWwvcHJvYmUtZXZlbnQuaAotTElCX0ggKz0gdXRpbC9wc3RhY2suaAotTElCX0ggKz0gdXRpbC9jcHVtYXAuaAotTElCX0ggKz0gdXRpbC90b3AuaAotTElCX0ggKz0gJChBUkNIX0lOQ0xVREUpCi1MSUJfSCArPSB1dGlsL2Nncm91cC5oCi1MSUJfSCArPSAkKExJQl9JTkNMVURFKXRyYWNlZXZlbnQvZXZlbnQtcGFyc2UuaAotTElCX0ggKz0gdXRpbC90YXJnZXQuaAotTElCX0ggKz0gdXRpbC9yYmxpc3QuaAotTElCX0ggKz0gdXRpbC9pbnRsaXN0LmgKLUxJQl9IICs9IHV0aWwvcGVyZl9yZWdzLmgKLUxJQl9IICs9IHV0aWwvdW53aW5kLmgKLUxJQl9IICs9IHV0aWwvdmRzby5oCi1MSUJfSCArPSB1dGlsL3RzYy5oCi1MSUJfSCArPSB1aS9oZWxwbGluZS5oCi1MSUJfSCArPSB1aS9wcm9ncmVzcy5oCi1MSUJfSCArPSB1aS91dGlsLmgKLUxJQl9IICs9IHVpL3VpLmgKLUxJQl9IICs9IHV0aWwvZGF0YS5oCi1MSUJfSCArPSB1dGlsL2t2bS1zdGF0LmgKLUxJQl9IICs9IHV0aWwvdGhyZWFkLXN0YWNrLmgKLQotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9hYnNwYXRoLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvYWxpYXMubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9hbm5vdGF0ZS5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2J1aWxkLWlkLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvY29uZmlnLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvY3R5cGUubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9kYi1leHBvcnQubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9wbXUubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9lbnZpcm9ubWVudC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2V2ZW50Lm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvZXZsaXN0Lm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvZXZzZWwubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9leGVjX2NtZC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2ZpbmRfbmV4dF9iaXQubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9oZWxwLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwva2FsbHN5bXMubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9sZXZlbnNodGVpbi5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3BhcnNlLW9wdGlvbnMubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9wYXJzZS1ldmVudHMubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9wYXRoLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvcmJ0cmVlLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvYml0bWFwLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvaHdlaWdodC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3J1bi1jb21tYW5kLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvcXVvdGUubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9zdHJidWYubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9zdHJpbmcubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9zdHJsaXN0Lm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvc3RyZmlsdGVyLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvdG9wLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvdXNhZ2UubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC93cmFwcGVyLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvc2lnY2hhaW4ubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9kc28ubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9zeW1ib2wubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9zeW1ib2wtZWxmLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvY29sb3IubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9wYWdlci5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2hlYWRlci5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2NhbGxjaGFpbi5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3ZhbHVlcy5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2RlYnVnLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvbWFjaGluZS5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL21hcC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3BzdGFjay5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3Nlc3Npb24ubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9vcmRlcmVkLWV2ZW50cy5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2NvbW0ubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC90aHJlYWQubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC90aHJlYWRfbWFwLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvdHJhY2UtZXZlbnQtcGFyc2UubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9wYXJzZS1ldmVudHMtZmxleC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy1iaXNvbi5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3BtdS1mbGV4Lm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvcG11LWJpc29uLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvdHJhY2UtZXZlbnQtcmVhZC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3RyYWNlLWV2ZW50LWluZm8ubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC90cmFjZS1ldmVudC1zY3JpcHRpbmcubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC90cmFjZS1ldmVudC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3N2Z2hlbHBlci5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3NvcnQubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9oaXN0Lm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvcHJvYmUtZXZlbnQubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC91dGlsLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwveHlhcnJheS5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2NwdW1hcC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2Nncm91cC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3RhcmdldC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3JibGlzdC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL2ludGxpc3QubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC92ZHNvLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvc3RhdC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3JlY29yZC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3NyY2xpbmUubwotTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9kYXRhLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvdHNjLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvY2xvZXhlYy5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3RocmVhZC1zdGFjay5vCi0KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXVpL3NldHVwLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXVpL2hlbHBsaW5lLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXVpL3Byb2dyZXNzLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXVpL3V0aWwubwotTElCX09CSlMgKz0gJChPVVRQVVQpdWkvaGlzdC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1aS9zdGRpby9oaXN0Lm8KLQotTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC9jb21tb24ubwotCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9wYXJzZS1ldmVudHMubwotTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvZHNvLWRhdGEubwotTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvYXR0ci5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy92bWxpbnV4LWthbGxzeW1zLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL29wZW4tc3lzY2FsbC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9vcGVuLXN5c2NhbGwtYWxsLWNwdXMubwotTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvb3Blbi1zeXNjYWxsLXRwLWZpZWxkcy5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9tbWFwLWJhc2ljLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL3BlcmYtcmVjb3JkLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL3JkcG1jLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2V2c2VsLXJvdW5kdHJpcC1uYW1lLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2V2c2VsLXRwLXNjaGVkLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2ZkYXJyYXkubwotTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvcG11Lm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2hpc3RzX2NvbW1vbi5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9oaXN0c19saW5rLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2hpc3RzX2ZpbHRlci5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9oaXN0c19vdXRwdXQubwotTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvaGlzdHNfY3VtdWxhdGUubwotTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvcHl0aG9uLXVzZS5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9icF9zaWduYWwubwotTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvYnBfc2lnbmFsX292ZXJmbG93Lm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL3Rhc2stZXhpdC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9zdy1jbG9jay5vCi1pZmVxICgkKEFSQ0gpLHg4NikKLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL3BlcmYtdGltZS10by10c2MubwotZW5kaWYKLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2NvZGUtcmVhZGluZy5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9zYW1wbGUtcGFyc2luZy5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9wYXJzZS1uby1zYW1wbGUtaWQtYWxsLm8KLWlmbmRlZiBOT19EV0FSRl9VTldJTkQKLWlmZXEgKCQoQVJDSCksJChmaWx0ZXIgJChBUkNIKSx4ODYgYXJtKSkKLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2R3YXJmLXVud2luZC5vCi1lbmRpZgotZW5kaWYKLUxJQl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL21tYXAtdGhyZWFkLWxvb2t1cC5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy90aHJlYWQtbWctc2hhcmUubwotTElCX09CSlMgKz0gJChPVVRQVVQpdGVzdHMvc3dpdGNoLXRyYWNraW5nLm8KLQotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tYW5ub3RhdGUubwotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tYmVuY2gubwotIyBCZW5jaG1hcmsgbW9kdWxlcwotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJlbmNoL3NjaGVkLW1lc3NhZ2luZy5vCi1CVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYmVuY2gvc2NoZWQtcGlwZS5vCi1pZmVxICgkKEFSQ0gpLCB4ODYpCi1pZmVxICgkKElTXzY0X0JJVCksIDEpCi1CVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYmVuY2gvbWVtLW1lbWNweS14ODYtNjQtYXNtLm8KLUJVSUxUSU5fT0JKUyArPSAkKE9VVFBVVCliZW5jaC9tZW0tbWVtc2V0LXg4Ni02NC1hc20ubwotZW5kaWYKLWVuZGlmCi1CVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYmVuY2gvbWVtLW1lbWNweS5vCi1CVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYmVuY2gvZnV0ZXgtaGFzaC5vCi1CVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYmVuY2gvZnV0ZXgtd2FrZS5vCi1CVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYmVuY2gvZnV0ZXgtcmVxdWV1ZS5vCi0KLUJVSUxUSU5fT0JKUyArPSAkKE9VVFBVVClidWlsdGluLWRpZmYubwotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tZXZsaXN0Lm8KLUJVSUxUSU5fT0JKUyArPSAkKE9VVFBVVClidWlsdGluLWhlbHAubwotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tc2NoZWQubwotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tYnVpbGRpZC1saXN0Lm8KLUJVSUxUSU5fT0JKUyArPSAkKE9VVFBVVClidWlsdGluLWJ1aWxkaWQtY2FjaGUubwotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tbGlzdC5vCi1CVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYnVpbHRpbi1yZWNvcmQubwotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tcmVwb3J0Lm8KLUJVSUxUSU5fT0JKUyArPSAkKE9VVFBVVClidWlsdGluLXN0YXQubwotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tdGltZWNoYXJ0Lm8KLUJVSUxUSU5fT0JKUyArPSAkKE9VVFBVVClidWlsdGluLXRvcC5vCi1CVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYnVpbHRpbi1zY3JpcHQubwotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4tcHJvYmUubwotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKWJ1aWx0aW4ta21lbS5vCi1CVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYnVpbHRpbi1sb2NrLm8KLUJVSUxUSU5fT0JKUyArPSAkKE9VVFBVVClidWlsdGluLWt2bS5vCi1CVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYnVpbHRpbi1pbmplY3QubwotQlVJTFRJTl9PQkpTICs9ICQoT1VUUFVUKXRlc3RzL2J1aWx0aW4tdGVzdC5vCi1CVUlMVElOX09CSlMgKz0gJChPVVRQVVQpYnVpbHRpbi1tZW0ubwotCi1QRVJGTElCUyA9ICQoTElCX0ZJTEUpICQoTElCQVBJS0ZTKSAkKExJQlRSQUNFRVZFTlQpCitQRVJGTElCUyA9ICQoTElCX0ZJTEUpICQoTElCQVBJKSAkKExJQlRSQUNFRVZFTlQpCiAKICMgV2UgY2hvb3NlIHRvIGF2b2lkICJpZiAuLiBlbHNlIGlmIC4uIGVsc2UgLi4gZW5kaWYgZW5kaWYiCiAjIGJlY2F1c2UgbWFpbnRhaW5pbmcgdGhlIG5lc3RpbmcgdG8gbWF0Y2ggaXMgYSBwYWluLiAgSWYKQEAgLTUwOCw2NyArMjM2LDkgQEAKICAgQ0ZMQUdTICs9IC1JJChPVVRQVVQpCiBlbmRpZgogCi1pZmRlZiBOT19MSUJFTEYKLSMgUmVtb3ZlIEVMRi9EV0FSRiBkZXBlbmRlbnQgY29kZXMKLUxJQl9PQkpTIDo9ICQoZmlsdGVyLW91dCAkKE9VVFBVVCl1dGlsL3N5bWJvbC1lbGYubywkKExJQl9PQkpTKSkKLUxJQl9PQkpTIDo9ICQoZmlsdGVyLW91dCAkKE9VVFBVVCl1dGlsL2R3YXJmLWF1eC5vLCQoTElCX09CSlMpKQotTElCX09CSlMgOj0gJChmaWx0ZXItb3V0ICQoT1VUUFVUKXV0aWwvcHJvYmUtZXZlbnQubywkKExJQl9PQkpTKSkKLUxJQl9PQkpTIDo9ICQoZmlsdGVyLW91dCAkKE9VVFBVVCl1dGlsL3Byb2JlLWZpbmRlci5vLCQoTElCX09CSlMpKQotCi1CVUlMVElOX09CSlMgOj0gJChmaWx0ZXItb3V0ICQoT1VUUFVUKWJ1aWx0aW4tcHJvYmUubywkKEJVSUxUSU5fT0JKUykpCi0KLSMgVXNlIG1pbmltYWwgc3ltYm9sIGhhbmRsaW5nCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3N5bWJvbC1taW5pbWFsLm8KLQotZWxzZSAjIE5PX0xJQkVMRgotaWZuZGVmIE5PX0RXQVJGCi0gIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvcHJvYmUtZmluZGVyLm8KLSAgTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC9kd2FyZi1hdXgubwotZW5kaWYgIyBOT19EV0FSRgotZW5kaWYgIyBOT19MSUJFTEYKLQotaWZuZGVmIE5PX0xJQkRXX0RXQVJGX1VOV0lORAotICBMSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3Vud2luZC1saWJkdy5vCi0gIExJQl9IICs9IHV0aWwvdW53aW5kLWxpYmR3LmgKLWVuZGlmCi0KLWlmbmRlZiBOT19MSUJVTldJTkQKLSAgTElCX09CSlMgKz0gJChPVVRQVVQpdXRpbC91bndpbmQtbGlidW53aW5kLm8KLWVuZGlmCi1MSUJfT0JKUyArPSAkKE9VVFBVVCl0ZXN0cy9rZWVwLXRyYWNraW5nLm8KLQotaWZuZGVmIE5PX0xJQkFVRElUCi0gIEJVSUxUSU5fT0JKUyArPSAkKE9VVFBVVClidWlsdGluLXRyYWNlLm8KLWVuZGlmCi0KLWlmbmRlZiBOT19TTEFORwotICBMSUJfT0JKUyArPSAkKE9VVFBVVCl1aS9icm93c2VyLm8KLSAgTElCX09CSlMgKz0gJChPVVRQVVQpdWkvYnJvd3NlcnMvYW5ub3RhdGUubwotICBMSUJfT0JKUyArPSAkKE9VVFBVVCl1aS9icm93c2Vycy9oaXN0cy5vCi0gIExJQl9PQkpTICs9ICQoT1VUUFVUKXVpL2Jyb3dzZXJzL21hcC5vCi0gIExJQl9PQkpTICs9ICQoT1VUUFVUKXVpL2Jyb3dzZXJzL3NjcmlwdHMubwotICBMSUJfT0JKUyArPSAkKE9VVFBVVCl1aS9icm93c2Vycy9oZWFkZXIubwotICBMSUJfT0JKUyArPSAkKE9VVFBVVCl1aS90dWkvc2V0dXAubwotICBMSUJfT0JKUyArPSAkKE9VVFBVVCl1aS90dWkvdXRpbC5vCi0gIExJQl9PQkpTICs9ICQoT1VUUFVUKXVpL3R1aS9oZWxwbGluZS5vCi0gIExJQl9PQkpTICs9ICQoT1VUUFVUKXVpL3R1aS9wcm9ncmVzcy5vCi0gIExJQl9IICs9IHVpL3R1aS90dWkuaAotICBMSUJfSCArPSB1aS9icm93c2VyLmgKLSAgTElCX0ggKz0gdWkvYnJvd3NlcnMvbWFwLmgKLSAgTElCX0ggKz0gdWkva2V5c3ltcy5oCi0gIExJQl9IICs9IHVpL2xpYnNsYW5nLmgKLWVuZGlmCi0KIGlmbmRlZiBOT19HVEsyCiAgIEFMTF9QUk9HUkFNUyArPSAkKE9VVFBVVClsaWJwZXJmLWd0ay5zbwotCi0gIEdUS19PQkpTICs9ICQoT1VUUFVUKXVpL2d0ay9icm93c2VyLm8KLSAgR1RLX09CSlMgKz0gJChPVVRQVVQpdWkvZ3RrL2hpc3RzLm8KLSAgR1RLX09CSlMgKz0gJChPVVRQVVQpdWkvZ3RrL3NldHVwLm8KLSAgR1RLX09CSlMgKz0gJChPVVRQVVQpdWkvZ3RrL3V0aWwubwotICBHVEtfT0JKUyArPSAkKE9VVFBVVCl1aS9ndGsvaGVscGxpbmUubwotICBHVEtfT0JKUyArPSAkKE9VVFBVVCl1aS9ndGsvcHJvZ3Jlc3MubwotICBHVEtfT0JKUyArPSAkKE9VVFBVVCl1aS9ndGsvYW5ub3RhdGUubworICBHVEtfSU4gOj0gJChPVVRQVVQpZ3RrLWluLm8KIAogaW5zdGFsbC1ndGs6ICQoT1VUUFVUKWxpYnBlcmYtZ3RrLnNvCiAJJChjYWxsIFFVSUVUX0lOU1RBTEwsICdHVEsgVUknKSBcCkBAIC01NzYsMzEgKzI0Niw2IEBACiAJCSQoSU5TVEFMTCkgJChPVVRQVVQpbGlicGVyZi1ndGsuc28gJyQoREVTVERJUl9TUSkkKGxpYmRpcl9TUSknCiBlbmRpZgogCi1pZm5kZWYgTk9fTElCUEVSTAotICBMSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXBlcmwubwotICBMSUJfT0JKUyArPSAkKE9VVFBVVClzY3JpcHRzL3BlcmwvUGVyZi1UcmFjZS1VdGlsL0NvbnRleHQubwotZW5kaWYKLQotaWZuZGVmIE5PX0xJQlBZVEhPTgotICBMSUJfT0JKUyArPSAkKE9VVFBVVCl1dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXB5dGhvbi5vCi0gIExJQl9PQkpTICs9ICQoT1VUUFVUKXNjcmlwdHMvcHl0aG9uL1BlcmYtVHJhY2UtVXRpbC9Db250ZXh0Lm8KLWVuZGlmCi0KLWlmZXEgKCQoTk9fUEVSRl9SRUdTKSwwKQotICBpZmVxICgkKEFSQ0gpLHg4NikKLSAgICBMSUJfSCArPSBhcmNoL3g4Ni9pbmNsdWRlL3BlcmZfcmVncy5oCi0gIGVuZGlmCi0gIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvcGVyZl9yZWdzLm8KLWVuZGlmCi0KLWlmbmRlZiBOT19MSUJOVU1BCi0gIEJVSUxUSU5fT0JKUyArPSAkKE9VVFBVVCliZW5jaC9udW1hLm8KLWVuZGlmCi0KLWlmbmRlZiBOT19aTElCCi0gIExJQl9PQkpTICs9ICQoT1VUUFVUKXV0aWwvemxpYi5vCi1lbmRpZgotCiBpZmRlZiBBU0NJSURPQzgKICAgZXhwb3J0IEFTQ0lJRE9DOAogZW5kaWYKQEAgLTYxNiw0MCArMjYxLDMwIEBACiBhbGw6IHNoZWxsX2NvbXBhdGliaWxpdHlfdGVzdCAkKEFMTF9QUk9HUkFNUykgJChMQU5HX0JJTkRJTkdTKSAkKE9USEVSX1BST0dSQU1TKQogCiBwbGVhc2Vfc2V0X1NIRUxMX1BBVEhfdG9fYV9tb3JlX21vZGVybl9zaGVsbDoKLQlAJCQoOikKKwkkKFEpJCQoOikKIAogc2hlbGxfY29tcGF0aWJpbGl0eV90ZXN0OiBwbGVhc2Vfc2V0X1NIRUxMX1BBVEhfdG9fYV9tb3JlX21vZGVybl9zaGVsbAogCiBzdHJpcDogJChQUk9HUkFNUykgJChPVVRQVVQpcGVyZgogCSQoU1RSSVApICQoU1RSSVBfT1BUUykgJChQUk9HUkFNUykgJChPVVRQVVQpcGVyZgogCi0kKE9VVFBVVClwZXJmLm86IHBlcmYuYyAkKE9VVFBVVCljb21tb24tY21kcy5oICQoT1VUUFVUKVBFUkYtQ0ZMQUdTCi0JJChRVUlFVF9DQykkKENDKSAtaW5jbHVkZSAkKE9VVFBVVClQRVJGLVZFUlNJT04tRklMRSBcCi0JCSctRFBFUkZfSFRNTF9QQVRIPSIkKGh0bWxkaXJfU1EpIicgXAotCQkkKENGTEFHUykgLWMgJChmaWx0ZXIgJS5jLCReKSAtbyAkQAorUEVSRl9JTiA6PSAkKE9VVFBVVClwZXJmLWluLm8KIAotJChPVVRQVVQpcGVyZjogJChPVVRQVVQpcGVyZi5vICQoQlVJTFRJTl9PQkpTKSAkKFBFUkZMSUJTKQotCSQoUVVJRVRfTElOSykkKENDKSAkKENGTEFHUykgJChMREZMQUdTKSAkKE9VVFBVVClwZXJmLm8gXAotICAgICAgICAgICAgICAgJChCVUlMVElOX09CSlMpICQoTElCUykgLW8gJEAKK2V4cG9ydCBzcmN0cmVlIE9VVFBVVCBSTSBDQyBMRCBBUiBDRkxBR1MgViBCSVNPTiBGTEVYCitidWlsZCA6PSAtZiAkKHNyY3RyZWUpL3Rvb2xzL2J1aWxkL01ha2VmaWxlLmJ1aWxkIGRpcj0uIG9iagogCi0kKEdUS19PQkpTKTogJChPVVRQVVQpJS5vOiAlLmMgJChMSUJfSCkKLQkkKFFVSUVUX0NDKSQoQ0MpIC1vICRAIC1jIC1mUElDICQoQ0ZMQUdTKSAkKEdUS19DRkxBR1MpICQ8CiskKFBFUkZfSU4pOiAkKE9VVFBVVClQRVJGLVZFUlNJT04tRklMRSAkKE9VVFBVVCljb21tb24tY21kcy5oIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9cGVyZgogCi0kKE9VVFBVVClsaWJwZXJmLWd0ay5zbzogJChHVEtfT0JKUykgJChQRVJGTElCUykKKyQoT1VUUFVUKXBlcmY6ICQoUEVSRkxJQlMpICQoUEVSRl9JTikKKwkkKFFVSUVUX0xJTkspJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgJChQRVJGX0lOKSAkKExJQlMpIC1vICRACisKKyQoR1RLX0lOKTogRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT1ndGsKKworJChPVVRQVVQpbGlicGVyZi1ndGsuc286ICQoR1RLX0lOKSAkKFBFUkZMSUJTKQogCSQoUVVJRVRfTElOSykkKENDKSAtbyAkQCAtc2hhcmVkICQoTERGTEFHUykgJChmaWx0ZXIgJS5vLCReKSAkKEdUS19MSUJTKQogCi0kKE9VVFBVVClidWlsdGluLWhlbHAubzogYnVpbHRpbi1oZWxwLmMgJChPVVRQVVQpY29tbW9uLWNtZHMuaCAkKE9VVFBVVClQRVJGLUNGTEFHUwotCSQoUVVJRVRfQ0MpJChDQykgLW8gJEAgLWMgJChDRkxBR1MpIFwKLQkJJy1EUEVSRl9IVE1MX1BBVEg9IiQoaHRtbGRpcl9TUSkiJyBcCi0JCSctRFBFUkZfTUFOX1BBVEg9IiQobWFuZGlyX1NRKSInIFwKLQkJJy1EUEVSRl9JTkZPX1BBVEg9IiQoaW5mb2Rpcl9TUSkiJyAkPAotCi0kKE9VVFBVVClidWlsdGluLXRpbWVjaGFydC5vOiBidWlsdGluLXRpbWVjaGFydC5jICQoT1VUUFVUKWNvbW1vbi1jbWRzLmggJChPVVRQVVQpUEVSRi1DRkxBR1MKLQkkKFFVSUVUX0NDKSQoQ0MpIC1vICRAIC1jICQoQ0ZMQUdTKSBcCi0JCSctRFBFUkZfSFRNTF9QQVRIPSIkKGh0bWxkaXJfU1EpIicgXAotCQknLURQRVJGX01BTl9QQVRIPSIkKG1hbmRpcl9TUSkiJyBcCi0JCSctRFBFUkZfSU5GT19QQVRIPSIkKGluZm9kaXJfU1EpIicgJDwKLQogJChPVVRQVVQpY29tbW9uLWNtZHMuaDogdXRpbC9nZW5lcmF0ZS1jbWRsaXN0LnNoIGNvbW1hbmQtbGlzdC50eHQKIAogJChPVVRQVVQpY29tbW9uLWNtZHMuaDogJCh3aWxkY2FyZCBEb2N1bWVudGF0aW9uL3BlcmYtKi50eHQpCkBAIC02NTksOCArMjk0LDcgQEAKIAkkKFFVSUVUX0dFTikkKElOU1RBTEwpICckQC5zaCcgJyQoT1VUUFVUKSRAJwogCiAjIFRoZXNlIGNhbiByZWNvcmQgUEVSRl9WRVJTSU9OCi0kKE9VVFBVVClwZXJmLm8gcGVyZi5zcGVjIFwKLQkkKFNDUklQVFMpIFwKK3BlcmYuc3BlYyAkKFNDUklQVFMpIFwKIAk6ICQoT1VUUFVUKVBFUkYtVkVSU0lPTi1GSUxFCiAKIC5TVUZGSVhFUzoKQEAgLTY4Myw5MCArMzE3LDMzIEBACiAjIFRoZXNlIHR3byBuZWVkIHRvIGJlIGhlcmUgc28gdGhhdCB3aGVuIE89IGlzIG5vdCB1c2VkIHRoZXkgdGFrZSBwcmVjZWRlbmNlCiAjIG92ZXIgdGhlIGdlbmVyYWwgcnVsZSBmb3IgLm8KIAotJChPVVRQVVQpdXRpbC8lLWZsZXgubzogJChPVVRQVVQpdXRpbC8lLWZsZXguYyAkKE9VVFBVVClQRVJGLUNGTEFHUwotCSQoUVVJRVRfQ0MpJChDQykgLW8gJEAgLWMgLUl1dGlsLyAkKENGTEFHUykgLXcgJDwKKyMgZ2V0IHJlbGF0aXZlIGJ1aWxkaW5nIGRpcmVjdG9yeSAodG8gJChPVVRQVVQpKQorIyBhbmQgJy4nIGlmIGl0J3MgJChPVVRQVVQpIGl0c2VsZgorX19idWlsZC1kaXIgPSAkKHN1YnN0ICQoT1VUUFVUKSwsJChkaXIgJEApKQorYnVpbGQtZGlyICAgPSAkKGlmICQoX19idWlsZC1kaXIpLCQoX19idWlsZC1kaXIpLC4pCiAKLSQoT1VUUFVUKXV0aWwvJS1iaXNvbi5vOiAkKE9VVFBVVCl1dGlsLyUtYmlzb24uYyAkKE9VVFBVVClQRVJGLUNGTEFHUwotCSQoUVVJRVRfQ0MpJChDQykgLW8gJEAgLWMgLUl1dGlsLyAkKENGTEFHUykgLURZWUVOQUJMRV9OTFM9MCAtRFlZTFRZUEVfSVNfVFJJVklBTD0wIC13ICQ8CitzaW5nbGVfZGVwOiAkKE9VVFBVVClQRVJGLVZFUlNJT04tRklMRSAkKE9VVFBVVCljb21tb24tY21kcy5oCiAKLSQoT1VUUFVUKSUubzogJS5jICQoT1VUUFVUKVBFUkYtQ0ZMQUdTCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtYyAkKENGTEFHUykgJDwKLSQoT1VUUFVUKSUuaTogJS5jICQoT1VUUFVUKVBFUkYtQ0ZMQUdTCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtRSAkKENGTEFHUykgJDwKLSQoT1VUUFVUKSUuczogJS5jICQoT1VUUFVUKVBFUkYtQ0ZMQUdTCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtUyAkKENGTEFHUykgJDwKLSQoT1VUUFVUKSUubzogJS5TCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtYyAkKENGTEFHUykgJDwKLSQoT1VUUFVUKSUuczogJS5TCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtRSAkKENGTEFHUykgJDwKKyQoT1VUUFVUKSUubzogJS5jIHNpbmdsZV9kZXAgRk9SQ0UKKwkkKFEpJChNQUtFKSAtZiAkKHNyY3RyZWUpL3Rvb2xzL2J1aWxkL01ha2VmaWxlLmJ1aWxkIGRpcj0kKGJ1aWxkLWRpcikgJEAKIAotJChPVVRQVVQpdXRpbC9leGVjX2NtZC5vOiB1dGlsL2V4ZWNfY21kLmMgJChPVVRQVVQpUEVSRi1DRkxBR1MKLQkkKFFVSUVUX0NDKSQoQ0MpIC1vICRAIC1jICQoQ0ZMQUdTKSBcCi0JCSctRFBFUkZfRVhFQ19QQVRIPSIkKHBlcmZleGVjZGlyX1NRKSInIFwKLQkJJy1EUFJFRklYPSIkKHByZWZpeF9TUSkiJyBcCi0JCSQ8CiskKE9VVFBVVCklLmk6ICUuYyBzaW5nbGVfZGVwIEZPUkNFCisJJChRKSQoTUFLRSkgLWYgJChzcmN0cmVlKS90b29scy9idWlsZC9NYWtlZmlsZS5idWlsZCBkaXI9JChidWlsZC1kaXIpICRACiAKLSQoT1VUUFVUKXRlc3RzL2F0dHIubzogdGVzdHMvYXR0ci5jICQoT1VUUFVUKVBFUkYtQ0ZMQUdTCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtYyAkKENGTEFHUykgXAotCQknLURCSU5ESVI9IiQoYmluZGlyX1NRKSInIC1EUFlUSE9OPSciJChQWVRIT05fV09SRCkiJyBcCi0JCSQ8CiskKE9VVFBVVCklLnM6ICUuYyBzaW5nbGVfZGVwIEZPUkNFCisJJChRKSQoTUFLRSkgLWYgJChzcmN0cmVlKS90b29scy9idWlsZC9NYWtlZmlsZS5idWlsZCBkaXI9JChidWlsZC1kaXIpICRACiAKLSQoT1VUUFVUKXRlc3RzL3B5dGhvbi11c2UubzogdGVzdHMvcHl0aG9uLXVzZS5jICQoT1VUUFVUKVBFUkYtQ0ZMQUdTCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtYyAkKENGTEFHUykgXAotCQktRFBZVEhPTlBBVEg9JyIkKE9VVFBVVClweXRob24iJyBcCi0JCS1EUFlUSE9OPSciJChQWVRIT05fV09SRCkiJyBcCi0JCSQ8CiskKE9VVFBVVCklLWJpc29uLm86ICUuYyBzaW5nbGVfZGVwIEZPUkNFCisJJChRKSQoTUFLRSkgLWYgJChzcmN0cmVlKS90b29scy9idWlsZC9NYWtlZmlsZS5idWlsZCBkaXI9JChidWlsZC1kaXIpICRACiAKLSQoT1VUUFVUKXRlc3RzL2R3YXJmLXVud2luZC5vOiB0ZXN0cy9kd2FyZi11bndpbmQuYwotCSQoUVVJRVRfQ0MpJChDQykgLW8gJEAgLWMgJChDRkxBR1MpIC1mbm8tb3B0aW1pemUtc2libGluZy1jYWxscyAkPAorJChPVVRQVVQpJS1mbGV4Lm86ICUuYyBzaW5nbGVfZGVwIEZPUkNFCisJJChRKSQoTUFLRSkgLWYgJChzcmN0cmVlKS90b29scy9idWlsZC9NYWtlZmlsZS5idWlsZCBkaXI9JChidWlsZC1kaXIpICRACiAKLSQoT1VUUFVUKXV0aWwvY29uZmlnLm86IHV0aWwvY29uZmlnLmMgJChPVVRQVVQpUEVSRi1DRkxBR1MKLQkkKFFVSUVUX0NDKSQoQ0MpIC1vICRAIC1jICQoQ0ZMQUdTKSAtREVUQ19QRVJGQ09ORklHPSciJChFVENfUEVSRkNPTkZJR19TUSkiJyAkPAorJChPVVRQVVQpJS5vOiAlLlMgc2luZ2xlX2RlcCBGT1JDRQorCSQoUSkkKE1BS0UpIC1mICQoc3JjdHJlZSkvdG9vbHMvYnVpbGQvTWFrZWZpbGUuYnVpbGQgZGlyPSQoYnVpbGQtZGlyKSAkQAogCi0kKE9VVFBVVCl1aS9zZXR1cC5vOiB1aS9zZXR1cC5jICQoT1VUUFVUKVBFUkYtQ0ZMQUdTCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtYyAkKENGTEFHUykgLURMSUJESVI9JyIkKGxpYmRpcl9TUSkiJyAkPAotCi0kKE9VVFBVVCl1aS9icm93c2VyLm86IHVpL2Jyb3dzZXIuYyAkKE9VVFBVVClQRVJGLUNGTEFHUwotCSQoUVVJRVRfQ0MpJChDQykgLW8gJEAgLWMgJChDRkxBR1MpIC1ERU5BQkxFX1NMRlVUVVJFX0NPTlNUICQ8Ci0KLSQoT1VUUFVUKXVpL2Jyb3dzZXJzL2Fubm90YXRlLm86IHVpL2Jyb3dzZXJzL2Fubm90YXRlLmMgJChPVVRQVVQpUEVSRi1DRkxBR1MKLQkkKFFVSUVUX0NDKSQoQ0MpIC1vICRAIC1jICQoQ0ZMQUdTKSAtREVOQUJMRV9TTEZVVFVSRV9DT05TVCAkPAotCi0kKE9VVFBVVCl1aS9icm93c2Vycy9oaXN0cy5vOiB1aS9icm93c2Vycy9oaXN0cy5jICQoT1VUUFVUKVBFUkYtQ0ZMQUdTCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtYyAkKENGTEFHUykgLURFTkFCTEVfU0xGVVRVUkVfQ09OU1QgJDwKLQotJChPVVRQVVQpdWkvYnJvd3NlcnMvbWFwLm86IHVpL2Jyb3dzZXJzL21hcC5jICQoT1VUUFVUKVBFUkYtQ0ZMQUdTCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtYyAkKENGTEFHUykgLURFTkFCTEVfU0xGVVRVUkVfQ09OU1QgJDwKLQotJChPVVRQVVQpdWkvYnJvd3NlcnMvc2NyaXB0cy5vOiB1aS9icm93c2Vycy9zY3JpcHRzLmMgJChPVVRQVVQpUEVSRi1DRkxBR1MKLQkkKFFVSUVUX0NDKSQoQ0MpIC1vICRAIC1jICQoQ0ZMQUdTKSAtREVOQUJMRV9TTEZVVFVSRV9DT05TVCAkPAotCi0kKE9VVFBVVCl1dGlsL2thbGxzeW1zLm86IC4uL2xpYi9zeW1ib2wva2FsbHN5bXMuYyAkKE9VVFBVVClQRVJGLUNGTEFHUwotCSQoUVVJRVRfQ0MpJChDQykgLW8gJEAgLWMgJChDRkxBR1MpICQ8Ci0KLSQoT1VUUFVUKXV0aWwvcmJ0cmVlLm86IC4uLy4uL2xpYi9yYnRyZWUuYyAkKE9VVFBVVClQRVJGLUNGTEFHUwotCSQoUVVJRVRfQ0MpJChDQykgLW8gJEAgLWMgJChDRkxBR1MpIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtREVUQ19QRVJGQ09ORklHPSciJChFVENfUEVSRkNPTkZJR19TUSkiJyAkPAotCi0kKE9VVFBVVCl1dGlsL2h3ZWlnaHQubzogLi4vLi4vbGliL2h3ZWlnaHQuYyAkKE9VVFBVVClQRVJGLUNGTEFHUwotCSQoUVVJRVRfQ0MpJChDQykgLW8gJEAgLWMgJChDRkxBR1MpIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtREVUQ19QRVJGQ09ORklHPSciJChFVENfUEVSRkNPTkZJR19TUSkiJyAkPAotCi0kKE9VVFBVVCl1dGlsL2ZpbmRfbmV4dF9iaXQubzogLi4vbGliL3V0aWwvZmluZF9uZXh0X2JpdC5jICQoT1VUUFVUKVBFUkYtQ0ZMQUdTCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtYyAkKENGTEFHUykgLVduby11bnVzZWQtcGFyYW1ldGVyIC1ERVRDX1BFUkZDT05GSUc9JyIkKEVUQ19QRVJGQ09ORklHX1NRKSInICQ8Ci0KLSQoT1VUUFVUKXV0aWwvcGFyc2UtZXZlbnRzLm86IHV0aWwvcGFyc2UtZXZlbnRzLmMgJChPVVRQVVQpUEVSRi1DRkxBR1MKLQkkKFFVSUVUX0NDKSQoQ0MpIC1vICRAIC1jICQoQ0ZMQUdTKSAtV25vLXJlZHVuZGFudC1kZWNscyAkPAotCi0kKE9VVFBVVCl1dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXBlcmwubzogdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1wZXJsLmMgJChPVVRQVVQpUEVSRi1DRkxBR1MKLQkkKFFVSUVUX0NDKSQoQ0MpIC1vICRAIC1jICQoQ0ZMQUdTKSAkKFBFUkxfRU1CRURfQ0NPUFRTKSAtV25vLXJlZHVuZGFudC1kZWNscyAtV25vLXN0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXNoYWRvdyAtV25vLXVuZGVmIC1Xbm8tc3dpdGNoLWRlZmF1bHQgJDwKLQotJChPVVRQVVQpc2NyaXB0cy9wZXJsL1BlcmYtVHJhY2UtVXRpbC9Db250ZXh0Lm86IHNjcmlwdHMvcGVybC9QZXJmLVRyYWNlLVV0aWwvQ29udGV4dC5jICQoT1VUUFVUKVBFUkYtQ0ZMQUdTCi0JJChRVUlFVF9DQykkKENDKSAtbyAkQCAtYyAkKENGTEFHUykgJChQRVJMX0VNQkVEX0NDT1BUUykgLVduby1yZWR1bmRhbnQtZGVjbHMgLVduby1zdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1uZXN0ZWQtZXh0ZXJucyAtV25vLXVuZGVmIC1Xbm8tc3dpdGNoLWRlZmF1bHQgJDwKLQotJChPVVRQVVQpdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1weXRob24ubzogdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1weXRob24uYyAkKE9VVFBVVClQRVJGLUNGTEFHUwotCSQoUVVJRVRfQ0MpJChDQykgLW8gJEAgLWMgJChDRkxBR1MpICQoUFlUSE9OX0VNQkVEX0NDT1BUUykgLVduby1yZWR1bmRhbnQtZGVjbHMgLVduby1zdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1zaGFkb3cgJDwKLQotJChPVVRQVVQpc2NyaXB0cy9weXRob24vUGVyZi1UcmFjZS1VdGlsL0NvbnRleHQubzogc2NyaXB0cy9weXRob24vUGVyZi1UcmFjZS1VdGlsL0NvbnRleHQuYyAkKE9VVFBVVClQRVJGLUNGTEFHUwotCSQoUVVJRVRfQ0MpJChDQykgLW8gJEAgLWMgJChDRkxBR1MpICQoUFlUSE9OX0VNQkVEX0NDT1BUUykgLVduby1yZWR1bmRhbnQtZGVjbHMgLVduby1zdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1uZXN0ZWQtZXh0ZXJucyAkPAorJChPVVRQVVQpJS5pOiAlLlMgc2luZ2xlX2RlcCBGT1JDRQorCSQoUSkkKE1BS0UpIC1mICQoc3JjdHJlZSkvdG9vbHMvYnVpbGQvTWFrZWZpbGUuYnVpbGQgZGlyPSQoYnVpbGQtZGlyKSAkQAogCiAkKE9VVFBVVClwZXJmLSU6ICUubyAkKFBFUkZMSUJTKQogCSQoUVVJRVRfTElOSykkKENDKSAkKENGTEFHUykgLW8gJEAgJChMREZMQUdTKSAkKGZpbHRlciAlLm8sJF4pICQoTElCUykKQEAgLTc4MSw1OCArMzU4LDM0IEBACiAJJChRVUlFVF9DQykkKENDKSAtbXgzMiAkKGZpbHRlciAtc3RhdGljLCQoTERGTEFHUykpIC1XYWxsIC1XZXJyb3IgLW8gJEAgcGVyZi1yZWFkLXZkc28uYwogZW5kaWYKIAotJChMSUJfT0JKUykgJChCVUlMVElOX09CSlMpOiAkKExJQl9IKQotJChwYXRzdWJzdCBwZXJmLSUsJS5vLCQoUFJPR1JBTVMpKTogJChMSUJfSCkgJCh3aWxkY2FyZCAqLyouaCkKKyQocGF0c3Vic3QgcGVyZi0lLCUubywkKFBST0dSQU1TKSk6ICQod2lsZGNhcmQgKi8qLmgpCiAKLSMgd2UgY29tcGlsZSBpbnRvIHN1YmRpcmVjdG9yaWVzLiBpZiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSBpcyBub3QgdGhlIHNvdXJjZSBkaXJlY3RvcnksIHRoZXkgbWlnaHQgbm90IGV4aXN0cy4gU28KLSMgd2UgZGVwZW5kIHRoZSB2YXJpb3VzIGZpbGVzIG9udG8gdGhlaXIgZGlyZWN0b3JpZXMuCi1ESVJFQ1RPUllfREVQUyA9ICQoTElCX09CSlMpICQoQlVJTFRJTl9PQkpTKSAkKEdUS19PQkpTKQotRElSRUNUT1JZX0RFUFMgKz0gJChPVVRQVVQpUEVSRi1WRVJTSU9OLUZJTEUgJChPVVRQVVQpY29tbW9uLWNtZHMuaAotIyBubyBuZWVkIHRvIGFkZCBmbGV4IG9iamVjdHMsIGJlY2F1c2UgdGhleSBkZXBlbmQgb24gYmlzb24gb25lcwotRElSRUNUT1JZX0RFUFMgKz0gJChPVVRQVVQpdXRpbC9wYXJzZS1ldmVudHMtYmlzb24uYwotRElSRUNUT1JZX0RFUFMgKz0gJChPVVRQVVQpdXRpbC9wbXUtYmlzb24uYworTElCUEVSRl9JTiA6PSAkKE9VVFBVVClsaWJwZXJmLWluLm8KIAotT1VUUFVUX0RJUkVDVE9SSUVTIDo9ICQoc29ydCAkKGRpciAkKERJUkVDVE9SWV9ERVBTKSkpCiskKExJQlBFUkZfSU4pOiBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPWxpYnBlcmYKIAotJChESVJFQ1RPUllfREVQUyk6IHwgJChPVVRQVVRfRElSRUNUT1JJRVMpCi0jIEluIHRoZSBzZWNvbmQgc3RlcCwgd2UgbWFrZSBhIHJ1bGUgdG8gYWN0dWFsbHkgY3JlYXRlIHRoZXNlIGRpcmVjdG9yaWVzCi0kKE9VVFBVVF9ESVJFQ1RPUklFUyk6Ci0JJChRVUlFVF9NS0RJUikkKE1LRElSKSAtcCAkQCAyPi9kZXYvbnVsbAorJChMSUJfRklMRSk6ICQoTElCUEVSRl9JTikKKwkkKFFVSUVUX0FSKSQoUk0pICRAICYmICQoQVIpIHJjcyAkQCAkKExJQlBFUkZfSU4pICQoTElCX09CSlMpCiAKLSQoTElCX0ZJTEUpOiAkKExJQl9PQkpTKQotCSQoUVVJRVRfQVIpJChSTSkgJEAgJiYgJChBUikgcmNzICRAICQoTElCX09CSlMpCi0KLSMgbGlidHJhY2VldmVudC5hCi1URV9TT1VSQ0VTID0gJCh3aWxkY2FyZCAkKFRSQUNFX0VWRU5UX0RJUikqLltjaF0pCi0KLUxJQlRSQUNFRVZFTlRfRkxBR1MgID0gJChRVUlFVF9TVUJESVIxKSBPPSQoT1VUUFVUKQotTElCVFJBQ0VFVkVOVF9GTEFHUyArPSBDRkxBR1M9Ii1nIC1XYWxsICQoRVhUUkFfQ0ZMQUdTKSIKIExJQlRSQUNFRVZFTlRfRkxBR1MgKz0gcGx1Z2luX2Rpcj0kKHBsdWdpbmRpcl9TUSkKIAotJChMSUJUUkFDRUVWRU5UKTogJChURV9TT1VSQ0VTKSAkKE9VVFBVVClQRVJGLUNGTEFHUwotCSQoUVVJRVRfU1VCRElSMCkkKFRSQUNFX0VWRU5UX0RJUikgJChMSUJUUkFDRUVWRU5UX0ZMQUdTKSBsaWJ0cmFjZWV2ZW50LmEgcGx1Z2lucworJChMSUJUUkFDRUVWRU5UKTogRk9SQ0UKKwkkKFEpJChNQUtFKSAtQyAkKFRSQUNFX0VWRU5UX0RJUikgJChMSUJUUkFDRUVWRU5UX0ZMQUdTKSBPPSQoT1VUUFVUKSAkKE9VVFBVVClsaWJ0cmFjZWV2ZW50LmEgcGx1Z2lucwogCiAkKExJQlRSQUNFRVZFTlQpLWNsZWFuOgogCSQoY2FsbCBRVUlFVF9DTEVBTiwgbGlidHJhY2VldmVudCkKLQlAJChNQUtFKSAtQyAkKFRSQUNFX0VWRU5UX0RJUikgTz0kKE9VVFBVVCkgY2xlYW4gPi9kZXYvbnVsbAorCSQoUSkkKE1BS0UpIC1DICQoVFJBQ0VfRVZFTlRfRElSKSBPPSQoT1VUUFVUKSBjbGVhbiA+L2Rldi9udWxsCiAKIGluc3RhbGwtdHJhY2VldmVudC1wbHVnaW5zOiAkKExJQlRSQUNFRVZFTlQpCi0JJChRVUlFVF9TVUJESVIwKSQoVFJBQ0VfRVZFTlRfRElSKSAkKExJQlRSQUNFRVZFTlRfRkxBR1MpIGluc3RhbGxfcGx1Z2lucworCSQoUSkkKE1BS0UpIC1DICQoVFJBQ0VfRVZFTlRfRElSKSAkKExJQlRSQUNFRVZFTlRfRkxBR1MpIE89JChPVVRQVVQpIGluc3RhbGxfcGx1Z2lucwogCi1MSUJBUElLRlNfU09VUkNFUyA9ICQod2lsZGNhcmQgJChMSUJfUEFUSClmcy8qLltjaF0gJChMSUJfUEFUSClmZC8qLltjaF0pCiskKExJQkFQSSk6IEZPUkNFCisJJChRKSQoTUFLRSkgLUMgJChMSUJfRElSKSBPPSQoT1VUUFVUKSAkKE9VVFBVVClsaWJhcGkuYQogCi0jIGlmIHN1YmRpciBpcyBzZXQsIHdlJ3ZlIGJlZW4gY2FsbGVkIGZyb20gYWJvdmUgc28gdGFyZ2V0IGhhcyBiZWVuIGJ1aWx0Ci0jIGFscmVhZHkKLSQoTElCQVBJS0ZTKTogJChMSUJBUElLRlNfU09VUkNFUykKLWlmZXEgKCQoc3ViZGlyKSwpCi0JJChRVUlFVF9TVUJESVIwKSQoTElCX0RJUikgJChRVUlFVF9TVUJESVIxKSBPPSQoT1VUUFVUKSBsaWJhcGlrZnMuYQotZW5kaWYKLQotJChMSUJBUElLRlMpLWNsZWFuOgotaWZlcSAoJChzdWJkaXIpLCkKLQkkKGNhbGwgUVVJRVRfQ0xFQU4sIGxpYmFwaWtmcykKLQlAJChNQUtFKSAtQyAkKExJQl9ESVIpIE89JChPVVRQVVQpIGNsZWFuID4vZGV2L251bGwKLWVuZGlmCiskKExJQkFQSSktY2xlYW46CisJJChjYWxsIFFVSUVUX0NMRUFOLCBsaWJhcGkpCisJJChRKSQoTUFLRSkgLUMgJChMSUJfRElSKSBPPSQoT1VUUFVUKSBjbGVhbiA+L2Rldi9udWxsCiAKIGhlbHA6CiAJQGVjaG8gJ1BlcmYgbWFrZSB0YXJnZXRzOicKQEAgLTg4OCwxNyArNDQxLDYgQEAKIAkkKFFVSUVUX0dFTikkKFJNKSBjc2NvcGUqOyBcCiAJJChGSU5EKSAkKFRBR19GT0xERVJTKSAtbmFtZSAnKi5baGNTXScgLXByaW50IHwgeGFyZ3MgY3Njb3BlIC1iICQoVEFHX0ZJTEVTKQogCi0jIyMgRGV0ZWN0IHByZWZpeCBjaGFuZ2VzCi1UUkFDS19DRkxBR1MgPSAkKHN1YnN0ICcsJ1wnJywkKENGTEFHUykpOlwKLSAgICAgICAgICAgICAkKGJpbmRpcl9TUSk6JChwZXJmZXhlY2Rpcl9TUSk6JCh0ZW1wbGF0ZV9kaXJfU1EpOiQocHJlZml4X1NRKTokKHBsdWdpbmRpcl9TUSkKLQotJChPVVRQVVQpUEVSRi1DRkxBR1M6IC5GT1JDRS1QRVJGLUNGTEFHUwotCUBGTEFHUz0nJChUUkFDS19DRkxBR1MpJzsgXAotCSAgICBpZiB0ZXN0IHgiJCRGTEFHUyIgIT0geCJgY2F0ICQoT1VUUFVUKVBFUkYtQ0ZMQUdTIDI+L2Rldi9udWxsYCIgOyB0aGVuIFwKLQkJZWNobyAxPiYyICIgIEZMQUdTOiAgICogbmV3IGJ1aWxkIGZsYWdzIG9yIHByZWZpeCI7IFwKLQkJZWNobyAiJCRGTEFHUyIgPiQoT1VUUFVUKVBFUkYtQ0ZMQUdTOyBcCi0gICAgICAgICAgICBmaQotCiAjIyMgVGVzdGluZyBydWxlcwogCiAjIEdOVSBtYWtlIHN1cHBvcnRzIGV4cG9ydGluZyBhbGwgdmFyaWFibGVzIGJ5ICJleHBvcnQiIHdpdGhvdXQgcGFyYW1ldGVycy4KQEAgLTk4MSwxMiArNTIzLDE0IEBACiAjCiBjb25maWctY2xlYW46CiAJJChjYWxsIFFVSUVUX0NMRUFOLCBjb25maWcpCi0JQCQoTUFLRSkgLUMgY29uZmlnL2ZlYXR1cmUtY2hlY2tzIGNsZWFuID4vZGV2L251bGwKKwkkKFEpJChNQUtFKSAtQyAkKHNyY3RyZWUpL3Rvb2xzL2J1aWxkL2ZlYXR1cmUvIGNsZWFuID4vZGV2L251bGwKIAotY2xlYW46ICQoTElCVFJBQ0VFVkVOVCktY2xlYW4gJChMSUJBUElLRlMpLWNsZWFuIGNvbmZpZy1jbGVhbgotCSQoY2FsbCBRVUlFVF9DTEVBTiwgY29yZS1vYmpzKSAgJChSTSkgJChMSUJfT0JKUykgJChCVUlMVElOX09CSlMpICQoTElCX0ZJTEUpICQoT1VUUFVUKXBlcmYtYXJjaGl2ZSAkKE9VVFBVVClwZXJmLXdpdGgta2NvcmUgJChPVVRQVVQpcGVyZi5vICQoTEFOR19CSU5ESU5HUykgJChHVEtfT0JKUykKK2NsZWFuOiAkKExJQlRSQUNFRVZFTlQpLWNsZWFuICQoTElCQVBJKS1jbGVhbiBjb25maWctY2xlYW4KKwkkKGNhbGwgUVVJRVRfQ0xFQU4sIGNvcmUtb2JqcykgICQoUk0pICQoTElCX0ZJTEUpICQoT1VUUFVUKXBlcmYtYXJjaGl2ZSAkKE9VVFBVVClwZXJmLXdpdGgta2NvcmUgJChMQU5HX0JJTkRJTkdTKQorCSQoUSlmaW5kIC4gLW5hbWUgJyoubycgLWRlbGV0ZSAtbyAtbmFtZSAnXC4qLmNtZCcgLWRlbGV0ZSAtbyAtbmFtZSAnXC4qLmQnIC1kZWxldGUKKwkkKFEpJChSTSkgLmNvbmZpZy1kZXRlY3RlZAogCSQoY2FsbCBRVUlFVF9DTEVBTiwgY29yZS1wcm9ncykgJChSTSkgJChBTExfUFJPR1JBTVMpIHBlcmYgcGVyZi1yZWFkLXZkc28zMiBwZXJmLXJlYWQtdmRzb3gzMgotCSQoY2FsbCBRVUlFVF9DTEVBTiwgY29yZS1nZW4pICAgJChSTSkgICouc3BlYyAqLnB5YyAqLnB5byAqLyoucHljICovKi5weW8gJChPVVRQVVQpY29tbW9uLWNtZHMuaCBUQUdTIHRhZ3MgY3Njb3BlKiAkKE9VVFBVVClQRVJGLVZFUlNJT04tRklMRSAkKE9VVFBVVClQRVJGLUNGTEFHUyAkKE9VVFBVVClQRVJGLUZFQVRVUkVTICQoT1VUUFVUKXV0aWwvKi1iaXNvbiogJChPVVRQVVQpdXRpbC8qLWZsZXgqCisJJChjYWxsIFFVSUVUX0NMRUFOLCBjb3JlLWdlbikgICAkKFJNKSAgKi5zcGVjICoucHljICoucHlvICovKi5weWMgKi8qLnB5byAkKE9VVFBVVCljb21tb24tY21kcy5oIFRBR1MgdGFncyBjc2NvcGUqICQoT1VUUFVUKVBFUkYtVkVSU0lPTi1GSUxFICQoT1VUUFVUKUZFQVRVUkUtRFVNUCAkKE9VVFBVVCl1dGlsLyotYmlzb24qICQoT1VUUFVUKXV0aWwvKi1mbGV4KgogCSQoUVVJRVRfU1VCRElSMClEb2N1bWVudGF0aW9uICQoUVVJRVRfU1VCRElSMSkgY2xlYW4KIAkkKHB5dGhvbi1jbGVhbikKIApAQCAtMTAwMCw3ICs1NDQsOSBAQAogICAgIEdJVC1IRUFELVBIT05ZID0KIGVuZGlmCiAKK0ZPUkNFOgorCiAuUEhPTlk6IGFsbCBpbnN0YWxsIGNsZWFuIGNvbmZpZy1jbGVhbiBzdHJpcCBpbnN0YWxsLWd0awogLlBIT05ZOiBzaGVsbF9jb21wYXRpYmlsaXR5X3Rlc3QgcGxlYXNlX3NldF9TSEVMTF9QQVRIX3RvX2FfbW9yZV9tb2Rlcm5fc2hlbGwKLS5QSE9OWTogJChHSVQtSEVBRC1QSE9OWSkgVEFHUyB0YWdzIGNzY29wZSAuRk9SQ0UtUEVSRi1DRkxBR1MKKy5QSE9OWTogJChHSVQtSEVBRC1QSE9OWSkgVEFHUyB0YWdzIGNzY29wZSBGT1JDRSBzaW5nbGVfZGVwCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9CdWlsZCBiL3Rvb2xzL3BlcmYvYXJjaC9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDllYjc1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL0J1aWxkCkBAIC0wLDAgKzEsMiBAQAorbGlicGVyZi15ICs9IGNvbW1vbi5vCitsaWJwZXJmLXkgKz0gJChBUkNIKS8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9hcm0vQnVpbGQgYi90b29scy9wZXJmL2FyY2gvYXJtL0J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYmY2MWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvYXJtL0J1aWxkCkBAIC0wLDAgKzEsMiBAQAorbGlicGVyZi15ICs9IHV0aWwvCitsaWJwZXJmLSQoQ09ORklHX0RXQVJGX1VOV0lORCkgKz0gdGVzdHMvCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9hcmNoL2FybS9NYWtlZmlsZQppbmRleCAwOWQ2MjE1Li43ZmJjYTE3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vTWFrZWZpbGUKQEAgLTEsMTQgKzEsMyBAQAogaWZuZGVmIE5PX0RXQVJGCiBQRVJGX0hBVkVfRFdBUkZfUkVHUyA6PSAxCi1MSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC9kd2FyZi1yZWdzLm8KLWVuZGlmCi1pZm5kZWYgTk9fTElCVU5XSU5ECi1MSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC91bndpbmQtbGlidW53aW5kLm8KLWVuZGlmCi1pZm5kZWYgTk9fTElCRFdfRFdBUkZfVU5XSU5ECi1MSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC91bndpbmQtbGliZHcubwotZW5kaWYKLWlmbmRlZiBOT19EV0FSRl9VTldJTkQKLUxJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS90ZXN0cy9yZWdzX2xvYWQubwotTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC8kKEFSQ0gpL3Rlc3RzL2R3YXJmLXVud2luZC5vCiBlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL2FybS90ZXN0cy9CdWlsZCBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdGVzdHMvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwZWZmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9hcm0vdGVzdHMvQnVpbGQKQEAgLTAsMCArMSwyIEBACitsaWJwZXJmLXkgKz0gcmVnc19sb2FkLm8KK2xpYnBlcmYteSArPSBkd2FyZi11bndpbmQubwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL0J1aWxkIGIvdG9vbHMvcGVyZi9hcmNoL2FybS91dGlsL0J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMmUzZDAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvYXJtL3V0aWwvQnVpbGQKQEAgLTAsMCArMSw0IEBACitsaWJwZXJmLSQoQ09ORklHX0RXQVJGKSArPSBkd2FyZi1yZWdzLm8KKworbGlicGVyZi0kKENPTkZJR19MSUJVTldJTkQpICAgICAgICAgICs9IHVud2luZC1saWJ1bndpbmQubworbGlicGVyZi0kKENPTkZJR19MSUJEV19EV0FSRl9VTldJTkQpICs9IHVud2luZC1saWJkdy5vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtNjQvQnVpbGQgYi90b29scy9wZXJmL2FyY2gvYXJtNjQvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhZmU0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9hcm02NC9CdWlsZApAQCAtMCwwICsxIEBACitsaWJwZXJmLXkgKz0gdXRpbC8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9hcm02NC9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvYXJjaC9hcm02NC9NYWtlZmlsZQppbmRleCA2N2U5YjNkLi43ZmJjYTE3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2FyY2gvYXJtNjQvTWFrZWZpbGUKKysrIGIvdG9vbHMvcGVyZi9hcmNoL2FybTY0L01ha2VmaWxlCkBAIC0xLDcgKzEsMyBAQAogaWZuZGVmIE5PX0RXQVJGCiBQRVJGX0hBVkVfRFdBUkZfUkVHUyA6PSAxCi1MSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC9kd2FyZi1yZWdzLm8KLWVuZGlmCi1pZm5kZWYgTk9fTElCVU5XSU5ECi1MSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC91bndpbmQtbGlidW53aW5kLm8KIGVuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvYXJtNjQvdXRpbC9CdWlsZCBiL3Rvb2xzL3BlcmYvYXJjaC9hcm02NC91dGlsL0J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ODEyM2E4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL2FybTY0L3V0aWwvQnVpbGQKQEAgLTAsMCArMSwyIEBACitsaWJwZXJmLSQoQ09ORklHX0RXQVJGKSAgICAgKz0gZHdhcmYtcmVncy5vCitsaWJwZXJmLSQoQ09ORklHX0xJQlVOV0lORCkgKz0gdW53aW5kLWxpYnVud2luZC5vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9CdWlsZCBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL0J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YWZlNGEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy9CdWlsZApAQCAtMCwwICsxIEBACitsaWJwZXJmLXkgKz0gdXRpbC8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggNmY3NzgyYi4uN2ZiY2ExNyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKQEAgLTEsNiArMSwzIEBACiBpZm5kZWYgTk9fRFdBUkYKIFBFUkZfSEFWRV9EV0FSRl9SRUdTIDo9IDEKLUxJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL2R3YXJmLXJlZ3MubwotTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC8kKEFSQ0gpL3V0aWwvc2tpcC1jYWxsY2hhaW4taWR4Lm8KIGVuZGlmCi1MSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC9oZWFkZXIubwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdXRpbC9CdWlsZCBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3V0aWwvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFmNmU5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9wb3dlcnBjL3V0aWwvQnVpbGQKQEAgLTAsMCArMSw0IEBACitsaWJwZXJmLXkgKz0gaGVhZGVyLm8KKworbGlicGVyZi0kKENPTkZJR19EV0FSRikgKz0gZHdhcmYtcmVncy5vCitsaWJwZXJmLSQoQ09ORklHX0RXQVJGKSArPSBza2lwLWNhbGxjaGFpbi1pZHgubwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3MzOTAvQnVpbGQgYi90b29scy9wZXJmL2FyY2gvczM5MC9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFmZTRhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3MzOTAvQnVpbGQKQEAgLTAsMCArMSBAQAorbGlicGVyZi15ICs9IHV0aWwvCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvczM5MC9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvYXJjaC9zMzkwL01ha2VmaWxlCmluZGV4IDc5OGFjNzMuLjIxMzIyZTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYXJjaC9zMzkwL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9zMzkwL01ha2VmaWxlCkBAIC0xLDcgKzEsNCBAQAogaWZuZGVmIE5PX0RXQVJGCiBQRVJGX0hBVkVfRFdBUkZfUkVHUyA6PSAxCi1MSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC9kd2FyZi1yZWdzLm8KIGVuZGlmCi1MSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC9oZWFkZXIubwogSEFWRV9LVk1fU1RBVF9TVVBQT1JUIDo9IDEKLUxJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL2t2bS1zdGF0Lm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9zMzkwL3V0aWwvQnVpbGQgYi90b29scy9wZXJmL2FyY2gvczM5MC91dGlsL0J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjEzNzIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvczM5MC91dGlsL0J1aWxkCkBAIC0wLDAgKzEsNCBAQAorbGlicGVyZi15ICs9IGhlYWRlci5vCitsaWJwZXJmLXkgKz0ga3ZtLXN0YXQubworCitsaWJwZXJmLSQoQ09ORklHX0RXQVJGKSArPSBkd2FyZi1yZWdzLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9zaC9CdWlsZCBiL3Rvb2xzL3BlcmYvYXJjaC9zaC9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFmZTRhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3NoL0J1aWxkCkBAIC0wLDAgKzEgQEAKK2xpYnBlcmYteSArPSB1dGlsLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3NoL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9hcmNoL3NoL01ha2VmaWxlCmluZGV4IDE1MTMwYjUuLjdmYmNhMTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYXJjaC9zaC9NYWtlZmlsZQorKysgYi90b29scy9wZXJmL2FyY2gvc2gvTWFrZWZpbGUKQEAgLTEsNCArMSwzIEBACiBpZm5kZWYgTk9fRFdBUkYKIFBFUkZfSEFWRV9EV0FSRl9SRUdTIDo9IDEKLUxJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL2R3YXJmLXJlZ3MubwogZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYXJjaC9zaC91dGlsL0J1aWxkIGIvdG9vbHMvcGVyZi9hcmNoL3NoL3V0aWwvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0ZTI4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9zaC91dGlsL0J1aWxkCkBAIC0wLDAgKzEgQEAKK2xpYnBlcmYtJChDT05GSUdfRFdBUkYpICs9IGR3YXJmLXJlZ3MubwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3NwYXJjL0J1aWxkIGIvdG9vbHMvcGVyZi9hcmNoL3NwYXJjL0J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YWZlNGEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2FyY2gvc3BhcmMvQnVpbGQKQEAgLTAsMCArMSBAQAorbGlicGVyZi15ICs9IHV0aWwvCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gvc3BhcmMvTWFrZWZpbGUgYi90b29scy9wZXJmL2FyY2gvc3BhcmMvTWFrZWZpbGUKaW5kZXggMTUxMzBiNS4uN2ZiY2ExNyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3NwYXJjL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC9zcGFyYy9NYWtlZmlsZQpAQCAtMSw0ICsxLDMgQEAKIGlmbmRlZiBOT19EV0FSRgogUEVSRl9IQVZFX0RXQVJGX1JFR1MgOj0gMQotTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC8kKEFSQ0gpL3V0aWwvZHdhcmYtcmVncy5vCiBlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3NwYXJjL3V0aWwvQnVpbGQgYi90b29scy9wZXJmL2FyY2gvc3BhcmMvdXRpbC9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTRlMjg3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3NwYXJjL3V0aWwvQnVpbGQKQEAgLTAsMCArMSBAQAorbGlicGVyZi0kKENPTkZJR19EV0FSRikgKz0gZHdhcmYtcmVncy5vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L0J1aWxkIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWJmNjFkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni9CdWlsZApAQCAtMCwwICsxLDIgQEAKK2xpYnBlcmYteSArPSB1dGlsLworbGlicGVyZi0kKENPTkZJR19EV0FSRl9VTldJTkQpICs9IHRlc3RzLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvTWFrZWZpbGUKaW5kZXggOWIyMTg4MS4uMjEzMjJlMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9hcmNoL3g4Ni9NYWtlZmlsZQorKysgYi90b29scy9wZXJmL2FyY2gveDg2L01ha2VmaWxlCkBAIC0xLDE5ICsxLDQgQEAKIGlmbmRlZiBOT19EV0FSRgogUEVSRl9IQVZFX0RXQVJGX1JFR1MgOj0gMQotTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC8kKEFSQ0gpL3V0aWwvZHdhcmYtcmVncy5vCiBlbmRpZgotaWZuZGVmIE5PX0xJQlVOV0lORAotTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC8kKEFSQ0gpL3V0aWwvdW53aW5kLWxpYnVud2luZC5vCi1lbmRpZgotaWZuZGVmIE5PX0xJQkRXX0RXQVJGX1VOV0lORAotTElCX09CSlMgKz0gJChPVVRQVVQpYXJjaC8kKEFSQ0gpL3V0aWwvdW53aW5kLWxpYmR3Lm8KLWVuZGlmCi1pZm5kZWYgTk9fRFdBUkZfVU5XSU5ECi1MSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdGVzdHMvcmVnc19sb2FkLm8KLUxJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS90ZXN0cy9kd2FyZi11bndpbmQubwotZW5kaWYKLUxJQl9PQkpTICs9ICQoT1VUUFVUKWFyY2gvJChBUkNIKS91dGlsL2hlYWRlci5vCi1MSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC90c2MubwotTElCX0ggKz0gYXJjaC8kKEFSQ0gpL3V0aWwvdHNjLmgKIEhBVkVfS1ZNX1NUQVRfU1VQUE9SVCA6PSAxCi1MSUJfT0JKUyArPSAkKE9VVFBVVClhcmNoLyQoQVJDSCkvdXRpbC9rdm0tc3RhdC5vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L3Rlc3RzL0J1aWxkIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni90ZXN0cy9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzBlZmY5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9hcmNoL3g4Ni90ZXN0cy9CdWlsZApAQCAtMCwwICsxLDIgQEAKK2xpYnBlcmYteSArPSByZWdzX2xvYWQubworbGlicGVyZi15ICs9IGR3YXJmLXVud2luZC5vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvQnVpbGQgYi90b29scy9wZXJmL2FyY2gveDg2L3V0aWwvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiY2NjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYXJjaC94ODYvdXRpbC9CdWlsZApAQCAtMCwwICsxLDggQEAKK2xpYnBlcmYteSArPSBoZWFkZXIubworbGlicGVyZi15ICs9IHRzYy5vCitsaWJwZXJmLXkgKz0ga3ZtLXN0YXQubworCitsaWJwZXJmLSQoQ09ORklHX0RXQVJGKSArPSBkd2FyZi1yZWdzLm8KKworbGlicGVyZi0kKENPTkZJR19MSUJVTldJTkQpICAgICAgICAgICs9IHVud2luZC1saWJ1bndpbmQubworbGlicGVyZi0kKENPTkZJR19MSUJEV19EV0FSRl9VTldJTkQpICs9IHVud2luZC1saWJkdy5vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2JlbmNoL0J1aWxkIGIvdG9vbHMvcGVyZi9iZW5jaC9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2U5ODAyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9iZW5jaC9CdWlsZApAQCAtMCwwICsxLDExIEBACitwZXJmLXkgKz0gc2NoZWQtbWVzc2FnaW5nLm8KK3BlcmYteSArPSBzY2hlZC1waXBlLm8KK3BlcmYteSArPSBtZW0tbWVtY3B5Lm8KK3BlcmYteSArPSBmdXRleC1oYXNoLm8KK3BlcmYteSArPSBmdXRleC13YWtlLm8KK3BlcmYteSArPSBmdXRleC1yZXF1ZXVlLm8KKworcGVyZi0kKENPTkZJR19YODZfNjQpICs9IG1lbS1tZW1jcHkteDg2LTY0LWFzbS5vCitwZXJmLSQoQ09ORklHX1g4Nl82NCkgKz0gbWVtLW1lbXNldC14ODYtNjQtYXNtLm8KKworcGVyZi0kKENPTkZJR19OVU1BKSArPSBudW1hLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvbWVtLW1lbWNweS14ODYtNjQtYXNtLWRlZi5oIGIvdG9vbHMvcGVyZi9iZW5jaC9tZW0tbWVtY3B5LXg4Ni02NC1hc20tZGVmLmgKaW5kZXggZDY2YWI3OS4uOGMwYzFhMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9tZW0tbWVtY3B5LXg4Ni02NC1hc20tZGVmLmgKKysrIGIvdG9vbHMvcGVyZi9iZW5jaC9tZW0tbWVtY3B5LXg4Ni02NC1hc20tZGVmLmgKQEAgLTEsMTIgKzEsMTIgQEAKIAotTUVNQ1BZX0ZOKF9fbWVtY3B5LAorTUVNQ1BZX0ZOKG1lbWNweV9vcmlnLAogCSJ4ODYtNjQtdW5yb2xsZWQiLAogCSJ1bnJvbGxlZCBtZW1jcHkoKSBpbiBhcmNoL3g4Ni9saWIvbWVtY3B5XzY0LlMiKQogCi1NRU1DUFlfRk4obWVtY3B5X2MsCitNRU1DUFlfRk4oX19tZW1jcHksCiAJIng4Ni02NC1tb3ZzcSIsCiAJIm1vdnNxLWJhc2VkIG1lbWNweSgpIGluIGFyY2gveDg2L2xpYi9tZW1jcHlfNjQuUyIpCiAKLU1FTUNQWV9GTihtZW1jcHlfY19lLAorTUVNQ1BZX0ZOKG1lbWNweV9lcm1zLAogCSJ4ODYtNjQtbW92c2IiLAogCSJtb3ZzYi1iYXNlZCBtZW1jcHkoKSBpbiBhcmNoL3g4Ni9saWIvbWVtY3B5XzY0LlMiKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9tZW0tbWVtY3B5LXg4Ni02NC1hc20uUyBiL3Rvb2xzL3BlcmYvYmVuY2gvbWVtLW1lbWNweS14ODYtNjQtYXNtLlMKaW5kZXggZmNkOWNmMC4uZTRjMmMzMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9tZW0tbWVtY3B5LXg4Ni02NC1hc20uUworKysgYi90b29scy9wZXJmL2JlbmNoL21lbS1tZW1jcHkteDg2LTY0LWFzbS5TCkBAIC0xLDggKzEsNiBAQAogI2RlZmluZSBtZW1jcHkgTUVNQ1BZIC8qIGRvbid0IGhpZGUgZ2xpYmMncyBtZW1jcHkoKSAqLwogI2RlZmluZSBhbHRpbnN0cl9yZXBsYWNlbWVudCB0ZXh0CiAjZGVmaW5lIGdsb2JsIHAyYWxpZ24gNDsgLmdsb2JsCi0jZGVmaW5lIExtZW1jcHlfYyBnbG9ibCBtZW1jcHlfYzsgbWVtY3B5X2MKLSNkZWZpbmUgTG1lbWNweV9jX2UgZ2xvYmwgbWVtY3B5X2NfZTsgbWVtY3B5X2NfZQogI2luY2x1ZGUgIi4uLy4uLy4uL2FyY2gveDg2L2xpYi9tZW1jcHlfNjQuUyIKIC8qCiAgKiBXZSBuZWVkIHRvIHByb3ZpZGUgbm90ZS5HTlUtc3RhY2sgc2VjdGlvbiwgc2F5aW5nIHRoYXQgd2Ugd2FudApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9tZW0tbWVtY3B5LmMgYi90b29scy9wZXJmL2JlbmNoL21lbS1tZW1jcHkuYwppbmRleCBkYjFkM2EyLi5kM2RmYjc5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2JlbmNoL21lbS1tZW1jcHkuYworKysgYi90b29scy9wZXJmL2JlbmNoL21lbS1tZW1jcHkuYwpAQCAtMzYsNyArMzYsNyBAQAogCQkgICAgIlNwZWNpZnkgbGVuZ3RoIG9mIG1lbW9yeSB0byBjb3B5LiAiCiAJCSAgICAiQXZhaWxhYmxlIHVuaXRzOiBCLCBLQiwgTUIsIEdCIGFuZCBUQiAodXBwZXIgYW5kIGxvd2VyKSIpLAogCU9QVF9TVFJJTkcoJ3InLCAicm91dGluZSIsICZyb3V0aW5lLCAiZGVmYXVsdCIsCi0JCSAgICAiU3BlY2lmeSByb3V0aW5lIHRvIGNvcHkiKSwKKwkJICAgICJTcGVjaWZ5IHJvdXRpbmUgdG8gY29weSwgXCJhbGxcIiBydW5zIGFsbCBhdmFpbGFibGUgcm91dGluZXMiKSwKIAlPUFRfSU5URUdFUignaScsICJpdGVyYXRpb25zIiwgJml0ZXJhdGlvbnMsCiAJCSAgICAicmVwZWF0IG1lbWNweSgpIGludm9jYXRpb24gdGhpcyBudW1iZXIgb2YgdGltZXMiKSwKIAlPUFRfQk9PTEVBTignYycsICJjeWNsZSIsICZ1c2VfY3ljbGUsCkBAIC0xMzUsNTUgKzEzNSwxNiBAQAogCWNvbnN0IGNoYXIgKmNvbnN0ICp1c2FnZTsKIH07CiAKLXN0YXRpYyBpbnQgYmVuY2hfbWVtX2NvbW1vbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCi0JCSAgICAgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkLAotCQkgICAgIHN0cnVjdCBiZW5jaF9tZW1faW5mbyAqaW5mbykKK3N0YXRpYyB2b2lkIF9fYmVuY2hfbWVtX3JvdXRpbmUoc3RydWN0IGJlbmNoX21lbV9pbmZvICppbmZvLCBpbnQgcl9pZHgsIHNpemVfdCBsZW4sIGRvdWJsZSB0b3RhbGxlbikKIHsKLQlpbnQgaTsKLQlzaXplX3QgbGVuOwotCWRvdWJsZSB0b3RhbGxlbjsKKwljb25zdCBzdHJ1Y3Qgcm91dGluZSAqciA9ICZpbmZvLT5yb3V0aW5lc1tyX2lkeF07CiAJZG91YmxlIHJlc3VsdF9icHNbMl07CiAJdTY0IHJlc3VsdF9jeWNsZVsyXTsKIAotCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsCi0JCQkgICAgIGluZm8tPnVzYWdlLCAwKTsKLQotCWlmIChub19wcmVmYXVsdCAmJiBvbmx5X3ByZWZhdWx0KSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBvcHRpb25zOiAtbyBhbmQgLW4gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZVxuIik7Ci0JCXJldHVybiAxOwotCX0KLQotCWlmICh1c2VfY3ljbGUpCi0JCWluaXRfY3ljbGUoKTsKLQotCWxlbiA9IChzaXplX3QpcGVyZl9hdG9sbCgoY2hhciAqKWxlbmd0aF9zdHIpOwotCXRvdGFsbGVuID0gKGRvdWJsZSlsZW4gKiBpdGVyYXRpb25zOwotCiAJcmVzdWx0X2N5Y2xlWzBdID0gcmVzdWx0X2N5Y2xlWzFdID0gMFVMTDsKIAlyZXN1bHRfYnBzWzBdID0gcmVzdWx0X2Jwc1sxXSA9IDAuMDsKIAotCWlmICgoczY0KWxlbiA8PSAwKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBsZW5ndGg6JXNcbiIsIGxlbmd0aF9zdHIpOwotCQlyZXR1cm4gMTsKLQl9Ci0KLQkvKiBzYW1lIHRvIHdpdGhvdXQgc3BlY2lmeWluZyBlaXRoZXIgb2YgcHJlZmF1bHQgYW5kIG5vLXByZWZhdWx0ICovCi0JaWYgKG9ubHlfcHJlZmF1bHQgJiYgbm9fcHJlZmF1bHQpCi0JCW9ubHlfcHJlZmF1bHQgPSBub19wcmVmYXVsdCA9IGZhbHNlOwotCi0JZm9yIChpID0gMDsgaW5mby0+cm91dGluZXNbaV0ubmFtZTsgaSsrKSB7Ci0JCWlmICghc3RyY21wKGluZm8tPnJvdXRpbmVzW2ldLm5hbWUsIHJvdXRpbmUpKQotCQkJYnJlYWs7Ci0JfQotCWlmICghaW5mby0+cm91dGluZXNbaV0ubmFtZSkgewotCQlwcmludGYoIlVua25vd24gcm91dGluZTolc1xuIiwgcm91dGluZSk7Ci0JCXByaW50ZigiQXZhaWxhYmxlIHJvdXRpbmVzLi4uXG4iKTsKLQkJZm9yIChpID0gMDsgaW5mby0+cm91dGluZXNbaV0ubmFtZTsgaSsrKSB7Ci0JCQlwcmludGYoIlx0JXMgLi4uICVzXG4iLAotCQkJICAgICAgIGluZm8tPnJvdXRpbmVzW2ldLm5hbWUsIGluZm8tPnJvdXRpbmVzW2ldLmRlc2MpOwotCQl9Ci0JCXJldHVybiAxOwotCX0KKwlwcmludGYoIlJvdXRpbmUgJXMgKCVzKVxuIiwgci0+bmFtZSwgci0+ZGVzYyk7CiAKIAlpZiAoYmVuY2hfZm9ybWF0ID09IEJFTkNIX0ZPUk1BVF9ERUZBVUxUKQogCQlwcmludGYoIiMgQ29weWluZyAlcyBCeXRlcyAuLi5cblxuIiwgbGVuZ3RoX3N0cik7CkBAIC0xOTEsMjggKzE1MiwxNyBAQAogCWlmICghb25seV9wcmVmYXVsdCAmJiAhbm9fcHJlZmF1bHQpIHsKIAkJLyogc2hvdyBib3RoIG9mIHJlc3VsdHMgKi8KIAkJaWYgKHVzZV9jeWNsZSkgewotCQkJcmVzdWx0X2N5Y2xlWzBdID0KLQkJCQlpbmZvLT5kb19jeWNsZSgmaW5mby0+cm91dGluZXNbaV0sIGxlbiwgZmFsc2UpOwotCQkJcmVzdWx0X2N5Y2xlWzFdID0KLQkJCQlpbmZvLT5kb19jeWNsZSgmaW5mby0+cm91dGluZXNbaV0sIGxlbiwgdHJ1ZSk7CisJCQlyZXN1bHRfY3ljbGVbMF0gPSBpbmZvLT5kb19jeWNsZShyLCBsZW4sIGZhbHNlKTsKKwkJCXJlc3VsdF9jeWNsZVsxXSA9IGluZm8tPmRvX2N5Y2xlKHIsIGxlbiwgdHJ1ZSk7CiAJCX0gZWxzZSB7Ci0JCQlyZXN1bHRfYnBzWzBdID0KLQkJCQlpbmZvLT5kb19nZXR0aW1lb2ZkYXkoJmluZm8tPnJvdXRpbmVzW2ldLAotCQkJCQkJbGVuLCBmYWxzZSk7Ci0JCQlyZXN1bHRfYnBzWzFdID0KLQkJCQlpbmZvLT5kb19nZXR0aW1lb2ZkYXkoJmluZm8tPnJvdXRpbmVzW2ldLAotCQkJCQkJbGVuLCB0cnVlKTsKKwkJCXJlc3VsdF9icHNbMF0gICA9IGluZm8tPmRvX2dldHRpbWVvZmRheShyLCBsZW4sIGZhbHNlKTsKKwkJCXJlc3VsdF9icHNbMV0gICA9IGluZm8tPmRvX2dldHRpbWVvZmRheShyLCBsZW4sIHRydWUpOwogCQl9CiAJfSBlbHNlIHsKLQkJaWYgKHVzZV9jeWNsZSkgewotCQkJcmVzdWx0X2N5Y2xlW3BmXSA9Ci0JCQkJaW5mby0+ZG9fY3ljbGUoJmluZm8tPnJvdXRpbmVzW2ldLAotCQkJCQkJbGVuLCBvbmx5X3ByZWZhdWx0KTsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdF9icHNbcGZdID0KLQkJCQlpbmZvLT5kb19nZXR0aW1lb2ZkYXkoJmluZm8tPnJvdXRpbmVzW2ldLAotCQkJCQkJbGVuLCBvbmx5X3ByZWZhdWx0KTsKLQkJfQorCQlpZiAodXNlX2N5Y2xlKQorCQkJcmVzdWx0X2N5Y2xlW3BmXSA9IGluZm8tPmRvX2N5Y2xlKHIsIGxlbiwgb25seV9wcmVmYXVsdCk7CisJCWVsc2UKKwkJCXJlc3VsdF9icHNbcGZdID0gaW5mby0+ZG9fZ2V0dGltZW9mZGF5KHIsIGxlbiwgb25seV9wcmVmYXVsdCk7CiAJfQogCiAJc3dpdGNoIChiZW5jaF9mb3JtYXQpIHsKQEAgLTI2NSw2ICsyMTUsNjAgQEAKIAkJZGllKCJ1bmtub3duIGZvcm1hdDogJWRcbiIsIGJlbmNoX2Zvcm1hdCk7CiAJCWJyZWFrOwogCX0KK30KKworc3RhdGljIGludCBiZW5jaF9tZW1fY29tbW9uKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwKKwkJICAgICBjb25zdCBjaGFyICpwcmVmaXggX19tYXliZV91bnVzZWQsCisJCSAgICAgc3RydWN0IGJlbmNoX21lbV9pbmZvICppbmZvKQoreworCWludCBpOworCXNpemVfdCBsZW47CisJZG91YmxlIHRvdGFsbGVuOworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywKKwkJCSAgICAgaW5mby0+dXNhZ2UsIDApOworCisJaWYgKG5vX3ByZWZhdWx0ICYmIG9ubHlfcHJlZmF1bHQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIG9wdGlvbnM6IC1vIGFuZCAtbiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKHVzZV9jeWNsZSkKKwkJaW5pdF9jeWNsZSgpOworCisJbGVuID0gKHNpemVfdClwZXJmX2F0b2xsKChjaGFyICopbGVuZ3RoX3N0cik7CisJdG90YWxsZW4gPSAoZG91YmxlKWxlbiAqIGl0ZXJhdGlvbnM7CisKKwlpZiAoKHM2NClsZW4gPD0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgbGVuZ3RoOiVzXG4iLCBsZW5ndGhfc3RyKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogc2FtZSB0byB3aXRob3V0IHNwZWNpZnlpbmcgZWl0aGVyIG9mIHByZWZhdWx0IGFuZCBuby1wcmVmYXVsdCAqLworCWlmIChvbmx5X3ByZWZhdWx0ICYmIG5vX3ByZWZhdWx0KQorCQlvbmx5X3ByZWZhdWx0ID0gbm9fcHJlZmF1bHQgPSBmYWxzZTsKKworCWlmICghc3RybmNtcChyb3V0aW5lLCAiYWxsIiwgMykpIHsKKwkJZm9yIChpID0gMDsgaW5mby0+cm91dGluZXNbaV0ubmFtZTsgaSsrKQorCQkJX19iZW5jaF9tZW1fcm91dGluZShpbmZvLCBpLCBsZW4sIHRvdGFsbGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaW5mby0+cm91dGluZXNbaV0ubmFtZTsgaSsrKSB7CisJCWlmICghc3RyY21wKGluZm8tPnJvdXRpbmVzW2ldLm5hbWUsIHJvdXRpbmUpKQorCQkJYnJlYWs7CisJfQorCWlmICghaW5mby0+cm91dGluZXNbaV0ubmFtZSkgeworCQlwcmludGYoIlVua25vd24gcm91dGluZTolc1xuIiwgcm91dGluZSk7CisJCXByaW50ZigiQXZhaWxhYmxlIHJvdXRpbmVzLi4uXG4iKTsKKwkJZm9yIChpID0gMDsgaW5mby0+cm91dGluZXNbaV0ubmFtZTsgaSsrKSB7CisJCQlwcmludGYoIlx0JXMgLi4uICVzXG4iLAorCQkJICAgICAgIGluZm8tPnJvdXRpbmVzW2ldLm5hbWUsIGluZm8tPnJvdXRpbmVzW2ldLmRlc2MpOworCQl9CisJCXJldHVybiAxOworCX0KKworCV9fYmVuY2hfbWVtX3JvdXRpbmUoaW5mbywgaSwgbGVuLCB0b3RhbGxlbik7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2gvbWVtLW1lbXNldC14ODYtNjQtYXNtLWRlZi5oIGIvdG9vbHMvcGVyZi9iZW5jaC9tZW0tbWVtc2V0LXg4Ni02NC1hc20tZGVmLmgKaW5kZXggYTcxZGZmOS4uZjAyZDAyOCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9tZW0tbWVtc2V0LXg4Ni02NC1hc20tZGVmLmgKKysrIGIvdG9vbHMvcGVyZi9iZW5jaC9tZW0tbWVtc2V0LXg4Ni02NC1hc20tZGVmLmgKQEAgLTEsMTIgKzEsMTIgQEAKIAotTUVNU0VUX0ZOKF9fbWVtc2V0LAorTUVNU0VUX0ZOKG1lbXNldF9vcmlnLAogCSJ4ODYtNjQtdW5yb2xsZWQiLAogCSJ1bnJvbGxlZCBtZW1zZXQoKSBpbiBhcmNoL3g4Ni9saWIvbWVtc2V0XzY0LlMiKQogCi1NRU1TRVRfRk4obWVtc2V0X2MsCitNRU1TRVRfRk4oX19tZW1zZXQsCiAJIng4Ni02NC1zdG9zcSIsCiAJIm1vdnNxLWJhc2VkIG1lbXNldCgpIGluIGFyY2gveDg2L2xpYi9tZW1zZXRfNjQuUyIpCiAKLU1FTVNFVF9GTihtZW1zZXRfY19lLAorTUVNU0VUX0ZOKG1lbXNldF9lcm1zLAogCSJ4ODYtNjQtc3Rvc2IiLAogCSJtb3ZzYi1iYXNlZCBtZW1zZXQoKSBpbiBhcmNoL3g4Ni9saWIvbWVtc2V0XzY0LlMiKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9iZW5jaC9tZW0tbWVtc2V0LXg4Ni02NC1hc20uUyBiL3Rvb2xzL3BlcmYvYmVuY2gvbWVtLW1lbXNldC14ODYtNjQtYXNtLlMKaW5kZXggOWU1YWY4OS4uZGUyNzg3OCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9iZW5jaC9tZW0tbWVtc2V0LXg4Ni02NC1hc20uUworKysgYi90b29scy9wZXJmL2JlbmNoL21lbS1tZW1zZXQteDg2LTY0LWFzbS5TCkBAIC0xLDggKzEsNiBAQAogI2RlZmluZSBtZW1zZXQgTUVNU0VUIC8qIGRvbid0IGhpZGUgZ2xpYmMncyBtZW1zZXQoKSAqLwogI2RlZmluZSBhbHRpbnN0cl9yZXBsYWNlbWVudCB0ZXh0CiAjZGVmaW5lIGdsb2JsIHAyYWxpZ24gNDsgLmdsb2JsCi0jZGVmaW5lIExtZW1zZXRfYyBnbG9ibCBtZW1zZXRfYzsgbWVtc2V0X2MKLSNkZWZpbmUgTG1lbXNldF9jX2UgZ2xvYmwgbWVtc2V0X2NfZTsgbWVtc2V0X2NfZQogI2luY2x1ZGUgIi4uLy4uLy4uL2FyY2gveDg2L2xpYi9tZW1zZXRfNjQuUyIKIAogLyoKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1hbm5vdGF0ZS5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMKaW5kZXggNzQ3Zjg2MS4uNzFiZjc0NSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMKQEAgLTIwOCw3ICsyMDgsNyBAQAogCQkJZ290byBvdXQ7CiAJfQogCi0JcmV0ID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCAmYW5uLT50b29sKTsKKwlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24pOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tYnVpbGRpZC1jYWNoZS5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWJ1aWxkaWQtY2FjaGUuYwppbmRleCA1MGU2YjY2Li5kNDdhMGNkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tYnVpbGRpZC1jYWNoZS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1idWlsZGlkLWNhY2hlLmMKQEAgLTEyNSw4ICsxMjUsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYnVpbGRfaWRfY2FjaGVfX2FkZF9rY29yZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZGVidWdkaXIsCi0JCQkJICAgICBib29sIGZvcmNlKQorc3RhdGljIGludCBidWlsZF9pZF9jYWNoZV9fYWRkX2tjb3JlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBib29sIGZvcmNlKQogewogCWNoYXIgZGlyWzMyXSwgc2J1aWxkaWRbQlVJTERfSURfU0laRSAqIDIgKyAxXTsKIAljaGFyIGZyb21fZGlyW1BBVEhfTUFYXSwgdG9fZGlyW1BBVEhfTUFYXTsKQEAgLTE0Myw3ICsxNDIsNyBAQAogCQlyZXR1cm4gLTE7CiAKIAlzY25wcmludGYodG9fZGlyLCBzaXplb2YodG9fZGlyKSwgIiVzL1trZXJuZWwua2NvcmVdLyVzIiwKLQkJICBkZWJ1Z2Rpciwgc2J1aWxkaWQpOworCQkgIGJ1aWxkaWRfZGlyLCBzYnVpbGRpZCk7CiAKIAlpZiAoIWZvcmNlICYmCiAJICAgICFidWlsZF9pZF9jYWNoZV9fa2NvcmVfZXhpc3RpbmcoZnJvbV9kaXIsIHRvX2Rpciwgc2l6ZW9mKHRvX2RpcikpKSB7CkBAIC0xNTUsNyArMTU0LDcgQEAKIAkJcmV0dXJuIC0xOwogCiAJc2NucHJpbnRmKHRvX2Rpciwgc2l6ZW9mKHRvX2RpciksICIlcy9ba2VybmVsLmtjb3JlXS8lcy8lcyIsCi0JCSAgZGVidWdkaXIsIHNidWlsZGlkLCBkaXIpOworCQkgIGJ1aWxkaWRfZGlyLCBzYnVpbGRpZCwgZGlyKTsKIAogCWlmIChta2Rpcl9wKHRvX2RpciwgMDc1NSkpCiAJCXJldHVybiAtMTsKQEAgLTE4Myw3ICsxODIsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJ1aWxkX2lkX2NhY2hlX19hZGRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZGVidWdkaXIpCitzdGF0aWMgaW50IGJ1aWxkX2lkX2NhY2hlX19hZGRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKIAljaGFyIHNidWlsZF9pZFtCVUlMRF9JRF9TSVpFICogMiArIDFdOwogCXU4IGJ1aWxkX2lkW0JVSUxEX0lEX1NJWkVdOwpAQCAtMTk1LDE2ICsxOTQsMTQgQEAKIAl9CiAKIAlidWlsZF9pZF9fc3ByaW50ZihidWlsZF9pZCwgc2l6ZW9mKGJ1aWxkX2lkKSwgc2J1aWxkX2lkKTsKLQllcnIgPSBidWlsZF9pZF9jYWNoZV9fYWRkX3Moc2J1aWxkX2lkLCBkZWJ1Z2RpciwgZmlsZW5hbWUsCisJZXJyID0gYnVpbGRfaWRfY2FjaGVfX2FkZF9zKHNidWlsZF9pZCwgZmlsZW5hbWUsCiAJCQkJICAgIGZhbHNlLCBmYWxzZSk7Ci0JaWYgKHZlcmJvc2UpCi0JCXByX2luZm8oIkFkZGluZyAlcyAlczogJXNcbiIsIHNidWlsZF9pZCwgZmlsZW5hbWUsCi0JCQllcnIgPyAiRkFJTCIgOiAiT2siKTsKKwlwcl9kZWJ1ZygiQWRkaW5nICVzICVzOiAlc1xuIiwgc2J1aWxkX2lkLCBmaWxlbmFtZSwKKwkJIGVyciA/ICJGQUlMIiA6ICJPayIpOwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgYnVpbGRfaWRfY2FjaGVfX3JlbW92ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotCQkJCSAgICAgICBjb25zdCBjaGFyICpkZWJ1Z2RpcikKK3N0YXRpYyBpbnQgYnVpbGRfaWRfY2FjaGVfX3JlbW92ZV9maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewogCXU4IGJ1aWxkX2lkW0JVSUxEX0lEX1NJWkVdOwogCWNoYXIgc2J1aWxkX2lkW0JVSUxEX0lEX1NJWkUgKiAyICsgMV07CkBAIC0yMTcsMTAgKzIxNCwzNCBAQAogCX0KIAogCWJ1aWxkX2lkX19zcHJpbnRmKGJ1aWxkX2lkLCBzaXplb2YoYnVpbGRfaWQpLCBzYnVpbGRfaWQpOwotCWVyciA9IGJ1aWxkX2lkX2NhY2hlX19yZW1vdmVfcyhzYnVpbGRfaWQsIGRlYnVnZGlyKTsKLQlpZiAodmVyYm9zZSkKLQkJcHJfaW5mbygiUmVtb3ZpbmcgJXMgJXM6ICVzXG4iLCBzYnVpbGRfaWQsIGZpbGVuYW1lLAotCQkJZXJyID8gIkZBSUwiIDogIk9rIik7CisJZXJyID0gYnVpbGRfaWRfY2FjaGVfX3JlbW92ZV9zKHNidWlsZF9pZCk7CisJcHJfZGVidWcoIlJlbW92aW5nICVzICVzOiAlc1xuIiwgc2J1aWxkX2lkLCBmaWxlbmFtZSwKKwkJIGVyciA/ICJGQUlMIiA6ICJPayIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBidWlsZF9pZF9jYWNoZV9fcHVyZ2VfcGF0aChjb25zdCBjaGFyICpwYXRobmFtZSkKK3sKKwlzdHJ1Y3Qgc3RybGlzdCAqbGlzdDsKKwlzdHJ1Y3Qgc3RyX25vZGUgKnBvczsKKwlpbnQgZXJyOworCisJZXJyID0gYnVpbGRfaWRfY2FjaGVfX2xpc3RfYnVpbGRfaWRzKHBhdGhuYW1lLCAmbGlzdCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlzdHJsaXN0X19mb3JfZWFjaChwb3MsIGxpc3QpIHsKKwkJZXJyID0gYnVpbGRfaWRfY2FjaGVfX3JlbW92ZV9zKHBvcy0+cyk7CisJCXByX2RlYnVnKCJSZW1vdmluZyAlcyAlczogJXNcbiIsIHBvcy0+cywgcGF0aG5hbWUsCisJCQkgZXJyID8gIkZBSUwiIDogIk9rIik7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisJc3RybGlzdF9fZGVsZXRlKGxpc3QpOworCitvdXQ6CisJcHJfZGVidWcoIlB1cmdpbmcgJXM6ICVzXG4iLCBwYXRobmFtZSwgZXJyID8gIkZBSUwiIDogIk9rIik7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtMjUyLDEzICsyNzMsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBidWlsZF9pZF9jYWNoZV9fdXBkYXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsCi0JCQkJICAgICAgIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQorc3RhdGljIGludCBidWlsZF9pZF9jYWNoZV9fdXBkYXRlX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7CiAJdTggYnVpbGRfaWRbQlVJTERfSURfU0laRV07CiAJY2hhciBzYnVpbGRfaWRbQlVJTERfSURfU0laRSAqIDIgKyAxXTsKIAotCWludCBlcnI7CisJaW50IGVyciA9IDA7CiAKIAlpZiAoZmlsZW5hbWVfX3JlYWRfYnVpbGRfaWQoZmlsZW5hbWUsICZidWlsZF9pZCwgc2l6ZW9mKGJ1aWxkX2lkKSkgPCAwKSB7CiAJCXByX2RlYnVnKCJDb3VsZG4ndCByZWFkIGEgYnVpbGQtaWQgaW4gJXNcbiIsIGZpbGVuYW1lKTsKQEAgLTI2NiwxNCArMjg2LDE0IEBACiAJfQogCiAJYnVpbGRfaWRfX3NwcmludGYoYnVpbGRfaWQsIHNpemVvZihidWlsZF9pZCksIHNidWlsZF9pZCk7Ci0JZXJyID0gYnVpbGRfaWRfY2FjaGVfX3JlbW92ZV9zKHNidWlsZF9pZCwgZGVidWdkaXIpOwotCWlmICghZXJyKSB7Ci0JCWVyciA9IGJ1aWxkX2lkX2NhY2hlX19hZGRfcyhzYnVpbGRfaWQsIGRlYnVnZGlyLCBmaWxlbmFtZSwKLQkJCQkJICAgIGZhbHNlLCBmYWxzZSk7Ci0JfQotCWlmICh2ZXJib3NlKQotCQlwcl9pbmZvKCJVcGRhdGluZyAlcyAlczogJXNcbiIsIHNidWlsZF9pZCwgZmlsZW5hbWUsCi0JCQllcnIgPyAiRkFJTCIgOiAiT2siKTsKKwlpZiAoYnVpbGRfaWRfY2FjaGVfX2NhY2hlZChzYnVpbGRfaWQpKQorCQllcnIgPSBidWlsZF9pZF9jYWNoZV9fcmVtb3ZlX3Moc2J1aWxkX2lkKTsKKworCWlmICghZXJyKQorCQllcnIgPSBidWlsZF9pZF9jYWNoZV9fYWRkX3Moc2J1aWxkX2lkLCBmaWxlbmFtZSwgZmFsc2UsIGZhbHNlKTsKKworCXByX2RlYnVnKCJVcGRhdGluZyAlcyAlczogJXNcbiIsIHNidWlsZF9pZCwgZmlsZW5hbWUsCisJCSBlcnIgPyAiRkFJTCIgOiAiT2siKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0yODcsNiArMzA3LDcgQEAKIAlib29sIGZvcmNlID0gZmFsc2U7CiAJY2hhciBjb25zdCAqYWRkX25hbWVfbGlzdF9zdHIgPSBOVUxMLAogCQkgICAqcmVtb3ZlX25hbWVfbGlzdF9zdHIgPSBOVUxMLAorCQkgICAqcHVyZ2VfbmFtZV9saXN0X3N0ciA9IE5VTEwsCiAJCSAgICptaXNzaW5nX2ZpbGVuYW1lID0gTlVMTCwKIAkJICAgKnVwZGF0ZV9uYW1lX2xpc3Rfc3RyID0gTlVMTCwKIAkJICAgKmtjb3JlX2ZpbGVuYW1lID0gTlVMTDsKQEAgLTMwNCw2ICszMjUsOCBAQAogCQkgICAiZmlsZSIsICJrY29yZSBmaWxlIHRvIGFkZCIpLAogCU9QVF9TVFJJTkcoJ3InLCAicmVtb3ZlIiwgJnJlbW92ZV9uYW1lX2xpc3Rfc3RyLCAiZmlsZSBsaXN0IiwKIAkJICAgICJmaWxlKHMpIHRvIHJlbW92ZSIpLAorCU9QVF9TVFJJTkcoJ3AnLCAicHVyZ2UiLCAmcHVyZ2VfbmFtZV9saXN0X3N0ciwgInBhdGggbGlzdCIsCisJCSAgICAicGF0aChzKSB0byByZW1vdmUgKHJlbW92ZSBvbGQgY2FjaGVzIHRvbykiKSwKIAlPUFRfU1RSSU5HKCdNJywgIm1pc3NpbmciLCAmbWlzc2luZ19maWxlbmFtZSwgImZpbGUiLAogCQkgICAidG8gZmluZCBtaXNzaW5nIGJ1aWxkIGlkcyBpbiB0aGUgY2FjaGUiKSwKIAlPUFRfQk9PTEVBTignZicsICJmb3JjZSIsICZmb3JjZSwgImRvbid0IGNvbXBsYWluLCBkbyBpdCIpLApAQCAtMzIwLDYgKzM0MywxMSBAQAogCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIGJ1aWxkaWRfY2FjaGVfb3B0aW9ucywKIAkJCSAgICAgYnVpbGRpZF9jYWNoZV91c2FnZSwgMCk7CiAKKwlpZiAoYXJnYyB8fCAoIWFkZF9uYW1lX2xpc3Rfc3RyICYmICFrY29yZV9maWxlbmFtZSAmJgorCQkgICAgICFyZW1vdmVfbmFtZV9saXN0X3N0ciAmJiAhcHVyZ2VfbmFtZV9saXN0X3N0ciAmJgorCQkgICAgICFtaXNzaW5nX2ZpbGVuYW1lICYmICF1cGRhdGVfbmFtZV9saXN0X3N0cikpCisJCXVzYWdlX3dpdGhfb3B0aW9ucyhidWlsZGlkX2NhY2hlX3VzYWdlLCBidWlsZGlkX2NhY2hlX29wdGlvbnMpOworCiAJaWYgKG1pc3NpbmdfZmlsZW5hbWUpIHsKIAkJZmlsZS5wYXRoID0gbWlzc2luZ19maWxlbmFtZTsKIAkJZmlsZS5mb3JjZSA9IGZvcmNlOwpAQCAtMzM4LDcgKzM2Niw3IEBACiAJCWxpc3QgPSBzdHJsaXN0X19uZXcodHJ1ZSwgYWRkX25hbWVfbGlzdF9zdHIpOwogCQlpZiAobGlzdCkgewogCQkJc3RybGlzdF9fZm9yX2VhY2gocG9zLCBsaXN0KQotCQkJCWlmIChidWlsZF9pZF9jYWNoZV9fYWRkX2ZpbGUocG9zLT5zLCBidWlsZGlkX2RpcikpIHsKKwkJCQlpZiAoYnVpbGRfaWRfY2FjaGVfX2FkZF9maWxlKHBvcy0+cykpIHsKIAkJCQkJaWYgKGVycm5vID09IEVFWElTVCkgewogCQkJCQkJcHJfZGVidWcoIiVzIGFscmVhZHkgaW4gdGhlIGNhY2hlXG4iLAogCQkJCQkJCSBwb3MtPnMpOwpAQCAtMzU2LDcgKzM4NCwyNSBAQAogCQlsaXN0ID0gc3RybGlzdF9fbmV3KHRydWUsIHJlbW92ZV9uYW1lX2xpc3Rfc3RyKTsKIAkJaWYgKGxpc3QpIHsKIAkJCXN0cmxpc3RfX2Zvcl9lYWNoKHBvcywgbGlzdCkKLQkJCQlpZiAoYnVpbGRfaWRfY2FjaGVfX3JlbW92ZV9maWxlKHBvcy0+cywgYnVpbGRpZF9kaXIpKSB7CisJCQkJaWYgKGJ1aWxkX2lkX2NhY2hlX19yZW1vdmVfZmlsZShwb3MtPnMpKSB7CisJCQkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJCQkJCXByX2RlYnVnKCIlcyB3YXNuJ3QgaW4gdGhlIGNhY2hlXG4iLAorCQkJCQkJCSBwb3MtPnMpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJcHJfd2FybmluZygiQ291bGRuJ3QgcmVtb3ZlICVzOiAlc1xuIiwKKwkJCQkJCSAgIHBvcy0+cywgc3RyZXJyb3JfcihlcnJubywgc2J1Ziwgc2l6ZW9mKHNidWYpKSk7CisJCQkJfQorCisJCQlzdHJsaXN0X19kZWxldGUobGlzdCk7CisJCX0KKwl9CisKKwlpZiAocHVyZ2VfbmFtZV9saXN0X3N0cikgeworCQlsaXN0ID0gc3RybGlzdF9fbmV3KHRydWUsIHB1cmdlX25hbWVfbGlzdF9zdHIpOworCQlpZiAobGlzdCkgeworCQkJc3RybGlzdF9fZm9yX2VhY2gocG9zLCBsaXN0KQorCQkJCWlmIChidWlsZF9pZF9jYWNoZV9fcHVyZ2VfcGF0aChwb3MtPnMpKSB7CiAJCQkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKIAkJCQkJCXByX2RlYnVnKCIlcyB3YXNuJ3QgaW4gdGhlIGNhY2hlXG4iLAogCQkJCQkJCSBwb3MtPnMpOwpAQCAtMzc3LDcgKzQyMyw3IEBACiAJCWxpc3QgPSBzdHJsaXN0X19uZXcodHJ1ZSwgdXBkYXRlX25hbWVfbGlzdF9zdHIpOwogCQlpZiAobGlzdCkgewogCQkJc3RybGlzdF9fZm9yX2VhY2gocG9zLCBsaXN0KQotCQkJCWlmIChidWlsZF9pZF9jYWNoZV9fdXBkYXRlX2ZpbGUocG9zLT5zLCBidWlsZGlkX2RpcikpIHsKKwkJCQlpZiAoYnVpbGRfaWRfY2FjaGVfX3VwZGF0ZV9maWxlKHBvcy0+cykpIHsKIAkJCQkJaWYgKGVycm5vID09IEVOT0VOVCkgewogCQkJCQkJcHJfZGVidWcoIiVzIHdhc24ndCBpbiB0aGUgY2FjaGVcbiIsCiAJCQkJCQkJIHBvcy0+cyk7CkBAIC0zOTEsOCArNDM3LDcgQEAKIAkJfQogCX0KIAotCWlmIChrY29yZV9maWxlbmFtZSAmJgotCSAgICBidWlsZF9pZF9jYWNoZV9fYWRkX2tjb3JlKGtjb3JlX2ZpbGVuYW1lLCBidWlsZGlkX2RpciwgZm9yY2UpKQorCWlmIChrY29yZV9maWxlbmFtZSAmJiBidWlsZF9pZF9jYWNoZV9fYWRkX2tjb3JlKGtjb3JlX2ZpbGVuYW1lLCBmb3JjZSkpCiAJCXByX3dhcm5pbmcoIkNvdWxkbid0IGFkZCAlc1xuIiwga2NvcmVfZmlsZW5hbWUpOwogCiBvdXQ6CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tYnVpbGRpZC1saXN0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tYnVpbGRpZC1saXN0LmMKaW5kZXggZWQzODczYi4uZmViNDIwZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWJ1aWxkaWQtbGlzdC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1idWlsZGlkLWxpc3QuYwpAQCAtNzQsNyArNzQsNyBAQAogCSAqIHRoZSByZWNvcmQgc3RyZWFtLiBCdWlsZGlkcyBhcmUgc3RvcmVkIGFzIFJFQ09SRF9IRUFERVJfQlVJTERfSUQKIAkgKi8KIAlpZiAod2l0aF9oaXRzIHx8IHBlcmZfZGF0YV9maWxlX19pc19waXBlKCZmaWxlKSkKLQkJcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCAmYnVpbGRfaWRfX21hcmtfZHNvX2hpdF9vcHMpOworCQlwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24pOwogCiAJcGVyZl9zZXNzaW9uX19mcHJpbnRmX2Rzb3NfYnVpbGRpZChzZXNzaW9uLCBzdGRvdXQsIGRzb19fc2tpcF9idWlsZGlkLCB3aXRoX2hpdHMpOwogCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWRhdGEuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1MjViYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1kYXRhLmMKQEAgLTAsMCArMSwxMjMgQEAKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJwZXJmLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJwYXJzZS1vcHRpb25zLmgiCisjaW5jbHVkZSAiZGF0YS1jb252ZXJ0LWJ0LmgiCisKK3R5cGVkZWYgaW50ICgqZGF0YV9jbWRfZm5fdCkoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworCitzdHJ1Y3QgZGF0YV9jbWQgeworCWNvbnN0IGNoYXIJKm5hbWU7CisJY29uc3QgY2hhcgkqc3VtbWFyeTsKKwlkYXRhX2NtZF9mbl90CWZuOworfTsKKworc3RhdGljIHN0cnVjdCBkYXRhX2NtZCBkYXRhX2NtZHNbXTsKKworI2RlZmluZSBmb3JfZWFjaF9jbWQoY21kKSBcCisJZm9yIChjbWQgPSBkYXRhX2NtZHM7IGNtZCAmJiBjbWQtPm5hbWU7IGNtZCsrKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBkYXRhX29wdGlvbnNbXSA9IHsKKwlPUFRfRU5EKCkKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZGF0YV9zdWJjb21tYW5kc1tdID0geyAiY29udmVydCIsIE5VTEwgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRhdGFfdXNhZ2VbXSA9IHsKKwkicGVyZiBkYXRhIFs8Y29tbW9uIG9wdGlvbnM+XSA8Y29tbWFuZD4gWzxvcHRpb25zPl0iLAorCU5VTEwKK307CisKK3N0YXRpYyB2b2lkIHByaW50X3VzYWdlKHZvaWQpCit7CisJc3RydWN0IGRhdGFfY21kICpjbWQ7CisKKwlwcmludGYoIlVzYWdlOlxuIik7CisJcHJpbnRmKCJcdCVzXG5cbiIsIGRhdGFfdXNhZ2VbMF0pOworCXByaW50ZigiXHRBdmFpbGFibGUgY29tbWFuZHM6XG4iKTsKKworCWZvcl9lYWNoX2NtZChjbWQpIHsKKwkJcHJpbnRmKCJcdCAlc1x0LSAlc1xuIiwgY21kLT5uYW1lLCBjbWQtPnN1bW1hcnkpOworCX0KKworCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXRhX2NvbnZlcnRfdXNhZ2VbXSA9IHsKKwkicGVyZiBkYXRhIGNvbnZlcnQgWzxvcHRpb25zPl0iLAorCU5VTEwKK307CisKK3N0YXRpYyBpbnQgY21kX2RhdGFfY29udmVydChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsCisJCQkgICAgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQoreworCWNvbnN0IGNoYXIgKnRvX2N0ZiAgICAgPSBOVUxMOworCWJvb2wgZm9yY2UgPSBmYWxzZTsKKwljb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwkJT1BUX0lOQ1IoJ3YnLCAidmVyYm9zZSIsICZ2ZXJib3NlLCAiYmUgbW9yZSB2ZXJib3NlIiksCisJCU9QVF9TVFJJTkcoJ2knLCAiaW5wdXQiLCAmaW5wdXRfbmFtZSwgImZpbGUiLCAiaW5wdXQgZmlsZSBuYW1lIiksCisjaWZkZWYgSEFWRV9MSUJCQUJFTFRSQUNFX1NVUFBPUlQKKwkJT1BUX1NUUklORygwLCAidG8tY3RmIiwgJnRvX2N0ZiwgTlVMTCwgIkNvbnZlcnQgdG8gQ1RGIGZvcm1hdCIpLAorI2VuZGlmCisJCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJmZvcmNlLCAiZG9uJ3QgY29tcGxhaW4sIGRvIGl0IiksCisJCU9QVF9FTkQoKQorCX07CisKKyNpZm5kZWYgSEFWRV9MSUJCQUJFTFRSQUNFX1NVUFBPUlQKKwlwcl9lcnIoIk5vIGNvbnZlcnNpb24gc3VwcG9ydCBjb21waWxlZCBpbi5cbiIpOworCXJldHVybiAtMTsKKyNlbmRpZgorCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywKKwkJCSAgICAgZGF0YV9jb252ZXJ0X3VzYWdlLCAwKTsKKwlpZiAoYXJnYykgeworCQl1c2FnZV93aXRoX29wdGlvbnMoZGF0YV9jb252ZXJ0X3VzYWdlLCBvcHRpb25zKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICh0b19jdGYpIHsKKyNpZmRlZiBIQVZFX0xJQkJBQkVMVFJBQ0VfU1VQUE9SVAorCQlyZXR1cm4gYnRfY29udmVydF9fcGVyZjJjdGYoaW5wdXRfbmFtZSwgdG9fY3RmLCBmb3JjZSk7CisjZWxzZQorCQlwcl9lcnIoIlRoZSBsaWJiYWJlbHRyYWNlIHN1cHBvcnQgaXMgbm90IGNvbXBpbGVkIGluLlxuIik7CisJCXJldHVybiAtMTsKKyNlbmRpZgorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRhdGFfY21kIGRhdGFfY21kc1tdID0geworCXsgImNvbnZlcnQiLCAiY29udmVydHMgZGF0YSBmaWxlIGJldHdlZW4gZm9ybWF0cyIsIGNtZF9kYXRhX2NvbnZlcnQgfSwKKwl7IC5uYW1lID0gTlVMTCwgfSwKK307CisKK2ludCBjbWRfZGF0YShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzdHJ1Y3QgZGF0YV9jbWQgKmNtZDsKKwljb25zdCBjaGFyICpjbWRzdHI7CisKKwkvKiBObyBjb21tYW5kIHNwZWNpZmllZC4gKi8KKwlpZiAoYXJnYyA8IDIpCisJCWdvdG8gdXNhZ2U7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9uc19zdWJjb21tYW5kKGFyZ2MsIGFyZ3YsIGRhdGFfb3B0aW9ucywgZGF0YV9zdWJjb21tYW5kcywgZGF0YV91c2FnZSwKKwkJCSAgICAgUEFSU0VfT1BUX1NUT1BfQVRfTk9OX09QVElPTik7CisJaWYgKGFyZ2MgPCAxKQorCQlnb3RvIHVzYWdlOworCisJY21kc3RyID0gYXJndlswXTsKKworCWZvcl9lYWNoX2NtZChjbWQpIHsKKwkJaWYgKHN0cmNtcChjbWQtPm5hbWUsIGNtZHN0cikpCisJCQljb250aW51ZTsKKworCQlyZXR1cm4gY21kLT5mbihhcmdjLCBhcmd2LCBwcmVmaXgpOworCX0KKworCXByX2VycigiVW5rbm93biBjb21tYW5kOiAlc1xuIiwgY21kc3RyKTsKK3VzYWdlOgorCXByaW50X3VzYWdlKCk7CisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1kaWZmLmMKaW5kZXggNzRhYWRhNS4uZGY2MzA3YiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tZGlmZi5jCkBAIC03NDcsNyArNzQ3LDcgQEAKIAkJCWdvdG8gb3V0X2RlbGV0ZTsKIAkJfQogCi0JCXJldCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoZC0+c2Vzc2lvbiwgJnRvb2wpOworCQlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKGQtPnNlc3Npb24pOwogCQlpZiAocmV0KSB7CiAJCQlwcl9lcnIoIkZhaWxlZCB0byBwcm9jZXNzICVzXG4iLCBkLT5maWxlLnBhdGgpOwogCQkJZ290byBvdXRfZGVsZXRlOwpAQCAtNzkxLDYgKzc5MSw4IEBACiAJT1BUX0JPT0xFQU4oJ0QnLCAiZHVtcC1yYXctdHJhY2UiLCAmZHVtcF90cmFjZSwKIAkJICAgICJkdW1wIHJhdyB0cmFjZSBpbiBBU0NJSSIpLAogCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJmZvcmNlLCAiZG9uJ3QgY29tcGxhaW4sIGRvIGl0IiksCisJT1BUX1NUUklORygwLCAia2FsbHN5bXMiLCAmc3ltYm9sX2NvbmYua2FsbHN5bXNfbmFtZSwKKwkJICAgImZpbGUiLCAia2FsbHN5bXMgcGF0aG5hbWUiKSwKIAlPUFRfQk9PTEVBTignbScsICJtb2R1bGVzIiwgJnN5bWJvbF9jb25mLnVzZV9tb2R1bGVzLAogCQkgICAgImxvYWQgbW9kdWxlIHN5bWJvbHMgLSBXQVJOSU5HOiB1c2Ugb25seSB3aXRoIC1rIGFuZCBMSVZFIGtlcm5lbCIpLAogCU9QVF9TVFJJTkcoJ2QnLCAiZHNvcyIsICZzeW1ib2xfY29uZi5kc29fbGlzdF9zdHIsICJkc29bLGRzby4uLl0iLApAQCAtODAyLDcgKzgwNCw3IEBACiAJT1BUX1NUUklORygncycsICJzb3J0IiwgJnNvcnRfb3JkZXIsICJrZXlbLGtleTIuLi5dIiwKIAkJICAgInNvcnQgYnkga2V5KHMpOiBwaWQsIGNvbW0sIGRzbywgc3ltYm9sLCBwYXJlbnQsIGNwdSwgc3JjbGluZSwgLi4uIgogCQkgICAiIFBsZWFzZSByZWZlciB0aGUgbWFuIHBhZ2UgZm9yIHRoZSBjb21wbGV0ZSBsaXN0LiIpLAotCU9QVF9TVFJJTkcoJ3QnLCAiZmllbGQtc2VwYXJhdG9yIiwgJnN5bWJvbF9jb25mLmZpZWxkX3NlcCwgInNlcGFyYXRvciIsCisJT1BUX1NUUklOR19OT0VNUFRZKCd0JywgImZpZWxkLXNlcGFyYXRvciIsICZzeW1ib2xfY29uZi5maWVsZF9zZXAsICJzZXBhcmF0b3IiLAogCQkgICAic2VwYXJhdG9yIGZvciBjb2x1bW5zLCBubyBzcGFjZXMgd2lsbCBiZSBhZGRlZCBiZXR3ZWVuICIKIAkJICAgImNvbHVtbnMgJy4nIGlzIHJlc2VydmVkLiIpLAogCU9QVF9TVFJJTkcoMCwgInN5bWZzIiwgJnN5bWJvbF9jb25mLnN5bWZzLCAiZGlyZWN0b3J5IiwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1ldmxpc3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1ldmxpc3QuYwppbmRleCAwZjkzZjg1Li42OTVlYzVhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tZXZsaXN0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWV2bGlzdC5jCkBAIC0yNCw2ICsyNCw3IEBACiAJc3RydWN0IHBlcmZfZGF0YV9maWxlIGZpbGUgPSB7CiAJCS5wYXRoID0gZmlsZV9uYW1lLAogCQkubW9kZSA9IFBFUkZfREFUQV9NT0RFX1JFQUQsCisJCS5mb3JjZSA9IGRldGFpbHMtPmZvcmNlLAogCX07CiAKIAlzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcoJmZpbGUsIDAsIE5VTEwpOwpAQCAtNDcsNiArNDgsNyBAQAogCQkgICAgIlNob3cgYWxsIGV2ZW50IGF0dHIgZGV0YWlscyIpLAogCU9QVF9CT09MRUFOKCdnJywgImdyb3VwIiwgJmRldGFpbHMuZXZlbnRfZ3JvdXAsCiAJCSAgICAiU2hvdyBldmVudCBncm91cCBpbmZvcm1hdGlvbiIpLAorCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJmRldGFpbHMuZm9yY2UsICJkb24ndCBjb21wbGFpbiwgZG8gaXQiKSwKIAlPUFRfRU5EKCkKIAl9OwogCWNvbnN0IGNoYXIgKiBjb25zdCBldmxpc3RfdXNhZ2VbXSA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1oZWxwLmMgYi90b29scy9wZXJmL2J1aWx0aW4taGVscC5jCmluZGV4IDI1ZDIwNjIuLjM2NDg2ZWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1oZWxwLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWhlbHAuYwpAQCAtNDM3LDcgKzQzNywxOCBAQAogCQkJSEVMUF9GT1JNQVRfSU5GTyksCiAJT1BUX0VORCgpLAogCX07Ci0JY29uc3QgY2hhciAqIGNvbnN0IGJ1aWx0aW5faGVscF91c2FnZVtdID0geworCWNvbnN0IGNoYXIgKiBjb25zdCBidWlsdGluX2hlbHBfc3ViY29tbWFuZHNbXSA9IHsKKwkJImJ1aWxkaWQtY2FjaGUiLCAiYnVpbGRpZC1saXN0IiwgImRpZmYiLCAiZXZsaXN0IiwgImhlbHAiLCAibGlzdCIsCisJCSJyZWNvcmQiLCAicmVwb3J0IiwgImJlbmNoIiwgInN0YXQiLCAidGltZWNoYXJ0IiwgInRvcCIsICJhbm5vdGF0ZSIsCisJCSJzY3JpcHQiLCAic2NoZWQiLCAia21lbSIsICJsb2NrIiwgImt2bSIsICJ0ZXN0IiwgImluamVjdCIsICJtZW0iLCAiZGF0YSIsCisjaWZkZWYgSEFWRV9MSUJFTEZfU1VQUE9SVAorCQkicHJvYmUiLAorI2VuZGlmCisjaWZkZWYgSEFWRV9MSUJBVURJVF9TVVBQT1JUCisJCSJ0cmFjZSIsCisjZW5kaWYKKwlOVUxMIH07CisJY29uc3QgY2hhciAqYnVpbHRpbl9oZWxwX3VzYWdlW10gPSB7CiAJCSJwZXJmIGhlbHAgWy0tYWxsXSBbLS1tYW58LS13ZWJ8LS1pbmZvXSBbY29tbWFuZF0iLAogCQlOVUxMCiAJfTsKQEAgLTQ0OCw4ICs0NTksOCBAQAogCiAJcGVyZl9jb25maWcocGVyZl9oZWxwX2NvbmZpZywgJmhlbHBfZm9ybWF0KTsKIAotCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIGJ1aWx0aW5faGVscF9vcHRpb25zLAotCQkJYnVpbHRpbl9oZWxwX3VzYWdlLCAwKTsKKwlhcmdjID0gcGFyc2Vfb3B0aW9uc19zdWJjb21tYW5kKGFyZ2MsIGFyZ3YsIGJ1aWx0aW5faGVscF9vcHRpb25zLAorCQkJYnVpbHRpbl9oZWxwX3N1YmNvbW1hbmRzLCBidWlsdGluX2hlbHBfdXNhZ2UsIDApOwogCiAJaWYgKHNob3dfYWxsKSB7CiAJCXByaW50ZigiXG4gdXNhZ2U6ICVzXG5cbiIsIHBlcmZfdXNhZ2Vfc3RyaW5nKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1pbmplY3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1pbmplY3QuYwppbmRleCBhMTM2NDFlLi40MGEzM2Q3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4taW5qZWN0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWluamVjdC5jCkBAIC01Myw2ICs1MywxMyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBlcmZfZXZlbnRfX3JlcGlwZV9vZV9zeW50aChzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQkgICAgICAgc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSBfX21heWJlX3VudXNlZCkKK3sKKwlyZXR1cm4gcGVyZl9ldmVudF9fcmVwaXBlX3N5bnRoKHRvb2wsIGV2ZW50KTsKK30KKwogc3RhdGljIGludCBwZXJmX2V2ZW50X19yZXBpcGVfb3AyX3N5bnRoKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCiAJCQkJCXVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCQlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uCkBAIC0zNTksOCArMzY2LDYgQEAKIAl9IGVsc2UgaWYgKGluamVjdC0+c2NoZWRfc3RhdCkgewogCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CiAKLQkJaW5qZWN0LT50b29sLm9yZGVyZWRfZXZlbnRzID0gdHJ1ZTsKLQogCQlldmxpc3RfX2Zvcl9lYWNoKHNlc3Npb24tPmV2bGlzdCwgZXZzZWwpIHsKIAkJCWNvbnN0IGNoYXIgKm5hbWUgPSBwZXJmX2V2c2VsX19uYW1lKGV2c2VsKTsKIApAQCAtMzc5LDcgKzM4NCw3IEBACiAJaWYgKCFmaWxlX291dC0+aXNfcGlwZSkKIAkJbHNlZWsoZmQsIHNlc3Npb24tPmhlYWRlci5kYXRhX29mZnNldCwgU0VFS19TRVQpOwogCi0JcmV0ID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCAmaW5qZWN0LT50b29sKTsKKwlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24pOwogCiAJaWYgKCFmaWxlX291dC0+aXNfcGlwZSkgewogCQlpZiAoaW5qZWN0LT5idWlsZF9pZHMpCkBAIC00MDgsNyArNDEzLDcgQEAKIAkJCS51bnRocm90dGxlCT0gcGVyZl9ldmVudF9fcmVwaXBlLAogCQkJLmF0dHIJCT0gcGVyZl9ldmVudF9fcmVwaXBlX2F0dHIsCiAJCQkudHJhY2luZ19kYXRhCT0gcGVyZl9ldmVudF9fcmVwaXBlX29wMl9zeW50aCwKLQkJCS5maW5pc2hlZF9yb3VuZAk9IHBlcmZfZXZlbnRfX3JlcGlwZV9vcDJfc3ludGgsCisJCQkuZmluaXNoZWRfcm91bmQJPSBwZXJmX2V2ZW50X19yZXBpcGVfb2Vfc3ludGgsCiAJCQkuYnVpbGRfaWQJPSBwZXJmX2V2ZW50X19yZXBpcGVfb3AyX3N5bnRoLAogCQkJLmlkX2luZGV4CT0gcGVyZl9ldmVudF9fcmVwaXBlX29wMl9zeW50aCwKIAkJfSwKQEAgLTQzOCw2ICs0NDMsNyBAQAogCQkJICJiZSBtb3JlIHZlcmJvc2UgKHNob3cgYnVpbGQgaWRzLCBldGMpIiksCiAJCU9QVF9TVFJJTkcoMCwgImthbGxzeW1zIiwgJnN5bWJvbF9jb25mLmthbGxzeW1zX25hbWUsICJmaWxlIiwKIAkJCSAgICJrYWxsc3ltcyBwYXRobmFtZSIpLAorCQlPUFRfQk9PTEVBTignZicsICJmb3JjZSIsICZmaWxlLmZvcmNlLCAiZG9uJ3QgY29tcGxhaW4sIGRvIGl0IiksCiAJCU9QVF9FTkQoKQogCX07CiAJY29uc3QgY2hhciAqIGNvbnN0IGluamVjdF91c2FnZVtdID0gewpAQCAtNDU4LDYgKzQ2NCw4IEBACiAJCXJldHVybiAtMTsKIAl9CiAKKwlpbmplY3QudG9vbC5vcmRlcmVkX2V2ZW50cyA9IGluamVjdC5zY2hlZF9zdGF0OworCiAJZmlsZS5wYXRoID0gaW5qZWN0LmlucHV0X25hbWU7CiAJaW5qZWN0LnNlc3Npb24gPSBwZXJmX3Nlc3Npb25fX25ldygmZmlsZSwgdHJ1ZSwgJmluamVjdC50b29sKTsKIAlpZiAoaW5qZWN0LnNlc3Npb24gPT0gTlVMTCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rbWVtLmMgYi90b29scy9wZXJmL2J1aWx0aW4ta21lbS5jCmluZGV4IGYyOTUxNDEuLjRlYmY2NWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rbWVtLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWttZW0uYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CiAKIHN0cnVjdCBhbGxvY19zdGF0OwogdHlwZWRlZiBpbnQgKCpzb3J0X2ZuX3QpKHN0cnVjdCBhbGxvY19zdGF0ICosIHN0cnVjdCBhbGxvY19zdGF0ICopOwpAQCAtMjc1LDEwICsyNzYsMTAgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqbmV4dDsKIAlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSA9ICZzZXNzaW9uLT5tYWNoaW5lcy5ob3N0OwogCi0JcHJpbnRmKCIlLjEwMnNcbiIsIGdyYXBoX2RvdHRlZF9saW5lKTsKKwlwcmludGYoIiUuMTA1c1xuIiwgZ3JhcGhfZG90dGVkX2xpbmUpOwogCXByaW50ZigiICUtMzRzIHwiLCAgaXNfY2FsbGVyID8gIkNhbGxzaXRlIjogIkFsbG9jIFB0ciIpOwogCXByaW50ZigiIFRvdGFsX2FsbG9jL1BlciB8IFRvdGFsX3JlcS9QZXIgICB8IEhpdCAgICAgIHwgUGluZy1wb25nIHwgRnJhZ1xuIik7Ci0JcHJpbnRmKCIlLjEwMnNcbiIsIGdyYXBoX2RvdHRlZF9saW5lKTsKKwlwcmludGYoIiUuMTA1c1xuIiwgZ3JhcGhfZG90dGVkX2xpbmUpOwogCiAJbmV4dCA9IHJiX2ZpcnN0KHJvb3QpOwogCkBAIC0zMDQsNyArMzA1LDcgQEAKIAkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlIyIgUFJJeDY0ICIiLCBhZGRyKTsKIAkJcHJpbnRmKCIgJS0zNHMgfCIsIGJ1Zik7CiAKLQkJcHJpbnRmKCIgJTlsbHUvJS01bHUgfCAlOWxsdS8lLTVsdSB8ICU4bHUgfCAlOGx1IHwgJTYuM2YlJVxuIiwKKwkJcHJpbnRmKCIgJTlsbHUvJS01bHUgfCAlOWxsdS8lLTVsdSB8ICU4bHUgfCAlOWx1IHwgJTYuM2YlJVxuIiwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGF0YS0+Ynl0ZXNfYWxsb2MsCiAJCSAgICAgICAodW5zaWduZWQgbG9uZylkYXRhLT5ieXRlc19hbGxvYyAvIGRhdGEtPmhpdCwKIAkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZGF0YS0+Ynl0ZXNfcmVxLApAQCAtMzE3LDIxICszMTgsMjEgQEAKIAl9CiAKIAlpZiAobl9saW5lcyA9PSAtMSkKLQkJcHJpbnRmKCIgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC4uLiAgICAgICAgICAgICB8IC4uLiAgICAgICAgICAgICB8IC4uLiAgICB8IC4uLiAgICAgIHwgLi4uICAgXG4iKTsKKwkJcHJpbnRmKCIgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC4uLiAgICAgICAgICAgICB8IC4uLiAgICAgICAgICAgICB8IC4uLiAgICAgIHwgLi4uICAgICAgIHwgLi4uICAgXG4iKTsKIAotCXByaW50ZigiJS4xMDJzXG4iLCBncmFwaF9kb3R0ZWRfbGluZSk7CisJcHJpbnRmKCIlLjEwNXNcbiIsIGdyYXBoX2RvdHRlZF9saW5lKTsKIH0KIAogc3RhdGljIHZvaWQgcHJpbnRfc3VtbWFyeSh2b2lkKQogewogCXByaW50ZigiXG5TVU1NQVJZXG49PT09PT09XG4iKTsKLQlwcmludGYoIlRvdGFsIGJ5dGVzIHJlcXVlc3RlZDogJWx1XG4iLCB0b3RhbF9yZXF1ZXN0ZWQpOwotCXByaW50ZigiVG90YWwgYnl0ZXMgYWxsb2NhdGVkOiAlbHVcbiIsIHRvdGFsX2FsbG9jYXRlZCk7Ci0JcHJpbnRmKCJUb3RhbCBieXRlcyB3YXN0ZWQgb24gaW50ZXJuYWwgZnJhZ21lbnRhdGlvbjogJWx1XG4iLAorCXByaW50ZigiVG90YWwgYnl0ZXMgcmVxdWVzdGVkOiAlJ2x1XG4iLCB0b3RhbF9yZXF1ZXN0ZWQpOworCXByaW50ZigiVG90YWwgYnl0ZXMgYWxsb2NhdGVkOiAlJ2x1XG4iLCB0b3RhbF9hbGxvY2F0ZWQpOworCXByaW50ZigiVG90YWwgYnl0ZXMgd2FzdGVkIG9uIGludGVybmFsIGZyYWdtZW50YXRpb246ICUnbHVcbiIsCiAJICAgICAgIHRvdGFsX2FsbG9jYXRlZCAtIHRvdGFsX3JlcXVlc3RlZCk7CiAJcHJpbnRmKCJJbnRlcm5hbCBmcmFnbWVudGF0aW9uOiAlZiUlXG4iLAogCSAgICAgICBmcmFnbWVudGF0aW9uKHRvdGFsX3JlcXVlc3RlZCwgdG90YWxfYWxsb2NhdGVkKSk7Ci0JcHJpbnRmKCJDcm9zcyBDUFUgYWxsb2NhdGlvbnM6ICVsdS8lbHVcbiIsIG5yX2Nyb3NzX2FsbG9jcywgbnJfYWxsb2NzKTsKKwlwcmludGYoIkNyb3NzIENQVSBhbGxvY2F0aW9uczogJSdsdS8lJ2x1XG4iLCBucl9jcm9zc19hbGxvY3MsIG5yX2FsbG9jcyk7CiB9CiAKIHN0YXRpYyB2b2lkIHByaW50X3Jlc3VsdChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQpAQCAtNDI2LDcgKzQyNyw3IEBACiAJfQogCiAJc2V0dXBfcGFnZXIoKTsKLQllcnIgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sICZwZXJmX2ttZW0pOworCWVyciA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbik7CiAJaWYgKGVyciAhPSAwKQogCQlnb3RvIG91dDsKIAlzb3J0X3Jlc3VsdCgpOwpAQCAtNTU5LDYgKzU2MCw3IEBACiB7CiAJY2hhciAqdG9rOwogCWNoYXIgKnN0ciA9IHN0cmR1cChhcmcpOworCWNoYXIgKnBvcyA9IHN0cjsKIAogCWlmICghc3RyKSB7CiAJCXByX2VycigiJXM6IHN0cmR1cCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKQEAgLTU2Niw3ICs1NjgsNyBAQAogCX0KIAogCXdoaWxlICh0cnVlKSB7Ci0JCXRvayA9IHN0cnNlcCgmc3RyLCAiLCIpOworCQl0b2sgPSBzdHJzZXAoJnBvcywgIiwiKTsKIAkJaWYgKCF0b2spCiAJCQlicmVhazsKIAkJaWYgKHNvcnRfZGltZW5zaW9uX19hZGQodG9rLCBzb3J0X2xpc3QpIDwgMCkgewpAQCAtNjYwLDggKzY2MiwxMyBAQAogaW50IGNtZF9rbWVtKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQogewogCWNvbnN0IGNoYXIgKiBjb25zdCBkZWZhdWx0X3NvcnRfb3JkZXIgPSAiZnJhZyxoaXQsYnl0ZXMiOworCXN0cnVjdCBwZXJmX2RhdGFfZmlsZSBmaWxlID0geworCQkubW9kZSA9IFBFUkZfREFUQV9NT0RFX1JFQUQsCisJfTsKIAljb25zdCBzdHJ1Y3Qgb3B0aW9uIGttZW1fb3B0aW9uc1tdID0gewogCU9QVF9TVFJJTkcoJ2knLCAiaW5wdXQiLCAmaW5wdXRfbmFtZSwgImZpbGUiLCAiaW5wdXQgZmlsZSBuYW1lIiksCisJT1BUX0lOQ1IoJ3YnLCAidmVyYm9zZSIsICZ2ZXJib3NlLAorCQkgICAgImJlIG1vcmUgdmVyYm9zZSAoc2hvdyBzeW1ib2wgYWRkcmVzcywgZXRjKSIpLAogCU9QVF9DQUxMQkFDS19OT09QVCgwLCAiY2FsbGVyIiwgTlVMTCwgTlVMTCwKIAkJCSAgICJzaG93IHBlci1jYWxsc2l0ZSBzdGF0aXN0aWNzIiwgcGFyc2VfY2FsbGVyX29wdCksCiAJT1BUX0NBTExCQUNLX05PT1BUKDAsICJhbGxvYyIsIE5VTEwsIE5VTEwsCkBAIC02NzEsNiArNjc4LDcgQEAKIAkJICAgICBwYXJzZV9zb3J0X29wdCksCiAJT1BUX0NBTExCQUNLKCdsJywgImxpbmUiLCBOVUxMLCAibnVtIiwgInNob3cgbiBsaW5lcyIsIHBhcnNlX2xpbmVfb3B0KSwKIAlPUFRfQk9PTEVBTigwLCAicmF3LWlwIiwgJnJhd19pcCwgInNob3cgcmF3IGlwIGluc3RlYWQgb2Ygc3ltYm9sIiksCisJT1BUX0JPT0xFQU4oJ2YnLCAiZm9yY2UiLCAmZmlsZS5mb3JjZSwgImRvbid0IGNvbXBsYWluLCBkbyBpdCIpLAogCU9QVF9FTkQoKQogCX07CiAJY29uc3QgY2hhciAqY29uc3Qga21lbV9zdWJjb21tYW5kc1tdID0geyAicmVjb3JkIiwgInN0YXQiLCBOVUxMIH07CkBAIC02NzksMTAgKzY4Nyw2IEBACiAJCU5VTEwKIAl9OwogCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb247Ci0Jc3RydWN0IHBlcmZfZGF0YV9maWxlIGZpbGUgPSB7Ci0JCS5wYXRoID0gaW5wdXRfbmFtZSwKLQkJLm1vZGUgPSBQRVJGX0RBVEFfTU9ERV9SRUFELAotCX07CiAJaW50IHJldCA9IC0xOwogCiAJYXJnYyA9IHBhcnNlX29wdGlvbnNfc3ViY29tbWFuZChhcmdjLCBhcmd2LCBrbWVtX29wdGlvbnMsCkBAIC02OTYsNiArNzAwLDggQEAKIAkJcmV0dXJuIF9fY21kX3JlY29yZChhcmdjLCBhcmd2KTsKIAl9CiAKKwlmaWxlLnBhdGggPSBpbnB1dF9uYW1lOworCiAJc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KCZmaWxlLCBmYWxzZSwgJnBlcmZfa21lbSk7CiAJaWYgKHNlc3Npb24gPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwpAQCAtNzAzLDYgKzcwOSw4IEBACiAJc3ltYm9sX19pbml0KCZzZXNzaW9uLT5oZWFkZXIuZW52KTsKIAogCWlmICghc3RyY21wKGFyZ3ZbMF0sICJzdGF0IikpIHsKKwkJc2V0bG9jYWxlKExDX0FMTCwgIiIpOworCiAJCWlmIChjcHVfX3NldHVwX2NwdW5vZGVfbWFwKCkpCiAJCQlnb3RvIG91dF9kZWxldGU7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1rdm0uYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1rdm0uYwppbmRleCAwODk0YTgxLi4xZjkzMzhmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4ta3ZtLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWt2bS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAidXRpbC9zdGF0LmgiCiAjaW5jbHVkZSAidXRpbC90b3AuaCIKICNpbmNsdWRlICJ1dGlsL2RhdGEuaCIKKyNpbmNsdWRlICJ1dGlsL29yZGVyZWQtZXZlbnRzLmgiCiAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpZmRlZiBIQVZFX1RJTUVSRkRfU1VQUE9SVApAQCAtNzMwLDkgKzczMSw5IEBACiAJCQlyZXR1cm4gLTE7CiAJCX0KIAotCQllcnIgPSBwZXJmX3Nlc3Npb25fcXVldWVfZXZlbnQoa3ZtLT5zZXNzaW9uLCBldmVudCwgJmt2bS0+dG9vbCwgJnNhbXBsZSwgMCk7CisJCWVyciA9IHBlcmZfc2Vzc2lvbl9fcXVldWVfZXZlbnQoa3ZtLT5zZXNzaW9uLCBldmVudCwgJnNhbXBsZSwgMCk7CiAJCS8qCi0JCSAqIEZJWE1FOiBIZXJlIHdlIGNhbid0IGNvbnN1bWUgdGhlIGV2ZW50LCBhcyBwZXJmX3Nlc3Npb25fcXVldWVfZXZlbnQgd2lsbAorCQkgKiBGSVhNRTogSGVyZSB3ZSBjYW4ndCBjb25zdW1lIHRoZSBldmVudCwgYXMgcGVyZl9zZXNzaW9uX19xdWV1ZV9ldmVudCB3aWxsCiAJCSAqICAgICAgICBwb2ludCB0byBpdCwgYW5kIGl0J2xsIGdldCBwb3NzaWJseSBvdmVyd3JpdHRlbiBieSB0aGUga2VybmVsLgogCQkgKi8KIAkJcGVyZl9ldmxpc3RfX21tYXBfY29uc3VtZShrdm0tPmV2bGlzdCwgaWR4KTsKQEAgLTc4Myw4ICs3ODQsMTAgQEAKIAogCS8qIGZsdXNoIHF1ZXVlIGFmdGVyIGVhY2ggcm91bmQgaW4gd2hpY2ggd2UgcHJvY2Vzc2VkIGV2ZW50cyAqLwogCWlmIChudG90YWwpIHsKLQkJa3ZtLT5zZXNzaW9uLT5vcmRlcmVkX2V2ZW50cy5uZXh0X2ZsdXNoID0gZmx1c2hfdGltZTsKLQkJZXJyID0ga3ZtLT50b29sLmZpbmlzaGVkX3JvdW5kKCZrdm0tPnRvb2wsIE5VTEwsIGt2bS0+c2Vzc2lvbik7CisJCXN0cnVjdCBvcmRlcmVkX2V2ZW50cyAqb2UgPSAma3ZtLT5zZXNzaW9uLT5vcmRlcmVkX2V2ZW50czsKKworCQlvZS0+bmV4dF9mbHVzaCA9IGZsdXNoX3RpbWU7CisJCWVyciA9IG9yZGVyZWRfZXZlbnRzX19mbHVzaChvZSwgT0VfRkxVU0hfX1JPVU5EKTsKIAkJaWYgKGVycikgewogCQkJaWYgKGt2bS0+bG9zdF9ldmVudHMpCiAJCQkJcHJfaW5mbygiXG5Mb3N0IGV2ZW50czogJSIgUFJJdTY0ICJcblxuIiwKQEAgLTEwNDQsNiArMTA0Nyw3IEBACiAJc3RydWN0IHBlcmZfZGF0YV9maWxlIGZpbGUgPSB7CiAJCS5wYXRoID0ga3ZtLT5maWxlX25hbWUsCiAJCS5tb2RlID0gUEVSRl9EQVRBX01PREVfUkVBRCwKKwkJLmZvcmNlID0ga3ZtLT5mb3JjZSwKIAl9OwogCiAJa3ZtLT50b29sID0gZW9wczsKQEAgLTEwNjYsNyArMTA3MCw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXR1cm4gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhrdm0tPnNlc3Npb24sICZrdm0tPnRvb2wpOworCXJldHVybiBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKGt2bS0+c2Vzc2lvbik7CiB9CiAKIHN0YXRpYyBpbnQgcGFyc2VfdGFyZ2V0X3N0cihzdHJ1Y3QgcGVyZl9rdm1fc3RhdCAqa3ZtKQpAQCAtMTIwMSw2ICsxMjA1LDcgQEAKIAkJCSAgICAiIHRpbWUgKHNvcnQgYnkgYXZnIHRpbWUpIiksCiAJCU9QVF9TVFJJTkcoJ3AnLCAicGlkIiwgJmt2bS0+b3B0cy50YXJnZXQucGlkLCAicGlkIiwKIAkJCSAgICJhbmFseXplIGV2ZW50cyBvbmx5IGZvciBnaXZlbiBwcm9jZXNzIGlkKHMpIiksCisJCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJmt2bS0+Zm9yY2UsICJkb24ndCBjb21wbGFpbiwgZG8gaXQiKSwKIAkJT1BUX0VORCgpCiAJfTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWxpc3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1saXN0LmMKaW5kZXggMTk4ZjNjMy4uYWY1YmQwNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWxpc3QuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tbGlzdC5jCkBAIC0zNiwzOCArMzYsMzYgQEAKIAogCXNldHVwX3BhZ2VyKCk7CiAKLQlpZiAocmF3X2R1bXApIHsKLQkJcHJpbnRfZXZlbnRzKE5VTEwsIHRydWUpOwotCQlyZXR1cm4gMDsKLQl9CisJaWYgKCFyYXdfZHVtcCkKKwkJcHJpbnRmKCJcbkxpc3Qgb2YgcHJlLWRlZmluZWQgZXZlbnRzICh0byBiZSB1c2VkIGluIC1lKTpcblxuIik7CiAKIAlpZiAoYXJnYyA9PSAwKSB7Ci0JCXByaW50X2V2ZW50cyhOVUxMLCBmYWxzZSk7CisJCXByaW50X2V2ZW50cyhOVUxMLCByYXdfZHVtcCk7CiAJCXJldHVybiAwOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBhcmdjOyArK2kpIHsKLQkJaWYgKGkpCi0JCQlwdXRjaGFyKCdcbicpOwotCQlpZiAoc3RybmNtcChhcmd2W2ldLCAidHJhY2Vwb2ludCIsIDEwKSA9PSAwKQotCQkJcHJpbnRfdHJhY2Vwb2ludF9ldmVudHMoTlVMTCwgTlVMTCwgZmFsc2UpOworCQlpZiAoc3RyY21wKGFyZ3ZbaV0sICJ0cmFjZXBvaW50IikgPT0gMCkKKwkJCXByaW50X3RyYWNlcG9pbnRfZXZlbnRzKE5VTEwsIE5VTEwsIHJhd19kdW1wKTsKIAkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICJodyIpID09IDAgfHwKIAkJCSBzdHJjbXAoYXJndltpXSwgImhhcmR3YXJlIikgPT0gMCkKLQkJCXByaW50X2V2ZW50c190eXBlKFBFUkZfVFlQRV9IQVJEV0FSRSk7CisJCQlwcmludF9zeW1ib2xfZXZlbnRzKE5VTEwsIFBFUkZfVFlQRV9IQVJEV0FSRSwKKwkJCQkJZXZlbnRfc3ltYm9sc19odywgUEVSRl9DT1VOVF9IV19NQVgsIHJhd19kdW1wKTsKIAkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICJzdyIpID09IDAgfHwKIAkJCSBzdHJjbXAoYXJndltpXSwgInNvZnR3YXJlIikgPT0gMCkKLQkJCXByaW50X2V2ZW50c190eXBlKFBFUkZfVFlQRV9TT0ZUV0FSRSk7CisJCQlwcmludF9zeW1ib2xfZXZlbnRzKE5VTEwsIFBFUkZfVFlQRV9TT0ZUV0FSRSwKKwkJCQkJZXZlbnRfc3ltYm9sc19zdywgUEVSRl9DT1VOVF9TV19NQVgsIHJhd19kdW1wKTsKIAkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbaV0sICJjYWNoZSIpID09IDAgfHwKIAkJCSBzdHJjbXAoYXJndltpXSwgImh3Y2FjaGUiKSA9PSAwKQotCQkJcHJpbnRfaHdjYWNoZV9ldmVudHMoTlVMTCwgZmFsc2UpOworCQkJcHJpbnRfaHdjYWNoZV9ldmVudHMoTlVMTCwgcmF3X2R1bXApOwogCQllbHNlIGlmIChzdHJjbXAoYXJndltpXSwgInBtdSIpID09IDApCi0JCQlwcmludF9wbXVfZXZlbnRzKE5VTEwsIGZhbHNlKTsKKwkJCXByaW50X3BtdV9ldmVudHMoTlVMTCwgcmF3X2R1bXApOwogCQllbHNlIHsKIAkJCWNoYXIgKnNlcCA9IHN0cmNocihhcmd2W2ldLCAnOicpLCAqczsKIAkJCWludCBzZXBfaWR4OwogCiAJCQlpZiAoc2VwID09IE5VTEwpIHsKLQkJCQlwcmludF9ldmVudHMoYXJndltpXSwgZmFsc2UpOworCQkJCXByaW50X2V2ZW50cyhhcmd2W2ldLCByYXdfZHVtcCk7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlzZXBfaWR4ID0gc2VwIC0gYXJndltpXTsKQEAgLTc2LDcgKzc0LDcgQEAKIAkJCQlyZXR1cm4gLTE7CiAKIAkJCXNbc2VwX2lkeF0gPSAnXDAnOwotCQkJcHJpbnRfdHJhY2Vwb2ludF9ldmVudHMocywgcyArIHNlcF9pZHggKyAxLCBmYWxzZSk7CisJCQlwcmludF90cmFjZXBvaW50X2V2ZW50cyhzLCBzICsgc2VwX2lkeCArIDEsIHJhd19kdW1wKTsKIAkJCWZyZWUocyk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tbG9jay5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWxvY2suYwppbmRleCBlN2VjNzE1Li5kNDljMmFiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tbG9jay5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1sb2NrLmMKQEAgLTg0Niw2ICs4NDYsOCBAQAogCXsgImxvY2s6bG9ja19yZWxlYXNlIiwJIHBlcmZfZXZzZWxfX3Byb2Nlc3NfbG9ja19yZWxlYXNlLCAgIH0sIC8qIENPTkZJR19MT0NLREVQICovCiB9OwogCitzdGF0aWMgYm9vbCBmb3JjZTsKKwogc3RhdGljIGludCBfX2NtZF9yZXBvcnQoYm9vbCBkaXNwbGF5X2luZm8pCiB7CiAJaW50IGVyciA9IC1FSU5WQUw7CkBAIC04NTcsNiArODU5LDcgQEAKIAlzdHJ1Y3QgcGVyZl9kYXRhX2ZpbGUgZmlsZSA9IHsKIAkJLnBhdGggPSBpbnB1dF9uYW1lLAogCQkubW9kZSA9IFBFUkZfREFUQV9NT0RFX1JFQUQsCisJCS5mb3JjZSA9IGZvcmNlLAogCX07CiAKIAlzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcoJmZpbGUsIGZhbHNlLCAmZW9wcyk7CkBAIC04NzgsNyArODgxLDcgQEAKIAlpZiAoc2VsZWN0X2tleSgpKQogCQlnb3RvIG91dF9kZWxldGU7CiAKLQllcnIgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sICZlb3BzKTsKKwllcnIgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24pOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2RlbGV0ZTsKIApAQCAtOTQ1LDYgKzk0OCw3IEBACiAJCSAgICAiZHVtcCB0aHJlYWQgbGlzdCBpbiBwZXJmLmRhdGEiKSwKIAlPUFRfQk9PTEVBTignbScsICJtYXAiLCAmaW5mb19tYXAsCiAJCSAgICAibWFwIG9mIGxvY2sgaW5zdGFuY2VzIChhZGRyZXNzOm5hbWUgdGFibGUpIiksCisJT1BUX0JPT0xFQU4oJ2YnLCAiZm9yY2UiLCAmZm9yY2UsICJkb24ndCBjb21wbGFpbiwgZG8gaXQiKSwKIAlPUFRfRU5EKCkKIAl9OwogCWNvbnN0IHN0cnVjdCBvcHRpb24gbG9ja19vcHRpb25zW10gPSB7CkBAIC05NTYsNiArOTYwLDcgQEAKIAljb25zdCBzdHJ1Y3Qgb3B0aW9uIHJlcG9ydF9vcHRpb25zW10gPSB7CiAJT1BUX1NUUklORygnaycsICJrZXkiLCAmc29ydF9rZXksICJhY3F1aXJlZCIsCiAJCSAgICAia2V5IGZvciBzb3J0aW5nIChhY3F1aXJlZCAvIGNvbnRlbmRlZCAvIGF2Z193YWl0IC8gd2FpdF90b3RhbCAvIHdhaXRfbWF4IC8gd2FpdF9taW4pIiksCisJT1BUX0JPT0xFQU4oJ2YnLCAiZm9yY2UiLCAmZm9yY2UsICJkb24ndCBjb21wbGFpbiwgZG8gaXQiKSwKIAkvKiBUT0RPOiB0eXBlICovCiAJT1BUX0VORCgpCiAJfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1tZW0uYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1tZW0uYwppbmRleCA5YjU2NjM5Li42NzUyMTZlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tbWVtLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLW1lbS5jCkBAIC0xNSw2ICsxNSw3IEBACiAJY2hhciBjb25zdAkJKmlucHV0X25hbWU7CiAJYm9vbAkJCWhpZGVfdW5yZXNvbHZlZDsKIAlib29sCQkJZHVtcF9yYXc7CisJYm9vbAkJCWZvcmNlOwogCWludAkJCW9wZXJhdGlvbjsKIAljb25zdCBjaGFyCQkqY3B1X2xpc3Q7CiAJREVDTEFSRV9CSVRNQVAoY3B1X2JpdG1hcCwgTUFYX05SX0NQVVMpOwpAQCAtMTIwLDYgKzEyMSw3IEBACiAJc3RydWN0IHBlcmZfZGF0YV9maWxlIGZpbGUgPSB7CiAJCS5wYXRoID0gaW5wdXRfbmFtZSwKIAkJLm1vZGUgPSBQRVJGX0RBVEFfTU9ERV9SRUFELAorCQkuZm9yY2UgPSBtZW0tPmZvcmNlLAogCX07CiAJaW50IGVyciA9IC1FSU5WQUw7CiAJaW50IHJldDsKQEAgLTE0MSw3ICsxNDMsNyBAQAogCiAJcHJpbnRmKCIjIFBJRCwgVElELCBJUCwgQUREUiwgTE9DQUwgV0VJR0hULCBEU1JDLCBTWU1CT0xcbiIpOwogCi0JZXJyID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCAmbWVtLT50b29sKTsKKwllcnIgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24pOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTI4NiwxMCArMjg4LDExIEBACiAJCSAgICJpbnB1dCBmaWxlIG5hbWUiKSwKIAlPUFRfU1RSSU5HKCdDJywgImNwdSIsICZtZW0uY3B1X2xpc3QsICJjcHUiLAogCQkgICAibGlzdCBvZiBjcHVzIHRvIHByb2ZpbGUiKSwKLQlPUFRfU1RSSU5HKCd4JywgImZpZWxkLXNlcGFyYXRvciIsICZzeW1ib2xfY29uZi5maWVsZF9zZXAsCisJT1BUX1NUUklOR19OT0VNUFRZKCd4JywgImZpZWxkLXNlcGFyYXRvciIsICZzeW1ib2xfY29uZi5maWVsZF9zZXAsCiAJCSAgICJzZXBhcmF0b3IiLAogCQkgICAic2VwYXJhdG9yIGZvciBjb2x1bW5zLCBubyBzcGFjZXMgd2lsbCBiZSBhZGRlZCIKIAkJICAgIiBiZXR3ZWVuIGNvbHVtbnMgJy4nIGlzIHJlc2VydmVkLiIpLAorCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJm1lbS5mb3JjZSwgImRvbid0IGNvbXBsYWluLCBkbyBpdCIpLAogCU9QVF9FTkQoKQogCX07CiAJY29uc3QgY2hhciAqY29uc3QgbWVtX3N1YmNvbW1hbmRzW10gPSB7ICJyZWNvcmQiLCAicmVwb3J0IiwgTlVMTCB9OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwppbmRleCA5MjFiYjY5Li5mN2IxYWY2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwpAQCAtNTYsNiArNTYsNyBAQAogCWJvb2wgbW9kX2V2ZW50czsKIAlib29sIHVwcm9iZXM7CiAJYm9vbCBxdWlldDsKKwlib29sIHRhcmdldF91c2VkOwogCWludCBuZXZlbnRzOwogCXN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50IGV2ZW50c1tNQVhfUFJPQkVTXTsKIAlzdHJ1Y3Qgc3RybGlzdCAqZGVsbGlzdDsKQEAgLTc4LDYgKzc5LDEyIEBACiAJfQogCiAJcGV2LT51cHJvYmVzID0gcGFyYW1zLnVwcm9iZXM7CisJaWYgKHBhcmFtcy50YXJnZXQpIHsKKwkJcGV2LT50YXJnZXQgPSBzdHJkdXAocGFyYW1zLnRhcmdldCk7CisJCWlmICghcGV2LT50YXJnZXQpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcGFyYW1zLnRhcmdldF91c2VkID0gdHJ1ZTsKKwl9CiAKIAkvKiBQYXJzZSBhIHBlcmYtcHJvYmUgY29tbWFuZCBpbnRvIGV2ZW50ICovCiAJcmV0ID0gcGFyc2VfcGVyZl9wcm9iZV9jb21tYW5kKHN0ciwgcGV2KTsKQEAgLTEwMiw2ICsxMDksNyBAQAogCQlwYXJhbXMudGFyZ2V0ID0gc3RyZHVwKHB0cik7CiAJCWlmICghcGFyYW1zLnRhcmdldCkKIAkJCXJldHVybiAtRU5PTUVNOworCQlwYXJhbXMudGFyZ2V0X3VzZWQgPSBmYWxzZTsKIAogCQlmb3VuZCA9IDE7CiAJCWJ1ZiA9IHB0ciArIChzdHJsZW4ocHRyKSAtIDMpOwpAQCAtMTc4LDcgKzE4Niw3IEBACiAJaW50IHJldCA9IC1FTk9FTlQ7CiAJY2hhciAqdG1wOwogCi0JaWYgIChzdHIgJiYgIXBhcmFtcy50YXJnZXQpIHsKKwlpZiAgKHN0cikgewogCQlpZiAoIXN0cmNtcChvcHQtPmxvbmdfbmFtZSwgImV4ZWMiKSkKIAkJCXBhcmFtcy51cHJvYmVzID0gdHJ1ZTsKICNpZmRlZiBIQVZFX0RXQVJGX1NVUFBPUlQKQEAgLTIwMCw3ICsyMDgsOSBAQAogCQkJaWYgKCF0bXApCiAJCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KKwkJZnJlZShwYXJhbXMudGFyZ2V0KTsKIAkJcGFyYW1zLnRhcmdldCA9IHRtcDsKKwkJcGFyYW1zLnRhcmdldF91c2VkID0gZmFsc2U7CiAJCXJldCA9IDA7CiAJfQogCkBAIC00ODUsOSArNDk1LDE0IEBACiAJfQogCiAJaWYgKHBhcmFtcy5uZXZlbnRzKSB7CisJCS8qIEVuc3VyZSB0aGUgbGFzdCBnaXZlbiB0YXJnZXQgaXMgdXNlZCAqLworCQlpZiAocGFyYW1zLnRhcmdldCAmJiAhcGFyYW1zLnRhcmdldF91c2VkKSB7CisJCQlwcl93YXJuaW5nKCIgIEVycm9yOiAteC8tbSBtdXN0IGZvbGxvdyB0aGUgcHJvYmUgZGVmaW5pdGlvbnMuXG4iKTsKKwkJCXVzYWdlX3dpdGhfb3B0aW9ucyhwcm9iZV91c2FnZSwgb3B0aW9ucyk7CisJCX0KKwogCQlyZXQgPSBhZGRfcGVyZl9wcm9iZV9ldmVudHMocGFyYW1zLmV2ZW50cywgcGFyYW1zLm5ldmVudHMsCiAJCQkJCSAgICBwYXJhbXMubWF4X3Byb2JlX3BvaW50cywKLQkJCQkJICAgIHBhcmFtcy50YXJnZXQsCiAJCQkJCSAgICBwYXJhbXMuZm9yY2VfYWRkKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXByX2Vycl93aXRoX2NvZGUoIiAgRXJyb3I6IEZhaWxlZCB0byBhZGQgZXZlbnRzLiIsIHJldCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKaW5kZXggNDA0YWIzNC4uYzNlZmRmYiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYwpAQCAtNzAsOCArNzAsOCBAQAogc3RhdGljIGludCByZWNvcmRfX21tYXBfcmVhZChzdHJ1Y3QgcmVjb3JkICpyZWMsIGludCBpZHgpCiB7CiAJc3RydWN0IHBlcmZfbW1hcCAqbWQgPSAmcmVjLT5ldmxpc3QtPm1tYXBbaWR4XTsKLQl1bnNpZ25lZCBpbnQgaGVhZCA9IHBlcmZfbW1hcF9fcmVhZF9oZWFkKG1kKTsKLQl1bnNpZ25lZCBpbnQgb2xkID0gbWQtPnByZXY7CisJdTY0IGhlYWQgPSBwZXJmX21tYXBfX3JlYWRfaGVhZChtZCk7CisJdTY0IG9sZCA9IG1kLT5wcmV2OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBtZC0+YmFzZSArIHBhZ2Vfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHNpemU7CiAJdm9pZCAqYnVmOwpAQCAtMTYxLDggKzE2MSw5IEBACiAJCX0KIAl9CiAKLQlpZiAocGVyZl9ldmxpc3RfX2FwcGx5X2ZpbHRlcnMoZXZsaXN0KSkgewotCQllcnJvcigiZmFpbGVkIHRvIHNldCBmaWx0ZXIgd2l0aCAlZCAoJXMpXG4iLCBlcnJubywKKwlpZiAocGVyZl9ldmxpc3RfX2FwcGx5X2ZpbHRlcnMoZXZsaXN0LCAmcG9zKSkgeworCQllcnJvcigiZmFpbGVkIHRvIHNldCBmaWx0ZXIgXCIlc1wiIG9uIGV2ZW50ICVzIHdpdGggJWQgKCVzKVxuIiwKKwkJCXBvcy0+ZmlsdGVyLCBwZXJmX2V2c2VsX19uYW1lKHBvcyksIGVycm5vLAogCQkJc3RyZXJyb3JfcihlcnJubywgbXNnLCBzaXplb2YobXNnKSkpOwogCQlyYyA9IC0xOwogCQlnb3RvIG91dDsKQEAgLTIyNSw3ICsyMjYsNyBAQAogCSAqLwogCXN5bWJvbF9jb25mLmlnbm9yZV92bWxpbnV4X2J1aWxkaWQgPSB0cnVlOwogCi0JcmV0dXJuIHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgJnJlYy0+dG9vbCk7CisJcmV0dXJuIHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbik7CiB9CiAKIHN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfZ3Vlc3Rfb3Moc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHZvaWQgKmRhdGEpCkBAIC0zNDMsNyArMzQ0LDcgQEAKIAlzaWduYWwoU0lHSU5ULCBzaWdfaGFuZGxlcik7CiAJc2lnbmFsKFNJR1RFUk0sIHNpZ19oYW5kbGVyKTsKIAotCXNlc3Npb24gPSBwZXJmX3Nlc3Npb25fX25ldyhmaWxlLCBmYWxzZSwgTlVMTCk7CisJc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KGZpbGUsIGZhbHNlLCB0b29sKTsKIAlpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7CiAJCXByX2VycigiUGVyZiBzZXNzaW9uIGNyZWF0aW9uIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gLTE7CkBAIC02NTgsNyArNjU5LDcgQEAKIAogc3RhdGljIHZvaWQgY2FsbGNoYWluX2RlYnVnKHZvaWQpCiB7Ci0Jc3RhdGljIGNvbnN0IGNoYXIgKnN0cltDQUxMQ0hBSU5fTUFYXSA9IHsgIk5PTkUiLCAiRlAiLCAiRFdBUkYiIH07CisJc3RhdGljIGNvbnN0IGNoYXIgKnN0cltDQUxMQ0hBSU5fTUFYXSA9IHsgIk5PTkUiLCAiRlAiLCAiRFdBUkYiLCAiTEJSIiB9OwogCiAJcHJfZGVidWcoImNhbGxjaGFpbjogdHlwZSAlc1xuIiwgc3RyW2NhbGxjaGFpbl9wYXJhbS5yZWNvcmRfbW9kZV0pOwogCkBAIC03MTAsNiArNzExLDkwIEBACiAJcmV0dXJuIHBlcmZfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSwgY2IpOwogfQogCitzdHJ1Y3QgY2xvY2tpZF9tYXAgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50IGNsb2NraWQ7Cit9OworCisjZGVmaW5lIENMT0NLSURfTUFQKG4sIGMpCVwKKwl7IC5uYW1lID0gbiwgLmNsb2NraWQgPSAoYyksIH0KKworI2RlZmluZSBDTE9DS0lEX0VORAl7IC5uYW1lID0gTlVMTCwgfQorCisKKy8qCisgKiBBZGQgdGhlIG1pc3Npbmcgb25lcywgd2UgbmVlZCB0byBidWlsZCBvbiBtYW55IGRpc3Ryb3MuLi4KKyAqLworI2lmbmRlZiBDTE9DS19NT05PVE9OSUNfUkFXCisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19SQVcgNAorI2VuZGlmCisjaWZuZGVmIENMT0NLX0JPT1RUSU1FCisjZGVmaW5lIENMT0NLX0JPT1RUSU1FIDcKKyNlbmRpZgorI2lmbmRlZiBDTE9DS19UQUkKKyNkZWZpbmUgQ0xPQ0tfVEFJIDExCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjbG9ja2lkX21hcCBjbG9ja2lkc1tdID0geworCS8qIGF2YWlsYWJsZSBmb3IgYWxsIGV2ZW50cywgTk1JIHNhZmUgKi8KKwlDTE9DS0lEX01BUCgibW9ub3RvbmljIiwgQ0xPQ0tfTU9OT1RPTklDKSwKKwlDTE9DS0lEX01BUCgibW9ub3RvbmljX3JhdyIsIENMT0NLX01PTk9UT05JQ19SQVcpLAorCisJLyogYXZhaWxhYmxlIGZvciBzb21lIGV2ZW50cyAqLworCUNMT0NLSURfTUFQKCJyZWFsdGltZSIsIENMT0NLX1JFQUxUSU1FKSwKKwlDTE9DS0lEX01BUCgiYm9vdHRpbWUiLCBDTE9DS19CT09UVElNRSksCisJQ0xPQ0tJRF9NQVAoInRhaSIsIENMT0NLX1RBSSksCisKKwkvKiBhdmFpbGFibGUgZm9yIHRoZSBsYXp5ICovCisJQ0xPQ0tJRF9NQVAoIm1vbm8iLCBDTE9DS19NT05PVE9OSUMpLAorCUNMT0NLSURfTUFQKCJyYXciLCBDTE9DS19NT05PVE9OSUNfUkFXKSwKKwlDTE9DS0lEX01BUCgicmVhbCIsIENMT0NLX1JFQUxUSU1FKSwKKwlDTE9DS0lEX01BUCgiYm9vdCIsIENMT0NLX0JPT1RUSU1FKSwKKworCUNMT0NLSURfRU5ELAorfTsKKworc3RhdGljIGludCBwYXJzZV9jbG9ja2lkKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqc3RyLCBpbnQgdW5zZXQpCit7CisJc3RydWN0IHJlY29yZF9vcHRzICpvcHRzID0gKHN0cnVjdCByZWNvcmRfb3B0cyAqKW9wdC0+dmFsdWU7CisJY29uc3Qgc3RydWN0IGNsb2NraWRfbWFwICpjbTsKKwljb25zdCBjaGFyICpvc3RyID0gc3RyOworCisJaWYgKHVuc2V0KSB7CisJCW9wdHMtPnVzZV9jbG9ja2lkID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogbm8gYXJnIHBhc3NlZCAqLworCWlmICghc3RyKQorCQlyZXR1cm4gMDsKKworCS8qIG5vIHNldHRpbmcgaXQgdHdpY2UgKi8KKwlpZiAob3B0cy0+dXNlX2Nsb2NraWQpCisJCXJldHVybiAtMTsKKworCW9wdHMtPnVzZV9jbG9ja2lkID0gdHJ1ZTsKKworCS8qIGlmIGl0cyBhIG51bWJlciwgd2UncmUgZG9uZSAqLworCWlmIChzc2NhbmYoc3RyLCAiJWQiLCAmb3B0cy0+Y2xvY2tpZCkgPT0gMSkKKwkJcmV0dXJuIDA7CisKKwkvKiBhbGxvdyBhICJDTE9DS18iIHByZWZpeCB0byB0aGUgbmFtZSAqLworCWlmICghc3RybmNhc2VjbXAoc3RyLCAiQ0xPQ0tfIiwgNikpCisJCXN0ciArPSA2OworCisJZm9yIChjbSA9IGNsb2NraWRzOyBjbS0+bmFtZTsgY20rKykgeworCQlpZiAoIXN0cmNhc2VjbXAoc3RyLCBjbS0+bmFtZSkpIHsKKwkJCW9wdHMtPmNsb2NraWQgPSBjbS0+Y2xvY2tpZDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJb3B0cy0+dXNlX2Nsb2NraWQgPSBmYWxzZTsKKwl1aV9fd2FybmluZygidW5rbm93biBjbG9ja2lkICVzLCBjaGVjayBtYW4gcGFnZVxuIiwgb3N0cik7CisJcmV0dXJuIC0xOworfQorCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IF9fcmVjb3JkX3VzYWdlW10gPSB7CiAJInBlcmYgcmVjb3JkIFs8b3B0aW9ucz5dIFs8Y29tbWFuZD5dIiwKIAkicGVyZiByZWNvcmQgWzxvcHRpb25zPl0gLS0gPGNvbW1hbmQ+IFs8b3B0aW9ucz5dIiwKQEAgLTc1MSw5ICs4MzYsOSBAQAogI2RlZmluZSBDQUxMQ0hBSU5fSEVMUCAic2V0dXAgYW5kIGVuYWJsZXMgY2FsbC1ncmFwaCAoc3RhY2sgY2hhaW4vYmFja3RyYWNlKSByZWNvcmRpbmc6ICIKIAogI2lmZGVmIEhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQKLWNvbnN0IGNoYXIgcmVjb3JkX2NhbGxjaGFpbl9oZWxwW10gPSBDQUxMQ0hBSU5fSEVMUCAiZnAgZHdhcmYiOworY29uc3QgY2hhciByZWNvcmRfY2FsbGNoYWluX2hlbHBbXSA9IENBTExDSEFJTl9IRUxQICJmcCBkd2FyZiBsYnIiOwogI2Vsc2UKLWNvbnN0IGNoYXIgcmVjb3JkX2NhbGxjaGFpbl9oZWxwW10gPSBDQUxMQ0hBSU5fSEVMUCAiZnAiOworY29uc3QgY2hhciByZWNvcmRfY2FsbGNoYWluX2hlbHBbXSA9IENBTExDSEFJTl9IRUxQICJmcCBsYnIiOwogI2VuZGlmCiAKIC8qCkBAIC04MzksNiArOTI0LDExIEBACiAJCSAgICAidXNlIHBlci10aHJlYWQgbW1hcHMiKSwKIAlPUFRfQk9PTEVBTignSScsICJpbnRyLXJlZ3MiLCAmcmVjb3JkLm9wdHMuc2FtcGxlX2ludHJfcmVncywKIAkJICAgICJTYW1wbGUgbWFjaGluZSByZWdpc3RlcnMgb24gaW50ZXJydXB0IiksCisJT1BUX0JPT0xFQU4oMCwgInJ1bm5pbmctdGltZSIsICZyZWNvcmQub3B0cy5ydW5uaW5nX3RpbWUsCisJCSAgICAiUmVjb3JkIHJ1bm5pbmcvZW5hYmxlZCB0aW1lIG9mIHJlYWQgKDpTKSBldmVudHMiKSwKKwlPUFRfQ0FMTEJBQ0soJ2snLCAiY2xvY2tpZCIsICZyZWNvcmQub3B0cywKKwkiY2xvY2tpZCIsICJjbG9ja2lkIHRvIHVzZSBmb3IgZXZlbnRzLCBzZWUgY2xvY2tfZ2V0dGltZSgpIiwKKwlwYXJzZV9jbG9ja2lkKSwKIAlPUFRfRU5EKCkKIH07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYwppbmRleCAyZjkxMDk0Li40NzZjZGY3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCkBAIC0yNDksNiArMjQ5LDggQEAKIAkJaWYgKChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1JFR1NfVVNFUikgJiYKIAkJICAgIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1NUQUNLX1VTRVIpKQogCQkJY2FsbGNoYWluX3BhcmFtLnJlY29yZF9tb2RlID0gQ0FMTENIQUlOX0RXQVJGOworCQllbHNlIGlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0JSQU5DSF9TVEFDSykKKwkJCWNhbGxjaGFpbl9wYXJhbS5yZWNvcmRfbW9kZSA9IENBTExDSEFJTl9MQlI7CiAJCWVsc2UKIAkJCWNhbGxjaGFpbl9wYXJhbS5yZWNvcmRfbW9kZSA9IENBTExDSEFJTl9GUDsKIAl9CkBAIC0zMDIsNyArMzA0LDcgQEAKIAogCWlmIChyZXAtPm1lbV9tb2RlKSB7CiAJCXJldCArPSBmcHJpbnRmKGZwLCAiXG4jIFRvdGFsIHdlaWdodCA6ICUiIFBSSXU2NCwgbnJfZXZlbnRzKTsKLQkJcmV0ICs9IGZwcmludGYoZnAsICJcbiMgU29ydCBvcmRlciAgIDogJXMiLCBzb3J0X29yZGVyKTsKKwkJcmV0ICs9IGZwcmludGYoZnAsICJcbiMgU29ydCBvcmRlciAgIDogJXMiLCBzb3J0X29yZGVyID8gOiBkZWZhdWx0X21lbV9zb3J0X29yZGVyKTsKIAl9IGVsc2UKIAkJcmV0ICs9IGZwcmludGYoZnAsICJcbiMgRXZlbnQgY291bnQgKGFwcHJveC4pOiAlIiBQUkl1NjQsIG5yX2V2ZW50cyk7CiAJcmV0dXJuIHJldCArIGZwcmludGYoZnAsICJcbiNcbiIpOwpAQCAtMzQ1LDcgKzM0Nyw3IEBACiBzdGF0aWMgdm9pZCByZXBvcnRfX3dhcm5fa3B0cl9yZXN0cmljdChjb25zdCBzdHJ1Y3QgcmVwb3J0ICpyZXApCiB7CiAJc3RydWN0IG1hcCAqa2VybmVsX21hcCA9IHJlcC0+c2Vzc2lvbi0+bWFjaGluZXMuaG9zdC52bWxpbnV4X21hcHNbTUFQX19GVU5DVElPTl07Ci0Jc3RydWN0IGttYXAgKmtlcm5lbF9rbWFwID0gbWFwX19rbWFwKGtlcm5lbF9tYXApOworCXN0cnVjdCBrbWFwICprZXJuZWxfa21hcCA9IGtlcm5lbF9tYXAgPyBtYXBfX2ttYXAoa2VybmVsX21hcCkgOiBOVUxMOwogCiAJaWYgKGtlcm5lbF9tYXAgPT0gTlVMTCB8fAogCSAgICAoa2VybmVsX21hcC0+ZHNvLT5oaXQgJiYKQEAgLTQ4MCw3ICs0ODIsNyBAQAogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sICZyZXAtPnRvb2wpOworCXJldCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbik7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNjY3LDYgKzY2OSwxMCBAQAogCQkgICAib25seSBjb25zaWRlciBzeW1ib2xzIGluIHRoZXNlIGRzb3MiKSwKIAlPUFRfU1RSSU5HKCdjJywgImNvbW1zIiwgJnN5bWJvbF9jb25mLmNvbW1fbGlzdF9zdHIsICJjb21tWyxjb21tLi4uXSIsCiAJCSAgICJvbmx5IGNvbnNpZGVyIHN5bWJvbHMgaW4gdGhlc2UgY29tbXMiKSwKKwlPUFRfU1RSSU5HKDAsICJwaWQiLCAmc3ltYm9sX2NvbmYucGlkX2xpc3Rfc3RyLCAicGlkWyxwaWQuLi5dIiwKKwkJICAgIm9ubHkgY29uc2lkZXIgc3ltYm9scyBpbiB0aGVzZSBwaWRzIiksCisJT1BUX1NUUklORygwLCAidGlkIiwgJnN5bWJvbF9jb25mLnRpZF9saXN0X3N0ciwgInRpZFssdGlkLi4uXSIsCisJCSAgICJvbmx5IGNvbnNpZGVyIHN5bWJvbHMgaW4gdGhlc2UgdGlkcyIpLAogCU9QVF9TVFJJTkcoJ1MnLCAic3ltYm9scyIsICZzeW1ib2xfY29uZi5zeW1fbGlzdF9zdHIsICJzeW1ib2xbLHN5bWJvbC4uLl0iLAogCQkgICAib25seSBjb25zaWRlciB0aGVzZSBzeW1ib2xzIiksCiAJT1BUX1NUUklORygwLCAic3ltYm9sLWZpbHRlciIsICZyZXBvcnQuc3ltYm9sX2ZpbHRlcl9zdHIsICJmaWx0ZXIiLApAQCAtNjc0LDcgKzY4MCw3IEBACiAJT1BUX1NUUklORygndycsICJjb2x1bW4td2lkdGhzIiwgJnN5bWJvbF9jb25mLmNvbF93aWR0aF9saXN0X3N0ciwKIAkJICAgIndpZHRoWyx3aWR0aC4uLl0iLAogCQkgICAiZG9uJ3QgdHJ5IHRvIGFkanVzdCBjb2x1bW4gd2lkdGgsIHVzZSB0aGVzZSBmaXhlZCB2YWx1ZXMiKSwKLQlPUFRfU1RSSU5HKCd0JywgImZpZWxkLXNlcGFyYXRvciIsICZzeW1ib2xfY29uZi5maWVsZF9zZXAsICJzZXBhcmF0b3IiLAorCU9QVF9TVFJJTkdfTk9FTVBUWSgndCcsICJmaWVsZC1zZXBhcmF0b3IiLCAmc3ltYm9sX2NvbmYuZmllbGRfc2VwLCAic2VwYXJhdG9yIiwKIAkJICAgInNlcGFyYXRvciBmb3IgY29sdW1ucywgbm8gc3BhY2VzIHdpbGwgYmUgYWRkZWQgYmV0d2VlbiAiCiAJCSAgICJjb2x1bW5zICcuJyBpcyByZXNlcnZlZC4iKSwKIAlPUFRfQk9PTEVBTignVScsICJoaWRlLXVucmVzb2x2ZWQiLCAmcmVwb3J0LmhpZGVfdW5yZXNvbHZlZCwKQEAgLTc2Niw3ICs3NzIsNyBAQAogCSAqIDAvMSBtZWFucyB0aGUgdXNlciBjaG9zZSBhIG1vZGUuCiAJICovCiAJaWYgKCgoYnJhbmNoX21vZGUgPT0gLTEgJiYgaGFzX2JyX3N0YWNrKSB8fCBicmFuY2hfbW9kZSA9PSAxKSAmJgotCSAgICBicmFuY2hfY2FsbF9tb2RlID09IC0xKSB7CisJICAgICFicmFuY2hfY2FsbF9tb2RlKSB7CiAJCXNvcnRfX21vZGUgPSBTT1JUX01PREVfX0JSQU5DSDsKIAkJc3ltYm9sX2NvbmYuY3VtdWxhdGVfY2FsbGNoYWluID0gZmFsc2U7CiAJfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXNjaGVkLmMgYi90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYwppbmRleCA4OTFjMzkzLi41Mjc1YmFiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYwpAQCAtMjMsMTIgKzIzLDEzIEBACiAjaW5jbHVkZSA8c2VtYXBob3JlLmg+CiAjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxhcGkvZnMvZnMuaD4KIAogI2RlZmluZSBQUl9TRVRfTkFNRQkJMTUgICAgICAgICAgICAgICAvKiBTZXQgcHJvY2VzcyBuYW1lICovCiAjZGVmaW5lIE1BWF9DUFVTCQk0MDk2CiAjZGVmaW5lIENPTU1fTEVOCQkyMAogI2RlZmluZSBTWU1fTEVOCQkJMTI5Ci0jZGVmaW5lIE1BWF9QSUQJCQk2NTUzNgorI2RlZmluZSBNQVhfUElECQkJMTAyNDAwMAogCiBzdHJ1Y3Qgc2NoZWRfYXRvbTsKIApAQCAtMTI0LDcgKzEyNSw3IEBACiAJc3RydWN0IHBlcmZfdG9vbCB0b29sOwogCWNvbnN0IGNoYXIJICpzb3J0X29yZGVyOwogCXVuc2lnbmVkIGxvbmcJIG5yX3Rhc2tzOwotCXN0cnVjdCB0YXNrX2Rlc2MgKnBpZF90b190YXNrW01BWF9QSURdOworCXN0cnVjdCB0YXNrX2Rlc2MgKipwaWRfdG9fdGFzazsKIAlzdHJ1Y3QgdGFza19kZXNjICoqdGFza3M7CiAJY29uc3Qgc3RydWN0IHRyYWNlX3NjaGVkX2hhbmRsZXIgKnRwX2hhbmRsZXI7CiAJcHRocmVhZF9tdXRleF90CSBzdGFydF93b3JrX211dGV4OwpAQCAtMTY5LDYgKzE3MCw3IEBACiAJdTY0CQkgY3B1X2xhc3Rfc3dpdGNoZWRbTUFYX0NQVVNdOwogCXN0cnVjdCByYl9yb290CSBhdG9tX3Jvb3QsIHNvcnRlZF9hdG9tX3Jvb3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBzb3J0X2xpc3QsIGNtcF9waWQ7CisJYm9vbCBmb3JjZTsKIH07CiAKIHN0YXRpYyB1NjQgZ2V0X25zZWNzKHZvaWQpCkBAIC0zMjYsOCArMzI4LDE5IEBACiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBwaWQsIGNvbnN0IGNoYXIgKmNvbW0pCiB7CiAJc3RydWN0IHRhc2tfZGVzYyAqdGFzazsKKwlzdGF0aWMgaW50IHBpZF9tYXg7CiAKLQlCVUdfT04ocGlkID49IE1BWF9QSUQpOworCWlmIChzY2hlZC0+cGlkX3RvX3Rhc2sgPT0gTlVMTCkgeworCQlpZiAoc3lzY3RsX19yZWFkX2ludCgia2VybmVsL3BpZF9tYXgiLCAmcGlkX21heCkgPCAwKQorCQkJcGlkX21heCA9IE1BWF9QSUQ7CisJCUJVR19PTigoc2NoZWQtPnBpZF90b190YXNrID0gY2FsbG9jKHBpZF9tYXgsIHNpemVvZihzdHJ1Y3QgdGFza19kZXNjICopKSkgPT0gTlVMTCk7CisJfQorCWlmIChwaWQgPj0gKHVuc2lnbmVkIGxvbmcpcGlkX21heCkgeworCQlCVUdfT04oKHNjaGVkLT5waWRfdG9fdGFzayA9IHJlYWxsb2Moc2NoZWQtPnBpZF90b190YXNrLCAocGlkICsgMSkgKgorCQkJc2l6ZW9mKHN0cnVjdCB0YXNrX2Rlc2MgKikpKSA9PSBOVUxMKTsKKwkJd2hpbGUgKHBpZCA+PSAodW5zaWduZWQgbG9uZylwaWRfbWF4KQorCQkJc2NoZWQtPnBpZF90b190YXNrW3BpZF9tYXgrK10gPSBOVUxMOworCX0KIAogCXRhc2sgPSBzY2hlZC0+cGlkX3RvX3Rhc2tbcGlkXTsKIApAQCAtMzQ2LDcgKzM1OSw3IEBACiAKIAlzY2hlZC0+cGlkX3RvX3Rhc2tbcGlkXSA9IHRhc2s7CiAJc2NoZWQtPm5yX3Rhc2tzKys7Ci0Jc2NoZWQtPnRhc2tzID0gcmVhbGxvYyhzY2hlZC0+dGFza3MsIHNjaGVkLT5ucl90YXNrcyAqIHNpemVvZihzdHJ1Y3QgdGFza190YXNrICopKTsKKwlzY2hlZC0+dGFza3MgPSByZWFsbG9jKHNjaGVkLT50YXNrcywgc2NoZWQtPm5yX3Rhc2tzICogc2l6ZW9mKHN0cnVjdCB0YXNrX2Rlc2MgKikpOwogCUJVR19PTighc2NoZWQtPnRhc2tzKTsKIAlzY2hlZC0+dGFza3NbdGFzay0+bnJdID0gdGFzazsKIApAQCAtNDI1LDI0ICs0MzgsNDUgQEAKIAlyZXR1cm4gc3VtOwogfQogCi1zdGF0aWMgaW50IHNlbGZfb3Blbl9jb3VudGVycyh2b2lkKQorc3RhdGljIGludCBzZWxmX29wZW5fY291bnRlcnMoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkLCB1bnNpZ25lZCBsb25nIGN1cl90YXNrKQogewogCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0cjsKLQljaGFyIHNidWZbU1RSRVJSX0JVRlNJWkVdOworCWNoYXIgc2J1ZltTVFJFUlJfQlVGU0laRV0sIGluZm9bU1RSRVJSX0JVRlNJWkVdOwogCWludCBmZDsKKwlzdHJ1Y3QgcmxpbWl0IGxpbWl0OworCWJvb2wgbmVlZF9wcml2aWxlZ2UgPSBmYWxzZTsKIAogCW1lbXNldCgmYXR0ciwgMCwgc2l6ZW9mKGF0dHIpKTsKIAogCWF0dHIudHlwZSA9IFBFUkZfVFlQRV9TT0ZUV0FSRTsKIAlhdHRyLmNvbmZpZyA9IFBFUkZfQ09VTlRfU1dfVEFTS19DTE9DSzsKIAorZm9yY2VfYWdhaW46CiAJZmQgPSBzeXNfcGVyZl9ldmVudF9vcGVuKCZhdHRyLCAwLCAtMSwgLTEsCiAJCQkJIHBlcmZfZXZlbnRfb3Blbl9jbG9leGVjX2ZsYWcoKSk7CiAKLQlpZiAoZmQgPCAwKQorCWlmIChmZCA8IDApIHsKKwkJaWYgKGVycm5vID09IEVNRklMRSkgeworCQkJaWYgKHNjaGVkLT5mb3JjZSkgeworCQkJCUJVR19PTihnZXRybGltaXQoUkxJTUlUX05PRklMRSwgJmxpbWl0KSA9PSAtMSk7CisJCQkJbGltaXQucmxpbV9jdXIgKz0gc2NoZWQtPm5yX3Rhc2tzIC0gY3VyX3Rhc2s7CisJCQkJaWYgKGxpbWl0LnJsaW1fY3VyID4gbGltaXQucmxpbV9tYXgpIHsKKwkJCQkJbGltaXQucmxpbV9tYXggPSBsaW1pdC5ybGltX2N1cjsKKwkJCQkJbmVlZF9wcml2aWxlZ2UgPSB0cnVlOworCQkJCX0KKwkJCQlpZiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZsaW1pdCkgPT0gLTEpIHsKKwkJCQkJaWYgKG5lZWRfcHJpdmlsZWdlICYmIGVycm5vID09IEVQRVJNKQorCQkJCQkJc3RyY3B5KGluZm8sICJOZWVkIHByaXZpbGVnZVxuIik7CisJCQkJfSBlbHNlCisJCQkJCWdvdG8gZm9yY2VfYWdhaW47CisJCQl9IGVsc2UKKwkJCQlzdHJjcHkoaW5mbywgIkhhdmUgYSB0cnkgd2l0aCAtZiBvcHRpb25cbiIpOworCQl9CiAJCXByX2VycigiRXJyb3I6IHN5c19wZXJmX2V2ZW50X29wZW4oKSBzeXNjYWxsIHJldHVybmVkICIKLQkJICAgICAgICJ3aXRoICVkICglcylcbiIsIGZkLAotCQkgICAgICAgc3RyZXJyb3JfcihlcnJubywgc2J1Ziwgc2l6ZW9mKHNidWYpKSk7CisJCSAgICAgICAid2l0aCAlZCAoJXMpXG4lcyIsIGZkLAorCQkgICAgICAgc3RyZXJyb3JfcihlcnJubywgc2J1Ziwgc2l6ZW9mKHNidWYpKSwgaW5mbyk7CisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CiAJcmV0dXJuIGZkOwogfQogCkBAIC00NjAsNiArNDk0LDcgQEAKIHN0cnVjdCBzY2hlZF90aHJlYWRfcGFybXMgewogCXN0cnVjdCB0YXNrX2Rlc2MgICp0YXNrOwogCXN0cnVjdCBwZXJmX3NjaGVkICpzY2hlZDsKKwlpbnQgZmQ7CiB9OwogCiBzdGF0aWMgdm9pZCAqdGhyZWFkX2Z1bmModm9pZCAqY3R4KQpAQCAtNDcwLDEzICs1MDUsMTIgQEAKIAl1NjQgY3B1X3VzYWdlXzAsIGNwdV91c2FnZV8xOwogCXVuc2lnbmVkIGxvbmcgaSwgcmV0OwogCWNoYXIgY29tbTJbMjJdOwotCWludCBmZDsKKwlpbnQgZmQgPSBwYXJtcy0+ZmQ7CiAKIAl6ZnJlZSgmcGFybXMpOwogCiAJc3ByaW50Zihjb21tMiwgIjolcyIsIHRoaXNfdGFzay0+Y29tbSk7CiAJcHJjdGwoUFJfU0VUX05BTUUsIGNvbW0yKTsKLQlmZCA9IHNlbGZfb3Blbl9jb3VudGVycygpOwogCWlmIChmZCA8IDApCiAJCXJldHVybiBOVUxMOwogYWdhaW46CkBAIC01MjgsNiArNTYyLDcgQEAKIAkJQlVHX09OKHBhcm1zID09IE5VTEwpOwogCQlwYXJtcy0+dGFzayA9IHRhc2sgPSBzY2hlZC0+dGFza3NbaV07CiAJCXBhcm1zLT5zY2hlZCA9IHNjaGVkOworCQlwYXJtcy0+ZmQgPSBzZWxmX29wZW5fY291bnRlcnMoc2NoZWQsIGkpOwogCQlzZW1faW5pdCgmdGFzay0+c2xlZXBfc2VtLCAwLCAwKTsKIAkJc2VtX2luaXQoJnRhc2stPnJlYWR5X2Zvcl93b3JrLCAwLCAwKTsKIAkJc2VtX2luaXQoJnRhc2stPndvcmtfZG9uZV9zZW0sIDAsIDApOwpAQCAtNTcyLDEzICs2MDcsMTMgQEAKIAljcHVfdXNhZ2VfMSA9IGdldF9jcHVfdXNhZ2VfbnNlY19wYXJlbnQoKTsKIAlpZiAoIXNjaGVkLT5ydW5hdmdfY3B1X3VzYWdlKQogCQlzY2hlZC0+cnVuYXZnX2NwdV91c2FnZSA9IHNjaGVkLT5jcHVfdXNhZ2U7Ci0Jc2NoZWQtPnJ1bmF2Z19jcHVfdXNhZ2UgPSAoc2NoZWQtPnJ1bmF2Z19jcHVfdXNhZ2UgKiA5ICsgc2NoZWQtPmNwdV91c2FnZSkgLyAxMDsKKwlzY2hlZC0+cnVuYXZnX2NwdV91c2FnZSA9IChzY2hlZC0+cnVuYXZnX2NwdV91c2FnZSAqIChzY2hlZC0+cmVwbGF5X3JlcGVhdCAtIDEpICsgc2NoZWQtPmNwdV91c2FnZSkgLyBzY2hlZC0+cmVwbGF5X3JlcGVhdDsKIAogCXNjaGVkLT5wYXJlbnRfY3B1X3VzYWdlID0gY3B1X3VzYWdlXzEgLSBjcHVfdXNhZ2VfMDsKIAlpZiAoIXNjaGVkLT5ydW5hdmdfcGFyZW50X2NwdV91c2FnZSkKIAkJc2NoZWQtPnJ1bmF2Z19wYXJlbnRfY3B1X3VzYWdlID0gc2NoZWQtPnBhcmVudF9jcHVfdXNhZ2U7Ci0Jc2NoZWQtPnJ1bmF2Z19wYXJlbnRfY3B1X3VzYWdlID0gKHNjaGVkLT5ydW5hdmdfcGFyZW50X2NwdV91c2FnZSAqIDkgKwotCQkJCQkgc2NoZWQtPnBhcmVudF9jcHVfdXNhZ2UpLzEwOworCXNjaGVkLT5ydW5hdmdfcGFyZW50X2NwdV91c2FnZSA9IChzY2hlZC0+cnVuYXZnX3BhcmVudF9jcHVfdXNhZ2UgKiAoc2NoZWQtPnJlcGxheV9yZXBlYXQgLSAxKSArCisJCQkJCSBzY2hlZC0+cGFyZW50X2NwdV91c2FnZSkvc2NoZWQtPnJlcGxheV9yZXBlYXQ7CiAKIAlyZXQgPSBwdGhyZWFkX211dGV4X2xvY2soJnNjaGVkLT5zdGFydF93b3JrX211dGV4KTsKIAlCVUdfT04ocmV0KTsKQEAgLTYxMCw3ICs2NDUsNyBAQAogCXNjaGVkLT5zdW1fZmx1Y3QgKz0gZmx1Y3Q7CiAJaWYgKCFzY2hlZC0+cnVuX2F2ZykKIAkJc2NoZWQtPnJ1bl9hdmcgPSBkZWx0YTsKLQlzY2hlZC0+cnVuX2F2ZyA9IChzY2hlZC0+cnVuX2F2ZyAqIDkgKyBkZWx0YSkgLyAxMDsKKwlzY2hlZC0+cnVuX2F2ZyA9IChzY2hlZC0+cnVuX2F2ZyAqIChzY2hlZC0+cmVwbGF5X3JlcGVhdCAtIDEpICsgZGVsdGEpIC8gc2NoZWQtPnJlcGxheV9yZXBlYXQ7CiAKIAlwcmludGYoIiMlLTNsZDogJTAuM2YsICIsIHNjaGVkLT5ucl9ydW5zLCAoZG91YmxlKWRlbHRhIC8gMTAwMDAwMC4wKTsKIApAQCAtODMxLDcgKzg2Niw3IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlhdG9tcy0+dGhyZWFkID0gdGhyZWFkOworCWF0b21zLT50aHJlYWQgPSB0aHJlYWRfX2dldCh0aHJlYWQpOwogCUlOSVRfTElTVF9IRUFEKCZhdG9tcy0+d29ya19saXN0KTsKIAlfX3RocmVhZF9sYXRlbmN5X2luc2VydCgmc2NoZWQtPmF0b21fcm9vdCwgYXRvbXMsICZzY2hlZC0+Y21wX3BpZCk7CiAJcmV0dXJuIDA7CkBAIC0xNDM5LDggKzE0NzQsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcGVyZl9zY2hlZF9fcmVhZF9ldmVudHMoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkLAotCQkJCSAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKipwc2Vzc2lvbikKK3N0YXRpYyBpbnQgcGVyZl9zY2hlZF9fcmVhZF9ldmVudHMoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkKQogewogCWNvbnN0IHN0cnVjdCBwZXJmX2V2c2VsX3N0cl9oYW5kbGVyIGhhbmRsZXJzW10gPSB7CiAJCXsgInNjaGVkOnNjaGVkX3N3aXRjaCIsCSAgICAgIHByb2Nlc3Nfc2NoZWRfc3dpdGNoX2V2ZW50LCB9LApAQCAtMTQ1Myw3ICsxNDg3LDkgQEAKIAlzdHJ1Y3QgcGVyZl9kYXRhX2ZpbGUgZmlsZSA9IHsKIAkJLnBhdGggPSBpbnB1dF9uYW1lLAogCQkubW9kZSA9IFBFUkZfREFUQV9NT0RFX1JFQUQsCisJCS5mb3JjZSA9IHNjaGVkLT5mb3JjZSwKIAl9OworCWludCByYyA9IC0xOwogCiAJc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KCZmaWxlLCBmYWxzZSwgJnNjaGVkLT50b29sKTsKIAlpZiAoc2Vzc2lvbiA9PSBOVUxMKSB7CkBAIC0xNDY3LDI3ICsxNTAzLDIxIEBACiAJCWdvdG8gb3V0X2RlbGV0ZTsKIAogCWlmIChwZXJmX3Nlc3Npb25fX2hhc190cmFjZXMoc2Vzc2lvbiwgInJlY29yZCAtUiIpKSB7Ci0JCWludCBlcnIgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sICZzY2hlZC0+dG9vbCk7CisJCWludCBlcnIgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24pOwogCQlpZiAoZXJyKSB7CiAJCQlwcl9lcnIoIkZhaWxlZCB0byBwcm9jZXNzIGV2ZW50cywgZXJyb3IgJWQiLCBlcnIpOwogCQkJZ290byBvdXRfZGVsZXRlOwogCQl9CiAKLQkJc2NoZWQtPm5yX2V2ZW50cyAgICAgID0gc2Vzc2lvbi0+c3RhdHMubnJfZXZlbnRzWzBdOwotCQlzY2hlZC0+bnJfbG9zdF9ldmVudHMgPSBzZXNzaW9uLT5zdGF0cy50b3RhbF9sb3N0OwotCQlzY2hlZC0+bnJfbG9zdF9jaHVua3MgPSBzZXNzaW9uLT5zdGF0cy5ucl9ldmVudHNbUEVSRl9SRUNPUkRfTE9TVF07CisJCXNjaGVkLT5ucl9ldmVudHMgICAgICA9IHNlc3Npb24tPmV2bGlzdC0+c3RhdHMubnJfZXZlbnRzWzBdOworCQlzY2hlZC0+bnJfbG9zdF9ldmVudHMgPSBzZXNzaW9uLT5ldmxpc3QtPnN0YXRzLnRvdGFsX2xvc3Q7CisJCXNjaGVkLT5ucl9sb3N0X2NodW5rcyA9IHNlc3Npb24tPmV2bGlzdC0+c3RhdHMubnJfZXZlbnRzW1BFUkZfUkVDT1JEX0xPU1RdOwogCX0KIAotCWlmIChwc2Vzc2lvbikKLQkJKnBzZXNzaW9uID0gc2Vzc2lvbjsKLQllbHNlCi0JCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOwotCi0JcmV0dXJuIDA7Ci0KKwlyYyA9IDA7CiBvdXRfZGVsZXRlOgogCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOwotCXJldHVybiAtMTsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyB2b2lkIHByaW50X2JhZF9ldmVudHMoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkKQpAQCAtMTUxNSwxMiArMTU0NSwxMCBAQAogc3RhdGljIGludCBwZXJmX3NjaGVkX19sYXQoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkKQogewogCXN0cnVjdCByYl9ub2RlICpuZXh0OwotCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb247CiAKIAlzZXR1cF9wYWdlcigpOwogCi0JLyogc2F2ZSBzZXNzaW9uIC0tIHJlZmVyZW5jZXMgdG8gdGhyZWFkcyBhcmUgaGVsZCBpbiB3b3JrX2xpc3QgKi8KLQlpZiAocGVyZl9zY2hlZF9fcmVhZF9ldmVudHMoc2NoZWQsICZzZXNzaW9uKSkKKwlpZiAocGVyZl9zY2hlZF9fcmVhZF9ldmVudHMoc2NoZWQpKQogCQlyZXR1cm4gLTE7CiAKIAlwZXJmX3NjaGVkX19zb3J0X2xhdChzY2hlZCk7CkBAIC0xNTM3LDYgKzE1NjUsNyBAQAogCQl3b3JrX2xpc3QgPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3Qgd29ya19hdG9tcywgbm9kZSk7CiAJCW91dHB1dF9sYXRfdGhyZWFkKHNjaGVkLCB3b3JrX2xpc3QpOwogCQluZXh0ID0gcmJfbmV4dChuZXh0KTsKKwkJdGhyZWFkX196cHV0KHdvcmtfbGlzdC0+dGhyZWFkKTsKIAl9CiAKIAlwcmludGYoIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CkBAIC0xNTQ4LDcgKzE1NzcsNiBAQAogCXByaW50X2JhZF9ldmVudHMoc2NoZWQpOwogCXByaW50ZigiXG4iKTsKIAotCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOwogCXJldHVybiAwOwogfQogCkBAIC0xNTU3LDcgKzE1ODUsNyBAQAogCXNjaGVkLT5tYXhfY3B1ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfQ09ORik7CiAKIAlzZXR1cF9wYWdlcigpOwotCWlmIChwZXJmX3NjaGVkX19yZWFkX2V2ZW50cyhzY2hlZCwgTlVMTCkpCisJaWYgKHBlcmZfc2NoZWRfX3JlYWRfZXZlbnRzKHNjaGVkKSkKIAkJcmV0dXJuIC0xOwogCXByaW50X2JhZF9ldmVudHMoc2NoZWQpOwogCXJldHVybiAwOwpAQCAtMTU3Miw3ICsxNjAwLDcgQEAKIAogCXRlc3RfY2FsaWJyYXRpb25zKHNjaGVkKTsKIAotCWlmIChwZXJmX3NjaGVkX19yZWFkX2V2ZW50cyhzY2hlZCwgTlVMTCkpCisJaWYgKHBlcmZfc2NoZWRfX3JlYWRfZXZlbnRzKHNjaGVkKSkKIAkJcmV0dXJuIC0xOwogCiAJcHJpbnRmKCJucl9ydW5fZXZlbnRzOiAgICAgICAgJWxkXG4iLCBzY2hlZC0+bnJfcnVuX2V2ZW50cyk7CkBAIC0xNjkzLDYgKzE3MjEsNyBAQAogCQkgICAgImJlIG1vcmUgdmVyYm9zZSAoc2hvdyBzeW1ib2wgYWRkcmVzcywgZXRjKSIpLAogCU9QVF9CT09MRUFOKCdEJywgImR1bXAtcmF3LXRyYWNlIiwgJmR1bXBfdHJhY2UsCiAJCSAgICAiZHVtcCByYXcgdHJhY2UgaW4gQVNDSUkiKSwKKwlPUFRfQk9PTEVBTignZicsICJmb3JjZSIsICZzY2hlZC5mb3JjZSwgImRvbid0IGNvbXBsYWluLCBkbyBpdCIpLAogCU9QVF9FTkQoKQogCX07CiAJY29uc3Qgc3RydWN0IG9wdGlvbiBzY2hlZF9vcHRpb25zW10gPSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tc2NyaXB0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tc2NyaXB0LmMKaW5kZXggY2UzMDRkZi4uNThmMTBiOCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXNjcmlwdC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYwpAQCAtNDQ2LDkgKzQ0Niw5IEBACiB9CiAKIHN0YXRpYyB2b2lkIHByb2Nlc3NfZXZlbnQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAotCQkJICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKLQkJCSAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsKQorCQkJICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCkKIHsKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSBhbC0+dGhyZWFkOwogCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIgPSAmZXZzZWwtPmF0dHI7CiAKIAlpZiAob3V0cHV0W2F0dHItPnR5cGVdLmZpZWxkcyA9PSAwKQpAQCAtNTQ5LDE0ICs1NDksNiBAQAogCQkJCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQogewogCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOwotCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIHNhbXBsZS0+cGlkLAotCQkJCQkJCXNhbXBsZS0+dGlkKTsKLQotCWlmICh0aHJlYWQgPT0gTlVMTCkgewotCQlwcl9kZWJ1ZygicHJvYmxlbSBwcm9jZXNzaW5nICVkIGV2ZW50LCBza2lwcGluZyBpdC5cbiIsCi0JCQkgZXZlbnQtPmhlYWRlci50eXBlKTsKLQkJcmV0dXJuIC0xOwotCX0KIAogCWlmIChkZWJ1Z19tb2RlKSB7CiAJCWlmIChzYW1wbGUtPnRpbWUgPCBsYXN0X3RpbWVzdGFtcCkgewpAQCAtNTgxLDcgKzU3Myw3IEBACiAJaWYgKGNwdV9saXN0ICYmICF0ZXN0X2JpdChzYW1wbGUtPmNwdSwgY3B1X2JpdG1hcCkpCiAJCXJldHVybiAwOwogCi0Jc2NyaXB0aW5nX29wcy0+cHJvY2Vzc19ldmVudChldmVudCwgc2FtcGxlLCBldnNlbCwgdGhyZWFkLCAmYWwpOworCXNjcmlwdGluZ19vcHMtPnByb2Nlc3NfZXZlbnQoZXZlbnQsIHNhbXBsZSwgZXZzZWwsICZhbCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTgwMCw3ICs3OTIsNyBAQAogCQlzY3JpcHQtPnRvb2wubW1hcDIgPSBwcm9jZXNzX21tYXAyX2V2ZW50OwogCX0KIAotCXJldCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2NyaXB0LT5zZXNzaW9uLCAmc2NyaXB0LT50b29sKTsKKwlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNjcmlwdC0+c2Vzc2lvbik7CiAKIAlpZiAoZGVidWdfbW9kZSkKIAkJcHJfZXJyKCJNaXNvcmRlcmVkIHRpbWVzdGFtcHM6ICUiIFBSSXU2NCAiXG4iLCBucl91bm9yZGVyZWQpOwpAQCAtMTUyMyw2ICsxNTE1LDkgQEAKIAkJCS5vcmRlcmluZ19yZXF1aXJlc190aW1lc3RhbXBzID0gdHJ1ZSwKIAkJfSwKIAl9OworCXN0cnVjdCBwZXJmX2RhdGFfZmlsZSBmaWxlID0geworCQkubW9kZSA9IFBFUkZfREFUQV9NT0RFX1JFQUQsCisJfTsKIAljb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKIAlPUFRfQk9PTEVBTignRCcsICJkdW1wLXJhdy10cmFjZSIsICZkdW1wX3RyYWNlLAogCQkgICAgImR1bXAgcmF3IHRyYWNlIGluIEFTQ0lJIiksCkBAIC0xNTUwLDcgKzE1NDUsNyBAQAogCQkgICAgIldoZW4gcHJpbnRpbmcgc3ltYm9scyBkbyBub3QgZGlzcGxheSBjYWxsIGNoYWluIiksCiAJT1BUX1NUUklORygwLCAic3ltZnMiLCAmc3ltYm9sX2NvbmYuc3ltZnMsICJkaXJlY3RvcnkiLAogCQkgICAgIkxvb2sgZm9yIGZpbGVzIHdpdGggc3ltYm9scyByZWxhdGl2ZSB0byB0aGlzIGRpcmVjdG9yeSIpLAotCU9QVF9DQUxMQkFDSygnZicsICJmaWVsZHMiLCBOVUxMLCAic3RyIiwKKwlPUFRfQ0FMTEJBQ0soJ0YnLCAiZmllbGRzIiwgTlVMTCwgInN0ciIsCiAJCSAgICAgImNvbW1hIHNlcGFyYXRlZCBvdXRwdXQgZmllbGRzIHByZXBlbmQgd2l0aCAndHlwZTonLiAiCiAJCSAgICAgIlZhbGlkIHR5cGVzOiBodyxzdyx0cmFjZSxyYXcuICIKIAkJICAgICAiRmllbGRzOiBjb21tLHRpZCxwaWQsdGltZSxjcHUsZXZlbnQsdHJhY2UsaXAsc3ltLGRzbywiCkBAIC0xNTYyLDYgKzE1NTcsMTAgQEAKIAlPUFRfU1RSSU5HKCdDJywgImNwdSIsICZjcHVfbGlzdCwgImNwdSIsICJsaXN0IG9mIGNwdXMgdG8gcHJvZmlsZSIpLAogCU9QVF9TVFJJTkcoJ2MnLCAiY29tbXMiLCAmc3ltYm9sX2NvbmYuY29tbV9saXN0X3N0ciwgImNvbW1bLGNvbW0uLi5dIiwKIAkJICAgIm9ubHkgZGlzcGxheSBldmVudHMgZm9yIHRoZXNlIGNvbW1zIiksCisJT1BUX1NUUklORygwLCAicGlkIiwgJnN5bWJvbF9jb25mLnBpZF9saXN0X3N0ciwgInBpZFsscGlkLi4uXSIsCisJCSAgICJvbmx5IGNvbnNpZGVyIHN5bWJvbHMgaW4gdGhlc2UgcGlkcyIpLAorCU9QVF9TVFJJTkcoMCwgInRpZCIsICZzeW1ib2xfY29uZi50aWRfbGlzdF9zdHIsICJ0aWRbLHRpZC4uLl0iLAorCQkgICAib25seSBjb25zaWRlciBzeW1ib2xzIGluIHRoZXNlIHRpZHMiKSwKIAlPUFRfQk9PTEVBTignSScsICJzaG93LWluZm8iLCAmc2hvd19mdWxsX2luZm8sCiAJCSAgICAiZGlzcGxheSBleHRlbmRlZCBpbmZvcm1hdGlvbiBmcm9tIHBlcmYuZGF0YSBmaWxlIiksCiAJT1BUX0JPT0xFQU4oJ1wwJywgInNob3cta2VybmVsLXBhdGgiLCAmc3ltYm9sX2NvbmYuc2hvd19rZXJuZWxfcGF0aCwKQEAgLTE1NzAsOSArMTU2OSwxMSBAQAogCQkgICAgIlNob3cgdGhlIGZvcmsvY29tbS9leGl0IGV2ZW50cyIpLAogCU9QVF9CT09MRUFOKCdcMCcsICJzaG93LW1tYXAtZXZlbnRzIiwgJnNjcmlwdC5zaG93X21tYXBfZXZlbnRzLAogCQkgICAgIlNob3cgdGhlIG1tYXAgZXZlbnRzIiksCisJT1BUX0JPT0xFQU4oJ2YnLCAiZm9yY2UiLCAmZmlsZS5mb3JjZSwgImRvbid0IGNvbXBsYWluLCBkbyBpdCIpLAogCU9QVF9FTkQoKQogCX07Ci0JY29uc3QgY2hhciAqIGNvbnN0IHNjcmlwdF91c2FnZVtdID0geworCWNvbnN0IGNoYXIgKiBjb25zdCBzY3JpcHRfc3ViY29tbWFuZHNbXSA9IHsgInJlY29yZCIsICJyZXBvcnQiLCBOVUxMIH07CisJY29uc3QgY2hhciAqc2NyaXB0X3VzYWdlW10gPSB7CiAJCSJwZXJmIHNjcmlwdCBbPG9wdGlvbnM+XSIsCiAJCSJwZXJmIHNjcmlwdCBbPG9wdGlvbnM+XSByZWNvcmQgPHNjcmlwdD4gWzxyZWNvcmQtb3B0aW9ucz5dIDxjb21tYW5kPiIsCiAJCSJwZXJmIHNjcmlwdCBbPG9wdGlvbnM+XSByZXBvcnQgPHNjcmlwdD4gW3NjcmlwdC1hcmdzXSIsCkBAIC0xNTgwLDEzICsxNTgxLDEwIEBACiAJCSJwZXJmIHNjcmlwdCBbPG9wdGlvbnM+XSA8dG9wLXNjcmlwdD4gW3NjcmlwdC1hcmdzXSIsCiAJCU5VTEwKIAl9OwotCXN0cnVjdCBwZXJmX2RhdGFfZmlsZSBmaWxlID0gewotCQkubW9kZSA9IFBFUkZfREFUQV9NT0RFX1JFQUQsCi0JfTsKIAogCXNldHVwX3NjcmlwdGluZygpOwogCi0JYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgc2NyaXB0X3VzYWdlLAorCWFyZ2MgPSBwYXJzZV9vcHRpb25zX3N1YmNvbW1hbmQoYXJnYywgYXJndiwgb3B0aW9ucywgc2NyaXB0X3N1YmNvbW1hbmRzLCBzY3JpcHRfdXNhZ2UsCiAJCQkgICAgIFBBUlNFX09QVF9TVE9QX0FUX05PTl9PUFRJT04pOwogCiAJZmlsZS5wYXRoID0gaW5wdXRfbmFtZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCmluZGV4IGU1OThlNGUuLmY3YjgyMTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYwpAQCAtMzUzLDM5ICszNTMsNDAgQEAKICAqIG1vcmUgc2VtYW50aWMgaW5mb3JtYXRpb24gc3VjaCBhcyBtaXNzL2hpdCByYXRpb3MsCiAgKiBpbnN0cnVjdGlvbiByYXRlcywgZXRjOgogICovCi1zdGF0aWMgdm9pZCB1cGRhdGVfc2hhZG93X3N0YXRzKHN0cnVjdCBwZXJmX2V2c2VsICpjb3VudGVyLCB1NjQgKmNvdW50KQorc3RhdGljIHZvaWQgdXBkYXRlX3NoYWRvd19zdGF0cyhzdHJ1Y3QgcGVyZl9ldnNlbCAqY291bnRlciwgdTY0ICpjb3VudCwKKwkJCQlpbnQgY3B1KQogewogCWlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBTT0ZUV0FSRSwgU1dfVEFTS19DTE9DSykpCi0JCXVwZGF0ZV9zdGF0cygmcnVudGltZV9uc2Vjc19zdGF0c1swXSwgY291bnRbMF0pOworCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfbnNlY3Nfc3RhdHNbY3B1XSwgY291bnRbMF0pOwogCWVsc2UgaWYgKHBlcmZfZXZzZWxfX21hdGNoKGNvdW50ZXIsIEhBUkRXQVJFLCBIV19DUFVfQ1lDTEVTKSkKLQkJdXBkYXRlX3N0YXRzKCZydW50aW1lX2N5Y2xlc19zdGF0c1swXSwgY291bnRbMF0pOworCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfY3ljbGVzX3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIAllbHNlIGlmICh0cmFuc2FjdGlvbl9ydW4gJiYKIAkJIHBlcmZfZXZzZWxfX2NtcChjb3VudGVyLCBudGhfZXZzZWwoVF9DWUNMRVNfSU5fVFgpKSkKLQkJdXBkYXRlX3N0YXRzKCZydW50aW1lX2N5Y2xlc19pbl90eF9zdGF0c1swXSwgY291bnRbMF0pOworCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfY3ljbGVzX2luX3R4X3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIAllbHNlIGlmICh0cmFuc2FjdGlvbl9ydW4gJiYKIAkJIHBlcmZfZXZzZWxfX2NtcChjb3VudGVyLCBudGhfZXZzZWwoVF9UUkFOU0FDVElPTl9TVEFSVCkpKQotCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfdHJhbnNhY3Rpb25fc3RhdHNbMF0sIGNvdW50WzBdKTsKKwkJdXBkYXRlX3N0YXRzKCZydW50aW1lX3RyYW5zYWN0aW9uX3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIAllbHNlIGlmICh0cmFuc2FjdGlvbl9ydW4gJiYKIAkJIHBlcmZfZXZzZWxfX2NtcChjb3VudGVyLCBudGhfZXZzZWwoVF9FTElTSU9OX1NUQVJUKSkpCi0JCXVwZGF0ZV9zdGF0cygmcnVudGltZV9lbGlzaW9uX3N0YXRzWzBdLCBjb3VudFswXSk7CisJCXVwZGF0ZV9zdGF0cygmcnVudGltZV9lbGlzaW9uX3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIAllbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIQVJEV0FSRSwgSFdfU1RBTExFRF9DWUNMRVNfRlJPTlRFTkQpKQotCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfc3RhbGxlZF9jeWNsZXNfZnJvbnRfc3RhdHNbMF0sIGNvdW50WzBdKTsKKwkJdXBkYXRlX3N0YXRzKCZydW50aW1lX3N0YWxsZWRfY3ljbGVzX2Zyb250X3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIAllbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIQVJEV0FSRSwgSFdfU1RBTExFRF9DWUNMRVNfQkFDS0VORCkpCi0JCXVwZGF0ZV9zdGF0cygmcnVudGltZV9zdGFsbGVkX2N5Y2xlc19iYWNrX3N0YXRzWzBdLCBjb3VudFswXSk7CisJCXVwZGF0ZV9zdGF0cygmcnVudGltZV9zdGFsbGVkX2N5Y2xlc19iYWNrX3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIAllbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIQVJEV0FSRSwgSFdfQlJBTkNIX0lOU1RSVUNUSU9OUykpCi0JCXVwZGF0ZV9zdGF0cygmcnVudGltZV9icmFuY2hlc19zdGF0c1swXSwgY291bnRbMF0pOworCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfYnJhbmNoZXNfc3RhdHNbY3B1XSwgY291bnRbMF0pOwogCWVsc2UgaWYgKHBlcmZfZXZzZWxfX21hdGNoKGNvdW50ZXIsIEhBUkRXQVJFLCBIV19DQUNIRV9SRUZFUkVOQ0VTKSkKLQkJdXBkYXRlX3N0YXRzKCZydW50aW1lX2NhY2hlcmVmc19zdGF0c1swXSwgY291bnRbMF0pOworCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfY2FjaGVyZWZzX3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIAllbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIV19DQUNIRSwgSFdfQ0FDSEVfTDFEKSkKLQkJdXBkYXRlX3N0YXRzKCZydW50aW1lX2wxX2RjYWNoZV9zdGF0c1swXSwgY291bnRbMF0pOworCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfbDFfZGNhY2hlX3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIAllbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIV19DQUNIRSwgSFdfQ0FDSEVfTDFJKSkKLQkJdXBkYXRlX3N0YXRzKCZydW50aW1lX2wxX2ljYWNoZV9zdGF0c1swXSwgY291bnRbMF0pOworCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfbDFfaWNhY2hlX3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIAllbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIV19DQUNIRSwgSFdfQ0FDSEVfTEwpKQotCQl1cGRhdGVfc3RhdHMoJnJ1bnRpbWVfbGxfY2FjaGVfc3RhdHNbMF0sIGNvdW50WzBdKTsKKwkJdXBkYXRlX3N0YXRzKCZydW50aW1lX2xsX2NhY2hlX3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIAllbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIV19DQUNIRSwgSFdfQ0FDSEVfRFRMQikpCi0JCXVwZGF0ZV9zdGF0cygmcnVudGltZV9kdGxiX2NhY2hlX3N0YXRzWzBdLCBjb3VudFswXSk7CisJCXVwZGF0ZV9zdGF0cygmcnVudGltZV9kdGxiX2NhY2hlX3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIAllbHNlIGlmIChwZXJmX2V2c2VsX19tYXRjaChjb3VudGVyLCBIV19DQUNIRSwgSFdfQ0FDSEVfSVRMQikpCi0JCXVwZGF0ZV9zdGF0cygmcnVudGltZV9pdGxiX2NhY2hlX3N0YXRzWzBdLCBjb3VudFswXSk7CisJCXVwZGF0ZV9zdGF0cygmcnVudGltZV9pdGxiX2NhY2hlX3N0YXRzW2NwdV0sIGNvdW50WzBdKTsKIH0KIAogc3RhdGljIHZvaWQgemVyb19wZXJfcGtnKHN0cnVjdCBwZXJmX2V2c2VsICpjb3VudGVyKQpAQCAtNDQ3LDcgKzQ0OCw4IEBACiAJCQlwZXJmX2V2c2VsX19jb21wdXRlX2RlbHRhcyhldnNlbCwgY3B1LCBjb3VudCk7CiAJCXBlcmZfY291bnRzX3ZhbHVlc19fc2NhbGUoY291bnQsIHNjYWxlLCBOVUxMKTsKIAkJZXZzZWwtPmNvdW50cy0+Y3B1W2NwdV0gPSAqY291bnQ7Ci0JCXVwZGF0ZV9zaGFkb3dfc3RhdHMoZXZzZWwsIGNvdW50LT52YWx1ZXMpOworCQlpZiAoYWdncl9tb2RlID09IEFHR1JfTk9ORSkKKwkJCXVwZGF0ZV9zaGFkb3dfc3RhdHMoZXZzZWwsIGNvdW50LT52YWx1ZXMsIGNwdSk7CiAJCWJyZWFrOwogCWNhc2UgQUdHUl9HTE9CQUw6CiAJCWFnZ3ItPnZhbCArPSBjb3VudC0+dmFsOwpAQCAtNDk1LDcgKzQ5Nyw3IEBACiAJLyoKIAkgKiBTYXZlIHRoZSBmdWxsIHJ1bnRpbWUgLSB0byBhbGxvdyBub3JtYWxpemF0aW9uIGR1cmluZyBwcmludG91dDoKIAkgKi8KLQl1cGRhdGVfc2hhZG93X3N0YXRzKGNvdW50ZXIsIGNvdW50KTsKKwl1cGRhdGVfc2hhZG93X3N0YXRzKGNvdW50ZXIsIGNvdW50LCAwKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTEwLDYgKzUxMiw5IEBACiAJaW50IG5jcHVzID0gcGVyZl9ldnNlbF9fbnJfY3B1cyhjb3VudGVyKTsKIAlpbnQgY3B1LCB0aHJlYWQ7CiAKKwlpZiAoIWNvdW50ZXItPnN1cHBvcnRlZCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKIAlpZiAoY291bnRlci0+c3lzdGVtX3dpZGUpCiAJCW50aHJlYWRzID0gMTsKIApAQCAtNjc5LDggKzY4NCw5IEBACiAJCQl1bml0X3dpZHRoID0gbDsKIAl9CiAKLQlpZiAocGVyZl9ldmxpc3RfX2FwcGx5X2ZpbHRlcnMoZXZzZWxfbGlzdCkpIHsKLQkJZXJyb3IoImZhaWxlZCB0byBzZXQgZmlsdGVyIHdpdGggJWQgKCVzKVxuIiwgZXJybm8sCisJaWYgKHBlcmZfZXZsaXN0X19hcHBseV9maWx0ZXJzKGV2c2VsX2xpc3QsICZjb3VudGVyKSkgeworCQllcnJvcigiZmFpbGVkIHRvIHNldCBmaWx0ZXIgXCIlc1wiIG9uIGV2ZW50ICVzIHdpdGggJWQgKCVzKVxuIiwKKwkJCWNvdW50ZXItPmZpbHRlciwgcGVyZl9ldnNlbF9fbmFtZShjb3VudGVyKSwgZXJybm8sCiAJCQlzdHJlcnJvcl9yKGVycm5vLCBtc2csIHNpemVvZihtc2cpKSk7CiAJCXJldHVybiAtMTsKIAl9CkBAIC03NjYsNiArNzcyLDE5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgcHJpbnRfcnVubmluZyh1NjQgcnVuLCB1NjQgZW5hKQoreworCWlmIChjc3Zfb3V0cHV0KSB7CisJCWZwcmludGYob3V0cHV0LCAiJXMlIiBQUkl1NjQgIiVzJS4yZiIsCisJCQkJCWNzdl9zZXAsCisJCQkJCXJ1biwKKwkJCQkJY3N2X3NlcCwKKwkJCQkJZW5hID8gMTAwLjAgKiBydW4gLyBlbmEgOiAxMDAuMCk7CisJfSBlbHNlIGlmIChydW4gIT0gZW5hKSB7CisJCWZwcmludGYob3V0cHV0LCAiICAoJS4yZiUlKSIsIDEwMC4wICogcnVuIC8gZW5hKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIHByaW50X25vaXNlX3BjdChkb3VibGUgdG90YWwsIGRvdWJsZSBhdmcpCiB7CiAJZG91YmxlIHBjdCA9IHJlbF9zdGRkZXZfc3RhdHModG90YWwsIGF2Zyk7CkBAIC0xMDc2LDYgKzEwOTUsOCBAQAogCQlpZiAodG90YWwpIHsKIAkJCXJhdGlvID0gYXZnIC8gdG90YWw7CiAJCQlmcHJpbnRmKG91dHB1dCwgIiAjICAgJTUuMmYgIGluc25zIHBlciBjeWNsZSAgICAgICAgIiwgcmF0aW8pOworCQl9IGVsc2UgeworCQkJZnByaW50ZihvdXRwdXQsICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIpOwogCQl9CiAJCXRvdGFsID0gYXZnX3N0YXRzKCZydW50aW1lX3N0YWxsZWRfY3ljbGVzX2Zyb250X3N0YXRzW2NwdV0pOwogCQl0b3RhbCA9IG1heCh0b3RhbCwgYXZnX3N0YXRzKCZydW50aW1lX3N0YWxsZWRfY3ljbGVzX2JhY2tfc3RhdHNbY3B1XSkpOwpAQCAtMTE0NSw2ICsxMTY2LDggQEAKIAkJaWYgKHRvdGFsKSB7CiAJCQlyYXRpbyA9IGF2ZyAvIHRvdGFsOwogCQkJZnByaW50ZihvdXRwdXQsICIgIyAlOC4zZiBHSHogICAgICAgICAgICAgICAgICAgICIsIHJhdGlvKTsKKwkJfSBlbHNlIHsKKwkJCWZwcmludGYob3V0cHV0LCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKIAkJfQogCX0gZWxzZSBpZiAodHJhbnNhY3Rpb25fcnVuICYmCiAJCSAgIHBlcmZfZXZzZWxfX2NtcChldnNlbCwgbnRoX2V2c2VsKFRfQ1lDTEVTX0lOX1RYKSkpIHsKQEAgLTEyNDksNiArMTI3Miw3IEBACiAJCQkJCWZwcmludGYob3V0cHV0LCAiJXMlcyIsCiAJCQkJCQljc3Zfc2VwLCBjb3VudGVyLT5jZ3JwLT5uYW1lKTsKIAorCQkJCXByaW50X3J1bm5pbmcocnVuLCBlbmEpOwogCQkJCWZwdXRjKCdcbicsIG91dHB1dCk7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC0xMjU5LDEzICsxMjgzLDEwIEBACiAJCQllbHNlCiAJCQkJYWJzX3ByaW50b3V0KGlkLCBuciwgY291bnRlciwgdXZhbCk7CiAKLQkJCWlmICghY3N2X291dHB1dCkgeworCQkJaWYgKCFjc3Zfb3V0cHV0KQogCQkJCXByaW50X25vaXNlKGNvdW50ZXIsIDEuMCk7CiAKLQkJCQlpZiAocnVuICE9IGVuYSkKLQkJCQkJZnByaW50ZihvdXRwdXQsICIgICglLjJmJSUpIiwKLQkJCQkJCTEwMC4wICogcnVuIC8gZW5hKTsKLQkJCX0KKwkJCXByaW50X3J1bm5pbmcocnVuLCBlbmEpOwogCQkJZnB1dGMoJ1xuJywgb3V0cHV0KTsKIAkJfQogCX0KQEAgLTEyODEsMTEgKzEzMDIsMTUgQEAKIAlkb3VibGUgYXZnID0gYXZnX3N0YXRzKCZwcy0+cmVzX3N0YXRzWzBdKTsKIAlpbnQgc2NhbGVkID0gY291bnRlci0+Y291bnRzLT5zY2FsZWQ7CiAJZG91YmxlIHV2YWw7CisJZG91YmxlIGF2Z19lbmFibGVkLCBhdmdfcnVubmluZzsKKworCWF2Z19lbmFibGVkID0gYXZnX3N0YXRzKCZwcy0+cmVzX3N0YXRzWzFdKTsKKwlhdmdfcnVubmluZyA9IGF2Z19zdGF0cygmcHMtPnJlc19zdGF0c1syXSk7CiAKIAlpZiAocHJlZml4KQogCQlmcHJpbnRmKG91dHB1dCwgIiVzIiwgcHJlZml4KTsKIAotCWlmIChzY2FsZWQgPT0gLTEpIHsKKwlpZiAoc2NhbGVkID09IC0xIHx8ICFjb3VudGVyLT5zdXBwb3J0ZWQpIHsKIAkJZnByaW50ZihvdXRwdXQsICIlKnMlcyIsCiAJCQljc3Zfb3V0cHV0ID8gMCA6IDE4LAogCQkJY291bnRlci0+c3VwcG9ydGVkID8gQ05UUl9OT1RfQ09VTlRFRCA6IENOVFJfTk9UX1NVUFBPUlRFRCwKQEAgLTEzMDAsNiArMTMyNSw3IEBACiAJCWlmIChjb3VudGVyLT5jZ3JwKQogCQkJZnByaW50ZihvdXRwdXQsICIlcyVzIiwgY3N2X3NlcCwgY291bnRlci0+Y2dycC0+bmFtZSk7CiAKKwkJcHJpbnRfcnVubmluZyhhdmdfcnVubmluZywgYXZnX2VuYWJsZWQpOwogCQlmcHV0YygnXG4nLCBvdXRwdXQpOwogCQlyZXR1cm47CiAJfQpAQCAtMTMxMywxOSArMTMzOSw3IEBACiAKIAlwcmludF9ub2lzZShjb3VudGVyLCBhdmcpOwogCi0JaWYgKGNzdl9vdXRwdXQpIHsKLQkJZnB1dGMoJ1xuJywgb3V0cHV0KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChzY2FsZWQpIHsKLQkJZG91YmxlIGF2Z19lbmFibGVkLCBhdmdfcnVubmluZzsKLQotCQlhdmdfZW5hYmxlZCA9IGF2Z19zdGF0cygmcHMtPnJlc19zdGF0c1sxXSk7Ci0JCWF2Z19ydW5uaW5nID0gYXZnX3N0YXRzKCZwcy0+cmVzX3N0YXRzWzJdKTsKLQotCQlmcHJpbnRmKG91dHB1dCwgIiBbJTUuMmYlJV0iLCAxMDAgKiBhdmdfcnVubmluZyAvIGF2Z19lbmFibGVkKTsKLQl9CisJcHJpbnRfcnVubmluZyhhdmdfcnVubmluZywgYXZnX2VuYWJsZWQpOwogCWZwcmludGYob3V0cHV0LCAiXG4iKTsKIH0KIApAQCAtMTM2Nyw2ICsxMzgxLDcgQEAKIAkJCQlmcHJpbnRmKG91dHB1dCwgIiVzJXMiLAogCQkJCQljc3Zfc2VwLCBjb3VudGVyLT5jZ3JwLT5uYW1lKTsKIAorCQkJcHJpbnRfcnVubmluZyhydW4sIGVuYSk7CiAJCQlmcHV0YygnXG4nLCBvdXRwdXQpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTEzNzgsMTMgKzEzOTMsMTAgQEAKIAkJZWxzZQogCQkJYWJzX3ByaW50b3V0KGNwdSwgMCwgY291bnRlciwgdXZhbCk7CiAKLQkJaWYgKCFjc3Zfb3V0cHV0KSB7CisJCWlmICghY3N2X291dHB1dCkKIAkJCXByaW50X25vaXNlKGNvdW50ZXIsIDEuMCk7CisJCXByaW50X3J1bm5pbmcocnVuLCBlbmEpOwogCi0JCQlpZiAocnVuICE9IGVuYSkKLQkJCQlmcHJpbnRmKG91dHB1dCwgIiAgKCUuMmYlJSkiLAotCQkJCQkxMDAuMCAqIHJ1biAvIGVuYSk7Ci0JCX0KIAkJZnB1dGMoJ1xuJywgb3V0cHV0KTsKIAl9CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKaW5kZXggZjNiYjFhNC4uZTUwZmUxMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYwpAQCAtNjcsNiArNjcsNyBAQAogCQkJCXNraXBfZWFnYWluOwogCXU2NAkJCW1pbl90aW1lLAogCQkJCW1lcmdlX2Rpc3Q7CisJYm9vbAkJCWZvcmNlOwogfTsKIAogc3RydWN0IHBlcl9waWRjb21tOwpAQCAtMTU5OCw2ICsxNTk5LDcgQEAKIAlzdHJ1Y3QgcGVyZl9kYXRhX2ZpbGUgZmlsZSA9IHsKIAkJLnBhdGggPSBpbnB1dF9uYW1lLAogCQkubW9kZSA9IFBFUkZfREFUQV9NT0RFX1JFQUQsCisJCS5mb3JjZSA9IHRjaGFydC0+Zm9yY2UsCiAJfTsKIAogCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gPSBwZXJmX3Nlc3Npb25fX25ldygmZmlsZSwgZmFsc2UsCkBAIC0xNjIzLDcgKzE2MjUsNyBAQAogCQlnb3RvIG91dF9kZWxldGU7CiAJfQogCi0JcmV0ID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCAmdGNoYXJ0LT50b29sKTsKKwlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24pOwogCWlmIChyZXQpCiAJCWdvdG8gb3V0X2RlbGV0ZTsKIApAQCAtMTk1Niw5ICsxOTU4LDExIEBACiAJT1BUX0NBTExCQUNLKDAsICJpby1tZXJnZS1kaXN0IiwgJnRjaGFydC5tZXJnZV9kaXN0LCAidGltZSIsCiAJCSAgICAgIm1lcmdlIGV2ZW50cyB0aGF0IGFyZSBtZXJnZS1kaXN0IHVzIGFwYXJ0IiwKIAkJICAgICBwYXJzZV90aW1lKSwKKwlPUFRfQk9PTEVBTignZicsICJmb3JjZSIsICZ0Y2hhcnQuZm9yY2UsICJkb24ndCBjb21wbGFpbiwgZG8gaXQiKSwKIAlPUFRfRU5EKCkKIAl9OwotCWNvbnN0IGNoYXIgKiBjb25zdCB0aW1lY2hhcnRfdXNhZ2VbXSA9IHsKKwljb25zdCBjaGFyICogY29uc3QgdGltZWNoYXJ0X3N1YmNvbW1hbmRzW10gPSB7ICJyZWNvcmQiLCBOVUxMIH07CisJY29uc3QgY2hhciAqdGltZWNoYXJ0X3VzYWdlW10gPSB7CiAJCSJwZXJmIHRpbWVjaGFydCBbPG9wdGlvbnM+XSB7cmVjb3JkfSIsCiAJCU5VTEwKIAl9OwpAQCAtMTk3Niw4ICsxOTgwLDggQEAKIAkJInBlcmYgdGltZWNoYXJ0IHJlY29yZCBbPG9wdGlvbnM+XSIsCiAJCU5VTEwKIAl9OwotCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIHRpbWVjaGFydF9vcHRpb25zLCB0aW1lY2hhcnRfdXNhZ2UsCi0JCQlQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKTsKKwlhcmdjID0gcGFyc2Vfb3B0aW9uc19zdWJjb21tYW5kKGFyZ2MsIGFyZ3YsIHRpbWVjaGFydF9vcHRpb25zLCB0aW1lY2hhcnRfc3ViY29tbWFuZHMsCisJCQl0aW1lY2hhcnRfdXNhZ2UsIFBBUlNFX09QVF9TVE9QX0FUX05PTl9PUFRJT04pOwogCiAJaWYgKHRjaGFydC5wb3dlcl9vbmx5ICYmIHRjaGFydC50YXNrc19vbmx5KSB7CiAJCXByX2VycigiLVAgYW5kIC1UIG9wdGlvbnMgY2Fubm90IGJlIHVzZWQgYXQgdGhlIHNhbWUgdGltZS5cbiIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCmluZGV4IGM0YzdlYWMuLjFjYjM0MzYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKQEAgLTcxNiw3ICs3MTYsNyBAQAogCiAJaWYgKCFtYWNoaW5lKSB7CiAJCXByX2VycigiJXUgdW5wcm9jZXNzYWJsZSBzYW1wbGVzIHJlY29yZGVkLlxyIiwKLQkJICAgICAgIHRvcC0+c2Vzc2lvbi0+c3RhdHMubnJfdW5wcm9jZXNzYWJsZV9zYW1wbGVzKyspOworCQkgICAgICAgdG9wLT5zZXNzaW9uLT5ldmxpc3QtPnN0YXRzLm5yX3VucHJvY2Vzc2FibGVfc2FtcGxlcysrKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNzU3LDggKzc1NywxMCBAQAogCQkgICAgYWwubWFwID09IG1hY2hpbmUtPnZtbGludXhfbWFwc1tNQVBfX0ZVTkNUSU9OXSAmJgogCQkgICAgUkJfRU1QVFlfUk9PVCgmYWwubWFwLT5kc28tPnN5bWJvbHNbTUFQX19GVU5DVElPTl0pKSB7CiAJCQlpZiAoc3ltYm9sX2NvbmYudm1saW51eF9uYW1lKSB7Ci0JCQkJdWlfX3dhcm5pbmcoIlRoZSAlcyBmaWxlIGNhbid0IGJlIHVzZWQuXG4lcyIsCi0JCQkJCSAgICBzeW1ib2xfY29uZi52bWxpbnV4X25hbWUsIG1zZyk7CisJCQkJY2hhciBzZXJyWzI1Nl07CisJCQkJZHNvX19zdHJlcnJvcl9sb2FkKGFsLm1hcC0+ZHNvLCBzZXJyLCBzaXplb2Yoc2VycikpOworCQkJCXVpX193YXJuaW5nKCJUaGUgJXMgZmlsZSBjYW4ndCBiZSB1c2VkOiAlc1xuJXMiLAorCQkJCQkgICAgc3ltYm9sX2NvbmYudm1saW51eF9uYW1lLCBzZXJyLCBtc2cpOwogCQkJfSBlbHNlIHsKIAkJCQl1aV9fd2FybmluZygiQSB2bWxpbnV4IGZpbGUgd2FzIG5vdCBmb3VuZC5cbiVzIiwKIAkJCQkJICAgIG1zZyk7CkBAIC04NTYsNyArODU4LDcgQEAKIAkJCWhpc3RzX19pbmNfbnJfZXZlbnRzKGV2c2VsX19oaXN0cyhldnNlbCksIGV2ZW50LT5oZWFkZXIudHlwZSk7CiAJCQltYWNoaW5lX19wcm9jZXNzX2V2ZW50KG1hY2hpbmUsIGV2ZW50LCAmc2FtcGxlKTsKIAkJfSBlbHNlCi0JCQkrK3Nlc3Npb24tPnN0YXRzLm5yX3Vua25vd25fZXZlbnRzOworCQkJKytzZXNzaW9uLT5ldmxpc3QtPnN0YXRzLm5yX3Vua25vd25fZXZlbnRzOwogbmV4dF9ldmVudDoKIAkJcGVyZl9ldmxpc3RfX21tYXBfY29uc3VtZSh0b3AtPmV2bGlzdCwgaWR4KTsKIAl9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tdHJhY2UuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10cmFjZS5jCmluZGV4IDdlOTM1ZjEuLmUxMjQ3NDEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10cmFjZS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10cmFjZS5jCkBAIC01Miw3ICs1Miw5IEBACiAjZGVmaW5lIFRQX1VJTlRfRklFTEQoYml0cykgXAogc3RhdGljIHU2NCB0cF9maWVsZF9fdSMjYml0cyhzdHJ1Y3QgdHBfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkgXAogeyBcCi0JcmV0dXJuICoodSMjYml0cyAqKShzYW1wbGUtPnJhd19kYXRhICsgZmllbGQtPm9mZnNldCk7IFwKKwl1IyNiaXRzIHZhbHVlOyBcCisJbWVtY3B5KCZ2YWx1ZSwgc2FtcGxlLT5yYXdfZGF0YSArIGZpZWxkLT5vZmZzZXQsIHNpemVvZih2YWx1ZSkpOyBcCisJcmV0dXJuIHZhbHVlOyAgXAogfQogCiBUUF9VSU5UX0ZJRUxEKDgpOwpAQCAtNjMsNyArNjUsOCBAQAogI2RlZmluZSBUUF9VSU5UX0ZJRUxEX19TV0FQUEVEKGJpdHMpIFwKIHN0YXRpYyB1NjQgdHBfZmllbGRfX3N3YXBwZWRfdSMjYml0cyhzdHJ1Y3QgdHBfZmllbGQgKmZpZWxkLCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkgXAogeyBcCi0JdSMjYml0cyB2YWx1ZSA9ICoodSMjYml0cyAqKShzYW1wbGUtPnJhd19kYXRhICsgZmllbGQtPm9mZnNldCk7IFwKKwl1IyNiaXRzIHZhbHVlOyBcCisJbWVtY3B5KCZ2YWx1ZSwgc2FtcGxlLT5yYXdfZGF0YSArIGZpZWxkLT5vZmZzZXQsIHNpemVvZih2YWx1ZSkpOyBcCiAJcmV0dXJuIGJzd2FwXyMjYml0cyh2YWx1ZSk7XAogfQogCkBAIC0xMTMyLDYgKzExMzUsOCBAQAogCiBzdHJ1Y3Qgc3lzY2FsbCB7CiAJc3RydWN0IGV2ZW50X2Zvcm1hdCAqdHBfZm9ybWF0OworCWludAkJICAgIG5yX2FyZ3M7CisJc3RydWN0IGZvcm1hdF9maWVsZCAqYXJnczsKIAljb25zdCBjaGFyCSAgICAqbmFtZTsKIAlib29sCQkgICAgZmlsdGVyZWQ7CiAJYm9vbAkJICAgIGlzX2V4aXQ7CkBAIC0xMjE5LDcgKzEyMjQsOSBAQAogCQlzdHJ1Y3Qgc3lzY2FsbCAgKnRhYmxlOwogCX0gc3lzY2FsbHM7CiAJc3RydWN0IHJlY29yZF9vcHRzCW9wdHM7CisJc3RydWN0IHBlcmZfZXZsaXN0CSpldmxpc3Q7CiAJc3RydWN0IG1hY2hpbmUJCSpob3N0OworCXN0cnVjdCB0aHJlYWQJCSpjdXJyZW50OwogCXU2NAkJCWJhc2VfdGltZTsKIAlGSUxFCQkJKm91dHB1dDsKIAl1bnNpZ25lZCBsb25nCQlucl9ldmVudHM7CkBAIC0xMjI3LDYgKzEyMzQsMTAgQEAKIAljb25zdCBjaGFyIAkJKmxhc3RfdmZzX2dldG5hbWU7CiAJc3RydWN0IGludGxpc3QJCSp0aWRfbGlzdDsKIAlzdHJ1Y3QgaW50bGlzdAkJKnBpZF9saXN0OworCXN0cnVjdCB7CisJCXNpemVfdAkJbnI7CisJCXBpZF90CQkqZW50cmllczsKKwl9CQkJZmlsdGVyX3BpZHM7CiAJZG91YmxlCQkJZHVyYXRpb25fZmlsdGVyOwogCWRvdWJsZQkJCXJ1bnRpbWVfbXM7CiAJc3RydWN0IHsKQEAgLTEyNDMsNiArMTI1NCw3IEBACiAJYm9vbAkJCXNob3dfY29tbTsKIAlib29sCQkJc2hvd190b29sX3N0YXRzOwogCWJvb2wJCQl0cmFjZV9zeXNjYWxsczsKKwlib29sCQkJZm9yY2U7CiAJaW50CQkJdHJhY2VfcGdmYXVsdHM7CiB9OwogCkBAIC0xNDMzLDE0ICsxNDQ1LDE0IEBACiAJc3RydWN0IGZvcm1hdF9maWVsZCAqZmllbGQ7CiAJaW50IGlkeCA9IDA7CiAKLQlzYy0+YXJnX3NjbnByaW50ZiA9IGNhbGxvYyhzYy0+dHBfZm9ybWF0LT5mb3JtYXQubnJfZmllbGRzIC0gMSwgc2l6ZW9mKHZvaWQgKikpOworCXNjLT5hcmdfc2NucHJpbnRmID0gY2FsbG9jKHNjLT5ucl9hcmdzLCBzaXplb2Yodm9pZCAqKSk7CiAJaWYgKHNjLT5hcmdfc2NucHJpbnRmID09IE5VTEwpCiAJCXJldHVybiAtMTsKIAogCWlmIChzYy0+Zm10KQogCQlzYy0+YXJnX3Bhcm0gPSBzYy0+Zm10LT5hcmdfcGFybTsKIAotCWZvciAoZmllbGQgPSBzYy0+dHBfZm9ybWF0LT5mb3JtYXQuZmllbGRzLT5uZXh0OyBmaWVsZDsgZmllbGQgPSBmaWVsZC0+bmV4dCkgeworCWZvciAoZmllbGQgPSBzYy0+YXJnczsgZmllbGQ7IGZpZWxkID0gZmllbGQtPm5leHQpIHsKIAkJaWYgKHNjLT5mbXQgJiYgc2MtPmZtdC0+YXJnX3NjbnByaW50ZltpZHhdKQogCQkJc2MtPmFyZ19zY25wcmludGZbaWR4XSA9IHNjLT5mbXQtPmFyZ19zY25wcmludGZbaWR4XTsKIAkJZWxzZSBpZiAoZmllbGQtPmZsYWdzICYgRklFTERfSVNfUE9JTlRFUikKQEAgLTE1MDYsMTggKzE1MTgsMzcgQEAKIAlpZiAoc2MtPnRwX2Zvcm1hdCA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAKKwlzYy0+YXJncyA9IHNjLT50cF9mb3JtYXQtPmZvcm1hdC5maWVsZHM7CisJc2MtPm5yX2FyZ3MgPSBzYy0+dHBfZm9ybWF0LT5mb3JtYXQubnJfZmllbGRzOworCS8qIGRyb3AgbnIgZmllbGQgLSBub3QgcmVsZXZhbnQgaGVyZTsgZG9lcyBub3QgZXhpc3Qgb24gb2xkZXIga2VybmVscyAqLworCWlmIChzYy0+YXJncyAmJiBzdHJjbXAoc2MtPmFyZ3MtPm5hbWUsICJuciIpID09IDApIHsKKwkJc2MtPmFyZ3MgPSBzYy0+YXJncy0+bmV4dDsKKwkJLS1zYy0+bnJfYXJnczsKKwl9CisKIAlzYy0+aXNfZXhpdCA9ICFzdHJjbXAobmFtZSwgImV4aXRfZ3JvdXAiKSB8fCAhc3RyY21wKG5hbWUsICJleGl0Iik7CiAKIAlyZXR1cm4gc3lzY2FsbF9fc2V0X2FyZ19mbXRzKHNjKTsKIH0KIAorLyoKKyAqIGFyZ3MgaXMgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSBzZXJpZXMgb2YgbG9uZ3MgYnV0IHdlIG5lZWQgdG8gaGFuZGxlCisgKiA4LWJ5dGUgdW5hbGlnbmVkIGFjY2Vzc2VzLiBhcmdzIHBvaW50cyB0byByYXdfZGF0YSB3aXRoaW4gdGhlIGV2ZW50CisgKiBhbmQgcmF3X2RhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSA4LWJ5dGUgdW5hbGlnbmVkIGJlY2F1c2UgaXQgaXMKKyAqIHByZWNlZGVkIGJ5IHJhd19zaXplIHdoaWNoIGlzIGEgdTMyLiBTbyB3ZSBuZWVkIHRvIGNvcHkgYXJncyB0byBhIHRlbXAKKyAqIHZhcmlhYmxlIHRvIHJlYWQgaXQuIE1vc3Qgbm90YWJseSB0aGlzIGF2b2lkcyBleHRlbmRlZCBsb2FkIGluc3RydWN0aW9ucworICogb24gdW5hbGlnbmVkIGFkZHJlc3NlcworICovCisKIHN0YXRpYyBzaXplX3Qgc3lzY2FsbF9fc2NucHJpbnRmX2FyZ3Moc3RydWN0IHN5c2NhbGwgKnNjLCBjaGFyICpiZiwgc2l6ZV90IHNpemUsCi0JCQkJICAgICAgdW5zaWduZWQgbG9uZyAqYXJncywgc3RydWN0IHRyYWNlICp0cmFjZSwKKwkJCQkgICAgICB1bnNpZ25lZCBjaGFyICphcmdzLCBzdHJ1Y3QgdHJhY2UgKnRyYWNlLAogCQkJCSAgICAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKIAlzaXplX3QgcHJpbnRlZCA9IDA7CisJdW5zaWduZWQgY2hhciAqcDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKIAotCWlmIChzYy0+dHBfZm9ybWF0ICE9IE5VTEwpIHsKKwlpZiAoc2MtPmFyZ3MgIT0gTlVMTCkgewogCQlzdHJ1Y3QgZm9ybWF0X2ZpZWxkICpmaWVsZDsKIAkJdTggYml0ID0gMTsKIAkJc3RydWN0IHN5c2NhbGxfYXJnIGFyZyA9IHsKQEAgLTE1MjcsMTYgKzE1NTgsMjEgQEAKIAkJCS50aHJlYWQgPSB0aHJlYWQsCiAJCX07CiAKLQkJZm9yIChmaWVsZCA9IHNjLT50cF9mb3JtYXQtPmZvcm1hdC5maWVsZHMtPm5leHQ7IGZpZWxkOworCQlmb3IgKGZpZWxkID0gc2MtPmFyZ3M7IGZpZWxkOwogCQkgICAgIGZpZWxkID0gZmllbGQtPm5leHQsICsrYXJnLmlkeCwgYml0IDw8PSAxKSB7CiAJCQlpZiAoYXJnLm1hc2sgJiBiaXQpCiAJCQkJY29udGludWU7CisKKwkJCS8qIHNwZWNpYWwgY2FyZSBmb3IgdW5hbGlnbmVkIGFjY2Vzc2VzICovCisJCQlwID0gYXJncyArIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIGFyZy5pZHg7CisJCQltZW1jcHkoJnZhbCwgcCwgc2l6ZW9mKHZhbCkpOworCiAJCQkvKgogIAkJCSAqIFN1cHByZXNzIHRoaXMgYXJndW1lbnQgaWYgaXRzIHZhbHVlIGlzIHplcm8gYW5kCiAgCQkJICogYW5kIHdlIGRvbid0IGhhdmUgYSBzdHJpbmcgYXNzb2NpYXRlZCBpbiBhbgogIAkJCSAqIHN0cmFycmF5IGZvciBpdC4KICAJCQkgKi8KLQkJCWlmIChhcmdzW2FyZy5pZHhdID09IDAgJiYKKwkJCWlmICh2YWwgPT0gMCAmJgogCQkJICAgICEoc2MtPmFyZ19zY25wcmludGYgJiYKIAkJCSAgICAgIHNjLT5hcmdfc2NucHJpbnRmW2FyZy5pZHhdID09IFNDQV9TVFJBUlJBWSAmJgogCQkJICAgICAgc2MtPmFyZ19wYXJtW2FyZy5pZHhdKSkKQEAgLTE1NDUsMjMgKzE1ODEsMjYgQEAKIAkJCXByaW50ZWQgKz0gc2NucHJpbnRmKGJmICsgcHJpbnRlZCwgc2l6ZSAtIHByaW50ZWQsCiAJCQkJCSAgICAgIiVzJXM6ICIsIHByaW50ZWQgPyAiLCAiIDogIiIsIGZpZWxkLT5uYW1lKTsKIAkJCWlmIChzYy0+YXJnX3NjbnByaW50ZiAmJiBzYy0+YXJnX3NjbnByaW50ZlthcmcuaWR4XSkgewotCQkJCWFyZy52YWwgPSBhcmdzW2FyZy5pZHhdOworCQkJCWFyZy52YWwgPSB2YWw7CiAJCQkJaWYgKHNjLT5hcmdfcGFybSkKIAkJCQkJYXJnLnBhcm0gPSBzYy0+YXJnX3Bhcm1bYXJnLmlkeF07CiAJCQkJcHJpbnRlZCArPSBzYy0+YXJnX3NjbnByaW50ZlthcmcuaWR4XShiZiArIHByaW50ZWQsCiAJCQkJCQkJCSAgICAgIHNpemUgLSBwcmludGVkLCAmYXJnKTsKIAkJCX0gZWxzZSB7CiAJCQkJcHJpbnRlZCArPSBzY25wcmludGYoYmYgKyBwcmludGVkLCBzaXplIC0gcHJpbnRlZCwKLQkJCQkJCSAgICAgIiVsZCIsIGFyZ3NbYXJnLmlkeF0pOworCQkJCQkJICAgICAiJWxkIiwgdmFsKTsKIAkJCX0KIAkJfQogCX0gZWxzZSB7CiAJCWludCBpID0gMDsKIAogCQl3aGlsZSAoaSA8IDYpIHsKKwkJCS8qIHNwZWNpYWwgY2FyZSBmb3IgdW5hbGlnbmVkIGFjY2Vzc2VzICovCisJCQlwID0gYXJncyArIHNpemVvZih1bnNpZ25lZCBsb25nKSAqIGk7CisJCQltZW1jcHkoJnZhbCwgcCwgc2l6ZW9mKHZhbCkpOwogCQkJcHJpbnRlZCArPSBzY25wcmludGYoYmYgKyBwcmludGVkLCBzaXplIC0gcHJpbnRlZCwKIAkJCQkJICAgICAiJXNhcmclZDogJWxkIiwKLQkJCQkJICAgICBwcmludGVkID8gIiwgIiA6ICIiLCBpLCBhcmdzW2ldKTsKKwkJCQkJICAgICBwcmludGVkID8gIiwgIiA6ICIiLCBpLCB2YWwpOwogCQkJKytpOwogCQl9CiAJfQpAQCAtMTY0Miw2ICsxNjgxLDI5IEBACiAJdXBkYXRlX3N0YXRzKHN0YXRzLCBkdXJhdGlvbik7CiB9CiAKK3N0YXRpYyBpbnQgdHJhY2VfX3ByaW50Zl9pbnRlcnJ1cHRlZF9lbnRyeShzdHJ1Y3QgdHJhY2UgKnRyYWNlLCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKK3sKKwlzdHJ1Y3QgdGhyZWFkX3RyYWNlICp0dHJhY2U7CisJdTY0IGR1cmF0aW9uOworCXNpemVfdCBwcmludGVkOworCisJaWYgKHRyYWNlLT5jdXJyZW50ID09IE5VTEwpCisJCXJldHVybiAwOworCisJdHRyYWNlID0gdGhyZWFkX19wcml2KHRyYWNlLT5jdXJyZW50KTsKKworCWlmICghdHRyYWNlLT5lbnRyeV9wZW5kaW5nKQorCQlyZXR1cm4gMDsKKworCWR1cmF0aW9uID0gc2FtcGxlLT50aW1lIC0gdHRyYWNlLT5lbnRyeV90aW1lOworCisJcHJpbnRlZCAgPSB0cmFjZV9fZnByaW50Zl9lbnRyeV9oZWFkKHRyYWNlLCB0cmFjZS0+Y3VycmVudCwgZHVyYXRpb24sIHNhbXBsZS0+dGltZSwgdHJhY2UtPm91dHB1dCk7CisJcHJpbnRlZCArPSBmcHJpbnRmKHRyYWNlLT5vdXRwdXQsICIlLTcwcykgLi4uXG4iLCB0dHJhY2UtPmVudHJ5X3N0cik7CisJdHRyYWNlLT5lbnRyeV9wZW5kaW5nID0gZmFsc2U7CisKKwlyZXR1cm4gcHJpbnRlZDsKK30KKwogc3RhdGljIGludCB0cmFjZV9fc3lzX2VudGVyKHN0cnVjdCB0cmFjZSAqdHJhY2UsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKIAkJCSAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCBfX21heWJlX3VudXNlZCwKIAkJCSAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKQEAgLTE2NzMsNiArMTczNSw5IEBACiAJCQlyZXR1cm4gLTE7CiAJfQogCisJaWYgKCF0cmFjZS0+c3VtbWFyeV9vbmx5KQorCQl0cmFjZV9fcHJpbnRmX2ludGVycnVwdGVkX2VudHJ5KHRyYWNlLCBzYW1wbGUpOworCiAJdHRyYWNlLT5lbnRyeV90aW1lID0gc2FtcGxlLT50aW1lOwogCW1zZyA9IHR0cmFjZS0+ZW50cnlfc3RyOwogCXByaW50ZWQgKz0gc2NucHJpbnRmKG1zZyArIHByaW50ZWQsIDEwMjQgLSBwcmludGVkLCAiJXMoIiwgc2MtPm5hbWUpOwpAQCAtMTY4OCw2ICsxNzUzLDExIEBACiAJfSBlbHNlCiAJCXR0cmFjZS0+ZW50cnlfcGVuZGluZyA9IHRydWU7CiAKKwlpZiAodHJhY2UtPmN1cnJlbnQgIT0gdGhyZWFkKSB7CisJCXRocmVhZF9fcHV0KHRyYWNlLT5jdXJyZW50KTsKKwkJdHJhY2UtPmN1cnJlbnQgPSB0aHJlYWRfX2dldCh0aHJlYWQpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xODA1LDYgKzE4NzUsMjggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0cmFjZV9fZXZlbnRfaGFuZGxlcihzdHJ1Y3QgdHJhY2UgKnRyYWNlLCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQgX19tYXliZV91bnVzZWQsCisJCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUpCit7CisJdHJhY2VfX3ByaW50Zl9pbnRlcnJ1cHRlZF9lbnRyeSh0cmFjZSwgc2FtcGxlKTsKKwl0cmFjZV9fZnByaW50Zl90c3RhbXAodHJhY2UsIHNhbXBsZS0+dGltZSwgdHJhY2UtPm91dHB1dCk7CisKKwlpZiAodHJhY2UtPnRyYWNlX3N5c2NhbGxzKQorCQlmcHJpbnRmKHRyYWNlLT5vdXRwdXQsICIoICAgICAgICAgKTogIik7CisKKwlmcHJpbnRmKHRyYWNlLT5vdXRwdXQsICIlczoiLCBldnNlbC0+bmFtZSk7CisKKwlpZiAoZXZzZWwtPnRwX2Zvcm1hdCkgeworCQlldmVudF9mb3JtYXRfX2ZwcmludGYoZXZzZWwtPnRwX2Zvcm1hdCwgc2FtcGxlLT5jcHUsCisJCQkJICAgICAgc2FtcGxlLT5yYXdfZGF0YSwgc2FtcGxlLT5yYXdfc2l6ZSwKKwkJCQkgICAgICB0cmFjZS0+b3V0cHV0KTsKKwl9CisKKwlmcHJpbnRmKHRyYWNlLT5vdXRwdXQsICIpXG4iKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgcHJpbnRfbG9jYXRpb24oRklMRSAqZiwgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCiAJCQkgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCiAJCQkgICBib29sIHByaW50X2RzbywgYm9vbCBwcmludF9zeW0pCkBAIC0yMDM3LDEwICsyMTI5LDM5IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHRyYWNlX19oYW5kbGVfZXZlbnQoc3RydWN0IHRyYWNlICp0cmFjZSwgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlKQoreworCWNvbnN0IHUzMiB0eXBlID0gZXZlbnQtPmhlYWRlci50eXBlOworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKworCWlmICghdHJhY2UtPmZ1bGxfdGltZSAmJiB0cmFjZS0+YmFzZV90aW1lID09IDApCisJCXRyYWNlLT5iYXNlX3RpbWUgPSBzYW1wbGUtPnRpbWU7CisKKwlpZiAodHlwZSAhPSBQRVJGX1JFQ09SRF9TQU1QTEUpIHsKKwkJdHJhY2VfX3Byb2Nlc3NfZXZlbnQodHJhY2UsIHRyYWNlLT5ob3N0LCBldmVudCwgc2FtcGxlKTsKKwkJcmV0dXJuOworCX0KKworCWV2c2VsID0gcGVyZl9ldmxpc3RfX2lkMmV2c2VsKHRyYWNlLT5ldmxpc3QsIHNhbXBsZS0+aWQpOworCWlmIChldnNlbCA9PSBOVUxMKSB7CisJCWZwcmludGYodHJhY2UtPm91dHB1dCwgIlVua25vd24gdHAgSUQgJSIgUFJJdTY0ICIsIHNraXBwaW5nLi4uXG4iLCBzYW1wbGUtPmlkKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChldnNlbC0+YXR0ci50eXBlID09IFBFUkZfVFlQRV9UUkFDRVBPSU5UICYmCisJICAgIHNhbXBsZS0+cmF3X2RhdGEgPT0gTlVMTCkgeworCQlmcHJpbnRmKHRyYWNlLT5vdXRwdXQsICIlcyBzYW1wbGUgd2l0aCBubyBwYXlsb2FkIGZvciB0aWQ6ICVkLCBjcHUgJWQsIHJhd19zaXplPSVkLCBza2lwcGluZy4uLlxuIiwKKwkJICAgICAgIHBlcmZfZXZzZWxfX25hbWUoZXZzZWwpLCBzYW1wbGUtPnRpZCwKKwkJICAgICAgIHNhbXBsZS0+Y3B1LCBzYW1wbGUtPnJhd19zaXplKTsKKwl9IGVsc2UgeworCQl0cmFjZXBvaW50X2hhbmRsZXIgaGFuZGxlciA9IGV2c2VsLT5oYW5kbGVyOworCQloYW5kbGVyKHRyYWNlLCBldnNlbCwgZXZlbnQsIHNhbXBsZSk7CisJfQorfQorCiBzdGF0aWMgaW50IHRyYWNlX19ydW4oc3RydWN0IHRyYWNlICp0cmFjZSwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQogewotCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0ID0gcGVyZl9ldmxpc3RfX25ldygpOwotCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKwlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCA9IHRyYWNlLT5ldmxpc3Q7CiAJaW50IGVyciA9IC0xLCBpOwogCXVuc2lnbmVkIGxvbmcgYmVmb3JlOwogCWNvbnN0IGJvb2wgZm9ya3MgPSBhcmdjID4gMDsKQEAgLTIwNDgsMTEgKzIxNjksNiBAQAogCiAJdHJhY2UtPmxpdmUgPSB0cnVlOwogCi0JaWYgKGV2bGlzdCA9PSBOVUxMKSB7Ci0JCWZwcmludGYodHJhY2UtPm91dHB1dCwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJ1biFcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlpZiAodHJhY2UtPnRyYWNlX3N5c2NhbGxzICYmCiAJICAgIHBlcmZfZXZsaXN0X19hZGRfc3lzY2FsbF9uZXd0cChldmxpc3QsIHRyYWNlX19zeXNfZW50ZXIsCiAJCQkJCSAgIHRyYWNlX19zeXNfZXhpdCkpCkBAIC0yMTA1LDE2ICsyMjIxLDM0IEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X2Vycm9yX29wZW47CiAKKwkvKgorCSAqIEJldHRlciBub3QgdXNlICF0YXJnZXRfX2hhc190YXNrKCkgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gY292ZXIgdGhlCisJICogY2FzZSB3aGVyZSBubyB0aHJlYWRzIHdlcmUgc3BlY2lmaWVkIGluIHRoZSBjb21tYW5kIGxpbmUsIGJ1dCBhCisJICogd29ya2xvYWQgd2FzLCBhbmQgaW4gdGhhdCBjYXNlIHdlIHdpbGwgZmlsbCBpbiB0aGUgdGhyZWFkX21hcCB3aGVuCisJICogd2UgZm9yayB0aGUgd29ya2xvYWQgaW4gcGVyZl9ldmxpc3RfX3ByZXBhcmVfd29ya2xvYWQuCisJICovCisJaWYgKHRyYWNlLT5maWx0ZXJfcGlkcy5uciA+IDApCisJCWVyciA9IHBlcmZfZXZsaXN0X19zZXRfZmlsdGVyX3BpZHMoZXZsaXN0LCB0cmFjZS0+ZmlsdGVyX3BpZHMubnIsIHRyYWNlLT5maWx0ZXJfcGlkcy5lbnRyaWVzKTsKKwllbHNlIGlmIChldmxpc3QtPnRocmVhZHMtPm1hcFswXSA9PSAtMSkKKwkJZXJyID0gcGVyZl9ldmxpc3RfX3NldF9maWx0ZXJfcGlkKGV2bGlzdCwgZ2V0cGlkKCkpOworCisJaWYgKGVyciA8IDApIHsKKwkJcHJpbnRmKCJlcnI9JWQsJXNcbiIsIC1lcnIsIHN0cmVycm9yKC1lcnIpKTsKKwkJZXhpdCgxKTsKKwl9CisKIAllcnIgPSBwZXJmX2V2bGlzdF9fbW1hcChldmxpc3QsIHRyYWNlLT5vcHRzLm1tYXBfcGFnZXMsIGZhbHNlKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBvdXRfZXJyb3JfbW1hcDsKIAotCXBlcmZfZXZsaXN0X19lbmFibGUoZXZsaXN0KTsKLQogCWlmIChmb3JrcykKIAkJcGVyZl9ldmxpc3RfX3N0YXJ0X3dvcmtsb2FkKGV2bGlzdCk7CisJZWxzZQorCQlwZXJmX2V2bGlzdF9fZW5hYmxlKGV2bGlzdCk7CiAKLQl0cmFjZS0+bXVsdGlwbGVfdGhyZWFkcyA9IGV2bGlzdC0+dGhyZWFkcy0+bWFwWzBdID09IC0xIHx8IGV2bGlzdC0+dGhyZWFkcy0+bnIgPiAxOworCXRyYWNlLT5tdWx0aXBsZV90aHJlYWRzID0gZXZsaXN0LT50aHJlYWRzLT5tYXBbMF0gPT0gLTEgfHwKKwkJCQkgIGV2bGlzdC0+dGhyZWFkcy0+bnIgPiAxIHx8CisJCQkJICBwZXJmX2V2bGlzdF9fZmlyc3QoZXZsaXN0KS0+YXR0ci5pbmhlcml0OwogYWdhaW46CiAJYmVmb3JlID0gdHJhY2UtPm5yX2V2ZW50czsKIApAQCAtMjEyMiw4ICsyMjU2LDYgQEAKIAkJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQ7CiAKIAkJd2hpbGUgKChldmVudCA9IHBlcmZfZXZsaXN0X19tbWFwX3JlYWQoZXZsaXN0LCBpKSkgIT0gTlVMTCkgewotCQkJY29uc3QgdTMyIHR5cGUgPSBldmVudC0+aGVhZGVyLnR5cGU7Ci0JCQl0cmFjZXBvaW50X2hhbmRsZXIgaGFuZGxlcjsKIAkJCXN0cnVjdCBwZXJmX3NhbXBsZSBzYW1wbGU7CiAKIAkJCSsrdHJhY2UtPm5yX2V2ZW50czsKQEAgLTIxMzQsMzAgKzIyNjYsNyBAQAogCQkJCWdvdG8gbmV4dF9ldmVudDsKIAkJCX0KIAotCQkJaWYgKCF0cmFjZS0+ZnVsbF90aW1lICYmIHRyYWNlLT5iYXNlX3RpbWUgPT0gMCkKLQkJCQl0cmFjZS0+YmFzZV90aW1lID0gc2FtcGxlLnRpbWU7Ci0KLQkJCWlmICh0eXBlICE9IFBFUkZfUkVDT1JEX1NBTVBMRSkgewotCQkJCXRyYWNlX19wcm9jZXNzX2V2ZW50KHRyYWNlLCB0cmFjZS0+aG9zdCwgZXZlbnQsICZzYW1wbGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlldnNlbCA9IHBlcmZfZXZsaXN0X19pZDJldnNlbChldmxpc3QsIHNhbXBsZS5pZCk7Ci0JCQlpZiAoZXZzZWwgPT0gTlVMTCkgewotCQkJCWZwcmludGYodHJhY2UtPm91dHB1dCwgIlVua25vd24gdHAgSUQgJSIgUFJJdTY0ICIsIHNraXBwaW5nLi4uXG4iLCBzYW1wbGUuaWQpOwotCQkJCWdvdG8gbmV4dF9ldmVudDsKLQkJCX0KLQotCQkJaWYgKGV2c2VsLT5hdHRyLnR5cGUgPT0gUEVSRl9UWVBFX1RSQUNFUE9JTlQgJiYKLQkJCSAgICBzYW1wbGUucmF3X2RhdGEgPT0gTlVMTCkgewotCQkJCWZwcmludGYodHJhY2UtPm91dHB1dCwgIiVzIHNhbXBsZSB3aXRoIG5vIHBheWxvYWQgZm9yIHRpZDogJWQsIGNwdSAlZCwgcmF3X3NpemU9JWQsIHNraXBwaW5nLi4uXG4iLAotCQkJCSAgICAgICBwZXJmX2V2c2VsX19uYW1lKGV2c2VsKSwgc2FtcGxlLnRpZCwKLQkJCQkgICAgICAgc2FtcGxlLmNwdSwgc2FtcGxlLnJhd19zaXplKTsKLQkJCQlnb3RvIG5leHRfZXZlbnQ7Ci0JCQl9Ci0KLQkJCWhhbmRsZXIgPSBldnNlbC0+aGFuZGxlcjsKLQkJCWhhbmRsZXIodHJhY2UsIGV2c2VsLCBldmVudCwgJnNhbXBsZSk7CisJCQl0cmFjZV9faGFuZGxlX2V2ZW50KHRyYWNlLCBldmVudCwgJnNhbXBsZSk7CiBuZXh0X2V2ZW50OgogCQkJcGVyZl9ldmxpc3RfX21tYXBfY29uc3VtZShldmxpc3QsIGkpOwogCkBAIC0yMTgwLDYgKzIyODksOCBAQAogCX0KIAogb3V0X2Rpc2FibGU6CisJdGhyZWFkX196cHV0KHRyYWNlLT5jdXJyZW50KTsKKwogCXBlcmZfZXZsaXN0X19kaXNhYmxlKGV2bGlzdCk7CiAKIAlpZiAoIWVycikgewpAQCAtMjE5Nyw3ICsyMzA4LDcgQEAKIAogb3V0X2RlbGV0ZV9ldmxpc3Q6CiAJcGVyZl9ldmxpc3RfX2RlbGV0ZShldmxpc3QpOwotb3V0OgorCXRyYWNlLT5ldmxpc3QgPSBOVUxMOwogCXRyYWNlLT5saXZlID0gZmFsc2U7CiAJcmV0dXJuIGVycjsKIHsKQEAgLTIyMzUsNiArMjM0Niw3IEBACiAJc3RydWN0IHBlcmZfZGF0YV9maWxlIGZpbGUgPSB7CiAJCS5wYXRoICA9IGlucHV0X25hbWUsCiAJCS5tb2RlICA9IFBFUkZfREFUQV9NT0RFX1JFQUQsCisJCS5mb3JjZSA9IHRyYWNlLT5mb3JjZSwKIAl9OwogCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb247CiAJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOwpAQCAtMjMwOSw3ICsyNDIxLDcgQEAKIAogCXNldHVwX3BhZ2VyKCk7CiAKLQllcnIgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sICZ0cmFjZS0+dG9vbCk7CisJZXJyID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uKTsKIAlpZiAoZXJyKQogCQlwcl9lcnIoIkZhaWxlZCB0byBwcm9jZXNzIGV2ZW50cywgZXJyb3IgJWQiLCBlcnIpOwogCkBAIC0yNDM0LDYgKzI1NDYsMzggQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB0cmFjZV9fc2V0X2ZpbHRlcl9waWRzKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCwgY29uc3QgY2hhciAqc3RyLAorCQkJCSAgaW50IHVuc2V0IF9fbWF5YmVfdW51c2VkKQoreworCWludCByZXQgPSAtMTsKKwlzaXplX3QgaTsKKwlzdHJ1Y3QgdHJhY2UgKnRyYWNlID0gb3B0LT52YWx1ZTsKKwkvKgorCSAqIEZJWE1FOiBpbnRyb2R1Y2UgYSBpbnRhcnJheSBjbGFzcywgcGxhaW4gcGFyc2UgY3N2IGFuZCBjcmVhdGUgYQorCSAqIHsgaW50IG5yLCBpbnQgZW50cmllc1tdIH0gc3RydWN0Li4uCisJICovCisJc3RydWN0IGludGxpc3QgKmxpc3QgPSBpbnRsaXN0X19uZXcoc3RyKTsKKworCWlmIChsaXN0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWkgPSB0cmFjZS0+ZmlsdGVyX3BpZHMubnIgPSBpbnRsaXN0X19ucl9lbnRyaWVzKGxpc3QpICsgMTsKKwl0cmFjZS0+ZmlsdGVyX3BpZHMuZW50cmllcyA9IGNhbGxvYyhpLCBzaXplb2YocGlkX3QpKTsKKworCWlmICh0cmFjZS0+ZmlsdGVyX3BpZHMuZW50cmllcyA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCXRyYWNlLT5maWx0ZXJfcGlkcy5lbnRyaWVzWzBdID0gZ2V0cGlkKCk7CisKKwlmb3IgKGkgPSAxOyBpIDwgdHJhY2UtPmZpbHRlcl9waWRzLm5yOyArK2kpCisJCXRyYWNlLT5maWx0ZXJfcGlkcy5lbnRyaWVzW2ldID0gaW50bGlzdF9fZW50cnkobGlzdCwgaSAtIDEpLT5pOworCisJaW50bGlzdF9fZGVsZXRlKGxpc3QpOworCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCB0cmFjZV9fb3Blbl9vdXRwdXQoc3RydWN0IHRyYWNlICp0cmFjZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7CiAJc3RydWN0IHN0YXQgc3Q7CkBAIC0yNDY4LDkgKzI2MTIsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZXZsaXN0X19zZXRfZXZzZWxfaGFuZGxlcihzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgdm9pZCAqaGFuZGxlcikKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisKKwlldmxpc3RfX2Zvcl9lYWNoKGV2bGlzdCwgZXZzZWwpCisJCWV2c2VsLT5oYW5kbGVyID0gaGFuZGxlcjsKK30KKwogaW50IGNtZF90cmFjZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX21heWJlX3VudXNlZCkKIHsKLQljb25zdCBjaGFyICogY29uc3QgdHJhY2VfdXNhZ2VbXSA9IHsKKwljb25zdCBjaGFyICp0cmFjZV91c2FnZVtdID0gewogCQkicGVyZiB0cmFjZSBbPG9wdGlvbnM+XSBbPGNvbW1hbmQ+XSIsCiAJCSJwZXJmIHRyYWNlIFs8b3B0aW9ucz5dIC0tIDxjb21tYW5kPiBbPG9wdGlvbnM+XSIsCiAJCSJwZXJmIHRyYWNlIHJlY29yZCBbPG9wdGlvbnM+XSBbPGNvbW1hbmQ+XSIsCkBAIC0yNTAyLDYgKzI2NTQsOSBAQAogCWNvbnN0IGNoYXIgKm91dHB1dF9uYW1lID0gTlVMTDsKIAljb25zdCBjaGFyICpldl9xdWFsaWZpZXJfc3RyID0gTlVMTDsKIAljb25zdCBzdHJ1Y3Qgb3B0aW9uIHRyYWNlX29wdGlvbnNbXSA9IHsKKwlPUFRfQ0FMTEJBQ0soMCwgImV2ZW50IiwgJnRyYWNlLmV2bGlzdCwgImV2ZW50IiwKKwkJICAgICAiZXZlbnQgc2VsZWN0b3IuIHVzZSAncGVyZiBsaXN0JyB0byBsaXN0IGF2YWlsYWJsZSBldmVudHMiLAorCQkgICAgIHBhcnNlX2V2ZW50c19vcHRpb24pLAogCU9QVF9CT09MRUFOKDAsICJjb21tIiwgJnRyYWNlLnNob3dfY29tbSwKIAkJICAgICJzaG93IHRoZSB0aHJlYWQgQ09NTSBuZXh0IHRvIGl0cyBpZCIpLAogCU9QVF9CT09MRUFOKDAsICJ0b29sX3N0YXRzIiwgJnRyYWNlLnNob3dfdG9vbF9zdGF0cywgInNob3cgdG9vbCBzdGF0cyIpLApAQCAtMjUxMyw2ICsyNjY4LDggQEAKIAkJICAgICJ0cmFjZSBldmVudHMgb24gZXhpc3RpbmcgcHJvY2VzcyBpZCIpLAogCU9QVF9TVFJJTkcoJ3QnLCAidGlkIiwgJnRyYWNlLm9wdHMudGFyZ2V0LnRpZCwgInRpZCIsCiAJCSAgICAidHJhY2UgZXZlbnRzIG9uIGV4aXN0aW5nIHRocmVhZCBpZCIpLAorCU9QVF9DQUxMQkFDSygwLCAiZmlsdGVyLXBpZHMiLCAmdHJhY2UsICJmbG9hdCIsCisJCSAgICAgInNob3cgb25seSBldmVudHMgd2l0aCBkdXJhdGlvbiA+IE4uTSBtcyIsIHRyYWNlX19zZXRfZmlsdGVyX3BpZHMpLAogCU9QVF9CT09MRUFOKCdhJywgImFsbC1jcHVzIiwgJnRyYWNlLm9wdHMudGFyZ2V0LnN5c3RlbV93aWRlLAogCQkgICAgInN5c3RlbS13aWRlIGNvbGxlY3Rpb24gZnJvbSBhbGwgQ1BVcyIpLAogCU9QVF9TVFJJTkcoJ0MnLCAiY3B1IiwgJnRyYWNlLm9wdHMudGFyZ2V0LmNwdV9saXN0LCAiY3B1IiwKQEAgLTI1MzgsMTkgKzI2OTUsMzYgQEAKIAlPUFRfQ0FMTEJBQ0tfREVGQVVMVCgnRicsICJwZiIsICZ0cmFjZS50cmFjZV9wZ2ZhdWx0cywgImFsbHxtYWp8bWluIiwKIAkJICAgICAiVHJhY2UgcGFnZWZhdWx0cyIsIHBhcnNlX3BhZ2VmYXVsdHMsICJtYWoiKSwKIAlPUFRfQk9PTEVBTigwLCAic3lzY2FsbHMiLCAmdHJhY2UudHJhY2Vfc3lzY2FsbHMsICJUcmFjZSBzeXNjYWxscyIpLAorCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJnRyYWNlLmZvcmNlLCAiZG9uJ3QgY29tcGxhaW4sIGRvIGl0IiksCiAJT1BUX0VORCgpCiAJfTsKKwljb25zdCBjaGFyICogY29uc3QgdHJhY2Vfc3ViY29tbWFuZHNbXSA9IHsgInJlY29yZCIsIE5VTEwgfTsKIAlpbnQgZXJyOwogCWNoYXIgYmZbQlVGU0laXTsKIAotCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIHRyYWNlX29wdGlvbnMsIHRyYWNlX3VzYWdlLAotCQkJICAgICBQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKTsKKwlzaWduYWwoU0lHU0VHViwgc2lnaGFuZGxlcl9kdW1wX3N0YWNrKTsKKwlzaWduYWwoU0lHRlBFLCBzaWdoYW5kbGVyX2R1bXBfc3RhY2spOworCisJdHJhY2UuZXZsaXN0ID0gcGVyZl9ldmxpc3RfX25ldygpOworCWlmICh0cmFjZS5ldmxpc3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAodHJhY2UuZXZsaXN0ID09IE5VTEwpIHsKKwkJcHJfZXJyKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBydW4hXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJYXJnYyA9IHBhcnNlX29wdGlvbnNfc3ViY29tbWFuZChhcmdjLCBhcmd2LCB0cmFjZV9vcHRpb25zLCB0cmFjZV9zdWJjb21tYW5kcywKKwkJCQkgdHJhY2VfdXNhZ2UsIFBBUlNFX09QVF9TVE9QX0FUX05PTl9PUFRJT04pOwogCiAJaWYgKHRyYWNlLnRyYWNlX3BnZmF1bHRzKSB7CiAJCXRyYWNlLm9wdHMuc2FtcGxlX2FkZHJlc3MgPSB0cnVlOwogCQl0cmFjZS5vcHRzLnNhbXBsZV90aW1lID0gdHJ1ZTsKIAl9CiAKKwlpZiAodHJhY2UuZXZsaXN0LT5ucl9lbnRyaWVzID4gMCkKKwkJZXZsaXN0X19zZXRfZXZzZWxfaGFuZGxlcih0cmFjZS5ldmxpc3QsIHRyYWNlX19ldmVudF9oYW5kbGVyKTsKKwogCWlmICgoYXJnYyA+PSAxKSAmJiAoc3RyY21wKGFyZ3ZbMF0sICJyZWNvcmQiKSA9PSAwKSkKIAkJcmV0dXJuIHRyYWNlX19yZWNvcmQoJnRyYWNlLCBhcmdjLTEsICZhcmd2WzFdKTsKIApAQCAtMjU1OCw3ICsyNzMyLDggQEAKIAlpZiAodHJhY2Uuc3VtbWFyeV9vbmx5KQogCQl0cmFjZS5zdW1tYXJ5ID0gdHJhY2Uuc3VtbWFyeV9vbmx5OwogCi0JaWYgKCF0cmFjZS50cmFjZV9zeXNjYWxscyAmJiAhdHJhY2UudHJhY2VfcGdmYXVsdHMpIHsKKwlpZiAoIXRyYWNlLnRyYWNlX3N5c2NhbGxzICYmICF0cmFjZS50cmFjZV9wZ2ZhdWx0cyAmJgorCSAgICB0cmFjZS5ldmxpc3QtPm5yX2VudHJpZXMgPT0gMCAvKiBXYXMgLS1ldmVudHMgdXNlZD8gKi8pIHsKIAkJcHJfZXJyKCJQbGVhc2Ugc3BlY2lmeSBzb21ldGhpbmcgdG8gdHJhY2UuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi5oIGIvdG9vbHMvcGVyZi9idWlsdGluLmgKaW5kZXggYjIxMGQ2Mi4uMzY4OGFkMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLmgKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLmgKQEAgLTM3LDYgKzM3LDcgQEAKIGV4dGVybiBpbnQgY21kX3RyYWNlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKIGV4dGVybiBpbnQgY21kX2luamVjdChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CiBleHRlcm4gaW50IGNtZF9tZW0oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfZGF0YShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CiAKIGV4dGVybiBpbnQgZmluZF9zY3JpcHRzKGNoYXIgKipzY3JpcHRzX2FycmF5LCBjaGFyICoqc2NyaXB0c19wYXRoX2FycmF5KTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb21tYW5kLWxpc3QudHh0IGIvdG9vbHMvcGVyZi9jb21tYW5kLWxpc3QudHh0CmluZGV4IDA5MDZmYzQuLjAwZmNhZjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvY29tbWFuZC1saXN0LnR4dAorKysgYi90b29scy9wZXJmL2NvbW1hbmQtbGlzdC50eHQKQEAgLTcsNiArNyw3IEBACiBwZXJmLWJlbmNoCQkJbWFpbnBvcmNlbGFpbiBjb21tb24KIHBlcmYtYnVpbGRpZC1jYWNoZQkJbWFpbnBvcmNlbGFpbiBjb21tb24KIHBlcmYtYnVpbGRpZC1saXN0CQltYWlucG9yY2VsYWluIGNvbW1vbgorcGVyZi1kYXRhCQkJbWFpbnBvcmNlbGFpbiBjb21tb24KIHBlcmYtZGlmZgkJCW1haW5wb3JjZWxhaW4gY29tbW9uCiBwZXJmLWV2bGlzdAkJCW1haW5wb3JjZWxhaW4gY29tbW9uCiBwZXJmLWluamVjdAkJCW1haW5wb3JjZWxhaW4gY29tbW9uCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvY29uZmlnL01ha2VmaWxlCmluZGV4IGNjMjI0MDguLjU5YTk4YzYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvY29uZmlnL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvY29uZmlnL01ha2VmaWxlCkBAIC0xMSwxOSArMTEsMjYgQEAKIG9iai1wZXJmIDo9ICQoYWJzcGF0aCAkKG9iai1wZXJmKSkvCiBlbmRpZgogCi1MSUJfSU5DTFVERSA6PSAkKHNyY3RyZWUpL3Rvb2xzL2xpYi8KKyQoc2hlbGwgZWNobyAtbiA+IC5jb25maWctZGV0ZWN0ZWQpCitkZXRlY3RlZCAgICAgPSAkKHNoZWxsIGVjaG8gIiQoMSk9eSIgICAgICAgPj4gLmNvbmZpZy1kZXRlY3RlZCkKK2RldGVjdGVkX3ZhciA9ICQoc2hlbGwgZWNobyAiJCgxKT0kKCQoMSkpIiA+PiAuY29uZmlnLWRldGVjdGVkKQorCiBDRkxBR1MgOj0gJChFWFRSQV9DRkxBR1MpICQoRVhUUkFfV0FSTklOR1MpCiAKIGluY2x1ZGUgJChzcmMtcGVyZikvY29uZmlnL01ha2VmaWxlLmFyY2gKIAorJChjYWxsIGRldGVjdGVkX3ZhcixBUkNIKQorCiBOT19QRVJGX1JFR1MgOj0gMQogCiAjIEFkZGl0aW9uYWwgQVJDSCBzZXR0aW5ncyBmb3IgeDg2CiBpZmVxICgkKEFSQ0gpLHg4NikKKyAgJChjYWxsIGRldGVjdGVkLENPTkZJR19YODYpCiAgIGlmZXEgKCR7SVNfNjRfQklUfSwgMSkKICAgICBDRkxBR1MgKz0gLURIQVZFX0FSQ0hfWDg2XzY0X1NVUFBPUlQKICAgICBBUkNIX0lOQ0xVREUgPSAuLi8uLi9hcmNoL3g4Ni9saWIvbWVtY3B5XzY0LlMgLi4vLi4vYXJjaC94ODYvbGliL21lbXNldF82NC5TCiAgICAgTElCVU5XSU5EX0xJQlMgPSAtbHVud2luZCAtbHVud2luZC14ODZfNjQKKyAgICAkKGNhbGwgZGV0ZWN0ZWQsQ09ORklHX1g4Nl82NCkKICAgZWxzZQogICAgIExJQlVOV0lORF9MSUJTID0gLWx1bndpbmQgLWx1bndpbmQteDg2CiAgIGVuZGlmCkBAIC00MCw2ICs0NywxMCBAQAogICBMSUJVTldJTkRfTElCUyA9IC1sdW53aW5kIC1sdW53aW5kLWFhcmNoNjQKIGVuZGlmCiAKK2lmZXEgKCQoTk9fUEVSRl9SRUdTKSwwKQorICAkKGNhbGwgZGV0ZWN0ZWQsQ09ORklHX1BFUkZfUkVHUykKK2VuZGlmCisKICMgU28gZmFyIHRoZXJlJ3Mgb25seSB4ODYgYW5kIGFybSBsaWJkdyB1bndpbmQgc3VwcG9ydCBtZXJnZWQgaW4gcGVyZi4KICMgRGlzYWJsZSBpdCBvbiBhbGwgb3RoZXIgYXJjaGl0ZWN0dXJlcyBpbiBjYXNlIGxpYmR3IHVud2luZAogIyBzdXBwb3J0IGlzIGRldGVjdGVkIGluIHN5c3RlbS4gQWRkIHN1cHBvcnRlZCBhcmNoaXRlY3R1cmVzCkBAIC04NCw2ICs5NSwxNyBAQAogICBGRUFUVVJFX0NIRUNLX0xERkxBR1MtbGliZHctZHdhcmYtdW53aW5kIDo9ICQoTElCRFdfTERGTEFHUykgLWxkdwogZW5kaWYKIAoraWZkZWYgTElCQkFCRUxUUkFDRQorICAjIGZvciBsaW5raW5nIHdpdGggZGVidWcgbGlicmFyeSwgcnVuIGxpa2U6CisgICMgbWFrZSBERUJVRz0xIExJQkJBQkVMVFJBQ0VfRElSPS9vcHQvbGliYmFiZWx0cmFjZS8KKyAgaWZkZWYgTElCQkFCRUxUUkFDRV9ESVIKKyAgICBMSUJCQUJFTFRSQUNFX0NGTEFHUyAgOj0gLUkkKExJQkJBQkVMVFJBQ0VfRElSKS9pbmNsdWRlCisgICAgTElCQkFCRUxUUkFDRV9MREZMQUdTIDo9IC1MJChMSUJCQUJFTFRSQUNFX0RJUikvbGliCisgIGVuZGlmCisgIEZFQVRVUkVfQ0hFQ0tfQ0ZMQUdTLWxpYmJhYmVsdHJhY2UgOj0gJChMSUJCQUJFTFRSQUNFX0NGTEFHUykKKyAgRkVBVFVSRV9DSEVDS19MREZMQUdTLWxpYmJhYmVsdHJhY2UgOj0gJChMSUJCQUJFTFRSQUNFX0xERkxBR1MpIC1sYmFiZWx0cmFjZS1jdGYKK2VuZGlmCisKICMgaW5jbHVkZSBBUkNIIHNwZWNpZmljIGNvbmZpZwogLWluY2x1ZGUgJChzcmMtcGVyZikvYXJjaC8kKEFSQ0gpL01ha2VmaWxlCiAKQEAgLTExNCw2ICsxMzYsOCBAQAogICBQQVJTRVJfREVCVUdfQklTT04gOj0gLXQKICAgUEFSU0VSX0RFQlVHX0ZMRVggIDo9IC1kCiAgIENGTEFHUyAgICAgICAgICAgICArPSAtRFBBUlNFUl9ERUJVRworICAkKGNhbGwgZGV0ZWN0ZWRfdmFyLFBBUlNFUl9ERUJVR19CSVNPTikKKyAgJChjYWxsIGRldGVjdGVkX3ZhcixQQVJTRVJfREVCVUdfRkxFWCkKIGVuZGlmCiAKIGlmbmRlZiBOT19MSUJQWVRIT04KQEAgLTE1MiwxMjEgKzE3Niw3IEBACiAKIEVYVExJQlMgPSAtbHB0aHJlYWQgLWxydCAtbG0gLWxkbAogCi1pZm5lcSAoJChPVVRQVVQpLCkKLSAgT1VUUFVUX0ZFQVRVUkVTID0gJChPVVRQVVQpY29uZmlnL2ZlYXR1cmUtY2hlY2tzLwotICAkKHNoZWxsIG1rZGlyIC1wICQoT1VUUFVUX0ZFQVRVUkVTKSkKLWVuZGlmCi0KLWZlYXR1cmVfY2hlY2sgPSAkKGV2YWwgJChmZWF0dXJlX2NoZWNrX2NvZGUpKQotZGVmaW5lIGZlYXR1cmVfY2hlY2tfY29kZQotICBmZWF0dXJlLSQoMSkgOj0gJChzaGVsbCAkKE1BS0UpIE9VVFBVVD0kKE9VVFBVVF9GRUFUVVJFUykgQ0ZMQUdTPSIkKEVYVFJBX0NGTEFHUykgJChGRUFUVVJFX0NIRUNLX0NGTEFHUy0kKDEpKSIgTERGTEFHUz0iJChMREZMQUdTKSAkKEZFQVRVUkVfQ0hFQ0tfTERGTEFHUy0kKDEpKSIgLUMgY29uZmlnL2ZlYXR1cmUtY2hlY2tzIHRlc3QtJDEuYmluID4vZGV2L251bGwgMj4vZGV2L251bGwgJiYgZWNobyAxIHx8IGVjaG8gMCkKLWVuZGVmCi0KLWZlYXR1cmVfc2V0ID0gJChldmFsICQoZmVhdHVyZV9zZXRfY29kZSkpCi1kZWZpbmUgZmVhdHVyZV9zZXRfY29kZQotICBmZWF0dXJlLSQoMSkgOj0gMQotZW5kZWYKLQotIwotIyBCdWlsZCB0aGUgZmVhdHVyZSBjaGVjayBiaW5hcmllcyBpbiBwYXJhbGxlbCwgaWdub3JlIGVycm9ycywgaWdub3JlIHJldHVybiB2YWx1ZSBhbmQgc3VwcHJlc3Mgb3V0cHV0OgotIwotCi0jCi0jIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhIGNvbXBsZXRlIGxpc3Qgb2YgYWxsIGZlYXR1cmUgdGVzdHMsIGp1c3QKLSMgdGhvc2UgdGhhdCBhcmUgdHlwaWNhbGx5IGJ1aWx0IG9uIGEgZnVsbHkgY29uZmlndXJlZCBzeXN0ZW0uCi0jCi0jIFsgRmVhdHVyZSB0ZXN0cyBub3QgbWVudGlvbmVkIGhlcmUgaGF2ZSB0byBiZSBidWlsdCBleHBsaWNpdGx5IGluCi0jICAgdGhlIHJ1bGUgdGhhdCB1c2VzIHRoZW0gLSBhbiBleGFtcGxlIGZvciB0aGF0IGlzIHRoZSAnYmlvbmljJwotIyAgIGZlYXR1cmUgY2hlY2suIF0KLSMKLUNPUkVfRkVBVFVSRV9URVNUUyA9CQkJXAotCWJhY2t0cmFjZQkJCVwKLQlkd2FyZgkJCQlcCi0JZm9ydGlmeS1zb3VyY2UJCQlcCi0Jc3luYy1jb21wYXJlLWFuZC1zd2FwCQlcCi0JZ2xpYmMJCQkJXAotCWd0azIJCQkJXAotCWd0azItaW5mb2JhcgkJCVwKLQlsaWJhdWRpdAkJCVwKLQlsaWJiZmQJCQkJXAotCWxpYmVsZgkJCQlcCi0JbGliZWxmLWdldHBoZHJudW0JCVwKLQlsaWJlbGYtbW1hcAkJCVwKLQlsaWJudW1hCQkJCVwKLQlsaWJwZXJsCQkJCVwKLQlsaWJweXRob24JCQlcCi0JbGlicHl0aG9uLXZlcnNpb24JCVwKLQlsaWJzbGFuZwkJCVwKLQlsaWJ1bndpbmQJCQlcCi0JcHRocmVhZC1hdHRyLXNldGFmZmluaXR5LW5wCVwKLQlzdGFja3Byb3RlY3Rvci1hbGwJCVwKLQl0aW1lcmZkCQkJCVwKLQlsaWJkdy1kd2FyZi11bndpbmQJCVwKLQl6bGliCi0KLUxJQl9GRUFUVVJFX1RFU1RTID0JCQlcCi0JZHdhcmYJCQkJXAotCWdsaWJjCQkJCVwKLQlndGsyCQkJCVwKLQlsaWJhdWRpdAkJCVwKLQlsaWJiZmQJCQkJXAotCWxpYmVsZgkJCQlcCi0JbGlibnVtYQkJCQlcCi0JbGlicGVybAkJCQlcCi0JbGlicHl0aG9uCQkJXAotCWxpYnNsYW5nCQkJXAotCWxpYnVud2luZAkJCVwKLQlsaWJkdy1kd2FyZi11bndpbmQJCVwKLQl6bGliCi0KLVZGX0ZFQVRVUkVfVEVTVFMgPQkJCVwKLQliYWNrdHJhY2UJCQlcCi0JZm9ydGlmeS1zb3VyY2UJCQlcCi0Jc3luYy1jb21wYXJlLWFuZC1zd2FwCQlcCi0JZ3RrMi1pbmZvYmFyCQkJXAotCWxpYmVsZi1nZXRwaGRybnVtCQlcCi0JbGliZWxmLW1tYXAJCQlcCi0JbGlicHl0aG9uLXZlcnNpb24JCVwKLQlwdGhyZWFkLWF0dHItc2V0YWZmaW5pdHktbnAJXAotCXN0YWNrcHJvdGVjdG9yLWFsbAkJXAotCXRpbWVyZmQJCQkJXAotCWxpYnVud2luZC1kZWJ1Zy1mcmFtZQkJXAotCWJpb25pYwkJCQlcCi0JbGliZXJ0eQkJCQlcCi0JbGliZXJ0eS16CQkJXAotCWNwbHVzLWRlbWFuZ2xlCQkJXAotCWNvbXBpbGUtMzIJCQlcCi0JY29tcGlsZS14MzIKLQotIyBTZXQgRkVBVFVSRV9DSEVDS18oQ3xMRClGTEFHUy1hbGwgZm9yIGFsbCBDT1JFX0ZFQVRVUkVfVEVTVFMgZmVhdHVyZXMuCi0jIElmIGluIHRoZSBmdXR1cmUgd2UgbmVlZCBwZXItZmVhdHVyZSBjaGVja3MvZmxhZ3MgZm9yIGZlYXR1cmVzIG5vdAotIyBtZW50aW9uZWQgaW4gdGhpcyBsaXN0IHdlIG5lZWQgdG8gcmVmYWN0b3IgdGhpcyA7LSkuCi1zZXRfdGVzdF9hbGxfZmxhZ3MgPSAkKGV2YWwgJChzZXRfdGVzdF9hbGxfZmxhZ3NfY29kZSkpCi1kZWZpbmUgc2V0X3Rlc3RfYWxsX2ZsYWdzX2NvZGUKLSAgRkVBVFVSRV9DSEVDS19DRkxBR1MtYWxsICArPSAkKEZFQVRVUkVfQ0hFQ0tfQ0ZMQUdTLSQoMSkpCi0gIEZFQVRVUkVfQ0hFQ0tfTERGTEFHUy1hbGwgKz0gJChGRUFUVVJFX0NIRUNLX0xERkxBR1MtJCgxKSkKLWVuZGVmCi0KLSQoZm9yZWFjaCBmZWF0LCQoQ09SRV9GRUFUVVJFX1RFU1RTKSwkKGNhbGwgc2V0X3Rlc3RfYWxsX2ZsYWdzLCQoZmVhdCkpKQotCi0jCi0jIFNwZWNpYWwgZmFzdC1wYXRoIGZvciB0aGUgJ2FsbCBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlJyBjYXNlOgotIwotJChjYWxsIGZlYXR1cmVfY2hlY2ssYWxsLCQoTVNHKSkKLQotIwotIyBKdXN0IGluIGNhc2UgdGhlIGJ1aWxkIGZyZXNobHkgZmFpbGVkLCBtYWtlIHN1cmUgd2UgcHJpbnQgdGhlCi0jIGZlYXR1cmUgbWF0cml4OgotIwotaWZlcSAoJChmZWF0dXJlLWFsbCksIDEpCi0gICMKLSAgIyB0ZXN0LWFsbC5jIHBhc3NlZCAtIGp1c3Qgc2V0IGFsbCB0aGUgY29yZSBmZWF0dXJlIGZsYWdzIHRvIDE6Ci0gICMKLSAgJChmb3JlYWNoIGZlYXQsJChDT1JFX0ZFQVRVUkVfVEVTVFMpLCQoY2FsbCBmZWF0dXJlX3NldCwkKGZlYXQpKSkKLWVsc2UKLSAgJChzaGVsbCAkKE1BS0UpIE9VVFBVVD0kKE9VVFBVVF9GRUFUVVJFUykgQ0ZMQUdTPSIkKEVYVFJBX0NGTEFHUykiIExERkxBR1M9JChMREZMQUdTKSAtaSAtaiAtQyBjb25maWcvZmVhdHVyZS1jaGVja3MgJChhZGRzdWZmaXggLmJpbiwkKENPUkVfRkVBVFVSRV9URVNUUykpID4vZGV2L251bGwgMj4mMSkKLSAgJChmb3JlYWNoIGZlYXQsJChDT1JFX0ZFQVRVUkVfVEVTVFMpLCQoY2FsbCBmZWF0dXJlX2NoZWNrLCQoZmVhdCkpKQotZW5kaWYKK2luY2x1ZGUgJChzcmN0cmVlKS90b29scy9idWlsZC9NYWtlZmlsZS5mZWF0dXJlCiAKIGlmZXEgKCQoZmVhdHVyZS1zdGFja3Byb3RlY3Rvci1hbGwpLCAxKQogICBDRkxBR1MgKz0gLWZzdGFjay1wcm90ZWN0b3ItYWxsCkBAIC0yOTUsNyArMjA1LDcgQEAKIAogQ0ZMQUdTICs9IC1JJChzcmMtcGVyZikvdXRpbAogQ0ZMQUdTICs9IC1JJChzcmMtcGVyZikKLUNGTEFHUyArPSAtSSQoTElCX0lOQ0xVREUpCitDRkxBR1MgKz0gLUkkKHNyY3RyZWUpL3Rvb2xzL2xpYi8KIAogQ0ZMQUdTICs9IC1EX0xBUkdFRklMRTY0X1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0IC1EX0dOVV9TT1VSQ0UKIApAQCAtMzYxLDYgKzI3MSw3IEBACiBpZm5kZWYgTk9fTElCRUxGCiAgIENGTEFHUyArPSAtREhBVkVfTElCRUxGX1NVUFBPUlQKICAgRVhUTElCUyArPSAtbGVsZgorICAkKGNhbGwgZGV0ZWN0ZWQsQ09ORklHX0xJQkVMRikKIAogICBpZmVxICgkKGZlYXR1cmUtbGliZWxmLW1tYXApLCAxKQogICAgIENGTEFHUyArPSAtREhBVkVfTElCRUxGX01NQVBfU1VQUE9SVApAQCAtMzgxLDYgKzI5Miw3IEBACiAgICAgICBDRkxBR1MgKz0gLURIQVZFX0RXQVJGX1NVUFBPUlQgJChMSUJEV19DRkxBR1MpCiAgICAgICBMREZMQUdTICs9ICQoTElCRFdfTERGTEFHUykKICAgICAgIEVYVExJQlMgKz0gLWxkdworICAgICAgJChjYWxsIGRldGVjdGVkLENPTkZJR19EV0FSRikKICAgICBlbmRpZiAjIFBFUkZfSEFWRV9EV0FSRl9SRUdTCiAgIGVuZGlmICMgTk9fRFdBUkYKIGVuZGlmICMgTk9fTElCRUxGCkBAIC00MDgsOSArMzIwLDExIEBACiAgICAgZHdhcmYtcG9zdC11bndpbmQgOj0gMAogICBlbHNlCiAgICAgZHdhcmYtcG9zdC11bndpbmQtdGV4dCA6PSBsaWJkdworICAgICQoY2FsbCBkZXRlY3RlZCxDT05GSUdfTElCRFdfRFdBUkZfVU5XSU5EKQogICBlbmRpZgogZWxzZQogICBkd2FyZi1wb3N0LXVud2luZC10ZXh0IDo9IGxpYnVud2luZAorICAkKGNhbGwgZGV0ZWN0ZWQsQ09ORklHX0xJQlVOV0lORCkKICAgIyBFbmFibGUgbGlidW53aW5kIHN1cHBvcnQgYnkgZGVmYXVsdC4KICAgaWZuZGVmIE5PX0xJQkRXX0RXQVJGX1VOV0lORAogICAgIE5PX0xJQkRXX0RXQVJGX1VOV0lORCA6PSAxCkBAIC00MTksNiArMzMzLDcgQEAKIAogaWZlcSAoJChkd2FyZi1wb3N0LXVud2luZCksMSkKICAgQ0ZMQUdTICs9IC1ESEFWRV9EV0FSRl9VTldJTkRfU1VQUE9SVAorICAkKGNhbGwgZGV0ZWN0ZWQsQ09ORklHX0RXQVJGX1VOV0lORCkKIGVsc2UKICAgTk9fRFdBUkZfVU5XSU5EIDo9IDEKIGVuZGlmCkBAIC00NDcsNiArMzYyLDcgQEAKICAgZWxzZQogICAgIENGTEFHUyArPSAtREhBVkVfTElCQVVESVRfU1VQUE9SVAogICAgIEVYVExJQlMgKz0gLWxhdWRpdAorICAgICQoY2FsbCBkZXRlY3RlZCxDT05GSUdfQVVESVQpCiAgIGVuZGlmCiBlbmRpZgogCkBAIC00NjMsNiArMzc5LDcgQEAKICAgICBDRkxBR1MgKz0gLUkvdXNyL2luY2x1ZGUvc2xhbmcKICAgICBDRkxBR1MgKz0gLURIQVZFX1NMQU5HX1NVUFBPUlQKICAgICBFWFRMSUJTICs9IC1sc2xhbmcKKyAgICAkKGNhbGwgZGV0ZWN0ZWQsQ09ORklHX1NMQU5HKQogICBlbmRpZgogZW5kaWYKIApAQCAtNDk3LDEwICs0MTQsMTEgQEAKICAgaWZuZXEgKCQoZmVhdHVyZS1saWJwZXJsKSwgMSkKICAgICBDRkxBR1MgKz0gLUROT19MSUJQRVJMCiAgICAgTk9fTElCUEVSTCA6PSAxCi0gICAgbXNnIDo9ICQod2FybmluZyBNaXNzaW5nIHBlcmwgZGV2ZWwgZmlsZXMuIERpc2FibGluZyBwZXJsIHNjcmlwdGluZyBzdXBwb3J0LCBjb25zaWRlciBpbnN0YWxsaW5nIHBlcmwtRXh0VXRpbHMtRW1iZWQpOworICAgIG1zZyA6PSAkKHdhcm5pbmcgTWlzc2luZyBwZXJsIGRldmVsIGZpbGVzLiBEaXNhYmxpbmcgcGVybCBzY3JpcHRpbmcgc3VwcG9ydCwgcGxlYXNlIGluc3RhbGwgcGVybC1FeHRVdGlscy1FbWJlZC9saWJwZXJsLWRldik7CiAgIGVsc2UKICAgICBMREZMQUdTICs9ICQoUEVSTF9FTUJFRF9MREZMQUdTKQogICAgIEVYVExJQlMgKz0gJChQRVJMX0VNQkVEX0xJQkFERCkKKyAgICAkKGNhbGwgZGV0ZWN0ZWQsQ09ORklHX0xJQlBFUkwpCiAgIGVuZGlmCiBlbmRpZgogCkBAIC01MTMsMjIgKzQzMSwyMSBAQAogZGlzYWJsZS1weXRob24gPSAkKGV2YWwgJChkaXNhYmxlLXB5dGhvbl9jb2RlKSkKIGRlZmluZSBkaXNhYmxlLXB5dGhvbl9jb2RlCiAgIENGTEFHUyArPSAtRE5PX0xJQlBZVEhPTgotICAkKGlmICQoMSksJCh3YXJuaW5nIE5vICQoMSkgd2FzIGZvdW5kKSkKLSAgJCh3YXJuaW5nIFB5dGhvbiBzdXBwb3J0IHdpbGwgbm90IGJlIGJ1aWx0KQorICAkKHdhcm5pbmcgJDEpCiAgIE5PX0xJQlBZVEhPTiA6PSAxCiBlbmRlZgogCiBpZmRlZiBOT19MSUJQWVRIT04KLSAgJChjYWxsIGRpc2FibGUtcHl0aG9uKQorICAkKGNhbGwgZGlzYWJsZS1weXRob24sUHl0aG9uIHN1cHBvcnQgZGlzYWJsZWQgYnkgdXNlcikKIGVsc2UKIAogICBpZm5kZWYgUFlUSE9OCi0gICAgJChjYWxsIGRpc2FibGUtcHl0aG9uLHB5dGhvbiBpbnRlcnByZXRlcikKKyAgICAkKGNhbGwgZGlzYWJsZS1weXRob24sTm8gcHl0aG9uIGludGVycHJldGVyIHdhcyBmb3VuZDogZGlzYWJsZXMgUHl0aG9uIHN1cHBvcnQgLSBwbGVhc2UgaW5zdGFsbCBweXRob24tZGV2ZWwvcHl0aG9uLWRldikKICAgZWxzZQogICAgIFBZVEhPTl9XT1JEIDo9ICQoY2FsbCBzaGVsbC13b3JkaWZ5LCQoUFlUSE9OKSkKIAogICAgIGlmbmRlZiBQWVRIT05fQ09ORklHCi0gICAgICAkKGNhbGwgZGlzYWJsZS1weXRob24scHl0aG9uLWNvbmZpZyB0b29sKQorICAgICAgJChjYWxsIGRpc2FibGUtcHl0aG9uLE5vICdweXRob24tY29uZmlnJyB0b29sIHdhcyBmb3VuZDogZGlzYWJsZXMgUHl0aG9uIHN1cHBvcnQgLSBwbGVhc2UgaW5zdGFsbCBweXRob24tZGV2ZWwvcHl0aG9uLWRldikKICAgICBlbHNlCiAKICAgICAgIFBZVEhPTl9DT05GSUdfU1EgOj0gJChjYWxsIHNoZWxsLXNxLCQoUFlUSE9OX0NPTkZJRykpCkBAIC01NDAsNyArNDU3LDcgQEAKICAgICAgIEZMQUdTX1BZVEhPTl9FTUJFRCA6PSAkKFBZVEhPTl9FTUJFRF9DQ09QVFMpICQoUFlUSE9OX0VNQkVEX0xET1BUUykKIAogICAgICAgaWZuZXEgKCQoZmVhdHVyZS1saWJweXRob24pLCAxKQotICAgICAgICAkKGNhbGwgZGlzYWJsZS1weXRob24sUHl0aG9uLmggKGZvciBQeXRob24gMi54KSkKKyAgICAgICAgJChjYWxsIGRpc2FibGUtcHl0aG9uLE5vICdQeXRob24uaCcgKGZvciBQeXRob24gMi54IHN1cHBvcnQpIHdhcyBmb3VuZDogZGlzYWJsZXMgUHl0aG9uIHN1cHBvcnQgLSBwbGVhc2UgaW5zdGFsbCBweXRob24tZGV2ZWwvcHl0aG9uLWRldikKICAgICAgIGVsc2UKIAogICAgICAgICBpZm5lcSAoJChmZWF0dXJlLWxpYnB5dGhvbi12ZXJzaW9uKSwgMSkKQEAgLTU2MCw2ICs0NzcsNyBAQAogICAgICAgICAgIExERkxBR1MgKz0gJChQWVRIT05fRU1CRURfTERGTEFHUykKICAgICAgICAgICBFWFRMSUJTICs9ICQoUFlUSE9OX0VNQkVEX0xJQkFERCkKICAgICAgICAgICBMQU5HX0JJTkRJTkdTICs9ICQob2JqLXBlcmYpcHl0aG9uL3BlcmYuc28KKyAgICAgICAgICAkKGNhbGwgZGV0ZWN0ZWQsQ09ORklHX0xJQlBZVEhPTikKICAgICAgICAgZW5kaWYKICAgICAgIGVuZGlmCiAgICAgZW5kaWYKQEAgLTYwMCw3ICs1MTgsNyBAQAogICAgICAgICAgICAgRVhUTElCUyArPSAtbGliZXJ0eQogICAgICAgICAgICAgQ0ZMQUdTICs9IC1ESEFWRV9DUExVU19ERU1BTkdMRV9TVVBQT1JUCiAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgbXNnIDo9ICQod2FybmluZyBObyBiZmQuaC9saWJiZmQgZm91bmQsIGluc3RhbGwgYmludXRpbHMtZGV2W2VsXS96bGliLXN0YXRpYyB0byBnYWluIHN5bWJvbCBkZW1hbmdsaW5nKQorICAgICAgICAgICAgbXNnIDo9ICQod2FybmluZyBObyBiZmQuaC9saWJiZmQgZm91bmQsIHBsZWFzZSBpbnN0YWxsIGJpbnV0aWxzLWRldltlbF0vemxpYi1zdGF0aWMvbGliaWJlcnR5LWRldiB0byBnYWluIHN5bWJvbCBkZW1hbmdsaW5nKQogICAgICAgICAgICAgQ0ZMQUdTICs9IC1ETk9fREVNQU5HTEUKICAgICAgICAgICBlbmRpZgogICAgICAgICBlbmRpZgpAQCAtNjE3LDExICs1MzUsMjMgQEAKICAgaWZlcSAoJChmZWF0dXJlLXpsaWIpLCAxKQogICAgIENGTEFHUyArPSAtREhBVkVfWkxJQl9TVVBQT1JUCiAgICAgRVhUTElCUyArPSAtbHoKKyAgICAkKGNhbGwgZGV0ZWN0ZWQsQ09ORklHX1pMSUIpCiAgIGVsc2UKICAgICBOT19aTElCIDo9IDEKICAgZW5kaWYKIGVuZGlmCiAKK2lmbmRlZiBOT19MWk1BCisgIGlmZXEgKCQoZmVhdHVyZS1sem1hKSwgMSkKKyAgICBDRkxBR1MgKz0gLURIQVZFX0xaTUFfU1VQUE9SVAorICAgIEVYVExJQlMgKz0gLWxsem1hCisgICAgJChjYWxsIGRldGVjdGVkLENPTkZJR19MWk1BKQorICBlbHNlCisgICAgbXNnIDo9ICQod2FybmluZyBObyBsaWJsem1hIGZvdW5kLCBkaXNhYmxlcyB4eiBrZXJuZWwgbW9kdWxlIGRlY29tcHJlc3Npb24sIHBsZWFzZSBpbnN0YWxsIHh6LWRldmVsL2xpYmx6bWEtZGV2KTsKKyAgICBOT19MWk1BIDo9IDEKKyAgZW5kaWYKK2VuZGlmCisKIGlmbmRlZiBOT19CQUNLVFJBQ0UKICAgaWZlcSAoJChmZWF0dXJlLWJhY2t0cmFjZSksIDEpCiAgICAgQ0ZMQUdTICs9IC1ESEFWRV9CQUNLVFJBQ0VfU1VQUE9SVApAQCAtNjM1LDYgKzU2NSw3IEBACiAgIGVsc2UKICAgICBDRkxBR1MgKz0gLURIQVZFX0xJQk5VTUFfU1VQUE9SVAogICAgIEVYVExJQlMgKz0gLWxudW1hCisgICAgJChjYWxsIGRldGVjdGVkLENPTkZJR19OVU1BKQogICBlbmRpZgogZW5kaWYKIApAQCAtNjUxLDcgKzU4Miw3IEBACiAgICAgICBOT19QRVJGX1JFQURfVkRTTzMyIDo9IDEKICAgICBlbmRpZgogICBlbmRpZgotICBpZm5lcSAoJHtJU19YODZfNjR9LCAxKQorICBpZm5lcSAoJChBUkNIKSwgeDg2KQogICAgIE5PX1BFUkZfUkVBRF9WRFNPWDMyIDo9IDEKICAgZW5kaWYKICAgaWZuZGVmIE5PX1BFUkZfUkVBRF9WRFNPWDMyCkBAIC02NjcsNiArNTk4LDE4IEBACiAgIE5PX1BFUkZfUkVBRF9WRFNPWDMyIDo9IDEKIGVuZGlmCiAKK2lmZGVmIExJQkJBQkVMVFJBQ0UKKyAgJChjYWxsIGZlYXR1cmVfY2hlY2ssbGliYmFiZWx0cmFjZSkKKyAgaWZlcSAoJChmZWF0dXJlLWxpYmJhYmVsdHJhY2UpLCAxKQorICAgIENGTEFHUyArPSAtREhBVkVfTElCQkFCRUxUUkFDRV9TVVBQT1JUICQoTElCQkFCRUxUUkFDRV9DRkxBR1MpCisgICAgTERGTEFHUyArPSAkKExJQkJBQkVMVFJBQ0VfTERGTEFHUykKKyAgICBFWFRMSUJTICs9IC1sYmFiZWx0cmFjZS1jdGYKKyAgICAkKGNhbGwgZGV0ZWN0ZWQsQ09ORklHX0xJQkJBQkVMVFJBQ0UpCisgIGVsc2UKKyAgICBtc2cgOj0gJCh3YXJuaW5nIE5vIGxpYmJhYmVsdHJhY2UgZm91bmQsIGRpc2FibGVzICdwZXJmIGRhdGEnIENURiBmb3JtYXQgc3VwcG9ydCwgcGxlYXNlIGluc3RhbGwgbGliYmFiZWx0cmFjZS1kZXZbZWxdL2xpYmJhYmVsdHJhY2UtY3RmLWRldik7CisgIGVuZGlmCitlbmRpZgorCiAjIEFtb25nIHRoZSB2YXJpYWJsZXMgYmVsb3csIHRoZXNlOgogIyAgIHBlcmZleGVjZGlyCiAjICAgdGVtcGxhdGVfZGlyCkBAIC02OTksNyArNjQyLDcgQEAKIEVUQ19QRVJGQ09ORklHID0gZXRjL3BlcmZjb25maWcKIGVuZGlmCiBpZm5kZWYgbGliCi1pZmVxICgkKElTX1g4Nl82NCksMSkKK2lmZXEgKCQoQVJDSCkkKElTXzY0X0JJVCksIHg4NjEpCiBsaWIgPSBsaWI2NAogZWxzZQogbGliID0gbGliCkBAIC03MzUsODMgKzY3OCwzMyBAQAogcGx1Z2luZGlyX1NRPSAkKHN1YnN0ICcsJ1wnJywkKHBsdWdpbmRpcikpCiBlbmRpZgogCi0jCi0jIFByaW50IHRoZSByZXN1bHQgb2YgdGhlIGZlYXR1cmUgdGVzdDoKLSMKLWZlYXR1cmVfcHJpbnRfc3RhdHVzID0gJChldmFsICQoZmVhdHVyZV9wcmludF9zdGF0dXNfY29kZSkpICQoaW5mbyAkKE1TRykpCi0KLWRlZmluZSBmZWF0dXJlX3ByaW50X3N0YXR1c19jb2RlCi0gIGlmZXEgKCQoZmVhdHVyZS0kKDEpKSwgMSkKLSAgICBNU0cgPSAkKHNoZWxsIHByaW50ZiAnLi4uJTMwczogWyBcMDMzWzMybW9uXDAzM1ttICBdJyAkKDEpKQotICBlbHNlCi0gICAgTVNHID0gJChzaGVsbCBwcmludGYgJy4uLiUzMHM6IFsgXDAzM1szMW1PRkZcMDMzW20gXScgJCgxKSkKLSAgZW5kaWYKLWVuZGVmCi0KLWZlYXR1cmVfcHJpbnRfdmFyID0gJChldmFsICQoZmVhdHVyZV9wcmludF92YXJfY29kZSkpICQoaW5mbyAkKE1TRykpCi1kZWZpbmUgZmVhdHVyZV9wcmludF92YXJfY29kZQorcHJpbnRfdmFyID0gJChldmFsICQocHJpbnRfdmFyX2NvZGUpKSAkKGluZm8gJChNU0cpKQorZGVmaW5lIHByaW50X3Zhcl9jb2RlCiAgICAgTVNHID0gJChzaGVsbCBwcmludGYgJy4uLiUzMHM6ICVzJyAkKDEpICQoJCgxKSkpCiBlbmRlZgogCi1mZWF0dXJlX3ByaW50X3RleHQgPSAkKGV2YWwgJChmZWF0dXJlX3ByaW50X3RleHRfY29kZSkpICQoaW5mbyAkKE1TRykpCi1kZWZpbmUgZmVhdHVyZV9wcmludF90ZXh0X2NvZGUKLSAgICBNU0cgPSAkKHNoZWxsIHByaW50ZiAnLi4uJTMwczogJXMnICQoMSkgJCgyKSkKLWVuZGVmCi0KLVBFUkZfRkVBVFVSRVMgOj0gJChmb3JlYWNoIGZlYXQsJChMSUJfRkVBVFVSRV9URVNUUyksZmVhdHVyZS0kKGZlYXQpKCQoZmVhdHVyZS0kKGZlYXQpKSkpCi1QRVJGX0ZFQVRVUkVTX0ZJTEUgOj0gJChzaGVsbCB0b3VjaCAkKE9VVFBVVClQRVJGLUZFQVRVUkVTOyBjYXQgJChPVVRQVVQpUEVSRi1GRUFUVVJFUykKLQotaWZlcSAoJChkd2FyZi1wb3N0LXVud2luZCksMSkKLSAgUEVSRl9GRUFUVVJFUyArPSBkd2FyZi1wb3N0LXVud2luZCgkKGR3YXJmLXBvc3QtdW53aW5kLXRleHQpKQotZW5kaWYKLQotIyBUaGUgJChkaXNwbGF5X2xpYikgY29udHJvbHMgdGhlIGRlZmF1bHQgZGV0ZWN0aW9uIG1lc3NhZ2UKLSMgb3V0cHV0LiBJdCdzIHNldCBpZjoKLSMgLSBkZXRlY3RlZCBmZWF0dXJlcyBkaWZmZXJlcyBmcm9tIHN0b3JlZCBmZWF0dXJlcyBmcm9tCi0jICAgbGFzdCBidWlsZCAoaW4gUEVSRi1GRUFUVVJFUyBmaWxlKQotIyAtIG9uZSBvZiB0aGUgJChMSUJfRkVBVFVSRV9URVNUUykgaXMgbm90IGRldGVjdGVkCi0jIC0gVkYgaXMgZW5hYmxlZAotCi1pZm5lcSAoIiQoUEVSRl9GRUFUVVJFUykiLCIkKFBFUkZfRkVBVFVSRVNfRklMRSkiKQotICAkKHNoZWxsIGVjaG8gIiQoUEVSRl9GRUFUVVJFUykiID4gJChPVVRQVVQpUEVSRi1GRUFUVVJFUykKLSAgZGlzcGxheV9saWIgOj0gMQotZW5kaWYKLQotZmVhdHVyZV9jaGVjayA9ICQoZXZhbCAkKGZlYXR1cmVfY2hlY2tfY29kZSkpCi1kZWZpbmUgZmVhdHVyZV9jaGVja19jb2RlCi0gIGlmbmVxICgkKGZlYXR1cmUtJCgxKSksIDEpCi0gICAgZGlzcGxheV9saWIgOj0gMQotICBlbmRpZgotZW5kZWYKLQotJChmb3JlYWNoIGZlYXQsJChMSUJfRkVBVFVSRV9URVNUUyksJChjYWxsIGZlYXR1cmVfY2hlY2ssJChmZWF0KSkpCi0KIGlmZXEgKCQoVkYpLDEpCi0gIGRpc3BsYXlfbGliIDo9IDEKLSAgZGlzcGxheV92ZiA6PSAxCi1lbmRpZgotCi1pZmVxICgkKGRpc3BsYXlfbGliKSwxKQotICAkKGluZm8gKQotICAkKGluZm8gQXV0by1kZXRlY3Rpbmcgc3lzdGVtIGZlYXR1cmVzOikKLSAgJChmb3JlYWNoIGZlYXQsJChMSUJfRkVBVFVSRV9URVNUUyksJChjYWxsIGZlYXR1cmVfcHJpbnRfc3RhdHVzLCQoZmVhdCksKSkKLQotICBpZmVxICgkKGR3YXJmLXBvc3QtdW53aW5kKSwxKQotICAgICQoY2FsbCBmZWF0dXJlX3ByaW50X3RleHQsIkRXQVJGIHBvc3QgdW53aW5kIGxpYnJhcnkiLCAkKGR3YXJmLXBvc3QtdW53aW5kLXRleHQpKQotICBlbmRpZgotZW5kaWYKLQotaWZlcSAoJChkaXNwbGF5X3ZmKSwxKQotICAkKGZvcmVhY2ggZmVhdCwkKFZGX0ZFQVRVUkVfVEVTVFMpLCQoY2FsbCBmZWF0dXJlX3ByaW50X3N0YXR1cywkKGZlYXQpLCkpCi0gICQoaW5mbyApCi0gICQoY2FsbCBmZWF0dXJlX3ByaW50X3ZhcixwcmVmaXgpCi0gICQoY2FsbCBmZWF0dXJlX3ByaW50X3ZhcixiaW5kaXIpCi0gICQoY2FsbCBmZWF0dXJlX3ByaW50X3ZhcixsaWJkaXIpCi0gICQoY2FsbCBmZWF0dXJlX3ByaW50X3ZhcixzeXNjb25mZGlyKQotICAkKGNhbGwgZmVhdHVyZV9wcmludF92YXIsTElCVU5XSU5EX0RJUikKLSAgJChjYWxsIGZlYXR1cmVfcHJpbnRfdmFyLExJQkRXX0RJUikKLWVuZGlmCi0KLWlmZXEgKCQoZGlzcGxheV9saWIpLDEpCisgICQoY2FsbCBwcmludF92YXIscHJlZml4KQorICAkKGNhbGwgcHJpbnRfdmFyLGJpbmRpcikKKyAgJChjYWxsIHByaW50X3ZhcixsaWJkaXIpCisgICQoY2FsbCBwcmludF92YXIsc3lzY29uZmRpcikKKyAgJChjYWxsIHByaW50X3ZhcixMSUJVTldJTkRfRElSKQorICAkKGNhbGwgcHJpbnRfdmFyLExJQkRXX0RJUikKICAgJChpbmZvICkKIGVuZGlmCisKKyQoY2FsbCBkZXRlY3RlZF92YXIsYmluZGlyX1NRKQorJChjYWxsIGRldGVjdGVkX3ZhcixQWVRIT05fV09SRCkKK2lmbmVxICgkKE9VVFBVVCksKQorJChjYWxsIGRldGVjdGVkX3ZhcixPVVRQVVQpCitlbmRpZgorJChjYWxsIGRldGVjdGVkX3ZhcixodG1sZGlyX1NRKQorJChjYWxsIGRldGVjdGVkX3ZhcixpbmZvZGlyX1NRKQorJChjYWxsIGRldGVjdGVkX3ZhcixtYW5kaXJfU1EpCiskKGNhbGwgZGV0ZWN0ZWRfdmFyLEVUQ19QRVJGQ09ORklHX1NRKQorJChjYWxsIGRldGVjdGVkX3ZhcixwcmVmaXhfU1EpCiskKGNhbGwgZGV0ZWN0ZWRfdmFyLHBlcmZleGVjZGlyX1NRKQorJChjYWxsIGRldGVjdGVkX3ZhcixMSUJESVIpCiskKGNhbGwgZGV0ZWN0ZWRfdmFyLEdUS19DRkxBR1MpCiskKGNhbGwgZGV0ZWN0ZWRfdmFyLFBFUkxfRU1CRURfQ0NPUFRTKQorJChjYWxsIGRldGVjdGVkX3ZhcixQWVRIT05fRU1CRURfQ0NPUFRTKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvTWFrZWZpbGUuYXJjaCBiL3Rvb2xzL3BlcmYvY29uZmlnL01ha2VmaWxlLmFyY2gKaW5kZXggYWM4NzIxZi4uZTExZmJkNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9jb25maWcvTWFrZWZpbGUuYXJjaAorKysgYi90b29scy9wZXJmL2NvbmZpZy9NYWtlZmlsZS5hcmNoCkBAIC0xLDMyICsxLDE1IEBACitpZm5kZWYgQVJDSAorQVJDSCA6PSAkKHNoZWxsIHVuYW1lIC1tIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90KQorZW5kaWYKIAotdW5hbWVfTSA6PSAkKHNoZWxsIHVuYW1lIC1tIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90KQotCi1SQVdfQVJDSCA6PSAkKHNoZWxsIGVjaG8gJCh1bmFtZV9NKSB8IHNlZCAtZSBzL2kuODYvaTM4Ni8gLWUgcy9zdW40dS9zcGFyYzY0LyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWUgcy9hcm0uKi9hcm0vIC1lIHMvc2ExMTAvYXJtLyBcCitBUkNIIDo9ICQoc2hlbGwgZWNobyAkKEFSQ0gpIHwgc2VkIC1lIHMvaS44Ni94ODYvIC1lIHMveDg2XzY0L3g4Ni8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lIHMvc3VuNHUvc3BhcmMvIC1lIHMvc3BhcmM2NC9zcGFyYy8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lIC9hcm02NC8hcy9hcm0uKi9hcm0vIC1lIHMvc2ExMTAvYXJtLyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWUgcy9zMzkweC9zMzkwLyAtZSBzL3BhcmlzYzY0L3BhcmlzYy8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lIHMvcHBjLiovcG93ZXJwYy8gLWUgcy9taXBzLiovbWlwcy8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lIHMvc2hbMjM0XS4qL3NoLyAtZSBzL2FhcmNoNjQuKi9hcm02NC8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lIHMvdGlsZS4qL3RpbGUvICkKIAotIyBBZGRpdGlvbmFsIEFSQ0ggc2V0dGluZ3MgZm9yIHg4NgotaWZlcSAoJChSQVdfQVJDSCksaTM4NikKLSAgQVJDSCA/PSB4ODYKLWVuZGlmCi0KLWlmZXEgKCQoUkFXX0FSQ0gpLHg4Nl82NCkKLSAgQVJDSCA/PSB4ODYKLQotICBpZm5lcSAoLCAkKGZpbmRzdHJpbmcgbTMyLCQoQ0ZMQUdTKSkpCi0gICAgUkFXX0FSQ0ggOj0geDg2XzMyCi0gIGVuZGlmCi1lbmRpZgotCi1pZmVxICgkKFJBV19BUkNIKSxzcGFyYzY0KQotICBBUkNIID89IHNwYXJjCi1lbmRpZgotCi1BUkNIID89ICQoUkFXX0FSQ0gpCi0KIExQNjQgOj0gJChzaGVsbCBlY2hvIF9fTFA2NF9fIHwgJHtDQ30gJHtDRkxBR1N9IC1FIC14IGMgLSB8IHRhaWwgLW4gMSkKIGlmZXEgKCQoTFA2NCksIDEpCiAgIElTXzY0X0JJVCA6PSAxCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy8uZ2l0aWdub3JlIGIvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBmM2RhMC4uMDAwMDAwMAotLS0gYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy8uZ2l0aWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi0qLmQKLSouYmluCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy9NYWtlZmlsZSBiL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzJmZjMzLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLQotRklMRVM9CQkJCQlcCi0JdGVzdC1hbGwuYmluCQkJXAotCXRlc3QtYmFja3RyYWNlLmJpbgkJXAotCXRlc3QtYmlvbmljLmJpbgkJCVwKLQl0ZXN0LWR3YXJmLmJpbgkJCVwKLQl0ZXN0LWZvcnRpZnktc291cmNlLmJpbgkJXAotCXRlc3Qtc3luYy1jb21wYXJlLWFuZC1zd2FwLmJpbglcCi0JdGVzdC1nbGliYy5iaW4JCQlcCi0JdGVzdC1ndGsyLmJpbgkJCVwKLQl0ZXN0LWd0azItaW5mb2Jhci5iaW4JCVwKLQl0ZXN0LWhlbGxvLmJpbgkJCVwKLQl0ZXN0LWxpYmF1ZGl0LmJpbgkJXAotCXRlc3QtbGliYmZkLmJpbgkJCVwKLQl0ZXN0LWxpYmVydHkuYmluCQlcCi0JdGVzdC1saWJlcnR5LXouYmluCQlcCi0JdGVzdC1jcGx1cy1kZW1hbmdsZS5iaW4JCVwKLQl0ZXN0LWxpYmVsZi5iaW4JCQlcCi0JdGVzdC1saWJlbGYtZ2V0cGhkcm51bS5iaW4JXAotCXRlc3QtbGliZWxmLW1tYXAuYmluCQlcCi0JdGVzdC1saWJudW1hLmJpbgkJXAotCXRlc3QtbGlicGVybC5iaW4JCVwKLQl0ZXN0LWxpYnB5dGhvbi5iaW4JCVwKLQl0ZXN0LWxpYnB5dGhvbi12ZXJzaW9uLmJpbglcCi0JdGVzdC1saWJzbGFuZy5iaW4JCVwKLQl0ZXN0LWxpYnVud2luZC5iaW4JCVwKLQl0ZXN0LWxpYnVud2luZC1kZWJ1Zy1mcmFtZS5iaW4JXAotCXRlc3QtcHRocmVhZC1hdHRyLXNldGFmZmluaXR5LW5wLmJpbglcCi0JdGVzdC1zdGFja3Byb3RlY3Rvci1hbGwuYmluCVwKLQl0ZXN0LXRpbWVyZmQuYmluCQlcCi0JdGVzdC1saWJkdy1kd2FyZi11bndpbmQuYmluCVwKLQl0ZXN0LWNvbXBpbGUtMzIuYmluCQlcCi0JdGVzdC1jb21waWxlLXgzMi5iaW4JCVwKLQl0ZXN0LXpsaWIuYmluCi0KLUNDIDo9ICQoQ1JPU1NfQ09NUElMRSlnY2MgLU1ECi1QS0dfQ09ORklHIDo9ICQoQ1JPU1NfQ09NUElMRSlwa2ctY29uZmlnCi0KLWFsbDogJChGSUxFUykKLQotQlVJTEQgPSAkKENDKSAkKENGTEFHUykgLW8gJChPVVRQVVQpJEAgJChwYXRzdWJzdCAlLmJpbiwlLmMsJEApICQoTERGTEFHUykKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi10ZXN0LWFsbC5iaW46Ci0JJChCVUlMRCkgLVdlcnJvciAtZnN0YWNrLXByb3RlY3Rvci1hbGwgLU8yIC1XZXJyb3IgLURfRk9SVElGWV9TT1VSQ0U9MiAtbGR3IC1sZWxmIC1sbnVtYSAtbGVsZiAtbGF1ZGl0IC1JL3Vzci9pbmNsdWRlL3NsYW5nIC1sc2xhbmcgJChzaGVsbCAkKFBLR19DT05GSUcpIC0tbGlicyAtLWNmbGFncyBndGsrLTIuMCAyPi9kZXYvbnVsbCkgJChGTEFHU19QRVJMX0VNQkVEKSAkKEZMQUdTX1BZVEhPTl9FTUJFRCkgLURQQUNLQUdFPScicGVyZiInIC1sYmZkIC1sZGwgLWx6Ci0KLXRlc3QtaGVsbG8uYmluOgotCSQoQlVJTEQpCi0KLXRlc3QtcHRocmVhZC1hdHRyLXNldGFmZmluaXR5LW5wLmJpbjoKLQkkKEJVSUxEKSAtRF9HTlVfU09VUkNFIC1XZXJyb3IgLWxwdGhyZWFkCi0KLXRlc3Qtc3RhY2twcm90ZWN0b3ItYWxsLmJpbjoKLQkkKEJVSUxEKSAtV2Vycm9yIC1mc3RhY2stcHJvdGVjdG9yLWFsbAotCi10ZXN0LWZvcnRpZnktc291cmNlLmJpbjoKLQkkKEJVSUxEKSAtTzIgLVdlcnJvciAtRF9GT1JUSUZZX1NPVVJDRT0yCi0KLXRlc3QtYmlvbmljLmJpbjoKLQkkKEJVSUxEKQotCi10ZXN0LWxpYmVsZi5iaW46Ci0JJChCVUlMRCkgLWxlbGYKLQotdGVzdC1nbGliYy5iaW46Ci0JJChCVUlMRCkKLQotdGVzdC1kd2FyZi5iaW46Ci0JJChCVUlMRCkgLWxkdwotCi10ZXN0LWxpYmVsZi1tbWFwLmJpbjoKLQkkKEJVSUxEKSAtbGVsZgotCi10ZXN0LWxpYmVsZi1nZXRwaGRybnVtLmJpbjoKLQkkKEJVSUxEKSAtbGVsZgotCi10ZXN0LWxpYm51bWEuYmluOgotCSQoQlVJTEQpIC1sbnVtYQotCi10ZXN0LWxpYnVud2luZC5iaW46Ci0JJChCVUlMRCkgLWxlbGYKLQotdGVzdC1saWJ1bndpbmQtZGVidWctZnJhbWUuYmluOgotCSQoQlVJTEQpIC1sZWxmCi0KLXRlc3QtbGliYXVkaXQuYmluOgotCSQoQlVJTEQpIC1sYXVkaXQKLQotdGVzdC1saWJzbGFuZy5iaW46Ci0JJChCVUlMRCkgLUkvdXNyL2luY2x1ZGUvc2xhbmcgLWxzbGFuZwotCi10ZXN0LWd0azIuYmluOgotCSQoQlVJTEQpICQoc2hlbGwgJChQS0dfQ09ORklHKSAtLWxpYnMgLS1jZmxhZ3MgZ3RrKy0yLjAgMj4vZGV2L251bGwpCi0KLXRlc3QtZ3RrMi1pbmZvYmFyLmJpbjoKLQkkKEJVSUxEKSAkKHNoZWxsICQoUEtHX0NPTkZJRykgLS1saWJzIC0tY2ZsYWdzIGd0aystMi4wIDI+L2Rldi9udWxsKQotCi1ncmVwLWxpYnMgID0gJChmaWx0ZXIgLWwlLCQoMSkpCi1zdHJpcC1saWJzID0gJChmaWx0ZXItb3V0IC1sJSwkKDEpKQotCi1QRVJMX0VNQkVEX0xET1BUUyA9ICQoc2hlbGwgcGVybCAtTUV4dFV0aWxzOjpFbWJlZCAtZSBsZG9wdHMgMj4vZGV2L251bGwpCi1QRVJMX0VNQkVEX0xERkxBR1MgPSAkKGNhbGwgc3RyaXAtbGlicywkKFBFUkxfRU1CRURfTERPUFRTKSkKLVBFUkxfRU1CRURfTElCQUREID0gJChjYWxsIGdyZXAtbGlicywkKFBFUkxfRU1CRURfTERPUFRTKSkKLVBFUkxfRU1CRURfQ0NPUFRTID0gYHBlcmwgLU1FeHRVdGlsczo6RW1iZWQgLWUgY2NvcHRzIDI+L2Rldi9udWxsYAotRkxBR1NfUEVSTF9FTUJFRD0kKFBFUkxfRU1CRURfQ0NPUFRTKSAkKFBFUkxfRU1CRURfTERPUFRTKQotCi10ZXN0LWxpYnBlcmwuYmluOgotCSQoQlVJTEQpICQoRkxBR1NfUEVSTF9FTUJFRCkKLQotdGVzdC1saWJweXRob24uYmluOgotCSQoQlVJTEQpCi0KLXRlc3QtbGlicHl0aG9uLXZlcnNpb24uYmluOgotCSQoQlVJTEQpCi0KLXRlc3QtbGliYmZkLmJpbjoKLQkkKEJVSUxEKSAtRFBBQ0tBR0U9JyJwZXJmIicgLWxiZmQgLWx6IC1saWJlcnR5IC1sZGwKLQotdGVzdC1saWJlcnR5LmJpbjoKLQkkKENDKSAtbyAkKE9VVFBVVCkkQCB0ZXN0LWxpYmJmZC5jIC1EUEFDS0FHRT0nInBlcmYiJyAtbGJmZCAtbGRsIC1saWJlcnR5Ci0KLXRlc3QtbGliZXJ0eS16LmJpbjoKLQkkKENDKSAtbyAkKE9VVFBVVCkkQCB0ZXN0LWxpYmJmZC5jIC1EUEFDS0FHRT0nInBlcmYiJyAtbGJmZCAtbGRsIC1saWJlcnR5IC1segotCi10ZXN0LWNwbHVzLWRlbWFuZ2xlLmJpbjoKLQkkKEJVSUxEKSAtbGliZXJ0eQotCi10ZXN0LWJhY2t0cmFjZS5iaW46Ci0JJChCVUlMRCkKLQotdGVzdC10aW1lcmZkLmJpbjoKLQkkKEJVSUxEKQotCi10ZXN0LWxpYmR3LWR3YXJmLXVud2luZC5iaW46Ci0JJChCVUlMRCkKLQotdGVzdC1zeW5jLWNvbXBhcmUtYW5kLXN3YXAuYmluOgotCSQoQlVJTEQpIC1XZXJyb3IKLQotdGVzdC1jb21waWxlLTMyLmJpbjoKLQkkKENDKSAtbTMyIC1vICQoT1VUUFVUKSRAIHRlc3QtY29tcGlsZS5jCi0KLXRlc3QtY29tcGlsZS14MzIuYmluOgotCSQoQ0MpIC1teDMyIC1vICQoT1VUUFVUKSRAIHRlc3QtY29tcGlsZS5jCi0KLXRlc3QtemxpYi5iaW46Ci0JJChCVUlMRCkgLWx6Ci0KLS1pbmNsdWRlICouZAotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWNsZWFuOgotCXJtIC1mICQoRklMRVMpICouZApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1hbGwuYyBiL3Rvb2xzL3BlcmYvY29uZmlnL2ZlYXR1cmUtY2hlY2tzL3Rlc3QtYWxsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNGQwOTMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1hbGwuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogdGVzdC1hbGwuYzogVHJ5IHRvIGJ1aWxkIGFsbCB0aGUgbWFpbiB0ZXN0Y2FzZXMgYXQgb25jZS4KLSAqCi0gKiBBIHdlbGwtY29uZmlndXJlZCBzeXN0ZW0gd2lsbCBoYXZlIGFsbCB0aGUgcHJlcmVxcyBpbnN0YWxsZWQsIHNvIHdlIGNhbiBzcGVlZAotICogdXAgYXV0by1kZXRlY3Rpb24gb24gc3VjaCBzeXN0ZW1zLgotICovCi0KLS8qCi0gKiBRdWlyazogUHl0aG9uIGFuZCBQZXJsIGhlYWRlcnMgY2Fubm90IGJlIGluIGFyYml0cmFyeSBwbGFjZXMsIHNvIGtlZXAKLSAqIHRoZXNlIDMgdGVzdGNhc2VzIGF0IHRoZSB0b3A6Ci0gKi8KLSNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfbGlicHl0aG9uCi0jIGluY2x1ZGUgInRlc3QtbGlicHl0aG9uLmMiCi0jdW5kZWYgbWFpbgotCi0jZGVmaW5lIG1haW4gbWFpbl90ZXN0X2xpYnB5dGhvbl92ZXJzaW9uCi0jIGluY2x1ZGUgInRlc3QtbGlicHl0aG9uLXZlcnNpb24uYyIKLSN1bmRlZiBtYWluCi0KLSNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfbGlicGVybAotIyBpbmNsdWRlICJ0ZXN0LWxpYnBlcmwuYyIKLSN1bmRlZiBtYWluCi0KLSNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfaGVsbG8KLSMgaW5jbHVkZSAidGVzdC1oZWxsby5jIgotI3VuZGVmIG1haW4KLQotI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJlbGYKLSMgaW5jbHVkZSAidGVzdC1saWJlbGYuYyIKLSN1bmRlZiBtYWluCi0KLSNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfbGliZWxmX21tYXAKLSMgaW5jbHVkZSAidGVzdC1saWJlbGYtbW1hcC5jIgotI3VuZGVmIG1haW4KLQotI2RlZmluZSBtYWluIG1haW5fdGVzdF9nbGliYwotIyBpbmNsdWRlICJ0ZXN0LWdsaWJjLmMiCi0jdW5kZWYgbWFpbgotCi0jZGVmaW5lIG1haW4gbWFpbl90ZXN0X2R3YXJmCi0jIGluY2x1ZGUgInRlc3QtZHdhcmYuYyIKLSN1bmRlZiBtYWluCi0KLSNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfbGliZWxmX2dldHBoZHJudW0KLSMgaW5jbHVkZSAidGVzdC1saWJlbGYtZ2V0cGhkcm51bS5jIgotI3VuZGVmIG1haW4KLQotI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJ1bndpbmQKLSMgaW5jbHVkZSAidGVzdC1saWJ1bndpbmQuYyIKLSN1bmRlZiBtYWluCi0KLSNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfbGliYXVkaXQKLSMgaW5jbHVkZSAidGVzdC1saWJhdWRpdC5jIgotI3VuZGVmIG1haW4KLQotI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJzbGFuZwotIyBpbmNsdWRlICJ0ZXN0LWxpYnNsYW5nLmMiCi0jdW5kZWYgbWFpbgotCi0jZGVmaW5lIG1haW4gbWFpbl90ZXN0X2d0azIKLSMgaW5jbHVkZSAidGVzdC1ndGsyLmMiCi0jdW5kZWYgbWFpbgotCi0jZGVmaW5lIG1haW4gbWFpbl90ZXN0X2d0azJfaW5mb2JhcgotIyBpbmNsdWRlICJ0ZXN0LWd0azItaW5mb2Jhci5jIgotI3VuZGVmIG1haW4KLQotI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJiZmQKLSMgaW5jbHVkZSAidGVzdC1saWJiZmQuYyIKLSN1bmRlZiBtYWluCi0KLSNkZWZpbmUgbWFpbiBtYWluX3Rlc3RfYmFja3RyYWNlCi0jIGluY2x1ZGUgInRlc3QtYmFja3RyYWNlLmMiCi0jdW5kZWYgbWFpbgotCi0jZGVmaW5lIG1haW4gbWFpbl90ZXN0X2xpYm51bWEKLSMgaW5jbHVkZSAidGVzdC1saWJudW1hLmMiCi0jdW5kZWYgbWFpbgotCi0jZGVmaW5lIG1haW4gbWFpbl90ZXN0X3RpbWVyZmQKLSMgaW5jbHVkZSAidGVzdC10aW1lcmZkLmMiCi0jdW5kZWYgbWFpbgotCi0jZGVmaW5lIG1haW4gbWFpbl90ZXN0X3N0YWNrcHJvdGVjdG9yX2FsbAotIyBpbmNsdWRlICJ0ZXN0LXN0YWNrcHJvdGVjdG9yLWFsbC5jIgotI3VuZGVmIG1haW4KLQotI2RlZmluZSBtYWluIG1haW5fdGVzdF9saWJkd19kd2FyZl91bndpbmQKLSMgaW5jbHVkZSAidGVzdC1saWJkdy1kd2FyZi11bndpbmQuYyIKLSN1bmRlZiBtYWluCi0KLSNkZWZpbmUgbWFpbiBtYWluX3Rlc3Rfc3luY19jb21wYXJlX2FuZF9zd2FwCi0jIGluY2x1ZGUgInRlc3Qtc3luYy1jb21wYXJlLWFuZC1zd2FwLmMiCi0jdW5kZWYgbWFpbgotCi0jZGVmaW5lIG1haW4gbWFpbl90ZXN0X3psaWIKLSMgaW5jbHVkZSAidGVzdC16bGliLmMiCi0jdW5kZWYgbWFpbgotCi0jZGVmaW5lIG1haW4gbWFpbl90ZXN0X3B0aHJlYWRfYXR0cl9zZXRhZmZpbml0eV9ucAotIyBpbmNsdWRlICJ0ZXN0LXB0aHJlYWRfYXR0cl9zZXRhZmZpbml0eV9ucC5jIgotI3VuZGVmIG1haW4KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKLXsKLQltYWluX3Rlc3RfbGlicHl0aG9uKCk7Ci0JbWFpbl90ZXN0X2xpYnB5dGhvbl92ZXJzaW9uKCk7Ci0JbWFpbl90ZXN0X2xpYnBlcmwoKTsKLQltYWluX3Rlc3RfaGVsbG8oKTsKLQltYWluX3Rlc3RfbGliZWxmKCk7Ci0JbWFpbl90ZXN0X2xpYmVsZl9tbWFwKCk7Ci0JbWFpbl90ZXN0X2dsaWJjKCk7Ci0JbWFpbl90ZXN0X2R3YXJmKCk7Ci0JbWFpbl90ZXN0X2xpYmVsZl9nZXRwaGRybnVtKCk7Ci0JbWFpbl90ZXN0X2xpYnVud2luZCgpOwotCW1haW5fdGVzdF9saWJhdWRpdCgpOwotCW1haW5fdGVzdF9saWJzbGFuZygpOwotCW1haW5fdGVzdF9ndGsyKGFyZ2MsIGFyZ3YpOwotCW1haW5fdGVzdF9ndGsyX2luZm9iYXIoYXJnYywgYXJndik7Ci0JbWFpbl90ZXN0X2xpYmJmZCgpOwotCW1haW5fdGVzdF9iYWNrdHJhY2UoKTsKLQltYWluX3Rlc3RfbGlibnVtYSgpOwotCW1haW5fdGVzdF90aW1lcmZkKCk7Ci0JbWFpbl90ZXN0X3N0YWNrcHJvdGVjdG9yX2FsbCgpOwotCW1haW5fdGVzdF9saWJkd19kd2FyZl91bndpbmQoKTsKLQltYWluX3Rlc3Rfc3luY19jb21wYXJlX2FuZF9zd2FwKGFyZ2MsIGFyZ3YpOwotCW1haW5fdGVzdF96bGliKCk7Ci0JbWFpbl90ZXN0X3B0aHJlYWRfYXR0cl9zZXRhZmZpbml0eV9ucCgpOwotCi0JcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LXB0aHJlYWQtYXR0ci1zZXRhZmZpbml0eS1ucC5jIGIvdG9vbHMvcGVyZi9jb25maWcvZmVhdHVyZS1jaGVja3MvdGVzdC1wdGhyZWFkLWF0dHItc2V0YWZmaW5pdHktbnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4MWI3Mi4uMDAwMDAwMAotLS0gYS90b29scy9wZXJmL2NvbmZpZy9mZWF0dXJlLWNoZWNrcy90ZXN0LXB0aHJlYWQtYXR0ci1zZXRhZmZpbml0eS1ucC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotaW50IG1haW4odm9pZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlwdGhyZWFkX2F0dHJfdCB0aHJlYWRfYXR0cjsKLQljcHVfc2V0X3QgY3M7Ci0KLQlwdGhyZWFkX2F0dHJfaW5pdCgmdGhyZWFkX2F0dHIpOwotCS8qIGRvbid0IGNhcmUgYWJ0IGV4YWN0IGFyZ3MsIGp1c3QgdGhlIEFQSSBpdHNlbGYgaW4gbGlicHRocmVhZCAqLwotCXJldCA9IHB0aHJlYWRfYXR0cl9zZXRhZmZpbml0eV9ucCgmdGhyZWFkX2F0dHIsIHNpemVvZihjcyksICZjcyk7Ci0KLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9jb25maWcvdXRpbGl0aWVzLm1hayBiL3Rvb2xzL3BlcmYvY29uZmlnL3V0aWxpdGllcy5tYWsKaW5kZXggNzA3NmE2Mi4uYzE2Y2U4MyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9jb25maWcvdXRpbGl0aWVzLm1haworKysgYi90b29scy9wZXJmL2NvbmZpZy91dGlsaXRpZXMubWFrCkBAIC0xNzUsNiArMTc1LDUgQEAKIGRlZmluZSBnZXQtZXhlY3V0YWJsZS1vci1kZWZhdWx0CiAkKGlmICQoJCgxKSksJChjYWxsIF9nZV9hdHRlbXB0LCQoJCgxKSksJCgxKSksJChjYWxsIF9nZV9hdHRlbXB0LCQoMikpKQogZW5kZWYKLV9nZV9hdHRlbXB0ID0gJChpZiAkKGdldC1leGVjdXRhYmxlKSwkKGdldC1leGVjdXRhYmxlKSwkKF9nZWFfd2FybikkKGNhbGwgX2dlYV9lcnIsJCgyKSkpCi1fZ2VhX3dhcm4gPSAkKHdhcm5pbmcgVGhlIHBhdGggJyQoMSknIGlzIG5vdCBleGVjdXRhYmxlLikKK19nZV9hdHRlbXB0ID0gJChpZiAkKGdldC1leGVjdXRhYmxlKSwkKGdldC1leGVjdXRhYmxlKSwkKGNhbGwgX2dlYV9lcnIsJCgyKSkpCiBfZ2VhX2VyciAgPSAkKGlmICQoMSksJChlcnJvciBQbGVhc2Ugc2V0ICckKDEpJyBhcHByb3ByaWF0ZWx5KSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvcGVyZi1jb21wbGV0aW9uLnNoIGIvdG9vbHMvcGVyZi9wZXJmLWNvbXBsZXRpb24uc2gKaW5kZXggMzM1Njk4NC4uM2JhODBiMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9wZXJmLWNvbXBsZXRpb24uc2gKKysrIGIvdG9vbHMvcGVyZi9wZXJmLWNvbXBsZXRpb24uc2gKQEAgLTQ3LDggKzQ3LDE2IEBACiAJZG9uZQogfQogCi10eXBlIF9nZXRfY29tcF93b3Jkc19ieV9yZWYgJj4vZGV2L251bGwgfHwKLV9nZXRfY29tcF93b3Jkc19ieV9yZWYoKQorIyBEZWZpbmUgcHJlbG9hZF9nZXRfY29tcF93b3Jkc19ieV9yZWY9ImZhbHNlIiwgaWYgdGhlIGZ1bmN0aW9uCisjIF9fcGVyZl9nZXRfY29tcF93b3Jkc19ieV9yZWYoKSBpcyByZXF1aXJlZCBpbnN0ZWFkLgorcHJlbG9hZF9nZXRfY29tcF93b3Jkc19ieV9yZWY9InRydWUiCisKK2lmIFsgJHByZWxvYWRfZ2V0X2NvbXBfd29yZHNfYnlfcmVmID0gInRydWUiIF07IHRoZW4KKwl0eXBlIF9nZXRfY29tcF93b3Jkc19ieV9yZWYgJj4vZGV2L251bGwgfHwKKwlwcmVsb2FkX2dldF9jb21wX3dvcmRzX2J5X3JlZj0iZmFsc2UiCitmaQorWyAkcHJlbG9hZF9nZXRfY29tcF93b3Jkc19ieV9yZWYgPSAidHJ1ZSIgXSB8fAorX19wZXJmX2dldF9jb21wX3dvcmRzX2J5X3JlZigpCiB7CiAJbG9jYWwgZXhjbHVkZSBjdXJfIHdvcmRzXyBjd29yZF8KIAlpZiBbICIkMSIgPSAiLW4iIF07IHRoZW4KQEAgLTc2LDggKzg0LDE2IEBACiAJZG9uZQogfQogCi10eXBlIF9fbHRyaW1fY29sb25fY29tcGxldGlvbnMgJj4vZGV2L251bGwgfHwKLV9fbHRyaW1fY29sb25fY29tcGxldGlvbnMoKQorIyBEZWZpbmUgcHJlbG9hZF9fbHRyaW1fY29sb25fY29tcGxldGlvbnM9ImZhbHNlIiwgaWYgdGhlIGZ1bmN0aW9uCisjIF9fcGVyZl9fbHRyaW1fY29sb25fY29tcGxldGlvbnMoKSBpcyByZXF1aXJlZCBpbnN0ZWFkLgorcHJlbG9hZF9fbHRyaW1fY29sb25fY29tcGxldGlvbnM9InRydWUiCisKK2lmIFsgJHByZWxvYWRfX2x0cmltX2NvbG9uX2NvbXBsZXRpb25zID0gInRydWUiIF07IHRoZW4KKwl0eXBlIF9fbHRyaW1fY29sb25fY29tcGxldGlvbnMgJj4vZGV2L251bGwgfHwKKwlwcmVsb2FkX19sdHJpbV9jb2xvbl9jb21wbGV0aW9ucz0iZmFsc2UiCitmaQorWyAkcHJlbG9hZF9fbHRyaW1fY29sb25fY29tcGxldGlvbnMgPSAidHJ1ZSIgXSB8fAorX19wZXJmX19sdHJpbV9jb2xvbl9jb21wbGV0aW9ucygpCiB7CiAJaWYgW1sgIiQxIiA9PSAqOiogJiYgIiRDT01QX1dPUkRCUkVBS1MiID09ICo6KiBdXTsgdGhlbgogCQkjIFJlbW92ZSBjb2xvbi13b3JkIHByZWZpeCBmcm9tIENPTVBSRVBMWSBpdGVtcwpAQCAtOTcsNyArMTEzLDMyIEBACiBfX3BlcmZjb21wX2NvbG9uICgpCiB7CiAJX19wZXJmY29tcCAiJDEiICIkMiIKLQlfX2x0cmltX2NvbG9uX2NvbXBsZXRpb25zICRjdXIKKwlpZiBbICRwcmVsb2FkX19sdHJpbV9jb2xvbl9jb21wbGV0aW9ucyA9ICJ0cnVlIiBdOyB0aGVuCisJCV9fbHRyaW1fY29sb25fY29tcGxldGlvbnMgJGN1cgorCWVsc2UKKwkJX19wZXJmX19sdHJpbV9jb2xvbl9jb21wbGV0aW9ucyAkY3VyCisJZmkKK30KKworX19wZXJmX3ByZXZfc2tpcF9vcHRzICgpCit7CisJbG9jYWwgaSBjbWRfIGNtZHNfCisKKwlsZXQgaT1jd29yZC0xCisJY21kc189JCgkY21kICQxIC0tbGlzdC1jbWRzKQorCXByZXZfc2tpcF9vcHRzPSgpCisJd2hpbGUgWyAkaSAtZ2UgMCBdOyBkbworCQlpZiBbWyAke3dvcmRzW2ldfSA9PSAkMSBdXTsgdGhlbgorCQkJcmV0dXJuCisJCWZpCisJCWZvciBjbWRfIGluICRjbWRzXzsgZG8KKwkJCWlmIFtbICR7d29yZHNbaV19ID09ICRjbWRfIF1dOyB0aGVuCisJCQkJcHJldl9za2lwX29wdHM9JHt3b3Jkc1tpXX0KKwkJCQlyZXR1cm4KKwkJCWZpCisJCWRvbmUKKwkJKChpLS0pKQorCWRvbmUKIH0KIAogX19wZXJmX21haW4gKCkKQEAgLTEwNywyOSArMTQ4LDM2IEBACiAJY21kPSR7d29yZHNbMF19CiAJQ09NUFJFUExZPSgpCiAKKwkjIFNraXAgb3B0aW9ucyBiYWNrd2FyZCBhbmQgZmluZCB0aGUgbGFzdCBwZXJmIGNvbW1hbmQKKwlfX3BlcmZfcHJldl9za2lwX29wdHMKIAkjIExpc3QgcGVyZiBzdWJjb21tYW5kcyBvciBsb25nIG9wdGlvbnMKLQlpZiBbICRjd29yZCAtZXEgMSBdOyB0aGVuCisJaWYgWyAteiAkcHJldl9za2lwX29wdHMgXTsgdGhlbgogCQlpZiBbWyAkY3VyID09IC0tKiBdXTsgdGhlbgotCQkJX19wZXJmY29tcCAnLS1oZWxwIC0tdmVyc2lvbiBcCi0JCQktLWV4ZWMtcGF0aCAtLWh0bWwtcGF0aCAtLXBhZ2luYXRlIC0tbm8tcGFnZXIgXAotCQkJLS1wZXJmLWRpciAtLXdvcmstdHJlZSAtLWRlYnVnZnMtZGlyJyAtLSAiJGN1ciIKKwkJCWNtZHM9JCgkY21kIC0tbGlzdC1vcHRzKQogCQllbHNlCiAJCQljbWRzPSQoJGNtZCAtLWxpc3QtY21kcykKLQkJCV9fcGVyZmNvbXAgIiRjbWRzIiAiJGN1ciIKIAkJZmkKKwkJX19wZXJmY29tcCAiJGNtZHMiICIkY3VyIgogCSMgTGlzdCBwb3NzaWJsZSBldmVudHMgZm9yIC1lIG9wdGlvbgotCWVsaWYgW1sgJHByZXYgPT0gIi1lIiAmJiAiJHt3b3Jkc1sxXX0iID09IEAocmVjb3JkfHN0YXR8dG9wKSBdXTsgdGhlbgorCWVsaWYgW1sgJHByZXYgPT0gQCgiLWUifCItLWV2ZW50IikgJiYKKwkJJHByZXZfc2tpcF9vcHRzID09IEAocmVjb3JkfHN0YXR8dG9wKSBdXTsgdGhlbgogCQlldnRzPSQoJGNtZCBsaXN0IC0tcmF3LWR1bXApCiAJCV9fcGVyZmNvbXBfY29sb24gIiRldnRzIiAiJGN1ciIKLQkjIExpc3Qgc3ViY29tbWFuZHMgZm9yIHBlcmYgY29tbWFuZHMKLQllbGlmIFtbICRwcmV2ID09IEAoa3ZtfGttZW18bWVtfGxvY2t8c2NoZWQpIF1dOyB0aGVuCi0JCXN1YmNtZHM9JCgkY21kICRwcmV2IC0tbGlzdC1jbWRzKQotCQlfX3BlcmZjb21wX2NvbG9uICIkc3ViY21kcyIgIiRjdXIiCi0JIyBMaXN0IGxvbmcgb3B0aW9uIG5hbWVzCi0JZWxpZiBbWyAkY3VyID09IC0tKiBdXTsgIHRoZW4KLQkJc3ViY21kPSR7d29yZHNbMV19Ci0JCW9wdHM9JCgkY21kICRzdWJjbWQgLS1saXN0LW9wdHMpCi0JCV9fcGVyZmNvbXAgIiRvcHRzIiAiJGN1ciIKKwllbHNlCisJCSMgTGlzdCBzdWJjb21tYW5kcyBmb3IgcGVyZiBjb21tYW5kcworCQlpZiBbWyAkcHJldl9za2lwX29wdHMgPT0gQChrdm18a21lbXxtZW18bG9ja3xzY2hlZHwKKwkJCXxkYXRhfGhlbHB8c2NyaXB0fHRlc3R8dGltZWNoYXJ0fHRyYWNlKSBdXTsgdGhlbgorCQkJc3ViY21kcz0kKCRjbWQgJHByZXZfc2tpcF9vcHRzIC0tbGlzdC1jbWRzKQorCQkJX19wZXJmY29tcF9jb2xvbiAiJHN1YmNtZHMiICIkY3VyIgorCQlmaQorCQkjIExpc3QgbG9uZyBvcHRpb24gbmFtZXMKKwkJaWYgW1sgJGN1ciA9PSAtLSogXV07ICB0aGVuCisJCQlzdWJjbWQ9JHByZXZfc2tpcF9vcHRzCisJCQlfX3BlcmZfcHJldl9za2lwX29wdHMgJHN1YmNtZAorCQkJc3ViY21kPSRzdWJjbWQiICIkcHJldl9za2lwX29wdHMKKwkJCW9wdHM9JCgkY21kICRzdWJjbWQgLS1saXN0LW9wdHMpCisJCQlfX3BlcmZjb21wICIkb3B0cyIgIiRjdXIiCisJCWZpCiAJZmkKIH0KIApAQCAtMTk4LDcgKzI0NiwxMSBAQAogX3BlcmYoKQogewogCWxvY2FsIGN1ciB3b3JkcyBjd29yZCBwcmV2Ci0JX2dldF9jb21wX3dvcmRzX2J5X3JlZiAtbiA9OiBjdXIgd29yZHMgY3dvcmQgcHJldgorCWlmIFsgJHByZWxvYWRfZ2V0X2NvbXBfd29yZHNfYnlfcmVmID0gInRydWUiIF07IHRoZW4KKwkJX2dldF9jb21wX3dvcmRzX2J5X3JlZiAtbiA9OiBjdXIgd29yZHMgY3dvcmQgcHJldgorCWVsc2UKKwkJX19wZXJmX2dldF9jb21wX3dvcmRzX2J5X3JlZiAtbiA9OiBjdXIgd29yZHMgY3dvcmQgcHJldgorCWZpCiAJX19wZXJmX21haW4KIH0gJiYKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9wZXJmLmMgYi90b29scy9wZXJmL3BlcmYuYwppbmRleCAzNzAwYTdmLi5iODU3ZmNiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3BlcmYuYworKysgYi90b29scy9wZXJmL3BlcmYuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgInV0aWwvcXVvdGUuaCIKICNpbmNsdWRlICJ1dGlsL3J1bi1jb21tYW5kLmgiCiAjaW5jbHVkZSAidXRpbC9wYXJzZS1ldmVudHMuaCIKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIKICNpbmNsdWRlICJ1dGlsL2RlYnVnLmgiCiAjaW5jbHVkZSA8YXBpL2ZzL2RlYnVnZnMuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CkBAIC02Miw2ICs2Myw3IEBACiAjZW5kaWYKIAl7ICJpbmplY3QiLAljbWRfaW5qZWN0LAkwIH0sCiAJeyAibWVtIiwJY21kX21lbSwJMCB9LAorCXsgImRhdGEiLAljbWRfZGF0YSwJMCB9LAogfTsKIAogc3RydWN0IHBhZ2VyX2NvbmZpZyB7CkBAIC0xMjQsNiArMTI2LDIzIEBACiAJfQogfQogCitzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwlPUFRfQVJHVU1FTlQoImhlbHAiLCAiaGVscCIpLAorCU9QVF9BUkdVTUVOVCgidmVyc2lvbiIsICJ2ZXJzaW9uIiksCisJT1BUX0FSR1VNRU5UKCJleGVjLXBhdGgiLCAiZXhlYy1wYXRoIiksCisJT1BUX0FSR1VNRU5UKCJodG1sLXBhdGgiLCAiaHRtbC1wYXRoIiksCisJT1BUX0FSR1VNRU5UKCJwYWdpbmF0ZSIsICJwYWdpbmF0ZSIpLAorCU9QVF9BUkdVTUVOVCgibm8tcGFnZXIiLCAibm8tcGFnZXIiKSwKKwlPUFRfQVJHVU1FTlQoInBlcmYtZGlyIiwgInBlcmYtZGlyIiksCisJT1BUX0FSR1VNRU5UKCJ3b3JrLXRyZWUiLCAid29yay10cmVlIiksCisJT1BUX0FSR1VNRU5UKCJkZWJ1Z2ZzLWRpciIsICJkZWJ1Z2ZzLWRpciIpLAorCU9QVF9BUkdVTUVOVCgiYnVpbGRpZC1kaXIiLCAiYnVpbGRpZC1kaXIiKSwKKwlPUFRfQVJHVU1FTlQoImxpc3QtY21kcyIsICJsaXN0LWNtZHMiKSwKKwlPUFRfQVJHVU1FTlQoImxpc3Qtb3B0cyIsICJsaXN0LW9wdHMiKSwKKwlPUFRfQVJHVU1FTlQoImRlYnVnIiwgImRlYnVnIiksCisJT1BUX0VORCgpCit9OworCiBzdGF0aWMgaW50IGhhbmRsZV9vcHRpb25zKGNvbnN0IGNoYXIgKioqYXJndiwgaW50ICphcmdjLCBpbnQgKmVudmNoYW5nZWQpCiB7CiAJaW50IGhhbmRsZWQgPSAwOwpAQCAtMjIyLDYgKzI0MSwxNiBAQAogCQkJCXN0cnVjdCBjbWRfc3RydWN0ICpwID0gY29tbWFuZHMraTsKIAkJCQlwcmludGYoIiVzICIsIHAtPmNtZCk7CiAJCQl9CisJCQlwdXRjaGFyKCdcbicpOworCQkJZXhpdCgwKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgIi0tbGlzdC1vcHRzIikpIHsKKwkJCXVuc2lnbmVkIGludCBpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvcHRpb25zKS0xOyBpKyspIHsKKwkJCQlzdHJ1Y3Qgb3B0aW9uICpwID0gb3B0aW9ucytpOworCQkJCXByaW50ZigiLS0lcyAiLCBwLT5sb25nX25hbWUpOworCQkJfQorCQkJcHV0Y2hhcignXG4nKTsKIAkJCWV4aXQoMCk7CiAJCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICItLWRlYnVnIikpIHsKIAkJCWlmICgqYXJnYyA8IDIpIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvcGVyZi5oIGIvdG9vbHMvcGVyZi9wZXJmLmgKaW5kZXggMWRhYmI4NS4uZTE0YmI2MyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9wZXJmLmgKKysrIGIvdG9vbHMvcGVyZi9wZXJmLmgKQEAgLTI5LDcgKzI5LDcgQEAKIAlyZXR1cm4gdHMudHZfc2VjICogMTAwMDAwMDAwMFVMTCArIHRzLnR2X25zZWM7CiB9CiAKLSNkZWZpbmUgTUFYX05SX0NQVVMJCQkyNTYKKyNkZWZpbmUgTUFYX05SX0NQVVMJCQkxMDI0CiAKIGV4dGVybiBjb25zdCBjaGFyICppbnB1dF9uYW1lOwogZXh0ZXJuIGJvb2wgcGVyZl9ob3N0LCBwZXJmX2d1ZXN0OwpAQCAtNTMsNiArNTMsNyBAQAogCWJvb2wJICAgICBzYW1wbGVfdGltZTsKIAlib29sCSAgICAgcGVyaW9kOwogCWJvb2wJICAgICBzYW1wbGVfaW50cl9yZWdzOworCWJvb2wJICAgICBydW5uaW5nX3RpbWU7CiAJdW5zaWduZWQgaW50IGZyZXE7CiAJdW5zaWduZWQgaW50IG1tYXBfcGFnZXM7CiAJdW5zaWduZWQgaW50IHVzZXJfZnJlcTsKQEAgLTYxLDYgKzYyLDggQEAKIAl1NjQJICAgICB1c2VyX2ludGVydmFsOwogCWJvb2wJICAgICBzYW1wbGVfdHJhbnNhY3Rpb247CiAJdW5zaWduZWQgICAgIGluaXRpYWxfZGVsYXk7CisJYm9vbCAgICAgICAgIHVzZV9jbG9ja2lkOworCWNsb2NraWRfdCAgICBjbG9ja2lkOwogfTsKIAogc3RydWN0IG9wdGlvbjsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvc2NyaXB0cy9CdWlsZCBiL3Rvb2xzL3BlcmYvc2NyaXB0cy9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWVmZDdlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9zY3JpcHRzL0J1aWxkCkBAIC0wLDAgKzEsMiBAQAorbGlicGVyZi0kKENPTkZJR19MSUJQRVJMKSAgICs9IHBlcmwvUGVyZi1UcmFjZS1VdGlsLworbGlicGVyZi0kKENPTkZJR19MSUJQWVRIT04pICs9IHB5dGhvbi9QZXJmLVRyYWNlLVV0aWwvCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3NjcmlwdHMvcGVybC9QZXJmLVRyYWNlLVV0aWwvQnVpbGQgYi90b29scy9wZXJmL3NjcmlwdHMvcGVybC9QZXJmLVRyYWNlLVV0aWwvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4ZTExMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvc2NyaXB0cy9wZXJsL1BlcmYtVHJhY2UtVXRpbC9CdWlsZApAQCAtMCwwICsxLDMgQEAKK2xpYnBlcmYteSArPSBDb250ZXh0Lm8KKworQ0ZMQUdTX0NvbnRleHQubyArPSAkKFBFUkxfRU1CRURfQ0NPUFRTKSAtV25vLXJlZHVuZGFudC1kZWNscyAtV25vLXN0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLW5lc3RlZC1leHRlcm5zIC1Xbm8tdW5kZWYgLVduby1zd2l0Y2gtZGVmYXVsdApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9zY3JpcHRzL3B5dGhvbi9QZXJmLVRyYWNlLVV0aWwvQnVpbGQgYi90b29scy9wZXJmL3NjcmlwdHMvcHl0aG9uL1BlcmYtVHJhY2UtVXRpbC9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWZjMTVjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9zY3JpcHRzL3B5dGhvbi9QZXJmLVRyYWNlLVV0aWwvQnVpbGQKQEAgLTAsMCArMSwzIEBACitsaWJwZXJmLXkgKz0gQ29udGV4dC5vCisKK0NGTEFHU19Db250ZXh0Lm8gKz0gJChQWVRIT05fRU1CRURfQ0NPUFRTKSAtV25vLXJlZHVuZGFudC1kZWNscyAtV25vLXN0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLW5lc3RlZC1leHRlcm5zCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL0J1aWxkIGIvdG9vbHMvcGVyZi90ZXN0cy9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTg4MDFiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9CdWlsZApAQCAtMCwwICsxLDQzIEBACitwZXJmLXkgKz0gYnVpbHRpbi10ZXN0Lm8KK3BlcmYteSArPSBwYXJzZS1ldmVudHMubworcGVyZi15ICs9IGRzby1kYXRhLm8KK3BlcmYteSArPSBhdHRyLm8KK3BlcmYteSArPSB2bWxpbnV4LWthbGxzeW1zLm8KK3BlcmYteSArPSBvcGVuLXN5c2NhbGwubworcGVyZi15ICs9IG9wZW4tc3lzY2FsbC1hbGwtY3B1cy5vCitwZXJmLXkgKz0gb3Blbi1zeXNjYWxsLXRwLWZpZWxkcy5vCitwZXJmLXkgKz0gbW1hcC1iYXNpYy5vCitwZXJmLXkgKz0gcGVyZi1yZWNvcmQubworcGVyZi15ICs9IHJkcG1jLm8KK3BlcmYteSArPSBldnNlbC1yb3VuZHRyaXAtbmFtZS5vCitwZXJmLXkgKz0gZXZzZWwtdHAtc2NoZWQubworcGVyZi15ICs9IGZkYXJyYXkubworcGVyZi15ICs9IHBtdS5vCitwZXJmLXkgKz0gaGlzdHNfY29tbW9uLm8KK3BlcmYteSArPSBoaXN0c19saW5rLm8KK3BlcmYteSArPSBoaXN0c19maWx0ZXIubworcGVyZi15ICs9IGhpc3RzX291dHB1dC5vCitwZXJmLXkgKz0gaGlzdHNfY3VtdWxhdGUubworcGVyZi15ICs9IHB5dGhvbi11c2UubworcGVyZi15ICs9IGJwX3NpZ25hbC5vCitwZXJmLXkgKz0gYnBfc2lnbmFsX292ZXJmbG93Lm8KK3BlcmYteSArPSB0YXNrLWV4aXQubworcGVyZi15ICs9IHN3LWNsb2NrLm8KK3BlcmYteSArPSBtbWFwLXRocmVhZC1sb29rdXAubworcGVyZi15ICs9IHRocmVhZC1tZy1zaGFyZS5vCitwZXJmLXkgKz0gc3dpdGNoLXRyYWNraW5nLm8KK3BlcmYteSArPSBrZWVwLXRyYWNraW5nLm8KK3BlcmYteSArPSBjb2RlLXJlYWRpbmcubworcGVyZi15ICs9IHNhbXBsZS1wYXJzaW5nLm8KK3BlcmYteSArPSBwYXJzZS1uby1zYW1wbGUtaWQtYWxsLm8KK3BlcmYteSArPSBrbW9kLXBhdGgubworCitwZXJmLSQoQ09ORklHX1g4NikgKz0gcGVyZi10aW1lLXRvLXRzYy5vCisKK2lmZXEgKCQoQVJDSCksJChmaWx0ZXIgJChBUkNIKSx4ODYgYXJtKSkKK3BlcmYtJChDT05GSUdfRFdBUkZfVU5XSU5EKSArPSBkd2FyZi11bndpbmQubworZW5kaWYKKworQ0ZMQUdTX2F0dHIubyAgICAgICAgICs9IC1EQklORElSPSJCVUlMRF9TVFIoJChiaW5kaXJfU1EpKSIgLURQWVRIT049IkJVSUxEX1NUUigkKFBZVEhPTl9XT1JEKSkiCitDRkxBR1NfcHl0aG9uLXVzZS5vICAgKz0gLURQWVRIT05QQVRIPSJCVUlMRF9TVFIoJChPVVRQVVQpcHl0aG9uKSIgLURQWVRIT049IkJVSUxEX1NUUigkKFBZVEhPTl9XT1JEKSkiCitDRkxBR1NfZHdhcmYtdW53aW5kLm8gKz0gLWZuby1vcHRpbWl6ZS1zaWJsaW5nLWNhbGxzCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2F0dHIvYmFzZS1yZWNvcmQgYi90b29scy9wZXJmL3Rlc3RzL2F0dHIvYmFzZS1yZWNvcmQKaW5kZXggZDMwOTVkYS4uN2U2ZDc0OSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9hdHRyL2Jhc2UtcmVjb3JkCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvYXR0ci9iYXNlLXJlY29yZApAQCAtNSw3ICs1LDcgQEAKIGZsYWdzPTB8OAogY3B1PSoKIHR5cGU9MHwxCi1zaXplPTEwNAorc2l6ZT0xMTIKIGNvbmZpZz0wCiBzYW1wbGVfcGVyaW9kPTQwMDAKIHNhbXBsZV90eXBlPTI2MwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy9hdHRyL2Jhc2Utc3RhdCBiL3Rvb2xzL3BlcmYvdGVzdHMvYXR0ci9iYXNlLXN0YXQKaW5kZXggODcyZWQ3ZS4uZjRjZjE0OCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9hdHRyL2Jhc2Utc3RhdAorKysgYi90b29scy9wZXJmL3Rlc3RzL2F0dHIvYmFzZS1zdGF0CkBAIC01LDcgKzUsNyBAQAogZmxhZ3M9MHw4CiBjcHU9KgogdHlwZT0wCi1zaXplPTEwNAorc2l6ZT0xMTIKIGNvbmZpZz0wCiBzYW1wbGVfcGVyaW9kPTAKIHNhbXBsZV90eXBlPTAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvYnVpbHRpbi10ZXN0LmMgYi90b29scy9wZXJmL3Rlc3RzL2J1aWx0aW4tdGVzdC5jCmluZGV4IDRiN2Q5YWIuLjRmNDA5ODEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvYnVpbHRpbi10ZXN0LmMKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9idWlsdGluLXRlc3QuYwpAQCAtMTY3LDYgKzE2NywxMCBAQAogCQkuZnVuYyA9IHRlc3RfX2ZkYXJyYXlfX2FkZCwKIAl9LAogCXsKKwkJLmRlc2MgPSAiVGVzdCBrbW9kX3BhdGhfX3BhcnNlIGZ1bmN0aW9uIiwKKwkJLmZ1bmMgPSB0ZXN0X19rbW9kX3BhdGhfX3BhcnNlLAorCX0sCisJewogCQkuZnVuYyA9IE5VTEwsCiAJfSwKIH07CkBAIC0yOTEsNyArMjk1LDcgQEAKIAogaW50IGNtZF90ZXN0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fbWF5YmVfdW51c2VkKQogewotCWNvbnN0IGNoYXIgKiBjb25zdCB0ZXN0X3VzYWdlW10gPSB7CisJY29uc3QgY2hhciAqdGVzdF91c2FnZVtdID0gewogCSJwZXJmIHRlc3QgWzxvcHRpb25zPl0gW3tsaXN0IDx0ZXN0LW5hbWUtZnJhZ21lbnQ+fFs8dGVzdC1uYW1lLWZyYWdtZW50cz58PHRlc3QtbnVtYmVycz5dfV0iLAogCU5VTEwsCiAJfTsKQEAgLTMwMiwxMyArMzA2LDE0IEBACiAJCSAgICAiYmUgbW9yZSB2ZXJib3NlIChzaG93IHN5bWJvbCBhZGRyZXNzLCBldGMpIiksCiAJT1BUX0VORCgpCiAJfTsKKwljb25zdCBjaGFyICogY29uc3QgdGVzdF9zdWJjb21tYW5kc1tdID0geyAibGlzdCIsIE5VTEwgfTsKIAlzdHJ1Y3QgaW50bGlzdCAqc2tpcGxpc3QgPSBOVUxMOwogICAgICAgICBpbnQgcmV0ID0gaGlzdHNfX2luaXQoKTsKIAogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogCi0JYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgdGVzdF9vcHRpb25zLCB0ZXN0X3VzYWdlLCAwKTsKKwlhcmdjID0gcGFyc2Vfb3B0aW9uc19zdWJjb21tYW5kKGFyZ2MsIGFyZ3YsIHRlc3Rfb3B0aW9ucywgdGVzdF9zdWJjb21tYW5kcywgdGVzdF91c2FnZSwgMCk7CiAJaWYgKGFyZ2MgPj0gMSAmJiAhc3RyY21wKGFyZ3ZbMF0sICJsaXN0IikpCiAJCXJldHVybiBwZXJmX3Rlc3RfX2xpc3QoYXJnYywgYXJndik7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvZHNvLWRhdGEuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvZHNvLWRhdGEuYwppbmRleCBjYWFmMzdmLi41MTNlNWZlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL2Rzby1kYXRhLmMKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9kc28tZGF0YS5jCkBAIC0xMTIsNiArMTEyLDkgQEAKIAogCWRzbyA9IGRzb19fbmV3KChjb25zdCBjaGFyICopZmlsZSk7CiAKKwlURVNUX0FTU0VSVF9WQUwoIkZhaWxlZCB0byBhY2Nlc3MgdG8gZHNvIiwKKwkJCWRzb19fZGF0YV9mZChkc28sICZtYWNoaW5lKSA+PSAwKTsKKwogCS8qIEJhc2ljIDEwIGJ5dGVzIHRlc3RzLiAqLwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9mZnNldHMpOyBpKyspIHsKIAkJc3RydWN0IHRlc3RfZGF0YV9vZmZzZXQgKmRhdGEgPSAmb2Zmc2V0c1tpXTsKQEAgLTI0Myw4ICsyNDYsOCBAQAogCWxpbWl0ID0gbnIgKiA0OwogCVRFU1RfQVNTRVJUX1ZBTCgiZmFpbGVkIHRvIHNldCBmaWxlIGxpbWl0IiwgIXNldF9mZF9saW1pdChsaW1pdCkpOwogCi0JLyogYW5kIHRoaXMgaXMgbm93IG91ciBkc28gb3BlbiBGRHMgbGltaXQgKyAxIGV4dHJhICovCi0JZHNvX2NudCA9IGxpbWl0IC8gMiArIDE7CisJLyogYW5kIHRoaXMgaXMgbm93IG91ciBkc28gb3BlbiBGRHMgbGltaXQgKi8KKwlkc29fY250ID0gbGltaXQgLyAyOwogCVRFU1RfQVNTRVJUX1ZBTCgiZmFpbGVkIHRvIGNyZWF0ZSBkc29zXG4iLAogCQkhZHNvc19fY3JlYXRlKGRzb19jbnQsIFRFU1RfRklMRV9TSVpFKSk7CiAKQEAgLTI1MiwxMyArMjU1LDEzIEBACiAJCXN0cnVjdCBkc28gKmRzbyA9IGRzb3NbaV07CiAKIAkJLyoKLQkJICogT3BlbiBkc29zIHZpYSBkc29fX2RhdGFfZmQgb3IgZHNvX19kYXRhX3JlYWRfb2Zmc2V0LgotCQkgKiBCb3RoIG9wZW5zIHRoZSBkYXRhIGZpbGUgYW5kIGtlZXAgaXQgb3Blbi4KKwkJICogT3BlbiBkc29zIHZpYSBkc29fX2RhdGFfZmQoKSwgaXQgb3BlbnMgdGhlIGRhdGEKKwkJICogZmlsZSBhbmQga2VlcCBpdCBvcGVuICh1bmxlc3Mgb3BlbiBmaWxlIGxpbWl0KS4KIAkJICovCisJCWZkID0gZHNvX19kYXRhX2ZkKGRzbywgJm1hY2hpbmUpOworCQlURVNUX0FTU0VSVF9WQUwoImZhaWxlZCB0byBnZXQgZmQiLCBmZCA+IDApOworCiAJCWlmIChpICUgMikgewotCQkJZmQgPSBkc29fX2RhdGFfZmQoZHNvLCAmbWFjaGluZSk7Ci0JCQlURVNUX0FTU0VSVF9WQUwoImZhaWxlZCB0byBnZXQgZmQiLCBmZCA+IDApOwotCQl9IGVsc2UgewogCQkJI2RlZmluZSBCVUZTSVpFIDEwCiAJCQl1OCBidWZbQlVGU0laRV07CiAJCQlzc2l6ZV90IG47CkBAIC0yNjgsNyArMjcxLDEwIEBACiAJCX0KIAl9CiAKLQkvKiBvcGVuICsxIGRzbyBvdmVyIHRoZSBhbGxvd2VkIGxpbWl0ICovCisJLyogdmVyaWZ5IHRoZSBmaXJzdCBvbmUgaXMgYWxyZWFkeSBvcGVuICovCisJVEVTVF9BU1NFUlRfVkFMKCJkc29zWzBdIGlzIG5vdCBvcGVuIiwgZHNvc1swXS0+ZGF0YS5mZCAhPSAtMSk7CisKKwkvKiBvcGVuICsxIGRzbyB0byByZWFjaCB0aGUgYWxsb3dlZCBsaW1pdCAqLwogCWZkID0gZHNvX19kYXRhX2ZkKGRzb3NbaV0sICZtYWNoaW5lKTsKIAlURVNUX0FTU0VSVF9WQUwoImZhaWxlZCB0byBnZXQgZmQiLCBmZCA+IDApOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL2ttb2QtcGF0aC5jIGIvdG9vbHMvcGVyZi90ZXN0cy9rbW9kLXBhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQ3Y2JiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9rbW9kLXBhdGguYwpAQCAtMCwwICsxLDczIEBACisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgInRlc3RzLmgiCisjaW5jbHVkZSAiZHNvLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworc3RhdGljIGludCB0ZXN0KGNvbnN0IGNoYXIgKnBhdGgsIGJvb2wgYWxsb2NfbmFtZSwgYm9vbCBhbGxvY19leHQsCisJCWJvb2wga21vZCwgYm9vbCBjb21wLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpleHQpCit7CisJc3RydWN0IGttb2RfcGF0aCBtOworCisJbWVtc2V0KCZtLCAweDAsIHNpemVvZihtKSk7CisKKwlURVNUX0FTU0VSVF9WQUwoImttb2RfcGF0aF9fcGFyc2UiLAorCQkJIV9fa21vZF9wYXRoX19wYXJzZSgmbSwgcGF0aCwgYWxsb2NfbmFtZSwgYWxsb2NfZXh0KSk7CisKKwlwcl9kZWJ1ZygiJXMgLSBhbGxvYyBuYW1lICVkLCBhbGxvYyBleHQgJWQsIGttb2QgJWQsIGNvbXAgJWQsIG5hbWUgJyVzJywgZXh0ICclcydcbiIsCisJCSBwYXRoLCBhbGxvY19uYW1lLCBhbGxvY19leHQsIG0ua21vZCwgbS5jb21wLCBtLm5hbWUsIG0uZXh0KTsKKworCVRFU1RfQVNTRVJUX1ZBTCgid3Jvbmcga21vZCIsIG0ua21vZCA9PSBrbW9kKTsKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGNvbXAiLCBtLmNvbXAgPT0gY29tcCk7CisKKwlpZiAoZXh0KQorCQlURVNUX0FTU0VSVF9WQUwoIndyb25nIGV4dCIsIG0uZXh0ICYmICFzdHJjbXAoZXh0LCBtLmV4dCkpOworCWVsc2UKKwkJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleHQiLCAhbS5leHQpOworCisJaWYgKG5hbWUpCisJCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgbmFtZSIsIG0ubmFtZSAmJiAhc3RyY21wKG5hbWUsIG0ubmFtZSkpOworCWVsc2UKKwkJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBuYW1lIiwgIW0ubmFtZSk7CisKKwlmcmVlKG0ubmFtZSk7CisJZnJlZShtLmV4dCk7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgVChwYXRoLCBhbiwgYWUsIGssIGMsIG4sIGUpIFwKKwlURVNUX0FTU0VSVF9WQUwoImZhaWxlZCIsICF0ZXN0KHBhdGgsIGFuLCBhZSwgaywgYywgbiwgZSkpCisKK2ludCB0ZXN0X19rbW9kX3BhdGhfX3BhcnNlKHZvaWQpCit7CisJLyogcGF0aCAgICAgICAgICAgICAgICBhbGxvY19uYW1lICBhbGxvY19leHQgICBrbW9kICBjb21wICAgbmFtZSAgICAgZXh0ICovCisJVCgiL3h4eHgveHh4eC94LXgua28iLCB0cnVlICAgICAgLCB0cnVlICAgICAgLCB0cnVlLCBmYWxzZSwgIlt4X3hdIiwgTlVMTCk7CisJVCgiL3h4eHgveHh4eC94LXgua28iLCBmYWxzZSAgICAgLCB0cnVlICAgICAgLCB0cnVlLCBmYWxzZSwgTlVMTCAgICwgTlVMTCk7CisJVCgiL3h4eHgveHh4eC94LXgua28iLCB0cnVlICAgICAgLCBmYWxzZSAgICAgLCB0cnVlLCBmYWxzZSwgIlt4X3hdIiwgTlVMTCk7CisJVCgiL3h4eHgveHh4eC94LXgua28iLCBmYWxzZSAgICAgLCBmYWxzZSAgICAgLCB0cnVlLCBmYWxzZSwgTlVMTCAgICwgTlVMTCk7CisKKwkvKiBwYXRoICAgICAgICAgICAgICAgIGFsbG9jX25hbWUgIGFsbG9jX2V4dCAgIGttb2QgIGNvbXAgIG5hbWUgICBleHQgKi8KKwlUKCIveHh4eC94eHh4L3gua28uZ3oiLCB0cnVlICAgICAsIHRydWUgICAgICAsIHRydWUsIHRydWUsICJbeF0iLCAiZ3oiKTsKKwlUKCIveHh4eC94eHh4L3gua28uZ3oiLCBmYWxzZSAgICAsIHRydWUgICAgICAsIHRydWUsIHRydWUsIE5VTEwgLCAiZ3oiKTsKKwlUKCIveHh4eC94eHh4L3gua28uZ3oiLCB0cnVlICAgICAsIGZhbHNlICAgICAsIHRydWUsIHRydWUsICJbeF0iLCBOVUxMKTsKKwlUKCIveHh4eC94eHh4L3gua28uZ3oiLCBmYWxzZSAgICAsIGZhbHNlICAgICAsIHRydWUsIHRydWUsIE5VTEwgLCBOVUxMKTsKKworCS8qIHBhdGggICAgICAgICAgICAgIGFsbG9jX25hbWUgIGFsbG9jX2V4dCAga21vZCAgIGNvbXAgIG5hbWUgICAgZXh0ICovCisJVCgiL3h4eHgveHh4eC94Lmd6IiwgdHJ1ZSAgICAgICwgdHJ1ZSAgICAgLCBmYWxzZSwgdHJ1ZSwgInguZ3oiICwiZ3oiKTsKKwlUKCIveHh4eC94eHh4L3guZ3oiLCBmYWxzZSAgICAgLCB0cnVlICAgICAsIGZhbHNlLCB0cnVlLCBOVUxMICAgLCJneiIpOworCVQoIi94eHh4L3h4eHgveC5neiIsIHRydWUgICAgICAsIGZhbHNlICAgICwgZmFsc2UsIHRydWUsICJ4Lmd6IiAsIE5VTEwpOworCVQoIi94eHh4L3h4eHgveC5neiIsIGZhbHNlICAgICAsIGZhbHNlICAgICwgZmFsc2UsIHRydWUsIE5VTEwgICAsIE5VTEwpOworCisJLyogcGF0aCAgIGFsbG9jX25hbWUgIGFsbG9jX2V4dCAga21vZCAgIGNvbXAgIG5hbWUgICAgIGV4dCAqLworCVQoInguZ3oiLCB0cnVlICAgICAgLCB0cnVlICAgICAsIGZhbHNlLCB0cnVlLCAieC5neiIsICJneiIpOworCVQoInguZ3oiLCBmYWxzZSAgICAgLCB0cnVlICAgICAsIGZhbHNlLCB0cnVlLCBOVUxMICAsICJneiIpOworCVQoInguZ3oiLCB0cnVlICAgICAgLCBmYWxzZSAgICAsIGZhbHNlLCB0cnVlLCAieC5neiIsIE5VTEwpOworCVQoInguZ3oiLCBmYWxzZSAgICAgLCBmYWxzZSAgICAsIGZhbHNlLCB0cnVlLCBOVUxMICAsIE5VTEwpOworCisJLyogcGF0aCAgICAgIGFsbG9jX25hbWUgIGFsbG9jX2V4dCAga21vZCAgY29tcCAgbmFtZSAgZXh0ICovCisJVCgieC5rby5neiIsIHRydWUgICAgICAsIHRydWUgICAgICwgdHJ1ZSwgdHJ1ZSwgIlt4XSIsICJneiIpOworCVQoIngua28uZ3oiLCBmYWxzZSAgICAgLCB0cnVlICAgICAsIHRydWUsIHRydWUsIE5VTEwgLCAiZ3oiKTsKKwlUKCJ4LmtvLmd6IiwgdHJ1ZSAgICAgICwgZmFsc2UgICAgLCB0cnVlLCB0cnVlLCAiW3hdIiwgTlVMTCk7CisJVCgieC5rby5neiIsIGZhbHNlICAgICAsIGZhbHNlICAgICwgdHJ1ZSwgdHJ1ZSwgTlVMTCAsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL21ha2UgYi90b29scy9wZXJmL3Rlc3RzL21ha2UKaW5kZXggNzU3MDlkMi4uYmZmODUzMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9tYWtlCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvbWFrZQpAQCAtNSw3ICs1LDcgQEAKIAogIyBGSVhNRSBsb29rcyBsaWtlIHg4NiBpcyB0aGUgb25seSBhcmNoIHJ1bm5pbmcgdGVzdHMgOy0pCiAjIHdlIG5lZWQgc29tZSBJU18oMzIvNjQpIGZsYWcgdG8gbWFrZSB0aGlzIGdlbmVyaWMKLWlmZXEgKCQoSVNfWDg2XzY0KSwxKQoraWZlcSAoJChBUkNIKSQoSVNfNjRfQklUKSwgeDg2MSkKIGxpYiA9IGxpYjY0CiBlbHNlCiBsaWIgPSBsaWIKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvb3Blbi1zeXNjYWxsLWFsbC1jcHVzLmMgYi90b29scy9wZXJmL3Rlc3RzL29wZW4tc3lzY2FsbC1hbGwtY3B1cy5jCmluZGV4IDhmYTgyZDEuLjNlYzg4NWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdGVzdHMvb3Blbi1zeXNjYWxsLWFsbC1jcHVzLmMKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy9vcGVuLXN5c2NhbGwtYWxsLWNwdXMuYwpAQCAtMjksNyArMjksMTIgQEAKIAogCWV2c2VsID0gcGVyZl9ldnNlbF9fbmV3dHAoInN5c2NhbGxzIiwgInN5c19lbnRlcl9vcGVuIik7CiAJaWYgKGV2c2VsID09IE5VTEwpIHsKLQkJcHJfZGVidWcoImlzIGRlYnVnZnMgbW91bnRlZCBvbiAvc3lzL2tlcm5lbC9kZWJ1Zz9cbiIpOworCQlpZiAodHJhY2Vmc19jb25maWd1cmVkKCkpCisJCQlwcl9kZWJ1ZygiaXMgdHJhY2VmcyBtb3VudGVkIG9uIC9zeXMva2VybmVsL3RyYWNpbmc/XG4iKTsKKwkJZWxzZSBpZiAoZGVidWdmc19jb25maWd1cmVkKCkpCisJCQlwcl9kZWJ1ZygiaXMgZGVidWdmcyBtb3VudGVkIG9uIC9zeXMva2VybmVsL2RlYnVnP1xuIik7CisJCWVsc2UKKwkJCXByX2RlYnVnKCJOZWl0aGVyIHRyYWNlZnMgb3IgZGVidWdmcyBpcyBlbmFibGVkIGluIHRoaXMga2VybmVsXG4iKTsKIAkJZ290byBvdXRfdGhyZWFkX21hcF9kZWxldGU7CiAJfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3Rlc3RzL29wZW4tc3lzY2FsbC5jIGIvdG9vbHMvcGVyZi90ZXN0cy9vcGVuLXN5c2NhbGwuYwppbmRleCBhMzNiMmRhLi4wN2FhMzE5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL29wZW4tc3lzY2FsbC5jCisrKyBiL3Rvb2xzL3BlcmYvdGVzdHMvb3Blbi1zeXNjYWxsLmMKQEAgLTE4LDcgKzE4LDEyIEBACiAKIAlldnNlbCA9IHBlcmZfZXZzZWxfX25ld3RwKCJzeXNjYWxscyIsICJzeXNfZW50ZXJfb3BlbiIpOwogCWlmIChldnNlbCA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCJpcyBkZWJ1Z2ZzIG1vdW50ZWQgb24gL3N5cy9rZXJuZWwvZGVidWc/XG4iKTsKKwkJaWYgKHRyYWNlZnNfY29uZmlndXJlZCgpKQorCQkJcHJfZGVidWcoImlzIHRyYWNlZnMgbW91bnRlZCBvbiAvc3lzL2tlcm5lbC90cmFjaW5nP1xuIik7CisJCWVsc2UgaWYgKGRlYnVnZnNfY29uZmlndXJlZCgpKQorCQkJcHJfZGVidWcoImlzIGRlYnVnZnMgbW91bnRlZCBvbiAvc3lzL2tlcm5lbC9kZWJ1Zz9cbiIpOworCQllbHNlCisJCQlwcl9kZWJ1ZygiTmVpdGhlciB0cmFjZWZzIG9yIGRlYnVnZnMgaXMgZW5hYmxlZCBpbiB0aGlzIGtlcm5lbFxuIik7CiAJCWdvdG8gb3V0X3RocmVhZF9tYXBfZGVsZXRlOwogCX0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi90ZXN0cy9wYXJzZS1ldmVudHMuYyBiL3Rvb2xzL3BlcmYvdGVzdHMvcGFyc2UtZXZlbnRzLmMKaW5kZXggMWNkYWIwYy4uM2RlNzQ0OSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi90ZXN0cy9wYXJzZS1ldmVudHMuYworKysgYi90b29scy9wZXJmL3Rlc3RzL3BhcnNlLWV2ZW50cy5jCkBAIC0zLDYgKzMsNyBAQAogI2luY2x1ZGUgImV2c2VsLmgiCiAjaW5jbHVkZSAiZXZsaXN0LmgiCiAjaW5jbHVkZSA8YXBpL2ZzL2ZzLmg+CisjaW5jbHVkZSA8YXBpL2ZzL3RyYWNlZnMuaD4KICNpbmNsdWRlIDxhcGkvZnMvZGVidWdmcy5oPgogI2luY2x1ZGUgInRlc3RzLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTI5NCw2ICsyOTUsMzYgQEAKIAlyZXR1cm4gdGVzdF9fY2hlY2tldmVudF9nZW5odyhldmxpc3QpOwogfQogCitzdGF0aWMgaW50IHRlc3RfX2NoZWNrZXZlbnRfZXhjbHVkZV9pZGxlX21vZGlmaWVyKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IHBlcmZfZXZsaXN0X19maXJzdChldmxpc3QpOworCisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlIGlkbGUiLCBldnNlbC0+YXR0ci5leGNsdWRlX2lkbGUpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgZXhjbHVkZSBndWVzdCIsICFldnNlbC0+YXR0ci5leGNsdWRlX2d1ZXN0KTsKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGV4Y2x1ZGUgaG9zdCIsICFldnNlbC0+YXR0ci5leGNsdWRlX2hvc3QpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgZXhjbHVkZV91c2VyIiwgIWV2c2VsLT5hdHRyLmV4Y2x1ZGVfdXNlcik7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX2tlcm5lbCIsICFldnNlbC0+YXR0ci5leGNsdWRlX2tlcm5lbCk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX2h2IiwgIWV2c2VsLT5hdHRyLmV4Y2x1ZGVfaHYpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgcHJlY2lzZV9pcCIsICFldnNlbC0+YXR0ci5wcmVjaXNlX2lwKTsKKworCXJldHVybiB0ZXN0X19jaGVja2V2ZW50X3N5bWJvbGljX25hbWUoZXZsaXN0KTsKK30KKworc3RhdGljIGludCB0ZXN0X19jaGVja2V2ZW50X2V4Y2x1ZGVfaWRsZV9tb2RpZmllcl8xKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IHBlcmZfZXZsaXN0X19maXJzdChldmxpc3QpOworCisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlIGlkbGUiLCBldnNlbC0+YXR0ci5leGNsdWRlX2lkbGUpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgZXhjbHVkZSBndWVzdCIsICFldnNlbC0+YXR0ci5leGNsdWRlX2d1ZXN0KTsKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGV4Y2x1ZGUgaG9zdCIsIGV2c2VsLT5hdHRyLmV4Y2x1ZGVfaG9zdCk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX3VzZXIiLCBldnNlbC0+YXR0ci5leGNsdWRlX3VzZXIpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgZXhjbHVkZV9rZXJuZWwiLCAhZXZzZWwtPmF0dHIuZXhjbHVkZV9rZXJuZWwpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgZXhjbHVkZV9odiIsIGV2c2VsLT5hdHRyLmV4Y2x1ZGVfaHYpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgcHJlY2lzZV9pcCIsICFldnNlbC0+YXR0ci5wcmVjaXNlX2lwKTsKKworCXJldHVybiB0ZXN0X19jaGVja2V2ZW50X3N5bWJvbGljX25hbWUoZXZsaXN0KTsKK30KKwogc3RhdGljIGludCB0ZXN0X19jaGVja2V2ZW50X2JyZWFrcG9pbnRfbW9kaWZpZXIoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCiB7CiAJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsID0gcGVyZl9ldmxpc3RfX2ZpcnN0KGV2bGlzdCk7CkBAIC0xMTkyLDExICsxMjIzLDE5IEBACiB7CiAJY2hhciBldmVudHNfcGF0aFtQQVRIX01BWF07CiAJc3RydWN0IGRpcmVudCAqZXZlbnRzX2VudDsKKwljb25zdCBjaGFyICptb3VudHBvaW50OwogCURJUiAqZXZlbnRzX2RpcjsKIAlpbnQgY250ID0gMDsKIAotCXNjbnByaW50ZihldmVudHNfcGF0aCwgUEFUSF9NQVgsICIlcy90cmFjaW5nL2V2ZW50cyIsCi0JCSAgZGVidWdmc19maW5kX21vdW50cG9pbnQoKSk7CisJbW91bnRwb2ludCA9IHRyYWNlZnNfZmluZF9tb3VudHBvaW50KCk7CisJaWYgKG1vdW50cG9pbnQpIHsKKwkJc2NucHJpbnRmKGV2ZW50c19wYXRoLCBQQVRIX01BWCwgIiVzL2V2ZW50cyIsCisJCQkgIG1vdW50cG9pbnQpOworCX0gZWxzZSB7CisJCW1vdW50cG9pbnQgPSBkZWJ1Z2ZzX2ZpbmRfbW91bnRwb2ludCgpOworCQlzY25wcmludGYoZXZlbnRzX3BhdGgsIFBBVEhfTUFYLCAiJXMvdHJhY2luZy9ldmVudHMiLAorCQkJICBtb3VudHBvaW50KTsKKwl9CiAKIAlldmVudHNfZGlyID0gb3BlbmRpcihldmVudHNfcGF0aCk7CiAKQEAgLTE0ODUsNiArMTUyNCwxNiBAQAogCQkuaWQgICAgPSAxMDAsCiAJfSwKICNlbmRpZgorCXsKKwkJLm5hbWUgID0gImluc3RydWN0aW9uczpJIiwKKwkJLmNoZWNrID0gdGVzdF9fY2hlY2tldmVudF9leGNsdWRlX2lkbGVfbW9kaWZpZXIsCisJCS5pZCAgICA9IDQ1LAorCX0sCisJeworCQkubmFtZSAgPSAiaW5zdHJ1Y3Rpb25zOmtJRyIsCisJCS5jaGVjayA9IHRlc3RfX2NoZWNrZXZlbnRfZXhjbHVkZV9pZGxlX21vZGlmaWVyXzEsCisJCS5pZCAgICA9IDQ2LAorCX0sCiB9OwogCiBzdGF0aWMgc3RydWN0IGV2bGlzdF90ZXN0IHRlc3RfX2V2ZW50c19wbXVbXSA9IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdGVzdHMvdGVzdHMuaCBiL3Rvb2xzL3BlcmYvdGVzdHMvdGVzdHMuaAppbmRleCAwMGU3NzZhLi41Mjc1OGEzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3Rlc3RzL3Rlc3RzLmgKKysrIGIvdG9vbHMvcGVyZi90ZXN0cy90ZXN0cy5oCkBAIC01MSw2ICs1MSw3IEBACiBpbnQgdGVzdF9fc3dpdGNoX3RyYWNraW5nKHZvaWQpOwogaW50IHRlc3RfX2ZkYXJyYXlfX2ZpbHRlcih2b2lkKTsKIGludCB0ZXN0X19mZGFycmF5X19hZGQodm9pZCk7CitpbnQgdGVzdF9fa21vZF9wYXRoX19wYXJzZSh2b2lkKTsKIAogI2lmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX2FybV9fKQogI2lmZGVmIEhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvQnVpbGQgYi90b29scy9wZXJmL3VpL0J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNzM1MzgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3VpL0J1aWxkCkBAIC0wLDAgKzEsMTQgQEAKK2xpYnBlcmYteSArPSBzZXR1cC5vCitsaWJwZXJmLXkgKz0gaGVscGxpbmUubworbGlicGVyZi15ICs9IHByb2dyZXNzLm8KK2xpYnBlcmYteSArPSB1dGlsLm8KK2xpYnBlcmYteSArPSBoaXN0Lm8KK2xpYnBlcmYteSArPSBzdGRpby9oaXN0Lm8KKworQ0ZMQUdTX3NldHVwLm8gKz0gLURMSUJESVI9IkJVSUxEX1NUUigkKExJQkRJUikpIgorCitsaWJwZXJmLSQoQ09ORklHX1NMQU5HKSArPSBicm93c2VyLm8KK2xpYnBlcmYtJChDT05GSUdfU0xBTkcpICs9IGJyb3dzZXJzLworbGlicGVyZi0kKENPTkZJR19TTEFORykgKz0gdHVpLworCitDRkxBR1NfYnJvd3Nlci5vICs9IC1ERU5BQkxFX1NMRlVUVVJFX0NPTlNUCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3VpL2Jyb3dzZXJzL0J1aWxkIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTIyM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9CdWlsZApAQCAtMCwwICsxLDEwIEBACitsaWJwZXJmLXkgKz0gYW5ub3RhdGUubworbGlicGVyZi15ICs9IGhpc3RzLm8KK2xpYnBlcmYteSArPSBtYXAubworbGlicGVyZi15ICs9IHNjcmlwdHMubworbGlicGVyZi15ICs9IGhlYWRlci5vCisKK0NGTEFHU19hbm5vdGF0ZS5vICs9IC1ERU5BQkxFX1NMRlVUVVJFX0NPTlNUCitDRkxBR1NfaGlzdHMubyAgICArPSAtREVOQUJMRV9TTEZVVFVSRV9DT05TVAorQ0ZMQUdTX21hcC5vICAgICAgKz0gLURFTkFCTEVfU0xGVVRVUkVfQ09OU1QKK0NGTEFHU19zY3JpcHRzLm8gICs9IC1ERU5BQkxFX1NMRlVUVVJFX0NPTlNUCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMgYi90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2Fubm90YXRlLmMKaW5kZXggOWQzMmUzYy4uZTUyNTBlYiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91aS9icm93c2Vycy9hbm5vdGF0ZS5jCisrKyBiL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvYW5ub3RhdGUuYwpAQCAtODI5LDEwICs4MjksMTYgQEAKIAlyZXR1cm4ga2V5OwogfQogCitpbnQgbWFwX3N5bWJvbF9fdHVpX2Fubm90YXRlKHN0cnVjdCBtYXBfc3ltYm9sICptcywgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJICAgICBzdHJ1Y3QgaGlzdF9icm93c2VyX3RpbWVyICpoYnQpCit7CisJcmV0dXJuIHN5bWJvbF9fdHVpX2Fubm90YXRlKG1zLT5zeW0sIG1zLT5tYXAsIGV2c2VsLCBoYnQpOworfQorCiBpbnQgaGlzdF9lbnRyeV9fdHVpX2Fubm90YXRlKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAogCQkJICAgICBzdHJ1Y3QgaGlzdF9icm93c2VyX3RpbWVyICpoYnQpCiB7Ci0JcmV0dXJuIHN5bWJvbF9fdHVpX2Fubm90YXRlKGhlLT5tcy5zeW0sIGhlLT5tcy5tYXAsIGV2c2VsLCBoYnQpOworCXJldHVybiBtYXBfc3ltYm9sX190dWlfYW5ub3RhdGUoJmhlLT5tcywgZXZzZWwsIGhidCk7CiB9CiAKIHN0YXRpYyB2b2lkIGFubm90YXRlX2Jyb3dzZXJfX21hcmtfanVtcF90YXJnZXRzKHN0cnVjdCBhbm5vdGF0ZV9icm93c2VyICpicm93c2VyLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jIGIvdG9vbHMvcGVyZi91aS9icm93c2Vycy9oaXN0cy5jCmluZGV4IDc4ODUwNmUuLjk5NWI3YTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdWkvYnJvd3NlcnMvaGlzdHMuYworKysgYi90b29scy9wZXJmL3VpL2Jyb3dzZXJzL2hpc3RzLmMKQEAgLTQ4LDYgKzQ4LDI0IEBACiAJcmV0dXJuIGhpc3RzX19oYXNfZmlsdGVyKGhiLT5oaXN0cykgfHwgaGItPm1pbl9wY250OwogfQogCitzdGF0aWMgaW50IGhpc3RfYnJvd3Nlcl9fZ2V0X2ZvbGRpbmcoc3RydWN0IGhpc3RfYnJvd3NlciAqYnJvd3NlcikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CisJc3RydWN0IGhpc3RzICpoaXN0cyA9IGJyb3dzZXItPmhpc3RzOworCWludCB1bmZvbGRlZF9yb3dzID0gMDsKKworCWZvciAobmQgPSByYl9maXJzdCgmaGlzdHMtPmVudHJpZXMpOworCSAgICAgKG5kID0gaGlzdHNfX2ZpbHRlcl9lbnRyaWVzKG5kLCBicm93c2VyLT5taW5fcGNudCkpICE9IE5VTEw7CisJICAgICBuZCA9IHJiX25leHQobmQpKSB7CisJCXN0cnVjdCBoaXN0X2VudHJ5ICpoZSA9CisJCQlyYl9lbnRyeShuZCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOworCisJCWlmIChoZS0+bXMudW5mb2xkZWQpCisJCQl1bmZvbGRlZF9yb3dzICs9IGhlLT5ucl9yb3dzOworCX0KKwlyZXR1cm4gdW5mb2xkZWRfcm93czsKK30KKwogc3RhdGljIHUzMiBoaXN0X2Jyb3dzZXJfX25yX2VudHJpZXMoc3RydWN0IGhpc3RfYnJvd3NlciAqaGIpCiB7CiAJdTMyIG5yX2VudHJpZXM7CkBAIC01Nyw2ICs3NSw3IEBACiAJZWxzZQogCQlucl9lbnRyaWVzID0gaGItPmhpc3RzLT5ucl9lbnRyaWVzOwogCisJaGItPm5yX2NhbGxjaGFpbl9yb3dzID0gaGlzdF9icm93c2VyX19nZXRfZm9sZGluZyhoYik7CiAJcmV0dXJuIG5yX2VudHJpZXMgKyBoYi0+bnJfY2FsbGNoYWluX3Jvd3M7CiB9CiAKQEAgLTQ5Miw2ICs1MTEsNyBAQAogewogCWludCBjb2xvciwgd2lkdGg7CiAJY2hhciBmb2xkZWRfc2lnbiA9IGNhbGxjaGFpbl9saXN0X19mb2xkZWQoY2hhaW4pOworCWJvb2wgc2hvd19hbm5vdGF0ZWQgPSBicm93c2VyLT5zaG93X2RzbyAmJiBjaGFpbi0+bXMuc3ltICYmIHN5bWJvbF9fYW5ub3RhdGlvbihjaGFpbi0+bXMuc3ltKS0+c3JjOwogCiAJY29sb3IgPSBIRV9DT0xPUlNFVF9OT1JNQUw7CiAJd2lkdGggPSBicm93c2VyLT5iLndpZHRoIC0gKG9mZnNldCArIDIpOwpAQCAtNTA0LDcgKzUyNCw4IEBACiAJdWlfYnJvd3Nlcl9fc2V0X2NvbG9yKCZicm93c2VyLT5iLCBjb2xvcik7CiAJaGlzdF9icm93c2VyX19nb3RvcmMoYnJvd3Nlciwgcm93LCAwKTsKIAlzbHNtZ193cml0ZV9uc3RyaW5nKCIgIiwgb2Zmc2V0KTsKLQlzbHNtZ19wcmludGYoIiVjICIsIGZvbGRlZF9zaWduKTsKKwlzbHNtZ19wcmludGYoIiVjIiwgZm9sZGVkX3NpZ24pOworCXVpX2Jyb3dzZXJfX3dyaXRlX2dyYXBoKCZicm93c2VyLT5iLCBzaG93X2Fubm90YXRlZCA/IFNMU01HX1JBUlJPV19DSEFSIDogJyAnKTsKIAlzbHNtZ193cml0ZV9uc3RyaW5nKHN0ciwgd2lkdGgpOwogfQogCkBAIC0xNDY3LDcgKzE0ODgsNyBAQAogCQlwZXJmX2hwcF9fc2V0X3VzZXJfd2lkdGgoc3ltYm9sX2NvbmYuY29sX3dpZHRoX2xpc3Rfc3RyKTsKIAogCXdoaWxlICgxKSB7Ci0JCWNvbnN0IHN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IE5VTEw7CisJCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IE5VTEw7CiAJCWNvbnN0IHN0cnVjdCBkc28gKmRzbyA9IE5VTEw7CiAJCWludCBjaG9pY2UgPSAwLAogCQkgICAgYW5ub3RhdGUgPSAtMiwgem9vbV9kc28gPSAtMiwgem9vbV90aHJlYWQgPSAtMiwKQEAgLTE1OTMsMjggKzE2MTQsMzAgQEAKIAkJaWYgKCFzb3J0X19oYXNfc3ltKQogCQkJZ290byBhZGRfZXhpdF9vcHRpb247CiAKKwkJaWYgKGJyb3dzZXItPnNlbGVjdGlvbiA9PSBOVUxMKQorCQkJZ290byBza2lwX2Fubm90YXRpb247CisKIAkJaWYgKHNvcnRfX21vZGUgPT0gU09SVF9NT0RFX19CUkFOQ0gpIHsKIAkJCWJpID0gYnJvd3Nlci0+aGVfc2VsZWN0aW9uLT5icmFuY2hfaW5mbzsKLQkJCWlmIChicm93c2VyLT5zZWxlY3Rpb24gIT0gTlVMTCAmJgotCQkJICAgIGJpICYmCi0JCQkgICAgYmktPmZyb20uc3ltICE9IE5VTEwgJiYKLQkJCSAgICAhYmktPmZyb20ubWFwLT5kc28tPmFubm90YXRlX3dhcm5lZCAmJgotCQkJCWFzcHJpbnRmKCZvcHRpb25zW25yX29wdGlvbnNdLCAiQW5ub3RhdGUgJXMiLAotCQkJCQkgYmktPmZyb20uc3ltLT5uYW1lKSA+IDApCi0JCQkJYW5ub3RhdGVfZiA9IG5yX29wdGlvbnMrKzsKIAotCQkJaWYgKGJyb3dzZXItPnNlbGVjdGlvbiAhPSBOVUxMICYmCi0JCQkgICAgYmkgJiYKLQkJCSAgICBiaS0+dG8uc3ltICE9IE5VTEwgJiYKKwkJCWlmIChiaSA9PSBOVUxMKQorCQkJCWdvdG8gc2tpcF9hbm5vdGF0aW9uOworCisJCQlpZiAoYmktPmZyb20uc3ltICE9IE5VTEwgJiYKKwkJCSAgICAhYmktPmZyb20ubWFwLT5kc28tPmFubm90YXRlX3dhcm5lZCAmJgorCQkJICAgIGFzcHJpbnRmKCZvcHRpb25zW25yX29wdGlvbnNdLCAiQW5ub3RhdGUgJXMiLCBiaS0+ZnJvbS5zeW0tPm5hbWUpID4gMCkgeworCQkJCWFubm90YXRlX2YgPSBucl9vcHRpb25zKys7CisJCQl9CisKKwkJCWlmIChiaS0+dG8uc3ltICE9IE5VTEwgJiYKIAkJCSAgICAhYmktPnRvLm1hcC0+ZHNvLT5hbm5vdGF0ZV93YXJuZWQgJiYKIAkJCSAgICAoYmktPnRvLnN5bSAhPSBiaS0+ZnJvbS5zeW0gfHwKIAkJCSAgICAgYmktPnRvLm1hcC0+ZHNvICE9IGJpLT5mcm9tLm1hcC0+ZHNvKSAmJgotCQkJCWFzcHJpbnRmKCZvcHRpb25zW25yX29wdGlvbnNdLCAiQW5ub3RhdGUgJXMiLAotCQkJCQkgYmktPnRvLnN5bS0+bmFtZSkgPiAwKQorCQkJICAgIGFzcHJpbnRmKCZvcHRpb25zW25yX29wdGlvbnNdLCAiQW5ub3RhdGUgJXMiLCBiaS0+dG8uc3ltLT5uYW1lKSA+IDApIHsKIAkJCQlhbm5vdGF0ZV90ID0gbnJfb3B0aW9ucysrOworCQkJfQogCQl9IGVsc2UgewotCQkJaWYgKGJyb3dzZXItPnNlbGVjdGlvbiAhPSBOVUxMICYmCi0JCQkgICAgYnJvd3Nlci0+c2VsZWN0aW9uLT5zeW0gIT0gTlVMTCAmJgorCQkJaWYgKGJyb3dzZXItPnNlbGVjdGlvbi0+c3ltICE9IE5VTEwgJiYKIAkJCSAgICAhYnJvd3Nlci0+c2VsZWN0aW9uLT5tYXAtPmRzby0+YW5ub3RhdGVfd2FybmVkKSB7CiAJCQkJc3RydWN0IGFubm90YXRpb24gKm5vdGVzOwogCkBAIC0xNjIyLDExICsxNjQ1LDEyIEBACiAKIAkJCQlpZiAobm90ZXMtPnNyYyAmJgogCQkJCSAgICBhc3ByaW50Zigmb3B0aW9uc1tucl9vcHRpb25zXSwgIkFubm90YXRlICVzIiwKLQkJCQkJCSBicm93c2VyLT5zZWxlY3Rpb24tPnN5bS0+bmFtZSkgPiAwKQorCQkJCQkJIGJyb3dzZXItPnNlbGVjdGlvbi0+c3ltLT5uYW1lKSA+IDApIHsKIAkJCQkJYW5ub3RhdGUgPSBucl9vcHRpb25zKys7CisJCQkJfQogCQkJfQogCQl9Ci0KK3NraXBfYW5ub3RhdGlvbjoKIAkJaWYgKHRocmVhZCAhPSBOVUxMICYmCiAJCSAgICBhc3ByaW50Zigmb3B0aW9uc1tucl9vcHRpb25zXSwgIlpvb20gJXMgJXMoJWQpIHRocmVhZCIsCiAJCQkgICAgIChicm93c2VyLT5oaXN0cy0+dGhyZWFkX2ZpbHRlciA/ICJvdXQgb2YiIDogImludG8iKSwKQEAgLTE2ODIsNiArMTcwNiw3IEBACiAJCWlmIChjaG9pY2UgPT0gYW5ub3RhdGUgfHwgY2hvaWNlID09IGFubm90YXRlX3QgfHwgY2hvaWNlID09IGFubm90YXRlX2YpIHsKIAkJCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKIAkJCXN0cnVjdCBhbm5vdGF0aW9uICpub3RlczsKKwkJCXN0cnVjdCBtYXBfc3ltYm9sIG1zOwogCQkJaW50IGVycjsKIGRvX2Fubm90YXRlOgogCQkJaWYgKCFvYmpkdW1wX3BhdGggJiYgcGVyZl9zZXNzaW9uX2Vudl9fbG9va3VwX29iamR1bXAoZW52KSkKQEAgLTE2OTEsMzAgKzE3MTYsMjEgQEAKIAkJCWlmIChoZSA9PSBOVUxMKQogCQkJCWNvbnRpbnVlOwogCi0JCQkvKgotCQkJICogd2Ugc3Rhc2ggdGhlIGJyYW5jaF9pbmZvIHN5bWJvbCArIG1hcCBpbnRvIHRoZQotCQkJICogdGhlIG1zIHNvIHdlIGRvbid0IGhhdmUgdG8gcmV3cml0ZSBhbGwgdGhlIGFubm90YXRpb24KLQkJCSAqIGNvZGUgdG8gdXNlIGJyYW5jaF9pbmZvLgotCQkJICogaW4gYnJhbmNoIG1vZGUsIHRoZSBtcyBzdHJ1Y3QgaXMgbm90IHVzZWQKLQkJCSAqLwogCQkJaWYgKGNob2ljZSA9PSBhbm5vdGF0ZV9mKSB7Ci0JCQkJaGUtPm1zLnN5bSA9IGhlLT5icmFuY2hfaW5mby0+ZnJvbS5zeW07Ci0JCQkJaGUtPm1zLm1hcCA9IGhlLT5icmFuY2hfaW5mby0+ZnJvbS5tYXA7Ci0JCQl9ICBlbHNlIGlmIChjaG9pY2UgPT0gYW5ub3RhdGVfdCkgewotCQkJCWhlLT5tcy5zeW0gPSBoZS0+YnJhbmNoX2luZm8tPnRvLnN5bTsKLQkJCQloZS0+bXMubWFwID0gaGUtPmJyYW5jaF9pbmZvLT50by5tYXA7CisJCQkJbXMubWFwID0gaGUtPmJyYW5jaF9pbmZvLT5mcm9tLm1hcDsKKwkJCQltcy5zeW0gPSBoZS0+YnJhbmNoX2luZm8tPmZyb20uc3ltOworCQkJfSBlbHNlIGlmIChjaG9pY2UgPT0gYW5ub3RhdGVfdCkgeworCQkJCW1zLm1hcCA9IGhlLT5icmFuY2hfaW5mby0+dG8ubWFwOworCQkJCW1zLnN5bSA9IGhlLT5icmFuY2hfaW5mby0+dG8uc3ltOworCQkJfSBlbHNlIHsKKwkJCQltcyA9ICpicm93c2VyLT5zZWxlY3Rpb247CiAJCQl9CiAKLQkJCW5vdGVzID0gc3ltYm9sX19hbm5vdGF0aW9uKGhlLT5tcy5zeW0pOworCQkJbm90ZXMgPSBzeW1ib2xfX2Fubm90YXRpb24obXMuc3ltKTsKIAkJCWlmICghbm90ZXMtPnNyYykKIAkJCQljb250aW51ZTsKIAotCQkJLyoKLQkJCSAqIERvbid0IGxldCB0aGlzIGJlIGZyZWVkLCBzYXksIGJ5IGhpc3RzX19kZWNheV9lbnRyeS4KLQkJCSAqLwotCQkJaGUtPnVzZWQgPSB0cnVlOwotCQkJZXJyID0gaGlzdF9lbnRyeV9fdHVpX2Fubm90YXRlKGhlLCBldnNlbCwgaGJ0KTsKLQkJCWhlLT51c2VkID0gZmFsc2U7CisJCQllcnIgPSBtYXBfc3ltYm9sX190dWlfYW5ub3RhdGUoJm1zLCBldnNlbCwgaGJ0KTsKIAkJCS8qCiAJCQkgKiBvZmZlciBvcHRpb24gdG8gYW5ub3RhdGUgdGhlIG90aGVyIGJyYW5jaCBzb3VyY2Ugb3IgdGFyZ2V0CiAJCQkgKiAoaWYgdGhleSBleGlzdHMpIHdoZW4gcmV0dXJuaW5nIGZyb20gYW5ub3RhdGUKQEAgLTE3NTQsMTMgKzE3NzAsMTMgQEAKIAkJCQlwc3RhY2tfX3JlbW92ZShmc3RhY2ssICZicm93c2VyLT5oaXN0cy0+dGhyZWFkX2ZpbHRlcik7CiB6b29tX291dF90aHJlYWQ6CiAJCQkJdWlfaGVscGxpbmVfX3BvcCgpOwotCQkJCWJyb3dzZXItPmhpc3RzLT50aHJlYWRfZmlsdGVyID0gTlVMTDsKKwkJCQl0aHJlYWRfX3pwdXQoYnJvd3Nlci0+aGlzdHMtPnRocmVhZF9maWx0ZXIpOwogCQkJCXBlcmZfaHBwX19zZXRfZWxpZGUoSElTVENfVEhSRUFELCBmYWxzZSk7CiAJCQl9IGVsc2UgewogCQkJCXVpX2hlbHBsaW5lX19mcHVzaCgiVG8gem9vbSBvdXQgcHJlc3MgPC0gb3IgLT4gKyBcIlpvb20gb3V0IG9mICVzKCVkKSB0aHJlYWRcIiIsCiAJCQkJCQkgICB0aHJlYWQtPmNvbW1fc2V0ID8gdGhyZWFkX19jb21tX3N0cih0aHJlYWQpIDogIiIsCiAJCQkJCQkgICB0aHJlYWQtPnRpZCk7Ci0JCQkJYnJvd3Nlci0+aGlzdHMtPnRocmVhZF9maWx0ZXIgPSB0aHJlYWQ7CisJCQkJYnJvd3Nlci0+aGlzdHMtPnRocmVhZF9maWx0ZXIgPSB0aHJlYWRfX2dldCh0aHJlYWQpOwogCQkJCXBlcmZfaHBwX19zZXRfZWxpZGUoSElTVENfVEhSRUFELCBmYWxzZSk7CiAJCQkJcHN0YWNrX19wdXNoKGZzdGFjaywgJmJyb3dzZXItPmhpc3RzLT50aHJlYWRfZmlsdGVyKTsKIAkJCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdWkvZ3RrL0J1aWxkIGIvdG9vbHMvcGVyZi91aS9ndGsvQnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyMmU4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdWkvZ3RrL0J1aWxkCkBAIC0wLDAgKzEsOSBAQAorQ0ZMQUdTX2d0ayArPSAtZlBJQyAkKEdUS19DRkxBR1MpCisKK2d0ay15ICs9IGJyb3dzZXIubworZ3RrLXkgKz0gaGlzdHMubworZ3RrLXkgKz0gc2V0dXAubworZ3RrLXkgKz0gdXRpbC5vCitndGsteSArPSBoZWxwbGluZS5vCitndGsteSArPSBwcm9ncmVzcy5vCitndGsteSArPSBhbm5vdGF0ZS5vCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3VpL3R1aS9CdWlsZCBiL3Rvb2xzL3BlcmYvdWkvdHVpL0J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNGM2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3VpL3R1aS9CdWlsZApAQCAtMCwwICsxLDQgQEAKK2xpYnBlcmYteSArPSBzZXR1cC5vCitsaWJwZXJmLXkgKz0gdXRpbC5vCitsaWJwZXJmLXkgKz0gaGVscGxpbmUubworbGlicGVyZi15ICs9IHByb2dyZXNzLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9CdWlsZCBiL3Rvb2xzL3BlcmYvdXRpbC9CdWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc0OTBhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL0J1aWxkCkBAIC0wLDAgKzEsMTQ1IEBACitsaWJwZXJmLXkgKz0gYWJzcGF0aC5vCitsaWJwZXJmLXkgKz0gYWxpYXMubworbGlicGVyZi15ICs9IGFubm90YXRlLm8KK2xpYnBlcmYteSArPSBidWlsZC1pZC5vCitsaWJwZXJmLXkgKz0gY29uZmlnLm8KK2xpYnBlcmYteSArPSBjdHlwZS5vCitsaWJwZXJmLXkgKz0gZGItZXhwb3J0Lm8KK2xpYnBlcmYteSArPSBlbnZpcm9ubWVudC5vCitsaWJwZXJmLXkgKz0gZXZlbnQubworbGlicGVyZi15ICs9IGV2bGlzdC5vCitsaWJwZXJmLXkgKz0gZXZzZWwubworbGlicGVyZi15ICs9IGV4ZWNfY21kLm8KK2xpYnBlcmYteSArPSBmaW5kX25leHRfYml0Lm8KK2xpYnBlcmYteSArPSBoZWxwLm8KK2xpYnBlcmYteSArPSBrYWxsc3ltcy5vCitsaWJwZXJmLXkgKz0gbGV2ZW5zaHRlaW4ubworbGlicGVyZi15ICs9IHBhcnNlLW9wdGlvbnMubworbGlicGVyZi15ICs9IHBhcnNlLWV2ZW50cy5vCitsaWJwZXJmLXkgKz0gcGF0aC5vCitsaWJwZXJmLXkgKz0gcmJ0cmVlLm8KK2xpYnBlcmYteSArPSBiaXRtYXAubworbGlicGVyZi15ICs9IGh3ZWlnaHQubworbGlicGVyZi15ICs9IHJ1bi1jb21tYW5kLm8KK2xpYnBlcmYteSArPSBxdW90ZS5vCitsaWJwZXJmLXkgKz0gc3RyYnVmLm8KK2xpYnBlcmYteSArPSBzdHJpbmcubworbGlicGVyZi15ICs9IHN0cmxpc3QubworbGlicGVyZi15ICs9IHN0cmZpbHRlci5vCitsaWJwZXJmLXkgKz0gdG9wLm8KK2xpYnBlcmYteSArPSB1c2FnZS5vCitsaWJwZXJmLXkgKz0gd3JhcHBlci5vCitsaWJwZXJmLXkgKz0gc2lnY2hhaW4ubworbGlicGVyZi15ICs9IGRzby5vCitsaWJwZXJmLXkgKz0gc3ltYm9sLm8KK2xpYnBlcmYteSArPSBjb2xvci5vCitsaWJwZXJmLXkgKz0gcGFnZXIubworbGlicGVyZi15ICs9IGhlYWRlci5vCitsaWJwZXJmLXkgKz0gY2FsbGNoYWluLm8KK2xpYnBlcmYteSArPSB2YWx1ZXMubworbGlicGVyZi15ICs9IGRlYnVnLm8KK2xpYnBlcmYteSArPSBtYWNoaW5lLm8KK2xpYnBlcmYteSArPSBtYXAubworbGlicGVyZi15ICs9IHBzdGFjay5vCitsaWJwZXJmLXkgKz0gc2Vzc2lvbi5vCitsaWJwZXJmLXkgKz0gb3JkZXJlZC1ldmVudHMubworbGlicGVyZi15ICs9IGNvbW0ubworbGlicGVyZi15ICs9IHRocmVhZC5vCitsaWJwZXJmLXkgKz0gdGhyZWFkX21hcC5vCitsaWJwZXJmLXkgKz0gdHJhY2UtZXZlbnQtcGFyc2UubworbGlicGVyZi15ICs9IHBhcnNlLWV2ZW50cy1mbGV4Lm8KK2xpYnBlcmYteSArPSBwYXJzZS1ldmVudHMtYmlzb24ubworbGlicGVyZi15ICs9IHBtdS5vCitsaWJwZXJmLXkgKz0gcG11LWZsZXgubworbGlicGVyZi15ICs9IHBtdS1iaXNvbi5vCitsaWJwZXJmLXkgKz0gdHJhY2UtZXZlbnQtcmVhZC5vCitsaWJwZXJmLXkgKz0gdHJhY2UtZXZlbnQtaW5mby5vCitsaWJwZXJmLXkgKz0gdHJhY2UtZXZlbnQtc2NyaXB0aW5nLm8KK2xpYnBlcmYteSArPSB0cmFjZS1ldmVudC5vCitsaWJwZXJmLXkgKz0gc3ZnaGVscGVyLm8KK2xpYnBlcmYteSArPSBzb3J0Lm8KK2xpYnBlcmYteSArPSBoaXN0Lm8KK2xpYnBlcmYteSArPSB1dGlsLm8KK2xpYnBlcmYteSArPSB4eWFycmF5Lm8KK2xpYnBlcmYteSArPSBjcHVtYXAubworbGlicGVyZi15ICs9IGNncm91cC5vCitsaWJwZXJmLXkgKz0gdGFyZ2V0Lm8KK2xpYnBlcmYteSArPSByYmxpc3QubworbGlicGVyZi15ICs9IGludGxpc3QubworbGlicGVyZi15ICs9IHZkc28ubworbGlicGVyZi15ICs9IHN0YXQubworbGlicGVyZi15ICs9IHJlY29yZC5vCitsaWJwZXJmLXkgKz0gc3JjbGluZS5vCitsaWJwZXJmLXkgKz0gZGF0YS5vCitsaWJwZXJmLSQoQ09ORklHX1g4NikgKz0gdHNjLm8KK2xpYnBlcmYteSArPSBjbG9leGVjLm8KK2xpYnBlcmYteSArPSB0aHJlYWQtc3RhY2subworCitsaWJwZXJmLSQoQ09ORklHX0xJQkVMRikgKz0gc3ltYm9sLWVsZi5vCitsaWJwZXJmLSQoQ09ORklHX0xJQkVMRikgKz0gcHJvYmUtZXZlbnQubworCitpZm5kZWYgQ09ORklHX0xJQkVMRgorbGlicGVyZi15ICs9IHN5bWJvbC1taW5pbWFsLm8KK2VuZGlmCisKK2xpYnBlcmYtJChDT05GSUdfRFdBUkYpICs9IHByb2JlLWZpbmRlci5vCitsaWJwZXJmLSQoQ09ORklHX0RXQVJGKSArPSBkd2FyZi1hdXgubworCitsaWJwZXJmLSQoQ09ORklHX0xJQkRXX0RXQVJGX1VOV0lORCkgKz0gdW53aW5kLWxpYmR3Lm8KK2xpYnBlcmYtJChDT05GSUdfTElCVU5XSU5EKSAgICAgICAgICArPSB1bndpbmQtbGlidW53aW5kLm8KKworbGlicGVyZi0kKENPTkZJR19MSUJCQUJFTFRSQUNFKSArPSBkYXRhLWNvbnZlcnQtYnQubworCitsaWJwZXJmLXkgKz0gc2NyaXB0aW5nLWVuZ2luZXMvCisKK2xpYnBlcmYtJChDT05GSUdfUEVSRl9SRUdTKSArPSBwZXJmX3JlZ3MubworbGlicGVyZi0kKENPTkZJR19aTElCKSArPSB6bGliLm8KK2xpYnBlcmYtJChDT05GSUdfTFpNQSkgKz0gbHptYS5vCisKK0NGTEFHU19jb25maWcubyAgICs9IC1ERVRDX1BFUkZDT05GSUc9IkJVSUxEX1NUUigkKEVUQ19QRVJGQ09ORklHX1NRKSkiCitDRkxBR1NfZXhlY19jbWQubyArPSAtRFBFUkZfRVhFQ19QQVRIPSJCVUlMRF9TVFIoJChwZXJmZXhlY2Rpcl9TUSkpIiAtRFBSRUZJWD0iQlVJTERfU1RSKCQocHJlZml4X1NRKSkiCisKKyQoT1VUUFVUKXV0aWwvcGFyc2UtZXZlbnRzLWZsZXguYzogdXRpbC9wYXJzZS1ldmVudHMubCAkKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy1iaXNvbi5jCisJJChjYWxsIHJ1bGVfbWtkaXIpCisJQCQoY2FsbCBlY2hvLWNtZCxmbGV4KSQoRkxFWCkgLW8gJEAgLS1oZWFkZXItZmlsZT0kKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy1mbGV4LmggJChQQVJTRVJfREVCVUdfRkxFWCkgdXRpbC9wYXJzZS1ldmVudHMubAorCiskKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy1iaXNvbi5jOiB1dGlsL3BhcnNlLWV2ZW50cy55CisJJChjYWxsIHJ1bGVfbWtkaXIpCisJQCQoY2FsbCBlY2hvLWNtZCxiaXNvbikkKEJJU09OKSAtdiB1dGlsL3BhcnNlLWV2ZW50cy55IC1kICQoUEFSU0VSX0RFQlVHX0JJU09OKSAtbyAkQCAtcCBwYXJzZV9ldmVudHNfCisKKyQoT1VUUFVUKXV0aWwvcG11LWZsZXguYzogdXRpbC9wbXUubCAkKE9VVFBVVCl1dGlsL3BtdS1iaXNvbi5jCisJJChjYWxsIHJ1bGVfbWtkaXIpCisJQCQoY2FsbCBlY2hvLWNtZCxmbGV4KSQoRkxFWCkgLW8gJEAgLS1oZWFkZXItZmlsZT0kKE9VVFBVVCl1dGlsL3BtdS1mbGV4LmggdXRpbC9wbXUubAorCiskKE9VVFBVVCl1dGlsL3BtdS1iaXNvbi5jOiB1dGlsL3BtdS55CisJJChjYWxsIHJ1bGVfbWtkaXIpCisJQCQoY2FsbCBlY2hvLWNtZCxiaXNvbikkKEJJU09OKSAtdiB1dGlsL3BtdS55IC1kIC1vICRAIC1wIHBlcmZfcG11XworCitDRkxBR1NfcGFyc2UtZXZlbnRzLWZsZXgubyAgKz0gLXcKK0NGTEFHU19wbXUtZmxleC5vICAgICAgICAgICArPSAtdworQ0ZMQUdTX3BhcnNlLWV2ZW50cy1iaXNvbi5vICs9IC1EWVlFTkFCTEVfTkxTPTAgLURZWUxUWVBFX0lTX1RSSVZJQUw9MCAtdworQ0ZMQUdTX3BtdS1iaXNvbi5vICAgICAgICAgICs9IC1EWVlFTkFCTEVfTkxTPTAgLURZWUxUWVBFX0lTX1RSSVZJQUw9MCAtdworCiskKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy5vOiAkKE9VVFBVVCl1dGlsL3BhcnNlLWV2ZW50cy1mbGV4LmMgJChPVVRQVVQpdXRpbC9wYXJzZS1ldmVudHMtYmlzb24uYworJChPVVRQVVQpdXRpbC9wbXUubzogJChPVVRQVVQpdXRpbC9wbXUtZmxleC5jICQoT1VUUFVUKXV0aWwvcG11LWJpc29uLmMKKworQ0ZMQUdTX2ZpbmRfbmV4dF9iaXQubyArPSAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLURFVENfUEVSRkNPTkZJRz0iQlVJTERfU1RSKCQoRVRDX1BFUkZDT05GSUdfU1EpKSIKK0NGTEFHU19yYnRyZWUubyAgICAgICAgKz0gLVduby11bnVzZWQtcGFyYW1ldGVyIC1ERVRDX1BFUkZDT05GSUc9IkJVSUxEX1NUUigkKEVUQ19QRVJGQ09ORklHX1NRKSkiCitDRkxBR1NfaHdlaWdodC5vICAgICAgICs9IC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtREVUQ19QRVJGQ09ORklHPSJCVUlMRF9TVFIoJChFVENfUEVSRkNPTkZJR19TUSkpIgorQ0ZMQUdTX3BhcnNlLWV2ZW50cy5vICArPSAtV25vLXJlZHVuZGFudC1kZWNscworCiskKE9VVFBVVCl1dGlsL2thbGxzeW1zLm86IC4uL2xpYi9zeW1ib2wva2FsbHN5bXMuYyBGT1JDRQorCSQoY2FsbCBydWxlX21rZGlyKQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19vX2MpCisKKyQoT1VUUFVUKXV0aWwvZmluZF9uZXh0X2JpdC5vOiAuLi9saWIvdXRpbC9maW5kX25leHRfYml0LmMgRk9SQ0UKKwkkKGNhbGwgcnVsZV9ta2RpcikKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfb19jKQorCiskKE9VVFBVVCl1dGlsL3JidHJlZS5vOiAuLi8uLi9saWIvcmJ0cmVlLmMgRk9SQ0UKKwkkKGNhbGwgcnVsZV9ta2RpcikKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfb19jKQorCiskKE9VVFBVVCl1dGlsL2h3ZWlnaHQubzogLi4vLi4vbGliL2h3ZWlnaHQuYyBGT1JDRQorCSQoY2FsbCBydWxlX21rZGlyKQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19vX2MpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuYyBiL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5jCmluZGV4IDYxYmY5MTIuLjdmNWJkZmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5jCkBAIC0zMCw2ICszMCw4IEBACiAKIHN0YXRpYyB2b2lkIGluc19fZGVsZXRlKHN0cnVjdCBpbnNfb3BlcmFuZHMgKm9wcykKIHsKKwlpZiAob3BzID09IE5VTEwpCisJCXJldHVybjsKIAl6ZnJlZSgmb3BzLT5zb3VyY2UucmF3KTsKIAl6ZnJlZSgmb3BzLT5zb3VyY2UubmFtZSk7CiAJemZyZWUoJm9wcy0+dGFyZ2V0LnJhdyk7CkBAIC0xMDA4LDYgKzEwMTAsMzIgQEAKIAkJCX0KIAkJCWZpbGVuYW1lID0gc3ltZnNfZmlsZW5hbWU7CiAJCX0KKwl9IGVsc2UgaWYgKGRzb19fbmVlZHNfZGVjb21wcmVzcyhkc28pKSB7CisJCWNoYXIgdG1wW1BBVEhfTUFYXTsKKwkJc3RydWN0IGttb2RfcGF0aCBtOworCQlpbnQgZmQ7CisJCWJvb2wgcmV0OworCisJCWlmIChrbW9kX3BhdGhfX3BhcnNlX2V4dCgmbSwgc3ltZnNfZmlsZW5hbWUpKQorCQkJZ290byBvdXRfZnJlZV9maWxlbmFtZTsKKworCQlzbnByaW50Zih0bXAsIFBBVEhfTUFYLCAiL3RtcC9wZXJmLWttb2QtWFhYWFhYIik7CisKKwkJZmQgPSBta3N0ZW1wKHRtcCk7CisJCWlmIChmZCA8IDApIHsKKwkJCWZyZWUobS5leHQpOworCQkJZ290byBvdXRfZnJlZV9maWxlbmFtZTsKKwkJfQorCisJCXJldCA9IGRlY29tcHJlc3NfdG9fZmlsZShtLmV4dCwgc3ltZnNfZmlsZW5hbWUsIGZkKTsKKworCQlmcmVlKG0uZXh0KTsKKwkJY2xvc2UoZmQpOworCisJCWlmICghcmV0KQorCQkJZ290byBvdXRfZnJlZV9maWxlbmFtZTsKKworCQlzdHJjcHkoc3ltZnNfZmlsZW5hbWUsIHRtcCk7CiAJfQogCiAJc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLApAQCAtMTAyNyw3ICsxMDU1LDcgQEAKIAogCWZpbGUgPSBwb3Blbihjb21tYW5kLCAiciIpOwogCWlmICghZmlsZSkKLQkJZ290byBvdXRfZnJlZV9maWxlbmFtZTsKKwkJZ290byBvdXRfcmVtb3ZlX3RtcDsKIAogCXdoaWxlICghZmVvZihmaWxlKSkKIAkJaWYgKHN5bWJvbF9fcGFyc2Vfb2JqZHVtcF9saW5lKHN5bSwgbWFwLCBmaWxlLCBwcml2c2l6ZSwKQEAgLTEwNDIsNiArMTA3MCwxMCBAQAogCQlkZWxldGVfbGFzdF9ub3Aoc3ltKTsKIAogCXBjbG9zZShmaWxlKTsKKworb3V0X3JlbW92ZV90bXA6CisJaWYgKGRzb19fbmVlZHNfZGVjb21wcmVzcyhkc28pKQorCQl1bmxpbmsoc3ltZnNfZmlsZW5hbWUpOwogb3V0X2ZyZWVfZmlsZW5hbWU6CiAJaWYgKGRlbGV0ZV9leHRyYWN0KQogCQlrY29yZV9leHRyYWN0X19kZWxldGUoJmtjZSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYnVpbGQtaWQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCmluZGV4IDBjNzI2ODAuLjYxODY3ZGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCkBAIC01OSwxMSArNTksOCBAQAogCWR1bXBfcHJpbnRmKCIoJWQ6JWQpOiglZDolZClcbiIsIGV2ZW50LT5mb3JrLnBpZCwgZXZlbnQtPmZvcmsudGlkLAogCQkgICAgZXZlbnQtPmZvcmsucHBpZCwgZXZlbnQtPmZvcmsucHRpZCk7CiAKLQlpZiAodGhyZWFkKSB7Ci0JCXJiX2VyYXNlKCZ0aHJlYWQtPnJiX25vZGUsICZtYWNoaW5lLT50aHJlYWRzKTsKLQkJbWFjaGluZS0+bGFzdF9tYXRjaCA9IE5VTEw7Ci0JCXRocmVhZF9fZGVsZXRlKHRocmVhZCk7Ci0JfQorCWlmICh0aHJlYWQpCisJCW1hY2hpbmVfX3JlbW92ZV90aHJlYWQobWFjaGluZSwgdGhyZWFkKTsKIAogCXJldHVybiAwOwogfQpAQCAtOTMsNiArOTAsMzUgQEAKIAlyZXR1cm4gcmF3IC0gYnVpbGRfaWQ7CiB9CiAKKy8qIGFzbnByaW50ZiBjb25zb2xpZGF0ZXMgYXNwcmludGYgYW5kIHNucHJpbnRmICovCitzdGF0aWMgaW50IGFzbnByaW50ZihjaGFyICoqc3RycCwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHJldDsKKworCWlmICghc3RycCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlpZiAoKnN0cnApCisJCXJldCA9IHZzbnByaW50Zigqc3RycCwgc2l6ZSwgZm10LCBhcCk7CisJZWxzZQorCQlyZXQgPSB2YXNwcmludGYoc3RycCwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjaGFyICpidWlsZF9pZF9fZmlsZW5hbWUoY29uc3QgY2hhciAqc2J1aWxkX2lkLCBjaGFyICpiZiwgc2l6ZV90IHNpemUpCit7CisJY2hhciAqdG1wID0gYmY7CisJaW50IHJldCA9IGFzbnByaW50ZigmYmYsIHNpemUsICIlcy8uYnVpbGQtaWQvJS4ycy8lcyIsIGJ1aWxkaWRfZGlyLAorCQkJICAgIHNidWlsZF9pZCwgc2J1aWxkX2lkICsgMik7CisJaWYgKHJldCA8IDAgfHwgKHRtcCAmJiBzaXplIDwgKHVuc2lnbmVkIGludClyZXQpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gYmY7Cit9CisKIGNoYXIgKmRzb19fYnVpbGRfaWRfZmlsZW5hbWUoY29uc3Qgc3RydWN0IGRzbyAqZHNvLCBjaGFyICpiZiwgc2l6ZV90IHNpemUpCiB7CiAJY2hhciBidWlsZF9pZF9oZXhbQlVJTERfSURfU0laRSAqIDIgKyAxXTsKQEAgLTEwMSwxNCArMTI3LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlidWlsZF9pZF9fc3ByaW50Zihkc28tPmJ1aWxkX2lkLCBzaXplb2YoZHNvLT5idWlsZF9pZCksIGJ1aWxkX2lkX2hleCk7Ci0JaWYgKGJmID09IE5VTEwpIHsKLQkJaWYgKGFzcHJpbnRmKCZiZiwgIiVzLy5idWlsZC1pZC8lLjJzLyVzIiwgYnVpbGRpZF9kaXIsCi0JCQkgICAgIGJ1aWxkX2lkX2hleCwgYnVpbGRfaWRfaGV4ICsgMikgPCAwKQotCQkJcmV0dXJuIE5VTEw7Ci0JfSBlbHNlCi0JCXNucHJpbnRmKGJmLCBzaXplLCAiJXMvLmJ1aWxkLWlkLyUuMnMvJXMiLCBidWlsZGlkX2RpciwKLQkJCSBidWlsZF9pZF9oZXgsIGJ1aWxkX2lkX2hleCArIDIpOwotCXJldHVybiBiZjsKKwlyZXR1cm4gYnVpbGRfaWRfX2ZpbGVuYW1lKGJ1aWxkX2lkX2hleCwgYmYsIHNpemUpOwogfQogCiAjZGVmaW5lIGRzb3NfX2Zvcl9lYWNoX3dpdGhfYnVpbGRfaWQocG9zLCBoZWFkKQlcCkBAIC0yNTksNTIgKzI3OCwxMTMgQEAKIAlub19idWlsZGlkX2NhY2hlID0gdHJ1ZTsKIH0KIAotaW50IGJ1aWxkX2lkX2NhY2hlX19hZGRfcyhjb25zdCBjaGFyICpzYnVpbGRfaWQsIGNvbnN0IGNoYXIgKmRlYnVnZGlyLAotCQkJICBjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX2thbGxzeW1zLCBib29sIGlzX3Zkc28pCitzdGF0aWMgY2hhciAqYnVpbGRfaWRfY2FjaGVfX2Rpcm5hbWVfZnJvbV9wYXRoKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJCSAgICAgICBib29sIGlzX2thbGxzeW1zLCBib29sIGlzX3Zkc28pCiB7Ci0JY29uc3Qgc2l6ZV90IHNpemUgPSBQQVRIX01BWDsKLQljaGFyICpyZWFsbmFtZSwgKmZpbGVuYW1lID0gemFsbG9jKHNpemUpLAotCSAgICAgKmxpbmtuYW1lID0gemFsbG9jKHNpemUpLCAqdGFyZ2V0bmFtZTsKLQlpbnQgbGVuLCBlcnIgPSAtMTsKKwljaGFyICpyZWFsbmFtZSA9IChjaGFyICopbmFtZSwgKmZpbGVuYW1lOwogCWJvb2wgc2xhc2ggPSBpc19rYWxsc3ltcyB8fCBpc192ZHNvOwogCi0JaWYgKGlzX2thbGxzeW1zKSB7Ci0JCWlmIChzeW1ib2xfY29uZi5rcHRyX3Jlc3RyaWN0KSB7Ci0JCQlwcl9kZWJ1ZygiTm90IGNhY2hpbmcgYSBrcHRyX3Jlc3RyaWN0J2VkIC9wcm9jL2thbGxzeW1zXG4iKTsKLQkJCWVyciA9IDA7Ci0JCQlnb3RvIG91dF9mcmVlOwotCQl9Ci0JCXJlYWxuYW1lID0gKGNoYXIgKikgbmFtZTsKLQl9IGVsc2UKKwlpZiAoIXNsYXNoKSB7CiAJCXJlYWxuYW1lID0gcmVhbHBhdGgobmFtZSwgTlVMTCk7CisJCWlmICghcmVhbG5hbWUpCisJCQlyZXR1cm4gTlVMTDsKKwl9CiAKLQlpZiAocmVhbG5hbWUgPT0gTlVMTCB8fCBmaWxlbmFtZSA9PSBOVUxMIHx8IGxpbmtuYW1lID09IE5VTEwpCisJaWYgKGFzcHJpbnRmKCZmaWxlbmFtZSwgIiVzJXMlcyIsIGJ1aWxkaWRfZGlyLCBzbGFzaCA/ICIvIiA6ICIiLAorCQkgICAgIGlzX3Zkc28gPyBEU09fX05BTUVfVkRTTyA6IHJlYWxuYW1lKSA8IDApCisJCWZpbGVuYW1lID0gTlVMTDsKKworCWlmICghc2xhc2gpCisJCWZyZWUocmVhbG5hbWUpOworCisJcmV0dXJuIGZpbGVuYW1lOworfQorCitpbnQgYnVpbGRfaWRfY2FjaGVfX2xpc3RfYnVpbGRfaWRzKGNvbnN0IGNoYXIgKnBhdGhuYW1lLAorCQkJCSAgIHN0cnVjdCBzdHJsaXN0ICoqcmVzdWx0KQoreworCXN0cnVjdCBzdHJsaXN0ICpsaXN0OworCWNoYXIgKmRpcl9uYW1lOworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKmQ7CisJaW50IHJldCA9IDA7CisKKwlsaXN0ID0gc3RybGlzdF9fbmV3KHRydWUsIE5VTEwpOworCWRpcl9uYW1lID0gYnVpbGRfaWRfY2FjaGVfX2Rpcm5hbWVfZnJvbV9wYXRoKHBhdGhuYW1lLCBmYWxzZSwgZmFsc2UpOworCWlmICghbGlzdCB8fCAhZGlyX25hbWUpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogTGlzdCB1cCBhbGwgZGlyZW50cyAqLworCWRpciA9IG9wZW5kaXIoZGlyX25hbWUpOworCWlmICghZGlyKSB7CisJCXJldCA9IC1lcnJubzsKKwkJZ290byBvdXQ7CisJfQorCisJd2hpbGUgKChkID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWlmICghc3RyY21wKGQtPmRfbmFtZSwgIi4iKSB8fCAhc3RyY21wKGQtPmRfbmFtZSwgIi4uIikpCisJCQljb250aW51ZTsKKwkJc3RybGlzdF9fYWRkKGxpc3QsIGQtPmRfbmFtZSk7CisJfQorCWNsb3NlZGlyKGRpcik7CisKK291dDoKKwlmcmVlKGRpcl9uYW1lKTsKKwlpZiAocmV0KQorCQlzdHJsaXN0X19kZWxldGUobGlzdCk7CisJZWxzZQorCQkqcmVzdWx0ID0gbGlzdDsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBidWlsZF9pZF9jYWNoZV9fYWRkX3MoY29uc3QgY2hhciAqc2J1aWxkX2lkLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICBib29sIGlzX2thbGxzeW1zLCBib29sIGlzX3Zkc28pCit7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBQQVRIX01BWDsKKwljaGFyICpyZWFsbmFtZSA9IE5VTEwsICpmaWxlbmFtZSA9IE5VTEwsICpkaXJfbmFtZSA9IE5VTEwsCisJICAgICAqbGlua25hbWUgPSB6YWxsb2Moc2l6ZSksICp0YXJnZXRuYW1lLCAqdG1wOworCWludCBlcnIgPSAtMTsKKworCWlmICghaXNfa2FsbHN5bXMpIHsKKwkJcmVhbG5hbWUgPSByZWFscGF0aChuYW1lLCBOVUxMKTsKKwkJaWYgKCFyZWFsbmFtZSkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJZGlyX25hbWUgPSBidWlsZF9pZF9jYWNoZV9fZGlybmFtZV9mcm9tX3BhdGgobmFtZSwgaXNfa2FsbHN5bXMsIGlzX3Zkc28pOworCWlmICghZGlyX25hbWUpCiAJCWdvdG8gb3V0X2ZyZWU7CiAKLQlsZW4gPSBzY25wcmludGYoZmlsZW5hbWUsIHNpemUsICIlcyVzJXMiLAotCQkgICAgICAgZGVidWdkaXIsIHNsYXNoID8gIi8iIDogIiIsCi0JCSAgICAgICBpc192ZHNvID8gRFNPX19OQU1FX1ZEU08gOiByZWFsbmFtZSk7Ci0JaWYgKG1rZGlyX3AoZmlsZW5hbWUsIDA3NTUpKQorCWlmIChta2Rpcl9wKGRpcl9uYW1lLCAwNzU1KSkKIAkJZ290byBvdXRfZnJlZTsKIAotCXNucHJpbnRmKGZpbGVuYW1lICsgbGVuLCBzaXplIC0gbGVuLCAiLyVzIiwgc2J1aWxkX2lkKTsKKwlpZiAoYXNwcmludGYoJmZpbGVuYW1lLCAiJXMvJXMiLCBkaXJfbmFtZSwgc2J1aWxkX2lkKSA8IDApIHsKKwkJZmlsZW5hbWUgPSBOVUxMOworCQlnb3RvIG91dF9mcmVlOworCX0KIAogCWlmIChhY2Nlc3MoZmlsZW5hbWUsIEZfT0spKSB7CiAJCWlmIChpc19rYWxsc3ltcykgewogCQkJIGlmIChjb3B5ZmlsZSgiL3Byb2Mva2FsbHN5bXMiLCBmaWxlbmFtZSkpCiAJCQkJZ290byBvdXRfZnJlZTsKLQkJfSBlbHNlIGlmIChsaW5rKHJlYWxuYW1lLCBmaWxlbmFtZSkgJiYgY29weWZpbGUobmFtZSwgZmlsZW5hbWUpKQorCQl9IGVsc2UgaWYgKGxpbmsocmVhbG5hbWUsIGZpbGVuYW1lKSAmJiBlcnJubyAhPSBFRVhJU1QgJiYKKwkJCQljb3B5ZmlsZShuYW1lLCBmaWxlbmFtZSkpCiAJCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCWxlbiA9IHNjbnByaW50ZihsaW5rbmFtZSwgc2l6ZSwgIiVzLy5idWlsZC1pZC8lLjJzIiwKLQkJICAgICAgIGRlYnVnZGlyLCBzYnVpbGRfaWQpOworCWlmICghYnVpbGRfaWRfX2ZpbGVuYW1lKHNidWlsZF9pZCwgbGlua25hbWUsIHNpemUpKQorCQlnb3RvIG91dF9mcmVlOworCXRtcCA9IHN0cnJjaHIobGlua25hbWUsICcvJyk7CisJKnRtcCA9ICdcMCc7CiAKIAlpZiAoYWNjZXNzKGxpbmtuYW1lLCBYX09LKSAmJiBta2Rpcl9wKGxpbmtuYW1lLCAwNzU1KSkKIAkJZ290byBvdXRfZnJlZTsKIAotCXNucHJpbnRmKGxpbmtuYW1lICsgbGVuLCBzaXplIC0gbGVuLCAiLyVzIiwgc2J1aWxkX2lkICsgMik7Ci0JdGFyZ2V0bmFtZSA9IGZpbGVuYW1lICsgc3RybGVuKGRlYnVnZGlyKSAtIDU7CisJKnRtcCA9ICcvJzsKKwl0YXJnZXRuYW1lID0gZmlsZW5hbWUgKyBzdHJsZW4oYnVpbGRpZF9kaXIpIC0gNTsKIAltZW1jcHkodGFyZ2V0bmFtZSwgIi4uLy4uIiwgNSk7CiAKIAlpZiAoc3ltbGluayh0YXJnZXRuYW1lLCBsaW5rbmFtZSkgPT0gMCkKQEAgLTMxMywzNCArMzkzLDQ2IEBACiAJaWYgKCFpc19rYWxsc3ltcykKIAkJZnJlZShyZWFsbmFtZSk7CiAJZnJlZShmaWxlbmFtZSk7CisJZnJlZShkaXJfbmFtZSk7CiAJZnJlZShsaW5rbmFtZSk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBidWlsZF9pZF9jYWNoZV9fYWRkX2IoY29uc3QgdTggKmJ1aWxkX2lkLCBzaXplX3QgYnVpbGRfaWRfc2l6ZSwKLQkJCQkgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqZGVidWdkaXIsCi0JCQkJIGJvb2wgaXNfa2FsbHN5bXMsIGJvb2wgaXNfdmRzbykKKwkJCQkgY29uc3QgY2hhciAqbmFtZSwgYm9vbCBpc19rYWxsc3ltcywKKwkJCQkgYm9vbCBpc192ZHNvKQogewogCWNoYXIgc2J1aWxkX2lkW0JVSUxEX0lEX1NJWkUgKiAyICsgMV07CiAKIAlidWlsZF9pZF9fc3ByaW50ZihidWlsZF9pZCwgYnVpbGRfaWRfc2l6ZSwgc2J1aWxkX2lkKTsKIAotCXJldHVybiBidWlsZF9pZF9jYWNoZV9fYWRkX3Moc2J1aWxkX2lkLCBkZWJ1Z2RpciwgbmFtZSwKLQkJCQkgICAgIGlzX2thbGxzeW1zLCBpc192ZHNvKTsKKwlyZXR1cm4gYnVpbGRfaWRfY2FjaGVfX2FkZF9zKHNidWlsZF9pZCwgbmFtZSwgaXNfa2FsbHN5bXMsIGlzX3Zkc28pOwogfQogCi1pbnQgYnVpbGRfaWRfY2FjaGVfX3JlbW92ZV9zKGNvbnN0IGNoYXIgKnNidWlsZF9pZCwgY29uc3QgY2hhciAqZGVidWdkaXIpCitib29sIGJ1aWxkX2lkX2NhY2hlX19jYWNoZWQoY29uc3QgY2hhciAqc2J1aWxkX2lkKQoreworCWJvb2wgcmV0ID0gZmFsc2U7CisJY2hhciAqZmlsZW5hbWUgPSBidWlsZF9pZF9fZmlsZW5hbWUoc2J1aWxkX2lkLCBOVUxMLCAwKTsKKworCWlmIChmaWxlbmFtZSAmJiAhYWNjZXNzKGZpbGVuYW1lLCBGX09LKSkKKwkJcmV0ID0gdHJ1ZTsKKwlmcmVlKGZpbGVuYW1lKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBidWlsZF9pZF9jYWNoZV9fcmVtb3ZlX3MoY29uc3QgY2hhciAqc2J1aWxkX2lkKQogewogCWNvbnN0IHNpemVfdCBzaXplID0gUEFUSF9NQVg7CiAJY2hhciAqZmlsZW5hbWUgPSB6YWxsb2Moc2l6ZSksCi0JICAgICAqbGlua25hbWUgPSB6YWxsb2Moc2l6ZSk7CisJICAgICAqbGlua25hbWUgPSB6YWxsb2Moc2l6ZSksICp0bXA7CiAJaW50IGVyciA9IC0xOwogCiAJaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgbGlua25hbWUgPT0gTlVMTCkKIAkJZ290byBvdXRfZnJlZTsKIAotCXNucHJpbnRmKGxpbmtuYW1lLCBzaXplLCAiJXMvLmJ1aWxkLWlkLyUuMnMvJXMiLAotCQkgZGVidWdkaXIsIHNidWlsZF9pZCwgc2J1aWxkX2lkICsgMik7CisJaWYgKCFidWlsZF9pZF9fZmlsZW5hbWUoc2J1aWxkX2lkLCBsaW5rbmFtZSwgc2l6ZSkpCisJCWdvdG8gb3V0X2ZyZWU7CiAKIAlpZiAoYWNjZXNzKGxpbmtuYW1lLCBGX09LKSkKIAkJZ290byBvdXRfZnJlZTsKQEAgLTM1NCw4ICs0NDYsOCBAQAogCS8qCiAJICogU2luY2UgdGhlIGxpbmsgaXMgcmVsYXRpdmUsIHdlIG11c3QgbWFrZSBpdCBhYnNvbHV0ZToKIAkgKi8KLQlzbnByaW50ZihsaW5rbmFtZSwgc2l6ZSwgIiVzLy5idWlsZC1pZC8lLjJzLyVzIiwKLQkJIGRlYnVnZGlyLCBzYnVpbGRfaWQsIGZpbGVuYW1lKTsKKwl0bXAgPSBzdHJyY2hyKGxpbmtuYW1lLCAnLycpICsgMTsKKwlzbnByaW50Zih0bXAsIHNpemUgLSAodG1wIC0gbGlua25hbWUpLCAiJXMiLCBmaWxlbmFtZSk7CiAKIAlpZiAodW5saW5rKGxpbmtuYW1lKSkKIAkJZ290byBvdXRfZnJlZTsKQEAgLTM2Nyw4ICs0NTksNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZHNvX19jYWNoZV9idWlsZF9pZChzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAotCQkJICAgICAgIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQorc3RhdGljIGludCBkc29fX2NhY2hlX2J1aWxkX2lkKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJYm9vbCBpc19rYWxsc3ltcyA9IGRzby0+a2VybmVsICYmIGRzby0+bG9uZ19uYW1lWzBdICE9ICcvJzsKIAlib29sIGlzX3Zkc28gPSBkc29fX2lzX3Zkc28oZHNvKTsKQEAgLTM4MSwyOCArNDcyLDI2IEBACiAJCW5hbWUgPSBubTsKIAl9CiAJcmV0dXJuIGJ1aWxkX2lkX2NhY2hlX19hZGRfYihkc28tPmJ1aWxkX2lkLCBzaXplb2YoZHNvLT5idWlsZF9pZCksIG5hbWUsCi0JCQkJICAgICBkZWJ1Z2RpciwgaXNfa2FsbHN5bXMsIGlzX3Zkc28pOworCQkJCSAgICAgaXNfa2FsbHN5bXMsIGlzX3Zkc28pOwogfQogCiBzdGF0aWMgaW50IF9fZHNvc19fY2FjaGVfYnVpbGRfaWRzKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCi0JCQkJICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQorCQkJCSAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQogewogCXN0cnVjdCBkc28gKnBvczsKIAlpbnQgZXJyID0gMDsKIAogCWRzb3NfX2Zvcl9lYWNoX3dpdGhfYnVpbGRfaWQocG9zLCBoZWFkKQotCQlpZiAoZHNvX19jYWNoZV9idWlsZF9pZChwb3MsIG1hY2hpbmUsIGRlYnVnZGlyKSkKKwkJaWYgKGRzb19fY2FjaGVfYnVpbGRfaWQocG9zLCBtYWNoaW5lKSkKIAkJCWVyciA9IC0xOwogCiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBtYWNoaW5lX19jYWNoZV9idWlsZF9pZHMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQorc3RhdGljIGludCBtYWNoaW5lX19jYWNoZV9idWlsZF9pZHMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7Ci0JaW50IHJldCA9IF9fZHNvc19fY2FjaGVfYnVpbGRfaWRzKCZtYWNoaW5lLT5rZXJuZWxfZHNvcy5oZWFkLCBtYWNoaW5lLAotCQkJCQkgIGRlYnVnZGlyKTsKLQlyZXQgfD0gX19kc29zX19jYWNoZV9idWlsZF9pZHMoJm1hY2hpbmUtPnVzZXJfZHNvcy5oZWFkLCBtYWNoaW5lLAotCQkJCSAgICAgICBkZWJ1Z2Rpcik7CisJaW50IHJldCA9IF9fZHNvc19fY2FjaGVfYnVpbGRfaWRzKCZtYWNoaW5lLT5rZXJuZWxfZHNvcy5oZWFkLCBtYWNoaW5lKTsKKwlyZXQgfD0gX19kc29zX19jYWNoZV9idWlsZF9pZHMoJm1hY2hpbmUtPnVzZXJfZHNvcy5oZWFkLCBtYWNoaW5lKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC00MTcsMTEgKzUwNiwxMSBAQAogCWlmIChta2RpcihidWlsZGlkX2RpciwgMDc1NSkgIT0gMCAmJiBlcnJubyAhPSBFRVhJU1QpCiAJCXJldHVybiAtMTsKIAotCXJldCA9IG1hY2hpbmVfX2NhY2hlX2J1aWxkX2lkcygmc2Vzc2lvbi0+bWFjaGluZXMuaG9zdCwgYnVpbGRpZF9kaXIpOworCXJldCA9IG1hY2hpbmVfX2NhY2hlX2J1aWxkX2lkcygmc2Vzc2lvbi0+bWFjaGluZXMuaG9zdCk7CiAKIAlmb3IgKG5kID0gcmJfZmlyc3QoJnNlc3Npb24tPm1hY2hpbmVzLmd1ZXN0cyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CiAJCXN0cnVjdCBtYWNoaW5lICpwb3MgPSByYl9lbnRyeShuZCwgc3RydWN0IG1hY2hpbmUsIHJiX25vZGUpOwotCQlyZXQgfD0gbWFjaGluZV9fY2FjaGVfYnVpbGRfaWRzKHBvcywgYnVpbGRpZF9kaXIpOworCQlyZXQgfD0gbWFjaGluZV9fY2FjaGVfYnVpbGRfaWRzKHBvcyk7CiAJfQogCXJldHVybiByZXQgPyAtMSA6IDA7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYnVpbGQtaWQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5oCmluZGV4IDgyMzYzMTkuLjg1MDExMjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5oCkBAIC00LDYgKzQsNyBAQAogI2RlZmluZSBCVUlMRF9JRF9TSVpFIDIwCiAKICNpbmNsdWRlICJ0b29sLmgiCisjaW5jbHVkZSAic3RybGlzdC5oIgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIGV4dGVybiBzdHJ1Y3QgcGVyZl90b29sIGJ1aWxkX2lkX19tYXJrX2Rzb19oaXRfb3BzOwpAQCAtMjIsOSArMjMsMTIgQEAKIGludCBwZXJmX3Nlc3Npb25fX3dyaXRlX2J1aWxkaWRfdGFibGUoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwgaW50IGZkKTsKIGludCBwZXJmX3Nlc3Npb25fX2NhY2hlX2J1aWxkX2lkcyhzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKTsKIAotaW50IGJ1aWxkX2lkX2NhY2hlX19hZGRfcyhjb25zdCBjaGFyICpzYnVpbGRfaWQsIGNvbnN0IGNoYXIgKmRlYnVnZGlyLAoraW50IGJ1aWxkX2lkX2NhY2hlX19saXN0X2J1aWxkX2lkcyhjb25zdCBjaGFyICpwYXRobmFtZSwKKwkJCQkgICBzdHJ1Y3Qgc3RybGlzdCAqKnJlc3VsdCk7Citib29sIGJ1aWxkX2lkX2NhY2hlX19jYWNoZWQoY29uc3QgY2hhciAqc2J1aWxkX2lkKTsKK2ludCBidWlsZF9pZF9jYWNoZV9fYWRkX3MoY29uc3QgY2hhciAqc2J1aWxkX2lkLAogCQkJICBjb25zdCBjaGFyICpuYW1lLCBib29sIGlzX2thbGxzeW1zLCBib29sIGlzX3Zkc28pOwotaW50IGJ1aWxkX2lkX2NhY2hlX19yZW1vdmVfcyhjb25zdCBjaGFyICpzYnVpbGRfaWQsIGNvbnN0IGNoYXIgKmRlYnVnZGlyKTsKK2ludCBidWlsZF9pZF9jYWNoZV9fcmVtb3ZlX3MoY29uc3QgY2hhciAqc2J1aWxkX2lkKTsKIHZvaWQgZGlzYWJsZV9idWlsZGlkX2NhY2hlKHZvaWQpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jYWNoZS5oIGIvdG9vbHMvcGVyZi91dGlsL2NhY2hlLmgKaW5kZXggZDA0ZDc3MC4uZmJjY2EyMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2NhY2hlLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NhY2hlLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNkZWZpbmUgRVhFQ19QQVRIX0VOVklST05NRU5UICJQRVJGX0VYRUNfUEFUSCIKICNkZWZpbmUgREVGQVVMVF9QRVJGX0RJUl9FTlZJUk9OTUVOVCAiLnBlcmYiCiAjZGVmaW5lIFBFUkZfREVCVUdGU19FTlZJUk9OTUVOVCAiUEVSRl9ERUJVR0ZTX0RJUiIKKyNkZWZpbmUgUEVSRl9UUkFDRUZTX0VOVklST05NRU5UICJQRVJGX1RSQUNFRlNfRElSIgogCiB0eXBlZGVmIGludCAoKmNvbmZpZ19mbl90KShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKIGV4dGVybiBpbnQgcGVyZl9kZWZhdWx0X2NvbmZpZyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uYyBiL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uYwppbmRleCAxNGU3YTEyLi45ZjY0M2VlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvY2FsbGNoYWluLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NhbGxjaGFpbi5jCkBAIC05Nyw2ICs5NywxNCBAQAogCQkJCWNhbGxjaGFpbl9wYXJhbS5kdW1wX3NpemUgPSBzaXplOwogCQkJfQogI2VuZGlmIC8qIEhBVkVfRFdBUkZfVU5XSU5EX1NVUFBPUlQgKi8KKwkJfSBlbHNlIGlmICghc3RybmNtcChuYW1lLCAibGJyIiwgc2l6ZW9mKCJsYnIiKSkpIHsKKwkJCWlmICghc3RydG9rX3IoTlVMTCwgIiwiLCAmc2F2ZXB0cikpIHsKKwkJCQljYWxsY2hhaW5fcGFyYW0ucmVjb3JkX21vZGUgPSBDQUxMQ0hBSU5fTEJSOworCQkJCXJldCA9IDA7CisJCQl9IGVsc2UKKwkJCQlwcl9lcnIoImNhbGxjaGFpbjogTm8gbW9yZSBhcmd1bWVudHMgIgorCQkJCQkibmVlZGVkIGZvciAtLWNhbGwtZ3JhcGggbGJyXG4iKTsKKwkJCWJyZWFrOwogCQl9IGVsc2UgewogCQkJcHJfZXJyKCJjYWxsY2hhaW46IFVua25vd24gLS1jYWxsLWdyYXBoIG9wdGlvbiAiCiAJCQkgICAgICAgInZhbHVlOiAlc1xuIiwgYXJnKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uaCBiL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uaAppbmRleCBjMGVjMWFjLi42MDMzYTBhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvY2FsbGNoYWluLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NhbGxjaGFpbi5oCkBAIC0xMSw2ICsxMSw3IEBACiAJQ0FMTENIQUlOX05PTkUsCiAJQ0FMTENIQUlOX0ZQLAogCUNBTExDSEFJTl9EV0FSRiwKKwlDQUxMQ0hBSU5fTEJSLAogCUNBTExDSEFJTl9NQVgKIH07CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jbG9leGVjLmMgYi90b29scy9wZXJmL3V0aWwvY2xvZXhlYy5jCmluZGV4IDZkYTk2NWIuLjg1YjUyMzggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9jbG9leGVjLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Nsb2V4ZWMuYwpAQCAtNyw2ICs3LDEyIEBACiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIGZsYWcgPSBQRVJGX0ZMQUdfRkRfQ0xPRVhFQzsKIAoraW50IF9fd2VhayBzY2hlZF9nZXRjcHUodm9pZCkKK3sKKwllcnJubyA9IEVOT1NZUzsKKwlyZXR1cm4gLTE7Cit9CisKIHN0YXRpYyBpbnQgcGVyZl9mbGFnX3Byb2JlKHZvaWQpCiB7CiAJLyogdXNlICdzYWZlc3QnIGNvbmZpZ3VyYXRpb24gYXMgdXNlZCBpbiBwZXJmX2V2c2VsX19mYWxsYmFjaygpICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY2xvZXhlYy5oIGIvdG9vbHMvcGVyZi91dGlsL2Nsb2V4ZWMuaAppbmRleCA5NGE1YTdkLi42ODg4OGMyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvY2xvZXhlYy5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jbG9leGVjLmgKQEAgLTMsNCArMywxMCBAQAogCiB1bnNpZ25lZCBsb25nIHBlcmZfZXZlbnRfb3Blbl9jbG9leGVjX2ZsYWcodm9pZCk7CiAKKyNpZmRlZiBfX0dMSUJDX1BSRVJFUQorI2lmICFfX0dMSUJDX1BSRVJFUSgyLCA2KQorZXh0ZXJuIGludCBzY2hlZF9nZXRjcHUodm9pZCkgX19USFJPVzsKKyNlbmRpZgorI2VuZGlmCisKICNlbmRpZiAvKiBfX1BFUkZfQ0xPRVhFQ19IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZGF0YS1jb252ZXJ0LWJ0LmMgYi90b29scy9wZXJmL3V0aWwvZGF0YS1jb252ZXJ0LWJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQxN2M5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kYXRhLWNvbnZlcnQtYnQuYwpAQCAtMCwwICsxLDg1NyBAQAorLyoKKyAqIENURiB3cml0aW5nIHN1cHBvcnQgdmlhIGJhYmVsdHJhY2UuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0LCBKaXJpIE9sc2EgPGpvbHNhQHJlZGhhdC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTQsIFNlYmFzdGlhbiBBbmRyemVqIFNpZXdpb3IgPGJpZ2Vhc3lAbGludXRyb25peC5kZT4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMIHYyLiAoYW5kIG9ubHkgdjIsIG5vdCBhbnkgbGF0ZXIgdmVyc2lvbikKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxiYWJlbHRyYWNlL2N0Zi13cml0ZXIvd3JpdGVyLmg+CisjaW5jbHVkZSA8YmFiZWx0cmFjZS9jdGYtd3JpdGVyL2Nsb2NrLmg+CisjaW5jbHVkZSA8YmFiZWx0cmFjZS9jdGYtd3JpdGVyL3N0cmVhbS5oPgorI2luY2x1ZGUgPGJhYmVsdHJhY2UvY3RmLXdyaXRlci9ldmVudC5oPgorI2luY2x1ZGUgPGJhYmVsdHJhY2UvY3RmLXdyaXRlci9ldmVudC10eXBlcy5oPgorI2luY2x1ZGUgPGJhYmVsdHJhY2UvY3RmLXdyaXRlci9ldmVudC1maWVsZHMuaD4KKyNpbmNsdWRlIDxiYWJlbHRyYWNlL2N0Zi9ldmVudHMuaD4KKyNpbmNsdWRlIDx0cmFjZWV2ZW50L2V2ZW50LXBhcnNlLmg+CisjaW5jbHVkZSAiYXNtL2J1Zy5oIgorI2luY2x1ZGUgImRhdGEtY29udmVydC1idC5oIgorI2luY2x1ZGUgInNlc3Npb24uaCIKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ0b29sLmgiCisjaW5jbHVkZSAiZXZsaXN0LmgiCisjaW5jbHVkZSAiZXZzZWwuaCIKKyNpbmNsdWRlICJtYWNoaW5lLmgiCisKKyNkZWZpbmUgcHJfTihuLCBmbXQsIC4uLikgXAorCWVwcmludGYobiwgZGVidWdfZGF0YV9jb252ZXJ0LCBmbXQsICMjX19WQV9BUkdTX18pCisKKyNkZWZpbmUgcHIoZm10LCAuLi4pICBwcl9OKDEsIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBwcjIoZm10LCAuLi4pIHByX04oMiwgcHJfZm10KGZtdCksICMjX19WQV9BUkdTX18pCisKKyNkZWZpbmUgcHJfdGltZTIodCwgZm10LCAuLi4pIHByX3RpbWVfTigyLCBkZWJ1Z19kYXRhX2NvbnZlcnQsIHQsIHByX2ZtdChmbXQpLCAjI19fVkFfQVJHU19fKQorCitzdHJ1Y3QgZXZzZWxfcHJpdiB7CisJc3RydWN0IGJ0X2N0Zl9ldmVudF9jbGFzcyAqZXZlbnRfY2xhc3M7Cit9OworCitzdHJ1Y3QgY3RmX3dyaXRlciB7CisJLyogd3JpdGVyIHByaW1pdGl2ZXMgKi8KKwlzdHJ1Y3QgYnRfY3RmX3dyaXRlcgkJKndyaXRlcjsKKwlzdHJ1Y3QgYnRfY3RmX3N0cmVhbQkJKnN0cmVhbTsKKwlzdHJ1Y3QgYnRfY3RmX3N0cmVhbV9jbGFzcwkqc3RyZWFtX2NsYXNzOworCXN0cnVjdCBidF9jdGZfY2xvY2sJCSpjbG9jazsKKworCS8qIGRhdGEgdHlwZXMgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgYnRfY3RmX2ZpZWxkX3R5cGUJKnM2NDsKKwkJCXN0cnVjdCBidF9jdGZfZmllbGRfdHlwZQkqdTY0OworCQkJc3RydWN0IGJ0X2N0Zl9maWVsZF90eXBlCSpzMzI7CisJCQlzdHJ1Y3QgYnRfY3RmX2ZpZWxkX3R5cGUJKnUzMjsKKwkJCXN0cnVjdCBidF9jdGZfZmllbGRfdHlwZQkqc3RyaW5nOworCQkJc3RydWN0IGJ0X2N0Zl9maWVsZF90eXBlCSp1NjRfaGV4OworCQl9OworCQlzdHJ1Y3QgYnRfY3RmX2ZpZWxkX3R5cGUgKmFycmF5WzZdOworCX0gZGF0YTsKK307CisKK3N0cnVjdCBjb252ZXJ0IHsKKwlzdHJ1Y3QgcGVyZl90b29sCXRvb2w7CisJc3RydWN0IGN0Zl93cml0ZXIJd3JpdGVyOworCisJdTY0CQkJZXZlbnRzX3NpemU7CisJdTY0CQkJZXZlbnRzX2NvdW50OworfTsKKworc3RhdGljIGludCB2YWx1ZV9zZXQoc3RydWN0IGJ0X2N0Zl9maWVsZF90eXBlICp0eXBlLAorCQkgICAgIHN0cnVjdCBidF9jdGZfZXZlbnQgKmV2ZW50LAorCQkgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHU2NCB2YWwpCit7CisJc3RydWN0IGJ0X2N0Zl9maWVsZCAqZmllbGQ7CisJYm9vbCBzaWduID0gYnRfY3RmX2ZpZWxkX3R5cGVfaW50ZWdlcl9nZXRfc2lnbmVkKHR5cGUpOworCWludCByZXQ7CisKKwlmaWVsZCA9IGJ0X2N0Zl9maWVsZF9jcmVhdGUodHlwZSk7CisJaWYgKCFmaWVsZCkgeworCQlwcl9lcnIoImZhaWxlZCB0byBjcmVhdGUgYSBmaWVsZCAlc1xuIiwgbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoc2lnbikgeworCQlyZXQgPSBidF9jdGZfZmllbGRfc2lnbmVkX2ludGVnZXJfc2V0X3ZhbHVlKGZpZWxkLCB2YWwpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoImZhaWxlZCB0byBzZXQgZmllbGQgdmFsdWUgJXNcbiIsIG5hbWUpOworCQkJZ290byBlcnI7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSBidF9jdGZfZmllbGRfdW5zaWduZWRfaW50ZWdlcl9zZXRfdmFsdWUoZmllbGQsIHZhbCk7CisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiZmFpbGVkIHRvIHNldCBmaWVsZCB2YWx1ZSAlc1xuIiwgbmFtZSk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCXJldCA9IGJ0X2N0Zl9ldmVudF9zZXRfcGF5bG9hZChldmVudCwgbmFtZSwgZmllbGQpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gc2V0IHBheWxvYWQgJXNcbiIsIG5hbWUpOworCQlnb3RvIGVycjsKKwl9CisKKwlwcjIoIiAgU0VUIFslcyA9ICUiIFBSSXU2NCAiXVxuIiwgbmFtZSwgdmFsKTsKKworZXJyOgorCWJ0X2N0Zl9maWVsZF9wdXQoZmllbGQpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgX19GVU5DX1ZBTFVFX1NFVChfbmFtZSwgX3ZhbF90eXBlKQkJCQlcCitzdGF0aWMgX19tYXliZV91bnVzZWQgaW50IHZhbHVlX3NldF8jI19uYW1lKHN0cnVjdCBjdGZfd3JpdGVyICpjdywJXAorCQkJICAgICBzdHJ1Y3QgYnRfY3RmX2V2ZW50ICpldmVudCwJCVwKKwkJCSAgICAgY29uc3QgY2hhciAqbmFtZSwJCQkJXAorCQkJICAgICBfdmFsX3R5cGUgdmFsKQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBidF9jdGZfZmllbGRfdHlwZSAqdHlwZSA9IGN3LT5kYXRhLl9uYW1lOwkJXAorCXJldHVybiB2YWx1ZV9zZXQodHlwZSwgZXZlbnQsIG5hbWUsICh1NjQpIHZhbCk7CQkJXAorfQorCisjZGVmaW5lIEZVTkNfVkFMVUVfU0VUKF9uYW1lKSBfX0ZVTkNfVkFMVUVfU0VUKF9uYW1lLCBfbmFtZSkKKworRlVOQ19WQUxVRV9TRVQoczMyKQorRlVOQ19WQUxVRV9TRVQodTMyKQorRlVOQ19WQUxVRV9TRVQoczY0KQorRlVOQ19WQUxVRV9TRVQodTY0KQorX19GVU5DX1ZBTFVFX1NFVCh1NjRfaGV4LCB1NjQpCisKK3N0YXRpYyBzdHJ1Y3QgYnRfY3RmX2ZpZWxkX3R5cGUqCitnZXRfdHJhY2Vwb2ludF9maWVsZF90eXBlKHN0cnVjdCBjdGZfd3JpdGVyICpjdywgc3RydWN0IGZvcm1hdF9maWVsZCAqZmllbGQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IGZpZWxkLT5mbGFnczsKKworCWlmIChmbGFncyAmIEZJRUxEX0lTX1NUUklORykKKwkJcmV0dXJuIGN3LT5kYXRhLnN0cmluZzsKKworCWlmICghKGZsYWdzICYgRklFTERfSVNfU0lHTkVEKSkgeworCQkvKiB1bnNpZ25lZCBsb25nIGFyZSBtb3N0bHkgcG9pbnRlcnMgKi8KKwkJaWYgKGZsYWdzICYgRklFTERfSVNfTE9ORyB8fCBmbGFncyAmIEZJRUxEX0lTX1BPSU5URVIpCisJCQlyZXR1cm4gY3ctPmRhdGEudTY0X2hleDsKKwl9CisKKwlpZiAoZmxhZ3MgJiBGSUVMRF9JU19TSUdORUQpIHsKKwkJaWYgKGZpZWxkLT5zaXplID09IDgpCisJCQlyZXR1cm4gY3ctPmRhdGEuczY0OworCQllbHNlCisJCQlyZXR1cm4gY3ctPmRhdGEuczMyOworCX0KKworCWlmIChmaWVsZC0+c2l6ZSA9PSA4KQorCQlyZXR1cm4gY3ctPmRhdGEudTY0OworCWVsc2UKKwkJcmV0dXJuIGN3LT5kYXRhLnUzMjsKK30KKworc3RhdGljIGludCBhZGRfdHJhY2Vwb2ludF9maWVsZF92YWx1ZShzdHJ1Y3QgY3RmX3dyaXRlciAqY3csCisJCQkJICAgICAgc3RydWN0IGJ0X2N0Zl9ldmVudF9jbGFzcyAqZXZlbnRfY2xhc3MsCisJCQkJICAgICAgc3RydWN0IGJ0X2N0Zl9ldmVudCAqZXZlbnQsCisJCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkJICAgICAgc3RydWN0IGZvcm1hdF9maWVsZCAqZm10ZikKK3sKKwlzdHJ1Y3QgYnRfY3RmX2ZpZWxkX3R5cGUgKnR5cGU7CisJc3RydWN0IGJ0X2N0Zl9maWVsZCAqYXJyYXlfZmllbGQ7CisJc3RydWN0IGJ0X2N0Zl9maWVsZCAqZmllbGQ7CisJY29uc3QgY2hhciAqbmFtZSA9IGZtdGYtPm5hbWU7CisJdm9pZCAqZGF0YSA9IHNhbXBsZS0+cmF3X2RhdGE7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlX2ludDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gZm10Zi0+ZmxhZ3M7CisJdW5zaWduZWQgaW50IG5faXRlbXM7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWludCByZXQ7CisKKwlvZmZzZXQgPSBmbXRmLT5vZmZzZXQ7CisJbGVuID0gZm10Zi0+c2l6ZTsKKwlpZiAoZmxhZ3MgJiBGSUVMRF9JU19TVFJJTkcpCisJCWZsYWdzICY9IH5GSUVMRF9JU19BUlJBWTsKKworCWlmIChmbGFncyAmIEZJRUxEX0lTX0RZTkFNSUMpIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIHRtcF92YWw7CisKKwkJdG1wX3ZhbCA9IHBldmVudF9yZWFkX251bWJlcihmbXRmLT5ldmVudC0+cGV2ZW50LAorCQkJCWRhdGEgKyBvZmZzZXQsIGxlbik7CisJCW9mZnNldCA9IHRtcF92YWw7CisJCWxlbiA9IG9mZnNldCA+PiAxNjsKKwkJb2Zmc2V0ICY9IDB4ZmZmZjsKKwl9CisKKwlpZiAoZmxhZ3MgJiBGSUVMRF9JU19BUlJBWSkgeworCisJCXR5cGUgPSBidF9jdGZfZXZlbnRfY2xhc3NfZ2V0X2ZpZWxkX2J5X25hbWUoCisJCQkJZXZlbnRfY2xhc3MsIG5hbWUpOworCQlhcnJheV9maWVsZCA9IGJ0X2N0Zl9maWVsZF9jcmVhdGUodHlwZSk7CisJCWJ0X2N0Zl9maWVsZF90eXBlX3B1dCh0eXBlKTsKKwkJaWYgKCFhcnJheV9maWVsZCkgeworCQkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGFycmF5IHR5cGUgJXNcbiIsIG5hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJbGVuID0gZm10Zi0+c2l6ZSAvIGZtdGYtPmFycmF5bGVuOworCQluX2l0ZW1zID0gZm10Zi0+YXJyYXlsZW47CisJfSBlbHNlIHsKKwkJbl9pdGVtcyA9IDE7CisJCWFycmF5X2ZpZWxkID0gTlVMTDsKKwl9CisKKwl0eXBlID0gZ2V0X3RyYWNlcG9pbnRfZmllbGRfdHlwZShjdywgZm10Zik7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9pdGVtczsgaSsrKSB7CisJCWlmICghKGZsYWdzICYgRklFTERfSVNfU1RSSU5HKSkKKwkJCXZhbHVlX2ludCA9IHBldmVudF9yZWFkX251bWJlcigKKwkJCQkJZm10Zi0+ZXZlbnQtPnBldmVudCwKKwkJCQkJZGF0YSArIG9mZnNldCArIGkgKiBsZW4sIGxlbik7CisKKwkJaWYgKGZsYWdzICYgRklFTERfSVNfQVJSQVkpCisJCQlmaWVsZCA9IGJ0X2N0Zl9maWVsZF9hcnJheV9nZXRfZmllbGQoYXJyYXlfZmllbGQsIGkpOworCQllbHNlCisJCQlmaWVsZCA9IGJ0X2N0Zl9maWVsZF9jcmVhdGUodHlwZSk7CisKKwkJaWYgKCFmaWVsZCkgeworCQkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIGEgZmllbGQgJXNcbiIsIG5hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKGZsYWdzICYgRklFTERfSVNfU1RSSU5HKQorCQkJcmV0ID0gYnRfY3RmX2ZpZWxkX3N0cmluZ19zZXRfdmFsdWUoZmllbGQsCisJCQkJCWRhdGEgKyBvZmZzZXQgKyBpICogbGVuKTsKKwkJZWxzZSBpZiAoIShmbGFncyAmIEZJRUxEX0lTX1NJR05FRCkpCisJCQlyZXQgPSBidF9jdGZfZmllbGRfdW5zaWduZWRfaW50ZWdlcl9zZXRfdmFsdWUoCisJCQkJCWZpZWxkLCB2YWx1ZV9pbnQpOworCQllbHNlCisJCQlyZXQgPSBidF9jdGZfZmllbGRfc2lnbmVkX2ludGVnZXJfc2V0X3ZhbHVlKAorCQkJCQlmaWVsZCwgdmFsdWVfaW50KTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJmYWlsZWQgdG8gc2V0IGZpbGUgdmFsdWUgJXNcbiIsIG5hbWUpOworCQkJZ290byBlcnJfcHV0X2ZpZWxkOworCQl9CisJCWlmICghKGZsYWdzICYgRklFTERfSVNfQVJSQVkpKSB7CisJCQlyZXQgPSBidF9jdGZfZXZlbnRfc2V0X3BheWxvYWQoZXZlbnQsIG5hbWUsIGZpZWxkKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlwcl9lcnIoImZhaWxlZCB0byBzZXQgcGF5bG9hZCAlc1xuIiwgbmFtZSk7CisJCQkJZ290byBlcnJfcHV0X2ZpZWxkOworCQkJfQorCQl9CisJCWJ0X2N0Zl9maWVsZF9wdXQoZmllbGQpOworCX0KKwlpZiAoZmxhZ3MgJiBGSUVMRF9JU19BUlJBWSkgeworCQlyZXQgPSBidF9jdGZfZXZlbnRfc2V0X3BheWxvYWQoZXZlbnQsIG5hbWUsIGFycmF5X2ZpZWxkKTsKKwkJaWYgKHJldCkgeworCQkJcHJfZXJyKCJGYWlsZWQgYWRkIHBheWxvYWQgYXJyYXkgJXNcbiIsIG5hbWUpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWJ0X2N0Zl9maWVsZF9wdXQoYXJyYXlfZmllbGQpOworCX0KKwlyZXR1cm4gMDsKKworZXJyX3B1dF9maWVsZDoKKwlidF9jdGZfZmllbGRfcHV0KGZpZWxkKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3RyYWNlcG9pbnRfZmllbGRzX3ZhbHVlcyhzdHJ1Y3QgY3RmX3dyaXRlciAqY3csCisJCQkJCXN0cnVjdCBidF9jdGZfZXZlbnRfY2xhc3MgKmV2ZW50X2NsYXNzLAorCQkJCQlzdHJ1Y3QgYnRfY3RmX2V2ZW50ICpldmVudCwKKwkJCQkJc3RydWN0IGZvcm1hdF9maWVsZCAqZmllbGRzLAorCQkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKK3sKKwlzdHJ1Y3QgZm9ybWF0X2ZpZWxkICpmaWVsZDsKKwlpbnQgcmV0OworCisJZm9yIChmaWVsZCA9IGZpZWxkczsgZmllbGQ7IGZpZWxkID0gZmllbGQtPm5leHQpIHsKKwkJcmV0ID0gYWRkX3RyYWNlcG9pbnRfZmllbGRfdmFsdWUoY3csIGV2ZW50X2NsYXNzLCBldmVudCwgc2FtcGxlLAorCQkJCWZpZWxkKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3RyYWNlcG9pbnRfdmFsdWVzKHN0cnVjdCBjdGZfd3JpdGVyICpjdywKKwkJCQkgc3RydWN0IGJ0X2N0Zl9ldmVudF9jbGFzcyAqZXZlbnRfY2xhc3MsCisJCQkJIHN0cnVjdCBidF9jdGZfZXZlbnQgKmV2ZW50LAorCQkJCSBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkJIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlKQoreworCXN0cnVjdCBmb3JtYXRfZmllbGQgKmNvbW1vbl9maWVsZHMgPSBldnNlbC0+dHBfZm9ybWF0LT5mb3JtYXQuY29tbW9uX2ZpZWxkczsKKwlzdHJ1Y3QgZm9ybWF0X2ZpZWxkICpmaWVsZHMgICAgICAgID0gZXZzZWwtPnRwX2Zvcm1hdC0+Zm9ybWF0LmZpZWxkczsKKwlpbnQgcmV0OworCisJcmV0ID0gYWRkX3RyYWNlcG9pbnRfZmllbGRzX3ZhbHVlcyhjdywgZXZlbnRfY2xhc3MsIGV2ZW50LAorCQkJCQkgICBjb21tb25fZmllbGRzLCBzYW1wbGUpOworCWlmICghcmV0KQorCQlyZXQgPSBhZGRfdHJhY2Vwb2ludF9maWVsZHNfdmFsdWVzKGN3LCBldmVudF9jbGFzcywgZXZlbnQsCisJCQkJCQkgICBmaWVsZHMsIHNhbXBsZSk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFkZF9nZW5lcmljX3ZhbHVlcyhzdHJ1Y3QgY3RmX3dyaXRlciAqY3csCisJCQkgICAgICBzdHJ1Y3QgYnRfY3RmX2V2ZW50ICpldmVudCwKKwkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKKwkJCSAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlKQoreworCXU2NCB0eXBlID0gZXZzZWwtPmF0dHIuc2FtcGxlX3R5cGU7CisJaW50IHJldDsKKworCS8qCisJICogbWlzc2luZzoKKwkgKiAgIFBFUkZfU0FNUExFX1RJTUUgICAgICAgICAtIG5vdCBuZWVkZWQgYXMgd2UgaGF2ZSBpdCBpbgorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3RmIGV2ZW50IGhlYWRlcgorCSAqICAgUEVSRl9TQU1QTEVfUkVBRCAgICAgICAgIC0gVE9ETworCSAqICAgUEVSRl9TQU1QTEVfQ0FMTENIQUlOICAgIC0gVE9ETworCSAqICAgUEVSRl9TQU1QTEVfUkFXICAgICAgICAgIC0gdHJhY2Vwb2ludCBmaWVsZHMgYXJlIGhhbmRsZWQgc2VwYXJhdGVseQorCSAqICAgUEVSRl9TQU1QTEVfQlJBTkNIX1NUQUNLIC0gVE9ETworCSAqICAgUEVSRl9TQU1QTEVfUkVHU19VU0VSICAgIC0gVE9ETworCSAqICAgUEVSRl9TQU1QTEVfU1RBQ0tfVVNFUiAgIC0gVE9ETworCSAqLworCisJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9JUCkgeworCQlyZXQgPSB2YWx1ZV9zZXRfdTY0X2hleChjdywgZXZlbnQsICJwZXJmX2lwIiwgc2FtcGxlLT5pcCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9USUQpIHsKKwkJcmV0ID0gdmFsdWVfc2V0X3MzMihjdywgZXZlbnQsICJwZXJmX3RpZCIsIHNhbXBsZS0+dGlkKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtMTsKKworCQlyZXQgPSB2YWx1ZV9zZXRfczMyKGN3LCBldmVudCwgInBlcmZfcGlkIiwgc2FtcGxlLT5waWQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmICgodHlwZSAmIFBFUkZfU0FNUExFX0lEKSB8fAorCSAgICAodHlwZSAmIFBFUkZfU0FNUExFX0lERU5USUZJRVIpKSB7CisJCXJldCA9IHZhbHVlX3NldF91NjQoY3csIGV2ZW50LCAicGVyZl9pZCIsIHNhbXBsZS0+aWQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfU1RSRUFNX0lEKSB7CisJCXJldCA9IHZhbHVlX3NldF91NjQoY3csIGV2ZW50LCAicGVyZl9zdHJlYW1faWQiLCBzYW1wbGUtPnN0cmVhbV9pZCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9DUFUpIHsKKwkJcmV0ID0gdmFsdWVfc2V0X3UzMihjdywgZXZlbnQsICJwZXJmX2NwdSIsIHNhbXBsZS0+Y3B1KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX1BFUklPRCkgeworCQlyZXQgPSB2YWx1ZV9zZXRfdTY0KGN3LCBldmVudCwgInBlcmZfcGVyaW9kIiwgc2FtcGxlLT5wZXJpb2QpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfV0VJR0hUKSB7CisJCXJldCA9IHZhbHVlX3NldF91NjQoY3csIGV2ZW50LCAicGVyZl93ZWlnaHQiLCBzYW1wbGUtPndlaWdodCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9EQVRBX1NSQykgeworCQlyZXQgPSB2YWx1ZV9zZXRfdTY0KGN3LCBldmVudCwgInBlcmZfZGF0YV9zcmMiLAorCQkJCXNhbXBsZS0+ZGF0YV9zcmMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfVFJBTlNBQ1RJT04pIHsKKwkJcmV0ID0gdmFsdWVfc2V0X3U2NChjdywgZXZlbnQsICJwZXJmX3RyYW5zYWN0aW9uIiwKKwkJCQlzYW1wbGUtPnRyYW5zYWN0aW9uKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX3NhbXBsZV9ldmVudChzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCXVuaW9uIHBlcmZfZXZlbnQgKl9ldmVudCBfX21heWJlX3VudXNlZCwKKwkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX19tYXliZV91bnVzZWQpCit7CisJc3RydWN0IGNvbnZlcnQgKmMgPSBjb250YWluZXJfb2YodG9vbCwgc3RydWN0IGNvbnZlcnQsIHRvb2wpOworCXN0cnVjdCBldnNlbF9wcml2ICpwcml2ID0gZXZzZWwtPnByaXY7CisJc3RydWN0IGN0Zl93cml0ZXIgKmN3ID0gJmMtPndyaXRlcjsKKwlzdHJ1Y3QgYnRfY3RmX2V2ZW50X2NsYXNzICpldmVudF9jbGFzczsKKwlzdHJ1Y3QgYnRfY3RmX2V2ZW50ICpldmVudDsKKwlpbnQgcmV0OworCisJaWYgKFdBUk5fT05DRSghcHJpdiwgIkZhaWxlZCB0byBzZXR1cCBhbGwgZXZlbnRzLlxuIikpCisJCXJldHVybiAwOworCisJZXZlbnRfY2xhc3MgPSBwcml2LT5ldmVudF9jbGFzczsKKworCS8qIHVwZGF0ZSBzdGF0cyAqLworCWMtPmV2ZW50c19jb3VudCsrOworCWMtPmV2ZW50c19zaXplICs9IF9ldmVudC0+aGVhZGVyLnNpemU7CisKKwlwcl90aW1lMihzYW1wbGUtPnRpbWUsICJzYW1wbGUgJSIgUFJJdTY0ICJcbiIsIGMtPmV2ZW50c19jb3VudCk7CisKKwlldmVudCA9IGJ0X2N0Zl9ldmVudF9jcmVhdGUoZXZlbnRfY2xhc3MpOworCWlmICghZXZlbnQpIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGFuIENURiBldmVudFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlidF9jdGZfY2xvY2tfc2V0X3RpbWUoY3ctPmNsb2NrLCBzYW1wbGUtPnRpbWUpOworCisJcmV0ID0gYWRkX2dlbmVyaWNfdmFsdWVzKGN3LCBldmVudCwgZXZzZWwsIHNhbXBsZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGV2c2VsLT5hdHRyLnR5cGUgPT0gUEVSRl9UWVBFX1RSQUNFUE9JTlQpIHsKKwkJcmV0ID0gYWRkX3RyYWNlcG9pbnRfdmFsdWVzKGN3LCBldmVudF9jbGFzcywgZXZlbnQsCisJCQkJCSAgICBldnNlbCwgc2FtcGxlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlidF9jdGZfc3RyZWFtX2FwcGVuZF9ldmVudChjdy0+c3RyZWFtLCBldmVudCk7CisJYnRfY3RmX2V2ZW50X3B1dChldmVudCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3RyYWNlcG9pbnRfZmllbGRzX3R5cGVzKHN0cnVjdCBjdGZfd3JpdGVyICpjdywKKwkJCQkgICAgICAgc3RydWN0IGZvcm1hdF9maWVsZCAqZmllbGRzLAorCQkJCSAgICAgICBzdHJ1Y3QgYnRfY3RmX2V2ZW50X2NsYXNzICpldmVudF9jbGFzcykKK3sKKwlzdHJ1Y3QgZm9ybWF0X2ZpZWxkICpmaWVsZDsKKwlpbnQgcmV0OworCisJZm9yIChmaWVsZCA9IGZpZWxkczsgZmllbGQ7IGZpZWxkID0gZmllbGQtPm5leHQpIHsKKwkJc3RydWN0IGJ0X2N0Zl9maWVsZF90eXBlICp0eXBlOworCQl1bnNpZ25lZCBsb25nIGZsYWdzID0gZmllbGQtPmZsYWdzOworCisJCXByMigiICBmaWVsZCAnJXMnXG4iLCBmaWVsZC0+bmFtZSk7CisKKwkJdHlwZSA9IGdldF90cmFjZXBvaW50X2ZpZWxkX3R5cGUoY3csIGZpZWxkKTsKKwkJaWYgKCF0eXBlKQorCQkJcmV0dXJuIC0xOworCisJCS8qCisJCSAqIEEgc3RyaW5nIGlzIGFuIGFycmF5IG9mIGNoYXJzLiBGb3IgdGhpcyB3ZSB1c2UgdGhlIHN0cmluZworCQkgKiB0eXBlIGFuZCBkb24ndCBjYXJlIHRoYXQgaXQgaXMgYW4gYXJyYXkuIFdoYXQgd2UgZG9uJ3QKKwkJICogc3VwcG9ydCBpcyBhbiBhcnJheSBvZiBzdHJpbmdzLgorCQkgKi8KKwkJaWYgKGZsYWdzICYgRklFTERfSVNfU1RSSU5HKQorCQkJZmxhZ3MgJj0gfkZJRUxEX0lTX0FSUkFZOworCisJCWlmIChmbGFncyAmIEZJRUxEX0lTX0FSUkFZKQorCQkJdHlwZSA9IGJ0X2N0Zl9maWVsZF90eXBlX2FycmF5X2NyZWF0ZSh0eXBlLCBmaWVsZC0+YXJyYXlsZW4pOworCisJCXJldCA9IGJ0X2N0Zl9ldmVudF9jbGFzc19hZGRfZmllbGQoZXZlbnRfY2xhc3MsIHR5cGUsCisJCQkJZmllbGQtPm5hbWUpOworCisJCWlmIChmbGFncyAmIEZJRUxEX0lTX0FSUkFZKQorCQkJYnRfY3RmX2ZpZWxkX3R5cGVfcHV0KHR5cGUpOworCisJCWlmIChyZXQpIHsKKwkJCXByX2VycigiRmFpbGVkIHRvIGFkZCBmaWVsZCAnJXNcbiIsIGZpZWxkLT5uYW1lKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF90cmFjZXBvaW50X3R5cGVzKHN0cnVjdCBjdGZfd3JpdGVyICpjdywKKwkJCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkJc3RydWN0IGJ0X2N0Zl9ldmVudF9jbGFzcyAqY2xhc3MpCit7CisJc3RydWN0IGZvcm1hdF9maWVsZCAqY29tbW9uX2ZpZWxkcyA9IGV2c2VsLT50cF9mb3JtYXQtPmZvcm1hdC5jb21tb25fZmllbGRzOworCXN0cnVjdCBmb3JtYXRfZmllbGQgKmZpZWxkcyAgICAgICAgPSBldnNlbC0+dHBfZm9ybWF0LT5mb3JtYXQuZmllbGRzOworCWludCByZXQ7CisKKwlyZXQgPSBhZGRfdHJhY2Vwb2ludF9maWVsZHNfdHlwZXMoY3csIGNvbW1vbl9maWVsZHMsIGNsYXNzKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYWRkX3RyYWNlcG9pbnRfZmllbGRzX3R5cGVzKGN3LCBmaWVsZHMsIGNsYXNzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2dlbmVyaWNfdHlwZXMoc3RydWN0IGN0Zl93cml0ZXIgKmN3LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkgICAgIHN0cnVjdCBidF9jdGZfZXZlbnRfY2xhc3MgKmV2ZW50X2NsYXNzKQoreworCXU2NCB0eXBlID0gZXZzZWwtPmF0dHIuc2FtcGxlX3R5cGU7CisKKwkvKgorCSAqIG1pc3Npbmc6CisJICogICBQRVJGX1NBTVBMRV9USU1FICAgICAgICAgLSBub3QgbmVlZGVkIGFzIHdlIGhhdmUgaXQgaW4KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0ZiBldmVudCBoZWFkZXIKKwkgKiAgIFBFUkZfU0FNUExFX1JFQUQgICAgICAgICAtIFRPRE8KKwkgKiAgIFBFUkZfU0FNUExFX0NBTExDSEFJTiAgICAtIFRPRE8KKwkgKiAgIFBFUkZfU0FNUExFX1JBVyAgICAgICAgICAtIHRyYWNlcG9pbnQgZmllbGRzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkKKwkgKiAgIFBFUkZfU0FNUExFX0JSQU5DSF9TVEFDSyAtIFRPRE8KKwkgKiAgIFBFUkZfU0FNUExFX1JFR1NfVVNFUiAgICAtIFRPRE8KKwkgKiAgIFBFUkZfU0FNUExFX1NUQUNLX1VTRVIgICAtIFRPRE8KKwkgKi8KKworI2RlZmluZSBBRERfRklFTEQoY2wsIHQsIG4pCQkJCQkJXAorCWRvIHsJCQkJCQkJCVwKKwkJcHIyKCIgIGZpZWxkICclcydcbiIsIG4pOwkJCQlcCisJCWlmIChidF9jdGZfZXZlbnRfY2xhc3NfYWRkX2ZpZWxkKGNsLCB0LCBuKSkgewkJXAorCQkJcHJfZXJyKCJGYWlsZWQgdG8gYWRkIGZpZWxkICclcztcbiIsIG4pOwlcCisJCQlyZXR1cm4gLTE7CQkJCQlcCisJCX0JCQkJCQkJXAorCX0gd2hpbGUgKDApCisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX0lQKQorCQlBRERfRklFTEQoZXZlbnRfY2xhc3MsIGN3LT5kYXRhLnU2NF9oZXgsICJwZXJmX2lwIik7CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX1RJRCkgeworCQlBRERfRklFTEQoZXZlbnRfY2xhc3MsIGN3LT5kYXRhLnMzMiwgInBlcmZfdGlkIik7CisJCUFERF9GSUVMRChldmVudF9jbGFzcywgY3ctPmRhdGEuczMyLCAicGVyZl9waWQiKTsKKwl9CisKKwlpZiAoKHR5cGUgJiBQRVJGX1NBTVBMRV9JRCkgfHwKKwkgICAgKHR5cGUgJiBQRVJGX1NBTVBMRV9JREVOVElGSUVSKSkKKwkJQUREX0ZJRUxEKGV2ZW50X2NsYXNzLCBjdy0+ZGF0YS51NjQsICJwZXJmX2lkIik7CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX1NUUkVBTV9JRCkKKwkJQUREX0ZJRUxEKGV2ZW50X2NsYXNzLCBjdy0+ZGF0YS51NjQsICJwZXJmX3N0cmVhbV9pZCIpOworCisJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9DUFUpCisJCUFERF9GSUVMRChldmVudF9jbGFzcywgY3ctPmRhdGEudTMyLCAicGVyZl9jcHUiKTsKKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfUEVSSU9EKQorCQlBRERfRklFTEQoZXZlbnRfY2xhc3MsIGN3LT5kYXRhLnU2NCwgInBlcmZfcGVyaW9kIik7CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX1dFSUdIVCkKKwkJQUREX0ZJRUxEKGV2ZW50X2NsYXNzLCBjdy0+ZGF0YS51NjQsICJwZXJmX3dlaWdodCIpOworCisJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9EQVRBX1NSQykKKwkJQUREX0ZJRUxEKGV2ZW50X2NsYXNzLCBjdy0+ZGF0YS51NjQsICJwZXJmX2RhdGFfc3JjIik7CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX1RSQU5TQUNUSU9OKQorCQlBRERfRklFTEQoZXZlbnRfY2xhc3MsIGN3LT5kYXRhLnU2NCwgInBlcmZfdHJhbnNhY3Rpb24iKTsKKworI3VuZGVmIEFERF9GSUVMRAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9ldmVudChzdHJ1Y3QgY3RmX3dyaXRlciAqY3csIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKK3sKKwlzdHJ1Y3QgYnRfY3RmX2V2ZW50X2NsYXNzICpldmVudF9jbGFzczsKKwlzdHJ1Y3QgZXZzZWxfcHJpdiAqcHJpdjsKKwljb25zdCBjaGFyICpuYW1lID0gcGVyZl9ldnNlbF9fbmFtZShldnNlbCk7CisJaW50IHJldDsKKworCXByKCJBZGRpbmcgZXZlbnQgJyVzJyAodHlwZSAlZClcbiIsIG5hbWUsIGV2c2VsLT5hdHRyLnR5cGUpOworCisJZXZlbnRfY2xhc3MgPSBidF9jdGZfZXZlbnRfY2xhc3NfY3JlYXRlKG5hbWUpOworCWlmICghZXZlbnRfY2xhc3MpCisJCXJldHVybiAtMTsKKworCXJldCA9IGFkZF9nZW5lcmljX3R5cGVzKGN3LCBldnNlbCwgZXZlbnRfY2xhc3MpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJaWYgKGV2c2VsLT5hdHRyLnR5cGUgPT0gUEVSRl9UWVBFX1RSQUNFUE9JTlQpIHsKKwkJcmV0ID0gYWRkX3RyYWNlcG9pbnRfdHlwZXMoY3csIGV2c2VsLCBldmVudF9jbGFzcyk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBidF9jdGZfc3RyZWFtX2NsYXNzX2FkZF9ldmVudF9jbGFzcyhjdy0+c3RyZWFtX2NsYXNzLCBldmVudF9jbGFzcyk7CisJaWYgKHJldCkgeworCQlwcigiRmFpbGVkIHRvIGFkZCBldmVudCBjbGFzcyBpbnRvIHN0cmVhbS5cbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlwcml2ID0gbWFsbG9jKHNpemVvZigqcHJpdikpOworCWlmICghcHJpdikKKwkJZ290byBlcnI7CisKKwlwcml2LT5ldmVudF9jbGFzcyA9IGV2ZW50X2NsYXNzOworCWV2c2VsLT5wcml2ICAgICAgID0gcHJpdjsKKwlyZXR1cm4gMDsKKworZXJyOgorCWJ0X2N0Zl9ldmVudF9jbGFzc19wdXQoZXZlbnRfY2xhc3MpOworCXByX2VycigiRmFpbGVkIHRvIGFkZCBldmVudCAnJXMnLlxuIiwgbmFtZSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHNldHVwX2V2ZW50cyhzdHJ1Y3QgY3RmX3dyaXRlciAqY3csIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCit7CisJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QgPSBzZXNzaW9uLT5ldmxpc3Q7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOworCWludCByZXQ7CisKKwlldmxpc3RfX2Zvcl9lYWNoKGV2bGlzdCwgZXZzZWwpIHsKKwkJcmV0ID0gYWRkX2V2ZW50KGN3LCBldnNlbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjdGZfd3JpdGVyX19zZXR1cF9lbnYoc3RydWN0IGN0Zl93cml0ZXIgKmN3LAorCQkJCSBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQoreworCXN0cnVjdCBwZXJmX2hlYWRlciAqaGVhZGVyID0gJnNlc3Npb24tPmhlYWRlcjsKKwlzdHJ1Y3QgYnRfY3RmX3dyaXRlciAqd3JpdGVyID0gY3ctPndyaXRlcjsKKworI2RlZmluZSBBREQoX19uLCBfX3YpCQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJaWYgKGJ0X2N0Zl93cml0ZXJfYWRkX2Vudmlyb25tZW50X2ZpZWxkKHdyaXRlciwgX19uLCBfX3YpKQlcCisJCXJldHVybiAtMTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisJQUREKCJob3N0IiwgICAgaGVhZGVyLT5lbnYuaG9zdG5hbWUpOworCUFERCgic3lzbmFtZSIsICJMaW51eCIpOworCUFERCgicmVsZWFzZSIsIGhlYWRlci0+ZW52Lm9zX3JlbGVhc2UpOworCUFERCgidmVyc2lvbiIsIGhlYWRlci0+ZW52LnZlcnNpb24pOworCUFERCgibWFjaGluZSIsIGhlYWRlci0+ZW52LmFyY2gpOworCUFERCgiZG9tYWluIiwgImtlcm5lbCIpOworCUFERCgidHJhY2VyX25hbWUiLCAicGVyZiIpOworCisjdW5kZWYgQURECisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3RmX3dyaXRlcl9fc2V0dXBfY2xvY2soc3RydWN0IGN0Zl93cml0ZXIgKmN3KQoreworCXN0cnVjdCBidF9jdGZfY2xvY2sgKmNsb2NrID0gY3ctPmNsb2NrOworCisJYnRfY3RmX2Nsb2NrX3NldF9kZXNjcmlwdGlvbihjbG9jaywgInBlcmYgY2xvY2siKTsKKworI2RlZmluZSBTRVQoX19uLCBfX3YpCQkJCVwKK2RvIHsJCQkJCQlcCisJaWYgKGJ0X2N0Zl9jbG9ja19zZXRfIyNfX24oY2xvY2ssIF9fdikpCVwKKwkJcmV0dXJuIC0xOwkJCVwKK30gd2hpbGUgKDApCisKKwlTRVQoZnJlcXVlbmN5LCAgIDEwMDAwMDAwMDApOworCVNFVChvZmZzZXRfcywgICAgMCk7CisJU0VUKG9mZnNldCwgICAgICAwKTsKKwlTRVQocHJlY2lzaW9uLCAgIDEwKTsKKwlTRVQoaXNfYWJzb2x1dGUsIDApOworCisjdW5kZWYgU0VUCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnRfY3RmX2ZpZWxkX3R5cGUgKmNyZWF0ZV9pbnRfdHlwZShpbnQgc2l6ZSwgYm9vbCBzaWduLCBib29sIGhleCkKK3sKKwlzdHJ1Y3QgYnRfY3RmX2ZpZWxkX3R5cGUgKnR5cGU7CisKKwl0eXBlID0gYnRfY3RmX2ZpZWxkX3R5cGVfaW50ZWdlcl9jcmVhdGUoc2l6ZSk7CisJaWYgKCF0eXBlKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChzaWduICYmCisJICAgIGJ0X2N0Zl9maWVsZF90eXBlX2ludGVnZXJfc2V0X3NpZ25lZCh0eXBlLCAxKSkKKwkJZ290byBlcnI7CisKKwlpZiAoaGV4ICYmCisJICAgIGJ0X2N0Zl9maWVsZF90eXBlX2ludGVnZXJfc2V0X2Jhc2UodHlwZSwgQlRfQ1RGX0lOVEVHRVJfQkFTRV9IRVhBREVDSU1BTCkpCisJCWdvdG8gZXJyOworCisJcHIyKCJDcmVhdGVkIHR5cGU6IElOVEVHRVIgJWQtYml0ICVzc2lnbmVkICVzXG4iLAorCSAgICBzaXplLCBzaWduID8gInVuIiA6ICIiLCBoZXggPyAiaGV4IiA6ICIiKTsKKwlyZXR1cm4gdHlwZTsKKworZXJyOgorCWJ0X2N0Zl9maWVsZF90eXBlX3B1dCh0eXBlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY3RmX3dyaXRlcl9fY2xlYW51cF9kYXRhKHN0cnVjdCBjdGZfd3JpdGVyICpjdykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN3LT5kYXRhLmFycmF5KTsgaSsrKQorCQlidF9jdGZfZmllbGRfdHlwZV9wdXQoY3ctPmRhdGEuYXJyYXlbaV0pOworfQorCitzdGF0aWMgaW50IGN0Zl93cml0ZXJfX2luaXRfZGF0YShzdHJ1Y3QgY3RmX3dyaXRlciAqY3cpCit7CisjZGVmaW5lIENSRUFURV9JTlRfVFlQRSh0eXBlLCBzaXplLCBzaWduLCBoZXgpCQlcCitkbyB7CQkJCQkJCVwKKwkodHlwZSkgPSBjcmVhdGVfaW50X3R5cGUoc2l6ZSwgc2lnbiwgaGV4KTsJXAorCWlmICghKHR5cGUpKQkJCQkJXAorCQlnb3RvIGVycjsJCQkJXAorfSB3aGlsZSAoMCkKKworCUNSRUFURV9JTlRfVFlQRShjdy0+ZGF0YS5zNjQsIDY0LCB0cnVlLCAgZmFsc2UpOworCUNSRUFURV9JTlRfVFlQRShjdy0+ZGF0YS51NjQsIDY0LCBmYWxzZSwgZmFsc2UpOworCUNSRUFURV9JTlRfVFlQRShjdy0+ZGF0YS5zMzIsIDMyLCB0cnVlLCAgZmFsc2UpOworCUNSRUFURV9JTlRfVFlQRShjdy0+ZGF0YS51MzIsIDMyLCBmYWxzZSwgZmFsc2UpOworCUNSRUFURV9JTlRfVFlQRShjdy0+ZGF0YS51NjRfaGV4LCA2NCwgZmFsc2UsIHRydWUpOworCisJY3ctPmRhdGEuc3RyaW5nICA9IGJ0X2N0Zl9maWVsZF90eXBlX3N0cmluZ19jcmVhdGUoKTsKKwlpZiAoY3ctPmRhdGEuc3RyaW5nKQorCQlyZXR1cm4gMDsKKworZXJyOgorCWN0Zl93cml0ZXJfX2NsZWFudXBfZGF0YShjdyk7CisJcHJfZXJyKCJGYWlsZWQgdG8gY3JlYXRlIGRhdGEgdHlwZXMuXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGN0Zl93cml0ZXJfX2NsZWFudXAoc3RydWN0IGN0Zl93cml0ZXIgKmN3KQoreworCWN0Zl93cml0ZXJfX2NsZWFudXBfZGF0YShjdyk7CisKKwlidF9jdGZfY2xvY2tfcHV0KGN3LT5jbG9jayk7CisJYnRfY3RmX3N0cmVhbV9wdXQoY3ctPnN0cmVhbSk7CisJYnRfY3RmX3N0cmVhbV9jbGFzc19wdXQoY3ctPnN0cmVhbV9jbGFzcyk7CisJYnRfY3RmX3dyaXRlcl9wdXQoY3ctPndyaXRlcik7CisKKwkvKiBhbmQgTlVMTCBhbGwgdGhlIHBvaW50ZXJzICovCisJbWVtc2V0KGN3LCAwLCBzaXplb2YoKmN3KSk7Cit9CisKK3N0YXRpYyBpbnQgY3RmX3dyaXRlcl9faW5pdChzdHJ1Y3QgY3RmX3dyaXRlciAqY3csIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IGJ0X2N0Zl93cml0ZXIJCSp3cml0ZXI7CisJc3RydWN0IGJ0X2N0Zl9zdHJlYW1fY2xhc3MJKnN0cmVhbV9jbGFzczsKKwlzdHJ1Y3QgYnRfY3RmX3N0cmVhbQkJKnN0cmVhbTsKKwlzdHJ1Y3QgYnRfY3RmX2Nsb2NrCQkqY2xvY2s7CisKKwkvKiBDVEYgd3JpdGVyICovCisJd3JpdGVyID0gYnRfY3RmX3dyaXRlcl9jcmVhdGUocGF0aCk7CisJaWYgKCF3cml0ZXIpCisJCWdvdG8gZXJyOworCisJY3ctPndyaXRlciA9IHdyaXRlcjsKKworCS8qIENURiBjbG9jayAqLworCWNsb2NrID0gYnRfY3RmX2Nsb2NrX2NyZWF0ZSgicGVyZl9jbG9jayIpOworCWlmICghY2xvY2spIHsKKwkJcHIoIkZhaWxlZCB0byBjcmVhdGUgQ1RGIGNsb2NrLlxuIik7CisJCWdvdG8gZXJyX2NsZWFudXA7CisJfQorCisJY3ctPmNsb2NrID0gY2xvY2s7CisKKwlpZiAoY3RmX3dyaXRlcl9fc2V0dXBfY2xvY2soY3cpKSB7CisJCXByKCJGYWlsZWQgdG8gc2V0dXAgQ1RGIGNsb2NrLlxuIik7CisJCWdvdG8gZXJyX2NsZWFudXA7CisJfQorCisJLyogQ1RGIHN0cmVhbSBjbGFzcyAqLworCXN0cmVhbV9jbGFzcyA9IGJ0X2N0Zl9zdHJlYW1fY2xhc3NfY3JlYXRlKCJwZXJmX3N0cmVhbSIpOworCWlmICghc3RyZWFtX2NsYXNzKSB7CisJCXByKCJGYWlsZWQgdG8gY3JlYXRlIENURiBzdHJlYW0gY2xhc3MuXG4iKTsKKwkJZ290byBlcnJfY2xlYW51cDsKKwl9CisKKwljdy0+c3RyZWFtX2NsYXNzID0gc3RyZWFtX2NsYXNzOworCisJLyogQ1RGIGNsb2NrIHN0cmVhbSBzZXR1cCAqLworCWlmIChidF9jdGZfc3RyZWFtX2NsYXNzX3NldF9jbG9jayhzdHJlYW1fY2xhc3MsIGNsb2NrKSkgeworCQlwcigiRmFpbGVkIHRvIGFzc2lnbiBDVEYgY2xvY2sgdG8gc3RyZWFtIGNsYXNzLlxuIik7CisJCWdvdG8gZXJyX2NsZWFudXA7CisJfQorCisJaWYgKGN0Zl93cml0ZXJfX2luaXRfZGF0YShjdykpCisJCWdvdG8gZXJyX2NsZWFudXA7CisKKwkvKiBDVEYgc3RyZWFtIGluc3RhbmNlICovCisJc3RyZWFtID0gYnRfY3RmX3dyaXRlcl9jcmVhdGVfc3RyZWFtKHdyaXRlciwgc3RyZWFtX2NsYXNzKTsKKwlpZiAoIXN0cmVhbSkgeworCQlwcigiRmFpbGVkIHRvIGNyZWF0ZSBDVEYgc3RyZWFtLlxuIik7CisJCWdvdG8gZXJyX2NsZWFudXA7CisJfQorCisJY3ctPnN0cmVhbSA9IHN0cmVhbTsKKworCS8qIENURiBjbG9jayB3cml0ZXIgc2V0dXAgKi8KKwlpZiAoYnRfY3RmX3dyaXRlcl9hZGRfY2xvY2sod3JpdGVyLCBjbG9jaykpIHsKKwkJcHIoIkZhaWxlZCB0byBhc3NpZ24gQ1RGIGNsb2NrIHRvIHdyaXRlci5cbiIpOworCQlnb3RvIGVycl9jbGVhbnVwOworCX0KKworCXJldHVybiAwOworCitlcnJfY2xlYW51cDoKKwljdGZfd3JpdGVyX19jbGVhbnVwKGN3KTsKK2VycjoKKwlwcl9lcnIoIkZhaWxlZCB0byBzZXR1cCBDVEYgd3JpdGVyLlxuIik7CisJcmV0dXJuIC0xOworfQorCitpbnQgYnRfY29udmVydF9fcGVyZjJjdGYoY29uc3QgY2hhciAqaW5wdXQsIGNvbnN0IGNoYXIgKnBhdGgsIGJvb2wgZm9yY2UpCit7CisJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbjsKKwlzdHJ1Y3QgcGVyZl9kYXRhX2ZpbGUgZmlsZSA9IHsKKwkJLnBhdGggPSBpbnB1dCwKKwkJLm1vZGUgPSBQRVJGX0RBVEFfTU9ERV9SRUFELAorCQkuZm9yY2UgPSBmb3JjZSwKKwl9OworCXN0cnVjdCBjb252ZXJ0IGMgPSB7CisJCS50b29sID0geworCQkJLnNhbXBsZSAgICAgICAgICA9IHByb2Nlc3Nfc2FtcGxlX2V2ZW50LAorCQkJLm1tYXAgICAgICAgICAgICA9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbW1hcCwKKwkJCS5tbWFwMiAgICAgICAgICAgPSBwZXJmX2V2ZW50X19wcm9jZXNzX21tYXAyLAorCQkJLmNvbW0gICAgICAgICAgICA9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfY29tbSwKKwkJCS5leGl0ICAgICAgICAgICAgPSBwZXJmX2V2ZW50X19wcm9jZXNzX2V4aXQsCisJCQkuZm9yayAgICAgICAgICAgID0gcGVyZl9ldmVudF9fcHJvY2Vzc19mb3JrLAorCQkJLmxvc3QgICAgICAgICAgICA9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbG9zdCwKKwkJCS50cmFjaW5nX2RhdGEgICAgPSBwZXJmX2V2ZW50X19wcm9jZXNzX3RyYWNpbmdfZGF0YSwKKwkJCS5idWlsZF9pZCAgICAgICAgPSBwZXJmX2V2ZW50X19wcm9jZXNzX2J1aWxkX2lkLAorCQkJLm9yZGVyZWRfZXZlbnRzICA9IHRydWUsCisJCQkub3JkZXJpbmdfcmVxdWlyZXNfdGltZXN0YW1wcyA9IHRydWUsCisJCX0sCisJfTsKKwlzdHJ1Y3QgY3RmX3dyaXRlciAqY3cgPSAmYy53cml0ZXI7CisJaW50IGVyciA9IC0xOworCisJLyogQ1RGIHdyaXRlciAqLworCWlmIChjdGZfd3JpdGVyX19pbml0KGN3LCBwYXRoKSkKKwkJcmV0dXJuIC0xOworCisJLyogcGVyZi5kYXRhIHNlc3Npb24gKi8KKwlzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcoJmZpbGUsIDAsICZjLnRvb2wpOworCWlmICghc2Vzc2lvbikKKwkJZ290byBmcmVlX3dyaXRlcjsKKworCS8qIENURiB3cml0ZXIgZW52L2Nsb2NrIHNldHVwICAqLworCWlmIChjdGZfd3JpdGVyX19zZXR1cF9lbnYoY3csIHNlc3Npb24pKQorCQlnb3RvIGZyZWVfc2Vzc2lvbjsKKworCS8qIENURiBldmVudHMgc2V0dXAgKi8KKwlpZiAoc2V0dXBfZXZlbnRzKGN3LCBzZXNzaW9uKSkKKwkJZ290byBmcmVlX3Nlc3Npb247CisKKwllcnIgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24pOworCWlmICghZXJyKQorCQllcnIgPSBidF9jdGZfc3RyZWFtX2ZsdXNoKGN3LT5zdHJlYW0pOworCisJZnByaW50ZihzdGRlcnIsCisJCSJbIHBlcmYgZGF0YSBjb252ZXJ0OiBDb252ZXJ0ZWQgJyVzJyBpbnRvIENURiBkYXRhICclcycgXVxuIiwKKwkJZmlsZS5wYXRoLCBwYXRoKTsKKworCWZwcmludGYoc3RkZXJyLAorCQkiWyBwZXJmIGRhdGEgY29udmVydDogQ29udmVydGVkIGFuZCB3cm90ZSAlLjNmIE1CICglIiBQUkl1NjQgIiBzYW1wbGVzKSBdXG4iLAorCQkoZG91YmxlKSBjLmV2ZW50c19zaXplIC8gMTAyNC4wIC8gMTAyNC4wLAorCQljLmV2ZW50c19jb3VudCk7CisKKwkvKiBpdHMgYWxsIGdvb2QgKi8KK2ZyZWVfc2Vzc2lvbjoKKwlwZXJmX3Nlc3Npb25fX2RlbGV0ZShzZXNzaW9uKTsKKworZnJlZV93cml0ZXI6CisJY3RmX3dyaXRlcl9fY2xlYW51cChjdyk7CisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kYXRhLWNvbnZlcnQtYnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9kYXRhLWNvbnZlcnQtYnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzIwNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2RhdGEtY29udmVydC1idC5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfX0RBVEFfQ09OVkVSVF9CVF9ICisjZGVmaW5lIF9fREFUQV9DT05WRVJUX0JUX0gKKyNpZmRlZiBIQVZFX0xJQkJBQkVMVFJBQ0VfU1VQUE9SVAorCitpbnQgYnRfY29udmVydF9fcGVyZjJjdGYoY29uc3QgY2hhciAqaW5wdXRfbmFtZSwgY29uc3QgY2hhciAqdG9fY3RmLCBib29sIGZvcmNlKTsKKworI2VuZGlmIC8qIEhBVkVfTElCQkFCRUxUUkFDRV9TVVBQT1JUICovCisjZW5kaWYgLyogX19EQVRBX0NPTlZFUlRfQlRfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2RiLWV4cG9ydC5jIGIvdG9vbHMvcGVyZi91dGlsL2RiLWV4cG9ydC5jCmluZGV4IGM4MWRhZTMuLmJiMzlhM2YgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kYi1leHBvcnQuYworKysgYi90b29scy9wZXJmL3V0aWwvZGItZXhwb3J0LmMKQEAgLTI4MiwxMyArMjgyLDEzIEBACiAKIGludCBkYl9leHBvcnRfX3NhbXBsZShzdHJ1Y3QgZGJfZXhwb3J0ICpkYmUsIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCkKKwkJICAgICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsKQogeworCXN0cnVjdCB0aHJlYWQqIHRocmVhZCA9IGFsLT50aHJlYWQ7CiAJc3RydWN0IGV4cG9ydF9zYW1wbGUgZXMgPSB7CiAJCS5ldmVudCA9IGV2ZW50LAogCQkuc2FtcGxlID0gc2FtcGxlLAogCQkuZXZzZWwgPSBldnNlbCwKLQkJLnRocmVhZCA9IHRocmVhZCwKIAkJLmFsID0gYWwsCiAJfTsKIAlzdHJ1Y3QgdGhyZWFkICptYWluX3RocmVhZDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kYi1leHBvcnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9kYi1leHBvcnQuaAppbmRleCBhZGJkMjJkLi4yNWUyMmZkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZGItZXhwb3J0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2RiLWV4cG9ydC5oCkBAIC0zNCw3ICszNCw2IEBACiAJdW5pb24gcGVyZl9ldmVudAkqZXZlbnQ7CiAJc3RydWN0IHBlcmZfc2FtcGxlCSpzYW1wbGU7CiAJc3RydWN0IHBlcmZfZXZzZWwJKmV2c2VsOwotCXN0cnVjdCB0aHJlYWQJCSp0aHJlYWQ7CiAJc3RydWN0IGFkZHJfbG9jYXRpb24JKmFsOwogCXU2NAkJCWRiX2lkOwogCXU2NAkJCWNvbW1fZGJfaWQ7CkBAIC05Nyw3ICs5Niw3IEBACiAJCQkgICBjb25zdCBjaGFyICpuYW1lKTsKIGludCBkYl9leHBvcnRfX3NhbXBsZShzdHJ1Y3QgZGJfZXhwb3J0ICpkYmUsIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCk7CisJCSAgICAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCk7CiAKIGludCBkYl9leHBvcnRfX2JyYW5jaF90eXBlcyhzdHJ1Y3QgZGJfZXhwb3J0ICpkYmUpOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZGVidWcuYyBiL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5jCmluZGV4IGFkNjBiMmYuLjJkYTU1ODEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5jCkBAIC0yMCw2ICsyMCw3IEBACiBib29sIGR1bXBfdHJhY2UgPSBmYWxzZSwgcXVpZXQgPSBmYWxzZTsKIGludCBkZWJ1Z19vcmRlcmVkX2V2ZW50czsKIHN0YXRpYyBpbnQgcmVkaXJlY3RfdG9fc3RkZXJyOworaW50IGRlYnVnX2RhdGFfY29udmVydDsKIAogc3RhdGljIGludCBfZXByaW50ZihpbnQgbGV2ZWwsIGludCB2YXIsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQogewpAQCAtMTQ3LDYgKzE0OCw3IEBACiAJeyAubmFtZSA9ICJ2ZXJib3NlIiwJCS5wdHIgPSAmdmVyYm9zZSB9LAogCXsgLm5hbWUgPSAib3JkZXJlZC1ldmVudHMiLAkucHRyID0gJmRlYnVnX29yZGVyZWRfZXZlbnRzfSwKIAl7IC5uYW1lID0gInN0ZGVyciIsCQkucHRyID0gJnJlZGlyZWN0X3RvX3N0ZGVycn0sCisJeyAubmFtZSA9ICJkYXRhLWNvbnZlcnQiLAkucHRyID0gJmRlYnVnX2RhdGFfY29udmVydCB9LAogCXsgLm5hbWUgPSBOVUxMLCB9CiB9OwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZGVidWcuaCBiL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5oCmluZGV4IGJlMjY0ZDYuLmNhYWMyZmQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Zy5oCkBAIC0xMiw2ICsxMiw3IEBACiBleHRlcm4gaW50IHZlcmJvc2U7CiBleHRlcm4gYm9vbCBxdWlldCwgZHVtcF90cmFjZTsKIGV4dGVybiBpbnQgZGVidWdfb3JkZXJlZF9ldmVudHM7CitleHRlcm4gaW50IGRlYnVnX2RhdGFfY29udmVydDsKIAogI2lmbmRlZiBwcl9mbXQKICNkZWZpbmUgcHJfZm10KGZtdCkgZm10CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHNvLmMgYi90b29scy9wZXJmL3V0aWwvZHNvLmMKaW5kZXggYzJmN2QzYi4uZmMwZGRkNSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2Rzby5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kc28uYwpAQCAtNDUsMTMgKzQ1LDEzIEBACiAJY2FzZSBEU09fQklOQVJZX1RZUEVfX0RFQlVHTElOSzogewogCQljaGFyICpkZWJ1Z2xpbms7CiAKLQkJc3RybmNweShmaWxlbmFtZSwgZHNvLT5sb25nX25hbWUsIHNpemUpOwotCQlkZWJ1Z2xpbmsgPSBmaWxlbmFtZSArIGRzby0+bG9uZ19uYW1lX2xlbjsKKwkJbGVuID0gX19zeW1ib2xfX2pvaW5fc3ltZnMoZmlsZW5hbWUsIHNpemUsIGRzby0+bG9uZ19uYW1lKTsKKwkJZGVidWdsaW5rID0gZmlsZW5hbWUgKyBsZW47CiAJCXdoaWxlIChkZWJ1Z2xpbmsgIT0gZmlsZW5hbWUgJiYgKmRlYnVnbGluayAhPSAnLycpCiAJCQlkZWJ1Z2xpbmstLTsKIAkJaWYgKCpkZWJ1Z2xpbmsgPT0gJy8nKQogCQkJZGVidWdsaW5rKys7Ci0JCXJldCA9IGZpbGVuYW1lX19yZWFkX2RlYnVnbGluayhkc28tPmxvbmdfbmFtZSwgZGVidWdsaW5rLAorCQlyZXQgPSBmaWxlbmFtZV9fcmVhZF9kZWJ1Z2xpbmsoZmlsZW5hbWUsIGRlYnVnbGluaywKIAkJCQkJICAgICAgIHNpemUgLSAoZGVidWdsaW5rIC0gZmlsZW5hbWUpKTsKIAkJfQogCQlicmVhazsKQEAgLTE0OCw2ICsxNDgsOSBAQAogI2lmZGVmIEhBVkVfWkxJQl9TVVBQT1JUCiAJeyAiZ3oiLCBnemlwX2RlY29tcHJlc3NfdG9fZmlsZSB9LAogI2VuZGlmCisjaWZkZWYgSEFWRV9MWk1BX1NVUFBPUlQKKwl7ICJ4eiIsIGx6bWFfZGVjb21wcmVzc190b19maWxlIH0sCisjZW5kaWYKIAl7IE5VTEwsIE5VTEwgfSwKIH07CiAKQEAgLTE2MiwzMiArMTY1LDE0IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIGlzX2ttb2R1bGVfZXh0ZW5zaW9uKGNvbnN0IGNoYXIgKmV4dCkKK2Jvb2wgaXNfa2VybmVsX21vZHVsZShjb25zdCBjaGFyICpwYXRobmFtZSkKIHsKLQlpZiAoc3RybmNtcChleHQsICJrbyIsIDIpKQotCQlyZXR1cm4gZmFsc2U7CisJc3RydWN0IGttb2RfcGF0aCBtOwogCi0JaWYgKGV4dFsyXSA9PSAnXDAnIHx8IChleHRbMl0gPT0gJy4nICYmIGlzX3N1cHBvcnRlZF9jb21wcmVzc2lvbihleHQrMykpKQotCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoa21vZF9wYXRoX19wYXJzZSgmbSwgcGF0aG5hbWUpKQorCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBpc19rZXJuZWxfbW9kdWxlKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBib29sICpjb21wcmVzc2VkKQotewotCWNvbnN0IGNoYXIgKmV4dCA9IHN0cnJjaHIocGF0aG5hbWUsICcuJyk7Ci0KLQlpZiAoZXh0ID09IE5VTEwpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmIChpc19zdXBwb3J0ZWRfY29tcHJlc3Npb24oZXh0ICsgMSkpIHsKLQkJaWYgKGNvbXByZXNzZWQpCi0JCQkqY29tcHJlc3NlZCA9IHRydWU7Ci0JCWV4dCAtPSAzOwotCX0gZWxzZSBpZiAoY29tcHJlc3NlZCkKLQkJKmNvbXByZXNzZWQgPSBmYWxzZTsKLQotCXJldHVybiBpc19rbW9kdWxlX2V4dGVuc2lvbihleHQgKyAxKTsKKwlyZXR1cm4gbS5rbW9kOwogfQogCiBib29sIGRlY29tcHJlc3NfdG9fZmlsZShjb25zdCBjaGFyICpleHQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgb3V0cHV0X2ZkKQpAQCAtMjA5LDYgKzE5NCw3MiBAQAogfQogCiAvKgorICogUGFyc2VzIGtlcm5lbCBtb2R1bGUgc3BlY2lmaWVkIGluIEBwYXRoIGFuZCB1cGRhdGVzCisgKiBAbSBhcmd1bWVudCBsaWtlOgorICoKKyAqICAgIEBjb21wIC0gdHJ1ZSBpZiBAcGF0aCBjb250YWlucyBzdXBwb3J0ZWQgY29tcHJlc3Npb24gc3VmZml4LAorICogICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAqICAgIEBrbW9kIC0gdHJ1ZSBpZiBAcGF0aCBjb250YWlucyAnLmtvJyBzdWZmaXggaW4gcmlnaHQgcG9zaXRpb24sCisgKiAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICogICAgQG5hbWUgLSBpZiAoQGFsbG9jX25hbWUgJiYgQGttb2QpIGlzIHRydWUsIGl0IGNvbnRhaW5zIHN0cmR1cC1lZCBiYXNlIG5hbWUKKyAqICAgICAgICAgICAgb2YgdGhlIGtlcm5lbCBtb2R1bGUgd2l0aG91dCBzdWZmaXhlcywgb3RoZXJ3aXNlIHN0cnVkdXAtZWQKKyAqICAgICAgICAgICAgYmFzZSBuYW1lIG9mIEBwYXRoCisgKiAgICBAZXh0ICAtIGlmIChAYWxsb2NfZXh0ICYmIEBjb21wKSBpcyB0cnVlLCBpdCBjb250YWlucyBzdHJkdXAtZWQgc3RyaW5nCisgKiAgICAgICAgICAgIHRoZSBjb21wcmVzc2lvbiBzdWZmaXgKKyAqCisgKiBSZXR1cm5zIDAgaWYgdGhlcmUncyBubyBzdHJkdXAgZXJyb3IsIC1FTk9NRU0gb3RoZXJ3aXNlLgorICovCitpbnQgX19rbW9kX3BhdGhfX3BhcnNlKHN0cnVjdCBrbW9kX3BhdGggKm0sIGNvbnN0IGNoYXIgKnBhdGgsCisJCSAgICAgICBib29sIGFsbG9jX25hbWUsIGJvb2wgYWxsb2NfZXh0KQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBzdHJyY2hyKHBhdGgsICcvJyk7CisJY29uc3QgY2hhciAqZXh0ICA9IHN0cnJjaHIocGF0aCwgJy4nKTsKKworCW1lbXNldChtLCAweDAsIHNpemVvZigqbSkpOworCW5hbWUgPSBuYW1lID8gbmFtZSArIDEgOiBwYXRoOworCisJLyogTm8gZXh0ZW5zaW9uLCBqdXN0IHJldHVybiBuYW1lLiAqLworCWlmIChleHQgPT0gTlVMTCkgeworCQlpZiAoYWxsb2NfbmFtZSkgeworCQkJbS0+bmFtZSA9IHN0cmR1cChuYW1lKTsKKwkJCXJldHVybiBtLT5uYW1lID8gMCA6IC1FTk9NRU07CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGlzX3N1cHBvcnRlZF9jb21wcmVzc2lvbihleHQgKyAxKSkgeworCQltLT5jb21wID0gdHJ1ZTsKKwkJZXh0IC09IDM7CisJfQorCisJLyogQ2hlY2sgLmtvIGV4dGVuc2lvbiBvbmx5IGlmIHRoZXJlJ3MgZW5vdWdoIG5hbWUgbGVmdC4gKi8KKwlpZiAoZXh0ID4gbmFtZSkKKwkJbS0+a21vZCA9ICFzdHJuY21wKGV4dCwgIi5rbyIsIDMpOworCisJaWYgKGFsbG9jX25hbWUpIHsKKwkJaWYgKG0tPmttb2QpIHsKKwkJCWlmIChhc3ByaW50ZigmbS0+bmFtZSwgIlslLipzXSIsIChpbnQpIChleHQgLSBuYW1lKSwgbmFtZSkgPT0gLTEpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0gZWxzZSB7CisJCQlpZiAoYXNwcmludGYoJm0tPm5hbWUsICIlcyIsIG5hbWUpID09IC0xKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJc3RyeGZyY2hhcihtLT5uYW1lLCAnLScsICdfJyk7CisJfQorCisJaWYgKGFsbG9jX2V4dCAmJiBtLT5jb21wKSB7CisJCW0tPmV4dCA9IHN0cmR1cChleHQgKyA0KTsKKwkJaWYgKCFtLT5leHQpIHsKKwkJCWZyZWUoKHZvaWQgKikgbS0+bmFtZSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKgogICogR2xvYmFsIGxpc3Qgb2Ygb3BlbiBEU09zIGFuZCB0aGUgY291bnRlci4KICAqLwogc3RhdGljIExJU1RfSEVBRChkc29fX2RhdGFfb3Blbik7CkBAIC0yNDAsNyArMjkxLDcgQEAKIAkJaWYgKGZkID49IDApCiAJCQlyZXR1cm4gZmQ7CiAKLQkJcHJfZGVidWcoImRzbyBvcGVuIGZhaWxlZCwgbW1hcDogJXNcbiIsCisJCXByX2RlYnVnKCJkc28gb3BlbiBmYWlsZWQ6ICVzXG4iLAogCQkJIHN0cmVycm9yX3IoZXJybm8sIHNidWYsIHNpemVvZihzYnVmKSkpOwogCQlpZiAoIWRzb19fZGF0YV9vcGVuX2NudCB8fCBlcnJubyAhPSBFTUZJTEUpCiAJCQlicmVhazsKQEAgLTEwMDIsMTkgKzEwNTMsMjIgQEAKIAlyZXR1cm4gZHNvX19maW5kX2J5X2xvbmduYW1lKCZkc29zLT5yb290LCBuYW1lKTsKIH0KIAorc3RydWN0IGRzbyAqZHNvc19fYWRkbmV3KHN0cnVjdCBkc29zICpkc29zLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkc28gKmRzbyA9IGRzb19fbmV3KG5hbWUpOworCisJaWYgKGRzbyAhPSBOVUxMKSB7CisJCWRzb3NfX2FkZChkc29zLCBkc28pOworCQlkc29fX3NldF9iYXNlbmFtZShkc28pOworCX0KKwlyZXR1cm4gZHNvOworfQorCiBzdHJ1Y3QgZHNvICpfX2Rzb3NfX2ZpbmRuZXcoc3RydWN0IGRzb3MgKmRzb3MsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IGRzbyAqZHNvID0gZHNvc19fZmluZChkc29zLCBuYW1lLCBmYWxzZSk7CiAKLQlpZiAoIWRzbykgewotCQlkc28gPSBkc29fX25ldyhuYW1lKTsKLQkJaWYgKGRzbyAhPSBOVUxMKSB7Ci0JCQlkc29zX19hZGQoZHNvcywgZHNvKTsKLQkJCWRzb19fc2V0X2Jhc2VuYW1lKGRzbyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gZHNvOworCXJldHVybiBkc28gPyBkc28gOiBkc29zX19hZGRuZXcoZHNvcywgbmFtZSk7CiB9CiAKIHNpemVfdCBfX2Rzb3NfX2ZwcmludGZfYnVpbGRpZChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBGSUxFICpmcCwKQEAgLTEwODMsMyArMTEzNywzNiBAQAogCiAJcmV0dXJuIGRzb19fdHlwZV9mZChmZCk7CiB9CisKK2ludCBkc29fX3N0cmVycm9yX2xvYWQoc3RydWN0IGRzbyAqZHNvLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCit7CisJaW50IGlkeCwgZXJybnVtID0gZHNvLT5sb2FkX2Vycm5vOworCS8qCisJICogVGhpcyBtdXN0IGhhdmUgYSBzYW1lIG9yZGVyaW5nIGFzIHRoZSBlbnVtIGRzb19sb2FkX2Vycm5vLgorCSAqLworCXN0YXRpYyBjb25zdCBjaGFyICpkc29fbG9hZF9fZXJyb3Jfc3RyW10gPSB7CisJIkludGVybmFsIHRvb2xzL3BlcmYvIGxpYnJhcnkgZXJyb3IiLAorCSJJbnZhbGlkIEVMRiBmaWxlIiwKKwkiQ2FuIG5vdCByZWFkIGJ1aWxkIGlkIiwKKwkiTWlzbWF0Y2hpbmcgYnVpbGQgaWQiLAorCSJEZWNvbXByZXNzaW9uIGZhaWx1cmUiLAorCX07CisKKwlCVUdfT04oYnVmbGVuID09IDApOworCisJaWYgKGVycm51bSA+PSAwKSB7CisJCWNvbnN0IGNoYXIgKmVyciA9IHN0cmVycm9yX3IoZXJybnVtLCBidWYsIGJ1Zmxlbik7CisKKwkJaWYgKGVyciAhPSBidWYpCisJCQlzY25wcmludGYoYnVmLCBidWZsZW4sICIlcyIsIGVycik7CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGVycm51bSA8ICBfX0RTT19MT0FEX0VSUk5PX19TVEFSVCB8fCBlcnJudW0gPj0gX19EU09fTE9BRF9FUlJOT19fRU5EKQorCQlyZXR1cm4gLTE7CisKKwlpZHggPSBlcnJudW0gLSBfX0RTT19MT0FEX0VSUk5PX19TVEFSVDsKKwlzY25wcmludGYoYnVmLCBidWZsZW4sICIlcyIsIGRzb19sb2FkX19lcnJvcl9zdHJbaWR4XSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZHNvLmggYi90b29scy9wZXJmL3V0aWwvZHNvLmgKaW5kZXggY2VkOTI4NC4uZTA5MDFiNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2Rzby5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9kc28uaApAQCAtNjAsNiArNjAsMzEgQEAKIAlEU09fX1RZUEVfWDMyQklULAogfTsKIAorZW51bSBkc29fbG9hZF9lcnJubyB7CisJRFNPX0xPQURfRVJSTk9fX1NVQ0NFU1MJCT0gMCwKKworCS8qCisJICogQ2hvb3NlIGFuIGFyYml0cmFyeSBuZWdhdGl2ZSBiaWcgbnVtYmVyIG5vdCB0byBjbGFzaCB3aXRoIHN0YW5kYXJkCisJICogZXJybm8gc2luY2UgU1VTIHJlcXVpcmVzIHRoZSBlcnJubyBoYXMgZGlzdGluY3QgcG9zaXRpdmUgdmFsdWVzLgorCSAqIFNlZSAnSXNzdWUgNicgaW4gdGhlIGxpbmsgYmVsb3cuCisJICoKKwkgKiBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS9iYXNlZGVmcy9lcnJuby5oLmh0bWwKKwkgKi8KKwlfX0RTT19MT0FEX0VSUk5PX19TVEFSVAkJPSAtMTAwMDAsCisKKwlEU09fTE9BRF9FUlJOT19fSU5URVJOQUxfRVJST1IJPSBfX0RTT19MT0FEX0VSUk5PX19TVEFSVCwKKworCS8qIGZvciBzeW1zcmNfX2luaXQoKSAqLworCURTT19MT0FEX0VSUk5PX19JTlZBTElEX0VMRiwKKwlEU09fTE9BRF9FUlJOT19fQ0FOTk9UX1JFQURfQlVJTERJRCwKKwlEU09fTE9BRF9FUlJOT19fTUlTTUFUQ0hJTkdfQlVJTERJRCwKKworCS8qIGZvciBkZWNvbXByZXNzX2ttb2R1bGUgKi8KKwlEU09fTE9BRF9FUlJOT19fREVDT01QUkVTU0lPTl9GQUlMVVJFLAorCisJX19EU09fTE9BRF9FUlJOT19fRU5ELAorfTsKKwogI2RlZmluZSBEU09fX1NXQVAoZHNvLCB0eXBlLCB2YWwpCQkJXAogKHsJCQkJCQkJXAogCXR5cGUgX19fX3IgPSB2YWw7CQkJCVwKQEAgLTExMyw2ICsxMzgsNyBAQAogCWVudW0gZHNvX3N3YXBfdHlwZQluZWVkc19zd2FwOwogCWVudW0gZHNvX2JpbmFyeV90eXBlCXN5bXRhYl90eXBlOwogCWVudW0gZHNvX2JpbmFyeV90eXBlCWJpbmFyeV90eXBlOworCWVudW0gZHNvX2xvYWRfZXJybm8JbG9hZF9lcnJubzsKIAl1OAkJIGFkanVzdF9zeW1ib2xzOjE7CiAJdTgJCSBoYXNfYnVpbGRfaWQ6MTsKIAl1OAkJIGhhc19zcmNsaW5lOjE7CkBAIC0xMzksNyArMTY1LDggQEAKIAkJdTMyCQkgc3RhdHVzX3NlZW47CiAJCXNpemVfdAkJIGZpbGVfc2l6ZTsKIAkJc3RydWN0IGxpc3RfaGVhZCBvcGVuX2VudHJ5OwotCQl1NjQJCSBmcmFtZV9vZmZzZXQ7CisJCXU2NAkJIGRlYnVnX2ZyYW1lX29mZnNldDsKKwkJdTY0CQkgZWhfZnJhbWVfaGRyX29mZnNldDsKIAl9IGRhdGE7CiAKIAl1bmlvbiB7IC8qIFRvb2wgc3BlY2lmaWMgYXJlYSAqLwpAQCAtMTg5LDExICsyMTYsMjQgQEAKIGludCBkc29fX3JlYWRfYmluYXJ5X3R5cGVfZmlsZW5hbWUoY29uc3Qgc3RydWN0IGRzbyAqZHNvLCBlbnVtIGRzb19iaW5hcnlfdHlwZSB0eXBlLAogCQkJCSAgIGNoYXIgKnJvb3RfZGlyLCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90IHNpemUpOwogYm9vbCBpc19zdXBwb3J0ZWRfY29tcHJlc3Npb24oY29uc3QgY2hhciAqZXh0KTsKLWJvb2wgaXNfa21vZHVsZV9leHRlbnNpb24oY29uc3QgY2hhciAqZXh0KTsKLWJvb2wgaXNfa2VybmVsX21vZHVsZShjb25zdCBjaGFyICpwYXRobmFtZSwgYm9vbCAqY29tcHJlc3NlZCk7Citib29sIGlzX2tlcm5lbF9tb2R1bGUoY29uc3QgY2hhciAqcGF0aG5hbWUpOwogYm9vbCBkZWNvbXByZXNzX3RvX2ZpbGUoY29uc3QgY2hhciAqZXh0LCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IG91dHB1dF9mZCk7CiBib29sIGRzb19fbmVlZHNfZGVjb21wcmVzcyhzdHJ1Y3QgZHNvICpkc28pOwogCitzdHJ1Y3Qga21vZF9wYXRoIHsKKwljaGFyICpuYW1lOworCWNoYXIgKmV4dDsKKwlib29sICBjb21wOworCWJvb2wgIGttb2Q7Cit9OworCitpbnQgX19rbW9kX3BhdGhfX3BhcnNlKHN0cnVjdCBrbW9kX3BhdGggKm0sIGNvbnN0IGNoYXIgKnBhdGgsCisJCSAgICAgYm9vbCBhbGxvY19uYW1lLCBib29sIGFsbG9jX2V4dCk7CisKKyNkZWZpbmUga21vZF9wYXRoX19wYXJzZShfX20sIF9fcCkgICAgICBfX2ttb2RfcGF0aF9fcGFyc2UoX19tLCBfX3AsIGZhbHNlLCBmYWxzZSkKKyNkZWZpbmUga21vZF9wYXRoX19wYXJzZV9uYW1lKF9fbSwgX19wKSBfX2ttb2RfcGF0aF9fcGFyc2UoX19tLCBfX3AsIHRydWUgLCBmYWxzZSkKKyNkZWZpbmUga21vZF9wYXRoX19wYXJzZV9leHQoX19tLCBfX3ApICBfX2ttb2RfcGF0aF9fcGFyc2UoX19tLCBfX3AsIGZhbHNlLCB0cnVlKQorCiAvKgogICogVGhlIGRzb19fZGF0YV8qIGV4dGVybmFsIGludGVyZmFjZSBwcm92aWRlcyBmb2xsb3dpbmcgZnVuY3Rpb25zOgogICogICBkc29fX2RhdGFfZmQKQEAgLTI0OSw2ICsyODksNyBAQAogCQkJCWNvbnN0IGNoYXIgKnNob3J0X25hbWUsIGludCBkc29fdHlwZSk7CiAKIHZvaWQgZHNvc19fYWRkKHN0cnVjdCBkc29zICpkc29zLCBzdHJ1Y3QgZHNvICpkc28pOworc3RydWN0IGRzbyAqZHNvc19fYWRkbmV3KHN0cnVjdCBkc29zICpkc29zLCBjb25zdCBjaGFyICpuYW1lKTsKIHN0cnVjdCBkc28gKmRzb3NfX2ZpbmQoY29uc3Qgc3RydWN0IGRzb3MgKmRzb3MsIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICAgICBib29sIGNtcF9zaG9ydCk7CiBzdHJ1Y3QgZHNvICpfX2Rzb3NfX2ZpbmRuZXcoc3RydWN0IGRzb3MgKmRzb3MsIGNvbnN0IGNoYXIgKm5hbWUpOwpAQCAtMjc5LDQgKzMyMCw2IEBACiAKIGVudW0gZHNvX3R5cGUgZHNvX190eXBlKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOwogCitpbnQgZHNvX19zdHJlcnJvcl9sb2FkKHN0cnVjdCBkc28gKmRzbywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKTsKKwogI2VuZGlmIC8qIF9fUEVSRl9EU08gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguYyBiL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguYwppbmRleCBjYzY2YzQwLi5jMzRlMDI0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2R3YXJmLWF1eC5jCkBAIC0yNzgsNiArMjc4LDIxIEBACiB9CiAKIC8qKgorICogZGllX2lzX2Z1bmNfaW5zdGFuY2UgLSBFbnN1cmUgdGhhdCB0aGlzIERJRSBpcyBhbiBpbnN0YW5jZSBvZiBhIHN1YnByb2dyYW0KKyAqIEBkd19kaWU6IGEgRElFCisgKgorICogRW5zdXJlIHRoYXQgdGhpcyBESUUgaXMgYW4gaW5zdGFuY2UgKHdoaWNoIGhhcyBhbiBlbnRyeSBhZGRyZXNzKS4KKyAqIFRoaXMgcmV0dXJucyB0cnVlIGlmIEBkd19kaWUgaXMgYSBmdW5jdGlvbiBpbnN0YW5jZS4gSWYgbm90LCB5b3UgbmVlZCB0bworICogY2FsbCBkaWVfd2Fsa19pbnN0YW5jZXMoKSB0byBmaW5kIGFjdHVhbCBpbnN0YW5jZXMuCisgKiovCitib29sIGRpZV9pc19mdW5jX2luc3RhbmNlKER3YXJmX0RpZSAqZHdfZGllKQoreworCUR3YXJmX0FkZHIgdG1wOworCisJLyogQWN0dWFsbHkgZ2NjIG9wdGltaXplcyBub24taW5saW5lIGFzIGxpa2UgYXMgaW5saW5lZCAqLworCXJldHVybiAhZHdhcmZfZnVuY19pbmxpbmUoZHdfZGllKSAmJiBkd2FyZl9lbnRyeXBjKGR3X2RpZSwgJnRtcCkgPT0gMDsKK30KKy8qKgogICogZGllX2dldF9kYXRhX21lbWJlcl9sb2NhdGlvbiAtIEdldCB0aGUgZGF0YS1tZW1iZXIgb2Zmc2V0CiAgKiBAbWJfZGllOiBhIERJRSBvZiBhIG1lbWJlciBvZiBhIGRhdGEgc3RydWN0dXJlCiAgKiBAb2ZmczogVGhlIG9mZnNldCBvZiB0aGUgbWVtYmVyIGluIHRoZSBkYXRhIHN0cnVjdHVyZQpAQCAtNzg2LDEwICs4MDEsMTYgQEAKIHsKIAljb25zdCBjaGFyICpuYW1lID0gZGF0YTsKIAotCWlmICgoZHdhcmZfdGFnKGRpZV9tZW0pID09IERXX1RBR19tZW1iZXIpICYmCi0JICAgIGRpZV9jb21wYXJlX25hbWUoZGllX21lbSwgbmFtZSkpCi0JCXJldHVybiBESUVfRklORF9DQl9FTkQ7Ci0KKwlpZiAoZHdhcmZfdGFnKGRpZV9tZW0pID09IERXX1RBR19tZW1iZXIpIHsKKwkJaWYgKGRpZV9jb21wYXJlX25hbWUoZGllX21lbSwgbmFtZSkpCisJCQlyZXR1cm4gRElFX0ZJTkRfQ0JfRU5EOworCQllbHNlIGlmICghZHdhcmZfZGllbmFtZShkaWVfbWVtKSkgewkvKiBVbm5hbWVkIHN0cnVjdHVyZSAqLworCQkJRHdhcmZfRGllIHR5cGVfZGllLCB0bXBfZGllOworCQkJaWYgKGRpZV9nZXRfdHlwZShkaWVfbWVtLCAmdHlwZV9kaWUpICYmCisJCQkgICAgZGllX2ZpbmRfbWVtYmVyKCZ0eXBlX2RpZSwgbmFtZSwgJnRtcF9kaWUpKQorCQkJCXJldHVybiBESUVfRklORF9DQl9FTkQ7CisJCX0KKwl9CiAJcmV0dXJuIERJRV9GSU5EX0NCX1NJQkxJTkc7CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguaCBiL3Rvb2xzL3BlcmYvdXRpbC9kd2FyZi1hdXguaAppbmRleCBiNGZlOTBjLi5hZjdkYmNkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZHdhcmYtYXV4LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2R3YXJmLWF1eC5oCkBAIC00MSw2ICs0MSw5IEBACiAvKiBFbnN1cmUgdGhhdCB0aGlzIERJRSBpcyBhIHN1YnByb2dyYW0gYW5kIGRlZmluaXRpb24gKG5vdCBkZWNsYXJhdGlvbikgKi8KIGV4dGVybiBib29sIGRpZV9pc19mdW5jX2RlZihEd2FyZl9EaWUgKmR3X2RpZSk7CiAKKy8qIEVuc3VyZSB0aGF0IHRoaXMgRElFIGlzIGFuIGluc3RhbmNlIG9mIGEgc3VicHJvZ3JhbSAqLworZXh0ZXJuIGJvb2wgZGllX2lzX2Z1bmNfaW5zdGFuY2UoRHdhcmZfRGllICpkd19kaWUpOworCiAvKiBDb21wYXJlIGRpZW5hbWUgYW5kIHRuYW1lICovCiBleHRlcm4gYm9vbCBkaWVfY29tcGFyZV9uYW1lKER3YXJmX0RpZSAqZHdfZGllLCBjb25zdCBjaGFyICp0bmFtZSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKaW5kZXggNmM2ZDA0NC4uZmY4NjZjNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKQEAgLTQ5LDcyICs0OSwxMDMgQEAKIAkucGVyaW9kCSAgID0gMSwKIH07CiAKLXN0YXRpYyBwaWRfdCBwZXJmX2V2ZW50X19nZXRfY29tbV90Z2lkKHBpZF90IHBpZCwgY2hhciAqY29tbSwgc2l6ZV90IGxlbikKKy8qCisgKiBBc3N1bWVzIHRoYXQgdGhlIGZpcnN0IDQwOTUgYnl0ZXMgb2YgL3Byb2MvcGlkL3N0YXQgY29udGFpbnMKKyAqIHRoZSBjb21tLCB0Z2lkIGFuZCBwcGlkLgorICovCitzdGF0aWMgaW50IHBlcmZfZXZlbnRfX2dldF9jb21tX2lkcyhwaWRfdCBwaWQsIGNoYXIgKmNvbW0sIHNpemVfdCBsZW4sCisJCQkJICAgIHBpZF90ICp0Z2lkLCBwaWRfdCAqcHBpZCkKIHsKIAljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKLQljaGFyIGJmW0JVRlNJWl07Ci0JRklMRSAqZnA7Ci0Jc2l6ZV90IHNpemUgPSAwOwotCXBpZF90IHRnaWQgPSAtMTsKKwljaGFyIGJmWzQwOTZdOworCWludCBmZDsKKwlzaXplX3Qgc2l6ZSA9IDAsIG47CisJY2hhciAqbmwsICpuYW1lLCAqdGdpZHMsICpwcGlkczsKKworCSp0Z2lkID0gLTE7CisJKnBwaWQgPSAtMTsKIAogCXNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiL3Byb2MvJWQvc3RhdHVzIiwgcGlkKTsKIAotCWZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7Ci0JaWYgKGZwID09IE5VTEwpIHsKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CiAJCXByX2RlYnVnKCJjb3VsZG4ndCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gLTE7CiAJfQogCi0Jd2hpbGUgKCFjb21tWzBdIHx8ICh0Z2lkIDwgMCkpIHsKLQkJaWYgKGZnZXRzKGJmLCBzaXplb2YoYmYpLCBmcCkgPT0gTlVMTCkgewotCQkJcHJfd2FybmluZygiY291bGRuJ3QgZ2V0IENPTU0gYW5kIHBnaWQsIG1hbGZvcm1lZCAlc1xuIiwKLQkJCQkgICBmaWxlbmFtZSk7Ci0JCQlicmVhazsKLQkJfQorCW4gPSByZWFkKGZkLCBiZiwgc2l6ZW9mKGJmKSAtIDEpOworCWNsb3NlKGZkKTsKKwlpZiAobiA8PSAwKSB7CisJCXByX3dhcm5pbmcoIkNvdWxkbid0IGdldCBDT01NLCB0aWdkIGFuZCBwcGlkIGZvciBwaWQgJWRcbiIsCisJCQkgICBwaWQpOworCQlyZXR1cm4gLTE7CisJfQorCWJmW25dID0gJ1wwJzsKIAotCQlpZiAobWVtY21wKGJmLCAiTmFtZToiLCA1KSA9PSAwKSB7Ci0JCQljaGFyICpuYW1lID0gYmYgKyA1OwotCQkJd2hpbGUgKCpuYW1lICYmIGlzc3BhY2UoKm5hbWUpKQotCQkJCSsrbmFtZTsKLQkJCXNpemUgPSBzdHJsZW4obmFtZSkgLSAxOwotCQkJaWYgKHNpemUgPj0gbGVuKQotCQkJCXNpemUgPSBsZW4gLSAxOwotCQkJbWVtY3B5KGNvbW0sIG5hbWUsIHNpemUpOwotCQkJY29tbVtzaXplXSA9ICdcMCc7CisJbmFtZSA9IHN0cnN0cihiZiwgIk5hbWU6Iik7CisJdGdpZHMgPSBzdHJzdHIoYmYsICJUZ2lkOiIpOworCXBwaWRzID0gc3Ryc3RyKGJmLCAiUFBpZDoiKTsKIAotCQl9IGVsc2UgaWYgKG1lbWNtcChiZiwgIlRnaWQ6IiwgNSkgPT0gMCkgewotCQkJY2hhciAqdGdpZHMgPSBiZiArIDU7Ci0JCQl3aGlsZSAoKnRnaWRzICYmIGlzc3BhY2UoKnRnaWRzKSkKLQkJCQkrK3RnaWRzOwotCQkJdGdpZCA9IGF0b2kodGdpZHMpOwotCQl9CisJaWYgKG5hbWUpIHsKKwkJbmFtZSArPSA1OyAgLyogc3RybGVuKCJOYW1lOiIpICovCisKKwkJd2hpbGUgKCpuYW1lICYmIGlzc3BhY2UoKm5hbWUpKQorCQkJKytuYW1lOworCisJCW5sID0gc3RyY2hyKG5hbWUsICdcbicpOworCQlpZiAobmwpCisJCQkqbmwgPSAnXDAnOworCisJCXNpemUgPSBzdHJsZW4obmFtZSk7CisJCWlmIChzaXplID49IGxlbikKKwkJCXNpemUgPSBsZW4gLSAxOworCQltZW1jcHkoY29tbSwgbmFtZSwgc2l6ZSk7CisJCWNvbW1bc2l6ZV0gPSAnXDAnOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJOYW1lOiBzdHJpbmcgbm90IGZvdW5kIGZvciBwaWQgJWRcbiIsIHBpZCk7CiAJfQogCi0JZmNsb3NlKGZwKTsKKwlpZiAodGdpZHMpIHsKKwkJdGdpZHMgKz0gNTsgIC8qIHN0cmxlbigiVGdpZDoiKSAqLworCQkqdGdpZCA9IGF0b2kodGdpZHMpOworCX0gZWxzZSB7CisJCXByX2RlYnVnKCJUZ2lkOiBzdHJpbmcgbm90IGZvdW5kIGZvciBwaWQgJWRcbiIsIHBpZCk7CisJfQogCi0JcmV0dXJuIHRnaWQ7CisJaWYgKHBwaWRzKSB7CisJCXBwaWRzICs9IDU7ICAvKiBzdHJsZW4oIlBQaWQ6IikgKi8KKwkJKnBwaWQgPSBhdG9pKHBwaWRzKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiUFBpZDogc3RyaW5nIG5vdCBmb3VuZCBmb3IgcGlkICVkXG4iLCBwaWQpOworCX0KKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgcGlkX3QgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9jb21tKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCi0JCQkJCSB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgcGlkX3QgcGlkLAotCQkJCQkgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCi0JCQkJCSBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKK3N0YXRpYyBpbnQgcGVyZl9ldmVudF9fcHJlcGFyZV9jb21tKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCBwaWRfdCBwaWQsCisJCQkJICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAorCQkJCSAgICBwaWRfdCAqdGdpZCwgcGlkX3QgKnBwaWQpCiB7CiAJc2l6ZV90IHNpemU7Ci0JcGlkX3QgdGdpZDsKKworCSpwcGlkID0gLTE7CiAKIAltZW1zZXQoJmV2ZW50LT5jb21tLCAwLCBzaXplb2YoZXZlbnQtPmNvbW0pKTsKIAotCWlmIChtYWNoaW5lX19pc19ob3N0KG1hY2hpbmUpKQotCQl0Z2lkID0gcGVyZl9ldmVudF9fZ2V0X2NvbW1fdGdpZChwaWQsIGV2ZW50LT5jb21tLmNvbW0sCi0JCQkJCQkgc2l6ZW9mKGV2ZW50LT5jb21tLmNvbW0pKTsKLQllbHNlCi0JCXRnaWQgPSBtYWNoaW5lLT5waWQ7CisJaWYgKG1hY2hpbmVfX2lzX2hvc3QobWFjaGluZSkpIHsKKwkJaWYgKHBlcmZfZXZlbnRfX2dldF9jb21tX2lkcyhwaWQsIGV2ZW50LT5jb21tLmNvbW0sCisJCQkJCSAgICAgc2l6ZW9mKGV2ZW50LT5jb21tLmNvbW0pLAorCQkJCQkgICAgIHRnaWQsIHBwaWQpICE9IDApIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZSB7CisJCSp0Z2lkID0gbWFjaGluZS0+cGlkOworCX0KIAotCWlmICh0Z2lkIDwgMCkKLQkJZ290byBvdXQ7CisJaWYgKCp0Z2lkIDwgMCkKKwkJcmV0dXJuIC0xOwogCi0JZXZlbnQtPmNvbW0ucGlkID0gdGdpZDsKKwlldmVudC0+Y29tbS5waWQgPSAqdGdpZDsKIAlldmVudC0+Y29tbS5oZWFkZXIudHlwZSA9IFBFUkZfUkVDT1JEX0NPTU07CiAKIAlzaXplID0gc3RybGVuKGV2ZW50LT5jb21tLmNvbW0pICsgMTsKQEAgLTEyNSwyMyArMTU2LDQ1IEBACiAJCQkJbWFjaGluZS0+aWRfaGRyX3NpemUpOwogCWV2ZW50LT5jb21tLnRpZCA9IHBpZDsKIAorCXJldHVybiAwOworfQorCitzdGF0aWMgcGlkX3QgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9jb21tKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJCSB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgcGlkX3QgcGlkLAorCQkJCQkgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCisJCQkJCSBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKK3sKKwlwaWRfdCB0Z2lkLCBwcGlkOworCisJaWYgKHBlcmZfZXZlbnRfX3ByZXBhcmVfY29tbShldmVudCwgcGlkLCBtYWNoaW5lLCAmdGdpZCwgJnBwaWQpICE9IDApCisJCXJldHVybiAtMTsKKwogCWlmIChwcm9jZXNzKHRvb2wsIGV2ZW50LCAmc3ludGhfc2FtcGxlLCBtYWNoaW5lKSAhPSAwKQogCQlyZXR1cm4gLTE7CiAKLW91dDoKIAlyZXR1cm4gdGdpZDsKIH0KIAogc3RhdGljIGludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX2Zvcmsoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKLQkJCQkgICAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIHBpZF90IHBpZCwKLQkJCQkgICAgICAgcGlkX3QgdGdpZCwgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCisJCQkJICAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJCSAgICAgICBwaWRfdCBwaWQsIHBpZF90IHRnaWQsIHBpZF90IHBwaWQsCisJCQkJICAgICAgIHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAogCQkJCSAgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKIAltZW1zZXQoJmV2ZW50LT5mb3JrLCAwLCBzaXplb2YoZXZlbnQtPmZvcmspICsgbWFjaGluZS0+aWRfaGRyX3NpemUpOwogCi0JLyogdGhpcyBpcyByZWFsbHkgYSBjbG9uZSBldmVudCBidXQgd2UgdXNlIGZvcmsgdG8gc3ludGhlc2l6ZSBpdCAqLwotCWV2ZW50LT5mb3JrLnBwaWQgPSB0Z2lkOwotCWV2ZW50LT5mb3JrLnB0aWQgPSB0Z2lkOworCS8qCisJICogZm9yIG1haW4gdGhyZWFkIHNldCBwYXJlbnQgdG8gcHBpZCBmcm9tIHN0YXR1cyBmaWxlLiBGb3Igb3RoZXIKKwkgKiB0aHJlYWRzIHNldCBwYXJlbnQgcGlkIHRvIG1haW4gdGhyZWFkLiBpZS4sIGFzc3VtZSBtYWluIHRocmVhZAorCSAqIHNwYXducyBhbGwgdGhyZWFkcyBpbiBhIHByb2Nlc3MKKwkqLworCWlmICh0Z2lkID09IHBpZCkgeworCQlldmVudC0+Zm9yay5wcGlkID0gcHBpZDsKKwkJZXZlbnQtPmZvcmsucHRpZCA9IHBwaWQ7CisJfSBlbHNlIHsKKwkJZXZlbnQtPmZvcmsucHBpZCA9IHRnaWQ7CisJCWV2ZW50LT5mb3JrLnB0aWQgPSB0Z2lkOworCX0KIAlldmVudC0+Zm9yay5waWQgID0gdGdpZDsKIAlldmVudC0+Zm9yay50aWQgID0gcGlkOwogCWV2ZW50LT5mb3JrLmhlYWRlci50eXBlID0gUEVSRl9SRUNPUkRfRk9SSzsKQEAgLTMzMyw3ICszODYsOCBAQAogCWNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOwogCURJUiAqdGFza3M7CiAJc3RydWN0IGRpcmVudCBkaXJlbnQsICpuZXh0OwotCXBpZF90IHRnaWQ7CisJcGlkX3QgdGdpZCwgcHBpZDsKKwlpbnQgcmMgPSAwOwogCiAJLyogc3BlY2lhbCBjYXNlOiBvbmx5IHNlbmQgb25lIGNvbW0gZXZlbnQgdXNpbmcgcGFzc2VkIGluIHBpZCAqLwogCWlmICghZnVsbCkgewpAQCAtMzYxLDM0ICs0MTUsMzggQEAKIAogCXdoaWxlICghcmVhZGRpcl9yKHRhc2tzLCAmZGlyZW50LCAmbmV4dCkgJiYgbmV4dCkgewogCQljaGFyICplbmQ7Ci0JCWludCByYyA9IDA7CiAJCXBpZF90IF9waWQ7CiAKIAkJX3BpZCA9IHN0cnRvbChkaXJlbnQuZF9uYW1lLCAmZW5kLCAxMCk7CiAJCWlmICgqZW5kKQogCQkJY29udGludWU7CiAKLQkJdGdpZCA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfY29tbSh0b29sLCBjb21tX2V2ZW50LCBfcGlkLAotCQkJCQkJICAgcHJvY2VzcywgbWFjaGluZSk7Ci0JCWlmICh0Z2lkID09IC0xKQotCQkJcmV0dXJuIC0xOworCQlyYyA9IC0xOworCQlpZiAocGVyZl9ldmVudF9fcHJlcGFyZV9jb21tKGNvbW1fZXZlbnQsIF9waWQsIG1hY2hpbmUsCisJCQkJCSAgICAgJnRnaWQsICZwcGlkKSAhPSAwKQorCQkJYnJlYWs7CiAKKwkJaWYgKHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfZm9yayh0b29sLCBmb3JrX2V2ZW50LCBfcGlkLCB0Z2lkLAorCQkJCQkJcHBpZCwgcHJvY2VzcywgbWFjaGluZSkgPCAwKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIFNlbmQgdGhlIHByZXBhcmVkIGNvbW0gZXZlbnQKKwkJICovCisJCWlmIChwcm9jZXNzKHRvb2wsIGNvbW1fZXZlbnQsICZzeW50aF9zYW1wbGUsIG1hY2hpbmUpICE9IDApCisJCQlicmVhazsKKworCQlyYyA9IDA7CiAJCWlmIChfcGlkID09IHBpZCkgewogCQkJLyogcHJvY2VzcyB0aGUgcGFyZW50J3MgbWFwcyB0b28gKi8KIAkJCXJjID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tbWFwX2V2ZW50cyh0b29sLCBtbWFwX2V2ZW50LCBwaWQsIHRnaWQsCiAJCQkJCQlwcm9jZXNzLCBtYWNoaW5lLCBtbWFwX2RhdGEpOwotCQl9IGVsc2UgewotCQkJLyogb25seSBmb3JrIHRoZSB0aWQncyBtYXAsIHRvIHNhdmUgdGltZSAqLwotCQkJcmMgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2ZvcmsodG9vbCwgZm9ya19ldmVudCwgX3BpZCwgdGdpZCwKLQkJCQkJCSBwcm9jZXNzLCBtYWNoaW5lKTsKKwkJCWlmIChyYykKKwkJCQlicmVhazsKIAkJfQotCi0JCWlmIChyYykKLQkJCXJldHVybiByYzsKIAl9CiAKIAljbG9zZWRpcih0YXNrcyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJjOwogfQogCiBpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRfbWFwKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCkBAIC02MTUsNyArNjczLDcgQEAKIAllbHNlCiAJCXMgPSAiIjsKIAotCXJldHVybiBmcHJpbnRmKGZwLCAiJXM6ICVzOiVkXG4iLCBzLCBldmVudC0+Y29tbS5jb21tLCBldmVudC0+Y29tbS50aWQpOworCXJldHVybiBmcHJpbnRmKGZwLCAiJXM6ICVzOiVkLyVkXG4iLCBzLCBldmVudC0+Y29tbS5jb21tLCBldmVudC0+Y29tbS5waWQsIGV2ZW50LT5jb21tLnRpZCk7CiB9CiAKIGludCBwZXJmX2V2ZW50X19wcm9jZXNzX2NvbW0oc3RydWN0IHBlcmZfdG9vbCAqdG9vbCBfX21heWJlX3VudXNlZCwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKaW5kZXggYzRmZmUyYi4uMDliOWU4ZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmgKQEAgLTI0Miw3ICsyNDIsNiBAQAogCXUzMiBucl9pbnZhbGlkX2NoYWluczsKIAl1MzIgbnJfdW5rbm93bl9pZDsKIAl1MzIgbnJfdW5wcm9jZXNzYWJsZV9zYW1wbGVzOwotCXUzMiBucl91bm9yZGVyZWRfZXZlbnRzOwogfTsKIAogc3RydWN0IGF0dHJfZXZlbnQgewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jCmluZGV4IDI4YjhjZTguLjA4MGJlOTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYworKysgYi90b29scy9wZXJmL3V0aWwvZXZsaXN0LmMKQEAgLTcsNyArNyw2IEBACiAgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMIHYyLiAoYW5kIG9ubHkgdjIsIG5vdCBhbnkgbGF0ZXIgdmVyc2lvbikKICAqLwogI2luY2x1ZGUgInV0aWwuaCIKLSNpbmNsdWRlIDxhcGkvZnMvZGVidWdmcy5oPgogI2luY2x1ZGUgPGFwaS9mcy9mcy5oPgogI2luY2x1ZGUgPHBvbGwuaD4KICNpbmNsdWRlICJjcHVtYXAuaCIKQEAgLTYzNSw4ICs2MzQsOCBAQAogdW5pb24gcGVyZl9ldmVudCAqcGVyZl9ldmxpc3RfX21tYXBfcmVhZChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgaW50IGlkeCkKIHsKIAlzdHJ1Y3QgcGVyZl9tbWFwICptZCA9ICZldmxpc3QtPm1tYXBbaWR4XTsKLQl1bnNpZ25lZCBpbnQgaGVhZCA9IHBlcmZfbW1hcF9fcmVhZF9oZWFkKG1kKTsKLQl1bnNpZ25lZCBpbnQgb2xkID0gbWQtPnByZXY7CisJdTY0IGhlYWQgPSBwZXJmX21tYXBfX3JlYWRfaGVhZChtZCk7CisJdTY0IG9sZCA9IG1kLT5wcmV2OwogCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBtZC0+YmFzZSArIHBhZ2Vfc2l6ZTsKIAl1bmlvbiBwZXJmX2V2ZW50ICpldmVudCA9IE5VTEw7CiAKQEAgLTY5Niw3ICs2OTUsNyBAQAogCiBzdGF0aWMgYm9vbCBwZXJmX21tYXBfX2VtcHR5KHN0cnVjdCBwZXJmX21tYXAgKm1kKQogewotCXJldHVybiBwZXJmX21tYXBfX3JlYWRfaGVhZChtZCkgIT0gbWQtPnByZXY7CisJcmV0dXJuIHBlcmZfbW1hcF9fcmVhZF9oZWFkKG1kKSA9PSBtZC0+cHJldjsKIH0KIAogc3RhdGljIHZvaWQgcGVyZl9ldmxpc3RfX21tYXBfZ2V0KHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBpbnQgaWR4KQpAQCAtNzE3LDcgKzcxNiw3IEBACiAJc3RydWN0IHBlcmZfbW1hcCAqbWQgPSAmZXZsaXN0LT5tbWFwW2lkeF07CiAKIAlpZiAoIWV2bGlzdC0+b3ZlcndyaXRlKSB7Ci0JCXVuc2lnbmVkIGludCBvbGQgPSBtZC0+cHJldjsKKwkJdTY0IG9sZCA9IG1kLT5wcmV2OwogCiAJCXBlcmZfbW1hcF9fd3JpdGVfdGFpbChtZCwgb2xkKTsKIAl9CkBAIC0xMDUxLDcgKzEwNTAsNyBAQAogCXJldHVybiAtMTsKIH0KIAotaW50IHBlcmZfZXZsaXN0X19hcHBseV9maWx0ZXJzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoraW50IHBlcmZfZXZsaXN0X19hcHBseV9maWx0ZXJzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqKmVycl9ldnNlbCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CiAJaW50IGVyciA9IDA7CkBAIC0xMDYzLDggKzEwNjIsMTAgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWVyciA9IHBlcmZfZXZzZWxfX3NldF9maWx0ZXIoZXZzZWwsIG5jcHVzLCBudGhyZWFkcywgZXZzZWwtPmZpbHRlcik7Ci0JCWlmIChlcnIpCisJCWlmIChlcnIpIHsKKwkJCSplcnJfZXZzZWwgPSBldnNlbDsKIAkJCWJyZWFrOworCQl9CiAJfQogCiAJcmV0dXJuIGVycjsKQEAgLTEwODYsNiArMTA4NywzOCBAQAogCXJldHVybiBlcnI7CiB9CiAKK2ludCBwZXJmX2V2bGlzdF9fc2V0X2ZpbHRlcl9waWRzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBzaXplX3QgbnBpZHMsIHBpZF90ICpwaWRzKQoreworCWNoYXIgKmZpbHRlcjsKKwlpbnQgcmV0ID0gLTE7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnBpZHM7ICsraSkgeworCQlpZiAoaSA9PSAwKSB7CisJCQlpZiAoYXNwcmludGYoJmZpbHRlciwgImNvbW1vbl9waWQgIT0gJWQiLCBwaWRzW2ldKSA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJY2hhciAqdG1wOworCisJCQlpZiAoYXNwcmludGYoJnRtcCwgIiVzICYmIGNvbW1vbl9waWQgIT0gJWQiLCBmaWx0ZXIsIHBpZHNbaV0pIDwgMCkKKwkJCQlnb3RvIG91dF9mcmVlOworCisJCQlmcmVlKGZpbHRlcik7CisJCQlmaWx0ZXIgPSB0bXA7CisJCX0KKwl9CisKKwlyZXQgPSBwZXJmX2V2bGlzdF9fc2V0X2ZpbHRlcihldmxpc3QsIGZpbHRlcik7CitvdXRfZnJlZToKKwlmcmVlKGZpbHRlcik7CisJcmV0dXJuIHJldDsKK30KKworaW50IHBlcmZfZXZsaXN0X19zZXRfZmlsdGVyX3BpZChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgcGlkX3QgcGlkKQoreworCXJldHVybiBwZXJmX2V2bGlzdF9fc2V0X2ZpbHRlcl9waWRzKGV2bGlzdCwgMSwgJnBpZCk7Cit9CisKIGJvb2wgcGVyZl9ldmxpc3RfX3ZhbGlkX3NhbXBsZV90eXBlKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQogewogCXN0cnVjdCBwZXJmX2V2c2VsICpwb3M7CkBAIC0xMzI5LDcgKzEzNjIsNyBAQAogCQkgKiB3cml0aW5nIGV4YWN0bHkgb25lIGJ5dGUsIGluIHdvcmtsb2FkLmNvcmtfZmQsIHVzdWFsbHkgdmlhCiAJCSAqIHBlcmZfZXZsaXN0X19zdGFydF93b3JrbG9hZCgpLgogCQkgKgotCQkgKiBGb3IgY2FuY2VsbGluZyB0aGUgd29ya2xvYWQgd2l0aG91dCBhY3R1YWxsaW4gcnVubmluZyBpdCwKKwkJICogRm9yIGNhbmNlbGxpbmcgdGhlIHdvcmtsb2FkIHdpdGhvdXQgYWN0dWFsbHkgcnVubmluZyBpdCwKIAkJICogdGhlIHBhcmVudCB3aWxsIGp1c3QgY2xvc2Ugd29ya2xvYWQuY29ya19mZCwgd2l0aG91dCB3cml0aW5nCiAJCSAqIGFueXRoaW5nLCBpLmUuIHJlYWQgd2lsbCByZXR1cm4gemVybyBhbmQgd2UganVzdCBleGl0KCkKIAkJICogaGVyZS4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuaAppbmRleCBlOTlhNjc2Li5iNWNjZTk1IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5oCkBAIC0yNyw3ICsyNyw3IEBACiAJdm9pZAkJICpiYXNlOwogCWludAkJIG1hc2s7CiAJaW50CQkgcmVmY250OwotCXVuc2lnbmVkIGludAkgcHJldjsKKwl1NjQJCSBwcmV2OwogCWNoYXIJCSBldmVudF9jb3B5W1BFUkZfU0FNUExFX01BWF9TSVpFXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDgpKSk7CiB9OwogCkBAIC01MSw2ICs1MSw3IEBACiAJc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHM7CiAJc3RydWN0IGNwdV9tYXAJICAqY3B1czsKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAqc2VsZWN0ZWQ7CisJc3RydWN0IGV2ZW50c19zdGF0cyBzdGF0czsKIH07CiAKIHN0cnVjdCBwZXJmX2V2c2VsX3N0cl9oYW5kbGVyIHsKQEAgLTc3LDYgKzc4LDggQEAKIAkJCSAgIGNvbnN0IGNoYXIgKnN5cywgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqaGFuZGxlcik7CiAKIGludCBwZXJmX2V2bGlzdF9fc2V0X2ZpbHRlcihzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgY29uc3QgY2hhciAqZmlsdGVyKTsKK2ludCBwZXJmX2V2bGlzdF9fc2V0X2ZpbHRlcl9waWQoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsIHBpZF90IHBpZCk7CitpbnQgcGVyZl9ldmxpc3RfX3NldF9maWx0ZXJfcGlkcyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgc2l6ZV90IG5waWRzLCBwaWRfdCAqcGlkcyk7CiAKIHN0cnVjdCBwZXJmX2V2c2VsICoKIHBlcmZfZXZsaXN0X19maW5kX3RyYWNlcG9pbnRfYnlfaWQoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsIGludCBpZCk7CkBAIC0xNDksNyArMTUyLDcgQEAKIH0KIAogaW50IHBlcmZfZXZsaXN0X19jcmVhdGVfbWFwcyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgc3RydWN0IHRhcmdldCAqdGFyZ2V0KTsKLWludCBwZXJmX2V2bGlzdF9fYXBwbHlfZmlsdGVycyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CitpbnQgcGVyZl9ldmxpc3RfX2FwcGx5X2ZpbHRlcnMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsIHN0cnVjdCBwZXJmX2V2c2VsICoqZXJyX2V2c2VsKTsKIAogdm9pZCBfX3BlcmZfZXZsaXN0X19zZXRfbGVhZGVyKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QpOwogdm9pZCBwZXJmX2V2bGlzdF9fc2V0X2xlYWRlcihzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CkBAIC0xODYsMTYgKzE4OSwxNSBAQAogaW50IHBlcmZfZXZsaXN0X19zdHJlcnJvcl9vcGVuKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBpbnQgZXJyLCBjaGFyICpidWYsIHNpemVfdCBzaXplKTsKIGludCBwZXJmX2V2bGlzdF9fc3RyZXJyb3JfbW1hcChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgaW50IGVyciwgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSk7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHBlcmZfbW1hcF9fcmVhZF9oZWFkKHN0cnVjdCBwZXJmX21tYXAgKm1tKQorc3RhdGljIGlubGluZSB1NjQgcGVyZl9tbWFwX19yZWFkX2hlYWQoc3RydWN0IHBlcmZfbW1hcCAqbW0pCiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfbW1hcF9wYWdlICpwYyA9IG1tLT5iYXNlOwotCWludCBoZWFkID0gQUNDRVNTX09OQ0UocGMtPmRhdGFfaGVhZCk7CisJdTY0IGhlYWQgPSBBQ0NFU1NfT05DRShwYy0+ZGF0YV9oZWFkKTsKIAlybWIoKTsKIAlyZXR1cm4gaGVhZDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHBlcmZfbW1hcF9fd3JpdGVfdGFpbChzdHJ1Y3QgcGVyZl9tbWFwICptZCwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgdGFpbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX21tYXBfX3dyaXRlX3RhaWwoc3RydWN0IHBlcmZfbW1hcCAqbWQsIHU2NCB0YWlsKQogewogCXN0cnVjdCBwZXJmX2V2ZW50X21tYXBfcGFnZSAqcGMgPSBtZC0+YmFzZTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuYwppbmRleCBlYTUxYTkwLi4zM2UzZmQ4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvZXZzZWwuYworKysgYi90b29scy9wZXJmL3V0aWwvZXZzZWwuYwpAQCAtMzIsOCArMzIsMTIgQEAKIAlib29sIGV4Y2x1ZGVfZ3Vlc3Q7CiAJYm9vbCBtbWFwMjsKIAlib29sIGNsb2V4ZWM7CisJYm9vbCBjbG9ja2lkOworCWJvb2wgY2xvY2tpZF93cm9uZzsKIH0gcGVyZl9taXNzaW5nX2ZlYXR1cmVzOwogCitzdGF0aWMgY2xvY2tpZF90IGNsb2NraWQ7CisKIHN0YXRpYyBpbnQgcGVyZl9ldnNlbF9fbm9fZXh0cmFfaW5pdChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX19tYXliZV91bnVzZWQpCiB7CiAJcmV0dXJuIDA7CkBAIC01MzcsMTMgKzU0MSwzMCBAQAogfQogCiBzdGF0aWMgdm9pZAotcGVyZl9ldnNlbF9fY29uZmlnX2NhbGxncmFwaChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpCitwZXJmX2V2c2VsX19jb25maWdfY2FsbGdyYXBoKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKKwkJCSAgICAgc3RydWN0IHJlY29yZF9vcHRzICpvcHRzKQogewogCWJvb2wgZnVuY3Rpb24gPSBwZXJmX2V2c2VsX19pc19mdW5jdGlvbl9ldmVudChldnNlbCk7CiAJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZldnNlbC0+YXR0cjsKIAogCXBlcmZfZXZzZWxfX3NldF9zYW1wbGVfYml0KGV2c2VsLCBDQUxMQ0hBSU4pOwogCisJaWYgKGNhbGxjaGFpbl9wYXJhbS5yZWNvcmRfbW9kZSA9PSBDQUxMQ0hBSU5fTEJSKSB7CisJCWlmICghb3B0cy0+YnJhbmNoX3N0YWNrKSB7CisJCQlpZiAoYXR0ci0+ZXhjbHVkZV91c2VyKSB7CisJCQkJcHJfd2FybmluZygiTEJSIGNhbGxzdGFjayBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgIgorCQkJCQkgICAidG8gZ2V0IHVzZXIgY2FsbGNoYWluIGluZm9ybWF0aW9uLiAiCisJCQkJCSAgICJGYWxsaW5nIGJhY2sgdG8gZnJhbWVwb2ludGVycy5cbiIpOworCQkJfSBlbHNlIHsKKwkJCQlwZXJmX2V2c2VsX19zZXRfc2FtcGxlX2JpdChldnNlbCwgQlJBTkNIX1NUQUNLKTsKKwkJCQlhdHRyLT5icmFuY2hfc2FtcGxlX3R5cGUgPSBQRVJGX1NBTVBMRV9CUkFOQ0hfVVNFUiB8CisJCQkJCQkJUEVSRl9TQU1QTEVfQlJBTkNIX0NBTExfU1RBQ0s7CisJCQl9CisJCX0gZWxzZQorCQkJIHByX3dhcm5pbmcoIkNhbm5vdCB1c2UgTEJSIGNhbGxzdGFjayB3aXRoIGJyYW5jaCBzdGFjay4gIgorCQkJCSAgICAiRmFsbGluZyBiYWNrIHRvIGZyYW1lcG9pbnRlcnMuXG4iKTsKKwl9CisKIAlpZiAoY2FsbGNoYWluX3BhcmFtLnJlY29yZF9tb2RlID09IENBTExDSEFJTl9EV0FSRikgewogCQlpZiAoIWZ1bmN0aW9uKSB7CiAJCQlwZXJmX2V2c2VsX19zZXRfc2FtcGxlX2JpdChldnNlbCwgUkVHU19VU0VSKTsKQEAgLTY2Nyw3ICs2ODgsNyBAQAogCQlldnNlbC0+YXR0ci5leGNsdWRlX2NhbGxjaGFpbl91c2VyID0gMTsKIAogCWlmIChjYWxsY2hhaW5fcGFyYW0uZW5hYmxlZCAmJiAhZXZzZWwtPm5vX2F1eF9zYW1wbGVzKQotCQlwZXJmX2V2c2VsX19jb25maWdfY2FsbGdyYXBoKGV2c2VsKTsKKwkJcGVyZl9ldnNlbF9fY29uZmlnX2NhbGxncmFwaChldnNlbCwgb3B0cyk7CiAKIAlpZiAob3B0cy0+c2FtcGxlX2ludHJfcmVncykgewogCQlhdHRyLT5zYW1wbGVfcmVnc19pbnRyID0gUEVSRl9SRUdTX01BU0s7CkBAIC03MTcsNiArNzM4LDEyIEBACiAJaWYgKG9wdHMtPnNhbXBsZV90cmFuc2FjdGlvbikKIAkJcGVyZl9ldnNlbF9fc2V0X3NhbXBsZV9iaXQoZXZzZWwsIFRSQU5TQUNUSU9OKTsKIAorCWlmIChvcHRzLT5ydW5uaW5nX3RpbWUpIHsKKwkJZXZzZWwtPmF0dHIucmVhZF9mb3JtYXQgfD0KKwkJCVBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRCB8CisJCQlQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX1JVTk5JTkc7CisJfQorCiAJLyoKIAkgKiBYWFggc2VlIHRoZSBmdW5jdGlvbiBjb21tZW50IGFib3ZlCiAJICoKQEAgLTczOCw2ICs3NjUsMTIgQEAKIAkJYXR0ci0+ZGlzYWJsZWQgPSAwOwogCQlhdHRyLT5lbmFibGVfb25fZXhlYyA9IDA7CiAJfQorCisJY2xvY2tpZCA9IG9wdHMtPmNsb2NraWQ7CisJaWYgKG9wdHMtPnVzZV9jbG9ja2lkKSB7CisJCWF0dHItPnVzZV9jbG9ja2lkID0gMTsKKwkJYXR0ci0+Y2xvY2tpZCA9IG9wdHMtPmNsb2NraWQ7CisJfQogfQogCiBzdGF0aWMgaW50IHBlcmZfZXZzZWxfX2FsbG9jX2ZkKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgaW50IG5jcHVzLCBpbnQgbnRocmVhZHMpCkBAIC05NzgsNjcgKzEwMTEsMTI2IEBACiAJcmV0dXJuIGZkOwogfQogCi0jZGVmaW5lIF9fUFJJTlRfQVRUUihmbXQsIGNhc3QsIGZpZWxkKSAgXAotCWZwcmludGYoZnAsICIgICUtMTlzICJmbXQiXG4iLCAjZmllbGQsIGNhc3QgYXR0ci0+ZmllbGQpCitzdHJ1Y3QgYml0X25hbWVzIHsKKwlpbnQgYml0OworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OwogCi0jZGVmaW5lIFBSSU5UX0FUVFJfVTMyKGZpZWxkKSAgX19QUklOVF9BVFRSKCIldSIgLCAsIGZpZWxkKQotI2RlZmluZSBQUklOVF9BVFRSX1gzMihmaWVsZCkgIF9fUFJJTlRfQVRUUigiJSN4IiwgLCBmaWVsZCkKLSNkZWZpbmUgUFJJTlRfQVRUUl9VNjQoZmllbGQpICBfX1BSSU5UX0FUVFIoIiUiIFBSSXU2NCwgKHVpbnQ2NF90KSwgZmllbGQpCi0jZGVmaW5lIFBSSU5UX0FUVFJfWDY0KGZpZWxkKSAgX19QUklOVF9BVFRSKCIlIyJQUkl4NjQsICh1aW50NjRfdCksIGZpZWxkKQotCi0jZGVmaW5lIFBSSU5UX0FUVFIyTihuYW1lMSwgZmllbGQxLCBuYW1lMiwgZmllbGQyKQlcCi0JZnByaW50ZihmcCwgIiAgJS0xOXMgJXUgICAgJS0xOXMgJXVcbiIsCQlcCi0JbmFtZTEsIGF0dHItPmZpZWxkMSwgbmFtZTIsIGF0dHItPmZpZWxkMikKLQotI2RlZmluZSBQUklOVF9BVFRSMihmaWVsZDEsIGZpZWxkMikgXAotCVBSSU5UX0FUVFIyTigjZmllbGQxLCBmaWVsZDEsICNmaWVsZDIsIGZpZWxkMikKLQotc3RhdGljIHNpemVfdCBwZXJmX2V2ZW50X2F0dHJfX2ZwcmludGYoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwgRklMRSAqZnApCitzdGF0aWMgdm9pZCBfX3BfYml0cyhjaGFyICpidWYsIHNpemVfdCBzaXplLCB1NjQgdmFsdWUsIHN0cnVjdCBiaXRfbmFtZXMgKmJpdHMpCiB7Ci0Jc2l6ZV90IHJldCA9IDA7CisJYm9vbCBmaXJzdF9iaXQgPSB0cnVlOworCWludCBpID0gMDsKIAotCXJldCArPSBmcHJpbnRmKGZwLCAiJS42MHNcbiIsIGdyYXBoX2RvdHRlZF9saW5lKTsKLQlyZXQgKz0gZnByaW50ZihmcCwgInBlcmZfZXZlbnRfYXR0cjpcbiIpOworCWRvIHsKKwkJaWYgKHZhbHVlICYgYml0c1tpXS5iaXQpIHsKKwkJCWJ1ZiArPSBzY25wcmludGYoYnVmLCBzaXplLCAiJXMlcyIsIGZpcnN0X2JpdCA/ICIiIDogInwiLCBiaXRzW2ldLm5hbWUpOworCQkJZmlyc3RfYml0ID0gZmFsc2U7CisJCX0KKwl9IHdoaWxlIChiaXRzWysraV0ubmFtZSAhPSBOVUxMKTsKK30KIAotCXJldCArPSBQUklOVF9BVFRSX1UzMih0eXBlKTsKLQlyZXQgKz0gUFJJTlRfQVRUUl9VMzIoc2l6ZSk7Ci0JcmV0ICs9IFBSSU5UX0FUVFJfWDY0KGNvbmZpZyk7Ci0JcmV0ICs9IFBSSU5UX0FUVFJfVTY0KHNhbXBsZV9wZXJpb2QpOwotCXJldCArPSBQUklOVF9BVFRSX1U2NChzYW1wbGVfZnJlcSk7Ci0JcmV0ICs9IFBSSU5UX0FUVFJfWDY0KHNhbXBsZV90eXBlKTsKLQlyZXQgKz0gUFJJTlRfQVRUUl9YNjQocmVhZF9mb3JtYXQpOworc3RhdGljIHZvaWQgX19wX3NhbXBsZV90eXBlKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIHU2NCB2YWx1ZSkKK3sKKyNkZWZpbmUgYml0X25hbWUobikgeyBQRVJGX1NBTVBMRV8jI24sICNuIH0KKwlzdHJ1Y3QgYml0X25hbWVzIGJpdHNbXSA9IHsKKwkJYml0X25hbWUoSVApLCBiaXRfbmFtZShUSUQpLCBiaXRfbmFtZShUSU1FKSwgYml0X25hbWUoQUREUiksCisJCWJpdF9uYW1lKFJFQUQpLCBiaXRfbmFtZShDQUxMQ0hBSU4pLCBiaXRfbmFtZShJRCksIGJpdF9uYW1lKENQVSksCisJCWJpdF9uYW1lKFBFUklPRCksIGJpdF9uYW1lKFNUUkVBTV9JRCksIGJpdF9uYW1lKFJBVyksCisJCWJpdF9uYW1lKEJSQU5DSF9TVEFDSyksIGJpdF9uYW1lKFJFR1NfVVNFUiksIGJpdF9uYW1lKFNUQUNLX1VTRVIpLAorCQliaXRfbmFtZShJREVOVElGSUVSKSwgYml0X25hbWUoUkVHU19JTlRSKSwKKwkJeyAubmFtZSA9IE5VTEwsIH0KKwl9OworI3VuZGVmIGJpdF9uYW1lCisJX19wX2JpdHMoYnVmLCBzaXplLCB2YWx1ZSwgYml0cyk7Cit9CiAKLQlyZXQgKz0gUFJJTlRfQVRUUjIoZGlzYWJsZWQsIGluaGVyaXQpOwotCXJldCArPSBQUklOVF9BVFRSMihwaW5uZWQsIGV4Y2x1c2l2ZSk7Ci0JcmV0ICs9IFBSSU5UX0FUVFIyKGV4Y2x1ZGVfdXNlciwgZXhjbHVkZV9rZXJuZWwpOwotCXJldCArPSBQUklOVF9BVFRSMihleGNsdWRlX2h2LCBleGNsdWRlX2lkbGUpOwotCXJldCArPSBQUklOVF9BVFRSMihtbWFwLCBjb21tKTsKLQlyZXQgKz0gUFJJTlRfQVRUUjIobW1hcDIsIGNvbW1fZXhlYyk7Ci0JcmV0ICs9IFBSSU5UX0FUVFIyKGZyZXEsIGluaGVyaXRfc3RhdCk7Ci0JcmV0ICs9IFBSSU5UX0FUVFIyKGVuYWJsZV9vbl9leGVjLCB0YXNrKTsKLQlyZXQgKz0gUFJJTlRfQVRUUjIod2F0ZXJtYXJrLCBwcmVjaXNlX2lwKTsKLQlyZXQgKz0gUFJJTlRfQVRUUjIobW1hcF9kYXRhLCBzYW1wbGVfaWRfYWxsKTsKLQlyZXQgKz0gUFJJTlRfQVRUUjIoZXhjbHVkZV9ob3N0LCBleGNsdWRlX2d1ZXN0KTsKLQlyZXQgKz0gUFJJTlRfQVRUUjJOKCJleGNsLmNhbGxjaGFpbl9rZXJuIiwgZXhjbHVkZV9jYWxsY2hhaW5fa2VybmVsLAotCQkJICAgICJleGNsLmNhbGxjaGFpbl91c2VyIiwgZXhjbHVkZV9jYWxsY2hhaW5fdXNlcik7CitzdGF0aWMgdm9pZCBfX3BfcmVhZF9mb3JtYXQoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgdTY0IHZhbHVlKQoreworI2RlZmluZSBiaXRfbmFtZShuKSB7IFBFUkZfRk9STUFUXyMjbiwgI24gfQorCXN0cnVjdCBiaXRfbmFtZXMgYml0c1tdID0geworCQliaXRfbmFtZShUT1RBTF9USU1FX0VOQUJMRUQpLCBiaXRfbmFtZShUT1RBTF9USU1FX1JVTk5JTkcpLAorCQliaXRfbmFtZShJRCksIGJpdF9uYW1lKEdST1VQKSwKKwkJeyAubmFtZSA9IE5VTEwsIH0KKwl9OworI3VuZGVmIGJpdF9uYW1lCisJX19wX2JpdHMoYnVmLCBzaXplLCB2YWx1ZSwgYml0cyk7Cit9CiAKLQlyZXQgKz0gUFJJTlRfQVRUUl9VMzIod2FrZXVwX2V2ZW50cyk7Ci0JcmV0ICs9IFBSSU5UX0FUVFJfVTMyKHdha2V1cF93YXRlcm1hcmspOwotCXJldCArPSBQUklOVF9BVFRSX1gzMihicF90eXBlKTsKLQlyZXQgKz0gUFJJTlRfQVRUUl9YNjQoYnBfYWRkcik7Ci0JcmV0ICs9IFBSSU5UX0FUVFJfWDY0KGNvbmZpZzEpOwotCXJldCArPSBQUklOVF9BVFRSX1U2NChicF9sZW4pOwotCXJldCArPSBQUklOVF9BVFRSX1g2NChjb25maWcyKTsKLQlyZXQgKz0gUFJJTlRfQVRUUl9YNjQoYnJhbmNoX3NhbXBsZV90eXBlKTsKLQlyZXQgKz0gUFJJTlRfQVRUUl9YNjQoc2FtcGxlX3JlZ3NfdXNlcik7Ci0JcmV0ICs9IFBSSU5UX0FUVFJfVTMyKHNhbXBsZV9zdGFja191c2VyKTsKLQlyZXQgKz0gUFJJTlRfQVRUUl9YNjQoc2FtcGxlX3JlZ3NfaW50cik7CisjZGVmaW5lIEJVRl9TSVpFCQkxMDI0CiAKLQlyZXQgKz0gZnByaW50ZihmcCwgIiUuNjBzXG4iLCBncmFwaF9kb3R0ZWRfbGluZSk7CisjZGVmaW5lIHBfaGV4KHZhbCkJCXNucHJpbnRmKGJ1ZiwgQlVGX1NJWkUsICIlIlBSSXg2NCwgKHVpbnQ2NF90KSh2YWwpKQorI2RlZmluZSBwX3Vuc2lnbmVkKHZhbCkJCXNucHJpbnRmKGJ1ZiwgQlVGX1NJWkUsICIlIlBSSXU2NCwgKHVpbnQ2NF90KSh2YWwpKQorI2RlZmluZSBwX3NpZ25lZCh2YWwpCQlzbnByaW50ZihidWYsIEJVRl9TSVpFLCAiJSJQUklkNjQsIChpbnQ2NF90KSh2YWwpKQorI2RlZmluZSBwX3NhbXBsZV90eXBlKHZhbCkJX19wX3NhbXBsZV90eXBlKGJ1ZiwgQlVGX1NJWkUsIHZhbCkKKyNkZWZpbmUgcF9yZWFkX2Zvcm1hdCh2YWwpCV9fcF9yZWFkX2Zvcm1hdChidWYsIEJVRl9TSVpFLCB2YWwpCisKKyNkZWZpbmUgUFJJTlRfQVRUUm4oX24sIF9mLCBfcCkJCQkJXAorZG8gewkJCQkJCQlcCisJaWYgKGF0dHItPl9mKSB7CQkJCQlcCisJCV9wKGF0dHItPl9mKTsJCQkJXAorCQlyZXQgKz0gYXR0cl9fZnByaW50ZihmcCwgX24sIGJ1ZiwgcHJpdik7XAorCX0JCQkJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFBSSU5UX0FUVFJmKF9mLCBfcCkJUFJJTlRfQVRUUm4oI19mLCBfZiwgX3ApCisKK2ludCBwZXJmX2V2ZW50X2F0dHJfX2ZwcmludGYoRklMRSAqZnAsIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsCisJCQkgICAgIGF0dHJfX2ZwcmludGZfZiBhdHRyX19mcHJpbnRmLCB2b2lkICpwcml2KQoreworCWNoYXIgYnVmW0JVRl9TSVpFXTsKKwlpbnQgcmV0ID0gMDsKKworCVBSSU5UX0FUVFJmKHR5cGUsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKHNpemUsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKGNvbmZpZywgcF9oZXgpOworCVBSSU5UX0FUVFJuKCJ7IHNhbXBsZV9wZXJpb2QsIHNhbXBsZV9mcmVxIH0iLCBzYW1wbGVfcGVyaW9kLCBwX3Vuc2lnbmVkKTsKKwlQUklOVF9BVFRSZihzYW1wbGVfdHlwZSwgcF9zYW1wbGVfdHlwZSk7CisJUFJJTlRfQVRUUmYocmVhZF9mb3JtYXQsIHBfcmVhZF9mb3JtYXQpOworCisJUFJJTlRfQVRUUmYoZGlzYWJsZWQsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKGluaGVyaXQsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKHBpbm5lZCwgcF91bnNpZ25lZCk7CisJUFJJTlRfQVRUUmYoZXhjbHVzaXZlLCBwX3Vuc2lnbmVkKTsKKwlQUklOVF9BVFRSZihleGNsdWRlX3VzZXIsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKGV4Y2x1ZGVfa2VybmVsLCBwX3Vuc2lnbmVkKTsKKwlQUklOVF9BVFRSZihleGNsdWRlX2h2LCBwX3Vuc2lnbmVkKTsKKwlQUklOVF9BVFRSZihleGNsdWRlX2lkbGUsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKG1tYXAsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKGNvbW0sIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKGZyZXEsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKGluaGVyaXRfc3RhdCwgcF91bnNpZ25lZCk7CisJUFJJTlRfQVRUUmYoZW5hYmxlX29uX2V4ZWMsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKHRhc2ssIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKHdhdGVybWFyaywgcF91bnNpZ25lZCk7CisJUFJJTlRfQVRUUmYocHJlY2lzZV9pcCwgcF91bnNpZ25lZCk7CisJUFJJTlRfQVRUUmYobW1hcF9kYXRhLCBwX3Vuc2lnbmVkKTsKKwlQUklOVF9BVFRSZihzYW1wbGVfaWRfYWxsLCBwX3Vuc2lnbmVkKTsKKwlQUklOVF9BVFRSZihleGNsdWRlX2hvc3QsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKGV4Y2x1ZGVfZ3Vlc3QsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKGV4Y2x1ZGVfY2FsbGNoYWluX2tlcm5lbCwgcF91bnNpZ25lZCk7CisJUFJJTlRfQVRUUmYoZXhjbHVkZV9jYWxsY2hhaW5fdXNlciwgcF91bnNpZ25lZCk7CisJUFJJTlRfQVRUUmYobW1hcDIsIHBfdW5zaWduZWQpOworCVBSSU5UX0FUVFJmKGNvbW1fZXhlYywgcF91bnNpZ25lZCk7CisJUFJJTlRfQVRUUmYodXNlX2Nsb2NraWQsIHBfdW5zaWduZWQpOworCisJUFJJTlRfQVRUUm4oInsgd2FrZXVwX2V2ZW50cywgd2FrZXVwX3dhdGVybWFyayB9Iiwgd2FrZXVwX2V2ZW50cywgcF91bnNpZ25lZCk7CisJUFJJTlRfQVRUUmYoYnBfdHlwZSwgcF91bnNpZ25lZCk7CisJUFJJTlRfQVRUUm4oInsgYnBfYWRkciwgY29uZmlnMSB9IiwgYnBfYWRkciwgcF9oZXgpOworCVBSSU5UX0FUVFJuKCJ7IGJwX2xlbiwgY29uZmlnMiB9IiwgYnBfbGVuLCBwX2hleCk7CisJUFJJTlRfQVRUUmYoc2FtcGxlX3JlZ3NfdXNlciwgcF9oZXgpOworCVBSSU5UX0FUVFJmKHNhbXBsZV9zdGFja191c2VyLCBwX3Vuc2lnbmVkKTsKKwlQUklOVF9BVFRSZihjbG9ja2lkLCBwX3NpZ25lZCk7CisJUFJJTlRfQVRUUmYoc2FtcGxlX3JlZ3NfaW50ciwgcF9oZXgpOwogCiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBfX29wZW5fYXR0cl9fZnByaW50ZihGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsLAorCQkJCXZvaWQgKnByaXYgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIGZwcmludGYoZnAsICIgICUtMzJzICVzXG4iLCBuYW1lLCB2YWwpOworfQorCiBzdGF0aWMgaW50IF9fcGVyZl9ldnNlbF9fb3BlbihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIHN0cnVjdCBjcHVfbWFwICpjcHVzLAogCQkJICAgICAgc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMpCiB7CkBAIC0xMDYyLDYgKzExNTQsMTIgQEAKIAl9CiAKIGZhbGxiYWNrX21pc3NpbmdfZmVhdHVyZXM6CisJaWYgKHBlcmZfbWlzc2luZ19mZWF0dXJlcy5jbG9ja2lkX3dyb25nKQorCQlldnNlbC0+YXR0ci5jbG9ja2lkID0gQ0xPQ0tfTU9OT1RPTklDOyAvKiBzaG91bGQgYWx3YXlzIHdvcmsgKi8KKwlpZiAocGVyZl9taXNzaW5nX2ZlYXR1cmVzLmNsb2NraWQpIHsKKwkJZXZzZWwtPmF0dHIudXNlX2Nsb2NraWQgPSAwOworCQlldnNlbC0+YXR0ci5jbG9ja2lkID0gMDsKKwl9CiAJaWYgKHBlcmZfbWlzc2luZ19mZWF0dXJlcy5jbG9leGVjKQogCQlmbGFncyAmPSB+KHVuc2lnbmVkIGxvbmcpUEVSRl9GTEFHX0ZEX0NMT0VYRUM7CiAJaWYgKHBlcmZfbWlzc2luZ19mZWF0dXJlcy5tbWFwMikKQEAgLTEwNzIsOCArMTE3MCwxMiBAQAogCWlmIChwZXJmX21pc3NpbmdfZmVhdHVyZXMuc2FtcGxlX2lkX2FsbCkKIAkJZXZzZWwtPmF0dHIuc2FtcGxlX2lkX2FsbCA9IDA7CiAKLQlpZiAodmVyYm9zZSA+PSAyKQotCQlwZXJmX2V2ZW50X2F0dHJfX2ZwcmludGYoJmV2c2VsLT5hdHRyLCBzdGRlcnIpOworCWlmICh2ZXJib3NlID49IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlLjYwc1xuIiwgZ3JhcGhfZG90dGVkX2xpbmUpOworCQlmcHJpbnRmKHN0ZGVyciwgInBlcmZfZXZlbnRfYXR0cjpcbiIpOworCQlwZXJmX2V2ZW50X2F0dHJfX2ZwcmludGYoc3RkZXJyLCAmZXZzZWwtPmF0dHIsIF9fb3Blbl9hdHRyX19mcHJpbnRmLCBOVUxMKTsKKwkJZnByaW50ZihzdGRlcnIsICIlLjYwc1xuIiwgZ3JhcGhfZG90dGVkX2xpbmUpOworCX0KIAogCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1cy0+bnI7IGNwdSsrKSB7CiAKQEAgLTEwOTksNiArMTIwMSwxNyBAQAogCQkJCWdvdG8gdHJ5X2ZhbGxiYWNrOwogCQkJfQogCQkJc2V0X3JsaW1pdCA9IE5PX0NIQU5HRTsKKworCQkJLyoKKwkJCSAqIElmIHdlIHN1Y2NlZWRlZCBidXQgaGFkIHRvIGtpbGwgY2xvY2tpZCwgZmFpbCBhbmQKKwkJCSAqIGhhdmUgcGVyZl9ldnNlbF9fb3Blbl9zdHJlcnJvcigpIHByaW50IHVzIGEgbmljZQorCQkJICogZXJyb3IuCisJCQkgKi8KKwkJCWlmIChwZXJmX21pc3NpbmdfZmVhdHVyZXMuY2xvY2tpZCB8fAorCQkJICAgIHBlcmZfbWlzc2luZ19mZWF0dXJlcy5jbG9ja2lkX3dyb25nKSB7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dF9jbG9zZTsKKwkJCX0KIAkJfQogCX0KIApAQCAtMTEzMiw3ICsxMjQ1LDE3IEBACiAJaWYgKGVyciAhPSAtRUlOVkFMIHx8IGNwdSA+IDAgfHwgdGhyZWFkID4gMCkKIAkJZ290byBvdXRfY2xvc2U7CiAKLQlpZiAoIXBlcmZfbWlzc2luZ19mZWF0dXJlcy5jbG9leGVjICYmIChmbGFncyAmIFBFUkZfRkxBR19GRF9DTE9FWEVDKSkgeworCS8qCisJICogTXVzdCBwcm9iZSBmZWF0dXJlcyBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGFkZGVkIHRvIHRoZQorCSAqIHBlcmZfZXZlbnRfYXR0ciBpbnRlcmZhY2UuCisJICovCisJaWYgKCFwZXJmX21pc3NpbmdfZmVhdHVyZXMuY2xvY2tpZF93cm9uZyAmJiBldnNlbC0+YXR0ci51c2VfY2xvY2tpZCkgeworCQlwZXJmX21pc3NpbmdfZmVhdHVyZXMuY2xvY2tpZF93cm9uZyA9IHRydWU7CisJCWdvdG8gZmFsbGJhY2tfbWlzc2luZ19mZWF0dXJlczsKKwl9IGVsc2UgaWYgKCFwZXJmX21pc3NpbmdfZmVhdHVyZXMuY2xvY2tpZCAmJiBldnNlbC0+YXR0ci51c2VfY2xvY2tpZCkgeworCQlwZXJmX21pc3NpbmdfZmVhdHVyZXMuY2xvY2tpZCA9IHRydWU7CisJCWdvdG8gZmFsbGJhY2tfbWlzc2luZ19mZWF0dXJlczsKKwl9IGVsc2UgaWYgKCFwZXJmX21pc3NpbmdfZmVhdHVyZXMuY2xvZXhlYyAmJiAoZmxhZ3MgJiBQRVJGX0ZMQUdfRkRfQ0xPRVhFQykpIHsKIAkJcGVyZl9taXNzaW5nX2ZlYXR1cmVzLmNsb2V4ZWMgPSB0cnVlOwogCQlnb3RvIGZhbGxiYWNrX21pc3NpbmdfZmVhdHVyZXM7CiAJfSBlbHNlIGlmICghcGVyZl9taXNzaW5nX2ZlYXR1cmVzLm1tYXAyICYmIGV2c2VsLT5hdHRyLm1tYXAyKSB7CkBAIC0xODkyLDcgKzIwMTUsNyBAQAogCQl2YWx1ZSA9ICoodTMyICopcHRyOwogCQlicmVhazsKIAljYXNlIDg6Ci0JCXZhbHVlID0gKih1NjQgKilwdHI7CisJCW1lbWNweSgmdmFsdWUsIHB0ciwgc2l6ZW9mKHU2NCkpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKQEAgLTE5MzMsNjIgKzIwNTYsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pZl9mcHJpbnRmKEZJTEUgKmZwLCBib29sICpmaXJzdCwgY29uc3QgY2hhciAqZmllbGQsIHU2NCB2YWx1ZSkKK3N0YXRpYyBpbnQgX19wcmludF9hdHRyX19mcHJpbnRmKEZJTEUgKmZwLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwsIHZvaWQgKnByaXYpCiB7Ci0JaWYgKHZhbHVlID09IDApCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGNvbW1hX2ZwcmludGYoZnAsIGZpcnN0LCAiICVzOiAlIiBQUkl1NjQsIGZpZWxkLCB2YWx1ZSk7Ci19Ci0KLSNkZWZpbmUgaWZfcHJpbnQoZmllbGQpIHByaW50ZWQgKz0gX19pZl9mcHJpbnRmKGZwLCAmZmlyc3QsICNmaWVsZCwgZXZzZWwtPmF0dHIuZmllbGQpCi0KLXN0cnVjdCBiaXRfbmFtZXMgewotCWludCBiaXQ7Ci0JY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLXN0YXRpYyBpbnQgYml0c19fZnByaW50ZihGSUxFICpmcCwgY29uc3QgY2hhciAqZmllbGQsIHU2NCB2YWx1ZSwKLQkJCSBzdHJ1Y3QgYml0X25hbWVzICpiaXRzLCBib29sICpmaXJzdCkKLXsKLQlpbnQgaSA9IDAsIHByaW50ZWQgPSBjb21tYV9mcHJpbnRmKGZwLCBmaXJzdCwgIiAlczogIiwgZmllbGQpOwotCWJvb2wgZmlyc3RfYml0ID0gdHJ1ZTsKLQotCWRvIHsKLQkJaWYgKHZhbHVlICYgYml0c1tpXS5iaXQpIHsKLQkJCXByaW50ZWQgKz0gZnByaW50ZihmcCwgIiVzJXMiLCBmaXJzdF9iaXQgPyAiIiA6ICJ8IiwgYml0c1tpXS5uYW1lKTsKLQkJCWZpcnN0X2JpdCA9IGZhbHNlOwotCQl9Ci0JfSB3aGlsZSAoYml0c1srK2ldLm5hbWUgIT0gTlVMTCk7Ci0KLQlyZXR1cm4gcHJpbnRlZDsKLX0KLQotc3RhdGljIGludCBzYW1wbGVfdHlwZV9fZnByaW50ZihGSUxFICpmcCwgYm9vbCAqZmlyc3QsIHU2NCB2YWx1ZSkKLXsKLSNkZWZpbmUgYml0X25hbWUobikgeyBQRVJGX1NBTVBMRV8jI24sICNuIH0KLQlzdHJ1Y3QgYml0X25hbWVzIGJpdHNbXSA9IHsKLQkJYml0X25hbWUoSVApLCBiaXRfbmFtZShUSUQpLCBiaXRfbmFtZShUSU1FKSwgYml0X25hbWUoQUREUiksCi0JCWJpdF9uYW1lKFJFQUQpLCBiaXRfbmFtZShDQUxMQ0hBSU4pLCBiaXRfbmFtZShJRCksIGJpdF9uYW1lKENQVSksCi0JCWJpdF9uYW1lKFBFUklPRCksIGJpdF9uYW1lKFNUUkVBTV9JRCksIGJpdF9uYW1lKFJBVyksCi0JCWJpdF9uYW1lKEJSQU5DSF9TVEFDSyksIGJpdF9uYW1lKFJFR1NfVVNFUiksIGJpdF9uYW1lKFNUQUNLX1VTRVIpLAotCQliaXRfbmFtZShJREVOVElGSUVSKSwgYml0X25hbWUoUkVHU19JTlRSKSwKLQkJeyAubmFtZSA9IE5VTEwsIH0KLQl9OwotI3VuZGVmIGJpdF9uYW1lCi0JcmV0dXJuIGJpdHNfX2ZwcmludGYoZnAsICJzYW1wbGVfdHlwZSIsIHZhbHVlLCBiaXRzLCBmaXJzdCk7Ci19Ci0KLXN0YXRpYyBpbnQgcmVhZF9mb3JtYXRfX2ZwcmludGYoRklMRSAqZnAsIGJvb2wgKmZpcnN0LCB1NjQgdmFsdWUpCi17Ci0jZGVmaW5lIGJpdF9uYW1lKG4pIHsgUEVSRl9GT1JNQVRfIyNuLCAjbiB9Ci0Jc3RydWN0IGJpdF9uYW1lcyBiaXRzW10gPSB7Ci0JCWJpdF9uYW1lKFRPVEFMX1RJTUVfRU5BQkxFRCksIGJpdF9uYW1lKFRPVEFMX1RJTUVfUlVOTklORyksCi0JCWJpdF9uYW1lKElEKSwgYml0X25hbWUoR1JPVVApLAotCQl7IC5uYW1lID0gTlVMTCwgfQotCX07Ci0jdW5kZWYgYml0X25hbWUKLQlyZXR1cm4gYml0c19fZnByaW50ZihmcCwgInJlYWRfZm9ybWF0IiwgdmFsdWUsIGJpdHMsIGZpcnN0KTsKKwlyZXR1cm4gY29tbWFfZnByaW50ZihmcCwgKGJvb2wgKilwcml2LCAiICVzOiAlcyIsIG5hbWUsIHZhbCk7CiB9CiAKIGludCBwZXJmX2V2c2VsX19mcHJpbnRmKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKQEAgLTIwMTcsNDcgKzIwODcsMTMgQEAKIAogCXByaW50ZWQgKz0gZnByaW50ZihmcCwgIiVzIiwgcGVyZl9ldnNlbF9fbmFtZShldnNlbCkpOwogCi0JaWYgKGRldGFpbHMtPnZlcmJvc2UgfHwgZGV0YWlscy0+ZnJlcSkgeworCWlmIChkZXRhaWxzLT52ZXJib3NlKSB7CisJCXByaW50ZWQgKz0gcGVyZl9ldmVudF9hdHRyX19mcHJpbnRmKGZwLCAmZXZzZWwtPmF0dHIsCisJCQkJCQkgICAgX19wcmludF9hdHRyX19mcHJpbnRmLCAmZmlyc3QpOworCX0gZWxzZSBpZiAoZGV0YWlscy0+ZnJlcSkgewogCQlwcmludGVkICs9IGNvbW1hX2ZwcmludGYoZnAsICZmaXJzdCwgIiBzYW1wbGVfZnJlcT0lIiBQUkl1NjQsCiAJCQkJCSAodTY0KWV2c2VsLT5hdHRyLnNhbXBsZV9mcmVxKTsKIAl9Ci0KLQlpZiAoZGV0YWlscy0+dmVyYm9zZSkgewotCQlpZl9wcmludCh0eXBlKTsKLQkJaWZfcHJpbnQoY29uZmlnKTsKLQkJaWZfcHJpbnQoY29uZmlnMSk7Ci0JCWlmX3ByaW50KGNvbmZpZzIpOwotCQlpZl9wcmludChzaXplKTsKLQkJcHJpbnRlZCArPSBzYW1wbGVfdHlwZV9fZnByaW50ZihmcCwgJmZpcnN0LCBldnNlbC0+YXR0ci5zYW1wbGVfdHlwZSk7Ci0JCWlmIChldnNlbC0+YXR0ci5yZWFkX2Zvcm1hdCkKLQkJCXByaW50ZWQgKz0gcmVhZF9mb3JtYXRfX2ZwcmludGYoZnAsICZmaXJzdCwgZXZzZWwtPmF0dHIucmVhZF9mb3JtYXQpOwotCQlpZl9wcmludChkaXNhYmxlZCk7Ci0JCWlmX3ByaW50KGluaGVyaXQpOwotCQlpZl9wcmludChwaW5uZWQpOwotCQlpZl9wcmludChleGNsdXNpdmUpOwotCQlpZl9wcmludChleGNsdWRlX3VzZXIpOwotCQlpZl9wcmludChleGNsdWRlX2tlcm5lbCk7Ci0JCWlmX3ByaW50KGV4Y2x1ZGVfaHYpOwotCQlpZl9wcmludChleGNsdWRlX2lkbGUpOwotCQlpZl9wcmludChtbWFwKTsKLQkJaWZfcHJpbnQobW1hcDIpOwotCQlpZl9wcmludChjb21tKTsKLQkJaWZfcHJpbnQoY29tbV9leGVjKTsKLQkJaWZfcHJpbnQoZnJlcSk7Ci0JCWlmX3ByaW50KGluaGVyaXRfc3RhdCk7Ci0JCWlmX3ByaW50KGVuYWJsZV9vbl9leGVjKTsKLQkJaWZfcHJpbnQodGFzayk7Ci0JCWlmX3ByaW50KHdhdGVybWFyayk7Ci0JCWlmX3ByaW50KHByZWNpc2VfaXApOwotCQlpZl9wcmludChtbWFwX2RhdGEpOwotCQlpZl9wcmludChzYW1wbGVfaWRfYWxsKTsKLQkJaWZfcHJpbnQoZXhjbHVkZV9ob3N0KTsKLQkJaWZfcHJpbnQoZXhjbHVkZV9ndWVzdCk7Ci0JCWlmX3ByaW50KF9fcmVzZXJ2ZWRfMSk7Ci0JCWlmX3ByaW50KHdha2V1cF9ldmVudHMpOwotCQlpZl9wcmludChicF90eXBlKTsKLQkJaWZfcHJpbnQoYnJhbmNoX3NhbXBsZV90eXBlKTsKLQl9CiBvdXQ6CiAJZnB1dGMoJ1xuJywgZnApOwogCXJldHVybiArK3ByaW50ZWQ7CkBAIC0yMTM1LDYgKzIxNzEsMTIgQEAKIAkiVGhlIFBNVSBjb3VudGVycyBhcmUgYnVzeS90YWtlbiBieSBhbm90aGVyIHByb2ZpbGVyLlxuIgogCSJXZSBmb3VuZCBvcHJvZmlsZSBkYWVtb24gcnVubmluZywgcGxlYXNlIHN0b3AgaXQgYW5kIHRyeSBhZ2Fpbi4iKTsKIAkJYnJlYWs7CisJY2FzZSBFSU5WQUw6CisJCWlmIChwZXJmX21pc3NpbmdfZmVhdHVyZXMuY2xvY2tpZCkKKwkJCXJldHVybiBzY25wcmludGYobXNnLCBzaXplLCAiY2xvY2tpZCBmZWF0dXJlIG5vdCBzdXBwb3J0ZWQuIik7CisJCWlmIChwZXJmX21pc3NpbmdfZmVhdHVyZXMuY2xvY2tpZF93cm9uZykKKwkJCXJldHVybiBzY25wcmludGYobXNnLCBzaXplLCAid3JvbmcgY2xvY2tpZCAoJWQpLiIsIGNsb2NraWQpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZzZWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCmluZGV4IDM4NjIyNzQuLmU0ODYxNTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oCkBAIC0zMzUsNiArMzM1LDcgQEAKIAlib29sIGZyZXE7CiAJYm9vbCB2ZXJib3NlOwogCWJvb2wgZXZlbnRfZ3JvdXA7CisJYm9vbCBmb3JjZTsKIH07CiAKIGludCBwZXJmX2V2c2VsX19mcHJpbnRmKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKQEAgLTM1NSw0ICszNTYsMTQgQEAKICAgICAgKF9ldnNlbCkgJiYgKF9ldnNlbCktPmxlYWRlciA9PSAoX2xlYWRlcik7CQkJCQlcCiAgICAgIChfZXZzZWwpID0gbGlzdF9lbnRyeSgoX2V2c2VsKS0+bm9kZS5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSkpCiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNfYnJhbmNoX2NhbGxzdGFjayhzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpCit7CisJcmV0dXJuIGV2c2VsLT5hdHRyLmJyYW5jaF9zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0JSQU5DSF9DQUxMX1NUQUNLOworfQorCit0eXBlZGVmIGludCAoKmF0dHJfX2ZwcmludGZfZikoRklMRSAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKKworaW50IHBlcmZfZXZlbnRfYXR0cl9fZnByaW50ZihGSUxFICpmcCwgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwKKwkJCSAgICAgYXR0cl9fZnByaW50Zl9mIGF0dHJfX2ZwcmludGYsIHZvaWQgKnByaXYpOworCiAjZW5kaWYgLyogX19QRVJGX0VWU0VMX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYyBiL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYwppbmRleCAxZjQwN2Y3Li45MThmZDhhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jCkBAIC0xMDU1LDYgKzEwNTUsMTIgQEAKIAlnb3RvIG91dDsKIH0KIAorc3RhdGljIGludCBfX2Rlc2NfYXR0cl9fZnByaW50ZihGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsLAorCQkJCXZvaWQgKnByaXYgX19hdHRyaWJ1dGVfXygodW51c2VkKSkpCit7CisJcmV0dXJuIGZwcmludGYoZnAsICIsICVzID0gJXMiLCBuYW1lLCB2YWwpOworfQorCiBzdGF0aWMgdm9pZCBwcmludF9ldmVudF9kZXNjKHN0cnVjdCBwZXJmX2hlYWRlciAqcGgsIGludCBmZCwgRklMRSAqZnApCiB7CiAJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCAqZXZlbnRzID0gcmVhZF9ldmVudF9kZXNjKHBoLCBmZCk7CkBAIC0xMDY5LDI2ICsxMDc1LDYgQEAKIAlmb3IgKGV2c2VsID0gZXZlbnRzOyBldnNlbC0+YXR0ci5zaXplOyBldnNlbCsrKSB7CiAJCWZwcmludGYoZnAsICIjIGV2ZW50IDogbmFtZSA9ICVzLCAiLCBldnNlbC0+bmFtZSk7CiAKLQkJZnByaW50ZihmcCwgInR5cGUgPSAlZCwgY29uZmlnID0gMHglIlBSSXg2NAotCQkJICAgICIsIGNvbmZpZzEgPSAweCUiUFJJeDY0IiwgY29uZmlnMiA9IDB4JSJQUkl4NjQsCi0JCQkJZXZzZWwtPmF0dHIudHlwZSwKLQkJCQkodTY0KWV2c2VsLT5hdHRyLmNvbmZpZywKLQkJCQkodTY0KWV2c2VsLT5hdHRyLmNvbmZpZzEsCi0JCQkJKHU2NClldnNlbC0+YXR0ci5jb25maWcyKTsKLQotCQlmcHJpbnRmKGZwLCAiLCBleGNsX3VzciA9ICVkLCBleGNsX2tlcm4gPSAlZCIsCi0JCQkJZXZzZWwtPmF0dHIuZXhjbHVkZV91c2VyLAotCQkJCWV2c2VsLT5hdHRyLmV4Y2x1ZGVfa2VybmVsKTsKLQotCQlmcHJpbnRmKGZwLCAiLCBleGNsX2hvc3QgPSAlZCwgZXhjbF9ndWVzdCA9ICVkIiwKLQkJCQlldnNlbC0+YXR0ci5leGNsdWRlX2hvc3QsCi0JCQkJZXZzZWwtPmF0dHIuZXhjbHVkZV9ndWVzdCk7Ci0KLQkJZnByaW50ZihmcCwgIiwgcHJlY2lzZV9pcCA9ICVkIiwgZXZzZWwtPmF0dHIucHJlY2lzZV9pcCk7Ci0KLQkJZnByaW50ZihmcCwgIiwgYXR0cl9tbWFwMiA9ICVkIiwgZXZzZWwtPmF0dHIubW1hcDIpOwotCQlmcHJpbnRmKGZwLCAiLCBhdHRyX21tYXAgID0gJWQiLCBldnNlbC0+YXR0ci5tbWFwKTsKLQkJZnByaW50ZihmcCwgIiwgYXR0cl9tbWFwX2RhdGEgPSAlZCIsIGV2c2VsLT5hdHRyLm1tYXBfZGF0YSk7CiAJCWlmIChldnNlbC0+aWRzKSB7CiAJCQlmcHJpbnRmKGZwLCAiLCBpZCA9IHsiKTsKIAkJCWZvciAoaiA9IDAsIGlkID0gZXZzZWwtPmlkOyBqIDwgZXZzZWwtPmlkczsgaisrLCBpZCsrKSB7CkBAIC0xMDk5LDYgKzEwODUsOCBAQAogCQkJZnByaW50ZihmcCwgIiB9Iik7CiAJCX0KIAorCQlwZXJmX2V2ZW50X2F0dHJfX2ZwcmludGYoZnAsICZldnNlbC0+YXR0ciwgX19kZXNjX2F0dHJfX2ZwcmludGYsIE5VTEwpOworCiAJCWZwdXRjKCdcbicsIGZwKTsKIAl9CiAKQEAgLTEyNjYsNyArMTI1NCw3IEBACiAKIAkJZHNvX19zZXRfYnVpbGRfaWQoZHNvLCAmYmV2LT5idWlsZF9pZCk7CiAKLQkJaWYgKCFpc19rZXJuZWxfbW9kdWxlKGZpbGVuYW1lLCBOVUxMKSkKKwkJaWYgKCFpc19rZXJuZWxfbW9kdWxlKGZpbGVuYW1lKSkKIAkJCWRzby0+a2VybmVsID0gZHNvX3R5cGU7CiAKIAkJYnVpbGRfaWRfX3NwcmludGYoZHNvLT5idWlsZF9pZCwgc2l6ZW9mKGRzby0+YnVpbGRfaWQpLApAQCAtMjUxNiw4ICsyNTA0LDExIEBACiAJCWlmIChyZWFkX2F0dHIoZmQsIGhlYWRlciwgJmZfYXR0cikgPCAwKQogCQkJZ290byBvdXRfZXJybm87CiAKLQkJaWYgKGhlYWRlci0+bmVlZHNfc3dhcCkKKwkJaWYgKGhlYWRlci0+bmVlZHNfc3dhcCkgeworCQkJZl9hdHRyLmlkcy5zaXplICAgPSBic3dhcF82NChmX2F0dHIuaWRzLnNpemUpOworCQkJZl9hdHRyLmlkcy5vZmZzZXQgPSBic3dhcF82NChmX2F0dHIuaWRzLm9mZnNldCk7CiAJCQlwZXJmX2V2ZW50X19hdHRyX3N3YXAoJmZfYXR0ci5hdHRyKTsKKwkJfQogCiAJCXRtcCA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUik7CiAJCWV2c2VsID0gcGVyZl9ldnNlbF9fbmV3KCZmX2F0dHIuYXR0cik7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGlzdC5jIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuYwppbmRleCA3MGI0OGE2Li5jYzIyYjkxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGlzdC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMKQEAgLTI2MywxNSArMjYzLDkgQEAKIAl3aGlsZSAobmV4dCkgewogCQluID0gcmJfZW50cnkobmV4dCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOwogCQluZXh0ID0gcmJfbmV4dCgmbi0+cmJfbm9kZSk7Ci0JCS8qCi0JCSAqIFdlIG1heSBiZSBhbm5vdGF0aW5nIHRoaXMsIGZvciBpbnN0YW5jZSwgc28ga2VlcCBpdCBoZXJlIGluCi0JCSAqIGNhc2Ugc29tZSBpdCBnZXRzIG5ldyBzYW1wbGVzLCB3ZSdsbCBldmVudHVhbGx5IGZyZWUgaXQgd2hlbgotCQkgKiB0aGUgdXNlciBzdG9wcyBicm93c2luZyBhbmQgaXQgYWdhaW5zIGdldHMgZnVsbHkgZGVjYXllZC4KLQkJICovCiAJCWlmICgoKHphcF91c2VyICYmIG4tPmxldmVsID09ICcuJykgfHwKIAkJICAgICAoemFwX2tlcm5lbCAmJiBuLT5sZXZlbCAhPSAnLicpIHx8Ci0JCSAgICAgaGlzdHNfX2RlY2F5X2VudHJ5KGhpc3RzLCBuKSkgJiYKLQkJICAgICFuLT51c2VkKSB7CisJCSAgICAgaGlzdHNfX2RlY2F5X2VudHJ5KGhpc3RzLCBuKSkpIHsKIAkJCWhpc3RzX19kZWxldGVfZW50cnkoaGlzdHMsIG4pOwogCQl9CiAJfQpAQCAtMzU1LDYgKzM0OSw3IEBACiAJCQljYWxsY2hhaW5faW5pdChoZS0+Y2FsbGNoYWluKTsKIAogCQlJTklUX0xJU1RfSEVBRCgmaGUtPnBhaXJzLm5vZGUpOworCQl0aHJlYWRfX2dldChoZS0+dGhyZWFkKTsKIAl9CiAKIAlyZXR1cm4gaGU7CkBAIC05NDEsNiArOTM2LDcgQEAKIAogdm9pZCBoaXN0X2VudHJ5X19kZWxldGUoc3RydWN0IGhpc3RfZW50cnkgKmhlKQogeworCXRocmVhZF9fenB1dChoZS0+dGhyZWFkKTsKIAl6ZnJlZSgmaGUtPmJyYW5jaF9pbmZvKTsKIAl6ZnJlZSgmaGUtPm1lbV9pbmZvKTsKIAl6ZnJlZSgmaGUtPnN0YXRfYWNjKTsKQEAgLTExNjksNiArMTE2NSw3IEBACiAJLyogZm9yY2UgZm9sZCB1bmZpbHRlcmVkIGVudHJ5IGZvciBzaW1wbGljaXR5ICovCiAJaC0+bXMudW5mb2xkZWQgPSBmYWxzZTsKIAloLT5yb3dfb2Zmc2V0ID0gMDsKKwloLT5ucl9yb3dzID0gMDsKIAogCWhpc3RzLT5zdGF0cy5ucl9ub25fZmlsdGVyZWRfc2FtcGxlcyArPSBoLT5zdGF0Lm5yX2V2ZW50czsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuaCBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmgKaW5kZXggMmI2OTBkMC4uOWYzMWI4OSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuaAorKysgYi90b29scy9wZXJmL3V0aWwvaGlzdC5oCkBAIC02MCw3ICs2MCw3IEBACiAJc3RydWN0IHJiX3Jvb3QJCWVudHJpZXNfY29sbGFwc2VkOwogCXU2NAkJCW5yX2VudHJpZXM7CiAJdTY0CQkJbnJfbm9uX2ZpbHRlcmVkX2VudHJpZXM7Ci0JY29uc3Qgc3RydWN0IHRocmVhZAkqdGhyZWFkX2ZpbHRlcjsKKwlzdHJ1Y3QgdGhyZWFkCQkqdGhyZWFkX2ZpbHRlcjsKIAljb25zdCBzdHJ1Y3QgZHNvCSpkc29fZmlsdGVyOwogCWNvbnN0IGNoYXIJCSp1aWRfZmlsdGVyX3N0cjsKIAljb25zdCBjaGFyCQkqc3ltYm9sX2ZpbHRlcl9zdHI7CkBAIC0zMDMsNiArMzAzLDkgQEAKIAogI2lmZGVmIEhBVkVfU0xBTkdfU1VQUE9SVAogI2luY2x1ZGUgIi4uL3VpL2tleXN5bXMuaCIKK2ludCBtYXBfc3ltYm9sX190dWlfYW5ub3RhdGUoc3RydWN0IG1hcF9zeW1ib2wgKm1zLCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkgICAgIHN0cnVjdCBoaXN0X2Jyb3dzZXJfdGltZXIgKmhidCk7CisKIGludCBoaXN0X2VudHJ5X190dWlfYW5ub3RhdGUoc3RydWN0IGhpc3RfZW50cnkgKmhlLCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCiAJCQkgICAgIHN0cnVjdCBoaXN0X2Jyb3dzZXJfdGltZXIgKmhidCk7CiAKQEAgLTMyMSw2ICszMjQsMTIgQEAKIHsKIAlyZXR1cm4gMDsKIH0KK3N0YXRpYyBpbmxpbmUgaW50IG1hcF9zeW1ib2xfX3R1aV9hbm5vdGF0ZShzdHJ1Y3QgbWFwX3N5bWJvbCAqbXMgX19tYXliZV91bnVzZWQsCisJCQkJCSAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCBfX21heWJlX3VudXNlZCwKKwkJCQkJICAgc3RydWN0IGhpc3RfYnJvd3Nlcl90aW1lciAqaGJ0IF9fbWF5YmVfdW51c2VkKQoreworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW5saW5lIGludCBoaXN0X2VudHJ5X190dWlfYW5ub3RhdGUoc3RydWN0IGhpc3RfZW50cnkgKmhlIF9fbWF5YmVfdW51c2VkLAogCQkJCQkgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX19tYXliZV91bnVzZWQsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUtYXNtLmggYi90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUtYXNtLmgKaW5kZXggNjc4OWQ3ODguLjNhM2EwZjEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaAorKysgYi90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUtYXNtLmgKQEAgLTQsNSArNCw2IEBACiAvKiBKdXN0IGRpc2FibGUgaXQgc28gd2UgY2FuIGJ1aWxkIGFyY2gveDg2L2xpYi9tZW1jcHlfNjQuUyBmb3IgcGVyZiBiZW5jaDogKi8KIAogI2RlZmluZSBhbHRpbnN0cnVjdGlvbl9lbnRyeSAjCisjZGVmaW5lIEFMVEVSTkFUSVZFXzIgIwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9rdm0tc3RhdC5oIGIvdG9vbHMvcGVyZi91dGlsL2t2bS1zdGF0LmgKaW5kZXggY2YxZDc5MTMuLmFlODI1ZDQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9rdm0tc3RhdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9rdm0tc3RhdC5oCkBAIC05OSw2ICs5OSw3IEBACiAJaW50IHRpbWVyZmQ7CiAJdW5zaWduZWQgaW50IGRpc3BsYXlfdGltZTsKIAlib29sIGxpdmU7CisJYm9vbCBmb3JjZTsKIH07CiAKIHN0cnVjdCBrdm1fcmVnX2V2ZW50c19vcHMgewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2x6bWEuYyBiL3Rvb2xzL3BlcmYvdXRpbC9sem1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhMWFjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9sem1hLmMKQEAgLTAsMCArMSw5NSBAQAorI2luY2x1ZGUgPGx6bWEuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisKKyNkZWZpbmUgQlVGU0laRSA4MTkyCisKK3N0YXRpYyBjb25zdCBjaGFyICpsem1hX3N0cmVycm9yKGx6bWFfcmV0IHJldCkKK3sKKwlzd2l0Y2ggKChpbnQpIHJldCkgeworCWNhc2UgTFpNQV9NRU1fRVJST1I6CisJCXJldHVybiAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIjsKKwljYXNlIExaTUFfT1BUSU9OU19FUlJPUjoKKwkJcmV0dXJuICJVbnN1cHBvcnRlZCBkZWNvbXByZXNzb3IgZmxhZ3MiOworCWNhc2UgTFpNQV9GT1JNQVRfRVJST1I6CisJCXJldHVybiAiVGhlIGlucHV0IGlzIG5vdCBpbiB0aGUgLnh6IGZvcm1hdCI7CisJY2FzZSBMWk1BX0RBVEFfRVJST1I6CisJCXJldHVybiAiQ29tcHJlc3NlZCBmaWxlIGlzIGNvcnJ1cHQiOworCWNhc2UgTFpNQV9CVUZfRVJST1I6CisJCXJldHVybiAiQ29tcHJlc3NlZCBmaWxlIGlzIHRydW5jYXRlZCBvciBvdGhlcndpc2UgY29ycnVwdCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVbmtub3duIGVycm9yLCBwb3NzaWJseSBhIGJ1ZyI7CisJfQorfQorCitpbnQgbHptYV9kZWNvbXByZXNzX3RvX2ZpbGUoY29uc3QgY2hhciAqaW5wdXQsIGludCBvdXRwdXRfZmQpCit7CisJbHptYV9hY3Rpb24gYWN0aW9uID0gTFpNQV9SVU47CisJbHptYV9zdHJlYW0gc3RybSAgID0gTFpNQV9TVFJFQU1fSU5JVDsKKwlsem1hX3JldCByZXQ7CisKKwl1OCBidWZfaW5bQlVGU0laRV07CisJdTggYnVmX291dFtCVUZTSVpFXTsKKwlGSUxFICppbmZpbGU7CisKKwlpbmZpbGUgPSBmb3BlbihpbnB1dCwgInJiIik7CisJaWYgKCFpbmZpbGUpIHsKKwkJcHJfZXJyKCJsem1hOiBmb3BlbiBmYWlsZWQgb24gJXM6ICclcydcbiIsCisJCSAgICAgICBpbnB1dCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldCA9IGx6bWFfc3RyZWFtX2RlY29kZXIoJnN0cm0sIFVJTlQ2NF9NQVgsIExaTUFfQ09OQ0FURU5BVEVEKTsKKwlpZiAocmV0ICE9IExaTUFfT0spIHsKKwkJcHJfZXJyKCJsem1hOiBsem1hX3N0cmVhbV9kZWNvZGVyIGZhaWxlZCAlcyAoJWQpXG4iLAorCQkJbHptYV9zdHJlcnJvcihyZXQpLCByZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RybS5uZXh0X2luICAgPSBOVUxMOworCXN0cm0uYXZhaWxfaW4gID0gMDsKKwlzdHJtLm5leHRfb3V0ICA9IGJ1Zl9vdXQ7CisJc3RybS5hdmFpbF9vdXQgPSBzaXplb2YoYnVmX291dCk7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoc3RybS5hdmFpbF9pbiA9PSAwICYmICFmZW9mKGluZmlsZSkpIHsKKwkJCXN0cm0ubmV4dF9pbiAgPSBidWZfaW47CisJCQlzdHJtLmF2YWlsX2luID0gZnJlYWQoYnVmX2luLCAxLCBzaXplb2YoYnVmX2luKSwgaW5maWxlKTsKKworCQkJaWYgKGZlcnJvcihpbmZpbGUpKSB7CisJCQkJcHJfZXJyKCJsem1hOiByZWFkIGVycm9yOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisKKwkJCWlmIChmZW9mKGluZmlsZSkpCisJCQkJYWN0aW9uID0gTFpNQV9GSU5JU0g7CisJCX0KKworCQlyZXQgPSBsem1hX2NvZGUoJnN0cm0sIGFjdGlvbik7CisKKwkJaWYgKHN0cm0uYXZhaWxfb3V0ID09IDAgfHwgcmV0ID09IExaTUFfU1RSRUFNX0VORCkgeworCQkJc3NpemVfdCB3cml0ZV9zaXplID0gc2l6ZW9mKGJ1Zl9vdXQpIC0gc3RybS5hdmFpbF9vdXQ7CisKKwkJCWlmICh3cml0ZW4ob3V0cHV0X2ZkLCBidWZfb3V0LCB3cml0ZV9zaXplKSAhPSB3cml0ZV9zaXplKSB7CisJCQkJcHJfZXJyKCJsem1hOiB3cml0ZSBlcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlzdHJtLm5leHRfb3V0ICA9IGJ1Zl9vdXQ7CisJCQlzdHJtLmF2YWlsX291dCA9IHNpemVvZihidWZfb3V0KTsKKwkJfQorCisJCWlmIChyZXQgIT0gTFpNQV9PSykgeworCQkJaWYgKHJldCA9PSBMWk1BX1NUUkVBTV9FTkQpCisJCQkJcmV0dXJuIDA7CisKKwkJCXByX2VycigibHptYTogZmFpbGVkICVzXG4iLCBsem1hX3N0cmVycm9yKHJldCkpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJZmNsb3NlKGluZmlsZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFjaGluZS5jIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuYwppbmRleCAxYmNhM2E5Li41MjdlMDMyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvbWFjaGluZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmMKQEAgLTg5LDE2ICs4OSw2IEBACiAJfQogfQogCi12b2lkIG1hY2hpbmVfX2RlbGV0ZV9kZWFkX3RocmVhZHMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCi17Ci0Jc3RydWN0IHRocmVhZCAqbiwgKnQ7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodCwgbiwgJm1hY2hpbmUtPmRlYWRfdGhyZWFkcywgbm9kZSkgewotCQlsaXN0X2RlbCgmdC0+bm9kZSk7Ci0JCXRocmVhZF9fZGVsZXRlKHQpOwotCX0KLX0KLQogdm9pZCBtYWNoaW5lX19kZWxldGVfdGhyZWFkcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQgPSByYl9maXJzdCgmbWFjaGluZS0+dGhyZWFkcyk7CkBAIC0xMDYsOSArOTYsOCBAQAogCXdoaWxlIChuZCkgewogCQlzdHJ1Y3QgdGhyZWFkICp0ID0gcmJfZW50cnkobmQsIHN0cnVjdCB0aHJlYWQsIHJiX25vZGUpOwogCi0JCXJiX2VyYXNlKCZ0LT5yYl9ub2RlLCAmbWFjaGluZS0+dGhyZWFkcyk7CiAJCW5kID0gcmJfbmV4dChuZCk7Ci0JCXRocmVhZF9fZGVsZXRlKHQpOworCQltYWNoaW5lX19yZW1vdmVfdGhyZWFkKG1hY2hpbmUsIHQpOwogCX0KIH0KIApAQCAtMzYxLDkgKzM1MCwxMyBAQAogCSAqIHRoZSBmdWxsIHJidHJlZToKIAkgKi8KIAl0aCA9IG1hY2hpbmUtPmxhc3RfbWF0Y2g7Ci0JaWYgKHRoICYmIHRoLT50aWQgPT0gdGlkKSB7Ci0JCW1hY2hpbmVfX3VwZGF0ZV90aHJlYWRfcGlkKG1hY2hpbmUsIHRoLCBwaWQpOwotCQlyZXR1cm4gdGg7CisJaWYgKHRoICE9IE5VTEwpIHsKKwkJaWYgKHRoLT50aWQgPT0gdGlkKSB7CisJCQltYWNoaW5lX191cGRhdGVfdGhyZWFkX3BpZChtYWNoaW5lLCB0aCwgcGlkKTsKKwkJCXJldHVybiB0aDsKKwkJfQorCisJCXRocmVhZF9fenB1dChtYWNoaW5lLT5sYXN0X21hdGNoKTsKIAl9CiAKIAl3aGlsZSAoKnAgIT0gTlVMTCkgewpAQCAtMzcxLDcgKzM2NCw3IEBACiAJCXRoID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgdGhyZWFkLCByYl9ub2RlKTsKIAogCQlpZiAodGgtPnRpZCA9PSB0aWQpIHsKLQkJCW1hY2hpbmUtPmxhc3RfbWF0Y2ggPSB0aDsKKwkJCW1hY2hpbmUtPmxhc3RfbWF0Y2ggPSB0aHJlYWRfX2dldCh0aCk7CiAJCQltYWNoaW5lX191cGRhdGVfdGhyZWFkX3BpZChtYWNoaW5lLCB0aCwgcGlkKTsKIAkJCXJldHVybiB0aDsKIAkJfQpAQCAtNDAzLDggKzM5NiwxMSBAQAogCQkJdGhyZWFkX19kZWxldGUodGgpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQotCQltYWNoaW5lLT5sYXN0X21hdGNoID0gdGg7CisJCS8qCisJCSAqIEl0IGlzIG5vdyBpbiB0aGUgcmJ0cmVlLCBnZXQgYSByZWYKKwkJICovCisJCXRocmVhZF9fZ2V0KHRoKTsKKwkJbWFjaGluZS0+bGFzdF9tYXRjaCA9IHRocmVhZF9fZ2V0KHRoKTsKIAl9CiAKIAlyZXR1cm4gdGg7CkBAIC00NjIsMzAgKzQ1OCw2MSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IGRzbyoKK21hY2hpbmVfX21vZHVsZV9kc28oc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHN0cnVjdCBrbW9kX3BhdGggKm0sCisJCSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3QgZHNvICpkc287CisKKwlkc28gPSBkc29zX19maW5kKCZtYWNoaW5lLT5rZXJuZWxfZHNvcywgbS0+bmFtZSwgdHJ1ZSk7CisJaWYgKCFkc28pIHsKKwkJZHNvID0gZHNvc19fYWRkbmV3KCZtYWNoaW5lLT5rZXJuZWxfZHNvcywgbS0+bmFtZSk7CisJCWlmIChkc28gPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCisJCWlmIChtYWNoaW5lX19pc19ob3N0KG1hY2hpbmUpKQorCQkJZHNvLT5zeW10YWJfdHlwZSA9IERTT19CSU5BUllfVFlQRV9fU1lTVEVNX1BBVEhfS01PRFVMRTsKKwkJZWxzZQorCQkJZHNvLT5zeW10YWJfdHlwZSA9IERTT19CSU5BUllfVFlQRV9fR1VFU1RfS01PRFVMRTsKKworCQkvKiBfS01PRFVMRV9DT01QIHNob3VsZCBiZSBuZXh0IHRvIF9LTU9EVUxFICovCisJCWlmIChtLT5rbW9kICYmIG0tPmNvbXApCisJCQlkc28tPnN5bXRhYl90eXBlKys7CisKKwkJZHNvX19zZXRfc2hvcnRfbmFtZShkc28sIHN0cmR1cChtLT5uYW1lKSwgdHJ1ZSk7CisJCWRzb19fc2V0X2xvbmdfbmFtZShkc28sIHN0cmR1cChmaWxlbmFtZSksIHRydWUpOworCX0KKworCXJldHVybiBkc287Cit9CisKIHN0cnVjdCBtYXAgKm1hY2hpbmVfX25ld19tb2R1bGUoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHU2NCBzdGFydCwKIAkJCQljb25zdCBjaGFyICpmaWxlbmFtZSkKIHsKLQlzdHJ1Y3QgbWFwICptYXA7Ci0Jc3RydWN0IGRzbyAqZHNvID0gX19kc29zX19maW5kbmV3KCZtYWNoaW5lLT5rZXJuZWxfZHNvcywgZmlsZW5hbWUpOwotCWJvb2wgY29tcHJlc3NlZDsKKwlzdHJ1Y3QgbWFwICptYXAgPSBOVUxMOworCXN0cnVjdCBkc28gKmRzbzsKKwlzdHJ1Y3Qga21vZF9wYXRoIG07CiAKLQlpZiAoZHNvID09IE5VTEwpCisJaWYgKGttb2RfcGF0aF9fcGFyc2VfbmFtZSgmbSwgZmlsZW5hbWUpKQogCQlyZXR1cm4gTlVMTDsKIAorCW1hcCA9IG1hcF9ncm91cHNfX2ZpbmRfYnlfbmFtZSgmbWFjaGluZS0+a21hcHMsIE1BUF9fRlVOQ1RJT04sCisJCQkJICAgICAgIG0ubmFtZSk7CisJaWYgKG1hcCkKKwkJZ290byBvdXQ7CisKKwlkc28gPSBtYWNoaW5lX19tb2R1bGVfZHNvKG1hY2hpbmUsICZtLCBmaWxlbmFtZSk7CisJaWYgKGRzbyA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwogCW1hcCA9IG1hcF9fbmV3MihzdGFydCwgZHNvLCBNQVBfX0ZVTkNUSU9OKTsKIAlpZiAobWFwID09IE5VTEwpCi0JCXJldHVybiBOVUxMOwotCi0JaWYgKG1hY2hpbmVfX2lzX2hvc3QobWFjaGluZSkpCi0JCWRzby0+c3ltdGFiX3R5cGUgPSBEU09fQklOQVJZX1RZUEVfX1NZU1RFTV9QQVRIX0tNT0RVTEU7Ci0JZWxzZQotCQlkc28tPnN5bXRhYl90eXBlID0gRFNPX0JJTkFSWV9UWVBFX19HVUVTVF9LTU9EVUxFOwotCi0JLyogX0tNT0RVTEVfQ09NUCBzaG91bGQgYmUgbmV4dCB0byBfS01PRFVMRSAqLwotCWlmIChpc19rZXJuZWxfbW9kdWxlKGZpbGVuYW1lLCAmY29tcHJlc3NlZCkgJiYgY29tcHJlc3NlZCkKLQkJZHNvLT5zeW10YWJfdHlwZSsrOworCQlnb3RvIG91dDsKIAogCW1hcF9ncm91cHNfX2luc2VydCgmbWFjaGluZS0+a21hcHMsIG1hcCk7CisKK291dDoKKwlmcmVlKG0ubmFtZSk7CiAJcmV0dXJuIG1hcDsKIH0KIApAQCAtNjUwLDYgKzY3Nyw5IEBACiAJCQltYWNoaW5lLT52bWxpbnV4X21hcHNbdHlwZV0tPnVubWFwX2lwID0KIAkJCQlpZGVudGl0eV9fbWFwX2lwOwogCQlrbWFwID0gbWFwX19rbWFwKG1hY2hpbmUtPnZtbGludXhfbWFwc1t0eXBlXSk7CisJCWlmICgha21hcCkKKwkJCXJldHVybiAtMTsKKwogCQlrbWFwLT5rbWFwcyA9ICZtYWNoaW5lLT5rbWFwczsKIAkJbWFwX2dyb3Vwc19faW5zZXJ0KCZtYWNoaW5lLT5rbWFwcywKIAkJCQkgICBtYWNoaW5lLT52bWxpbnV4X21hcHNbdHlwZV0pOwpAQCAtNjcxLDcgKzcwMSw3IEBACiAJCWttYXAgPSBtYXBfX2ttYXAobWFjaGluZS0+dm1saW51eF9tYXBzW3R5cGVdKTsKIAkJbWFwX2dyb3Vwc19fcmVtb3ZlKCZtYWNoaW5lLT5rbWFwcywKIAkJCQkgICBtYWNoaW5lLT52bWxpbnV4X21hcHNbdHlwZV0pOwotCQlpZiAoa21hcC0+cmVmX3JlbG9jX3N5bSkgeworCQlpZiAoa21hcCAmJiBrbWFwLT5yZWZfcmVsb2Nfc3ltKSB7CiAJCQkvKgogCQkJICogcmVmX3JlbG9jX3N5bSBpcyBzaGFyZWQgYW1vbmcgYWxsIG1hcHMsIHNvIGZyZWUganVzdAogCQkJICogb24gb25lIG9mIHRoZW0uCkBAIC04MjcsNiArODU3LDM5IEBACiAJcmV0dXJuIHN0cmR1cChuYW1lKTsKIH0KIAorc3RhdGljIGJvb2wgaXNfa21vZF9kc28oc3RydWN0IGRzbyAqZHNvKQoreworCXJldHVybiBkc28tPnN5bXRhYl90eXBlID09IERTT19CSU5BUllfVFlQRV9fU1lTVEVNX1BBVEhfS01PRFVMRSB8fAorCSAgICAgICBkc28tPnN5bXRhYl90eXBlID09IERTT19CSU5BUllfVFlQRV9fR1VFU1RfS01PRFVMRTsKK30KKworc3RhdGljIGludCBtYXBfZ3JvdXBzX19zZXRfbW9kdWxlX3BhdGgoc3RydWN0IG1hcF9ncm91cHMgKm1nLCBjb25zdCBjaGFyICpwYXRoLAorCQkJCSAgICAgICBzdHJ1Y3Qga21vZF9wYXRoICptKQoreworCXN0cnVjdCBtYXAgKm1hcDsKKwljaGFyICpsb25nX25hbWU7CisKKwltYXAgPSBtYXBfZ3JvdXBzX19maW5kX2J5X25hbWUobWcsIE1BUF9fRlVOQ1RJT04sIG0tPm5hbWUpOworCWlmIChtYXAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlsb25nX25hbWUgPSBzdHJkdXAocGF0aCk7CisJaWYgKGxvbmdfbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRzb19fc2V0X2xvbmdfbmFtZShtYXAtPmRzbywgbG9uZ19uYW1lLCB0cnVlKTsKKwlkc29fX2tlcm5lbF9tb2R1bGVfZ2V0X2J1aWxkX2lkKG1hcC0+ZHNvLCAiIik7CisKKwkvKgorCSAqIEZ1bGwgbmFtZSBjb3VsZCByZXZlYWwgdXMga21vZCBjb21wcmVzc2lvbiwgc28KKwkgKiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3ltdGFiX3R5cGUgaWYgbmVlZGVkLgorCSAqLworCWlmIChtLT5jb21wICYmIGlzX2ttb2RfZHNvKG1hcC0+ZHNvKSkKKwkJbWFwLT5kc28tPnN5bXRhYl90eXBlKys7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBtYXBfZ3JvdXBzX19zZXRfbW9kdWxlc19wYXRoX2RpcihzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcsCiAJCQkJY29uc3QgY2hhciAqZGlyX25hbWUsIGludCBkZXB0aCkKIHsKQEAgLTg2NSwzNSArOTI4LDE5IEBACiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIAkJfSBlbHNlIHsKLQkJCWNoYXIgKmRvdCA9IHN0cnJjaHIoZGVudC0+ZF9uYW1lLCAnLicpLAotCQkJICAgICBkc29fbmFtZVtQQVRIX01BWF07Ci0JCQlzdHJ1Y3QgbWFwICptYXA7Ci0JCQljaGFyICpsb25nX25hbWU7CisJCQlzdHJ1Y3Qga21vZF9wYXRoIG07CiAKLQkJCWlmIChkb3QgPT0gTlVMTCkKLQkJCQljb250aW51ZTsKLQotCQkJLyogT24gc29tZSBzeXN0ZW0sIG1vZHVsZXMgYXJlIGNvbXByZXNzZWQgbGlrZSAua28uZ3ogKi8KLQkJCWlmIChpc19zdXBwb3J0ZWRfY29tcHJlc3Npb24oZG90ICsgMSkgJiYKLQkJCSAgICBpc19rbW9kdWxlX2V4dGVuc2lvbihkb3QgLSAyKSkKLQkJCQlkb3QgLT0gMzsKLQotCQkJc25wcmludGYoZHNvX25hbWUsIHNpemVvZihkc29fbmFtZSksICJbJS4qc10iLAotCQkJCSAoaW50KShkb3QgLSBkZW50LT5kX25hbWUpLCBkZW50LT5kX25hbWUpOwotCi0JCQlzdHJ4ZnJjaGFyKGRzb19uYW1lLCAnLScsICdfJyk7Ci0JCQltYXAgPSBtYXBfZ3JvdXBzX19maW5kX2J5X25hbWUobWcsIE1BUF9fRlVOQ1RJT04sCi0JCQkJCQkgICAgICAgZHNvX25hbWUpOwotCQkJaWYgKG1hcCA9PSBOVUxMKQotCQkJCWNvbnRpbnVlOwotCi0JCQlsb25nX25hbWUgPSBzdHJkdXAocGF0aCk7Ci0JCQlpZiAobG9uZ19uYW1lID09IE5VTEwpIHsKLQkJCQlyZXQgPSAtMTsKKwkJCXJldCA9IGttb2RfcGF0aF9fcGFyc2VfbmFtZSgmbSwgZGVudC0+ZF9uYW1lKTsKKwkJCWlmIChyZXQpCiAJCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlkc29fX3NldF9sb25nX25hbWUobWFwLT5kc28sIGxvbmdfbmFtZSwgdHJ1ZSk7Ci0JCQlkc29fX2tlcm5lbF9tb2R1bGVfZ2V0X2J1aWxkX2lkKG1hcC0+ZHNvLCAiIik7CisKKwkJCWlmIChtLmttb2QpCisJCQkJcmV0ID0gbWFwX2dyb3Vwc19fc2V0X21vZHVsZV9wYXRoKG1nLCBwYXRoLCAmbSk7CisKKwkJCWZyZWUobS5uYW1lKTsKKworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dDsKIAkJfQogCX0KIApAQCAtMTA0Niw0MCArMTA5MywxMSBAQAogCQkJCXN0cmxlbihrbW1hcF9wcmVmaXgpIC0gMSkgPT0gMDsKIAlpZiAoZXZlbnQtPm1tYXAuZmlsZW5hbWVbMF0gPT0gJy8nIHx8CiAJICAgICghaXNfa2VybmVsX21tYXAgJiYgZXZlbnQtPm1tYXAuZmlsZW5hbWVbMF0gPT0gJ1snKSkgewotCi0JCWNoYXIgc2hvcnRfbW9kdWxlX25hbWVbMTAyNF07Ci0JCWNoYXIgKm5hbWUsICpkb3Q7Ci0KLQkJaWYgKGV2ZW50LT5tbWFwLmZpbGVuYW1lWzBdID09ICcvJykgewotCQkJbmFtZSA9IHN0cnJjaHIoZXZlbnQtPm1tYXAuZmlsZW5hbWUsICcvJyk7Ci0JCQlpZiAobmFtZSA9PSBOVUxMKQotCQkJCWdvdG8gb3V0X3Byb2JsZW07Ci0KLQkJCSsrbmFtZTsgLyogc2tpcCAvICovCi0JCQlkb3QgPSBzdHJyY2hyKG5hbWUsICcuJyk7Ci0JCQlpZiAoZG90ID09IE5VTEwpCi0JCQkJZ290byBvdXRfcHJvYmxlbTsKLQkJCS8qIE9uIHNvbWUgc3lzdGVtLCBtb2R1bGVzIGFyZSBjb21wcmVzc2VkIGxpa2UgLmtvLmd6ICovCi0JCQlpZiAoaXNfc3VwcG9ydGVkX2NvbXByZXNzaW9uKGRvdCArIDEpKQotCQkJCWRvdCAtPSAzOwotCQkJaWYgKCFpc19rbW9kdWxlX2V4dGVuc2lvbihkb3QgKyAxKSkKLQkJCQlnb3RvIG91dF9wcm9ibGVtOwotCQkJc25wcmludGYoc2hvcnRfbW9kdWxlX25hbWUsIHNpemVvZihzaG9ydF9tb2R1bGVfbmFtZSksCi0JCQkJCSJbJS4qc10iLCAoaW50KShkb3QgLSBuYW1lKSwgbmFtZSk7Ci0JCQlzdHJ4ZnJjaGFyKHNob3J0X21vZHVsZV9uYW1lLCAnLScsICdfJyk7Ci0JCX0gZWxzZQotCQkJc3RyY3B5KHNob3J0X21vZHVsZV9uYW1lLCBldmVudC0+bW1hcC5maWxlbmFtZSk7Ci0KIAkJbWFwID0gbWFjaGluZV9fbmV3X21vZHVsZShtYWNoaW5lLCBldmVudC0+bW1hcC5zdGFydCwKIAkJCQkJICBldmVudC0+bW1hcC5maWxlbmFtZSk7CiAJCWlmIChtYXAgPT0gTlVMTCkKIAkJCWdvdG8gb3V0X3Byb2JsZW07CiAKLQkJbmFtZSA9IHN0cmR1cChzaG9ydF9tb2R1bGVfbmFtZSk7Ci0JCWlmIChuYW1lID09IE5VTEwpCi0JCQlnb3RvIG91dF9wcm9ibGVtOwotCi0JCWRzb19fc2V0X3Nob3J0X25hbWUobWFwLT5kc28sIG5hbWUsIHRydWUpOwogCQltYXAtPmVuZCA9IG1hcC0+c3RhcnQgKyBldmVudC0+bW1hcC5sZW47CiAJfSBlbHNlIGlmIChpc19rZXJuZWxfbW1hcCkgewogCQljb25zdCBjaGFyICpzeW1ib2xfbmFtZSA9IChldmVudC0+bW1hcC5maWxlbmFtZSArCkBAIC0xMDkyLDcgKzExMTAsNyBAQAogCQlzdHJ1Y3QgZHNvICpkc287CiAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShkc28sICZtYWNoaW5lLT5rZXJuZWxfZHNvcy5oZWFkLCBub2RlKSB7Ci0JCQlpZiAoaXNfa2VybmVsX21vZHVsZShkc28tPmxvbmdfbmFtZSwgTlVMTCkpCisJCQlpZiAoaXNfa2VybmVsX21vZHVsZShkc28tPmxvbmdfbmFtZSkpCiAJCQkJY29udGludWU7CiAKIAkJCWtlcm5lbCA9IGRzbzsKQEAgLTEyMzYsMTUgKzEyNTQsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWFjaGluZV9fcmVtb3ZlX3RocmVhZChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgc3RydWN0IHRocmVhZCAqdGgpCit2b2lkIG1hY2hpbmVfX3JlbW92ZV90aHJlYWQoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHN0cnVjdCB0aHJlYWQgKnRoKQogewotCW1hY2hpbmUtPmxhc3RfbWF0Y2ggPSBOVUxMOworCWlmIChtYWNoaW5lLT5sYXN0X21hdGNoID09IHRoKQorCQl0aHJlYWRfX3pwdXQobWFjaGluZS0+bGFzdF9tYXRjaCk7CisKIAlyYl9lcmFzZSgmdGgtPnJiX25vZGUsICZtYWNoaW5lLT50aHJlYWRzKTsKIAkvKgotCSAqIFdlIG1heSBoYXZlIHJlZmVyZW5jZXMgdG8gdGhpcyB0aHJlYWQsIGZvciBpbnN0YW5jZSBpbiBzb21lIGhpc3RfZW50cnkKLQkgKiBpbnN0YW5jZXMsIHNvIGp1c3QgbW92ZSB0aGVtIHRvIGEgc2VwYXJhdGUgbGlzdC4KKwkgKiBNb3ZlIGl0IGZpcnN0IHRvIHRoZSBkZWFkX3RocmVhZHMgbGlzdCwgdGhlbiBkcm9wIHRoZSByZWZlcmVuY2UsCisJICogaWYgdGhpcyBpcyB0aGUgbGFzdCByZWZlcmVuY2UsIHRoZW4gdGhlIHRocmVhZF9fZGVsZXRlIGRlc3RydWN0b3IKKwkgKiB3aWxsIGJlIGNhbGxlZCBhbmQgd2Ugd2lsbCByZW1vdmUgaXQgZnJvbSB0aGUgZGVhZF90aHJlYWRzIGxpc3QuCiAJICovCiAJbGlzdF9hZGRfdGFpbCgmdGgtPm5vZGUsICZtYWNoaW5lLT5kZWFkX3RocmVhZHMpOworCXRocmVhZF9fcHV0KHRoKTsKIH0KIAogaW50IG1hY2hpbmVfX3Byb2Nlc3NfZm9ya19ldmVudChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCkBAIC0xMzg3LDI5ICsxNDA5LDI3IEBACiBzdGF0aWMgaW50IGFkZF9jYWxsY2hhaW5faXAoc3RydWN0IHRocmVhZCAqdGhyZWFkLAogCQkJICAgIHN0cnVjdCBzeW1ib2wgKipwYXJlbnQsCiAJCQkgICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKnJvb3RfYWwsCi0JCQkgICAgYm9vbCBicmFuY2hfaGlzdG9yeSwKKwkJCSAgICB1OCAqY3B1bW9kZSwKIAkJCSAgICB1NjQgaXApCiB7CiAJc3RydWN0IGFkZHJfbG9jYXRpb24gYWw7CiAKIAlhbC5maWx0ZXJlZCA9IDA7CiAJYWwuc3ltID0gTlVMTDsKLQlpZiAoYnJhbmNoX2hpc3RvcnkpCisJaWYgKCFjcHVtb2RlKSB7CiAJCXRocmVhZF9fZmluZF9jcHVtb2RlX2FkZHJfbG9jYXRpb24odGhyZWFkLCBNQVBfX0ZVTkNUSU9OLAogCQkJCQkJICAgaXAsICZhbCk7Ci0JZWxzZSB7Ci0JCXU4IGNwdW1vZGUgPSBQRVJGX1JFQ09SRF9NSVNDX1VTRVI7Ci0KKwl9IGVsc2UgewogCQlpZiAoaXAgPj0gUEVSRl9DT05URVhUX01BWCkgewogCQkJc3dpdGNoIChpcCkgewogCQkJY2FzZSBQRVJGX0NPTlRFWFRfSFY6Ci0JCQkJY3B1bW9kZSA9IFBFUkZfUkVDT1JEX01JU0NfSFlQRVJWSVNPUjsKKwkJCQkqY3B1bW9kZSA9IFBFUkZfUkVDT1JEX01JU0NfSFlQRVJWSVNPUjsKIAkJCQlicmVhazsKIAkJCWNhc2UgUEVSRl9DT05URVhUX0tFUk5FTDoKLQkJCQljcHVtb2RlID0gUEVSRl9SRUNPUkRfTUlTQ19LRVJORUw7CisJCQkJKmNwdW1vZGUgPSBQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTDsKIAkJCQlicmVhazsKIAkJCWNhc2UgUEVSRl9DT05URVhUX1VTRVI6Ci0JCQkJY3B1bW9kZSA9IFBFUkZfUkVDT1JEX01JU0NfVVNFUjsKKwkJCQkqY3B1bW9kZSA9IFBFUkZfUkVDT1JEX01JU0NfVVNFUjsKIAkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJcHJfZGVidWcoImludmFsaWQgY2FsbGNoYWluIGNvbnRleHQ6ICIKQEAgLTE0MjMsOCArMTQ0Myw4IEBACiAJCQl9CiAJCQlyZXR1cm4gMDsKIAkJfQotCQl0aHJlYWRfX2ZpbmRfYWRkcl9sb2NhdGlvbih0aHJlYWQsIGNwdW1vZGUsIE1BUF9fRlVOQ1RJT04sCi0JCQkJICAgaXAsICZhbCk7CisJCXRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHRocmVhZCwgKmNwdW1vZGUsIE1BUF9fRlVOQ1RJT04sCisJCQkJCSAgIGlwLCAmYWwpOwogCX0KIAogCWlmIChhbC5zeW0gIT0gTlVMTCkgewpAQCAtMTUwMiwxOCArMTUyMiwxMDIgQEAKIAlyZXR1cm4gbnI7CiB9CiAKLXN0YXRpYyBpbnQgdGhyZWFkX19yZXNvbHZlX2NhbGxjaGFpbl9zYW1wbGUoc3RydWN0IHRocmVhZCAqdGhyZWFkLAotCQkJCQkgICAgIHN0cnVjdCBpcF9jYWxsY2hhaW4gKmNoYWluLAotCQkJCQkgICAgIHN0cnVjdCBicmFuY2hfc3RhY2sgKmJyYW5jaCwKLQkJCQkJICAgICBzdHJ1Y3Qgc3ltYm9sICoqcGFyZW50LAotCQkJCQkgICAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICpyb290X2FsLAotCQkJCQkgICAgIGludCBtYXhfc3RhY2spCisvKgorICogUmVjb2x2ZSBMQlIgY2FsbHN0YWNrIGNoYWluIHNhbXBsZQorICogUmV0dXJuOgorICogMSBvbiBzdWNjZXNzIGdldCBMQlIgY2FsbGNoYWluIGluZm9ybWF0aW9uCisgKiAwIG5vIGF2YWlsYWJsZSBMQlIgY2FsbGNoYWluIGluZm9ybWF0aW9uLCBzaG91bGQgdHJ5IGZwCisgKiBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIG90aGVyIGVycm9ycy4KKyAqLworc3RhdGljIGludCByZXNvbHZlX2xicl9jYWxsY2hhaW5fc2FtcGxlKHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKKwkJCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkJCXN0cnVjdCBzeW1ib2wgKipwYXJlbnQsCisJCQkJCXN0cnVjdCBhZGRyX2xvY2F0aW9uICpyb290X2FsLAorCQkJCQlpbnQgbWF4X3N0YWNrKQogeworCXN0cnVjdCBpcF9jYWxsY2hhaW4gKmNoYWluID0gc2FtcGxlLT5jYWxsY2hhaW47CiAJaW50IGNoYWluX25yID0gbWluKG1heF9zdGFjaywgKGludCljaGFpbi0+bnIpOworCXU4IGNwdW1vZGUgPSBQRVJGX1JFQ09SRF9NSVNDX1VTRVI7CisJaW50IGksIGosIGVycjsKKwl1NjQgaXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hhaW5fbnI7IGkrKykgeworCQlpZiAoY2hhaW4tPmlwc1tpXSA9PSBQRVJGX0NPTlRFWFRfVVNFUikKKwkJCWJyZWFrOworCX0KKworCS8qIExCUiBvbmx5IGFmZmVjdHMgdGhlIHVzZXIgY2FsbGNoYWluICovCisJaWYgKGkgIT0gY2hhaW5fbnIpIHsKKwkJc3RydWN0IGJyYW5jaF9zdGFjayAqbGJyX3N0YWNrID0gc2FtcGxlLT5icmFuY2hfc3RhY2s7CisJCWludCBsYnJfbnIgPSBsYnJfc3RhY2stPm5yOworCQkvKgorCQkgKiBMQlIgY2FsbHN0YWNrIGNhbiBvbmx5IGdldCB1c2VyIGNhbGwgY2hhaW4uCisJCSAqIFRoZSBtaXhfY2hhaW5fbnIgaXMga2VybmVsIGNhbGwgY2hhaW4KKwkJICogbnVtYmVyIHBsdXMgTEJSIHVzZXIgY2FsbCBjaGFpbiBudW1iZXIuCisJCSAqIGkgaXMga2VybmVsIGNhbGwgY2hhaW4gbnVtYmVyLAorCQkgKiAxIGlzIFBFUkZfQ09OVEVYVF9VU0VSLAorCQkgKiBsYnJfbnIgKyAxIGlzIHRoZSB1c2VyIGNhbGwgY2hhaW4gbnVtYmVyLgorCQkgKiBGb3IgZGV0YWlscywgcGxlYXNlIHJlZmVyIHRvIHRoZSBjb21tZW50cworCQkgKiBpbiBjYWxsY2hhaW5fX3ByaW50ZgorCQkgKi8KKwkJaW50IG1peF9jaGFpbl9uciA9IGkgKyAxICsgbGJyX25yICsgMTsKKworCQlpZiAobWl4X2NoYWluX25yID4gUEVSRl9NQVhfU1RBQ0tfREVQVEggKyBQRVJGX01BWF9CUkFOQ0hfREVQVEgpIHsKKwkJCXByX3dhcm5pbmcoImNvcnJ1cHRlZCBjYWxsY2hhaW4uIHNraXBwaW5nLi4uXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJZm9yIChqID0gMDsgaiA8IG1peF9jaGFpbl9ucjsgaisrKSB7CisJCQlpZiAoY2FsbGNoYWluX3BhcmFtLm9yZGVyID09IE9SREVSX0NBTExFRSkgeworCQkJCWlmIChqIDwgaSArIDEpCisJCQkJCWlwID0gY2hhaW4tPmlwc1tqXTsKKwkJCQllbHNlIGlmIChqID4gaSArIDEpCisJCQkJCWlwID0gbGJyX3N0YWNrLT5lbnRyaWVzW2ogLSBpIC0gMl0uZnJvbTsKKwkJCQllbHNlCisJCQkJCWlwID0gbGJyX3N0YWNrLT5lbnRyaWVzWzBdLnRvOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaiA8IGxicl9ucikKKwkJCQkJaXAgPSBsYnJfc3RhY2stPmVudHJpZXNbbGJyX25yIC0gaiAtIDFdLmZyb207CisJCQkJZWxzZSBpZiAoaiA+IGxicl9ucikKKwkJCQkJaXAgPSBjaGFpbi0+aXBzW2kgKyAxIC0gKGogLSBsYnJfbnIpXTsKKwkJCQllbHNlCisJCQkJCWlwID0gbGJyX3N0YWNrLT5lbnRyaWVzWzBdLnRvOworCQkJfQorCisJCQllcnIgPSBhZGRfY2FsbGNoYWluX2lwKHRocmVhZCwgcGFyZW50LCByb290X2FsLCAmY3B1bW9kZSwgaXApOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aHJlYWRfX3Jlc29sdmVfY2FsbGNoYWluX3NhbXBsZShzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCisJCQkJCSAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkJCSAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCQkJICAgIHN0cnVjdCBzeW1ib2wgKipwYXJlbnQsCisJCQkJCSAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqcm9vdF9hbCwKKwkJCQkJICAgIGludCBtYXhfc3RhY2spCit7CisJc3RydWN0IGJyYW5jaF9zdGFjayAqYnJhbmNoID0gc2FtcGxlLT5icmFuY2hfc3RhY2s7CisJc3RydWN0IGlwX2NhbGxjaGFpbiAqY2hhaW4gPSBzYW1wbGUtPmNhbGxjaGFpbjsKKwlpbnQgY2hhaW5fbnIgPSBtaW4obWF4X3N0YWNrLCAoaW50KWNoYWluLT5ucik7CisJdTggY3B1bW9kZSA9IFBFUkZfUkVDT1JEX01JU0NfVVNFUjsKIAlpbnQgaSwgaiwgZXJyOwogCWludCBza2lwX2lkeCA9IC0xOwogCWludCBmaXJzdF9jYWxsID0gMDsKIAorCWNhbGxjaGFpbl9jdXJzb3JfcmVzZXQoJmNhbGxjaGFpbl9jdXJzb3IpOworCisJaWYgKGhhc19icmFuY2hfY2FsbHN0YWNrKGV2c2VsKSkgeworCQllcnIgPSByZXNvbHZlX2xicl9jYWxsY2hhaW5fc2FtcGxlKHRocmVhZCwgc2FtcGxlLCBwYXJlbnQsCisJCQkJCQkgICByb290X2FsLCBtYXhfc3RhY2spOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IDA7CisJfQorCiAJLyoKIAkgKiBCYXNlZCBvbiBEV0FSRiBkZWJ1ZyBpbmZvcm1hdGlvbiwgc29tZSBhcmNoaXRlY3R1cmVzIHNraXAKIAkgKiBhIGNhbGxjaGFpbiBlbnRyeSBzYXZlZCBieSB0aGUga2VybmVsLgpAQCAtMTUyMSw4ICsxNjI1LDYgQEAKIAlpZiAoY2hhaW4tPm5yIDwgUEVSRl9NQVhfU1RBQ0tfREVQVEgpCiAJCXNraXBfaWR4ID0gYXJjaF9za2lwX2NhbGxjaGFpbl9pZHgodGhyZWFkLCBjaGFpbik7CiAKLQljYWxsY2hhaW5fY3Vyc29yX3Jlc2V0KCZjYWxsY2hhaW5fY3Vyc29yKTsKLQogCS8qCiAJICogQWRkIGJyYW5jaGVzIHRvIGNhbGwgc3RhY2sgZm9yIGVhc2llciBicm93c2luZy4gVGhpcyBnaXZlcwogCSAqIG1vcmUgY29udGV4dCBmb3IgYSBzYW1wbGUgdGhhbiBqdXN0IHRoZSBjYWxsZXJzLgpAQCAtMTU2OCwxMCArMTY3MCwxMCBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrKSB7CiAJCQllcnIgPSBhZGRfY2FsbGNoYWluX2lwKHRocmVhZCwgcGFyZW50LCByb290X2FsLAotCQkJCQkgICAgICAgdHJ1ZSwgYmVbaV0udG8pOworCQkJCQkgICAgICAgTlVMTCwgYmVbaV0udG8pOwogCQkJaWYgKCFlcnIpCiAJCQkJZXJyID0gYWRkX2NhbGxjaGFpbl9pcCh0aHJlYWQsIHBhcmVudCwgcm9vdF9hbCwKLQkJCQkJCSAgICAgICB0cnVlLCBiZVtpXS5mcm9tKTsKKwkJCQkJCSAgICAgICBOVUxMLCBiZVtpXS5mcm9tKTsKIAkJCWlmIChlcnIgPT0gLUVJTlZBTCkKIAkJCQlicmVhazsKIAkJCWlmIChlcnIpCkBAIC0xNjAwLDcgKzE3MDIsNyBAQAogI2VuZGlmCiAJCWlwID0gY2hhaW4tPmlwc1tqXTsKIAotCQllcnIgPSBhZGRfY2FsbGNoYWluX2lwKHRocmVhZCwgcGFyZW50LCByb290X2FsLCBmYWxzZSwgaXApOworCQllcnIgPSBhZGRfY2FsbGNoYWluX2lwKHRocmVhZCwgcGFyZW50LCByb290X2FsLCAmY3B1bW9kZSwgaXApOwogCiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gKGVyciA8IDApID8gZXJyIDogMDsKQEAgLTE2MjMsOSArMTcyNSw5IEBACiAJCQkgICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqcm9vdF9hbCwKIAkJCSAgICAgIGludCBtYXhfc3RhY2spCiB7Ci0JaW50IHJldCA9IHRocmVhZF9fcmVzb2x2ZV9jYWxsY2hhaW5fc2FtcGxlKHRocmVhZCwgc2FtcGxlLT5jYWxsY2hhaW4sCi0JCQkJCQkgICBzYW1wbGUtPmJyYW5jaF9zdGFjaywKLQkJCQkJCSAgIHBhcmVudCwgcm9vdF9hbCwgbWF4X3N0YWNrKTsKKwlpbnQgcmV0ID0gdGhyZWFkX19yZXNvbHZlX2NhbGxjaGFpbl9zYW1wbGUodGhyZWFkLCBldnNlbCwKKwkJCQkJCSAgIHNhbXBsZSwgcGFyZW50LAorCQkJCQkJICAgcm9vdF9hbCwgbWF4X3N0YWNrKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFjaGluZS5oIGIvdG9vbHMvcGVyZi91dGlsL21hY2hpbmUuaAppbmRleCBlOGI3Nzc5Li42ZDY0Y2VkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvbWFjaGluZS5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYWNoaW5lLmgKQEAgLTExOCw5ICsxMTgsOSBAQAogc3RydWN0IG1hY2hpbmUgKm1hY2hpbmVfX25ld19ob3N0KHZvaWQpOwogaW50IG1hY2hpbmVfX2luaXQoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IGNoYXIgKnJvb3RfZGlyLCBwaWRfdCBwaWQpOwogdm9pZCBtYWNoaW5lX19leGl0KHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKTsKLXZvaWQgbWFjaGluZV9fZGVsZXRlX2RlYWRfdGhyZWFkcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSk7CiB2b2lkIG1hY2hpbmVfX2RlbGV0ZV90aHJlYWRzKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKTsKIHZvaWQgbWFjaGluZV9fZGVsZXRlKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKTsKK3ZvaWQgbWFjaGluZV9fcmVtb3ZlX3RocmVhZChzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgc3RydWN0IHRocmVhZCAqdGgpOwogCiBzdHJ1Y3QgYnJhbmNoX2luZm8gKnNhbXBsZV9fcmVzb2x2ZV9ic3RhY2soc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCiAJCQkJCSAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFwLmMgYi90b29scy9wZXJmL3V0aWwvbWFwLmMKaW5kZXggNjJjYTlmMi4uYTE0ZjA4ZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL21hcC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuYwpAQCAtNzc4LDMgKzc3OCwyMyBAQAogCQlyZXR1cm4gcmJfZW50cnkobmV4dCwgc3RydWN0IG1hcCwgcmJfbm9kZSk7CiAJcmV0dXJuIE5VTEw7CiB9CisKK3N0cnVjdCBrbWFwICptYXBfX2ttYXAoc3RydWN0IG1hcCAqbWFwKQoreworCWlmICghbWFwLT5kc28gfHwgIW1hcC0+ZHNvLT5rZXJuZWwpIHsKKwkJcHJfZXJyKCJJbnRlcm5hbCBlcnJvcjogbWFwX19rbWFwIHdpdGggYSBub24ta2VybmVsIG1hcFxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKHN0cnVjdCBrbWFwICopKG1hcCArIDEpOworfQorCitzdHJ1Y3QgbWFwX2dyb3VwcyAqbWFwX19rbWFwcyhzdHJ1Y3QgbWFwICptYXApCit7CisJc3RydWN0IGttYXAgKmttYXAgPSBtYXBfX2ttYXAobWFwKTsKKworCWlmICgha21hcCB8fCAha21hcC0+a21hcHMpIHsKKwkJcHJfZXJyKCJJbnRlcm5hbCBlcnJvcjogbWFwX19rbWFwcyB3aXRoIGEgbm9uLWtlcm5lbCBtYXBcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGttYXAtPmttYXBzOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL21hcC5oIGIvdG9vbHMvcGVyZi91dGlsL21hcC5oCmluZGV4IDBlNDI0MzguLmVjMTljNTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaAorKysgYi90b29scy9wZXJmL3V0aWwvbWFwLmgKQEAgLTc2LDEwICs3Niw4IEBACiAKIHZvaWQgbWFwX2dyb3Vwc19fcHV0KHN0cnVjdCBtYXBfZ3JvdXBzICptZyk7CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGttYXAgKm1hcF9fa21hcChzdHJ1Y3QgbWFwICptYXApCi17Ci0JcmV0dXJuIChzdHJ1Y3Qga21hcCAqKShtYXAgKyAxKTsKLX0KK3N0cnVjdCBrbWFwICptYXBfX2ttYXAoc3RydWN0IG1hcCAqbWFwKTsKK3N0cnVjdCBtYXBfZ3JvdXBzICptYXBfX2ttYXBzKHN0cnVjdCBtYXAgKm1hcCk7CiAKIHN0YXRpYyBpbmxpbmUgdTY0IG1hcF9fbWFwX2lwKHN0cnVjdCBtYXAgKm1hcCwgdTY0IGlwKQogewpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL29yZGVyZWQtZXZlbnRzLmMgYi90b29scy9wZXJmL3V0aWwvb3JkZXJlZC1ldmVudHMuYwppbmRleCBmZDRiZTk0Li41MmJlMjAxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvb3JkZXJlZC1ldmVudHMuYworKysgYi90b29scy9wZXJmL3V0aWwvb3JkZXJlZC1ldmVudHMuYwpAQCAtMiw3ICsyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgIm9yZGVyZWQtZXZlbnRzLmgiCi0jaW5jbHVkZSAiZXZsaXN0LmgiCiAjaW5jbHVkZSAic2Vzc2lvbi5oIgogI2luY2x1ZGUgImFzbS9idWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpAQCAtMTMxLDggKzEzMCw4IEBACiAJcmV0dXJuIG5ldzsKIH0KIAotc3RydWN0IG9yZGVyZWRfZXZlbnQgKgotb3JkZXJlZF9ldmVudHNfX25ldyhzdHJ1Y3Qgb3JkZXJlZF9ldmVudHMgKm9lLCB1NjQgdGltZXN0YW1wLAorc3RhdGljIHN0cnVjdCBvcmRlcmVkX2V2ZW50ICoKK29yZGVyZWRfZXZlbnRzX19uZXdfZXZlbnQoc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSwgdTY0IHRpbWVzdGFtcCwKIAkJICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50KQogewogCXN0cnVjdCBvcmRlcmVkX2V2ZW50ICpuZXc7CkBAIC0xNTMsMjAgKzE1Miw0NyBAQAogCWZyZWVfZHVwX2V2ZW50KG9lLCBldmVudC0+ZXZlbnQpOwogfQogCi1zdGF0aWMgaW50IF9fb3JkZXJlZF9ldmVudHNfX2ZsdXNoKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnMsCi0JCQkJICAgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCkKK2ludCBvcmRlcmVkX2V2ZW50c19fcXVldWUoc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSwgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCisJCQkgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLCB1NjQgZmlsZV9vZmZzZXQpCiB7Ci0Jc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSA9ICZzLT5vcmRlcmVkX2V2ZW50czsKKwl1NjQgdGltZXN0YW1wID0gc2FtcGxlLT50aW1lOworCXN0cnVjdCBvcmRlcmVkX2V2ZW50ICpvZXZlbnQ7CisKKwlpZiAoIXRpbWVzdGFtcCB8fCB0aW1lc3RhbXAgPT0gfjBVTEwpCisJCXJldHVybiAtRVRJTUU7CisKKwlpZiAodGltZXN0YW1wIDwgb2UtPmxhc3RfZmx1c2gpIHsKKwkJcHJfb2VfdGltZSh0aW1lc3RhbXAsICAgICAgIm91dCBvZiBvcmRlciBldmVudFxuIik7CisJCXByX29lX3RpbWUob2UtPmxhc3RfZmx1c2gsICJsYXN0IGZsdXNoLCBsYXN0X2ZsdXNoX3R5cGUgJWRcbiIsCisJCQkgICBvZS0+bGFzdF9mbHVzaF90eXBlKTsKKworCQlvZS0+bnJfdW5vcmRlcmVkX2V2ZW50cysrOworCX0KKworCW9ldmVudCA9IG9yZGVyZWRfZXZlbnRzX19uZXdfZXZlbnQob2UsIHRpbWVzdGFtcCwgZXZlbnQpOworCWlmICghb2V2ZW50KSB7CisJCW9yZGVyZWRfZXZlbnRzX19mbHVzaChvZSwgT0VfRkxVU0hfX0hBTEYpOworCQlvZXZlbnQgPSBvcmRlcmVkX2V2ZW50c19fbmV3X2V2ZW50KG9lLCB0aW1lc3RhbXAsIGV2ZW50KTsKKwl9CisKKwlpZiAoIW9ldmVudCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvZXZlbnQtPmZpbGVfb2Zmc2V0ID0gZmlsZV9vZmZzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19vcmRlcmVkX2V2ZW50c19fZmx1c2goc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSkKK3sKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJm9lLT5ldmVudHM7CiAJc3RydWN0IG9yZGVyZWRfZXZlbnQgKnRtcCwgKml0ZXI7Ci0Jc3RydWN0IHBlcmZfc2FtcGxlIHNhbXBsZTsKIAl1NjQgbGltaXQgPSBvZS0+bmV4dF9mbHVzaDsKIAl1NjQgbGFzdF90cyA9IG9lLT5sYXN0ID8gb2UtPmxhc3QtPnRpbWVzdGFtcCA6IDBVTEw7CiAJYm9vbCBzaG93X3Byb2dyZXNzID0gbGltaXQgPT0gVUxMT05HX01BWDsKIAlzdHJ1Y3QgdWlfcHJvZ3Jlc3MgcHJvZzsKIAlpbnQgcmV0OwogCi0JaWYgKCF0b29sLT5vcmRlcmVkX2V2ZW50cyB8fCAhbGltaXQpCisJaWYgKCFsaW1pdCkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoc2hvd19wcm9ncmVzcykKQEAgLTE3OCwxNiArMjA0LDkgQEAKIAogCQlpZiAoaXRlci0+dGltZXN0YW1wID4gbGltaXQpCiAJCQlicmVhazsKLQotCQlyZXQgPSBwZXJmX2V2bGlzdF9fcGFyc2Vfc2FtcGxlKHMtPmV2bGlzdCwgaXRlci0+ZXZlbnQsICZzYW1wbGUpOworCQlyZXQgPSBvZS0+ZGVsaXZlcihvZSwgaXRlcik7CiAJCWlmIChyZXQpCi0JCQlwcl9lcnIoIkNhbid0IHBhcnNlIHNhbXBsZSwgZXJyID0gJWRcbiIsIHJldCk7Ci0JCWVsc2UgewotCQkJcmV0ID0gcGVyZl9zZXNzaW9uX19kZWxpdmVyX2V2ZW50KHMsIGl0ZXItPmV2ZW50LCAmc2FtcGxlLCB0b29sLAotCQkJCQkJCSAgaXRlci0+ZmlsZV9vZmZzZXQpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCQl9CisJCQlyZXR1cm4gcmV0OwogCiAJCW9yZGVyZWRfZXZlbnRzX19kZWxldGUob2UsIGl0ZXIpOwogCQlvZS0+bGFzdF9mbHVzaCA9IGl0ZXItPnRpbWVzdGFtcDsKQEAgLTIwNCwxMCArMjIzLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IG9yZGVyZWRfZXZlbnRzX19mbHVzaChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzLCBzdHJ1Y3QgcGVyZl90b29sICp0b29sLAotCQkJICBlbnVtIG9lX2ZsdXNoIGhvdykKK2ludCBvcmRlcmVkX2V2ZW50c19fZmx1c2goc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSwgZW51bSBvZV9mbHVzaCBob3cpCiB7Ci0Jc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSA9ICZzLT5vcmRlcmVkX2V2ZW50czsKIAlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHN0cltdID0gewogCQkiTk9ORSIsCiAJCSJGSU5BTCIsCkBAIC0yMTYsNiArMjMzLDkgQEAKIAl9OwogCWludCBlcnI7CiAKKwlpZiAob2UtPm5yX2V2ZW50cyA9PSAwKQorCQlyZXR1cm4gMDsKKwogCXN3aXRjaCAoaG93KSB7CiAJY2FzZSBPRV9GTFVTSF9fRklOQUw6CiAJCW9lLT5uZXh0X2ZsdXNoID0gVUxMT05HX01BWDsKQEAgLTI0OCw3ICsyNjgsNyBAQAogCQkgICBzdHJbaG93XSwgb2UtPm5yX2V2ZW50cyk7CiAJcHJfb2VfdGltZShvZS0+bWF4X3RpbWVzdGFtcCwgIm1heF90aW1lc3RhbXBcbiIpOwogCi0JZXJyID0gX19vcmRlcmVkX2V2ZW50c19fZmx1c2gocywgdG9vbCk7CisJZXJyID0gX19vcmRlcmVkX2V2ZW50c19fZmx1c2gob2UpOwogCiAJaWYgKCFlcnIpIHsKIAkJaWYgKGhvdyA9PSBPRV9GTFVTSF9fUk9VTkQpCkBAIC0yNjQsMTMgKzI4NCwxNCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXZvaWQgb3JkZXJlZF9ldmVudHNfX2luaXQoc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSkKK3ZvaWQgb3JkZXJlZF9ldmVudHNfX2luaXQoc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSwgb3JkZXJlZF9ldmVudHNfX2RlbGl2ZXJfdCBkZWxpdmVyKQogewogCUlOSVRfTElTVF9IRUFEKCZvZS0+ZXZlbnRzKTsKIAlJTklUX0xJU1RfSEVBRCgmb2UtPmNhY2hlKTsKIAlJTklUX0xJU1RfSEVBRCgmb2UtPnRvX2ZyZWUpOwogCW9lLT5tYXhfYWxsb2Nfc2l6ZSA9ICh1NjQpIC0xOwogCW9lLT5jdXJfYWxsb2Nfc2l6ZSA9IDA7CisJb2UtPmRlbGl2ZXIJICAgPSBkZWxpdmVyOwogfQogCiB2b2lkIG9yZGVyZWRfZXZlbnRzX19mcmVlKHN0cnVjdCBvcmRlcmVkX2V2ZW50cyAqb2UpCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvb3JkZXJlZC1ldmVudHMuaCBiL3Rvb2xzL3BlcmYvdXRpbC9vcmRlcmVkLWV2ZW50cy5oCmluZGV4IDdiOGY5YjAuLmY0MDM5OTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9vcmRlcmVkLWV2ZW50cy5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9vcmRlcmVkLWV2ZW50cy5oCkBAIC0yLDkgKzIsOCBAQAogI2RlZmluZSBfX09SREVSRURfRVZFTlRTX0gKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSAidG9vbC5oIgogCi1zdHJ1Y3QgcGVyZl9zZXNzaW9uOworc3RydWN0IHBlcmZfc2FtcGxlOwogCiBzdHJ1Y3Qgb3JkZXJlZF9ldmVudCB7CiAJdTY0CQkJdGltZXN0YW1wOwpAQCAtMjAsNiArMTksMTEgQEAKIAlPRV9GTFVTSF9fSEFMRiwKIH07CiAKK3N0cnVjdCBvcmRlcmVkX2V2ZW50czsKKwordHlwZWRlZiBpbnQgKCpvcmRlcmVkX2V2ZW50c19fZGVsaXZlcl90KShzdHJ1Y3Qgb3JkZXJlZF9ldmVudHMgKm9lLAorCQkJCQkgc3RydWN0IG9yZGVyZWRfZXZlbnQgKmV2ZW50KTsKKwogc3RydWN0IG9yZGVyZWRfZXZlbnRzIHsKIAl1NjQJCQlsYXN0X2ZsdXNoOwogCXU2NAkJCW5leHRfZmx1c2g7CkBAIC0zMSwxOCArMzUsMTkgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkCXRvX2ZyZWU7CiAJc3RydWN0IG9yZGVyZWRfZXZlbnQJKmJ1ZmZlcjsKIAlzdHJ1Y3Qgb3JkZXJlZF9ldmVudAkqbGFzdDsKKwlvcmRlcmVkX2V2ZW50c19fZGVsaXZlcl90IGRlbGl2ZXI7CiAJaW50CQkJYnVmZmVyX2lkeDsKIAl1bnNpZ25lZCBpbnQJCW5yX2V2ZW50czsKIAllbnVtIG9lX2ZsdXNoCQlsYXN0X2ZsdXNoX3R5cGU7CisJdTMyCQkJbnJfdW5vcmRlcmVkX2V2ZW50czsKIAlib29sICAgICAgICAgICAgICAgICAgICBjb3B5X29uX3F1ZXVlOwogfTsKIAotc3RydWN0IG9yZGVyZWRfZXZlbnQgKm9yZGVyZWRfZXZlbnRzX19uZXcoc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSwgdTY0IHRpbWVzdGFtcCwKLQkJCQkJICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCk7CitpbnQgb3JkZXJlZF9ldmVudHNfX3F1ZXVlKHN0cnVjdCBvcmRlcmVkX2V2ZW50cyAqb2UsIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwgdTY0IGZpbGVfb2Zmc2V0KTsKIHZvaWQgb3JkZXJlZF9ldmVudHNfX2RlbGV0ZShzdHJ1Y3Qgb3JkZXJlZF9ldmVudHMgKm9lLCBzdHJ1Y3Qgb3JkZXJlZF9ldmVudCAqZXZlbnQpOwotaW50IG9yZGVyZWRfZXZlbnRzX19mbHVzaChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzLCBzdHJ1Y3QgcGVyZl90b29sICp0b29sLAotCQkJICBlbnVtIG9lX2ZsdXNoIGhvdyk7Ci12b2lkIG9yZGVyZWRfZXZlbnRzX19pbml0KHN0cnVjdCBvcmRlcmVkX2V2ZW50cyAqb2UpOworaW50IG9yZGVyZWRfZXZlbnRzX19mbHVzaChzdHJ1Y3Qgb3JkZXJlZF9ldmVudHMgKm9lLCBlbnVtIG9lX2ZsdXNoIGhvdyk7Cit2b2lkIG9yZGVyZWRfZXZlbnRzX19pbml0KHN0cnVjdCBvcmRlcmVkX2V2ZW50cyAqb2UsIG9yZGVyZWRfZXZlbnRzX19kZWxpdmVyX3QgZGVsaXZlcik7CiB2b2lkIG9yZGVyZWRfZXZlbnRzX19mcmVlKHN0cnVjdCBvcmRlcmVkX2V2ZW50cyAqb2UpOwogCiBzdGF0aWMgaW5saW5lCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKaW5kZXggN2Y4ZWM2Yy4uYmUwNjU1MyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwpAQCAtMjAsMTEgKzIwLDYgQEAKIAogI2RlZmluZSBNQVhfTkFNRV9MRU4gMTAwCiAKLXN0cnVjdCBldmVudF9zeW1ib2wgewotCWNvbnN0IGNoYXIJKnN5bWJvbDsKLQljb25zdCBjaGFyCSphbGlhczsKLX07Ci0KICNpZmRlZiBQQVJTRVJfREVCVUcKIGV4dGVybiBpbnQgcGFyc2VfZXZlbnRzX2RlYnVnOwogI2VuZGlmCkBAIC0zOSw3ICszNCw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcGVyZl9wbXVfZXZlbnRzX2xpc3RfbnVtOwogCi1zdGF0aWMgc3RydWN0IGV2ZW50X3N5bWJvbCBldmVudF9zeW1ib2xzX2h3W1BFUkZfQ09VTlRfSFdfTUFYXSA9IHsKK3N0cnVjdCBldmVudF9zeW1ib2wgZXZlbnRfc3ltYm9sc19od1tQRVJGX0NPVU5UX0hXX01BWF0gPSB7CiAJW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10gPSB7CiAJCS5zeW1ib2wgPSAiY3B1LWN5Y2xlcyIsCiAJCS5hbGlhcyAgPSAiY3ljbGVzIiwKQEAgLTgyLDcgKzc3LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCBldmVudF9zeW1ib2wgZXZlbnRfc3ltYm9sc19zd1tQRVJGX0NPVU5UX1NXX01BWF0gPSB7CitzdHJ1Y3QgZXZlbnRfc3ltYm9sIGV2ZW50X3N5bWJvbHNfc3dbUEVSRl9DT1VOVF9TV19NQVhdID0gewogCVtQRVJGX0NPVU5UX1NXX0NQVV9DTE9DS10gPSB7CiAJCS5zeW1ib2wgPSAiY3B1LWNsb2NrIiwKIAkJLmFsaWFzICA9ICIiLApAQCAtMTc1LDkgKzE3MCw2IEBACiAJY2hhciBldnRfcGF0aFtNQVhQQVRITEVOXTsKIAljaGFyIGRpcl9wYXRoW01BWFBBVEhMRU5dOwogCi0JaWYgKGRlYnVnZnNfdmFsaWRfbW91bnRwb2ludCh0cmFjaW5nX2V2ZW50c19wYXRoKSkKLQkJcmV0dXJuIE5VTEw7Ci0KIAlzeXNfZGlyID0gb3BlbmRpcih0cmFjaW5nX2V2ZW50c19wYXRoKTsKIAlpZiAoIXN5c19kaXIpCiAJCXJldHVybiBOVUxMOwpAQCAtNDczLDEyICs0NjUsNiBAQAogaW50IHBhcnNlX2V2ZW50c19hZGRfdHJhY2Vwb2ludChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCBpbnQgKmlkeCwKIAkJCQljaGFyICpzeXMsIGNoYXIgKmV2ZW50KQogewotCWludCByZXQ7Ci0KLQlyZXQgPSBkZWJ1Z2ZzX3ZhbGlkX21vdW50cG9pbnQodHJhY2luZ19ldmVudHNfcGF0aCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQogCWlmIChzdHJwYnJrKHN5cywgIio/IikpCiAJCXJldHVybiBhZGRfdHJhY2Vwb2ludF9tdWx0aV9zeXMobGlzdCwgaWR4LCBzeXMsIGV2ZW50KTsKIAllbHNlCkBAIC03MjMsNiArNzA5LDcgQEAKIAlpbnQgZWg7CiAJaW50IGVIOwogCWludCBlRzsKKwlpbnQgZUk7CiAJaW50IHByZWNpc2U7CiAJaW50IGV4Y2x1ZGVfR0g7CiAJaW50IHNhbXBsZV9yZWFkOwpAQCAtNzM3LDYgKzcyNCw3IEBACiAJaW50IGVoID0gZXZzZWwgPyBldnNlbC0+YXR0ci5leGNsdWRlX2h2IDogMDsKIAlpbnQgZUggPSBldnNlbCA/IGV2c2VsLT5hdHRyLmV4Y2x1ZGVfaG9zdCA6IDA7CiAJaW50IGVHID0gZXZzZWwgPyBldnNlbC0+YXR0ci5leGNsdWRlX2d1ZXN0IDogMDsKKwlpbnQgZUkgPSBldnNlbCA/IGV2c2VsLT5hdHRyLmV4Y2x1ZGVfaWRsZSA6IDA7CiAJaW50IHByZWNpc2UgPSBldnNlbCA/IGV2c2VsLT5hdHRyLnByZWNpc2VfaXAgOiAwOwogCWludCBzYW1wbGVfcmVhZCA9IDA7CiAJaW50IHBpbm5lZCA9IGV2c2VsID8gZXZzZWwtPmF0dHIucGlubmVkIDogMDsKQEAgLTc2Nyw2ICs3NTUsOCBAQAogCQkJaWYgKCFleGNsdWRlX0dIKQogCQkJCWV4Y2x1ZGVfR0ggPSBlRyA9IGVIID0gMTsKIAkJCWVIID0gMDsKKwkJfSBlbHNlIGlmICgqc3RyID09ICdJJykgeworCQkJZUkgPSAxOwogCQl9IGVsc2UgaWYgKCpzdHIgPT0gJ3AnKSB7CiAJCQlwcmVjaXNlKys7CiAJCQkvKiB1c2Ugb2YgcHJlY2lzZSByZXF1aXJlcyBleGNsdWRlX2d1ZXN0ICovCkBAIC04MDAsNiArNzkwLDcgQEAKIAltb2QtPmVoID0gZWg7CiAJbW9kLT5lSCA9IGVIOwogCW1vZC0+ZUcgPSBlRzsKKwltb2QtPmVJID0gZUk7CiAJbW9kLT5wcmVjaXNlID0gcHJlY2lzZTsKIAltb2QtPmV4Y2x1ZGVfR0ggPSBleGNsdWRlX0dIOwogCW1vZC0+c2FtcGxlX3JlYWQgPSBzYW1wbGVfcmVhZDsKQEAgLTgxNyw3ICs4MDgsNyBAQAogCWNoYXIgKnAgPSBzdHI7CiAKIAkvKiBUaGUgc2l6ZW9mIGluY2x1ZGVzIDAgYnl0ZSBhcyB3ZWxsLiAqLwotCWlmIChzdHJsZW4oc3RyKSA+IChzaXplb2YoInVraEdIcHBwU0QiKSAtIDEpKQorCWlmIChzdHJsZW4oc3RyKSA+IChzaXplb2YoInVraEdIcHBwU0RJIikgLSAxKSkKIAkJcmV0dXJuIC0xOwogCiAJd2hpbGUgKCpwKSB7CkBAIC04NTMsNiArODQ0LDcgQEAKIAkJZXZzZWwtPmF0dHIucHJlY2lzZV9pcCAgICAgPSBtb2QucHJlY2lzZTsKIAkJZXZzZWwtPmF0dHIuZXhjbHVkZV9ob3N0ICAgPSBtb2QuZUg7CiAJCWV2c2VsLT5hdHRyLmV4Y2x1ZGVfZ3Vlc3QgID0gbW9kLmVHOworCQlldnNlbC0+YXR0ci5leGNsdWRlX2lkbGUgICA9IG1vZC5lSTsKIAkJZXZzZWwtPmV4Y2x1ZGVfR0ggICAgICAgICAgPSBtb2QuZXhjbHVkZV9HSDsKIAkJZXZzZWwtPnNhbXBsZV9yZWFkICAgICAgICAgPSBtb2Quc2FtcGxlX3JlYWQ7CiAKQEAgLTEwOTgsNiArMTA5MCwxNCBAQAogCSJIYXJkd2FyZSBicmVha3BvaW50IiwKIH07CiAKK3N0YXRpYyBpbnQgY21wX3N0cmluZyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IGNoYXIgKiBjb25zdCAqYXMgPSBhOworCWNvbnN0IGNoYXIgKiBjb25zdCAqYnMgPSBiOworCisJcmV0dXJuIHN0cmNtcCgqYXMsICpicyk7Cit9CisKIC8qCiAgKiBQcmludCB0aGUgZXZlbnRzIGZyb20gPGRlYnVnZnNfbW91bnRfcG9pbnQ+L3RyYWNpbmcvZXZlbnRzCiAgKi8KQEAgLTExMDksMTggKzExMDksMjEgQEAKIAlzdHJ1Y3QgZGlyZW50ICpzeXNfbmV4dCwgKmV2dF9uZXh0LCBzeXNfZGlyZW50LCBldnRfZGlyZW50OwogCWNoYXIgZXZ0X3BhdGhbTUFYUEFUSExFTl07CiAJY2hhciBkaXJfcGF0aFtNQVhQQVRITEVOXTsKLQljaGFyIHNidWZbU1RSRVJSX0JVRlNJWkVdOworCWNoYXIgKipldnRfbGlzdCA9IE5VTEw7CisJdW5zaWduZWQgaW50IGV2dF9pID0gMCwgZXZ0X251bSA9IDA7CisJYm9vbCBldnRfbnVtX2tub3duID0gZmFsc2U7CiAKLQlpZiAoZGVidWdmc192YWxpZF9tb3VudHBvaW50KHRyYWNpbmdfZXZlbnRzX3BhdGgpKSB7Ci0JCXByaW50ZigiICBbIFRyYWNlcG9pbnRzIG5vdCBhdmFpbGFibGU6ICVzIF1cbiIsCi0JCQlzdHJlcnJvcl9yKGVycm5vLCBzYnVmLCBzaXplb2Yoc2J1ZikpKTsKLQkJcmV0dXJuOwotCX0KLQorcmVzdGFydDoKIAlzeXNfZGlyID0gb3BlbmRpcih0cmFjaW5nX2V2ZW50c19wYXRoKTsKIAlpZiAoIXN5c19kaXIpCiAJCXJldHVybjsKIAorCWlmIChldnRfbnVtX2tub3duKSB7CisJCWV2dF9saXN0ID0gemFsbG9jKHNpemVvZihjaGFyICopICogZXZ0X251bSk7CisJCWlmICghZXZ0X2xpc3QpCisJCQlnb3RvIG91dF9jbG9zZV9zeXNfZGlyOworCX0KKwogCWZvcl9lYWNoX3N1YnN5c3RlbShzeXNfZGlyLCBzeXNfZGlyZW50LCBzeXNfbmV4dCkgewogCQlpZiAoc3Vic3lzX2dsb2IgIT0gTlVMTCAmJgogCQkgICAgIXN0cmdsb2JtYXRjaChzeXNfZGlyZW50LmRfbmFtZSwgc3Vic3lzX2dsb2IpKQpAQCAtMTEzNywxOSArMTE0MCw1NiBAQAogCQkJICAgICFzdHJnbG9ibWF0Y2goZXZ0X2RpcmVudC5kX25hbWUsIGV2ZW50X2dsb2IpKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZiAobmFtZV9vbmx5KSB7Ci0JCQkJcHJpbnRmKCIlczolcyAiLCBzeXNfZGlyZW50LmRfbmFtZSwgZXZ0X2RpcmVudC5kX25hbWUpOworCQkJaWYgKCFldnRfbnVtX2tub3duKSB7CisJCQkJZXZ0X251bSsrOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCiAJCQlzbnByaW50ZihldnRfcGF0aCwgTUFYUEFUSExFTiwgIiVzOiVzIiwKIAkJCQkgc3lzX2RpcmVudC5kX25hbWUsIGV2dF9kaXJlbnQuZF9uYW1lKTsKLQkJCXByaW50ZigiICAlLTUwcyBbJXNdXG4iLCBldnRfcGF0aCwKLQkJCQlldmVudF90eXBlX2Rlc2NyaXB0b3JzW1BFUkZfVFlQRV9UUkFDRVBPSU5UXSk7CisKKwkJCWV2dF9saXN0W2V2dF9pXSA9IHN0cmR1cChldnRfcGF0aCk7CisJCQlpZiAoZXZ0X2xpc3RbZXZ0X2ldID09IE5VTEwpCisJCQkJZ290byBvdXRfY2xvc2VfZXZ0X2RpcjsKKwkJCWV2dF9pKys7CiAJCX0KIAkJY2xvc2VkaXIoZXZ0X2Rpcik7CiAJfQogCWNsb3NlZGlyKHN5c19kaXIpOworCisJaWYgKCFldnRfbnVtX2tub3duKSB7CisJCWV2dF9udW1fa25vd24gPSB0cnVlOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCXFzb3J0KGV2dF9saXN0LCBldnRfbnVtLCBzaXplb2YoY2hhciAqKSwgY21wX3N0cmluZyk7CisJZXZ0X2kgPSAwOworCXdoaWxlIChldnRfaSA8IGV2dF9udW0pIHsKKwkJaWYgKG5hbWVfb25seSkgeworCQkJcHJpbnRmKCIlcyAiLCBldnRfbGlzdFtldnRfaSsrXSk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGYoIiAgJS01MHMgWyVzXVxuIiwgZXZ0X2xpc3RbZXZ0X2krK10sCisJCQkJZXZlbnRfdHlwZV9kZXNjcmlwdG9yc1tQRVJGX1RZUEVfVFJBQ0VQT0lOVF0pOworCX0KKwlpZiAoZXZ0X251bSkKKwkJcHJpbnRmKCJcbiIpOworCitvdXRfZnJlZToKKwlldnRfbnVtID0gZXZ0X2k7CisJZm9yIChldnRfaSA9IDA7IGV2dF9pIDwgZXZ0X251bTsgZXZ0X2krKykKKwkJemZyZWUoJmV2dF9saXN0W2V2dF9pXSk7CisJemZyZWUoJmV2dF9saXN0KTsKKwlyZXR1cm47CisKK291dF9jbG9zZV9ldnRfZGlyOgorCWNsb3NlZGlyKGV2dF9kaXIpOworb3V0X2Nsb3NlX3N5c19kaXI6CisJY2xvc2VkaXIoc3lzX2Rpcik7CisKKwlwcmludGYoIkZBVEFMOiBub3QgZW5vdWdoIG1lbW9yeSB0byBwcmludCAlc1xuIiwKKwkJCWV2ZW50X3R5cGVfZGVzY3JpcHRvcnNbUEVSRl9UWVBFX1RSQUNFUE9JTlRdKTsKKwlpZiAoZXZ0X2xpc3QpCisJCWdvdG8gb3V0X2ZyZWU7CiB9CiAKIC8qCkBAIC0xMTYzLDkgKzEyMDMsNiBAQAogCWNoYXIgZXZ0X3BhdGhbTUFYUEFUSExFTl07CiAJY2hhciBkaXJfcGF0aFtNQVhQQVRITEVOXTsKIAotCWlmIChkZWJ1Z2ZzX3ZhbGlkX21vdW50cG9pbnQodHJhY2luZ19ldmVudHNfcGF0aCkpCi0JCXJldHVybiAwOwotCiAJc3lzX2RpciA9IG9wZW5kaXIodHJhY2luZ19ldmVudHNfcGF0aCk7CiAJaWYgKCFzeXNfZGlyKQogCQlyZXR1cm4gMDsKQEAgLTEyMzMsMzggKzEyNzAsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBfX3ByaW50X2V2ZW50c190eXBlKHU4IHR5cGUsIHN0cnVjdCBldmVudF9zeW1ib2wgKnN5bXMsCi0JCQkJdW5zaWduZWQgbWF4KQotewotCWNoYXIgbmFtZVs2NF07Ci0JdW5zaWduZWQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBtYXggOyBpKyssIHN5bXMrKykgewotCQlpZiAoIWlzX2V2ZW50X3N1cHBvcnRlZCh0eXBlLCBpKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChzdHJsZW4oc3ltcy0+YWxpYXMpKQotCQkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAgIiVzIE9SICVzIiwKLQkJCQkgc3ltcy0+c3ltYm9sLCBzeW1zLT5hbGlhcyk7Ci0JCWVsc2UKLQkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzIiwgc3ltcy0+c3ltYm9sKTsKLQotCQlwcmludGYoIiAgJS01MHMgWyVzXVxuIiwgbmFtZSwgZXZlbnRfdHlwZV9kZXNjcmlwdG9yc1t0eXBlXSk7Ci0JfQotfQotCi12b2lkIHByaW50X2V2ZW50c190eXBlKHU4IHR5cGUpCi17Ci0JaWYgKHR5cGUgPT0gUEVSRl9UWVBFX1NPRlRXQVJFKQotCQlfX3ByaW50X2V2ZW50c190eXBlKHR5cGUsIGV2ZW50X3N5bWJvbHNfc3csIFBFUkZfQ09VTlRfU1dfTUFYKTsKLQllbHNlCi0JCV9fcHJpbnRfZXZlbnRzX3R5cGUodHlwZSwgZXZlbnRfc3ltYm9sc19odywgUEVSRl9DT1VOVF9IV19NQVgpOwotfQotCiBpbnQgcHJpbnRfaHdjYWNoZV9ldmVudHMoY29uc3QgY2hhciAqZXZlbnRfZ2xvYiwgYm9vbCBuYW1lX29ubHkpCiB7Ci0JdW5zaWduZWQgaW50IHR5cGUsIG9wLCBpLCBwcmludGVkID0gMDsKKwl1bnNpZ25lZCBpbnQgdHlwZSwgb3AsIGksIGV2dF9pID0gMCwgZXZ0X251bSA9IDA7CiAJY2hhciBuYW1lWzY0XTsKKwljaGFyICoqZXZ0X2xpc3QgPSBOVUxMOworCWJvb2wgZXZ0X251bV9rbm93biA9IGZhbHNlOworCityZXN0YXJ0OgorCWlmIChldnRfbnVtX2tub3duKSB7CisJCWV2dF9saXN0ID0gemFsbG9jKHNpemVvZihjaGFyICopICogZXZ0X251bSk7CisJCWlmICghZXZ0X2xpc3QpCisJCQlnb3RvIG91dF9lbm9tZW07CisJfQogCiAJZm9yICh0eXBlID0gMDsgdHlwZSA8IFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYOyB0eXBlKyspIHsKIAkJZm9yIChvcCA9IDA7IG9wIDwgUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVg7IG9wKyspIHsKQEAgLTEyODIsMjcgKzEzMDAsNjYgQEAKIAkJCQkJCQl0eXBlIHwgKG9wIDw8IDgpIHwgKGkgPDwgMTYpKSkKIAkJCQkJY29udGludWU7CiAKLQkJCQlpZiAobmFtZV9vbmx5KQotCQkJCQlwcmludGYoIiVzICIsIG5hbWUpOwotCQkJCWVsc2UKLQkJCQkJcHJpbnRmKCIgICUtNTBzIFslc11cbiIsIG5hbWUsCi0JCQkJCSAgICAgICBldmVudF90eXBlX2Rlc2NyaXB0b3JzW1BFUkZfVFlQRV9IV19DQUNIRV0pOwotCQkJCSsrcHJpbnRlZDsKKwkJCQlpZiAoIWV2dF9udW1fa25vd24pIHsKKwkJCQkJZXZ0X251bSsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlldnRfbGlzdFtldnRfaV0gPSBzdHJkdXAobmFtZSk7CisJCQkJaWYgKGV2dF9saXN0W2V2dF9pXSA9PSBOVUxMKQorCQkJCQlnb3RvIG91dF9lbm9tZW07CisJCQkJZXZ0X2krKzsKIAkJCX0KIAkJfQogCX0KIAotCWlmIChwcmludGVkKQorCWlmICghZXZ0X251bV9rbm93bikgeworCQlldnRfbnVtX2tub3duID0gdHJ1ZTsKKwkJZ290byByZXN0YXJ0OworCX0KKwlxc29ydChldnRfbGlzdCwgZXZ0X251bSwgc2l6ZW9mKGNoYXIgKiksIGNtcF9zdHJpbmcpOworCWV2dF9pID0gMDsKKwl3aGlsZSAoZXZ0X2kgPCBldnRfbnVtKSB7CisJCWlmIChuYW1lX29ubHkpIHsKKwkJCXByaW50ZigiJXMgIiwgZXZ0X2xpc3RbZXZ0X2krK10pOworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRmKCIgICUtNTBzIFslc11cbiIsIGV2dF9saXN0W2V2dF9pKytdLAorCQkJCWV2ZW50X3R5cGVfZGVzY3JpcHRvcnNbUEVSRl9UWVBFX0hXX0NBQ0hFXSk7CisJfQorCWlmIChldnRfbnVtKQogCQlwcmludGYoIlxuIik7Ci0JcmV0dXJuIHByaW50ZWQ7CisKK291dF9mcmVlOgorCWV2dF9udW0gPSBldnRfaTsKKwlmb3IgKGV2dF9pID0gMDsgZXZ0X2kgPCBldnRfbnVtOyBldnRfaSsrKQorCQl6ZnJlZSgmZXZ0X2xpc3RbZXZ0X2ldKTsKKwl6ZnJlZSgmZXZ0X2xpc3QpOworCXJldHVybiBldnRfbnVtOworCitvdXRfZW5vbWVtOgorCXByaW50ZigiRkFUQUw6IG5vdCBlbm91Z2ggbWVtb3J5IHRvIHByaW50ICVzXG4iLCBldmVudF90eXBlX2Rlc2NyaXB0b3JzW1BFUkZfVFlQRV9IV19DQUNIRV0pOworCWlmIChldnRfbGlzdCkKKwkJZ290byBvdXRfZnJlZTsKKwlyZXR1cm4gZXZ0X251bTsKIH0KIAotc3RhdGljIHZvaWQgcHJpbnRfc3ltYm9sX2V2ZW50cyhjb25zdCBjaGFyICpldmVudF9nbG9iLCB1bnNpZ25lZCB0eXBlLAordm9pZCBwcmludF9zeW1ib2xfZXZlbnRzKGNvbnN0IGNoYXIgKmV2ZW50X2dsb2IsIHVuc2lnbmVkIHR5cGUsCiAJCQkJc3RydWN0IGV2ZW50X3N5bWJvbCAqc3ltcywgdW5zaWduZWQgbWF4LAogCQkJCWJvb2wgbmFtZV9vbmx5KQogewotCXVuc2lnbmVkIGksIHByaW50ZWQgPSAwOworCXVuc2lnbmVkIGludCBpLCBldnRfaSA9IDAsIGV2dF9udW0gPSAwOwogCWNoYXIgbmFtZVtNQVhfTkFNRV9MRU5dOworCWNoYXIgKipldnRfbGlzdCA9IE5VTEw7CisJYm9vbCBldnRfbnVtX2tub3duID0gZmFsc2U7CisKK3Jlc3RhcnQ6CisJaWYgKGV2dF9udW1fa25vd24pIHsKKwkJZXZ0X2xpc3QgPSB6YWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBldnRfbnVtKTsKKwkJaWYgKCFldnRfbGlzdCkKKwkJCWdvdG8gb3V0X2Vub21lbTsKKwkJc3ltcyAtPSBtYXg7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrLCBzeW1zKyspIHsKIApAQCAtMTMxNCwyMyArMTM3MSw0OSBAQAogCQlpZiAoIWlzX2V2ZW50X3N1cHBvcnRlZCh0eXBlLCBpKSkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChuYW1lX29ubHkpIHsKLQkJCXByaW50ZigiJXMgIiwgc3ltcy0+c3ltYm9sKTsKKwkJaWYgKCFldnRfbnVtX2tub3duKSB7CisJCQlldnRfbnVtKys7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWlmIChzdHJsZW4oc3ltcy0+YWxpYXMpKQorCQlpZiAoIW5hbWVfb25seSAmJiBzdHJsZW4oc3ltcy0+YWxpYXMpKQogCQkJc25wcmludGYobmFtZSwgTUFYX05BTUVfTEVOLCAiJXMgT1IgJXMiLCBzeW1zLT5zeW1ib2wsIHN5bXMtPmFsaWFzKTsKIAkJZWxzZQogCQkJc3RybmNweShuYW1lLCBzeW1zLT5zeW1ib2wsIE1BWF9OQU1FX0xFTik7CiAKLQkJcHJpbnRmKCIgICUtNTBzIFslc11cbiIsIG5hbWUsIGV2ZW50X3R5cGVfZGVzY3JpcHRvcnNbdHlwZV0pOwotCi0JCXByaW50ZWQrKzsKKwkJZXZ0X2xpc3RbZXZ0X2ldID0gc3RyZHVwKG5hbWUpOworCQlpZiAoZXZ0X2xpc3RbZXZ0X2ldID09IE5VTEwpCisJCQlnb3RvIG91dF9lbm9tZW07CisJCWV2dF9pKys7CiAJfQogCi0JaWYgKHByaW50ZWQpCisJaWYgKCFldnRfbnVtX2tub3duKSB7CisJCWV2dF9udW1fa25vd24gPSB0cnVlOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCXFzb3J0KGV2dF9saXN0LCBldnRfbnVtLCBzaXplb2YoY2hhciAqKSwgY21wX3N0cmluZyk7CisJZXZ0X2kgPSAwOworCXdoaWxlIChldnRfaSA8IGV2dF9udW0pIHsKKwkJaWYgKG5hbWVfb25seSkgeworCQkJcHJpbnRmKCIlcyAiLCBldnRfbGlzdFtldnRfaSsrXSk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGYoIiAgJS01MHMgWyVzXVxuIiwgZXZ0X2xpc3RbZXZ0X2krK10sIGV2ZW50X3R5cGVfZGVzY3JpcHRvcnNbdHlwZV0pOworCX0KKwlpZiAoZXZ0X251bSkKIAkJcHJpbnRmKCJcbiIpOworCitvdXRfZnJlZToKKwlldnRfbnVtID0gZXZ0X2k7CisJZm9yIChldnRfaSA9IDA7IGV2dF9pIDwgZXZ0X251bTsgZXZ0X2krKykKKwkJemZyZWUoJmV2dF9saXN0W2V2dF9pXSk7CisJemZyZWUoJmV2dF9saXN0KTsKKwlyZXR1cm47CisKK291dF9lbm9tZW06CisJcHJpbnRmKCJGQVRBTDogbm90IGVub3VnaCBtZW1vcnkgdG8gcHJpbnQgJXNcbiIsIGV2ZW50X3R5cGVfZGVzY3JpcHRvcnNbdHlwZV0pOworCWlmIChldnRfbGlzdCkKKwkJZ290byBvdXRfZnJlZTsKIH0KIAogLyoKQEAgLTEzMzgsMTEgKzE0MjEsNiBAQAogICovCiB2b2lkIHByaW50X2V2ZW50cyhjb25zdCBjaGFyICpldmVudF9nbG9iLCBib29sIG5hbWVfb25seSkKIHsKLQlpZiAoIW5hbWVfb25seSkgewotCQlwcmludGYoIlxuIik7Ci0JCXByaW50ZigiTGlzdCBvZiBwcmUtZGVmaW5lZCBldmVudHMgKHRvIGJlIHVzZWQgaW4gLWUpOlxuIik7Ci0JfQotCiAJcHJpbnRfc3ltYm9sX2V2ZW50cyhldmVudF9nbG9iLCBQRVJGX1RZUEVfSEFSRFdBUkUsCiAJCQkgICAgZXZlbnRfc3ltYm9sc19odywgUEVSRl9DT1VOVF9IV19NQVgsIG5hbWVfb25seSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaAppbmRleCBmZjZlMWZhLi41MmEyZGRhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5oCkBAIC0xMTYsMTIgKzExNiwyMSBAQAogdm9pZCBwYXJzZV9ldmVudHNfZXJyb3Iodm9pZCAqZGF0YSwgdm9pZCAqc2Nhbm5lciwgY2hhciBjb25zdCAqbXNnKTsKIAogdm9pZCBwcmludF9ldmVudHMoY29uc3QgY2hhciAqZXZlbnRfZ2xvYiwgYm9vbCBuYW1lX29ubHkpOwotdm9pZCBwcmludF9ldmVudHNfdHlwZSh1OCB0eXBlKTsKKworc3RydWN0IGV2ZW50X3N5bWJvbCB7CisJY29uc3QgY2hhcgkqc3ltYm9sOworCWNvbnN0IGNoYXIJKmFsaWFzOworfTsKK2V4dGVybiBzdHJ1Y3QgZXZlbnRfc3ltYm9sIGV2ZW50X3N5bWJvbHNfaHdbXTsKK2V4dGVybiBzdHJ1Y3QgZXZlbnRfc3ltYm9sIGV2ZW50X3N5bWJvbHNfc3dbXTsKK3ZvaWQgcHJpbnRfc3ltYm9sX2V2ZW50cyhjb25zdCBjaGFyICpldmVudF9nbG9iLCB1bnNpZ25lZCB0eXBlLAorCQkJCXN0cnVjdCBldmVudF9zeW1ib2wgKnN5bXMsIHVuc2lnbmVkIG1heCwKKwkJCQlib29sIG5hbWVfb25seSk7CiB2b2lkIHByaW50X3RyYWNlcG9pbnRfZXZlbnRzKGNvbnN0IGNoYXIgKnN1YnN5c19nbG9iLCBjb25zdCBjaGFyICpldmVudF9nbG9iLAogCQkJICAgICBib29sIG5hbWVfb25seSk7CiBpbnQgcHJpbnRfaHdjYWNoZV9ldmVudHMoY29uc3QgY2hhciAqZXZlbnRfZ2xvYiwgYm9vbCBuYW1lX29ubHkpOwogZXh0ZXJuIGludCBpc192YWxpZF90cmFjZXBvaW50KGNvbnN0IGNoYXIgKmV2ZW50X3N0cmluZyk7CiAKLWV4dGVybiBpbnQgdmFsaWRfZGVidWdmc19tb3VudChjb25zdCBjaGFyICpkZWJ1Z2ZzKTsKK2ludCB2YWxpZF9ldmVudF9tb3VudChjb25zdCBjaGFyICpldmVudGZzKTsKIAogI2VuZGlmIC8qIF9fUEVSRl9QQVJTRV9FVkVOVFNfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5sIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5sCmluZGV4IDk0ZWFjYjYuLjg4OTVjZjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMubAorKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmwKQEAgLTEwMSw3ICsxMDEsNyBAQAogbmFtZQkJW2EtekEtWl8qP11bYS16QS1aMC05Xyo/XSoKIG5hbWVfbWludXMJW2EtekEtWl8qP11bYS16QS1aMC05XC1fKj9dKgogLyogSWYgeW91IGFkZCBhIG1vZGlmaWVyIHlvdSBuZWVkIHRvIHVwZGF0ZSBjaGVja19tb2RpZmllcigpICovCi1tb2RpZmllcl9ldmVudAlbdWtocEdIU0RdKworbW9kaWZpZXJfZXZlbnQJW3VraHBHSFNESV0rCiBtb2RpZmllcl9icAlbcnd4XXsxLDN9CiAKICUlCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5jIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuYwppbmRleCA0YTAxNWY3Li4wMTYyNmJlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmMKQEAgLTM3LDYgKzM3LDcgQEAKIHsKIAljb25zdCBjaGFyICpzLCAqYXJnID0gTlVMTDsKIAljb25zdCBpbnQgdW5zZXQgPSBmbGFncyAmIE9QVF9VTlNFVDsKKwlpbnQgZXJyOwogCiAJaWYgKHVuc2V0ICYmIHAtPm9wdCkKIAkJcmV0dXJuIG9wdGVycm9yKG9wdCwgInRha2VzIG5vIHZhbHVlIiwgZmxhZ3MpOwpAQCAtMTE0LDEzICsxMTUsMjkgQEAKIAkJcmV0dXJuIDA7CiAKIAljYXNlIE9QVElPTl9TVFJJTkc6CisJCWVyciA9IDA7CiAJCWlmICh1bnNldCkKIAkJCSooY29uc3QgY2hhciAqKilvcHQtPnZhbHVlID0gTlVMTDsKIAkJZWxzZSBpZiAob3B0LT5mbGFncyAmIFBBUlNFX09QVF9PUFRBUkcgJiYgIXAtPm9wdCkKIAkJCSooY29uc3QgY2hhciAqKilvcHQtPnZhbHVlID0gKGNvbnN0IGNoYXIgKilvcHQtPmRlZnZhbDsKIAkJZWxzZQotCQkJcmV0dXJuIGdldF9hcmcocCwgb3B0LCBmbGFncywgKGNvbnN0IGNoYXIgKiopb3B0LT52YWx1ZSk7Ci0JCXJldHVybiAwOworCQkJZXJyID0gZ2V0X2FyZyhwLCBvcHQsIGZsYWdzLCAoY29uc3QgY2hhciAqKilvcHQtPnZhbHVlKTsKKworCQkvKiBQQVJTRV9PUFRfTk9FTVBUWTogQWxsb3cgTlVMTCBidXQgZGlzYWxsb3cgZW1wdHkgc3RyaW5nLiAqLworCQlpZiAob3B0LT5mbGFncyAmIFBBUlNFX09QVF9OT0VNUFRZKSB7CisJCQljb25zdCBjaGFyICp2YWwgPSAqKGNvbnN0IGNoYXIgKiopb3B0LT52YWx1ZTsKKworCQkJaWYgKCF2YWwpCisJCQkJcmV0dXJuIGVycjsKKworCQkJLyogU2ltaWxhciB0byB1bnNldCBpZiB3ZSBhcmUgZ2l2ZW4gYW4gZW1wdHkgc3RyaW5nLiAqLworCQkJaWYgKHZhbFswXSA9PSAnXDAnKSB7CisJCQkJKihjb25zdCBjaGFyICoqKW9wdC0+dmFsdWUgPSBOVUxMOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisKKwkJcmV0dXJuIGVycjsKIAogCWNhc2UgT1BUSU9OX0NBTExCQUNLOgogCQlpZiAodW5zZXQpCkBAIC01MDUsMTMgKzUyMiwxOCBAQAogCQlicmVhazsKIAljYXNlIFBBUlNFX09QVF9MSVNUX09QVFM6CiAJCXdoaWxlIChvcHRpb25zLT50eXBlICE9IE9QVElPTl9FTkQpIHsKLQkJCXByaW50ZigiLS0lcyAiLCBvcHRpb25zLT5sb25nX25hbWUpOworCQkJaWYgKG9wdGlvbnMtPmxvbmdfbmFtZSkKKwkJCQlwcmludGYoIi0tJXMgIiwgb3B0aW9ucy0+bG9uZ19uYW1lKTsKIAkJCW9wdGlvbnMrKzsKIAkJfQorCQlwdXRjaGFyKCdcbicpOwogCQlleGl0KDEzMCk7CiAJY2FzZSBQQVJTRV9PUFRfTElTVF9TVUJDTURTOgotCQlmb3IgKGludCBpID0gMDsgc3ViY29tbWFuZHNbaV07IGkrKykKLQkJCXByaW50ZigiJXMgIiwgc3ViY29tbWFuZHNbaV0pOworCQlpZiAoc3ViY29tbWFuZHMpIHsKKwkJCWZvciAoaW50IGkgPSAwOyBzdWJjb21tYW5kc1tpXTsgaSsrKQorCQkJCXByaW50ZigiJXMgIiwgc3ViY29tbWFuZHNbaV0pOworCQl9CisJCXB1dGNoYXIoJ1xuJyk7CiAJCWV4aXQoMTMwKTsKIAlkZWZhdWx0OiAvKiBQQVJTRV9PUFRfVU5LTk9XTiAqLwogCQlpZiAoY3R4LmFyZ3ZbMF1bMV0gPT0gJy0nKSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5oIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLW9wdGlvbnMuaAppbmRleCA5N2IxNTNmLi41OTU2MWZkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmgKQEAgLTQwLDYgKzQwLDcgQEAKIAlQQVJTRV9PUFRfTEFTVEFSR19ERUZBVUxUID0gMTYsCiAJUEFSU0VfT1BUX0RJU0FCTEVEID0gMzIsCiAJUEFSU0VfT1BUX0VYQ0xVU0lWRSA9IDY0LAorCVBBUlNFX09QVF9OT0VNUFRZICA9IDEyOCwKIH07CiAKIHN0cnVjdCBvcHRpb247CkBAIC0xMjIsNiArMTIzLDcgQEAKICNkZWZpbmUgT1BUX0xPTkcocywgbCwgdiwgaCkgICAgICAgIHsgLnR5cGUgPSBPUFRJT05fTE9ORywgLnNob3J0X25hbWUgPSAocyksIC5sb25nX25hbWUgPSAobCksIC52YWx1ZSA9IGNoZWNrX3Z0eXBlKHYsIGxvbmcgKiksIC5oZWxwID0gKGgpIH0KICNkZWZpbmUgT1BUX1U2NChzLCBsLCB2LCBoKSAgICAgICAgIHsgLnR5cGUgPSBPUFRJT05fVTY0LCAuc2hvcnRfbmFtZSA9IChzKSwgLmxvbmdfbmFtZSA9IChsKSwgLnZhbHVlID0gY2hlY2tfdnR5cGUodiwgdTY0ICopLCAuaGVscCA9IChoKSB9CiAjZGVmaW5lIE9QVF9TVFJJTkcocywgbCwgdiwgYSwgaCkgICB7IC50eXBlID0gT1BUSU9OX1NUUklORywgIC5zaG9ydF9uYW1lID0gKHMpLCAubG9uZ19uYW1lID0gKGwpLCAudmFsdWUgPSBjaGVja192dHlwZSh2LCBjb25zdCBjaGFyICoqKSwgKGEpLCAuaGVscCA9IChoKSB9CisjZGVmaW5lIE9QVF9TVFJJTkdfTk9FTVBUWShzLCBsLCB2LCBhLCBoKSAgIHsgLnR5cGUgPSBPUFRJT05fU1RSSU5HLCAgLnNob3J0X25hbWUgPSAocyksIC5sb25nX25hbWUgPSAobCksIC52YWx1ZSA9IGNoZWNrX3Z0eXBlKHYsIGNvbnN0IGNoYXIgKiopLCAoYSksIC5oZWxwID0gKGgpLCAuZmxhZ3MgPSBQQVJTRV9PUFRfTk9FTVBUWX0KICNkZWZpbmUgT1BUX0RBVEUocywgbCwgdiwgaCkgXAogCXsgLnR5cGUgPSBPUFRJT05fQ0FMTEJBQ0ssIC5zaG9ydF9uYW1lID0gKHMpLCAubG9uZ19uYW1lID0gKGwpLCAudmFsdWUgPSAodiksIC5hcmdoID0gInRpbWUiLCAuaGVscCA9IChoKSwgLmNhbGxiYWNrID0gcGFyc2Vfb3B0X2FwcHJveGlkYXRlX2NiIH0KICNkZWZpbmUgT1BUX0NBTExCQUNLKHMsIGwsIHYsIGEsIGgsIGYpIFwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1ldmVudC5jIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMKaW5kZXggOTE5OTM3ZS4uMzA1NDVjZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlICJzeW1ib2wuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlIDxhcGkvZnMvZGVidWdmcy5oPgorI2luY2x1ZGUgPGFwaS9mcy90cmFjZWZzLmg+CiAjaW5jbHVkZSAidHJhY2UtZXZlbnQuaCIJLyogRm9yIF9fbWF5YmVfdW51c2VkICovCiAjaW5jbHVkZSAicHJvYmUtZXZlbnQuaCIKICNpbmNsdWRlICJwcm9iZS1maW5kZXIuaCIKQEAgLTc5LDYgKzgwLDcgQEAKIAlpbnQgcmV0OwogCiAJc3ltYm9sX2NvbmYuc29ydF9ieV9uYW1lID0gdHJ1ZTsKKwlzeW1ib2xfY29uZi5hbGxvd19hbGlhc2VzID0gdHJ1ZTsKIAlyZXQgPSBzeW1ib2xfX2luaXQoTlVMTCk7CiAJaWYgKHJldCA8IDApIHsKIAkJcHJfZGVidWcoIkZhaWxlZCB0byBpbml0IHN5bWJvbCBtYXAuXG4iKTsKQEAgLTEzMyw2ICsxMzUsOCBAQAogCQlyZXR1cm4gTlVMTDsKIAogCWttYXAgPSBtYXBfX2ttYXAoaG9zdF9tYWNoaW5lLT52bWxpbnV4X21hcHNbTUFQX19GVU5DVElPTl0pOworCWlmICgha21hcCkKKwkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuIGttYXAtPnJlZl9yZWxvY19zeW07CiB9CiAKQEAgLTE1MCw3ICsxNTQsNyBAQAogCQlzeW0gPSBfX2ZpbmRfa2VybmVsX2Z1bmN0aW9uX2J5X25hbWUobmFtZSwgJm1hcCk7CiAJCWlmIChzeW0pCiAJCQlyZXR1cm4gbWFwLT51bm1hcF9pcChtYXAsIHN5bS0+c3RhcnQpIC0KLQkJCQkocmVsb2MpID8gMCA6IG1hcC0+cmVsb2M7CisJCQkJKChyZWxvYykgPyAwIDogbWFwLT5yZWxvYyk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMTc3LDYgKzE4MSwyNSBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgc3RydWN0IG1hcCAqZ2V0X3RhcmdldF9tYXAoY29uc3QgY2hhciAqdGFyZ2V0LCBib29sIHVzZXIpCit7CisJLyogSW5pdCBtYXBzIG9mIGdpdmVuIGV4ZWN1dGFibGUgb3Iga2VybmVsICovCisJaWYgKHVzZXIpCisJCXJldHVybiBkc29fX25ld19tYXAodGFyZ2V0KTsKKwllbHNlCisJCXJldHVybiBrZXJuZWxfZ2V0X21vZHVsZV9tYXAodGFyZ2V0KTsKK30KKworc3RhdGljIHZvaWQgcHV0X3RhcmdldF9tYXAoc3RydWN0IG1hcCAqbWFwLCBib29sIHVzZXIpCit7CisJaWYgKG1hcCAmJiB1c2VyKSB7CisJCS8qIE9ubHkgdGhlIHVzZXIgbWFwIG5lZWRzIHRvIGJlIHJlbGVhc2VkICovCisJCWRzb19fZGVsZXRlKG1hcC0+ZHNvKTsKKwkJbWFwX19kZWxldGUobWFwKTsKKwl9Cit9CisKKwogc3RhdGljIHN0cnVjdCBkc28gKmtlcm5lbF9nZXRfbW9kdWxlX2Rzbyhjb25zdCBjaGFyICptb2R1bGUpCiB7CiAJc3RydWN0IGRzbyAqZHNvOwpAQCAtMjQ4LDYgKzI3MSwxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGNsZWFyX3BlcmZfcHJvYmVfcG9pbnQoc3RydWN0IHBlcmZfcHJvYmVfcG9pbnQgKnBwKQoreworCWZyZWUocHAtPmZpbGUpOworCWZyZWUocHAtPmZ1bmN0aW9uKTsKKwlmcmVlKHBwLT5sYXp5X2xpbmUpOworfQorCiBzdGF0aWMgdm9pZCBjbGVhcl9wcm9iZV90cmFjZV9ldmVudHMoc3RydWN0IHByb2JlX3RyYWNlX2V2ZW50ICp0ZXZzLCBpbnQgbnRldnMpCiB7CiAJaW50IGk7CkBAIC0yNTcsNiArMjg3LDEwMyBAQAogfQogCiAjaWZkZWYgSEFWRV9EV0FSRl9TVVBQT1JUCisvKgorICogU29tZSBiaW5hcmllcyBsaWtlIGdsaWJjIGhhdmUgc3BlY2lhbCBzeW1ib2xzIHdoaWNoIGFyZSBvbiB0aGUgc3ltYm9sCisgKiB0YWJsZSwgYnV0IG5vdCBpbiB0aGUgZGVidWdpbmZvLiBJZiB3ZSBjYW4gZmluZCB0aGUgYWRkcmVzcyBvZiB0aGUKKyAqIHN5bWJvbCBmcm9tIG1hcCwgd2UgY2FuIHRyYW5zbGF0ZSB0aGUgYWRkcmVzcyBiYWNrIHRvIHRoZSBwcm9iZSBwb2ludC4KKyAqLworc3RhdGljIGludCBmaW5kX2FsdGVybmF0aXZlX3Byb2JlX3BvaW50KHN0cnVjdCBkZWJ1Z2luZm8gKmRpbmZvLAorCQkJCQlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAsCisJCQkJCXN0cnVjdCBwZXJmX3Byb2JlX3BvaW50ICpyZXN1bHQsCisJCQkJCWNvbnN0IGNoYXIgKnRhcmdldCwgYm9vbCB1cHJvYmVzKQoreworCXN0cnVjdCBtYXAgKm1hcCA9IE5VTEw7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXU2NCBhZGRyZXNzID0gMDsKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKworCS8qIFRoaXMgY2FuIHdvcmsgb25seSBmb3IgZnVuY3Rpb24tbmFtZSBiYXNlZCBvbmUgKi8KKwlpZiAoIXBwLT5mdW5jdGlvbiB8fCBwcC0+ZmlsZSkKKwkJcmV0dXJuIC1FTk9UU1VQOworCisJbWFwID0gZ2V0X3RhcmdldF9tYXAodGFyZ2V0LCB1cHJvYmVzKTsKKwlpZiAoIW1hcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBGaW5kIHRoZSBhZGRyZXNzIG9mIGdpdmVuIGZ1bmN0aW9uICovCisJbWFwX19mb3JfZWFjaF9zeW1ib2xfYnlfbmFtZShtYXAsIHBwLT5mdW5jdGlvbiwgc3ltKSB7CisJCWlmICh1cHJvYmVzKQorCQkJYWRkcmVzcyA9IHN5bS0+c3RhcnQ7CisJCWVsc2UKKwkJCWFkZHJlc3MgPSBtYXAtPnVubWFwX2lwKG1hcCwgc3ltLT5zdGFydCk7CisJCWJyZWFrOworCX0KKwlpZiAoIWFkZHJlc3MpIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBvdXQ7CisJfQorCXByX2RlYnVnKCJTeW1ib2wgJXMgYWRkcmVzcyBmb3VuZCA6ICUiIFBSSXg2NCAiXG4iLAorCQkJcHAtPmZ1bmN0aW9uLCBhZGRyZXNzKTsKKworCXJldCA9IGRlYnVnaW5mb19fZmluZF9wcm9iZV9wb2ludChkaW5mbywgKHVuc2lnbmVkIGxvbmcpYWRkcmVzcywKKwkJCQkJICByZXN1bHQpOworCWlmIChyZXQgPD0gMCkKKwkJcmV0ID0gKCFyZXQpID8gLUVOT0VOVCA6IHJldDsKKwllbHNlIHsKKwkJcmVzdWx0LT5vZmZzZXQgKz0gcHAtPm9mZnNldDsKKwkJcmVzdWx0LT5saW5lICs9IHBwLT5saW5lOworCQlyZXQgPSAwOworCX0KKworb3V0OgorCXB1dF90YXJnZXRfbWFwKG1hcCwgdXByb2Jlcyk7CisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgaW50IGdldF9hbHRlcm5hdGl2ZV9wcm9iZV9ldmVudChzdHJ1Y3QgZGVidWdpbmZvICpkaW5mbywKKwkJCQkgICAgICAgc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldiwKKwkJCQkgICAgICAgc3RydWN0IHBlcmZfcHJvYmVfcG9pbnQgKnRtcCwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqdGFyZ2V0KQoreworCWludCByZXQ7CisKKwltZW1jcHkodG1wLCAmcGV2LT5wb2ludCwgc2l6ZW9mKCp0bXApKTsKKwltZW1zZXQoJnBldi0+cG9pbnQsIDAsIHNpemVvZihwZXYtPnBvaW50KSk7CisJcmV0ID0gZmluZF9hbHRlcm5hdGl2ZV9wcm9iZV9wb2ludChkaW5mbywgdG1wLCAmcGV2LT5wb2ludCwKKwkJCQkJICAgdGFyZ2V0LCBwZXYtPnVwcm9iZXMpOworCWlmIChyZXQgPCAwKQorCQltZW1jcHkoJnBldi0+cG9pbnQsIHRtcCwgc2l6ZW9mKCp0bXApKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2FsdGVybmF0aXZlX2xpbmVfcmFuZ2Uoc3RydWN0IGRlYnVnaW5mbyAqZGluZm8sCisJCQkJICAgICAgc3RydWN0IGxpbmVfcmFuZ2UgKmxyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKnRhcmdldCwgYm9vbCB1c2VyKQoreworCXN0cnVjdCBwZXJmX3Byb2JlX3BvaW50IHBwID0geyAuZnVuY3Rpb24gPSBsci0+ZnVuY3Rpb24sCisJCQkJICAgICAgIC5maWxlID0gbHItPmZpbGUsCisJCQkJICAgICAgIC5saW5lID0gbHItPnN0YXJ0IH07CisJc3RydWN0IHBlcmZfcHJvYmVfcG9pbnQgcmVzdWx0OworCWludCByZXQsIGxlbiA9IDA7CisKKwltZW1zZXQoJnJlc3VsdCwgMCwgc2l6ZW9mKHJlc3VsdCkpOworCisJaWYgKGxyLT5lbmQgIT0gSU5UX01BWCkKKwkJbGVuID0gbHItPmVuZCAtIGxyLT5zdGFydDsKKwlyZXQgPSBmaW5kX2FsdGVybmF0aXZlX3Byb2JlX3BvaW50KGRpbmZvLCAmcHAsICZyZXN1bHQsCisJCQkJCSAgIHRhcmdldCwgdXNlcik7CisJaWYgKCFyZXQpIHsKKwkJbHItPmZ1bmN0aW9uID0gcmVzdWx0LmZ1bmN0aW9uOworCQlsci0+ZmlsZSA9IHJlc3VsdC5maWxlOworCQlsci0+c3RhcnQgPSByZXN1bHQubGluZTsKKwkJaWYgKGxyLT5lbmQgIT0gSU5UX01BWCkKKwkJCWxyLT5lbmQgPSBsci0+c3RhcnQgKyBsZW47CisJCWNsZWFyX3BlcmZfcHJvYmVfcG9pbnQoJnBwKTsKKwl9CisJcmV0dXJuIHJldDsKK30KIAogLyogT3BlbiBuZXcgZGVidWdpbmZvIG9mIGdpdmVuIG1vZHVsZSAqLwogc3RhdGljIHN0cnVjdCBkZWJ1Z2luZm8gKm9wZW5fZGVidWdpbmZvKGNvbnN0IGNoYXIgKm1vZHVsZSwgYm9vbCBzaWxlbnQpCkBAIC00NjUsNiArNTkyLDcgQEAKIAkJCQkJICBpbnQgbWF4X3RldnMsIGNvbnN0IGNoYXIgKnRhcmdldCkKIHsKIAlib29sIG5lZWRfZHdhcmYgPSBwZXJmX3Byb2JlX2V2ZW50X25lZWRfZHdhcmYocGV2KTsKKwlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCB0bXA7CiAJc3RydWN0IGRlYnVnaW5mbyAqZGluZm87CiAJaW50IG50ZXZzLCByZXQgPSAwOwogCkBAIC00ODEsNiArNjA5LDIwIEBACiAJLyogU2VhcmNoaW5nIHRyYWNlIGV2ZW50cyBjb3JyZXNwb25kaW5nIHRvIGEgcHJvYmUgZXZlbnQgKi8KIAludGV2cyA9IGRlYnVnaW5mb19fZmluZF90cmFjZV9ldmVudHMoZGluZm8sIHBldiwgdGV2cywgbWF4X3RldnMpOwogCisJaWYgKG50ZXZzID09IDApCXsgIC8qIE5vdCBmb3VuZCwgcmV0cnkgd2l0aCBhbiBhbHRlcm5hdGl2ZSAqLworCQlyZXQgPSBnZXRfYWx0ZXJuYXRpdmVfcHJvYmVfZXZlbnQoZGluZm8sIHBldiwgJnRtcCwgdGFyZ2V0KTsKKwkJaWYgKCFyZXQpIHsKKwkJCW50ZXZzID0gZGVidWdpbmZvX19maW5kX3RyYWNlX2V2ZW50cyhkaW5mbywgcGV2LAorCQkJCQkJCSAgICAgdGV2cywgbWF4X3RldnMpOworCQkJLyoKKwkJCSAqIFdyaXRlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHByb2JlX2V2ZW50IGZvcgorCQkJICogc2V0dGluZyBhcHByb3ByaWF0ZSAodXNlciBnaXZlbikgZXZlbnQgbmFtZQorCQkJICovCisJCQljbGVhcl9wZXJmX3Byb2JlX3BvaW50KCZwZXYtPnBvaW50KTsKKwkJCW1lbWNweSgmcGV2LT5wb2ludCwgJnRtcCwgc2l6ZW9mKHRtcCkpOworCQl9CisJfQorCiAJZGVidWdpbmZvX19kZWxldGUoZGluZm8pOwogCiAJaWYgKG50ZXZzID4gMCkgewkvKiBTdWNjZWVkZWQgdG8gZmluZCB0cmFjZSBldmVudHMgKi8KQEAgLTQ5NSwxMSArNjM3LDkgQEAKIAl9CiAKIAlpZiAobnRldnMgPT0gMCkJewkvKiBObyBlcnJvciBidXQgZmFpbGVkIHRvIGZpbmQgcHJvYmUgcG9pbnQuICovCi0JCXByX3dhcm5pbmcoIlByb2JlIHBvaW50ICclcycgbm90IGZvdW5kIGluIGRlYnVnaW5mby5cbiIsCisJCXByX3dhcm5pbmcoIlByb2JlIHBvaW50ICclcycgbm90IGZvdW5kLlxuIiwKIAkJCSAgIHN5bnRoZXNpemVfcGVyZl9wcm9iZV9wb2ludCgmcGV2LT5wb2ludCkpOwotCQlpZiAobmVlZF9kd2FyZikKLQkJCXJldHVybiAtRU5PRU5UOwotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCS8qIEVycm9yIHBhdGggOiBudGV2cyA8IDAgKi8KIAlwcl9kZWJ1ZygiQW4gZXJyb3Igb2NjdXJyZWQgaW4gZGVidWdpbmZvIGFuYWx5c2lzICglZCkuXG4iLCBudGV2cyk7CkBAIC01MzIsNyArNjcyLDcgQEAKIAkJZWxzZSB7CiAJCQlpZiAoYWNjZXNzKHJhd19wYXRoLCBSX09LKSA9PSAwKSB7CiAJCQkJKm5ld19wYXRoID0gc3RyZHVwKHJhd19wYXRoKTsKLQkJCQlyZXR1cm4gMDsKKwkJCQlyZXR1cm4gKm5ld19wYXRoID8gMCA6IC1FTk9NRU07CiAJCQl9IGVsc2UKIAkJCQlyZXR1cm4gLWVycm5vOwogCQl9CkBAIC01NDgsOSArNjg4LDExIEBACiAJCWlmIChhY2Nlc3MoKm5ld19wYXRoLCBSX09LKSA9PSAwKQogCQkJcmV0dXJuIDA7CiAKLQkJaWYgKCFzeW1ib2xfY29uZi5zb3VyY2VfcHJlZml4KQorCQlpZiAoIXN5bWJvbF9jb25mLnNvdXJjZV9wcmVmaXgpIHsKIAkJCS8qIEluIGNhc2Ugb2Ygc2VhcmNoaW5nIGNvbXBfZGlyLCBkb24ndCByZXRyeSAqLworCQkJemZyZWUobmV3X3BhdGgpOwogCQkJcmV0dXJuIC1lcnJubzsKKwkJfQogCiAJCXN3aXRjaCAoZXJybm8pIHsKIAkJY2FzZSBFTkFNRVRPT0xPTkc6CkBAIC02MjIsNyArNzY0LDggQEAKICAqIFNob3cgbGluZS1yYW5nZSBhbHdheXMgcmVxdWlyZXMgZGVidWdpbmZvIHRvIGZpbmQgc291cmNlIGZpbGUgYW5kCiAgKiBsaW5lIG51bWJlci4KICAqLwotc3RhdGljIGludCBfX3Nob3dfbGluZV9yYW5nZShzdHJ1Y3QgbGluZV9yYW5nZSAqbHIsIGNvbnN0IGNoYXIgKm1vZHVsZSkKK3N0YXRpYyBpbnQgX19zaG93X2xpbmVfcmFuZ2Uoc3RydWN0IGxpbmVfcmFuZ2UgKmxyLCBjb25zdCBjaGFyICptb2R1bGUsCisJCQkgICAgIGJvb2wgdXNlcikKIHsKIAlpbnQgbCA9IDE7CiAJc3RydWN0IGludF9ub2RlICpsbjsKQEAgLTYzOCw2ICs3ODEsMTEgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlyZXQgPSBkZWJ1Z2luZm9fX2ZpbmRfbGluZV9yYW5nZShkaW5mbywgbHIpOworCWlmICghcmV0KSB7CS8qIE5vdCBmb3VuZCwgcmV0cnkgd2l0aCBhbiBhbHRlcm5hdGl2ZSAqLworCQlyZXQgPSBnZXRfYWx0ZXJuYXRpdmVfbGluZV9yYW5nZShkaW5mbywgbHIsIG1vZHVsZSwgdXNlcik7CisJCWlmICghcmV0KQorCQkJcmV0ID0gZGVidWdpbmZvX19maW5kX2xpbmVfcmFuZ2UoZGluZm8sIGxyKTsKKwl9CiAJZGVidWdpbmZvX19kZWxldGUoZGluZm8pOwogCWlmIChyZXQgPT0gMCB8fCByZXQgPT0gLUVOT0VOVCkgewogCQlwcl93YXJuaW5nKCJTcGVjaWZpZWQgc291cmNlIGxpbmUgaXMgbm90IGZvdW5kLlxuIik7CkBAIC02NTAsNyArNzk4LDExIEBACiAJLyogQ29udmVydCBzb3VyY2UgZmlsZSBwYXRoICovCiAJdG1wID0gbHItPnBhdGg7CiAJcmV0ID0gZ2V0X3JlYWxfcGF0aCh0bXAsIGxyLT5jb21wX2RpciwgJmxyLT5wYXRoKTsKLQlmcmVlKHRtcCk7CS8qIEZyZWUgb2xkIHBhdGggKi8KKworCS8qIEZyZWUgb2xkIHBhdGggd2hlbiBuZXcgcGF0aCBpcyBhc3NpZ25lZCAqLworCWlmICh0bXAgIT0gbHItPnBhdGgpCisJCWZyZWUodG1wKTsKKwogCWlmIChyZXQgPCAwKSB7CiAJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBmaW5kIHNvdXJjZSBmaWxlIHBhdGguXG4iKTsKIAkJcmV0dXJuIHJldDsKQEAgLTcwNyw3ICs4NTksNyBAQAogCXJldCA9IGluaXRfc3ltYm9sX21hcHModXNlcik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcmV0ID0gX19zaG93X2xpbmVfcmFuZ2UobHIsIG1vZHVsZSk7CisJcmV0ID0gX19zaG93X2xpbmVfcmFuZ2UobHIsIG1vZHVsZSwgdXNlcik7CiAJZXhpdF9zeW1ib2xfbWFwcygpOwogCiAJcmV0dXJuIHJldDsKQEAgLTcxNiwxMiArODY4LDEzIEBACiBzdGF0aWMgaW50IHNob3dfYXZhaWxhYmxlX3ZhcnNfYXQoc3RydWN0IGRlYnVnaW5mbyAqZGluZm8sCiAJCQkJICBzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAogCQkJCSAgaW50IG1heF92bHMsIHN0cnVjdCBzdHJmaWx0ZXIgKl9maWx0ZXIsCi0JCQkJICBib29sIGV4dGVybnMpCisJCQkJICBib29sIGV4dGVybnMsIGNvbnN0IGNoYXIgKnRhcmdldCkKIHsKIAljaGFyICpidWY7CiAJaW50IHJldCwgaSwgbnZhcnM7CiAJc3RydWN0IHN0cl9ub2RlICpub2RlOwogCXN0cnVjdCB2YXJpYWJsZV9saXN0ICp2bHMgPSBOVUxMLCAqdmw7CisJc3RydWN0IHBlcmZfcHJvYmVfcG9pbnQgdG1wOwogCWNvbnN0IGNoYXIgKnZhcjsKIAogCWJ1ZiA9IHN5bnRoZXNpemVfcGVyZl9wcm9iZV9wb2ludCgmcGV2LT5wb2ludCk7CkBAIC03MzEsNiArODg0LDE1IEBACiAKIAlyZXQgPSBkZWJ1Z2luZm9fX2ZpbmRfYXZhaWxhYmxlX3ZhcnNfYXQoZGluZm8sIHBldiwgJnZscywKIAkJCQkJCW1heF92bHMsIGV4dGVybnMpOworCWlmICghcmV0KSB7ICAvKiBOb3QgZm91bmQsIHJldHJ5IHdpdGggYW4gYWx0ZXJuYXRpdmUgKi8KKwkJcmV0ID0gZ2V0X2FsdGVybmF0aXZlX3Byb2JlX2V2ZW50KGRpbmZvLCBwZXYsICZ0bXAsIHRhcmdldCk7CisJCWlmICghcmV0KSB7CisJCQlyZXQgPSBkZWJ1Z2luZm9fX2ZpbmRfYXZhaWxhYmxlX3ZhcnNfYXQoZGluZm8sIHBldiwKKwkJCQkJCSZ2bHMsIG1heF92bHMsIGV4dGVybnMpOworCQkJLyogUmVsZWFzZSB0aGUgb2xkIHByb2JlX3BvaW50ICovCisJCQljbGVhcl9wZXJmX3Byb2JlX3BvaW50KCZ0bXApOworCQl9CisJfQogCWlmIChyZXQgPD0gMCkgewogCQlpZiAocmV0ID09IDAgfHwgcmV0ID09IC1FTk9FTlQpIHsKIAkJCXByX2VycigiRmFpbGVkIHRvIGZpbmQgdGhlIGFkZHJlc3Mgb2YgJXNcbiIsIGJ1Zik7CkBAIC03OTMsNyArOTU1LDcgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBucGV2cyAmJiByZXQgPj0gMDsgaSsrKQogCQlyZXQgPSBzaG93X2F2YWlsYWJsZV92YXJzX2F0KGRpbmZvLCAmcGV2c1tpXSwgbWF4X3ZscywgX2ZpbHRlciwKLQkJCQkJICAgICBleHRlcm5zKTsKKwkJCQkJICAgICBleHRlcm5zLCBtb2R1bGUpOwogCiAJZGVidWdpbmZvX19kZWxldGUoZGluZm8pOwogb3V0OgpAQCAtMTczOSwxNSArMTkwMSwxMyBAQAogCiB2b2lkIGNsZWFyX3BlcmZfcHJvYmVfZXZlbnQoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldikKIHsKLQlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludCAqcHAgPSAmcGV2LT5wb2ludDsKIAlzdHJ1Y3QgcGVyZl9wcm9iZV9hcmdfZmllbGQgKmZpZWxkLCAqbmV4dDsKIAlpbnQgaTsKIAogCWZyZWUocGV2LT5ldmVudCk7CiAJZnJlZShwZXYtPmdyb3VwKTsKLQlmcmVlKHBwLT5maWxlKTsKLQlmcmVlKHBwLT5mdW5jdGlvbik7Ci0JZnJlZShwcC0+bGF6eV9saW5lKTsKKwlmcmVlKHBldi0+dGFyZ2V0KTsKKwljbGVhcl9wZXJmX3Byb2JlX3BvaW50KCZwZXYtPnBvaW50KTsKIAogCWZvciAoaSA9IDA7IGkgPCBwZXYtPm5hcmdzOyBpKyspIHsKIAkJZnJlZShwZXYtPmFyZ3NbaV0ubmFtZSk7CkBAIC0xODA1LDcgKzE5NjUsNyBAQAogCQkJICAgIiAtIHBsZWFzZSByZWJ1aWxkIGtlcm5lbCB3aXRoICVzLlxuIiwKIAkJCSAgIGlzX2twcm9iZSA/ICdrJyA6ICd1JywgY29uZmlnKTsKIAl9IGVsc2UgaWYgKGVyciA9PSAtRU5PVFNVUCkKLQkJcHJfd2FybmluZygiRGVidWdmcyBpcyBub3QgbW91bnRlZC5cbiIpOworCQlwcl93YXJuaW5nKCJUcmFjZWZzIG9yIGRlYnVnZnMgaXMgbm90IG1vdW50ZWQuXG4iKTsKIAllbHNlCiAJCXByX3dhcm5pbmcoIkZhaWxlZCB0byBvcGVuICVjcHJvYmVfZXZlbnRzOiAlc1xuIiwKIAkJCSAgIGlzX2twcm9iZSA/ICdrJyA6ICd1JywKQEAgLTE4MTYsNyArMTk3Niw3IEBACiB7CiAJLyogQm90aCBrcHJvYmVzIGFuZCB1cHJvYmVzIGFyZSBkaXNhYmxlZCwgd2FybiBpdC4gKi8KIAlpZiAoa2VyciA9PSAtRU5PVFNVUCAmJiB1ZXJyID09IC1FTk9UU1VQKQotCQlwcl93YXJuaW5nKCJEZWJ1Z2ZzIGlzIG5vdCBtb3VudGVkLlxuIik7CisJCXByX3dhcm5pbmcoIlRyYWNlZnMgb3IgZGVidWdmcyBpcyBub3QgbW91bnRlZC5cbiIpOwogCWVsc2UgaWYgKGtlcnIgPT0gLUVOT0VOVCAmJiB1ZXJyID09IC1FTk9FTlQpCiAJCXByX3dhcm5pbmcoIlBsZWFzZSByZWJ1aWxkIGtlcm5lbCB3aXRoIENPTkZJR19LUFJPQkVfRVZFTlRTICIKIAkJCSAgICJvci9hbmQgQ09ORklHX1VQUk9CRV9FVkVOVFMuXG4iKTsKQEAgLTE4MzMsMTMgKzE5OTMsMjAgQEAKIHsKIAljaGFyIGJ1ZltQQVRIX01BWF07CiAJY29uc3QgY2hhciAqX19kZWJ1Z2ZzOworCWNvbnN0IGNoYXIgKnRyYWNpbmdfZGlyID0gIiI7CiAJaW50IHJldDsKIAotCV9fZGVidWdmcyA9IGRlYnVnZnNfZmluZF9tb3VudHBvaW50KCk7Ci0JaWYgKF9fZGVidWdmcyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT1RTVVA7CisJX19kZWJ1Z2ZzID0gdHJhY2Vmc19maW5kX21vdW50cG9pbnQoKTsKKwlpZiAoX19kZWJ1Z2ZzID09IE5VTEwpIHsKKwkJdHJhY2luZ19kaXIgPSAidHJhY2luZy8iOwogCi0JcmV0ID0gZV9zbnByaW50ZihidWYsIFBBVEhfTUFYLCAiJXMvJXMiLCBfX2RlYnVnZnMsIHRyYWNlX2ZpbGUpOworCQlfX2RlYnVnZnMgPSBkZWJ1Z2ZzX2ZpbmRfbW91bnRwb2ludCgpOworCQlpZiAoX19kZWJ1Z2ZzID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT1RTVVA7CisJfQorCisJcmV0ID0gZV9zbnByaW50ZihidWYsIFBBVEhfTUFYLCAiJXMvJXMlcyIsCisJCQkgX19kZWJ1Z2ZzLCB0cmFjaW5nX2RpciwgdHJhY2VfZmlsZSk7CiAJaWYgKHJldCA+PSAwKSB7CiAJCXByX2RlYnVnKCJPcGVuaW5nICVzIHdyaXRlPSVkXG4iLCBidWYsIHJlYWR3cml0ZSk7CiAJCWlmIChyZWFkd3JpdGUgJiYgIXByb2JlX2V2ZW50X2RyeV9ydW4pCkBAIC0xODU1LDEyICsyMDIyLDEyIEBACiAKIHN0YXRpYyBpbnQgb3Blbl9rcHJvYmVfZXZlbnRzKGJvb2wgcmVhZHdyaXRlKQogewotCXJldHVybiBvcGVuX3Byb2JlX2V2ZW50cygidHJhY2luZy9rcHJvYmVfZXZlbnRzIiwgcmVhZHdyaXRlKTsKKwlyZXR1cm4gb3Blbl9wcm9iZV9ldmVudHMoImtwcm9iZV9ldmVudHMiLCByZWFkd3JpdGUpOwogfQogCiBzdGF0aWMgaW50IG9wZW5fdXByb2JlX2V2ZW50cyhib29sIHJlYWR3cml0ZSkKIHsKLQlyZXR1cm4gb3Blbl9wcm9iZV9ldmVudHMoInRyYWNpbmcvdXByb2JlX2V2ZW50cyIsIHJlYWR3cml0ZSk7CisJcmV0dXJuIG9wZW5fcHJvYmVfZXZlbnRzKCJ1cHJvYmVfZXZlbnRzIiwgcmVhZHdyaXRlKTsKIH0KIAogLyogR2V0IHJhdyBzdHJpbmcgbGlzdCBvZiBjdXJyZW50IGtwcm9iZV9ldmVudHMgIG9yIHVwcm9iZV9ldmVudHMgKi8KQEAgLTE4OTUsNiArMjA2Miw5NSBAQAogCXJldHVybiBzbDsKIH0KIAorc3RydWN0IGtwcm9iZV9ibGFja2xpc3Rfbm9kZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisJY2hhciAqc3ltYm9sOworfTsKKworc3RhdGljIHZvaWQga3Byb2JlX2JsYWNrbGlzdF9fZGVsZXRlKHN0cnVjdCBsaXN0X2hlYWQgKmJsYWNrbGlzdCkKK3sKKwlzdHJ1Y3Qga3Byb2JlX2JsYWNrbGlzdF9ub2RlICpub2RlOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KGJsYWNrbGlzdCkpIHsKKwkJbm9kZSA9IGxpc3RfZmlyc3RfZW50cnkoYmxhY2tsaXN0LAorCQkJCQlzdHJ1Y3Qga3Byb2JlX2JsYWNrbGlzdF9ub2RlLCBsaXN0KTsKKwkJbGlzdF9kZWwoJm5vZGUtPmxpc3QpOworCQlmcmVlKG5vZGUtPnN5bWJvbCk7CisJCWZyZWUobm9kZSk7CisJfQorfQorCitzdGF0aWMgaW50IGtwcm9iZV9ibGFja2xpc3RfX2xvYWQoc3RydWN0IGxpc3RfaGVhZCAqYmxhY2tsaXN0KQoreworCXN0cnVjdCBrcHJvYmVfYmxhY2tsaXN0X25vZGUgKm5vZGU7CisJY29uc3QgY2hhciAqX19kZWJ1Z2ZzID0gZGVidWdmc19maW5kX21vdW50cG9pbnQoKTsKKwljaGFyIGJ1ZltQQVRIX01BWF0sICpwOworCUZJTEUgKmZwOworCWludCByZXQ7CisKKwlpZiAoX19kZWJ1Z2ZzID09IE5VTEwpCisJCXJldHVybiAtRU5PVFNVUDsKKworCXJldCA9IGVfc25wcmludGYoYnVmLCBQQVRIX01BWCwgIiVzL2twcm9iZXMvYmxhY2tsaXN0IiwgX19kZWJ1Z2ZzKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWZwID0gZm9wZW4oYnVmLCAiciIpOworCWlmICghZnApCisJCXJldHVybiAtZXJybm87CisKKwlyZXQgPSAwOworCXdoaWxlIChmZ2V0cyhidWYsIFBBVEhfTUFYLCBmcCkpIHsKKwkJbm9kZSA9IHphbGxvYyhzaXplb2YoKm5vZGUpKTsKKwkJaWYgKCFub2RlKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKwkJSU5JVF9MSVNUX0hFQUQoJm5vZGUtPmxpc3QpOworCQlsaXN0X2FkZF90YWlsKCZub2RlLT5saXN0LCBibGFja2xpc3QpOworCQlpZiAoc3NjYW5mKGJ1ZiwgIjB4JWx4LTB4JWx4IiwgJm5vZGUtPnN0YXJ0LCAmbm9kZS0+ZW5kKSAhPSAyKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJcCA9IHN0cmNocihidWYsICdcdCcpOworCQlpZiAocCkgeworCQkJcCsrOworCQkJaWYgKHBbc3RybGVuKHApIC0gMV0gPT0gJ1xuJykKKwkJCQlwW3N0cmxlbihwKSAtIDFdID0gJ1wwJzsKKwkJfSBlbHNlCisJCQlwID0gKGNoYXIgKikidW5rbm93biI7CisJCW5vZGUtPnN5bWJvbCA9IHN0cmR1cChwKTsKKwkJaWYgKCFub2RlLT5zeW1ib2wpIHsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlicmVhazsKKwkJfQorCQlwcl9kZWJ1ZzIoIkJsYWNrbGlzdDogMHglbHgtMHglbHgsICVzXG4iLAorCQkJICBub2RlLT5zdGFydCwgbm9kZS0+ZW5kLCBub2RlLT5zeW1ib2wpOworCQlyZXQrKzsKKwl9CisJaWYgKHJldCA8IDApCisJCWtwcm9iZV9ibGFja2xpc3RfX2RlbGV0ZShibGFja2xpc3QpOworCWZjbG9zZShmcCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGtwcm9iZV9ibGFja2xpc3Rfbm9kZSAqCitrcHJvYmVfYmxhY2tsaXN0X19maW5kX2J5X2FkZHJlc3Moc3RydWN0IGxpc3RfaGVhZCAqYmxhY2tsaXN0LAorCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBrcHJvYmVfYmxhY2tsaXN0X25vZGUgKm5vZGU7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsIGJsYWNrbGlzdCwgbGlzdCkgeworCQlpZiAobm9kZS0+c3RhcnQgPD0gYWRkcmVzcyAmJiBhZGRyZXNzIDw9IG5vZGUtPmVuZCkKKwkJCXJldHVybiBub2RlOworCX0KKworCXJldHVybiBOVUxMOworfQorCiAvKiBTaG93IGFuIGV2ZW50ICovCiBzdGF0aWMgaW50IHNob3dfcGVyZl9wcm9iZV9ldmVudChzdHJ1Y3QgcGVyZl9wcm9iZV9ldmVudCAqcGV2LAogCQkJCSBjb25zdCBjaGFyICptb2R1bGUpCkBAIC0yMTAwLDYgKzIzNTYsMjcgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiBXYXJuIGlmIHRoZSBjdXJyZW50IGtlcm5lbCdzIHVwcm9iZSBpbXBsZW1lbnRhdGlvbiBpcyBvbGQgKi8KK3N0YXRpYyB2b2lkIHdhcm5fdXByb2JlX2V2ZW50X2NvbXBhdChzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldikKK3sKKwlpbnQgaTsKKwljaGFyICpidWYgPSBzeW50aGVzaXplX3Byb2JlX3RyYWNlX2NvbW1hbmQodGV2KTsKKworCS8qIE9sZCB1cHJvYmUgZXZlbnQgZG9lc24ndCBzdXBwb3J0IG1lbW9yeSBkZXJlZmVyZW5jZSAqLworCWlmICghdGV2LT51cHJvYmVzIHx8IHRldi0+bmFyZ3MgPT0gMCB8fCAhYnVmKQorCQlnb3RvIG91dDsKKworCWZvciAoaSA9IDA7IGkgPCB0ZXYtPm5hcmdzOyBpKyspCisJCWlmIChzdHJnbG9ibWF0Y2godGV2LT5hcmdzW2ldLnZhbHVlLCAiWyRAKy1dKiIpKSB7CisJCQlwcl93YXJuaW5nKCJQbGVhc2UgdXBncmFkZSB5b3VyIGtlcm5lbCB0byBhdCBsZWFzdCAiCisJCQkJICAgIjMuMTQgdG8gaGF2ZSBhY2Nlc3MgdG8gZmVhdHVyZSAlc1xuIiwKKwkJCQkgICB0ZXYtPmFyZ3NbaV0udmFsdWUpOworCQkJYnJlYWs7CisJCX0KK291dDoKKwlmcmVlKGJ1Zik7Cit9CisKIHN0YXRpYyBpbnQgX19hZGRfcHJvYmVfdHJhY2VfZXZlbnRzKHN0cnVjdCBwZXJmX3Byb2JlX2V2ZW50ICpwZXYsCiAJCQkJICAgICBzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldnMsCiAJCQkJICAgICBpbnQgbnRldnMsIGJvb2wgYWxsb3dfc3VmZml4KQpAQCAtMjEwOSw2ICsyMzg2LDggQEAKIAljaGFyIGJ1Zls2NF07CiAJY29uc3QgY2hhciAqZXZlbnQsICpncm91cDsKIAlzdHJ1Y3Qgc3RybGlzdCAqbmFtZWxpc3Q7CisJTElTVF9IRUFEKGJsYWNrbGlzdCk7CisJc3RydWN0IGtwcm9iZV9ibGFja2xpc3Rfbm9kZSAqbm9kZTsKIAogCWlmIChwZXYtPnVwcm9iZXMpCiAJCWZkID0gb3Blbl91cHJvYmVfZXZlbnRzKHRydWUpOwpAQCAtMjEyNiwxMSArMjQwNSwyNSBAQAogCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIGdldCBjdXJyZW50IGV2ZW50IGxpc3QuXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQorCS8qIEdldCBrcHJvYmUgYmxhY2tsaXN0IGlmIGV4aXN0cyAqLworCWlmICghcGV2LT51cHJvYmVzKSB7CisJCXJldCA9IGtwcm9iZV9ibGFja2xpc3RfX2xvYWQoJmJsYWNrbGlzdCk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfZGVidWcoIk5vIGtwcm9iZSBibGFja2xpc3Qgc3VwcG9ydCwgaWdub3JlZFxuIik7CisJfQogCiAJcmV0ID0gMDsKIAlwcl9pbmZvKCJBZGRlZCBuZXcgZXZlbnQlc1xuIiwgKG50ZXZzID4gMSkgPyAiczoiIDogIjoiKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnRldnM7IGkrKykgewogCQl0ZXYgPSAmdGV2c1tpXTsKKwkJLyogRW5zdXJlIHRoYXQgdGhlIGFkZHJlc3MgaXMgTk9UIGJsYWNrbGlzdGVkICovCisJCW5vZGUgPSBrcHJvYmVfYmxhY2tsaXN0X19maW5kX2J5X2FkZHJlc3MoJmJsYWNrbGlzdCwKKwkJCQkJCQkgdGV2LT5wb2ludC5hZGRyZXNzKTsKKwkJaWYgKG5vZGUpIHsKKwkJCXByX3dhcm5pbmcoIldhcm5pbmc6IFNraXBwZWQgcHJvYmluZyBvbiBibGFja2xpc3RlZCBmdW5jdGlvbjogJXNcbiIsIG5vZGUtPnN5bWJvbCk7CisJCQljb250aW51ZTsKKwkJfQorCiAJCWlmIChwZXYtPmV2ZW50KQogCQkJZXZlbnQgPSBwZXYtPmV2ZW50OwogCQllbHNlCkBAIC0yMTgwLDE0ICsyNDczLDE4IEBACiAJCSAqLwogCQlhbGxvd19zdWZmaXggPSB0cnVlOwogCX0KKwlpZiAocmV0ID09IC1FSU5WQUwgJiYgcGV2LT51cHJvYmVzKQorCQl3YXJuX3Vwcm9iZV9ldmVudF9jb21wYXQodGV2KTsKIAotCWlmIChyZXQgPj0gMCkgeworCS8qIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBza2lwIGFsbCBldmVudHMgYmVjYXVzZSBvZiBibGFja2xpc3QgKi8KKwlpZiAocmV0ID49IDAgJiYgdGV2LT5ldmVudCkgewogCQkvKiBTaG93IGhvdyB0byB1c2UgdGhlIGV2ZW50LiAqLwogCQlwcl9pbmZvKCJcbllvdSBjYW4gbm93IHVzZSBpdCBpbiBhbGwgcGVyZiB0b29scywgc3VjaCBhczpcblxuIik7CiAJCXByX2luZm8oIlx0cGVyZiByZWNvcmQgLWUgJXM6JXMgLWFSIHNsZWVwIDFcblxuIiwgdGV2LT5ncm91cCwKIAkJCSB0ZXYtPmV2ZW50KTsKIAl9CiAKKwlrcHJvYmVfYmxhY2tsaXN0X19kZWxldGUoJmJsYWNrbGlzdCk7CiAJc3RybGlzdF9fZGVsZXRlKG5hbWVsaXN0KTsKIAljbG9zZShmZCk7CiAJcmV0dXJuIHJldDsKQEAgLTIxOTksOCArMjQ5Niw3IEBACiAJc3RydWN0IHN5bWJvbCAqc3ltOwogCiAJbWFwX19mb3JfZWFjaF9zeW1ib2xfYnlfbmFtZShtYXAsIG5hbWUsIHN5bSkgewotCQlpZiAoc3ltLT5iaW5kaW5nID09IFNUQl9HTE9CQUwgfHwgc3ltLT5iaW5kaW5nID09IFNUQl9MT0NBTCkKLQkJCWZvdW5kKys7CisJCWZvdW5kKys7CiAJfQogCiAJcmV0dXJuIGZvdW5kOwpAQCAtMjIxOCw3ICsyNTE0LDYgQEAKIAkJCQkJICAgIGludCBtYXhfdGV2cywgY29uc3QgY2hhciAqdGFyZ2V0KQogewogCXN0cnVjdCBtYXAgKm1hcCA9IE5VTEw7Ci0Jc3RydWN0IGttYXAgKmttYXAgPSBOVUxMOwogCXN0cnVjdCByZWZfcmVsb2Nfc3ltICpyZWxvY19zeW0gPSBOVUxMOwogCXN0cnVjdCBzeW1ib2wgKnN5bTsKIAlzdHJ1Y3QgcHJvYmVfdHJhY2VfZXZlbnQgKnRldjsKQEAgLTIyMjcsMTEgKzI1MjIsNyBAQAogCWludCBudW1fbWF0Y2hlZF9mdW5jdGlvbnM7CiAJaW50IHJldCwgaTsKIAotCS8qIEluaXQgbWFwcyBvZiBnaXZlbiBleGVjdXRhYmxlIG9yIGtlcm5lbCAqLwotCWlmIChwZXYtPnVwcm9iZXMpCi0JCW1hcCA9IGRzb19fbmV3X21hcCh0YXJnZXQpOwotCWVsc2UKLQkJbWFwID0ga2VybmVsX2dldF9tb2R1bGVfbWFwKHRhcmdldCk7CisJbWFwID0gZ2V0X3RhcmdldF9tYXAodGFyZ2V0LCBwZXYtPnVwcm9iZXMpOwogCWlmICghbWFwKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwpAQCAtMjI1NSw4ICsyNTQ2LDcgQEAKIAl9CiAKIAlpZiAoIXBldi0+dXByb2JlcyAmJiAhcHAtPnJldHByb2JlKSB7Ci0JCWttYXAgPSBtYXBfX2ttYXAobWFwKTsKLQkJcmVsb2Nfc3ltID0ga21hcC0+cmVmX3JlbG9jX3N5bTsKKwkJcmVsb2Nfc3ltID0ga2VybmVsX2dldF9yZWZfcmVsb2Nfc3ltKCk7CiAJCWlmICghcmVsb2Nfc3ltKSB7CiAJCQlwcl93YXJuaW5nKCJSZWxvY2F0ZWQgYmFzZSBzeW1ib2wgaXMgbm90IGZvdW5kIVxuIik7CiAJCQlyZXQgPSAtRUlOVkFMOwpAQCAtMjMyNCwxMSArMjYxNCw3IEBACiAJfQogCiBvdXQ6Ci0JaWYgKG1hcCAmJiBwZXYtPnVwcm9iZXMpIHsKLQkJLyogT25seSB3aGVuIHVzaW5nIHVwcm9iZShleGVjKSBtYXAgbmVlZHMgdG8gYmUgcmVsZWFzZWQgKi8KLQkJZHNvX19kZWxldGUobWFwLT5kc28pOwotCQltYXBfX2RlbGV0ZShtYXApOwotCX0KKwlwdXRfdGFyZ2V0X21hcChtYXAsIHBldi0+dXByb2Jlcyk7CiAJcmV0dXJuIHJldDsKIAogbm9tZW1fb3V0OgpAQCAtMjM2OSw3ICsyNjU1LDcgQEAKIH07CiAKIGludCBhZGRfcGVyZl9wcm9iZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMsIGludCBucGV2cywKLQkJCSAgaW50IG1heF90ZXZzLCBjb25zdCBjaGFyICp0YXJnZXQsIGJvb2wgZm9yY2VfYWRkKQorCQkJICBpbnQgbWF4X3RldnMsIGJvb2wgZm9yY2VfYWRkKQogewogCWludCBpLCBqLCByZXQ7CiAJc3RydWN0IF9fZXZlbnRfcGFja2FnZSAqcGtnczsKQEAgLTIzOTMsNyArMjY3OSw3IEBACiAJCXJldCAgPSBjb252ZXJ0X3RvX3Byb2JlX3RyYWNlX2V2ZW50cyhwa2dzW2ldLnBldiwKIAkJCQkJCSAgICAgJnBrZ3NbaV0udGV2cywKIAkJCQkJCSAgICAgbWF4X3RldnMsCi0JCQkJCQkgICAgIHRhcmdldCk7CisJCQkJCQkgICAgIHBrZ3NbaV0ucGV2LT50YXJnZXQpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZW5kOwogCQlwa2dzW2ldLm50ZXZzID0gcmV0OwpAQCAtMjU2OCw4ICsyODU0LDcgQEAKIHN0YXRpYyBpbnQgZmlsdGVyX2F2YWlsYWJsZV9mdW5jdGlvbnMoc3RydWN0IG1hcCAqbWFwIF9fbWF5YmVfdW51c2VkLAogCQkJCSAgICAgIHN0cnVjdCBzeW1ib2wgKnN5bSkKIHsKLQlpZiAoKHN5bS0+YmluZGluZyA9PSBTVEJfR0xPQkFMIHx8IHN5bS0+YmluZGluZyA9PSBTVEJfTE9DQUwpICYmCi0JICAgIHN0cmZpbHRlcl9fY29tcGFyZShhdmFpbGFibGVfZnVuY19maWx0ZXIsIHN5bS0+bmFtZSkpCisJaWYgKHN0cmZpbHRlcl9fY29tcGFyZShhdmFpbGFibGVfZnVuY19maWx0ZXIsIHN5bS0+bmFtZSkpCiAJCXJldHVybiAwOwogCXJldHVybiAxOwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWV2ZW50LmggYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaAppbmRleCBlMDFlOTk0Li5kNmI3ODM0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZXZlbnQuaApAQCAtNzMsNyArNzMsOCBAQAogCWNoYXIJCQkqZ3JvdXA7CS8qIEdyb3VwIG5hbWUgKi8KIAlzdHJ1Y3QgcGVyZl9wcm9iZV9wb2ludAlwb2ludDsJLyogUHJvYmUgcG9pbnQgKi8KIAlpbnQJCQluYXJnczsJLyogTnVtYmVyIG9mIGFyZ3VtZW50cyAqLwotCWJvb2wJCQl1cHJvYmVzOworCWJvb2wJCQl1cHJvYmVzOwkvKiBVcHJvYmUgZXZlbnQgZmxhZyAqLworCWNoYXIJCQkqdGFyZ2V0OwkvKiBUYXJnZXQgYmluYXJ5ICovCiAJc3RydWN0IHBlcmZfcHJvYmVfYXJnCSphcmdzOwkvKiBBcmd1bWVudHMgKi8KIH07CiAKQEAgLTEyNCw4ICsxMjUsNyBAQAogZXh0ZXJuIGNvbnN0IGNoYXIgKmtlcm5lbF9nZXRfbW9kdWxlX3BhdGgoY29uc3QgY2hhciAqbW9kdWxlKTsKIAogZXh0ZXJuIGludCBhZGRfcGVyZl9wcm9iZV9ldmVudHMoc3RydWN0IHBlcmZfcHJvYmVfZXZlbnQgKnBldnMsIGludCBucGV2cywKLQkJCQkgaW50IG1heF9wcm9iZV9wb2ludHMsIGNvbnN0IGNoYXIgKm1vZHVsZSwKLQkJCQkgYm9vbCBmb3JjZV9hZGQpOworCQkJCSBpbnQgbWF4X3Byb2JlX3BvaW50cywgYm9vbCBmb3JjZV9hZGQpOwogZXh0ZXJuIGludCBkZWxfcGVyZl9wcm9iZV9ldmVudHMoc3RydWN0IHN0cmxpc3QgKmRlbGxpc3QpOwogZXh0ZXJuIGludCBzaG93X3BlcmZfcHJvYmVfZXZlbnRzKHZvaWQpOwogZXh0ZXJuIGludCBzaG93X2xpbmVfcmFuZ2Uoc3RydWN0IGxpbmVfcmFuZ2UgKmxyLCBjb25zdCBjaGFyICptb2R1bGUsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMgYi90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmMKaW5kZXggYjUyNDdkNy4uZTMwNzQyMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuYwpAQCAtNDU2LDExICs0NTYsMTIgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCWlmIChmaWVsZC0+bmFtZVswXSA9PSAnWycpIHsKLQkJCXByX2VycigiU2VtYW50aWMgZXJyb3I6ICVzIGlzIG5vdCBhIHBvaW50b3IiCisJCQlwcl9lcnIoIlNlbWFudGljIGVycm9yOiAlcyBpcyBub3QgYSBwb2ludGVyIgogCQkJICAgICAgICIgbm9yIGFycmF5LlxuIiwgdmFybmFtZSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlpZiAoZmllbGQtPnJlZikgeworCQkvKiBXaGlsZSBwcmNlc3NpbmcgdW5uYW1lZCBmaWVsZCwgd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzICovCisJCWlmIChmaWVsZC0+cmVmICYmIGR3YXJmX2RpZW5hbWUodnJfZGllKSkgewogCQkJcHJfZXJyKCJTZW1hbnRpYyBlcnJvcjogJXMgbXVzdCBiZSByZWZlcnJlZCBieSAnLidcbiIsCiAJCQkgICAgICAgZmllbGQtPm5hbWUpOwogCQkJcmV0dXJuIC1FSU5WQUw7CkBAIC00OTEsNiArNDkyLDExIEBACiAJfQogCXJlZi0+b2Zmc2V0ICs9IChsb25nKW9mZnM7CiAKKwkvKiBJZiB0aGlzIG1lbWJlciBpcyB1bm5hbWVkLCB3ZSBuZWVkIHRvIHJldXNlIHRoaXMgZmllbGQgKi8KKwlpZiAoIWR3YXJmX2RpZW5hbWUoZGllX21lbSkpCisJCXJldHVybiBjb252ZXJ0X3ZhcmlhYmxlX2ZpZWxkcyhkaWVfbWVtLCB2YXJuYW1lLCBmaWVsZCwKKwkJCQkJCSZyZWYsIGRpZV9tZW0pOworCiBuZXh0OgogCS8qIENvbnZlcnRpbmcgbmV4dCBmaWVsZCAqLwogCWlmIChmaWVsZC0+bmV4dCkKQEAgLTkxNSwxNyArOTIxLDEzIEBACiAJCWR3YXJmX2RlY2xfbGluZShzcF9kaWUsICZwZi0+bG5vKTsKIAkJcGYtPmxubyArPSBwcC0+bGluZTsKIAkJcGFyYW0tPnJldHZhbCA9IGZpbmRfcHJvYmVfcG9pbnRfYnlfbGluZShwZik7Ci0JfSBlbHNlIGlmICghZHdhcmZfZnVuY19pbmxpbmUoc3BfZGllKSkgeworCX0gZWxzZSBpZiAoZGllX2lzX2Z1bmNfaW5zdGFuY2Uoc3BfZGllKSkgeworCQkvKiBJbnN0YW5jZXMgYWx3YXlzIGhhdmUgdGhlIGVudHJ5IGFkZHJlc3MgKi8KKwkJZHdhcmZfZW50cnlwYyhzcF9kaWUsICZwZi0+YWRkcik7CiAJCS8qIFJlYWwgZnVuY3Rpb24gKi8KIAkJaWYgKHBwLT5sYXp5X2xpbmUpCiAJCQlwYXJhbS0+cmV0dmFsID0gZmluZF9wcm9iZV9wb2ludF9sYXp5KHNwX2RpZSwgcGYpOwogCQllbHNlIHsKLQkJCWlmIChkd2FyZl9lbnRyeXBjKHNwX2RpZSwgJnBmLT5hZGRyKSAhPSAwKSB7Ci0JCQkJcHJfd2FybmluZygiRmFpbGVkIHRvIGdldCBlbnRyeSBhZGRyZXNzIG9mICIKLQkJCQkJICAgIiVzLlxuIiwgZHdhcmZfZGllbmFtZShzcF9kaWUpKTsKLQkJCQlwYXJhbS0+cmV0dmFsID0gLUVOT0VOVDsKLQkJCQlyZXR1cm4gRFdBUkZfQ0JfQUJPUlQ7Ci0JCQl9CiAJCQlwZi0+YWRkciArPSBwcC0+b2Zmc2V0OwogCQkJLyogVE9ETzogQ2hlY2sgdGhlIGFkZHJlc3MgaW4gdGhpcyBmdW5jdGlvbiAqLwogCQkJcGFyYW0tPnJldHZhbCA9IGNhbGxfcHJvYmVfZmluZGVyKHNwX2RpZSwgcGYpOwpAQCAtMTM0OSwxMSArMTM1MSw4IEBACiAJY29uc3QgY2hhciAqZm5hbWUgPSBOVUxMLCAqZnVuYyA9IE5VTEwsICpiYXNlZnVuYyA9IE5VTEwsICp0bXA7CiAJaW50IGJhc2VsaW5lID0gMCwgbGluZW5vID0gMCwgcmV0ID0gMDsKIAotCS8qIEFkanVzdCBhZGRyZXNzIHdpdGggYmlhcyAqLwotCWFkZHIgKz0gZGJnLT5iaWFzOwotCiAJLyogRmluZCBjdSBkaWUgKi8KLQlpZiAoIWR3YXJmX2FkZHJkaWUoZGJnLT5kYmcsIChEd2FyZl9BZGRyKWFkZHIgLSBkYmctPmJpYXMsICZjdWRpZSkpIHsKKwlpZiAoIWR3YXJmX2FkZHJkaWUoZGJnLT5kYmcsIChEd2FyZl9BZGRyKWFkZHIsICZjdWRpZSkpIHsKIAkJcHJfd2FybmluZygiRmFpbGVkIHRvIGZpbmQgZGVidWcgaW5mb3JtYXRpb24gZm9yIGFkZHJlc3MgJWx4XG4iLAogCQkJICAgYWRkcik7CiAJCXJldCA9IC1FSU5WQUw7CkBAIC0xNTM2LDcgKzE1MzUsNyBAQAogCQlwcl9kZWJ1ZygiTmV3IGxpbmUgcmFuZ2U6ICVkIHRvICVkXG4iLCBsZi0+bG5vX3MsIGxmLT5sbm9fZSk7CiAJCWxyLT5zdGFydCA9IGxmLT5sbm9fczsKIAkJbHItPmVuZCA9IGxmLT5sbm9fZTsKLQkJaWYgKGR3YXJmX2Z1bmNfaW5saW5lKHNwX2RpZSkpCisJCWlmICghZGllX2lzX2Z1bmNfaW5zdGFuY2Uoc3BfZGllKSkKIAkJCXBhcmFtLT5yZXR2YWwgPSBkaWVfd2Fsa19pbnN0YW5jZXMoc3BfZGllLAogCQkJCQkJbGluZV9yYW5nZV9pbmxpbmVfY2IsIGxmKTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3B5dGhvbi1leHQtc291cmNlcyBiL3Rvb2xzL3BlcmYvdXRpbC9weXRob24tZXh0LXNvdXJjZXMKaW5kZXggNmM2YTY5NS4uNGQyODYyNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3B5dGhvbi1leHQtc291cmNlcworKysgYi90b29scy9wZXJmL3V0aWwvcHl0aG9uLWV4dC1zb3VyY2VzCkBAIC0xNyw2ICsxNyw1IEBACiB1dGlsL2Nncm91cC5jCiB1dGlsL3JibGlzdC5jCiB1dGlsL3N0cmxpc3QuYwotLi4vbGliL2FwaS9mcy9mcy5jCiB1dGlsL3RyYWNlLWV2ZW50LmMKIC4uLy4uL2xpYi9yYnRyZWUuYwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL0J1aWxkIGIvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL0J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MTZlMjIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvQnVpbGQKQEAgLTAsMCArMSw2IEBACitsaWJwZXJmLSQoQ09ORklHX0xJQlBFUkwpICAgKz0gdHJhY2UtZXZlbnQtcGVybC5vCitsaWJwZXJmLSQoQ09ORklHX0xJQlBZVEhPTikgKz0gdHJhY2UtZXZlbnQtcHl0aG9uLm8KKworQ0ZMQUdTX3RyYWNlLWV2ZW50LXBlcmwubyArPSAkKFBFUkxfRU1CRURfQ0NPUFRTKSAtV25vLXJlZHVuZGFudC1kZWNscyAtV25vLXN0cmljdC1wcm90b3R5cGVzIC1Xbm8tdW51c2VkLXBhcmFtZXRlciAtV25vLXNoYWRvdyAtV25vLXVuZGVmIC1Xbm8tc3dpdGNoLWRlZmF1bHQKKworQ0ZMQUdTX3RyYWNlLWV2ZW50LXB5dGhvbi5vICs9ICQoUFlUSE9OX0VNQkVEX0NDT1BUUykgLVduby1yZWR1bmRhbnQtZGVjbHMgLVduby1zdHJpY3QtcHJvdG90eXBlcyAtV25vLXVudXNlZC1wYXJhbWV0ZXIgLVduby1zaGFkb3cKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1wZXJsLmMgYi90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcGVybC5jCmluZGV4IDIyZWJjNDYuLjQzMGI1ZDIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1wZXJsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXBlcmwuYwpAQCAtMjE0LDYgKzIxNCwxMSBAQAogCQlkZWZpbmVfZXZlbnRfc3ltYm9scyhldmVudCwgZXZfbmFtZSwgYXJncy0+aGV4LmZpZWxkKTsKIAkJZGVmaW5lX2V2ZW50X3N5bWJvbHMoZXZlbnQsIGV2X25hbWUsIGFyZ3MtPmhleC5zaXplKTsKIAkJYnJlYWs7CisJY2FzZSBQUklOVF9JTlRfQVJSQVk6CisJCWRlZmluZV9ldmVudF9zeW1ib2xzKGV2ZW50LCBldl9uYW1lLCBhcmdzLT5pbnRfYXJyYXkuZmllbGQpOworCQlkZWZpbmVfZXZlbnRfc3ltYm9scyhldmVudCwgZXZfbmFtZSwgYXJncy0+aW50X2FycmF5LmNvdW50KTsKKwkJZGVmaW5lX2V2ZW50X3N5bWJvbHMoZXZlbnQsIGV2X25hbWUsIGFyZ3MtPmludF9hcnJheS5lbF9zaXplKTsKKwkJYnJlYWs7CiAJY2FzZSBQUklOVF9CU1RSSU5HOgogCWNhc2UgUFJJTlRfRFlOQU1JQ19BUlJBWToKIAljYXNlIFBSSU5UX1NUUklORzoKQEAgLTM1NSwxMCArMzYwLDkgQEAKIHN0YXRpYyB2b2lkIHBlcmxfcHJvY2Vzc19ldmVudCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCSAgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKIAkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCi0JCQkgICAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkLAotCQkJICAgICAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCBfX21heWJlX3VudXNlZCkKKwkJCSAgICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpCiB7Ci0JcGVybF9wcm9jZXNzX3RyYWNlcG9pbnQoc2FtcGxlLCBldnNlbCwgdGhyZWFkKTsKKwlwZXJsX3Byb2Nlc3NfdHJhY2Vwb2ludChzYW1wbGUsIGV2c2VsLCBhbC0+dGhyZWFkKTsKIAlwZXJsX3Byb2Nlc3NfZXZlbnRfZ2VuZXJpYyhldmVudCwgc2FtcGxlLCBldnNlbCk7CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1weXRob24uYyBiL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1weXRob24uYwppbmRleCAwYzgxNWE0Li41NTQ0YjhjIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcHl0aG9uLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXB5dGhvbi5jCkBAIC0yMzEsNiArMjMxLDExIEBACiAJCWRlZmluZV9ldmVudF9zeW1ib2xzKGV2ZW50LCBldl9uYW1lLCBhcmdzLT5oZXguZmllbGQpOwogCQlkZWZpbmVfZXZlbnRfc3ltYm9scyhldmVudCwgZXZfbmFtZSwgYXJncy0+aGV4LnNpemUpOwogCQlicmVhazsKKwljYXNlIFBSSU5UX0lOVF9BUlJBWToKKwkJZGVmaW5lX2V2ZW50X3N5bWJvbHMoZXZlbnQsIGV2X25hbWUsIGFyZ3MtPmludF9hcnJheS5maWVsZCk7CisJCWRlZmluZV9ldmVudF9zeW1ib2xzKGV2ZW50LCBldl9uYW1lLCBhcmdzLT5pbnRfYXJyYXkuY291bnQpOworCQlkZWZpbmVfZXZlbnRfc3ltYm9scyhldmVudCwgZXZfbmFtZSwgYXJncy0+aW50X2FycmF5LmVsX3NpemUpOworCQlicmVhazsKIAljYXNlIFBSSU5UX1NUUklORzoKIAkJYnJlYWs7CiAJY2FzZSBQUklOVF9UWVBFOgpAQCAtMzc2LDcgKzM4MSw2IEBACiAKIHN0YXRpYyB2b2lkIHB5dGhvbl9wcm9jZXNzX3RyYWNlcG9pbnQoc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCiAJCQkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJCSAgICAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKIAkJCQkgICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpCiB7CiAJc3RydWN0IGV2ZW50X2Zvcm1hdCAqZXZlbnQgPSBldnNlbC0+dHBfZm9ybWF0OwpAQCAtMzkwLDcgKzM5NCw3IEBACiAJaW50IGNwdSA9IHNhbXBsZS0+Y3B1OwogCXZvaWQgKmRhdGEgPSBzYW1wbGUtPnJhd19kYXRhOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBuc2VjcyA9IHNhbXBsZS0+dGltZTsKLQljb25zdCBjaGFyICpjb21tID0gdGhyZWFkX19jb21tX3N0cih0aHJlYWQpOworCWNvbnN0IGNoYXIgKmNvbW0gPSB0aHJlYWRfX2NvbW1fc3RyKGFsLT50aHJlYWQpOwogCiAJdCA9IFB5VHVwbGVfTmV3KE1BWF9GSUVMRFMpOwogCWlmICghdCkKQEAgLTY3NSw3ICs2NzksNyBAQAogCXR1cGxlX3NldF91NjQodCwgMCwgZXMtPmRiX2lkKTsKIAl0dXBsZV9zZXRfdTY0KHQsIDEsIGVzLT5ldnNlbC0+ZGJfaWQpOwogCXR1cGxlX3NldF91NjQodCwgMiwgZXMtPmFsLT5tYWNoaW5lLT5kYl9pZCk7Ci0JdHVwbGVfc2V0X3U2NCh0LCAzLCBlcy0+dGhyZWFkLT5kYl9pZCk7CisJdHVwbGVfc2V0X3U2NCh0LCAzLCBlcy0+YWwtPnRocmVhZC0+ZGJfaWQpOwogCXR1cGxlX3NldF91NjQodCwgNCwgZXMtPmNvbW1fZGJfaWQpOwogCXR1cGxlX3NldF91NjQodCwgNSwgZXMtPmRzb19kYl9pZCk7CiAJdHVwbGVfc2V0X3U2NCh0LCA2LCBlcy0+c3ltX2RiX2lkKTsKQEAgLTc2MSw3ICs3NjUsNiBAQAogCiBzdGF0aWMgdm9pZCBweXRob25fcHJvY2Vzc19nZW5lcmFsX2V2ZW50KHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCQkgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJCQkgc3RydWN0IHRocmVhZCAqdGhyZWFkLAogCQkJCQkgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsKQogewogCVB5T2JqZWN0ICpoYW5kbGVyLCAqdCwgKmRpY3QsICpjYWxsY2hhaW4sICpkaWN0X3NhbXBsZTsKQEAgLTgxMSw3ICs4MTQsNyBAQAogCXB5ZGljdF9zZXRfaXRlbV9zdHJpbmdfZGVjcmVmKGRpY3QsICJyYXdfYnVmIiwgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCiAJCQkoY29uc3QgY2hhciAqKXNhbXBsZS0+cmF3X2RhdGEsIHNhbXBsZS0+cmF3X3NpemUpKTsKIAlweWRpY3Rfc2V0X2l0ZW1fc3RyaW5nX2RlY3JlZihkaWN0LCAiY29tbSIsCi0JCQlQeVN0cmluZ19Gcm9tU3RyaW5nKHRocmVhZF9fY29tbV9zdHIodGhyZWFkKSkpOworCQkJUHlTdHJpbmdfRnJvbVN0cmluZyh0aHJlYWRfX2NvbW1fc3RyKGFsLT50aHJlYWQpKSk7CiAJaWYgKGFsLT5tYXApIHsKIAkJcHlkaWN0X3NldF9pdGVtX3N0cmluZ19kZWNyZWYoZGljdCwgImRzbyIsCiAJCQlQeVN0cmluZ19Gcm9tU3RyaW5nKGFsLT5tYXAtPmRzby0+bmFtZSkpOwpAQCAtODM4LDIyICs4NDEsMjAgQEAKIHN0YXRpYyB2b2lkIHB5dGhvbl9wcm9jZXNzX2V2ZW50KHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKIAkJCQkgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJCSBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCiAJCQkJIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCkKIHsKIAlzdHJ1Y3QgdGFibGVzICp0YWJsZXMgPSAmdGFibGVzX2dsb2JhbDsKIAogCXN3aXRjaCAoZXZzZWwtPmF0dHIudHlwZSkgewogCWNhc2UgUEVSRl9UWVBFX1RSQUNFUE9JTlQ6Ci0JCXB5dGhvbl9wcm9jZXNzX3RyYWNlcG9pbnQoc2FtcGxlLCBldnNlbCwgdGhyZWFkLCBhbCk7CisJCXB5dGhvbl9wcm9jZXNzX3RyYWNlcG9pbnQoc2FtcGxlLCBldnNlbCwgYWwpOwogCQlicmVhazsKIAkvKiBSZXNlcnZlIGZvciBmdXR1cmUgcHJvY2Vzc19ody9zdy9yYXcgQVBJcyAqLwogCWRlZmF1bHQ6CiAJCWlmICh0YWJsZXMtPmRiX2V4cG9ydF9tb2RlKQotCQkJZGJfZXhwb3J0X19zYW1wbGUoJnRhYmxlcy0+ZGJlLCBldmVudCwgc2FtcGxlLCBldnNlbCwKLQkJCQkJICB0aHJlYWQsIGFsKTsKKwkJCWRiX2V4cG9ydF9fc2FtcGxlKCZ0YWJsZXMtPmRiZSwgZXZlbnQsIHNhbXBsZSwgZXZzZWwsIGFsKTsKIAkJZWxzZQotCQkJcHl0aG9uX3Byb2Nlc3NfZ2VuZXJhbF9ldmVudChzYW1wbGUsIGV2c2VsLCB0aHJlYWQsIGFsKTsKKwkJCXB5dGhvbl9wcm9jZXNzX2dlbmVyYWxfZXZlbnQoc2FtcGxlLCBldnNlbCwgYWwpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmMKaW5kZXggMGJhZjc1Zi4uMGM3NDAxMiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYworKysgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCkBAIC0xNiw2ICsxNiwxMiBAQAogI2luY2x1ZGUgInBlcmZfcmVncy5oIgogI2luY2x1ZGUgImFzbS9idWcuaCIKIAorc3RhdGljIGludCBtYWNoaW5lc19fZGVsaXZlcl9ldmVudChzdHJ1Y3QgbWFjaGluZXMgKm1hY2hpbmVzLAorCQkJCSAgIHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAorCQkJCSAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJCSAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJCSAgIHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsIHU2NCBmaWxlX29mZnNldCk7CisKIHN0YXRpYyBpbnQgcGVyZl9zZXNzaW9uX19vcGVuKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCiB7CiAJc3RydWN0IHBlcmZfZGF0YV9maWxlICpmaWxlID0gc2Vzc2lvbi0+ZmlsZTsKQEAgLTg2LDYgKzkyLDIzIEBACiAJbWFjaGluZXNfX3NldF9jb21tX2V4ZWMoJnNlc3Npb24tPm1hY2hpbmVzLCBjb21tX2V4ZWMpOwogfQogCitzdGF0aWMgaW50IG9yZGVyZWRfZXZlbnRzX19kZWxpdmVyX2V2ZW50KHN0cnVjdCBvcmRlcmVkX2V2ZW50cyAqb2UsCisJCQkJCSBzdHJ1Y3Qgb3JkZXJlZF9ldmVudCAqZXZlbnQpCit7CisJc3RydWN0IHBlcmZfc2FtcGxlIHNhbXBsZTsKKwlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uID0gY29udGFpbmVyX29mKG9lLCBzdHJ1Y3QgcGVyZl9zZXNzaW9uLAorCQkJCQkJICAgIG9yZGVyZWRfZXZlbnRzKTsKKwlpbnQgcmV0ID0gcGVyZl9ldmxpc3RfX3BhcnNlX3NhbXBsZShzZXNzaW9uLT5ldmxpc3QsIGV2ZW50LT5ldmVudCwgJnNhbXBsZSk7CisKKwlpZiAocmV0KSB7CisJCXByX2VycigiQ2FuJ3QgcGFyc2Ugc2FtcGxlLCBlcnIgPSAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gbWFjaGluZXNfX2RlbGl2ZXJfZXZlbnQoJnNlc3Npb24tPm1hY2hpbmVzLCBzZXNzaW9uLT5ldmxpc3QsIGV2ZW50LT5ldmVudCwKKwkJCQkgICAgICAgJnNhbXBsZSwgc2Vzc2lvbi0+dG9vbCwgZXZlbnQtPmZpbGVfb2Zmc2V0KTsKK30KKwogc3RydWN0IHBlcmZfc2Vzc2lvbiAqcGVyZl9zZXNzaW9uX19uZXcoc3RydWN0IHBlcmZfZGF0YV9maWxlICpmaWxlLAogCQkJCSAgICAgICBib29sIHJlcGlwZSwgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCkKIHsKQEAgLTk1LDggKzExOCw5IEBACiAJCWdvdG8gb3V0OwogCiAJc2Vzc2lvbi0+cmVwaXBlID0gcmVwaXBlOwotCW9yZGVyZWRfZXZlbnRzX19pbml0KCZzZXNzaW9uLT5vcmRlcmVkX2V2ZW50cyk7CisJc2Vzc2lvbi0+dG9vbCAgID0gdG9vbDsKIAltYWNoaW5lc19faW5pdCgmc2Vzc2lvbi0+bWFjaGluZXMpOworCW9yZGVyZWRfZXZlbnRzX19pbml0KCZzZXNzaW9uLT5vcmRlcmVkX2V2ZW50cywgb3JkZXJlZF9ldmVudHNfX2RlbGl2ZXJfZXZlbnQpOwogCiAJaWYgKGZpbGUpIHsKIAkJaWYgKHBlcmZfZGF0YV9maWxlX19vcGVuKGZpbGUpKQpAQCAtMTM4LDExICsxNjIsNiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBwZXJmX3Nlc3Npb25fX2RlbGV0ZV9kZWFkX3RocmVhZHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKLXsKLQltYWNoaW5lX19kZWxldGVfZGVhZF90aHJlYWRzKCZzZXNzaW9uLT5tYWNoaW5lcy5ob3N0KTsKLX0KLQogc3RhdGljIHZvaWQgcGVyZl9zZXNzaW9uX19kZWxldGVfdGhyZWFkcyhzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQogewogCW1hY2hpbmVfX2RlbGV0ZV90aHJlYWRzKCZzZXNzaW9uLT5tYWNoaW5lcy5ob3N0KTsKQEAgLTE2Nyw3ICsxODYsNiBAQAogdm9pZCBwZXJmX3Nlc3Npb25fX2RlbGV0ZShzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQogewogCXBlcmZfc2Vzc2lvbl9fZGVzdHJveV9rZXJuZWxfbWFwcyhzZXNzaW9uKTsKLQlwZXJmX3Nlc3Npb25fX2RlbGV0ZV9kZWFkX3RocmVhZHMoc2Vzc2lvbik7CiAJcGVyZl9zZXNzaW9uX19kZWxldGVfdGhyZWFkcyhzZXNzaW9uKTsKIAlwZXJmX3Nlc3Npb25fZW52X19kZWxldGUoJnNlc3Npb24tPmhlYWRlci5lbnYpOwogCW1hY2hpbmVzX19leGl0KCZzZXNzaW9uLT5tYWNoaW5lcyk7CkBAIC0yMTUsMTAgKzIzMywxNyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHByb2Nlc3NfYnVpbGRfaWRfc3R1YihzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fbWF5YmVfdW51c2VkLAorCQkJCSB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCBfX21heWJlX3VudXNlZCwKKwkJCQkgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiBfX21heWJlX3VudXNlZCkKK3sKKwlkdW1wX3ByaW50ZigiOiB1bmhhbmRsZWQhXG4iKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBwcm9jZXNzX2ZpbmlzaGVkX3JvdW5kX3N0dWIoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCBfX21heWJlX3VudXNlZCwKIAkJCQkgICAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQgX19tYXliZV91bnVzZWQsCi0JCQkJICAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnBlcmZfc2Vzc2lvbgotCQkJCSAgICAgICBfX21heWJlX3VudXNlZCkKKwkJCQkgICAgICAgc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSBfX21heWJlX3VudXNlZCkKIHsKIAlkdW1wX3ByaW50ZigiOiB1bmhhbmRsZWQhXG4iKTsKIAlyZXR1cm4gMDsKQEAgLTIyNiw3ICsyNTEsNyBAQAogCiBzdGF0aWMgaW50IHByb2Nlc3NfZmluaXNoZWRfcm91bmQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKIAkJCQkgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAotCQkJCSAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7CisJCQkJICBzdHJ1Y3Qgb3JkZXJlZF9ldmVudHMgKm9lKTsKIAogc3RhdGljIGludCBwcm9jZXNzX2lkX2luZGV4X3N0dWIoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCBfX21heWJlX3VudXNlZCwKIAkJCQkgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQgX19tYXliZV91bnVzZWQsCkBAIC0yNjQsNyArMjg5LDcgQEAKIAlpZiAodG9vbC0+dHJhY2luZ19kYXRhID09IE5VTEwpCiAJCXRvb2wtPnRyYWNpbmdfZGF0YSA9IHByb2Nlc3NfZXZlbnRfc3ludGhfdHJhY2luZ19kYXRhX3N0dWI7CiAJaWYgKHRvb2wtPmJ1aWxkX2lkID09IE5VTEwpCi0JCXRvb2wtPmJ1aWxkX2lkID0gcHJvY2Vzc19maW5pc2hlZF9yb3VuZF9zdHViOworCQl0b29sLT5idWlsZF9pZCA9IHByb2Nlc3NfYnVpbGRfaWRfc3R1YjsKIAlpZiAodG9vbC0+ZmluaXNoZWRfcm91bmQgPT0gTlVMTCkgewogCQlpZiAodG9vbC0+b3JkZXJlZF9ldmVudHMpCiAJCQl0b29sLT5maW5pc2hlZF9yb3VuZCA9IHByb2Nlc3NfZmluaXNoZWRfcm91bmQ7CkBAIC01MTQsNTQgKzUzOSw4MCBAQAogICogICAgICBGbHVzaCBldmVyeSBldmVudHMgYmVsb3cgdGltZXN0YW1wIDcKICAqICAgICAgZXRjLi4uCiAgKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19maW5pc2hlZF9yb3VuZChzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorc3RhdGljIGludCBwcm9jZXNzX2ZpbmlzaGVkX3JvdW5kKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgX19tYXliZV91bnVzZWQsCiAJCQkJICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCBfX21heWJlX3VudXNlZCwKLQkJCQkgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCisJCQkJICBzdHJ1Y3Qgb3JkZXJlZF9ldmVudHMgKm9lKQogewotCXJldHVybiBvcmRlcmVkX2V2ZW50c19fZmx1c2goc2Vzc2lvbiwgdG9vbCwgT0VfRkxVU0hfX1JPVU5EKTsKKwlyZXR1cm4gb3JkZXJlZF9ldmVudHNfX2ZsdXNoKG9lLCBPRV9GTFVTSF9fUk9VTkQpOwogfQogCi1pbnQgcGVyZl9zZXNzaW9uX3F1ZXVlX2V2ZW50KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnMsIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAotCQkJICAgICBzdHJ1Y3QgcGVyZl90b29sICp0b29sLCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKLQkJCSAgICAgdTY0IGZpbGVfb2Zmc2V0KQoraW50IHBlcmZfc2Vzc2lvbl9fcXVldWVfZXZlbnQoc3RydWN0IHBlcmZfc2Vzc2lvbiAqcywgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCisJCQkgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwgdTY0IGZpbGVfb2Zmc2V0KQogewotCXN0cnVjdCBvcmRlcmVkX2V2ZW50cyAqb2UgPSAmcy0+b3JkZXJlZF9ldmVudHM7Ci0JdTY0IHRpbWVzdGFtcCA9IHNhbXBsZS0+dGltZTsKLQlzdHJ1Y3Qgb3JkZXJlZF9ldmVudCAqbmV3OwotCi0JaWYgKCF0aW1lc3RhbXAgfHwgdGltZXN0YW1wID09IH4wVUxMKQotCQlyZXR1cm4gLUVUSU1FOwotCi0JaWYgKHRpbWVzdGFtcCA8IG9lLT5sYXN0X2ZsdXNoKSB7Ci0JCXByX29lX3RpbWUodGltZXN0YW1wLCAgICAgICJvdXQgb2Ygb3JkZXIgZXZlbnRcbiIpOwotCQlwcl9vZV90aW1lKG9lLT5sYXN0X2ZsdXNoLCAibGFzdCBmbHVzaCwgbGFzdF9mbHVzaF90eXBlICVkXG4iLAotCQkJICAgb2UtPmxhc3RfZmx1c2hfdHlwZSk7Ci0KLQkJcy0+c3RhdHMubnJfdW5vcmRlcmVkX2V2ZW50cysrOwotCX0KLQotCW5ldyA9IG9yZGVyZWRfZXZlbnRzX19uZXcob2UsIHRpbWVzdGFtcCwgZXZlbnQpOwotCWlmICghbmV3KSB7Ci0JCW9yZGVyZWRfZXZlbnRzX19mbHVzaChzLCB0b29sLCBPRV9GTFVTSF9fSEFMRik7Ci0JCW5ldyA9IG9yZGVyZWRfZXZlbnRzX19uZXcob2UsIHRpbWVzdGFtcCwgZXZlbnQpOwotCX0KLQotCWlmICghbmV3KQotCQlyZXR1cm4gLUVOT01FTTsKLQotCW5ldy0+ZmlsZV9vZmZzZXQgPSBmaWxlX29mZnNldDsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gb3JkZXJlZF9ldmVudHNfX3F1ZXVlKCZzLT5vcmRlcmVkX2V2ZW50cywgZXZlbnQsIHNhbXBsZSwgZmlsZV9vZmZzZXQpOwogfQogCi1zdGF0aWMgdm9pZCBjYWxsY2hhaW5fX3ByaW50ZihzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKK3N0YXRpYyB2b2lkIGNhbGxjaGFpbl9fbGJyX2NhbGxzdGFja19wcmludGYoc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUpCiB7CisJc3RydWN0IGlwX2NhbGxjaGFpbiAqY2FsbGNoYWluID0gc2FtcGxlLT5jYWxsY2hhaW47CisJc3RydWN0IGJyYW5jaF9zdGFjayAqbGJyX3N0YWNrID0gc2FtcGxlLT5icmFuY2hfc3RhY2s7CisJdTY0IGtlcm5lbF9jYWxsY2hhaW5fbnIgPSBjYWxsY2hhaW4tPm5yOwogCXVuc2lnbmVkIGludCBpOwogCi0JcHJpbnRmKCIuLi4gY2hhaW46IG5yOiUiIFBSSXU2NCAiXG4iLCBzYW1wbGUtPmNhbGxjaGFpbi0+bnIpOworCWZvciAoaSA9IDA7IGkgPCBrZXJuZWxfY2FsbGNoYWluX25yOyBpKyspIHsKKwkJaWYgKGNhbGxjaGFpbi0+aXBzW2ldID09IFBFUkZfQ09OVEVYVF9VU0VSKQorCQkJYnJlYWs7CisJfQogCi0JZm9yIChpID0gMDsgaSA8IHNhbXBsZS0+Y2FsbGNoYWluLT5ucjsgaSsrKQorCWlmICgoaSAhPSBrZXJuZWxfY2FsbGNoYWluX25yKSAmJiBsYnJfc3RhY2stPm5yKSB7CisJCXU2NCB0b3RhbF9ucjsKKwkJLyoKKwkJICogTEJSIGNhbGxzdGFjayBjYW4gb25seSBnZXQgdXNlciBjYWxsIGNoYWluLAorCQkgKiBpIGlzIGtlcm5lbCBjYWxsIGNoYWluIG51bWJlciwKKwkJICogMSBpcyBQRVJGX0NPTlRFWFRfVVNFUi4KKwkJICoKKwkJICogVGhlIHVzZXIgY2FsbCBjaGFpbiBpcyBzdG9yZWQgaW4gTEJSIHJlZ2lzdGVycy4KKwkJICogTEJSIGFyZSBwYWlyIHJlZ2lzdGVycy4gVGhlIGNhbGxlciBpcyBzdG9yZWQKKwkJICogaW4gImZyb20iIHJlZ2lzdGVyLCB3aGlsZSB0aGUgY2FsbGVlIGlzIHN0b3JlZAorCQkgKiBpbiAidG8iIHJlZ2lzdGVyLgorCQkgKiBGb3IgZXhhbXBsZSwgdGhlcmUgaXMgYSBjYWxsIHN0YWNrCisJCSAqICJBIi0+IkIiLT4iQyItPiJEIi4KKwkJICogVGhlIExCUiByZWdpc3RlcnMgd2lsbCByZWNvcmRlIGxpa2UKKwkJICogIkMiLT4iRCIsICJCIi0+IkMiLCAiQSItPiJCIi4KKwkJICogU28gb25seSB0aGUgZmlyc3QgInRvIiByZWdpc3RlciBhbmQgYWxsICJmcm9tIgorCQkgKiByZWdpc3RlcnMgYXJlIG5lZWRlZCB0byBjb25zdHJ1Y3QgdGhlIHdob2xlIHN0YWNrLgorCQkgKi8KKwkJdG90YWxfbnIgPSBpICsgMSArIGxicl9zdGFjay0+bnIgKyAxOworCQlrZXJuZWxfY2FsbGNoYWluX25yID0gaSArIDE7CisKKwkJcHJpbnRmKCIuLi4gTEJSIGNhbGwgY2hhaW46IG5yOiUiIFBSSXU2NCAiXG4iLCB0b3RhbF9ucik7CisKKwkJZm9yIChpID0gMDsgaSA8IGtlcm5lbF9jYWxsY2hhaW5fbnI7IGkrKykKKwkJCXByaW50ZigiLi4uLi4gJTJkOiAlMDE2IiBQUkl4NjQgIlxuIiwKKwkJCSAgICAgICBpLCBjYWxsY2hhaW4tPmlwc1tpXSk7CisKIAkJcHJpbnRmKCIuLi4uLiAlMmQ6ICUwMTYiIFBSSXg2NCAiXG4iLAotCQkgICAgICAgaSwgc2FtcGxlLT5jYWxsY2hhaW4tPmlwc1tpXSk7CisJCSAgICAgICAoaW50KShrZXJuZWxfY2FsbGNoYWluX25yKSwgbGJyX3N0YWNrLT5lbnRyaWVzWzBdLnRvKTsKKwkJZm9yIChpID0gMDsgaSA8IGxicl9zdGFjay0+bnI7IGkrKykKKwkJCXByaW50ZigiLi4uLi4gJTJkOiAlMDE2IiBQUkl4NjQgIlxuIiwKKwkJCSAgICAgICAoaW50KShpICsga2VybmVsX2NhbGxjaGFpbl9uciArIDEpLCBsYnJfc3RhY2stPmVudHJpZXNbaV0uZnJvbSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjYWxsY2hhaW5fX3ByaW50ZihzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgaXBfY2FsbGNoYWluICpjYWxsY2hhaW4gPSBzYW1wbGUtPmNhbGxjaGFpbjsKKworCWlmIChoYXNfYnJhbmNoX2NhbGxzdGFjayhldnNlbCkpCisJCWNhbGxjaGFpbl9fbGJyX2NhbGxzdGFja19wcmludGYoc2FtcGxlKTsKKworCXByaW50ZigiLi4uIEZQIGNoYWluOiBucjolIiBQUkl1NjQgIlxuIiwgY2FsbGNoYWluLT5ucik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FsbGNoYWluLT5ucjsgaSsrKQorCQlwcmludGYoIi4uLi4uICUyZDogJTAxNiIgUFJJeDY0ICJcbiIsCisJCSAgICAgICBpLCBjYWxsY2hhaW4tPmlwc1tpXSk7CiB9CiAKIHN0YXRpYyB2b2lkIGJyYW5jaF9zdGFja19fcHJpbnRmKHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlKQpAQCAtNjM2LDE0ICs2ODcsMTQgQEAKIAkgICAgICAgZHVtcC0+c2l6ZSwgZHVtcC0+b2Zmc2V0KTsKIH0KIAotc3RhdGljIHZvaWQgcGVyZl9zZXNzaW9uX19wcmludF90c3RhbXAoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKK3N0YXRpYyB2b2lkIHBlcmZfZXZsaXN0X19wcmludF90c3RhbXAoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCiAJCQkJICAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKIHsKLQl1NjQgc2FtcGxlX3R5cGUgPSBfX3BlcmZfZXZsaXN0X19jb21iaW5lZF9zYW1wbGVfdHlwZShzZXNzaW9uLT5ldmxpc3QpOworCXU2NCBzYW1wbGVfdHlwZSA9IF9fcGVyZl9ldmxpc3RfX2NvbWJpbmVkX3NhbXBsZV90eXBlKGV2bGlzdCk7CiAKIAlpZiAoZXZlbnQtPmhlYWRlci50eXBlICE9IFBFUkZfUkVDT1JEX1NBTVBMRSAmJgotCSAgICAhcGVyZl9ldmxpc3RfX3NhbXBsZV9pZF9hbGwoc2Vzc2lvbi0+ZXZsaXN0KSkgeworCSAgICAhcGVyZl9ldmxpc3RfX3NhbXBsZV9pZF9hbGwoZXZsaXN0KSkgewogCQlmcHV0cygiLTEgLTEgIiwgc3Rkb3V0KTsKIAkJcmV0dXJuOwogCX0KQEAgLTY4NSw3ICs3MzYsNyBAQAogCQkJc2FtcGxlLT5yZWFkLm9uZS5pZCwgc2FtcGxlLT5yZWFkLm9uZS52YWx1ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGR1bXBfZXZlbnQoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCitzdGF0aWMgdm9pZCBkdW1wX2V2ZW50KHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJICAgICAgIHU2NCBmaWxlX29mZnNldCwgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUpCiB7CiAJaWYgKCFkdW1wX3RyYWNlKQpAQCAtNjk3LDcgKzc0OCw3IEBACiAJdHJhY2VfZXZlbnQoZXZlbnQpOwogCiAJaWYgKHNhbXBsZSkKLQkJcGVyZl9zZXNzaW9uX19wcmludF90c3RhbXAoc2Vzc2lvbiwgZXZlbnQsIHNhbXBsZSk7CisJCXBlcmZfZXZsaXN0X19wcmludF90c3RhbXAoZXZsaXN0LCBldmVudCwgc2FtcGxlKTsKIAogCXByaW50ZigiJSMiIFBSSXg2NCAiIFslI3hdOiBQRVJGX1JFQ09SRF8lcyIsIGZpbGVfb2Zmc2V0LAogCSAgICAgICBldmVudC0+aGVhZGVyLnNpemUsIHBlcmZfZXZlbnRfX25hbWUoZXZlbnQtPmhlYWRlci50eXBlKSk7CkBAIC03MTgsOSArNzY5LDkgQEAKIAlzYW1wbGVfdHlwZSA9IGV2c2VsLT5hdHRyLnNhbXBsZV90eXBlOwogCiAJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ0FMTENIQUlOKQotCQljYWxsY2hhaW5fX3ByaW50ZihzYW1wbGUpOworCQljYWxsY2hhaW5fX3ByaW50ZihldnNlbCwgc2FtcGxlKTsKIAotCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0JSQU5DSF9TVEFDSykKKwlpZiAoKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQlJBTkNIX1NUQUNLKSAmJiAhaGFzX2JyYW5jaF9jYWxsc3RhY2soZXZzZWwpKQogCQlicmFuY2hfc3RhY2tfX3ByaW50ZihzYW1wbGUpOwogCiAJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUkVHU19VU0VSKQpAQCAtNzQ1LDggKzc5Niw3IEBACiAJCXNhbXBsZV9yZWFkX19wcmludGYoc2FtcGxlLCBldnNlbC0+YXR0ci5yZWFkX2Zvcm1hdCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgbWFjaGluZSAqCi0JcGVyZl9zZXNzaW9uX19maW5kX21hY2hpbmVfZm9yX2NwdW1vZGUoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKK3N0YXRpYyBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZXNfX2ZpbmRfZm9yX2NwdW1vZGUoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcywKIAkJCQkJICAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCQkgICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUpCiB7CkBAIC03NjQsMjYgKzgxNCwyNCBAQAogCQllbHNlCiAJCQlwaWQgPSBzYW1wbGUtPnBpZDsKIAotCQltYWNoaW5lID0gcGVyZl9zZXNzaW9uX19maW5kX21hY2hpbmUoc2Vzc2lvbiwgcGlkKTsKKwkJbWFjaGluZSA9IG1hY2hpbmVzX19maW5kKG1hY2hpbmVzLCBwaWQpOwogCQlpZiAoIW1hY2hpbmUpCi0JCQltYWNoaW5lID0gcGVyZl9zZXNzaW9uX19maW5kbmV3X21hY2hpbmUoc2Vzc2lvbiwKLQkJCQkJCURFRkFVTFRfR1VFU1RfS0VSTkVMX0lEKTsKKwkJCW1hY2hpbmUgPSBtYWNoaW5lc19fZmluZChtYWNoaW5lcywgREVGQVVMVF9HVUVTVF9LRVJORUxfSUQpOwogCQlyZXR1cm4gbWFjaGluZTsKIAl9CiAKLQlyZXR1cm4gJnNlc3Npb24tPm1hY2hpbmVzLmhvc3Q7CisJcmV0dXJuICZtYWNoaW5lcy0+aG9zdDsKIH0KIAotc3RhdGljIGludCBkZWxpdmVyX3NhbXBsZV92YWx1ZShzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAorc3RhdGljIGludCBkZWxpdmVyX3NhbXBsZV92YWx1ZShzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKIAkJCQlzdHJ1Y3QgcGVyZl90b29sICp0b29sLAogCQkJCXVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCXN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCXN0cnVjdCBzYW1wbGVfcmVhZF92YWx1ZSAqdiwKIAkJCQlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKLQlzdHJ1Y3QgcGVyZl9zYW1wbGVfaWQgKnNpZDsKKwlzdHJ1Y3QgcGVyZl9zYW1wbGVfaWQgKnNpZCA9IHBlcmZfZXZsaXN0X19pZDJzaWQoZXZsaXN0LCB2LT5pZCk7CiAKLQlzaWQgPSBwZXJmX2V2bGlzdF9faWQyc2lkKHNlc3Npb24tPmV2bGlzdCwgdi0+aWQpOwogCWlmIChzaWQpIHsKIAkJc2FtcGxlLT5pZCAgICAgPSB2LT5pZDsKIAkJc2FtcGxlLT5wZXJpb2QgPSB2LT52YWx1ZSAtIHNpZC0+cGVyaW9kOwpAQCAtNzkxLDE0ICs4MzksMTQgQEAKIAl9CiAKIAlpZiAoIXNpZCB8fCBzaWQtPmV2c2VsID09IE5VTEwpIHsKLQkJKytzZXNzaW9uLT5zdGF0cy5ucl91bmtub3duX2lkOworCQkrK2V2bGlzdC0+c3RhdHMubnJfdW5rbm93bl9pZDsKIAkJcmV0dXJuIDA7CiAJfQogCiAJcmV0dXJuIHRvb2wtPnNhbXBsZSh0b29sLCBldmVudCwgc2FtcGxlLCBzaWQtPmV2c2VsLCBtYWNoaW5lKTsKIH0KIAotc3RhdGljIGludCBkZWxpdmVyX3NhbXBsZV9ncm91cChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAorc3RhdGljIGludCBkZWxpdmVyX3NhbXBsZV9ncm91cChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKIAkJCQlzdHJ1Y3QgcGVyZl90b29sICp0b29sLAogCQkJCXVuaW9uICBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKQEAgLTgwOCw3ICs4NTYsNyBAQAogCXU2NCBpOwogCiAJZm9yIChpID0gMDsgaSA8IHNhbXBsZS0+cmVhZC5ncm91cC5ucjsgaSsrKSB7Ci0JCXJldCA9IGRlbGl2ZXJfc2FtcGxlX3ZhbHVlKHNlc3Npb24sIHRvb2wsIGV2ZW50LCBzYW1wbGUsCisJCXJldCA9IGRlbGl2ZXJfc2FtcGxlX3ZhbHVlKGV2bGlzdCwgdG9vbCwgZXZlbnQsIHNhbXBsZSwKIAkJCQkJICAgJnNhbXBsZS0+cmVhZC5ncm91cC52YWx1ZXNbaV0sCiAJCQkJCSAgIG1hY2hpbmUpOwogCQlpZiAocmV0KQpAQCAtODE5LDcgKzg2Nyw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLXBlcmZfc2Vzc2lvbl9fZGVsaXZlcl9zYW1wbGUoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKyBwZXJmX2V2bGlzdF9fZGVsaXZlcl9zYW1wbGUoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCiAJCQkgICAgIHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCiAJCQkgICAgIHVuaW9uICBwZXJmX2V2ZW50ICpldmVudCwKIAkJCSAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCkBAIC04MzYsNDEgKzg4NCw0MCBAQAogCiAJLyogRm9yIFBFUkZfU0FNUExFX1JFQUQgd2UgaGF2ZSBlaXRoZXIgc2luZ2xlIG9yIGdyb3VwIG1vZGUuICovCiAJaWYgKHJlYWRfZm9ybWF0ICYgUEVSRl9GT1JNQVRfR1JPVVApCi0JCXJldHVybiBkZWxpdmVyX3NhbXBsZV9ncm91cChzZXNzaW9uLCB0b29sLCBldmVudCwgc2FtcGxlLAorCQlyZXR1cm4gZGVsaXZlcl9zYW1wbGVfZ3JvdXAoZXZsaXN0LCB0b29sLCBldmVudCwgc2FtcGxlLAogCQkJCQkgICAgbWFjaGluZSk7CiAJZWxzZQotCQlyZXR1cm4gZGVsaXZlcl9zYW1wbGVfdmFsdWUoc2Vzc2lvbiwgdG9vbCwgZXZlbnQsIHNhbXBsZSwKKwkJcmV0dXJuIGRlbGl2ZXJfc2FtcGxlX3ZhbHVlKGV2bGlzdCwgdG9vbCwgZXZlbnQsIHNhbXBsZSwKIAkJCQkJICAgICZzYW1wbGUtPnJlYWQub25lLCBtYWNoaW5lKTsKIH0KIAotaW50IHBlcmZfc2Vzc2lvbl9fZGVsaXZlcl9ldmVudChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAotCQkJCXVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAotCQkJCXN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAotCQkJCXN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsIHU2NCBmaWxlX29mZnNldCkKK3N0YXRpYyBpbnQgbWFjaGluZXNfX2RlbGl2ZXJfZXZlbnQoc3RydWN0IG1hY2hpbmVzICptYWNoaW5lcywKKwkJCQkgICBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKKwkJCQkgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQkgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCQkgICBzdHJ1Y3QgcGVyZl90b29sICp0b29sLCB1NjQgZmlsZV9vZmZzZXQpCiB7CiAJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOwogCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lOwogCi0JZHVtcF9ldmVudChzZXNzaW9uLCBldmVudCwgZmlsZV9vZmZzZXQsIHNhbXBsZSk7CisJZHVtcF9ldmVudChldmxpc3QsIGV2ZW50LCBmaWxlX29mZnNldCwgc2FtcGxlKTsKIAotCWV2c2VsID0gcGVyZl9ldmxpc3RfX2lkMmV2c2VsKHNlc3Npb24tPmV2bGlzdCwgc2FtcGxlLT5pZCk7CisJZXZzZWwgPSBwZXJmX2V2bGlzdF9faWQyZXZzZWwoZXZsaXN0LCBzYW1wbGUtPmlkKTsKIAotCW1hY2hpbmUgPSBwZXJmX3Nlc3Npb25fX2ZpbmRfbWFjaGluZV9mb3JfY3B1bW9kZShzZXNzaW9uLCBldmVudCwKLQkJCQkJCQkgc2FtcGxlKTsKKwltYWNoaW5lID0gbWFjaGluZXNfX2ZpbmRfZm9yX2NwdW1vZGUobWFjaGluZXMsIGV2ZW50LCBzYW1wbGUpOwogCiAJc3dpdGNoIChldmVudC0+aGVhZGVyLnR5cGUpIHsKIAljYXNlIFBFUkZfUkVDT1JEX1NBTVBMRToKIAkJZHVtcF9zYW1wbGUoZXZzZWwsIGV2ZW50LCBzYW1wbGUpOwogCQlpZiAoZXZzZWwgPT0gTlVMTCkgewotCQkJKytzZXNzaW9uLT5zdGF0cy5ucl91bmtub3duX2lkOworCQkJKytldmxpc3QtPnN0YXRzLm5yX3Vua25vd25faWQ7CiAJCQlyZXR1cm4gMDsKIAkJfQogCQlpZiAobWFjaGluZSA9PSBOVUxMKSB7Ci0JCQkrK3Nlc3Npb24tPnN0YXRzLm5yX3VucHJvY2Vzc2FibGVfc2FtcGxlczsKKwkJCSsrZXZsaXN0LT5zdGF0cy5ucl91bnByb2Nlc3NhYmxlX3NhbXBsZXM7CiAJCQlyZXR1cm4gMDsKIAkJfQotCQlyZXR1cm4gcGVyZl9zZXNzaW9uX19kZWxpdmVyX3NhbXBsZShzZXNzaW9uLCB0b29sLCBldmVudCwKLQkJCQkJCSAgICBzYW1wbGUsIGV2c2VsLCBtYWNoaW5lKTsKKwkJcmV0dXJuIHBlcmZfZXZsaXN0X19kZWxpdmVyX3NhbXBsZShldmxpc3QsIHRvb2wsIGV2ZW50LCBzYW1wbGUsIGV2c2VsLCBtYWNoaW5lKTsKIAljYXNlIFBFUkZfUkVDT1JEX01NQVA6CiAJCXJldHVybiB0b29sLT5tbWFwKHRvb2wsIGV2ZW50LCBzYW1wbGUsIG1hY2hpbmUpOwogCWNhc2UgUEVSRl9SRUNPUkRfTU1BUDI6CkBAIC04ODMsNyArOTMwLDcgQEAKIAkJcmV0dXJuIHRvb2wtPmV4aXQodG9vbCwgZXZlbnQsIHNhbXBsZSwgbWFjaGluZSk7CiAJY2FzZSBQRVJGX1JFQ09SRF9MT1NUOgogCQlpZiAodG9vbC0+bG9zdCA9PSBwZXJmX2V2ZW50X19wcm9jZXNzX2xvc3QpCi0JCQlzZXNzaW9uLT5zdGF0cy50b3RhbF9sb3N0ICs9IGV2ZW50LT5sb3N0Lmxvc3Q7CisJCQlldmxpc3QtPnN0YXRzLnRvdGFsX2xvc3QgKz0gZXZlbnQtPmxvc3QubG9zdDsKIAkJcmV0dXJuIHRvb2wtPmxvc3QodG9vbCwgZXZlbnQsIHNhbXBsZSwgbWFjaGluZSk7CiAJY2FzZSBQRVJGX1JFQ09SRF9SRUFEOgogCQlyZXR1cm4gdG9vbC0+cmVhZCh0b29sLCBldmVudCwgc2FtcGxlLCBldnNlbCwgbWFjaGluZSk7CkBAIC04OTIsMjAgKzkzOSwyMSBAQAogCWNhc2UgUEVSRl9SRUNPUkRfVU5USFJPVFRMRToKIAkJcmV0dXJuIHRvb2wtPnVudGhyb3R0bGUodG9vbCwgZXZlbnQsIHNhbXBsZSwgbWFjaGluZSk7CiAJZGVmYXVsdDoKLQkJKytzZXNzaW9uLT5zdGF0cy5ucl91bmtub3duX2V2ZW50czsKKwkJKytldmxpc3QtPnN0YXRzLm5yX3Vua25vd25fZXZlbnRzOwogCQlyZXR1cm4gLTE7CiAJfQogfQogCiBzdGF0aWMgczY0IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc191c2VyX2V2ZW50KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCiAJCQkJCSAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKLQkJCQkJICAgIHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCiAJCQkJCSAgICB1NjQgZmlsZV9vZmZzZXQpCiB7CisJc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSA9ICZzZXNzaW9uLT5vcmRlcmVkX2V2ZW50czsKKwlzdHJ1Y3QgcGVyZl90b29sICp0b29sID0gc2Vzc2lvbi0+dG9vbDsKIAlpbnQgZmQgPSBwZXJmX2RhdGFfZmlsZV9fZmQoc2Vzc2lvbi0+ZmlsZSk7CiAJaW50IGVycjsKIAotCWR1bXBfZXZlbnQoc2Vzc2lvbiwgZXZlbnQsIGZpbGVfb2Zmc2V0LCBOVUxMKTsKKwlkdW1wX2V2ZW50KHNlc3Npb24tPmV2bGlzdCwgZXZlbnQsIGZpbGVfb2Zmc2V0LCBOVUxMKTsKIAogCS8qIFRoZXNlIGV2ZW50cyBhcmUgcHJvY2Vzc2VkIHJpZ2h0IGF3YXkgKi8KIAlzd2l0Y2ggKGV2ZW50LT5oZWFkZXIudHlwZSkgewpAQCAtOTI5LDcgKzk3Nyw3IEBACiAJY2FzZSBQRVJGX1JFQ09SRF9IRUFERVJfQlVJTERfSUQ6CiAJCXJldHVybiB0b29sLT5idWlsZF9pZCh0b29sLCBldmVudCwgc2Vzc2lvbik7CiAJY2FzZSBQRVJGX1JFQ09SRF9GSU5JU0hFRF9ST1VORDoKLQkJcmV0dXJuIHRvb2wtPmZpbmlzaGVkX3JvdW5kKHRvb2wsIGV2ZW50LCBzZXNzaW9uKTsKKwkJcmV0dXJuIHRvb2wtPmZpbmlzaGVkX3JvdW5kKHRvb2wsIGV2ZW50LCBvZSk7CiAJY2FzZSBQRVJGX1JFQ09SRF9JRF9JTkRFWDoKIAkJcmV0dXJuIHRvb2wtPmlkX2luZGV4KHRvb2wsIGV2ZW50LCBzZXNzaW9uKTsKIAlkZWZhdWx0OgpAQCAtOTM5LDE1ICs5ODcsMTcgQEAKIAogaW50IHBlcmZfc2Vzc2lvbl9fZGVsaXZlcl9zeW50aF9ldmVudChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAogCQkJCSAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAotCQkJCSAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAotCQkJCSAgICAgIHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wpCisJCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUpCiB7Ci0JZXZlbnRzX3N0YXRzX19pbmMoJnNlc3Npb24tPnN0YXRzLCBldmVudC0+aGVhZGVyLnR5cGUpOworCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0ID0gc2Vzc2lvbi0+ZXZsaXN0OworCXN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgPSBzZXNzaW9uLT50b29sOworCisJZXZlbnRzX3N0YXRzX19pbmMoJmV2bGlzdC0+c3RhdHMsIGV2ZW50LT5oZWFkZXIudHlwZSk7CiAKIAlpZiAoZXZlbnQtPmhlYWRlci50eXBlID49IFBFUkZfUkVDT1JEX1VTRVJfVFlQRV9TVEFSVCkKLQkJcmV0dXJuIHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc191c2VyX2V2ZW50KHNlc3Npb24sIGV2ZW50LCB0b29sLCAwKTsKKwkJcmV0dXJuIHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc191c2VyX2V2ZW50KHNlc3Npb24sIGV2ZW50LCAwKTsKIAotCXJldHVybiBwZXJmX3Nlc3Npb25fX2RlbGl2ZXJfZXZlbnQoc2Vzc2lvbiwgZXZlbnQsIHNhbXBsZSwgdG9vbCwgMCk7CisJcmV0dXJuIG1hY2hpbmVzX19kZWxpdmVyX2V2ZW50KCZzZXNzaW9uLT5tYWNoaW5lcywgZXZsaXN0LCBldmVudCwgc2FtcGxlLCB0b29sLCAwKTsKIH0KIAogc3RhdGljIHZvaWQgZXZlbnRfc3dhcCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgYm9vbCBzYW1wbGVfaWRfYWxsKQpAQCAtMTAxNSw0MCArMTA2NSwzOSBAQAogfQogCiBzdGF0aWMgczY0IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAotCQkJCSAgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKLQkJCQkgICAgICAgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKLQkJCQkgICAgICAgdTY0IGZpbGVfb2Zmc2V0KQorCQkJCSAgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgdTY0IGZpbGVfb2Zmc2V0KQogeworCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0ID0gc2Vzc2lvbi0+ZXZsaXN0OworCXN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgPSBzZXNzaW9uLT50b29sOwogCXN0cnVjdCBwZXJmX3NhbXBsZSBzYW1wbGU7CiAJaW50IHJldDsKIAogCWlmIChzZXNzaW9uLT5oZWFkZXIubmVlZHNfc3dhcCkKLQkJZXZlbnRfc3dhcChldmVudCwgcGVyZl9ldmxpc3RfX3NhbXBsZV9pZF9hbGwoc2Vzc2lvbi0+ZXZsaXN0KSk7CisJCWV2ZW50X3N3YXAoZXZlbnQsIHBlcmZfZXZsaXN0X19zYW1wbGVfaWRfYWxsKGV2bGlzdCkpOwogCiAJaWYgKGV2ZW50LT5oZWFkZXIudHlwZSA+PSBQRVJGX1JFQ09SRF9IRUFERVJfTUFYKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWV2ZW50c19zdGF0c19faW5jKCZzZXNzaW9uLT5zdGF0cywgZXZlbnQtPmhlYWRlci50eXBlKTsKKwlldmVudHNfc3RhdHNfX2luYygmZXZsaXN0LT5zdGF0cywgZXZlbnQtPmhlYWRlci50eXBlKTsKIAogCWlmIChldmVudC0+aGVhZGVyLnR5cGUgPj0gUEVSRl9SRUNPUkRfVVNFUl9UWVBFX1NUQVJUKQotCQlyZXR1cm4gcGVyZl9zZXNzaW9uX19wcm9jZXNzX3VzZXJfZXZlbnQoc2Vzc2lvbiwgZXZlbnQsIHRvb2wsIGZpbGVfb2Zmc2V0KTsKKwkJcmV0dXJuIHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc191c2VyX2V2ZW50KHNlc3Npb24sIGV2ZW50LCBmaWxlX29mZnNldCk7CiAKIAkvKgogCSAqIEZvciBhbGwga2VybmVsIGV2ZW50cyB3ZSBnZXQgdGhlIHNhbXBsZSBkYXRhCiAJICovCi0JcmV0ID0gcGVyZl9ldmxpc3RfX3BhcnNlX3NhbXBsZShzZXNzaW9uLT5ldmxpc3QsIGV2ZW50LCAmc2FtcGxlKTsKKwlyZXQgPSBwZXJmX2V2bGlzdF9fcGFyc2Vfc2FtcGxlKGV2bGlzdCwgZXZlbnQsICZzYW1wbGUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKIAlpZiAodG9vbC0+b3JkZXJlZF9ldmVudHMpIHsKLQkJcmV0ID0gcGVyZl9zZXNzaW9uX3F1ZXVlX2V2ZW50KHNlc3Npb24sIGV2ZW50LCB0b29sLCAmc2FtcGxlLAotCQkJCQkgICAgICAgZmlsZV9vZmZzZXQpOworCQlyZXQgPSBwZXJmX3Nlc3Npb25fX3F1ZXVlX2V2ZW50KHNlc3Npb24sIGV2ZW50LCAmc2FtcGxlLCBmaWxlX29mZnNldCk7CiAJCWlmIChyZXQgIT0gLUVUSU1FKQogCQkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXR1cm4gcGVyZl9zZXNzaW9uX19kZWxpdmVyX2V2ZW50KHNlc3Npb24sIGV2ZW50LCAmc2FtcGxlLCB0b29sLAotCQkJCQkgICBmaWxlX29mZnNldCk7CisJcmV0dXJuIG1hY2hpbmVzX19kZWxpdmVyX2V2ZW50KCZzZXNzaW9uLT5tYWNoaW5lcywgZXZsaXN0LCBldmVudCwKKwkJCQkgICAgICAgJnNhbXBsZSwgdG9vbCwgZmlsZV9vZmZzZXQpOwogfQogCiB2b2lkIHBlcmZfZXZlbnRfaGVhZGVyX19ic3dhcChzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgKmhkcikKQEAgLTEwNzYsNTQgKzExMjUsNTcgQEAKIAlyZXR1cm4gdGhyZWFkOwogfQogCi1zdGF0aWMgdm9pZCBwZXJmX3Nlc3Npb25fX3dhcm5fYWJvdXRfZXJyb3JzKGNvbnN0IHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCi0JCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGVyZl90b29sICp0b29sKQorc3RhdGljIHZvaWQgcGVyZl9zZXNzaW9uX193YXJuX2Fib3V0X2Vycm9ycyhjb25zdCBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQogewotCWlmICh0b29sLT5sb3N0ID09IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbG9zdCAmJgotCSAgICBzZXNzaW9uLT5zdGF0cy5ucl9ldmVudHNbUEVSRl9SRUNPUkRfTE9TVF0gIT0gMCkgeworCWNvbnN0IHN0cnVjdCBldmVudHNfc3RhdHMgKnN0YXRzID0gJnNlc3Npb24tPmV2bGlzdC0+c3RhdHM7CisJY29uc3Qgc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSA9ICZzZXNzaW9uLT5vcmRlcmVkX2V2ZW50czsKKworCWlmIChzZXNzaW9uLT50b29sLT5sb3N0ID09IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbG9zdCAmJgorCSAgICBzdGF0cy0+bnJfZXZlbnRzW1BFUkZfUkVDT1JEX0xPU1RdICE9IDApIHsKIAkJdWlfX3dhcm5pbmcoIlByb2Nlc3NlZCAlZCBldmVudHMgYW5kIGxvc3QgJWQgY2h1bmtzIVxuXG4iCiAJCQkgICAgIkNoZWNrIElPL0NQVSBvdmVybG9hZCFcblxuIiwKLQkJCSAgICBzZXNzaW9uLT5zdGF0cy5ucl9ldmVudHNbMF0sCi0JCQkgICAgc2Vzc2lvbi0+c3RhdHMubnJfZXZlbnRzW1BFUkZfUkVDT1JEX0xPU1RdKTsKKwkJCSAgICBzdGF0cy0+bnJfZXZlbnRzWzBdLAorCQkJICAgIHN0YXRzLT5ucl9ldmVudHNbUEVSRl9SRUNPUkRfTE9TVF0pOwogCX0KIAotCWlmIChzZXNzaW9uLT5zdGF0cy5ucl91bmtub3duX2V2ZW50cyAhPSAwKSB7CisJaWYgKHN0YXRzLT5ucl91bmtub3duX2V2ZW50cyAhPSAwKSB7CiAJCXVpX193YXJuaW5nKCJGb3VuZCAldSB1bmtub3duIGV2ZW50cyFcblxuIgogCQkJICAgICJJcyB0aGlzIGFuIG9sZGVyIHRvb2wgcHJvY2Vzc2luZyBhIHBlcmYuZGF0YSAiCiAJCQkgICAgImZpbGUgZ2VuZXJhdGVkIGJ5IGEgbW9yZSByZWNlbnQgdG9vbD9cblxuIgogCQkJICAgICJJZiB0aGF0IGlzIG5vdCB0aGUgY2FzZSwgY29uc2lkZXIgIgogCQkJICAgICJyZXBvcnRpbmcgdG8gbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZy5cblxuIiwKLQkJCSAgICBzZXNzaW9uLT5zdGF0cy5ucl91bmtub3duX2V2ZW50cyk7CisJCQkgICAgc3RhdHMtPm5yX3Vua25vd25fZXZlbnRzKTsKIAl9CiAKLQlpZiAoc2Vzc2lvbi0+c3RhdHMubnJfdW5rbm93bl9pZCAhPSAwKSB7CisJaWYgKHN0YXRzLT5ucl91bmtub3duX2lkICE9IDApIHsKIAkJdWlfX3dhcm5pbmcoIiV1IHNhbXBsZXMgd2l0aCBpZCBub3QgcHJlc2VudCBpbiB0aGUgaGVhZGVyXG4iLAotCQkJICAgIHNlc3Npb24tPnN0YXRzLm5yX3Vua25vd25faWQpOworCQkJICAgIHN0YXRzLT5ucl91bmtub3duX2lkKTsKIAl9CiAKLSAJaWYgKHNlc3Npb24tPnN0YXRzLm5yX2ludmFsaWRfY2hhaW5zICE9IDApIHsKLSAJCXVpX193YXJuaW5nKCJGb3VuZCBpbnZhbGlkIGNhbGxjaGFpbnMhXG5cbiIKLSAJCQkgICAgIiV1IG91dCBvZiAldSBldmVudHMgd2VyZSBkaXNjYXJkZWQgZm9yIHRoaXMgcmVhc29uLlxuXG4iCi0gCQkJICAgICJDb25zaWRlciByZXBvcnRpbmcgdG8gbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZy5cblxuIiwKLSAJCQkgICAgc2Vzc2lvbi0+c3RhdHMubnJfaW52YWxpZF9jaGFpbnMsCi0gCQkJICAgIHNlc3Npb24tPnN0YXRzLm5yX2V2ZW50c1tQRVJGX1JFQ09SRF9TQU1QTEVdKTsKLSAJfQorCWlmIChzdGF0cy0+bnJfaW52YWxpZF9jaGFpbnMgIT0gMCkgeworCQl1aV9fd2FybmluZygiRm91bmQgaW52YWxpZCBjYWxsY2hhaW5zIVxuXG4iCisJCQkgICAgIiV1IG91dCBvZiAldSBldmVudHMgd2VyZSBkaXNjYXJkZWQgZm9yIHRoaXMgcmVhc29uLlxuXG4iCisJCQkgICAgIkNvbnNpZGVyIHJlcG9ydGluZyB0byBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnLlxuXG4iLAorCQkJICAgIHN0YXRzLT5ucl9pbnZhbGlkX2NoYWlucywKKwkJCSAgICBzdGF0cy0+bnJfZXZlbnRzW1BFUkZfUkVDT1JEX1NBTVBMRV0pOworCX0KIAotCWlmIChzZXNzaW9uLT5zdGF0cy5ucl91bnByb2Nlc3NhYmxlX3NhbXBsZXMgIT0gMCkgeworCWlmIChzdGF0cy0+bnJfdW5wcm9jZXNzYWJsZV9zYW1wbGVzICE9IDApIHsKIAkJdWlfX3dhcm5pbmcoIiV1IHVucHJvY2Vzc2FibGUgc2FtcGxlcyByZWNvcmRlZC5cbiIKIAkJCSAgICAiRG8geW91IGhhdmUgYSBLVk0gZ3Vlc3QgcnVubmluZyBhbmQgbm90IHVzaW5nICdwZXJmIGt2bSc/XG4iLAotCQkJICAgIHNlc3Npb24tPnN0YXRzLm5yX3VucHJvY2Vzc2FibGVfc2FtcGxlcyk7CisJCQkgICAgc3RhdHMtPm5yX3VucHJvY2Vzc2FibGVfc2FtcGxlcyk7CiAJfQogCi0JaWYgKHNlc3Npb24tPnN0YXRzLm5yX3Vub3JkZXJlZF9ldmVudHMgIT0gMCkKLQkJdWlfX3dhcm5pbmcoIiV1IG91dCBvZiBvcmRlciBldmVudHMgcmVjb3JkZWQuXG4iLCBzZXNzaW9uLT5zdGF0cy5ucl91bm9yZGVyZWRfZXZlbnRzKTsKKwlpZiAob2UtPm5yX3Vub3JkZXJlZF9ldmVudHMgIT0gMCkKKwkJdWlfX3dhcm5pbmcoIiV1IG91dCBvZiBvcmRlciBldmVudHMgcmVjb3JkZWQuXG4iLCBvZS0+bnJfdW5vcmRlcmVkX2V2ZW50cyk7CiB9CiAKIHZvbGF0aWxlIGludCBzZXNzaW9uX2RvbmU7CiAKLXN0YXRpYyBpbnQgX19wZXJmX3Nlc3Npb25fX3Byb2Nlc3NfcGlwZV9ldmVudHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJCQkJICAgICAgIHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wpCitzdGF0aWMgaW50IF9fcGVyZl9zZXNzaW9uX19wcm9jZXNzX3BpcGVfZXZlbnRzKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCiB7CisJc3RydWN0IG9yZGVyZWRfZXZlbnRzICpvZSA9ICZzZXNzaW9uLT5vcmRlcmVkX2V2ZW50czsKKwlzdHJ1Y3QgcGVyZl90b29sICp0b29sID0gc2Vzc2lvbi0+dG9vbDsKIAlpbnQgZmQgPSBwZXJmX2RhdGFfZmlsZV9fZmQoc2Vzc2lvbi0+ZmlsZSk7CiAJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQ7CiAJdWludDMyX3Qgc2l6ZSwgY3VyX3NpemUgPSAwOwpAQCAtMTE4Nyw3ICsxMjM5LDcgQEAKIAkJfQogCX0KIAotCWlmICgoc2tpcCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudChzZXNzaW9uLCBldmVudCwgdG9vbCwgaGVhZCkpIDwgMCkgeworCWlmICgoc2tpcCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudChzZXNzaW9uLCBldmVudCwgaGVhZCkpIDwgMCkgewogCQlwcl9lcnIoIiUjIiBQUkl4NjQgIiBbJSN4XTogZmFpbGVkIHRvIHByb2Nlc3MgdHlwZTogJWRcbiIsCiAJCSAgICAgICBoZWFkLCBldmVudC0+aGVhZGVyLnNpemUsIGV2ZW50LT5oZWFkZXIudHlwZSk7CiAJCWVyciA9IC1FSU5WQUw7CkBAIC0xMjAzLDEwICsxMjU1LDEwIEBACiAJCWdvdG8gbW9yZTsKIGRvbmU6CiAJLyogZG8gdGhlIGZpbmFsIGZsdXNoIGZvciBvcmRlcmVkIHNhbXBsZXMgKi8KLQllcnIgPSBvcmRlcmVkX2V2ZW50c19fZmx1c2goc2Vzc2lvbiwgdG9vbCwgT0VfRkxVU0hfX0ZJTkFMKTsKKwllcnIgPSBvcmRlcmVkX2V2ZW50c19fZmx1c2gob2UsIE9FX0ZMVVNIX19GSU5BTCk7CiBvdXRfZXJyOgogCWZyZWUoYnVmKTsKLQlwZXJmX3Nlc3Npb25fX3dhcm5fYWJvdXRfZXJyb3JzKHNlc3Npb24sIHRvb2wpOworCXBlcmZfc2Vzc2lvbl9fd2Fybl9hYm91dF9lcnJvcnMoc2Vzc2lvbik7CiAJb3JkZXJlZF9ldmVudHNfX2ZyZWUoJnNlc3Npb24tPm9yZGVyZWRfZXZlbnRzKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTI1Myw4ICsxMzA1LDEwIEBACiAKIHN0YXRpYyBpbnQgX19wZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCiAJCQkJCSAgdTY0IGRhdGFfb2Zmc2V0LCB1NjQgZGF0YV9zaXplLAotCQkJCQkgIHU2NCBmaWxlX3NpemUsIHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wpCisJCQkJCSAgdTY0IGZpbGVfc2l6ZSkKIHsKKwlzdHJ1Y3Qgb3JkZXJlZF9ldmVudHMgKm9lID0gJnNlc3Npb24tPm9yZGVyZWRfZXZlbnRzOworCXN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgPSBzZXNzaW9uLT50b29sOwogCWludCBmZCA9IHBlcmZfZGF0YV9maWxlX19mZChzZXNzaW9uLT5maWxlKTsKIAl1NjQgaGVhZCwgcGFnZV9vZmZzZXQsIGZpbGVfb2Zmc2V0LCBmaWxlX3Bvcywgc2l6ZTsKIAlpbnQgZXJyLCBtbWFwX3Byb3QsIG1tYXBfZmxhZ3MsIG1hcF9pZHggPSAwOwpAQCAtMTMyMyw4ICsxMzc3LDcgQEAKIAlzaXplID0gZXZlbnQtPmhlYWRlci5zaXplOwogCiAJaWYgKHNpemUgPCBzaXplb2Yoc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyKSB8fAotCSAgICAoc2tpcCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudChzZXNzaW9uLCBldmVudCwgdG9vbCwgZmlsZV9wb3MpKQotCQkJCQkJCQkJPCAwKSB7CisJICAgIChza2lwID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50KHNlc3Npb24sIGV2ZW50LCBmaWxlX3BvcykpIDwgMCkgewogCQlwcl9lcnIoIiUjIiBQUkl4NjQgIiBbJSN4XTogZmFpbGVkIHRvIHByb2Nlc3MgdHlwZTogJWRcbiIsCiAJCSAgICAgICBmaWxlX29mZnNldCArIGhlYWQsIGV2ZW50LT5oZWFkZXIuc2l6ZSwKIAkJICAgICAgIGV2ZW50LT5oZWFkZXIudHlwZSk7CkBAIC0xMzQ4LDE3ICsxNDAxLDE2IEBACiAKIG91dDoKIAkvKiBkbyB0aGUgZmluYWwgZmx1c2ggZm9yIG9yZGVyZWQgc2FtcGxlcyAqLwotCWVyciA9IG9yZGVyZWRfZXZlbnRzX19mbHVzaChzZXNzaW9uLCB0b29sLCBPRV9GTFVTSF9fRklOQUwpOworCWVyciA9IG9yZGVyZWRfZXZlbnRzX19mbHVzaChvZSwgT0VfRkxVU0hfX0ZJTkFMKTsKIG91dF9lcnI6CiAJdWlfcHJvZ3Jlc3NfX2ZpbmlzaCgpOwotCXBlcmZfc2Vzc2lvbl9fd2Fybl9hYm91dF9lcnJvcnMoc2Vzc2lvbiwgdG9vbCk7CisJcGVyZl9zZXNzaW9uX193YXJuX2Fib3V0X2Vycm9ycyhzZXNzaW9uKTsKIAlvcmRlcmVkX2V2ZW50c19fZnJlZSgmc2Vzc2lvbi0+b3JkZXJlZF9ldmVudHMpOwogCXNlc3Npb24tPm9uZV9tbWFwID0gZmFsc2U7CiAJcmV0dXJuIGVycjsKIH0KIAotaW50IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJCQkgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCkKK2ludCBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCiB7CiAJdTY0IHNpemUgPSBwZXJmX2RhdGFfZmlsZV9fc2l6ZShzZXNzaW9uLT5maWxlKTsKIAlpbnQgZXJyOwpAQCAtMTM2OSwxMCArMTQyMSw5IEBACiAJaWYgKCFwZXJmX2RhdGFfZmlsZV9faXNfcGlwZShzZXNzaW9uLT5maWxlKSkKIAkJZXJyID0gX19wZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sCiAJCQkJCQkgICAgIHNlc3Npb24tPmhlYWRlci5kYXRhX29mZnNldCwKLQkJCQkJCSAgICAgc2Vzc2lvbi0+aGVhZGVyLmRhdGFfc2l6ZSwKLQkJCQkJCSAgICAgc2l6ZSwgdG9vbCk7CisJCQkJCQkgICAgIHNlc3Npb24tPmhlYWRlci5kYXRhX3NpemUsIHNpemUpOwogCWVsc2UKLQkJZXJyID0gX19wZXJmX3Nlc3Npb25fX3Byb2Nlc3NfcGlwZV9ldmVudHMoc2Vzc2lvbiwgdG9vbCk7CisJCWVyciA9IF9fcGVyZl9zZXNzaW9uX19wcm9jZXNzX3BpcGVfZXZlbnRzKHNlc3Npb24pOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTE0MTUsNiArMTQ2Niw5IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFQX19OUl9UWVBFUzsgKytpKSB7CiAJCXN0cnVjdCBrbWFwICprbWFwID0gbWFwX19rbWFwKG1hcHNbaV0pOworCisJCWlmICgha21hcCkKKwkJCWNvbnRpbnVlOwogCQlrbWFwLT5yZWZfcmVsb2Nfc3ltID0gcmVmOwogCX0KIApAQCAtMTQzNiw3ICsxNDkwLDcgQEAKIHsKIAlzaXplX3QgcmV0ID0gZnByaW50ZihmcCwgIkFnZ3JlZ2F0ZWQgc3RhdHM6XG4iKTsKIAotCXJldCArPSBldmVudHNfc3RhdHNfX2ZwcmludGYoJnNlc3Npb24tPnN0YXRzLCBmcCk7CisJcmV0ICs9IGV2ZW50c19zdGF0c19fZnByaW50Zigmc2Vzc2lvbi0+ZXZsaXN0LT5zdGF0cywgZnApOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmggYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5oCmluZGV4IDZkNjYzZGMuLmQ1ZmE3Yjc5MSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uaAorKysgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5oCkBAIC0yMCwxMyArMjAsMTMgQEAKIAlzdHJ1Y3QgbWFjaGluZXMJCW1hY2hpbmVzOwogCXN0cnVjdCBwZXJmX2V2bGlzdAkqZXZsaXN0OwogCXN0cnVjdCB0cmFjZV9ldmVudAl0ZXZlbnQ7Ci0Jc3RydWN0IGV2ZW50c19zdGF0cwlzdGF0czsKIAlib29sCQkJcmVwaXBlOwogCWJvb2wJCQlvbmVfbW1hcDsKIAl2b2lkCQkJKm9uZV9tbWFwX2FkZHI7CiAJdTY0CQkJb25lX21tYXBfb2Zmc2V0OwogCXN0cnVjdCBvcmRlcmVkX2V2ZW50cwlvcmRlcmVkX2V2ZW50czsKIAlzdHJ1Y3QgcGVyZl9kYXRhX2ZpbGUJKmZpbGU7CisJc3RydWN0IHBlcmZfdG9vbAkqdG9vbDsKIH07CiAKICNkZWZpbmUgUFJJTlRfSVBfT1BUX0lQCQkoMTw8MCkKQEAgLTQ5LDIwICs0OSwxMyBAQAogCQkJICAgICB1bmlvbiBwZXJmX2V2ZW50ICoqZXZlbnRfcHRyLAogCQkJICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSk7CiAKLWludCBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCi0JCQkJIHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wpOworaW50IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7CiAKLWludCBwZXJmX3Nlc3Npb25fcXVldWVfZXZlbnQoc3RydWN0IHBlcmZfc2Vzc2lvbiAqcywgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCi0JCQkgICAgIHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAotCQkJICAgICB1NjQgZmlsZV9vZmZzZXQpOworaW50IHBlcmZfc2Vzc2lvbl9fcXVldWVfZXZlbnQoc3RydWN0IHBlcmZfc2Vzc2lvbiAqcywgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCisJCQkgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwgdTY0IGZpbGVfb2Zmc2V0KTsKIAogdm9pZCBwZXJmX3Rvb2xfX2ZpbGxfZGVmYXVsdHMoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCk7CiAKLWludCBwZXJmX3Nlc3Npb25fX2RlbGl2ZXJfZXZlbnQoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJCQl1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKLQkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKLQkJCQlzdHJ1Y3QgcGVyZl90b29sICp0b29sLCB1NjQgZmlsZV9vZmZzZXQpOwotCiBpbnQgcGVyZl9zZXNzaW9uX19yZXNvbHZlX2NhbGxjaGFpbihzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAogCQkJCSAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCiAJCQkJICAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKQEAgLTEyNiw4ICsxMTksNyBAQAogCiBpbnQgcGVyZl9zZXNzaW9uX19kZWxpdmVyX3N5bnRoX2V2ZW50KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCiAJCQkJICAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCk7CisJCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUpOwogCiBpbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19pZF9pbmRleChzdHJ1Y3QgcGVyZl90b29sICp0b29sLAogCQkJCSB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zZXR1cC5weSBiL3Rvb2xzL3BlcmYvdXRpbC9zZXR1cC5weQppbmRleCBkMGFlZTRiLi4xODMzMTAzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2V0dXAucHkKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NldHVwLnB5CkBAIC0yNSw3ICsyNSw3IEBACiBidWlsZF9saWIgPSBnZXRlbnYoJ1BZVEhPTl9FWFRCVUlMRF9MSUInKQogYnVpbGRfdG1wID0gZ2V0ZW52KCdQWVRIT05fRVhUQlVJTERfVE1QJykKIGxpYnRyYWNlZXZlbnQgPSBnZXRlbnYoJ0xJQlRSQUNFRVZFTlQnKQotbGliYXBpa2ZzID0gZ2V0ZW52KCdMSUJBUElLRlMnKQorbGliYXBpa2ZzID0gZ2V0ZW52KCdMSUJBUEknKQogCiBleHRfc291cmNlcyA9IFtmLnN0cmlwKCkgZm9yIGYgaW4gZmlsZSgndXRpbC9weXRob24tZXh0LXNvdXJjZXMnKQogCQkJCWlmIGxlbihmLnN0cmlwKCkpID4gMCBhbmQgZlswXSAhPSAnIyddCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc29ydC5jIGIvdG9vbHMvcGVyZi91dGlsL3NvcnQuYwppbmRleCA3YTM5YzFlLi40NTkzZjM2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc29ydC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmMKQEAgLTE0NjMsNiArMTQ2MywxNSBAQAogCQkJc29ydF9faGFzX3BhcmVudCA9IDE7CiAJCX0gZWxzZSBpZiAoc2QtPmVudHJ5ID09ICZzb3J0X3N5bSkgewogCQkJc29ydF9faGFzX3N5bSA9IDE7CisJCQkvKgorCQkJICogcGVyZiBkaWZmIGRpc3BsYXlzIHRoZSBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlIGFtb25nc3QKKwkJCSAqIHR3byBvciBtb3JlIHBlcmYuZGF0YSBmaWxlcy4gVGhvc2UgZmlsZXMgY291bGQgY29tZQorCQkJICogZnJvbSBkaWZmZXJlbnQgYmluYXJpZXMuIFNvIHdlIHNob3VsZCBub3QgY29tcGFyZQorCQkJICogdGhlaXIgaXBzLCBidXQgdGhlIG5hbWUgb2Ygc3ltYm9sLgorCQkJICovCisJCQlpZiAoc29ydF9fbW9kZSA9PSBTT1JUX01PREVfX0RJRkYpCisJCQkJc2QtPmVudHJ5LT5zZV9jb2xsYXBzZSA9IHNvcnRfX3N5bV9zb3J0OworCiAJCX0gZWxzZSBpZiAoc2QtPmVudHJ5ID09ICZzb3J0X2RzbykgewogCQkJc29ydF9faGFzX2RzbyA9IDE7CiAJCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmggYi90b29scy9wZXJmL3V0aWwvc29ydC5oCmluZGV4IGMwM2U0ZmYuLjg0NjAzNmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zb3J0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3NvcnQuaApAQCAtNDQsNiArNDQsNyBAQAogZXh0ZXJuIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfc3ltX2Zyb207CiBleHRlcm4gc3RydWN0IHNvcnRfZW50cnkgc29ydF9zeW1fdG87CiBleHRlcm4gZW51bSBzb3J0X3R5cGUgc29ydF9fZmlyc3RfZGltZW5zaW9uOworZXh0ZXJuIGNvbnN0IGNoYXIgZGVmYXVsdF9tZW1fc29ydF9vcmRlcltdOwogCiBzdHJ1Y3QgaGVfc3RhdCB7CiAJdTY0CQkJcGVyaW9kOwpAQCAtMTAyLDcgKzEwMyw2IEBACiAKIAlib29sCQkJaW5pdF9oYXZlX2NoaWxkcmVuOwogCWNoYXIJCQlsZXZlbDsKLQlib29sCQkJdXNlZDsKIAl1OAkJCWZpbHRlcmVkOwogCWNoYXIJCQkqc3JjbGluZTsKIAlzdHJ1Y3Qgc3ltYm9sCQkqcGFyZW50OwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtZWxmLmMKaW5kZXggMzNiN2EyYS4uYTdhYjYwNiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1lbGYuYworKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLWVsZi5jCkBAIC03NCw2ICs3NCwxMCBAQAogCXJldHVybiBHRUxGX1NUX1RZUEUoc3ltLT5zdF9pbmZvKTsKIH0KIAorI2lmbmRlZiBTVFRfR05VX0lGVU5DCisjZGVmaW5lIFNUVF9HTlVfSUZVTkMgMTAKKyNlbmRpZgorCiBzdGF0aWMgaW5saW5lIGludCBlbGZfc3ltX19pc19mdW5jdGlvbihjb25zdCBHRWxmX1N5bSAqc3ltKQogewogCXJldHVybiAoZWxmX3N5bV9fdHlwZShzeW0pID09IFNUVF9GVU5DIHx8CkBAIC01NzUsMzIgKzU3OSwzNyBAQAogc3RhdGljIGludCBkZWNvbXByZXNzX2ttb2R1bGUoc3RydWN0IGRzbyAqZHNvLCBjb25zdCBjaGFyICpuYW1lLAogCQkJICAgICAgZW51bSBkc29fYmluYXJ5X3R5cGUgdHlwZSkKIHsKLQlpbnQgZmQ7Ci0JY29uc3QgY2hhciAqZXh0ID0gc3RycmNocihuYW1lLCAnLicpOworCWludCBmZCA9IC0xOwogCWNoYXIgdG1wYnVmW10gPSAiL3RtcC9wZXJmLWttb2QtWFhYWFhYIjsKKwlzdHJ1Y3Qga21vZF9wYXRoIG07CiAKIAlpZiAodHlwZSAhPSBEU09fQklOQVJZX1RZUEVfX1NZU1RFTV9QQVRIX0tNT0RVTEVfQ09NUCAmJgogCSAgICB0eXBlICE9IERTT19CSU5BUllfVFlQRV9fR1VFU1RfS01PRFVMRV9DT01QICYmCiAJICAgIHR5cGUgIT0gRFNPX0JJTkFSWV9UWVBFX19CVUlMRF9JRF9DQUNIRSkKIAkJcmV0dXJuIC0xOwogCi0JaWYgKCFleHQgfHwgIWlzX3N1cHBvcnRlZF9jb21wcmVzc2lvbihleHQgKyAxKSkgewotCQlleHQgPSBzdHJyY2hyKGRzby0+bmFtZSwgJy4nKTsKLQkJaWYgKCFleHQgfHwgIWlzX3N1cHBvcnRlZF9jb21wcmVzc2lvbihleHQgKyAxKSkKLQkJCXJldHVybiAtMTsKLQl9CisJaWYgKHR5cGUgPT0gRFNPX0JJTkFSWV9UWVBFX19CVUlMRF9JRF9DQUNIRSkKKwkJbmFtZSA9IGRzby0+bG9uZ19uYW1lOwogCi0JZmQgPSBta3N0ZW1wKHRtcGJ1Zik7Ci0JaWYgKGZkIDwgMCkKKwlpZiAoa21vZF9wYXRoX19wYXJzZV9leHQoJm0sIG5hbWUpIHx8ICFtLmNvbXApCiAJCXJldHVybiAtMTsKIAotCWlmICghZGVjb21wcmVzc190b19maWxlKGV4dCArIDEsIG5hbWUsIGZkKSkgeworCWZkID0gbWtzdGVtcCh0bXBidWYpOworCWlmIChmZCA8IDApIHsKKwkJZHNvLT5sb2FkX2Vycm5vID0gZXJybm87CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZGVjb21wcmVzc190b19maWxlKG0uZXh0LCBuYW1lLCBmZCkpIHsKKwkJZHNvLT5sb2FkX2Vycm5vID0gRFNPX0xPQURfRVJSTk9fX0RFQ09NUFJFU1NJT05fRkFJTFVSRTsKIAkJY2xvc2UoZmQpOwogCQlmZCA9IC0xOwogCX0KIAogCXVubGluayh0bXBidWYpOwogCitvdXQ6CisJZnJlZShtLmV4dCk7CiAJcmV0dXJuIGZkOwogfQogCkBAIC02MjksMzcgKzYzOCw0OSBAQAogCUVsZiAqZWxmOwogCWludCBmZDsKIAotCWlmIChkc29fX25lZWRzX2RlY29tcHJlc3MoZHNvKSkKKwlpZiAoZHNvX19uZWVkc19kZWNvbXByZXNzKGRzbykpIHsKIAkJZmQgPSBkZWNvbXByZXNzX2ttb2R1bGUoZHNvLCBuYW1lLCB0eXBlKTsKLQllbHNlCisJCWlmIChmZCA8IDApCisJCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKIAkJZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZKTsKLQotCWlmIChmZCA8IDApCi0JCXJldHVybiAtMTsKKwkJaWYgKGZkIDwgMCkgeworCQkJZHNvLT5sb2FkX2Vycm5vID0gZXJybm87CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CiAKIAllbGYgPSBlbGZfYmVnaW4oZmQsIFBFUkZfRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKIAlpZiAoZWxmID09IE5VTEwpIHsKIAkJcHJfZGVidWcoIiVzOiBjYW5ub3QgcmVhZCAlcyBFTEYgZmlsZS5cbiIsIF9fZnVuY19fLCBuYW1lKTsKKwkJZHNvLT5sb2FkX2Vycm5vID0gRFNPX0xPQURfRVJSTk9fX0lOVkFMSURfRUxGOwogCQlnb3RvIG91dF9jbG9zZTsKIAl9CiAKIAlpZiAoZ2VsZl9nZXRlaGRyKGVsZiwgJmVoZHIpID09IE5VTEwpIHsKKwkJZHNvLT5sb2FkX2Vycm5vID0gRFNPX0xPQURfRVJSTk9fX0lOVkFMSURfRUxGOwogCQlwcl9kZWJ1ZygiJXM6IGNhbm5vdCBnZXQgZWxmIGhlYWRlci5cbiIsIF9fZnVuY19fKTsKIAkJZ290byBvdXRfZWxmX2VuZDsKIAl9CiAKLQlpZiAoZHNvX19zd2FwX2luaXQoZHNvLCBlaGRyLmVfaWRlbnRbRUlfREFUQV0pKQorCWlmIChkc29fX3N3YXBfaW5pdChkc28sIGVoZHIuZV9pZGVudFtFSV9EQVRBXSkpIHsKKwkJZHNvLT5sb2FkX2Vycm5vID0gRFNPX0xPQURfRVJSTk9fX0lOVEVSTkFMX0VSUk9SOwogCQlnb3RvIG91dF9lbGZfZW5kOworCX0KIAogCS8qIEFsd2F5cyByZWplY3QgaW1hZ2VzIHdpdGggYSBtaXNtYXRjaGVkIGJ1aWxkLWlkOiAqLwogCWlmIChkc28tPmhhc19idWlsZF9pZCkgewogCQl1OCBidWlsZF9pZFtCVUlMRF9JRF9TSVpFXTsKIAotCQlpZiAoZWxmX3JlYWRfYnVpbGRfaWQoZWxmLCBidWlsZF9pZCwgQlVJTERfSURfU0laRSkgPCAwKQorCQlpZiAoZWxmX3JlYWRfYnVpbGRfaWQoZWxmLCBidWlsZF9pZCwgQlVJTERfSURfU0laRSkgPCAwKSB7CisJCQlkc28tPmxvYWRfZXJybm8gPSBEU09fTE9BRF9FUlJOT19fQ0FOTk9UX1JFQURfQlVJTERJRDsKIAkJCWdvdG8gb3V0X2VsZl9lbmQ7CisJCX0KIAotCQlpZiAoIWRzb19fYnVpbGRfaWRfZXF1YWwoZHNvLCBidWlsZF9pZCkpCisJCWlmICghZHNvX19idWlsZF9pZF9lcXVhbChkc28sIGJ1aWxkX2lkKSkgeworCQkJZHNvLT5sb2FkX2Vycm5vID0gRFNPX0xPQURfRVJSTk9fX01JU01BVENISU5HX0JVSUxESUQ7CiAJCQlnb3RvIG91dF9lbGZfZW5kOworCQl9CiAJfQogCiAJc3MtPmlzXzY0X2JpdCA9IChnZWxmX2dldGNsYXNzKGVsZikgPT0gRUxGQ0xBU1M2NCk7CkBAIC02OTUsOCArNzE2LDEwIEBACiAJfQogCiAJc3MtPm5hbWUgICA9IHN0cmR1cChuYW1lKTsKLQlpZiAoIXNzLT5uYW1lKQorCWlmICghc3MtPm5hbWUpIHsKKwkJZHNvLT5sb2FkX2Vycm5vID0gZXJybm87CiAJCWdvdG8gb3V0X2VsZl9lbmQ7CisJfQogCiAJc3MtPmVsZiAgICA9IGVsZjsKIAlzcy0+ZmQgICAgID0gZmQ7CkBAIC03NTMsNiArNzc2LDcgQEAKIAkJICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQga21vZHVsZSkKIHsKIAlzdHJ1Y3Qga21hcCAqa21hcCA9IGRzby0+a2VybmVsID8gbWFwX19rbWFwKG1hcCkgOiBOVUxMOworCXN0cnVjdCBtYXBfZ3JvdXBzICprbWFwcyA9IGttYXAgPyBtYXBfX2ttYXBzKG1hcCkgOiBOVUxMOwogCXN0cnVjdCBtYXAgKmN1cnJfbWFwID0gbWFwOwogCXN0cnVjdCBkc28gKmN1cnJfZHNvID0gZHNvOwogCUVsZl9EYXRhICpzeW1zdHJzLCAqc2Vjc3RyczsKQEAgLTc2OCw2ICs3OTIsOSBAQAogCWludCBuciA9IDA7CiAJYm9vbCByZW1hcF9rZXJuZWwgPSBmYWxzZSwgYWRqdXN0X2tlcm5lbF9zeW1zID0gZmFsc2U7CiAKKwlpZiAoa21hcCAmJiAha21hcHMpCisJCXJldHVybiAtMTsKKwogCWRzby0+c3ltdGFiX3R5cGUgPSBzeW1zX3NzLT50eXBlOwogCWRzby0+aXNfNjRfYml0ID0gc3ltc19zcy0+aXNfNjRfYml0OwogCWRzby0+cmVsID0gc3ltc19zcy0+ZWhkci5lX3R5cGUgPT0gRVRfUkVMOwpAQCAtODY0LDEwICs4OTEsOSBAQAogCQkvKiBSZWplY3QgQVJNIEVMRiAibWFwcGluZyBzeW1ib2xzIjogdGhlc2UgYXJlbid0IHVuaXF1ZSBhbmQKIAkJICogZG9uJ3QgaWRlbnRpZnkgZnVuY3Rpb25zLCBzbyB3aWxsIGNvbmZ1c2UgdGhlIHByb2ZpbGUKIAkJICogb3V0cHV0OiAqLwotCQlpZiAoZWhkci5lX21hY2hpbmUgPT0gRU1fQVJNKSB7Ci0JCQlpZiAoIXN0cmNtcChlbGZfbmFtZSwgIiRhIikgfHwKLQkJCSAgICAhc3RyY21wKGVsZl9uYW1lLCAiJGQiKSB8fAotCQkJICAgICFzdHJjbXAoZWxmX25hbWUsICIkdCIpKQorCQlpZiAoZWhkci5lX21hY2hpbmUgPT0gRU1fQVJNIHx8IGVoZHIuZV9tYWNoaW5lID09IEVNX0FBUkNINjQpIHsKKwkJCWlmIChlbGZfbmFtZVswXSA9PSAnJCcgJiYgc3RyY2hyKCJhZHR4IiwgZWxmX25hbWVbMV0pCisJCQkgICAgJiYgKGVsZl9uYW1lWzJdID09ICdcMCcgfHwgZWxmX25hbWVbMl0gPT0gJy4nKSkKIAkJCQljb250aW51ZTsKIAkJfQogCkBAIC05MzYsOCArOTYyLDEwIEBACiAJCQkJCW1hcC0+bWFwX2lwID0gbWFwX19tYXBfaXA7CiAJCQkJCW1hcC0+dW5tYXBfaXAgPSBtYXBfX3VubWFwX2lwOwogCQkJCQkvKiBFbnN1cmUgbWFwcyBhcmUgY29ycmVjdGx5IG9yZGVyZWQgKi8KLQkJCQkJbWFwX2dyb3Vwc19fcmVtb3ZlKGttYXAtPmttYXBzLCBtYXApOwotCQkJCQltYXBfZ3JvdXBzX19pbnNlcnQoa21hcC0+a21hcHMsIG1hcCk7CisJCQkJCWlmIChrbWFwcykgeworCQkJCQkJbWFwX2dyb3Vwc19fcmVtb3ZlKGttYXBzLCBtYXApOworCQkJCQkJbWFwX2dyb3Vwc19faW5zZXJ0KGttYXBzLCBtYXApOworCQkJCQl9CiAJCQkJfQogCiAJCQkJLyoKQEAgLTk2MSw3ICs5ODksNyBAQAogCQkJc25wcmludGYoZHNvX25hbWUsIHNpemVvZihkc29fbmFtZSksCiAJCQkJICIlcyVzIiwgZHNvLT5zaG9ydF9uYW1lLCBzZWN0aW9uX25hbWUpOwogCi0JCQljdXJyX21hcCA9IG1hcF9ncm91cHNfX2ZpbmRfYnlfbmFtZShrbWFwLT5rbWFwcywgbWFwLT50eXBlLCBkc29fbmFtZSk7CisJCQljdXJyX21hcCA9IG1hcF9ncm91cHNfX2ZpbmRfYnlfbmFtZShrbWFwcywgbWFwLT50eXBlLCBkc29fbmFtZSk7CiAJCQlpZiAoY3Vycl9tYXAgPT0gTlVMTCkgewogCQkJCXU2NCBzdGFydCA9IHN5bS5zdF92YWx1ZTsKIApAQCAtOTkxLDcgKzEwMTksNyBAQAogCQkJCQljdXJyX21hcC0+dW5tYXBfaXAgPSBpZGVudGl0eV9fbWFwX2lwOwogCQkJCX0KIAkJCQljdXJyX2Rzby0+c3ltdGFiX3R5cGUgPSBkc28tPnN5bXRhYl90eXBlOwotCQkJCW1hcF9ncm91cHNfX2luc2VydChrbWFwLT5rbWFwcywgY3Vycl9tYXApOworCQkJCW1hcF9ncm91cHNfX2luc2VydChrbWFwcywgY3Vycl9tYXApOwogCQkJCS8qCiAJCQkJICogVGhlIG5ldyBEU08gc2hvdWxkIGdvIHRvIHRoZSBrZXJuZWwgRFNPUwogCQkJCSAqLwpAQCAtMTA0NSwxNCArMTA3MywxNSBAQAogCSAqIEZvciBtaXNhbm5vdGF0ZWQsIHplcm9lZCwgQVNNIGZ1bmN0aW9uIHNpemVzLgogCSAqLwogCWlmIChuciA+IDApIHsKLQkJc3ltYm9sc19fZml4dXBfZHVwbGljYXRlKCZkc28tPnN5bWJvbHNbbWFwLT50eXBlXSk7CisJCWlmICghc3ltYm9sX2NvbmYuYWxsb3dfYWxpYXNlcykKKwkJCXN5bWJvbHNfX2ZpeHVwX2R1cGxpY2F0ZSgmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV0pOwogCQlzeW1ib2xzX19maXh1cF9lbmQoJmRzby0+c3ltYm9sc1ttYXAtPnR5cGVdKTsKIAkJaWYgKGttYXApIHsKIAkJCS8qCiAJCQkgKiBXZSBuZWVkIHRvIGZpeHVwIHRoaXMgaGVyZSB0b28gYmVjYXVzZSB3ZSBjcmVhdGUgbmV3CiAJCQkgKiBtYXBzIGhlcmUsIGZvciB0aGluZ3MgbGlrZSB2c3lzY2FsbCBzZWN0aW9ucy4KIAkJCSAqLwotCQkJX19tYXBfZ3JvdXBzX19maXh1cF9lbmQoa21hcC0+a21hcHMsIG1hcC0+dHlwZSk7CisJCQlfX21hcF9ncm91cHNfX2ZpeHVwX2VuZChrbWFwcywgbWFwLT50eXBlKTsKIAkJfQogCX0KIAllcnIgPSBucjsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wtbWluaW1hbC5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1taW5pbWFsLmMKaW5kZXggZDdlZmIwMy4uZmQ4NDc3YyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1taW5pbWFsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC1taW5pbWFsLmMKQEAgLTI0NiwxMyArMjQ2LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHN5bXNyY19faW5pdChzdHJ1Y3Qgc3ltc3JjICpzcywgc3RydWN0IGRzbyAqZHNvIF9fbWF5YmVfdW51c2VkLAotCQkgY29uc3QgY2hhciAqbmFtZSwKK2ludCBzeW1zcmNfX2luaXQoc3RydWN0IHN5bXNyYyAqc3MsIHN0cnVjdCBkc28gKmRzbywgY29uc3QgY2hhciAqbmFtZSwKIAkgICAgICAgICBlbnVtIGRzb19iaW5hcnlfdHlwZSB0eXBlKQogewogCWludCBmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkpOwogCWlmIChmZCA8IDApCi0JCXJldHVybiAtMTsKKwkJZ290byBvdXRfZXJybm87CiAKIAlzcy0+bmFtZSA9IHN0cmR1cChuYW1lKTsKIAlpZiAoIXNzLT5uYW1lKQpAQCAtMjY0LDYgKzI2Myw4IEBACiAJcmV0dXJuIDA7CiBvdXRfY2xvc2U6CiAJY2xvc2UoZmQpOworb3V0X2Vycm5vOgorCWRzby0+bG9hZF9lcnJubyA9IGVycm5vOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCmluZGV4IGE2OTA2NjguLjIwMWY2YzRjIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAibWFjaGluZS5oIgogI2luY2x1ZGUgInN5bWJvbC5oIgogI2luY2x1ZGUgInN0cmxpc3QuaCIKKyNpbmNsdWRlICJpbnRsaXN0LmgiCiAjaW5jbHVkZSAiaGVhZGVyLmgiCiAKICNpbmNsdWRlIDxlbGYuaD4KQEAgLTYyOSwxMyArNjMwLDE2IEBACiBzdGF0aWMgaW50IGRzb19fc3BsaXRfa2FsbHN5bXNfZm9yX2tjb3JlKHN0cnVjdCBkc28gKmRzbywgc3RydWN0IG1hcCAqbWFwLAogCQkJCQkgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKLQlzdHJ1Y3QgbWFwX2dyb3VwcyAqa21hcHMgPSBtYXBfX2ttYXAobWFwKS0+a21hcHM7CisJc3RydWN0IG1hcF9ncm91cHMgKmttYXBzID0gbWFwX19rbWFwcyhtYXApOwogCXN0cnVjdCBtYXAgKmN1cnJfbWFwOwogCXN0cnVjdCBzeW1ib2wgKnBvczsKIAlpbnQgY291bnQgPSAwLCBtb3ZlZCA9IDA7CiAJc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmZHNvLT5zeW1ib2xzW21hcC0+dHlwZV07CiAJc3RydWN0IHJiX25vZGUgKm5leHQgPSByYl9maXJzdChyb290KTsKIAorCWlmICgha21hcHMpCisJCXJldHVybiAtMTsKKwogCXdoaWxlIChuZXh0KSB7CiAJCWNoYXIgKm1vZHVsZTsKIApAQCAtNjgxLDggKzY4NSw4IEBACiBzdGF0aWMgaW50IGRzb19fc3BsaXRfa2FsbHN5bXMoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsIHU2NCBkZWx0YSwKIAkJCSAgICAgICBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyKQogewotCXN0cnVjdCBtYXBfZ3JvdXBzICprbWFwcyA9IG1hcF9fa21hcChtYXApLT5rbWFwczsKLQlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSA9IGttYXBzLT5tYWNoaW5lOworCXN0cnVjdCBtYXBfZ3JvdXBzICprbWFwcyA9IG1hcF9fa21hcHMobWFwKTsKKwlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZTsKIAlzdHJ1Y3QgbWFwICpjdXJyX21hcCA9IG1hcDsKIAlzdHJ1Y3Qgc3ltYm9sICpwb3M7CiAJaW50IGNvdW50ID0gMCwgbW92ZWQgPSAwOwpAQCAtNjkwLDYgKzY5NCwxMSBAQAogCXN0cnVjdCByYl9ub2RlICpuZXh0ID0gcmJfZmlyc3Qocm9vdCk7CiAJaW50IGtlcm5lbF9yYW5nZSA9IDA7CiAKKwlpZiAoIWttYXBzKQorCQlyZXR1cm4gLTE7CisKKwltYWNoaW5lID0ga21hcHMtPm1hY2hpbmU7CisKIAl3aGlsZSAobmV4dCkgewogCQljaGFyICptb2R1bGU7CiAKQEAgLTEwMjQsOSArMTAzMywxMiBAQAogc3RhdGljIGludCB2YWxpZGF0ZV9rY29yZV9tb2R1bGVzKGNvbnN0IGNoYXIgKmthbGxzeW1zX2ZpbGVuYW1lLAogCQkJCSAgc3RydWN0IG1hcCAqbWFwKQogewotCXN0cnVjdCBtYXBfZ3JvdXBzICprbWFwcyA9IG1hcF9fa21hcChtYXApLT5rbWFwczsKKwlzdHJ1Y3QgbWFwX2dyb3VwcyAqa21hcHMgPSBtYXBfX2ttYXBzKG1hcCk7CiAJY2hhciBtb2R1bGVzX2ZpbGVuYW1lW1BBVEhfTUFYXTsKIAorCWlmICgha21hcHMpCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKCFmaWxlbmFtZV9mcm9tX2thbGxzeW1zX2ZpbGVuYW1lKG1vZHVsZXNfZmlsZW5hbWUsICJtb2R1bGVzIiwKIAkJCQkJICAgICBrYWxsc3ltc19maWxlbmFtZSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTA0Miw2ICsxMDU0LDkgQEAKIHsKIAlzdHJ1Y3Qga21hcCAqa21hcCA9IG1hcF9fa21hcChtYXApOwogCisJaWYgKCFrbWFwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChrbWFwLT5yZWZfcmVsb2Nfc3ltICYmIGttYXAtPnJlZl9yZWxvY19zeW0tPm5hbWUpIHsKIAkJdTY0IHN0YXJ0OwogCkBAIC0xMDgwLDggKzEwOTUsOCBAQAogc3RhdGljIGludCBkc29fX2xvYWRfa2NvcmUoc3RydWN0IGRzbyAqZHNvLCBzdHJ1Y3QgbWFwICptYXAsCiAJCQkgICBjb25zdCBjaGFyICprYWxsc3ltc19maWxlbmFtZSkKIHsKLQlzdHJ1Y3QgbWFwX2dyb3VwcyAqa21hcHMgPSBtYXBfX2ttYXAobWFwKS0+a21hcHM7Ci0Jc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgPSBrbWFwcy0+bWFjaGluZTsKKwlzdHJ1Y3QgbWFwX2dyb3VwcyAqa21hcHMgPSBtYXBfX2ttYXBzKG1hcCk7CisJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmU7CiAJc3RydWN0IGtjb3JlX21hcGZuX2RhdGEgbWQ7CiAJc3RydWN0IG1hcCAqb2xkX21hcCwgKm5ld19tYXAsICpyZXBsYWNlbWVudF9tYXAgPSBOVUxMOwogCWJvb2wgaXNfNjRfYml0OwpAQCAtMTA4OSw2ICsxMTA0LDExIEBACiAJY2hhciBrY29yZV9maWxlbmFtZVtQQVRIX01BWF07CiAJc3RydWN0IHN5bWJvbCAqc3ltOwogCisJaWYgKCFrbWFwcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYWNoaW5lID0ga21hcHMtPm1hY2hpbmU7CisKIAkvKiBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHRoYXQgdGhlIG1hcCBpcyB0aGUga2VybmVsIG1hcCAqLwogCWlmIChtYXAgIT0gbWFjaGluZS0+dm1saW51eF9tYXBzW21hcC0+dHlwZV0pCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTIwMSw2ICsxMjIxLDkgQEAKIAlzdHJ1Y3Qga21hcCAqa21hcCA9IG1hcF9fa21hcChtYXApOwogCXU2NCBhZGRyOwogCisJaWYgKCFrbWFwKQorCQlyZXR1cm4gLTE7CisKIAlpZiAoIWttYXAtPnJlZl9yZWxvY19zeW0gfHwgIWttYXAtPnJlZl9yZWxvY19zeW0tPm5hbWUpCiAJCXJldHVybiAwOwogCkBAIC0xODU5LDYgKzE4ODIsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IHNldHVwX2ludGxpc3Qoc3RydWN0IGludGxpc3QgKipsaXN0LCBjb25zdCBjaGFyICpsaXN0X3N0ciwKKwkJICBjb25zdCBjaGFyICpsaXN0X25hbWUpCit7CisJaWYgKGxpc3Rfc3RyID09IE5VTEwpCisJCXJldHVybiAwOworCisJKmxpc3QgPSBpbnRsaXN0X19uZXcobGlzdF9zdHIpOworCWlmICghKmxpc3QpIHsKKwkJcHJfZXJyKCJwcm9ibGVtcyBwYXJzaW5nICVzIGxpc3RcbiIsIGxpc3RfbmFtZSk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBib29sIHN5bWJvbF9fcmVhZF9rcHRyX3Jlc3RyaWN0KHZvaWQpCiB7CiAJYm9vbCB2YWx1ZSA9IGZhbHNlOwpAQCAtMTkwOSw5ICsxOTQ2LDE3IEBACiAJCSAgICAgICBzeW1ib2xfY29uZi5jb21tX2xpc3Rfc3RyLCAiY29tbSIpIDwgMCkKIAkJZ290byBvdXRfZnJlZV9kc29fbGlzdDsKIAorCWlmIChzZXR1cF9pbnRsaXN0KCZzeW1ib2xfY29uZi5waWRfbGlzdCwKKwkJICAgICAgIHN5bWJvbF9jb25mLnBpZF9saXN0X3N0ciwgInBpZCIpIDwgMCkKKwkJZ290byBvdXRfZnJlZV9jb21tX2xpc3Q7CisKKwlpZiAoc2V0dXBfaW50bGlzdCgmc3ltYm9sX2NvbmYudGlkX2xpc3QsCisJCSAgICAgICBzeW1ib2xfY29uZi50aWRfbGlzdF9zdHIsICJ0aWQiKSA8IDApCisJCWdvdG8gb3V0X2ZyZWVfcGlkX2xpc3Q7CisKIAlpZiAoc2V0dXBfbGlzdCgmc3ltYm9sX2NvbmYuc3ltX2xpc3QsCiAJCSAgICAgICBzeW1ib2xfY29uZi5zeW1fbGlzdF9zdHIsICJzeW1ib2wiKSA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfY29tbV9saXN0OworCQlnb3RvIG91dF9mcmVlX3RpZF9saXN0OwogCiAJLyoKIAkgKiBBIHBhdGggdG8gc3ltYm9scyBvZiAiLyIgaXMgaWRlbnRpY2FsIHRvICIiCkBAIC0xOTMwLDYgKzE5NzUsMTAgQEAKIAlzeW1ib2xfY29uZi5pbml0aWFsaXplZCA9IHRydWU7CiAJcmV0dXJuIDA7CiAKK291dF9mcmVlX3RpZF9saXN0OgorCWludGxpc3RfX2RlbGV0ZShzeW1ib2xfY29uZi50aWRfbGlzdCk7CitvdXRfZnJlZV9waWRfbGlzdDoKKwlpbnRsaXN0X19kZWxldGUoc3ltYm9sX2NvbmYucGlkX2xpc3QpOwogb3V0X2ZyZWVfY29tbV9saXN0OgogCXN0cmxpc3RfX2RlbGV0ZShzeW1ib2xfY29uZi5jb21tX2xpc3QpOwogb3V0X2ZyZWVfZHNvX2xpc3Q6CkBAIC0xOTQ0LDYgKzE5OTMsOCBAQAogCXN0cmxpc3RfX2RlbGV0ZShzeW1ib2xfY29uZi5zeW1fbGlzdCk7CiAJc3RybGlzdF9fZGVsZXRlKHN5bWJvbF9jb25mLmRzb19saXN0KTsKIAlzdHJsaXN0X19kZWxldGUoc3ltYm9sX2NvbmYuY29tbV9saXN0KTsKKwlpbnRsaXN0X19kZWxldGUoc3ltYm9sX2NvbmYudGlkX2xpc3QpOworCWludGxpc3RfX2RlbGV0ZShzeW1ib2xfY29uZi5waWRfbGlzdCk7CiAJdm1saW51eF9wYXRoX19leGl0KCk7CiAJc3ltYm9sX2NvbmYuc3ltX2xpc3QgPSBzeW1ib2xfY29uZi5kc29fbGlzdCA9IHN5bWJvbF9jb25mLmNvbW1fbGlzdCA9IE5VTEw7CiAJc3ltYm9sX2NvbmYuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaCBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaAppbmRleCAxNjUwZGNiLi4wOTU2MTUwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCkBAIC03OCw2ICs3OCw3IEBACiB9CiAKIHN0cnVjdCBzdHJsaXN0Oworc3RydWN0IGludGxpc3Q7CiAKIHN0cnVjdCBzeW1ib2xfY29uZiB7CiAJdW5zaWduZWQgc2hvcnQJcHJpdl9zaXplOwpAQCAtODcsNiArODgsNyBAQAogCQkJaWdub3JlX3ZtbGludXhfYnVpbGRpZCwKIAkJCXNob3dfa2VybmVsX3BhdGgsCiAJCQl1c2VfbW9kdWxlcywKKwkJCWFsbG93X2FsaWFzZXMsCiAJCQlzb3J0X2J5X25hbWUsCiAJCQlzaG93X25yX3NhbXBsZXMsCiAJCQlzaG93X3RvdGFsX3BlcmlvZCwKQEAgLTExNCw2ICsxMTYsOCBAQAogCWNvbnN0IGNoYXIJKmd1ZXN0bW91bnQ7CiAJY29uc3QgY2hhcgkqZHNvX2xpc3Rfc3RyLAogCQkJKmNvbW1fbGlzdF9zdHIsCisJCQkqcGlkX2xpc3Rfc3RyLAorCQkJKnRpZF9saXN0X3N0ciwKIAkJCSpzeW1fbGlzdF9zdHIsCiAJCQkqY29sX3dpZHRoX2xpc3Rfc3RyOwogICAgICAgIHN0cnVjdCBzdHJsaXN0CSpkc29fbGlzdCwKQEAgLTEyMyw2ICsxMjcsOCBAQAogCQkJKmRzb190b19saXN0LAogCQkJKnN5bV9mcm9tX2xpc3QsCiAJCQkqc3ltX3RvX2xpc3Q7CisJc3RydWN0IGludGxpc3QJKnBpZF9saXN0LAorCQkJKnRpZF9saXN0OwogCWNvbnN0IGNoYXIJKnN5bWZzOwogfTsKIApAQCAtMjk0LDUgKzMwMCw3IEBACiAKIGludCBzZXR1cF9saXN0KHN0cnVjdCBzdHJsaXN0ICoqbGlzdCwgY29uc3QgY2hhciAqbGlzdF9zdHIsCiAJICAgICAgIGNvbnN0IGNoYXIgKmxpc3RfbmFtZSk7CitpbnQgc2V0dXBfaW50bGlzdChzdHJ1Y3QgaW50bGlzdCAqKmxpc3QsIGNvbnN0IGNoYXIgKmxpc3Rfc3RyLAorCQkgIGNvbnN0IGNoYXIgKmxpc3RfbmFtZSk7CiAKICNlbmRpZiAvKiBfX1BFUkZfU1lNQk9MICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdGFyZ2V0LmMgYi90b29scy9wZXJmL3V0aWwvdGFyZ2V0LmMKaW5kZXggZTc0YzU5Ni4uYTUzNjAzYiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RhcmdldC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90YXJnZXQuYwpAQCAtMTIzLDExICsxMjMsOCBAQAogCWlmIChlcnJudW0gPj0gMCkgewogCQljb25zdCBjaGFyICplcnIgPSBzdHJlcnJvcl9yKGVycm51bSwgYnVmLCBidWZsZW4pOwogCi0JCWlmIChlcnIgIT0gYnVmKSB7Ci0JCQlzaXplX3QgbGVuID0gc3RybGVuKGVycik7Ci0JCQltZW1jcHkoYnVmLCBlcnIsIG1pbihidWZsZW4gLSAxLCBsZW4pKTsKLQkJCSooYnVmICsgbWluKGJ1ZmxlbiAtIDEsIGxlbikpID0gJ1wwJzsKLQkJfQorCQlpZiAoZXJyICE9IGJ1ZikKKwkJCXNjbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVzIiwgZXJyKTsKIAogCQlyZXR1cm4gMDsKIAl9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdGhyZWFkLmMgYi90b29scy9wZXJmL3V0aWwvdGhyZWFkLmMKaW5kZXggOWViYzhiMS4uMWM4ZmJjOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuYwpAQCAtODIsNiArODIsMjAgQEAKIAlmcmVlKHRocmVhZCk7CiB9CiAKK3N0cnVjdCB0aHJlYWQgKnRocmVhZF9fZ2V0KHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKK3sKKwkrK3RocmVhZC0+cmVmY250OworCXJldHVybiB0aHJlYWQ7Cit9CisKK3ZvaWQgdGhyZWFkX19wdXQoc3RydWN0IHRocmVhZCAqdGhyZWFkKQoreworCWlmICh0aHJlYWQgJiYgLS10aHJlYWQtPnJlZmNudCA9PSAwKSB7CisJCWxpc3RfZGVsX2luaXQoJnRocmVhZC0+bm9kZSk7CisJCXRocmVhZF9fZGVsZXRlKHRocmVhZCk7CisJfQorfQorCiBzdHJ1Y3QgY29tbSAqdGhyZWFkX19jb21tKGNvbnN0IHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKIAlpZiAobGlzdF9lbXB0eSgmdGhyZWFkLT5jb21tX2xpc3QpKQpAQCAtMTkyLDcgKzIwNiw2IEBACiAJCWVyciA9IHRocmVhZF9fc2V0X2NvbW0odGhyZWFkLCBjb21tLCB0aW1lc3RhbXApOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKLQkJdGhyZWFkLT5jb21tX3NldCA9IHRydWU7CiAJfQogCiAJdGhyZWFkLT5wcGlkID0gcGFyZW50LT50aWQ7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdGhyZWFkLmggYi90b29scy9wZXJmL3V0aWwvdGhyZWFkLmgKaW5kZXggMTYwZmQwNi4uOWI4YTU0ZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuaApAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlICJzeW1ib2wuaCIKICNpbmNsdWRlIDxzdHJsaXN0Lmg+CisjaW5jbHVkZSA8aW50bGlzdC5oPgogCiBzdHJ1Y3QgdGhyZWFkX3N0YWNrOwogCkBAIC0yMCw2ICsyMSw3IEBACiAJcGlkX3QJCQl0aWQ7CiAJcGlkX3QJCQlwcGlkOwogCWludAkJCWNwdTsKKwlpbnQJCQlyZWZjbnQ7CiAJY2hhcgkJCXNob3J0bmFtZVszXTsKIAlib29sCQkJY29tbV9zZXQ7CiAJYm9vbAkJCWRlYWQ7IC8qIGlmIHNldCB0aHJlYWQgaGFzIGV4aXRlZCAqLwpAQCAtMzcsNiArMzksMTggQEAKIHN0cnVjdCB0aHJlYWQgKnRocmVhZF9fbmV3KHBpZF90IHBpZCwgcGlkX3QgdGlkKTsKIGludCB0aHJlYWRfX2luaXRfbWFwX2dyb3VwcyhzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKTsKIHZvaWQgdGhyZWFkX19kZWxldGUoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKKworc3RydWN0IHRocmVhZCAqdGhyZWFkX19nZXQoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKK3ZvaWQgdGhyZWFkX19wdXQoc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKKworc3RhdGljIGlubGluZSB2b2lkIF9fdGhyZWFkX196cHV0KHN0cnVjdCB0aHJlYWQgKip0aHJlYWQpCit7CisJdGhyZWFkX19wdXQoKnRocmVhZCk7CisJKnRocmVhZCA9IE5VTEw7Cit9CisKKyNkZWZpbmUgdGhyZWFkX196cHV0KHRocmVhZCkgX190aHJlYWRfX3pwdXQoJnRocmVhZCkKKwogc3RhdGljIGlubGluZSB2b2lkIHRocmVhZF9fZXhpdGVkKHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKIAl0aHJlYWQtPmRlYWQgPSB0cnVlOwpAQCAtODcsNiArMTAxLDE2IEBACiAJCXJldHVybiB0cnVlOwogCX0KIAorCWlmIChzeW1ib2xfY29uZi5waWRfbGlzdCAmJgorCSAgICAhaW50bGlzdF9faGFzX2VudHJ5KHN5bWJvbF9jb25mLnBpZF9saXN0LCB0aHJlYWQtPnBpZF8pKSB7CisJCXJldHVybiB0cnVlOworCX0KKworCWlmIChzeW1ib2xfY29uZi50aWRfbGlzdCAmJgorCSAgICAhaW50bGlzdF9faGFzX2VudHJ5KHN5bWJvbF9jb25mLnRpZF9saXN0LCB0aHJlYWQtPnRpZCkpIHsKKwkJcmV0dXJuIHRydWU7CisJfQorCiAJcmV0dXJuIGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdG9vbC5oIGIvdG9vbHMvcGVyZi91dGlsL3Rvb2wuaAppbmRleCBiYjI3MDhiLi41MWQ5ZTU2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdG9vbC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90b29sLmgKQEAgLTEwLDYgKzEwLDcgQEAKIHN0cnVjdCBwZXJmX3NhbXBsZTsKIHN0cnVjdCBwZXJmX3Rvb2w7CiBzdHJ1Y3QgbWFjaGluZTsKK3N0cnVjdCBvcmRlcmVkX2V2ZW50czsKIAogdHlwZWRlZiBpbnQgKCpldmVudF9zYW1wbGUpKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLApAQCAtMjUsNiArMjYsOSBAQAogdHlwZWRlZiBpbnQgKCpldmVudF9vcDIpKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pOwogCit0eXBlZGVmIGludCAoKmV2ZW50X29lKShzdHJ1Y3QgcGVyZl90b29sICp0b29sLCB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCXN0cnVjdCBvcmRlcmVkX2V2ZW50cyAqb2UpOworCiBzdHJ1Y3QgcGVyZl90b29sIHsKIAlldmVudF9zYW1wbGUJc2FtcGxlLAogCQkJcmVhZDsKQEAgLTM4LDggKzQyLDggQEAKIAkJCXVudGhyb3R0bGU7CiAJZXZlbnRfYXR0cl9vcAlhdHRyOwogCWV2ZW50X29wMgl0cmFjaW5nX2RhdGE7Ci0JZXZlbnRfb3AyCWZpbmlzaGVkX3JvdW5kLAotCQkJYnVpbGRfaWQsCisJZXZlbnRfb2UJZmluaXNoZWRfcm91bmQ7CisJZXZlbnRfb3AyCWJ1aWxkX2lkLAogCQkJaWRfaW5kZXg7CiAJYm9vbAkJb3JkZXJlZF9ldmVudHM7CiAJYm9vbAkJb3JkZXJpbmdfcmVxdWlyZXNfdGltZXN0YW1wczsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKaW5kZXggYzM2NjM2Zi4uMjVkNmM3MyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKQEAgLTExMiw4ICsxMTIsOCBAQAogCXJldHVybiBwZXZlbnRfcmVhZF9udW1iZXIoZXZlbnQtPnBldmVudCwgcHRyLCBzaXplKTsKIH0KIAotdm9pZCBldmVudF9mb3JtYXRfX3ByaW50KHN0cnVjdCBldmVudF9mb3JtYXQgKmV2ZW50LAotCQkJIGludCBjcHUsIHZvaWQgKmRhdGEsIGludCBzaXplKQordm9pZCBldmVudF9mb3JtYXRfX2ZwcmludGYoc3RydWN0IGV2ZW50X2Zvcm1hdCAqZXZlbnQsCisJCQkgICBpbnQgY3B1LCB2b2lkICpkYXRhLCBpbnQgc2l6ZSwgRklMRSAqZnApCiB7CiAJc3RydWN0IHBldmVudF9yZWNvcmQgcmVjb3JkOwogCXN0cnVjdCB0cmFjZV9zZXEgczsKQEAgLTEyNSwxMCArMTI1LDE2IEBACiAKIAl0cmFjZV9zZXFfaW5pdCgmcyk7CiAJcGV2ZW50X2V2ZW50X2luZm8oJnMsIGV2ZW50LCAmcmVjb3JkKTsKLQl0cmFjZV9zZXFfZG9fcHJpbnRmKCZzKTsKKwl0cmFjZV9zZXFfZG9fZnByaW50ZigmcywgZnApOwogCXRyYWNlX3NlcV9kZXN0cm95KCZzKTsKIH0KIAordm9pZCBldmVudF9mb3JtYXRfX3ByaW50KHN0cnVjdCBldmVudF9mb3JtYXQgKmV2ZW50LAorCQkJIGludCBjcHUsIHZvaWQgKmRhdGEsIGludCBzaXplKQoreworCXJldHVybiBldmVudF9mb3JtYXRfX2ZwcmludGYoZXZlbnQsIGNwdSwgZGF0YSwgc2l6ZSwgc3Rkb3V0KTsKK30KKwogdm9pZCBwYXJzZV9wcm9jX2thbGxzeW1zKHN0cnVjdCBwZXZlbnQgKnBldmVudCwKIAkJCSBjaGFyICpmaWxlLCB1bnNpZ25lZCBpbnQgc2l6ZSBfX21heWJlX3VudXNlZCkKIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1zY3JpcHRpbmcuYyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1zY3JpcHRpbmcuYwppbmRleCA1YzliZGQxLi45ZGY2MTA1IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtc2NyaXB0aW5nLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXNjcmlwdGluZy5jCkBAIC00Myw3ICs0Myw2IEBACiBzdGF0aWMgdm9pZCBwcm9jZXNzX2V2ZW50X3Vuc3VwcG9ydGVkKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50IF9fbWF5YmVfdW51c2VkLAogCQkJCSAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlIF9fbWF5YmVfdW51c2VkLAogCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCBfX21heWJlX3VudXNlZCwKLQkJCQkgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgX19tYXliZV91bnVzZWQsCiAJCQkJICAgICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsIF9fbWF5YmVfdW51c2VkKQogewogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LmggYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQuaAppbmRleCA1MmFhYTE5Li5kNTE2OGYwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQuaApAQCAtMjMsNiArMjMsOSBAQAogCiBpbnQgYmlnZW5kaWFuKHZvaWQpOwogCit2b2lkIGV2ZW50X2Zvcm1hdF9fZnByaW50ZihzdHJ1Y3QgZXZlbnRfZm9ybWF0ICpldmVudCwKKwkJCSAgIGludCBjcHUsIHZvaWQgKmRhdGEsIGludCBzaXplLCBGSUxFICpmcCk7CisKIHZvaWQgZXZlbnRfZm9ybWF0X19wcmludChzdHJ1Y3QgZXZlbnRfZm9ybWF0ICpldmVudCwKIAkJCSBpbnQgY3B1LCB2b2lkICpkYXRhLCBpbnQgc2l6ZSk7CiAKQEAgLTY5LDggKzcyLDcgQEAKIAl2b2lkICgqcHJvY2Vzc19ldmVudCkgKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJICAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKLQkJCSAgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCi0JCQkJICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsKTsKKwkJCSAgICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpOwogCWludCAoKmdlbmVyYXRlX3NjcmlwdCkgKHN0cnVjdCBwZXZlbnQgKnBldmVudCwgY29uc3QgY2hhciAqb3V0ZmlsZSk7CiB9OwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYnVud2luZC5jIGIvdG9vbHMvcGVyZi91dGlsL3Vud2luZC1saWJ1bndpbmQuYwppbmRleCBlM2M0MGE1Li43YjA5YTQ0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdW53aW5kLWxpYnVud2luZC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91bndpbmQtbGlidW53aW5kLmMKQEAgLTI2Niw3ICsyNjYsNyBAQAogCQkJCSAgICAgdTY0ICpmZGVfY291bnQpCiB7CiAJaW50IHJldCA9IC1FSU5WQUwsIGZkOwotCXU2NCBvZmZzZXQgPSBkc28tPmRhdGEuZnJhbWVfb2Zmc2V0OworCXU2NCBvZmZzZXQgPSBkc28tPmRhdGEuZWhfZnJhbWVfaGRyX29mZnNldDsKIAogCWlmIChvZmZzZXQgPT0gMCkgewogCQlmZCA9IGRzb19fZGF0YV9mZChkc28sIG1hY2hpbmUpOwpAQCAtMjc1LDcgKzI3NSw3IEBACiAKIAkJLyogQ2hlY2sgdGhlIC5laF9mcmFtZSBzZWN0aW9uIGZvciB1bndpbmRpbmcgaW5mbyAqLwogCQlvZmZzZXQgPSBlbGZfc2VjdGlvbl9vZmZzZXQoZmQsICIuZWhfZnJhbWVfaGRyIik7Ci0JCWRzby0+ZGF0YS5mcmFtZV9vZmZzZXQgPSBvZmZzZXQ7CisJCWRzby0+ZGF0YS5laF9mcmFtZV9oZHJfb2Zmc2V0ID0gb2Zmc2V0OwogCX0KIAogCWlmIChvZmZzZXQpCkBAIC0yOTEsNyArMjkxLDcgQEAKIAkJCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHU2NCAqb2Zmc2V0KQogewogCWludCBmZDsKLQl1NjQgb2ZzID0gZHNvLT5kYXRhLmZyYW1lX29mZnNldDsKKwl1NjQgb2ZzID0gZHNvLT5kYXRhLmRlYnVnX2ZyYW1lX29mZnNldDsKIAogCWlmIChvZnMgPT0gMCkgewogCQlmZCA9IGRzb19fZGF0YV9mZChkc28sIG1hY2hpbmUpOwpAQCAtMzAwLDcgKzMwMCw3IEBACiAKIAkJLyogQ2hlY2sgdGhlIC5kZWJ1Z19mcmFtZSBzZWN0aW9uIGZvciB1bndpbmRpbmcgaW5mbyAqLwogCQlvZnMgPSBlbGZfc2VjdGlvbl9vZmZzZXQoZmQsICIuZGVidWdfZnJhbWUiKTsKLQkJZHNvLT5kYXRhLmZyYW1lX29mZnNldCA9IG9mczsKKwkJZHNvLT5kYXRhLmRlYnVnX2ZyYW1lX29mZnNldCA9IG9mczsKIAl9CiAKIAkqb2Zmc2V0ID0gb2ZzOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3V0aWwuYyBiL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmMKaW5kZXggYjg2NzQ0Zi4uNGVlNmQwZCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3V0aWwuYworKysgYi90b29scy9wZXJmL3V0aWwvdXRpbC5jCkBAIC0yNjksNiArMjY5LDEzIEBACiB2b2lkIGR1bXBfc3RhY2sodm9pZCkge30KICNlbmRpZgogCit2b2lkIHNpZ2hhbmRsZXJfZHVtcF9zdGFjayhpbnQgc2lnKQoreworCXBzaWduYWwoc2lnLCAicGVyZiIpOworCWR1bXBfc3RhY2soKTsKKwlleGl0KHNpZyk7Cit9CisKIHZvaWQgZ2V0X3Rlcm1fZGltZW5zaW9ucyhzdHJ1Y3Qgd2luc2l6ZSAqd3MpCiB7CiAJY2hhciAqcyA9IGdldGVudigiTElORVMiKTsKQEAgLTMwMywxMyArMzEwLDI2IEBACiAJdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0Yyk7CiB9CiAKLXN0YXRpYyB2b2lkIHNldF90cmFjaW5nX2V2ZW50c19wYXRoKGNvbnN0IGNoYXIgKm1vdW50cG9pbnQpCitzdGF0aWMgdm9pZCBzZXRfdHJhY2luZ19ldmVudHNfcGF0aChjb25zdCBjaGFyICp0cmFjaW5nLCBjb25zdCBjaGFyICptb3VudHBvaW50KQogewotCXNucHJpbnRmKHRyYWNpbmdfZXZlbnRzX3BhdGgsIHNpemVvZih0cmFjaW5nX2V2ZW50c19wYXRoKSwgIiVzLyVzIiwKLQkJIG1vdW50cG9pbnQsICJ0cmFjaW5nL2V2ZW50cyIpOworCXNucHJpbnRmKHRyYWNpbmdfZXZlbnRzX3BhdGgsIHNpemVvZih0cmFjaW5nX2V2ZW50c19wYXRoKSwgIiVzLyVzJXMiLAorCQkgbW91bnRwb2ludCwgdHJhY2luZywgImV2ZW50cyIpOwogfQogCi1jb25zdCBjaGFyICpwZXJmX2RlYnVnZnNfbW91bnQoY29uc3QgY2hhciAqbW91bnRwb2ludCkKK3N0YXRpYyBjb25zdCBjaGFyICpfX3BlcmZfdHJhY2Vmc19tb3VudChjb25zdCBjaGFyICptb3VudHBvaW50KQoreworCWNvbnN0IGNoYXIgKm1udDsKKworCW1udCA9IHRyYWNlZnNfbW91bnQobW91bnRwb2ludCk7CisJaWYgKCFtbnQpCisJCXJldHVybiBOVUxMOworCisJc2V0X3RyYWNpbmdfZXZlbnRzX3BhdGgoIiIsIG1udCk7CisKKwlyZXR1cm4gbW50OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqX19wZXJmX2RlYnVnZnNfbW91bnQoY29uc3QgY2hhciAqbW91bnRwb2ludCkKIHsKIAljb25zdCBjaGFyICptbnQ7CiAKQEAgLTMxNyw3ICszMzcsMjAgQEAKIAlpZiAoIW1udCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlzZXRfdHJhY2luZ19ldmVudHNfcGF0aChtbnQpOworCXNldF90cmFjaW5nX2V2ZW50c19wYXRoKCJ0cmFjaW5nLyIsIG1udCk7CisKKwlyZXR1cm4gbW50OworfQorCitjb25zdCBjaGFyICpwZXJmX2RlYnVnZnNfbW91bnQoY29uc3QgY2hhciAqbW91bnRwb2ludCkKK3sKKwljb25zdCBjaGFyICptbnQ7CisKKwltbnQgPSBfX3BlcmZfdHJhY2Vmc19tb3VudChtb3VudHBvaW50KTsKKwlpZiAobW50KQorCQlyZXR1cm4gbW50OworCisJbW50ID0gX19wZXJmX2RlYnVnZnNfbW91bnQobW91bnRwb2ludCk7CiAKIAlyZXR1cm4gbW50OwogfQpAQCAtMzI1LDEyICszNTgsMTkgQEAKIHZvaWQgcGVyZl9kZWJ1Z2ZzX3NldF9wYXRoKGNvbnN0IGNoYXIgKm1udHB0KQogewogCXNucHJpbnRmKGRlYnVnZnNfbW91bnRwb2ludCwgc3RybGVuKGRlYnVnZnNfbW91bnRwb2ludCksICIlcyIsIG1udHB0KTsKLQlzZXRfdHJhY2luZ19ldmVudHNfcGF0aChtbnRwdCk7CisJc2V0X3RyYWNpbmdfZXZlbnRzX3BhdGgoInRyYWNpbmcvIiwgbW50cHQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmluZF90cmFjZWZzKHZvaWQpCit7CisJY29uc3QgY2hhciAqcGF0aCA9IF9fcGVyZl90cmFjZWZzX21vdW50KE5VTEwpOworCisJcmV0dXJuIHBhdGg7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICpmaW5kX2RlYnVnZnModm9pZCkKIHsKLQljb25zdCBjaGFyICpwYXRoID0gcGVyZl9kZWJ1Z2ZzX21vdW50KE5VTEwpOworCWNvbnN0IGNoYXIgKnBhdGggPSBfX3BlcmZfZGVidWdmc19tb3VudChOVUxMKTsKIAogCWlmICghcGF0aCkKIAkJZnByaW50ZihzdGRlcnIsICJZb3VyIGtlcm5lbCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBkZWJ1Z2ZzIGZpbGVzeXN0ZW0iKTsKQEAgLTM0NCw2ICszODQsNyBAQAogICovCiBjb25zdCBjaGFyICpmaW5kX3RyYWNpbmdfZGlyKHZvaWQpCiB7CisJY29uc3QgY2hhciAqdHJhY2luZ19kaXIgPSAiIjsKIAlzdGF0aWMgY2hhciAqdHJhY2luZzsKIAlzdGF0aWMgaW50IHRyYWNpbmdfZm91bmQ7CiAJY29uc3QgY2hhciAqZGVidWdmczsKQEAgLTM1MSwxMSArMzkyLDE1IEBACiAJaWYgKHRyYWNpbmdfZm91bmQpCiAJCXJldHVybiB0cmFjaW5nOwogCi0JZGVidWdmcyA9IGZpbmRfZGVidWdmcygpOwotCWlmICghZGVidWdmcykKLQkJcmV0dXJuIE5VTEw7CisJZGVidWdmcyA9IGZpbmRfdHJhY2VmcygpOworCWlmICghZGVidWdmcykgeworCQl0cmFjaW5nX2RpciA9ICIvdHJhY2luZyI7CisJCWRlYnVnZnMgPSBmaW5kX2RlYnVnZnMoKTsKKwkJaWYgKCFkZWJ1Z2ZzKQorCQkJcmV0dXJuIE5VTEw7CisJfQogCi0JaWYgKGFzcHJpbnRmKCZ0cmFjaW5nLCAiJXMvdHJhY2luZyIsIGRlYnVnZnMpIDwgMCkKKwlpZiAoYXNwcmludGYoJnRyYWNpbmcsICIlcyVzIiwgZGVidWdmcywgdHJhY2luZ19kaXIpIDwgMCkKIAkJcmV0dXJuIE5VTEw7CiAKIAl0cmFjaW5nX2ZvdW5kID0gMTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmggYi90b29scy9wZXJmL3V0aWwvdXRpbC5oCmluZGV4IDAyN2E1MTUuLjFmZjIzZTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3V0aWwuaApAQCAtNzUsNiArNzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3R0eWRlZmF1bHRzLmg+CiAjaW5jbHVkZSA8YXBpL2ZzL2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxhcGkvZnMvdHJhY2Vmcy5oPgogI2luY2x1ZGUgPHRlcm1pb3MuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDx0ZXJtaW9zLmg+CkBAIC0yNzYsNiArMjc3LDcgQEAKIGNoYXIgKnJ0cmltKGNoYXIgKnMpOwogCiB2b2lkIGR1bXBfc3RhY2sodm9pZCk7Cit2b2lkIHNpZ2hhbmRsZXJfZHVtcF9zdGFjayhpbnQgc2lnKTsKIAogZXh0ZXJuIHVuc2lnbmVkIGludCBwYWdlX3NpemU7CiBleHRlcm4gaW50IGNhY2hlbGluZV9zaXplOwpAQCAtMzI3LDQgKzMyOSw4IEBACiBpbnQgZ3ppcF9kZWNvbXByZXNzX3RvX2ZpbGUoY29uc3QgY2hhciAqaW5wdXQsIGludCBvdXRwdXRfZmQpOwogI2VuZGlmCiAKKyNpZmRlZiBIQVZFX0xaTUFfU1VQUE9SVAoraW50IGx6bWFfZGVjb21wcmVzc190b19maWxlKGNvbnN0IGNoYXIgKmlucHV0LCBpbnQgb3V0cHV0X2ZkKTsKKyNlbmRpZgorCiAjZW5kaWYgLyogR0lUX0NPTVBBVF9VVElMX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKaW5kZXggNGU1MTEyMi4uOTVhYmRkYyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvTWFrZWZpbGUKQEAgLTE3LDExICsxNywyMCBAQAogVEFSR0VUUyArPSB0aW1lcnMKIFRBUkdFVFMgKz0gdXNlcgogVEFSR0VUUyArPSB2bQorVEFSR0VUUyArPSB4ODYKICNQbGVhc2Uga2VlcCB0aGUgVEFSR0VUUyBsaXN0IGFscGhhYmV0aWNhbGx5IHNvcnRlZAogCiBUQVJHRVRTX0hPVFBMVUcgPSBjcHUtaG90cGx1ZwogVEFSR0VUU19IT1RQTFVHICs9IG1lbW9yeS1ob3RwbHVnCiAKKyMgQ2xlYXIgTERGTEFHUyBhbmQgTUFLRUZMQUdTIGlmIGNhbGxlZCBmcm9tIG1haW4KKyMgTWFrZWZpbGUgdG8gYXZvaWQgdGVzdCBidWlsZCBmYWlsdXJlcyB3aGVuIHRlc3QKKyMgTWFrZWZpbGUgZG9lc24ndCBoYXZlIGV4cGxpY2l0IGJ1aWxkIHJ1bGVzLgoraWZlcSAoMSwkKE1BS0VMRVZFTCkpCit1bmRlZmluZSBMREZMQUdTCitvdmVycmlkZSBNQUtFRkxBR1MgPQorZW5kaWYKKwogYWxsOgogCWZvciBUQVJHRVQgaW4gJChUQVJHRVRTKTsgZG8gXAogCQltYWtlIC1DICQkVEFSR0VUOyBcCkBAIC00Nyw3ICs1Niw0MCBAQAogCQltYWtlIC1DICQkVEFSR0VUIGNsZWFuOyBcCiAJZG9uZTsKIAorSU5TVEFMTF9QQVRIID89IGluc3RhbGwKK0lOU1RBTExfUEFUSCA6PSAkKGFic3BhdGggJChJTlNUQUxMX1BBVEgpKQorQUxMX1NDUklQVCA6PSAkKElOU1RBTExfUEFUSCkvcnVuX2tzZWxmdGVzdC5zaAorCitpbnN0YWxsOgoraWZkZWYgSU5TVEFMTF9QQVRICisJQCMgQXNrIGFsbCB0YXJnZXRzIHRvIGluc3RhbGwgdGhlaXIgZmlsZXMKKwlta2RpciAtcCAkKElOU1RBTExfUEFUSCkKKwlmb3IgVEFSR0VUIGluICQoVEFSR0VUUyk7IGRvIFwKKwkJbWtkaXIgLXAgJChJTlNUQUxMX1BBVEgpLyQkVEFSR0VUIDsgXAorCQltYWtlIC1DICQkVEFSR0VUIElOU1RBTExfUEFUSD0kKElOU1RBTExfUEFUSCkvJCRUQVJHRVQgaW5zdGFsbDsgXAorCWRvbmU7CisKKwlAIyBBc2sgYWxsIHRhcmdldHMgdG8gZW1pdCB0aGVpciB0ZXN0IHNjcmlwdHMKKwllY2hvICIjIS9iaW4vYmFzaCIgPiAkKEFMTF9TQ1JJUFQpCisJZWNobyAiY2QgXCQkKGRpcm5hbWUgXCQkMCkiID4+ICQoQUxMX1NDUklQVCkKKwllY2hvICJST09UPVwkJFBXRCIgPj4gJChBTExfU0NSSVBUKQorCisJZm9yIFRBUkdFVCBpbiAkKFRBUkdFVFMpOyBkbyBcCisJCWVjaG8gImVjaG8gOyBlY2hvIFJ1bm5pbmcgdGVzdHMgaW4gJCRUQVJHRVQiID4+ICQoQUxMX1NDUklQVCk7IFwKKwkJZWNobyAiZWNobyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IiA+PiAkKEFMTF9TQ1JJUFQpOyBcCisJCWVjaG8gImNkICQkVEFSR0VUIiA+PiAkKEFMTF9TQ1JJUFQpOyBcCisJCW1ha2UgLXMgLS1uby1wcmludC1kaXJlY3RvcnkgLUMgJCRUQVJHRVQgZW1pdF90ZXN0cyA+PiAkKEFMTF9TQ1JJUFQpOyBcCisJCWVjaG8gImNkIFwkJFJPT1QiID4+ICQoQUxMX1NDUklQVCk7IFwKKwlkb25lOworCisJY2htb2QgdSt4ICQoQUxMX1NDUklQVCkKK2Vsc2UKKwkkKGVycm9yIEVycm9yOiBzZXQgSU5TVEFMTF9QQVRIIHRvIHVzZSBpbnN0YWxsKQorZW5kaWYKKwogY2xlYW46CiAJZm9yIFRBUkdFVCBpbiAkKFRBUkdFVFMpOyBkbyBcCiAJCW1ha2UgLUMgJCRUQVJHRVQgY2xlYW47IFwKIAlkb25lOworCisuUEhPTlk6IGluc3RhbGwKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2JyZWFrcG9pbnRzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnJlYWtwb2ludHMvTWFrZWZpbGUKaW5kZXggZTE4YjQyYi4uMTgyMjM1NiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnJlYWtwb2ludHMvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYnJlYWtwb2ludHMvTWFrZWZpbGUKQEAgLTE2LDggKzE2LDkgQEAKIAllY2hvICJOb3QgYW4geDg2IHRhcmdldCwgY2FuJ3QgYnVpbGQgYnJlYWtwb2ludHMgc2VsZnRlc3RzIgogZW5kaWYKIAotcnVuX3Rlc3RzOgotCUAuL2JyZWFrcG9pbnRfdGVzdCB8fCBlY2hvICJicmVha3BvaW50cyBzZWxmdGVzdHM6IFtGQUlMXSIKK1RFU1RfUFJPR1MgOj0gYnJlYWtwb2ludF90ZXN0CisKK2luY2x1ZGUgLi4vbGliLm1rCiAKIGNsZWFuOgogCXJtIC1mciBicmVha3BvaW50X3Rlc3QKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NwdS1ob3RwbHVnL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY3B1LWhvdHBsdWcvTWFrZWZpbGUKaW5kZXggZTljMjhkOC4uZmUxZjk5MSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY3B1LWhvdHBsdWcvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY3B1LWhvdHBsdWcvTWFrZWZpbGUKQEAgLTEsOSArMSwxMCBAQAogYWxsOgogCi1ydW5fdGVzdHM6Ci0JQC9iaW4vYmFzaCAuL29uLW9mZi10ZXN0LnNoIHx8IGVjaG8gImNwdS1ob3RwbHVnIHNlbGZ0ZXN0czogW0ZBSUxdIgorVEVTVF9QUk9HUyA6PSBjcHUtb24tb2ZmLXRlc3Quc2gKKworaW5jbHVkZSAuLi9saWIubWsKIAogcnVuX2Z1bGxfdGVzdDoKLQlAL2Jpbi9iYXNoIC4vb24tb2ZmLXRlc3Quc2ggLWEgfHwgZWNobyAiY3B1LWhvdHBsdWcgc2VsZnRlc3RzOiBbRkFJTF0iCisJQC9iaW4vYmFzaCAuL2NwdS1vbi1vZmYtdGVzdC5zaCAtYSB8fCBlY2hvICJjcHUtaG90cGx1ZyBzZWxmdGVzdHM6IFtGQUlMXSIKIAogY2xlYW46CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jcHUtaG90cGx1Zy9vbi1vZmYtdGVzdC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2NwdS1ob3RwbHVnL2NwdS1vbi1vZmYtdGVzdC5zaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9jcHUtaG90cGx1Zy9vbi1vZmYtdGVzdC5zaApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvY3B1LWhvdHBsdWcvY3B1LW9uLW9mZi10ZXN0LnNoCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9lZml2YXJmcy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2VmaXZhcmZzL01ha2VmaWxlCmluZGV4IDI5ZThjNmIuLjczNmMzZGQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2VmaXZhcmZzL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2VmaXZhcmZzL01ha2VmaWxlCkBAIC0xLDEyICsxLDEzIEBACi1DQyA9ICQoQ1JPU1NfQ09NUElMRSlnY2MKIENGTEFHUyA9IC1XYWxsCiAKIHRlc3Rfb2JqcyA9IG9wZW4tdW5saW5rIGNyZWF0ZS1yZWFkCiAKIGFsbDogJCh0ZXN0X29ianMpCiAKLXJ1bl90ZXN0czogYWxsCi0JQC9iaW4vYmFzaCAuL2VmaXZhcmZzLnNoIHx8IGVjaG8gImVmaXZhcmZzIHNlbGZ0ZXN0czogW0ZBSUxdIgorVEVTVF9QUk9HUyA6PSBlZml2YXJmcy5zaAorVEVTVF9GSUxFUyA6PSAkKHRlc3Rfb2JqcykKKworaW5jbHVkZSAuLi9saWIubWsKIAogY2xlYW46CiAJcm0gLWYgJCh0ZXN0X29ianMpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9lZml2YXJmcy9lZml2YXJmcy5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2VmaXZhcmZzL2VmaXZhcmZzLnNoCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2V4ZWMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9leGVjL01ha2VmaWxlCmluZGV4IDY2ZGZjMmMuLjRlZGI3ZDAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2V4ZWMvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZXhlYy9NYWtlZmlsZQpAQCAtMSw0ICsxLDMgQEAKLUNDID0gJChDUk9TU19DT01QSUxFKWdjYwogQ0ZMQUdTID0gLVdhbGwKIEJJTkFSSUVTID0gZXhlY3ZlYXQKIERFUFMgPSBleGVjdmVhdC5zeW1saW5rIGV4ZWN2ZWF0LmRlbmF0dXJlZCBzY3JpcHQgc3ViZGlyCkBAIC0xOCw4ICsxNywxMiBAQAogJTogJS5jCiAJJChDQykgJChDRkxBR1MpIC1vICRAICReCiAKLXJ1bl90ZXN0czogYWxsCi0JLi9leGVjdmVhdAorVEVTVF9QUk9HUyA6PSBleGVjdmVhdAorVEVTVF9GSUxFUyA6PSAkKERFUFMpCisKK2luY2x1ZGUgLi4vbGliLm1rCisKK292ZXJyaWRlIEVNSVRfVEVTVFMgOj0gZWNobyAibWtkaXIgLXAgc3ViZGlyOyAoLi9leGVjdmVhdCAmJiBlY2hvIFwic2VsZnRlc3RzOiBleGVjdmVhdCBbUEFTU11cIikgfHwgZWNobyBcInNlbGZ0ZXN0czogZXhlY3ZlYXQgW0ZBSUxdXCIiCiAKIGNsZWFuOgogCXJtIC1yZiAkKEJJTkFSSUVTKSAkKERFUFMpIHN1YmRpci5tb3ZlZCBleGVjdmVhdC5tb3ZlZCB4eHh4eCoKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Zpcm13YXJlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlybXdhcmUvTWFrZWZpbGUKaW5kZXggZTIzY2NlMC4uOWJmODIyMyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlybXdhcmUvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlybXdhcmUvTWFrZWZpbGUKQEAgLTMsMjUgKzMsOSBAQAogIyBObyBiaW5hcmllcywgYnV0IG1ha2Ugc3VyZSBhcmctbGVzcyAibWFrZSIgZG9lc24ndCB0cmlnZ2VyICJydW5fdGVzdHMiCiBhbGw6CiAKLWZ3X2ZpbGVzeXN0ZW06Ci0JQGlmIC9iaW4vc2ggLi9md19maWxlc3lzdGVtLnNoIDsgdGhlbiBcCi0gICAgICAgICAgICAgICAgZWNobyAiZndfZmlsZXN5c3RlbTogb2siOyBcCi0gICAgICAgIGVsc2UgXAotICAgICAgICAgICAgICAgIGVjaG8gImZ3X2ZpbGVzeXN0ZW06IFtGQUlMXSI7IFwKLSAgICAgICAgICAgICAgICBleGl0IDE7IFwKLSAgICAgICAgZmkKK1RFU1RfUFJPR1MgOj0gZndfZmlsZXN5c3RlbS5zaCBmd191c2VyaGVscGVyLnNoCiAKLWZ3X3VzZXJoZWxwZXI6Ci0JQGlmIC9iaW4vc2ggLi9md191c2VyaGVscGVyLnNoIDsgdGhlbiBcCi0gICAgICAgICAgICAgICAgZWNobyAiZndfdXNlcmhlbHBlcjogb2siOyBcCi0gICAgICAgIGVsc2UgXAotICAgICAgICAgICAgICAgIGVjaG8gImZ3X3VzZXJoZWxwZXI6IFtGQUlMXSI7IFwKLSAgICAgICAgICAgICAgICBleGl0IDE7IFwKLSAgICAgICAgZmkKLQotcnVuX3Rlc3RzOiBhbGwgZndfZmlsZXN5c3RlbSBmd191c2VyaGVscGVyCitpbmNsdWRlIC4uL2xpYi5tawogCiAjIE5vdGhpbmcgdG8gY2xlYW4gdXAuCiBjbGVhbjoKLQotLlBIT05ZOiBhbGwgY2xlYW4gcnVuX3Rlc3RzIGZ3X2ZpbGVzeXN0ZW0gZndfdXNlcmhlbHBlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlybXdhcmUvZndfZmlsZXN5c3RlbS5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Zpcm13YXJlL2Z3X2ZpbGVzeXN0ZW0uc2gKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZmlybXdhcmUvZndfdXNlcmhlbHBlci5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Zpcm13YXJlL2Z3X3VzZXJoZWxwZXIuc2gKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZnRyYWNlL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZnRyYWNlL01ha2VmaWxlCmluZGV4IDc2Y2M5ZjEuLjM0NjcyMDYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS9NYWtlZmlsZQorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9mdHJhY2UvTWFrZWZpbGUKQEAgLTEsNyArMSw4IEBACiBhbGw6CiAKLXJ1bl90ZXN0czoKLQlAL2Jpbi9zaCAuL2Z0cmFjZXRlc3QgfHwgZWNobyAiZnRyYWNlIHNlbGZ0ZXN0czogW0ZBSUxdIgorVEVTVF9QUk9HUyA6PSBmdHJhY2V0ZXN0CisKK2luY2x1ZGUgLi4vbGliLm1rCiAKIGNsZWFuOgogCXJtIC1yZiBsb2dzLyoKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvMDBiYXNpYy9iYXNpYzQudGMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9mdHJhY2UvdGVzdC5kLzAwYmFzaWMvYmFzaWM0LnRjCmluZGV4IGZkOWM0OWEuLmFhNTFmNmMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvMDBiYXNpYy9iYXNpYzQudGMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZnRyYWNlL3Rlc3QuZC8wMGJhc2ljL2Jhc2ljNC50YwpAQCAtMiw0ICsyLDQgQEAKICMgZGVzY3JpcHRpb246IEJhc2ljIGV2ZW50IHRyYWNpbmcgY2hlY2sKIHRlc3QgLWYgYXZhaWxhYmxlX2V2ZW50cyAtYSAtZiBzZXRfZXZlbnQgLWEgLWQgZXZlbnRzCiAjIGNoZWNrIHNjaGVkdWxlciBldmVudHMgYXJlIGF2YWlsYWJsZQotZ3JlcCAtcSBzY2hlZCBhdmFpbGFibGVfZXZlbnRzICYmIGV4aXQgMCB8fCBleGl0IC0xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZ3JlcCAtcSBzY2hlZCBhdmFpbGFibGVfZXZlbnRzICYmIGV4aXQgMCB8fCBleGl0ICRGQUlMCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9mdHJhY2UvdGVzdC5kL2V2ZW50L2V2ZW50LWVuYWJsZS50YyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvZXZlbnQvZXZlbnQtZW5hYmxlLnRjCmluZGV4IDY2ODYxNmQuLjg3ZWI5ZDYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvZXZlbnQvZXZlbnQtZW5hYmxlLnRjCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvZXZlbnQvZXZlbnQtZW5hYmxlLnRjCkBAIC05LDcgKzksMTEgQEAKIGZhaWwoKSB7ICNtc2cKICAgICBkb19yZXNldAogICAgIGVjaG8gJDEKLSAgICBleGl0IC0xCisgICAgZXhpdCAkRkFJTAorfQorCit5aWVsZCgpIHsKKyAgICBwaW5nIGxvY2FsaG9zdCAtYyAxIHx8IHNsZWVwIC4wMDEgfHwgdXNsZWVwIDEgfHwgc2xlZXAgMQogfQogCiBpZiBbICEgLWYgc2V0X2V2ZW50IC1vICEgLWQgZXZlbnRzL3NjaGVkIF07IHRoZW4KQEAgLTIxLDcgKzI1LDggQEAKIGRvX3Jlc2V0CiAKIGVjaG8gJ3NjaGVkOnNjaGVkX3N3aXRjaCcgPiBzZXRfZXZlbnQKLXVzbGVlcCAxCisKK3lpZWxkCiAKIGNvdW50PWBjYXQgdHJhY2UgfCBncmVwIHNjaGVkX3N3aXRjaCB8IHdjIC1sYAogaWYgWyAkY291bnQgLWVxIDAgXTsgdGhlbgpAQCAtMzEsNyArMzYsOCBAQAogZG9fcmVzZXQKIAogZWNobyAxID4gZXZlbnRzL3NjaGVkL3NjaGVkX3N3aXRjaC9lbmFibGUKLXVzbGVlcCAxCisKK3lpZWxkCiAKIGNvdW50PWBjYXQgdHJhY2UgfCBncmVwIHNjaGVkX3N3aXRjaCB8IHdjIC1sYAogaWYgWyAkY291bnQgLWVxIDAgXTsgdGhlbgpAQCAtNDEsNyArNDcsOCBAQAogZG9fcmVzZXQKIAogZWNobyAwID4gZXZlbnRzL3NjaGVkL3NjaGVkX3N3aXRjaC9lbmFibGUKLXVzbGVlcCAxCisKK3lpZWxkCiAKIGNvdW50PWBjYXQgdHJhY2UgfCBncmVwIHNjaGVkX3N3aXRjaCB8IHdjIC1sYAogaWYgWyAkY291bnQgLW5lIDAgXTsgdGhlbgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZnRyYWNlL3Rlc3QuZC9ldmVudC9zdWJzeXN0ZW0tZW5hYmxlLnRjIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZnRyYWNlL3Rlc3QuZC9ldmVudC9zdWJzeXN0ZW0tZW5hYmxlLnRjCmluZGV4IDY1NWM0MTUuLmNlZDI3ZWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvZXZlbnQvc3Vic3lzdGVtLWVuYWJsZS50YworKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9mdHJhY2UvdGVzdC5kL2V2ZW50L3N1YnN5c3RlbS1lbmFibGUudGMKQEAgLTksNyArOSwxMSBAQAogZmFpbCgpIHsgI21zZwogICAgIGRvX3Jlc2V0CiAgICAgZWNobyAkMQotICAgIGV4aXQgLTEKKyAgICBleGl0ICRGQUlMCit9CisKK3lpZWxkKCkgeworICAgIHBpbmcgbG9jYWxob3N0IC1jIDEgfHwgc2xlZXAgLjAwMSB8fCB1c2xlZXAgMSB8fCBzbGVlcCAxCiB9CiAKIGlmIFsgISAtZiBzZXRfZXZlbnQgLW8gISAtZCBldmVudHMvc2NoZWQgXTsgdGhlbgpAQCAtMjEsNyArMjUsOCBAQAogZG9fcmVzZXQKIAogZWNobyAnc2NoZWQ6KicgPiBzZXRfZXZlbnQKLXVzbGVlcCAxCisKK3lpZWxkCiAKIGNvdW50PWBjYXQgdHJhY2UgfCBncmVwIC12IF4jIHwgYXdrICd7IHByaW50ICQ1IH0nIHwgc29ydCAtdSB8IHdjIC1sYAogaWYgWyAkY291bnQgLWx0IDMgXTsgdGhlbgpAQCAtMzEsNyArMzYsOCBAQAogZG9fcmVzZXQKIAogZWNobyAxID4gZXZlbnRzL3NjaGVkL2VuYWJsZQotdXNsZWVwIDEKKworeWllbGQKIAogY291bnQ9YGNhdCB0cmFjZSB8IGdyZXAgLXYgXiMgfCBhd2sgJ3sgcHJpbnQgJDUgfScgfCBzb3J0IC11IHwgd2MgLWxgCiBpZiBbICRjb3VudCAtbHQgMyBdOyB0aGVuCkBAIC00MSw3ICs0Nyw4IEBACiBkb19yZXNldAogCiBlY2hvIDAgPiBldmVudHMvc2NoZWQvZW5hYmxlCi11c2xlZXAgMQorCit5aWVsZAogCiBjb3VudD1gY2F0IHRyYWNlIHwgZ3JlcCAtdiBeIyB8IGF3ayAneyBwcmludCAkNSB9JyB8IHNvcnQgLXUgfCB3YyAtbGAKIGlmIFsgJGNvdW50IC1uZSAwIF07IHRoZW4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvZXZlbnQvdG9wbGV2ZWwtZW5hYmxlLnRjIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZnRyYWNlL3Rlc3QuZC9ldmVudC90b3BsZXZlbC1lbmFibGUudGMKaW5kZXggNDgwODQ1Ny4uMGJiNWRmMyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZnRyYWNlL3Rlc3QuZC9ldmVudC90b3BsZXZlbC1lbmFibGUudGMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZnRyYWNlL3Rlc3QuZC9ldmVudC90b3BsZXZlbC1lbmFibGUudGMKQEAgLTksNyArOSwxMSBAQAogZmFpbCgpIHsgI21zZwogICAgIGRvX3Jlc2V0CiAgICAgZWNobyAkMQotICAgIGV4aXQgLTEKKyAgICBleGl0ICRGQUlMCit9CisKK3lpZWxkKCkgeworICAgIHBpbmcgbG9jYWxob3N0IC1jIDEgfHwgc2xlZXAgLjAwMSB8fCB1c2xlZXAgMSB8fCBzbGVlcCAxCiB9CiAKIGlmIFsgISAtZiBhdmFpbGFibGVfZXZlbnRzIC1vICEgLWYgc2V0X2V2ZW50IC1vICEgLWQgZXZlbnRzIF07IHRoZW4KQEAgLTIxLDYgKzI1LDkgQEAKIGRvX3Jlc2V0CiAKIGVjaG8gJyo6KicgPiBzZXRfZXZlbnQKKworeWllbGQKKwogY291bnQ9YGNhdCB0cmFjZSB8IGdyZXAgLXYgXiMgfCB3YyAtbGAKIGlmIFsgJGNvdW50IC1lcSAwIF07IHRoZW4KICAgICBmYWlsICJub25lIG9mIGV2ZW50cyBhcmUgcmVjb3JkZWQiCkBAIC0yOSw2ICszNiw5IEBACiBkb19yZXNldAogCiBlY2hvIDEgPiBldmVudHMvZW5hYmxlCisKK3lpZWxkCisKIGNvdW50PWBjYXQgdHJhY2UgfCBncmVwIC12IF4jIHwgd2MgLWxgCiBpZiBbICRjb3VudCAtZXEgMCBdOyB0aGVuCiAgICAgZmFpbCAibm9uZSBvZiBldmVudHMgYXJlIHJlY29yZGVkIgpAQCAtMzcsNiArNDcsOSBAQAogZG9fcmVzZXQKIAogZWNobyAwID4gZXZlbnRzL2VuYWJsZQorCit5aWVsZAorCiBjb3VudD1gY2F0IHRyYWNlIHwgZ3JlcCAtdiBeIyB8IHdjIC1sYAogaWYgWyAkY291bnQgLW5lIDAgXTsgdGhlbgogICAgIGZhaWwgImFueSBvZiBldmVudHMgc2hvdWxkIG5vdCBiZSByZWNvcmRlZCIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvZnRyYWNlL2ZncmFwaC1maWx0ZXItc3RhY2sudGMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9mdHJhY2UvdGVzdC5kL2Z0cmFjZS9mZ3JhcGgtZmlsdGVyLXN0YWNrLnRjCmluZGV4IGMxNWUwMTguLjE1YzJkYmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvZnRyYWNlL2ZncmFwaC1maWx0ZXItc3RhY2sudGMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZnRyYWNlL3Rlc3QuZC9mdHJhY2UvZmdyYXBoLWZpbHRlci1zdGFjay50YwpAQCAtMTYsNyArMTYsOSBAQAogCiBkb19yZXNldCgpIHsKICAgICByZXNldF90cmFjZXIKLSAgICBlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL3N0YWNrX3RyYWNlcl9lbmFibGVkCisgICAgaWYgWyAtZSAvcHJvYy9zeXMva2VybmVsL3N0YWNrX3RyYWNlcl9lbmFibGVkIF07IHRoZW4KKwkgICAgZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9zdGFja190cmFjZXJfZW5hYmxlZAorICAgIGZpCiAgICAgZW5hYmxlX3RyYWNpbmcKICAgICBjbGVhcl90cmFjZQogICAgIGVjaG8gPiBzZXRfZnRyYWNlX2ZpbHRlcgpAQCAtMjUsNyArMjcsNyBAQAogZmFpbCgpIHsgIyBtc2cKICAgICBkb19yZXNldAogICAgIGVjaG8gJDEKLSAgICBleGl0IC0xCisgICAgZXhpdCAkRkFJTAogfQogCiBkaXNhYmxlX3RyYWNpbmcKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvZnRyYWNlL2ZncmFwaC1maWx0ZXIudGMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9mdHJhY2UvdGVzdC5kL2Z0cmFjZS9mZ3JhcGgtZmlsdGVyLnRjCmluZGV4IDZhZjVmNjMuLjBhYjIxODkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvZnRyYWNlL2ZncmFwaC1maWx0ZXIudGMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZnRyYWNlL3Rlc3QuZC9mdHJhY2UvZmdyYXBoLWZpbHRlci50YwpAQCAtMTcsNyArMTcsNyBAQAogZmFpbCgpIHsgIyBtc2cKICAgICBkb19yZXNldAogICAgIGVjaG8gJDEKLSAgICBleGl0IC0xCisgICAgZXhpdCAkRkFJTAogfQogCiBkaXNhYmxlX3RyYWNpbmcKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvZnRyYWNlL2Z1bmNfcHJvZmlsZXIudGMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9mdHJhY2UvdGVzdC5kL2Z0cmFjZS9mdW5jX3Byb2ZpbGVyLnRjCmluZGV4IDJlNzE5Y2IuLjc4MDgzMzYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Z0cmFjZS90ZXN0LmQvZnRyYWNlL2Z1bmNfcHJvZmlsZXIudGMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZnRyYWNlL3Rlc3QuZC9mdHJhY2UvZnVuY19wcm9maWxlci50YwpAQCAtMzEsNyArMzEsNyBAQAogICAgIHJlc2V0X3RyYWNlcgogICAgIGVjaG8gPiBzZXRfZnRyYWNlX2ZpbHRlcgogICAgIGVjaG8gJDEKLSAgICBleGl0IC0xCisgICAgZXhpdCAkRkFJTAogfQogCiBlY2hvICJUZXN0aW5nIGZ1bmN0aW9uIHRyYWNlciB3aXRoIHByb2ZpbGVyOiIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2dlbl9rc2VsZnRlc3RfdGFyLnNoIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvZ2VuX2tzZWxmdGVzdF90YXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTdkNWJkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2dlbl9rc2VsZnRlc3RfdGFyLnNoCkBAIC0wLDAgKzEsNTUgQEAKKyMhL2Jpbi9iYXNoCisjCisjIGdlbl9rc2VsZnRlc3RfdGFyCisjIEdlbmVyYXRlIGtzZWxmdGVzdCB0YXJiYWxsCisjIEF1dGhvcjogU2h1YWggS2hhbiA8c2h1YWhraEBvc2cuc2Ftc3VuZy5jb20+CisjIENvcHlyaWdodCAoQykgMjAxNSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorCisjIFRoaXMgc29mdHdhcmUgbWF5IGJlIGZyZWVseSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTHYyKS4KKworIyBtYWluCittYWluKCkKK3sKKwlpZiBbICIkIyIgLWVxIDAgXTsgdGhlbgorCQllY2hvICIkMDogR2VuZXJhdGluZyBkZWZhdWx0IGNvbXByZXNzaW9uIGd6aXAiCisJCWNvcHRzPSJjdnpmIgorCQlleHQ9Ii50YXIuZ3oiCisJZWxzZQorCQljYXNlICIkMSIgaW4KKwkJCXRhcikKKwkJCQljb3B0cz0iY3ZmIgorCQkJCWV4dD0iLnRhciIKKwkJCQk7OworCQkJdGFyZ3opCisJCQkJY29wdHM9ImN2emYiCisJCQkJZXh0PSIudGFyLmd6IgorCQkJCTs7CisJCQl0YXJiejIpCisJCQkJY29wdHM9ImN2amYiCisJCQkJZXh0PSIudGFyLmJ6MiIKKwkJCQk7OworCQkJdGFyeHopCisJCQkJY29wdHM9ImN2SmYiCisJCQkJZXh0PSIudGFyLnh6IgorCQkJCTs7CisJCQkqKQorCQkJZWNobyAiVW5rbm93biB0YXJiYWxsIGZvcm1hdCAkMSIKKwkJCWV4aXQgMQorCQkJOzsKKwllc2FjCisJZmkKKworCWluc3RhbGxfZGlyPS4va3NlbGZ0ZXN0CisKKyMgUnVuIGluc3RhbGwgdXNpbmcgSU5TVEFMTF9LU0ZUX1BBVEggb3ZlcnJpZGUgdG8gZ2VuZXJhdGUgaW5zdGFsbAorIyBkaXJlY3RvcnkKKy4va3NlbGZ0ZXN0X2luc3RhbGwuc2gKK3RhciAkY29wdHMga3NlbGZ0ZXN0JHtleHR9ICRpbnN0YWxsX2RpcgorZWNobyAiS3NlbGZ0ZXN0IGFyY2hpdmUga3NlbGZ0ZXN0JHtleHR9IGNyZWF0ZWQhIgorCisjIGNsZWFuIHVwIGluc3RhbGwgZGlyZWN0b3J5CitybSAtcmYga3NlbGZ0ZXN0Cit9CisKK21haW4gIiRAIgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvaXBjL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvaXBjL01ha2VmaWxlCmluZGV4IDc0YmJlZmQuLjI1ZDJlNzAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2lwYy9NYWtlZmlsZQorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9pcGMvTWFrZWZpbGUKQEAgLTEyLDE0ICsxMiwxMSBAQAogQ0ZMQUdTICs9IC1JLi4vLi4vLi4vLi4vdXNyL2luY2x1ZGUvCiAKIGFsbDoKLWlmZXEgKCQoQVJDSCkseDg2KQotCWdjYyAkKENGTEFHUykgbXNncXVlLmMgLW8gbXNncXVlX3Rlc3QKLWVsc2UKLQllY2hvICJOb3QgYW4geDg2IHRhcmdldCwgY2FuJ3QgYnVpbGQgbXNncXVlIHNlbGZ0ZXN0IgotZW5kaWYKKwkkKENDKSAkKENGTEFHUykgbXNncXVlLmMgLW8gbXNncXVlX3Rlc3QKIAotcnVuX3Rlc3RzOiBhbGwKLQkuL21zZ3F1ZV90ZXN0CitURVNUX1BST0dTIDo9IG1zZ3F1ZV90ZXN0CisKK2luY2x1ZGUgLi4vbGliLm1rCiAKIGNsZWFuOgogCXJtIC1mciAuL21zZ3F1ZV90ZXN0CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rY21wL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva2NtcC9NYWtlZmlsZQppbmRleCBmZjBlZWZkLi4yYWU3NDUwIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rY21wL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2tjbXAvTWFrZWZpbGUKQEAgLTEsMTAgKzEsMTAgQEAKLUNDIDo9ICQoQ1JPU1NfQ09NUElMRSkkKENDKQogQ0ZMQUdTICs9IC1JLi4vLi4vLi4vLi4vdXNyL2luY2x1ZGUvCiAKIGFsbDoga2NtcF90ZXN0CiAKLXJ1bl90ZXN0czogYWxsCi0JQC4va2NtcF90ZXN0IHx8IGVjaG8gImtjbXBfdGVzdDogW0ZBSUxdIgorVEVTVF9QUk9HUyA6PSBrY21wX3Rlc3QKKworaW5jbHVkZSAuLi9saWIubWsKIAogY2xlYW46CiAJJChSTSkga2NtcF90ZXN0IGtjbXAtdGVzdC1maWxlCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rc2VsZnRlc3RfaW5zdGFsbC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2tzZWxmdGVzdF9pbnN0YWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE1NTVmYmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rc2VsZnRlc3RfaW5zdGFsbC5zaApAQCAtMCwwICsxLDM3IEBACisjIS9iaW4vYmFzaAorIworIyBLc2VsZnRlc3QgSW5zdGFsbAorIyBJbnN0YWxsIGtzZWxmdGVzdCB0ZXN0cworIyBBdXRob3I6IFNodWFoIEtoYW4gPHNodWFoa2hAb3NnLnNhbXN1bmcuY29tPgorIyBDb3B5cmlnaHQgKEMpIDIwMTUgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKworIyBUaGlzIHNvZnR3YXJlIG1heSBiZSBmcmVlbHkgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorIyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEx2MikuCisKK2luc3RhbGxfbG9jPWBwd2RgCisKK21haW4oKQoreworCWlmIFsgJChiYXNlbmFtZSAkaW5zdGFsbF9sb2MpICE9ICAic2VsZnRlc3RzIiBdOyB0aGVuCisJCWVjaG8gIiQwOiBQbGVhc2UgcnVuIGl0IGluIHNlbGZ0ZXN0cyBkaXJlY3RvcnkgLi4uIgorCQlleGl0IDE7CisJZmkKKwlpZiBbICIkIyIgLWVxIDAgXTsgdGhlbgorCQllY2hvICIkMDogSW5zdGFsbGluZyBpbiBkZWZhdWx0IGxvY2F0aW9uIC0gJGluc3RhbGxfbG9jIC4uLiIKKwllbGlmIFsgISAtZCAiJDEiIF07IHRoZW4KKwkJZWNobyAiJDA6ICQxIGRvZXNuJ3QgZXhpc3QhISIKKwkJZXhpdCAxOworCWVsc2UKKwkJaW5zdGFsbF9sb2M9JDEKKwkJZWNobyAiJDA6IEluc3RhbGxpbmcgaW4gc3BlY2lmaWVkIGxvY2F0aW9uIC0gJGluc3RhbGxfbG9jIC4uLiIKKwlmaQorCisJaW5zdGFsbF9kaXI9JGluc3RhbGxfbG9jL2tzZWxmdGVzdAorCisjIENyZWF0ZSBpbnN0YWxsIGRpcmVjdG9yeQorCW1rZGlyIC1wICRpbnN0YWxsX2RpcgorIyBCdWlsZCB0ZXN0cworCUlOU1RBTExfUEFUSD0kaW5zdGFsbF9kaXIgbWFrZSBpbnN0YWxsCit9CisKK21haW4gIiRAIgpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGliLm1rIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbGliLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxOTQxNTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9saWIubWsKQEAgLTAsMCArMSwzNSBAQAorIyBUaGlzIG1pbWljcyB0aGUgdG9wLWxldmVsIE1ha2VmaWxlLiBXZSBkbyBpdCBleHBsaWNpdGx5IGhlcmUgc28gdGhhdCB0aGlzCisjIE1ha2VmaWxlIGNhbiBvcGVyYXRlIHdpdGggb3Igd2l0aG91dCB0aGUga2J1aWxkIGluZnJhc3RydWN0dXJlLgorQ0MgOj0gJChDUk9TU19DT01QSUxFKWdjYworCitkZWZpbmUgUlVOX1RFU1RTCisJQGZvciBURVNUIGluICQoVEVTVF9QUk9HUyk7IGRvIFwKKwkJKC4vJCRURVNUICYmIGVjaG8gInNlbGZ0ZXN0czogJCRURVNUIFtQQVNTXSIpIHx8IGVjaG8gInNlbGZ0ZXN0czogJCRURVNUIFtGQUlMXSI7IFwKKwlkb25lOworZW5kZWYKKworcnVuX3Rlc3RzOiBhbGwKKwkkKFJVTl9URVNUUykKKworZGVmaW5lIElOU1RBTExfUlVMRQorCW1rZGlyIC1wICQoSU5TVEFMTF9QQVRIKQorCWluc3RhbGwgLXQgJChJTlNUQUxMX1BBVEgpICQoVEVTVF9QUk9HUykgJChURVNUX1BST0dTX0VYVEVOREVEKSAkKFRFU1RfRklMRVMpCitlbmRlZgorCitpbnN0YWxsOiBhbGwKK2lmZGVmIElOU1RBTExfUEFUSAorCSQoSU5TVEFMTF9SVUxFKQorZWxzZQorCSQoZXJyb3IgRXJyb3I6IHNldCBJTlNUQUxMX1BBVEggdG8gdXNlIGluc3RhbGwpCitlbmRpZgorCitkZWZpbmUgRU1JVF9URVNUUworCUBmb3IgVEVTVCBpbiAkKFRFU1RfUFJPR1MpOyBkbyBcCisJCWVjaG8gIiguLyQkVEVTVCAmJiBlY2hvIFwic2VsZnRlc3RzOiAkJFRFU1QgW1BBU1NdXCIpIHx8IGVjaG8gXCJzZWxmdGVzdHM6ICQkVEVTVCBbRkFJTF1cIiI7IFwKKwlkb25lOworZW5kZWYKKworZW1pdF90ZXN0czoKKwkkKEVNSVRfVEVTVFMpCisKKy5QSE9OWTogcnVuX3Rlc3RzIGFsbCBjbGVhbiBpbnN0YWxsIGVtaXRfdGVzdHMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21lbWZkL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvTWFrZWZpbGUKaW5kZXggYjgwY2QxMC4uM2U3ZWI3OSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtZmQvTWFrZWZpbGUKQEAgLTEsMTcgKzEsMTkgQEAKK0NDID0gJChDUk9TU19DT01QSUxFKWdjYwogQ0ZMQUdTICs9IC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQKIENGTEFHUyArPSAtSS4uLy4uLy4uLy4uL2luY2x1ZGUvdWFwaS8KIENGTEFHUyArPSAtSS4uLy4uLy4uLy4uL2luY2x1ZGUvCitDRkxBR1MgKz0gLUkuLi8uLi8uLi8uLi91c3IvaW5jbHVkZS8KIAogYWxsOgotCWdjYyAkKENGTEFHUykgbWVtZmRfdGVzdC5jIC1vIG1lbWZkX3Rlc3QKKwkkKENDKSAkKENGTEFHUykgbWVtZmRfdGVzdC5jIC1vIG1lbWZkX3Rlc3QKIAotcnVuX3Rlc3RzOiBhbGwKLQlnY2MgJChDRkxBR1MpIG1lbWZkX3Rlc3QuYyAtbyBtZW1mZF90ZXN0Ci0JQC4vbWVtZmRfdGVzdCB8fCBlY2hvICJtZW1mZF90ZXN0OiBbRkFJTF0iCitURVNUX1BST0dTIDo9IG1lbWZkX3Rlc3QKKworaW5jbHVkZSAuLi9saWIubWsKIAogYnVpbGRfZnVzZToKLQlnY2MgJChDRkxBR1MpIGZ1c2VfbW50LmMgYHBrZy1jb25maWcgZnVzZSAtLWNmbGFncyAtLWxpYnNgIC1vIGZ1c2VfbW50Ci0JZ2NjICQoQ0ZMQUdTKSBmdXNlX3Rlc3QuYyAtbyBmdXNlX3Rlc3QKKwkkKENDKSAkKENGTEFHUykgZnVzZV9tbnQuYyBgcGtnLWNvbmZpZyBmdXNlIC0tY2ZsYWdzIC0tbGlic2AgLW8gZnVzZV9tbnQKKwkkKENDKSAkKENGTEFHUykgZnVzZV90ZXN0LmMgLW8gZnVzZV90ZXN0CiAKIHJ1bl9mdXNlOiBidWlsZF9mdXNlCiAJQC4vcnVuX2Z1c2VfdGVzdC5zaCB8fCBlY2hvICJmdXNlX3Rlc3Q6IFtGQUlMXSIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21lbW9yeS1ob3RwbHVnL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtb3J5LWhvdHBsdWcvTWFrZWZpbGUKaW5kZXggZDQ2YjhkNC4uYWZiMjYyNCAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtb3J5LWhvdHBsdWcvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtb3J5LWhvdHBsdWcvTWFrZWZpbGUKQEAgLTEsOSArMSwxMiBAQAogYWxsOgogCi1ydW5fdGVzdHM6Ci0JQC9iaW4vYmFzaCAuL29uLW9mZi10ZXN0LnNoIC1yIDIgfHwgZWNobyAibWVtb3J5LWhvdHBsdWcgc2VsZnRlc3RzOiBbRkFJTF0iCitpbmNsdWRlIC4uL2xpYi5taworCitURVNUX1BST0dTIDo9IG1lbS1vbi1vZmYtdGVzdC5zaAorb3ZlcnJpZGUgUlVOX1RFU1RTIDo9IC4vbWVtLW9uLW9mZi10ZXN0LnNoIC1yIDIgfHwgZWNobyAic2VsZnRlc3RzOiBtZW1vcnktaG90cGx1ZyBbRkFJTF0iCitvdmVycmlkZSBFTUlUX1RFU1RTIDo9IGVjaG8gIiQoUlVOX1RFU1RTKSIKIAogcnVuX2Z1bGxfdGVzdDoKLQlAL2Jpbi9iYXNoIC4vb24tb2ZmLXRlc3Quc2ggfHwgZWNobyAibWVtb3J5LWhvdHBsdWcgc2VsZnRlc3RzOiBbRkFJTF0iCisJQC9iaW4vYmFzaCAuL21lbS1vbi1vZmYtdGVzdC5zaCB8fCBlY2hvICJtZW1vcnktaG90cGx1ZyBzZWxmdGVzdHM6IFtGQUlMXSIKIAogY2xlYW46CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1vcnktaG90cGx1Zy9vbi1vZmYtdGVzdC5zaCBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21lbW9yeS1ob3RwbHVnL21lbS1vbi1vZmYtdGVzdC5zaApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tZW1vcnktaG90cGx1Zy9vbi1vZmYtdGVzdC5zaApyZW5hbWUgdG8gdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbWVtb3J5LWhvdHBsdWcvbWVtLW9uLW9mZi10ZXN0LnNoCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tb3VudC8uZ2l0aWdub3JlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW91bnQvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTZhZDQxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbW91bnQvLmdpdGlnbm9yZQpAQCAtMCwwICsxIEBACit1bnByaXZpbGVnZWQtcmVtb3VudC10ZXN0CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tb3VudC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21vdW50L01ha2VmaWxlCmluZGV4IDMzN2Q4NTMuLjk1NTgwYTkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21vdW50L01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21vdW50L01ha2VmaWxlCkBAIC0xLDE3ICsxLDE2IEBACiAjIE1ha2VmaWxlIGZvciBtb3VudCBzZWxmdGVzdHMuCi0KK0NGTEFHUyA9IC1XYWxsIFwKKyAgICAgICAgIC1PMgogYWxsOiB1bnByaXZpbGVnZWQtcmVtb3VudC10ZXN0CiAKIHVucHJpdmlsZWdlZC1yZW1vdW50LXRlc3Q6IHVucHJpdmlsZWdlZC1yZW1vdW50LXRlc3QuYwotCWdjYyAtV2FsbCAtTzIgdW5wcml2aWxlZ2VkLXJlbW91bnQtdGVzdC5jIC1vIHVucHJpdmlsZWdlZC1yZW1vdW50LXRlc3QKKwkkKENDKSAkKENGTEFHUykgdW5wcml2aWxlZ2VkLXJlbW91bnQtdGVzdC5jIC1vIHVucHJpdmlsZWdlZC1yZW1vdW50LXRlc3QKIAotIyBBbGxvdyBzcGVjaWZpYyB0ZXN0cyB0byBiZSBzZWxlY3RlZC4KLXRlc3RfdW5wcml2aWxlZ2VkX3JlbW91bnQ6IHVucHJpdmlsZWdlZC1yZW1vdW50LXRlc3QKLQlAaWYgWyAtZiAvcHJvYy9zZWxmL3VpZF9tYXAgXSA7IHRoZW4gLi91bnByaXZpbGVnZWQtcmVtb3VudC10ZXN0IDsgZmkKK2luY2x1ZGUgLi4vbGliLm1rCiAKLXJ1bl90ZXN0czogYWxsIHRlc3RfdW5wcml2aWxlZ2VkX3JlbW91bnQKK1RFU1RfUFJPR1MgOj0gdW5wcml2aWxlZ2VkLXJlbW91bnQtdGVzdAorb3ZlcnJpZGUgUlVOX1RFU1RTIDo9IGlmIFsgLWYgL3Byb2Mvc2VsZi91aWRfbWFwIF0gOyB0aGVuIC4vdW5wcml2aWxlZ2VkLXJlbW91bnQtdGVzdCA7IGZpCitvdmVycmlkZSBFTUlUX1RFU1RTIDo9IGVjaG8gIiQoUlVOX1RFU1RTKSIKIAogY2xlYW46CiAJcm0gLWYgdW5wcml2aWxlZ2VkLXJlbW91bnQtdGVzdAotCi0uUEhPTlk6IGFsbCB0ZXN0X3VucHJpdmlsZWdlZF9yZW1vdW50CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tcXVldWUvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9tcXVldWUvTWFrZWZpbGUKaW5kZXggODA1NmUyZS4uMGUzYjQxZSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbXF1ZXVlL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL21xdWV1ZS9NYWtlZmlsZQpAQCAtMSwxMCArMSwyMiBAQAotYWxsOgotCWdjYyAtTzIgbXFfb3Blbl90ZXN0cy5jIC1vIG1xX29wZW5fdGVzdHMgLWxydAotCWdjYyAtTzIgLW8gbXFfcGVyZl90ZXN0cyBtcV9wZXJmX3Rlc3RzLmMgLWxydCAtbHB0aHJlYWQgLWxwb3B0CitDRkxBR1MgPSAtTzIKIAotcnVuX3Rlc3RzOgotCUAuL21xX29wZW5fdGVzdHMgL3Rlc3QxIHx8IGVjaG8gIm1xX29wZW5fdGVzdHM6IFtGQUlMXSIKLQlALi9tcV9wZXJmX3Rlc3RzIHx8IGVjaG8gIm1xX3BlcmZfdGVzdHM6IFtGQUlMXSIKK2FsbDoKKwkkKENDKSAkKENGTEFHUykgbXFfb3Blbl90ZXN0cy5jIC1vIG1xX29wZW5fdGVzdHMgLWxydAorCSQoQ0MpICQoQ0ZMQUdTKSAtbyBtcV9wZXJmX3Rlc3RzIG1xX3BlcmZfdGVzdHMuYyAtbHJ0IC1scHRocmVhZCAtbHBvcHQKKworaW5jbHVkZSAuLi9saWIubWsKKworb3ZlcnJpZGUgZGVmaW5lIFJVTl9URVNUUworCUAuL21xX29wZW5fdGVzdHMgL3Rlc3QxIHx8IGVjaG8gInNlbGZ0ZXN0czogbXFfb3Blbl90ZXN0cyBbRkFJTF0iCisJQC4vbXFfcGVyZl90ZXN0cyB8fCBlY2hvICJzZWxmdGVzdHM6IG1xX3BlcmZfdGVzdHMgW0ZBSUxdIgorZW5kZWYKKworVEVTVF9QUk9HUyA6PSBtcV9vcGVuX3Rlc3RzIG1xX3BlcmZfdGVzdHMKKworb3ZlcnJpZGUgZGVmaW5lIEVNSVRfVEVTVFMKKwllY2hvICIuL21xX29wZW5fdGVzdHMgL3Rlc3QxIHx8IGVjaG8gXCJzZWxmdGVzdHM6IG1xX29wZW5fdGVzdHMgW0ZBSUxdXCIiCisJZWNobyAiLi9tcV9wZXJmX3Rlc3RzIHx8IGVjaG8gXCJzZWxmdGVzdHM6IG1xX3BlcmZfdGVzdHMgW0ZBSUxdXCIiCitlbmRlZgogCiBjbGVhbjoKIAlybSAtZiBtcV9vcGVuX3Rlc3RzIG1xX3BlcmZfdGVzdHMKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9NYWtlZmlsZQppbmRleCA2MmYyMmNjLi5mYWM0NzgyIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9uZXQvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L01ha2VmaWxlCkBAIC0xLDYgKzEsNSBAQAogIyBNYWtlZmlsZSBmb3IgbmV0IHNlbGZ0ZXN0cwogCi1DQyA9ICQoQ1JPU1NfQ09NUElMRSlnY2MKIENGTEFHUyA9IC1XYWxsIC1PMiAtZwogCiBDRkxBR1MgKz0gLUkuLi8uLi8uLi8uLi91c3IvaW5jbHVkZS8KQEAgLTExLDkgKzEwLDEwIEBACiAlOiAlLmMKIAkkKENDKSAkKENGTEFHUykgLW8gJEAgJF4KIAotcnVuX3Rlc3RzOiBhbGwKLQlAL2Jpbi9zaCAuL3J1bl9uZXRzb2NrdGVzdHMgfHwgZWNobyAic29ja2V0dGVzdHM6IFtGQUlMXSIKLQlAL2Jpbi9zaCAuL3J1bl9hZnBhY2tldHRlc3RzIHx8IGVjaG8gImFmcGFja2V0dGVzdHM6IFtGQUlMXSIKLQkuL3Rlc3RfYnBmLnNoCitURVNUX1BST0dTIDo9IHJ1bl9uZXRzb2NrdGVzdHMgcnVuX2FmcGFja2V0dGVzdHMgdGVzdF9icGYuc2gKK1RFU1RfRklMRVMgOj0gJChORVRfUFJPR1MpCisKK2luY2x1ZGUgLi4vbGliLm1rCisKIGNsZWFuOgogCSQoUk0pICQoTkVUX1BST0dTKQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L3J1bl9hZnBhY2tldHRlc3RzIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L3J1bl9hZnBhY2tldHRlc3RzCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL25ldC9ydW5fbmV0c29ja3Rlc3RzIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvbmV0L3J1bl9uZXRzb2NrdGVzdHMKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggYTVkNWJlNy4uNWFkMDQyMyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9NYWtlZmlsZQorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL01ha2VmaWxlCkBAIC04LDEwICs4LDkgQEAKIAogR0lUX1ZFUlNJT04gPSAkKHNoZWxsIGdpdCBkZXNjcmliZSAtLWFsd2F5cyAtLWxvbmcgLS1kaXJ0eSB8fCBlY2hvICJ1bmtub3duIikKIAotQ0MgOj0gJChDUk9TU19DT01QSUxFKSQoQ0MpCiBDRkxBR1MgOj0gLVdhbGwgLU8yIC1mbHRvIC1XYWxsIC1XZXJyb3IgLURHSVRfVkVSU0lPTj0nIiQoR0lUX1ZFUlNJT04pIicgLUkkKENVUkRJUikgJChDRkxBR1MpCiAKLWV4cG9ydCBDQyBDRkxBR1MKK2V4cG9ydCBDRkxBR1MKIAogU1VCX0RJUlMgPSBwbXUgY29weWxvb3BzIG1tIHRtIHByaW1pdGl2ZXMgc3RyaW5nbG9vcHMgdnBobiBzd2l0Y2hfZW5kaWFuCiAKQEAgLTIyLDEwICsyMSwyNSBAQAogJChTVUJfRElSUyk6CiAJJChNQUtFKSAtayAtQyAkQCBhbGwKIAotcnVuX3Rlc3RzOiBhbGwKK2luY2x1ZGUgLi4vbGliLm1rCisKK292ZXJyaWRlIGRlZmluZSBSVU5fVEVTVFMKIAlAZm9yIFRBUkdFVCBpbiAkKFNVQl9ESVJTKTsgZG8gXAogCQkkKE1BS0UpIC1DICQkVEFSR0VUIHJ1bl90ZXN0czsgXAogCWRvbmU7CitlbmRlZgorCitvdmVycmlkZSBkZWZpbmUgSU5TVEFMTF9SVUxFCisJQGZvciBUQVJHRVQgaW4gJChTVUJfRElSUyk7IGRvIFwKKwkJJChNQUtFKSAtQyAkJFRBUkdFVCBpbnN0YWxsOyBcCisJZG9uZTsKK2VuZGVmCisKK292ZXJyaWRlIGRlZmluZSBFTUlUX1RFU1RTCisJQGZvciBUQVJHRVQgaW4gJChTVUJfRElSUyk7IGRvIFwKKwkJJChNQUtFKSAtcyAtQyAkJFRBUkdFVCBlbWl0X3Rlc3RzOyBcCisJZG9uZTsKK2VuZGVmCiAKIGNsZWFuOgogCUBmb3IgVEFSR0VUIGluICQoU1VCX0RJUlMpOyBkbyBcCkBAIC0zNiw0ICs1MCw0IEBACiB0YWdzOgogCWZpbmQgLiAtbmFtZSAnKi5jJyAtbyAtbmFtZSAnKi5oJyB8IHhhcmdzIGN0YWdzCiAKLS5QSE9OWTogYWxsIHJ1bl90ZXN0cyBjbGVhbiB0YWdzICQoU1VCX0RJUlMpCisuUEhPTlk6IHRhZ3MgJChTVUJfRElSUykKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvY29weWxvb3BzL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9jb3B5bG9vcHMvTWFrZWZpbGUKaW5kZXggOWRlODEyOS4uMzg0ODQzZSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9jb3B5bG9vcHMvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9jb3B5bG9vcHMvTWFrZWZpbGUKQEAgLTcsMjQgKzcsMTkgQEAKICMgVXNlIG91ciBDRkxBR1MgZm9yIHRoZSBpbXBsaWNpdCAuUyBydWxlCiBBU0ZMQUdTID0gJChDRkxBR1MpCiAKLVBST0dTIDo9IGNvcHl1c2VyXzY0IGNvcHl1c2VyX3Bvd2VyNyBtZW1jcHlfNjQgbWVtY3B5X3Bvd2VyNworVEVTVF9QUk9HUyA6PSBjb3B5dXNlcl82NCBjb3B5dXNlcl9wb3dlcjcgbWVtY3B5XzY0IG1lbWNweV9wb3dlcjcKIEVYVFJBX1NPVVJDRVMgOj0gdmFsaWRhdGUuYyAuLi9oYXJuZXNzLmMKIAotYWxsOiAkKFBST0dTKQorYWxsOiAkKFRFU1RfUFJPR1MpCiAKIGNvcHl1c2VyXzY0OiAgICAgQ1BQRkxBR1MgKz0gLUQgQ09QWV9MT09QPXRlc3RfX19jb3B5X3RvZnJvbV91c2VyX2Jhc2UKIGNvcHl1c2VyX3Bvd2VyNzogQ1BQRkxBR1MgKz0gLUQgQ09QWV9MT09QPXRlc3RfX19jb3B5X3RvZnJvbV91c2VyX3Bvd2VyNwogbWVtY3B5XzY0OiAgICAgICBDUFBGTEFHUyArPSAtRCBDT1BZX0xPT1A9dGVzdF9tZW1jcHkKIG1lbWNweV9wb3dlcjc6ICAgQ1BQRkxBR1MgKz0gLUQgQ09QWV9MT09QPXRlc3RfbWVtY3B5X3Bvd2VyNwogCi0kKFBST0dTKTogJChFWFRSQV9TT1VSQ0VTKQorJChURVNUX1BST0dTKTogJChFWFRSQV9TT1VSQ0VTKQogCi1ydW5fdGVzdHM6IGFsbAotCUAtZm9yIFBST0cgaW4gJChQUk9HUyk7IGRvIFwKLQkJLi8kJFBST0c7IFwKLQlkb25lOworaW5jbHVkZSAuLi8uLi9saWIubWsKIAogY2xlYW46Ci0Jcm0gLWYgJChQUk9HUykgKi5vCi0KLS5QSE9OWTogYWxsIHJ1bl90ZXN0cyBjbGVhbgorCXJtIC1mICQoVEVTVF9QUk9HUykgKi5vCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21tL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9tbS9NYWtlZmlsZQppbmRleCBhMTRjNTM4Li40MWNjM2VkIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21tL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvbW0vTWFrZWZpbGUKQEAgLTEsMjEgKzEsMTYgQEAKIG5vYXJnOgogCSQoTUFLRSkgLUMgLi4vCiAKLVBST0dTIDo9IGh1Z2V0bGJfdnNfdGhwX3Rlc3Qgc3VicGFnZV9wcm90CitURVNUX1BST0dTIDo9IGh1Z2V0bGJfdnNfdGhwX3Rlc3Qgc3VicGFnZV9wcm90CiAKLWFsbDogJChQUk9HUykgdGVtcGZpbGUKK2FsbDogJChURVNUX1BST0dTKSB0ZW1wZmlsZQogCi0kKFBST0dTKTogLi4vaGFybmVzcy5jCiskKFRFU1RfUFJPR1MpOiAuLi9oYXJuZXNzLmMKIAotcnVuX3Rlc3RzOiBhbGwKLQlALWZvciBQUk9HIGluICQoUFJPR1MpOyBkbyBcCi0JCS4vJCRQUk9HOyBcCi0JZG9uZTsKK2luY2x1ZGUgLi4vLi4vbGliLm1rCiAKIHRlbXBmaWxlOgogCWRkIGlmPS9kZXYvemVybyBvZj10ZW1wZmlsZSBicz02NGsgY291bnQ9MQogCiBjbGVhbjoKLQlybSAtZiAkKFBST0dTKSB0ZW1wZmlsZQotCi0uUEhPTlk6IGFsbCBydW5fdGVzdHMgY2xlYW4KKwlybSAtZiAkKFRFU1RfUFJPR1MpIHRlbXBmaWxlCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL21tL2h1Z2V0bGJfdnNfdGhwX3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvbW0vaHVnZXRsYl92c190aHBfdGVzdC5jCmluZGV4IDNkOGU1YjAuLjQ5MDAzNjcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvbW0vaHVnZXRsYl92c190aHBfdGVzdC5jCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvbW0vaHVnZXRsYl92c190aHBfdGVzdC5jCkBAIC0yMSw5ICsyMSwxMyBAQAogCQkgKiBUeXBpY2FsbHkgdGhlIG1tYXAgd2lsbCBmYWlsIGJlY2F1c2Ugbm8gaHVnZSBwYWdlcyBhcmUKIAkJICogYWxsb2NhdGVkIG9uIHRoZSBzeXN0ZW0uIEJ1dCBpZiB0aGVyZSBhcmUgaHVnZSBwYWdlcwogCQkgKiBhbGxvY2F0ZWQgdGhlIG1tYXAgd2lsbCBzdWNjZWVkLiBUaGF0J3MgZmluZSB0b28sIHdlIGp1c3QKLQkJICogbXVubWFwIGhlcmUgYmVmb3JlIGNvbnRpbnVpbmcuCisJCSAqIG11bm1hcCBoZXJlIGJlZm9yZSBjb250aW51aW5nLiAgbXVubWFwKCkgbGVuZ3RoIG9mCisJCSAqIE1BUF9IVUdFVExCIG1lbW9yeSBtdXN0IGJlIGh1Z2VwYWdlIGFsaWduZWQuCiAJCSAqLwotCQltdW5tYXAoYWRkciwgU0laRSk7CisJCWlmIChtdW5tYXAoYWRkciwgU0laRSkpIHsKKwkJCXBlcnJvcigibXVubWFwIik7CisJCQlyZXR1cm4gMTsKKwkJfQogCX0KIAogCXAgPSBtbWFwKGFkZHIsIFNJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L01ha2VmaWxlCmluZGV4IGM5ZjQyNjMuLjVhMTYxMTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L01ha2VmaWxlCkBAIC0xLDM4ICsxLDQyIEBACiBub2FyZzoKIAkkKE1BS0UpIC1DIC4uLwogCi1QUk9HUyA6PSBjb3VudF9pbnN0cnVjdGlvbnMgbDNfYmFua190ZXN0IHBlcl9ldmVudF9leGNsdWRlcworVEVTVF9QUk9HUyA6PSBjb3VudF9pbnN0cnVjdGlvbnMgbDNfYmFua190ZXN0IHBlcl9ldmVudF9leGNsdWRlcwogRVhUUkFfU09VUkNFUyA6PSAuLi9oYXJuZXNzLmMgZXZlbnQuYyBsaWIuYwogCi1TVUJfVEFSR0VUUyA9IGViYgorYWxsOiAkKFRFU1RfUFJPR1MpIGViYgogCi1hbGw6ICQoUFJPR1MpICQoU1VCX1RBUkdFVFMpCi0KLSQoUFJPR1MpOiAkKEVYVFJBX1NPVVJDRVMpCiskKFRFU1RfUFJPR1MpOiAkKEVYVFJBX1NPVVJDRVMpCiAKICMgbG9vcC5TIGNhbiBvbmx5IGJlIGJ1aWx0IDY0LWJpdAogY291bnRfaW5zdHJ1Y3Rpb25zOiBsb29wLlMgY291bnRfaW5zdHJ1Y3Rpb25zLmMgJChFWFRSQV9TT1VSQ0VTKQogCSQoQ0MpICQoQ0ZMQUdTKSAtbTY0IC1vICRAICReCiAKLXJ1bl90ZXN0czogYWxsIHN1Yl9ydW5fdGVzdHMKLQlALWZvciBQUk9HIGluICQoUFJPR1MpOyBkbyBcCi0JCS4vJCRQUk9HOyBcCi0JZG9uZTsKK2luY2x1ZGUgLi4vLi4vbGliLm1rCiAKLWNsZWFuOiBzdWJfY2xlYW4KLQlybSAtZiAkKFBST0dTKSBsb29wLm8KK0RFRkFVTFRfUlVOX1RFU1RTIDo9ICQoUlVOX1RFU1RTKQorb3ZlcnJpZGUgZGVmaW5lIFJVTl9URVNUUworCSQoREVGQVVMVF9SVU5fVEVTVFMpCisJJChNQUtFKSAtQyBlYmIgcnVuX3Rlc3RzCitlbmRlZgogCi0kKFNVQl9UQVJHRVRTKToKK0RFRkFVTFRfRU1JVF9URVNUUyA6PSAkKEVNSVRfVEVTVFMpCitvdmVycmlkZSBkZWZpbmUgRU1JVF9URVNUUworCSQoREVGQVVMVF9FTUlUX1RFU1RTKQorCSQoTUFLRSkgLXMgLUMgZWJiIGVtaXRfdGVzdHMKK2VuZGVmCisKK0RFRkFVTFRfSU5TVEFMTCA6PSAkKElOU1RBTExfUlVMRSkKK292ZXJyaWRlIGRlZmluZSBJTlNUQUxMX1JVTEUKKwkkKERFRkFVTFRfSU5TVEFMTF9SVUxFKQorCSQoTUFLRSkgLUMgZWJiIGluc3RhbGwKK2VuZGVmCisKK2NsZWFuOgorCXJtIC1mICQoVEVTVF9QUk9HUykgbG9vcC5vCisJJChNQUtFKSAtQyBlYmIgY2xlYW4KKworZWJiOgogCSQoTUFLRSkgLWsgLUMgJEAgYWxsCiAKLXN1Yl9ydW5fdGVzdHM6IGFsbAotCUBmb3IgVEFSR0VUIGluICQoU1VCX1RBUkdFVFMpOyBkbyBcCi0JCSQoTUFLRSkgLUMgJCRUQVJHRVQgcnVuX3Rlc3RzOyBcCi0JZG9uZTsKLQotc3ViX2NsZWFuOgotCUBmb3IgVEFSR0VUIGluICQoU1VCX1RBUkdFVFMpOyBkbyBcCi0JCSQoTUFLRSkgLUMgJCRUQVJHRVQgY2xlYW47IFwKLQlkb25lOwotCi0uUEhPTlk6IGFsbCBydW5fdGVzdHMgY2xlYW4gc3ViX3J1bl90ZXN0cyBzdWJfY2xlYW4gJChTVUJfVEFSR0VUUykKKy5QSE9OWTogYWxsIHJ1bl90ZXN0cyBjbGVhbiBlYmIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcG11L2ViYi9NYWtlZmlsZQppbmRleCAzZGM0MzMyLi41Y2RjOWRiIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3BtdS9lYmIvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wbXUvZWJiL01ha2VmaWxlCkBAIC00LDcgKzQsNyBAQAogIyBUaGUgRUJCIGhhbmRsZXIgaXMgNjQtYml0IGNvZGUgYW5kIGV2ZXJ5dGhpbmcgbGlua3MgYWdhaW5zdCBpdAogQ0ZMQUdTICs9IC1tNjQKIAotUFJPR1MgOj0gcmVnX2FjY2Vzc190ZXN0IGV2ZW50X2F0dHJpYnV0ZXNfdGVzdCBjeWNsZXNfdGVzdAlcCitURVNUX1BST0dTIDo9IHJlZ19hY2Nlc3NfdGVzdCBldmVudF9hdHRyaWJ1dGVzX3Rlc3QgY3ljbGVzX3Rlc3QJXAogCSBjeWNsZXNfd2l0aF9mcmVlemVfdGVzdCBwbWM1Nl9vdmVyZmxvd190ZXN0CQlcCiAJIGViYl92c19jcHVfZXZlbnRfdGVzdCBjcHVfZXZlbnRfdnNfZWJiX3Rlc3QJCVwKIAkgY3B1X2V2ZW50X3Bpbm5lZF92c19lYmJfdGVzdCB0YXNrX2V2ZW50X3ZzX2ViYl90ZXN0CVwKQEAgLTE2LDE4ICsxNiwxNSBAQAogCSBsb3N0X2V4Y2VwdGlvbl90ZXN0IG5vX2hhbmRsZXJfdGVzdAkJCVwKIAkgY3ljbGVzX3dpdGhfbW1jcjJfdGVzdAogCi1hbGw6ICQoUFJPR1MpCithbGw6ICQoVEVTVF9QUk9HUykKIAotJChQUk9HUyk6IC4uLy4uL2hhcm5lc3MuYyAuLi9ldmVudC5jIC4uL2xpYi5jIGViYi5jIGViYl9oYW5kbGVyLlMgdHJhY2UuYyBidXN5X2xvb3AuUworJChURVNUX1BST0dTKTogLi4vLi4vaGFybmVzcy5jIC4uL2V2ZW50LmMgLi4vbGliLmMgZWJiLmMgZWJiX2hhbmRsZXIuUyB0cmFjZS5jIGJ1c3lfbG9vcC5TCiAKIGluc3RydWN0aW9uX2NvdW50X3Rlc3Q6IC4uL2xvb3AuUwogCiBsb3N0X2V4Y2VwdGlvbl90ZXN0OiAuLi9saWIuYwogCi1ydW5fdGVzdHM6IGFsbAotCUAtZm9yIFBST0cgaW4gJChQUk9HUyk7IGRvIFwKLQkJLi8kJFBST0c7IFwKLQlkb25lOworaW5jbHVkZSAuLi8uLi8uLi9saWIubWsKIAogY2xlYW46Ci0Jcm0gLWYgJChQUk9HUykKKwlybSAtZiAkKFRFU1RfUFJPR1MpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3ByaW1pdGl2ZXMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3ByaW1pdGl2ZXMvTWFrZWZpbGUKaW5kZXggZWE3MzdjYS4uYjY4YzYyMiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9wcmltaXRpdmVzL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvcHJpbWl0aXZlcy9NYWtlZmlsZQpAQCAtMSwxNyArMSwxMiBAQAogQ0ZMQUdTICs9IC1JJChDVVJESVIpCiAKLVBST0dTIDo9IGxvYWRfdW5hbGlnbmVkX3plcm9wYWQKK1RFU1RfUFJPR1MgOj0gbG9hZF91bmFsaWduZWRfemVyb3BhZAogCi1hbGw6ICQoUFJPR1MpCithbGw6ICQoVEVTVF9QUk9HUykKIAotJChQUk9HUyk6IC4uL2hhcm5lc3MuYworJChURVNUX1BST0dTKTogLi4vaGFybmVzcy5jCiAKLXJ1bl90ZXN0czogYWxsCi0JQC1mb3IgUFJPRyBpbiAkKFBST0dTKTsgZG8gXAotCQkuLyQkUFJPRzsgXAotCWRvbmU7CitpbmNsdWRlIC4uLy4uL2xpYi5tawogCiBjbGVhbjoKLQlybSAtZiAkKFBST0dTKSAqLm8KLQotLlBIT05ZOiBhbGwgcnVuX3Rlc3RzIGNsZWFuCisJcm0gLWYgJChURVNUX1BST0dTKSAqLm8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc3RyaW5nbG9vcHMvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3N0cmluZ2xvb3BzL01ha2VmaWxlCmluZGV4IDUwNmQ3NzMuLjJhNzI4ZjQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvc3RyaW5nbG9vcHMvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy9zdHJpbmdsb29wcy9NYWtlZmlsZQpAQCAtMiwxOSArMiwxNCBAQAogQ0ZMQUdTICs9IC1tNjQKIENGTEFHUyArPSAtSSQoQ1VSRElSKQogCi1QUk9HUyA6PSBtZW1jbXAKK1RFU1RfUFJPR1MgOj0gbWVtY21wCiBFWFRSQV9TT1VSQ0VTIDo9IG1lbWNtcF82NC5TIC4uL2hhcm5lc3MuYwogCi1hbGw6ICQoUFJPR1MpCithbGw6ICQoVEVTVF9QUk9HUykKIAotJChQUk9HUyk6ICQoRVhUUkFfU09VUkNFUykKKyQoVEVTVF9QUk9HUyk6ICQoRVhUUkFfU09VUkNFUykKIAotcnVuX3Rlc3RzOiBhbGwKLQlALWZvciBQUk9HIGluICQoUFJPR1MpOyBkbyBcCi0JCS4vJCRQUk9HOyBcCi0JZG9uZTsKK2luY2x1ZGUgLi4vLi4vbGliLm1rCiAKIGNsZWFuOgotCXJtIC1mICQoUFJPR1MpICoubwotCi0uUEhPTlk6IGFsbCBydW5fdGVzdHMgY2xlYW4KKwlybSAtZiAkKFRFU1RfUFJPR1MpICoubwpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy90bS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3Bvd2VycGMvdG0vTWFrZWZpbGUKaW5kZXggMTIyY2YxOC4uMWI2MTZmYSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcG93ZXJwYy90bS9NYWtlZmlsZQorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wb3dlcnBjL3RtL01ha2VmaWxlCkBAIC0xLDE4ICsxLDEzIEBACi1QUk9HUyA6PSB0bS1yZXNjaGVkLWRzY3IgdG0tc3lzY2FsbAorVEVTVF9QUk9HUyA6PSB0bS1yZXNjaGVkLWRzY3IgdG0tc3lzY2FsbAogCi1hbGw6ICQoUFJPR1MpCithbGw6ICQoVEVTVF9QUk9HUykKIAotJChQUk9HUyk6IC4uL2hhcm5lc3MuYworJChURVNUX1BST0dTKTogLi4vaGFybmVzcy5jCiAKIHRtLXN5c2NhbGw6IHRtLXN5c2NhbGwtYXNtLlMKIHRtLXN5c2NhbGw6IENGTEFHUyArPSAtbWh0bQogCi1ydW5fdGVzdHM6IGFsbAotCUAtZm9yIFBST0cgaW4gJChQUk9HUyk7IGRvIFwKLQkJLi8kJFBST0c7IFwKLQlkb25lOworaW5jbHVkZSAuLi8uLi9saWIubWsKIAogY2xlYW46Ci0Jcm0gLWYgJChQUk9HUykgKi5vCi0KLS5QSE9OWTogYWxsIHJ1bl90ZXN0cyBjbGVhbgorCXJtIC1mICQoVEVTVF9QUk9HUykgKi5vCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wdHJhY2UvTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9wdHJhY2UvTWFrZWZpbGUKaW5kZXggNDdhZTJkMy4uNDUzOTI3ZiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcHRyYWNlL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3B0cmFjZS9NYWtlZmlsZQpAQCAtNiw1ICs2LDYgQEAKIGNsZWFuOgogCXJtIC1mIHBlZWtzaWdpbmZvCiAKLXJ1bl90ZXN0czogYWxsCi0JQC4vcGVla3NpZ2luZm8gfHwgZWNobyAicGVla3NpZ2luZm8gc2VsZnRlc3RzOiBbRkFJTF0iCitURVNUX1BST0dTIDo9IHBlZWtzaWdpbmZvCisKK2luY2x1ZGUgLi4vbGliLm1rCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0uc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2Jpbi9rdm0uc2gKaW5kZXggMzY4ZDY0YS4uZGQyODEyYyAxMDA3NTUKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9iaW4va3ZtLnNoCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvYmluL2t2bS5zaApAQCAtMzEwLDcgKzMxMCw3IEBACiAJCQljZnJbam5dID0gY2Zbal0gIi4iIGNmcmVwW2NmW2pdXTsKIAkJfQogCQlpZiAoY3B1c3Jbam5dID4gbmNwdXMgJiYgbmNwdXMgIT0gMCkKLQkJCW92ZiA9ICIoISkiOworCQkJb3ZmID0gIi1vdmYiOwogCQllbHNlCiAJCQlvdmYgPSAiIjsKIAkJcHJpbnQgImVjaG8gIiwgY2ZyW2puXSwgY3B1c3Jbam5dIG92ZiAiOiBTdGFydGluZyBidWlsZC4gYGRhdGVgIjsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvQ0Zjb21tb24gYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9yY3V0b3J0dXJlL2NvbmZpZ3MvcmN1L0NGY29tbW9uCmluZGV4IGQyZDJhODYuLjQ5NzAxMjEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3JjdXRvcnR1cmUvY29uZmlncy9yY3UvQ0Zjb21tb24KKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvcmN1dG9ydHVyZS9jb25maWdzL3JjdS9DRmNvbW1vbgpAQCAtMSwyICsxLDMgQEAKIENPTkZJR19SQ1VfVE9SVFVSRV9URVNUPXkKIENPTkZJR19QUklOVEtfVElNRT15CitDT05GSUdfUkNVX1RPUlRVUkVfVEVTVF9TTE9XX0lOSVQ9eQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc2l6ZS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3NpemUvTWFrZWZpbGUKaW5kZXggMDRkYzI1ZS4uYmJkMGI1MyAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc2l6ZS9NYWtlZmlsZQorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zaXplL01ha2VmaWxlCkBAIC0xLDEyICsxLDExIEBACi1DQyA9ICQoQ1JPU1NfQ09NUElMRSlnY2MKLQogYWxsOiBnZXRfc2l6ZQogCiBnZXRfc2l6ZTogZ2V0X3NpemUuYwogCSQoQ0MpIC1zdGF0aWMgLWZmcmVlc3RhbmRpbmcgLW5vc3RhcnRmaWxlcyAtcyAkPCAtbyAkQAogCi1ydW5fdGVzdHM6IGFsbAotCS4vZ2V0X3NpemUKK1RFU1RfUFJPR1MgOj0gZ2V0X3NpemUKKworaW5jbHVkZSAuLi9saWIubWsKIAogY2xlYW46CiAJJChSTSkgZ2V0X3NpemUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9NYWtlZmlsZQppbmRleCAwYTkyYWRhLi5iM2MzM2UwIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvc3lzY3RsL01ha2VmaWxlCkBAIC00LDE2ICs0LDEwIEBACiAjIE5vIGJpbmFyaWVzLCBidXQgbWFrZSBzdXJlIGFyZy1sZXNzICJtYWtlIiBkb2Vzbid0IHRyaWdnZXIgInJ1bl90ZXN0cyIuCiBhbGw6CiAKLSMgQWxsb3cgc3BlY2lmaWMgdGVzdHMgdG8gYmUgc2VsZWN0ZWQuCi10ZXN0X251bToKLQlAL2Jpbi9zaCAuL3J1bl9udW1lcmljdGVzdHMKK1RFU1RfUFJPR1MgOj0gcnVuX251bWVyaWN0ZXN0cyBydW5fc3RyaW5ndGVzdHMKK1RFU1RfRklMRVMgOj0gY29tbW9uX3Rlc3RzCiAKLXRlc3Rfc3RyaW5nOgotCUAvYmluL3NoIC4vcnVuX3N0cmluZ3Rlc3RzCi0KLXJ1bl90ZXN0czogYWxsIHRlc3RfbnVtIHRlc3Rfc3RyaW5nCitpbmNsdWRlIC4uL2xpYi5tawogCiAjIE5vdGhpbmcgdG8gY2xlYW4gdXAuCiBjbGVhbjoKLQotLlBIT05ZOiBhbGwgcnVuX3Rlc3RzIGNsZWFuIHRlc3RfbnVtIHRlc3Rfc3RyaW5nCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvcnVuX251bWVyaWN0ZXN0cyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9ydW5fbnVtZXJpY3Rlc3RzCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3N5c2N0bC9ydW5fc3RyaW5ndGVzdHMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9zeXNjdGwvcnVuX3N0cmluZ3Rlc3RzCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9NYWtlZmlsZQppbmRleCBlYjI4NTlmLi44OWEzZjQ0IDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvTWFrZWZpbGUKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL01ha2VmaWxlCkBAIC0xLDggKzEsMzYgQEAKLWFsbDoKLQlnY2MgcG9zaXhfdGltZXJzLmMgLW8gcG9zaXhfdGltZXJzIC1scnQKK0NDID0gJChDUk9TU19DT01QSUxFKWdjYworQlVJTERfRkxBR1MgPSAtREtURVNUCitDRkxBR1MgKz0gLU8zIC1XbCwtbm8tYXMtbmVlZGVkIC1XYWxsICQoQlVJTERfRkxBR1MpCitMREZMQUdTICs9IC1scnQgLWxwdGhyZWFkCiAKLXJ1bl90ZXN0czogYWxsCi0JLi9wb3NpeF90aW1lcnMKKyMgdGhlc2UgYXJlIGFsbCAic2FmZSIgdGVzdHMgdGhhdCBkb24ndCBtb2RpZnkKKyMgc3lzdGVtIHRpbWUgb3IgcmVxdWlyZSBlc2NhbGF0ZWQgcHJpdmxlZGdlcworVEVTVF9QUk9HUyA9IHBvc2l4X3RpbWVycyBuYW5vc2xlZXAgbnNsZWVwLWxhdCBzZXQtdGltZXItbGF0IG1xdWV1ZS1sYXQgXAorCSAgICAgaW5jb25zaXN0ZW5jeS1jaGVjayByYXdfc2tldyB0aHJlYWR0ZXN0IHJ0Y3Rlc3QKKworVEVTVF9QUk9HU19FWFRFTkRFRCA9IGFsYXJtdGltZXItc3VzcGVuZCB2YWxpZC1hZGp0aW1leCBjaGFuZ2Vfc2tldyBcCisJCSAgICAgIHNrZXdfY29uc2lzdGVuY3kgY2xvY2tzb3VyY2Utc3dpdGNoIGxlYXAtYS1kYXkgXAorCQkgICAgICBsZWFwY3Jhc2ggc2V0LXRhaSBzZXQtMjAzOAorCitiaW5zID0gJChURVNUX1BST0dTKSAkKFRFU1RfUFJPR1NfRVhURU5ERUQpCisKK2FsbDogJHtiaW5zfQorCitpbmNsdWRlIC4uL2xpYi5taworCisjIHRoZXNlIHRlc3RzIHJlcXVpcmUgZXNjYWxhdGVkIHByaXZsZWRnZXMKKyMgYW5kIG1heSBtb2RpZnkgdGhlIHN5c3RlbSB0aW1lIG9yIHRyaWdnZXIKKyMgb3RoZXIgYmVoYXZpb3IgbGlrZSBzdXNwZW5kCitydW5fZGVzdHJ1Y3RpdmVfdGVzdHM6IHJ1bl90ZXN0cworCS4vYWxhcm10aW1lci1zdXNwZW5kCisJLi92YWxpZC1hZGp0aW1leAorCS4vY2hhbmdlX3NrZXcKKwkuL3NrZXdfY29uc2lzdGVuY3kKKwkuL2Nsb2Nrc291cmNlLXN3aXRjaAorCS4vbGVhcC1hLWRheSAtcyAtaSAxMAorCS4vbGVhcGNyYXNoCisJLi9zZXQtdGFpCisJLi9zZXQtMjAzOAogCiBjbGVhbjoKLQlybSAtZiAuL3Bvc2l4X3RpbWVycworCXJtIC1mICR7Ymluc30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9hbGFybXRpbWVyLXN1c3BlbmQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9hbGFybXRpbWVyLXN1c3BlbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWZmYmRlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL2FsYXJtdGltZXItc3VzcGVuZC5jCkBAIC0wLDAgKzEsMTg1IEBACisvKiBhbGFybXRpbWVyIHN1c3BlbmQgdGVzdAorICoJCUpvaG4gU3R1bHR6IChqb2huLnN0dWx0ekBsaW5hcm8ub3JnKQorICogICAgICAgICAgICAgIChDKSBDb3B5cmlnaHQgTGluYXJvIDIwMTMKKyAqICAgICAgICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKiAgIFRoaXMgdGVzdCBtYWtlcyBzdXJlIHRoZSBhbGFybXRpbWVyICYgUlRDIHdha2V1cCBjb2RlIGlzCisgKiAgIGZ1bmN0aW9uaW5nLgorICoKKyAqICBUbyBidWlsZDoKKyAqCSQgZ2NjIGFsYXJtdGltZXItc3VzcGVuZC5jIC1vIGFsYXJtdGltZXItc3VzcGVuZCAtbHJ0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaWZkZWYgS1RFU1QKKyNpbmNsdWRlICIuLi9rc2VsZnRlc3QuaCIKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfcGFzcyh2b2lkKQoreworCWV4aXQoMCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfZmFpbCh2b2lkKQoreworCWV4aXQoMSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBDTE9DS19SRUFMVElNRQkJCTAKKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDCQkJMQorI2RlZmluZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQJMgorI2RlZmluZSBDTE9DS19USFJFQURfQ1BVVElNRV9JRAkJMworI2RlZmluZSBDTE9DS19NT05PVE9OSUNfUkFXCQk0CisjZGVmaW5lIENMT0NLX1JFQUxUSU1FX0NPQVJTRQkJNQorI2RlZmluZSBDTE9DS19NT05PVE9OSUNfQ09BUlNFCQk2CisjZGVmaW5lIENMT0NLX0JPT1RUSU1FCQkJNworI2RlZmluZSBDTE9DS19SRUFMVElNRV9BTEFSTQkJOAorI2RlZmluZSBDTE9DS19CT09UVElNRV9BTEFSTQkJOQorI2RlZmluZSBDTE9DS19IV1NQRUNJRklDCQkxMAorI2RlZmluZSBDTE9DS19UQUkJCQkxMQorI2RlZmluZSBOUl9DTE9DS0lEUwkJCTEyCisKKworI2RlZmluZSBOU0VDX1BFUl9TRUMgMTAwMDAwMDAwMFVMTAorI2RlZmluZSBVTlJFQVNPTkFCTEVfTEFUIChOU0VDX1BFUl9TRUMgKiA0KSAvKiBob3BlZnVsbHkgd2UgcmVzdW1lIGluIDRzZWNzICovCisKKyNkZWZpbmUgU1VTUEVORF9TRUNTIDE1CitpbnQgYWxhcm1jb3VudDsKK2ludCBhbGFybV9jbG9ja19pZDsKK3N0cnVjdCB0aW1lc3BlYyBzdGFydF90aW1lOworCisKK2NoYXIgKmNsb2Nrc3RyaW5nKGludCBjbG9ja2lkKQoreworCXN3aXRjaCAoY2xvY2tpZCkgeworCWNhc2UgQ0xPQ0tfUkVBTFRJTUU6CisJCXJldHVybiAiQ0xPQ0tfUkVBTFRJTUUiOworCWNhc2UgQ0xPQ0tfTU9OT1RPTklDOgorCQlyZXR1cm4gIkNMT0NLX01PTk9UT05JQyI7CisJY2FzZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQ6CisJCXJldHVybiAiQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEIjsKKwljYXNlIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEOgorCQlyZXR1cm4gIkNMT0NLX1RIUkVBRF9DUFVUSU1FX0lEIjsKKwljYXNlIENMT0NLX01PTk9UT05JQ19SQVc6CisJCXJldHVybiAiQ0xPQ0tfTU9OT1RPTklDX1JBVyI7CisJY2FzZSBDTE9DS19SRUFMVElNRV9DT0FSU0U6CisJCXJldHVybiAiQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFIjsKKwljYXNlIENMT0NLX01PTk9UT05JQ19DT0FSU0U6CisJCXJldHVybiAiQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRSI7CisJY2FzZSBDTE9DS19CT09UVElNRToKKwkJcmV0dXJuICJDTE9DS19CT09UVElNRSI7CisJY2FzZSBDTE9DS19SRUFMVElNRV9BTEFSTToKKwkJcmV0dXJuICJDTE9DS19SRUFMVElNRV9BTEFSTSI7CisJY2FzZSBDTE9DS19CT09UVElNRV9BTEFSTToKKwkJcmV0dXJuICJDTE9DS19CT09UVElNRV9BTEFSTSI7CisJY2FzZSBDTE9DS19UQUk6CisJCXJldHVybiAiQ0xPQ0tfVEFJIjsKKwl9OworCXJldHVybiAiVU5LTk9XTl9DTE9DS0lEIjsKK30KKworCitsb25nIGxvbmcgdGltZXNwZWNfc3ViKHN0cnVjdCB0aW1lc3BlYyBhLCBzdHJ1Y3QgdGltZXNwZWMgYikKK3sKKwlsb25nIGxvbmcgcmV0ID0gTlNFQ19QRVJfU0VDICogYi50dl9zZWMgKyBiLnR2X25zZWM7CisKKwlyZXQgLT0gTlNFQ19QRVJfU0VDICogYS50dl9zZWMgKyBhLnR2X25zZWM7CisJcmV0dXJuIHJldDsKK30KKworaW50IGZpbmFsX3JldCA9IDA7CisKK3ZvaWQgc2lnYWxhcm0oaW50IHNpZ25vKQoreworCWxvbmcgbG9uZyBkZWx0YV9uczsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKwljbG9ja19nZXR0aW1lKGFsYXJtX2Nsb2NrX2lkLCAmdHMpOworCWFsYXJtY291bnQrKzsKKworCWRlbHRhX25zID0gdGltZXNwZWNfc3ViKHN0YXJ0X3RpbWUsIHRzKTsKKwlkZWx0YV9ucyAtPSBOU0VDX1BFUl9TRUMgKiBTVVNQRU5EX1NFQ1MgKiBhbGFybWNvdW50OworCisJcHJpbnRmKCJBTEFSTSglaSk6ICVsZDolbGQgbGF0ZW5jeTogJWxsZCBucyAiLCBhbGFybWNvdW50LCB0cy50dl9zZWMsCisJCQkJCQkJdHMudHZfbnNlYywgZGVsdGFfbnMpOworCisJaWYgKGRlbHRhX25zID4gVU5SRUFTT05BQkxFX0xBVCkgeworCQlwcmludGYoIltGQUlMXVxuIik7CisJCWZpbmFsX3JldCA9IC0xOworCX0gZWxzZQorCQlwcmludGYoIltPS11cbiIpOworCit9CisKK2ludCBtYWluKHZvaWQpCit7CisJdGltZXJfdCB0bTE7CisJc3RydWN0IGl0aW1lcnNwZWMgaXRzMSwgaXRzMjsKKwlzdHJ1Y3Qgc2lnZXZlbnQgc2U7CisJc3RydWN0IHNpZ2FjdGlvbiBhY3Q7CisJaW50IHNpZ251bSA9IFNJR1JUTUFYOworCisJLyogU2V0IHVwIHNpZ25hbCBoYW5kbGVyOiAqLworCXNpZ2ZpbGxzZXQoJmFjdC5zYV9tYXNrKTsKKwlhY3Quc2FfZmxhZ3MgPSAwOworCWFjdC5zYV9oYW5kbGVyID0gc2lnYWxhcm07CisJc2lnYWN0aW9uKHNpZ251bSwgJmFjdCwgTlVMTCk7CisKKwkvKiBTZXQgdXAgdGltZXI6ICovCisJbWVtc2V0KCZzZSwgMCwgc2l6ZW9mKHNlKSk7CisJc2Uuc2lnZXZfbm90aWZ5ID0gU0lHRVZfU0lHTkFMOworCXNlLnNpZ2V2X3NpZ25vID0gc2lnbnVtOworCXNlLnNpZ2V2X3ZhbHVlLnNpdmFsX2ludCA9IDA7CisKKwlmb3IgKGFsYXJtX2Nsb2NrX2lkID0gQ0xPQ0tfUkVBTFRJTUVfQUxBUk07CisJCQlhbGFybV9jbG9ja19pZCA8PSBDTE9DS19CT09UVElNRV9BTEFSTTsKKwkJCWFsYXJtX2Nsb2NrX2lkKyspIHsKKworCQlhbGFybWNvdW50ID0gMDsKKwkJdGltZXJfY3JlYXRlKGFsYXJtX2Nsb2NrX2lkLCAmc2UsICZ0bTEpOworCisJCWNsb2NrX2dldHRpbWUoYWxhcm1fY2xvY2tfaWQsICZzdGFydF90aW1lKTsKKwkJcHJpbnRmKCJTdGFydCB0aW1lICglcyk6ICVsZDolbGRcbiIsIGNsb2Nrc3RyaW5nKGFsYXJtX2Nsb2NrX2lkKSwKKwkJCQlzdGFydF90aW1lLnR2X3NlYywgc3RhcnRfdGltZS50dl9uc2VjKTsKKwkJcHJpbnRmKCJTZXR0aW5nIGFsYXJtIGZvciBldmVyeSAlaSBzZWNvbmRzXG4iLCBTVVNQRU5EX1NFQ1MpOworCQlpdHMxLml0X3ZhbHVlID0gc3RhcnRfdGltZTsKKwkJaXRzMS5pdF92YWx1ZS50dl9zZWMgKz0gU1VTUEVORF9TRUNTOworCQlpdHMxLml0X2ludGVydmFsLnR2X3NlYyA9IFNVU1BFTkRfU0VDUzsKKwkJaXRzMS5pdF9pbnRlcnZhbC50dl9uc2VjID0gMDsKKworCQl0aW1lcl9zZXR0aW1lKHRtMSwgVElNRVJfQUJTVElNRSwgJml0czEsICZpdHMyKTsKKworCQl3aGlsZSAoYWxhcm1jb3VudCA8IDUpCisJCQlzbGVlcCgxKTsgLyogRmlyc3QgNSBhbGFybXMsIGRvIG5vdGhpbmcgKi8KKworCQlwcmludGYoIlN0YXJ0aW5nIHN1c3BlbmQgbG9vcHNcbiIpOworCQl3aGlsZSAoYWxhcm1jb3VudCA8IDEwKSB7CisJCQlpbnQgcmV0OworCisJCQlzbGVlcCgxKTsKKwkJCXJldCA9IHN5c3RlbSgiZWNobyBtZW0gPiAvc3lzL3Bvd2VyL3N0YXRlIik7CisJCQlpZiAocmV0KQorCQkJCWJyZWFrOworCQl9CisJCXRpbWVyX2RlbGV0ZSh0bTEpOworCX0KKwlpZiAoZmluYWxfcmV0KQorCQlyZXR1cm4ga3NmdF9leGl0X2ZhaWwoKTsKKwlyZXR1cm4ga3NmdF9leGl0X3Bhc3MoKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9jaGFuZ2Vfc2tldy5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL2NoYW5nZV9za2V3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IxOTY4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9jaGFuZ2Vfc2tldy5jCkBAIC0wLDAgKzEsMTA3IEBACisvKiBBREpfRlJFUSBTa2V3IGNoYW5nZSB0ZXN0CisgKgkJYnk6IGpvaG4gc3R1bHR6IChqb2huc3R1bEB1cy5pYm0uY29tKQorICoJCShDKSBDb3B5cmlnaHQgSUJNIDIwMTIKKyAqCQlMaWNlbnNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKiAgTk9URTogVGhpcyBpcyBhIG1ldGEtdGVzdCB3aGljaCBjcmFua3MgdGhlIEFESl9GUkVRIGtub2IgYW5kCisgKiAgdGhlbiB1c2VzIG90aGVyIHRlc3RzIHRvIGRldGVjdCBwcm9ibGVtcy4gVGh1cyB0aGlzIHRlc3QgcmVxdWlyZXMKKyAqICB0aGF0IHRoZSByYXdfc2tldywgaW5jb25zaXN0ZW5jeS1jaGVjayBhbmQgbmFub3NsZWVwIHRlc3RzIGJlCisgKiAgcHJlc2VudCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgaXQgaXMgcnVuIGZyb20uCisgKgorICogIFRvIGJ1aWxkOgorICoJJCBnY2MgY2hhbmdlX3NrZXcuYyAtbyBjaGFuZ2Vfc2tldyAtbHJ0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWV4Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2lmZGVmIEtURVNUCisjaW5jbHVkZSAiLi4va3NlbGZ0ZXN0LmgiCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQga3NmdF9leGl0X3Bhc3Modm9pZCkKK3sKKwlleGl0KDApOworfQorc3RhdGljIGlubGluZSBpbnQga3NmdF9leGl0X2ZhaWwodm9pZCkKK3sKKwlleGl0KDEpOworfQorI2VuZGlmCisKKyNkZWZpbmUgTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDBMTAorCisKK2ludCBjaGFuZ2Vfc2tld190ZXN0KGludCBwcG0pCit7CisJc3RydWN0IHRpbWV4IHR4OworCWludCByZXQ7CisKKwl0eC5tb2RlcyA9IEFESl9GUkVRVUVOQ1k7CisJdHguZnJlcSA9IHBwbSA8PCAxNjsKKworCXJldCA9IGFkanRpbWV4KCZ0eCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRmKCJFcnJvciBhZGp1c3RpbmcgZnJlcVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gc3lzdGVtKCIuL3Jhd19za2V3Iik7CisJcmV0IHw9IHN5c3RlbSgiLi9pbmNvbnNpc3RlbmN5LWNoZWNrIik7CisJcmV0IHw9IHN5c3RlbSgiLi9uYW5vc2xlZXAiKTsKKworCXJldHVybiByZXQ7Cit9CisKKworaW50IG1haW4oaW50IGFyZ3YsIGNoYXIgKiphcmdjKQoreworCXN0cnVjdCB0aW1leCB0eDsKKwlpbnQgaSwgcmV0OworCisJaW50IHBwbVs1XSA9IHswLCAyNTAsIDUwMCwgLTI1MCwgLTUwMH07CisKKwkvKiBLaWxsIG50cGQgKi8KKwlyZXQgPSBzeXN0ZW0oImtpbGxhbGwgLTkgbnRwZCIpOworCisJLyogTWFrZSBzdXJlIHRoZXJlJ3Mgbm8gb2Zmc2V0IGFkanVzdG1lbnQgZ29pbmcgb24gKi8KKwl0eC5tb2RlcyA9IEFESl9PRkZTRVQ7CisJdHgub2Zmc2V0ID0gMDsKKwlyZXQgPSBhZGp0aW1leCgmdHgpOworCisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRmKCJNYXliZSB5b3UncmUgbm90IHJ1bm5pbmcgYXMgcm9vdD9cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlwcmludGYoIlVzaW5nICVpIHBwbSBhZGp1c3RtZW50XG4iLCBwcG1baV0pOworCQlyZXQgPSBjaGFuZ2Vfc2tld190ZXN0KHBwbVtpXSk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwl9CisKKwkvKiBTZXQgdGhpbmdzIGJhY2sgKi8KKwl0eC5tb2RlcyA9IEFESl9GUkVRVUVOQ1k7CisJdHgub2Zmc2V0ID0gMDsKKwlhZGp0aW1leCgmdHgpOworCisJaWYgKHJldCkgeworCQlwcmludGYoIltGQUlMXSIpOworCQlyZXR1cm4ga3NmdF9leGl0X2ZhaWwoKTsKKwl9CisJcHJpbnRmKCJbT0tdIik7CisJcmV0dXJuIGtzZnRfZXhpdF9wYXNzKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvY2xvY2tzb3VyY2Utc3dpdGNoLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvY2xvY2tzb3VyY2Utc3dpdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3ZWM3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9jbG9ja3NvdXJjZS1zd2l0Y2guYwpAQCAtMCwwICsxLDE3OSBAQAorLyogQ2xvY2tzb3VyY2UgY2hhbmdlIHRlc3QKKyAqCQlieTogam9obiBzdHVsdHogKGpvaG5zdHVsQHVzLmlibS5jb20pCisgKgkJKEMpIENvcHlyaWdodCBJQk0gMjAxMgorICoJCUxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MgorICoKKyAqICBOT1RFOiBUaGlzIGlzIGEgbWV0YS10ZXN0IHdoaWNoIHF1aWNrbHkgY2hhbmdlcyB0aGUgY2xvY2tzb3VyYyBhbmQKKyAqICB0aGVuIHVzZXMgb3RoZXIgdGVzdHMgdG8gZGV0ZWN0IHByb2JsZW1zLiBUaHVzIHRoaXMgdGVzdCByZXF1aXJlcworICogIHRoYXQgdGhlIGluY29uc2lzdGVuY3ktY2hlY2sgYW5kIG5hbm9zbGVlcCB0ZXN0cyBiZSBwcmVzZW50IGluIHRoZQorICogIHNhbWUgZGlyZWN0b3J5IGl0IGlzIHJ1biBmcm9tLgorICoKKyAqICBUbyBidWlsZDoKKyAqCSQgZ2NjIGNsb2Nrc291cmNlLXN3aXRjaC5jIC1vIGNsb2Nrc291cmNlLXN3aXRjaCAtbHJ0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWV4Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2lmZGVmIEtURVNUCisjaW5jbHVkZSAiLi4va3NlbGZ0ZXN0LmgiCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQga3NmdF9leGl0X3Bhc3Modm9pZCkKK3sKKwlleGl0KDApOworfQorc3RhdGljIGlubGluZSBpbnQga3NmdF9leGl0X2ZhaWwodm9pZCkKK3sKKwlleGl0KDEpOworfQorI2VuZGlmCisKKworaW50IGdldF9jbG9ja3NvdXJjZXMoY2hhciBsaXN0W11bMzBdKQoreworCWludCBmZCwgaTsKKwlzaXplX3Qgc2l6ZTsKKwljaGFyIGJ1Zls1MTJdOworCWNoYXIgKmhlYWQsICp0bXA7CisKKwlmZCA9IG9wZW4oIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY2xvY2tzb3VyY2UvY2xvY2tzb3VyY2UwL2F2YWlsYWJsZV9jbG9ja3NvdXJjZSIsIE9fUkRPTkxZKTsKKworCXNpemUgPSByZWFkKGZkLCBidWYsIDUxMik7CisKKwljbG9zZShmZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykKKwkJbGlzdFtpXVswXSA9ICdcMCc7CisKKwloZWFkID0gYnVmOworCWkgPSAwOworCXdoaWxlIChoZWFkIC0gYnVmIDwgc2l6ZSkgeworCQkvKiBGaW5kIHRoZSBuZXh0IHNwYWNlICovCisJCWZvciAodG1wID0gaGVhZDsgKnRtcCAhPSAnICc7IHRtcCsrKSB7CisJCQlpZiAoKnRtcCA9PSAnXG4nKQorCQkJCWJyZWFrOworCQkJaWYgKCp0bXAgPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJfQorCQkqdG1wID0gJ1wwJzsKKwkJc3RyY3B5KGxpc3RbaV0sIGhlYWQpOworCQloZWFkID0gdG1wICsgMTsKKwkJaSsrOworCX0KKworCXJldHVybiBpLTE7Cit9CisKK2ludCBnZXRfY3VyX2Nsb2Nrc291cmNlKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJaW50IGZkOworCisJZmQgPSBvcGVuKCIvc3lzL2RldmljZXMvc3lzdGVtL2Nsb2Nrc291cmNlL2Nsb2Nrc291cmNlMC9jdXJyZW50X2Nsb2Nrc291cmNlIiwgT19SRE9OTFkpOworCisJc2l6ZSA9IHJlYWQoZmQsIGJ1Ziwgc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGNoYW5nZV9jbG9ja3NvdXJjZShjaGFyICpjbG9ja3NvdXJjZSkKK3sKKwlpbnQgZmQ7CisJc2l6ZV90IHNpemU7CisKKwlmZCA9IG9wZW4oIi9zeXMvZGV2aWNlcy9zeXN0ZW0vY2xvY2tzb3VyY2UvY2xvY2tzb3VyY2UwL2N1cnJlbnRfY2xvY2tzb3VyY2UiLCBPX1dST05MWSk7CisKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlzaXplID0gd3JpdGUoZmQsIGNsb2Nrc291cmNlLCBzdHJsZW4oY2xvY2tzb3VyY2UpKTsKKworCWlmIChzaXplIDwgMCkKKwkJcmV0dXJuIC0xOworCisJY2xvc2UoZmQpOworCXJldHVybiAwOworfQorCisKK2ludCBydW5fdGVzdHMoaW50IHNlY3MpCit7CisJaW50IHJldDsKKwljaGFyIGJ1ZlsyNTVdOworCisJc3ByaW50ZihidWYsICIuL2luY29uc2lzdGVuY3ktY2hlY2sgLXQgJWkiLCBzZWNzKTsKKwlyZXQgPSBzeXN0ZW0oYnVmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldCA9IHN5c3RlbSgiLi9uYW5vc2xlZXAiKTsKKwlyZXR1cm4gcmV0OworfQorCisKK2NoYXIgY2xvY2tzb3VyY2VfbGlzdFsxMF1bMzBdOworCitpbnQgbWFpbihpbnQgYXJndiwgY2hhciAqKmFyZ2MpCit7CisJY2hhciBvcmlnX2Nsa1s1MTJdOworCWludCBjb3VudCwgaSwgc3RhdHVzOworCXBpZF90IHBpZDsKKworCWdldF9jdXJfY2xvY2tzb3VyY2Uob3JpZ19jbGssIDUxMik7CisKKwljb3VudCA9IGdldF9jbG9ja3NvdXJjZXMoY2xvY2tzb3VyY2VfbGlzdCk7CisKKwlpZiAoY2hhbmdlX2Nsb2Nrc291cmNlKGNsb2Nrc291cmNlX2xpc3RbMF0pKSB7CisJCXByaW50ZigiRXJyb3I6IFlvdSBwcm9iYWJseSBuZWVkIHRvIHJ1biB0aGlzIGFzIHJvb3RcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogQ2hlY2sgZXZlcnl0aGluZyBpcyBzYW5lIGJlZm9yZSB3ZSBzdGFydCBzd2l0Y2hpbmcgYXN5bmNyaG9ub3VzbHkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlwcmludGYoIlZhbGlkYXRpbmcgY2xvY2tzb3VyY2UgJXNcbiIsIGNsb2Nrc291cmNlX2xpc3RbaV0pOworCQlpZiAoY2hhbmdlX2Nsb2Nrc291cmNlKGNsb2Nrc291cmNlX2xpc3RbaV0pKSB7CisJCQlzdGF0dXMgPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChydW5fdGVzdHMoNSkpIHsKKwkJCXN0YXR1cyA9IC0xOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKworCXByaW50ZigiUnVubmluZyBBc3luY3Job25vdXMgU3dpdGNoaW5nIFRlc3RzLi4uXG4iKTsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKCFwaWQpCisJCXJldHVybiBydW5fdGVzdHMoNjApOworCisJd2hpbGUgKHBpZCAhPSB3YWl0cGlkKHBpZCwgJnN0YXR1cywgV05PSEFORykpCisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJaWYgKGNoYW5nZV9jbG9ja3NvdXJjZShjbG9ja3NvdXJjZV9saXN0W2ldKSkgeworCQkJCXN0YXR1cyA9IC0xOworCQkJCWdvdG8gb3V0OworCQkJfQorb3V0OgorCWNoYW5nZV9jbG9ja3NvdXJjZShvcmlnX2Nsayk7CisKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4ga3NmdF9leGl0X2ZhaWwoKTsKKwlyZXR1cm4ga3NmdF9leGl0X3Bhc3MoKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9pbmNvbnNpc3RlbmN5LWNoZWNrLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvaW5jb25zaXN0ZW5jeS1jaGVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjFiYzkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvaW5jb25zaXN0ZW5jeS1jaGVjay5jCkBAIC0wLDAgKzEsMjA0IEBACisvKiBUaW1lIGluY29uc2lzdGVuY3kgY2hlY2sgdGVzdAorICoJCWJ5OiBqb2huIHN0dWx0eiAoam9obnN0dWxAdXMuaWJtLmNvbSkKKyAqCQkoQykgQ29weXJpZ2h0IElCTSAyMDAzLCAyMDA0LCAyMDA1LCAyMDEyCisgKgkJKEMpIENvcHlyaWdodCBMaW5hcm8gTGltaXRlZCAyMDE1CisgKgkJTGljZW5zZWQgdW5kZXIgdGhlIEdQTHYyCisgKgorICogIFRvIGJ1aWxkOgorICoJJCBnY2MgaW5jb25zaXN0ZW5jeS1jaGVjay5jIC1vIGluY29uc2lzdGVuY3ktY2hlY2sgLWxydAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1leC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmZGVmIEtURVNUCisjaW5jbHVkZSAiLi4va3NlbGZ0ZXN0LmgiCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQga3NmdF9leGl0X3Bhc3Modm9pZCkKK3sKKwlleGl0KDApOworfQorc3RhdGljIGlubGluZSBpbnQga3NmdF9leGl0X2ZhaWwodm9pZCkKK3sKKwlleGl0KDEpOworfQorI2VuZGlmCisKKyNkZWZpbmUgQ0FMTFNfUEVSX0xPT1AgNjQKKyNkZWZpbmUgTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDBVTEwKKworI2RlZmluZSBDTE9DS19SRUFMVElNRQkJCTAKKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDCQkJMQorI2RlZmluZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQJMgorI2RlZmluZSBDTE9DS19USFJFQURfQ1BVVElNRV9JRAkJMworI2RlZmluZSBDTE9DS19NT05PVE9OSUNfUkFXCQk0CisjZGVmaW5lIENMT0NLX1JFQUxUSU1FX0NPQVJTRQkJNQorI2RlZmluZSBDTE9DS19NT05PVE9OSUNfQ09BUlNFCQk2CisjZGVmaW5lIENMT0NLX0JPT1RUSU1FCQkJNworI2RlZmluZSBDTE9DS19SRUFMVElNRV9BTEFSTQkJOAorI2RlZmluZSBDTE9DS19CT09UVElNRV9BTEFSTQkJOQorI2RlZmluZSBDTE9DS19IV1NQRUNJRklDCQkxMAorI2RlZmluZSBDTE9DS19UQUkJCQkxMQorI2RlZmluZSBOUl9DTE9DS0lEUwkJCTEyCisKK2NoYXIgKmNsb2Nrc3RyaW5nKGludCBjbG9ja2lkKQoreworCXN3aXRjaCAoY2xvY2tpZCkgeworCWNhc2UgQ0xPQ0tfUkVBTFRJTUU6CisJCXJldHVybiAiQ0xPQ0tfUkVBTFRJTUUiOworCWNhc2UgQ0xPQ0tfTU9OT1RPTklDOgorCQlyZXR1cm4gIkNMT0NLX01PTk9UT05JQyI7CisJY2FzZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQ6CisJCXJldHVybiAiQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEIjsKKwljYXNlIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEOgorCQlyZXR1cm4gIkNMT0NLX1RIUkVBRF9DUFVUSU1FX0lEIjsKKwljYXNlIENMT0NLX01PTk9UT05JQ19SQVc6CisJCXJldHVybiAiQ0xPQ0tfTU9OT1RPTklDX1JBVyI7CisJY2FzZSBDTE9DS19SRUFMVElNRV9DT0FSU0U6CisJCXJldHVybiAiQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFIjsKKwljYXNlIENMT0NLX01PTk9UT05JQ19DT0FSU0U6CisJCXJldHVybiAiQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRSI7CisJY2FzZSBDTE9DS19CT09UVElNRToKKwkJcmV0dXJuICJDTE9DS19CT09UVElNRSI7CisJY2FzZSBDTE9DS19SRUFMVElNRV9BTEFSTToKKwkJcmV0dXJuICJDTE9DS19SRUFMVElNRV9BTEFSTSI7CisJY2FzZSBDTE9DS19CT09UVElNRV9BTEFSTToKKwkJcmV0dXJuICJDTE9DS19CT09UVElNRV9BTEFSTSI7CisJY2FzZSBDTE9DS19UQUk6CisJCXJldHVybiAiQ0xPQ0tfVEFJIjsKKwl9OworCXJldHVybiAiVU5LTk9XTl9DTE9DS0lEIjsKK30KKworLyogcmV0dXJucyAxIGlmIGEgPD0gYiwgMCBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGluX29yZGVyKHN0cnVjdCB0aW1lc3BlYyBhLCBzdHJ1Y3QgdGltZXNwZWMgYikKK3sKKwkvKiB1c2UgdW5zaWduZWQgdG8gYXZvaWQgZmFsc2UgcG9zaXRpdmVzIG9uIDIwMzggcm9sbG92ZXIgKi8KKwlpZiAoKHVuc2lnbmVkIGxvbmcpYS50dl9zZWMgPCAodW5zaWduZWQgbG9uZyliLnR2X3NlYykKKwkJcmV0dXJuIDE7CisJaWYgKCh1bnNpZ25lZCBsb25nKWEudHZfc2VjID4gKHVuc2lnbmVkIGxvbmcpYi50dl9zZWMpCisJCXJldHVybiAwOworCWlmIChhLnR2X25zZWMgPiBiLnR2X25zZWMpCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisKKworaW50IGNvbnNpc3RlbmN5X3Rlc3QoaW50IGNsb2NrX3R5cGUsIHVuc2lnbmVkIGxvbmcgc2Vjb25kcykKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgbGlzdFtDQUxMU19QRVJfTE9PUF07CisJaW50IGksIGluY29uc2lzdGVudDsKKwlsb25nIG5vdywgdGhlbjsKKwl0aW1lX3QgdDsKKwljaGFyICpzdGFydF9zdHI7CisKKwljbG9ja19nZXR0aW1lKGNsb2NrX3R5cGUsICZsaXN0WzBdKTsKKwlub3cgPSB0aGVuID0gbGlzdFswXS50dl9zZWM7CisKKwkvKiB0aW1lc3RhbXAgc3RhcnQgb2YgdGVzdCAqLworCXQgPSB0aW1lKDApOworCXN0YXJ0X3N0ciA9IGN0aW1lKCZ0KTsKKworCXdoaWxlIChzZWNvbmRzID09IC0xIHx8IG5vdyAtIHRoZW4gPCBzZWNvbmRzKSB7CisJCWluY29uc2lzdGVudCA9IDA7CisKKwkJLyogRmlsbCBsaXN0ICovCisJCWZvciAoaSA9IDA7IGkgPCBDQUxMU19QRVJfTE9PUDsgaSsrKQorCQkJY2xvY2tfZ2V0dGltZShjbG9ja190eXBlLCAmbGlzdFtpXSk7CisKKwkJLyogQ2hlY2sgZm9yIGluY29uc2lzdGVuY2llcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgQ0FMTFNfUEVSX0xPT1AgLSAxOyBpKyspCisJCQlpZiAoIWluX29yZGVyKGxpc3RbaV0sIGxpc3RbaSsxXSkpCisJCQkJaW5jb25zaXN0ZW50ID0gaTsKKworCQkvKiBkaXNwbGF5IGluY29uc2lzdGVuY3kgKi8KKwkJaWYgKGluY29uc2lzdGVudCkgeworCQkJdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhOworCisJCQlwcmludGYoIlwlc1xuIiwgc3RhcnRfc3RyKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBDQUxMU19QRVJfTE9PUDsgaSsrKSB7CisJCQkJaWYgKGkgPT0gaW5jb25zaXN0ZW50KQorCQkJCQlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJCQlwcmludGYoIiVsdTolbHVcbiIsIGxpc3RbaV0udHZfc2VjLAorCQkJCQkJCWxpc3RbaV0udHZfbnNlYyk7CisJCQkJaWYgKGkgPT0gaW5jb25zaXN0ZW50ICsgMSkKKwkJCQkJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCQl9CisJCQlkZWx0YSA9IGxpc3RbaW5jb25zaXN0ZW50XS50dl9zZWMgKiBOU0VDX1BFUl9TRUM7CisJCQlkZWx0YSArPSBsaXN0W2luY29uc2lzdGVudF0udHZfbnNlYzsKKwkJCWRlbHRhIC09IGxpc3RbaW5jb25zaXN0ZW50KzFdLnR2X3NlYyAqIE5TRUNfUEVSX1NFQzsKKwkJCWRlbHRhIC09IGxpc3RbaW5jb25zaXN0ZW50KzFdLnR2X25zZWM7CisJCQlwcmludGYoIkRlbHRhOiAlbGx1IG5zXG4iLCBkZWx0YSk7CisJCQlmZmx1c2goMCk7CisJCQkvKiB0aW1lc3RhbXAgaW5jb25zaXN0ZW5jeSovCisJCQl0ID0gdGltZSgwKTsKKwkJCXByaW50ZigiJXNcbiIsIGN0aW1lKCZ0KSk7CisJCQlwcmludGYoIltGQUlMRURdXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlub3cgPSBsaXN0WzBdLnR2X3NlYzsKKwl9CisJcHJpbnRmKCJbT0tdXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBjbG9ja2lkLCBvcHQ7CisJaW50IHVzZXJjbG9jayA9IENMT0NLX1JFQUxUSU1FOworCWludCBtYXhjbG9ja3MgPSBOUl9DTE9DS0lEUzsKKwlpbnQgcnVudGltZSA9IDEwOworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCS8qIFByb2Nlc3MgYXJndW1lbnRzICovCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgInQ6YzoiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcHQpIHsKKwkJY2FzZSAndCc6CisJCQlydW50aW1lID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJdXNlcmNsb2NrID0gYXRvaShvcHRhcmcpOworCQkJbWF4Y2xvY2tzID0gdXNlcmNsb2NrICsgMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJVc2FnZTogJXMgWy10IDxzZWNzPl0gWy1jIDxjbG9ja2lkPl1cbiIsIGFyZ3ZbMF0pOworCQkJcHJpbnRmKCIJLXQ6IE51bWJlciBvZiBzZWNvbmRzIHRvIHJ1blxuIik7CisJCQlwcmludGYoIgktYzogY2xvY2tpZCB0byB1c2UgKGRlZmF1bHQsIGFsbCBjbG9ja2lkcylcbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwl9CisKKwlzZXRidWYoc3Rkb3V0LCBOVUxMKTsKKworCWZvciAoY2xvY2tpZCA9IHVzZXJjbG9jazsgY2xvY2tpZCA8IG1heGNsb2NrczsgY2xvY2tpZCsrKSB7CisKKwkJaWYgKGNsb2NraWQgPT0gQ0xPQ0tfSFdTUEVDSUZJQykKKwkJCWNvbnRpbnVlOworCisJCWlmICghY2xvY2tfZ2V0dGltZShjbG9ja2lkLCAmdHMpKSB7CisJCQlwcmludGYoIkNvbnNpc3RlbnQgJS0zMHMgIiwgY2xvY2tzdHJpbmcoY2xvY2tpZCkpOworCQkJaWYgKGNvbnNpc3RlbmN5X3Rlc3QoY2xvY2tpZCwgcnVudGltZSkpCisJCQkJcmV0dXJuIGtzZnRfZXhpdF9mYWlsKCk7CisJCX0KKwl9CisJcmV0dXJuIGtzZnRfZXhpdF9wYXNzKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvbGVhcC1hLWRheS5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL2xlYXAtYS1kYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODI3MmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL2xlYXAtYS1kYXkuYwpAQCAtMCwwICsxLDMxOSBAQAorLyogTGVhcCBzZWNvbmQgc3RyZXNzIHRlc3QKKyAqICAgICAgICAgICAgICBieTogSm9obiBTdHVsdHogKGpvaG4uc3R1bHR6QGxpbmFyby5vcmcpCisgKiAgICAgICAgICAgICAgKEMpIENvcHlyaWdodCBJQk0gMjAxMgorICogICAgICAgICAgICAgIChDKSBDb3B5cmlnaHQgMjAxMywgMjAxNSBMaW5hcm8gTGltaXRlZAorICogICAgICAgICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MgorICoKKyAqICBUaGlzIHRlc3Qgc2lnbmFscyB0aGUga2VybmVsIHRvIGluc2VydCBhIGxlYXAgc2Vjb25kCisgKiAgZXZlcnkgZGF5IGF0IG1pZG5pZ2h0IEdNVC4gVGhpcyBhbGxvd3MgZm9yIHN0ZXNzaW5nIHRoZQorICogIGtlcm5lbCdzIGxlYXAtc2Vjb25kIGJlaGF2aW9yLCBhcyB3ZWxsIGFzIGhvdyB3ZWxsIGFwcGxpY2F0aW9ucworICogIGhhbmRsZSB0aGUgbGVhcC1zZWNvbmQgZGlzY29udGludWl0eS4KKyAqCisgKiAgVXNhZ2U6IGxlYXAtYS1kYXkgWy1zXSBbLWkgPG51bT5dCisgKgorICogIE9wdGlvbnM6CisgKgktczoJRWFjaCBpdGVyYXRpb24sIHNldCB0aGUgZGF0ZSB0byAxMCBzZWNvbmRzIGJlZm9yZSBtaWRuaWdodCBHTVQuCisgKgkJVGhpcyBzcGVlZHMgdXAgdGhlIG51bWJlciBvZiBsZWFwc2Vjb25kIHRyYW5zaXRpb25zIHRlc3RlZCwKKyAqCQlidXQgYmVjYXVzZSBpdCBjYWxscyBzZXR0aW1lb2ZkYXkgZnJlcXVlbnRseSwgYWR2YW5jaW5nIHRoZQorICoJCXRpbWUgYnkgMjQgaG91cnMgZXZlcnkgfjE2IHNlY29uZHMsIGl0IG1heSBjYXVzZSBhcHBsaWNhdGlvbgorICoJCWRpc3J1cHRpb24uCisgKgorICoJLWk6CU51bWJlciBvZiBpdGVyYXRpb25zIHRvIHJ1biAoZGVmYXVsdDogaW5maW5pdGUpCisgKgorICogIE90aGVyIG5vdGVzOiBEaXNhYmxpbmcgTlRQIHByaW9yIHRvIHJ1bm5pbmcgdGhpcyBpcyBhZHZpc2VkLCBhcyB0aGUgdHdvCisgKgkJIG1heSBjb25mbGljdCBpbiB0aGVpciBjb21tYW5kcyB0byB0aGUga2VybmVsLgorICoKKyAqICBUbyBidWlsZDoKKyAqCSQgZ2NjIGxlYXAtYS1kYXkuYyAtbyBsZWFwLWEtZGF5IC1scnQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBLVEVTVAorI2luY2x1ZGUgIi4uL2tzZWxmdGVzdC5oIgorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGtzZnRfZXhpdF9wYXNzKHZvaWQpCit7CisJZXhpdCgwKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGtzZnRfZXhpdF9mYWlsKHZvaWQpCit7CisJZXhpdCgxKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIE5TRUNfUEVSX1NFQyAxMDAwMDAwMDAwVUxMCisjZGVmaW5lIENMT0NLX1RBSSAxMQorCisvKiByZXR1cm5zIDEgaWYgYSA8PSBiLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGlubGluZSBpbnQgaW5fb3JkZXIoc3RydWN0IHRpbWVzcGVjIGEsIHN0cnVjdCB0aW1lc3BlYyBiKQoreworCWlmIChhLnR2X3NlYyA8IGIudHZfc2VjKQorCQlyZXR1cm4gMTsKKwlpZiAoYS50dl9zZWMgPiBiLnR2X3NlYykKKwkJcmV0dXJuIDA7CisJaWYgKGEudHZfbnNlYyA+IGIudHZfbnNlYykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCB0aW1lc3BlYyB0aW1lc3BlY19hZGQoc3RydWN0IHRpbWVzcGVjIHRzLCB1bnNpZ25lZCBsb25nIGxvbmcgbnMpCit7CisJdHMudHZfbnNlYyArPSBuczsKKwl3aGlsZSAodHMudHZfbnNlYyA+PSBOU0VDX1BFUl9TRUMpIHsKKwkJdHMudHZfbnNlYyAtPSBOU0VDX1BFUl9TRUM7CisJCXRzLnR2X3NlYysrOworCX0KKwlyZXR1cm4gdHM7Cit9CisKK2NoYXIgKnRpbWVfc3RhdGVfc3RyKGludCBzdGF0ZSkKK3sKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBUSU1FX09LOglyZXR1cm4gIlRJTUVfT0siOworCWNhc2UgVElNRV9JTlM6CXJldHVybiAiVElNRV9JTlMiOworCWNhc2UgVElNRV9ERUw6CXJldHVybiAiVElNRV9ERUwiOworCWNhc2UgVElNRV9PT1A6CXJldHVybiAiVElNRV9PT1AiOworCWNhc2UgVElNRV9XQUlUOglyZXR1cm4gIlRJTUVfV0FJVCI7CisJY2FzZSBUSU1FX0JBRDoJcmV0dXJuICJUSU1FX0JBRCI7CisJfQorCXJldHVybiAiRVJST1IiOworfQorCisvKiBjbGVhciBOVFAgdGltZV9zdGF0dXMgJiB0aW1lX3N0YXRlICovCitpbnQgY2xlYXJfdGltZV9zdGF0ZSh2b2lkKQoreworCXN0cnVjdCB0aW1leCB0eDsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBXZSBoYXZlIHRvIGNhbGwgYWRqdGltZSB0d2ljZSBoZXJlLCBhcyBrZXJuZWxzCisJICogcHJpb3IgdG8gNmIxODU5ZGJhMDFjNyAoaW5jbHVkZWQgaW4gMy41IGFuZAorCSAqIC1zdGFibGUpLCBoYWQgYW4gaXNzdWUgd2l0aCB0aGUgc3RhdGUgbWFjaGluZQorCSAqIGFuZCB3b3VsZG4ndCBjbGVhciB0aGUgU1RBX0lOUy9ERUwgZmxhZyBkaXJlY3RseS4KKwkgKi8KKwl0eC5tb2RlcyA9IEFESl9TVEFUVVM7CisJdHguc3RhdHVzID0gU1RBX1BMTDsKKwlyZXQgPSBhZGp0aW1leCgmdHgpOworCisJLyogQ2xlYXIgbWF4ZXJyb3IsIGFzIGl0IGNhbiBjYXVzZSBVTlNZTkMgdG8gYmUgc2V0ICovCisJdHgubW9kZXMgPSBBREpfTUFYRVJST1I7CisJdHgubWF4ZXJyb3IgPSAwOworCXJldCA9IGFkanRpbWV4KCZ0eCk7CisKKwkvKiBDbGVhciB0aGUgc3RhdHVzICovCisJdHgubW9kZXMgPSBBREpfU1RBVFVTOworCXR4LnN0YXR1cyA9IDA7CisJcmV0ID0gYWRqdGltZXgoJnR4KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIE1ha2Ugc3VyZSB3ZSBjbGVhbnVwIG9uIGN0cmwtYyAqLwordm9pZCBoYW5kbGVyKGludCB1bnVzZWQpCit7CisJY2xlYXJfdGltZV9zdGF0ZSgpOworCWV4aXQoMCk7Cit9CisKKy8qIFRlc3QgZm9yIGtub3duIGhydGltZXIgZmFpbHVyZSAqLwordm9pZCB0ZXN0X2hydGltZXJfZmFpbHVyZSh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyBub3csIHRhcmdldDsKKworCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpOworCXRhcmdldCA9IHRpbWVzcGVjX2FkZChub3csIE5TRUNfUEVSX1NFQy8yKTsKKwljbG9ja19uYW5vc2xlZXAoQ0xPQ0tfUkVBTFRJTUUsIFRJTUVSX0FCU1RJTUUsICZ0YXJnZXQsIE5VTEwpOworCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZub3cpOworCisJaWYgKCFpbl9vcmRlcih0YXJnZXQsIG5vdykpCisJCXByaW50ZigiRVJST1I6IGhydGltZXIgZWFybHkgZXhwaXJhdGlvbiBmYWlsdXJlIG9ic2VydmVkLlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc2V0dGltZSA9IDA7CisJaW50IHRhaV90aW1lID0gMDsKKwlpbnQgaW5zZXJ0ID0gMTsKKwlpbnQgaXRlcmF0aW9ucyA9IC0xOworCWludCBvcHQ7CisKKwkvKiBQcm9jZXNzIGFyZ3VtZW50cyAqLworCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJzdGk6IikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ3MnOgorCQkJcHJpbnRmKCJTZXR0aW5nIHRpbWUgdG8gc3BlZWQgdXAgdGVzdGluZ1xuIik7CisJCQlzZXR0aW1lID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCWl0ZXJhdGlvbnMgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAndCc6CisJCQl0YWlfdGltZSA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiVXNhZ2U6ICVzIFstc10gWy1pIDxpdGVyYXRpb25zPl1cbiIsIGFyZ3ZbMF0pOworCQkJcHJpbnRmKCIJLXM6IFNldCB0aW1lIHRvIHJpZ2h0IGJlZm9yZSBsZWFwIHNlY29uZCBlYWNoIGl0ZXJhdGlvblxuIik7CisJCQlwcmludGYoIgktaTogTnVtYmVyIG9mIGl0ZXJhdGlvbnNcbiIpOworCQkJcHJpbnRmKCIJLXQ6IFByaW50IFRBSSB0aW1lXG4iKTsKKwkJCWV4aXQoLTEpOworCQl9CisJfQorCisJLyogTWFrZSBzdXJlIFRBSSBzdXBwb3J0IGlzIHByZXNlbnQgaWYgLXQgd2FzIHVzZWQgKi8KKwlpZiAodGFpX3RpbWUpIHsKKwkJc3RydWN0IHRpbWVzcGVjIHRzOworCisJCWlmIChjbG9ja19nZXR0aW1lKENMT0NLX1RBSSwgJnRzKSkgeworCQkJcHJpbnRmKCJTeXN0ZW0gZG9lc24ndCBzdXBwb3J0IENMT0NLX1RBSVxuIik7CisJCQlrc2Z0X2V4aXRfZmFpbCgpOworCQl9CisJfQorCisJc2lnbmFsKFNJR0lOVCwgaGFuZGxlcik7CisJc2lnbmFsKFNJR0tJTEwsIGhhbmRsZXIpOworCisJaWYgKGl0ZXJhdGlvbnMgPCAwKQorCQlwcmludGYoIlRoaXMgcnVucyBjb250aW51b3VzbHkuIFByZXNzIGN0cmwtYyB0byBzdG9wXG4iKTsKKwllbHNlCisJCXByaW50ZigiUnVubmluZyBmb3IgJWkgaXRlcmF0aW9ucy4gUHJlc3MgY3RybC1jIHRvIHN0b3BcbiIsIGl0ZXJhdGlvbnMpOworCisJcHJpbnRmKCJcbiIpOworCXdoaWxlICgxKSB7CisJCWludCByZXQ7CisJCXN0cnVjdCB0aW1lc3BlYyB0czsKKwkJc3RydWN0IHRpbWV4IHR4OworCQl0aW1lX3Qgbm93LCBuZXh0X2xlYXA7CisKKwkJLyogR2V0IHRoZSBjdXJyZW50IHRpbWUgKi8KKwkJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnRzKTsKKworCQkvKiBDYWxjdWxhdGUgdGhlIG5leHQgcG9zc2libGUgbGVhcCBzZWNvbmQgMjM6NTk6NjAgR01UICovCisJCW5leHRfbGVhcCA9IHRzLnR2X3NlYzsKKwkJbmV4dF9sZWFwICs9IDg2NDAwIC0gKG5leHRfbGVhcCAlIDg2NDAwKTsKKworCQlpZiAoc2V0dGltZSkgeworCQkJc3RydWN0IHRpbWV2YWwgdHY7CisKKwkJCXR2LnR2X3NlYyA9IG5leHRfbGVhcCAtIDEwOworCQkJdHYudHZfdXNlYyA9IDA7CisJCQlzZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwkJCXByaW50ZigiU2V0dGluZyB0aW1lIHRvICVzIiwgY3RpbWUoJnR2LnR2X3NlYykpOworCQl9CisKKwkJLyogUmVzZXQgTlRQIHRpbWUgc3RhdGUgKi8KKwkJY2xlYXJfdGltZV9zdGF0ZSgpOworCisJCS8qIFNldCB0aGUgbGVhcCBzZWNvbmQgaW5zZXJ0IGZsYWcgKi8KKwkJdHgubW9kZXMgPSBBREpfU1RBVFVTOworCQlpZiAoaW5zZXJ0KQorCQkJdHguc3RhdHVzID0gU1RBX0lOUzsKKwkJZWxzZQorCQkJdHguc3RhdHVzID0gU1RBX0RFTDsKKwkJcmV0ID0gYWRqdGltZXgoJnR4KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ZigiRXJyb3I6IFByb2JsZW0gc2V0dGluZyBTVEFfSU5TL1NUQV9ERUwhOiAlc1xuIiwKKwkJCQkJCQl0aW1lX3N0YXRlX3N0cihyZXQpKTsKKwkJCXJldHVybiBrc2Z0X2V4aXRfZmFpbCgpOworCQl9CisKKwkJLyogVmFsaWRhdGUgU1RBX0lOUyB3YXMgc2V0ICovCisJCXR4Lm1vZGVzID0gMDsKKwkJcmV0ID0gYWRqdGltZXgoJnR4KTsKKwkJaWYgKHR4LnN0YXR1cyAhPSBTVEFfSU5TICYmIHR4LnN0YXR1cyAhPSBTVEFfREVMKSB7CisJCQlwcmludGYoIkVycm9yOiBTVEFfSU5TL1NUQV9ERUwgbm90IHNldCE6ICVzXG4iLAorCQkJCQkJCXRpbWVfc3RhdGVfc3RyKHJldCkpOworCQkJcmV0dXJuIGtzZnRfZXhpdF9mYWlsKCk7CisJCX0KKworCQlpZiAodGFpX3RpbWUpIHsKKwkJCXByaW50ZigiVXNpbmcgVEFJIHRpbWUsIgorCQkJCSIgbm8gaW5jb25zaXN0ZW5jaWVzIHNob3VsZCBiZSBzZWVuIVxuIik7CisJCX0KKworCQlwcmludGYoIlNjaGVkdWxpbmcgbGVhcCBzZWNvbmQgZm9yICVzIiwgY3RpbWUoJm5leHRfbGVhcCkpOworCisJCS8qIFdha2UgdXAgMyBzZWNvbmRzIGJlZm9yZSBsZWFwICovCisJCXRzLnR2X3NlYyA9IG5leHRfbGVhcCAtIDM7CisJCXRzLnR2X25zZWMgPSAwOworCisJCXdoaWxlIChjbG9ja19uYW5vc2xlZXAoQ0xPQ0tfUkVBTFRJTUUsIFRJTUVSX0FCU1RJTUUsICZ0cywgTlVMTCkpCisJCQlwcmludGYoIlNvbWV0aGluZyB3b2tlIHVzIHVwLCByZXR1cm5pbmcgdG8gc2xlZXBcbiIpOworCisJCS8qIFZhbGlkYXRlIFNUQV9JTlMgaXMgc3RpbGwgc2V0ICovCisJCXR4Lm1vZGVzID0gMDsKKwkJcmV0ID0gYWRqdGltZXgoJnR4KTsKKwkJaWYgKHR4LnN0YXR1cyAhPSBTVEFfSU5TICYmIHR4LnN0YXR1cyAhPSBTVEFfREVMKSB7CisJCQlwcmludGYoIlNvbWV0aGluZyBjbGVhcmVkIFNUQV9JTlMvU1RBX0RFTCwgc2V0dGluZyBpdCBhZ2Fpbi5cbiIpOworCQkJdHgubW9kZXMgPSBBREpfU1RBVFVTOworCQkJaWYgKGluc2VydCkKKwkJCQl0eC5zdGF0dXMgPSBTVEFfSU5TOworCQkJZWxzZQorCQkJCXR4LnN0YXR1cyA9IFNUQV9ERUw7CisJCQlyZXQgPSBhZGp0aW1leCgmdHgpOworCQl9CisKKwkJLyogQ2hlY2sgYWRqdGltZXggb3V0cHV0IGV2ZXJ5IGhhbGYgc2Vjb25kICovCisJCW5vdyA9IHR4LnRpbWUudHZfc2VjOworCQl3aGlsZSAobm93IDwgbmV4dF9sZWFwICsgMikgeworCQkJY2hhciBidWZbMjZdOworCQkJc3RydWN0IHRpbWVzcGVjIHRhaTsKKworCQkJdHgubW9kZXMgPSAwOworCQkJcmV0ID0gYWRqdGltZXgoJnR4KTsKKworCQkJaWYgKHRhaV90aW1lKSB7CisJCQkJY2xvY2tfZ2V0dGltZShDTE9DS19UQUksICZ0YWkpOworCQkJCXByaW50ZigiJWxkIHNlYywgJTlsZCBuc1x0JXNcbiIsCisJCQkJCQl0YWkudHZfc2VjLAorCQkJCQkJdGFpLnR2X25zZWMsCisJCQkJCQl0aW1lX3N0YXRlX3N0cihyZXQpKTsKKwkJCX0gZWxzZSB7CisJCQkJY3RpbWVfcigmdHgudGltZS50dl9zZWMsIGJ1Zik7CisJCQkJYnVmW3N0cmxlbihidWYpLTFdID0gMDsgLypyZW1vdmUgdHJhaWxpbmdcbiAqLworCisJCQkJcHJpbnRmKCIlcyArICU2bGQgdXMgKCVpKVx0JXNcbiIsCisJCQkJCQlidWYsCisJCQkJCQl0eC50aW1lLnR2X3VzZWMsCisJCQkJCQl0eC50YWksCisJCQkJCQl0aW1lX3N0YXRlX3N0cihyZXQpKTsKKwkJCX0KKwkJCW5vdyA9IHR4LnRpbWUudHZfc2VjOworCQkJLyogU2xlZXAgZm9yIGFub3RoZXIgaGFsZiBzZWNvbmQgKi8KKwkJCXRzLnR2X3NlYyA9IDA7CisJCQl0cy50dl9uc2VjID0gTlNFQ19QRVJfU0VDIC8gMjsKKwkJCWNsb2NrX25hbm9zbGVlcChDTE9DS19NT05PVE9OSUMsIDAsICZ0cywgTlVMTCk7CisJCX0KKwkJLyogU3dpdGNoIHRvIHVzaW5nIG90aGVyIG1vZGUgKi8KKwkJaW5zZXJ0ID0gIWluc2VydDsKKworCQkvKiBOb3RlIGlmIGtlcm5lbCBoYXMga25vd24gaHJ0aW1lciBmYWlsdXJlICovCisJCXRlc3RfaHJ0aW1lcl9mYWlsdXJlKCk7CisKKwkJcHJpbnRmKCJMZWFwIGNvbXBsZXRlXG5cbiIpOworCisJCWlmICgoaXRlcmF0aW9ucyAhPSAtMSkgJiYgISgtLWl0ZXJhdGlvbnMpKQorCQkJYnJlYWs7CisJfQorCisJY2xlYXJfdGltZV9zdGF0ZSgpOworCXJldHVybiBrc2Z0X2V4aXRfcGFzcygpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL2xlYXBjcmFzaC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL2xlYXBjcmFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDcxYmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvbGVhcGNyYXNoLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qIERlbW8gbGVhcHNlY29uZCBkZWFkbG9jaworICogICAgICAgICAgICAgIGJ5OiBKb2huIFN0dWx0eiAoam9obi5zdHVsdHpAbGluYXJvLm9yZykKKyAqICAgICAgICAgICAgICAoQykgQ29weXJpZ2h0IElCTSAyMDEyCisgKiAgICAgICAgICAgICAgKEMpIENvcHlyaWdodCAyMDEzLCAyMDE1IExpbmFybyBMaW1pdGVkCisgKiAgICAgICAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEdQTAorICoKKyAqIFRoaXMgdGVzdCBkZW1vbnN0cmF0ZXMgbGVhcHNlY29uZCBkZWFkbG9jayB0aGF0IGlzIHBvc3NpYmUKKyAqIG9uIGtlcm5lbHMgZnJvbSAyLjYuMjYgdG8gMy4zLgorICoKKyAqIFdBUk5JTkc6IFRISVMgV0lMTCBMSUtFTFkgSEFSREhBTkcgU1lTVEVNUyBBTkQgTUFZIExPU0UgREFUQQorICogUlVOIEFUIFlPVVIgT1dOIFJJU0shCisgKiAgVG8gYnVpbGQ6CisgKgkkIGdjYyBsZWFwY3Jhc2guYyAtbyBsZWFwY3Jhc2ggLWxydAorICovCisKKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBLVEVTVAorI2luY2x1ZGUgIi4uL2tzZWxmdGVzdC5oIgorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGtzZnRfZXhpdF9wYXNzKHZvaWQpCit7CisJZXhpdCgwKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGtzZnRfZXhpdF9mYWlsKHZvaWQpCit7CisJZXhpdCgxKTsKK30KKyNlbmRpZgorCisKKworLyogY2xlYXIgTlRQIHRpbWVfc3RhdHVzICYgdGltZV9zdGF0ZSAqLworaW50IGNsZWFyX3RpbWVfc3RhdGUodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXggdHg7CisJaW50IHJldDsKKworCS8qCisJICogV2UgaGF2ZSB0byBjYWxsIGFkanRpbWUgdHdpY2UgaGVyZSwgYXMga2VybmVscworCSAqIHByaW9yIHRvIDZiMTg1OWRiYTAxYzcgKGluY2x1ZGVkIGluIDMuNSBhbmQKKwkgKiAtc3RhYmxlKSwgaGFkIGFuIGlzc3VlIHdpdGggdGhlIHN0YXRlIG1hY2hpbmUKKwkgKiBhbmQgd291bGRuJ3QgY2xlYXIgdGhlIFNUQV9JTlMvREVMIGZsYWcgZGlyZWN0bHkuCisJICovCisJdHgubW9kZXMgPSBBREpfU1RBVFVTOworCXR4LnN0YXR1cyA9IFNUQV9QTEw7CisJcmV0ID0gYWRqdGltZXgoJnR4KTsKKworCXR4Lm1vZGVzID0gQURKX1NUQVRVUzsKKwl0eC5zdGF0dXMgPSAwOworCXJldCA9IGFkanRpbWV4KCZ0eCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBNYWtlIHN1cmUgd2UgY2xlYW51cCBvbiBjdHJsLWMgKi8KK3ZvaWQgaGFuZGxlcihpbnQgdW51c2VkKQoreworCWNsZWFyX3RpbWVfc3RhdGUoKTsKKwlleGl0KDApOworfQorCisKK2ludCBtYWluKHZvaWQpCit7CisJc3RydWN0IHRpbWV4IHR4OworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwl0aW1lX3QgbmV4dF9sZWFwOworCWludCBjb3VudCA9IDA7CisKKwlzZXRidWYoc3Rkb3V0LCBOVUxMKTsKKworCXNpZ25hbChTSUdJTlQsIGhhbmRsZXIpOworCXNpZ25hbChTSUdLSUxMLCBoYW5kbGVyKTsKKwlwcmludGYoIlRoaXMgcnVucyBmb3IgYSBmZXcgbWludXRlcy4gUHJlc3MgY3RybC1jIHRvIHN0b3BcbiIpOworCisJY2xlYXJfdGltZV9zdGF0ZSgpOworCisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgdGltZSAqLworCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZ0cyk7CisKKwkvKiBDYWxjdWxhdGUgdGhlIG5leHQgcG9zc2libGUgbGVhcCBzZWNvbmQgMjM6NTk6NjAgR01UICovCisJbmV4dF9sZWFwID0gdHMudHZfc2VjOworCW5leHRfbGVhcCArPSA4NjQwMCAtIChuZXh0X2xlYXAgJSA4NjQwMCk7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAyMDsgY291bnQrKykgeworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKworCisJCS8qIHNldCB0aGUgdGltZSB0byAyIHNlY29uZHMgYmVmb3JlIHRoZSBsZWFwICovCisJCXR2LnR2X3NlYyA9IG5leHRfbGVhcCAtIDI7CisJCXR2LnR2X3VzZWMgPSAwOworCQlpZiAoc2V0dGltZW9mZGF5KCZ0diwgTlVMTCkpIHsKKwkJCXByaW50ZigiRXJyb3I6IFlvdSdyZSBsaWtlbHkgbm90IHJ1bm5pbmcgd2l0aCBwcm9wZXIgKGllOiByb290KSBwZXJtaXNzaW9uc1xuIik7CisJCQlyZXR1cm4ga3NmdF9leGl0X2ZhaWwoKTsKKwkJfQorCQl0eC5tb2RlcyA9IDA7CisJCWFkanRpbWV4KCZ0eCk7CisKKwkJLyogaGFtbWVyIG9uIGFkanRpbWUgdy8gU1RBX0lOUyAqLworCQl3aGlsZSAodHgudGltZS50dl9zZWMgPCBuZXh0X2xlYXAgKyAxKSB7CisJCQkvKiBTZXQgdGhlIGxlYXAgc2Vjb25kIGluc2VydCBmbGFnICovCisJCQl0eC5tb2RlcyA9IEFESl9TVEFUVVM7CisJCQl0eC5zdGF0dXMgPSBTVEFfSU5TOworCQkJYWRqdGltZXgoJnR4KTsKKwkJfQorCQljbGVhcl90aW1lX3N0YXRlKCk7CisJCXByaW50ZigiLiIpOworCX0KKwlwcmludGYoIltPS11cbiIpOworCXJldHVybiBrc2Z0X2V4aXRfcGFzcygpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL21xdWV1ZS1sYXQuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9tcXVldWUtbGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhMzkyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9tcXVldWUtbGF0LmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qIE1lYXN1cmUgbXF1ZXVlIHRpbWVvdXQgbGF0ZW5jeQorICogICAgICAgICAgICAgIGJ5OiBqb2huIHN0dWx0eiAoam9obi5zdHVsdHpAbGluYXJvLm9yZykKKyAqCQkoQykgQ29weXJpZ2h0IExpbmFybyAyMDEzCisgKgorICoJCUluc3BpcmVkIHdpdGggcGVybWlzc2lvbiBmcm9tIGV4YW1wbGUgdGVzdCBieToKKyAqCQkJUm9tYWluIEZyYW5jb2lzZSA8cm9tYWluQG9yZWJva2VjaC5jb20+CisgKiAgICAgICAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEdQTHYyCisgKgorICogIFRvIGJ1aWxkOgorICoJJCBnY2MgbXF1ZXVlLWxhdC5jIC1vIG1xdWV1ZS1sYXQgLWxydAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWV4Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtcXVldWUuaD4KKyNpZmRlZiBLVEVTVAorI2luY2x1ZGUgIi4uL2tzZWxmdGVzdC5oIgorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGtzZnRfZXhpdF9wYXNzKHZvaWQpCit7CisJZXhpdCgwKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGtzZnRfZXhpdF9mYWlsKHZvaWQpCit7CisJZXhpdCgxKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIE5TRUNfUEVSX1NFQyAxMDAwMDAwMDAwVUxMCisKKyNkZWZpbmUgVEFSR0VUX1RJTUVPVVQJCTEwMDAwMDAwMAkvKiAxMDBtcyBpbiBuYW5vc2Vjb25kcyAqLworI2RlZmluZSBVTlJFU09OQUJMRV9MQVRFTkNZCTQwMDAwMDAwCS8qIDQwbXMgaW4gbmFub3NlY3MgKi8KKworCitsb25nIGxvbmcgdGltZXNwZWNfc3ViKHN0cnVjdCB0aW1lc3BlYyBhLCBzdHJ1Y3QgdGltZXNwZWMgYikKK3sKKwlsb25nIGxvbmcgcmV0ID0gTlNFQ19QRVJfU0VDICogYi50dl9zZWMgKyBiLnR2X25zZWM7CisKKwlyZXQgLT0gTlNFQ19QRVJfU0VDICogYS50dl9zZWMgKyBhLnR2X25zZWM7CisJcmV0dXJuIHJldDsKK30KKworc3RydWN0IHRpbWVzcGVjIHRpbWVzcGVjX2FkZChzdHJ1Y3QgdGltZXNwZWMgdHMsIHVuc2lnbmVkIGxvbmcgbG9uZyBucykKK3sKKwl0cy50dl9uc2VjICs9IG5zOworCXdoaWxlICh0cy50dl9uc2VjID49IE5TRUNfUEVSX1NFQykgeworCQl0cy50dl9uc2VjIC09IE5TRUNfUEVSX1NFQzsKKwkJdHMudHZfc2VjKys7CisJfQorCXJldHVybiB0czsKK30KKworaW50IG1xdWV1ZV9sYXRfdGVzdCh2b2lkKQoreworCisJbXFkX3QgcTsKKwlzdHJ1Y3QgbXFfYXR0ciBhdHRyOworCXN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kLCBub3csIHRhcmdldDsKKwlpbnQgaSwgY291bnQsIHJldDsKKworCXEgPSBtcV9vcGVuKCIvZm9vIiwgT19DUkVBVCB8IE9fUkRPTkxZLCAwNjY2LCBOVUxMKTsKKwlpZiAocSA8IDApIHsKKwkJcGVycm9yKCJtcV9vcGVuIik7CisJCXJldHVybiAtMTsKKwl9CisJbXFfZ2V0YXR0cihxLCAmYXR0cik7CisKKworCWNvdW50ID0gMTAwOworCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmc3RhcnQpOworCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJY2hhciBidWZbYXR0ci5tcV9tc2dzaXplXTsKKworCQljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmbm93KTsKKwkJdGFyZ2V0ID0gbm93OworCQl0YXJnZXQgPSB0aW1lc3BlY19hZGQobm93LCBUQVJHRVRfVElNRU9VVCk7IC8qIDEwMG1zICovCisKKwkJcmV0ID0gbXFfdGltZWRyZWNlaXZlKHEsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIE5VTEwsICZ0YXJnZXQpOworCQlpZiAocmV0IDwgMCAmJiBlcnJubyAhPSBFVElNRURPVVQpIHsKKwkJCXBlcnJvcigibXFfdGltZWRyZWNlaXZlIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZlbmQpOworCisJbXFfY2xvc2UocSk7CisKKwlpZiAoKHRpbWVzcGVjX3N1YihzdGFydCwgZW5kKS9jb3VudCkgPiBUQVJHRVRfVElNRU9VVCArIFVOUkVTT05BQkxFX0xBVEVOQ1kpCisJCXJldHVybiAtMTsKKworCXJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldDsKKworCXByaW50ZigiTXF1ZXVlIGxhdGVuY3kgOiAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CisKKwlyZXQgPSBtcXVldWVfbGF0X3Rlc3QoKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGYoIltGQUlMRURdXG4iKTsKKwkJcmV0dXJuIGtzZnRfZXhpdF9mYWlsKCk7CisJfQorCXByaW50ZigiW09LXVxuIik7CisJcmV0dXJuIGtzZnRfZXhpdF9wYXNzKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvbmFub3NsZWVwLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvbmFub3NsZWVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzYzI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9uYW5vc2xlZXAuYwpAQCAtMCwwICsxLDE3NCBAQAorLyogTWFrZSBzdXJlIHRpbWVycyBkb24ndCByZXR1cm4gZWFybHkKKyAqICAgICAgICAgICAgICBieTogam9obiBzdHVsdHogKGpvaG5zdHVsQHVzLmlibS5jb20pCisgKgkJICAgIEpvaG4gU3R1bHR6IChqb2huLnN0dWx0ekBsaW5hcm8ub3JnKQorICogICAgICAgICAgICAgIChDKSBDb3B5cmlnaHQgSUJNIDIwMTIKKyAqICAgICAgICAgICAgICAoQykgQ29weXJpZ2h0IExpbmFybyAyMDEzIDIwMTUKKyAqICAgICAgICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKiAgVG8gYnVpbGQ6CisgKgkkIGdjYyBuYW5vc2xlZXAuYyAtbyBuYW5vc2xlZXAgLWxydAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWV4Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaWZkZWYgS1RFU1QKKyNpbmNsdWRlICIuLi9rc2VsZnRlc3QuaCIKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfcGFzcyh2b2lkKQoreworCWV4aXQoMCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfZmFpbCh2b2lkKQoreworCWV4aXQoMSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBOU0VDX1BFUl9TRUMgMTAwMDAwMDAwMFVMTAorCisjZGVmaW5lIENMT0NLX1JFQUxUSU1FCQkJMAorI2RlZmluZSBDTE9DS19NT05PVE9OSUMJCQkxCisjZGVmaW5lIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRAkyCisjZGVmaW5lIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lECQkzCisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19SQVcJCTQKKyNkZWZpbmUgQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFCQk1CisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19DT0FSU0UJCTYKKyNkZWZpbmUgQ0xPQ0tfQk9PVFRJTUUJCQk3CisjZGVmaW5lIENMT0NLX1JFQUxUSU1FX0FMQVJNCQk4CisjZGVmaW5lIENMT0NLX0JPT1RUSU1FX0FMQVJNCQk5CisjZGVmaW5lIENMT0NLX0hXU1BFQ0lGSUMJCTEwCisjZGVmaW5lIENMT0NLX1RBSQkJCTExCisjZGVmaW5lIE5SX0NMT0NLSURTCQkJMTIKKworI2RlZmluZSBVTlNVUFBPUlRFRCAweGYwMGYKKworY2hhciAqY2xvY2tzdHJpbmcoaW50IGNsb2NraWQpCit7CisJc3dpdGNoIChjbG9ja2lkKSB7CisJY2FzZSBDTE9DS19SRUFMVElNRToKKwkJcmV0dXJuICJDTE9DS19SRUFMVElNRSI7CisJY2FzZSBDTE9DS19NT05PVE9OSUM6CisJCXJldHVybiAiQ0xPQ0tfTU9OT1RPTklDIjsKKwljYXNlIENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRDoKKwkJcmV0dXJuICJDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQiOworCWNhc2UgQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQ6CisJCXJldHVybiAiQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQiOworCWNhc2UgQ0xPQ0tfTU9OT1RPTklDX1JBVzoKKwkJcmV0dXJuICJDTE9DS19NT05PVE9OSUNfUkFXIjsKKwljYXNlIENMT0NLX1JFQUxUSU1FX0NPQVJTRToKKwkJcmV0dXJuICJDTE9DS19SRUFMVElNRV9DT0FSU0UiOworCWNhc2UgQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRToKKwkJcmV0dXJuICJDTE9DS19NT05PVE9OSUNfQ09BUlNFIjsKKwljYXNlIENMT0NLX0JPT1RUSU1FOgorCQlyZXR1cm4gIkNMT0NLX0JPT1RUSU1FIjsKKwljYXNlIENMT0NLX1JFQUxUSU1FX0FMQVJNOgorCQlyZXR1cm4gIkNMT0NLX1JFQUxUSU1FX0FMQVJNIjsKKwljYXNlIENMT0NLX0JPT1RUSU1FX0FMQVJNOgorCQlyZXR1cm4gIkNMT0NLX0JPT1RUSU1FX0FMQVJNIjsKKwljYXNlIENMT0NLX1RBSToKKwkJcmV0dXJuICJDTE9DS19UQUkiOworCX07CisJcmV0dXJuICJVTktOT1dOX0NMT0NLSUQiOworfQorCisvKiByZXR1cm5zIDEgaWYgYSA8PSBiLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGlubGluZSBpbnQgaW5fb3JkZXIoc3RydWN0IHRpbWVzcGVjIGEsIHN0cnVjdCB0aW1lc3BlYyBiKQoreworCWlmIChhLnR2X3NlYyA8IGIudHZfc2VjKQorCQlyZXR1cm4gMTsKKwlpZiAoYS50dl9zZWMgPiBiLnR2X3NlYykKKwkJcmV0dXJuIDA7CisJaWYgKGEudHZfbnNlYyA+IGIudHZfbnNlYykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCB0aW1lc3BlYyB0aW1lc3BlY19hZGQoc3RydWN0IHRpbWVzcGVjIHRzLCB1bnNpZ25lZCBsb25nIGxvbmcgbnMpCit7CisJdHMudHZfbnNlYyArPSBuczsKKwl3aGlsZSAodHMudHZfbnNlYyA+PSBOU0VDX1BFUl9TRUMpIHsKKwkJdHMudHZfbnNlYyAtPSBOU0VDX1BFUl9TRUM7CisJCXRzLnR2X3NlYysrOworCX0KKwlyZXR1cm4gdHM7Cit9CisKK2ludCBuYW5vc2xlZXBfdGVzdChpbnQgY2xvY2tpZCwgbG9uZyBsb25nIG5zKQoreworCXN0cnVjdCB0aW1lc3BlYyBub3csIHRhcmdldCwgcmVsOworCisJLyogRmlyc3QgY2hlY2sgYWJzIHRpbWUgKi8KKwlpZiAoY2xvY2tfZ2V0dGltZShjbG9ja2lkLCAmbm93KSkKKwkJcmV0dXJuIFVOU1VQUE9SVEVEOworCXRhcmdldCA9IHRpbWVzcGVjX2FkZChub3csIG5zKTsKKworCWlmIChjbG9ja19uYW5vc2xlZXAoY2xvY2tpZCwgVElNRVJfQUJTVElNRSwgJnRhcmdldCwgTlVMTCkpCisJCXJldHVybiBVTlNVUFBPUlRFRDsKKwljbG9ja19nZXR0aW1lKGNsb2NraWQsICZub3cpOworCisJaWYgKCFpbl9vcmRlcih0YXJnZXQsIG5vdykpCisJCXJldHVybiAtMTsKKworCS8qIFNlY29uZCBjaGVjayByZWx0aW1lICovCisJY2xvY2tfZ2V0dGltZShjbG9ja2lkLCAmbm93KTsKKwlyZWwudHZfc2VjID0gMDsKKwlyZWwudHZfbnNlYyA9IDA7CisJcmVsID0gdGltZXNwZWNfYWRkKHJlbCwgbnMpOworCXRhcmdldCA9IHRpbWVzcGVjX2FkZChub3csIG5zKTsKKwljbG9ja19uYW5vc2xlZXAoY2xvY2tpZCwgMCwgJnJlbCwgTlVMTCk7CisJY2xvY2tfZ2V0dGltZShjbG9ja2lkLCAmbm93KTsKKworCWlmICghaW5fb3JkZXIodGFyZ2V0LCBub3cpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlsb25nIGxvbmcgbGVuZ3RoOworCWludCBjbG9ja2lkLCByZXQ7CisKKwlmb3IgKGNsb2NraWQgPSBDTE9DS19SRUFMVElNRTsgY2xvY2tpZCA8IE5SX0NMT0NLSURTOyBjbG9ja2lkKyspIHsKKworCQkvKiBTa2lwIGNwdXRpbWUgY2xvY2tpZHMgc2luY2UgbmFub3NsZWVwIHdvbid0IGluY3JlbWVudCBjcHV0aW1lICovCisJCWlmIChjbG9ja2lkID09IENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCB8fAorCQkJCWNsb2NraWQgPT0gQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQgfHwKKwkJCQljbG9ja2lkID09IENMT0NLX0hXU1BFQ0lGSUMpCisJCQljb250aW51ZTsKKworCQlwcmludGYoIk5hbm9zbGVlcCAlLTMxcyAiLCBjbG9ja3N0cmluZyhjbG9ja2lkKSk7CisKKwkJbGVuZ3RoID0gMTA7CisJCXdoaWxlIChsZW5ndGggPD0gKE5TRUNfUEVSX1NFQyAqIDEwKSkgeworCQkJcmV0ID0gbmFub3NsZWVwX3Rlc3QoY2xvY2tpZCwgbGVuZ3RoKTsKKwkJCWlmIChyZXQgPT0gVU5TVVBQT1JURUQpIHsKKwkJCQlwcmludGYoIltVTlNVUFBPUlRFRF1cbiIpOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJcHJpbnRmKCJbRkFJTEVEXVxuIik7CisJCQkJcmV0dXJuIGtzZnRfZXhpdF9mYWlsKCk7CisJCQl9CisJCQlsZW5ndGggKj0gMTAwOworCQl9CisJCXByaW50ZigiW09LXVxuIik7CituZXh0OgorCQlyZXQgPSAwOworCX0KKwlyZXR1cm4ga3NmdF9leGl0X3Bhc3MoKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9uc2xlZXAtbGF0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvbnNsZWVwLWxhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzg5OGYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvbnNsZWVwLWxhdC5jCkBAIC0wLDAgKzEsMTkwIEBACisvKiBNZWFzdXJlIG5hbm9zbGVlcCB0aW1lciBsYXRlbmN5CisgKiAgICAgICAgICAgICAgYnk6IGpvaG4gc3R1bHR6IChqb2huLnN0dWx0ekBsaW5hcm8ub3JnKQorICoJCShDKSBDb3B5cmlnaHQgTGluYXJvIDIwMTMKKyAqICAgICAgICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKiAgVG8gYnVpbGQ6CisgKgkkIGdjYyBuc2xlZXAtbGF0LmMgLW8gbnNsZWVwLWxhdCAtbHJ0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpZmRlZiBLVEVTVAorI2luY2x1ZGUgIi4uL2tzZWxmdGVzdC5oIgorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGtzZnRfZXhpdF9wYXNzKHZvaWQpCit7CisJZXhpdCgwKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGtzZnRfZXhpdF9mYWlsKHZvaWQpCit7CisJZXhpdCgxKTsKK30KKyNlbmRpZgorCisjZGVmaW5lIE5TRUNfUEVSX1NFQyAxMDAwMDAwMDAwVUxMCisKKyNkZWZpbmUgVU5SRVNPTkFCTEVfTEFURU5DWSA0MDAwMDAwMCAvKiA0MG1zIGluIG5hbm9zZWNzICovCisKKworI2RlZmluZSBDTE9DS19SRUFMVElNRQkJCTAKKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDCQkJMQorI2RlZmluZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQJMgorI2RlZmluZSBDTE9DS19USFJFQURfQ1BVVElNRV9JRAkJMworI2RlZmluZSBDTE9DS19NT05PVE9OSUNfUkFXCQk0CisjZGVmaW5lIENMT0NLX1JFQUxUSU1FX0NPQVJTRQkJNQorI2RlZmluZSBDTE9DS19NT05PVE9OSUNfQ09BUlNFCQk2CisjZGVmaW5lIENMT0NLX0JPT1RUSU1FCQkJNworI2RlZmluZSBDTE9DS19SRUFMVElNRV9BTEFSTQkJOAorI2RlZmluZSBDTE9DS19CT09UVElNRV9BTEFSTQkJOQorI2RlZmluZSBDTE9DS19IV1NQRUNJRklDCQkxMAorI2RlZmluZSBDTE9DS19UQUkJCQkxMQorI2RlZmluZSBOUl9DTE9DS0lEUwkJCTEyCisKKyNkZWZpbmUgVU5TVVBQT1JURUQgMHhmMDBmCisKK2NoYXIgKmNsb2Nrc3RyaW5nKGludCBjbG9ja2lkKQoreworCXN3aXRjaCAoY2xvY2tpZCkgeworCWNhc2UgQ0xPQ0tfUkVBTFRJTUU6CisJCXJldHVybiAiQ0xPQ0tfUkVBTFRJTUUiOworCWNhc2UgQ0xPQ0tfTU9OT1RPTklDOgorCQlyZXR1cm4gIkNMT0NLX01PTk9UT05JQyI7CisJY2FzZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQ6CisJCXJldHVybiAiQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEIjsKKwljYXNlIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEOgorCQlyZXR1cm4gIkNMT0NLX1RIUkVBRF9DUFVUSU1FX0lEIjsKKwljYXNlIENMT0NLX01PTk9UT05JQ19SQVc6CisJCXJldHVybiAiQ0xPQ0tfTU9OT1RPTklDX1JBVyI7CisJY2FzZSBDTE9DS19SRUFMVElNRV9DT0FSU0U6CisJCXJldHVybiAiQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFIjsKKwljYXNlIENMT0NLX01PTk9UT05JQ19DT0FSU0U6CisJCXJldHVybiAiQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRSI7CisJY2FzZSBDTE9DS19CT09UVElNRToKKwkJcmV0dXJuICJDTE9DS19CT09UVElNRSI7CisJY2FzZSBDTE9DS19SRUFMVElNRV9BTEFSTToKKwkJcmV0dXJuICJDTE9DS19SRUFMVElNRV9BTEFSTSI7CisJY2FzZSBDTE9DS19CT09UVElNRV9BTEFSTToKKwkJcmV0dXJuICJDTE9DS19CT09UVElNRV9BTEFSTSI7CisJY2FzZSBDTE9DS19UQUk6CisJCXJldHVybiAiQ0xPQ0tfVEFJIjsKKwl9OworCXJldHVybiAiVU5LTk9XTl9DTE9DS0lEIjsKK30KKworc3RydWN0IHRpbWVzcGVjIHRpbWVzcGVjX2FkZChzdHJ1Y3QgdGltZXNwZWMgdHMsIHVuc2lnbmVkIGxvbmcgbG9uZyBucykKK3sKKwl0cy50dl9uc2VjICs9IG5zOworCXdoaWxlICh0cy50dl9uc2VjID49IE5TRUNfUEVSX1NFQykgeworCQl0cy50dl9uc2VjIC09IE5TRUNfUEVSX1NFQzsKKwkJdHMudHZfc2VjKys7CisJfQorCXJldHVybiB0czsKK30KKworCitsb25nIGxvbmcgdGltZXNwZWNfc3ViKHN0cnVjdCB0aW1lc3BlYyBhLCBzdHJ1Y3QgdGltZXNwZWMgYikKK3sKKwlsb25nIGxvbmcgcmV0ID0gTlNFQ19QRVJfU0VDICogYi50dl9zZWMgKyBiLnR2X25zZWM7CisKKwlyZXQgLT0gTlNFQ19QRVJfU0VDICogYS50dl9zZWMgKyBhLnR2X25zZWM7CisJcmV0dXJuIHJldDsKK30KKworaW50IG5hbm9zbGVlcF9sYXRfdGVzdChpbnQgY2xvY2tpZCwgbG9uZyBsb25nIG5zKQoreworCXN0cnVjdCB0aW1lc3BlYyBzdGFydCwgZW5kLCB0YXJnZXQ7CisJbG9uZyBsb25nIGxhdGVuY3kgPSAwOworCWludCBpLCBjb3VudDsKKworCXRhcmdldC50dl9zZWMgPSBucy9OU0VDX1BFUl9TRUM7CisJdGFyZ2V0LnR2X25zZWMgPSBucyVOU0VDX1BFUl9TRUM7CisKKwlpZiAoY2xvY2tfZ2V0dGltZShjbG9ja2lkLCAmc3RhcnQpKQorCQlyZXR1cm4gVU5TVVBQT1JURUQ7CisJaWYgKGNsb2NrX25hbm9zbGVlcChjbG9ja2lkLCAwLCAmdGFyZ2V0LCBOVUxMKSkKKwkJcmV0dXJuIFVOU1VQUE9SVEVEOworCisJY291bnQgPSAxMDsKKworCS8qIEZpcnN0IGNoZWNrIHJlbGF0aXZlIGxhdGVuY3kgKi8KKwljbG9ja19nZXR0aW1lKGNsb2NraWQsICZzdGFydCk7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCWNsb2NrX25hbm9zbGVlcChjbG9ja2lkLCAwLCAmdGFyZ2V0LCBOVUxMKTsKKwljbG9ja19nZXR0aW1lKGNsb2NraWQsICZlbmQpOworCisJaWYgKCgodGltZXNwZWNfc3ViKHN0YXJ0LCBlbmQpL2NvdW50KS1ucykgPiBVTlJFU09OQUJMRV9MQVRFTkNZKSB7CisJCXByaW50ZigiTGFyZ2UgcmVsIGxhdGVuY3k6ICVsbGQgbnMgOiIsICh0aW1lc3BlY19zdWIoc3RhcnQsIGVuZCkvY291bnQpLW5zKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIE5leHQgY2hlY2sgYWJzb2x1dGUgbGF0ZW5jeSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWNsb2NrX2dldHRpbWUoY2xvY2tpZCwgJnN0YXJ0KTsKKwkJdGFyZ2V0ID0gdGltZXNwZWNfYWRkKHN0YXJ0LCBucyk7CisJCWNsb2NrX25hbm9zbGVlcChjbG9ja2lkLCBUSU1FUl9BQlNUSU1FLCAmdGFyZ2V0LCBOVUxMKTsKKwkJY2xvY2tfZ2V0dGltZShjbG9ja2lkLCAmZW5kKTsKKwkJbGF0ZW5jeSArPSB0aW1lc3BlY19zdWIodGFyZ2V0LCBlbmQpOworCX0KKworCWlmIChsYXRlbmN5L2NvdW50ID4gVU5SRVNPTkFCTEVfTEFURU5DWSkgeworCQlwcmludGYoIkxhcmdlIGFicyBsYXRlbmN5OiAlbGxkIG5zIDoiLCBsYXRlbmN5L2NvdW50KTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWxvbmcgbG9uZyBsZW5ndGg7CisJaW50IGNsb2NraWQsIHJldDsKKworCWZvciAoY2xvY2tpZCA9IENMT0NLX1JFQUxUSU1FOyBjbG9ja2lkIDwgTlJfQ0xPQ0tJRFM7IGNsb2NraWQrKykgeworCisJCS8qIFNraXAgY3B1dGltZSBjbG9ja2lkcyBzaW5jZSBuYW5vc2xlZXAgd29uJ3QgaW5jcmVtZW50IGNwdXRpbWUgKi8KKwkJaWYgKGNsb2NraWQgPT0gQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEIHx8CisJCQkJY2xvY2tpZCA9PSBDTE9DS19USFJFQURfQ1BVVElNRV9JRCB8fAorCQkJCWNsb2NraWQgPT0gQ0xPQ0tfSFdTUEVDSUZJQykKKwkJCWNvbnRpbnVlOworCisJCXByaW50ZigibnNsZWVwIGxhdGVuY3kgJS0yNnMgIiwgY2xvY2tzdHJpbmcoY2xvY2tpZCkpOworCisJCWxlbmd0aCA9IDEwOworCQl3aGlsZSAobGVuZ3RoIDw9IChOU0VDX1BFUl9TRUMgKiAxMCkpIHsKKwkJCXJldCA9IG5hbm9zbGVlcF9sYXRfdGVzdChjbG9ja2lkLCBsZW5ndGgpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCWxlbmd0aCAqPSAxMDA7CisKKwkJfQorCisJCWlmIChyZXQgPT0gVU5TVVBQT1JURUQpIHsKKwkJCXByaW50ZigiW1VOU1VQUE9SVEVEXVxuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocmV0IDwgMCkgeworCQkJcHJpbnRmKCJbRkFJTEVEXVxuIik7CisJCQlyZXR1cm4ga3NmdF9leGl0X2ZhaWwoKTsKKwkJfQorCQlwcmludGYoIltPS11cbiIpOworCX0KKwlyZXR1cm4ga3NmdF9leGl0X3Bhc3MoKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9wb3NpeF90aW1lcnMuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9wb3NpeF90aW1lcnMuYwppbmRleCBmODdkOTcwLi41YTI0NmEwIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvcG9zaXhfdGltZXJzLmMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3Bvc2l4X3RpbWVycy5jCkBAIC0zNSwxMCArMzUsMTEgQEAKIHN0YXRpYyB2b2lkIGtlcm5lbF9sb29wKHZvaWQpCiB7CiAJdm9pZCAqYWRkciA9IHNicmsoMCk7CisJaW50IGVyciA9IDA7CiAKLQl3aGlsZSAoIWRvbmUpIHsKLQkJYnJrKGFkZHIgKyA0MDk2KTsKLQkJYnJrKGFkZHIpOworCXdoaWxlICghZG9uZSAmJiAhZXJyKSB7CisJCWVyciA9IGJyayhhZGRyICsgNDA5Nik7CisJCWVyciB8PSBicmsoYWRkcik7CiAJfQogfQogCkBAIC0xOTAsOCArMTkxLDYgQEAKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotCWludCBlcnI7Ci0KIAlwcmludGYoIlRlc3RpbmcgcG9zaXggdGltZXJzLiBGYWxzZSBuZWdhdGl2ZSBtYXkgaGFwcGVuIG9uIENQVSBleGVjdXRpb24gXG4iKTsKIAlwcmludGYoImJhc2VkIHRpbWVycyBpZiBvdGhlciB0aHJlYWRzIHJ1biBvbiB0aGUgQ1BVLi4uXG4iKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3Jhd19za2V3LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvcmF3X3NrZXcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDkwNmJmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3Jhd19za2V3LmMKQEAgLTAsMCArMSwxNTQgQEAKKy8qIENMT0NLX01PTk9UT05JQyB2cyBDTE9DS19NT05PVE9OSUNfUkFXIHNrZXcgdGVzdAorICoJCWJ5OiBqb2huIHN0dWx0eiAoam9obnN0dWxAdXMuaWJtLmNvbSkKKyAqCQkgICAgSm9obiBTdHVsdHogPGpvaG4uc3R1bHR6QGxpbmFyby5vcmc+CisgKgkJKEMpIENvcHlyaWdodCBJQk0gMjAxMgorICoJCShDKSBDb3B5cmlnaHQgTGluYXJvIExpbWl0ZWQgMjAxNQorICoJCUxpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MgorICoKKyAqICBUbyBidWlsZDoKKyAqCSQgZ2NjIHJhd19za2V3LmMgLW8gcmF3X3NrZXcgLWxydAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXguaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaWZkZWYgS1RFU1QKKyNpbmNsdWRlICIuLi9rc2VsZnRlc3QuaCIKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfcGFzcyh2b2lkKQoreworCWV4aXQoMCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfZmFpbCh2b2lkKQoreworCWV4aXQoMSk7Cit9CisjZW5kaWYKKworCisjZGVmaW5lIENMT0NLX01PTk9UT05JQ19SQVcJCTQKKyNkZWZpbmUgTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDBMTAorCisjZGVmaW5lIHNoaWZ0X3JpZ2h0KHgsIHMpICh7CQlcCisJX190eXBlb2ZfXyh4KSBfX3ggPSAoeCk7CVwKKwlfX3R5cGVvZl9fKHMpIF9fcyA9IChzKTsJXAorCV9feCA8IDAgPyAtKC1fX3ggPj4gX19zKSA6IF9feCA+PiBfX3M7IFwKK30pCisKK2xvbmcgbG9uZyBsbGFicyhsb25nIGxvbmcgdmFsKQoreworCWlmICh2YWwgPCAwKQorCQl2YWwgPSAtdmFsOworCXJldHVybiB2YWw7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyB0c190b19uc2VjKHN0cnVjdCB0aW1lc3BlYyB0cykKK3sKKwlyZXR1cm4gdHMudHZfc2VjICogTlNFQ19QRVJfU0VDICsgdHMudHZfbnNlYzsKK30KKworc3RydWN0IHRpbWVzcGVjIG5zZWNfdG9fdHMobG9uZyBsb25nIG5zKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKworCXRzLnR2X3NlYyA9IG5zL05TRUNfUEVSX1NFQzsKKwl0cy50dl9uc2VjID0gbnMlTlNFQ19QRVJfU0VDOworCXJldHVybiB0czsKK30KKworbG9uZyBsb25nIGRpZmZfdGltZXNwZWMoc3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBzdHJ1Y3QgdGltZXNwZWMgZW5kKQoreworCWxvbmcgbG9uZyBzdGFydF9ucywgZW5kX25zOworCisJc3RhcnRfbnMgPSB0c190b19uc2VjKHN0YXJ0KTsKKwllbmRfbnMgPSB0c190b19uc2VjKGVuZCk7CisJcmV0dXJuIGVuZF9ucyAtIHN0YXJ0X25zOworfQorCit2b2lkIGdldF9tb25vdG9uaWNfYW5kX3JhdyhzdHJ1Y3QgdGltZXNwZWMgKm1vbiwgc3RydWN0IHRpbWVzcGVjICpyYXcpCit7CisJc3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBtaWQsIGVuZDsKKwlsb25nIGxvbmcgZGlmZiA9IDAsIHRtcDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJbG9uZyBsb25nIG5ld2RpZmY7CisKKwkJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZzdGFydCk7CisJCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDX1JBVywgJm1pZCk7CisJCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmZW5kKTsKKworCQluZXdkaWZmID0gZGlmZl90aW1lc3BlYyhzdGFydCwgZW5kKTsKKwkJaWYgKGRpZmYgPT0gMCB8fCBuZXdkaWZmIDwgZGlmZikgeworCQkJZGlmZiA9IG5ld2RpZmY7CisJCQkqcmF3ID0gbWlkOworCQkJdG1wID0gKHRzX3RvX25zZWMoc3RhcnQpICsgdHNfdG9fbnNlYyhlbmQpKS8yOworCQkJKm1vbiA9IG5zZWNfdG9fdHModG1wKTsKKwkJfQorCX0KK30KKworaW50IG1haW4oaW50IGFyZ3YsIGNoYXIgKiphcmdjKQoreworCXN0cnVjdCB0aW1lc3BlYyBtb24sIHJhdywgc3RhcnQsIGVuZDsKKwlsb25nIGxvbmcgZGVsdGExLCBkZWx0YTIsIGludGVydmFsLCBlcHBtLCBwcG07CisJc3RydWN0IHRpbWV4IHR4MSwgdHgyOworCisJc2V0YnVmKHN0ZG91dCwgTlVMTCk7CisKKwlpZiAoY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUNfUkFXLCAmcmF3KSkgeworCQlwcmludGYoIkVSUjogTk8gQ0xPQ0tfTU9OT1RPTklDX1JBV1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl0eDEubW9kZXMgPSAwOworCWFkanRpbWV4KCZ0eDEpOworCWdldF9tb25vdG9uaWNfYW5kX3JhdygmbW9uLCAmcmF3KTsKKwlzdGFydCA9IG1vbjsKKwlkZWx0YTEgPSBkaWZmX3RpbWVzcGVjKG1vbiwgcmF3KTsKKworCWlmICh0eDEub2Zmc2V0KQorCQlwcmludGYoIldBUk5JTkc6IEFESl9PRkZTRVQgaW4gcHJvZ3Jlc3MsIHRoaXMgd2lsbCBjYXVzZSBpbmFjY3VyYXRlIHJlc3VsdHNcbiIpOworCisJcHJpbnRmKCJFc3RpbWF0aW5nIGNsb2NrIGRyaWZ0OiAiKTsKKwlzbGVlcCgxMjApOworCisJZ2V0X21vbm90b25pY19hbmRfcmF3KCZtb24sICZyYXcpOworCWVuZCA9IG1vbjsKKwl0eDIubW9kZXMgPSAwOworCWFkanRpbWV4KCZ0eDIpOworCWRlbHRhMiA9IGRpZmZfdGltZXNwZWMobW9uLCByYXcpOworCisJaW50ZXJ2YWwgPSBkaWZmX3RpbWVzcGVjKHN0YXJ0LCBlbmQpOworCisJLyogY2FsY3VsYXRlIG1lYXN1cmVkIHBwbSBiZXR3ZWVuIE1PTk9UT05JQyBhbmQgTU9OT1RPTklDX1JBVyAqLworCWVwcG0gPSAoKGRlbHRhMi1kZWx0YTEpKk5TRUNfUEVSX1NFQykvaW50ZXJ2YWw7CisJZXBwbSA9IC1lcHBtOworCXByaW50ZigiJWxsZC4laShlc3QpIiwgZXBwbS8xMDAwLCBhYnMoKGludCkoZXBwbSUxMDAwKSkpOworCisJLyogQXZnIHRoZSB0d28gYWN0dWFsIGZyZXEgc2FtcGxlcyBhZGp0aW1leCBnYXZlIHVzICovCisJcHBtID0gKHR4MS5mcmVxICsgdHgyLmZyZXEpICogMTAwMCAvIDI7CisJcHBtID0gKGxvbmcgbG9uZyl0eDEuZnJlcSAqIDEwMDA7CisJcHBtID0gc2hpZnRfcmlnaHQocHBtLCAxNik7CisJcHJpbnRmKCIgJWxsZC4laShhY3QpIiwgcHBtLzEwMDAsIGFicygoaW50KShwcG0lMTAwMCkpKTsKKworCWlmIChsbGFicyhlcHBtIC0gcHBtKSA+IDEwMDApIHsKKwkJcHJpbnRmKCIJW0ZBSUxFRF1cbiIpOworCQlyZXR1cm4ga3NmdF9leGl0X2ZhaWwoKTsKKwl9CisJcHJpbnRmKCIJW09LXVxuIik7CisJcmV0dXJuICBrc2Z0X2V4aXRfcGFzcygpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3J0Y3Rlc3QuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9ydGN0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwYWU4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9ydGN0ZXN0LmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiAgICAgIFJlYWwgVGltZSBDbG9jayBEcml2ZXIgVGVzdC9FeGFtcGxlIFByb2dyYW0KKyAqCisgKiAgICAgIENvbXBpbGUgd2l0aDoKKyAqCQkgICAgIGdjYyAtcyAtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIHJ0Y3Rlc3QuYyAtbyBydGN0ZXN0CisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTYsIFBhdWwgR29ydG1ha2VyLgorICoKKyAqICAgICAgUmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIsCisgKiAgICAgIGluY2x1ZGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisKKy8qCisgKiBUaGlzIGV4cGVjdHMgdGhlIG5ldyBSVEMgY2xhc3MgZHJpdmVyIGZyYW1ld29yaywgd29ya2luZyB3aXRoCisgKiBjbG9ja3MgdGhhdCB3aWxsIG9mdGVuIG5vdCBiZSBjbG9uZXMgb2Ygd2hhdCB0aGUgUEMtQVQgaGFkLgorICogVXNlIHRoZSBjb21tYW5kIGxpbmUgdG8gc3BlY2lmeSBhbm90aGVyIFJUQyBpZiB5b3UgbmVlZCBvbmUuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRfcnRjW10gPSAiL2Rldi9ydGMwIjsKKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIGZkLCByZXR2YWwsIGlycWNvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIHRtcCwgZGF0YTsKKwlzdHJ1Y3QgcnRjX3RpbWUgcnRjX3RtOworCWNvbnN0IGNoYXIgKnJ0YyA9IGRlZmF1bHRfcnRjOworCXN0cnVjdCB0aW1ldmFsIHN0YXJ0LCBlbmQsIGRpZmY7CisKKwlzd2l0Y2ggKGFyZ2MpIHsKKwljYXNlIDI6CisJCXJ0YyA9IGFyZ3ZbMV07CisJCS8qIEZBTExUSFJPVUdIICovCisJY2FzZSAxOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiAgcnRjdGVzdCBbcnRjZGV2XVxuIik7CisJCXJldHVybiAxOworCX0KKworCWZkID0gb3BlbihydGMsIE9fUkRPTkxZKTsKKworCWlmIChmZCA9PSAgLTEpIHsKKwkJcGVycm9yKHJ0Yyk7CisJCWV4aXQoZXJybm8pOworCX0KKworCWZwcmludGYoc3RkZXJyLCAiXG5cdFx0XHRSVEMgRHJpdmVyIFRlc3QgRXhhbXBsZS5cblxuIik7CisKKwkvKiBUdXJuIG9uIHVwZGF0ZSBpbnRlcnJ1cHRzIChvbmUgcGVyIHNlY29uZCkgKi8KKwlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX1VJRV9PTiwgMCk7CisJaWYgKHJldHZhbCA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRU5PVFRZKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiXG4uLi5VcGRhdGUgSVJRcyBub3Qgc3VwcG9ydGVkLlxuIik7CisJCQlnb3RvIHRlc3RfUkVBRDsKKwkJfQorCQlwZXJyb3IoIlJUQ19VSUVfT04gaW9jdGwiKTsKKwkJZXhpdChlcnJubyk7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJDb3VudGluZyA1IHVwZGF0ZSAoMS9zZWMpIGludGVycnVwdHMgZnJvbSByZWFkaW5nICVzOiIsCisJCQlydGMpOworCWZmbHVzaChzdGRlcnIpOworCWZvciAoaT0xOyBpPDY7IGkrKykgeworCQkvKiBUaGlzIHJlYWQgd2lsbCBibG9jayAqLworCQlyZXR2YWwgPSByZWFkKGZkLCAmZGF0YSwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwkJaWYgKHJldHZhbCA9PSAtMSkgeworCQkJcGVycm9yKCJyZWFkIik7CisJCQlleGl0KGVycm5vKTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIiAlZCIsaSk7CisJCWZmbHVzaChzdGRlcnIpOworCQlpcnFjb3VudCsrOworCX0KKworCWZwcmludGYoc3RkZXJyLCAiXG5BZ2FpbiwgZnJvbSB1c2luZyBzZWxlY3QoMikgb24gL2Rldi9ydGM6Iik7CisJZmZsdXNoKHN0ZGVycik7CisJZm9yIChpPTE7IGk8NjsgaSsrKSB7CisJCXN0cnVjdCB0aW1ldmFsIHR2ID0gezUsIDB9OyAgICAgLyogNSBzZWNvbmQgdGltZW91dCBvbiBzZWxlY3QgKi8KKwkJZmRfc2V0IHJlYWRmZHM7CisKKwkJRkRfWkVSTygmcmVhZGZkcyk7CisJCUZEX1NFVChmZCwgJnJlYWRmZHMpOworCQkvKiBUaGUgc2VsZWN0IHdpbGwgd2FpdCB1bnRpbCBhbiBSVEMgaW50ZXJydXB0IGhhcHBlbnMuICovCisJCXJldHZhbCA9IHNlbGVjdChmZCsxLCAmcmVhZGZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKwkJaWYgKHJldHZhbCA9PSAtMSkgeworCQkgICAgICAgIHBlcnJvcigic2VsZWN0Iik7CisJCSAgICAgICAgZXhpdChlcnJubyk7CisJCX0KKwkJLyogVGhpcyByZWFkIHdvbid0IGJsb2NrIHVubGlrZSB0aGUgc2VsZWN0LWxlc3MgY2FzZSBhYm92ZS4gKi8KKwkJcmV0dmFsID0gcmVhZChmZCwgJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJICAgICAgICBwZXJyb3IoInJlYWQiKTsKKwkJICAgICAgICBleGl0KGVycm5vKTsKKwkJfQorCQlmcHJpbnRmKHN0ZGVyciwgIiAlZCIsaSk7CisJCWZmbHVzaChzdGRlcnIpOworCQlpcnFjb3VudCsrOworCX0KKworCS8qIFR1cm4gb2ZmIHVwZGF0ZSBpbnRlcnJ1cHRzICovCisJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19VSUVfT0ZGLCAwKTsKKwlpZiAocmV0dmFsID09IC0xKSB7CisJCXBlcnJvcigiUlRDX1VJRV9PRkYgaW9jdGwiKTsKKwkJZXhpdChlcnJubyk7CisJfQorCit0ZXN0X1JFQUQ6CisJLyogUmVhZCB0aGUgUlRDIHRpbWUvZGF0ZSAqLworCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfUkRfVElNRSwgJnJ0Y190bSk7CisJaWYgKHJldHZhbCA9PSAtMSkgeworCQlwZXJyb3IoIlJUQ19SRF9USU1FIGlvY3RsIik7CisJCWV4aXQoZXJybm8pOworCX0KKworCWZwcmludGYoc3RkZXJyLCAiXG5cbkN1cnJlbnQgUlRDIGRhdGUvdGltZSBpcyAlZC0lZC0lZCwgJTAyZDolMDJkOiUwMmQuXG4iLAorCQlydGNfdG0udG1fbWRheSwgcnRjX3RtLnRtX21vbiArIDEsIHJ0Y190bS50bV95ZWFyICsgMTkwMCwKKwkJcnRjX3RtLnRtX2hvdXIsIHJ0Y190bS50bV9taW4sIHJ0Y190bS50bV9zZWMpOworCisJLyogU2V0IHRoZSBhbGFybSB0byA1IHNlYyBpbiB0aGUgZnV0dXJlLCBhbmQgY2hlY2sgZm9yIHJvbGxvdmVyICovCisJcnRjX3RtLnRtX3NlYyArPSA1OworCWlmIChydGNfdG0udG1fc2VjID49IDYwKSB7CisJCXJ0Y190bS50bV9zZWMgJT0gNjA7CisJCXJ0Y190bS50bV9taW4rKzsKKwl9CisJaWYgKHJ0Y190bS50bV9taW4gPT0gNjApIHsKKwkJcnRjX3RtLnRtX21pbiA9IDA7CisJCXJ0Y190bS50bV9ob3VyKys7CisJfQorCWlmIChydGNfdG0udG1faG91ciA9PSAyNCkKKwkJcnRjX3RtLnRtX2hvdXIgPSAwOworCisJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19BTE1fU0VULCAmcnRjX3RtKTsKKwlpZiAocmV0dmFsID09IC0xKSB7CisJCWlmIChlcnJubyA9PSBFTk9UVFkpIHsKKwkJCWZwcmludGYoc3RkZXJyLAorCQkJCSJcbi4uLkFsYXJtIElSUXMgbm90IHN1cHBvcnRlZC5cbiIpOworCQkJZ290byB0ZXN0X1BJRTsKKwkJfQorCQlwZXJyb3IoIlJUQ19BTE1fU0VUIGlvY3RsIik7CisJCWV4aXQoZXJybm8pOworCX0KKworCS8qIFJlYWQgdGhlIGN1cnJlbnQgYWxhcm0gc2V0dGluZ3MgKi8KKwlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX0FMTV9SRUFELCAmcnRjX3RtKTsKKwlpZiAocmV0dmFsID09IC0xKSB7CisJCXBlcnJvcigiUlRDX0FMTV9SRUFEIGlvY3RsIik7CisJCWV4aXQoZXJybm8pOworCX0KKworCWZwcmludGYoc3RkZXJyLCAiQWxhcm0gdGltZSBub3cgc2V0IHRvICUwMmQ6JTAyZDolMDJkLlxuIiwKKwkJcnRjX3RtLnRtX2hvdXIsIHJ0Y190bS50bV9taW4sIHJ0Y190bS50bV9zZWMpOworCisJLyogRW5hYmxlIGFsYXJtIGludGVycnVwdHMgKi8KKwlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX0FJRV9PTiwgMCk7CisJaWYgKHJldHZhbCA9PSAtMSkgeworCQlwZXJyb3IoIlJUQ19BSUVfT04gaW9jdGwiKTsKKwkJZXhpdChlcnJubyk7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJXYWl0aW5nIDUgc2Vjb25kcyBmb3IgYWxhcm0uLi4iKTsKKwlmZmx1c2goc3RkZXJyKTsKKwkvKiBUaGlzIGJsb2NrcyB1bnRpbCB0aGUgYWxhcm0gcmluZyBjYXVzZXMgYW4gaW50ZXJydXB0ICovCisJcmV0dmFsID0gcmVhZChmZCwgJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJaWYgKHJldHZhbCA9PSAtMSkgeworCQlwZXJyb3IoInJlYWQiKTsKKwkJZXhpdChlcnJubyk7CisJfQorCWlycWNvdW50Kys7CisJZnByaW50ZihzdGRlcnIsICIgb2theS4gQWxhcm0gcmFuZy5cbiIpOworCisJLyogRGlzYWJsZSBhbGFybSBpbnRlcnJ1cHRzICovCisJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19BSUVfT0ZGLCAwKTsKKwlpZiAocmV0dmFsID09IC0xKSB7CisJCXBlcnJvcigiUlRDX0FJRV9PRkYgaW9jdGwiKTsKKwkJZXhpdChlcnJubyk7CisJfQorCit0ZXN0X1BJRToKKwkvKiBSZWFkIHBlcmlvZGljIElSUSByYXRlICovCisJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19JUlFQX1JFQUQsICZ0bXApOworCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJLyogbm90IGFsbCBSVENzIHN1cHBvcnQgcGVyaW9kaWMgSVJRcyAqLworCQlpZiAoZXJybm8gPT0gRU5PVFRZKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuTm8gcGVyaW9kaWMgSVJRIHN1cHBvcnRcbiIpOworCQkJZ290byBkb25lOworCQl9CisJCXBlcnJvcigiUlRDX0lSUVBfUkVBRCBpb2N0bCIpOworCQlleGl0KGVycm5vKTsKKwl9CisJZnByaW50ZihzdGRlcnIsICJcblBlcmlvZGljIElSUSByYXRlIGlzICVsZEh6LlxuIiwgdG1wKTsKKworCWZwcmludGYoc3RkZXJyLCAiQ291bnRpbmcgMjAgaW50ZXJydXB0cyBhdDoiKTsKKwlmZmx1c2goc3RkZXJyKTsKKworCS8qIFRoZSBmcmVxdWVuY2llcyAxMjhIeiwgMjU2SHosIC4uLiA4MTkySHogYXJlIG9ubHkgYWxsb3dlZCBmb3Igcm9vdC4gKi8KKwlmb3IgKHRtcD0yOyB0bXA8PTY0OyB0bXAqPTIpIHsKKworCQlyZXR2YWwgPSBpb2N0bChmZCwgUlRDX0lSUVBfU0VULCB0bXApOworCQlpZiAocmV0dmFsID09IC0xKSB7CisJCQkvKiBub3QgYWxsIFJUQ3MgY2FuIGNoYW5nZSB0aGVpciBwZXJpb2RpYyBJUlEgcmF0ZSAqLworCQkJaWYgKGVycm5vID09IEVOT1RUWSkgeworCQkJCWZwcmludGYoc3RkZXJyLAorCQkJCQkiXG4uLi5QZXJpb2RpYyBJUlEgcmF0ZSBpcyBmaXhlZFxuIik7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJcGVycm9yKCJSVENfSVJRUF9TRVQgaW9jdGwiKTsKKwkJCWV4aXQoZXJybm8pOworCQl9CisKKwkJZnByaW50ZihzdGRlcnIsICJcbiVsZEh6Olx0IiwgdG1wKTsKKwkJZmZsdXNoKHN0ZGVycik7CisKKwkJLyogRW5hYmxlIHBlcmlvZGljIGludGVycnVwdHMgKi8KKwkJcmV0dmFsID0gaW9jdGwoZmQsIFJUQ19QSUVfT04sIDApOworCQlpZiAocmV0dmFsID09IC0xKSB7CisJCQlwZXJyb3IoIlJUQ19QSUVfT04gaW9jdGwiKTsKKwkJCWV4aXQoZXJybm8pOworCQl9CisKKwkJZm9yIChpPTE7IGk8MjE7IGkrKykgeworCQkJZ2V0dGltZW9mZGF5KCZzdGFydCwgTlVMTCk7CisJCQkvKiBUaGlzIGJsb2NrcyAqLworCQkJcmV0dmFsID0gcmVhZChmZCwgJmRhdGEsIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisJCQlpZiAocmV0dmFsID09IC0xKSB7CisJCQkJcGVycm9yKCJyZWFkIik7CisJCQkJZXhpdChlcnJubyk7CisJCQl9CisJCQlnZXR0aW1lb2ZkYXkoJmVuZCwgTlVMTCk7CisJCQl0aW1lcnN1YigmZW5kLCAmc3RhcnQsICZkaWZmKTsKKwkJCWlmIChkaWZmLnR2X3NlYyA+IDAgfHwKKwkJCSAgICBkaWZmLnR2X3VzZWMgPiAoKDEwMDAwMDBMIC8gdG1wKSAqIDEuMTApKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJcblBJRSBkZWx0YSBlcnJvcjogJWxkLiUwNmxkIHNob3VsZCBiZSBjbG9zZSB0byAwLiUwNmxkXG4iLAorCQkJCSAgICAgICBkaWZmLnR2X3NlYywgZGlmZi50dl91c2VjLAorCQkJCSAgICAgICAoMTAwMDAwMEwgLyB0bXApKTsKKwkJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKworCQkJZnByaW50ZihzdGRlcnIsICIgJWQiLGkpOworCQkJZmZsdXNoKHN0ZGVycik7CisJCQlpcnFjb3VudCsrOworCQl9CisKKwkJLyogRGlzYWJsZSBwZXJpb2RpYyBpbnRlcnJ1cHRzICovCisJCXJldHZhbCA9IGlvY3RsKGZkLCBSVENfUElFX09GRiwgMCk7CisJCWlmIChyZXR2YWwgPT0gLTEpIHsKKwkJCXBlcnJvcigiUlRDX1BJRV9PRkYgaW9jdGwiKTsKKwkJCWV4aXQoZXJybm8pOworCQl9CisJfQorCitkb25lOgorCWZwcmludGYoc3RkZXJyLCAiXG5cblx0XHRcdCAqKiogVGVzdCBjb21wbGV0ZSAqKipcbiIpOworCisJY2xvc2UoZmQpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvc2V0LTIwMzguYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9zZXQtMjAzOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YTdlMTQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvc2V0LTIwMzguYwpAQCAtMCwwICsxLDE0NCBAQAorLyogVGltZSBib3VuZHMgc2V0dGluZyB0ZXN0CisgKgkJYnk6IGpvaG4gc3R1bHR6IChqb2huc3R1bEB1cy5pYm0uY29tKQorICoJCShDKSBDb3B5cmlnaHQgSUJNIDIwMTIKKyAqCQlMaWNlbnNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKiAgTk9URTogVGhpcyBpcyBhIG1ldGEtdGVzdCB3aGljaCBzZXRzIHRoZSB0aW1lIHRvIGVkZ2UgY2FzZXMgdGhlbgorICogIHVzZXMgb3RoZXIgdGVzdHMgdG8gZGV0ZWN0IHByb2JsZW1zLiBUaHVzIHRoaXMgdGVzdCByZXF1aXJlcyB0aGF0CisgKiAgdGhlIGluY29uc2lzdGVuY3ktY2hlY2sgYW5kIG5hbm9zbGVlcCB0ZXN0cyBiZSBwcmVzZW50IGluIHRoZSBzYW1lCisgKiAgZGlyZWN0b3J5IGl0IGlzIHJ1biBmcm9tLgorICoKKyAqICBUbyBidWlsZDoKKyAqCSQgZ2NjIHNldC0yMDM4LmMgLW8gc2V0LTIwMzggLWxydAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaWZkZWYgS1RFU1QKKyNpbmNsdWRlICIuLi9rc2VsZnRlc3QuaCIKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfcGFzcyh2b2lkKQoreworCWV4aXQoMCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfZmFpbCh2b2lkKQoreworCWV4aXQoMSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBOU0VDX1BFUl9TRUMgMTAwMDAwMDAwMExMCisKKyNkZWZpbmUgS1RJTUVfTUFYCSgobG9uZyBsb25nKX4oKHVuc2lnbmVkIGxvbmcgbG9uZykxIDw8IDYzKSkKKyNkZWZpbmUgS1RJTUVfU0VDX01BWAkoS1RJTUVfTUFYIC8gTlNFQ19QRVJfU0VDKQorCisjZGVmaW5lIFlFQVJfMTkwMSAoLTB4N2ZmZmZmZmZMKQorI2RlZmluZSBZRUFSXzE5NzAgMQorI2RlZmluZSBZRUFSXzIwMzggMHg3ZmZmZmZmZkwJCQkvKm92ZXJmbG93cyAzMmJpdCB0aW1lX3QgKi8KKyNkZWZpbmUgWUVBUl8yMjYyIEtUSU1FX1NFQ19NQVgJCQkvKm92ZXJmbG93cyA2NGJpdCBrdGltZV90ICovCisjZGVmaW5lIFlFQVJfTUFYICAoKGxvbmcgbG9uZykoKDFVTEw8PDYzKS0xKSkJLypvdmVyZmxvd3MgNjRiaXQgdGltZV90ICovCisKK2ludCBpczMyYml0cyh2b2lkKQoreworCXJldHVybiAoc2l6ZW9mKGxvbmcpID09IDQpOworfQorCitpbnQgc2V0dGltZShsb25nIGxvbmcgdGltZSkKK3sKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisJaW50IHJldDsKKworCW5vdy50dl9zZWMgPSAodGltZV90KXRpbWU7CisJbm93LnR2X3VzZWMgID0gMDsKKworCXJldCA9IHNldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKworCXByaW50ZigiU2V0dGluZyB0aW1lIHRvIDB4JWx4OiAlZFxuIiwgKGxvbmcpdGltZSwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZG9fdGVzdHModm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3lzdGVtKCJkYXRlIik7CisJcmV0ID0gc3lzdGVtKCIuL2luY29uc2lzdGVuY3ktY2hlY2sgLWMgMCAtdCAyMCIpOworCXJldCB8PSBzeXN0ZW0oIi4vbmFub3NsZWVwIik7CisJcmV0IHw9IHN5c3RlbSgiLi9uc2xlZXAtbGF0Iik7CisJcmV0dXJuIHJldDsKKworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCByZXQgPSAwOworCWludCBvcHQsIGRhbmdlcm91cyA9IDA7CisJdGltZV90IHN0YXJ0OworCisJLyogUHJvY2VzcyBhcmd1bWVudHMgKi8KKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiZCIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKG9wdCkgeworCQljYXNlICdkJzoKKwkJCWRhbmdlcm91cyA9IDE7CisJCX0KKwl9CisKKwlzdGFydCA9IHRpbWUoMCk7CisKKwkvKiBGaXJzdCB0ZXN0IHRoYXQgY3JhenkgdmFsdWVzIGRvbid0IHdvcmsgKi8KKwlpZiAoIXNldHRpbWUoWUVBUl8xOTAxKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCWlmICghc2V0dGltZShZRUFSX01BWCkpIHsKKwkJcmV0ID0gLTE7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoIWlzMzJiaXRzKCkgJiYgIXNldHRpbWUoWUVBUl8yMjYyKSkgeworCQlyZXQgPSAtMTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogTm93IHRlc3QgYmVoYXZpb3IgbmVhciBlZGdlcyAqLworCXNldHRpbWUoWUVBUl8xOTcwKTsKKwlyZXQgPSBkb190ZXN0cygpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJc2V0dGltZShZRUFSXzIwMzggLSA2MDApOworCXJldCA9IGRvX3Rlc3RzKCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBUaGUgcmVzdCBvZiB0aGUgdGVzdHMgY2FuIGJsb3d1cCBvbiAzMmJpdCBzeXN0ZW1zICovCisJaWYgKGlzMzJiaXRzKCkgJiYgIWRhbmdlcm91cykKKwkJZ290byBvdXQ7CisJLyogVGVzdCByb2xsb3ZlciBiZWhhdmlvciAzMmJpdCBlZGdlICovCisJc2V0dGltZShZRUFSXzIwMzggLSAxMCk7CisJcmV0ID0gZG9fdGVzdHMoKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXNldHRpbWUoWUVBUl8yMjYyIC0gNjAwKTsKKwlyZXQgPSBkb190ZXN0cygpOworCitvdXQ6CisJLyogcmVzdG9yZSBjbG9jayAqLworCXNldHRpbWUoc3RhcnQpOworCWlmIChyZXQpCisJCXJldHVybiBrc2Z0X2V4aXRfZmFpbCgpOworCXJldHVybiBrc2Z0X2V4aXRfcGFzcygpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3NldC10YWkuYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9zZXQtdGFpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4OGRiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9zZXQtdGFpLmMKQEAgLTAsMCArMSw3OSBAQAorLyogU2V0IHRhaSBvZmZzZXQKKyAqICAgICAgICAgICAgICBieTogSm9obiBTdHVsdHogPGpvaG4uc3R1bHR6QGxpbmFyby5vcmc+CisgKiAgICAgICAgICAgICAgKEMpIENvcHlyaWdodCBMaW5hcm8gMjAxMworICogICAgICAgICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEx2MgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZXguaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZmRlZiBLVEVTVAorI2luY2x1ZGUgIi4uL2tzZWxmdGVzdC5oIgorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGtzZnRfZXhpdF9wYXNzKHZvaWQpCit7CisJZXhpdCgwKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IGtzZnRfZXhpdF9mYWlsKHZvaWQpCit7CisJZXhpdCgxKTsKK30KKyNlbmRpZgorCitpbnQgc2V0X3RhaShpbnQgb2Zmc2V0KQoreworCXN0cnVjdCB0aW1leCB0eDsKKworCW1lbXNldCgmdHgsIDAsIHNpemVvZih0eCkpOworCisJdHgubW9kZXMgPSBBREpfVEFJOworCXR4LmNvbnN0YW50ID0gb2Zmc2V0OworCisJcmV0dXJuIGFkanRpbWV4KCZ0eCk7Cit9CisKK2ludCBnZXRfdGFpKHZvaWQpCit7CisJc3RydWN0IHRpbWV4IHR4OworCisJbWVtc2V0KCZ0eCwgMCwgc2l6ZW9mKHR4KSk7CisKKwlhZGp0aW1leCgmdHgpOworCXJldHVybiB0eC50YWk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgcmV0OworCisJcmV0ID0gZ2V0X3RhaSgpOworCXByaW50ZigidGFpIG9mZnNldCBzdGFydGVkIGF0ICVpXG4iLCByZXQpOworCisJcHJpbnRmKCJDaGVja2luZyB0YWkgb2Zmc2V0cyBjYW4gYmUgcHJvcGVybHkgc2V0OiAiKTsKKwlmb3IgKGkgPSAxOyBpIDw9IDYwOyBpKyspIHsKKwkJcmV0ID0gc2V0X3RhaShpKTsKKwkJcmV0ID0gZ2V0X3RhaSgpOworCQlpZiAocmV0ICE9IGkpIHsKKwkJCXByaW50ZigiW0ZBSUxFRF0gZXhwZWN0ZWQ6ICVpIGdvdCAlaVxuIiwgaSwgcmV0KTsKKwkJCXJldHVybiBrc2Z0X2V4aXRfZmFpbCgpOworCQl9CisJfQorCXByaW50ZigiW09LXVxuIik7CisJcmV0dXJuIGtzZnRfZXhpdF9wYXNzKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvc2V0LXRpbWVyLWxhdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3NldC10aW1lci1sYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmM5OGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3NldC10aW1lci1sYXQuYwpAQCAtMCwwICsxLDIxNiBAQAorLyogc2V0X3RpbWVyIGxhdGVuY3kgdGVzdAorICoJCUpvaG4gU3R1bHR6IChqb2huLnN0dWx0ekBsaW5hcm8ub3JnKQorICogICAgICAgICAgICAgIChDKSBDb3B5cmlnaHQgTGluYXJvIDIwMTQKKyAqICAgICAgICAgICAgICBMaWNlbnNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKiAgIFRoaXMgdGVzdCBtYWtlcyBzdXJlIHRoZSBzZXRfdGltZXIgYXBpIGlzIGNvcnJlY3QKKyAqCisgKiAgVG8gYnVpbGQ6CisgKgkkIGdjYyBzZXQtdGltZXItbGF0LmMgLW8gc2V0LXRpbWVyLWxhdCAtbHJ0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaWZkZWYgS1RFU1QKKyNpbmNsdWRlICIuLi9rc2VsZnRlc3QuaCIKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfcGFzcyh2b2lkKQoreworCWV4aXQoMCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfZmFpbCh2b2lkKQoreworCWV4aXQoMSk7Cit9CisjZW5kaWYKKworI2RlZmluZSBDTE9DS19SRUFMVElNRQkJCTAKKyNkZWZpbmUgQ0xPQ0tfTU9OT1RPTklDCQkJMQorI2RlZmluZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQJMgorI2RlZmluZSBDTE9DS19USFJFQURfQ1BVVElNRV9JRAkJMworI2RlZmluZSBDTE9DS19NT05PVE9OSUNfUkFXCQk0CisjZGVmaW5lIENMT0NLX1JFQUxUSU1FX0NPQVJTRQkJNQorI2RlZmluZSBDTE9DS19NT05PVE9OSUNfQ09BUlNFCQk2CisjZGVmaW5lIENMT0NLX0JPT1RUSU1FCQkJNworI2RlZmluZSBDTE9DS19SRUFMVElNRV9BTEFSTQkJOAorI2RlZmluZSBDTE9DS19CT09UVElNRV9BTEFSTQkJOQorI2RlZmluZSBDTE9DS19IV1NQRUNJRklDCQkxMAorI2RlZmluZSBDTE9DS19UQUkJCQkxMQorI2RlZmluZSBOUl9DTE9DS0lEUwkJCTEyCisKKworI2RlZmluZSBOU0VDX1BFUl9TRUMgMTAwMDAwMDAwMFVMTAorI2RlZmluZSBVTlJFU09OQUJMRV9MQVRFTkNZIDQwMDAwMDAwIC8qIDQwbXMgaW4gbmFub3NlY3MgKi8KKworI2RlZmluZSBUSU1FUl9TRUNTIDEKK2ludCBhbGFybWNvdW50OworaW50IGNsb2NrX2lkOworc3RydWN0IHRpbWVzcGVjIHN0YXJ0X3RpbWU7Citsb25nIGxvbmcgbWF4X2xhdGVuY3lfbnM7CisKK2NoYXIgKmNsb2Nrc3RyaW5nKGludCBjbG9ja2lkKQoreworCXN3aXRjaCAoY2xvY2tpZCkgeworCWNhc2UgQ0xPQ0tfUkVBTFRJTUU6CisJCXJldHVybiAiQ0xPQ0tfUkVBTFRJTUUiOworCWNhc2UgQ0xPQ0tfTU9OT1RPTklDOgorCQlyZXR1cm4gIkNMT0NLX01PTk9UT05JQyI7CisJY2FzZSBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQ6CisJCXJldHVybiAiQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lEIjsKKwljYXNlIENMT0NLX1RIUkVBRF9DUFVUSU1FX0lEOgorCQlyZXR1cm4gIkNMT0NLX1RIUkVBRF9DUFVUSU1FX0lEIjsKKwljYXNlIENMT0NLX01PTk9UT05JQ19SQVc6CisJCXJldHVybiAiQ0xPQ0tfTU9OT1RPTklDX1JBVyI7CisJY2FzZSBDTE9DS19SRUFMVElNRV9DT0FSU0U6CisJCXJldHVybiAiQ0xPQ0tfUkVBTFRJTUVfQ09BUlNFIjsKKwljYXNlIENMT0NLX01PTk9UT05JQ19DT0FSU0U6CisJCXJldHVybiAiQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRSI7CisJY2FzZSBDTE9DS19CT09UVElNRToKKwkJcmV0dXJuICJDTE9DS19CT09UVElNRSI7CisJY2FzZSBDTE9DS19SRUFMVElNRV9BTEFSTToKKwkJcmV0dXJuICJDTE9DS19SRUFMVElNRV9BTEFSTSI7CisJY2FzZSBDTE9DS19CT09UVElNRV9BTEFSTToKKwkJcmV0dXJuICJDTE9DS19CT09UVElNRV9BTEFSTSI7CisJY2FzZSBDTE9DS19UQUk6CisJCXJldHVybiAiQ0xPQ0tfVEFJIjsKKwl9OworCXJldHVybiAiVU5LTk9XTl9DTE9DS0lEIjsKK30KKworCitsb25nIGxvbmcgdGltZXNwZWNfc3ViKHN0cnVjdCB0aW1lc3BlYyBhLCBzdHJ1Y3QgdGltZXNwZWMgYikKK3sKKwlsb25nIGxvbmcgcmV0ID0gTlNFQ19QRVJfU0VDICogYi50dl9zZWMgKyBiLnR2X25zZWM7CisKKwlyZXQgLT0gTlNFQ19QRVJfU0VDICogYS50dl9zZWMgKyBhLnR2X25zZWM7CisJcmV0dXJuIHJldDsKK30KKworCit2b2lkIHNpZ2FsYXJtKGludCBzaWdubykKK3sKKwlsb25nIGxvbmcgZGVsdGFfbnM7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJY2xvY2tfZ2V0dGltZShjbG9ja19pZCwgJnRzKTsKKwlhbGFybWNvdW50Kys7CisKKwlkZWx0YV9ucyA9IHRpbWVzcGVjX3N1YihzdGFydF90aW1lLCB0cyk7CisJZGVsdGFfbnMgLT0gTlNFQ19QRVJfU0VDICogVElNRVJfU0VDUyAqIGFsYXJtY291bnQ7CisKKwlpZiAoZGVsdGFfbnMgPCAwKQorCQlwcmludGYoIiVzIHRpbWVyIGZpcmVkIGVhcmx5OiBGQUlMXG4iLCBjbG9ja3N0cmluZyhjbG9ja19pZCkpOworCisJaWYgKGRlbHRhX25zID4gbWF4X2xhdGVuY3lfbnMpCisJCW1heF9sYXRlbmN5X25zID0gZGVsdGFfbnM7Cit9CisKK2ludCBkb190aW1lcihpbnQgY2xvY2tfaWQsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc2lnZXZlbnQgc2U7CisJdGltZXJfdCB0bTE7CisJc3RydWN0IGl0aW1lcnNwZWMgaXRzMSwgaXRzMjsKKwlpbnQgZXJyOworCisJLyogU2V0IHVwIHRpbWVyOiAqLworCW1lbXNldCgmc2UsIDAsIHNpemVvZihzZSkpOworCXNlLnNpZ2V2X25vdGlmeSA9IFNJR0VWX1NJR05BTDsKKwlzZS5zaWdldl9zaWdubyA9IFNJR1JUTUFYOworCXNlLnNpZ2V2X3ZhbHVlLnNpdmFsX2ludCA9IDA7CisKKwltYXhfbGF0ZW5jeV9ucyA9IDA7CisJYWxhcm1jb3VudCA9IDA7CisKKwllcnIgPSB0aW1lcl9jcmVhdGUoY2xvY2tfaWQsICZzZSwgJnRtMSk7CisJaWYgKGVycikgeworCQlpZiAoKGNsb2NrX2lkID09IENMT0NLX1JFQUxUSU1FX0FMQVJNKSB8fAorCQkgICAgKGNsb2NrX2lkID09IENMT0NLX0JPT1RUSU1FX0FMQVJNKSkgeworCQkJcHJpbnRmKCIlLTIycyAlcyBtaXNzaW5nIENBUF9XQUtFX0FMQVJNPyAgICA6IFtVTlNVUFBPUlRFRF1cbiIsCisJCQkJCWNsb2Nrc3RyaW5nKGNsb2NrX2lkKSwKKwkJCQkJZmxhZ3MgPyAiQUJTVElNRSI6IlJFTFRJTUUiKTsKKwkJCXJldHVybiAwOworCQl9CisJCXByaW50ZigiJXMgLSB0aW1lcl9jcmVhdGUoKSBmYWlsZWRcbiIsIGNsb2Nrc3RyaW5nKGNsb2NrX2lkKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwljbG9ja19nZXR0aW1lKGNsb2NrX2lkLCAmc3RhcnRfdGltZSk7CisJaWYgKGZsYWdzKSB7CisJCWl0czEuaXRfdmFsdWUgPSBzdGFydF90aW1lOworCQlpdHMxLml0X3ZhbHVlLnR2X3NlYyArPSBUSU1FUl9TRUNTOworCX0gZWxzZSB7CisJCWl0czEuaXRfdmFsdWUudHZfc2VjID0gVElNRVJfU0VDUzsKKwkJaXRzMS5pdF92YWx1ZS50dl9uc2VjID0gMDsKKwl9CisJaXRzMS5pdF9pbnRlcnZhbC50dl9zZWMgPSBUSU1FUl9TRUNTOworCWl0czEuaXRfaW50ZXJ2YWwudHZfbnNlYyA9IDA7CisKKwllcnIgPSB0aW1lcl9zZXR0aW1lKHRtMSwgZmxhZ3MsICZpdHMxLCAmaXRzMik7CisJaWYgKGVycikgeworCQlwcmludGYoIiVzIC0gdGltZXJfc2V0dGltZSgpIGZhaWxlZFxuIiwgY2xvY2tzdHJpbmcoY2xvY2tfaWQpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXdoaWxlIChhbGFybWNvdW50IDwgNSkKKwkJc2xlZXAoMSk7CisKKwlwcmludGYoIiUtMjJzICVzIG1heCBsYXRlbmN5OiAlMTBsbGQgbnMgOiAiLAorCQkJY2xvY2tzdHJpbmcoY2xvY2tfaWQpLAorCQkJZmxhZ3MgPyAiQUJTVElNRSI6IlJFTFRJTUUiLAorCQkJbWF4X2xhdGVuY3lfbnMpOworCisJdGltZXJfZGVsZXRlKHRtMSk7CisJaWYgKG1heF9sYXRlbmN5X25zIDwgVU5SRVNPTkFCTEVfTEFURU5DWSkgeworCQlwcmludGYoIltPS11cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJcHJpbnRmKCJbRkFJTEVEXVxuIik7CisJcmV0dXJuIC0xOworfQorCitpbnQgbWFpbih2b2lkKQoreworCXN0cnVjdCBzaWdhY3Rpb24gYWN0OworCWludCBzaWdudW0gPSBTSUdSVE1BWDsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFNldCB1cCBzaWduYWwgaGFuZGxlcjogKi8KKwlzaWdmaWxsc2V0KCZhY3Quc2FfbWFzayk7CisJYWN0LnNhX2ZsYWdzID0gMDsKKwlhY3Quc2FfaGFuZGxlciA9IHNpZ2FsYXJtOworCXNpZ2FjdGlvbihzaWdudW0sICZhY3QsIE5VTEwpOworCisJcHJpbnRmKCJTZXR0aW5nIHRpbWVycyBmb3IgZXZlcnkgJWkgc2Vjb25kc1xuIiwgVElNRVJfU0VDUyk7CisJZm9yIChjbG9ja19pZCA9IDA7IGNsb2NrX2lkIDwgTlJfQ0xPQ0tJRFM7IGNsb2NrX2lkKyspIHsKKworCQlpZiAoKGNsb2NrX2lkID09IENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCkgfHwKKwkJCQkoY2xvY2tfaWQgPT0gQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQpIHx8CisJCQkJKGNsb2NrX2lkID09IENMT0NLX01PTk9UT05JQ19SQVcpIHx8CisJCQkJKGNsb2NrX2lkID09IENMT0NLX1JFQUxUSU1FX0NPQVJTRSkgfHwKKwkJCQkoY2xvY2tfaWQgPT0gQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRSkgfHwKKwkJCQkoY2xvY2tfaWQgPT0gQ0xPQ0tfSFdTUEVDSUZJQykpCisJCQljb250aW51ZTsKKworCQlyZXQgfD0gZG9fdGltZXIoY2xvY2tfaWQsIFRJTUVSX0FCU1RJTUUpOworCQlyZXQgfD0gZG9fdGltZXIoY2xvY2tfaWQsIDApOworCX0KKwlpZiAocmV0KQorCQlyZXR1cm4ga3NmdF9leGl0X2ZhaWwoKTsKKwlyZXR1cm4ga3NmdF9leGl0X3Bhc3MoKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy9za2V3X2NvbnNpc3RlbmN5LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvc2tld19jb25zaXN0ZW5jeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NjJmODQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvc2tld19jb25zaXN0ZW5jeS5jCkBAIC0wLDAgKzEsODkgQEAKKy8qIEFESl9GUkVRIFNrZXcgY29uc2lzdGVuY3kgdGVzdAorICoJCWJ5OiBqb2huIHN0dWx0eiAoam9obnN0dWxAdXMuaWJtLmNvbSkKKyAqCQkoQykgQ29weXJpZ2h0IElCTSAyMDEyCisgKgkJTGljZW5zZWQgdW5kZXIgdGhlIEdQTHYyCisgKgorICogIE5PVEU6IFRoaXMgaXMgYSBtZXRhLXRlc3Qgd2hpY2ggY3JhbmtzIHRoZSBBREpfRlJFUSBrbm9iIGJhY2sKKyAqICBhbmQgZm9ydGggYW5kIHdhdGNoZXMgZm9yIGNvbnNpc3RlbmN5IHByb2JsZW1zLiBUaHVzIHRoaXMgdGVzdCByZXF1aXJlcworICogIHRoYXQgdGhlIGluY29uc2lzdGVuY3ktY2hlY2sgdGVzdHMgYmUgcHJlc2VudCBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgaXQKKyAqICBpcyBydW4gZnJvbS4KKyAqCisgKiAgVG8gYnVpbGQ6CisgKgkkIGdjYyBza2V3X2NvbnNpc3RlbmN5LmMgLW8gc2tld19jb25zaXN0ZW5jeSAtbHJ0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWV4Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2lmZGVmIEtURVNUCisjaW5jbHVkZSAiLi4va3NlbGZ0ZXN0LmgiCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQga3NmdF9leGl0X3Bhc3Modm9pZCkKK3sKKwlleGl0KDApOworfQorc3RhdGljIGlubGluZSBpbnQga3NmdF9leGl0X2ZhaWwodm9pZCkKK3sKKwlleGl0KDEpOworfQorI2VuZGlmCisKKyNkZWZpbmUgTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDBMTAorCitpbnQgbWFpbihpbnQgYXJndiwgY2hhciAqKmFyZ2MpCit7CisJc3RydWN0IHRpbWV4IHR4OworCWludCByZXQsIHBwbTsKKwlwaWRfdCBwaWQ7CisKKworCXByaW50ZigiUnVubmluZyBBc3luY3Job25vdXMgRnJlcXVlbmN5IENoYW5naW5nIFRlc3RzLi4uXG4iKTsKKworCXBpZCA9IGZvcmsoKTsKKwlpZiAoIXBpZCkKKwkJcmV0dXJuIHN5c3RlbSgiLi9pbmNvbnNpc3RlbmN5LWNoZWNrIC1jIDEgLXQgNjAwIik7CisKKwlwcG0gPSA1MDA7CisJcmV0ID0gMDsKKworCXdoaWxlIChwaWQgIT0gd2FpdHBpZChwaWQsICZyZXQsIFdOT0hBTkcpKSB7CisJCXBwbSA9IC1wcG07CisJCXR4Lm1vZGVzID0gQURKX0ZSRVFVRU5DWTsKKwkJdHguZnJlcSA9IHBwbSA8PCAxNjsKKwkJYWRqdGltZXgoJnR4KTsKKwkJdXNsZWVwKDUwMDAwMCk7CisJfQorCisJLyogU2V0IHRoaW5ncyBiYWNrICovCisJdHgubW9kZXMgPSBBREpfRlJFUVVFTkNZOworCXR4Lm9mZnNldCA9IDA7CisJYWRqdGltZXgoJnR4KTsKKworCisJaWYgKHJldCkgeworCQlwcmludGYoIltGQUlMRURdXG4iKTsKKwkJcmV0dXJuIGtzZnRfZXhpdF9mYWlsKCk7CisJfQorCXByaW50ZigiW09LXVxuIik7CisJcmV0dXJuIGtzZnRfZXhpdF9wYXNzKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvdGhyZWFkdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3RocmVhZHRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjMyZTExCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdGltZXJzL3RocmVhZHRlc3QuYwpAQCAtMCwwICsxLDIwNCBAQAorLyogdGhyZWFkdGVzdC5jCisgKgkJYnk6IGpvaG4gc3R1bHR6IChqb2huc3R1bEB1cy5pYm0uY29tKQorICoJCShDKSBDb3B5cmlnaHQgSUJNIDIwMDQsIDIwMDUsIDIwMDYsIDIwMTIKKyAqCQlMaWNlbnNlZCB1bmRlciB0aGUgR1BMdjIKKyAqCisgKiAgVG8gYnVpbGQ6CisgKgkkIGdjYyB0aHJlYWR0ZXN0LmMgLW8gdGhyZWFkdGVzdCAtbHJ0CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaWZkZWYgS1RFU1QKKyNpbmNsdWRlICIuLi9rc2VsZnRlc3QuaCIKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfcGFzcyh2b2lkKQoreworCWV4aXQoMCk7Cit9CitzdGF0aWMgaW5saW5lIGludCBrc2Z0X2V4aXRfZmFpbCh2b2lkKQoreworCWV4aXQoMSk7Cit9CisjZW5kaWYKKworCisvKiBzZXJpYWxpemVzIHNoYXJlZCBsaXN0IGFjY2VzcyAqLworcHRocmVhZF9tdXRleF90IGxpc3RfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisvKiBzZXJpYWxpemVzIGNvbnNvbGUgb3V0cHV0ICovCitwdGhyZWFkX211dGV4X3QgcHJpbnRfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKKworI2RlZmluZSBNQVhfVEhSRUFEUyAxMjgKKyNkZWZpbmUgTElTVFNJWkUgMTI4CisKK2ludCBkb25lID0gMDsKKworc3RydWN0IHRpbWVzcGVjIGdsb2JhbF9saXN0W0xJU1RTSVpFXTsKK2ludCBsaXN0Y291bnQgPSAwOworCisKK3ZvaWQgY2hlY2tsaXN0KHN0cnVjdCB0aW1lc3BlYyAqbGlzdCwgaW50IHNpemUpCit7CisJaW50IGksIGo7CisJc3RydWN0IHRpbWVzcGVjICphLCAqYjsKKworCS8qIHNjYW4gdGhlIGxpc3QgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZS0xOyBpKyspIHsKKwkJYSA9ICZsaXN0W2ldOworCQliID0gJmxpc3RbaSsxXTsKKworCQkvKiBsb29rIGZvciBhbnkgdGltZSBpbmNvbnNpc3RlbmNpZXMgKi8KKwkJaWYgKChiLT50dl9zZWMgPD0gYS0+dHZfc2VjKSAmJgorCQkJKGItPnR2X25zZWMgPCBhLT50dl9uc2VjKSkgeworCisJCQkvKiBmbGFnIG90aGVyIHRocmVhZHMgKi8KKwkJCWRvbmUgPSAxOworCisJCQkvKnNlcmlhbGl6ZSBwcmludGluZyB0byBhdm9pZCBqdW5reSBvdXRwdXQqLworCQkJcHRocmVhZF9tdXRleF9sb2NrKCZwcmludF9sb2NrKTsKKworCQkJLyogZHVtcCB0aGUgbGlzdCAqLworCQkJcHJpbnRmKCJcbiIpOworCQkJZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgeworCQkJCWlmIChqID09IGkpCisJCQkJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJCQlwcmludGYoIiVsdTolbHVcbiIsIGxpc3Rbal0udHZfc2VjLCBsaXN0W2pdLnR2X25zZWMpOworCQkJCWlmIChqID09IGkrMSkKKwkJCQkJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS1cbiIpOworCQkJfQorCQkJcHJpbnRmKCJbRkFJTEVEXVxuIik7CisKKwkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwcmludF9sb2NrKTsKKwkJfQorCX0KK30KKworLyogVGhlIHNoYXJlZCB0aHJlYWQgc2hhcmVzIGEgZ2xvYmFsIGxpc3QKKyAqIHRoYXQgZWFjaCB0aHJlYWQgZmlsbHMgd2hpbGUgaG9sZGluZyB0aGUgbG9jay4KKyAqIFRoaXMgc3RyZXNzZXMgY2xvY2sgc3luY3Jvbml6YXRpb24gYWNyb3NzIGNwdXMuCisgKi8KK3ZvaWQgKnNoYXJlZF90aHJlYWQodm9pZCAqYXJnKQoreworCXdoaWxlICghZG9uZSkgeworCQkvKiBwcm90ZWN0IHRoZSBsaXN0ICovCisJCXB0aHJlYWRfbXV0ZXhfbG9jaygmbGlzdF9sb2NrKTsKKworCQkvKiBzZWUgaWYgd2UncmUgcmVhZHkgdG8gY2hlY2sgdGhlIGxpc3QgKi8KKwkJaWYgKGxpc3Rjb3VudCA+PSBMSVNUU0laRSkgeworCQkJY2hlY2tsaXN0KGdsb2JhbF9saXN0LCBMSVNUU0laRSk7CisJCQlsaXN0Y291bnQgPSAwOworCQl9CisJCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmZ2xvYmFsX2xpc3RbbGlzdGNvdW50KytdKTsKKworCQlwdGhyZWFkX211dGV4X3VubG9jaygmbGlzdF9sb2NrKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyogRWFjaCBpbmRlcGVuZGVudCB0aHJlYWQgZmlsbHMgaW4gaXRzIG93bgorICogbGlzdC4gVGhpcyBzdHJlc3NlcyBjbG9ja19nZXR0aW1lKCkgbG9jayBjb250ZW50aW9uLgorICovCit2b2lkICppbmRlcGVuZGVudF90aHJlYWQodm9pZCAqYXJnKQoreworCXN0cnVjdCB0aW1lc3BlYyBteV9saXN0W0xJU1RTSVpFXTsKKwlpbnQgY291bnQ7CisKKwl3aGlsZSAoIWRvbmUpIHsKKwkJLyogZmlsbCB0aGUgbGlzdCAqLworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBMSVNUU0laRTsgY291bnQrKykKKwkJCWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmbXlfbGlzdFtjb3VudF0pOworCQljaGVja2xpc3QobXlfbGlzdCwgTElTVFNJWkUpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2RlZmluZSBERUZBVUxUX1RIUkVBRF9DT1VOVCA4CisjZGVmaW5lIERFRkFVTFRfUlVOVElNRSAzMAorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHRocmVhZF9jb3VudCwgaTsKKwl0aW1lX3Qgc3RhcnQsIG5vdywgcnVudGltZTsKKwljaGFyIGJ1ZlsyNTVdOworCXB0aHJlYWRfdCBwdGhbTUFYX1RIUkVBRFNdOworCWludCBvcHQ7CisJdm9pZCAqdHJldDsKKwlpbnQgcmV0ID0gMDsKKwl2b2lkICooKnRocmVhZCkodm9pZCAqKSA9IHNoYXJlZF90aHJlYWQ7CisKKwl0aHJlYWRfY291bnQgPSBERUZBVUxUX1RIUkVBRF9DT1VOVDsKKwlydW50aW1lID0gREVGQVVMVF9SVU5USU1FOworCisJLyogUHJvY2VzcyBhcmd1bWVudHMgKi8KKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAidDpuOmkiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChvcHQpIHsKKwkJY2FzZSAndCc6CisJCQlydW50aW1lID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJdGhyZWFkX2NvdW50ID0gYXRvaShvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJdGhyZWFkID0gaW5kZXBlbmRlbnRfdGhyZWFkOworCQkJcHJpbnRmKCJ1c2luZyBpbmRlcGVuZGVudCB0aHJlYWRzXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJVc2FnZTogJXMgWy10IDxzZWNzPl0gWy1uIDxudW10aHJlYWRzPl0gWy1pXVxuIiwgYXJndlswXSk7CisJCQlwcmludGYoIgktdDogdGltZSB0byBydW5cbiIpOworCQkJcHJpbnRmKCIJLW46IG51bWJlciBvZiB0aHJlYWRzXG4iKTsKKwkJCXByaW50ZigiCS1pOiB1c2UgaW5kZXBlbmRlbnQgdGhyZWFkc1xuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlpZiAodGhyZWFkX2NvdW50ID4gTUFYX1RIUkVBRFMpCisJCXRocmVhZF9jb3VudCA9IE1BWF9USFJFQURTOworCisKKwlzZXRidWYoc3Rkb3V0LCBOVUxMKTsKKworCXN0YXJ0ID0gdGltZSgwKTsKKwlzdHJmdGltZShidWYsIDI1NSwgIiVhLCAlZCAlYiAlWSAlVCAleiIsIGxvY2FsdGltZSgmc3RhcnQpKTsKKwlwcmludGYoIiVzXG4iLCBidWYpOworCXByaW50ZigiVGVzdGluZyBjb25zaXN0ZW5jeSB3aXRoICVpIHRocmVhZHMgZm9yICVsZCBzZWNvbmRzOiAiLCB0aHJlYWRfY291bnQsIHJ1bnRpbWUpOworCisJLyogc3Bhd24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGhyZWFkX2NvdW50OyBpKyspCisJCXB0aHJlYWRfY3JlYXRlKCZwdGhbaV0sIDAsIHRocmVhZCwgMCk7CisKKwl3aGlsZSAodGltZSgmbm93KSA8IHN0YXJ0ICsgcnVudGltZSkgeworCQlzbGVlcCgxKTsKKwkJaWYgKGRvbmUpIHsKKwkJCXJldCA9IDE7CisJCQlzdHJmdGltZShidWYsIDI1NSwgIiVhLCAlZCAlYiAlWSAlVCAleiIsIGxvY2FsdGltZSgmbm93KSk7CisJCQlwcmludGYoIiVzXG4iLCBidWYpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJcHJpbnRmKCJbT0tdXG4iKTsKKwlkb25lID0gMTsKKworb3V0OgorCS8qIHdhaXQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGhyZWFkX2NvdW50OyBpKyspCisJCXB0aHJlYWRfam9pbihwdGhbaV0sICZ0cmV0KTsKKworCS8qIGRpZSAqLworCWlmIChyZXQpCisJCWtzZnRfZXhpdF9mYWlsKCk7CisJcmV0dXJuIGtzZnRfZXhpdF9wYXNzKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvdmFsaWQtYWRqdGltZXguYyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3RpbWVycy92YWxpZC1hZGp0aW1leC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NmQ5MzcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy90aW1lcnMvdmFsaWQtYWRqdGltZXguYwpAQCAtMCwwICsxLDIwMiBAQAorLyogdmFsaWQgYWRqdGltZXggdGVzdAorICogICAgICAgICAgICAgIGJ5OiBKb2huIFN0dWx0eiA8am9obi5zdHVsdHpAbGluYXJvLm9yZz4KKyAqICAgICAgICAgICAgICAoQykgQ29weXJpZ2h0IExpbmFybyAyMDE1CisgKiAgICAgICAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEdQTHYyCisgKgorICogIFRoaXMgdGVzdCB2YWxpZGF0ZXMgYWRqdGltZXggaW50ZXJmYWNlIHdpdGggdmFsaWQKKyAqICBhbmQgaW52YWxpZCB0ZXN0IGRhdGEuCisgKgorICogIFVzYWdlOiB2YWxpZC1hZGp0aW1leAorICoKKyAqICBUbyBidWlsZDoKKyAqCSQgZ2NjIHZhbGlkLWFkanRpbWV4LmMgLW8gdmFsaWQtYWRqdGltZXggLWxydAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1leC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmZGVmIEtURVNUCisjaW5jbHVkZSAiLi4va3NlbGZ0ZXN0LmgiCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQga3NmdF9leGl0X3Bhc3Modm9pZCkKK3sKKwlleGl0KDApOworfQorc3RhdGljIGlubGluZSBpbnQga3NmdF9leGl0X2ZhaWwodm9pZCkKK3sKKwlleGl0KDEpOworfQorI2VuZGlmCisKKyNkZWZpbmUgTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDBMCisKKy8qIGNsZWFyIE5UUCB0aW1lX3N0YXR1cyAmIHRpbWVfc3RhdGUgKi8KK2ludCBjbGVhcl90aW1lX3N0YXRlKHZvaWQpCit7CisJc3RydWN0IHRpbWV4IHR4OworCWludCByZXQ7CisKKwl0eC5tb2RlcyA9IEFESl9TVEFUVVM7CisJdHguc3RhdHVzID0gMDsKKwlyZXQgPSBhZGp0aW1leCgmdHgpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgTlVNX0ZSRVFfVkFMSUQgMzIKKyNkZWZpbmUgTlVNX0ZSRVFfT1VUT0ZSQU5HRSA0CisjZGVmaW5lIE5VTV9GUkVRX0lOVkFMSUQgMgorCitsb25nIHZhbGlkX2ZyZXFbTlVNX0ZSRVFfVkFMSURdID0geworCS00OTk8PDE2LAorCS00NTA8PDE2LAorCS00MDA8PDE2LAorCS0zNTA8PDE2LAorCS0zMDA8PDE2LAorCS0yNTA8PDE2LAorCS0yMDA8PDE2LAorCS0xNTA8PDE2LAorCS0xMDA8PDE2LAorCS03NTw8MTYsCisJLTUwPDwxNiwKKwktMjU8PDE2LAorCS0xMDw8MTYsCisJLTU8PDE2LAorCS0xPDwxNiwKKwktMTAwMCwKKwkxPDwxNiwKKwk1PDwxNiwKKwkxMDw8MTYsCisJMjU8PDE2LAorCTUwPDwxNiwKKwk3NTw8MTYsCisJMTAwPDwxNiwKKwkxNTA8PDE2LAorCTIwMDw8MTYsCisJMjUwPDwxNiwKKwkzMDA8PDE2LAorCTM1MDw8MTYsCisJNDAwPDwxNiwKKwk0NTA8PDE2LAorCTQ5OTw8MTYsCit9OworCitsb25nIG91dG9mcmFuZ2VfZnJlcVtOVU1fRlJFUV9PVVRPRlJBTkdFXSA9IHsKKwktMTAwMDw8MTYsCisJLTU1MDw8MTYsCisJNTUwPDwxNiwKKwkxMDAwPDwxNiwKK307CisKKyNkZWZpbmUgTE9OR19NQVggKH4wVUw+PjEpCisjZGVmaW5lIExPTkdfTUlOICgtTE9OR19NQVggLSAxKQorCitsb25nIGludmFsaWRfZnJlcVtOVU1fRlJFUV9JTlZBTElEXSA9IHsKKwlMT05HX01BWCwKKwlMT05HX01JTiwKK307CisKK2ludCB2YWxpZGF0ZV9mcmVxKHZvaWQpCit7CisJc3RydWN0IHRpbWV4IHR4OworCWludCByZXQsIHBhc3MgPSAwOworCWludCBpOworCisJY2xlYXJfdGltZV9zdGF0ZSgpOworCisJbWVtc2V0KCZ0eCwgMCwgc2l6ZW9mKHN0cnVjdCB0aW1leCkpOworCS8qIFNldCB0aGUgbGVhcCBzZWNvbmQgaW5zZXJ0IGZsYWcgKi8KKworCXByaW50ZigiVGVzdGluZyBBREpfRlJFUS4uLiAiKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZSRVFfVkFMSUQ7IGkrKykgeworCQl0eC5tb2RlcyA9IEFESl9GUkVRVUVOQ1k7CisJCXR4LmZyZXEgPSB2YWxpZF9mcmVxW2ldOworCisJCXJldCA9IGFkanRpbWV4KCZ0eCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlwcmludGYoIltGQUlMXVxuIik7CisJCQlwcmludGYoIkVycm9yOiBhZGp0aW1leChBREpfRlJFUSwgJWxkIC0gJWxkIHBwbVxuIiwKKwkJCQl2YWxpZF9mcmVxW2ldLCB2YWxpZF9mcmVxW2ldPj4xNik7CisJCQlwYXNzID0gLTE7CisJCQlnb3RvIG91dDsKKwkJfQorCQl0eC5tb2RlcyA9IDA7CisJCXJldCA9IGFkanRpbWV4KCZ0eCk7CisJCWlmICh0eC5mcmVxICE9IHZhbGlkX2ZyZXFbaV0pIHsKKwkJCXByaW50ZigiV2FybmluZzogZnJlcSB2YWx1ZSAlbGQgbm90IHdoYXQgd2Ugc2V0IGl0ICglbGQpIVxuIiwKKwkJCQkJdHguZnJlcSwgdmFsaWRfZnJlcVtpXSk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IE5VTV9GUkVRX09VVE9GUkFOR0U7IGkrKykgeworCQl0eC5tb2RlcyA9IEFESl9GUkVRVUVOQ1k7CisJCXR4LmZyZXEgPSBvdXRvZnJhbmdlX2ZyZXFbaV07CisKKwkJcmV0ID0gYWRqdGltZXgoJnR4KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50ZigiW0ZBSUxdXG4iKTsKKwkJCXByaW50ZigiRXJyb3I6IGFkanRpbWV4KEFESl9GUkVRLCAlbGQgLSAlbGQgcHBtXG4iLAorCQkJCW91dG9mcmFuZ2VfZnJlcVtpXSwgb3V0b2ZyYW5nZV9mcmVxW2ldPj4xNik7CisJCQlwYXNzID0gLTE7CisJCQlnb3RvIG91dDsKKwkJfQorCQl0eC5tb2RlcyA9IDA7CisJCXJldCA9IGFkanRpbWV4KCZ0eCk7CisJCWlmICh0eC5mcmVxID09IG91dG9mcmFuZ2VfZnJlcVtpXSkgeworCQkJcHJpbnRmKCJbRkFJTF1cbiIpOworCQkJcHJpbnRmKCJFUlJPUjogb3V0IG9mIHJhbmdlIHZhbHVlICVsZCBhY3R1YWxseSBzZXQhXG4iLAorCQkJCQl0eC5mcmVxKTsKKwkJCXBhc3MgPSAtMTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisKKwlpZiAoc2l6ZW9mKGxvbmcpID09IDgpIHsgLyogdGhpcyBjYXNlIG9ubHkgYXBwbGllcyB0byA2NGJpdCBzeXN0ZW1zICovCisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRlJFUV9JTlZBTElEOyBpKyspIHsKKwkJCXR4Lm1vZGVzID0gQURKX0ZSRVFVRU5DWTsKKwkJCXR4LmZyZXEgPSBpbnZhbGlkX2ZyZXFbaV07CisJCQlyZXQgPSBhZGp0aW1leCgmdHgpOworCQkJaWYgKHJldCA+PSAwKSB7CisJCQkJcHJpbnRmKCJbRkFJTF1cbiIpOworCQkJCXByaW50ZigiRXJyb3I6IE5vIGZhaWx1cmUgb24gaW52YWxpZCBBREpfRlJFUVVFTkNZICVsZFxuIiwKKwkJCQkJaW52YWxpZF9mcmVxW2ldKTsKKwkJCQlwYXNzID0gLTE7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwl9CisKKwlwcmludGYoIltPS11cbiIpOworb3V0OgorCS8qIHJlc2V0IGZyZXEgdG8gemVybyAqLworCXR4Lm1vZGVzID0gQURKX0ZSRVFVRU5DWTsKKwl0eC5mcmVxID0gMDsKKwlyZXQgPSBhZGp0aW1leCgmdHgpOworCisJcmV0dXJuIHBhc3M7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmICh2YWxpZGF0ZV9mcmVxKCkpCisJCXJldHVybiBrc2Z0X2V4aXRfZmFpbCgpOworCisJcmV0dXJuIGtzZnRfZXhpdF9wYXNzKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy91c2VyL01ha2VmaWxlIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdXNlci9NYWtlZmlsZQppbmRleCAxMmM5ZDE1Li5kNDAxYjYzIDEwMDY0NAotLS0gYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy91c2VyL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3VzZXIvTWFrZWZpbGUKQEAgLTMsNSArMyw2IEBACiAjIE5vIGJpbmFyaWVzLCBidXQgbWFrZSBzdXJlIGFyZy1sZXNzICJtYWtlIiBkb2Vzbid0IHRyaWdnZXIgInJ1bl90ZXN0cyIKIGFsbDoKIAotcnVuX3Rlc3RzOiBhbGwKLQkuL3Rlc3RfdXNlcl9jb3B5LnNoCitURVNUX1BST0dTIDo9IHRlc3RfdXNlcl9jb3B5LnNoCisKK2luY2x1ZGUgLi4vbGliLm1rCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy92bS9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3ZtL01ha2VmaWxlCmluZGV4IDA3NzgyOGMuLmE1Y2U5NTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3ZtL01ha2VmaWxlCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3ZtL01ha2VmaWxlCkBAIC0xLDYgKzEsNSBAQAogIyBNYWtlZmlsZSBmb3Igdm0gc2VsZnRlc3RzCiAKLUNDID0gJChDUk9TU19DT01QSUxFKWdjYwogQ0ZMQUdTID0gLVdhbGwKIEJJTkFSSUVTID0gaHVnZXBhZ2UtbW1hcCBodWdlcGFnZS1zaG0gbWFwX2h1Z2V0bGIgdGh1Z2UtZ2VuIGh1Z2V0bGJmc3Rlc3QKIEJJTkFSSUVTICs9IHRyYW5zaHVnZS1zdHJlc3MKQEAgLTksOCArOCwxMCBAQAogJTogJS5jCiAJJChDQykgJChDRkxBR1MpIC1vICRAICReIC1scnQKIAotcnVuX3Rlc3RzOiBhbGwKLQlAL2Jpbi9zaCAuL3J1bl92bXRlc3RzIHx8IChlY2hvICJ2bXRlc3RzOiBbRkFJTF0iOyBleGl0IDEpCitURVNUX1BST0dTIDo9IHJ1bl92bXRlc3RzCitURVNUX0ZJTEVTIDo9ICQoQklOQVJJRVMpCisKK2luY2x1ZGUgLi4vbGliLm1rCiAKIGNsZWFuOgogCSQoUk0pICQoQklOQVJJRVMpCmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy92bS9odWdldGxiZnN0ZXN0LmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy92bS9odWdldGxiZnN0ZXN0LmMKaW5kZXggZWE0MGZmOC4uMDJlMTA3MiAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdm0vaHVnZXRsYmZzdGVzdC5jCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3ZtL2h1Z2V0bGJmc3Rlc3QuYwpAQCAtMzQsNiArMzQsNyBAQAogCWludCAqcDsKIAlpbnQgZmxhZ3MgPSBNQVBfUFJJVkFURSB8IE1BUF9QT1BVTEFURSB8IGV4dHJhX2ZsYWdzOwogCXU2NCBiZWZvcmUsIGFmdGVyOworCWludCByZXQ7CiAKIAliZWZvcmUgPSByZWFkX3JzcygpOwogCXAgPSBtbWFwKE5VTEwsIGxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgZmxhZ3MsIGZkLCAwKTsKQEAgLTQ0LDcgKzQ1LDggQEAKIAkJCSEicnNzIGRpZG4ndCBncm93IGFzIGV4cGVjdGVkIik7CiAJaWYgKCF1bm1hcCkKIAkJcmV0dXJuOwotCW11bm1hcChwLCBsZW5ndGgpOworCXJldCA9IG11bm1hcChwLCBsZW5ndGgpOworCWFzc2VydCghcmV0IHx8ICEibXVubWFwIHJldHVybmVkIGFuIHVuZXhwZWN0ZWQgZXJyb3IiKTsKIAlhZnRlciA9IHJlYWRfcnNzKCk7CiAJYXNzZXJ0KGxsYWJzKGFmdGVyIC0gYmVmb3JlKSA8IDB4NDAwMDAgfHwKIAkJCSEicnNzIGRpZG4ndCBzaHJpbmsgYXMgZXhwZWN0ZWQiKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3ZtL21hcF9odWdldGxiLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy92bS9tYXBfaHVnZXRsYi5jCmluZGV4IGFjNTY2MzkuLmFkZGNkNmYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3ZtL21hcF9odWdldGxiLmMKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdm0vbWFwX2h1Z2V0bGIuYwpAQCAtNzMsNyArNzMsMTEgQEAKIAl3cml0ZV9ieXRlcyhhZGRyKTsKIAlyZXQgPSByZWFkX2J5dGVzKGFkZHIpOwogCi0JbXVubWFwKGFkZHIsIExFTkdUSCk7CisJLyogbXVubWFwKCkgbGVuZ3RoIG9mIE1BUF9IVUdFVExCIG1lbW9yeSBtdXN0IGJlIGh1Z2VwYWdlIGFsaWduZWQgKi8KKwlpZiAobXVubWFwKGFkZHIsIExFTkdUSCkpIHsKKwkJcGVycm9yKCJtdW5tYXAiKTsKKwkJZXhpdCgxKTsKKwl9CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvdm0vcnVuX3ZtdGVzdHMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy92bS9ydW5fdm10ZXN0cwpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvLmdpdGlnbm9yZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MDM0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKKypfMzIKKypfNjQKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9NYWtlZmlsZSBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGE3OTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L01ha2VmaWxlCkBAIC0wLDAgKzEsNDggQEAKKy5QSE9OWTogYWxsIGFsbF8zMiBhbGxfNjQgY2hlY2tfYnVpbGQzMiBjbGVhbiBydW5fdGVzdHMKKworVEFSR0VUU19DX0JPVEhCSVRTIDo9IHNpZ3JldHVybgorCitCSU5BUklFU18zMiA6PSAkKFRBUkdFVFNfQ19CT1RIQklUUzolPSVfMzIpCitCSU5BUklFU182NCA6PSAkKFRBUkdFVFNfQ19CT1RIQklUUzolPSVfNjQpCisKK0NGTEFHUyA6PSAtTzIgLWcgLXN0ZD1nbnU5OSAtcHRocmVhZCAtV2FsbAorCitVTkFNRV9QIDo9ICQoc2hlbGwgdW5hbWUgLXApCisKKyMgQWx3YXlzIGJ1aWxkIDMyLWJpdCB0ZXN0cworYWxsOiBhbGxfMzIKKworIyBJZiB3ZSdyZSBvbiBhIDY0LWJpdCBob3N0LCBidWlsZCA2NC1iaXQgdGVzdHMgYXMgd2VsbAoraWZlcSAoJChzaGVsbCB1bmFtZSAtcCkseDg2XzY0KQorYWxsOiBhbGxfNjQKK2VuZGlmCisKK2FsbF8zMjogY2hlY2tfYnVpbGQzMiAkKEJJTkFSSUVTXzMyKQorCithbGxfNjQ6ICQoQklOQVJJRVNfNjQpCisKK2NsZWFuOgorCSQoUk0pICQoQklOQVJJRVNfMzIpICQoQklOQVJJRVNfNjQpCisKK3J1bl90ZXN0czoKKwkuL3J1bl94ODZfdGVzdHMuc2gKKworJChUQVJHRVRTX0NfQk9USEJJVFM6JT0lXzMyKTogJV8zMjogJS5jCisJJChDQykgLW0zMiAtbyAkQCAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpICReIC1scnQgLWxkbAorCiskKFRBUkdFVFNfQ19CT1RIQklUUzolPSVfNjQpOiAlXzY0OiAlLmMKKwkkKENDKSAtbTY0IC1vICRAICQoQ0ZMQUdTKSAkKEVYVFJBX0NGTEFHUykgJF4gLWxydCAtbGRsCisKK2NoZWNrX2J1aWxkMzI6CisJQGlmICEgJChDQykgLW0zMiAtbyAvZGV2L251bGwgdHJpdmlhbF8zMmJpdF9wcm9ncmFtLmM7IHRoZW4JXAorCSAgZWNobyAiV2FybmluZzogeW91IHNlZW0gdG8gaGF2ZSBhIGJyb2tlbiAzMi1iaXQgYnVpbGQiIDI+JjE7IAlcCisJICBlY2hvICJlbnZpcm9ubWVudC4gIElmIHlvdSBhcmUgdXNpbmcgYSBEZWJpYW4tbGlrZSI7CQlcCisJICBlY2hvICIgZGlzdHJpYnV0aW9uLCB0cnk6IjsgCQkJCQlcCisJICBlY2hvICIiOwkJCQkJCQlcCisJICBlY2hvICIgIGFwdC1nZXQgaW5zdGFsbCBnY2MtbXVsdGlsaWIgbGliYzYtaTM4NiBsaWJjNi1kZXYtaTM4NiI7IFwKKwkgIGVjaG8gIiI7CQkJCQkJCVwKKwkgIGVjaG8gIklmIHlvdSBhcmUgdXNpbmcgYSBGZWRvcmEtbGlrZSBkaXN0cmlidXRpb24sIHRyeToiOwlcCisJICBlY2hvICIiOwkJCQkJCQlcCisJICBlY2hvICIgIHl1bSBpbnN0YWxsIGdsaWJjLWRldmVsLippNjg2IjsJCQlcCisJICBleGl0IDE7CQkJCQkJCVwKKwlmaQpkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3J1bl94ODZfdGVzdHMuc2ggYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvcnVuX3g4Nl90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNlYzY1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3J1bl94ODZfdGVzdHMuc2gKQEAgLTAsMCArMSwxMSBAQAorIyEvYmluL2Jhc2gKKworIyBUaGlzIGlzIGRlbGliZXJhdGVseSBtaW5pbWFsLiAgSU1PIGtzZWxmdGVzdHMgc2hvdWxkIHByb3ZpZGUgYSBzdGFuZGFyZAorIyBzY3JpcHQgaGVyZS4KKy4vc2lncmV0dXJuXzMyIHx8IGV4aXQgMQorCitpZiBbWyAiJHVuYW1lIC1wIiAtZXEgIng4Nl82NCIgXV07IHRoZW4KKyAgICAuL3NpZ3JldHVybl82NCB8fCBleGl0IDEKK2ZpCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3NpZ3JldHVybi5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMveDg2L3NpZ3JldHVybi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YWExYmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvc2lncmV0dXJuLmMKQEAgLTAsMCArMSw2ODQgQEAKKy8qCisgKiBzaWdyZXR1cm4uYyAtIHRlc3RzIGZvciB4ODYgc2lncmV0dXJuKDIpIGFuZCBleGl0LXRvLXVzZXJzcGFjZQorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgQW5kcmV3IEx1dG9taXJza2kKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVGhpcyBpcyBhIHNlcmllcyBvZiB0ZXN0cyB0aGF0IGV4ZXJjaXNlcyB0aGUgc2lncmV0dXJuKDIpIHN5c2NhbGwgYW5kCisgKiB0aGUgSVJFVCAvIFNZU1JFVCBwYXRocyBpbiB0aGUga2VybmVsLgorICoKKyAqIEZvciBub3csIHRoaXMgZm9jdXNlcyBvbiB0aGUgZWZmZWN0cyBvZiB1bnVzdWFsIENTIGFuZCBTUyB2YWx1ZXMsCisgKiBhbmQgaXQgaGFzIGEgYnVuY2ggb2YgdGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQgRVNQL1JTUCBpcyByZXN0b3JlZAorICogcHJvcGVybHkuCisgKgorICogVGhlIGJhc2ljIGlkZWEgYmVoaW5kIHRoZXNlIHRlc3RzIGlzIHRvIHJhaXNlKFNJR1VTUjEpIHRvIGNyZWF0ZSBhCisgKiBzaWdjb250ZXh0IGZyYW1lLCBwbHVnIGluIHRoZSB2YWx1ZXMgdG8gYmUgdGVzdGVkLCBhbmQgdGhlbiByZXR1cm4sCisgKiB3aGljaCBpbXBsaWNpdGx5IGludm9rZXMgc2lncmV0dXJuKDIpIGFuZCBwcm9ncmFtcyB0aGUgdXNlciBjb250ZXh0CisgKiBhcyBkZXNpcmVkLgorICoKKyAqIEZvciB0ZXN0cyBmb3Igd2hpY2ggd2UgZXhwZWN0IHNpZ3JldHVybiBhbmQgdGhlIHN1YnNlcXVlbnQgcmV0dXJuIHRvCisgKiB1c2VyIG1vZGUgdG8gc3VjY2VlZCwgd2UgcmV0dXJuIHRvIGEgc2hvcnQgdHJhbXBvbGluZSB0aGF0IGdlbmVyYXRlcworICogU0lHVFJBUCBzbyB0aGF0IHRoZSBtZWF0IG9mIHRoZSB0ZXN0cyBjYW4gYmUgb3JkaW5hcnkgQyBjb2RlIGluIGEKKyAqIFNJR1RSQVAgaGFuZGxlci4KKyAqCisgKiBUaGUgaW5uZXIgd29ya2luZ3Mgb2YgZWFjaCB0ZXN0IGlzIGRvY3VtZW50ZWQgYmVsb3cuCisgKgorICogRG8gbm90IHJ1biBvbiBvdXRkYXRlZCwgdW5wYXRjaGVkIGtlcm5lbHMgYXQgcmlzayBvZiBuYXN0eSBjcmFzaGVzLgorICovCisKKyNkZWZpbmUgX0dOVV9TT1VSQ0UKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3lzL3NpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy91Y29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9sZHQuaD4KKyNpbmNsdWRlIDxlcnIuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPHN5cy91c2VyLmg+CisKKy8qCisgKiBJbiBwcmluY2lwbGUsIHRoaXMgdGVzdCBjYW4gcnVuIG9uIExpbnV4IGVtdWxhdGlvbiBsYXllcnMgKGUuZy4KKyAqIElsbHVtb3MgIkxYIGJyYW5kZWQgem9uZXMiKS4gIFNvbGFyaXMtYmFzZWQga2VybmVscyByZXNlcnZlIExEVAorICogZW50cmllcyAwLTUgZm9yIHRoZWlyIG93biBpbnRlcm5hbCBwdXJwb3Nlcywgc28gc3RhcnQgb3VyIExEVAorICogYWxsb2NhdGlvbnMgYWJvdmUgdGhhdCByZXNlcnZhdGlvbi4gIChUaGUgdGVzdHMgZG9uJ3QgcGFzcyBvbiBMWAorICogYnJhbmRlZCB6b25lcywgYnV0IGF0IGxlYXN0IHRoaXMgbGV0cyB0aGVtIHJ1bi4pCisgKi8KKyNkZWZpbmUgTERUX09GRlNFVCA2CisKKy8qIEFuIGFsaWduZWQgc3RhY2sgYWNjZXNzaWJsZSB0aHJvdWdoIHNvbWUgb2Ygb3VyIHNlZ21lbnRzLiAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgc3RhY2sxNls2NTUzNl0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0MDk2KSkpOworCisvKgorICogQW4gYWxpZ25lZCBpbnQzIGluc3RydWN0aW9uIHVzZWQgYXMgYSB0cmFtcG9saW5lLiAgU29tZSBvZiB0aGUgdGVzdHMKKyAqIHdhbnQgdG8gZmlzaCBvdXQgdGhlaXIgc3MgdmFsdWVzLCBzbyB0aGlzIHRyYW1wb2xpbmUgY29waWVzIHNzIHRvIGVheAorICogYmVmb3JlIHRoZSBpbnQzLgorICovCithc20gKCIucHVzaHNlY3Rpb24gLnRleHRcblx0IgorICAgICAiLnR5cGUgaW50MywgQGZ1bmN0aW9uXG5cdCIKKyAgICAgIi5hbGlnbiA0MDk2XG5cdCIKKyAgICAgImludDM6XG5cdCIKKyAgICAgIm1vdiAlc3MsJWVheFxuXHQiCisgICAgICJpbnQzXG5cdCIKKyAgICAgIi5zaXplIGludDMsIC4gLSBpbnQzXG5cdCIKKyAgICAgIi5hbGlnbiA0MDk2LCAweGNjXG5cdCIKKyAgICAgIi5wb3BzZWN0aW9uIik7CitleHRlcm4gY2hhciBpbnQzWzQwOTZdOworCisvKgorICogQXQgc3RhcnR1cCwgd2UgcHJlcGFwcmU6CisgKgorICogLSBsZHRfbm9uZXhpc3RlbnRfc2VsOiBBbiBMRFQgZW50cnkgdGhhdCBkb2Vzbid0IGV4aXN0IChhbGwtemVybworICogICBkZXNjcmlwdG9yIG9yIG91dCBvZiBib3VuZHMpLgorICogLSBjb2RlMTZfc2VsOiBBIDE2LWJpdCBMRFQgY29kZSBzZWdtZW50IHBvaW50aW5nIHRvIGludDMuCisgKiAtIGRhdGExNl9zZWw6IEEgMTYtYml0IExEVCBkYXRhIHNlZ21lbnQgcG9pbnRpbmcgdG8gc3RhY2sxNi4KKyAqIC0gbnBjb2RlMzJfc2VsOiBBIDMyLWJpdCBub3QtcHJlc2VudCBMRFQgY29kZSBzZWdtZW50IHBvaW50aW5nIHRvIGludDMuCisgKiAtIG5wZGF0YTMyX3NlbDogQSAzMi1iaXQgbm90LXByZXNlbnQgTERUIGRhdGEgc2VnbWVudCBwb2ludGluZyB0byBzdGFjazE2LgorICogLSBnZHRfZGF0YTE2X2lkeDogQSAxNi1iaXQgR0RUIGRhdGEgc2VnbWVudCBwb2ludGluZyB0byBzdGFjazE2LgorICogLSBnZHRfbnBkYXRhMzJfaWR4OiBBIDMyLWJpdCBub3QtcHJlc2VudCBHRFQgZGF0YSBzZWdtZW50IHBvaW50aW5nIHRvCisgKiAgIHN0YWNrMTYuCisgKgorICogRm9yIG5vIHBhcnRpY3VsYXJseSBnb29kIHJlYXNvbiwgeHl6X3NlbCBpcyBhIHNlbGVjdG9yIHZhbHVlIHdpdGggdGhlCisgKiBSUEwgYW5kIExEVCBiaXRzIGZpbGxlZCBpbiwgd2hlcmVhcyB4eXpfaWR4IGlzIGp1c3QgYW4gaW5kZXggaW50byB0aGUKKyAqIGRlc2NyaXB0b3IgdGFibGUuICBUaGVzZSB2YXJpYWJsZXMgd2lsbCBiZSB6ZXJvIGlmIHRoZWlyIHJlc3BlY3RpdmUKKyAqIHNlZ21lbnRzIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBsZHRfbm9uZXhpc3RlbnRfc2VsOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGNvZGUxNl9zZWwsIGRhdGExNl9zZWwsIG5wY29kZTMyX3NlbCwgbnBkYXRhMzJfc2VsOworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZ2R0X2RhdGExNl9pZHgsIGdkdF9ucGRhdGEzMl9pZHg7CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBHRFQzKGludCBpZHgpCit7CisJcmV0dXJuIChpZHggPDwgMykgfCAzOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgTERUMyhpbnQgaWR4KQoreworCXJldHVybiAoaWR4IDw8IDMpIHwgNzsKK30KKworLyogT3VyIHNpZ2FsdHN0YWNrIHNjcmF0Y2ggc3BhY2UuICovCitzdGF0aWMgY2hhciBhbHRzdGFja19kYXRhW1NJR1NUS1NaXTsKKworc3RhdGljIHZvaWQgc2V0aGFuZGxlcihpbnQgc2lnLCB2b2lkICgqaGFuZGxlcikoaW50LCBzaWdpbmZvX3QgKiwgdm9pZCAqKSwKKwkJICAgICAgIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCW1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworCXNhLnNhX3NpZ2FjdGlvbiA9IGhhbmRsZXI7CisJc2Euc2FfZmxhZ3MgPSBTQV9TSUdJTkZPIHwgZmxhZ3M7CisJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCWlmIChzaWdhY3Rpb24oc2lnLCAmc2EsIDApKQorCQllcnIoMSwgInNpZ2FjdGlvbiIpOworfQorCitzdGF0aWMgdm9pZCBjbGVhcmhhbmRsZXIoaW50IHNpZykKK3sKKwlzdHJ1Y3Qgc2lnYWN0aW9uIHNhOworCW1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworCXNhLnNhX2hhbmRsZXIgPSBTSUdfREZMOworCXNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKKwlpZiAoc2lnYWN0aW9uKHNpZywgJnNhLCAwKSkKKwkJZXJyKDEsICJzaWdhY3Rpb24iKTsKK30KKworc3RhdGljIHZvaWQgYWRkX2xkdChjb25zdCBzdHJ1Y3QgdXNlcl9kZXNjICpkZXNjLCB1bnNpZ25lZCBzaG9ydCAqdmFyLAorCQkgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoc3lzY2FsbChTWVNfbW9kaWZ5X2xkdCwgMSwgZGVzYywgc2l6ZW9mKCpkZXNjKSkgPT0gMCkgeworCQkqdmFyID0gTERUMyhkZXNjLT5lbnRyeV9udW1iZXIpOworCX0gZWxzZSB7CisJCXByaW50ZigiW05PVEVdXHRGYWlsZWQgdG8gY3JlYXRlICVzIHNlZ21lbnRcbiIsIG5hbWUpOworCQkqdmFyID0gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2xkdCh2b2lkKQoreworCWlmICgodW5zaWduZWQgbG9uZylzdGFjazE2ID4gKDFVTEwgPDwgMzIpIC0gc2l6ZW9mKHN0YWNrMTYpKQorCQllcnJ4KDEsICJzdGFjazE2IGlzIHRvbyBoaWdoXG4iKTsKKwlpZiAoKHVuc2lnbmVkIGxvbmcpaW50MyA+ICgxVUxMIDw8IDMyKSAtIHNpemVvZihpbnQzKSkKKwkJZXJyeCgxLCAiaW50MyBpcyB0b28gaGlnaFxuIik7CisKKwlsZHRfbm9uZXhpc3RlbnRfc2VsID0gTERUMyhMRFRfT0ZGU0VUICsgMik7CisKKwljb25zdCBzdHJ1Y3QgdXNlcl9kZXNjIGNvZGUxNl9kZXNjID0geworCQkuZW50cnlfbnVtYmVyICAgID0gTERUX09GRlNFVCArIDAsCisJCS5iYXNlX2FkZHIgICAgICAgPSAodW5zaWduZWQgbG9uZylpbnQzLAorCQkubGltaXQgICAgICAgICAgID0gNDA5NSwKKwkJLnNlZ18zMmJpdCAgICAgICA9IDAsCisJCS5jb250ZW50cyAgICAgICAgPSAyLCAvKiBDb2RlLCBub3QgY29uZm9ybWluZyAqLworCQkucmVhZF9leGVjX29ubHkgID0gMCwKKwkJLmxpbWl0X2luX3BhZ2VzICA9IDAsCisJCS5zZWdfbm90X3ByZXNlbnQgPSAwLAorCQkudXNlYWJsZSAgICAgICAgID0gMAorCX07CisJYWRkX2xkdCgmY29kZTE2X2Rlc2MsICZjb2RlMTZfc2VsLCAiY29kZTE2Iik7CisKKwljb25zdCBzdHJ1Y3QgdXNlcl9kZXNjIGRhdGExNl9kZXNjID0geworCQkuZW50cnlfbnVtYmVyICAgID0gTERUX09GRlNFVCArIDEsCisJCS5iYXNlX2FkZHIgICAgICAgPSAodW5zaWduZWQgbG9uZylzdGFjazE2LAorCQkubGltaXQgICAgICAgICAgID0gMHhmZmZmLAorCQkuc2VnXzMyYml0ICAgICAgID0gMCwKKwkJLmNvbnRlbnRzICAgICAgICA9IDAsIC8qIERhdGEsIGdyb3ctdXAgKi8KKwkJLnJlYWRfZXhlY19vbmx5ICA9IDAsCisJCS5saW1pdF9pbl9wYWdlcyAgPSAwLAorCQkuc2VnX25vdF9wcmVzZW50ID0gMCwKKwkJLnVzZWFibGUgICAgICAgICA9IDAKKwl9OworCWFkZF9sZHQoJmRhdGExNl9kZXNjLCAmZGF0YTE2X3NlbCwgImRhdGExNiIpOworCisJY29uc3Qgc3RydWN0IHVzZXJfZGVzYyBucGNvZGUzMl9kZXNjID0geworCQkuZW50cnlfbnVtYmVyICAgID0gTERUX09GRlNFVCArIDMsCisJCS5iYXNlX2FkZHIgICAgICAgPSAodW5zaWduZWQgbG9uZylpbnQzLAorCQkubGltaXQgICAgICAgICAgID0gNDA5NSwKKwkJLnNlZ18zMmJpdCAgICAgICA9IDEsCisJCS5jb250ZW50cyAgICAgICAgPSAyLCAvKiBDb2RlLCBub3QgY29uZm9ybWluZyAqLworCQkucmVhZF9leGVjX29ubHkgID0gMCwKKwkJLmxpbWl0X2luX3BhZ2VzICA9IDAsCisJCS5zZWdfbm90X3ByZXNlbnQgPSAxLAorCQkudXNlYWJsZSAgICAgICAgID0gMAorCX07CisJYWRkX2xkdCgmbnBjb2RlMzJfZGVzYywgJm5wY29kZTMyX3NlbCwgIm5wY29kZTMyIik7CisKKwljb25zdCBzdHJ1Y3QgdXNlcl9kZXNjIG5wZGF0YTMyX2Rlc2MgPSB7CisJCS5lbnRyeV9udW1iZXIgICAgPSBMRFRfT0ZGU0VUICsgNCwKKwkJLmJhc2VfYWRkciAgICAgICA9ICh1bnNpZ25lZCBsb25nKXN0YWNrMTYsCisJCS5saW1pdCAgICAgICAgICAgPSAweGZmZmYsCisJCS5zZWdfMzJiaXQgICAgICAgPSAxLAorCQkuY29udGVudHMgICAgICAgID0gMCwgLyogRGF0YSwgZ3Jvdy11cCAqLworCQkucmVhZF9leGVjX29ubHkgID0gMCwKKwkJLmxpbWl0X2luX3BhZ2VzICA9IDAsCisJCS5zZWdfbm90X3ByZXNlbnQgPSAxLAorCQkudXNlYWJsZSAgICAgICAgID0gMAorCX07CisJYWRkX2xkdCgmbnBkYXRhMzJfZGVzYywgJm5wZGF0YTMyX3NlbCwgIm5wZGF0YTMyIik7CisKKwlzdHJ1Y3QgdXNlcl9kZXNjIGdkdF9kYXRhMTZfZGVzYyA9IHsKKwkJLmVudHJ5X251bWJlciAgICA9IC0xLAorCQkuYmFzZV9hZGRyICAgICAgID0gKHVuc2lnbmVkIGxvbmcpc3RhY2sxNiwKKwkJLmxpbWl0ICAgICAgICAgICA9IDB4ZmZmZiwKKwkJLnNlZ18zMmJpdCAgICAgICA9IDAsCisJCS5jb250ZW50cyAgICAgICAgPSAwLCAvKiBEYXRhLCBncm93LXVwICovCisJCS5yZWFkX2V4ZWNfb25seSAgPSAwLAorCQkubGltaXRfaW5fcGFnZXMgID0gMCwKKwkJLnNlZ19ub3RfcHJlc2VudCA9IDAsCisJCS51c2VhYmxlICAgICAgICAgPSAwCisJfTsKKworCWlmIChzeXNjYWxsKFNZU19zZXRfdGhyZWFkX2FyZWEsICZnZHRfZGF0YTE2X2Rlc2MpID09IDApIHsKKwkJLyoKKwkJICogVGhpcyBwcm9iYWJseSBpbmRpY2F0ZXMgdnVsbmVyYWJpbGl0eSB0byBDVkUtMjAxNC04MTMzLgorCQkgKiBNZXJlbHkgZ2V0dGluZyBoZXJlIGlzbid0IGRlZmluaXRpdmUsIHRob3VnaCwgYW5kIHdlJ2xsCisJCSAqIGRpYWdub3NlIHRoZSBwcm9ibGVtIGZvciByZWFsIGxhdGVyIG9uLgorCQkgKi8KKwkJcHJpbnRmKCJbV0FSTl1cdHNldF90aHJlYWRfYXJlYSBhbGxvY2F0ZWQgZGF0YTE2IGF0IGluZGV4ICVkXG4iLAorCQkgICAgICAgZ2R0X2RhdGExNl9kZXNjLmVudHJ5X251bWJlcik7CisJCWdkdF9kYXRhMTZfaWR4ID0gZ2R0X2RhdGExNl9kZXNjLmVudHJ5X251bWJlcjsKKwl9IGVsc2UgeworCQlwcmludGYoIltPS11cdHNldF90aHJlYWRfYXJlYSByZWZ1c2VkIDE2LWJpdCBkYXRhXG4iKTsKKwl9CisKKwlzdHJ1Y3QgdXNlcl9kZXNjIGdkdF9ucGRhdGEzMl9kZXNjID0geworCQkuZW50cnlfbnVtYmVyICAgID0gLTEsCisJCS5iYXNlX2FkZHIgICAgICAgPSAodW5zaWduZWQgbG9uZylzdGFjazE2LAorCQkubGltaXQgICAgICAgICAgID0gMHhmZmZmLAorCQkuc2VnXzMyYml0ICAgICAgID0gMSwKKwkJLmNvbnRlbnRzICAgICAgICA9IDAsIC8qIERhdGEsIGdyb3ctdXAgKi8KKwkJLnJlYWRfZXhlY19vbmx5ICA9IDAsCisJCS5saW1pdF9pbl9wYWdlcyAgPSAwLAorCQkuc2VnX25vdF9wcmVzZW50ID0gMSwKKwkJLnVzZWFibGUgICAgICAgICA9IDAKKwl9OworCisJaWYgKHN5c2NhbGwoU1lTX3NldF90aHJlYWRfYXJlYSwgJmdkdF9ucGRhdGEzMl9kZXNjKSA9PSAwKSB7CisJCS8qCisJCSAqIEFzIGEgaGFyZGVuaW5nIG1lYXN1cmUsIG5ld2VyIGtlcm5lbHMgZG9uJ3QgYWxsb3cgdGhpcy4KKwkJICovCisJCXByaW50ZigiW1dBUk5dXHRzZXRfdGhyZWFkX2FyZWEgYWxsb2NhdGVkIG5wZGF0YTMyIGF0IGluZGV4ICVkXG4iLAorCQkgICAgICAgZ2R0X25wZGF0YTMyX2Rlc2MuZW50cnlfbnVtYmVyKTsKKwkJZ2R0X25wZGF0YTMyX2lkeCA9IGdkdF9ucGRhdGEzMl9kZXNjLmVudHJ5X251bWJlcjsKKwl9IGVsc2UgeworCQlwcmludGYoIltPS11cdHNldF90aHJlYWRfYXJlYSByZWZ1c2VkIDE2LWJpdCBkYXRhXG4iKTsKKwl9Cit9CisKKy8qIFN0YXRlIHVzZWQgYnkgb3VyIHNpZ25hbCBoYW5kbGVycy4gKi8KK3N0YXRpYyBncmVnc2V0X3QgaW5pdGlhbF9yZWdzLCByZXF1ZXN0ZWRfcmVncywgcmVzdWx0aW5nX3JlZ3M7CisKKy8qIEluc3RydWN0aW9ucyBmb3IgdGhlIFNJR1VTUjEgaGFuZGxlci4gKi8KK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCBzaWdfY3MsIHNpZ19zczsKK3N0YXRpYyB2b2xhdGlsZSBzaWdfYXRvbWljX3Qgc2lnX3RyYXBwZWQsIHNpZ19lcnIsIHNpZ190cmFwbm87CisKKy8qIEFic3RyYWN0aW9ucyBmb3Igc29tZSAzMi1iaXQgdnMgNjQtYml0IGRpZmZlcmVuY2VzLiAqLworI2lmZGVmIF9feDg2XzY0X18KKyMgZGVmaW5lIFJFR19JUCBSRUdfUklQCisjIGRlZmluZSBSRUdfU1AgUkVHX1JTUAorIyBkZWZpbmUgUkVHX0FYIFJFR19SQVgKKworc3RydWN0IHNlbGVjdG9ycyB7CisJdW5zaWduZWQgc2hvcnQgY3MsIGdzLCBmcywgc3M7Cit9OworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgKnNzcHRyKHVjb250ZXh0X3QgKmN0eCkKK3sKKwlzdHJ1Y3Qgc2VsZWN0b3JzICpzZWxzID0gKHZvaWQgKikmY3R4LT51Y19tY29udGV4dC5ncmVnc1tSRUdfQ1NHU0ZTXTsKKwlyZXR1cm4gJnNlbHMtPnNzOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgKmNzcHRyKHVjb250ZXh0X3QgKmN0eCkKK3sKKwlzdHJ1Y3Qgc2VsZWN0b3JzICpzZWxzID0gKHZvaWQgKikmY3R4LT51Y19tY29udGV4dC5ncmVnc1tSRUdfQ1NHU0ZTXTsKKwlyZXR1cm4gJnNlbHMtPmNzOworfQorI2Vsc2UKKyMgZGVmaW5lIFJFR19JUCBSRUdfRUlQCisjIGRlZmluZSBSRUdfU1AgUkVHX0VTUAorIyBkZWZpbmUgUkVHX0FYIFJFR19FQVgKKworc3RhdGljIGdyZWdfdCAqc3NwdHIodWNvbnRleHRfdCAqY3R4KQoreworCXJldHVybiAmY3R4LT51Y19tY29udGV4dC5ncmVnc1tSRUdfU1NdOworfQorCitzdGF0aWMgZ3JlZ190ICpjc3B0cih1Y29udGV4dF90ICpjdHgpCit7CisJcmV0dXJuICZjdHgtPnVjX21jb250ZXh0LmdyZWdzW1JFR19DU107Cit9CisjZW5kaWYKKworLyogTnVtYmVyIG9mIGVycm9ycyBpbiB0aGUgY3VycmVudCB0ZXN0IGNhc2UuICovCitzdGF0aWMgdm9sYXRpbGUgc2lnX2F0b21pY190IG5lcnJzOworCisvKgorICogU0lHVVNSMSBoYW5kbGVyLiAgU2V0cyBDUyBhbmQgU1MgYXMgcmVxdWVzdGVkIGFuZCBwb2ludHMgSVAgdG8gdGhlCisgKiBpbnQzIHRyYW1wb2xpbmUuICBTZXRzIFNQIHRvIGEgbGFyZ2Uga25vd24gdmFsdWUgc28gdGhhdCB3ZSBjYW4gc2VlCisgKiB3aGV0aGVyIHRoZSB2YWx1ZSByb3VuZC10cmlwcyBiYWNrIHRvIHVzZXIgbW9kZSBjb3JyZWN0bHkuCisgKi8KK3N0YXRpYyB2b2lkIHNpZ3VzcjEoaW50IHNpZywgc2lnaW5mb190ICppbmZvLCB2b2lkICpjdHhfdm9pZCkKK3sKKwl1Y29udGV4dF90ICpjdHggPSAodWNvbnRleHRfdCopY3R4X3ZvaWQ7CisKKwltZW1jcHkoJmluaXRpYWxfcmVncywgJmN0eC0+dWNfbWNvbnRleHQuZ3JlZ3MsIHNpemVvZihncmVnc2V0X3QpKTsKKworCSpjc3B0cihjdHgpID0gc2lnX2NzOworCSpzc3B0cihjdHgpID0gc2lnX3NzOworCisJY3R4LT51Y19tY29udGV4dC5ncmVnc1tSRUdfSVBdID0KKwkJc2lnX2NzID09IGNvZGUxNl9zZWwgPyAwIDogKHVuc2lnbmVkIGxvbmcpJmludDM7CisJY3R4LT51Y19tY29udGV4dC5ncmVnc1tSRUdfU1BdID0gKHVuc2lnbmVkIGxvbmcpMHg4YmFkZjAwZDVhYWRjMGRlVUxMOworCWN0eC0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0FYXSA9IDA7CisKKwltZW1jcHkoJnJlcXVlc3RlZF9yZWdzLCAmY3R4LT51Y19tY29udGV4dC5ncmVncywgc2l6ZW9mKGdyZWdzZXRfdCkpOworCXJlcXVlc3RlZF9yZWdzW1JFR19BWF0gPSAqc3NwdHIoY3R4KTsJLyogVGhlIGFzbSBjb2RlIGRvZXMgdGhpcy4gKi8KKworCXJldHVybjsKK30KKworLyoKKyAqIENhbGxlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgc2lncmV0dXJuLiAgUmVzdG9yZXMgb3VyIHN0YXRlIHNvIHRoYXQKKyAqIHRoZSBvcmlnaW5hbCByYWlzZShTSUdVU1IxKSByZXR1cm5zLgorICovCitzdGF0aWMgdm9pZCBzaWd0cmFwKGludCBzaWcsIHNpZ2luZm9fdCAqaW5mbywgdm9pZCAqY3R4X3ZvaWQpCit7CisJdWNvbnRleHRfdCAqY3R4ID0gKHVjb250ZXh0X3QqKWN0eF92b2lkOworCisJc2lnX2VyciA9IGN0eC0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0VSUl07CisJc2lnX3RyYXBubyA9IGN0eC0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX1RSQVBOT107CisKKwl1bnNpZ25lZCBzaG9ydCBzczsKKwlhc20gKCJtb3YgJSVzcywlMCIgOiAiPXIiIChzcykpOworCisJZ3JlZ190IGFzbV9zcyA9IGN0eC0+dWNfbWNvbnRleHQuZ3JlZ3NbUkVHX0FYXTsKKwlpZiAoYXNtX3NzICE9IHNpZ19zcyAmJiBzaWcgPT0gU0lHVFJBUCkgeworCQkvKiBTYW5pdHkgY2hlY2sgZmFpbHVyZS4gKi8KKwkJcHJpbnRmKCJbRkFJTF1cdFNJR1RSQVA6IHNzID0gJWh4LCBmcmFtZSBzcyA9ICVoeCwgYXggPSAlbGx4XG4iLAorCQkgICAgICAgc3MsICpzc3B0cihjdHgpLCAodW5zaWduZWQgbG9uZyBsb25nKWFzbV9zcyk7CisJCW5lcnJzKys7CisJfQorCisJbWVtY3B5KCZyZXN1bHRpbmdfcmVncywgJmN0eC0+dWNfbWNvbnRleHQuZ3JlZ3MsIHNpemVvZihncmVnc2V0X3QpKTsKKwltZW1jcHkoJmN0eC0+dWNfbWNvbnRleHQuZ3JlZ3MsICZpbml0aWFsX3JlZ3MsIHNpemVvZihncmVnc2V0X3QpKTsKKworCXNpZ190cmFwcGVkID0gc2lnOworfQorCisvKgorICogQ2hlY2tzIGEgZ2l2ZW4gc2VsZWN0b3IgZm9yIGl0cyBjb2RlIGJpdG5lc3Mgb3IgcmV0dXJucyAtMSBpZiBpdCdzIG5vdAorICogYSB1c2FibGUgY29kZSBzZWdtZW50IHNlbGVjdG9yLgorICovCitpbnQgY3NfYml0bmVzcyh1bnNpZ25lZCBzaG9ydCBjcykKK3sKKwl1aW50MzJfdCB2YWxpZCA9IDAsIGFyOworCWFzbSAoImxhciAlW2NzXSwgJVthcl1cblx0IgorCSAgICAgImpueiAxZlxuXHQiCisJICAgICAibW92ICQxLCAlW3ZhbGlkXVxuXHQiCisJICAgICAiMToiCisJICAgICA6IFthcl0gIj1yIiAoYXIpLCBbdmFsaWRdICIrcm0iICh2YWxpZCkKKwkgICAgIDogW2NzXSAiciIgKGNzKSk7CisKKwlpZiAoIXZhbGlkKQorCQlyZXR1cm4gLTE7CisKKwlib29sIGRiID0gKGFyICYgKDEgPDwgMjIpKTsKKwlib29sIGwgPSAoYXIgJiAoMSA8PCAyMSkpOworCisJaWYgKCEoYXIgJiAoMTw8MTEpKSkKKwkgICAgcmV0dXJuIC0xOwkvKiBOb3QgY29kZS4gKi8KKworCWlmIChsICYmICFkYikKKwkJcmV0dXJuIDY0OworCWVsc2UgaWYgKCFsICYmIGRiKQorCQlyZXR1cm4gMzI7CisJZWxzZSBpZiAoIWwgJiYgIWRiKQorCQlyZXR1cm4gMTY7CisJZWxzZQorCQlyZXR1cm4gLTE7CS8qIFVua25vd24gYml0bmVzcy4gKi8KK30KKworLyogRmluZHMgYSB1c2FibGUgY29kZSBzZWdtZW50IG9mIHRoZSByZXF1ZXN0ZWQgYml0bmVzcy4gKi8KK2ludCBmaW5kX2NzKGludCBiaXRuZXNzKQoreworCXVuc2lnbmVkIHNob3J0IG15X2NzOworCisJYXNtICgibW92ICUlY3MsJTAiIDogICI9ciIgKG15X2NzKSk7CisKKwlpZiAoY3NfYml0bmVzcyhteV9jcykgPT0gYml0bmVzcykKKwkJcmV0dXJuIG15X2NzOworCWlmIChjc19iaXRuZXNzKG15X2NzICsgKDIgPDwgMykpID09IGJpdG5lc3MpCisJCXJldHVybiBteV9jcyArICgyIDw8IDMpOworCWlmIChteV9jcyA+ICgyPDwzKSAmJiBjc19iaXRuZXNzKG15X2NzIC0gKDIgPDwgMykpID09IGJpdG5lc3MpCisJICAgIHJldHVybiBteV9jcyAtICgyIDw8IDMpOworCWlmIChjc19iaXRuZXNzKGNvZGUxNl9zZWwpID09IGJpdG5lc3MpCisJCXJldHVybiBjb2RlMTZfc2VsOworCisJcHJpbnRmKCJbV0FSTl1cdENvdWxkIG5vdCBmaW5kICVkLWJpdCBDU1xuIiwgYml0bmVzcyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHRlc3RfdmFsaWRfc2lncmV0dXJuKGludCBjc19iaXRzLCBib29sIHVzZV8xNmJpdF9zcywgaW50IGZvcmNlX3NzKQoreworCWludCBjcyA9IGZpbmRfY3MoY3NfYml0cyk7CisJaWYgKGNzID09IC0xKSB7CisJCXByaW50ZigiW1NLSVBdXHRDb2RlIHNlZ21lbnQgdW5hdmFpbGFibGUgZm9yICVkLWJpdCBDUywgJWQtYml0IFNTXG4iLAorCQkgICAgICAgY3NfYml0cywgdXNlXzE2Yml0X3NzID8gMTYgOiAzMik7CisJCXJldHVybiAwOworCX0KKworCWlmIChmb3JjZV9zcyAhPSAtMSkgeworCQlzaWdfc3MgPSBmb3JjZV9zczsKKwl9IGVsc2UgeworCQlpZiAodXNlXzE2Yml0X3NzKSB7CisJCQlpZiAoIWRhdGExNl9zZWwpIHsKKwkJCQlwcmludGYoIltTS0lQXVx0RGF0YSBzZWdtZW50IHVuYXZhaWxhYmxlIGZvciAlZC1iaXQgQ1MsIDE2LWJpdCBTU1xuIiwKKwkJCQkgICAgICAgY3NfYml0cyk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzaWdfc3MgPSBkYXRhMTZfc2VsOworCQl9IGVsc2UgeworCQkJYXNtIHZvbGF0aWxlICgibW92ICUlc3MsJTAiIDogIj1yIiAoc2lnX3NzKSk7CisJCX0KKwl9CisKKwlzaWdfY3MgPSBjczsKKworCXByaW50ZigiW1JVTl1cdFZhbGlkIHNpZ3JldHVybjogJWQtYml0IENTICglaHgpLCAlZC1iaXQgU1MgKCVoeCVzKVxuIiwKKwkgICAgICAgY3NfYml0cywgc2lnX2NzLCB1c2VfMTZiaXRfc3MgPyAxNiA6IDMyLCBzaWdfc3MsCisJICAgICAgIChzaWdfc3MgJiA0KSA/ICIiIDogIiwgR0RUIik7CisKKwlyYWlzZShTSUdVU1IxKTsKKworCW5lcnJzID0gMDsKKworCS8qCisJICogQ2hlY2sgdGhhdCBlYWNoIHJlZ2lzdGVyIGhhZCBhbiBhY2NlcHRhYmxlIHZhbHVlIHdoZW4gdGhlCisJICogaW50MyB0cmFtcG9saW5lIHdhcyBpbnZva2VkLgorCSAqLworCWZvciAoaW50IGkgPSAwOyBpIDwgTkdSRUc7IGkrKykgeworCQlncmVnX3QgcmVxID0gcmVxdWVzdGVkX3JlZ3NbaV0sIHJlcyA9IHJlc3VsdGluZ19yZWdzW2ldOworCQlpZiAoaSA9PSBSRUdfVFJBUE5PIHx8IGkgPT0gUkVHX0lQKQorCQkJY29udGludWU7CS8qIGRvbid0IGNhcmUgKi8KKwkJaWYgKGkgPT0gUkVHX1NQKSB7CisJCQlwcmludGYoIlx0U1A6ICVsbHggLT4gJWxseFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXEsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMpOworCisJCQkvKgorCQkJICogSW4gbWFueSBjaXJjdW1zdGFuY2VzLCB0aGUgaGlnaCAzMiBiaXRzIG9mIHJzcAorCQkJICogYXJlIHplcm9lZC4gIEZvciBleGFtcGxlLCB3ZSBjb3VsZCBiZSBhIHJlYWwKKwkJCSAqIDMyLWJpdCBwcm9ncmFtLCBvciB3ZSBjb3VsZCBoaXQgYW55IG9mIGEgbnVtYmVyCisJCQkgKiBvZiBwb29ybHktZG9jdW1lbnRlZCBJUkVUIG9yIHNlZ21lbnRlZCBFU1AKKwkJCSAqIG9kZGl0aWVzLiAgSWYgdGhpcyBoYXBwZW5zLCBpdCdzIG9rYXkuCisJCQkgKi8KKwkJCWlmIChyZXMgPT0gKHJlcSAmIDB4RkZGRkZGRkYpKQorCQkJCWNvbnRpbnVlOyAgLyogT0s7IG5vdCBleHBlY3RlZCB0byB3b3JrICovCisJCX0KKworCQlib29sIGlnbm9yZV9yZWcgPSBmYWxzZTsKKyNpZiBfX2kzODZfXworCQlpZiAoaSA9PSBSRUdfVUVTUCkKKwkJCWlnbm9yZV9yZWcgPSB0cnVlOworI2Vsc2UKKwkJaWYgKGkgPT0gUkVHX0NTR1NGUykgeworCQkJc3RydWN0IHNlbGVjdG9ycyAqcmVxX3NlbHMgPQorCQkJCSh2b2lkICopJnJlcXVlc3RlZF9yZWdzW1JFR19DU0dTRlNdOworCQkJc3RydWN0IHNlbGVjdG9ycyAqcmVzX3NlbHMgPQorCQkJCSh2b2lkICopJnJlc3VsdGluZ19yZWdzW1JFR19DU0dTRlNdOworCQkJaWYgKHJlcV9zZWxzLT5jcyAhPSByZXNfc2Vscy0+Y3MpIHsKKwkJCQlwcmludGYoIltGQUlMXVx0Q1MgbWlzbWF0Y2g6IHJlcXVlc3RlZCAweCVoeDsgZ290IDB4JWh4XG4iLAorCQkJCSAgICAgICByZXFfc2Vscy0+Y3MsIHJlc19zZWxzLT5jcyk7CisJCQkJbmVycnMrKzsKKwkJCX0KKworCQkJaWYgKHJlcV9zZWxzLT5zcyAhPSByZXNfc2Vscy0+c3MpIHsKKwkJCQlwcmludGYoIltGQUlMXVx0U1MgbWlzbWF0Y2g6IHJlcXVlc3RlZCAweCVoeDsgZ290IDB4JWh4XG4iLAorCQkJCSAgICAgICByZXFfc2Vscy0+c3MsIHJlc19zZWxzLT5zcyk7CisJCQkJbmVycnMrKzsKKwkJCX0KKworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCisJCS8qIFNhbml0eSBjaGVjayBvbiB0aGUga2VybmVsICovCisJCWlmIChpID09IFJFR19BWCAmJiByZXF1ZXN0ZWRfcmVnc1tpXSAhPSByZXN1bHRpbmdfcmVnc1tpXSkgeworCQkJcHJpbnRmKCJbRkFJTF1cdEFYIChzYXZlZCBTUCkgbWlzbWF0Y2g6IHJlcXVlc3RlZCAweCVsbHg7IGdvdCAweCVsbHhcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXF1ZXN0ZWRfcmVnc1tpXSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXJlc3VsdGluZ19yZWdzW2ldKTsKKwkJCW5lcnJzKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChyZXF1ZXN0ZWRfcmVnc1tpXSAhPSByZXN1bHRpbmdfcmVnc1tpXSAmJiAhaWdub3JlX3JlZykgeworCQkJLyoKKwkJCSAqIFNQIGlzIHBhcnRpY3VsYXJseSBpbnRlcmVzdGluZyBoZXJlLiAgVGhlCisJCQkgKiB1c3VhbCBjYXVzZSBvZiBmYWlsdXJlcyBpcyB0aGF0IHdlIGhpdCB0aGUKKwkJCSAqIG5hc3R5IElSRVQgY2FzZSBvZiByZXR1cm5pbmcgdG8gYSAxNi1iaXQgU1MsCisJCQkgKiBpbiB3aGljaCBjYXNlIGJpdHMgMTY6MzEgb2YgdGhlICprZXJuZWwqCisJCQkgKiBzdGFjayBwb2ludGVyIHBlcnNpc3QgaW4gRVNQLgorCQkJICovCisJCQlwcmludGYoIltGQUlMXVx0UmVnICVkIG1pc21hdGNoOiByZXF1ZXN0ZWQgMHglbGx4OyBnb3QgMHglbGx4XG4iLAorCQkJICAgICAgIGksICh1bnNpZ25lZCBsb25nIGxvbmcpcmVxdWVzdGVkX3JlZ3NbaV0sCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXN1bHRpbmdfcmVnc1tpXSk7CisJCQluZXJycysrOworCQl9CisJfQorCisJaWYgKG5lcnJzID09IDApCisJCXByaW50ZigiW09LXVx0YWxsIHJlZ2lzdGVycyBva2F5XG4iKTsKKworCXJldHVybiBuZXJyczsKK30KKworc3RhdGljIGludCB0ZXN0X2JhZF9pcmV0KGludCBjc19iaXRzLCB1bnNpZ25lZCBzaG9ydCBzcywgaW50IGZvcmNlX2NzKQoreworCWludCBjcyA9IGZvcmNlX2NzID09IC0xID8gZmluZF9jcyhjc19iaXRzKSA6IGZvcmNlX2NzOworCWlmIChjcyA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlzaWdfY3MgPSBjczsKKwlzaWdfc3MgPSBzczsKKworCXByaW50ZigiW1JVTl1cdCVkLWJpdCBDUyAoJWh4KSwgYm9ndXMgU1MgKCVoeClcbiIsCisJICAgICAgIGNzX2JpdHMsIHNpZ19jcywgc2lnX3NzKTsKKworCXNpZ190cmFwcGVkID0gMDsKKwlyYWlzZShTSUdVU1IxKTsKKwlpZiAoc2lnX3RyYXBwZWQpIHsKKwkJY2hhciBlcnJkZXNjWzMyXSA9ICIiOworCQlpZiAoc2lnX2VycikgeworCQkJY29uc3QgY2hhciAqc3JjID0gKHNpZ19lcnIgJiAxKSA/ICIgRVhUIiA6ICIiOworCQkJY29uc3QgY2hhciAqdGFibGU7CisJCQlpZiAoKHNpZ19lcnIgJiAweDYpID09IDB4MCkKKwkJCQl0YWJsZSA9ICJHRFQiOworCQkJZWxzZSBpZiAoKHNpZ19lcnIgJiAweDYpID09IDB4NCkKKwkJCQl0YWJsZSA9ICJMRFQiOworCQkJZWxzZSBpZiAoKHNpZ19lcnIgJiAweDYpID09IDB4MikKKwkJCQl0YWJsZSA9ICJJRFQiOworCQkJZWxzZQorCQkJCXRhYmxlID0gIj8/PyI7CisKKwkJCXNwcmludGYoZXJyZGVzYywgIiVzJXMgaW5kZXggJWQsICIsCisJCQkJdGFibGUsIHNyYywgc2lnX2VyciA+PiAzKTsKKwkJfQorCisJCWNoYXIgdHJhcG5hbWVbMzJdOworCQlpZiAoc2lnX3RyYXBubyA9PSAxMykKKwkJCXN0cmNweSh0cmFwbmFtZSwgIkdQIik7CisJCWVsc2UgaWYgKHNpZ190cmFwbm8gPT0gMTEpCisJCQlzdHJjcHkodHJhcG5hbWUsICJOUCIpOworCQllbHNlIGlmIChzaWdfdHJhcG5vID09IDEyKQorCQkJc3RyY3B5KHRyYXBuYW1lLCAiU1MiKTsKKwkJZWxzZSBpZiAoc2lnX3RyYXBubyA9PSAzMikKKwkJCXN0cmNweSh0cmFwbmFtZSwgIklSRVQiKTsgIC8qIFg4Nl9UUkFQX0lSRVQgKi8KKwkJZWxzZQorCQkJc3ByaW50Zih0cmFwbmFtZSwgIiVkIiwgc2lnX3RyYXBubyk7CisKKwkJcHJpbnRmKCJbT0tdXHRHb3QgIyVzKDB4JWx4KSAoaS5lLiAlcyVzKVxuIiwKKwkJICAgICAgIHRyYXBuYW1lLCAodW5zaWduZWQgbG9uZylzaWdfZXJyLAorCQkgICAgICAgZXJyZGVzYywgc3Ryc2lnbmFsKHNpZ190cmFwcGVkKSk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXByaW50ZigiW0ZBSUxdXHREaWQgbm90IGdldCBTSUdTRUdWXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorfQorCitpbnQgbWFpbigpCit7CisJaW50IHRvdGFsX25lcnJzID0gMDsKKwl1bnNpZ25lZCBzaG9ydCBteV9jcywgbXlfc3M7CisKKwlhc20gdm9sYXRpbGUgKCJtb3YgJSVjcywlMCIgOiAiPXIiIChteV9jcykpOworCWFzbSB2b2xhdGlsZSAoIm1vdiAlJXNzLCUwIiA6ICI9ciIgKG15X3NzKSk7CisJc2V0dXBfbGR0KCk7CisKKwlzdGFja190IHN0YWNrID0geworCQkuc3Nfc3AgPSBhbHRzdGFja19kYXRhLAorCQkuc3Nfc2l6ZSA9IFNJR1NUS1NaLAorCX07CisJaWYgKHNpZ2FsdHN0YWNrKCZzdGFjaywgTlVMTCkgIT0gMCkKKwkJZXJyKDEsICJzaWdhbHRzdGFjayIpOworCisJc2V0aGFuZGxlcihTSUdVU1IxLCBzaWd1c3IxLCAwKTsKKwlzZXRoYW5kbGVyKFNJR1RSQVAsIHNpZ3RyYXAsIFNBX09OU1RBQ0spOworCisJLyogRWFzeSBjYXNlczogcmV0dXJuIHRvIGEgMzItYml0IFNTIGluIGVhY2ggcG9zc2libGUgQ1MgYml0bmVzcy4gKi8KKwl0b3RhbF9uZXJycyArPSB0ZXN0X3ZhbGlkX3NpZ3JldHVybig2NCwgZmFsc2UsIC0xKTsKKwl0b3RhbF9uZXJycyArPSB0ZXN0X3ZhbGlkX3NpZ3JldHVybigzMiwgZmFsc2UsIC0xKTsKKwl0b3RhbF9uZXJycyArPSB0ZXN0X3ZhbGlkX3NpZ3JldHVybigxNiwgZmFsc2UsIC0xKTsKKworCS8qCisJICogVGVzdCBlYXN5IGVzcGZpeCBjYXNlczogcmV0dXJuIHRvIGEgMTYtYml0IExEVCBTUyBpbiBlYWNoIHBvc3NpYmxlCisJICogQ1MgYml0bmVzcy4gIE5COiB3aXRoIGEgbG9uZyBtb2RlIENTLCB0aGUgU1MgYml0bmVzcyBpcyBpcnJlbGV2YW50LgorCSAqCisJICogVGhpcyBjYXRjaGVzIHRoZSBvcmlnaW5hbCBtaXNzaW5nLWVzcGZpeC1vbi02NC1iaXQta2VybmVscyBpc3N1ZQorCSAqIGFzIHdlbGwgYXMgQ1ZFLTIwMTQtODEzNC4KKwkgKi8KKwl0b3RhbF9uZXJycyArPSB0ZXN0X3ZhbGlkX3NpZ3JldHVybig2NCwgdHJ1ZSwgLTEpOworCXRvdGFsX25lcnJzICs9IHRlc3RfdmFsaWRfc2lncmV0dXJuKDMyLCB0cnVlLCAtMSk7CisJdG90YWxfbmVycnMgKz0gdGVzdF92YWxpZF9zaWdyZXR1cm4oMTYsIHRydWUsIC0xKTsKKworCWlmIChnZHRfZGF0YTE2X2lkeCkgeworCQkvKgorCQkgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgTGludXggc2tpcHMgZXNwZml4IGlmIFNTIHBvaW50cworCQkgKiB0byB0aGUgR0RULiAgSWYgd2Ugd2VyZSBhYmxlIHRvIGFsbG9jYXRlIGEgMTYtYml0IFNTIGluCisJCSAqIHRoZSBHRFQsIHNlZSBpZiBpdCBsZWFrcyBwYXJ0cyBvZiB0aGUga2VybmVsIHN0YWNrIHBvaW50ZXIuCisJCSAqCisJCSAqIFRoaXMgdGVzdHMgZm9yIENWRS0yMDE0LTgxMzMuCisJCSAqLworCQl0b3RhbF9uZXJycyArPSB0ZXN0X3ZhbGlkX3NpZ3JldHVybig2NCwgdHJ1ZSwKKwkJCQkJCSAgICBHRFQzKGdkdF9kYXRhMTZfaWR4KSk7CisJCXRvdGFsX25lcnJzICs9IHRlc3RfdmFsaWRfc2lncmV0dXJuKDMyLCB0cnVlLAorCQkJCQkJICAgIEdEVDMoZ2R0X2RhdGExNl9pZHgpKTsKKwkJdG90YWxfbmVycnMgKz0gdGVzdF92YWxpZF9zaWdyZXR1cm4oMTYsIHRydWUsCisJCQkJCQkgICAgR0RUMyhnZHRfZGF0YTE2X2lkeCkpOworCX0KKworCS8qCisJICogV2UncmUgZG9uZSB0ZXN0aW5nIHZhbGlkIHNpZ3JldHVybiBjYXNlcy4gIE5vdyB3ZSB0ZXN0IHN0YXRlcworCSAqIGZvciB3aGljaCBzaWdyZXR1cm4gaXRzZWxmIHdpbGwgc3VjY2VlZCBidXQgdGhlIHN1YnNlcXVlbnQKKwkgKiBlbnRyeSB0byB1c2VyIG1vZGUgd2lsbCBmYWlsLgorCSAqCisJICogRGVwZW5kaW5nIG9uIHRoZSBmYWlsdXJlIG1vZGUgYW5kIHRoZSBrZXJuZWwgYml0bmVzcywgdGhlc2UKKwkgKiBlbnRyeSBmYWlsdXJlcyBjYW4gZ2VuZXJhdGUgU0lHU0VHViwgU0lHQlVTLCBvciBTSUdJTEwuCisJICovCisJY2xlYXJoYW5kbGVyKFNJR1RSQVApOworCXNldGhhbmRsZXIoU0lHU0VHViwgc2lndHJhcCwgU0FfT05TVEFDSyk7CisJc2V0aGFuZGxlcihTSUdCVVMsIHNpZ3RyYXAsIFNBX09OU1RBQ0spOworCXNldGhhbmRsZXIoU0lHSUxMLCBzaWd0cmFwLCBTQV9PTlNUQUNLKTsgIC8qIDMyLWJpdCBrZXJuZWxzIGRvIHRoaXMgKi8KKworCS8qIEVhc3kgZmFpbHVyZXM6IGludmFsaWQgU1MsIHJlc3VsdGluZyBpbiAjR1AoMCkgKi8KKwl0ZXN0X2JhZF9pcmV0KDY0LCBsZHRfbm9uZXhpc3RlbnRfc2VsLCAtMSk7CisJdGVzdF9iYWRfaXJldCgzMiwgbGR0X25vbmV4aXN0ZW50X3NlbCwgLTEpOworCXRlc3RfYmFkX2lyZXQoMTYsIGxkdF9ub25leGlzdGVudF9zZWwsIC0xKTsKKworCS8qIFRoZXNlIGZhaWwgYmVjYXVzZSBTUyBpc24ndCBhIGRhdGEgc2VnbWVudCwgcmVzdWx0aW5nIGluICNHUChTUykgKi8KKwl0ZXN0X2JhZF9pcmV0KDY0LCBteV9jcywgLTEpOworCXRlc3RfYmFkX2lyZXQoMzIsIG15X2NzLCAtMSk7CisJdGVzdF9iYWRfaXJldCgxNiwgbXlfY3MsIC0xKTsKKworCS8qIFRyeSB0byByZXR1cm4gdG8gYSBub3QtcHJlc2VudCBjb2RlIHNlZ21lbnQsIHRyaWdnZXJpbmcgI05QKFNTKS4gKi8KKwl0ZXN0X2JhZF9pcmV0KDMyLCBteV9zcywgbnBjb2RlMzJfc2VsKTsKKworCS8qCisJICogVHJ5IHRvIHJldHVybiB0byBhIG5vdC1wcmVzZW50IGJ1dCBvdGhlcndpc2UgdmFsaWQgZGF0YSBzZWdtZW50LgorCSAqIFRoaXMgd2lsbCBjYXVzZSBJUkVUIHRvIGZhaWwgd2l0aCAjU1Mgb24gdGhlIGVzcGZpeCBzdGFjay4gIFRoaXMKKwkgKiBleGVyY2lzZXMgQ1ZFLTIwMTQtOTMyMi4KKwkgKgorCSAqIE5vdGUgdGhhdCwgaWYgZXNwZml4IGlzIGVuYWJsZWQsIDY0LWJpdCBMaW51eCB3aWxsIGxvc2UgdHJhY2sKKwkgKiBvZiB0aGUgYWN0dWFsIGNhdXNlIG9mIGZhaWx1cmUgYW5kIHJlcG9ydCAjR1AoMCkgaW5zdGVhZC4KKwkgKiBUaGlzIHdvdWxkIGJlIHZlcnkgZGlmZmljdWx0IGZvciBMaW51eCB0byBhdm9pZCwgYmVjYXVzZQorCSAqIGVzcGZpeDY0IGNhdXNlcyBJUkVUIGZhaWx1cmVzIHRvIGJlIHByb21vdGVkIHRvICNERiwgc28gdGhlCisJICogb3JpZ2luYWwgZXhjZXB0aW9uIGZyYW1lIGlzIG5ldmVyIHB1c2hlZCBvbnRvIHRoZSBzdGFjay4KKwkgKi8KKwl0ZXN0X2JhZF9pcmV0KDMyLCBucGRhdGEzMl9zZWwsIC0xKTsKKworCS8qCisJICogVHJ5IHRvIHJldHVybiB0byBhIG5vdC1wcmVzZW50IGJ1dCBvdGhlcndpc2UgdmFsaWQgZGF0YQorCSAqIHNlZ21lbnQgd2l0aG91dCBpbnZva2luZyBlc3BmaXguICBOZXdlciBrZXJuZWxzIGRvbid0IGFsbG93CisJICogdGhpcyB0byBoYXBwZW4gaW4gdGhlIGZpcnN0IHBsYWNlLiAgT24gb2xkZXIga2VybmVscywgdGhvdWdoLAorCSAqIHRoaXMgY2FuIHRyaWdnZXIgQ1ZFLTIwMTQtOTMyMi4KKwkgKi8KKwlpZiAoZ2R0X25wZGF0YTMyX2lkeCkKKwkJdGVzdF9iYWRfaXJldCgzMiwgR0RUMyhnZHRfbnBkYXRhMzJfaWR4KSwgLTEpOworCisJcmV0dXJuIHRvdGFsX25lcnJzID8gMSA6IDA7Cit9CmRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvdHJpdmlhbF8zMmJpdF9wcm9ncmFtLmMgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy94ODYvdHJpdmlhbF8zMmJpdF9wcm9ncmFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUyMzFiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL3g4Ni90cml2aWFsXzMyYml0X3Byb2dyYW0uYwpAQCAtMCwwICsxLDE0IEBACisvKgorICogVHJpdmlhbCBwcm9ncmFtIHRvIGNoZWNrIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIDMyLWJpdCBidWlsZCBlbnZpcm9ubWVudC4KKyAqIENvcHlyaWdodCAoYykgMjAxNSBBbmR5IEx1dG9taXJza2kKKyAqIEdQTCB2MgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitpbnQgbWFpbigpCit7CisJcHJpbnRmKCJcbiIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vYXJjaF90aW1lci5jIGIvdmlydC9rdm0vYXJtL2FyY2hfdGltZXIuYwppbmRleCA2ZTU0ZjM1Li45OGM5NWYyIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vYXJjaF90aW1lci5jCisrKyBiL3ZpcnQva3ZtL2FybS9hcmNoX3RpbWVyLmMKQEAgLTg1LDEzICs4NSwyMiBAQAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAorLyoKKyAqIFdvcmsgZnVuY3Rpb24gZm9yIGhhbmRsaW5nIHRoZSBiYWNrdXAgdGltZXIgdGhhdCB3ZSBzY2hlZHVsZSB3aGVuIGEgdmNwdSBpcworICogbm8gbG9uZ2VyIHJ1bm5pbmcsIGJ1dCBoYWQgYSB0aW1lciBwcm9ncmFtbWVkIHRvIGZpcmUgaW4gdGhlIGZ1dHVyZS4KKyAqLwogc3RhdGljIHZvaWQga3ZtX3RpbWVyX2luamVjdF9pcnFfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGt2bV92Y3B1ICp2Y3B1OwogCiAJdmNwdSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qga3ZtX3ZjcHUsIGFyY2gudGltZXJfY3B1LmV4cGlyZWQpOwogCXZjcHUtPmFyY2gudGltZXJfY3B1LmFybWVkID0gZmFsc2U7Ci0Ja3ZtX3RpbWVyX2luamVjdF9pcnEodmNwdSk7CisKKwkvKgorCSAqIElmIHRoZSB2Y3B1IGlzIGJsb2NrZWQgd2Ugd2FudCB0byB3YWtlIGl0IHVwIHNvIHRoYXQgaXQgd2lsbCBzZWUKKwkgKiB0aGUgdGltZXIgaGFzIGV4cGlyZWQgd2hlbiBlbnRlcmluZyB0aGUgZ3Vlc3QuCisJICovCisJa3ZtX3ZjcHVfa2ljayh2Y3B1KTsKIH0KIAogc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGt2bV90aW1lcl9leHBpcmUoc3RydWN0IGhydGltZXIgKmhydCkKQEAgLTEwMiw2ICsxMTEsMjEgQEAKIAlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CiB9CiAKK2Jvb2wga3ZtX3RpbWVyX3Nob3VsZF9maXJlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3QgYXJjaF90aW1lcl9jcHUgKnRpbWVyID0gJnZjcHUtPmFyY2gudGltZXJfY3B1OworCWN5Y2xlX3QgY3ZhbCwgbm93OworCisJaWYgKCh0aW1lci0+Y250dl9jdGwgJiBBUkNIX1RJTUVSX0NUUkxfSVRfTUFTSykgfHwKKwkJISh0aW1lci0+Y250dl9jdGwgJiBBUkNIX1RJTUVSX0NUUkxfRU5BQkxFKSkKKwkJcmV0dXJuIGZhbHNlOworCisJY3ZhbCA9IHRpbWVyLT5jbnR2X2N2YWw7CisJbm93ID0ga3ZtX3BoeXNfdGltZXJfcmVhZCgpIC0gdmNwdS0+a3ZtLT5hcmNoLnRpbWVyLmNudHZvZmY7CisKKwlyZXR1cm4gY3ZhbCA8PSBub3c7Cit9CisKIC8qKgogICoga3ZtX3RpbWVyX2ZsdXNoX2h3c3RhdGUgLSBwcmVwYXJlIHRvIG1vdmUgdGhlIHZpcnQgdGltZXIgdG8gdGhlIGNwdQogICogQHZjcHU6IFRoZSB2Y3B1IHBvaW50ZXIKQEAgLTExOSw2ICsxNDMsMTMgQEAKIAkgKiBwb3B1bGF0ZSB0aGUgQ1BVIHRpbWVyIGFnYWluLgogCSAqLwogCXRpbWVyX2Rpc2FybSh0aW1lcik7CisKKwkvKgorCSAqIElmIHRoZSB0aW1lciBleHBpcmVkIHdoaWxlIHdlIHdlcmUgbm90IHNjaGVkdWxlZCwgbm93IGlzIHRoZSB0aW1lCisJICogdG8gaW5qZWN0IGl0LgorCSAqLworCWlmIChrdm1fdGltZXJfc2hvdWxkX2ZpcmUodmNwdSkpCisJCWt2bV90aW1lcl9pbmplY3RfaXJxKHZjcHUpOwogfQogCiAvKioKQEAgLTEzNCwxNiArMTY1LDkgQEAKIAljeWNsZV90IGN2YWwsIG5vdzsKIAl1NjQgbnM7CiAKLQlpZiAoKHRpbWVyLT5jbnR2X2N0bCAmIEFSQ0hfVElNRVJfQ1RSTF9JVF9NQVNLKSB8fAotCQkhKHRpbWVyLT5jbnR2X2N0bCAmIEFSQ0hfVElNRVJfQ1RSTF9FTkFCTEUpKQotCQlyZXR1cm47Ci0KLQljdmFsID0gdGltZXItPmNudHZfY3ZhbDsKLQlub3cgPSBrdm1fcGh5c190aW1lcl9yZWFkKCkgLSB2Y3B1LT5rdm0tPmFyY2gudGltZXIuY250dm9mZjsKLQogCUJVR19PTih0aW1lcl9pc19hcm1lZCh0aW1lcikpOwogCi0JaWYgKGN2YWwgPD0gbm93KSB7CisJaWYgKGt2bV90aW1lcl9zaG91bGRfZmlyZSh2Y3B1KSkgewogCQkvKgogCQkgKiBUaW1lciBoYXMgYWxyZWFkeSBleHBpcmVkIHdoaWxlIHdlIHdlcmUgbm90CiAJCSAqIGxvb2tpbmcuIEluamVjdCB0aGUgaW50ZXJydXB0IGFuZCBjYXJyeSBvbi4KQEAgLTE1Miw2ICsxNzYsOSBAQAogCQlyZXR1cm47CiAJfQogCisJY3ZhbCA9IHRpbWVyLT5jbnR2X2N2YWw7CisJbm93ID0ga3ZtX3BoeXNfdGltZXJfcmVhZCgpIC0gdmNwdS0+a3ZtLT5hcmNoLnRpbWVyLmNudHZvZmY7CisKIAlucyA9IGN5Y2xlY291bnRlcl9jeWMybnModGltZWNvdW50ZXItPmNjLCBjdmFsIC0gbm93LCB0aW1lY291bnRlci0+bWFzaywKIAkJCQkgJnRpbWVjb3VudGVyLT5mcmFjKTsKIAl0aW1lcl9hcm0odGltZXIsIG5zKTsKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS92Z2ljLXYyLWVtdWwuYyBiL3ZpcnQva3ZtL2FybS92Z2ljLXYyLWVtdWwuYwppbmRleCAxOWM2MjEwLi4xMzkwNzk3IDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy12Mi1lbXVsLmMKKysrIGIvdmlydC9rdm0vYXJtL3ZnaWMtdjItZW11bC5jCkBAIC0xMDcsNiArMTA3LDIyIEBACiAJCQkJCSAgICAgdmNwdS0+dmNwdV9pZCk7CiB9CiAKK3N0YXRpYyBib29sIGhhbmRsZV9tbWlvX3NldF9hY3RpdmVfcmVnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkgICAgICAgc3RydWN0IGt2bV9leGl0X21taW8gKm1taW8sCisJCQkJICAgICAgIHBoeXNfYWRkcl90IG9mZnNldCkKK3sKKwlyZXR1cm4gdmdpY19oYW5kbGVfc2V0X2FjdGl2ZV9yZWcodmNwdS0+a3ZtLCBtbWlvLCBvZmZzZXQsCisJCQkJCSAgdmNwdS0+dmNwdV9pZCk7Cit9CisKK3N0YXRpYyBib29sIGhhbmRsZV9tbWlvX2NsZWFyX2FjdGl2ZV9yZWcoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCQkgc3RydWN0IGt2bV9leGl0X21taW8gKm1taW8sCisJCQkJCSBwaHlzX2FkZHJfdCBvZmZzZXQpCit7CisJcmV0dXJuIHZnaWNfaGFuZGxlX2NsZWFyX2FjdGl2ZV9yZWcodmNwdS0+a3ZtLCBtbWlvLCBvZmZzZXQsCisJCQkJCSAgICB2Y3B1LT52Y3B1X2lkKTsKK30KKwogc3RhdGljIGJvb2wgaGFuZGxlX21taW9fcHJpb3JpdHlfcmVnKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKIAkJCQkgICAgIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvLAogCQkJCSAgICAgcGh5c19hZGRyX3Qgb2Zmc2V0KQpAQCAtMzAzLDcgKzMxOSw3IEBACiAJCXJldHVybiB3cml0ZV9zZXRfY2xlYXJfc2dpX3BlbmRfcmVnKHZjcHUsIG1taW8sIG9mZnNldCwgZmFsc2UpOwogfQogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGt2bV9tbWlvX3JhbmdlIHZnaWNfZGlzdF9yYW5nZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmdpY19pb19yYW5nZSB2Z2ljX2Rpc3RfcmFuZ2VzW10gPSB7CiAJewogCQkuYmFzZQkJPSBHSUNfRElTVF9DVFJMLAogCQkubGVuCQk9IDEyLApAQCAtMzQ0LDEzICszNjAsMTMgQEAKIAkJLmJhc2UJCT0gR0lDX0RJU1RfQUNUSVZFX1NFVCwKIAkJLmxlbgkJPSBWR0lDX01BWF9JUlFTIC8gOCwKIAkJLmJpdHNfcGVyX2lycQk9IDEsCi0JCS5oYW5kbGVfbW1pbwk9IGhhbmRsZV9tbWlvX3Jhel93aSwKKwkJLmhhbmRsZV9tbWlvCT0gaGFuZGxlX21taW9fc2V0X2FjdGl2ZV9yZWcsCiAJfSwKIAl7CiAJCS5iYXNlCQk9IEdJQ19ESVNUX0FDVElWRV9DTEVBUiwKIAkJLmxlbgkJPSBWR0lDX01BWF9JUlFTIC8gOCwKIAkJLmJpdHNfcGVyX2lycQk9IDEsCi0JCS5oYW5kbGVfbW1pbwk9IGhhbmRsZV9tbWlvX3Jhel93aSwKKwkJLmhhbmRsZV9tbWlvCT0gaGFuZGxlX21taW9fY2xlYXJfYWN0aXZlX3JlZywKIAl9LAogCXsKIAkJLmJhc2UJCT0gR0lDX0RJU1RfUFJJLApAQCAtMzg4LDI0ICs0MDQsNiBAQAogCXt9CiB9OwogCi1zdGF0aWMgYm9vbCB2Z2ljX3YyX2hhbmRsZV9tbWlvKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9ydW4gKnJ1biwKLQkJCQlzdHJ1Y3Qga3ZtX2V4aXRfbW1pbyAqbW1pbykKLXsKLQl1bnNpZ25lZCBsb25nIGJhc2UgPSB2Y3B1LT5rdm0tPmFyY2gudmdpYy52Z2ljX2Rpc3RfYmFzZTsKLQotCWlmICghaXNfaW5fcmFuZ2UobW1pby0+cGh5c19hZGRyLCBtbWlvLT5sZW4sIGJhc2UsCi0JCQkgS1ZNX1ZHSUNfVjJfRElTVF9TSVpFKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyogR0lDdjIgZG9lcyBub3Qgc3VwcG9ydCBhY2Nlc3NlcyB3aWRlciB0aGFuIDMyIGJpdHMgKi8KLQlpZiAobW1pby0+bGVuID4gNCkgewotCQlrdm1faW5qZWN0X2RhYnQodmNwdSwgbW1pby0+cGh5c19hZGRyKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcmV0dXJuIHZnaWNfaGFuZGxlX21taW9fcmFuZ2UodmNwdSwgcnVuLCBtbWlvLCB2Z2ljX2Rpc3RfcmFuZ2VzLCBiYXNlKTsKLX0KLQogc3RhdGljIHZvaWQgdmdpY19kaXNwYXRjaF9zZ2koc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCB1MzIgcmVnKQogewogCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtPmt2bTsKQEAgLTQ5MCw2ICs0ODgsNyBAQAogc3RhdGljIGludCB2Z2ljX3YyX21hcF9yZXNvdXJjZXMoc3RydWN0IGt2bSAqa3ZtLAogCQkJCSBjb25zdCBzdHJ1Y3QgdmdpY19wYXJhbXMgKnBhcmFtcykKIHsKKwlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0ID0gJmt2bS0+YXJjaC52Z2ljOwogCWludCByZXQgPSAwOwogCiAJaWYgKCFpcnFjaGlwX2luX2tlcm5lbChrdm0pKQpAQCAtNTAwLDEzICs0OTksMTcgQEAKIAlpZiAodmdpY19yZWFkeShrdm0pKQogCQlnb3RvIG91dDsKIAotCWlmIChJU19WR0lDX0FERFJfVU5ERUYoa3ZtLT5hcmNoLnZnaWMudmdpY19kaXN0X2Jhc2UpIHx8Ci0JICAgIElTX1ZHSUNfQUREUl9VTkRFRihrdm0tPmFyY2gudmdpYy52Z2ljX2NwdV9iYXNlKSkgeworCWlmIChJU19WR0lDX0FERFJfVU5ERUYoZGlzdC0+dmdpY19kaXN0X2Jhc2UpIHx8CisJICAgIElTX1ZHSUNfQUREUl9VTkRFRihkaXN0LT52Z2ljX2NwdV9iYXNlKSkgewogCQlrdm1fZXJyKCJOZWVkIHRvIHNldCB2Z2ljIGNwdSBhbmQgZGlzdCBhZGRyZXNzZXMgZmlyc3RcbiIpOwogCQlyZXQgPSAtRU5YSU87CiAJCWdvdG8gb3V0OwogCX0KIAorCXZnaWNfcmVnaXN0ZXJfa3ZtX2lvX2Rldihrdm0sIGRpc3QtPnZnaWNfZGlzdF9iYXNlLAorCQkJCSBLVk1fVkdJQ19WMl9ESVNUX1NJWkUsCisJCQkJIHZnaWNfZGlzdF9yYW5nZXMsIC0xLCAmZGlzdC0+ZGlzdF9pb2Rldik7CisKIAkvKgogCSAqIEluaXRpYWxpemUgdGhlIHZnaWMgaWYgdGhpcyBoYXNuJ3QgYWxyZWFkeSBiZWVuIGRvbmUgb24gZGVtYW5kIGJ5CiAJICogYWNjZXNzaW5nIHRoZSB2Z2ljIHN0YXRlIGZyb20gdXNlcnNwYWNlLgpAQCAtNTE0LDE4ICs1MTcsMjMgQEAKIAlyZXQgPSB2Z2ljX2luaXQoa3ZtKTsKIAlpZiAocmV0KSB7CiAJCWt2bV9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtYXBzXG4iKTsKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CiAJfQogCi0JcmV0ID0ga3ZtX3BoeXNfYWRkcl9pb3JlbWFwKGt2bSwga3ZtLT5hcmNoLnZnaWMudmdpY19jcHVfYmFzZSwKKwlyZXQgPSBrdm1fcGh5c19hZGRyX2lvcmVtYXAoa3ZtLCBkaXN0LT52Z2ljX2NwdV9iYXNlLAogCQkJCSAgICBwYXJhbXMtPnZjcHVfYmFzZSwgS1ZNX1ZHSUNfVjJfQ1BVX1NJWkUsCiAJCQkJICAgIHRydWUpOwogCWlmIChyZXQpIHsKIAkJa3ZtX2VycigiVW5hYmxlIHRvIHJlbWFwIFZHSUMgQ1BVIHRvIFZDUFVcbiIpOwotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5yZWdpc3RlcjsKIAl9CiAKLQlrdm0tPmFyY2gudmdpYy5yZWFkeSA9IHRydWU7CisJZGlzdC0+cmVhZHkgPSB0cnVlOworCWdvdG8gb3V0OworCitvdXRfdW5yZWdpc3RlcjoKKwlrdm1faW9fYnVzX3VucmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX01NSU9fQlVTLCAmZGlzdC0+ZGlzdF9pb2Rldi5kZXYpOworCiBvdXQ6CiAJaWYgKHJldCkKIAkJa3ZtX3ZnaWNfZGVzdHJveShrdm0pOwpAQCAtNTU0LDcgKzU2Miw2IEBACiB7CiAJc3RydWN0IHZnaWNfZGlzdCAqZGlzdCA9ICZrdm0tPmFyY2gudmdpYzsKIAotCWRpc3QtPnZtX29wcy5oYW5kbGVfbW1pbyA9IHZnaWNfdjJfaGFuZGxlX21taW87CiAJZGlzdC0+dm1fb3BzLnF1ZXVlX3NnaSA9IHZnaWNfdjJfcXVldWVfc2dpOwogCWRpc3QtPnZtX29wcy5hZGRfc2dpX3NvdXJjZSA9IHZnaWNfdjJfYWRkX3NnaV9zb3VyY2U7CiAJZGlzdC0+dm1fb3BzLmluaXRfbW9kZWwgPSB2Z2ljX3YyX2luaXRfbW9kZWw7CkBAIC02MzEsNyArNjM4LDcgQEAKICAqIENQVSBJbnRlcmZhY2UgUmVnaXN0ZXIgYWNjZXNzZXMgLSB0aGVzZSBhcmUgbm90IGFjY2Vzc2VkIGJ5IHRoZSBWTSwgYnV0IGJ5CiAgKiB1c2VyIHNwYWNlIGZvciBzYXZpbmcgYW5kIHJlc3RvcmluZyBWR0lDIHN0YXRlLgogICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGt2bV9tbWlvX3JhbmdlIHZnaWNfY3B1X3Jhbmdlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2Z2ljX2lvX3JhbmdlIHZnaWNfY3B1X3Jhbmdlc1tdID0gewogCXsKIAkJLmJhc2UJCT0gR0lDX0NQVV9DVFJMLAogCQkubGVuCQk9IDEyLApAQCAtNjU4LDEyICs2NjUsMTMgQEAKIAkJCQkgc3RydWN0IGt2bV9kZXZpY2VfYXR0ciAqYXR0ciwKIAkJCQkgdTMyICpyZWcsIGJvb2wgaXNfd3JpdGUpCiB7Ci0JY29uc3Qgc3RydWN0IGt2bV9tbWlvX3JhbmdlICpyID0gTlVMTCwgKnJhbmdlczsKKwljb25zdCBzdHJ1Y3QgdmdpY19pb19yYW5nZSAqciA9IE5VTEwsICpyYW5nZXM7CiAJcGh5c19hZGRyX3Qgb2Zmc2V0OwogCWludCByZXQsIGNwdWlkLCBjOwogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgKnRtcF92Y3B1OwogCXN0cnVjdCB2Z2ljX2Rpc3QgKnZnaWM7CiAJc3RydWN0IGt2bV9leGl0X21taW8gbW1pbzsKKwl1MzIgZGF0YTsKIAogCW9mZnNldCA9IGF0dHItPmF0dHIgJiBLVk1fREVWX0FSTV9WR0lDX09GRlNFVF9NQVNLOwogCWNwdWlkID0gKGF0dHItPmF0dHIgJiBLVk1fREVWX0FSTV9WR0lDX0NQVUlEX01BU0spID4+CkBAIC02ODUsNiArNjkzLDcgQEAKIAogCW1taW8ubGVuID0gNDsKIAltbWlvLmlzX3dyaXRlID0gaXNfd3JpdGU7CisJbW1pby5kYXRhID0gJmRhdGE7CiAJaWYgKGlzX3dyaXRlKQogCQltbWlvX2RhdGFfd3JpdGUoJm1taW8sIH4wLCAqcmVnKTsKIAlzd2l0Y2ggKGF0dHItPmdyb3VwKSB7CkBAIC02OTksNyArNzA4LDcgQEAKIAlkZWZhdWx0OgogCQlCVUcoKTsKIAl9Ci0JciA9IHZnaWNfZmluZF9yYW5nZShyYW5nZXMsICZtbWlvLCBvZmZzZXQpOworCXIgPSB2Z2ljX2ZpbmRfcmFuZ2UocmFuZ2VzLCA0LCBvZmZzZXQpOwogCiAJaWYgKHVubGlrZWx5KCFyIHx8ICFyLT5oYW5kbGVfbW1pbykpIHsKIAkJcmV0ID0gLUVOWElPOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMtdjIuYyBiL3ZpcnQva3ZtL2FybS92Z2ljLXYyLmMKaW5kZXggYTBhN2I1ZC4uZjliOWM3YyAxMDA2NDQKLS0tIGEvdmlydC9rdm0vYXJtL3ZnaWMtdjIuYworKysgYi92aXJ0L2t2bS9hcm0vdmdpYy12Mi5jCkBAIC03Miw2ICs3Miw4IEBACiB7CiAJaWYgKCEobHJfZGVzYy5zdGF0ZSAmIExSX1NUQVRFX01BU0spKQogCQl2Y3B1LT5hcmNoLnZnaWNfY3B1LnZnaWNfdjIudmdpY19lbHJzciB8PSAoMVVMTCA8PCBscik7CisJZWxzZQorCQl2Y3B1LT5hcmNoLnZnaWNfY3B1LnZnaWNfdjIudmdpY19lbHJzciAmPSB+KDFVTEwgPDwgbHIpOwogfQogCiBzdGF0aWMgdTY0IHZnaWNfdjJfZ2V0X2VscnNyKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTg0LDYgKzg2LDExIEBACiAJcmV0dXJuIHZjcHUtPmFyY2gudmdpY19jcHUudmdpY192Mi52Z2ljX2Vpc3I7CiB9CiAKK3N0YXRpYyB2b2lkIHZnaWNfdjJfY2xlYXJfZWlzcihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCit7CisJdmNwdS0+YXJjaC52Z2ljX2NwdS52Z2ljX3YyLnZnaWNfZWlzciA9IDA7Cit9CisKIHN0YXRpYyB1MzIgdmdpY192Ml9nZXRfaW50ZXJydXB0X3N0YXR1cyhjb25zdCBzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJdTMyIG1pc3IgPSB2Y3B1LT5hcmNoLnZnaWNfY3B1LnZnaWNfdjIudmdpY19taXNyOwpAQCAtMTQ4LDYgKzE1NSw3IEBACiAJLnN5bmNfbHJfZWxyc3IJCT0gdmdpY192Ml9zeW5jX2xyX2VscnNyLAogCS5nZXRfZWxyc3IJCT0gdmdpY192Ml9nZXRfZWxyc3IsCiAJLmdldF9laXNyCQk9IHZnaWNfdjJfZ2V0X2Vpc3IsCisJLmNsZWFyX2Vpc3IJCT0gdmdpY192Ml9jbGVhcl9laXNyLAogCS5nZXRfaW50ZXJydXB0X3N0YXR1cwk9IHZnaWNfdjJfZ2V0X2ludGVycnVwdF9zdGF0dXMsCiAJLmVuYWJsZV91bmRlcmZsb3cJPSB2Z2ljX3YyX2VuYWJsZV91bmRlcmZsb3csCiAJLmRpc2FibGVfdW5kZXJmbG93CT0gdmdpY192Ml9kaXNhYmxlX3VuZGVyZmxvdywKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2FybS92Z2ljLXYzLWVtdWwuYyBiL3ZpcnQva3ZtL2FybS92Z2ljLXYzLWVtdWwuYwppbmRleCBiM2YxNTQ2Li5lOWMzYTdhIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy12My1lbXVsLmMKKysrIGIvdmlydC9rdm0vYXJtL3ZnaWMtdjMtZW11bC5jCkBAIC0zNDAsNyArMzQwLDcgQEAKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qga3ZtX21taW9fcmFuZ2UgdmdpY192M19kaXN0X3Jhbmdlc1tdID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB2Z2ljX2lvX3JhbmdlIHZnaWNfdjNfZGlzdF9yYW5nZXNbXSA9IHsKIAl7CiAJCS5iYXNlICAgICAgICAgICA9IEdJQ0RfQ1RMUiwKIAkJLmxlbiAgICAgICAgICAgID0gMHgwNCwKQEAgLTUwMiw2ICs1MDIsNDMgQEAKIAl7fSwKIH07CiAKK3N0YXRpYyBib29sIGhhbmRsZV9tbWlvX2N0bHJfcmVkaXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQkgICAgc3RydWN0IGt2bV9leGl0X21taW8gKm1taW8sCisJCQkJICAgIHBoeXNfYWRkcl90IG9mZnNldCkKK3sKKwkvKiBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IExQSXMsIHRoaXMgcmVnaXN0ZXIgaXMgemVybyBmb3Igbm93ICovCisJdmdpY19yZWdfYWNjZXNzKG1taW8sIE5VTEwsIG9mZnNldCwKKwkJCUFDQ0VTU19SRUFEX1JBWiB8IEFDQ0VTU19XUklURV9JR05PUkVEKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGhhbmRsZV9tbWlvX3R5cGVyX3JlZGlzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJICAgICBzdHJ1Y3Qga3ZtX2V4aXRfbW1pbyAqbW1pbywKKwkJCQkgICAgIHBoeXNfYWRkcl90IG9mZnNldCkKK3sKKwl1MzIgcmVnOworCXU2NCBtcGlkcjsKKwlzdHJ1Y3Qga3ZtX3ZjcHUgKnJlZGlzdF92Y3B1ID0gbW1pby0+cHJpdmF0ZTsKKwlpbnQgdGFyZ2V0X3ZjcHVfaWQgPSByZWRpc3RfdmNwdS0+dmNwdV9pZDsKKworCS8qIHRoZSB1cHBlciAzMiBiaXRzIGNvbnRhaW4gdGhlIGFmZmluaXR5IHZhbHVlICovCisJaWYgKChvZmZzZXQgJiB+MykgPT0gNCkgeworCQltcGlkciA9IGt2bV92Y3B1X2dldF9tcGlkcl9hZmYocmVkaXN0X3ZjcHUpOworCQlyZWcgPSBjb21wcmVzc19tcGlkcihtcGlkcik7CisKKwkJdmdpY19yZWdfYWNjZXNzKG1taW8sICZyZWcsIG9mZnNldCwKKwkJCQlBQ0NFU1NfUkVBRF9WQUxVRSB8IEFDQ0VTU19XUklURV9JR05PUkVEKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJlZyA9IHJlZGlzdF92Y3B1LT52Y3B1X2lkIDw8IDg7CisJaWYgKHRhcmdldF92Y3B1X2lkID09IGF0b21pY19yZWFkKCZ2Y3B1LT5rdm0tPm9ubGluZV92Y3B1cykgLSAxKQorCQlyZWcgfD0gR0lDUl9UWVBFUl9MQVNUOworCXZnaWNfcmVnX2FjY2VzcyhtbWlvLCAmcmVnLCBvZmZzZXQsCisJCQlBQ0NFU1NfUkVBRF9WQUxVRSB8IEFDQ0VTU19XUklURV9JR05PUkVEKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBib29sIGhhbmRsZV9tbWlvX3NldF9lbmFibGVfcmVnX3JlZGlzdChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCiAJCQkJCSAgICAgIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvLAogCQkJCQkgICAgICBwaHlzX2FkZHJfdCBvZmZzZXQpCkBAIC01NzAsMTEzICs2MDcsOSBAQAogCXJldHVybiB2Z2ljX2hhbmRsZV9jZmdfcmVnKHJlZywgbW1pbywgb2Zmc2V0KTsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBrdm1fbW1pb19yYW5nZSB2Z2ljX3JlZGlzdF9zZ2lfcmFuZ2VzW10gPSB7Ci0JewotCQkuYmFzZQkJPSBHSUNSX0lHUk9VUFIwLAotCQkubGVuCQk9IDB4MDQsCi0JCS5iaXRzX3Blcl9pcnEJPSAxLAotCQkuaGFuZGxlX21taW8JPSBoYW5kbGVfbW1pb19yYW9fd2ksCi0JfSwKLQl7Ci0JCS5iYXNlCQk9IEdJQ1JfSVNFTkFCTEVSMCwKLQkJLmxlbgkJPSAweDA0LAotCQkuYml0c19wZXJfaXJxCT0gMSwKLQkJLmhhbmRsZV9tbWlvCT0gaGFuZGxlX21taW9fc2V0X2VuYWJsZV9yZWdfcmVkaXN0LAotCX0sCi0JewotCQkuYmFzZQkJPSBHSUNSX0lDRU5BQkxFUjAsCi0JCS5sZW4JCT0gMHgwNCwKLQkJLmJpdHNfcGVyX2lycQk9IDEsCi0JCS5oYW5kbGVfbW1pbwk9IGhhbmRsZV9tbWlvX2NsZWFyX2VuYWJsZV9yZWdfcmVkaXN0LAotCX0sCi0JewotCQkuYmFzZQkJPSBHSUNSX0lTUEVORFIwLAotCQkubGVuCQk9IDB4MDQsCi0JCS5iaXRzX3Blcl9pcnEJPSAxLAotCQkuaGFuZGxlX21taW8JPSBoYW5kbGVfbW1pb19zZXRfcGVuZGluZ19yZWdfcmVkaXN0LAotCX0sCi0JewotCQkuYmFzZQkJPSBHSUNSX0lDUEVORFIwLAotCQkubGVuCQk9IDB4MDQsCi0JCS5iaXRzX3Blcl9pcnEJPSAxLAotCQkuaGFuZGxlX21taW8JPSBoYW5kbGVfbW1pb19jbGVhcl9wZW5kaW5nX3JlZ19yZWRpc3QsCi0JfSwKLQl7Ci0JCS5iYXNlCQk9IEdJQ1JfSVNBQ1RJVkVSMCwKLQkJLmxlbgkJPSAweDA0LAotCQkuYml0c19wZXJfaXJxCT0gMSwKLQkJLmhhbmRsZV9tbWlvCT0gaGFuZGxlX21taW9fcmF6X3dpLAotCX0sCi0JewotCQkuYmFzZQkJPSBHSUNSX0lDQUNUSVZFUjAsCi0JCS5sZW4JCT0gMHgwNCwKLQkJLmJpdHNfcGVyX2lycQk9IDEsCi0JCS5oYW5kbGVfbW1pbwk9IGhhbmRsZV9tbWlvX3Jhel93aSwKLQl9LAotCXsKLQkJLmJhc2UJCT0gR0lDUl9JUFJJT1JJVFlSMCwKLQkJLmxlbgkJPSAweDIwLAotCQkuYml0c19wZXJfaXJxCT0gOCwKLQkJLmhhbmRsZV9tbWlvCT0gaGFuZGxlX21taW9fcHJpb3JpdHlfcmVnX3JlZGlzdCwKLQl9LAotCXsKLQkJLmJhc2UJCT0gR0lDUl9JQ0ZHUjAsCi0JCS5sZW4JCT0gMHgwOCwKLQkJLmJpdHNfcGVyX2lycQk9IDIsCi0JCS5oYW5kbGVfbW1pbwk9IGhhbmRsZV9tbWlvX2NmZ19yZWdfcmVkaXN0LAotCX0sCi0JewotCQkuYmFzZQkJPSBHSUNSX0lHUlBNT0RSMCwKLQkJLmxlbgkJPSAweDA0LAotCQkuYml0c19wZXJfaXJxCT0gMSwKLQkJLmhhbmRsZV9tbWlvCT0gaGFuZGxlX21taW9fcmF6X3dpLAotCX0sCi0JewotCQkuYmFzZQkJPSBHSUNSX05TQUNSLAotCQkubGVuCQk9IDB4MDQsCi0JCS5oYW5kbGVfbW1pbwk9IGhhbmRsZV9tbWlvX3Jhel93aSwKLQl9LAotCXt9LAotfTsKKyNkZWZpbmUgU0dJX2Jhc2UoeCkgKCh4KSArIFNaXzY0SykKIAotc3RhdGljIGJvb2wgaGFuZGxlX21taW9fY3Rscl9yZWRpc3Qoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAotCQkJCSAgICBzdHJ1Y3Qga3ZtX2V4aXRfbW1pbyAqbW1pbywKLQkJCQkgICAgcGh5c19hZGRyX3Qgb2Zmc2V0KQotewotCS8qIHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgTFBJcywgdGhpcyByZWdpc3RlciBpcyB6ZXJvIGZvciBub3cgKi8KLQl2Z2ljX3JlZ19hY2Nlc3MobW1pbywgTlVMTCwgb2Zmc2V0LAotCQkJQUNDRVNTX1JFQURfUkFaIHwgQUNDRVNTX1dSSVRFX0lHTk9SRUQpOwotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgaGFuZGxlX21taW9fdHlwZXJfcmVkaXN0KHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKLQkJCQkgICAgIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvLAotCQkJCSAgICAgcGh5c19hZGRyX3Qgb2Zmc2V0KQotewotCXUzMiByZWc7Ci0JdTY0IG1waWRyOwotCXN0cnVjdCBrdm1fdmNwdSAqcmVkaXN0X3ZjcHUgPSBtbWlvLT5wcml2YXRlOwotCWludCB0YXJnZXRfdmNwdV9pZCA9IHJlZGlzdF92Y3B1LT52Y3B1X2lkOwotCi0JLyogdGhlIHVwcGVyIDMyIGJpdHMgY29udGFpbiB0aGUgYWZmaW5pdHkgdmFsdWUgKi8KLQlpZiAoKG9mZnNldCAmIH4zKSA9PSA0KSB7Ci0JCW1waWRyID0ga3ZtX3ZjcHVfZ2V0X21waWRyX2FmZihyZWRpc3RfdmNwdSk7Ci0JCXJlZyA9IGNvbXByZXNzX21waWRyKG1waWRyKTsKLQotCQl2Z2ljX3JlZ19hY2Nlc3MobW1pbywgJnJlZywgb2Zmc2V0LAotCQkJCUFDQ0VTU19SRUFEX1ZBTFVFIHwgQUNDRVNTX1dSSVRFX0lHTk9SRUQpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcmVnID0gcmVkaXN0X3ZjcHUtPnZjcHVfaWQgPDwgODsKLQlpZiAodGFyZ2V0X3ZjcHVfaWQgPT0gYXRvbWljX3JlYWQoJnZjcHUtPmt2bS0+b25saW5lX3ZjcHVzKSAtIDEpCi0JCXJlZyB8PSBHSUNSX1RZUEVSX0xBU1Q7Ci0JdmdpY19yZWdfYWNjZXNzKG1taW8sICZyZWcsIG9mZnNldCwKLQkJCUFDQ0VTU19SRUFEX1ZBTFVFIHwgQUNDRVNTX1dSSVRFX0lHTk9SRUQpOwotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBrdm1fbW1pb19yYW5nZSB2Z2ljX3JlZGlzdF9yYW5nZXNbXSA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdmdpY19pb19yYW5nZSB2Z2ljX3JlZGlzdF9yYW5nZXNbXSA9IHsKIAl7CiAJCS5iYXNlICAgICAgICAgICA9IEdJQ1JfQ1RMUiwKIAkJLmxlbiAgICAgICAgICAgID0gMHgwNCwKQEAgLTcwNyw0OSArNjQwLDc0IEBACiAJCS5iaXRzX3Blcl9pcnEgICA9IDAsCiAJCS5oYW5kbGVfbW1pbyAgICA9IGhhbmRsZV9tbWlvX2lkcmVncywKIAl9LAorCXsKKwkJLmJhc2UJCT0gU0dJX2Jhc2UoR0lDUl9JR1JPVVBSMCksCisJCS5sZW4JCT0gMHgwNCwKKwkJLmJpdHNfcGVyX2lycQk9IDEsCisJCS5oYW5kbGVfbW1pbwk9IGhhbmRsZV9tbWlvX3Jhb193aSwKKwl9LAorCXsKKwkJLmJhc2UJCT0gU0dJX2Jhc2UoR0lDUl9JU0VOQUJMRVIwKSwKKwkJLmxlbgkJPSAweDA0LAorCQkuYml0c19wZXJfaXJxCT0gMSwKKwkJLmhhbmRsZV9tbWlvCT0gaGFuZGxlX21taW9fc2V0X2VuYWJsZV9yZWdfcmVkaXN0LAorCX0sCisJeworCQkuYmFzZQkJPSBTR0lfYmFzZShHSUNSX0lDRU5BQkxFUjApLAorCQkubGVuCQk9IDB4MDQsCisJCS5iaXRzX3Blcl9pcnEJPSAxLAorCQkuaGFuZGxlX21taW8JPSBoYW5kbGVfbW1pb19jbGVhcl9lbmFibGVfcmVnX3JlZGlzdCwKKwl9LAorCXsKKwkJLmJhc2UJCT0gU0dJX2Jhc2UoR0lDUl9JU1BFTkRSMCksCisJCS5sZW4JCT0gMHgwNCwKKwkJLmJpdHNfcGVyX2lycQk9IDEsCisJCS5oYW5kbGVfbW1pbwk9IGhhbmRsZV9tbWlvX3NldF9wZW5kaW5nX3JlZ19yZWRpc3QsCisJfSwKKwl7CisJCS5iYXNlCQk9IFNHSV9iYXNlKEdJQ1JfSUNQRU5EUjApLAorCQkubGVuCQk9IDB4MDQsCisJCS5iaXRzX3Blcl9pcnEJPSAxLAorCQkuaGFuZGxlX21taW8JPSBoYW5kbGVfbW1pb19jbGVhcl9wZW5kaW5nX3JlZ19yZWRpc3QsCisJfSwKKwl7CisJCS5iYXNlCQk9IFNHSV9iYXNlKEdJQ1JfSVNBQ1RJVkVSMCksCisJCS5sZW4JCT0gMHgwNCwKKwkJLmJpdHNfcGVyX2lycQk9IDEsCisJCS5oYW5kbGVfbW1pbwk9IGhhbmRsZV9tbWlvX3Jhel93aSwKKwl9LAorCXsKKwkJLmJhc2UJCT0gU0dJX2Jhc2UoR0lDUl9JQ0FDVElWRVIwKSwKKwkJLmxlbgkJPSAweDA0LAorCQkuYml0c19wZXJfaXJxCT0gMSwKKwkJLmhhbmRsZV9tbWlvCT0gaGFuZGxlX21taW9fcmF6X3dpLAorCX0sCisJeworCQkuYmFzZQkJPSBTR0lfYmFzZShHSUNSX0lQUklPUklUWVIwKSwKKwkJLmxlbgkJPSAweDIwLAorCQkuYml0c19wZXJfaXJxCT0gOCwKKwkJLmhhbmRsZV9tbWlvCT0gaGFuZGxlX21taW9fcHJpb3JpdHlfcmVnX3JlZGlzdCwKKwl9LAorCXsKKwkJLmJhc2UJCT0gU0dJX2Jhc2UoR0lDUl9JQ0ZHUjApLAorCQkubGVuCQk9IDB4MDgsCisJCS5iaXRzX3Blcl9pcnEJPSAyLAorCQkuaGFuZGxlX21taW8JPSBoYW5kbGVfbW1pb19jZmdfcmVnX3JlZGlzdCwKKwl9LAorCXsKKwkJLmJhc2UJCT0gU0dJX2Jhc2UoR0lDUl9JR1JQTU9EUjApLAorCQkubGVuCQk9IDB4MDQsCisJCS5iaXRzX3Blcl9pcnEJPSAxLAorCQkuaGFuZGxlX21taW8JPSBoYW5kbGVfbW1pb19yYXpfd2ksCisJfSwKKwl7CisJCS5iYXNlCQk9IFNHSV9iYXNlKEdJQ1JfTlNBQ1IpLAorCQkubGVuCQk9IDB4MDQsCisJCS5oYW5kbGVfbW1pbwk9IGhhbmRsZV9tbWlvX3Jhel93aSwKKwl9LAogCXt9LAogfTsKIAotLyoKLSAqIFRoaXMgZnVuY3Rpb24gc3BsaXRzIGFjY2Vzc2VzIGJldHdlZW4gdGhlIGRpc3RyaWJ1dG9yIGFuZCB0aGUgdHdvCi0gKiByZWRpc3RyaWJ1dG9yIHBhcnRzIChwcml2YXRlL1NQSSkuIEFzIGVhY2ggcmVkaXN0cmlidXRvciBpcyBhY2Nlc3NpYmxlCi0gKiBmcm9tIGFueSBDUFUsIHdlIGhhdmUgdG8gZGV0ZXJtaW5lIHRoZSBhZmZlY3RlZCBWQ1BVIGJ5IHRha2luZyB0aGUgZmF1bHRpbmcKLSAqIGFkZHJlc3MgaW50byBhY2NvdW50LiBXZSB0aGVuIHBhc3MgdGhpcyBWQ1BVIHRvIHRoZSBoYW5kbGVyIGZ1bmN0aW9uIHZpYQotICogdGhlIHByaXZhdGUgcGFyYW1ldGVyLgotICovCi0jZGVmaW5lIFNHSV9CQVNFX09GRlNFVCBTWl82NEsKLXN0YXRpYyBib29sIHZnaWNfdjNfaGFuZGxlX21taW8oc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuLAotCQkJCXN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvKQotewotCXN0cnVjdCB2Z2ljX2Rpc3QgKmRpc3QgPSAmdmNwdS0+a3ZtLT5hcmNoLnZnaWM7Ci0JdW5zaWduZWQgbG9uZyBkYmFzZSA9IGRpc3QtPnZnaWNfZGlzdF9iYXNlOwotCXVuc2lnbmVkIGxvbmcgcmRiYXNlID0gZGlzdC0+dmdpY19yZWRpc3RfYmFzZTsKLQlpbnQgbnJjcHVzID0gYXRvbWljX3JlYWQoJnZjcHUtPmt2bS0+b25saW5lX3ZjcHVzKTsKLQlpbnQgdmNwdV9pZDsKLQljb25zdCBzdHJ1Y3Qga3ZtX21taW9fcmFuZ2UgKm1taW9fcmFuZ2U7Ci0KLQlpZiAoaXNfaW5fcmFuZ2UobW1pby0+cGh5c19hZGRyLCBtbWlvLT5sZW4sIGRiYXNlLCBHSUNfVjNfRElTVF9TSVpFKSkgewotCQlyZXR1cm4gdmdpY19oYW5kbGVfbW1pb19yYW5nZSh2Y3B1LCBydW4sIG1taW8sCi0JCQkJCSAgICAgIHZnaWNfdjNfZGlzdF9yYW5nZXMsIGRiYXNlKTsKLQl9Ci0KLQlpZiAoIWlzX2luX3JhbmdlKG1taW8tPnBoeXNfYWRkciwgbW1pby0+bGVuLCByZGJhc2UsCi0JICAgIEdJQ19WM19SRURJU1RfU0laRSAqIG5yY3B1cykpCi0JCXJldHVybiBmYWxzZTsKLQotCXZjcHVfaWQgPSAobW1pby0+cGh5c19hZGRyIC0gcmRiYXNlKSAvIEdJQ19WM19SRURJU1RfU0laRTsKLQlyZGJhc2UgKz0gKHZjcHVfaWQgKiBHSUNfVjNfUkVESVNUX1NJWkUpOwotCW1taW8tPnByaXZhdGUgPSBrdm1fZ2V0X3ZjcHUodmNwdS0+a3ZtLCB2Y3B1X2lkKTsKLQotCWlmIChtbWlvLT5waHlzX2FkZHIgPj0gcmRiYXNlICsgU0dJX0JBU0VfT0ZGU0VUKSB7Ci0JCXJkYmFzZSArPSBTR0lfQkFTRV9PRkZTRVQ7Ci0JCW1taW9fcmFuZ2UgPSB2Z2ljX3JlZGlzdF9zZ2lfcmFuZ2VzOwotCX0gZWxzZSB7Ci0JCW1taW9fcmFuZ2UgPSB2Z2ljX3JlZGlzdF9yYW5nZXM7Ci0JfQotCXJldHVybiB2Z2ljX2hhbmRsZV9tbWlvX3JhbmdlKHZjcHUsIHJ1biwgbW1pbywgbW1pb19yYW5nZSwgcmRiYXNlKTsKLX0KLQogc3RhdGljIGJvb2wgdmdpY192M19xdWV1ZV9zZ2koc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBpbnQgaXJxKQogewogCWlmICh2Z2ljX3F1ZXVlX2lycSh2Y3B1LCAwLCBpcnEpKSB7CkBAIC03NjYsNiArNzI0LDkgQEAKIHsKIAlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0ID0gJmt2bS0+YXJjaC52Z2ljOworCWdwYV90IHJkYmFzZSA9IGRpc3QtPnZnaWNfcmVkaXN0X2Jhc2U7CisJc3RydWN0IHZnaWNfaW9fZGV2aWNlICppb2RldnMgPSBOVUxMOworCWludCBpOwogCiAJaWYgKCFpcnFjaGlwX2luX2tlcm5lbChrdm0pKQogCQlyZXR1cm4gMDsKQEAgLTc5MSw3ICs3NTIsNDEgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Ja3ZtLT5hcmNoLnZnaWMucmVhZHkgPSB0cnVlOworCXJldCA9IHZnaWNfcmVnaXN0ZXJfa3ZtX2lvX2Rldihrdm0sIGRpc3QtPnZnaWNfZGlzdF9iYXNlLAorCQkJCSAgICAgICBHSUNfVjNfRElTVF9TSVpFLCB2Z2ljX3YzX2Rpc3RfcmFuZ2VzLAorCQkJCSAgICAgICAtMSwgJmRpc3QtPmRpc3RfaW9kZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaW9kZXZzID0ga2NhbGxvYyhkaXN0LT5ucl9jcHVzLCBzaXplb2YoaW9kZXZzWzBdKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpb2RldnMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5yZWdpc3RlcjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGlzdC0+bnJfY3B1czsgaSsrKSB7CisJCXJldCA9IHZnaWNfcmVnaXN0ZXJfa3ZtX2lvX2Rldihrdm0sIHJkYmFzZSwKKwkJCQkJICAgICAgIFNaXzEyOEssIHZnaWNfcmVkaXN0X3JhbmdlcywKKwkJCQkJICAgICAgIGksICZpb2RldnNbaV0pOworCQlpZiAocmV0KQorCQkJZ290byBvdXRfdW5yZWdpc3RlcjsKKwkJcmRiYXNlICs9IEdJQ19WM19SRURJU1RfU0laRTsKKwl9CisKKwlkaXN0LT5yZWRpc3RfaW9kZXZzID0gaW9kZXZzOworCWRpc3QtPnJlYWR5ID0gdHJ1ZTsKKwlnb3RvIG91dDsKKworb3V0X3VucmVnaXN0ZXI6CisJa3ZtX2lvX2J1c191bnJlZ2lzdGVyX2Rldihrdm0sIEtWTV9NTUlPX0JVUywgJmRpc3QtPmRpc3RfaW9kZXYuZGV2KTsKKwlpZiAoaW9kZXZzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkaXN0LT5ucl9jcHVzOyBpKyspIHsKKwkJCWlmIChpb2RldnNbaV0uZGV2Lm9wcykKKwkJCQlrdm1faW9fYnVzX3VucmVnaXN0ZXJfZGV2KGt2bSwgS1ZNX01NSU9fQlVTLAorCQkJCQkJCSAgJmlvZGV2c1tpXS5kZXYpOworCQl9CisJfQorCiBvdXQ6CiAJaWYgKHJldCkKIAkJa3ZtX3ZnaWNfZGVzdHJveShrdm0pOwpAQCAtODMyLDcgKzgyNyw2IEBACiB7CiAJc3RydWN0IHZnaWNfZGlzdCAqZGlzdCA9ICZrdm0tPmFyY2gudmdpYzsKIAotCWRpc3QtPnZtX29wcy5oYW5kbGVfbW1pbyA9IHZnaWNfdjNfaGFuZGxlX21taW87CiAJZGlzdC0+dm1fb3BzLnF1ZXVlX3NnaSA9IHZnaWNfdjNfcXVldWVfc2dpOwogCWRpc3QtPnZtX29wcy5hZGRfc2dpX3NvdXJjZSA9IHZnaWNfdjNfYWRkX3NnaV9zb3VyY2U7CiAJZGlzdC0+dm1fb3BzLmluaXRfbW9kZWwgPSB2Z2ljX3YzX2luaXRfbW9kZWw7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vdmdpYy12My5jIGIvdmlydC9rdm0vYXJtL3ZnaWMtdjMuYwppbmRleCAzYTYyZDhhLi5kZmYwNjAyIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy12My5jCisrKyBiL3ZpcnQva3ZtL2FybS92Z2ljLXYzLmMKQEAgLTEwNCw2ICsxMDQsOCBAQAogewogCWlmICghKGxyX2Rlc2Muc3RhdGUgJiBMUl9TVEFURV9NQVNLKSkKIAkJdmNwdS0+YXJjaC52Z2ljX2NwdS52Z2ljX3YzLnZnaWNfZWxyc3IgfD0gKDFVIDw8IGxyKTsKKwllbHNlCisJCXZjcHUtPmFyY2gudmdpY19jcHUudmdpY192My52Z2ljX2VscnNyICY9IH4oMVUgPDwgbHIpOwogfQogCiBzdGF0aWMgdTY0IHZnaWNfdjNfZ2V0X2VscnNyKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTExNiw2ICsxMTgsMTEgQEAKIAlyZXR1cm4gdmNwdS0+YXJjaC52Z2ljX2NwdS52Z2ljX3YzLnZnaWNfZWlzcjsKIH0KIAorc3RhdGljIHZvaWQgdmdpY192M19jbGVhcl9laXNyKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwl2Y3B1LT5hcmNoLnZnaWNfY3B1LnZnaWNfdjMudmdpY19laXNyID0gMDsKK30KKwogc3RhdGljIHUzMiB2Z2ljX3YzX2dldF9pbnRlcnJ1cHRfc3RhdHVzKGNvbnN0IHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAl1MzIgbWlzciA9IHZjcHUtPmFyY2gudmdpY19jcHUudmdpY192My52Z2ljX21pc3I7CkBAIC0xOTIsNiArMTk5LDcgQEAKIAkuc3luY19scl9lbHJzcgkJPSB2Z2ljX3YzX3N5bmNfbHJfZWxyc3IsCiAJLmdldF9lbHJzcgkJPSB2Z2ljX3YzX2dldF9lbHJzciwKIAkuZ2V0X2Vpc3IJCT0gdmdpY192M19nZXRfZWlzciwKKwkuY2xlYXJfZWlzcgkJPSB2Z2ljX3YzX2NsZWFyX2Vpc3IsCiAJLmdldF9pbnRlcnJ1cHRfc3RhdHVzCT0gdmdpY192M19nZXRfaW50ZXJydXB0X3N0YXR1cywKIAkuZW5hYmxlX3VuZGVyZmxvdwk9IHZnaWNfdjNfZW5hYmxlX3VuZGVyZmxvdywKIAkuZGlzYWJsZV91bmRlcmZsb3cJPSB2Z2ljX3YzX2Rpc2FibGVfdW5kZXJmbG93LApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vYXJtL3ZnaWMuYyBiL3ZpcnQva3ZtL2FybS92Z2ljLmMKaW5kZXggMGNjNmFiNi4uOGQ1NTBmZiAxMDA2NDQKLS0tIGEvdmlydC9rdm0vYXJtL3ZnaWMuYworKysgYi92aXJ0L2t2bS9hcm0vdmdpYy5jCkBAIC0zMSw2ICszMSw5IEBACiAjaW5jbHVkZSA8YXNtL2t2bV9lbXVsYXRlLmg+CiAjaW5jbHVkZSA8YXNtL2t2bV9hcm0uaD4KICNpbmNsdWRlIDxhc20va3ZtX21tdS5oPgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9rdm0uaD4KKyNpbmNsdWRlIDxhc20va3ZtLmg+CisjaW5jbHVkZSA8a3ZtL2lvZGV2Lmg+CiAKIC8qCiAgKiBIb3cgdGhlIHdob2xlIHRoaW5nIHdvcmtzIChjb3VydGVzeSBvZiBDaHJpc3RvZmZlciBEYWxsKToKQEAgLTI2Myw2ICsyNjYsMTMgQEAKIAlyZXR1cm4gdmdpY19iaXRtYXBfZ2V0X2lycV92YWwoJmRpc3QtPmlycV9xdWV1ZWQsIHZjcHUtPnZjcHVfaWQsIGlycSk7CiB9CiAKK3N0YXRpYyBpbnQgdmdpY19pcnFfaXNfYWN0aXZlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0ID0gJnZjcHUtPmt2bS0+YXJjaC52Z2ljOworCisJcmV0dXJuIHZnaWNfYml0bWFwX2dldF9pcnFfdmFsKCZkaXN0LT5pcnFfYWN0aXZlLCB2Y3B1LT52Y3B1X2lkLCBpcnEpOworfQorCiBzdGF0aWMgdm9pZCB2Z2ljX2lycV9zZXRfcXVldWVkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGlycSkKIHsKIAlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0ID0gJnZjcHUtPmt2bS0+YXJjaC52Z2ljOwpAQCAtMjc3LDYgKzI4NywyMCBAQAogCXZnaWNfYml0bWFwX3NldF9pcnFfdmFsKCZkaXN0LT5pcnFfcXVldWVkLCB2Y3B1LT52Y3B1X2lkLCBpcnEsIDApOwogfQogCitzdGF0aWMgdm9pZCB2Z2ljX2lycV9zZXRfYWN0aXZlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0ID0gJnZjcHUtPmt2bS0+YXJjaC52Z2ljOworCisJdmdpY19iaXRtYXBfc2V0X2lycV92YWwoJmRpc3QtPmlycV9hY3RpdmUsIHZjcHUtPnZjcHVfaWQsIGlycSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHZnaWNfaXJxX2NsZWFyX2FjdGl2ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBpcnEpCit7CisJc3RydWN0IHZnaWNfZGlzdCAqZGlzdCA9ICZ2Y3B1LT5rdm0tPmFyY2gudmdpYzsKKworCXZnaWNfYml0bWFwX3NldF9pcnFfdmFsKCZkaXN0LT5pcnFfYWN0aXZlLCB2Y3B1LT52Y3B1X2lkLCBpcnEsIDApOworfQorCiBzdGF0aWMgaW50IHZnaWNfZGlzdF9pcnFfZ2V0X2xldmVsKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgaW50IGlycSkKIHsKIAlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0ID0gJnZjcHUtPmt2bS0+YXJjaC52Z2ljOwpAQCAtNTIwLDYgKzU0NCw0NCBAQAogCXJldHVybiBmYWxzZTsKIH0KIAorYm9vbCB2Z2ljX2hhbmRsZV9zZXRfYWN0aXZlX3JlZyhzdHJ1Y3Qga3ZtICprdm0sCisJCQkJc3RydWN0IGt2bV9leGl0X21taW8gKm1taW8sCisJCQkJcGh5c19hZGRyX3Qgb2Zmc2V0LCBpbnQgdmNwdV9pZCkKK3sKKwl1MzIgKnJlZzsKKwlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0ID0gJmt2bS0+YXJjaC52Z2ljOworCisJcmVnID0gdmdpY19iaXRtYXBfZ2V0X3JlZygmZGlzdC0+aXJxX2FjdGl2ZSwgdmNwdV9pZCwgb2Zmc2V0KTsKKwl2Z2ljX3JlZ19hY2Nlc3MobW1pbywgcmVnLCBvZmZzZXQsCisJCQlBQ0NFU1NfUkVBRF9WQUxVRSB8IEFDQ0VTU19XUklURV9TRVRCSVQpOworCisJaWYgKG1taW8tPmlzX3dyaXRlKSB7CisJCXZnaWNfdXBkYXRlX3N0YXRlKGt2bSk7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworYm9vbCB2Z2ljX2hhbmRsZV9jbGVhcl9hY3RpdmVfcmVnKHN0cnVjdCBrdm0gKmt2bSwKKwkJCQkgIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvLAorCQkJCSAgcGh5c19hZGRyX3Qgb2Zmc2V0LCBpbnQgdmNwdV9pZCkKK3sKKwl1MzIgKnJlZzsKKwlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0ID0gJmt2bS0+YXJjaC52Z2ljOworCisJcmVnID0gdmdpY19iaXRtYXBfZ2V0X3JlZygmZGlzdC0+aXJxX2FjdGl2ZSwgdmNwdV9pZCwgb2Zmc2V0KTsKKwl2Z2ljX3JlZ19hY2Nlc3MobW1pbywgcmVnLCBvZmZzZXQsCisJCQlBQ0NFU1NfUkVBRF9WQUxVRSB8IEFDQ0VTU19XUklURV9DTEVBUkJJVCk7CisKKwlpZiAobW1pby0+aXNfd3JpdGUpIHsKKwkJdmdpY191cGRhdGVfc3RhdGUoa3ZtKTsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCiBzdGF0aWMgdTMyIHZnaWNfY2ZnX2V4cGFuZCh1MTYgdmFsKQogewogCXUzMiByZXMgPSAwOwpAQCAtNTg4LDE2ICs2NTAsMTIgQEAKIH0KIAogLyoqCi0gKiB2Z2ljX3VucXVldWVfaXJxcyAtIG1vdmUgcGVuZGluZyBJUlFzIGZyb20gTFJzIHRvIHRoZSBkaXN0cmlidXRvcgorICogdmdpY191bnF1ZXVlX2lycXMgLSBtb3ZlIHBlbmRpbmcvYWN0aXZlIElSUXMgZnJvbSBMUnMgdG8gdGhlIGRpc3RyaWJ1dG9yCiAgKiBAdmdpY19jcHU6IFBvaW50ZXIgdG8gdGhlIHZnaWNfY3B1IHN0cnVjdCBob2xkaW5nIHRoZSBMUnMKICAqCi0gKiBNb3ZlIGFueSBwZW5kaW5nIElSUXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhc3NpZ25lZCB0byBMUnMgYmFjayB0byB0aGUKKyAqIE1vdmUgYW55IElSUXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhc3NpZ25lZCB0byBMUnMgYmFjayB0byB0aGUKICAqIGVtdWxhdGVkIGRpc3RyaWJ1dG9yIHN0YXRlIHNvIHRoYXQgdGhlIGNvbXBsZXRlIGVtdWxhdGVkIHN0YXRlIGNhbiBiZSByZWFkCiAgKiBmcm9tIHRoZSBtYWluIGVtdWxhdGlvbiBzdHJ1Y3R1cmVzIHdpdGhvdXQgaW52ZXN0aWdhdGluZyB0aGUgTFJzLgotICoKLSAqIE5vdGUgdGhhdCBJUlFzIGluIHRoZSBhY3RpdmUgc3RhdGUgaW4gdGhlIExScyBnZXQgdGhlaXIgcGVuZGluZyBzdGF0ZSBtb3ZlZAotICogdG8gdGhlIGRpc3RyaWJ1dG9yIGJ1dCB0aGUgYWN0aXZlIHN0YXRlIHN0YXlzIGluIHRoZSBMUnMsIGJlY2F1c2Ugd2UgZG9uJ3QKLSAqIHRyYWNrIHRoZSBhY3RpdmUgc3RhdGUgb24gdGhlIGRpc3RyaWJ1dG9yIHNpZGUuCiAgKi8KIHZvaWQgdmdpY191bnF1ZXVlX2lycXMoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQogewpAQCAtNjEzLDEyICs2NzEsMjIgQEAKIAkJICogMDE6IHBlbmRpbmcKIAkJICogMTA6IGFjdGl2ZQogCQkgKiAxMTogcGVuZGluZyBhbmQgYWN0aXZlCi0JCSAqCi0JCSAqIElmIHRoZSBMUiBob2xkcyBvbmx5IGFuIGFjdGl2ZSBpbnRlcnJ1cHQgKG5vdCBwZW5kaW5nKSB0aGVuCi0JCSAqIGp1c3QgbGVhdmUgaXQgYWxvbmUuCiAJCSAqLwotCQlpZiAoKGxyLnN0YXRlICYgTFJfU1RBVEVfTUFTSykgPT0gTFJfU1RBVEVfQUNUSVZFKQotCQkJY29udGludWU7CisJCUJVR19PTighKGxyLnN0YXRlICYgTFJfU1RBVEVfTUFTSykpOworCisJCS8qIFJlZXN0YWJsaXNoIFNHSSBzb3VyY2UgZm9yIHBlbmRpbmcgYW5kIGFjdGl2ZSBJUlFzICovCisJCWlmIChsci5pcnEgPCBWR0lDX05SX1NHSVMpCisJCQlhZGRfc2dpX3NvdXJjZSh2Y3B1LCBsci5pcnEsIGxyLnNvdXJjZSk7CisKKwkJLyoKKwkJICogSWYgdGhlIExSIGhvbGRzIGFuIGFjdGl2ZSAoMTApIG9yIGEgcGVuZGluZyBhbmQgYWN0aXZlICgxMSkKKwkJICogaW50ZXJydXB0IHRoZW4gbW92ZSB0aGUgYWN0aXZlIHN0YXRlIHRvIHRoZQorCQkgKiBkaXN0cmlidXRvciB0cmFja2luZyBiaXQuCisJCSAqLworCQlpZiAobHIuc3RhdGUgJiBMUl9TVEFURV9BQ1RJVkUpIHsKKwkJCXZnaWNfaXJxX3NldF9hY3RpdmUodmNwdSwgbHIuaXJxKTsKKwkJCWxyLnN0YXRlICY9IH5MUl9TVEFURV9BQ1RJVkU7CisJCX0KIAogCQkvKgogCQkgKiBSZWVzdGFibGlzaCB0aGUgcGVuZGluZyBzdGF0ZSBvbiB0aGUgZGlzdHJpYnV0b3IgYW5kIHRoZQpAQCAtNjI2LDIxICs2OTQsMTkgQEAKIAkJICogaXMgZmluZSwgdGhlbiB3ZSBhcmUgb25seSBzZXR0aW5nIGEgZmV3IGJpdHMgdGhhdCB3ZXJlCiAJCSAqIGFscmVhZHkgc2V0LgogCQkgKi8KLQkJdmdpY19kaXN0X2lycV9zZXRfcGVuZGluZyh2Y3B1LCBsci5pcnEpOwotCQlpZiAobHIuaXJxIDwgVkdJQ19OUl9TR0lTKQotCQkJYWRkX3NnaV9zb3VyY2UodmNwdSwgbHIuaXJxLCBsci5zb3VyY2UpOwotCQlsci5zdGF0ZSAmPSB+TFJfU1RBVEVfUEVORElORzsKKwkJaWYgKGxyLnN0YXRlICYgTFJfU1RBVEVfUEVORElORykgeworCQkJdmdpY19kaXN0X2lycV9zZXRfcGVuZGluZyh2Y3B1LCBsci5pcnEpOworCQkJbHIuc3RhdGUgJj0gfkxSX1NUQVRFX1BFTkRJTkc7CisJCX0KKwogCQl2Z2ljX3NldF9scih2Y3B1LCBpLCBscik7CiAKIAkJLyoKLQkJICogSWYgdGhlcmUncyBubyBzdGF0ZSBsZWZ0IG9uIHRoZSBMUiAoaXQgY291bGQgc3RpbGwgYmUKLQkJICogYWN0aXZlKSwgdGhlbiB0aGUgTFIgZG9lcyBub3QgaG9sZCBhbnkgdXNlZnVsIGluZm8gYW5kIGNhbgotCQkgKiBiZSBtYXJrZWQgYXMgZnJlZSBmb3Igb3RoZXIgdXNlLgorCQkgKiBNYXJrIHRoZSBMUiBhcyBmcmVlIGZvciBvdGhlciB1c2UuCiAJCSAqLwotCQlpZiAoIShsci5zdGF0ZSAmIExSX1NUQVRFX01BU0spKSB7Ci0JCQl2Z2ljX3JldGlyZV9scihpLCBsci5pcnEsIHZjcHUpOwotCQkJdmdpY19pcnFfY2xlYXJfcXVldWVkKHZjcHUsIGxyLmlycSk7Ci0JCX0KKwkJQlVHX09OKGxyLnN0YXRlICYgTFJfU1RBVEVfTUFTSyk7CisJCXZnaWNfcmV0aXJlX2xyKGksIGxyLmlycSwgdmNwdSk7CisJCXZnaWNfaXJxX2NsZWFyX3F1ZXVlZCh2Y3B1LCBsci5pcnEpOwogCiAJCS8qIEZpbmFsbHkgdXBkYXRlIHRoZSBWR0lDIHN0YXRlLiAqLwogCQl2Z2ljX3VwZGF0ZV9zdGF0ZSh2Y3B1LT5rdm0pOwpAQCAtNjQ4LDI0ICs3MTQsMjEgQEAKIH0KIAogY29uc3QKLXN0cnVjdCBrdm1fbW1pb19yYW5nZSAqdmdpY19maW5kX3JhbmdlKGNvbnN0IHN0cnVjdCBrdm1fbW1pb19yYW5nZSAqcmFuZ2VzLAotCQkJCSAgICAgICBzdHJ1Y3Qga3ZtX2V4aXRfbW1pbyAqbW1pbywKLQkJCQkgICAgICAgcGh5c19hZGRyX3Qgb2Zmc2V0KQorc3RydWN0IHZnaWNfaW9fcmFuZ2UgKnZnaWNfZmluZF9yYW5nZShjb25zdCBzdHJ1Y3QgdmdpY19pb19yYW5nZSAqcmFuZ2VzLAorCQkJCSAgICAgIGludCBsZW4sIGdwYV90IG9mZnNldCkKIHsKLQljb25zdCBzdHJ1Y3Qga3ZtX21taW9fcmFuZ2UgKnIgPSByYW5nZXM7Ci0KLQl3aGlsZSAoci0+bGVuKSB7Ci0JCWlmIChvZmZzZXQgPj0gci0+YmFzZSAmJgotCQkgICAgKG9mZnNldCArIG1taW8tPmxlbikgPD0gKHItPmJhc2UgKyByLT5sZW4pKQotCQkJcmV0dXJuIHI7Ci0JCXIrKzsKKwl3aGlsZSAocmFuZ2VzLT5sZW4pIHsKKwkJaWYgKG9mZnNldCA+PSByYW5nZXMtPmJhc2UgJiYKKwkJICAgIChvZmZzZXQgKyBsZW4pIDw9IChyYW5nZXMtPmJhc2UgKyByYW5nZXMtPmxlbikpCisJCQlyZXR1cm4gcmFuZ2VzOworCQlyYW5nZXMrKzsKIAl9CiAKIAlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIGJvb2wgdmdpY192YWxpZGF0ZV9hY2Nlc3MoY29uc3Qgc3RydWN0IHZnaWNfZGlzdCAqZGlzdCwKLQkJCQkgY29uc3Qgc3RydWN0IGt2bV9tbWlvX3JhbmdlICpyYW5nZSwKKwkJCQkgY29uc3Qgc3RydWN0IHZnaWNfaW9fcmFuZ2UgKnJhbmdlLAogCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCkKIHsKIAlpbnQgaXJxOwpAQCAtNjkzLDkgKzc1Niw4IEBACiBzdGF0aWMgYm9vbCBjYWxsX3JhbmdlX2hhbmRsZXIoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAogCQkJICAgICAgIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvLAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotCQkJICAgICAgIGNvbnN0IHN0cnVjdCBrdm1fbW1pb19yYW5nZSAqcmFuZ2UpCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHZnaWNfaW9fcmFuZ2UgKnJhbmdlKQogewotCXUzMiAqZGF0YTMyID0gKHZvaWQgKiltbWlvLT5kYXRhOwogCXN0cnVjdCBrdm1fZXhpdF9tbWlvIG1taW8zMjsKIAlib29sIHJldDsKIApAQCAtNzEyLDkxICs3NzQsMTQyIEBACiAJbW1pbzMyLnByaXZhdGUgPSBtbWlvLT5wcml2YXRlOwogCiAJbW1pbzMyLnBoeXNfYWRkciA9IG1taW8tPnBoeXNfYWRkciArIDQ7Ci0JaWYgKG1taW8tPmlzX3dyaXRlKQotCQkqKHUzMiAqKW1taW8zMi5kYXRhID0gZGF0YTMyWzFdOworCW1taW8zMi5kYXRhID0gJigodTMyICopbW1pby0+ZGF0YSlbMV07CiAJcmV0ID0gcmFuZ2UtPmhhbmRsZV9tbWlvKHZjcHUsICZtbWlvMzIsIG9mZnNldCArIDQpOwotCWlmICghbW1pby0+aXNfd3JpdGUpCi0JCWRhdGEzMlsxXSA9ICoodTMyICopbW1pbzMyLmRhdGE7CiAKIAltbWlvMzIucGh5c19hZGRyID0gbW1pby0+cGh5c19hZGRyOwotCWlmIChtbWlvLT5pc193cml0ZSkKLQkJKih1MzIgKiltbWlvMzIuZGF0YSA9IGRhdGEzMlswXTsKKwltbWlvMzIuZGF0YSA9ICYoKHUzMiAqKW1taW8tPmRhdGEpWzBdOwogCXJldCB8PSByYW5nZS0+aGFuZGxlX21taW8odmNwdSwgJm1taW8zMiwgb2Zmc2V0KTsKLQlpZiAoIW1taW8tPmlzX3dyaXRlKQotCQlkYXRhMzJbMF0gPSAqKHUzMiAqKW1taW8zMi5kYXRhOwogCiAJcmV0dXJuIHJldDsKIH0KIAogLyoqCi0gKiB2Z2ljX2hhbmRsZV9tbWlvX3JhbmdlIC0gaGFuZGxlIGFuIGluLWtlcm5lbCBNTUlPIGFjY2VzcworICogdmdpY19oYW5kbGVfbW1pb19hY2Nlc3MgLSBoYW5kbGUgYW4gaW4ta2VybmVsIE1NSU8gYWNjZXNzCisgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgcmVhZC93cml0ZSBLVk0gSU8gZGV2aWNlIHdyYXBwZXJzIGJlbG93LgogICogQHZjcHU6CXBvaW50ZXIgdG8gdGhlIHZjcHUgcGVyZm9ybWluZyB0aGUgYWNjZXNzCi0gKiBAcnVuOglwb2ludGVyIHRvIHRoZSBrdm1fcnVuIHN0cnVjdHVyZQotICogQG1taW86CXBvaW50ZXIgdG8gdGhlIGRhdGEgZGVzY3JpYmluZyB0aGUgYWNjZXNzCi0gKiBAcmFuZ2VzOglhcnJheSBvZiBNTUlPIHJhbmdlcyBpbiBhIGdpdmVuIHJlZ2lvbgotICogQG1taW9fYmFzZToJYmFzZSBhZGRyZXNzIG9mIHRoYXQgcmVnaW9uCisgKiBAdGhpczoJcG9pbnRlciB0byB0aGUgS1ZNIElPIGRldmljZSBpbiBjaGFyZ2UKKyAqIEBhZGRyOglndWVzdCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBhY2Nlc3MKKyAqIEBsZW46CXNpemUgb2YgdGhlIGFjY2VzcworICogQHZhbDoJcG9pbnRlciB0byB0aGUgZGF0YSByZWdpb24KKyAqIEBpc193cml0ZToJcmVhZCBvciB3cml0ZSBhY2Nlc3MKICAqCiAgKiByZXR1cm5zIHRydWUgaWYgdGhlIE1NSU8gYWNjZXNzIGNvdWxkIGJlIHBlcmZvcm1lZAogICovCi1ib29sIHZnaWNfaGFuZGxlX21taW9fcmFuZ2Uoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX3J1biAqcnVuLAotCQkJICAgIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvLAotCQkJICAgIGNvbnN0IHN0cnVjdCBrdm1fbW1pb19yYW5nZSAqcmFuZ2VzLAotCQkJICAgIHVuc2lnbmVkIGxvbmcgbW1pb19iYXNlKQorc3RhdGljIGludCB2Z2ljX2hhbmRsZV9tbWlvX2FjY2VzcyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsCisJCQkJICAgc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsIGdwYV90IGFkZHIsCisJCQkJICAgaW50IGxlbiwgdm9pZCAqdmFsLCBib29sIGlzX3dyaXRlKQogewotCWNvbnN0IHN0cnVjdCBrdm1fbW1pb19yYW5nZSAqcmFuZ2U7CiAJc3RydWN0IHZnaWNfZGlzdCAqZGlzdCA9ICZ2Y3B1LT5rdm0tPmFyY2gudmdpYzsKKwlzdHJ1Y3QgdmdpY19pb19kZXZpY2UgKmlvZGV2ID0gY29udGFpbmVyX29mKHRoaXMsCisJCQkJCQkgICAgc3RydWN0IHZnaWNfaW9fZGV2aWNlLCBkZXYpOworCXN0cnVjdCBrdm1fcnVuICpydW4gPSB2Y3B1LT5ydW47CisJY29uc3Qgc3RydWN0IHZnaWNfaW9fcmFuZ2UgKnJhbmdlOworCXN0cnVjdCBrdm1fZXhpdF9tbWlvIG1taW87CiAJYm9vbCB1cGRhdGVkX3N0YXRlOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWdwYV90IG9mZnNldDsKIAotCW9mZnNldCA9IG1taW8tPnBoeXNfYWRkciAtIG1taW9fYmFzZTsKLQlyYW5nZSA9IHZnaWNfZmluZF9yYW5nZShyYW5nZXMsIG1taW8sIG9mZnNldCk7CisJb2Zmc2V0ID0gYWRkciAtIGlvZGV2LT5hZGRyOworCXJhbmdlID0gdmdpY19maW5kX3JhbmdlKGlvZGV2LT5yZWdfcmFuZ2VzLCBsZW4sIG9mZnNldCk7CiAJaWYgKHVubGlrZWx5KCFyYW5nZSB8fCAhcmFuZ2UtPmhhbmRsZV9tbWlvKSkgewotCQlwcl93YXJuKCJVbmhhbmRsZWQgYWNjZXNzICVkICUwOGxseCAlZFxuIiwKLQkJCW1taW8tPmlzX3dyaXRlLCBtbWlvLT5waHlzX2FkZHIsIG1taW8tPmxlbik7Ci0JCXJldHVybiBmYWxzZTsKKwkJcHJfd2FybigiVW5oYW5kbGVkIGFjY2VzcyAlZCAlMDhsbHggJWRcbiIsIGlzX3dyaXRlLCBhZGRyLCBsZW4pOworCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCXNwaW5fbG9jaygmdmNwdS0+a3ZtLT5hcmNoLnZnaWMubG9jayk7CisJbW1pby5waHlzX2FkZHIgPSBhZGRyOworCW1taW8ubGVuID0gbGVuOworCW1taW8uaXNfd3JpdGUgPSBpc193cml0ZTsKKwltbWlvLmRhdGEgPSB2YWw7CisJbW1pby5wcml2YXRlID0gaW9kZXYtPnJlZGlzdF92Y3B1OworCisJc3Bpbl9sb2NrKCZkaXN0LT5sb2NrKTsKIAlvZmZzZXQgLT0gcmFuZ2UtPmJhc2U7CiAJaWYgKHZnaWNfdmFsaWRhdGVfYWNjZXNzKGRpc3QsIHJhbmdlLCBvZmZzZXQpKSB7Ci0JCXVwZGF0ZWRfc3RhdGUgPSBjYWxsX3JhbmdlX2hhbmRsZXIodmNwdSwgbW1pbywgb2Zmc2V0LCByYW5nZSk7CisJCXVwZGF0ZWRfc3RhdGUgPSBjYWxsX3JhbmdlX2hhbmRsZXIodmNwdSwgJm1taW8sIG9mZnNldCwgcmFuZ2UpOwogCX0gZWxzZSB7Ci0JCWlmICghbW1pby0+aXNfd3JpdGUpCi0JCQltZW1zZXQobW1pby0+ZGF0YSwgMCwgbW1pby0+bGVuKTsKKwkJaWYgKCFpc193cml0ZSkKKwkJCW1lbXNldCh2YWwsIDAsIGxlbik7CiAJCXVwZGF0ZWRfc3RhdGUgPSBmYWxzZTsKIAl9Ci0Jc3Bpbl91bmxvY2soJnZjcHUtPmt2bS0+YXJjaC52Z2ljLmxvY2spOwotCWt2bV9wcmVwYXJlX21taW8ocnVuLCBtbWlvKTsKKwlzcGluX3VubG9jaygmZGlzdC0+bG9jayk7CisJcnVuLT5tbWlvLmlzX3dyaXRlCT0gaXNfd3JpdGU7CisJcnVuLT5tbWlvLmxlbgkJPSBsZW47CisJcnVuLT5tbWlvLnBoeXNfYWRkcgk9IGFkZHI7CisJbWVtY3B5KHJ1bi0+bW1pby5kYXRhLCB2YWwsIGxlbik7CisKIAlrdm1faGFuZGxlX21taW9fcmV0dXJuKHZjcHUsIHJ1bik7CiAKIAlpZiAodXBkYXRlZF9zdGF0ZSkKIAkJdmdpY19raWNrX3ZjcHVzKHZjcHUtPmt2bSk7CiAKLQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gMDsKIH0KIAotLyoqCi0gKiB2Z2ljX2hhbmRsZV9tbWlvIC0gaGFuZGxlIGFuIGluLWtlcm5lbCBNTUlPIGFjY2VzcyBmb3IgdGhlIEdJQyBlbXVsYXRpb24KLSAqIEB2Y3B1OiAgICAgIHBvaW50ZXIgdG8gdGhlIHZjcHUgcGVyZm9ybWluZyB0aGUgYWNjZXNzCi0gKiBAcnVuOiAgICAgICBwb2ludGVyIHRvIHRoZSBrdm1fcnVuIHN0cnVjdHVyZQotICogQG1taW86ICAgICAgcG9pbnRlciB0byB0aGUgZGF0YSBkZXNjcmliaW5nIHRoZSBhY2Nlc3MKLSAqCi0gKiByZXR1cm5zIHRydWUgaWYgdGhlIE1NSU8gYWNjZXNzIGhhcyBiZWVuIHBlcmZvcm1lZCBpbiBrZXJuZWwgc3BhY2UsCi0gKiBhbmQgZmFsc2UgaWYgaXQgbmVlZHMgdG8gYmUgZW11bGF0ZWQgaW4gdXNlciBzcGFjZS4KLSAqIENhbGxzIHRoZSBhY3R1YWwgaGFuZGxpbmcgcm91dGluZSBmb3IgdGhlIHNlbGVjdGVkIFZHSUMgbW9kZWwuCi0gKi8KLWJvb2wgdmdpY19oYW5kbGVfbW1pbyhzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4sCi0JCSAgICAgIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvKQorc3RhdGljIGludCB2Z2ljX2hhbmRsZV9tbWlvX3JlYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSBzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKKwkJCQkgZ3BhX3QgYWRkciwgaW50IGxlbiwgdm9pZCAqdmFsKQogewotCWlmICghaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSkKLQkJcmV0dXJuIGZhbHNlOworCXJldHVybiB2Z2ljX2hhbmRsZV9tbWlvX2FjY2Vzcyh2Y3B1LCB0aGlzLCBhZGRyLCBsZW4sIHZhbCwgZmFsc2UpOworfQogCi0JLyoKLQkgKiBUaGlzIHdpbGwgY3VycmVudGx5IGNhbGwgZWl0aGVyIHZnaWNfdjJfaGFuZGxlX21taW8oKSBvcgotCSAqIHZnaWNfdjNfaGFuZGxlX21taW8oKSwgd2hpY2ggaW4gdHVybiB3aWxsIGNhbGwKLQkgKiB2Z2ljX2hhbmRsZV9tbWlvX3JhbmdlKCkgZGVmaW5lZCBhYm92ZS4KLQkgKi8KLQlyZXR1cm4gdmNwdS0+a3ZtLT5hcmNoLnZnaWMudm1fb3BzLmhhbmRsZV9tbWlvKHZjcHUsIHJ1biwgbW1pbyk7CitzdGF0aWMgaW50IHZnaWNfaGFuZGxlX21taW9fd3JpdGUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LAorCQkJCSAgc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsCisJCQkJICBncGFfdCBhZGRyLCBpbnQgbGVuLCBjb25zdCB2b2lkICp2YWwpCit7CisJcmV0dXJuIHZnaWNfaGFuZGxlX21taW9fYWNjZXNzKHZjcHUsIHRoaXMsIGFkZHIsIGxlbiwgKHZvaWQgKil2YWwsCisJCQkJICAgICAgIHRydWUpOworfQorCitzdHJ1Y3Qga3ZtX2lvX2RldmljZV9vcHMgdmdpY19pb19vcHMgPSB7CisJLnJlYWQJPSB2Z2ljX2hhbmRsZV9tbWlvX3JlYWQsCisJLndyaXRlCT0gdmdpY19oYW5kbGVfbW1pb193cml0ZSwKK307CisKKy8qKgorICogdmdpY19yZWdpc3Rlcl9rdm1faW9fZGV2IC0gcmVnaXN0ZXIgVkdJQyByZWdpc3RlciBmcmFtZSBvbiB0aGUgS1ZNIEkvTyBidXMKKyAqIEBrdm06ICAgICAgICAgICAgVGhlIFZNIHN0cnVjdHVyZSBwb2ludGVyCisgKiBAYmFzZTogICAgICAgICAgIFRoZSAoZ3Vlc3QpIGJhc2UgYWRkcmVzcyBmb3IgdGhlIHJlZ2lzdGVyIGZyYW1lCisgKiBAbGVuOiAgICAgICAgICAgIExlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgZnJhbWUgd2luZG93CisgKiBAcmFuZ2VzOiAgICAgICAgIERlc2NyaWJpbmcgdGhlIGhhbmRsZXIgZnVuY3Rpb25zIGZvciBlYWNoIHJlZ2lzdGVyCisgKiBAcmVkaXN0X3ZjcHVfaWQ6IFRoZSBWQ1BVIElEIHRvIHBhc3Mgb24gdG8gdGhlIGhhbmRsZXJzIG9uIGNhbGwKKyAqIEBpb2RldjogICAgICAgICAgUG9pbnRzIHRvIG1lbW9yeSB0byBiZSBwYXNzZWQgb24gdG8gdGhlIGhhbmRsZXIKKyAqCisgKiBAaW9kZXYgc3RvcmVzIHRoZSBwYXJhbWV0ZXJzIG9mIHRoaXMgZnVuY3Rpb24gdG8gYmUgdXNhYmxlIGJ5IHRoZSBoYW5kbGVyCisgKiByZXNwZWN0aXZlbHkgdGhlIGRpc3BhdGNoZXIgZnVuY3Rpb24gKHNpbmNlIHRoZSBLVk0gSS9PIGJ1cyBmcmFtZXdvcmsgbGFja3MKKyAqIGFuIG9wYXF1ZSBwYXJhbWV0ZXIpLiBJbml0aWFsaXphdGlvbiBpcyBkb25lIGluIHRoaXMgZnVuY3Rpb24sIGJ1dCB0aGUKKyAqIHJlZmVyZW5jZSBzaG91bGQgYmUgdmFsaWQgYW5kIHVuaXF1ZSBmb3IgdGhlIHdob2xlIFZHSUMgbGlmZXRpbWUuCisgKiBJZiB0aGUgcmVnaXN0ZXIgZnJhbWUgaXMgbm90IG1hcHBlZCBmb3IgYSBzcGVjaWZpYyBWQ1BVLCBwYXNzIC0xIHRvCisgKiBAcmVkaXN0X3ZjcHVfaWQuCisgKi8KK2ludCB2Z2ljX3JlZ2lzdGVyX2t2bV9pb19kZXYoc3RydWN0IGt2bSAqa3ZtLCBncGFfdCBiYXNlLCBpbnQgbGVuLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgdmdpY19pb19yYW5nZSAqcmFuZ2VzLAorCQkJICAgICBpbnQgcmVkaXN0X3ZjcHVfaWQsCisJCQkgICAgIHN0cnVjdCB2Z2ljX2lvX2RldmljZSAqaW9kZXYpCit7CisJc3RydWN0IGt2bV92Y3B1ICp2Y3B1ID0gTlVMTDsKKwlpbnQgcmV0OworCisJaWYgKHJlZGlzdF92Y3B1X2lkID49IDApCisJCXZjcHUgPSBrdm1fZ2V0X3ZjcHUoa3ZtLCByZWRpc3RfdmNwdV9pZCk7CisKKwlpb2Rldi0+YWRkcgkJPSBiYXNlOworCWlvZGV2LT5sZW4JCT0gbGVuOworCWlvZGV2LT5yZWdfcmFuZ2VzCT0gcmFuZ2VzOworCWlvZGV2LT5yZWRpc3RfdmNwdQk9IHZjcHU7CisKKwlrdm1faW9kZXZpY2VfaW5pdCgmaW9kZXYtPmRldiwgJnZnaWNfaW9fb3BzKTsKKworCW11dGV4X2xvY2soJmt2bS0+c2xvdHNfbG9jayk7CisKKwlyZXQgPSBrdm1faW9fYnVzX3JlZ2lzdGVyX2Rldihrdm0sIEtWTV9NTUlPX0JVUywgYmFzZSwgbGVuLAorCQkJCSAgICAgICZpb2Rldi0+ZGV2KTsKKwltdXRleF91bmxvY2soJmt2bS0+c2xvdHNfbG9jayk7CisKKwkvKiBNYXJrIHRoZSBpb2RldiBhcyBpbnZhbGlkIGlmIHJlZ2lzdHJhdGlvbiBmYWlscy4gKi8KKwlpZiAocmV0KQorCQlpb2Rldi0+ZGV2Lm9wcyA9IE5VTEw7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHZnaWNfbnJfc2hhcmVkX2lycXMoc3RydWN0IHZnaWNfZGlzdCAqZGlzdCkKQEAgLTgwNCw2ICs5MTcsMzYgQEAKIAlyZXR1cm4gZGlzdC0+bnJfaXJxcyAtIFZHSUNfTlJfUFJJVkFURV9JUlFTOwogfQogCitzdGF0aWMgaW50IGNvbXB1dGVfYWN0aXZlX2Zvcl9jcHUoc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXN0cnVjdCB2Z2ljX2Rpc3QgKmRpc3QgPSAmdmNwdS0+a3ZtLT5hcmNoLnZnaWM7CisJdW5zaWduZWQgbG9uZyAqYWN0aXZlLCAqZW5hYmxlZCwgKmFjdF9wZXJjcHUsICphY3Rfc2hhcmVkOworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX3ByaXZhdGUsIGFjdGl2ZV9zaGFyZWQ7CisJaW50IG5yX3NoYXJlZCA9IHZnaWNfbnJfc2hhcmVkX2lycXMoZGlzdCk7CisJaW50IHZjcHVfaWQ7CisKKwl2Y3B1X2lkID0gdmNwdS0+dmNwdV9pZDsKKwlhY3RfcGVyY3B1ID0gdmNwdS0+YXJjaC52Z2ljX2NwdS5hY3RpdmVfcGVyY3B1OworCWFjdF9zaGFyZWQgPSB2Y3B1LT5hcmNoLnZnaWNfY3B1LmFjdGl2ZV9zaGFyZWQ7CisKKwlhY3RpdmUgPSB2Z2ljX2JpdG1hcF9nZXRfY3B1X21hcCgmZGlzdC0+aXJxX2FjdGl2ZSwgdmNwdV9pZCk7CisJZW5hYmxlZCA9IHZnaWNfYml0bWFwX2dldF9jcHVfbWFwKCZkaXN0LT5pcnFfZW5hYmxlZCwgdmNwdV9pZCk7CisJYml0bWFwX2FuZChhY3RfcGVyY3B1LCBhY3RpdmUsIGVuYWJsZWQsIFZHSUNfTlJfUFJJVkFURV9JUlFTKTsKKworCWFjdGl2ZSA9IHZnaWNfYml0bWFwX2dldF9zaGFyZWRfbWFwKCZkaXN0LT5pcnFfYWN0aXZlKTsKKwllbmFibGVkID0gdmdpY19iaXRtYXBfZ2V0X3NoYXJlZF9tYXAoJmRpc3QtPmlycV9lbmFibGVkKTsKKwliaXRtYXBfYW5kKGFjdF9zaGFyZWQsIGFjdGl2ZSwgZW5hYmxlZCwgbnJfc2hhcmVkKTsKKwliaXRtYXBfYW5kKGFjdF9zaGFyZWQsIGFjdF9zaGFyZWQsCisJCSAgIHZnaWNfYml0bWFwX2dldF9zaGFyZWRfbWFwKCZkaXN0LT5pcnFfc3BpX3RhcmdldFt2Y3B1X2lkXSksCisJCSAgIG5yX3NoYXJlZCk7CisKKwlhY3RpdmVfcHJpdmF0ZSA9IGZpbmRfZmlyc3RfYml0KGFjdF9wZXJjcHUsIFZHSUNfTlJfUFJJVkFURV9JUlFTKTsKKwlhY3RpdmVfc2hhcmVkID0gZmluZF9maXJzdF9iaXQoYWN0X3NoYXJlZCwgbnJfc2hhcmVkKTsKKworCXJldHVybiAoYWN0aXZlX3ByaXZhdGUgPCBWR0lDX05SX1BSSVZBVEVfSVJRUyB8fAorCQlhY3RpdmVfc2hhcmVkIDwgbnJfc2hhcmVkKTsKK30KKwogc3RhdGljIGludCBjb21wdXRlX3BlbmRpbmdfZm9yX2NwdShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IHZnaWNfZGlzdCAqZGlzdCA9ICZ2Y3B1LT5rdm0tPmFyY2gudmdpYzsKQEAgLTgzNSw3ICs5NzgsNyBAQAogCiAvKgogICogVXBkYXRlIHRoZSBpbnRlcnJ1cHQgc3RhdGUgYW5kIGRldGVybWluZSB3aGljaCBDUFVzIGhhdmUgcGVuZGluZwotICogaW50ZXJydXB0cy4gTXVzdCBiZSBjYWxsZWQgd2l0aCBkaXN0cmlidXRvciBsb2NrIGhlbGQuCisgKiBvciBhY3RpdmUgaW50ZXJydXB0cy4gTXVzdCBiZSBjYWxsZWQgd2l0aCBkaXN0cmlidXRvciBsb2NrIGhlbGQuCiAgKi8KIHZvaWQgdmdpY191cGRhdGVfc3RhdGUoc3RydWN0IGt2bSAqa3ZtKQogewpAQCAtODQ5LDEwICs5OTIsMTMgQEAKIAl9CiAKIAlrdm1fZm9yX2VhY2hfdmNwdShjLCB2Y3B1LCBrdm0pIHsKLQkJaWYgKGNvbXB1dGVfcGVuZGluZ19mb3JfY3B1KHZjcHUpKSB7Ci0JCQlwcl9kZWJ1ZygiQ1BVJWQgaGFzIHBlbmRpbmcgaW50ZXJydXB0c1xuIiwgYyk7CisJCWlmIChjb21wdXRlX3BlbmRpbmdfZm9yX2NwdSh2Y3B1KSkKIAkJCXNldF9iaXQoYywgZGlzdC0+aXJxX3BlbmRpbmdfb25fY3B1KTsKLQkJfQorCisJCWlmIChjb21wdXRlX2FjdGl2ZV9mb3JfY3B1KHZjcHUpKQorCQkJc2V0X2JpdChjLCBkaXN0LT5pcnFfYWN0aXZlX29uX2NwdSk7CisJCWVsc2UKKwkJCWNsZWFyX2JpdChjLCBkaXN0LT5pcnFfYWN0aXZlX29uX2NwdSk7CiAJfQogfQogCkBAIC04ODMsNiArMTAyOSwxMSBAQAogCXJldHVybiB2Z2ljX29wcy0+Z2V0X2Vpc3IodmNwdSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCB2Z2ljX2NsZWFyX2Vpc3Ioc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQoreworCXZnaWNfb3BzLT5jbGVhcl9laXNyKHZjcHUpOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiB2Z2ljX2dldF9pbnRlcnJ1cHRfc3RhdHVzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAlyZXR1cm4gdmdpY19vcHMtPmdldF9pbnRlcnJ1cHRfc3RhdHVzKHZjcHUpOwpAQCAtOTIyLDYgKzEwNzMsNyBAQAogCXZnaWNfc2V0X2xyKHZjcHUsIGxyX25yLCB2bHIpOwogCWNsZWFyX2JpdChscl9uciwgdmdpY19jcHUtPmxyX3VzZWQpOwogCXZnaWNfY3B1LT52Z2ljX2lycV9scl9tYXBbaXJxXSA9IExSX0VNUFRZOworCXZnaWNfc3luY19scl9lbHJzcih2Y3B1LCBscl9uciwgdmxyKTsKIH0KIAogLyoKQEAgLTk0OSw2ICsxMTAxLDI2IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCB2Z2ljX3F1ZXVlX2lycV90b19scihzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGludCBpcnEsCisJCQkJIGludCBscl9uciwgc3RydWN0IHZnaWNfbHIgdmxyKQoreworCWlmICh2Z2ljX2lycV9pc19hY3RpdmUodmNwdSwgaXJxKSkgeworCQl2bHIuc3RhdGUgfD0gTFJfU1RBVEVfQUNUSVZFOworCQlrdm1fZGVidWcoIlNldCBhY3RpdmUsIGNsZWFyIGRpc3RyaWJ1dG9yOiAweCV4XG4iLCB2bHIuc3RhdGUpOworCQl2Z2ljX2lycV9jbGVhcl9hY3RpdmUodmNwdSwgaXJxKTsKKwkJdmdpY191cGRhdGVfc3RhdGUodmNwdS0+a3ZtKTsKKwl9IGVsc2UgaWYgKHZnaWNfZGlzdF9pcnFfaXNfcGVuZGluZyh2Y3B1LCBpcnEpKSB7CisJCXZsci5zdGF0ZSB8PSBMUl9TVEFURV9QRU5ESU5HOworCQlrdm1fZGVidWcoIlNldCBwZW5kaW5nOiAweCV4XG4iLCB2bHIuc3RhdGUpOworCX0KKworCWlmICghdmdpY19pcnFfaXNfZWRnZSh2Y3B1LCBpcnEpKQorCQl2bHIuc3RhdGUgfD0gTFJfRU9JX0lOVDsKKworCXZnaWNfc2V0X2xyKHZjcHUsIGxyX25yLCB2bHIpOworCXZnaWNfc3luY19scl9lbHJzcih2Y3B1LCBscl9uciwgdmxyKTsKK30KKwogLyoKICAqIFF1ZXVlIGFuIGludGVycnVwdCB0byBhIENQVSB2aXJ0dWFsIGludGVyZmFjZS4gUmV0dXJuIHRydWUgb24gc3VjY2VzcywKICAqIG9yIGZhbHNlIGlmIGl0IHdhc24ndCBwb3NzaWJsZSB0byBxdWV1ZSBpdC4KQEAgLTk3Niw4ICsxMTQ4LDcgQEAKIAkJaWYgKHZsci5zb3VyY2UgPT0gc2dpX3NvdXJjZV9pZCkgewogCQkJa3ZtX2RlYnVnKCJMUiVkIHBpZ2d5YmFjayBmb3IgSVJRJWRcbiIsIGxyLCB2bHIuaXJxKTsKIAkJCUJVR19PTighdGVzdF9iaXQobHIsIHZnaWNfY3B1LT5scl91c2VkKSk7Ci0JCQl2bHIuc3RhdGUgfD0gTFJfU1RBVEVfUEVORElORzsKLQkJCXZnaWNfc2V0X2xyKHZjcHUsIGxyLCB2bHIpOworCQkJdmdpY19xdWV1ZV9pcnFfdG9fbHIodmNwdSwgaXJxLCBsciwgdmxyKTsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAJfQpAQCAtOTk0LDExICsxMTY1LDggQEAKIAogCXZsci5pcnEgPSBpcnE7CiAJdmxyLnNvdXJjZSA9IHNnaV9zb3VyY2VfaWQ7Ci0JdmxyLnN0YXRlID0gTFJfU1RBVEVfUEVORElORzsKLQlpZiAoIXZnaWNfaXJxX2lzX2VkZ2UodmNwdSwgaXJxKSkKLQkJdmxyLnN0YXRlIHw9IExSX0VPSV9JTlQ7Ci0KLQl2Z2ljX3NldF9scih2Y3B1LCBsciwgdmxyKTsKKwl2bHIuc3RhdGUgPSAwOworCXZnaWNfcXVldWVfaXJxX3RvX2xyKHZjcHUsIGlycSwgbHIsIHZscik7CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTEwMzAsMzkgKzExOTgsNDkgQEAKIHsKIAlzdHJ1Y3QgdmdpY19jcHUgKnZnaWNfY3B1ID0gJnZjcHUtPmFyY2gudmdpY19jcHU7CiAJc3RydWN0IHZnaWNfZGlzdCAqZGlzdCA9ICZ2Y3B1LT5rdm0tPmFyY2gudmdpYzsKKwl1bnNpZ25lZCBsb25nICpwYV9wZXJjcHUsICpwYV9zaGFyZWQ7CiAJaW50IGksIHZjcHVfaWQ7CiAJaW50IG92ZXJmbG93ID0gMDsKKwlpbnQgbnJfc2hhcmVkID0gdmdpY19ucl9zaGFyZWRfaXJxcyhkaXN0KTsKIAogCXZjcHVfaWQgPSB2Y3B1LT52Y3B1X2lkOwogCisJcGFfcGVyY3B1ID0gdmNwdS0+YXJjaC52Z2ljX2NwdS5wZW5kX2FjdF9wZXJjcHU7CisJcGFfc2hhcmVkID0gdmNwdS0+YXJjaC52Z2ljX2NwdS5wZW5kX2FjdF9zaGFyZWQ7CisKKwliaXRtYXBfb3IocGFfcGVyY3B1LCB2Z2ljX2NwdS0+cGVuZGluZ19wZXJjcHUsIHZnaWNfY3B1LT5hY3RpdmVfcGVyY3B1LAorCQkgIFZHSUNfTlJfUFJJVkFURV9JUlFTKTsKKwliaXRtYXBfb3IocGFfc2hhcmVkLCB2Z2ljX2NwdS0+cGVuZGluZ19zaGFyZWQsIHZnaWNfY3B1LT5hY3RpdmVfc2hhcmVkLAorCQkgIG5yX3NoYXJlZCk7CiAJLyoKIAkgKiBXZSBtYXkgbm90IGhhdmUgYW55IHBlbmRpbmcgaW50ZXJydXB0LCBvciB0aGUgaW50ZXJydXB0cwogCSAqIG1heSBoYXZlIGJlZW4gc2VydmljZWQgZnJvbSBhbm90aGVyIHZjcHUuIEluIGFsbCBjYXNlcywKIAkgKiBtb3ZlIGFsb25nLgogCSAqLwotCWlmICgha3ZtX3ZnaWNfdmNwdV9wZW5kaW5nX2lycSh2Y3B1KSkgewotCQlwcl9kZWJ1ZygiQ1BVJWQgaGFzIG5vIHBlbmRpbmcgaW50ZXJydXB0XG4iLCB2Y3B1X2lkKTsKKwlpZiAoIWt2bV92Z2ljX3ZjcHVfcGVuZGluZ19pcnEodmNwdSkgJiYgIWt2bV92Z2ljX3ZjcHVfYWN0aXZlX2lycSh2Y3B1KSkKIAkJZ290byBlcGlsb2c7Ci0JfQogCiAJLyogU0dJcyAqLwotCWZvcl9lYWNoX3NldF9iaXQoaSwgdmdpY19jcHUtPnBlbmRpbmdfcGVyY3B1LCBWR0lDX05SX1NHSVMpIHsKKwlmb3JfZWFjaF9zZXRfYml0KGksIHBhX3BlcmNwdSwgVkdJQ19OUl9TR0lTKSB7CiAJCWlmICghcXVldWVfc2dpKHZjcHUsIGkpKQogCQkJb3ZlcmZsb3cgPSAxOwogCX0KIAogCS8qIFBQSXMgKi8KLQlmb3JfZWFjaF9zZXRfYml0X2Zyb20oaSwgdmdpY19jcHUtPnBlbmRpbmdfcGVyY3B1LCBWR0lDX05SX1BSSVZBVEVfSVJRUykgeworCWZvcl9lYWNoX3NldF9iaXRfZnJvbShpLCBwYV9wZXJjcHUsIFZHSUNfTlJfUFJJVkFURV9JUlFTKSB7CiAJCWlmICghdmdpY19xdWV1ZV9od2lycSh2Y3B1LCBpKSkKIAkJCW92ZXJmbG93ID0gMTsKIAl9CiAKIAkvKiBTUElzICovCi0JZm9yX2VhY2hfc2V0X2JpdChpLCB2Z2ljX2NwdS0+cGVuZGluZ19zaGFyZWQsIHZnaWNfbnJfc2hhcmVkX2lycXMoZGlzdCkpIHsKKwlmb3JfZWFjaF9zZXRfYml0KGksIHBhX3NoYXJlZCwgbnJfc2hhcmVkKSB7CiAJCWlmICghdmdpY19xdWV1ZV9od2lycSh2Y3B1LCBpICsgVkdJQ19OUl9QUklWQVRFX0lSUVMpKQogCQkJb3ZlcmZsb3cgPSAxOwogCX0KIAorCisKKwogZXBpbG9nOgogCWlmIChvdmVyZmxvdykgewogCQl2Z2ljX2VuYWJsZV91bmRlcmZsb3codmNwdSk7CkBAIC0xMDgxLDcgKzEyNTksOSBAQAogc3RhdGljIGJvb2wgdmdpY19wcm9jZXNzX21haW50ZW5hbmNlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKIHsKIAl1MzIgc3RhdHVzID0gdmdpY19nZXRfaW50ZXJydXB0X3N0YXR1cyh2Y3B1KTsKKwlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0ID0gJnZjcHUtPmt2bS0+YXJjaC52Z2ljOwogCWJvb2wgbGV2ZWxfcGVuZGluZyA9IGZhbHNlOworCXN0cnVjdCBrdm0gKmt2bSA9IHZjcHUtPmt2bTsKIAogCWt2bV9kZWJ1ZygiU1RBVFVTID0gJTA4eFxuIiwgc3RhdHVzKTsKIApAQCAtMTA5OCw2ICsxMjc4LDcgQEAKIAkJCXN0cnVjdCB2Z2ljX2xyIHZsciA9IHZnaWNfZ2V0X2xyKHZjcHUsIGxyKTsKIAkJCVdBUk5fT04odmdpY19pcnFfaXNfZWRnZSh2Y3B1LCB2bHIuaXJxKSk7CiAKKwkJCXNwaW5fbG9jaygmZGlzdC0+bG9jayk7CiAJCQl2Z2ljX2lycV9jbGVhcl9xdWV1ZWQodmNwdSwgdmxyLmlycSk7CiAJCQlXQVJOX09OKHZsci5zdGF0ZSAmIExSX1NUQVRFX01BU0spOwogCQkJdmxyLnN0YXRlID0gMDsKQEAgLTExMTYsNiArMTI5NywxNyBAQAogCQkJICovCiAJCQl2Z2ljX2Rpc3RfaXJxX2NsZWFyX3NvZnRfcGVuZCh2Y3B1LCB2bHIuaXJxKTsKIAorCQkJLyoKKwkJCSAqIGt2bV9ub3RpZnlfYWNrZWRfaXJxIGNhbGxzIGt2bV9zZXRfaXJxKCkKKwkJCSAqIHRvIHJlc2V0IHRoZSBJUlEgbGV2ZWwuIE5lZWQgdG8gcmVsZWFzZSB0aGUKKwkJCSAqIGxvY2sgZm9yIGt2bV9zZXRfaXJxIHRvIGdyYWIgaXQuCisJCQkgKi8KKwkJCXNwaW5fdW5sb2NrKCZkaXN0LT5sb2NrKTsKKworCQkJa3ZtX25vdGlmeV9hY2tlZF9pcnEoa3ZtLCAwLAorCQkJCQkgICAgIHZsci5pcnEgLSBWR0lDX05SX1BSSVZBVEVfSVJRUyk7CisJCQlzcGluX2xvY2soJmRpc3QtPmxvY2spOworCiAJCQkvKiBBbnkgYWRkaXRpb25hbCBwZW5kaW5nIGludGVycnVwdD8gKi8KIAkJCWlmICh2Z2ljX2Rpc3RfaXJxX2dldF9sZXZlbCh2Y3B1LCB2bHIuaXJxKSkgewogCQkJCXZnaWNfY3B1X2lycV9zZXQodmNwdSwgdmxyLmlycSk7CkBAIC0xMTI1LDYgKzEzMTcsOCBAQAogCQkJCXZnaWNfY3B1X2lycV9jbGVhcih2Y3B1LCB2bHIuaXJxKTsKIAkJCX0KIAorCQkJc3Bpbl91bmxvY2soJmRpc3QtPmxvY2spOworCiAJCQkvKgogCQkJICogRGVzcGl0ZSBiZWluZyBFT0llZCwgdGhlIExSIG1heSBub3QgaGF2ZQogCQkJICogYmVlbiBtYXJrZWQgYXMgZW1wdHkuCkBAIC0xMTM2LDEzICsxMzMwLDE4IEBACiAJaWYgKHN0YXR1cyAmIElOVF9TVEFUVVNfVU5ERVJGTE9XKQogCQl2Z2ljX2Rpc2FibGVfdW5kZXJmbG93KHZjcHUpOwogCisJLyoKKwkgKiBJbiB0aGUgbmV4dCBpdGVyYXRpb25zIG9mIHRoZSB2Y3B1IGxvb3AsIGlmIHdlIHN5bmMgdGhlIHZnaWMgc3RhdGUKKwkgKiBhZnRlciBmbHVzaGluZyBpdCwgYnV0IGJlZm9yZSBlbnRlcmluZyB0aGUgZ3Vlc3QgKHRoaXMgaGFwcGVucyBmb3IKKwkgKiBwZW5kaW5nIHNpZ25hbHMgYW5kIHZtaWQgcm9sbG92ZXJzKSwgdGhlbiBtYWtlIHN1cmUgd2UgZG9uJ3QgcGljaworCSAqIHVwIGFueSBvbGQgbWFpbnRlbmFuY2UgaW50ZXJydXB0cyBoZXJlLgorCSAqLworCXZnaWNfY2xlYXJfZWlzcih2Y3B1KTsKKwogCXJldHVybiBsZXZlbF9wZW5kaW5nOwogfQogCi0vKgotICogU3luYyBiYWNrIHRoZSBWR0lDIHN0YXRlIGFmdGVyIGEgZ3Vlc3QgcnVuLiBUaGUgZGlzdHJpYnV0b3IgbG9jayBpcwotICogbmVlZGVkIHNvIHdlIGRvbid0IGdldCBwcmVlbXB0ZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgc3RhdGUgcHJvY2Vzc2luZy4KLSAqLworLyogU3luYyBiYWNrIHRoZSBWR0lDIHN0YXRlIGFmdGVyIGEgZ3Vlc3QgcnVuICovCiBzdGF0aWMgdm9pZCBfX2t2bV92Z2ljX3N5bmNfaHdzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7CiAJc3RydWN0IHZnaWNfY3B1ICp2Z2ljX2NwdSA9ICZ2Y3B1LT5hcmNoLnZnaWNfY3B1OwpAQCAtMTE4OSwxNCArMTM4OCwxMCBAQAogCiB2b2lkIGt2bV92Z2ljX3N5bmNfaHdzdGF0ZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUpCiB7Ci0Jc3RydWN0IHZnaWNfZGlzdCAqZGlzdCA9ICZ2Y3B1LT5rdm0tPmFyY2gudmdpYzsKLQogCWlmICghaXJxY2hpcF9pbl9rZXJuZWwodmNwdS0+a3ZtKSkKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrKCZkaXN0LT5sb2NrKTsKIAlfX2t2bV92Z2ljX3N5bmNfaHdzdGF0ZSh2Y3B1KTsKLQlzcGluX3VubG9jaygmZGlzdC0+bG9jayk7CiB9CiAKIGludCBrdm1fdmdpY192Y3B1X3BlbmRpbmdfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKQEAgLTEyMDksNiArMTQwNCwxNyBAQAogCXJldHVybiB0ZXN0X2JpdCh2Y3B1LT52Y3B1X2lkLCBkaXN0LT5pcnFfcGVuZGluZ19vbl9jcHUpOwogfQogCitpbnQga3ZtX3ZnaWNfdmNwdV9hY3RpdmVfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSkKK3sKKwlzdHJ1Y3QgdmdpY19kaXN0ICpkaXN0ID0gJnZjcHUtPmt2bS0+YXJjaC52Z2ljOworCisJaWYgKCFpcnFjaGlwX2luX2tlcm5lbCh2Y3B1LT5rdm0pKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB0ZXN0X2JpdCh2Y3B1LT52Y3B1X2lkLCBkaXN0LT5pcnFfYWN0aXZlX29uX2NwdSk7Cit9CisKKwogdm9pZCB2Z2ljX2tpY2tfdmNwdXMoc3RydWN0IGt2bSAqa3ZtKQogewogCXN0cnVjdCBrdm1fdmNwdSAqdmNwdTsKQEAgLTEzODEsOCArMTU4NywxMiBAQAogCXN0cnVjdCB2Z2ljX2NwdSAqdmdpY19jcHUgPSAmdmNwdS0+YXJjaC52Z2ljX2NwdTsKIAogCWtmcmVlKHZnaWNfY3B1LT5wZW5kaW5nX3NoYXJlZCk7CisJa2ZyZWUodmdpY19jcHUtPmFjdGl2ZV9zaGFyZWQpOworCWtmcmVlKHZnaWNfY3B1LT5wZW5kX2FjdF9zaGFyZWQpOwogCWtmcmVlKHZnaWNfY3B1LT52Z2ljX2lycV9scl9tYXApOwogCXZnaWNfY3B1LT5wZW5kaW5nX3NoYXJlZCA9IE5VTEw7CisJdmdpY19jcHUtPmFjdGl2ZV9zaGFyZWQgPSBOVUxMOworCXZnaWNfY3B1LT5wZW5kX2FjdF9zaGFyZWQgPSBOVUxMOwogCXZnaWNfY3B1LT52Z2ljX2lycV9scl9tYXAgPSBOVUxMOwogfQogCkBAIC0xMzkyLDkgKzE2MDIsMTQgQEAKIAogCWludCBzeiA9IChucl9pcnFzIC0gVkdJQ19OUl9QUklWQVRFX0lSUVMpIC8gODsKIAl2Z2ljX2NwdS0+cGVuZGluZ19zaGFyZWQgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwl2Z2ljX2NwdS0+YWN0aXZlX3NoYXJlZCA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCXZnaWNfY3B1LT5wZW5kX2FjdF9zaGFyZWQgPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKIAl2Z2ljX2NwdS0+dmdpY19pcnFfbHJfbWFwID0ga21hbGxvYyhucl9pcnFzLCBHRlBfS0VSTkVMKTsKIAotCWlmICghdmdpY19jcHUtPnBlbmRpbmdfc2hhcmVkIHx8ICF2Z2ljX2NwdS0+dmdpY19pcnFfbHJfbWFwKSB7CisJaWYgKCF2Z2ljX2NwdS0+cGVuZGluZ19zaGFyZWQKKwkJfHwgIXZnaWNfY3B1LT5hY3RpdmVfc2hhcmVkCisJCXx8ICF2Z2ljX2NwdS0+cGVuZF9hY3Rfc2hhcmVkCisJCXx8ICF2Z2ljX2NwdS0+dmdpY19pcnFfbHJfbWFwKSB7CiAJCWt2bV92Z2ljX3ZjcHVfZGVzdHJveSh2Y3B1KTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQpAQCAtMTQ0NywxMCArMTY2MiwxMiBAQAogCWtmcmVlKGRpc3QtPmlycV9zcGlfbXBpZHIpOwogCWtmcmVlKGRpc3QtPmlycV9zcGlfdGFyZ2V0KTsKIAlrZnJlZShkaXN0LT5pcnFfcGVuZGluZ19vbl9jcHUpOworCWtmcmVlKGRpc3QtPmlycV9hY3RpdmVfb25fY3B1KTsKIAlkaXN0LT5pcnFfc2dpX3NvdXJjZXMgPSBOVUxMOwogCWRpc3QtPmlycV9zcGlfY3B1ID0gTlVMTDsKIAlkaXN0LT5pcnFfc3BpX3RhcmdldCA9IE5VTEw7CiAJZGlzdC0+aXJxX3BlbmRpbmdfb25fY3B1ID0gTlVMTDsKKwlkaXN0LT5pcnFfYWN0aXZlX29uX2NwdSA9IE5VTEw7CiAJZGlzdC0+bnJfY3B1cyA9IDA7CiB9CiAKQEAgLTE0ODYsNiArMTcwMyw3IEBACiAJcmV0IHw9IHZnaWNfaW5pdF9iaXRtYXAoJmRpc3QtPmlycV9wZW5kaW5nLCBucl9jcHVzLCBucl9pcnFzKTsKIAlyZXQgfD0gdmdpY19pbml0X2JpdG1hcCgmZGlzdC0+aXJxX3NvZnRfcGVuZCwgbnJfY3B1cywgbnJfaXJxcyk7CiAJcmV0IHw9IHZnaWNfaW5pdF9iaXRtYXAoJmRpc3QtPmlycV9xdWV1ZWQsIG5yX2NwdXMsIG5yX2lycXMpOworCXJldCB8PSB2Z2ljX2luaXRfYml0bWFwKCZkaXN0LT5pcnFfYWN0aXZlLCBucl9jcHVzLCBucl9pcnFzKTsKIAlyZXQgfD0gdmdpY19pbml0X2JpdG1hcCgmZGlzdC0+aXJxX2NmZywgbnJfY3B1cywgbnJfaXJxcyk7CiAJcmV0IHw9IHZnaWNfaW5pdF9ieXRlbWFwKCZkaXN0LT5pcnFfcHJpb3JpdHksIG5yX2NwdXMsIG5yX2lycXMpOwogCkBAIC0xNDk4LDEwICsxNzE2LDEzIEBACiAJCQkJICAgICAgIEdGUF9LRVJORUwpOwogCWRpc3QtPmlycV9wZW5kaW5nX29uX2NwdSA9IGt6YWxsb2MoQklUU19UT19MT05HUyhucl9jcHVzKSAqIHNpemVvZihsb25nKSwKIAkJCQkJICAgR0ZQX0tFUk5FTCk7CisJZGlzdC0+aXJxX2FjdGl2ZV9vbl9jcHUgPSBremFsbG9jKEJJVFNfVE9fTE9OR1MobnJfY3B1cykgKiBzaXplb2YobG9uZyksCisJCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghZGlzdC0+aXJxX3NnaV9zb3VyY2VzIHx8CiAJICAgICFkaXN0LT5pcnFfc3BpX2NwdSB8fAogCSAgICAhZGlzdC0+aXJxX3NwaV90YXJnZXQgfHwKLQkgICAgIWRpc3QtPmlycV9wZW5kaW5nX29uX2NwdSkgeworCSAgICAhZGlzdC0+aXJxX3BlbmRpbmdfb25fY3B1IHx8CisJICAgICFkaXN0LT5pcnFfYWN0aXZlX29uX2NwdSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9CkBAIC0xNTgzLDggKzE4MDQsMTAgQEAKIAkgKiBlbXVsYXRpb24uIFNvIGNoZWNrIHRoaXMgaGVyZSBhZ2Fpbi4gS1ZNX0NSRUFURV9ERVZJQ0UgZG9lcwogCSAqIHRoZSBwcm9wZXIgY2hlY2tzIGFscmVhZHkuCiAJICovCi0JaWYgKHR5cGUgPT0gS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YyICYmICF2Z2ljLT5jYW5fZW11bGF0ZV9naWN2MikKLQkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHR5cGUgPT0gS1ZNX0RFVl9UWVBFX0FSTV9WR0lDX1YyICYmICF2Z2ljLT5jYW5fZW11bGF0ZV9naWN2MikgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dDsKKwl9CiAKIAkvKgogCSAqIEFueSB0aW1lIGEgdmNwdSBpcyBydW4sIHZjcHVfbG9hZCBpcyBjYWxsZWQgd2hpY2ggdHJpZXMgdG8gZ3JhYiB0aGUKQEAgLTE4MjcsMTIgKzIwNTAsOSBAQAogCXJldHVybiByOwogfQogCi1pbnQgdmdpY19oYXNfYXR0cl9yZWdzKGNvbnN0IHN0cnVjdCBrdm1fbW1pb19yYW5nZSAqcmFuZ2VzLCBwaHlzX2FkZHJfdCBvZmZzZXQpCitpbnQgdmdpY19oYXNfYXR0cl9yZWdzKGNvbnN0IHN0cnVjdCB2Z2ljX2lvX3JhbmdlICpyYW5nZXMsIHBoeXNfYWRkcl90IG9mZnNldCkKIHsKLQlzdHJ1Y3Qga3ZtX2V4aXRfbW1pbyBkZXZfYXR0cl9tbWlvOwotCi0JZGV2X2F0dHJfbW1pby5sZW4gPSA0OwotCWlmICh2Z2ljX2ZpbmRfcmFuZ2UocmFuZ2VzLCAmZGV2X2F0dHJfbW1pbywgb2Zmc2V0KSkKKwlpZiAodmdpY19maW5kX3JhbmdlKHJhbmdlcywgNCwgb2Zmc2V0KSkKIAkJcmV0dXJuIDA7CiAJZWxzZQogCQlyZXR1cm4gLUVOWElPOwpAQCAtMTg2NSw4ICsyMDg1LDEwIEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB2Z2ljX2lkc1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAiYXJtLGNvcnRleC1hMTUtZ2ljIiwgLmRhdGEgPSB2Z2ljX3YyX3Byb2JlLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiYXJtLGdpYy12MyIsIC5kYXRhID0gdmdpY192M19wcm9iZSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTE1LWdpYyIsCS5kYXRhID0gdmdpY192Ml9wcm9iZSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImFybSxjb3J0ZXgtYTctZ2ljIiwJLmRhdGEgPSB2Z2ljX3YyX3Byb2JlLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiYXJtLGdpYy00MDAiLAkJLmRhdGEgPSB2Z2ljX3YyX3Byb2JlLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiYXJtLGdpYy12MyIsCQkuZGF0YSA9IHZnaWNfdjNfcHJvYmUsIH0sCiAJe30sCiB9OwogCkBAIC0xOTE0LDMgKzIxMzYsMzggQEAKIAlmcmVlX3BlcmNwdV9pcnEodmdpYy0+bWFpbnRfaXJxLCBrdm1fZ2V0X3J1bm5pbmdfdmNwdXMoKSk7CiAJcmV0dXJuIHJldDsKIH0KKworaW50IGt2bV9pcnFfbWFwX2dzaShzdHJ1Y3Qga3ZtICprdm0sCisJCSAgICBzdHJ1Y3Qga3ZtX2tlcm5lbF9pcnFfcm91dGluZ19lbnRyeSAqZW50cmllcywKKwkJICAgIGludCBnc2kpCit7CisJcmV0dXJuIGdzaTsKK30KKworaW50IGt2bV9pcnFfbWFwX2NoaXBfcGluKHN0cnVjdCBrdm0gKmt2bSwgdW5zaWduZWQgaXJxY2hpcCwgdW5zaWduZWQgcGluKQoreworCXJldHVybiBwaW47Cit9CisKK2ludCBrdm1fc2V0X2lycShzdHJ1Y3Qga3ZtICprdm0sIGludCBpcnFfc291cmNlX2lkLAorCQl1MzIgaXJxLCBpbnQgbGV2ZWwsIGJvb2wgbGluZV9zdGF0dXMpCit7CisJdW5zaWduZWQgaW50IHNwaSA9IGlycSArIFZHSUNfTlJfUFJJVkFURV9JUlFTOworCisJdHJhY2Vfa3ZtX3NldF9pcnEoaXJxLCBsZXZlbCwgaXJxX3NvdXJjZV9pZCk7CisKKwlCVUdfT04oIXZnaWNfaW5pdGlhbGl6ZWQoa3ZtKSk7CisKKwlpZiAoc3BpID4ga3ZtLT5hcmNoLnZnaWMubnJfaXJxcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGt2bV92Z2ljX2luamVjdF9pcnEoa3ZtLCAwLCBzcGksIGxldmVsKTsKKworfQorCisvKiBNU0kgbm90IGltcGxlbWVudGVkIHlldCAqLworaW50IGt2bV9zZXRfbXNpKHN0cnVjdCBrdm1fa2VybmVsX2lycV9yb3V0aW5nX2VudHJ5ICplLAorCQlzdHJ1Y3Qga3ZtICprdm0sIGludCBpcnFfc291cmNlX2lkLAorCQlpbnQgbGV2ZWwsIGJvb2wgbGluZV9zdGF0dXMpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hcm0vdmdpYy5oIGIvdmlydC9rdm0vYXJtL3ZnaWMuaAppbmRleCAxZTgzYmRmLi4wZGY3NGNiIDEwMDY0NAotLS0gYS92aXJ0L2t2bS9hcm0vdmdpYy5oCisrKyBiL3ZpcnQva3ZtL2FybS92Z2ljLmgKQEAgLTIwLDYgKzIwLDggQEAKICNpZm5kZWYgX19LVk1fVkdJQ19IX18KICNkZWZpbmUgX19LVk1fVkdJQ19IX18KIAorI2luY2x1ZGUgPGt2bS9pb2Rldi5oPgorCiAjZGVmaW5lIFZHSUNfQUREUl9VTkRFRgkJKC0xKQogI2RlZmluZSBJU19WR0lDX0FERFJfVU5ERUYoX3gpICAoKF94KSA9PSBWR0lDX0FERFJfVU5ERUYpCiAKQEAgLTU3LDYgKzU5LDE0IEBACiBib29sIHZnaWNfcXVldWVfaXJxKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgdTggc2dpX3NvdXJjZV9pZCwgaW50IGlycSk7CiB2b2lkIHZnaWNfdW5xdWV1ZV9pcnFzKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSk7CiAKK3N0cnVjdCBrdm1fZXhpdF9tbWlvIHsKKwlwaHlzX2FkZHJfdAlwaHlzX2FkZHI7CisJdm9pZAkJKmRhdGE7CisJdTMyCQlsZW47CisJYm9vbAkJaXNfd3JpdGU7CisJdm9pZAkJKnByaXZhdGU7Cit9OworCiB2b2lkIHZnaWNfcmVnX2FjY2VzcyhzdHJ1Y3Qga3ZtX2V4aXRfbW1pbyAqbW1pbywgdTMyICpyZWcsCiAJCSAgICAgcGh5c19hZGRyX3Qgb2Zmc2V0LCBpbnQgbW9kZSk7CiBib29sIGhhbmRsZV9tbWlvX3Jhel93aShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvLApAQCAtNzQsNyArODQsNyBAQAogCSooKHUzMiAqKW1taW8tPmRhdGEpID0gY3B1X3RvX2xlMzIodmFsdWUpICYgbWFzazsKIH0KIAotc3RydWN0IGt2bV9tbWlvX3JhbmdlIHsKK3N0cnVjdCB2Z2ljX2lvX3JhbmdlIHsKIAlwaHlzX2FkZHJfdCBiYXNlOwogCXVuc2lnbmVkIGxvbmcgbGVuOwogCWludCBiaXRzX3Blcl9pcnE7CkBAIC04Miw2ICs5MiwxMSBAQAogCQkJICAgIHBoeXNfYWRkcl90IG9mZnNldCk7CiB9OwogCitpbnQgdmdpY19yZWdpc3Rlcl9rdm1faW9fZGV2KHN0cnVjdCBrdm0gKmt2bSwgZ3BhX3QgYmFzZSwgaW50IGxlbiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHZnaWNfaW9fcmFuZ2UgKnJhbmdlcywKKwkJCSAgICAgaW50IHJlZGlzdF9pZCwKKwkJCSAgICAgc3RydWN0IHZnaWNfaW9fZGV2aWNlICppb2Rldik7CisKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc19pbl9yYW5nZShwaHlzX2FkZHJfdCBhZGRyLCB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCSAgICAgICBwaHlzX2FkZHJfdCBiYXNlYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewpAQCAtODksMTQgKzEwNCw4IEBACiB9CiAKIGNvbnN0Ci1zdHJ1Y3Qga3ZtX21taW9fcmFuZ2UgKnZnaWNfZmluZF9yYW5nZShjb25zdCBzdHJ1Y3Qga3ZtX21taW9fcmFuZ2UgKnJhbmdlcywKLQkJCQkgICAgICAgc3RydWN0IGt2bV9leGl0X21taW8gKm1taW8sCi0JCQkJICAgICAgIHBoeXNfYWRkcl90IG9mZnNldCk7Ci0KLWJvb2wgdmdpY19oYW5kbGVfbW1pb19yYW5nZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHN0cnVjdCBrdm1fcnVuICpydW4sCi0JCQkgICAgc3RydWN0IGt2bV9leGl0X21taW8gKm1taW8sCi0JCQkgICAgY29uc3Qgc3RydWN0IGt2bV9tbWlvX3JhbmdlICpyYW5nZXMsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBtbWlvX2Jhc2UpOworc3RydWN0IHZnaWNfaW9fcmFuZ2UgKnZnaWNfZmluZF9yYW5nZShjb25zdCBzdHJ1Y3QgdmdpY19pb19yYW5nZSAqcmFuZ2VzLAorCQkJCSAgICAgIGludCBsZW4sIGdwYV90IG9mZnNldCk7CiAKIGJvb2wgdmdpY19oYW5kbGVfZW5hYmxlX3JlZyhzdHJ1Y3Qga3ZtICprdm0sIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvLAogCQkJICAgIHBoeXNfYWRkcl90IG9mZnNldCwgaW50IHZjcHVfaWQsIGludCBhY2Nlc3MpOwpAQCAtMTA3LDEyICsxMTYsMjAgQEAKIGJvb2wgdmdpY19oYW5kbGVfY2xlYXJfcGVuZGluZ19yZWcoc3RydWN0IGt2bSAqa3ZtLCBzdHJ1Y3Qga3ZtX2V4aXRfbW1pbyAqbW1pbywKIAkJCQkgICBwaHlzX2FkZHJfdCBvZmZzZXQsIGludCB2Y3B1X2lkKTsKIAorYm9vbCB2Z2ljX2hhbmRsZV9zZXRfYWN0aXZlX3JlZyhzdHJ1Y3Qga3ZtICprdm0sCisJCQkJc3RydWN0IGt2bV9leGl0X21taW8gKm1taW8sCisJCQkJcGh5c19hZGRyX3Qgb2Zmc2V0LCBpbnQgdmNwdV9pZCk7CisKK2Jvb2wgdmdpY19oYW5kbGVfY2xlYXJfYWN0aXZlX3JlZyhzdHJ1Y3Qga3ZtICprdm0sCisJCQkJICBzdHJ1Y3Qga3ZtX2V4aXRfbW1pbyAqbW1pbywKKwkJCQkgIHBoeXNfYWRkcl90IG9mZnNldCwgaW50IHZjcHVfaWQpOworCiBib29sIHZnaWNfaGFuZGxlX2NmZ19yZWcodTMyICpyZWcsIHN0cnVjdCBrdm1fZXhpdF9tbWlvICptbWlvLAogCQkJIHBoeXNfYWRkcl90IG9mZnNldCk7CiAKIHZvaWQgdmdpY19raWNrX3ZjcHVzKHN0cnVjdCBrdm0gKmt2bSk7CiAKLWludCB2Z2ljX2hhc19hdHRyX3JlZ3MoY29uc3Qgc3RydWN0IGt2bV9tbWlvX3JhbmdlICpyYW5nZXMsIHBoeXNfYWRkcl90IG9mZnNldCk7CitpbnQgdmdpY19oYXNfYXR0cl9yZWdzKGNvbnN0IHN0cnVjdCB2Z2ljX2lvX3JhbmdlICpyYW5nZXMsIHBoeXNfYWRkcl90IG9mZnNldCk7CiBpbnQgdmdpY19zZXRfY29tbW9uX2F0dHIoc3RydWN0IGt2bV9kZXZpY2UgKmRldiwgc3RydWN0IGt2bV9kZXZpY2VfYXR0ciAqYXR0cik7CiBpbnQgdmdpY19nZXRfY29tbW9uX2F0dHIoc3RydWN0IGt2bV9kZXZpY2UgKmRldiwgc3RydWN0IGt2bV9kZXZpY2VfYXR0ciAqYXR0cik7CiAKZGlmZiAtLWdpdCBhL3ZpcnQva3ZtL2NvYWxlc2NlZF9tbWlvLmMgYi92aXJ0L2t2bS9jb2FsZXNjZWRfbW1pby5jCmluZGV4IDAwZDg2NDIuLjU3MWMxY2UgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2NvYWxlc2NlZF9tbWlvLmMKKysrIGIvdmlydC9rdm0vY29hbGVzY2VkX21taW8uYwpAQCAtOCw3ICs4LDcgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgImlvZGV2LmgiCisjaW5jbHVkZSA8a3ZtL2lvZGV2Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9rdm1faG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTYwLDggKzYwLDkgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBjb2FsZXNjZWRfbW1pb193cml0ZShzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKLQkJCQlncGFfdCBhZGRyLCBpbnQgbGVuLCBjb25zdCB2b2lkICp2YWwpCitzdGF0aWMgaW50IGNvYWxlc2NlZF9tbWlvX3dyaXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwKKwkJCQlzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywgZ3BhX3QgYWRkciwKKwkJCQlpbnQgbGVuLCBjb25zdCB2b2lkICp2YWwpCiB7CiAJc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19kZXYgKmRldiA9IHRvX21taW8odGhpcyk7CiAJc3RydWN0IGt2bV9jb2FsZXNjZWRfbW1pb19yaW5nICpyaW5nID0gZGV2LT5rdm0tPmNvYWxlc2NlZF9tbWlvX3Jpbmc7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9ldmVudGZkLmMgYi92aXJ0L2t2bS9ldmVudGZkLmMKaW5kZXggMTQ4YjIzOS4uOWZmNDE5MyAxMDA2NDQKLS0tIGEvdmlydC9rdm0vZXZlbnRmZC5jCisrKyBiL3ZpcnQva3ZtL2V2ZW50ZmQuYwpAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KICNpbmNsdWRlIDx0cmFjZS9ldmVudHMva3ZtLmg+CiAKLSNpbmNsdWRlICJpb2Rldi5oIgorI2luY2x1ZGUgPGt2bS9pb2Rldi5oPgogCiAjaWZkZWYgQ09ORklHX0hBVkVfS1ZNX0lSUUZECiAvKgpAQCAtMzExLDYgKzMxMSw5IEBACiAJdW5zaWduZWQgaW50IGV2ZW50czsKIAlpbnQgaWR4OwogCisJaWYgKCFrdm1fYXJjaF9pbnRjX2luaXRpYWxpemVkKGt2bSkpCisJCXJldHVybiAtRUFHQUlOOworCiAJaXJxZmQgPSBremFsbG9jKHNpemVvZigqaXJxZmQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWlycWZkKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTcxMiw4ICs3MTUsOCBAQAogCiAvKiBNTUlPL1BJTyB3cml0ZXMgdHJpZ2dlciBhbiBldmVudCBpZiB0aGUgYWRkci92YWwgbWF0Y2ggKi8KIHN0YXRpYyBpbnQKLWlvZXZlbnRmZF93cml0ZShzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywgZ3BhX3QgYWRkciwgaW50IGxlbiwKLQkJY29uc3Qgdm9pZCAqdmFsKQoraW9ldmVudGZkX3dyaXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMsIGdwYV90IGFkZHIsCisJCWludCBsZW4sIGNvbnN0IHZvaWQgKnZhbCkKIHsKIAlzdHJ1Y3QgX2lvZXZlbnRmZCAqcCA9IHRvX2lvZXZlbnRmZCh0aGlzKTsKIApkaWZmIC0tZ2l0IGEvdmlydC9rdm0vaW9kZXYuaCBiL3ZpcnQva3ZtL2lvZGV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZmQzY2EuLjAwMDAwMDAKLS0tIGEvdmlydC9rdm0vaW9kZXYuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KLSAqLwotCi0jaWZuZGVmIF9fS1ZNX0lPREVWX0hfXwotI2RlZmluZSBfX0tWTV9JT0RFVl9IX18KLQotI2luY2x1ZGUgPGxpbnV4L2t2bV90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9lcnJuby5oPgotCi1zdHJ1Y3Qga3ZtX2lvX2RldmljZTsKLQotLyoqCi0gKiBrdm1faW9fZGV2aWNlX29wcyBhcmUgY2FsbGVkIHVuZGVyIGt2bSBzbG90c19sb2NrLgotICogcmVhZCBhbmQgd3JpdGUgaGFuZGxlcnMgcmV0dXJuIDAgaWYgdGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIGhhbmRsZWQsCi0gKiBvciBub24temVybyB0byBoYXZlIGl0IHBhc3NlZCB0byB0aGUgbmV4dCBkZXZpY2UuCi0gKiovCi1zdHJ1Y3Qga3ZtX2lvX2RldmljZV9vcHMgewotCWludCAoKnJlYWQpKHN0cnVjdCBrdm1faW9fZGV2aWNlICp0aGlzLAotCQkgICAgZ3BhX3QgYWRkciwKLQkJICAgIGludCBsZW4sCi0JCSAgICB2b2lkICp2YWwpOwotCWludCAoKndyaXRlKShzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqdGhpcywKLQkJICAgICBncGFfdCBhZGRyLAotCQkgICAgIGludCBsZW4sCi0JCSAgICAgY29uc3Qgdm9pZCAqdmFsKTsKLQl2b2lkICgqZGVzdHJ1Y3Rvcikoc3RydWN0IGt2bV9pb19kZXZpY2UgKnRoaXMpOwotfTsKLQotCi1zdHJ1Y3Qga3ZtX2lvX2RldmljZSB7Ci0JY29uc3Qgc3RydWN0IGt2bV9pb19kZXZpY2Vfb3BzICpvcHM7Ci19OwotCi1zdGF0aWMgaW5saW5lIHZvaWQga3ZtX2lvZGV2aWNlX2luaXQoc3RydWN0IGt2bV9pb19kZXZpY2UgKmRldiwKLQkJCQkgICAgIGNvbnN0IHN0cnVjdCBrdm1faW9fZGV2aWNlX29wcyAqb3BzKQotewotCWRldi0+b3BzID0gb3BzOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBrdm1faW9kZXZpY2VfcmVhZChzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2LAotCQkJCSAgICBncGFfdCBhZGRyLCBpbnQgbCwgdm9pZCAqdikKLXsKLQlyZXR1cm4gZGV2LT5vcHMtPnJlYWQgPyBkZXYtPm9wcy0+cmVhZChkZXYsIGFkZHIsIGwsIHYpIDogLUVPUE5PVFNVUFA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGt2bV9pb2RldmljZV93cml0ZShzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2LAotCQkJCSAgICAgZ3BhX3QgYWRkciwgaW50IGwsIGNvbnN0IHZvaWQgKnYpCi17Ci0JcmV0dXJuIGRldi0+b3BzLT53cml0ZSA/IGRldi0+b3BzLT53cml0ZShkZXYsIGFkZHIsIGwsIHYpIDogLUVPUE5PVFNVUFA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBrdm1faW9kZXZpY2VfZGVzdHJ1Y3RvcihzdHJ1Y3Qga3ZtX2lvX2RldmljZSAqZGV2KQotewotCWlmIChkZXYtPm9wcy0+ZGVzdHJ1Y3RvcikKLQkJZGV2LT5vcHMtPmRlc3RydWN0b3IoZGV2KTsKLX0KLQotI2VuZGlmIC8qIF9fS1ZNX0lPREVWX0hfXyAqLwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0vaXJxY2hpcC5jIGIvdmlydC9rdm0vaXJxY2hpcC5jCmluZGV4IDdmMjU2ZjMuLjFkNTZhOTAgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2lycWNoaXAuYworKysgYi92aXJ0L2t2bS9pcnFjaGlwLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCWkgPSBrdm1faXJxX21hcF9nc2koa3ZtLCBpcnFfc2V0LCBpcnEpOwogCXNyY3VfcmVhZF91bmxvY2soJmt2bS0+aXJxX3NyY3UsIGlkeCk7CiAKLQl3aGlsZShpLS0pIHsKKwl3aGlsZSAoaS0tKSB7CiAJCWludCByOwogCQlyID0gaXJxX3NldFtpXS5zZXQoJmlycV9zZXRbaV0sIGt2bSwgaXJxX3NvdXJjZV9pZCwgbGV2ZWwsCiAJCQkJICAgbGluZV9zdGF0dXMpOwpkaWZmIC0tZ2l0IGEvdmlydC9rdm0va3ZtX21haW4uYyBiL3ZpcnQva3ZtL2t2bV9tYWluLmMKaW5kZXggYTEwOTM3MC4uZDNmYzkzOSAxMDA2NDQKLS0tIGEvdmlydC9rdm0va3ZtX21haW4uYworKysgYi92aXJ0L2t2bS9rdm1fbWFpbi5jCkBAIC0xNiw3ICsxNiw3IEBACiAgKgogICovCiAKLSNpbmNsdWRlICJpb2Rldi5oIgorI2luY2x1ZGUgPGt2bS9pb2Rldi5oPgogCiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9rdm0uaD4KQEAgLTY2LDEzICs2NiwxMyBAQAogTU9EVUxFX0FVVEhPUigiUXVtcmFuZXQiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotdW5zaWduZWQgaW50IGhhbHRfcG9sbF9ucyA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGhhbHRfcG9sbF9uczsKIG1vZHVsZV9wYXJhbShoYWx0X3BvbGxfbnMsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIAogLyoKICAqIE9yZGVyaW5nIG9mIGxvY2tzOgogICoKLSAqIAkJa3ZtLT5sb2NrIC0tPiBrdm0tPnNsb3RzX2xvY2sgLS0+IGt2bS0+aXJxX2xvY2sKKyAqCWt2bS0+bG9jayAtLT4ga3ZtLT5zbG90c19sb2NrIC0tPiBrdm0tPmlycV9sb2NrCiAgKi8KIAogREVGSU5FX1NQSU5MT0NLKGt2bV9sb2NrKTsKQEAgLTgwLDcgKzgwLDcgQEAKIExJU1RfSEVBRCh2bV9saXN0KTsKIAogc3RhdGljIGNwdW1hc2tfdmFyX3QgY3B1c19oYXJkd2FyZV9lbmFibGVkOwotc3RhdGljIGludCBrdm1fdXNhZ2VfY291bnQgPSAwOworc3RhdGljIGludCBrdm1fdXNhZ2VfY291bnQ7CiBzdGF0aWMgYXRvbWljX3QgaGFyZHdhcmVfZW5hYmxlX2ZhaWxlZDsKIAogc3RydWN0IGttZW1fY2FjaGUgKmt2bV92Y3B1X2NhY2hlOwpAQCAtNDcxLDcgKzQ3MSw3IEBACiAJQlVJTERfQlVHX09OKEtWTV9NRU1fU0xPVFNfTlVNID4gU0hSVF9NQVgpOwogCiAJciA9IC1FTk9NRU07Ci0Ja3ZtLT5tZW1zbG90cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrdm1fbWVtc2xvdHMpLCBHRlBfS0VSTkVMKTsKKwlrdm0tPm1lbXNsb3RzID0ga3ZtX2t2emFsbG9jKHNpemVvZihzdHJ1Y3Qga3ZtX21lbXNsb3RzKSk7CiAJaWYgKCFrdm0tPm1lbXNsb3RzKQogCQlnb3RvIG91dF9lcnJfbm9fc3JjdTsKIApAQCAtNTIyLDcgKzUyMiw3IEBACiBvdXRfZXJyX25vX2Rpc2FibGU6CiAJZm9yIChpID0gMDsgaSA8IEtWTV9OUl9CVVNFUzsgaSsrKQogCQlrZnJlZShrdm0tPmJ1c2VzW2ldKTsKLQlrZnJlZShrdm0tPm1lbXNsb3RzKTsKKwlrdmZyZWUoa3ZtLT5tZW1zbG90cyk7CiAJa3ZtX2FyY2hfZnJlZV92bShrdm0pOwogCXJldHVybiBFUlJfUFRSKHIpOwogfQpAQCAtNTM5LDIwICs1MzksMTIgQEAKIAkJcmV0dXJuIGt6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiB9CiAKLXZvaWQga3ZtX2t2ZnJlZShjb25zdCB2b2lkICphZGRyKQotewotCWlmIChpc192bWFsbG9jX2FkZHIoYWRkcikpCi0JCXZmcmVlKGFkZHIpOwotCWVsc2UKLQkJa2ZyZWUoYWRkcik7Ci19Ci0KIHN0YXRpYyB2b2lkIGt2bV9kZXN0cm95X2RpcnR5X2JpdG1hcChzdHJ1Y3Qga3ZtX21lbW9yeV9zbG90ICptZW1zbG90KQogewogCWlmICghbWVtc2xvdC0+ZGlydHlfYml0bWFwKQogCQlyZXR1cm47CiAKLQlrdm1fa3ZmcmVlKG1lbXNsb3QtPmRpcnR5X2JpdG1hcCk7CisJa3ZmcmVlKG1lbXNsb3QtPmRpcnR5X2JpdG1hcCk7CiAJbWVtc2xvdC0+ZGlydHlfYml0bWFwID0gTlVMTDsKIH0KIApAQCAtNTc4LDcgKzU3MCw3IEBACiAJa3ZtX2Zvcl9lYWNoX21lbXNsb3QobWVtc2xvdCwgc2xvdHMpCiAJCWt2bV9mcmVlX3BoeXNtZW1fc2xvdChrdm0sIG1lbXNsb3QsIE5VTEwpOwogCi0Ja2ZyZWUoa3ZtLT5tZW1zbG90cyk7CisJa3ZmcmVlKGt2bS0+bWVtc2xvdHMpOwogfQogCiBzdGF0aWMgdm9pZCBrdm1fZGVzdHJveV9kZXZpY2VzKHN0cnVjdCBrdm0gKmt2bSkKQEAgLTg3MSwxMCArODYzLDEwIEBACiAJCQlnb3RvIG91dF9mcmVlOwogCX0KIAotCXNsb3RzID0ga21lbWR1cChrdm0tPm1lbXNsb3RzLCBzaXplb2Yoc3RydWN0IGt2bV9tZW1zbG90cyksCi0JCQlHRlBfS0VSTkVMKTsKKwlzbG90cyA9IGt2bV9rdnphbGxvYyhzaXplb2Yoc3RydWN0IGt2bV9tZW1zbG90cykpOwogCWlmICghc2xvdHMpCiAJCWdvdG8gb3V0X2ZyZWU7CisJbWVtY3B5KHNsb3RzLCBrdm0tPm1lbXNsb3RzLCBzaXplb2Yoc3RydWN0IGt2bV9tZW1zbG90cykpOwogCiAJaWYgKChjaGFuZ2UgPT0gS1ZNX01SX0RFTEVURSkgfHwgKGNoYW5nZSA9PSBLVk1fTVJfTU9WRSkpIHsKIAkJc2xvdCA9IGlkX3RvX21lbXNsb3Qoc2xvdHMsIG1lbS0+c2xvdCk7CkBAIC04ODgsOCArODgwLDggQEAKIAkJICogb3IgbW92ZWQsIG1lbXNsb3Qgd2lsbCBiZSBjcmVhdGVkLgogCQkgKgogCQkgKiB2YWxpZGF0aW9uIG9mIHNwLT5nZm4gaGFwcGVucyBpbjoKLQkJICogCS0gZ2ZuX3RvX2h2YSAoa3ZtX3JlYWRfZ3Vlc3QsIGdmbl90b19wZm4pCi0JCSAqIAktIGt2bV9pc192aXNpYmxlX2dmbiAobW11X2NoZWNrX3Jvb3RzKQorCQkgKgktIGdmbl90b19odmEgKGt2bV9yZWFkX2d1ZXN0LCBnZm5fdG9fcGZuKQorCQkgKgktIGt2bV9pc192aXNpYmxlX2dmbiAobW11X2NoZWNrX3Jvb3RzKQogCQkgKi8KIAkJa3ZtX2FyY2hfZmx1c2hfc2hhZG93X21lbXNsb3Qoa3ZtLCBzbG90KTsKIApAQCAtOTE3LDcgKzkwOSw3IEBACiAJa3ZtX2FyY2hfY29tbWl0X21lbW9yeV9yZWdpb24oa3ZtLCBtZW0sICZvbGQsIGNoYW5nZSk7CiAKIAlrdm1fZnJlZV9waHlzbWVtX3Nsb3Qoa3ZtLCAmb2xkLCAmbmV3KTsKLQlrZnJlZShvbGRfbWVtc2xvdHMpOworCWt2ZnJlZShvbGRfbWVtc2xvdHMpOwogCiAJLyoKIAkgKiBJT01NVSBtYXBwaW5nOiAgTmV3IHNsb3RzIG5lZWQgdG8gYmUgbWFwcGVkLiAgT2xkIHNsb3RzIG5lZWQgdG8gYmUKQEAgLTkzNiw3ICs5MjgsNyBAQAogCXJldHVybiAwOwogCiBvdXRfc2xvdHM6Ci0Ja2ZyZWUoc2xvdHMpOworCWt2ZnJlZShzbG90cyk7CiBvdXRfZnJlZToKIAlrdm1fZnJlZV9waHlzbWVtX3Nsb3Qoa3ZtLCAmbmV3LCAmb2xkKTsKIG91dDoKQEAgLTEwNjEsOSArMTA1MywxMSBAQAogCQltYXNrID0geGNoZygmZGlydHlfYml0bWFwW2ldLCAwKTsKIAkJZGlydHlfYml0bWFwX2J1ZmZlcltpXSA9IG1hc2s7CiAKLQkJb2Zmc2V0ID0gaSAqIEJJVFNfUEVSX0xPTkc7Ci0JCWt2bV9hcmNoX21tdV9lbmFibGVfbG9nX2RpcnR5X3B0X21hc2tlZChrdm0sIG1lbXNsb3QsIG9mZnNldCwKLQkJCQkJCQkJbWFzayk7CisJCWlmIChtYXNrKSB7CisJCQlvZmZzZXQgPSBpICogQklUU19QRVJfTE9ORzsKKwkJCWt2bV9hcmNoX21tdV9lbmFibGVfbG9nX2RpcnR5X3B0X21hc2tlZChrdm0sIG1lbXNsb3QsCisJCQkJCQkJCW9mZnNldCwgbWFzayk7CisJCX0KIAl9CiAKIAlzcGluX3VubG9jaygma3ZtLT5tbXVfbG9jayk7CkBAIC0xMTkzLDE2ICsxMTg3LDYgQEAKIAlyZXR1cm4gZ2ZuX3RvX2h2YV9tZW1zbG90X3Byb3Qoc2xvdCwgZ2ZuLCB3cml0YWJsZSk7CiB9CiAKLXN0YXRpYyBpbnQga3ZtX3JlYWRfaHZhKHZvaWQgKmRhdGEsIHZvaWQgX191c2VyICpodmEsIGludCBsZW4pCi17Ci0JcmV0dXJuIF9fY29weV9mcm9tX3VzZXIoZGF0YSwgaHZhLCBsZW4pOwotfQotCi1zdGF0aWMgaW50IGt2bV9yZWFkX2h2YV9hdG9taWModm9pZCAqZGF0YSwgdm9pZCBfX3VzZXIgKmh2YSwgaW50IGxlbikKLXsKLQlyZXR1cm4gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhkYXRhLCBodmEsIGxlbik7Ci19Ci0KIHN0YXRpYyBpbnQgZ2V0X3VzZXJfcGFnZV9ub3dhaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLAogCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGludCB3cml0ZSwgc3RydWN0IHBhZ2UgKipwYWdlKQogewpAQCAtMTQ4MSw3ICsxNDY1LDYgQEAKIAogCXJldHVybiBrdm1fcGZuX3RvX3BhZ2UocGZuKTsKIH0KLQogRVhQT1JUX1NZTUJPTF9HUEwoZ2ZuX3RvX3BhZ2UpOwogCiB2b2lkIGt2bV9yZWxlYXNlX3BhZ2VfY2xlYW4oc3RydWN0IHBhZ2UgKnBhZ2UpCkBAIC0xNTE3LDYgKzE1MDAsNyBAQAogewogCWlmICgha3ZtX2lzX3Jlc2VydmVkX3BmbihwZm4pKSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwogCQlpZiAoIVBhZ2VSZXNlcnZlZChwYWdlKSkKIAkJCVNldFBhZ2VEaXJ0eShwYWdlKTsKIAl9CkBAIC0xNTU0LDcgKzE1MzgsNyBAQAogCWFkZHIgPSBnZm5fdG9faHZhX3Byb3Qoa3ZtLCBnZm4sIE5VTEwpOwogCWlmIChrdm1faXNfZXJyb3JfaHZhKGFkZHIpKQogCQlyZXR1cm4gLUVGQVVMVDsKLQlyID0ga3ZtX3JlYWRfaHZhKGRhdGEsICh2b2lkIF9fdXNlciAqKWFkZHIgKyBvZmZzZXQsIGxlbik7CisJciA9IF9fY29weV9mcm9tX3VzZXIoZGF0YSwgKHZvaWQgX191c2VyICopYWRkciArIG9mZnNldCwgbGVuKTsKIAlpZiAocikKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJcmV0dXJuIDA7CkBAIC0xNTkzLDcgKzE1NzcsNyBAQAogCWlmIChrdm1faXNfZXJyb3JfaHZhKGFkZHIpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlwYWdlZmF1bHRfZGlzYWJsZSgpOwotCXIgPSBrdm1fcmVhZF9odmFfYXRvbWljKGRhdGEsICh2b2lkIF9fdXNlciAqKWFkZHIgKyBvZmZzZXQsIGxlbik7CisJciA9IF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoZGF0YSwgKHZvaWQgX191c2VyICopYWRkciArIG9mZnNldCwgbGVuKTsKIAlwYWdlZmF1bHRfZW5hYmxlKCk7CiAJaWYgKHIpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtMTY1Myw4ICsxNjM3LDggQEAKIAlnaGMtPmdlbmVyYXRpb24gPSBzbG90cy0+Z2VuZXJhdGlvbjsKIAlnaGMtPmxlbiA9IGxlbjsKIAlnaGMtPm1lbXNsb3QgPSBnZm5fdG9fbWVtc2xvdChrdm0sIHN0YXJ0X2dmbik7Ci0JZ2hjLT5odmEgPSBnZm5fdG9faHZhX21hbnkoZ2hjLT5tZW1zbG90LCBzdGFydF9nZm4sICZucl9wYWdlc19hdmFpbCk7Ci0JaWYgKCFrdm1faXNfZXJyb3JfaHZhKGdoYy0+aHZhKSAmJiBucl9wYWdlc19hdmFpbCA+PSBucl9wYWdlc19uZWVkZWQpIHsKKwlnaGMtPmh2YSA9IGdmbl90b19odmFfbWFueShnaGMtPm1lbXNsb3QsIHN0YXJ0X2dmbiwgTlVMTCk7CisJaWYgKCFrdm1faXNfZXJyb3JfaHZhKGdoYy0+aHZhKSAmJiBucl9wYWdlc19uZWVkZWQgPD0gMSkgewogCQlnaGMtPmh2YSArPSBvZmZzZXQ7CiAJfSBlbHNlIHsKIAkJLyoKQEAgLTE3NDIsNyArMTcyNiw3IEBACiAJaW50IG9mZnNldCA9IG9mZnNldF9pbl9wYWdlKGdwYSk7CiAJaW50IHJldDsKIAotICAgICAgICB3aGlsZSAoKHNlZyA9IG5leHRfc2VnbWVudChsZW4sIG9mZnNldCkpICE9IDApIHsKKwl3aGlsZSAoKHNlZyA9IG5leHRfc2VnbWVudChsZW4sIG9mZnNldCkpICE9IDApIHsKIAkJcmV0ID0ga3ZtX2NsZWFyX2d1ZXN0X3BhZ2Uoa3ZtLCBnZm4sIG9mZnNldCwgc2VnKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwpAQCAtMTgwMCw2ICsxNzg0LDcgQEAKIAlzdGFydCA9IGN1ciA9IGt0aW1lX2dldCgpOwogCWlmIChoYWx0X3BvbGxfbnMpIHsKIAkJa3RpbWVfdCBzdG9wID0ga3RpbWVfYWRkX25zKGt0aW1lX2dldCgpLCBoYWx0X3BvbGxfbnMpOworCiAJCWRvIHsKIAkJCS8qCiAJCQkgKiBUaGlzIHNldHMgS1ZNX1JFUV9VTkhBTFQgaWYgYW4gaW50ZXJydXB0CkBAIC0yMTE4LDcgKzIxMDMsNyBAQAogCSAqIFNwZWNpYWwgY2FzZXM6IHZjcHUgaW9jdGxzIHRoYXQgYXJlIGFzeW5jaHJvbm91cyB0byB2Y3B1IGV4ZWN1dGlvbiwKIAkgKiBzbyB2Y3B1X2xvYWQoKSB3b3VsZCBicmVhayBpdC4KIAkgKi8KLQlpZiAoaW9jdGwgPT0gS1ZNX1MzOTBfSU5URVJSVVBUIHx8IGlvY3RsID09IEtWTV9JTlRFUlJVUFQpCisJaWYgKGlvY3RsID09IEtWTV9TMzkwX0lOVEVSUlVQVCB8fCBpb2N0bCA9PSBLVk1fUzM5MF9JUlEgfHwgaW9jdGwgPT0gS1ZNX0lOVEVSUlVQVCkKIAkJcmV0dXJuIGt2bV9hcmNoX3ZjcHVfaW9jdGwoZmlscCwgaW9jdGwsIGFyZyk7CiAjZW5kaWYKIApAQCAtMjEzNSw2ICsyMTIwLDcgQEAKIAkJCS8qIFRoZSB0aHJlYWQgcnVubmluZyB0aGlzIFZDUFUgY2hhbmdlZC4gKi8KIAkJCXN0cnVjdCBwaWQgKm9sZHBpZCA9IHZjcHUtPnBpZDsKIAkJCXN0cnVjdCBwaWQgKm5ld3BpZCA9IGdldF90YXNrX3BpZChjdXJyZW50LCBQSURUWVBFX1BJRCk7CisKIAkJCXJjdV9hc3NpZ25fcG9pbnRlcih2Y3B1LT5waWQsIG5ld3BpZCk7CiAJCQlpZiAob2xkcGlkKQogCQkJCXN5bmNocm9uaXplX3JjdSgpOwpAQCAtMjIwNSw3ICsyMTkxLDcgQEAKIAkJaWYgKHIpCiAJCQlnb3RvIG91dDsKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJm1wX3N0YXRlLCBzaXplb2YgbXBfc3RhdGUpKQorCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZtcF9zdGF0ZSwgc2l6ZW9mKG1wX3N0YXRlKSkpCiAJCQlnb3RvIG91dDsKIAkJciA9IDA7CiAJCWJyZWFrOwpAQCAtMjIxNCw3ICsyMjAwLDcgQEAKIAkJc3RydWN0IGt2bV9tcF9zdGF0ZSBtcF9zdGF0ZTsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZtcF9zdGF0ZSwgYXJncCwgc2l6ZW9mIG1wX3N0YXRlKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtcF9zdGF0ZSwgYXJncCwgc2l6ZW9mKG1wX3N0YXRlKSkpCiAJCQlnb3RvIG91dDsKIAkJciA9IGt2bV9hcmNoX3ZjcHVfaW9jdGxfc2V0X21wc3RhdGUodmNwdSwgJm1wX3N0YXRlKTsKIAkJYnJlYWs7CkBAIC0yMjIzLDEzICsyMjA5LDEzIEBACiAJCXN0cnVjdCBrdm1fdHJhbnNsYXRpb24gdHI7CiAKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmdHIsIGFyZ3AsIHNpemVvZiB0cikpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmdHIsIGFyZ3AsIHNpemVvZih0cikpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fYXJjaF92Y3B1X2lvY3RsX3RyYW5zbGF0ZSh2Y3B1LCAmdHIpOwogCQlpZiAocikKIAkJCWdvdG8gb3V0OwogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdHIsIHNpemVvZiB0cikpCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnRyLCBzaXplb2YodHIpKSkKIAkJCWdvdG8gb3V0OwogCQlyID0gMDsKIAkJYnJlYWs7CkBAIC0yMjM4LDcgKzIyMjQsNyBAQAogCQlzdHJ1Y3Qga3ZtX2d1ZXN0X2RlYnVnIGRiZzsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYmcsIGFyZ3AsIHNpemVvZiBkYmcpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmRiZywgYXJncCwgc2l6ZW9mKGRiZykpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fYXJjaF92Y3B1X2lvY3RsX3NldF9ndWVzdF9kZWJ1Zyh2Y3B1LCAmZGJnKTsKIAkJYnJlYWs7CkBAIC0yMjUyLDE0ICsyMjM4LDE0IEBACiAJCWlmIChhcmdwKSB7CiAJCQlyID0gLUVGQVVMVDsKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3NpZ21hc2ssIGFyZ3AsCi0JCQkJCSAgIHNpemVvZiBrdm1fc2lnbWFzaykpCisJCQkJCSAgIHNpemVvZihrdm1fc2lnbWFzaykpKQogCQkJCWdvdG8gb3V0OwogCQkJciA9IC1FSU5WQUw7Ci0JCQlpZiAoa3ZtX3NpZ21hc2subGVuICE9IHNpemVvZiBzaWdzZXQpCisJCQlpZiAoa3ZtX3NpZ21hc2subGVuICE9IHNpemVvZihzaWdzZXQpKQogCQkJCWdvdG8gb3V0OwogCQkJciA9IC1FRkFVTFQ7CiAJCQlpZiAoY29weV9mcm9tX3VzZXIoJnNpZ3NldCwgc2lnbWFza19hcmctPnNpZ3NldCwKLQkJCQkJICAgc2l6ZW9mIHNpZ3NldCkpCisJCQkJCSAgIHNpemVvZihzaWdzZXQpKSkKIAkJCQlnb3RvIG91dDsKIAkJCXAgPSAmc2lnc2V0OwogCQl9CkBAIC0yMzIxLDE0ICsyMzA3LDE0IEBACiAJCWlmIChhcmdwKSB7CiAJCQlyID0gLUVGQVVMVDsKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3NpZ21hc2ssIGFyZ3AsCi0JCQkJCSAgIHNpemVvZiBrdm1fc2lnbWFzaykpCisJCQkJCSAgIHNpemVvZihrdm1fc2lnbWFzaykpKQogCQkJCWdvdG8gb3V0OwogCQkJciA9IC1FSU5WQUw7Ci0JCQlpZiAoa3ZtX3NpZ21hc2subGVuICE9IHNpemVvZiBjc2lnc2V0KQorCQkJaWYgKGt2bV9zaWdtYXNrLmxlbiAhPSBzaXplb2YoY3NpZ3NldCkpCiAJCQkJZ290byBvdXQ7CiAJCQlyID0gLUVGQVVMVDsKIAkJCWlmIChjb3B5X2Zyb21fdXNlcigmY3NpZ3NldCwgc2lnbWFza19hcmctPnNpZ3NldCwKLQkJCQkJICAgc2l6ZW9mIGNzaWdzZXQpKQorCQkJCQkgICBzaXplb2YoY3NpZ3NldCkpKQogCQkJCWdvdG8gb3V0OwogCQkJc2lnc2V0X2Zyb21fY29tcGF0KCZzaWdzZXQsICZjc2lnc2V0KTsKIAkJCXIgPSBrdm1fdmNwdV9pb2N0bF9zZXRfc2lnbWFzayh2Y3B1LCAmc2lnc2V0KTsKQEAgLTI0OTIsNiArMjQ3OCw3IEBACiAJY2FzZSBLVk1fQ0FQX1NJR05BTF9NU0k6CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfSEFWRV9LVk1fSVJRRkQKKwljYXNlIEtWTV9DQVBfSVJRRkQ6CiAJY2FzZSBLVk1fQ0FQX0lSUUZEX1JFU0FNUExFOgogI2VuZGlmCiAJY2FzZSBLVk1fQ0FQX0NIRUNLX0VYVEVOU0lPTl9WTToKQEAgLTI1MjQsNyArMjUxMSw3IEBACiAKIAkJciA9IC1FRkFVTFQ7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigma3ZtX3VzZXJzcGFjZV9tZW0sIGFyZ3AsCi0JCQkJCQlzaXplb2Yga3ZtX3VzZXJzcGFjZV9tZW0pKQorCQkJCQkJc2l6ZW9mKGt2bV91c2Vyc3BhY2VfbWVtKSkpCiAJCQlnb3RvIG91dDsKIAogCQlyID0ga3ZtX3ZtX2lvY3RsX3NldF9tZW1vcnlfcmVnaW9uKGt2bSwgJmt2bV91c2Vyc3BhY2VfbWVtKTsKQEAgLTI1MzQsNyArMjUyMSw3IEBACiAJCXN0cnVjdCBrdm1fZGlydHlfbG9nIGxvZzsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZsb2csIGFyZ3AsIHNpemVvZiBsb2cpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmxvZywgYXJncCwgc2l6ZW9mKGxvZykpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1fdm1faW9jdGxfZ2V0X2RpcnR5X2xvZyhrdm0sICZsb2cpOwogCQlicmVhazsKQEAgLTI1NDIsMTYgKzI1MjksMTggQEAKICNpZmRlZiBLVk1fQ09BTEVTQ0VEX01NSU9fUEFHRV9PRkZTRVQKIAljYXNlIEtWTV9SRUdJU1RFUl9DT0FMRVNDRURfTU1JTzogewogCQlzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3pvbmUgem9uZTsKKwogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ6b25lLCBhcmdwLCBzaXplb2Ygem9uZSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmem9uZSwgYXJncCwgc2l6ZW9mKHpvbmUpKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX3ZtX2lvY3RsX3JlZ2lzdGVyX2NvYWxlc2NlZF9tbWlvKGt2bSwgJnpvbmUpOwogCQlicmVhazsKIAl9CiAJY2FzZSBLVk1fVU5SRUdJU1RFUl9DT0FMRVNDRURfTU1JTzogewogCQlzdHJ1Y3Qga3ZtX2NvYWxlc2NlZF9tbWlvX3pvbmUgem9uZTsKKwogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZ6b25lLCBhcmdwLCBzaXplb2Ygem9uZSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmem9uZSwgYXJncCwgc2l6ZW9mKHpvbmUpKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX3ZtX2lvY3RsX3VucmVnaXN0ZXJfY29hbGVzY2VkX21taW8oa3ZtLCAmem9uZSk7CiAJCWJyZWFrOwpAQCAtMjU2MSw3ICsyNTUwLDcgQEAKIAkJc3RydWN0IGt2bV9pcnFmZCBkYXRhOwogCiAJCXIgPSAtRUZBVUxUOwotCQlpZiAoY29weV9mcm9tX3VzZXIoJmRhdGEsIGFyZ3AsIHNpemVvZiBkYXRhKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCBhcmdwLCBzaXplb2YoZGF0YSkpKQogCQkJZ290byBvdXQ7CiAJCXIgPSBrdm1faXJxZmQoa3ZtLCAmZGF0YSk7CiAJCWJyZWFrOwpAQCAtMjU3MCw3ICsyNTU5LDcgQEAKIAkJc3RydWN0IGt2bV9pb2V2ZW50ZmQgZGF0YTsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYXRhLCBhcmdwLCBzaXplb2YgZGF0YSkpCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZGF0YSwgYXJncCwgc2l6ZW9mKGRhdGEpKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX2lvZXZlbnRmZChrdm0sICZkYXRhKTsKIAkJYnJlYWs7CkBAIC0yNTkxLDcgKzI1ODAsNyBAQAogCQlzdHJ1Y3Qga3ZtX21zaSBtc2k7CiAKIAkJciA9IC1FRkFVTFQ7Ci0JCWlmIChjb3B5X2Zyb21fdXNlcigmbXNpLCBhcmdwLCBzaXplb2YgbXNpKSkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZtc2ksIGFyZ3AsIHNpemVvZihtc2kpKSkKIAkJCWdvdG8gb3V0OwogCQlyID0ga3ZtX3NlbmRfdXNlcnNwYWNlX21zaShrdm0sICZtc2kpOwogCQlicmVhazsKQEAgLTI2MDMsNyArMjU5Miw3IEBACiAJCXN0cnVjdCBrdm1faXJxX2xldmVsIGlycV9ldmVudDsKIAogCQlyID0gLUVGQVVMVDsKLQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpcnFfZXZlbnQsIGFyZ3AsIHNpemVvZiBpcnFfZXZlbnQpKQorCQlpZiAoY29weV9mcm9tX3VzZXIoJmlycV9ldmVudCwgYXJncCwgc2l6ZW9mKGlycV9ldmVudCkpKQogCQkJZ290byBvdXQ7CiAKIAkJciA9IGt2bV92bV9pb2N0bF9pcnFfbGluZShrdm0sICZpcnFfZXZlbnQsCkBAIC0yNjEzLDcgKzI2MDIsNyBAQAogCiAJCXIgPSAtRUZBVUxUOwogCQlpZiAoaW9jdGwgPT0gS1ZNX0lSUV9MSU5FX1NUQVRVUykgewotCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaXJxX2V2ZW50LCBzaXplb2YgaXJxX2V2ZW50KSkKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmlycV9ldmVudCwgc2l6ZW9mKGlycV9ldmVudCkpKQogCQkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTI2NDYsNyArMjYzNSw3IEBACiAJCQlnb3RvIG91dF9mcmVlX2lycV9yb3V0aW5nOwogCQlyID0ga3ZtX3NldF9pcnFfcm91dGluZyhrdm0sIGVudHJpZXMsIHJvdXRpbmcubnIsCiAJCQkJCXJvdXRpbmcuZmxhZ3MpOwotCW91dF9mcmVlX2lycV9yb3V0aW5nOgorb3V0X2ZyZWVfaXJxX3JvdXRpbmc6CiAJCXZmcmVlKGVudHJpZXMpOwogCQlicmVhazsKIAl9CkBAIC0yODIxLDggKzI4MTAsNyBAQAogCWlmIChyKSB7CiAJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgY3B1c19oYXJkd2FyZV9lbmFibGVkKTsKIAkJYXRvbWljX2luYygmaGFyZHdhcmVfZW5hYmxlX2ZhaWxlZCk7Ci0JCXByaW50ayhLRVJOX0lORk8gImt2bTogZW5hYmxpbmcgdmlydHVhbGl6YXRpb24gb24gIgotCQkJCSAiQ1BVJWQgZmFpbGVkXG4iLCBjcHUpOworCQlwcl9pbmZvKCJrdm06IGVuYWJsaW5nIHZpcnR1YWxpemF0aW9uIG9uIENQVSVkIGZhaWxlZFxuIiwgY3B1KTsKIAl9CiB9CiAKQEAgLTI4OTgsMTIgKzI4ODYsMTIgQEAKIAl2YWwgJj0gfkNQVV9UQVNLU19GUk9aRU47CiAJc3dpdGNoICh2YWwpIHsKIAljYXNlIENQVV9EWUlORzoKLQkJcHJpbnRrKEtFUk5fSU5GTyAia3ZtOiBkaXNhYmxpbmcgdmlydHVhbGl6YXRpb24gb24gQ1BVJWRcbiIsCisJCXByX2luZm8oImt2bTogZGlzYWJsaW5nIHZpcnR1YWxpemF0aW9uIG9uIENQVSVkXG4iLAogCQkgICAgICAgY3B1KTsKIAkJaGFyZHdhcmVfZGlzYWJsZSgpOwogCQlicmVhazsKIAljYXNlIENQVV9TVEFSVElORzoKLQkJcHJpbnRrKEtFUk5fSU5GTyAia3ZtOiBlbmFibGluZyB2aXJ0dWFsaXphdGlvbiBvbiBDUFUlZFxuIiwKKwkJcHJfaW5mbygia3ZtOiBlbmFibGluZyB2aXJ0dWFsaXphdGlvbiBvbiBDUFUlZFxuIiwKIAkJICAgICAgIGNwdSk7CiAJCWhhcmR3YXJlX2VuYWJsZSgpOwogCQlicmVhazsKQEAgLTI5MjAsNyArMjkwOCw3IEBACiAJICoKIAkgKiBBbmQgSW50ZWwgVFhUIHJlcXVpcmVkIFZNWCBvZmYgZm9yIGFsbCBjcHUgd2hlbiBzeXN0ZW0gc2h1dGRvd24uCiAJICovCi0JcHJpbnRrKEtFUk5fSU5GTyAia3ZtOiBleGl0aW5nIGhhcmR3YXJlIHZpcnR1YWxpemF0aW9uXG4iKTsKKwlwcl9pbmZvKCJrdm06IGV4aXRpbmcgaGFyZHdhcmUgdmlydHVhbGl6YXRpb25cbiIpOwogCWt2bV9yZWJvb3RpbmcgPSB0cnVlOwogCW9uX2VhY2hfY3B1KGhhcmR3YXJlX2Rpc2FibGVfbm9sb2NrLCBOVUxMLCAxKTsKIAlyZXR1cm4gTk9USUZZX09LOwpAQCAtMjk0NCw3ICsyOTMyLDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQga3ZtX2lvX2J1c19jbXAoY29uc3Qgc3RydWN0IGt2bV9pb19yYW5nZSAqcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qga3ZtX2lvX3JhbmdlICpyMikKKwkJCQkgY29uc3Qgc3RydWN0IGt2bV9pb19yYW5nZSAqcjIpCiB7CiAJaWYgKHIxLT5hZGRyIDwgcjItPmFkZHIpCiAJCXJldHVybiAtMTsKQEAgLTI5OTcsNyArMjk4NSw3IEBACiAJcmV0dXJuIG9mZjsKIH0KIAotc3RhdGljIGludCBfX2t2bV9pb19idXNfd3JpdGUoc3RydWN0IGt2bV9pb19idXMgKmJ1cywKK3N0YXRpYyBpbnQgX19rdm1faW9fYnVzX3dyaXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgc3RydWN0IGt2bV9pb19idXMgKmJ1cywKIAkJCSAgICAgIHN0cnVjdCBrdm1faW9fcmFuZ2UgKnJhbmdlLCBjb25zdCB2b2lkICp2YWwpCiB7CiAJaW50IGlkeDsKQEAgLTMwMDgsNyArMjk5Niw3IEBACiAKIAl3aGlsZSAoaWR4IDwgYnVzLT5kZXZfY291bnQgJiYKIAkJa3ZtX2lvX2J1c19jbXAocmFuZ2UsICZidXMtPnJhbmdlW2lkeF0pID09IDApIHsKLQkJaWYgKCFrdm1faW9kZXZpY2Vfd3JpdGUoYnVzLT5yYW5nZVtpZHhdLmRldiwgcmFuZ2UtPmFkZHIsCisJCWlmICgha3ZtX2lvZGV2aWNlX3dyaXRlKHZjcHUsIGJ1cy0+cmFuZ2VbaWR4XS5kZXYsIHJhbmdlLT5hZGRyLAogCQkJCQlyYW5nZS0+bGVuLCB2YWwpKQogCQkJcmV0dXJuIGlkeDsKIAkJaWR4Kys7CkBAIC0zMDE4LDcgKzMwMDYsNyBAQAogfQogCiAvKiBrdm1faW9fYnVzX3dyaXRlIC0gY2FsbGVkIHVuZGVyIGt2bS0+c2xvdHNfbG9jayAqLwotaW50IGt2bV9pb19idXNfd3JpdGUoc3RydWN0IGt2bSAqa3ZtLCBlbnVtIGt2bV9idXMgYnVzX2lkeCwgZ3BhX3QgYWRkciwKK2ludCBrdm1faW9fYnVzX3dyaXRlKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZW51bSBrdm1fYnVzIGJ1c19pZHgsIGdwYV90IGFkZHIsCiAJCSAgICAgaW50IGxlbiwgY29uc3Qgdm9pZCAqdmFsKQogewogCXN0cnVjdCBrdm1faW9fYnVzICpidXM7CkBAIC0zMDMwLDE0ICszMDE4LDE0IEBACiAJCS5sZW4gPSBsZW4sCiAJfTsKIAotCWJ1cyA9IHNyY3VfZGVyZWZlcmVuY2Uoa3ZtLT5idXNlc1tidXNfaWR4XSwgJmt2bS0+c3JjdSk7Ci0JciA9IF9fa3ZtX2lvX2J1c193cml0ZShidXMsICZyYW5nZSwgdmFsKTsKKwlidXMgPSBzcmN1X2RlcmVmZXJlbmNlKHZjcHUtPmt2bS0+YnVzZXNbYnVzX2lkeF0sICZ2Y3B1LT5rdm0tPnNyY3UpOworCXIgPSBfX2t2bV9pb19idXNfd3JpdGUodmNwdSwgYnVzLCAmcmFuZ2UsIHZhbCk7CiAJcmV0dXJuIHIgPCAwID8gciA6IDA7CiB9CiAKIC8qIGt2bV9pb19idXNfd3JpdGVfY29va2llIC0gY2FsbGVkIHVuZGVyIGt2bS0+c2xvdHNfbG9jayAqLwotaW50IGt2bV9pb19idXNfd3JpdGVfY29va2llKHN0cnVjdCBrdm0gKmt2bSwgZW51bSBrdm1fYnVzIGJ1c19pZHgsIGdwYV90IGFkZHIsCi0JCQkgICAgaW50IGxlbiwgY29uc3Qgdm9pZCAqdmFsLCBsb25nIGNvb2tpZSkKK2ludCBrdm1faW9fYnVzX3dyaXRlX2Nvb2tpZShzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIGVudW0ga3ZtX2J1cyBidXNfaWR4LAorCQkJICAgIGdwYV90IGFkZHIsIGludCBsZW4sIGNvbnN0IHZvaWQgKnZhbCwgbG9uZyBjb29raWUpCiB7CiAJc3RydWN0IGt2bV9pb19idXMgKmJ1czsKIAlzdHJ1Y3Qga3ZtX2lvX3JhbmdlIHJhbmdlOwpAQCAtMzA0NywxMiArMzAzNSwxMiBAQAogCQkubGVuID0gbGVuLAogCX07CiAKLQlidXMgPSBzcmN1X2RlcmVmZXJlbmNlKGt2bS0+YnVzZXNbYnVzX2lkeF0sICZrdm0tPnNyY3UpOworCWJ1cyA9IHNyY3VfZGVyZWZlcmVuY2UodmNwdS0+a3ZtLT5idXNlc1tidXNfaWR4XSwgJnZjcHUtPmt2bS0+c3JjdSk7CiAKIAkvKiBGaXJzdCB0cnkgdGhlIGRldmljZSByZWZlcmVuY2VkIGJ5IGNvb2tpZS4gKi8KIAlpZiAoKGNvb2tpZSA+PSAwKSAmJiAoY29va2llIDwgYnVzLT5kZXZfY291bnQpICYmCiAJICAgIChrdm1faW9fYnVzX2NtcCgmcmFuZ2UsICZidXMtPnJhbmdlW2Nvb2tpZV0pID09IDApKQotCQlpZiAoIWt2bV9pb2RldmljZV93cml0ZShidXMtPnJhbmdlW2Nvb2tpZV0uZGV2LCBhZGRyLCBsZW4sCisJCWlmICgha3ZtX2lvZGV2aWNlX3dyaXRlKHZjcHUsIGJ1cy0+cmFuZ2VbY29va2llXS5kZXYsIGFkZHIsIGxlbiwKIAkJCQkJdmFsKSkKIAkJCXJldHVybiBjb29raWU7CiAKQEAgLTMwNjAsMTEgKzMwNDgsMTEgQEAKIAkgKiBjb29raWUgY29udGFpbmVkIGdhcmJhZ2U7IGZhbGwgYmFjayB0byBzZWFyY2ggYW5kIHJldHVybiB0aGUKIAkgKiBjb3JyZWN0IGNvb2tpZSB2YWx1ZS4KIAkgKi8KLQlyZXR1cm4gX19rdm1faW9fYnVzX3dyaXRlKGJ1cywgJnJhbmdlLCB2YWwpOworCXJldHVybiBfX2t2bV9pb19idXNfd3JpdGUodmNwdSwgYnVzLCAmcmFuZ2UsIHZhbCk7CiB9CiAKLXN0YXRpYyBpbnQgX19rdm1faW9fYnVzX3JlYWQoc3RydWN0IGt2bV9pb19idXMgKmJ1cywgc3RydWN0IGt2bV9pb19yYW5nZSAqcmFuZ2UsCi0JCQkgICAgIHZvaWQgKnZhbCkKK3N0YXRpYyBpbnQgX19rdm1faW9fYnVzX3JlYWQoc3RydWN0IGt2bV92Y3B1ICp2Y3B1LCBzdHJ1Y3Qga3ZtX2lvX2J1cyAqYnVzLAorCQkJICAgICBzdHJ1Y3Qga3ZtX2lvX3JhbmdlICpyYW5nZSwgdm9pZCAqdmFsKQogewogCWludCBpZHg7CiAKQEAgLTMwNzQsNyArMzA2Miw3IEBACiAKIAl3aGlsZSAoaWR4IDwgYnVzLT5kZXZfY291bnQgJiYKIAkJa3ZtX2lvX2J1c19jbXAocmFuZ2UsICZidXMtPnJhbmdlW2lkeF0pID09IDApIHsKLQkJaWYgKCFrdm1faW9kZXZpY2VfcmVhZChidXMtPnJhbmdlW2lkeF0uZGV2LCByYW5nZS0+YWRkciwKKwkJaWYgKCFrdm1faW9kZXZpY2VfcmVhZCh2Y3B1LCBidXMtPnJhbmdlW2lkeF0uZGV2LCByYW5nZS0+YWRkciwKIAkJCQkgICAgICAgcmFuZ2UtPmxlbiwgdmFsKSkKIAkJCXJldHVybiBpZHg7CiAJCWlkeCsrOwpAQCAtMzA4NSw3ICszMDczLDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKGt2bV9pb19idXNfd3JpdGUpOwogCiAvKiBrdm1faW9fYnVzX3JlYWQgLSBjYWxsZWQgdW5kZXIga3ZtLT5zbG90c19sb2NrICovCi1pbnQga3ZtX2lvX2J1c19yZWFkKHN0cnVjdCBrdm0gKmt2bSwgZW51bSBrdm1fYnVzIGJ1c19pZHgsIGdwYV90IGFkZHIsCitpbnQga3ZtX2lvX2J1c19yZWFkKHN0cnVjdCBrdm1fdmNwdSAqdmNwdSwgZW51bSBrdm1fYnVzIGJ1c19pZHgsIGdwYV90IGFkZHIsCiAJCSAgICBpbnQgbGVuLCB2b2lkICp2YWwpCiB7CiAJc3RydWN0IGt2bV9pb19idXMgKmJ1czsKQEAgLTMwOTcsOCArMzA4NSw4IEBACiAJCS5sZW4gPSBsZW4sCiAJfTsKIAotCWJ1cyA9IHNyY3VfZGVyZWZlcmVuY2Uoa3ZtLT5idXNlc1tidXNfaWR4XSwgJmt2bS0+c3JjdSk7Ci0JciA9IF9fa3ZtX2lvX2J1c19yZWFkKGJ1cywgJnJhbmdlLCB2YWwpOworCWJ1cyA9IHNyY3VfZGVyZWZlcmVuY2UodmNwdS0+a3ZtLT5idXNlc1tidXNfaWR4XSwgJnZjcHUtPmt2bS0+c3JjdSk7CisJciA9IF9fa3ZtX2lvX2J1c19yZWFkKHZjcHUsIGJ1cywgJnJhbmdlLCB2YWwpOwogCXJldHVybiByIDwgMCA/IHIgOiAwOwogfQogCkBAIC0zMjY4LDYgKzMyNTYsNyBAQAogc3RhdGljIHZvaWQga3ZtX3NjaGVkX2luKHN0cnVjdCBwcmVlbXB0X25vdGlmaWVyICpwbiwgaW50IGNwdSkKIHsKIAlzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUgPSBwcmVlbXB0X25vdGlmaWVyX3RvX3ZjcHUocG4pOworCiAJaWYgKHZjcHUtPnByZWVtcHRlZCkKIAkJdmNwdS0+cHJlZW1wdGVkID0gZmFsc2U7CiAKQEAgLTMzNDksNyArMzMzOCw3IEBACiAKIAlyID0gbWlzY19yZWdpc3Rlcigma3ZtX2Rldik7CiAJaWYgKHIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJrdm06IG1pc2MgZGV2aWNlIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisJCXByX2Vycigia3ZtOiBtaXNjIGRldmljZSByZWdpc3RlciBmYWlsZWRcbiIpOwogCQlnb3RvIG91dF91bnJlZzsKIAl9CiAKQEAgLTMzNjAsNyArMzM0OSw3IEBACiAKIAlyID0ga3ZtX2luaXRfZGVidWcoKTsKIAlpZiAocikgewotCQlwcmludGsoS0VSTl9FUlIgImt2bTogY3JlYXRlIGRlYnVnZnMgZmlsZXMgZmFpbGVkXG4iKTsKKwkJcHJfZXJyKCJrdm06IGNyZWF0ZSBkZWJ1Z2ZzIGZpbGVzIGZhaWxlZFxuIik7CiAJCWdvdG8gb3V0X3VuZGVidWdmczsKIAl9CiAK